[
  {
    "path": ".dockerignore",
    "content": ".git\nnode_modules/\n.DS_Store\nnpm-debug.log\nyarn-error.log\n.eslintcache\n"
  },
  {
    "path": ".foreverignore",
    "content": "builtAssets\nnewrelic*\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n.idea\nbrowser/ajaxconsole.html\nbrowser/build\nbrowser/data/scenes/**\nbrowser/data/textures/**\nbrowser/dist/**\nbrowser/tools/node_modules\nviews/layouts/*-bundled.handlebars\nengistart.bat\nengistart.bat - Shortcut.lnk\nnode_modules\nnpm-debug.log\nbrowser/style/site.css\nbrowser/style/less.css\nbrowser/style/threesixty.css\nbrowser/style/site360.css\nbrowser/style/editor.css\nbrowser/style/vizor2teaser.css\ndummy.txt\n/builtAssets\n"
  },
  {
    "path": ".jshintrc",
    "content": "{\n    // JSHint Default Configuration File (as on JSHint website)\n    // See http://jshint.com/docs/ for more details\n\n    \"maxerr\"        : 50,       // {int} Maximum error before stopping\n\n    // Enforcing\n    \"bitwise\"       : false,     // true: Prohibit bitwise operators (&, |, ^, etc.)\n    \"camelcase\"     : false,    // true: Identifiers must be in camelCase\n    \"curly\"         : false,     // true: Require {} for every new block or scope\n    \"eqeqeq\"        : true,     // true: Require triple equals (===) for comparison\n    \"forin\"         : true,     // true: Require filtering for..in loops with obj.hasOwnProperty()\n    \"freeze\"        : true,     // true: prohibits overwriting prototypes of native objects such as Array, Date etc.\n    \"immed\"         : false,    // true: Require immediate invocations to be wrapped in parens e.g. `(function () { } ());`\n    \"indent\"        : 4,        // {int} Number of spaces to use for indentation\n    \"latedef\"       : false,    // true: Require variables/functions to be defined before being used\n    \"newcap\"        : false,    // true: Require capitalization of all constructor functions e.g. `new F()`\n    \"noarg\"         : true,     // true: Prohibit use of `arguments.caller` and `arguments.callee`\n    \"noempty\"       : false,     // true: Prohibit use of empty blocks\n    \"nonbsp\"        : true,     // true: Prohibit \"non-breaking whitespace\" characters.\n    \"nonew\"         : false,    // true: Prohibit use of constructors for side-effects (without assignment)\n    \"plusplus\"      : false,    // true: Prohibit use of `++` & `--`\n    \"quotmark\"      : false,    // Quotation mark consistency:\n                                //   false    : do nothing (default)\n                                //   true     : ensure whatever is used is consistent\n                                //   \"single\" : require single quotes\n                                //   \"double\" : require double quotes\n    \"undef\"         : false,     // true: Require all non-global variables to be declared (prevents global leaks)\n    \"unused\"        : true,     // Unused variables:\n                                //   true     : all variables, last function parameter\n                                //   \"vars\"   : all variables only\n                                //   \"strict\" : all variables, all function parameters\n    \"strict\"        : false,     // true: Requires all functions run in ES5 Strict Mode\n    \"maxparams\"     : false,    // {int} Max number of formal params allowed per function\n    \"maxdepth\"      : false,    // {int} Max depth of nested blocks (within functions)\n    \"maxstatements\" : false,    // {int} Max number statements per function\n    \"maxcomplexity\" : false,    // {int} Max cyclomatic complexity per function\n    \"maxlen\"        : false,    // {int} Max number of characters per line\n\n    // Relaxing\n    \"asi\"           : true,     // true: Tolerate Automatic Semicolon Insertion (no semicolons)\n    \"boss\"          : false,     // true: Tolerate assignments where comparisons would be expected\n    \"debug\"         : false,     // true: Allow debugger statements e.g. browser breakpoints.\n    \"eqnull\"        : false,     // true: Tolerate use of `== null`\n    \"es5\"           : false,     // true: Allow ES5 syntax (ex: getters and setters)\n    \"esnext\"        : true,     // true: Allow ES.next (ES6) syntax (ex: `const`)\n    \"moz\"           : false,     // true: Allow Mozilla specific syntax (extends and overrides esnext features)\n                                 // (ex: `for each`, multiple try/catch, function expression…)\n    \"evil\"          : false,     // true: Tolerate use of `eval` and `new Function()`\n    \"expr\"          : false,     // true: Tolerate `ExpressionStatement` as Programs\n    \"funcscope\"     : false,     // true: Tolerate defining variables inside control statements\n    \"globalstrict\"  : false,     // true: Allow global \"use strict\" (also enables 'strict')\n    \"iterator\"      : false,     // true: Tolerate using the `__iterator__` property\n    \"lastsemic\"     : false,     // true: Tolerate omitting a semicolon for the last statement of a 1-line block\n    \"laxbreak\"      : false,     // true: Tolerate possibly unsafe line breakings\n    \"laxcomma\"      : false,     // true: Tolerate comma-first style coding\n    \"loopfunc\"      : false,     // true: Tolerate functions being defined in loops\n    \"multistr\"      : false,     // true: Tolerate multi-line strings\n    \"noyield\"       : false,     // true: Tolerate generator functions with no yield statement in them.\n    \"notypeof\"      : false,     // true: Tolerate invalid typeof operator values\n    \"proto\"         : false,     // true: Tolerate using the `__proto__` property\n    \"scripturl\"     : false,     // true: Tolerate script-targeted URLs\n    \"shadow\"        : false,     // true: Allows re-define variables later in code e.g. `var x=1; x=2;`\n    \"sub\"           : false,     // true: Tolerate using `[]` notation when it can still be expressed in dot notation\n    \"supernew\"      : false,     // true: Tolerate `new function () { ... };` and `new Object;`\n    \"validthis\"     : false,     // true: Tolerate using this in a non-constructor function\n\n    // Environments\n    \"browser\"       : true,     // Web Browser (window, document, etc)\n    \"browserify\"    : false,    // Browserify (node.js code in the browser)\n    \"couch\"         : false,    // CouchDB\n    \"devel\"         : true,     // Development/debugging (alert, confirm, etc)\n    \"dojo\"          : false,    // Dojo Toolkit\n    \"jasmine\"       : false,    // Jasmine\n    \"jquery\"        : false,    // jQuery\n    \"mocha\"         : true,     // Mocha\n    \"mootools\"      : false,    // MooTools\n    \"node\"          : false,    // Node.js\n    \"nonstandard\"   : false,    // Widely adopted globals (escape, unescape, etc)\n    \"phantom\"       : false,    // PhantomJS\n    \"prototypejs\"   : false,    // Prototype and Scriptaculous\n    \"qunit\"         : false,    // QUnit\n    \"rhino\"         : false,    // Rhino\n    \"shelljs\"       : false,    // ShellJS\n    \"typed\"         : false,    // Globals for typed array constructions\n    \"worker\"        : false,    // Web Workers\n    \"wsh\"           : false,    // Windows Scripting Host\n    \"yui\"           : false,    // Yahoo User Interface\n\n    // Custom Globals\n    \"globals\"       : {}        // additional predefined global variables\n}\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: node_js\nnode_js:\n  - \"0.10\"\nservices:\n  - mongodb\nbefore_install:\n  - sudo apt-get update -qq\n  - sudo apt-get install -qq graphicsmagick\nnotifications:\n  flowdock: 5eb79fdf198910d3285b728440497b0c\n\n"
  },
  {
    "path": "Dockerfile",
    "content": "FROM vizor/boron\n\nENV HOME=/root \\\n    ENGI_BIND_IP=0.0.0.0 \\\n    NODE_ENV=production \\\n    TMPDIR=/tmp\n\nEXPOSE 8000\n\nRUN npm config set loglevel error --silent\n\n# install our dependencies and nodejs\nRUN npm install -g forever\n\n# use changes to package.json to force Docker not to use the cache\n# when we change our application's dependencies:\nADD package.json /tmp/package.json\nRUN cd /tmp && \\\n    yarn --pure-lockfile && \\\n    yarn cache clean && \\\n    mkdir -p /opt/app && \\\n    mv /tmp/node_modules /opt/app/\n\nCOPY . /opt/app\nWORKDIR /opt/app\n\nRUN ./node_modules/.bin/gulp golive \\\n  && sh bin/bundler.sh\n\nCMD forever ./app.js\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2011-2014 Engi authors.\nCopyright (c) 2015 Pixelface, Ltd.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\nthe Software, and to permit persons to whom the Software is furnished to do so,\nsubject 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, FITNESS\nFOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\nCOPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\nIN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Patches\n====\n\nPatches is a visual programming environment for WebGL, WebVR and other HTML5 APIs. It features live preview, data flow visualization, network communication, publishing, unlimited undo, and a catalog of ready-made patches that can be used as modular building blocks. Complex logic can be nested in subgraphs and they can be rendered directly to a specific render target, or simply used as a texture. Loops are modeled as nested graphs that are evaluated once per loop iteration.\n\n**Try the cloud version of Patches now at [patches.vizor.io](http://patches.vizor.io).**\n\nBe sure to [watch the tutorials](http://bit.do/vizor), [read the documentation](http://patches.vizor.io/help/introduction.html) and [read tutorials on Patches](http://blog.vizor.io/). [Plugin API documentation](http://patches.vizor.io/help/plugin_api.html) is available, but unstable.\n\n### Installing on macOS/OSX\n\nInstalling a local instance of Patches requires [MongoDB](http://mongodb.org) (MongoDB Server should be 3.2.12), [Redis](http://redis.io), [node.js](https://nodejs.org) (Get [v6.11](https://nodejs.org/en/download/)) and graphicsmagick. To install the required packages, issue the following commands (on Mac using Homebrew):\n\n```\n    $ /usr/bin/ruby -e \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)\"\n    $ brew install graphicsmagick\n    $ brew install mongodb \n    $ brew install redis\n    $ brew services start mongodb\n    $ brew services start redis\n    $ npm install && npm install -g gulp\n    $ gulp\n```\n\nNOTE: Currently using Web Sockets or OSC requires running Patches locally.\n\n### Building\n\nTo build the LESS, plugins, etc [continuously]:\n\n```\n    $ gulp [watch]\n```\n\nRunning the tests:\n\n```\n    $ npm install -g mocha\n    $ npm test\n```\n\n### Quick list of versions for running with Ubuntu Linux\n\nOS: Ubuntu **16.04.2**\nMongoDB shell version: **3.2.18**\nRedis server **v=3.0.6**\nNode **v6.11.5**\nNPM **5.5.1**\n \nAlso, if you do not want to downgrade your node version then upgrade the **mongodb** package to **2.2.24** and the **gridfs-stream** package to the latest version.\n\nOne more detail, the exiftool can be installed like this `sudo apt-get install libimage-exiftool-perl`\n\n### How to run Patches locally using Windows\n\nPlease consult [WindowsInstallationReadme.md](WindowsInstallationReadme.md)\n\n\n### Running Patches\n\n0. Make sure you have the right export for ENGI_BIND_IP configured in your .bash_profile\n```\n    export ENGI_BIND_IP=0.0.0.0\n```\n1. Make sure MongoDB and Redis are running.\n```\n    $ brew services start mongodb\n    $ brew services start redis\n```\n2. Gulp one more time, then run the server:\n``` \n    $ gulp\n    $ npm start\n```\n3. Open in the browser: [http://localhost:8000/edit](http://localhost:8000/edit)\n\nIf you have access to an Oculus Rift DK1 or DK2 and want to play with the VR features, you currently need one of Toji's special Chromium builds. You can find them here: http://blog.tojicode.com/2014/07/bringing-vr-to-chrome.html\n\n# Contributing\n\nWe welcome your contributions! Please create and work in a fork, submitting a pull request when (and if) you're ready for a review. Contributors may note some inconsistencies in style. We're in the process of migrating; new work should be done in JavaScript ES5 using Airbnb code style (exception: tabs instead of spaces).\n\n# A note on plugins\n\nPatches features hundreds of plugins, including ways to obtain or create data:\n\n* Cameras: Perspective, orthographic and screen space. Obtain aspect radio and viewport size.\n* Input: Gamepad, VR headset, keyboard, mouse position, button state and scroll wheel.\n* Loading assets: HTML5 audio, images, JSON, 3d scenes and HTML5 video. Select files directly from UI or provide URLs to load as strings from the graph.\n* Matrices: Translation, rotation, scale and planar projection.\n* Meshes: Cube, grid, null (transform visualization), plane, quad, sphere and user defined (Blender exporter is included).\n* Open Sound Control: Receive float / xy float.\n* Shaders: Diffuse only, automatically generated from mesh and material, user defined, normal as color and texture with UV-transforms.\n* System state: Initialized, assets started, failed, and successfully loaded. Graphs can emit these signals\n  via plugins to integrate with the global asset load logic when procedurally generating data.\n* Text rendering.\n* Time: Absolute, frame delta.\n* Typed array generation.\n* Web Sockets.\n* Crypto: Check the current balances of a named CounterWallet.\n* Virtual Reality: Camera / MHD / Sensor info. Sensor velocity / acceleration. Full Oculus Rift support.\n* Various plugins to provide UI for direct manipulation or input of values: Knobs, sliders, input\n  fields for labels and constant values, toggle and action buttons, color pickers, text editors,\n  PRNGs and many other similar plugins for providing data directly from the graph view.\n\n...Ways to modify data:\n\n* Audio: Get duration and current playback position. Analysis (FFT), gain, buffer source.\n* Color: Add, mix, multiply and set alpha.\n* Data type conversions. Format or parse strings, compose complex types from primitives, convert\n  between primitive types and split / merge cameras to / from constituent matrices.\n* Curves: Looping cubic interpolation of keypoints.\n* Filters: First order low pass, sample and hold, toggle.\n* Instanced meshes: Clear transforms, rotate, scale, translate.\n* Light sources (point, directional): Diffuse color, direction, intensity, position, specular color and type.\n* Logic: And, equals, if, if...else, less than, more than, nand, not, or, switch and xor.\n* Materials: Alpha clip, ambient color, blend mode (none, add, sub, mul, normal), diffuse color, double sided,\n  attach lights, shininess, textures (diffuse, emission, specular and normal maps), z-buffer (use / write).\n* Math: Add, clamp, divide, module, multiply, negate, subtract, delta, abs, cos, exp, log, max, min, sin,\n  sqrt, tan, ceil, floor and round.\n* Matrix: Concatenate, get component, invert, set component and transpose.\n* Mesh: Primitive type (points, lines, line strip, line loop, triangles, tristrip, trifan). Obtain or set the maximum primitive count to render.\n* Object: Convert named member to float, bool, string, object or typed array. Access any array item of the\n  those same types by index and object member name.\n* Oscillators: Cosine, sawtooth, sine, square, triangle.\n* Scene: Get bounding box, get mesh, get mesh count.\n* String: Concatenate, parse JSON.\n* Tweens: In / out (circular, cubic, exponential, quadratic, quartic, quintic and sinusoidal).\n* Typed arrays: Array to mesh, array to texture, get element, get element as type, length, set element,\n  set element as type.\n* Virtual Reality: Create Oculus Rift compatible left / right camera from an input camera.\n* Vector: Add, cross, dot product, magnitude, multiply, normalize, scale and transform.\n* Video: Current time and duration.\n\n...Ways to utilize data:\n\n* 3D: Render scene, render mesh, create instanced meshes (arrays, cubic volumes, using iterated function\n  systems or distribution textures) and record the current framebuffer.\n* Audio: Player / Source player.\n* Debug visualization: On-canvas visualization of booleans, colors, arbitrary data, floats, matrices, objects,\n  function plots, text and vectors.\n* Sequencing: Stop playback.\n* Video: Player.\n\n...And ways to structure logic or store state:\n\n* Create infinitely nested sub-graphs or loops.\n* Create named in- and output proxies in a graph to have them automatically reflected as a slot on the parent node of the graph the proxy is in.\n* Create named registers to store values of any supported data type between graph updates as state storage or feedback loops.\n\nCreated sequences can be imported and exported as JSON, embeddable into any context with the included standalone player, or simulated in a bare core instance. The latter permits sequences to be leveraged in other JavaScript projects as a domain-specific visual scripting language by providing the embedded graph with appropriate values from its host, updating the graph and acting on the emitted output values. Created sequences can be automatically exported to an optimized file set, ready to deploy to any Web server.\n\n# License\n\nPatches is released under the [MIT License](http://opensource.org/licenses/MIT)\n\n# Contact Us\n\n[@vizor_vr on Twitter](https://twitter.com/vizor_vr)\n[@VizorPatches on Twitter](https://twitter.com/VizorPatches)\n\n[E-Mail](mailto:info@vizor.io)\n"
  },
  {
    "path": "WindowsInstallationReadme.md",
    "content": "# Instructions for running Vizor Patches locally using Windows\n## Written by Maya Lekova\n\n1. MongoDB\n\t1. Installation instructions can be found [here](https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/).\n1. Redis\n\t1. Download an installer for the [Windows version](https://github.com/MicrosoftArchive/redis) by Microsoft Open Tech group and follow the steps\n\t1. Check in \"Services\" that \"Redis\" is running. By default it runs on port *6379*\n1. Node.js\n\t1. Install nvm-windows: [instructions](https://github.com/coreybutler/nvm-windows#node-version-manager-nvm-for-windows)\n\t1. `nvm install 6.11`\n\t1. `nvm use 6.11`\n\t1. Running `node -v` should give you \"v6.11.x\"\n1. Graphicsmagick\n\t1. Download from the \"windows\" section of their [website](http://www.graphicsmagick.org/download.html). Q8 x64 version is suitable for setting up Patches.\n\t1. Open a new cmd window and ensure the installation is successful by running `gm help`\n1. Additional setup for building the sse4_crc32 module *(optional)*\n\t1. Download and install [Python](https://www.python.org/downloads/release/python-2714/)\n\t1. Verify by opening new cmd and running `python --version`\n\t1. Install Visual Studio version lower than 2017 (with 2017 there's an [issue reported](https://github.com/anandsuresh/sse4_crc32/issues/65)). If the version is >2005 use the appropriate version of cmd to get it building.\n1. Setting up the repo\n\t1. Download some nice Git client compatible with your version of Windows (personally I use [Git for Windows](http://gitforwindows.org/)) and clone the repo\n\t1. `npm install && npm install -g gulp`\n\t1. Few deprecated modules appear and (if no success in the previous step) sse4_crc32 may fail completely.\n\n*Note about MongoDB:* For the server I use a cloud-hosted version on [mLab](https://mlab.com/). It provides 0.5GB of storage with MongoDB version 3.4.x. MongoDB server used to be easily installable on consumer versions of Windows, but now on their website there's only installer for Windows Server 2008. If you choose similar cloud provider, the connection string `mongodb://<user>:<pass>@<host>:<port>/<dbname>` should be set as an environment variable `MONGODB` prior to running patches and also some modifications in `gridfs-storage.js` are needed in order to support authentication.\n"
  },
  {
    "path": "app.js",
    "content": "if (process.env.NEWRELIC)\n\trequire('newrelic');\n\nvar _ = require('lodash');\nvar http = require('http');\nvar express = require('express');\nvar cookieParser = require('cookie-parser');\nvar compress = require('compression');\nvar connectAssets = require('connect-assets');\nvar sessions = require('client-sessions');\nvar bodyParser = require('body-parser');\nvar morgan = require('morgan');\nvar errorHandler = require('errorhandler');\nvar csrf = require('lusca').csrf();\nvar methodOverride = require('method-override');\nvar crypto = require('crypto')\n\nvar streamFile = require('./lib/streamFile');\n\nvar flash = require('express-flash');\n\nvar fsPath = require('path');\n\nvar EventEmitter = require('events').EventEmitter;\n\nvar mongoose = require('mongoose');\nmongoose.Promise = global.Promise\t// http://mongoosejs.com/docs/promises.html\n\nvar passport = require('passport');\nvar expressValidator = require('express-validator');\nvar exphbs  = require('express-handlebars');\n\nvar diyHbsHelpers = require('diy-handlebars-helpers');\nvar hbsHelpers = require('./lib/hbs-helpers');\nvar templateCache = require('./lib/templateCache').templateCache\n\n// Framework controllers (see below for asset controllers)\nvar homeController = require('./controllers/homeController');\nvar vizor2TeaserController = require('./controllers/vizor2TeaserController')\nvar userController = require('./controllers/userController');\n\n// Threesixty site controller\nvar threesixtyController = require('./controllers/threesixty');\n\n// API keys + Passport configuration\nvar secrets = require('./config/secrets');\nvar passportConf = require('./config/passport');\n\nvar OscServer = require('./lib/osc-server').OscServer;\nvar WsChannelServer = require('./lib/wschannel-server').WsChannelServer;\nvar EditorChannelServer = require('./lib/editorChannelServer').EditorChannelServer;\nvar config = require('./config/config.js');\n\nlet CloudFileSystemImpl\nif (config.server.useCDN)\n \tCloudFileSystemImpl = require('./lib/cloudStorage')\nelse\n\tCloudFileSystemImpl = require('./lib/gridfs-storage')\n\nvar argv = require('minimist')(process.argv.slice(2));\n\nvar listenHost = process.env.ENGI_BIND_IP || argv.i || config.server.host;\nvar listenPort = process.env.ENGI_BIND_PORT || argv.p || config.server.port;\n\nvar minute = 60 * 1000;\nvar hour = 60 * minute;\nvar day = hour * 24;\nvar week = day * 7;\n\nvar csrfExclude = [\n\t'/this-url-will-bypass-csrf'\n];\n\nvar app = express();\n\n// keep track of process startup time\nprocess.startTime = Date.now()\n\napp.events = new EventEmitter()\n\n// view engine setup\napp.set('views', fsPath.join(__dirname, 'views'));\n\nvar releaseMode = process.env.NODE_ENV === 'production'\n\nvar hbs = exphbs.create({\n\tdefaultLayout: releaseMode ? 'main-bundled' : 'main',\n\tpartialsDir: [\n\t\t{dir:'views/partials'},\n\t\t{dir:'views/server/partials', namespace: 'srv'}\n\t],\n\thelpers: _.extend(\n\t\tdiyHbsHelpers,\n\t\thbsHelpers,\n\t\ttemplateCache.helper()\n\t)\n})\n\ntemplateCache.setHbs(hbs.handlebars)\ntemplateCache.compile()\n\napp.engine('handlebars', hbs.engine);\napp.set('view engine', 'handlebars');\n\napp.use((req, res, next) => {\n\t// Google Cloud Load Balancer: redirect to https if not secure\n\tvar fwdProto = req.get('x-forwarded-proto')\n\tif (!fwdProto)\n\t\treturn next()\n\n\tif (fwdProto !== 'https')\n\t\treturn res.redirect('https://' + req.get('host') + req.url)\n\n\tnext()\n})\n\napp.use((req,res,next) => {\t// allow some context through to handlebars engine/helpers automatically\n\thbs.handlebars._request = {}\n\tfor (var key of ['hostname', 'ip', 'query', 'headers', 'method', 'params', 'secure', 'xhr', 'url', 'originalUrl']) {\n\t\thbs.handlebars._request[key] = Object.freeze(_.extend(req[key]))\n\t}\n\tObject.freeze(hbs.handlebars._request)\n\tnext()\n})\n\napp.use(compress())\napp.use(connectAssets({\n\tpaths: [\n\t\tfsPath.join(__dirname, 'browser/style')\n\t],\n\thelperContext: app.locals\n}));\n\nif (!releaseMode)\n\tapp.use(morgan('dev'))\n\napp.use(bodyParser.json({\n\tlimit: 1024 * 1024 * 128\n}));\napp.use(bodyParser.urlencoded( {\n\textended: true,\n\tlimit: 1024 * 1024 * 128\n}));\napp.use(expressValidator());\napp.use(methodOverride());\n\n// parse the domain out from the FQDN and use it as the cookie domain\n// this way 360.vizor.io and vizor.io will use the same cookie\nvar fqdn = process.env.FQDN || ''\nvar domainFromFqdn = fqdn.split('.').splice(-2).join('.')\napp.use(cookieParser());\napp.use(sessions({\n\tcookieName: 'vs070',\n\trequestKey: 'session',\n\tcookie: {\n\t\tdomain: domainFromFqdn,\n\t},\n\tsecret: secrets.sessionSecret,\n\tduration: week,\n\tactiveDuration: day\n}));\n\napp.use(passport.initialize());\napp.use(passport.session());\napp.use(flash());\n\n// app.use(function(req, res, next)\n// {\n// \t// CSRF protection.\n// \tif (_.contains(csrfExclude, req.path))\n// \t\treturn next();\n\n// \tcsrf(req, res, next);\n// });\n\napp.use(function(req, res, next) {\n\tif (!req.user) {\n\t\treq.session.userId = crypto.randomBytes(12).toString('hex')\n\t} else {\n\t\treq.session.userId = req.user._id\n\t}\n\n\tres.locals.user = req.user\n\tres.locals.KEY_MIXPANEL = process.env.KEY_MIXPANEL\n\tres.locals.KEY_GTM = process.env.KEY_GTM\n\tnext();\n});\n\napp.use(function(req, res, next) {\n\t// Remember original destination before login.\n\tvar path = req.path.split('/')[1];\n\n\tif (/auth||assets|login|logout|signup|img|fonts|favicon/i.test(path)) {\n\t\treturn next();\n\t}\n\n\treq.session.returnTo = req.path;\n\n\tnext();\n});\n\napp.use(function(req, res, next) {\n\tres.header('Access-Control-Allow-Origin', '*')\n\tif (req.headers['access-control-request-headers'])\n\t\tres.header('Access-Control-Allow-Headers', req.headers['access-control-request-headers'])\n\tnext();\n});\n\napp.use(function(req, res, next) {\n\tif (req.url.indexOf('?_') > -1)\n\t\treq.url = req.url.substring(0, req.url.indexOf('?_'));\n\n\tnext();\n});\n\n// old static flat files\napp.use('/data', express.static(\n\t\tfsPath.join(__dirname, 'browser', 'data'),\n\t\t{ maxAge: week * 52 }\n\t)\n)\n\n// accounts\n\napp.get('/login', userController.getLogin);\napp.post('/login', userController.postLogin);\napp.post('/login.json', userController.postLogin);\napp.get('/logout', userController.logout);\napp.get('/forgot', userController.getForgot);\napp.post('/forgot', userController.postForgot);\napp.get('/reset/:token', userController.getReset);\napp.post('/reset/:token', userController.postReset);\n\napp.get('/signup', userController.getSignup);\napp.post('/signup', userController.postSignup);\napp.post('/account/exists', userController.checkUserName);\napp.post('/account/email/exists', userController.checkEmailExists);\n\napp.get('/account', passportConf.isAuthenticated, userController.getAccount)\napp.post('/account/profile', passportConf.isAuthenticated, userController.postUpdateProfile);\napp.get('/account/profile', passportConf.isAuthenticated, userController.getAccountProfile);\n\napp.post('/account/password', passportConf.isAuthenticated, userController.postUpdatePassword);\napp.post('/account/delete', passportConf.isAuthenticated, userController.postDeleteAccount);\napp.get('/account/unlink/:provider', passportConf.isAuthenticated, userController.getOauthUnlink);\n\napp.get('/about', homeController.about)\n\n// begin 360 routing\napp.get('/v/:graph', function(req, res, next) {\n\tswitch (req.hostname) {\n\t\tcase '360.vizor.io':\n\t\tcase '360.vizor.lol':\n\t\t\tres.locals.layout = 'threesixty'\n\t}\n\tnext()\n})\n\napp.get('/featured', function(req, res, next) {\n\tswitch (req.hostname) {\n\t\tcase '360.vizor.io':\n\t\tcase '360.vizor.lol':\n\t\t\treturn threesixtyController.featured(req, res, next)\n\t\tdefault:\n\t\t\treturn next()\n\t}\n})\n\napp.get('/', function(req, res, next) {\n\tswitch (req.hostname) {\n\t\tcase '360.vizor.io':\n\t\tcase '360.vizor.lol':\n\t\t\treturn res.redirect(301, 'https://vizor.io/new')\n\t\tdefault:\n\t\t\treturn homeController.index(req, res, next)\n\t}\n})\n\napp.get('/threesixty', threesixtyController.index)\napp.get('/threesixty/featured', threesixtyController.featured)\n\n// end 360 routing\n\nmongoose.connect(secrets.db);\nmongoose.connection.on('error', function(err) {\n\tthrow err\n})\n\nmongoose.connection.on('connected', (connection) => {\n\tsetupModelRoutes(mongoose.connection.db)\n})\n\nfunction setupModelRoutes(mongoConnection) {\n\tvar modelRoutes = require('./modelRoutes.js')\n\tconst cloudStorage = new CloudFileSystemImpl()\n\n\t// stat() files in cloud storage\n\tapp.get(/^\\/stat\\/.*/, function(req, res) {\n\t\tvar path = req.path.replace(/^\\/stat/, '');\n\n\t\tcloudStorage.stat(path)\n\t\t.then(function(stat) {\n\t\t\tif (!stat)\n\t\t\t\treturn res.json({ error: 404 })\n\n\t\t\tdelete stat._id\n\n\t\t\tres.header('Cache-Control', 'public')\n\n\t\t\treturn res.json(stat)\n\t\t})\n\t})\n\n\t// get files from cloud storage\n\tapp.get(/^\\/data\\/.*/, function(req, res, next) {\n\t\treturn streamFile(req, res, next, cloudStorage)\n\t\t.catch(next)\n\t});\n\n\t// allow strong caching for bundles etc.\n\tapp.get([\n\t\t'/dist/*',\n\t\t'/vendor/*',\n\t\t'/images/*',\n\t\t'/fonts/*',\n\t\t'/docs/*'\n\t\t], function(req, res, next) {\n\t\tres.setHeader('Cache-Control', 'public, max-age=604800');\n\t\tnext();\n\t});\n\n\t// minimal caching for frequently updating things\n\tapp.use([\n\t\t'/style/*',\n\t\t'/plugins/plugins.json',\n\t\t'/vizor/patches', // system patch list\n\t\t],\n\t\tfunction(req, res, next) {\n\t\t\tres.setHeader('Cache-Control', 'public, must-revalidate, max-age=300');\n\t\t\tnext();\n\t\t}\n\t);\n\n\tif (!releaseMode) {\n\t\tapp.use(function(req, res, next) {\n\t\t\tres.setHeader('Cache-Control', 'no-cache')\n\t\t\tnext()\n\t\t})\n\t}\n\n\t// drop the second parameter (timestamp) in meta-scripts\n\tapp.use('/meta-scripts', function(req, res, next) {\n\t\treq.url = '/' + req.url.split('/').splice(2).join('/')\n\t\tnext()\n\t}, express.static(\n\t\tfsPath.join(__dirname, 'browser', 'scripts'),\n\t\t{ maxAge: week * 52 }\n\t))\n\n\tapp.use(['/node_modules'],\n\t\texpress.static(fsPath.join(__dirname, 'node_modules'))\n\t)\n\n\tapp.use(express.static(fsPath.join(__dirname, 'browser'),\n\t\t{ maxAge: hour }))\n\n\t// remap /scripts to /dist in production\n\tapp.use('/scripts', express.static(\n\t\t\tfsPath.join(__dirname, 'browser', 'dist'),\n\t\t\t{ maxAge: week * 52 }\n\t\t)\n\t)\n\n\tapp.use('/common', express.static(fsPath.join(__dirname, 'common'),\n\t\t{ maxAge: hour }))\n\n\t// --------------------------------------------------\n\n\t/**\n\t  * wire up model routes\n\t  **/\n\n\tmodelRoutes.setupDefaultRoutes(\n\t\tapp,\n\t\tcloudStorage,\n\t\tmongoConnection,\n\t\tpassportConf\n\t)\n\n\t// --------------------------------------------------\n\n\tvar httpServer = http.createServer(app)\n\thttpServer.listen(listenPort, listenHost)\n\n\tif (config.server.enableOSC)\n\t\tnew OscServer().listen(httpServer)\n\n\tif (config.server.enableChannels) {\n\t\tnew WsChannelServer().listen(httpServer)\n\t\tvar ecs = new EditorChannelServer()\n\t\tecs.listen(httpServer)\n\t}\n\n\tapp.use(function(err, req, res, next) {\n\t\tconsole.error(err.message, err.stack);\n\n\t\tres.status(err.status || 500);\n\n\t\tif (req.xhr)\n\t\t\treturn res.json({ success: false, message: err.message });\n\n\t\tres.render('error', {\n\t\t\tlayout: 'errorlayout',\n\t\t\tmessage: err.message,\n\t\t\terror: {}\n\t\t});\n\t});\n\n\tapp.use(errorHandler());\n\n\tapp.events.emit('ready')\n}\n\nmodule.exports = app;\n"
  },
  {
    "path": "bin/bundler.sh",
    "content": "echo Bundler starting\n\nnode ./tools/layoutBundler main &\nnode ./tools/layoutBundler player &\nnode ./tools/layoutBundler editor &\nnode ./tools/layoutBundler threesixty &\n\nwait\n\necho Bundler completed\n"
  },
  {
    "path": "bin/deploy.sh",
    "content": "alias d='docker'\n\n# source environment variables from local file\n. ./env\n\nif [ -e $FQDN ];\nthen\n     echo \"No environment?\"\n     exit 1\nfi\n\necho ----------------------------------------\necho          Deploying $FQDN\necho ----------------------------------------\n\n# update from git\ngit pull --rebase\n\n# build docker container\nd build -t $FQDN:v1 .\n\necho ----------------------------------------\necho          Destroying old $FQDN\necho ----------------------------------------\n\n# destroy existing container\nd stop $FQDN\nd rm $FQDN\n\necho ----------------------------------------\necho          Provisioning $FQDN\necho ----------------------------------------\n\n# run provisioning step\nd run --rm \\\n\t-e \"NODE_ENV=$NODE_ENV\" \\\n\t-e \"MONGODB=$MONGODB\" \\\n\t-e \"GRIDFS=$GRIDFS\" \\\n\t--link mongo:mongo \\\n\t$FQDN:v1 \\\n\tnode ./node_modules/gulp/bin/gulp push\n\necho ----------------------------------------\necho          Running $FQDN\necho ----------------------------------------\n\n# start container\nd run -d --name $FQDN \\\n     -e \"FQDN=$FQDN\" \\\n     -e \"KEY_SPARKPOST=$KEY_SPARKPOST\" \\\n     -e \"NODE_ENV=$NODE_ENV\" \\\n     -e \"NEWRELIC=$NEWRELIC\" \\\n     -e \"SESSION_SECRET=$SESSION_SECRET\" \\\n     -e \"ENGI_BIND_PORT=$PORT\" \\\n     -e \"KEY_MIXPANEL=$KEY_MIXPANEL\" \\\n     -e \"KEY_GTM=$KEY_GTM\" \\\n     -e \"WSS_HOST=$WSS_HOST\" \\\n     -e \"WSS_SECURE=$WSS_SECURE\" \\\n     -e \"MONGODB=$MONGODB\" \\\n     -e \"GRIDFS=$GRIDFS\" \\\n     -e \"REDIS=$REDIS\" \\\n     -p 127.0.0.1:$PORT:$PORT \\\n     --link mongo:mongo \\\n     --link redis:redis \\\n     $FQDN:v1\n\n"
  },
  {
    "path": "bin/test-functional.sh",
    "content": "DEST=ops@ex40.kschzt.com:/var/www/fail.vizor.lol\n\nnode ./tools/create-test-examples.js\nnode ./browser/test/functional/run.js\n\nRETVAL=$?\n\necho EXITED $RETVAL\n\nif [ -e \"$CI_BUILD_NUMBER\" ];\nthen\n\tls -l $CI_BUILD_NUMBER\n\tscp -r $CI_BUILD_NUMBER $DEST/$CI_BUILD_NUMBER\n\techo Artefacts at http://fail.vizor.lol/$CI_BUILD_NUMBER\nfi\n\nexit $RETVAL\n"
  },
  {
    "path": "browser/data/editor-icons/directional-light/directional.obj",
    "content": "# Blender v2.76 (sub 0) OBJ File: 'Work.blend'\n# www.blender.org\no Cube.018_Cube.003\nv -5.831393 -5.065597 0.496826\nv -9.494683 -8.728898 0.496826\nv -5.065563 -5.831427 0.496826\nv -8.728852 -9.494727 0.496826\nv -5.831394 -5.065598 -0.504465\nv -9.494682 -8.728898 -0.504465\nv -5.065563 -5.831427 -0.504465\nv -8.728852 -9.494727 -0.504465\nv -9.597547 -8.979668 0.496826\nv -8.979622 -9.597586 0.496826\nv -8.979622 -9.597586 -0.504465\nv -9.597546 -8.979668 -0.504465\nv -5.019949 -5.586864 0.496826\nv -5.586830 -5.019982 0.496826\nv -5.019949 -5.586864 -0.504465\nv -5.586830 -5.019982 -0.504465\nv -9.111768 -9.111813 0.496826\nv -5.448478 -5.448513 0.496826\nv -9.111768 -9.111813 -0.504465\nv -5.448478 -5.448513 -0.504465\nv -9.367414 -9.367458 0.496826\nv -9.367414 -9.367458 -0.504465\nv -5.208155 -5.208187 0.496826\nv -5.208155 -5.208187 -0.504465\nv 5.065583 -5.831410 0.496825\nv 8.728887 -9.494699 0.496824\nv 5.831412 -5.065580 0.496825\nv 9.494715 -8.728870 0.496824\nv 5.065585 -5.831413 -0.504467\nv 8.728887 -9.494699 -0.504467\nv 5.831412 -5.065580 -0.504466\nv 9.494716 -8.728870 -0.504467\nv 8.979654 -9.597559 0.496824\nv 9.597572 -8.979640 0.496824\nv 9.597573 -8.979640 -0.504467\nv 8.979654 -9.597559 -0.504468\nv 5.586849 -5.019966 0.496825\nv 5.019966 -5.586849 0.496825\nv 5.586849 -5.019966 -0.504466\nv 5.019966 -5.586849 -0.504466\nv 9.111800 -9.111785 0.496824\nv 5.448498 -5.448496 0.496825\nv 9.111800 -9.111785 -0.504467\nv 5.448498 -5.448496 -0.504466\nv 9.367446 -9.367431 0.496824\nv 9.367446 -9.367431 -0.504467\nv 5.208177 -5.208174 0.496825\nv 5.208177 -5.208174 -0.504466\nv -0.541512 -7.705341 0.496825\nv -0.541507 -12.886021 0.496824\nv 0.541535 -7.705339 0.496825\nv 0.541543 -12.886021 0.496825\nv -0.541512 -7.705341 -0.504466\nv -0.541507 -12.886021 -0.504467\nv 0.541535 -7.705339 -0.504466\nv 0.541543 -12.886021 -0.504467\nv -0.436918 -13.136077 0.496824\nv 0.436953 -13.136074 0.496825\nv 0.436953 -13.136074 -0.504467\nv -0.436917 -13.136077 -0.504467\nv 0.400857 -7.500153 0.496825\nv -0.400836 -7.500154 0.496825\nv 0.400857 -7.500153 -0.504466\nv -0.400836 -7.500154 -0.504466\nv 0.000018 -12.886021 0.496824\nv 0.000012 -7.705341 0.496825\nv 0.000018 -12.886021 -0.504467\nv 0.000012 -7.705341 -0.504466\nv 0.000018 -13.247559 0.496824\nv 0.000018 -13.247559 -0.504467\nv 0.000010 -7.365470 0.496825\nv 0.000010 -7.365470 -0.504466\nv -0.171379 -16.336731 0.107349\nv -0.171379 -17.976595 0.107349\nv 0.171443 -16.336731 0.107349\nv 0.171447 -17.976595 0.107349\nv -0.138272 -18.055748 0.107349\nv 0.138340 -18.055744 0.107349\nv 0.126914 -16.271782 0.107349\nv -0.126850 -16.271782 0.107349\nv 0.000034 -17.976595 0.107349\nv 0.000030 -16.336731 0.107349\nv 0.000034 -18.091028 0.107349\nv 0.000030 -16.229153 0.107349\nv -0.171379 -16.336731 -0.108220\nv -0.171379 -17.976595 -0.108220\nv 0.000034 -17.976595 -0.108220\nv 0.171447 -17.976595 -0.108220\nv 0.171443 -16.336731 -0.108220\nv 0.000030 -16.336731 -0.108220\nv 0.000034 -18.091028 -0.108220\nv 0.138340 -18.055744 -0.108220\nv -0.138272 -18.055748 -0.108220\nv 0.000030 -16.229153 -0.108220\nv -0.126850 -16.271782 -0.108220\nv 0.126914 -16.271782 -0.108220\nv -0.171378 -21.363804 0.107349\nv -0.171378 -23.003670 0.107349\nv 0.171440 -21.363804 0.107349\nv 0.171444 -23.003670 0.107349\nv -0.138271 -23.082819 0.107349\nv 0.138337 -23.082819 0.107349\nv 0.126911 -21.298853 0.107349\nv -0.126849 -21.298853 0.107349\nv 0.000035 -23.003670 0.107349\nv 0.000031 -21.363804 0.107349\nv 0.000035 -23.118103 0.107349\nv 0.000031 -21.256224 0.107349\nv -0.171378 -21.363804 -0.108220\nv -0.171378 -23.003670 -0.108220\nv 0.000035 -23.003670 -0.108220\nv 0.171444 -23.003670 -0.108220\nv 0.171440 -21.363804 -0.108220\nv 0.000031 -21.363804 -0.108220\nv 0.000035 -23.118103 -0.108220\nv 0.138337 -23.082819 -0.108220\nv -0.138271 -23.082819 -0.108220\nv 0.000031 -21.256224 -0.108220\nv -0.126849 -21.298853 -0.108220\nv 0.126911 -21.298853 -0.108220\nv -0.171377 -26.390879 0.107349\nv -0.171377 -28.030743 0.107349\nv 0.171441 -26.390879 0.107349\nv 0.171445 -28.030743 0.107349\nv -0.138270 -28.109894 0.107349\nv 0.138338 -28.109890 0.107349\nv 0.126912 -26.325926 0.107349\nv -0.126848 -26.325926 0.107349\nv 0.000036 -28.030743 0.107349\nv 0.000032 -26.390879 0.107349\nv 0.000036 -28.145176 0.107349\nv 0.000032 -26.283298 0.107349\nv -0.171377 -26.390879 -0.108221\nv -0.171377 -28.030743 -0.108221\nv 0.000036 -28.030743 -0.108221\nv 0.171445 -28.030743 -0.108220\nv 0.171441 -26.390879 -0.108220\nv 0.000032 -26.390879 -0.108221\nv 0.000036 -28.145176 -0.108221\nv 0.138338 -28.109890 -0.108221\nv -0.138270 -28.109894 -0.108221\nv 0.000032 -26.283298 -0.108220\nv -0.126848 -26.325926 -0.108221\nv 0.126912 -26.325926 -0.108220\nv -0.171377 -31.417948 0.107348\nv -0.171376 -33.057812 0.107348\nv 0.171442 -31.417948 0.107348\nv 0.171446 -33.057812 0.107348\nv -0.138269 -33.136971 0.107348\nv 0.138339 -33.136967 0.107348\nv 0.126913 -31.353001 0.107348\nv -0.126848 -31.353001 0.107348\nv 0.000037 -33.057812 0.107348\nv 0.000033 -31.417948 0.107348\nv 0.000037 -33.172253 0.107348\nv 0.000033 -31.310371 0.107348\nv -0.171376 -31.417948 -0.108221\nv -0.171376 -33.057812 -0.108221\nv 0.000037 -33.057812 -0.108221\nv 0.171446 -33.057812 -0.108221\nv 0.171442 -31.417948 -0.108221\nv 0.000033 -31.417948 -0.108221\nv 0.000037 -33.172253 -0.108221\nv 0.138339 -33.136967 -0.108221\nv -0.138269 -33.136971 -0.108221\nv 0.000033 -31.310371 -0.108221\nv -0.126848 -31.353001 -0.108221\nv 0.126913 -31.353001 -0.108221\nv -0.171376 -36.445023 0.107348\nv -0.171375 -38.084888 0.107348\nv 0.171442 -36.445023 0.107348\nv 0.171447 -38.084888 0.107348\nv -0.138269 -38.164043 0.107348\nv 0.138340 -38.164040 0.107348\nv 0.126914 -36.380077 0.107348\nv -0.126847 -36.380077 0.107348\nv 0.000038 -38.084888 0.107348\nv 0.000033 -36.445023 0.107348\nv 0.000038 -38.199326 0.107348\nv 0.000033 -36.337448 0.107348\nv -0.171376 -36.445023 -0.108221\nv -0.171375 -38.084888 -0.108221\nv 0.000038 -38.084888 -0.108221\nv 0.171447 -38.084888 -0.108221\nv 0.171442 -36.445023 -0.108221\nv 0.000033 -36.445023 -0.108221\nv 0.000038 -38.199326 -0.108221\nv 0.138340 -38.164040 -0.108221\nv -0.138269 -38.164043 -0.108221\nv 0.000033 -36.337448 -0.108221\nv -0.126847 -36.380077 -0.108221\nv 0.126914 -36.380077 -0.108221\nv -0.171379 -41.472099 0.107348\nv -0.171379 -43.111961 0.107348\nv 0.171443 -41.472099 0.107348\nv 0.171447 -43.111961 0.107348\nv -0.138272 -43.191116 0.107348\nv 0.138341 -43.191113 0.107348\nv 0.126914 -41.407150 0.107348\nv -0.126846 -41.407150 0.107348\nv 0.000038 -43.111961 0.107348\nv 0.000034 -41.472099 0.107348\nv 0.000038 -43.226398 0.107348\nv 0.000034 -41.364521 0.107348\nv -0.171379 -41.472099 -0.108222\nv -0.171379 -43.111961 -0.108222\nv 0.000038 -43.111961 -0.108222\nv 0.171447 -43.111961 -0.108222\nv 0.171443 -41.472099 -0.108222\nv 0.000034 -41.472099 -0.108222\nv 0.000038 -43.226398 -0.108222\nv 0.138341 -43.191113 -0.108222\nv -0.138272 -43.191116 -0.108222\nv 0.000034 -41.364521 -0.108222\nv -0.126846 -41.407150 -0.108222\nv 0.126914 -41.407150 -0.108222\nv -0.171378 -46.499172 0.107347\nv -0.171378 -48.139042 0.107347\nv 0.171444 -46.499172 0.107347\nv 0.171448 -48.139042 0.107347\nv -0.138271 -48.218189 0.107347\nv 0.138341 -48.218185 0.107347\nv 0.126915 -46.434223 0.107347\nv -0.126849 -46.434223 0.107347\nv 0.000035 -48.139042 0.107347\nv 0.000035 -46.499172 0.107347\nv 0.000035 -48.253475 0.107347\nv 0.000035 -46.391594 0.107347\nv -0.171378 -46.499172 -0.108222\nv -0.171378 -48.139042 -0.108222\nv 0.000035 -48.139042 -0.108222\nv 0.171448 -48.139042 -0.108222\nv 0.171444 -46.499172 -0.108222\nv 0.000035 -46.499172 -0.108222\nv 0.000035 -48.253475 -0.108222\nv 0.138341 -48.218185 -0.108222\nv -0.138271 -48.218189 -0.108222\nv 0.000035 -46.391594 -0.108222\nv -0.126849 -46.434223 -0.108222\nv 0.126915 -46.434223 -0.108222\nv -0.171377 -51.526249 0.107347\nv -0.171377 -53.166115 0.107347\nv 0.171445 -51.526249 0.107347\nv 0.171445 -53.166115 0.107347\nv -0.138270 -53.245266 0.107347\nv 0.138338 -53.245262 0.107347\nv 0.126916 -51.461296 0.107347\nv -0.126848 -51.461296 0.107347\nv 0.000036 -53.166115 0.107347\nv 0.000032 -51.526249 0.107347\nv 0.000036 -53.280548 0.107347\nv 0.000032 -51.418671 0.107347\nv -0.171377 -51.526249 -0.108222\nv -0.171377 -53.166115 -0.108222\nv 0.000036 -53.166115 -0.108222\nv 0.171445 -53.166115 -0.108222\nv 0.171445 -51.526249 -0.108222\nv 0.000032 -51.526249 -0.108222\nv 0.000036 -53.280548 -0.108222\nv 0.138338 -53.245262 -0.108222\nv -0.138270 -53.245266 -0.108222\nv 0.000032 -51.418671 -0.108222\nv -0.126848 -51.461296 -0.108222\nv 0.126916 -51.461296 -0.108222\nv -0.171376 -56.553322 0.107346\nv -0.171376 -58.193188 0.107346\nv 0.171442 -56.553322 0.107346\nv 0.171446 -58.193188 0.107346\nv -0.138269 -58.272335 0.107346\nv 0.138339 -58.272335 0.107346\nv 0.126913 -56.488373 0.107346\nv -0.126847 -56.488373 0.107346\nv 0.000037 -58.193188 0.107346\nv 0.000033 -56.553322 0.107346\nv 0.000037 -58.307621 0.107346\nv 0.000033 -56.445744 0.107346\nv -0.171376 -56.553322 -0.108223\nv -0.171376 -58.193188 -0.108223\nv 0.000037 -58.193188 -0.108223\nv 0.171446 -58.193188 -0.108223\nv 0.171442 -56.553322 -0.108223\nv 0.000033 -56.553322 -0.108223\nv 0.000037 -58.307621 -0.108223\nv 0.138339 -58.272335 -0.108223\nv -0.138269 -58.272335 -0.108223\nv 0.000033 -56.445744 -0.108223\nv -0.126847 -56.488373 -0.108223\nv 0.126913 -56.488373 -0.108223\nv -0.171376 -61.580391 0.107346\nv -0.171375 -63.220253 0.107346\nv 0.171443 -61.580391 0.107346\nv 0.171447 -63.220253 0.107346\nv -0.138268 -63.299408 0.107346\nv 0.138340 -63.299400 0.107346\nv 0.126914 -61.515446 0.107346\nv -0.126847 -61.515446 0.107346\nv 0.000038 -63.220253 0.107346\nv 0.000034 -61.580391 0.107346\nv 0.000038 -63.334686 0.107346\nv 0.000033 -61.472809 0.107346\nv -0.171376 -61.580391 -0.108223\nv -0.171375 -63.220253 -0.108223\nv 0.000038 -63.220253 -0.108223\nv 0.171447 -63.220253 -0.108223\nv 0.171443 -61.580391 -0.108223\nv 0.000034 -61.580391 -0.108223\nv 0.000038 -63.334686 -0.108223\nv 0.138340 -63.299400 -0.108223\nv -0.138268 -63.299408 -0.108223\nv 0.000034 -61.472809 -0.108223\nv -0.126847 -61.515446 -0.108223\nv 0.126914 -61.515446 -0.108223\nv -1.490295 1.504831 -0.948654\nv -1.490295 1.504831 0.943109\nv -2.107608 0.014509 -0.948654\nv -2.107608 0.014509 0.943109\nv -1.490295 -1.475814 -0.948654\nv -1.490295 -1.475814 0.943109\nv 0.000028 -2.093127 -0.948654\nv 0.000028 -2.093127 0.943109\nv 0.000027 1.501835 1.529593\nv 0.000027 1.501835 -1.535137\nv 1.490350 -1.475813 -0.948654\nv 1.490350 -1.475813 0.943109\nv 1.051728 1.066210 1.529592\nv 1.051728 1.066210 -1.535138\nv 1.487353 0.014509 1.529593\nv 1.487354 0.014509 -1.535137\nv 2.107663 0.014509 -0.948654\nv 2.107663 0.014509 0.943109\nv 1.051728 -1.037192 1.529592\nv 1.051728 -1.037191 -1.535138\nv 0.000028 -1.472817 1.529592\nv 0.000028 -1.472817 -1.535138\nv 1.490350 1.504832 -0.948654\nv 1.490350 1.504832 0.943109\nv -1.051673 -1.037192 1.529592\nv -1.051673 -1.037192 -1.535138\nv -1.487299 0.014509 1.529592\nv -1.487298 0.014509 -1.535138\nv 0.000027 2.122145 -0.948654\nv 0.000027 2.122145 0.943109\nv -1.051673 1.066209 1.529592\nv -1.051673 1.066210 -1.535138\nv -1.624150 1.638690 0.331064\nv -1.624150 1.638690 -0.336609\nv -2.296909 0.014509 -0.336609\nv -2.296909 0.014509 0.331063\nv -1.624150 -1.609668 -0.336609\nv -1.624150 -1.609668 0.331063\nv 0.000028 -2.282428 -0.336609\nv 0.000028 -2.282428 0.331063\nv 1.624205 -1.609668 -0.336609\nv 1.624205 -1.609668 0.331064\nv 2.296964 0.014509 -0.336608\nv 2.296964 0.014509 0.331064\nv 1.624205 1.638687 -0.336608\nv 1.624205 1.638687 0.331064\nv 0.000027 2.311446 -0.336608\nv 0.000027 2.311446 0.331064\nv -1.750510 1.765046 0.308911\nv -1.750510 1.765046 -0.293912\nv -2.475609 0.014509 -0.293912\nv -2.475609 0.014509 0.308911\nv -1.750509 -1.736028 -0.293912\nv -1.750509 -1.736028 0.308911\nv 0.000028 -2.461127 -0.293912\nv 0.000028 -2.461127 0.308911\nv 1.750565 -1.736028 -0.293912\nv 1.750565 -1.736028 0.308911\nv 2.475659 0.014509 -0.293911\nv 2.475659 0.014509 0.308911\nv 1.750564 1.765046 -0.293911\nv 1.750564 1.765046 0.308911\nv 0.000027 2.490145 -0.293911\nv 0.000027 2.490145 0.308911\nv -1.406158 1.420694 0.285351\nv -1.406158 1.420694 -0.256968\nv -1.988617 0.014509 -0.256968\nv -1.988617 0.014509 0.285351\nv -1.406157 -1.391676 -0.256968\nv -1.406157 -1.391676 0.285351\nv 0.000028 -1.974136 -0.256968\nv 0.000028 -1.974136 0.285351\nv 1.406213 -1.391676 -0.256968\nv 1.406213 -1.391676 0.285351\nv 1.988672 0.014509 -0.256968\nv 1.988672 0.014509 0.285351\nv 1.406212 1.420694 -0.256968\nv 1.406212 1.420694 0.285351\nv 0.000027 2.003154 -0.256968\nv 0.000027 2.003154 0.285351\nv -2.243056 0.943627 -0.293912\nv -2.243056 0.943627 0.308911\nv -1.801812 0.760855 -0.256968\nv -1.801812 0.760855 0.285351\nv -2.243056 -0.914605 0.308911\nv -2.243056 -0.914605 -0.293912\nv -1.801812 -0.731837 0.285351\nv -1.801812 -0.731837 -0.256968\nv -0.929086 -2.228574 0.308911\nv -0.929086 -2.228574 -0.293912\nv -0.746318 -1.787331 0.285351\nv -0.746318 -1.787331 -0.256968\nv 0.929142 -2.228574 -0.293912\nv 0.929142 -2.228574 0.308911\nv 0.746374 -1.787330 -0.256968\nv 0.746374 -1.787330 0.285351\nv 2.243111 -0.914605 -0.293911\nv 2.243111 -0.914605 0.308911\nv 1.801867 -0.731837 -0.256968\nv 1.801867 -0.731837 0.285351\nv 2.243110 0.943627 0.308911\nv 2.243110 0.943627 -0.293911\nv 1.801867 0.760855 0.285351\nv 1.801867 0.760855 -0.256968\nv 0.929141 2.257593 0.308911\nv 0.929141 2.257593 -0.293911\nv 0.746373 1.816349 0.285351\nv 0.746373 1.816349 -0.256968\nv -0.929087 2.257592 -0.293911\nv -0.929087 2.257592 0.308911\nv -0.746319 1.816348 -0.256968\nv -0.746319 1.816348 0.285351\nv 0.000027 0.514278 1.767159\nv 0.000027 0.514278 -1.772704\nv 0.353416 0.367897 1.767159\nv 0.353416 0.367898 -1.772704\nv 0.499797 0.014509 1.767159\nv 0.499797 0.014509 -1.772704\nv 0.353416 -0.338880 1.767159\nv 0.353416 -0.338879 -1.772704\nv 0.000027 -0.485260 1.767159\nv 0.000028 -0.485260 -1.772704\nv -0.353361 -0.338880 1.767159\nv -0.353361 -0.338879 -1.772704\nv -0.499742 0.014509 1.767159\nv -0.499742 0.014509 -1.772704\nv -0.353361 0.367897 1.767159\nv -0.353361 0.367898 -1.772704\nv 0.000027 0.014509 1.842744\nv 0.000028 0.014509 -1.843360\nvt 0.635567 0.741023\nvt 0.635567 0.368290\nvt 0.552395 0.371370\nvt 0.524671 0.365210\nvt 0.524671 0.737943\nvt 0.746463 0.365210\nvt 0.635567 0.362129\nvt 0.437896 0.751829\nvt 0.424034 0.155764\nvt 0.507206 0.377556\nvn -0.000000 0.000000 1.000000\nvn 0.707100 -0.707100 0.000000\nvn -0.000000 0.000000 -1.000000\nvn -0.707100 0.707100 -0.000000\nvn 0.983000 -0.183300 0.000000\nvn 0.379500 -0.925200 0.000000\nvn -0.510300 -0.860000 0.000000\nvn -0.925200 0.379500 -0.000000\nvn 0.895500 0.445100 0.000000\nvn -0.183400 0.983000 -0.000000\nvn 0.445100 0.895500 0.000000\nvn -0.860000 -0.510300 -0.000000\nvn 0.707100 0.707100 0.000000\nvn -0.707100 -0.707100 0.000000\nvn 0.183400 0.983000 0.000000\nvn 0.925200 0.379500 0.000000\nvn 0.860000 -0.510300 0.000000\nvn -0.379500 -0.925200 0.000000\nvn -0.445100 0.895500 0.000000\nvn -0.983000 -0.183400 -0.000000\nvn -0.895500 0.445100 0.000000\nvn 0.510300 -0.860000 0.000000\nvn 1.000000 0.000000 0.000000\nvn -1.000000 -0.000000 -0.000000\nvn 0.824800 0.565500 0.000000\nvn 0.922600 -0.385900 0.000000\nvn 0.247200 -0.969000 0.000000\nvn -0.922600 -0.385900 -0.000000\nvn 0.318500 0.947900 0.000000\nvn -0.824800 0.565500 -0.000000\nvn -0.318500 0.947900 -0.000000\nvn -0.247200 -0.969000 0.000000\nvn 0.922500 -0.385900 0.000000\nvn -0.922500 -0.385900 0.000000\nvn 0.824800 0.565400 -0.000000\nvn -0.824800 0.565400 -0.000000\nvn -0.922600 -0.385800 -0.000000\nvn -0.368000 0.888300 -0.274800\nvn -0.368000 0.888300 0.274800\nvn -0.888300 -0.368000 0.274800\nvn -0.368000 -0.888300 -0.274800\nvn -0.368000 -0.888300 0.274800\nvn 0.368000 -0.888300 -0.274800\nvn 0.888300 -0.368000 -0.274800\nvn 0.368000 -0.888300 0.274800\nvn 0.888300 0.368000 -0.274800\nvn 0.888300 -0.368000 0.274800\nvn 0.888300 0.368000 0.274800\nvn 0.368000 0.888300 -0.274800\nvn 0.368000 0.888300 0.274800\nvn -0.273700 0.660800 -0.698900\nvn 0.660800 0.273700 -0.698900\nvn -0.660800 0.273700 -0.698900\nvn 0.273700 0.660800 -0.698900\nvn -0.273700 0.660800 0.698900\nvn 0.660800 0.273700 0.698900\nvn -0.660800 0.273700 0.698900\nvn -0.273700 -0.660800 -0.698900\nvn -0.273700 -0.660800 0.698900\nvn 0.273700 0.660800 0.698900\nvn -0.660800 -0.273700 -0.698900\nvn -0.888300 0.368000 0.274800\nvn 0.660800 -0.273700 -0.698900\nvn -0.660800 -0.273700 0.698900\nvn 0.273700 -0.660800 -0.698900\nvn 0.660800 -0.273700 0.698900\nvn -0.888300 -0.368000 -0.274800\nvn 0.273700 -0.660800 0.698900\nvn -0.923900 0.382700 0.000000\nvn -0.923900 -0.382700 0.000000\nvn -0.382700 -0.923900 0.000000\nvn 0.382700 -0.923900 0.000000\nvn 0.923900 -0.382700 -0.000000\nvn 0.923900 0.382700 0.000000\nvn 0.382700 0.923900 0.000000\nvn -0.382700 0.923900 0.000000\nvn -0.888300 0.368000 -0.274800\nvn -0.970100 0.242800 0.000000\nvn -0.970100 -0.242800 -0.000000\nvn -0.514300 -0.857600 0.000000\nvn 0.514300 -0.857600 0.000000\nvn 0.970100 -0.242800 0.000000\nvn 0.970100 0.242800 0.000000\nvn 0.514300 0.857600 0.000000\nvn -0.514300 0.857600 0.000000\nvn 0.048300 0.012100 0.998800\nvn -0.025600 -0.042700 0.998800\nvn -0.075600 0.018900 -0.997000\nvn 0.066900 0.040100 -0.997000\nvn -0.018900 -0.075600 -0.997000\nvn 0.040100 -0.066900 -0.997000\nvn -0.042700 0.025600 0.998800\nvn 0.025600 0.042700 0.998800\nvn 0.012100 -0.048300 0.998800\nvn 0.075600 -0.018900 -0.997000\nvn 0.018900 0.075600 -0.997000\nvn -0.048300 -0.012100 0.998800\nvn -0.040100 0.066900 -0.997000\nvn 0.042700 -0.025600 0.998800\nvn -0.066900 -0.040100 -0.997000\nvn -0.012100 0.048300 0.998800\nvn 0.048300 -0.012100 0.998800\nvn 0.066900 -0.040100 -0.997000\nvn 0.857600 -0.514300 0.000000\nvn -0.857600 0.514300 -0.000000\nvn 0.075600 0.018900 -0.997000\nvn 0.042700 0.025600 0.998800\nvn 0.857600 0.514300 0.000000\nvn -0.857600 -0.514300 -0.000000\nvn 0.040100 0.066900 -0.997000\nvn 0.012100 0.048300 0.998800\nvn 0.242800 0.970100 0.000000\nvn -0.242800 -0.970100 0.000000\nvn -0.025600 0.042700 0.998800\nvn -0.018900 0.075600 -0.997000\nvn -0.242800 0.970100 0.000000\nvn 0.242800 -0.970100 0.000000\nvn -0.048300 0.012100 0.998800\nvn -0.066900 0.040100 -0.997000\nvn -0.075600 -0.018900 -0.997000\nvn -0.042700 -0.025600 0.998800\nvn -0.040100 -0.066900 -0.997000\nvn -0.012100 -0.048300 0.998800\nvn 0.025600 -0.042700 0.998800\nvn 0.018900 -0.075600 -0.997000\nvn -0.232800 -0.096400 -0.967700\nvn 0.232800 0.096400 0.967700\nvn -0.232800 -0.096400 0.967700\nvn 0.232800 -0.096400 -0.967700\nvn 0.232800 -0.096400 0.967700\nvn -0.096400 0.232800 -0.967700\nvn 0.096400 -0.232800 -0.967700\nvn -0.096400 0.232800 0.967700\nvn -0.232800 0.096400 -0.967700\nvn 0.096400 -0.232800 0.967700\nvn 0.096400 0.232800 0.967700\nvn -0.232800 0.096400 0.967700\nvn -0.096400 -0.232800 -0.967700\nvn 0.096400 0.232800 -0.967700\nvn -0.096400 -0.232800 0.967700\nvn 0.232800 0.096400 -0.967700\nvn 0.139800 0.057900 -0.988500\nvn 0.057900 0.139800 -0.988500\nvn -0.057900 -0.139700 -0.988500\nvn 0.057900 -0.139700 -0.988500\nvn -0.057900 0.139800 -0.988500\nvn -0.139700 0.057900 -0.988500\nvn 0.139800 -0.057900 -0.988500\nvn -0.139700 -0.057900 -0.988500\nvn 0.149300 0.061800 0.986900\nvn -0.149300 -0.061800 0.986900\nvn 0.149300 -0.061800 0.986900\nvn -0.149300 0.061800 0.986900\nvn -0.061800 0.149300 0.986900\nvn 0.061800 -0.149300 0.986900\nvn 0.061800 0.149300 0.986900\nvn -0.061800 -0.149300 0.986900\ns off\nf 17/1/1 4/1/1 3/1/1 18/1/1\nf 4/2/2 8/2/2 7/2/2 3/2/2\nf 19/1/3 6/1/3 5/1/3 20/1/3\nf 6/2/4 2/2/4 1/2/4 5/2/4\nf 3/3/5 7/3/5 15/3/5 13/3/5\nf 8/4/6 4/4/6 10/4/6 11/4/6\nf 22/4/7 11/4/7 10/4/7 21/4/7\nf 19/5/3 8/5/3 11/5/3 22/5/3\nf 17/5/1 2/5/1 9/5/1 21/5/1\nf 2/4/8 6/4/8 12/4/8 9/4/8\nf 23/3/9 13/3/9 15/3/9 24/3/9\nf 5/3/10 1/3/10 14/3/10 16/3/10\nf 20/5/3 5/5/3 16/5/3 24/5/3\nf 18/5/1 3/5/1 13/5/1 23/5/1\nf 1/5/1 18/5/1 23/5/1 14/5/1\nf 7/5/3 20/5/3 24/5/3 15/5/3\nf 14/3/11 23/3/11 24/3/11 16/3/11\nf 4/5/1 17/5/1 21/5/1 10/5/1\nf 6/5/3 19/5/3 22/5/3 12/5/3\nf 12/4/12 22/4/12 21/4/12 9/4/12\nf 8/1/3 19/1/3 20/1/3 7/1/3\nf 2/1/1 17/1/1 18/1/1 1/1/1\nf 41/1/1 28/1/1 27/1/1 42/1/1\nf 28/2/13 32/2/13 31/2/13 27/2/13\nf 43/1/3 30/1/3 29/1/3 44/1/3\nf 30/2/14 26/2/14 25/2/14 29/2/14\nf 27/3/15 31/3/15 39/3/15 37/3/15\nf 32/4/16 28/4/16 34/4/16 35/4/16\nf 46/4/17 35/4/17 34/4/17 45/4/17\nf 43/5/3 32/5/3 35/5/3 46/5/3\nf 41/5/1 26/5/1 33/5/1 45/5/1\nf 26/4/18 30/4/18 36/4/18 33/4/18\nf 47/3/19 37/3/19 39/3/19 48/3/19\nf 29/3/20 25/3/20 38/3/20 40/3/20\nf 44/5/3 29/5/3 40/5/3 48/5/3\nf 42/5/1 27/5/1 37/5/1 47/5/1\nf 25/5/1 42/5/1 47/5/1 38/5/1\nf 31/5/3 44/5/3 48/5/3 39/5/3\nf 38/3/21 47/3/21 48/3/21 40/3/21\nf 28/5/1 41/5/1 45/5/1 34/5/1\nf 30/5/3 43/5/3 46/5/3 36/5/3\nf 36/4/22 46/4/22 45/4/22 33/4/22\nf 32/1/3 43/1/3 44/1/3 31/1/3\nf 26/1/1 41/1/1 42/1/1 25/1/1\nf 65/1/1 52/1/1 51/1/1 66/1/1\nf 52/2/23 56/2/23 55/2/23 51/2/23\nf 67/1/3 54/1/3 53/1/3 68/1/3\nf 54/2/24 50/2/24 49/2/24 53/2/24\nf 51/3/25 55/3/25 63/3/25 61/3/25\nf 56/4/26 52/4/26 58/4/26 59/4/26\nf 70/4/27 59/4/27 58/4/27 69/4/27\nf 67/5/3 56/5/3 59/5/3 70/5/3\nf 65/5/1 50/5/1 57/5/1 69/5/1\nf 50/4/28 54/4/28 60/4/28 57/4/28\nf 71/3/29 61/3/29 63/3/29 72/3/29\nf 53/3/30 49/3/30 62/3/30 64/3/30\nf 68/5/3 53/5/3 64/5/3 72/5/3\nf 66/5/1 51/5/1 61/5/1 71/5/1\nf 49/5/1 66/5/1 71/5/1 62/5/1\nf 55/5/3 68/5/3 72/5/3 63/5/3\nf 62/3/31 71/3/31 72/3/31 64/3/31\nf 52/5/1 65/5/1 69/5/1 58/5/1\nf 54/5/3 67/5/3 70/5/3 60/5/3\nf 60/4/32 70/4/32 69/4/32 57/4/32\nf 56/1/3 67/1/3 68/1/3 55/1/3\nf 50/1/1 65/1/1 66/1/1 49/1/1\nf 81/1/1 76/1/1 75/1/1 82/1/1\nf 81/5/1 74/5/1 77/5/1 83/5/1\nf 82/5/1 75/5/1 79/5/1 84/5/1\nf 73/5/1 82/5/1 84/5/1 80/5/1\nf 76/5/1 81/5/1 83/5/1 78/5/1\nf 74/1/1 81/1/1 82/1/1 73/1/1\nf 87/1/3 90/1/3 89/1/3 88/1/3\nf 87/5/3 91/5/3 93/5/3 86/5/3\nf 90/5/3 94/5/3 96/5/3 89/5/3\nf 85/5/3 95/5/3 94/5/3 90/5/3\nf 88/5/3 92/5/3 91/5/3 87/5/3\nf 86/1/3 85/1/3 90/1/3 87/1/3\nf 73/6/24 85/6/24 86/6/24 74/6/24\nf 84/7/31 94/7/31 95/7/31 80/7/31\nf 83/7/27 91/7/27 92/7/27 78/7/27\nf 75/7/25 89/7/25 96/7/25 79/7/25\nf 78/7/33 92/7/33 88/7/33 76/7/33\nf 77/7/32 93/7/32 91/7/32 83/7/32\nf 76/6/23 88/6/23 89/6/23 75/6/23\nf 80/7/30 95/7/30 85/7/30 73/7/30\nf 74/7/28 86/7/28 93/7/28 77/7/28\nf 79/7/29 96/7/29 94/7/29 84/7/29\nf 105/1/1 100/1/1 99/1/1 106/1/1\nf 105/5/1 98/5/1 101/5/1 107/5/1\nf 106/5/1 99/5/1 103/5/1 108/5/1\nf 97/5/1 106/5/1 108/5/1 104/5/1\nf 100/5/1 105/5/1 107/5/1 102/5/1\nf 98/1/1 105/1/1 106/1/1 97/1/1\nf 111/1/3 114/1/3 113/1/3 112/1/3\nf 111/5/3 115/5/3 117/5/3 110/5/3\nf 114/5/3 118/5/3 120/5/3 113/5/3\nf 109/5/3 119/5/3 118/5/3 114/5/3\nf 112/5/3 116/5/3 115/5/3 111/5/3\nf 110/1/3 109/1/3 114/1/3 111/1/3\nf 97/6/24 109/6/24 110/6/24 98/6/24\nf 108/7/31 118/7/31 119/7/31 104/7/31\nf 107/7/27 115/7/27 116/7/27 102/7/27\nf 99/7/25 113/7/25 120/7/25 103/7/25\nf 102/7/33 116/7/33 112/7/33 100/7/33\nf 101/7/32 117/7/32 115/7/32 107/7/32\nf 100/6/23 112/6/23 113/6/23 99/6/23\nf 104/7/30 119/7/30 109/7/30 97/7/30\nf 98/7/34 110/7/34 117/7/34 101/7/34\nf 103/7/29 120/7/29 118/7/29 108/7/29\nf 129/1/1 124/1/1 123/1/1 130/1/1\nf 129/5/1 122/5/1 125/5/1 131/5/1\nf 130/5/1 123/5/1 127/5/1 132/5/1\nf 121/5/1 130/5/1 132/5/1 128/5/1\nf 124/5/1 129/5/1 131/5/1 126/5/1\nf 122/1/1 129/1/1 130/1/1 121/1/1\nf 135/1/3 138/1/3 137/1/3 136/1/3\nf 135/5/3 139/5/3 141/5/3 134/5/3\nf 138/5/3 142/5/3 144/5/3 137/5/3\nf 133/5/3 143/5/3 142/5/3 138/5/3\nf 136/5/3 140/5/3 139/5/3 135/5/3\nf 134/1/3 133/1/3 138/1/3 135/1/3\nf 121/6/24 133/6/24 134/6/24 122/6/24\nf 132/7/31 142/7/31 143/7/31 128/7/31\nf 131/7/27 139/7/27 140/7/27 126/7/27\nf 123/7/35 137/7/35 144/7/35 127/7/35\nf 126/7/33 140/7/33 136/7/33 124/7/33\nf 125/7/32 141/7/32 139/7/32 131/7/32\nf 124/6/23 136/6/23 137/6/23 123/6/23\nf 128/7/36 143/7/36 133/7/36 121/7/36\nf 122/7/34 134/7/34 141/7/34 125/7/34\nf 127/7/29 144/7/29 142/7/29 132/7/29\nf 153/1/1 148/1/1 147/1/1 154/1/1\nf 153/5/1 146/5/1 149/5/1 155/5/1\nf 154/5/1 147/5/1 151/5/1 156/5/1\nf 145/5/1 154/5/1 156/5/1 152/5/1\nf 148/5/1 153/5/1 155/5/1 150/5/1\nf 146/1/1 153/1/1 154/1/1 145/1/1\nf 159/1/3 162/1/3 161/1/3 160/1/3\nf 159/5/3 163/5/3 165/5/3 158/5/3\nf 162/5/3 166/5/3 168/5/3 161/5/3\nf 157/5/3 167/5/3 166/5/3 162/5/3\nf 160/5/3 164/5/3 163/5/3 159/5/3\nf 158/1/3 157/1/3 162/1/3 159/1/3\nf 145/6/24 157/6/24 158/6/24 146/6/24\nf 156/7/31 166/7/31 167/7/31 152/7/31\nf 155/7/27 163/7/27 164/7/27 150/7/27\nf 147/7/25 161/7/25 168/7/25 151/7/25\nf 150/7/26 164/7/26 160/7/26 148/7/26\nf 149/7/32 165/7/32 163/7/32 155/7/32\nf 148/6/23 160/6/23 161/6/23 147/6/23\nf 152/7/30 167/7/30 157/7/30 145/7/30\nf 146/7/37 158/7/37 165/7/37 149/7/37\nf 151/7/29 168/7/29 166/7/29 156/7/29\nf 177/1/1 172/1/1 171/1/1 178/1/1\nf 177/5/1 170/5/1 173/5/1 179/5/1\nf 178/5/1 171/5/1 175/5/1 180/5/1\nf 169/5/1 178/5/1 180/5/1 176/5/1\nf 172/5/1 177/5/1 179/5/1 174/5/1\nf 170/1/1 177/1/1 178/1/1 169/1/1\nf 183/1/3 186/1/3 185/1/3 184/1/3\nf 183/5/3 187/5/3 189/5/3 182/5/3\nf 186/5/3 190/5/3 192/5/3 185/5/3\nf 181/5/3 191/5/3 190/5/3 186/5/3\nf 184/5/3 188/5/3 187/5/3 183/5/3\nf 182/1/3 181/1/3 186/1/3 183/1/3\nf 169/6/24 181/6/24 182/6/24 170/6/24\nf 180/7/31 190/7/31 191/7/31 176/7/31\nf 179/7/27 187/7/27 188/7/27 174/7/27\nf 171/7/25 185/7/25 192/7/25 175/7/25\nf 174/7/33 188/7/33 184/7/33 172/7/33\nf 173/7/32 189/7/32 187/7/32 179/7/32\nf 172/6/23 184/6/23 185/6/23 171/6/23\nf 176/7/30 191/7/30 181/7/30 169/7/30\nf 170/7/28 182/7/28 189/7/28 173/7/28\nf 175/7/29 192/7/29 190/7/29 180/7/29\nf 201/1/1 196/1/1 195/1/1 202/1/1\nf 201/5/1 194/5/1 197/5/1 203/5/1\nf 202/5/1 195/5/1 199/5/1 204/5/1\nf 193/5/1 202/5/1 204/5/1 200/5/1\nf 196/5/1 201/5/1 203/5/1 198/5/1\nf 194/1/1 201/1/1 202/1/1 193/1/1\nf 207/1/3 210/1/3 209/1/3 208/1/3\nf 207/5/3 211/5/3 213/5/3 206/5/3\nf 210/5/3 214/5/3 216/5/3 209/5/3\nf 205/5/3 215/5/3 214/5/3 210/5/3\nf 208/5/3 212/5/3 211/5/3 207/5/3\nf 206/1/3 205/1/3 210/1/3 207/1/3\nf 193/6/24 205/6/24 206/6/24 194/6/24\nf 204/7/31 214/7/31 215/7/31 200/7/31\nf 203/7/27 211/7/27 212/7/27 198/7/27\nf 195/7/25 209/7/25 216/7/25 199/7/25\nf 198/7/33 212/7/33 208/7/33 196/7/33\nf 197/7/32 213/7/32 211/7/32 203/7/32\nf 196/6/23 208/6/23 209/6/23 195/6/23\nf 200/7/30 215/7/30 205/7/30 193/7/30\nf 194/7/28 206/7/28 213/7/28 197/7/28\nf 199/7/29 216/7/29 214/7/29 204/7/29\nf 225/1/1 220/1/1 219/1/1 226/1/1\nf 225/5/1 218/5/1 221/5/1 227/5/1\nf 226/5/1 219/5/1 223/5/1 228/5/1\nf 217/5/1 226/5/1 228/5/1 224/5/1\nf 220/5/1 225/5/1 227/5/1 222/5/1\nf 218/1/1 225/1/1 226/1/1 217/1/1\nf 231/1/3 234/1/3 233/1/3 232/1/3\nf 231/5/3 235/5/3 237/5/3 230/5/3\nf 234/5/3 238/5/3 240/5/3 233/5/3\nf 229/5/3 239/5/3 238/5/3 234/5/3\nf 232/5/3 236/5/3 235/5/3 231/5/3\nf 230/1/3 229/1/3 234/1/3 231/1/3\nf 217/6/24 229/6/24 230/6/24 218/6/24\nf 228/7/31 238/7/31 239/7/31 224/7/31\nf 227/7/27 235/7/27 236/7/27 222/7/27\nf 219/7/25 233/7/25 240/7/25 223/7/25\nf 222/7/33 236/7/33 232/7/33 220/7/33\nf 221/7/32 237/7/32 235/7/32 227/7/32\nf 220/6/23 232/6/23 233/6/23 219/6/23\nf 224/7/30 239/7/30 229/7/30 217/7/30\nf 218/7/34 230/7/34 237/7/34 221/7/34\nf 223/7/29 240/7/29 238/7/29 228/7/29\nf 249/1/1 244/1/1 243/1/1 250/1/1\nf 249/5/1 242/5/1 245/5/1 251/5/1\nf 250/5/1 243/5/1 247/5/1 252/5/1\nf 241/5/1 250/5/1 252/5/1 248/5/1\nf 244/5/1 249/5/1 251/5/1 246/5/1\nf 242/1/1 249/1/1 250/1/1 241/1/1\nf 255/1/3 258/1/3 257/1/3 256/1/3\nf 255/5/3 259/5/3 261/5/3 254/5/3\nf 258/5/3 262/5/3 264/5/3 257/5/3\nf 253/5/3 263/5/3 262/5/3 258/5/3\nf 256/5/3 260/5/3 259/5/3 255/5/3\nf 254/1/3 253/1/3 258/1/3 255/1/3\nf 241/6/24 253/6/24 254/6/24 242/6/24\nf 252/7/31 262/7/31 263/7/31 248/7/31\nf 251/7/27 259/7/27 260/7/27 246/7/27\nf 243/7/35 257/7/35 264/7/35 247/7/35\nf 246/7/33 260/7/33 256/7/33 244/7/33\nf 245/7/32 261/7/32 259/7/32 251/7/32\nf 244/6/23 256/6/23 257/6/23 243/6/23\nf 248/7/36 263/7/36 253/7/36 241/7/36\nf 242/7/34 254/7/34 261/7/34 245/7/34\nf 247/7/29 264/7/29 262/7/29 252/7/29\nf 273/1/1 268/1/1 267/1/1 274/1/1\nf 273/5/1 266/5/1 269/5/1 275/5/1\nf 274/5/1 267/5/1 271/5/1 276/5/1\nf 265/5/1 274/5/1 276/5/1 272/5/1\nf 268/5/1 273/5/1 275/5/1 270/5/1\nf 266/1/1 273/1/1 274/1/1 265/1/1\nf 279/1/3 282/1/3 281/1/3 280/1/3\nf 279/5/3 283/5/3 285/5/3 278/5/3\nf 282/5/3 286/5/3 288/5/3 281/5/3\nf 277/5/3 287/5/3 286/5/3 282/5/3\nf 280/5/3 284/5/3 283/5/3 279/5/3\nf 278/1/3 277/1/3 282/1/3 279/1/3\nf 265/6/24 277/6/24 278/6/24 266/6/24\nf 276/7/31 286/7/31 287/7/31 272/7/31\nf 275/7/27 283/7/27 284/7/27 270/7/27\nf 267/7/25 281/7/25 288/7/25 271/7/25\nf 270/7/33 284/7/33 280/7/33 268/7/33\nf 269/7/32 285/7/32 283/7/32 275/7/32\nf 268/6/23 280/6/23 281/6/23 267/6/23\nf 272/7/30 287/7/30 277/7/30 265/7/30\nf 266/7/34 278/7/34 285/7/34 269/7/34\nf 271/7/29 288/7/29 286/7/29 276/7/29\nf 297/1/1 292/1/1 291/1/1 298/1/1\nf 297/5/1 290/5/1 293/5/1 299/5/1\nf 298/5/1 291/5/1 295/5/1 300/5/1\nf 289/5/1 298/5/1 300/5/1 296/5/1\nf 292/5/1 297/5/1 299/5/1 294/5/1\nf 290/1/1 297/1/1 298/1/1 289/1/1\nf 303/1/3 306/1/3 305/1/3 304/1/3\nf 303/5/3 307/5/3 309/5/3 302/5/3\nf 306/5/3 310/5/3 312/5/3 305/5/3\nf 301/5/3 311/5/3 310/5/3 306/5/3\nf 304/5/3 308/5/3 307/5/3 303/5/3\nf 302/1/3 301/1/3 306/1/3 303/1/3\nf 289/6/24 301/6/24 302/6/24 290/6/24\nf 300/7/31 310/7/31 311/7/31 296/7/31\nf 299/7/27 307/7/27 308/7/27 294/7/27\nf 291/7/25 305/7/25 312/7/25 295/7/25\nf 294/7/33 308/7/33 304/7/33 292/7/33\nf 293/7/32 309/7/32 307/7/32 299/7/32\nf 292/6/23 304/6/23 305/6/23 291/6/23\nf 296/7/30 311/7/30 301/7/30 289/7/30\nf 290/7/28 302/7/28 309/7/28 293/7/28\nf 295/7/29 312/7/29 310/7/29 300/7/29\nf 359/8/38 341/8/38 313/8/38 346/8/38\nf 342/8/39 360/8/39 345/8/39 314/8/39\nf 316/8/40 348/8/40 350/8/40 318/8/40\nf 349/8/41 317/8/41 319/8/41 351/8/41\nf 318/8/42 350/8/42 352/8/42 320/8/42\nf 351/8/43 319/8/43 323/8/43 353/8/43\nf 353/8/44 323/8/44 329/8/44 355/8/44\nf 320/8/45 352/8/45 354/8/45 324/8/45\nf 355/8/46 329/8/46 335/8/46 357/8/46\nf 324/8/47 354/8/47 356/8/47 330/8/47\nf 330/8/48 356/8/48 358/8/48 336/8/48\nf 357/8/49 335/8/49 341/8/49 359/8/49\nf 336/8/50 358/8/50 360/8/50 342/8/50\nf 313/8/51 341/8/51 322/8/51 344/8/51\nf 335/8/52 329/8/52 328/8/52 326/8/52\nf 315/8/53 313/8/53 344/8/53 340/8/53\nf 341/8/54 335/8/54 326/8/54 322/8/54\nf 342/8/55 314/8/55 343/8/55 321/8/55\nf 330/8/56 336/8/56 325/8/56 327/8/56\nf 314/8/57 316/8/57 339/8/57 343/8/57\nf 319/8/58 317/8/58 338/8/58 334/8/58\nf 318/8/59 320/8/59 333/8/59 337/8/59\nf 336/8/60 342/8/60 321/8/60 325/8/60\nf 317/8/61 315/8/61 340/8/61 338/8/61\nf 314/8/62 345/8/62 348/8/62 316/8/62\nf 329/8/63 323/8/63 332/8/63 328/8/63\nf 316/8/64 318/8/64 337/8/64 339/8/64\nf 323/8/65 319/8/65 334/8/65 332/8/65\nf 324/8/66 330/8/66 327/8/66 331/8/66\nf 347/8/67 315/8/67 317/8/67 349/8/67\nf 320/8/68 324/8/68 331/8/68 333/8/68\nf 346/8/69 347/8/69 348/8/69 345/8/69\nf 350/8/70 348/8/70 347/8/70 349/8/70\nf 352/8/71 350/8/71 349/8/71 351/8/71\nf 351/8/72 353/8/72 354/8/72 352/8/72\nf 353/8/73 355/8/73 356/8/73 354/8/73\nf 358/8/74 356/8/74 355/8/74 357/8/74\nf 360/8/75 358/8/75 357/8/75 359/8/75\nf 359/8/76 346/8/76 345/8/76 360/8/76\nf 346/8/77 313/8/77 315/8/77 347/8/77\nf 393/9/78 363/9/78 364/9/78 394/9/78\nf 397/9/79 364/9/79 363/9/79 398/9/79\nf 401/9/80 366/9/80 365/9/80 402/9/80\nf 405/9/81 369/9/81 370/9/81 406/9/81\nf 409/9/82 371/9/82 372/9/82 410/9/82\nf 413/9/83 372/9/83 371/9/83 414/9/83\nf 417/9/84 374/9/84 373/9/84 418/9/84\nf 421/9/85 362/9/85 361/9/85 422/9/85\nf 395/9/82 396/9/82 380/9/82 379/9/82\nf 399/9/83 400/9/83 379/9/83 380/9/83\nf 403/9/84 404/9/84 381/9/84 382/9/84\nf 407/9/85 408/9/85 386/9/85 385/9/85\nf 411/9/78 412/9/78 388/9/78 387/9/78\nf 415/9/79 416/9/79 387/9/79 388/9/79\nf 419/9/80 420/9/80 389/9/80 390/9/80\nf 423/9/81 424/9/81 377/9/81 378/9/81\nf 397/10/86 399/10/86 380/10/86 364/10/86\nf 417/10/87 419/10/87 390/10/87 374/10/87\nf 409/10/88 411/10/88 387/10/88 371/10/88\nf 398/10/89 400/10/89 381/10/89 365/10/89\nf 418/10/90 420/10/90 391/10/90 375/10/90\nf 421/10/91 423/10/91 378/10/91 362/10/91\nf 410/10/92 412/10/92 386/10/92 370/10/92\nf 401/10/93 403/10/93 382/10/93 366/10/93\nf 422/10/94 424/10/94 392/10/94 376/10/94\nf 393/10/95 395/10/95 379/10/95 363/10/95\nf 402/10/96 404/10/96 383/10/96 367/10/96\nf 413/10/97 415/10/97 388/10/97 372/10/97\nf 405/10/98 407/10/98 385/10/98 369/10/98\nf 394/10/99 396/10/99 377/10/99 361/10/99\nf 414/10/100 416/10/100 389/10/100 373/10/100\nf 406/10/101 408/10/101 384/10/101 368/10/101\nf 364/10/102 380/10/102 396/10/102 394/10/102\nf 362/10/103 378/10/103 395/10/103 393/10/103\nf 378/9/104 377/9/104 396/9/104 395/9/104\nf 362/9/105 393/9/105 394/9/105 361/9/105\nf 363/10/106 379/10/106 400/10/106 398/10/106\nf 366/10/107 382/10/107 399/10/107 397/10/107\nf 382/9/108 381/9/108 400/9/108 399/9/108\nf 366/9/109 397/9/109 398/9/109 365/9/109\nf 365/10/110 381/10/110 404/10/110 402/10/110\nf 368/10/111 384/10/111 403/10/111 401/10/111\nf 384/9/112 383/9/112 404/9/112 403/9/112\nf 368/9/113 401/9/113 402/9/113 367/9/113\nf 370/10/114 386/10/114 408/10/114 406/10/114\nf 367/10/115 383/10/115 407/10/115 405/10/115\nf 383/9/116 384/9/116 408/9/116 407/9/116\nf 367/9/117 405/9/117 406/9/117 368/9/117\nf 372/10/118 388/10/118 412/10/118 410/10/118\nf 369/10/119 385/10/119 411/10/119 409/10/119\nf 385/9/105 386/9/105 412/9/105 411/9/105\nf 369/9/104 409/9/104 410/9/104 370/9/104\nf 371/10/120 387/10/120 416/10/120 414/10/120\nf 374/10/121 390/10/121 415/10/121 413/10/121\nf 390/9/109 389/9/109 416/9/109 415/9/109\nf 374/9/108 413/9/108 414/9/108 373/9/108\nf 373/10/122 389/10/122 420/10/122 418/10/122\nf 376/10/123 392/10/123 419/10/123 417/10/123\nf 392/9/113 391/9/113 420/9/113 419/9/113\nf 376/9/112 417/9/112 418/9/112 375/9/112\nf 361/10/124 377/10/124 424/10/124 422/10/124\nf 375/10/125 391/10/125 423/10/125 421/10/125\nf 391/9/117 392/9/117 424/9/117 423/9/117\nf 375/9/116 421/9/116 422/9/116 376/9/116\nf 338/8/126 340/8/126 438/8/126 436/8/126\nf 327/8/127 325/8/127 427/8/127 429/8/127\nf 339/8/128 337/8/128 435/8/128 437/8/128\nf 328/8/129 332/8/129 432/8/129 430/8/129\nf 331/8/130 327/8/130 429/8/130 431/8/130\nf 344/8/131 322/8/131 426/8/131 440/8/131\nf 332/8/132 334/8/132 434/8/132 432/8/132\nf 321/8/133 343/8/133 439/8/133 425/8/133\nf 340/8/134 344/8/134 440/8/134 438/8/134\nf 333/8/135 331/8/135 431/8/135 433/8/135\nf 325/8/136 321/8/136 425/8/136 427/8/136\nf 343/8/137 339/8/137 437/8/137 439/8/137\nf 334/8/138 338/8/138 436/8/138 434/8/138\nf 322/8/139 326/8/139 428/8/139 426/8/139\nf 337/8/140 333/8/140 433/8/140 435/8/140\nf 326/8/141 328/8/141 430/8/141 428/8/141\nf 428/8/142 430/8/142 442/8/142\nf 426/8/143 428/8/143 442/8/143\nf 434/8/144 436/8/144 442/8/144\nf 432/8/145 434/8/145 442/8/145\nf 440/8/146 426/8/146 442/8/146\nf 438/8/147 440/8/147 442/8/147\nf 430/8/148 432/8/148 442/8/148\nf 436/8/149 438/8/149 442/8/149\nf 429/8/150 427/8/150 441/8/150\nf 437/8/151 435/8/151 441/8/151\nf 431/8/152 429/8/152 441/8/152\nf 439/8/153 437/8/153 441/8/153\nf 425/8/154 439/8/154 441/8/154\nf 433/8/155 431/8/155 441/8/155\nf 427/8/156 425/8/156 441/8/156\nf 435/8/157 433/8/157 441/8/157\n"
  },
  {
    "path": "browser/data/editor-icons/hemisphere-light/hemisphere.obj",
    "content": "# Blender v2.76 (sub 0) OBJ File: 'Work.blend'\n# www.blender.org\no Cube.027_Cube.021\nv -0.000005 8.511900 0.704067\nv -0.000005 8.511900 -0.669821\nv -6.018828 6.018823 -0.669821\nv -6.018828 6.018823 0.704067\nv -8.511906 -0.000002 -0.669821\nv -8.511906 -0.000002 0.704067\nv -6.018827 -6.018827 -0.669821\nv -6.018827 -6.018827 0.704067\nv -0.000006 -8.511902 -0.669821\nv -0.000006 -8.511902 0.704067\nv 6.018819 -6.018822 -0.669821\nv 6.018819 -6.018822 0.704067\nv 8.511895 0.000001 -0.669821\nv 8.511895 0.000001 0.704067\nv 6.018818 6.018824 -0.669821\nv 6.018818 6.018824 0.704067\nv -0.000003 6.837500 0.650372\nv -0.000003 6.837500 -0.585623\nv -4.834845 4.834839 -0.585623\nv -4.834845 4.834839 0.650372\nv -6.837502 -0.000000 -0.585623\nv -6.837502 -0.000000 0.650372\nv -4.834843 -4.834844 -0.585623\nv -4.834843 -4.834844 0.650372\nv -0.000006 -6.837499 -0.585623\nv -0.000006 -6.837499 0.650372\nv 4.834836 -4.834839 -0.585623\nv 4.834836 -4.834839 0.650372\nv 6.837497 0.000001 -0.585623\nv 6.837493 0.000001 0.650372\nv 4.834835 4.834841 -0.585623\nv 4.834835 4.834841 0.650372\nv -3.194555 7.712331 -0.669821\nv -3.194555 7.712331 0.704067\nv -2.566145 6.195215 -0.585623\nv -2.566145 6.195215 0.650372\nv -7.712334 3.194551 0.704067\nv -7.712334 3.194551 -0.669821\nv -6.195215 2.566140 0.650372\nv -6.195215 2.566140 -0.585623\nv -7.712333 -3.194556 0.704067\nv -7.712333 -3.194556 -0.669821\nv -6.195217 -2.566143 0.650372\nv -6.195217 -2.566143 -0.585623\nv -3.194557 -7.712331 -0.669821\nv -3.194557 -7.712331 0.704067\nv -2.566146 -6.195212 -0.585623\nv -2.566146 -6.195212 0.650372\nv 3.194550 -7.712330 -0.669821\nv 3.194550 -7.712330 0.704067\nv 2.566141 -6.195214 -0.585623\nv 2.566141 -6.195214 0.650372\nv 7.712329 -3.194550 0.704067\nv 7.712329 -3.194550 -0.669821\nv 6.195212 -2.566141 0.650372\nv 6.195212 -2.566141 -0.585623\nv 7.712327 3.194555 0.704067\nv 7.712327 3.194555 -0.669821\nv 6.195206 2.566141 0.650372\nv 6.195212 2.566143 -0.585623\nv 3.194549 7.712332 -0.669821\nv 3.194549 7.712332 0.704067\nv 2.566137 6.195218 -0.585623\nv 2.566133 6.195213 0.650372\nv -12.447230 0.874765 0.802575\nv -20.816124 0.874760 0.802575\nv -12.447227 -0.874795 0.802575\nv -20.816124 -0.874803 0.802575\nv -12.447230 0.874765 -0.814915\nv -20.816124 0.874760 -0.814915\nv -12.447227 -0.874795 -0.814915\nv -20.816124 -0.874803 -0.814915\nv -21.220068 0.705808 0.802575\nv -21.220057 -0.705848 0.802575\nv -21.220057 -0.705848 -0.814915\nv -21.220068 0.705808 -0.814915\nv -12.115772 -0.647542 0.802575\nv -12.115770 0.647516 0.802575\nv -12.115772 -0.647542 -0.814915\nv -12.115770 0.647516 -0.814915\nv -20.816124 -0.000022 0.802575\nv -12.447230 -0.000016 0.802575\nv -20.816124 -0.000022 -0.814915\nv -12.447230 -0.000016 -0.814915\nv -21.400154 -0.000022 0.802575\nv -21.400154 -0.000022 -0.814915\nv -11.898203 -0.000014 0.802575\nv -11.898203 -0.000014 -0.814915\nv -9.420072 -8.182969 0.802575\nv -15.337764 -14.100679 0.802575\nv -8.182947 -9.420094 0.802575\nv -14.100639 -15.337804 0.802575\nv -9.420074 -8.182971 -0.814915\nv -15.337764 -14.100679 -0.814915\nv -8.182947 -9.420094 -0.814915\nv -14.100639 -15.337804 -0.814915\nv -15.503929 -14.505774 0.802575\nv -14.505734 -15.503960 0.802575\nv -14.505734 -15.503960 -0.814915\nv -15.503929 -14.505774 -0.814915\nv -8.109262 -9.025024 0.802575\nv -9.025005 -8.109282 0.802575\nv -8.109262 -9.025024 -0.814915\nv -9.025005 -8.109282 -0.814915\nv -14.719203 -14.719240 0.802575\nv -8.801508 -8.801533 0.802575\nv -14.719203 -14.719240 -0.814915\nv -8.801508 -8.801533 -0.814915\nv -15.132177 -15.132215 0.802575\nv -15.132177 -15.132215 -0.814915\nv -8.413291 -8.413309 0.802575\nv -8.413291 -8.413309 -0.814915\nv -8.182972 9.420065 0.802575\nv -14.100684 15.337759 0.802575\nv -9.420095 8.182941 0.802575\nv -15.337809 14.100635 0.802575\nv -8.182972 9.420065 -0.814915\nv -14.100684 15.337759 -0.814915\nv -9.420095 8.182941 -0.814915\nv -15.337808 14.100635 -0.814915\nv -14.505781 15.503922 0.802575\nv -15.503966 14.505728 0.802575\nv -15.503966 14.505728 -0.814915\nv -14.505781 15.503922 -0.814915\nv -9.025026 8.109256 0.802575\nv -8.109282 9.025001 0.802575\nv -9.025025 8.109256 -0.814915\nv -8.109282 9.025001 -0.814915\nv -14.719247 14.719196 0.802575\nv -8.801533 8.801504 0.802575\nv -14.719247 14.719196 -0.814915\nv -8.801533 8.801504 -0.814915\nv -15.132219 15.132173 0.802575\nv -15.132219 15.132173 -0.814915\nv -8.413312 8.413283 0.802575\nv -8.413312 8.413283 -0.814915\nv 9.420048 8.182959 0.802575\nv 15.337739 14.100668 0.802575\nv 8.182926 9.420080 0.802575\nv 14.100615 15.337792 0.802575\nv 9.420052 8.182962 -0.814915\nv 15.337739 14.100668 -0.814915\nv 8.182926 9.420080 -0.814915\nv 14.100615 15.337792 -0.814915\nv 15.503907 14.505770 0.802575\nv 14.505708 15.503952 0.802575\nv 14.505708 15.503952 -0.814915\nv 15.503907 14.505770 -0.814915\nv 8.109239 9.025013 0.802575\nv 9.024983 8.109268 0.802575\nv 8.109239 9.025013 -0.814915\nv 9.024983 8.109268 -0.814915\nv 14.719178 14.719229 0.802575\nv 8.801487 8.801519 0.802575\nv 14.719175 14.719232 -0.814915\nv 8.801487 8.801519 -0.814915\nv 15.132157 15.132208 0.802575\nv 15.132157 15.132208 -0.814915\nv 8.413273 8.413301 0.802575\nv 8.413273 8.413301 -0.814915\nv 8.182943 -9.420063 0.802572\nv 14.100656 -15.337753 0.802571\nv 9.420067 -8.182939 0.802573\nv 15.337780 -14.100629 0.802571\nv 8.182947 -9.420067 -0.814917\nv 14.100656 -15.337753 -0.814919\nv 9.420068 -8.182939 -0.814917\nv 15.337780 -14.100629 -0.814918\nv 14.505747 -15.503915 0.802571\nv 15.503937 -14.505724 0.802571\nv 15.503937 -14.505724 -0.814919\nv 14.505747 -15.503915 -0.814919\nv 9.024998 -8.109254 0.802573\nv 8.109253 -9.024999 0.802572\nv 9.024998 -8.109254 -0.814917\nv 8.109253 -9.024999 -0.814917\nv 14.719216 -14.719192 0.802571\nv 8.801504 -8.801502 0.802572\nv 14.719217 -14.719192 -0.814919\nv 8.801504 -8.801502 -0.814917\nv 15.132187 -15.132162 0.802571\nv 15.132188 -15.132162 -0.814919\nv 8.413288 -8.413286 0.802572\nv 8.413288 -8.413286 -0.814917\nv 0.874752 12.447212 0.802577\nv 0.874742 20.816111 0.802578\nv -0.874804 12.447215 0.802577\nv -0.874816 20.816105 0.802578\nv 0.874752 12.447212 -0.814913\nv 0.874742 20.816111 -0.814912\nv -0.874804 12.447215 -0.814913\nv -0.874816 20.816105 -0.814912\nv 0.705791 21.220047 0.802578\nv -0.705869 21.220047 0.802578\nv -0.705869 21.220047 -0.814912\nv 0.705791 21.220047 -0.814912\nv -0.647555 12.115754 0.802577\nv 0.647502 12.115752 0.802577\nv -0.647555 12.115754 -0.814913\nv 0.647502 12.115752 -0.814913\nv -0.000040 20.816111 0.802578\nv -0.000030 12.447212 0.802577\nv -0.000040 20.816111 -0.814912\nv -0.000030 12.447212 -0.814913\nv -0.000039 21.400143 0.802578\nv -0.000039 21.400143 -0.814912\nv -0.000028 11.898186 0.802577\nv -0.000028 11.898186 -0.814913\nv 12.447202 -0.874762 0.802575\nv 20.816090 -0.874752 0.802575\nv 12.447197 0.874796 0.802575\nv 20.816093 0.874807 0.802575\nv 12.447202 -0.874762 -0.814915\nv 20.816090 -0.874752 -0.814915\nv 12.447197 0.874796 -0.814915\nv 20.816093 0.874807 -0.814915\nv 21.220034 -0.705799 0.802575\nv 21.220030 0.705855 0.802575\nv 21.220030 0.705855 -0.814915\nv 21.220034 -0.705799 -0.814915\nv 12.115741 0.647542 0.802575\nv 12.115742 -0.647512 0.802575\nv 12.115741 0.647542 -0.814915\nv 12.115742 -0.647512 -0.814915\nv 20.816093 0.000026 0.802575\nv 12.447197 0.000015 0.802575\nv 20.816093 0.000026 -0.814915\nv 12.447197 0.000015 -0.814915\nv 21.400126 0.000025 0.802575\nv 21.400126 0.000025 -0.814915\nv 11.898172 0.000015 0.802575\nv 11.898172 0.000015 -0.814915\nv -0.874780 -12.447220 0.802573\nv -0.874771 -20.816109 0.802572\nv 0.874778 -12.447214 0.802573\nv 0.874791 -20.816107 0.802572\nv -0.874780 -12.447220 -0.814917\nv -0.874771 -20.816109 -0.814918\nv 0.874778 -12.447214 -0.814916\nv 0.874791 -20.816107 -0.814918\nv -0.705818 -21.220049 0.802572\nv 0.705837 -21.220043 0.802572\nv 0.705837 -21.220043 -0.814918\nv -0.705818 -21.220049 -0.814918\nv 0.647526 -12.115756 0.802573\nv -0.647531 -12.115759 0.802573\nv 0.647526 -12.115756 -0.814916\nv -0.647531 -12.115759 -0.814917\nv 0.000010 -20.816107 0.802572\nv 0.000001 -12.447220 0.802573\nv 0.000010 -20.816107 -0.814918\nv 0.000001 -12.447220 -0.814917\nv 0.000010 -21.400139 0.802572\nv 0.000010 -21.400139 -0.814918\nv -0.000003 -11.898190 0.802573\nv -0.000003 -11.898190 -0.814916\nv -0.000005 7.246627 -2.236062\nv -0.000005 7.246627 2.223586\nv -5.124142 5.124137 -2.236062\nv -5.124142 5.124137 2.223585\nv -7.246631 -0.000000 -2.236062\nv -7.246631 -0.000000 2.223585\nv -5.124143 -5.124139 -2.236062\nv -5.124143 -5.124139 2.223585\nv 3.616022 3.616028 3.876596\nv 3.616023 3.616028 -3.889072\nv -0.000003 -7.246626 -2.236062\nv -0.000004 -7.246626 2.223586\nv 5.113832 0.000001 3.876596\nv 5.113832 0.000001 -3.889071\nv 3.616023 -3.616026 3.876596\nv 3.616024 -3.616026 -3.889072\nv 5.124138 -5.124141 -2.236061\nv 5.124137 -5.124141 2.223586\nv -0.000004 -5.113836 3.876596\nv -0.000004 -5.113836 -3.889072\nv -3.616034 -3.616029 3.876596\nv -3.616033 -3.616029 -3.889072\nv 7.246623 0.000001 -2.236062\nv 7.246622 0.000001 2.223586\nv -5.113841 -0.000000 3.876595\nv -5.113840 -0.000000 -3.889072\nv -3.616032 3.616027 3.876596\nv -3.616032 3.616027 -3.889072\nv 5.124134 5.124140 -2.236061\nv 5.124134 5.124140 2.223586\nv -0.000005 5.113837 3.876596\nv -0.000005 5.113837 -3.889072\nv -0.000003 7.897492 0.839664\nv -0.000003 7.897492 -0.852140\nv -5.584371 5.584365 -0.852141\nv -5.584371 5.584365 0.839663\nv -7.897494 -0.000001 -0.852141\nv -7.897494 -0.000001 0.839663\nv -5.584372 -5.584368 -0.852141\nv -5.584372 -5.584368 0.839664\nv -0.000004 -7.897489 -0.852140\nv -0.000004 -7.897489 0.839664\nv 5.584367 -5.584369 -0.852139\nv 5.584366 -5.584369 0.839665\nv 7.897485 0.000001 -0.852139\nv 7.897485 0.000001 0.839665\nv 5.584363 5.584369 -0.852139\nv 5.584363 5.584369 0.839665\nv 1.215044 1.215049 4.478564\nv 1.215044 1.215049 -4.491037\nv 1.718334 0.000001 4.478562\nv 1.718335 0.000001 -4.491037\nv 1.215044 -1.215048 4.478564\nv 1.215044 -1.215048 -4.491037\nv -0.000005 -1.718339 4.478562\nv -0.000006 -1.718336 -4.491038\nv -1.215053 -1.215048 4.478561\nv -1.215052 -1.215048 -4.491038\nv -1.718344 0.000000 4.478561\nv -1.718343 0.000000 -4.491038\nv -1.215053 1.215049 4.478561\nv -1.215053 1.215049 -4.491038\nv -0.000005 1.718339 4.478562\nv -0.000004 1.718339 -4.491038\nv -0.000005 0.000000 4.670086\nv -0.000004 0.000000 -4.670071\nvt 0.424034 0.155764\nvt 0.507206 0.377556\nvt 0.746463 0.254314\nvt 0.635567 0.158820\nvt 0.635567 0.741023\nvt 0.635567 0.368290\nvt 0.552395 0.161900\nvt 0.524671 0.155740\nvt 0.635567 0.251233\nvt 0.524671 0.737943\nvt 0.524671 0.365210\nvt 0.552395 0.371370\nvt 0.437896 0.751829\nvt 0.548792 0.265119\nvn -0.514300 0.857600 0.000000\nvn -0.857600 0.514300 0.000000\nvn -0.970100 -0.242800 0.000000\nvn -0.242800 -0.970100 0.000000\nvn 0.514300 -0.857600 0.000000\nvn 0.857600 -0.514300 0.000000\nvn 0.970100 0.242800 0.000000\nvn 0.242800 0.970100 0.000000\nvn 0.028300 -0.017000 0.999500\nvn -0.032100 -0.008000 0.999500\nvn -0.026600 0.044400 -0.998700\nvn 0.050200 -0.012600 -0.998700\nvn -0.044400 -0.026600 -0.998700\nvn -0.012600 -0.050200 -0.998700\nvn -0.008000 0.032100 0.999500\nvn 0.032100 0.008000 0.999500\nvn -0.017000 -0.028300 0.999500\nvn 0.026600 -0.044400 -0.998700\nvn 0.044400 0.026600 -0.998700\nvn -0.028300 0.017000 0.999500\nvn 0.012600 0.050200 -0.998700\nvn 0.008000 -0.032100 0.999500\nvn -0.050200 0.012600 -0.998700\nvn 0.017000 0.028300 0.999500\nvn 0.017000 -0.028300 0.999500\nvn 0.012600 -0.050200 -0.998700\nvn 0.242800 -0.970100 0.000000\nvn -0.242800 0.970100 0.000000\nvn 0.044400 -0.026600 -0.998700\nvn 0.032100 -0.008000 0.999500\nvn 0.970100 -0.242800 0.000000\nvn -0.970100 0.242800 0.000000\nvn 0.050200 0.012600 -0.998700\nvn 0.028300 0.017000 0.999500\nvn 0.857600 0.514300 0.000000\nvn -0.857600 -0.514300 0.000000\nvn 0.008000 0.032100 0.999500\nvn 0.026600 0.044400 -0.998700\nvn 0.514300 0.857600 0.000000\nvn -0.514300 -0.857600 0.000000\nvn -0.017000 0.028300 0.999500\nvn -0.012600 0.050200 -0.998700\nvn -0.044400 0.026600 -0.998700\nvn -0.032100 0.008000 0.999500\nvn -0.050200 -0.012600 -0.998700\nvn -0.028300 -0.017000 0.999500\nvn -0.008000 -0.032100 0.999500\nvn -0.026600 -0.044400 -0.998700\nvn 0.000000 0.000000 1.000000\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 0.000000 -1.000000\nvn -0.000000 1.000000 0.000000\nvn 0.565500 -0.824800 0.000000\nvn -0.385900 -0.922600 0.000000\nvn -0.969000 -0.247200 0.000000\nvn -0.385900 0.922600 0.000000\nvn 0.947900 -0.318500 0.000000\nvn 0.565500 0.824800 0.000000\nvn 0.947900 0.318500 0.000000\nvn -0.969000 0.247200 0.000000\nvn 0.707100 -0.707100 0.000000\nvn -0.707100 0.707100 0.000000\nvn 0.983000 -0.183300 0.000000\nvn 0.379500 -0.925200 0.000000\nvn -0.510300 -0.860000 0.000000\nvn -0.925200 0.379500 0.000000\nvn 0.895500 0.445100 0.000000\nvn -0.183400 0.983000 0.000000\nvn 0.445100 0.895500 0.000000\nvn -0.860000 -0.510300 0.000000\nvn -0.707100 -0.707100 0.000000\nvn 0.707100 0.707100 0.000000\nvn -0.183400 -0.983000 -0.000000\nvn -0.925200 -0.379500 0.000000\nvn -0.860000 0.510300 0.000000\nvn 0.379500 0.925200 0.000000\nvn 0.445100 -0.895500 0.000000\nvn 0.983000 0.183400 0.000000\nvn 0.895500 -0.445100 0.000000\nvn -0.510300 0.860000 0.000000\nvn -0.983000 0.183400 0.000000\nvn -0.379500 0.925200 0.000000\nvn 0.510300 0.860000 0.000000\nvn 0.925200 -0.379500 0.000000\nvn -0.895500 -0.445100 0.000000\nvn 0.183400 -0.983000 0.000000\nvn -0.445100 -0.895500 0.000000\nvn 0.860000 0.510300 0.000000\nvn 0.183300 0.983000 0.000000\nvn 0.925200 0.379500 0.000000\nvn 0.860000 -0.510300 0.000000\nvn -0.379500 -0.925200 0.000000\nvn -0.445100 0.895500 0.000000\nvn -0.983000 -0.183400 0.000000\nvn -0.895500 0.445100 0.000000\nvn 0.510300 -0.860000 0.000000\nvn -1.000000 -0.000000 0.000000\nvn 1.000000 0.000000 0.000000\nvn -0.824800 -0.565500 0.000000\nvn -0.922600 0.385900 0.000000\nvn -0.247200 0.969000 0.000000\nvn 0.922600 0.385900 0.000000\nvn -0.318500 -0.947900 0.000000\nvn 0.824800 -0.565500 0.000000\nvn 0.318500 -0.947900 0.000000\nvn 0.247200 0.969000 0.000000\nvn -0.565500 0.824800 0.000000\nvn 0.385900 0.922600 0.000000\nvn 0.969000 0.247200 0.000000\nvn 0.385900 -0.922600 0.000000\nvn -0.947900 0.318500 0.000000\nvn -0.565500 -0.824800 0.000000\nvn -0.947900 -0.318500 0.000000\nvn 0.969000 -0.247200 0.000000\nvn 0.824800 0.565500 0.000000\nvn 0.922600 -0.385900 0.000000\nvn 0.247200 -0.969000 0.000000\nvn -0.922600 -0.385900 0.000000\nvn 0.318500 0.947900 0.000000\nvn -0.824800 0.565500 0.000000\nvn -0.318500 0.947900 0.000000\nvn -0.247200 -0.969000 0.000000\nvn 0.351000 0.847300 -0.398500\nvn 0.351000 0.847300 0.398500\nvn -0.847300 0.351000 0.398500\nvn -0.847300 -0.351000 -0.398500\nvn -0.847300 -0.351000 0.398500\nvn -0.351000 -0.847300 -0.398500\nvn 0.351000 -0.847300 -0.398500\nvn -0.351000 -0.847300 0.398500\nvn 0.847300 -0.351000 -0.398500\nvn 0.351000 -0.847300 0.398500\nvn 0.847300 -0.351000 0.398500\nvn 0.847300 0.351000 -0.398500\nvn 0.847300 0.351000 0.398500\nvn 0.246000 0.593800 -0.766100\nvn 0.593800 -0.245900 -0.766100\nvn -0.246000 0.593800 -0.766100\nvn 0.593800 0.246000 -0.766100\nvn 0.246000 0.593800 0.766100\nvn 0.593800 -0.246000 0.766100\nvn -0.246000 0.593800 0.766100\nvn -0.593800 -0.246000 -0.766100\nvn -0.593800 -0.246000 0.766100\nvn 0.593800 0.246000 0.766100\nvn -0.593800 0.246000 -0.766100\nvn -0.351000 0.847300 0.398500\nvn 0.246000 -0.593800 -0.766100\nvn -0.593800 0.246000 0.766100\nvn -0.246000 -0.593800 -0.766100\nvn 0.246000 -0.593800 0.766100\nvn -0.847300 0.351000 -0.398500\nvn -0.246000 -0.593800 0.766100\nvn -0.382700 0.923900 0.000000\nvn -0.923900 0.382700 -0.000000\nvn -0.923900 -0.382700 0.000000\nvn -0.382700 -0.923900 0.000000\nvn 0.382700 -0.923900 0.000000\nvn 0.923900 -0.382700 0.000000\nvn 0.923900 0.382700 0.000000\nvn 0.382700 0.923900 0.000000\nvn -0.351000 0.847300 -0.398500\nvn -0.174100 0.072100 -0.982100\nvn 0.174100 -0.072100 0.982100\nvn -0.174100 0.072100 0.982100\nvn 0.072100 -0.174100 -0.982100\nvn 0.072100 -0.174100 0.982100\nvn 0.072100 0.174100 -0.982100\nvn -0.072100 -0.174100 -0.982100\nvn 0.072100 0.174100 0.982100\nvn -0.072100 0.174100 -0.982100\nvn -0.072100 -0.174100 0.982100\nvn 0.174100 0.072100 0.982100\nvn -0.072100 0.174100 0.982100\nvn -0.174100 -0.072100 -0.982100\nvn 0.174100 0.072100 -0.982100\nvn -0.174100 -0.072100 0.982100\nvn 0.174100 -0.072100 -0.982100\nvn 0.103500 -0.042900 -0.993700\nvn 0.103500 0.042900 -0.993700\nvn -0.103500 -0.042900 -0.993700\nvn -0.042900 -0.103500 -0.993700\nvn 0.042900 0.103500 -0.993700\nvn -0.042900 0.103500 -0.993700\nvn 0.042900 -0.103500 -0.993700\nvn -0.103500 0.042900 -0.993700\nvn 0.110700 -0.045800 0.992800\nvn -0.110700 0.045800 0.992800\nvn 0.045800 -0.110700 0.992800\nvn -0.045800 0.110700 0.992800\nvn 0.045800 0.110700 0.992800\nvn -0.045800 -0.110700 0.992800\nvn 0.110700 0.045800 0.992800\nvn -0.110700 -0.045800 0.992800\nvn -0.385900 -0.922500 0.000000\nvn 0.593800 -0.246000 -0.766100\nvn 0.593800 -0.245900 0.766100\nvn 0.245900 -0.593800 -0.766100\nvn 0.245900 -0.593800 0.766100\ns off\nf 3/1/1 4/1/1 34/1/1\nf 4/1/2 3/1/2 38/1/2\nf 6/1/3 5/1/3 42/1/3\nf 9/1/4 10/1/4 46/1/4\nf 11/1/5 12/1/5 50/1/5\nf 12/1/6 11/1/6 54/1/6\nf 57/1/7 14/1/7 13/1/7\nf 2/1/8 1/1/8 62/1/8\nf 36/1/5 20/1/5 19/1/5\nf 40/1/6 19/1/6 20/1/6\nf 44/1/7 21/1/7 22/1/7\nf 48/1/8 26/1/8 25/1/8\nf 51/1/1 52/1/1 28/1/1\nf 56/1/2 27/1/2 28/1/2\nf 60/1/3 29/1/3 30/1/3\nf 64/1/4 17/1/4 18/1/4\nf 37/2/9 39/2/9 20/2/9\nf 57/2/10 59/2/10 30/2/10\nf 49/2/11 51/2/11 27/2/11\nf 38/2/12 40/2/12 21/2/12\nf 58/2/13 60/2/13 31/2/13\nf 61/2/14 63/2/14 18/2/14\nf 50/2/15 52/2/15 26/2/15\nf 41/2/16 43/2/16 22/2/16\nf 62/2/17 64/2/17 32/2/17\nf 33/2/18 35/2/18 19/2/18\nf 42/2/19 44/2/19 23/2/19\nf 53/2/20 55/2/20 28/2/20\nf 45/2/21 47/2/21 25/2/21\nf 34/2/22 36/2/22 17/2/22\nf 54/2/23 56/2/23 29/2/23\nf 46/2/24 48/2/24 24/2/24\nf 20/2/25 36/2/25 34/2/25\nf 18/2/26 35/2/26 33/2/26\nf 17/1/27 36/1/27 35/1/27\nf 33/1/28 34/1/28 1/1/28\nf 19/2/29 40/2/29 38/2/29\nf 22/2/30 39/2/30 37/2/30\nf 21/1/31 40/1/31 39/1/31\nf 37/1/32 38/1/32 5/1/32\nf 21/2/33 44/2/33 42/2/33\nf 24/2/34 43/2/34 41/2/34\nf 23/1/35 44/1/35 43/1/35\nf 41/1/36 42/1/36 7/1/36\nf 26/2/37 48/2/37 46/2/37\nf 23/2/38 47/2/38 45/2/38\nf 23/1/39 24/1/39 48/1/39\nf 45/1/40 46/1/40 8/1/40\nf 28/2/41 52/2/41 50/2/41\nf 25/2/42 51/2/42 49/2/42\nf 26/1/28 52/1/28 51/1/28\nf 49/1/27 50/1/27 10/1/27\nf 27/2/43 56/2/43 54/2/43\nf 30/2/44 55/2/44 53/2/44\nf 30/1/32 29/1/32 56/1/32\nf 53/1/31 54/1/31 13/1/31\nf 29/2/45 60/2/45 58/2/45\nf 32/2/46 59/2/46 57/2/46\nf 31/1/36 60/1/36 59/1/36\nf 57/1/35 58/1/35 15/1/35\nf 17/2/47 64/2/47 62/2/47\nf 31/2/48 63/2/48 61/2/48\nf 32/1/40 64/1/40 63/1/40\nf 15/1/39 61/1/39 62/1/39\nf 68/3/49 67/3/49 82/3/49\nf 72/4/50 71/4/50 67/4/50\nf 70/5/51 69/5/51 84/5/51\nf 66/6/52 65/6/52 69/6/52\nf 71/7/53 79/7/53 77/7/53\nf 68/8/54 74/8/54 75/8/54\nf 75/8/55 74/8/55 85/8/55\nf 83/9/51 72/9/51 75/9/51\nf 81/10/49 66/10/49 73/10/49\nf 70/11/56 76/11/56 73/11/56\nf 77/7/57 79/7/57 88/7/57\nf 65/12/58 78/12/58 80/12/58\nf 84/10/51 69/10/51 80/10/51\nf 82/9/49 67/9/49 77/9/49\nf 82/10/49 87/10/49 78/10/49\nf 84/9/51 88/9/51 79/9/51\nf 78/12/59 87/12/59 88/12/59\nf 81/9/49 85/9/49 74/9/49\nf 83/10/51 86/10/51 76/10/51\nf 86/11/60 85/11/60 73/11/60\nf 72/3/51 83/3/51 84/3/51\nf 66/5/49 81/5/49 82/5/49\nf 105/3/49 92/3/49 91/3/49\nf 96/4/61 95/4/61 91/4/61\nf 94/3/51 93/3/51 108/3/51\nf 90/4/62 89/4/62 93/4/62\nf 95/7/63 103/7/63 101/7/63\nf 92/8/64 98/8/64 99/8/64\nf 99/8/65 98/8/65 109/8/65\nf 107/9/51 96/9/51 99/9/51\nf 105/9/49 90/9/49 97/9/49\nf 94/8/66 100/8/66 97/8/66\nf 101/7/67 103/7/67 112/7/67\nf 89/7/68 102/7/68 104/7/68\nf 108/9/51 93/9/51 104/9/51\nf 106/9/49 91/9/49 101/9/49\nf 106/9/49 111/9/49 102/9/49\nf 108/9/51 112/9/51 103/9/51\nf 111/7/69 112/7/69 104/7/69\nf 105/9/49 109/9/49 98/9/49\nf 107/9/51 110/9/51 100/9/51\nf 110/8/70 109/8/70 97/8/70\nf 107/3/51 108/3/51 95/3/51\nf 90/3/49 105/3/49 106/3/49\nf 129/5/49 116/5/49 115/5/49\nf 120/6/71 119/6/71 115/6/71\nf 118/5/51 117/5/51 132/5/51\nf 114/6/72 113/6/72 117/6/72\nf 119/12/73 127/12/73 125/12/73\nf 116/11/74 122/11/74 123/11/74\nf 123/11/75 122/11/75 133/11/75\nf 131/10/51 120/10/51 123/10/51\nf 129/10/49 114/10/49 121/10/49\nf 118/11/76 124/11/76 121/11/76\nf 135/12/77 125/12/77 127/12/77\nf 113/12/78 126/12/78 128/12/78\nf 132/10/51 117/10/51 128/10/51\nf 130/10/49 115/10/49 125/10/49\nf 130/10/49 135/10/49 126/10/49\nf 132/10/51 136/10/51 127/10/51\nf 135/12/79 136/12/79 128/12/79\nf 129/10/49 133/10/49 122/10/49\nf 131/10/51 134/10/51 124/10/51\nf 134/11/80 133/11/80 121/11/80\nf 131/5/51 132/5/51 119/5/51\nf 114/5/49 129/5/49 130/5/49\nf 153/5/49 140/5/49 139/5/49\nf 144/6/62 143/6/62 139/6/62\nf 155/5/51 142/5/51 141/5/51\nf 138/6/61 137/6/61 141/6/61\nf 143/12/81 151/12/81 149/12/81\nf 144/11/82 140/11/82 146/11/82\nf 147/11/83 146/11/83 157/11/83\nf 155/10/51 144/10/51 147/10/51\nf 153/10/49 138/10/49 145/10/49\nf 142/11/84 148/11/84 145/11/84\nf 149/12/85 151/12/85 160/12/85\nf 137/12/86 150/12/86 152/12/86\nf 156/10/51 141/10/51 152/10/51\nf 154/10/49 139/10/49 149/10/49\nf 154/10/49 159/10/49 150/10/49\nf 156/10/51 160/10/51 151/10/51\nf 150/12/87 159/12/87 160/12/87\nf 153/10/49 157/10/49 146/10/49\nf 155/10/51 158/10/51 148/10/51\nf 158/11/88 157/11/88 145/11/88\nf 155/5/51 156/5/51 143/5/51\nf 138/5/49 153/5/49 154/5/49\nf 177/3/49 164/3/49 163/3/49\nf 168/4/72 167/4/72 163/4/72\nf 166/3/51 165/3/51 180/3/51\nf 162/4/71 161/4/71 165/4/71\nf 163/7/89 167/7/89 175/7/89\nf 168/8/90 164/8/90 170/8/90\nf 171/8/91 170/8/91 181/8/91\nf 179/9/51 168/9/51 171/9/51\nf 177/9/49 162/9/49 169/9/49\nf 166/8/92 172/8/92 169/8/92\nf 173/7/93 175/7/93 184/7/93\nf 161/7/94 174/7/94 176/7/94\nf 180/9/51 165/9/51 176/9/51\nf 178/9/49 163/9/49 173/9/49\nf 178/9/49 183/9/49 174/9/49\nf 180/9/51 184/9/51 175/9/51\nf 183/7/95 184/7/95 176/7/95\nf 177/9/49 181/9/49 170/9/49\nf 179/9/51 182/9/51 172/9/51\nf 182/8/96 181/8/96 169/8/96\nf 179/3/51 180/3/51 167/3/51\nf 162/3/49 177/3/49 178/3/49\nf 201/5/49 188/5/49 187/5/49\nf 192/6/97 191/6/97 187/6/97\nf 190/5/51 189/5/51 204/5/51\nf 190/6/98 186/6/98 185/6/98\nf 191/12/99 199/12/99 197/12/99\nf 188/11/100 194/11/100 195/11/100\nf 195/11/101 194/11/101 205/11/101\nf 203/10/51 192/10/51 195/10/51\nf 201/10/49 186/10/49 193/10/49\nf 190/11/102 196/11/102 193/11/102\nf 197/12/103 199/12/103 208/12/103\nf 185/12/104 198/12/104 200/12/104\nf 204/10/51 189/10/51 200/10/51\nf 202/10/49 187/10/49 197/10/49\nf 202/10/49 207/10/49 198/10/49\nf 204/10/51 208/10/51 199/10/51\nf 207/12/105 208/12/105 200/12/105\nf 201/10/49 205/10/49 194/10/49\nf 203/10/51 206/10/51 196/10/51\nf 206/11/106 205/11/106 193/11/106\nf 203/5/51 204/5/51 191/5/51\nf 186/5/49 201/5/49 202/5/49\nf 212/5/49 211/5/49 226/5/49\nf 216/6/52 215/6/52 211/6/52\nf 214/3/51 213/3/51 228/3/51\nf 210/4/50 209/4/50 213/4/50\nf 215/12/107 223/12/107 221/12/107\nf 216/11/108 212/11/108 218/11/108\nf 219/11/109 218/11/109 229/11/109\nf 227/10/51 216/10/51 219/10/51\nf 225/9/49 210/9/49 217/9/49\nf 214/8/110 220/8/110 217/8/110\nf 221/12/111 223/12/111 232/12/111\nf 209/7/112 222/7/112 224/7/112\nf 228/9/51 213/9/51 224/9/51\nf 226/10/49 211/10/49 221/10/49\nf 226/9/49 231/9/49 222/9/49\nf 228/10/51 232/10/51 223/10/51\nf 222/7/113 231/7/113 232/7/113\nf 225/10/49 229/10/49 218/10/49\nf 227/9/51 230/9/51 220/9/51\nf 230/8/114 229/8/114 217/8/114\nf 227/5/51 228/5/51 215/5/51\nf 210/3/49 225/3/49 226/3/49\nf 236/3/49 235/3/49 250/3/49\nf 240/4/98 239/4/98 235/4/98\nf 238/3/51 237/3/51 252/3/51\nf 234/4/97 233/4/97 237/4/97\nf 239/7/115 247/7/115 245/7/115\nf 236/8/116 242/8/116 243/8/116\nf 254/8/117 243/8/117 242/8/117\nf 251/9/51 240/9/51 243/9/51\nf 249/9/49 234/9/49 241/9/49\nf 238/8/118 244/8/118 241/8/118\nf 245/7/119 247/7/119 256/7/119\nf 233/7/120 246/7/120 248/7/120\nf 252/9/51 237/9/51 248/9/51\nf 250/9/49 235/9/49 245/9/49\nf 250/9/49 255/9/49 246/9/49\nf 252/9/51 256/9/51 247/9/51\nf 246/7/121 255/7/121 256/7/121\nf 249/9/49 253/9/49 242/9/49\nf 251/9/51 254/9/51 244/9/51\nf 254/8/122 253/8/122 241/8/122\nf 240/3/51 251/3/51 252/3/51\nf 234/3/49 249/3/49 250/3/49\nf 285/13/123 257/13/123 290/13/123\nf 286/13/124 304/13/124 289/13/124\nf 292/13/125 294/13/125 262/13/125\nf 261/14/126 263/14/126 295/14/126\nf 294/14/127 296/14/127 264/14/127\nf 263/14/128 267/14/128 297/14/128\nf 297/14/129 267/14/129 273/14/129\nf 296/14/130 298/14/130 268/14/130\nf 273/14/131 279/14/131 301/14/131\nf 298/14/132 300/14/132 274/14/132\nf 300/14/133 302/14/133 280/14/133\nf 279/13/134 285/13/134 303/13/134\nf 302/13/135 304/13/135 286/13/135\nf 257/13/136 285/13/136 266/13/136\nf 279/14/137 273/14/137 272/14/137\nf 259/13/138 257/13/138 288/13/138\nf 285/13/139 279/13/139 270/13/139\nf 286/13/140 258/13/140 287/13/140\nf 280/14/141 269/14/141 271/14/141\nf 260/13/142 283/13/142 287/13/142\nf 261/14/143 282/14/143 278/14/143\nf 262/14/144 264/14/144 277/14/144\nf 280/13/145 286/13/145 265/13/145\nf 259/13/146 284/13/146 282/13/146\nf 258/13/147 289/13/147 292/13/147\nf 267/14/148 276/14/148 272/14/148\nf 260/13/149 262/13/149 281/13/149\nf 267/14/150 263/14/150 278/14/150\nf 274/14/151 271/14/151 275/14/151\nf 259/13/152 261/13/152 293/13/152\nf 268/14/153 275/14/153 277/14/153\nf 291/13/154 292/13/154 289/13/154\nf 292/13/155 291/13/155 293/13/155\nf 294/14/156 293/14/156 295/14/156\nf 297/14/157 298/14/157 296/14/157\nf 299/14/158 300/14/158 298/14/158\nf 300/14/159 299/14/159 301/14/159\nf 302/13/160 301/13/160 303/13/160\nf 303/13/161 290/13/161 289/13/161\nf 257/13/162 259/13/162 291/13/162\nf 284/13/163 318/13/163 316/13/163\nf 271/14/164 269/14/164 307/14/164\nf 283/13/165 281/13/165 315/13/165\nf 276/14/166 312/14/166 310/14/166\nf 271/14/167 309/14/167 311/14/167\nf 266/13/168 306/13/168 320/13/168\nf 278/14/169 314/14/169 312/14/169\nf 265/13/170 287/13/170 319/13/170\nf 284/13/171 288/13/171 320/13/171\nf 277/14/172 275/14/172 311/14/172\nf 265/13/173 305/13/173 307/13/173\nf 283/13/174 317/13/174 319/13/174\nf 282/14/175 316/14/175 314/14/175\nf 266/13/176 270/13/176 308/13/176\nf 277/14/177 313/14/177 315/14/177\nf 272/14/178 310/14/178 308/14/178\nf 308/14/179 310/14/179 322/14/179\nf 306/13/180 308/13/180 322/13/180\nf 314/14/181 316/14/181 322/14/181\nf 312/14/182 314/14/182 322/14/182\nf 320/13/183 306/13/183 322/13/183\nf 318/13/184 320/13/184 322/13/184\nf 310/14/185 312/14/185 322/14/185\nf 316/13/186 318/13/186 322/13/186\nf 309/14/187 307/14/187 321/14/187\nf 317/13/188 315/13/188 321/13/188\nf 311/14/189 309/14/189 321/14/189\nf 319/13/190 317/13/190 321/13/190\nf 305/13/191 319/13/191 321/13/191\nf 313/14/192 311/14/192 321/14/192\nf 307/13/193 305/13/193 321/13/193\nf 315/14/194 313/14/194 321/14/194\nf 33/1/1 3/1/1 34/1/1\nf 37/1/2 4/1/2 38/1/2\nf 41/1/3 6/1/3 42/1/3\nf 45/1/4 9/1/4 46/1/4\nf 49/1/5 11/1/5 50/1/5\nf 53/1/6 12/1/6 54/1/6\nf 58/1/7 57/1/7 13/1/7\nf 61/1/8 2/1/8 62/1/8\nf 35/1/5 36/1/5 19/1/5\nf 39/1/6 40/1/6 20/1/6\nf 43/1/7 44/1/7 22/1/7\nf 47/1/8 48/1/8 25/1/8\nf 27/1/1 51/1/1 28/1/1\nf 55/1/2 56/1/2 28/1/2\nf 59/1/3 60/1/3 30/1/3\nf 63/1/4 64/1/4 18/1/4\nf 4/2/9 37/2/9 20/2/9\nf 14/2/10 57/2/10 30/2/10\nf 11/2/11 49/2/11 27/2/11\nf 5/2/12 38/2/12 21/2/12\nf 15/2/13 58/2/13 31/2/13\nf 2/2/14 61/2/14 18/2/14\nf 10/2/15 50/2/15 26/2/15\nf 6/2/16 41/2/16 22/2/16\nf 16/2/17 62/2/17 32/2/17\nf 3/2/18 33/2/18 19/2/18\nf 7/2/19 42/2/19 23/2/19\nf 12/2/20 53/2/20 28/2/20\nf 9/2/21 45/2/21 25/2/21\nf 1/2/22 34/2/22 17/2/22\nf 13/2/23 54/2/23 29/2/23\nf 8/2/24 46/2/24 24/2/24\nf 4/2/25 20/2/25 34/2/25\nf 2/2/26 18/2/26 33/2/26\nf 18/1/27 17/1/27 35/1/27\nf 2/1/28 33/1/28 1/1/28\nf 3/2/29 19/2/29 38/2/29\nf 6/2/30 22/2/30 37/2/30\nf 22/1/31 21/1/31 39/1/31\nf 6/1/32 37/1/32 5/1/32\nf 5/2/33 21/2/33 42/2/33\nf 8/2/34 24/2/34 41/2/34\nf 24/1/35 23/1/35 43/1/35\nf 8/1/36 41/1/36 7/1/36\nf 10/2/37 26/2/37 46/2/37\nf 7/2/38 23/2/38 45/2/38\nf 47/1/39 23/1/39 48/1/39\nf 7/1/40 45/1/40 8/1/40\nf 12/2/41 28/2/41 50/2/41\nf 9/2/42 25/2/42 49/2/42\nf 25/1/28 26/1/28 51/1/28\nf 9/1/27 49/1/27 10/1/27\nf 11/2/43 27/2/43 54/2/43\nf 14/2/44 30/2/44 53/2/44\nf 55/1/32 30/1/32 56/1/32\nf 14/1/31 53/1/31 13/1/31\nf 13/2/45 29/2/45 58/2/45\nf 16/2/46 32/2/46 57/2/46\nf 32/1/36 31/1/36 59/1/36\nf 16/1/35 57/1/35 15/1/35\nf 1/2/47 17/2/47 62/2/47\nf 15/2/48 31/2/48 61/2/48\nf 31/1/40 32/1/40 63/1/40\nf 16/1/39 15/1/39 62/1/39\nf 81/3/49 68/3/49 82/3/49\nf 68/4/50 72/4/50 67/4/50\nf 83/5/51 70/5/51 84/5/51\nf 70/6/52 66/6/52 69/6/52\nf 67/7/53 71/7/53 77/7/53\nf 72/8/195 68/8/195 75/8/195\nf 86/8/55 75/8/55 85/8/55\nf 86/9/51 83/9/51 75/9/51\nf 85/10/49 81/10/49 73/10/49\nf 66/11/56 70/11/56 73/11/56\nf 87/7/57 77/7/57 88/7/57\nf 69/12/58 65/12/58 80/12/58\nf 88/10/51 84/10/51 80/10/51\nf 87/9/49 82/9/49 77/9/49\nf 65/10/49 82/10/49 78/10/49\nf 71/9/51 84/9/51 79/9/51\nf 80/12/59 78/12/59 88/12/59\nf 68/9/49 81/9/49 74/9/49\nf 70/10/51 83/10/51 76/10/51\nf 76/11/60 86/11/60 73/11/60\nf 71/3/51 72/3/51 84/3/51\nf 65/5/49 66/5/49 82/5/49\nf 106/3/49 105/3/49 91/3/49\nf 92/4/61 96/4/61 91/4/61\nf 107/3/51 94/3/51 108/3/51\nf 94/4/62 90/4/62 93/4/62\nf 91/7/63 95/7/63 101/7/63\nf 96/8/64 92/8/64 99/8/64\nf 110/8/65 99/8/65 109/8/65\nf 110/9/51 107/9/51 99/9/51\nf 109/9/49 105/9/49 97/9/49\nf 90/8/66 94/8/66 97/8/66\nf 111/7/67 101/7/67 112/7/67\nf 93/7/68 89/7/68 104/7/68\nf 112/9/51 108/9/51 104/9/51\nf 111/9/49 106/9/49 101/9/49\nf 89/9/49 106/9/49 102/9/49\nf 95/9/51 108/9/51 103/9/51\nf 102/7/69 111/7/69 104/7/69\nf 92/9/49 105/9/49 98/9/49\nf 94/9/51 107/9/51 100/9/51\nf 100/8/70 110/8/70 97/8/70\nf 96/3/51 107/3/51 95/3/51\nf 89/3/49 90/3/49 106/3/49\nf 130/5/49 129/5/49 115/5/49\nf 116/6/71 120/6/71 115/6/71\nf 131/5/51 118/5/51 132/5/51\nf 118/6/72 114/6/72 117/6/72\nf 115/12/73 119/12/73 125/12/73\nf 120/11/74 116/11/74 123/11/74\nf 134/11/75 123/11/75 133/11/75\nf 134/10/51 131/10/51 123/10/51\nf 133/10/49 129/10/49 121/10/49\nf 114/11/76 118/11/76 121/11/76\nf 136/12/77 135/12/77 127/12/77\nf 117/12/78 113/12/78 128/12/78\nf 136/10/51 132/10/51 128/10/51\nf 135/10/49 130/10/49 125/10/49\nf 113/10/49 130/10/49 126/10/49\nf 119/10/51 132/10/51 127/10/51\nf 126/12/79 135/12/79 128/12/79\nf 116/10/49 129/10/49 122/10/49\nf 118/10/51 131/10/51 124/10/51\nf 124/11/80 134/11/80 121/11/80\nf 120/5/51 131/5/51 119/5/51\nf 113/5/49 114/5/49 130/5/49\nf 154/5/49 153/5/49 139/5/49\nf 140/6/62 144/6/62 139/6/62\nf 156/5/51 155/5/51 141/5/51\nf 142/6/61 138/6/61 141/6/61\nf 139/12/81 143/12/81 149/12/81\nf 147/11/82 144/11/82 146/11/82\nf 158/11/83 147/11/83 157/11/83\nf 158/10/51 155/10/51 147/10/51\nf 157/10/49 153/10/49 145/10/49\nf 138/11/84 142/11/84 145/11/84\nf 159/12/85 149/12/85 160/12/85\nf 141/12/86 137/12/86 152/12/86\nf 160/10/51 156/10/51 152/10/51\nf 159/10/49 154/10/49 149/10/49\nf 137/10/49 154/10/49 150/10/49\nf 143/10/51 156/10/51 151/10/51\nf 152/12/87 150/12/87 160/12/87\nf 140/10/49 153/10/49 146/10/49\nf 142/10/51 155/10/51 148/10/51\nf 148/11/88 158/11/88 145/11/88\nf 144/5/51 155/5/51 143/5/51\nf 137/5/49 138/5/49 154/5/49\nf 178/3/49 177/3/49 163/3/49\nf 164/4/72 168/4/72 163/4/72\nf 179/3/51 166/3/51 180/3/51\nf 166/4/71 162/4/71 165/4/71\nf 173/7/89 163/7/89 175/7/89\nf 171/8/90 168/8/90 170/8/90\nf 182/8/91 171/8/91 181/8/91\nf 182/9/51 179/9/51 171/9/51\nf 181/9/49 177/9/49 169/9/49\nf 162/8/92 166/8/92 169/8/92\nf 183/7/93 173/7/93 184/7/93\nf 165/7/94 161/7/94 176/7/94\nf 184/9/51 180/9/51 176/9/51\nf 183/9/49 178/9/49 173/9/49\nf 161/9/49 178/9/49 174/9/49\nf 167/9/51 180/9/51 175/9/51\nf 174/7/95 183/7/95 176/7/95\nf 164/9/49 177/9/49 170/9/49\nf 166/9/51 179/9/51 172/9/51\nf 172/8/96 182/8/96 169/8/96\nf 168/3/51 179/3/51 167/3/51\nf 161/3/49 162/3/49 178/3/49\nf 202/5/49 201/5/49 187/5/49\nf 188/6/97 192/6/97 187/6/97\nf 203/5/51 190/5/51 204/5/51\nf 189/6/98 190/6/98 185/6/98\nf 187/12/99 191/12/99 197/12/99\nf 192/11/100 188/11/100 195/11/100\nf 206/11/101 195/11/101 205/11/101\nf 206/10/51 203/10/51 195/10/51\nf 205/10/49 201/10/49 193/10/49\nf 186/11/102 190/11/102 193/11/102\nf 207/12/103 197/12/103 208/12/103\nf 189/12/104 185/12/104 200/12/104\nf 208/10/51 204/10/51 200/10/51\nf 207/10/49 202/10/49 197/10/49\nf 185/10/49 202/10/49 198/10/49\nf 191/10/51 204/10/51 199/10/51\nf 198/12/105 207/12/105 200/12/105\nf 188/10/49 201/10/49 194/10/49\nf 190/10/51 203/10/51 196/10/51\nf 196/11/106 206/11/106 193/11/106\nf 192/5/51 203/5/51 191/5/51\nf 185/5/49 186/5/49 202/5/49\nf 225/5/49 212/5/49 226/5/49\nf 212/6/52 216/6/52 211/6/52\nf 227/3/51 214/3/51 228/3/51\nf 214/4/50 210/4/50 213/4/50\nf 211/12/107 215/12/107 221/12/107\nf 219/11/108 216/11/108 218/11/108\nf 230/11/109 219/11/109 229/11/109\nf 230/10/51 227/10/51 219/10/51\nf 229/9/49 225/9/49 217/9/49\nf 210/8/110 214/8/110 217/8/110\nf 231/12/111 221/12/111 232/12/111\nf 213/7/112 209/7/112 224/7/112\nf 232/9/51 228/9/51 224/9/51\nf 231/10/49 226/10/49 221/10/49\nf 209/9/49 226/9/49 222/9/49\nf 215/10/51 228/10/51 223/10/51\nf 224/7/113 222/7/113 232/7/113\nf 212/10/49 225/10/49 218/10/49\nf 214/9/51 227/9/51 220/9/51\nf 220/8/114 230/8/114 217/8/114\nf 216/5/51 227/5/51 215/5/51\nf 209/3/49 210/3/49 226/3/49\nf 249/3/49 236/3/49 250/3/49\nf 236/4/98 240/4/98 235/4/98\nf 251/3/51 238/3/51 252/3/51\nf 238/4/97 234/4/97 237/4/97\nf 235/7/115 239/7/115 245/7/115\nf 240/8/116 236/8/116 243/8/116\nf 253/8/117 254/8/117 242/8/117\nf 254/9/51 251/9/51 243/9/51\nf 253/9/49 249/9/49 241/9/49\nf 234/8/118 238/8/118 241/8/118\nf 255/7/119 245/7/119 256/7/119\nf 237/7/120 233/7/120 248/7/120\nf 256/9/51 252/9/51 248/9/51\nf 255/9/49 250/9/49 245/9/49\nf 233/9/49 250/9/49 246/9/49\nf 239/9/51 252/9/51 247/9/51\nf 248/7/121 246/7/121 256/7/121\nf 236/9/49 249/9/49 242/9/49\nf 238/9/51 251/9/51 244/9/51\nf 244/8/122 254/8/122 241/8/122\nf 239/3/51 240/3/51 252/3/51\nf 233/3/49 234/3/49 250/3/49\nf 303/13/123 285/13/123 290/13/123\nf 258/13/124 286/13/124 289/13/124\nf 260/13/125 292/13/125 262/13/125\nf 293/14/126 261/14/126 295/14/126\nf 262/14/127 294/14/127 264/14/127\nf 295/14/128 263/14/128 297/14/128\nf 299/14/129 297/14/129 273/14/129\nf 264/14/130 296/14/130 268/14/130\nf 299/14/131 273/14/131 301/14/131\nf 268/14/132 298/14/132 274/14/132\nf 274/14/133 300/14/133 280/14/133\nf 301/13/134 279/13/134 303/13/134\nf 280/13/135 302/13/135 286/13/135\nf 288/13/136 257/13/136 266/13/136\nf 270/14/196 279/14/196 272/14/196\nf 284/13/138 259/13/138 288/13/138\nf 266/13/139 285/13/139 270/13/139\nf 265/13/140 286/13/140 287/13/140\nf 274/14/197 280/14/197 271/14/197\nf 258/13/142 260/13/142 287/13/142\nf 263/14/143 261/14/143 278/14/143\nf 281/14/144 262/14/144 277/14/144\nf 269/13/145 280/13/145 265/13/145\nf 261/13/146 259/13/146 282/13/146\nf 260/13/147 258/13/147 292/13/147\nf 273/14/198 267/14/198 272/14/198\nf 283/13/149 260/13/149 281/13/149\nf 276/14/150 267/14/150 278/14/150\nf 268/14/199 274/14/199 275/14/199\nf 291/13/152 259/13/152 293/13/152\nf 264/14/153 268/14/153 277/14/153\nf 290/13/154 291/13/154 289/13/154\nf 294/13/155 292/13/155 293/13/155\nf 296/14/156 294/14/156 295/14/156\nf 295/14/157 297/14/157 296/14/157\nf 297/14/158 299/14/158 298/14/158\nf 302/14/159 300/14/159 301/14/159\nf 304/13/160 302/13/160 303/13/160\nf 304/13/161 303/13/161 289/13/161\nf 290/13/162 257/13/162 291/13/162\nf 282/13/163 284/13/163 316/13/163\nf 309/14/164 271/14/164 307/14/164\nf 317/13/165 283/13/165 315/13/165\nf 272/14/166 276/14/166 310/14/166\nf 275/14/167 271/14/167 311/14/167\nf 288/13/168 266/13/168 320/13/168\nf 276/14/169 278/14/169 312/14/169\nf 305/13/170 265/13/170 319/13/170\nf 318/13/171 284/13/171 320/13/171\nf 313/14/172 277/14/172 311/14/172\nf 269/13/173 265/13/173 307/13/173\nf 287/13/174 283/13/174 319/13/174\nf 278/14/175 282/14/175 314/14/175\nf 306/13/176 266/13/176 308/13/176\nf 281/14/177 277/14/177 315/14/177\nf 270/14/178 272/14/178 308/14/178\n"
  },
  {
    "path": "browser/data/editor-icons/point-light/point.obj",
    "content": "# Blender v2.76 (sub 0) OBJ File: 'Work.blend'\n# www.blender.org\no Cube.026_Cube.007\nv 0.000010 4.485942 -1.384212\nv 0.000010 4.485942 1.376489\nv -3.172039 3.172037 -1.384212\nv -3.172039 3.172037 1.376489\nv -4.485944 -0.000012 -1.384212\nv -4.485944 -0.000012 1.376489\nv -3.172039 -3.172060 -1.384212\nv -3.172039 -3.172060 1.376489\nv 2.238476 2.238455 2.399769\nv 2.238476 2.238455 -2.407492\nv 0.000010 -4.485965 -1.384212\nv 0.000010 -4.485965 1.376489\nv 3.165680 -0.000011 2.399769\nv 3.165680 -0.000011 -2.407492\nv 2.238476 -2.238478 2.399769\nv 2.238476 -2.238478 -2.407492\nv 3.172058 -3.172060 -1.384212\nv 3.172058 -3.172060 1.376489\nv 0.000008 -3.165681 2.399769\nv 0.000008 -3.165681 -2.407492\nv -2.238458 -2.238479 2.399769\nv -2.238458 -2.238479 -2.407492\nv 4.485963 -0.000012 -1.384212\nv 4.485963 -0.000012 1.376489\nv -3.165661 -0.000012 2.399769\nv -3.165661 -0.000012 -2.407492\nv -2.238459 2.238456 2.399769\nv -2.238458 2.238456 -2.407492\nv 3.172058 3.172037 -1.384212\nv 3.172058 3.172037 1.376489\nv 0.000009 3.165659 2.399769\nv 0.000010 3.165659 -2.407492\nv 0.000011 4.888854 0.519786\nv 0.000011 4.888854 -0.527509\nv -3.456939 3.456937 -0.527509\nv -3.456939 3.456937 0.519786\nv -4.888855 -0.000012 -0.527509\nv -4.888855 -0.000012 0.519785\nv -3.456939 -3.456960 -0.527509\nv -3.456939 -3.456960 0.519786\nv 0.000010 -4.888876 -0.527509\nv 0.000010 -4.888876 0.519786\nv 3.456959 -3.456960 -0.527508\nv 3.456959 -3.456960 0.519786\nv 4.888874 -0.000011 -0.527508\nv 4.888874 -0.000011 0.519787\nv 3.456958 3.456938 -0.527508\nv 3.456958 3.456938 0.519786\nv 0.000008 5.269199 0.435846\nv 0.000008 5.269199 -0.414646\nv -3.725886 3.725884 -0.414646\nv -3.725886 3.725884 0.435846\nv -5.269202 -0.000012 -0.414646\nv -5.269202 -0.000012 0.435846\nv -3.725886 -3.725907 -0.414646\nv -3.725886 -3.725907 0.435846\nv 0.000009 -5.269222 -0.414646\nv 0.000009 -5.269222 0.435846\nv 3.725904 -3.725905 -0.414646\nv 3.725904 -3.725905 0.435846\nv 5.269218 -0.000011 -0.414646\nv 5.269218 -0.000011 0.435846\nv 3.725903 3.725883 -0.414646\nv 3.725903 3.725883 0.435846\nv 0.000010 4.232677 0.402606\nv 0.000010 4.232677 -0.362524\nv -2.992952 2.992950 -0.362524\nv -2.992952 2.992950 0.402606\nv -4.232678 -0.000010 -0.362524\nv -4.232678 -0.000010 0.402606\nv -2.992952 -2.992973 -0.362524\nv -2.992952 -2.992973 0.402606\nv 0.000008 -4.232699 -0.362524\nv 0.000008 -4.232699 0.402606\nv 2.992970 -2.992972 -0.362524\nv 2.992970 -2.992972 0.402606\nv 4.232698 -0.000012 -0.362524\nv 4.232696 -0.000011 0.402606\nv 2.992970 2.992949 -0.362524\nv 2.992970 2.992949 0.402606\nv -7.705326 0.541505 0.496826\nv -12.886008 0.541502 0.496826\nv -7.705325 -0.541543 0.496826\nv -12.886009 -0.541548 0.496826\nv -7.705326 0.541505 -0.504465\nv -12.886008 0.541502 -0.504465\nv -7.705325 -0.541543 -0.504465\nv -12.886009 -0.541548 -0.504465\nv -13.136065 0.436912 0.496826\nv -13.136061 -0.436960 0.496826\nv -13.136061 -0.436960 -0.504465\nv -13.136065 0.436912 -0.504465\nv -7.500140 -0.400864 0.496826\nv -7.500138 0.400828 0.496826\nv -7.500140 -0.400864 -0.504465\nv -7.500138 0.400828 -0.504465\nv -12.886008 -0.000023 0.496826\nv -7.705326 -0.000020 0.496826\nv -12.886008 -0.000023 -0.504465\nv -7.705326 -0.000020 -0.504465\nv -13.247547 -0.000023 0.496826\nv -13.247547 -0.000023 -0.504465\nv -7.365457 -0.000019 0.496826\nv -7.365457 -0.000019 -0.504465\nv -5.831393 -5.065597 0.496826\nv -9.494683 -8.728898 0.496826\nv -5.065563 -5.831427 0.496826\nv -8.728854 -9.494727 0.496826\nv -5.831395 -5.065598 -0.504465\nv -9.494683 -8.728898 -0.504465\nv -5.065563 -5.831427 -0.504465\nv -8.728854 -9.494727 -0.504465\nv -9.597546 -8.979668 0.496826\nv -8.979623 -9.597586 0.496826\nv -8.979623 -9.597586 -0.504465\nv -9.597546 -8.979668 -0.504465\nv -5.019949 -5.586864 0.496826\nv -5.586831 -5.019982 0.496826\nv -5.019949 -5.586864 -0.504465\nv -5.586831 -5.019982 -0.504465\nv -9.111770 -9.111812 0.496826\nv -5.448478 -5.448513 0.496826\nv -9.111770 -9.111812 -0.504465\nv -5.448478 -5.448513 -0.504465\nv -9.367415 -9.367458 0.496826\nv -9.367415 -9.367458 -0.504465\nv -5.208155 -5.208187 0.496826\nv -5.208155 -5.208187 -0.504465\nv -5.065578 5.831390 0.496826\nv -8.728879 9.494680 0.496826\nv -5.831407 5.065560 0.496826\nv -9.494709 8.728850 0.496826\nv -5.065578 5.831390 -0.504465\nv -8.728879 9.494680 -0.504465\nv -5.831407 5.065560 -0.504465\nv -9.494709 8.728850 -0.504465\nv -8.979650 9.597541 0.496826\nv -9.597569 8.979619 0.496826\nv -9.597568 8.979619 -0.504465\nv -8.979650 9.597541 -0.504465\nv -5.586844 5.019946 0.496826\nv -5.019961 5.586829 0.496826\nv -5.586843 5.019946 -0.504465\nv -5.019961 5.586829 -0.504465\nv -9.111794 9.111765 0.496826\nv -5.448492 5.448476 0.496826\nv -9.111794 9.111765 -0.504465\nv -5.448492 5.448476 -0.504465\nv -9.367440 9.367413 0.496826\nv -9.367440 9.367413 -0.504465\nv -5.208168 5.208152 0.496826\nv -5.208168 5.208152 -0.504465\nv -1.977547 4.774233 -0.414646\nv -1.977547 4.774233 0.435846\nv -1.588536 3.835077 -0.362524\nv -1.588536 3.835077 0.402606\nv -4.774234 1.977545 0.435846\nv -4.774234 1.977545 -0.414646\nv -3.835077 1.588534 0.402606\nv -3.835077 1.588534 -0.362524\nv -4.774234 -1.977569 0.435846\nv -4.774234 -1.977569 -0.414646\nv -3.835078 -1.588556 0.402606\nv -3.835078 -1.588556 -0.362524\nv -1.977548 -4.774255 -0.414646\nv -1.977548 -4.774255 0.435846\nv -1.588536 -3.835098 -0.362524\nv -1.588536 -3.835098 0.402606\nv 1.977567 -4.774255 -0.414646\nv 1.977567 -4.774255 0.435846\nv 1.588557 -3.835099 -0.362524\nv 1.588557 -3.835099 0.402606\nv 4.774254 -1.977567 0.435846\nv 4.774254 -1.977567 -0.414646\nv 3.835098 -1.588557 0.402606\nv 3.835098 -1.588557 -0.362524\nv 4.774253 1.977546 0.435846\nv 4.774253 1.977546 -0.414646\nv 3.835094 1.588533 0.402606\nv 3.835098 1.588534 -0.362524\nv 1.977567 4.774232 -0.414646\nv 1.977567 4.774232 0.435846\nv 1.588555 3.835077 -0.362524\nv 1.588552 3.835074 0.402606\nv 0.752173 0.752152 2.772411\nv 0.752174 0.752152 -2.780132\nv 1.063730 -0.000011 2.772410\nv 1.063731 -0.000011 -2.780133\nv 0.752173 -0.752175 2.772411\nv 0.752174 -0.752175 -2.780132\nv 0.000009 -1.063733 2.772410\nv 0.000008 -1.063731 -2.780133\nv -0.752155 -0.752176 2.772410\nv -0.752154 -0.752176 -2.780133\nv -1.063712 -0.000012 2.772410\nv -1.063711 -0.000012 -2.780133\nv -0.752155 0.752152 2.772410\nv -0.752154 0.752152 -2.780133\nv 0.000009 1.063710 2.772410\nv 0.000010 1.063710 -2.780133\nv 0.000009 -0.000012 2.890972\nv 0.000010 -0.000012 -2.890962\nv 5.831401 5.065569 0.496826\nv 9.494692 8.728871 0.496826\nv 5.065573 5.831397 0.496826\nv 8.728863 9.494700 0.496826\nv 5.831404 5.065572 -0.504465\nv 9.494692 8.728871 -0.504465\nv 5.065573 5.831397 -0.504465\nv 8.728863 9.494700 -0.504465\nv 9.597554 8.979643 0.496826\nv 8.979631 9.597560 0.496826\nv 8.979631 9.597560 -0.504465\nv 9.597554 8.979643 -0.504465\nv 5.019958 5.586835 0.496826\nv 5.586841 5.019952 0.496826\nv 5.019958 5.586835 -0.504465\nv 5.586841 5.019952 -0.504465\nv 9.111778 9.111785 0.496826\nv 5.448487 5.448483 0.496826\nv 9.111776 9.111787 -0.504465\nv 5.448487 5.448483 -0.504465\nv 9.367427 9.367433 0.496826\nv 9.367427 9.367433 -0.504465\nv 5.208168 5.208160 0.496826\nv 5.208168 5.208160 -0.504465\nv 5.065583 -5.831410 0.496825\nv 8.728887 -9.494699 0.496824\nv 5.831413 -5.065580 0.496825\nv 9.494717 -8.728869 0.496824\nv 5.065586 -5.831413 -0.504466\nv 8.728887 -9.494699 -0.504467\nv 5.831413 -5.065580 -0.504466\nv 9.494717 -8.728869 -0.504467\nv 8.979654 -9.597560 0.496824\nv 9.597574 -8.979640 0.496824\nv 9.597574 -8.979640 -0.504467\nv 8.979654 -9.597560 -0.504467\nv 5.586849 -5.019967 0.496825\nv 5.019967 -5.586849 0.496825\nv 5.586849 -5.019967 -0.504466\nv 5.019967 -5.586849 -0.504466\nv 9.111801 -9.111785 0.496824\nv 5.448497 -5.448496 0.496825\nv 9.111801 -9.111785 -0.504467\nv 5.448497 -5.448496 -0.504466\nv 9.367447 -9.367431 0.496824\nv 9.367447 -9.367431 -0.504467\nv 5.208176 -5.208175 0.496825\nv 5.208176 -5.208175 -0.504466\nv 0.541518 7.705317 0.496827\nv 0.541513 12.886000 0.496828\nv -0.541528 7.705317 0.496827\nv -0.541535 12.885998 0.496828\nv 0.541518 7.705317 -0.504464\nv 0.541513 12.886000 -0.504463\nv -0.541528 7.705317 -0.504464\nv -0.541535 12.885998 -0.504463\nv 0.436924 13.136053 0.496828\nv -0.436948 13.136051 0.496828\nv -0.436948 13.136051 -0.504463\nv 0.436924 13.136053 -0.504463\nv -0.400851 7.500130 0.496827\nv 0.400841 7.500129 0.496827\nv -0.400851 7.500130 -0.504464\nv 0.400841 7.500129 -0.504464\nv -0.000011 12.886000 0.496828\nv -0.000007 7.705317 0.496827\nv -0.000011 12.886000 -0.504463\nv -0.000007 7.705317 -0.504464\nv -0.000013 13.247540 0.496828\nv -0.000013 13.247540 -0.504463\nv -0.000006 7.365447 0.496827\nv -0.000006 7.365447 -0.504464\nv 7.705332 -0.541525 0.496826\nv 12.886011 -0.541519 0.496826\nv 7.705329 0.541522 0.496826\nv 12.886013 0.541528 0.496826\nv 7.705332 -0.541525 -0.504465\nv 12.886011 -0.541519 -0.504465\nv 7.705329 0.541522 -0.504465\nv 12.886013 0.541528 -0.504465\nv 13.136068 -0.436931 0.496826\nv 13.136066 0.436940 0.496826\nv 13.136066 0.436940 -0.504465\nv 13.136068 -0.436931 -0.504465\nv 7.500144 0.400843 0.496826\nv 7.500144 -0.400849 0.496826\nv 7.500144 0.400843 -0.504465\nv 7.500144 -0.400849 -0.504465\nv 12.886014 0.000003 0.496826\nv 7.705329 -0.000003 0.496826\nv 12.886014 0.000003 -0.504465\nv 7.705329 -0.000003 -0.504465\nv 13.247553 0.000003 0.496826\nv 13.247553 0.000003 -0.504465\nv 7.365460 -0.000003 0.496826\nv 7.365460 -0.000003 -0.504465\nv -0.541512 -7.705342 0.496825\nv -0.541506 -12.886022 0.496824\nv 0.541535 -7.705339 0.496825\nv 0.541543 -12.886021 0.496825\nv -0.541512 -7.705342 -0.504466\nv -0.541506 -12.886022 -0.504467\nv 0.541535 -7.705339 -0.504466\nv 0.541543 -12.886021 -0.504467\nv -0.436917 -13.136078 0.496824\nv 0.436954 -13.136075 0.496824\nv 0.436954 -13.136075 -0.504467\nv -0.436917 -13.136078 -0.504467\nv 0.400857 -7.500153 0.496825\nv -0.400836 -7.500154 0.496825\nv 0.400857 -7.500153 -0.504466\nv -0.400836 -7.500154 -0.504466\nv 0.000018 -12.886022 0.496824\nv 0.000013 -7.705342 0.496825\nv 0.000018 -12.886022 -0.504467\nv 0.000013 -7.705342 -0.504466\nv 0.000019 -13.247561 0.496824\nv 0.000019 -13.247561 -0.504467\nv 0.000010 -7.365471 0.496825\nv 0.000010 -7.365471 -0.504466\nvt 0.437896 0.751829\nvt 0.424034 0.155764\nvt 0.507206 0.377556\nvt 0.635567 0.741023\nvt 0.635567 0.368290\nvt 0.552395 0.371370\nvt 0.524671 0.365210\nvt 0.524671 0.737943\nvn 0.351000 0.847300 -0.398500\nvn 0.351000 0.847300 0.398500\nvn -0.847300 0.351000 0.398500\nvn -0.847300 -0.351000 -0.398500\nvn -0.847300 -0.351000 0.398500\nvn -0.351000 -0.847300 -0.398500\nvn 0.351000 -0.847300 -0.398500\nvn -0.351000 -0.847300 0.398500\nvn 0.847300 -0.351000 -0.398500\nvn 0.351000 -0.847300 0.398500\nvn 0.847300 -0.351000 0.398500\nvn 0.847300 0.351000 -0.398500\nvn 0.847300 0.351000 0.398500\nvn 0.246000 0.593800 -0.766100\nvn 0.593800 -0.246000 -0.766100\nvn -0.246000 0.593800 -0.766100\nvn 0.593800 0.246000 -0.766100\nvn 0.246000 0.593800 0.766100\nvn 0.593800 -0.246000 0.766100\nvn -0.246000 0.593800 0.766100\nvn -0.593800 -0.246000 -0.766100\nvn -0.593800 -0.246000 0.766100\nvn 0.593800 0.246000 0.766100\nvn -0.593800 0.246000 -0.766100\nvn -0.351000 0.847300 0.398500\nvn 0.246000 -0.593800 -0.766100\nvn -0.593800 0.246000 0.766100\nvn -0.246000 -0.593800 -0.766100\nvn 0.246000 -0.593800 0.766100\nvn -0.847300 0.351000 -0.398500\nvn -0.246000 -0.593800 0.766100\nvn -0.382700 0.923900 0.000000\nvn -0.923900 0.382700 0.000000\nvn -0.923900 -0.382700 0.000000\nvn -0.382700 -0.923900 0.000000\nvn 0.382700 -0.923900 0.000000\nvn 0.923900 -0.382700 0.000000\nvn 0.923900 0.382700 0.000000\nvn 0.382700 0.923900 0.000000\nvn -0.351000 0.847300 -0.398500\nvn -0.514300 0.857600 0.000000\nvn -0.857600 0.514300 0.000000\nvn -0.970100 -0.242800 0.000000\nvn -0.242800 -0.970100 0.000000\nvn 0.514300 -0.857600 0.000000\nvn 0.857600 -0.514300 0.000000\nvn 0.970100 0.242800 0.000000\nvn 0.242800 0.970100 0.000000\nvn 0.028300 -0.017000 0.999500\nvn -0.032100 -0.008000 0.999500\nvn -0.026600 0.044400 -0.998700\nvn 0.050200 -0.012600 -0.998700\nvn -0.044400 -0.026600 -0.998700\nvn -0.012600 -0.050200 -0.998700\nvn -0.008000 0.032100 0.999500\nvn 0.032100 0.008000 0.999500\nvn -0.017000 -0.028300 0.999500\nvn 0.026600 -0.044400 -0.998700\nvn 0.044400 0.026600 -0.998700\nvn -0.028300 0.017000 0.999500\nvn 0.012600 0.050200 -0.998700\nvn 0.008000 -0.032100 0.999500\nvn -0.050200 0.012600 -0.998700\nvn 0.017000 0.028300 0.999500\nvn 0.000000 0.000000 1.000000\nvn 0.000000 -1.000000 0.000000\nvn 0.000000 0.000000 -1.000000\nvn -0.000000 1.000000 0.000000\nvn 0.565500 -0.824800 0.000000\nvn -0.385900 -0.922600 0.000000\nvn -0.969000 -0.247200 0.000000\nvn -0.385900 0.922600 0.000000\nvn 0.947900 -0.318500 0.000000\nvn 0.565500 0.824800 0.000000\nvn 0.947900 0.318500 0.000000\nvn -0.969000 0.247200 0.000000\nvn 0.707100 -0.707100 0.000000\nvn -0.707100 0.707100 -0.000000\nvn 0.983000 -0.183400 0.000000\nvn 0.379500 -0.925200 0.000000\nvn -0.510300 -0.860000 0.000000\nvn -0.925200 0.379500 0.000000\nvn 0.895500 0.445100 0.000000\nvn -0.183400 0.983000 -0.000000\nvn 0.445100 0.895500 0.000000\nvn -0.860000 -0.510300 0.000000\nvn -0.707100 -0.707100 0.000000\nvn 0.707100 0.707100 0.000000\nvn -0.183400 -0.983000 0.000000\nvn -0.925200 -0.379500 -0.000000\nvn -0.860000 0.510300 -0.000000\nvn 0.379500 0.925200 0.000000\nvn 0.445100 -0.895500 0.000000\nvn 0.983000 0.183400 0.000000\nvn 0.895500 -0.445100 0.000000\nvn -0.510300 0.860000 0.000000\nvn 0.017000 -0.028300 0.999500\nvn 0.012600 -0.050200 -0.998700\nvn 0.242800 -0.970100 0.000000\nvn -0.242800 0.970100 0.000000\nvn 0.044400 -0.026600 -0.998700\nvn 0.032100 -0.008000 0.999500\nvn 0.970100 -0.242800 0.000000\nvn -0.970100 0.242800 0.000000\nvn 0.050200 0.012600 -0.998700\nvn 0.028300 0.017000 0.999500\nvn 0.857600 0.514300 0.000000\nvn -0.857600 -0.514300 0.000000\nvn 0.008000 0.032100 0.999500\nvn 0.026600 0.044400 -0.998700\nvn 0.514300 0.857600 0.000000\nvn -0.514300 -0.857600 0.000000\nvn -0.017000 0.028300 0.999500\nvn -0.012600 0.050200 -0.998700\nvn -0.044400 0.026600 -0.998700\nvn -0.032100 0.008000 0.999500\nvn -0.050200 -0.012600 -0.998700\nvn -0.028300 -0.017000 0.999500\nvn -0.008000 -0.032100 0.999500\nvn -0.026600 -0.044400 -0.998700\nvn -0.174100 0.072100 -0.982100\nvn 0.174100 -0.072100 0.982100\nvn -0.174100 0.072100 0.982100\nvn 0.072100 -0.174100 -0.982100\nvn 0.072100 -0.174100 0.982100\nvn 0.072100 0.174100 -0.982100\nvn -0.072100 -0.174100 -0.982100\nvn 0.072100 0.174100 0.982100\nvn -0.072100 0.174100 -0.982100\nvn -0.072100 -0.174100 0.982100\nvn 0.174100 0.072100 0.982100\nvn -0.072100 0.174100 0.982100\nvn -0.174100 -0.072100 -0.982100\nvn 0.174100 0.072100 -0.982100\nvn -0.174100 -0.072100 0.982100\nvn 0.174100 -0.072100 -0.982100\nvn 0.103500 -0.042900 -0.993700\nvn 0.103500 0.042900 -0.993700\nvn -0.103500 -0.042900 -0.993700\nvn -0.042900 -0.103500 -0.993700\nvn 0.042900 0.103500 -0.993700\nvn -0.042900 0.103500 -0.993700\nvn 0.042900 -0.103500 -0.993700\nvn -0.103500 0.042900 -0.993700\nvn 0.110700 -0.045800 0.992800\nvn -0.110700 0.045800 0.992800\nvn 0.045800 -0.110700 0.992800\nvn -0.045800 0.110700 0.992800\nvn 0.045800 0.110700 0.992800\nvn -0.045800 -0.110700 0.992800\nvn 0.110700 0.045800 0.992800\nvn -0.110700 -0.045800 0.992800\nvn -0.983000 0.183400 0.000000\nvn -0.379500 0.925200 0.000000\nvn 0.510300 0.860000 0.000000\nvn 0.925200 -0.379500 0.000000\nvn -0.895500 -0.445100 0.000000\nvn 0.183400 -0.983000 -0.000000\nvn -0.445100 -0.895500 0.000000\nvn 0.860000 0.510300 0.000000\nvn 0.183300 0.983000 0.000000\nvn 0.925200 0.379500 0.000000\nvn 0.860000 -0.510300 0.000000\nvn -0.379500 -0.925200 0.000000\nvn -0.445100 0.895500 0.000000\nvn -0.983000 -0.183400 -0.000000\nvn -0.895500 0.445100 0.000000\nvn 0.510300 -0.860000 0.000000\nvn -1.000000 -0.000000 0.000000\nvn 1.000000 0.000000 0.000000\nvn -0.824800 -0.565500 0.000000\nvn -0.922600 0.385900 0.000000\nvn -0.247200 0.969000 0.000000\nvn 0.922600 0.385900 0.000000\nvn -0.318500 -0.947900 0.000000\nvn 0.824800 -0.565500 0.000000\nvn 0.318500 -0.947900 0.000000\nvn 0.247200 0.969000 0.000000\nvn -0.565500 0.824800 0.000000\nvn 0.385900 0.922600 0.000000\nvn 0.969000 0.247200 0.000000\nvn 0.385900 -0.922600 0.000000\nvn -0.947900 0.318500 0.000000\nvn -0.565500 -0.824800 0.000000\nvn -0.947900 -0.318500 0.000000\nvn 0.969000 -0.247200 0.000000\nvn 0.824800 0.565500 0.000000\nvn 0.922600 -0.385900 0.000000\nvn 0.247200 -0.969000 0.000000\nvn -0.922600 -0.385900 0.000000\nvn 0.318500 0.947900 0.000000\nvn -0.824800 0.565500 0.000000\nvn -0.318500 0.947900 0.000000\nvn -0.247200 -0.969000 0.000000\ns off\nf 47/1/1 29/1/1 1/1/1 34/1/1\nf 30/1/2 48/1/2 33/1/2 2/1/2\nf 4/1/3 36/1/3 38/1/3 6/1/3\nf 37/1/4 5/1/4 7/1/4 39/1/4\nf 6/1/5 38/1/5 40/1/5 8/1/5\nf 39/1/6 7/1/6 11/1/6 41/1/6\nf 41/1/7 11/1/7 17/1/7 43/1/7\nf 8/1/8 40/1/8 42/1/8 12/1/8\nf 43/1/9 17/1/9 23/1/9 45/1/9\nf 12/1/10 42/1/10 44/1/10 18/1/10\nf 18/1/11 44/1/11 46/1/11 24/1/11\nf 45/1/12 23/1/12 29/1/12 47/1/12\nf 24/1/13 46/1/13 48/1/13 30/1/13\nf 1/1/14 29/1/14 10/1/14 32/1/14\nf 23/1/15 17/1/15 16/1/15 14/1/15\nf 3/1/16 1/1/16 32/1/16 28/1/16\nf 29/1/17 23/1/17 14/1/17 10/1/17\nf 30/1/18 2/1/18 31/1/18 9/1/18\nf 18/1/19 24/1/19 13/1/19 15/1/19\nf 2/1/20 4/1/20 27/1/20 31/1/20\nf 7/1/21 5/1/21 26/1/21 22/1/21\nf 6/1/22 8/1/22 21/1/22 25/1/22\nf 24/1/23 30/1/23 9/1/23 13/1/23\nf 5/1/24 3/1/24 28/1/24 26/1/24\nf 2/1/25 33/1/25 36/1/25 4/1/25\nf 17/1/26 11/1/26 20/1/26 16/1/26\nf 4/1/27 6/1/27 25/1/27 27/1/27\nf 11/1/28 7/1/28 22/1/28 20/1/28\nf 12/1/29 18/1/29 15/1/29 19/1/29\nf 35/1/30 3/1/30 5/1/30 37/1/30\nf 8/1/31 12/1/31 19/1/31 21/1/31\nf 34/1/32 35/1/32 36/1/32 33/1/32\nf 38/1/33 36/1/33 35/1/33 37/1/33\nf 40/1/34 38/1/34 37/1/34 39/1/34\nf 39/1/35 41/1/35 42/1/35 40/1/35\nf 41/1/36 43/1/36 44/1/36 42/1/36\nf 46/1/37 44/1/37 43/1/37 45/1/37\nf 48/1/38 46/1/38 45/1/38 47/1/38\nf 47/1/39 34/1/39 33/1/39 48/1/39\nf 34/1/40 1/1/40 3/1/40 35/1/40\nf 153/2/41 51/2/41 52/2/41 154/2/41\nf 157/2/42 52/2/42 51/2/42 158/2/42\nf 161/2/43 54/2/43 53/2/43 162/2/43\nf 165/2/44 57/2/44 58/2/44 166/2/44\nf 169/2/45 59/2/45 60/2/45 170/2/45\nf 173/2/46 60/2/46 59/2/46 174/2/46\nf 177/2/47 62/2/47 61/2/47 178/2/47\nf 181/2/48 50/2/48 49/2/48 182/2/48\nf 155/2/45 156/2/45 68/2/45 67/2/45\nf 159/2/46 160/2/46 67/2/46 68/2/46\nf 163/2/47 164/2/47 69/2/47 70/2/47\nf 167/2/48 168/2/48 74/2/48 73/2/48\nf 171/2/41 172/2/41 76/2/41 75/2/41\nf 175/2/42 176/2/42 75/2/42 76/2/42\nf 179/2/43 180/2/43 77/2/43 78/2/43\nf 183/2/44 184/2/44 65/2/44 66/2/44\nf 157/3/49 159/3/49 68/3/49 52/3/49\nf 177/3/50 179/3/50 78/3/50 62/3/50\nf 169/3/51 171/3/51 75/3/51 59/3/51\nf 158/3/52 160/3/52 69/3/52 53/3/52\nf 178/3/53 180/3/53 79/3/53 63/3/53\nf 181/3/54 183/3/54 66/3/54 50/3/54\nf 170/3/55 172/3/55 74/3/55 58/3/55\nf 161/3/56 163/3/56 70/3/56 54/3/56\nf 182/3/57 184/3/57 80/3/57 64/3/57\nf 153/3/58 155/3/58 67/3/58 51/3/58\nf 162/3/59 164/3/59 71/3/59 55/3/59\nf 173/3/60 175/3/60 76/3/60 60/3/60\nf 165/3/61 167/3/61 73/3/61 57/3/61\nf 154/3/62 156/3/62 65/3/62 49/3/62\nf 174/3/63 176/3/63 77/3/63 61/3/63\nf 166/3/64 168/3/64 72/3/64 56/3/64\nf 97/4/65 84/4/65 83/4/65 98/4/65\nf 84/5/66 88/5/66 87/5/66 83/5/66\nf 99/4/67 86/4/67 85/4/67 100/4/67\nf 86/5/68 82/5/68 81/5/68 85/5/68\nf 83/6/69 87/6/69 95/6/69 93/6/69\nf 88/7/70 84/7/70 90/7/70 91/7/70\nf 102/7/71 91/7/71 90/7/71 101/7/71\nf 99/8/67 88/8/67 91/8/67 102/8/67\nf 97/8/65 82/8/65 89/8/65 101/8/65\nf 82/7/72 86/7/72 92/7/72 89/7/72\nf 103/6/73 93/6/73 95/6/73 104/6/73\nf 85/6/74 81/6/74 94/6/74 96/6/74\nf 100/8/67 85/8/67 96/8/67 104/8/67\nf 98/8/65 83/8/65 93/8/65 103/8/65\nf 81/8/65 98/8/65 103/8/65 94/8/65\nf 87/8/67 100/8/67 104/8/67 95/8/67\nf 94/6/75 103/6/75 104/6/75 96/6/75\nf 84/8/65 97/8/65 101/8/65 90/8/65\nf 86/8/67 99/8/67 102/8/67 92/8/67\nf 92/7/76 102/7/76 101/7/76 89/7/76\nf 88/4/67 99/4/67 100/4/67 87/4/67\nf 82/4/65 97/4/65 98/4/65 81/4/65\nf 121/4/65 108/4/65 107/4/65 122/4/65\nf 108/5/77 112/5/77 111/5/77 107/5/77\nf 123/4/67 110/4/67 109/4/67 124/4/67\nf 110/5/78 106/5/78 105/5/78 109/5/78\nf 107/6/79 111/6/79 119/6/79 117/6/79\nf 112/7/80 108/7/80 114/7/80 115/7/80\nf 126/7/81 115/7/81 114/7/81 125/7/81\nf 123/8/67 112/8/67 115/8/67 126/8/67\nf 121/8/65 106/8/65 113/8/65 125/8/65\nf 106/7/82 110/7/82 116/7/82 113/7/82\nf 127/6/83 117/6/83 119/6/83 128/6/83\nf 109/6/84 105/6/84 118/6/84 120/6/84\nf 124/8/67 109/8/67 120/8/67 128/8/67\nf 122/8/65 107/8/65 117/8/65 127/8/65\nf 105/8/65 122/8/65 127/8/65 118/8/65\nf 111/8/67 124/8/67 128/8/67 119/8/67\nf 118/6/85 127/6/85 128/6/85 120/6/85\nf 108/8/65 121/8/65 125/8/65 114/8/65\nf 110/8/67 123/8/67 126/8/67 116/8/67\nf 116/7/86 126/7/86 125/7/86 113/7/86\nf 112/4/67 123/4/67 124/4/67 111/4/67\nf 106/4/65 121/4/65 122/4/65 105/4/65\nf 145/4/65 132/4/65 131/4/65 146/4/65\nf 132/5/87 136/5/87 135/5/87 131/5/87\nf 147/4/67 134/4/67 133/4/67 148/4/67\nf 134/5/88 130/5/88 129/5/88 133/5/88\nf 131/6/89 135/6/89 143/6/89 141/6/89\nf 136/7/90 132/7/90 138/7/90 139/7/90\nf 150/7/91 139/7/91 138/7/91 149/7/91\nf 147/8/67 136/8/67 139/8/67 150/8/67\nf 145/8/65 130/8/65 137/8/65 149/8/65\nf 130/7/92 134/7/92 140/7/92 137/7/92\nf 151/6/93 141/6/93 143/6/93 152/6/93\nf 133/6/94 129/6/94 142/6/94 144/6/94\nf 148/8/67 133/8/67 144/8/67 152/8/67\nf 146/8/65 131/8/65 141/8/65 151/8/65\nf 129/8/65 146/8/65 151/8/65 142/8/65\nf 135/8/67 148/8/67 152/8/67 143/8/67\nf 142/6/95 151/6/95 152/6/95 144/6/95\nf 132/8/65 145/8/65 149/8/65 138/8/65\nf 134/8/67 147/8/67 150/8/67 140/8/67\nf 140/7/96 150/7/96 149/7/96 137/7/96\nf 136/4/67 147/4/67 148/4/67 135/4/67\nf 130/4/65 145/4/65 146/4/65 129/4/65\nf 52/3/97 68/3/97 156/3/97 154/3/97\nf 50/3/98 66/3/98 155/3/98 153/3/98\nf 66/2/99 65/2/99 156/2/99 155/2/99\nf 50/2/100 153/2/100 154/2/100 49/2/100\nf 51/3/101 67/3/101 160/3/101 158/3/101\nf 54/3/102 70/3/102 159/3/102 157/3/102\nf 70/2/103 69/2/103 160/2/103 159/2/103\nf 54/2/104 157/2/104 158/2/104 53/2/104\nf 53/3/105 69/3/105 164/3/105 162/3/105\nf 56/3/106 72/3/106 163/3/106 161/3/106\nf 72/2/107 71/2/107 164/2/107 163/2/107\nf 56/2/108 161/2/108 162/2/108 55/2/108\nf 58/3/109 74/3/109 168/3/109 166/3/109\nf 55/3/110 71/3/110 167/3/110 165/3/110\nf 71/2/111 72/2/111 168/2/111 167/2/111\nf 55/2/112 165/2/112 166/2/112 56/2/112\nf 60/3/113 76/3/113 172/3/113 170/3/113\nf 57/3/114 73/3/114 171/3/114 169/3/114\nf 73/2/100 74/2/100 172/2/100 171/2/100\nf 57/2/99 169/2/99 170/2/99 58/2/99\nf 59/3/115 75/3/115 176/3/115 174/3/115\nf 62/3/116 78/3/116 175/3/116 173/3/116\nf 78/2/104 77/2/104 176/2/104 175/2/104\nf 62/2/103 173/2/103 174/2/103 61/2/103\nf 61/3/117 77/3/117 180/3/117 178/3/117\nf 64/3/118 80/3/118 179/3/118 177/3/118\nf 80/2/108 79/2/108 180/2/108 179/2/108\nf 64/2/107 177/2/107 178/2/107 63/2/107\nf 49/3/119 65/3/119 184/3/119 182/3/119\nf 63/3/120 79/3/120 183/3/120 181/3/120\nf 79/2/112 80/2/112 184/2/112 183/2/112\nf 63/2/111 181/2/111 182/2/111 64/2/111\nf 26/1/121 28/1/121 198/1/121 196/1/121\nf 15/1/122 13/1/122 187/1/122 189/1/122\nf 27/1/123 25/1/123 195/1/123 197/1/123\nf 16/1/124 20/1/124 192/1/124 190/1/124\nf 19/1/125 15/1/125 189/1/125 191/1/125\nf 32/1/126 10/1/126 186/1/126 200/1/126\nf 20/1/127 22/1/127 194/1/127 192/1/127\nf 9/1/128 31/1/128 199/1/128 185/1/128\nf 28/1/129 32/1/129 200/1/129 198/1/129\nf 21/1/130 19/1/130 191/1/130 193/1/130\nf 13/1/131 9/1/131 185/1/131 187/1/131\nf 31/1/132 27/1/132 197/1/132 199/1/132\nf 22/1/133 26/1/133 196/1/133 194/1/133\nf 10/1/134 14/1/134 188/1/134 186/1/134\nf 25/1/135 21/1/135 193/1/135 195/1/135\nf 14/1/136 16/1/136 190/1/136 188/1/136\nf 188/1/137 190/1/137 202/1/137\nf 186/1/138 188/1/138 202/1/138\nf 194/1/139 196/1/139 202/1/139\nf 192/1/140 194/1/140 202/1/140\nf 200/1/141 186/1/141 202/1/141\nf 198/1/142 200/1/142 202/1/142\nf 190/1/143 192/1/143 202/1/143\nf 196/1/144 198/1/144 202/1/144\nf 189/1/145 187/1/145 201/1/145\nf 197/1/146 195/1/146 201/1/146\nf 191/1/147 189/1/147 201/1/147\nf 199/1/148 197/1/148 201/1/148\nf 185/1/149 199/1/149 201/1/149\nf 193/1/150 191/1/150 201/1/150\nf 187/1/151 185/1/151 201/1/151\nf 195/1/152 193/1/152 201/1/152\nf 219/4/65 206/4/65 205/4/65 220/4/65\nf 206/5/78 210/5/78 209/5/78 205/5/78\nf 221/4/67 208/4/67 207/4/67 222/4/67\nf 208/5/77 204/5/77 203/5/77 207/5/77\nf 205/6/153 209/6/153 217/6/153 215/6/153\nf 210/7/154 206/7/154 212/7/154 213/7/154\nf 224/7/155 213/7/155 212/7/155 223/7/155\nf 221/8/67 210/8/67 213/8/67 224/8/67\nf 219/8/65 204/8/65 211/8/65 223/8/65\nf 204/7/156 208/7/156 214/7/156 211/7/156\nf 225/6/157 215/6/157 217/6/157 226/6/157\nf 207/6/158 203/6/158 216/6/158 218/6/158\nf 222/8/67 207/8/67 218/8/67 226/8/67\nf 220/8/65 205/8/65 215/8/65 225/8/65\nf 203/8/65 220/8/65 225/8/65 216/8/65\nf 209/8/67 222/8/67 226/8/67 217/8/67\nf 216/6/159 225/6/159 226/6/159 218/6/159\nf 206/8/65 219/8/65 223/8/65 212/8/65\nf 208/8/67 221/8/67 224/8/67 214/8/67\nf 214/7/160 224/7/160 223/7/160 211/7/160\nf 210/4/67 221/4/67 222/4/67 209/4/67\nf 204/4/65 219/4/65 220/4/65 203/4/65\nf 243/4/65 230/4/65 229/4/65 244/4/65\nf 230/5/88 234/5/88 233/5/88 229/5/88\nf 245/4/67 232/4/67 231/4/67 246/4/67\nf 232/5/87 228/5/87 227/5/87 231/5/87\nf 229/6/161 233/6/161 241/6/161 239/6/161\nf 234/7/162 230/7/162 236/7/162 237/7/162\nf 248/7/163 237/7/163 236/7/163 247/7/163\nf 245/8/67 234/8/67 237/8/67 248/8/67\nf 243/8/65 228/8/65 235/8/65 247/8/65\nf 228/7/164 232/7/164 238/7/164 235/7/164\nf 249/6/165 239/6/165 241/6/165 250/6/165\nf 231/6/166 227/6/166 240/6/166 242/6/166\nf 246/8/67 231/8/67 242/8/67 250/8/67\nf 244/8/65 229/8/65 239/8/65 249/8/65\nf 227/8/65 244/8/65 249/8/65 240/8/65\nf 233/8/67 246/8/67 250/8/67 241/8/67\nf 240/6/167 249/6/167 250/6/167 242/6/167\nf 230/8/65 243/8/65 247/8/65 236/8/65\nf 232/8/67 245/8/67 248/8/67 238/8/67\nf 238/7/168 248/7/168 247/7/168 235/7/168\nf 234/4/67 245/4/67 246/4/67 233/4/67\nf 228/4/65 243/4/65 244/4/65 227/4/65\nf 267/4/65 254/4/65 253/4/65 268/4/65\nf 254/5/169 258/5/169 257/5/169 253/5/169\nf 269/4/67 256/4/67 255/4/67 270/4/67\nf 256/5/170 252/5/170 251/5/170 255/5/170\nf 253/6/171 257/6/171 265/6/171 263/6/171\nf 258/7/172 254/7/172 260/7/172 261/7/172\nf 272/7/173 261/7/173 260/7/173 271/7/173\nf 269/8/67 258/8/67 261/8/67 272/8/67\nf 267/8/65 252/8/65 259/8/65 271/8/65\nf 252/7/174 256/7/174 262/7/174 259/7/174\nf 273/6/175 263/6/175 265/6/175 274/6/175\nf 255/6/176 251/6/176 264/6/176 266/6/176\nf 270/8/67 255/8/67 266/8/67 274/8/67\nf 268/8/65 253/8/65 263/8/65 273/8/65\nf 251/8/65 268/8/65 273/8/65 264/8/65\nf 257/8/67 270/8/67 274/8/67 265/8/67\nf 264/6/177 273/6/177 274/6/177 266/6/177\nf 254/8/65 267/8/65 271/8/65 260/8/65\nf 256/8/67 269/8/67 272/8/67 262/8/67\nf 262/7/178 272/7/178 271/7/178 259/7/178\nf 258/4/67 269/4/67 270/4/67 257/4/67\nf 252/4/65 267/4/65 268/4/65 251/4/65\nf 291/4/65 278/4/65 277/4/65 292/4/65\nf 278/5/68 282/5/68 281/5/68 277/5/68\nf 293/4/67 280/4/67 279/4/67 294/4/67\nf 280/5/66 276/5/66 275/5/66 279/5/66\nf 277/6/179 281/6/179 289/6/179 287/6/179\nf 282/7/180 278/7/180 284/7/180 285/7/180\nf 296/7/181 285/7/181 284/7/181 295/7/181\nf 293/8/67 282/8/67 285/8/67 296/8/67\nf 291/8/65 276/8/65 283/8/65 295/8/65\nf 276/7/182 280/7/182 286/7/182 283/7/182\nf 297/6/183 287/6/183 289/6/183 298/6/183\nf 279/6/184 275/6/184 288/6/184 290/6/184\nf 294/8/67 279/8/67 290/8/67 298/8/67\nf 292/8/65 277/8/65 287/8/65 297/8/65\nf 275/8/65 292/8/65 297/8/65 288/8/65\nf 281/8/67 294/8/67 298/8/67 289/8/67\nf 288/6/185 297/6/185 298/6/185 290/6/185\nf 278/8/65 291/8/65 295/8/65 284/8/65\nf 280/8/67 293/8/67 296/8/67 286/8/67\nf 286/7/186 296/7/186 295/7/186 283/7/186\nf 282/4/67 293/4/67 294/4/67 281/4/67\nf 276/4/65 291/4/65 292/4/65 275/4/65\nf 315/4/65 302/4/65 301/4/65 316/4/65\nf 302/5/170 306/5/170 305/5/170 301/5/170\nf 317/4/67 304/4/67 303/4/67 318/4/67\nf 304/5/169 300/5/169 299/5/169 303/5/169\nf 301/6/187 305/6/187 313/6/187 311/6/187\nf 306/7/188 302/7/188 308/7/188 309/7/188\nf 320/7/189 309/7/189 308/7/189 319/7/189\nf 317/8/67 306/8/67 309/8/67 320/8/67\nf 315/8/65 300/8/65 307/8/65 319/8/65\nf 300/7/190 304/7/190 310/7/190 307/7/190\nf 321/6/191 311/6/191 313/6/191 322/6/191\nf 303/6/192 299/6/192 312/6/192 314/6/192\nf 318/8/67 303/8/67 314/8/67 322/8/67\nf 316/8/65 301/8/65 311/8/65 321/8/65\nf 299/8/65 316/8/65 321/8/65 312/8/65\nf 305/8/67 318/8/67 322/8/67 313/8/67\nf 312/6/193 321/6/193 322/6/193 314/6/193\nf 302/8/65 315/8/65 319/8/65 308/8/65\nf 304/8/67 317/8/67 320/8/67 310/8/67\nf 310/7/194 320/7/194 319/7/194 307/7/194\nf 306/4/67 317/4/67 318/4/67 305/4/67\nf 300/4/65 315/4/65 316/4/65 299/4/65\n"
  },
  {
    "path": "browser/data/editor-icons/vr-camera/Head1.obj",
    "content": "# Blender v2.76 (sub 0) OBJ File: 'Work.blend'\n# www.blender.org\no Circle.000_Circle.003\nv 4.801413 4.993684 -0.083438\nv 4.786789 4.985782 -0.738414\nv 4.870439 5.305190 -0.756260\nv 4.885062 5.313092 -0.101265\nv 7.595856 4.622990 -0.192178\nv 7.554808 4.619015 -0.842568\nv 7.875249 4.898203 -0.869036\nv 7.916295 4.902175 -0.219535\nv 9.607035 3.616977 -0.353833\nv 9.554059 3.618008 -0.996276\nv 10.109419 3.779557 -1.040505\nv 10.162395 3.778526 -0.398641\nv 10.343863 2.225387 -0.435385\nv 10.290333 2.226513 -1.077072\nv 10.926498 2.268804 -1.129846\nv 10.980028 2.267677 -0.488158\nv 7.595857 -4.969249 -0.192175\nv 7.554809 -4.965273 -0.834737\nv 7.875250 -5.244462 -0.862101\nv 7.916296 -5.248438 -0.219538\nv 4.801410 -5.255311 -0.081491\nv 4.786787 -5.247407 -0.725051\nv 4.870440 -5.566817 -0.742609\nv 4.885059 -5.574716 -0.099051\nv 9.607035 -3.963235 -0.353831\nv 9.554059 -3.964266 -0.995564\nv 10.109419 -4.125816 -1.040371\nv 10.162395 -4.124784 -0.398640\nv 10.343863 -2.571647 -0.435387\nv 10.290333 -2.572773 -1.077073\nv 10.926496 -2.615062 -1.129846\nv 10.980025 -2.613935 -0.488163\nv 10.823314 -2.595828 -9.573339\nv 10.824644 -2.585627 -9.008763\nv 10.261111 -2.548568 -9.022640\nv 10.259778 -2.558771 -9.586981\nv 3.295022 -5.609575 -8.521725\nv 3.307267 -5.567680 -7.959827\nv 3.254441 -5.288766 -8.040392\nv 3.242196 -5.330662 -8.602285\nv 10.011144 -4.097220 -9.287219\nv 10.026261 -4.065129 -8.722670\nv 9.532956 -3.924150 -8.742090\nv 9.517839 -3.956239 -9.306242\nv 7.795847 -5.206936 -8.834462\nv 7.828742 -5.163834 -8.273610\nv 7.540015 -4.920520 -8.331332\nv 7.507120 -4.963625 -8.892186\nv 4.823351 5.263315 -9.017949\nv 4.841275 5.221419 -8.453038\nv 4.763952 4.942506 -8.531571\nv 4.746028 4.984402 -9.096182\nv 10.823314 2.249570 -10.230260\nv 10.824644 2.239368 -9.666050\nv 10.261111 2.202309 -9.675604\nv 10.259778 2.212512 -10.239790\nv 7.795846 4.860677 -9.548998\nv 7.828741 4.817576 -8.988503\nv 7.540017 4.574262 -9.023103\nv 7.507123 4.617365 -9.585217\nv 10.011147 3.750960 -10.092466\nv 10.026261 3.718871 -9.530491\nv 9.532956 3.577893 -9.538625\nv 9.517843 3.609982 -10.100455\nv -4.801417 4.993683 -0.083439\nv -4.786794 4.985781 -0.738415\nv -4.870443 5.305189 -0.756261\nv -4.885067 5.313091 -0.101266\nv -7.595861 4.622989 -0.192179\nv -7.554812 4.619014 -0.842569\nv -7.875254 4.898202 -0.869038\nv -7.916299 4.902174 -0.219537\nv -9.607038 3.616976 -0.353835\nv -9.554063 3.618006 -0.996278\nv -10.109423 3.779555 -1.040507\nv -10.162398 3.778524 -0.398643\nv -10.343865 2.225386 -0.435387\nv -10.290336 2.226512 -1.077074\nv -10.926502 2.268802 -1.129848\nv -10.980032 2.267676 -0.488160\nv -7.595860 -4.969250 -0.192177\nv -7.554811 -4.965274 -0.834739\nv -7.875253 -5.244463 -0.862102\nv -7.916298 -5.248439 -0.219540\nv -4.801413 -5.255312 -0.081492\nv -4.786789 -5.247408 -0.725052\nv -4.870442 -5.566818 -0.742610\nv -4.885062 -5.574717 -0.099052\nv -9.607038 -3.963236 -0.353833\nv -9.554063 -3.964267 -0.995566\nv -10.109423 -4.125817 -1.040373\nv -10.162398 -4.124785 -0.398642\nv -10.343865 -2.571649 -0.435389\nv -10.290336 -2.572774 -1.077075\nv -10.926498 -2.615063 -1.129849\nv -10.980028 -2.613936 -0.488165\nv -10.823315 -2.595830 -9.573340\nv -10.824645 -2.585629 -9.008765\nv -10.261113 -2.548570 -9.022642\nv -10.259779 -2.558772 -9.586983\nv -3.295023 -5.609575 -8.521725\nv -3.307268 -5.567680 -7.959828\nv -3.254443 -5.288766 -8.040392\nv -3.242198 -5.330662 -8.602285\nv -10.011146 -4.097221 -9.287221\nv -10.026262 -4.065130 -8.722672\nv -9.532958 -3.924151 -8.742092\nv -9.517841 -3.956241 -9.306244\nv -7.795848 -5.206937 -8.834464\nv -7.828743 -5.163835 -8.273612\nv -7.540015 -4.920521 -8.331334\nv -7.507121 -4.963626 -8.892188\nv -4.823353 5.263314 -9.017951\nv -4.841278 5.221418 -8.453040\nv -4.763955 4.942505 -8.531573\nv -4.746031 4.984401 -9.096184\nv -10.823315 2.249568 -10.230262\nv -10.824645 2.239367 -9.666052\nv -10.261113 2.202308 -9.675606\nv -10.259779 2.212511 -10.239792\nv -7.795849 4.860676 -9.549000\nv -7.828743 4.817575 -8.988505\nv -7.540020 4.574261 -9.023105\nv -7.507125 4.617364 -9.585218\nv -10.011149 3.750958 -10.092468\nv -10.026262 3.718869 -9.530493\nv -9.532958 3.577891 -9.538627\nv -9.517844 3.609981 -10.100457\nv 1.613758 5.221418 -7.937271\nv -1.613762 5.221418 -7.937271\nv -1.587987 4.942507 -8.015804\nv 1.587984 4.942507 -8.015804\nv -1.582011 4.984402 -8.580413\nv 1.582008 4.984402 -8.580413\nv -1.607786 5.263313 -8.502181\nv 1.607782 5.263313 -8.502181\nv 6.906541 -1.591769 -9.503708\nv 2.182541 -3.457714 -8.840844\nv 6.407092 -2.532499 -9.314726\nv 5.053545 -3.210638 -9.035996\nv 3.194867 3.486045 -9.173321\nv 6.906541 1.620100 -9.943157\nv 5.053545 3.238966 -9.502521\nv 6.407095 2.560830 -9.849363\nv -6.906542 -1.591770 -9.503710\nv -2.182543 -3.457714 -8.840844\nv -6.407094 -2.532500 -9.314728\nv -5.053547 -3.210638 -9.035998\nv -3.194870 3.486044 -9.173321\nv -6.906542 1.620100 -9.943159\nv -5.053547 3.238966 -9.502522\nv -6.407097 2.560829 -9.849365\nv -1.064956 3.486045 -8.826120\nv 1.064954 3.486045 -8.826120\nv 3.361987 -5.449973 -0.378682\nv 10.543819 -2.572563 -0.746064\nv 7.669099 -5.064474 -0.492779\nv 9.773539 -4.011269 -0.661283\nv 10.543819 2.226305 -0.746061\nv 3.361986 5.103714 -0.382880\nv 9.773539 3.665010 -0.661283\nv 7.669098 4.718215 -0.493235\nv -10.543819 -2.572563 -0.746066\nv -3.361986 -5.449973 -0.378683\nv -9.773542 -4.011269 -0.661285\nv -7.669102 -5.064472 -0.492783\nv -3.361987 5.103714 -0.382881\nv -10.543819 2.226305 -0.746066\nv -7.669103 4.718216 -0.493238\nv -9.773542 3.665011 -0.661286\nv 10.543820 -2.572563 -9.296242\nv 3.361984 -5.449974 -8.278725\nv 9.773540 -4.011269 -9.012150\nv 7.669100 -5.064473 -8.580612\nv 3.361987 5.103714 -8.217883\nv 10.543820 2.226307 -9.953245\nv 7.669099 4.718217 -9.279637\nv 9.773540 3.665011 -9.807330\nv -3.361985 -5.449974 -8.278725\nv -10.543818 -2.572563 -9.296245\nv -7.669101 -5.064474 -8.580614\nv -9.773541 -4.011268 -9.012151\nv -10.543818 2.226307 -9.953246\nv -3.361986 5.103714 -8.217885\nv -9.773541 3.665011 -9.807332\nv -7.669102 4.718216 -9.279640\nv 2.236817 5.103714 -0.379081\nv -2.236821 5.103714 -0.379081\nv -2.236821 -5.449973 -0.378683\nv 2.236818 -5.449973 -0.378682\nv 1.228297 -2.924236 -8.278726\nv -1.228299 -2.924236 -8.278726\nv -2.236821 5.103715 -8.276765\nv 2.236818 5.103715 -8.276765\nv -3.361986 5.103716 -4.400099\nv -7.669103 4.718215 -4.937377\nv -9.773542 3.665012 -5.235378\nv -10.543819 2.226306 -5.363214\nv -1.109617 -5.449974 -4.328702\nv -7.669102 -5.064474 -4.536696\nv -9.773541 -4.011268 -4.836701\nv -10.543818 -2.572563 -4.989944\nv 3.361986 5.103714 -4.400098\nv 7.669099 4.718215 -4.937374\nv 9.773539 3.665010 -5.235374\nv 10.543819 2.226306 -5.363214\nv 1.109614 -5.449974 -4.328702\nv 7.669100 -5.064474 -4.536695\nv 9.773540 -4.011268 -4.836699\nv 10.543820 -2.572563 -4.989941\nv -2.236821 5.103715 -4.334406\nv 2.236817 5.103715 -4.334406\nv -0.389161 -5.449974 -4.328702\nv 0.389159 -5.449974 -4.328702\nv -8.955273 3.918548 -32.236996\nv -8.955272 0.203123 -33.027523\nv -2.020124 5.407966 -35.023968\nv -2.020123 -0.022674 -36.179440\nv 8.955275 3.918548 -32.236996\nv 8.955276 0.203124 -33.027523\nv 2.020127 5.407965 -35.023968\nv 2.020127 -0.022673 -36.179440\nv 7.000997 -0.406188 -34.376953\nv 7.000996 5.024447 -33.221478\nv -7.000989 -0.406187 -34.376953\nv -7.000989 5.024448 -33.221474\nv -8.628107 3.665814 -30.973047\nv -8.628107 -0.049610 -31.763577\nv -2.020124 5.153868 -33.304497\nv -2.020124 -0.276772 -34.668705\nv -7.000989 -0.662668 -32.717182\nv -7.000990 4.767967 -31.561705\nv 8.628110 3.665813 -30.973043\nv 8.628110 -0.049610 -31.763577\nv 2.020127 5.153868 -33.304497\nv 2.020127 -0.276772 -34.668705\nv 7.000996 -0.662669 -32.717182\nv 7.000996 4.767967 -31.561705\nv -11.943542 1.556030 -3.716540\nv -11.916324 1.556030 -4.470589\nv -11.943542 -1.611454 -3.716539\nv -11.916323 -1.611454 -4.470588\nv -11.846407 1.556030 -3.155900\nv -11.846407 -1.611454 -3.155900\nv -11.235772 1.556030 -3.237244\nv -11.235772 -1.611454 -3.237243\nv -11.210734 1.556030 -4.129218\nv -11.210733 -1.611454 -4.129217\nv -12.074862 2.712150 -21.054600\nv -12.074862 -0.455335 -21.054602\nv -8.955273 3.462469 -31.520344\nv -8.955273 0.357891 -32.148468\nv -1.943688 4.215993 -34.236397\nv -1.943688 1.111412 -34.864521\nv -11.374848 1.556029 -7.194168\nv -11.374848 -1.611455 -7.194168\nv -10.912662 1.556030 -8.977547\nv -10.912662 -1.611454 -8.977545\nv -11.753945 -1.611454 -7.205576\nv -11.753945 1.556030 -7.205574\nv -11.670039 1.556031 -3.735088\nv -11.642502 1.556029 -4.457520\nv -11.670038 -1.611454 -3.735089\nv -11.642501 -1.611454 -4.457519\nv -11.684152 1.556031 -3.376855\nv -11.684152 -1.611454 -3.376855\nv -11.439459 1.556029 -3.420709\nv -11.439459 -1.611455 -3.420709\nv -11.484849 1.556030 -4.125737\nv -11.484848 -1.611454 -4.125738\nv -11.803533 2.711099 -21.015511\nv -11.802496 -0.456201 -21.023539\nv -8.751178 3.454245 -31.338076\nv -8.742727 0.350272 -31.976011\nv -1.943688 4.203456 -33.988995\nv -1.943688 1.098876 -34.617119\nv -11.647618 1.556030 -7.221544\nv -11.647618 -1.611454 -7.221542\nv -11.178032 1.556030 -9.046316\nv -11.178032 -1.611455 -9.046317\nv -11.479866 -1.611454 -7.200003\nv -11.479848 1.556031 -7.201190\nv 11.943539 1.556030 -3.716537\nv 11.916324 1.556030 -4.470584\nv 11.943540 -1.611454 -3.716537\nv 11.916325 -1.611454 -4.470584\nv 11.846407 1.556030 -3.155897\nv 11.846407 -1.611454 -3.155898\nv 11.235772 1.556029 -3.237241\nv 11.235772 -1.611454 -3.237242\nv 11.210731 1.556030 -4.129216\nv 11.210732 -1.611454 -4.129216\nv 12.074862 2.712150 -21.054598\nv 12.074862 -0.455335 -21.054600\nv 8.955275 3.462468 -31.520344\nv 8.955275 0.357892 -32.148468\nv 1.943694 4.215993 -34.236397\nv 1.943695 1.111412 -34.864521\nv 11.374850 1.556030 -7.194166\nv 11.374850 -1.611455 -7.194167\nv 10.912663 1.556030 -8.977543\nv 10.912663 -1.611454 -8.977544\nv 11.753947 -1.611455 -7.205572\nv 11.753947 1.556030 -7.205572\nv 11.670039 1.556031 -3.735085\nv 11.642502 1.556030 -4.457516\nv 11.670040 -1.611454 -3.735085\nv 11.642503 -1.611454 -4.457517\nv 11.684152 1.556030 -3.376852\nv 11.684152 -1.611455 -3.376851\nv 11.439455 1.556031 -3.420707\nv 11.439455 -1.611454 -3.420707\nv 11.484845 1.556030 -4.125734\nv 11.484846 -1.611454 -4.125734\nv 11.803536 2.711098 -21.015507\nv 11.802500 -0.456201 -21.023535\nv 8.751180 3.454245 -31.338076\nv 8.742729 0.350272 -31.976011\nv 1.943694 4.203456 -33.988995\nv 1.943695 1.098876 -34.617119\nv 11.647617 1.556029 -7.221540\nv 11.647617 -1.611454 -7.221540\nv 11.178034 1.556031 -9.046314\nv 11.178034 -1.611455 -9.046313\nv 11.479864 -1.611454 -7.199999\nv 11.479847 1.556030 -7.201187\nv -12.725548 6.002950 -20.493406\nv -12.725548 2.385087 -17.706757\nv -12.725548 -2.731345 -17.706758\nv -12.725547 -6.349208 -20.493404\nv -12.725547 -6.349210 -24.434324\nv -12.725547 -2.731346 -27.220970\nv -12.725547 2.385084 -27.220972\nv -12.725548 6.002948 -24.434322\nv -11.796734 5.583498 -20.627235\nv -11.796734 2.211346 -18.029844\nv -11.796734 -2.557601 -18.029842\nv -11.796733 -5.929755 -20.627230\nv -11.796733 -5.929756 -24.300497\nv -11.796733 -2.557601 -26.897888\nv -11.796733 2.211345 -26.897894\nv -11.796734 5.583495 -24.300497\nv -13.488536 6.002950 -20.493406\nv -13.488536 2.385087 -17.706757\nv -13.488536 -2.731345 -17.706758\nv -13.488535 -6.349208 -20.493404\nv -13.488535 -6.349210 -24.434324\nv -13.488535 -2.731346 -27.220970\nv -13.488535 2.385084 -27.220972\nv -13.488536 6.002948 -24.434322\nv -13.557840 5.744756 -20.575781\nv -13.557840 2.278140 -17.905628\nv -13.557840 -2.624397 -17.905632\nv -13.557839 -6.091016 -20.575781\nv -13.557839 -6.091015 -24.351950\nv -13.557839 -2.624398 -27.022097\nv -13.557839 2.278137 -27.022099\nv -13.557840 5.744755 -24.351946\nv -13.557840 6.402266 -20.366007\nv -13.557840 2.550490 -17.399185\nv -13.557840 -2.896746 -17.399189\nv -13.557839 -6.748527 -20.366005\nv -13.557839 -6.748527 -24.561724\nv -13.557839 -2.896747 -27.528543\nv -13.557839 2.550486 -27.528542\nv -13.557840 6.402266 -24.561724\nv -13.927166 6.402266 -20.366007\nv -13.927166 2.550490 -17.399185\nv -13.927166 -2.896746 -17.399189\nv -13.927165 -6.748527 -20.366005\nv -13.927165 -6.748527 -24.561724\nv -13.927165 -2.896747 -27.528543\nv -13.927165 2.550486 -27.528542\nv -13.927166 6.402266 -24.561724\nv -13.927166 5.722449 -20.582897\nv -13.927166 2.268901 -17.922810\nv -13.927166 -2.615157 -17.922813\nv -13.927165 -6.068711 -20.582899\nv -13.927165 -6.068711 -24.344831\nv -13.927165 -2.615158 -27.004919\nv -13.927165 2.268898 -27.004919\nv -13.927166 5.722449 -24.344831\nv -15.610663 5.164934 -20.760775\nv -15.610663 2.037969 -18.352238\nv -15.610663 -2.384227 -18.352238\nv -15.610662 -5.511193 -20.760771\nv -15.610662 -5.511195 -24.166956\nv -15.610662 -2.384229 -26.575491\nv -15.610662 2.037967 -26.575491\nv -15.610663 5.164934 -24.166960\nv -16.167734 3.302842 -21.354870\nv -16.167734 1.266664 -19.786509\nv -16.167734 -1.612923 -19.786510\nv -16.167734 -3.649102 -21.354868\nv -16.167734 -3.649102 -23.572859\nv -16.167734 -1.612924 -25.141222\nv -16.167734 1.266663 -25.141220\nv -16.167734 3.302841 -23.572865\nv -16.308975 0.522637 -22.241884\nv -16.308975 0.115066 -21.927954\nv -16.308975 -0.461326 -21.927954\nv -16.308975 -0.868897 -22.241882\nv -16.308975 -0.868897 -22.685846\nv -16.308975 -0.461326 -22.999777\nv -16.308975 0.115066 -22.999777\nv -16.308975 0.522637 -22.685846\nv -14.194529 5.633910 -21.180349\nv -14.194529 5.633908 -23.747383\nv -15.343301 5.253474 -21.301723\nv -15.343301 5.253476 -23.626011\nv -12.892332 11.300448 -21.180349\nv -12.892331 11.300447 -23.747385\nv -13.505192 12.369580 -21.301723\nv -13.505191 12.369580 -23.626013\nv -3.606192 14.861475 -19.580130\nv -3.606191 14.861477 -25.347603\nv -4.219048 15.930609 -19.852831\nv -4.219047 15.930612 -25.074909\nv -11.796734 2.904274 -21.482033\nv -11.796734 1.101573 -20.093506\nv -11.796734 -1.447831 -20.093504\nv -11.796733 -3.250531 -21.482029\nv -11.796733 -3.250531 -23.445700\nv -11.796733 -1.447832 -24.834225\nv -11.796733 1.101573 -24.834227\nv -11.796734 2.904273 -23.445698\nv -12.153675 2.061046 -21.751062\nv -12.153675 0.752296 -20.742998\nv -12.153675 -1.098553 -20.743000\nv -12.153674 -2.407303 -21.751059\nv -12.153674 -2.407301 -23.176672\nv -12.153674 -1.098555 -24.184732\nv -12.153674 0.752296 -24.184731\nv -12.153675 2.061044 -23.176668\nv -12.804966 1.884403 -21.807417\nv -12.804966 0.679128 -20.879059\nv -12.804966 -1.025385 -20.879059\nv -12.804965 -2.230659 -21.807417\nv -12.804965 -2.230659 -23.120316\nv -12.804965 -1.025386 -24.048674\nv -12.804965 0.679127 -24.048672\nv -12.804966 1.884402 -23.120310\nv 12.725552 6.002952 -20.493402\nv 12.725552 2.385089 -17.706753\nv 12.725552 -2.731343 -17.706755\nv 12.725553 -6.349206 -20.493401\nv 12.725553 -6.349208 -24.434320\nv 12.725553 -2.731344 -27.220966\nv 12.725553 2.385086 -27.220968\nv 12.725552 6.002950 -24.434319\nv 11.796735 5.583500 -20.627232\nv 11.796735 2.211347 -18.029840\nv 11.796735 -2.557600 -18.029839\nv 11.796736 -5.929753 -20.627226\nv 11.796736 -5.929754 -24.300493\nv 11.796736 -2.557600 -26.897884\nv 11.796736 2.211346 -26.897890\nv 11.796735 5.583497 -24.300493\nv 13.488536 6.002952 -20.493402\nv 13.488536 2.385089 -17.706753\nv 13.488536 -2.731343 -17.706755\nv 13.488537 -6.349206 -20.493401\nv 13.488537 -6.349208 -24.434320\nv 13.488537 -2.731344 -27.220966\nv 13.488537 2.385086 -27.220968\nv 13.488536 6.002950 -24.434319\nv 13.557840 5.744758 -20.575777\nv 13.557840 2.278142 -17.905624\nv 13.557840 -2.624395 -17.905628\nv 13.557841 -6.091014 -20.575777\nv 13.557841 -6.091013 -24.351946\nv 13.557841 -2.624396 -27.022093\nv 13.557841 2.278139 -27.022095\nv 13.557840 5.744757 -24.351942\nv 13.557840 6.402267 -20.366003\nv 13.557840 2.550492 -17.399181\nv 13.557840 -2.896744 -17.399185\nv 13.557841 -6.748525 -20.366001\nv 13.557841 -6.748525 -24.561720\nv 13.557841 -2.896745 -27.528540\nv 13.557841 2.550488 -27.528538\nv 13.557840 6.402267 -24.561720\nv 13.927170 6.402267 -20.366003\nv 13.927170 2.550492 -17.399181\nv 13.927170 -2.896744 -17.399185\nv 13.927171 -6.748525 -20.366001\nv 13.927171 -6.748525 -24.561720\nv 13.927171 -2.896745 -27.528540\nv 13.927171 2.550488 -27.528538\nv 13.927170 6.402267 -24.561720\nv 13.927170 5.722451 -20.582893\nv 13.927170 2.268903 -17.922806\nv 13.927170 -2.615155 -17.922810\nv 13.927171 -6.068709 -20.582895\nv 13.927171 -6.068709 -24.344828\nv 13.927171 -2.615156 -27.004915\nv 13.927171 2.268900 -27.004915\nv 13.927170 5.722451 -24.344828\nv 15.610664 5.164936 -20.760771\nv 15.610664 2.037971 -18.352234\nv 15.610664 -2.384224 -18.352234\nv 15.610665 -5.511191 -20.760767\nv 15.610665 -5.511193 -24.166952\nv 15.610665 -2.384226 -26.575487\nv 15.610665 2.037969 -26.575487\nv 15.610664 5.164936 -24.166956\nv 16.167734 3.302845 -21.354866\nv 16.167734 1.266666 -19.786505\nv 16.167734 -1.612920 -19.786507\nv 16.167734 -3.649100 -21.354864\nv 16.167734 -3.649099 -23.572855\nv 16.167734 -1.612921 -25.141218\nv 16.167734 1.266665 -25.141216\nv 16.167734 3.302843 -23.572861\nv 16.308973 0.522639 -22.241880\nv 16.308973 0.115068 -21.927950\nv 16.308973 -0.461324 -21.927950\nv 16.308973 -0.868895 -22.241879\nv 16.308973 -0.868895 -22.685843\nv 16.308973 -0.461323 -22.999773\nv 16.308973 0.115068 -22.999773\nv 16.308973 0.522639 -22.685843\nv 14.194532 5.633912 -21.180346\nv 14.194532 5.633910 -23.747379\nv 15.343302 5.253476 -21.301720\nv 15.343302 5.253478 -23.626007\nv 12.892334 11.300450 -21.180346\nv 12.892335 11.300449 -23.747381\nv 13.505190 12.369582 -21.301720\nv 13.505191 12.369582 -23.626009\nv 3.606190 14.861475 -19.580130\nv 3.606190 14.861477 -25.347603\nv 4.219049 15.930609 -19.852831\nv 4.219050 15.930612 -25.074909\nv 11.796735 2.904275 -21.482029\nv 11.796735 1.101575 -20.093502\nv 11.796735 -1.447829 -20.093500\nv 11.796736 -3.250529 -21.482025\nv 11.796736 -3.250530 -23.445696\nv 11.796736 -1.447830 -24.834221\nv 11.796736 1.101575 -24.834223\nv 11.796735 2.904274 -23.445694\nv 12.153679 2.061048 -21.751059\nv 12.153679 0.752297 -20.742994\nv 12.153679 -1.098552 -20.742996\nv 12.153680 -2.407301 -21.751055\nv 12.153680 -2.407299 -23.176668\nv 12.153680 -1.098554 -24.184729\nv 12.153680 0.752298 -24.184727\nv 12.153679 2.061046 -23.176664\nv 12.804970 1.884404 -21.807413\nv 12.804970 0.679130 -20.879055\nv 12.804970 -1.025384 -20.879055\nv 12.804971 -2.230657 -21.807413\nv 12.804971 -2.230657 -23.120312\nv 12.804971 -1.025385 -24.048670\nv 12.804971 0.679129 -24.048668\nv 12.804970 1.884403 -23.120306\nv -9.642461 2.227498 -3.439671\nv -9.642461 2.227498 -4.409066\nv -11.691783 2.147076 -3.378148\nv -11.691783 2.147074 -4.470587\nv -11.691782 -2.202499 -3.378149\nv -11.691782 -2.202499 -4.470589\nv -9.642460 -2.285997 -3.491107\nv -9.642460 -2.285997 -4.357628\nv -9.642461 1.696141 -4.405913\nv -9.642461 1.696141 -3.442821\nv -11.317669 1.704135 -4.467037\nv -11.317669 1.704134 -3.381700\nv -11.317668 -1.640957 -4.467036\nv -11.317669 -1.640957 -3.381699\nv -9.642460 -1.684656 -4.354813\nv -9.642460 -1.684655 -3.493925\nv 9.642461 2.227497 -3.439669\nv 9.642461 2.227497 -4.409063\nv 11.691783 2.147075 -3.378146\nv 11.691783 2.147075 -4.470584\nv 11.691784 -2.202499 -3.378147\nv 11.691784 -2.202498 -4.470586\nv 9.642462 -2.285996 -3.491106\nv 9.642462 -2.285997 -4.357627\nv 9.642461 1.696141 -4.405912\nv 9.642461 1.696140 -3.442819\nv 11.317665 1.704135 -4.467036\nv 11.317665 1.704136 -3.381696\nv 11.317666 -1.640957 -4.467035\nv 11.317665 -1.640957 -3.381697\nv 9.642462 -1.684656 -4.354810\nv 9.642462 -1.684656 -3.493922\nv -11.964422 -0.173132 -21.001162\nv 11.964426 -0.173131 -21.001158\nv 4.544061 -9.600121 -26.566124\nv 6.134481 -11.190540 -22.022066\nv 11.149416 -0.173129 -9.851748\nv 3.980389 -14.083008 -17.478008\nv -11.149414 -0.173129 -9.851748\nv -3.980386 -14.083008 -17.478008\nv -11.149414 10.976286 -21.001163\nv -8.632219 -0.173132 -32.150578\nv -6.134479 -11.190540 -22.022066\nv 8.632223 -0.173131 -32.150578\nv -4.544057 -9.600121 -26.566124\nv 11.149416 10.976286 -21.001160\nv 10.657389 8.085698 -12.742336\nv -10.657387 8.085698 -12.742337\nv 8.258830 8.085695 -29.259983\nv -8.258824 8.085693 -29.259983\nv -16.308975 -0.173012 -22.463825\nv 16.308973 -0.173096 -22.463802\nv -2.111254 -0.173129 -6.839027\nv 2.111251 -0.173129 -6.839027\nv 2.066983 -0.173134 -34.211533\nv -2.066980 -0.173135 -34.211533\nv -2.111250 13.989006 -21.001160\nv 2.111252 13.989005 -21.001160\nv 2.094464 10.408208 -10.419827\nv -2.094463 10.408209 -10.419826\nv -2.024745 10.267620 -31.441908\nv 2.024750 10.267621 -31.441908\nv 1.107066 -15.231085 -16.329937\nv -1.107069 -15.231085 -16.329937\nv -1.094891 -10.012321 -27.773336\nv 1.094893 -10.012321 -27.773336\nv -11.603478 -5.110911 -21.001162\nv 11.603480 -5.110911 -21.001160\nv 9.415541 -7.439123 -11.131913\nv -9.415541 -7.439122 -11.131914\nv -8.466852 -3.830746 -30.870413\nv 8.466856 -3.830745 -30.870413\nv -2.067336 -7.502455 -7.941700\nv 2.067339 -7.502455 -7.941700\nv 2.032873 -4.162537 -32.990337\nv -2.032869 -4.162537 -32.990337\nv -0.000001 -7.102658 -4.323514\nv -9.896449 -11.289568 -21.256233\nv -11.244839 -10.017131 -21.001162\nv 9.896451 -11.289567 -21.256229\nv 11.244841 -10.017131 -21.001160\nv 7.516877 -15.395669 -12.533744\nv 6.421359 -15.955842 -13.925529\nv -6.421361 -15.955842 -13.925530\nv -7.516876 -15.395671 -12.533746\nv 7.330705 -8.723821 -28.586937\nv 8.324287 -6.984121 -29.766733\nv -8.324284 -6.984122 -29.766733\nv -7.330704 -8.723823 -28.586937\nv 1.785976 -17.807978 -12.073397\nv 2.018034 -17.558577 -10.427107\nv -2.018033 -17.558577 -10.427107\nv -1.785975 -17.807978 -12.073397\nv -1.766330 -9.388803 -30.534462\nv -2.002507 -7.713839 -31.903244\nv 2.002511 -7.713839 -31.903244\nv 1.766333 -9.388803 -30.534462\nv -0.910397 -16.264309 -30.111198\nv -3.778365 -15.921570 -29.107409\nv 3.778369 -15.921570 -29.107409\nv 0.910401 -16.264309 -30.111198\nv 0.920521 -20.603693 -20.596058\nv 3.309676 -19.649069 -21.550678\nv -3.309676 -19.649069 -21.550678\nv -0.920522 -20.603693 -20.596058\nv 5.100798 -17.243994 -25.329041\nv -5.100794 -17.243994 -25.329041\nv -0.914946 -18.214722 -25.834454\nv 0.914950 -18.214722 -25.834454\nv 1.644331 10.561129 -32.291931\nv -1.644330 10.561129 -32.291931\nv -1.700948 10.714136 -10.071882\nv 1.700948 10.714136 -10.071882\nv 1.714581 14.611324 -21.019272\nv -1.714580 14.611324 -21.019272\nv -1.678625 4.873608 -34.527237\nv 1.678631 4.873608 -34.527237\nv 1.714581 5.048882 -6.885150\nv -1.714581 5.048882 -6.885150\nv 1.712678 10.434322 -10.347334\nv 1.726405 14.358387 -21.014643\nv -1.726403 14.358387 -21.014643\nv -1.712678 10.434322 -10.347334\nv -1.655666 10.280260 -32.010941\nv 1.655671 10.280260 -32.010941\nv 1.690208 4.800620 -34.125134\nv -1.690202 4.800620 -34.125134\nv -1.726404 5.048884 -7.366729\nv 1.726404 5.048882 -7.366731\nvt 0.433271 0.724514\nvt 0.765958 0.953430\nvt 0.643703 0.358852\nvt 0.650909 0.384439\nvt 0.699945 0.152994\nvt 0.643703 0.368394\nvt 0.643703 0.368298\nvt 0.516443 0.734693\nvt 0.655062 0.448684\nvt 0.571891 0.648913\nvt 0.627339 0.538017\nvt 0.571891 0.445604\nvt 0.544167 0.553419\nvn -0.130900 -0.991300 0.014600\nvn -0.043500 -0.044500 -0.998100\nvn 0.133700 0.990900 -0.014700\nvn 0.044900 0.045000 0.998000\nvn -0.445100 -0.894800 0.034400\nvn -0.078500 -0.003900 -0.996900\nvn 0.445100 0.894800 -0.034400\nvn 0.081000 0.002300 0.996700\nvn -0.879800 -0.469900 0.072200\nvn -0.083500 0.013700 -0.996400\nvn 0.875500 0.477900 -0.071800\nvn 0.084000 -0.013800 0.996400\nvn -0.101100 0.994800 0.013600\nvn -0.044300 0.045000 -0.998000\nvn 0.106300 -0.994200 -0.013800\nvn 0.044300 -0.045000 0.998000\nvn -0.445000 0.894800 0.034600\nvn -0.081000 0.002300 -0.996700\nvn 0.445100 -0.894800 -0.034600\nvn 0.081000 -0.002300 0.996700\nvn -0.879800 0.469900 0.072200\nvn -0.084000 -0.013800 -0.996400\nvn 0.875500 -0.477900 -0.071800\nvn 0.084000 0.013800 0.996400\nvn -0.996500 -0.000000 0.083100\nvn -0.082700 0.000000 -0.996600\nvn 0.996500 -0.000000 -0.083100\nvn 0.082700 -0.000000 0.996600\nvn 0.145700 0.987000 0.068000\nvn 0.129100 -0.295500 0.946600\nvn -0.128400 0.297400 -0.946100\nvn 0.455100 0.889600 0.040100\nvn 0.092800 -0.294500 0.951100\nvn -0.090900 0.294400 -0.951400\nvn 0.880000 0.475000 0.005000\nvn -0.000600 -0.095300 0.995400\nvn 0.000400 0.095400 -0.995400\nvn 0.041200 0.280900 0.958900\nvn -0.041300 -0.280900 -0.958900\nvn 0.453700 -0.890200 0.040100\nvn 0.049600 0.292700 0.954900\nvn -0.049700 -0.291900 -0.955200\nvn 0.880200 -0.474600 0.005000\nvn 0.001700 0.193800 0.981000\nvn -0.001800 -0.191000 -0.981600\nvn 1.000000 -0.000300 -0.002400\nvn -0.020600 0.135500 0.990600\nvn 0.020400 -0.134900 -0.990600\nvn 0.093700 -0.993000 0.071400\nvn -0.983700 -0.176300 0.034600\nvn 0.130900 -0.991300 0.014600\nvn 0.043500 -0.044500 -0.998100\nvn -0.133700 0.990900 -0.014700\nvn -0.044900 0.045000 0.998000\nvn 0.445100 -0.894800 0.034400\nvn 0.078500 -0.003900 -0.996900\nvn -0.445100 0.894800 -0.034400\nvn -0.081000 0.002300 0.996700\nvn 0.879800 -0.469900 0.072200\nvn 0.083500 0.013700 -0.996400\nvn -0.875500 0.477900 -0.071800\nvn -0.084000 -0.013800 0.996400\nvn 0.101100 0.994800 0.013600\nvn 0.044300 0.045000 -0.998000\nvn -0.106300 -0.994200 -0.013800\nvn -0.044300 -0.045000 0.998000\nvn 0.445000 0.894800 0.034600\nvn 0.081000 0.002300 -0.996700\nvn -0.445100 -0.894800 -0.034600\nvn -0.081000 -0.002300 0.996700\nvn 0.879800 0.469900 0.072200\nvn 0.084000 -0.013800 -0.996400\nvn -0.875500 -0.477900 -0.071800\nvn -0.084000 0.013800 0.996400\nvn 0.996500 -0.000000 0.083100\nvn 0.082700 0.000000 -0.996600\nvn -0.996500 -0.000000 -0.083100\nvn -0.082700 -0.000000 0.996600\nvn -0.145700 0.987000 0.068000\nvn -0.129100 -0.295500 0.946600\nvn 0.128400 0.297400 -0.946100\nvn -0.455100 0.889600 0.040100\nvn -0.092800 -0.294500 0.951100\nvn 0.090900 0.294400 -0.951400\nvn -0.880000 0.475000 0.005000\nvn 0.000600 -0.095300 0.995400\nvn -0.000400 0.095400 -0.995400\nvn -0.041200 0.280900 0.958900\nvn 0.041300 -0.280900 -0.958900\nvn -0.453700 -0.890200 0.040100\nvn -0.049600 0.292700 0.954900\nvn 0.049700 -0.291900 -0.955200\nvn -0.880200 -0.474600 0.005000\nvn -0.001700 0.193800 0.981000\nvn 0.001800 -0.191000 -0.981600\nvn -1.000000 -0.000300 -0.002400\nvn 0.020600 0.135500 0.990600\nvn -0.020400 -0.134900 -0.990600\nvn -0.093700 -0.993000 0.071400\nvn 0.983700 -0.176300 0.034600\nvn 0.000000 -0.055800 -0.998400\nvn -0.000000 0.999900 -0.012100\nvn -0.000000 0.055700 0.998400\nvn 0.000000 -0.999900 0.012100\nvn -0.152000 -0.293800 0.943700\nvn 0.152600 0.293000 -0.943900\nvn -0.011800 0.997200 0.073700\nvn -0.000000 -0.054900 0.998500\nvn 0.000000 -0.999900 -0.012300\nvn 0.000000 0.054900 -0.998500\nvn -0.000000 0.999900 0.012300\nvn 0.011800 0.997200 0.073700\nvn 0.000000 0.997300 0.074000\nvn -0.152600 0.293000 -0.943900\nvn 0.000000 0.270100 -0.962800\nvn 0.152000 -0.293800 0.943700\nvn 0.000000 -0.271000 0.962600\nvn 0.146500 0.202700 -0.968200\nvn 0.096400 0.047900 -0.994200\nvn -0.063600 -0.135300 -0.988800\nvn 0.157200 -0.212400 0.964500\nvn -0.053600 -0.156000 -0.986300\nvn 0.063600 -0.135300 -0.988800\nvn -0.094200 -0.211700 -0.972800\nvn -0.070700 -0.160300 -0.984500\nvn 0.053600 -0.156000 -0.986300\nvn -0.145000 0.200000 -0.969000\nvn 0.094200 -0.211700 -0.972800\nvn 0.157200 0.212400 -0.964500\nvn 0.070700 -0.160300 -0.984500\nvn -0.146500 0.202700 -0.968200\nvn 0.145000 0.200000 -0.969000\nvn 0.000000 -0.161800 0.986800\nvn -0.096400 0.047900 -0.994200\nvn -0.001700 0.000200 1.000000\nvn 0.000000 1.000000 0.000000\nvn 0.000000 -0.842500 -0.538700\nvn -0.267200 -0.111400 -0.957200\nvn 0.700300 -0.591600 -0.399300\nvn 1.000000 0.000000 0.000000\nvn -1.000000 -0.000000 -0.000000\nvn -0.089100 0.996000 0.000000\nvn -0.447500 0.894300 -0.000000\nvn -0.881600 0.472000 -0.000000\nvn -0.070200 -0.997300 -0.019800\nvn -0.447500 -0.894300 0.000000\nvn -0.881600 -0.472000 -0.000000\nvn 0.089100 0.996000 0.000000\nvn 0.447500 0.894300 0.000000\nvn 0.881600 0.472000 0.000000\nvn 0.071700 -0.997200 0.020200\nvn 0.447500 -0.894300 0.000000\nvn 0.881600 -0.472000 0.000000\nvn -0.079700 0.000000 0.996800\nvn 0.079700 0.000000 0.996800\nvn 0.026000 0.000200 0.999700\nvn 0.109400 -0.000000 0.994000\nvn 0.001700 0.000200 1.000000\nvn -0.026000 0.000200 0.999700\nvn -0.109400 0.000000 0.994000\nvn 0.267200 -0.111400 -0.957200\nvn -0.000000 0.000000 1.000000\nvn -0.000000 -1.000000 0.000000\nvn 0.070200 -0.997300 -0.019800\nvn -0.071700 -0.997200 0.020200\nvn -0.700300 -0.591600 -0.399300\nvn -0.347000 0.195200 -0.917300\nvn 0.347000 0.195200 -0.917300\nvn 0.000000 0.208100 -0.978100\nvn 0.521100 0.177600 -0.834800\nvn -0.386900 -0.914800 -0.116000\nvn 0.000000 -0.986100 -0.165900\nvn 0.386900 -0.914800 -0.116000\nvn 0.016300 -0.987100 -0.159000\nvn -0.023200 0.988500 0.149400\nvn -0.016300 -0.987100 -0.159000\nvn -0.969300 -0.051200 0.240600\nvn 0.023200 0.988500 0.149400\nvn -0.448200 0.870800 0.201800\nvn 0.969300 -0.051200 0.240600\nvn 0.448200 0.870800 0.201800\nvn 0.000000 0.989300 0.146200\nvn -0.999300 -0.000000 -0.036100\nvn -0.985300 -0.000000 0.170700\nvn 0.132000 0.000000 0.991200\nvn 0.999600 0.000000 0.028100\nvn -0.999700 0.000000 0.023200\nvn -0.960800 0.027600 -0.276000\nvn -0.372200 0.184100 -0.909700\nvn 0.998600 -0.000000 -0.053500\nvn 0.968000 0.000000 0.250900\nvn -0.998200 -0.000000 -0.059300\nvn -0.004700 0.996500 0.083400\nvn 0.011900 -0.997500 -0.069900\nvn -0.012200 0.997600 0.068000\nvn 0.074900 -0.993500 -0.085600\nvn -0.075500 0.993600 0.083900\nvn 0.250900 -0.000000 -0.968000\nvn 0.004000 -0.996500 -0.083300\nvn 0.999300 0.000000 -0.036100\nvn 0.985300 0.000000 0.170700\nvn -0.132000 -0.000000 0.991200\nvn -0.999600 0.000000 0.028100\nvn 0.999700 0.000000 0.023200\nvn 0.960800 0.027600 -0.276000\nvn 0.372200 0.184100 -0.909700\nvn -0.998600 -0.000000 -0.053500\nvn -0.968000 -0.000000 0.250900\nvn 0.998200 0.000000 -0.059300\nvn 0.004700 0.996500 0.083400\nvn -0.011900 -0.997500 -0.069900\nvn 0.012200 0.997600 0.068000\nvn -0.074900 -0.993500 -0.085600\nvn 0.075500 0.993600 0.083900\nvn -0.250900 -0.000000 -0.968000\nvn -0.004000 -0.996500 -0.083300\nvn 0.363100 0.568600 -0.738200\nvn 0.363100 -0.568600 -0.738200\nvn 0.363100 -0.568600 0.738200\nvn 0.363100 0.568600 0.738200\nvn 0.411600 0.911400 -0.000000\nvn 0.328500 -0.000000 -0.944500\nvn 0.411600 -0.911400 0.000000\nvn 0.328500 -0.000000 0.944500\nvn 0.000000 0.610200 -0.792200\nvn 0.000000 -0.610200 -0.792200\nvn 0.000000 -0.610200 0.792200\nvn 0.000000 0.610200 0.792200\nvn 0.000000 -0.000000 -1.000000\nvn -0.954900 0.181200 -0.235300\nvn -0.954900 -0.181200 -0.235300\nvn -0.954900 -0.181200 0.235300\nvn -0.954900 0.181200 0.235300\nvn -0.965800 0.259200 -0.000000\nvn -0.944300 -0.000000 -0.329100\nvn -0.965800 -0.259200 0.000000\nvn -0.944300 0.000000 0.329100\nvn -0.274800 0.586700 -0.761700\nvn -0.274800 -0.586700 -0.761700\nvn -0.274800 -0.586700 0.761700\nvn -0.274800 0.586700 0.761700\nvn -0.314400 0.949300 -0.000000\nvn -0.247200 0.000000 -0.969000\nvn -0.314400 -0.949300 0.000000\nvn -0.247200 -0.000000 0.969000\nvn -0.958000 -0.286600 0.000000\nvn -0.932200 -0.000000 0.362000\nvn -0.944800 0.199900 -0.259500\nvn -0.944800 -0.199900 -0.259500\nvn -0.944800 -0.199900 0.259500\nvn -0.944800 0.199900 0.259500\nvn -0.958000 0.286600 -0.000000\nvn -0.932200 0.000000 -0.362100\nvn -0.998700 0.050700 -0.000000\nvn -0.997800 0.000000 -0.065800\nvn -0.998700 -0.050700 -0.000000\nvn -0.997800 0.000000 0.065800\nvn -0.998300 0.035900 -0.046600\nvn -0.998300 -0.035900 -0.046600\nvn -0.998300 -0.035900 0.046600\nvn -0.998300 0.035900 0.046600\nvn -0.124700 0.030600 -0.991700\nvn -0.188600 0.072400 -0.979400\nvn 0.974600 -0.224000 0.000000\nvn -0.124700 0.030600 0.991700\nvn -0.968200 0.250100 -0.000000\nvn 0.358100 -0.933700 -0.000000\nvn -0.188600 0.072400 0.979400\nvn -0.358100 0.933700 0.000000\nvn 0.897800 0.268700 0.348900\nvn 0.897800 0.268700 -0.348900\nvn 0.897800 -0.268700 -0.348900\nvn 0.920900 -0.389800 0.000000\nvn 0.876400 0.000000 0.481600\nvn 0.920900 0.389800 0.000000\nvn 0.876400 -0.000000 -0.481600\nvn 0.897800 -0.268700 0.348900\nvn 0.227900 -0.594200 0.771400\nvn 0.227900 0.594200 0.771400\nvn 0.227900 0.594200 -0.771400\nvn 0.227900 -0.594200 -0.771400\nvn 0.261800 -0.965100 0.000000\nvn 0.204500 -0.000000 0.978900\nvn 0.261800 0.965100 0.000000\nvn 0.204500 0.000000 -0.978900\nvn -0.363100 0.568600 -0.738200\nvn -0.363100 -0.568600 -0.738200\nvn -0.363100 -0.568600 0.738200\nvn -0.363100 0.568600 0.738200\nvn -0.411600 0.911400 -0.000000\nvn -0.328500 -0.000000 -0.944500\nvn -0.411600 -0.911400 0.000000\nvn -0.328500 0.000000 0.944500\nvn 0.954900 0.181200 -0.235300\nvn 0.954900 -0.181200 -0.235300\nvn 0.954900 -0.181200 0.235300\nvn 0.954900 0.181200 0.235300\nvn 0.965800 0.259200 -0.000000\nvn 0.944300 0.000000 -0.329100\nvn 0.965800 -0.259200 0.000000\nvn 0.944300 0.000000 0.329100\nvn 0.274800 0.586700 -0.761700\nvn 0.274800 -0.586700 -0.761700\nvn 0.274800 -0.586700 0.761700\nvn 0.274800 0.586700 0.761700\nvn 0.314400 0.949300 -0.000000\nvn 0.247200 0.000000 -0.969000\nvn 0.314400 -0.949300 0.000000\nvn 0.247200 -0.000000 0.969000\nvn 0.958000 -0.286600 0.000000\nvn 0.932200 0.000000 0.362000\nvn 0.944800 0.199900 -0.259500\nvn 0.944800 -0.199900 -0.259500\nvn 0.944800 -0.199900 0.259500\nvn 0.944800 0.199900 0.259500\nvn 0.958000 0.286600 -0.000000\nvn 0.932200 0.000000 -0.362000\nvn 0.998700 0.050700 -0.000000\nvn 0.997800 0.000000 -0.065800\nvn 0.998700 -0.050700 -0.000000\nvn 0.997800 0.000000 0.065800\nvn 0.998300 0.035900 -0.046600\nvn 0.998300 -0.035900 -0.046600\nvn 0.998300 -0.035900 0.046600\nvn 0.998300 0.035900 0.046600\nvn 0.124700 0.030600 -0.991700\nvn 0.188600 0.072400 -0.979400\nvn -0.974600 -0.224000 -0.000000\nvn 0.124700 0.030600 0.991700\nvn 0.968200 0.250100 0.000000\nvn -0.358100 -0.933700 0.000000\nvn 0.188600 0.072400 0.979400\nvn 0.358100 0.933700 0.000000\nvn -0.897800 0.268700 0.348900\nvn -0.897800 0.268700 -0.348900\nvn -0.897800 -0.268700 -0.348900\nvn -0.920900 -0.389800 0.000000\nvn -0.876400 -0.000000 0.481600\nvn -0.920900 0.389800 0.000000\nvn -0.876400 0.000000 -0.481600\nvn -0.897800 -0.268700 0.348900\nvn -0.227900 -0.594200 0.771400\nvn -0.227900 0.594200 0.771400\nvn -0.227900 0.594200 -0.771400\nvn -0.227900 -0.594200 -0.771400\nvn -0.261800 -0.965100 0.000000\nvn -0.204500 -0.000000 0.978900\nvn -0.261800 0.965100 0.000000\nvn -0.204500 0.000000 -0.978900\nvn 0.000000 0.247200 0.969000\nvn 0.000000 0.247100 -0.969000\nvn -0.039200 0.999200 -0.000000\nvn -0.040700 -0.999200 0.000000\nvn -0.004800 -1.000000 -0.000000\nvn 0.026100 0.999700 -0.000000\nvn 0.059900 -0.013800 -0.998100\nvn 0.009500 0.000000 1.000000\nvn 0.009500 0.000000 -1.000000\nvn 0.032800 0.005700 0.999400\nvn 0.032800 0.005700 -0.999400\nvn 0.059900 -0.013800 0.998100\nvn 0.039200 0.999200 0.000000\nvn 0.040700 -0.999200 0.000000\nvn 0.004800 -1.000000 -0.000000\nvn -0.026100 0.999700 -0.000000\nvn -0.059900 -0.013800 -0.998100\nvn -0.009500 -0.000000 1.000000\nvn -0.009500 0.000000 -1.000000\nvn -0.032800 0.005700 0.999400\nvn -0.032800 0.005700 -0.999400\nvn -0.059900 -0.013800 0.998100\nvn -0.124500 -0.839900 -0.528300\nvn 0.177200 -0.968400 -0.175600\nvn 0.313200 0.316100 0.895600\nvn -0.993800 0.078600 0.078600\nvn -0.942300 0.105000 -0.317800\nvn 0.344700 0.279000 -0.896300\nvn 0.080800 -0.857700 -0.507700\nvn -0.177200 -0.968400 -0.175600\nvn -0.324300 -0.301400 -0.896700\nvn -0.938600 -0.103400 -0.329000\nvn -0.344700 0.279000 -0.896300\nvn 0.942300 0.105000 -0.317800\nvn 0.993800 0.078600 0.078600\nvn 0.000000 -0.239900 0.970800\nvn 0.045400 -0.937800 -0.344100\nvn -0.346100 0.865800 -0.361300\nvn 0.000000 -0.292700 -0.956200\nvn -0.954700 -0.192300 0.227200\nvn 0.124500 -0.839900 -0.528300\nvn -0.313200 0.895600 0.316100\nvn 0.313200 0.895600 0.316100\nvn 0.346100 0.865800 -0.361300\nvn 0.954700 -0.192300 0.227200\nvn 0.000000 0.320500 0.947200\nvn 0.000000 0.256400 -0.966600\nvn -0.405000 -0.234500 0.883700\nvn 0.405000 -0.234500 0.883700\nvn 0.000000 0.942000 -0.335700\nvn 0.000000 0.947200 0.320500\nvn 0.000000 -0.975400 -0.220300\nvn -0.313200 0.316100 0.895600\nvn 0.945500 0.016200 -0.325200\nvn 0.000000 0.350300 -0.936700\nvn -0.045400 -0.937800 -0.344100\nvn 0.000000 -0.855400 -0.517900\nvn 0.324300 -0.301400 -0.896700\nvn 0.938600 -0.103400 -0.329000\nvn -0.922500 -0.294100 0.250100\nvn -0.276600 0.329400 -0.902800\nvn -0.490100 -0.552400 0.674300\nvn 0.000000 -0.621800 0.783100\nvn 0.948900 -0.102500 -0.298300\nvn 0.976400 -0.180100 0.119500\nvn -0.976400 -0.180100 0.119500\nvn 0.298700 -0.303700 -0.904700\nvn -0.298700 -0.303700 -0.904700\nvn -0.948900 -0.102500 -0.298300\nvn -0.348100 -0.192200 0.917600\nvn 0.348100 -0.192200 0.917600\nvn 0.000000 -0.994000 0.109800\nvn 0.861600 -0.080600 0.501200\nvn -0.639700 -0.631800 -0.437800\nvn -0.660400 -0.732600 -0.164700\nvn 0.660400 -0.732600 -0.164700\nvn 0.639700 -0.631800 -0.437800\nvn 0.000000 -0.988700 0.149800\nvn 0.000000 -0.632800 -0.774300\nvn -0.391900 -0.917100 0.073100\nvn 0.391900 -0.917100 0.073100\nvn 0.316100 -0.637900 -0.702200\nvn -0.316100 -0.637900 -0.702200\nvn -0.080800 -0.857700 -0.507700\nvn -0.228200 -0.877700 -0.421400\nvn 0.228200 -0.877700 -0.421400\nvn 0.000000 -0.909900 -0.414900\nvn 0.000000 -0.909800 -0.414900\nvn 0.249700 -0.882100 -0.399500\nvn -0.249700 -0.882100 -0.399500\nvn 0.276600 0.329400 -0.902800\nvn -0.945500 0.016200 -0.325200\nvn 0.922500 -0.294100 0.250100\nvn 0.490100 -0.552400 0.674300\nvn -0.861600 -0.080600 0.501200\nvn -0.000000 0.341200 0.940000\nvn 0.000000 0.942100 0.335400\nvn 0.000000 0.941100 -0.338100\nvn 0.000000 0.365800 -0.930700\nvn 0.000000 0.490300 0.871600\nvn 0.999200 0.036800 0.014600\nvn -0.999600 0.016000 -0.025200\nvn 0.999600 0.016400 0.025000\nvn -0.999200 0.036800 0.014600\nvn 0.999600 0.016000 -0.025200\nvn -0.999300 0.033400 -0.018500\nvn -0.999600 0.016400 0.025000\nvn 0.999300 0.033400 -0.018500\nvn -0.521100 0.177600 -0.834800\ns off\nf 2/1/1 6/1/1 5/1/1 1/1/1\nf 3/1/2 7/1/2 6/1/2 2/1/2\nf 4/1/3 8/1/3 7/1/3 3/1/3\nf 1/1/4 5/1/4 8/1/4 4/1/4\nf 6/1/5 10/1/5 9/1/5 5/1/5\nf 7/1/6 11/1/6 10/1/6 6/1/6\nf 8/1/7 12/1/7 11/1/7 7/1/7\nf 5/1/8 9/1/8 12/1/8 8/1/8\nf 10/1/9 14/1/9 13/1/9 9/1/9\nf 11/1/10 15/1/10 14/1/10 10/1/10\nf 12/1/11 16/1/11 15/1/11 11/1/11\nf 9/1/12 13/1/12 16/1/12 12/1/12\nf 18/1/13 22/1/13 21/1/13 17/1/13\nf 19/1/14 23/1/14 22/1/14 18/1/14\nf 20/1/15 24/1/15 23/1/15 19/1/15\nf 17/1/16 21/1/16 24/1/16 20/1/16\nf 26/1/17 18/1/17 17/1/17 25/1/17\nf 27/1/18 19/1/18 18/1/18 26/1/18\nf 28/1/19 20/1/19 19/1/19 27/1/19\nf 25/1/20 17/1/20 20/1/20 28/1/20\nf 30/1/21 26/1/21 25/1/21 29/1/21\nf 31/1/22 27/1/22 26/1/22 30/1/22\nf 32/1/23 28/1/23 27/1/23 31/1/23\nf 29/1/24 25/1/24 28/1/24 32/1/24\nf 30/1/25 29/1/25 13/1/25 14/1/25\nf 31/1/26 30/1/26 14/1/26 15/1/26\nf 32/1/27 31/1/27 15/1/27 16/1/27\nf 29/1/28 32/1/28 16/1/28 13/1/28\nf 58/1/29 57/1/29 49/1/29 50/1/29\nf 59/1/30 58/1/30 50/1/30 51/1/30\nf 57/1/31 60/1/31 52/1/31 49/1/31\nf 62/1/32 61/1/32 57/1/32 58/1/32\nf 63/1/33 62/1/33 58/1/33 59/1/33\nf 61/1/34 64/1/34 60/1/34 57/1/34\nf 54/1/35 53/1/35 61/1/35 62/1/35\nf 55/1/36 54/1/36 62/1/36 63/1/36\nf 53/1/37 56/1/37 64/1/37 61/1/37\nf 38/1/38 46/1/38 47/1/38 39/1/38\nf 40/1/39 48/1/39 45/1/39 37/1/39\nf 46/1/40 45/1/40 41/1/40 42/1/40\nf 47/1/41 46/1/41 42/1/41 43/1/41\nf 45/1/42 48/1/42 44/1/42 41/1/42\nf 42/1/43 41/1/43 33/1/43 34/1/43\nf 43/1/44 42/1/44 34/1/44 35/1/44\nf 41/1/45 44/1/45 36/1/45 33/1/45\nf 34/1/46 33/1/46 53/1/46 54/1/46\nf 35/1/47 34/1/47 54/1/47 55/1/47\nf 33/1/48 36/1/48 56/1/48 53/1/48\nf 37/1/49 45/1/49 46/1/49 38/1/49\nf 38/2/50 39/2/50 40/2/50 37/2/50\nf 66/1/51 65/1/51 69/1/51 70/1/51\nf 67/1/52 66/1/52 70/1/52 71/1/52\nf 68/1/53 67/1/53 71/1/53 72/1/53\nf 65/1/54 68/1/54 72/1/54 69/1/54\nf 70/1/55 69/1/55 73/1/55 74/1/55\nf 71/1/56 70/1/56 74/1/56 75/1/56\nf 72/1/57 71/1/57 75/1/57 76/1/57\nf 69/1/58 72/1/58 76/1/58 73/1/58\nf 74/1/59 73/1/59 77/1/59 78/1/59\nf 75/1/60 74/1/60 78/1/60 79/1/60\nf 76/1/61 75/1/61 79/1/61 80/1/61\nf 73/1/62 76/1/62 80/1/62 77/1/62\nf 82/1/63 81/1/63 85/1/63 86/1/63\nf 83/1/64 82/1/64 86/1/64 87/1/64\nf 84/1/65 83/1/65 87/1/65 88/1/65\nf 81/1/66 84/1/66 88/1/66 85/1/66\nf 90/1/67 89/1/67 81/1/67 82/1/67\nf 91/1/68 90/1/68 82/1/68 83/1/68\nf 92/1/69 91/1/69 83/1/69 84/1/69\nf 89/1/70 92/1/70 84/1/70 81/1/70\nf 94/1/71 93/1/71 89/1/71 90/1/71\nf 95/1/72 94/1/72 90/1/72 91/1/72\nf 96/1/73 95/1/73 91/1/73 92/1/73\nf 93/1/74 96/1/74 92/1/74 89/1/74\nf 94/1/75 78/1/75 77/1/75 93/1/75\nf 95/1/76 79/1/76 78/1/76 94/1/76\nf 96/1/77 80/1/77 79/1/77 95/1/77\nf 93/1/78 77/1/78 80/1/78 96/1/78\nf 122/1/79 114/1/79 113/1/79 121/1/79\nf 123/1/80 115/1/80 114/1/80 122/1/80\nf 121/1/81 113/1/81 116/1/81 124/1/81\nf 126/1/82 122/1/82 121/1/82 125/1/82\nf 127/1/83 123/1/83 122/1/83 126/1/83\nf 125/1/84 121/1/84 124/1/84 128/1/84\nf 118/1/85 126/1/85 125/1/85 117/1/85\nf 119/1/86 127/1/86 126/1/86 118/1/86\nf 117/1/87 125/1/87 128/1/87 120/1/87\nf 102/1/88 103/1/88 111/1/88 110/1/88\nf 104/1/89 101/1/89 109/1/89 112/1/89\nf 110/1/90 106/1/90 105/1/90 109/1/90\nf 111/1/91 107/1/91 106/1/91 110/1/91\nf 109/1/92 105/1/92 108/1/92 112/1/92\nf 106/1/93 98/1/93 97/1/93 105/1/93\nf 107/1/94 99/1/94 98/1/94 106/1/94\nf 105/1/95 97/1/95 100/1/95 108/1/95\nf 98/1/96 118/1/96 117/1/96 97/1/96\nf 99/1/97 119/1/97 118/1/97 98/1/97\nf 97/1/98 117/1/98 120/1/98 100/1/98\nf 101/1/99 102/1/99 110/1/99 109/1/99\nf 102/2/100 101/2/100 104/2/100 103/2/100\nf 2/1/101 66/1/101 67/1/101 3/1/101\nf 3/1/102 67/1/102 68/1/102 4/1/102\nf 4/1/103 68/1/103 65/1/103 1/1/103\nf 1/1/104 65/1/104 66/1/104 2/1/104\nf 130/1/105 114/1/105 115/1/105 131/1/105\nf 133/1/106 116/1/106 113/1/106 135/1/106\nf 135/1/107 113/1/107 114/1/107 130/1/107\nf 21/1/108 85/1/108 88/1/108 24/1/108\nf 24/1/109 88/1/109 87/1/109 23/1/109\nf 23/1/110 87/1/110 86/1/110 22/1/110\nf 22/1/111 86/1/111 85/1/111 21/1/111\nf 49/1/112 136/1/112 129/1/112 50/1/112\nf 136/1/113 135/1/113 130/1/113 129/1/113\nf 52/1/114 134/1/114 136/1/114 49/1/114\nf 134/1/115 133/1/115 135/1/115 136/1/115\nf 50/1/116 129/1/116 132/1/116 51/1/116\nf 129/1/117 130/1/117 131/1/117 132/1/117\nf 128/1/118 124/1/118 151/1/118 152/1/118\nf 120/1/119 128/1/119 152/1/119 150/1/119\nf 56/1/120 36/1/120 137/1/120 142/1/120\nf 52/1/121 134/1/121 154/1/121 141/1/121\nf 48/1/122 40/1/122 138/1/122 140/1/122\nf 100/1/123 120/1/123 150/1/123 145/1/123\nf 44/1/124 48/1/124 140/1/124 139/1/124\nf 36/1/125 44/1/125 139/1/125 137/1/125\nf 104/1/126 112/1/126 148/1/126 146/1/126\nf 52/1/127 60/1/127 143/1/127 141/1/127\nf 112/1/128 108/1/128 147/1/128 148/1/128\nf 116/1/129 133/1/129 153/1/129 149/1/129\nf 108/1/130 100/1/130 145/1/130 147/1/130\nf 60/1/131 64/1/131 144/1/131 143/1/131\nf 124/1/132 116/1/132 149/1/132 151/1/132\nf 134/1/133 133/1/133 153/1/133 154/1/133\nf 64/1/134 56/1/134 142/1/134 144/1/134\nf 189/3/135 188/3/135 167/3/135 164/3/135\nf 211/3/136 195/3/136 167/3/136 188/3/136\nf 207/3/137 214/3/137 191/3/137\nf 173/3/138 178/3/138 176/3/138 171/3/138\nf 199/3/139 179/3/139 192/3/139\nf 206/3/140 159/3/140 156/3/140 210/3/140\nf 198/3/141 183/3/141 180/3/141 202/3/141\nf 195/3/142 184/3/142 186/3/142 196/3/142\nf 196/3/143 186/3/143 185/3/143 197/3/143\nf 197/3/144 185/3/144 183/3/144 198/3/144\nf 199/3/145 164/3/145 166/3/145 200/3/145\nf 200/3/146 166/3/146 165/3/146 201/3/146\nf 201/3/147 165/3/147 163/3/147 202/3/147\nf 203/3/148 160/3/148 162/3/148 204/3/148\nf 204/3/149 162/3/149 161/3/149 205/3/149\nf 205/3/150 161/3/150 159/3/150 206/3/150\nf 207/3/151 172/3/151 174/3/151 208/3/151\nf 208/3/152 174/3/152 173/3/152 209/3/152\nf 209/3/153 173/3/153 171/3/153 210/3/153\nf 166/3/154 169/3/154 170/3/154 165/3/154\nf 161/3/155 162/3/155 157/3/155 158/3/155\nf 157/3/156 162/3/156 160/3/156 155/3/156\nf 159/3/157 161/3/157 158/3/157 156/3/157\nf 155/3/158 160/3/158 187/3/158 190/3/158\nf 164/3/159 167/3/159 169/3/159 166/3/159\nf 165/3/160 170/3/160 168/3/160 163/3/160\nf 183/3/161 185/3/161 182/3/161 180/3/161\nf 188/3/162 189/3/162 190/3/162 187/3/162\nf 211/3/136 188/3/136 187/3/136 212/3/136\nf 213/3/137 192/3/137 191/3/137 214/3/137\nf 203/3/136 212/3/136 187/3/136 160/3/136\nf 175/3/136 194/3/136 212/3/136 203/3/136\nf 189/3/163 213/3/163 214/3/163 190/3/163\nf 193/3/136 211/3/136 212/3/136 194/3/136\nf 158/3/153 209/3/153 210/3/153 156/3/153\nf 157/3/152 208/3/152 209/3/152 158/3/152\nf 155/3/164 207/3/164 208/3/164 157/3/164\nf 178/3/150 205/3/150 206/3/150 176/3/150\nf 177/3/149 204/3/149 205/3/149 178/3/149\nf 175/3/148 203/3/148 204/3/148 177/3/148\nf 182/3/147 201/3/147 202/3/147 180/3/147\nf 181/3/146 200/3/146 201/3/146 182/3/146\nf 179/3/165 199/3/165 200/3/165 181/3/165\nf 170/3/144 197/3/144 198/3/144 168/3/144\nf 169/3/143 196/3/143 197/3/143 170/3/143\nf 167/3/142 195/3/142 196/3/142 169/3/142\nf 168/3/141 198/3/141 202/3/141 163/3/141\nf 176/3/140 206/3/140 210/3/140 171/3/140\nf 189/3/163 164/3/163 199/3/163 213/3/163\nf 155/3/163 190/3/163 214/3/163 207/3/163\nf 193/3/136 184/3/136 195/3/136 211/3/136\nf 213/3/137 199/3/137 192/3/137\nf 172/3/166 207/3/166 191/3/166\nf 225/4/167 226/4/167 217/4/167 218/4/167\nf 223/4/168 222/4/168 221/4/168 224/4/168\nf 218/4/169 217/4/169 221/4/169 222/4/169\nf 220/4/170 223/4/170 224/4/170 219/4/170\nf 225/4/171 231/4/171 228/4/171 216/4/171\nf 222/4/172 236/4/172 230/4/172 218/4/172\nf 220/4/173 234/4/173 237/4/173 223/4/173\nf 218/4/174 230/4/174 231/4/174 225/4/174\nf 226/4/175 232/4/175 229/4/175 217/4/175\nf 223/4/176 237/4/176 236/4/176 222/4/176\nf 216/4/177 228/4/177 227/4/177 215/4/177\nf 221/4/178 235/4/178 238/4/178 224/4/178\nf 215/4/179 227/4/179 232/4/179 226/4/179\nf 219/4/180 233/4/180 234/4/180 220/4/180\nf 224/4/181 238/4/181 233/4/181 219/4/181\nf 217/4/182 229/4/182 235/4/182 221/4/182\nf 239/5/183 240/5/183 242/5/183 241/5/183\nf 239/5/184 241/5/184 244/5/184 243/5/184\nf 243/5/185 244/5/185 246/5/185 245/5/185\nf 245/5/186 246/5/186 248/5/186 247/5/186\nf 259/5/187 260/5/187 249/5/187 250/5/187\nf 250/5/188 249/5/188 251/5/188 252/5/188\nf 252/5/189 251/5/189 253/5/189 254/5/189\nf 247/5/190 248/5/190 256/5/190 255/5/190\nf 255/5/191 256/5/191 258/5/191 257/5/191\nf 242/5/192 240/5/192 260/5/192 259/5/192\nf 240/5/136 239/5/136 261/5/136 262/5/136\nf 241/5/163 242/5/163 264/5/163 263/5/163\nf 239/5/136 243/5/136 265/5/136 261/5/136\nf 244/5/163 241/5/163 263/5/163 266/5/163\nf 243/5/136 245/5/136 267/5/136 265/5/136\nf 246/5/163 244/5/163 266/5/163 268/5/163\nf 245/5/136 247/5/136 269/5/136 267/5/136\nf 248/5/163 246/5/163 268/5/163 270/5/163\nf 242/5/163 259/5/163 281/5/163 264/5/163\nf 249/5/193 260/5/193 282/5/193 271/5/193\nf 250/5/194 252/5/194 274/5/194 272/5/194\nf 251/5/195 249/5/195 271/5/195 273/5/195\nf 252/5/196 254/5/196 276/5/196 274/5/196\nf 253/5/197 251/5/197 273/5/197 275/5/197\nf 247/5/136 255/5/136 277/5/136 269/5/136\nf 256/5/163 248/5/163 270/5/163 278/5/163\nf 257/5/198 258/5/198 280/5/198 279/5/198\nf 255/5/136 257/5/136 279/5/136 277/5/136\nf 258/5/163 256/5/163 278/5/163 280/5/163\nf 259/5/199 250/5/199 272/5/199 281/5/199\nf 260/5/136 240/5/136 262/5/136 282/5/136\nf 283/5/200 285/5/200 286/5/200 284/5/200\nf 283/5/201 287/5/201 288/5/201 285/5/201\nf 287/5/202 289/5/202 290/5/202 288/5/202\nf 289/5/203 291/5/203 292/5/203 290/5/203\nf 303/5/204 294/5/204 293/5/204 304/5/204\nf 294/5/205 296/5/205 295/5/205 293/5/205\nf 296/5/206 298/5/206 297/5/206 295/5/206\nf 291/5/207 299/5/207 300/5/207 292/5/207\nf 299/5/208 301/5/208 302/5/208 300/5/208\nf 286/5/209 303/5/209 304/5/209 284/5/209\nf 284/5/136 306/5/136 305/5/136 283/5/136\nf 285/5/163 307/5/163 308/5/163 286/5/163\nf 283/5/136 305/5/136 309/5/136 287/5/136\nf 288/5/163 310/5/163 307/5/163 285/5/163\nf 287/5/136 309/5/136 311/5/136 289/5/136\nf 290/5/163 312/5/163 310/5/163 288/5/163\nf 289/5/136 311/5/136 313/5/136 291/5/136\nf 292/5/163 314/5/163 312/5/163 290/5/163\nf 286/5/163 308/5/163 325/5/163 303/5/163\nf 293/5/210 315/5/210 326/5/210 304/5/210\nf 294/5/211 316/5/211 318/5/211 296/5/211\nf 295/5/212 317/5/212 315/5/212 293/5/212\nf 296/5/213 318/5/213 320/5/213 298/5/213\nf 297/5/214 319/5/214 317/5/214 295/5/214\nf 291/5/136 313/5/136 321/5/136 299/5/136\nf 300/5/163 322/5/163 314/5/163 292/5/163\nf 301/5/215 323/5/215 324/5/215 302/5/215\nf 299/5/136 321/5/136 323/5/136 301/5/136\nf 302/5/163 324/5/163 322/5/163 300/5/163\nf 303/5/216 325/5/216 316/5/216 294/5/216\nf 304/5/136 326/5/136 306/5/136 284/5/136\nf 333/6/217 334/6/217 342/6/217 341/6/217\nf 331/6/218 332/6/218 340/6/218 339/6/218\nf 329/6/219 330/6/219 338/6/219 337/6/219\nf 327/6/220 328/6/220 336/6/220 335/6/220\nf 334/6/221 327/6/221 335/6/221 342/6/221\nf 332/6/222 333/6/222 341/6/222 340/6/222\nf 330/6/223 331/6/223 339/6/223 338/6/223\nf 328/6/224 329/6/224 337/6/224 336/6/224\nf 334/6/225 333/6/225 349/6/225 350/6/225\nf 332/6/226 331/6/226 347/6/226 348/6/226\nf 330/6/227 329/6/227 345/6/227 346/6/227\nf 328/6/228 327/6/228 343/6/228 344/6/228\nf 327/6/136 334/6/136 350/6/136 343/6/136\nf 333/6/229 332/6/229 348/6/229 349/6/229\nf 331/6/163 330/6/163 346/6/163 347/6/163\nf 329/6/162 328/6/162 344/6/162 345/6/162\nf 350/7/230 349/7/230 357/7/230 358/7/230\nf 348/7/231 347/7/231 355/7/231 356/7/231\nf 346/7/232 345/7/232 353/7/232 354/7/232\nf 344/7/233 343/7/233 351/7/233 352/7/233\nf 343/7/234 350/7/234 358/7/234 351/7/234\nf 349/7/235 348/7/235 356/7/235 357/7/235\nf 347/7/236 346/7/236 354/7/236 355/7/236\nf 345/7/237 344/7/237 352/7/237 353/7/237\nf 353/8/140 352/8/140 360/8/140 361/8/140\nf 358/8/140 357/8/140 365/8/140 366/8/140\nf 356/8/140 355/8/140 363/8/140 364/8/140\nf 354/8/140 353/8/140 361/8/140 362/8/140\nf 352/8/140 351/8/140 359/8/140 360/8/140\nf 351/8/140 358/8/140 366/8/140 359/8/140\nf 357/8/140 356/8/140 364/8/140 365/8/140\nf 355/8/140 354/8/140 362/8/140 363/8/140\nf 359/8/136 366/8/136 374/8/136 367/8/136\nf 365/8/229 364/8/229 372/8/229 373/8/229\nf 363/8/163 362/8/163 370/8/163 371/8/163\nf 361/8/162 360/8/162 368/8/162 369/8/162\nf 366/8/225 365/8/225 373/8/225 374/8/225\nf 364/8/226 363/8/226 371/8/226 372/8/226\nf 362/8/227 361/8/227 369/8/227 370/8/227\nf 360/8/228 359/8/228 367/8/228 368/8/228\nf 370/8/141 369/8/141 377/8/141 378/8/141\nf 368/8/141 367/8/141 375/8/141 376/8/141\nf 367/8/141 374/8/141 382/8/141 375/8/141\nf 373/8/141 372/8/141 380/8/141 381/8/141\nf 371/8/141 370/8/141 378/8/141 379/8/141\nf 369/8/141 368/8/141 376/8/141 377/8/141\nf 374/8/141 373/8/141 381/8/141 382/8/141\nf 372/8/141 371/8/141 379/8/141 380/8/141\nf 382/7/238 381/7/238 389/7/238 390/7/238\nf 380/7/239 379/7/239 387/7/239 388/7/239\nf 378/7/240 377/7/240 385/7/240 386/7/240\nf 376/7/241 375/7/241 383/7/241 384/7/241\nf 382/7/242 390/7/242 410/7/242 408/7/242\nf 381/7/243 380/7/243 388/7/243 389/7/243\nf 379/7/244 378/7/244 386/7/244 387/7/244\nf 377/7/245 376/7/245 384/7/245 385/7/245\nf 387/7/246 386/7/246 394/7/246 395/7/246\nf 385/7/247 384/7/247 392/7/247 393/7/247\nf 390/7/248 389/7/248 397/7/248 398/7/248\nf 388/7/249 387/7/249 395/7/249 396/7/249\nf 386/7/250 385/7/250 393/7/250 394/7/250\nf 384/7/251 383/7/251 391/7/251 392/7/251\nf 383/7/252 390/7/252 398/7/252 391/7/252\nf 389/7/253 388/7/253 396/7/253 397/7/253\nf 391/7/254 398/7/254 406/7/254 399/7/254\nf 397/7/255 396/7/255 404/7/255 405/7/255\nf 395/7/256 394/7/256 402/7/256 403/7/256\nf 393/7/257 392/7/257 400/7/257 401/7/257\nf 398/7/258 397/7/258 405/7/258 406/7/258\nf 396/7/259 395/7/259 403/7/259 404/7/259\nf 394/7/260 393/7/260 401/7/260 402/7/260\nf 392/7/261 391/7/261 399/7/261 400/7/261\nf 406/7/141 405/7/141 609/7/141\nf 408/7/262 410/7/262 414/7/262 412/7/262\nf 383/7/242 375/7/242 407/7/242 409/7/242\nf 375/7/242 382/7/242 408/7/242 407/7/242\nf 390/7/242 383/7/242 409/7/242 410/7/242\nf 412/7/263 414/7/263 418/7/263 416/7/263\nf 407/7/264 408/7/264 412/7/264 411/7/264\nf 409/7/265 407/7/265 411/7/265 413/7/265\nf 410/7/266 409/7/266 413/7/266 414/7/266\nf 411/7/267 412/7/267 416/7/267 415/7/267\nf 413/7/268 411/7/268 415/7/268 417/7/268\nf 414/7/269 413/7/269 417/7/269 418/7/269\nf 335/6/140 336/6/140 420/6/140 419/6/140\nf 342/6/140 335/6/140 419/6/140 426/6/140\nf 340/6/140 341/6/140 425/6/140 424/6/140\nf 338/6/140 339/6/140 423/6/140 422/6/140\nf 336/6/140 337/6/140 421/6/140 420/6/140\nf 341/6/140 342/6/140 426/6/140 425/6/140\nf 339/6/140 340/6/140 424/6/140 423/6/140\nf 337/6/140 338/6/140 422/6/140 421/6/140\nf 423/6/270 424/6/270 432/6/270 431/6/270\nf 421/6/271 422/6/271 430/6/271 429/6/271\nf 419/6/272 420/6/272 428/6/272 427/6/272\nf 426/6/273 419/6/273 427/6/273 434/6/273\nf 424/6/274 425/6/274 433/6/274 432/6/274\nf 422/6/275 423/6/275 431/6/275 430/6/275\nf 420/6/276 421/6/276 429/6/276 428/6/276\nf 425/6/277 426/6/277 434/6/277 433/6/277\nf 433/6/278 434/6/278 442/6/278 441/6/278\nf 431/6/279 432/6/279 440/6/279 439/6/279\nf 429/6/280 430/6/280 438/6/280 437/6/280\nf 427/6/281 428/6/281 436/6/281 435/6/281\nf 434/6/282 427/6/282 435/6/282 442/6/282\nf 432/6/283 433/6/283 441/6/283 440/6/283\nf 430/6/284 431/6/284 439/6/284 438/6/284\nf 428/6/285 429/6/285 437/6/285 436/6/285\nf 449/6/286 457/6/286 458/6/286 450/6/286\nf 447/6/287 455/6/287 456/6/287 448/6/287\nf 445/6/288 453/6/288 454/6/288 446/6/288\nf 443/6/289 451/6/289 452/6/289 444/6/289\nf 450/6/290 458/6/290 451/6/290 443/6/290\nf 448/6/291 456/6/291 457/6/291 449/6/291\nf 446/6/292 454/6/292 455/6/292 447/6/292\nf 444/6/293 452/6/293 453/6/293 445/6/293\nf 450/6/225 466/6/225 465/6/225 449/6/225\nf 448/6/226 464/6/226 463/6/226 447/6/226\nf 446/6/227 462/6/227 461/6/227 445/6/227\nf 444/6/228 460/6/228 459/6/228 443/6/228\nf 443/6/136 459/6/136 466/6/136 450/6/136\nf 449/6/229 465/6/229 464/6/229 448/6/229\nf 447/6/163 463/6/163 462/6/163 446/6/163\nf 445/6/162 461/6/162 460/6/162 444/6/162\nf 466/7/294 474/7/294 473/7/294 465/7/294\nf 464/7/295 472/7/295 471/7/295 463/7/295\nf 462/7/296 470/7/296 469/7/296 461/7/296\nf 460/7/297 468/7/297 467/7/297 459/7/297\nf 459/7/298 467/7/298 474/7/298 466/7/298\nf 465/7/299 473/7/299 472/7/299 464/7/299\nf 463/7/300 471/7/300 470/7/300 462/7/300\nf 461/7/301 469/7/301 468/7/301 460/7/301\nf 469/8/141 477/8/141 476/8/141 468/8/141\nf 474/8/141 482/8/141 481/8/141 473/8/141\nf 472/8/141 480/8/141 479/8/141 471/8/141\nf 470/8/141 478/8/141 477/8/141 469/8/141\nf 468/8/141 476/8/141 475/8/141 467/8/141\nf 467/8/141 475/8/141 482/8/141 474/8/141\nf 473/8/141 481/8/141 480/8/141 472/8/141\nf 471/8/141 479/8/141 478/8/141 470/8/141\nf 475/8/136 483/8/136 490/8/136 482/8/136\nf 481/8/229 489/8/229 488/8/229 480/8/229\nf 479/8/163 487/8/163 486/8/163 478/8/163\nf 477/8/162 485/8/162 484/8/162 476/8/162\nf 482/8/225 490/8/225 489/8/225 481/8/225\nf 480/8/226 488/8/226 487/8/226 479/8/226\nf 478/8/227 486/8/227 485/8/227 477/8/227\nf 476/8/228 484/8/228 483/8/228 475/8/228\nf 486/8/140 494/8/140 493/8/140 485/8/140\nf 484/8/140 492/8/140 491/8/140 483/8/140\nf 483/8/140 491/8/140 498/8/140 490/8/140\nf 489/8/140 497/8/140 496/8/140 488/8/140\nf 487/8/140 495/8/140 494/8/140 486/8/140\nf 485/8/140 493/8/140 492/8/140 484/8/140\nf 490/8/140 498/8/140 497/8/140 489/8/140\nf 488/8/140 496/8/140 495/8/140 487/8/140\nf 498/7/302 506/7/302 505/7/302 497/7/302\nf 496/7/303 504/7/303 503/7/303 495/7/303\nf 494/7/304 502/7/304 501/7/304 493/7/304\nf 492/7/305 500/7/305 499/7/305 491/7/305\nf 498/7/306 524/7/306 526/7/306 506/7/306\nf 497/7/307 505/7/307 504/7/307 496/7/307\nf 495/7/308 503/7/308 502/7/308 494/7/308\nf 493/7/309 501/7/309 500/7/309 492/7/309\nf 503/7/310 511/7/310 510/7/310 502/7/310\nf 501/7/311 509/7/311 508/7/311 500/7/311\nf 506/7/312 514/7/312 513/7/312 505/7/312\nf 504/7/313 512/7/313 511/7/313 503/7/313\nf 502/7/314 510/7/314 509/7/314 501/7/314\nf 500/7/315 508/7/315 507/7/315 499/7/315\nf 499/7/316 507/7/316 514/7/316 506/7/316\nf 505/7/317 513/7/317 512/7/317 504/7/317\nf 507/7/318 515/7/318 522/7/318 514/7/318\nf 513/7/319 521/7/319 520/7/319 512/7/319\nf 511/7/320 519/7/320 518/7/320 510/7/320\nf 509/7/321 517/7/321 516/7/321 508/7/321\nf 514/7/322 522/7/322 521/7/322 513/7/322\nf 512/7/323 520/7/323 519/7/323 511/7/323\nf 510/7/324 518/7/324 517/7/324 509/7/324\nf 508/7/325 516/7/325 515/7/325 507/7/325\nf 516/7/140 517/7/140 610/7/140\nf 524/7/326 528/7/326 530/7/326 526/7/326\nf 499/7/306 525/7/306 523/7/306 491/7/306\nf 491/7/306 523/7/306 524/7/306 498/7/306\nf 506/7/306 526/7/306 525/7/306 499/7/306\nf 528/7/327 532/7/327 534/7/327 530/7/327\nf 523/7/328 527/7/328 528/7/328 524/7/328\nf 525/7/329 529/7/329 527/7/329 523/7/329\nf 526/7/330 530/7/330 529/7/330 525/7/330\nf 527/7/331 531/7/331 532/7/331 528/7/331\nf 529/7/332 533/7/332 531/7/332 527/7/332\nf 530/7/333 534/7/333 533/7/333 529/7/333\nf 451/6/141 535/6/141 536/6/141 452/6/141\nf 458/6/141 542/6/141 535/6/141 451/6/141\nf 456/6/141 540/6/141 541/6/141 457/6/141\nf 454/6/141 538/6/141 539/6/141 455/6/141\nf 452/6/141 536/6/141 537/6/141 453/6/141\nf 457/6/141 541/6/141 542/6/141 458/6/141\nf 455/6/141 539/6/141 540/6/141 456/6/141\nf 453/6/141 537/6/141 538/6/141 454/6/141\nf 539/6/334 547/6/334 548/6/334 540/6/334\nf 537/6/335 545/6/335 546/6/335 538/6/335\nf 535/6/336 543/6/336 544/6/336 536/6/336\nf 542/6/337 550/6/337 543/6/337 535/6/337\nf 540/6/338 548/6/338 549/6/338 541/6/338\nf 538/6/339 546/6/339 547/6/339 539/6/339\nf 536/6/340 544/6/340 545/6/340 537/6/340\nf 541/6/341 549/6/341 550/6/341 542/6/341\nf 549/6/342 557/6/342 558/6/342 550/6/342\nf 547/6/343 555/6/343 556/6/343 548/6/343\nf 545/6/344 553/6/344 554/6/344 546/6/344\nf 543/6/345 551/6/345 552/6/345 544/6/345\nf 550/6/346 558/6/346 551/6/346 543/6/346\nf 548/6/347 556/6/347 557/6/347 549/6/347\nf 546/6/348 554/6/348 555/6/348 547/6/348\nf 544/6/349 552/6/349 553/6/349 545/6/349\nf 415/7/350 531/7/350 533/7/350 417/7/350\nf 417/7/136 533/7/136 534/7/136 418/7/136\nf 418/7/351 534/7/351 532/7/351 416/7/351\nf 416/7/163 532/7/163 531/7/163 415/7/163\nf 559/1/352 560/1/352 562/1/352 561/1/352\nf 561/1/141 562/1/141 564/1/141 563/1/141\nf 563/1/353 564/1/353 566/1/353 565/1/353\nf 568/1/354 570/1/354 569/1/354 567/1/354\nf 570/1/140 572/1/140 571/1/140 569/1/140\nf 572/1/355 574/1/355 573/1/355 571/1/355\nf 564/1/356 571/1/356 573/1/356 566/1/356\nf 563/1/357 572/1/357 570/1/357 561/1/357\nf 562/1/358 569/1/358 571/1/358 564/1/358\nf 561/1/359 570/1/359 568/1/359 559/1/359\nf 560/1/360 567/1/360 569/1/360 562/1/360\nf 565/1/361 574/1/361 572/1/361 563/1/361\nf 575/1/362 577/1/362 578/1/362 576/1/362\nf 577/1/140 579/1/140 580/1/140 578/1/140\nf 579/1/363 581/1/363 582/1/363 580/1/363\nf 584/1/364 583/1/364 585/1/364 586/1/364\nf 586/1/141 585/1/141 587/1/141 588/1/141\nf 588/1/365 587/1/365 589/1/365 590/1/365\nf 580/1/366 582/1/366 589/1/366 587/1/366\nf 579/1/367 577/1/367 586/1/367 588/1/367\nf 578/1/368 580/1/368 587/1/368 585/1/368\nf 577/1/369 575/1/369 584/1/369 586/1/369\nf 576/1/370 578/1/370 585/1/370 583/1/370\nf 581/1/371 579/1/371 588/1/371 590/1/371\nf 651/9/372 642/9/372 598/9/372 622/9/372\nf 655/9/373 644/9/373 593/9/373 624/9/373\nf 612/10/374 595/10/374 605/10/374 617/10/374\nf 591/11/375 597/11/375 606/11/375 599/11/375\nf 591/11/376 599/11/376 608/11/376 600/11/376\nf 613/11/377 620/11/377 607/11/377 602/11/377\nf 638/9/378 641/9/378 596/9/378 594/9/378\nf 647/9/379 652/9/379 623/9/379 603/9/379\nf 634/11/380 653/11/380 646/11/380 629/11/380\nf 625/11/381 629/11/381 646/11/381 637/11/381\nf 614/11/382 600/11/382 608/11/382 619/11/382\nf 592/11/383 602/11/383 607/11/383 604/11/383\nf 592/11/384 604/11/384 605/11/384 595/11/384\nf 631/10/385 650/10/385 649/10/385 632/10/385\nf 644/9/386 638/9/386 594/9/386 593/9/386\nf 615/11/387 619/11/387 608/11/387 599/11/387\nf 633/11/388 654/11/388 653/11/388 634/11/388\nf 625/11/389 637/11/389 643/11/389 628/11/389\nf 641/9/390 648/9/390 621/9/390 596/9/390\nf 615/11/391 599/11/391 606/11/391 618/11/391\nf 616/11/392 617/11/392 605/11/392 604/11/392\nf 616/11/393 604/11/393 607/11/393 620/11/393\nf 626/11/394 627/11/394 640/11/394 639/11/394\nf 400/7/141 399/7/141 609/7/141\nf 609/7/141 405/7/141 404/7/141\nf 609/7/141 403/7/141 402/7/141\nf 515/7/140 516/7/140 610/7/140\nf 522/7/140 610/7/140 521/7/140\nf 610/7/140 518/7/140 519/7/140\nf 612/10/395 617/10/395 618/10/395 611/10/395\nf 614/11/396 619/11/396 620/11/396 613/11/396\nf 631/10/397 628/10/397 643/10/397 650/10/397\nf 632/10/398 649/10/398 640/10/398 627/10/398\nf 616/11/399 620/11/399 619/11/399 615/11/399\nf 615/11/400 618/11/400 617/11/400 616/11/400\nf 652/9/401 655/9/401 624/9/401 623/9/401\nf 611/10/402 618/10/402 606/10/402 597/10/402\nf 593/11/403 594/11/403 664/11/403 658/11/403\nf 623/11/404 624/11/404 659/11/404 656/11/404\nf 636/9/405 647/9/405 603/9/405 601/9/405\nf 648/9/406 651/9/406 622/9/406 621/9/406\nf 633/11/407 630/11/407 645/11/407 654/11/407\nf 626/11/408 639/11/408 645/11/408 630/11/408\nf 598/11/409 601/11/409 665/11/409 662/11/409\nf 603/11/410 623/11/410 656/11/410 657/11/410\nf 622/11/411 598/11/411 662/11/411 663/11/411\nf 621/11/412 622/11/412 663/11/412 660/11/412\nf 613/11/388 633/11/388 634/11/388 614/11/388\nf 592/11/413 626/11/413 630/11/413 602/11/413\nf 592/11/414 595/11/414 627/11/414 626/11/414\nf 591/11/415 625/11/415 628/11/415 597/11/415\nf 613/11/416 602/11/416 630/11/416 633/11/416\nf 614/11/417 634/11/417 629/11/417 600/11/417\nf 591/11/418 600/11/418 629/11/418 625/11/418\nf 611/10/419 597/10/419 628/10/419 631/10/419\nf 612/10/420 632/10/420 627/10/420 595/10/420\nf 631/12/421 632/12/421 635/12/421\nf 612/13/422 635/13/422 632/13/422\nf 647/11/423 636/11/423 637/11/423 646/11/423\nf 636/11/424 642/11/424 643/11/424 637/11/424\nf 641/11/425 638/11/425 639/11/425 640/11/425\nf 638/11/426 644/11/426 645/11/426 639/11/426\nf 649/11/427 650/11/427 651/11/427 648/11/427\nf 653/11/428 654/11/428 655/11/428 652/11/428\nf 642/11/429 651/11/429 650/11/429 643/11/429\nf 648/11/430 641/11/430 640/11/430 649/11/430\nf 644/11/431 655/11/431 654/11/431 645/11/431\nf 652/11/432 647/11/432 646/11/432 653/11/432\nf 642/9/433 636/9/433 601/9/433 598/9/433\nf 666/9/434 663/9/434 662/9/434 665/9/434\nf 664/9/435 661/9/435 660/9/435 667/9/435\nf 666/9/436 667/9/436 660/9/436 663/9/436\nf 656/9/437 659/9/437 667/9/437 666/9/437\nf 658/9/438 664/9/438 667/9/438 659/9/438\nf 656/9/439 666/9/439 665/9/439 657/9/439\nf 624/11/440 593/11/440 658/11/440 659/11/440\nf 601/11/441 603/11/441 657/11/441 665/11/441\nf 594/11/442 596/11/442 661/11/442 664/11/442\nf 596/11/443 621/11/443 660/11/443 661/11/443\nf 631/13/444 635/13/444 611/13/444\nf 612/12/445 611/12/445 635/12/445\nf 673/5/446 670/5/446 671/5/446 672/5/446\nf 672/5/447 668/5/447 669/5/447 673/5/447\nf 674/5/448 669/5/448 668/5/448 675/5/448\nf 676/5/449 671/5/449 670/5/449 677/5/449\nf 671/5/450 678/5/450 679/5/450 672/5/450\nf 674/5/451 685/5/451 682/5/451 669/5/451\nf 676/5/452 687/5/452 678/5/452 671/5/452\nf 673/5/453 680/5/453 681/5/453 670/5/453\nf 668/5/454 683/5/454 684/5/454 675/5/454\nf 669/5/455 682/5/455 680/5/455 673/5/455\nf 670/5/456 681/5/456 686/5/456 677/5/456\nf 672/5/457 679/5/457 683/5/457 668/5/457\nf 216/4/458 215/4/458 226/4/458 225/4/458\nf 401/7/141 400/7/141 609/7/141\nf 403/7/141 609/7/141 404/7/141\nf 399/7/141 406/7/141 609/7/141\nf 401/7/141 609/7/141 402/7/141\nf 610/7/140 520/7/140 521/7/140\nf 517/7/140 518/7/140 610/7/140\nf 522/7/140 515/7/140 610/7/140\nf 520/7/140 610/7/140 519/7/140\n"
  },
  {
    "path": "browser/data/fonts/Source Sans Pro_Bold.json",
    "content": "{\"glyphs\":{\"0\":{\"ha\":733,\"x_min\":51,\"x_max\":682,\"o\":\"m 367 -17 q 238 13 296 -17 q 138 101 179 43 q 74 246 97 160 q 51 444 51 332 q 74 642 51 557 q 138 784 97 726 q 238 870 179 842 q 367 899 296 899 q 496 870 438 899 q 595 784 554 842 q 659 642 636 726 q 682 444 682 557 q 659 246 682 332 q 595 101 636 160 q 496 13 554 43 q 367 -17 438 -17 m 367 142 q 415 155 393 142 q 454 203 438 168 q 480 296 471 238 q 489 444 489 354 q 480 592 489 535 q 454 683 471 650 q 415 728 438 715 q 367 740 393 740 q 319 728 342 740 q 281 683 297 715 q 254 592 264 650 q 244 444 244 535 q 254 296 244 354 q 281 203 264 238 q 319 155 297 168 q 367 142 342 142 z \"},\"1\":{\"ha\":733,\"x_min\":97,\"x_max\":658,\"o\":\"m 97 0 l 97 165 l 289 165 l 289 675 l 124 675 l 124 801 q 246 835 196 815 q 343 882 296 854 l 493 882 l 493 165 l 658 165 l 658 0 l 97 0 z \"},\"2\":{\"ha\":733,\"x_min\":42,\"x_max\":672,\"o\":\"m 51 0 l 51 117 q 206 265 136 196 q 327 394 276 333 q 406 506 378 454 q 435 606 435 558 q 401 705 435 671 q 310 739 368 739 q 224 712 261 739 q 153 649 186 685 l 42 758 q 175 863 107 828 q 338 899 243 899 q 456 878 403 899 q 549 822 510 858 q 608 733 588 785 q 629 618 629 682 q 606 505 629 563 q 542 390 582 447 q 452 274 503 332 q 347 161 401 217 q 422 169 381 165 q 494 172 463 172 l 672 172 l 672 0 l 51 0 z \"},\"3\":{\"ha\":733,\"x_min\":31,\"x_max\":665,\"o\":\"m 338 -17 q 154 17 229 -17 q 31 108 79 51 l 125 238 q 213 174 165 199 q 318 149 261 149 q 422 176 383 149 q 461 253 461 203 q 451 306 461 282 q 414 345 440 329 q 342 370 388 361 q 224 379 296 379 l 224 524 q 323 532 283 524 q 387 556 363 540 q 422 594 411 572 q 432 642 432 615 q 404 713 432 688 q 324 739 376 739 q 238 718 276 739 q 158 661 200 697 l 56 786 q 184 869 117 839 q 333 899 251 899 q 458 883 401 899 q 553 835 514 867 q 615 760 593 804 q 638 657 638 715 q 599 540 638 588 q 490 461 561 492 l 490 456 q 616 380 567 433 q 665 240 665 326 q 639 131 665 179 q 568 51 613 83 q 464 1 524 18 q 338 -17 404 -17 z \"},\"4\":{\"ha\":733,\"x_min\":26,\"x_max\":700,\"o\":\"m 408 0 l 408 211 l 26 211 l 26 351 l 349 882 l 599 882 l 599 367 l 700 367 l 700 211 l 599 211 l 599 0 l 408 0 m 222 367 l 408 367 l 408 510 q 411 609 408 553 q 417 707 414 665 l 411 707 q 376 633 394 671 q 339 558 358 596 l 222 367 z \"},\"5\":{\"ha\":733,\"x_min\":32,\"x_max\":667,\"o\":\"m 343 -17 q 160 19 235 -17 q 32 107 85 54 l 124 236 q 210 174 164 200 q 314 149 257 149 q 422 183 382 149 q 463 286 463 218 q 424 388 463 353 q 324 422 386 422 q 289 420 304 422 q 259 413 274 418 q 228 399 244 407 q 193 378 213 390 l 101 436 l 126 882 l 626 882 l 626 710 l 303 710 l 288 544 q 335 560 313 556 q 386 565 358 565 q 494 549 443 565 q 583 499 544 532 q 644 414 622 465 q 667 292 667 363 q 640 161 667 218 q 569 65 614 104 q 466 4 525 25 q 343 -17 407 -17 z \"},\"6\":{\"ha\":733,\"x_min\":57,\"x_max\":683,\"o\":\"m 390 -17 q 266 8 326 -17 q 159 86 206 33 q 85 222 113 139 q 57 421 57 304 q 87 635 57 544 q 166 783 117 725 q 280 870 215 842 q 414 899 344 899 q 565 867 501 899 q 671 793 629 836 l 564 671 q 503 715 540 696 q 426 733 465 733 q 358 719 390 733 q 302 673 326 706 q 263 588 278 640 q 244 458 247 535 q 283 498 261 481 q 329 527 306 515 q 376 545 353 539 q 421 551 400 551 q 526 535 478 551 q 609 485 574 518 q 664 400 644 451 q 683 279 683 349 q 660 156 683 210 q 597 63 636 101 q 503 3 557 24 q 390 -17 450 -17 m 386 136 q 465 170 432 136 q 497 279 497 204 q 465 378 497 350 q 382 407 432 407 q 312 387 347 407 q 249 319 276 367 q 269 232 256 267 q 301 176 283 197 q 341 145 319 154 q 386 136 363 136 z \"},\"7\":{\"ha\":733,\"x_min\":61,\"x_max\":675,\"o\":\"m 221 0 q 241 202 226 110 q 283 378 256 294 q 352 543 310 463 q 457 710 394 624 l 61 710 l 61 882 l 675 882 l 675 757 q 552 583 599 664 q 480 415 506 501 q 443 228 454 328 q 426 0 432 129 l 221 0 z \"},\"8\":{\"ha\":733,\"x_min\":58,\"x_max\":678,\"o\":\"m 365 -17 q 242 1 299 -17 q 145 50 186 18 q 81 126 104 82 q 58 225 58 171 q 102 357 58 306 q 208 442 146 408 l 208 447 q 124 535 157 486 q 90 656 90 585 q 111 756 90 711 q 169 833 132 801 q 259 882 207 865 q 372 899 311 899 q 482 881 432 899 q 567 833 532 864 q 621 756 601 801 q 640 657 640 711 q 606 544 640 593 q 525 464 571 494 l 525 458 q 633 369 589 424 q 678 228 678 315 q 656 131 678 175 q 592 53 633 86 q 494 2 551 21 q 365 -17 436 -17 m 421 514 q 475 643 475 576 q 447 726 475 694 q 368 757 418 757 q 299 732 328 757 q 269 656 269 707 q 311 571 269 601 q 421 514 353 540 m 369 125 q 454 152 421 125 q 488 235 488 179 q 474 285 488 264 q 436 323 461 306 q 377 356 411 340 q 301 389 343 371 q 253 325 272 361 q 233 249 233 289 q 274 158 233 190 q 369 125 314 125 z \"},\"9\":{\"ha\":733,\"x_min\":47,\"x_max\":675,\"o\":\"m 350 475 q 420 495 385 475 q 482 563 456 515 q 430 706 468 667 q 344 746 392 746 q 267 712 300 746 q 233 603 233 678 q 267 503 233 532 q 350 475 300 475 m 318 -17 q 166 15 231 -17 q 60 89 101 47 l 168 211 q 228 167 190 186 q 304 149 265 149 q 374 163 342 149 q 430 209 406 176 q 469 294 454 242 q 486 424 483 346 q 447 384 469 401 q 401 355 425 367 q 354 337 378 343 q 310 331 331 331 q 205 347 253 331 q 122 397 157 364 q 67 482 88 431 q 47 603 47 533 q 71 726 47 671 q 134 819 94 781 q 227 878 174 858 q 340 899 281 899 q 465 874 404 899 q 572 796 525 849 q 647 660 618 743 q 675 461 675 578 q 645 247 675 338 q 566 99 615 157 q 452 12 517 40 q 318 -17 388 -17 z \"},\" \":{\"ha\":278,\"x_min\":0,\"x_max\":0,\"o\":\"\"},\"A\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 z \"},\"B\":{\"ha\":840,\"x_min\":107,\"x_max\":794,\"o\":\"m 107 0 l 107 906 l 417 906 q 548 895 488 906 q 653 858 608 885 q 724 789 699 832 q 750 681 750 746 q 742 619 750 650 q 718 563 733 589 q 681 515 703 536 q 632 485 660 494 l 632 479 q 696 453 667 471 q 747 410 725 436 q 782 348 769 383 q 794 267 794 313 q 767 147 794 197 q 692 65 740 97 q 581 16 644 32 q 443 0 517 0 l 107 0 m 311 543 l 407 543 q 516 572 482 543 q 550 650 550 601 q 515 725 550 703 q 408 747 481 747 l 311 747 l 311 543 m 311 158 l 426 158 q 594 281 594 158 q 553 366 594 340 q 426 392 511 392 l 311 392 l 311 158 z \"},\"C\":{\"ha\":808,\"x_min\":64,\"x_max\":778,\"o\":\"m 485 -17 q 322 13 399 -17 q 188 101 246 43 q 97 247 131 160 q 64 447 64 333 q 99 648 64 560 q 192 797 133 736 q 328 890 250 858 q 492 922 406 922 q 649 887 579 922 q 764 804 718 851 l 656 674 q 583 726 621 706 q 496 746 544 746 q 409 726 450 746 q 338 668 368 706 q 291 576 308 631 q 274 454 274 522 q 333 237 274 314 q 493 160 393 160 q 592 184 549 160 q 669 244 636 208 l 778 117 q 485 -17 664 -17 z \"},\"D\":{\"ha\":882,\"x_min\":107,\"x_max\":817,\"o\":\"m 107 0 l 107 906 l 363 906 q 550 879 467 906 q 693 798 633 853 q 785 658 753 743 q 817 457 817 574 q 785 254 817 340 q 694 112 753 168 q 555 28 636 56 q 374 0 474 0 l 107 0 m 311 165 l 350 165 q 456 181 408 165 q 536 230 503 196 q 588 319 569 264 q 607 457 607 375 q 588 592 607 538 q 536 680 569 647 q 456 726 503 713 q 350 740 408 740 l 311 740 l 311 165 z \"},\"E\":{\"ha\":761,\"x_min\":107,\"x_max\":688,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 z \"},\"F\":{\"ha\":728,\"x_min\":107,\"x_max\":678,\"o\":\"m 107 0 l 107 906 l 678 906 l 678 733 l 311 733 l 311 524 l 625 524 l 625 351 l 311 351 l 311 0 l 107 0 z \"},\"G\":{\"ha\":886,\"x_min\":64,\"x_max\":806,\"o\":\"m 507 -17 q 333 13 414 -17 q 192 101 251 43 q 98 247 132 160 q 64 447 64 333 q 99 648 64 560 q 194 797 133 736 q 335 890 254 858 q 506 922 415 922 q 675 886 604 922 q 790 804 746 850 l 683 674 q 610 725 649 704 q 513 746 571 746 q 416 726 460 746 q 340 668 372 706 q 291 576 308 631 q 274 454 274 522 q 337 237 274 314 q 528 160 400 160 q 582 167 556 160 q 625 188 608 174 l 625 343 l 475 343 l 475 510 l 806 510 l 806 93 q 681 15 758 47 q 507 -17 603 -17 z \"},\"H\":{\"ha\":936,\"x_min\":107,\"x_max\":829,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 557 l 624 557 l 624 906 l 829 906 l 829 0 l 624 0 l 624 378 l 311 378 l 311 0 l 107 0 z \"},\"I\":{\"ha\":418,\"x_min\":107,\"x_max\":311,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 0 l 107 0 z \"},\"J\":{\"ha\":707,\"x_min\":22,\"x_max\":604,\"o\":\"m 314 -17 q 140 24 210 -17 q 22 147 69 64 l 161 250 q 219 182 186 204 q 288 160 253 160 q 372 194 343 160 q 400 318 400 228 l 400 906 l 604 906 l 604 301 q 587 178 604 236 q 534 76 569 119 q 444 8 499 33 q 314 -17 389 -17 z \"},\"K\":{\"ha\":853,\"x_min\":107,\"x_max\":861,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 535 l 317 535 l 586 906 l 811 906 l 538 544 l 861 0 l 638 0 l 417 382 l 311 243 l 311 0 l 107 0 z \"},\"L\":{\"ha\":719,\"x_min\":107,\"x_max\":669,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 172 l 669 172 l 669 0 l 107 0 z \"},\"M\":{\"ha\":1058,\"x_min\":107,\"x_max\":951,\"o\":\"m 107 0 l 107 906 l 331 906 l 476 503 q 503 420 490 463 q 529 336 515 378 l 535 336 q 560 420 549 378 q 586 503 572 463 l 729 906 l 951 906 l 951 0 l 765 0 l 765 332 q 768 406 765 365 q 775 487 771 446 q 783 567 779 528 q 792 640 788 607 l 786 640 l 713 425 l 583 79 l 471 79 l 342 425 l 269 640 l 264 640 q 272 567 268 607 q 281 487 276 528 q 288 406 285 446 q 290 332 290 365 l 290 0 l 107 0 z \"},\"N\":{\"ha\":924,\"x_min\":107,\"x_max\":817,\"o\":\"m 107 0 l 107 906 l 317 906 l 553 456 l 642 256 l 647 256 q 631 417 640 328 q 622 586 622 506 l 622 906 l 817 906 l 817 0 l 607 0 l 371 451 l 282 649 l 276 649 q 292 488 283 574 q 301 321 301 401 l 301 0 l 107 0 z \"},\"O\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 308 16 383 -17 q 178 110 232 49 q 94 258 124 171 q 64 457 64 346 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 856 258 886 346 q 772 110 826 171 q 642 16 718 49 q 475 -17 567 -17 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 z \"},\"P\":{\"ha\":828,\"x_min\":107,\"x_max\":778,\"o\":\"m 107 0 l 107 906 l 418 906 q 558 891 493 906 q 672 842 624 876 q 749 752 721 808 q 778 614 778 696 q 749 476 778 535 q 672 381 721 418 q 560 325 624 343 q 424 307 496 307 l 311 307 l 311 0 l 107 0 m 311 469 l 411 469 q 578 614 578 469 q 533 714 578 685 q 406 743 489 743 l 311 743 l 311 469 z \"},\"Q\":{\"ha\":950,\"x_min\":64,\"x_max\":933,\"o\":\"m 475 150 q 622 231 568 150 q 676 457 676 311 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 231 274 311 q 475 150 382 150 m 774 -253 q 640 -234 701 -253 q 530 -183 579 -215 q 443 -105 481 -150 q 382 -7 406 -60 q 251 47 310 8 q 150 144 192 85 q 86 283 108 204 q 64 457 64 361 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 808 156 886 274 q 599 0 731 38 q 685 -69 631 -49 q 797 -89 739 -89 q 852 -85 826 -89 q 897 -74 878 -81 l 933 -222 q 867 -244 908 -235 q 774 -253 826 -253 z \"},\"R\":{\"ha\":851,\"x_min\":107,\"x_max\":826,\"o\":\"m 107 0 l 107 906 l 433 906 q 569 892 506 906 q 679 845 632 878 q 754 758 726 813 q 782 624 782 704 q 738 459 782 524 q 621 363 694 394 l 826 0 l 597 0 l 424 326 l 311 326 l 311 0 l 107 0 m 311 489 l 417 489 q 540 523 497 489 q 582 624 582 557 q 540 717 582 690 q 417 743 497 743 l 311 743 l 311 489 z \"},\"S\":{\"ha\":772,\"x_min\":49,\"x_max\":725,\"o\":\"m 383 -17 q 206 16 294 -17 q 49 114 118 49 l 165 254 q 273 186 214 213 q 389 160 332 160 q 484 183 453 160 q 515 247 515 207 q 506 283 515 268 q 480 310 497 299 q 438 333 463 322 q 385 356 414 343 l 267 406 q 199 442 232 419 q 141 494 167 464 q 100 563 115 524 q 85 653 85 603 q 108 758 85 708 q 175 844 132 807 q 277 901 218 881 q 407 922 336 922 q 563 892 486 922 q 699 803 640 861 l 594 674 q 506 727 550 708 q 407 746 461 746 q 323 724 354 746 q 292 664 292 703 q 302 628 292 643 q 331 602 313 614 q 375 580 350 590 q 429 557 400 569 l 546 510 q 677 418 629 476 q 725 264 725 360 q 702 156 725 207 q 635 67 679 106 q 528 6 592 29 q 383 -17 464 -17 z \"},\"T\":{\"ha\":772,\"x_min\":35,\"x_max\":738,\"o\":\"m 283 0 l 283 733 l 35 733 l 35 906 l 738 906 l 738 733 l 489 733 l 489 0 l 283 0 z \"},\"U\":{\"ha\":924,\"x_min\":101,\"x_max\":821,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 821 906 l 821 419 q 730 88 821 192 q 464 -17 639 -17 z \"},\"V\":{\"ha\":772,\"x_min\":-10,\"x_max\":782,\"o\":\"m 264 0 l -10 906 l 207 906 l 315 483 q 352 338 336 408 q 389 193 368 268 l 394 193 q 431 338 414 268 q 467 483 447 408 l 574 906 l 782 906 l 510 0 l 264 0 z \"},\"W\":{\"ha\":1129,\"x_min\":19,\"x_max\":1111,\"o\":\"m 188 0 l 19 906 l 229 906 l 292 482 q 310 340 300 411 q 328 196 319 268 l 333 196 q 360 340 347 268 q 388 482 374 411 l 485 906 l 658 906 l 756 482 q 783 341 769 413 q 810 196 796 269 l 815 196 q 834 340 825 269 q 853 482 843 411 l 915 906 l 1111 906 l 950 0 l 693 0 l 604 411 q 584 517 593 464 q 568 621 575 571 l 563 621 q 545 517 554 571 q 525 411 536 464 l 440 0 l 188 0 z \"},\"X\":{\"ha\":788,\"x_min\":15,\"x_max\":772,\"o\":\"m 15 0 l 267 465 l 31 906 l 258 906 l 338 735 q 368 667 353 703 q 403 589 383 632 l 408 589 q 438 667 424 632 q 467 735 453 703 l 539 906 l 757 906 l 522 456 l 772 0 l 544 0 l 454 185 q 422 256 438 221 q 386 333 406 292 l 381 333 q 350 256 365 292 q 319 185 335 221 l 235 0 l 15 0 z \"},\"Y\":{\"ha\":729,\"x_min\":-11,\"x_max\":740,\"o\":\"m 263 0 l 263 322 l -11 906 l 208 906 l 289 697 q 326 598 308 646 q 363 497 343 550 l 368 497 q 406 598 388 550 q 444 697 425 646 l 526 906 l 740 906 l 467 322 l 467 0 l 263 0 z \"},\"Z\":{\"ha\":751,\"x_min\":50,\"x_max\":706,\"o\":\"m 50 0 l 50 124 l 450 733 l 88 733 l 88 906 l 701 906 l 701 782 l 301 172 l 706 172 l 706 0 l 50 0 z \"},\"a\":{\"ha\":732,\"x_min\":58,\"x_max\":650,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 z \"},\"b\":{\"ha\":796,\"x_min\":90,\"x_max\":742,\"o\":\"m 451 -17 q 359 6 406 -17 q 272 74 313 29 l 267 74 l 250 0 l 90 0 l 90 974 l 294 974 l 294 735 l 289 629 q 376 685 329 665 q 471 706 422 706 q 583 681 533 706 q 669 610 633 656 q 723 501 704 565 q 742 357 742 436 q 717 199 742 268 q 652 81 693 129 q 559 8 611 33 q 451 -17 507 -17 m 404 150 q 494 198 457 150 q 532 353 532 246 q 413 539 532 539 q 294 476 351 539 l 294 194 q 350 160 322 169 q 404 150 378 150 z \"},\"c\":{\"ha\":649,\"x_min\":50,\"x_max\":618,\"o\":\"m 390 -17 q 256 8 318 -17 q 149 78 194 32 q 76 191 103 124 q 50 344 50 258 q 79 498 50 431 q 158 611 108 565 q 272 681 207 657 q 408 706 338 706 q 522 685 472 706 q 610 632 571 664 l 514 500 q 421 540 465 540 q 303 488 346 540 q 260 344 260 435 q 303 201 260 254 q 414 149 347 149 q 478 163 447 149 q 538 199 510 178 l 618 65 q 507 2 567 21 q 390 -17 447 -17 z \"},\"d\":{\"ha\":796,\"x_min\":54,\"x_max\":706,\"o\":\"m 336 -17 q 220 8 272 -17 q 131 80 168 33 q 74 193 94 126 q 54 344 54 260 q 78 496 54 429 q 142 609 103 563 q 234 681 182 656 q 340 706 286 706 q 436 686 399 706 q 510 633 474 667 l 501 739 l 501 974 l 706 974 l 706 0 l 539 0 l 525 68 l 519 68 q 435 8 483 32 q 336 -17 386 -17 m 389 150 q 449 164 422 150 q 501 213 476 178 l 501 494 q 444 529 474 519 q 388 539 415 539 q 301 492 339 539 q 264 347 264 446 q 297 197 264 244 q 389 150 329 150 z \"},\"e\":{\"ha\":719,\"x_min\":50,\"x_max\":668,\"o\":\"m 399 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 526 4 590 25 q 399 -17 461 -17 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 z \"},\"f\":{\"ha\":474,\"x_min\":33,\"x_max\":517,\"o\":\"m 125 0 l 125 529 l 33 529 l 33 681 l 125 688 l 125 725 q 138 828 125 779 q 182 913 151 876 q 261 969 213 949 q 379 990 310 990 q 458 982 422 990 q 517 965 493 974 l 479 815 q 408 829 440 829 q 350 806 371 829 q 329 731 329 783 l 329 689 l 453 689 l 453 529 l 329 529 l 329 0 l 125 0 z \"},\"g\":{\"ha\":742,\"x_min\":47,\"x_max\":721,\"o\":\"m 336 -293 q 223 -283 275 -293 q 131 -251 171 -272 q 69 -197 92 -231 q 47 -118 47 -164 q 146 21 47 -35 l 146 26 q 100 72 118 44 q 82 143 82 100 q 104 215 82 181 q 160 272 126 249 l 160 278 q 95 349 124 303 q 67 457 67 396 q 90 566 67 519 q 153 644 114 613 q 244 690 193 675 q 351 706 296 706 q 458 689 413 706 l 710 689 l 710 540 l 600 540 q 616 501 610 525 q 622 450 622 478 q 601 347 622 390 q 544 274 581 303 q 458 232 507 246 q 351 218 408 218 q 268 232 311 218 q 249 210 254 221 q 243 181 243 199 q 266 142 243 154 q 347 129 289 129 l 458 129 q 653 88 586 129 q 721 -46 721 47 q 694 -145 721 -100 q 617 -223 667 -190 q 496 -274 567 -256 q 336 -293 425 -293 m 351 342 q 419 370 392 342 q 446 457 446 399 q 419 540 446 511 q 351 568 392 568 q 284 540 311 568 q 257 457 257 513 q 284 370 257 399 q 351 342 311 342 m 368 -165 q 482 -141 438 -165 q 526 -81 526 -117 q 499 -37 526 -49 q 421 -26 472 -26 l 350 -26 q 292 -24 314 -26 q 253 -18 269 -22 q 215 -86 215 -51 q 257 -145 215 -125 q 368 -165 299 -165 z \"},\"h\":{\"ha\":793,\"x_min\":90,\"x_max\":711,\"o\":\"m 90 0 l 90 974 l 294 974 l 294 735 l 285 611 q 375 676 324 646 q 497 706 426 706 q 660 632 610 706 q 711 428 711 558 l 711 0 l 507 0 l 507 401 q 487 504 507 476 q 422 532 467 532 q 356 515 383 532 q 294 465 328 497 l 294 0 l 90 0 z \"},\"i\":{\"ha\":383,\"x_min\":74,\"x_max\":310,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 0 l 90 0 m 192 790 q 107 820 140 790 q 74 897 74 850 q 107 974 74 944 q 192 1003 140 1003 q 277 974 244 1003 q 310 897 310 944 q 277 820 310 850 q 192 790 244 790 z \"},\"j\":{\"ha\":386,\"x_min\":-71,\"x_max\":313,\"o\":\"m 50 -272 q -22 -267 7 -272 q -71 -253 -50 -261 l -35 -103 q -8 -110 -21 -107 q 19 -112 4 -112 q 76 -86 60 -112 q 92 -1 92 -60 l 92 689 l 296 689 l 296 4 q 284 -103 296 -53 q 244 -190 272 -153 q 168 -250 215 -228 q 50 -272 121 -272 m 194 790 q 110 820 143 790 q 76 897 76 850 q 110 974 76 944 q 194 1003 143 1003 q 279 974 246 1003 q 313 897 313 944 q 279 820 313 850 q 194 790 246 790 z \"},\"k\":{\"ha\":761,\"x_min\":90,\"x_max\":753,\"o\":\"m 90 0 l 90 974 l 289 974 l 289 415 l 294 415 l 513 689 l 735 689 l 493 406 l 753 0 l 532 0 l 376 268 l 289 169 l 289 0 l 90 0 z \"},\"l\":{\"ha\":397,\"x_min\":90,\"x_max\":381,\"o\":\"m 278 -17 q 189 0 225 -17 q 131 47 153 17 q 100 119 110 76 q 90 214 90 161 l 90 974 l 294 974 l 294 206 q 306 161 294 174 q 331 149 318 149 q 342 149 338 149 q 356 151 347 149 l 381 0 q 338 -12 364 -7 q 278 -17 313 -17 z \"},\"m\":{\"ha\":1190,\"x_min\":90,\"x_max\":1107,\"o\":\"m 90 0 l 90 689 l 257 689 l 271 600 l 276 600 q 368 674 319 643 q 485 706 417 706 q 603 676 558 706 q 675 590 649 646 q 772 672 721 638 q 892 706 822 706 q 1055 631 1003 706 q 1107 428 1107 557 l 1107 0 l 903 0 l 903 401 q 883 504 903 476 q 818 532 863 532 q 700 465 767 532 l 700 0 l 496 0 l 496 401 q 476 504 496 476 q 411 532 456 532 q 294 465 358 532 l 294 0 l 90 0 z \"},\"n\":{\"ha\":794,\"x_min\":90,\"x_max\":711,\"o\":\"m 90 0 l 90 689 l 257 689 l 271 601 l 276 601 q 374 674 321 643 q 497 706 426 706 q 660 632 610 706 q 711 428 711 558 l 711 0 l 507 0 l 507 401 q 487 504 507 476 q 422 532 467 532 q 356 515 383 532 q 294 465 328 497 l 294 0 l 90 0 z \"},\"o\":{\"ha\":771,\"x_min\":50,\"x_max\":721,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 512 681 451 706 q 619 611 572 657 q 693 498 665 565 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 z \"},\"p\":{\"ha\":796,\"x_min\":90,\"x_max\":742,\"o\":\"m 90 -256 l 90 689 l 257 689 l 271 621 l 276 621 q 367 681 317 657 q 472 706 418 706 q 585 681 535 706 q 669 610 635 656 q 723 499 704 564 q 742 356 742 435 q 717 198 742 267 q 652 81 693 129 q 559 8 611 33 q 451 -17 507 -17 q 365 2 407 -17 q 288 56 324 21 l 294 -54 l 294 -256 l 90 -256 m 404 150 q 494 198 457 150 q 532 353 532 246 q 413 539 532 539 q 294 476 353 539 l 294 194 q 350 160 322 169 q 404 150 378 150 z \"},\"q\":{\"ha\":796,\"x_min\":54,\"x_max\":706,\"o\":\"m 501 -256 l 501 -46 l 510 60 q 429 5 475 26 q 336 -17 383 -17 q 220 8 272 -17 q 131 80 168 33 q 74 193 94 126 q 54 344 54 260 q 78 496 54 429 q 142 609 103 563 q 234 681 182 656 q 340 706 286 706 q 440 685 397 706 q 524 621 483 665 l 529 621 l 546 689 l 706 689 l 706 -256 l 501 -256 m 389 150 q 449 164 422 150 q 501 213 476 178 l 501 494 q 444 529 474 519 q 388 539 415 539 q 301 492 339 539 q 264 347 264 446 q 297 197 264 244 q 389 150 329 150 z \"},\"r\":{\"ha\":553,\"x_min\":90,\"x_max\":554,\"o\":\"m 90 0 l 90 689 l 257 689 l 271 568 l 276 568 q 367 672 314 639 q 472 706 419 706 q 520 702 501 706 q 554 692 539 699 l 521 515 q 485 524 501 521 q 446 526 468 526 q 365 499 407 526 q 294 400 322 471 l 294 0 l 90 0 z \"},\"s\":{\"ha\":615,\"x_min\":29,\"x_max\":576,\"o\":\"m 293 -17 q 153 10 225 -17 q 29 79 82 36 l 121 207 q 211 153 168 171 q 299 135 254 135 q 365 150 344 135 q 386 193 386 165 q 374 223 386 210 q 342 247 363 236 q 297 267 322 258 q 246 288 272 276 q 182 317 214 300 q 124 358 150 333 q 81 415 97 382 q 64 490 64 447 q 83 578 64 538 q 136 646 101 618 q 219 690 171 674 q 328 706 268 706 q 467 678 407 706 q 571 618 526 651 l 479 496 q 406 539 442 524 q 333 554 369 554 q 256 500 256 554 q 267 472 256 483 q 297 450 278 460 q 340 431 315 440 q 390 413 364 422 q 456 384 424 400 q 516 344 489 368 q 560 287 543 321 q 576 206 576 253 q 558 118 576 158 q 504 48 540 78 q 415 1 468 18 q 293 -17 363 -17 z \"},\"t\":{\"ha\":532,\"x_min\":24,\"x_max\":508,\"o\":\"m 356 -17 q 247 3 292 -17 q 173 57 201 22 q 131 141 144 92 q 118 250 118 190 l 118 529 l 24 529 l 24 681 l 129 689 l 153 872 l 322 872 l 322 689 l 488 689 l 488 529 l 322 529 l 322 253 q 347 169 322 194 q 411 143 371 143 q 445 147 428 143 q 476 157 463 151 l 508 8 q 443 -8 481 0 q 356 -17 406 -17 z \"},\"u\":{\"ha\":789,\"x_min\":83,\"x_max\":700,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 700 689 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 z \"},\"v\":{\"ha\":726,\"x_min\":17,\"x_max\":710,\"o\":\"m 249 0 l 17 689 l 222 689 l 311 364 q 338 259 325 313 q 365 151 351 206 l 371 151 q 397 259 383 206 q 424 364 410 313 l 514 689 l 710 689 l 485 0 l 249 0 z \"},\"w\":{\"ha\":1078,\"x_min\":33,\"x_max\":1044,\"o\":\"m 206 0 l 33 689 l 236 689 l 303 369 q 318 268 311 318 q 333 165 325 218 l 339 165 q 358 269 349 218 q 379 369 367 321 l 456 689 l 632 689 l 710 369 q 732 268 722 318 q 753 165 742 218 l 758 165 q 774 268 768 218 q 790 369 781 318 l 856 689 l 1044 689 l 879 0 l 640 0 l 578 275 q 558 372 567 324 q 540 476 550 421 l 535 476 q 517 372 525 421 q 500 275 510 324 l 439 0 l 206 0 z \"},\"x\":{\"ha\":714,\"x_min\":19,\"x_max\":694,\"o\":\"m 19 0 l 231 358 l 32 689 l 251 689 l 313 578 q 341 519 326 549 q 371 460 356 489 l 376 460 q 400 519 388 489 q 424 578 413 549 l 471 689 l 682 689 l 482 335 l 694 0 l 475 0 l 408 114 q 376 174 392 143 q 343 233 360 204 l 338 233 q 311 174 325 204 q 285 114 297 144 l 231 0 l 19 0 z \"},\"y\":{\"ha\":724,\"x_min\":17,\"x_max\":707,\"o\":\"m 167 -269 q 113 -266 135 -269 q 69 -256 90 -262 l 106 -100 q 128 -106 115 -103 q 151 -108 140 -108 q 231 -83 203 -108 q 272 -18 258 -58 l 282 18 l 17 689 l 222 689 l 321 393 q 349 297 336 346 q 375 197 361 249 l 381 197 q 403 295 392 246 q 428 393 415 344 l 511 689 l 707 689 l 468 -7 q 416 -122 443 -72 q 353 -203 389 -171 q 273 -253 318 -236 q 167 -269 228 -269 z \"},\"z\":{\"ha\":639,\"x_min\":53,\"x_max\":606,\"o\":\"m 53 0 l 53 110 l 342 529 l 85 529 l 85 689 l 596 689 l 596 581 l 307 160 l 606 160 l 606 0 l 53 0 z \"},\"À\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 407 944 l 153 1110 l 261 1242 l 499 1047 l 407 944 z \"},\"Á\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 379 944 l 288 1047 l 525 1242 l 633 1110 l 379 944 z \"},\"Â\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 157 1006 l 282 1160 l 504 1160 l 629 1006 l 540 951 l 396 1068 l 390 1068 l 246 951 l 157 1006 z \"},\"Ã\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 492 961 q 426 974 454 961 q 376 1001 399 986 q 336 1029 354 1017 q 301 1042 318 1042 q 268 1026 282 1042 q 250 974 254 1011 l 118 983 q 172 1136 124 1089 q 294 1183 221 1183 q 360 1171 332 1183 q 410 1143 388 1158 q 450 1115 432 1128 q 485 1103 468 1103 q 518 1118 504 1103 q 536 1171 532 1133 l 668 1161 q 614 1009 663 1057 q 492 961 565 961 z \"},\"Ä\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 239 972 q 169 1000 196 972 q 142 1069 142 1028 q 169 1139 142 1111 q 239 1167 196 1167 q 309 1139 282 1167 q 336 1069 336 1111 q 309 1000 336 1028 q 239 972 282 972 m 547 972 q 477 1000 504 972 q 450 1069 450 1028 q 477 1139 450 1111 q 547 1167 504 1167 q 617 1139 590 1167 q 644 1069 644 1111 q 617 1000 644 1028 q 547 972 590 972 z \"},\"Ā\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 183 1001 l 183 1132 l 603 1132 l 603 1001 l 183 1001 z \"},\"Ă\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 393 968 q 233 1017 289 968 q 167 1158 176 1065 l 278 1178 q 317 1110 288 1135 q 393 1086 346 1086 q 469 1110 440 1086 q 508 1178 499 1135 l 619 1158 q 553 1017 610 1065 q 393 968 497 968 z \"},\"Å\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 393 968 q 278 1006 322 968 q 235 1106 235 1043 q 278 1205 235 1168 q 393 1242 322 1242 q 508 1205 464 1242 q 551 1106 551 1168 q 508 1006 551 1043 q 393 968 464 968 m 393 1044 q 434 1061 417 1044 q 451 1106 451 1078 q 434 1149 451 1133 q 393 1165 417 1165 q 352 1149 369 1165 q 335 1106 335 1133 q 352 1061 335 1078 q 393 1044 369 1044 z \"},\"Ǎ\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 282 975 l 157 1128 l 246 1183 l 390 1067 l 396 1067 l 540 1183 l 629 1128 l 504 975 l 282 975 z \"},\"Ạ\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 393 -312 q 312 -283 343 -312 q 281 -206 281 -253 q 312 -128 281 -158 q 393 -99 343 -99 q 474 -128 443 -99 q 506 -206 506 -158 q 474 -283 506 -253 q 393 -312 443 -312 z \"},\"Ả\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 333 960 l 317 1040 q 361 1054 343 1046 q 379 1082 379 1063 q 354 1113 379 1101 q 268 1129 329 1125 l 292 1231 q 474 1194 421 1228 q 526 1104 526 1160 q 511 1042 526 1068 q 469 999 496 1017 q 408 972 443 982 q 333 960 372 963 z \"},\"Ấ\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 263 951 l 181 1006 l 306 1144 l 481 1144 l 606 1006 l 524 951 l 396 1051 l 390 1051 l 263 951 m 604 1054 l 543 1124 l 682 1243 l 750 1160 l 604 1054 z \"},\"Ầ\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 263 951 l 181 1006 l 306 1144 l 481 1144 l 606 1006 l 524 951 l 396 1051 l 390 1051 l 263 951 m 243 1122 l 182 1054 l 42 1161 l 108 1243 l 243 1122 z \"},\"Ẩ\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 263 951 l 181 1006 l 306 1144 l 481 1144 l 606 1006 l 524 951 l 396 1051 l 390 1051 l 263 951 m 583 1042 l 568 1107 q 600 1119 588 1111 q 613 1144 613 1126 q 594 1175 613 1164 q 522 1190 575 1186 l 540 1274 q 699 1240 654 1271 q 744 1163 744 1208 q 698 1074 744 1101 q 583 1042 651 1047 z \"},\"Ẫ\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 263 951 l 181 1006 l 306 1133 l 481 1133 l 606 1006 l 524 951 l 396 1039 l 390 1039 l 263 951 m 181 1183 q 218 1300 185 1263 q 310 1338 251 1338 q 361 1328 339 1338 q 401 1307 383 1318 q 434 1286 419 1296 q 464 1276 449 1276 q 508 1331 500 1276 l 606 1318 q 568 1201 601 1239 q 476 1164 535 1164 q 425 1174 447 1164 q 385 1194 403 1183 q 351 1215 367 1206 q 322 1225 336 1225 q 278 1172 286 1225 l 181 1183 z \"},\"Ậ\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 157 1006 l 282 1160 l 504 1160 l 629 1006 l 540 951 l 396 1068 l 390 1068 l 246 951 l 157 1006 m 393 -312 q 312 -283 343 -312 q 281 -206 281 -253 q 312 -128 281 -158 q 393 -99 343 -99 q 474 -128 443 -99 q 506 -206 506 -158 q 474 -283 506 -253 q 393 -312 443 -312 z \"},\"Ắ\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 317 1183 l 449 1374 l 576 1294 l 417 1118 l 317 1183 m 393 968 q 233 1017 289 968 q 167 1158 176 1065 l 267 1178 q 310 1102 278 1129 q 393 1075 342 1075 q 476 1102 444 1075 q 519 1178 508 1129 l 619 1158 q 553 1017 610 1065 q 393 968 497 968 z \"},\"Ằ\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 469 1183 l 369 1118 l 210 1294 l 338 1374 l 469 1183 m 393 968 q 233 1017 289 968 q 167 1158 176 1065 l 267 1178 q 310 1102 278 1129 q 393 1075 342 1075 q 476 1102 444 1075 q 519 1178 508 1129 l 619 1158 q 553 1017 610 1065 q 393 968 497 968 z \"},\"Ẳ\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 349 1119 l 332 1185 q 365 1197 351 1189 q 378 1222 378 1204 q 358 1253 378 1242 q 286 1268 339 1264 l 306 1353 q 464 1317 419 1349 q 508 1240 508 1286 q 496 1188 508 1210 q 462 1152 483 1167 q 411 1130 440 1138 q 349 1119 382 1122 m 393 968 q 233 1017 289 968 q 167 1158 176 1065 l 267 1178 q 310 1102 278 1129 q 393 1075 342 1075 q 476 1102 444 1075 q 519 1178 508 1129 l 619 1158 q 553 1017 610 1065 q 393 968 497 968 z \"},\"Ẵ\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 393 975 q 236 1017 289 975 q 175 1131 183 1060 l 274 1147 q 308 1095 282 1117 q 393 1074 335 1074 q 478 1095 451 1074 q 513 1147 504 1117 l 611 1131 q 550 1017 603 1060 q 393 975 497 975 m 181 1194 q 218 1311 185 1274 q 310 1349 251 1349 q 361 1339 339 1349 q 401 1318 383 1329 q 434 1297 419 1307 q 464 1288 449 1288 q 508 1342 500 1288 l 606 1329 q 568 1213 601 1250 q 476 1176 535 1176 q 425 1186 447 1176 q 385 1207 403 1196 q 351 1228 367 1218 q 322 1238 336 1238 q 278 1183 286 1238 l 181 1194 z \"},\"Ặ\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 393 968 q 233 1017 289 968 q 167 1158 176 1065 l 278 1178 q 317 1110 288 1135 q 393 1086 346 1086 q 469 1110 440 1086 q 508 1178 499 1135 l 619 1158 q 553 1017 610 1065 q 393 968 497 968 m 393 -312 q 312 -283 343 -312 q 281 -206 281 -253 q 312 -128 281 -158 q 393 -99 343 -99 q 474 -128 443 -99 q 506 -206 506 -158 q 474 -283 506 -253 q 393 -312 443 -312 z \"},\"Ą\":{\"ha\":796,\"x_min\":-8,\"x_max\":835,\"o\":\"m 689 -310 q 576 -276 622 -310 q 531 -179 531 -242 q 542 -119 531 -147 q 569 -67 553 -90 q 606 -27 586 -44 q 643 0 626 -10 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 l 275 906 l 521 906 l 804 0 q 752 -15 775 -3 q 713 -44 729 -26 q 688 -83 697 -62 q 679 -125 679 -104 q 695 -165 679 -151 q 733 -178 711 -178 q 763 -172 749 -178 q 788 -158 776 -165 l 835 -261 q 766 -296 807 -282 q 689 -310 725 -310 m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 z \"},\"Æ\":{\"ha\":1174,\"x_min\":-19,\"x_max\":1101,\"o\":\"m 421 494 l 363 365 l 536 365 l 536 751 l 531 751 q 476 619 503 685 q 421 494 449 554 m -19 0 l 411 906 l 1088 906 l 1088 733 l 740 733 l 740 551 l 1033 551 l 1033 381 l 740 381 l 740 172 l 1101 172 l 1101 0 l 536 0 l 536 207 l 290 207 l 196 0 l -19 0 z \"},\"Ǽ\":{\"ha\":1174,\"x_min\":-19,\"x_max\":1101,\"o\":\"m 421 494 l 363 365 l 536 365 l 536 751 l 531 751 q 476 619 503 685 q 421 494 449 554 m -19 0 l 411 906 l 1088 906 l 1088 733 l 740 733 l 740 551 l 1033 551 l 1033 381 l 740 381 l 740 172 l 1101 172 l 1101 0 l 536 0 l 536 207 l 290 207 l 196 0 l -19 0 m 731 969 l 639 1072 l 876 1267 l 985 1135 l 731 969 z \"},\"Ǣ\":{\"ha\":1174,\"x_min\":-19,\"x_max\":1101,\"o\":\"m 421 494 l 363 365 l 536 365 l 536 751 l 531 751 q 476 619 503 685 q 421 494 449 554 m -19 0 l 411 906 l 1088 906 l 1088 733 l 740 733 l 740 551 l 1033 551 l 1033 381 l 740 381 l 740 172 l 1101 172 l 1101 0 l 536 0 l 536 207 l 290 207 l 196 0 l -19 0 m 535 1026 l 535 1157 l 954 1157 l 954 1026 l 535 1026 z \"},\"Ƀ\":{\"ha\":872,\"x_min\":36,\"x_max\":828,\"o\":\"m 139 0 l 139 243 l 36 243 l 36 333 l 139 342 l 139 906 l 450 906 q 581 894 521 906 q 687 858 642 883 q 758 790 732 832 q 783 688 783 749 q 747 579 783 631 q 631 508 711 528 l 631 503 q 778 428 728 483 q 828 278 828 374 q 801 153 828 206 q 726 67 774 101 q 613 17 678 33 q 475 0 549 0 l 139 0 m 344 551 l 440 551 q 551 581 515 551 q 588 664 588 611 q 550 736 588 714 q 442 758 513 758 l 344 758 l 344 551 m 344 146 l 458 146 q 587 183 542 146 q 632 293 632 221 q 588 398 632 365 q 458 431 543 431 l 344 431 l 344 342 l 519 342 l 519 243 l 344 243 l 344 146 z \"},\"Ḇ\":{\"ha\":840,\"x_min\":107,\"x_max\":794,\"o\":\"m 107 0 l 107 906 l 417 906 q 548 895 488 906 q 653 858 608 885 q 724 789 699 832 q 750 681 750 746 q 742 619 750 650 q 718 563 733 589 q 681 515 703 536 q 632 485 660 494 l 632 479 q 696 453 667 471 q 747 410 725 436 q 782 348 769 383 q 794 267 794 313 q 767 147 794 197 q 692 65 740 97 q 581 16 644 32 q 443 0 517 0 l 107 0 m 311 543 l 407 543 q 516 572 482 543 q 550 650 550 601 q 515 725 550 703 q 408 747 481 747 l 311 747 l 311 543 m 311 158 l 426 158 q 594 281 594 158 q 553 366 594 340 q 426 392 511 392 l 311 392 l 311 158 m 231 -260 l 231 -131 l 642 -131 l 642 -260 l 231 -260 z \"},\"Ç\":{\"ha\":808,\"x_min\":64,\"x_max\":778,\"o\":\"m 485 -17 q 322 13 399 -17 q 188 101 246 43 q 97 247 131 160 q 64 447 64 333 q 99 648 64 560 q 192 797 133 736 q 328 890 250 858 q 492 922 406 922 q 649 887 579 922 q 764 804 718 851 l 656 674 q 583 726 621 706 q 496 746 544 746 q 409 726 450 746 q 338 668 368 706 q 291 576 308 631 q 274 454 274 522 q 333 237 274 314 q 493 160 393 160 q 592 184 549 160 q 669 244 636 208 l 778 117 q 485 -17 664 -17 m 344 -332 l 329 -250 q 442 -232 411 -246 q 472 -189 472 -218 q 451 -153 472 -168 q 365 -131 429 -139 l 432 6 l 551 6 l 513 -85 q 592 -121 565 -97 q 618 -189 618 -144 q 547 -294 618 -260 q 344 -332 475 -328 z \"},\"Ć\":{\"ha\":808,\"x_min\":64,\"x_max\":778,\"o\":\"m 485 -17 q 322 13 399 -17 q 188 101 246 43 q 97 247 131 160 q 64 447 64 333 q 99 648 64 560 q 192 797 133 736 q 328 890 250 858 q 492 922 406 922 q 649 887 579 922 q 764 804 718 851 l 656 674 q 583 726 621 706 q 496 746 544 746 q 409 726 450 746 q 338 668 368 706 q 291 576 308 631 q 274 454 274 522 q 333 237 274 314 q 493 160 393 160 q 592 184 549 160 q 669 244 636 208 l 778 117 q 485 -17 664 -17 m 463 944 l 371 1047 l 608 1242 l 717 1110 l 463 944 z \"},\"Ĉ\":{\"ha\":808,\"x_min\":64,\"x_max\":778,\"o\":\"m 485 -17 q 322 13 399 -17 q 188 101 246 43 q 97 247 131 160 q 64 447 64 333 q 99 648 64 560 q 192 797 133 736 q 328 890 250 858 q 492 922 406 922 q 649 887 579 922 q 764 804 718 851 l 656 674 q 583 726 621 706 q 496 746 544 746 q 409 726 450 746 q 338 668 368 706 q 291 576 308 631 q 274 454 274 522 q 333 237 274 314 q 493 160 393 160 q 592 184 549 160 q 669 244 636 208 l 778 117 q 485 -17 664 -17 m 240 1006 l 365 1160 l 588 1160 l 713 1006 l 624 951 l 479 1068 l 474 1068 l 329 951 l 240 1006 z \"},\"Č\":{\"ha\":808,\"x_min\":64,\"x_max\":778,\"o\":\"m 485 -17 q 322 13 399 -17 q 188 101 246 43 q 97 247 131 160 q 64 447 64 333 q 99 648 64 560 q 192 797 133 736 q 328 890 250 858 q 492 922 406 922 q 649 887 579 922 q 764 804 718 851 l 656 674 q 583 726 621 706 q 496 746 544 746 q 409 726 450 746 q 338 668 368 706 q 291 576 308 631 q 274 454 274 522 q 333 237 274 314 q 493 160 393 160 q 592 184 549 160 q 669 244 636 208 l 778 117 q 485 -17 664 -17 m 365 975 l 240 1128 l 329 1183 l 474 1067 l 479 1067 l 624 1183 l 713 1128 l 588 975 l 365 975 z \"},\"Ċ\":{\"ha\":808,\"x_min\":64,\"x_max\":778,\"o\":\"m 485 -17 q 322 13 399 -17 q 188 101 246 43 q 97 247 131 160 q 64 447 64 333 q 99 648 64 560 q 192 797 133 736 q 328 890 250 858 q 492 922 406 922 q 649 887 579 922 q 764 804 718 851 l 656 674 q 583 726 621 706 q 496 746 544 746 q 409 726 450 746 q 338 668 368 706 q 291 576 308 631 q 274 454 274 522 q 333 237 274 314 q 493 160 393 160 q 592 184 549 160 q 669 244 636 208 l 778 117 q 485 -17 664 -17 m 476 974 q 392 1003 425 974 q 358 1081 358 1033 q 392 1158 358 1128 q 476 1188 425 1188 q 561 1158 528 1188 q 594 1081 594 1128 q 561 1003 594 1033 q 476 974 528 974 z \"},\"Ď\":{\"ha\":882,\"x_min\":107,\"x_max\":817,\"o\":\"m 107 0 l 107 906 l 363 906 q 550 879 467 906 q 693 798 633 853 q 785 658 753 743 q 817 457 817 574 q 785 254 817 340 q 694 112 753 168 q 555 28 636 56 q 374 0 474 0 l 107 0 m 311 165 l 350 165 q 456 181 408 165 q 536 230 503 196 q 588 319 569 264 q 607 457 607 375 q 588 592 607 538 q 536 680 569 647 q 456 726 503 713 q 350 740 408 740 l 311 740 l 311 165 m 331 975 l 206 1128 l 294 1183 l 439 1067 l 444 1067 l 589 1183 l 678 1128 l 553 975 l 331 975 z \"},\"Ḍ\":{\"ha\":882,\"x_min\":107,\"x_max\":817,\"o\":\"m 107 0 l 107 906 l 363 906 q 550 879 467 906 q 693 798 633 853 q 785 658 753 743 q 817 457 817 574 q 785 254 817 340 q 694 112 753 168 q 555 28 636 56 q 374 0 474 0 l 107 0 m 311 165 l 350 165 q 456 181 408 165 q 536 230 503 196 q 588 319 569 264 q 607 457 607 375 q 588 592 607 538 q 536 680 569 647 q 456 726 503 713 q 350 740 408 740 l 311 740 l 311 165 m 435 -312 q 353 -283 385 -312 q 322 -206 322 -253 q 353 -128 322 -158 q 435 -99 385 -99 q 516 -128 485 -99 q 547 -206 547 -158 q 516 -283 547 -253 q 435 -312 485 -312 z \"},\"Ḏ\":{\"ha\":882,\"x_min\":107,\"x_max\":817,\"o\":\"m 107 0 l 107 906 l 363 906 q 550 879 467 906 q 693 798 633 853 q 785 658 753 743 q 817 457 817 574 q 785 254 817 340 q 694 112 753 168 q 555 28 636 56 q 374 0 474 0 l 107 0 m 311 165 l 350 165 q 456 181 408 165 q 536 230 503 196 q 588 319 569 264 q 607 457 607 375 q 588 592 607 538 q 536 680 569 647 q 456 726 503 713 q 350 740 408 740 l 311 740 l 311 165 m 229 -260 l 229 -131 l 640 -131 l 640 -260 l 229 -260 z \"},\"Đ\":{\"ha\":917,\"x_min\":36,\"x_max\":851,\"o\":\"m 36 418 l 36 510 l 142 517 l 142 906 l 397 906 q 585 879 501 906 q 728 798 668 853 q 819 658 788 743 q 851 457 851 574 q 819 254 851 340 q 729 112 788 168 q 590 28 671 56 q 408 0 508 0 l 142 0 l 142 418 l 36 418 m 346 165 l 385 165 q 490 181 443 165 q 571 230 538 196 q 623 319 604 264 q 642 457 642 375 q 623 592 642 538 q 571 680 604 647 q 490 726 538 713 q 385 740 443 740 l 346 740 l 346 517 l 519 517 l 519 418 l 346 418 l 346 165 z \"},\"È\":{\"ha\":761,\"x_min\":107,\"x_max\":688,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 m 414 944 l 160 1110 l 268 1242 l 506 1047 l 414 944 z \"},\"É\":{\"ha\":761,\"x_min\":107,\"x_max\":688,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 m 386 944 l 294 1047 l 532 1242 l 640 1110 l 386 944 z \"},\"Ê\":{\"ha\":761,\"x_min\":107,\"x_max\":688,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 m 164 1006 l 289 1160 l 511 1160 l 636 1006 l 547 951 l 403 1068 l 397 1068 l 253 951 l 164 1006 z \"},\"Ě\":{\"ha\":761,\"x_min\":107,\"x_max\":688,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 m 289 975 l 164 1128 l 253 1183 l 397 1067 l 403 1067 l 547 1183 l 636 1128 l 511 975 l 289 975 z \"},\"Ë\":{\"ha\":761,\"x_min\":107,\"x_max\":688,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 m 246 972 q 176 1000 203 972 q 149 1069 149 1028 q 176 1139 149 1111 q 246 1167 203 1167 q 316 1139 289 1167 q 343 1069 343 1111 q 316 1000 343 1028 q 246 972 289 972 m 554 972 q 484 1000 511 972 q 457 1069 457 1028 q 484 1139 457 1111 q 554 1167 511 1167 q 624 1139 597 1167 q 651 1069 651 1111 q 624 1000 651 1028 q 554 972 597 972 z \"},\"Ē\":{\"ha\":761,\"x_min\":107,\"x_max\":688,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 m 190 1001 l 190 1132 l 610 1132 l 610 1001 l 190 1001 z \"},\"Ĕ\":{\"ha\":761,\"x_min\":107,\"x_max\":688,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 m 400 968 q 240 1017 296 968 q 174 1158 183 1065 l 285 1178 q 324 1110 294 1135 q 400 1086 353 1086 q 476 1110 447 1086 q 515 1178 506 1135 l 626 1158 q 560 1017 617 1065 q 400 968 504 968 z \"},\"Ė\":{\"ha\":761,\"x_min\":107,\"x_max\":688,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 m 400 974 q 315 1003 349 974 q 282 1081 282 1033 q 315 1158 282 1128 q 400 1188 349 1188 q 485 1158 451 1188 q 518 1081 518 1128 q 485 1003 518 1033 q 400 974 451 974 z \"},\"Ẹ\":{\"ha\":761,\"x_min\":107,\"x_max\":688,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 m 410 -312 q 328 -283 360 -312 q 297 -206 297 -253 q 328 -128 297 -158 q 410 -99 360 -99 q 491 -128 460 -99 q 522 -206 522 -158 q 491 -283 522 -253 q 410 -312 460 -312 z \"},\"Ẻ\":{\"ha\":761,\"x_min\":107,\"x_max\":688,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 m 340 960 l 324 1040 q 368 1054 350 1046 q 386 1082 386 1063 q 361 1113 386 1101 q 275 1129 336 1125 l 299 1231 q 481 1194 428 1228 q 533 1104 533 1160 q 518 1042 533 1068 q 476 999 503 1017 q 415 972 450 982 q 340 960 379 963 z \"},\"Ẽ\":{\"ha\":761,\"x_min\":107,\"x_max\":688,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 m 499 961 q 433 974 461 961 q 383 1001 406 986 q 343 1029 361 1017 q 308 1042 325 1042 q 275 1026 289 1042 q 257 974 261 1011 l 125 983 q 179 1136 131 1089 q 301 1183 228 1183 q 367 1171 339 1183 q 417 1143 394 1158 q 457 1115 439 1128 q 492 1103 475 1103 q 525 1118 511 1103 q 543 1171 539 1133 l 675 1161 q 621 1009 669 1057 q 499 961 572 961 z \"},\"Ế\":{\"ha\":761,\"x_min\":107,\"x_max\":757,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 m 269 951 l 188 1006 l 313 1144 l 488 1144 l 613 1006 l 531 951 l 403 1051 l 397 1051 l 269 951 m 611 1054 l 550 1124 l 689 1243 l 757 1160 l 611 1054 z \"},\"Ề\":{\"ha\":761,\"x_min\":49,\"x_max\":688,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 m 269 951 l 188 1006 l 313 1144 l 488 1144 l 613 1006 l 531 951 l 403 1051 l 397 1051 l 269 951 m 250 1122 l 189 1054 l 49 1161 l 115 1243 l 250 1122 z \"},\"Ể\":{\"ha\":761,\"x_min\":107,\"x_max\":751,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 m 269 951 l 188 1006 l 313 1144 l 488 1144 l 613 1006 l 531 951 l 403 1051 l 397 1051 l 269 951 m 590 1042 l 575 1107 q 607 1119 594 1111 q 619 1144 619 1126 q 601 1175 619 1164 q 529 1190 582 1186 l 547 1274 q 706 1240 661 1271 q 751 1163 751 1208 q 705 1074 751 1101 q 590 1042 658 1047 z \"},\"Ễ\":{\"ha\":761,\"x_min\":107,\"x_max\":688,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 m 269 951 l 188 1006 l 313 1133 l 488 1133 l 613 1006 l 531 951 l 403 1039 l 397 1039 l 269 951 m 188 1183 q 225 1300 192 1263 q 317 1338 258 1338 q 368 1328 346 1338 q 408 1307 390 1318 q 441 1286 426 1296 q 471 1276 456 1276 q 515 1331 507 1276 l 613 1318 q 575 1201 608 1239 q 483 1164 542 1164 q 432 1174 454 1164 q 392 1194 410 1183 q 358 1215 374 1206 q 329 1225 343 1225 q 285 1172 293 1225 l 188 1183 z \"},\"Ệ\":{\"ha\":761,\"x_min\":107,\"x_max\":688,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 m 164 1006 l 289 1160 l 511 1160 l 636 1006 l 547 951 l 403 1068 l 397 1068 l 253 951 l 164 1006 m 410 -312 q 328 -283 360 -312 q 297 -206 297 -253 q 328 -128 297 -158 q 410 -99 360 -99 q 491 -128 460 -99 q 522 -206 522 -158 q 491 -283 522 -253 q 410 -312 460 -312 z \"},\"Ę\":{\"ha\":761,\"x_min\":107,\"x_max\":717,\"o\":\"m 571 -310 q 458 -276 504 -310 q 411 -179 411 -242 q 422 -119 411 -147 q 448 -69 432 -92 q 483 -28 464 -46 q 521 0 503 -11 l 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 681 0 q 635 -12 657 -1 q 597 -41 614 -24 q 571 -81 581 -58 q 561 -125 561 -103 q 579 -165 561 -153 q 619 -178 597 -178 q 646 -172 633 -178 q 669 -158 658 -165 l 717 -261 q 648 -296 689 -282 q 571 -310 607 -310 z \"},\"Ḗ\":{\"ha\":761,\"x_min\":107,\"x_max\":688,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 m 357 1158 l 289 1250 l 504 1399 l 588 1286 l 357 1158 m 190 1001 l 190 1132 l 610 1132 l 610 1001 l 190 1001 z \"},\"Ǵ\":{\"ha\":886,\"x_min\":64,\"x_max\":806,\"o\":\"m 507 -17 q 333 13 414 -17 q 192 101 251 43 q 98 247 132 160 q 64 447 64 333 q 99 648 64 560 q 194 797 133 736 q 335 890 254 858 q 506 922 415 922 q 675 886 604 922 q 790 804 746 850 l 683 674 q 610 725 649 704 q 513 746 571 746 q 416 726 460 746 q 340 668 372 706 q 291 576 308 631 q 274 454 274 522 q 337 237 274 314 q 528 160 400 160 q 582 167 556 160 q 625 188 608 174 l 625 343 l 475 343 l 475 510 l 806 510 l 806 93 q 681 15 758 47 q 507 -17 603 -17 m 496 944 l 404 1047 l 642 1242 l 750 1110 l 496 944 z \"},\"Ĝ\":{\"ha\":886,\"x_min\":64,\"x_max\":806,\"o\":\"m 507 -17 q 333 13 414 -17 q 192 101 251 43 q 98 247 132 160 q 64 447 64 333 q 99 648 64 560 q 194 797 133 736 q 335 890 254 858 q 506 922 415 922 q 675 886 604 922 q 790 804 746 850 l 683 674 q 610 725 649 704 q 513 746 571 746 q 416 726 460 746 q 340 668 372 706 q 291 576 308 631 q 274 454 274 522 q 337 237 274 314 q 528 160 400 160 q 582 167 556 160 q 625 188 608 174 l 625 343 l 475 343 l 475 510 l 806 510 l 806 93 q 681 15 758 47 q 507 -17 603 -17 m 274 1006 l 399 1160 l 621 1160 l 746 1006 l 657 951 l 513 1068 l 507 1068 l 363 951 l 274 1006 z \"},\"Ğ\":{\"ha\":886,\"x_min\":64,\"x_max\":806,\"o\":\"m 507 -17 q 333 13 414 -17 q 192 101 251 43 q 98 247 132 160 q 64 447 64 333 q 99 648 64 560 q 194 797 133 736 q 335 890 254 858 q 506 922 415 922 q 675 886 604 922 q 790 804 746 850 l 683 674 q 610 725 649 704 q 513 746 571 746 q 416 726 460 746 q 340 668 372 706 q 291 576 308 631 q 274 454 274 522 q 337 237 274 314 q 528 160 400 160 q 582 167 556 160 q 625 188 608 174 l 625 343 l 475 343 l 475 510 l 806 510 l 806 93 q 681 15 758 47 q 507 -17 603 -17 m 510 968 q 349 1017 406 968 q 283 1158 293 1065 l 394 1178 q 433 1110 404 1135 q 510 1086 463 1086 q 586 1110 557 1086 q 625 1178 615 1135 l 736 1158 q 670 1017 726 1065 q 510 968 614 968 z \"},\"Ġ\":{\"ha\":886,\"x_min\":64,\"x_max\":806,\"o\":\"m 507 -17 q 333 13 414 -17 q 192 101 251 43 q 98 247 132 160 q 64 447 64 333 q 99 648 64 560 q 194 797 133 736 q 335 890 254 858 q 506 922 415 922 q 675 886 604 922 q 790 804 746 850 l 683 674 q 610 725 649 704 q 513 746 571 746 q 416 726 460 746 q 340 668 372 706 q 291 576 308 631 q 274 454 274 522 q 337 237 274 314 q 528 160 400 160 q 582 167 556 160 q 625 188 608 174 l 625 343 l 475 343 l 475 510 l 806 510 l 806 93 q 681 15 758 47 q 507 -17 603 -17 m 510 974 q 425 1003 458 974 q 392 1081 392 1033 q 425 1158 392 1128 q 510 1188 458 1188 q 594 1158 561 1188 q 628 1081 628 1128 q 594 1003 628 1033 q 510 974 561 974 z \"},\"Ģ\":{\"ha\":886,\"x_min\":64,\"x_max\":806,\"o\":\"m 507 -17 q 333 13 414 -17 q 192 101 251 43 q 98 247 132 160 q 64 447 64 333 q 99 648 64 560 q 194 797 133 736 q 335 890 254 858 q 506 922 415 922 q 675 886 604 922 q 790 804 746 850 l 683 674 q 610 725 649 704 q 513 746 571 746 q 416 726 460 746 q 340 668 372 706 q 291 576 308 631 q 274 454 274 522 q 337 237 274 314 q 528 160 400 160 q 582 167 556 160 q 625 188 608 174 l 625 343 l 475 343 l 475 510 l 806 510 l 806 93 q 681 15 758 47 q 507 -17 603 -17 m 363 -332 l 347 -250 q 460 -233 429 -246 q 490 -196 490 -219 q 469 -164 490 -176 q 401 -147 449 -151 l 440 -72 q 594 -110 551 -82 q 636 -189 636 -137 q 565 -294 636 -260 q 363 -332 493 -328 z \"},\"Ǧ\":{\"ha\":886,\"x_min\":64,\"x_max\":806,\"o\":\"m 507 -17 q 333 13 414 -17 q 192 101 251 43 q 98 247 132 160 q 64 447 64 333 q 99 648 64 560 q 194 797 133 736 q 335 890 254 858 q 506 922 415 922 q 675 886 604 922 q 790 804 746 850 l 683 674 q 610 725 649 704 q 513 746 571 746 q 416 726 460 746 q 340 668 372 706 q 291 576 308 631 q 274 454 274 522 q 337 237 274 314 q 528 160 400 160 q 582 167 556 160 q 625 188 608 174 l 625 343 l 475 343 l 475 510 l 806 510 l 806 93 q 681 15 758 47 q 507 -17 603 -17 m 399 975 l 274 1128 l 363 1183 l 507 1067 l 513 1067 l 657 1183 l 746 1128 l 621 975 l 399 975 z \"},\"Ḡ\":{\"ha\":886,\"x_min\":64,\"x_max\":806,\"o\":\"m 507 -17 q 333 13 414 -17 q 192 101 251 43 q 98 247 132 160 q 64 447 64 333 q 99 648 64 560 q 194 797 133 736 q 335 890 254 858 q 506 922 415 922 q 675 886 604 922 q 790 804 746 850 l 683 674 q 610 725 649 704 q 513 746 571 746 q 416 726 460 746 q 340 668 372 706 q 291 576 308 631 q 274 454 274 522 q 337 237 274 314 q 528 160 400 160 q 582 167 556 160 q 625 188 608 174 l 625 343 l 475 343 l 475 510 l 806 510 l 806 93 q 681 15 758 47 q 507 -17 603 -17 m 300 1001 l 300 1132 l 719 1132 l 719 1001 l 300 1001 z \"},\"Ɠ\":{\"ha\":886,\"x_min\":64,\"x_max\":894,\"o\":\"m 507 -17 q 333 13 414 -17 q 192 101 251 43 q 98 247 132 160 q 64 447 64 333 q 99 648 64 560 q 194 797 133 736 q 335 890 254 858 q 506 922 415 922 q 543 921 525 922 q 578 917 561 919 q 577 928 578 924 q 576 940 576 933 q 590 1016 576 981 q 628 1078 603 1051 q 692 1121 654 1106 q 776 1136 729 1136 q 847 1131 819 1136 q 894 1118 874 1125 l 858 967 q 839 974 847 971 q 819 976 831 976 q 768 959 788 976 q 749 910 749 942 q 761 862 749 882 q 790 821 774 842 l 683 689 q 610 729 649 713 q 513 746 571 746 q 416 726 460 746 q 340 668 372 706 q 291 576 308 631 q 274 454 274 522 q 337 237 274 314 q 528 160 400 160 q 582 167 556 160 q 625 188 608 174 l 625 343 l 475 343 l 475 510 l 806 510 l 806 93 q 681 15 758 47 q 507 -17 603 -17 z \"},\"Ĥ\":{\"ha\":936,\"x_min\":107,\"x_max\":829,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 557 l 624 557 l 624 906 l 829 906 l 829 0 l 624 0 l 624 378 l 311 378 l 311 0 l 107 0 m 231 1006 l 356 1160 l 578 1160 l 703 1006 l 614 951 l 469 1068 l 464 1068 l 319 951 l 231 1006 z \"},\"Ḥ\":{\"ha\":936,\"x_min\":107,\"x_max\":829,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 557 l 624 557 l 624 906 l 829 906 l 829 0 l 624 0 l 624 378 l 311 378 l 311 0 l 107 0 m 467 -312 q 385 -283 417 -312 q 354 -206 354 -253 q 385 -128 354 -158 q 467 -99 417 -99 q 548 -128 517 -99 q 579 -206 579 -158 q 548 -283 579 -253 q 467 -312 517 -312 z \"},\"Ḫ\":{\"ha\":936,\"x_min\":107,\"x_max\":829,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 557 l 624 557 l 624 906 l 829 906 l 829 0 l 624 0 l 624 378 l 311 378 l 311 0 l 107 0 m 467 -322 q 364 -306 407 -322 q 292 -259 321 -289 q 248 -190 263 -229 q 232 -104 233 -150 l 349 -85 q 383 -162 356 -129 q 467 -194 411 -194 q 550 -162 522 -194 q 585 -85 578 -129 l 701 -104 q 685 -190 700 -150 q 642 -259 671 -229 q 570 -306 614 -289 q 467 -322 526 -322 z \"},\"Ħ\":{\"ha\":989,\"x_min\":35,\"x_max\":954,\"o\":\"m 35 675 l 35 765 l 135 774 l 135 906 l 339 906 l 339 774 l 651 774 l 651 906 l 857 906 l 857 774 l 954 774 l 954 675 l 857 675 l 857 0 l 651 0 l 651 378 l 339 378 l 339 0 l 135 0 l 135 675 l 35 675 m 339 557 l 651 557 l 651 675 l 339 675 l 339 557 z \"},\"Ì\":{\"ha\":418,\"x_min\":-32,\"x_max\":314,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 0 l 107 0 m 222 944 l -32 1110 l 76 1242 l 314 1047 l 222 944 z \"},\"Í\":{\"ha\":418,\"x_min\":103,\"x_max\":449,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 0 l 107 0 m 194 944 l 103 1047 l 340 1242 l 449 1110 l 194 944 z \"},\"Î\":{\"ha\":418,\"x_min\":-28,\"x_max\":444,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 0 l 107 0 m -28 1006 l 97 1160 l 319 1160 l 444 1006 l 356 951 l 211 1068 l 206 1068 l 61 951 l -28 1006 z \"},\"Ĩ\":{\"ha\":418,\"x_min\":-67,\"x_max\":483,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 0 l 107 0 m 307 961 q 242 974 269 961 q 192 1001 214 986 q 151 1029 169 1017 q 117 1042 133 1042 q 83 1026 97 1042 q 65 974 69 1011 l -67 983 q -12 1136 -61 1089 q 110 1183 36 1183 q 175 1171 147 1183 q 225 1143 203 1158 q 265 1115 247 1128 q 300 1103 283 1103 q 333 1118 319 1103 q 351 1171 347 1133 l 483 1161 q 429 1009 478 1057 q 307 961 381 961 z \"},\"Ï\":{\"ha\":418,\"x_min\":-43,\"x_max\":460,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 0 l 107 0 m 54 972 q -16 1000 11 972 q -43 1069 -43 1028 q -16 1139 -43 1111 q 54 1167 11 1167 q 124 1139 97 1167 q 151 1069 151 1111 q 124 1000 151 1028 q 54 972 97 972 m 363 972 q 292 1000 319 972 q 265 1069 265 1028 q 292 1139 265 1111 q 363 1167 319 1167 q 433 1139 406 1167 q 460 1069 460 1111 q 433 1000 460 1028 q 363 972 406 972 z \"},\"Ī\":{\"ha\":418,\"x_min\":-1,\"x_max\":418,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 0 l 107 0 m -1 1001 l -1 1132 l 418 1132 l 418 1001 l -1 1001 z \"},\"İ\":{\"ha\":418,\"x_min\":90,\"x_max\":326,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 0 l 107 0 m 208 974 q 124 1003 157 974 q 90 1081 90 1033 q 124 1158 90 1128 q 208 1188 157 1188 q 293 1158 260 1188 q 326 1081 326 1128 q 293 1003 326 1033 q 208 974 260 974 z \"},\"Ǐ\":{\"ha\":418,\"x_min\":-28,\"x_max\":444,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 0 l 107 0 m 97 975 l -28 1128 l 61 1183 l 206 1067 l 211 1067 l 356 1183 l 444 1128 l 319 975 l 97 975 z \"},\"Ỉ\":{\"ha\":418,\"x_min\":83,\"x_max\":342,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 0 l 107 0 m 149 960 l 132 1040 q 176 1054 158 1046 q 194 1082 194 1063 q 169 1113 194 1101 q 83 1129 144 1125 l 107 1231 q 289 1194 236 1228 q 342 1104 342 1160 q 326 1042 342 1068 q 285 999 311 1017 q 223 972 258 982 q 149 960 188 963 z \"},\"Ị\":{\"ha\":418,\"x_min\":96,\"x_max\":321,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 0 l 107 0 m 208 -312 q 127 -283 158 -312 q 96 -206 96 -253 q 127 -128 96 -158 q 208 -99 158 -99 q 290 -128 258 -99 q 321 -206 321 -158 q 290 -283 321 -253 q 208 -312 258 -312 z \"},\"Į\":{\"ha\":418,\"x_min\":58,\"x_max\":363,\"o\":\"m 218 -310 q 105 -276 151 -310 q 58 -179 58 -242 q 69 -118 58 -146 q 94 -67 79 -90 q 128 -28 110 -44 q 161 0 146 -11 l 107 0 l 107 906 l 311 906 l 311 0 q 232 -56 256 -24 q 208 -125 208 -89 q 226 -165 208 -153 q 265 -178 244 -178 q 294 -172 281 -178 q 317 -158 307 -165 l 363 -261 q 295 -296 336 -282 q 218 -310 254 -310 z \"},\"Ĭ\":{\"ha\":418,\"x_min\":-18,\"x_max\":435,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 0 l 107 0 m 208 968 q 48 1017 104 968 q -18 1158 -8 1065 l 93 1178 q 132 1110 103 1135 q 208 1086 161 1086 q 285 1110 256 1086 q 324 1178 314 1135 l 435 1158 q 369 1017 425 1065 q 208 968 313 968 z \"},\"Ĵ\":{\"ha\":707,\"x_min\":22,\"x_max\":735,\"o\":\"m 314 -17 q 140 24 210 -17 q 22 147 69 64 l 161 250 q 219 182 186 204 q 288 160 253 160 q 372 194 343 160 q 400 318 400 228 l 400 906 l 604 906 l 604 301 q 587 178 604 236 q 534 76 569 119 q 444 8 499 33 q 314 -17 389 -17 m 263 1006 l 388 1160 l 610 1160 l 735 1006 l 646 951 l 501 1068 l 496 1068 l 351 951 l 263 1006 z \"},\"Ķ\":{\"ha\":853,\"x_min\":107,\"x_max\":861,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 535 l 317 535 l 586 906 l 811 906 l 538 544 l 861 0 l 638 0 l 417 382 l 311 243 l 311 0 l 107 0 m 319 -332 l 304 -250 q 417 -233 386 -246 q 447 -196 447 -219 q 426 -164 447 -176 q 358 -147 406 -151 l 397 -72 q 551 -110 508 -82 q 593 -189 593 -137 q 522 -294 593 -260 q 319 -332 450 -328 z \"},\"Ḳ\":{\"ha\":853,\"x_min\":107,\"x_max\":861,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 535 l 317 535 l 586 906 l 811 906 l 538 544 l 861 0 l 638 0 l 417 382 l 311 243 l 311 0 l 107 0 m 461 -312 q 380 -283 411 -312 q 349 -206 349 -253 q 380 -128 349 -158 q 461 -99 411 -99 q 542 -128 511 -99 q 574 -206 574 -158 q 542 -283 574 -253 q 461 -312 511 -312 z \"},\"Ḵ\":{\"ha\":853,\"x_min\":107,\"x_max\":861,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 535 l 317 535 l 586 906 l 811 906 l 538 544 l 861 0 l 638 0 l 417 382 l 311 243 l 311 0 l 107 0 m 254 -260 l 254 -131 l 665 -131 l 665 -260 l 254 -260 z \"},\"Ĺ\":{\"ha\":719,\"x_min\":107,\"x_max\":669,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 172 l 669 172 l 669 0 l 107 0 m 200 944 l 108 1047 l 346 1242 l 454 1110 l 200 944 z \"},\"Ľ\":{\"ha\":719,\"x_min\":107,\"x_max\":669,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 172 l 669 172 l 669 0 l 107 0 m 490 710 l 482 1018 l 614 1018 l 611 922 l 578 710 l 490 710 z \"},\"Ļ\":{\"ha\":719,\"x_min\":107,\"x_max\":669,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 172 l 669 172 l 669 0 l 107 0 m 261 -332 l 246 -250 q 358 -233 328 -246 q 389 -196 389 -219 q 368 -164 389 -176 q 300 -147 347 -151 l 339 -72 q 492 -110 450 -82 q 535 -189 535 -137 q 463 -294 535 -260 q 261 -332 392 -328 z \"},\"Ŀ\":{\"ha\":719,\"x_min\":107,\"x_max\":693,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 172 l 669 172 l 669 0 l 107 0 m 569 328 q 481 365 517 328 q 446 456 446 401 q 481 548 446 511 q 569 585 517 585 q 658 548 622 585 q 693 456 693 511 q 658 365 693 401 q 569 328 622 328 z \"},\"Ḷ\":{\"ha\":719,\"x_min\":107,\"x_max\":669,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 172 l 669 172 l 669 0 l 107 0 m 403 -312 q 322 -283 353 -312 q 290 -206 290 -253 q 322 -128 290 -158 q 403 -99 353 -99 q 484 -128 453 -99 q 515 -206 515 -158 q 484 -283 515 -253 q 403 -312 453 -312 z \"},\"Ḹ\":{\"ha\":719,\"x_min\":4,\"x_max\":669,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 172 l 669 172 l 669 0 l 107 0 m 4 1001 l 4 1132 l 424 1132 l 424 1001 l 4 1001 m 403 -312 q 322 -283 353 -312 q 290 -206 290 -253 q 322 -128 290 -158 q 403 -99 353 -99 q 484 -128 453 -99 q 515 -206 515 -158 q 484 -283 515 -253 q 403 -312 453 -312 z \"},\"Ḻ\":{\"ha\":719,\"x_min\":107,\"x_max\":669,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 172 l 669 172 l 669 0 l 107 0 m 197 -260 l 197 -131 l 608 -131 l 608 -260 l 197 -260 z \"},\"Ł\":{\"ha\":728,\"x_min\":-32,\"x_max\":679,\"o\":\"m 38 244 l -32 367 l 117 450 l 117 906 l 321 906 l 321 544 l 540 665 l 610 543 l 321 386 l 321 172 l 679 172 l 679 0 l 117 0 l 117 292 l 38 244 z \"},\"Ḿ\":{\"ha\":1058,\"x_min\":107,\"x_max\":951,\"o\":\"m 107 0 l 107 906 l 331 906 l 476 503 q 503 420 490 463 q 529 336 515 378 l 535 336 q 560 420 549 378 q 586 503 572 463 l 729 906 l 951 906 l 951 0 l 765 0 l 765 332 q 768 406 765 365 q 775 487 771 446 q 783 567 779 528 q 792 640 788 607 l 786 640 l 713 425 l 583 79 l 471 79 l 342 425 l 269 640 l 264 640 q 272 567 268 607 q 281 487 276 528 q 288 406 285 446 q 290 332 290 365 l 290 0 l 107 0 m 515 944 l 424 1047 l 661 1242 l 769 1110 l 515 944 z \"},\"Ṁ\":{\"ha\":1058,\"x_min\":107,\"x_max\":951,\"o\":\"m 107 0 l 107 906 l 331 906 l 476 503 q 503 420 490 463 q 529 336 515 378 l 535 336 q 560 420 549 378 q 586 503 572 463 l 729 906 l 951 906 l 951 0 l 765 0 l 765 332 q 768 406 765 365 q 775 487 771 446 q 783 567 779 528 q 792 640 788 607 l 786 640 l 713 425 l 583 79 l 471 79 l 342 425 l 269 640 l 264 640 q 272 567 268 607 q 281 487 276 528 q 288 406 285 446 q 290 332 290 365 l 290 0 l 107 0 m 529 974 q 444 1003 478 974 q 411 1081 411 1033 q 444 1158 411 1128 q 529 1188 478 1188 q 614 1158 581 1188 q 647 1081 647 1128 q 614 1003 647 1033 q 529 974 581 974 z \"},\"Ṃ\":{\"ha\":1058,\"x_min\":107,\"x_max\":951,\"o\":\"m 107 0 l 107 906 l 331 906 l 476 503 q 503 420 490 463 q 529 336 515 378 l 535 336 q 560 420 549 378 q 586 503 572 463 l 729 906 l 951 906 l 951 0 l 765 0 l 765 332 q 768 406 765 365 q 775 487 771 446 q 783 567 779 528 q 792 640 788 607 l 786 640 l 713 425 l 583 79 l 471 79 l 342 425 l 269 640 l 264 640 q 272 567 268 607 q 281 487 276 528 q 288 406 285 446 q 290 332 290 365 l 290 0 l 107 0 m 532 -312 q 451 -283 482 -312 q 419 -206 419 -253 q 451 -128 419 -158 q 532 -99 482 -99 q 613 -128 582 -99 q 644 -206 644 -158 q 613 -283 644 -253 q 532 -312 582 -312 z \"},\"Ń\":{\"ha\":924,\"x_min\":107,\"x_max\":817,\"o\":\"m 107 0 l 107 906 l 317 906 l 553 456 l 642 256 l 647 256 q 631 417 640 328 q 622 586 622 506 l 622 906 l 817 906 l 817 0 l 607 0 l 371 451 l 282 649 l 276 649 q 292 488 283 574 q 301 321 301 401 l 301 0 l 107 0 m 449 944 l 357 1047 l 594 1242 l 703 1110 l 449 944 z \"},\"Ǹ\":{\"ha\":924,\"x_min\":107,\"x_max\":817,\"o\":\"m 107 0 l 107 906 l 317 906 l 553 456 l 642 256 l 647 256 q 631 417 640 328 q 622 586 622 506 l 622 906 l 817 906 l 817 0 l 607 0 l 371 451 l 282 649 l 276 649 q 292 488 283 574 q 301 321 301 401 l 301 0 l 107 0 m 476 944 l 222 1110 l 331 1242 l 568 1047 l 476 944 z \"},\"Ň\":{\"ha\":924,\"x_min\":107,\"x_max\":817,\"o\":\"m 107 0 l 107 906 l 317 906 l 553 456 l 642 256 l 647 256 q 631 417 640 328 q 622 586 622 506 l 622 906 l 817 906 l 817 0 l 607 0 l 371 451 l 282 649 l 276 649 q 292 488 283 574 q 301 321 301 401 l 301 0 l 107 0 m 351 975 l 226 1128 l 315 1183 l 460 1067 l 465 1067 l 610 1183 l 699 1128 l 574 975 l 351 975 z \"},\"Ñ\":{\"ha\":924,\"x_min\":107,\"x_max\":817,\"o\":\"m 107 0 l 107 906 l 317 906 l 553 456 l 642 256 l 647 256 q 631 417 640 328 q 622 586 622 506 l 622 906 l 817 906 l 817 0 l 607 0 l 371 451 l 282 649 l 276 649 q 292 488 283 574 q 301 321 301 401 l 301 0 l 107 0 m 561 961 q 496 974 524 961 q 446 1001 468 986 q 406 1029 424 1017 q 371 1042 388 1042 q 338 1026 351 1042 q 319 974 324 1011 l 188 983 q 242 1136 193 1089 q 364 1183 290 1183 q 429 1171 401 1183 q 479 1143 457 1158 q 519 1115 501 1128 q 554 1103 538 1103 q 588 1118 574 1103 q 606 1171 601 1133 l 738 1161 q 683 1009 732 1057 q 561 961 635 961 z \"},\"Ņ\":{\"ha\":924,\"x_min\":107,\"x_max\":817,\"o\":\"m 107 0 l 107 906 l 317 906 l 553 456 l 642 256 l 647 256 q 631 417 640 328 q 622 586 622 506 l 622 906 l 817 906 l 817 0 l 607 0 l 371 451 l 282 649 l 276 649 q 292 488 283 574 q 301 321 301 401 l 301 0 l 107 0 m 335 -332 l 319 -250 q 432 -233 401 -246 q 463 -196 463 -219 q 442 -164 463 -176 q 374 -147 421 -151 l 413 -72 q 566 -110 524 -82 q 608 -189 608 -137 q 537 -294 608 -260 q 335 -332 465 -328 z \"},\"Ṅ\":{\"ha\":924,\"x_min\":107,\"x_max\":817,\"o\":\"m 107 0 l 107 906 l 317 906 l 553 456 l 642 256 l 647 256 q 631 417 640 328 q 622 586 622 506 l 622 906 l 817 906 l 817 0 l 607 0 l 371 451 l 282 649 l 276 649 q 292 488 283 574 q 301 321 301 401 l 301 0 l 107 0 m 463 974 q 378 1003 411 974 q 344 1081 344 1033 q 378 1158 344 1128 q 463 1188 411 1188 q 547 1158 514 1188 q 581 1081 581 1128 q 547 1003 581 1033 q 463 974 514 974 z \"},\"Ṇ\":{\"ha\":924,\"x_min\":107,\"x_max\":817,\"o\":\"m 107 0 l 107 906 l 317 906 l 553 456 l 642 256 l 647 256 q 631 417 640 328 q 622 586 622 506 l 622 906 l 817 906 l 817 0 l 607 0 l 371 451 l 282 649 l 276 649 q 292 488 283 574 q 301 321 301 401 l 301 0 l 107 0 m 476 -312 q 395 -283 426 -312 q 364 -206 364 -253 q 395 -128 364 -158 q 476 -99 426 -99 q 558 -128 526 -99 q 589 -206 589 -158 q 558 -283 589 -253 q 476 -312 526 -312 z \"},\"Ṉ\":{\"ha\":924,\"x_min\":107,\"x_max\":817,\"o\":\"m 107 0 l 107 906 l 317 906 l 553 456 l 642 256 l 647 256 q 631 417 640 328 q 622 586 622 506 l 622 906 l 817 906 l 817 0 l 607 0 l 371 451 l 282 649 l 276 649 q 292 488 283 574 q 301 321 301 401 l 301 0 l 107 0 m 271 -260 l 271 -131 l 682 -131 l 682 -260 l 271 -260 z \"},\"Ò\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 308 16 383 -17 q 178 110 232 49 q 94 258 124 171 q 64 457 64 346 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 856 258 886 346 q 772 110 826 171 q 642 16 718 49 q 475 -17 567 -17 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 m 489 944 l 235 1110 l 343 1242 l 581 1047 l 489 944 z \"},\"Ó\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 308 16 383 -17 q 178 110 232 49 q 94 258 124 171 q 64 457 64 346 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 856 258 886 346 q 772 110 826 171 q 642 16 718 49 q 475 -17 567 -17 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 m 461 944 l 369 1047 l 607 1242 l 715 1110 l 461 944 z \"},\"Ô\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 308 16 383 -17 q 178 110 232 49 q 94 258 124 171 q 64 457 64 346 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 856 258 886 346 q 772 110 826 171 q 642 16 718 49 q 475 -17 567 -17 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 m 239 1006 l 364 1160 l 586 1160 l 711 1006 l 622 951 l 478 1068 l 472 1068 l 328 951 l 239 1006 z \"},\"Õ\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 308 16 383 -17 q 178 110 232 49 q 94 258 124 171 q 64 457 64 346 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 856 258 886 346 q 772 110 826 171 q 642 16 718 49 q 475 -17 567 -17 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 m 574 961 q 508 974 536 961 q 458 1001 481 986 q 418 1029 436 1017 q 383 1042 400 1042 q 350 1026 364 1042 q 332 974 336 1011 l 200 983 q 254 1136 206 1089 q 376 1183 303 1183 q 442 1171 414 1183 q 492 1143 469 1158 q 532 1115 514 1128 q 567 1103 550 1103 q 600 1118 586 1103 q 618 1171 614 1133 l 750 1161 q 696 1009 744 1057 q 574 961 647 961 z \"},\"Ö\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 308 16 383 -17 q 178 110 232 49 q 94 258 124 171 q 64 457 64 346 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 856 258 886 346 q 772 110 826 171 q 642 16 718 49 q 475 -17 567 -17 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 m 321 972 q 251 1000 278 972 q 224 1069 224 1028 q 251 1139 224 1111 q 321 1167 278 1167 q 391 1139 364 1167 q 418 1069 418 1111 q 391 1000 418 1028 q 321 972 364 972 m 629 972 q 559 1000 586 972 q 532 1069 532 1028 q 559 1139 532 1111 q 629 1167 586 1167 q 699 1139 672 1167 q 726 1069 726 1111 q 699 1000 726 1028 q 629 972 672 972 z \"},\"Ō\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 308 16 383 -17 q 178 110 232 49 q 94 258 124 171 q 64 457 64 346 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 856 258 886 346 q 772 110 826 171 q 642 16 718 49 q 475 -17 567 -17 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 m 265 1001 l 265 1132 l 685 1132 l 685 1001 l 265 1001 z \"},\"Ő\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 308 16 383 -17 q 178 110 232 49 q 94 258 124 171 q 64 457 64 346 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 856 258 886 346 q 772 110 826 171 q 642 16 718 49 q 475 -17 567 -17 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 m 288 1011 l 428 1235 l 557 1163 l 388 964 l 288 1011 m 547 1011 l 688 1235 l 818 1163 l 649 964 l 547 1011 z \"},\"Ǒ\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 308 16 383 -17 q 178 110 232 49 q 94 258 124 171 q 64 457 64 346 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 856 258 886 346 q 772 110 826 171 q 642 16 718 49 q 475 -17 567 -17 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 m 364 975 l 239 1128 l 328 1183 l 472 1067 l 478 1067 l 622 1183 l 711 1128 l 586 975 l 364 975 z \"},\"Ọ\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 308 16 383 -17 q 178 110 232 49 q 94 258 124 171 q 64 457 64 346 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 856 258 886 346 q 772 110 826 171 q 642 16 718 49 q 475 -17 567 -17 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 m 475 -312 q 394 -283 425 -312 q 363 -206 363 -253 q 394 -128 363 -158 q 475 -99 425 -99 q 556 -128 525 -99 q 588 -206 588 -158 q 556 -283 588 -253 q 475 -312 525 -312 z \"},\"Ỏ\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 308 16 383 -17 q 178 110 232 49 q 94 258 124 171 q 64 457 64 346 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 856 258 886 346 q 772 110 826 171 q 642 16 718 49 q 475 -17 567 -17 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 m 415 960 l 399 1040 q 443 1054 425 1046 q 461 1082 461 1063 q 436 1113 461 1101 q 350 1129 411 1125 l 374 1231 q 556 1194 503 1228 q 608 1104 608 1160 q 593 1042 608 1068 q 551 999 578 1017 q 490 972 525 982 q 415 960 454 963 z \"},\"Ố\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 308 16 383 -17 q 178 110 232 49 q 94 258 124 171 q 64 457 64 346 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 856 258 886 346 q 772 110 826 171 q 642 16 718 49 q 475 -17 567 -17 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 m 344 951 l 263 1006 l 388 1144 l 563 1144 l 688 1006 l 606 951 l 478 1051 l 472 1051 l 344 951 m 686 1054 l 625 1124 l 764 1243 l 832 1160 l 686 1054 z \"},\"Ồ\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 308 16 383 -17 q 178 110 232 49 q 94 258 124 171 q 64 457 64 346 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 856 258 886 346 q 772 110 826 171 q 642 16 718 49 q 475 -17 567 -17 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 m 344 951 l 263 1006 l 388 1144 l 563 1144 l 688 1006 l 606 951 l 478 1051 l 472 1051 l 344 951 m 325 1122 l 264 1054 l 124 1161 l 190 1243 l 325 1122 z \"},\"Ổ\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 308 16 383 -17 q 178 110 232 49 q 94 258 124 171 q 64 457 64 346 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 856 258 886 346 q 772 110 826 171 q 642 16 718 49 q 475 -17 567 -17 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 m 344 951 l 263 1006 l 388 1144 l 563 1144 l 688 1006 l 606 951 l 478 1051 l 472 1051 l 344 951 m 665 1042 l 650 1107 q 682 1119 669 1111 q 694 1144 694 1126 q 676 1175 694 1164 q 604 1190 657 1186 l 622 1274 q 781 1240 736 1271 q 826 1163 826 1208 q 780 1074 826 1101 q 665 1042 733 1047 z \"},\"Ỗ\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 308 16 383 -17 q 178 110 232 49 q 94 258 124 171 q 64 457 64 346 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 856 258 886 346 q 772 110 826 171 q 642 16 718 49 q 475 -17 567 -17 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 m 344 951 l 263 1006 l 388 1133 l 563 1133 l 688 1006 l 606 951 l 478 1039 l 472 1039 l 344 951 m 263 1183 q 300 1300 267 1263 q 392 1338 333 1338 q 443 1328 421 1338 q 483 1307 465 1318 q 516 1286 501 1296 q 546 1276 531 1276 q 590 1331 582 1276 l 688 1318 q 650 1201 683 1239 q 558 1164 617 1164 q 507 1174 529 1164 q 467 1194 485 1183 q 433 1215 449 1206 q 404 1225 418 1225 q 360 1172 368 1225 l 263 1183 z \"},\"Ộ\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 308 16 383 -17 q 178 110 232 49 q 94 258 124 171 q 64 457 64 346 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 856 258 886 346 q 772 110 826 171 q 642 16 718 49 q 475 -17 567 -17 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 m 239 1006 l 364 1160 l 586 1160 l 711 1006 l 622 951 l 478 1068 l 472 1068 l 328 951 l 239 1006 m 475 -312 q 394 -283 425 -312 q 363 -206 363 -253 q 394 -128 363 -158 q 475 -99 425 -99 q 556 -128 525 -99 q 588 -206 588 -158 q 556 -283 588 -253 q 475 -312 525 -312 z \"},\"Ŏ\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 308 16 383 -17 q 178 110 232 49 q 94 258 124 171 q 64 457 64 346 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 856 258 886 346 q 772 110 826 171 q 642 16 718 49 q 475 -17 567 -17 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 m 475 968 q 315 1017 371 968 q 249 1158 258 1065 l 360 1178 q 399 1110 369 1135 q 475 1086 428 1086 q 551 1110 522 1086 q 590 1178 581 1135 l 701 1158 q 635 1017 692 1065 q 475 968 579 968 z \"},\"Ṓ\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 308 16 383 -17 q 178 110 232 49 q 94 258 124 171 q 64 457 64 346 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 856 258 886 346 q 772 110 826 171 q 642 16 718 49 q 475 -17 567 -17 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 m 432 1158 l 364 1250 l 579 1399 l 663 1286 l 432 1158 m 265 1001 l 265 1132 l 685 1132 l 685 1001 l 265 1001 z \"},\"Ø\":{\"ha\":950,\"x_min\":56,\"x_max\":917,\"o\":\"m 476 -17 q 247 50 346 -17 l 161 -57 l 56 24 l 151 143 q 88 282 111 203 q 65 457 65 361 q 95 655 65 568 q 179 801 125 742 q 309 891 233 860 q 476 922 385 922 q 719 849 618 922 l 811 963 l 917 881 l 811 750 q 867 620 847 693 q 888 457 888 547 q 858 258 888 346 q 774 110 828 171 q 644 16 719 49 q 476 -17 568 -17 m 275 457 q 280 383 275 418 q 293 319 285 349 l 599 699 q 476 746 549 746 q 329 669 383 746 q 275 457 275 593 m 476 160 q 624 240 569 160 q 678 457 678 319 q 665 569 678 519 l 367 199 q 476 160 414 160 z \"},\"Œ\":{\"ha\":1210,\"x_min\":64,\"x_max\":1136,\"o\":\"m 518 0 q 338 28 421 0 q 194 112 256 56 q 99 254 133 168 q 64 457 64 340 q 99 658 64 574 q 195 798 133 743 q 342 879 257 853 q 529 906 428 906 l 1122 906 l 1122 733 l 779 733 l 779 551 l 1068 551 l 1068 381 l 779 381 l 779 172 l 1136 172 l 1136 0 l 518 0 m 542 165 l 574 165 l 574 740 l 542 740 q 433 726 482 740 q 348 680 383 713 q 293 593 313 647 q 274 457 274 539 q 293 319 274 375 q 348 228 313 263 q 433 180 383 194 q 542 165 482 165 z \"},\"Ơ\":{\"ha\":950,\"x_min\":65,\"x_max\":924,\"o\":\"m 476 -17 q 309 16 385 -17 q 179 110 233 49 q 95 258 125 171 q 65 457 65 346 q 95 655 65 568 q 179 801 125 742 q 309 891 233 860 q 476 922 385 922 q 669 879 583 922 q 731 913 710 890 q 753 979 753 935 q 746 1031 753 1007 q 731 1069 739 1054 l 882 1131 q 911 1072 899 1107 q 924 994 924 1036 q 883 876 924 919 q 764 811 843 832 q 855 662 822 750 q 888 457 888 574 q 858 258 888 346 q 774 110 828 171 q 644 16 719 49 q 476 -17 568 -17 m 476 160 q 624 240 569 160 q 678 457 678 319 q 624 669 678 593 q 476 746 569 746 q 329 669 383 746 q 275 457 275 593 q 329 240 275 319 q 476 160 383 160 z \"},\"Ớ\":{\"ha\":950,\"x_min\":65,\"x_max\":924,\"o\":\"m 476 -17 q 309 16 385 -17 q 179 110 233 49 q 95 258 125 171 q 65 457 65 346 q 95 655 65 568 q 179 801 125 742 q 309 891 233 860 q 476 922 385 922 q 669 879 583 922 q 731 913 710 890 q 753 979 753 935 q 746 1031 753 1007 q 731 1069 739 1054 l 882 1131 q 911 1072 899 1107 q 924 994 924 1036 q 883 876 924 919 q 764 811 843 832 q 855 662 822 750 q 888 457 888 574 q 858 258 888 346 q 774 110 828 171 q 644 16 719 49 q 476 -17 568 -17 m 476 160 q 624 240 569 160 q 678 457 678 319 q 624 669 678 593 q 476 746 569 746 q 329 669 383 746 q 275 457 275 593 q 329 240 275 319 q 476 160 383 160 m 461 944 l 369 1047 l 607 1242 l 715 1110 l 461 944 z \"},\"Ờ\":{\"ha\":950,\"x_min\":65,\"x_max\":924,\"o\":\"m 476 -17 q 309 16 385 -17 q 179 110 233 49 q 95 258 125 171 q 65 457 65 346 q 95 655 65 568 q 179 801 125 742 q 309 891 233 860 q 476 922 385 922 q 669 879 583 922 q 731 913 710 890 q 753 979 753 935 q 746 1031 753 1007 q 731 1069 739 1054 l 882 1131 q 911 1072 899 1107 q 924 994 924 1036 q 883 876 924 919 q 764 811 843 832 q 855 662 822 750 q 888 457 888 574 q 858 258 888 346 q 774 110 828 171 q 644 16 719 49 q 476 -17 568 -17 m 476 160 q 624 240 569 160 q 678 457 678 319 q 624 669 678 593 q 476 746 569 746 q 329 669 383 746 q 275 457 275 593 q 329 240 275 319 q 476 160 383 160 m 489 944 l 235 1110 l 343 1242 l 581 1047 l 489 944 z \"},\"Ở\":{\"ha\":950,\"x_min\":65,\"x_max\":924,\"o\":\"m 476 -17 q 309 16 385 -17 q 179 110 233 49 q 95 258 125 171 q 65 457 65 346 q 95 655 65 568 q 179 801 125 742 q 309 891 233 860 q 476 922 385 922 q 669 879 583 922 q 731 913 710 890 q 753 979 753 935 q 746 1031 753 1007 q 731 1069 739 1054 l 882 1131 q 911 1072 899 1107 q 924 994 924 1036 q 883 876 924 919 q 764 811 843 832 q 855 662 822 750 q 888 457 888 574 q 858 258 888 346 q 774 110 828 171 q 644 16 719 49 q 476 -17 568 -17 m 476 160 q 624 240 569 160 q 678 457 678 319 q 624 669 678 593 q 476 746 569 746 q 329 669 383 746 q 275 457 275 593 q 329 240 275 319 q 476 160 383 160 m 415 960 l 399 1040 q 443 1054 425 1046 q 461 1082 461 1063 q 436 1113 461 1101 q 350 1129 411 1125 l 374 1231 q 556 1194 503 1228 q 608 1104 608 1160 q 593 1042 608 1068 q 551 999 578 1017 q 490 972 525 982 q 415 960 454 963 z \"},\"Ỡ\":{\"ha\":950,\"x_min\":65,\"x_max\":924,\"o\":\"m 476 -17 q 309 16 385 -17 q 179 110 233 49 q 95 258 125 171 q 65 457 65 346 q 95 655 65 568 q 179 801 125 742 q 309 891 233 860 q 476 922 385 922 q 669 879 583 922 q 731 913 710 890 q 753 979 753 935 q 746 1031 753 1007 q 731 1069 739 1054 l 882 1131 q 911 1072 899 1107 q 924 994 924 1036 q 883 876 924 919 q 764 811 843 832 q 855 662 822 750 q 888 457 888 574 q 858 258 888 346 q 774 110 828 171 q 644 16 719 49 q 476 -17 568 -17 m 476 160 q 624 240 569 160 q 678 457 678 319 q 624 669 678 593 q 476 746 569 746 q 329 669 383 746 q 275 457 275 593 q 329 240 275 319 q 476 160 383 160 m 551 961 q 486 974 514 961 q 436 1001 458 986 q 396 1029 414 1017 q 361 1042 378 1042 q 328 1026 342 1042 q 310 974 314 1011 l 178 983 q 232 1136 183 1089 q 354 1183 281 1183 q 419 1171 392 1183 q 469 1143 447 1158 q 510 1115 492 1128 q 544 1103 528 1103 q 578 1118 564 1103 q 596 1171 592 1133 l 728 1161 q 674 1009 722 1057 q 551 961 625 961 z \"},\"Ợ\":{\"ha\":950,\"x_min\":65,\"x_max\":924,\"o\":\"m 476 -17 q 309 16 385 -17 q 179 110 233 49 q 95 258 125 171 q 65 457 65 346 q 95 655 65 568 q 179 801 125 742 q 309 891 233 860 q 476 922 385 922 q 669 879 583 922 q 731 913 710 890 q 753 979 753 935 q 746 1031 753 1007 q 731 1069 739 1054 l 882 1131 q 911 1072 899 1107 q 924 994 924 1036 q 883 876 924 919 q 764 811 843 832 q 855 662 822 750 q 888 457 888 574 q 858 258 888 346 q 774 110 828 171 q 644 16 719 49 q 476 -17 568 -17 m 476 160 q 624 240 569 160 q 678 457 678 319 q 624 669 678 593 q 476 746 569 746 q 329 669 383 746 q 275 457 275 593 q 329 240 275 319 q 476 160 383 160 m 475 -312 q 394 -283 425 -312 q 363 -206 363 -253 q 394 -128 363 -158 q 475 -99 425 -99 q 556 -128 525 -99 q 588 -206 588 -158 q 556 -283 588 -253 q 475 -312 525 -312 z \"},\"Ǫ\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 511 -310 q 398 -276 444 -310 q 351 -179 351 -242 q 379 -83 351 -125 q 439 -14 407 -42 q 283 27 353 -8 q 165 123 214 63 q 90 268 117 183 q 64 457 64 353 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 867 288 886 361 q 810 160 847 215 q 719 64 772 104 q 599 -7 665 24 q 523 -63 546 -31 q 500 -125 500 -96 q 518 -165 500 -153 q 558 -178 536 -178 q 585 -172 574 -178 q 608 -158 597 -165 l 656 -261 q 588 -296 628 -282 q 511 -310 547 -310 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 z \"},\"Ŕ\":{\"ha\":851,\"x_min\":107,\"x_max\":826,\"o\":\"m 107 0 l 107 906 l 433 906 q 569 892 506 906 q 679 845 632 878 q 754 758 726 813 q 782 624 782 704 q 738 459 782 524 q 621 363 694 394 l 826 0 l 597 0 l 424 326 l 311 326 l 311 0 l 107 0 m 311 489 l 417 489 q 540 523 497 489 q 582 624 582 557 q 540 717 582 690 q 417 743 497 743 l 311 743 l 311 489 m 414 944 l 322 1047 l 560 1242 l 668 1110 l 414 944 z \"},\"Ř\":{\"ha\":851,\"x_min\":107,\"x_max\":826,\"o\":\"m 107 0 l 107 906 l 433 906 q 569 892 506 906 q 679 845 632 878 q 754 758 726 813 q 782 624 782 704 q 738 459 782 524 q 621 363 694 394 l 826 0 l 597 0 l 424 326 l 311 326 l 311 0 l 107 0 m 311 489 l 417 489 q 540 523 497 489 q 582 624 582 557 q 540 717 582 690 q 417 743 497 743 l 311 743 l 311 489 m 317 975 l 192 1128 l 281 1183 l 425 1067 l 431 1067 l 575 1183 l 664 1128 l 539 975 l 317 975 z \"},\"Ṙ\":{\"ha\":851,\"x_min\":107,\"x_max\":826,\"o\":\"m 107 0 l 107 906 l 433 906 q 569 892 506 906 q 679 845 632 878 q 754 758 726 813 q 782 624 782 704 q 738 459 782 524 q 621 363 694 394 l 826 0 l 597 0 l 424 326 l 311 326 l 311 0 l 107 0 m 311 489 l 417 489 q 540 523 497 489 q 582 624 582 557 q 540 717 582 690 q 417 743 497 743 l 311 743 l 311 489 m 428 974 q 343 1003 376 974 q 310 1081 310 1033 q 343 1158 310 1128 q 428 1188 376 1188 q 513 1158 479 1188 q 546 1081 546 1128 q 513 1003 546 1033 q 428 974 479 974 z \"},\"Ŗ\":{\"ha\":851,\"x_min\":107,\"x_max\":826,\"o\":\"m 107 0 l 107 906 l 433 906 q 569 892 506 906 q 679 845 632 878 q 754 758 726 813 q 782 624 782 704 q 738 459 782 524 q 621 363 694 394 l 826 0 l 597 0 l 424 326 l 311 326 l 311 0 l 107 0 m 311 489 l 417 489 q 540 523 497 489 q 582 624 582 557 q 540 717 582 690 q 417 743 497 743 l 311 743 l 311 489 m 310 -332 l 294 -250 q 407 -233 376 -246 q 438 -196 438 -219 q 417 -164 438 -176 q 349 -147 396 -151 l 388 -72 q 541 -110 499 -82 q 583 -189 583 -137 q 512 -294 583 -260 q 310 -332 440 -328 z \"},\"Ṛ\":{\"ha\":851,\"x_min\":107,\"x_max\":826,\"o\":\"m 107 0 l 107 906 l 433 906 q 569 892 506 906 q 679 845 632 878 q 754 758 726 813 q 782 624 782 704 q 738 459 782 524 q 621 363 694 394 l 826 0 l 597 0 l 424 326 l 311 326 l 311 0 l 107 0 m 311 489 l 417 489 q 540 523 497 489 q 582 624 582 557 q 540 717 582 690 q 417 743 497 743 l 311 743 l 311 489 m 451 -312 q 370 -283 401 -312 q 339 -206 339 -253 q 370 -128 339 -158 q 451 -99 401 -99 q 533 -128 501 -99 q 564 -206 564 -158 q 533 -283 564 -253 q 451 -312 501 -312 z \"},\"Ṝ\":{\"ha\":851,\"x_min\":107,\"x_max\":826,\"o\":\"m 107 0 l 107 906 l 433 906 q 569 892 506 906 q 679 845 632 878 q 754 758 726 813 q 782 624 782 704 q 738 459 782 524 q 621 363 694 394 l 826 0 l 597 0 l 424 326 l 311 326 l 311 0 l 107 0 m 311 489 l 417 489 q 540 523 497 489 q 582 624 582 557 q 540 717 582 690 q 417 743 497 743 l 311 743 l 311 489 m 218 1001 l 218 1132 l 638 1132 l 638 1001 l 218 1001 m 451 -312 q 370 -283 401 -312 q 339 -206 339 -253 q 370 -128 339 -158 q 451 -99 401 -99 q 533 -128 501 -99 q 564 -206 564 -158 q 533 -283 564 -253 q 451 -312 501 -312 z \"},\"Ṟ\":{\"ha\":851,\"x_min\":107,\"x_max\":826,\"o\":\"m 107 0 l 107 906 l 433 906 q 569 892 506 906 q 679 845 632 878 q 754 758 726 813 q 782 624 782 704 q 738 459 782 524 q 621 363 694 394 l 826 0 l 597 0 l 424 326 l 311 326 l 311 0 l 107 0 m 311 489 l 417 489 q 540 523 497 489 q 582 624 582 557 q 540 717 582 690 q 417 743 497 743 l 311 743 l 311 489 m 246 -260 l 246 -131 l 657 -131 l 657 -260 l 246 -260 z \"},\"Ś\":{\"ha\":772,\"x_min\":49,\"x_max\":725,\"o\":\"m 383 -17 q 206 16 294 -17 q 49 114 118 49 l 165 254 q 273 186 214 213 q 389 160 332 160 q 484 183 453 160 q 515 247 515 207 q 506 283 515 268 q 480 310 497 299 q 438 333 463 322 q 385 356 414 343 l 267 406 q 199 442 232 419 q 141 494 167 464 q 100 563 115 524 q 85 653 85 603 q 108 758 85 708 q 175 844 132 807 q 277 901 218 881 q 407 922 336 922 q 563 892 486 922 q 699 803 640 861 l 594 674 q 506 727 550 708 q 407 746 461 746 q 323 724 354 746 q 292 664 292 703 q 302 628 292 643 q 331 602 313 614 q 375 580 350 590 q 429 557 400 569 l 546 510 q 677 418 629 476 q 725 264 725 360 q 702 156 725 207 q 635 67 679 106 q 528 6 592 29 q 383 -17 464 -17 m 390 944 l 299 1047 l 536 1242 l 644 1110 l 390 944 z \"},\"Ŝ\":{\"ha\":772,\"x_min\":49,\"x_max\":725,\"o\":\"m 383 -17 q 206 16 294 -17 q 49 114 118 49 l 165 254 q 273 186 214 213 q 389 160 332 160 q 484 183 453 160 q 515 247 515 207 q 506 283 515 268 q 480 310 497 299 q 438 333 463 322 q 385 356 414 343 l 267 406 q 199 442 232 419 q 141 494 167 464 q 100 563 115 524 q 85 653 85 603 q 108 758 85 708 q 175 844 132 807 q 277 901 218 881 q 407 922 336 922 q 563 892 486 922 q 699 803 640 861 l 594 674 q 506 727 550 708 q 407 746 461 746 q 323 724 354 746 q 292 664 292 703 q 302 628 292 643 q 331 602 313 614 q 375 580 350 590 q 429 557 400 569 l 546 510 q 677 418 629 476 q 725 264 725 360 q 702 156 725 207 q 635 67 679 106 q 528 6 592 29 q 383 -17 464 -17 m 168 1006 l 293 1160 l 515 1160 l 640 1006 l 551 951 l 407 1068 l 401 1068 l 257 951 l 168 1006 z \"},\"Š\":{\"ha\":772,\"x_min\":49,\"x_max\":725,\"o\":\"m 383 -17 q 206 16 294 -17 q 49 114 118 49 l 165 254 q 273 186 214 213 q 389 160 332 160 q 484 183 453 160 q 515 247 515 207 q 506 283 515 268 q 480 310 497 299 q 438 333 463 322 q 385 356 414 343 l 267 406 q 199 442 232 419 q 141 494 167 464 q 100 563 115 524 q 85 653 85 603 q 108 758 85 708 q 175 844 132 807 q 277 901 218 881 q 407 922 336 922 q 563 892 486 922 q 699 803 640 861 l 594 674 q 506 727 550 708 q 407 746 461 746 q 323 724 354 746 q 292 664 292 703 q 302 628 292 643 q 331 602 313 614 q 375 580 350 590 q 429 557 400 569 l 546 510 q 677 418 629 476 q 725 264 725 360 q 702 156 725 207 q 635 67 679 106 q 528 6 592 29 q 383 -17 464 -17 m 293 975 l 168 1128 l 257 1183 l 401 1067 l 407 1067 l 551 1183 l 640 1128 l 515 975 l 293 975 z \"},\"Ş\":{\"ha\":772,\"x_min\":49,\"x_max\":725,\"o\":\"m 383 -17 q 206 16 294 -17 q 49 114 118 49 l 165 254 q 273 186 214 213 q 389 160 332 160 q 484 183 453 160 q 515 247 515 207 q 506 283 515 268 q 480 310 497 299 q 438 333 463 322 q 385 356 414 343 l 267 406 q 199 442 232 419 q 141 494 167 464 q 100 563 115 524 q 85 653 85 603 q 108 758 85 708 q 175 844 132 807 q 277 901 218 881 q 407 922 336 922 q 563 892 486 922 q 699 803 640 861 l 594 674 q 506 727 550 708 q 407 746 461 746 q 323 724 354 746 q 292 664 292 703 q 302 628 292 643 q 331 602 313 614 q 375 580 350 590 q 429 557 400 569 l 546 510 q 677 418 629 476 q 725 264 725 360 q 702 156 725 207 q 635 67 679 106 q 528 6 592 29 q 383 -17 464 -17 m 247 -332 l 232 -250 q 344 -232 314 -246 q 375 -189 375 -218 q 353 -153 375 -168 q 268 -131 332 -139 l 335 6 l 454 6 l 415 -85 q 494 -121 468 -97 q 521 -189 521 -144 q 449 -294 521 -260 q 247 -332 378 -328 z \"},\"Ș\":{\"ha\":772,\"x_min\":49,\"x_max\":725,\"o\":\"m 383 -17 q 206 16 294 -17 q 49 114 118 49 l 165 254 q 273 186 214 213 q 389 160 332 160 q 484 183 453 160 q 515 247 515 207 q 506 283 515 268 q 480 310 497 299 q 438 333 463 322 q 385 356 414 343 l 267 406 q 199 442 232 419 q 141 494 167 464 q 100 563 115 524 q 85 653 85 603 q 108 758 85 708 q 175 844 132 807 q 277 901 218 881 q 407 922 336 922 q 563 892 486 922 q 699 803 640 861 l 594 674 q 506 727 550 708 q 407 746 461 746 q 323 724 354 746 q 292 664 292 703 q 302 628 292 643 q 331 602 313 614 q 375 580 350 590 q 429 557 400 569 l 546 510 q 677 418 629 476 q 725 264 725 360 q 702 156 725 207 q 635 67 679 106 q 528 6 592 29 q 383 -17 464 -17 m 247 -332 l 232 -250 q 344 -233 314 -246 q 375 -196 375 -219 q 354 -164 375 -176 q 286 -147 333 -151 l 325 -72 q 478 -110 436 -82 q 521 -189 521 -137 q 449 -294 521 -260 q 247 -332 378 -328 z \"},\"Ṡ\":{\"ha\":772,\"x_min\":49,\"x_max\":725,\"o\":\"m 383 -17 q 206 16 294 -17 q 49 114 118 49 l 165 254 q 273 186 214 213 q 389 160 332 160 q 484 183 453 160 q 515 247 515 207 q 506 283 515 268 q 480 310 497 299 q 438 333 463 322 q 385 356 414 343 l 267 406 q 199 442 232 419 q 141 494 167 464 q 100 563 115 524 q 85 653 85 603 q 108 758 85 708 q 175 844 132 807 q 277 901 218 881 q 407 922 336 922 q 563 892 486 922 q 699 803 640 861 l 594 674 q 506 727 550 708 q 407 746 461 746 q 323 724 354 746 q 292 664 292 703 q 302 628 292 643 q 331 602 313 614 q 375 580 350 590 q 429 557 400 569 l 546 510 q 677 418 629 476 q 725 264 725 360 q 702 156 725 207 q 635 67 679 106 q 528 6 592 29 q 383 -17 464 -17 m 404 974 q 319 1003 353 974 q 286 1081 286 1033 q 319 1158 286 1128 q 404 1188 353 1188 q 489 1158 456 1188 q 522 1081 522 1128 q 489 1003 522 1033 q 404 974 456 974 z \"},\"Ṣ\":{\"ha\":772,\"x_min\":49,\"x_max\":725,\"o\":\"m 383 -17 q 206 16 294 -17 q 49 114 118 49 l 165 254 q 273 186 214 213 q 389 160 332 160 q 484 183 453 160 q 515 247 515 207 q 506 283 515 268 q 480 310 497 299 q 438 333 463 322 q 385 356 414 343 l 267 406 q 199 442 232 419 q 141 494 167 464 q 100 563 115 524 q 85 653 85 603 q 108 758 85 708 q 175 844 132 807 q 277 901 218 881 q 407 922 336 922 q 563 892 486 922 q 699 803 640 861 l 594 674 q 506 727 550 708 q 407 746 461 746 q 323 724 354 746 q 292 664 292 703 q 302 628 292 643 q 331 602 313 614 q 375 580 350 590 q 429 557 400 569 l 546 510 q 677 418 629 476 q 725 264 725 360 q 702 156 725 207 q 635 67 679 106 q 528 6 592 29 q 383 -17 464 -17 m 389 -312 q 308 -283 339 -312 q 276 -206 276 -253 q 308 -128 276 -158 q 389 -99 339 -99 q 470 -128 439 -99 q 501 -206 501 -158 q 470 -283 501 -253 q 389 -312 439 -312 z \"},\"ẞ\":{\"ha\":979,\"x_min\":111,\"x_max\":925,\"o\":\"m 643 -17 q 488 14 553 -17 q 385 83 424 44 l 492 208 q 556 162 525 175 q 618 149 588 149 q 689 176 663 149 q 715 249 715 204 q 668 326 715 290 q 506 382 621 361 l 492 501 l 643 675 q 589 732 625 707 q 496 757 553 757 q 317 540 317 757 l 317 0 l 111 0 l 111 568 q 134 709 111 644 q 205 821 157 774 q 326 895 253 868 q 501 922 400 922 q 726 852 638 922 q 846 668 814 782 l 696 499 q 789 460 747 482 q 861 408 831 438 q 908 338 892 378 q 925 247 925 299 q 906 143 925 192 q 852 59 888 94 q 764 3 817 24 q 643 -17 711 -17 z \"},\"Ť\":{\"ha\":772,\"x_min\":35,\"x_max\":738,\"o\":\"m 283 0 l 283 733 l 35 733 l 35 906 l 738 906 l 738 733 l 489 733 l 489 0 l 283 0 m 275 975 l 150 1128 l 239 1183 l 383 1067 l 389 1067 l 533 1183 l 622 1128 l 497 975 l 275 975 z \"},\"Ţ\":{\"ha\":772,\"x_min\":35,\"x_max\":738,\"o\":\"m 283 0 l 283 733 l 35 733 l 35 906 l 738 906 l 738 733 l 489 733 l 489 0 l 283 0 m 247 -332 l 232 -250 q 344 -232 314 -246 q 375 -189 375 -218 q 353 -153 375 -168 q 268 -131 332 -139 l 335 6 l 454 6 l 415 -85 q 494 -121 468 -97 q 521 -189 521 -144 q 449 -294 521 -260 q 247 -332 378 -328 z \"},\"Ț\":{\"ha\":772,\"x_min\":35,\"x_max\":738,\"o\":\"m 283 0 l 283 733 l 35 733 l 35 906 l 738 906 l 738 733 l 489 733 l 489 0 l 283 0 m 244 -332 l 229 -250 q 342 -233 311 -246 q 372 -196 372 -219 q 351 -164 372 -176 q 283 -147 331 -151 l 322 -72 q 476 -110 433 -82 q 518 -189 518 -137 q 447 -294 518 -260 q 244 -332 375 -328 z \"},\"Ṭ\":{\"ha\":772,\"x_min\":35,\"x_max\":738,\"o\":\"m 283 0 l 283 733 l 35 733 l 35 906 l 738 906 l 738 733 l 489 733 l 489 0 l 283 0 m 386 -312 q 305 -283 336 -312 q 274 -206 274 -253 q 305 -128 274 -158 q 386 -99 336 -99 q 467 -128 436 -99 q 499 -206 499 -158 q 467 -283 499 -253 q 386 -312 436 -312 z \"},\"Ṯ\":{\"ha\":772,\"x_min\":35,\"x_max\":738,\"o\":\"m 283 0 l 283 733 l 35 733 l 35 906 l 738 906 l 738 733 l 489 733 l 489 0 l 283 0 m 181 -260 l 181 -131 l 592 -131 l 592 -260 l 181 -260 z \"},\"Ŧ\":{\"ha\":772,\"x_min\":35,\"x_max\":738,\"o\":\"m 283 0 l 283 396 l 119 396 l 119 486 l 250 494 l 283 494 l 283 733 l 35 733 l 35 906 l 738 906 l 738 733 l 489 733 l 489 494 l 653 494 l 653 396 l 489 396 l 489 0 l 283 0 z \"},\"Ù\":{\"ha\":924,\"x_min\":101,\"x_max\":821,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 821 906 l 821 419 q 730 88 821 192 q 464 -17 639 -17 m 475 944 l 221 1110 l 329 1242 l 567 1047 l 475 944 z \"},\"Ú\":{\"ha\":924,\"x_min\":101,\"x_max\":821,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 821 906 l 821 419 q 730 88 821 192 q 464 -17 639 -17 m 447 944 l 356 1047 l 593 1242 l 701 1110 l 447 944 z \"},\"Û\":{\"ha\":924,\"x_min\":101,\"x_max\":821,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 821 906 l 821 419 q 730 88 821 192 q 464 -17 639 -17 m 225 1006 l 350 1160 l 572 1160 l 697 1006 l 608 951 l 464 1068 l 458 1068 l 314 951 l 225 1006 z \"},\"Ũ\":{\"ha\":924,\"x_min\":101,\"x_max\":821,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 821 906 l 821 419 q 730 88 821 192 q 464 -17 639 -17 m 560 961 q 494 974 522 961 q 444 1001 467 986 q 404 1029 422 1017 q 369 1042 386 1042 q 336 1026 350 1042 q 318 974 322 1011 l 186 983 q 240 1136 192 1089 q 363 1183 289 1183 q 428 1171 400 1183 q 478 1143 456 1158 q 518 1115 500 1128 q 553 1103 536 1103 q 586 1118 572 1103 q 604 1171 600 1133 l 736 1161 q 682 1009 731 1057 q 560 961 633 961 z \"},\"Ü\":{\"ha\":924,\"x_min\":101,\"x_max\":821,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 821 906 l 821 419 q 730 88 821 192 q 464 -17 639 -17 m 307 972 q 237 1000 264 972 q 210 1069 210 1028 q 237 1139 210 1111 q 307 1167 264 1167 q 377 1139 350 1167 q 404 1069 404 1111 q 377 1000 404 1028 q 307 972 350 972 m 615 972 q 545 1000 572 972 q 518 1069 518 1028 q 545 1139 518 1111 q 615 1167 572 1167 q 685 1139 658 1167 q 713 1069 713 1111 q 685 1000 713 1028 q 615 972 658 972 z \"},\"Ū\":{\"ha\":924,\"x_min\":101,\"x_max\":821,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 821 906 l 821 419 q 730 88 821 192 q 464 -17 639 -17 m 251 1001 l 251 1132 l 671 1132 l 671 1001 l 251 1001 z \"},\"Ŭ\":{\"ha\":924,\"x_min\":101,\"x_max\":821,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 821 906 l 821 419 q 730 88 821 192 q 464 -17 639 -17 m 461 968 q 301 1017 357 968 q 235 1158 244 1065 l 346 1178 q 385 1110 356 1135 q 461 1086 414 1086 q 538 1110 508 1086 q 576 1178 567 1135 l 688 1158 q 622 1017 678 1065 q 461 968 565 968 z \"},\"Ů\":{\"ha\":924,\"x_min\":101,\"x_max\":821,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 821 906 l 821 419 q 730 88 821 192 q 464 -17 639 -17 m 461 968 q 347 1006 390 968 q 303 1106 303 1043 q 347 1205 303 1168 q 461 1242 390 1242 q 576 1205 532 1242 q 619 1106 619 1168 q 576 1006 619 1043 q 461 968 532 968 m 461 1044 q 502 1061 485 1044 q 519 1106 519 1078 q 502 1149 519 1133 q 461 1165 485 1165 q 420 1149 438 1165 q 403 1106 403 1133 q 420 1061 403 1078 q 461 1044 438 1044 z \"},\"Ű\":{\"ha\":924,\"x_min\":101,\"x_max\":821,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 821 906 l 821 419 q 730 88 821 192 q 464 -17 639 -17 m 274 1011 l 414 1235 l 543 1163 l 374 964 l 274 1011 m 533 1011 l 674 1235 l 804 1163 l 635 964 l 533 1011 z \"},\"Ǔ\":{\"ha\":924,\"x_min\":101,\"x_max\":821,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 821 906 l 821 419 q 730 88 821 192 q 464 -17 639 -17 m 350 975 l 225 1128 l 314 1183 l 458 1067 l 464 1067 l 608 1183 l 697 1128 l 572 975 l 350 975 z \"},\"Ǖ\":{\"ha\":924,\"x_min\":101,\"x_max\":821,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 821 906 l 821 419 q 730 88 821 192 q 464 -17 639 -17 m 307 972 q 246 997 269 972 q 222 1058 222 1022 q 246 1119 222 1094 q 307 1143 269 1143 q 369 1119 344 1143 q 393 1058 393 1094 q 369 997 393 1022 q 307 972 344 972 m 251 1211 l 251 1307 l 671 1307 l 671 1211 l 251 1211 m 615 972 q 553 997 578 972 q 529 1058 529 1022 q 553 1119 529 1094 q 615 1143 578 1143 q 676 1119 653 1143 q 700 1058 700 1094 q 676 997 700 1022 q 615 972 653 972 z \"},\"Ǘ\":{\"ha\":924,\"x_min\":101,\"x_max\":821,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 821 906 l 821 419 q 730 88 821 192 q 464 -17 639 -17 m 307 972 q 246 997 269 972 q 222 1058 222 1022 q 246 1119 222 1094 q 307 1143 269 1143 q 369 1119 344 1143 q 393 1058 393 1094 q 369 997 393 1022 q 307 972 344 972 m 385 1200 l 517 1401 l 644 1322 l 472 1146 l 385 1200 m 615 972 q 553 997 578 972 q 529 1058 529 1022 q 553 1119 529 1094 q 615 1143 578 1143 q 676 1119 653 1143 q 700 1058 700 1094 q 676 997 700 1022 q 615 972 653 972 z \"},\"Ǚ\":{\"ha\":924,\"x_min\":101,\"x_max\":821,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 821 906 l 821 419 q 730 88 821 192 q 464 -17 639 -17 m 374 1186 l 246 1328 l 328 1382 l 458 1281 l 464 1281 l 594 1382 l 676 1328 l 549 1186 l 374 1186 m 307 972 q 246 997 269 972 q 222 1058 222 1022 q 246 1119 222 1094 q 307 1143 269 1143 q 369 1119 344 1143 q 393 1058 393 1094 q 369 997 393 1022 q 307 972 344 972 m 615 972 q 553 997 578 972 q 529 1058 529 1022 q 553 1119 529 1094 q 615 1143 578 1143 q 676 1119 653 1143 q 700 1058 700 1094 q 676 997 700 1022 q 615 972 653 972 z \"},\"Ǜ\":{\"ha\":924,\"x_min\":101,\"x_max\":821,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 821 906 l 821 419 q 730 88 821 192 q 464 -17 639 -17 m 538 1200 l 450 1146 l 278 1322 l 406 1401 l 538 1200 m 307 972 q 246 997 269 972 q 222 1058 222 1022 q 246 1119 222 1094 q 307 1143 269 1143 q 369 1119 344 1143 q 393 1058 393 1094 q 369 997 393 1022 q 307 972 344 972 m 615 972 q 553 997 578 972 q 529 1058 529 1022 q 553 1119 529 1094 q 615 1143 578 1143 q 676 1119 653 1143 q 700 1058 700 1094 q 676 997 700 1022 q 615 972 653 972 z \"},\"Ụ\":{\"ha\":924,\"x_min\":101,\"x_max\":821,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 821 906 l 821 419 q 730 88 821 192 q 464 -17 639 -17 m 461 -312 q 380 -283 411 -312 q 349 -206 349 -253 q 380 -128 349 -158 q 461 -99 411 -99 q 542 -128 511 -99 q 574 -206 574 -158 q 542 -283 574 -253 q 461 -312 511 -312 z \"},\"Ủ\":{\"ha\":924,\"x_min\":101,\"x_max\":821,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 821 906 l 821 419 q 730 88 821 192 q 464 -17 639 -17 m 401 960 l 385 1040 q 429 1054 411 1046 q 447 1082 447 1063 q 422 1113 447 1101 q 336 1129 397 1125 l 360 1231 q 542 1194 489 1228 q 594 1104 594 1160 q 579 1042 594 1068 q 538 999 564 1017 q 476 972 511 982 q 401 960 440 963 z \"},\"Ų\":{\"ha\":924,\"x_min\":101,\"x_max\":821,\"o\":\"m 496 -310 q 383 -276 429 -310 q 338 -179 338 -242 q 348 -120 338 -147 q 373 -72 358 -93 q 402 -37 388 -51 q 426 -14 417 -22 q 184 101 267 -4 q 101 419 101 206 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 821 906 l 821 419 q 807 256 821 324 q 764 138 793 188 q 690 55 735 89 q 585 -7 646 21 q 509 -64 532 -31 q 486 -125 486 -97 q 504 -165 486 -153 q 544 -178 522 -178 q 571 -172 558 -178 q 594 -158 583 -165 l 642 -261 q 573 -296 614 -282 q 496 -310 532 -310 z \"},\"Ư\":{\"ha\":949,\"x_min\":101,\"x_max\":1007,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 721 906 q 763 911 742 907 q 799 926 783 915 q 826 956 815 936 q 836 1007 836 975 q 829 1058 836 1035 q 814 1097 822 1082 l 965 1158 q 994 1099 981 1135 q 1007 1022 1007 1064 q 958 891 1007 936 q 821 831 908 846 l 821 419 q 730 88 821 192 q 464 -17 639 -17 z \"},\"Ứ\":{\"ha\":949,\"x_min\":101,\"x_max\":1007,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 721 906 q 763 911 742 907 q 799 926 783 915 q 826 956 815 936 q 836 1007 836 975 q 829 1058 836 1035 q 814 1097 822 1082 l 965 1158 q 994 1099 981 1135 q 1007 1022 1007 1064 q 958 891 1007 936 q 821 831 908 846 l 821 419 q 730 88 821 192 q 464 -17 639 -17 m 447 944 l 356 1047 l 593 1242 l 701 1110 l 447 944 z \"},\"Ừ\":{\"ha\":949,\"x_min\":101,\"x_max\":1007,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 721 906 q 763 911 742 907 q 799 926 783 915 q 826 956 815 936 q 836 1007 836 975 q 829 1058 836 1035 q 814 1097 822 1082 l 965 1158 q 994 1099 981 1135 q 1007 1022 1007 1064 q 958 891 1007 936 q 821 831 908 846 l 821 419 q 730 88 821 192 q 464 -17 639 -17 m 475 944 l 221 1110 l 329 1242 l 567 1047 l 475 944 z \"},\"Ử\":{\"ha\":949,\"x_min\":101,\"x_max\":1007,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 721 906 q 763 911 742 907 q 799 926 783 915 q 826 956 815 936 q 836 1007 836 975 q 829 1058 836 1035 q 814 1097 822 1082 l 965 1158 q 994 1099 981 1135 q 1007 1022 1007 1064 q 958 891 1007 936 q 821 831 908 846 l 821 419 q 730 88 821 192 q 464 -17 639 -17 m 401 960 l 385 1040 q 429 1054 411 1046 q 447 1082 447 1063 q 422 1113 447 1101 q 336 1129 397 1125 l 360 1231 q 542 1194 489 1228 q 594 1104 594 1160 q 579 1042 594 1068 q 538 999 564 1017 q 476 972 511 982 q 401 960 440 963 z \"},\"Ữ\":{\"ha\":949,\"x_min\":101,\"x_max\":1007,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 721 906 q 763 911 742 907 q 799 926 783 915 q 826 956 815 936 q 836 1007 836 975 q 829 1058 836 1035 q 814 1097 822 1082 l 965 1158 q 994 1099 981 1135 q 1007 1022 1007 1064 q 958 891 1007 936 q 821 831 908 846 l 821 419 q 730 88 821 192 q 464 -17 639 -17 m 560 961 q 494 974 522 961 q 444 1001 467 986 q 404 1029 422 1017 q 369 1042 386 1042 q 336 1026 350 1042 q 318 974 322 1011 l 186 983 q 240 1136 192 1089 q 363 1183 289 1183 q 428 1171 400 1183 q 478 1143 456 1158 q 518 1115 500 1128 q 553 1103 536 1103 q 586 1118 572 1103 q 604 1171 600 1133 l 736 1161 q 682 1009 731 1057 q 560 961 633 961 z \"},\"Ự\":{\"ha\":949,\"x_min\":101,\"x_max\":1007,\"o\":\"m 464 -17 q 194 88 288 -17 q 101 419 101 192 l 101 906 l 307 906 l 307 399 q 347 213 307 265 q 464 160 388 160 q 582 213 540 160 q 624 399 624 265 l 624 906 l 721 906 q 763 911 742 907 q 799 926 783 915 q 826 956 815 936 q 836 1007 836 975 q 829 1058 836 1035 q 814 1097 822 1082 l 965 1158 q 994 1099 981 1135 q 1007 1022 1007 1064 q 958 891 1007 936 q 821 831 908 846 l 821 419 q 730 88 821 192 q 464 -17 639 -17 m 461 -312 q 380 -283 411 -312 q 349 -206 349 -253 q 380 -128 349 -158 q 461 -99 411 -99 q 542 -128 511 -99 q 574 -206 574 -158 q 542 -283 574 -253 q 461 -312 511 -312 z \"},\"Ẁ\":{\"ha\":1129,\"x_min\":19,\"x_max\":1111,\"o\":\"m 188 0 l 19 906 l 229 906 l 292 482 q 310 340 300 411 q 328 196 319 268 l 333 196 q 360 340 347 268 q 388 482 374 411 l 485 906 l 658 906 l 756 482 q 783 341 769 413 q 810 196 796 269 l 815 196 q 834 340 825 269 q 853 482 843 411 l 915 906 l 1111 906 l 950 0 l 693 0 l 604 411 q 584 517 593 464 q 568 621 575 571 l 563 621 q 545 517 554 571 q 525 411 536 464 l 440 0 l 188 0 m 578 944 l 324 1110 l 432 1242 l 669 1047 l 578 944 z \"},\"Ẃ\":{\"ha\":1129,\"x_min\":19,\"x_max\":1111,\"o\":\"m 188 0 l 19 906 l 229 906 l 292 482 q 310 340 300 411 q 328 196 319 268 l 333 196 q 360 340 347 268 q 388 482 374 411 l 485 906 l 658 906 l 756 482 q 783 341 769 413 q 810 196 796 269 l 815 196 q 834 340 825 269 q 853 482 843 411 l 915 906 l 1111 906 l 950 0 l 693 0 l 604 411 q 584 517 593 464 q 568 621 575 571 l 563 621 q 545 517 554 571 q 525 411 536 464 l 440 0 l 188 0 m 550 944 l 458 1047 l 696 1242 l 804 1110 l 550 944 z \"},\"Ŵ\":{\"ha\":1129,\"x_min\":19,\"x_max\":1111,\"o\":\"m 188 0 l 19 906 l 229 906 l 292 482 q 310 340 300 411 q 328 196 319 268 l 333 196 q 360 340 347 268 q 388 482 374 411 l 485 906 l 658 906 l 756 482 q 783 341 769 413 q 810 196 796 269 l 815 196 q 834 340 825 269 q 853 482 843 411 l 915 906 l 1111 906 l 950 0 l 693 0 l 604 411 q 584 517 593 464 q 568 621 575 571 l 563 621 q 545 517 554 571 q 525 411 536 464 l 440 0 l 188 0 m 328 1006 l 453 1160 l 675 1160 l 800 1006 l 711 951 l 567 1068 l 561 1068 l 417 951 l 328 1006 z \"},\"Ẅ\":{\"ha\":1129,\"x_min\":19,\"x_max\":1111,\"o\":\"m 188 0 l 19 906 l 229 906 l 292 482 q 310 340 300 411 q 328 196 319 268 l 333 196 q 360 340 347 268 q 388 482 374 411 l 485 906 l 658 906 l 756 482 q 783 341 769 413 q 810 196 796 269 l 815 196 q 834 340 825 269 q 853 482 843 411 l 915 906 l 1111 906 l 950 0 l 693 0 l 604 411 q 584 517 593 464 q 568 621 575 571 l 563 621 q 545 517 554 571 q 525 411 536 464 l 440 0 l 188 0 m 410 972 q 340 1000 367 972 q 313 1069 313 1028 q 340 1139 313 1111 q 410 1167 367 1167 q 480 1139 453 1167 q 507 1069 507 1111 q 480 1000 507 1028 q 410 972 453 972 m 718 972 q 648 1000 675 972 q 621 1069 621 1028 q 648 1139 621 1111 q 718 1167 675 1167 q 788 1139 761 1167 q 815 1069 815 1111 q 788 1000 815 1028 q 718 972 761 972 z \"},\"Ỳ\":{\"ha\":729,\"x_min\":-11,\"x_max\":740,\"o\":\"m 263 0 l 263 322 l -11 906 l 208 906 l 289 697 q 326 598 308 646 q 363 497 343 550 l 368 497 q 406 598 388 550 q 444 697 425 646 l 526 906 l 740 906 l 467 322 l 467 0 l 263 0 m 378 944 l 124 1110 l 232 1242 l 469 1047 l 378 944 z \"},\"Ý\":{\"ha\":729,\"x_min\":-11,\"x_max\":740,\"o\":\"m 263 0 l 263 322 l -11 906 l 208 906 l 289 697 q 326 598 308 646 q 363 497 343 550 l 368 497 q 406 598 388 550 q 444 697 425 646 l 526 906 l 740 906 l 467 322 l 467 0 l 263 0 m 350 944 l 258 1047 l 496 1242 l 604 1110 l 350 944 z \"},\"Ŷ\":{\"ha\":729,\"x_min\":-11,\"x_max\":740,\"o\":\"m 263 0 l 263 322 l -11 906 l 208 906 l 289 697 q 326 598 308 646 q 363 497 343 550 l 368 497 q 406 598 388 550 q 444 697 425 646 l 526 906 l 740 906 l 467 322 l 467 0 l 263 0 m 128 1006 l 253 1160 l 475 1160 l 600 1006 l 511 951 l 367 1068 l 361 1068 l 217 951 l 128 1006 z \"},\"Ÿ\":{\"ha\":729,\"x_min\":-11,\"x_max\":740,\"o\":\"m 263 0 l 263 322 l -11 906 l 208 906 l 289 697 q 326 598 308 646 q 363 497 343 550 l 368 497 q 406 598 388 550 q 444 697 425 646 l 526 906 l 740 906 l 467 322 l 467 0 l 263 0 m 210 972 q 140 1000 167 972 q 113 1069 113 1028 q 140 1139 113 1111 q 210 1167 167 1167 q 280 1139 253 1167 q 307 1069 307 1111 q 280 1000 307 1028 q 210 972 253 972 m 518 972 q 448 1000 475 972 q 421 1069 421 1028 q 448 1139 421 1111 q 518 1167 475 1167 q 588 1139 561 1167 q 615 1069 615 1111 q 588 1000 615 1028 q 518 972 561 972 z \"},\"Ẏ\":{\"ha\":729,\"x_min\":-11,\"x_max\":740,\"o\":\"m 263 0 l 263 322 l -11 906 l 208 906 l 289 697 q 326 598 308 646 q 363 497 343 550 l 368 497 q 406 598 388 550 q 444 697 425 646 l 526 906 l 740 906 l 467 322 l 467 0 l 263 0 m 364 974 q 279 1003 313 974 q 246 1081 246 1033 q 279 1158 246 1128 q 364 1188 313 1188 q 449 1158 415 1188 q 482 1081 482 1128 q 449 1003 482 1033 q 364 974 415 974 z \"},\"Ỵ\":{\"ha\":729,\"x_min\":-11,\"x_max\":740,\"o\":\"m 263 0 l 263 322 l -11 906 l 208 906 l 289 697 q 326 598 308 646 q 363 497 343 550 l 368 497 q 406 598 388 550 q 444 697 425 646 l 526 906 l 740 906 l 467 322 l 467 0 l 263 0 m 367 -312 q 285 -283 317 -312 q 254 -206 254 -253 q 285 -128 254 -158 q 367 -99 317 -99 q 448 -128 417 -99 q 479 -206 479 -158 q 448 -283 479 -253 q 367 -312 417 -312 z \"},\"Ỷ\":{\"ha\":729,\"x_min\":-11,\"x_max\":740,\"o\":\"m 263 0 l 263 322 l -11 906 l 208 906 l 289 697 q 326 598 308 646 q 363 497 343 550 l 368 497 q 406 598 388 550 q 444 697 425 646 l 526 906 l 740 906 l 467 322 l 467 0 l 263 0 m 304 960 l 288 1040 q 332 1054 314 1046 q 350 1082 350 1063 q 325 1113 350 1101 q 239 1129 300 1125 l 263 1231 q 444 1194 392 1228 q 497 1104 497 1160 q 482 1042 497 1068 q 440 999 467 1017 q 378 972 414 982 q 304 960 343 963 z \"},\"Ỹ\":{\"ha\":729,\"x_min\":-11,\"x_max\":740,\"o\":\"m 263 0 l 263 322 l -11 906 l 208 906 l 289 697 q 326 598 308 646 q 363 497 343 550 l 368 497 q 406 598 388 550 q 444 697 425 646 l 526 906 l 740 906 l 467 322 l 467 0 l 263 0 m 463 961 q 397 974 425 961 q 347 1001 369 986 q 307 1029 325 1017 q 272 1042 289 1042 q 239 1026 253 1042 q 221 974 225 1011 l 89 983 q 143 1136 94 1089 q 265 1183 192 1183 q 331 1171 303 1183 q 381 1143 358 1158 q 421 1115 403 1128 q 456 1103 439 1103 q 489 1118 475 1103 q 507 1171 503 1133 l 639 1161 q 585 1009 633 1057 q 463 961 536 961 z \"},\"Ź\":{\"ha\":751,\"x_min\":50,\"x_max\":706,\"o\":\"m 50 0 l 50 124 l 450 733 l 88 733 l 88 906 l 701 906 l 701 782 l 301 172 l 706 172 l 706 0 l 50 0 m 378 944 l 286 1047 l 524 1242 l 632 1110 l 378 944 z \"},\"Ž\":{\"ha\":751,\"x_min\":50,\"x_max\":706,\"o\":\"m 50 0 l 50 124 l 450 733 l 88 733 l 88 906 l 701 906 l 701 782 l 301 172 l 706 172 l 706 0 l 50 0 m 281 975 l 156 1128 l 244 1183 l 389 1067 l 394 1067 l 539 1183 l 628 1128 l 503 975 l 281 975 z \"},\"Ż\":{\"ha\":751,\"x_min\":50,\"x_max\":706,\"o\":\"m 50 0 l 50 124 l 450 733 l 88 733 l 88 906 l 701 906 l 701 782 l 301 172 l 706 172 l 706 0 l 50 0 m 392 974 q 307 1003 340 974 q 274 1081 274 1033 q 307 1158 274 1128 q 392 1188 340 1188 q 476 1158 443 1188 q 510 1081 510 1128 q 476 1003 510 1033 q 392 974 443 974 z \"},\"Ẓ\":{\"ha\":751,\"x_min\":50,\"x_max\":706,\"o\":\"m 50 0 l 50 124 l 450 733 l 88 733 l 88 906 l 701 906 l 701 782 l 301 172 l 706 172 l 706 0 l 50 0 m 390 -312 q 309 -283 340 -312 q 278 -206 278 -253 q 309 -128 278 -158 q 390 -99 340 -99 q 472 -128 440 -99 q 503 -206 503 -158 q 472 -283 503 -253 q 390 -312 440 -312 z \"},\"Ẕ\":{\"ha\":751,\"x_min\":50,\"x_max\":706,\"o\":\"m 50 0 l 50 124 l 450 733 l 88 733 l 88 906 l 701 906 l 701 782 l 301 172 l 706 172 l 706 0 l 50 0 m 185 -260 l 185 -131 l 596 -131 l 596 -260 l 185 -260 z \"},\"Ð\":{\"ha\":917,\"x_min\":36,\"x_max\":851,\"o\":\"m 36 418 l 36 510 l 142 517 l 142 906 l 397 906 q 585 879 501 906 q 728 798 668 853 q 819 658 788 743 q 851 457 851 574 q 819 254 851 340 q 729 112 788 168 q 590 28 671 56 q 408 0 508 0 l 142 0 l 142 418 l 36 418 m 346 165 l 385 165 q 490 181 443 165 q 571 230 538 196 q 623 319 604 264 q 642 457 642 375 q 623 592 642 538 q 571 680 604 647 q 490 726 538 713 q 385 740 443 740 l 346 740 l 346 517 l 519 517 l 519 418 l 346 418 l 346 165 z \"},\"Þ\":{\"ha\":857,\"x_min\":107,\"x_max\":792,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 768 l 438 768 q 576 753 511 768 q 688 705 640 739 q 764 615 736 671 q 792 478 792 560 q 763 340 792 397 q 686 244 735 282 q 574 189 638 207 q 438 171 510 171 l 311 171 l 311 0 l 107 0 m 311 333 l 425 333 q 592 478 592 333 q 549 577 592 549 q 425 606 507 606 l 311 606 l 311 333 z \"},\"Ə\":{\"ha\":938,\"x_min\":71,\"x_max\":874,\"o\":\"m 467 -17 q 302 13 375 -17 q 178 102 229 43 q 99 248 126 161 q 71 449 71 335 q 75 517 71 481 l 668 517 q 603 697 657 639 q 449 754 549 754 q 335 728 383 754 q 250 669 286 703 l 157 810 q 288 890 210 858 q 472 922 367 922 q 635 892 561 922 q 763 803 710 863 q 844 657 815 744 q 874 454 874 569 q 844 251 874 339 q 762 103 815 163 q 633 14 708 44 q 467 -17 558 -17 m 467 150 q 598 202 546 150 q 665 367 650 254 l 279 367 q 337 201 288 253 q 467 150 386 150 z \"},\"Ŋ\":{\"ha\":925,\"x_min\":107,\"x_max\":861,\"o\":\"m 572 -17 q 504 -10 540 -17 q 447 10 468 -4 l 492 186 q 517 177 503 181 q 549 174 531 174 q 588 185 569 174 q 621 228 607 197 q 643 316 635 260 q 651 460 651 372 q 608 681 651 615 q 489 746 565 746 q 396 717 446 746 q 311 632 346 688 l 311 0 l 107 0 l 107 906 l 304 906 l 304 808 q 418 893 357 864 q 550 922 479 922 q 674 897 617 922 q 772 817 731 872 q 838 674 814 763 q 861 460 861 586 q 791 100 861 217 q 572 -17 721 -17 z \"},\"Ĳ\":{\"ha\":836,\"x_min\":107,\"x_max\":731,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 0 l 107 0 m 483 -253 q 412 -247 440 -253 q 361 -233 383 -242 l 399 -82 q 425 -89 413 -86 q 451 -92 438 -92 q 509 -65 493 -92 q 525 19 525 -39 l 525 906 l 731 906 l 731 25 q 718 -83 731 -32 q 677 -171 706 -133 q 601 -231 649 -208 q 483 -253 554 -253 z \"},\"à\":{\"ha\":732,\"x_min\":58,\"x_max\":650,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 m 368 794 l 117 1013 l 254 1147 l 468 894 l 368 794 z \"},\"á\":{\"ha\":732,\"x_min\":58,\"x_max\":650,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 m 396 794 l 296 894 l 510 1147 l 647 1013 l 396 794 z \"},\"â\":{\"ha\":732,\"x_min\":58,\"x_max\":650,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 m 128 851 l 278 1033 l 486 1033 l 636 851 l 558 779 l 385 907 l 379 907 l 206 779 l 128 851 z \"},\"ã\":{\"ha\":732,\"x_min\":58,\"x_max\":650,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 m 474 796 q 415 810 440 796 q 367 840 389 824 q 328 871 346 857 q 294 885 311 885 q 262 867 274 885 q 246 808 250 849 l 118 815 q 165 975 121 924 q 290 1026 210 1026 q 349 1013 324 1026 q 397 982 375 999 q 435 951 418 965 q 469 938 453 938 q 518 1014 510 938 l 646 1007 q 599 847 643 899 q 474 796 554 796 z \"},\"ä\":{\"ha\":732,\"x_min\":58,\"x_max\":650,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 m 231 790 q 158 819 186 790 q 131 890 131 847 q 158 960 131 932 q 231 989 186 989 q 302 960 275 989 q 329 890 329 932 q 302 819 329 847 q 231 790 275 790 m 533 790 q 462 819 489 790 q 435 890 435 847 q 462 960 435 932 q 533 989 489 989 q 606 960 578 989 q 633 890 633 932 q 606 819 633 847 q 533 790 578 790 z \"},\"ā\":{\"ha\":732,\"x_min\":58,\"x_max\":650,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 m 176 822 l 176 951 l 588 951 l 588 822 l 176 822 z \"},\"ă\":{\"ha\":732,\"x_min\":58,\"x_max\":650,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 m 382 794 q 279 811 322 794 q 207 858 236 828 q 163 927 178 888 q 147 1013 149 967 l 264 1032 q 299 955 271 988 q 382 922 326 922 q 465 955 438 922 q 500 1032 493 988 l 617 1013 q 601 927 615 967 q 558 858 586 888 q 485 811 529 828 q 382 794 442 794 z \"},\"å\":{\"ha\":732,\"x_min\":58,\"x_max\":650,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 m 382 783 q 244 825 290 783 q 199 928 199 867 q 244 1031 199 989 q 382 1072 290 1072 q 519 1031 474 1072 q 565 928 565 989 q 519 825 565 867 q 382 783 474 783 m 382 860 q 424 878 407 860 q 442 928 442 897 q 424 977 442 958 q 382 996 407 996 q 340 977 357 996 q 322 928 322 958 q 340 878 322 897 q 382 860 357 860 z \"},\"ǎ\":{\"ha\":732,\"x_min\":58,\"x_max\":650,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 m 278 801 l 128 983 l 206 1056 l 379 928 l 385 928 l 558 1056 l 636 983 l 486 801 l 278 801 z \"},\"ạ\":{\"ha\":732,\"x_min\":58,\"x_max\":650,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 m 358 -312 q 277 -283 308 -312 q 246 -206 246 -253 q 277 -128 246 -158 q 358 -99 308 -99 q 440 -128 408 -99 q 471 -206 471 -158 q 440 -283 471 -253 q 358 -312 408 -312 z \"},\"ả\":{\"ha\":732,\"x_min\":58,\"x_max\":650,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 m 322 789 l 306 869 q 350 885 332 875 q 368 918 368 896 q 343 958 368 943 q 257 976 318 972 l 269 1101 q 385 1087 338 1100 q 461 1052 432 1074 q 503 1000 490 1031 q 517 933 517 969 q 501 872 517 897 q 458 828 485 846 q 397 801 432 811 q 322 789 361 792 z \"},\"ấ\":{\"ha\":732,\"x_min\":58,\"x_max\":767,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 m 238 786 l 172 858 l 301 986 l 463 986 l 592 858 l 526 786 l 385 876 l 379 876 l 238 786 m 549 947 l 658 1124 l 767 1053 l 626 886 l 549 947 z \"},\"ầ\":{\"ha\":732,\"x_min\":-8,\"x_max\":650,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 m 238 786 l 172 858 l 301 986 l 463 986 l 592 858 l 526 786 l 385 876 l 379 876 l 238 786 m 215 947 l 138 886 l -8 1051 l 100 1124 l 215 947 z \"},\"ẩ\":{\"ha\":732,\"x_min\":58,\"x_max\":735,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 m 238 786 l 172 858 l 301 986 l 463 986 l 592 858 l 526 786 l 385 876 l 379 876 l 238 786 m 574 894 l 560 964 q 590 977 579 969 q 601 1004 601 985 q 583 1035 601 1024 q 511 1050 564 1046 l 531 1136 q 690 1103 644 1132 q 735 1025 735 1074 q 722 969 735 992 q 687 931 708 946 q 636 907 665 915 q 574 894 607 899 z \"},\"ẫ\":{\"ha\":732,\"x_min\":58,\"x_max\":650,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 m 238 786 l 172 858 l 301 975 l 463 975 l 592 858 l 526 786 l 385 864 l 379 864 l 238 786 m 176 1010 q 217 1126 185 1089 q 301 1164 249 1164 q 351 1155 331 1164 q 390 1135 372 1146 q 422 1115 407 1124 q 451 1106 436 1106 q 494 1158 483 1106 l 588 1149 q 547 1032 579 1069 q 463 994 515 994 q 413 1003 433 994 q 374 1024 392 1013 q 342 1044 357 1035 q 313 1053 328 1053 q 269 1000 281 1053 l 176 1010 z \"},\"ậ\":{\"ha\":732,\"x_min\":58,\"x_max\":650,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 m 128 851 l 278 1033 l 486 1033 l 636 851 l 558 779 l 385 907 l 379 907 l 206 779 l 128 851 m 358 -312 q 277 -283 308 -312 q 246 -206 246 -253 q 277 -128 246 -158 q 358 -99 308 -99 q 440 -128 408 -99 q 471 -206 471 -158 q 440 -283 471 -253 q 358 -312 408 -312 z \"},\"ắ\":{\"ha\":732,\"x_min\":58,\"x_max\":650,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 m 394 971 l 306 1032 l 435 1228 l 556 1138 l 394 971 m 382 794 q 279 811 322 794 q 207 858 236 828 q 163 927 178 888 q 147 1013 149 967 l 251 1032 q 290 946 260 982 q 382 910 321 910 q 474 946 443 910 q 513 1032 504 982 l 617 1013 q 601 927 615 967 q 558 858 586 888 q 485 811 529 828 q 382 794 442 794 z \"},\"ằ\":{\"ha\":732,\"x_min\":58,\"x_max\":650,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 m 369 971 l 208 1138 l 329 1228 l 458 1032 l 369 971 m 382 794 q 279 811 322 794 q 207 858 236 828 q 163 927 178 888 q 147 1013 149 967 l 251 1032 q 290 946 260 982 q 382 910 321 910 q 474 946 443 910 q 513 1032 504 982 l 617 1013 q 601 927 615 967 q 558 858 586 888 q 485 811 529 828 q 382 794 442 794 z \"},\"ẳ\":{\"ha\":732,\"x_min\":58,\"x_max\":650,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 m 333 968 l 321 1039 q 353 1050 340 1042 q 365 1078 365 1058 q 345 1108 365 1097 q 271 1124 325 1119 l 290 1235 q 452 1194 406 1231 q 499 1099 499 1158 q 485 1042 499 1065 q 450 1003 472 1018 q 397 981 428 989 q 333 968 367 972 m 382 794 q 279 811 322 794 q 207 858 236 828 q 163 927 178 888 q 147 1013 149 967 l 251 1032 q 290 946 260 982 q 382 910 321 910 q 474 946 443 910 q 513 1032 504 982 l 617 1013 q 601 927 615 967 q 558 858 586 888 q 485 811 529 828 q 382 794 442 794 z \"},\"ẵ\":{\"ha\":732,\"x_min\":58,\"x_max\":650,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 m 382 794 q 289 807 328 794 q 224 842 250 819 q 185 892 199 864 q 168 951 171 919 l 268 968 q 301 918 275 940 q 382 896 326 896 q 463 918 438 896 q 496 968 489 940 l 596 951 q 579 892 593 919 q 540 842 565 864 q 475 807 514 819 q 382 794 436 794 m 165 1007 q 208 1125 174 1088 q 301 1163 243 1163 q 351 1153 331 1163 q 390 1133 372 1144 q 422 1113 407 1122 q 451 1104 436 1104 q 494 1156 482 1104 l 599 1146 q 556 1029 590 1067 q 463 992 521 992 q 413 1001 433 992 q 374 1021 392 1010 q 342 1041 357 1032 q 313 1050 328 1050 q 269 997 281 1050 l 165 1007 z \"},\"ặ\":{\"ha\":732,\"x_min\":58,\"x_max\":650,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 m 382 794 q 279 811 322 794 q 207 858 236 828 q 163 927 178 888 q 147 1013 149 967 l 264 1032 q 299 955 271 988 q 382 922 326 922 q 465 955 438 922 q 500 1032 493 988 l 617 1013 q 601 927 615 967 q 558 858 586 888 q 485 811 529 828 q 382 794 442 794 m 358 -312 q 277 -283 308 -312 q 246 -206 246 -253 q 277 -128 246 -158 q 358 -99 308 -99 q 440 -128 408 -99 q 471 -206 471 -158 q 440 -283 471 -253 q 358 -312 408 -312 z \"},\"ą\":{\"ha\":732,\"x_min\":58,\"x_max\":679,\"o\":\"m 538 -292 q 433 -260 476 -292 q 390 -165 390 -228 q 401 -109 390 -135 q 426 -62 411 -83 q 457 -26 440 -42 q 486 -3 474 -11 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 190 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 q 556 -53 583 -19 q 529 -118 529 -86 q 547 -158 529 -146 q 586 -171 564 -171 q 613 -166 600 -171 q 636 -154 626 -161 l 679 -246 q 611 -279 651 -267 q 538 -292 571 -292 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 z \"},\"æ\":{\"ha\":1092,\"x_min\":65,\"x_max\":1040,\"o\":\"m 269 -17 q 185 -1 222 -17 q 121 44 147 15 q 80 110 94 72 q 65 190 65 147 q 156 362 65 300 q 449 444 246 424 q 423 516 446 489 q 342 543 400 543 q 256 526 300 543 q 161 481 211 510 l 89 615 q 226 681 156 656 q 371 706 296 706 q 483 678 435 706 q 563 601 532 650 q 656 678 607 651 q 767 706 704 706 q 886 680 835 706 q 972 609 938 654 q 1023 503 1006 564 q 1040 371 1040 442 q 1038 320 1040 343 q 1032 285 1035 297 l 635 285 q 692 178 646 213 q 800 143 738 143 q 874 157 839 143 q 946 193 908 171 l 1015 61 q 898 4 963 25 q 772 -17 833 -17 q 637 13 694 -17 q 535 90 579 42 q 400 8 461 32 q 269 -17 339 -17 m 339 142 q 408 157 375 142 q 468 200 440 172 q 449 292 453 243 l 447 321 q 303 276 346 306 q 260 207 260 247 q 281 158 260 174 q 339 142 303 142 m 635 410 l 867 410 q 842 511 867 472 q 760 550 817 550 q 677 516 711 550 q 635 410 643 482 z \"},\"ǽ\":{\"ha\":1092,\"x_min\":65,\"x_max\":1040,\"o\":\"m 269 -17 q 185 -1 222 -17 q 121 44 147 15 q 80 110 94 72 q 65 190 65 147 q 156 362 65 300 q 449 444 246 424 q 423 516 446 489 q 342 543 400 543 q 256 526 300 543 q 161 481 211 510 l 89 615 q 226 681 156 656 q 371 706 296 706 q 483 678 435 706 q 563 601 532 650 q 656 678 607 651 q 767 706 704 706 q 886 680 835 706 q 972 609 938 654 q 1023 503 1006 564 q 1040 371 1040 442 q 1038 320 1040 343 q 1032 285 1035 297 l 635 285 q 692 178 646 213 q 800 143 738 143 q 874 157 839 143 q 946 193 908 171 l 1015 61 q 898 4 963 25 q 772 -17 833 -17 q 637 13 694 -17 q 535 90 579 42 q 400 8 461 32 q 269 -17 339 -17 m 339 142 q 408 157 375 142 q 468 200 440 172 q 449 292 453 243 l 447 321 q 303 276 346 306 q 260 207 260 247 q 281 158 260 174 q 339 142 303 142 m 635 410 l 867 410 q 842 511 867 472 q 760 550 817 550 q 677 516 711 550 q 635 410 643 482 m 585 794 l 485 894 l 699 1147 l 836 1013 l 585 794 z \"},\"ǣ\":{\"ha\":1092,\"x_min\":65,\"x_max\":1040,\"o\":\"m 269 -17 q 185 -1 222 -17 q 121 44 147 15 q 80 110 94 72 q 65 190 65 147 q 156 362 65 300 q 449 444 246 424 q 423 516 446 489 q 342 543 400 543 q 256 526 300 543 q 161 481 211 510 l 89 615 q 226 681 156 656 q 371 706 296 706 q 483 678 435 706 q 563 601 532 650 q 656 678 607 651 q 767 706 704 706 q 886 680 835 706 q 972 609 938 654 q 1023 503 1006 564 q 1040 371 1040 442 q 1038 320 1040 343 q 1032 285 1035 297 l 635 285 q 692 178 646 213 q 800 143 738 143 q 874 157 839 143 q 946 193 908 171 l 1015 61 q 898 4 963 25 q 772 -17 833 -17 q 637 13 694 -17 q 535 90 579 42 q 400 8 461 32 q 269 -17 339 -17 m 339 142 q 408 157 375 142 q 468 200 440 172 q 449 292 453 243 l 447 321 q 303 276 346 306 q 260 207 260 247 q 281 158 260 174 q 339 142 303 142 m 635 410 l 867 410 q 842 511 867 472 q 760 550 817 550 q 677 516 711 550 q 635 410 643 482 m 365 822 l 365 951 l 776 951 l 776 822 l 365 822 z \"},\"ƀ\":{\"ha\":793,\"x_min\":-4,\"x_max\":742,\"o\":\"m 451 -17 q 359 6 406 -17 q 272 74 313 29 l 267 74 l 250 0 l 90 0 l 90 772 l -4 772 l -4 863 l 90 869 l 90 974 l 294 974 l 294 871 l 529 871 l 529 772 l 294 772 l 294 668 l 289 563 q 376 618 329 597 q 471 639 422 639 q 583 616 533 639 q 669 551 633 593 q 723 452 704 510 q 742 325 742 394 q 717 182 742 246 q 652 74 693 118 q 559 7 611 31 q 451 -17 507 -17 m 404 150 q 494 193 457 150 q 532 322 532 236 q 503 432 532 393 q 413 471 475 471 q 352 456 381 471 q 294 410 324 442 l 294 194 q 350 160 322 169 q 404 150 378 150 z \"},\"ḇ\":{\"ha\":796,\"x_min\":90,\"x_max\":742,\"o\":\"m 451 -17 q 359 6 406 -17 q 272 74 313 29 l 267 74 l 250 0 l 90 0 l 90 974 l 294 974 l 294 735 l 289 629 q 376 685 329 665 q 471 706 422 706 q 583 681 533 706 q 669 610 633 656 q 723 501 704 565 q 742 357 742 436 q 717 199 742 268 q 652 81 693 129 q 559 8 611 33 q 451 -17 507 -17 m 404 150 q 494 198 457 150 q 532 353 532 246 q 413 539 532 539 q 294 476 351 539 l 294 194 q 350 160 322 169 q 404 150 378 150 m 201 -260 l 201 -131 l 613 -131 l 613 -260 l 201 -260 z \"},\"ç\":{\"ha\":649,\"x_min\":50,\"x_max\":618,\"o\":\"m 390 -17 q 256 8 318 -17 q 149 78 194 32 q 76 191 103 124 q 50 344 50 258 q 79 498 50 431 q 158 611 108 565 q 272 681 207 657 q 408 706 338 706 q 522 685 472 706 q 610 632 571 664 l 514 500 q 421 540 465 540 q 303 488 346 540 q 260 344 260 435 q 303 201 260 254 q 414 149 347 149 q 478 163 447 149 q 538 199 510 178 l 618 65 q 507 2 567 21 q 390 -17 447 -17 m 250 -332 l 235 -250 q 347 -232 317 -246 q 378 -189 378 -218 q 356 -153 378 -168 q 271 -131 335 -139 l 338 6 l 457 6 l 418 -85 q 497 -121 471 -97 q 524 -189 524 -144 q 452 -294 524 -260 q 250 -332 381 -328 z \"},\"ć\":{\"ha\":649,\"x_min\":50,\"x_max\":668,\"o\":\"m 390 -17 q 256 8 318 -17 q 149 78 194 32 q 76 191 103 124 q 50 344 50 258 q 79 498 50 431 q 158 611 108 565 q 272 681 207 657 q 408 706 338 706 q 522 685 472 706 q 610 632 571 664 l 514 500 q 421 540 465 540 q 303 488 346 540 q 260 344 260 435 q 303 201 260 254 q 414 149 347 149 q 478 163 447 149 q 538 199 510 178 l 618 65 q 507 2 567 21 q 390 -17 447 -17 m 417 794 l 317 894 l 531 1147 l 668 1013 l 417 794 z \"},\"ĉ\":{\"ha\":649,\"x_min\":50,\"x_max\":657,\"o\":\"m 390 -17 q 256 8 318 -17 q 149 78 194 32 q 76 191 103 124 q 50 344 50 258 q 79 498 50 431 q 158 611 108 565 q 272 681 207 657 q 408 706 338 706 q 522 685 472 706 q 610 632 571 664 l 514 500 q 421 540 465 540 q 303 488 346 540 q 260 344 260 435 q 303 201 260 254 q 414 149 347 149 q 478 163 447 149 q 538 199 510 178 l 618 65 q 507 2 567 21 q 390 -17 447 -17 m 149 851 l 299 1033 l 507 1033 l 657 851 l 579 779 l 406 907 l 400 907 l 226 779 l 149 851 z \"},\"č\":{\"ha\":649,\"x_min\":50,\"x_max\":657,\"o\":\"m 390 -17 q 256 8 318 -17 q 149 78 194 32 q 76 191 103 124 q 50 344 50 258 q 79 498 50 431 q 158 611 108 565 q 272 681 207 657 q 408 706 338 706 q 522 685 472 706 q 610 632 571 664 l 514 500 q 421 540 465 540 q 303 488 346 540 q 260 344 260 435 q 303 201 260 254 q 414 149 347 149 q 478 163 447 149 q 538 199 510 178 l 618 65 q 507 2 567 21 q 390 -17 447 -17 m 299 801 l 149 983 l 226 1056 l 400 928 l 406 928 l 579 1056 l 657 983 l 507 801 l 299 801 z \"},\"ċ\":{\"ha\":649,\"x_min\":50,\"x_max\":618,\"o\":\"m 390 -17 q 256 8 318 -17 q 149 78 194 32 q 76 191 103 124 q 50 344 50 258 q 79 498 50 431 q 158 611 108 565 q 272 681 207 657 q 408 706 338 706 q 522 685 472 706 q 610 632 571 664 l 514 500 q 421 540 465 540 q 303 488 346 540 q 260 344 260 435 q 303 201 260 254 q 414 149 347 149 q 478 163 447 149 q 538 199 510 178 l 618 65 q 507 2 567 21 q 390 -17 447 -17 m 403 790 q 322 820 353 790 q 290 897 290 850 q 322 974 290 944 q 403 1004 353 1004 q 484 974 453 1004 q 515 897 515 944 q 484 820 515 850 q 403 790 453 790 z \"},\"ď\":{\"ha\":853,\"x_min\":54,\"x_max\":890,\"o\":\"m 336 -17 q 220 8 272 -17 q 131 80 168 33 q 74 193 94 126 q 54 344 54 260 q 78 496 54 429 q 142 609 103 563 q 234 681 182 656 q 340 706 286 706 q 436 686 399 706 q 510 633 474 667 l 501 739 l 501 974 l 706 974 l 706 0 l 539 0 l 525 68 l 519 68 q 435 8 483 32 q 336 -17 386 -17 m 389 150 q 449 164 422 150 q 501 213 476 178 l 501 494 q 444 529 474 519 q 388 539 415 539 q 301 492 339 539 q 264 347 264 446 q 297 197 264 244 q 389 150 329 150 m 767 761 l 758 1069 l 890 1069 l 888 974 l 854 761 l 767 761 z \"},\"ḍ\":{\"ha\":796,\"x_min\":54,\"x_max\":706,\"o\":\"m 336 -17 q 220 8 272 -17 q 131 80 168 33 q 74 193 94 126 q 54 344 54 260 q 78 496 54 429 q 142 609 103 563 q 234 681 182 656 q 340 706 286 706 q 436 686 399 706 q 510 633 474 667 l 501 739 l 501 974 l 706 974 l 706 0 l 539 0 l 525 68 l 519 68 q 435 8 483 32 q 336 -17 386 -17 m 389 150 q 449 164 422 150 q 501 213 476 178 l 501 494 q 444 529 474 519 q 388 539 415 539 q 301 492 339 539 q 264 347 264 446 q 297 197 264 244 q 389 150 329 150 m 433 -312 q 352 -283 383 -312 q 321 -206 321 -253 q 352 -128 321 -158 q 433 -99 383 -99 q 515 -128 483 -99 q 546 -206 546 -158 q 515 -283 546 -253 q 433 -312 483 -312 z \"},\"ḏ\":{\"ha\":796,\"x_min\":54,\"x_max\":706,\"o\":\"m 336 -17 q 220 8 272 -17 q 131 80 168 33 q 74 193 94 126 q 54 344 54 260 q 78 496 54 429 q 142 609 103 563 q 234 681 182 656 q 340 706 286 706 q 436 686 399 706 q 510 633 474 667 l 501 739 l 501 974 l 706 974 l 706 0 l 539 0 l 525 68 l 519 68 q 435 8 483 32 q 336 -17 386 -17 m 389 150 q 449 164 422 150 q 501 213 476 178 l 501 494 q 444 529 474 519 q 388 539 415 539 q 301 492 339 539 q 264 347 264 446 q 297 197 264 244 q 389 150 329 150 m 226 -260 l 226 -131 l 638 -131 l 638 -260 l 226 -260 z \"},\"đ\":{\"ha\":796,\"x_min\":54,\"x_max\":800,\"o\":\"m 336 -17 q 220 7 272 -17 q 131 74 168 31 q 74 177 94 117 q 54 313 54 238 q 78 447 54 386 q 142 549 103 507 q 234 615 182 592 q 340 639 286 639 q 436 619 399 639 q 510 567 474 599 l 501 671 l 501 772 l 294 772 l 294 871 l 501 871 l 501 974 l 706 974 l 706 871 l 800 871 l 800 781 l 706 774 l 706 0 l 535 0 l 522 61 l 517 61 q 435 5 481 26 q 336 -17 389 -17 m 389 150 q 449 164 422 150 q 501 213 476 178 l 501 428 q 444 461 474 451 q 388 471 415 471 q 301 431 339 471 q 264 315 264 392 q 297 192 264 233 q 389 150 329 150 z \"},\"è\":{\"ha\":719,\"x_min\":50,\"x_max\":668,\"o\":\"m 399 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 526 4 590 25 q 399 -17 461 -17 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 m 361 794 l 110 1013 l 247 1147 l 461 894 l 361 794 z \"},\"é\":{\"ha\":719,\"x_min\":50,\"x_max\":668,\"o\":\"m 399 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 526 4 590 25 q 399 -17 461 -17 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 m 389 794 l 289 894 l 503 1147 l 640 1013 l 389 794 z \"},\"ê\":{\"ha\":719,\"x_min\":50,\"x_max\":668,\"o\":\"m 399 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 526 4 590 25 q 399 -17 461 -17 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 m 121 851 l 271 1033 l 479 1033 l 629 851 l 551 779 l 378 907 l 372 907 l 199 779 l 121 851 z \"},\"ě\":{\"ha\":719,\"x_min\":50,\"x_max\":668,\"o\":\"m 399 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 526 4 590 25 q 399 -17 461 -17 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 m 271 801 l 121 983 l 199 1056 l 372 928 l 378 928 l 551 1056 l 629 983 l 479 801 l 271 801 z \"},\"ë\":{\"ha\":719,\"x_min\":50,\"x_max\":668,\"o\":\"m 399 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 526 4 590 25 q 399 -17 461 -17 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 m 224 790 q 151 819 179 790 q 124 890 124 847 q 151 960 124 932 q 224 989 179 989 q 295 960 268 989 q 322 890 322 932 q 295 819 322 847 q 224 790 268 790 m 526 790 q 455 819 482 790 q 428 890 428 847 q 455 960 428 932 q 526 989 482 989 q 599 960 571 989 q 626 890 626 932 q 599 819 626 847 q 526 790 571 790 z \"},\"ē\":{\"ha\":719,\"x_min\":50,\"x_max\":668,\"o\":\"m 399 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 526 4 590 25 q 399 -17 461 -17 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 m 169 822 l 169 951 l 581 951 l 581 822 l 169 822 z \"},\"ĕ\":{\"ha\":719,\"x_min\":50,\"x_max\":668,\"o\":\"m 399 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 526 4 590 25 q 399 -17 461 -17 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 m 375 794 q 272 811 315 794 q 200 858 229 828 q 156 927 171 888 q 140 1013 142 967 l 257 1032 q 292 955 264 988 q 375 922 319 922 q 458 955 431 922 q 493 1032 486 988 l 610 1013 q 594 927 608 967 q 551 858 579 888 q 478 811 522 828 q 375 794 435 794 z \"},\"ė\":{\"ha\":719,\"x_min\":50,\"x_max\":668,\"o\":\"m 399 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 526 4 590 25 q 399 -17 461 -17 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 m 375 790 q 294 820 325 790 q 263 897 263 850 q 294 974 263 944 q 375 1004 325 1004 q 456 974 425 1004 q 488 897 488 944 q 456 820 488 850 q 375 790 425 790 z \"},\"ẹ\":{\"ha\":719,\"x_min\":50,\"x_max\":668,\"o\":\"m 399 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 526 4 590 25 q 399 -17 461 -17 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 m 375 -312 q 294 -283 325 -312 q 263 -206 263 -253 q 294 -128 263 -158 q 375 -99 325 -99 q 456 -128 425 -99 q 488 -206 488 -158 q 456 -283 488 -253 q 375 -312 425 -312 z \"},\"ẻ\":{\"ha\":719,\"x_min\":50,\"x_max\":668,\"o\":\"m 399 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 526 4 590 25 q 399 -17 461 -17 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 m 315 789 l 299 869 q 343 885 325 875 q 361 918 361 896 q 336 958 361 943 q 250 976 311 972 l 263 1101 q 378 1087 331 1100 q 454 1052 425 1074 q 497 1000 483 1031 q 510 933 510 969 q 494 872 510 897 q 451 828 478 846 q 390 801 425 811 q 315 789 354 792 z \"},\"ẽ\":{\"ha\":719,\"x_min\":50,\"x_max\":668,\"o\":\"m 399 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 526 4 590 25 q 399 -17 461 -17 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 m 467 796 q 408 810 433 796 q 360 840 382 824 q 322 871 339 857 q 288 885 304 885 q 255 867 267 885 q 239 808 243 849 l 111 815 q 158 975 114 924 q 283 1026 203 1026 q 342 1013 317 1026 q 390 982 368 999 q 428 951 411 965 q 463 938 446 938 q 511 1014 503 938 l 639 1007 q 592 847 636 899 q 467 796 547 796 z \"},\"ế\":{\"ha\":719,\"x_min\":50,\"x_max\":760,\"o\":\"m 399 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 526 4 590 25 q 399 -17 461 -17 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 m 231 786 l 165 858 l 294 986 l 456 986 l 585 858 l 519 786 l 378 876 l 372 876 l 231 786 m 542 947 l 651 1124 l 760 1053 l 619 886 l 542 947 z \"},\"ề\":{\"ha\":719,\"x_min\":-15,\"x_max\":668,\"o\":\"m 399 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 526 4 590 25 q 399 -17 461 -17 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 m 231 786 l 165 858 l 294 986 l 456 986 l 585 858 l 519 786 l 378 876 l 372 876 l 231 786 m 208 947 l 131 886 l -15 1051 l 93 1124 l 208 947 z \"},\"ể\":{\"ha\":719,\"x_min\":50,\"x_max\":728,\"o\":\"m 399 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 526 4 590 25 q 399 -17 461 -17 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 m 231 786 l 165 858 l 294 986 l 456 986 l 585 858 l 519 786 l 378 876 l 372 876 l 231 786 m 567 894 l 553 964 q 583 977 572 969 q 594 1004 594 985 q 576 1035 594 1024 q 504 1050 557 1046 l 524 1136 q 683 1103 638 1132 q 728 1025 728 1074 q 715 969 728 992 q 680 931 701 946 q 629 907 658 915 q 567 894 600 899 z \"},\"ễ\":{\"ha\":719,\"x_min\":50,\"x_max\":668,\"o\":\"m 399 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 526 4 590 25 q 399 -17 461 -17 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 m 231 786 l 165 858 l 294 975 l 456 975 l 585 858 l 519 786 l 378 864 l 372 864 l 231 786 m 169 1010 q 210 1126 178 1089 q 294 1164 242 1164 q 344 1155 324 1164 q 383 1135 365 1146 q 415 1115 400 1124 q 444 1106 429 1106 q 488 1158 476 1106 l 581 1149 q 540 1032 572 1069 q 456 994 508 994 q 406 1003 426 994 q 367 1024 385 1013 q 335 1044 350 1035 q 306 1053 321 1053 q 263 1000 274 1053 l 169 1010 z \"},\"ệ\":{\"ha\":719,\"x_min\":50,\"x_max\":668,\"o\":\"m 399 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 526 4 590 25 q 399 -17 461 -17 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 m 121 851 l 271 1033 l 479 1033 l 629 851 l 551 779 l 378 907 l 372 907 l 199 779 l 121 851 m 374 -312 q 292 -283 324 -312 q 261 -206 261 -253 q 292 -128 261 -158 q 374 -99 324 -99 q 455 -128 424 -99 q 486 -206 486 -158 q 455 -283 486 -253 q 374 -312 424 -312 z \"},\"ę\":{\"ha\":719,\"x_min\":50,\"x_max\":668,\"o\":\"m 503 -292 q 399 -260 440 -292 q 358 -165 358 -228 q 384 -75 358 -114 q 436 -12 410 -36 q 415 -16 424 -15 q 399 -17 406 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 568 5 597 29 q 522 -40 539 -19 q 499 -79 506 -61 q 493 -118 493 -97 q 510 -158 493 -146 q 553 -171 528 -171 q 578 -166 567 -171 q 601 -154 590 -161 l 643 -246 q 576 -279 617 -267 q 503 -292 536 -292 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 z \"},\"ḗ\":{\"ha\":719,\"x_min\":50,\"x_max\":668,\"o\":\"m 399 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 526 4 590 25 q 399 -17 461 -17 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 m 336 990 l 268 1074 l 468 1219 l 551 1117 l 336 990 m 169 822 l 169 951 l 581 951 l 581 822 l 169 822 z \"},\"ǵ\":{\"ha\":742,\"x_min\":47,\"x_max\":721,\"o\":\"m 336 -293 q 223 -283 275 -293 q 131 -251 171 -272 q 69 -197 92 -231 q 47 -118 47 -164 q 146 21 47 -35 l 146 26 q 100 72 118 44 q 82 143 82 100 q 104 215 82 181 q 160 272 126 249 l 160 278 q 95 349 124 303 q 67 457 67 396 q 90 566 67 519 q 153 644 114 613 q 244 690 193 675 q 351 706 296 706 q 458 689 413 706 l 710 689 l 710 540 l 600 540 q 616 501 610 525 q 622 450 622 478 q 601 347 622 390 q 544 274 581 303 q 458 232 507 246 q 351 218 408 218 q 268 232 311 218 q 249 210 254 221 q 243 181 243 199 q 266 142 243 154 q 347 129 289 129 l 458 129 q 653 88 586 129 q 721 -46 721 47 q 694 -145 721 -100 q 617 -223 667 -190 q 496 -274 567 -256 q 336 -293 425 -293 m 351 342 q 419 370 392 342 q 446 457 446 399 q 419 540 446 511 q 351 568 392 568 q 284 540 311 568 q 257 457 257 513 q 284 370 257 399 q 351 342 311 342 m 368 -165 q 482 -141 438 -165 q 526 -81 526 -117 q 499 -37 526 -49 q 421 -26 472 -26 l 350 -26 q 292 -24 314 -26 q 253 -18 269 -22 q 215 -86 215 -51 q 257 -145 215 -125 q 368 -165 299 -165 m 401 794 l 301 894 l 515 1147 l 653 1013 l 401 794 z \"},\"ĝ\":{\"ha\":742,\"x_min\":47,\"x_max\":721,\"o\":\"m 336 -293 q 223 -283 275 -293 q 131 -251 171 -272 q 69 -197 92 -231 q 47 -118 47 -164 q 146 21 47 -35 l 146 26 q 100 72 118 44 q 82 143 82 100 q 104 215 82 181 q 160 272 126 249 l 160 278 q 95 349 124 303 q 67 457 67 396 q 90 566 67 519 q 153 644 114 613 q 244 690 193 675 q 351 706 296 706 q 458 689 413 706 l 710 689 l 710 540 l 600 540 q 616 501 610 525 q 622 450 622 478 q 601 347 622 390 q 544 274 581 303 q 458 232 507 246 q 351 218 408 218 q 268 232 311 218 q 249 210 254 221 q 243 181 243 199 q 266 142 243 154 q 347 129 289 129 l 458 129 q 653 88 586 129 q 721 -46 721 47 q 694 -145 721 -100 q 617 -223 667 -190 q 496 -274 567 -256 q 336 -293 425 -293 m 351 342 q 419 370 392 342 q 446 457 446 399 q 419 540 446 511 q 351 568 392 568 q 284 540 311 568 q 257 457 257 513 q 284 370 257 399 q 351 342 311 342 m 368 -165 q 482 -141 438 -165 q 526 -81 526 -117 q 499 -37 526 -49 q 421 -26 472 -26 l 350 -26 q 292 -24 314 -26 q 253 -18 269 -22 q 215 -86 215 -51 q 257 -145 215 -125 q 368 -165 299 -165 m 133 851 l 283 1033 l 492 1033 l 642 851 l 564 779 l 390 907 l 385 907 l 211 779 l 133 851 z \"},\"ğ\":{\"ha\":742,\"x_min\":47,\"x_max\":721,\"o\":\"m 336 -293 q 223 -283 275 -293 q 131 -251 171 -272 q 69 -197 92 -231 q 47 -118 47 -164 q 146 21 47 -35 l 146 26 q 100 72 118 44 q 82 143 82 100 q 104 215 82 181 q 160 272 126 249 l 160 278 q 95 349 124 303 q 67 457 67 396 q 90 566 67 519 q 153 644 114 613 q 244 690 193 675 q 351 706 296 706 q 458 689 413 706 l 710 689 l 710 540 l 600 540 q 616 501 610 525 q 622 450 622 478 q 601 347 622 390 q 544 274 581 303 q 458 232 507 246 q 351 218 408 218 q 268 232 311 218 q 249 210 254 221 q 243 181 243 199 q 266 142 243 154 q 347 129 289 129 l 458 129 q 653 88 586 129 q 721 -46 721 47 q 694 -145 721 -100 q 617 -223 667 -190 q 496 -274 567 -256 q 336 -293 425 -293 m 351 342 q 419 370 392 342 q 446 457 446 399 q 419 540 446 511 q 351 568 392 568 q 284 540 311 568 q 257 457 257 513 q 284 370 257 399 q 351 342 311 342 m 368 -165 q 482 -141 438 -165 q 526 -81 526 -117 q 499 -37 526 -49 q 421 -26 472 -26 l 350 -26 q 292 -24 314 -26 q 253 -18 269 -22 q 215 -86 215 -51 q 257 -145 215 -125 q 368 -165 299 -165 m 388 794 q 285 811 328 794 q 213 858 242 828 q 169 927 183 888 q 153 1013 154 967 l 269 1032 q 304 955 276 988 q 388 922 332 922 q 471 955 443 922 q 506 1032 499 988 l 622 1013 q 606 927 621 967 q 563 858 592 888 q 491 811 535 828 q 388 794 447 794 z \"},\"ġ\":{\"ha\":742,\"x_min\":47,\"x_max\":721,\"o\":\"m 336 -293 q 223 -283 275 -293 q 131 -251 171 -272 q 69 -197 92 -231 q 47 -118 47 -164 q 146 21 47 -35 l 146 26 q 100 72 118 44 q 82 143 82 100 q 104 215 82 181 q 160 272 126 249 l 160 278 q 95 349 124 303 q 67 457 67 396 q 90 566 67 519 q 153 644 114 613 q 244 690 193 675 q 351 706 296 706 q 458 689 413 706 l 710 689 l 710 540 l 600 540 q 616 501 610 525 q 622 450 622 478 q 601 347 622 390 q 544 274 581 303 q 458 232 507 246 q 351 218 408 218 q 268 232 311 218 q 249 210 254 221 q 243 181 243 199 q 266 142 243 154 q 347 129 289 129 l 458 129 q 653 88 586 129 q 721 -46 721 47 q 694 -145 721 -100 q 617 -223 667 -190 q 496 -274 567 -256 q 336 -293 425 -293 m 351 342 q 419 370 392 342 q 446 457 446 399 q 419 540 446 511 q 351 568 392 568 q 284 540 311 568 q 257 457 257 513 q 284 370 257 399 q 351 342 311 342 m 368 -165 q 482 -141 438 -165 q 526 -81 526 -117 q 499 -37 526 -49 q 421 -26 472 -26 l 350 -26 q 292 -24 314 -26 q 253 -18 269 -22 q 215 -86 215 -51 q 257 -145 215 -125 q 368 -165 299 -165 m 388 790 q 306 820 338 790 q 275 897 275 850 q 306 974 275 944 q 388 1004 338 1004 q 469 974 438 1004 q 500 897 500 944 q 469 820 500 850 q 388 790 438 790 z \"},\"ģ\":{\"ha\":742,\"x_min\":47,\"x_max\":721,\"o\":\"m 336 -293 q 223 -283 275 -293 q 131 -251 171 -272 q 69 -197 92 -231 q 47 -118 47 -164 q 146 21 47 -35 l 146 26 q 100 72 118 44 q 82 143 82 100 q 104 215 82 181 q 160 272 126 249 l 160 278 q 95 349 124 303 q 67 457 67 396 q 90 566 67 519 q 153 644 114 613 q 244 690 193 675 q 351 706 296 706 q 458 689 413 706 l 710 689 l 710 540 l 600 540 q 616 501 610 525 q 622 450 622 478 q 601 347 622 390 q 544 274 581 303 q 458 232 507 246 q 351 218 408 218 q 268 232 311 218 q 249 210 254 221 q 243 181 243 199 q 266 142 243 154 q 347 129 289 129 l 458 129 q 653 88 586 129 q 721 -46 721 47 q 694 -145 721 -100 q 617 -223 667 -190 q 496 -274 567 -256 q 336 -293 425 -293 m 351 342 q 419 370 392 342 q 446 457 446 399 q 419 540 446 511 q 351 568 392 568 q 284 540 311 568 q 257 457 257 513 q 284 370 257 399 q 351 342 311 342 m 368 -165 q 482 -141 438 -165 q 526 -81 526 -117 q 499 -37 526 -49 q 421 -26 472 -26 l 350 -26 q 292 -24 314 -26 q 253 -18 269 -22 q 215 -86 215 -51 q 257 -145 215 -125 q 368 -165 299 -165 m 451 789 q 298 826 340 799 q 256 906 256 854 q 327 1010 256 976 q 529 1049 399 1044 l 544 967 q 432 950 463 963 q 401 913 401 938 q 422 881 401 893 q 490 864 443 868 l 451 789 z \"},\"ǧ\":{\"ha\":742,\"x_min\":47,\"x_max\":721,\"o\":\"m 336 -293 q 223 -283 275 -293 q 131 -251 171 -272 q 69 -197 92 -231 q 47 -118 47 -164 q 146 21 47 -35 l 146 26 q 100 72 118 44 q 82 143 82 100 q 104 215 82 181 q 160 272 126 249 l 160 278 q 95 349 124 303 q 67 457 67 396 q 90 566 67 519 q 153 644 114 613 q 244 690 193 675 q 351 706 296 706 q 458 689 413 706 l 710 689 l 710 540 l 600 540 q 616 501 610 525 q 622 450 622 478 q 601 347 622 390 q 544 274 581 303 q 458 232 507 246 q 351 218 408 218 q 268 232 311 218 q 249 210 254 221 q 243 181 243 199 q 266 142 243 154 q 347 129 289 129 l 458 129 q 653 88 586 129 q 721 -46 721 47 q 694 -145 721 -100 q 617 -223 667 -190 q 496 -274 567 -256 q 336 -293 425 -293 m 351 342 q 419 370 392 342 q 446 457 446 399 q 419 540 446 511 q 351 568 392 568 q 284 540 311 568 q 257 457 257 513 q 284 370 257 399 q 351 342 311 342 m 368 -165 q 482 -141 438 -165 q 526 -81 526 -117 q 499 -37 526 -49 q 421 -26 472 -26 l 350 -26 q 292 -24 314 -26 q 253 -18 269 -22 q 215 -86 215 -51 q 257 -145 215 -125 q 368 -165 299 -165 m 283 801 l 133 983 l 211 1056 l 385 928 l 390 928 l 564 1056 l 642 983 l 492 801 l 283 801 z \"},\"ḡ\":{\"ha\":742,\"x_min\":47,\"x_max\":721,\"o\":\"m 336 -293 q 223 -283 275 -293 q 131 -251 171 -272 q 69 -197 92 -231 q 47 -118 47 -164 q 146 21 47 -35 l 146 26 q 100 72 118 44 q 82 143 82 100 q 104 215 82 181 q 160 272 126 249 l 160 278 q 95 349 124 303 q 67 457 67 396 q 90 566 67 519 q 153 644 114 613 q 244 690 193 675 q 351 706 296 706 q 458 689 413 706 l 710 689 l 710 540 l 600 540 q 616 501 610 525 q 622 450 622 478 q 601 347 622 390 q 544 274 581 303 q 458 232 507 246 q 351 218 408 218 q 268 232 311 218 q 249 210 254 221 q 243 181 243 199 q 266 142 243 154 q 347 129 289 129 l 458 129 q 653 88 586 129 q 721 -46 721 47 q 694 -145 721 -100 q 617 -223 667 -190 q 496 -274 567 -256 q 336 -293 425 -293 m 351 342 q 419 370 392 342 q 446 457 446 399 q 419 540 446 511 q 351 568 392 568 q 284 540 311 568 q 257 457 257 513 q 284 370 257 399 q 351 342 311 342 m 368 -165 q 482 -141 438 -165 q 526 -81 526 -117 q 499 -37 526 -49 q 421 -26 472 -26 l 350 -26 q 292 -24 314 -26 q 253 -18 269 -22 q 215 -86 215 -51 q 257 -145 215 -125 q 368 -165 299 -165 m 182 822 l 182 951 l 593 951 l 593 822 l 182 822 z \"},\"ĥ\":{\"ha\":793,\"x_min\":-47,\"x_max\":711,\"o\":\"m 90 0 l 90 974 l 294 974 l 294 735 l 285 611 q 375 676 324 646 q 497 706 426 706 q 660 632 610 706 q 711 428 711 558 l 711 0 l 507 0 l 507 401 q 487 504 507 476 q 422 532 467 532 q 356 515 383 532 q 294 465 328 497 l 294 0 l 90 0 m -47 1072 l 78 1226 l 300 1226 l 425 1072 l 336 1018 l 192 1135 l 186 1135 l 42 1018 l -47 1072 z \"},\"ḥ\":{\"ha\":793,\"x_min\":90,\"x_max\":711,\"o\":\"m 90 0 l 90 974 l 294 974 l 294 735 l 285 611 q 375 676 324 646 q 497 706 426 706 q 660 632 610 706 q 711 428 711 558 l 711 0 l 507 0 l 507 401 q 487 504 507 476 q 422 532 467 532 q 356 515 383 532 q 294 465 328 497 l 294 0 l 90 0 m 406 -312 q 324 -283 356 -312 q 293 -206 293 -253 q 324 -128 293 -158 q 406 -99 356 -99 q 487 -128 456 -99 q 518 -206 518 -158 q 487 -283 518 -253 q 406 -312 456 -312 z \"},\"ẖ\":{\"ha\":793,\"x_min\":90,\"x_max\":711,\"o\":\"m 90 0 l 90 974 l 294 974 l 294 735 l 285 611 q 375 676 324 646 q 497 706 426 706 q 660 632 610 706 q 711 428 711 558 l 711 0 l 507 0 l 507 401 q 487 504 507 476 q 422 532 467 532 q 356 515 383 532 q 294 465 328 497 l 294 0 l 90 0 m 200 -260 l 200 -131 l 611 -131 l 611 -260 l 200 -260 z \"},\"ḫ\":{\"ha\":793,\"x_min\":90,\"x_max\":711,\"o\":\"m 90 0 l 90 974 l 294 974 l 294 735 l 285 611 q 375 676 324 646 q 497 706 426 706 q 660 632 610 706 q 711 428 711 558 l 711 0 l 507 0 l 507 401 q 487 504 507 476 q 422 532 467 532 q 356 515 383 532 q 294 465 328 497 l 294 0 l 90 0 m 406 -322 q 303 -306 346 -322 q 231 -259 260 -289 q 187 -190 201 -229 q 171 -104 172 -150 l 288 -85 q 322 -162 294 -129 q 406 -194 350 -194 q 489 -162 461 -194 q 524 -85 517 -129 l 640 -104 q 624 -190 639 -150 q 581 -259 610 -229 q 509 -306 553 -289 q 406 -322 465 -322 z \"},\"ħ\":{\"ha\":793,\"x_min\":-4,\"x_max\":711,\"o\":\"m 90 0 l 90 772 l -4 772 l -4 863 l 90 869 l 90 974 l 294 974 l 294 871 l 529 871 l 529 772 l 294 772 l 294 668 l 285 543 q 326 578 304 561 q 375 608 349 594 q 432 631 401 622 q 497 639 463 639 q 660 565 610 639 q 711 361 711 492 l 711 0 l 507 0 l 507 335 q 487 437 507 410 q 422 464 467 464 q 356 447 383 464 q 294 397 328 429 l 294 0 l 90 0 z \"},\"ì\":{\"ha\":383,\"x_min\":-74,\"x_max\":294,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 0 l 90 0 m 178 794 l -74 1013 l 64 1147 l 278 894 l 178 794 z \"},\"í\":{\"ha\":383,\"x_min\":90,\"x_max\":457,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 0 l 90 0 m 206 794 l 106 894 l 319 1147 l 457 1013 l 206 794 z \"},\"î\":{\"ha\":383,\"x_min\":-62,\"x_max\":446,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 0 l 90 0 m -62 851 l 88 1033 l 296 1033 l 446 851 l 368 779 l 194 907 l 189 907 l 15 779 l -62 851 z \"},\"ĩ\":{\"ha\":383,\"x_min\":-72,\"x_max\":456,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 0 l 90 0 m 283 796 q 224 810 250 796 q 177 840 199 824 q 138 871 156 857 q 104 885 121 885 q 72 867 83 885 q 56 808 60 849 l -72 815 q -25 975 -69 924 q 100 1026 19 1026 q 159 1013 133 1026 q 206 982 185 999 q 245 951 228 965 q 279 938 263 938 q 328 1014 319 938 l 456 1007 q 408 847 453 899 q 283 796 364 796 z \"},\"ï\":{\"ha\":383,\"x_min\":-60,\"x_max\":443,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 0 l 90 0 m 40 790 q -32 819 -4 790 q -60 890 -60 847 q -32 960 -60 932 q 40 989 -4 989 q 112 960 85 989 q 139 890 139 932 q 112 819 139 847 q 40 790 85 790 m 343 790 q 272 819 299 790 q 244 890 244 847 q 272 960 244 932 q 343 989 299 989 q 415 960 388 989 q 443 890 443 932 q 415 819 443 847 q 343 790 388 790 z \"},\"ī\":{\"ha\":383,\"x_min\":-14,\"x_max\":397,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 0 l 90 0 m -14 822 l -14 951 l 397 951 l 397 822 l -14 822 z \"},\"ǐ\":{\"ha\":383,\"x_min\":-62,\"x_max\":446,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 0 l 90 0 m 88 801 l -62 983 l 15 1056 l 189 928 l 194 928 l 368 1056 l 446 983 l 296 801 l 88 801 z \"},\"ỉ\":{\"ha\":383,\"x_min\":67,\"x_max\":326,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 0 l 90 0 m 132 789 l 115 869 q 160 885 142 875 q 178 918 178 896 q 153 958 178 943 q 67 976 128 972 l 79 1101 q 194 1087 147 1100 q 271 1052 242 1074 q 313 1000 300 1031 q 326 933 326 969 q 310 872 326 897 q 268 828 294 846 q 206 801 242 811 q 132 789 171 792 z \"},\"ị\":{\"ha\":383,\"x_min\":74,\"x_max\":310,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 0 l 90 0 m 192 790 q 107 820 140 790 q 74 897 74 850 q 107 974 74 944 q 192 1003 140 1003 q 277 974 244 1003 q 310 897 310 944 q 277 820 310 850 q 192 790 244 790 m 192 -312 q 110 -283 142 -312 q 79 -206 79 -253 q 110 -128 79 -158 q 192 -99 142 -99 q 273 -128 242 -99 q 304 -206 304 -158 q 273 -283 304 -253 q 192 -312 242 -312 z \"},\"į\":{\"ha\":383,\"x_min\":57,\"x_max\":344,\"o\":\"m 204 -292 q 99 -260 142 -292 q 57 -165 57 -228 q 66 -109 57 -135 q 89 -62 75 -83 q 119 -26 103 -42 q 147 0 135 -11 l 90 0 l 90 689 l 294 689 l 294 0 q 217 -53 239 -21 q 194 -118 194 -86 q 213 -158 194 -146 q 254 -171 231 -171 q 278 -166 267 -171 q 303 -154 290 -161 l 344 -246 q 277 -279 318 -267 q 204 -292 236 -292 m 192 790 q 107 820 140 790 q 74 897 74 850 q 107 974 74 944 q 192 1003 140 1003 q 276 974 243 1003 q 310 897 310 944 q 276 820 310 850 q 192 790 243 790 z \"},\"ĭ\":{\"ha\":383,\"x_min\":-43,\"x_max\":426,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 0 l 90 0 m 192 794 q 89 811 132 794 q 17 858 46 828 q -27 927 -12 888 q -43 1013 -42 967 l 74 1032 q 108 955 81 988 q 192 922 136 922 q 275 955 247 922 q 310 1032 303 988 l 426 1013 q 410 927 425 967 q 367 858 396 888 q 295 811 339 828 q 192 794 251 794 z \"},\"ı\":{\"ha\":383,\"x_min\":90,\"x_max\":294,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 0 l 90 0 z \"},\"ĵ\":{\"ha\":386,\"x_min\":-71,\"x_max\":449,\"o\":\"m 50 -272 q -22 -267 7 -272 q -71 -253 -50 -261 l -35 -103 q -8 -110 -21 -107 q 19 -112 4 -112 q 76 -86 60 -112 q 92 -1 92 -60 l 92 689 l 296 689 l 296 4 q 284 -103 296 -53 q 244 -190 272 -153 q 168 -250 215 -228 q 50 -272 121 -272 m -60 851 l 90 1033 l 299 1033 l 449 851 l 371 779 l 197 907 l 192 907 l 18 779 l -60 851 z \"},\"ķ\":{\"ha\":761,\"x_min\":90,\"x_max\":753,\"o\":\"m 90 0 l 90 974 l 289 974 l 289 415 l 294 415 l 513 689 l 735 689 l 493 406 l 753 0 l 532 0 l 376 268 l 289 169 l 289 0 l 90 0 m 268 -332 l 253 -250 q 365 -233 335 -246 q 396 -196 396 -219 q 375 -164 396 -176 q 307 -147 354 -151 l 346 -72 q 499 -110 457 -82 q 542 -189 542 -137 q 470 -294 542 -260 q 268 -332 399 -328 z \"},\"ḳ\":{\"ha\":761,\"x_min\":90,\"x_max\":753,\"o\":\"m 90 0 l 90 974 l 289 974 l 289 415 l 294 415 l 513 689 l 735 689 l 493 406 l 753 0 l 532 0 l 376 268 l 289 169 l 289 0 l 90 0 m 410 -312 q 328 -283 360 -312 q 297 -206 297 -253 q 328 -128 297 -158 q 410 -99 360 -99 q 491 -128 460 -99 q 522 -206 522 -158 q 491 -283 522 -253 q 410 -312 460 -312 z \"},\"ḵ\":{\"ha\":761,\"x_min\":90,\"x_max\":753,\"o\":\"m 90 0 l 90 974 l 289 974 l 289 415 l 294 415 l 513 689 l 735 689 l 493 406 l 753 0 l 532 0 l 376 268 l 289 169 l 289 0 l 90 0 m 204 -260 l 204 -131 l 615 -131 l 615 -260 l 204 -260 z \"},\"ĸ\":{\"ha\":761,\"x_min\":90,\"x_max\":753,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 411 l 299 411 l 513 689 l 735 689 l 499 406 l 753 0 l 532 0 l 376 263 l 294 163 l 294 0 l 90 0 z \"},\"ĺ\":{\"ha\":397,\"x_min\":90,\"x_max\":436,\"o\":\"m 278 -17 q 189 0 225 -17 q 131 47 153 17 q 100 119 110 76 q 90 214 90 161 l 90 974 l 294 974 l 294 206 q 306 161 294 174 q 331 149 318 149 q 342 149 338 149 q 356 151 347 149 l 381 0 q 338 -12 364 -7 q 278 -17 313 -17 m 182 1021 l 90 1124 l 328 1318 l 436 1186 l 182 1021 z \"},\"ľ\":{\"ha\":443,\"x_min\":90,\"x_max\":478,\"o\":\"m 278 -17 q 189 0 225 -17 q 131 47 153 17 q 100 119 110 76 q 90 214 90 161 l 90 974 l 294 974 l 294 206 q 306 161 294 174 q 331 149 318 149 q 342 149 338 149 q 356 151 347 149 l 381 0 q 338 -12 364 -7 q 278 -17 313 -17 m 354 761 l 346 1069 l 478 1069 l 475 974 l 442 761 l 354 761 z \"},\"ŀ\":{\"ha\":629,\"x_min\":90,\"x_max\":629,\"o\":\"m 278 -17 q 189 0 225 -17 q 131 47 153 17 q 100 119 110 76 q 90 214 90 161 l 90 974 l 294 974 l 294 206 q 306 161 294 174 q 331 149 318 149 q 342 149 338 149 q 356 151 347 149 l 381 0 q 338 -12 364 -7 q 278 -17 313 -17 m 506 328 q 417 365 453 328 q 382 456 382 401 q 417 548 382 511 q 506 585 453 585 q 594 548 558 585 q 629 456 629 511 q 594 365 629 401 q 506 328 558 328 z \"},\"ļ\":{\"ha\":397,\"x_min\":90,\"x_max\":392,\"o\":\"m 278 -17 q 189 0 225 -17 q 131 47 153 17 q 100 119 110 76 q 90 214 90 161 l 90 974 l 294 974 l 294 206 q 306 161 294 174 q 331 149 318 149 q 342 149 338 149 q 356 151 347 149 l 381 0 q 338 -12 364 -7 q 278 -17 313 -17 m 118 -332 l 103 -250 q 215 -233 185 -246 q 246 -196 246 -219 q 225 -164 246 -176 q 157 -147 204 -151 l 196 -72 q 349 -110 307 -82 q 392 -189 392 -137 q 320 -294 392 -260 q 118 -332 249 -328 z \"},\"ḷ\":{\"ha\":397,\"x_min\":90,\"x_max\":381,\"o\":\"m 278 -17 q 189 0 225 -17 q 131 47 153 17 q 100 119 110 76 q 90 214 90 161 l 90 974 l 294 974 l 294 206 q 306 161 294 174 q 331 149 318 149 q 342 149 338 149 q 356 151 347 149 l 381 0 q 338 -12 364 -7 q 278 -17 313 -17 m 260 -312 q 178 -283 210 -312 q 147 -206 147 -253 q 178 -128 147 -158 q 260 -99 210 -99 q 341 -128 310 -99 q 372 -206 372 -158 q 341 -283 372 -253 q 260 -312 310 -312 z \"},\"ḹ\":{\"ha\":397,\"x_min\":-15,\"x_max\":396,\"o\":\"m 278 -17 q 189 0 225 -17 q 131 47 153 17 q 100 119 110 76 q 90 214 90 161 l 90 974 l 294 974 l 294 206 q 306 161 294 174 q 331 149 318 149 q 342 149 338 149 q 356 151 347 149 l 381 0 q 338 -12 364 -7 q 278 -17 313 -17 m -15 1117 l -15 1246 l 396 1246 l 396 1117 l -15 1117 m 260 -312 q 178 -283 210 -312 q 147 -206 147 -253 q 178 -128 147 -158 q 260 -99 210 -99 q 341 -128 310 -99 q 372 -206 372 -158 q 341 -283 372 -253 q 260 -312 310 -312 z \"},\"ḻ\":{\"ha\":397,\"x_min\":54,\"x_max\":465,\"o\":\"m 278 -17 q 189 0 225 -17 q 131 47 153 17 q 100 119 110 76 q 90 214 90 161 l 90 974 l 294 974 l 294 206 q 306 161 294 174 q 331 149 318 149 q 342 149 338 149 q 356 151 347 149 l 381 0 q 338 -12 364 -7 q 278 -17 313 -17 m 54 -260 l 54 -131 l 465 -131 l 465 -260 l 54 -260 z \"},\"ł\":{\"ha\":421,\"x_min\":-29,\"x_max\":444,\"o\":\"m 292 -17 q 203 0 239 -17 q 145 47 167 17 q 114 119 124 76 q 104 214 104 161 l 104 383 l 42 347 l -29 474 l 104 549 l 104 974 l 308 974 l 308 649 l 375 686 l 444 560 l 308 483 l 308 206 q 320 161 308 174 q 344 149 332 149 q 356 149 351 149 q 369 151 361 149 l 394 0 q 352 -12 378 -7 q 292 -17 326 -17 z \"},\"ḿ\":{\"ha\":1190,\"x_min\":90,\"x_max\":1107,\"o\":\"m 90 0 l 90 689 l 257 689 l 271 600 l 276 600 q 368 674 319 643 q 485 706 417 706 q 603 676 558 706 q 675 590 649 646 q 772 672 721 638 q 892 706 822 706 q 1055 631 1003 706 q 1107 428 1107 557 l 1107 0 l 903 0 l 903 401 q 883 504 903 476 q 818 532 863 532 q 700 465 767 532 l 700 0 l 496 0 l 496 401 q 476 504 496 476 q 411 532 456 532 q 294 465 358 532 l 294 0 l 90 0 m 622 794 l 522 894 l 736 1147 l 874 1013 l 622 794 z \"},\"ṁ\":{\"ha\":1190,\"x_min\":90,\"x_max\":1107,\"o\":\"m 90 0 l 90 689 l 257 689 l 271 600 l 276 600 q 368 674 319 643 q 485 706 417 706 q 603 676 558 706 q 675 590 649 646 q 772 672 721 638 q 892 706 822 706 q 1055 631 1003 706 q 1107 428 1107 557 l 1107 0 l 903 0 l 903 401 q 883 504 903 476 q 818 532 863 532 q 700 465 767 532 l 700 0 l 496 0 l 496 401 q 476 504 496 476 q 411 532 456 532 q 294 465 358 532 l 294 0 l 90 0 m 608 790 q 527 820 558 790 q 496 897 496 850 q 527 974 496 944 q 608 1004 558 1004 q 690 974 658 1004 q 721 897 721 944 q 690 820 721 850 q 608 790 658 790 z \"},\"ṃ\":{\"ha\":1190,\"x_min\":90,\"x_max\":1107,\"o\":\"m 90 0 l 90 689 l 257 689 l 271 600 l 276 600 q 368 674 319 643 q 485 706 417 706 q 603 676 558 706 q 675 590 649 646 q 772 672 721 638 q 892 706 822 706 q 1055 631 1003 706 q 1107 428 1107 557 l 1107 0 l 903 0 l 903 401 q 883 504 903 476 q 818 532 863 532 q 700 465 767 532 l 700 0 l 496 0 l 496 401 q 476 504 496 476 q 411 532 456 532 q 294 465 358 532 l 294 0 l 90 0 m 610 -312 q 528 -283 560 -312 q 497 -206 497 -253 q 528 -128 497 -158 q 610 -99 560 -99 q 691 -128 660 -99 q 722 -206 722 -158 q 691 -283 722 -253 q 610 -312 660 -312 z \"},\"ń\":{\"ha\":794,\"x_min\":90,\"x_max\":711,\"o\":\"m 90 0 l 90 689 l 257 689 l 271 601 l 276 601 q 374 674 321 643 q 497 706 426 706 q 660 632 610 706 q 711 428 711 558 l 711 0 l 507 0 l 507 401 q 487 504 507 476 q 422 532 467 532 q 356 515 383 532 q 294 465 328 497 l 294 0 l 90 0 m 442 794 l 342 894 l 556 1147 l 693 1013 l 442 794 z \"},\"ǹ\":{\"ha\":794,\"x_min\":90,\"x_max\":711,\"o\":\"m 90 0 l 90 689 l 257 689 l 271 601 l 276 601 q 374 674 321 643 q 497 706 426 706 q 660 632 610 706 q 711 428 711 558 l 711 0 l 507 0 l 507 401 q 487 504 507 476 q 422 532 467 532 q 356 515 383 532 q 294 465 328 497 l 294 0 l 90 0 m 414 794 l 163 1013 l 300 1147 l 514 894 l 414 794 z \"},\"ň\":{\"ha\":794,\"x_min\":90,\"x_max\":711,\"o\":\"m 90 0 l 90 689 l 257 689 l 271 601 l 276 601 q 374 674 321 643 q 497 706 426 706 q 660 632 610 706 q 711 428 711 558 l 711 0 l 507 0 l 507 401 q 487 504 507 476 q 422 532 467 532 q 356 515 383 532 q 294 465 328 497 l 294 0 l 90 0 m 324 801 l 174 983 l 251 1056 l 425 928 l 431 928 l 604 1056 l 682 983 l 532 801 l 324 801 z \"},\"ñ\":{\"ha\":794,\"x_min\":90,\"x_max\":711,\"o\":\"m 90 0 l 90 689 l 257 689 l 271 601 l 276 601 q 374 674 321 643 q 497 706 426 706 q 660 632 610 706 q 711 428 711 558 l 711 0 l 507 0 l 507 401 q 487 504 507 476 q 422 532 467 532 q 356 515 383 532 q 294 465 328 497 l 294 0 l 90 0 m 519 796 q 460 810 486 796 q 413 840 435 824 q 374 871 392 857 q 340 885 357 885 q 308 867 319 885 q 292 808 296 849 l 164 815 q 211 975 167 924 q 336 1026 256 1026 q 395 1013 369 1026 q 442 982 421 999 q 481 951 464 965 q 515 938 499 938 q 564 1014 556 938 l 692 1007 q 644 847 689 899 q 519 796 600 796 z \"},\"ņ\":{\"ha\":794,\"x_min\":90,\"x_max\":711,\"o\":\"m 90 0 l 90 689 l 257 689 l 271 601 l 276 601 q 374 674 321 643 q 497 706 426 706 q 660 632 610 706 q 711 428 711 558 l 711 0 l 507 0 l 507 401 q 487 504 507 476 q 422 532 467 532 q 356 515 383 532 q 294 465 328 497 l 294 0 l 90 0 m 263 -332 l 247 -250 q 360 -233 329 -246 q 390 -196 390 -219 q 369 -164 390 -176 q 301 -147 349 -151 l 340 -72 q 494 -110 451 -82 q 536 -189 536 -137 q 465 -294 536 -260 q 263 -332 393 -328 z \"},\"ṅ\":{\"ha\":794,\"x_min\":90,\"x_max\":711,\"o\":\"m 90 0 l 90 689 l 257 689 l 271 601 l 276 601 q 374 674 321 643 q 497 706 426 706 q 660 632 610 706 q 711 428 711 558 l 711 0 l 507 0 l 507 401 q 487 504 507 476 q 422 532 467 532 q 356 515 383 532 q 294 465 328 497 l 294 0 l 90 0 m 428 790 q 347 820 378 790 q 315 897 315 850 q 347 974 315 944 q 428 1004 378 1004 q 509 974 478 1004 q 540 897 540 944 q 509 820 540 850 q 428 790 478 790 z \"},\"ṇ\":{\"ha\":794,\"x_min\":90,\"x_max\":711,\"o\":\"m 90 0 l 90 689 l 257 689 l 271 601 l 276 601 q 374 674 321 643 q 497 706 426 706 q 660 632 610 706 q 711 428 711 558 l 711 0 l 507 0 l 507 401 q 487 504 507 476 q 422 532 467 532 q 356 515 383 532 q 294 465 328 497 l 294 0 l 90 0 m 404 -312 q 323 -283 354 -312 q 292 -206 292 -253 q 323 -128 292 -158 q 404 -99 354 -99 q 485 -128 454 -99 q 517 -206 517 -158 q 485 -283 517 -253 q 404 -312 454 -312 z \"},\"ṉ\":{\"ha\":794,\"x_min\":90,\"x_max\":711,\"o\":\"m 90 0 l 90 689 l 257 689 l 271 601 l 276 601 q 374 674 321 643 q 497 706 426 706 q 660 632 610 706 q 711 428 711 558 l 711 0 l 507 0 l 507 401 q 487 504 507 476 q 422 532 467 532 q 356 515 383 532 q 294 465 328 497 l 294 0 l 90 0 m 199 -260 l 199 -131 l 610 -131 l 610 -260 l 199 -260 z \"},\"ŉ\":{\"ha\":1183,\"x_min\":99,\"x_max\":1097,\"o\":\"m 476 0 l 476 689 l 643 689 l 657 601 l 663 601 q 760 674 707 643 q 883 706 813 706 q 1047 632 996 706 q 1097 428 1097 558 l 1097 0 l 893 0 l 893 401 q 873 504 893 476 q 808 532 853 532 q 742 515 769 532 q 681 465 714 497 l 681 0 l 476 0 m 143 489 l 99 578 q 192 651 161 610 q 224 754 224 692 q 211 753 219 753 q 135 780 167 753 q 104 854 104 807 q 134 938 104 907 q 211 968 164 968 q 308 921 275 968 q 342 786 342 874 q 292 613 342 688 q 143 489 243 538 z \"},\"ò\":{\"ha\":771,\"x_min\":50,\"x_max\":721,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 512 681 451 706 q 619 611 572 657 q 693 498 665 565 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 371 794 l 119 1013 l 257 1147 l 471 894 l 371 794 z \"},\"ó\":{\"ha\":771,\"x_min\":50,\"x_max\":721,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 512 681 451 706 q 619 611 572 657 q 693 498 665 565 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 399 794 l 299 894 l 513 1147 l 650 1013 l 399 794 z \"},\"ô\":{\"ha\":771,\"x_min\":50,\"x_max\":721,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 512 681 451 706 q 619 611 572 657 q 693 498 665 565 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 131 851 l 281 1033 l 489 1033 l 639 851 l 561 779 l 388 907 l 382 907 l 208 779 l 131 851 z \"},\"õ\":{\"ha\":771,\"x_min\":50,\"x_max\":721,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 512 681 451 706 q 619 611 572 657 q 693 498 665 565 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 476 796 q 417 810 443 796 q 370 840 392 824 q 331 871 349 857 q 297 885 314 885 q 265 867 276 885 q 249 808 253 849 l 121 815 q 168 975 124 924 q 293 1026 213 1026 q 352 1013 326 1026 q 399 982 378 999 q 438 951 421 965 q 472 938 456 938 q 521 1014 513 938 l 649 1007 q 601 847 646 899 q 476 796 557 796 z \"},\"ö\":{\"ha\":771,\"x_min\":50,\"x_max\":721,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 512 681 451 706 q 619 611 572 657 q 693 498 665 565 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 233 790 q 161 819 189 790 q 133 890 133 847 q 161 960 133 932 q 233 989 189 989 q 305 960 278 989 q 332 890 332 932 q 305 819 332 847 q 233 790 278 790 m 536 790 q 465 819 492 790 q 438 890 438 847 q 465 960 438 932 q 536 989 492 989 q 608 960 581 989 q 636 890 636 932 q 608 819 636 847 q 536 790 581 790 z \"},\"ō\":{\"ha\":771,\"x_min\":50,\"x_max\":721,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 512 681 451 706 q 619 611 572 657 q 693 498 665 565 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 179 822 l 179 951 l 590 951 l 590 822 l 179 822 z \"},\"ő\":{\"ha\":771,\"x_min\":50,\"x_max\":721,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 512 681 451 706 q 619 611 572 657 q 693 498 665 565 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 313 785 l 206 833 l 326 1085 l 464 1024 l 313 785 m 561 785 l 454 833 l 575 1085 l 713 1024 l 561 785 z \"},\"ǒ\":{\"ha\":771,\"x_min\":50,\"x_max\":721,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 512 681 451 706 q 619 611 572 657 q 693 498 665 565 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 281 801 l 131 983 l 208 1056 l 382 928 l 388 928 l 561 1056 l 639 983 l 489 801 l 281 801 z \"},\"ọ\":{\"ha\":771,\"x_min\":50,\"x_max\":721,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 512 681 451 706 q 619 611 572 657 q 693 498 665 565 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 385 -312 q 303 -283 335 -312 q 272 -206 272 -253 q 303 -128 272 -158 q 385 -99 335 -99 q 466 -128 435 -99 q 497 -206 497 -158 q 466 -283 497 -253 q 385 -312 435 -312 z \"},\"ỏ\":{\"ha\":771,\"x_min\":50,\"x_max\":721,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 512 681 451 706 q 619 611 572 657 q 693 498 665 565 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 325 789 l 308 869 q 353 885 335 875 q 371 918 371 896 q 346 958 371 943 q 260 976 321 972 l 272 1101 q 388 1087 340 1100 q 464 1052 435 1074 q 506 1000 493 1031 q 519 933 519 969 q 503 872 519 897 q 461 828 488 846 q 399 801 435 811 q 325 789 364 792 z \"},\"ố\":{\"ha\":771,\"x_min\":50,\"x_max\":769,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 512 681 451 706 q 619 611 572 657 q 693 498 665 565 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 240 786 l 175 858 l 304 986 l 465 986 l 594 858 l 529 786 l 388 876 l 382 876 l 240 786 m 551 947 l 661 1124 l 769 1053 l 629 886 l 551 947 z \"},\"ồ\":{\"ha\":771,\"x_min\":-6,\"x_max\":721,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 512 681 451 706 q 619 611 572 657 q 693 498 665 565 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 240 786 l 175 858 l 304 986 l 465 986 l 594 858 l 529 786 l 388 876 l 382 876 l 240 786 m 218 947 l 140 886 l -6 1051 l 103 1124 l 218 947 z \"},\"ổ\":{\"ha\":771,\"x_min\":50,\"x_max\":738,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 512 681 451 706 q 619 611 572 657 q 693 498 665 565 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 240 786 l 175 858 l 304 986 l 465 986 l 594 858 l 529 786 l 388 876 l 382 876 l 240 786 m 576 894 l 563 964 q 593 977 582 969 q 604 1004 604 985 q 585 1035 604 1024 q 514 1050 567 1046 l 533 1136 q 692 1103 647 1132 q 738 1025 738 1074 q 724 969 738 992 q 690 931 711 946 q 639 907 668 915 q 576 894 610 899 z \"},\"ỗ\":{\"ha\":771,\"x_min\":50,\"x_max\":721,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 512 681 451 706 q 619 611 572 657 q 693 498 665 565 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 240 786 l 175 858 l 304 975 l 465 975 l 594 858 l 529 786 l 388 864 l 382 864 l 240 786 m 179 1010 q 219 1126 188 1089 q 304 1164 251 1164 q 354 1155 333 1164 q 392 1135 375 1146 q 424 1115 410 1124 q 454 1106 439 1106 q 497 1158 486 1106 l 590 1149 q 550 1032 582 1069 q 465 994 518 994 q 415 1003 436 994 q 377 1024 394 1013 q 345 1044 360 1035 q 315 1053 331 1053 q 272 1000 283 1053 l 179 1010 z \"},\"ộ\":{\"ha\":771,\"x_min\":50,\"x_max\":721,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 512 681 451 706 q 619 611 572 657 q 693 498 665 565 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 131 851 l 281 1033 l 489 1033 l 639 851 l 561 779 l 388 907 l 382 907 l 208 779 l 131 851 m 385 -312 q 303 -283 335 -312 q 272 -206 272 -253 q 303 -128 272 -158 q 385 -99 335 -99 q 466 -128 435 -99 q 497 -206 497 -158 q 466 -283 497 -253 q 385 -312 435 -312 z \"},\"ŏ\":{\"ha\":771,\"x_min\":50,\"x_max\":721,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 512 681 451 706 q 619 611 572 657 q 693 498 665 565 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 385 794 q 282 811 325 794 q 210 858 239 828 q 166 927 181 888 q 150 1013 151 967 l 267 1032 q 301 955 274 988 q 385 922 329 922 q 468 955 440 922 q 503 1032 496 988 l 619 1013 q 603 927 618 967 q 560 858 589 888 q 488 811 532 828 q 385 794 444 794 z \"},\"ṓ\":{\"ha\":771,\"x_min\":50,\"x_max\":721,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 512 681 451 706 q 619 611 572 657 q 693 498 665 565 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 346 990 l 278 1074 l 478 1219 l 561 1117 l 346 990 m 179 822 l 179 951 l 590 951 l 590 822 l 179 822 z \"},\"ø\":{\"ha\":771,\"x_min\":50,\"x_max\":721,\"o\":\"m 386 -17 q 200 39 283 -17 l 140 -35 l 64 24 l 129 104 q 72 209 93 149 q 50 344 50 269 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 482 692 435 706 q 569 651 529 678 l 631 726 l 707 667 l 642 586 q 699 480 678 540 q 721 344 721 419 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 247 356 q 257 263 247 300 l 464 521 q 386 547 433 547 q 285 495 322 547 q 247 356 247 443 m 386 142 q 486 194 449 142 q 524 333 524 246 q 514 428 524 390 l 306 169 q 386 142 338 142 z \"},\"œ\":{\"ha\":1142,\"x_min\":50,\"x_max\":1092,\"o\":\"m 371 -17 q 246 8 304 -17 q 144 78 188 32 q 75 191 100 124 q 50 344 50 258 q 76 498 50 431 q 147 611 103 565 q 251 681 192 657 q 375 706 310 706 q 503 674 449 706 q 599 585 558 642 q 697 674 640 643 q 817 706 754 706 q 936 680 885 706 q 1022 609 988 654 q 1074 503 1057 564 q 1092 371 1092 442 q 1089 320 1092 343 q 1083 285 1086 297 l 685 285 q 742 178 696 213 q 850 143 788 143 q 924 157 889 143 q 996 193 958 171 l 1067 61 q 949 4 1014 25 q 822 -17 883 -17 q 701 15 760 -17 q 600 104 643 46 q 502 14 557 44 q 371 -17 447 -17 m 375 149 q 464 201 432 149 q 496 344 496 254 q 464 488 496 435 q 375 540 432 540 q 288 488 318 540 q 257 344 257 435 q 288 201 257 254 q 375 149 318 149 m 685 410 l 917 410 q 892 511 917 472 q 810 550 867 550 q 727 516 761 550 q 685 410 693 482 z \"},\"ơ\":{\"ha\":771,\"x_min\":50,\"x_max\":785,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 519 678 456 706 q 588 717 561 689 q 614 803 614 744 q 608 847 614 826 q 592 882 601 867 l 743 947 q 772 891 758 926 q 785 817 785 856 q 772 742 785 775 q 735 683 758 708 q 683 639 713 657 q 618 611 653 621 q 693 497 665 564 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 z \"},\"ớ\":{\"ha\":771,\"x_min\":50,\"x_max\":785,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 519 678 456 706 q 588 717 561 689 q 614 803 614 744 q 608 847 614 826 q 592 882 601 867 l 743 947 q 772 891 758 926 q 785 817 785 856 q 772 742 785 775 q 735 683 758 708 q 683 639 713 657 q 618 611 653 621 q 693 497 665 564 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 399 794 l 299 894 l 513 1147 l 650 1013 l 399 794 z \"},\"ờ\":{\"ha\":771,\"x_min\":50,\"x_max\":785,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 519 678 456 706 q 588 717 561 689 q 614 803 614 744 q 608 847 614 826 q 592 882 601 867 l 743 947 q 772 891 758 926 q 785 817 785 856 q 772 742 785 775 q 735 683 758 708 q 683 639 713 657 q 618 611 653 621 q 693 497 665 564 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 371 794 l 119 1013 l 257 1147 l 471 894 l 371 794 z \"},\"ở\":{\"ha\":771,\"x_min\":50,\"x_max\":785,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 519 678 456 706 q 588 717 561 689 q 614 803 614 744 q 608 847 614 826 q 592 882 601 867 l 743 947 q 772 891 758 926 q 785 817 785 856 q 772 742 785 775 q 735 683 758 708 q 683 639 713 657 q 618 611 653 621 q 693 497 665 564 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 325 789 l 308 869 q 353 885 335 875 q 371 918 371 896 q 346 958 371 943 q 260 976 321 972 l 272 1101 q 388 1087 340 1100 q 464 1052 435 1074 q 506 1000 493 1031 q 519 933 519 969 q 503 872 519 897 q 461 828 488 846 q 399 801 435 811 q 325 789 364 792 z \"},\"ỡ\":{\"ha\":771,\"x_min\":50,\"x_max\":785,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 519 678 456 706 q 588 717 561 689 q 614 803 614 744 q 608 847 614 826 q 592 882 601 867 l 743 947 q 772 891 758 926 q 785 817 785 856 q 772 742 785 775 q 735 683 758 708 q 683 639 713 657 q 618 611 653 621 q 693 497 665 564 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 431 796 q 372 810 397 796 q 324 840 346 824 q 285 871 303 857 q 251 885 268 885 q 219 867 231 885 q 203 808 207 849 l 75 815 q 122 975 78 924 q 247 1026 167 1026 q 306 1013 281 1026 q 353 982 332 999 q 392 951 375 965 q 426 938 410 938 q 475 1014 467 938 l 603 1007 q 556 847 600 899 q 431 796 511 796 z \"},\"ợ\":{\"ha\":771,\"x_min\":50,\"x_max\":785,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 519 678 456 706 q 588 717 561 689 q 614 803 614 744 q 608 847 614 826 q 592 882 601 867 l 743 947 q 772 891 758 926 q 785 817 785 856 q 772 742 785 775 q 735 683 758 708 q 683 639 713 657 q 618 611 653 621 q 693 497 665 564 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 385 -312 q 303 -283 335 -312 q 272 -206 272 -253 q 303 -128 272 -158 q 385 -99 335 -99 q 466 -128 435 -99 q 497 -206 497 -158 q 466 -283 497 -253 q 385 -312 435 -312 z \"},\"ǫ\":{\"ha\":771,\"x_min\":50,\"x_max\":721,\"o\":\"m 413 -292 q 308 -260 350 -292 q 265 -165 265 -228 q 273 -116 265 -139 q 292 -74 281 -93 q 316 -40 303 -54 q 342 -14 329 -25 q 230 21 283 -7 q 137 94 176 49 q 74 203 97 140 q 50 344 50 265 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 512 681 451 706 q 619 611 572 657 q 693 498 665 565 q 721 344 721 431 q 705 222 721 275 q 659 128 689 169 q 588 55 629 86 q 496 0 546 24 q 424 -56 444 -24 q 403 -118 403 -87 q 421 -158 403 -146 q 461 -171 439 -171 q 488 -166 475 -171 q 511 -154 500 -161 l 553 -246 q 486 -279 526 -267 q 413 -292 446 -292 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 z \"},\"ŕ\":{\"ha\":553,\"x_min\":90,\"x_max\":608,\"o\":\"m 90 0 l 90 689 l 257 689 l 271 568 l 276 568 q 367 672 314 639 q 472 706 419 706 q 520 702 501 706 q 554 692 539 699 l 521 515 q 485 524 501 521 q 446 526 468 526 q 365 499 407 526 q 294 400 322 471 l 294 0 l 90 0 m 357 794 l 257 894 l 471 1147 l 608 1013 l 357 794 z \"},\"ŗ\":{\"ha\":553,\"x_min\":35,\"x_max\":554,\"o\":\"m 90 0 l 90 689 l 257 689 l 271 568 l 276 568 q 367 672 314 639 q 472 706 419 706 q 520 702 501 706 q 554 692 539 699 l 521 515 q 485 524 501 521 q 446 526 468 526 q 365 499 407 526 q 294 400 322 471 l 294 0 l 90 0 m 50 -332 l 35 -250 q 147 -233 117 -246 q 178 -196 178 -219 q 157 -164 178 -176 q 89 -147 136 -151 l 128 -72 q 281 -110 239 -82 q 324 -189 324 -137 q 252 -294 324 -260 q 50 -332 181 -328 z \"},\"ř\":{\"ha\":553,\"x_min\":89,\"x_max\":597,\"o\":\"m 90 0 l 90 689 l 257 689 l 271 568 l 276 568 q 367 672 314 639 q 472 706 419 706 q 520 702 501 706 q 554 692 539 699 l 521 515 q 485 524 501 521 q 446 526 468 526 q 365 499 407 526 q 294 400 322 471 l 294 0 l 90 0 m 239 801 l 89 983 l 167 1056 l 340 928 l 346 928 l 519 1056 l 597 983 l 447 801 l 239 801 z \"},\"ṙ\":{\"ha\":553,\"x_min\":90,\"x_max\":554,\"o\":\"m 90 0 l 90 689 l 257 689 l 271 568 l 276 568 q 367 672 314 639 q 472 706 419 706 q 520 702 501 706 q 554 692 539 699 l 521 515 q 485 524 501 521 q 446 526 468 526 q 365 499 407 526 q 294 400 322 471 l 294 0 l 90 0 m 342 790 q 260 820 292 790 q 229 897 229 850 q 260 974 229 944 q 342 1004 292 1004 q 423 974 392 1004 q 454 897 454 944 q 423 820 454 850 q 342 790 392 790 z \"},\"ṛ\":{\"ha\":553,\"x_min\":79,\"x_max\":554,\"o\":\"m 90 0 l 90 689 l 257 689 l 271 568 l 276 568 q 367 672 314 639 q 472 706 419 706 q 520 702 501 706 q 554 692 539 699 l 521 515 q 485 524 501 521 q 446 526 468 526 q 365 499 407 526 q 294 400 322 471 l 294 0 l 90 0 m 192 -312 q 110 -283 142 -312 q 79 -206 79 -253 q 110 -128 79 -158 q 192 -99 142 -99 q 273 -128 242 -99 q 304 -206 304 -158 q 273 -283 304 -253 q 192 -312 242 -312 z \"},\"ṝ\":{\"ha\":553,\"x_min\":79,\"x_max\":554,\"o\":\"m 90 0 l 90 689 l 257 689 l 271 568 l 276 568 q 367 672 314 639 q 472 706 419 706 q 520 702 501 706 q 554 692 539 699 l 521 515 q 485 524 501 521 q 446 526 468 526 q 365 499 407 526 q 294 400 322 471 l 294 0 l 90 0 m 138 822 l 138 951 l 549 951 l 549 822 l 138 822 m 192 -312 q 110 -283 142 -312 q 79 -206 79 -253 q 110 -128 79 -158 q 192 -99 142 -99 q 273 -128 242 -99 q 304 -206 304 -158 q 273 -283 304 -253 q 192 -312 242 -312 z \"},\"ṟ\":{\"ha\":553,\"x_min\":-14,\"x_max\":554,\"o\":\"m 90 0 l 90 689 l 257 689 l 271 568 l 276 568 q 367 672 314 639 q 472 706 419 706 q 520 702 501 706 q 554 692 539 699 l 521 515 q 485 524 501 521 q 446 526 468 526 q 365 499 407 526 q 294 400 322 471 l 294 0 l 90 0 m -14 -260 l -14 -131 l 397 -131 l 397 -260 l -14 -260 z \"},\"ś\":{\"ha\":615,\"x_min\":29,\"x_max\":592,\"o\":\"m 293 -17 q 153 10 225 -17 q 29 79 82 36 l 121 207 q 211 153 168 171 q 299 135 254 135 q 365 150 344 135 q 386 193 386 165 q 374 223 386 210 q 342 247 363 236 q 297 267 322 258 q 246 288 272 276 q 182 317 214 300 q 124 358 150 333 q 81 415 97 382 q 64 490 64 447 q 83 578 64 538 q 136 646 101 618 q 219 690 171 674 q 328 706 268 706 q 467 678 407 706 q 571 618 526 651 l 479 496 q 406 539 442 524 q 333 554 369 554 q 256 500 256 554 q 267 472 256 483 q 297 450 278 460 q 340 431 315 440 q 390 413 364 422 q 456 384 424 400 q 516 344 489 368 q 560 287 543 321 q 576 206 576 253 q 558 118 576 158 q 504 48 540 78 q 415 1 468 18 q 293 -17 363 -17 m 340 794 l 240 894 l 454 1147 l 592 1013 l 340 794 z \"},\"ŝ\":{\"ha\":615,\"x_min\":29,\"x_max\":581,\"o\":\"m 293 -17 q 153 10 225 -17 q 29 79 82 36 l 121 207 q 211 153 168 171 q 299 135 254 135 q 365 150 344 135 q 386 193 386 165 q 374 223 386 210 q 342 247 363 236 q 297 267 322 258 q 246 288 272 276 q 182 317 214 300 q 124 358 150 333 q 81 415 97 382 q 64 490 64 447 q 83 578 64 538 q 136 646 101 618 q 219 690 171 674 q 328 706 268 706 q 467 678 407 706 q 571 618 526 651 l 479 496 q 406 539 442 524 q 333 554 369 554 q 256 500 256 554 q 267 472 256 483 q 297 450 278 460 q 340 431 315 440 q 390 413 364 422 q 456 384 424 400 q 516 344 489 368 q 560 287 543 321 q 576 206 576 253 q 558 118 576 158 q 504 48 540 78 q 415 1 468 18 q 293 -17 363 -17 m 72 851 l 222 1033 l 431 1033 l 581 851 l 503 779 l 329 907 l 324 907 l 150 779 l 72 851 z \"},\"š\":{\"ha\":615,\"x_min\":29,\"x_max\":581,\"o\":\"m 293 -17 q 153 10 225 -17 q 29 79 82 36 l 121 207 q 211 153 168 171 q 299 135 254 135 q 365 150 344 135 q 386 193 386 165 q 374 223 386 210 q 342 247 363 236 q 297 267 322 258 q 246 288 272 276 q 182 317 214 300 q 124 358 150 333 q 81 415 97 382 q 64 490 64 447 q 83 578 64 538 q 136 646 101 618 q 219 690 171 674 q 328 706 268 706 q 467 678 407 706 q 571 618 526 651 l 479 496 q 406 539 442 524 q 333 554 369 554 q 256 500 256 554 q 267 472 256 483 q 297 450 278 460 q 340 431 315 440 q 390 413 364 422 q 456 384 424 400 q 516 344 489 368 q 560 287 543 321 q 576 206 576 253 q 558 118 576 158 q 504 48 540 78 q 415 1 468 18 q 293 -17 363 -17 m 222 801 l 72 983 l 150 1056 l 324 928 l 329 928 l 503 1056 l 581 983 l 431 801 l 222 801 z \"},\"ş\":{\"ha\":615,\"x_min\":29,\"x_max\":576,\"o\":\"m 293 -17 q 153 10 225 -17 q 29 79 82 36 l 121 207 q 211 153 168 171 q 299 135 254 135 q 365 150 344 135 q 386 193 386 165 q 374 223 386 210 q 342 247 363 236 q 297 267 322 258 q 246 288 272 276 q 182 317 214 300 q 124 358 150 333 q 81 415 97 382 q 64 490 64 447 q 83 578 64 538 q 136 646 101 618 q 219 690 171 674 q 328 706 268 706 q 467 678 407 706 q 571 618 526 651 l 479 496 q 406 539 442 524 q 333 554 369 554 q 256 500 256 554 q 267 472 256 483 q 297 450 278 460 q 340 431 315 440 q 390 413 364 422 q 456 384 424 400 q 516 344 489 368 q 560 287 543 321 q 576 206 576 253 q 558 118 576 158 q 504 48 540 78 q 415 1 468 18 q 293 -17 363 -17 m 186 -332 l 171 -250 q 283 -232 253 -246 q 314 -189 314 -218 q 292 -153 314 -168 q 207 -131 271 -139 l 274 6 l 393 6 l 354 -85 q 433 -121 407 -97 q 460 -189 460 -144 q 388 -294 460 -260 q 186 -332 317 -328 z \"},\"ș\":{\"ha\":615,\"x_min\":29,\"x_max\":576,\"o\":\"m 293 -17 q 153 10 225 -17 q 29 79 82 36 l 121 207 q 211 153 168 171 q 299 135 254 135 q 365 150 344 135 q 386 193 386 165 q 374 223 386 210 q 342 247 363 236 q 297 267 322 258 q 246 288 272 276 q 182 317 214 300 q 124 358 150 333 q 81 415 97 382 q 64 490 64 447 q 83 578 64 538 q 136 646 101 618 q 219 690 171 674 q 328 706 268 706 q 467 678 407 706 q 571 618 526 651 l 479 496 q 406 539 442 524 q 333 554 369 554 q 256 500 256 554 q 267 472 256 483 q 297 450 278 460 q 340 431 315 440 q 390 413 364 422 q 456 384 424 400 q 516 344 489 368 q 560 287 543 321 q 576 206 576 253 q 558 118 576 158 q 504 48 540 78 q 415 1 468 18 q 293 -17 363 -17 m 181 -332 l 165 -250 q 278 -233 247 -246 q 308 -196 308 -219 q 288 -164 308 -176 q 219 -147 267 -151 l 258 -72 q 412 -110 369 -82 q 454 -189 454 -137 q 383 -294 454 -260 q 181 -332 311 -328 z \"},\"ṡ\":{\"ha\":615,\"x_min\":29,\"x_max\":576,\"o\":\"m 293 -17 q 153 10 225 -17 q 29 79 82 36 l 121 207 q 211 153 168 171 q 299 135 254 135 q 365 150 344 135 q 386 193 386 165 q 374 223 386 210 q 342 247 363 236 q 297 267 322 258 q 246 288 272 276 q 182 317 214 300 q 124 358 150 333 q 81 415 97 382 q 64 490 64 447 q 83 578 64 538 q 136 646 101 618 q 219 690 171 674 q 328 706 268 706 q 467 678 407 706 q 571 618 526 651 l 479 496 q 406 539 442 524 q 333 554 369 554 q 256 500 256 554 q 267 472 256 483 q 297 450 278 460 q 340 431 315 440 q 390 413 364 422 q 456 384 424 400 q 516 344 489 368 q 560 287 543 321 q 576 206 576 253 q 558 118 576 158 q 504 48 540 78 q 415 1 468 18 q 293 -17 363 -17 m 326 790 q 245 820 276 790 q 214 897 214 850 q 245 974 214 944 q 326 1004 276 1004 q 408 974 376 1004 q 439 897 439 944 q 408 820 439 850 q 326 790 376 790 z \"},\"ṣ\":{\"ha\":615,\"x_min\":29,\"x_max\":576,\"o\":\"m 293 -17 q 153 10 225 -17 q 29 79 82 36 l 121 207 q 211 153 168 171 q 299 135 254 135 q 365 150 344 135 q 386 193 386 165 q 374 223 386 210 q 342 247 363 236 q 297 267 322 258 q 246 288 272 276 q 182 317 214 300 q 124 358 150 333 q 81 415 97 382 q 64 490 64 447 q 83 578 64 538 q 136 646 101 618 q 219 690 171 674 q 328 706 268 706 q 467 678 407 706 q 571 618 526 651 l 479 496 q 406 539 442 524 q 333 554 369 554 q 256 500 256 554 q 267 472 256 483 q 297 450 278 460 q 340 431 315 440 q 390 413 364 422 q 456 384 424 400 q 516 344 489 368 q 560 287 543 321 q 576 206 576 253 q 558 118 576 158 q 504 48 540 78 q 415 1 468 18 q 293 -17 363 -17 m 322 -312 q 241 -283 272 -312 q 210 -206 210 -253 q 241 -128 210 -158 q 322 -99 272 -99 q 403 -128 372 -99 q 435 -206 435 -158 q 403 -283 435 -253 q 322 -312 372 -312 z \"},\"ß\":{\"ha\":878,\"x_min\":90,\"x_max\":840,\"o\":\"m 585 -17 q 474 0 522 -17 q 375 46 425 17 l 446 185 q 578 135 514 135 q 634 153 614 135 q 654 201 654 172 q 636 247 654 228 q 591 281 618 265 q 532 315 564 297 q 473 355 500 332 q 428 409 446 378 q 410 486 410 440 q 425 556 410 526 q 459 611 440 585 q 493 666 478 638 q 508 732 508 694 q 485 799 508 772 q 419 826 463 826 q 324 780 356 826 q 292 653 292 733 l 292 0 l 90 0 l 90 676 q 110 800 90 743 q 171 899 131 857 q 274 964 211 940 q 419 988 336 988 q 544 968 490 988 q 633 916 597 949 q 686 842 668 883 q 704 756 704 800 q 688 672 704 706 q 650 610 671 638 q 613 560 629 583 q 596 511 596 538 q 614 472 596 488 q 659 440 632 456 q 718 407 686 425 q 777 363 750 389 q 822 301 804 338 q 840 211 840 264 q 824 122 840 164 q 776 50 808 81 q 695 1 743 19 q 585 -17 647 -17 z \"},\"ť\":{\"ha\":532,\"x_min\":24,\"x_max\":513,\"o\":\"m 356 -17 q 247 3 292 -17 q 173 57 201 22 q 131 141 144 92 q 118 250 118 190 l 118 529 l 24 529 l 24 681 l 129 689 l 153 872 l 322 872 l 322 689 l 488 689 l 488 529 l 322 529 l 322 253 q 347 169 322 194 q 411 143 371 143 q 445 147 428 143 q 476 157 463 151 l 508 8 q 443 -8 481 0 q 356 -17 406 -17 m 389 761 l 381 1069 l 513 1069 l 510 974 l 476 761 l 389 761 z \"},\"ţ\":{\"ha\":532,\"x_min\":24,\"x_max\":508,\"o\":\"m 356 -17 q 247 3 292 -17 q 173 57 201 22 q 131 141 144 92 q 118 250 118 190 l 118 529 l 24 529 l 24 681 l 129 689 l 153 872 l 322 872 l 322 689 l 488 689 l 488 529 l 322 529 l 322 253 q 347 169 322 194 q 411 143 371 143 q 445 147 428 143 q 476 157 463 151 l 508 8 q 443 -8 481 0 q 356 -17 406 -17 m 192 -332 l 176 -250 q 289 -232 258 -246 q 319 -189 319 -218 q 298 -153 319 -168 q 213 -131 276 -139 l 279 6 l 399 6 l 360 -85 q 439 -121 413 -97 q 465 -189 465 -144 q 394 -294 465 -260 q 192 -332 322 -328 z \"},\"ț\":{\"ha\":532,\"x_min\":24,\"x_max\":508,\"o\":\"m 356 -17 q 247 3 292 -17 q 173 57 201 22 q 131 141 144 92 q 118 250 118 190 l 118 529 l 24 529 l 24 681 l 129 689 l 153 872 l 322 872 l 322 689 l 488 689 l 488 529 l 322 529 l 322 253 q 347 169 322 194 q 411 143 371 143 q 445 147 428 143 q 476 157 463 151 l 508 8 q 443 -8 481 0 q 356 -17 406 -17 m 185 -332 l 169 -250 q 282 -233 251 -246 q 313 -196 313 -219 q 292 -164 313 -176 q 224 -147 271 -151 l 263 -72 q 416 -110 374 -82 q 458 -189 458 -137 q 387 -294 458 -260 q 185 -332 315 -328 z \"},\"ṭ\":{\"ha\":532,\"x_min\":24,\"x_max\":508,\"o\":\"m 356 -17 q 247 3 292 -17 q 173 57 201 22 q 131 141 144 92 q 118 250 118 190 l 118 529 l 24 529 l 24 681 l 129 689 l 153 872 l 322 872 l 322 689 l 488 689 l 488 529 l 322 529 l 322 253 q 347 169 322 194 q 411 143 371 143 q 445 147 428 143 q 476 157 463 151 l 508 8 q 443 -8 481 0 q 356 -17 406 -17 m 326 -312 q 245 -283 276 -312 q 214 -206 214 -253 q 245 -128 214 -158 q 326 -99 276 -99 q 408 -128 376 -99 q 439 -206 439 -158 q 408 -283 439 -253 q 326 -312 376 -312 z \"},\"ṯ\":{\"ha\":532,\"x_min\":24,\"x_max\":532,\"o\":\"m 356 -17 q 247 3 292 -17 q 173 57 201 22 q 131 141 144 92 q 118 250 118 190 l 118 529 l 24 529 l 24 681 l 129 689 l 153 872 l 322 872 l 322 689 l 488 689 l 488 529 l 322 529 l 322 253 q 347 169 322 194 q 411 143 371 143 q 445 147 428 143 q 476 157 463 151 l 508 8 q 443 -8 481 0 q 356 -17 406 -17 m 121 -260 l 121 -131 l 532 -131 l 532 -260 l 121 -260 z \"},\"ẗ\":{\"ha\":532,\"x_min\":-19,\"x_max\":508,\"o\":\"m 356 -17 q 247 3 292 -17 q 173 57 201 22 q 131 141 144 92 q 118 250 118 190 l 118 529 l 24 529 l 24 681 l 129 689 l 153 872 l 322 872 l 322 689 l 488 689 l 488 529 l 322 529 l 322 253 q 347 169 322 194 q 411 143 371 143 q 445 147 428 143 q 476 157 463 151 l 508 8 q 443 -8 481 0 q 356 -17 406 -17 m 81 985 q 8 1013 36 985 q -19 1085 -19 1042 q 8 1155 -19 1126 q 81 1183 36 1183 q 152 1155 125 1183 q 179 1085 179 1126 q 152 1013 179 1042 q 81 985 125 985 m 383 985 q 312 1013 339 985 q 285 1085 285 1042 q 312 1155 285 1126 q 383 1183 339 1183 q 456 1155 428 1183 q 483 1085 483 1126 q 456 1013 483 1042 q 383 985 428 985 z \"},\"ŧ\":{\"ha\":532,\"x_min\":24,\"x_max\":508,\"o\":\"m 24 310 l 24 400 l 118 407 l 118 529 l 24 529 l 24 681 l 129 689 l 153 872 l 322 872 l 322 689 l 488 689 l 488 529 l 322 529 l 322 408 l 488 408 l 488 310 l 322 310 l 322 253 q 347 169 322 194 q 411 143 371 143 q 445 147 428 143 q 476 157 463 151 l 508 8 q 443 -8 481 0 q 356 -17 406 -17 q 247 3 292 -17 q 173 57 201 22 q 131 141 144 92 q 118 250 118 190 l 118 310 l 24 310 z \"},\"ù\":{\"ha\":789,\"x_min\":83,\"x_max\":700,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 700 689 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 m 382 794 l 131 1013 l 268 1147 l 482 894 l 382 794 z \"},\"ú\":{\"ha\":789,\"x_min\":83,\"x_max\":700,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 700 689 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 m 410 794 l 310 894 l 524 1147 l 661 1013 l 410 794 z \"},\"û\":{\"ha\":789,\"x_min\":83,\"x_max\":700,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 700 689 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 m 142 851 l 292 1033 l 500 1033 l 650 851 l 572 779 l 399 907 l 393 907 l 219 779 l 142 851 z \"},\"ũ\":{\"ha\":789,\"x_min\":83,\"x_max\":700,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 700 689 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 m 488 796 q 428 810 454 796 q 381 840 403 824 q 342 871 360 857 q 308 885 325 885 q 276 867 288 885 q 260 808 264 849 l 132 815 q 179 975 135 924 q 304 1026 224 1026 q 363 1013 338 1026 q 410 982 389 999 q 449 951 432 965 q 483 938 467 938 q 532 1014 524 938 l 660 1007 q 613 847 657 899 q 488 796 568 796 z \"},\"ü\":{\"ha\":789,\"x_min\":83,\"x_max\":700,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 700 689 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 m 244 790 q 172 819 200 790 q 144 890 144 847 q 172 960 144 932 q 244 989 200 989 q 316 960 289 989 q 343 890 343 932 q 316 819 343 847 q 244 790 289 790 m 547 790 q 476 819 503 790 q 449 890 449 847 q 476 960 449 932 q 547 989 503 989 q 619 960 592 989 q 647 890 647 932 q 619 819 647 847 q 547 790 592 790 z \"},\"ū\":{\"ha\":789,\"x_min\":83,\"x_max\":700,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 700 689 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 m 189 822 l 189 951 l 600 951 l 600 822 l 189 822 z \"},\"ŭ\":{\"ha\":789,\"x_min\":83,\"x_max\":700,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 700 689 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 m 396 794 q 293 811 336 794 q 221 858 250 828 q 177 927 192 888 q 161 1013 163 967 l 278 1032 q 313 955 285 988 q 396 922 340 922 q 479 955 451 922 q 514 1032 507 988 l 631 1013 q 615 927 629 967 q 572 858 600 888 q 499 811 543 828 q 396 794 456 794 z \"},\"ů\":{\"ha\":789,\"x_min\":83,\"x_max\":700,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 700 689 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 m 396 783 q 258 825 304 783 q 213 928 213 867 q 258 1031 213 989 q 396 1072 304 1072 q 533 1031 488 1072 q 579 928 579 989 q 533 825 579 867 q 396 783 488 783 m 396 860 q 438 878 421 860 q 456 928 456 897 q 438 977 456 958 q 396 996 421 996 q 353 977 371 996 q 336 928 336 958 q 353 878 336 897 q 396 860 371 860 z \"},\"ű\":{\"ha\":789,\"x_min\":83,\"x_max\":724,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 700 689 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 m 324 785 l 217 833 l 338 1085 l 475 1024 l 324 785 m 572 785 l 465 833 l 586 1085 l 724 1024 l 572 785 z \"},\"ǔ\":{\"ha\":789,\"x_min\":83,\"x_max\":700,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 700 689 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 m 292 801 l 142 983 l 219 1056 l 393 928 l 399 928 l 572 1056 l 650 983 l 500 801 l 292 801 z \"},\"ǖ\":{\"ha\":789,\"x_min\":83,\"x_max\":700,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 700 689 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 m 244 793 q 183 817 207 793 q 158 878 158 842 q 183 939 158 914 q 244 964 207 964 q 306 939 282 964 q 331 878 331 914 q 306 817 331 842 q 244 793 282 793 m 190 1050 l 190 1146 l 601 1146 l 601 1050 l 190 1050 m 547 793 q 485 817 510 793 q 461 878 461 842 q 485 939 461 914 q 547 964 510 964 q 609 939 585 964 q 633 878 633 914 q 609 817 633 842 q 547 793 585 793 z \"},\"ǘ\":{\"ha\":789,\"x_min\":83,\"x_max\":700,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 700 689 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 m 406 990 l 328 1040 l 436 1225 l 544 1153 l 406 990 m 244 793 q 183 817 207 793 q 158 878 158 842 q 183 939 158 914 q 244 964 207 964 q 306 939 282 964 q 331 878 331 914 q 306 817 331 842 q 244 793 282 793 m 547 793 q 485 817 510 793 q 461 878 461 842 q 485 939 461 914 q 547 964 510 964 q 609 939 585 964 q 633 878 633 914 q 609 817 633 842 q 547 793 585 793 z \"},\"ǚ\":{\"ha\":789,\"x_min\":83,\"x_max\":700,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 700 689 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 m 254 1213 l 393 1122 l 399 1122 l 538 1213 l 604 1151 l 476 1024 l 315 1024 l 188 1151 l 254 1213 m 244 793 q 183 817 207 793 q 158 878 158 842 q 183 939 158 914 q 244 964 207 964 q 306 939 282 964 q 331 878 331 914 q 306 817 331 842 q 244 793 282 793 m 547 793 q 485 817 510 793 q 461 878 461 842 q 485 939 461 914 q 547 964 510 964 q 609 939 585 964 q 633 878 633 914 q 609 817 633 842 q 547 793 585 793 z \"},\"ǜ\":{\"ha\":789,\"x_min\":83,\"x_max\":700,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 700 689 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 m 386 990 l 247 1153 l 356 1225 l 464 1040 l 386 990 m 244 793 q 183 817 207 793 q 158 878 158 842 q 183 939 158 914 q 244 964 207 964 q 306 939 282 964 q 331 878 331 914 q 306 817 331 842 q 244 793 282 793 m 547 793 q 485 817 510 793 q 461 878 461 842 q 485 939 461 914 q 547 964 510 964 q 609 939 585 964 q 633 878 633 914 q 609 817 633 842 q 547 793 585 793 z \"},\"ụ\":{\"ha\":789,\"x_min\":83,\"x_max\":700,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 700 689 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 m 421 -312 q 340 -283 371 -312 q 308 -206 308 -253 q 340 -128 308 -158 q 421 -99 371 -99 q 502 -128 471 -99 q 533 -206 533 -158 q 502 -283 533 -253 q 421 -312 471 -312 z \"},\"ủ\":{\"ha\":789,\"x_min\":83,\"x_max\":700,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 700 689 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 m 336 789 l 319 869 q 364 885 346 875 q 382 918 382 896 q 357 958 382 943 q 271 976 332 972 l 283 1101 q 399 1087 351 1100 q 475 1052 446 1074 q 517 1000 504 1031 q 531 933 531 969 q 515 872 531 897 q 472 828 499 846 q 410 801 446 811 q 336 789 375 792 z \"},\"ų\":{\"ha\":789,\"x_min\":83,\"x_max\":728,\"o\":\"m 588 -292 q 483 -260 525 -292 q 440 -165 440 -228 q 450 -109 440 -135 q 474 -62 460 -83 q 506 -27 489 -42 q 536 -3 522 -12 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 700 689 l 700 0 q 604 -53 631 -21 q 578 -118 578 -86 q 596 -158 578 -146 q 636 -171 614 -171 q 663 -166 650 -171 q 686 -154 676 -161 l 728 -246 q 660 -279 701 -267 q 588 -292 619 -292 z \"},\"ư\":{\"ha\":789,\"x_min\":83,\"x_max\":843,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 560 689 q 599 695 579 690 q 635 714 619 700 q 662 752 651 728 q 672 817 672 776 q 665 860 672 840 q 651 896 658 881 l 801 961 q 831 905 818 940 q 843 831 843 869 q 801 696 843 746 q 700 626 758 646 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 z \"},\"ứ\":{\"ha\":789,\"x_min\":83,\"x_max\":843,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 560 689 q 599 695 579 690 q 635 714 619 700 q 662 752 651 728 q 672 817 672 776 q 665 860 672 840 q 651 896 658 881 l 801 961 q 831 905 818 940 q 843 831 843 869 q 801 696 843 746 q 700 626 758 646 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 m 394 794 l 294 894 l 508 1147 l 646 1013 l 394 794 z \"},\"ừ\":{\"ha\":789,\"x_min\":83,\"x_max\":843,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 560 689 q 599 695 579 690 q 635 714 619 700 q 662 752 651 728 q 672 817 672 776 q 665 860 672 840 q 651 896 658 881 l 801 961 q 831 905 818 940 q 843 831 843 869 q 801 696 843 746 q 700 626 758 646 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 m 367 794 l 115 1013 l 253 1147 l 467 894 l 367 794 z \"},\"ử\":{\"ha\":789,\"x_min\":83,\"x_max\":843,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 560 689 q 599 695 579 690 q 635 714 619 700 q 662 752 651 728 q 672 817 672 776 q 665 860 672 840 q 651 896 658 881 l 801 961 q 831 905 818 940 q 843 831 843 869 q 801 696 843 746 q 700 626 758 646 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 m 321 789 l 304 869 q 349 885 331 875 q 367 918 367 896 q 342 958 367 943 q 256 976 317 972 l 268 1101 q 383 1087 336 1100 q 460 1052 431 1074 q 502 1000 489 1031 q 515 933 515 969 q 499 872 515 897 q 457 828 483 846 q 395 801 431 811 q 321 789 360 792 z \"},\"ữ\":{\"ha\":789,\"x_min\":83,\"x_max\":843,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 560 689 q 599 695 579 690 q 635 714 619 700 q 662 752 651 728 q 672 817 672 776 q 665 860 672 840 q 651 896 658 881 l 801 961 q 831 905 818 940 q 843 831 843 869 q 801 696 843 746 q 700 626 758 646 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 m 472 796 q 413 810 439 796 q 366 840 388 824 q 327 871 344 857 q 293 885 310 885 q 260 867 272 885 q 244 808 249 849 l 117 815 q 164 975 119 924 q 289 1026 208 1026 q 348 1013 322 1026 q 395 982 374 999 q 434 951 417 965 q 468 938 451 938 q 517 1014 508 938 l 644 1007 q 597 847 642 899 q 472 796 553 796 z \"},\"ự\":{\"ha\":789,\"x_min\":83,\"x_max\":843,\"o\":\"m 297 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 439 175 413 157 q 496 233 465 193 l 496 689 l 560 689 q 599 695 579 690 q 635 714 619 700 q 662 752 651 728 q 672 817 672 776 q 665 860 672 840 q 651 896 658 881 l 801 961 q 831 905 818 940 q 843 831 843 869 q 801 696 843 746 q 700 626 758 646 l 700 0 l 533 0 l 518 96 l 514 96 q 419 13 469 43 q 297 -17 368 -17 m 406 -312 q 324 -283 356 -312 q 293 -206 293 -253 q 324 -128 293 -158 q 406 -99 356 -99 q 487 -128 456 -99 q 518 -206 518 -158 q 487 -283 518 -253 q 406 -312 456 -312 z \"},\"ẁ\":{\"ha\":1078,\"x_min\":33,\"x_max\":1044,\"o\":\"m 206 0 l 33 689 l 236 689 l 303 369 q 318 268 311 318 q 333 165 325 218 l 339 165 q 358 269 349 218 q 379 369 367 321 l 456 689 l 632 689 l 710 369 q 732 268 722 318 q 753 165 742 218 l 758 165 q 774 268 768 218 q 790 369 781 318 l 856 689 l 1044 689 l 879 0 l 640 0 l 578 275 q 558 372 567 324 q 540 476 550 421 l 535 476 q 517 372 525 421 q 500 275 510 324 l 439 0 l 206 0 m 526 794 l 275 1013 l 413 1147 l 626 894 l 526 794 z \"},\"ẃ\":{\"ha\":1078,\"x_min\":33,\"x_max\":1044,\"o\":\"m 206 0 l 33 689 l 236 689 l 303 369 q 318 268 311 318 q 333 165 325 218 l 339 165 q 358 269 349 218 q 379 369 367 321 l 456 689 l 632 689 l 710 369 q 732 268 722 318 q 753 165 742 218 l 758 165 q 774 268 768 218 q 790 369 781 318 l 856 689 l 1044 689 l 879 0 l 640 0 l 578 275 q 558 372 567 324 q 540 476 550 421 l 535 476 q 517 372 525 421 q 500 275 510 324 l 439 0 l 206 0 m 554 794 l 454 894 l 668 1147 l 806 1013 l 554 794 z \"},\"ŵ\":{\"ha\":1078,\"x_min\":33,\"x_max\":1044,\"o\":\"m 206 0 l 33 689 l 236 689 l 303 369 q 318 268 311 318 q 333 165 325 218 l 339 165 q 358 269 349 218 q 379 369 367 321 l 456 689 l 632 689 l 710 369 q 732 268 722 318 q 753 165 742 218 l 758 165 q 774 268 768 218 q 790 369 781 318 l 856 689 l 1044 689 l 879 0 l 640 0 l 578 275 q 558 372 567 324 q 540 476 550 421 l 535 476 q 517 372 525 421 q 500 275 510 324 l 439 0 l 206 0 m 286 851 l 436 1033 l 644 1033 l 794 851 l 717 779 l 543 907 l 538 907 l 364 779 l 286 851 z \"},\"ẅ\":{\"ha\":1078,\"x_min\":33,\"x_max\":1044,\"o\":\"m 206 0 l 33 689 l 236 689 l 303 369 q 318 268 311 318 q 333 165 325 218 l 339 165 q 358 269 349 218 q 379 369 367 321 l 456 689 l 632 689 l 710 369 q 732 268 722 318 q 753 165 742 218 l 758 165 q 774 268 768 218 q 790 369 781 318 l 856 689 l 1044 689 l 879 0 l 640 0 l 578 275 q 558 372 567 324 q 540 476 550 421 l 535 476 q 517 372 525 421 q 500 275 510 324 l 439 0 l 206 0 m 389 790 q 317 819 344 790 q 289 890 289 847 q 317 960 289 932 q 389 989 344 989 q 460 960 433 989 q 488 890 488 932 q 460 819 488 847 q 389 790 433 790 m 692 790 q 620 819 647 790 q 593 890 593 847 q 620 960 593 932 q 692 989 647 989 q 764 960 736 989 q 792 890 792 932 q 764 819 792 847 q 692 790 736 790 z \"},\"ỳ\":{\"ha\":724,\"x_min\":17,\"x_max\":707,\"o\":\"m 167 -269 q 113 -266 135 -269 q 69 -256 90 -262 l 106 -100 q 128 -106 115 -103 q 151 -108 140 -108 q 231 -83 203 -108 q 272 -18 258 -58 l 282 18 l 17 689 l 222 689 l 321 393 q 349 297 336 346 q 375 197 361 249 l 381 197 q 403 295 392 246 q 428 393 415 344 l 511 689 l 707 689 l 468 -7 q 416 -122 443 -72 q 353 -203 389 -171 q 273 -253 318 -236 q 167 -269 228 -269 m 356 794 l 104 1013 l 242 1147 l 456 894 l 356 794 z \"},\"ý\":{\"ha\":724,\"x_min\":17,\"x_max\":707,\"o\":\"m 167 -269 q 113 -266 135 -269 q 69 -256 90 -262 l 106 -100 q 128 -106 115 -103 q 151 -108 140 -108 q 231 -83 203 -108 q 272 -18 258 -58 l 282 18 l 17 689 l 222 689 l 321 393 q 349 297 336 346 q 375 197 361 249 l 381 197 q 403 295 392 246 q 428 393 415 344 l 511 689 l 707 689 l 468 -7 q 416 -122 443 -72 q 353 -203 389 -171 q 273 -253 318 -236 q 167 -269 228 -269 m 383 794 l 283 894 l 497 1147 l 635 1013 l 383 794 z \"},\"ŷ\":{\"ha\":724,\"x_min\":17,\"x_max\":707,\"o\":\"m 167 -269 q 113 -266 135 -269 q 69 -256 90 -262 l 106 -100 q 128 -106 115 -103 q 151 -108 140 -108 q 231 -83 203 -108 q 272 -18 258 -58 l 282 18 l 17 689 l 222 689 l 321 393 q 349 297 336 346 q 375 197 361 249 l 381 197 q 403 295 392 246 q 428 393 415 344 l 511 689 l 707 689 l 468 -7 q 416 -122 443 -72 q 353 -203 389 -171 q 273 -253 318 -236 q 167 -269 228 -269 m 115 851 l 265 1033 l 474 1033 l 624 851 l 546 779 l 372 907 l 367 907 l 193 779 l 115 851 z \"},\"ÿ\":{\"ha\":724,\"x_min\":17,\"x_max\":707,\"o\":\"m 167 -269 q 113 -266 135 -269 q 69 -256 90 -262 l 106 -100 q 128 -106 115 -103 q 151 -108 140 -108 q 231 -83 203 -108 q 272 -18 258 -58 l 282 18 l 17 689 l 222 689 l 321 393 q 349 297 336 346 q 375 197 361 249 l 381 197 q 403 295 392 246 q 428 393 415 344 l 511 689 l 707 689 l 468 -7 q 416 -122 443 -72 q 353 -203 389 -171 q 273 -253 318 -236 q 167 -269 228 -269 m 218 790 q 146 819 174 790 q 118 890 118 847 q 146 960 118 932 q 218 989 174 989 q 290 960 263 989 q 317 890 317 932 q 290 819 317 847 q 218 790 263 790 m 521 790 q 449 819 476 790 q 422 890 422 847 q 449 960 422 932 q 521 989 476 989 q 593 960 565 989 q 621 890 621 932 q 593 819 621 847 q 521 790 565 790 z \"},\"ẏ\":{\"ha\":724,\"x_min\":17,\"x_max\":707,\"o\":\"m 167 -269 q 113 -266 135 -269 q 69 -256 90 -262 l 106 -100 q 128 -106 115 -103 q 151 -108 140 -108 q 231 -83 203 -108 q 272 -18 258 -58 l 282 18 l 17 689 l 222 689 l 321 393 q 349 297 336 346 q 375 197 361 249 l 381 197 q 403 295 392 246 q 428 393 415 344 l 511 689 l 707 689 l 468 -7 q 416 -122 443 -72 q 353 -203 389 -171 q 273 -253 318 -236 q 167 -269 228 -269 m 369 790 q 288 820 319 790 q 257 897 257 850 q 288 974 257 944 q 369 1004 319 1004 q 451 974 419 1004 q 482 897 482 944 q 451 820 482 850 q 369 790 419 790 z \"},\"ỵ\":{\"ha\":724,\"x_min\":17,\"x_max\":732,\"o\":\"m 167 -269 q 113 -266 135 -269 q 69 -256 90 -262 l 106 -100 q 128 -106 115 -103 q 151 -108 140 -108 q 231 -83 203 -108 q 272 -18 258 -58 l 282 18 l 17 689 l 222 689 l 321 393 q 349 297 336 346 q 375 197 361 249 l 381 197 q 403 295 392 246 q 428 393 415 344 l 511 689 l 707 689 l 468 -7 q 416 -122 443 -72 q 353 -203 389 -171 q 273 -253 318 -236 q 167 -269 228 -269 m 619 -301 q 538 -272 569 -301 q 507 -194 507 -242 q 538 -117 507 -147 q 619 -87 569 -87 q 701 -117 669 -87 q 732 -194 732 -147 q 701 -272 732 -242 q 619 -301 669 -301 z \"},\"ỷ\":{\"ha\":724,\"x_min\":17,\"x_max\":707,\"o\":\"m 167 -269 q 113 -266 135 -269 q 69 -256 90 -262 l 106 -100 q 128 -106 115 -103 q 151 -108 140 -108 q 231 -83 203 -108 q 272 -18 258 -58 l 282 18 l 17 689 l 222 689 l 321 393 q 349 297 336 346 q 375 197 361 249 l 381 197 q 403 295 392 246 q 428 393 415 344 l 511 689 l 707 689 l 468 -7 q 416 -122 443 -72 q 353 -203 389 -171 q 273 -253 318 -236 q 167 -269 228 -269 m 310 789 l 293 869 q 338 885 319 875 q 356 918 356 896 q 331 958 356 943 q 244 976 306 972 l 257 1101 q 372 1087 325 1100 q 449 1052 419 1074 q 491 1000 478 1031 q 504 933 504 969 q 488 872 504 897 q 446 828 472 846 q 384 801 419 811 q 310 789 349 792 z \"},\"ỹ\":{\"ha\":724,\"x_min\":17,\"x_max\":707,\"o\":\"m 167 -269 q 113 -266 135 -269 q 69 -256 90 -262 l 106 -100 q 128 -106 115 -103 q 151 -108 140 -108 q 231 -83 203 -108 q 272 -18 258 -58 l 282 18 l 17 689 l 222 689 l 321 393 q 349 297 336 346 q 375 197 361 249 l 381 197 q 403 295 392 246 q 428 393 415 344 l 511 689 l 707 689 l 468 -7 q 416 -122 443 -72 q 353 -203 389 -171 q 273 -253 318 -236 q 167 -269 228 -269 m 461 796 q 402 810 428 796 q 355 840 376 824 q 316 871 333 857 q 282 885 299 885 q 249 867 261 885 q 233 808 238 849 l 106 815 q 153 975 108 924 q 278 1026 197 1026 q 337 1013 311 1026 q 384 982 363 999 q 423 951 406 965 q 457 938 440 938 q 506 1014 497 938 l 633 1007 q 586 847 631 899 q 461 796 542 796 z \"},\"ź\":{\"ha\":639,\"x_min\":53,\"x_max\":606,\"o\":\"m 53 0 l 53 110 l 342 529 l 85 529 l 85 689 l 596 689 l 596 581 l 307 160 l 606 160 l 606 0 l 53 0 m 354 794 l 254 894 l 468 1147 l 606 1013 l 354 794 z \"},\"ž\":{\"ha\":639,\"x_min\":53,\"x_max\":606,\"o\":\"m 53 0 l 53 110 l 342 529 l 85 529 l 85 689 l 596 689 l 596 581 l 307 160 l 606 160 l 606 0 l 53 0 m 236 801 l 86 983 l 164 1056 l 338 928 l 343 928 l 517 1056 l 594 983 l 444 801 l 236 801 z \"},\"ż\":{\"ha\":639,\"x_min\":53,\"x_max\":606,\"o\":\"m 53 0 l 53 110 l 342 529 l 85 529 l 85 689 l 596 689 l 596 581 l 307 160 l 606 160 l 606 0 l 53 0 m 340 790 q 259 820 290 790 q 228 897 228 850 q 259 974 228 944 q 340 1004 290 1004 q 422 974 390 1004 q 453 897 453 944 q 422 820 453 850 q 340 790 390 790 z \"},\"ẓ\":{\"ha\":639,\"x_min\":53,\"x_max\":606,\"o\":\"m 53 0 l 53 110 l 342 529 l 85 529 l 85 689 l 596 689 l 596 581 l 307 160 l 606 160 l 606 0 l 53 0 m 340 -312 q 259 -283 290 -312 q 228 -206 228 -253 q 259 -128 228 -158 q 340 -99 290 -99 q 422 -128 390 -99 q 453 -206 453 -158 q 422 -283 453 -253 q 340 -312 390 -312 z \"},\"ẕ\":{\"ha\":639,\"x_min\":53,\"x_max\":606,\"o\":\"m 53 0 l 53 110 l 342 529 l 85 529 l 85 689 l 596 689 l 596 581 l 307 160 l 606 160 l 606 0 l 53 0 m 135 -260 l 135 -131 l 546 -131 l 546 -260 l 135 -260 z \"},\"ð\":{\"ha\":778,\"x_min\":58,\"x_max\":708,\"o\":\"m 379 -17 q 256 7 314 -17 q 154 74 199 31 q 84 178 110 117 q 58 317 58 240 q 82 450 58 392 q 145 549 106 508 q 235 610 185 589 q 340 632 286 632 q 419 619 381 632 q 488 574 458 606 q 369 758 451 681 l 172 660 l 119 750 l 281 831 q 222 868 253 850 q 156 904 190 886 l 244 1028 q 342 974 293 1003 q 436 910 390 944 l 635 1010 l 688 919 l 521 835 q 656 638 603 751 q 708 369 708 525 q 685 215 708 286 q 620 93 663 144 q 517 13 578 42 q 379 -17 456 -17 m 386 149 q 481 199 444 149 q 518 358 518 250 q 518 390 518 375 q 517 421 518 406 q 451 468 485 456 q 382 481 418 481 q 283 440 321 481 q 244 317 244 400 q 287 192 244 235 q 386 149 329 149 z \"},\"þ\":{\"ha\":796,\"x_min\":90,\"x_max\":742,\"o\":\"m 90 -256 l 90 974 l 294 974 l 294 735 l 289 638 q 369 688 325 669 q 461 706 414 706 q 578 681 526 706 q 667 610 631 656 q 722 499 703 564 q 742 356 742 435 q 717 198 742 267 q 652 81 693 129 q 559 8 611 33 q 451 -17 507 -17 q 363 0 401 -17 q 289 49 325 17 l 294 -54 l 294 -256 l 90 -256 m 404 150 q 494 198 457 150 q 532 353 532 246 q 413 539 532 539 q 294 476 353 539 l 294 194 q 350 160 322 169 q 404 150 378 150 z \"},\"ŋ\":{\"ha\":794,\"x_min\":90,\"x_max\":711,\"o\":\"m 465 -260 q 394 -254 422 -260 q 343 -240 365 -249 l 381 -90 q 433 -99 407 -99 q 491 -72 475 -99 q 507 13 507 -46 l 507 401 q 487 504 507 476 q 422 532 467 532 q 356 515 383 532 q 294 465 328 497 l 294 0 l 90 0 l 90 689 l 257 689 l 271 601 l 276 601 q 374 674 321 643 q 497 706 426 706 q 660 632 610 706 q 711 428 711 558 l 711 18 q 699 -90 711 -39 q 659 -178 688 -140 q 583 -237 631 -215 q 465 -260 536 -260 z \"},\"ȷ\":{\"ha\":386,\"x_min\":-71,\"x_max\":296,\"o\":\"m 50 -272 q -22 -267 7 -272 q -71 -253 -50 -261 l -35 -103 q -8 -110 -21 -107 q 19 -112 4 -112 q 76 -86 60 -112 q 92 -1 92 -60 l 92 689 l 296 689 l 296 4 q 284 -103 296 -53 q 244 -190 272 -153 q 168 -250 215 -228 q 50 -272 121 -272 z \"},\"ĳ\":{\"ha\":769,\"x_min\":74,\"x_max\":696,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 0 l 90 0 m 192 790 q 107 820 140 790 q 74 897 74 850 q 107 974 74 944 q 192 1003 140 1003 q 277 974 244 1003 q 310 897 310 944 q 277 820 310 850 q 192 790 244 790 m 433 -272 q 362 -267 390 -272 q 313 -253 333 -261 l 349 -103 q 375 -110 363 -107 q 403 -112 388 -112 q 459 -86 443 -112 q 475 -1 475 -60 l 475 689 l 679 689 l 679 4 q 667 -103 679 -53 q 627 -190 656 -153 q 551 -250 599 -228 q 433 -272 504 -272 m 578 790 q 493 820 526 790 q 460 897 460 850 q 493 974 460 944 q 578 1003 526 1003 q 663 974 629 1003 q 696 897 696 944 q 663 820 696 850 q 578 790 629 790 z \"},\"ɐ\":{\"ha\":742,\"x_min\":81,\"x_max\":674,\"o\":\"m 385 -17 q 159 63 238 -17 q 81 303 81 143 l 81 689 l 247 689 l 263 604 l 268 604 q 363 678 308 650 q 486 706 417 706 q 624 652 575 706 q 674 517 674 599 q 582 335 674 406 q 285 243 490 265 q 319 172 289 199 q 415 146 349 146 q 501 163 460 146 q 593 208 543 181 l 665 74 q 532 8 603 33 q 385 -17 461 -17 m 285 368 q 436 414 394 383 q 478 485 478 444 q 458 532 478 517 q 408 547 439 547 q 344 528 374 547 q 285 475 314 510 l 285 368 z \"},\"ɒ\":{\"ha\":796,\"x_min\":90,\"x_max\":742,\"o\":\"m 451 -17 q 360 3 407 -17 q 272 68 314 24 l 267 68 l 250 0 l 90 0 l 90 689 l 257 689 l 271 621 l 276 621 q 367 681 317 657 q 472 706 418 706 q 585 681 535 706 q 669 610 635 656 q 723 499 704 564 q 742 356 742 435 q 717 198 742 267 q 652 81 693 129 q 559 8 611 33 q 451 -17 507 -17 m 404 150 q 494 198 457 150 q 532 353 532 246 q 413 539 532 539 q 294 476 353 539 l 294 194 q 350 160 322 169 q 404 150 378 150 z \"},\"ɓ\":{\"ha\":796,\"x_min\":90,\"x_max\":742,\"o\":\"m 451 -17 q 359 6 406 -17 q 272 72 313 28 l 267 72 l 250 0 l 90 0 l 90 694 q 106 808 90 754 q 154 902 121 861 q 242 967 188 943 q 374 990 296 990 q 452 982 417 990 q 511 965 488 974 l 474 815 q 438 826 457 822 q 403 829 419 829 q 324 799 350 829 q 292 700 297 769 l 289 607 q 376 663 329 642 q 471 683 422 683 q 583 659 533 683 q 669 591 633 635 q 723 484 704 547 q 742 344 742 421 q 717 191 742 258 q 652 78 693 124 q 559 8 611 32 q 451 -17 507 -17 m 404 150 q 494 195 457 150 q 532 342 532 240 q 413 515 532 515 q 352 501 381 515 q 294 454 324 486 l 294 194 q 350 160 322 169 q 404 150 378 150 z \"},\"ɔ\":{\"ha\":649,\"x_min\":32,\"x_max\":600,\"o\":\"m 258 -17 q 142 2 201 -17 q 32 65 82 21 l 111 199 q 170 163 139 178 q 236 149 201 149 q 347 201 303 149 q 390 344 390 254 q 349 488 390 435 q 243 540 307 540 q 185 531 208 540 q 136 500 161 522 l 39 632 q 136 685 79 664 q 267 706 193 706 q 394 682 333 706 q 500 613 454 658 q 573 499 546 567 q 600 344 600 432 q 574 191 600 258 q 501 78 547 124 q 392 8 454 32 q 258 -17 329 -17 z \"},\"ɕ\":{\"ha\":649,\"x_min\":32,\"x_max\":636,\"o\":\"m 408 139 q 465 156 444 139 q 485 196 485 172 q 472 228 485 213 q 432 243 460 243 q 321 169 379 243 q 408 139 360 139 m 190 -101 l 32 -32 q 69 53 50 13 q 110 129 88 93 q 66 226 82 172 q 50 344 50 279 q 79 498 50 431 q 158 611 108 565 q 272 681 207 657 q 408 706 338 706 q 522 685 472 706 q 610 632 571 664 l 521 510 q 421 550 472 550 q 294 495 342 550 q 247 344 247 440 q 251 299 247 319 q 449 378 347 378 q 586 329 536 378 q 636 196 636 281 q 620 113 636 151 q 574 45 604 74 q 500 0 543 17 q 401 -17 457 -17 q 235 19 310 -17 q 212 -38 222 -8 q 190 -101 201 -68 z \"},\"ɖ\":{\"ha\":796,\"x_min\":54,\"x_max\":842,\"o\":\"m 733 -260 q 633 -242 675 -260 q 563 -197 590 -225 q 522 -130 535 -168 q 508 -50 508 -92 l 510 60 q 429 5 474 26 q 336 -17 385 -17 q 220 8 272 -17 q 131 80 168 33 q 74 193 94 126 q 54 344 54 260 q 78 496 54 429 q 142 609 103 563 q 234 681 182 656 q 340 706 286 706 q 436 686 399 706 q 510 633 474 667 l 501 739 l 501 990 l 706 990 l 706 -1 q 719 -76 706 -53 q 765 -99 732 -99 q 806 -90 785 -99 l 842 -240 q 797 -254 822 -249 q 733 -260 772 -260 m 389 150 q 449 164 422 150 q 501 213 476 178 l 501 494 q 444 529 474 519 q 388 539 415 539 q 301 492 339 539 q 264 347 264 446 q 297 197 264 244 q 389 150 329 150 z \"},\"ɗ\":{\"ha\":796,\"x_min\":54,\"x_max\":843,\"o\":\"m 336 -17 q 220 8 272 -17 q 131 80 168 33 q 74 193 94 126 q 54 344 54 260 q 78 496 54 429 q 142 609 103 563 q 234 681 182 656 q 340 706 286 706 q 436 686 399 706 q 510 633 474 667 l 508 747 q 521 842 508 797 q 562 919 533 886 q 636 971 590 951 q 747 990 682 990 q 803 987 781 990 q 843 976 825 983 l 807 826 q 779 831 792 831 q 722 806 739 831 q 706 731 706 782 l 706 0 l 539 0 l 525 68 l 519 68 q 435 8 483 32 q 336 -17 386 -17 m 389 150 q 449 164 422 150 q 501 213 476 178 l 501 494 q 444 529 474 519 q 388 539 415 539 q 301 492 339 539 q 264 347 264 446 q 297 197 264 244 q 389 150 329 150 z \"},\"ɘ\":{\"ha\":719,\"x_min\":50,\"x_max\":669,\"o\":\"m 326 -17 q 197 4 264 -17 q 76 61 129 25 l 143 185 q 299 139 218 139 q 413 174 369 139 q 471 285 457 210 l 58 285 q 53 322 56 297 q 50 375 50 347 q 70 506 50 446 q 130 611 90 567 q 227 681 169 656 q 358 706 285 706 q 477 681 421 706 q 576 609 533 656 q 644 495 619 563 q 669 344 669 428 q 644 192 669 258 q 572 78 618 125 q 463 8 526 32 q 326 -17 400 -17 m 225 419 l 474 419 q 433 518 465 486 q 351 550 401 550 q 257 514 289 550 q 225 419 225 478 z \"},\"ɑ\":{\"ha\":796,\"x_min\":54,\"x_max\":706,\"o\":\"m 336 -17 q 220 8 272 -17 q 131 80 168 33 q 74 193 94 126 q 54 344 54 260 q 79 496 54 429 q 145 609 104 563 q 238 681 186 656 q 344 706 290 706 q 440 685 397 706 q 524 621 483 665 l 529 621 l 546 689 l 706 689 l 706 0 l 539 0 l 525 68 l 519 68 q 435 8 483 32 q 336 -17 386 -17 m 389 150 q 449 164 422 150 q 501 213 476 178 l 501 494 q 444 529 474 519 q 388 539 415 539 q 301 492 339 539 q 264 347 264 446 q 297 197 264 244 q 389 150 329 150 z \"},\"ʙ\":{\"ha\":733,\"x_min\":90,\"x_max\":686,\"o\":\"m 90 0 l 90 689 l 383 689 q 492 680 442 689 q 579 649 542 671 q 638 593 617 628 q 660 507 660 558 q 633 422 660 463 q 544 365 607 382 l 544 360 q 648 307 610 344 q 686 199 686 269 q 663 108 686 146 q 601 46 640 69 q 510 11 563 22 q 400 0 458 0 l 90 0 m 289 419 l 369 419 q 443 437 421 419 q 465 486 465 454 q 444 536 465 518 q 371 554 422 554 l 289 554 l 289 419 m 289 135 l 388 135 q 466 156 443 135 q 489 213 489 178 q 465 264 489 243 q 386 285 440 285 l 289 285 l 289 135 z \"},\"ə\":{\"ha\":719,\"x_min\":50,\"x_max\":669,\"o\":\"m 346 -17 q 217 8 272 -17 q 124 78 161 33 q 69 185 88 124 q 50 317 50 246 q 53 369 50 344 q 58 407 56 394 l 471 407 q 419 515 460 481 q 313 550 378 550 q 163 504 236 550 l 94 636 q 217 690 151 674 q 347 706 282 706 q 474 681 415 706 q 576 609 533 656 q 644 496 619 563 q 669 344 669 429 q 643 194 669 261 q 572 80 617 126 q 469 8 528 33 q 346 -17 410 -17 m 342 139 q 427 170 392 139 q 474 272 463 201 l 225 272 q 252 176 225 213 q 342 139 279 139 z \"},\"ɚ\":{\"ha\":982,\"x_min\":50,\"x_max\":1010,\"o\":\"m 361 -17 q 225 10 282 -17 q 131 80 168 36 q 74 181 93 124 q 50 301 54 239 l 451 472 q 397 531 432 513 q 311 550 361 550 q 235 538 271 550 q 163 504 199 526 l 94 636 q 217 690 153 674 q 339 706 281 706 q 510 663 439 706 q 622 544 582 619 l 751 600 l 849 564 q 865 458 850 486 q 913 431 881 431 q 943 435 929 431 q 968 446 957 439 l 1010 349 q 963 324 989 335 q 904 314 936 314 q 854 319 879 314 q 807 340 829 325 q 766 381 785 356 q 736 449 747 407 l 663 417 q 667 376 665 397 q 669 332 669 354 q 647 196 669 260 q 584 85 625 132 q 486 10 543 38 q 361 -17 429 -17 m 354 136 q 445 185 410 136 q 481 314 481 235 l 481 338 l 232 231 q 276 161 243 186 q 354 136 308 136 z \"},\"ɛ\":{\"ha\":642,\"x_min\":64,\"x_max\":615,\"o\":\"m 374 -17 q 259 -3 315 -17 q 160 38 203 11 q 90 103 117 64 q 64 196 64 143 q 104 306 64 267 q 208 361 144 346 l 208 367 q 123 426 150 385 q 96 508 96 467 q 119 597 96 560 q 181 658 142 635 q 270 694 219 682 q 376 706 321 706 q 597 643 494 706 l 522 511 q 456 540 488 531 q 388 550 425 550 q 320 531 344 550 q 296 481 296 513 q 392 419 296 419 l 486 419 l 486 285 l 369 285 q 290 269 315 285 q 264 217 264 253 q 300 160 264 181 q 393 139 336 139 q 461 149 425 139 q 535 182 497 158 l 615 53 q 496 -2 553 13 q 374 -17 439 -17 z \"},\"ɜ\":{\"ha\":661,\"x_min\":46,\"x_max\":597,\"o\":\"m 300 -17 q 172 -2 232 -17 q 46 53 113 13 l 126 182 q 200 149 164 158 q 268 139 236 139 q 362 160 326 139 q 397 217 397 181 q 372 269 397 253 q 292 285 346 285 l 176 285 l 176 419 l 269 419 q 365 481 365 419 q 342 531 365 513 q 275 550 319 550 q 206 540 238 550 q 139 511 174 531 l 64 643 q 299 706 172 706 q 401 694 353 706 q 485 658 449 682 q 544 597 522 635 q 565 508 565 560 q 538 426 565 467 q 453 367 511 385 l 453 361 q 557 306 517 346 q 597 196 597 267 q 572 103 597 143 q 506 38 547 64 q 410 -3 464 11 q 300 -17 357 -17 z \"},\"ɞ\":{\"ha\":786,\"x_min\":64,\"x_max\":739,\"o\":\"m 375 -17 q 259 -3 315 -17 q 160 38 203 11 q 90 103 117 64 q 64 196 64 143 q 104 306 64 267 q 208 361 144 346 l 208 367 q 123 426 150 385 q 96 508 96 467 q 118 597 96 560 q 179 658 140 635 q 268 694 218 682 q 375 706 318 706 q 512 683 446 706 q 628 616 578 661 q 709 503 679 571 q 739 344 739 435 q 710 186 739 254 q 632 73 682 118 q 516 6 582 28 q 375 -17 450 -17 m 375 139 q 490 188 450 139 q 529 344 529 236 q 491 501 529 453 q 381 550 453 550 q 320 531 344 550 q 296 481 296 513 q 381 419 296 419 l 424 419 l 424 285 l 358 285 q 287 269 310 285 q 264 217 264 253 q 295 160 264 181 q 375 139 326 139 z \"},\"ɟ\":{\"ha\":446,\"x_min\":-43,\"x_max\":422,\"o\":\"m 78 -272 q 6 -267 35 -272 q -43 -253 -22 -261 l -7 -103 q 19 -110 7 -107 q 47 -112 32 -112 q 103 -86 88 -112 q 119 -1 119 -60 l 119 310 l 17 310 l 17 400 l 119 408 l 119 689 l 324 689 l 324 408 l 422 408 l 422 310 l 324 310 l 324 4 q 312 -103 324 -53 q 272 -190 300 -153 q 196 -250 243 -228 q 78 -272 149 -272 z \"},\"ɠ\":{\"ha\":810,\"x_min\":61,\"x_max\":850,\"o\":\"m 363 -269 q 235 -251 306 -269 q 106 -193 165 -232 l 172 -58 q 271 -98 221 -86 q 363 -110 321 -110 q 471 -78 439 -110 q 508 1 503 -47 l 514 88 q 435 37 479 56 q 343 18 392 18 q 227 43 279 18 q 138 113 175 68 q 81 220 101 158 q 61 357 61 282 q 86 501 61 436 q 152 610 111 565 q 245 681 193 656 q 351 706 297 706 q 441 686 404 706 q 514 633 478 667 l 514 681 q 526 763 514 722 q 567 835 539 803 q 642 888 596 868 q 754 907 688 907 q 810 903 788 907 q 850 893 832 900 l 814 742 q 786 747 803 747 q 729 722 746 747 q 713 647 713 696 l 713 7 q 622 -199 713 -128 q 363 -269 531 -269 m 396 182 q 455 197 429 182 q 508 247 481 211 l 508 494 q 451 529 481 519 q 394 539 422 539 q 306 493 343 539 q 268 360 268 447 q 302 228 268 274 q 396 182 336 182 z \"},\"ɡ\":{\"ha\":810,\"x_min\":61,\"x_max\":713,\"o\":\"m 363 -269 q 235 -251 306 -269 q 106 -193 165 -232 l 172 -58 q 271 -98 221 -86 q 363 -110 321 -110 q 471 -78 439 -110 q 508 1 503 -47 l 514 88 q 435 37 479 56 q 343 18 392 18 q 227 43 279 18 q 138 113 175 68 q 81 220 101 158 q 61 357 61 282 q 86 501 61 436 q 152 610 111 565 q 245 681 193 656 q 351 706 297 706 q 447 687 404 706 q 528 625 489 668 l 533 625 l 549 689 l 713 689 l 713 7 q 622 -199 713 -128 q 363 -269 531 -269 m 396 182 q 455 197 429 182 q 508 247 481 211 l 508 494 q 451 529 481 519 q 394 539 422 539 q 306 493 343 539 q 268 360 268 447 q 302 228 268 274 q 396 182 336 182 z \"},\"ɢ\":{\"ha\":718,\"x_min\":50,\"x_max\":660,\"o\":\"m 400 -17 q 269 5 332 -17 q 157 71 206 26 q 79 183 108 115 q 50 342 50 250 q 80 497 50 429 q 159 611 110 565 q 272 681 208 657 q 404 706 336 706 q 544 681 490 706 q 643 622 599 657 l 551 500 q 492 536 519 522 q 418 550 465 550 q 358 538 388 550 q 307 500 329 525 q 271 435 285 475 q 257 342 257 396 q 301 192 257 244 q 415 139 344 139 q 486 158 458 139 l 486 276 l 369 276 l 369 413 l 660 413 l 660 74 q 549 9 617 35 q 400 -17 481 -17 z \"},\"ɣ\":{\"ha\":726,\"x_min\":17,\"x_max\":710,\"o\":\"m 368 -293 q 213 -238 271 -293 q 154 -92 154 -183 q 160 -42 154 -65 q 176 7 165 -18 q 201 60 186 32 q 235 121 215 88 l 17 689 l 222 689 l 311 400 q 338 319 325 356 q 365 236 351 283 l 371 236 q 397 319 383 283 q 424 400 410 356 l 514 689 l 710 689 l 500 122 q 534 60 519 89 q 559 7 549 32 q 575 -42 569 -18 q 581 -92 581 -65 q 523 -238 581 -183 q 368 -293 465 -293 m 368 -165 q 402 -149 389 -165 q 415 -106 415 -133 q 404 -43 415 -76 q 369 35 393 -10 l 363 35 q 331 -44 340 -10 q 321 -106 321 -78 q 333 -149 321 -133 q 368 -165 346 -165 z \"},\"ɤ\":{\"ha\":790,\"x_min\":22,\"x_max\":768,\"o\":\"m 396 -17 q 196 48 269 -17 q 122 236 122 113 q 158 361 122 297 q 257 483 194 425 q 203 527 232 514 q 144 540 174 540 q 81 521 104 540 l 22 669 q 89 697 46 688 q 172 706 132 706 q 288 680 229 706 q 396 596 346 654 q 503 680 444 654 q 618 706 561 706 q 702 697 660 706 q 768 669 744 688 l 711 521 q 646 540 685 540 q 588 527 617 540 q 533 483 558 514 q 633 361 596 425 q 669 236 669 297 q 595 48 669 113 q 396 -17 521 -17 m 396 149 q 457 174 436 149 q 478 242 478 200 q 455 317 478 278 q 396 392 432 357 q 335 317 358 357 q 313 242 313 278 q 334 174 313 200 q 396 149 356 149 z \"},\"ɥ\":{\"ha\":794,\"x_min\":83,\"x_max\":704,\"o\":\"m 500 -256 l 500 -46 l 510 85 q 419 13 471 43 q 297 -17 368 -17 q 134 57 185 -17 q 83 261 83 131 l 83 689 l 288 689 l 288 288 q 308 185 288 213 q 374 157 329 157 q 441 174 413 157 q 500 233 469 192 l 500 689 l 704 689 l 704 -256 l 500 -256 z \"},\"ɦ\":{\"ha\":793,\"x_min\":90,\"x_max\":711,\"o\":\"m 90 0 l 90 694 q 106 808 90 754 q 154 902 121 861 q 242 967 188 943 q 374 990 296 990 q 452 982 417 990 q 511 965 488 974 l 474 815 q 438 826 457 822 q 403 829 419 829 q 324 799 350 829 q 292 700 297 769 l 285 588 q 326 622 304 606 q 375 653 349 639 q 432 675 401 667 q 497 683 463 683 q 660 610 610 683 q 711 406 711 536 l 711 0 l 507 0 l 507 379 q 487 481 507 454 q 422 508 467 508 q 356 491 383 508 q 294 442 328 474 l 294 0 l 90 0 z \"},\"ɧ\":{\"ha\":793,\"x_min\":90,\"x_max\":711,\"o\":\"m 465 -260 q 394 -254 422 -260 q 343 -240 365 -249 l 381 -90 q 433 -99 407 -99 q 491 -72 475 -99 q 507 13 507 -46 l 507 379 q 487 481 507 454 q 422 508 467 508 q 356 491 383 508 q 294 442 328 474 l 294 0 l 90 0 l 90 694 q 106 808 90 754 q 154 902 121 861 q 242 967 188 943 q 374 990 296 990 q 452 982 417 990 q 511 965 488 974 l 474 815 q 438 826 457 822 q 403 829 419 829 q 324 799 350 829 q 292 700 297 769 l 285 588 q 326 622 304 606 q 375 653 349 639 q 432 675 401 667 q 497 683 463 683 q 660 610 610 683 q 711 406 711 536 l 711 18 q 699 -90 711 -39 q 659 -178 688 -140 q 583 -237 631 -215 q 465 -260 536 -260 z \"},\"ʜ\":{\"ha\":808,\"x_min\":93,\"x_max\":722,\"o\":\"m 93 0 l 93 689 l 297 689 l 297 440 l 518 440 l 518 689 l 722 689 l 722 0 l 518 0 l 518 263 l 297 263 l 297 0 l 93 0 z \"},\"ɨ\":{\"ha\":446,\"x_min\":17,\"x_max\":422,\"o\":\"m 17 310 l 17 400 l 121 408 l 121 689 l 325 689 l 325 408 l 422 408 l 422 310 l 325 310 l 325 0 l 121 0 l 121 310 l 17 310 m 222 790 q 138 820 171 790 q 104 897 104 850 q 138 974 104 944 q 222 1003 171 1003 q 308 974 275 1003 q 340 897 340 944 q 308 820 340 850 q 222 790 275 790 z \"},\"ɪ\":{\"ha\":549,\"x_min\":72,\"x_max\":476,\"o\":\"m 72 0 l 72 160 l 172 160 l 172 529 l 72 529 l 72 689 l 476 689 l 476 529 l 376 529 l 376 160 l 476 160 l 476 0 l 72 0 z \"},\"ʝ\":{\"ha\":500,\"x_min\":-71,\"x_max\":579,\"o\":\"m 422 -357 q 382 -269 403 -310 q 338 -193 361 -229 q 256 -251 304 -229 q 143 -272 207 -272 q 53 -256 93 -272 q -14 -212 14 -240 q -56 -147 -42 -185 q -71 -67 -71 -110 q -16 67 -71 17 q 139 118 39 118 q 207 107 169 118 l 207 689 l 411 689 l 411 17 q 410 -5 411 6 q 408 -26 410 -15 q 500 -140 457 -75 q 579 -286 543 -204 l 422 -357 m 138 -117 q 184 -97 168 -117 q 206 -44 200 -78 q 136 -17 165 -17 q 97 -30 111 -17 q 82 -62 82 -43 q 96 -100 82 -83 q 138 -117 110 -117 m 308 790 q 224 820 257 790 q 190 897 190 850 q 224 974 190 944 q 308 1003 257 1003 q 394 974 361 1003 q 428 897 428 944 q 394 820 428 850 q 308 790 361 790 z \"},\"ɬ\":{\"ha\":524,\"x_min\":-14,\"x_max\":503,\"o\":\"m 190 406 q 35 447 83 406 q -14 550 -14 489 q 26 647 -14 608 q 128 686 65 686 q 169 681 151 686 q 201 665 186 675 l 201 974 l 406 974 l 406 504 l 503 504 l 503 406 l 406 406 l 406 206 q 417 161 406 174 q 442 149 429 149 q 453 149 449 149 q 467 151 458 149 l 492 0 q 449 -12 475 -7 q 389 -17 424 -17 q 300 0 336 -17 q 242 47 264 17 q 211 119 221 76 q 201 214 201 161 l 201 406 l 190 406 m 171 504 l 201 504 l 201 507 q 199 533 201 518 q 188 560 196 547 q 168 581 181 572 q 136 590 156 590 q 104 579 114 590 q 94 550 94 568 q 113 517 94 531 q 171 504 131 504 z \"},\"ɭ\":{\"ha\":397,\"x_min\":90,\"x_max\":429,\"o\":\"m 322 -260 q 211 -239 256 -260 q 140 -181 167 -218 q 101 -97 113 -144 q 90 6 90 -49 l 90 974 l 294 974 l 294 -1 q 308 -76 294 -53 q 354 -99 321 -99 q 393 -90 372 -99 l 429 -240 q 385 -254 410 -249 q 322 -260 360 -260 z \"},\"ɮ\":{\"ha\":889,\"x_min\":90,\"x_max\":858,\"o\":\"m 542 -272 q 374 -239 443 -272 q 256 -160 304 -206 l 347 -33 q 424 -85 382 -64 q 518 -107 465 -107 q 616 -69 578 -107 q 654 40 654 -31 q 618 136 654 103 q 521 169 582 169 q 478 166 493 169 q 439 153 463 163 l 372 251 l 583 529 l 294 529 l 294 0 l 90 0 l 90 974 l 294 974 l 294 689 l 826 689 l 826 581 l 619 308 q 721 283 676 304 q 796 226 765 261 q 842 145 826 192 q 858 44 858 99 q 833 -91 858 -32 q 764 -190 807 -150 q 663 -251 721 -231 q 542 -272 606 -272 z \"},\"ʟ\":{\"ha\":600,\"x_min\":90,\"x_max\":564,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 160 l 564 160 l 564 0 l 90 0 z \"},\"ɯ\":{\"ha\":1190,\"x_min\":88,\"x_max\":1106,\"o\":\"m 303 -17 q 140 58 192 -17 q 88 261 88 132 l 88 689 l 292 689 l 292 288 q 313 185 292 213 q 378 157 333 157 q 494 224 429 157 l 494 689 l 699 689 l 699 288 q 719 185 699 213 q 783 157 740 157 q 901 224 835 157 l 901 689 l 1106 689 l 1106 0 l 939 0 l 924 89 l 919 89 q 827 15 876 46 q 710 -17 778 -17 q 591 13 636 -17 q 519 100 546 43 q 424 17 475 51 q 303 -17 372 -17 z \"},\"ɰ\":{\"ha\":1190,\"x_min\":88,\"x_max\":1106,\"o\":\"m 901 -256 l 901 -46 l 911 83 q 818 9 864 35 q 710 -17 772 -17 q 591 13 636 -17 q 519 100 546 43 q 424 17 475 51 q 303 -17 372 -17 q 140 58 192 -17 q 88 261 88 132 l 88 689 l 292 689 l 292 288 q 313 185 292 213 q 378 157 333 157 q 494 224 429 157 l 494 689 l 699 689 l 699 288 q 719 185 699 213 q 783 157 740 157 q 901 224 835 157 l 901 689 l 1106 689 l 1106 -256 l 901 -256 z \"},\"ɱ\":{\"ha\":1190,\"x_min\":90,\"x_max\":1107,\"o\":\"m 872 -260 q 808 -254 835 -260 q 763 -240 782 -249 l 799 -90 q 842 -99 819 -99 q 890 -72 878 -99 q 903 13 903 -46 l 903 401 q 883 504 903 476 q 818 532 863 532 q 700 465 767 532 l 700 0 l 496 0 l 496 401 q 476 504 496 476 q 411 532 456 532 q 294 465 358 532 l 294 0 l 90 0 l 90 689 l 257 689 l 271 600 l 276 600 q 368 674 319 643 q 485 706 417 706 q 603 676 558 706 q 675 590 649 646 q 772 672 721 638 q 892 706 822 706 q 1055 631 1003 706 q 1107 428 1107 557 l 1107 18 q 1095 -90 1107 -39 q 1056 -178 1083 -140 q 984 -237 1029 -215 q 872 -260 939 -260 z \"},\"ɲ\":{\"ha\":794,\"x_min\":-46,\"x_max\":711,\"o\":\"m 63 -260 q -1 -254 24 -260 q -46 -240 -26 -249 l -10 -90 q 31 -99 11 -99 q 77 -76 64 -99 q 90 -1 90 -53 l 90 689 l 257 689 l 271 601 l 276 601 q 374 674 321 643 q 497 706 426 706 q 660 632 610 706 q 711 428 711 558 l 711 0 l 507 0 l 507 401 q 487 504 507 476 q 422 532 467 532 q 356 515 383 532 q 294 465 328 497 l 294 6 q 283 -97 294 -49 q 245 -181 272 -144 q 174 -239 218 -218 q 63 -260 129 -260 z \"},\"ɳ\":{\"ha\":794,\"x_min\":90,\"x_max\":847,\"o\":\"m 739 -260 q 628 -239 672 -260 q 556 -181 583 -218 q 518 -97 529 -144 q 507 6 507 -49 l 507 401 q 487 504 507 476 q 422 532 467 532 q 356 515 383 532 q 294 465 328 497 l 294 0 l 90 0 l 90 689 l 257 689 l 271 601 l 276 601 q 374 674 321 643 q 497 706 426 706 q 660 632 610 706 q 711 428 711 558 l 711 -1 q 724 -76 711 -53 q 771 -99 738 -99 q 811 -90 790 -99 l 847 -240 q 803 -254 828 -249 q 739 -260 778 -260 z \"},\"ɴ\":{\"ha\":779,\"x_min\":90,\"x_max\":689,\"o\":\"m 90 0 l 90 689 l 278 689 l 442 399 q 476 326 457 368 q 511 254 496 285 l 515 254 q 504 381 510 317 q 499 497 499 446 l 499 689 l 689 689 l 689 0 l 501 0 l 336 290 q 302 362 321 321 q 268 435 283 403 l 263 435 q 275 308 269 371 q 281 192 281 244 l 281 0 l 90 0 z \"},\"ɵ\":{\"ha\":771,\"x_min\":50,\"x_max\":721,\"o\":\"m 386 -17 q 258 6 319 -17 q 151 75 197 29 q 78 188 106 121 q 50 344 50 256 q 78 501 50 433 q 151 614 106 568 q 258 683 197 660 q 386 706 319 706 q 513 683 453 706 q 619 614 574 660 q 693 501 665 568 q 721 344 721 433 q 693 188 721 256 q 619 75 665 121 q 513 6 574 29 q 386 -17 453 -17 m 386 554 q 247 419 272 554 l 524 419 q 386 554 499 554 m 386 136 q 480 174 444 136 q 526 285 515 211 l 244 285 q 292 174 256 211 q 386 136 328 136 z \"},\"ɶ\":{\"ha\":1008,\"x_min\":50,\"x_max\":972,\"o\":\"m 404 -17 q 274 5 338 -17 q 160 71 210 26 q 80 183 110 115 q 50 343 50 251 q 80 501 50 433 q 160 615 110 569 q 274 683 210 660 q 404 706 338 706 q 478 702 444 706 q 564 689 513 699 l 958 689 l 958 540 l 674 540 l 674 419 l 915 419 l 915 285 l 674 285 l 674 146 l 972 146 l 972 0 l 564 0 q 480 -14 515 -11 q 404 -17 444 -17 m 414 144 q 474 153 442 144 l 474 533 q 414 542 442 542 q 357 531 385 542 q 308 496 329 519 q 273 435 286 472 q 260 343 260 397 q 273 248 260 286 q 308 187 286 210 q 357 154 329 164 q 414 144 385 144 z \"},\"ɸ\":{\"ha\":1025,\"x_min\":50,\"x_max\":975,\"o\":\"m 260 344 q 303 197 260 249 q 419 142 346 146 l 419 547 q 303 492 346 543 q 260 344 260 440 m 765 344 q 723 492 765 440 q 606 547 681 543 l 606 142 q 722 197 679 146 q 765 344 765 249 m 419 -256 l 419 -11 q 281 17 347 -7 q 163 87 214 42 q 81 197 111 132 q 50 344 50 261 q 81 492 50 428 q 163 602 111 557 q 281 672 214 647 q 419 700 347 696 l 419 974 l 606 974 l 606 700 q 744 672 678 696 q 863 602 811 647 q 944 492 914 557 q 975 344 975 428 q 944 197 975 261 q 863 87 914 132 q 744 17 811 42 q 606 -11 678 -7 l 606 -256 l 419 -256 z \"},\"ɹ\":{\"ha\":553,\"x_min\":-1,\"x_max\":464,\"o\":\"m 81 -17 q 33 -13 51 -17 q -1 -3 14 -10 l 33 174 q 68 166 51 169 q 107 163 85 163 q 190 191 147 163 q 260 290 232 219 l 260 689 l 464 689 l 464 0 l 297 0 l 282 121 l 276 121 q 186 17 239 50 q 81 -17 133 -17 z \"},\"ɺ\":{\"ha\":553,\"x_min\":-1,\"x_max\":464,\"o\":\"m 81 -17 q 33 -13 51 -17 q -1 -3 14 -10 l 33 174 q 68 166 51 169 q 107 163 85 163 q 190 191 147 163 q 260 290 232 219 l 260 974 l 464 974 l 464 0 l 297 0 l 282 121 l 276 121 q 186 17 239 50 q 81 -17 133 -17 z \"},\"ɻ\":{\"ha\":553,\"x_min\":-1,\"x_max\":599,\"o\":\"m 492 -260 q 392 -241 432 -260 q 327 -190 351 -222 q 292 -115 303 -157 q 282 -25 282 -72 l 282 121 l 276 121 q 186 17 239 50 q 81 -17 133 -17 q 33 -13 51 -17 q -1 -3 14 -10 l 33 174 q 68 166 51 169 q 107 163 85 163 q 190 191 147 163 q 260 290 232 219 l 260 689 l 464 689 l 464 -1 q 477 -76 464 -53 q 522 -99 490 -99 q 563 -90 542 -99 l 599 -240 q 554 -254 579 -249 q 492 -260 529 -260 z \"},\"ɽ\":{\"ha\":553,\"x_min\":90,\"x_max\":554,\"o\":\"m 322 -260 q 211 -239 256 -260 q 140 -181 167 -218 q 101 -97 113 -144 q 90 6 90 -49 l 90 689 l 257 689 l 271 568 l 276 568 q 367 672 314 639 q 472 706 419 706 q 520 702 501 706 q 554 692 539 699 l 521 515 q 485 524 501 521 q 446 526 468 526 q 365 499 407 526 q 294 400 322 471 l 294 -1 q 308 -76 294 -53 q 354 -99 321 -99 q 393 -90 372 -99 l 429 -240 q 385 -254 410 -249 q 322 -260 360 -260 z \"},\"ɾ\":{\"ha\":528,\"x_min\":90,\"x_max\":529,\"o\":\"m 90 0 l 90 422 q 106 532 90 481 q 157 622 122 583 q 245 683 192 661 q 374 706 299 706 q 464 700 425 706 q 529 686 503 694 l 497 515 q 451 526 468 524 q 403 529 433 529 q 366 522 385 529 q 331 496 347 514 q 305 449 315 478 q 294 378 294 419 l 294 0 l 90 0 z \"},\"ʀ\":{\"ha\":739,\"x_min\":90,\"x_max\":718,\"o\":\"m 90 0 l 90 689 l 374 689 q 485 678 433 689 q 575 640 536 667 q 636 569 614 613 q 658 461 658 525 q 627 343 658 390 q 547 268 596 296 l 718 0 l 492 0 l 368 225 l 294 225 l 294 0 l 90 0 m 294 363 l 349 363 q 430 388 403 363 q 457 456 457 414 q 349 539 457 539 l 294 539 l 294 363 z \"},\"ʁ\":{\"ha\":739,\"x_min\":21,\"x_max\":649,\"o\":\"m 365 0 q 253 12 306 0 q 163 50 201 24 q 103 120 125 76 q 81 229 81 164 q 112 347 81 300 q 192 422 143 394 l 21 689 l 247 689 l 371 465 l 444 465 l 444 689 l 649 689 l 649 0 l 365 0 m 390 150 l 444 150 l 444 328 l 390 328 q 309 301 336 328 q 282 235 282 275 q 390 150 282 150 z \"},\"ʂ\":{\"ha\":615,\"x_min\":29,\"x_max\":576,\"o\":\"m 293 -17 q 208 -8 251 -17 q 283 -104 214 -104 q 310 -101 299 -104 q 338 -94 322 -99 l 374 -240 q 324 -254 353 -249 q 251 -260 296 -260 q 145 -237 188 -260 q 77 -178 103 -215 q 40 -90 51 -140 q 29 18 29 -39 l 29 72 l 121 200 q 211 150 168 165 q 299 135 254 135 q 365 150 344 135 q 386 193 386 165 q 374 223 386 210 q 342 247 363 236 q 297 267 322 258 q 246 288 272 276 q 182 317 214 300 q 124 358 150 333 q 81 415 97 382 q 64 490 64 447 q 83 578 64 538 q 136 646 101 618 q 219 690 171 674 q 328 706 268 706 q 467 678 407 706 q 571 618 526 651 l 479 496 q 406 539 442 524 q 333 554 369 554 q 256 500 256 554 q 267 472 256 483 q 297 450 278 460 q 340 431 315 440 q 390 413 364 422 q 456 384 424 400 q 516 344 489 368 q 560 287 543 321 q 576 206 576 253 q 558 118 576 158 q 504 48 540 78 q 415 1 468 18 q 293 -17 363 -17 z \"},\"ʃ\":{\"ha\":386,\"x_min\":-71,\"x_max\":460,\"o\":\"m 50 -272 q -22 -267 7 -272 q -71 -253 -50 -261 l -35 -103 q -8 -110 -21 -107 q 19 -112 4 -112 q 76 -86 60 -112 q 92 -1 92 -60 l 92 713 q 104 820 92 769 q 147 908 117 871 q 227 968 178 946 q 351 990 276 990 q 415 985 390 990 q 460 971 440 979 l 424 821 q 403 828 413 825 q 383 831 394 831 q 315 804 335 831 q 296 719 296 778 l 296 4 q 284 -103 296 -53 q 244 -190 272 -153 q 168 -250 215 -228 q 50 -272 121 -272 z \"},\"ʄ\":{\"ha\":446,\"x_min\":-43,\"x_max\":488,\"o\":\"m 78 -272 q 6 -267 35 -272 q -43 -253 -22 -261 l -7 -103 q 19 -110 7 -107 q 47 -112 32 -112 q 103 -86 88 -112 q 119 -1 119 -60 l 119 310 l 17 310 l 17 400 l 119 408 l 119 713 q 132 820 119 769 q 175 908 144 871 q 255 968 206 946 q 379 990 304 990 q 443 985 418 990 q 488 971 468 979 l 451 821 q 431 828 440 825 q 411 831 422 831 q 343 804 363 831 q 324 719 324 778 l 324 408 l 422 408 l 422 310 l 324 310 l 324 4 q 312 -103 324 -53 q 272 -190 300 -153 q 196 -250 243 -228 q 78 -272 149 -272 z \"},\"ʈ\":{\"ha\":532,\"x_min\":24,\"x_max\":508,\"o\":\"m 356 -260 q 247 -240 292 -260 q 173 -186 201 -221 q 131 -102 144 -151 q 118 7 118 -53 l 118 529 l 24 529 l 24 681 l 129 689 l 153 872 l 322 872 l 322 689 l 488 689 l 488 529 l 322 529 l 322 10 q 347 -74 322 -49 q 411 -100 371 -100 q 445 -96 428 -100 q 476 -86 463 -92 l 508 -235 q 443 -251 481 -243 q 356 -260 406 -260 z \"},\"ʉ\":{\"ha\":857,\"x_min\":17,\"x_max\":835,\"o\":\"m 17 372 l 17 463 l 121 471 l 121 689 l 325 689 l 325 471 l 533 471 l 533 689 l 738 689 l 738 471 l 835 471 l 835 372 l 738 372 l 738 0 l 571 0 l 556 96 l 551 96 q 456 13 507 43 q 335 -17 406 -17 q 172 57 222 -17 q 121 261 121 131 l 121 372 l 17 372 m 411 157 q 476 175 450 157 q 533 233 503 193 l 533 372 l 325 372 l 325 288 q 346 185 325 213 q 411 157 367 157 z \"},\"ʊ\":{\"ha\":775,\"x_min\":40,\"x_max\":733,\"o\":\"m 388 -17 q 247 9 308 -17 q 142 76 185 35 q 78 171 100 118 q 56 279 56 224 q 86 425 56 363 q 154 525 117 488 l 154 529 l 40 529 l 40 689 l 338 689 l 338 557 q 279 456 299 508 q 260 324 260 403 q 267 254 260 286 q 291 199 275 222 q 331 162 307 175 q 388 149 354 149 q 444 162 421 149 q 484 199 468 175 q 508 254 500 222 q 515 324 515 286 q 496 456 515 403 q 438 557 476 508 l 438 689 l 733 689 l 733 529 l 621 529 l 621 525 q 689 425 658 488 q 719 279 719 363 q 697 171 719 224 q 633 76 675 118 q 528 9 590 35 q 388 -17 467 -17 z \"},\"ʋ\":{\"ha\":767,\"x_min\":83,\"x_max\":715,\"o\":\"m 379 -17 q 163 63 243 -17 q 83 301 83 143 l 83 689 l 288 689 l 288 304 q 314 185 288 222 q 389 149 340 149 q 476 212 446 149 q 506 385 506 275 q 488 508 506 468 q 433 547 471 547 q 406 543 419 547 l 383 694 q 424 703 403 701 q 478 706 446 706 q 572 689 528 706 q 647 637 615 672 q 697 547 679 601 q 715 415 715 492 q 694 239 715 318 q 631 103 672 160 q 526 15 589 46 q 379 -17 463 -17 z \"},\"ʌ\":{\"ha\":726,\"x_min\":17,\"x_max\":710,\"o\":\"m 17 0 l 242 689 l 476 689 l 710 0 l 504 0 l 414 325 q 388 430 401 376 q 361 538 374 483 l 356 538 q 328 430 342 483 q 301 325 315 376 l 213 0 l 17 0 z \"},\"ʍ\":{\"ha\":1078,\"x_min\":33,\"x_max\":1044,\"o\":\"m 33 0 l 199 689 l 438 689 l 500 414 q 519 317 510 365 q 538 213 528 268 l 543 213 q 559 317 551 268 q 578 414 567 365 l 638 689 l 872 689 l 1044 0 l 842 0 l 775 319 q 760 421 767 371 q 744 524 753 471 l 739 524 q 719 419 729 471 q 697 319 710 368 l 622 0 l 446 0 l 368 319 q 346 421 356 371 q 325 524 336 471 l 319 524 q 303 421 310 471 q 288 319 297 371 l 222 0 l 33 0 z \"},\"ʎ\":{\"ha\":724,\"x_min\":17,\"x_max\":707,\"o\":\"m 17 0 l 268 728 q 320 841 293 792 q 383 924 347 890 q 463 974 418 957 q 569 990 508 990 q 624 987 601 990 q 667 976 646 983 l 631 821 q 608 826 621 824 q 585 829 596 829 q 506 804 533 829 q 464 739 478 779 l 442 671 l 707 0 l 503 0 l 404 296 q 376 392 389 343 q 349 492 363 440 l 343 492 q 320 394 332 443 q 296 296 308 344 l 213 0 l 17 0 z \"},\"ʏ\":{\"ha\":647,\"x_min\":-11,\"x_max\":658,\"o\":\"m 222 0 l 222 208 l -11 689 l 204 689 l 264 540 q 292 459 278 497 q 322 376 307 421 l 328 376 q 358 459 343 421 q 389 540 374 497 l 446 689 l 658 689 l 426 208 l 426 0 l 222 0 z \"},\"ʐ\":{\"ha\":639,\"x_min\":53,\"x_max\":728,\"o\":\"m 619 -260 q 510 -239 554 -260 q 439 -184 467 -218 q 399 -107 411 -150 q 388 -18 388 -64 l 388 0 l 53 0 l 53 110 l 342 529 l 85 529 l 85 689 l 596 689 l 596 581 l 307 160 l 592 160 l 592 -1 q 605 -76 592 -53 q 651 -99 618 -99 q 692 -90 671 -99 l 728 -240 q 683 -254 708 -249 q 619 -260 658 -260 z \"},\"ʑ\":{\"ha\":699,\"x_min\":53,\"x_max\":718,\"o\":\"m 399 -114 l 301 -93 q 312 -46 307 -69 q 324 0 317 -22 l 53 0 l 53 110 l 342 529 l 85 529 l 85 689 l 582 689 l 582 581 l 293 160 q 334 156 314 157 q 374 154 354 156 q 462 299 413 246 q 574 353 511 353 q 679 315 640 353 q 718 200 718 276 q 704 123 718 160 q 660 59 690 86 q 584 16 631 32 q 474 0 538 0 l 425 0 q 412 -53 418 -25 q 399 -114 406 -82 m 526 149 q 590 166 569 149 q 610 207 610 183 q 568 244 610 244 q 524 222 547 244 q 476 149 500 199 l 526 149 z \"},\"ʒ\":{\"ha\":639,\"x_min\":7,\"x_max\":610,\"o\":\"m 293 -272 q 125 -239 194 -272 q 7 -160 56 -206 l 99 -33 q 175 -85 133 -64 q 269 -107 217 -107 q 367 -69 329 -107 q 406 40 406 -31 q 369 136 406 103 q 272 169 333 169 q 229 166 244 169 q 190 153 214 163 l 124 251 l 335 529 l 53 529 l 53 689 l 578 689 l 578 581 l 371 308 q 472 283 428 304 q 547 226 517 261 q 594 145 578 192 q 610 44 610 99 q 584 -91 610 -32 q 515 -190 558 -150 q 415 -251 472 -231 q 293 -272 357 -272 z \"},\"ʔ\":{\"ha\":622,\"x_min\":-8,\"x_max\":599,\"o\":\"m 179 0 l 179 440 q 280 510 239 478 q 347 572 321 542 q 383 633 372 603 q 394 696 394 663 q 360 792 394 758 q 265 825 325 825 q 169 799 213 825 q 92 736 126 772 l -8 865 q 113 954 40 918 q 288 990 185 990 q 407 972 350 990 q 506 919 464 954 q 574 830 549 883 q 599 706 599 776 q 583 602 599 649 q 538 515 567 556 q 470 438 510 474 q 383 364 431 401 l 383 0 l 179 0 z \"},\"ʕ\":{\"ha\":703,\"x_min\":58,\"x_max\":665,\"o\":\"m 274 0 l 274 364 q 187 438 226 401 q 119 515 147 474 q 74 602 90 556 q 58 706 58 649 q 85 830 58 776 q 156 919 111 883 q 259 972 200 954 q 383 990 318 990 q 548 954 479 990 q 665 865 617 918 l 564 736 q 494 799 533 772 q 406 825 454 825 q 301 792 339 825 q 263 696 263 758 q 274 633 263 663 q 310 572 285 603 q 377 510 336 542 q 478 440 418 478 l 478 0 l 274 0 z \"},\"ʡ\":{\"ha\":661,\"x_min\":13,\"x_max\":639,\"o\":\"m 200 0 l 200 279 l 15 279 l 15 432 l 121 440 l 225 440 q 373 577 331 517 q 415 696 415 638 q 381 792 415 758 q 288 825 346 825 q 191 799 235 825 q 114 736 147 772 l 13 865 q 135 954 63 918 q 310 990 207 990 q 429 972 372 990 q 528 919 486 954 q 596 830 571 883 q 621 706 621 776 q 608 632 621 667 q 574 565 596 597 q 522 501 551 532 q 458 440 492 469 l 639 440 l 639 279 l 404 279 l 404 0 l 200 0 z \"},\"ʢ\":{\"ha\":661,\"x_min\":24,\"x_max\":649,\"o\":\"m 258 0 l 258 279 l 24 279 l 24 440 l 203 440 q 89 564 136 500 q 42 706 42 628 q 68 830 42 776 q 139 919 94 883 q 242 972 183 954 q 367 990 301 990 q 531 954 463 990 q 649 865 600 918 l 547 736 q 477 799 517 772 q 389 825 438 825 q 284 792 322 825 q 246 696 246 758 q 288 577 246 638 q 436 440 331 517 l 542 440 l 647 432 l 647 279 l 463 279 l 463 0 l 258 0 z \"},\"ǂ\":{\"ha\":458,\"x_min\":8,\"x_max\":447,\"o\":\"m 8 458 l 8 550 l 114 557 l 167 557 l 167 1042 l 300 1042 l 300 557 l 447 557 l 447 458 l 300 458 l 300 285 l 447 285 l 447 186 l 300 186 l 300 -347 l 167 -347 l 167 186 l 8 186 l 8 276 l 114 285 l 167 285 l 167 458 l 8 458 z \"},\"ʘ\":{\"ha\":772,\"x_min\":67,\"x_max\":706,\"o\":\"m 386 -17 q 256 15 315 -17 q 156 109 197 46 q 90 267 114 172 q 67 489 67 361 q 90 710 67 615 q 156 867 114 804 q 256 960 197 929 q 386 990 315 990 q 516 960 457 990 q 617 867 575 929 q 682 710 658 804 q 706 489 706 615 q 682 267 706 361 q 617 109 658 172 q 516 15 575 46 q 386 -17 457 -17 m 386 149 q 435 165 411 149 q 477 220 458 181 q 508 325 496 260 q 519 489 519 390 q 508 649 519 585 q 477 752 496 713 q 435 808 458 792 q 386 825 411 825 q 337 808 361 825 q 294 752 313 792 q 264 649 275 713 q 253 489 253 585 q 264 325 253 390 q 294 220 275 260 q 337 165 313 181 q 386 149 361 149 m 386 403 q 324 428 350 403 q 297 490 297 454 q 324 552 297 526 q 386 578 350 578 q 449 552 422 578 q 475 490 475 526 q 449 428 475 454 q 386 403 422 403 z \"},\"ﬀ\":{\"ha\":913,\"x_min\":33,\"x_max\":956,\"o\":\"m 564 0 l 564 529 l 329 529 l 329 0 l 125 0 l 125 529 l 33 529 l 33 681 l 125 688 l 125 719 q 140 819 125 772 q 185 901 154 867 q 266 956 217 936 q 386 976 315 976 q 468 969 431 976 q 529 951 506 961 l 492 800 q 457 811 475 807 q 411 815 439 815 q 352 792 375 815 q 329 721 329 769 l 329 689 l 564 689 l 564 725 q 577 828 564 779 q 621 913 590 876 q 700 969 651 949 q 818 990 749 990 q 897 982 861 990 q 956 965 932 974 l 918 815 q 847 829 879 829 q 789 806 810 829 q 768 731 768 783 l 768 689 l 892 689 l 892 529 l 768 529 l 768 0 l 564 0 z \"},\"ﬃ\":{\"ha\":1296,\"x_min\":33,\"x_max\":1222,\"o\":\"m 564 0 l 564 529 l 329 529 l 329 0 l 125 0 l 125 529 l 33 529 l 33 681 l 125 688 l 125 719 q 140 819 125 772 q 185 901 154 867 q 266 956 217 936 q 386 976 315 976 q 468 969 431 976 q 529 951 506 961 l 492 800 q 457 811 475 807 q 411 815 439 815 q 352 792 375 815 q 329 721 329 769 l 329 689 l 564 689 l 564 725 q 577 828 564 779 q 621 913 590 876 q 700 969 651 949 q 818 990 749 990 q 897 982 861 990 q 956 965 932 974 l 918 815 q 847 829 879 829 q 789 806 810 829 q 768 731 768 783 l 768 689 l 892 689 l 892 529 l 768 529 l 768 0 l 564 0 m 1003 0 l 1003 689 l 1207 689 l 1207 0 l 1003 0 m 1104 790 q 1019 820 1053 790 q 986 897 986 850 q 1019 974 986 944 q 1104 1003 1053 1003 q 1190 974 1157 1003 q 1222 897 1222 944 q 1190 820 1222 850 q 1104 790 1157 790 z \"},\"ﬄ\":{\"ha\":1310,\"x_min\":33,\"x_max\":1293,\"o\":\"m 564 0 l 564 529 l 329 529 l 329 0 l 125 0 l 125 529 l 33 529 l 33 681 l 125 688 l 125 719 q 140 819 125 772 q 185 901 154 867 q 266 956 217 936 q 386 976 315 976 q 468 969 431 976 q 529 951 506 961 l 492 800 q 457 811 475 807 q 411 815 439 815 q 352 792 375 815 q 329 721 329 769 l 329 689 l 564 689 l 564 725 q 577 828 564 779 q 621 913 590 876 q 700 969 651 949 q 818 990 749 990 q 897 982 861 990 q 956 965 932 974 l 918 815 q 847 829 879 829 q 789 806 810 829 q 768 731 768 783 l 768 689 l 892 689 l 892 529 l 768 529 l 768 0 l 564 0 m 1190 -17 q 1101 0 1138 -17 q 1044 47 1065 17 q 1013 119 1022 76 q 1003 214 1003 161 l 1003 974 l 1207 974 l 1207 206 q 1219 161 1207 174 q 1243 149 1231 149 q 1255 149 1250 149 q 1268 151 1260 149 l 1293 0 q 1251 -12 1276 -7 q 1190 -17 1225 -17 z \"},\"Α\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 z \"},\"Β\":{\"ha\":840,\"x_min\":107,\"x_max\":794,\"o\":\"m 107 0 l 107 906 l 417 906 q 548 895 488 906 q 653 858 608 885 q 724 789 699 832 q 750 681 750 746 q 742 619 750 650 q 718 563 733 589 q 681 515 703 536 q 632 485 660 494 l 632 479 q 696 453 667 471 q 747 410 725 436 q 782 348 769 383 q 794 267 794 313 q 767 147 794 197 q 692 65 740 97 q 581 16 644 32 q 443 0 517 0 l 107 0 m 311 543 l 407 543 q 516 572 482 543 q 550 650 550 601 q 515 725 550 703 q 408 747 481 747 l 311 747 l 311 543 m 311 158 l 426 158 q 594 281 594 158 q 553 366 594 340 q 426 392 511 392 l 311 392 l 311 158 z \"},\"Γ\":{\"ha\":724,\"x_min\":107,\"x_max\":678,\"o\":\"m 107 0 l 107 906 l 678 906 l 678 733 l 311 733 l 311 0 l 107 0 z \"},\"Δ\":{\"ha\":889,\"x_min\":47,\"x_max\":842,\"o\":\"m 47 0 l 47 124 l 322 906 l 567 906 l 842 124 l 842 0 l 47 0 m 267 172 l 617 172 l 521 478 l 443 749 l 438 749 l 361 478 l 267 172 z \"},\"Ε\":{\"ha\":761,\"x_min\":107,\"x_max\":688,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 z \"},\"Ζ\":{\"ha\":751,\"x_min\":50,\"x_max\":706,\"o\":\"m 50 0 l 50 124 l 450 733 l 88 733 l 88 906 l 701 906 l 701 782 l 301 172 l 706 172 l 706 0 l 50 0 z \"},\"Η\":{\"ha\":936,\"x_min\":107,\"x_max\":829,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 557 l 624 557 l 624 906 l 829 906 l 829 0 l 624 0 l 624 378 l 311 378 l 311 0 l 107 0 z \"},\"Θ\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 339 378 l 339 557 l 611 557 l 611 378 l 339 378 m 475 -17 q 308 16 383 -17 q 178 110 232 49 q 94 258 124 171 q 64 457 64 346 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 856 258 886 346 q 772 110 826 171 q 642 16 718 49 q 475 -17 567 -17 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 z \"},\"Ι\":{\"ha\":418,\"x_min\":107,\"x_max\":311,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 0 l 107 0 z \"},\"Κ\":{\"ha\":853,\"x_min\":107,\"x_max\":861,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 535 l 317 535 l 586 906 l 811 906 l 538 544 l 861 0 l 638 0 l 417 382 l 311 243 l 311 0 l 107 0 z \"},\"Λ\":{\"ha\":772,\"x_min\":-10,\"x_max\":782,\"o\":\"m -10 0 l 263 906 l 508 906 l 782 0 l 565 0 l 457 422 q 420 567 436 497 q 385 713 404 638 l 379 713 q 342 567 358 638 q 306 422 325 497 l 199 0 l -10 0 z \"},\"Μ\":{\"ha\":1058,\"x_min\":107,\"x_max\":951,\"o\":\"m 107 0 l 107 906 l 331 906 l 476 503 q 503 420 490 463 q 529 336 515 378 l 535 336 q 560 420 549 378 q 586 503 572 463 l 729 906 l 951 906 l 951 0 l 765 0 l 765 332 q 768 406 765 365 q 775 487 771 446 q 783 567 779 528 q 792 640 788 607 l 786 640 l 713 425 l 583 79 l 471 79 l 342 425 l 269 640 l 264 640 q 272 567 268 607 q 281 487 276 528 q 288 406 285 446 q 290 332 290 365 l 290 0 l 107 0 z \"},\"Ν\":{\"ha\":924,\"x_min\":107,\"x_max\":817,\"o\":\"m 107 0 l 107 906 l 317 906 l 553 456 l 642 256 l 647 256 q 631 417 640 328 q 622 586 622 506 l 622 906 l 817 906 l 817 0 l 607 0 l 371 451 l 282 649 l 276 649 q 292 488 283 574 q 301 321 301 401 l 301 0 l 107 0 z \"},\"Ξ\":{\"ha\":793,\"x_min\":74,\"x_max\":721,\"o\":\"m 74 0 l 74 172 l 721 172 l 721 0 l 74 0 m 168 381 l 168 551 l 625 551 l 625 381 l 168 381 m 88 733 l 88 906 l 707 906 l 707 733 l 88 733 z \"},\"Ο\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 308 16 383 -17 q 178 110 232 49 q 94 258 124 171 q 64 457 64 346 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 856 258 886 346 q 772 110 826 171 q 642 16 718 49 q 475 -17 567 -17 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 z \"},\"Π\":{\"ha\":921,\"x_min\":107,\"x_max\":814,\"o\":\"m 107 0 l 107 906 l 814 906 l 814 0 l 610 0 l 610 733 l 311 733 l 311 0 l 107 0 z \"},\"Ρ\":{\"ha\":828,\"x_min\":107,\"x_max\":778,\"o\":\"m 107 0 l 107 906 l 418 906 q 558 891 493 906 q 672 842 624 876 q 749 752 721 808 q 778 614 778 696 q 749 476 778 535 q 672 381 721 418 q 560 325 624 343 q 424 307 496 307 l 311 307 l 311 0 l 107 0 m 311 469 l 411 469 q 578 614 578 469 q 533 714 578 685 q 406 743 489 743 l 311 743 l 311 469 z \"},\"Σ\":{\"ha\":763,\"x_min\":53,\"x_max\":715,\"o\":\"m 53 0 l 53 124 l 333 457 l 57 782 l 57 906 l 678 906 l 678 733 l 313 733 l 538 463 l 308 172 l 715 172 l 715 0 l 53 0 z \"},\"Τ\":{\"ha\":772,\"x_min\":35,\"x_max\":738,\"o\":\"m 283 0 l 283 733 l 35 733 l 35 906 l 738 906 l 738 733 l 489 733 l 489 0 l 283 0 z \"},\"Υ\":{\"ha\":729,\"x_min\":-11,\"x_max\":740,\"o\":\"m 263 0 l 263 322 l -11 906 l 208 906 l 289 697 q 326 598 308 646 q 363 497 343 550 l 368 497 q 406 598 388 550 q 444 697 425 646 l 526 906 l 740 906 l 467 322 l 467 0 l 263 0 z \"},\"Φ\":{\"ha\":1056,\"x_min\":67,\"x_max\":989,\"o\":\"m 260 457 q 308 314 260 369 q 438 246 356 258 l 438 664 q 308 598 356 651 q 260 457 260 544 m 796 457 q 748 598 796 544 q 618 664 700 651 l 618 246 q 748 314 700 258 q 796 457 796 369 m 438 -31 l 438 90 q 285 124 354 97 q 168 198 217 151 q 93 310 119 244 q 67 457 67 375 q 93 603 67 539 q 168 712 119 667 q 285 783 217 757 q 438 817 354 810 l 438 936 l 618 936 l 618 817 q 770 783 701 810 q 888 712 839 757 q 963 603 936 667 q 989 457 989 539 q 963 310 989 375 q 888 198 936 244 q 770 124 839 151 q 618 90 701 97 l 618 -31 l 438 -31 z \"},\"Χ\":{\"ha\":788,\"x_min\":15,\"x_max\":772,\"o\":\"m 15 0 l 267 465 l 31 906 l 258 906 l 338 735 q 368 667 353 703 q 403 589 383 632 l 408 589 q 438 667 424 632 q 467 735 453 703 l 539 906 l 757 906 l 522 456 l 772 0 l 544 0 l 454 185 q 422 256 438 221 q 386 333 406 292 l 381 333 q 350 256 365 292 q 319 185 335 221 l 235 0 l 15 0 z \"},\"Ψ\":{\"ha\":1044,\"x_min\":72,\"x_max\":971,\"o\":\"m 426 0 l 426 304 q 278 335 343 310 q 167 406 213 360 q 97 520 121 451 q 72 682 72 589 l 72 906 l 272 906 l 272 694 q 312 527 272 578 q 426 467 351 476 l 426 906 l 618 906 l 618 467 q 732 527 693 476 q 771 694 771 578 l 771 906 l 971 906 l 971 682 q 947 520 971 589 q 876 406 922 451 q 765 335 831 360 q 618 304 700 310 l 618 0 l 426 0 z \"},\"Ω\":{\"ha\":988,\"x_min\":61,\"x_max\":926,\"o\":\"m 61 0 l 61 165 l 214 165 l 214 171 q 168 226 192 193 q 126 301 144 260 q 95 391 107 342 q 83 497 83 440 q 113 669 83 592 q 196 803 142 747 q 326 891 250 860 q 494 922 401 922 q 662 891 586 922 q 792 803 738 860 q 876 669 846 747 q 906 497 906 592 q 893 391 906 440 q 862 301 881 342 q 819 226 843 260 q 774 171 796 193 l 774 165 l 926 165 l 926 0 l 556 0 l 556 147 q 661 292 626 214 q 696 476 696 369 q 682 585 696 535 q 642 670 668 635 q 578 726 615 706 q 494 746 542 746 q 410 726 447 746 q 347 670 372 706 q 307 585 321 635 q 293 476 293 535 q 327 292 293 369 q 432 147 361 214 l 432 0 l 61 0 z \"},\"Ά\":{\"ha\":864,\"x_min\":-7,\"x_max\":872,\"o\":\"m 388 458 l 365 375 l 558 375 l 538 458 q 500 603 518 526 q 464 750 482 679 l 458 750 q 424 602 442 678 q 388 458 407 526 m 60 0 l 343 906 l 589 906 l 872 0 l 656 0 l 600 215 l 324 215 l 268 0 l 60 0 m -7 635 l 32 931 l 206 906 l 122 611 l -7 635 z \"},\"Έ\":{\"ha\":926,\"x_min\":-17,\"x_max\":853,\"o\":\"m 272 0 l 272 906 l 839 906 l 839 733 l 476 733 l 476 551 l 785 551 l 785 381 l 476 381 l 476 172 l 853 172 l 853 0 l 272 0 m -17 635 l 22 931 l 196 906 l 113 611 l -17 635 z \"},\"Ή\":{\"ha\":1100,\"x_min\":-17,\"x_max\":994,\"o\":\"m 272 0 l 272 906 l 476 906 l 476 557 l 789 557 l 789 906 l 994 906 l 994 0 l 789 0 l 789 378 l 476 378 l 476 0 l 272 0 m -17 635 l 22 931 l 196 906 l 113 611 l -17 635 z \"},\"Ί\":{\"ha\":583,\"x_min\":-17,\"x_max\":476,\"o\":\"m 272 0 l 272 906 l 476 906 l 476 0 l 272 0 m -17 635 l 22 931 l 196 906 l 113 611 l -17 635 z \"},\"Ϊ\":{\"ha\":418,\"x_min\":-43,\"x_max\":460,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 0 l 107 0 m 54 972 q -16 1000 11 972 q -43 1069 -43 1028 q -16 1139 -43 1111 q 54 1167 11 1167 q 124 1139 97 1167 q 151 1069 151 1111 q 124 1000 151 1028 q 54 972 97 972 m 363 972 q 292 1000 319 972 q 265 1069 265 1028 q 292 1139 265 1111 q 363 1167 319 1167 q 433 1139 406 1167 q 460 1069 460 1111 q 433 1000 460 1028 q 363 972 406 972 z \"},\"Ό\":{\"ha\":1079,\"x_min\":-17,\"x_max\":1014,\"o\":\"m 603 -17 q 435 16 511 -17 q 306 110 360 49 q 222 258 251 171 q 192 457 192 346 q 222 655 192 568 q 306 801 251 742 q 435 891 360 860 q 603 922 511 922 q 770 891 694 922 q 900 800 846 860 q 984 653 954 740 q 1014 457 1014 567 q 984 258 1014 346 q 900 110 954 171 q 770 16 846 49 q 603 -17 694 -17 m 603 160 q 750 240 696 160 q 804 457 804 319 q 750 669 804 593 q 603 746 696 746 q 456 669 510 746 q 401 457 401 593 q 456 240 401 319 q 603 160 510 160 m -17 635 l 22 931 l 196 906 l 113 611 l -17 635 z \"},\"Ύ\":{\"ha\":978,\"x_min\":-17,\"x_max\":989,\"o\":\"m 511 0 l 511 322 l 238 906 l 457 906 l 538 697 q 574 598 557 646 q 611 497 592 550 l 617 497 q 655 598 636 550 q 693 697 674 646 l 775 906 l 989 906 l 715 322 l 715 0 l 511 0 m -17 635 l 22 931 l 196 906 l 113 611 l -17 635 z \"},\"Ϋ\":{\"ha\":729,\"x_min\":-11,\"x_max\":740,\"o\":\"m 263 0 l 263 322 l -11 906 l 208 906 l 289 697 q 326 598 308 646 q 363 497 343 550 l 368 497 q 406 598 388 550 q 444 697 425 646 l 526 906 l 740 906 l 467 322 l 467 0 l 263 0 m 210 972 q 140 1000 167 972 q 113 1069 113 1028 q 140 1139 113 1111 q 210 1167 167 1167 q 280 1139 253 1167 q 307 1069 307 1111 q 280 1000 307 1028 q 210 972 253 972 m 518 972 q 448 1000 475 972 q 421 1069 421 1028 q 448 1139 421 1111 q 518 1167 475 1167 q 588 1139 561 1167 q 615 1069 615 1111 q 588 1000 615 1028 q 518 972 561 972 z \"},\"Ώ\":{\"ha\":1115,\"x_min\":-26,\"x_max\":1054,\"o\":\"m 189 0 l 189 165 l 342 165 l 342 171 q 296 226 319 193 q 253 301 272 260 q 223 391 235 342 q 211 497 211 440 q 240 669 211 592 q 324 803 269 747 q 453 891 378 860 q 622 922 529 922 q 790 891 714 922 q 919 803 865 860 q 1003 669 974 747 q 1033 497 1033 592 q 1021 391 1033 440 q 990 301 1008 342 q 947 226 971 260 q 901 171 924 193 l 901 165 l 1054 165 l 1054 0 l 683 0 l 683 147 q 789 292 754 214 q 824 476 824 369 q 810 585 824 535 q 769 670 796 635 q 706 726 743 706 q 622 746 669 746 q 538 726 575 746 q 474 670 500 706 q 435 585 449 635 q 421 476 421 535 q 455 292 421 369 q 560 147 489 214 l 560 0 l 189 0 m -26 635 l 13 931 l 186 906 l 103 611 l -26 635 z \"},\"α\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 z \"},\"β\":{\"ha\":833,\"x_min\":89,\"x_max\":785,\"o\":\"m 89 -246 l 89 647 q 108 782 89 719 q 167 891 128 844 q 267 964 207 938 q 411 990 328 990 q 522 975 468 990 q 619 928 576 960 q 687 850 661 897 q 713 738 713 803 q 683 616 713 667 q 596 529 653 565 l 596 524 q 669 494 635 515 q 730 442 704 474 q 770 368 756 410 q 785 278 785 326 q 760 146 785 201 q 697 54 736 90 q 608 1 657 18 q 508 -17 558 -17 q 392 2 451 -17 q 281 76 333 21 q 288 -87 285 -7 q 296 -246 292 -167 l 89 -246 m 449 150 q 544 185 504 150 q 585 290 585 219 q 553 383 585 344 q 456 422 521 422 q 400 414 425 422 l 375 563 q 486 617 456 574 q 517 718 517 660 q 485 802 517 775 q 411 829 453 829 q 319 776 350 829 q 286 635 289 724 q 281 435 283 533 q 279 235 279 336 q 364 166 319 182 q 449 150 408 150 z \"},\"γ\":{\"ha\":740,\"x_min\":-1,\"x_max\":717,\"o\":\"m 257 -246 q 262 -206 260 -225 q 265 -165 264 -186 q 266 -119 265 -144 q 267 -57 267 -93 q 245 99 267 8 q 188 290 224 190 q 103 486 151 389 q -1 661 54 583 l 207 706 q 254 619 229 671 q 303 506 279 568 q 350 374 328 444 q 392 231 372 304 l 397 231 q 514 689 500 442 l 717 689 q 683 525 701 601 q 635 370 664 449 q 561 207 606 292 q 450 18 517 122 q 465 -117 461 -47 q 468 -246 468 -187 l 257 -246 z \"},\"δ\":{\"ha\":761,\"x_min\":57,\"x_max\":706,\"o\":\"m 379 -17 q 254 5 313 -17 q 152 67 196 26 q 83 167 108 108 q 57 300 57 225 q 74 399 57 354 q 119 478 90 443 q 187 541 149 514 q 267 586 225 568 q 212 632 238 607 q 166 685 186 657 q 134 747 146 714 q 122 821 122 781 q 138 885 122 854 q 184 940 153 917 q 263 976 215 963 q 375 990 310 990 q 529 974 450 990 q 681 935 608 958 l 635 783 q 494 824 561 808 q 375 839 428 839 q 326 828 342 839 q 311 801 311 818 q 327 765 311 783 q 370 725 343 746 q 432 681 397 704 q 506 629 467 657 q 589 563 551 596 q 652 492 626 529 q 692 410 678 454 q 706 310 706 365 q 683 176 706 236 q 619 74 661 117 q 516 7 576 31 q 379 -17 456 -17 m 383 149 q 474 187 439 149 q 508 311 508 225 q 478 414 508 371 q 401 493 447 457 q 290 428 331 474 q 250 303 250 382 q 290 188 250 228 q 383 149 329 149 z \"},\"ε\":{\"ha\":654,\"x_min\":50,\"x_max\":626,\"o\":\"m 372 -17 q 247 -3 306 -17 q 144 36 188 10 q 75 103 100 63 q 50 196 50 143 q 85 305 50 267 q 183 360 121 343 l 183 365 q 105 424 131 382 q 79 508 79 467 q 103 597 79 560 q 169 658 128 635 q 263 694 210 682 q 375 706 317 706 q 499 687 438 706 q 613 635 561 668 l 538 504 q 386 550 468 550 q 308 531 338 550 q 279 481 279 513 q 376 419 279 419 q 424 421 399 419 q 472 425 449 422 l 472 279 q 413 283 443 282 q 354 285 382 285 q 275 269 300 285 q 250 217 250 253 q 285 160 250 181 q 392 139 321 139 q 466 150 425 139 q 547 192 507 161 l 626 63 q 499 -1 560 14 q 372 -17 439 -17 z \"},\"ζ\":{\"ha\":647,\"x_min\":57,\"x_max\":624,\"o\":\"m 540 -260 l 381 -207 q 427 -140 410 -167 q 444 -86 444 -114 q 438 -62 444 -72 q 417 -43 432 -51 q 376 -27 403 -35 q 311 -11 350 -19 q 217 19 263 -1 q 136 78 172 40 q 78 173 100 115 q 57 317 57 231 q 81 444 57 378 q 149 576 106 510 q 253 706 193 642 q 388 825 314 769 q 330 823 365 824 q 253 821 294 822 q 172 817 213 819 q 100 813 132 815 l 100 974 l 611 974 l 611 813 l 603 813 q 474 710 535 771 q 366 581 413 649 q 292 447 319 514 q 265 328 265 379 q 274 256 265 286 q 301 206 282 226 q 352 172 321 185 q 431 149 383 158 q 579 88 535 128 q 624 -32 624 49 q 604 -130 624 -68 q 540 -260 585 -192 z \"},\"η\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 z \"},\"θ\":{\"ha\":763,\"x_min\":67,\"x_max\":696,\"o\":\"m 382 -17 q 253 15 311 -17 q 153 109 194 46 q 90 267 113 172 q 67 489 67 361 q 90 710 67 615 q 153 867 113 804 q 253 960 194 929 q 382 990 311 990 q 510 960 453 990 q 609 867 568 929 q 673 710 650 804 q 696 489 696 615 q 673 267 696 361 q 609 109 650 172 q 510 15 568 46 q 382 -17 453 -17 m 382 825 q 340 814 360 825 q 306 773 321 803 q 280 691 290 743 q 267 557 269 639 l 497 557 q 484 691 494 639 q 458 773 474 743 q 424 814 443 803 q 382 825 404 825 m 382 149 q 424 160 404 149 q 458 203 443 172 q 484 288 474 235 q 497 422 494 340 l 267 422 q 280 288 269 340 q 306 203 290 235 q 340 160 321 172 q 382 149 360 149 z \"},\"ι\":{\"ha\":418,\"x_min\":90,\"x_max\":407,\"o\":\"m 286 -17 q 191 0 229 -17 q 131 47 153 17 q 99 119 108 76 q 90 215 90 163 l 90 689 l 296 689 q 292 562 294 628 q 287 431 289 496 q 283 308 285 367 q 282 207 282 250 q 297 161 282 174 q 339 149 311 149 q 360 151 347 149 q 383 157 372 153 l 407 6 q 358 -10 385 -4 q 286 -17 331 -17 z \"},\"κ\":{\"ha\":758,\"x_min\":74,\"x_max\":765,\"o\":\"m 536 -15 q 361 275 456 86 q 351 264 358 271 q 298 172 314 224 q 282 40 282 119 l 282 0 l 90 0 l 90 478 q 88 576 90 518 q 74 689 85 635 l 276 689 q 286 612 283 656 q 289 519 289 568 l 289 390 l 294 390 q 376 503 333 450 q 466 599 418 557 q 567 669 514 642 q 682 706 621 697 l 699 515 q 599 477 646 503 q 494 403 551 451 q 553 297 519 353 q 622 189 586 242 q 694 87 657 136 q 765 0 732 38 l 536 -15 z \"},\"λ\":{\"ha\":767,\"x_min\":18,\"x_max\":761,\"o\":\"m 239 -15 l 18 0 l 314 692 l 310 711 q 263 791 297 764 q 185 818 229 818 q 132 813 153 818 q 88 796 111 807 l 43 961 q 112 983 76 975 q 208 990 147 990 q 400 921 328 990 q 517 700 472 851 l 761 0 l 542 0 l 407 464 l 401 464 l 239 -15 z \"},\"μ\":{\"ha\":825,\"x_min\":90,\"x_max\":818,\"o\":\"m 90 -246 l 90 689 l 294 689 l 294 288 q 315 185 294 214 q 379 157 335 157 q 442 177 414 157 q 497 247 469 197 l 497 689 l 703 689 q 699 562 701 628 q 694 431 696 496 q 690 308 692 367 q 689 207 689 250 q 706 161 689 174 q 750 149 722 149 q 794 157 771 149 l 818 6 q 769 -10 796 -4 q 697 -17 742 -17 q 519 99 553 -17 l 514 99 q 368 -10 463 -10 q 321 -3 343 -10 q 282 22 299 3 q 283 -50 282 -17 q 286 -115 285 -83 q 290 -178 288 -146 q 296 -246 292 -210 l 90 -246 z \"},\"ν\":{\"ha\":726,\"x_min\":-1,\"x_max\":703,\"o\":\"m 253 0 q 211 188 238 96 q 151 363 185 279 q 79 523 118 447 q -1 661 40 599 l 207 706 q 262 595 235 658 q 313 465 289 532 q 354 330 336 397 q 383 208 372 263 l 389 208 q 465 448 440 326 q 500 689 490 569 l 703 689 q 667 514 688 597 q 616 349 646 431 q 545 181 586 267 q 447 0 504 96 l 253 0 z \"},\"ξ\":{\"ha\":651,\"x_min\":24,\"x_max\":629,\"o\":\"m 544 -260 l 385 -207 q 433 -140 415 -167 q 450 -86 450 -114 q 422 -43 450 -58 q 317 -11 394 -28 q 217 19 264 0 q 134 69 169 38 q 78 145 99 100 q 58 256 58 190 q 74 340 58 300 q 115 413 89 381 q 175 470 140 446 q 249 507 210 494 l 249 513 q 155 585 188 536 q 122 697 122 635 q 138 768 122 733 q 186 825 154 803 q 149 823 167 824 q 113 821 132 822 q 73 817 94 819 q 24 813 51 815 l 24 974 l 615 974 l 615 813 l 453 813 q 361 780 396 813 q 326 690 326 747 q 335 644 326 667 q 359 603 343 621 q 397 576 375 586 q 446 565 418 565 q 497 567 475 565 q 547 578 519 569 l 547 418 q 489 428 515 425 q 435 431 463 431 q 369 420 400 431 q 317 391 339 410 q 281 346 294 372 q 268 288 268 319 q 278 229 268 251 q 311 192 289 207 q 367 167 333 176 q 447 149 401 157 q 538 123 503 138 q 594 88 574 108 q 622 38 614 67 q 629 -32 629 8 q 609 -130 629 -68 q 544 -260 589 -192 z \"},\"ο\":{\"ha\":768,\"x_min\":50,\"x_max\":718,\"o\":\"m 383 -17 q 258 8 318 -17 q 151 78 197 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 151 611 106 565 q 258 681 197 657 q 383 706 318 706 q 510 681 450 706 q 617 611 571 657 q 690 498 663 565 q 718 344 718 431 q 690 191 718 258 q 617 78 663 124 q 510 8 571 32 q 383 -17 450 -17 m 383 149 q 478 201 449 149 q 508 344 508 254 q 478 488 508 435 q 383 540 449 540 q 290 488 319 540 q 260 344 260 435 q 290 201 260 254 q 383 149 319 149 z \"},\"π\":{\"ha\":882,\"x_min\":25,\"x_max\":850,\"o\":\"m 725 -17 q 628 0 667 -17 q 565 48 589 17 q 530 122 540 79 q 519 219 519 165 q 520 269 519 235 q 522 346 521 303 q 524 437 524 389 q 525 528 525 485 l 365 528 q 354 265 365 404 q 329 -12 343 125 l 125 0 q 163 276 150 139 q 175 528 175 413 l 25 528 l 25 681 l 128 689 l 850 689 l 850 528 l 721 528 q 716 431 718 482 q 713 336 714 381 q 711 258 711 292 q 711 211 711 224 q 727 162 711 175 q 774 149 743 149 q 797 150 783 149 q 825 154 810 151 l 849 4 q 797 -10 829 -4 q 725 -17 764 -17 z \"},\"ρ\":{\"ha\":790,\"x_min\":85,\"x_max\":735,\"o\":\"m 85 -246 l 85 329 q 110 498 85 426 q 179 615 135 569 q 283 683 224 661 q 414 706 343 706 q 650 614 565 706 q 735 356 735 522 q 710 198 735 267 q 647 81 686 129 q 556 8 607 33 q 450 -17 504 -17 q 360 -1 406 -17 q 276 60 314 15 q 284 -94 281 -19 q 290 -246 288 -169 l 85 -246 m 401 150 q 490 198 453 150 q 526 353 526 246 q 407 539 526 539 q 313 488 349 539 q 276 349 276 436 l 276 206 q 340 161 308 172 q 401 150 371 150 z \"},\"σ\":{\"ha\":796,\"x_min\":50,\"x_max\":779,\"o\":\"m 376 -17 q 250 6 310 -17 q 146 74 190 29 q 76 185 101 119 q 50 336 50 250 q 78 492 50 425 q 153 602 107 558 q 260 667 200 646 q 386 689 321 689 l 779 689 l 779 521 q 727 526 751 524 q 680 531 703 529 q 634 535 657 533 q 585 536 611 536 l 585 531 q 664 442 636 501 q 692 304 692 383 q 668 170 692 229 q 603 69 644 111 q 503 6 561 28 q 376 -17 446 -17 m 379 149 q 466 194 435 149 q 497 325 497 240 q 490 401 497 365 q 467 465 482 438 q 430 508 451 492 q 379 524 408 524 q 292 480 324 524 q 260 336 260 436 q 292 197 260 246 q 379 149 324 149 z \"},\"τ\":{\"ha\":683,\"x_min\":36,\"x_max\":647,\"o\":\"m 432 -17 q 341 0 378 -17 q 281 48 304 17 q 249 122 258 79 q 239 219 239 165 l 239 529 l 36 529 l 36 681 l 139 689 l 647 689 l 647 529 l 439 529 q 433 356 435 439 q 432 211 432 274 q 447 162 432 175 q 485 149 461 149 q 522 151 504 149 q 563 160 539 153 l 589 7 q 516 -10 556 -3 q 432 -17 476 -17 z \"},\"υ\":{\"ha\":739,\"x_min\":60,\"x_max\":679,\"o\":\"m 361 -17 q 228 5 283 -17 q 138 65 174 26 q 86 158 103 104 q 69 278 69 213 q 72 377 69 326 q 75 478 75 428 q 72 575 75 518 q 60 689 69 632 l 257 689 q 267 610 264 653 q 269 519 269 568 q 265 402 269 475 q 261 260 261 329 q 290 176 261 204 q 361 149 318 149 q 446 197 417 149 q 475 351 475 246 q 465 493 475 418 q 429 663 454 568 l 626 706 q 665 535 650 622 q 679 361 679 449 q 598 84 679 185 q 361 -17 517 -17 z \"},\"φ\":{\"ha\":1025,\"x_min\":50,\"x_max\":975,\"o\":\"m 260 344 q 303 197 260 249 q 419 142 346 146 l 419 547 q 303 492 346 543 q 260 344 260 440 m 765 344 q 723 492 765 440 q 606 547 681 543 l 606 142 q 722 197 679 146 q 765 344 765 249 m 419 -246 l 419 -11 q 281 17 347 -7 q 163 87 214 42 q 81 197 111 132 q 50 344 50 261 q 81 492 50 428 q 163 602 111 557 q 281 672 214 647 q 419 700 347 696 l 419 872 l 606 872 l 606 700 q 744 672 678 696 q 863 602 811 647 q 944 492 914 557 q 975 344 975 428 q 944 197 975 261 q 863 87 914 132 q 744 17 811 42 q 606 -11 678 -7 l 606 -246 l 419 -246 z \"},\"χ\":{\"ha\":731,\"x_min\":11,\"x_max\":750,\"o\":\"m 222 -262 l 11 -246 l 274 229 l 11 661 l 213 706 l 372 408 l 378 408 l 500 689 l 713 689 l 475 235 l 750 -218 l 549 -262 l 378 67 l 372 67 l 222 -262 z \"},\"ψ\":{\"ha\":1044,\"x_min\":61,\"x_max\":981,\"o\":\"m 426 -246 l 426 -17 q 261 14 328 -15 q 153 90 194 43 q 94 198 113 136 q 76 329 76 260 l 76 478 q 74 575 76 518 q 61 689 71 632 l 258 689 q 269 610 267 653 q 271 519 271 568 q 270 471 271 499 q 269 415 269 443 q 269 359 269 386 q 268 313 268 332 q 276 249 268 279 q 302 194 283 218 q 351 157 321 171 q 426 143 382 143 l 426 872 l 613 872 l 613 143 q 734 199 693 146 q 775 381 775 251 q 765 510 775 444 q 731 663 756 576 l 928 706 q 967 551 953 629 q 981 390 981 472 q 888 90 981 194 q 613 -17 794 -14 l 613 -246 l 426 -246 z \"},\"ω\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 z \"},\"ς\":{\"ha\":619,\"x_min\":50,\"x_max\":597,\"o\":\"m 485 -258 l 324 -206 q 372 -136 353 -165 q 392 -79 392 -107 q 374 -26 392 -46 q 314 10 357 -6 q 218 50 265 26 q 133 113 171 74 q 73 212 96 153 q 50 357 50 271 q 78 505 50 440 q 152 614 106 569 q 261 682 199 658 q 393 706 324 706 q 508 685 457 706 q 597 632 560 664 l 500 500 q 406 540 454 540 q 298 490 336 540 q 260 357 260 440 q 269 285 260 314 q 296 235 278 256 q 340 200 314 214 q 399 174 365 186 q 480 140 447 157 q 533 99 513 122 q 562 47 553 76 q 571 -26 571 17 q 550 -126 571 -62 q 485 -258 529 -190 z \"},\"ϐ\":{\"ha\":822,\"x_min\":89,\"x_max\":774,\"o\":\"m 443 -17 q 313 3 376 -17 q 200 65 250 22 q 119 174 150 107 q 89 338 89 242 l 89 647 q 108 782 89 719 q 165 890 126 844 q 261 962 203 936 q 399 988 319 988 q 510 973 456 988 q 606 928 564 958 q 674 850 649 897 q 700 738 700 803 q 666 614 700 667 q 558 529 632 561 l 558 524 q 645 495 606 517 q 713 441 685 474 q 758 366 742 408 q 774 275 774 324 q 747 145 774 200 q 676 54 721 90 q 570 1 631 18 q 443 -17 510 -17 m 286 635 q 282 535 283 582 q 394 571 350 551 q 462 613 438 590 q 495 660 486 635 q 504 715 504 686 q 476 800 504 774 q 408 826 449 826 q 319 775 349 826 q 286 635 290 724 m 436 160 q 533 192 493 160 q 572 289 572 225 q 539 385 572 344 q 431 426 506 426 q 372 417 404 426 q 279 389 339 408 l 279 356 q 294 264 279 301 q 331 203 308 226 q 381 170 353 181 q 436 160 408 160 z \"},\"ϑ\":{\"ha\":763,\"x_min\":69,\"x_max\":696,\"o\":\"m 257 713 q 267 652 257 682 q 302 601 276 622 q 375 569 328 579 q 497 567 422 558 q 481 692 493 642 q 449 773 468 743 q 406 815 431 803 q 354 825 382 826 q 282 790 307 824 q 257 713 257 757 m 381 -17 q 253 2 306 -17 q 168 56 201 21 q 119 138 135 90 q 104 243 104 186 q 103 326 104 292 q 92 393 101 361 l 283 393 q 290 371 288 385 q 294 340 293 357 q 295 306 294 324 q 296 272 296 288 q 319 175 296 201 q 388 149 343 149 q 432 160 413 149 q 465 203 451 171 q 488 292 479 235 q 499 443 496 350 q 345 442 411 433 q 231 471 279 450 q 152 522 183 492 q 103 588 121 553 q 77 657 85 622 q 69 721 69 692 q 90 826 69 776 q 148 911 111 875 q 235 969 185 947 q 344 990 286 990 q 605 862 514 990 q 696 493 696 733 q 618 108 696 233 q 381 -17 540 -17 z \"},\"ϕ\":{\"ha\":1025,\"x_min\":50,\"x_max\":975,\"o\":\"m 422 -246 l 422 -11 q 279 17 347 -8 q 160 88 211 42 q 80 203 110 135 q 50 358 50 271 q 60 452 50 404 q 90 547 71 500 q 135 637 110 593 q 193 717 161 681 l 363 599 q 284 472 310 533 q 258 339 258 410 q 297 201 258 254 q 422 140 335 147 l 422 358 q 442 517 422 451 q 497 625 463 583 q 580 686 532 667 q 685 706 628 706 q 897 617 819 706 q 975 367 975 529 q 944 210 975 279 q 863 94 914 142 q 746 19 813 46 q 608 -11 679 -7 q 617 -246 610 -129 l 422 -246 m 603 388 q 603 265 603 326 q 604 140 603 203 q 722 197 679 149 q 765 353 765 246 q 742 496 765 453 q 678 539 718 539 q 623 503 643 539 q 603 388 603 467 z \"},\"ά\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 332 796 l 379 1101 l 578 1068 l 468 771 l 332 796 z \"},\"έ\":{\"ha\":654,\"x_min\":50,\"x_max\":626,\"o\":\"m 372 -17 q 247 -3 306 -17 q 144 36 188 10 q 75 103 100 63 q 50 196 50 143 q 85 305 50 267 q 183 360 121 343 l 183 365 q 105 424 131 382 q 79 508 79 467 q 103 597 79 560 q 169 658 128 635 q 263 694 210 682 q 375 706 317 706 q 499 687 438 706 q 613 635 561 668 l 538 504 q 386 550 468 550 q 308 531 338 550 q 279 481 279 513 q 376 419 279 419 q 424 421 399 419 q 472 425 449 422 l 472 279 q 413 283 443 282 q 354 285 382 285 q 275 269 300 285 q 250 217 250 253 q 285 160 250 181 q 392 139 321 139 q 466 150 425 139 q 547 192 507 161 l 626 63 q 499 -1 560 14 q 372 -17 439 -17 m 286 796 l 333 1101 l 532 1068 l 422 771 l 286 796 z \"},\"ή\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 350 796 l 397 1101 l 596 1068 l 486 771 l 350 796 z \"},\"ί\":{\"ha\":418,\"x_min\":90,\"x_max\":407,\"o\":\"m 286 -17 q 191 0 229 -17 q 131 47 153 17 q 99 119 108 76 q 90 215 90 163 l 90 689 l 296 689 q 292 562 294 628 q 287 431 289 496 q 283 308 285 367 q 282 207 282 250 q 297 161 282 174 q 339 149 311 149 q 360 151 347 149 q 383 157 372 153 l 407 6 q 358 -10 385 -4 q 286 -17 331 -17 m 117 796 l 164 1101 l 363 1068 l 253 771 l 117 796 z \"},\"ϊ\":{\"ha\":418,\"x_min\":-60,\"x_max\":443,\"o\":\"m 286 -17 q 191 0 229 -17 q 131 47 153 17 q 99 119 108 76 q 90 215 90 163 l 90 689 l 296 689 q 292 562 294 628 q 287 431 289 496 q 283 308 285 367 q 282 207 282 250 q 297 161 282 174 q 339 149 311 149 q 360 151 347 149 q 383 157 372 153 l 407 6 q 358 -10 385 -4 q 286 -17 331 -17 m 40 790 q -32 819 -4 790 q -60 890 -60 847 q -32 960 -60 932 q 40 989 -4 989 q 112 960 85 989 q 139 890 139 932 q 112 819 139 847 q 40 790 85 790 m 343 790 q 272 819 299 790 q 244 890 244 847 q 272 960 244 932 q 343 989 299 989 q 415 960 388 989 q 443 890 443 932 q 415 819 443 847 q 343 790 388 790 z \"},\"ό\":{\"ha\":768,\"x_min\":50,\"x_max\":718,\"o\":\"m 383 -17 q 258 8 318 -17 q 151 78 197 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 151 611 106 565 q 258 681 197 657 q 383 706 318 706 q 510 681 450 706 q 617 611 571 657 q 690 498 663 565 q 718 344 718 431 q 690 191 718 258 q 617 78 663 124 q 510 8 571 32 q 383 -17 450 -17 m 383 149 q 478 201 449 149 q 508 344 508 254 q 478 488 508 435 q 383 540 449 540 q 290 488 319 540 q 260 344 260 435 q 290 201 260 254 q 383 149 319 149 m 313 796 l 360 1101 l 558 1068 l 449 771 l 313 796 z \"},\"ύ\":{\"ha\":739,\"x_min\":60,\"x_max\":679,\"o\":\"m 361 -17 q 228 5 283 -17 q 138 65 174 26 q 86 158 103 104 q 69 278 69 213 q 72 377 69 326 q 75 478 75 428 q 72 575 75 518 q 60 689 69 632 l 257 689 q 267 610 264 653 q 269 519 269 568 q 265 402 269 475 q 261 260 261 329 q 290 176 261 204 q 361 149 318 149 q 446 197 417 149 q 475 351 475 246 q 465 493 475 418 q 429 663 454 568 l 626 706 q 665 535 650 622 q 679 361 679 449 q 598 84 679 185 q 361 -17 517 -17 m 290 796 l 338 1101 l 536 1068 l 426 771 l 290 796 z \"},\"ϋ\":{\"ha\":739,\"x_min\":60,\"x_max\":679,\"o\":\"m 361 -17 q 228 5 283 -17 q 138 65 174 26 q 86 158 103 104 q 69 278 69 213 q 72 377 69 326 q 75 478 75 428 q 72 575 75 518 q 60 689 69 632 l 257 689 q 267 610 264 653 q 269 519 269 568 q 265 402 269 475 q 261 260 261 329 q 290 176 261 204 q 361 149 318 149 q 446 197 417 149 q 475 351 475 246 q 465 493 475 418 q 429 663 454 568 l 626 706 q 665 535 650 622 q 679 361 679 449 q 598 84 679 185 q 361 -17 517 -17 m 214 790 q 142 819 169 790 q 114 890 114 847 q 142 960 114 932 q 214 989 169 989 q 285 960 258 989 q 313 890 313 932 q 285 819 313 847 q 214 790 258 790 m 517 790 q 445 819 472 790 q 418 890 418 847 q 445 960 418 932 q 517 989 472 989 q 589 960 561 989 q 617 890 617 932 q 589 819 617 847 q 517 790 561 790 z \"},\"ώ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 443 796 l 490 1101 l 689 1068 l 579 771 l 443 796 z \"},\"ΐ\":{\"ha\":418,\"x_min\":-71,\"x_max\":454,\"o\":\"m 286 -17 q 191 0 229 -17 q 131 47 153 17 q 99 119 108 76 q 90 215 90 163 l 90 689 l 296 689 q 292 562 294 628 q 287 431 289 496 q 283 308 285 367 q 282 207 282 250 q 297 161 282 174 q 339 149 311 149 q 360 151 347 149 q 383 157 372 153 l 407 6 q 358 -10 385 -4 q 286 -17 331 -17 m 121 807 l 171 1113 l 314 1083 l 211 788 l 121 807 m 7 811 q -48 833 -25 811 q -71 890 -71 854 q -48 947 -71 926 q 7 968 -25 968 q 63 947 40 968 q 86 890 86 926 q 63 833 86 854 q 7 811 40 811 m 376 811 q 320 833 343 811 q 297 890 297 854 q 320 947 297 926 q 376 968 343 968 q 431 947 408 968 q 454 890 454 926 q 431 833 454 854 q 376 811 408 811 z \"},\"ΰ\":{\"ha\":739,\"x_min\":60,\"x_max\":679,\"o\":\"m 361 -17 q 228 5 283 -17 q 138 65 174 26 q 86 158 103 104 q 69 278 69 213 q 72 377 69 326 q 75 478 75 428 q 72 575 75 518 q 60 689 69 632 l 257 689 q 267 610 264 653 q 269 519 269 568 q 265 402 269 475 q 261 260 261 329 q 290 176 261 204 q 361 149 318 149 q 446 197 417 149 q 475 351 475 246 q 465 493 475 418 q 429 663 454 568 l 626 706 q 665 535 650 622 q 679 361 679 449 q 598 84 679 185 q 361 -17 517 -17 m 294 807 l 344 1113 l 488 1083 l 385 788 l 294 807 m 181 811 q 126 833 149 811 q 103 890 103 854 q 126 947 103 926 q 181 968 149 968 q 237 947 214 968 q 260 890 260 926 q 237 833 260 854 q 181 811 214 811 m 550 811 q 494 833 517 811 q 471 890 471 854 q 494 947 471 926 q 550 968 517 968 q 605 947 582 968 q 628 890 628 926 q 605 833 628 854 q 550 811 582 811 z \"},\"Ἀ\":{\"ha\":910,\"x_min\":-10,\"x_max\":918,\"o\":\"m 433 458 l 411 375 l 604 375 l 583 458 q 546 603 564 526 q 510 750 528 679 l 504 750 q 470 602 488 678 q 433 458 453 526 m 106 0 l 389 906 l 635 906 l 918 0 l 701 0 l 646 215 l 369 215 l 314 0 l 106 0 m 54 597 l 39 678 q 81 701 63 686 q 100 747 100 715 q 75 789 100 772 q -10 810 50 806 l 14 913 q 195 870 143 910 q 247 769 247 831 q 232 696 247 726 q 190 644 217 665 q 128 613 164 624 q 54 597 93 601 z \"},\"Ἁ\":{\"ha\":888,\"x_min\":-17,\"x_max\":896,\"o\":\"m 411 458 l 389 375 l 582 375 l 561 458 q 524 603 542 526 q 488 750 506 679 l 482 750 q 448 602 465 678 q 411 458 431 526 m 83 0 l 367 906 l 613 906 l 896 0 l 679 0 l 624 215 l 347 215 l 292 0 l 83 0 m 176 597 q 101 613 136 601 q 40 644 67 624 q -1 696 14 665 q -17 769 -17 726 q 35 870 -17 831 q 217 913 88 910 l 240 810 q 155 789 181 806 q 129 747 129 772 q 149 701 129 715 q 192 678 168 686 l 176 597 z \"},\"Ὰ\":{\"ha\":864,\"x_min\":-21,\"x_max\":872,\"o\":\"m 388 458 l 365 375 l 558 375 l 538 458 q 500 603 518 526 q 464 750 482 679 l 458 750 q 424 602 442 678 q 388 458 407 526 m 60 0 l 343 906 l 589 906 l 872 0 l 656 0 l 600 215 l 324 215 l 268 0 l 60 0 m 63 611 l -21 906 l 153 931 l 192 635 l 63 611 z \"},\"Ά\":{\"ha\":864,\"x_min\":-7,\"x_max\":872,\"o\":\"m 388 458 l 365 375 l 558 375 l 538 458 q 500 603 518 526 q 464 750 482 679 l 458 750 q 424 602 442 678 q 388 458 407 526 m 60 0 l 343 906 l 589 906 l 872 0 l 656 0 l 600 215 l 324 215 l 268 0 l 60 0 m -7 635 l 32 931 l 206 906 l 122 611 l -7 635 z \"},\"Ἂ\":{\"ha\":1142,\"x_min\":-12,\"x_max\":1150,\"o\":\"m 665 458 l 643 375 l 836 375 l 815 458 q 778 603 796 526 q 742 750 760 679 l 736 750 q 702 602 719 678 q 665 458 685 526 m 338 0 l 621 906 l 867 906 l 1150 0 l 933 0 l 878 215 l 601 215 l 546 0 l 338 0 m 340 611 l 257 906 l 431 931 l 469 635 l 340 611 m 51 607 l 35 688 q 68 713 54 699 q 82 751 82 726 q 60 795 82 776 q -12 819 39 814 l 11 922 q 167 878 117 918 q 217 772 217 839 q 202 707 217 735 q 164 658 188 679 q 110 625 140 638 q 51 607 81 613 z \"},\"Ἃ\":{\"ha\":1140,\"x_min\":-17,\"x_max\":1149,\"o\":\"m 664 458 l 642 375 l 835 375 l 814 458 q 776 603 794 526 q 740 750 758 679 l 735 750 q 701 602 718 678 q 664 458 683 526 m 336 0 l 619 906 l 865 906 l 1149 0 l 932 0 l 876 215 l 600 215 l 544 0 l 336 0 m 339 611 l 256 906 l 429 931 l 468 635 l 339 611 m 149 607 q 90 625 119 613 q 36 658 60 638 q -2 707 13 679 q -17 772 -17 735 q 33 878 -17 839 q 189 922 83 918 l 213 819 q 140 795 161 814 q 118 751 118 776 q 132 713 118 726 q 165 688 146 699 l 149 607 z \"},\"Ἄ\":{\"ha\":1128,\"x_min\":-12,\"x_max\":1136,\"o\":\"m 651 458 l 629 375 l 822 375 l 801 458 q 764 603 782 526 q 728 750 746 679 l 722 750 q 688 602 706 678 q 651 458 671 526 m 324 0 l 607 906 l 853 906 l 1136 0 l 919 0 l 864 215 l 588 215 l 532 0 l 324 0 m 258 635 l 299 931 l 472 906 l 388 611 l 258 635 m 51 607 l 35 688 q 68 713 54 699 q 82 751 82 726 q 60 795 82 776 q -12 819 39 814 l 11 922 q 167 878 117 918 q 217 772 217 839 q 202 707 217 735 q 164 658 188 679 q 110 625 140 638 q 51 607 81 613 z \"},\"Ἅ\":{\"ha\":1126,\"x_min\":-17,\"x_max\":1135,\"o\":\"m 650 458 l 628 375 l 821 375 l 800 458 q 763 603 781 526 q 726 750 744 679 l 721 750 q 687 602 704 678 q 650 458 669 526 m 322 0 l 606 906 l 851 906 l 1135 0 l 918 0 l 863 215 l 586 215 l 531 0 l 322 0 m 257 635 l 297 931 l 471 906 l 386 611 l 257 635 m 149 607 q 90 625 119 613 q 36 658 60 638 q -2 707 13 679 q -17 772 -17 735 q 33 878 -17 839 q 189 922 83 918 l 213 819 q 140 795 161 814 q 118 751 118 776 q 132 713 118 726 q 165 688 146 699 l 149 607 z \"},\"Ἆ\":{\"ha\":943,\"x_min\":-33,\"x_max\":951,\"o\":\"m 467 458 l 444 375 l 638 375 l 617 458 q 579 603 597 526 q 543 750 561 679 l 538 750 q 503 602 521 678 q 467 458 486 526 m 139 0 l 422 906 l 668 906 l 951 0 l 735 0 l 679 215 l 403 215 l 347 0 l 139 0 m -33 808 q 5 904 -24 879 q 83 929 33 929 q 127 922 108 929 q 161 906 146 915 q 190 890 176 897 q 218 883 204 883 q 242 891 233 883 q 254 922 250 899 l 343 910 q 305 813 333 838 q 226 789 276 789 q 183 796 201 789 q 149 811 164 803 q 119 826 133 819 q 90 833 104 833 q 67 826 75 833 q 56 796 58 818 l -33 808 m 106 560 l 93 625 q 124 633 113 628 q 135 650 135 639 q 116 671 135 663 q 44 682 97 679 l 64 764 q 223 737 178 760 q 268 671 268 714 q 220 593 268 619 q 106 560 172 567 z \"},\"Ἇ\":{\"ha\":943,\"x_min\":-33,\"x_max\":951,\"o\":\"m 467 458 l 444 375 l 638 375 l 617 458 q 579 603 597 526 q 543 750 561 679 l 538 750 q 503 602 521 678 q 467 458 486 526 m 139 0 l 422 906 l 668 906 l 951 0 l 735 0 l 679 215 l 403 215 l 347 0 l 139 0 m 203 560 q 88 593 136 567 q 40 671 40 619 q 51 708 40 692 q 85 737 61 725 q 149 755 110 749 q 246 764 189 761 l 265 682 q 193 671 213 679 q 174 650 174 663 q 217 625 174 632 l 203 560 m -33 808 q 5 904 -24 879 q 83 929 33 929 q 127 922 108 929 q 161 906 146 915 q 190 890 176 897 q 218 883 204 883 q 242 891 233 883 q 254 922 250 899 l 343 910 q 305 813 333 838 q 226 789 276 789 q 183 796 201 789 q 149 811 164 803 q 119 826 133 819 q 90 833 104 833 q 67 826 75 833 q 56 796 58 818 l -33 808 z \"},\"Ᾰ\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 393 968 q 233 1017 289 968 q 167 1158 176 1065 l 278 1178 q 317 1110 288 1135 q 393 1086 346 1086 q 469 1110 440 1086 q 508 1178 499 1135 l 619 1158 q 553 1017 610 1065 q 393 968 497 968 z \"},\"Ᾱ\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 183 1001 l 183 1132 l 603 1132 l 603 1001 l 183 1001 z \"},\"Ἐ\":{\"ha\":988,\"x_min\":-12,\"x_max\":914,\"o\":\"m 333 0 l 333 906 l 900 906 l 900 733 l 538 733 l 538 551 l 846 551 l 846 381 l 538 381 l 538 172 l 914 172 l 914 0 l 333 0 m 51 597 l 36 678 q 78 701 60 686 q 97 747 97 715 q 72 789 97 772 q -12 810 47 806 l 11 913 q 192 870 140 910 q 244 769 244 831 q 229 696 244 726 q 188 644 214 665 q 126 613 161 624 q 51 597 90 601 z \"},\"Ἑ\":{\"ha\":988,\"x_min\":-17,\"x_max\":914,\"o\":\"m 333 0 l 333 906 l 900 906 l 900 733 l 538 733 l 538 551 l 846 551 l 846 381 l 538 381 l 538 172 l 914 172 l 914 0 l 333 0 m 176 597 q 101 613 136 601 q 40 644 67 624 q -1 696 14 665 q -17 769 -17 726 q 35 870 -17 831 q 217 913 88 910 l 240 810 q 155 789 181 806 q 129 747 129 772 q 149 701 129 715 q 192 678 168 686 l 176 597 z \"},\"Ὲ\":{\"ha\":926,\"x_min\":-31,\"x_max\":853,\"o\":\"m 272 0 l 272 906 l 839 906 l 839 733 l 476 733 l 476 551 l 785 551 l 785 381 l 476 381 l 476 172 l 853 172 l 853 0 l 272 0 m 53 611 l -31 906 l 143 931 l 182 635 l 53 611 z \"},\"Έ\":{\"ha\":926,\"x_min\":-17,\"x_max\":853,\"o\":\"m 272 0 l 272 906 l 839 906 l 839 733 l 476 733 l 476 551 l 785 551 l 785 381 l 476 381 l 476 172 l 853 172 l 853 0 l 272 0 m -17 635 l 22 931 l 196 906 l 113 611 l -17 635 z \"},\"Ἒ\":{\"ha\":1214,\"x_min\":-12,\"x_max\":1140,\"o\":\"m 560 0 l 560 906 l 1126 906 l 1126 733 l 764 733 l 764 551 l 1072 551 l 1072 381 l 764 381 l 764 172 l 1140 172 l 1140 0 l 560 0 m 340 611 l 257 906 l 431 931 l 469 635 l 340 611 m 51 607 l 35 688 q 68 713 54 699 q 82 751 82 726 q 60 795 82 776 q -12 819 39 814 l 11 922 q 167 878 117 918 q 217 772 217 839 q 202 707 217 735 q 164 658 188 679 q 110 625 140 638 q 51 607 81 613 z \"},\"Ἓ\":{\"ha\":1213,\"x_min\":-17,\"x_max\":1139,\"o\":\"m 558 0 l 558 906 l 1125 906 l 1125 733 l 763 733 l 763 551 l 1071 551 l 1071 381 l 763 381 l 763 172 l 1139 172 l 1139 0 l 558 0 m 339 611 l 256 906 l 429 931 l 468 635 l 339 611 m 149 607 q 90 625 119 613 q 36 658 60 638 q -2 707 13 679 q -17 772 -17 735 q 33 878 -17 839 q 189 922 83 918 l 213 819 q 140 795 161 814 q 118 751 118 776 q 132 713 118 726 q 165 688 146 699 l 149 607 z \"},\"Ἔ\":{\"ha\":1200,\"x_min\":-12,\"x_max\":1126,\"o\":\"m 546 0 l 546 906 l 1113 906 l 1113 733 l 750 733 l 750 551 l 1058 551 l 1058 381 l 750 381 l 750 172 l 1126 172 l 1126 0 l 546 0 m 258 635 l 299 931 l 472 906 l 388 611 l 258 635 m 51 607 l 35 688 q 68 713 54 699 q 82 751 82 726 q 60 795 82 776 q -12 819 39 814 l 11 922 q 167 878 117 918 q 217 772 217 839 q 202 707 217 735 q 164 658 188 679 q 110 625 140 638 q 51 607 81 613 z \"},\"Ἕ\":{\"ha\":1199,\"x_min\":-17,\"x_max\":1125,\"o\":\"m 544 0 l 544 906 l 1111 906 l 1111 733 l 749 733 l 749 551 l 1057 551 l 1057 381 l 749 381 l 749 172 l 1125 172 l 1125 0 l 544 0 m 257 635 l 297 931 l 471 906 l 386 611 l 257 635 m 149 607 q 90 625 119 613 q 36 658 60 638 q -2 707 13 679 q -17 772 -17 735 q 33 878 -17 839 q 189 922 83 918 l 213 819 q 140 795 161 814 q 118 751 118 776 q 132 713 118 726 q 165 688 146 699 l 149 607 z \"},\"Ἠ\":{\"ha\":1161,\"x_min\":-12,\"x_max\":1056,\"o\":\"m 333 0 l 333 906 l 538 906 l 538 557 l 850 557 l 850 906 l 1056 906 l 1056 0 l 850 0 l 850 378 l 538 378 l 538 0 l 333 0 m 51 597 l 36 678 q 78 701 60 686 q 97 747 97 715 q 72 789 97 772 q -12 810 47 806 l 11 913 q 192 870 140 910 q 244 769 244 831 q 229 696 244 726 q 188 644 214 665 q 126 613 161 624 q 51 597 90 601 z \"},\"Ἡ\":{\"ha\":1161,\"x_min\":-17,\"x_max\":1056,\"o\":\"m 333 0 l 333 906 l 538 906 l 538 557 l 850 557 l 850 906 l 1056 906 l 1056 0 l 850 0 l 850 378 l 538 378 l 538 0 l 333 0 m 176 597 q 101 613 136 601 q 40 644 67 624 q -1 696 14 665 q -17 769 -17 726 q 35 870 -17 831 q 217 913 88 910 l 240 810 q 155 789 181 806 q 129 747 129 772 q 149 701 129 715 q 192 678 168 686 l 176 597 z \"},\"Ὴ\":{\"ha\":1100,\"x_min\":-31,\"x_max\":994,\"o\":\"m 272 0 l 272 906 l 476 906 l 476 557 l 789 557 l 789 906 l 994 906 l 994 0 l 789 0 l 789 378 l 476 378 l 476 0 l 272 0 m 53 611 l -31 906 l 143 931 l 182 635 l 53 611 z \"},\"Ή\":{\"ha\":1100,\"x_min\":-17,\"x_max\":994,\"o\":\"m 272 0 l 272 906 l 476 906 l 476 557 l 789 557 l 789 906 l 994 906 l 994 0 l 789 0 l 789 378 l 476 378 l 476 0 l 272 0 m -17 635 l 22 931 l 196 906 l 113 611 l -17 635 z \"},\"Ἢ\":{\"ha\":1388,\"x_min\":-12,\"x_max\":1282,\"o\":\"m 560 0 l 560 906 l 764 906 l 764 557 l 1076 557 l 1076 906 l 1282 906 l 1282 0 l 1076 0 l 1076 378 l 764 378 l 764 0 l 560 0 m 340 611 l 257 906 l 431 931 l 469 635 l 340 611 m 51 607 l 35 688 q 68 713 54 699 q 82 751 82 726 q 60 795 82 776 q -12 819 39 814 l 11 922 q 167 878 117 918 q 217 772 217 839 q 202 707 217 735 q 164 658 188 679 q 110 625 140 638 q 51 607 81 613 z \"},\"Ἣ\":{\"ha\":1386,\"x_min\":-17,\"x_max\":1281,\"o\":\"m 558 0 l 558 906 l 763 906 l 763 557 l 1075 557 l 1075 906 l 1281 906 l 1281 0 l 1075 0 l 1075 378 l 763 378 l 763 0 l 558 0 m 339 611 l 256 906 l 429 931 l 468 635 l 339 611 m 149 607 q 90 625 119 613 q 36 658 60 638 q -2 707 13 679 q -17 772 -17 735 q 33 878 -17 839 q 189 922 83 918 l 213 819 q 140 795 161 814 q 118 751 118 776 q 132 713 118 726 q 165 688 146 699 l 149 607 z \"},\"Ἤ\":{\"ha\":1375,\"x_min\":-12,\"x_max\":1268,\"o\":\"m 546 0 l 546 906 l 750 906 l 750 557 l 1063 557 l 1063 906 l 1268 906 l 1268 0 l 1063 0 l 1063 378 l 750 378 l 750 0 l 546 0 m 258 635 l 299 931 l 472 906 l 388 611 l 258 635 m 51 607 l 35 688 q 68 713 54 699 q 82 751 82 726 q 60 795 82 776 q -12 819 39 814 l 11 922 q 167 878 117 918 q 217 772 217 839 q 202 707 217 735 q 164 658 188 679 q 110 625 140 638 q 51 607 81 613 z \"},\"Ἥ\":{\"ha\":1372,\"x_min\":-17,\"x_max\":1267,\"o\":\"m 544 0 l 544 906 l 749 906 l 749 557 l 1061 557 l 1061 906 l 1267 906 l 1267 0 l 1061 0 l 1061 378 l 749 378 l 749 0 l 544 0 m 257 635 l 297 931 l 471 906 l 386 611 l 257 635 m 149 607 q 90 625 119 613 q 36 658 60 638 q -2 707 13 679 q -17 772 -17 735 q 33 878 -17 839 q 189 922 83 918 l 213 819 q 140 795 161 814 q 118 751 118 776 q 132 713 118 726 q 165 688 146 699 l 149 607 z \"},\"Ἦ\":{\"ha\":1244,\"x_min\":-33,\"x_max\":1139,\"o\":\"m 417 0 l 417 906 l 621 906 l 621 557 l 933 557 l 933 906 l 1139 906 l 1139 0 l 933 0 l 933 378 l 621 378 l 621 0 l 417 0 m -33 808 q 5 904 -24 879 q 83 929 33 929 q 127 922 108 929 q 161 906 146 915 q 190 890 176 897 q 218 883 204 883 q 242 891 233 883 q 254 922 250 899 l 343 910 q 305 813 333 838 q 226 789 276 789 q 183 796 201 789 q 149 811 164 803 q 119 826 133 819 q 90 833 104 833 q 67 826 75 833 q 56 796 58 818 l -33 808 m 106 560 l 93 625 q 124 633 113 628 q 135 650 135 639 q 116 671 135 663 q 44 682 97 679 l 64 764 q 223 737 178 760 q 268 671 268 714 q 220 593 268 619 q 106 560 172 567 z \"},\"Ἧ\":{\"ha\":1244,\"x_min\":-33,\"x_max\":1139,\"o\":\"m 417 0 l 417 906 l 621 906 l 621 557 l 933 557 l 933 906 l 1139 906 l 1139 0 l 933 0 l 933 378 l 621 378 l 621 0 l 417 0 m 203 560 q 88 593 136 567 q 40 671 40 619 q 51 708 40 692 q 85 737 61 725 q 149 755 110 749 q 246 764 189 761 l 265 682 q 193 671 213 679 q 174 650 174 663 q 217 625 174 632 l 203 560 m -33 808 q 5 904 -24 879 q 83 929 33 929 q 127 922 108 929 q 161 906 146 915 q 190 890 176 897 q 218 883 204 883 q 242 891 233 883 q 254 922 250 899 l 343 910 q 305 813 333 838 q 226 789 276 789 q 183 796 201 789 q 149 811 164 803 q 119 826 133 819 q 90 833 104 833 q 67 826 75 833 q 56 796 58 818 l -33 808 z \"},\"Ἰ\":{\"ha\":644,\"x_min\":-12,\"x_max\":538,\"o\":\"m 333 0 l 333 906 l 538 906 l 538 0 l 333 0 m 51 597 l 36 678 q 78 701 60 686 q 97 747 97 715 q 72 789 97 772 q -12 810 47 806 l 11 913 q 192 870 140 910 q 244 769 244 831 q 229 696 244 726 q 188 644 214 665 q 126 613 161 624 q 51 597 90 601 z \"},\"Ἱ\":{\"ha\":644,\"x_min\":-17,\"x_max\":538,\"o\":\"m 333 0 l 333 906 l 538 906 l 538 0 l 333 0 m 176 597 q 101 613 136 601 q 40 644 67 624 q -1 696 14 665 q -17 769 -17 726 q 35 870 -17 831 q 217 913 88 910 l 240 810 q 155 789 181 806 q 129 747 129 772 q 149 701 129 715 q 192 678 168 686 l 176 597 z \"},\"Ὶ\":{\"ha\":583,\"x_min\":-31,\"x_max\":476,\"o\":\"m 272 0 l 272 906 l 476 906 l 476 0 l 272 0 m 53 611 l -31 906 l 143 931 l 182 635 l 53 611 z \"},\"Ί\":{\"ha\":583,\"x_min\":-17,\"x_max\":476,\"o\":\"m 272 0 l 272 906 l 476 906 l 476 0 l 272 0 m -17 635 l 22 931 l 196 906 l 113 611 l -17 635 z \"},\"Ἲ\":{\"ha\":871,\"x_min\":-12,\"x_max\":764,\"o\":\"m 560 0 l 560 906 l 764 906 l 764 0 l 560 0 m 340 611 l 257 906 l 431 931 l 469 635 l 340 611 m 51 607 l 35 688 q 68 713 54 699 q 82 751 82 726 q 60 795 82 776 q -12 819 39 814 l 11 922 q 167 878 117 918 q 217 772 217 839 q 202 707 217 735 q 164 658 188 679 q 110 625 140 638 q 51 607 81 613 z \"},\"Ἳ\":{\"ha\":869,\"x_min\":-17,\"x_max\":763,\"o\":\"m 558 0 l 558 906 l 763 906 l 763 0 l 558 0 m 339 611 l 256 906 l 429 931 l 468 635 l 339 611 m 149 607 q 90 625 119 613 q 36 658 60 638 q -2 707 13 679 q -17 772 -17 735 q 33 878 -17 839 q 189 922 83 918 l 213 819 q 140 795 161 814 q 118 751 118 776 q 132 713 118 726 q 165 688 146 699 l 149 607 z \"},\"Ἴ\":{\"ha\":857,\"x_min\":-12,\"x_max\":750,\"o\":\"m 546 0 l 546 906 l 750 906 l 750 0 l 546 0 m 258 635 l 299 931 l 472 906 l 388 611 l 258 635 m 51 607 l 35 688 q 68 713 54 699 q 82 751 82 726 q 60 795 82 776 q -12 819 39 814 l 11 922 q 167 878 117 918 q 217 772 217 839 q 202 707 217 735 q 164 658 188 679 q 110 625 140 638 q 51 607 81 613 z \"},\"Ἵ\":{\"ha\":856,\"x_min\":-17,\"x_max\":749,\"o\":\"m 544 0 l 544 906 l 749 906 l 749 0 l 544 0 m 257 635 l 297 931 l 471 906 l 386 611 l 257 635 m 149 607 q 90 625 119 613 q 36 658 60 638 q -2 707 13 679 q -17 772 -17 735 q 33 878 -17 839 q 189 922 83 918 l 213 819 q 140 795 161 814 q 118 751 118 776 q 132 713 118 726 q 165 688 146 699 l 149 607 z \"},\"Ἶ\":{\"ha\":728,\"x_min\":-33,\"x_max\":621,\"o\":\"m 417 0 l 417 906 l 621 906 l 621 0 l 417 0 m -33 808 q 5 904 -24 879 q 83 929 33 929 q 127 922 108 929 q 161 906 146 915 q 190 890 176 897 q 218 883 204 883 q 242 891 233 883 q 254 922 250 899 l 343 910 q 305 813 333 838 q 226 789 276 789 q 183 796 201 789 q 149 811 164 803 q 119 826 133 819 q 90 833 104 833 q 67 826 75 833 q 56 796 58 818 l -33 808 m 106 560 l 93 625 q 124 633 113 628 q 135 650 135 639 q 116 671 135 663 q 44 682 97 679 l 64 764 q 223 737 178 760 q 268 671 268 714 q 220 593 268 619 q 106 560 172 567 z \"},\"Ἷ\":{\"ha\":728,\"x_min\":-33,\"x_max\":621,\"o\":\"m 417 0 l 417 906 l 621 906 l 621 0 l 417 0 m 203 560 q 88 593 136 567 q 40 671 40 619 q 51 708 40 692 q 85 737 61 725 q 149 755 110 749 q 246 764 189 761 l 265 682 q 193 671 213 679 q 174 650 174 663 q 217 625 174 632 l 203 560 m -33 808 q 5 904 -24 879 q 83 929 33 929 q 127 922 108 929 q 161 906 146 915 q 190 890 176 897 q 218 883 204 883 q 242 891 233 883 q 254 922 250 899 l 343 910 q 305 813 333 838 q 226 789 276 789 q 183 796 201 789 q 149 811 164 803 q 119 826 133 819 q 90 833 104 833 q 67 826 75 833 q 56 796 58 818 l -33 808 z \"},\"Ῐ\":{\"ha\":418,\"x_min\":-18,\"x_max\":435,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 0 l 107 0 m 208 968 q 48 1017 104 968 q -18 1158 -8 1065 l 93 1178 q 132 1110 103 1135 q 208 1086 161 1086 q 285 1110 256 1086 q 324 1178 314 1135 l 435 1158 q 369 1017 425 1065 q 208 968 313 968 z \"},\"Ῑ\":{\"ha\":418,\"x_min\":-1,\"x_max\":418,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 0 l 107 0 m -1 1001 l -1 1132 l 418 1132 l 418 1001 l -1 1001 z \"},\"Ὀ\":{\"ha\":1149,\"x_min\":-12,\"x_max\":1083,\"o\":\"m 672 -17 q 505 16 581 -17 q 375 110 429 49 q 291 258 321 171 q 261 457 261 346 q 291 655 261 568 q 375 801 321 742 q 505 891 429 860 q 672 922 581 922 q 840 891 764 922 q 969 800 915 860 q 1053 653 1024 740 q 1083 457 1083 567 q 1053 258 1083 346 q 969 110 1024 171 q 840 16 915 49 q 672 -17 764 -17 m 672 160 q 819 240 765 160 q 874 457 874 319 q 819 669 874 593 q 672 746 765 746 q 525 669 579 746 q 471 457 471 593 q 525 240 471 319 q 672 160 579 160 m 51 597 l 36 678 q 78 701 60 686 q 97 747 97 715 q 72 789 97 772 q -12 810 47 806 l 11 913 q 192 870 140 910 q 244 769 244 831 q 229 696 244 726 q 188 644 214 665 q 126 613 161 624 q 51 597 90 601 z \"},\"Ὁ\":{\"ha\":1122,\"x_min\":-17,\"x_max\":1058,\"o\":\"m 647 -17 q 480 16 556 -17 q 350 110 404 49 q 266 258 296 171 q 236 457 236 346 q 266 655 236 568 q 350 801 296 742 q 480 891 404 860 q 647 922 556 922 q 815 891 739 922 q 944 800 890 860 q 1028 653 999 740 q 1058 457 1058 567 q 1028 258 1058 346 q 944 110 999 171 q 815 16 890 49 q 647 -17 739 -17 m 647 160 q 794 240 740 160 q 849 457 849 319 q 794 669 849 593 q 647 746 740 746 q 500 669 554 746 q 446 457 446 593 q 500 240 446 319 q 647 160 554 160 m 176 597 q 101 613 136 601 q 40 644 67 624 q -1 696 14 665 q -17 769 -17 726 q 35 870 -17 831 q 217 913 88 910 l 240 810 q 155 789 181 806 q 129 747 129 772 q 149 701 129 715 q 192 678 168 686 l 176 597 z \"},\"Ὸ\":{\"ha\":1097,\"x_min\":-31,\"x_max\":1033,\"o\":\"m 622 -17 q 455 16 531 -17 q 325 110 379 49 q 241 258 271 171 q 211 457 211 346 q 241 655 211 568 q 325 801 271 742 q 455 891 379 860 q 622 922 531 922 q 790 891 714 922 q 919 800 865 860 q 1003 653 974 740 q 1033 457 1033 567 q 1003 258 1033 346 q 919 110 974 171 q 790 16 865 49 q 622 -17 714 -17 m 622 160 q 769 240 715 160 q 824 457 824 319 q 769 669 824 593 q 622 746 715 746 q 475 669 529 746 q 421 457 421 593 q 475 240 421 319 q 622 160 529 160 m 53 611 l -31 906 l 143 931 l 182 635 l 53 611 z \"},\"Ό\":{\"ha\":1079,\"x_min\":-17,\"x_max\":1014,\"o\":\"m 603 -17 q 435 16 511 -17 q 306 110 360 49 q 222 258 251 171 q 192 457 192 346 q 222 655 192 568 q 306 801 251 742 q 435 891 360 860 q 603 922 511 922 q 770 891 694 922 q 900 800 846 860 q 984 653 954 740 q 1014 457 1014 567 q 984 258 1014 346 q 900 110 954 171 q 770 16 846 49 q 603 -17 694 -17 m 603 160 q 750 240 696 160 q 804 457 804 319 q 750 669 804 593 q 603 746 696 746 q 456 669 510 746 q 401 457 401 593 q 456 240 401 319 q 603 160 510 160 m -17 635 l 22 931 l 196 906 l 113 611 l -17 635 z \"},\"Ὂ\":{\"ha\":1367,\"x_min\":-12,\"x_max\":1321,\"o\":\"m 910 -17 q 742 16 818 -17 q 613 110 667 49 q 528 258 558 171 q 499 457 499 346 q 528 655 499 568 q 613 801 558 742 q 742 891 667 860 q 910 922 818 922 q 1077 891 1001 922 q 1207 800 1153 860 q 1291 653 1261 740 q 1321 457 1321 567 q 1291 258 1321 346 q 1207 110 1261 171 q 1077 16 1153 49 q 910 -17 1001 -17 m 910 160 q 1057 240 1003 160 q 1111 457 1111 319 q 1057 669 1111 593 q 910 746 1003 746 q 763 669 817 746 q 708 457 708 593 q 763 240 708 319 q 910 160 817 160 m 340 611 l 257 906 l 431 931 l 469 635 l 340 611 m 51 607 l 35 688 q 68 713 54 699 q 82 751 82 726 q 60 795 82 776 q -12 819 39 814 l 11 922 q 167 878 117 918 q 217 772 217 839 q 202 707 217 735 q 164 658 188 679 q 110 625 140 638 q 51 607 81 613 z \"},\"Ὃ\":{\"ha\":1383,\"x_min\":-17,\"x_max\":1319,\"o\":\"m 908 -17 q 741 16 817 -17 q 611 110 665 49 q 527 258 557 171 q 497 457 497 346 q 527 655 497 568 q 611 801 557 742 q 741 891 665 860 q 908 922 817 922 q 1076 891 1000 922 q 1206 800 1151 860 q 1290 653 1260 740 q 1319 457 1319 567 q 1290 258 1319 346 q 1206 110 1260 171 q 1076 16 1151 49 q 908 -17 1000 -17 m 908 160 q 1056 240 1001 160 q 1110 457 1110 319 q 1056 669 1110 593 q 908 746 1001 746 q 761 669 815 746 q 707 457 707 593 q 761 240 707 319 q 908 160 815 160 m 339 611 l 256 906 l 429 931 l 468 635 l 339 611 m 149 607 q 90 625 119 613 q 36 658 60 638 q -2 707 13 679 q -17 772 -17 735 q 33 878 -17 839 q 189 922 83 918 l 213 819 q 140 795 161 814 q 118 751 118 776 q 132 713 118 726 q 165 688 146 699 l 149 607 z \"},\"Ὄ\":{\"ha\":1353,\"x_min\":-12,\"x_max\":1288,\"o\":\"m 876 -17 q 709 16 785 -17 q 579 110 633 49 q 495 258 525 171 q 465 457 465 346 q 495 655 465 568 q 579 801 525 742 q 709 891 633 860 q 876 922 785 922 q 1044 891 968 922 q 1174 800 1119 860 q 1258 653 1228 740 q 1288 457 1288 567 q 1258 258 1288 346 q 1174 110 1228 171 q 1044 16 1119 49 q 876 -17 968 -17 m 876 160 q 1024 240 969 160 q 1078 457 1078 319 q 1024 669 1078 593 q 876 746 969 746 q 729 669 783 746 q 675 457 675 593 q 729 240 675 319 q 876 160 783 160 m 258 635 l 299 931 l 472 906 l 388 611 l 258 635 m 51 607 l 35 688 q 68 713 54 699 q 82 751 82 726 q 60 795 82 776 q -12 819 39 814 l 11 922 q 167 878 117 918 q 217 772 217 839 q 202 707 217 735 q 164 658 188 679 q 110 625 140 638 q 51 607 81 613 z \"},\"Ὅ\":{\"ha\":1351,\"x_min\":-17,\"x_max\":1286,\"o\":\"m 875 -17 q 708 16 783 -17 q 578 110 632 49 q 494 258 524 171 q 464 457 464 346 q 494 655 464 568 q 578 801 524 742 q 708 891 632 860 q 875 922 783 922 q 1042 891 967 922 q 1172 800 1118 860 q 1256 653 1226 740 q 1286 457 1286 567 q 1256 258 1286 346 q 1172 110 1226 171 q 1042 16 1118 49 q 875 -17 967 -17 m 875 160 q 1022 240 968 160 q 1076 457 1076 319 q 1022 669 1076 593 q 875 746 968 746 q 728 669 782 746 q 674 457 674 593 q 728 240 674 319 q 875 160 782 160 m 257 635 l 297 931 l 471 906 l 386 611 l 257 635 m 149 607 q 90 625 119 613 q 36 658 60 638 q -2 707 13 679 q -17 772 -17 735 q 33 878 -17 839 q 189 922 83 918 l 213 819 q 140 795 161 814 q 118 751 118 776 q 132 713 118 726 q 165 688 146 699 l 149 607 z \"},\"Ῥ\":{\"ha\":1054,\"x_min\":-17,\"x_max\":1004,\"o\":\"m 333 0 l 333 906 l 644 906 q 785 891 719 906 q 899 842 850 876 q 976 752 947 808 q 1004 614 1004 696 q 976 476 1004 535 q 899 381 947 418 q 786 325 850 343 q 650 307 722 307 l 538 307 l 538 0 l 333 0 m 538 469 l 638 469 q 804 614 804 469 q 760 714 804 685 q 632 743 715 743 l 538 743 l 538 469 m 176 597 q 101 613 136 601 q 40 644 67 624 q -1 696 14 665 q -17 769 -17 726 q 35 870 -17 831 q 217 913 88 910 l 240 810 q 155 789 181 806 q 129 747 129 772 q 149 701 129 715 q 192 678 168 686 l 176 597 z \"},\"Ὑ\":{\"ha\":1015,\"x_min\":-17,\"x_max\":1026,\"o\":\"m 549 0 l 549 322 l 275 906 l 494 906 l 575 697 q 612 598 594 646 q 649 497 629 550 l 654 497 q 692 598 674 550 q 731 697 711 646 l 813 906 l 1026 906 l 753 322 l 753 0 l 549 0 m 176 597 q 101 613 136 601 q 40 644 67 624 q -1 696 14 665 q -17 769 -17 726 q 35 870 -17 831 q 217 913 88 910 l 240 810 q 155 789 181 806 q 129 747 129 772 q 149 701 129 715 q 192 678 168 686 l 176 597 z \"},\"Ὺ\":{\"ha\":978,\"x_min\":-31,\"x_max\":989,\"o\":\"m 511 0 l 511 322 l 238 906 l 457 906 l 538 697 q 574 598 557 646 q 611 497 592 550 l 617 497 q 655 598 636 550 q 693 697 674 646 l 775 906 l 989 906 l 715 322 l 715 0 l 511 0 m 53 611 l -31 906 l 143 931 l 182 635 l 53 611 z \"},\"Ύ\":{\"ha\":978,\"x_min\":-17,\"x_max\":989,\"o\":\"m 511 0 l 511 322 l 238 906 l 457 906 l 538 697 q 574 598 557 646 q 611 497 592 550 l 617 497 q 655 598 636 550 q 693 697 674 646 l 775 906 l 989 906 l 715 322 l 715 0 l 511 0 m -17 635 l 22 931 l 196 906 l 113 611 l -17 635 z \"},\"Ὓ\":{\"ha\":1264,\"x_min\":-17,\"x_max\":1275,\"o\":\"m 797 0 l 797 322 l 524 906 l 743 906 l 824 697 q 860 598 843 646 q 897 497 878 550 l 903 497 q 941 598 922 550 q 979 697 960 646 l 1061 906 l 1275 906 l 1001 322 l 1001 0 l 797 0 m 339 611 l 256 906 l 429 931 l 468 635 l 339 611 m 149 607 q 90 625 119 613 q 36 658 60 638 q -2 707 13 679 q -17 772 -17 735 q 33 878 -17 839 q 189 922 83 918 l 213 819 q 140 795 161 814 q 118 751 118 776 q 132 713 118 726 q 165 688 146 699 l 149 607 z \"},\"Ὕ\":{\"ha\":1250,\"x_min\":-17,\"x_max\":1261,\"o\":\"m 783 0 l 783 322 l 510 906 l 729 906 l 810 697 q 847 598 829 646 q 883 497 864 550 l 889 497 q 927 598 908 550 q 965 697 946 646 l 1047 906 l 1261 906 l 988 322 l 988 0 l 783 0 m 257 635 l 297 931 l 471 906 l 386 611 l 257 635 m 149 607 q 90 625 119 613 q 36 658 60 638 q -2 707 13 679 q -17 772 -17 735 q 33 878 -17 839 q 189 922 83 918 l 213 819 q 140 795 161 814 q 118 751 118 776 q 132 713 118 726 q 165 688 146 699 l 149 607 z \"},\"Ὗ\":{\"ha\":1103,\"x_min\":-33,\"x_max\":1114,\"o\":\"m 636 0 l 636 322 l 363 906 l 582 906 l 663 697 q 699 598 682 646 q 736 497 717 550 l 742 497 q 780 598 761 550 q 818 697 799 646 l 900 906 l 1114 906 l 840 322 l 840 0 l 636 0 m 203 560 q 88 593 136 567 q 40 671 40 619 q 51 708 40 692 q 85 737 61 725 q 149 755 110 749 q 246 764 189 761 l 265 682 q 193 671 213 679 q 174 650 174 663 q 217 625 174 632 l 203 560 m -33 808 q 5 904 -24 879 q 83 929 33 929 q 127 922 108 929 q 161 906 146 915 q 190 890 176 897 q 218 883 204 883 q 242 891 233 883 q 254 922 250 899 l 343 910 q 305 813 333 838 q 226 789 276 789 q 183 796 201 789 q 149 811 164 803 q 119 826 133 819 q 90 833 104 833 q 67 826 75 833 q 56 796 58 818 l -33 808 z \"},\"Ῠ\":{\"ha\":729,\"x_min\":-11,\"x_max\":740,\"o\":\"m 263 0 l 263 322 l -11 906 l 208 906 l 289 697 q 326 598 308 646 q 363 497 343 550 l 368 497 q 406 598 388 550 q 444 697 425 646 l 526 906 l 740 906 l 467 322 l 467 0 l 263 0 m 364 968 q 203 1017 260 968 q 138 1158 147 1065 l 249 1178 q 288 1110 258 1135 q 364 1086 317 1086 q 440 1110 411 1086 q 479 1178 469 1135 l 590 1158 q 524 1017 581 1065 q 364 968 468 968 z \"},\"Ῡ\":{\"ha\":729,\"x_min\":-11,\"x_max\":740,\"o\":\"m 263 0 l 263 322 l -11 906 l 208 906 l 289 697 q 326 598 308 646 q 363 497 343 550 l 368 497 q 406 598 388 550 q 444 697 425 646 l 526 906 l 740 906 l 467 322 l 467 0 l 263 0 m 154 1001 l 154 1132 l 574 1132 l 574 1001 l 154 1001 z \"},\"Ὠ\":{\"ha\":1185,\"x_min\":-12,\"x_max\":1124,\"o\":\"m 258 0 l 258 165 l 411 165 l 411 171 q 365 226 389 193 q 323 301 342 260 q 292 391 304 342 q 281 497 281 440 q 310 669 281 592 q 393 803 339 747 q 523 891 447 860 q 692 922 599 922 q 859 891 783 922 q 989 803 935 860 q 1073 669 1043 747 q 1103 497 1103 592 q 1090 391 1103 440 q 1059 301 1078 342 q 1017 226 1040 260 q 971 171 993 193 l 971 165 l 1124 165 l 1124 0 l 753 0 l 753 147 q 858 292 824 214 q 893 476 893 369 q 879 585 893 535 q 839 670 865 635 q 776 726 813 706 q 692 746 739 746 q 607 726 644 746 q 544 670 569 706 q 504 585 518 635 q 490 476 490 535 q 524 292 490 369 q 629 147 558 214 l 629 0 l 258 0 m 51 597 l 36 678 q 78 701 60 686 q 97 747 97 715 q 72 789 97 772 q -12 810 47 806 l 11 913 q 192 870 140 910 q 244 769 244 831 q 229 696 244 726 q 188 644 214 665 q 126 613 161 624 q 51 597 90 601 z \"},\"Ὡ\":{\"ha\":1160,\"x_min\":-17,\"x_max\":1099,\"o\":\"m 233 0 l 233 165 l 386 165 l 386 171 q 340 226 364 193 q 298 301 317 260 q 267 391 279 342 q 256 497 256 440 q 285 669 256 592 q 368 803 314 747 q 498 891 422 860 q 667 922 574 922 q 834 891 758 922 q 964 803 910 860 q 1048 669 1018 747 q 1078 497 1078 592 q 1065 391 1078 440 q 1034 301 1053 342 q 992 226 1015 260 q 946 171 968 193 l 946 165 l 1099 165 l 1099 0 l 728 0 l 728 147 q 833 292 799 214 q 868 476 868 369 q 854 585 868 535 q 814 670 840 635 q 751 726 788 706 q 667 746 714 746 q 582 726 619 746 q 519 670 544 706 q 479 585 493 635 q 465 476 465 535 q 499 292 465 369 q 604 147 533 214 l 604 0 l 233 0 m 176 597 q 101 613 136 601 q 40 644 67 624 q -1 696 14 665 q -17 769 -17 726 q 35 870 -17 831 q 217 913 88 910 l 240 810 q 155 789 181 806 q 129 747 129 772 q 149 701 129 715 q 192 678 168 686 l 176 597 z \"},\"Ὼ\":{\"ha\":1126,\"x_min\":-31,\"x_max\":1067,\"o\":\"m 201 0 l 201 165 l 354 165 l 354 171 q 308 226 332 193 q 266 301 285 260 q 235 391 247 342 q 224 497 224 440 q 253 669 224 592 q 336 803 282 747 q 466 891 390 860 q 635 922 542 922 q 802 891 726 922 q 932 803 878 860 q 1016 669 986 747 q 1046 497 1046 592 q 1033 391 1046 440 q 1002 301 1021 342 q 960 226 983 260 q 914 171 936 193 l 914 165 l 1067 165 l 1067 0 l 696 0 l 696 147 q 801 292 767 214 q 836 476 836 369 q 822 585 836 535 q 782 670 808 635 q 719 726 756 706 q 635 746 682 746 q 550 726 588 746 q 487 670 513 706 q 447 585 461 635 q 433 476 433 535 q 467 292 433 369 q 572 147 501 214 l 572 0 l 201 0 m 53 611 l -31 906 l 143 931 l 182 635 l 53 611 z \"},\"Ώ\":{\"ha\":1115,\"x_min\":-26,\"x_max\":1054,\"o\":\"m 189 0 l 189 165 l 342 165 l 342 171 q 296 226 319 193 q 253 301 272 260 q 223 391 235 342 q 211 497 211 440 q 240 669 211 592 q 324 803 269 747 q 453 891 378 860 q 622 922 529 922 q 790 891 714 922 q 919 803 865 860 q 1003 669 974 747 q 1033 497 1033 592 q 1021 391 1033 440 q 990 301 1008 342 q 947 226 971 260 q 901 171 924 193 l 901 165 l 1054 165 l 1054 0 l 683 0 l 683 147 q 789 292 754 214 q 824 476 824 369 q 810 585 824 535 q 769 670 796 635 q 706 726 743 706 q 622 746 669 746 q 538 726 575 746 q 474 670 500 706 q 435 585 449 635 q 421 476 421 535 q 455 292 421 369 q 560 147 489 214 l 560 0 l 189 0 m -26 635 l 13 931 l 186 906 l 103 611 l -26 635 z \"},\"Ὢ\":{\"ha\":1414,\"x_min\":-12,\"x_max\":1354,\"o\":\"m 489 0 l 489 165 l 642 165 l 642 171 q 596 226 619 193 q 553 301 572 260 q 523 391 535 342 q 511 497 511 440 q 540 669 511 592 q 624 803 569 747 q 753 891 678 860 q 922 922 829 922 q 1090 891 1014 922 q 1219 803 1165 860 q 1303 669 1274 747 q 1333 497 1333 592 q 1321 391 1333 440 q 1290 301 1308 342 q 1247 226 1271 260 q 1201 171 1224 193 l 1201 165 l 1354 165 l 1354 0 l 983 0 l 983 147 q 1089 292 1054 214 q 1124 476 1124 369 q 1110 585 1124 535 q 1069 670 1096 635 q 1006 726 1043 706 q 922 746 969 746 q 838 726 875 746 q 774 670 800 706 q 735 585 749 635 q 721 476 721 535 q 755 292 721 369 q 860 147 789 214 l 860 0 l 489 0 m 340 611 l 257 906 l 431 931 l 469 635 l 340 611 m 51 607 l 35 688 q 68 713 54 699 q 82 751 82 726 q 60 795 82 776 q -12 819 39 814 l 11 922 q 167 878 117 918 q 217 772 217 839 q 202 707 217 735 q 164 658 188 679 q 110 625 140 638 q 51 607 81 613 z \"},\"Ὣ\":{\"ha\":1413,\"x_min\":-17,\"x_max\":1353,\"o\":\"m 488 0 l 488 165 l 640 165 l 640 171 q 594 226 618 193 q 552 301 571 260 q 522 391 533 342 q 510 497 510 440 q 539 669 510 592 q 622 803 568 747 q 752 891 676 860 q 921 922 828 922 q 1088 891 1013 922 q 1218 803 1164 860 q 1302 669 1272 747 q 1332 497 1332 592 q 1319 391 1332 440 q 1288 301 1307 342 q 1246 226 1269 260 q 1200 171 1222 193 l 1200 165 l 1353 165 l 1353 0 l 982 0 l 982 147 q 1088 292 1053 214 q 1122 476 1122 369 q 1108 585 1122 535 q 1068 670 1094 635 q 1005 726 1042 706 q 921 746 968 746 q 836 726 874 746 q 773 670 799 706 q 733 585 747 635 q 719 476 719 535 q 753 292 719 369 q 858 147 788 214 l 858 0 l 488 0 m 339 611 l 256 906 l 429 931 l 468 635 l 339 611 m 149 607 q 90 625 119 613 q 36 658 60 638 q -2 707 13 679 q -17 772 -17 735 q 33 878 -17 839 q 189 922 83 918 l 213 819 q 140 795 161 814 q 118 751 118 776 q 132 713 118 726 q 165 688 146 699 l 149 607 z \"},\"Ὤ\":{\"ha\":1400,\"x_min\":-12,\"x_max\":1340,\"o\":\"m 475 0 l 475 165 l 628 165 l 628 171 q 582 226 606 193 q 540 301 558 260 q 509 391 521 342 q 497 497 497 440 q 526 669 497 592 q 610 803 556 747 q 740 891 664 860 q 908 922 815 922 q 1076 891 1000 922 q 1206 803 1151 860 q 1290 669 1260 747 q 1319 497 1319 592 q 1307 391 1319 440 q 1276 301 1294 342 q 1233 226 1257 260 q 1188 171 1210 193 l 1188 165 l 1340 165 l 1340 0 l 969 0 l 969 147 q 1075 292 1040 214 q 1110 476 1110 369 q 1096 585 1110 535 q 1056 670 1082 635 q 992 726 1029 706 q 908 746 956 746 q 824 726 861 746 q 760 670 786 706 q 721 585 735 635 q 707 476 707 535 q 741 292 707 369 q 846 147 775 214 l 846 0 l 475 0 m 258 635 l 299 931 l 472 906 l 388 611 l 258 635 m 51 607 l 35 688 q 68 713 54 699 q 82 751 82 726 q 60 795 82 776 q -12 819 39 814 l 11 922 q 167 878 117 918 q 217 772 217 839 q 202 707 217 735 q 164 658 188 679 q 110 625 140 638 q 51 607 81 613 z \"},\"Ὥ\":{\"ha\":1399,\"x_min\":-17,\"x_max\":1339,\"o\":\"m 474 0 l 474 165 l 626 165 l 626 171 q 581 226 604 193 q 538 301 557 260 q 508 391 519 342 q 496 497 496 440 q 525 669 496 592 q 608 803 554 747 q 738 891 663 860 q 907 922 814 922 q 1074 891 999 922 q 1204 803 1150 860 q 1288 669 1258 747 q 1318 497 1318 592 q 1306 391 1318 440 q 1274 301 1293 342 q 1232 226 1256 260 q 1186 171 1208 193 l 1186 165 l 1339 165 l 1339 0 l 968 0 l 968 147 q 1074 292 1039 214 q 1108 476 1108 369 q 1094 585 1108 535 q 1054 670 1081 635 q 991 726 1028 706 q 907 746 954 746 q 822 726 860 746 q 759 670 785 706 q 719 585 733 635 q 706 476 706 535 q 740 292 706 369 q 844 147 774 214 l 844 0 l 474 0 m 257 635 l 297 931 l 471 906 l 386 611 l 257 635 m 149 607 q 90 625 119 613 q 36 658 60 638 q -2 707 13 679 q -17 772 -17 735 q 33 878 -17 839 q 189 922 83 918 l 213 819 q 140 795 161 814 q 118 751 118 776 q 132 713 118 726 q 165 688 146 699 l 149 607 z \"},\"Ὦ\":{\"ha\":1218,\"x_min\":-33,\"x_max\":1157,\"o\":\"m 292 0 l 292 165 l 444 165 l 444 171 q 399 226 422 193 q 356 301 375 260 q 326 391 338 342 q 314 497 314 440 q 343 669 314 592 q 426 803 372 747 q 556 891 481 860 q 725 922 632 922 q 892 891 817 922 q 1022 803 968 860 q 1106 669 1076 747 q 1136 497 1136 592 q 1124 391 1136 440 q 1092 301 1111 342 q 1050 226 1074 260 q 1004 171 1026 193 l 1004 165 l 1157 165 l 1157 0 l 786 0 l 786 147 q 892 292 857 214 q 926 476 926 369 q 913 585 926 535 q 872 670 899 635 q 809 726 846 706 q 725 746 772 746 q 640 726 678 746 q 577 670 603 706 q 538 585 551 635 q 524 476 524 535 q 558 292 524 369 q 663 147 592 214 l 663 0 l 292 0 m -33 808 q 5 904 -24 879 q 83 929 33 929 q 127 922 108 929 q 161 906 146 915 q 190 890 176 897 q 218 883 204 883 q 242 891 233 883 q 254 922 250 899 l 343 910 q 305 813 333 838 q 226 789 276 789 q 183 796 201 789 q 149 811 164 803 q 119 826 133 819 q 90 833 104 833 q 67 826 75 833 q 56 796 58 818 l -33 808 m 106 560 l 93 625 q 124 633 113 628 q 135 650 135 639 q 116 671 135 663 q 44 682 97 679 l 64 764 q 223 737 178 760 q 268 671 268 714 q 220 593 268 619 q 106 560 172 567 z \"},\"Ὧ\":{\"ha\":1218,\"x_min\":-33,\"x_max\":1157,\"o\":\"m 292 0 l 292 165 l 444 165 l 444 171 q 399 226 422 193 q 356 301 375 260 q 326 391 338 342 q 314 497 314 440 q 343 669 314 592 q 426 803 372 747 q 556 891 481 860 q 725 922 632 922 q 892 891 817 922 q 1022 803 968 860 q 1106 669 1076 747 q 1136 497 1136 592 q 1124 391 1136 440 q 1092 301 1111 342 q 1050 226 1074 260 q 1004 171 1026 193 l 1004 165 l 1157 165 l 1157 0 l 786 0 l 786 147 q 892 292 857 214 q 926 476 926 369 q 913 585 926 535 q 872 670 899 635 q 809 726 846 706 q 725 746 772 746 q 640 726 678 746 q 577 670 603 706 q 538 585 551 635 q 524 476 524 535 q 558 292 524 369 q 663 147 592 214 l 663 0 l 292 0 m 203 560 q 88 593 136 567 q 40 671 40 619 q 51 708 40 692 q 85 737 61 725 q 149 755 110 749 q 246 764 189 761 l 265 682 q 193 671 213 679 q 174 650 174 663 q 217 625 174 632 l 203 560 m -33 808 q 5 904 -24 879 q 83 929 33 929 q 127 922 108 929 q 161 906 146 915 q 190 890 176 897 q 218 883 204 883 q 242 891 233 883 q 254 922 250 899 l 343 910 q 305 813 333 838 q 226 789 276 789 q 183 796 201 789 q 149 811 164 803 q 119 826 133 819 q 90 833 104 833 q 67 826 75 833 q 56 796 58 818 l -33 808 z \"},\"ᾼ\":{\"ha\":1204,\"x_min\":-8,\"x_max\":1203,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 1082 -17 q 987 0 1025 -17 q 925 47 949 17 q 892 119 901 76 q 882 215 882 163 l 882 578 l 1088 578 q 1083 478 1085 529 q 1078 378 1081 428 q 1075 285 1076 329 q 1074 207 1074 242 q 1090 161 1074 174 q 1136 149 1107 149 q 1156 151 1144 149 q 1179 157 1168 153 l 1203 6 q 1153 -10 1181 -4 q 1082 -17 1126 -17 z \"},\"ᾈ\":{\"ha\":1318,\"x_min\":-10,\"x_max\":1317,\"o\":\"m 433 458 l 411 375 l 604 375 l 583 458 q 546 603 564 526 q 510 750 528 679 l 504 750 q 470 602 488 678 q 433 458 453 526 m 106 0 l 389 906 l 635 906 l 918 0 l 701 0 l 646 215 l 369 215 l 314 0 l 106 0 m 54 597 l 39 678 q 81 701 63 686 q 100 747 100 715 q 75 789 100 772 q -10 810 50 806 l 14 913 q 195 870 143 910 q 247 769 247 831 q 232 696 247 726 q 190 644 217 665 q 128 613 164 624 q 54 597 93 601 m 1196 -17 q 1101 0 1139 -17 q 1039 47 1063 17 q 1006 119 1015 76 q 996 215 996 163 l 996 578 l 1201 578 q 1197 478 1199 529 q 1192 378 1194 428 q 1189 285 1190 329 q 1188 207 1188 242 q 1204 161 1188 174 q 1250 149 1221 149 q 1270 151 1258 149 q 1293 157 1282 153 l 1317 6 q 1267 -10 1294 -4 q 1196 -17 1240 -17 z \"},\"ᾉ\":{\"ha\":1296,\"x_min\":-17,\"x_max\":1293,\"o\":\"m 411 458 l 389 375 l 582 375 l 561 458 q 524 603 542 526 q 488 750 506 679 l 482 750 q 448 602 465 678 q 411 458 431 526 m 83 0 l 367 906 l 613 906 l 896 0 l 679 0 l 624 215 l 347 215 l 292 0 l 83 0 m 176 597 q 101 613 136 601 q 40 644 67 624 q -1 696 14 665 q -17 769 -17 726 q 35 870 -17 831 q 217 913 88 910 l 240 810 q 155 789 181 806 q 129 747 129 772 q 149 701 129 715 q 192 678 168 686 l 176 597 m 1172 -17 q 1077 0 1115 -17 q 1015 47 1039 17 q 982 119 992 76 q 972 215 972 163 l 972 578 l 1178 578 q 1173 478 1175 529 q 1169 378 1171 428 q 1165 285 1167 329 q 1164 207 1164 242 q 1181 161 1164 174 q 1226 149 1197 149 q 1247 151 1235 149 q 1269 157 1258 153 l 1293 6 q 1244 -10 1271 -4 q 1172 -17 1217 -17 z \"},\"ᾊ\":{\"ha\":1550,\"x_min\":-12,\"x_max\":1547,\"o\":\"m 665 458 l 643 375 l 836 375 l 815 458 q 778 603 796 526 q 742 750 760 679 l 736 750 q 702 602 719 678 q 665 458 685 526 m 338 0 l 621 906 l 867 906 l 1150 0 l 933 0 l 878 215 l 601 215 l 546 0 l 338 0 m 340 611 l 257 906 l 431 931 l 469 635 l 340 611 m 51 607 l 35 688 q 68 713 54 699 q 82 751 82 726 q 60 795 82 776 q -12 819 39 814 l 11 922 q 167 878 117 918 q 217 772 217 839 q 202 707 217 735 q 164 658 188 679 q 110 625 140 638 q 51 607 81 613 m 1426 -17 q 1331 0 1369 -17 q 1269 47 1293 17 q 1236 119 1246 76 q 1226 215 1226 163 l 1226 578 l 1432 578 q 1427 478 1429 529 q 1423 378 1425 428 q 1419 285 1421 329 q 1418 207 1418 242 q 1435 161 1418 174 q 1481 149 1451 149 q 1501 151 1489 149 q 1524 157 1513 153 l 1547 6 q 1498 -10 1525 -4 q 1426 -17 1471 -17 z \"},\"ᾋ\":{\"ha\":1549,\"x_min\":-17,\"x_max\":1547,\"o\":\"m 664 458 l 642 375 l 835 375 l 814 458 q 776 603 794 526 q 740 750 758 679 l 735 750 q 701 602 718 678 q 664 458 683 526 m 336 0 l 619 906 l 865 906 l 1149 0 l 932 0 l 876 215 l 600 215 l 544 0 l 336 0 m 339 611 l 256 906 l 429 931 l 468 635 l 339 611 m 149 607 q 90 625 119 613 q 36 658 60 638 q -2 707 13 679 q -17 772 -17 735 q 33 878 -17 839 q 189 922 83 918 l 213 819 q 140 795 161 814 q 118 751 118 776 q 132 713 118 726 q 165 688 146 699 l 149 607 m 1426 -17 q 1331 0 1369 -17 q 1269 47 1293 17 q 1236 119 1246 76 q 1226 215 1226 163 l 1226 578 l 1432 578 q 1427 478 1429 529 q 1423 378 1425 428 q 1419 285 1421 329 q 1418 207 1418 242 q 1435 161 1418 174 q 1481 149 1451 149 q 1501 151 1489 149 q 1524 157 1513 153 l 1547 6 q 1498 -10 1525 -4 q 1426 -17 1471 -17 z \"},\"ᾌ\":{\"ha\":1536,\"x_min\":-12,\"x_max\":1533,\"o\":\"m 651 458 l 629 375 l 822 375 l 801 458 q 764 603 782 526 q 728 750 746 679 l 722 750 q 688 602 706 678 q 651 458 671 526 m 324 0 l 607 906 l 853 906 l 1136 0 l 919 0 l 864 215 l 588 215 l 532 0 l 324 0 m 258 635 l 299 931 l 472 906 l 388 611 l 258 635 m 51 607 l 35 688 q 68 713 54 699 q 82 751 82 726 q 60 795 82 776 q -12 819 39 814 l 11 922 q 167 878 117 918 q 217 772 217 839 q 202 707 217 735 q 164 658 188 679 q 110 625 140 638 q 51 607 81 613 m 1413 -17 q 1317 0 1356 -17 q 1256 47 1279 17 q 1222 119 1232 76 q 1213 215 1213 163 l 1213 578 l 1418 578 q 1413 478 1415 529 q 1409 378 1411 428 q 1406 285 1407 329 q 1404 207 1404 242 q 1421 161 1404 174 q 1467 149 1438 149 q 1487 151 1475 149 q 1510 157 1499 153 l 1533 6 q 1484 -10 1511 -4 q 1413 -17 1457 -17 z \"},\"ᾍ\":{\"ha\":1535,\"x_min\":-17,\"x_max\":1533,\"o\":\"m 650 458 l 628 375 l 821 375 l 800 458 q 763 603 781 526 q 726 750 744 679 l 721 750 q 687 602 704 678 q 650 458 669 526 m 322 0 l 606 906 l 851 906 l 1135 0 l 918 0 l 863 215 l 586 215 l 531 0 l 322 0 m 257 635 l 297 931 l 471 906 l 386 611 l 257 635 m 149 607 q 90 625 119 613 q 36 658 60 638 q -2 707 13 679 q -17 772 -17 735 q 33 878 -17 839 q 189 922 83 918 l 213 819 q 140 795 161 814 q 118 751 118 776 q 132 713 118 726 q 165 688 146 699 l 149 607 m 1413 -17 q 1317 0 1356 -17 q 1256 47 1279 17 q 1222 119 1232 76 q 1213 215 1213 163 l 1213 578 l 1418 578 q 1413 478 1415 529 q 1409 378 1411 428 q 1406 285 1407 329 q 1404 207 1404 242 q 1421 161 1404 174 q 1467 149 1438 149 q 1487 151 1475 149 q 1510 157 1499 153 l 1533 6 q 1484 -10 1511 -4 q 1413 -17 1457 -17 z \"},\"ᾎ\":{\"ha\":1351,\"x_min\":-33,\"x_max\":1349,\"o\":\"m 467 458 l 444 375 l 638 375 l 617 458 q 579 603 597 526 q 543 750 561 679 l 538 750 q 503 602 521 678 q 467 458 486 526 m 139 0 l 422 906 l 668 906 l 951 0 l 735 0 l 679 215 l 403 215 l 347 0 l 139 0 m -33 808 q 5 904 -24 879 q 83 929 33 929 q 127 922 108 929 q 161 906 146 915 q 190 890 176 897 q 218 883 204 883 q 242 891 233 883 q 254 922 250 899 l 343 910 q 305 813 333 838 q 226 789 276 789 q 183 796 201 789 q 149 811 164 803 q 119 826 133 819 q 90 833 104 833 q 67 826 75 833 q 56 796 58 818 l -33 808 m 106 560 l 93 625 q 124 633 113 628 q 135 650 135 639 q 116 671 135 663 q 44 682 97 679 l 64 764 q 223 737 178 760 q 268 671 268 714 q 220 593 268 619 q 106 560 172 567 m 1228 -17 q 1133 0 1171 -17 q 1071 47 1094 17 q 1038 119 1047 76 q 1028 215 1028 163 l 1028 578 l 1233 578 q 1228 478 1231 529 q 1224 378 1226 428 q 1221 285 1222 329 q 1219 207 1219 242 q 1236 161 1219 174 q 1282 149 1253 149 q 1302 151 1290 149 q 1325 157 1314 153 l 1349 6 q 1299 -10 1326 -4 q 1228 -17 1272 -17 z \"},\"ᾏ\":{\"ha\":1351,\"x_min\":-33,\"x_max\":1349,\"o\":\"m 467 458 l 444 375 l 638 375 l 617 458 q 579 603 597 526 q 543 750 561 679 l 538 750 q 503 602 521 678 q 467 458 486 526 m 139 0 l 422 906 l 668 906 l 951 0 l 735 0 l 679 215 l 403 215 l 347 0 l 139 0 m 203 560 q 88 593 136 567 q 40 671 40 619 q 51 708 40 692 q 85 737 61 725 q 149 755 110 749 q 246 764 189 761 l 265 682 q 193 671 213 679 q 174 650 174 663 q 217 625 174 632 l 203 560 m -33 808 q 5 904 -24 879 q 83 929 33 929 q 127 922 108 929 q 161 906 146 915 q 190 890 176 897 q 218 883 204 883 q 242 891 233 883 q 254 922 250 899 l 343 910 q 305 813 333 838 q 226 789 276 789 q 183 796 201 789 q 149 811 164 803 q 119 826 133 819 q 90 833 104 833 q 67 826 75 833 q 56 796 58 818 l -33 808 m 1228 -17 q 1133 0 1171 -17 q 1071 47 1094 17 q 1038 119 1047 76 q 1028 215 1028 163 l 1028 578 l 1233 578 q 1228 478 1231 529 q 1224 378 1226 428 q 1221 285 1222 329 q 1219 207 1219 242 q 1236 161 1219 174 q 1282 149 1253 149 q 1302 151 1290 149 q 1325 157 1314 153 l 1349 6 q 1299 -10 1326 -4 q 1228 -17 1272 -17 z \"},\"ῌ\":{\"ha\":1344,\"x_min\":107,\"x_max\":1342,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 557 l 624 557 l 624 906 l 829 906 l 829 0 l 624 0 l 624 378 l 311 378 l 311 0 l 107 0 m 1221 -17 q 1126 0 1164 -17 q 1064 47 1088 17 q 1031 119 1040 76 q 1021 215 1021 163 l 1021 578 l 1226 578 q 1222 478 1224 529 q 1217 378 1219 428 q 1214 285 1215 329 q 1213 207 1213 242 q 1229 161 1213 174 q 1275 149 1246 149 q 1295 151 1283 149 q 1318 157 1307 153 l 1342 6 q 1292 -10 1319 -4 q 1221 -17 1265 -17 z \"},\"ᾘ\":{\"ha\":1571,\"x_min\":-12,\"x_max\":1567,\"o\":\"m 333 0 l 333 906 l 538 906 l 538 557 l 850 557 l 850 906 l 1056 906 l 1056 0 l 850 0 l 850 378 l 538 378 l 538 0 l 333 0 m 51 597 l 36 678 q 78 701 60 686 q 97 747 97 715 q 72 789 97 772 q -12 810 47 806 l 11 913 q 192 870 140 910 q 244 769 244 831 q 229 696 244 726 q 188 644 214 665 q 126 613 161 624 q 51 597 90 601 m 1446 -17 q 1351 0 1389 -17 q 1289 47 1313 17 q 1256 119 1265 76 q 1246 215 1246 163 l 1246 578 l 1451 578 q 1447 478 1449 529 q 1442 378 1444 428 q 1439 285 1440 329 q 1438 207 1438 242 q 1454 161 1438 174 q 1500 149 1471 149 q 1520 151 1508 149 q 1543 157 1532 153 l 1567 6 q 1517 -10 1544 -4 q 1446 -17 1490 -17 z \"},\"ᾙ\":{\"ha\":1571,\"x_min\":-17,\"x_max\":1567,\"o\":\"m 333 0 l 333 906 l 538 906 l 538 557 l 850 557 l 850 906 l 1056 906 l 1056 0 l 850 0 l 850 378 l 538 378 l 538 0 l 333 0 m 176 597 q 101 613 136 601 q 40 644 67 624 q -1 696 14 665 q -17 769 -17 726 q 35 870 -17 831 q 217 913 88 910 l 240 810 q 155 789 181 806 q 129 747 129 772 q 149 701 129 715 q 192 678 168 686 l 176 597 m 1446 -17 q 1351 0 1389 -17 q 1289 47 1313 17 q 1256 119 1265 76 q 1246 215 1246 163 l 1246 578 l 1451 578 q 1447 478 1449 529 q 1442 378 1444 428 q 1439 285 1440 329 q 1438 207 1438 242 q 1454 161 1438 174 q 1500 149 1471 149 q 1520 151 1508 149 q 1543 157 1532 153 l 1567 6 q 1517 -10 1544 -4 q 1446 -17 1490 -17 z \"},\"ᾚ\":{\"ha\":1797,\"x_min\":-12,\"x_max\":1794,\"o\":\"m 560 0 l 560 906 l 764 906 l 764 557 l 1076 557 l 1076 906 l 1282 906 l 1282 0 l 1076 0 l 1076 378 l 764 378 l 764 0 l 560 0 m 340 611 l 257 906 l 431 931 l 469 635 l 340 611 m 51 607 l 35 688 q 68 713 54 699 q 82 751 82 726 q 60 795 82 776 q -12 819 39 814 l 11 922 q 167 878 117 918 q 217 772 217 839 q 202 707 217 735 q 164 658 188 679 q 110 625 140 638 q 51 607 81 613 m 1674 -17 q 1578 0 1617 -17 q 1517 47 1540 17 q 1483 119 1493 76 q 1474 215 1474 163 l 1474 578 l 1679 578 q 1674 478 1676 529 q 1670 378 1672 428 q 1667 285 1668 329 q 1665 207 1665 242 q 1682 161 1665 174 q 1728 149 1699 149 q 1748 151 1736 149 q 1771 157 1760 153 l 1794 6 q 1745 -10 1772 -4 q 1674 -17 1718 -17 z \"},\"ᾛ\":{\"ha\":1796,\"x_min\":-17,\"x_max\":1792,\"o\":\"m 558 0 l 558 906 l 763 906 l 763 557 l 1075 557 l 1075 906 l 1281 906 l 1281 0 l 1075 0 l 1075 378 l 763 378 l 763 0 l 558 0 m 339 611 l 256 906 l 429 931 l 468 635 l 339 611 m 149 607 q 90 625 119 613 q 36 658 60 638 q -2 707 13 679 q -17 772 -17 735 q 33 878 -17 839 q 189 922 83 918 l 213 819 q 140 795 161 814 q 118 751 118 776 q 132 713 118 726 q 165 688 146 699 l 149 607 m 1671 -17 q 1576 0 1614 -17 q 1514 47 1538 17 q 1481 119 1490 76 q 1471 215 1471 163 l 1471 578 l 1676 578 q 1672 478 1674 529 q 1667 378 1669 428 q 1664 285 1665 329 q 1663 207 1663 242 q 1679 161 1663 174 q 1725 149 1696 149 q 1745 151 1733 149 q 1768 157 1757 153 l 1792 6 q 1742 -10 1769 -4 q 1671 -17 1715 -17 z \"},\"ᾜ\":{\"ha\":1783,\"x_min\":-12,\"x_max\":1781,\"o\":\"m 546 0 l 546 906 l 750 906 l 750 557 l 1063 557 l 1063 906 l 1268 906 l 1268 0 l 1063 0 l 1063 378 l 750 378 l 750 0 l 546 0 m 258 635 l 299 931 l 472 906 l 388 611 l 258 635 m 51 607 l 35 688 q 68 713 54 699 q 82 751 82 726 q 60 795 82 776 q -12 819 39 814 l 11 922 q 167 878 117 918 q 217 772 217 839 q 202 707 217 735 q 164 658 188 679 q 110 625 140 638 q 51 607 81 613 m 1660 -17 q 1565 0 1603 -17 q 1503 47 1526 17 q 1469 119 1479 76 q 1460 215 1460 163 l 1460 578 l 1665 578 q 1660 478 1663 529 q 1656 378 1658 428 q 1653 285 1654 329 q 1651 207 1651 242 q 1668 161 1651 174 q 1714 149 1685 149 q 1734 151 1722 149 q 1757 157 1746 153 l 1781 6 q 1731 -10 1758 -4 q 1660 -17 1704 -17 z \"},\"ᾝ\":{\"ha\":1782,\"x_min\":-17,\"x_max\":1778,\"o\":\"m 544 0 l 544 906 l 749 906 l 749 557 l 1061 557 l 1061 906 l 1267 906 l 1267 0 l 1061 0 l 1061 378 l 749 378 l 749 0 l 544 0 m 257 635 l 297 931 l 471 906 l 386 611 l 257 635 m 149 607 q 90 625 119 613 q 36 658 60 638 q -2 707 13 679 q -17 772 -17 735 q 33 878 -17 839 q 189 922 83 918 l 213 819 q 140 795 161 814 q 118 751 118 776 q 132 713 118 726 q 165 688 146 699 l 149 607 m 1657 -17 q 1562 0 1600 -17 q 1500 47 1524 17 q 1467 119 1476 76 q 1457 215 1457 163 l 1457 578 l 1663 578 q 1658 478 1660 529 q 1653 378 1656 428 q 1650 285 1651 329 q 1649 207 1649 242 q 1665 161 1649 174 q 1711 149 1682 149 q 1731 151 1719 149 q 1754 157 1743 153 l 1778 6 q 1728 -10 1756 -4 q 1657 -17 1701 -17 z \"},\"ᾞ\":{\"ha\":1653,\"x_min\":-33,\"x_max\":1650,\"o\":\"m 417 0 l 417 906 l 621 906 l 621 557 l 933 557 l 933 906 l 1139 906 l 1139 0 l 933 0 l 933 378 l 621 378 l 621 0 l 417 0 m -33 808 q 5 904 -24 879 q 83 929 33 929 q 127 922 108 929 q 161 906 146 915 q 190 890 176 897 q 218 883 204 883 q 242 891 233 883 q 254 922 250 899 l 343 910 q 305 813 333 838 q 226 789 276 789 q 183 796 201 789 q 149 811 164 803 q 119 826 133 819 q 90 833 104 833 q 67 826 75 833 q 56 796 58 818 l -33 808 m 106 560 l 93 625 q 124 633 113 628 q 135 650 135 639 q 116 671 135 663 q 44 682 97 679 l 64 764 q 223 737 178 760 q 268 671 268 714 q 220 593 268 619 q 106 560 172 567 m 1529 -17 q 1434 0 1472 -17 q 1372 47 1396 17 q 1339 119 1349 76 q 1329 215 1329 163 l 1329 578 l 1535 578 q 1530 478 1532 529 q 1526 378 1528 428 q 1522 285 1524 329 q 1521 207 1521 242 q 1538 161 1521 174 q 1583 149 1554 149 q 1603 151 1592 149 q 1626 157 1615 153 l 1650 6 q 1601 -10 1628 -4 q 1529 -17 1574 -17 z \"},\"ᾟ\":{\"ha\":1653,\"x_min\":-33,\"x_max\":1650,\"o\":\"m 417 0 l 417 906 l 621 906 l 621 557 l 933 557 l 933 906 l 1139 906 l 1139 0 l 933 0 l 933 378 l 621 378 l 621 0 l 417 0 m 203 560 q 88 593 136 567 q 40 671 40 619 q 51 708 40 692 q 85 737 61 725 q 149 755 110 749 q 246 764 189 761 l 265 682 q 193 671 213 679 q 174 650 174 663 q 217 625 174 632 l 203 560 m -33 808 q 5 904 -24 879 q 83 929 33 929 q 127 922 108 929 q 161 906 146 915 q 190 890 176 897 q 218 883 204 883 q 242 891 233 883 q 254 922 250 899 l 343 910 q 305 813 333 838 q 226 789 276 789 q 183 796 201 789 q 149 811 164 803 q 119 826 133 819 q 90 833 104 833 q 67 826 75 833 q 56 796 58 818 l -33 808 m 1529 -17 q 1434 0 1472 -17 q 1372 47 1396 17 q 1339 119 1349 76 q 1329 215 1329 163 l 1329 578 l 1535 578 q 1530 478 1532 529 q 1526 378 1528 428 q 1522 285 1524 329 q 1521 207 1521 242 q 1538 161 1521 174 q 1583 149 1554 149 q 1603 151 1592 149 q 1626 157 1615 153 l 1650 6 q 1601 -10 1628 -4 q 1529 -17 1574 -17 z \"},\"ῼ\":{\"ha\":1396,\"x_min\":61,\"x_max\":1393,\"o\":\"m 61 0 l 61 165 l 214 165 l 214 171 q 168 226 192 193 q 126 301 144 260 q 95 391 107 342 q 83 497 83 440 q 113 669 83 592 q 196 803 142 747 q 326 891 250 860 q 494 922 401 922 q 662 891 586 922 q 792 803 738 860 q 876 669 846 747 q 906 497 906 592 q 893 391 906 440 q 862 301 881 342 q 819 226 843 260 q 774 171 796 193 l 774 165 l 926 165 l 926 0 l 556 0 l 556 147 q 661 292 626 214 q 696 476 696 369 q 682 585 696 535 q 642 670 668 635 q 578 726 615 706 q 494 746 542 746 q 410 726 447 746 q 347 670 372 706 q 307 585 321 635 q 293 476 293 535 q 327 292 293 369 q 432 147 361 214 l 432 0 l 61 0 m 1272 -17 q 1177 0 1215 -17 q 1115 47 1139 17 q 1082 119 1092 76 q 1072 215 1072 163 l 1072 578 l 1278 578 q 1273 478 1275 529 q 1269 378 1271 428 q 1265 285 1267 329 q 1264 207 1264 242 q 1281 161 1264 174 q 1326 149 1297 149 q 1347 151 1335 149 q 1369 157 1358 153 l 1393 6 q 1344 -10 1371 -4 q 1272 -17 1317 -17 z \"},\"ᾨ\":{\"ha\":1593,\"x_min\":-12,\"x_max\":1592,\"o\":\"m 258 0 l 258 165 l 411 165 l 411 171 q 365 226 389 193 q 323 301 342 260 q 292 391 304 342 q 281 497 281 440 q 310 669 281 592 q 393 803 339 747 q 523 891 447 860 q 692 922 599 922 q 859 891 783 922 q 989 803 935 860 q 1073 669 1043 747 q 1103 497 1103 592 q 1090 391 1103 440 q 1059 301 1078 342 q 1017 226 1040 260 q 971 171 993 193 l 971 165 l 1124 165 l 1124 0 l 753 0 l 753 147 q 858 292 824 214 q 893 476 893 369 q 879 585 893 535 q 839 670 865 635 q 776 726 813 706 q 692 746 739 746 q 607 726 644 746 q 544 670 569 706 q 504 585 518 635 q 490 476 490 535 q 524 292 490 369 q 629 147 558 214 l 629 0 l 258 0 m 51 597 l 36 678 q 78 701 60 686 q 97 747 97 715 q 72 789 97 772 q -12 810 47 806 l 11 913 q 192 870 140 910 q 244 769 244 831 q 229 696 244 726 q 188 644 214 665 q 126 613 161 624 q 51 597 90 601 m 1471 -17 q 1376 0 1414 -17 q 1314 47 1338 17 q 1281 119 1290 76 q 1271 215 1271 163 l 1271 578 l 1476 578 q 1472 478 1474 529 q 1467 378 1469 428 q 1464 285 1465 329 q 1463 207 1463 242 q 1479 161 1463 174 q 1525 149 1496 149 q 1545 151 1533 149 q 1568 157 1557 153 l 1592 6 q 1542 -10 1569 -4 q 1471 -17 1515 -17 z \"},\"ᾩ\":{\"ha\":1568,\"x_min\":-17,\"x_max\":1567,\"o\":\"m 233 0 l 233 165 l 386 165 l 386 171 q 340 226 364 193 q 298 301 317 260 q 267 391 279 342 q 256 497 256 440 q 285 669 256 592 q 368 803 314 747 q 498 891 422 860 q 667 922 574 922 q 834 891 758 922 q 964 803 910 860 q 1048 669 1018 747 q 1078 497 1078 592 q 1065 391 1078 440 q 1034 301 1053 342 q 992 226 1015 260 q 946 171 968 193 l 946 165 l 1099 165 l 1099 0 l 728 0 l 728 147 q 833 292 799 214 q 868 476 868 369 q 854 585 868 535 q 814 670 840 635 q 751 726 788 706 q 667 746 714 746 q 582 726 619 746 q 519 670 544 706 q 479 585 493 635 q 465 476 465 535 q 499 292 465 369 q 604 147 533 214 l 604 0 l 233 0 m 176 597 q 101 613 136 601 q 40 644 67 624 q -1 696 14 665 q -17 769 -17 726 q 35 870 -17 831 q 217 913 88 910 l 240 810 q 155 789 181 806 q 129 747 129 772 q 149 701 129 715 q 192 678 168 686 l 176 597 m 1446 -17 q 1351 0 1389 -17 q 1289 47 1313 17 q 1256 119 1265 76 q 1246 215 1246 163 l 1246 578 l 1451 578 q 1447 478 1449 529 q 1442 378 1444 428 q 1439 285 1440 329 q 1438 207 1438 242 q 1454 161 1438 174 q 1500 149 1471 149 q 1520 151 1508 149 q 1543 157 1532 153 l 1567 6 q 1517 -10 1544 -4 q 1446 -17 1490 -17 z \"},\"ᾪ\":{\"ha\":1824,\"x_min\":-12,\"x_max\":1819,\"o\":\"m 489 0 l 489 165 l 642 165 l 642 171 q 596 226 619 193 q 553 301 572 260 q 523 391 535 342 q 511 497 511 440 q 540 669 511 592 q 624 803 569 747 q 753 891 678 860 q 922 922 829 922 q 1090 891 1014 922 q 1219 803 1165 860 q 1303 669 1274 747 q 1333 497 1333 592 q 1321 391 1333 440 q 1290 301 1308 342 q 1247 226 1271 260 q 1201 171 1224 193 l 1201 165 l 1354 165 l 1354 0 l 983 0 l 983 147 q 1089 292 1054 214 q 1124 476 1124 369 q 1110 585 1124 535 q 1069 670 1096 635 q 1006 726 1043 706 q 922 746 969 746 q 838 726 875 746 q 774 670 800 706 q 735 585 749 635 q 721 476 721 535 q 755 292 721 369 q 860 147 789 214 l 860 0 l 489 0 m 340 611 l 257 906 l 431 931 l 469 635 l 340 611 m 51 607 l 35 688 q 68 713 54 699 q 82 751 82 726 q 60 795 82 776 q -12 819 39 814 l 11 922 q 167 878 117 918 q 217 772 217 839 q 202 707 217 735 q 164 658 188 679 q 110 625 140 638 q 51 607 81 613 m 1699 -17 q 1603 0 1642 -17 q 1542 47 1565 17 q 1508 119 1518 76 q 1499 215 1499 163 l 1499 578 l 1704 578 q 1699 478 1701 529 q 1695 378 1697 428 q 1692 285 1693 329 q 1690 207 1690 242 q 1707 161 1690 174 q 1753 149 1724 149 q 1773 151 1761 149 q 1796 157 1785 153 l 1819 6 q 1770 -10 1797 -4 q 1699 -17 1743 -17 z \"},\"ᾫ\":{\"ha\":1821,\"x_min\":-17,\"x_max\":1819,\"o\":\"m 488 0 l 488 165 l 640 165 l 640 171 q 594 226 618 193 q 552 301 571 260 q 522 391 533 342 q 510 497 510 440 q 539 669 510 592 q 622 803 568 747 q 752 891 676 860 q 921 922 828 922 q 1088 891 1013 922 q 1218 803 1164 860 q 1302 669 1272 747 q 1332 497 1332 592 q 1319 391 1332 440 q 1288 301 1307 342 q 1246 226 1269 260 q 1200 171 1222 193 l 1200 165 l 1353 165 l 1353 0 l 982 0 l 982 147 q 1088 292 1053 214 q 1122 476 1122 369 q 1108 585 1122 535 q 1068 670 1094 635 q 1005 726 1042 706 q 921 746 968 746 q 836 726 874 746 q 773 670 799 706 q 733 585 747 635 q 719 476 719 535 q 753 292 719 369 q 858 147 788 214 l 858 0 l 488 0 m 339 611 l 256 906 l 429 931 l 468 635 l 339 611 m 149 607 q 90 625 119 613 q 36 658 60 638 q -2 707 13 679 q -17 772 -17 735 q 33 878 -17 839 q 189 922 83 918 l 213 819 q 140 795 161 814 q 118 751 118 776 q 132 713 118 726 q 165 688 146 699 l 149 607 m 1699 -17 q 1603 0 1642 -17 q 1542 47 1565 17 q 1508 119 1518 76 q 1499 215 1499 163 l 1499 578 l 1704 578 q 1699 478 1701 529 q 1695 378 1697 428 q 1692 285 1693 329 q 1690 207 1690 242 q 1707 161 1690 174 q 1753 149 1724 149 q 1773 151 1761 149 q 1796 157 1785 153 l 1819 6 q 1770 -10 1797 -4 q 1699 -17 1743 -17 z \"},\"ᾬ\":{\"ha\":1810,\"x_min\":-12,\"x_max\":1806,\"o\":\"m 475 0 l 475 165 l 628 165 l 628 171 q 582 226 606 193 q 540 301 558 260 q 509 391 521 342 q 497 497 497 440 q 526 669 497 592 q 610 803 556 747 q 740 891 664 860 q 908 922 815 922 q 1076 891 1000 922 q 1206 803 1151 860 q 1290 669 1260 747 q 1319 497 1319 592 q 1307 391 1319 440 q 1276 301 1294 342 q 1233 226 1257 260 q 1188 171 1210 193 l 1188 165 l 1340 165 l 1340 0 l 969 0 l 969 147 q 1075 292 1040 214 q 1110 476 1110 369 q 1096 585 1110 535 q 1056 670 1082 635 q 992 726 1029 706 q 908 746 956 746 q 824 726 861 746 q 760 670 786 706 q 721 585 735 635 q 707 476 707 535 q 741 292 707 369 q 846 147 775 214 l 846 0 l 475 0 m 258 635 l 299 931 l 472 906 l 388 611 l 258 635 m 51 607 l 35 688 q 68 713 54 699 q 82 751 82 726 q 60 795 82 776 q -12 819 39 814 l 11 922 q 167 878 117 918 q 217 772 217 839 q 202 707 217 735 q 164 658 188 679 q 110 625 140 638 q 51 607 81 613 m 1685 -17 q 1590 0 1628 -17 q 1528 47 1551 17 q 1494 119 1504 76 q 1485 215 1485 163 l 1485 578 l 1690 578 q 1685 478 1688 529 q 1681 378 1683 428 q 1678 285 1679 329 q 1676 207 1676 242 q 1693 161 1676 174 q 1739 149 1710 149 q 1759 151 1747 149 q 1782 157 1771 153 l 1806 6 q 1756 -10 1783 -4 q 1685 -17 1729 -17 z \"},\"ᾭ\":{\"ha\":1808,\"x_min\":-17,\"x_max\":1806,\"o\":\"m 474 0 l 474 165 l 626 165 l 626 171 q 581 226 604 193 q 538 301 557 260 q 508 391 519 342 q 496 497 496 440 q 525 669 496 592 q 608 803 554 747 q 738 891 663 860 q 907 922 814 922 q 1074 891 999 922 q 1204 803 1150 860 q 1288 669 1258 747 q 1318 497 1318 592 q 1306 391 1318 440 q 1274 301 1293 342 q 1232 226 1256 260 q 1186 171 1208 193 l 1186 165 l 1339 165 l 1339 0 l 968 0 l 968 147 q 1074 292 1039 214 q 1108 476 1108 369 q 1094 585 1108 535 q 1054 670 1081 635 q 991 726 1028 706 q 907 746 954 746 q 822 726 860 746 q 759 670 785 706 q 719 585 733 635 q 706 476 706 535 q 740 292 706 369 q 844 147 774 214 l 844 0 l 474 0 m 257 635 l 297 931 l 471 906 l 386 611 l 257 635 m 149 607 q 90 625 119 613 q 36 658 60 638 q -2 707 13 679 q -17 772 -17 735 q 33 878 -17 839 q 189 922 83 918 l 213 819 q 140 795 161 814 q 118 751 118 776 q 132 713 118 726 q 165 688 146 699 l 149 607 m 1685 -17 q 1590 0 1628 -17 q 1528 47 1551 17 q 1494 119 1504 76 q 1485 215 1485 163 l 1485 578 l 1690 578 q 1685 478 1688 529 q 1681 378 1683 428 q 1678 285 1679 329 q 1676 207 1676 242 q 1693 161 1676 174 q 1739 149 1710 149 q 1759 151 1747 149 q 1782 157 1771 153 l 1806 6 q 1756 -10 1783 -4 q 1685 -17 1729 -17 z \"},\"ᾮ\":{\"ha\":1628,\"x_min\":-33,\"x_max\":1625,\"o\":\"m 292 0 l 292 165 l 444 165 l 444 171 q 399 226 422 193 q 356 301 375 260 q 326 391 338 342 q 314 497 314 440 q 343 669 314 592 q 426 803 372 747 q 556 891 481 860 q 725 922 632 922 q 892 891 817 922 q 1022 803 968 860 q 1106 669 1076 747 q 1136 497 1136 592 q 1124 391 1136 440 q 1092 301 1111 342 q 1050 226 1074 260 q 1004 171 1026 193 l 1004 165 l 1157 165 l 1157 0 l 786 0 l 786 147 q 892 292 857 214 q 926 476 926 369 q 913 585 926 535 q 872 670 899 635 q 809 726 846 706 q 725 746 772 746 q 640 726 678 746 q 577 670 603 706 q 538 585 551 635 q 524 476 524 535 q 558 292 524 369 q 663 147 592 214 l 663 0 l 292 0 m -33 808 q 5 904 -24 879 q 83 929 33 929 q 127 922 108 929 q 161 906 146 915 q 190 890 176 897 q 218 883 204 883 q 242 891 233 883 q 254 922 250 899 l 343 910 q 305 813 333 838 q 226 789 276 789 q 183 796 201 789 q 149 811 164 803 q 119 826 133 819 q 90 833 104 833 q 67 826 75 833 q 56 796 58 818 l -33 808 m 106 560 l 93 625 q 124 633 113 628 q 135 650 135 639 q 116 671 135 663 q 44 682 97 679 l 64 764 q 223 737 178 760 q 268 671 268 714 q 220 593 268 619 q 106 560 172 567 m 1504 -17 q 1409 0 1447 -17 q 1347 47 1371 17 q 1314 119 1324 76 q 1304 215 1304 163 l 1304 578 l 1510 578 q 1505 478 1507 529 q 1501 378 1503 428 q 1497 285 1499 329 q 1496 207 1496 242 q 1513 161 1496 174 q 1558 149 1529 149 q 1578 151 1567 149 q 1601 157 1590 153 l 1625 6 q 1576 -10 1603 -4 q 1504 -17 1549 -17 z \"},\"ᾯ\":{\"ha\":1628,\"x_min\":-33,\"x_max\":1625,\"o\":\"m 292 0 l 292 165 l 444 165 l 444 171 q 399 226 422 193 q 356 301 375 260 q 326 391 338 342 q 314 497 314 440 q 343 669 314 592 q 426 803 372 747 q 556 891 481 860 q 725 922 632 922 q 892 891 817 922 q 1022 803 968 860 q 1106 669 1076 747 q 1136 497 1136 592 q 1124 391 1136 440 q 1092 301 1111 342 q 1050 226 1074 260 q 1004 171 1026 193 l 1004 165 l 1157 165 l 1157 0 l 786 0 l 786 147 q 892 292 857 214 q 926 476 926 369 q 913 585 926 535 q 872 670 899 635 q 809 726 846 706 q 725 746 772 746 q 640 726 678 746 q 577 670 603 706 q 538 585 551 635 q 524 476 524 535 q 558 292 524 369 q 663 147 592 214 l 663 0 l 292 0 m 203 560 q 88 593 136 567 q 40 671 40 619 q 51 708 40 692 q 85 737 61 725 q 149 755 110 749 q 246 764 189 761 l 265 682 q 193 671 213 679 q 174 650 174 663 q 217 625 174 632 l 203 560 m -33 808 q 5 904 -24 879 q 83 929 33 929 q 127 922 108 929 q 161 906 146 915 q 190 890 176 897 q 218 883 204 883 q 242 891 233 883 q 254 922 250 899 l 343 910 q 305 813 333 838 q 226 789 276 789 q 183 796 201 789 q 149 811 164 803 q 119 826 133 819 q 90 833 104 833 q 67 826 75 833 q 56 796 58 818 l -33 808 m 1504 -17 q 1409 0 1447 -17 q 1347 47 1371 17 q 1314 119 1324 76 q 1304 215 1304 163 l 1304 578 l 1510 578 q 1505 478 1507 529 q 1501 378 1503 428 q 1497 285 1499 329 q 1496 207 1496 242 q 1513 161 1496 174 q 1558 149 1529 149 q 1578 151 1567 149 q 1601 157 1590 153 l 1625 6 q 1576 -10 1603 -4 q 1504 -17 1549 -17 z \"},\"ἀ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 347 803 l 331 883 q 375 899 357 889 q 393 932 393 910 q 368 972 393 957 q 282 990 343 986 l 294 1115 q 410 1101 363 1114 q 486 1066 457 1088 q 528 1014 515 1044 q 542 947 542 983 q 526 885 542 911 q 483 842 510 860 q 422 815 457 825 q 347 803 386 806 z \"},\"ἁ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 467 789 q 392 801 428 792 q 331 828 357 811 q 288 872 304 846 q 272 933 272 897 q 285 996 272 968 q 328 1044 299 1024 q 404 1076 357 1064 q 519 1090 451 1088 l 532 976 q 446 958 471 972 q 421 918 421 943 q 439 885 421 896 q 483 869 457 875 l 467 789 z \"},\"ὰ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 393 794 l 142 1013 l 279 1147 l 493 894 l 393 794 z \"},\"ά\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 421 794 l 321 894 l 535 1147 l 672 1013 l 421 794 z \"},\"ἂ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 203 799 l 186 879 q 220 893 206 883 q 235 925 235 903 q 213 958 235 946 q 138 974 190 971 l 147 1088 q 315 1047 261 1085 q 369 947 369 1010 q 355 884 369 910 q 316 841 340 858 q 262 813 292 824 q 203 799 232 803 m 503 774 l 406 1069 l 571 1101 l 615 796 l 503 774 z \"},\"ἃ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 304 799 q 244 813 274 803 q 190 841 214 824 q 151 884 165 858 q 136 947 136 910 q 190 1047 136 1010 q 358 1088 244 1085 l 368 974 q 293 958 315 971 q 271 925 271 946 q 285 893 271 903 q 319 879 300 883 l 304 799 m 500 774 l 403 1069 l 568 1101 l 614 796 l 500 774 z \"},\"ἄ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 203 799 l 186 879 q 220 893 206 883 q 235 925 235 903 q 213 958 235 946 q 138 974 190 971 l 147 1088 q 315 1047 261 1085 q 369 947 369 1010 q 355 884 369 910 q 316 841 340 858 q 262 813 292 824 q 203 799 232 803 m 419 796 l 467 1101 l 631 1069 l 533 774 l 419 796 z \"},\"ἅ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 318 799 q 258 813 288 803 q 203 841 228 824 q 165 884 179 858 q 150 947 150 910 q 204 1047 150 1010 q 372 1088 258 1085 l 382 974 q 307 958 329 971 q 285 925 285 946 q 299 893 285 903 q 333 879 314 883 l 318 799 m 417 796 l 464 1101 l 629 1069 l 531 774 l 417 796 z \"},\"ἆ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 190 1024 q 233 1140 199 1103 q 326 1178 268 1178 q 376 1169 356 1178 q 415 1149 397 1160 q 447 1128 432 1138 q 476 1119 461 1119 q 519 1172 508 1119 l 624 1163 q 581 1046 615 1083 q 488 1008 546 1008 q 438 1017 458 1008 q 399 1038 417 1026 q 367 1058 382 1049 q 338 1067 353 1067 q 294 1014 306 1067 l 190 1024 m 358 782 l 346 847 q 376 856 365 850 q 388 872 388 861 q 369 892 388 885 q 297 904 350 900 l 315 986 q 475 958 429 982 q 521 893 521 935 q 473 815 521 842 q 358 782 425 789 z \"},\"ἇ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 456 782 q 341 815 389 789 q 293 893 293 842 q 303 931 293 914 q 338 958 314 947 q 402 976 363 969 q 499 986 442 983 l 517 904 q 445 892 464 900 q 426 872 426 885 q 438 856 426 861 q 468 847 449 850 l 456 782 m 190 1024 q 233 1140 199 1103 q 326 1178 268 1178 q 376 1169 356 1178 q 415 1149 397 1160 q 447 1128 432 1138 q 476 1119 461 1119 q 519 1172 508 1119 l 624 1163 q 581 1046 615 1083 q 488 1008 546 1008 q 438 1017 458 1008 q 399 1038 417 1026 q 367 1058 382 1049 q 338 1067 353 1067 q 294 1014 306 1067 l 190 1024 z \"},\"ᾰ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 407 794 q 304 811 347 794 q 232 858 261 828 q 188 927 203 888 q 172 1013 174 967 l 289 1032 q 324 955 296 988 q 407 922 351 922 q 490 955 463 922 q 525 1032 518 988 l 642 1013 q 626 927 640 967 q 583 858 611 888 q 510 811 554 828 q 407 794 467 794 z \"},\"ᾱ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 201 822 l 201 951 l 613 951 l 613 822 l 201 822 z \"},\"ᾶ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 499 796 q 440 810 465 796 q 392 840 414 824 q 353 871 371 857 q 319 885 336 885 q 287 867 299 885 q 271 808 275 849 l 143 815 q 190 975 146 924 q 315 1026 235 1026 q 374 1013 349 1026 q 422 982 400 999 q 460 951 443 965 q 494 938 478 938 q 543 1014 535 938 l 671 1007 q 624 847 668 899 q 499 796 579 796 z \"},\"ἐ\":{\"ha\":654,\"x_min\":50,\"x_max\":626,\"o\":\"m 372 -17 q 247 -3 306 -17 q 144 36 188 10 q 75 103 100 63 q 50 196 50 143 q 85 305 50 267 q 183 360 121 343 l 183 365 q 105 424 131 382 q 79 508 79 467 q 103 597 79 560 q 169 658 128 635 q 263 694 210 682 q 375 706 317 706 q 499 687 438 706 q 613 635 561 668 l 538 504 q 386 550 468 550 q 308 531 338 550 q 279 481 279 513 q 376 419 279 419 q 424 421 399 419 q 472 425 449 422 l 472 279 q 413 283 443 282 q 354 285 382 285 q 275 269 300 285 q 250 217 250 253 q 285 160 250 181 q 392 139 321 139 q 466 150 425 139 q 547 192 507 161 l 626 63 q 499 -1 560 14 q 372 -17 439 -17 m 301 789 l 285 869 q 329 885 311 875 q 347 918 347 896 q 322 958 347 943 q 236 976 297 972 l 249 1101 q 364 1087 317 1100 q 440 1052 411 1074 q 483 1000 469 1031 q 496 933 496 969 q 480 872 496 897 q 438 828 464 846 q 376 801 411 811 q 301 789 340 792 z \"},\"ἑ\":{\"ha\":654,\"x_min\":50,\"x_max\":626,\"o\":\"m 372 -17 q 247 -3 306 -17 q 144 36 188 10 q 75 103 100 63 q 50 196 50 143 q 85 305 50 267 q 183 360 121 343 l 183 365 q 105 424 131 382 q 79 508 79 467 q 103 597 79 560 q 169 658 128 635 q 263 694 210 682 q 375 706 317 706 q 499 687 438 706 q 613 635 561 668 l 538 504 q 386 550 468 550 q 308 531 338 550 q 279 481 279 513 q 376 419 279 419 q 424 421 399 419 q 472 425 449 422 l 472 279 q 413 283 443 282 q 354 285 382 285 q 275 269 300 285 q 250 217 250 253 q 285 160 250 181 q 392 139 321 139 q 466 150 425 139 q 547 192 507 161 l 626 63 q 499 -1 560 14 q 372 -17 439 -17 m 421 789 q 347 801 382 792 q 285 828 311 811 q 242 872 258 846 q 226 933 226 897 q 240 996 226 968 q 282 1044 253 1024 q 358 1076 311 1064 q 474 1090 406 1088 l 486 976 q 400 958 425 972 q 375 918 375 943 q 393 885 375 896 q 438 869 411 875 l 421 789 z \"},\"ὲ\":{\"ha\":654,\"x_min\":50,\"x_max\":626,\"o\":\"m 372 -17 q 247 -3 306 -17 q 144 36 188 10 q 75 103 100 63 q 50 196 50 143 q 85 305 50 267 q 183 360 121 343 l 183 365 q 105 424 131 382 q 79 508 79 467 q 103 597 79 560 q 169 658 128 635 q 263 694 210 682 q 375 706 317 706 q 499 687 438 706 q 613 635 561 668 l 538 504 q 386 550 468 550 q 308 531 338 550 q 279 481 279 513 q 376 419 279 419 q 424 421 399 419 q 472 425 449 422 l 472 279 q 413 283 443 282 q 354 285 382 285 q 275 269 300 285 q 250 217 250 253 q 285 160 250 181 q 392 139 321 139 q 466 150 425 139 q 547 192 507 161 l 626 63 q 499 -1 560 14 q 372 -17 439 -17 m 347 794 l 96 1013 l 233 1147 l 447 894 l 347 794 z \"},\"έ\":{\"ha\":654,\"x_min\":50,\"x_max\":626,\"o\":\"m 372 -17 q 247 -3 306 -17 q 144 36 188 10 q 75 103 100 63 q 50 196 50 143 q 85 305 50 267 q 183 360 121 343 l 183 365 q 105 424 131 382 q 79 508 79 467 q 103 597 79 560 q 169 658 128 635 q 263 694 210 682 q 375 706 317 706 q 499 687 438 706 q 613 635 561 668 l 538 504 q 386 550 468 550 q 308 531 338 550 q 279 481 279 513 q 376 419 279 419 q 424 421 399 419 q 472 425 449 422 l 472 279 q 413 283 443 282 q 354 285 382 285 q 275 269 300 285 q 250 217 250 253 q 285 160 250 181 q 392 139 321 139 q 466 150 425 139 q 547 192 507 161 l 626 63 q 499 -1 560 14 q 372 -17 439 -17 m 375 794 l 275 894 l 489 1147 l 626 1013 l 375 794 z \"},\"ἒ\":{\"ha\":654,\"x_min\":50,\"x_max\":626,\"o\":\"m 372 -17 q 247 -3 306 -17 q 144 36 188 10 q 75 103 100 63 q 50 196 50 143 q 85 305 50 267 q 183 360 121 343 l 183 365 q 105 424 131 382 q 79 508 79 467 q 103 597 79 560 q 169 658 128 635 q 263 694 210 682 q 375 706 317 706 q 499 687 438 706 q 613 635 561 668 l 538 504 q 386 550 468 550 q 308 531 338 550 q 279 481 279 513 q 376 419 279 419 q 424 421 399 419 q 472 425 449 422 l 472 279 q 413 283 443 282 q 354 285 382 285 q 275 269 300 285 q 250 217 250 253 q 285 160 250 181 q 392 139 321 139 q 466 150 425 139 q 547 192 507 161 l 626 63 q 499 -1 560 14 q 372 -17 439 -17 m 157 799 l 140 879 q 174 893 160 883 q 189 925 189 903 q 167 958 189 946 q 92 974 144 971 l 101 1088 q 269 1047 215 1085 q 324 947 324 1010 q 309 884 324 910 q 270 841 294 858 q 216 813 246 824 q 157 799 186 803 m 457 774 l 360 1069 l 525 1101 l 569 796 l 457 774 z \"},\"ἓ\":{\"ha\":654,\"x_min\":50,\"x_max\":626,\"o\":\"m 372 -17 q 247 -3 306 -17 q 144 36 188 10 q 75 103 100 63 q 50 196 50 143 q 85 305 50 267 q 183 360 121 343 l 183 365 q 105 424 131 382 q 79 508 79 467 q 103 597 79 560 q 169 658 128 635 q 263 694 210 682 q 375 706 317 706 q 499 687 438 706 q 613 635 561 668 l 538 504 q 386 550 468 550 q 308 531 338 550 q 279 481 279 513 q 376 419 279 419 q 424 421 399 419 q 472 425 449 422 l 472 279 q 413 283 443 282 q 354 285 382 285 q 275 269 300 285 q 250 217 250 253 q 285 160 250 181 q 392 139 321 139 q 466 150 425 139 q 547 192 507 161 l 626 63 q 499 -1 560 14 q 372 -17 439 -17 m 258 799 q 198 813 228 803 q 144 841 168 824 q 105 884 119 858 q 90 947 90 910 q 144 1047 90 1010 q 313 1088 199 1085 l 322 974 q 247 958 269 971 q 225 925 225 946 q 240 893 225 903 q 274 879 254 883 l 258 799 m 454 774 l 357 1069 l 522 1101 l 568 796 l 454 774 z \"},\"ἔ\":{\"ha\":654,\"x_min\":50,\"x_max\":626,\"o\":\"m 372 -17 q 247 -3 306 -17 q 144 36 188 10 q 75 103 100 63 q 50 196 50 143 q 85 305 50 267 q 183 360 121 343 l 183 365 q 105 424 131 382 q 79 508 79 467 q 103 597 79 560 q 169 658 128 635 q 263 694 210 682 q 375 706 317 706 q 499 687 438 706 q 613 635 561 668 l 538 504 q 386 550 468 550 q 308 531 338 550 q 279 481 279 513 q 376 419 279 419 q 424 421 399 419 q 472 425 449 422 l 472 279 q 413 283 443 282 q 354 285 382 285 q 275 269 300 285 q 250 217 250 253 q 285 160 250 181 q 392 139 321 139 q 466 150 425 139 q 547 192 507 161 l 626 63 q 499 -1 560 14 q 372 -17 439 -17 m 157 799 l 140 879 q 174 893 160 883 q 189 925 189 903 q 167 958 189 946 q 92 974 144 971 l 101 1088 q 269 1047 215 1085 q 324 947 324 1010 q 309 884 324 910 q 270 841 294 858 q 216 813 246 824 q 157 799 186 803 m 374 796 l 421 1101 l 585 1069 l 488 774 l 374 796 z \"},\"ἕ\":{\"ha\":654,\"x_min\":50,\"x_max\":626,\"o\":\"m 372 -17 q 247 -3 306 -17 q 144 36 188 10 q 75 103 100 63 q 50 196 50 143 q 85 305 50 267 q 183 360 121 343 l 183 365 q 105 424 131 382 q 79 508 79 467 q 103 597 79 560 q 169 658 128 635 q 263 694 210 682 q 375 706 317 706 q 499 687 438 706 q 613 635 561 668 l 538 504 q 386 550 468 550 q 308 531 338 550 q 279 481 279 513 q 376 419 279 419 q 424 421 399 419 q 472 425 449 422 l 472 279 q 413 283 443 282 q 354 285 382 285 q 275 269 300 285 q 250 217 250 253 q 285 160 250 181 q 392 139 321 139 q 466 150 425 139 q 547 192 507 161 l 626 63 q 499 -1 560 14 q 372 -17 439 -17 m 272 799 q 212 813 242 803 q 158 841 182 824 q 119 884 133 858 q 104 947 104 910 q 158 1047 104 1010 q 326 1088 213 1085 l 336 974 q 261 958 283 971 q 239 925 239 946 q 253 893 239 903 q 288 879 268 883 l 272 799 m 371 796 l 418 1101 l 583 1069 l 485 774 l 371 796 z \"},\"ἠ\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 365 789 l 349 869 q 393 885 375 875 q 411 918 411 896 q 386 958 411 943 q 300 976 361 972 l 313 1101 q 428 1087 381 1100 q 504 1052 475 1074 q 547 1000 533 1031 q 560 933 560 969 q 544 872 560 897 q 501 828 528 846 q 440 801 475 811 q 365 789 404 792 z \"},\"ἡ\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 485 789 q 410 801 446 792 q 349 828 375 811 q 306 872 322 846 q 290 933 290 897 q 303 996 290 968 q 346 1044 317 1024 q 422 1076 375 1064 q 538 1090 469 1088 l 550 976 q 464 958 489 972 q 439 918 439 943 q 457 885 439 896 q 501 869 475 875 l 485 789 z \"},\"ὴ\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 411 794 l 160 1013 l 297 1147 l 511 894 l 411 794 z \"},\"ή\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 439 794 l 339 894 l 553 1147 l 690 1013 l 439 794 z \"},\"ἢ\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 221 799 l 204 879 q 238 893 224 883 q 253 925 253 903 q 231 958 253 946 q 156 974 208 971 l 165 1088 q 333 1047 279 1085 q 388 947 388 1010 q 373 884 388 910 q 334 841 358 858 q 280 813 310 824 q 221 799 250 803 m 521 774 l 424 1069 l 589 1101 l 633 796 l 521 774 z \"},\"ἣ\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 322 799 q 262 813 292 803 q 208 841 232 824 q 169 884 183 858 q 154 947 154 910 q 208 1047 154 1010 q 376 1088 263 1085 l 386 974 q 311 958 333 971 q 289 925 289 946 q 303 893 289 903 q 338 879 318 883 l 322 799 m 518 774 l 421 1069 l 586 1101 l 632 796 l 518 774 z \"},\"ἤ\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 221 799 l 204 879 q 238 893 224 883 q 253 925 253 903 q 231 958 253 946 q 156 974 208 971 l 165 1088 q 333 1047 279 1085 q 388 947 388 1010 q 373 884 388 910 q 334 841 358 858 q 280 813 310 824 q 221 799 250 803 m 438 796 l 485 1101 l 649 1069 l 551 774 l 438 796 z \"},\"ἥ\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 336 799 q 276 813 306 803 q 222 841 246 824 q 183 884 197 858 q 168 947 168 910 q 222 1047 168 1010 q 390 1088 276 1085 l 400 974 q 325 958 347 971 q 303 925 303 946 q 317 893 303 903 q 351 879 332 883 l 336 799 m 435 796 l 482 1101 l 647 1069 l 549 774 l 435 796 z \"},\"ἦ\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 208 1024 q 251 1140 217 1103 q 344 1178 286 1178 q 394 1169 374 1178 q 433 1149 415 1160 q 465 1128 450 1138 q 494 1119 479 1119 q 538 1172 526 1119 l 642 1163 q 599 1046 633 1083 q 506 1008 564 1008 q 456 1017 476 1008 q 417 1038 435 1026 q 385 1058 400 1049 q 356 1067 371 1067 q 313 1014 324 1067 l 208 1024 m 376 782 l 364 847 q 394 856 383 850 q 406 872 406 861 q 387 892 406 885 q 315 904 368 900 l 333 986 q 493 958 447 982 q 539 893 539 935 q 491 815 539 842 q 376 782 443 789 z \"},\"ἧ\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 474 782 q 359 815 407 789 q 311 893 311 842 q 322 931 311 914 q 356 958 332 947 q 420 976 381 969 q 517 986 460 983 l 535 904 q 463 892 482 900 q 444 872 444 885 q 456 856 444 861 q 486 847 467 850 l 474 782 m 208 1024 q 251 1140 217 1103 q 344 1178 286 1178 q 394 1169 374 1178 q 433 1149 415 1160 q 465 1128 450 1138 q 494 1119 479 1119 q 538 1172 526 1119 l 642 1163 q 599 1046 633 1083 q 506 1008 564 1008 q 456 1017 476 1008 q 417 1038 435 1026 q 385 1058 400 1049 q 356 1067 371 1067 q 313 1014 324 1067 l 208 1024 z \"},\"ῆ\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 517 796 q 458 810 483 796 q 410 840 432 824 q 372 871 389 857 q 338 885 354 885 q 305 867 317 885 q 289 808 293 849 l 161 815 q 208 975 164 924 q 333 1026 253 1026 q 392 1013 367 1026 q 440 982 418 999 q 478 951 461 965 q 513 938 496 938 q 561 1014 553 938 l 689 1007 q 642 847 686 899 q 517 796 597 796 z \"},\"ἰ\":{\"ha\":418,\"x_min\":67,\"x_max\":407,\"o\":\"m 286 -17 q 191 0 229 -17 q 131 47 153 17 q 99 119 108 76 q 90 215 90 163 l 90 689 l 296 689 q 292 562 294 628 q 287 431 289 496 q 283 308 285 367 q 282 207 282 250 q 297 161 282 174 q 339 149 311 149 q 360 151 347 149 q 383 157 372 153 l 407 6 q 358 -10 385 -4 q 286 -17 331 -17 m 132 803 l 115 883 q 160 899 142 889 q 178 932 178 910 q 153 972 178 957 q 67 990 128 986 l 79 1115 q 194 1101 147 1114 q 271 1066 242 1088 q 313 1014 300 1044 q 326 947 326 983 q 310 885 326 911 q 268 842 294 860 q 206 815 242 825 q 132 803 171 806 z \"},\"ἱ\":{\"ha\":418,\"x_min\":57,\"x_max\":407,\"o\":\"m 286 -17 q 191 0 229 -17 q 131 47 153 17 q 99 119 108 76 q 90 215 90 163 l 90 689 l 296 689 q 292 562 294 628 q 287 431 289 496 q 283 308 285 367 q 282 207 282 250 q 297 161 282 174 q 339 149 311 149 q 360 151 347 149 q 383 157 372 153 l 407 6 q 358 -10 385 -4 q 286 -17 331 -17 m 251 789 q 177 801 213 792 q 115 828 142 811 q 73 872 89 846 q 57 933 57 897 q 70 996 57 968 q 113 1044 83 1024 q 189 1076 142 1064 q 304 1090 236 1088 l 317 976 q 231 958 256 972 q 206 918 206 943 q 224 885 206 896 q 268 869 242 875 l 251 789 z \"},\"ὶ\":{\"ha\":418,\"x_min\":-74,\"x_max\":407,\"o\":\"m 286 -17 q 191 0 229 -17 q 131 47 153 17 q 99 119 108 76 q 90 215 90 163 l 90 689 l 296 689 q 292 562 294 628 q 287 431 289 496 q 283 308 285 367 q 282 207 282 250 q 297 161 282 174 q 339 149 311 149 q 360 151 347 149 q 383 157 372 153 l 407 6 q 358 -10 385 -4 q 286 -17 331 -17 m 178 794 l -74 1013 l 64 1147 l 278 894 l 178 794 z \"},\"ί\":{\"ha\":418,\"x_min\":90,\"x_max\":457,\"o\":\"m 286 -17 q 191 0 229 -17 q 131 47 153 17 q 99 119 108 76 q 90 215 90 163 l 90 689 l 296 689 q 292 562 294 628 q 287 431 289 496 q 283 308 285 367 q 282 207 282 250 q 297 161 282 174 q 339 149 311 149 q 360 151 347 149 q 383 157 372 153 l 407 6 q 358 -10 385 -4 q 286 -17 331 -17 m 206 794 l 106 894 l 319 1147 l 457 1013 l 206 794 z \"},\"ἲ\":{\"ha\":418,\"x_min\":-78,\"x_max\":407,\"o\":\"m 286 -17 q 191 0 229 -17 q 131 47 153 17 q 99 119 108 76 q 90 215 90 163 l 90 689 l 296 689 q 292 562 294 628 q 287 431 289 496 q 283 308 285 367 q 282 207 282 250 q 297 161 282 174 q 339 149 311 149 q 360 151 347 149 q 383 157 372 153 l 407 6 q 358 -10 385 -4 q 286 -17 331 -17 m -12 799 l -29 879 q 5 893 -10 883 q 19 925 19 903 q -3 958 19 946 q -78 974 -25 971 l -68 1088 q 100 1047 46 1085 q 154 947 154 1010 q 140 884 154 910 q 101 841 125 858 q 47 813 76 824 q -12 799 17 803 m 288 774 l 190 1069 l 356 1101 l 400 796 l 288 774 z \"},\"ἳ\":{\"ha\":418,\"x_min\":-79,\"x_max\":407,\"o\":\"m 286 -17 q 191 0 229 -17 q 131 47 153 17 q 99 119 108 76 q 90 215 90 163 l 90 689 l 296 689 q 292 562 294 628 q 287 431 289 496 q 283 308 285 367 q 282 207 282 250 q 297 161 282 174 q 339 149 311 149 q 360 151 347 149 q 383 157 372 153 l 407 6 q 358 -10 385 -4 q 286 -17 331 -17 m 89 799 q 28 813 58 803 q -26 841 -1 824 q -65 884 -50 858 q -79 947 -79 910 q -25 1047 -79 1010 q 143 1088 29 1085 l 153 974 q 78 958 100 971 q 56 925 56 946 q 70 893 56 903 q 104 879 85 883 l 89 799 m 285 774 l 188 1069 l 353 1101 l 399 796 l 285 774 z \"},\"ἴ\":{\"ha\":418,\"x_min\":-78,\"x_max\":415,\"o\":\"m 286 -17 q 191 0 229 -17 q 131 47 153 17 q 99 119 108 76 q 90 215 90 163 l 90 689 l 296 689 q 292 562 294 628 q 287 431 289 496 q 283 308 285 367 q 282 207 282 250 q 297 161 282 174 q 339 149 311 149 q 360 151 347 149 q 383 157 372 153 l 407 6 q 358 -10 385 -4 q 286 -17 331 -17 m -12 799 l -29 879 q 5 893 -10 883 q 19 925 19 903 q -3 958 19 946 q -78 974 -25 971 l -68 1088 q 100 1047 46 1085 q 154 947 154 1010 q 140 884 154 910 q 101 841 125 858 q 47 813 76 824 q -12 799 17 803 m 204 796 l 251 1101 l 415 1069 l 318 774 l 204 796 z \"},\"ἵ\":{\"ha\":418,\"x_min\":-65,\"x_max\":414,\"o\":\"m 286 -17 q 191 0 229 -17 q 131 47 153 17 q 99 119 108 76 q 90 215 90 163 l 90 689 l 296 689 q 292 562 294 628 q 287 431 289 496 q 283 308 285 367 q 282 207 282 250 q 297 161 282 174 q 339 149 311 149 q 360 151 347 149 q 383 157 372 153 l 407 6 q 358 -10 385 -4 q 286 -17 331 -17 m 103 799 q 42 813 72 803 q -12 841 13 824 q -51 884 -36 858 q -65 947 -65 910 q -11 1047 -65 1010 q 157 1088 43 1085 l 167 974 q 92 958 114 971 q 69 925 69 946 q 84 893 69 903 q 118 879 99 883 l 103 799 m 201 796 l 249 1101 l 414 1069 l 315 774 l 201 796 z \"},\"ἶ\":{\"ha\":418,\"x_min\":-25,\"x_max\":408,\"o\":\"m 286 -17 q 191 0 229 -17 q 131 47 153 17 q 99 119 108 76 q 90 215 90 163 l 90 689 l 296 689 q 292 562 294 628 q 287 431 289 496 q 283 308 285 367 q 282 207 282 250 q 297 161 282 174 q 339 149 311 149 q 360 151 347 149 q 383 157 372 153 l 407 6 q 358 -10 385 -4 q 286 -17 331 -17 m -25 1024 q 18 1140 -17 1103 q 111 1178 53 1178 q 161 1169 140 1178 q 199 1149 182 1160 q 231 1128 217 1138 q 261 1119 246 1119 q 304 1172 293 1119 l 408 1163 q 365 1046 400 1083 q 272 1008 331 1008 q 222 1017 243 1008 q 184 1038 201 1026 q 152 1058 167 1049 q 122 1067 138 1067 q 79 1014 90 1067 l -25 1024 m 143 782 l 131 847 q 161 856 150 850 q 172 872 172 861 q 153 892 172 885 q 82 904 135 900 l 100 986 q 260 958 214 982 q 306 893 306 935 q 258 815 306 842 q 143 782 210 789 z \"},\"ἷ\":{\"ha\":418,\"x_min\":-25,\"x_max\":408,\"o\":\"m 286 -17 q 191 0 229 -17 q 131 47 153 17 q 99 119 108 76 q 90 215 90 163 l 90 689 l 296 689 q 292 562 294 628 q 287 431 289 496 q 283 308 285 367 q 282 207 282 250 q 297 161 282 174 q 339 149 311 149 q 360 151 347 149 q 383 157 372 153 l 407 6 q 358 -10 385 -4 q 286 -17 331 -17 m 240 782 q 126 815 174 789 q 78 893 78 842 q 88 931 78 914 q 123 958 99 947 q 187 976 147 969 q 283 986 226 983 l 301 904 q 230 892 249 900 q 211 872 211 885 q 222 856 211 861 q 253 847 233 850 l 240 782 m -25 1024 q 18 1140 -17 1103 q 111 1178 53 1178 q 161 1169 140 1178 q 199 1149 182 1160 q 231 1128 217 1138 q 261 1119 246 1119 q 304 1172 293 1119 l 408 1163 q 365 1046 400 1083 q 272 1008 331 1008 q 222 1017 243 1008 q 184 1038 201 1026 q 152 1058 167 1049 q 122 1067 138 1067 q 79 1014 90 1067 l -25 1024 z \"},\"ῐ\":{\"ha\":418,\"x_min\":-43,\"x_max\":426,\"o\":\"m 286 -17 q 191 0 229 -17 q 131 47 153 17 q 99 119 108 76 q 90 215 90 163 l 90 689 l 296 689 q 292 562 294 628 q 287 431 289 496 q 283 308 285 367 q 282 207 282 250 q 297 161 282 174 q 339 149 311 149 q 360 151 347 149 q 383 157 372 153 l 407 6 q 358 -10 385 -4 q 286 -17 331 -17 m 192 794 q 89 811 132 794 q 17 858 46 828 q -27 927 -12 888 q -43 1013 -42 967 l 74 1032 q 108 955 81 988 q 192 922 136 922 q 275 955 247 922 q 310 1032 303 988 l 426 1013 q 410 927 425 967 q 367 858 396 888 q 295 811 339 828 q 192 794 251 794 z \"},\"ῑ\":{\"ha\":418,\"x_min\":-14,\"x_max\":407,\"o\":\"m 286 -17 q 191 0 229 -17 q 131 47 153 17 q 99 119 108 76 q 90 215 90 163 l 90 689 l 296 689 q 292 562 294 628 q 287 431 289 496 q 283 308 285 367 q 282 207 282 250 q 297 161 282 174 q 339 149 311 149 q 360 151 347 149 q 383 157 372 153 l 407 6 q 358 -10 385 -4 q 286 -17 331 -17 m -14 822 l -14 951 l 397 951 l 397 822 l -14 822 z \"},\"ῖ\":{\"ha\":418,\"x_min\":-72,\"x_max\":456,\"o\":\"m 286 -17 q 191 0 229 -17 q 131 47 153 17 q 99 119 108 76 q 90 215 90 163 l 90 689 l 296 689 q 292 562 294 628 q 287 431 289 496 q 283 308 285 367 q 282 207 282 250 q 297 161 282 174 q 339 149 311 149 q 360 151 347 149 q 383 157 372 153 l 407 6 q 358 -10 385 -4 q 286 -17 331 -17 m 283 796 q 224 810 250 796 q 177 840 199 824 q 138 871 156 857 q 104 885 121 885 q 72 867 83 885 q 56 808 60 849 l -72 815 q -25 975 -69 924 q 100 1026 19 1026 q 159 1013 133 1026 q 206 982 185 999 q 245 951 228 965 q 279 938 263 938 q 328 1014 319 938 l 456 1007 q 408 847 453 899 q 283 796 364 796 z \"},\"ῒ\":{\"ha\":418,\"x_min\":-71,\"x_max\":454,\"o\":\"m 286 -17 q 191 0 229 -17 q 131 47 153 17 q 99 119 108 76 q 90 215 90 163 l 90 689 l 296 689 q 292 562 294 628 q 287 431 289 496 q 283 308 285 367 q 282 207 282 250 q 297 161 282 174 q 339 149 311 149 q 360 151 347 149 q 383 157 372 153 l 407 6 q 358 -10 385 -4 q 286 -17 331 -17 m 7 811 q -48 833 -25 811 q -71 890 -71 854 q -48 947 -71 926 q 7 968 -25 968 q 63 947 40 968 q 86 890 86 926 q 63 833 86 854 q 7 811 40 811 m 172 788 l 71 1083 l 214 1113 l 263 807 l 172 788 m 376 811 q 320 833 343 811 q 297 890 297 854 q 320 947 297 926 q 376 968 343 968 q 431 947 408 968 q 454 890 454 926 q 431 833 454 854 q 376 811 408 811 z \"},\"ΐ\":{\"ha\":418,\"x_min\":-71,\"x_max\":454,\"o\":\"m 286 -17 q 191 0 229 -17 q 131 47 153 17 q 99 119 108 76 q 90 215 90 163 l 90 689 l 296 689 q 292 562 294 628 q 287 431 289 496 q 283 308 285 367 q 282 207 282 250 q 297 161 282 174 q 339 149 311 149 q 360 151 347 149 q 383 157 372 153 l 407 6 q 358 -10 385 -4 q 286 -17 331 -17 m 121 807 l 171 1113 l 314 1083 l 211 788 l 121 807 m 7 811 q -48 833 -25 811 q -71 890 -71 854 q -48 947 -71 926 q 7 968 -25 968 q 63 947 40 968 q 86 890 86 926 q 63 833 86 854 q 7 811 40 811 m 376 811 q 320 833 343 811 q 297 890 297 854 q 320 947 297 926 q 376 968 343 968 q 431 947 408 968 q 454 890 454 926 q 431 833 454 854 q 376 811 408 811 z \"},\"ῗ\":{\"ha\":418,\"x_min\":-46,\"x_max\":429,\"o\":\"m 286 -17 q 191 0 229 -17 q 131 47 153 17 q 99 119 108 76 q 90 215 90 163 l 90 689 l 296 689 q 292 562 294 628 q 287 431 289 496 q 283 308 285 367 q 282 207 282 250 q 297 161 282 174 q 339 149 311 149 q 360 151 347 149 q 383 157 372 153 l 407 6 q 358 -10 385 -4 q 286 -17 331 -17 m -31 1010 q 11 1126 -24 1088 q 99 1165 46 1165 q 157 1156 132 1165 q 201 1135 182 1146 q 238 1114 221 1124 q 274 1104 254 1104 q 325 1158 313 1104 l 414 1149 q 372 1033 407 1072 q 285 993 338 993 q 226 1003 251 993 q 182 1024 201 1013 q 145 1044 163 1035 q 110 1054 128 1054 q 78 1042 90 1054 q 58 1000 65 1029 l -31 1010 m 40 793 q -22 817 3 793 q -46 878 -46 842 q -22 939 -46 914 q 40 964 3 964 q 102 939 78 964 q 126 878 126 914 q 102 817 126 842 q 40 793 78 793 m 343 793 q 281 817 306 793 q 257 878 257 842 q 281 939 257 914 q 343 964 306 964 q 405 939 381 964 q 429 878 429 914 q 405 817 429 842 q 343 793 381 793 z \"},\"ὀ\":{\"ha\":768,\"x_min\":50,\"x_max\":718,\"o\":\"m 383 -17 q 258 8 318 -17 q 151 78 197 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 151 611 106 565 q 258 681 197 657 q 383 706 318 706 q 510 681 450 706 q 617 611 571 657 q 690 498 663 565 q 718 344 718 431 q 690 191 718 258 q 617 78 663 124 q 510 8 571 32 q 383 -17 450 -17 m 383 149 q 478 201 449 149 q 508 344 508 254 q 478 488 508 435 q 383 540 449 540 q 290 488 319 540 q 260 344 260 435 q 290 201 260 254 q 383 149 319 149 m 328 803 l 311 883 q 356 899 338 889 q 374 932 374 910 q 349 972 374 957 q 263 990 324 986 l 275 1115 q 390 1101 343 1114 q 467 1066 438 1088 q 509 1014 496 1044 q 522 947 522 983 q 506 885 522 911 q 464 842 490 860 q 402 815 438 825 q 328 803 367 806 z \"},\"ὁ\":{\"ha\":768,\"x_min\":50,\"x_max\":718,\"o\":\"m 383 -17 q 258 8 318 -17 q 151 78 197 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 151 611 106 565 q 258 681 197 657 q 383 706 318 706 q 510 681 450 706 q 617 611 571 657 q 690 498 663 565 q 718 344 718 431 q 690 191 718 258 q 617 78 663 124 q 510 8 571 32 q 383 -17 450 -17 m 383 149 q 478 201 449 149 q 508 344 508 254 q 478 488 508 435 q 383 540 449 540 q 290 488 319 540 q 260 344 260 435 q 290 201 260 254 q 383 149 319 149 m 447 789 q 373 801 408 792 q 311 828 338 811 q 269 872 285 846 q 253 933 253 897 q 266 996 253 968 q 308 1044 279 1024 q 385 1076 338 1064 q 500 1090 432 1088 l 513 976 q 426 958 451 972 q 401 918 401 943 q 419 885 401 896 q 464 869 438 875 l 447 789 z \"},\"ὸ\":{\"ha\":768,\"x_min\":50,\"x_max\":718,\"o\":\"m 383 -17 q 258 8 318 -17 q 151 78 197 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 151 611 106 565 q 258 681 197 657 q 383 706 318 706 q 510 681 450 706 q 617 611 571 657 q 690 498 663 565 q 718 344 718 431 q 690 191 718 258 q 617 78 663 124 q 510 8 571 32 q 383 -17 450 -17 m 383 149 q 478 201 449 149 q 508 344 508 254 q 478 488 508 435 q 383 540 449 540 q 290 488 319 540 q 260 344 260 435 q 290 201 260 254 q 383 149 319 149 m 374 794 l 122 1013 l 260 1147 l 474 894 l 374 794 z \"},\"ό\":{\"ha\":768,\"x_min\":50,\"x_max\":718,\"o\":\"m 383 -17 q 258 8 318 -17 q 151 78 197 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 151 611 106 565 q 258 681 197 657 q 383 706 318 706 q 510 681 450 706 q 617 611 571 657 q 690 498 663 565 q 718 344 718 431 q 690 191 718 258 q 617 78 663 124 q 510 8 571 32 q 383 -17 450 -17 m 383 149 q 478 201 449 149 q 508 344 508 254 q 478 488 508 435 q 383 540 449 540 q 290 488 319 540 q 260 344 260 435 q 290 201 260 254 q 383 149 319 149 m 401 794 l 301 894 l 515 1147 l 653 1013 l 401 794 z \"},\"ὂ\":{\"ha\":768,\"x_min\":50,\"x_max\":718,\"o\":\"m 383 -17 q 258 8 318 -17 q 151 78 197 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 151 611 106 565 q 258 681 197 657 q 383 706 318 706 q 510 681 450 706 q 617 611 571 657 q 690 498 663 565 q 718 344 718 431 q 690 191 718 258 q 617 78 663 124 q 510 8 571 32 q 383 -17 450 -17 m 383 149 q 478 201 449 149 q 508 344 508 254 q 478 488 508 435 q 383 540 449 540 q 290 488 319 540 q 260 344 260 435 q 290 201 260 254 q 383 149 319 149 m 183 799 l 167 879 q 201 893 186 883 q 215 925 215 903 q 193 958 215 946 q 118 974 171 971 l 128 1088 q 296 1047 242 1085 q 350 947 350 1010 q 335 884 350 910 q 297 841 321 858 q 242 813 272 824 q 183 799 213 803 m 483 774 l 386 1069 l 551 1101 l 596 796 l 483 774 z \"},\"ὃ\":{\"ha\":768,\"x_min\":50,\"x_max\":718,\"o\":\"m 383 -17 q 258 8 318 -17 q 151 78 197 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 151 611 106 565 q 258 681 197 657 q 383 706 318 706 q 510 681 450 706 q 617 611 571 657 q 690 498 663 565 q 718 344 718 431 q 690 191 718 258 q 617 78 663 124 q 510 8 571 32 q 383 -17 450 -17 m 383 149 q 478 201 449 149 q 508 344 508 254 q 478 488 508 435 q 383 540 449 540 q 290 488 319 540 q 260 344 260 435 q 290 201 260 254 q 383 149 319 149 m 285 799 q 224 813 254 803 q 170 841 194 824 q 131 884 146 858 q 117 947 117 910 q 171 1047 117 1010 q 339 1088 225 1085 l 349 974 q 274 958 296 971 q 251 925 251 946 q 266 893 251 903 q 300 879 281 883 l 285 799 m 481 774 l 383 1069 l 549 1101 l 594 796 l 481 774 z \"},\"ὄ\":{\"ha\":768,\"x_min\":50,\"x_max\":718,\"o\":\"m 383 -17 q 258 8 318 -17 q 151 78 197 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 151 611 106 565 q 258 681 197 657 q 383 706 318 706 q 510 681 450 706 q 617 611 571 657 q 690 498 663 565 q 718 344 718 431 q 690 191 718 258 q 617 78 663 124 q 510 8 571 32 q 383 -17 450 -17 m 383 149 q 478 201 449 149 q 508 344 508 254 q 478 488 508 435 q 383 540 449 540 q 290 488 319 540 q 260 344 260 435 q 290 201 260 254 q 383 149 319 149 m 183 799 l 167 879 q 201 893 186 883 q 215 925 215 903 q 193 958 215 946 q 118 974 171 971 l 128 1088 q 296 1047 242 1085 q 350 947 350 1010 q 335 884 350 910 q 297 841 321 858 q 242 813 272 824 q 183 799 213 803 m 400 796 l 447 1101 l 611 1069 l 514 774 l 400 796 z \"},\"ὅ\":{\"ha\":768,\"x_min\":50,\"x_max\":718,\"o\":\"m 383 -17 q 258 8 318 -17 q 151 78 197 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 151 611 106 565 q 258 681 197 657 q 383 706 318 706 q 510 681 450 706 q 617 611 571 657 q 690 498 663 565 q 718 344 718 431 q 690 191 718 258 q 617 78 663 124 q 510 8 571 32 q 383 -17 450 -17 m 383 149 q 478 201 449 149 q 508 344 508 254 q 478 488 508 435 q 383 540 449 540 q 290 488 319 540 q 260 344 260 435 q 290 201 260 254 q 383 149 319 149 m 299 799 q 238 813 268 803 q 184 841 208 824 q 145 884 160 858 q 131 947 131 910 q 185 1047 131 1010 q 353 1088 239 1085 l 363 974 q 288 958 310 971 q 265 925 265 946 q 280 893 265 903 q 314 879 294 883 l 299 799 m 397 796 l 444 1101 l 610 1069 l 511 774 l 397 796 z \"},\"ῤ\":{\"ha\":790,\"x_min\":85,\"x_max\":735,\"o\":\"m 85 -246 l 85 329 q 110 498 85 426 q 179 615 135 569 q 283 683 224 661 q 414 706 343 706 q 650 614 565 706 q 735 356 735 522 q 710 198 735 267 q 647 81 686 129 q 556 8 607 33 q 450 -17 504 -17 q 360 -1 406 -17 q 276 60 314 15 q 284 -94 281 -19 q 290 -246 288 -169 l 85 -246 m 401 150 q 490 198 453 150 q 526 353 526 246 q 407 539 526 539 q 313 488 349 539 q 276 349 276 436 l 276 206 q 340 161 308 172 q 401 150 371 150 m 356 803 l 339 883 q 383 899 365 889 q 401 932 401 910 q 376 972 401 957 q 290 990 351 986 l 303 1115 q 418 1101 371 1114 q 494 1066 465 1088 q 537 1014 524 1044 q 550 947 550 983 q 534 885 550 911 q 492 842 518 860 q 430 815 465 825 q 356 803 394 806 z \"},\"ῥ\":{\"ha\":790,\"x_min\":85,\"x_max\":735,\"o\":\"m 85 -246 l 85 329 q 110 498 85 426 q 179 615 135 569 q 283 683 224 661 q 414 706 343 706 q 650 614 565 706 q 735 356 735 522 q 710 198 735 267 q 647 81 686 129 q 556 8 607 33 q 450 -17 504 -17 q 360 -1 406 -17 q 276 60 314 15 q 284 -94 281 -19 q 290 -246 288 -169 l 85 -246 m 401 150 q 490 198 453 150 q 526 353 526 246 q 407 539 526 539 q 313 488 349 539 q 276 349 276 436 l 276 206 q 340 161 308 172 q 401 150 371 150 m 475 789 q 401 801 436 792 q 339 828 365 811 q 297 872 313 846 q 281 933 281 897 q 294 996 281 968 q 336 1044 307 1024 q 413 1076 365 1064 q 528 1090 460 1088 l 540 976 q 454 958 479 972 q 429 918 429 943 q 447 885 429 896 q 492 869 465 875 l 475 789 z \"},\"ὐ\":{\"ha\":739,\"x_min\":60,\"x_max\":679,\"o\":\"m 361 -17 q 228 5 283 -17 q 138 65 174 26 q 86 158 103 104 q 69 278 69 213 q 72 377 69 326 q 75 478 75 428 q 72 575 75 518 q 60 689 69 632 l 257 689 q 267 610 264 653 q 269 519 269 568 q 265 402 269 475 q 261 260 261 329 q 290 176 261 204 q 361 149 318 149 q 446 197 417 149 q 475 351 475 246 q 465 493 475 418 q 429 663 454 568 l 626 706 q 665 535 650 622 q 679 361 679 449 q 598 84 679 185 q 361 -17 517 -17 m 306 803 l 289 883 q 333 899 315 889 q 351 932 351 910 q 326 972 351 957 q 240 990 301 986 l 253 1115 q 368 1101 321 1114 q 444 1066 415 1088 q 487 1014 474 1044 q 500 947 500 983 q 484 885 500 911 q 442 842 468 860 q 380 815 415 825 q 306 803 344 806 z \"},\"ὑ\":{\"ha\":739,\"x_min\":60,\"x_max\":679,\"o\":\"m 361 -17 q 228 5 283 -17 q 138 65 174 26 q 86 158 103 104 q 69 278 69 213 q 72 377 69 326 q 75 478 75 428 q 72 575 75 518 q 60 689 69 632 l 257 689 q 267 610 264 653 q 269 519 269 568 q 265 402 269 475 q 261 260 261 329 q 290 176 261 204 q 361 149 318 149 q 446 197 417 149 q 475 351 475 246 q 465 493 475 418 q 429 663 454 568 l 626 706 q 665 535 650 622 q 679 361 679 449 q 598 84 679 185 q 361 -17 517 -17 m 425 789 q 351 801 386 792 q 289 828 315 811 q 247 872 263 846 q 231 933 231 897 q 244 996 231 968 q 286 1044 257 1024 q 363 1076 315 1064 q 478 1090 410 1088 l 490 976 q 404 958 429 972 q 379 918 379 943 q 397 885 379 896 q 442 869 415 875 l 425 789 z \"},\"ὺ\":{\"ha\":739,\"x_min\":60,\"x_max\":679,\"o\":\"m 361 -17 q 228 5 283 -17 q 138 65 174 26 q 86 158 103 104 q 69 278 69 213 q 72 377 69 326 q 75 478 75 428 q 72 575 75 518 q 60 689 69 632 l 257 689 q 267 610 264 653 q 269 519 269 568 q 265 402 269 475 q 261 260 261 329 q 290 176 261 204 q 361 149 318 149 q 446 197 417 149 q 475 351 475 246 q 465 493 475 418 q 429 663 454 568 l 626 706 q 665 535 650 622 q 679 361 679 449 q 598 84 679 185 q 361 -17 517 -17 m 351 794 l 100 1013 l 238 1147 l 451 894 l 351 794 z \"},\"ύ\":{\"ha\":739,\"x_min\":60,\"x_max\":679,\"o\":\"m 361 -17 q 228 5 283 -17 q 138 65 174 26 q 86 158 103 104 q 69 278 69 213 q 72 377 69 326 q 75 478 75 428 q 72 575 75 518 q 60 689 69 632 l 257 689 q 267 610 264 653 q 269 519 269 568 q 265 402 269 475 q 261 260 261 329 q 290 176 261 204 q 361 149 318 149 q 446 197 417 149 q 475 351 475 246 q 465 493 475 418 q 429 663 454 568 l 626 706 q 665 535 650 622 q 679 361 679 449 q 598 84 679 185 q 361 -17 517 -17 m 379 794 l 279 894 l 493 1147 l 631 1013 l 379 794 z \"},\"ὒ\":{\"ha\":739,\"x_min\":60,\"x_max\":679,\"o\":\"m 361 -17 q 228 5 283 -17 q 138 65 174 26 q 86 158 103 104 q 69 278 69 213 q 72 377 69 326 q 75 478 75 428 q 72 575 75 518 q 60 689 69 632 l 257 689 q 267 610 264 653 q 269 519 269 568 q 265 402 269 475 q 261 260 261 329 q 290 176 261 204 q 361 149 318 149 q 446 197 417 149 q 475 351 475 246 q 465 493 475 418 q 429 663 454 568 l 626 706 q 665 535 650 622 q 679 361 679 449 q 598 84 679 185 q 361 -17 517 -17 m 161 799 l 144 879 q 178 893 164 883 q 193 925 193 903 q 171 958 193 946 q 96 974 149 971 l 106 1088 q 274 1047 219 1085 q 328 947 328 1010 q 313 884 328 910 q 274 841 299 858 q 220 813 250 824 q 161 799 190 803 m 461 774 l 364 1069 l 529 1101 l 574 796 l 461 774 z \"},\"ὓ\":{\"ha\":739,\"x_min\":60,\"x_max\":679,\"o\":\"m 361 -17 q 228 5 283 -17 q 138 65 174 26 q 86 158 103 104 q 69 278 69 213 q 72 377 69 326 q 75 478 75 428 q 72 575 75 518 q 60 689 69 632 l 257 689 q 267 610 264 653 q 269 519 269 568 q 265 402 269 475 q 261 260 261 329 q 290 176 261 204 q 361 149 318 149 q 446 197 417 149 q 475 351 475 246 q 465 493 475 418 q 429 663 454 568 l 626 706 q 665 535 650 622 q 679 361 679 449 q 598 84 679 185 q 361 -17 517 -17 m 263 799 q 202 813 232 803 q 148 841 172 824 q 109 884 124 858 q 94 947 94 910 q 149 1047 94 1010 q 317 1088 203 1085 l 326 974 q 251 958 274 971 q 229 925 229 946 q 244 893 229 903 q 278 879 258 883 l 263 799 m 458 774 l 361 1069 l 526 1101 l 572 796 l 458 774 z \"},\"ὔ\":{\"ha\":739,\"x_min\":60,\"x_max\":679,\"o\":\"m 361 -17 q 228 5 283 -17 q 138 65 174 26 q 86 158 103 104 q 69 278 69 213 q 72 377 69 326 q 75 478 75 428 q 72 575 75 518 q 60 689 69 632 l 257 689 q 267 610 264 653 q 269 519 269 568 q 265 402 269 475 q 261 260 261 329 q 290 176 261 204 q 361 149 318 149 q 446 197 417 149 q 475 351 475 246 q 465 493 475 418 q 429 663 454 568 l 626 706 q 665 535 650 622 q 679 361 679 449 q 598 84 679 185 q 361 -17 517 -17 m 161 799 l 144 879 q 178 893 164 883 q 193 925 193 903 q 171 958 193 946 q 96 974 149 971 l 106 1088 q 274 1047 219 1085 q 328 947 328 1010 q 313 884 328 910 q 274 841 299 858 q 220 813 250 824 q 161 799 190 803 m 378 796 l 425 1101 l 589 1069 l 492 774 l 378 796 z \"},\"ὕ\":{\"ha\":739,\"x_min\":60,\"x_max\":679,\"o\":\"m 361 -17 q 228 5 283 -17 q 138 65 174 26 q 86 158 103 104 q 69 278 69 213 q 72 377 69 326 q 75 478 75 428 q 72 575 75 518 q 60 689 69 632 l 257 689 q 267 610 264 653 q 269 519 269 568 q 265 402 269 475 q 261 260 261 329 q 290 176 261 204 q 361 149 318 149 q 446 197 417 149 q 475 351 475 246 q 465 493 475 418 q 429 663 454 568 l 626 706 q 665 535 650 622 q 679 361 679 449 q 598 84 679 185 q 361 -17 517 -17 m 276 799 q 216 813 246 803 q 162 841 186 824 q 123 884 138 858 q 108 947 108 910 q 163 1047 108 1010 q 331 1088 217 1085 l 340 974 q 265 958 288 971 q 243 925 243 946 q 258 893 243 903 q 292 879 272 883 l 276 799 m 375 796 l 422 1101 l 588 1069 l 489 774 l 375 796 z \"},\"ὖ\":{\"ha\":739,\"x_min\":60,\"x_max\":679,\"o\":\"m 361 -17 q 228 5 283 -17 q 138 65 174 26 q 86 158 103 104 q 69 278 69 213 q 72 377 69 326 q 75 478 75 428 q 72 575 75 518 q 60 689 69 632 l 257 689 q 267 610 264 653 q 269 519 269 568 q 265 402 269 475 q 261 260 261 329 q 290 176 261 204 q 361 149 318 149 q 446 197 417 149 q 475 351 475 246 q 465 493 475 418 q 429 663 454 568 l 626 706 q 665 535 650 622 q 679 361 679 449 q 598 84 679 185 q 361 -17 517 -17 m 149 1024 q 192 1140 157 1103 q 285 1178 226 1178 q 335 1169 314 1178 q 373 1149 356 1160 q 405 1128 390 1138 q 435 1119 419 1119 q 478 1172 467 1119 l 582 1163 q 539 1046 574 1083 q 446 1008 504 1008 q 396 1017 417 1008 q 358 1038 375 1026 q 326 1058 340 1049 q 296 1067 311 1067 q 253 1014 264 1067 l 149 1024 m 317 782 l 304 847 q 335 856 324 850 q 346 872 346 861 q 327 892 346 885 q 256 904 308 900 l 274 986 q 433 958 388 982 q 479 893 479 935 q 431 815 479 842 q 317 782 383 789 z \"},\"ὗ\":{\"ha\":739,\"x_min\":60,\"x_max\":679,\"o\":\"m 361 -17 q 228 5 283 -17 q 138 65 174 26 q 86 158 103 104 q 69 278 69 213 q 72 377 69 326 q 75 478 75 428 q 72 575 75 518 q 60 689 69 632 l 257 689 q 267 610 264 653 q 269 519 269 568 q 265 402 269 475 q 261 260 261 329 q 290 176 261 204 q 361 149 318 149 q 446 197 417 149 q 475 351 475 246 q 465 493 475 418 q 429 663 454 568 l 626 706 q 665 535 650 622 q 679 361 679 449 q 598 84 679 185 q 361 -17 517 -17 m 414 782 q 299 815 347 789 q 251 893 251 842 q 262 931 251 914 q 297 958 272 947 q 360 976 321 969 q 457 986 400 983 l 475 904 q 403 892 422 900 q 385 872 385 885 q 396 856 385 861 q 426 847 407 850 l 414 782 m 149 1024 q 192 1140 157 1103 q 285 1178 226 1178 q 335 1169 314 1178 q 373 1149 356 1160 q 405 1128 390 1138 q 435 1119 419 1119 q 478 1172 467 1119 l 582 1163 q 539 1046 574 1083 q 446 1008 504 1008 q 396 1017 417 1008 q 358 1038 375 1026 q 326 1058 340 1049 q 296 1067 311 1067 q 253 1014 264 1067 l 149 1024 z \"},\"ῦ\":{\"ha\":739,\"x_min\":60,\"x_max\":679,\"o\":\"m 361 -17 q 228 5 283 -17 q 138 65 174 26 q 86 158 103 104 q 69 278 69 213 q 72 377 69 326 q 75 478 75 428 q 72 575 75 518 q 60 689 69 632 l 257 689 q 267 610 264 653 q 269 519 269 568 q 265 402 269 475 q 261 260 261 329 q 290 176 261 204 q 361 149 318 149 q 446 197 417 149 q 475 351 475 246 q 465 493 475 418 q 429 663 454 568 l 626 706 q 665 535 650 622 q 679 361 679 449 q 598 84 679 185 q 361 -17 517 -17 m 457 796 q 398 810 424 796 q 351 840 372 824 q 312 871 329 857 q 278 885 294 885 q 245 867 257 885 q 229 808 233 849 l 101 815 q 149 975 104 924 q 274 1026 193 1026 q 333 1013 307 1026 q 380 982 358 999 q 419 951 401 965 q 453 938 436 938 q 501 1014 493 938 l 629 1007 q 582 847 626 899 q 457 796 538 796 z \"},\"ῠ\":{\"ha\":739,\"x_min\":60,\"x_max\":679,\"o\":\"m 361 -17 q 228 5 283 -17 q 138 65 174 26 q 86 158 103 104 q 69 278 69 213 q 72 377 69 326 q 75 478 75 428 q 72 575 75 518 q 60 689 69 632 l 257 689 q 267 610 264 653 q 269 519 269 568 q 265 402 269 475 q 261 260 261 329 q 290 176 261 204 q 361 149 318 149 q 446 197 417 149 q 475 351 475 246 q 465 493 475 418 q 429 663 454 568 l 626 706 q 665 535 650 622 q 679 361 679 449 q 598 84 679 185 q 361 -17 517 -17 m 365 794 q 263 811 306 794 q 190 858 219 828 q 147 927 161 888 q 131 1013 132 967 l 247 1032 q 282 955 254 988 q 365 922 310 922 q 449 955 421 922 q 483 1032 476 988 l 600 1013 q 584 927 599 967 q 541 858 569 888 q 469 811 513 828 q 365 794 425 794 z \"},\"ῡ\":{\"ha\":739,\"x_min\":60,\"x_max\":679,\"o\":\"m 361 -17 q 228 5 283 -17 q 138 65 174 26 q 86 158 103 104 q 69 278 69 213 q 72 377 69 326 q 75 478 75 428 q 72 575 75 518 q 60 689 69 632 l 257 689 q 267 610 264 653 q 269 519 269 568 q 265 402 269 475 q 261 260 261 329 q 290 176 261 204 q 361 149 318 149 q 446 197 417 149 q 475 351 475 246 q 465 493 475 418 q 429 663 454 568 l 626 706 q 665 535 650 622 q 679 361 679 449 q 598 84 679 185 q 361 -17 517 -17 m 160 822 l 160 951 l 571 951 l 571 822 l 160 822 z \"},\"ῢ\":{\"ha\":739,\"x_min\":60,\"x_max\":679,\"o\":\"m 361 -17 q 228 5 283 -17 q 138 65 174 26 q 86 158 103 104 q 69 278 69 213 q 72 377 69 326 q 75 478 75 428 q 72 575 75 518 q 60 689 69 632 l 257 689 q 267 610 264 653 q 269 519 269 568 q 265 402 269 475 q 261 260 261 329 q 290 176 261 204 q 361 149 318 149 q 446 197 417 149 q 475 351 475 246 q 465 493 475 418 q 429 663 454 568 l 626 706 q 665 535 650 622 q 679 361 679 449 q 598 84 679 185 q 361 -17 517 -17 m 181 811 q 126 833 149 811 q 103 890 103 854 q 126 947 103 926 q 181 968 149 968 q 237 947 214 968 q 260 890 260 926 q 237 833 260 854 q 181 811 214 811 m 346 788 l 244 1083 l 388 1113 l 436 807 l 346 788 m 550 811 q 494 833 517 811 q 471 890 471 854 q 494 947 471 926 q 550 968 517 968 q 605 947 582 968 q 628 890 628 926 q 605 833 628 854 q 550 811 582 811 z \"},\"ΰ\":{\"ha\":739,\"x_min\":60,\"x_max\":679,\"o\":\"m 361 -17 q 228 5 283 -17 q 138 65 174 26 q 86 158 103 104 q 69 278 69 213 q 72 377 69 326 q 75 478 75 428 q 72 575 75 518 q 60 689 69 632 l 257 689 q 267 610 264 653 q 269 519 269 568 q 265 402 269 475 q 261 260 261 329 q 290 176 261 204 q 361 149 318 149 q 446 197 417 149 q 475 351 475 246 q 465 493 475 418 q 429 663 454 568 l 626 706 q 665 535 650 622 q 679 361 679 449 q 598 84 679 185 q 361 -17 517 -17 m 294 807 l 344 1113 l 488 1083 l 385 788 l 294 807 m 181 811 q 126 833 149 811 q 103 890 103 854 q 126 947 103 926 q 181 968 149 968 q 237 947 214 968 q 260 890 260 926 q 237 833 260 854 q 181 811 214 811 m 550 811 q 494 833 517 811 q 471 890 471 854 q 494 947 471 926 q 550 968 517 968 q 605 947 582 968 q 628 890 628 926 q 605 833 628 854 q 550 811 582 811 z \"},\"ῧ\":{\"ha\":739,\"x_min\":60,\"x_max\":679,\"o\":\"m 361 -17 q 228 5 283 -17 q 138 65 174 26 q 86 158 103 104 q 69 278 69 213 q 72 377 69 326 q 75 478 75 428 q 72 575 75 518 q 60 689 69 632 l 257 689 q 267 610 264 653 q 269 519 269 568 q 265 402 269 475 q 261 260 261 329 q 290 176 261 204 q 361 149 318 149 q 446 197 417 149 q 475 351 475 246 q 465 493 475 418 q 429 663 454 568 l 626 706 q 665 535 650 622 q 679 361 679 449 q 598 84 679 185 q 361 -17 517 -17 m 143 1010 q 185 1126 150 1088 q 272 1165 219 1165 q 331 1156 306 1165 q 375 1135 356 1146 q 411 1114 394 1124 q 447 1104 428 1104 q 499 1158 486 1104 l 588 1149 q 546 1033 581 1072 q 458 993 511 993 q 400 1003 425 993 q 356 1024 375 1013 q 319 1044 336 1035 q 283 1054 301 1054 q 251 1042 264 1054 q 232 1000 239 1029 l 143 1010 m 214 793 q 152 817 176 793 q 128 878 128 842 q 152 939 128 914 q 214 964 176 964 q 276 939 251 964 q 300 878 300 914 q 276 817 300 842 q 214 793 251 793 m 517 793 q 455 817 479 793 q 431 878 431 842 q 455 939 431 914 q 517 964 479 964 q 578 939 554 964 q 603 878 603 914 q 578 817 603 842 q 517 793 554 793 z \"},\"ὠ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 458 803 l 442 883 q 486 899 468 889 q 504 932 504 910 q 479 972 504 957 q 393 990 454 986 l 406 1115 q 521 1101 474 1114 q 597 1066 568 1088 q 640 1014 626 1044 q 653 947 653 983 q 637 885 653 911 q 594 842 621 860 q 533 815 568 825 q 458 803 497 806 z \"},\"ὡ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 578 789 q 503 801 539 792 q 442 828 468 811 q 399 872 415 846 q 383 933 383 897 q 397 996 383 968 q 439 1044 410 1024 q 515 1076 468 1064 q 631 1090 563 1088 l 643 976 q 557 958 582 972 q 532 918 532 943 q 550 885 532 896 q 594 869 568 875 l 578 789 z \"},\"ὼ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 504 794 l 253 1013 l 390 1147 l 604 894 l 504 794 z \"},\"ώ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 532 794 l 432 894 l 646 1147 l 783 1013 l 532 794 z \"},\"ὢ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 314 799 l 297 879 q 331 893 317 883 q 346 925 346 903 q 324 958 346 946 q 249 974 301 971 l 258 1088 q 426 1047 372 1085 q 481 947 481 1010 q 466 884 481 910 q 427 841 451 858 q 373 813 403 824 q 314 799 343 803 m 614 774 l 517 1069 l 682 1101 l 726 796 l 614 774 z \"},\"ὣ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 415 799 q 355 813 385 803 q 301 841 325 824 q 262 884 276 858 q 247 947 247 910 q 301 1047 247 1010 q 469 1088 356 1085 l 479 974 q 404 958 426 971 q 382 925 382 946 q 397 893 382 903 q 431 879 411 883 l 415 799 m 611 774 l 514 1069 l 679 1101 l 725 796 l 611 774 z \"},\"ὤ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 314 799 l 297 879 q 331 893 317 883 q 346 925 346 903 q 324 958 346 946 q 249 974 301 971 l 258 1088 q 426 1047 372 1085 q 481 947 481 1010 q 466 884 481 910 q 427 841 451 858 q 373 813 403 824 q 314 799 343 803 m 531 796 l 578 1101 l 742 1069 l 644 774 l 531 796 z \"},\"ὥ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 429 799 q 369 813 399 803 q 315 841 339 824 q 276 884 290 858 q 261 947 261 910 q 315 1047 261 1010 q 483 1088 369 1085 l 493 974 q 418 958 440 971 q 396 925 396 946 q 410 893 396 903 q 444 879 425 883 l 429 799 m 528 796 l 575 1101 l 740 1069 l 642 774 l 528 796 z \"},\"ὦ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 301 1024 q 344 1140 310 1103 q 438 1178 379 1178 q 488 1169 467 1178 q 526 1149 508 1160 q 558 1128 543 1138 q 588 1119 572 1119 q 631 1172 619 1119 l 735 1163 q 692 1046 726 1083 q 599 1008 657 1008 q 549 1017 569 1008 q 510 1038 528 1026 q 478 1058 493 1049 q 449 1067 464 1067 q 406 1014 417 1067 l 301 1024 m 469 782 l 457 847 q 488 856 476 850 q 499 872 499 861 q 480 892 499 885 q 408 904 461 900 l 426 986 q 586 958 540 982 q 632 893 632 935 q 584 815 632 842 q 469 782 536 789 z \"},\"ὧ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 567 782 q 452 815 500 789 q 404 893 404 842 q 415 931 404 914 q 449 958 425 947 q 513 976 474 969 q 610 986 553 983 l 628 904 q 556 892 575 900 q 538 872 538 885 q 549 856 538 861 q 579 847 560 850 l 567 782 m 301 1024 q 344 1140 310 1103 q 438 1178 379 1178 q 488 1169 467 1178 q 526 1149 508 1160 q 558 1128 543 1138 q 588 1119 572 1119 q 631 1172 619 1119 l 735 1163 q 692 1046 726 1083 q 599 1008 657 1008 q 549 1017 569 1008 q 510 1038 528 1026 q 478 1058 493 1049 q 449 1067 464 1067 q 406 1014 417 1067 l 301 1024 z \"},\"ῶ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 610 796 q 551 810 576 796 q 503 840 525 824 q 465 871 482 857 q 431 885 447 885 q 398 867 410 885 q 382 808 386 849 l 254 815 q 301 975 257 924 q 426 1026 346 1026 q 485 1013 460 1026 q 533 982 511 999 q 572 951 554 965 q 606 938 589 938 q 654 1014 646 938 l 782 1007 q 735 847 779 899 q 610 796 690 796 z \"},\"ᾳ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 501 -300 q 381 -252 415 -300 q 347 -124 347 -204 l 347 -76 l 494 -76 q 492 -107 492 -92 q 492 -132 492 -122 q 506 -169 492 -160 q 543 -178 521 -178 q 553 -178 549 -178 q 567 -175 557 -178 l 586 -285 q 551 -296 571 -292 q 501 -300 531 -300 z \"},\"ᾀ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 501 -300 q 381 -252 415 -300 q 347 -124 347 -204 l 347 -76 l 494 -76 q 492 -107 492 -92 q 492 -132 492 -122 q 506 -169 492 -160 q 543 -178 521 -178 q 553 -178 549 -178 q 567 -175 557 -178 l 586 -285 q 551 -296 571 -292 q 501 -300 531 -300 m 347 803 l 331 883 q 375 899 357 889 q 393 932 393 910 q 368 972 393 957 q 282 990 343 986 l 294 1115 q 410 1101 363 1114 q 486 1066 457 1088 q 528 1014 515 1044 q 542 947 542 983 q 526 885 542 911 q 483 842 510 860 q 422 815 457 825 q 347 803 386 806 z \"},\"ᾁ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 501 -300 q 381 -252 415 -300 q 347 -124 347 -204 l 347 -76 l 494 -76 q 492 -107 492 -92 q 492 -132 492 -122 q 506 -169 492 -160 q 543 -178 521 -178 q 553 -178 549 -178 q 567 -175 557 -178 l 586 -285 q 551 -296 571 -292 q 501 -300 531 -300 m 467 789 q 392 801 428 792 q 331 828 357 811 q 288 872 304 846 q 272 933 272 897 q 285 996 272 968 q 328 1044 299 1024 q 404 1076 357 1064 q 519 1090 451 1088 l 532 976 q 446 958 471 972 q 421 918 421 943 q 439 885 421 896 q 483 869 457 875 l 467 789 z \"},\"ᾲ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 501 -300 q 381 -252 415 -300 q 347 -124 347 -204 l 347 -76 l 494 -76 q 492 -107 492 -92 q 492 -132 492 -122 q 506 -169 492 -160 q 543 -178 521 -178 q 553 -178 549 -178 q 567 -175 557 -178 l 586 -285 q 551 -296 571 -292 q 501 -300 531 -300 m 393 794 l 142 1013 l 279 1147 l 493 894 l 393 794 z \"},\"ᾴ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 501 -300 q 381 -252 415 -300 q 347 -124 347 -204 l 347 -76 l 494 -76 q 492 -107 492 -92 q 492 -132 492 -122 q 506 -169 492 -160 q 543 -178 521 -178 q 553 -178 549 -178 q 567 -175 557 -178 l 586 -285 q 551 -296 571 -292 q 501 -300 531 -300 m 421 794 l 321 894 l 535 1147 l 672 1013 l 421 794 z \"},\"ᾂ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 501 -300 q 381 -252 415 -300 q 347 -124 347 -204 l 347 -76 l 494 -76 q 492 -107 492 -92 q 492 -132 492 -122 q 506 -169 492 -160 q 543 -178 521 -178 q 553 -178 549 -178 q 567 -175 557 -178 l 586 -285 q 551 -296 571 -292 q 501 -300 531 -300 m 203 799 l 186 879 q 220 893 206 883 q 235 925 235 903 q 213 958 235 946 q 138 974 190 971 l 147 1088 q 315 1047 261 1085 q 369 947 369 1010 q 355 884 369 910 q 316 841 340 858 q 262 813 292 824 q 203 799 232 803 m 503 774 l 406 1069 l 571 1101 l 615 796 l 503 774 z \"},\"ᾃ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 501 -300 q 381 -252 415 -300 q 347 -124 347 -204 l 347 -76 l 494 -76 q 492 -107 492 -92 q 492 -132 492 -122 q 506 -169 492 -160 q 543 -178 521 -178 q 553 -178 549 -178 q 567 -175 557 -178 l 586 -285 q 551 -296 571 -292 q 501 -300 531 -300 m 304 799 q 244 813 274 803 q 190 841 214 824 q 151 884 165 858 q 136 947 136 910 q 190 1047 136 1010 q 358 1088 244 1085 l 368 974 q 293 958 315 971 q 271 925 271 946 q 285 893 271 903 q 319 879 300 883 l 304 799 m 500 774 l 403 1069 l 568 1101 l 614 796 l 500 774 z \"},\"ᾄ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 501 -300 q 381 -252 415 -300 q 347 -124 347 -204 l 347 -76 l 494 -76 q 492 -107 492 -92 q 492 -132 492 -122 q 506 -169 492 -160 q 543 -178 521 -178 q 553 -178 549 -178 q 567 -175 557 -178 l 586 -285 q 551 -296 571 -292 q 501 -300 531 -300 m 203 799 l 186 879 q 220 893 206 883 q 235 925 235 903 q 213 958 235 946 q 138 974 190 971 l 147 1088 q 315 1047 261 1085 q 369 947 369 1010 q 355 884 369 910 q 316 841 340 858 q 262 813 292 824 q 203 799 232 803 m 419 796 l 467 1101 l 631 1069 l 533 774 l 419 796 z \"},\"ᾅ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 501 -300 q 381 -252 415 -300 q 347 -124 347 -204 l 347 -76 l 494 -76 q 492 -107 492 -92 q 492 -132 492 -122 q 506 -169 492 -160 q 543 -178 521 -178 q 553 -178 549 -178 q 567 -175 557 -178 l 586 -285 q 551 -296 571 -292 q 501 -300 531 -300 m 318 799 q 258 813 288 803 q 203 841 228 824 q 165 884 179 858 q 150 947 150 910 q 204 1047 150 1010 q 372 1088 258 1085 l 382 974 q 307 958 329 971 q 285 925 285 946 q 299 893 285 903 q 333 879 314 883 l 318 799 m 417 796 l 464 1101 l 629 1069 l 531 774 l 417 796 z \"},\"ᾆ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 501 -300 q 381 -252 415 -300 q 347 -124 347 -204 l 347 -76 l 494 -76 q 492 -107 492 -92 q 492 -132 492 -122 q 506 -169 492 -160 q 543 -178 521 -178 q 553 -178 549 -178 q 567 -175 557 -178 l 586 -285 q 551 -296 571 -292 q 501 -300 531 -300 m 190 1024 q 233 1140 199 1103 q 326 1178 268 1178 q 376 1169 356 1178 q 415 1149 397 1160 q 447 1128 432 1138 q 476 1119 461 1119 q 519 1172 508 1119 l 624 1163 q 581 1046 615 1083 q 488 1008 546 1008 q 438 1017 458 1008 q 399 1038 417 1026 q 367 1058 382 1049 q 338 1067 353 1067 q 294 1014 306 1067 l 190 1024 m 358 782 l 346 847 q 376 856 365 850 q 388 872 388 861 q 369 892 388 885 q 297 904 350 900 l 315 986 q 475 958 429 982 q 521 893 521 935 q 473 815 521 842 q 358 782 425 789 z \"},\"ᾇ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 501 -300 q 381 -252 415 -300 q 347 -124 347 -204 l 347 -76 l 494 -76 q 492 -107 492 -92 q 492 -132 492 -122 q 506 -169 492 -160 q 543 -178 521 -178 q 553 -178 549 -178 q 567 -175 557 -178 l 586 -285 q 551 -296 571 -292 q 501 -300 531 -300 m 456 782 q 341 815 389 789 q 293 893 293 842 q 303 931 293 914 q 338 958 314 947 q 402 976 363 969 q 499 986 442 983 l 517 904 q 445 892 464 900 q 426 872 426 885 q 438 856 426 861 q 468 847 449 850 l 456 782 m 190 1024 q 233 1140 199 1103 q 326 1178 268 1178 q 376 1169 356 1178 q 415 1149 397 1160 q 447 1128 432 1138 q 476 1119 461 1119 q 519 1172 508 1119 l 624 1163 q 581 1046 615 1083 q 488 1008 546 1008 q 438 1017 458 1008 q 399 1038 417 1026 q 367 1058 382 1049 q 338 1067 353 1067 q 294 1014 306 1067 l 190 1024 z \"},\"ᾷ\":{\"ha\":826,\"x_min\":50,\"x_max\":821,\"o\":\"m 326 -17 q 213 8 264 -17 q 126 78 163 32 q 69 190 89 124 q 50 342 50 257 q 75 494 50 426 q 142 609 100 563 q 240 681 185 656 q 354 706 294 706 q 462 674 413 706 q 544 568 511 643 l 550 568 l 572 689 l 774 689 q 744 562 760 629 q 716 430 729 494 q 694 308 703 365 q 685 211 685 250 q 703 163 685 176 q 751 149 722 149 q 796 157 772 149 l 821 7 q 772 -10 801 -3 q 700 -17 742 -17 q 584 9 626 -17 q 522 97 542 35 l 518 97 q 326 -17 449 -17 m 375 150 q 419 162 397 150 q 459 194 442 174 q 488 241 476 214 q 500 299 499 268 l 510 418 q 386 539 467 539 q 340 528 363 539 q 299 492 317 517 q 271 431 282 468 q 260 343 260 394 q 291 197 260 243 q 375 150 322 150 m 501 -300 q 381 -252 415 -300 q 347 -124 347 -204 l 347 -76 l 494 -76 q 492 -107 492 -92 q 492 -132 492 -122 q 506 -169 492 -160 q 543 -178 521 -178 q 553 -178 549 -178 q 567 -175 557 -178 l 586 -285 q 551 -296 571 -292 q 501 -300 531 -300 m 499 796 q 440 810 465 796 q 392 840 414 824 q 353 871 371 857 q 319 885 336 885 q 287 867 299 885 q 271 808 275 849 l 143 815 q 190 975 146 924 q 315 1026 235 1026 q 374 1013 349 1026 q 422 982 400 999 q 460 951 443 965 q 494 938 478 938 q 543 1014 535 938 l 671 1007 q 624 847 668 899 q 499 796 579 796 z \"},\"ῃ\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 267 -300 q 147 -252 181 -300 q 113 -124 113 -204 l 113 -76 l 260 -76 q 257 -107 257 -92 q 257 -132 257 -122 q 272 -169 257 -160 q 308 -178 286 -178 q 318 -178 314 -178 q 332 -175 322 -178 l 351 -285 q 316 -296 336 -292 q 267 -300 296 -300 z \"},\"ᾐ\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 267 -300 q 147 -252 181 -300 q 113 -124 113 -204 l 113 -76 l 260 -76 q 257 -107 257 -92 q 257 -132 257 -122 q 272 -169 257 -160 q 308 -178 286 -178 q 318 -178 314 -178 q 332 -175 322 -178 l 351 -285 q 316 -296 336 -292 q 267 -300 296 -300 m 365 803 l 349 883 q 393 899 375 889 q 411 932 411 910 q 386 972 411 957 q 300 990 361 986 l 313 1115 q 428 1101 381 1114 q 504 1066 475 1088 q 547 1014 533 1044 q 560 947 560 983 q 544 885 560 911 q 501 842 528 860 q 440 815 475 825 q 365 803 404 806 z \"},\"ᾑ\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 267 -300 q 147 -252 181 -300 q 113 -124 113 -204 l 113 -76 l 260 -76 q 257 -107 257 -92 q 257 -132 257 -122 q 272 -169 257 -160 q 308 -178 286 -178 q 318 -178 314 -178 q 332 -175 322 -178 l 351 -285 q 316 -296 336 -292 q 267 -300 296 -300 m 485 789 q 410 801 446 792 q 349 828 375 811 q 306 872 322 846 q 290 933 290 897 q 303 996 290 968 q 346 1044 317 1024 q 422 1076 375 1064 q 538 1090 469 1088 l 550 976 q 464 958 489 972 q 439 918 439 943 q 457 885 439 896 q 501 869 475 875 l 485 789 z \"},\"ῂ\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 267 -300 q 147 -252 181 -300 q 113 -124 113 -204 l 113 -76 l 260 -76 q 257 -107 257 -92 q 257 -132 257 -122 q 272 -169 257 -160 q 308 -178 286 -178 q 318 -178 314 -178 q 332 -175 322 -178 l 351 -285 q 316 -296 336 -292 q 267 -300 296 -300 m 411 794 l 160 1013 l 297 1147 l 511 894 l 411 794 z \"},\"ῄ\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 267 -300 q 147 -252 181 -300 q 113 -124 113 -204 l 113 -76 l 260 -76 q 257 -107 257 -92 q 257 -132 257 -122 q 272 -169 257 -160 q 308 -178 286 -178 q 318 -178 314 -178 q 332 -175 322 -178 l 351 -285 q 316 -296 336 -292 q 267 -300 296 -300 m 439 794 l 339 894 l 553 1147 l 690 1013 l 439 794 z \"},\"ᾒ\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 267 -300 q 147 -252 181 -300 q 113 -124 113 -204 l 113 -76 l 260 -76 q 257 -107 257 -92 q 257 -132 257 -122 q 272 -169 257 -160 q 308 -178 286 -178 q 318 -178 314 -178 q 332 -175 322 -178 l 351 -285 q 316 -296 336 -292 q 267 -300 296 -300 m 221 799 l 204 879 q 238 893 224 883 q 253 925 253 903 q 231 958 253 946 q 156 974 208 971 l 165 1088 q 333 1047 279 1085 q 388 947 388 1010 q 373 884 388 910 q 334 841 358 858 q 280 813 310 824 q 221 799 250 803 m 521 774 l 424 1069 l 589 1101 l 633 796 l 521 774 z \"},\"ᾓ\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 267 -300 q 147 -252 181 -300 q 113 -124 113 -204 l 113 -76 l 260 -76 q 257 -107 257 -92 q 257 -132 257 -122 q 272 -169 257 -160 q 308 -178 286 -178 q 318 -178 314 -178 q 332 -175 322 -178 l 351 -285 q 316 -296 336 -292 q 267 -300 296 -300 m 322 799 q 262 813 292 803 q 208 841 232 824 q 169 884 183 858 q 154 947 154 910 q 208 1047 154 1010 q 376 1088 263 1085 l 386 974 q 311 958 333 971 q 289 925 289 946 q 303 893 289 903 q 338 879 318 883 l 322 799 m 518 774 l 421 1069 l 586 1101 l 632 796 l 518 774 z \"},\"ᾔ\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 267 -300 q 147 -252 181 -300 q 113 -124 113 -204 l 113 -76 l 260 -76 q 257 -107 257 -92 q 257 -132 257 -122 q 272 -169 257 -160 q 308 -178 286 -178 q 318 -178 314 -178 q 332 -175 322 -178 l 351 -285 q 316 -296 336 -292 q 267 -300 296 -300 m 221 799 l 204 879 q 238 893 224 883 q 253 925 253 903 q 231 958 253 946 q 156 974 208 971 l 165 1088 q 333 1047 279 1085 q 388 947 388 1010 q 373 884 388 910 q 334 841 358 858 q 280 813 310 824 q 221 799 250 803 m 438 796 l 485 1101 l 649 1069 l 551 774 l 438 796 z \"},\"ᾕ\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 267 -300 q 147 -252 181 -300 q 113 -124 113 -204 l 113 -76 l 260 -76 q 257 -107 257 -92 q 257 -132 257 -122 q 272 -169 257 -160 q 308 -178 286 -178 q 318 -178 314 -178 q 332 -175 322 -178 l 351 -285 q 316 -296 336 -292 q 267 -300 296 -300 m 336 799 q 276 813 306 803 q 222 841 246 824 q 183 884 197 858 q 168 947 168 910 q 222 1047 168 1010 q 390 1088 276 1085 l 400 974 q 325 958 347 971 q 303 925 303 946 q 317 893 303 903 q 351 879 332 883 l 336 799 m 435 796 l 482 1101 l 647 1069 l 549 774 l 435 796 z \"},\"ᾖ\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 267 -300 q 147 -252 181 -300 q 113 -124 113 -204 l 113 -76 l 260 -76 q 257 -107 257 -92 q 257 -132 257 -122 q 272 -169 257 -160 q 308 -178 286 -178 q 318 -178 314 -178 q 332 -175 322 -178 l 351 -285 q 316 -296 336 -292 q 267 -300 296 -300 m 208 1024 q 251 1140 217 1103 q 344 1178 286 1178 q 394 1169 374 1178 q 433 1149 415 1160 q 465 1128 450 1138 q 494 1119 479 1119 q 538 1172 526 1119 l 642 1163 q 599 1046 633 1083 q 506 1008 564 1008 q 456 1017 476 1008 q 417 1038 435 1026 q 385 1058 400 1049 q 356 1067 371 1067 q 313 1014 324 1067 l 208 1024 m 376 782 l 364 847 q 394 856 383 850 q 406 872 406 861 q 387 892 406 885 q 315 904 368 900 l 333 986 q 493 958 447 982 q 539 893 539 935 q 491 815 539 842 q 376 782 443 789 z \"},\"ᾗ\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 267 -300 q 147 -252 181 -300 q 113 -124 113 -204 l 113 -76 l 260 -76 q 257 -107 257 -92 q 257 -132 257 -122 q 272 -169 257 -160 q 308 -178 286 -178 q 318 -178 314 -178 q 332 -175 322 -178 l 351 -285 q 316 -296 336 -292 q 267 -300 296 -300 m 474 782 q 359 815 407 789 q 311 893 311 842 q 322 931 311 914 q 356 958 332 947 q 420 976 381 969 q 517 986 460 983 l 535 904 q 463 892 482 900 q 444 872 444 885 q 456 856 444 861 q 486 847 467 850 l 474 782 m 208 1024 q 251 1140 217 1103 q 344 1178 286 1178 q 394 1169 374 1178 q 433 1149 415 1160 q 465 1128 450 1138 q 494 1119 479 1119 q 538 1172 526 1119 l 642 1163 q 599 1046 633 1083 q 506 1008 564 1008 q 456 1017 476 1008 q 417 1038 435 1026 q 385 1058 400 1049 q 356 1067 371 1067 q 313 1014 324 1067 l 208 1024 z \"},\"ῇ\":{\"ha\":781,\"x_min\":75,\"x_max\":697,\"o\":\"m 490 -246 q 496 -76 493 -165 q 501 100 499 14 q 504 264 503 186 q 506 401 506 342 q 488 504 506 476 q 424 532 469 532 q 358 507 388 532 q 294 432 328 482 l 294 0 l 90 0 l 90 478 q 88 575 90 518 q 75 689 85 632 l 257 689 l 271 569 l 276 569 q 372 667 321 628 q 496 706 424 706 q 651 631 606 706 q 697 428 697 557 l 697 -246 l 490 -246 m 267 -300 q 147 -252 181 -300 q 113 -124 113 -204 l 113 -76 l 260 -76 q 257 -107 257 -92 q 257 -132 257 -122 q 272 -169 257 -160 q 308 -178 286 -178 q 318 -178 314 -178 q 332 -175 322 -178 l 351 -285 q 316 -296 336 -292 q 267 -300 296 -300 m 517 796 q 458 810 483 796 q 410 840 432 824 q 372 871 389 857 q 338 885 354 885 q 305 867 317 885 q 289 808 293 849 l 161 815 q 208 975 164 924 q 333 1026 253 1026 q 392 1013 367 1026 q 440 982 418 999 q 478 951 461 965 q 513 938 496 938 q 561 1014 553 938 l 689 1007 q 642 847 686 899 q 517 796 597 796 z \"},\"ῳ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 590 -300 q 470 -252 504 -300 q 436 -124 436 -204 l 436 -76 l 583 -76 q 581 -107 581 -92 q 581 -132 581 -122 q 595 -169 581 -160 q 632 -178 610 -178 q 642 -178 638 -178 q 656 -175 646 -178 l 675 -285 q 640 -296 660 -292 q 590 -300 619 -300 z \"},\"ᾠ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 590 -300 q 470 -252 504 -300 q 436 -124 436 -204 l 436 -76 l 583 -76 q 581 -107 581 -92 q 581 -132 581 -122 q 595 -169 581 -160 q 632 -178 610 -178 q 642 -178 638 -178 q 656 -175 646 -178 l 675 -285 q 640 -296 660 -292 q 590 -300 619 -300 m 458 803 l 442 883 q 486 899 468 889 q 504 932 504 910 q 479 972 504 957 q 393 990 454 986 l 406 1115 q 521 1101 474 1114 q 597 1066 568 1088 q 640 1014 626 1044 q 653 947 653 983 q 637 885 653 911 q 594 842 621 860 q 533 815 568 825 q 458 803 497 806 z \"},\"ᾡ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 590 -300 q 470 -252 504 -300 q 436 -124 436 -204 l 436 -76 l 583 -76 q 581 -107 581 -92 q 581 -132 581 -122 q 595 -169 581 -160 q 632 -178 610 -178 q 642 -178 638 -178 q 656 -175 646 -178 l 675 -285 q 640 -296 660 -292 q 590 -300 619 -300 m 578 789 q 503 801 539 792 q 442 828 468 811 q 399 872 415 846 q 383 933 383 897 q 397 996 383 968 q 439 1044 410 1024 q 515 1076 468 1064 q 631 1090 563 1088 l 643 976 q 557 958 582 972 q 532 918 532 943 q 550 885 532 896 q 594 869 568 875 l 578 789 z \"},\"ῲ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 590 -300 q 470 -252 504 -300 q 436 -124 436 -204 l 436 -76 l 583 -76 q 581 -107 581 -92 q 581 -132 581 -122 q 595 -169 581 -160 q 632 -178 610 -178 q 642 -178 638 -178 q 656 -175 646 -178 l 675 -285 q 640 -296 660 -292 q 590 -300 619 -300 m 504 794 l 253 1013 l 390 1147 l 604 894 l 504 794 z \"},\"ῴ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 590 -300 q 470 -252 504 -300 q 436 -124 436 -204 l 436 -76 l 583 -76 q 581 -107 581 -92 q 581 -132 581 -122 q 595 -169 581 -160 q 632 -178 610 -178 q 642 -178 638 -178 q 656 -175 646 -178 l 675 -285 q 640 -296 660 -292 q 590 -300 619 -300 m 532 794 l 432 894 l 646 1147 l 783 1013 l 532 794 z \"},\"ᾢ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 590 -300 q 470 -252 504 -300 q 436 -124 436 -204 l 436 -76 l 583 -76 q 581 -107 581 -92 q 581 -132 581 -122 q 595 -169 581 -160 q 632 -178 610 -178 q 642 -178 638 -178 q 656 -175 646 -178 l 675 -285 q 640 -296 660 -292 q 590 -300 619 -300 m 314 799 l 297 879 q 331 893 317 883 q 346 925 346 903 q 324 958 346 946 q 249 974 301 971 l 258 1088 q 426 1047 372 1085 q 481 947 481 1010 q 466 884 481 910 q 427 841 451 858 q 373 813 403 824 q 314 799 343 803 m 614 774 l 517 1069 l 682 1101 l 726 796 l 614 774 z \"},\"ᾣ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 590 -300 q 470 -252 504 -300 q 436 -124 436 -204 l 436 -76 l 583 -76 q 581 -107 581 -92 q 581 -132 581 -122 q 595 -169 581 -160 q 632 -178 610 -178 q 642 -178 638 -178 q 656 -175 646 -178 l 675 -285 q 640 -296 660 -292 q 590 -300 619 -300 m 415 799 q 355 813 385 803 q 301 841 325 824 q 262 884 276 858 q 247 947 247 910 q 301 1047 247 1010 q 469 1088 356 1085 l 479 974 q 404 958 426 971 q 382 925 382 946 q 397 893 382 903 q 431 879 411 883 l 415 799 m 611 774 l 514 1069 l 679 1101 l 725 796 l 611 774 z \"},\"ᾤ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 590 -300 q 470 -252 504 -300 q 436 -124 436 -204 l 436 -76 l 583 -76 q 581 -107 581 -92 q 581 -132 581 -122 q 595 -169 581 -160 q 632 -178 610 -178 q 642 -178 638 -178 q 656 -175 646 -178 l 675 -285 q 640 -296 660 -292 q 590 -300 619 -300 m 314 799 l 297 879 q 331 893 317 883 q 346 925 346 903 q 324 958 346 946 q 249 974 301 971 l 258 1088 q 426 1047 372 1085 q 481 947 481 1010 q 466 884 481 910 q 427 841 451 858 q 373 813 403 824 q 314 799 343 803 m 531 796 l 578 1101 l 742 1069 l 644 774 l 531 796 z \"},\"ᾥ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 590 -300 q 470 -252 504 -300 q 436 -124 436 -204 l 436 -76 l 583 -76 q 581 -107 581 -92 q 581 -132 581 -122 q 595 -169 581 -160 q 632 -178 610 -178 q 642 -178 638 -178 q 656 -175 646 -178 l 675 -285 q 640 -296 660 -292 q 590 -300 619 -300 m 429 799 q 369 813 399 803 q 315 841 339 824 q 276 884 290 858 q 261 947 261 910 q 315 1047 261 1010 q 483 1088 369 1085 l 493 974 q 418 958 440 971 q 396 925 396 946 q 410 893 396 903 q 444 879 425 883 l 429 799 m 528 796 l 575 1101 l 740 1069 l 642 774 l 528 796 z \"},\"ᾦ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 590 -300 q 470 -252 504 -300 q 436 -124 436 -204 l 436 -76 l 583 -76 q 581 -107 581 -92 q 581 -132 581 -122 q 595 -169 581 -160 q 632 -178 610 -178 q 642 -178 638 -178 q 656 -175 646 -178 l 675 -285 q 640 -296 660 -292 q 590 -300 619 -300 m 301 1024 q 344 1140 310 1103 q 438 1178 379 1178 q 488 1169 467 1178 q 526 1149 508 1160 q 558 1128 543 1138 q 588 1119 572 1119 q 631 1172 619 1119 l 735 1163 q 692 1046 726 1083 q 599 1008 657 1008 q 549 1017 569 1008 q 510 1038 528 1026 q 478 1058 493 1049 q 449 1067 464 1067 q 406 1014 417 1067 l 301 1024 m 469 782 l 457 847 q 488 856 476 850 q 499 872 499 861 q 480 892 499 885 q 408 904 461 900 l 426 986 q 586 958 540 982 q 632 893 632 935 q 584 815 632 842 q 469 782 536 789 z \"},\"ᾧ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 590 -300 q 470 -252 504 -300 q 436 -124 436 -204 l 436 -76 l 583 -76 q 581 -107 581 -92 q 581 -132 581 -122 q 595 -169 581 -160 q 632 -178 610 -178 q 642 -178 638 -178 q 656 -175 646 -178 l 675 -285 q 640 -296 660 -292 q 590 -300 619 -300 m 567 782 q 452 815 500 789 q 404 893 404 842 q 415 931 404 914 q 449 958 425 947 q 513 976 474 969 q 610 986 553 983 l 628 904 q 556 892 575 900 q 538 872 538 885 q 549 856 538 861 q 579 847 560 850 l 567 782 m 301 1024 q 344 1140 310 1103 q 438 1178 379 1178 q 488 1169 467 1178 q 526 1149 508 1160 q 558 1128 543 1138 q 588 1119 572 1119 q 631 1172 619 1119 l 735 1163 q 692 1046 726 1083 q 599 1008 657 1008 q 549 1017 569 1008 q 510 1038 528 1026 q 478 1058 493 1049 q 449 1067 464 1067 q 406 1014 417 1067 l 301 1024 z \"},\"ῷ\":{\"ha\":1036,\"x_min\":56,\"x_max\":981,\"o\":\"m 325 -17 q 128 77 200 -17 q 56 351 56 171 q 64 441 56 394 q 86 534 72 488 q 119 624 100 581 q 163 706 139 668 l 354 633 q 276 474 303 550 q 249 311 249 397 q 269 193 249 238 q 335 149 290 149 q 425 278 425 149 q 424 322 425 301 q 420 363 422 342 q 415 406 418 383 q 408 460 413 429 l 624 460 q 617 406 619 429 q 612 363 614 383 q 608 322 610 342 q 607 278 607 301 q 628 176 607 204 q 690 149 649 149 q 753 198 729 149 q 776 343 776 247 q 772 421 776 385 q 758 491 768 457 q 730 560 747 525 q 688 638 713 596 l 875 706 q 951 547 922 631 q 981 356 981 464 q 913 80 981 176 q 718 -17 846 -17 q 601 13 656 -17 q 519 114 547 42 l 514 114 q 437 13 486 42 q 325 -17 388 -17 m 590 -300 q 470 -252 504 -300 q 436 -124 436 -204 l 436 -76 l 583 -76 q 581 -107 581 -92 q 581 -132 581 -122 q 595 -169 581 -160 q 632 -178 610 -178 q 642 -178 638 -178 q 656 -175 646 -178 l 675 -285 q 640 -296 660 -292 q 590 -300 619 -300 m 610 796 q 551 810 576 796 q 503 840 525 824 q 465 871 482 857 q 431 885 447 885 q 398 867 410 885 q 382 808 386 849 l 254 815 q 301 975 257 924 q 426 1026 346 1026 q 485 1013 460 1026 q 533 982 511 999 q 572 951 554 965 q 606 938 589 938 q 654 1014 646 938 l 782 1007 q 735 847 779 899 q 610 796 690 796 z \"},\"ϗ\":{\"ha\":758,\"x_min\":74,\"x_max\":765,\"o\":\"m 585 -261 l 346 -246 q 447 -131 397 -190 q 533 -12 496 -71 q 450 112 493 40 q 361 275 407 183 q 351 264 358 271 q 298 172 314 224 q 282 40 282 119 l 282 0 l 90 0 l 90 478 q 88 576 90 518 q 74 689 85 635 l 276 689 q 286 612 283 656 q 289 519 289 568 l 289 390 l 294 390 q 376 503 333 450 q 466 599 418 557 q 567 669 514 642 q 682 706 621 697 l 699 515 q 599 477 646 503 q 494 403 551 451 q 553 297 519 353 q 622 189 586 242 q 694 87 657 136 q 765 0 732 38 q 717 -74 742 -36 q 668 -147 692 -112 q 623 -211 644 -182 q 585 -261 601 -240 z \"},\"ϙ\":{\"ha\":768,\"x_min\":50,\"x_max\":718,\"o\":\"m 383 139 q 478 194 449 139 q 508 344 508 249 q 478 488 508 435 q 383 540 449 540 q 290 488 319 540 q 260 344 260 435 q 290 194 260 249 q 383 139 319 139 m 289 -246 l 289 -3 q 195 42 239 11 q 119 116 151 72 q 69 217 88 160 q 50 344 50 275 q 78 498 50 431 q 151 611 106 565 q 258 681 197 657 q 383 706 318 706 q 510 681 450 706 q 617 611 571 657 q 690 498 663 565 q 718 344 718 431 q 700 218 718 275 q 651 117 682 161 q 577 44 619 74 q 485 -1 535 14 q 490 -124 488 -64 q 496 -246 493 -183 l 289 -246 z \"},\"ϛ\":{\"ha\":681,\"x_min\":50,\"x_max\":644,\"o\":\"m 531 -260 l 371 -207 q 419 -139 403 -167 q 436 -89 436 -111 q 433 -67 436 -76 q 419 -47 429 -57 q 390 -30 408 -37 q 339 -14 371 -22 q 233 26 285 0 q 140 95 181 53 q 75 197 100 138 q 50 336 50 257 q 78 492 50 425 q 156 602 107 558 q 272 667 206 646 q 414 689 338 689 l 644 689 l 644 521 q 536 524 594 524 q 431 524 478 524 q 306 480 353 524 q 260 336 260 436 q 300 222 260 265 q 433 153 340 178 q 523 122 488 138 q 579 83 558 106 q 608 33 600 61 q 615 -32 615 6 q 594 -132 615 -68 q 531 -260 574 -196 z \"},\"ϝ\":{\"ha\":601,\"x_min\":90,\"x_max\":565,\"o\":\"m 90 -246 l 90 689 l 565 689 l 565 529 l 279 529 l 282 308 l 538 308 l 538 174 l 285 174 q 288 -31 285 68 q 296 -246 290 -131 l 90 -246 z \"},\"ϡ\":{\"ha\":744,\"x_min\":13,\"x_max\":725,\"o\":\"m 697 -251 l 499 -228 q 517 -96 511 -158 q 524 29 524 -33 q 519 119 524 75 q 375 49 447 86 q 224 -32 303 13 l 140 139 l 490 294 q 471 362 482 329 q 446 426 460 394 q 274 345 358 388 q 96 251 190 303 l 13 422 l 361 576 q 106 822 263 717 l 238 972 q 601 563 476 807 q 725 26 725 319 q 717 -112 725 -43 q 697 -251 710 -181 z \"},\";\":{\"ha\":417,\"x_min\":64,\"x_max\":356,\"o\":\"m 208 433 q 120 470 156 433 q 85 561 85 507 q 120 653 85 617 q 208 690 156 690 q 297 653 261 690 q 332 561 332 617 q 297 470 332 507 q 208 433 261 433 m 106 -269 l 64 -161 q 182 -89 142 -133 q 221 8 222 -44 l 210 8 q 124 38 161 8 q 86 124 86 68 q 124 208 86 176 q 214 240 161 240 q 319 190 283 240 q 356 47 356 139 q 292 -151 356 -68 q 106 -269 228 -233 z \"},\"·\":{\"ha\":417,\"x_min\":85,\"x_max\":332,\"o\":\"m 208 433 q 120 470 156 433 q 85 561 85 507 q 120 653 85 617 q 208 690 156 690 q 297 653 261 690 q 332 561 332 617 q 297 470 332 507 q 208 433 261 433 z \"},\"ʹ\":{\"ha\":417,\"x_min\":114,\"x_max\":344,\"o\":\"m 114 539 l 140 953 l 344 953 l 313 776 l 247 539 l 114 539 z \"},\"͵\":{\"ha\":417,\"x_min\":74,\"x_max\":303,\"o\":\"m 74 0 l 104 176 l 169 414 l 303 414 l 276 0 l 74 0 z \"},\"΄\":{\"ha\":771,\"x_min\":311,\"x_max\":557,\"o\":\"m 311 796 l 358 1101 l 557 1068 l 447 771 l 311 796 z \"},\"΅\":{\"ha\":771,\"x_min\":125,\"x_max\":650,\"o\":\"m 317 807 l 367 1113 l 510 1083 l 407 788 l 317 807 m 203 811 q 148 833 171 811 q 125 890 125 854 q 148 947 125 926 q 203 968 171 968 q 259 947 236 968 q 282 890 282 926 q 259 833 282 854 q 203 811 236 811 m 572 811 q 516 833 539 811 q 493 890 493 854 q 516 947 493 926 q 572 968 539 968 q 627 947 604 968 q 650 890 650 926 q 627 833 650 854 q 572 811 604 811 z \"},\"ͺ\":{\"ha\":771,\"x_min\":308,\"x_max\":547,\"o\":\"m 463 -300 q 342 -252 376 -300 q 308 -124 308 -204 l 308 -76 l 456 -76 q 453 -107 453 -92 q 453 -132 453 -122 q 467 -169 453 -160 q 504 -178 482 -178 q 514 -178 510 -178 q 528 -175 518 -178 l 547 -285 q 512 -296 532 -292 q 463 -300 492 -300 z \"},\"ι\":{\"ha\":418,\"x_min\":90,\"x_max\":411,\"o\":\"m 290 -17 q 195 0 233 -17 q 133 47 157 17 q 100 119 110 76 q 90 215 90 163 l 90 578 l 296 578 q 291 478 293 529 q 287 378 289 428 q 283 285 285 329 q 282 207 282 242 q 299 161 282 174 q 344 149 315 149 q 365 151 353 149 q 388 157 376 153 l 411 6 q 362 -10 389 -4 q 290 -17 335 -17 z \"},\"᾽\":{\"ha\":771,\"x_min\":261,\"x_max\":521,\"o\":\"m 326 789 l 310 869 q 354 885 336 875 q 372 918 372 896 q 347 958 372 943 q 261 976 322 972 l 274 1101 q 389 1087 342 1100 q 465 1052 436 1074 q 508 1000 494 1031 q 521 933 521 969 q 505 872 521 897 q 463 828 489 846 q 401 801 436 811 q 326 789 365 792 z \"},\"᾿\":{\"ha\":771,\"x_min\":261,\"x_max\":521,\"o\":\"m 326 789 l 310 869 q 354 885 336 875 q 372 918 372 896 q 347 958 372 943 q 261 976 322 972 l 274 1101 q 389 1087 342 1100 q 465 1052 436 1074 q 508 1000 494 1031 q 521 933 521 969 q 505 872 521 897 q 463 828 489 846 q 401 801 436 811 q 326 789 365 792 z \"},\"῾\":{\"ha\":771,\"x_min\":251,\"x_max\":511,\"o\":\"m 446 789 q 372 801 407 792 q 310 828 336 811 q 267 872 283 846 q 251 933 251 897 q 265 996 251 968 q 307 1044 278 1024 q 383 1076 336 1064 q 499 1090 431 1088 l 511 976 q 425 958 450 972 q 400 918 400 943 q 418 885 400 896 q 463 869 436 875 l 446 789 z \"},\"`\":{\"ha\":771,\"x_min\":217,\"x_max\":461,\"o\":\"m 325 771 l 217 1068 l 415 1101 l 461 796 l 325 771 z \"},\"´\":{\"ha\":771,\"x_min\":311,\"x_max\":557,\"o\":\"m 311 796 l 358 1101 l 557 1068 l 447 771 l 311 796 z \"},\"῍\":{\"ha\":771,\"x_min\":117,\"x_max\":594,\"o\":\"m 182 799 l 165 879 q 199 893 185 883 q 214 925 214 903 q 192 958 214 946 q 117 974 169 971 l 126 1088 q 294 1047 240 1085 q 349 947 349 1010 q 334 884 349 910 q 295 841 319 858 q 241 813 271 824 q 182 799 211 803 m 482 774 l 385 1069 l 550 1101 l 594 796 l 482 774 z \"},\"῝\":{\"ha\":771,\"x_min\":115,\"x_max\":593,\"o\":\"m 283 799 q 223 813 253 803 q 169 841 193 824 q 130 884 144 858 q 115 947 115 910 q 169 1047 115 1010 q 338 1088 224 1085 l 347 974 q 272 958 294 971 q 250 925 250 946 q 265 893 250 903 q 299 879 279 883 l 283 799 m 479 774 l 382 1069 l 547 1101 l 593 796 l 479 774 z \"},\"῎\":{\"ha\":771,\"x_min\":117,\"x_max\":610,\"o\":\"m 182 799 l 165 879 q 199 893 185 883 q 214 925 214 903 q 192 958 214 946 q 117 974 169 971 l 126 1088 q 294 1047 240 1085 q 349 947 349 1010 q 334 884 349 910 q 295 841 319 858 q 241 813 271 824 q 182 799 211 803 m 399 796 l 446 1101 l 610 1069 l 513 774 l 399 796 z \"},\"῞\":{\"ha\":771,\"x_min\":129,\"x_max\":608,\"o\":\"m 297 799 q 237 813 267 803 q 183 841 207 824 q 144 884 158 858 q 129 947 129 910 q 183 1047 129 1010 q 351 1088 238 1085 l 361 974 q 286 958 308 971 q 264 925 264 946 q 278 893 264 903 q 313 879 293 883 l 297 799 m 396 796 l 443 1101 l 608 1069 l 510 774 l 396 796 z \"},\"῏\":{\"ha\":771,\"x_min\":169,\"x_max\":603,\"o\":\"m 169 1024 q 213 1140 178 1103 q 306 1178 247 1178 q 356 1169 335 1178 q 394 1149 376 1160 q 426 1128 411 1138 q 456 1119 440 1119 q 499 1172 488 1119 l 603 1163 q 560 1046 594 1083 q 467 1008 525 1008 q 417 1017 438 1008 q 378 1038 396 1026 q 347 1058 361 1049 q 317 1067 332 1067 q 274 1014 285 1067 l 169 1024 m 338 782 l 325 847 q 356 856 344 850 q 367 872 367 861 q 348 892 367 885 q 276 904 329 900 l 294 986 q 454 958 408 982 q 500 893 500 935 q 452 815 500 842 q 338 782 404 789 z \"},\"῟\":{\"ha\":771,\"x_min\":169,\"x_max\":603,\"o\":\"m 435 782 q 320 815 368 789 q 272 893 272 842 q 283 931 272 914 q 317 958 293 947 q 381 976 342 969 q 478 986 421 983 l 496 904 q 424 892 443 900 q 406 872 406 885 q 417 856 406 861 q 447 847 428 850 l 435 782 m 169 1024 q 213 1140 178 1103 q 306 1178 247 1178 q 356 1169 335 1178 q 394 1149 376 1160 q 426 1128 411 1138 q 456 1119 440 1119 q 499 1172 488 1119 l 603 1163 q 560 1046 594 1083 q 467 1008 525 1008 q 417 1017 438 1008 q 378 1038 396 1026 q 347 1058 361 1049 q 317 1067 332 1067 q 274 1014 285 1067 l 169 1024 z \"},\"῀\":{\"ha\":771,\"x_min\":122,\"x_max\":650,\"o\":\"m 478 796 q 419 810 444 796 q 372 840 393 824 q 333 871 350 857 q 299 885 315 885 q 266 867 278 885 q 250 808 254 849 l 122 815 q 169 975 125 924 q 294 1026 214 1026 q 353 1013 328 1026 q 401 982 379 999 q 440 951 422 965 q 474 938 457 938 q 522 1014 514 938 l 650 1007 q 603 847 647 899 q 478 796 558 796 z \"},\"῭\":{\"ha\":771,\"x_min\":124,\"x_max\":649,\"o\":\"m 201 811 q 147 833 169 811 q 124 890 124 854 q 147 947 124 926 q 201 968 169 968 q 258 947 235 968 q 281 890 281 926 q 258 833 281 854 q 201 811 235 811 m 367 788 l 265 1083 l 408 1113 l 457 807 l 367 788 m 571 811 q 515 833 538 811 q 492 890 492 854 q 515 947 492 926 q 571 968 538 968 q 626 947 603 968 q 649 890 649 926 q 626 833 649 854 q 571 811 603 811 z \"},\"΅\":{\"ha\":771,\"x_min\":124,\"x_max\":649,\"o\":\"m 315 807 l 365 1113 l 508 1083 l 406 788 l 315 807 m 201 811 q 147 833 169 811 q 124 890 124 854 q 147 947 124 926 q 201 968 169 968 q 258 947 235 968 q 281 890 281 926 q 258 833 281 854 q 201 811 235 811 m 571 811 q 515 833 538 811 q 492 890 492 854 q 515 947 492 926 q 571 968 538 968 q 626 947 603 968 q 649 890 649 926 q 626 833 649 854 q 571 811 603 811 z \"},\"῁\":{\"ha\":771,\"x_min\":149,\"x_max\":624,\"o\":\"m 164 1010 q 206 1126 171 1088 q 293 1165 240 1165 q 351 1156 326 1165 q 396 1135 376 1146 q 432 1114 415 1124 q 468 1104 449 1104 q 519 1158 507 1104 l 608 1149 q 567 1033 601 1072 q 479 993 532 993 q 421 1003 446 993 q 376 1024 396 1013 q 340 1044 357 1035 q 304 1054 322 1054 q 272 1042 285 1054 q 253 1000 260 1029 l 164 1010 m 235 793 q 173 817 197 793 q 149 878 149 842 q 173 939 149 914 q 235 964 197 964 q 297 939 272 964 q 321 878 321 914 q 297 817 321 842 q 235 793 272 793 m 538 793 q 476 817 500 793 q 451 878 451 842 q 476 939 451 914 q 538 964 500 964 q 599 939 575 964 q 624 878 624 914 q 599 817 624 842 q 538 793 575 793 z \"},\"А\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 z \"},\"Б\":{\"ha\":833,\"x_min\":107,\"x_max\":783,\"o\":\"m 107 0 l 107 906 l 725 906 l 725 733 l 311 733 l 311 551 l 436 551 q 570 538 507 551 q 681 494 633 525 q 756 413 728 463 q 783 288 783 363 q 757 155 783 210 q 684 66 731 100 q 575 16 638 32 q 442 0 513 0 l 107 0 m 311 158 l 421 158 q 543 188 503 158 q 583 285 583 218 q 542 375 583 349 q 419 401 500 401 l 311 401 l 311 158 z \"},\"В\":{\"ha\":840,\"x_min\":107,\"x_max\":794,\"o\":\"m 107 0 l 107 906 l 417 906 q 548 895 488 906 q 653 858 608 885 q 724 789 699 832 q 750 681 750 746 q 742 619 750 650 q 718 563 733 589 q 681 515 703 536 q 632 485 660 494 l 632 479 q 696 453 667 471 q 747 410 725 436 q 782 348 769 383 q 794 267 794 313 q 767 147 794 197 q 692 65 740 97 q 581 16 644 32 q 443 0 517 0 l 107 0 m 311 543 l 407 543 q 516 572 482 543 q 550 650 550 601 q 515 725 550 703 q 408 747 481 747 l 311 747 l 311 543 m 311 158 l 426 158 q 594 281 594 158 q 553 366 594 340 q 426 392 511 392 l 311 392 l 311 158 z \"},\"Г\":{\"ha\":724,\"x_min\":107,\"x_max\":678,\"o\":\"m 107 0 l 107 906 l 678 906 l 678 733 l 311 733 l 311 0 l 107 0 z \"},\"Д\":{\"ha\":931,\"x_min\":18,\"x_max\":913,\"o\":\"m 218 0 l 218 -261 l 36 -261 l 18 44 l 18 172 l 60 172 q 91 197 75 178 q 124 251 107 215 q 157 345 140 288 q 189 485 174 403 q 209 593 200 544 q 226 690 218 642 q 244 789 235 738 q 264 906 253 840 l 801 906 l 801 172 l 913 172 l 913 44 l 894 -261 l 713 -261 l 713 0 l 218 0 m 372 458 q 332 296 354 367 q 278 172 310 225 l 597 172 l 597 733 l 422 733 q 410 660 415 693 q 399 597 404 628 q 387 533 393 565 q 372 458 381 500 z \"},\"Е\":{\"ha\":761,\"x_min\":107,\"x_max\":688,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 z \"},\"Ж\":{\"ha\":1206,\"x_min\":3,\"x_max\":1203,\"o\":\"m 3 0 l 264 478 l 188 649 q 140 714 164 697 q 86 731 117 731 q 69 730 79 731 q 47 725 58 729 l 13 910 q 48 919 28 917 q 88 922 68 922 q 222 888 164 922 q 326 758 279 853 l 425 550 l 506 550 l 506 906 l 700 906 l 700 550 l 781 550 l 878 758 q 928 838 901 806 q 983 888 954 869 q 1046 915 1013 907 q 1118 922 1079 922 q 1157 919 1138 922 q 1192 910 1176 917 l 1158 725 q 1137 730 1147 729 q 1119 731 1126 731 q 1065 714 1088 731 q 1018 649 1042 697 l 940 476 l 1203 0 l 983 0 l 793 385 l 700 385 l 700 0 l 506 0 l 506 385 l 413 385 l 222 0 l 3 0 z \"},\"З\":{\"ha\":783,\"x_min\":49,\"x_max\":738,\"o\":\"m 382 -17 q 207 12 293 -17 q 49 108 121 40 l 157 249 q 263 181 208 201 q 379 160 318 160 q 494 192 450 160 q 538 282 538 224 q 497 366 538 340 q 374 392 457 392 l 253 392 l 253 543 l 346 543 q 461 570 428 543 q 494 646 494 597 q 459 722 494 699 q 367 746 424 746 q 269 727 314 746 q 181 675 225 708 l 78 811 q 215 894 139 865 q 374 922 290 922 q 613 857 531 922 q 694 679 694 792 q 666 561 694 613 q 579 483 638 510 l 579 478 q 692 403 647 458 q 738 267 738 349 q 710 144 738 197 q 635 55 683 90 q 522 1 588 19 q 382 -17 457 -17 z \"},\"И\":{\"ha\":939,\"x_min\":107,\"x_max\":832,\"o\":\"m 107 0 l 107 906 l 310 906 l 310 586 q 300 417 310 506 q 283 256 290 328 l 289 256 l 378 454 l 615 906 l 832 906 l 832 0 l 631 0 l 631 321 q 640 488 631 401 q 656 649 649 574 l 650 649 l 561 451 l 324 0 l 107 0 z \"},\"Й\":{\"ha\":939,\"x_min\":107,\"x_max\":832,\"o\":\"m 107 0 l 107 906 l 310 906 l 310 586 q 300 417 310 506 q 283 256 290 328 l 289 256 l 378 454 l 615 906 l 832 906 l 832 0 l 631 0 l 631 321 q 640 488 631 401 q 656 649 649 574 l 650 649 l 561 451 l 324 0 l 107 0 m 475 979 q 362 994 408 979 q 286 1033 315 1008 q 243 1094 257 1058 q 228 1171 229 1129 l 400 1171 q 420 1106 403 1129 q 475 1082 438 1082 q 530 1106 513 1082 q 550 1171 547 1129 l 722 1171 q 706 1094 719 1129 q 663 1033 692 1058 q 588 994 633 1008 q 475 979 542 979 z \"},\"К\":{\"ha\":864,\"x_min\":107,\"x_max\":867,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 550 l 411 550 l 529 758 q 581 835 556 804 q 636 886 607 867 q 697 914 665 906 q 768 922 729 922 q 808 919 788 922 q 843 910 828 917 l 810 725 q 788 730 799 729 q 769 731 776 731 q 717 714 739 731 q 668 649 696 697 l 572 482 l 867 0 l 651 0 l 411 385 l 311 385 l 311 0 l 107 0 z \"},\"Л\":{\"ha\":913,\"x_min\":-14,\"x_max\":807,\"o\":\"m 92 -17 q 32 -14 56 -17 q -14 -3 8 -11 l 22 181 q 41 176 32 178 q 61 175 50 175 q 93 181 78 175 q 122 210 108 188 q 151 276 136 233 q 181 392 165 318 q 232 646 208 518 q 279 906 256 774 l 807 906 l 807 0 l 601 0 l 601 733 l 436 733 q 403 549 419 638 q 369 369 386 460 q 322 181 347 256 q 263 62 296 106 q 188 1 229 18 q 92 -17 146 -17 z \"},\"М\":{\"ha\":1058,\"x_min\":107,\"x_max\":951,\"o\":\"m 107 0 l 107 906 l 331 906 l 476 503 q 503 420 490 463 q 529 336 515 378 l 535 336 q 560 420 549 378 q 586 503 572 463 l 729 906 l 951 906 l 951 0 l 765 0 l 765 332 q 768 406 765 365 q 775 487 771 446 q 783 567 779 528 q 792 640 788 607 l 786 640 l 713 425 l 583 79 l 471 79 l 342 425 l 269 640 l 264 640 q 272 567 268 607 q 281 487 276 528 q 288 406 285 446 q 290 332 290 365 l 290 0 l 107 0 z \"},\"Н\":{\"ha\":936,\"x_min\":107,\"x_max\":829,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 557 l 624 557 l 624 906 l 829 906 l 829 0 l 624 0 l 624 378 l 311 378 l 311 0 l 107 0 z \"},\"О\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 308 16 383 -17 q 178 110 232 49 q 94 258 124 171 q 64 457 64 346 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 856 258 886 346 q 772 110 826 171 q 642 16 718 49 q 475 -17 567 -17 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 z \"},\"П\":{\"ha\":921,\"x_min\":107,\"x_max\":814,\"o\":\"m 107 0 l 107 906 l 814 906 l 814 0 l 610 0 l 610 733 l 311 733 l 311 0 l 107 0 z \"},\"Р\":{\"ha\":828,\"x_min\":107,\"x_max\":778,\"o\":\"m 107 0 l 107 906 l 418 906 q 558 891 493 906 q 672 842 624 876 q 749 752 721 808 q 778 614 778 696 q 749 476 778 535 q 672 381 721 418 q 560 325 624 343 q 424 307 496 307 l 311 307 l 311 0 l 107 0 m 311 469 l 411 469 q 578 614 578 469 q 533 714 578 685 q 406 743 489 743 l 311 743 l 311 469 z \"},\"С\":{\"ha\":808,\"x_min\":64,\"x_max\":778,\"o\":\"m 485 -17 q 322 13 399 -17 q 188 101 246 43 q 97 247 131 160 q 64 447 64 333 q 99 648 64 560 q 192 797 133 736 q 328 890 250 858 q 492 922 406 922 q 649 887 579 922 q 764 804 718 851 l 656 674 q 583 726 621 706 q 496 746 544 746 q 409 726 450 746 q 338 668 368 706 q 291 576 308 631 q 274 454 274 522 q 333 237 274 314 q 493 160 393 160 q 592 184 549 160 q 669 244 636 208 l 778 117 q 485 -17 664 -17 z \"},\"Т\":{\"ha\":772,\"x_min\":35,\"x_max\":738,\"o\":\"m 283 0 l 283 733 l 35 733 l 35 906 l 738 906 l 738 733 l 489 733 l 489 0 l 283 0 z \"},\"У\":{\"ha\":771,\"x_min\":1,\"x_max\":778,\"o\":\"m 219 -17 q 151 -12 179 -17 q 104 1 124 -7 l 140 179 q 167 172 153 175 q 208 168 181 168 q 296 210 272 168 l 308 236 l 1 906 l 218 906 l 324 642 l 400 425 l 406 425 l 476 642 l 572 906 l 778 906 l 499 206 q 391 42 457 101 q 219 -17 325 -17 z \"},\"Ф\":{\"ha\":1061,\"x_min\":63,\"x_max\":999,\"o\":\"m 807 457 q 756 598 807 551 q 618 651 706 644 l 618 257 q 756 313 706 264 q 807 457 807 361 m 254 457 q 304 313 254 361 q 442 257 354 264 l 442 651 q 304 598 354 644 q 254 457 254 551 m 442 -17 l 442 106 q 164 203 265 115 q 63 457 63 292 q 164 706 63 621 q 442 803 265 792 l 442 922 l 618 922 l 618 803 q 897 707 796 792 q 999 457 999 622 q 897 203 999 290 q 618 106 796 117 l 618 -17 l 442 -17 z \"},\"Х\":{\"ha\":788,\"x_min\":15,\"x_max\":772,\"o\":\"m 15 0 l 267 465 l 31 906 l 258 906 l 338 735 q 368 667 353 703 q 403 589 383 632 l 408 589 q 438 667 424 632 q 467 735 453 703 l 539 906 l 757 906 l 522 456 l 772 0 l 544 0 l 454 185 q 422 256 438 221 q 386 333 406 292 l 381 333 q 350 256 365 292 q 319 185 335 221 l 235 0 l 15 0 z \"},\"Ц\":{\"ha\":929,\"x_min\":107,\"x_max\":913,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 172 l 597 172 l 597 906 l 801 906 l 801 172 l 913 172 l 913 44 l 894 -261 l 711 -261 l 711 0 l 107 0 z \"},\"Ч\":{\"ha\":875,\"x_min\":83,\"x_max\":768,\"o\":\"m 563 0 l 563 367 q 501 359 532 361 q 426 357 471 357 q 283 374 346 357 q 175 431 219 392 q 107 533 131 471 q 83 688 83 596 l 83 906 l 285 906 l 285 688 q 324 556 285 593 q 447 519 363 519 q 515 522 488 519 q 563 529 542 525 l 563 906 l 768 906 l 768 0 l 563 0 z \"},\"Ш\":{\"ha\":1264,\"x_min\":107,\"x_max\":1157,\"o\":\"m 107 0 l 107 906 l 307 906 l 307 172 l 535 172 l 535 906 l 731 906 l 731 172 l 957 172 l 957 906 l 1157 906 l 1157 0 l 107 0 z \"},\"Щ\":{\"ha\":1286,\"x_min\":107,\"x_max\":1268,\"o\":\"m 1068 -261 l 1068 0 l 107 0 l 107 906 l 307 906 l 307 172 l 535 172 l 535 906 l 731 906 l 731 172 l 957 172 l 957 906 l 1157 906 l 1157 172 l 1268 172 l 1268 44 l 1250 -261 l 1068 -261 z \"},\"Ъ\":{\"ha\":1014,\"x_min\":35,\"x_max\":963,\"o\":\"m 300 0 l 300 733 l 35 733 l 35 906 l 506 906 l 506 575 l 603 575 q 740 559 675 575 q 855 509 806 543 q 933 422 904 475 q 963 296 963 369 q 935 158 963 214 q 859 66 907 101 q 747 15 811 31 q 610 0 683 0 l 300 0 m 506 163 l 597 163 q 720 192 678 163 q 763 293 763 222 q 592 413 763 413 l 506 413 l 506 163 z \"},\"Ы\":{\"ha\":1185,\"x_min\":107,\"x_max\":1078,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 575 l 401 575 q 543 560 478 575 q 656 510 608 544 q 729 424 703 476 q 756 296 756 371 q 728 158 756 214 q 652 66 700 101 q 538 15 604 31 q 397 0 472 0 l 107 0 m 311 163 l 385 163 q 510 192 465 163 q 556 293 556 222 q 385 413 556 413 l 311 413 l 311 163 m 874 0 l 874 906 l 1078 906 l 1078 0 l 874 0 z \"},\"Ь\":{\"ha\":833,\"x_min\":107,\"x_max\":782,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 575 l 428 575 q 569 560 504 575 q 682 510 635 544 q 756 424 729 476 q 782 296 782 371 q 754 158 782 214 q 678 66 726 101 q 565 15 631 31 q 425 0 500 0 l 107 0 m 311 163 l 413 163 q 538 192 493 163 q 582 293 582 222 q 411 413 582 413 l 311 413 l 311 163 z \"},\"Э\":{\"ha\":808,\"x_min\":31,\"x_max\":744,\"o\":\"m 332 -17 q 31 117 153 -17 l 139 244 q 222 184 175 208 q 329 160 269 160 q 470 211 417 160 q 538 381 524 263 l 222 381 l 222 551 l 535 551 q 465 699 518 653 q 325 746 411 746 q 233 726 274 746 q 153 674 192 707 l 44 804 q 170 887 94 851 q 336 922 246 922 q 497 893 422 922 q 627 805 572 864 q 713 657 682 746 q 744 447 744 568 q 712 239 744 326 q 623 94 679 151 q 492 10 567 38 q 332 -17 417 -17 z \"},\"Ю\":{\"ha\":1319,\"x_min\":107,\"x_max\":1256,\"o\":\"m 856 -17 q 588 87 690 -17 q 467 378 486 190 l 311 378 l 311 0 l 107 0 l 107 906 l 311 906 l 311 557 l 469 557 q 594 828 493 733 q 856 922 696 922 q 1021 891 947 922 q 1147 800 1094 860 q 1227 653 1199 740 q 1256 457 1256 567 q 1227 258 1256 346 q 1147 110 1199 171 q 1021 16 1094 49 q 856 -17 947 -17 m 856 160 q 997 240 947 160 q 1046 457 1046 319 q 997 669 1046 593 q 856 746 947 746 q 715 669 764 746 q 667 457 667 593 q 715 240 667 319 q 856 160 764 160 z \"},\"Я\":{\"ha\":857,\"x_min\":17,\"x_max\":750,\"o\":\"m 544 0 l 544 326 l 443 326 l 250 0 l 17 0 l 249 357 q 122 453 171 388 q 74 624 74 518 q 101 758 74 704 q 177 845 129 813 q 288 892 225 878 q 424 906 351 906 l 750 906 l 750 0 l 544 0 m 440 489 l 544 489 l 544 743 l 440 743 q 317 717 358 743 q 275 624 275 690 q 440 489 275 489 z \"},\"Ѐ\":{\"ha\":761,\"x_min\":107,\"x_max\":688,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 m 414 944 l 160 1110 l 268 1242 l 506 1047 l 414 944 z \"},\"Ё\":{\"ha\":761,\"x_min\":107,\"x_max\":688,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 m 246 972 q 176 1000 203 972 q 149 1069 149 1028 q 176 1139 149 1111 q 246 1167 203 1167 q 316 1139 289 1167 q 343 1069 343 1111 q 316 1000 343 1028 q 246 972 289 972 m 554 972 q 484 1000 511 972 q 457 1069 457 1028 q 484 1139 457 1111 q 554 1167 511 1167 q 624 1139 597 1167 q 651 1069 651 1111 q 624 1000 651 1028 q 554 972 597 972 z \"},\"Ђ\":{\"ha\":974,\"x_min\":35,\"x_max\":919,\"o\":\"m 656 -17 q 561 -3 599 -17 l 593 153 q 612 147 604 149 q 631 146 619 146 q 662 152 646 146 q 690 173 678 158 q 711 210 703 188 q 719 264 719 232 q 680 369 719 335 q 565 403 640 403 q 507 400 529 403 q 461 393 485 397 l 461 0 l 256 0 l 256 733 l 35 733 l 35 906 l 749 906 l 749 733 l 461 733 l 461 556 q 492 560 478 558 q 521 564 506 563 q 554 566 536 565 q 596 567 572 567 q 718 550 660 567 q 821 497 776 533 q 892 404 865 461 q 919 267 919 347 q 900 138 919 192 q 845 49 881 83 q 761 -1 810 15 q 656 -17 713 -17 z \"},\"Ѓ\":{\"ha\":724,\"x_min\":107,\"x_max\":678,\"o\":\"m 107 0 l 107 906 l 678 906 l 678 733 l 311 733 l 311 0 l 107 0 m 396 944 l 304 1047 l 542 1242 l 650 1110 l 396 944 z \"},\"Є\":{\"ha\":808,\"x_min\":64,\"x_max\":778,\"o\":\"m 485 -17 q 320 10 397 -17 q 186 94 243 38 q 97 239 129 151 q 64 447 64 326 q 98 657 64 568 q 190 805 132 746 q 325 893 247 864 q 490 922 403 922 q 649 887 579 922 q 764 804 718 851 l 656 674 q 583 726 621 706 q 496 746 544 746 q 353 699 413 746 q 275 551 294 653 l 586 551 l 586 381 l 271 381 q 342 211 285 263 q 493 160 399 160 q 592 184 549 160 q 669 244 636 208 l 778 117 q 485 -17 664 -17 z \"},\"Ѕ\":{\"ha\":772,\"x_min\":49,\"x_max\":725,\"o\":\"m 383 -17 q 206 16 294 -17 q 49 114 118 49 l 165 254 q 273 186 214 213 q 389 160 332 160 q 484 183 453 160 q 515 247 515 207 q 506 283 515 268 q 480 310 497 299 q 438 333 463 322 q 385 356 414 343 l 267 406 q 199 442 232 419 q 141 494 167 464 q 100 563 115 524 q 85 653 85 603 q 108 758 85 708 q 175 844 132 807 q 277 901 218 881 q 407 922 336 922 q 563 892 486 922 q 699 803 640 861 l 594 674 q 506 727 550 708 q 407 746 461 746 q 323 724 354 746 q 292 664 292 703 q 302 628 292 643 q 331 602 313 614 q 375 580 350 590 q 429 557 400 569 l 546 510 q 677 418 629 476 q 725 264 725 360 q 702 156 725 207 q 635 67 679 106 q 528 6 592 29 q 383 -17 464 -17 z \"},\"І\":{\"ha\":418,\"x_min\":107,\"x_max\":311,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 0 l 107 0 z \"},\"Ї\":{\"ha\":418,\"x_min\":-43,\"x_max\":460,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 0 l 107 0 m 54 972 q -16 1000 11 972 q -43 1069 -43 1028 q -16 1139 -43 1111 q 54 1167 11 1167 q 124 1139 97 1167 q 151 1069 151 1111 q 124 1000 151 1028 q 54 972 97 972 m 363 972 q 292 1000 319 972 q 265 1069 265 1028 q 292 1139 265 1111 q 363 1167 319 1167 q 433 1139 406 1167 q 460 1069 460 1111 q 433 1000 460 1028 q 363 972 406 972 z \"},\"Ј\":{\"ha\":707,\"x_min\":22,\"x_max\":604,\"o\":\"m 314 -17 q 140 24 210 -17 q 22 147 69 64 l 161 250 q 219 182 186 204 q 288 160 253 160 q 372 194 343 160 q 400 318 400 228 l 400 906 l 604 906 l 604 301 q 587 178 604 236 q 534 76 569 119 q 444 8 499 33 q 314 -17 389 -17 z \"},\"Љ\":{\"ha\":1278,\"x_min\":4,\"x_max\":1226,\"o\":\"m 110 -17 q 50 -14 74 -17 q 4 -3 26 -11 l 42 181 q 59 176 50 178 q 81 175 68 175 q 112 181 97 175 q 141 210 126 188 q 169 276 156 233 q 200 392 183 318 q 251 646 228 518 q 297 906 274 774 l 797 906 l 797 575 l 872 575 q 1014 560 949 575 q 1126 510 1079 544 q 1200 424 1174 476 q 1226 296 1226 371 q 1199 158 1226 214 q 1123 66 1171 101 q 1009 15 1075 31 q 868 0 943 0 l 592 0 l 592 733 l 454 733 q 422 548 438 638 q 390 369 407 458 q 342 181 368 256 q 282 62 315 106 q 206 1 249 18 q 110 -17 164 -17 m 797 163 l 856 163 q 982 192 938 163 q 1026 293 1026 222 q 856 413 1026 413 l 797 413 l 797 163 z \"},\"Њ\":{\"ha\":1296,\"x_min\":107,\"x_max\":1244,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 557 l 610 557 l 610 906 l 815 906 l 815 575 l 890 575 q 1032 560 967 575 q 1144 510 1097 544 q 1218 424 1192 476 q 1244 296 1244 371 q 1217 158 1244 214 q 1141 66 1189 101 q 1027 15 1093 31 q 886 0 961 0 l 610 0 l 610 378 l 311 378 l 311 0 l 107 0 m 815 163 l 874 163 q 999 192 954 163 q 1044 293 1044 222 q 874 413 1044 413 l 815 413 l 815 163 z \"},\"Ћ\":{\"ha\":997,\"x_min\":35,\"x_max\":913,\"o\":\"m 256 0 l 256 733 l 35 733 l 35 906 l 749 906 l 749 733 l 461 733 l 461 556 q 522 564 493 561 q 583 567 551 567 q 719 549 658 567 q 823 494 781 532 q 889 399 865 457 q 913 258 913 340 l 913 0 l 713 0 l 713 258 q 678 368 713 333 q 561 403 643 403 q 510 400 536 403 q 461 393 485 397 l 461 0 l 256 0 z \"},\"Ќ\":{\"ha\":864,\"x_min\":107,\"x_max\":867,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 550 l 411 550 l 529 758 q 581 835 556 804 q 636 886 607 867 q 697 914 665 906 q 768 922 729 922 q 808 919 788 922 q 843 910 828 917 l 810 725 q 788 730 799 729 q 769 731 776 731 q 717 714 739 731 q 668 649 696 697 l 572 482 l 867 0 l 651 0 l 411 385 l 311 385 l 311 0 l 107 0 m 463 956 l 371 1058 l 608 1253 l 717 1121 l 463 956 z \"},\"Ѝ\":{\"ha\":939,\"x_min\":107,\"x_max\":832,\"o\":\"m 107 0 l 107 906 l 310 906 l 310 586 q 300 417 310 506 q 283 256 290 328 l 289 256 l 378 454 l 615 906 l 832 906 l 832 0 l 631 0 l 631 321 q 640 488 631 401 q 656 649 649 574 l 650 649 l 561 451 l 324 0 l 107 0 m 489 956 l 235 1121 l 343 1253 l 581 1058 l 489 956 z \"},\"Ў\":{\"ha\":771,\"x_min\":1,\"x_max\":778,\"o\":\"m 219 -17 q 151 -12 179 -17 q 104 1 124 -7 l 140 179 q 167 172 153 175 q 208 168 181 168 q 296 210 272 168 l 308 236 l 1 906 l 218 906 l 324 642 l 400 425 l 406 425 l 476 642 l 572 906 l 778 906 l 499 206 q 391 42 457 101 q 219 -17 325 -17 m 397 968 q 284 983 331 968 q 208 1022 238 997 q 165 1083 179 1047 q 150 1160 151 1118 l 322 1160 q 342 1094 325 1118 q 397 1071 360 1071 q 452 1094 435 1071 q 472 1160 469 1118 l 644 1160 q 628 1083 642 1118 q 585 1022 614 1047 q 510 983 556 997 q 397 968 464 968 z \"},\"Џ\":{\"ha\":921,\"x_min\":107,\"x_max\":814,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 172 l 610 172 l 610 906 l 814 906 l 814 0 l 569 0 l 554 -261 l 371 -261 l 371 0 l 107 0 z \"},\"Ѣ\":{\"ha\":867,\"x_min\":35,\"x_max\":815,\"o\":\"m 200 0 l 200 671 l 35 671 l 35 833 l 200 833 l 200 967 l 406 967 l 406 833 l 704 833 l 704 671 l 406 671 l 406 539 l 461 539 q 599 526 535 539 q 712 483 664 513 q 788 406 760 454 q 815 290 815 358 q 789 153 815 208 q 716 63 763 97 q 606 15 669 29 q 468 0 542 0 l 200 0 m 406 158 l 456 158 q 575 185 535 158 q 615 283 615 213 q 576 369 615 343 q 450 394 538 394 l 406 394 l 406 158 z \"},\"Ѳ\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 309 14 385 -17 q 179 105 233 44 q 94 253 125 165 q 64 457 64 342 q 94 659 64 572 q 179 804 125 746 q 309 892 233 863 q 475 922 385 922 q 642 892 567 922 q 772 804 718 863 q 856 658 826 746 q 886 457 886 571 q 856 253 886 342 q 772 105 826 165 q 642 14 718 44 q 475 -17 567 -17 m 475 754 q 342 702 394 754 q 274 547 289 650 l 676 547 q 609 702 661 650 q 475 754 557 754 m 475 151 q 613 210 560 151 q 679 385 665 269 l 271 385 q 338 210 285 269 q 475 151 392 151 z \"},\"Ѵ\":{\"ha\":797,\"x_min\":-10,\"x_max\":846,\"o\":\"m 264 0 l -10 906 l 207 906 l 315 483 q 351 338 335 408 q 389 193 368 268 l 394 193 q 424 338 411 268 q 456 483 438 408 l 507 679 q 592 865 538 807 q 747 922 647 922 q 804 918 783 922 q 846 906 825 914 l 810 722 q 790 728 801 725 q 768 731 779 731 q 718 706 736 731 q 689 642 700 682 l 519 0 l 264 0 z \"},\"Ґ\":{\"ha\":724,\"x_min\":107,\"x_max\":692,\"o\":\"m 107 0 l 107 906 l 489 906 l 517 1144 l 692 1144 l 678 733 l 311 733 l 311 0 l 107 0 z \"},\"Ғ\":{\"ha\":758,\"x_min\":36,\"x_max\":713,\"o\":\"m 36 393 l 36 485 l 142 492 l 142 906 l 713 906 l 713 733 l 346 733 l 346 492 l 519 492 l 519 393 l 346 393 l 346 0 l 142 0 l 142 393 l 36 393 z \"},\"Җ\":{\"ha\":1257,\"x_min\":3,\"x_max\":1240,\"o\":\"m 1039 -261 l 1039 0 l 983 0 l 793 385 l 700 385 l 700 0 l 506 0 l 506 385 l 413 385 l 222 0 l 3 0 l 264 478 l 188 649 q 140 714 164 697 q 86 731 117 731 q 69 730 79 731 q 47 725 58 729 l 13 910 q 48 919 28 917 q 88 922 68 922 q 222 888 164 922 q 326 758 279 853 l 425 550 l 506 550 l 506 906 l 700 906 l 700 550 l 781 550 l 878 758 q 928 838 901 806 q 983 888 954 869 q 1046 915 1013 907 q 1118 922 1079 922 q 1157 919 1138 922 q 1192 910 1176 917 l 1158 725 q 1137 730 1147 729 q 1119 731 1126 731 q 1065 714 1088 731 q 1018 649 1042 697 l 940 476 l 1108 172 l 1240 172 l 1240 44 l 1222 -261 l 1039 -261 z \"},\"Ҙ\":{\"ha\":783,\"x_min\":49,\"x_max\":738,\"o\":\"m 300 -261 l 300 -11 q 168 28 232 0 q 49 108 104 56 l 157 249 q 263 181 208 201 q 379 160 318 160 q 494 192 450 160 q 538 282 538 224 q 497 366 538 340 q 374 392 457 392 l 253 392 l 253 543 l 346 543 q 461 570 428 543 q 494 646 494 597 q 459 722 494 699 q 367 746 424 746 q 269 727 314 746 q 181 675 225 708 l 78 811 q 215 894 139 865 q 374 922 290 922 q 613 857 531 922 q 694 679 694 792 q 666 561 694 613 q 579 483 638 510 l 579 478 q 692 403 647 458 q 738 267 738 349 q 720 166 738 211 q 671 87 703 121 q 594 30 639 53 q 497 -4 550 7 l 482 -261 l 300 -261 z \"},\"Қ\":{\"ha\":926,\"x_min\":107,\"x_max\":908,\"o\":\"m 708 -261 l 708 0 l 651 0 l 411 385 l 311 385 l 311 0 l 107 0 l 107 906 l 311 906 l 311 550 l 411 550 l 529 758 q 581 835 556 804 q 636 886 607 867 q 697 914 665 906 q 768 922 729 922 q 808 919 788 922 q 843 910 828 917 l 810 725 q 788 730 799 729 q 769 731 776 731 q 717 714 739 731 q 668 649 696 697 l 572 482 l 761 172 l 908 172 l 908 44 l 890 -261 l 708 -261 z \"},\"Ҡ\":{\"ha\":1040,\"x_min\":35,\"x_max\":1044,\"o\":\"m 283 0 l 283 733 l 35 733 l 35 906 l 489 906 l 489 550 l 589 550 l 706 758 q 813 886 758 850 q 946 922 868 922 q 985 919 965 922 q 1019 910 1004 917 l 986 725 q 965 730 975 729 q 947 731 954 731 q 894 714 915 731 q 846 649 874 697 l 749 481 l 1044 0 l 829 0 l 588 385 l 489 385 l 489 0 l 283 0 z \"},\"Ң\":{\"ha\":957,\"x_min\":107,\"x_max\":939,\"o\":\"m 739 -261 l 739 0 l 624 0 l 624 378 l 311 378 l 311 0 l 107 0 l 107 906 l 311 906 l 311 557 l 624 557 l 624 906 l 829 906 l 829 172 l 939 172 l 939 44 l 922 -261 l 739 -261 z \"},\"Ҫ\":{\"ha\":808,\"x_min\":64,\"x_max\":778,\"o\":\"m 388 -261 l 388 -7 q 259 44 318 8 q 157 138 200 81 q 89 272 114 194 q 64 447 64 350 q 99 648 64 560 q 192 797 133 736 q 328 890 250 858 q 492 922 406 922 q 649 887 579 922 q 764 804 718 851 l 656 674 q 583 726 621 706 q 496 746 544 746 q 409 726 450 746 q 338 668 368 706 q 291 576 308 631 q 274 454 274 522 q 333 237 274 314 q 493 160 393 160 q 592 184 549 160 q 669 244 636 208 l 778 117 q 586 -4 697 24 l 571 -261 l 388 -261 z \"},\"Ү\":{\"ha\":729,\"x_min\":-11,\"x_max\":740,\"o\":\"m 263 0 l 263 322 l -11 906 l 208 906 l 289 697 q 326 598 308 646 q 363 497 343 550 l 368 497 q 406 598 388 550 q 444 697 425 646 l 526 906 l 740 906 l 467 322 l 467 0 l 263 0 z \"},\"Ұ\":{\"ha\":729,\"x_min\":-11,\"x_max\":740,\"o\":\"m 67 299 l 67 389 l 196 397 l 228 397 l -11 906 l 208 906 l 289 697 q 326 598 308 646 q 363 497 343 550 l 368 497 q 406 598 388 550 q 444 697 425 646 l 526 906 l 740 906 l 501 397 l 663 397 l 663 299 l 467 299 l 467 0 l 263 0 l 263 299 l 67 299 z \"},\"Ҳ\":{\"ha\":840,\"x_min\":15,\"x_max\":822,\"o\":\"m 628 -261 l 628 0 l 544 0 l 454 185 q 422 256 438 221 q 386 333 406 292 l 381 333 q 350 256 365 292 q 319 185 335 221 l 235 0 l 15 0 l 267 465 l 31 906 l 258 906 l 338 735 q 368 667 353 703 q 403 589 383 632 l 408 589 q 438 667 424 632 q 467 735 453 703 l 539 906 l 757 906 l 522 456 l 678 172 l 822 172 l 822 44 l 806 -261 l 628 -261 z \"},\"Ҷ\":{\"ha\":896,\"x_min\":83,\"x_max\":878,\"o\":\"m 683 -261 l 683 0 l 563 0 l 563 367 q 501 359 532 361 q 426 357 471 357 q 283 374 346 357 q 175 431 219 392 q 107 533 131 471 q 83 688 83 596 l 83 906 l 285 906 l 285 688 q 324 556 285 593 q 447 519 363 519 q 515 522 488 519 q 563 529 542 525 l 563 906 l 768 906 l 768 172 l 878 172 l 878 44 l 861 -261 l 683 -261 z \"},\"Һ\":{\"ha\":875,\"x_min\":107,\"x_max\":790,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 576 q 372 584 342 582 q 447 586 403 586 q 591 569 528 586 q 699 512 654 551 q 767 410 743 472 q 790 256 790 347 l 790 0 l 590 0 l 590 256 q 551 387 590 350 q 426 424 513 424 q 360 421 386 424 q 311 414 333 418 l 311 0 l 107 0 z \"},\"Ӏ\":{\"ha\":418,\"x_min\":107,\"x_max\":311,\"o\":\"m 107 0 l 107 906 l 311 906 l 311 0 l 107 0 z \"},\"Ӂ\":{\"ha\":1206,\"x_min\":3,\"x_max\":1203,\"o\":\"m 3 0 l 264 478 l 188 649 q 140 714 164 697 q 86 731 117 731 q 69 730 79 731 q 47 725 58 729 l 13 910 q 48 919 28 917 q 88 922 68 922 q 222 888 164 922 q 326 758 279 853 l 425 550 l 506 550 l 506 906 l 700 906 l 700 550 l 781 550 l 878 758 q 928 838 901 806 q 983 888 954 869 q 1046 915 1013 907 q 1118 922 1079 922 q 1157 919 1138 922 q 1192 910 1176 917 l 1158 725 q 1137 730 1147 729 q 1119 731 1126 731 q 1065 714 1088 731 q 1018 649 1042 697 l 940 476 l 1203 0 l 983 0 l 793 385 l 700 385 l 700 0 l 506 0 l 506 385 l 413 385 l 222 0 l 3 0 m 603 968 q 490 983 536 968 q 414 1022 443 997 q 371 1083 385 1047 q 356 1160 357 1118 l 528 1160 q 548 1094 531 1118 q 603 1071 565 1071 q 658 1094 640 1071 q 678 1160 675 1118 l 850 1160 q 833 1083 847 1118 q 790 1022 819 1047 q 715 983 761 997 q 603 968 669 968 z \"},\"Ӑ\":{\"ha\":796,\"x_min\":-8,\"x_max\":804,\"o\":\"m 319 458 l 297 375 l 490 375 l 469 458 q 432 603 450 526 q 396 750 414 679 l 390 750 q 356 602 374 678 q 319 458 339 526 m -8 0 l 275 906 l 521 906 l 804 0 l 588 0 l 532 215 l 256 215 l 200 0 l -8 0 m 397 968 q 284 983 331 968 q 208 1022 238 997 q 165 1083 179 1047 q 150 1160 151 1118 l 322 1160 q 342 1094 325 1118 q 397 1071 360 1071 q 452 1094 435 1071 q 472 1160 469 1118 l 644 1160 q 628 1083 642 1118 q 585 1022 614 1047 q 510 983 556 997 q 397 968 464 968 z \"},\"Ӕ\":{\"ha\":1174,\"x_min\":-19,\"x_max\":1101,\"o\":\"m 421 494 l 363 365 l 536 365 l 536 751 l 531 751 q 476 619 503 685 q 421 494 449 554 m -19 0 l 411 906 l 1088 906 l 1088 733 l 740 733 l 740 551 l 1033 551 l 1033 381 l 740 381 l 740 172 l 1101 172 l 1101 0 l 536 0 l 536 207 l 290 207 l 196 0 l -19 0 z \"},\"Ӗ\":{\"ha\":761,\"x_min\":107,\"x_max\":688,\"o\":\"m 107 0 l 107 906 l 674 906 l 674 733 l 311 733 l 311 551 l 619 551 l 619 381 l 311 381 l 311 172 l 688 172 l 688 0 l 107 0 m 400 968 q 287 983 333 968 q 211 1022 240 997 q 168 1083 182 1047 q 153 1160 154 1118 l 325 1160 q 345 1094 328 1118 q 400 1071 363 1071 q 455 1094 438 1071 q 475 1160 472 1118 l 647 1160 q 631 1083 644 1118 q 588 1022 617 1047 q 513 983 558 997 q 400 968 467 968 z \"},\"Ә\":{\"ha\":938,\"x_min\":71,\"x_max\":874,\"o\":\"m 467 -17 q 302 13 375 -17 q 178 102 229 43 q 99 248 126 161 q 71 449 71 335 q 75 517 71 481 l 668 517 q 603 697 657 639 q 449 754 549 754 q 335 728 383 754 q 250 669 286 703 l 157 810 q 288 890 210 858 q 472 922 367 922 q 635 892 561 922 q 763 803 710 863 q 844 657 815 744 q 874 454 874 569 q 844 251 874 339 q 762 103 815 163 q 633 14 708 44 q 467 -17 558 -17 m 467 150 q 598 202 546 150 q 665 367 650 254 l 279 367 q 337 201 288 253 q 467 150 386 150 z \"},\"Ӣ\":{\"ha\":939,\"x_min\":107,\"x_max\":832,\"o\":\"m 107 0 l 107 906 l 310 906 l 310 586 q 300 417 310 506 q 283 256 290 328 l 289 256 l 378 454 l 615 906 l 832 906 l 832 0 l 631 0 l 631 321 q 640 488 631 401 q 656 649 649 574 l 650 649 l 561 451 l 324 0 l 107 0 m 265 1013 l 265 1143 l 685 1143 l 685 1013 l 265 1013 z \"},\"Ӧ\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 308 16 383 -17 q 178 110 232 49 q 94 258 124 171 q 64 457 64 346 q 94 655 64 568 q 178 801 124 742 q 308 891 232 860 q 475 922 383 922 q 642 891 567 922 q 772 800 718 860 q 856 653 826 740 q 886 457 886 567 q 856 258 886 346 q 772 110 826 171 q 642 16 718 49 q 475 -17 567 -17 m 475 160 q 622 240 568 160 q 676 457 676 319 q 622 669 676 593 q 475 746 568 746 q 328 669 382 746 q 274 457 274 593 q 328 240 274 319 q 475 160 382 160 m 321 972 q 251 1000 278 972 q 224 1069 224 1028 q 251 1139 224 1111 q 321 1167 278 1167 q 391 1139 364 1167 q 418 1069 418 1111 q 391 1000 418 1028 q 321 972 364 972 m 629 972 q 559 1000 586 972 q 532 1069 532 1028 q 559 1139 532 1111 q 629 1167 586 1167 q 699 1139 672 1167 q 726 1069 726 1111 q 699 1000 726 1028 q 629 972 672 972 z \"},\"Ө\":{\"ha\":950,\"x_min\":64,\"x_max\":886,\"o\":\"m 475 -17 q 309 14 385 -17 q 179 105 233 44 q 94 253 125 165 q 64 457 64 342 q 94 659 64 572 q 179 804 125 746 q 309 892 233 863 q 475 922 385 922 q 642 892 567 922 q 772 804 718 863 q 856 658 826 746 q 886 457 886 571 q 856 253 886 342 q 772 105 826 165 q 642 14 718 44 q 475 -17 567 -17 m 475 754 q 342 702 394 754 q 274 547 289 650 l 676 547 q 609 702 661 650 q 475 754 557 754 m 475 151 q 613 210 560 151 q 679 385 665 269 l 271 385 q 338 210 285 269 q 475 151 392 151 z \"},\"Ӯ\":{\"ha\":771,\"x_min\":1,\"x_max\":778,\"o\":\"m 219 -17 q 151 -12 179 -17 q 104 1 124 -7 l 140 179 q 167 172 153 175 q 208 168 181 168 q 296 210 272 168 l 308 236 l 1 906 l 218 906 l 324 642 l 400 425 l 406 425 l 476 642 l 572 906 l 778 906 l 499 206 q 391 42 457 101 q 219 -17 325 -17 m 186 1001 l 186 1132 l 606 1132 l 606 1001 l 186 1001 z \"},\"Ӳ\":{\"ha\":771,\"x_min\":1,\"x_max\":778,\"o\":\"m 219 -17 q 151 -12 179 -17 q 104 1 124 -7 l 140 179 q 167 172 153 175 q 208 168 181 168 q 296 210 272 168 l 308 236 l 1 906 l 218 906 l 324 642 l 400 425 l 406 425 l 476 642 l 572 906 l 778 906 l 499 206 q 391 42 457 101 q 219 -17 325 -17 m 208 1011 l 349 1235 l 478 1163 l 308 964 l 208 1011 m 468 1011 l 608 1235 l 739 1163 l 569 964 l 468 1011 z \"},\"а\":{\"ha\":732,\"x_min\":58,\"x_max\":650,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 z \"},\"б\":{\"ha\":779,\"x_min\":58,\"x_max\":722,\"o\":\"m 400 -17 q 147 101 235 -17 q 58 431 58 218 q 90 685 58 586 q 180 844 122 785 q 317 933 238 904 q 493 974 397 961 q 591 990 556 982 q 658 1014 626 999 l 697 836 q 626 803 669 815 q 536 785 582 792 q 415 765 464 775 q 333 735 365 756 q 285 676 301 714 q 261 569 268 638 q 349 633 297 611 q 457 654 400 654 q 559 634 511 654 q 644 574 607 614 q 701 475 681 535 q 722 336 722 415 q 698 192 722 257 q 631 80 674 126 q 528 8 588 33 q 400 -17 469 -17 m 397 149 q 484 199 454 149 q 514 336 514 249 q 482 466 514 428 q 396 504 450 504 q 323 485 360 504 q 254 421 286 467 l 254 382 q 292 206 254 263 q 397 149 329 149 z \"},\"в\":{\"ha\":733,\"x_min\":90,\"x_max\":686,\"o\":\"m 90 0 l 90 689 l 383 689 q 492 680 442 689 q 579 649 542 671 q 638 593 617 628 q 660 507 660 558 q 633 422 660 463 q 544 365 607 382 l 544 360 q 648 307 610 344 q 686 199 686 269 q 663 108 686 146 q 601 46 640 69 q 510 11 563 22 q 400 0 458 0 l 90 0 m 289 419 l 369 419 q 443 437 421 419 q 465 486 465 454 q 444 536 465 518 q 371 554 422 554 l 289 554 l 289 419 m 289 135 l 388 135 q 466 156 443 135 q 489 213 489 178 q 465 264 489 243 q 386 285 440 285 l 289 285 l 289 135 z \"},\"г\":{\"ha\":600,\"x_min\":90,\"x_max\":564,\"o\":\"m 90 0 l 90 689 l 564 689 l 564 529 l 294 529 l 294 0 l 90 0 z \"},\"д\":{\"ha\":811,\"x_min\":15,\"x_max\":794,\"o\":\"m 211 0 l 211 -239 l 35 -239 l 15 26 l 15 160 l 58 160 q 82 180 71 167 q 103 222 93 193 q 122 296 113 250 q 139 415 131 342 l 171 689 l 685 689 l 685 160 l 794 160 l 794 26 l 775 -239 l 600 -239 l 600 0 l 211 0 m 315 369 q 293 250 308 301 q 258 160 278 199 l 481 160 l 481 529 l 333 529 l 315 369 z \"},\"е\":{\"ha\":719,\"x_min\":50,\"x_max\":668,\"o\":\"m 399 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 526 4 590 25 q 399 -17 461 -17 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 z \"},\"ж\":{\"ha\":1057,\"x_min\":8,\"x_max\":1049,\"o\":\"m 8 0 l 228 357 l 189 443 q 149 499 171 486 q 103 513 128 513 q 90 511 96 513 q 76 507 83 510 l 44 696 q 100 706 68 706 q 226 675 175 706 q 317 561 278 644 l 376 435 l 438 435 l 438 689 l 619 689 l 619 435 l 681 435 l 740 561 q 831 675 779 644 q 957 706 882 706 q 1013 696 989 706 l 981 507 q 967 511 974 510 q 954 513 961 513 q 908 499 929 513 q 868 443 886 486 l 829 357 l 1049 0 l 829 0 l 683 275 l 619 275 l 619 0 l 438 0 l 438 275 l 374 275 l 228 0 l 8 0 z \"},\"з\":{\"ha\":661,\"x_min\":39,\"x_max\":614,\"o\":\"m 306 -17 q 170 0 235 -17 q 39 65 106 17 l 118 194 q 206 152 161 165 q 286 139 250 139 q 377 160 340 139 q 414 217 414 181 q 308 285 414 285 l 199 285 l 199 419 l 296 419 q 393 486 393 419 q 289 550 393 550 q 206 540 244 550 q 126 504 167 531 l 51 635 q 171 688 108 671 q 303 706 233 706 q 410 694 358 706 q 501 658 461 682 q 564 597 540 635 q 588 508 588 560 q 562 425 588 467 q 479 365 536 383 l 479 360 q 578 305 542 343 q 614 196 614 267 q 588 103 614 143 q 518 38 561 64 q 419 -3 475 11 q 306 -17 364 -17 z \"},\"и\":{\"ha\":810,\"x_min\":90,\"x_max\":719,\"o\":\"m 90 0 l 90 689 l 288 689 l 288 497 q 282 381 288 446 q 271 253 276 317 l 275 253 q 315 326 292 285 q 354 397 339 367 l 533 689 l 719 689 l 719 0 l 522 0 l 522 192 q 528 308 522 244 q 540 436 533 372 l 535 436 q 495 363 518 404 q 456 292 472 321 l 276 0 l 90 0 z \"},\"й\":{\"ha\":810,\"x_min\":90,\"x_max\":719,\"o\":\"m 90 0 l 90 689 l 288 689 l 288 497 q 282 381 288 446 q 271 253 276 317 l 275 253 q 315 326 292 285 q 354 397 339 367 l 533 689 l 719 689 l 719 0 l 522 0 l 522 192 q 528 308 522 244 q 540 436 533 372 l 535 436 q 495 363 518 404 q 456 292 472 321 l 276 0 l 90 0 m 411 794 q 233 856 290 794 q 172 1022 175 918 l 331 1022 q 350 933 333 964 q 411 903 367 903 q 472 933 456 903 q 492 1022 489 964 l 650 1022 q 590 856 647 918 q 411 794 532 794 z \"},\"к\":{\"ha\":758,\"x_min\":90,\"x_max\":749,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 435 l 365 435 l 425 561 q 468 633 446 604 q 517 677 490 661 q 575 699 544 693 q 643 706 606 706 q 699 696 674 706 l 667 507 q 653 511 660 510 q 640 513 647 513 q 593 500 614 513 q 553 443 572 488 l 517 361 l 749 0 l 525 0 l 367 275 l 294 275 l 294 0 l 90 0 z \"},\"л\":{\"ha\":796,\"x_min\":8,\"x_max\":707,\"o\":\"m 90 -17 q 47 -12 67 -17 q 8 -1 28 -8 l 42 182 q 58 178 50 179 q 76 176 67 176 q 124 199 104 176 q 151 279 144 222 q 176 483 165 382 q 199 689 186 585 l 707 689 l 707 0 l 503 0 l 503 529 l 360 529 q 341 376 350 453 q 321 222 332 299 q 247 44 304 106 q 90 -17 190 -17 z \"},\"м\":{\"ha\":917,\"x_min\":90,\"x_max\":826,\"o\":\"m 90 0 l 90 689 l 324 689 l 410 453 q 435 373 424 411 q 458 299 447 335 l 464 299 q 489 373 476 335 q 514 453 501 411 l 594 689 l 826 689 l 826 0 l 646 0 l 646 176 q 648 243 646 204 q 653 324 650 282 q 660 405 657 365 q 667 474 664 444 l 661 474 q 628 376 646 428 q 594 281 610 325 l 514 60 l 403 60 l 321 281 q 287 377 306 325 q 253 474 268 429 l 247 474 q 253 405 250 444 q 260 324 257 365 q 267 243 264 282 q 269 176 269 204 l 269 0 l 90 0 z \"},\"н\":{\"ha\":808,\"x_min\":90,\"x_max\":719,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 440 l 515 440 l 515 689 l 719 689 l 719 0 l 515 0 l 515 263 l 294 263 l 294 0 l 90 0 z \"},\"о\":{\"ha\":771,\"x_min\":50,\"x_max\":721,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 512 681 451 706 q 619 611 572 657 q 693 498 665 565 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 z \"},\"п\":{\"ha\":797,\"x_min\":90,\"x_max\":707,\"o\":\"m 90 0 l 90 689 l 707 689 l 707 0 l 503 0 l 503 529 l 294 529 l 294 0 l 90 0 z \"},\"р\":{\"ha\":796,\"x_min\":90,\"x_max\":742,\"o\":\"m 90 -256 l 90 689 l 257 689 l 271 621 l 276 621 q 367 681 317 657 q 472 706 418 706 q 585 681 535 706 q 669 610 635 656 q 723 499 704 564 q 742 356 742 435 q 717 198 742 267 q 652 81 693 129 q 559 8 611 33 q 451 -17 507 -17 q 365 2 407 -17 q 288 56 324 21 l 294 -54 l 294 -256 l 90 -256 m 404 150 q 494 198 457 150 q 532 353 532 246 q 413 539 532 539 q 294 476 353 539 l 294 194 q 350 160 322 169 q 404 150 378 150 z \"},\"с\":{\"ha\":649,\"x_min\":50,\"x_max\":618,\"o\":\"m 390 -17 q 256 8 318 -17 q 149 78 194 32 q 76 191 103 124 q 50 344 50 258 q 79 498 50 431 q 158 611 108 565 q 272 681 207 657 q 408 706 338 706 q 522 685 472 706 q 610 632 571 664 l 514 500 q 421 540 465 540 q 303 488 346 540 q 260 344 260 435 q 303 201 260 254 q 414 149 347 149 q 478 163 447 149 q 538 199 510 178 l 618 65 q 507 2 567 21 q 390 -17 447 -17 z \"},\"т\":{\"ha\":683,\"x_min\":36,\"x_max\":647,\"o\":\"m 239 0 l 239 529 l 36 529 l 36 689 l 647 689 l 647 529 l 443 529 l 443 0 l 239 0 z \"},\"у\":{\"ha\":724,\"x_min\":17,\"x_max\":707,\"o\":\"m 167 -269 q 113 -266 135 -269 q 69 -256 90 -262 l 106 -100 q 128 -106 115 -103 q 151 -108 140 -108 q 231 -83 203 -108 q 272 -18 258 -58 l 282 18 l 17 689 l 222 689 l 321 393 q 349 297 336 346 q 375 197 361 249 l 381 197 q 403 295 392 246 q 428 393 415 344 l 511 689 l 707 689 l 468 -7 q 416 -122 443 -72 q 353 -203 389 -171 q 273 -253 318 -236 q 167 -269 228 -269 z \"},\"ф\":{\"ha\":1082,\"x_min\":54,\"x_max\":1028,\"o\":\"m 442 -256 l 442 -79 l 447 25 q 387 -4 419 8 q 319 -17 354 -17 q 210 8 258 -17 q 126 80 161 33 q 73 193 92 126 q 54 344 54 260 q 77 496 54 429 q 137 609 100 563 q 222 681 174 656 q 319 706 269 706 q 392 695 361 706 q 447 668 422 685 l 442 768 l 442 974 l 640 974 l 640 768 l 633 663 q 701 693 664 681 q 775 706 738 706 q 880 681 833 706 q 959 610 926 656 q 1010 499 992 564 q 1028 356 1028 435 q 1005 198 1028 267 q 944 81 982 129 q 858 8 907 33 q 757 -17 810 -17 q 633 21 689 -17 l 640 -79 l 640 -256 l 442 -256 m 374 150 q 447 181 417 150 l 447 513 q 408 533 429 528 q 368 539 388 539 q 294 492 325 539 q 264 347 264 446 q 292 197 264 244 q 374 150 321 150 m 710 150 q 788 198 757 150 q 818 353 818 246 q 714 539 818 539 q 674 533 693 539 q 633 510 654 526 l 633 178 q 672 156 653 161 q 710 150 692 150 z \"},\"х\":{\"ha\":714,\"x_min\":19,\"x_max\":694,\"o\":\"m 19 0 l 231 358 l 32 689 l 251 689 l 313 578 q 341 519 326 549 q 371 460 356 489 l 376 460 q 400 519 388 489 q 424 578 413 549 l 471 689 l 682 689 l 482 335 l 694 0 l 475 0 l 408 114 q 376 174 392 143 q 343 233 360 204 l 338 233 q 311 174 325 204 q 285 114 297 144 l 231 0 l 19 0 z \"},\"ц\":{\"ha\":826,\"x_min\":90,\"x_max\":810,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 160 l 497 160 l 497 689 l 701 689 l 701 160 l 810 160 l 810 26 l 790 -239 l 615 -239 l 615 0 l 90 0 z \"},\"ч\":{\"ha\":764,\"x_min\":67,\"x_max\":674,\"o\":\"m 469 0 l 469 235 q 417 226 442 228 q 349 224 392 224 q 235 238 288 224 q 146 285 183 253 q 88 367 108 317 q 67 490 67 418 l 67 689 l 271 689 l 271 490 q 299 410 271 438 q 393 383 328 383 q 433 385 415 383 q 469 392 450 388 l 469 689 l 674 689 l 674 0 l 469 0 z \"},\"ш\":{\"ha\":1115,\"x_min\":90,\"x_max\":1026,\"o\":\"m 90 0 l 90 689 l 292 689 l 292 160 l 460 160 l 460 689 l 656 689 l 656 160 l 824 160 l 824 689 l 1026 689 l 1026 0 l 90 0 z \"},\"щ\":{\"ha\":1151,\"x_min\":90,\"x_max\":1135,\"o\":\"m 940 -239 l 940 0 l 90 0 l 90 689 l 292 689 l 292 160 l 460 160 l 460 689 l 656 689 l 656 160 l 824 160 l 824 689 l 1026 689 l 1026 160 l 1135 160 l 1135 26 l 1115 -239 l 940 -239 z \"},\"ъ\":{\"ha\":865,\"x_min\":36,\"x_max\":815,\"o\":\"m 243 0 l 243 529 l 36 529 l 36 689 l 447 689 l 447 469 l 521 469 q 637 458 583 469 q 730 418 690 446 q 792 346 769 390 q 815 238 815 301 q 792 126 815 171 q 730 52 769 81 q 637 12 690 24 q 521 0 583 0 l 243 0 m 447 156 l 511 156 q 621 239 621 156 q 511 318 621 318 l 447 318 l 447 156 z \"},\"ы\":{\"ha\":1026,\"x_min\":90,\"x_max\":936,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 469 l 344 469 q 461 458 407 469 q 555 418 515 446 q 617 346 594 390 q 640 238 640 301 q 617 126 640 171 q 555 52 594 81 q 461 12 515 24 q 344 0 407 0 l 90 0 m 294 156 l 335 156 q 444 239 444 156 q 335 318 444 318 l 294 318 l 294 156 m 732 0 l 732 689 l 936 689 l 936 0 l 732 0 z \"},\"ь\":{\"ha\":717,\"x_min\":90,\"x_max\":667,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 469 l 371 469 q 488 458 433 469 q 581 418 542 446 q 644 346 621 390 q 667 238 667 301 q 644 126 667 171 q 581 52 621 81 q 488 12 542 24 q 371 0 433 0 l 90 0 m 294 156 l 363 156 q 471 239 471 156 q 363 318 471 318 l 294 318 l 294 156 z \"},\"э\":{\"ha\":649,\"x_min\":29,\"x_max\":600,\"o\":\"m 260 -17 q 138 2 199 -17 q 29 65 76 21 l 104 185 q 165 152 129 165 q 236 139 200 139 q 348 172 304 139 q 404 285 392 206 l 165 285 l 165 419 l 401 419 q 347 520 388 490 q 244 550 307 550 q 181 540 210 550 q 126 510 153 529 l 39 626 q 133 684 75 663 q 257 706 190 706 q 392 683 329 706 q 501 616 454 661 q 574 503 547 571 q 600 344 600 436 q 574 187 600 254 q 503 74 549 119 q 394 6 457 29 q 260 -17 332 -17 z \"},\"ю\":{\"ha\":1078,\"x_min\":90,\"x_max\":1028,\"o\":\"m 714 -17 q 601 2 653 -17 q 507 57 549 21 q 438 144 465 93 q 399 261 410 196 l 294 261 l 294 0 l 90 0 l 90 689 l 294 689 l 294 439 l 400 439 q 510 635 425 565 q 714 706 594 706 q 836 681 779 706 q 936 611 893 657 q 1003 498 979 565 q 1028 344 1028 431 q 1003 191 1028 258 q 936 78 979 124 q 836 8 893 32 q 714 -17 779 -17 m 701 149 q 790 201 761 149 q 818 344 818 254 q 790 488 818 435 q 701 540 761 540 q 614 488 646 540 q 582 344 582 435 q 614 201 582 254 q 701 149 646 149 z \"},\"я\":{\"ha\":756,\"x_min\":21,\"x_max\":667,\"o\":\"m 463 0 l 463 225 l 386 225 l 247 0 l 21 0 l 204 267 q 119 342 153 294 q 85 461 85 389 q 107 569 85 525 q 168 640 129 613 q 260 678 207 667 q 372 689 313 689 l 667 689 l 667 0 l 463 0 m 397 363 l 463 363 l 463 539 l 397 539 q 286 456 286 539 q 314 388 286 414 q 397 363 342 363 z \"},\"ѐ\":{\"ha\":719,\"x_min\":50,\"x_max\":668,\"o\":\"m 399 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 526 4 590 25 q 399 -17 461 -17 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 m 361 794 l 110 1013 l 247 1147 l 461 894 l 361 794 z \"},\"ё\":{\"ha\":719,\"x_min\":50,\"x_max\":668,\"o\":\"m 399 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 526 4 590 25 q 399 -17 461 -17 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 m 224 790 q 151 819 179 790 q 124 890 124 847 q 151 960 124 932 q 224 989 179 989 q 295 960 268 989 q 322 890 322 932 q 295 819 322 847 q 224 790 268 790 m 526 790 q 455 819 482 790 q 428 890 428 847 q 455 960 428 932 q 526 989 482 989 q 599 960 571 989 q 626 890 626 932 q 599 819 626 847 q 526 790 571 790 z \"},\"ђ\":{\"ha\":794,\"x_min\":-4,\"x_max\":742,\"o\":\"m 419 -272 q 356 -267 382 -272 q 311 -253 331 -261 l 347 -103 q 373 -110 361 -107 q 399 -112 385 -112 q 451 -97 426 -112 q 494 -44 475 -82 q 523 60 513 -6 q 533 225 533 125 q 525 347 533 300 q 501 420 517 394 q 462 455 485 446 q 408 464 439 464 q 352 447 378 464 q 294 399 326 431 l 294 0 l 90 0 l 90 772 l -4 772 l -4 863 l 90 869 l 90 974 l 294 974 l 294 871 l 529 871 l 529 772 l 294 772 l 294 668 l 285 544 q 324 579 303 563 q 370 609 346 596 q 423 631 394 622 q 485 639 451 639 q 676 540 611 639 q 742 250 742 442 q 719 1 742 101 q 656 -160 697 -100 q 554 -247 614 -221 q 419 -272 494 -272 z \"},\"ѓ\":{\"ha\":600,\"x_min\":90,\"x_max\":603,\"o\":\"m 90 0 l 90 689 l 564 689 l 564 529 l 294 529 l 294 0 l 90 0 m 351 794 l 251 894 l 465 1147 l 603 1013 l 351 794 z \"},\"є\":{\"ha\":649,\"x_min\":50,\"x_max\":618,\"o\":\"m 390 -17 q 255 6 317 -17 q 147 74 193 29 q 76 187 101 119 q 50 344 50 254 q 78 502 50 435 q 156 615 107 569 q 270 683 206 660 q 407 706 335 706 q 521 685 471 706 q 610 632 571 664 l 522 507 q 468 539 496 528 q 407 550 440 550 q 303 519 344 550 q 247 419 263 488 l 482 419 l 482 285 l 244 285 q 301 174 257 208 q 414 139 346 139 q 485 155 451 139 q 544 190 519 171 l 618 65 q 507 2 567 21 q 390 -17 447 -17 z \"},\"ѕ\":{\"ha\":615,\"x_min\":29,\"x_max\":576,\"o\":\"m 293 -17 q 153 10 225 -17 q 29 79 82 36 l 121 207 q 211 153 168 171 q 299 135 254 135 q 365 150 344 135 q 386 193 386 165 q 374 223 386 210 q 342 247 363 236 q 297 267 322 258 q 246 288 272 276 q 182 317 214 300 q 124 358 150 333 q 81 415 97 382 q 64 490 64 447 q 83 578 64 538 q 136 646 101 618 q 219 690 171 674 q 328 706 268 706 q 467 678 407 706 q 571 618 526 651 l 479 496 q 406 539 442 524 q 333 554 369 554 q 256 500 256 554 q 267 472 256 483 q 297 450 278 460 q 340 431 315 440 q 390 413 364 422 q 456 384 424 400 q 516 344 489 368 q 560 287 543 321 q 576 206 576 253 q 558 118 576 158 q 504 48 540 78 q 415 1 468 18 q 293 -17 363 -17 z \"},\"і\":{\"ha\":383,\"x_min\":74,\"x_max\":310,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 0 l 90 0 m 192 790 q 107 820 140 790 q 74 897 74 850 q 107 974 74 944 q 192 1003 140 1003 q 277 974 244 1003 q 310 897 310 944 q 277 820 310 850 q 192 790 244 790 z \"},\"ї\":{\"ha\":383,\"x_min\":-60,\"x_max\":443,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 0 l 90 0 m 40 790 q -32 819 -4 790 q -60 890 -60 847 q -32 960 -60 932 q 40 989 -4 989 q 112 960 85 989 q 139 890 139 932 q 112 819 139 847 q 40 790 85 790 m 343 790 q 272 819 299 790 q 244 890 244 847 q 272 960 244 932 q 343 989 299 989 q 415 960 388 989 q 443 890 443 932 q 415 819 443 847 q 343 790 388 790 z \"},\"ј\":{\"ha\":386,\"x_min\":-71,\"x_max\":313,\"o\":\"m 50 -272 q -22 -267 7 -272 q -71 -253 -50 -261 l -35 -103 q -8 -110 -21 -107 q 19 -112 4 -112 q 76 -86 60 -112 q 92 -1 92 -60 l 92 689 l 296 689 l 296 4 q 284 -103 296 -53 q 244 -190 272 -153 q 168 -250 215 -228 q 50 -272 121 -272 m 194 790 q 110 820 143 790 q 76 897 76 850 q 110 974 76 944 q 194 1003 143 1003 q 279 974 246 1003 q 313 897 313 944 q 279 820 313 850 q 194 790 246 790 z \"},\"љ\":{\"ha\":1083,\"x_min\":8,\"x_max\":1033,\"o\":\"m 90 -17 q 47 -12 67 -17 q 8 -1 28 -8 l 43 182 q 58 178 50 179 q 78 176 67 176 q 119 197 97 176 q 153 279 142 218 q 177 475 171 374 q 189 689 183 576 l 683 689 l 683 469 l 739 469 q 855 458 801 469 q 948 418 908 446 q 1010 346 988 390 q 1033 238 1033 301 q 1010 126 1033 171 q 948 52 988 81 q 855 12 908 24 q 739 0 801 0 l 479 0 l 479 529 l 364 529 q 350 356 357 442 q 324 183 343 271 q 247 35 303 88 q 90 -17 190 -17 m 683 156 l 729 156 q 839 239 839 156 q 729 318 839 318 l 683 318 l 683 156 z \"},\"њ\":{\"ha\":1094,\"x_min\":90,\"x_max\":1044,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 440 l 490 440 l 490 689 l 694 689 l 694 469 l 750 469 q 866 458 813 469 q 959 418 919 446 q 1022 346 999 390 q 1044 238 1044 301 q 1022 126 1044 171 q 959 52 999 81 q 866 12 919 24 q 750 0 813 0 l 490 0 l 490 263 l 294 263 l 294 0 l 90 0 m 694 156 l 740 156 q 850 239 850 156 q 740 318 850 318 l 694 318 l 694 156 z \"},\"ћ\":{\"ha\":793,\"x_min\":-4,\"x_max\":711,\"o\":\"m 90 0 l 90 772 l -4 772 l -4 863 l 90 869 l 90 974 l 294 974 l 294 871 l 529 871 l 529 772 l 294 772 l 294 668 l 285 543 q 326 578 304 561 q 375 608 349 594 q 432 631 401 622 q 497 639 463 639 q 660 565 610 639 q 711 361 711 492 l 711 0 l 507 0 l 507 335 q 487 437 507 410 q 422 464 467 464 q 356 447 383 464 q 294 397 328 429 l 294 0 l 90 0 z \"},\"ќ\":{\"ha\":758,\"x_min\":90,\"x_max\":749,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 435 l 365 435 l 425 561 q 468 633 446 604 q 517 677 490 661 q 575 699 544 693 q 643 706 606 706 q 699 696 674 706 l 667 507 q 653 511 660 510 q 640 513 647 513 q 593 500 614 513 q 553 443 572 488 l 517 361 l 749 0 l 525 0 l 367 275 l 294 275 l 294 0 l 90 0 m 424 794 l 324 894 l 538 1147 l 675 1013 l 424 794 z \"},\"ѝ\":{\"ha\":810,\"x_min\":90,\"x_max\":719,\"o\":\"m 90 0 l 90 689 l 288 689 l 288 497 q 282 381 288 446 q 271 253 276 317 l 275 253 q 315 326 292 285 q 354 397 339 367 l 533 689 l 719 689 l 719 0 l 522 0 l 522 192 q 528 308 522 244 q 540 436 533 372 l 535 436 q 495 363 518 404 q 456 292 472 321 l 276 0 l 90 0 m 397 794 l 146 1013 l 283 1147 l 497 894 l 397 794 z \"},\"ў\":{\"ha\":724,\"x_min\":17,\"x_max\":707,\"o\":\"m 167 -269 q 113 -266 135 -269 q 69 -256 90 -262 l 106 -100 q 128 -106 115 -103 q 151 -108 140 -108 q 231 -83 203 -108 q 272 -18 258 -58 l 282 18 l 17 689 l 222 689 l 321 393 q 349 297 336 346 q 375 197 361 249 l 381 197 q 403 295 392 246 q 428 393 415 344 l 511 689 l 707 689 l 468 -7 q 416 -122 443 -72 q 353 -203 389 -171 q 273 -253 318 -236 q 167 -269 228 -269 m 369 794 q 191 856 249 794 q 131 1022 133 918 l 289 1022 q 308 933 292 964 q 369 903 325 903 q 431 933 414 903 q 450 1022 447 964 l 608 1022 q 548 856 606 918 q 369 794 490 794 z \"},\"џ\":{\"ha\":803,\"x_min\":90,\"x_max\":714,\"o\":\"m 90 0 l 90 689 l 294 689 l 294 160 l 510 160 l 510 689 l 714 689 l 714 0 l 506 0 l 483 -239 l 308 -239 l 301 0 l 90 0 z \"},\"ѣ\":{\"ha\":833,\"x_min\":36,\"x_max\":783,\"o\":\"m 215 0 l 215 590 l 36 590 l 36 751 l 215 751 l 215 872 l 419 872 l 419 751 l 653 751 l 653 590 l 419 590 l 419 469 l 489 469 q 605 458 551 469 q 698 418 658 446 q 760 346 738 390 q 783 238 783 301 q 760 126 783 171 q 698 52 738 81 q 605 12 658 24 q 489 0 551 0 l 215 0 m 419 156 l 479 156 q 589 239 589 156 q 479 318 589 318 l 419 318 l 419 156 z \"},\"ѳ\":{\"ha\":771,\"x_min\":50,\"x_max\":721,\"o\":\"m 386 -17 q 258 6 319 -17 q 151 75 197 29 q 78 188 106 121 q 50 344 50 256 q 78 501 50 433 q 151 614 106 568 q 258 683 197 660 q 386 706 319 706 q 513 683 453 706 q 619 614 574 660 q 693 501 665 568 q 721 344 721 433 q 693 188 721 256 q 619 75 665 121 q 513 6 574 29 q 386 -17 453 -17 m 386 554 q 247 419 272 554 l 524 419 q 386 554 499 554 m 386 136 q 480 174 444 136 q 526 285 515 211 l 244 285 q 292 174 256 211 q 386 136 328 136 z \"},\"ѵ\":{\"ha\":740,\"x_min\":17,\"x_max\":768,\"o\":\"m 249 0 l 17 689 l 222 689 l 311 364 q 338 259 325 313 q 365 151 351 206 l 371 151 q 390 259 381 206 q 414 364 400 313 l 442 464 q 524 646 472 586 q 669 706 575 706 q 726 701 706 706 q 768 690 747 697 l 733 518 q 715 524 725 521 q 693 526 706 526 q 644 502 663 526 q 614 438 625 478 l 494 0 l 249 0 z \"},\"ґ\":{\"ha\":601,\"x_min\":90,\"x_max\":579,\"o\":\"m 90 0 l 90 689 l 383 689 l 413 928 l 579 928 l 565 529 l 294 529 l 294 0 l 90 0 z \"},\"ғ\":{\"ha\":635,\"x_min\":33,\"x_max\":599,\"o\":\"m 33 268 l 33 360 l 125 365 l 125 689 l 599 689 l 599 529 l 329 529 l 329 367 l 494 367 l 494 268 l 329 268 l 329 0 l 125 0 l 125 268 l 33 268 z \"},\"җ\":{\"ha\":1115,\"x_min\":8,\"x_max\":1100,\"o\":\"m 907 -239 l 907 0 l 829 0 l 683 275 l 619 275 l 619 0 l 438 0 l 438 275 l 374 275 l 228 0 l 8 0 l 228 357 l 189 443 q 149 499 171 486 q 103 513 128 513 q 90 511 96 513 q 76 507 83 510 l 44 696 q 100 706 68 706 q 226 675 175 706 q 317 561 278 644 l 376 435 l 438 435 l 438 689 l 619 689 l 619 435 l 681 435 l 740 561 q 831 675 779 644 q 957 706 882 706 q 1013 696 989 706 l 981 507 q 967 511 974 510 q 954 513 961 513 q 908 499 929 513 q 868 443 886 486 l 829 357 l 950 160 l 1100 160 l 1100 26 l 1081 -239 l 907 -239 z \"},\"ҙ\":{\"ha\":661,\"x_min\":39,\"x_max\":614,\"o\":\"m 226 -239 l 219 -11 q 129 14 174 -4 q 39 65 85 32 l 118 194 q 206 152 161 165 q 286 139 250 139 q 377 160 340 139 q 414 217 414 181 q 308 285 414 285 l 199 285 l 199 419 l 296 419 q 393 486 393 419 q 289 550 393 550 q 206 540 244 550 q 126 504 167 531 l 51 635 q 171 688 108 671 q 303 706 233 706 q 410 694 358 706 q 501 658 461 682 q 564 597 540 635 q 588 508 588 560 q 562 425 588 467 q 479 365 536 383 l 479 360 q 578 305 542 343 q 614 196 614 267 q 599 125 614 157 q 558 68 585 93 q 497 25 532 43 q 422 -3 463 7 l 399 -239 l 226 -239 z \"},\"қ\":{\"ha\":817,\"x_min\":90,\"x_max\":801,\"o\":\"m 608 -239 l 608 0 l 525 0 l 367 275 l 294 275 l 294 0 l 90 0 l 90 689 l 294 689 l 294 435 l 365 435 l 425 561 q 468 633 446 604 q 517 677 490 661 q 575 699 544 693 q 643 706 606 706 q 699 696 674 706 l 667 507 q 653 511 660 510 q 640 513 647 513 q 593 500 614 513 q 553 443 572 488 l 517 361 l 646 160 l 801 160 l 801 26 l 782 -239 l 608 -239 z \"},\"ҡ\":{\"ha\":911,\"x_min\":36,\"x_max\":901,\"o\":\"m 243 0 l 243 529 l 36 529 l 36 689 l 447 689 l 447 435 l 518 435 l 578 561 q 621 633 599 604 q 670 677 643 661 q 728 699 697 693 q 796 706 758 706 q 851 696 826 706 l 819 507 q 806 511 813 510 q 793 513 800 513 q 746 500 767 513 q 706 443 725 488 l 669 361 l 901 0 l 678 0 l 519 275 l 447 275 l 447 0 l 243 0 z \"},\"ң\":{\"ha\":844,\"x_min\":93,\"x_max\":828,\"o\":\"m 633 -239 l 633 0 l 518 0 l 518 263 l 297 263 l 297 0 l 93 0 l 93 689 l 297 689 l 297 440 l 518 440 l 518 689 l 722 689 l 722 160 l 828 160 l 828 26 l 810 -239 l 633 -239 z \"},\"ҫ\":{\"ha\":649,\"x_min\":50,\"x_max\":618,\"o\":\"m 293 -239 l 286 -3 q 116 116 182 28 q 50 344 50 204 q 79 498 50 431 q 158 611 108 565 q 272 681 207 657 q 408 706 338 706 q 522 685 472 706 q 610 632 571 664 l 514 500 q 421 540 465 540 q 303 488 346 540 q 260 344 260 435 q 303 201 260 254 q 414 149 347 149 q 478 163 447 149 q 538 199 510 178 l 618 65 q 556 22 589 39 q 489 -4 522 6 l 465 -239 l 293 -239 z \"},\"ү\":{\"ha\":726,\"x_min\":17,\"x_max\":710,\"o\":\"m 265 -256 l 265 0 l 17 689 l 222 689 l 310 385 q 337 282 322 332 q 365 179 351 232 l 371 179 q 398 282 383 232 q 426 385 413 332 l 514 689 l 710 689 l 469 0 l 469 -256 l 265 -256 z \"},\"ұ\":{\"ha\":726,\"x_min\":17,\"x_max\":710,\"o\":\"m 265 -256 l 265 0 l 68 0 l 68 90 l 175 99 l 229 99 l 17 689 l 222 689 l 310 385 q 337 282 322 332 q 365 179 351 232 l 371 179 q 398 282 383 232 q 426 385 413 332 l 514 689 l 710 689 l 504 99 l 657 99 l 657 0 l 469 0 l 469 -256 l 265 -256 z \"},\"ҳ\":{\"ha\":761,\"x_min\":19,\"x_max\":746,\"o\":\"m 553 -239 l 553 0 l 475 0 l 408 114 q 376 174 392 143 q 343 233 360 204 l 338 233 q 311 174 325 204 q 285 114 297 144 l 231 0 l 19 0 l 231 358 l 32 689 l 251 689 l 313 578 q 341 519 326 549 q 371 460 356 489 l 376 460 q 400 519 388 489 q 424 578 413 549 l 471 689 l 682 689 l 482 335 l 593 160 l 746 160 l 746 26 l 726 -239 l 553 -239 z \"},\"ҷ\":{\"ha\":799,\"x_min\":67,\"x_max\":783,\"o\":\"m 590 -239 l 590 0 l 469 0 l 469 235 q 417 226 442 228 q 349 224 392 224 q 235 238 288 224 q 146 285 183 253 q 88 367 108 317 q 67 490 67 418 l 67 689 l 271 689 l 271 490 q 299 410 271 438 q 393 383 328 383 q 433 385 415 383 q 469 392 450 388 l 469 689 l 674 689 l 674 160 l 783 160 l 783 26 l 764 -239 l 590 -239 z \"},\"һ\":{\"ha\":793,\"x_min\":90,\"x_max\":711,\"o\":\"m 90 0 l 90 974 l 294 974 l 294 735 l 285 611 q 375 676 324 646 q 497 706 426 706 q 660 632 610 706 q 711 428 711 558 l 711 0 l 507 0 l 507 401 q 487 504 507 476 q 422 532 467 532 q 356 515 383 532 q 294 465 328 497 l 294 0 l 90 0 z \"},\"ӂ\":{\"ha\":1057,\"x_min\":8,\"x_max\":1049,\"o\":\"m 8 0 l 228 357 l 189 443 q 149 499 171 486 q 103 513 128 513 q 90 511 96 513 q 76 507 83 510 l 44 696 q 100 706 68 706 q 226 675 175 706 q 317 561 278 644 l 376 435 l 438 435 l 438 689 l 619 689 l 619 435 l 681 435 l 740 561 q 831 675 779 644 q 957 706 882 706 q 1013 696 989 706 l 981 507 q 967 511 974 510 q 954 513 961 513 q 908 499 929 513 q 868 443 886 486 l 829 357 l 1049 0 l 829 0 l 683 275 l 619 275 l 619 0 l 438 0 l 438 275 l 374 275 l 228 0 l 8 0 m 528 794 q 349 856 407 794 q 289 1022 292 918 l 447 1022 q 467 933 450 964 q 528 903 483 903 q 589 933 572 903 q 608 1022 606 964 l 767 1022 q 706 856 764 918 q 528 794 649 794 z \"},\"ӏ\":{\"ha\":397,\"x_min\":90,\"x_max\":381,\"o\":\"m 278 -17 q 189 0 225 -17 q 131 47 153 17 q 100 119 110 76 q 90 214 90 161 l 90 974 l 294 974 l 294 206 q 306 161 294 174 q 331 149 318 149 q 342 149 338 149 q 356 151 347 149 l 381 0 q 338 -12 364 -7 q 278 -17 313 -17 z \"},\"ӑ\":{\"ha\":732,\"x_min\":58,\"x_max\":650,\"o\":\"m 264 -17 q 178 -1 217 -17 q 114 44 140 15 q 73 110 88 72 q 58 192 58 147 q 150 361 58 300 q 446 443 242 422 q 419 516 443 489 q 338 543 394 543 q 249 526 293 543 q 156 481 206 510 l 82 615 q 222 681 149 656 q 376 706 294 706 q 580 630 510 706 q 650 394 650 554 l 650 0 l 483 0 l 469 71 l 464 71 q 371 8 419 32 q 264 -17 322 -17 m 333 142 q 393 157 368 142 q 446 200 418 172 l 446 321 q 296 276 338 306 q 254 207 254 247 q 276 158 254 174 q 333 142 297 142 m 382 794 q 203 856 261 794 q 143 1022 146 918 l 301 1022 q 321 933 304 964 q 382 903 338 903 q 443 933 426 903 q 463 1022 460 964 l 621 1022 q 560 856 618 918 q 382 794 503 794 z \"},\"ӕ\":{\"ha\":1092,\"x_min\":65,\"x_max\":1040,\"o\":\"m 269 -17 q 185 -1 222 -17 q 121 44 147 15 q 80 110 94 72 q 65 190 65 147 q 156 362 65 300 q 449 444 246 424 q 423 516 446 489 q 342 543 400 543 q 256 526 300 543 q 161 481 211 510 l 89 615 q 226 681 156 656 q 371 706 296 706 q 483 678 435 706 q 563 601 532 650 q 656 678 607 651 q 767 706 704 706 q 886 680 835 706 q 972 609 938 654 q 1023 503 1006 564 q 1040 371 1040 442 q 1038 320 1040 343 q 1032 285 1035 297 l 635 285 q 692 178 646 213 q 800 143 738 143 q 874 157 839 143 q 946 193 908 171 l 1015 61 q 898 4 963 25 q 772 -17 833 -17 q 637 13 694 -17 q 535 90 579 42 q 400 8 461 32 q 269 -17 339 -17 m 339 142 q 408 157 375 142 q 468 200 440 172 q 449 292 453 243 l 447 321 q 303 276 346 306 q 260 207 260 247 q 281 158 260 174 q 339 142 303 142 m 635 410 l 867 410 q 842 511 867 472 q 760 550 817 550 q 677 516 711 550 q 635 410 643 482 z \"},\"ӗ\":{\"ha\":719,\"x_min\":50,\"x_max\":668,\"o\":\"m 399 -17 q 261 8 325 -17 q 150 78 197 32 q 76 192 103 125 q 50 344 50 258 q 78 495 50 428 q 151 609 106 563 q 254 681 196 656 q 375 706 313 706 q 503 681 449 706 q 595 611 558 656 q 650 506 632 567 q 668 375 668 446 q 665 322 668 347 q 660 285 663 297 l 247 285 q 309 174 261 210 q 426 139 357 139 q 575 185 500 139 l 643 61 q 526 4 590 25 q 399 -17 461 -17 m 246 419 l 494 419 q 468 514 494 478 q 379 550 442 550 q 294 518 331 550 q 246 419 257 486 m 375 794 q 197 856 254 794 q 136 1022 139 918 l 294 1022 q 314 933 297 964 q 375 903 331 903 q 436 933 419 903 q 456 1022 453 964 l 614 1022 q 553 856 611 918 q 375 794 496 794 z \"},\"ә\":{\"ha\":719,\"x_min\":50,\"x_max\":669,\"o\":\"m 346 -17 q 217 8 272 -17 q 124 78 161 33 q 69 185 88 124 q 50 317 50 246 q 53 369 50 344 q 58 407 56 394 l 471 407 q 419 515 460 481 q 313 550 378 550 q 163 504 236 550 l 94 636 q 217 690 151 674 q 347 706 282 706 q 474 681 415 706 q 576 609 533 656 q 644 496 619 563 q 669 344 669 429 q 643 194 669 261 q 572 80 617 126 q 469 8 528 33 q 346 -17 410 -17 m 342 139 q 427 170 392 139 q 474 272 463 201 l 225 272 q 252 176 225 213 q 342 139 279 139 z \"},\"ӣ\":{\"ha\":810,\"x_min\":90,\"x_max\":719,\"o\":\"m 90 0 l 90 689 l 288 689 l 288 497 q 282 381 288 446 q 271 253 276 317 l 275 253 q 315 326 292 285 q 354 397 339 367 l 533 689 l 719 689 l 719 0 l 522 0 l 522 192 q 528 308 522 244 q 540 436 533 372 l 535 436 q 495 363 518 404 q 456 292 472 321 l 276 0 l 90 0 m 204 822 l 204 951 l 615 951 l 615 822 l 204 822 z \"},\"ӧ\":{\"ha\":771,\"x_min\":50,\"x_max\":721,\"o\":\"m 386 -17 q 260 8 321 -17 q 152 78 199 32 q 78 191 106 124 q 50 344 50 258 q 78 498 50 431 q 152 611 106 565 q 260 681 199 657 q 386 706 321 706 q 512 681 451 706 q 619 611 572 657 q 693 498 665 565 q 721 344 721 431 q 693 191 721 258 q 619 78 665 124 q 512 8 572 32 q 386 -17 451 -17 m 386 149 q 481 201 449 149 q 513 344 513 254 q 481 488 513 435 q 386 540 449 540 q 291 488 322 540 q 260 344 260 435 q 291 201 260 254 q 386 149 322 149 m 233 790 q 161 819 189 790 q 133 890 133 847 q 161 960 133 932 q 233 989 189 989 q 305 960 278 989 q 332 890 332 932 q 305 819 332 847 q 233 790 278 790 m 536 790 q 465 819 492 790 q 438 890 438 847 q 465 960 438 932 q 536 989 492 989 q 608 960 581 989 q 636 890 636 932 q 608 819 636 847 q 536 790 581 790 z \"},\"ө\":{\"ha\":771,\"x_min\":50,\"x_max\":721,\"o\":\"m 386 -17 q 258 6 319 -17 q 151 75 197 29 q 78 188 106 121 q 50 344 50 256 q 78 501 50 433 q 151 614 106 568 q 258 683 197 660 q 386 706 319 706 q 513 683 453 706 q 619 614 574 660 q 693 501 665 568 q 721 344 721 433 q 693 188 721 256 q 619 75 665 121 q 513 6 574 29 q 386 -17 453 -17 m 386 554 q 247 419 272 554 l 524 419 q 386 554 499 554 m 386 136 q 480 174 444 136 q 526 285 515 211 l 244 285 q 292 174 256 211 q 386 136 328 136 z \"},\"ӯ\":{\"ha\":724,\"x_min\":17,\"x_max\":707,\"o\":\"m 167 -269 q 113 -266 135 -269 q 69 -256 90 -262 l 106 -100 q 128 -106 115 -103 q 151 -108 140 -108 q 231 -83 203 -108 q 272 -18 258 -58 l 282 18 l 17 689 l 222 689 l 321 393 q 349 297 336 346 q 375 197 361 249 l 381 197 q 403 295 392 246 q 428 393 415 344 l 511 689 l 707 689 l 468 -7 q 416 -122 443 -72 q 353 -203 389 -171 q 273 -253 318 -236 q 167 -269 228 -269 m 164 822 l 164 951 l 575 951 l 575 822 l 164 822 z \"},\"ӳ\":{\"ha\":724,\"x_min\":17,\"x_max\":707,\"o\":\"m 167 -269 q 113 -266 135 -269 q 69 -256 90 -262 l 106 -100 q 128 -106 115 -103 q 151 -108 140 -108 q 231 -83 203 -108 q 272 -18 258 -58 l 282 18 l 17 689 l 222 689 l 321 393 q 349 297 336 346 q 375 197 361 249 l 381 197 q 403 295 392 246 q 428 393 415 344 l 511 689 l 707 689 l 468 -7 q 416 -122 443 -72 q 353 -203 389 -171 q 273 -253 318 -236 q 167 -269 228 -269 m 297 785 l 190 833 l 311 1085 l 449 1024 l 297 785 m 546 785 l 439 833 l 560 1085 l 697 1024 l 546 785 z \"},\"№\":{\"ha\":1343,\"x_min\":63,\"x_max\":1321,\"o\":\"m 136 -17 q 103 -15 113 -17 q 78 -10 93 -12 l 63 149 q 106 160 94 149 q 118 208 118 172 l 118 882 l 342 882 q 453 601 399 740 q 560 318 507 461 l 597 221 l 603 221 q 590 335 596 283 q 581 431 585 388 q 576 512 578 475 q 574 583 574 549 l 574 717 q 613 852 574 806 q 738 899 651 899 q 771 897 761 899 q 796 892 781 894 l 811 733 q 767 722 779 733 q 756 674 756 710 l 756 0 l 532 0 q 421 281 475 142 q 314 564 367 421 l 276 661 l 271 661 q 283 547 278 599 q 292 451 289 494 q 298 370 296 407 q 300 299 300 333 l 300 165 q 261 30 300 76 q 136 -17 222 -17 m 1090 374 q 1003 389 1044 374 q 930 433 961 404 q 880 506 899 463 q 861 606 861 549 q 880 705 861 661 q 930 778 899 749 q 1003 824 961 808 q 1090 839 1044 839 q 1178 824 1136 839 q 1251 778 1219 808 q 1302 705 1283 749 q 1321 606 1321 661 q 1302 506 1321 549 q 1251 433 1283 463 q 1178 389 1219 404 q 1090 374 1136 374 m 1090 499 q 1142 524 1124 499 q 1161 606 1161 549 q 1142 688 1161 663 q 1090 714 1124 714 q 1038 688 1057 714 q 1019 606 1019 663 q 1038 524 1019 549 q 1090 499 1057 499 m 907 178 l 907 286 l 1274 286 l 1274 178 l 907 178 z \"},\"&\":{\"ha\":926,\"x_min\":35,\"x_max\":901,\"o\":\"m 336 -17 q 206 4 263 -17 q 112 60 150 25 q 54 142 74 96 q 35 242 35 189 q 48 327 35 289 q 84 396 61 365 q 137 451 107 426 q 200 497 167 476 q 159 594 174 546 q 144 685 144 642 q 162 776 144 733 q 211 852 179 819 q 288 903 243 885 q 390 922 333 922 q 553 867 493 922 q 613 717 613 811 q 597 635 613 672 q 553 567 581 599 q 492 510 526 536 q 424 460 458 483 q 509 373 463 415 q 606 294 556 331 q 667 393 640 339 q 710 511 693 447 l 896 511 q 834 352 871 428 q 744 206 797 276 q 827 169 788 183 q 901 149 867 154 l 853 -17 q 738 18 796 -6 q 621 75 679 42 q 492 8 563 32 q 336 -17 422 -17 m 313 686 q 320 633 313 661 q 342 578 328 606 q 424 639 390 607 q 457 717 457 671 q 442 768 457 749 q 394 788 426 788 q 336 760 360 788 q 313 686 313 733 m 363 139 q 476 175 419 139 q 376 265 424 218 q 289 363 329 313 q 244 313 261 339 q 228 254 228 286 q 265 171 228 203 q 363 139 301 139 z \"},\".\":{\"ha\":417,\"x_min\":85,\"x_max\":332,\"o\":\"m 208 -17 q 120 20 156 -17 q 85 111 85 57 q 120 203 85 167 q 208 240 156 240 q 297 203 261 240 q 332 111 332 167 q 297 20 332 57 q 208 -17 261 -17 z \"},\",\":{\"ha\":417,\"x_min\":64,\"x_max\":356,\"o\":\"m 106 -269 l 64 -161 q 182 -89 142 -133 q 221 8 222 -44 l 210 8 q 124 38 161 8 q 86 124 86 68 q 124 208 86 176 q 214 240 161 240 q 319 190 283 240 q 356 47 356 139 q 292 -151 356 -68 q 106 -269 228 -233 z \"},\":\":{\"ha\":417,\"x_min\":85,\"x_max\":332,\"o\":\"m 208 433 q 120 470 156 433 q 85 561 85 507 q 120 653 85 617 q 208 690 156 690 q 297 653 261 690 q 332 561 332 617 q 297 470 332 507 q 208 433 261 433 m 208 -17 q 120 20 156 -17 q 85 111 85 57 q 120 203 85 167 q 208 240 156 240 q 297 203 261 240 q 332 111 332 167 q 297 20 332 57 q 208 -17 261 -17 z \"},\";\":{\"ha\":417,\"x_min\":64,\"x_max\":356,\"o\":\"m 208 433 q 120 470 156 433 q 85 561 85 507 q 120 653 85 617 q 208 690 156 690 q 297 653 261 690 q 332 561 332 617 q 297 470 332 507 q 208 433 261 433 m 106 -269 l 64 -161 q 182 -89 142 -133 q 221 8 222 -44 l 210 8 q 124 38 161 8 q 86 124 86 68 q 124 208 86 176 q 214 240 161 240 q 319 190 283 240 q 356 47 356 139 q 292 -151 356 -68 q 106 -269 228 -233 z \"},\"…\":{\"ha\":1357,\"x_min\":106,\"x_max\":1272,\"o\":\"m 229 -17 q 141 20 176 -17 q 106 111 106 57 q 141 203 106 167 q 229 240 176 240 q 317 203 282 240 q 353 111 353 167 q 317 20 353 57 q 229 -17 282 -17 m 689 -17 q 601 20 636 -17 q 565 111 565 57 q 601 203 565 167 q 689 240 636 240 q 777 203 742 240 q 813 111 813 167 q 777 20 813 57 q 689 -17 742 -17 m 1149 -17 q 1060 20 1096 -17 q 1025 111 1025 57 q 1060 203 1025 167 q 1149 240 1096 240 q 1237 203 1201 240 q 1272 111 1272 167 q 1237 20 1272 57 q 1149 -17 1201 -17 z \"},\"!\":{\"ha\":472,\"x_min\":113,\"x_max\":360,\"o\":\"m 169 321 l 140 746 l 133 931 l 339 931 l 332 746 l 303 321 l 169 321 m 236 -17 q 148 20 183 -17 q 113 111 113 57 q 148 203 113 167 q 236 240 183 240 q 324 203 289 240 q 360 111 360 167 q 324 20 360 57 q 236 -17 289 -17 z \"},\"¡\":{\"ha\":472,\"x_min\":113,\"x_max\":360,\"o\":\"m 133 -242 l 140 -57 l 169 368 l 303 368 l 332 -57 l 339 -242 l 133 -242 m 236 449 q 148 485 183 449 q 113 578 113 522 q 148 669 113 632 q 236 706 183 706 q 324 669 289 706 q 360 578 360 632 q 324 485 360 522 q 236 449 289 449 z \"},\"?\":{\"ha\":643,\"x_min\":57,\"x_max\":585,\"o\":\"m 214 321 q 217 407 207 368 q 247 479 228 446 q 291 540 267 513 q 338 594 315 568 q 374 644 360 619 q 389 694 389 668 q 363 760 389 738 q 296 782 338 782 q 227 764 257 782 q 169 718 197 746 l 57 821 q 173 913 106 878 q 322 947 240 947 q 426 933 378 947 q 509 890 474 919 q 565 816 544 861 q 585 710 585 771 q 569 633 585 667 q 531 569 554 599 q 483 513 508 540 q 435 457 457 486 q 401 395 414 428 q 393 321 389 363 l 214 321 m 303 -17 q 215 20 250 -17 q 181 111 181 57 q 215 203 181 167 q 303 240 250 240 q 391 203 356 240 q 426 111 426 167 q 391 20 426 57 q 303 -17 356 -17 z \"},\"¿\":{\"ha\":643,\"x_min\":58,\"x_max\":586,\"o\":\"m 322 -258 q 217 -244 265 -258 q 134 -201 169 -231 q 78 -127 99 -172 q 58 -19 58 -82 q 74 58 58 24 q 112 121 89 92 q 160 177 135 150 q 208 233 186 204 q 242 294 229 261 q 251 368 256 326 l 429 368 q 426 282 436 321 q 396 210 415 243 q 352 149 376 176 q 306 95 328 121 q 269 45 283 69 q 254 -6 254 21 q 281 -71 254 -49 q 347 -93 307 -93 q 416 -75 386 -93 q 474 -29 446 -57 l 586 -132 q 470 -224 536 -189 q 322 -258 404 -258 m 340 449 q 252 485 288 449 q 217 578 217 522 q 252 669 217 632 q 340 706 288 706 q 428 669 393 706 q 464 578 464 632 q 428 485 464 522 q 340 449 393 449 z \"},\"'\":{\"ha\":417,\"x_min\":106,\"x_max\":311,\"o\":\"m 153 492 l 113 768 l 106 953 l 311 953 l 304 768 l 264 492 l 153 492 z \"},\"\\\"\":{\"ha\":744,\"x_min\":106,\"x_max\":639,\"o\":\"m 153 492 l 113 768 l 106 953 l 311 953 l 304 768 l 264 492 l 153 492 m 481 492 l 440 768 l 433 953 l 639 953 l 632 768 l 592 492 l 481 492 z \"},\"‘\":{\"ha\":417,\"x_min\":76,\"x_max\":318,\"o\":\"m 207 469 q 109 517 142 469 q 76 651 76 565 q 125 825 76 750 q 274 949 174 900 l 318 860 q 224 787 256 828 q 193 683 193 746 q 207 685 197 685 q 283 658 251 685 q 314 583 314 631 q 283 500 314 531 q 207 469 253 469 z \"},\"’\":{\"ha\":417,\"x_min\":99,\"x_max\":342,\"o\":\"m 143 489 l 99 578 q 192 651 161 610 q 224 754 224 692 q 211 753 219 753 q 135 780 167 753 q 104 854 104 807 q 134 938 104 907 q 211 968 164 968 q 308 921 275 968 q 342 786 342 874 q 292 613 342 688 q 143 489 243 538 z \"},\"“\":{\"ha\":744,\"x_min\":76,\"x_max\":646,\"o\":\"m 207 469 q 109 517 142 469 q 76 651 76 565 q 125 825 76 750 q 274 949 174 900 l 318 860 q 224 787 256 828 q 193 683 193 746 q 207 685 197 685 q 283 658 251 685 q 314 583 314 631 q 283 500 314 531 q 207 469 253 469 m 535 469 q 437 517 469 469 q 404 651 404 565 q 453 825 404 750 q 601 949 501 900 l 646 860 q 552 787 583 828 q 521 683 521 746 q 535 685 525 685 q 610 658 579 685 q 642 583 642 631 q 611 500 642 531 q 535 469 581 469 z \"},\"”\":{\"ha\":744,\"x_min\":99,\"x_max\":669,\"o\":\"m 143 489 l 99 578 q 192 651 161 610 q 224 754 224 692 q 211 753 219 753 q 135 780 167 753 q 104 854 104 807 q 134 938 104 907 q 211 968 164 968 q 308 921 275 968 q 342 786 342 874 q 292 613 342 688 q 143 489 243 538 m 471 489 l 426 578 q 520 651 489 610 q 551 754 551 692 q 539 753 547 753 q 463 780 494 753 q 432 854 432 807 q 462 938 432 907 q 539 968 492 968 q 636 921 603 968 q 669 786 669 874 q 620 613 669 688 q 471 489 571 538 z \"},\"‚\":{\"ha\":417,\"x_min\":99,\"x_max\":342,\"o\":\"m 143 -233 l 99 -144 q 192 -72 161 -112 q 224 32 224 -31 q 211 31 219 31 q 135 58 167 31 q 104 132 104 85 q 134 215 104 185 q 211 246 164 246 q 308 199 275 246 q 342 64 342 151 q 292 -110 342 -35 q 143 -233 243 -185 z \"},\"„\":{\"ha\":744,\"x_min\":99,\"x_max\":669,\"o\":\"m 143 -233 l 99 -144 q 192 -72 161 -112 q 224 32 224 -31 q 211 31 219 31 q 135 58 167 31 q 104 132 104 85 q 134 215 104 185 q 211 246 164 246 q 308 199 275 246 q 342 64 342 151 q 292 -110 342 -35 q 143 -233 243 -185 m 471 -233 l 426 -144 q 520 -72 489 -112 q 551 32 551 -31 q 539 31 547 31 q 463 58 494 31 q 432 132 432 85 q 462 215 432 185 q 539 246 492 246 q 636 199 603 246 q 669 64 669 151 q 620 -110 669 -35 q 471 -233 571 -185 z \"},\"‹\":{\"ha\":406,\"x_min\":68,\"x_max\":331,\"o\":\"m 254 78 l 68 278 l 68 422 l 254 622 l 331 561 l 176 350 l 331 139 l 254 78 z \"},\"›\":{\"ha\":406,\"x_min\":75,\"x_max\":338,\"o\":\"m 151 78 l 75 139 l 229 350 l 75 561 l 151 622 l 338 422 l 338 278 l 151 78 z \"},\"«\":{\"ha\":667,\"x_min\":68,\"x_max\":592,\"o\":\"m 254 78 l 68 278 l 68 422 l 254 622 l 331 561 l 176 350 l 331 139 l 254 78 m 515 78 l 329 278 l 329 422 l 515 622 l 592 561 l 438 350 l 592 139 l 515 78 z \"},\"»\":{\"ha\":667,\"x_min\":75,\"x_max\":599,\"o\":\"m 151 78 l 75 139 l 229 350 l 75 561 l 151 622 l 338 422 l 338 278 l 151 78 m 413 78 l 336 139 l 490 350 l 336 561 l 413 622 l 599 422 l 599 278 l 413 78 z \"},\"-\":{\"ha\":461,\"x_min\":60,\"x_max\":401,\"o\":\"m 60 279 l 60 424 l 401 424 l 401 279 l 60 279 z \"},\"­\":{\"ha\":461,\"x_min\":60,\"x_max\":401,\"o\":\"m 60 279 l 60 424 l 401 424 l 401 279 l 60 279 z \"},\"–\":{\"ha\":667,\"x_min\":60,\"x_max\":607,\"o\":\"m 60 286 l 60 417 l 607 417 l 607 286 l 60 286 z \"},\"—\":{\"ha\":1111,\"x_min\":60,\"x_max\":1051,\"o\":\"m 60 286 l 60 417 l 1051 417 l 1051 286 l 60 286 z \"},\"⸺\":{\"ha\":2083,\"x_min\":60,\"x_max\":2024,\"o\":\"m 60 286 l 60 417 l 2024 417 l 2024 286 l 60 286 z \"},\"⸻\":{\"ha\":3056,\"x_min\":60,\"x_max\":2996,\"o\":\"m 2996 417 l 2996 286 l 60 286 l 60 417 l 2996 417 z \"},\"‒\":{\"ha\":733,\"x_min\":60,\"x_max\":674,\"o\":\"m 60 286 l 60 417 l 674 417 l 674 286 l 60 286 z \"},\"―\":{\"ha\":1111,\"x_min\":60,\"x_max\":1051,\"o\":\"m 60 286 l 60 417 l 1051 417 l 1051 286 l 60 286 z \"},\"·\":{\"ha\":417,\"x_min\":85,\"x_max\":332,\"o\":\"m 208 317 q 120 353 156 317 q 85 444 85 390 q 120 537 85 500 q 208 574 156 574 q 297 537 261 574 q 332 444 332 500 q 297 353 332 390 q 208 317 261 317 z \"},\"•\":{\"ha\":479,\"x_min\":56,\"x_max\":424,\"o\":\"m 239 171 q 167 185 200 171 q 108 226 133 200 q 69 288 83 253 q 56 364 56 322 q 69 441 56 406 q 108 502 83 476 q 167 542 133 528 q 239 557 200 557 q 312 542 278 557 q 371 502 346 528 q 410 441 396 476 q 424 364 424 406 q 410 288 424 322 q 371 226 396 253 q 312 185 346 200 q 239 171 278 171 z \"},\"_\":{\"ha\":694,\"x_min\":17,\"x_max\":678,\"o\":\"m 17 -194 l 17 -79 l 678 -79 l 678 -194 l 17 -194 z \"},\"‾\":{\"ha\":694,\"x_min\":17,\"x_max\":678,\"o\":\"m 17 785 l 17 900 l 678 900 l 678 785 l 17 785 z \"},\"‿\":{\"ha\":0,\"x_min\":-635,\"x_max\":635,\"o\":\"m 0 -321 q -330 -278 -168 -321 q -635 -149 -492 -236 l -582 -56 q -439 -119 -514 -93 q -288 -161 -364 -146 q -139 -183 -212 -176 q 0 -190 -65 -190 q 139 -183 65 -190 q 288 -161 213 -176 q 439 -119 364 -146 q 582 -56 514 -93 l 635 -149 q 330 -278 492 -236 q 0 -321 168 -321 z \"},\"(\":{\"ha\":478,\"x_min\":100,\"x_max\":411,\"o\":\"m 283 -249 q 148 49 196 -106 q 100 386 100 203 q 148 724 100 569 q 283 1021 196 878 l 411 968 q 300 683 335 832 q 265 386 265 535 q 300 89 265 238 q 411 -196 335 -60 l 283 -249 z \"},\")\":{\"ha\":478,\"x_min\":67,\"x_max\":378,\"o\":\"m 194 -249 l 67 -196 q 179 89 144 -60 q 214 386 214 238 q 179 683 214 535 q 67 968 144 832 l 194 1021 q 330 724 282 878 q 378 386 378 569 q 330 49 378 203 q 194 -249 282 -106 z \"},\"[\":{\"ha\":478,\"x_min\":121,\"x_max\":414,\"o\":\"m 121 -211 l 121 983 l 414 983 l 414 875 l 274 875 l 274 -103 l 414 -103 l 414 -211 l 121 -211 z \"},\"]\":{\"ha\":478,\"x_min\":64,\"x_max\":357,\"o\":\"m 64 -211 l 64 -103 l 206 -103 l 206 875 l 64 875 l 64 983 l 357 983 l 357 -211 l 64 -211 z \"},\"{\":{\"ha\":478,\"x_min\":43,\"x_max\":414,\"o\":\"m 326 -211 q 192 -169 235 -211 q 149 -14 149 -126 q 151 53 149 24 q 156 109 153 82 q 160 163 158 136 q 163 224 163 190 q 156 260 163 242 q 136 292 150 278 q 99 316 122 307 q 43 326 76 325 l 43 446 q 99 456 76 447 q 136 480 122 465 q 156 513 150 494 q 163 549 163 531 q 160 609 163 582 q 156 663 158 636 q 151 719 153 690 q 149 786 149 749 q 192 941 149 899 q 326 983 235 983 l 414 983 l 414 875 l 388 875 q 329 855 344 875 q 314 778 314 835 q 317 668 314 721 q 319 551 319 615 q 294 437 319 472 q 217 389 269 401 l 217 383 q 294 335 269 371 q 319 221 319 300 q 317 104 319 157 q 314 -6 314 51 q 329 -83 314 -62 q 388 -103 344 -103 l 414 -103 l 414 -211 l 326 -211 z \"},\"}\":{\"ha\":478,\"x_min\":64,\"x_max\":435,\"o\":\"m 64 -211 l 64 -103 l 90 -103 q 149 -83 133 -103 q 164 -6 164 -62 q 161 104 164 51 q 158 221 158 157 q 183 335 158 300 q 261 383 208 371 l 261 389 q 183 437 208 401 q 158 551 158 472 q 161 668 158 615 q 164 778 164 721 q 149 855 164 835 q 90 875 133 875 l 64 875 l 64 983 l 151 983 q 286 941 243 983 q 329 786 329 899 q 327 719 329 749 q 322 663 325 690 q 317 609 319 636 q 315 549 315 582 q 322 513 315 531 q 342 480 328 494 q 378 456 356 465 q 435 446 401 447 l 435 326 q 378 316 401 325 q 342 292 356 307 q 322 260 328 278 q 315 224 315 242 q 317 163 315 190 q 322 109 319 136 q 327 53 325 82 q 329 -14 329 24 q 286 -169 329 -126 q 151 -211 243 -211 l 64 -211 z \"},\"/\":{\"ha\":471,\"x_min\":18,\"x_max\":431,\"o\":\"m 18 -222 l 297 986 l 431 986 l 151 -222 l 18 -222 z \"},\"|\":{\"ha\":372,\"x_min\":119,\"x_max\":253,\"o\":\"m 119 -347 l 119 1042 l 253 1042 l 253 -347 l 119 -347 z \"},\"\\\\\":{\"ha\":471,\"x_min\":39,\"x_max\":453,\"o\":\"m 319 -222 l 39 986 l 172 986 l 453 -222 l 319 -222 z \"},\"¦\":{\"ha\":372,\"x_min\":119,\"x_max\":253,\"o\":\"m 119 433 l 119 1042 l 253 1042 l 253 433 l 119 433 m 119 -347 l 119 283 l 253 283 l 253 -347 l 119 -347 z \"},\"*\":{\"ha\":635,\"x_min\":53,\"x_max\":582,\"o\":\"m 206 485 l 121 546 l 203 690 l 53 758 l 85 858 l 246 825 l 264 989 l 371 989 l 389 824 l 549 858 l 582 758 l 432 690 l 514 546 l 429 485 l 318 608 l 206 485 z \"},\"†\":{\"ha\":708,\"x_min\":61,\"x_max\":647,\"o\":\"m 272 -111 l 285 608 l 61 597 l 61 761 l 285 749 l 272 989 l 436 989 l 424 749 l 647 761 l 647 597 l 424 608 l 436 -111 l 272 -111 z \"},\"‡\":{\"ha\":708,\"x_min\":61,\"x_max\":647,\"o\":\"m 272 -111 l 285 129 l 61 117 l 61 281 l 285 264 l 272 439 l 285 614 l 61 597 l 61 761 l 285 749 l 272 989 l 436 989 l 424 749 l 647 761 l 647 597 l 424 614 l 436 439 l 424 264 l 647 281 l 647 117 l 424 129 l 436 -111 l 272 -111 z \"},\"§\":{\"ha\":733,\"x_min\":51,\"x_max\":682,\"o\":\"m 224 468 q 246 412 224 435 q 303 370 268 389 q 380 334 338 351 q 463 296 422 317 q 510 378 510 325 q 488 434 510 411 q 431 476 465 457 q 355 511 397 494 q 272 549 313 528 q 224 468 224 517 m 333 -117 q 184 -88 257 -117 q 64 0 111 -60 l 182 104 q 333 33 250 33 q 397 50 376 33 q 417 93 417 67 q 390 139 417 119 q 322 176 363 158 q 234 215 282 194 q 146 267 186 236 q 78 343 106 299 q 51 453 51 388 q 81 552 51 506 q 163 631 111 599 q 133 681 143 653 q 122 746 122 710 q 187 899 122 840 q 369 958 251 958 q 513 930 450 958 q 619 868 576 901 l 526 740 q 456 788 494 768 q 381 807 417 807 q 306 753 306 807 q 333 709 306 728 q 403 672 361 690 q 494 631 444 653 q 585 577 543 608 q 654 501 626 546 q 682 394 682 457 q 652 288 682 333 q 568 210 622 243 q 592 161 583 188 q 600 103 600 135 q 583 15 600 56 q 532 -54 565 -25 q 449 -100 499 -83 q 333 -117 399 -117 z \"},\"¶\":{\"ha\":883,\"x_min\":54,\"x_max\":750,\"o\":\"m 546 -111 l 546 906 l 750 906 l 750 -111 l 546 -111 m 413 274 q 274 294 339 274 q 160 355 208 314 q 83 456 111 396 q 54 596 54 517 q 82 742 54 683 q 158 838 110 801 q 270 890 206 875 q 407 906 335 906 l 468 906 l 468 274 l 413 274 z \"},\"‖\":{\"ha\":628,\"x_min\":119,\"x_max\":508,\"o\":\"m 119 -347 l 119 1042 l 253 1042 l 253 -347 l 119 -347 m 375 -347 l 375 1042 l 508 1042 l 508 -347 l 375 -347 z \"},\"‼\":{\"ha\":853,\"x_min\":113,\"x_max\":740,\"o\":\"m 169 321 l 140 746 l 133 931 l 339 931 l 332 746 l 303 321 l 169 321 m 236 -17 q 148 20 183 -17 q 113 111 113 57 q 148 203 113 167 q 236 240 183 240 q 324 203 289 240 q 360 111 360 167 q 324 20 360 57 q 236 -17 289 -17 m 550 321 l 521 746 l 514 931 l 719 931 l 713 746 l 683 321 l 550 321 m 617 -17 q 528 20 564 -17 q 493 111 493 57 q 528 203 493 167 q 617 240 564 240 q 705 203 669 240 q 740 111 740 167 q 705 20 740 57 q 617 -17 669 -17 z \"},\"⁇\":{\"ha\":1213,\"x_min\":57,\"x_max\":1154,\"o\":\"m 214 321 q 217 407 207 368 q 247 479 228 446 q 291 540 267 513 q 338 594 315 568 q 374 644 360 619 q 389 694 389 668 q 363 760 389 738 q 296 782 338 782 q 227 764 257 782 q 169 718 197 746 l 57 821 q 173 913 106 878 q 322 947 240 947 q 426 933 378 947 q 509 890 474 919 q 565 816 544 861 q 585 710 585 771 q 569 633 585 667 q 531 569 554 599 q 483 513 508 540 q 435 457 457 486 q 401 395 414 428 q 393 321 389 363 l 214 321 m 303 -17 q 215 20 250 -17 q 181 111 181 57 q 215 203 181 167 q 303 240 250 240 q 391 203 356 240 q 426 111 426 167 q 391 20 426 57 q 303 -17 356 -17 m 783 321 q 787 407 776 368 q 817 479 797 446 q 860 540 836 513 q 907 594 885 568 q 944 644 929 619 q 958 694 958 668 q 933 760 958 738 q 865 782 907 782 q 797 764 826 782 q 739 718 767 746 l 626 821 q 742 913 675 878 q 892 947 810 947 q 995 933 947 947 q 1078 890 1043 919 q 1134 816 1114 861 q 1154 710 1154 771 q 1139 633 1154 667 q 1101 569 1124 599 q 1052 513 1078 540 q 1005 457 1026 486 q 971 395 983 428 q 963 321 958 363 l 783 321 m 872 -17 q 785 20 819 -17 q 750 111 750 57 q 785 203 750 167 q 872 240 819 240 q 960 203 925 240 q 996 111 996 167 q 960 20 996 57 q 872 -17 925 -17 z \"},\"⁉\":{\"ha\":1042,\"x_min\":113,\"x_max\":983,\"o\":\"m 169 321 l 140 746 l 133 931 l 339 931 l 332 746 l 303 321 l 169 321 m 236 -17 q 148 20 183 -17 q 113 111 113 57 q 148 203 113 167 q 236 240 183 240 q 324 203 289 240 q 360 111 360 167 q 324 20 360 57 q 236 -17 289 -17 m 613 321 q 616 407 606 368 q 646 479 626 446 q 690 540 665 513 q 736 594 714 568 q 773 644 758 619 q 788 694 788 668 q 762 760 788 738 q 694 782 736 782 q 626 764 656 782 q 568 718 596 746 l 456 821 q 572 913 504 878 q 721 947 639 947 q 824 933 776 947 q 908 890 872 919 q 963 816 943 861 q 983 710 983 771 q 968 633 983 667 q 930 569 953 599 q 881 513 907 540 q 834 457 856 486 q 800 395 813 428 q 792 321 788 363 l 613 321 m 701 -17 q 614 20 649 -17 q 579 111 579 57 q 614 203 579 167 q 701 240 649 240 q 790 203 754 240 q 825 111 825 167 q 790 20 825 57 q 701 -17 754 -17 z \"},\"⁈\":{\"ha\":1042,\"x_min\":57,\"x_max\":929,\"o\":\"m 214 321 q 217 407 207 368 q 247 479 228 446 q 291 540 267 513 q 338 594 315 568 q 374 644 360 619 q 389 694 389 668 q 363 760 389 738 q 296 782 338 782 q 227 764 257 782 q 169 718 197 746 l 57 821 q 173 913 106 878 q 322 947 240 947 q 426 933 378 947 q 509 890 474 919 q 565 816 544 861 q 585 710 585 771 q 569 633 585 667 q 531 569 554 599 q 483 513 508 540 q 435 457 457 486 q 401 395 414 428 q 393 321 389 363 l 214 321 m 303 -17 q 215 20 250 -17 q 181 111 181 57 q 215 203 181 167 q 303 240 250 240 q 391 203 356 240 q 426 111 426 167 q 391 20 426 57 q 303 -17 356 -17 m 739 321 l 710 746 l 703 931 l 908 931 l 901 746 l 872 321 l 739 321 m 806 -17 q 717 20 753 -17 q 682 111 682 57 q 717 203 682 167 q 806 240 753 240 q 894 203 858 240 q 929 111 929 167 q 894 20 929 57 q 806 -17 858 -17 z \"},\"‽\":{\"ha\":667,\"x_min\":22,\"x_max\":608,\"o\":\"m 239 321 l 214 557 l 199 707 l 363 707 l 363 614 l 354 515 q 401 588 379 551 q 424 679 424 625 q 387 764 424 733 q 296 794 350 794 q 210 775 247 794 q 135 707 174 756 l 22 810 q 156 915 81 883 q 310 947 231 947 q 428 931 374 947 q 523 885 483 915 q 585 813 563 856 q 608 717 608 771 q 590 617 608 660 q 545 542 572 575 q 488 481 518 508 q 432 428 457 454 q 392 377 407 403 q 381 321 376 351 l 239 321 m 303 -17 q 215 20 250 -17 q 181 111 181 57 q 215 203 181 167 q 303 240 250 240 q 391 203 356 240 q 426 111 426 167 q 391 20 426 57 q 303 -17 356 -17 z \"},\"⌜\":{\"ha\":478,\"x_min\":121,\"x_max\":414,\"o\":\"m 121 0 l 121 960 l 414 960 l 414 851 l 274 851 l 274 0 l 121 0 z \"},\"⌝\":{\"ha\":478,\"x_min\":64,\"x_max\":357,\"o\":\"m 206 0 l 206 851 l 64 851 l 64 960 l 357 960 l 357 0 l 206 0 z \"},\"⌞\":{\"ha\":478,\"x_min\":121,\"x_max\":414,\"o\":\"m 121 -78 l 121 882 l 274 882 l 274 31 l 414 31 l 414 -78 l 121 -78 z \"},\"⌟\":{\"ha\":478,\"x_min\":64,\"x_max\":357,\"o\":\"m 64 -78 l 64 31 l 206 31 l 206 882 l 357 882 l 357 -78 l 64 -78 z \"},\"⟦\":{\"ha\":607,\"x_min\":121,\"x_max\":543,\"o\":\"m 121 -211 l 121 983 l 543 983 l 543 875 l 414 875 l 414 -103 l 543 -103 l 543 -211 l 121 -211 m 239 -103 l 308 -103 l 308 875 l 239 875 l 239 -103 z \"},\"⟧\":{\"ha\":607,\"x_min\":64,\"x_max\":486,\"o\":\"m 64 -211 l 64 -103 l 193 -103 l 193 875 l 64 875 l 64 983 l 486 983 l 486 -211 l 64 -211 m 299 -103 l 368 -103 l 368 875 l 299 875 l 299 -103 z \"},\"⸢\":{\"ha\":478,\"x_min\":121,\"x_max\":414,\"o\":\"m 121 386 l 121 983 l 414 983 l 414 875 l 274 875 l 274 386 l 121 386 z \"},\"⸣\":{\"ha\":478,\"x_min\":64,\"x_max\":357,\"o\":\"m 206 386 l 206 875 l 64 875 l 64 983 l 357 983 l 357 386 l 206 386 z \"},\"⸤\":{\"ha\":478,\"x_min\":121,\"x_max\":414,\"o\":\"m 121 -211 l 121 386 l 274 386 l 274 -103 l 414 -103 l 414 -211 l 121 -211 z \"},\"⸥\":{\"ha\":478,\"x_min\":64,\"x_max\":357,\"o\":\"m 64 -211 l 64 -103 l 206 -103 l 206 386 l 357 386 l 357 -211 l 64 -211 z \"},\"©\":{\"ha\":1042,\"x_min\":63,\"x_max\":978,\"o\":\"m 521 -12 q 346 19 429 -12 q 199 112 263 51 q 99 258 136 172 q 63 451 63 343 q 99 644 63 560 q 199 788 136 729 q 346 878 263 847 q 521 910 429 910 q 696 878 613 910 q 842 788 779 847 q 941 644 904 729 q 978 451 978 558 q 941 258 978 343 q 842 112 904 172 q 696 19 779 51 q 521 -12 613 -12 m 521 72 q 664 99 597 72 q 779 176 731 126 q 856 296 828 226 q 885 451 885 365 q 856 606 885 536 q 779 724 828 675 q 664 800 731 774 q 521 826 597 826 q 378 800 444 826 q 263 724 311 774 q 185 606 214 675 q 157 451 157 536 q 185 296 157 365 q 263 176 214 226 q 378 99 311 126 q 521 72 444 72 m 538 176 q 430 196 479 176 q 345 251 381 215 q 290 337 310 286 q 269 450 269 388 q 292 560 269 511 q 351 644 314 610 q 436 698 388 679 q 538 717 485 717 q 644 692 601 717 q 721 635 688 668 l 644 550 q 600 585 622 574 q 550 597 578 597 q 449 555 483 597 q 415 450 415 513 q 450 338 415 379 q 543 296 485 296 q 603 309 578 296 q 654 343 628 322 l 721 249 q 636 197 681 217 q 538 176 592 176 z \"},\"℗\":{\"ha\":1042,\"x_min\":63,\"x_max\":978,\"o\":\"m 521 -12 q 346 19 429 -12 q 199 112 263 51 q 99 258 136 172 q 63 451 63 343 q 99 644 63 560 q 199 788 136 729 q 346 878 263 847 q 521 910 429 910 q 696 878 613 910 q 842 788 779 847 q 941 644 904 729 q 978 451 978 558 q 941 258 978 343 q 842 112 904 172 q 696 19 779 51 q 521 -12 613 -12 m 521 72 q 664 99 597 72 q 779 176 731 126 q 856 296 828 226 q 885 451 885 365 q 856 606 885 536 q 779 724 828 675 q 664 800 731 774 q 521 826 597 826 q 378 800 444 826 q 263 724 311 774 q 185 606 214 675 q 157 451 157 536 q 185 296 157 365 q 263 176 214 226 q 378 99 311 126 q 521 72 444 72 m 332 193 l 332 700 l 533 700 q 627 690 583 700 q 703 660 671 681 q 753 604 735 639 q 772 519 772 569 q 753 431 772 468 q 701 368 733 393 q 625 331 668 343 q 533 319 582 319 l 479 319 l 479 193 l 332 193 m 479 425 l 522 425 q 628 514 628 425 q 601 572 628 554 q 522 590 574 590 l 479 590 l 479 425 z \"},\"®\":{\"ha\":642,\"x_min\":44,\"x_max\":596,\"o\":\"m 321 432 q 213 453 264 432 q 125 511 163 474 q 66 600 88 549 q 44 713 44 651 q 66 825 44 774 q 125 914 88 876 q 213 972 163 951 q 321 993 264 993 q 428 972 378 993 q 515 914 478 951 q 574 825 553 876 q 596 713 596 774 q 574 600 596 651 q 515 511 553 549 q 428 453 478 474 q 321 432 378 432 m 321 500 q 464 558 408 500 q 519 713 519 615 q 464 867 519 810 q 321 925 408 925 q 240 910 276 925 q 177 867 204 894 q 135 800 150 839 q 121 713 121 761 q 135 625 121 664 q 177 558 150 586 q 240 515 204 531 q 321 500 276 500 m 208 578 l 208 851 l 332 851 q 413 829 381 851 q 444 760 444 807 q 396 685 444 708 l 453 578 l 369 578 l 328 661 l 288 661 l 288 578 l 208 578 m 288 717 l 317 717 q 348 728 338 717 q 358 756 358 740 q 348 781 358 771 q 317 792 338 792 l 288 792 l 288 717 z \"},\"™\":{\"ha\":947,\"x_min\":6,\"x_max\":915,\"o\":\"m 126 503 l 126 818 l 6 818 l 6 939 l 379 939 l 379 818 l 258 818 l 258 503 l 126 503 m 439 503 l 439 939 l 589 939 l 643 801 l 674 710 l 679 710 l 711 801 l 764 939 l 915 939 l 915 503 l 793 503 l 793 636 l 808 796 l 803 796 l 724 567 l 629 567 l 551 796 l 546 796 l 561 636 l 561 503 l 439 503 z \"},\"℠\":{\"ha\":947,\"x_min\":25,\"x_max\":915,\"o\":\"m 194 486 q 25 554 101 486 l 93 638 q 146 601 117 615 q 204 586 175 586 q 244 615 244 586 q 231 640 244 632 q 193 660 217 649 l 133 686 q 72 733 97 703 q 47 815 47 763 q 92 913 47 872 q 214 954 136 954 q 297 938 258 954 q 365 899 335 922 l 303 814 q 256 841 281 829 q 207 853 231 853 q 176 844 185 853 q 167 822 167 835 q 180 801 167 808 q 218 782 193 793 l 276 757 q 343 711 319 740 q 367 629 367 682 q 355 576 367 601 q 320 530 343 550 q 265 498 297 510 q 194 486 233 486 m 439 503 l 439 939 l 589 939 l 643 801 l 674 710 l 679 710 l 711 801 l 764 939 l 915 939 l 915 503 l 793 503 l 793 636 l 808 796 l 803 796 l 724 567 l 629 567 l 551 796 l 546 796 l 561 636 l 561 503 l 439 503 z \"},\"@\":{\"ha\":1254,\"x_min\":68,\"x_max\":1186,\"o\":\"m 594 -239 q 395 -207 490 -239 q 227 -110 300 -175 q 111 53 154 -44 q 68 285 68 151 q 118 549 68 431 q 253 753 168 668 q 453 883 339 838 q 694 929 567 929 q 898 893 807 929 q 1053 791 989 857 q 1151 634 1117 725 q 1186 435 1186 543 q 1157 267 1186 339 q 1082 148 1128 196 q 980 76 1036 100 q 869 53 924 53 q 765 81 810 53 q 710 158 721 108 l 707 158 q 631 92 678 118 q 540 67 583 67 q 407 123 457 67 q 357 275 357 179 q 378 400 357 339 q 438 509 400 461 q 526 586 475 557 q 638 615 578 615 q 699 599 672 615 q 743 546 725 583 l 746 546 l 765 604 l 892 604 l 828 299 q 892 179 799 179 q 952 197 922 179 q 1006 247 982 214 q 1043 326 1029 279 q 1057 429 1057 372 q 1036 572 1057 504 q 969 692 1015 640 q 851 775 924 744 q 678 806 779 806 q 504 769 589 806 q 353 665 419 732 q 246 502 286 597 q 206 290 206 407 q 238 111 206 188 q 327 -15 271 35 q 456 -90 383 -65 q 611 -115 529 -115 q 722 -100 665 -115 q 822 -61 778 -85 l 867 -172 q 736 -223 803 -207 q 594 -239 669 -239 m 583 194 q 627 208 606 194 q 675 257 649 222 l 708 444 q 644 485 688 485 q 588 465 613 485 q 547 417 564 446 q 520 353 529 388 q 511 288 511 318 q 583 194 511 194 z \"},\"#\":{\"ha\":733,\"x_min\":47,\"x_max\":692,\"o\":\"m 119 0 l 150 260 l 47 260 l 47 390 l 165 390 l 185 543 l 75 543 l 75 674 l 201 674 l 231 903 l 347 903 l 319 674 l 464 674 l 493 903 l 610 903 l 582 674 l 692 674 l 692 543 l 565 543 l 547 390 l 664 390 l 664 260 l 532 260 l 500 0 l 382 0 l 413 260 l 269 260 l 238 0 l 119 0 m 285 390 l 428 390 l 447 543 l 303 543 l 285 390 z \"},\"⁰\":{\"ha\":522,\"x_min\":36,\"x_max\":488,\"o\":\"m 261 504 q 171 524 213 504 q 99 581 129 543 q 53 672 69 618 q 36 793 36 725 q 53 914 36 861 q 99 1003 69 967 q 171 1060 129 1040 q 261 1079 213 1079 q 351 1060 310 1079 q 423 1003 393 1040 q 470 914 453 967 q 488 793 488 861 q 470 672 488 725 q 423 581 453 618 q 351 524 393 543 q 261 504 310 504 m 261 618 q 320 657 296 618 q 344 793 344 696 q 320 928 344 890 q 261 965 296 965 q 202 928 226 965 q 178 793 178 890 q 202 657 178 696 q 261 618 226 618 z \"},\"¹\":{\"ha\":522,\"x_min\":106,\"x_max\":381,\"o\":\"m 229 521 l 229 911 l 106 911 l 106 1003 q 155 1013 133 1007 q 194 1025 176 1018 q 228 1041 213 1032 q 261 1063 244 1050 l 381 1063 l 381 521 l 229 521 z \"},\"²\":{\"ha\":522,\"x_min\":38,\"x_max\":464,\"o\":\"m 63 521 l 63 601 q 233 753 167 688 q 300 871 300 819 q 279 933 300 911 q 221 956 258 956 q 169 938 193 956 q 122 890 146 921 l 38 968 q 244 1079 121 1079 q 390 1031 335 1079 q 444 896 444 983 q 433 831 444 863 q 401 769 421 800 q 355 708 381 739 q 300 646 329 678 l 464 646 l 464 521 l 63 521 z \"},\"³\":{\"ha\":522,\"x_min\":38,\"x_max\":468,\"o\":\"m 258 504 q 131 533 188 504 q 38 614 74 561 l 128 685 q 243 618 176 618 q 298 635 275 618 q 321 683 321 651 q 192 754 321 754 l 192 840 q 272 856 242 840 q 301 907 301 872 q 283 950 301 935 q 233 965 265 965 q 185 950 207 965 q 144 911 164 935 l 60 986 q 150 1057 104 1035 q 260 1079 196 1079 q 331 1069 297 1079 q 392 1039 365 1058 q 433 991 418 1019 q 449 928 449 963 q 428 855 449 885 q 369 803 407 825 q 440 753 411 786 q 468 672 468 721 q 451 603 468 635 q 405 551 433 572 q 338 517 376 529 q 258 504 300 504 z \"},\"⁴\":{\"ha\":522,\"x_min\":49,\"x_max\":511,\"o\":\"m 297 521 l 297 642 l 49 642 l 49 717 l 244 1063 l 431 1063 l 431 739 l 511 739 l 511 642 l 431 642 l 431 521 l 297 521 m 186 739 l 297 739 l 297 796 l 306 958 l 300 958 l 244 851 l 186 739 z \"},\"⁵\":{\"ha\":522,\"x_min\":38,\"x_max\":469,\"o\":\"m 260 504 q 130 533 186 504 q 38 614 74 561 l 128 685 q 181 634 154 650 q 243 618 207 618 q 300 642 278 618 q 322 700 322 667 q 298 760 322 740 q 240 781 274 781 q 198 773 217 781 q 160 749 179 765 l 96 793 l 119 1063 l 447 1063 l 447 936 l 238 936 l 229 861 q 265 867 247 865 q 293 869 282 869 q 361 858 329 869 q 417 823 393 846 q 456 767 442 800 q 469 693 469 735 q 454 618 469 653 q 410 558 439 583 q 344 519 382 533 q 260 504 306 504 z \"},\"⁶\":{\"ha\":522,\"x_min\":50,\"x_max\":472,\"o\":\"m 281 504 q 110 582 169 504 q 50 789 50 660 q 67 906 50 853 q 116 999 83 960 q 195 1058 149 1038 q 303 1079 242 1079 q 400 1061 361 1079 q 463 1022 439 1043 l 404 929 q 363 955 385 944 q 313 965 340 965 q 224 926 253 965 q 188 819 194 888 q 303 867 238 867 q 427 821 382 867 q 472 696 472 775 q 458 619 472 654 q 417 559 443 585 q 356 519 392 533 q 281 504 321 504 m 274 618 q 319 635 300 618 q 339 692 339 653 q 268 765 339 765 q 188 726 226 765 q 219 643 194 668 q 274 618 244 618 z \"},\"⁷\":{\"ha\":522,\"x_min\":69,\"x_max\":478,\"o\":\"m 163 521 q 177 636 167 583 q 206 738 188 689 q 249 835 224 788 q 311 938 275 883 l 69 938 l 69 1063 l 478 1063 l 478 982 q 403 869 432 924 q 357 761 374 815 q 333 648 340 707 q 321 521 325 589 l 163 521 z \"},\"⁸\":{\"ha\":522,\"x_min\":53,\"x_max\":468,\"o\":\"m 261 504 q 177 517 215 504 q 111 550 139 529 q 68 599 83 571 q 53 658 53 626 q 84 742 53 706 q 153 799 115 778 l 153 804 q 94 859 117 829 q 72 931 72 889 q 87 993 72 965 q 127 1040 101 1021 q 188 1069 153 1058 q 261 1079 222 1079 q 336 1069 301 1079 q 397 1040 371 1058 q 437 993 422 1021 q 451 931 451 965 q 427 861 451 892 q 371 811 403 831 l 371 806 q 440 747 411 783 q 468 660 468 711 q 453 599 468 628 q 410 550 438 571 q 344 517 382 529 q 261 504 307 504 m 283 851 q 318 921 318 885 q 301 962 318 947 q 260 976 285 976 q 220 963 236 976 q 204 926 204 949 q 227 881 204 897 q 283 851 250 865 m 261 604 q 313 624 292 604 q 333 671 333 643 q 305 718 333 703 q 236 753 276 733 q 189 674 189 721 q 209 624 189 644 q 261 604 229 604 z \"},\"⁹\":{\"ha\":522,\"x_min\":49,\"x_max\":472,\"o\":\"m 253 818 q 335 858 301 818 q 303 941 328 917 q 247 965 278 965 q 201 948 221 965 q 182 892 182 931 q 201 837 182 856 q 253 818 219 818 m 219 504 q 122 522 160 504 q 60 561 83 540 l 118 654 q 160 628 138 639 q 210 618 182 618 q 299 657 269 618 q 335 764 328 696 q 218 717 285 717 q 94 763 139 717 q 49 888 49 808 q 63 964 49 929 q 104 1024 78 999 q 166 1065 131 1050 q 242 1079 201 1079 q 340 1059 297 1079 q 413 1001 383 1039 q 457 911 442 964 q 472 794 472 858 q 455 676 472 729 q 406 585 438 624 q 326 525 374 546 q 219 504 279 504 z \"},\"⁽\":{\"ha\":372,\"x_min\":88,\"x_max\":324,\"o\":\"m 214 396 q 160 486 183 442 q 120 578 136 531 q 96 678 104 625 q 88 793 88 731 q 96 908 88 856 q 120 1007 104 960 q 160 1099 136 1054 q 214 1189 183 1143 l 324 1144 q 229 793 229 975 q 253 613 229 699 q 324 440 276 526 l 214 396 z \"},\"⁾\":{\"ha\":372,\"x_min\":49,\"x_max\":285,\"o\":\"m 160 396 l 49 440 q 119 613 96 526 q 143 793 143 699 q 49 1144 143 975 l 160 1189 q 213 1099 189 1143 q 252 1007 236 1054 q 276 908 268 960 q 285 793 285 856 q 276 678 285 731 q 252 578 268 625 q 213 486 236 531 q 160 396 189 442 z \"},\"₀\":{\"ha\":522,\"x_min\":36,\"x_max\":488,\"o\":\"m 261 -274 q 171 -254 213 -274 q 99 -197 129 -235 q 53 -106 69 -160 q 36 15 36 -53 q 53 136 36 83 q 99 226 69 189 q 171 282 129 263 q 261 301 213 301 q 351 282 310 301 q 423 226 393 263 q 470 136 453 189 q 488 15 488 83 q 470 -106 488 -53 q 423 -197 453 -160 q 351 -254 393 -235 q 261 -274 310 -274 m 261 -160 q 320 -121 296 -160 q 344 15 344 -82 q 320 150 344 113 q 261 188 296 188 q 202 150 226 188 q 178 15 178 113 q 202 -121 178 -82 q 261 -160 226 -160 z \"},\"₁\":{\"ha\":522,\"x_min\":106,\"x_max\":381,\"o\":\"m 229 -257 l 229 133 l 106 133 l 106 225 q 155 235 133 229 q 194 247 176 240 q 228 263 213 254 q 261 285 244 272 l 381 285 l 381 -257 l 229 -257 z \"},\"₂\":{\"ha\":522,\"x_min\":38,\"x_max\":464,\"o\":\"m 63 -257 l 63 -176 q 233 -24 167 -90 q 300 93 300 42 q 279 156 300 133 q 221 178 258 178 q 169 160 193 178 q 122 113 146 143 l 38 190 q 244 301 121 301 q 390 253 335 301 q 444 118 444 206 q 433 53 444 85 q 401 -8 421 22 q 355 -69 381 -39 q 300 -132 329 -100 l 464 -132 l 464 -257 l 63 -257 z \"},\"₃\":{\"ha\":522,\"x_min\":38,\"x_max\":468,\"o\":\"m 258 -274 q 131 -245 188 -274 q 38 -164 74 -217 l 128 -93 q 243 -160 176 -160 q 298 -143 275 -160 q 321 -94 321 -126 q 192 -24 321 -24 l 192 63 q 272 78 242 63 q 301 129 301 94 q 283 172 301 157 q 233 188 265 188 q 185 172 207 188 q 144 133 164 157 l 60 208 q 150 279 104 257 q 260 301 196 301 q 331 291 297 301 q 392 261 365 281 q 433 213 418 242 q 449 150 449 185 q 428 77 449 107 q 369 25 407 47 q 440 -24 411 8 q 468 -106 468 -57 q 451 -174 468 -143 q 405 -227 433 -206 q 338 -261 376 -249 q 258 -274 300 -274 z \"},\"₄\":{\"ha\":522,\"x_min\":49,\"x_max\":511,\"o\":\"m 297 -257 l 297 -136 l 49 -136 l 49 -61 l 244 285 l 431 285 l 431 -39 l 511 -39 l 511 -136 l 431 -136 l 431 -257 l 297 -257 m 186 -39 l 297 -39 l 297 18 l 306 181 l 300 181 l 244 74 l 186 -39 z \"},\"₅\":{\"ha\":522,\"x_min\":38,\"x_max\":469,\"o\":\"m 260 -274 q 130 -245 186 -274 q 38 -164 74 -217 l 128 -93 q 181 -144 154 -128 q 243 -160 207 -160 q 300 -135 278 -160 q 322 -78 322 -111 q 298 -17 322 -37 q 240 3 274 3 q 198 -5 217 3 q 160 -29 179 -12 l 96 15 l 119 285 l 447 285 l 447 158 l 238 158 l 229 83 q 265 90 247 88 q 293 92 282 92 q 361 80 329 92 q 417 45 393 68 q 456 -10 442 22 q 469 -85 469 -43 q 454 -160 469 -125 q 410 -219 439 -194 q 344 -259 382 -244 q 260 -274 306 -274 z \"},\"₆\":{\"ha\":522,\"x_min\":50,\"x_max\":472,\"o\":\"m 281 -274 q 110 -196 169 -274 q 50 11 50 -118 q 67 128 50 75 q 116 221 83 182 q 195 281 149 260 q 303 301 242 301 q 400 283 361 301 q 463 244 439 265 l 404 151 q 363 177 385 167 q 313 188 340 188 q 224 149 253 188 q 188 42 194 110 q 303 89 238 89 q 427 43 382 89 q 472 -82 472 -3 q 458 -158 472 -124 q 417 -219 443 -193 q 356 -259 392 -244 q 281 -274 321 -274 m 274 -160 q 319 -142 300 -160 q 339 -86 339 -125 q 268 -12 339 -12 q 188 -51 226 -12 q 219 -135 194 -110 q 274 -160 244 -160 z \"},\"₇\":{\"ha\":522,\"x_min\":69,\"x_max\":478,\"o\":\"m 163 -257 q 177 -142 167 -194 q 206 -40 188 -89 q 249 58 224 10 q 311 160 275 106 l 69 160 l 69 285 l 478 285 l 478 204 q 403 92 432 146 q 357 -17 374 38 q 333 -130 340 -71 q 321 -257 325 -189 l 163 -257 z \"},\"₈\":{\"ha\":522,\"x_min\":53,\"x_max\":468,\"o\":\"m 261 -274 q 177 -261 215 -274 q 111 -228 139 -249 q 68 -179 83 -207 q 53 -119 53 -151 q 84 -36 53 -72 q 153 21 115 0 l 153 26 q 94 81 117 51 q 72 153 72 111 q 87 215 72 188 q 127 262 101 243 q 188 291 153 281 q 261 301 222 301 q 336 291 301 301 q 397 262 371 281 q 437 215 422 243 q 451 153 451 188 q 427 83 451 114 q 371 33 403 53 l 371 28 q 440 -31 411 6 q 468 -118 468 -67 q 453 -178 468 -150 q 410 -228 438 -207 q 344 -261 382 -249 q 261 -274 307 -274 m 283 74 q 318 143 318 107 q 301 184 318 169 q 260 199 285 199 q 220 185 236 199 q 204 149 204 171 q 227 103 204 119 q 283 74 250 88 m 261 -174 q 313 -154 292 -174 q 333 -107 333 -135 q 305 -60 333 -75 q 236 -25 276 -44 q 189 -104 189 -57 q 209 -153 189 -133 q 261 -174 229 -174 z \"},\"₉\":{\"ha\":522,\"x_min\":49,\"x_max\":472,\"o\":\"m 253 40 q 335 81 301 40 q 303 163 328 139 q 247 188 278 188 q 201 170 221 188 q 182 114 182 153 q 201 59 182 78 q 253 40 219 40 m 219 -274 q 122 -256 160 -274 q 60 -217 83 -237 l 118 -124 q 160 -149 138 -139 q 210 -160 182 -160 q 299 -121 269 -160 q 335 -14 328 -82 q 218 -61 285 -61 q 94 -15 139 -61 q 49 110 49 31 q 63 186 49 151 q 104 247 78 221 q 166 287 131 272 q 242 301 201 301 q 340 281 297 301 q 413 224 383 261 q 457 133 442 186 q 472 17 472 81 q 455 -101 472 -49 q 406 -193 438 -154 q 326 -253 374 -232 q 219 -274 279 -274 z \"},\"₍\":{\"ha\":372,\"x_min\":88,\"x_max\":324,\"o\":\"m 214 -382 q 160 -292 183 -336 q 120 -200 136 -247 q 96 -100 104 -153 q 88 15 88 -47 q 96 130 88 78 q 120 229 104 182 q 160 321 136 276 q 214 411 183 365 l 324 367 q 229 15 229 197 q 253 -165 229 -79 q 324 -337 276 -251 l 214 -382 z \"},\"₎\":{\"ha\":372,\"x_min\":49,\"x_max\":285,\"o\":\"m 160 -382 l 49 -337 q 119 -165 96 -251 q 143 15 143 -79 q 49 367 143 197 l 160 411 q 213 321 189 365 q 252 229 236 276 q 276 130 268 182 q 285 15 285 78 q 276 -100 285 -47 q 252 -200 268 -153 q 213 -292 236 -247 q 160 -382 189 -336 z \"},\"ª\":{\"ha\":499,\"x_min\":40,\"x_max\":444,\"o\":\"m 181 510 q 78 551 115 510 q 40 649 40 592 q 101 763 40 722 q 300 815 163 803 q 281 860 297 844 q 232 876 265 876 q 172 865 204 876 q 107 835 140 853 l 56 929 q 152 974 101 957 q 257 990 203 990 q 395 939 346 990 q 444 783 444 888 l 444 521 l 329 521 l 315 568 l 310 568 q 253 526 285 543 q 181 510 221 510 m 229 619 q 266 629 250 619 q 300 656 282 639 l 300 732 q 204 705 231 725 q 178 661 178 685 q 229 619 178 619 z \"},\"º\":{\"ha\":518,\"x_min\":33,\"x_max\":483,\"o\":\"m 258 510 q 174 526 214 510 q 102 573 133 542 q 52 648 71 604 q 33 749 33 692 q 52 850 33 806 q 102 926 71 894 q 174 974 133 957 q 258 990 214 990 q 343 974 303 990 q 415 926 383 957 q 465 850 446 894 q 483 749 483 806 q 465 648 483 692 q 415 573 446 604 q 343 526 383 542 q 258 510 303 510 m 258 624 q 318 658 299 624 q 338 749 338 692 q 318 842 338 807 q 258 876 299 876 q 199 842 218 876 q 181 749 181 807 q 199 658 181 692 q 258 624 218 624 z \"},\"ᵃ\":{\"ha\":499,\"x_min\":40,\"x_max\":444,\"o\":\"m 181 510 q 78 551 115 510 q 40 649 40 592 q 101 763 40 722 q 300 815 163 803 q 281 860 297 844 q 232 876 265 876 q 172 865 204 876 q 107 835 140 853 l 56 929 q 152 974 101 957 q 257 990 203 990 q 395 939 346 990 q 444 783 444 888 l 444 521 l 329 521 l 315 568 l 310 568 q 253 526 285 543 q 181 510 221 510 m 229 619 q 266 629 250 619 q 300 656 282 639 l 300 732 q 204 705 231 725 q 178 661 178 685 q 229 619 178 619 z \"},\"ᵇ\":{\"ha\":535,\"x_min\":58,\"x_max\":499,\"o\":\"m 307 510 q 243 524 275 510 q 186 569 211 539 l 181 569 l 169 521 l 58 521 l 58 1164 l 203 1164 l 203 1007 l 197 938 q 255 976 224 961 q 318 990 286 990 q 450 926 401 990 q 499 758 499 863 q 483 652 499 699 q 440 574 467 606 q 378 526 413 543 q 307 510 344 510 m 272 624 q 328 655 304 624 q 351 756 351 686 q 333 846 351 818 q 276 874 314 874 q 203 835 240 874 l 203 650 q 272 624 238 624 z \"},\"ᶜ\":{\"ha\":435,\"x_min\":33,\"x_max\":417,\"o\":\"m 260 510 q 169 526 211 510 q 97 573 128 542 q 50 649 67 604 q 33 750 33 693 q 52 851 33 806 q 103 926 71 896 q 177 974 135 957 q 267 990 219 990 q 356 975 319 990 q 411 942 393 960 l 344 850 q 314 869 329 863 q 279 876 299 876 q 208 842 236 876 q 181 750 181 807 q 207 658 181 693 q 278 624 233 624 q 325 633 307 624 q 358 656 343 643 l 417 563 q 354 526 393 543 q 260 510 315 510 z \"},\"ᵈ\":{\"ha\":535,\"x_min\":36,\"x_max\":478,\"o\":\"m 226 510 q 88 575 139 510 q 36 758 36 640 q 53 855 36 813 q 97 928 69 897 q 158 974 124 958 q 228 990 193 990 q 292 977 264 990 q 340 942 319 964 l 333 1015 l 333 1164 l 478 1164 l 478 521 l 360 521 l 349 565 l 346 565 q 292 526 322 542 q 226 510 261 510 m 265 624 q 333 664 303 624 l 333 847 q 264 876 299 876 q 208 847 232 876 q 183 758 183 817 q 204 656 183 688 q 265 624 225 624 z \"},\"ᵉ\":{\"ha\":481,\"x_min\":33,\"x_max\":450,\"o\":\"m 268 510 q 176 526 218 510 q 101 574 133 543 q 51 649 69 604 q 33 750 33 693 q 51 849 33 804 q 99 924 69 893 q 169 973 129 956 q 253 990 208 990 q 342 972 304 990 q 403 924 379 954 q 438 853 426 893 q 450 769 450 813 q 449 739 450 750 q 443 713 447 728 l 171 713 q 211 640 179 661 q 288 619 243 619 q 388 647 340 619 l 436 563 q 354 523 399 536 q 268 510 310 510 m 168 794 l 329 794 q 313 854 329 828 q 254 881 296 881 q 199 860 222 881 q 168 794 175 839 z \"},\"ᶠ\":{\"ha\":322,\"x_min\":21,\"x_max\":351,\"o\":\"m 83 521 l 83 868 l 21 868 l 21 974 l 83 979 l 83 994 q 92 1066 83 1032 q 122 1126 101 1100 q 176 1168 143 1153 q 258 1183 210 1183 q 310 1179 286 1183 q 351 1168 335 1175 l 325 1065 q 278 1072 304 1072 q 241 1055 254 1072 q 228 1000 228 1038 l 228 979 l 308 979 l 308 868 l 228 868 l 228 521 l 83 521 z \"},\"ᵍ\":{\"ha\":501,\"x_min\":32,\"x_max\":485,\"o\":\"m 224 329 q 149 335 183 329 q 88 356 114 342 q 47 392 61 369 q 32 444 32 414 q 96 533 32 501 l 96 539 q 65 569 76 550 q 54 615 54 588 q 68 662 54 639 q 106 700 82 685 l 106 706 q 62 751 81 721 q 43 822 43 782 q 59 895 43 864 q 101 948 75 926 q 163 980 128 969 q 236 990 199 990 q 310 978 278 990 l 478 978 l 478 874 l 407 874 q 416 849 413 864 q 419 818 419 833 q 405 749 419 778 q 365 701 390 721 q 307 673 340 682 q 236 664 274 664 q 212 665 225 664 q 182 672 199 667 q 171 659 175 665 q 167 642 167 653 q 182 618 167 625 q 235 611 197 611 l 308 611 q 440 584 396 611 q 485 494 485 557 q 415 376 485 422 q 224 329 346 329 m 236 751 q 279 769 263 751 q 296 822 296 786 q 279 876 296 858 q 236 894 263 894 q 193 876 210 894 q 176 822 176 858 q 193 769 176 786 q 236 751 210 751 m 247 417 q 319 432 292 417 q 347 469 347 447 q 331 496 347 489 q 281 503 314 503 l 235 503 q 203 503 219 503 q 172 508 188 504 q 149 468 149 489 q 176 430 149 443 q 247 417 203 417 z \"},\"ʰ\":{\"ha\":533,\"x_min\":58,\"x_max\":481,\"o\":\"m 58 521 l 58 1164 l 203 1164 l 203 1007 l 193 922 q 253 969 217 947 q 336 990 290 990 q 447 939 414 990 q 481 803 481 888 l 481 521 l 336 521 l 336 785 q 326 848 336 826 q 281 869 317 869 q 242 858 260 869 q 203 825 224 846 l 203 521 l 58 521 z \"},\"ⁱ\":{\"ha\":261,\"x_min\":49,\"x_max\":213,\"o\":\"m 131 1040 q 72 1061 94 1040 q 49 1114 49 1082 q 72 1167 49 1146 q 131 1188 94 1188 q 190 1167 167 1188 q 213 1114 213 1146 q 190 1061 213 1082 q 131 1040 167 1040 m 58 521 l 58 979 l 203 979 l 203 521 l 58 521 z \"},\"ʲ\":{\"ha\":264,\"x_min\":-46,\"x_max\":215,\"o\":\"m 38 333 q -12 337 6 333 q -46 344 -31 340 l -21 451 q -5 447 -14 449 q 15 446 4 446 q 52 462 43 446 q 61 517 61 478 l 61 979 l 206 979 l 206 522 q 197 449 206 483 q 169 390 189 415 q 117 349 150 364 q 38 333 85 333 m 133 1040 q 74 1061 97 1040 q 51 1114 51 1082 q 74 1167 51 1146 q 133 1188 97 1188 q 192 1167 169 1188 q 215 1114 215 1146 q 192 1061 215 1082 q 133 1040 169 1040 z \"},\"ᵏ\":{\"ha\":515,\"x_min\":58,\"x_max\":510,\"o\":\"m 58 521 l 58 1164 l 203 1164 l 203 803 l 208 803 l 343 979 l 499 979 l 332 785 l 510 521 l 354 521 l 251 693 l 203 633 l 203 521 l 58 521 z \"},\"ˡ\":{\"ha\":269,\"x_min\":58,\"x_max\":261,\"o\":\"m 190 510 q 87 553 115 510 q 58 669 58 597 l 58 1164 l 203 1164 l 203 664 q 226 624 203 624 q 234 624 231 624 q 244 626 238 624 l 261 522 q 232 513 249 517 q 190 510 215 510 z \"},\"ᵐ\":{\"ha\":801,\"x_min\":58,\"x_max\":749,\"o\":\"m 58 521 l 58 979 l 175 979 l 186 919 l 189 919 q 249 969 217 947 q 328 990 281 990 q 457 913 418 990 q 519 967 485 943 q 601 990 554 990 q 713 939 678 990 q 749 803 749 888 l 749 521 l 604 521 l 604 785 q 592 848 604 826 q 547 869 581 869 q 475 826 518 869 l 475 521 l 332 521 l 332 785 q 319 848 332 826 q 275 869 307 869 q 203 826 244 869 l 203 521 l 58 521 z \"},\"ⁿ\":{\"ha\":533,\"x_min\":58,\"x_max\":481,\"o\":\"m 58 521 l 58 979 l 174 979 l 186 919 l 189 919 q 253 969 217 947 q 336 990 290 990 q 447 939 414 990 q 481 803 481 888 l 481 521 l 336 521 l 336 785 q 327 848 336 826 q 282 869 318 869 q 242 858 260 869 q 203 825 224 846 l 203 521 l 58 521 z \"},\"ᵒ\":{\"ha\":518,\"x_min\":33,\"x_max\":483,\"o\":\"m 258 510 q 174 526 214 510 q 102 573 133 542 q 52 648 71 604 q 33 749 33 692 q 52 850 33 806 q 102 926 71 894 q 174 974 133 957 q 258 990 214 990 q 343 974 303 990 q 415 926 383 957 q 465 850 446 894 q 483 749 483 806 q 465 648 483 692 q 415 573 446 604 q 343 526 383 542 q 258 510 303 510 m 258 624 q 318 658 299 624 q 338 749 338 692 q 318 842 338 807 q 258 876 299 876 q 199 842 218 876 q 181 749 181 807 q 199 658 181 692 q 258 624 218 624 z \"},\"ᵖ\":{\"ha\":535,\"x_min\":58,\"x_max\":499,\"o\":\"m 58 336 l 58 979 l 174 979 l 183 932 l 188 932 q 247 973 211 956 q 318 990 282 990 q 450 926 401 990 q 499 758 499 863 q 483 652 499 699 q 440 574 467 606 q 378 526 413 543 q 307 510 344 510 q 248 522 276 510 q 194 558 219 535 l 203 467 l 203 336 l 58 336 m 272 624 q 328 655 304 624 q 351 756 351 686 q 333 846 351 818 q 276 874 314 874 q 203 835 240 874 l 203 650 q 272 624 238 624 z \"},\"ʳ\":{\"ha\":378,\"x_min\":58,\"x_max\":378,\"o\":\"m 58 521 l 58 979 l 175 979 l 186 899 l 189 899 q 251 968 217 946 q 319 990 285 990 q 354 987 340 990 q 378 979 368 983 l 353 856 q 330 861 343 858 q 303 864 317 864 q 249 846 276 864 q 203 782 222 828 l 203 521 l 58 521 z \"},\"ˢ\":{\"ha\":413,\"x_min\":21,\"x_max\":390,\"o\":\"m 199 510 q 105 527 153 510 q 21 571 57 544 l 83 661 q 203 615 147 615 q 257 651 257 615 q 229 682 257 671 q 165 708 201 693 q 122 728 143 717 q 83 756 100 740 q 54 794 65 772 q 43 844 43 815 q 92 949 43 908 q 221 990 140 990 q 316 972 276 990 q 386 932 356 954 l 322 846 q 273 874 297 863 q 225 885 249 885 q 189 876 201 885 q 176 851 176 867 q 205 820 176 831 q 268 796 233 810 q 311 777 289 788 q 351 751 333 767 q 379 713 368 735 q 390 660 390 690 q 341 553 390 596 q 199 510 292 510 z \"},\"ᵗ\":{\"ha\":360,\"x_min\":17,\"x_max\":347,\"o\":\"m 240 510 q 117 560 154 510 q 79 692 79 611 l 79 867 l 17 867 l 17 974 l 86 979 l 103 1097 l 224 1097 l 224 979 l 331 979 l 331 867 l 224 867 l 224 694 q 240 639 224 656 q 281 622 256 622 q 301 623 292 622 q 322 629 311 624 l 347 526 q 302 515 328 519 q 240 510 276 510 z \"},\"ᵘ\":{\"ha\":532,\"x_min\":54,\"x_max\":476,\"o\":\"m 200 510 q 88 560 122 510 q 54 694 54 611 l 54 979 l 197 979 l 197 713 q 208 651 197 671 q 256 631 218 631 q 332 674 293 631 l 332 979 l 476 979 l 476 521 l 361 521 l 346 579 l 343 579 q 283 532 319 554 q 200 510 247 510 z \"},\"ᵛ\":{\"ha\":493,\"x_min\":11,\"x_max\":482,\"o\":\"m 164 521 l 11 979 l 154 979 l 210 768 l 249 626 l 251 626 l 288 768 l 344 979 l 482 979 l 331 521 l 164 521 z \"},\"ʷ\":{\"ha\":726,\"x_min\":22,\"x_max\":704,\"o\":\"m 136 521 l 22 979 l 165 979 l 206 774 l 226 635 l 231 635 l 256 774 l 308 979 l 424 979 l 479 774 l 506 635 l 510 635 l 532 774 l 572 979 l 704 979 l 596 521 l 428 521 l 388 697 l 365 822 l 363 822 l 340 697 l 301 521 l 136 521 z \"},\"ˣ\":{\"ha\":483,\"x_min\":11,\"x_max\":472,\"o\":\"m 11 521 l 156 758 l 21 979 l 175 979 l 213 907 l 251 838 l 257 838 l 285 907 l 315 979 l 465 979 l 331 742 l 472 521 l 319 521 l 279 592 l 235 664 l 229 664 l 194 592 l 161 521 l 11 521 z \"},\"ʸ\":{\"ha\":490,\"x_min\":11,\"x_max\":479,\"o\":\"m 115 350 q 78 352 94 350 q 47 358 63 354 l 72 465 q 90 460 83 461 q 104 460 97 460 q 156 476 136 460 q 183 517 175 492 l 190 536 l 11 979 l 156 979 l 218 789 q 236 724 229 754 q 253 658 243 694 l 258 658 q 274 724 265 692 q 290 789 282 756 l 342 979 l 479 979 l 324 522 q 288 446 307 478 q 244 392 268 414 q 189 360 221 371 q 115 350 157 350 z \"},\"ᶻ\":{\"ha\":433,\"x_min\":35,\"x_max\":410,\"o\":\"m 35 521 l 35 599 l 225 867 l 58 867 l 58 979 l 404 979 l 404 901 l 214 633 l 410 633 l 410 521 l 35 521 z \"},\"ˁ\":{\"ha\":476,\"x_min\":39,\"x_max\":450,\"o\":\"m 183 521 l 183 760 q 79 858 119 807 q 39 983 39 908 q 56 1067 39 1031 q 104 1126 74 1103 q 174 1162 135 1150 q 258 1174 214 1174 q 372 1150 325 1174 q 450 1092 418 1126 l 379 1001 q 333 1043 360 1026 q 275 1060 307 1060 q 208 1039 233 1060 q 183 978 183 1018 q 191 938 183 957 q 215 899 199 918 q 259 858 232 879 q 326 811 286 836 l 326 521 l 183 521 z \"},\"ː\":{\"ha\":417,\"x_min\":60,\"x_max\":357,\"o\":\"m 60 0 l 199 264 l 218 264 l 357 0 l 60 0 m 199 417 l 60 681 l 357 681 l 218 417 l 199 417 z \"},\"ˑ\":{\"ha\":417,\"x_min\":60,\"x_max\":357,\"o\":\"m 199 394 l 60 658 l 357 658 l 218 394 l 199 394 z \"},\"˞\":{\"ha\":263,\"x_min\":-160,\"x_max\":290,\"o\":\"m 179 314 q 88 342 131 314 q 18 449 44 371 l -160 372 l -160 518 l 101 631 q 122 532 111 571 q 143 470 132 493 q 167 438 154 447 q 193 429 179 429 q 224 433 211 429 q 249 444 238 438 l 290 349 q 242 324 269 335 q 179 314 215 314 z \"},\"ˠ\":{\"ha\":490,\"x_min\":11,\"x_max\":481,\"o\":\"m 250 329 q 142 366 182 329 q 101 465 101 403 q 115 530 101 500 q 156 604 129 560 l 11 978 l 154 978 l 213 792 q 229 739 221 763 q 247 683 238 715 l 251 683 q 269 739 260 715 q 286 792 278 763 l 343 978 l 481 978 l 342 607 q 382 531 368 563 q 396 465 396 500 q 356 366 396 403 q 250 329 317 329 m 250 417 q 272 427 263 417 q 281 454 281 438 q 274 494 281 474 q 250 546 267 515 l 246 546 q 218 454 218 489 q 226 427 218 438 q 250 417 235 417 z \"},\"ₔ\":{\"ha\":481,\"x_min\":29,\"x_max\":447,\"o\":\"m 228 510 q 139 528 176 510 q 77 577 101 546 q 41 648 53 608 q 29 732 29 688 q 31 763 29 751 q 38 789 33 774 l 310 789 q 207 881 293 881 q 108 853 156 881 l 58 938 q 140 977 96 964 q 225 990 183 990 q 316 973 275 990 q 386 924 357 956 q 431 849 415 893 q 447 750 447 804 q 430 651 447 696 q 382 576 413 607 q 312 527 351 544 q 228 510 272 510 m 226 619 q 283 640 260 619 q 311 707 306 661 l 151 707 q 169 645 151 671 q 226 619 186 619 z \"},\"°\":{\"ha\":507,\"x_min\":54,\"x_max\":456,\"o\":\"m 254 553 q 176 567 213 553 q 112 609 139 582 q 69 672 85 636 q 54 753 54 708 q 69 833 54 796 q 112 897 85 869 q 176 938 139 924 q 254 953 213 953 q 333 938 296 953 q 397 897 369 924 q 440 833 424 869 q 456 753 456 796 q 440 672 456 708 q 397 609 424 636 q 333 567 369 582 q 254 553 296 553 m 254 650 q 322 678 296 650 q 347 753 347 707 q 322 826 347 797 q 254 854 296 854 q 188 826 214 854 q 161 753 161 797 q 188 678 161 707 q 254 650 214 650 z \"},\"¤\":{\"ha\":733,\"x_min\":28,\"x_max\":706,\"o\":\"m 129 115 l 28 218 l 113 304 q 65 458 65 368 q 77 541 65 503 q 111 610 89 579 l 28 696 l 129 799 l 225 701 q 367 736 292 736 q 508 701 439 736 l 604 799 l 706 696 l 621 610 q 668 458 668 547 q 656 374 668 413 q 621 304 643 336 l 706 218 l 604 115 l 507 214 q 439 189 475 197 q 367 181 403 181 q 226 214 290 181 l 129 115 m 367 322 q 451 359 417 322 q 486 458 486 396 q 451 558 486 521 q 367 594 417 594 q 282 558 317 594 q 247 458 247 521 q 282 359 247 396 q 367 322 317 322 z \"},\"$\":{\"ha\":733,\"x_min\":54,\"x_max\":650,\"o\":\"m 299 -153 l 299 -14 q 170 20 238 -7 q 54 92 103 47 l 143 229 q 244 169 196 189 q 342 149 292 149 q 427 172 400 149 q 454 244 454 196 q 427 306 454 281 q 359 353 400 331 q 271 399 318 376 q 183 454 224 422 q 115 529 142 486 q 88 635 88 572 q 144 805 88 738 q 299 892 200 872 l 299 1035 l 433 1035 l 433 894 q 550 854 500 885 q 640 781 600 824 l 538 664 q 465 716 500 699 q 386 733 431 733 q 310 713 336 733 q 283 644 283 692 q 310 588 283 611 q 378 544 338 565 q 467 501 419 524 q 555 447 514 479 q 623 370 596 415 q 650 258 650 325 q 596 87 650 158 q 433 -8 542 15 l 433 -153 l 299 -153 z \"},\"£\":{\"ha\":733,\"x_min\":67,\"x_max\":690,\"o\":\"m 67 0 l 67 126 q 172 209 129 154 q 214 339 214 264 q 213 358 214 349 q 211 376 213 367 l 72 376 l 72 496 l 167 503 l 175 503 q 159 558 165 531 q 153 614 153 586 q 175 732 153 679 q 237 822 197 785 q 331 878 276 858 q 450 899 385 899 q 585 869 528 899 q 690 786 643 840 l 579 675 q 529 719 556 704 q 469 733 503 733 q 381 701 414 733 q 349 603 349 669 q 353 553 349 578 q 364 503 357 528 l 569 503 l 569 376 l 390 376 q 392 358 392 367 q 393 338 393 349 q 378 251 393 288 q 331 178 364 215 l 331 172 l 690 172 l 690 0 l 67 0 z \"},\"¥\":{\"ha\":733,\"x_min\":17,\"x_max\":717,\"o\":\"m 264 0 l 264 204 l 51 204 l 51 301 l 264 301 l 264 378 l 51 378 l 51 475 l 221 475 l 17 882 l 226 882 l 297 697 q 331 606 314 651 q 367 515 347 560 l 372 515 q 407 607 390 561 q 442 697 424 653 l 511 882 l 717 882 l 513 475 l 682 475 l 682 378 l 468 378 l 468 301 l 682 301 l 682 204 l 468 204 l 468 0 l 264 0 z \"},\"€\":{\"ha\":733,\"x_min\":29,\"x_max\":721,\"o\":\"m 468 -17 q 242 63 338 -17 q 115 299 147 143 l 29 299 l 29 394 l 104 400 q 103 418 103 410 q 103 436 103 426 q 103 455 103 446 q 104 472 103 464 l 29 472 l 29 567 l 115 574 q 165 712 132 651 q 247 814 199 772 q 354 877 294 856 q 483 899 414 899 q 606 871 546 899 q 710 790 665 843 l 596 681 q 541 724 569 707 q 476 740 513 740 q 377 697 417 740 q 321 575 338 654 l 618 575 l 618 472 l 308 472 l 308 443 q 308 422 308 432 q 310 403 308 413 l 563 403 l 563 299 l 324 299 q 383 182 343 222 q 481 142 422 142 q 551 161 521 142 q 608 217 581 181 l 721 111 q 607 16 671 49 q 468 -17 543 -17 z \"},\"¢\":{\"ha\":733,\"x_min\":83,\"x_max\":676,\"o\":\"m 282 426 q 308 319 282 364 q 382 253 333 274 l 382 600 q 307 533 332 578 q 282 426 282 489 m 382 -57 l 382 75 q 259 111 314 83 q 165 184 204 139 q 105 290 126 229 q 83 426 83 351 q 106 560 83 500 q 168 663 128 619 q 263 735 208 707 q 382 775 317 764 l 382 910 l 494 910 l 494 781 q 592 755 549 775 q 667 703 636 735 l 574 578 q 494 615 532 611 l 494 238 q 549 256 524 243 q 594 286 574 269 l 676 157 q 589 102 636 122 q 494 75 542 82 l 494 -57 l 382 -57 z \"},\"ƒ\":{\"ha\":733,\"x_min\":42,\"x_max\":686,\"o\":\"m 161 -133 q 89 -128 121 -133 q 42 -112 57 -122 l 69 39 q 100 30 85 32 q 131 26 115 28 q 173 36 156 28 q 203 67 190 44 q 223 126 215 89 q 238 224 231 164 l 261 426 l 157 426 l 157 567 l 260 575 l 278 575 l 285 635 q 313 766 293 711 q 365 856 332 821 q 448 906 399 890 q 567 922 497 922 q 629 915 593 922 q 686 897 665 907 l 647 744 q 619 754 635 749 q 583 760 604 760 q 512 730 536 760 q 482 651 488 700 l 472 575 l 615 575 l 615 426 l 456 426 l 424 164 q 401 47 417 101 q 356 -47 386 -7 q 279 -110 326 -87 q 161 -133 232 -133 z \"},\"₡\":{\"ha\":733,\"x_min\":75,\"x_max\":717,\"o\":\"m 472 740 q 458 740 465 740 q 444 739 451 740 l 376 168 q 429 146 397 153 l 499 738 q 485 740 492 739 q 472 740 479 740 m 281 443 q 315 244 281 322 l 371 708 q 303 606 326 674 q 281 443 281 539 m 393 -153 l 410 -15 q 381 -10 394 -12 q 356 -6 368 -8 l 338 -153 l 268 -153 l 289 18 q 133 169 192 65 q 75 436 75 274 q 98 610 75 532 q 163 745 121 688 q 263 840 204 803 q 393 890 322 876 l 410 1035 l 479 1035 l 463 899 l 478 899 q 498 898 489 899 q 518 896 507 897 l 535 1035 l 604 1035 l 585 878 q 654 838 621 863 q 715 779 688 813 l 603 668 q 565 706 583 689 l 499 146 q 603 217 557 158 l 717 111 q 609 22 668 54 q 479 -15 550 -10 l 463 -153 l 393 -153 z \"},\"₤\":{\"ha\":733,\"x_min\":67,\"x_max\":690,\"o\":\"m 67 0 l 67 126 q 160 195 121 150 q 211 301 200 240 l 72 301 l 72 397 l 175 404 l 206 404 q 197 438 201 421 q 186 471 192 454 l 72 471 l 72 567 l 153 575 l 157 575 q 153 614 153 593 q 175 732 153 679 q 237 822 197 785 q 331 878 276 858 q 450 899 385 899 q 585 869 528 899 q 690 786 643 840 l 579 675 q 529 719 556 704 q 469 733 503 733 q 381 701 414 733 q 349 603 349 669 q 349 589 349 596 q 350 575 349 582 l 569 575 l 569 471 l 372 471 q 380 438 376 454 q 386 404 383 421 l 569 404 l 569 301 l 390 301 q 372 237 386 265 q 331 178 358 208 l 331 172 l 690 172 l 690 0 l 67 0 z \"},\"₦\":{\"ha\":733,\"x_min\":4,\"x_max\":728,\"o\":\"m 211 731 l 229 556 l 267 556 l 217 731 l 211 731 m 517 151 l 522 151 l 504 328 l 467 328 l 517 151 m 101 0 l 101 328 l 4 328 l 4 400 l 101 408 l 101 475 l 4 475 l 4 547 l 101 556 l 101 882 l 290 882 l 401 556 l 485 556 l 485 882 l 632 882 l 632 556 l 728 556 l 728 475 l 632 475 l 632 408 l 728 408 l 728 328 l 632 328 l 632 0 l 443 0 l 332 328 l 249 328 l 249 0 l 101 0 m 496 408 l 490 475 l 425 475 l 444 408 l 496 408 m 308 408 l 289 475 l 238 475 l 243 408 l 308 408 z \"},\"₧\":{\"ha\":733,\"x_min\":4,\"x_max\":721,\"o\":\"m 90 0 l 90 528 l 4 528 l 4 646 l 90 653 l 90 882 l 329 882 q 440 870 388 882 q 533 831 492 858 q 601 760 574 804 q 639 654 629 717 l 721 654 l 721 528 l 640 528 q 602 424 631 468 q 532 351 574 381 q 438 308 490 322 q 329 294 386 294 l 283 294 l 283 0 l 90 0 m 283 754 l 283 654 l 449 654 q 403 731 436 707 q 318 754 371 754 l 283 754 m 283 424 l 318 424 q 404 451 371 424 q 449 528 438 479 l 283 528 l 283 424 z \"},\"₩\":{\"ha\":733,\"x_min\":-26,\"x_max\":758,\"o\":\"m 364 683 l 351 486 l 382 486 l 369 683 l 364 683 m 517 143 l 522 143 l 531 347 l 533 406 l 494 406 l 500 347 l 517 143 m 114 0 l 67 406 l -26 406 l -26 479 l 57 485 l 10 882 l 190 882 l 213 486 l 263 486 l 296 826 l 450 826 l 486 486 l 538 486 l 560 882 l 725 882 l 682 486 l 758 486 l 758 406 l 674 406 l 631 0 l 425 0 l 388 406 l 347 406 l 313 0 l 114 0 m 228 143 l 233 143 l 249 347 l 254 406 l 217 406 l 219 347 l 228 143 z \"},\"₫\":{\"ha\":733,\"x_min\":90,\"x_max\":718,\"o\":\"m 314 161 q 151 229 211 161 q 90 425 90 297 q 110 529 90 483 q 163 608 131 575 q 236 657 194 640 q 319 674 278 674 q 395 660 365 674 q 454 619 425 647 l 449 713 l 449 733 l 249 733 l 249 836 l 449 836 l 449 904 l 617 904 l 617 836 l 718 836 l 718 742 l 617 733 l 617 175 l 478 175 l 465 225 l 461 225 q 396 178 433 196 q 314 161 358 161 m 356 296 q 404 307 383 296 q 449 346 425 318 l 449 500 q 406 528 426 519 q 361 536 386 536 q 293 506 324 536 q 263 424 263 476 q 288 326 263 357 q 356 296 313 296 m 108 0 l 108 103 l 663 103 l 663 0 l 108 0 z \"},\"₱\":{\"ha\":733,\"x_min\":4,\"x_max\":721,\"o\":\"m 90 0 l 90 481 l 4 481 l 4 553 l 90 560 l 90 624 l 4 624 l 4 696 l 90 703 l 90 882 l 329 882 q 428 872 381 882 q 514 842 475 863 q 582 787 553 821 q 628 704 611 753 l 721 704 l 721 624 l 643 624 q 644 605 644 614 q 644 586 644 596 q 644 574 644 579 q 643 561 644 568 l 721 561 l 721 481 l 628 481 q 514 340 596 385 q 329 294 432 294 l 283 294 l 283 0 l 90 0 m 283 754 l 283 704 l 428 704 q 318 754 394 754 l 283 754 m 456 586 q 456 606 456 597 q 454 624 456 615 l 283 624 l 283 561 l 454 561 q 456 574 456 568 q 456 586 456 579 m 283 424 l 318 424 q 429 481 394 424 l 283 481 l 283 424 z \"},\"₲\":{\"ha\":733,\"x_min\":53,\"x_max\":688,\"o\":\"m 358 -153 l 358 -11 q 235 35 292 0 q 138 126 179 69 q 75 260 97 182 q 53 436 53 338 q 75 609 53 532 q 137 744 97 686 q 233 840 176 803 q 358 890 289 876 l 358 1035 l 494 1035 l 494 894 q 598 857 549 885 q 688 786 647 829 l 575 675 q 512 723 543 706 q 436 740 481 740 q 303 662 349 740 q 257 443 257 583 q 305 224 257 299 q 440 149 353 149 q 506 167 481 149 l 506 336 l 410 336 l 410 503 l 688 503 l 688 86 q 494 -11 603 10 l 494 -153 l 358 -153 z \"},\"₴\":{\"ha\":733,\"x_min\":29,\"x_max\":696,\"o\":\"m 404 -17 q 181 53 257 -17 q 106 242 106 124 q 111 299 106 275 l 29 299 l 29 394 l 132 403 l 158 403 q 192 440 174 422 q 229 472 210 457 l 29 472 l 29 567 l 132 575 l 374 575 q 407 613 394 593 q 419 657 419 633 q 397 718 419 696 q 331 740 374 740 q 257 723 290 740 q 188 671 224 706 l 90 781 q 197 866 138 833 q 342 899 257 899 q 542 835 468 899 q 615 651 615 771 q 604 575 615 611 l 696 575 l 696 472 l 540 472 q 499 435 521 453 q 456 403 478 418 l 696 403 l 696 299 l 326 299 q 301 232 301 267 q 326 167 301 192 q 404 142 351 142 q 590 224 492 142 l 675 92 q 613 45 647 65 q 542 11 578 25 q 470 -10 506 -3 q 404 -17 435 -17 z \"},\"₵\":{\"ha\":733,\"x_min\":75,\"x_max\":717,\"o\":\"m 281 443 q 310 255 281 328 q 399 156 340 182 l 399 725 q 310 625 340 697 q 281 443 281 553 m 399 -153 l 399 -14 q 268 29 328 -4 q 166 119 208 63 q 99 255 124 175 q 75 436 75 335 q 99 612 75 533 q 165 748 122 690 q 267 842 207 806 q 399 892 326 879 l 399 1022 l 511 1022 l 511 896 q 615 862 565 889 q 704 790 665 835 l 592 681 q 554 714 574 700 q 511 735 535 728 l 511 149 q 603 217 561 165 l 717 111 q 511 -11 631 10 l 511 -153 l 399 -153 z \"},\"₹\":{\"ha\":733,\"x_min\":96,\"x_max\":646,\"o\":\"m 96 279 l 96 442 l 186 442 q 346 540 318 442 l 96 540 l 96 635 l 199 643 l 344 643 q 290 703 329 686 q 186 719 250 719 l 96 719 l 96 882 l 646 882 l 646 779 l 463 779 q 547 643 529 732 l 646 643 l 646 540 l 549 540 q 494 399 538 454 q 385 314 451 343 l 622 0 l 393 0 l 194 279 l 96 279 z \"},\"₺\":{\"ha\":733,\"x_min\":19,\"x_max\":693,\"o\":\"m 125 -17 l 125 306 l 19 249 l 19 361 l 125 418 l 125 494 l 19 438 l 19 550 l 125 607 l 125 882 l 329 882 l 329 707 l 532 814 l 532 701 l 329 594 l 329 518 l 532 625 l 532 513 l 329 406 l 329 174 q 402 192 368 178 q 462 231 436 207 q 503 285 488 254 q 518 353 518 315 q 518 369 518 360 q 515 394 518 379 l 683 433 q 691 393 689 413 q 693 363 693 374 q 655 195 693 268 q 544 74 617 122 q 365 3 471 26 q 125 -17 260 -21 z \"},\"₮\":{\"ha\":733,\"x_min\":44,\"x_max\":688,\"o\":\"m 264 0 l 264 181 l 110 96 l 110 210 l 264 293 l 264 368 l 110 285 l 110 397 l 264 482 l 264 733 l 44 733 l 44 882 l 688 882 l 688 733 l 468 733 l 468 579 l 622 663 l 622 550 l 468 465 l 468 390 l 622 474 l 622 361 l 468 278 l 468 0 l 264 0 z \"},\"₸\":{\"ha\":733,\"x_min\":44,\"x_max\":688,\"o\":\"m 264 0 l 264 606 l 44 606 l 44 701 l 149 710 l 688 710 l 688 606 l 468 606 l 468 0 l 264 0 m 44 779 l 44 882 l 688 882 l 688 779 l 44 779 z \"},\"₽\":{\"ha\":733,\"x_min\":4,\"x_max\":644,\"o\":\"m 90 0 l 90 199 l 4 199 l 4 293 l 90 300 l 90 369 l 4 369 l 4 464 l 90 471 l 90 882 l 325 882 q 449 867 390 882 q 551 822 507 853 q 619 742 594 790 q 644 625 644 693 q 618 508 644 557 q 548 429 592 460 q 446 384 504 399 q 325 369 388 369 l 283 369 l 283 301 l 554 301 l 554 199 l 283 199 l 283 0 l 90 0 m 283 472 l 318 472 q 419 510 382 472 q 456 614 456 549 q 419 722 456 689 q 318 754 382 754 l 283 754 l 283 472 z \"},\"⁄\":{\"ha\":133,\"x_min\":-237,\"x_max\":369,\"o\":\"m -237 -17 l 251 922 l 369 922 l -119 -17 l -237 -17 z \"},\"∕\":{\"ha\":133,\"x_min\":-237,\"x_max\":369,\"o\":\"m -237 -17 l 251 922 l 369 922 l -119 -17 l -237 -17 z \"},\"%\":{\"ha\":1190,\"x_min\":36,\"x_max\":1156,\"o\":\"m 261 347 q 171 367 213 347 q 99 424 129 386 q 53 515 69 461 q 36 636 36 568 q 53 757 36 704 q 99 847 69 810 q 171 903 129 883 q 261 922 213 922 q 351 903 310 922 q 423 847 393 883 q 470 757 453 810 q 488 636 488 704 q 470 515 488 568 q 423 424 453 461 q 351 367 393 386 q 261 347 310 347 m 261 461 q 320 500 296 461 q 344 636 344 539 q 320 771 344 733 q 261 808 296 808 q 202 771 226 808 q 178 636 178 733 q 202 500 178 539 q 261 461 226 461 m 292 -17 l 781 922 l 899 922 l 410 -17 l 292 -17 m 929 -17 q 839 3 881 -17 q 767 60 797 22 q 721 151 738 97 q 704 272 704 204 q 721 393 704 340 q 767 483 738 446 q 839 539 797 519 q 929 558 881 558 q 1019 539 978 558 q 1091 483 1061 519 q 1138 393 1121 446 q 1156 272 1156 340 q 1138 151 1156 204 q 1091 60 1121 97 q 1019 3 1061 22 q 929 -17 978 -17 m 929 97 q 988 136 964 97 q 1013 272 1013 175 q 988 407 1013 369 q 929 444 964 444 q 870 407 894 444 q 846 272 846 369 q 870 136 846 175 q 929 97 894 97 z \"},\"‰\":{\"ha\":1735,\"x_min\":36,\"x_max\":1699,\"o\":\"m 292 -17 l 781 922 l 899 922 l 410 -17 l 292 -17 m 261 347 q 171 367 213 347 q 99 424 129 386 q 53 515 69 461 q 36 636 36 568 q 53 757 36 704 q 99 847 69 810 q 171 903 129 883 q 261 922 213 922 q 351 903 310 922 q 423 847 393 883 q 470 757 453 810 q 488 636 488 704 q 470 515 488 568 q 423 424 453 461 q 351 367 393 386 q 261 347 310 347 m 261 461 q 320 500 296 461 q 344 636 344 539 q 320 771 344 733 q 261 808 296 808 q 202 771 226 808 q 178 636 178 733 q 202 500 178 539 q 261 461 226 461 m 928 -17 q 838 3 879 -17 q 766 60 796 22 q 719 151 736 97 q 703 272 703 204 q 719 393 703 340 q 766 483 736 446 q 838 539 796 519 q 928 558 879 558 q 1018 539 976 558 q 1090 483 1060 519 q 1137 393 1119 446 q 1154 272 1154 340 q 1137 151 1154 204 q 1090 60 1119 97 q 1018 3 1060 22 q 928 -17 976 -17 m 928 97 q 987 136 963 97 q 1011 272 1011 175 q 987 407 1011 369 q 928 444 963 444 q 869 407 893 444 q 844 272 844 369 q 869 136 844 175 q 928 97 893 97 m 1472 -17 q 1382 3 1424 -17 q 1310 60 1340 22 q 1264 151 1281 97 q 1247 272 1247 204 q 1264 393 1247 340 q 1310 483 1281 446 q 1382 539 1340 519 q 1472 558 1424 558 q 1563 539 1521 558 q 1634 483 1604 519 q 1681 393 1664 446 q 1699 272 1699 340 q 1681 151 1699 204 q 1634 60 1664 97 q 1563 3 1604 22 q 1472 -17 1521 -17 m 1472 97 q 1531 136 1507 97 q 1556 272 1556 175 q 1531 407 1556 369 q 1472 444 1507 444 q 1413 407 1438 444 q 1389 272 1389 369 q 1413 136 1389 175 q 1472 97 1438 97 z \"},\"¼\":{\"ha\":1124,\"x_min\":65,\"x_max\":1113,\"o\":\"m 189 364 l 189 754 l 65 754 l 65 846 q 115 856 93 850 q 154 868 136 861 q 188 884 172 875 q 221 906 204 893 l 340 906 l 340 364 l 189 364 m 257 -17 l 746 922 l 864 922 l 375 -17 l 257 -17 m 899 0 l 899 121 l 650 121 l 650 196 l 846 542 l 1032 542 l 1032 218 l 1113 218 l 1113 121 l 1032 121 l 1032 0 l 899 0 m 788 218 l 899 218 l 899 275 l 907 438 l 901 438 l 846 331 l 788 218 z \"},\"½\":{\"ha\":1175,\"x_min\":65,\"x_max\":1115,\"o\":\"m 189 364 l 189 754 l 65 754 l 65 846 q 115 856 93 850 q 154 868 136 861 q 188 884 172 875 q 221 906 204 893 l 340 906 l 340 364 l 189 364 m 236 -17 l 725 922 l 843 922 l 354 -17 l 236 -17 m 714 0 l 714 81 q 885 233 818 167 q 951 350 951 299 q 931 413 951 390 q 872 435 910 435 q 821 417 844 435 q 774 369 797 400 l 689 447 q 896 558 772 558 q 1041 510 986 558 q 1096 375 1096 463 q 1084 310 1096 342 q 1052 249 1072 279 q 1006 188 1032 218 q 951 125 981 157 l 1115 125 l 1115 0 l 714 0 z \"},\"¾\":{\"ha\":1136,\"x_min\":35,\"x_max\":1124,\"o\":\"m 256 347 q 128 376 185 347 q 35 457 71 404 l 125 528 q 240 461 174 461 q 295 478 272 461 q 318 526 318 494 q 189 597 318 597 l 189 683 q 269 699 239 683 q 299 750 299 715 q 281 793 299 778 q 231 808 263 808 q 183 793 204 808 q 142 754 161 778 l 57 829 q 147 900 101 878 q 257 922 193 922 q 328 912 294 922 q 389 882 363 901 q 431 834 415 863 q 446 771 446 806 q 425 698 446 728 q 367 646 404 668 q 437 597 408 629 q 465 515 465 564 q 448 447 465 478 q 402 394 431 415 q 335 360 374 372 q 256 347 297 347 m 288 -17 l 776 922 l 894 922 l 406 -17 l 288 -17 m 910 0 l 910 121 l 661 121 l 661 196 l 857 542 l 1043 542 l 1043 218 l 1124 218 l 1124 121 l 1043 121 l 1043 0 l 910 0 m 799 218 l 910 218 l 910 275 l 918 438 l 913 438 l 857 331 l 799 218 z \"},\"⅓\":{\"ha\":1163,\"x_min\":65,\"x_max\":1108,\"o\":\"m 189 364 l 189 754 l 65 754 l 65 846 q 115 856 93 850 q 154 868 136 861 q 188 884 172 875 q 221 906 204 893 l 340 906 l 340 364 l 189 364 m 228 -17 l 717 922 l 835 922 l 346 -17 l 228 -17 m 899 -17 q 771 12 828 -17 q 678 93 714 40 l 768 164 q 883 97 817 97 q 938 114 915 97 q 961 163 961 131 q 832 233 961 233 l 832 319 q 912 335 882 319 q 942 386 942 351 q 924 429 942 414 q 874 444 906 444 q 826 429 847 444 q 785 390 804 414 l 700 465 q 790 536 744 514 q 900 558 836 558 q 972 548 938 558 q 1032 518 1006 538 q 1074 470 1058 499 q 1089 407 1089 442 q 1068 334 1089 364 q 1010 282 1047 304 q 1080 233 1051 265 q 1108 151 1108 200 q 1091 83 1108 114 q 1045 30 1074 51 q 978 -4 1017 8 q 899 -17 940 -17 z \"},\"⅔\":{\"ha\":1179,\"x_min\":40,\"x_max\":1125,\"o\":\"m 65 364 l 65 444 q 236 597 169 531 q 303 714 303 663 q 282 776 303 754 q 224 799 261 799 q 172 781 196 799 q 125 733 149 764 l 40 811 q 247 922 124 922 q 392 874 338 922 q 447 739 447 826 q 435 674 447 706 q 403 613 424 643 q 358 551 383 582 q 303 489 332 521 l 467 489 l 467 364 l 65 364 m 297 -17 l 786 922 l 904 922 l 415 -17 l 297 -17 m 915 -17 q 788 12 844 -17 q 694 93 731 40 l 785 164 q 900 97 833 97 q 955 114 932 97 q 978 163 978 131 q 849 233 978 233 l 849 319 q 928 335 899 319 q 958 386 958 351 q 940 429 958 414 q 890 444 922 444 q 842 429 864 444 q 801 390 821 414 l 717 465 q 807 536 761 514 q 917 558 853 558 q 988 548 954 558 q 1049 518 1022 538 q 1090 470 1075 499 q 1106 407 1106 442 q 1085 334 1106 364 q 1026 282 1064 304 q 1097 233 1068 265 q 1125 151 1125 200 q 1108 83 1125 114 q 1062 30 1090 51 q 995 -4 1033 8 q 915 -17 957 -17 z \"},\"⅕\":{\"ha\":1163,\"x_min\":65,\"x_max\":1110,\"o\":\"m 189 364 l 189 754 l 65 754 l 65 846 q 115 856 93 850 q 154 868 136 861 q 188 884 172 875 q 221 906 204 893 l 340 906 l 340 364 l 189 364 m 228 -17 l 717 922 l 835 922 l 346 -17 l 228 -17 m 900 -17 q 770 12 826 -17 q 678 93 714 40 l 768 164 q 821 113 794 129 q 883 97 847 97 q 940 122 918 97 q 963 179 963 146 q 938 240 963 219 q 881 260 914 260 q 838 252 857 260 q 800 228 819 244 l 736 272 l 760 542 l 1088 542 l 1088 415 l 878 415 l 869 340 q 905 347 888 344 q 933 349 922 349 q 1001 337 969 349 q 1058 302 1033 325 q 1096 247 1082 279 q 1110 172 1110 214 q 1094 97 1110 132 q 1051 38 1079 63 q 984 -2 1022 13 q 900 -17 946 -17 z \"},\"⅖\":{\"ha\":1179,\"x_min\":40,\"x_max\":1126,\"o\":\"m 65 364 l 65 444 q 236 597 169 531 q 303 714 303 663 q 282 776 303 754 q 224 799 261 799 q 172 781 196 799 q 125 733 149 764 l 40 811 q 247 922 124 922 q 392 874 338 922 q 447 739 447 826 q 435 674 447 706 q 403 613 424 643 q 358 551 383 582 q 303 489 332 521 l 467 489 l 467 364 l 65 364 m 297 -17 l 786 922 l 904 922 l 415 -17 l 297 -17 m 917 -17 q 787 12 843 -17 q 694 93 731 40 l 785 164 q 838 113 811 129 q 900 97 864 97 q 957 122 935 97 q 979 179 979 146 q 955 240 979 219 q 897 260 931 260 q 855 252 874 260 q 817 228 836 244 l 753 272 l 776 542 l 1104 542 l 1104 415 l 894 415 l 886 340 q 922 347 904 344 q 950 349 939 349 q 1018 337 986 349 q 1074 302 1050 325 q 1113 247 1099 279 q 1126 172 1126 214 q 1111 97 1126 132 q 1067 38 1096 63 q 1001 -2 1039 13 q 917 -17 963 -17 z \"},\"⅗\":{\"ha\":1179,\"x_min\":38,\"x_max\":1126,\"o\":\"m 258 347 q 131 376 188 347 q 38 457 74 404 l 128 528 q 243 461 176 461 q 298 478 275 461 q 321 526 321 494 q 192 597 321 597 l 192 683 q 272 699 242 683 q 301 750 301 715 q 283 793 301 778 q 233 808 265 808 q 185 793 207 808 q 144 754 164 778 l 60 829 q 150 900 104 878 q 260 922 196 922 q 331 912 297 922 q 392 882 365 901 q 433 834 418 863 q 449 771 449 806 q 428 698 449 728 q 369 646 407 668 q 440 597 411 629 q 468 515 468 564 q 451 447 468 478 q 405 394 433 415 q 338 360 376 372 q 258 347 300 347 m 285 -17 l 774 922 l 892 922 l 403 -17 l 285 -17 m 917 -17 q 787 12 843 -17 q 694 93 731 40 l 785 164 q 838 113 811 129 q 900 97 864 97 q 957 122 935 97 q 979 179 979 146 q 955 240 979 219 q 897 260 931 260 q 855 252 874 260 q 817 228 836 244 l 753 272 l 776 542 l 1104 542 l 1104 415 l 894 415 l 886 340 q 922 347 904 344 q 950 349 939 349 q 1018 337 986 349 q 1074 302 1050 325 q 1113 247 1099 279 q 1126 172 1126 214 q 1111 97 1126 132 q 1067 38 1096 63 q 1001 -2 1039 13 q 917 -17 963 -17 z \"},\"⅘\":{\"ha\":1239,\"x_min\":49,\"x_max\":1186,\"o\":\"m 297 364 l 297 485 l 49 485 l 49 560 l 244 906 l 431 906 l 431 582 l 511 582 l 511 485 l 431 485 l 431 364 l 297 364 m 186 582 l 297 582 l 297 639 l 306 801 l 300 801 l 244 694 l 186 582 m 344 -17 l 833 922 l 951 922 l 463 -17 l 344 -17 m 976 -17 q 847 12 903 -17 q 754 93 790 40 l 844 164 q 897 113 871 129 q 960 97 924 97 q 1017 122 994 97 q 1039 179 1039 146 q 1015 240 1039 219 q 957 260 990 260 q 915 252 933 260 q 876 228 896 244 l 813 272 l 836 542 l 1164 542 l 1164 415 l 954 415 l 946 340 q 981 347 964 344 q 1010 349 999 349 q 1078 337 1046 349 q 1134 302 1110 325 q 1172 247 1158 279 q 1186 172 1186 214 q 1171 97 1186 132 q 1127 38 1156 63 q 1060 -2 1099 13 q 976 -17 1022 -17 z \"},\"⅙\":{\"ha\":1163,\"x_min\":65,\"x_max\":1099,\"o\":\"m 189 364 l 189 754 l 65 754 l 65 846 q 115 856 93 850 q 154 868 136 861 q 188 884 172 875 q 221 906 204 893 l 340 906 l 340 364 l 189 364 m 242 -17 l 731 922 l 849 922 l 360 -17 l 242 -17 m 907 -17 q 736 61 796 -17 q 676 268 676 139 q 693 385 676 332 q 742 478 710 439 q 822 538 775 517 q 929 558 868 558 q 1026 540 988 558 q 1089 501 1065 522 l 1031 408 q 989 434 1011 424 q 939 444 967 444 q 850 406 879 444 q 814 299 821 367 q 929 346 864 346 q 1053 300 1008 346 q 1099 175 1099 254 q 1084 99 1099 133 q 1044 38 1069 64 q 983 -2 1018 13 q 907 -17 947 -17 m 900 97 q 946 115 926 97 q 965 171 965 132 q 894 244 965 244 q 814 206 853 244 q 846 122 821 147 q 900 97 871 97 z \"},\"⅚\":{\"ha\":1179,\"x_min\":38,\"x_max\":1115,\"o\":\"m 260 347 q 130 376 186 347 q 38 457 74 404 l 128 528 q 181 477 154 493 q 243 461 207 461 q 300 485 278 461 q 322 543 322 510 q 298 603 322 583 q 240 624 274 624 q 198 616 217 624 q 160 592 179 608 l 96 636 l 119 906 l 447 906 l 447 779 l 238 779 l 229 704 q 265 710 247 708 q 293 713 282 713 q 361 701 329 713 q 417 666 393 689 q 456 610 442 643 q 469 536 469 578 q 454 461 469 496 q 410 401 439 426 q 344 362 382 376 q 260 347 306 347 m 285 -17 l 774 922 l 892 922 l 403 -17 l 285 -17 m 924 -17 q 753 61 813 -17 q 693 268 693 139 q 710 385 693 332 q 759 478 726 439 q 838 538 792 517 q 946 558 885 558 q 1043 540 1004 558 q 1106 501 1082 522 l 1047 408 q 1006 434 1028 424 q 956 444 983 444 q 867 406 896 444 q 831 299 838 367 q 946 346 881 346 q 1070 300 1025 346 q 1115 175 1115 254 q 1101 99 1115 133 q 1060 38 1086 64 q 999 -2 1035 13 q 924 -17 964 -17 m 917 97 q 963 115 943 97 q 982 171 982 132 q 911 244 982 244 q 831 206 869 244 q 863 122 838 147 q 917 97 888 97 z \"},\"⅐\":{\"ha\":1163,\"x_min\":65,\"x_max\":1118,\"o\":\"m 189 364 l 189 754 l 65 754 l 65 846 q 115 856 93 850 q 154 868 136 861 q 188 884 172 875 q 221 906 204 893 l 340 906 l 340 364 l 189 364 m 228 -17 l 717 922 l 835 922 l 346 -17 l 228 -17 m 803 0 q 817 115 807 63 q 846 217 828 168 q 890 315 864 267 q 951 417 915 363 l 710 417 l 710 542 l 1118 542 l 1118 461 q 1043 349 1072 403 q 997 240 1014 294 q 973 127 981 186 q 961 0 965 68 l 803 0 z \"},\"⅛\":{\"ha\":1163,\"x_min\":65,\"x_max\":1108,\"o\":\"m 189 364 l 189 754 l 65 754 l 65 846 q 115 856 93 850 q 154 868 136 861 q 188 884 172 875 q 221 906 204 893 l 340 906 l 340 364 l 189 364 m 242 -17 l 731 922 l 849 922 l 360 -17 l 242 -17 m 901 -17 q 817 -4 856 -17 q 751 29 779 8 q 708 78 724 50 q 693 138 693 106 q 724 221 693 185 q 793 278 756 257 l 793 283 q 735 338 757 308 q 713 410 713 368 q 727 472 713 444 q 767 519 742 500 q 828 548 793 538 q 901 558 863 558 q 976 548 942 558 q 1037 519 1011 538 q 1077 472 1063 500 q 1092 410 1092 444 q 1067 340 1092 371 q 1011 290 1043 310 l 1011 285 q 1080 226 1051 263 q 1108 139 1108 190 q 1093 78 1108 107 q 1050 29 1078 50 q 985 -4 1022 8 q 901 -17 947 -17 m 924 331 q 958 400 958 364 q 942 441 958 426 q 900 456 925 456 q 860 442 876 456 q 844 406 844 428 q 867 360 844 376 q 924 331 890 344 m 901 83 q 953 103 932 83 q 974 150 974 122 q 945 197 974 182 q 876 232 917 213 q 829 153 829 200 q 849 103 829 124 q 901 83 869 83 z \"},\"⅜\":{\"ha\":1179,\"x_min\":38,\"x_max\":1125,\"o\":\"m 258 347 q 131 376 188 347 q 38 457 74 404 l 128 528 q 243 461 176 461 q 298 478 275 461 q 321 526 321 494 q 192 597 321 597 l 192 683 q 272 699 242 683 q 301 750 301 715 q 283 793 301 778 q 233 808 265 808 q 185 793 207 808 q 144 754 164 778 l 60 829 q 150 900 104 878 q 260 922 196 922 q 331 912 297 922 q 392 882 365 901 q 433 834 418 863 q 449 771 449 806 q 428 698 449 728 q 369 646 407 668 q 440 597 411 629 q 468 515 468 564 q 451 447 468 478 q 405 394 433 415 q 338 360 376 372 q 258 347 300 347 m 285 -17 l 774 922 l 892 922 l 403 -17 l 285 -17 m 918 -17 q 834 -4 872 -17 q 768 29 796 8 q 725 78 740 50 q 710 138 710 106 q 741 221 710 185 q 810 278 772 257 l 810 283 q 751 338 774 308 q 729 410 729 368 q 744 472 729 444 q 784 519 758 500 q 844 548 810 538 q 918 558 879 558 q 993 548 958 558 q 1053 519 1028 538 q 1094 472 1079 500 q 1108 410 1108 444 q 1084 340 1108 371 q 1028 290 1060 310 l 1028 285 q 1097 226 1068 263 q 1125 139 1125 190 q 1110 78 1125 107 q 1067 29 1094 50 q 1001 -4 1039 8 q 918 -17 964 -17 m 940 331 q 975 400 975 364 q 958 441 975 426 q 917 456 942 456 q 877 442 893 456 q 861 406 861 428 q 884 360 861 376 q 940 331 907 344 m 918 83 q 969 103 949 83 q 990 150 990 122 q 962 197 990 182 q 893 232 933 213 q 846 153 846 200 q 866 103 846 124 q 918 83 886 83 z \"},\"⅝\":{\"ha\":1179,\"x_min\":38,\"x_max\":1125,\"o\":\"m 260 347 q 130 376 186 347 q 38 457 74 404 l 128 528 q 181 477 154 493 q 243 461 207 461 q 300 485 278 461 q 322 543 322 510 q 298 603 322 583 q 240 624 274 624 q 198 616 217 624 q 160 592 179 608 l 96 636 l 119 906 l 447 906 l 447 779 l 238 779 l 229 704 q 265 710 247 708 q 293 713 282 713 q 361 701 329 713 q 417 666 393 689 q 456 610 442 643 q 469 536 469 578 q 454 461 469 496 q 410 401 439 426 q 344 362 382 376 q 260 347 306 347 m 285 -17 l 774 922 l 892 922 l 403 -17 l 285 -17 m 918 -17 q 834 -4 872 -17 q 768 29 796 8 q 725 78 740 50 q 710 138 710 106 q 741 221 710 185 q 810 278 772 257 l 810 283 q 751 338 774 308 q 729 410 729 368 q 744 472 729 444 q 784 519 758 500 q 844 548 810 538 q 918 558 879 558 q 993 548 958 558 q 1053 519 1028 538 q 1094 472 1079 500 q 1108 410 1108 444 q 1084 340 1108 371 q 1028 290 1060 310 l 1028 285 q 1097 226 1068 263 q 1125 139 1125 190 q 1110 78 1125 107 q 1067 29 1094 50 q 1001 -4 1039 8 q 918 -17 964 -17 m 940 331 q 975 400 975 364 q 958 441 975 426 q 917 456 942 456 q 877 442 893 456 q 861 406 861 428 q 884 360 861 376 q 940 331 907 344 m 918 83 q 969 103 949 83 q 990 150 990 122 q 962 197 990 182 q 893 232 933 213 q 846 153 846 200 q 866 103 846 124 q 918 83 886 83 z \"},\"⅞\":{\"ha\":1151,\"x_min\":43,\"x_max\":1097,\"o\":\"m 136 364 q 151 479 140 426 q 179 581 161 532 q 223 678 197 631 q 285 781 249 726 l 43 781 l 43 906 l 451 906 l 451 825 q 376 713 406 767 q 331 604 347 658 q 306 491 314 550 q 294 364 299 432 l 136 364 m 215 -17 l 704 922 l 822 922 l 333 -17 l 215 -17 m 890 -17 q 806 -4 844 -17 q 740 29 768 8 q 697 78 713 50 q 682 138 682 106 q 713 221 682 185 q 782 278 744 257 l 782 283 q 724 338 746 308 q 701 410 701 368 q 716 472 701 444 q 756 519 731 500 q 817 548 782 538 q 890 558 851 558 q 965 548 931 558 q 1026 519 1000 538 q 1066 472 1051 500 q 1081 410 1081 444 q 1056 340 1081 371 q 1000 290 1032 310 l 1000 285 q 1069 226 1040 263 q 1097 139 1097 190 q 1082 78 1097 107 q 1039 29 1067 50 q 974 -4 1011 8 q 890 -17 936 -17 m 913 331 q 947 400 947 364 q 931 441 947 426 q 889 456 914 456 q 849 442 865 456 q 833 406 833 428 q 856 360 833 376 q 913 331 879 344 m 890 83 q 942 103 921 83 q 963 150 963 122 q 934 197 963 182 q 865 232 906 213 q 818 153 818 200 q 838 103 818 124 q 890 83 858 83 z \"},\"⅑\":{\"ha\":1163,\"x_min\":65,\"x_max\":1115,\"o\":\"m 189 364 l 189 754 l 65 754 l 65 846 q 115 856 93 850 q 154 868 136 861 q 188 884 172 875 q 221 906 204 893 l 340 906 l 340 364 l 189 364 m 242 -17 l 731 922 l 849 922 l 360 -17 l 242 -17 m 896 297 q 978 338 944 297 q 946 420 971 396 q 890 444 921 444 q 844 427 864 444 q 825 371 825 410 q 844 316 825 335 q 896 297 863 297 m 863 -17 q 765 1 803 -17 q 703 40 726 19 l 761 133 q 803 108 781 118 q 853 97 825 97 q 942 136 913 97 q 978 243 971 175 q 861 196 928 196 q 737 242 782 196 q 692 367 692 288 q 706 443 692 408 q 747 503 721 478 q 809 544 774 529 q 885 558 844 558 q 983 538 940 558 q 1056 481 1026 518 q 1100 390 1085 443 q 1115 274 1115 338 q 1098 156 1115 208 q 1049 64 1081 103 q 969 4 1017 25 q 863 -17 922 -17 z \"},\"⅒\":{\"ha\":1604,\"x_min\":64,\"x_max\":1569,\"o\":\"m 242 -17 l 731 922 l 849 922 l 360 -17 l 242 -17 m 188 364 l 188 754 l 64 754 l 64 846 q 113 856 92 850 q 153 868 135 861 q 187 884 171 875 q 219 906 203 893 l 339 906 l 339 364 l 188 364 m 853 0 l 853 390 l 729 390 l 729 482 q 778 492 757 486 q 818 504 800 497 q 852 520 836 511 q 885 542 868 529 l 1004 542 l 1004 0 l 853 0 m 1343 -17 q 1253 3 1294 -17 q 1181 60 1211 22 q 1135 151 1151 97 q 1118 272 1118 204 q 1135 393 1118 340 q 1181 483 1151 446 q 1253 539 1211 519 q 1343 558 1294 558 q 1433 539 1392 558 q 1505 483 1475 519 q 1552 393 1535 446 q 1569 272 1569 340 q 1552 151 1569 204 q 1505 60 1535 97 q 1433 3 1475 22 q 1343 -17 1392 -17 m 1343 97 q 1402 136 1378 97 q 1426 272 1426 175 q 1402 407 1426 369 q 1343 444 1378 444 q 1284 407 1308 444 q 1260 272 1260 369 q 1284 136 1260 175 q 1343 97 1308 97 z \"},\"↉\":{\"ha\":1179,\"x_min\":36,\"x_max\":1125,\"o\":\"m 261 347 q 171 367 213 347 q 99 424 129 386 q 53 515 69 461 q 36 636 36 568 q 53 757 36 704 q 99 847 69 810 q 171 903 129 883 q 261 922 213 922 q 351 903 310 922 q 423 847 393 883 q 470 757 453 810 q 488 636 488 704 q 470 515 488 568 q 423 424 453 461 q 351 367 393 386 q 261 347 310 347 m 261 461 q 320 500 296 461 q 344 636 344 539 q 320 771 344 733 q 261 808 296 808 q 202 771 226 808 q 178 636 178 733 q 202 500 178 539 q 261 461 226 461 m 285 -17 l 774 922 l 892 922 l 403 -17 l 285 -17 m 915 -17 q 788 12 844 -17 q 694 93 731 40 l 785 164 q 900 97 833 97 q 955 114 932 97 q 978 163 978 131 q 849 233 978 233 l 849 319 q 928 335 899 319 q 958 386 958 351 q 940 429 958 414 q 890 444 922 444 q 842 429 864 444 q 801 390 821 414 l 717 465 q 807 536 761 514 q 917 558 853 558 q 988 548 954 558 q 1049 518 1022 538 q 1090 470 1075 499 q 1106 407 1106 442 q 1085 334 1106 364 q 1026 282 1064 304 q 1097 233 1068 265 q 1125 151 1125 200 q 1108 83 1125 114 q 1062 30 1090 51 q 995 -4 1033 8 q 915 -17 957 -17 z \"},\"+\":{\"ha\":733,\"x_min\":47,\"x_max\":686,\"o\":\"m 292 131 l 292 386 l 47 386 l 47 531 l 292 531 l 292 786 l 442 786 l 442 531 l 686 531 l 686 386 l 442 386 l 442 131 l 292 131 z \"},\"−\":{\"ha\":733,\"x_min\":47,\"x_max\":686,\"o\":\"m 47 386 l 47 531 l 686 531 l 686 386 l 47 386 z \"},\"×\":{\"ha\":733,\"x_min\":67,\"x_max\":667,\"o\":\"m 168 156 l 67 258 l 264 457 l 67 657 l 168 760 l 367 560 l 565 760 l 667 657 l 469 457 l 667 258 l 565 156 l 367 356 l 168 156 z \"},\"÷\":{\"ha\":733,\"x_min\":47,\"x_max\":686,\"o\":\"m 47 386 l 47 531 l 686 531 l 686 386 l 47 386 m 367 101 q 286 131 318 101 q 254 208 254 161 q 286 285 254 256 q 367 315 318 315 q 447 285 415 315 q 479 208 479 256 q 447 131 479 161 q 367 101 415 101 m 367 601 q 286 631 318 601 q 254 708 254 661 q 286 785 254 756 q 367 815 318 815 q 447 785 415 815 q 479 708 479 756 q 447 631 479 661 q 367 601 415 601 z \"},\"∙\":{\"ha\":735,\"x_min\":243,\"x_max\":490,\"o\":\"m 367 328 q 278 365 314 328 q 243 456 243 401 q 278 548 243 511 q 367 585 314 585 q 455 548 419 585 q 490 456 490 511 q 455 365 490 401 q 367 328 419 328 z \"},\"=\":{\"ha\":733,\"x_min\":47,\"x_max\":686,\"o\":\"m 47 547 l 47 692 l 686 692 l 686 547 l 47 547 m 47 226 l 47 371 l 686 371 l 686 226 l 47 226 z \"},\"<\":{\"ha\":733,\"x_min\":47,\"x_max\":686,\"o\":\"m 686 144 l 47 390 l 47 532 l 686 778 l 686 610 l 442 529 l 254 464 l 254 458 l 442 393 l 686 313 l 686 144 z \"},\">\":{\"ha\":733,\"x_min\":47,\"x_max\":686,\"o\":\"m 47 144 l 47 313 l 292 393 l 479 458 l 479 464 l 292 529 l 47 610 l 47 778 l 686 532 l 686 390 l 47 144 z \"},\"≤\":{\"ha\":733,\"x_min\":47,\"x_max\":686,\"o\":\"m 686 214 l 47 411 l 47 581 l 686 778 l 686 610 l 447 546 l 254 499 l 254 493 l 447 446 l 686 382 l 686 214 m 47 0 l 47 144 l 686 144 l 686 0 l 47 0 z \"},\"≥\":{\"ha\":733,\"x_min\":47,\"x_max\":686,\"o\":\"m 47 214 l 47 382 l 286 446 l 479 493 l 479 499 l 286 546 l 47 610 l 47 778 l 686 581 l 686 411 l 47 214 m 47 0 l 47 144 l 686 144 l 686 0 l 47 0 z \"},\"±\":{\"ha\":733,\"x_min\":47,\"x_max\":686,\"o\":\"m 292 219 l 292 408 l 47 408 l 47 553 l 292 553 l 292 786 l 442 786 l 442 553 l 686 553 l 686 408 l 442 408 l 442 219 l 292 219 m 47 0 l 47 144 l 686 144 l 686 0 l 47 0 z \"},\"^\":{\"ha\":733,\"x_min\":69,\"x_max\":664,\"o\":\"m 69 381 l 285 931 l 449 931 l 664 381 l 496 381 l 432 558 l 369 746 l 364 746 l 301 558 l 238 381 l 69 381 z \"},\"≠\":{\"ha\":733,\"x_min\":47,\"x_max\":686,\"o\":\"m 72 56 l 171 225 l 47 225 l 47 368 l 251 368 l 353 549 l 47 549 l 47 692 l 432 692 l 532 861 l 663 861 l 563 692 l 686 692 l 686 549 l 482 549 l 381 368 l 686 368 l 686 225 l 301 225 l 201 56 l 72 56 z \"},\"~\":{\"ha\":733,\"x_min\":40,\"x_max\":693,\"o\":\"m 485 333 q 410 350 442 333 q 351 386 378 367 q 299 422 324 406 q 246 439 275 439 q 193 418 218 439 q 146 358 168 397 l 40 440 q 144 551 92 519 q 249 583 196 583 q 324 567 292 583 q 383 531 356 550 q 434 494 410 511 q 488 478 458 478 q 541 499 517 478 q 588 558 565 519 l 693 476 q 590 365 642 397 q 485 333 538 333 z \"},\"≈\":{\"ha\":733,\"x_min\":40,\"x_max\":693,\"o\":\"m 485 494 q 410 511 442 494 q 351 547 378 528 q 299 583 324 567 q 246 600 275 600 q 193 579 218 600 q 146 519 168 558 l 40 601 q 144 713 92 681 q 249 744 196 744 q 324 728 292 744 q 383 692 356 711 q 434 656 410 672 q 488 639 458 639 q 541 660 517 639 q 588 719 565 681 l 693 638 q 590 526 642 558 q 485 494 538 494 m 485 174 q 410 190 442 174 q 351 226 378 207 q 299 263 324 246 q 246 279 275 279 q 193 258 218 279 q 146 199 168 238 l 40 281 q 144 392 92 360 q 249 424 196 424 q 324 407 292 424 q 383 371 356 390 q 434 335 410 351 q 488 318 458 318 q 541 339 517 318 q 588 399 565 360 l 693 317 q 590 206 642 238 q 485 174 538 174 z \"},\"¬\":{\"ha\":733,\"x_min\":47,\"x_max\":686,\"o\":\"m 536 131 l 536 386 l 47 386 l 47 531 l 686 531 l 686 131 l 536 131 z \"},\"∞\":{\"ha\":1131,\"x_min\":51,\"x_max\":1079,\"o\":\"m 804 157 q 651 196 717 157 q 521 321 586 235 l 515 321 q 474 274 497 297 q 422 233 450 251 q 360 204 393 215 q 288 193 326 193 q 194 213 238 193 q 119 267 151 233 q 69 346 88 301 q 51 440 51 390 q 124 651 51 576 q 315 726 197 726 q 450 688 394 726 q 543 599 506 650 l 549 599 q 667 708 601 668 q 815 749 732 749 q 919 728 871 749 q 1002 670 967 707 q 1058 583 1038 633 q 1079 472 1079 532 q 1058 338 1079 397 q 999 239 1036 279 q 911 178 961 199 q 804 157 861 157 m 306 342 q 384 367 349 342 q 447 433 419 392 q 378 508 417 479 q 299 538 340 538 q 226 511 250 538 q 201 444 201 485 q 229 373 201 404 q 306 342 257 342 m 804 346 q 896 383 863 346 q 929 468 929 419 q 893 565 929 531 q 794 600 857 600 q 703 572 749 600 q 617 486 657 544 q 703 387 660 428 q 804 346 746 346 z \"},\"µ\":{\"ha\":825,\"x_min\":90,\"x_max\":818,\"o\":\"m 90 -246 l 90 689 l 294 689 l 294 288 q 315 185 294 214 q 379 157 335 157 q 442 177 414 157 q 497 247 469 197 l 497 689 l 703 689 q 699 562 701 628 q 694 431 696 496 q 690 308 692 367 q 689 207 689 250 q 706 161 689 174 q 750 149 722 149 q 794 157 771 149 l 818 6 q 769 -10 796 -4 q 697 -17 742 -17 q 519 99 553 -17 l 514 99 q 368 -10 463 -10 q 321 -3 343 -10 q 282 22 299 3 q 283 -50 282 -17 q 286 -115 285 -83 q 290 -178 288 -146 q 296 -246 292 -210 l 90 -246 z \"},\"∂\":{\"ha\":801,\"x_min\":67,\"x_max\":735,\"o\":\"m 339 -17 q 234 3 283 -17 q 147 58 185 22 q 88 144 110 93 q 67 257 67 194 q 89 387 67 328 q 151 488 111 446 q 245 552 190 529 q 365 575 300 575 q 460 553 414 575 q 542 490 506 531 l 542 518 q 508 697 542 636 q 390 757 474 757 q 315 741 350 757 q 247 693 279 725 l 160 819 q 277 895 215 868 q 413 922 339 922 q 553 894 493 922 q 654 815 614 867 q 715 690 694 764 q 735 524 735 617 q 706 301 735 401 q 624 131 676 201 q 499 22 572 60 q 339 -17 426 -17 m 361 149 q 459 191 414 149 q 526 339 504 233 q 461 401 496 383 q 389 419 426 419 q 292 384 331 419 q 254 269 254 349 q 287 178 254 208 q 361 149 319 149 z \"},\"∫\":{\"ha\":542,\"x_min\":58,\"x_max\":504,\"o\":\"m 138 -219 q 91 -216 113 -219 q 58 -208 69 -212 l 78 -61 q 101 -65 89 -64 q 128 -67 113 -67 q 199 -24 182 -67 q 215 118 215 19 q 207 275 215 197 q 189 431 199 353 q 171 589 179 508 q 163 756 163 669 q 173 892 163 829 q 212 1000 183 954 q 292 1072 240 1046 q 425 1099 343 1099 q 471 1095 449 1099 q 504 1089 493 1092 l 483 940 q 435 946 467 946 q 364 903 381 946 q 347 761 347 860 q 356 604 347 682 q 373 449 364 526 q 390 290 382 371 q 399 124 399 210 q 388 -12 399 50 q 349 -121 378 -75 q 270 -193 321 -167 q 138 -219 219 -219 z \"},\"√\":{\"ha\":817,\"x_min\":38,\"x_max\":826,\"o\":\"m 385 -111 l 176 460 l 74 417 l 38 513 l 279 611 l 417 203 q 432 146 425 175 q 446 89 439 117 l 451 89 q 472 203 460 149 l 690 1139 l 826 1139 l 526 -111 l 385 -111 z \"},\"∆\":{\"ha\":889,\"x_min\":47,\"x_max\":842,\"o\":\"m 47 0 l 47 124 l 322 906 l 567 906 l 842 124 l 842 0 l 47 0 m 267 172 l 617 172 l 521 478 l 443 749 l 438 749 l 361 478 l 267 172 z \"},\"Ω\":{\"ha\":988,\"x_min\":61,\"x_max\":926,\"o\":\"m 61 0 l 61 165 l 214 165 l 214 171 q 168 226 192 193 q 126 301 144 260 q 95 391 107 342 q 83 497 83 440 q 113 669 83 592 q 196 803 142 747 q 326 891 250 860 q 494 922 401 922 q 662 891 586 922 q 792 803 738 860 q 876 669 846 747 q 906 497 906 592 q 893 391 906 440 q 862 301 881 342 q 819 226 843 260 q 774 171 796 193 l 774 165 l 926 165 l 926 0 l 556 0 l 556 147 q 661 292 626 214 q 696 476 696 369 q 682 585 696 535 q 642 670 668 635 q 578 726 615 706 q 494 746 542 746 q 410 726 447 746 q 347 670 372 706 q 307 585 321 635 q 293 476 293 535 q 327 292 293 369 q 432 147 361 214 l 432 0 l 61 0 z \"},\"∑\":{\"ha\":742,\"x_min\":36,\"x_max\":729,\"o\":\"m 36 -167 l 36 -46 l 324 357 l 51 761 l 51 882 l 696 882 l 696 710 l 299 710 l 299 704 l 532 357 l 289 11 l 289 6 l 729 6 l 729 -167 l 36 -167 z \"},\"∏\":{\"ha\":986,\"x_min\":111,\"x_max\":875,\"o\":\"m 111 -167 l 111 882 l 875 882 l 875 -167 l 671 -167 l 671 704 l 315 704 l 315 -167 l 111 -167 z \"},\"ℓ\":{\"ha\":653,\"x_min\":14,\"x_max\":660,\"o\":\"m 424 -17 q 333 -4 376 -17 q 253 34 289 8 q 193 98 218 60 q 157 188 168 136 q 125 168 142 178 q 90 147 108 158 l 14 272 q 85 315 51 294 q 150 356 118 336 l 150 653 q 169 804 150 740 q 224 909 189 868 q 306 970 258 950 q 410 990 353 990 q 574 928 513 990 q 635 756 635 867 q 618 635 635 692 q 567 525 601 578 q 478 420 532 472 q 349 314 424 368 l 349 281 q 380 182 349 211 q 456 153 411 153 q 528 172 496 153 q 586 214 561 192 l 660 90 q 556 17 614 50 q 424 -17 497 -17 m 349 679 l 349 504 q 440 622 410 563 q 469 756 469 682 q 455 819 469 799 q 417 840 440 840 q 369 804 390 840 q 349 679 349 768 z \"},\"℮\":{\"ha\":1111,\"x_min\":64,\"x_max\":1049,\"o\":\"m 557 -15 q 365 22 454 -15 q 208 122 275 58 q 103 269 142 185 q 64 451 64 354 q 103 633 64 549 q 208 781 142 718 q 365 881 275 844 q 557 918 454 918 q 748 881 658 918 q 904 781 838 844 q 1010 633 971 718 q 1049 451 1049 549 l 1049 439 l 250 439 q 244 433 244 439 l 244 179 q 248 164 244 171 q 256 150 251 157 q 390 49 313 86 q 558 13 468 13 q 735 54 654 13 q 875 167 817 96 l 947 167 q 778 34 879 83 q 557 -15 676 -15 m 250 465 l 863 465 q 869 472 869 465 l 869 728 q 857 758 869 743 q 722 855 799 819 q 558 890 646 890 q 392 853 468 890 q 257 754 315 817 q 244 722 244 739 l 244 472 q 250 465 244 465 z \"},\"←\":{\"ha\":857,\"x_min\":31,\"x_max\":801,\"o\":\"m 417 -24 l 31 347 l 31 353 l 417 724 l 513 614 l 304 431 l 801 431 l 801 269 l 304 269 l 513 86 l 417 -24 z \"},\"↑\":{\"ha\":857,\"x_min\":54,\"x_max\":803,\"o\":\"m 347 -36 l 347 461 l 164 253 l 54 349 l 425 735 l 431 735 l 803 349 l 692 253 l 510 461 l 510 -36 l 347 -36 z \"},\"→\":{\"ha\":857,\"x_min\":56,\"x_max\":826,\"o\":\"m 440 -24 l 343 86 l 551 269 l 56 269 l 56 431 l 551 431 l 343 614 l 440 724 l 826 353 l 826 347 l 440 -24 z \"},\"↓\":{\"ha\":857,\"x_min\":54,\"x_max\":803,\"o\":\"m 425 -36 l 54 350 l 164 447 l 347 239 l 347 735 l 510 735 l 510 239 l 692 447 l 803 350 l 431 -36 l 425 -36 z \"},\"■\":{\"ha\":1218,\"x_min\":63,\"x_max\":1156,\"o\":\"m 63 -83 l 63 1010 l 1156 1010 l 1156 -83 l 63 -83 z \"},\"◆\":{\"ha\":1218,\"x_min\":35,\"x_max\":1183,\"o\":\"m 610 -111 l 35 464 l 610 1038 l 1183 464 l 610 -111 z \"},\"◉\":{\"ha\":1218,\"x_min\":43,\"x_max\":1175,\"o\":\"m 610 -104 q 387 -62 490 -104 q 207 54 283 -21 q 87 233 131 129 q 43 464 43 338 q 87 693 43 589 q 207 872 131 797 q 387 989 283 947 q 610 1031 490 1031 q 833 989 729 1031 q 1012 872 936 947 q 1131 693 1088 797 q 1175 464 1175 589 q 1131 233 1175 338 q 1012 54 1088 129 q 833 -62 936 -21 q 610 -104 729 -104 m 610 18 q 778 50 700 18 q 915 141 857 82 q 1007 282 974 200 q 1040 464 1040 364 q 1007 646 1040 564 q 915 786 974 728 q 778 876 857 844 q 610 908 700 908 q 440 876 519 908 q 303 786 361 844 q 211 646 244 728 q 178 464 178 564 q 211 282 178 364 q 303 141 244 200 q 440 50 361 82 q 610 18 519 18 m 610 140 q 488 165 544 140 q 389 232 431 189 q 323 335 347 275 q 299 464 299 394 q 323 591 299 532 q 389 694 347 650 q 488 762 431 738 q 610 786 544 786 q 731 762 674 786 q 829 694 788 738 q 895 591 871 650 q 919 464 919 532 q 895 334 919 393 q 829 232 871 275 q 731 165 788 189 q 610 140 674 140 z \"},\"❒\":{\"ha\":1218,\"x_min\":63,\"x_max\":1156,\"o\":\"m 63 -83 l 63 908 l 178 1010 l 1156 1010 l 1156 32 l 1054 -83 l 63 -83 m 154 8 l 1021 8 l 1021 875 l 154 875 l 154 8 z \"},\"▲\":{\"ha\":1218,\"x_min\":65,\"x_max\":1153,\"o\":\"m 65 -83 l 65 -81 l 607 1038 l 613 1038 l 1153 -81 l 1153 -83 l 65 -83 z \"},\"△\":{\"ha\":1218,\"x_min\":65,\"x_max\":1153,\"o\":\"m 65 -83 l 65 -81 l 607 1038 l 613 1038 l 1153 -81 l 1153 -83 l 65 -83 m 288 50 l 931 50 l 610 743 l 288 50 z \"},\"▶\":{\"ha\":1218,\"x_min\":63,\"x_max\":1183,\"o\":\"m 63 -81 l 63 1007 l 65 1007 l 1183 467 l 1183 461 l 65 -81 l 63 -81 z \"},\"▷\":{\"ha\":1218,\"x_min\":63,\"x_max\":1183,\"o\":\"m 63 -81 l 63 1007 l 65 1007 l 1183 467 l 1183 461 l 65 -81 l 63 -81 m 196 142 l 894 464 l 196 785 l 196 142 z \"},\"▼\":{\"ha\":1218,\"x_min\":65,\"x_max\":1153,\"o\":\"m 1153 1010 l 1153 1007 l 613 -111 l 607 -111 l 65 1007 l 65 1010 l 1153 1010 z \"},\"▽\":{\"ha\":1218,\"x_min\":65,\"x_max\":1153,\"o\":\"m 1153 1010 l 1153 1007 l 613 -111 l 607 -111 l 65 1007 l 65 1010 l 1153 1010 m 931 876 l 288 876 l 610 183 l 931 876 z \"},\"◀\":{\"ha\":1218,\"x_min\":35,\"x_max\":1156,\"o\":\"m 1156 1007 l 1156 -81 l 1153 -81 l 35 461 l 35 467 l 1153 1007 l 1156 1007 z \"},\"◁\":{\"ha\":1218,\"x_min\":35,\"x_max\":1156,\"o\":\"m 1156 1007 l 1156 -81 l 1153 -81 l 35 461 l 35 467 l 1153 1007 l 1156 1007 m 1022 785 l 324 464 l 1022 142 l 1022 785 z \"},\"☐\":{\"ha\":1121,\"x_min\":103,\"x_max\":1018,\"o\":\"m 103 -14 l 103 847 l 207 938 l 1018 938 l 1018 90 l 928 -14 l 103 -14 m 183 67 l 894 67 l 894 814 l 183 814 l 183 67 z \"},\"☑\":{\"ha\":1121,\"x_min\":103,\"x_max\":1124,\"o\":\"m 456 150 q 371 344 417 256 q 261 528 325 433 l 392 613 q 473 459 439 536 q 535 303 507 382 l 540 303 q 638 570 581 442 q 764 814 694 699 l 183 814 l 183 67 l 894 67 l 894 739 q 758 485 821 625 q 647 172 694 344 l 456 150 m 103 -14 l 103 847 l 207 938 l 843 938 q 919 1040 881 992 q 999 1129 958 1088 l 1124 1019 q 1071 967 1097 994 q 1018 907 1044 939 l 1018 90 l 928 -14 l 103 -14 z \"},\"✓\":{\"ha\":899,\"x_min\":10,\"x_max\":900,\"o\":\"m 229 -28 q 184 84 207 31 q 135 188 161 138 q 78 287 108 238 q 10 388 47 336 l 140 472 q 237 299 194 386 q 314 125 279 213 l 319 125 q 406 368 357 250 q 514 593 456 486 q 638 792 572 700 q 775 956 704 883 l 900 847 q 761 696 829 781 q 631 505 693 611 q 516 272 569 399 q 421 -6 463 144 l 229 -28 z \"},\"♪\":{\"ha\":756,\"x_min\":35,\"x_max\":735,\"o\":\"m 190 -39 q 133 -32 161 -39 q 84 -10 106 -25 q 49 26 63 4 q 35 81 35 49 q 53 151 35 118 q 103 210 71 185 q 178 249 135 235 q 271 264 221 264 q 321 259 299 264 q 353 247 343 254 l 353 964 l 461 964 q 474 942 467 951 q 491 924 481 933 q 518 902 501 914 q 561 872 535 890 q 643 806 610 839 q 697 740 676 774 q 726 670 717 707 q 735 592 735 633 q 714 478 735 533 q 667 386 693 422 l 599 414 q 614 475 610 446 q 618 542 618 504 q 608 603 618 572 q 578 659 597 633 q 530 706 558 685 q 465 739 501 726 l 465 238 q 391 31 465 101 q 190 -39 317 -39 z \"},\"◊\":{\"ha\":761,\"x_min\":72,\"x_max\":689,\"o\":\"m 297 -14 l 72 458 l 297 931 l 464 931 l 689 458 l 464 -14 l 297 -14 m 378 157 l 383 157 l 458 325 l 521 458 l 458 592 l 383 760 l 378 760 l 303 592 l 240 458 l 303 325 l 378 157 z \"},\"′\":{\"ha\":417,\"x_min\":114,\"x_max\":344,\"o\":\"m 114 539 l 140 953 l 344 951 l 313 776 l 247 539 l 114 539 z \"},\"″\":{\"ha\":746,\"x_min\":114,\"x_max\":674,\"o\":\"m 114 539 l 140 953 l 344 951 l 313 776 l 247 539 l 114 539 m 443 539 l 469 953 l 674 951 l 642 776 l 576 539 l 443 539 z \"},\"‵\":{\"ha\":417,\"x_min\":74,\"x_max\":303,\"o\":\"m 303 539 l 169 539 l 104 776 l 74 951 l 276 953 l 303 539 z \"},\"ʹ\":{\"ha\":417,\"x_min\":114,\"x_max\":344,\"o\":\"m 114 539 l 140 953 l 344 951 l 313 776 l 247 539 l 114 539 z \"},\"ʻ\":{\"ha\":417,\"x_min\":76,\"x_max\":318,\"o\":\"m 207 469 q 109 517 142 469 q 76 651 76 565 q 125 825 76 750 q 274 949 174 900 l 318 860 q 224 787 256 828 q 193 683 193 746 q 207 685 197 685 q 283 658 251 685 q 314 583 314 631 q 283 500 314 531 q 207 469 253 469 z \"},\"ʼ\":{\"ha\":417,\"x_min\":99,\"x_max\":342,\"o\":\"m 143 489 l 99 578 q 192 651 161 610 q 224 754 224 692 q 211 753 219 753 q 135 780 167 753 q 104 854 104 807 q 134 938 104 907 q 211 968 164 968 q 308 921 275 968 q 342 786 342 874 q 292 613 342 688 q 143 489 243 538 z \"},\"ʾ\":{\"ha\":244,\"x_min\":36,\"x_max\":229,\"o\":\"m 36 764 l 36 840 q 108 858 88 838 q 129 908 129 878 q 108 958 129 939 q 36 976 88 978 l 36 1051 q 183 1015 138 1056 q 229 908 229 975 q 183 801 229 842 q 36 764 138 760 z \"},\"ʿ\":{\"ha\":244,\"x_min\":17,\"x_max\":210,\"o\":\"m 210 764 q 63 801 108 760 q 17 908 17 842 q 63 1015 17 975 q 210 1051 108 1056 l 210 976 q 138 958 158 978 q 117 908 117 939 q 138 858 117 878 q 210 840 158 838 l 210 764 z \"},\"`\":{\"ha\":771,\"x_min\":121,\"x_max\":472,\"o\":\"m 372 794 l 121 1013 l 258 1147 l 472 894 l 372 794 z \"},\"´\":{\"ha\":771,\"x_min\":300,\"x_max\":651,\"o\":\"m 400 794 l 300 894 l 514 1147 l 651 1013 l 400 794 z \"},\"ˆ\":{\"ha\":771,\"x_min\":132,\"x_max\":640,\"o\":\"m 132 851 l 282 1033 l 490 1033 l 640 851 l 563 779 l 389 907 l 383 907 l 210 779 l 132 851 z \"},\"ˇ\":{\"ha\":771,\"x_min\":132,\"x_max\":640,\"o\":\"m 282 801 l 132 983 l 210 1056 l 383 928 l 389 928 l 563 1056 l 640 983 l 490 801 l 282 801 z \"},\"ˈ\":{\"ha\":204,\"x_min\":21,\"x_max\":185,\"o\":\"m 29 750 l 21 1033 l 185 1033 l 176 750 l 29 750 z \"},\"ˉ\":{\"ha\":428,\"x_min\":8,\"x_max\":419,\"o\":\"m 8 822 l 8 951 l 419 951 l 419 822 l 8 822 z \"},\"ˊ\":{\"ha\":328,\"x_min\":78,\"x_max\":429,\"o\":\"m 178 794 l 78 894 l 292 1147 l 429 1013 l 178 794 z \"},\"ˋ\":{\"ha\":328,\"x_min\":-101,\"x_max\":250,\"o\":\"m 150 794 l -101 1013 l 36 1147 l 250 894 l 150 794 z \"},\"ˌ\":{\"ha\":204,\"x_min\":21,\"x_max\":185,\"o\":\"m 21 -374 l 29 -89 l 176 -89 l 185 -374 l 21 -374 z \"},\"˜\":{\"ha\":771,\"x_min\":122,\"x_max\":650,\"o\":\"m 478 796 q 419 810 444 796 q 372 840 393 824 q 333 871 350 857 q 299 885 315 885 q 266 867 278 885 q 250 808 254 849 l 122 815 q 169 975 125 924 q 294 1026 214 1026 q 353 1013 328 1026 q 401 982 379 999 q 440 951 422 965 q 474 938 457 938 q 522 1014 514 938 l 650 1007 q 603 847 647 899 q 478 796 558 796 z \"},\"¨\":{\"ha\":771,\"x_min\":135,\"x_max\":638,\"o\":\"m 235 790 q 163 819 190 790 q 135 890 135 847 q 163 960 135 932 q 235 989 190 989 q 306 960 279 989 q 333 890 333 932 q 306 819 333 847 q 235 790 279 790 m 538 790 q 466 819 493 790 q 439 890 439 847 q 466 960 439 932 q 538 989 493 989 q 610 960 582 989 q 638 890 638 932 q 610 819 638 847 q 538 790 582 790 z \"},\"¯\":{\"ha\":771,\"x_min\":181,\"x_max\":592,\"o\":\"m 181 822 l 181 951 l 592 951 l 592 822 l 181 822 z \"},\"˘\":{\"ha\":771,\"x_min\":151,\"x_max\":621,\"o\":\"m 386 794 q 283 811 326 794 q 211 858 240 828 q 167 927 182 888 q 151 1013 153 967 l 268 1032 q 303 955 275 988 q 386 922 331 922 q 469 955 442 922 q 504 1032 497 988 l 621 1013 q 605 927 619 967 q 562 858 590 888 q 490 811 533 828 q 386 794 446 794 z \"},\"˚\":{\"ha\":771,\"x_min\":203,\"x_max\":569,\"o\":\"m 386 783 q 249 825 294 783 q 203 928 203 867 q 249 1031 203 989 q 386 1072 294 1072 q 524 1031 478 1072 q 569 928 569 989 q 524 825 569 867 q 386 783 478 783 m 386 860 q 428 878 411 860 q 446 928 446 897 q 428 977 446 958 q 386 996 411 996 q 344 977 361 996 q 326 928 326 958 q 344 878 326 897 q 386 860 361 860 z \"},\"˝\":{\"ha\":771,\"x_min\":207,\"x_max\":714,\"o\":\"m 314 785 l 207 833 l 328 1085 l 465 1024 l 314 785 m 563 785 l 456 833 l 576 1085 l 714 1024 l 563 785 z \"},\"˙\":{\"ha\":771,\"x_min\":274,\"x_max\":499,\"o\":\"m 386 790 q 305 820 336 790 q 274 897 274 850 q 305 974 274 944 q 386 1004 336 1004 q 467 974 436 1004 q 499 897 499 944 q 467 820 499 850 q 386 790 436 790 z \"},\"¸\":{\"ha\":771,\"x_min\":231,\"x_max\":519,\"o\":\"m 246 -332 l 231 -250 q 343 -232 313 -246 q 374 -189 374 -218 q 352 -153 374 -168 q 267 -131 331 -139 l 333 6 l 453 6 l 414 -85 q 493 -121 467 -97 q 519 -189 519 -144 q 448 -294 519 -260 q 246 -332 376 -328 z \"},\"˛\":{\"ha\":771,\"x_min\":267,\"x_max\":554,\"o\":\"m 414 -292 q 309 -260 351 -292 q 267 -165 267 -228 q 277 -108 267 -135 q 302 -60 288 -82 q 333 -23 317 -39 q 364 3 350 -7 l 479 3 q 404 -118 404 -56 q 422 -158 404 -146 q 463 -171 440 -171 q 489 -166 476 -171 q 511 -154 501 -161 l 554 -246 q 486 -279 526 -267 q 414 -292 446 -292 z \"},\"◌\":{\"ha\":801,\"x_min\":50,\"x_max\":753,\"o\":\"m 146 133 q 107 149 124 133 q 90 193 90 165 q 107 237 90 221 q 146 253 124 253 q 189 237 172 253 q 206 193 206 221 q 190 149 206 165 q 146 133 174 133 m 107 285 q 67 301 83 285 q 50 346 50 317 q 67 389 50 374 q 107 404 83 404 q 151 389 133 404 q 168 346 168 374 q 151 301 168 317 q 107 285 135 285 m 146 436 q 107 453 124 436 q 90 497 90 469 q 107 542 90 528 q 146 557 124 557 q 189 542 172 557 q 206 497 206 528 q 190 453 206 469 q 146 436 174 436 m 254 19 q 213 35 231 19 q 196 82 196 51 q 213 124 196 110 q 254 139 231 139 q 296 124 278 139 q 314 82 314 110 q 297 35 314 51 q 254 19 281 19 m 254 550 q 213 565 231 550 q 196 608 196 581 q 213 654 196 639 q 254 669 231 669 q 296 654 278 669 q 314 608 314 639 q 297 565 314 581 q 254 550 281 550 m 400 -18 q 361 -2 378 -18 q 344 44 344 14 q 361 87 344 72 q 400 101 378 101 q 443 87 426 101 q 460 44 460 72 q 444 -2 460 14 q 400 -18 428 -18 m 400 586 q 361 603 378 586 q 344 647 344 619 q 361 690 344 675 q 400 706 378 706 q 443 690 426 706 q 460 647 460 675 q 444 603 460 619 q 400 586 428 586 m 547 19 q 506 35 524 19 q 489 82 489 51 q 506 124 489 110 q 547 139 524 139 q 589 124 571 139 q 607 82 607 110 q 591 35 607 51 q 547 19 575 19 m 547 549 q 506 565 524 549 q 489 608 489 581 q 506 653 489 638 q 547 669 524 669 q 589 653 571 669 q 607 608 607 638 q 591 565 607 581 q 547 549 575 549 m 657 133 q 615 149 633 133 q 597 193 597 165 q 615 237 597 221 q 657 253 633 253 q 698 237 681 253 q 715 193 715 221 q 699 149 715 165 q 657 133 683 133 m 694 285 q 652 301 669 285 q 635 346 635 317 q 652 389 635 374 q 694 404 669 404 q 735 389 718 404 q 753 346 753 374 q 736 301 753 317 q 694 285 719 285 m 657 436 q 615 452 633 436 q 597 496 597 468 q 615 540 597 525 q 657 556 633 556 q 698 540 681 556 q 715 496 715 525 q 699 452 715 468 q 657 436 683 436 z \"},\"̀\":{\"ha\":0,\"x_min\":-265,\"x_max\":86,\"o\":\"m -14 794 l -265 1013 l -128 1147 l 86 894 l -14 794 z \"},\"́\":{\"ha\":0,\"x_min\":-86,\"x_max\":265,\"o\":\"m 14 794 l -86 894 l 128 1147 l 265 1013 l 14 794 z \"},\"̂\":{\"ha\":0,\"x_min\":-254,\"x_max\":254,\"o\":\"m -254 851 l -104 1033 l 104 1033 l 254 851 l 176 779 l 3 907 l -3 907 l -176 779 l -254 851 z \"},\"̃\":{\"ha\":0,\"x_min\":-264,\"x_max\":264,\"o\":\"m 92 796 q 33 810 58 796 q -15 840 7 824 q -53 871 -36 857 q -87 885 -71 885 q -120 867 -108 885 q -136 808 -132 849 l -264 815 q -217 975 -261 924 q -92 1026 -172 1026 q -33 1013 -58 1026 q 15 982 -7 999 q 53 951 36 965 q 88 938 71 938 q 136 1014 128 938 l 264 1007 q 217 847 261 899 q 92 796 172 796 z \"},\"̄\":{\"ha\":0,\"x_min\":-206,\"x_max\":206,\"o\":\"m -206 822 l -206 951 l 206 951 l 206 822 l -206 822 z \"},\"̅\":{\"ha\":0,\"x_min\":-206,\"x_max\":206,\"o\":\"m -206 822 l -206 951 l 206 951 l 206 822 l -206 822 z \"},\"̆\":{\"ha\":0,\"x_min\":-235,\"x_max\":235,\"o\":\"m 0 794 q -103 811 -60 794 q -175 858 -146 828 q -219 927 -204 888 q -235 1013 -233 967 l -118 1032 q -83 955 -111 988 q 0 922 -56 922 q 83 955 56 922 q 118 1032 111 988 l 235 1013 q 219 927 233 967 q 176 858 204 888 q 103 811 147 828 q 0 794 60 794 z \"},\"̇\":{\"ha\":0,\"x_min\":-112,\"x_max\":113,\"o\":\"m 0 790 q -81 820 -50 790 q -112 897 -112 850 q -81 974 -112 944 q 0 1004 -50 1004 q 81 974 50 1004 q 113 897 113 944 q 81 820 113 850 q 0 790 50 790 z \"},\"̈\":{\"ha\":0,\"x_min\":-251,\"x_max\":251,\"o\":\"m -151 790 q -224 819 -196 790 q -251 890 -251 847 q -224 960 -251 932 q -151 989 -196 989 q -80 960 -107 989 q -53 890 -53 932 q -80 819 -53 847 q -151 790 -107 790 m 151 790 q 80 819 107 790 q 53 890 53 847 q 80 960 53 932 q 151 989 107 989 q 224 960 196 989 q 251 890 251 932 q 224 819 251 847 q 151 790 196 790 z \"},\"̉\":{\"ha\":0,\"x_min\":-125,\"x_max\":135,\"o\":\"m -60 789 l -76 869 q -32 885 -50 875 q -14 918 -14 896 q -39 958 -14 943 q -125 976 -64 972 l -112 1101 q 3 1087 -44 1100 q 79 1052 50 1074 q 122 1000 108 1031 q 135 933 135 969 q 119 872 135 897 q 76 828 103 846 q 15 801 50 811 q -60 789 -21 792 z \"},\"̊\":{\"ha\":0,\"x_min\":-183,\"x_max\":183,\"o\":\"m 0 783 q -137 825 -92 783 q -183 928 -183 867 q -137 1031 -183 989 q 0 1072 -92 1072 q 138 1031 92 1072 q 183 928 183 989 q 138 825 183 867 q 0 783 92 783 m 0 860 q 42 878 25 860 q 60 928 60 897 q 42 977 60 958 q 0 996 25 996 q -42 977 -25 996 q -60 928 -60 958 q -42 878 -60 897 q 0 860 -25 860 z \"},\"̋\":{\"ha\":0,\"x_min\":-179,\"x_max\":328,\"o\":\"m -72 785 l -179 833 l -58 1085 l 79 1024 l -72 785 m 176 785 l 69 833 l 190 1085 l 328 1024 l 176 785 z \"},\"̌\":{\"ha\":0,\"x_min\":-254,\"x_max\":254,\"o\":\"m -104 801 l -254 983 l -176 1056 l -3 928 l 3 928 l 176 1056 l 254 983 l 104 801 l -104 801 z \"},\"̏\":{\"ha\":0,\"x_min\":-328,\"x_max\":179,\"o\":\"m -176 785 l -328 1024 l -190 1085 l -69 833 l -176 785 m 72 785 l -79 1024 l 58 1085 l 179 833 l 72 785 z \"},\"̑\":{\"ha\":0,\"x_min\":-235,\"x_max\":235,\"o\":\"m -118 785 l -235 804 q -219 890 -233 850 q -176 959 -204 929 q -103 1006 -147 989 q 0 1022 -60 1022 q 103 1006 60 1022 q 175 959 146 989 q 219 890 204 929 q 235 804 233 850 l 118 785 q 83 863 111 829 q 0 896 56 896 q -83 863 -56 896 q -118 785 -111 829 z \"},\"̒\":{\"ha\":0,\"x_min\":-94,\"x_max\":74,\"o\":\"m -3 814 q -94 928 -94 814 q -61 1033 -94 986 q 43 1108 -28 1081 l 74 1046 q -12 963 -4 1017 q -3 964 -10 964 q 49 945 26 964 q 71 893 71 926 q 49 835 71 856 q -3 814 28 814 z \"},\"̓\":{\"ha\":0,\"x_min\":-78,\"x_max\":90,\"o\":\"m -47 808 l -78 871 q 8 954 0 900 q -3 953 6 953 q -53 972 -32 953 q -75 1024 -75 990 q -53 1082 -75 1061 q -1 1103 -32 1103 q 90 989 90 1103 q 57 883 90 931 q -47 808 24 836 z \"},\"̘\":{\"ha\":0,\"x_min\":-121,\"x_max\":138,\"o\":\"m 138 -357 l 29 -357 l 29 -265 l -121 -265 l -121 -167 l 29 -167 l 29 -75 l 138 -75 l 138 -357 z \"},\"̙\":{\"ha\":0,\"x_min\":-137,\"x_max\":121,\"o\":\"m 121 -265 l -29 -265 l -29 -357 l -137 -357 l -137 -75 l -29 -75 l -29 -167 l 121 -167 l 121 -265 z \"},\"̚\":{\"ha\":0,\"x_min\":-121,\"x_max\":138,\"o\":\"m 138 797 l 29 797 l 29 907 l -121 907 l -121 1006 l 138 1006 l 138 797 z \"},\"̛\":{\"ha\":0,\"x_min\":-14,\"x_max\":250,\"o\":\"m 1 593 l -14 675 q 53 706 28 683 q 79 776 79 728 q 72 821 79 800 q 57 857 65 842 l 208 922 q 237 865 224 900 q 250 792 250 831 q 230 706 250 742 q 176 647 210 671 q 97 610 142 622 q 1 593 51 597 z \"},\"̜\":{\"ha\":0,\"x_min\":-106,\"x_max\":88,\"o\":\"m 88 -362 q -60 -326 -14 -367 q -106 -218 -106 -285 q -60 -111 -106 -151 q 88 -75 -14 -71 l 88 -150 q 15 -168 36 -149 q -6 -218 -6 -187 q 15 -269 -6 -249 q 88 -286 36 -289 l 88 -362 z \"},\"̝\":{\"ha\":0,\"x_min\":-149,\"x_max\":149,\"o\":\"m 149 -318 l -149 -318 l -149 -219 l -54 -219 l -54 -75 l 54 -75 l 54 -219 l 149 -219 l 149 -318 z \"},\"̞\":{\"ha\":0,\"x_min\":-149,\"x_max\":149,\"o\":\"m 149 -211 l 54 -211 l 54 -357 l -54 -357 l -54 -211 l -149 -211 l -149 -114 l 149 -114 l 149 -211 z \"},\"̟\":{\"ha\":0,\"x_min\":-149,\"x_max\":149,\"o\":\"m 149 -265 l 54 -265 l 54 -357 l -54 -357 l -54 -265 l -149 -265 l -149 -167 l -54 -167 l -54 -75 l 54 -75 l 54 -167 l 149 -167 l 149 -265 z \"},\"̠\":{\"ha\":0,\"x_min\":-149,\"x_max\":149,\"o\":\"m -149 -265 l -149 -167 l 149 -167 l 149 -265 l -149 -265 z \"},\"̣\":{\"ha\":0,\"x_min\":-112,\"x_max\":113,\"o\":\"m 0 -312 q -81 -283 -50 -312 q -112 -206 -112 -253 q -81 -128 -112 -158 q 0 -99 -50 -99 q 81 -128 50 -99 q 113 -206 113 -158 q 81 -283 113 -253 q 0 -312 50 -312 z \"},\"̤\":{\"ha\":0,\"x_min\":-251,\"x_max\":251,\"o\":\"m -151 -301 q -224 -273 -196 -301 q -251 -201 -251 -244 q -224 -131 -251 -160 q -151 -103 -196 -103 q -80 -131 -107 -103 q -53 -201 -53 -160 q -80 -273 -53 -244 q -151 -301 -107 -301 m 151 -301 q 80 -273 107 -301 q 53 -201 53 -244 q 80 -131 53 -160 q 151 -103 107 -103 q 224 -131 196 -103 q 251 -201 251 -160 q 224 -273 251 -244 q 151 -301 196 -301 z \"},\"̥\":{\"ha\":0,\"x_min\":-183,\"x_max\":183,\"o\":\"m 0 -342 q -137 -300 -92 -342 q -183 -197 -183 -258 q -137 -94 -183 -136 q 0 -53 -92 -53 q 138 -94 92 -53 q 183 -197 183 -136 q 138 -300 183 -258 q 0 -342 92 -342 m 0 -265 q 42 -247 25 -265 q 60 -197 60 -228 q 42 -148 60 -167 q 0 -129 25 -129 q -42 -148 -25 -129 q -60 -197 -60 -167 q -42 -247 -60 -228 q 0 -265 -25 -265 z \"},\"̦\":{\"ha\":0,\"x_min\":-157,\"x_max\":132,\"o\":\"m -142 -332 l -157 -250 q -44 -233 -75 -246 q -14 -196 -14 -219 q -35 -164 -14 -176 q -103 -147 -56 -151 l -64 -72 q 90 -110 47 -82 q 132 -189 132 -137 q 60 -294 132 -260 q -142 -332 -11 -328 z \"},\"̧\":{\"ha\":0,\"x_min\":-157,\"x_max\":132,\"o\":\"m -142 -332 l -157 -250 q -44 -232 -75 -246 q -14 -189 -14 -218 q -35 -153 -14 -168 q -121 -131 -57 -139 l -54 6 l 65 6 l 26 -85 q 106 -121 79 -97 q 132 -189 132 -144 q 60 -294 132 -260 q -142 -332 -11 -328 z \"},\"̨\":{\"ha\":0,\"x_min\":-119,\"x_max\":168,\"o\":\"m 28 -292 q -77 -260 -35 -292 q -119 -165 -119 -228 q -109 -108 -119 -135 q -84 -60 -99 -82 q -53 -23 -69 -39 q -22 3 -36 -7 l 93 3 q 18 -118 18 -56 q 36 -158 18 -146 q 76 -171 54 -171 q 103 -166 90 -171 q 125 -154 115 -161 l 168 -246 q 100 -279 140 -267 q 28 -292 60 -292 z \"},\"̩\":{\"ha\":0,\"x_min\":-82,\"x_max\":82,\"o\":\"m -82 -374 l -74 -89 l 74 -89 l 82 -374 l -82 -374 z \"},\"̪\":{\"ha\":0,\"x_min\":-178,\"x_max\":178,\"o\":\"m 76 -306 l 76 -207 l -76 -207 l -76 -306 l -178 -306 l -178 -108 l 178 -108 l 178 -306 l 76 -306 z \"},\"̬\":{\"ha\":0,\"x_min\":-254,\"x_max\":254,\"o\":\"m -104 -311 l -254 -129 l -176 -57 l -3 -185 l 3 -185 l 176 -57 l 254 -129 l 104 -311 l -104 -311 z \"},\"̮\":{\"ha\":0,\"x_min\":-235,\"x_max\":235,\"o\":\"m 0 -322 q -103 -306 -60 -322 q -175 -259 -146 -289 q -219 -190 -204 -229 q -235 -104 -233 -150 l -118 -85 q -83 -162 -111 -129 q 0 -194 -56 -194 q 83 -162 56 -194 q 118 -85 111 -129 l 235 -104 q 219 -190 233 -150 q 176 -259 204 -229 q 103 -306 147 -289 q 0 -322 60 -322 z \"},\"̯\":{\"ha\":0,\"x_min\":-235,\"x_max\":235,\"o\":\"m -118 -342 l -235 -322 q -219 -237 -233 -276 q -176 -167 -204 -197 q -103 -121 -147 -137 q 0 -104 -60 -104 q 103 -121 60 -104 q 175 -167 146 -137 q 219 -237 204 -197 q 235 -322 233 -276 l 118 -342 q 83 -264 111 -297 q 0 -231 56 -231 q -83 -264 -56 -231 q -118 -342 -111 -297 z \"},\"̰\":{\"ha\":0,\"x_min\":-264,\"x_max\":264,\"o\":\"m 92 -314 q 33 -300 58 -314 q -15 -269 7 -286 q -53 -239 -36 -253 q -87 -225 -71 -225 q -120 -243 -108 -225 q -136 -301 -132 -261 l -264 -294 q -217 -135 -261 -186 q -92 -83 -172 -83 q -33 -97 -58 -83 q 15 -128 -7 -111 q 53 -158 36 -144 q 88 -172 71 -172 q 136 -96 128 -172 l 264 -103 q 217 -262 261 -211 q 92 -314 172 -314 z \"},\"̱\":{\"ha\":0,\"x_min\":-206,\"x_max\":206,\"o\":\"m -206 -260 l -206 -131 l 206 -131 l 206 -260 l -206 -260 z \"},\"̴\":{\"ha\":0,\"x_min\":-264,\"x_max\":264,\"o\":\"m 92 247 q 33 261 58 247 q -15 292 7 275 q -53 322 -36 308 q -87 336 -71 336 q -120 318 -108 336 q -136 260 -132 300 l -264 267 q -217 426 -261 375 q -92 478 -172 478 q -33 464 -58 478 q 15 433 -7 450 q 53 403 36 417 q 88 389 71 389 q 136 465 128 389 l 264 458 q 217 299 261 350 q 92 247 172 247 z \"},\"̹\":{\"ha\":0,\"x_min\":-87,\"x_max\":106,\"o\":\"m -87 -362 l -87 -286 q -15 -269 -36 -289 q 6 -218 6 -249 q -15 -168 6 -187 q -87 -150 -36 -149 l -87 -75 q 60 -111 14 -71 q 106 -218 106 -151 q 60 -326 106 -285 q -87 -362 14 -367 z \"},\"̺\":{\"ha\":0,\"x_min\":-178,\"x_max\":178,\"o\":\"m -178 -297 l -178 -100 l -76 -100 l -76 -199 l 76 -199 l 76 -100 l 178 -100 l 178 -297 l -178 -297 z \"},\"̻\":{\"ha\":0,\"x_min\":-178,\"x_max\":178,\"o\":\"m -178 -343 l -178 -92 l 178 -92 l 178 -343 l -178 -343 m -76 -268 l 76 -268 l 76 -165 l -76 -165 l -76 -268 z \"},\"̼\":{\"ha\":0,\"x_min\":-261,\"x_max\":261,\"o\":\"m -260 -326 q -108 -106 -261 -106 q -43 -124 -71 -106 q -3 -179 -15 -142 l 3 -179 q 44 -124 15 -142 q 108 -106 72 -106 q 224 -160 188 -106 q 260 -326 261 -214 l 156 -340 q 142 -253 156 -275 q 101 -232 128 -232 q 60 -253 72 -232 q 49 -308 49 -275 l 49 -339 l -49 -339 l -49 -308 q -60 -253 -49 -275 q -103 -232 -72 -232 q -142 -253 -129 -232 q -156 -340 -156 -275 l -260 -326 z \"},\"̽\":{\"ha\":0,\"x_min\":-140,\"x_max\":140,\"o\":\"m -71 751 l -140 819 l -69 890 l -140 961 l -71 1031 l 0 960 l 71 1031 l 140 961 l 69 890 l 140 819 l 71 751 l 0 822 l -71 751 z \"},\"͂\":{\"ha\":0,\"x_min\":-264,\"x_max\":264,\"o\":\"m 92 796 q 33 810 58 796 q -15 840 7 824 q -53 871 -36 857 q -87 885 -71 885 q -120 867 -108 885 q -136 808 -132 849 l -264 815 q -217 975 -261 924 q -92 1026 -172 1026 q -33 1013 -58 1026 q 15 982 -7 999 q 53 951 36 965 q 88 938 71 938 q 136 1014 128 938 l 264 1007 q 217 847 261 899 q 92 796 172 796 z \"},\"ͅ\":{\"ha\":0,\"x_min\":-79,\"x_max\":160,\"o\":\"m 75 -300 q -45 -252 -11 -300 q -79 -124 -79 -204 l -79 -76 l 68 -76 q 65 -107 65 -92 q 65 -132 65 -122 q 80 -169 65 -160 q 117 -178 94 -178 q 126 -178 122 -178 q 140 -175 131 -178 l 160 -285 q 124 -296 144 -292 q 75 -300 104 -300 z \"},\"͡\":{\"ha\":0,\"x_min\":-635,\"x_max\":635,\"o\":\"m -582 744 l -635 838 q -330 967 -492 925 q 0 1010 -168 1010 q 330 967 168 1010 q 635 838 492 925 l 582 744 q 439 808 514 782 q 288 850 364 835 q 139 872 213 865 q 0 879 65 879 q -139 872 -65 879 q -288 850 -212 865 q -439 808 -364 835 q -582 744 -514 782 z \"},\" \":{\"ha\":289,\"x_min\":0,\"x_max\":0,\"o\":\"\"},\" \":{\"ha\":733,\"x_min\":0,\"x_max\":0,\"o\":\"\"},\" \":{\"ha\":174,\"x_min\":0,\"x_max\":0,\"o\":\"\"},\"﻿\":{\"ha\":0,\"x_min\":0,\"x_max\":0,\"o\":\"\"},\"ﬁ\":{\"ha\":882,\"x_min\":33,\"x_max\":808,\"o\":\"m 125 0 l 125 529 l 33 529 l 33 681 l 125 688 l 125 725 q 138 828 125 779 q 182 913 151 876 q 261 969 213 949 q 379 990 310 990 q 458 982 422 990 q 517 965 493 974 l 479 815 q 408 829 440 829 q 350 806 371 829 q 329 731 329 783 l 329 689 l 453 689 l 453 529 l 329 529 l 329 0 l 125 0 m 589 0 l 589 689 l 793 689 l 793 0 l 589 0 m 690 790 q 606 820 639 790 q 572 897 572 850 q 606 974 572 944 q 690 1003 639 1003 q 776 974 743 1003 q 808 897 808 944 q 776 820 808 850 q 690 790 743 790 z \"},\"ﬂ\":{\"ha\":871,\"x_min\":33,\"x_max\":854,\"o\":\"m 125 0 l 125 529 l 33 529 l 33 681 l 125 688 l 125 725 q 138 828 125 779 q 182 913 151 876 q 261 969 213 949 q 379 990 310 990 q 458 982 422 990 q 517 965 493 974 l 479 815 q 408 829 440 829 q 350 806 371 829 q 329 731 329 783 l 329 689 l 453 689 l 453 529 l 329 529 l 329 0 l 125 0 m 751 -17 q 663 0 699 -17 q 605 47 626 17 q 574 119 583 76 q 564 214 564 161 l 564 974 l 768 974 l 768 206 q 780 161 768 174 q 804 149 792 149 q 816 149 811 149 q 829 151 821 149 l 854 0 q 812 -12 838 -7 q 751 -17 786 -17 z \"}},\"familyName\":\"Source Sans Pro\",\"ascender\":1367,\"descender\":-379,\"underlinePosition\":-75,\"underlineThickness\":50,\"boundingBox\":{\"yMin\":-315,\"xMin\":-457,\"yMax\":1009,\"xMax\":2157},\"resolution\":1000,\"original_font_information\":{\"format\":0,\"copyright\":\"Copyright 2010, 2012, 2014 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name ‘Source’.\",\"fontFamily\":\"Source Sans Pro\",\"fontSubfamily\":\"Bold\",\"uniqueID\":\"2.020;ADBO;SourceSansPro-Bold;ADOBE\",\"fullName\":\"Source Sans Pro Bold\",\"version\":\"Version 2.020;PS 2.000;hotconv 1.0.86;makeotf.lib2.5.63406\",\"postScriptName\":\"SourceSansPro-Bold\",\"trademark\":\"Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries.\",\"manufacturer\":\"Adobe Systems Incorporated\",\"designer\":\"Paul D. Hunt\",\"manufacturerURL\":\"http://www.adobe.com/type\",\"licence\":\"This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFL. This Font Software is distributed on an ‘AS IS’ BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the SIL Open Font License for the specific language, permissions and limitations governing your use of this Font Software.\",\"licenceURL\":\"http://scripts.sil.org/OFL\",\"unknown1\":\"Slashed zero\",\"unknown2\":\"Straight l\",\"unknown3\":\"Alternate a\",\"unknown4\":\"Alternate g\",\"unknown5\":\"Serifed I\"},\"cssFontWeight\":\"bold\",\"cssFontStyle\":\"normal\"}"
  },
  {
    "path": "browser/data/fonts/Source Sans Pro_Regular.json",
    "content": "{\"glyphs\":{\"0\":{\"ha\":690,\"x_min\":61,\"x_max\":629,\"o\":\"m 346 -17 q 136 103 211 -17 q 61 446 61 222 q 136 786 61 669 q 346 903 211 903 q 554 786 479 903 q 629 446 629 669 q 554 103 629 222 q 346 -17 479 -17 m 346 75 q 416 97 385 75 q 470 163 447 118 q 506 278 493 208 q 518 446 518 349 q 506 613 518 543 q 470 726 493 682 q 416 790 447 769 q 346 811 385 811 q 275 790 307 811 q 220 726 243 769 q 185 613 197 682 q 172 446 172 543 q 220 163 172 251 q 346 75 268 75 z \"},\"1\":{\"ha\":690,\"x_min\":110,\"x_max\":610,\"o\":\"m 110 0 l 110 94 l 313 94 l 313 747 l 151 747 l 151 821 q 258 848 213 832 q 339 886 303 864 l 426 886 l 426 94 l 610 94 l 610 0 l 110 0 z \"},\"2\":{\"ha\":690,\"x_min\":50,\"x_max\":628,\"o\":\"m 56 0 l 56 68 q 233 249 156 168 q 364 398 311 329 q 444 524 417 467 q 472 636 472 582 q 431 761 472 713 q 304 810 389 810 q 201 778 249 810 q 115 703 154 747 l 50 768 q 168 866 106 829 q 318 903 231 903 q 513 831 442 903 q 583 642 583 760 q 556 516 583 579 q 481 385 529 453 q 367 245 433 318 q 222 90 301 172 q 297 96 258 93 q 371 99 336 99 l 628 99 l 628 0 l 56 0 z \"},\"3\":{\"ha\":690,\"x_min\":36,\"x_max\":619,\"o\":\"m 328 -17 q 231 -6 275 -17 q 151 22 188 4 q 87 61 115 39 q 36 108 58 83 l 94 183 q 188 110 135 142 q 321 78 242 78 q 453 122 401 78 q 504 240 504 165 q 490 312 504 279 q 442 368 475 344 q 354 404 408 392 q 221 417 300 417 l 221 504 q 340 517 292 504 q 417 551 388 529 q 460 604 447 574 q 472 669 472 635 q 431 772 472 735 q 319 810 390 810 q 217 785 264 810 q 131 719 171 760 l 69 792 q 183 872 121 840 q 324 903 244 903 q 431 888 382 903 q 515 844 479 872 q 569 774 550 815 q 589 678 589 732 q 544 546 589 597 q 428 467 500 494 l 428 461 q 503 433 468 451 q 564 385 538 414 q 605 319 590 357 q 619 236 619 282 q 597 131 619 178 q 534 51 574 83 q 442 1 494 18 q 328 -17 389 -17 z \"},\"4\":{\"ha\":690,\"x_min\":24,\"x_max\":651,\"o\":\"m 422 0 l 422 244 l 24 244 l 24 319 l 403 886 l 531 886 l 531 336 l 651 336 l 651 244 l 531 244 l 531 0 l 422 0 m 144 336 l 422 336 l 422 593 q 424 678 422 629 q 429 764 426 728 l 424 764 q 389 701 407 732 q 351 639 371 671 l 144 336 z \"},\"5\":{\"ha\":690,\"x_min\":35,\"x_max\":624,\"o\":\"m 325 -17 q 228 -6 272 -17 q 149 21 185 4 q 85 59 114 38 q 35 104 57 81 l 90 179 q 183 108 129 139 q 314 78 236 78 q 390 92 354 78 q 451 133 425 107 q 493 197 478 160 q 508 281 508 235 q 457 424 508 372 q 319 475 406 475 q 241 461 274 475 q 168 421 208 447 l 107 460 l 136 886 l 579 886 l 579 788 l 236 788 l 213 525 q 276 551 244 542 q 349 561 308 561 q 456 544 406 561 q 543 494 506 528 q 602 408 581 460 q 624 283 624 356 q 599 156 624 211 q 532 62 574 100 q 437 3 490 24 q 325 -17 383 -17 z \"},\"6\":{\"ha\":690,\"x_min\":67,\"x_max\":635,\"o\":\"m 372 -17 q 251 10 307 -17 q 155 90 196 36 q 90 223 114 143 q 67 410 67 303 q 94 637 67 543 q 169 790 122 731 q 277 876 217 849 q 404 903 338 903 q 528 876 476 903 q 618 808 581 849 l 554 738 q 488 788 526 769 q 408 807 450 807 q 321 788 363 807 q 247 724 279 768 q 196 608 215 679 q 175 431 176 536 q 272 512 217 482 q 382 542 328 542 q 566 474 497 542 q 635 268 635 406 q 614 152 635 204 q 557 63 593 100 q 474 4 521 25 q 372 -17 426 -17 m 372 74 q 433 88 406 74 q 482 127 461 101 q 515 188 503 153 q 526 268 526 224 q 486 406 526 356 q 363 456 446 456 q 269 428 319 456 q 178 339 219 401 q 238 141 189 208 q 372 74 288 74 z \"},\"7\":{\"ha\":690,\"x_min\":61,\"x_max\":632,\"o\":\"m 246 0 q 268 229 251 125 q 315 427 285 333 q 391 608 344 521 q 503 788 438 696 l 61 788 l 61 886 l 632 886 l 632 815 q 503 624 553 715 q 425 437 454 532 q 383 235 396 342 q 364 0 369 129 l 246 0 z \"},\"8\":{\"ha\":690,\"x_min\":57,\"x_max\":633,\"o\":\"m 347 -17 q 231 1 285 -17 q 140 52 178 19 q 79 129 101 85 q 57 226 57 174 q 72 306 57 269 q 109 373 86 343 q 162 426 132 403 q 224 465 192 449 l 224 471 q 138 555 175 506 q 100 675 100 604 q 119 768 100 726 q 172 840 139 810 q 251 886 206 869 q 351 903 297 903 q 456 885 410 903 q 534 837 501 868 q 584 762 567 806 q 601 667 601 718 q 590 600 601 632 q 560 540 578 568 q 522 490 543 513 q 479 453 500 468 l 479 447 q 536 409 508 431 q 585 360 564 388 q 620 299 607 333 q 633 219 633 264 q 613 126 633 169 q 554 51 592 83 q 464 1 517 19 q 347 -17 411 -17 m 410 483 q 478 568 454 524 q 503 661 503 613 q 463 773 503 728 q 349 818 422 818 q 246 779 286 818 q 206 675 206 740 q 222 606 206 635 q 267 556 239 578 q 333 516 296 533 q 410 483 369 499 m 350 68 q 476 111 428 68 q 524 224 524 154 q 504 297 524 267 q 451 351 485 328 q 374 392 418 374 q 283 431 331 411 q 195 347 231 394 q 160 238 160 299 q 174 169 160 200 q 215 116 189 139 q 275 81 240 93 q 350 68 310 68 z \"},\"9\":{\"ha\":690,\"x_min\":56,\"x_max\":622,\"o\":\"m 326 431 q 420 458 371 431 q 513 549 469 486 q 451 746 501 679 q 317 813 401 813 q 256 799 285 813 q 207 759 228 785 q 174 697 186 733 q 163 618 163 661 q 203 481 163 531 q 326 431 243 431 m 285 -17 q 160 10 214 -17 q 71 76 107 36 l 135 149 q 201 97 163 117 q 281 78 239 78 q 369 97 328 78 q 443 162 411 117 q 494 279 475 207 q 515 458 514 351 q 418 375 474 406 q 307 344 363 344 q 124 413 192 344 q 56 618 56 481 q 76 734 56 682 q 133 824 97 786 q 216 882 168 861 q 317 903 264 903 q 438 876 382 903 q 535 797 494 850 q 599 663 576 743 q 622 476 622 583 q 594 249 622 343 q 519 97 567 156 q 412 10 472 38 q 285 -17 351 -17 z \"},\" \":{\"ha\":278,\"x_min\":0,\"x_max\":0,\"o\":\"\"},\"A\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 z \"},\"B\":{\"ha\":817,\"x_min\":125,\"x_max\":761,\"o\":\"m 125 0 l 125 911 l 396 911 q 523 899 465 911 q 622 860 581 886 q 685 791 663 833 q 708 689 708 749 q 674 566 708 621 q 575 490 640 511 l 575 485 q 710 415 658 469 q 761 267 761 361 q 736 150 761 200 q 665 67 711 100 q 556 17 619 33 q 415 0 492 0 l 125 0 m 240 524 l 375 524 q 543 564 492 524 q 594 674 594 604 q 541 786 594 753 q 381 819 488 819 l 240 819 l 240 524 m 240 92 l 399 92 q 582 135 517 92 q 647 271 647 179 q 583 395 647 356 q 399 435 519 435 l 240 435 l 240 92 z \"},\"C\":{\"ha\":793,\"x_min\":72,\"x_max\":749,\"o\":\"m 469 -17 q 311 15 383 -17 q 185 108 239 47 q 102 256 132 168 q 72 456 72 344 q 103 653 72 565 q 188 801 133 740 q 315 895 242 863 q 476 928 389 928 q 623 894 560 928 q 726 815 686 860 l 664 740 q 582 803 628 779 q 478 826 536 826 q 360 801 413 826 q 269 727 307 775 q 212 611 232 679 q 192 458 192 543 q 212 303 192 372 q 268 186 232 235 q 356 111 304 138 q 474 85 408 85 q 590 112 540 85 q 685 188 640 139 l 749 115 q 626 18 694 53 q 469 -17 558 -17 z \"},\"D\":{\"ha\":854,\"x_min\":125,\"x_max\":783,\"o\":\"m 125 0 l 125 911 l 353 911 q 674 794 564 911 q 783 460 783 678 q 756 266 783 351 q 674 122 728 181 q 540 31 619 63 q 358 0 461 0 l 125 0 m 240 94 l 344 94 q 584 190 504 94 q 664 460 664 286 q 584 725 664 633 q 344 817 504 817 l 240 817 l 240 94 z \"},\"E\":{\"ha\":732,\"x_min\":125,\"x_max\":664,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 z \"},\"F\":{\"ha\":686,\"x_min\":125,\"x_max\":650,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 506 l 588 506 l 588 408 l 240 408 l 240 0 l 125 0 z \"},\"G\":{\"ha\":857,\"x_min\":72,\"x_max\":764,\"o\":\"m 483 -17 q 317 15 393 -17 q 188 108 242 47 q 103 256 133 168 q 72 456 72 344 q 103 653 72 565 q 190 801 135 740 q 323 895 246 863 q 490 928 400 928 q 577 918 538 928 q 649 892 617 908 q 708 856 682 876 q 753 815 733 836 l 689 740 q 608 801 654 776 q 493 826 563 826 q 368 801 424 826 q 274 727 313 775 q 213 611 235 679 q 192 458 192 543 q 212 303 192 372 q 270 186 232 235 q 365 111 308 138 q 494 85 421 85 q 587 99 543 85 q 658 139 631 114 l 658 376 l 465 376 l 465 472 l 764 472 l 764 89 q 647 13 719 43 q 483 -17 575 -17 z \"},\"H\":{\"ha\":906,\"x_min\":125,\"x_max\":781,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 529 l 664 529 l 664 911 l 781 911 l 781 0 l 664 0 l 664 429 l 240 429 l 240 0 l 125 0 z \"},\"I\":{\"ha\":365,\"x_min\":125,\"x_max\":240,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 0 l 125 0 z \"},\"J\":{\"ha\":667,\"x_min\":43,\"x_max\":546,\"o\":\"m 294 -17 q 43 129 124 -17 l 126 188 q 196 109 157 133 q 283 85 235 85 q 393 130 357 85 q 429 279 429 175 l 429 911 l 546 911 l 546 268 q 531 158 546 210 q 487 67 517 106 q 409 6 457 28 q 294 -17 361 -17 z \"},\"K\":{\"ha\":804,\"x_min\":125,\"x_max\":799,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 454 l 244 454 l 624 911 l 754 911 l 469 564 l 799 0 l 669 0 l 397 474 l 240 289 l 240 0 l 125 0 z \"},\"L\":{\"ha\":675,\"x_min\":125,\"x_max\":639,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 99 l 639 99 l 639 0 l 125 0 z \"},\"M\":{\"ha\":1010,\"x_min\":125,\"x_max\":885,\"o\":\"m 125 0 l 125 911 l 264 911 l 439 425 q 472 330 456 378 q 504 235 488 282 l 510 235 q 541 330 526 282 q 572 425 556 378 l 744 911 l 885 911 l 885 0 l 776 0 l 776 501 q 782 636 776 563 q 792 771 788 710 l 786 771 l 714 564 l 542 92 l 465 92 l 293 564 l 221 771 l 215 771 q 224 636 219 710 q 229 501 229 563 l 229 0 l 125 0 z \"},\"N\":{\"ha\":899,\"x_min\":125,\"x_max\":774,\"o\":\"m 125 0 l 125 911 l 244 911 l 574 339 l 672 150 l 678 150 q 669 294 674 219 q 664 440 664 368 l 664 911 l 774 911 l 774 0 l 654 0 l 324 574 l 225 761 l 219 761 q 230 620 225 692 q 235 476 235 549 l 235 0 l 125 0 z \"},\"O\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 17 375 -17 q 181 112 232 50 q 101 262 129 174 q 72 460 72 350 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 823 262 851 350 q 742 112 794 174 q 619 17 690 50 q 461 -17 547 -17 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 z \"},\"P\":{\"ha\":786,\"x_min\":125,\"x_max\":726,\"o\":\"m 125 0 l 125 911 l 385 911 q 524 897 461 911 q 632 852 588 883 q 701 769 676 821 q 726 643 726 718 q 702 518 726 571 q 633 431 678 465 q 527 378 589 396 q 390 361 465 361 l 240 361 l 240 0 l 125 0 m 240 456 l 376 456 q 553 501 496 456 q 611 643 611 546 q 551 780 611 742 q 371 818 490 818 l 240 818 l 240 456 z \"},\"Q\":{\"ha\":922,\"x_min\":72,\"x_max\":871,\"o\":\"m 461 79 q 572 106 522 79 q 656 182 621 132 q 711 302 692 232 q 731 460 731 372 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 302 192 372 q 266 182 231 232 q 351 106 301 132 q 461 79 400 79 m 740 -229 q 624 -213 678 -229 q 528 -168 571 -197 q 455 -99 486 -139 q 404 -12 424 -60 q 268 35 329 -3 q 163 133 207 72 q 96 277 119 194 q 72 460 72 360 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 828 280 851 361 q 763 138 806 199 q 661 40 721 78 q 529 -11 601 1 q 619 -102 561 -72 q 753 -132 678 -132 q 806 -128 783 -132 q 849 -119 829 -125 l 871 -208 q 815 -223 850 -217 q 740 -229 781 -229 z \"},\"R\":{\"ha\":790,\"x_min\":125,\"x_max\":756,\"o\":\"m 125 0 l 125 911 l 410 911 q 538 898 479 911 q 640 854 597 885 q 706 775 682 824 q 729 656 729 726 q 674 485 729 549 q 524 397 618 421 l 756 0 l 625 0 l 406 385 l 240 385 l 240 0 l 125 0 m 240 479 l 393 479 q 557 523 500 479 q 614 656 614 567 q 557 782 614 746 q 393 818 500 818 l 240 818 l 240 479 z \"},\"S\":{\"ha\":742,\"x_min\":58,\"x_max\":688,\"o\":\"m 378 -17 q 200 19 282 -17 q 58 118 118 56 l 128 199 q 242 116 176 147 q 379 85 308 85 q 519 126 469 85 q 569 233 569 167 q 558 292 569 268 q 526 334 546 317 q 478 365 506 351 q 418 394 450 379 l 288 451 q 222 485 256 465 q 163 532 189 504 q 119 598 136 560 q 103 686 103 636 q 124 782 103 738 q 184 859 146 826 q 274 910 222 892 q 389 928 326 928 q 540 897 471 928 q 658 815 610 865 l 596 740 q 503 803 554 781 q 389 826 453 826 q 266 791 313 826 q 219 693 219 756 q 233 637 219 660 q 268 597 246 614 q 317 566 290 579 q 371 542 343 553 l 500 486 q 574 448 539 469 q 633 398 608 426 q 673 331 658 369 q 688 243 688 293 q 666 142 688 189 q 604 59 644 94 q 507 3 564 24 q 378 -17 450 -17 z \"},\"T\":{\"ha\":744,\"x_min\":39,\"x_max\":706,\"o\":\"m 314 0 l 314 814 l 39 814 l 39 911 l 706 911 l 706 814 l 431 814 l 431 0 l 314 0 z \"},\"U\":{\"ha\":896,\"x_min\":121,\"x_max\":775,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 775 911 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 z \"},\"V\":{\"ha\":715,\"x_min\":0,\"x_max\":715,\"o\":\"m 292 0 l 0 911 l 124 911 l 269 419 q 313 268 294 338 q 358 118 332 199 l 364 118 q 408 268 389 199 q 451 419 428 338 l 597 911 l 715 911 l 426 0 l 292 0 z \"},\"W\":{\"ha\":1092,\"x_min\":32,\"x_max\":1058,\"o\":\"m 225 0 l 32 911 l 151 911 l 247 415 q 274 268 260 340 q 300 121 288 196 l 306 121 q 338 269 321 196 q 369 415 354 342 l 496 911 l 601 911 l 728 415 q 761 269 744 343 q 794 121 778 196 l 800 121 q 825 269 813 196 q 851 415 838 342 l 947 911 l 1058 911 l 869 0 l 731 0 l 593 549 q 570 652 581 601 q 549 756 560 703 l 543 756 q 520 652 532 703 q 497 549 508 601 l 363 0 l 225 0 z \"},\"X\":{\"ha\":713,\"x_min\":21,\"x_max\":692,\"o\":\"m 21 0 l 286 471 l 39 911 l 167 911 l 290 678 q 324 616 308 646 q 361 546 340 586 l 367 546 q 401 616 386 586 q 432 678 415 646 l 553 911 l 675 911 l 426 465 l 692 0 l 564 0 l 431 246 q 394 315 413 279 q 353 392 375 350 l 347 392 q 310 315 328 350 q 275 246 292 279 l 143 0 l 21 0 z \"},\"Y\":{\"ha\":661,\"x_min\":-1,\"x_max\":663,\"o\":\"m 272 0 l 272 353 l -1 911 l 122 911 l 240 654 q 283 556 263 604 q 328 456 304 507 l 333 456 q 381 556 357 507 q 425 654 404 604 l 542 911 l 663 911 l 389 353 l 389 0 l 272 0 z \"},\"Z\":{\"ha\":749,\"x_min\":63,\"x_max\":690,\"o\":\"m 63 0 l 63 69 l 542 814 l 106 814 l 106 911 l 686 911 l 686 843 l 206 99 l 690 99 l 690 0 l 63 0 z \"},\"a\":{\"ha\":700,\"x_min\":72,\"x_max\":601,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 z \"},\"b\":{\"ha\":768,\"x_min\":114,\"x_max\":704,\"o\":\"m 413 -17 q 315 6 365 -17 q 219 69 264 29 l 215 69 l 206 0 l 114 0 l 114 989 l 228 989 l 228 719 l 225 597 q 325 665 271 638 q 436 692 379 692 q 551 667 501 692 q 635 598 601 643 q 687 490 669 553 q 704 349 704 426 q 681 194 704 263 q 617 79 657 126 q 524 8 576 32 q 413 -17 471 -17 m 393 79 q 470 98 435 79 q 531 151 506 117 q 572 235 557 185 q 586 347 586 285 q 576 449 586 403 q 545 527 567 494 q 490 578 524 560 q 408 596 456 596 q 228 504 326 596 l 228 150 q 316 95 272 111 q 393 79 360 79 z \"},\"c\":{\"ha\":633,\"x_min\":64,\"x_max\":599,\"o\":\"m 381 -17 q 256 7 314 -17 q 155 76 197 31 q 88 187 113 121 q 64 336 64 253 q 90 487 64 421 q 161 599 117 553 q 265 668 206 644 q 389 692 324 692 q 503 668 456 692 q 586 613 550 644 l 528 538 q 466 581 499 564 q 393 597 433 597 q 308 578 347 597 q 242 525 269 560 q 198 442 214 490 q 182 336 182 394 q 197 231 182 278 q 240 149 213 183 q 306 97 267 115 q 390 78 344 78 q 477 98 438 78 q 549 146 517 118 l 599 69 q 497 6 553 29 q 381 -17 442 -17 z \"},\"d\":{\"ha\":771,\"x_min\":65,\"x_max\":657,\"o\":\"m 344 -17 q 141 75 217 -17 q 65 336 65 167 q 90 484 65 418 q 154 596 114 550 q 247 667 194 642 q 358 692 300 692 q 460 671 417 692 q 547 614 503 650 l 542 729 l 542 989 l 657 989 l 657 0 l 563 0 l 553 79 l 549 79 q 456 12 508 40 q 344 -17 404 -17 m 369 79 q 458 102 417 79 q 542 172 500 125 l 542 525 q 459 580 499 564 q 378 596 419 596 q 302 577 338 596 q 240 524 267 558 q 199 443 214 490 q 183 338 183 396 q 232 147 183 215 q 369 79 281 79 z \"},\"e\":{\"ha\":689,\"x_min\":64,\"x_max\":636,\"o\":\"m 388 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 511 4 565 25 q 388 -17 457 -17 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 z \"},\"f\":{\"ha\":406,\"x_min\":42,\"x_max\":443,\"o\":\"m 133 0 l 133 582 l 42 582 l 42 668 l 133 675 l 133 782 q 181 946 133 886 q 331 1006 229 1006 q 391 999 363 1006 q 443 983 419 993 l 418 896 q 342 913 381 913 q 247 782 247 913 l 247 675 l 390 675 l 390 582 l 247 582 l 247 0 l 133 0 z \"},\"g\":{\"ha\":700,\"x_min\":63,\"x_max\":683,\"o\":\"m 342 -311 q 228 -299 279 -311 q 140 -264 176 -287 q 83 -207 103 -240 q 63 -129 63 -174 q 89 -47 63 -86 q 161 24 115 -8 l 161 29 q 119 72 136 44 q 101 139 101 99 q 125 214 101 182 q 175 264 149 246 l 175 269 q 115 344 142 297 q 88 451 88 390 q 108 551 88 507 q 163 627 128 596 q 244 675 197 658 q 342 692 290 692 q 394 687 369 692 q 438 675 418 682 l 672 675 l 672 588 l 533 588 q 573 528 557 564 q 589 449 589 492 q 569 351 589 394 q 517 277 550 307 q 438 231 483 247 q 342 214 393 214 q 290 220 317 214 q 240 238 264 226 q 210 203 222 222 q 197 157 197 185 q 222 104 197 125 q 317 83 247 83 l 447 83 q 624 45 565 83 q 683 -78 683 7 q 660 -167 683 -125 q 592 -242 636 -210 q 484 -292 547 -274 q 342 -311 421 -311 m 342 290 q 397 301 371 290 q 442 333 422 313 q 474 384 463 354 q 485 451 485 414 q 443 567 485 526 q 342 608 401 608 q 240 567 282 608 q 199 451 199 526 q 210 384 199 414 q 241 333 221 354 q 287 301 261 313 q 342 290 313 290 m 358 -232 q 447 -220 407 -232 q 514 -190 486 -208 q 557 -146 542 -171 q 572 -94 572 -121 q 538 -29 572 -47 q 436 -11 503 -11 l 319 -11 q 277 -9 300 -11 q 232 0 254 -7 q 179 -56 196 -26 q 163 -114 163 -85 q 215 -200 163 -168 q 358 -232 267 -232 z \"},\"h\":{\"ha\":756,\"x_min\":114,\"x_max\":654,\"o\":\"m 114 0 l 114 989 l 228 989 l 228 719 l 224 581 q 325 659 272 626 q 449 692 378 692 q 605 625 556 692 q 654 428 654 558 l 654 0 l 540 0 l 540 413 q 510 551 540 508 q 413 593 479 593 q 319 567 360 593 q 228 489 279 540 l 228 0 l 114 0 z \"},\"i\":{\"ha\":342,\"x_min\":93,\"x_max\":251,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 0 l 114 0 m 172 814 q 116 835 139 814 q 93 888 93 856 q 116 941 93 921 q 172 961 139 961 q 228 941 206 961 q 251 888 251 921 q 228 835 251 856 q 172 814 206 814 z \"},\"j\":{\"ha\":343,\"x_min\":-56,\"x_max\":251,\"o\":\"m 44 -301 q -12 -296 13 -301 q -56 -283 -37 -290 l -32 -197 q -3 -205 -19 -201 q 32 -208 14 -208 q 99 -174 82 -208 q 115 -76 115 -139 l 115 675 l 229 675 l 229 -76 q 188 -240 229 -179 q 44 -301 146 -301 m 174 814 q 117 835 140 814 q 94 888 94 856 q 117 941 94 921 q 174 961 140 961 q 228 941 206 961 q 251 888 251 921 q 228 835 251 856 q 174 814 206 814 z \"},\"k\":{\"ha\":688,\"x_min\":114,\"x_max\":675,\"o\":\"m 114 0 l 114 989 l 226 989 l 226 319 l 231 319 l 518 675 l 644 675 l 418 404 l 675 0 l 550 0 l 353 325 l 226 178 l 226 0 l 114 0 z \"},\"l\":{\"ha\":354,\"x_min\":114,\"x_max\":300,\"o\":\"m 235 -17 q 142 22 169 -17 q 114 136 114 61 l 114 989 l 228 989 l 228 128 q 238 89 228 100 q 260 78 247 78 q 270 78 265 78 q 285 81 275 78 l 300 -6 q 274 -14 289 -11 q 235 -17 258 -17 z \"},\"m\":{\"ha\":1151,\"x_min\":114,\"x_max\":1046,\"o\":\"m 114 0 l 114 675 l 208 675 l 218 578 l 222 578 q 319 659 267 626 q 432 692 371 692 q 553 658 510 692 q 618 563 597 624 q 724 656 671 621 q 840 692 778 692 q 995 625 944 692 q 1046 428 1046 558 l 1046 0 l 932 0 l 932 413 q 901 551 932 508 q 807 593 871 593 q 638 489 731 593 l 638 0 l 524 0 l 524 413 q 493 551 524 508 q 397 593 463 593 q 228 489 321 593 l 228 0 l 114 0 z \"},\"n\":{\"ha\":760,\"x_min\":114,\"x_max\":654,\"o\":\"m 114 0 l 114 675 l 208 675 l 218 578 l 222 578 q 324 659 271 626 q 449 692 378 692 q 605 625 556 692 q 654 428 654 558 l 654 0 l 540 0 l 540 413 q 510 551 540 508 q 413 593 479 593 q 319 567 360 593 q 228 489 279 540 l 228 0 l 114 0 z \"},\"o\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 495 668 439 692 q 594 599 551 644 q 663 487 638 553 q 689 336 689 421 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 z \"},\"p\":{\"ha\":771,\"x_min\":114,\"x_max\":704,\"o\":\"m 114 -285 l 114 675 l 208 675 l 218 597 l 222 597 q 323 664 268 636 q 438 692 378 692 q 553 667 503 692 q 636 598 603 643 q 687 490 669 553 q 704 347 704 426 q 681 194 704 261 q 617 79 657 126 q 524 8 576 32 q 413 -17 471 -17 q 319 4 365 -17 q 225 61 272 25 l 228 -57 l 228 -285 l 114 -285 m 393 79 q 470 98 435 79 q 531 151 506 117 q 572 235 557 185 q 586 347 586 285 q 576 449 586 403 q 545 527 567 494 q 490 578 524 560 q 408 596 456 596 q 322 572 365 596 q 228 504 278 549 l 228 150 q 317 95 274 111 q 393 79 360 79 z \"},\"q\":{\"ha\":771,\"x_min\":65,\"x_max\":657,\"o\":\"m 542 -285 l 542 -44 l 547 78 q 455 10 507 38 q 344 -17 403 -17 q 141 75 217 -17 q 65 336 65 167 q 90 484 65 418 q 154 596 114 550 q 247 667 194 642 q 358 692 300 692 q 461 672 417 692 q 551 611 506 651 l 554 611 l 565 675 l 657 675 l 657 -285 l 542 -285 m 369 79 q 458 102 417 79 q 542 172 500 125 l 542 525 q 459 580 499 564 q 378 596 419 596 q 302 577 338 596 q 240 524 267 558 q 199 443 214 490 q 183 338 183 396 q 232 147 183 215 q 369 79 281 79 z \"},\"r\":{\"ha\":482,\"x_min\":114,\"x_max\":486,\"o\":\"m 114 0 l 114 675 l 208 675 l 218 553 l 222 553 q 306 654 257 617 q 414 692 356 692 q 486 678 454 692 l 464 578 q 433 586 447 583 q 399 589 419 589 q 309 554 356 589 q 228 433 263 519 l 228 0 l 114 0 z \"},\"s\":{\"ha\":582,\"x_min\":39,\"x_max\":538,\"o\":\"m 290 -17 q 153 10 218 -17 q 39 76 88 36 l 96 153 q 187 94 140 117 q 294 72 233 72 q 394 103 361 72 q 428 178 428 133 q 414 224 428 204 q 378 258 400 243 q 329 283 357 272 q 274 306 301 294 q 201 334 238 318 q 137 373 165 350 q 90 426 108 396 q 72 500 72 457 q 88 576 72 540 q 134 637 104 611 q 207 677 164 663 q 304 692 250 692 q 422 669 368 692 q 514 615 475 647 l 460 543 q 388 586 425 569 q 306 603 350 603 q 212 574 242 603 q 182 506 182 544 q 194 465 182 482 q 228 434 207 447 q 276 410 249 421 q 332 389 303 400 q 405 360 368 375 q 471 322 442 344 q 519 265 500 299 q 538 185 538 232 q 522 107 538 143 q 474 43 506 71 q 397 -1 443 15 q 290 -17 350 -17 z \"},\"t\":{\"ha\":469,\"x_min\":33,\"x_max\":451,\"o\":\"m 326 -17 q 235 0 272 -17 q 176 46 199 17 q 143 117 153 75 q 133 208 133 158 l 133 582 l 33 582 l 33 668 l 139 675 l 153 864 l 249 864 l 249 675 l 431 675 l 431 582 l 249 582 l 249 207 q 272 110 249 144 q 353 76 294 76 q 392 82 371 76 q 429 94 413 88 l 451 8 q 391 -9 424 -1 q 326 -17 358 -17 z \"},\"u\":{\"ha\":756,\"x_min\":104,\"x_max\":642,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 642 675 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 z \"},\"v\":{\"ha\":649,\"x_min\":17,\"x_max\":632,\"o\":\"m 260 0 l 17 675 l 135 675 l 263 292 q 294 192 278 242 q 325 93 310 142 l 331 93 q 361 192 346 142 q 392 292 376 242 l 519 675 l 632 675 l 393 0 l 260 0 z \"},\"w\":{\"ha\":997,\"x_min\":33,\"x_max\":964,\"o\":\"m 221 0 l 33 675 l 150 675 l 250 285 q 271 190 261 236 q 290 97 281 144 l 296 97 q 318 191 307 144 q 342 285 329 238 l 446 675 l 557 675 l 663 285 q 687 190 675 236 q 710 97 699 144 l 715 97 q 736 190 726 144 q 757 285 746 236 l 856 675 l 964 675 l 783 0 l 644 0 l 547 363 q 524 458 535 411 q 501 557 514 506 l 496 557 q 474 458 485 506 q 449 361 463 410 l 354 0 l 221 0 z \"},\"x\":{\"ha\":619,\"x_min\":19,\"x_max\":600,\"o\":\"m 19 0 l 240 353 l 36 675 l 160 675 l 250 526 q 282 470 265 499 q 317 414 299 442 l 322 414 q 353 470 338 442 q 383 526 368 499 l 465 675 l 585 675 l 381 340 l 600 0 l 476 0 l 378 157 q 342 218 360 188 q 304 278 324 249 l 299 278 q 264 219 281 249 q 231 157 247 189 l 139 0 l 19 0 z \"},\"y\":{\"ha\":649,\"x_min\":17,\"x_max\":632,\"o\":\"m 125 -290 q 82 -287 101 -290 q 46 -276 63 -283 l 68 -186 q 93 -192 79 -189 q 119 -196 107 -196 q 215 -155 178 -196 q 272 -51 251 -114 l 288 -1 l 17 675 l 135 675 l 272 301 q 305 208 288 257 q 338 111 322 158 l 343 111 q 372 207 358 157 q 400 301 386 257 l 521 675 l 632 675 l 378 -56 q 338 -149 360 -106 q 285 -223 315 -192 q 215 -272 254 -254 q 125 -290 176 -290 z \"},\"z\":{\"ha\":590,\"x_min\":43,\"x_max\":554,\"o\":\"m 43 0 l 43 61 l 399 582 l 82 582 l 82 675 l 543 675 l 543 614 l 188 93 l 554 93 l 554 0 l 43 0 z \"},\"À\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 400 968 l 189 1128 l 254 1204 l 451 1026 l 400 968 z \"},\"Á\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 353 968 l 301 1026 l 499 1204 l 564 1128 l 353 968 z \"},\"Â\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 171 1007 l 317 1164 l 436 1164 l 582 1007 l 532 971 l 379 1100 l 374 1100 l 221 971 l 171 1007 z \"},\"Ã\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 481 985 q 414 1000 442 985 q 363 1034 386 1015 q 320 1068 340 1053 q 275 1083 300 1083 q 231 1060 249 1083 q 208 992 213 1036 l 131 997 q 172 1122 135 1076 q 272 1168 210 1168 q 339 1153 311 1168 q 390 1119 367 1138 q 433 1085 413 1100 q 478 1069 453 1069 q 544 1161 533 1069 l 622 1156 q 581 1030 618 1075 q 481 985 543 985 z \"},\"Ä\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 233 993 q 185 1013 204 993 q 165 1061 165 1032 q 185 1110 165 1092 q 233 1129 204 1129 q 283 1110 264 1129 q 301 1061 301 1092 q 283 1013 301 1032 q 233 993 264 993 m 519 993 q 470 1013 489 993 q 451 1061 451 1032 q 470 1110 451 1092 q 519 1129 489 1129 q 568 1110 549 1129 q 588 1061 588 1092 q 568 1013 588 1032 q 519 993 549 993 z \"},\"Ā\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 190 1021 l 190 1100 l 563 1100 l 563 1021 l 190 1021 z \"},\"Ă\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 376 979 q 292 994 328 979 q 231 1033 256 1008 q 192 1090 206 1057 q 174 1158 178 1122 l 243 1169 q 284 1087 251 1121 q 376 1053 317 1053 q 469 1087 436 1053 q 510 1169 501 1121 l 579 1158 q 561 1090 575 1122 q 522 1033 547 1057 q 461 994 497 1008 q 376 979 425 979 z \"},\"Å\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 376 971 q 280 1005 318 971 q 242 1096 242 1039 q 280 1188 242 1154 q 376 1222 318 1222 q 473 1188 435 1222 q 511 1096 511 1154 q 473 1005 511 1039 q 376 971 435 971 m 376 1021 q 426 1040 404 1021 q 447 1096 447 1060 q 426 1151 447 1132 q 376 1171 404 1171 q 325 1151 346 1171 q 304 1096 304 1132 q 325 1040 304 1060 q 376 1021 346 1021 z \"},\"Ǎ\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 317 981 l 171 1138 l 221 1174 l 374 1046 l 379 1046 l 532 1174 l 582 1138 l 436 981 l 317 981 z \"},\"Ạ\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 376 -285 q 323 -264 344 -285 q 301 -210 301 -243 q 323 -156 301 -178 q 376 -135 344 -135 q 430 -156 408 -135 q 451 -210 451 -178 q 430 -264 451 -243 q 376 -285 408 -285 z \"},\"Ả\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 332 969 l 319 1022 q 375 1046 353 1032 q 397 1086 397 1060 q 282 1144 397 1140 l 294 1211 q 436 1180 386 1208 q 486 1099 486 1151 q 474 1047 486 1068 q 440 1009 461 1025 q 390 984 418 993 q 332 969 363 975 z \"},\"Ấ\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 244 971 l 197 1007 l 326 1132 l 426 1132 l 556 1007 l 508 971 l 379 1067 l 374 1067 l 244 971 m 544 1060 l 503 1104 l 638 1233 l 686 1179 l 544 1060 z \"},\"Ầ\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 244 971 l 197 1007 l 326 1132 l 426 1132 l 556 1007 l 508 971 l 379 1067 l 374 1067 l 244 971 m 250 1101 l 208 1060 l 83 1182 l 132 1233 l 250 1101 z \"},\"Ẩ\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 244 971 l 197 1007 l 326 1132 l 426 1132 l 556 1007 l 508 971 l 379 1067 l 374 1067 l 244 971 m 536 1047 l 521 1096 q 565 1113 547 1103 q 583 1146 583 1124 q 560 1185 583 1174 q 485 1200 538 1197 l 497 1258 q 622 1231 579 1256 q 664 1157 664 1206 q 625 1080 664 1104 q 536 1047 586 1056 z \"},\"Ẫ\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 244 971 l 197 1007 l 326 1128 l 426 1128 l 556 1007 l 508 971 l 379 1063 l 374 1063 l 244 971 m 175 1178 q 203 1267 178 1231 q 285 1304 228 1304 q 342 1294 318 1304 q 385 1270 365 1283 q 424 1247 406 1257 q 463 1236 442 1236 q 499 1253 488 1236 q 515 1300 511 1269 l 578 1293 q 550 1202 575 1239 q 468 1165 525 1165 q 411 1176 435 1165 q 367 1200 388 1188 q 329 1224 347 1213 q 290 1235 311 1235 q 253 1218 265 1235 q 238 1171 242 1201 l 175 1178 z \"},\"Ậ\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 171 1007 l 317 1164 l 436 1164 l 582 1007 l 532 971 l 379 1100 l 374 1100 l 221 971 l 171 1007 m 376 -285 q 323 -264 344 -285 q 301 -210 301 -243 q 323 -156 301 -178 q 376 -135 344 -135 q 430 -156 408 -135 q 451 -210 451 -178 q 430 -264 451 -243 q 376 -285 408 -285 z \"},\"Ắ\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 324 1156 l 456 1317 l 529 1267 l 381 1115 l 324 1156 m 376 979 q 292 994 328 979 q 231 1033 256 1008 q 192 1090 206 1057 q 174 1158 178 1122 l 239 1169 q 281 1083 247 1118 q 376 1047 314 1047 q 472 1083 439 1047 q 514 1169 506 1118 l 579 1158 q 561 1090 575 1122 q 522 1033 547 1057 q 461 994 497 1008 q 376 979 425 979 z \"},\"Ằ\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 429 1156 l 372 1115 l 224 1267 l 297 1317 l 429 1156 m 376 979 q 292 994 328 979 q 231 1033 256 1008 q 192 1090 206 1057 q 174 1158 178 1122 l 239 1169 q 281 1083 247 1118 q 376 1047 314 1047 q 472 1083 439 1047 q 514 1169 506 1118 l 579 1158 q 561 1090 575 1122 q 522 1033 547 1057 q 461 994 497 1008 q 376 979 425 979 z \"},\"Ẳ\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 344 1111 l 331 1160 q 374 1177 356 1167 q 392 1210 392 1188 q 369 1249 392 1238 q 294 1264 346 1261 l 306 1322 q 431 1294 388 1319 q 474 1221 474 1269 q 463 1176 474 1194 q 434 1144 451 1157 q 393 1123 417 1131 q 344 1111 369 1115 m 376 979 q 292 994 328 979 q 231 1033 256 1008 q 192 1090 206 1057 q 174 1158 178 1122 l 239 1169 q 281 1083 247 1118 q 376 1047 314 1047 q 472 1083 439 1047 q 514 1169 506 1118 l 579 1158 q 561 1090 575 1122 q 522 1033 547 1057 q 461 994 497 1008 q 376 979 425 979 z \"},\"Ẵ\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 376 983 q 292 995 328 983 q 233 1028 257 1007 q 195 1075 208 1049 q 178 1131 182 1101 l 242 1142 q 281 1075 249 1104 q 376 1046 313 1046 q 472 1075 440 1046 q 511 1142 504 1104 l 575 1131 q 558 1075 571 1101 q 520 1028 544 1049 q 460 995 496 1007 q 376 983 425 983 m 175 1182 q 203 1273 178 1236 q 285 1310 228 1310 q 342 1299 318 1310 q 385 1275 365 1288 q 424 1251 406 1263 q 463 1240 442 1240 q 499 1257 488 1240 q 515 1304 511 1274 l 578 1297 q 550 1208 575 1244 q 468 1171 525 1171 q 411 1182 435 1171 q 367 1206 388 1193 q 329 1229 347 1218 q 290 1240 311 1240 q 253 1224 265 1240 q 238 1175 242 1207 l 175 1182 z \"},\"Ặ\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 376 979 q 292 994 328 979 q 231 1033 256 1008 q 192 1090 206 1057 q 174 1158 178 1122 l 243 1169 q 284 1087 251 1121 q 376 1053 317 1053 q 469 1087 436 1053 q 510 1169 501 1121 l 579 1158 q 561 1090 575 1122 q 522 1033 547 1057 q 461 994 497 1008 q 376 979 425 979 m 376 -285 q 323 -264 344 -285 q 301 -210 301 -243 q 323 -156 301 -178 q 376 -135 344 -135 q 430 -156 408 -135 q 451 -210 451 -178 q 430 -264 451 -243 q 376 -285 408 -285 z \"},\"Ą\":{\"ha\":756,\"x_min\":4,\"x_max\":794,\"o\":\"m 683 -294 q 589 -264 628 -294 q 550 -174 550 -233 q 560 -119 550 -146 q 585 -71 569 -93 q 618 -31 600 -49 q 654 0 636 -12 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 l 313 911 l 443 911 l 751 0 q 672 -62 703 -19 q 640 -149 640 -106 q 660 -197 640 -181 q 704 -212 679 -212 q 763 -193 736 -212 l 794 -256 q 742 -283 774 -271 q 683 -294 711 -294 m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 z \"},\"Æ\":{\"ha\":1142,\"x_min\":11,\"x_max\":1074,\"o\":\"m 403 522 l 318 358 l 557 358 l 557 819 l 551 819 q 403 522 478 671 m 11 0 l 489 911 l 1060 911 l 1060 814 l 674 814 l 674 528 l 996 528 l 996 429 l 674 429 l 674 99 l 1074 99 l 1074 0 l 557 0 l 557 265 l 271 265 l 133 0 l 11 0 z \"},\"Ǽ\":{\"ha\":1142,\"x_min\":11,\"x_max\":1074,\"o\":\"m 403 522 l 318 358 l 557 358 l 557 819 l 551 819 q 403 522 478 671 m 11 0 l 489 911 l 1060 911 l 1060 814 l 674 814 l 674 528 l 996 528 l 996 429 l 674 429 l 674 99 l 1074 99 l 1074 0 l 557 0 l 557 265 l 271 265 l 133 0 l 11 0 m 760 979 l 708 1038 l 906 1215 l 971 1139 l 760 979 z \"},\"Ǣ\":{\"ha\":1142,\"x_min\":11,\"x_max\":1074,\"o\":\"m 403 522 l 318 358 l 557 358 l 557 819 l 551 819 q 403 522 478 671 m 11 0 l 489 911 l 1060 911 l 1060 814 l 674 814 l 674 528 l 996 528 l 996 429 l 674 429 l 674 99 l 1074 99 l 1074 0 l 557 0 l 557 265 l 271 265 l 133 0 l 11 0 m 597 1032 l 597 1111 l 969 1111 l 969 1032 l 597 1032 z \"},\"Ƀ\":{\"ha\":838,\"x_min\":42,\"x_max\":785,\"o\":\"m 149 0 l 149 246 l 42 246 l 42 306 l 149 311 l 149 911 l 419 911 q 547 899 489 911 q 645 860 604 886 q 709 792 686 833 q 732 692 732 750 q 693 573 732 625 q 574 500 654 521 l 574 494 q 729 424 674 479 q 785 272 785 368 q 760 152 785 203 q 689 67 735 101 q 580 17 643 33 q 440 0 517 0 l 149 0 m 264 528 l 400 528 q 569 567 517 528 q 621 683 621 607 q 566 792 621 758 q 404 825 511 825 l 264 825 l 264 528 m 264 88 l 424 88 q 607 134 542 88 q 672 278 672 181 q 608 410 672 368 q 424 451 543 451 l 264 451 l 264 311 l 475 311 l 475 246 l 264 246 l 264 88 z \"},\"Ḇ\":{\"ha\":817,\"x_min\":125,\"x_max\":761,\"o\":\"m 125 0 l 125 911 l 396 911 q 523 899 465 911 q 622 860 581 886 q 685 791 663 833 q 708 689 708 749 q 674 566 708 621 q 575 490 640 511 l 575 485 q 710 415 658 469 q 761 267 761 361 q 736 150 761 200 q 665 67 711 100 q 556 17 619 33 q 415 0 492 0 l 125 0 m 240 524 l 375 524 q 543 564 492 524 q 594 674 594 604 q 541 786 594 753 q 381 819 488 819 l 240 819 l 240 524 m 240 92 l 399 92 q 582 135 517 92 q 647 271 647 179 q 583 395 647 356 q 399 435 519 435 l 240 435 l 240 92 m 232 -235 l 232 -156 l 601 -156 l 601 -235 l 232 -235 z \"},\"Ç\":{\"ha\":793,\"x_min\":72,\"x_max\":749,\"o\":\"m 469 -17 q 311 15 383 -17 q 185 108 239 47 q 102 256 132 168 q 72 456 72 344 q 103 653 72 565 q 188 801 133 740 q 315 895 242 863 q 476 928 389 928 q 623 894 560 928 q 726 815 686 860 l 664 740 q 582 803 628 779 q 478 826 536 826 q 360 801 413 826 q 269 727 307 775 q 212 611 232 679 q 192 458 192 543 q 212 303 192 372 q 268 186 232 235 q 356 111 304 138 q 474 85 408 85 q 590 112 540 85 q 685 188 640 139 l 749 115 q 626 18 694 53 q 469 -17 558 -17 m 356 -314 l 344 -258 q 464 -235 432 -251 q 496 -189 496 -219 q 472 -146 496 -161 q 389 -122 449 -131 l 450 4 l 524 4 l 483 -89 q 558 -122 532 -100 q 585 -187 585 -144 q 526 -278 585 -249 q 356 -314 467 -308 z \"},\"Ć\":{\"ha\":793,\"x_min\":72,\"x_max\":749,\"o\":\"m 469 -17 q 311 15 383 -17 q 185 108 239 47 q 102 256 132 168 q 72 456 72 344 q 103 653 72 565 q 188 801 133 740 q 315 895 242 863 q 476 928 389 928 q 623 894 560 928 q 726 815 686 860 l 664 740 q 582 803 628 779 q 478 826 536 826 q 360 801 413 826 q 269 727 307 775 q 212 611 232 679 q 192 458 192 543 q 212 303 192 372 q 268 186 232 235 q 356 111 304 138 q 474 85 408 85 q 590 112 540 85 q 685 188 640 139 l 749 115 q 626 18 694 53 q 469 -17 558 -17 m 435 968 l 383 1026 l 581 1204 l 646 1128 l 435 968 z \"},\"Ĉ\":{\"ha\":793,\"x_min\":72,\"x_max\":749,\"o\":\"m 469 -17 q 311 15 383 -17 q 185 108 239 47 q 102 256 132 168 q 72 456 72 344 q 103 653 72 565 q 188 801 133 740 q 315 895 242 863 q 476 928 389 928 q 623 894 560 928 q 726 815 686 860 l 664 740 q 582 803 628 779 q 478 826 536 826 q 360 801 413 826 q 269 727 307 775 q 212 611 232 679 q 192 458 192 543 q 212 303 192 372 q 268 186 232 235 q 356 111 304 138 q 474 85 408 85 q 590 112 540 85 q 685 188 640 139 l 749 115 q 626 18 694 53 q 469 -17 558 -17 m 253 1007 l 399 1164 l 518 1164 l 664 1007 l 614 971 l 461 1100 l 456 1100 l 303 971 l 253 1007 z \"},\"Č\":{\"ha\":793,\"x_min\":72,\"x_max\":749,\"o\":\"m 469 -17 q 311 15 383 -17 q 185 108 239 47 q 102 256 132 168 q 72 456 72 344 q 103 653 72 565 q 188 801 133 740 q 315 895 242 863 q 476 928 389 928 q 623 894 560 928 q 726 815 686 860 l 664 740 q 582 803 628 779 q 478 826 536 826 q 360 801 413 826 q 269 727 307 775 q 212 611 232 679 q 192 458 192 543 q 212 303 192 372 q 268 186 232 235 q 356 111 304 138 q 474 85 408 85 q 590 112 540 85 q 685 188 640 139 l 749 115 q 626 18 694 53 q 469 -17 558 -17 m 399 981 l 253 1138 l 303 1174 l 456 1046 l 461 1046 l 614 1174 l 664 1138 l 518 981 l 399 981 z \"},\"Ċ\":{\"ha\":793,\"x_min\":72,\"x_max\":749,\"o\":\"m 469 -17 q 311 15 383 -17 q 185 108 239 47 q 102 256 132 168 q 72 456 72 344 q 103 653 72 565 q 188 801 133 740 q 315 895 242 863 q 476 928 389 928 q 623 894 560 928 q 726 815 686 860 l 664 740 q 582 803 628 779 q 478 826 536 826 q 360 801 413 826 q 269 727 307 775 q 212 611 232 679 q 192 458 192 543 q 212 303 192 372 q 268 186 232 235 q 356 111 304 138 q 474 85 408 85 q 590 112 540 85 q 685 188 640 139 l 749 115 q 626 18 694 53 q 469 -17 558 -17 m 458 992 q 402 1013 425 992 q 379 1067 379 1033 q 402 1119 379 1099 q 458 1140 425 1140 q 515 1119 492 1140 q 538 1067 538 1099 q 515 1013 538 1033 q 458 992 492 992 z \"},\"Ď\":{\"ha\":854,\"x_min\":125,\"x_max\":783,\"o\":\"m 125 0 l 125 911 l 353 911 q 674 794 564 911 q 783 460 783 678 q 756 266 783 351 q 674 122 728 181 q 540 31 619 63 q 358 0 461 0 l 125 0 m 240 94 l 344 94 q 584 190 504 94 q 664 460 664 286 q 584 725 664 633 q 344 817 504 817 l 240 817 l 240 94 m 367 981 l 221 1138 l 271 1174 l 424 1046 l 429 1046 l 582 1174 l 632 1138 l 486 981 l 367 981 z \"},\"Ḍ\":{\"ha\":854,\"x_min\":125,\"x_max\":783,\"o\":\"m 125 0 l 125 911 l 353 911 q 674 794 564 911 q 783 460 783 678 q 756 266 783 351 q 674 122 728 181 q 540 31 619 63 q 358 0 461 0 l 125 0 m 240 94 l 344 94 q 584 190 504 94 q 664 460 664 286 q 584 725 664 633 q 344 817 504 817 l 240 817 l 240 94 m 422 -285 q 369 -264 390 -285 q 347 -210 347 -243 q 369 -156 347 -178 q 422 -135 390 -135 q 476 -156 454 -135 q 497 -210 497 -178 q 476 -264 497 -243 q 422 -285 454 -285 z \"},\"Ḏ\":{\"ha\":854,\"x_min\":125,\"x_max\":783,\"o\":\"m 125 0 l 125 911 l 353 911 q 674 794 564 911 q 783 460 783 678 q 756 266 783 351 q 674 122 728 181 q 540 31 619 63 q 358 0 461 0 l 125 0 m 240 94 l 344 94 q 584 190 504 94 q 664 460 664 286 q 584 725 664 633 q 344 817 504 817 l 240 817 l 240 94 m 238 -235 l 238 -156 l 607 -156 l 607 -235 l 238 -235 z \"},\"Đ\":{\"ha\":886,\"x_min\":46,\"x_max\":814,\"o\":\"m 46 446 l 46 506 l 156 511 l 156 911 l 383 911 q 704 794 594 911 q 814 460 814 678 q 786 266 814 351 q 704 122 758 181 q 571 31 650 63 q 389 0 492 0 l 156 0 l 156 446 l 46 446 m 271 94 l 375 94 q 615 190 535 94 q 694 460 694 286 q 615 725 694 633 q 375 817 535 817 l 271 817 l 271 511 l 478 511 l 478 446 l 271 446 l 271 94 z \"},\"È\":{\"ha\":732,\"x_min\":125,\"x_max\":664,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 m 418 968 l 207 1128 l 272 1204 l 469 1026 l 418 968 z \"},\"É\":{\"ha\":732,\"x_min\":125,\"x_max\":664,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 m 371 968 l 319 1026 l 517 1204 l 582 1128 l 371 968 z \"},\"Ê\":{\"ha\":732,\"x_min\":125,\"x_max\":664,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 m 189 1007 l 335 1164 l 454 1164 l 600 1007 l 550 971 l 397 1100 l 392 1100 l 239 971 l 189 1007 z \"},\"Ě\":{\"ha\":732,\"x_min\":125,\"x_max\":664,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 m 335 981 l 189 1138 l 239 1174 l 392 1046 l 397 1046 l 550 1174 l 600 1138 l 454 981 l 335 981 z \"},\"Ë\":{\"ha\":732,\"x_min\":125,\"x_max\":664,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 m 251 993 q 203 1013 222 993 q 183 1061 183 1032 q 203 1110 183 1092 q 251 1129 222 1129 q 301 1110 282 1129 q 319 1061 319 1092 q 301 1013 319 1032 q 251 993 282 993 m 538 993 q 488 1013 507 993 q 469 1061 469 1032 q 488 1110 469 1092 q 538 1129 507 1129 q 586 1110 567 1129 q 606 1061 606 1092 q 586 1013 606 1032 q 538 993 567 993 z \"},\"Ē\":{\"ha\":732,\"x_min\":125,\"x_max\":664,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 m 208 1021 l 208 1100 l 581 1100 l 581 1021 l 208 1021 z \"},\"Ĕ\":{\"ha\":732,\"x_min\":125,\"x_max\":664,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 m 394 979 q 310 994 346 979 q 249 1033 274 1008 q 210 1090 224 1057 q 192 1158 196 1122 l 261 1169 q 302 1087 269 1121 q 394 1053 335 1053 q 487 1087 454 1053 q 528 1169 519 1121 l 597 1158 q 579 1090 593 1122 q 540 1033 565 1057 q 479 994 515 1008 q 394 979 443 979 z \"},\"Ė\":{\"ha\":732,\"x_min\":125,\"x_max\":664,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 m 394 992 q 338 1013 361 992 q 315 1067 315 1033 q 338 1119 315 1099 q 394 1140 361 1140 q 451 1119 428 1140 q 474 1067 474 1099 q 451 1013 474 1033 q 394 992 428 992 z \"},\"Ẹ\":{\"ha\":732,\"x_min\":125,\"x_max\":664,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 m 410 -285 q 356 -264 378 -285 q 335 -210 335 -243 q 356 -156 335 -178 q 410 -135 378 -135 q 463 -156 442 -135 q 485 -210 485 -178 q 463 -264 485 -243 q 410 -285 442 -285 z \"},\"Ẻ\":{\"ha\":732,\"x_min\":125,\"x_max\":664,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 m 350 969 l 338 1022 q 393 1046 371 1032 q 415 1086 415 1060 q 300 1144 415 1140 l 313 1211 q 454 1180 404 1208 q 504 1099 504 1151 q 492 1047 504 1068 q 458 1009 479 1025 q 408 984 436 993 q 350 969 381 975 z \"},\"Ẽ\":{\"ha\":732,\"x_min\":125,\"x_max\":664,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 m 499 985 q 432 1000 460 985 q 381 1034 404 1015 q 338 1068 358 1053 q 293 1083 318 1083 q 249 1060 267 1083 q 226 992 231 1036 l 149 997 q 190 1122 153 1076 q 290 1168 228 1168 q 357 1153 329 1168 q 408 1119 385 1138 q 451 1085 431 1100 q 496 1069 471 1069 q 563 1161 551 1069 l 640 1156 q 599 1030 636 1075 q 499 985 561 985 z \"},\"Ế\":{\"ha\":732,\"x_min\":125,\"x_max\":704,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 m 263 971 l 215 1007 l 344 1132 l 444 1132 l 574 1007 l 526 971 l 397 1067 l 392 1067 l 263 971 m 563 1060 l 521 1104 l 656 1233 l 704 1179 l 563 1060 z \"},\"Ề\":{\"ha\":732,\"x_min\":101,\"x_max\":664,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 m 263 971 l 215 1007 l 344 1132 l 444 1132 l 574 1007 l 526 971 l 397 1067 l 392 1067 l 263 971 m 268 1101 l 226 1060 l 101 1182 l 150 1233 l 268 1101 z \"},\"Ể\":{\"ha\":732,\"x_min\":125,\"x_max\":682,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 m 263 971 l 215 1007 l 344 1132 l 444 1132 l 574 1007 l 526 971 l 397 1067 l 392 1067 l 263 971 m 554 1047 l 539 1096 q 583 1113 565 1103 q 601 1146 601 1124 q 578 1185 601 1174 q 503 1200 556 1197 l 515 1258 q 640 1231 597 1256 q 682 1157 682 1206 q 643 1080 682 1104 q 554 1047 604 1056 z \"},\"Ễ\":{\"ha\":732,\"x_min\":125,\"x_max\":664,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 m 263 971 l 215 1007 l 344 1128 l 444 1128 l 574 1007 l 526 971 l 397 1063 l 392 1063 l 263 971 m 193 1178 q 221 1267 196 1231 q 303 1304 246 1304 q 360 1294 336 1304 q 403 1270 383 1283 q 442 1247 424 1257 q 481 1236 460 1236 q 517 1253 506 1236 q 533 1300 529 1269 l 596 1293 q 568 1202 593 1239 q 486 1165 543 1165 q 429 1176 453 1165 q 385 1200 406 1188 q 347 1224 365 1213 q 308 1235 329 1235 q 272 1218 283 1235 q 256 1171 260 1201 l 193 1178 z \"},\"Ệ\":{\"ha\":732,\"x_min\":125,\"x_max\":664,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 m 189 1007 l 335 1164 l 454 1164 l 600 1007 l 550 971 l 397 1100 l 392 1100 l 239 971 l 189 1007 m 410 -285 q 356 -264 378 -285 q 335 -210 335 -243 q 356 -156 335 -178 q 410 -135 378 -135 q 463 -156 442 -135 q 485 -210 485 -178 q 463 -264 485 -243 q 410 -285 442 -285 z \"},\"Ę\":{\"ha\":732,\"x_min\":125,\"x_max\":686,\"o\":\"m 575 -294 q 481 -264 519 -294 q 442 -174 442 -233 q 474 -70 442 -115 q 546 0 507 -25 l 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 660 0 q 613 -16 636 -3 q 572 -49 590 -29 q 543 -95 554 -69 q 532 -149 532 -121 q 553 -197 532 -181 q 599 -212 574 -212 q 654 -193 628 -212 l 686 -256 q 635 -283 667 -271 q 575 -294 603 -294 z \"},\"Ḗ\":{\"ha\":732,\"x_min\":125,\"x_max\":664,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 m 367 1149 l 324 1201 l 492 1344 l 546 1278 l 367 1149 m 206 1021 l 206 1100 l 578 1100 l 578 1021 l 206 1021 z \"},\"Ǵ\":{\"ha\":857,\"x_min\":72,\"x_max\":764,\"o\":\"m 483 -17 q 317 15 393 -17 q 188 108 242 47 q 103 256 133 168 q 72 456 72 344 q 103 653 72 565 q 190 801 135 740 q 323 895 246 863 q 490 928 400 928 q 577 918 538 928 q 649 892 617 908 q 708 856 682 876 q 753 815 733 836 l 689 740 q 608 801 654 776 q 493 826 563 826 q 368 801 424 826 q 274 727 313 775 q 213 611 235 679 q 192 458 192 543 q 212 303 192 372 q 270 186 232 235 q 365 111 308 138 q 494 85 421 85 q 587 99 543 85 q 658 139 631 114 l 658 376 l 465 376 l 465 472 l 764 472 l 764 89 q 647 13 719 43 q 483 -17 575 -17 m 467 968 l 415 1026 l 613 1204 l 678 1128 l 467 968 z \"},\"Ĝ\":{\"ha\":857,\"x_min\":72,\"x_max\":764,\"o\":\"m 483 -17 q 317 15 393 -17 q 188 108 242 47 q 103 256 133 168 q 72 456 72 344 q 103 653 72 565 q 190 801 135 740 q 323 895 246 863 q 490 928 400 928 q 577 918 538 928 q 649 892 617 908 q 708 856 682 876 q 753 815 733 836 l 689 740 q 608 801 654 776 q 493 826 563 826 q 368 801 424 826 q 274 727 313 775 q 213 611 235 679 q 192 458 192 543 q 212 303 192 372 q 270 186 232 235 q 365 111 308 138 q 494 85 421 85 q 587 99 543 85 q 658 139 631 114 l 658 376 l 465 376 l 465 472 l 764 472 l 764 89 q 647 13 719 43 q 483 -17 575 -17 m 285 1007 l 431 1164 l 550 1164 l 696 1007 l 646 971 l 493 1100 l 488 1100 l 335 971 l 285 1007 z \"},\"Ğ\":{\"ha\":857,\"x_min\":72,\"x_max\":764,\"o\":\"m 483 -17 q 317 15 393 -17 q 188 108 242 47 q 103 256 133 168 q 72 456 72 344 q 103 653 72 565 q 190 801 135 740 q 323 895 246 863 q 490 928 400 928 q 577 918 538 928 q 649 892 617 908 q 708 856 682 876 q 753 815 733 836 l 689 740 q 608 801 654 776 q 493 826 563 826 q 368 801 424 826 q 274 727 313 775 q 213 611 235 679 q 192 458 192 543 q 212 303 192 372 q 270 186 232 235 q 365 111 308 138 q 494 85 421 85 q 587 99 543 85 q 658 139 631 114 l 658 376 l 465 376 l 465 472 l 764 472 l 764 89 q 647 13 719 43 q 483 -17 575 -17 m 490 979 q 406 994 442 979 q 344 1033 369 1008 q 306 1090 319 1057 q 288 1158 292 1122 l 357 1169 q 398 1087 365 1121 q 490 1053 431 1053 q 583 1087 550 1053 q 624 1169 615 1121 l 693 1158 q 675 1090 689 1122 q 636 1033 661 1057 q 575 994 611 1008 q 490 979 539 979 z \"},\"Ġ\":{\"ha\":857,\"x_min\":72,\"x_max\":764,\"o\":\"m 483 -17 q 317 15 393 -17 q 188 108 242 47 q 103 256 133 168 q 72 456 72 344 q 103 653 72 565 q 190 801 135 740 q 323 895 246 863 q 490 928 400 928 q 577 918 538 928 q 649 892 617 908 q 708 856 682 876 q 753 815 733 836 l 689 740 q 608 801 654 776 q 493 826 563 826 q 368 801 424 826 q 274 727 313 775 q 213 611 235 679 q 192 458 192 543 q 212 303 192 372 q 270 186 232 235 q 365 111 308 138 q 494 85 421 85 q 587 99 543 85 q 658 139 631 114 l 658 376 l 465 376 l 465 472 l 764 472 l 764 89 q 647 13 719 43 q 483 -17 575 -17 m 490 992 q 434 1013 457 992 q 411 1067 411 1033 q 434 1119 411 1099 q 490 1140 457 1140 q 547 1119 524 1140 q 569 1067 569 1099 q 547 1013 569 1033 q 490 992 524 992 z \"},\"Ģ\":{\"ha\":857,\"x_min\":72,\"x_max\":764,\"o\":\"m 483 -17 q 317 15 393 -17 q 188 108 242 47 q 103 256 133 168 q 72 456 72 344 q 103 653 72 565 q 190 801 135 740 q 323 895 246 863 q 490 928 400 928 q 577 918 538 928 q 649 892 617 908 q 708 856 682 876 q 753 815 733 836 l 689 740 q 608 801 654 776 q 493 826 563 826 q 368 801 424 826 q 274 727 313 775 q 213 611 235 679 q 192 458 192 543 q 212 303 192 372 q 270 186 232 235 q 365 111 308 138 q 494 85 421 85 q 587 99 543 85 q 658 139 631 114 l 658 376 l 465 376 l 465 472 l 764 472 l 764 89 q 647 13 719 43 q 483 -17 575 -17 m 363 -314 l 351 -258 q 471 -235 439 -251 q 503 -192 503 -219 q 478 -151 503 -164 q 404 -133 453 -137 l 429 -81 q 556 -116 519 -92 q 592 -187 592 -140 q 533 -278 592 -249 q 363 -314 474 -308 z \"},\"Ǧ\":{\"ha\":857,\"x_min\":72,\"x_max\":764,\"o\":\"m 483 -17 q 317 15 393 -17 q 188 108 242 47 q 103 256 133 168 q 72 456 72 344 q 103 653 72 565 q 190 801 135 740 q 323 895 246 863 q 490 928 400 928 q 577 918 538 928 q 649 892 617 908 q 708 856 682 876 q 753 815 733 836 l 689 740 q 608 801 654 776 q 493 826 563 826 q 368 801 424 826 q 274 727 313 775 q 213 611 235 679 q 192 458 192 543 q 212 303 192 372 q 270 186 232 235 q 365 111 308 138 q 494 85 421 85 q 587 99 543 85 q 658 139 631 114 l 658 376 l 465 376 l 465 472 l 764 472 l 764 89 q 647 13 719 43 q 483 -17 575 -17 m 431 981 l 285 1138 l 335 1174 l 488 1046 l 493 1046 l 646 1174 l 696 1138 l 550 981 l 431 981 z \"},\"Ḡ\":{\"ha\":857,\"x_min\":72,\"x_max\":764,\"o\":\"m 483 -17 q 317 15 393 -17 q 188 108 242 47 q 103 256 133 168 q 72 456 72 344 q 103 653 72 565 q 190 801 135 740 q 323 895 246 863 q 490 928 400 928 q 577 918 538 928 q 649 892 617 908 q 708 856 682 876 q 753 815 733 836 l 689 740 q 608 801 654 776 q 493 826 563 826 q 368 801 424 826 q 274 727 313 775 q 213 611 235 679 q 192 458 192 543 q 212 303 192 372 q 270 186 232 235 q 365 111 308 138 q 494 85 421 85 q 587 99 543 85 q 658 139 631 114 l 658 376 l 465 376 l 465 472 l 764 472 l 764 89 q 647 13 719 43 q 483 -17 575 -17 m 304 1021 l 304 1100 l 676 1100 l 676 1021 l 304 1021 z \"},\"Ɠ\":{\"ha\":857,\"x_min\":72,\"x_max\":851,\"o\":\"m 483 -17 q 317 15 393 -17 q 188 108 242 47 q 103 256 133 168 q 72 456 72 344 q 103 653 72 565 q 190 801 135 740 q 323 895 246 863 q 490 928 400 928 q 558 923 526 928 q 617 910 589 918 q 608 965 608 936 q 651 1074 608 1032 q 765 1117 694 1117 q 814 1111 793 1117 q 851 1099 835 1106 l 829 1011 q 808 1019 818 1015 q 782 1024 797 1024 q 727 1002 746 1024 q 708 949 708 981 q 719 894 708 917 q 753 839 729 871 l 689 763 q 608 808 654 789 q 493 826 563 826 q 368 801 424 826 q 274 727 313 775 q 213 611 235 679 q 192 458 192 543 q 212 303 192 372 q 270 186 232 235 q 365 111 308 138 q 494 85 421 85 q 587 99 543 85 q 658 139 631 114 l 658 376 l 465 376 l 465 472 l 764 472 l 764 89 q 647 13 719 43 q 483 -17 575 -17 z \"},\"Ĥ\":{\"ha\":906,\"x_min\":125,\"x_max\":781,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 529 l 664 529 l 664 911 l 781 911 l 781 0 l 664 0 l 664 429 l 240 429 l 240 0 l 125 0 m 247 1007 l 393 1164 l 513 1164 l 658 1007 l 608 971 l 456 1100 l 450 1100 l 297 971 l 247 1007 z \"},\"Ḥ\":{\"ha\":906,\"x_min\":125,\"x_max\":781,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 529 l 664 529 l 664 911 l 781 911 l 781 0 l 664 0 l 664 429 l 240 429 l 240 0 l 125 0 m 453 -285 q 399 -264 421 -285 q 378 -210 378 -243 q 399 -156 378 -178 q 453 -135 421 -135 q 506 -156 485 -135 q 528 -210 528 -178 q 506 -264 528 -243 q 453 -285 485 -285 z \"},\"Ḫ\":{\"ha\":906,\"x_min\":125,\"x_max\":781,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 529 l 664 529 l 664 911 l 781 911 l 781 0 l 664 0 l 664 429 l 240 429 l 240 0 l 125 0 m 453 -319 q 357 -301 397 -319 q 291 -253 317 -283 q 252 -186 265 -224 q 236 -110 239 -149 l 307 -99 q 322 -151 311 -125 q 350 -197 332 -176 q 394 -231 368 -218 q 453 -243 419 -243 q 512 -231 486 -243 q 556 -197 538 -218 q 584 -151 574 -176 q 599 -99 594 -125 l 669 -110 q 653 -186 667 -149 q 614 -253 640 -224 q 548 -301 588 -283 q 453 -319 508 -319 z \"},\"Ħ\":{\"ha\":954,\"x_min\":44,\"x_max\":908,\"o\":\"m 44 683 l 44 742 l 153 749 l 153 911 l 268 911 l 268 749 l 692 749 l 692 911 l 808 911 l 808 749 l 908 749 l 908 683 l 808 683 l 808 0 l 692 0 l 692 429 l 268 429 l 268 0 l 153 0 l 153 683 l 44 683 m 268 529 l 692 529 l 692 683 l 268 683 l 268 529 z \"},\"Ì\":{\"ha\":365,\"x_min\":-6,\"x_max\":257,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 0 l 125 0 m 206 968 l -6 1128 l 60 1204 l 257 1026 l 206 968 z \"},\"Í\":{\"ha\":365,\"x_min\":107,\"x_max\":369,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 0 l 125 0 m 158 968 l 107 1026 l 304 1204 l 369 1128 l 158 968 z \"},\"Î\":{\"ha\":365,\"x_min\":-24,\"x_max\":388,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 0 l 125 0 m -24 1007 l 122 1164 l 242 1164 l 388 1007 l 338 971 l 185 1100 l 179 1100 l 26 971 l -24 1007 z \"},\"Ĩ\":{\"ha\":365,\"x_min\":-64,\"x_max\":428,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 0 l 125 0 m 286 985 q 219 1000 247 985 q 169 1034 192 1015 q 126 1068 146 1053 q 81 1083 106 1083 q 36 1060 54 1083 q 14 992 18 1036 l -64 997 q -22 1122 -60 1076 q 78 1168 15 1168 q 144 1153 117 1168 q 195 1119 172 1138 q 238 1085 218 1100 q 283 1069 258 1069 q 350 1161 339 1069 l 428 1156 q 386 1030 424 1075 q 286 985 349 985 z \"},\"Ï\":{\"ha\":365,\"x_min\":-29,\"x_max\":393,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 0 l 125 0 m 39 993 q -10 1013 10 993 q -29 1061 -29 1032 q -10 1110 -29 1092 q 39 1129 10 1129 q 88 1110 69 1129 q 107 1061 107 1092 q 88 1013 107 1032 q 39 993 69 993 m 325 993 q 276 1013 294 993 q 257 1061 257 1032 q 276 1110 257 1092 q 325 1129 294 1129 q 374 1110 354 1129 q 393 1061 393 1092 q 374 1013 393 1032 q 325 993 354 993 z \"},\"Ī\":{\"ha\":365,\"x_min\":-4,\"x_max\":368,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 0 l 125 0 m -4 1021 l -4 1100 l 368 1100 l 368 1021 l -4 1021 z \"},\"İ\":{\"ha\":365,\"x_min\":103,\"x_max\":261,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 0 l 125 0 m 182 992 q 126 1013 149 992 q 103 1067 103 1033 q 126 1119 103 1099 q 182 1140 149 1140 q 238 1119 215 1140 q 261 1067 261 1099 q 238 1013 261 1033 q 182 992 215 992 z \"},\"Ǐ\":{\"ha\":365,\"x_min\":-24,\"x_max\":388,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 0 l 125 0 m 122 981 l -24 1138 l 26 1174 l 179 1046 l 185 1046 l 338 1174 l 388 1138 l 242 981 l 122 981 z \"},\"Ỉ\":{\"ha\":365,\"x_min\":88,\"x_max\":292,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 0 l 125 0 m 138 969 l 125 1022 q 181 1046 158 1032 q 203 1086 203 1060 q 88 1144 203 1140 l 100 1211 q 242 1180 192 1208 q 292 1099 292 1151 q 279 1047 292 1068 q 245 1009 267 1025 q 196 984 224 993 q 138 969 168 975 z \"},\"Ị\":{\"ha\":365,\"x_min\":108,\"x_max\":258,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 0 l 125 0 m 183 -285 q 130 -264 151 -285 q 108 -210 108 -243 q 130 -156 108 -178 q 183 -135 151 -135 q 237 -156 215 -135 q 258 -210 258 -178 q 237 -264 258 -243 q 183 -285 215 -285 z \"},\"Į\":{\"ha\":365,\"x_min\":60,\"x_max\":304,\"o\":\"m 193 -294 q 99 -264 138 -294 q 60 -174 60 -233 q 90 -72 60 -114 q 153 0 119 -31 l 125 0 l 125 911 l 240 911 l 240 0 q 174 -69 197 -33 q 150 -149 150 -106 q 171 -197 150 -181 q 215 -212 192 -212 q 272 -193 246 -212 l 304 -256 q 252 -283 283 -271 q 193 -294 221 -294 z \"},\"Ĭ\":{\"ha\":365,\"x_min\":-21,\"x_max\":385,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 0 l 125 0 m 182 979 q 97 994 133 979 q 36 1033 61 1008 q -3 1090 11 1057 q -21 1158 -17 1122 l 49 1169 q 90 1087 57 1121 q 182 1053 122 1053 q 274 1087 242 1053 q 315 1169 307 1121 l 385 1158 q 367 1090 381 1122 q 328 1033 353 1057 q 267 994 303 1008 q 182 979 231 979 z \"},\"Ĵ\":{\"ha\":667,\"x_min\":43,\"x_max\":689,\"o\":\"m 294 -17 q 43 129 124 -17 l 126 188 q 196 109 157 133 q 283 85 235 85 q 393 130 357 85 q 429 279 429 175 l 429 911 l 546 911 l 546 268 q 531 158 546 210 q 487 67 517 106 q 409 6 457 28 q 294 -17 361 -17 m 278 1007 l 424 1164 l 543 1164 l 689 1007 l 639 971 l 486 1100 l 481 1100 l 328 971 l 278 1007 z \"},\"Ķ\":{\"ha\":804,\"x_min\":125,\"x_max\":799,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 454 l 244 454 l 624 911 l 754 911 l 469 564 l 799 0 l 669 0 l 397 474 l 240 289 l 240 0 l 125 0 m 331 -314 l 319 -258 q 439 -235 407 -251 q 471 -192 471 -219 q 446 -151 471 -164 q 372 -133 421 -137 l 397 -81 q 524 -116 488 -92 q 560 -187 560 -140 q 501 -278 560 -249 q 331 -314 442 -308 z \"},\"Ḳ\":{\"ha\":804,\"x_min\":125,\"x_max\":799,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 454 l 244 454 l 624 911 l 754 911 l 469 564 l 799 0 l 669 0 l 397 474 l 240 289 l 240 0 l 125 0 m 454 -285 q 401 -264 422 -285 q 379 -210 379 -243 q 401 -156 379 -178 q 454 -135 422 -135 q 508 -156 486 -135 q 529 -210 529 -178 q 508 -264 529 -243 q 454 -285 486 -285 z \"},\"Ḵ\":{\"ha\":804,\"x_min\":125,\"x_max\":799,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 454 l 244 454 l 624 911 l 754 911 l 469 564 l 799 0 l 669 0 l 397 474 l 240 289 l 240 0 l 125 0 m 267 -235 l 267 -156 l 636 -156 l 636 -235 l 267 -235 z \"},\"Ĺ\":{\"ha\":675,\"x_min\":111,\"x_max\":639,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 99 l 639 99 l 639 0 l 125 0 m 163 968 l 111 1026 l 308 1204 l 374 1128 l 163 968 z \"},\"Ľ\":{\"ha\":675,\"x_min\":125,\"x_max\":639,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 99 l 639 99 l 639 0 l 125 0 m 464 715 l 458 1010 l 540 1010 l 539 931 l 519 715 l 464 715 z \"},\"Ļ\":{\"ha\":675,\"x_min\":125,\"x_max\":639,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 99 l 639 99 l 639 0 l 125 0 m 279 -314 l 268 -258 q 388 -235 356 -251 q 419 -192 419 -219 q 394 -151 419 -164 q 321 -133 369 -137 l 346 -81 q 472 -116 436 -92 q 508 -187 508 -140 q 449 -278 508 -249 q 279 -314 390 -308 z \"},\"Ŀ\":{\"ha\":675,\"x_min\":125,\"x_max\":639,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 99 l 639 99 l 639 0 l 125 0 m 524 365 q 465 390 489 365 q 440 451 440 414 q 465 516 440 492 q 524 540 489 540 q 581 516 557 540 q 606 451 606 492 q 581 390 606 414 q 524 365 557 365 z \"},\"Ḷ\":{\"ha\":675,\"x_min\":125,\"x_max\":639,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 99 l 639 99 l 639 0 l 125 0 m 400 -285 q 347 -264 368 -285 q 325 -210 325 -243 q 347 -156 325 -178 q 400 -135 368 -135 q 453 -156 432 -135 q 475 -210 475 -178 q 453 -264 475 -243 q 400 -285 432 -285 z \"},\"Ḹ\":{\"ha\":675,\"x_min\":0,\"x_max\":639,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 99 l 639 99 l 639 0 l 125 0 m 0 1021 l 0 1100 l 372 1100 l 372 1021 l 0 1021 m 400 -285 q 347 -264 368 -285 q 325 -210 325 -243 q 347 -156 325 -178 q 400 -135 368 -135 q 453 -156 432 -135 q 475 -210 475 -178 q 453 -264 475 -243 q 400 -285 432 -285 z \"},\"Ḻ\":{\"ha\":675,\"x_min\":125,\"x_max\":639,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 99 l 639 99 l 639 0 l 125 0 m 215 -235 l 215 -156 l 585 -156 l 585 -235 l 215 -235 z \"},\"Ł\":{\"ha\":679,\"x_min\":-8,\"x_max\":646,\"o\":\"m 33 278 l -8 351 l 132 428 l 132 911 l 247 911 l 247 479 l 492 611 l 533 538 l 247 385 l 247 99 l 646 99 l 646 0 l 132 0 l 132 333 l 33 278 z \"},\"Ḿ\":{\"ha\":1010,\"x_min\":125,\"x_max\":885,\"o\":\"m 125 0 l 125 911 l 264 911 l 439 425 q 472 330 456 378 q 504 235 488 282 l 510 235 q 541 330 526 282 q 572 425 556 378 l 744 911 l 885 911 l 885 0 l 776 0 l 776 501 q 782 636 776 563 q 792 771 788 710 l 786 771 l 714 564 l 542 92 l 465 92 l 293 564 l 221 771 l 215 771 q 224 636 219 710 q 229 501 229 563 l 229 0 l 125 0 m 479 968 l 428 1026 l 625 1204 l 690 1128 l 479 968 z \"},\"Ṁ\":{\"ha\":1010,\"x_min\":125,\"x_max\":885,\"o\":\"m 125 0 l 125 911 l 264 911 l 439 425 q 472 330 456 378 q 504 235 488 282 l 510 235 q 541 330 526 282 q 572 425 556 378 l 744 911 l 885 911 l 885 0 l 776 0 l 776 501 q 782 636 776 563 q 792 771 788 710 l 786 771 l 714 564 l 542 92 l 465 92 l 293 564 l 221 771 l 215 771 q 224 636 219 710 q 229 501 229 563 l 229 0 l 125 0 m 503 992 q 447 1013 469 992 q 424 1067 424 1033 q 447 1119 424 1099 q 503 1140 469 1140 q 559 1119 536 1140 q 582 1067 582 1099 q 559 1013 582 1033 q 503 992 536 992 z \"},\"Ṃ\":{\"ha\":1010,\"x_min\":125,\"x_max\":885,\"o\":\"m 125 0 l 125 911 l 264 911 l 439 425 q 472 330 456 378 q 504 235 488 282 l 510 235 q 541 330 526 282 q 572 425 556 378 l 744 911 l 885 911 l 885 0 l 776 0 l 776 501 q 782 636 776 563 q 792 771 788 710 l 786 771 l 714 564 l 542 92 l 465 92 l 293 564 l 221 771 l 215 771 q 224 636 219 710 q 229 501 229 563 l 229 0 l 125 0 m 506 -285 q 452 -264 474 -285 q 431 -210 431 -243 q 452 -156 431 -178 q 506 -135 474 -135 q 559 -156 538 -135 q 581 -210 581 -178 q 559 -264 581 -243 q 506 -285 538 -285 z \"},\"Ń\":{\"ha\":899,\"x_min\":125,\"x_max\":774,\"o\":\"m 125 0 l 125 911 l 244 911 l 574 339 l 672 150 l 678 150 q 669 294 674 219 q 664 440 664 368 l 664 911 l 774 911 l 774 0 l 654 0 l 324 574 l 225 761 l 219 761 q 230 620 225 692 q 235 476 235 549 l 235 0 l 125 0 m 431 968 l 379 1026 l 576 1204 l 642 1128 l 431 968 z \"},\"Ǹ\":{\"ha\":899,\"x_min\":125,\"x_max\":774,\"o\":\"m 125 0 l 125 911 l 244 911 l 574 339 l 672 150 l 678 150 q 669 294 674 219 q 664 440 664 368 l 664 911 l 774 911 l 774 0 l 654 0 l 324 574 l 225 761 l 219 761 q 230 620 225 692 q 235 476 235 549 l 235 0 l 125 0 m 478 968 l 267 1128 l 332 1204 l 529 1026 l 478 968 z \"},\"Ň\":{\"ha\":899,\"x_min\":125,\"x_max\":774,\"o\":\"m 125 0 l 125 911 l 244 911 l 574 339 l 672 150 l 678 150 q 669 294 674 219 q 664 440 664 368 l 664 911 l 774 911 l 774 0 l 654 0 l 324 574 l 225 761 l 219 761 q 230 620 225 692 q 235 476 235 549 l 235 0 l 125 0 m 393 981 l 247 1138 l 297 1174 l 450 1046 l 456 1046 l 608 1174 l 658 1138 l 513 981 l 393 981 z \"},\"Ñ\":{\"ha\":899,\"x_min\":125,\"x_max\":774,\"o\":\"m 125 0 l 125 911 l 244 911 l 574 339 l 672 150 l 678 150 q 669 294 674 219 q 664 440 664 368 l 664 911 l 774 911 l 774 0 l 654 0 l 324 574 l 225 761 l 219 761 q 230 620 225 692 q 235 476 235 549 l 235 0 l 125 0 m 557 985 q 490 1000 518 985 q 440 1034 463 1015 q 397 1068 417 1053 q 351 1083 376 1083 q 307 1060 325 1083 q 285 992 289 1036 l 207 997 q 249 1122 211 1076 q 349 1168 286 1168 q 415 1153 388 1168 q 466 1119 443 1138 q 509 1085 489 1100 q 554 1069 529 1069 q 621 1161 610 1069 l 699 1156 q 657 1030 694 1075 q 557 985 619 985 z \"},\"Ņ\":{\"ha\":899,\"x_min\":125,\"x_max\":774,\"o\":\"m 125 0 l 125 911 l 244 911 l 574 339 l 672 150 l 678 150 q 669 294 674 219 q 664 440 664 368 l 664 911 l 774 911 l 774 0 l 654 0 l 324 574 l 225 761 l 219 761 q 230 620 225 692 q 235 476 235 549 l 235 0 l 125 0 m 335 -314 l 324 -258 q 443 -235 411 -251 q 475 -192 475 -219 q 450 -151 475 -164 q 376 -133 425 -137 l 401 -81 q 528 -116 492 -92 q 564 -187 564 -140 q 505 -278 564 -249 q 335 -314 446 -308 z \"},\"Ṅ\":{\"ha\":899,\"x_min\":125,\"x_max\":774,\"o\":\"m 125 0 l 125 911 l 244 911 l 574 339 l 672 150 l 678 150 q 669 294 674 219 q 664 440 664 368 l 664 911 l 774 911 l 774 0 l 654 0 l 324 574 l 225 761 l 219 761 q 230 620 225 692 q 235 476 235 549 l 235 0 l 125 0 m 453 992 q 397 1013 419 992 q 374 1067 374 1033 q 397 1119 374 1099 q 453 1140 419 1140 q 509 1119 486 1140 q 532 1067 532 1099 q 509 1013 532 1033 q 453 992 486 992 z \"},\"Ṇ\":{\"ha\":899,\"x_min\":125,\"x_max\":774,\"o\":\"m 125 0 l 125 911 l 244 911 l 574 339 l 672 150 l 678 150 q 669 294 674 219 q 664 440 664 368 l 664 911 l 774 911 l 774 0 l 654 0 l 324 574 l 225 761 l 219 761 q 230 620 225 692 q 235 476 235 549 l 235 0 l 125 0 m 456 -285 q 402 -264 424 -285 q 381 -210 381 -243 q 402 -156 381 -178 q 456 -135 424 -135 q 509 -156 488 -135 q 531 -210 531 -178 q 509 -264 531 -243 q 456 -285 488 -285 z \"},\"Ṉ\":{\"ha\":899,\"x_min\":125,\"x_max\":774,\"o\":\"m 125 0 l 125 911 l 244 911 l 574 339 l 672 150 l 678 150 q 669 294 674 219 q 664 440 664 368 l 664 911 l 774 911 l 774 0 l 654 0 l 324 574 l 225 761 l 219 761 q 230 620 225 692 q 235 476 235 549 l 235 0 l 125 0 m 271 -235 l 271 -156 l 640 -156 l 640 -235 l 271 -235 z \"},\"Ò\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 17 375 -17 q 181 112 232 50 q 101 262 129 174 q 72 460 72 350 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 823 262 851 350 q 742 112 794 174 q 619 17 690 50 q 461 -17 547 -17 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 m 485 968 l 274 1128 l 339 1204 l 536 1026 l 485 968 z \"},\"Ó\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 17 375 -17 q 181 112 232 50 q 101 262 129 174 q 72 460 72 350 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 823 262 851 350 q 742 112 794 174 q 619 17 690 50 q 461 -17 547 -17 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 m 438 968 l 386 1026 l 583 1204 l 649 1128 l 438 968 z \"},\"Ô\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 17 375 -17 q 181 112 232 50 q 101 262 129 174 q 72 460 72 350 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 823 262 851 350 q 742 112 794 174 q 619 17 690 50 q 461 -17 547 -17 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 m 256 1007 l 401 1164 l 521 1164 l 667 1007 l 617 971 l 464 1100 l 458 1100 l 306 971 l 256 1007 z \"},\"Õ\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 17 375 -17 q 181 112 232 50 q 101 262 129 174 q 72 460 72 350 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 823 262 851 350 q 742 112 794 174 q 619 17 690 50 q 461 -17 547 -17 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 m 565 985 q 499 1000 526 985 q 448 1034 471 1015 q 405 1068 425 1053 q 360 1083 385 1083 q 315 1060 333 1083 q 293 992 297 1036 l 215 997 q 257 1122 219 1076 q 357 1168 294 1168 q 424 1153 396 1168 q 474 1119 451 1138 q 517 1085 497 1100 q 563 1069 538 1069 q 629 1161 618 1069 l 707 1156 q 665 1030 703 1075 q 565 985 628 985 z \"},\"Ö\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 17 375 -17 q 181 112 232 50 q 101 262 129 174 q 72 460 72 350 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 823 262 851 350 q 742 112 794 174 q 619 17 690 50 q 461 -17 547 -17 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 m 318 993 q 269 1013 289 993 q 250 1061 250 1032 q 269 1110 250 1092 q 318 1129 289 1129 q 367 1110 349 1129 q 386 1061 386 1092 q 367 1013 386 1032 q 318 993 349 993 m 604 993 q 555 1013 574 993 q 536 1061 536 1032 q 555 1110 536 1092 q 604 1129 574 1129 q 653 1110 633 1129 q 672 1061 672 1092 q 653 1013 672 1032 q 604 993 633 993 z \"},\"Ō\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 17 375 -17 q 181 112 232 50 q 101 262 129 174 q 72 460 72 350 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 823 262 851 350 q 742 112 794 174 q 619 17 690 50 q 461 -17 547 -17 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 m 275 1021 l 275 1100 l 647 1100 l 647 1021 l 275 1021 z \"},\"Ő\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 17 375 -17 q 181 112 232 50 q 101 262 129 174 q 72 460 72 350 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 823 262 851 350 q 742 112 794 174 q 619 17 690 50 q 461 -17 547 -17 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 m 319 1006 l 447 1217 l 525 1172 l 379 976 l 319 1006 m 542 1006 l 669 1217 l 747 1172 l 601 976 l 542 1006 z \"},\"Ǒ\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 17 375 -17 q 181 112 232 50 q 101 262 129 174 q 72 460 72 350 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 823 262 851 350 q 742 112 794 174 q 619 17 690 50 q 461 -17 547 -17 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 m 401 981 l 256 1138 l 306 1174 l 458 1046 l 464 1046 l 617 1174 l 667 1138 l 521 981 l 401 981 z \"},\"Ọ\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 17 375 -17 q 181 112 232 50 q 101 262 129 174 q 72 460 72 350 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 823 262 851 350 q 742 112 794 174 q 619 17 690 50 q 461 -17 547 -17 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 m 461 -285 q 408 -264 429 -285 q 386 -210 386 -243 q 408 -156 386 -178 q 461 -135 429 -135 q 515 -156 493 -135 q 536 -210 536 -178 q 515 -264 536 -243 q 461 -285 493 -285 z \"},\"Ỏ\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 17 375 -17 q 181 112 232 50 q 101 262 129 174 q 72 460 72 350 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 823 262 851 350 q 742 112 794 174 q 619 17 690 50 q 461 -17 547 -17 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 m 417 969 l 404 1022 q 460 1046 438 1032 q 482 1086 482 1060 q 367 1144 482 1140 l 379 1211 q 521 1180 471 1208 q 571 1099 571 1151 q 558 1047 571 1068 q 524 1009 546 1025 q 475 984 503 993 q 417 969 447 975 z \"},\"Ố\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 17 375 -17 q 181 112 232 50 q 101 262 129 174 q 72 460 72 350 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 823 262 851 350 q 742 112 794 174 q 619 17 690 50 q 461 -17 547 -17 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 m 329 971 l 282 1007 l 411 1132 l 511 1132 l 640 1007 l 593 971 l 464 1067 l 458 1067 l 329 971 m 629 1060 l 588 1104 l 722 1233 l 771 1179 l 629 1060 z \"},\"Ồ\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 17 375 -17 q 181 112 232 50 q 101 262 129 174 q 72 460 72 350 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 823 262 851 350 q 742 112 794 174 q 619 17 690 50 q 461 -17 547 -17 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 m 329 971 l 282 1007 l 411 1132 l 511 1132 l 640 1007 l 593 971 l 464 1067 l 458 1067 l 329 971 m 335 1101 l 293 1060 l 168 1182 l 217 1233 l 335 1101 z \"},\"Ổ\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 17 375 -17 q 181 112 232 50 q 101 262 129 174 q 72 460 72 350 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 823 262 851 350 q 742 112 794 174 q 619 17 690 50 q 461 -17 547 -17 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 m 329 971 l 282 1007 l 411 1132 l 511 1132 l 640 1007 l 593 971 l 464 1067 l 458 1067 l 329 971 m 621 1047 l 606 1096 q 650 1113 632 1103 q 668 1146 668 1124 q 645 1185 668 1174 q 569 1200 622 1197 l 582 1258 q 706 1231 664 1256 q 749 1157 749 1206 q 710 1080 749 1104 q 621 1047 671 1056 z \"},\"Ỗ\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 17 375 -17 q 181 112 232 50 q 101 262 129 174 q 72 460 72 350 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 823 262 851 350 q 742 112 794 174 q 619 17 690 50 q 461 -17 547 -17 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 m 329 971 l 282 1007 l 411 1128 l 511 1128 l 640 1007 l 593 971 l 464 1063 l 458 1063 l 329 971 m 260 1178 q 288 1267 263 1231 q 369 1304 313 1304 q 426 1294 403 1304 q 470 1270 450 1283 q 508 1247 490 1257 q 547 1236 526 1236 q 584 1253 572 1236 q 600 1300 596 1269 l 663 1293 q 635 1202 660 1239 q 553 1165 610 1165 q 496 1176 519 1165 q 452 1200 472 1188 q 414 1224 432 1213 q 375 1235 396 1235 q 338 1218 350 1235 q 322 1171 326 1201 l 260 1178 z \"},\"Ộ\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 17 375 -17 q 181 112 232 50 q 101 262 129 174 q 72 460 72 350 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 823 262 851 350 q 742 112 794 174 q 619 17 690 50 q 461 -17 547 -17 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 m 256 1007 l 401 1164 l 521 1164 l 667 1007 l 617 971 l 464 1100 l 458 1100 l 306 971 l 256 1007 m 461 -285 q 408 -264 429 -285 q 386 -210 386 -243 q 408 -156 386 -178 q 461 -135 429 -135 q 515 -156 493 -135 q 536 -210 536 -178 q 515 -264 536 -243 q 461 -285 493 -285 z \"},\"Ŏ\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 17 375 -17 q 181 112 232 50 q 101 262 129 174 q 72 460 72 350 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 823 262 851 350 q 742 112 794 174 q 619 17 690 50 q 461 -17 547 -17 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 m 461 979 q 376 994 413 979 q 315 1033 340 1008 q 276 1090 290 1057 q 258 1158 263 1122 l 328 1169 q 369 1087 336 1121 q 461 1053 401 1053 q 553 1087 521 1053 q 594 1169 586 1121 l 664 1158 q 646 1090 660 1122 q 607 1033 632 1057 q 546 994 582 1008 q 461 979 510 979 z \"},\"Ṓ\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 17 375 -17 q 181 112 232 50 q 101 262 129 174 q 72 460 72 350 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 823 262 851 350 q 742 112 794 174 q 619 17 690 50 q 461 -17 547 -17 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 m 436 1149 l 393 1201 l 561 1344 l 615 1278 l 436 1149 m 275 1021 l 275 1100 l 647 1100 l 647 1021 l 275 1021 z \"},\"Ø\":{\"ha\":922,\"x_min\":69,\"x_max\":860,\"o\":\"m 465 -17 q 222 74 321 -17 l 133 -42 l 69 8 l 167 135 q 100 278 124 197 q 76 460 76 360 q 105 656 76 569 q 185 803 133 743 q 308 896 236 864 q 465 928 379 928 q 710 840 610 928 l 796 953 l 860 904 l 764 781 q 832 640 808 719 q 856 460 856 560 q 827 262 856 350 q 747 112 799 174 q 623 17 694 50 q 465 -17 551 -17 m 196 460 q 208 335 196 393 q 242 233 219 278 l 642 751 q 465 826 571 826 q 355 801 404 826 q 270 728 306 775 q 215 613 235 681 q 196 460 196 544 m 465 85 q 576 111 526 85 q 660 187 625 138 q 715 305 696 236 q 735 460 735 374 q 723 582 735 526 q 689 682 711 638 l 290 163 q 465 85 360 85 z \"},\"Œ\":{\"ha\":1176,\"x_min\":72,\"x_max\":1108,\"o\":\"m 513 0 q 327 31 408 0 q 189 122 246 63 q 102 266 132 181 q 72 460 72 351 q 189 794 72 678 q 518 911 306 911 l 1094 911 l 1094 814 l 708 814 l 708 528 l 1031 528 l 1031 429 l 708 429 l 708 99 l 1108 99 l 1108 0 l 513 0 m 526 94 l 593 94 l 593 817 l 526 817 q 276 725 361 817 q 192 460 192 633 q 276 190 192 285 q 526 94 361 94 z \"},\"Ơ\":{\"ha\":922,\"x_min\":76,\"x_max\":861,\"o\":\"m 465 -17 q 308 17 379 -17 q 185 112 236 50 q 105 262 133 174 q 76 460 76 350 q 105 656 76 569 q 185 803 133 743 q 308 896 236 864 q 465 928 379 928 q 646 885 564 928 q 731 923 704 896 q 758 999 758 950 q 753 1041 758 1019 q 739 1079 747 1063 l 829 1118 q 852 1067 843 1094 q 861 1007 861 1039 q 822 896 861 936 q 713 838 782 856 q 817 681 779 776 q 856 460 856 586 q 827 262 856 350 q 747 112 799 174 q 623 17 694 50 q 465 -17 551 -17 m 465 85 q 576 111 526 85 q 660 187 625 138 q 715 305 696 236 q 735 460 735 374 q 715 613 735 544 q 660 728 696 681 q 576 801 625 775 q 465 826 526 826 q 355 801 404 826 q 270 728 306 775 q 215 613 235 681 q 196 460 196 544 q 215 305 196 374 q 270 187 235 236 q 355 111 306 138 q 465 85 404 85 z \"},\"Ớ\":{\"ha\":922,\"x_min\":76,\"x_max\":861,\"o\":\"m 465 -17 q 308 17 379 -17 q 185 112 236 50 q 105 262 133 174 q 76 460 76 350 q 105 656 76 569 q 185 803 133 743 q 308 896 236 864 q 465 928 379 928 q 646 885 564 928 q 731 923 704 896 q 758 999 758 950 q 753 1041 758 1019 q 739 1079 747 1063 l 829 1118 q 852 1067 843 1094 q 861 1007 861 1039 q 822 896 861 936 q 713 838 782 856 q 817 681 779 776 q 856 460 856 586 q 827 262 856 350 q 747 112 799 174 q 623 17 694 50 q 465 -17 551 -17 m 465 85 q 576 111 526 85 q 660 187 625 138 q 715 305 696 236 q 735 460 735 374 q 715 613 735 544 q 660 728 696 681 q 576 801 625 775 q 465 826 526 826 q 355 801 404 826 q 270 728 306 775 q 215 613 235 681 q 196 460 196 544 q 215 305 196 374 q 270 187 235 236 q 355 111 306 138 q 465 85 404 85 m 438 968 l 386 1026 l 583 1204 l 649 1128 l 438 968 z \"},\"Ờ\":{\"ha\":922,\"x_min\":76,\"x_max\":861,\"o\":\"m 465 -17 q 308 17 379 -17 q 185 112 236 50 q 105 262 133 174 q 76 460 76 350 q 105 656 76 569 q 185 803 133 743 q 308 896 236 864 q 465 928 379 928 q 646 885 564 928 q 731 923 704 896 q 758 999 758 950 q 753 1041 758 1019 q 739 1079 747 1063 l 829 1118 q 852 1067 843 1094 q 861 1007 861 1039 q 822 896 861 936 q 713 838 782 856 q 817 681 779 776 q 856 460 856 586 q 827 262 856 350 q 747 112 799 174 q 623 17 694 50 q 465 -17 551 -17 m 465 85 q 576 111 526 85 q 660 187 625 138 q 715 305 696 236 q 735 460 735 374 q 715 613 735 544 q 660 728 696 681 q 576 801 625 775 q 465 826 526 826 q 355 801 404 826 q 270 728 306 775 q 215 613 235 681 q 196 460 196 544 q 215 305 196 374 q 270 187 235 236 q 355 111 306 138 q 465 85 404 85 m 485 968 l 274 1128 l 339 1204 l 536 1026 l 485 968 z \"},\"Ở\":{\"ha\":922,\"x_min\":76,\"x_max\":861,\"o\":\"m 465 -17 q 308 17 379 -17 q 185 112 236 50 q 105 262 133 174 q 76 460 76 350 q 105 656 76 569 q 185 803 133 743 q 308 896 236 864 q 465 928 379 928 q 646 885 564 928 q 731 923 704 896 q 758 999 758 950 q 753 1041 758 1019 q 739 1079 747 1063 l 829 1118 q 852 1067 843 1094 q 861 1007 861 1039 q 822 896 861 936 q 713 838 782 856 q 817 681 779 776 q 856 460 856 586 q 827 262 856 350 q 747 112 799 174 q 623 17 694 50 q 465 -17 551 -17 m 465 85 q 576 111 526 85 q 660 187 625 138 q 715 305 696 236 q 735 460 735 374 q 715 613 735 544 q 660 728 696 681 q 576 801 625 775 q 465 826 526 826 q 355 801 404 826 q 270 728 306 775 q 215 613 235 681 q 196 460 196 544 q 215 305 196 374 q 270 187 235 236 q 355 111 306 138 q 465 85 404 85 m 417 969 l 404 1022 q 460 1046 438 1032 q 482 1086 482 1060 q 367 1144 482 1140 l 379 1211 q 521 1180 471 1208 q 571 1099 571 1151 q 558 1047 571 1068 q 524 1009 546 1025 q 475 984 503 993 q 417 969 447 975 z \"},\"Ỡ\":{\"ha\":922,\"x_min\":76,\"x_max\":861,\"o\":\"m 465 -17 q 308 17 379 -17 q 185 112 236 50 q 105 262 133 174 q 76 460 76 350 q 105 656 76 569 q 185 803 133 743 q 308 896 236 864 q 465 928 379 928 q 646 885 564 928 q 731 923 704 896 q 758 999 758 950 q 753 1041 758 1019 q 739 1079 747 1063 l 829 1118 q 852 1067 843 1094 q 861 1007 861 1039 q 822 896 861 936 q 713 838 782 856 q 817 681 779 776 q 856 460 856 586 q 827 262 856 350 q 747 112 799 174 q 623 17 694 50 q 465 -17 551 -17 m 465 85 q 576 111 526 85 q 660 187 625 138 q 715 305 696 236 q 735 460 735 374 q 715 613 735 544 q 660 728 696 681 q 576 801 625 775 q 465 826 526 826 q 355 801 404 826 q 270 728 306 775 q 215 613 235 681 q 196 460 196 544 q 215 305 196 374 q 270 187 235 236 q 355 111 306 138 q 465 85 404 85 m 556 985 q 489 1000 517 985 q 438 1034 461 1015 q 395 1068 415 1053 q 350 1083 375 1083 q 306 1060 324 1083 q 283 992 288 1036 l 206 997 q 247 1122 210 1076 q 347 1168 285 1168 q 414 1153 386 1168 q 465 1119 442 1138 q 508 1085 488 1100 q 553 1069 528 1069 q 619 1161 608 1069 l 697 1156 q 656 1030 693 1075 q 556 985 618 985 z \"},\"Ợ\":{\"ha\":922,\"x_min\":76,\"x_max\":861,\"o\":\"m 465 -17 q 308 17 379 -17 q 185 112 236 50 q 105 262 133 174 q 76 460 76 350 q 105 656 76 569 q 185 803 133 743 q 308 896 236 864 q 465 928 379 928 q 646 885 564 928 q 731 923 704 896 q 758 999 758 950 q 753 1041 758 1019 q 739 1079 747 1063 l 829 1118 q 852 1067 843 1094 q 861 1007 861 1039 q 822 896 861 936 q 713 838 782 856 q 817 681 779 776 q 856 460 856 586 q 827 262 856 350 q 747 112 799 174 q 623 17 694 50 q 465 -17 551 -17 m 465 85 q 576 111 526 85 q 660 187 625 138 q 715 305 696 236 q 735 460 735 374 q 715 613 735 544 q 660 728 696 681 q 576 801 625 775 q 465 826 526 826 q 355 801 404 826 q 270 728 306 775 q 215 613 235 681 q 196 460 196 544 q 215 305 196 374 q 270 187 235 236 q 355 111 306 138 q 465 85 404 85 m 461 -285 q 408 -264 429 -285 q 386 -210 386 -243 q 408 -156 386 -178 q 461 -135 429 -135 q 515 -156 493 -135 q 536 -210 536 -178 q 515 -264 536 -243 q 461 -285 493 -285 z \"},\"Ǫ\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 501 -294 q 408 -264 446 -294 q 369 -174 369 -233 q 394 -87 369 -128 q 454 -15 418 -46 q 296 21 367 -14 q 175 117 225 56 q 99 266 125 179 q 72 460 72 353 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 833 293 851 367 q 777 163 814 219 q 688 63 740 106 q 567 -10 635 21 q 484 -74 510 -35 q 458 -149 458 -112 q 479 -197 458 -181 q 525 -212 500 -212 q 555 -208 542 -212 q 581 -193 568 -203 l 613 -256 q 561 -283 593 -271 q 501 -294 529 -294 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 z \"},\"Ŕ\":{\"ha\":790,\"x_min\":125,\"x_max\":756,\"o\":\"m 125 0 l 125 911 l 410 911 q 538 898 479 911 q 640 854 597 885 q 706 775 682 824 q 729 656 729 726 q 674 485 729 549 q 524 397 618 421 l 756 0 l 625 0 l 406 385 l 240 385 l 240 0 l 125 0 m 240 479 l 393 479 q 557 523 500 479 q 614 656 614 567 q 557 782 614 746 q 393 818 500 818 l 240 818 l 240 479 m 376 968 l 325 1026 l 522 1204 l 588 1128 l 376 968 z \"},\"Ř\":{\"ha\":790,\"x_min\":125,\"x_max\":756,\"o\":\"m 125 0 l 125 911 l 410 911 q 538 898 479 911 q 640 854 597 885 q 706 775 682 824 q 729 656 729 726 q 674 485 729 549 q 524 397 618 421 l 756 0 l 625 0 l 406 385 l 240 385 l 240 0 l 125 0 m 240 479 l 393 479 q 557 523 500 479 q 614 656 614 567 q 557 782 614 746 q 393 818 500 818 l 240 818 l 240 479 m 340 981 l 194 1138 l 244 1174 l 397 1046 l 403 1046 l 556 1174 l 606 1138 l 460 981 l 340 981 z \"},\"Ṙ\":{\"ha\":790,\"x_min\":125,\"x_max\":756,\"o\":\"m 125 0 l 125 911 l 410 911 q 538 898 479 911 q 640 854 597 885 q 706 775 682 824 q 729 656 729 726 q 674 485 729 549 q 524 397 618 421 l 756 0 l 625 0 l 406 385 l 240 385 l 240 0 l 125 0 m 240 479 l 393 479 q 557 523 500 479 q 614 656 614 567 q 557 782 614 746 q 393 818 500 818 l 240 818 l 240 479 m 400 992 q 344 1013 367 992 q 321 1067 321 1033 q 344 1119 321 1099 q 400 1140 367 1140 q 456 1119 433 1140 q 479 1067 479 1099 q 456 1013 479 1033 q 400 992 433 992 z \"},\"Ŗ\":{\"ha\":790,\"x_min\":125,\"x_max\":756,\"o\":\"m 125 0 l 125 911 l 410 911 q 538 898 479 911 q 640 854 597 885 q 706 775 682 824 q 729 656 729 726 q 674 485 729 549 q 524 397 618 421 l 756 0 l 625 0 l 406 385 l 240 385 l 240 0 l 125 0 m 240 479 l 393 479 q 557 523 500 479 q 614 656 614 567 q 557 782 614 746 q 393 818 500 818 l 240 818 l 240 479 m 300 -314 l 289 -258 q 408 -235 376 -251 q 440 -192 440 -219 q 415 -151 440 -164 q 342 -133 390 -137 l 367 -81 q 493 -116 457 -92 q 529 -187 529 -140 q 470 -278 529 -249 q 300 -314 411 -308 z \"},\"Ṛ\":{\"ha\":790,\"x_min\":125,\"x_max\":756,\"o\":\"m 125 0 l 125 911 l 410 911 q 538 898 479 911 q 640 854 597 885 q 706 775 682 824 q 729 656 729 726 q 674 485 729 549 q 524 397 618 421 l 756 0 l 625 0 l 406 385 l 240 385 l 240 0 l 125 0 m 240 479 l 393 479 q 557 523 500 479 q 614 656 614 567 q 557 782 614 746 q 393 818 500 818 l 240 818 l 240 479 m 421 -285 q 367 -264 389 -285 q 346 -210 346 -243 q 367 -156 346 -178 q 421 -135 389 -135 q 474 -156 453 -135 q 496 -210 496 -178 q 474 -264 496 -243 q 421 -285 453 -285 z \"},\"Ṝ\":{\"ha\":790,\"x_min\":125,\"x_max\":756,\"o\":\"m 125 0 l 125 911 l 410 911 q 538 898 479 911 q 640 854 597 885 q 706 775 682 824 q 729 656 729 726 q 674 485 729 549 q 524 397 618 421 l 756 0 l 625 0 l 406 385 l 240 385 l 240 0 l 125 0 m 240 479 l 393 479 q 557 523 500 479 q 614 656 614 567 q 557 782 614 746 q 393 818 500 818 l 240 818 l 240 479 m 214 1021 l 214 1100 l 586 1100 l 586 1021 l 214 1021 m 421 -285 q 367 -264 389 -285 q 346 -210 346 -243 q 367 -156 346 -178 q 421 -135 389 -135 q 474 -156 453 -135 q 496 -210 496 -178 q 474 -264 496 -243 q 421 -285 453 -285 z \"},\"Ṟ\":{\"ha\":790,\"x_min\":125,\"x_max\":756,\"o\":\"m 125 0 l 125 911 l 410 911 q 538 898 479 911 q 640 854 597 885 q 706 775 682 824 q 729 656 729 726 q 674 485 729 549 q 524 397 618 421 l 756 0 l 625 0 l 406 385 l 240 385 l 240 0 l 125 0 m 240 479 l 393 479 q 557 523 500 479 q 614 656 614 567 q 557 782 614 746 q 393 818 500 818 l 240 818 l 240 479 m 236 -235 l 236 -156 l 606 -156 l 606 -235 l 236 -235 z \"},\"Ś\":{\"ha\":742,\"x_min\":58,\"x_max\":688,\"o\":\"m 378 -17 q 200 19 282 -17 q 58 118 118 56 l 128 199 q 242 116 176 147 q 379 85 308 85 q 519 126 469 85 q 569 233 569 167 q 558 292 569 268 q 526 334 546 317 q 478 365 506 351 q 418 394 450 379 l 288 451 q 222 485 256 465 q 163 532 189 504 q 119 598 136 560 q 103 686 103 636 q 124 782 103 738 q 184 859 146 826 q 274 910 222 892 q 389 928 326 928 q 540 897 471 928 q 658 815 610 865 l 596 740 q 503 803 554 781 q 389 826 453 826 q 266 791 313 826 q 219 693 219 756 q 233 637 219 660 q 268 597 246 614 q 317 566 290 579 q 371 542 343 553 l 500 486 q 574 448 539 469 q 633 398 608 426 q 673 331 658 369 q 688 243 688 293 q 666 142 688 189 q 604 59 644 94 q 507 3 564 24 q 378 -17 450 -17 m 364 968 l 313 1026 l 510 1204 l 575 1128 l 364 968 z \"},\"Ŝ\":{\"ha\":742,\"x_min\":58,\"x_max\":688,\"o\":\"m 378 -17 q 200 19 282 -17 q 58 118 118 56 l 128 199 q 242 116 176 147 q 379 85 308 85 q 519 126 469 85 q 569 233 569 167 q 558 292 569 268 q 526 334 546 317 q 478 365 506 351 q 418 394 450 379 l 288 451 q 222 485 256 465 q 163 532 189 504 q 119 598 136 560 q 103 686 103 636 q 124 782 103 738 q 184 859 146 826 q 274 910 222 892 q 389 928 326 928 q 540 897 471 928 q 658 815 610 865 l 596 740 q 503 803 554 781 q 389 826 453 826 q 266 791 313 826 q 219 693 219 756 q 233 637 219 660 q 268 597 246 614 q 317 566 290 579 q 371 542 343 553 l 500 486 q 574 448 539 469 q 633 398 608 426 q 673 331 658 369 q 688 243 688 293 q 666 142 688 189 q 604 59 644 94 q 507 3 564 24 q 378 -17 450 -17 m 182 1007 l 328 1164 l 447 1164 l 593 1007 l 543 971 l 390 1100 l 385 1100 l 232 971 l 182 1007 z \"},\"Š\":{\"ha\":742,\"x_min\":58,\"x_max\":688,\"o\":\"m 378 -17 q 200 19 282 -17 q 58 118 118 56 l 128 199 q 242 116 176 147 q 379 85 308 85 q 519 126 469 85 q 569 233 569 167 q 558 292 569 268 q 526 334 546 317 q 478 365 506 351 q 418 394 450 379 l 288 451 q 222 485 256 465 q 163 532 189 504 q 119 598 136 560 q 103 686 103 636 q 124 782 103 738 q 184 859 146 826 q 274 910 222 892 q 389 928 326 928 q 540 897 471 928 q 658 815 610 865 l 596 740 q 503 803 554 781 q 389 826 453 826 q 266 791 313 826 q 219 693 219 756 q 233 637 219 660 q 268 597 246 614 q 317 566 290 579 q 371 542 343 553 l 500 486 q 574 448 539 469 q 633 398 608 426 q 673 331 658 369 q 688 243 688 293 q 666 142 688 189 q 604 59 644 94 q 507 3 564 24 q 378 -17 450 -17 m 328 981 l 182 1138 l 232 1174 l 385 1046 l 390 1046 l 543 1174 l 593 1138 l 447 981 l 328 981 z \"},\"Ş\":{\"ha\":742,\"x_min\":58,\"x_max\":688,\"o\":\"m 378 -17 q 200 19 282 -17 q 58 118 118 56 l 128 199 q 242 116 176 147 q 379 85 308 85 q 519 126 469 85 q 569 233 569 167 q 558 292 569 268 q 526 334 546 317 q 478 365 506 351 q 418 394 450 379 l 288 451 q 222 485 256 465 q 163 532 189 504 q 119 598 136 560 q 103 686 103 636 q 124 782 103 738 q 184 859 146 826 q 274 910 222 892 q 389 928 326 928 q 540 897 471 928 q 658 815 610 865 l 596 740 q 503 803 554 781 q 389 826 453 826 q 266 791 313 826 q 219 693 219 756 q 233 637 219 660 q 268 597 246 614 q 317 566 290 579 q 371 542 343 553 l 500 486 q 574 448 539 469 q 633 398 608 426 q 673 331 658 369 q 688 243 688 293 q 666 142 688 189 q 604 59 644 94 q 507 3 564 24 q 378 -17 450 -17 m 258 -314 l 247 -258 q 367 -235 335 -251 q 399 -189 399 -219 q 375 -146 399 -161 q 292 -122 351 -131 l 353 4 l 426 4 l 386 -89 q 461 -122 435 -100 q 488 -187 488 -144 q 428 -278 488 -249 q 258 -314 369 -308 z \"},\"Ș\":{\"ha\":742,\"x_min\":58,\"x_max\":688,\"o\":\"m 378 -17 q 200 19 282 -17 q 58 118 118 56 l 128 199 q 242 116 176 147 q 379 85 308 85 q 519 126 469 85 q 569 233 569 167 q 558 292 569 268 q 526 334 546 317 q 478 365 506 351 q 418 394 450 379 l 288 451 q 222 485 256 465 q 163 532 189 504 q 119 598 136 560 q 103 686 103 636 q 124 782 103 738 q 184 859 146 826 q 274 910 222 892 q 389 928 326 928 q 540 897 471 928 q 658 815 610 865 l 596 740 q 503 803 554 781 q 389 826 453 826 q 266 791 313 826 q 219 693 219 756 q 233 637 219 660 q 268 597 246 614 q 317 566 290 579 q 371 542 343 553 l 500 486 q 574 448 539 469 q 633 398 608 426 q 673 331 658 369 q 688 243 688 293 q 666 142 688 189 q 604 59 644 94 q 507 3 564 24 q 378 -17 450 -17 m 258 -314 l 247 -258 q 367 -235 335 -251 q 399 -192 399 -219 q 374 -151 399 -164 q 300 -133 349 -137 l 325 -81 q 451 -116 415 -92 q 488 -187 488 -140 q 428 -278 488 -249 q 258 -314 369 -308 z \"},\"Ṡ\":{\"ha\":742,\"x_min\":58,\"x_max\":688,\"o\":\"m 378 -17 q 200 19 282 -17 q 58 118 118 56 l 128 199 q 242 116 176 147 q 379 85 308 85 q 519 126 469 85 q 569 233 569 167 q 558 292 569 268 q 526 334 546 317 q 478 365 506 351 q 418 394 450 379 l 288 451 q 222 485 256 465 q 163 532 189 504 q 119 598 136 560 q 103 686 103 636 q 124 782 103 738 q 184 859 146 826 q 274 910 222 892 q 389 928 326 928 q 540 897 471 928 q 658 815 610 865 l 596 740 q 503 803 554 781 q 389 826 453 826 q 266 791 313 826 q 219 693 219 756 q 233 637 219 660 q 268 597 246 614 q 317 566 290 579 q 371 542 343 553 l 500 486 q 574 448 539 469 q 633 398 608 426 q 673 331 658 369 q 688 243 688 293 q 666 142 688 189 q 604 59 644 94 q 507 3 564 24 q 378 -17 450 -17 m 388 992 q 331 1013 354 992 q 308 1067 308 1033 q 331 1119 308 1099 q 388 1140 354 1140 q 444 1119 421 1140 q 467 1067 467 1099 q 444 1013 467 1033 q 388 992 421 992 z \"},\"Ṣ\":{\"ha\":742,\"x_min\":58,\"x_max\":688,\"o\":\"m 378 -17 q 200 19 282 -17 q 58 118 118 56 l 128 199 q 242 116 176 147 q 379 85 308 85 q 519 126 469 85 q 569 233 569 167 q 558 292 569 268 q 526 334 546 317 q 478 365 506 351 q 418 394 450 379 l 288 451 q 222 485 256 465 q 163 532 189 504 q 119 598 136 560 q 103 686 103 636 q 124 782 103 738 q 184 859 146 826 q 274 910 222 892 q 389 928 326 928 q 540 897 471 928 q 658 815 610 865 l 596 740 q 503 803 554 781 q 389 826 453 826 q 266 791 313 826 q 219 693 219 756 q 233 637 219 660 q 268 597 246 614 q 317 566 290 579 q 371 542 343 553 l 500 486 q 574 448 539 469 q 633 398 608 426 q 673 331 658 369 q 688 243 688 293 q 666 142 688 189 q 604 59 644 94 q 507 3 564 24 q 378 -17 450 -17 m 379 -285 q 326 -264 347 -285 q 304 -210 304 -243 q 326 -156 304 -178 q 379 -135 347 -135 q 433 -156 411 -135 q 454 -210 454 -178 q 433 -264 454 -243 q 379 -285 411 -285 z \"},\"ẞ\":{\"ha\":926,\"x_min\":126,\"x_max\":867,\"o\":\"m 603 -17 q 458 13 522 -17 q 351 89 394 42 l 418 164 q 500 100 458 119 q 593 81 542 81 q 707 124 667 81 q 747 238 747 168 q 735 299 747 269 q 693 353 724 328 q 610 397 663 378 q 479 431 558 417 l 472 506 l 663 718 q 594 799 639 765 q 478 832 549 832 q 305 766 367 832 q 243 558 243 700 l 243 0 l 126 0 l 126 579 q 219 835 126 743 q 482 928 313 928 q 672 869 599 928 q 783 714 746 811 l 592 503 q 802 406 738 474 q 867 238 867 338 q 848 137 867 183 q 794 56 829 90 q 711 3 760 22 q 603 -17 663 -17 z \"},\"Ť\":{\"ha\":744,\"x_min\":39,\"x_max\":706,\"o\":\"m 314 0 l 314 814 l 39 814 l 39 911 l 706 911 l 706 814 l 431 814 l 431 0 l 314 0 m 311 981 l 165 1138 l 215 1174 l 368 1046 l 374 1046 l 526 1174 l 576 1138 l 431 981 l 311 981 z \"},\"Ţ\":{\"ha\":744,\"x_min\":39,\"x_max\":706,\"o\":\"m 314 0 l 314 814 l 39 814 l 39 911 l 706 911 l 706 814 l 431 814 l 431 0 l 314 0 m 246 -314 l 235 -258 q 354 -235 322 -251 q 386 -189 386 -219 q 363 -146 386 -161 q 279 -122 339 -131 l 340 4 l 414 4 l 374 -89 q 449 -122 422 -100 q 475 -187 475 -144 q 416 -278 475 -249 q 246 -314 357 -308 z \"},\"Ț\":{\"ha\":744,\"x_min\":39,\"x_max\":706,\"o\":\"m 314 0 l 314 814 l 39 814 l 39 911 l 706 911 l 706 814 l 431 814 l 431 0 l 314 0 m 253 -314 l 242 -258 q 361 -235 329 -251 q 393 -192 393 -219 q 368 -151 393 -164 q 294 -133 343 -137 l 319 -81 q 446 -116 410 -92 q 482 -187 482 -140 q 423 -278 482 -249 q 253 -314 364 -308 z \"},\"Ṭ\":{\"ha\":744,\"x_min\":39,\"x_max\":706,\"o\":\"m 314 0 l 314 814 l 39 814 l 39 911 l 706 911 l 706 814 l 431 814 l 431 0 l 314 0 m 374 -285 q 320 -264 342 -285 q 299 -210 299 -243 q 320 -156 299 -178 q 374 -135 342 -135 q 427 -156 406 -135 q 449 -210 449 -178 q 427 -264 449 -243 q 374 -285 406 -285 z \"},\"Ṯ\":{\"ha\":744,\"x_min\":39,\"x_max\":706,\"o\":\"m 314 0 l 314 814 l 39 814 l 39 911 l 706 911 l 706 814 l 431 814 l 431 0 l 314 0 m 189 -235 l 189 -156 l 558 -156 l 558 -235 l 189 -235 z \"},\"Ŧ\":{\"ha\":744,\"x_min\":39,\"x_max\":706,\"o\":\"m 314 0 l 314 435 l 143 435 l 143 496 l 265 500 l 314 500 l 314 814 l 39 814 l 39 911 l 706 911 l 706 814 l 431 814 l 431 500 l 601 500 l 601 435 l 431 435 l 431 0 l 314 0 z \"},\"Ù\":{\"ha\":896,\"x_min\":121,\"x_max\":775,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 775 911 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 m 471 968 l 260 1128 l 325 1204 l 522 1026 l 471 968 z \"},\"Ú\":{\"ha\":896,\"x_min\":121,\"x_max\":775,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 775 911 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 m 424 968 l 372 1026 l 569 1204 l 635 1128 l 424 968 z \"},\"Û\":{\"ha\":896,\"x_min\":121,\"x_max\":775,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 775 911 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 m 242 1007 l 388 1164 l 507 1164 l 653 1007 l 603 971 l 450 1100 l 444 1100 l 292 971 l 242 1007 z \"},\"Ũ\":{\"ha\":896,\"x_min\":121,\"x_max\":775,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 775 911 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 m 551 985 q 485 1000 513 985 q 434 1034 457 1015 q 391 1068 411 1053 q 346 1083 371 1083 q 301 1060 319 1083 q 279 992 283 1036 l 201 997 q 243 1122 206 1076 q 343 1168 281 1168 q 410 1153 382 1168 q 460 1119 438 1138 q 503 1085 483 1100 q 549 1069 524 1069 q 615 1161 604 1069 l 693 1156 q 651 1030 689 1075 q 551 985 614 985 z \"},\"Ü\":{\"ha\":896,\"x_min\":121,\"x_max\":775,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 775 911 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 m 304 993 q 256 1013 275 993 q 236 1061 236 1032 q 256 1110 236 1092 q 304 1129 275 1129 q 353 1110 335 1129 q 372 1061 372 1092 q 353 1013 372 1032 q 304 993 335 993 m 590 993 q 541 1013 560 993 q 522 1061 522 1032 q 541 1110 522 1092 q 590 1129 560 1129 q 639 1110 619 1129 q 658 1061 658 1092 q 639 1013 658 1032 q 590 993 619 993 z \"},\"Ū\":{\"ha\":896,\"x_min\":121,\"x_max\":775,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 775 911 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 m 261 1021 l 261 1100 l 633 1100 l 633 1021 l 261 1021 z \"},\"Ŭ\":{\"ha\":896,\"x_min\":121,\"x_max\":775,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 775 911 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 m 447 979 q 363 994 399 979 q 301 1033 326 1008 q 263 1090 276 1057 q 244 1158 249 1122 l 314 1169 q 355 1087 322 1121 q 447 1053 388 1053 q 540 1087 507 1053 q 581 1169 572 1121 l 650 1158 q 632 1090 646 1122 q 593 1033 618 1057 q 532 994 568 1008 q 447 979 496 979 z \"},\"Ů\":{\"ha\":896,\"x_min\":121,\"x_max\":775,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 775 911 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 m 447 971 q 351 1005 389 971 q 313 1096 313 1039 q 351 1188 313 1154 q 447 1222 389 1222 q 544 1188 506 1222 q 582 1096 582 1154 q 544 1005 582 1039 q 447 971 506 971 m 447 1021 q 497 1040 475 1021 q 518 1096 518 1060 q 497 1151 518 1132 q 447 1171 475 1171 q 396 1151 417 1171 q 375 1096 375 1132 q 396 1040 375 1060 q 447 1021 417 1021 z \"},\"Ű\":{\"ha\":896,\"x_min\":121,\"x_max\":775,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 775 911 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 m 306 1006 l 433 1217 l 511 1172 l 365 976 l 306 1006 m 528 1006 l 656 1217 l 733 1172 l 588 976 l 528 1006 z \"},\"Ǔ\":{\"ha\":896,\"x_min\":121,\"x_max\":775,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 775 911 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 m 388 981 l 242 1138 l 292 1174 l 444 1046 l 450 1046 l 603 1174 l 653 1138 l 507 981 l 388 981 z \"},\"Ǖ\":{\"ha\":896,\"x_min\":121,\"x_max\":775,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 775 911 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 m 304 993 q 259 1011 276 993 q 242 1057 242 1029 q 259 1102 242 1085 q 304 1119 276 1119 q 350 1102 332 1119 q 368 1057 368 1085 q 350 1011 368 1029 q 304 993 332 993 m 261 1196 l 261 1260 l 633 1260 l 633 1196 l 261 1196 m 590 993 q 544 1011 563 993 q 526 1057 526 1029 q 544 1102 526 1085 q 590 1119 563 1119 q 635 1102 618 1119 q 653 1057 653 1085 q 635 1011 653 1029 q 590 993 618 993 z \"},\"Ǘ\":{\"ha\":896,\"x_min\":121,\"x_max\":775,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 775 911 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 m 304 993 q 259 1011 276 993 q 242 1057 242 1029 q 259 1102 242 1085 q 304 1119 276 1119 q 350 1102 332 1119 q 368 1057 368 1085 q 350 1011 368 1029 q 304 993 332 993 m 394 1179 l 526 1344 l 600 1294 l 446 1143 l 394 1179 m 590 993 q 544 1011 563 993 q 526 1057 526 1029 q 544 1102 526 1085 q 590 1119 563 1119 q 635 1102 618 1119 q 653 1057 653 1085 q 635 1011 653 1029 q 590 993 618 993 z \"},\"Ǚ\":{\"ha\":896,\"x_min\":121,\"x_max\":775,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 775 911 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 m 397 1165 l 260 1299 l 306 1336 l 444 1232 l 450 1232 l 589 1336 l 635 1299 l 497 1165 l 397 1165 m 304 993 q 259 1011 276 993 q 242 1057 242 1029 q 259 1102 242 1085 q 304 1119 276 1119 q 350 1102 332 1119 q 368 1057 368 1085 q 350 1011 368 1029 q 304 993 332 993 m 590 993 q 544 1011 563 993 q 526 1057 526 1029 q 544 1102 526 1085 q 590 1119 563 1119 q 635 1102 618 1119 q 653 1057 653 1085 q 635 1011 653 1029 q 590 993 618 993 z \"},\"Ǜ\":{\"ha\":896,\"x_min\":121,\"x_max\":775,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 775 911 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 m 500 1179 l 449 1143 l 294 1294 l 368 1344 l 500 1179 m 304 993 q 259 1011 276 993 q 242 1057 242 1029 q 259 1102 242 1085 q 304 1119 276 1119 q 350 1102 332 1119 q 368 1057 368 1085 q 350 1011 368 1029 q 304 993 332 993 m 590 993 q 544 1011 563 993 q 526 1057 526 1029 q 544 1102 526 1085 q 590 1119 563 1119 q 635 1102 618 1119 q 653 1057 653 1085 q 635 1011 653 1029 q 590 993 618 993 z \"},\"Ụ\":{\"ha\":896,\"x_min\":121,\"x_max\":775,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 775 911 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 m 447 -285 q 394 -264 415 -285 q 372 -210 372 -243 q 394 -156 372 -178 q 447 -135 415 -135 q 501 -156 479 -135 q 522 -210 522 -178 q 501 -264 522 -243 q 447 -285 479 -285 z \"},\"Ủ\":{\"ha\":896,\"x_min\":121,\"x_max\":775,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 775 911 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 m 403 969 l 390 1022 q 446 1046 424 1032 q 468 1086 468 1060 q 353 1144 468 1140 l 365 1211 q 507 1180 457 1208 q 557 1099 557 1151 q 544 1047 557 1068 q 510 1009 532 1025 q 461 984 489 993 q 403 969 433 975 z \"},\"Ų\":{\"ha\":896,\"x_min\":121,\"x_max\":775,\"o\":\"m 486 -294 q 392 -264 431 -294 q 353 -174 353 -233 q 362 -122 353 -144 q 384 -79 371 -99 q 413 -44 397 -60 q 442 -15 429 -28 q 312 8 371 -14 q 210 77 253 31 q 144 197 168 124 q 121 376 121 271 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 775 911 l 775 376 q 759 222 775 285 q 714 115 743 158 q 644 42 685 71 q 553 -10 603 14 q 471 -75 499 -36 q 443 -149 443 -114 q 464 -197 443 -181 q 510 -212 485 -212 q 565 -193 539 -212 l 597 -256 q 546 -283 578 -271 q 486 -294 514 -294 z \"},\"Ư\":{\"ha\":915,\"x_min\":121,\"x_max\":936,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 710 911 q 801 943 768 918 q 835 1026 835 968 q 829 1069 835 1047 q 814 1107 824 1090 l 904 1146 q 928 1094 919 1122 q 936 1035 936 1067 q 924 965 936 994 q 890 915 911 936 q 838 882 868 894 q 775 861 808 869 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 z \"},\"Ứ\":{\"ha\":915,\"x_min\":121,\"x_max\":936,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 710 911 q 801 943 768 918 q 835 1026 835 968 q 829 1069 835 1047 q 814 1107 824 1090 l 904 1146 q 928 1094 919 1122 q 936 1035 936 1067 q 924 965 936 994 q 890 915 911 936 q 838 882 868 894 q 775 861 808 869 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 m 424 968 l 372 1026 l 569 1204 l 635 1128 l 424 968 z \"},\"Ừ\":{\"ha\":915,\"x_min\":121,\"x_max\":936,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 710 911 q 801 943 768 918 q 835 1026 835 968 q 829 1069 835 1047 q 814 1107 824 1090 l 904 1146 q 928 1094 919 1122 q 936 1035 936 1067 q 924 965 936 994 q 890 915 911 936 q 838 882 868 894 q 775 861 808 869 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 m 471 968 l 260 1128 l 325 1204 l 522 1026 l 471 968 z \"},\"Ử\":{\"ha\":915,\"x_min\":121,\"x_max\":936,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 710 911 q 801 943 768 918 q 835 1026 835 968 q 829 1069 835 1047 q 814 1107 824 1090 l 904 1146 q 928 1094 919 1122 q 936 1035 936 1067 q 924 965 936 994 q 890 915 911 936 q 838 882 868 894 q 775 861 808 869 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 m 403 969 l 390 1022 q 446 1046 424 1032 q 468 1086 468 1060 q 353 1144 468 1140 l 365 1211 q 507 1180 457 1208 q 557 1099 557 1151 q 544 1047 557 1068 q 510 1009 532 1025 q 461 984 489 993 q 403 969 433 975 z \"},\"Ữ\":{\"ha\":915,\"x_min\":121,\"x_max\":936,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 710 911 q 801 943 768 918 q 835 1026 835 968 q 829 1069 835 1047 q 814 1107 824 1090 l 904 1146 q 928 1094 919 1122 q 936 1035 936 1067 q 924 965 936 994 q 890 915 911 936 q 838 882 868 894 q 775 861 808 869 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 m 551 985 q 485 1000 513 985 q 434 1034 457 1015 q 391 1068 411 1053 q 346 1083 371 1083 q 301 1060 319 1083 q 279 992 283 1036 l 201 997 q 243 1122 206 1076 q 343 1168 281 1168 q 410 1153 382 1168 q 460 1119 438 1138 q 503 1085 483 1100 q 549 1069 524 1069 q 615 1161 604 1069 l 693 1156 q 651 1030 689 1075 q 551 985 614 985 z \"},\"Ự\":{\"ha\":915,\"x_min\":121,\"x_max\":936,\"o\":\"m 449 -17 q 319 3 379 -17 q 215 70 258 24 q 146 192 171 117 q 121 376 121 267 l 121 911 l 236 911 l 236 374 q 253 236 236 292 q 298 147 269 181 q 365 99 326 114 q 449 85 404 85 q 533 99 494 85 q 601 147 572 114 q 647 236 631 181 q 664 374 664 292 l 664 911 l 710 911 q 801 943 768 918 q 835 1026 835 968 q 829 1069 835 1047 q 814 1107 824 1090 l 904 1146 q 928 1094 919 1122 q 936 1035 936 1067 q 924 965 936 994 q 890 915 911 936 q 838 882 868 894 q 775 861 808 869 l 775 376 q 750 192 775 267 q 681 70 725 117 q 578 3 638 24 q 449 -17 518 -17 m 447 -285 q 394 -264 415 -285 q 372 -210 372 -243 q 394 -156 372 -178 q 447 -135 415 -135 q 501 -156 479 -135 q 522 -210 522 -178 q 501 -264 522 -243 q 447 -285 479 -285 z \"},\"Ẁ\":{\"ha\":1092,\"x_min\":32,\"x_max\":1058,\"o\":\"m 225 0 l 32 911 l 151 911 l 247 415 q 274 268 260 340 q 300 121 288 196 l 306 121 q 338 269 321 196 q 369 415 354 342 l 496 911 l 601 911 l 728 415 q 761 269 744 343 q 794 121 778 196 l 800 121 q 825 269 813 196 q 851 415 838 342 l 947 911 l 1058 911 l 869 0 l 731 0 l 593 549 q 570 652 581 601 q 549 756 560 703 l 543 756 q 520 652 532 703 q 497 549 508 601 l 363 0 l 225 0 m 569 968 l 358 1128 l 424 1204 l 621 1026 l 569 968 z \"},\"Ẃ\":{\"ha\":1092,\"x_min\":32,\"x_max\":1058,\"o\":\"m 225 0 l 32 911 l 151 911 l 247 415 q 274 268 260 340 q 300 121 288 196 l 306 121 q 338 269 321 196 q 369 415 354 342 l 496 911 l 601 911 l 728 415 q 761 269 744 343 q 794 121 778 196 l 800 121 q 825 269 813 196 q 851 415 838 342 l 947 911 l 1058 911 l 869 0 l 731 0 l 593 549 q 570 652 581 601 q 549 756 560 703 l 543 756 q 520 652 532 703 q 497 549 508 601 l 363 0 l 225 0 m 522 968 l 471 1026 l 668 1204 l 733 1128 l 522 968 z \"},\"Ŵ\":{\"ha\":1092,\"x_min\":32,\"x_max\":1058,\"o\":\"m 225 0 l 32 911 l 151 911 l 247 415 q 274 268 260 340 q 300 121 288 196 l 306 121 q 338 269 321 196 q 369 415 354 342 l 496 911 l 601 911 l 728 415 q 761 269 744 343 q 794 121 778 196 l 800 121 q 825 269 813 196 q 851 415 838 342 l 947 911 l 1058 911 l 869 0 l 731 0 l 593 549 q 570 652 581 601 q 549 756 560 703 l 543 756 q 520 652 532 703 q 497 549 508 601 l 363 0 l 225 0 m 340 1007 l 486 1164 l 606 1164 l 751 1007 l 701 971 l 549 1100 l 543 1100 l 390 971 l 340 1007 z \"},\"Ẅ\":{\"ha\":1092,\"x_min\":32,\"x_max\":1058,\"o\":\"m 225 0 l 32 911 l 151 911 l 247 415 q 274 268 260 340 q 300 121 288 196 l 306 121 q 338 269 321 196 q 369 415 354 342 l 496 911 l 601 911 l 728 415 q 761 269 744 343 q 794 121 778 196 l 800 121 q 825 269 813 196 q 851 415 838 342 l 947 911 l 1058 911 l 869 0 l 731 0 l 593 549 q 570 652 581 601 q 549 756 560 703 l 543 756 q 520 652 532 703 q 497 549 508 601 l 363 0 l 225 0 m 403 993 q 354 1013 374 993 q 335 1061 335 1032 q 354 1110 335 1092 q 403 1129 374 1129 q 452 1110 433 1129 q 471 1061 471 1092 q 452 1013 471 1032 q 403 993 433 993 m 689 993 q 640 1013 658 993 q 621 1061 621 1032 q 640 1110 621 1092 q 689 1129 658 1129 q 738 1110 718 1129 q 757 1061 757 1092 q 738 1013 757 1032 q 689 993 718 993 z \"},\"Ỳ\":{\"ha\":661,\"x_min\":-1,\"x_max\":663,\"o\":\"m 272 0 l 272 353 l -1 911 l 122 911 l 240 654 q 283 556 263 604 q 328 456 304 507 l 333 456 q 381 556 357 507 q 425 654 404 604 l 542 911 l 663 911 l 389 353 l 389 0 l 272 0 m 354 968 l 143 1128 l 208 1204 l 406 1026 l 354 968 z \"},\"Ý\":{\"ha\":661,\"x_min\":-1,\"x_max\":663,\"o\":\"m 272 0 l 272 353 l -1 911 l 122 911 l 240 654 q 283 556 263 604 q 328 456 304 507 l 333 456 q 381 556 357 507 q 425 654 404 604 l 542 911 l 663 911 l 389 353 l 389 0 l 272 0 m 307 968 l 256 1026 l 453 1204 l 518 1128 l 307 968 z \"},\"Ŷ\":{\"ha\":661,\"x_min\":-1,\"x_max\":663,\"o\":\"m 272 0 l 272 353 l -1 911 l 122 911 l 240 654 q 283 556 263 604 q 328 456 304 507 l 333 456 q 381 556 357 507 q 425 654 404 604 l 542 911 l 663 911 l 389 353 l 389 0 l 272 0 m 125 1007 l 271 1164 l 390 1164 l 536 1007 l 486 971 l 333 1100 l 328 1100 l 175 971 l 125 1007 z \"},\"Ÿ\":{\"ha\":661,\"x_min\":-1,\"x_max\":663,\"o\":\"m 272 0 l 272 353 l -1 911 l 122 911 l 240 654 q 283 556 263 604 q 328 456 304 507 l 333 456 q 381 556 357 507 q 425 654 404 604 l 542 911 l 663 911 l 389 353 l 389 0 l 272 0 m 188 993 q 139 1013 158 993 q 119 1061 119 1032 q 139 1110 119 1092 q 188 1129 158 1129 q 237 1110 218 1129 q 256 1061 256 1092 q 237 1013 256 1032 q 188 993 218 993 m 474 993 q 424 1013 443 993 q 406 1061 406 1032 q 424 1110 406 1092 q 474 1129 443 1129 q 522 1110 503 1129 q 542 1061 542 1092 q 522 1013 542 1032 q 474 993 503 993 z \"},\"Ẏ\":{\"ha\":661,\"x_min\":-1,\"x_max\":663,\"o\":\"m 272 0 l 272 353 l -1 911 l 122 911 l 240 654 q 283 556 263 604 q 328 456 304 507 l 333 456 q 381 556 357 507 q 425 654 404 604 l 542 911 l 663 911 l 389 353 l 389 0 l 272 0 m 331 992 q 274 1013 297 992 q 251 1067 251 1033 q 274 1119 251 1099 q 331 1140 297 1140 q 387 1119 364 1140 q 410 1067 410 1099 q 387 1013 410 1033 q 331 992 364 992 z \"},\"Ỵ\":{\"ha\":661,\"x_min\":-1,\"x_max\":663,\"o\":\"m 272 0 l 272 353 l -1 911 l 122 911 l 240 654 q 283 556 263 604 q 328 456 304 507 l 333 456 q 381 556 357 507 q 425 654 404 604 l 542 911 l 663 911 l 389 353 l 389 0 l 272 0 m 333 -285 q 280 -264 301 -285 q 258 -210 258 -243 q 280 -156 258 -178 q 333 -135 301 -135 q 387 -156 365 -135 q 408 -210 408 -178 q 387 -264 408 -243 q 333 -285 365 -285 z \"},\"Ỷ\":{\"ha\":661,\"x_min\":-1,\"x_max\":663,\"o\":\"m 272 0 l 272 353 l -1 911 l 122 911 l 240 654 q 283 556 263 604 q 328 456 304 507 l 333 456 q 381 556 357 507 q 425 654 404 604 l 542 911 l 663 911 l 389 353 l 389 0 l 272 0 m 286 969 l 274 1022 q 329 1046 307 1032 q 351 1086 351 1060 q 236 1144 351 1140 l 249 1211 q 390 1180 340 1208 q 440 1099 440 1151 q 428 1047 440 1068 q 394 1009 415 1025 q 344 984 372 993 q 286 969 317 975 z \"},\"Ỹ\":{\"ha\":661,\"x_min\":-1,\"x_max\":663,\"o\":\"m 272 0 l 272 353 l -1 911 l 122 911 l 240 654 q 283 556 263 604 q 328 456 304 507 l 333 456 q 381 556 357 507 q 425 654 404 604 l 542 911 l 663 911 l 389 353 l 389 0 l 272 0 m 435 985 q 368 1000 396 985 q 317 1034 340 1015 q 274 1068 294 1053 q 229 1083 254 1083 q 185 1060 203 1083 q 163 992 167 1036 l 85 997 q 126 1122 89 1076 q 226 1168 164 1168 q 293 1153 265 1168 q 344 1119 321 1138 q 387 1085 367 1100 q 432 1069 407 1069 q 499 1161 488 1069 l 576 1156 q 535 1030 572 1075 q 435 985 497 985 z \"},\"Ź\":{\"ha\":749,\"x_min\":63,\"x_max\":690,\"o\":\"m 63 0 l 63 69 l 542 814 l 106 814 l 106 911 l 686 911 l 686 843 l 206 99 l 690 99 l 690 0 l 63 0 m 365 968 l 314 1026 l 511 1204 l 576 1128 l 365 968 z \"},\"Ž\":{\"ha\":749,\"x_min\":63,\"x_max\":690,\"o\":\"m 63 0 l 63 69 l 542 814 l 106 814 l 106 911 l 686 911 l 686 843 l 206 99 l 690 99 l 690 0 l 63 0 m 329 981 l 183 1138 l 233 1174 l 386 1046 l 392 1046 l 544 1174 l 594 1138 l 449 981 l 329 981 z \"},\"Ż\":{\"ha\":749,\"x_min\":63,\"x_max\":690,\"o\":\"m 63 0 l 63 69 l 542 814 l 106 814 l 106 911 l 686 911 l 686 843 l 206 99 l 690 99 l 690 0 l 63 0 m 389 992 q 333 1013 356 992 q 310 1067 310 1033 q 333 1119 310 1099 q 389 1140 356 1140 q 445 1119 422 1140 q 468 1067 468 1099 q 445 1013 468 1033 q 389 992 422 992 z \"},\"Ẓ\":{\"ha\":749,\"x_min\":63,\"x_max\":690,\"o\":\"m 63 0 l 63 69 l 542 814 l 106 814 l 106 911 l 686 911 l 686 843 l 206 99 l 690 99 l 690 0 l 63 0 m 390 -285 q 337 -264 358 -285 q 315 -210 315 -243 q 337 -156 315 -178 q 390 -135 358 -135 q 444 -156 422 -135 q 465 -210 465 -178 q 444 -264 465 -243 q 390 -285 422 -285 z \"},\"Ẕ\":{\"ha\":749,\"x_min\":63,\"x_max\":690,\"o\":\"m 63 0 l 63 69 l 542 814 l 106 814 l 106 911 l 686 911 l 686 843 l 206 99 l 690 99 l 690 0 l 63 0 m 206 -235 l 206 -156 l 575 -156 l 575 -235 l 206 -235 z \"},\"Ð\":{\"ha\":886,\"x_min\":46,\"x_max\":814,\"o\":\"m 46 446 l 46 506 l 156 511 l 156 911 l 383 911 q 704 794 594 911 q 814 460 814 678 q 786 266 814 351 q 704 122 758 181 q 571 31 650 63 q 389 0 492 0 l 156 0 l 156 446 l 46 446 m 271 94 l 375 94 q 615 190 535 94 q 694 460 694 286 q 615 725 694 633 q 375 817 535 817 l 271 817 l 271 511 l 478 511 l 478 446 l 271 446 l 271 94 z \"},\"Þ\":{\"ha\":810,\"x_min\":125,\"x_max\":740,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 758 l 404 758 q 542 744 479 758 q 648 699 604 731 q 716 616 692 667 q 740 490 740 565 q 716 365 740 418 q 647 276 692 311 q 541 225 603 242 q 404 208 479 208 l 240 208 l 240 0 l 125 0 m 240 303 l 390 303 q 567 347 510 303 q 625 490 625 392 q 567 626 625 589 q 390 664 508 664 l 240 664 l 240 303 z \"},\"Ə\":{\"ha\":914,\"x_min\":81,\"x_max\":842,\"o\":\"m 454 -17 q 297 16 367 -17 q 180 110 228 49 q 106 258 132 171 q 81 451 81 344 q 81 467 81 458 q 83 486 82 476 l 728 486 q 651 743 721 654 q 451 832 582 832 q 326 807 382 832 q 229 742 269 782 l 172 821 q 294 898 221 868 q 460 928 367 928 q 740 808 639 928 q 842 458 842 688 q 815 256 842 344 q 737 108 788 168 q 615 15 686 47 q 454 -17 543 -17 m 454 79 q 642 160 571 79 q 725 397 714 242 l 199 397 q 274 163 206 246 q 454 79 343 79 z \"},\"Ŋ\":{\"ha\":882,\"x_min\":125,\"x_max\":810,\"o\":\"m 564 -17 q 506 -12 536 -17 q 456 4 475 -7 l 483 108 q 515 97 499 101 q 553 93 531 93 q 606 110 581 93 q 649 171 631 128 q 679 285 668 214 q 690 465 690 357 q 674 638 690 568 q 628 749 658 707 q 557 808 599 790 q 465 826 515 826 q 407 816 438 826 q 347 788 376 806 q 289 744 317 769 q 240 690 261 719 l 240 0 l 125 0 l 125 911 l 238 911 l 238 799 q 354 891 286 854 q 494 928 422 928 q 620 903 563 928 q 720 824 678 879 q 786 681 763 769 q 810 465 810 593 q 792 242 810 333 q 742 93 775 150 q 665 10 710 36 q 564 -17 619 -17 z \"},\"Ĳ\":{\"ha\":731,\"x_min\":125,\"x_max\":606,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 0 l 125 0 m 419 -229 q 363 -224 388 -229 q 319 -212 338 -219 l 342 -121 q 372 -129 356 -125 q 406 -133 388 -133 q 474 -98 457 -133 q 490 0 490 -62 l 490 911 l 606 911 l 606 -4 q 563 -169 606 -108 q 419 -229 519 -229 z \"},\"à\":{\"ha\":700,\"x_min\":72,\"x_max\":601,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 m 383 796 l 165 1008 l 246 1085 l 442 853 l 383 796 z \"},\"á\":{\"ha\":700,\"x_min\":72,\"x_max\":601,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 m 344 796 l 286 853 l 482 1085 l 563 1008 l 344 796 z \"},\"â\":{\"ha\":700,\"x_min\":72,\"x_max\":601,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 m 149 833 l 307 1028 l 421 1028 l 579 833 l 531 789 l 367 946 l 361 946 l 197 789 l 149 833 z \"},\"ã\":{\"ha\":700,\"x_min\":72,\"x_max\":604,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 m 464 801 q 400 819 426 801 q 351 860 374 838 q 309 900 329 882 q 265 918 289 918 q 218 888 233 918 q 200 808 203 857 l 124 813 q 134 888 125 853 q 160 947 143 922 q 202 987 176 972 q 264 1001 228 1001 q 328 983 301 1001 q 376 943 354 965 q 419 903 399 921 q 464 885 439 885 q 510 915 494 885 q 528 994 525 946 l 604 989 q 594 915 603 949 q 568 856 585 881 q 526 816 551 831 q 464 801 500 801 z \"},\"ä\":{\"ha\":700,\"x_min\":72,\"x_max\":601,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 m 231 815 q 181 835 200 815 q 161 885 161 856 q 181 934 161 914 q 231 954 200 954 q 279 934 260 954 q 299 885 299 914 q 279 835 299 856 q 231 815 260 815 m 497 815 q 449 835 468 815 q 429 885 429 856 q 449 934 429 914 q 497 954 468 954 q 547 934 528 954 q 567 885 567 914 q 547 835 567 856 q 497 815 528 815 z \"},\"ā\":{\"ha\":700,\"x_min\":72,\"x_max\":601,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 m 179 835 l 179 914 l 549 914 l 549 835 l 179 835 z \"},\"ă\":{\"ha\":700,\"x_min\":72,\"x_max\":601,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 m 364 793 q 268 811 308 793 q 202 859 228 829 q 163 926 176 889 q 147 1003 150 964 l 218 1014 q 233 962 222 988 q 261 915 243 936 q 305 882 279 894 q 364 869 331 869 q 423 882 397 869 q 467 915 449 894 q 495 962 485 936 q 510 1014 506 988 l 581 1003 q 565 926 578 964 q 525 859 551 889 q 459 811 499 829 q 364 793 419 793 z \"},\"å\":{\"ha\":700,\"x_min\":72,\"x_max\":601,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 m 364 769 q 252 808 293 769 q 211 907 211 847 q 252 1004 211 965 q 364 1043 293 1043 q 476 1004 435 1043 q 517 907 517 965 q 476 808 517 847 q 364 769 435 769 m 364 821 q 420 844 397 821 q 443 907 443 867 q 420 969 443 946 q 364 992 397 992 q 308 969 331 992 q 285 907 285 946 q 308 844 285 867 q 364 821 331 821 z \"},\"ǎ\":{\"ha\":700,\"x_min\":72,\"x_max\":601,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 m 307 797 l 149 992 l 197 1036 l 361 879 l 367 879 l 531 1036 l 579 992 l 421 797 l 307 797 z \"},\"ạ\":{\"ha\":700,\"x_min\":72,\"x_max\":601,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 m 342 -285 q 288 -264 310 -285 q 267 -210 267 -243 q 288 -156 267 -178 q 342 -135 310 -135 q 395 -156 374 -135 q 417 -210 417 -178 q 395 -264 417 -243 q 342 -285 374 -285 z \"},\"ả\":{\"ha\":700,\"x_min\":72,\"x_max\":601,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 m 319 794 l 307 850 q 363 873 340 858 q 385 915 385 888 q 269 981 385 975 l 276 1056 q 424 1020 372 1053 q 475 925 475 988 q 462 873 475 894 q 427 835 449 851 q 378 810 406 819 q 319 794 350 800 z \"},\"ấ\":{\"ha\":700,\"x_min\":72,\"x_max\":690,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 m 218 792 l 178 839 l 317 967 l 411 967 l 550 839 l 510 792 l 367 892 l 361 892 l 218 792 m 501 924 l 622 1090 l 690 1043 l 550 885 l 501 924 z \"},\"ầ\":{\"ha\":700,\"x_min\":21,\"x_max\":601,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 m 218 792 l 178 839 l 317 967 l 411 967 l 550 839 l 510 792 l 367 892 l 361 892 l 218 792 m 226 928 l 178 885 l 21 1040 l 88 1090 l 226 928 z \"},\"ẩ\":{\"ha\":700,\"x_min\":72,\"x_max\":654,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 m 218 792 l 178 839 l 317 967 l 411 967 l 550 839 l 510 792 l 367 892 l 361 892 l 218 792 m 525 882 l 513 931 q 555 950 539 938 q 571 985 571 963 q 549 1026 571 1013 q 475 1042 526 1039 l 485 1099 q 610 1071 567 1096 q 654 997 654 1046 q 643 950 654 969 q 614 917 632 931 q 573 896 596 904 q 525 882 550 888 z \"},\"ẫ\":{\"ha\":700,\"x_min\":72,\"x_max\":601,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 m 218 792 l 178 839 l 317 961 l 411 961 l 550 839 l 510 792 l 367 888 l 361 888 l 218 792 m 174 992 q 202 1081 179 1046 q 274 1115 225 1115 q 328 1106 304 1115 q 372 1086 351 1097 q 410 1066 392 1075 q 449 1057 429 1057 q 479 1071 469 1057 q 494 1115 489 1085 l 554 1110 q 526 1022 549 1057 q 454 986 503 986 q 400 995 424 986 q 356 1015 376 1004 q 317 1035 336 1026 q 279 1044 299 1044 q 249 1031 258 1044 q 233 986 239 1017 l 174 992 z \"},\"ậ\":{\"ha\":700,\"x_min\":72,\"x_max\":601,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 m 149 833 l 307 1028 l 421 1028 l 579 833 l 531 789 l 367 946 l 361 946 l 197 789 l 149 833 m 342 -285 q 288 -264 310 -285 q 267 -210 267 -243 q 288 -156 267 -178 q 342 -135 310 -135 q 395 -156 374 -135 q 417 -210 417 -178 q 395 -264 417 -243 q 342 -285 374 -285 z \"},\"ắ\":{\"ha\":700,\"x_min\":72,\"x_max\":601,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 m 357 943 l 303 983 l 425 1156 l 497 1100 l 357 943 m 364 793 q 268 811 308 793 q 202 859 228 829 q 163 926 176 889 q 147 1003 150 964 l 214 1014 q 228 959 218 986 q 258 911 239 932 q 303 877 276 890 q 364 864 329 864 q 425 877 399 864 q 470 911 451 890 q 499 959 489 932 q 514 1014 510 986 l 581 1003 q 565 926 578 964 q 525 859 551 889 q 459 811 499 829 q 364 793 419 793 z \"},\"ằ\":{\"ha\":700,\"x_min\":72,\"x_max\":601,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 m 371 943 l 231 1100 l 303 1156 l 425 983 l 371 943 m 364 793 q 268 811 308 793 q 202 859 228 829 q 163 926 176 889 q 147 1003 150 964 l 214 1014 q 228 959 218 986 q 258 911 239 932 q 303 877 276 890 q 364 864 329 864 q 425 877 399 864 q 470 911 451 890 q 499 959 489 932 q 514 1014 510 986 l 581 1003 q 565 926 578 964 q 525 859 551 889 q 459 811 499 829 q 364 793 419 793 z \"},\"ẳ\":{\"ha\":700,\"x_min\":72,\"x_max\":601,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 m 326 947 l 315 997 q 363 1017 344 1004 q 382 1051 382 1029 q 358 1092 382 1079 q 276 1108 333 1106 l 286 1178 q 418 1147 371 1175 q 465 1064 465 1119 q 453 1016 465 1036 q 422 982 442 996 q 378 960 403 968 q 326 947 353 951 m 364 793 q 268 811 308 793 q 202 859 228 829 q 163 926 176 889 q 147 1003 150 964 l 214 1014 q 228 959 218 986 q 258 911 239 932 q 303 877 276 890 q 364 864 329 864 q 425 877 399 864 q 470 911 451 890 q 499 959 489 932 q 514 1014 510 986 l 581 1003 q 565 926 578 964 q 525 859 551 889 q 459 811 499 829 q 364 793 419 793 z \"},\"ẵ\":{\"ha\":700,\"x_min\":72,\"x_max\":601,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 m 364 793 q 276 806 313 793 q 216 841 240 819 q 179 889 192 863 q 164 942 167 915 l 229 953 q 267 888 235 918 q 364 858 299 858 q 461 888 429 858 q 499 953 493 918 l 564 942 q 549 889 561 915 q 512 841 536 863 q 451 806 488 819 q 364 793 415 793 m 168 992 q 198 1079 174 1044 q 274 1114 222 1114 q 328 1105 304 1114 q 372 1085 351 1096 q 410 1065 392 1074 q 449 1056 429 1056 q 479 1070 469 1056 q 494 1114 489 1085 l 560 1108 q 530 1021 554 1056 q 454 986 506 986 q 400 995 424 986 q 356 1015 376 1004 q 317 1035 336 1026 q 279 1044 299 1044 q 249 1030 258 1044 q 233 985 239 1015 l 168 992 z \"},\"ặ\":{\"ha\":700,\"x_min\":72,\"x_max\":601,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 m 364 793 q 268 811 308 793 q 202 859 228 829 q 163 926 176 889 q 147 1003 150 964 l 218 1014 q 233 962 222 988 q 261 915 243 936 q 305 882 279 894 q 364 869 331 869 q 423 882 397 869 q 467 915 449 894 q 495 962 485 936 q 510 1014 506 988 l 581 1003 q 565 926 578 964 q 525 859 551 889 q 459 811 499 829 q 364 793 419 793 m 342 -285 q 288 -264 310 -285 q 267 -210 267 -243 q 288 -156 267 -178 q 342 -135 310 -135 q 395 -156 374 -135 q 417 -210 417 -178 q 395 -264 417 -243 q 342 -285 374 -285 z \"},\"ą\":{\"ha\":700,\"x_min\":72,\"x_max\":631,\"o\":\"m 522 -286 q 433 -256 469 -286 q 396 -168 396 -226 q 406 -115 396 -140 q 431 -67 415 -89 q 467 -26 447 -44 q 507 6 488 -7 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 q 512 -65 543 -24 q 481 -146 481 -106 q 500 -194 481 -178 q 544 -210 519 -210 q 575 -205 561 -210 q 601 -192 589 -200 l 631 -249 q 580 -275 611 -264 q 522 -286 549 -286 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 z \"},\"æ\":{\"ha\":1090,\"x_min\":81,\"x_max\":1038,\"o\":\"m 279 -17 q 137 33 193 -17 q 81 175 81 83 q 179 345 81 286 q 489 428 278 404 q 483 490 489 460 q 462 544 478 521 q 419 583 446 568 q 351 597 393 597 q 246 575 296 597 q 156 525 196 553 l 110 604 q 224 663 157 635 q 365 692 290 692 q 489 653 440 692 q 558 549 538 615 q 655 653 599 615 q 781 692 711 692 q 891 669 843 692 q 972 606 939 647 q 1021 505 1004 564 q 1038 374 1038 446 q 1033 310 1038 335 l 596 310 q 615 214 597 257 q 660 140 632 171 q 725 93 688 110 q 806 76 763 76 q 893 92 854 76 q 969 132 932 108 l 1011 53 q 914 4 967 25 q 792 -17 861 -17 q 650 22 707 -17 q 554 110 593 60 q 415 15 485 47 q 279 -17 344 -17 m 311 75 q 414 102 358 75 q 515 179 469 129 q 497 242 504 206 q 489 318 490 279 l 489 353 q 352 326 408 342 q 260 290 296 311 q 209 242 225 269 q 193 183 193 215 q 227 100 193 125 q 311 75 261 75 m 596 386 l 938 386 q 897 546 938 490 q 778 601 856 601 q 656 544 707 601 q 596 386 606 486 z \"},\"ǽ\":{\"ha\":1090,\"x_min\":81,\"x_max\":1038,\"o\":\"m 279 -17 q 137 33 193 -17 q 81 175 81 83 q 179 345 81 286 q 489 428 278 404 q 483 490 489 460 q 462 544 478 521 q 419 583 446 568 q 351 597 393 597 q 246 575 296 597 q 156 525 196 553 l 110 604 q 224 663 157 635 q 365 692 290 692 q 489 653 440 692 q 558 549 538 615 q 655 653 599 615 q 781 692 711 692 q 891 669 843 692 q 972 606 939 647 q 1021 505 1004 564 q 1038 374 1038 446 q 1033 310 1038 335 l 596 310 q 615 214 597 257 q 660 140 632 171 q 725 93 688 110 q 806 76 763 76 q 893 92 854 76 q 969 132 932 108 l 1011 53 q 914 4 967 25 q 792 -17 861 -17 q 650 22 707 -17 q 554 110 593 60 q 415 15 485 47 q 279 -17 344 -17 m 311 75 q 414 102 358 75 q 515 179 469 129 q 497 242 504 206 q 489 318 490 279 l 489 353 q 352 326 408 342 q 260 290 296 311 q 209 242 225 269 q 193 183 193 215 q 227 100 193 125 q 311 75 261 75 m 596 386 l 938 386 q 897 546 938 490 q 778 601 856 601 q 656 544 707 601 q 596 386 606 486 m 553 796 l 494 853 l 690 1085 l 771 1008 l 553 796 z \"},\"ǣ\":{\"ha\":1090,\"x_min\":81,\"x_max\":1038,\"o\":\"m 279 -17 q 137 33 193 -17 q 81 175 81 83 q 179 345 81 286 q 489 428 278 404 q 483 490 489 460 q 462 544 478 521 q 419 583 446 568 q 351 597 393 597 q 246 575 296 597 q 156 525 196 553 l 110 604 q 224 663 157 635 q 365 692 290 692 q 489 653 440 692 q 558 549 538 615 q 655 653 599 615 q 781 692 711 692 q 891 669 843 692 q 972 606 939 647 q 1021 505 1004 564 q 1038 374 1038 446 q 1033 310 1038 335 l 596 310 q 615 214 597 257 q 660 140 632 171 q 725 93 688 110 q 806 76 763 76 q 893 92 854 76 q 969 132 932 108 l 1011 53 q 914 4 967 25 q 792 -17 861 -17 q 650 22 707 -17 q 554 110 593 60 q 415 15 485 47 q 279 -17 344 -17 m 311 75 q 414 102 358 75 q 515 179 469 129 q 497 242 504 206 q 489 318 490 279 l 489 353 q 352 326 408 342 q 260 290 296 311 q 209 242 225 269 q 193 183 193 215 q 227 100 193 125 q 311 75 261 75 m 596 386 l 938 386 q 897 546 938 490 q 778 601 856 601 q 656 544 707 601 q 596 386 606 486 m 388 835 l 388 914 l 757 914 l 757 835 l 388 835 z \"},\"ƀ\":{\"ha\":756,\"x_min\":11,\"x_max\":704,\"o\":\"m 413 -17 q 315 6 365 -17 q 219 69 264 29 l 215 69 l 206 0 l 114 0 l 114 793 l 11 793 l 11 853 l 114 860 l 114 989 l 228 989 l 228 860 l 481 860 l 481 793 l 228 793 l 228 664 l 225 543 q 325 610 271 583 q 436 638 379 638 q 551 615 501 638 q 635 551 601 592 q 687 451 669 510 q 704 322 704 393 q 681 180 704 243 q 617 73 657 117 q 524 6 576 29 q 413 -17 471 -17 m 393 79 q 470 97 435 79 q 531 145 506 114 q 572 222 557 176 q 586 321 586 267 q 576 409 586 368 q 545 479 567 450 q 490 525 524 508 q 408 542 456 542 q 228 449 325 542 l 228 150 q 316 95 272 111 q 393 79 360 79 z \"},\"ḇ\":{\"ha\":768,\"x_min\":114,\"x_max\":704,\"o\":\"m 413 -17 q 315 6 365 -17 q 219 69 264 29 l 215 69 l 206 0 l 114 0 l 114 989 l 228 989 l 228 719 l 225 597 q 325 665 271 638 q 436 692 379 692 q 551 667 501 692 q 635 598 601 643 q 687 490 669 553 q 704 349 704 426 q 681 194 704 263 q 617 79 657 126 q 524 8 576 32 q 413 -17 471 -17 m 393 79 q 470 98 435 79 q 531 151 506 117 q 572 235 557 185 q 586 347 586 285 q 576 449 586 403 q 545 527 567 494 q 490 578 524 560 q 408 596 456 596 q 228 504 326 596 l 228 150 q 316 95 272 111 q 393 79 360 79 m 208 -235 l 208 -156 l 578 -156 l 578 -235 l 208 -235 z \"},\"ç\":{\"ha\":633,\"x_min\":64,\"x_max\":599,\"o\":\"m 381 -17 q 256 7 314 -17 q 155 76 197 31 q 88 187 113 121 q 64 336 64 253 q 90 487 64 421 q 161 599 117 553 q 265 668 206 644 q 389 692 324 692 q 503 668 456 692 q 586 613 550 644 l 528 538 q 466 581 499 564 q 393 597 433 597 q 308 578 347 597 q 242 525 269 560 q 198 442 214 490 q 182 336 182 394 q 197 231 182 278 q 240 149 213 183 q 306 97 267 115 q 390 78 344 78 q 477 98 438 78 q 549 146 517 118 l 599 69 q 497 6 553 29 q 381 -17 442 -17 m 257 -314 l 246 -258 q 365 -235 333 -251 q 397 -189 397 -219 q 374 -146 397 -161 q 290 -122 350 -131 l 351 4 l 425 4 l 385 -89 q 460 -122 433 -100 q 486 -187 486 -144 q 427 -278 486 -249 q 257 -314 368 -308 z \"},\"ć\":{\"ha\":633,\"x_min\":64,\"x_max\":599,\"o\":\"m 381 -17 q 256 7 314 -17 q 155 76 197 31 q 88 187 113 121 q 64 336 64 253 q 90 487 64 421 q 161 599 117 553 q 265 668 206 644 q 389 692 324 692 q 503 668 456 692 q 586 613 550 644 l 528 538 q 466 581 499 564 q 393 597 433 597 q 308 578 347 597 q 242 525 269 560 q 198 442 214 490 q 182 336 182 394 q 197 231 182 278 q 240 149 213 183 q 306 97 267 115 q 390 78 344 78 q 477 98 438 78 q 549 146 517 118 l 599 69 q 497 6 553 29 q 381 -17 442 -17 m 368 796 l 310 853 l 506 1085 l 586 1008 l 368 796 z \"},\"ĉ\":{\"ha\":633,\"x_min\":64,\"x_max\":603,\"o\":\"m 381 -17 q 256 7 314 -17 q 155 76 197 31 q 88 187 113 121 q 64 336 64 253 q 90 487 64 421 q 161 599 117 553 q 265 668 206 644 q 389 692 324 692 q 503 668 456 692 q 586 613 550 644 l 528 538 q 466 581 499 564 q 393 597 433 597 q 308 578 347 597 q 242 525 269 560 q 198 442 214 490 q 182 336 182 394 q 197 231 182 278 q 240 149 213 183 q 306 97 267 115 q 390 78 344 78 q 477 98 438 78 q 549 146 517 118 l 599 69 q 497 6 553 29 q 381 -17 442 -17 m 172 833 l 331 1028 l 444 1028 l 603 833 l 554 789 l 390 946 l 385 946 l 221 789 l 172 833 z \"},\"č\":{\"ha\":633,\"x_min\":64,\"x_max\":603,\"o\":\"m 381 -17 q 256 7 314 -17 q 155 76 197 31 q 88 187 113 121 q 64 336 64 253 q 90 487 64 421 q 161 599 117 553 q 265 668 206 644 q 389 692 324 692 q 503 668 456 692 q 586 613 550 644 l 528 538 q 466 581 499 564 q 393 597 433 597 q 308 578 347 597 q 242 525 269 560 q 198 442 214 490 q 182 336 182 394 q 197 231 182 278 q 240 149 213 183 q 306 97 267 115 q 390 78 344 78 q 477 98 438 78 q 549 146 517 118 l 599 69 q 497 6 553 29 q 381 -17 442 -17 m 331 797 l 172 992 l 221 1036 l 385 879 l 390 879 l 554 1036 l 603 992 l 444 797 l 331 797 z \"},\"ċ\":{\"ha\":633,\"x_min\":64,\"x_max\":599,\"o\":\"m 381 -17 q 256 7 314 -17 q 155 76 197 31 q 88 187 113 121 q 64 336 64 253 q 90 487 64 421 q 161 599 117 553 q 265 668 206 644 q 389 692 324 692 q 503 668 456 692 q 586 613 550 644 l 528 538 q 466 581 499 564 q 393 597 433 597 q 308 578 347 597 q 242 525 269 560 q 198 442 214 490 q 182 336 182 394 q 197 231 182 278 q 240 149 213 183 q 306 97 267 115 q 390 78 344 78 q 477 98 438 78 q 549 146 517 118 l 599 69 q 497 6 553 29 q 381 -17 442 -17 m 388 814 q 334 835 356 814 q 313 889 313 856 q 334 942 313 921 q 388 964 356 964 q 441 942 419 964 q 463 889 463 921 q 441 835 463 856 q 388 814 419 814 z \"},\"ď\":{\"ha\":796,\"x_min\":65,\"x_max\":813,\"o\":\"m 344 -17 q 141 75 217 -17 q 65 336 65 167 q 90 484 65 418 q 154 596 114 550 q 247 667 194 642 q 358 692 300 692 q 460 671 417 692 q 547 614 503 650 l 542 729 l 542 989 l 657 989 l 657 0 l 563 0 l 553 79 l 549 79 q 456 12 508 40 q 344 -17 404 -17 m 369 79 q 458 102 417 79 q 542 172 500 125 l 542 525 q 459 580 499 564 q 378 596 419 596 q 302 577 338 596 q 240 524 267 558 q 199 443 214 490 q 183 338 183 396 q 232 147 183 215 q 369 79 281 79 m 736 761 l 731 1056 l 813 1056 l 811 976 l 792 761 l 736 761 z \"},\"ḍ\":{\"ha\":771,\"x_min\":65,\"x_max\":657,\"o\":\"m 344 -17 q 141 75 217 -17 q 65 336 65 167 q 90 484 65 418 q 154 596 114 550 q 247 667 194 642 q 358 692 300 692 q 460 671 417 692 q 547 614 503 650 l 542 729 l 542 989 l 657 989 l 657 0 l 563 0 l 553 79 l 549 79 q 456 12 508 40 q 344 -17 404 -17 m 369 79 q 458 102 417 79 q 542 172 500 125 l 542 525 q 459 580 499 564 q 378 596 419 596 q 302 577 338 596 q 240 524 267 558 q 199 443 214 490 q 183 338 183 396 q 232 147 183 215 q 369 79 281 79 m 419 -285 q 366 -264 388 -285 q 344 -210 344 -243 q 366 -156 344 -178 q 419 -135 388 -135 q 473 -156 451 -135 q 494 -210 494 -178 q 473 -264 494 -243 q 419 -285 451 -285 z \"},\"ḏ\":{\"ha\":771,\"x_min\":65,\"x_max\":657,\"o\":\"m 344 -17 q 141 75 217 -17 q 65 336 65 167 q 90 484 65 418 q 154 596 114 550 q 247 667 194 642 q 358 692 300 692 q 460 671 417 692 q 547 614 503 650 l 542 729 l 542 989 l 657 989 l 657 0 l 563 0 l 553 79 l 549 79 q 456 12 508 40 q 344 -17 404 -17 m 369 79 q 458 102 417 79 q 542 172 500 125 l 542 525 q 459 580 499 564 q 378 596 419 596 q 302 577 338 596 q 240 524 267 558 q 199 443 214 490 q 183 338 183 396 q 232 147 183 215 q 369 79 281 79 m 233 -235 l 233 -156 l 603 -156 l 603 -235 l 233 -235 z \"},\"đ\":{\"ha\":771,\"x_min\":65,\"x_max\":757,\"o\":\"m 344 -17 q 141 69 217 -17 q 65 310 65 154 q 90 445 65 385 q 154 548 114 506 q 247 614 194 590 q 358 638 300 638 q 460 616 417 638 q 547 558 503 594 l 542 675 l 542 793 l 318 793 l 318 860 l 542 860 l 542 989 l 657 989 l 657 860 l 757 860 l 757 800 l 657 793 l 657 0 l 560 0 l 551 76 l 547 76 q 457 10 508 38 q 344 -17 406 -17 m 369 79 q 458 102 417 79 q 542 172 500 125 l 542 471 q 459 526 499 510 q 378 542 419 542 q 302 524 338 542 q 240 476 267 507 q 199 403 214 446 q 183 311 183 361 q 232 142 183 204 q 369 79 281 79 z \"},\"è\":{\"ha\":689,\"x_min\":64,\"x_max\":636,\"o\":\"m 388 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 511 4 565 25 q 388 -17 457 -17 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 m 388 796 l 169 1008 l 250 1085 l 446 853 l 388 796 z \"},\"é\":{\"ha\":689,\"x_min\":64,\"x_max\":636,\"o\":\"m 388 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 511 4 565 25 q 388 -17 457 -17 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 m 349 796 l 290 853 l 486 1085 l 567 1008 l 349 796 z \"},\"ê\":{\"ha\":689,\"x_min\":64,\"x_max\":636,\"o\":\"m 388 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 511 4 565 25 q 388 -17 457 -17 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 m 153 833 l 311 1028 l 425 1028 l 583 833 l 535 789 l 371 946 l 365 946 l 201 789 l 153 833 z \"},\"ě\":{\"ha\":689,\"x_min\":64,\"x_max\":636,\"o\":\"m 388 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 511 4 565 25 q 388 -17 457 -17 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 m 311 797 l 153 992 l 201 1036 l 365 879 l 371 879 l 535 1036 l 583 992 l 425 797 l 311 797 z \"},\"ë\":{\"ha\":689,\"x_min\":64,\"x_max\":636,\"o\":\"m 388 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 511 4 565 25 q 388 -17 457 -17 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 m 235 815 q 185 835 204 815 q 165 885 165 856 q 185 934 165 914 q 235 954 204 954 q 283 934 264 954 q 303 885 303 914 q 283 835 303 856 q 235 815 264 815 m 501 815 q 453 835 472 815 q 433 885 433 856 q 453 934 433 914 q 501 954 472 954 q 551 934 532 954 q 571 885 571 914 q 551 835 571 856 q 501 815 532 815 z \"},\"ē\":{\"ha\":689,\"x_min\":64,\"x_max\":636,\"o\":\"m 388 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 511 4 565 25 q 388 -17 457 -17 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 m 183 835 l 183 914 l 553 914 l 553 835 l 183 835 z \"},\"ĕ\":{\"ha\":689,\"x_min\":64,\"x_max\":636,\"o\":\"m 388 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 511 4 565 25 q 388 -17 457 -17 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 m 368 793 q 272 811 313 793 q 206 859 232 829 q 167 926 181 889 q 151 1003 154 964 l 222 1014 q 237 962 226 988 q 265 915 247 936 q 309 882 283 894 q 368 869 335 869 q 427 882 401 869 q 471 915 453 894 q 499 962 489 936 q 514 1014 510 988 l 585 1003 q 569 926 582 964 q 529 859 556 889 q 463 811 503 829 q 368 793 424 793 z \"},\"ė\":{\"ha\":689,\"x_min\":64,\"x_max\":636,\"o\":\"m 388 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 511 4 565 25 q 388 -17 457 -17 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 m 368 814 q 315 835 336 814 q 293 889 293 856 q 315 942 293 921 q 368 964 336 964 q 422 942 400 964 q 443 889 443 921 q 422 835 443 856 q 368 814 400 814 z \"},\"ẹ\":{\"ha\":689,\"x_min\":64,\"x_max\":636,\"o\":\"m 388 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 511 4 565 25 q 388 -17 457 -17 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 m 365 -285 q 312 -264 333 -285 q 290 -210 290 -243 q 312 -156 290 -178 q 365 -135 333 -135 q 419 -156 397 -135 q 440 -210 440 -178 q 419 -264 440 -243 q 365 -285 397 -285 z \"},\"ẻ\":{\"ha\":689,\"x_min\":64,\"x_max\":636,\"o\":\"m 388 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 511 4 565 25 q 388 -17 457 -17 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 m 324 794 l 311 850 q 367 873 344 858 q 389 915 389 888 q 274 981 389 975 l 281 1056 q 428 1020 376 1053 q 479 925 479 988 q 466 873 479 894 q 431 835 453 851 q 382 810 410 819 q 324 794 354 800 z \"},\"ẽ\":{\"ha\":689,\"x_min\":64,\"x_max\":636,\"o\":\"m 388 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 511 4 565 25 q 388 -17 457 -17 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 m 468 801 q 404 819 431 801 q 356 860 378 838 q 313 900 333 882 q 269 918 293 918 q 222 888 238 918 q 204 808 207 857 l 128 813 q 138 888 129 853 q 164 947 147 922 q 206 987 181 972 q 268 1001 232 1001 q 332 983 306 1001 q 381 943 358 965 q 423 903 403 921 q 468 885 443 885 q 514 915 499 885 q 532 994 529 946 l 608 989 q 598 915 607 949 q 572 856 589 881 q 530 816 556 831 q 468 801 504 801 z \"},\"ế\":{\"ha\":689,\"x_min\":64,\"x_max\":694,\"o\":\"m 388 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 511 4 565 25 q 388 -17 457 -17 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 m 222 792 l 182 839 l 321 967 l 415 967 l 554 839 l 514 792 l 371 892 l 365 892 l 222 792 m 506 924 l 626 1090 l 694 1043 l 554 885 l 506 924 z \"},\"ề\":{\"ha\":689,\"x_min\":25,\"x_max\":636,\"o\":\"m 388 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 511 4 565 25 q 388 -17 457 -17 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 m 222 792 l 182 839 l 321 967 l 415 967 l 554 839 l 514 792 l 371 892 l 365 892 l 222 792 m 231 928 l 182 885 l 25 1040 l 92 1090 l 231 928 z \"},\"ể\":{\"ha\":689,\"x_min\":64,\"x_max\":658,\"o\":\"m 388 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 511 4 565 25 q 388 -17 457 -17 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 m 222 792 l 182 839 l 321 967 l 415 967 l 554 839 l 514 792 l 371 892 l 365 892 l 222 792 m 529 882 l 517 931 q 559 950 543 938 q 575 985 575 963 q 553 1026 575 1013 q 479 1042 531 1039 l 489 1099 q 615 1071 571 1096 q 658 997 658 1046 q 647 950 658 969 q 618 917 636 931 q 577 896 600 904 q 529 882 554 888 z \"},\"ễ\":{\"ha\":689,\"x_min\":64,\"x_max\":636,\"o\":\"m 388 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 511 4 565 25 q 388 -17 457 -17 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 m 222 792 l 182 839 l 321 961 l 415 961 l 554 839 l 514 792 l 371 888 l 365 888 l 222 792 m 178 992 q 206 1081 183 1046 q 278 1115 229 1115 q 332 1106 308 1115 q 376 1086 356 1097 q 415 1066 396 1075 q 453 1057 433 1057 q 483 1071 474 1057 q 499 1115 493 1085 l 558 1110 q 530 1022 553 1057 q 458 986 507 986 q 404 995 428 986 q 360 1015 381 1004 q 322 1035 340 1026 q 283 1044 303 1044 q 253 1031 263 1044 q 238 986 243 1017 l 178 992 z \"},\"ệ\":{\"ha\":689,\"x_min\":64,\"x_max\":636,\"o\":\"m 388 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 511 4 565 25 q 388 -17 457 -17 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 m 153 833 l 311 1028 l 425 1028 l 583 833 l 535 789 l 371 946 l 365 946 l 201 789 l 153 833 m 364 -285 q 310 -264 332 -285 q 289 -210 289 -243 q 310 -156 289 -178 q 364 -135 332 -135 q 417 -156 396 -135 q 439 -210 439 -178 q 417 -264 439 -243 q 364 -285 396 -285 z \"},\"ę\":{\"ha\":689,\"x_min\":64,\"x_max\":636,\"o\":\"m 497 -286 q 408 -256 444 -286 q 372 -168 372 -226 q 380 -118 372 -142 q 400 -74 388 -94 q 427 -36 413 -53 q 456 -7 442 -19 q 421 -15 438 -14 q 388 -17 404 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 535 -6 564 21 q 488 -57 506 -33 q 463 -102 469 -81 q 456 -146 456 -124 q 475 -194 456 -178 q 521 -210 494 -210 q 551 -205 538 -210 q 576 -192 564 -200 l 606 -249 q 555 -275 586 -264 q 497 -286 524 -286 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 z \"},\"ḗ\":{\"ha\":689,\"x_min\":64,\"x_max\":636,\"o\":\"m 388 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 511 4 565 25 q 388 -17 457 -17 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 m 321 979 l 276 1033 l 464 1171 l 517 1103 l 321 979 m 183 835 l 183 914 l 553 914 l 553 835 l 183 835 z \"},\"ǵ\":{\"ha\":700,\"x_min\":63,\"x_max\":683,\"o\":\"m 342 -311 q 228 -299 279 -311 q 140 -264 176 -287 q 83 -207 103 -240 q 63 -129 63 -174 q 89 -47 63 -86 q 161 24 115 -8 l 161 29 q 119 72 136 44 q 101 139 101 99 q 125 214 101 182 q 175 264 149 246 l 175 269 q 115 344 142 297 q 88 451 88 390 q 108 551 88 507 q 163 627 128 596 q 244 675 197 658 q 342 692 290 692 q 394 687 369 692 q 438 675 418 682 l 672 675 l 672 588 l 533 588 q 573 528 557 564 q 589 449 589 492 q 569 351 589 394 q 517 277 550 307 q 438 231 483 247 q 342 214 393 214 q 290 220 317 214 q 240 238 264 226 q 210 203 222 222 q 197 157 197 185 q 222 104 197 125 q 317 83 247 83 l 447 83 q 624 45 565 83 q 683 -78 683 7 q 660 -167 683 -125 q 592 -242 636 -210 q 484 -292 547 -274 q 342 -311 421 -311 m 342 290 q 397 301 371 290 q 442 333 422 313 q 474 384 463 354 q 485 451 485 414 q 443 567 485 526 q 342 608 401 608 q 240 567 282 608 q 199 451 199 526 q 210 384 199 414 q 241 333 221 354 q 287 301 261 313 q 342 290 313 290 m 358 -232 q 447 -220 407 -232 q 514 -190 486 -208 q 557 -146 542 -171 q 572 -94 572 -121 q 538 -29 572 -47 q 436 -11 503 -11 l 319 -11 q 277 -9 300 -11 q 232 0 254 -7 q 179 -56 196 -26 q 163 -114 163 -85 q 215 -200 163 -168 q 358 -232 267 -232 m 351 796 l 293 853 l 489 1085 l 569 1008 l 351 796 z \"},\"ĝ\":{\"ha\":700,\"x_min\":63,\"x_max\":683,\"o\":\"m 342 -311 q 228 -299 279 -311 q 140 -264 176 -287 q 83 -207 103 -240 q 63 -129 63 -174 q 89 -47 63 -86 q 161 24 115 -8 l 161 29 q 119 72 136 44 q 101 139 101 99 q 125 214 101 182 q 175 264 149 246 l 175 269 q 115 344 142 297 q 88 451 88 390 q 108 551 88 507 q 163 627 128 596 q 244 675 197 658 q 342 692 290 692 q 394 687 369 692 q 438 675 418 682 l 672 675 l 672 588 l 533 588 q 573 528 557 564 q 589 449 589 492 q 569 351 589 394 q 517 277 550 307 q 438 231 483 247 q 342 214 393 214 q 290 220 317 214 q 240 238 264 226 q 210 203 222 222 q 197 157 197 185 q 222 104 197 125 q 317 83 247 83 l 447 83 q 624 45 565 83 q 683 -78 683 7 q 660 -167 683 -125 q 592 -242 636 -210 q 484 -292 547 -274 q 342 -311 421 -311 m 342 290 q 397 301 371 290 q 442 333 422 313 q 474 384 463 354 q 485 451 485 414 q 443 567 485 526 q 342 608 401 608 q 240 567 282 608 q 199 451 199 526 q 210 384 199 414 q 241 333 221 354 q 287 301 261 313 q 342 290 313 290 m 358 -232 q 447 -220 407 -232 q 514 -190 486 -208 q 557 -146 542 -171 q 572 -94 572 -121 q 538 -29 572 -47 q 436 -11 503 -11 l 319 -11 q 277 -9 300 -11 q 232 0 254 -7 q 179 -56 196 -26 q 163 -114 163 -85 q 215 -200 163 -168 q 358 -232 267 -232 m 156 833 l 314 1028 l 428 1028 l 586 833 l 538 789 l 374 946 l 368 946 l 204 789 l 156 833 z \"},\"ğ\":{\"ha\":700,\"x_min\":63,\"x_max\":683,\"o\":\"m 342 -311 q 228 -299 279 -311 q 140 -264 176 -287 q 83 -207 103 -240 q 63 -129 63 -174 q 89 -47 63 -86 q 161 24 115 -8 l 161 29 q 119 72 136 44 q 101 139 101 99 q 125 214 101 182 q 175 264 149 246 l 175 269 q 115 344 142 297 q 88 451 88 390 q 108 551 88 507 q 163 627 128 596 q 244 675 197 658 q 342 692 290 692 q 394 687 369 692 q 438 675 418 682 l 672 675 l 672 588 l 533 588 q 573 528 557 564 q 589 449 589 492 q 569 351 589 394 q 517 277 550 307 q 438 231 483 247 q 342 214 393 214 q 290 220 317 214 q 240 238 264 226 q 210 203 222 222 q 197 157 197 185 q 222 104 197 125 q 317 83 247 83 l 447 83 q 624 45 565 83 q 683 -78 683 7 q 660 -167 683 -125 q 592 -242 636 -210 q 484 -292 547 -274 q 342 -311 421 -311 m 342 290 q 397 301 371 290 q 442 333 422 313 q 474 384 463 354 q 485 451 485 414 q 443 567 485 526 q 342 608 401 608 q 240 567 282 608 q 199 451 199 526 q 210 384 199 414 q 241 333 221 354 q 287 301 261 313 q 342 290 313 290 m 358 -232 q 447 -220 407 -232 q 514 -190 486 -208 q 557 -146 542 -171 q 572 -94 572 -121 q 538 -29 572 -47 q 436 -11 503 -11 l 319 -11 q 277 -9 300 -11 q 232 0 254 -7 q 179 -56 196 -26 q 163 -114 163 -85 q 215 -200 163 -168 q 358 -232 267 -232 m 371 793 q 275 811 315 793 q 209 859 235 829 q 170 926 183 889 q 154 1003 157 964 l 225 1014 q 240 962 229 988 q 268 915 250 936 q 312 882 286 894 q 371 869 338 869 q 430 882 404 869 q 474 915 456 894 q 502 962 492 936 q 517 1014 513 988 l 588 1003 q 572 926 585 964 q 532 859 558 889 q 466 811 506 829 q 371 793 426 793 z \"},\"ġ\":{\"ha\":700,\"x_min\":63,\"x_max\":683,\"o\":\"m 342 -311 q 228 -299 279 -311 q 140 -264 176 -287 q 83 -207 103 -240 q 63 -129 63 -174 q 89 -47 63 -86 q 161 24 115 -8 l 161 29 q 119 72 136 44 q 101 139 101 99 q 125 214 101 182 q 175 264 149 246 l 175 269 q 115 344 142 297 q 88 451 88 390 q 108 551 88 507 q 163 627 128 596 q 244 675 197 658 q 342 692 290 692 q 394 687 369 692 q 438 675 418 682 l 672 675 l 672 588 l 533 588 q 573 528 557 564 q 589 449 589 492 q 569 351 589 394 q 517 277 550 307 q 438 231 483 247 q 342 214 393 214 q 290 220 317 214 q 240 238 264 226 q 210 203 222 222 q 197 157 197 185 q 222 104 197 125 q 317 83 247 83 l 447 83 q 624 45 565 83 q 683 -78 683 7 q 660 -167 683 -125 q 592 -242 636 -210 q 484 -292 547 -274 q 342 -311 421 -311 m 342 290 q 397 301 371 290 q 442 333 422 313 q 474 384 463 354 q 485 451 485 414 q 443 567 485 526 q 342 608 401 608 q 240 567 282 608 q 199 451 199 526 q 210 384 199 414 q 241 333 221 354 q 287 301 261 313 q 342 290 313 290 m 358 -232 q 447 -220 407 -232 q 514 -190 486 -208 q 557 -146 542 -171 q 572 -94 572 -121 q 538 -29 572 -47 q 436 -11 503 -11 l 319 -11 q 277 -9 300 -11 q 232 0 254 -7 q 179 -56 196 -26 q 163 -114 163 -85 q 215 -200 163 -168 q 358 -232 267 -232 m 371 814 q 317 835 339 814 q 296 889 296 856 q 317 942 296 921 q 371 964 339 964 q 424 942 403 964 q 446 889 446 921 q 424 835 446 856 q 371 814 403 814 z \"},\"ģ\":{\"ha\":700,\"x_min\":63,\"x_max\":683,\"o\":\"m 342 -311 q 228 -299 279 -311 q 140 -264 176 -287 q 83 -207 103 -240 q 63 -129 63 -174 q 89 -47 63 -86 q 161 24 115 -8 l 161 29 q 119 72 136 44 q 101 139 101 99 q 125 214 101 182 q 175 264 149 246 l 175 269 q 115 344 142 297 q 88 451 88 390 q 108 551 88 507 q 163 627 128 596 q 244 675 197 658 q 342 692 290 692 q 394 687 369 692 q 438 675 418 682 l 672 675 l 672 588 l 533 588 q 573 528 557 564 q 589 449 589 492 q 569 351 589 394 q 517 277 550 307 q 438 231 483 247 q 342 214 393 214 q 290 220 317 214 q 240 238 264 226 q 210 203 222 222 q 197 157 197 185 q 222 104 197 125 q 317 83 247 83 l 447 83 q 624 45 565 83 q 683 -78 683 7 q 660 -167 683 -125 q 592 -242 636 -210 q 484 -292 547 -274 q 342 -311 421 -311 m 342 290 q 397 301 371 290 q 442 333 422 313 q 474 384 463 354 q 485 451 485 414 q 443 567 485 526 q 342 608 401 608 q 240 567 282 608 q 199 451 199 526 q 210 384 199 414 q 241 333 221 354 q 287 301 261 313 q 342 290 313 290 m 358 -232 q 447 -220 407 -232 q 514 -190 486 -208 q 557 -146 542 -171 q 572 -94 572 -121 q 538 -29 572 -47 q 436 -11 503 -11 l 319 -11 q 277 -9 300 -11 q 232 0 254 -7 q 179 -56 196 -26 q 163 -114 163 -85 q 215 -200 163 -168 q 358 -232 267 -232 m 425 799 q 299 833 335 808 q 263 906 263 858 q 322 997 263 967 q 492 1033 381 1026 l 503 976 q 383 955 415 971 q 351 910 351 939 q 376 869 351 882 q 450 851 401 856 l 425 799 z \"},\"ǧ\":{\"ha\":700,\"x_min\":63,\"x_max\":683,\"o\":\"m 342 -311 q 228 -299 279 -311 q 140 -264 176 -287 q 83 -207 103 -240 q 63 -129 63 -174 q 89 -47 63 -86 q 161 24 115 -8 l 161 29 q 119 72 136 44 q 101 139 101 99 q 125 214 101 182 q 175 264 149 246 l 175 269 q 115 344 142 297 q 88 451 88 390 q 108 551 88 507 q 163 627 128 596 q 244 675 197 658 q 342 692 290 692 q 394 687 369 692 q 438 675 418 682 l 672 675 l 672 588 l 533 588 q 573 528 557 564 q 589 449 589 492 q 569 351 589 394 q 517 277 550 307 q 438 231 483 247 q 342 214 393 214 q 290 220 317 214 q 240 238 264 226 q 210 203 222 222 q 197 157 197 185 q 222 104 197 125 q 317 83 247 83 l 447 83 q 624 45 565 83 q 683 -78 683 7 q 660 -167 683 -125 q 592 -242 636 -210 q 484 -292 547 -274 q 342 -311 421 -311 m 342 290 q 397 301 371 290 q 442 333 422 313 q 474 384 463 354 q 485 451 485 414 q 443 567 485 526 q 342 608 401 608 q 240 567 282 608 q 199 451 199 526 q 210 384 199 414 q 241 333 221 354 q 287 301 261 313 q 342 290 313 290 m 358 -232 q 447 -220 407 -232 q 514 -190 486 -208 q 557 -146 542 -171 q 572 -94 572 -121 q 538 -29 572 -47 q 436 -11 503 -11 l 319 -11 q 277 -9 300 -11 q 232 0 254 -7 q 179 -56 196 -26 q 163 -114 163 -85 q 215 -200 163 -168 q 358 -232 267 -232 m 314 797 l 156 992 l 204 1036 l 368 879 l 374 879 l 538 1036 l 586 992 l 428 797 l 314 797 z \"},\"ḡ\":{\"ha\":700,\"x_min\":63,\"x_max\":683,\"o\":\"m 342 -311 q 228 -299 279 -311 q 140 -264 176 -287 q 83 -207 103 -240 q 63 -129 63 -174 q 89 -47 63 -86 q 161 24 115 -8 l 161 29 q 119 72 136 44 q 101 139 101 99 q 125 214 101 182 q 175 264 149 246 l 175 269 q 115 344 142 297 q 88 451 88 390 q 108 551 88 507 q 163 627 128 596 q 244 675 197 658 q 342 692 290 692 q 394 687 369 692 q 438 675 418 682 l 672 675 l 672 588 l 533 588 q 573 528 557 564 q 589 449 589 492 q 569 351 589 394 q 517 277 550 307 q 438 231 483 247 q 342 214 393 214 q 290 220 317 214 q 240 238 264 226 q 210 203 222 222 q 197 157 197 185 q 222 104 197 125 q 317 83 247 83 l 447 83 q 624 45 565 83 q 683 -78 683 7 q 660 -167 683 -125 q 592 -242 636 -210 q 484 -292 547 -274 q 342 -311 421 -311 m 342 290 q 397 301 371 290 q 442 333 422 313 q 474 384 463 354 q 485 451 485 414 q 443 567 485 526 q 342 608 401 608 q 240 567 282 608 q 199 451 199 526 q 210 384 199 414 q 241 333 221 354 q 287 301 261 313 q 342 290 313 290 m 358 -232 q 447 -220 407 -232 q 514 -190 486 -208 q 557 -146 542 -171 q 572 -94 572 -121 q 538 -29 572 -47 q 436 -11 503 -11 l 319 -11 q 277 -9 300 -11 q 232 0 254 -7 q 179 -56 196 -26 q 163 -114 163 -85 q 215 -200 163 -168 q 358 -232 267 -232 m 186 835 l 186 914 l 556 914 l 556 835 l 186 835 z \"},\"ĥ\":{\"ha\":756,\"x_min\":-33,\"x_max\":654,\"o\":\"m 114 0 l 114 989 l 228 989 l 228 719 l 224 581 q 325 659 272 626 q 449 692 378 692 q 605 625 556 692 q 654 428 654 558 l 654 0 l 540 0 l 540 413 q 510 551 540 508 q 413 593 479 593 q 319 567 360 593 q 228 489 279 540 l 228 0 l 114 0 m -33 1065 l 113 1222 l 232 1222 l 378 1065 l 328 1029 l 175 1158 l 169 1158 l 17 1029 l -33 1065 z \"},\"ḥ\":{\"ha\":756,\"x_min\":114,\"x_max\":654,\"o\":\"m 114 0 l 114 989 l 228 989 l 228 719 l 224 581 q 325 659 272 626 q 449 692 378 692 q 605 625 556 692 q 654 428 654 558 l 654 0 l 540 0 l 540 413 q 510 551 540 508 q 413 593 479 593 q 319 567 360 593 q 228 489 279 540 l 228 0 l 114 0 m 397 -285 q 344 -264 365 -285 q 322 -210 322 -243 q 344 -156 322 -178 q 397 -135 365 -135 q 451 -156 429 -135 q 472 -210 472 -178 q 451 -264 472 -243 q 397 -285 429 -285 z \"},\"ẖ\":{\"ha\":756,\"x_min\":114,\"x_max\":654,\"o\":\"m 114 0 l 114 989 l 228 989 l 228 719 l 224 581 q 325 659 272 626 q 449 692 378 692 q 605 625 556 692 q 654 428 654 558 l 654 0 l 540 0 l 540 413 q 510 551 540 508 q 413 593 479 593 q 319 567 360 593 q 228 489 279 540 l 228 0 l 114 0 m 213 -235 l 213 -156 l 582 -156 l 582 -235 l 213 -235 z \"},\"ḫ\":{\"ha\":756,\"x_min\":114,\"x_max\":654,\"o\":\"m 114 0 l 114 989 l 228 989 l 228 719 l 224 581 q 325 659 272 626 q 449 692 378 692 q 605 625 556 692 q 654 428 654 558 l 654 0 l 540 0 l 540 413 q 510 551 540 508 q 413 593 479 593 q 319 567 360 593 q 228 489 279 540 l 228 0 l 114 0 m 396 -319 q 300 -301 340 -319 q 234 -253 260 -283 q 195 -186 208 -224 q 179 -110 182 -149 l 250 -99 q 265 -151 254 -125 q 293 -197 275 -176 q 337 -231 311 -218 q 396 -243 363 -243 q 455 -231 429 -243 q 499 -197 481 -218 q 527 -151 517 -176 q 542 -99 538 -125 l 613 -110 q 597 -186 610 -149 q 557 -253 583 -224 q 491 -301 531 -283 q 396 -319 451 -319 z \"},\"ħ\":{\"ha\":756,\"x_min\":11,\"x_max\":654,\"o\":\"m 114 0 l 114 793 l 11 793 l 11 853 l 114 860 l 114 989 l 228 989 l 228 860 l 481 860 l 481 793 l 228 793 l 228 664 l 224 525 q 325 604 272 571 q 449 638 378 638 q 605 571 556 638 q 654 374 654 504 l 654 0 l 540 0 l 540 358 q 510 496 540 454 q 413 538 479 538 q 319 512 360 538 q 228 435 279 486 l 228 0 l 114 0 z \"},\"ì\":{\"ha\":342,\"x_min\":-28,\"x_max\":249,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 0 l 114 0 m 190 796 l -28 1008 l 53 1085 l 249 853 l 190 796 z \"},\"í\":{\"ha\":342,\"x_min\":93,\"x_max\":369,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 0 l 114 0 m 151 796 l 93 853 l 289 1085 l 369 1008 l 151 796 z \"},\"î\":{\"ha\":342,\"x_min\":-44,\"x_max\":386,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 0 l 114 0 m -44 833 l 114 1028 l 228 1028 l 386 833 l 338 789 l 174 946 l 168 946 l 4 789 l -44 833 z \"},\"ĩ\":{\"ha\":342,\"x_min\":-69,\"x_max\":411,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 0 l 114 0 m 271 801 q 207 819 233 801 q 158 860 181 838 q 116 900 136 882 q 72 918 96 918 q 25 888 40 918 q 7 808 10 857 l -69 813 q -59 888 -68 853 q -33 947 -50 922 q 9 987 -17 972 q 71 1001 35 1001 q 135 983 108 1001 q 183 943 161 965 q 226 903 206 921 q 271 885 246 885 q 317 915 301 885 q 335 994 332 946 l 411 989 q 401 915 410 949 q 375 856 392 881 q 333 816 358 831 q 271 801 307 801 z \"},\"ï\":{\"ha\":342,\"x_min\":-32,\"x_max\":374,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 0 l 114 0 m 38 815 q -12 835 7 815 q -32 885 -32 856 q -12 934 -32 914 q 38 954 7 954 q 86 934 67 954 q 106 885 106 914 q 86 835 106 856 q 38 815 67 815 m 304 815 q 256 835 275 815 q 236 885 236 856 q 256 934 236 914 q 304 954 275 954 q 354 934 335 954 q 374 885 374 914 q 354 835 374 856 q 304 815 335 815 z \"},\"ī\":{\"ha\":342,\"x_min\":-14,\"x_max\":356,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 0 l 114 0 m -14 835 l -14 914 l 356 914 l 356 835 l -14 835 z \"},\"ǐ\":{\"ha\":342,\"x_min\":-44,\"x_max\":386,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 0 l 114 0 m 114 797 l -44 992 l 4 1036 l 168 879 l 174 879 l 338 1036 l 386 992 l 228 797 l 114 797 z \"},\"ỉ\":{\"ha\":342,\"x_min\":76,\"x_max\":282,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 0 l 114 0 m 126 794 l 114 850 q 169 873 147 858 q 192 915 192 888 q 76 981 192 975 l 83 1056 q 231 1020 179 1053 q 282 925 282 988 q 269 873 282 894 q 234 835 256 851 q 185 810 213 819 q 126 794 157 800 z \"},\"ị\":{\"ha\":342,\"x_min\":93,\"x_max\":251,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 0 l 114 0 m 172 814 q 116 835 139 814 q 93 888 93 856 q 116 941 93 921 q 172 961 139 961 q 228 941 206 961 q 251 888 251 921 q 228 835 251 856 q 172 814 206 814 m 172 -285 q 119 -264 140 -285 q 97 -210 97 -243 q 119 -156 97 -178 q 172 -135 140 -135 q 226 -156 204 -135 q 247 -210 247 -178 q 226 -264 247 -243 q 172 -285 204 -285 z \"},\"į\":{\"ha\":342,\"x_min\":53,\"x_max\":288,\"o\":\"m 179 -286 q 90 -256 126 -286 q 53 -168 53 -226 q 83 -71 53 -112 q 142 0 113 -29 l 114 0 l 114 675 l 228 675 l 228 0 q 162 -68 186 -31 q 138 -146 138 -106 q 157 -194 138 -178 q 203 -210 176 -210 q 231 -205 218 -210 q 258 -192 244 -200 l 288 -249 q 237 -275 268 -264 q 179 -286 206 -286 m 171 814 q 115 835 138 814 q 92 888 92 856 q 115 941 92 921 q 171 961 138 961 q 226 941 203 961 q 249 888 249 921 q 226 835 249 856 q 171 814 203 814 z \"},\"ĭ\":{\"ha\":342,\"x_min\":-44,\"x_max\":389,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 0 l 114 0 m 172 793 q 76 811 117 793 q 10 859 36 829 q -28 926 -15 889 q -44 1003 -42 964 l 26 1014 q 41 962 31 988 q 69 915 51 936 q 113 882 88 894 q 172 869 139 869 q 231 882 206 869 q 275 915 257 894 q 303 962 293 936 q 318 1014 314 988 l 389 1003 q 373 926 386 964 q 333 859 360 889 q 267 811 307 829 q 172 793 228 793 z \"},\"ı\":{\"ha\":342,\"x_min\":114,\"x_max\":228,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 0 l 114 0 z \"},\"ĵ\":{\"ha\":343,\"x_min\":-56,\"x_max\":386,\"o\":\"m 44 -301 q -12 -296 13 -301 q -56 -283 -37 -290 l -32 -197 q -3 -205 -19 -201 q 32 -208 14 -208 q 99 -174 82 -208 q 115 -76 115 -139 l 115 675 l 229 675 l 229 -76 q 188 -240 229 -179 q 44 -301 146 -301 m -44 833 l 114 1028 l 228 1028 l 386 833 l 338 789 l 174 946 l 168 946 l 4 789 l -44 833 z \"},\"ķ\":{\"ha\":688,\"x_min\":114,\"x_max\":675,\"o\":\"m 114 0 l 114 989 l 226 989 l 226 319 l 231 319 l 518 675 l 644 675 l 418 404 l 675 0 l 550 0 l 353 325 l 226 178 l 226 0 l 114 0 m 256 -314 l 244 -258 q 364 -235 332 -251 q 396 -192 396 -219 q 371 -151 396 -164 q 297 -133 346 -137 l 322 -81 q 449 -116 413 -92 q 485 -187 485 -140 q 426 -278 485 -249 q 256 -314 367 -308 z \"},\"ḳ\":{\"ha\":688,\"x_min\":114,\"x_max\":675,\"o\":\"m 114 0 l 114 989 l 226 989 l 226 319 l 231 319 l 518 675 l 644 675 l 418 404 l 675 0 l 550 0 l 353 325 l 226 178 l 226 0 l 114 0 m 376 -285 q 323 -264 344 -285 q 301 -210 301 -243 q 323 -156 301 -178 q 376 -135 344 -135 q 430 -156 408 -135 q 451 -210 451 -178 q 430 -264 451 -243 q 376 -285 408 -285 z \"},\"ḵ\":{\"ha\":688,\"x_min\":114,\"x_max\":675,\"o\":\"m 114 0 l 114 989 l 226 989 l 226 319 l 231 319 l 518 675 l 644 675 l 418 404 l 675 0 l 550 0 l 353 325 l 226 178 l 226 0 l 114 0 m 192 -235 l 192 -156 l 561 -156 l 561 -235 l 192 -235 z \"},\"ĸ\":{\"ha\":688,\"x_min\":114,\"x_max\":675,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 317 l 232 317 l 518 675 l 644 675 l 421 404 l 675 0 l 550 0 l 353 321 l 228 174 l 228 0 l 114 0 z \"},\"ĺ\":{\"ha\":354,\"x_min\":90,\"x_max\":353,\"o\":\"m 235 -17 q 142 22 169 -17 q 114 136 114 61 l 114 989 l 228 989 l 228 128 q 238 89 228 100 q 260 78 247 78 q 270 78 265 78 q 285 81 275 78 l 300 -6 q 274 -14 289 -11 q 235 -17 258 -17 m 142 1040 l 90 1099 l 288 1276 l 353 1200 l 142 1040 z \"},\"ľ\":{\"ha\":375,\"x_min\":114,\"x_max\":383,\"o\":\"m 235 -17 q 142 22 169 -17 q 114 136 114 61 l 114 989 l 228 989 l 228 128 q 238 89 228 100 q 260 78 247 78 q 270 78 265 78 q 285 81 275 78 l 300 -6 q 274 -14 289 -11 q 235 -17 258 -17 m 307 761 l 301 1056 l 383 1056 l 382 976 l 363 761 l 307 761 z \"},\"ŀ\":{\"ha\":503,\"x_min\":114,\"x_max\":504,\"o\":\"m 235 -17 q 142 22 169 -17 q 114 136 114 61 l 114 989 l 228 989 l 228 128 q 238 89 228 100 q 260 78 247 78 q 270 78 265 78 q 285 81 275 78 l 300 -6 q 274 -14 289 -11 q 235 -17 258 -17 m 422 365 q 363 390 388 365 q 339 451 339 414 q 363 516 339 492 q 422 540 388 540 q 480 516 456 540 q 504 451 504 492 q 480 390 504 414 q 422 365 456 365 z \"},\"ļ\":{\"ha\":354,\"x_min\":86,\"x_max\":326,\"o\":\"m 235 -17 q 142 22 169 -17 q 114 136 114 61 l 114 989 l 228 989 l 228 128 q 238 89 228 100 q 260 78 247 78 q 270 78 265 78 q 285 81 275 78 l 300 -6 q 274 -14 289 -11 q 235 -17 258 -17 m 97 -314 l 86 -258 q 206 -235 174 -251 q 238 -192 238 -219 q 213 -151 238 -164 q 139 -133 188 -137 l 164 -81 q 290 -116 254 -92 q 326 -187 326 -140 q 267 -278 326 -249 q 97 -314 208 -308 z \"},\"ḷ\":{\"ha\":354,\"x_min\":114,\"x_max\":300,\"o\":\"m 235 -17 q 142 22 169 -17 q 114 136 114 61 l 114 989 l 228 989 l 228 128 q 238 89 228 100 q 260 78 247 78 q 270 78 265 78 q 285 81 275 78 l 300 -6 q 274 -14 289 -11 q 235 -17 258 -17 m 218 -285 q 165 -264 186 -285 q 143 -210 143 -243 q 165 -156 143 -178 q 218 -135 186 -135 q 272 -156 250 -135 q 293 -210 293 -178 q 272 -264 293 -243 q 218 -285 250 -285 z \"},\"ḹ\":{\"ha\":354,\"x_min\":-15,\"x_max\":354,\"o\":\"m 235 -17 q 142 22 169 -17 q 114 136 114 61 l 114 989 l 228 989 l 228 128 q 238 89 228 100 q 260 78 247 78 q 270 78 265 78 q 285 81 275 78 l 300 -6 q 274 -14 289 -11 q 235 -17 258 -17 m -15 1142 l -15 1221 l 354 1221 l 354 1142 l -15 1142 m 218 -285 q 165 -264 186 -285 q 143 -210 143 -243 q 165 -156 143 -178 q 218 -135 186 -135 q 272 -156 250 -135 q 293 -210 293 -178 q 272 -264 293 -243 q 218 -285 250 -285 z \"},\"ḻ\":{\"ha\":354,\"x_min\":33,\"x_max\":403,\"o\":\"m 235 -17 q 142 22 169 -17 q 114 136 114 61 l 114 989 l 228 989 l 228 128 q 238 89 228 100 q 260 78 247 78 q 270 78 265 78 q 285 81 275 78 l 300 -6 q 274 -14 289 -11 q 235 -17 258 -17 m 33 -235 l 33 -156 l 403 -156 l 403 -235 l 33 -235 z \"},\"ł\":{\"ha\":364,\"x_min\":-1,\"x_max\":350,\"o\":\"m 240 -17 q 147 22 175 -17 q 119 136 119 61 l 119 460 l 40 410 l -1 483 l 119 557 l 119 989 l 233 989 l 233 617 l 308 665 l 350 592 l 233 519 l 233 128 q 243 89 233 100 q 265 78 253 78 q 276 78 271 78 q 290 81 281 78 l 306 -6 q 279 -14 294 -11 q 240 -17 264 -17 z \"},\"ḿ\":{\"ha\":1151,\"x_min\":114,\"x_max\":1046,\"o\":\"m 114 0 l 114 675 l 208 675 l 218 578 l 222 578 q 319 659 267 626 q 432 692 371 692 q 553 658 510 692 q 618 563 597 624 q 724 656 671 621 q 840 692 778 692 q 995 625 944 692 q 1046 428 1046 558 l 1046 0 l 932 0 l 932 413 q 901 551 932 508 q 807 593 871 593 q 638 489 731 593 l 638 0 l 524 0 l 524 413 q 493 551 524 508 q 397 593 463 593 q 228 489 321 593 l 228 0 l 114 0 m 563 796 l 504 853 l 700 1085 l 781 1008 l 563 796 z \"},\"ṁ\":{\"ha\":1151,\"x_min\":114,\"x_max\":1046,\"o\":\"m 114 0 l 114 675 l 208 675 l 218 578 l 222 578 q 319 659 267 626 q 432 692 371 692 q 553 658 510 692 q 618 563 597 624 q 724 656 671 621 q 840 692 778 692 q 995 625 944 692 q 1046 428 1046 558 l 1046 0 l 932 0 l 932 413 q 901 551 932 508 q 807 593 871 593 q 638 489 731 593 l 638 0 l 524 0 l 524 413 q 493 551 524 508 q 397 593 463 593 q 228 489 321 593 l 228 0 l 114 0 m 582 814 q 528 835 550 814 q 507 889 507 856 q 528 942 507 921 q 582 964 550 964 q 635 942 614 964 q 657 889 657 921 q 635 835 657 856 q 582 814 614 814 z \"},\"ṃ\":{\"ha\":1151,\"x_min\":114,\"x_max\":1046,\"o\":\"m 114 0 l 114 675 l 208 675 l 218 578 l 222 578 q 319 659 267 626 q 432 692 371 692 q 553 658 510 692 q 618 563 597 624 q 724 656 671 621 q 840 692 778 692 q 995 625 944 692 q 1046 428 1046 558 l 1046 0 l 932 0 l 932 413 q 901 551 932 508 q 807 593 871 593 q 638 489 731 593 l 638 0 l 524 0 l 524 413 q 493 551 524 508 q 397 593 463 593 q 228 489 321 593 l 228 0 l 114 0 m 592 -285 q 538 -264 560 -285 q 517 -210 517 -243 q 538 -156 517 -178 q 592 -135 560 -135 q 645 -156 624 -135 q 667 -210 667 -178 q 645 -264 667 -243 q 592 -285 624 -285 z \"},\"ń\":{\"ha\":760,\"x_min\":114,\"x_max\":654,\"o\":\"m 114 0 l 114 675 l 208 675 l 218 578 l 222 578 q 324 659 271 626 q 449 692 378 692 q 605 625 556 692 q 654 428 654 558 l 654 0 l 540 0 l 540 413 q 510 551 540 508 q 413 593 479 593 q 319 567 360 593 q 228 489 279 540 l 228 0 l 114 0 m 386 796 l 328 853 l 524 1085 l 604 1008 l 386 796 z \"},\"ǹ\":{\"ha\":760,\"x_min\":114,\"x_max\":654,\"o\":\"m 114 0 l 114 675 l 208 675 l 218 578 l 222 578 q 324 659 271 626 q 449 692 378 692 q 605 625 556 692 q 654 428 654 558 l 654 0 l 540 0 l 540 413 q 510 551 540 508 q 413 593 479 593 q 319 567 360 593 q 228 489 279 540 l 228 0 l 114 0 m 424 796 l 206 1008 l 286 1085 l 482 853 l 424 796 z \"},\"ň\":{\"ha\":760,\"x_min\":114,\"x_max\":654,\"o\":\"m 114 0 l 114 675 l 208 675 l 218 578 l 222 578 q 324 659 271 626 q 449 692 378 692 q 605 625 556 692 q 654 428 654 558 l 654 0 l 540 0 l 540 413 q 510 551 540 508 q 413 593 479 593 q 319 567 360 593 q 228 489 279 540 l 228 0 l 114 0 m 349 797 l 190 992 l 239 1036 l 403 879 l 408 879 l 572 1036 l 621 992 l 463 797 l 349 797 z \"},\"ñ\":{\"ha\":760,\"x_min\":114,\"x_max\":654,\"o\":\"m 114 0 l 114 675 l 208 675 l 218 578 l 222 578 q 324 659 271 626 q 449 692 378 692 q 605 625 556 692 q 654 428 654 558 l 654 0 l 540 0 l 540 413 q 510 551 540 508 q 413 593 479 593 q 319 567 360 593 q 228 489 279 540 l 228 0 l 114 0 m 506 801 q 442 819 468 801 q 393 860 415 838 q 351 900 371 882 q 307 918 331 918 q 260 888 275 918 q 242 808 244 857 l 165 813 q 176 888 167 853 q 201 947 185 922 q 244 987 218 972 q 306 1001 269 1001 q 369 983 343 1001 q 418 943 396 965 q 460 903 440 921 q 506 885 481 885 q 551 915 536 885 q 569 994 567 946 l 646 989 q 635 915 644 949 q 610 856 626 881 q 567 816 593 831 q 506 801 542 801 z \"},\"ņ\":{\"ha\":760,\"x_min\":114,\"x_max\":654,\"o\":\"m 114 0 l 114 675 l 208 675 l 218 578 l 222 578 q 324 659 271 626 q 449 692 378 692 q 605 625 556 692 q 654 428 654 558 l 654 0 l 540 0 l 540 413 q 510 551 540 508 q 413 593 479 593 q 319 567 360 593 q 228 489 279 540 l 228 0 l 114 0 m 267 -314 l 256 -258 q 375 -235 343 -251 q 407 -192 407 -219 q 382 -151 407 -164 q 308 -133 357 -137 l 333 -81 q 460 -116 424 -92 q 496 -187 496 -140 q 437 -278 496 -249 q 267 -314 378 -308 z \"},\"ṅ\":{\"ha\":760,\"x_min\":114,\"x_max\":654,\"o\":\"m 114 0 l 114 675 l 208 675 l 218 578 l 222 578 q 324 659 271 626 q 449 692 378 692 q 605 625 556 692 q 654 428 654 558 l 654 0 l 540 0 l 540 413 q 510 551 540 508 q 413 593 479 593 q 319 567 360 593 q 228 489 279 540 l 228 0 l 114 0 m 406 814 q 352 835 374 814 q 331 889 331 856 q 352 942 331 921 q 406 964 374 964 q 459 942 438 964 q 481 889 481 921 q 459 835 481 856 q 406 814 438 814 z \"},\"ṇ\":{\"ha\":760,\"x_min\":114,\"x_max\":654,\"o\":\"m 114 0 l 114 675 l 208 675 l 218 578 l 222 578 q 324 659 271 626 q 449 692 378 692 q 605 625 556 692 q 654 428 654 558 l 654 0 l 540 0 l 540 413 q 510 551 540 508 q 413 593 479 593 q 319 567 360 593 q 228 489 279 540 l 228 0 l 114 0 m 388 -285 q 334 -264 356 -285 q 313 -210 313 -243 q 334 -156 313 -178 q 388 -135 356 -135 q 441 -156 419 -135 q 463 -210 463 -178 q 441 -264 463 -243 q 388 -285 419 -285 z \"},\"ṉ\":{\"ha\":760,\"x_min\":114,\"x_max\":654,\"o\":\"m 114 0 l 114 675 l 208 675 l 218 578 l 222 578 q 324 659 271 626 q 449 692 378 692 q 605 625 556 692 q 654 428 654 558 l 654 0 l 540 0 l 540 413 q 510 551 540 508 q 413 593 479 593 q 319 567 360 593 q 228 489 279 540 l 228 0 l 114 0 m 203 -235 l 203 -156 l 572 -156 l 572 -235 l 203 -235 z \"},\"ŉ\":{\"ha\":1076,\"x_min\":88,\"x_max\":963,\"o\":\"m 422 0 l 422 675 l 517 675 l 526 578 l 531 578 q 633 659 579 626 q 757 692 686 692 q 913 625 864 692 q 963 428 963 558 l 963 0 l 849 0 l 849 413 q 818 551 849 508 q 721 593 788 593 q 628 567 668 593 q 536 489 588 540 l 536 0 l 422 0 m 119 599 l 88 651 q 166 726 140 686 q 192 825 192 765 q 181 824 188 824 q 129 842 151 824 q 107 893 107 860 q 128 950 107 929 q 181 971 149 971 q 244 938 221 971 q 268 844 268 906 q 230 701 268 761 q 119 599 192 640 z \"},\"ò\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 495 668 439 692 q 594 599 551 644 q 663 487 638 553 q 689 336 689 421 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 396 796 l 178 1008 l 258 1085 l 454 853 l 396 796 z \"},\"ó\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 495 668 439 692 q 594 599 551 644 q 663 487 638 553 q 689 336 689 421 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 357 796 l 299 853 l 494 1085 l 575 1008 l 357 796 z \"},\"ô\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 495 668 439 692 q 594 599 551 644 q 663 487 638 553 q 689 336 689 421 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 161 833 l 319 1028 l 433 1028 l 592 833 l 543 789 l 379 946 l 374 946 l 210 789 l 161 833 z \"},\"õ\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 495 668 439 692 q 594 599 551 644 q 663 487 638 553 q 689 336 689 421 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 476 801 q 413 819 439 801 q 364 860 386 838 q 322 900 342 882 q 278 918 301 918 q 231 888 246 918 q 213 808 215 857 l 136 813 q 147 888 138 853 q 172 947 156 922 q 215 987 189 972 q 276 1001 240 1001 q 340 983 314 1001 q 389 943 367 965 q 431 903 411 921 q 476 885 451 885 q 522 915 507 885 q 540 994 538 946 l 617 989 q 606 915 615 949 q 581 856 597 881 q 538 816 564 831 q 476 801 513 801 z \"},\"ö\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 495 668 439 692 q 594 599 551 644 q 663 487 638 553 q 689 336 689 421 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 243 815 q 193 835 213 815 q 174 885 174 856 q 193 934 174 914 q 243 954 213 954 q 292 934 272 954 q 311 885 311 914 q 292 835 311 856 q 243 815 272 815 m 510 815 q 461 835 481 815 q 442 885 442 856 q 461 934 442 914 q 510 954 481 954 q 560 934 540 954 q 579 885 579 914 q 560 835 579 856 q 510 815 540 815 z \"},\"ō\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 495 668 439 692 q 594 599 551 644 q 663 487 638 553 q 689 336 689 421 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 192 835 l 192 914 l 561 914 l 561 835 l 192 835 z \"},\"ő\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 495 668 439 692 q 594 599 551 644 q 663 487 638 553 q 689 336 689 421 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 306 789 l 243 818 l 363 1057 l 444 1018 l 306 789 m 515 789 l 451 818 l 572 1057 l 653 1018 l 515 789 z \"},\"ǒ\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 495 668 439 692 q 594 599 551 644 q 663 487 638 553 q 689 336 689 421 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 319 797 l 161 992 l 210 1036 l 374 879 l 379 879 l 543 1036 l 592 992 l 433 797 l 319 797 z \"},\"ọ\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 495 668 439 692 q 594 599 551 644 q 663 487 638 553 q 689 336 689 421 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 378 -285 q 324 -264 346 -285 q 303 -210 303 -243 q 324 -156 303 -178 q 378 -135 346 -135 q 431 -156 410 -135 q 453 -210 453 -178 q 431 -264 453 -243 q 378 -285 410 -285 z \"},\"ỏ\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 495 668 439 692 q 594 599 551 644 q 663 487 638 553 q 689 336 689 421 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 332 794 l 319 850 q 375 873 353 858 q 397 915 397 888 q 282 981 397 975 l 289 1056 q 436 1020 385 1053 q 488 925 488 988 q 474 873 488 894 q 440 835 461 851 q 390 810 418 819 q 332 794 363 800 z \"},\"ố\":{\"ha\":753,\"x_min\":64,\"x_max\":703,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 495 668 439 692 q 594 599 551 644 q 663 487 638 553 q 689 336 689 421 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 231 792 l 190 839 l 329 967 l 424 967 l 563 839 l 522 792 l 379 892 l 374 892 l 231 792 m 514 924 l 635 1090 l 703 1043 l 563 885 l 514 924 z \"},\"ồ\":{\"ha\":753,\"x_min\":33,\"x_max\":689,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 495 668 439 692 q 594 599 551 644 q 663 487 638 553 q 689 336 689 421 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 231 792 l 190 839 l 329 967 l 424 967 l 563 839 l 522 792 l 379 892 l 374 892 l 231 792 m 239 928 l 190 885 l 33 1040 l 100 1090 l 239 928 z \"},\"ổ\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 495 668 439 692 q 594 599 551 644 q 663 487 638 553 q 689 336 689 421 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 231 792 l 190 839 l 329 967 l 424 967 l 563 839 l 522 792 l 379 892 l 374 892 l 231 792 m 538 882 l 525 931 q 567 950 551 938 q 583 985 583 963 q 561 1026 583 1013 q 488 1042 539 1039 l 497 1099 q 623 1071 579 1096 q 667 997 667 1046 q 656 950 667 969 q 626 917 644 931 q 585 896 608 904 q 538 882 563 888 z \"},\"ỗ\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 495 668 439 692 q 594 599 551 644 q 663 487 638 553 q 689 336 689 421 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 231 792 l 190 839 l 329 961 l 424 961 l 563 839 l 522 792 l 379 888 l 374 888 l 231 792 m 186 992 q 215 1081 192 1046 q 286 1115 238 1115 q 340 1106 317 1115 q 384 1086 364 1097 q 423 1066 404 1075 q 461 1057 442 1057 q 492 1071 482 1057 q 507 1115 501 1085 l 567 1110 q 538 1022 561 1057 q 467 986 515 986 q 413 995 436 986 q 369 1015 389 1004 q 330 1035 349 1026 q 292 1044 311 1044 q 261 1031 271 1044 q 246 986 251 1017 l 186 992 z \"},\"ộ\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 495 668 439 692 q 594 599 551 644 q 663 487 638 553 q 689 336 689 421 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 161 833 l 319 1028 l 433 1028 l 592 833 l 543 789 l 379 946 l 374 946 l 210 789 l 161 833 m 378 -285 q 324 -264 346 -285 q 303 -210 303 -243 q 324 -156 303 -178 q 378 -135 346 -135 q 431 -156 410 -135 q 453 -210 453 -178 q 431 -264 453 -243 q 378 -285 410 -285 z \"},\"ŏ\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 495 668 439 692 q 594 599 551 644 q 663 487 638 553 q 689 336 689 421 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 376 793 q 281 811 321 793 q 215 859 240 829 q 176 926 189 889 q 160 1003 163 964 l 231 1014 q 245 962 235 988 q 274 915 256 936 q 317 882 292 894 q 376 869 343 869 q 435 882 410 869 q 479 915 461 894 q 508 962 497 936 q 522 1014 518 988 l 593 1003 q 577 926 590 964 q 538 859 564 889 q 472 811 511 829 q 376 793 432 793 z \"},\"ṓ\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 495 668 439 692 q 594 599 551 644 q 663 487 638 553 q 689 336 689 421 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 329 979 l 285 1033 l 472 1171 l 525 1103 l 329 979 m 192 835 l 192 914 l 561 914 l 561 835 l 192 835 z \"},\"ø\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 376 -17 q 183 51 267 -17 l 115 -32 l 64 8 l 139 99 q 84 202 104 143 q 64 336 64 261 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 479 674 429 692 q 569 622 529 657 l 639 707 l 689 667 l 614 576 q 669 472 649 532 q 689 336 689 411 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 176 342 q 208 185 176 249 l 506 544 q 376 600 454 600 q 297 581 333 600 q 233 528 260 563 q 192 447 207 494 q 176 342 176 399 m 376 75 q 456 94 419 75 q 520 147 493 113 q 562 228 547 181 q 576 332 576 275 q 543 490 576 425 l 247 129 q 376 75 301 75 z \"},\"œ\":{\"ha\":1165,\"x_min\":64,\"x_max\":1113,\"o\":\"m 367 -17 q 251 7 306 -17 q 154 76 196 31 q 88 187 113 121 q 64 336 64 253 q 89 487 64 421 q 156 599 114 553 q 253 668 197 644 q 369 692 308 692 q 513 649 447 692 q 614 522 578 606 q 715 647 653 601 q 851 692 776 692 q 963 669 914 692 q 1044 606 1011 647 q 1095 505 1078 564 q 1113 374 1113 446 q 1108 310 1113 335 l 665 310 q 684 214 667 257 q 730 140 701 171 q 797 93 758 110 q 878 76 835 76 q 967 92 926 76 q 1044 132 1007 108 l 1086 53 q 988 4 1042 25 q 864 -17 933 -17 q 719 28 785 -17 q 615 151 654 72 q 367 -17 536 -17 m 369 78 q 446 97 411 78 q 506 149 481 115 q 544 231 531 183 q 558 336 558 278 q 544 442 558 394 q 506 525 531 490 q 446 578 481 560 q 369 597 411 597 q 293 578 328 597 q 233 525 258 560 q 194 442 208 490 q 181 336 181 394 q 194 231 181 278 q 233 149 208 183 q 293 97 258 115 q 369 78 328 78 m 665 386 l 1013 386 q 969 546 1013 490 q 849 601 926 601 q 726 544 778 601 q 665 386 675 486 z \"},\"ơ\":{\"ha\":753,\"x_min\":64,\"x_max\":728,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 508 663 446 692 q 597 705 567 674 q 628 794 628 736 q 622 834 628 814 q 607 871 617 854 l 696 913 q 719 861 710 889 q 728 803 728 833 q 715 731 728 761 q 680 677 701 700 q 631 640 658 654 q 575 617 604 625 q 658 501 628 572 q 689 336 689 431 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 z \"},\"ớ\":{\"ha\":753,\"x_min\":64,\"x_max\":728,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 508 663 446 692 q 597 705 567 674 q 628 794 628 736 q 622 834 628 814 q 607 871 617 854 l 696 913 q 719 861 710 889 q 728 803 728 833 q 715 731 728 761 q 680 677 701 700 q 631 640 658 654 q 575 617 604 625 q 658 501 628 572 q 689 336 689 431 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 357 796 l 299 853 l 494 1085 l 575 1008 l 357 796 z \"},\"ờ\":{\"ha\":753,\"x_min\":64,\"x_max\":728,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 508 663 446 692 q 597 705 567 674 q 628 794 628 736 q 622 834 628 814 q 607 871 617 854 l 696 913 q 719 861 710 889 q 728 803 728 833 q 715 731 728 761 q 680 677 701 700 q 631 640 658 654 q 575 617 604 625 q 658 501 628 572 q 689 336 689 431 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 396 796 l 178 1008 l 258 1085 l 454 853 l 396 796 z \"},\"ở\":{\"ha\":753,\"x_min\":64,\"x_max\":728,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 508 663 446 692 q 597 705 567 674 q 628 794 628 736 q 622 834 628 814 q 607 871 617 854 l 696 913 q 719 861 710 889 q 728 803 728 833 q 715 731 728 761 q 680 677 701 700 q 631 640 658 654 q 575 617 604 625 q 658 501 628 572 q 689 336 689 431 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 332 794 l 319 850 q 375 873 353 858 q 397 915 397 888 q 282 981 397 975 l 289 1056 q 436 1020 385 1053 q 488 925 488 988 q 474 873 488 894 q 440 835 461 851 q 390 810 418 819 q 332 794 363 800 z \"},\"ỡ\":{\"ha\":753,\"x_min\":64,\"x_max\":728,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 508 663 446 692 q 597 705 567 674 q 628 794 628 736 q 622 834 628 814 q 607 871 617 854 l 696 913 q 719 861 710 889 q 728 803 728 833 q 715 731 728 761 q 680 677 701 700 q 631 640 658 654 q 575 617 604 625 q 658 501 628 572 q 689 336 689 431 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 456 801 q 392 819 418 801 q 343 860 365 838 q 301 900 321 882 q 257 918 281 918 q 210 888 225 918 q 192 808 194 857 l 115 813 q 126 888 117 853 q 151 947 135 922 q 194 987 168 972 q 256 1001 219 1001 q 319 983 293 1001 q 368 943 346 965 q 410 903 390 921 q 456 885 431 885 q 501 915 486 885 q 519 994 517 946 l 596 989 q 585 915 594 949 q 560 856 576 881 q 517 816 543 831 q 456 801 492 801 z \"},\"ợ\":{\"ha\":753,\"x_min\":64,\"x_max\":728,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 508 663 446 692 q 597 705 567 674 q 628 794 628 736 q 622 834 628 814 q 607 871 617 854 l 696 913 q 719 861 710 889 q 728 803 728 833 q 715 731 728 761 q 680 677 701 700 q 631 640 658 654 q 575 617 604 625 q 658 501 628 572 q 689 336 689 431 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 378 -285 q 324 -264 346 -285 q 303 -210 303 -243 q 324 -156 303 -178 q 378 -135 346 -135 q 431 -156 410 -135 q 453 -210 453 -178 q 431 -264 453 -243 q 378 -285 410 -285 z \"},\"ǫ\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 410 -286 q 321 -256 357 -286 q 285 -168 285 -226 q 292 -119 285 -142 q 312 -76 300 -96 q 337 -40 324 -56 q 363 -15 350 -25 q 247 13 301 -12 q 152 83 193 39 q 88 192 111 128 q 64 336 64 256 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 495 668 439 692 q 594 599 551 644 q 663 487 638 553 q 689 336 689 421 q 673 212 689 265 q 628 117 657 158 q 558 47 599 76 q 468 -6 518 17 q 395 -67 421 -28 q 369 -146 369 -106 q 389 -194 369 -178 q 433 -210 408 -210 q 463 -205 450 -210 q 490 -192 476 -200 l 519 -249 q 469 -275 500 -264 q 410 -286 438 -286 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 z \"},\"ŕ\":{\"ha\":482,\"x_min\":114,\"x_max\":500,\"o\":\"m 114 0 l 114 675 l 208 675 l 218 553 l 222 553 q 306 654 257 617 q 414 692 356 692 q 486 678 454 692 l 464 578 q 433 586 447 583 q 399 589 419 589 q 309 554 356 589 q 228 433 263 519 l 228 0 l 114 0 m 282 796 l 224 853 l 419 1085 l 500 1008 l 282 796 z \"},\"ŗ\":{\"ha\":482,\"x_min\":36,\"x_max\":486,\"o\":\"m 114 0 l 114 675 l 208 675 l 218 553 l 222 553 q 306 654 257 617 q 414 692 356 692 q 486 678 454 692 l 464 578 q 433 586 447 583 q 399 589 419 589 q 309 554 356 589 q 228 433 263 519 l 228 0 l 114 0 m 47 -314 l 36 -258 q 156 -235 124 -251 q 188 -192 188 -219 q 163 -151 188 -164 q 89 -133 138 -137 l 114 -81 q 240 -116 204 -92 q 276 -187 276 -140 q 217 -278 276 -249 q 47 -314 158 -308 z \"},\"ř\":{\"ha\":482,\"x_min\":86,\"x_max\":517,\"o\":\"m 114 0 l 114 675 l 208 675 l 218 553 l 222 553 q 306 654 257 617 q 414 692 356 692 q 486 678 454 692 l 464 578 q 433 586 447 583 q 399 589 419 589 q 309 554 356 589 q 228 433 263 519 l 228 0 l 114 0 m 244 797 l 86 992 l 135 1036 l 299 879 l 304 879 l 468 1036 l 517 992 l 358 797 l 244 797 z \"},\"ṙ\":{\"ha\":482,\"x_min\":114,\"x_max\":486,\"o\":\"m 114 0 l 114 675 l 208 675 l 218 553 l 222 553 q 306 654 257 617 q 414 692 356 692 q 486 678 454 692 l 464 578 q 433 586 447 583 q 399 589 419 589 q 309 554 356 589 q 228 433 263 519 l 228 0 l 114 0 m 300 814 q 247 835 268 814 q 225 889 225 856 q 247 942 225 921 q 300 964 268 964 q 353 942 332 964 q 375 889 375 921 q 353 835 375 856 q 300 814 332 814 z \"},\"ṛ\":{\"ha\":482,\"x_min\":93,\"x_max\":486,\"o\":\"m 114 0 l 114 675 l 208 675 l 218 553 l 222 553 q 306 654 257 617 q 414 692 356 692 q 486 678 454 692 l 464 578 q 433 586 447 583 q 399 589 419 589 q 309 554 356 589 q 228 433 263 519 l 228 0 l 114 0 m 168 -285 q 115 -264 136 -285 q 93 -210 93 -243 q 115 -156 93 -178 q 168 -135 136 -135 q 222 -156 200 -135 q 243 -210 243 -178 q 222 -264 243 -243 q 168 -285 200 -285 z \"},\"ṝ\":{\"ha\":482,\"x_min\":93,\"x_max\":486,\"o\":\"m 114 0 l 114 675 l 208 675 l 218 553 l 222 553 q 306 654 257 617 q 414 692 356 692 q 486 678 454 692 l 464 578 q 433 586 447 583 q 399 589 419 589 q 309 554 356 589 q 228 433 263 519 l 228 0 l 114 0 m 117 835 l 117 914 l 486 914 l 486 835 l 117 835 m 168 -285 q 115 -264 136 -285 q 93 -210 93 -243 q 115 -156 93 -178 q 168 -135 136 -135 q 222 -156 200 -135 q 243 -210 243 -178 q 222 -264 243 -243 q 168 -285 200 -285 z \"},\"ṟ\":{\"ha\":482,\"x_min\":-17,\"x_max\":486,\"o\":\"m 114 0 l 114 675 l 208 675 l 218 553 l 222 553 q 306 654 257 617 q 414 692 356 692 q 486 678 454 692 l 464 578 q 433 586 447 583 q 399 589 419 589 q 309 554 356 589 q 228 433 263 519 l 228 0 l 114 0 m -17 -235 l -17 -156 l 353 -156 l 353 -235 l -17 -235 z \"},\"ś\":{\"ha\":582,\"x_min\":39,\"x_max\":538,\"o\":\"m 290 -17 q 153 10 218 -17 q 39 76 88 36 l 96 153 q 187 94 140 117 q 294 72 233 72 q 394 103 361 72 q 428 178 428 133 q 414 224 428 204 q 378 258 400 243 q 329 283 357 272 q 274 306 301 294 q 201 334 238 318 q 137 373 165 350 q 90 426 108 396 q 72 500 72 457 q 88 576 72 540 q 134 637 104 611 q 207 677 164 663 q 304 692 250 692 q 422 669 368 692 q 514 615 475 647 l 460 543 q 388 586 425 569 q 306 603 350 603 q 212 574 242 603 q 182 506 182 544 q 194 465 182 482 q 228 434 207 447 q 276 410 249 421 q 332 389 303 400 q 405 360 368 375 q 471 322 442 344 q 519 265 500 299 q 538 185 538 232 q 522 107 538 143 q 474 43 506 71 q 397 -1 443 15 q 290 -17 350 -17 m 285 796 l 226 853 l 422 1085 l 503 1008 l 285 796 z \"},\"ŝ\":{\"ha\":582,\"x_min\":39,\"x_max\":538,\"o\":\"m 290 -17 q 153 10 218 -17 q 39 76 88 36 l 96 153 q 187 94 140 117 q 294 72 233 72 q 394 103 361 72 q 428 178 428 133 q 414 224 428 204 q 378 258 400 243 q 329 283 357 272 q 274 306 301 294 q 201 334 238 318 q 137 373 165 350 q 90 426 108 396 q 72 500 72 457 q 88 576 72 540 q 134 637 104 611 q 207 677 164 663 q 304 692 250 692 q 422 669 368 692 q 514 615 475 647 l 460 543 q 388 586 425 569 q 306 603 350 603 q 212 574 242 603 q 182 506 182 544 q 194 465 182 482 q 228 434 207 447 q 276 410 249 421 q 332 389 303 400 q 405 360 368 375 q 471 322 442 344 q 519 265 500 299 q 538 185 538 232 q 522 107 538 143 q 474 43 506 71 q 397 -1 443 15 q 290 -17 350 -17 m 89 833 l 247 1028 l 361 1028 l 519 833 l 471 789 l 307 946 l 301 946 l 138 789 l 89 833 z \"},\"š\":{\"ha\":582,\"x_min\":39,\"x_max\":538,\"o\":\"m 290 -17 q 153 10 218 -17 q 39 76 88 36 l 96 153 q 187 94 140 117 q 294 72 233 72 q 394 103 361 72 q 428 178 428 133 q 414 224 428 204 q 378 258 400 243 q 329 283 357 272 q 274 306 301 294 q 201 334 238 318 q 137 373 165 350 q 90 426 108 396 q 72 500 72 457 q 88 576 72 540 q 134 637 104 611 q 207 677 164 663 q 304 692 250 692 q 422 669 368 692 q 514 615 475 647 l 460 543 q 388 586 425 569 q 306 603 350 603 q 212 574 242 603 q 182 506 182 544 q 194 465 182 482 q 228 434 207 447 q 276 410 249 421 q 332 389 303 400 q 405 360 368 375 q 471 322 442 344 q 519 265 500 299 q 538 185 538 232 q 522 107 538 143 q 474 43 506 71 q 397 -1 443 15 q 290 -17 350 -17 m 247 797 l 89 992 l 138 1036 l 301 879 l 307 879 l 471 1036 l 519 992 l 361 797 l 247 797 z \"},\"ş\":{\"ha\":582,\"x_min\":39,\"x_max\":538,\"o\":\"m 290 -17 q 153 10 218 -17 q 39 76 88 36 l 96 153 q 187 94 140 117 q 294 72 233 72 q 394 103 361 72 q 428 178 428 133 q 414 224 428 204 q 378 258 400 243 q 329 283 357 272 q 274 306 301 294 q 201 334 238 318 q 137 373 165 350 q 90 426 108 396 q 72 500 72 457 q 88 576 72 540 q 134 637 104 611 q 207 677 164 663 q 304 692 250 692 q 422 669 368 692 q 514 615 475 647 l 460 543 q 388 586 425 569 q 306 603 350 603 q 212 574 242 603 q 182 506 182 544 q 194 465 182 482 q 228 434 207 447 q 276 410 249 421 q 332 389 303 400 q 405 360 368 375 q 471 322 442 344 q 519 265 500 299 q 538 185 538 232 q 522 107 538 143 q 474 43 506 71 q 397 -1 443 15 q 290 -17 350 -17 m 188 -314 l 176 -258 q 296 -235 264 -251 q 328 -189 328 -219 q 304 -146 328 -161 q 221 -122 281 -131 l 282 4 l 356 4 l 315 -89 q 390 -122 364 -100 q 417 -187 417 -144 q 358 -278 417 -249 q 188 -314 299 -308 z \"},\"ș\":{\"ha\":582,\"x_min\":39,\"x_max\":538,\"o\":\"m 290 -17 q 153 10 218 -17 q 39 76 88 36 l 96 153 q 187 94 140 117 q 294 72 233 72 q 394 103 361 72 q 428 178 428 133 q 414 224 428 204 q 378 258 400 243 q 329 283 357 272 q 274 306 301 294 q 201 334 238 318 q 137 373 165 350 q 90 426 108 396 q 72 500 72 457 q 88 576 72 540 q 134 637 104 611 q 207 677 164 663 q 304 692 250 692 q 422 669 368 692 q 514 615 475 647 l 460 543 q 388 586 425 569 q 306 603 350 603 q 212 574 242 603 q 182 506 182 544 q 194 465 182 482 q 228 434 207 447 q 276 410 249 421 q 332 389 303 400 q 405 360 368 375 q 471 322 442 344 q 519 265 500 299 q 538 185 538 232 q 522 107 538 143 q 474 43 506 71 q 397 -1 443 15 q 290 -17 350 -17 m 188 -314 l 176 -258 q 296 -235 264 -251 q 328 -192 328 -219 q 303 -151 328 -164 q 229 -133 278 -137 l 254 -81 q 381 -116 344 -92 q 417 -187 417 -140 q 358 -278 417 -249 q 188 -314 299 -308 z \"},\"ṡ\":{\"ha\":582,\"x_min\":39,\"x_max\":538,\"o\":\"m 290 -17 q 153 10 218 -17 q 39 76 88 36 l 96 153 q 187 94 140 117 q 294 72 233 72 q 394 103 361 72 q 428 178 428 133 q 414 224 428 204 q 378 258 400 243 q 329 283 357 272 q 274 306 301 294 q 201 334 238 318 q 137 373 165 350 q 90 426 108 396 q 72 500 72 457 q 88 576 72 540 q 134 637 104 611 q 207 677 164 663 q 304 692 250 692 q 422 669 368 692 q 514 615 475 647 l 460 543 q 388 586 425 569 q 306 603 350 603 q 212 574 242 603 q 182 506 182 544 q 194 465 182 482 q 228 434 207 447 q 276 410 249 421 q 332 389 303 400 q 405 360 368 375 q 471 322 442 344 q 519 265 500 299 q 538 185 538 232 q 522 107 538 143 q 474 43 506 71 q 397 -1 443 15 q 290 -17 350 -17 m 304 814 q 251 835 272 814 q 229 889 229 856 q 251 942 229 921 q 304 964 272 964 q 358 942 336 964 q 379 889 379 921 q 358 835 379 856 q 304 814 336 814 z \"},\"ṣ\":{\"ha\":582,\"x_min\":39,\"x_max\":538,\"o\":\"m 290 -17 q 153 10 218 -17 q 39 76 88 36 l 96 153 q 187 94 140 117 q 294 72 233 72 q 394 103 361 72 q 428 178 428 133 q 414 224 428 204 q 378 258 400 243 q 329 283 357 272 q 274 306 301 294 q 201 334 238 318 q 137 373 165 350 q 90 426 108 396 q 72 500 72 457 q 88 576 72 540 q 134 637 104 611 q 207 677 164 663 q 304 692 250 692 q 422 669 368 692 q 514 615 475 647 l 460 543 q 388 586 425 569 q 306 603 350 603 q 212 574 242 603 q 182 506 182 544 q 194 465 182 482 q 228 434 207 447 q 276 410 249 421 q 332 389 303 400 q 405 360 368 375 q 471 322 442 344 q 519 265 500 299 q 538 185 538 232 q 522 107 538 143 q 474 43 506 71 q 397 -1 443 15 q 290 -17 350 -17 m 310 -285 q 256 -264 278 -285 q 235 -210 235 -243 q 256 -156 235 -178 q 310 -135 278 -135 q 363 -156 342 -135 q 385 -210 385 -178 q 363 -264 385 -243 q 310 -285 342 -285 z \"},\"ß\":{\"ha\":800,\"x_min\":114,\"x_max\":760,\"o\":\"m 538 -17 q 432 1 479 -17 q 342 51 385 19 l 388 132 q 459 87 424 101 q 535 72 494 72 q 622 106 593 72 q 651 183 651 139 q 631 250 651 224 q 581 296 611 276 q 515 333 550 315 q 449 372 479 350 q 398 426 418 394 q 378 506 378 457 q 397 586 378 553 q 438 650 415 619 q 481 713 461 681 q 500 789 500 744 q 472 876 500 842 q 385 910 443 910 q 269 856 310 910 q 228 694 228 803 l 228 0 l 114 0 l 114 715 q 185 924 114 846 q 386 1003 256 1003 q 483 987 440 1003 q 554 943 525 971 q 598 878 583 915 q 613 800 613 842 q 593 710 613 747 q 549 643 574 674 q 506 584 525 613 q 486 519 486 556 q 506 464 486 486 q 557 424 526 442 q 623 389 588 407 q 689 346 658 371 q 740 283 719 321 q 760 190 760 246 q 744 108 760 146 q 700 43 729 71 q 630 -1 671 15 q 538 -17 589 -17 z \"},\"ť\":{\"ha\":469,\"x_min\":33,\"x_max\":451,\"o\":\"m 326 -17 q 235 0 272 -17 q 176 46 199 17 q 143 117 153 75 q 133 208 133 158 l 133 582 l 33 582 l 33 668 l 139 675 l 153 864 l 249 864 l 249 675 l 431 675 l 431 582 l 249 582 l 249 207 q 272 110 249 144 q 353 76 294 76 q 392 82 371 76 q 429 94 413 88 l 451 8 q 391 -9 424 -1 q 326 -17 358 -17 m 357 761 l 351 1056 l 433 1056 l 432 976 l 413 761 l 357 761 z \"},\"ţ\":{\"ha\":469,\"x_min\":33,\"x_max\":451,\"o\":\"m 326 -17 q 235 0 272 -17 q 176 46 199 17 q 143 117 153 75 q 133 208 133 158 l 133 582 l 33 582 l 33 668 l 139 675 l 153 864 l 249 864 l 249 675 l 431 675 l 431 582 l 249 582 l 249 207 q 272 110 249 144 q 353 76 294 76 q 392 82 371 76 q 429 94 413 88 l 451 8 q 391 -9 424 -1 q 326 -17 358 -17 m 179 -314 l 168 -258 q 288 -235 256 -251 q 319 -189 319 -219 q 296 -146 319 -161 q 213 -122 272 -131 l 274 4 l 347 4 l 307 -89 q 382 -122 356 -100 q 408 -187 408 -144 q 349 -278 408 -249 q 179 -314 290 -308 z \"},\"ț\":{\"ha\":469,\"x_min\":33,\"x_max\":451,\"o\":\"m 326 -17 q 235 0 272 -17 q 176 46 199 17 q 143 117 153 75 q 133 208 133 158 l 133 582 l 33 582 l 33 668 l 139 675 l 153 864 l 249 864 l 249 675 l 431 675 l 431 582 l 249 582 l 249 207 q 272 110 249 144 q 353 76 294 76 q 392 82 371 76 q 429 94 413 88 l 451 8 q 391 -9 424 -1 q 326 -17 358 -17 m 175 -314 l 164 -258 q 283 -235 251 -251 q 315 -192 315 -219 q 290 -151 315 -164 q 217 -133 265 -137 l 242 -81 q 368 -116 332 -92 q 404 -187 404 -140 q 345 -278 404 -249 q 175 -314 286 -308 z \"},\"ṭ\":{\"ha\":469,\"x_min\":33,\"x_max\":451,\"o\":\"m 326 -17 q 235 0 272 -17 q 176 46 199 17 q 143 117 153 75 q 133 208 133 158 l 133 582 l 33 582 l 33 668 l 139 675 l 153 864 l 249 864 l 249 675 l 431 675 l 431 582 l 249 582 l 249 207 q 272 110 249 144 q 353 76 294 76 q 392 82 371 76 q 429 94 413 88 l 451 8 q 391 -9 424 -1 q 326 -17 358 -17 m 297 -285 q 244 -264 265 -285 q 222 -210 222 -243 q 244 -156 222 -178 q 297 -135 265 -135 q 351 -156 329 -135 q 372 -210 372 -178 q 351 -264 372 -243 q 297 -285 329 -285 z \"},\"ṯ\":{\"ha\":469,\"x_min\":33,\"x_max\":481,\"o\":\"m 326 -17 q 235 0 272 -17 q 176 46 199 17 q 143 117 153 75 q 133 208 133 158 l 133 582 l 33 582 l 33 668 l 139 675 l 153 864 l 249 864 l 249 675 l 431 675 l 431 582 l 249 582 l 249 207 q 272 110 249 144 q 353 76 294 76 q 392 82 371 76 q 429 94 413 88 l 451 8 q 391 -9 424 -1 q 326 -17 358 -17 m 111 -235 l 111 -156 l 481 -156 l 481 -235 l 111 -235 z \"},\"ẗ\":{\"ha\":469,\"x_min\":-3,\"x_max\":451,\"o\":\"m 326 -17 q 235 0 272 -17 q 176 46 199 17 q 143 117 153 75 q 133 208 133 158 l 133 582 l 33 582 l 33 668 l 139 675 l 153 864 l 249 864 l 249 675 l 431 675 l 431 582 l 249 582 l 249 207 q 272 110 249 144 q 353 76 294 76 q 392 82 371 76 q 429 94 413 88 l 451 8 q 391 -9 424 -1 q 326 -17 358 -17 m 67 1004 q 17 1024 36 1004 q -3 1074 -3 1044 q 17 1123 -3 1103 q 67 1143 36 1143 q 115 1123 96 1143 q 135 1074 135 1103 q 115 1024 135 1044 q 67 1004 96 1004 m 333 1004 q 285 1024 304 1004 q 265 1074 265 1044 q 285 1123 265 1103 q 333 1143 304 1143 q 383 1123 364 1143 q 403 1074 403 1103 q 383 1024 403 1044 q 333 1004 364 1004 z \"},\"ŧ\":{\"ha\":469,\"x_min\":33,\"x_max\":451,\"o\":\"m 33 321 l 33 381 l 133 388 l 133 582 l 33 582 l 33 668 l 139 675 l 153 864 l 249 864 l 249 675 l 431 675 l 431 582 l 249 582 l 249 388 l 431 388 l 431 321 l 249 321 l 249 207 q 272 110 249 144 q 353 76 294 76 q 392 82 371 76 q 429 94 413 88 l 451 8 q 391 -9 424 -1 q 326 -17 358 -17 q 235 0 272 -17 q 176 46 199 17 q 143 117 153 75 q 133 208 133 158 l 133 321 l 33 321 z \"},\"ù\":{\"ha\":756,\"x_min\":104,\"x_max\":642,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 642 675 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 m 397 796 l 179 1008 l 260 1085 l 456 853 l 397 796 z \"},\"ú\":{\"ha\":756,\"x_min\":104,\"x_max\":642,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 642 675 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 m 358 796 l 300 853 l 496 1085 l 576 1008 l 358 796 z \"},\"û\":{\"ha\":756,\"x_min\":104,\"x_max\":642,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 642 675 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 m 163 833 l 321 1028 l 435 1028 l 593 833 l 544 789 l 381 946 l 375 946 l 211 789 l 163 833 z \"},\"ũ\":{\"ha\":756,\"x_min\":104,\"x_max\":642,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 642 675 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 m 478 801 q 414 819 440 801 q 365 860 388 838 q 323 900 343 882 q 279 918 303 918 q 232 888 247 918 q 214 808 217 857 l 138 813 q 148 888 139 853 q 174 947 157 922 q 216 987 190 972 q 278 1001 242 1001 q 342 983 315 1001 q 390 943 368 965 q 433 903 413 921 q 478 885 453 885 q 524 915 508 885 q 542 994 539 946 l 618 989 q 608 915 617 949 q 582 856 599 881 q 540 816 565 831 q 478 801 514 801 z \"},\"ü\":{\"ha\":756,\"x_min\":104,\"x_max\":642,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 642 675 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 m 244 815 q 194 835 214 815 q 175 885 175 856 q 194 934 175 914 q 244 954 214 954 q 293 934 274 954 q 313 885 313 914 q 293 835 313 856 q 244 815 274 815 m 511 815 q 463 835 482 815 q 443 885 443 856 q 463 934 443 914 q 511 954 482 954 q 561 934 542 954 q 581 885 581 914 q 561 835 581 856 q 511 815 542 815 z \"},\"ū\":{\"ha\":756,\"x_min\":104,\"x_max\":642,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 642 675 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 m 189 835 l 189 914 l 558 914 l 558 835 l 189 835 z \"},\"ŭ\":{\"ha\":756,\"x_min\":104,\"x_max\":642,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 642 675 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 m 378 793 q 282 811 322 793 q 216 859 242 829 q 177 926 190 889 q 161 1003 164 964 l 232 1014 q 247 962 236 988 q 275 915 257 936 q 319 882 293 894 q 378 869 344 869 q 437 882 411 869 q 481 915 463 894 q 509 962 499 936 q 524 1014 519 988 l 594 1003 q 578 926 592 964 q 539 859 565 889 q 473 811 513 829 q 378 793 433 793 z \"},\"ů\":{\"ha\":756,\"x_min\":104,\"x_max\":642,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 642 675 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 m 378 769 q 266 808 307 769 q 225 907 225 847 q 266 1004 225 965 q 378 1043 307 1043 q 490 1004 449 1043 q 531 907 531 965 q 490 808 531 847 q 378 769 449 769 m 378 821 q 434 844 411 821 q 457 907 457 867 q 434 969 457 946 q 378 992 411 992 q 322 969 344 992 q 299 907 299 946 q 322 844 299 867 q 378 821 344 821 z \"},\"ű\":{\"ha\":756,\"x_min\":104,\"x_max\":654,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 642 675 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 m 307 789 l 244 818 l 364 1057 l 446 1018 l 307 789 m 517 789 l 453 818 l 574 1057 l 654 1018 l 517 789 z \"},\"ǔ\":{\"ha\":756,\"x_min\":104,\"x_max\":642,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 642 675 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 m 321 797 l 163 992 l 211 1036 l 375 879 l 381 879 l 544 1036 l 593 992 l 435 797 l 321 797 z \"},\"ǖ\":{\"ha\":756,\"x_min\":104,\"x_max\":642,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 642 675 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 m 244 817 q 199 835 217 817 q 181 879 181 853 q 199 925 181 907 q 244 943 217 943 q 290 925 272 943 q 307 879 307 907 q 290 835 307 853 q 244 817 272 817 m 192 1042 l 192 1107 l 563 1107 l 563 1042 l 192 1042 m 511 817 q 466 835 483 817 q 449 879 449 853 q 466 925 449 907 q 511 943 483 943 q 557 925 539 943 q 575 879 575 907 q 557 835 575 853 q 511 817 539 817 z \"},\"ǘ\":{\"ha\":756,\"x_min\":104,\"x_max\":642,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 642 675 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 m 368 979 l 319 1013 l 433 1172 l 501 1125 l 368 979 m 244 817 q 199 835 217 817 q 181 879 181 853 q 199 925 181 907 q 244 943 217 943 q 290 925 272 943 q 307 879 307 907 q 290 835 307 853 q 244 817 272 817 m 511 817 q 466 835 483 817 q 449 879 449 853 q 466 925 449 907 q 511 943 483 943 q 557 925 539 943 q 575 879 575 907 q 557 835 575 853 q 511 817 539 817 z \"},\"ǚ\":{\"ha\":756,\"x_min\":104,\"x_max\":642,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 642 675 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 m 242 1167 l 375 1065 l 381 1065 l 514 1167 l 556 1128 l 425 1000 l 331 1000 l 200 1128 l 242 1167 m 244 817 q 199 835 217 817 q 181 879 181 853 q 199 925 181 907 q 244 943 217 943 q 290 925 272 943 q 307 879 307 907 q 290 835 307 853 q 244 817 272 817 m 511 817 q 466 835 483 817 q 449 879 449 853 q 466 925 449 907 q 511 943 483 943 q 557 925 539 943 q 575 879 575 907 q 557 835 575 853 q 511 817 539 817 z \"},\"ǜ\":{\"ha\":756,\"x_min\":104,\"x_max\":642,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 642 675 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 m 388 979 l 254 1125 l 322 1172 l 436 1013 l 388 979 m 244 817 q 199 835 217 817 q 181 879 181 853 q 199 925 181 907 q 244 943 217 943 q 290 925 272 943 q 307 879 307 907 q 290 835 307 853 q 244 817 272 817 m 511 817 q 466 835 483 817 q 449 879 449 853 q 466 925 449 907 q 511 943 483 943 q 557 925 539 943 q 575 879 575 907 q 557 835 575 853 q 511 817 539 817 z \"},\"ụ\":{\"ha\":756,\"x_min\":104,\"x_max\":642,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 642 675 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 m 403 -285 q 349 -264 371 -285 q 328 -210 328 -243 q 349 -156 328 -178 q 403 -135 371 -135 q 456 -156 435 -135 q 478 -210 478 -178 q 456 -264 478 -243 q 403 -285 435 -285 z \"},\"ủ\":{\"ha\":756,\"x_min\":104,\"x_max\":642,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 642 675 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 m 333 794 l 321 850 q 376 873 354 858 q 399 915 399 888 q 283 981 399 975 l 290 1056 q 438 1020 386 1053 q 489 925 489 988 q 476 873 489 894 q 441 835 463 851 q 392 810 419 819 q 333 794 364 800 z \"},\"ų\":{\"ha\":756,\"x_min\":104,\"x_max\":671,\"o\":\"m 563 -286 q 473 -256 510 -286 q 436 -168 436 -226 q 470 -69 436 -111 q 549 6 504 -26 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 278 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 642 675 l 642 0 q 550 -68 579 -31 q 521 -146 521 -106 q 541 -194 521 -178 q 585 -210 561 -210 q 615 -205 601 -210 q 642 -192 629 -200 l 671 -249 q 620 -275 651 -264 q 563 -286 589 -286 z \"},\"ư\":{\"ha\":756,\"x_min\":104,\"x_max\":775,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 557 675 q 603 688 582 679 q 640 711 624 696 q 665 750 656 726 q 674 808 674 774 q 668 848 674 828 q 654 885 663 868 l 743 926 q 766 875 757 903 q 775 817 775 847 q 763 744 775 775 q 733 690 751 713 q 690 654 714 668 q 642 632 665 640 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 z \"},\"ứ\":{\"ha\":756,\"x_min\":104,\"x_max\":775,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 557 675 q 603 688 582 679 q 640 711 624 696 q 665 750 656 726 q 674 808 674 774 q 668 848 674 828 q 654 885 663 868 l 743 926 q 766 875 757 903 q 775 817 775 847 q 763 744 775 775 q 733 690 751 713 q 690 654 714 668 q 642 632 665 640 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 m 350 796 l 292 853 l 488 1085 l 568 1008 l 350 796 z \"},\"ừ\":{\"ha\":756,\"x_min\":104,\"x_max\":775,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 557 675 q 603 688 582 679 q 640 711 624 696 q 665 750 656 726 q 674 808 674 774 q 668 848 674 828 q 654 885 663 868 l 743 926 q 766 875 757 903 q 775 817 775 847 q 763 744 775 775 q 733 690 751 713 q 690 654 714 668 q 642 632 665 640 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 m 389 796 l 171 1008 l 251 1085 l 447 853 l 389 796 z \"},\"ử\":{\"ha\":756,\"x_min\":104,\"x_max\":775,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 557 675 q 603 688 582 679 q 640 711 624 696 q 665 750 656 726 q 674 808 674 774 q 668 848 674 828 q 654 885 663 868 l 743 926 q 766 875 757 903 q 775 817 775 847 q 763 744 775 775 q 733 690 751 713 q 690 654 714 668 q 642 632 665 640 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 m 325 794 l 313 850 q 368 873 346 858 q 390 915 390 888 q 275 981 390 975 l 282 1056 q 429 1020 378 1053 q 481 925 481 988 q 467 873 481 894 q 433 835 454 851 q 383 810 411 819 q 325 794 356 800 z \"},\"ữ\":{\"ha\":756,\"x_min\":104,\"x_max\":775,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 557 675 q 603 688 582 679 q 640 711 624 696 q 665 750 656 726 q 674 808 674 774 q 668 848 674 828 q 654 885 663 868 l 743 926 q 766 875 757 903 q 775 817 775 847 q 763 744 775 775 q 733 690 751 713 q 690 654 714 668 q 642 632 665 640 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 m 469 801 q 406 819 432 801 q 357 860 379 838 q 315 900 335 882 q 271 918 294 918 q 224 888 239 918 q 206 808 208 857 l 129 813 q 140 888 131 853 q 165 947 149 922 q 208 987 182 972 q 269 1001 233 1001 q 333 983 307 1001 q 382 943 360 965 q 424 903 404 921 q 469 885 444 885 q 515 915 500 885 q 533 994 531 946 l 610 989 q 599 915 608 949 q 574 856 590 881 q 531 816 557 831 q 469 801 506 801 z \"},\"ự\":{\"ha\":756,\"x_min\":104,\"x_max\":775,\"o\":\"m 311 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 439 109 399 82 q 528 196 479 136 l 528 675 l 557 675 q 603 688 582 679 q 640 711 624 696 q 665 750 656 726 q 674 808 674 774 q 668 848 674 828 q 654 885 663 868 l 743 926 q 766 875 757 903 q 775 817 775 847 q 763 744 775 775 q 733 690 751 713 q 690 654 714 668 q 642 632 665 640 l 642 0 l 547 0 l 538 106 l 533 106 q 434 17 486 50 q 311 -17 382 -17 m 394 -285 q 341 -264 363 -285 q 319 -210 319 -243 q 341 -156 319 -178 q 394 -135 363 -135 q 448 -156 426 -135 q 469 -210 469 -178 q 448 -264 469 -243 q 394 -285 426 -285 z \"},\"ẁ\":{\"ha\":997,\"x_min\":33,\"x_max\":964,\"o\":\"m 221 0 l 33 675 l 150 675 l 250 285 q 271 190 261 236 q 290 97 281 144 l 296 97 q 318 191 307 144 q 342 285 329 238 l 446 675 l 557 675 l 663 285 q 687 190 675 236 q 710 97 699 144 l 715 97 q 736 190 726 144 q 757 285 746 236 l 856 675 l 964 675 l 783 0 l 644 0 l 547 363 q 524 458 535 411 q 501 557 514 506 l 496 557 q 474 458 485 506 q 449 361 463 410 l 354 0 l 221 0 m 519 796 l 301 1008 l 382 1085 l 578 853 l 519 796 z \"},\"ẃ\":{\"ha\":997,\"x_min\":33,\"x_max\":964,\"o\":\"m 221 0 l 33 675 l 150 675 l 250 285 q 271 190 261 236 q 290 97 281 144 l 296 97 q 318 191 307 144 q 342 285 329 238 l 446 675 l 557 675 l 663 285 q 687 190 675 236 q 710 97 699 144 l 715 97 q 736 190 726 144 q 757 285 746 236 l 856 675 l 964 675 l 783 0 l 644 0 l 547 363 q 524 458 535 411 q 501 557 514 506 l 496 557 q 474 458 485 506 q 449 361 463 410 l 354 0 l 221 0 m 481 796 l 422 853 l 618 1085 l 699 1008 l 481 796 z \"},\"ŵ\":{\"ha\":997,\"x_min\":33,\"x_max\":964,\"o\":\"m 221 0 l 33 675 l 150 675 l 250 285 q 271 190 261 236 q 290 97 281 144 l 296 97 q 318 191 307 144 q 342 285 329 238 l 446 675 l 557 675 l 663 285 q 687 190 675 236 q 710 97 699 144 l 715 97 q 736 190 726 144 q 757 285 746 236 l 856 675 l 964 675 l 783 0 l 644 0 l 547 363 q 524 458 535 411 q 501 557 514 506 l 496 557 q 474 458 485 506 q 449 361 463 410 l 354 0 l 221 0 m 285 833 l 443 1028 l 557 1028 l 715 833 l 667 789 l 503 946 l 497 946 l 333 789 l 285 833 z \"},\"ẅ\":{\"ha\":997,\"x_min\":33,\"x_max\":964,\"o\":\"m 221 0 l 33 675 l 150 675 l 250 285 q 271 190 261 236 q 290 97 281 144 l 296 97 q 318 191 307 144 q 342 285 329 238 l 446 675 l 557 675 l 663 285 q 687 190 675 236 q 710 97 699 144 l 715 97 q 736 190 726 144 q 757 285 746 236 l 856 675 l 964 675 l 783 0 l 644 0 l 547 363 q 524 458 535 411 q 501 557 514 506 l 496 557 q 474 458 485 506 q 449 361 463 410 l 354 0 l 221 0 m 367 815 q 317 835 336 815 q 297 885 297 856 q 317 934 297 914 q 367 954 336 954 q 415 934 396 954 q 435 885 435 914 q 415 835 435 856 q 367 815 396 815 m 633 815 q 585 835 604 815 q 565 885 565 856 q 585 934 565 914 q 633 954 604 954 q 683 934 664 954 q 703 885 703 914 q 683 835 703 856 q 633 815 664 815 z \"},\"ỳ\":{\"ha\":649,\"x_min\":17,\"x_max\":632,\"o\":\"m 125 -290 q 82 -287 101 -290 q 46 -276 63 -283 l 68 -186 q 93 -192 79 -189 q 119 -196 107 -196 q 215 -155 178 -196 q 272 -51 251 -114 l 288 -1 l 17 675 l 135 675 l 272 301 q 305 208 288 257 q 338 111 322 158 l 343 111 q 372 207 358 157 q 400 301 386 257 l 521 675 l 632 675 l 378 -56 q 338 -149 360 -106 q 285 -223 315 -192 q 215 -272 254 -254 q 125 -290 176 -290 m 356 796 l 138 1008 l 218 1085 l 414 853 l 356 796 z \"},\"ý\":{\"ha\":649,\"x_min\":17,\"x_max\":632,\"o\":\"m 125 -290 q 82 -287 101 -290 q 46 -276 63 -283 l 68 -186 q 93 -192 79 -189 q 119 -196 107 -196 q 215 -155 178 -196 q 272 -51 251 -114 l 288 -1 l 17 675 l 135 675 l 272 301 q 305 208 288 257 q 338 111 322 158 l 343 111 q 372 207 358 157 q 400 301 386 257 l 521 675 l 632 675 l 378 -56 q 338 -149 360 -106 q 285 -223 315 -192 q 215 -272 254 -254 q 125 -290 176 -290 m 317 796 l 258 853 l 454 1085 l 535 1008 l 317 796 z \"},\"ŷ\":{\"ha\":649,\"x_min\":17,\"x_max\":632,\"o\":\"m 125 -290 q 82 -287 101 -290 q 46 -276 63 -283 l 68 -186 q 93 -192 79 -189 q 119 -196 107 -196 q 215 -155 178 -196 q 272 -51 251 -114 l 288 -1 l 17 675 l 135 675 l 272 301 q 305 208 288 257 q 338 111 322 158 l 343 111 q 372 207 358 157 q 400 301 386 257 l 521 675 l 632 675 l 378 -56 q 338 -149 360 -106 q 285 -223 315 -192 q 215 -272 254 -254 q 125 -290 176 -290 m 121 833 l 279 1028 l 393 1028 l 551 833 l 503 789 l 339 946 l 333 946 l 169 789 l 121 833 z \"},\"ÿ\":{\"ha\":649,\"x_min\":17,\"x_max\":632,\"o\":\"m 125 -290 q 82 -287 101 -290 q 46 -276 63 -283 l 68 -186 q 93 -192 79 -189 q 119 -196 107 -196 q 215 -155 178 -196 q 272 -51 251 -114 l 288 -1 l 17 675 l 135 675 l 272 301 q 305 208 288 257 q 338 111 322 158 l 343 111 q 372 207 358 157 q 400 301 386 257 l 521 675 l 632 675 l 378 -56 q 338 -149 360 -106 q 285 -223 315 -192 q 215 -272 254 -254 q 125 -290 176 -290 m 203 815 q 153 835 172 815 q 133 885 133 856 q 153 934 133 914 q 203 954 172 954 q 251 934 232 954 q 271 885 271 914 q 251 835 271 856 q 203 815 232 815 m 469 815 q 421 835 440 815 q 401 885 401 856 q 421 934 401 914 q 469 954 440 954 q 519 934 500 954 q 539 885 539 914 q 519 835 539 856 q 469 815 500 815 z \"},\"ẏ\":{\"ha\":649,\"x_min\":17,\"x_max\":632,\"o\":\"m 125 -290 q 82 -287 101 -290 q 46 -276 63 -283 l 68 -186 q 93 -192 79 -189 q 119 -196 107 -196 q 215 -155 178 -196 q 272 -51 251 -114 l 288 -1 l 17 675 l 135 675 l 272 301 q 305 208 288 257 q 338 111 322 158 l 343 111 q 372 207 358 157 q 400 301 386 257 l 521 675 l 632 675 l 378 -56 q 338 -149 360 -106 q 285 -223 315 -192 q 215 -272 254 -254 q 125 -290 176 -290 m 336 814 q 283 835 304 814 q 261 889 261 856 q 283 942 261 921 q 336 964 304 964 q 390 942 368 964 q 411 889 411 921 q 390 835 411 856 q 336 814 368 814 z \"},\"ỵ\":{\"ha\":649,\"x_min\":17,\"x_max\":632,\"o\":\"m 125 -290 q 82 -287 101 -290 q 46 -276 63 -283 l 68 -186 q 93 -192 79 -189 q 119 -196 107 -196 q 215 -155 178 -196 q 272 -51 251 -114 l 288 -1 l 17 675 l 135 675 l 272 301 q 305 208 288 257 q 338 111 322 158 l 343 111 q 372 207 358 157 q 400 301 386 257 l 521 675 l 632 675 l 378 -56 q 338 -149 360 -106 q 285 -223 315 -192 q 215 -272 254 -254 q 125 -290 176 -290 m 543 -279 q 490 -258 511 -279 q 468 -204 468 -237 q 490 -151 468 -172 q 543 -129 511 -129 q 597 -151 575 -129 q 618 -204 618 -172 q 597 -258 618 -237 q 543 -279 575 -279 z \"},\"ỷ\":{\"ha\":649,\"x_min\":17,\"x_max\":632,\"o\":\"m 125 -290 q 82 -287 101 -290 q 46 -276 63 -283 l 68 -186 q 93 -192 79 -189 q 119 -196 107 -196 q 215 -155 178 -196 q 272 -51 251 -114 l 288 -1 l 17 675 l 135 675 l 272 301 q 305 208 288 257 q 338 111 322 158 l 343 111 q 372 207 358 157 q 400 301 386 257 l 521 675 l 632 675 l 378 -56 q 338 -149 360 -106 q 285 -223 315 -192 q 215 -272 254 -254 q 125 -290 176 -290 m 292 794 l 279 850 q 335 873 313 858 q 357 915 357 888 q 242 981 357 975 l 249 1056 q 396 1020 344 1053 q 447 925 447 988 q 434 873 447 894 q 399 835 421 851 q 350 810 378 819 q 292 794 322 800 z \"},\"ỹ\":{\"ha\":649,\"x_min\":17,\"x_max\":632,\"o\":\"m 125 -290 q 82 -287 101 -290 q 46 -276 63 -283 l 68 -186 q 93 -192 79 -189 q 119 -196 107 -196 q 215 -155 178 -196 q 272 -51 251 -114 l 288 -1 l 17 675 l 135 675 l 272 301 q 305 208 288 257 q 338 111 322 158 l 343 111 q 372 207 358 157 q 400 301 386 257 l 521 675 l 632 675 l 378 -56 q 338 -149 360 -106 q 285 -223 315 -192 q 215 -272 254 -254 q 125 -290 176 -290 m 436 801 q 372 819 399 801 q 324 860 346 838 q 281 900 301 882 q 238 918 261 918 q 190 888 206 918 q 172 808 175 857 l 96 813 q 106 888 97 853 q 132 947 115 922 q 174 987 149 972 q 236 1001 200 1001 q 300 983 274 1001 q 349 943 326 965 q 391 903 371 921 q 436 885 411 885 q 482 915 467 885 q 500 994 497 946 l 576 989 q 566 915 575 949 q 540 856 557 881 q 498 816 524 831 q 436 801 472 801 z \"},\"ź\":{\"ha\":590,\"x_min\":43,\"x_max\":554,\"o\":\"m 43 0 l 43 61 l 399 582 l 82 582 l 82 675 l 543 675 l 543 614 l 188 93 l 554 93 l 554 0 l 43 0 m 297 796 l 239 853 l 435 1085 l 515 1008 l 297 796 z \"},\"ž\":{\"ha\":590,\"x_min\":43,\"x_max\":554,\"o\":\"m 43 0 l 43 61 l 399 582 l 82 582 l 82 675 l 543 675 l 543 614 l 188 93 l 554 93 l 554 0 l 43 0 m 260 797 l 101 992 l 150 1036 l 314 879 l 319 879 l 483 1036 l 532 992 l 374 797 l 260 797 z \"},\"ż\":{\"ha\":590,\"x_min\":43,\"x_max\":554,\"o\":\"m 43 0 l 43 61 l 399 582 l 82 582 l 82 675 l 543 675 l 543 614 l 188 93 l 554 93 l 554 0 l 43 0 m 317 814 q 263 835 285 814 q 242 889 242 856 q 263 942 242 921 q 317 964 285 964 q 370 942 349 964 q 392 889 392 921 q 370 835 392 856 q 317 814 349 814 z \"},\"ẓ\":{\"ha\":590,\"x_min\":43,\"x_max\":554,\"o\":\"m 43 0 l 43 61 l 399 582 l 82 582 l 82 675 l 543 675 l 543 614 l 188 93 l 554 93 l 554 0 l 43 0 m 317 -285 q 263 -264 285 -285 q 242 -210 242 -243 q 263 -156 242 -178 q 317 -135 285 -135 q 370 -156 349 -135 q 392 -210 392 -178 q 370 -264 392 -243 q 317 -285 349 -285 z \"},\"ẕ\":{\"ha\":590,\"x_min\":43,\"x_max\":554,\"o\":\"m 43 0 l 43 61 l 399 582 l 82 582 l 82 675 l 543 675 l 543 614 l 188 93 l 554 93 l 554 0 l 43 0 m 132 -235 l 132 -156 l 501 -156 l 501 -235 l 132 -235 z \"},\"ð\":{\"ha\":757,\"x_min\":74,\"x_max\":674,\"o\":\"m 374 -17 q 261 6 315 -17 q 165 70 207 28 q 99 173 124 113 q 74 308 74 233 q 96 437 74 379 q 156 535 118 494 q 247 599 194 576 q 360 621 299 621 q 461 599 413 621 q 546 529 510 576 q 488 679 526 615 q 397 796 450 743 l 201 694 l 168 751 l 344 842 q 189 942 272 897 l 242 1014 q 340 956 292 986 q 433 888 389 925 l 631 989 l 664 932 l 485 840 q 621 639 568 756 q 674 357 674 522 q 652 205 674 274 q 591 87 631 136 q 497 10 551 38 q 374 -17 442 -17 m 376 78 q 458 98 424 78 q 517 154 493 118 q 552 241 540 190 q 564 353 564 292 q 563 392 564 372 q 561 429 563 411 q 469 511 515 490 q 376 532 424 532 q 294 515 331 532 q 233 468 258 499 q 195 397 208 438 q 182 308 182 356 q 197 213 182 256 q 240 141 213 171 q 301 94 267 111 q 376 78 336 78 z \"},\"þ\":{\"ha\":771,\"x_min\":114,\"x_max\":704,\"o\":\"m 114 -285 l 114 989 l 228 989 l 228 719 l 226 604 q 324 666 271 640 q 432 692 376 692 q 549 667 499 692 q 635 598 600 643 q 687 490 669 553 q 704 347 704 426 q 681 194 704 261 q 617 79 657 126 q 524 8 576 32 q 413 -17 471 -17 q 318 3 364 -17 q 226 58 272 22 l 228 -57 l 228 -285 l 114 -285 m 393 79 q 470 98 435 79 q 531 151 506 117 q 572 235 557 185 q 586 347 586 285 q 576 449 586 403 q 545 527 567 494 q 490 578 524 560 q 408 596 456 596 q 322 572 365 596 q 228 504 278 549 l 228 150 q 317 95 274 111 q 393 79 360 79 z \"},\"ŋ\":{\"ha\":760,\"x_min\":114,\"x_max\":654,\"o\":\"m 469 -254 q 413 -249 438 -254 q 371 -236 388 -243 l 393 -149 q 422 -157 406 -153 q 457 -161 439 -161 q 524 -126 507 -161 q 540 -28 540 -90 l 540 413 q 510 551 540 508 q 413 593 479 593 q 319 567 360 593 q 228 489 279 540 l 228 0 l 114 0 l 114 675 l 208 675 l 218 578 l 222 578 q 324 659 271 626 q 449 692 378 692 q 605 625 556 692 q 654 428 654 558 l 654 -29 q 613 -193 654 -132 q 469 -254 571 -254 z \"},\"ȷ\":{\"ha\":343,\"x_min\":-56,\"x_max\":229,\"o\":\"m 44 -301 q -12 -296 13 -301 q -56 -283 -37 -290 l -32 -197 q -3 -205 -19 -201 q 32 -208 14 -208 q 99 -174 82 -208 q 115 -76 115 -139 l 115 675 l 229 675 l 229 -76 q 188 -240 229 -179 q 44 -301 146 -301 z \"},\"ĳ\":{\"ha\":685,\"x_min\":93,\"x_max\":593,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 0 l 114 0 m 172 814 q 116 835 139 814 q 93 888 93 856 q 116 941 93 921 q 172 961 139 961 q 228 941 206 961 q 251 888 251 921 q 228 835 251 856 q 172 814 206 814 m 386 -301 q 329 -296 354 -301 q 286 -283 304 -290 l 310 -197 q 339 -205 322 -201 q 374 -208 356 -208 q 440 -174 424 -208 q 457 -76 457 -139 l 457 675 l 571 675 l 571 -76 q 529 -240 571 -179 q 386 -301 488 -301 m 515 814 q 459 835 482 814 q 436 888 436 856 q 459 941 436 921 q 515 961 482 961 q 570 941 547 961 q 593 888 593 921 q 570 835 593 856 q 515 814 547 814 z \"},\"ɐ\":{\"ha\":711,\"x_min\":104,\"x_max\":633,\"o\":\"m 375 -17 q 251 4 303 -17 q 167 63 200 25 q 119 153 135 100 q 104 272 104 207 l 104 675 l 199 675 l 208 581 l 211 581 q 322 661 260 631 q 451 692 383 692 q 582 647 531 692 q 633 515 633 601 q 534 335 633 400 q 218 247 435 271 q 226 186 218 217 q 254 132 235 156 q 307 93 274 108 q 390 78 340 78 q 495 100 447 78 q 582 150 543 122 l 626 71 q 517 12 582 40 q 375 -17 451 -17 m 218 322 q 361 350 303 333 q 455 388 419 367 q 506 438 490 410 q 521 500 521 467 q 490 576 521 553 q 414 600 458 600 q 319 575 367 600 q 218 494 271 550 l 218 322 z \"},\"ɒ\":{\"ha\":771,\"x_min\":114,\"x_max\":704,\"o\":\"m 413 -17 q 219 65 318 -17 l 215 65 l 207 0 l 114 0 l 114 675 l 208 675 l 218 596 l 222 596 q 323 664 268 636 q 438 692 378 692 q 553 667 503 692 q 636 598 603 643 q 687 490 669 553 q 704 347 704 426 q 681 194 704 261 q 617 79 657 126 q 524 8 576 32 q 413 -17 471 -17 m 393 79 q 470 98 435 79 q 531 151 506 117 q 572 235 557 185 q 586 347 586 285 q 576 449 586 403 q 545 527 567 494 q 490 578 524 560 q 408 596 456 596 q 322 572 365 596 q 228 504 278 549 l 228 150 q 317 95 274 111 q 393 79 360 79 z \"},\"ɓ\":{\"ha\":771,\"x_min\":114,\"x_max\":704,\"o\":\"m 413 -17 q 315 5 365 -17 q 219 67 264 26 l 215 67 l 206 0 l 114 0 l 114 746 q 128 851 114 804 q 172 933 143 899 q 245 987 201 968 q 349 1006 289 1006 q 409 999 379 1006 q 463 983 439 993 l 436 896 q 360 913 399 913 q 262 868 293 913 q 228 744 231 824 l 225 588 q 325 655 271 628 q 436 682 379 682 q 551 658 501 682 q 635 590 601 633 q 687 483 669 546 q 704 343 704 419 q 681 190 704 257 q 617 78 657 124 q 524 8 576 32 q 413 -17 471 -17 m 393 79 q 470 97 435 79 q 531 149 506 115 q 572 232 557 183 q 586 342 586 281 q 545 519 586 451 q 408 586 504 586 q 228 493 325 586 l 228 150 q 316 95 272 111 q 393 79 360 79 z \"},\"ɔ\":{\"ha\":633,\"x_min\":35,\"x_max\":569,\"o\":\"m 253 -17 q 135 6 190 -17 q 35 69 79 29 l 83 146 q 156 98 115 118 q 242 78 196 78 q 326 97 288 78 q 392 149 364 115 q 436 231 421 183 q 451 336 451 278 q 436 443 451 394 q 394 526 421 492 q 331 578 368 560 q 253 597 294 597 q 170 581 204 597 q 106 538 136 565 l 47 613 q 137 668 85 644 q 265 692 189 692 q 381 668 325 692 q 478 599 436 644 q 544 488 519 554 q 569 336 569 422 q 544 187 569 253 q 477 76 519 121 q 377 7 435 31 q 253 -17 319 -17 z \"},\"ɕ\":{\"ha\":633,\"x_min\":64,\"x_max\":603,\"o\":\"m 394 75 q 477 96 444 75 q 510 149 510 117 q 492 192 510 172 q 438 211 475 211 q 359 185 400 211 q 279 111 318 158 q 394 75 331 75 m 171 -96 l 79 -57 q 113 19 94 -17 q 150 86 131 54 q 87 194 110 131 q 64 336 64 257 q 90 487 64 421 q 161 599 117 553 q 265 668 206 644 q 389 692 324 692 q 503 668 456 692 q 586 613 550 644 l 531 542 q 467 585 501 568 q 393 601 433 601 q 306 582 346 601 q 238 528 267 563 q 192 444 208 493 q 176 336 176 396 q 188 249 176 289 q 218 176 199 208 q 328 263 271 233 q 444 293 386 293 q 561 253 519 293 q 603 150 603 214 q 588 85 603 115 q 547 33 574 56 q 480 -3 519 10 q 392 -17 440 -17 q 224 28 297 -17 q 171 -96 192 -31 z \"},\"ɖ\":{\"ha\":771,\"x_min\":65,\"x_max\":799,\"o\":\"m 714 -254 q 586 -203 626 -254 q 546 -64 546 -153 l 547 78 q 455 10 506 38 q 344 -17 404 -17 q 141 75 217 -17 q 65 336 65 167 q 90 484 65 418 q 154 596 114 550 q 247 667 194 642 q 358 692 300 692 q 460 671 417 692 q 547 614 503 650 l 542 729 l 542 1006 l 657 1006 l 657 -39 q 672 -129 657 -97 q 726 -161 686 -161 q 753 -157 740 -161 q 776 -149 765 -153 l 799 -236 q 762 -249 783 -243 q 714 -254 740 -254 m 369 79 q 458 102 417 79 q 542 172 500 125 l 542 525 q 459 580 499 564 q 378 596 419 596 q 302 577 338 596 q 240 524 267 558 q 199 443 214 490 q 183 338 183 396 q 232 147 183 215 q 369 79 281 79 z \"},\"ɗ\":{\"ha\":771,\"x_min\":65,\"x_max\":804,\"o\":\"m 344 -17 q 141 75 217 -17 q 65 336 65 167 q 90 484 65 418 q 154 596 114 550 q 247 667 194 642 q 358 692 300 692 q 460 671 417 692 q 547 614 503 650 l 546 799 q 590 952 546 896 q 726 1008 633 1008 q 769 1005 750 1008 q 804 994 789 1001 l 782 907 q 762 913 772 910 q 739 915 751 915 q 675 881 693 915 q 657 788 657 846 l 657 0 l 563 0 l 553 79 l 549 79 q 456 12 508 40 q 344 -17 404 -17 m 369 79 q 458 102 417 79 q 542 172 500 125 l 542 525 q 459 580 499 564 q 378 596 419 596 q 302 577 338 596 q 240 524 267 558 q 199 443 214 490 q 183 338 183 396 q 232 147 183 215 q 369 79 281 79 z \"},\"ɘ\":{\"ha\":689,\"x_min\":51,\"x_max\":625,\"o\":\"m 307 -17 q 181 4 238 -17 q 79 53 124 25 l 119 128 q 201 90 157 104 q 293 75 244 75 q 449 138 393 75 q 511 310 506 201 l 57 310 q 53 340 54 322 q 51 375 51 357 q 72 506 51 447 q 128 606 92 564 q 217 669 165 647 q 335 692 269 692 q 449 667 396 692 q 541 597 501 643 q 603 485 581 551 q 625 336 625 419 q 601 188 625 253 q 535 77 578 122 q 433 8 492 32 q 307 -17 375 -17 m 153 392 l 513 392 q 456 547 503 492 q 332 601 408 601 q 203 548 253 601 q 153 392 153 494 z \"},\"ɑ\":{\"ha\":771,\"x_min\":65,\"x_max\":657,\"o\":\"m 344 -17 q 141 75 217 -17 q 65 336 65 167 q 90 484 65 418 q 155 596 114 550 q 249 667 196 642 q 360 692 301 692 q 461 671 417 692 q 551 610 506 650 l 554 610 l 564 675 l 657 675 l 657 0 l 563 0 l 553 79 l 549 79 q 456 12 508 40 q 344 -17 404 -17 m 369 79 q 458 102 417 79 q 542 172 500 125 l 542 525 q 459 580 499 564 q 378 596 419 596 q 302 577 338 596 q 240 524 267 558 q 199 443 214 490 q 183 338 183 396 q 232 147 183 215 q 369 79 281 79 z \"},\"ʙ\":{\"ha\":706,\"x_min\":114,\"x_max\":651,\"o\":\"m 114 0 l 114 675 l 374 675 q 475 665 429 675 q 553 635 521 656 q 604 583 586 615 q 622 504 622 550 q 592 411 622 447 q 510 360 563 375 l 510 356 q 565 336 539 349 q 610 304 590 324 q 640 257 629 285 q 651 193 651 229 q 631 107 651 143 q 576 47 611 71 q 492 11 540 22 q 385 0 443 0 l 114 0 m 226 392 l 354 392 q 475 419 439 392 q 511 493 511 446 q 476 567 511 540 q 363 593 442 593 l 226 593 l 226 392 m 226 82 l 372 82 q 497 113 456 82 q 538 200 538 143 q 494 281 538 251 q 365 310 451 310 l 226 310 l 226 82 z \"},\"ə\":{\"ha\":689,\"x_min\":51,\"x_max\":625,\"o\":\"m 331 -17 q 215 6 267 -17 q 127 70 164 28 q 71 173 90 113 q 51 308 51 233 q 53 345 51 328 q 57 375 54 363 l 511 375 q 453 539 506 476 q 310 601 401 601 q 217 585 258 601 q 135 543 175 569 l 94 622 q 199 673 142 654 q 328 692 257 692 q 446 668 392 692 q 540 599 500 644 q 602 488 579 553 q 625 339 625 422 q 602 190 625 256 q 540 78 579 124 q 446 8 500 32 q 331 -17 392 -17 m 328 75 q 455 132 407 75 q 513 293 503 189 l 153 293 q 200 129 153 183 q 328 75 247 75 z \"},\"ɚ\":{\"ha\":900,\"x_min\":51,\"x_max\":928,\"o\":\"m 346 -17 q 224 7 276 -17 q 135 70 172 31 q 78 163 99 110 q 51 274 57 215 l 500 457 q 426 566 476 531 q 310 601 376 601 q 217 585 257 601 q 138 543 176 569 l 96 622 q 198 673 143 654 q 322 692 253 692 q 492 641 421 692 q 599 497 564 590 l 711 543 l 772 519 q 781 455 775 479 q 796 417 788 431 q 815 398 804 403 q 842 393 826 393 q 872 399 858 393 q 897 414 886 406 l 928 354 q 888 331 911 342 q 836 319 865 319 q 795 326 815 319 q 757 348 775 332 q 724 390 739 364 q 703 453 710 415 l 619 419 q 624 377 622 399 q 626 332 626 356 q 606 197 626 260 q 550 86 586 133 q 462 11 514 39 q 346 -17 410 -17 m 343 74 q 416 93 383 74 q 472 147 449 113 q 506 226 494 181 q 518 322 518 271 q 517 351 518 338 q 515 376 517 364 l 157 231 q 221 115 171 156 q 343 74 271 74 z \"},\"ɛ\":{\"ha\":611,\"x_min\":69,\"x_max\":582,\"o\":\"m 346 -17 q 238 -3 289 -17 q 150 38 188 11 q 91 101 113 64 q 69 186 69 139 q 82 251 69 222 q 115 300 94 279 q 163 334 136 321 q 219 356 190 347 l 219 361 q 135 422 164 381 q 106 510 106 463 q 126 590 106 556 q 179 647 146 625 q 257 681 213 669 q 351 692 301 692 q 462 674 413 692 q 556 625 511 657 l 510 549 q 435 587 472 572 q 354 601 399 601 q 258 575 297 601 q 219 496 219 549 q 257 421 219 450 q 376 392 294 392 l 453 392 l 453 310 l 356 310 q 228 281 272 310 q 183 196 183 251 q 232 107 183 139 q 358 75 281 75 q 447 90 404 75 q 533 136 489 104 l 582 60 q 469 1 524 18 q 346 -17 415 -17 z \"},\"ɜ\":{\"ha\":633,\"x_min\":51,\"x_max\":564,\"o\":\"m 292 -17 q 167 1 222 -17 q 51 60 111 18 l 100 136 q 188 90 146 104 q 275 75 229 75 q 401 107 353 75 q 450 196 450 139 q 406 281 450 251 q 278 310 361 310 l 182 310 l 182 392 l 257 392 q 376 421 339 392 q 414 496 414 450 q 378 575 414 549 q 285 601 342 601 q 201 587 240 601 q 124 549 161 572 l 78 625 q 177 674 124 657 q 293 692 231 692 q 383 681 340 692 q 458 647 426 669 q 509 590 490 625 q 528 510 528 556 q 499 422 528 463 q 414 361 469 381 l 414 356 q 470 334 443 347 q 518 300 497 321 q 551 251 539 279 q 564 186 564 222 q 542 101 564 139 q 484 38 521 64 q 398 -3 447 11 q 292 -17 349 -17 z \"},\"ɞ\":{\"ha\":758,\"x_min\":69,\"x_max\":696,\"o\":\"m 360 -17 q 245 -3 299 -17 q 153 38 192 11 q 92 101 114 64 q 69 186 69 139 q 82 251 69 222 q 115 300 94 279 q 163 334 136 321 q 219 356 190 347 l 219 361 q 135 422 164 381 q 106 510 106 463 q 125 590 106 556 q 178 647 144 625 q 258 681 213 669 q 356 692 303 692 q 487 669 425 692 q 595 603 549 647 q 669 492 642 558 q 696 336 696 425 q 669 183 696 249 q 598 72 643 117 q 492 6 553 28 q 360 -17 431 -17 m 361 75 q 519 142 461 75 q 578 336 578 208 q 518 533 578 465 q 357 601 458 601 q 259 575 299 601 q 219 496 219 549 q 256 421 219 450 q 371 392 292 392 l 408 392 l 408 310 l 350 310 q 226 281 269 310 q 183 196 183 251 q 231 107 183 139 q 361 75 279 75 z \"},\"ɟ\":{\"ha\":375,\"x_min\":-40,\"x_max\":360,\"o\":\"m 60 -301 q 3 -296 28 -301 q -40 -283 -22 -290 l -17 -197 q 13 -205 -4 -201 q 47 -208 29 -208 q 114 -174 97 -208 q 131 -76 131 -139 l 131 321 l 11 321 l 11 381 l 131 388 l 131 675 l 244 675 l 244 388 l 360 388 l 360 321 l 244 321 l 244 -76 q 203 -240 244 -179 q 60 -301 161 -301 z \"},\"ɠ\":{\"ha\":776,\"x_min\":69,\"x_max\":807,\"o\":\"m 360 -300 q 234 -281 297 -300 q 118 -226 171 -262 l 160 -146 q 260 -194 210 -179 q 360 -208 311 -208 q 498 -160 453 -208 q 546 -31 543 -112 l 547 97 q 458 33 508 60 q 347 7 407 7 q 232 31 283 7 q 144 98 181 54 q 89 205 108 142 q 69 347 69 268 q 94 490 69 426 q 158 599 118 554 q 252 667 199 643 q 363 692 306 692 q 463 671 421 692 q 549 614 504 650 l 547 671 q 591 818 547 763 q 729 874 635 874 q 772 870 753 874 q 807 860 792 867 l 785 772 q 742 781 765 781 q 678 746 696 781 q 660 653 660 711 l 660 -33 q 582 -230 660 -160 q 360 -300 504 -300 m 372 101 q 460 124 419 101 q 546 194 501 147 l 546 525 q 462 580 501 564 q 381 596 422 596 q 305 578 340 596 q 243 526 269 560 q 201 448 217 493 q 186 349 186 403 q 235 168 186 235 q 372 101 283 101 z \"},\"ɡ\":{\"ha\":776,\"x_min\":69,\"x_max\":660,\"o\":\"m 360 -300 q 234 -281 297 -300 q 118 -226 171 -262 l 160 -146 q 260 -194 210 -179 q 360 -208 311 -208 q 498 -160 453 -208 q 546 -31 543 -112 l 547 97 q 458 33 508 60 q 347 7 407 7 q 232 31 283 7 q 144 98 181 54 q 89 205 108 142 q 69 347 69 268 q 94 490 69 426 q 158 599 118 554 q 252 667 199 643 q 363 692 306 692 q 465 672 421 692 q 551 613 508 651 l 554 613 l 564 675 l 660 675 l 660 -33 q 582 -230 660 -160 q 360 -300 504 -300 m 372 101 q 460 124 419 101 q 546 194 501 147 l 546 525 q 462 580 501 564 q 381 596 422 596 q 305 578 340 596 q 243 526 269 560 q 201 448 217 493 q 186 349 186 403 q 235 168 186 235 q 372 101 283 101 z \"},\"ɢ\":{\"ha\":690,\"x_min\":64,\"x_max\":622,\"o\":\"m 389 -17 q 261 6 321 -17 q 158 74 201 29 q 89 186 114 119 q 64 339 64 253 q 90 486 64 421 q 160 597 115 551 q 266 667 206 643 q 396 692 326 692 q 525 666 475 692 q 611 608 575 640 l 556 538 q 491 582 526 563 q 401 601 456 601 q 315 584 356 601 q 244 533 274 567 q 197 450 214 499 q 179 339 179 401 q 239 144 179 214 q 399 75 299 75 q 468 86 436 75 q 521 117 500 97 l 521 282 l 371 282 l 371 364 l 622 364 l 622 68 q 524 8 585 32 q 389 -17 464 -17 z \"},\"ɣ\":{\"ha\":649,\"x_min\":17,\"x_max\":632,\"o\":\"m 328 -311 q 213 -267 253 -311 q 174 -150 174 -222 q 194 -51 174 -101 q 251 72 215 0 l 17 675 l 135 675 l 263 315 q 294 230 278 269 q 325 146 310 190 l 331 146 q 361 230 346 190 q 392 315 376 269 l 519 675 l 632 675 l 401 74 q 434 7 419 38 q 459 -50 449 -24 q 475 -101 469 -76 q 481 -150 481 -125 q 441 -267 481 -222 q 328 -311 401 -311 m 328 -232 q 369 -211 356 -232 q 382 -158 382 -190 q 368 -77 382 -121 q 329 15 354 -33 l 324 15 q 286 -78 300 -33 q 272 -158 272 -124 q 286 -211 272 -190 q 328 -232 300 -232 z \"},\"ɤ\":{\"ha\":710,\"x_min\":22,\"x_max\":688,\"o\":\"m 356 -17 q 176 45 238 -17 q 114 215 114 107 q 160 365 114 292 q 276 504 207 439 q 201 573 240 549 q 124 597 163 597 q 58 578 85 597 l 22 661 q 75 684 43 676 q 139 692 107 692 q 251 659 196 692 q 356 571 307 626 q 459 659 404 626 q 571 692 514 692 q 635 684 603 692 q 688 661 667 676 l 651 578 q 586 597 624 597 q 508 573 546 597 q 433 504 469 549 q 549 365 501 439 q 596 215 596 292 q 535 45 596 107 q 356 -17 474 -17 m 356 78 q 454 119 422 78 q 486 218 486 160 q 448 339 486 279 q 356 450 410 399 q 263 339 300 399 q 225 218 225 279 q 257 119 225 160 q 356 78 289 78 z \"},\"ɥ\":{\"ha\":760,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -285 l 531 -43 l 538 104 q 435 17 489 50 q 311 -17 382 -17 q 153 50 203 -17 q 104 247 104 117 l 104 675 l 219 675 l 219 263 q 249 124 219 167 q 346 82 279 82 q 440 108 399 82 q 531 196 482 135 l 531 675 l 646 675 l 646 -285 l 531 -285 z \"},\"ɦ\":{\"ha\":756,\"x_min\":114,\"x_max\":654,\"o\":\"m 114 0 l 114 746 q 128 851 114 804 q 172 933 143 899 q 245 987 201 968 q 349 1006 289 1006 q 409 999 379 1006 q 463 983 439 993 l 436 896 q 360 913 399 913 q 262 868 293 913 q 228 744 231 824 l 224 569 q 325 649 272 615 q 449 682 378 682 q 605 615 556 682 q 654 418 654 549 l 654 0 l 540 0 l 540 403 q 510 540 540 499 q 413 582 479 582 q 319 556 360 582 q 228 479 279 531 l 228 0 l 114 0 z \"},\"ɧ\":{\"ha\":756,\"x_min\":114,\"x_max\":654,\"o\":\"m 469 -254 q 413 -249 438 -254 q 371 -236 388 -243 l 393 -149 q 422 -157 406 -153 q 457 -161 439 -161 q 524 -126 507 -161 q 540 -28 540 -90 l 540 403 q 510 540 540 499 q 413 582 479 582 q 319 556 360 582 q 228 479 279 531 l 228 0 l 114 0 l 114 746 q 128 851 114 804 q 172 933 143 899 q 245 987 201 968 q 349 1006 289 1006 q 409 999 379 1006 q 463 983 439 993 l 436 896 q 360 913 399 913 q 262 868 293 913 q 228 744 231 824 l 224 569 q 325 649 272 615 q 449 682 378 682 q 605 615 556 682 q 654 418 654 549 l 654 -29 q 613 -193 654 -132 q 469 -254 571 -254 z \"},\"ʜ\":{\"ha\":781,\"x_min\":115,\"x_max\":668,\"o\":\"m 115 0 l 115 675 l 229 675 l 229 401 l 554 401 l 554 675 l 668 675 l 668 0 l 554 0 l 554 300 l 229 300 l 229 0 l 115 0 z \"},\"ɨ\":{\"ha\":375,\"x_min\":11,\"x_max\":360,\"o\":\"m 11 321 l 11 381 l 131 388 l 131 675 l 244 675 l 244 388 l 360 388 l 360 321 l 244 321 l 244 0 l 131 0 l 131 321 l 11 321 m 189 814 q 133 835 156 814 q 110 888 110 856 q 133 941 110 921 q 189 961 156 961 q 245 941 222 961 q 268 888 268 921 q 245 835 268 856 q 189 814 222 814 z \"},\"ɪ\":{\"ha\":474,\"x_min\":64,\"x_max\":410,\"o\":\"m 64 0 l 64 93 l 181 93 l 181 582 l 64 582 l 64 675 l 410 675 l 410 582 l 294 582 l 294 93 l 410 93 l 410 0 l 64 0 z \"},\"ʝ\":{\"ha\":394,\"x_min\":-117,\"x_max\":425,\"o\":\"m 336 -381 q 232 -215 283 -282 q 160 -278 204 -256 q 56 -301 117 -301 q -17 -289 15 -301 q -71 -256 -49 -276 q -105 -207 -93 -235 q -117 -147 -117 -179 q -73 -47 -117 -85 q 51 -8 -29 -8 q 167 -40 107 -8 l 167 675 l 281 675 l 281 -32 q 272 -121 281 -79 q 425 -339 353 -201 l 336 -381 m 54 -211 q 120 -190 96 -211 q 156 -135 144 -168 q 50 -90 100 -90 q -5 -106 14 -90 q -24 -146 -24 -122 q -2 -192 -24 -174 q 54 -211 19 -211 m 224 814 q 167 835 190 814 q 144 888 144 856 q 167 941 144 921 q 224 961 190 961 q 280 941 257 961 q 303 888 303 921 q 280 835 303 856 q 224 814 257 814 z \"},\"ɬ\":{\"ha\":419,\"x_min\":-8,\"x_max\":411,\"o\":\"m 168 443 q 34 477 76 443 q -8 564 -8 511 q 24 642 -8 611 q 107 674 56 674 q 150 666 132 674 q 182 646 168 658 l 182 989 l 296 989 l 296 508 l 411 508 l 411 443 l 296 443 l 296 128 q 306 89 296 100 q 328 78 315 78 q 338 78 333 78 q 353 81 343 78 l 368 -6 q 342 -14 357 -11 q 303 -17 326 -17 q 210 22 238 -17 q 182 136 182 61 l 182 443 l 168 443 m 154 508 l 182 508 l 182 517 q 178 549 182 532 q 167 578 175 565 q 147 601 160 592 q 113 610 133 610 q 76 596 88 610 q 65 563 65 582 q 87 524 65 540 q 154 508 108 508 z \"},\"ɭ\":{\"ha\":354,\"x_min\":114,\"x_max\":371,\"o\":\"m 285 -254 q 152 -197 190 -254 q 114 -39 114 -139 l 114 989 l 228 989 l 228 -39 q 242 -129 228 -97 q 297 -161 257 -161 q 324 -157 313 -161 q 347 -149 336 -153 l 371 -236 q 334 -249 356 -243 q 285 -254 313 -254 z \"},\"ɮ\":{\"ha\":801,\"x_min\":114,\"x_max\":775,\"o\":\"m 489 -301 q 398 -292 439 -301 q 324 -268 357 -283 q 264 -233 290 -253 q 215 -193 238 -214 l 272 -121 q 357 -181 308 -154 q 479 -207 406 -207 q 549 -192 517 -207 q 606 -151 582 -178 q 645 -85 631 -124 q 660 0 660 -47 q 612 135 660 86 q 474 183 564 183 q 427 178 444 183 q 386 161 410 172 l 340 224 l 607 582 l 228 582 l 228 0 l 114 0 l 114 989 l 228 989 l 228 675 l 746 675 l 746 614 l 485 263 q 606 253 551 269 q 697 201 660 236 q 755 115 735 167 q 775 3 775 64 q 751 -127 775 -71 q 688 -222 728 -183 q 597 -281 649 -261 q 489 -301 544 -301 z \"},\"ʟ\":{\"ha\":571,\"x_min\":114,\"x_max\":535,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 93 l 535 93 l 535 0 l 114 0 z \"},\"ɯ\":{\"ha\":1151,\"x_min\":107,\"x_max\":1039,\"o\":\"m 313 -17 q 158 50 208 -17 q 107 247 107 117 l 107 675 l 221 675 l 221 263 q 251 124 221 167 q 347 82 282 82 q 515 186 424 82 l 515 675 l 631 675 l 631 263 q 660 124 631 167 q 756 82 690 82 q 925 186 831 82 l 925 675 l 1039 675 l 1039 0 l 944 0 l 935 97 l 932 97 q 835 17 888 50 q 721 -17 782 -17 q 599 18 643 -17 q 535 113 556 53 q 428 19 482 54 q 313 -17 375 -17 z \"},\"ɰ\":{\"ha\":1151,\"x_min\":107,\"x_max\":1039,\"o\":\"m 925 -285 l 925 -44 l 931 99 q 831 15 882 46 q 721 -17 779 -17 q 599 18 643 -17 q 535 113 556 53 q 428 19 482 54 q 313 -17 375 -17 q 158 50 208 -17 q 107 247 107 117 l 107 675 l 221 675 l 221 263 q 251 124 221 167 q 347 82 282 82 q 515 186 424 82 l 515 675 l 631 675 l 631 263 q 660 124 631 167 q 756 82 690 82 q 925 186 831 82 l 925 675 l 1039 675 l 1039 -285 l 925 -285 z \"},\"ɱ\":{\"ha\":1151,\"x_min\":114,\"x_max\":1046,\"o\":\"m 867 -254 q 813 -249 838 -254 q 772 -236 789 -243 l 794 -149 q 822 -157 806 -153 q 854 -161 838 -161 q 917 -126 903 -161 q 932 -28 932 -90 l 932 413 q 901 551 932 508 q 807 593 871 593 q 638 489 731 593 l 638 0 l 524 0 l 524 413 q 493 551 524 508 q 397 593 463 593 q 228 489 321 593 l 228 0 l 114 0 l 114 675 l 208 675 l 218 578 l 222 578 q 319 659 267 626 q 432 692 371 692 q 553 658 510 692 q 618 563 597 624 q 724 656 671 621 q 840 692 778 692 q 995 625 944 692 q 1046 428 1046 558 l 1046 -29 q 1005 -193 1046 -132 q 867 -254 964 -254 z \"},\"ɲ\":{\"ha\":760,\"x_min\":-28,\"x_max\":654,\"o\":\"m 57 -254 q 8 -249 31 -254 q -28 -236 -14 -243 l -6 -149 q 17 -157 6 -153 q 44 -161 29 -161 q 99 -129 85 -161 q 114 -39 114 -97 l 114 675 l 211 675 l 218 578 l 222 578 q 324 659 271 626 q 449 692 378 692 q 605 625 556 692 q 654 428 654 558 l 654 0 l 540 0 l 540 413 q 510 551 540 508 q 413 593 479 593 q 319 567 360 593 q 228 489 279 540 l 228 -39 q 190 -197 228 -139 q 57 -254 151 -254 z \"},\"ɳ\":{\"ha\":760,\"x_min\":114,\"x_max\":796,\"o\":\"m 711 -254 q 578 -197 617 -254 q 540 -39 540 -139 l 540 413 q 510 551 540 508 q 413 593 479 593 q 319 567 360 593 q 228 489 279 540 l 228 0 l 114 0 l 114 675 l 208 675 l 218 578 l 222 578 q 324 659 271 626 q 449 692 378 692 q 605 625 556 692 q 654 428 654 558 l 654 -39 q 669 -129 654 -97 q 724 -161 683 -161 q 751 -157 739 -161 q 774 -149 763 -153 l 796 -236 q 760 -249 782 -243 q 711 -254 738 -254 z \"},\"ɴ\":{\"ha\":754,\"x_min\":114,\"x_max\":640,\"o\":\"m 114 0 l 114 675 l 222 675 l 457 293 q 497 221 476 261 q 538 149 518 181 l 543 149 q 535 278 539 215 q 532 394 532 340 l 532 675 l 640 675 l 640 0 l 533 0 l 296 382 q 256 453 276 413 q 217 526 235 494 l 211 526 q 219 397 215 460 q 222 281 222 335 l 222 0 l 114 0 z \"},\"ɵ\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 376 -17 q 257 6 314 -17 q 157 72 200 28 q 89 183 114 117 q 64 336 64 249 q 89 490 64 424 q 157 602 114 557 q 257 669 200 647 q 376 692 314 692 q 496 669 439 692 q 596 602 553 647 q 664 490 639 557 q 689 336 689 424 q 664 183 689 249 q 596 72 639 117 q 496 6 553 28 q 376 -17 439 -17 m 376 603 q 242 547 296 603 q 175 392 188 492 l 579 392 q 513 547 567 492 q 376 603 458 603 m 376 74 q 519 135 464 74 q 581 310 574 197 l 174 310 q 235 135 181 197 q 376 74 290 74 z \"},\"ɶ\":{\"ha\":971,\"x_min\":64,\"x_max\":943,\"o\":\"m 399 -17 q 269 6 329 -17 q 163 74 208 29 q 90 184 117 118 q 64 338 64 250 q 90 491 64 425 q 163 601 117 557 q 269 669 208 646 q 399 692 329 692 q 466 689 433 692 q 540 675 499 686 l 929 675 l 929 588 l 611 588 l 611 392 l 878 392 l 878 310 l 611 310 l 611 88 l 943 88 l 943 0 l 540 0 q 467 -14 500 -11 q 399 -17 433 -17 m 406 76 q 451 81 426 76 q 497 93 475 86 l 497 581 q 451 592 475 588 q 406 597 426 597 q 319 581 360 597 q 248 533 278 565 q 201 451 218 500 q 183 338 183 403 q 201 222 183 271 q 248 140 218 172 q 319 92 278 108 q 406 76 360 76 z \"},\"ɸ\":{\"ha\":944,\"x_min\":64,\"x_max\":881,\"o\":\"m 182 339 q 201 230 182 278 q 251 149 219 182 q 327 96 283 115 q 419 75 371 76 l 419 600 q 327 579 371 597 q 251 528 283 561 q 201 447 219 494 q 182 339 182 399 m 763 339 q 697 528 763 460 q 525 600 631 596 l 525 75 q 618 96 575 76 q 693 149 661 115 q 744 230 725 182 q 763 339 763 278 m 419 -285 l 419 -12 q 286 13 350 -11 q 173 83 222 38 q 94 192 124 128 q 64 339 64 256 q 94 485 64 421 q 173 593 124 549 q 286 661 222 638 q 419 688 350 685 l 419 989 l 525 989 l 525 688 q 660 661 596 685 q 773 593 724 638 q 851 485 822 549 q 881 339 881 421 q 851 192 881 256 q 772 83 821 128 q 658 13 722 38 q 525 -12 593 -11 l 525 -285 l 419 -285 z \"},\"ɹ\":{\"ha\":482,\"x_min\":-4,\"x_max\":368,\"o\":\"m 68 -17 q -4 -3 28 -17 l 18 97 q 50 89 36 92 q 83 86 64 86 q 173 121 126 86 q 254 242 219 156 l 254 675 l 368 675 l 368 0 l 274 0 l 264 124 l 261 124 q 176 21 225 58 q 68 -17 126 -17 z \"},\"ɺ\":{\"ha\":482,\"x_min\":-4,\"x_max\":368,\"o\":\"m 68 -17 q -4 -3 28 -17 l 18 97 q 50 89 36 92 q 83 86 64 86 q 173 121 126 86 q 254 242 219 156 l 254 989 l 368 989 l 368 0 l 274 0 l 264 124 l 261 124 q 176 21 225 58 q 68 -17 126 -17 z \"},\"ɻ\":{\"ha\":482,\"x_min\":-4,\"x_max\":511,\"o\":\"m 425 -254 q 301 -201 338 -254 q 264 -53 264 -149 l 264 124 l 261 124 q 176 21 225 58 q 68 -17 126 -17 q -4 -3 28 -17 l 18 97 q 50 89 36 92 q 83 86 64 86 q 173 121 126 86 q 254 242 219 156 l 254 675 l 368 675 l 368 -39 q 383 -129 368 -97 q 438 -161 397 -161 q 465 -157 453 -161 q 488 -149 476 -153 l 511 -236 q 474 -249 496 -243 q 425 -254 451 -254 z \"},\"ɽ\":{\"ha\":482,\"x_min\":114,\"x_max\":486,\"o\":\"m 285 -254 q 152 -197 190 -254 q 114 -39 114 -139 l 114 675 l 208 675 l 218 553 l 222 553 q 306 654 257 617 q 414 692 356 692 q 486 678 454 692 l 464 578 q 433 586 447 583 q 399 589 419 589 q 309 554 356 589 q 228 433 263 519 l 228 -39 q 242 -129 228 -97 q 297 -161 257 -161 q 324 -157 313 -161 q 347 -149 336 -153 l 371 -236 q 334 -249 356 -243 q 285 -254 313 -254 z \"},\"ɾ\":{\"ha\":464,\"x_min\":114,\"x_max\":467,\"o\":\"m 114 0 l 114 436 q 176 624 114 556 q 349 692 238 692 q 467 672 421 692 l 446 576 q 405 589 422 586 q 360 592 388 592 q 310 581 335 592 q 268 547 286 569 q 239 491 250 525 q 228 413 228 457 l 228 0 l 114 0 z \"},\"ʀ\":{\"ha\":688,\"x_min\":114,\"x_max\":643,\"o\":\"m 114 0 l 114 675 l 353 675 q 454 665 407 675 q 535 631 501 654 q 589 569 569 607 q 608 475 608 531 q 566 347 608 394 q 461 281 524 300 l 643 0 l 517 0 l 354 267 l 228 267 l 228 0 l 114 0 m 228 350 l 333 350 q 452 381 410 350 q 494 472 494 413 q 452 559 494 532 q 333 586 410 586 l 228 586 l 228 350 z \"},\"ʁ\":{\"ha\":688,\"x_min\":44,\"x_max\":574,\"o\":\"m 335 0 q 233 10 281 0 q 152 45 186 21 q 99 108 118 69 q 79 201 79 146 q 122 331 79 283 q 226 397 164 378 l 44 675 l 172 675 l 333 413 l 460 413 l 460 675 l 574 675 l 574 0 l 335 0 m 354 89 l 460 89 l 460 329 l 354 329 q 237 297 279 329 q 194 204 194 264 q 237 117 194 144 q 354 89 279 89 z \"},\"ʂ\":{\"ha\":582,\"x_min\":39,\"x_max\":538,\"o\":\"m 290 -17 q 142 11 213 -17 l 142 -28 q 158 -126 142 -90 q 226 -162 175 -162 q 260 -159 244 -162 q 290 -151 276 -156 l 313 -236 q 270 -249 294 -243 q 214 -254 246 -254 q 79 -193 119 -254 q 39 -29 39 -132 l 39 67 l 96 142 q 187 91 140 110 q 294 72 233 72 q 394 103 361 72 q 428 178 428 133 q 414 224 428 204 q 378 258 400 243 q 329 283 357 272 q 274 306 301 294 q 201 334 238 318 q 137 373 165 350 q 90 426 108 396 q 72 500 72 457 q 88 576 72 540 q 134 637 104 611 q 207 677 164 663 q 304 692 250 692 q 422 669 368 692 q 514 615 475 647 l 460 543 q 388 586 425 569 q 306 603 350 603 q 212 574 242 603 q 182 506 182 544 q 194 465 182 482 q 228 434 207 447 q 276 410 249 421 q 332 389 303 400 q 405 360 368 375 q 471 322 442 344 q 519 265 500 299 q 538 185 538 232 q 522 107 538 143 q 474 43 506 71 q 397 -1 443 15 q 290 -17 350 -17 z \"},\"ʃ\":{\"ha\":343,\"x_min\":-56,\"x_max\":399,\"o\":\"m 44 -301 q -12 -296 13 -301 q -56 -283 -37 -290 l -32 -197 q -3 -205 -19 -201 q 32 -208 14 -208 q 99 -174 82 -208 q 115 -76 115 -139 l 115 783 q 160 948 115 888 q 314 1008 206 1008 q 363 1003 342 1008 q 399 990 383 997 l 376 903 q 353 911 365 907 q 326 915 342 915 q 249 880 268 915 q 229 782 229 844 l 229 -76 q 188 -240 229 -179 q 44 -301 146 -301 z \"},\"ʄ\":{\"ha\":375,\"x_min\":-40,\"x_max\":414,\"o\":\"m 60 -301 q 3 -296 28 -301 q -40 -283 -22 -290 l -17 -197 q 13 -205 -4 -201 q 47 -208 29 -208 q 114 -174 97 -208 q 131 -76 131 -139 l 131 321 l 11 321 l 11 381 l 131 388 l 131 783 q 176 948 131 888 q 329 1008 221 1008 q 378 1003 357 1008 q 414 990 399 997 l 392 903 q 369 911 381 907 q 342 915 357 915 q 264 880 283 915 q 244 782 244 844 l 244 388 l 360 388 l 360 321 l 244 321 l 244 -76 q 203 -240 244 -179 q 60 -301 161 -301 z \"},\"ʈ\":{\"ha\":469,\"x_min\":33,\"x_max\":451,\"o\":\"m 326 -256 q 235 -240 272 -256 q 176 -194 199 -224 q 143 -122 153 -164 q 133 -31 133 -81 l 133 582 l 33 582 l 33 668 l 139 675 l 153 864 l 249 864 l 249 675 l 431 675 l 431 582 l 249 582 l 249 -32 q 272 -128 249 -94 q 353 -162 294 -162 q 392 -157 371 -162 q 429 -144 413 -151 l 451 -231 q 391 -248 424 -240 q 326 -256 358 -256 z \"},\"ʉ\":{\"ha\":799,\"x_min\":11,\"x_max\":782,\"o\":\"m 11 364 l 11 424 l 131 431 l 131 675 l 246 675 l 246 431 l 554 431 l 554 675 l 668 675 l 668 431 l 782 431 l 782 364 l 668 364 l 668 0 l 574 0 l 564 106 l 560 106 q 460 17 513 50 q 338 -17 408 -17 q 180 50 229 -17 q 131 247 131 117 l 131 364 l 11 364 m 372 82 q 465 109 425 82 q 554 196 506 136 l 554 364 l 246 364 l 246 263 q 276 124 246 167 q 372 82 306 82 z \"},\"ʊ\":{\"ha\":751,\"x_min\":51,\"x_max\":700,\"o\":\"m 376 -17 q 245 9 303 -17 q 148 78 188 35 q 88 176 108 121 q 68 290 68 232 q 78 385 68 342 q 106 465 89 429 q 144 530 122 501 q 188 579 165 558 l 188 582 l 51 582 l 51 675 l 310 675 l 310 601 q 218 485 253 554 q 183 315 183 415 q 196 224 183 267 q 232 149 208 181 q 292 97 256 117 q 376 78 328 78 q 460 97 424 78 q 519 149 496 117 q 556 224 543 181 q 568 315 568 267 q 533 485 568 415 q 443 601 499 554 l 443 675 l 700 675 l 700 582 l 564 582 l 564 579 q 608 530 586 558 q 647 465 629 501 q 674 385 664 429 q 685 290 685 342 q 664 176 685 232 q 603 78 643 121 q 507 9 564 35 q 376 -17 450 -17 z \"},\"ʋ\":{\"ha\":736,\"x_min\":104,\"x_max\":667,\"o\":\"m 364 -17 q 260 1 307 -17 q 178 55 213 18 q 124 147 143 92 q 104 281 104 203 l 104 675 l 219 675 l 219 290 q 231 193 219 233 q 263 127 243 153 q 309 90 282 101 q 368 78 336 78 q 445 101 411 78 q 502 165 479 124 q 537 260 525 206 q 549 381 549 315 q 522 544 549 489 q 439 600 496 600 q 400 592 421 600 l 382 681 q 463 692 414 692 q 612 620 557 692 q 667 397 667 549 q 647 233 667 308 q 590 101 628 157 q 495 15 551 46 q 364 -17 439 -17 z \"},\"ʌ\":{\"ha\":649,\"x_min\":17,\"x_max\":632,\"o\":\"m 17 0 l 256 675 l 389 675 l 632 0 l 514 0 l 386 383 q 355 484 371 433 q 324 583 339 535 l 318 583 q 287 484 303 535 q 256 383 271 433 l 129 0 l 17 0 z \"},\"ʍ\":{\"ha\":997,\"x_min\":33,\"x_max\":964,\"o\":\"m 33 0 l 214 675 l 354 675 l 451 313 q 474 217 463 264 q 497 118 485 169 l 503 118 q 524 217 514 169 q 549 314 535 265 l 643 675 l 776 675 l 964 0 l 847 0 l 747 390 q 727 485 736 439 q 707 578 718 531 l 701 578 q 656 390 681 483 l 551 0 l 440 0 l 335 390 q 311 485 322 439 q 288 578 300 531 l 282 578 q 261 485 271 531 q 240 390 251 439 l 142 0 l 33 0 z \"},\"ʎ\":{\"ha\":649,\"x_min\":17,\"x_max\":632,\"o\":\"m 17 0 l 286 771 q 326 864 304 821 q 379 938 349 907 q 449 988 410 969 q 539 1006 488 1006 q 582 1002 563 1006 q 618 992 601 999 l 596 901 q 571 908 585 904 q 544 911 557 911 q 449 870 486 911 q 392 767 413 829 l 361 676 l 632 0 l 515 0 l 376 374 q 344 467 361 418 q 311 564 328 517 l 306 564 q 276 468 290 518 q 249 374 263 418 l 129 0 l 17 0 z \"},\"ʏ\":{\"ha\":576,\"x_min\":-1,\"x_max\":578,\"o\":\"m 232 0 l 232 228 l -1 675 l 121 675 l 213 483 q 249 406 231 443 q 288 328 268 368 l 293 328 q 330 406 313 368 q 365 483 347 443 l 457 675 l 578 675 l 346 228 l 346 0 l 232 0 z \"},\"ʐ\":{\"ha\":590,\"x_min\":43,\"x_max\":683,\"o\":\"m 599 -254 q 466 -198 506 -254 q 426 -50 426 -142 l 426 0 l 43 0 l 43 61 l 399 582 l 82 582 l 82 675 l 543 675 l 543 614 l 188 93 l 540 93 l 540 -39 q 556 -129 540 -97 q 611 -161 571 -161 q 638 -157 625 -161 q 661 -149 650 -153 l 683 -236 q 647 -249 668 -243 q 599 -254 625 -254 z \"},\"ʑ\":{\"ha\":624,\"x_min\":43,\"x_max\":643,\"o\":\"m 331 -112 l 264 -99 q 289 0 275 -44 l 43 0 l 43 61 l 399 582 l 82 582 l 82 675 l 536 675 l 536 614 l 182 93 q 250 91 217 92 q 318 89 283 90 q 406 241 357 188 q 517 294 456 294 q 610 262 576 294 q 643 167 643 229 q 630 102 643 132 q 590 49 617 72 q 524 13 564 26 q 428 0 483 0 l 357 0 q 344 -53 350 -25 q 331 -112 338 -81 m 457 88 q 542 113 513 88 q 571 169 571 138 q 558 209 571 193 q 514 225 544 225 q 449 192 482 225 q 388 88 417 158 l 457 88 z \"},\"ʒ\":{\"ha\":590,\"x_min\":4,\"x_max\":564,\"o\":\"m 278 -301 q 187 -292 228 -301 q 113 -268 146 -283 q 53 -233 79 -253 q 4 -193 26 -214 l 61 -121 q 146 -181 97 -154 q 268 -207 194 -207 q 338 -192 306 -207 q 395 -151 371 -178 q 434 -85 419 -124 q 449 0 449 -47 q 401 135 449 86 q 263 183 353 183 q 216 178 233 183 q 175 161 199 172 l 129 224 l 396 582 l 61 582 l 61 675 l 535 675 l 535 614 l 274 263 q 394 253 340 269 q 486 201 449 236 q 544 115 524 167 q 564 3 564 64 q 540 -127 564 -71 q 477 -222 517 -183 q 385 -281 438 -261 q 278 -301 333 -301 z \"},\"ʔ\":{\"ha\":579,\"x_min\":-3,\"x_max\":551,\"o\":\"m 203 0 l 203 450 q 380 584 324 519 q 436 736 436 649 q 390 864 436 817 q 261 911 344 911 q 142 881 190 911 q 58 810 93 850 l -3 885 q 45 929 18 907 q 106 968 72 951 q 180 995 139 985 q 269 1006 221 1006 q 379 989 328 1006 q 469 939 431 972 q 529 856 507 906 q 551 739 551 806 q 534 632 551 679 q 485 544 517 585 q 411 468 454 503 q 317 399 368 433 l 317 0 l 203 0 z \"},\"ʕ\":{\"ha\":615,\"x_min\":43,\"x_max\":597,\"o\":\"m 278 0 l 278 399 q 183 468 226 433 q 109 544 140 503 q 60 632 78 585 q 43 739 43 679 q 66 856 43 806 q 129 939 89 906 q 224 989 169 972 q 339 1006 278 1006 q 424 995 385 1006 q 494 968 463 985 q 551 929 526 951 q 597 885 576 907 l 536 810 q 458 880 504 849 q 347 911 413 911 q 208 864 257 911 q 158 736 158 817 q 215 584 158 649 q 392 450 271 519 l 392 0 l 278 0 z \"},\"ʡ\":{\"ha\":613,\"x_min\":10,\"x_max\":586,\"o\":\"m 219 0 l 219 357 l 10 357 l 10 443 l 115 450 l 239 450 q 403 590 351 521 q 456 736 456 658 q 410 864 456 817 q 282 911 365 911 q 163 881 211 911 q 79 810 114 850 l 18 885 q 66 929 39 907 q 126 968 93 951 q 200 995 160 985 q 290 1006 240 1006 q 400 989 349 1006 q 490 939 451 972 q 550 856 528 906 q 572 739 572 806 q 519 579 572 650 q 386 450 467 508 l 586 450 l 586 357 l 333 357 l 333 0 l 219 0 z \"},\"ʢ\":{\"ha\":613,\"x_min\":26,\"x_max\":603,\"o\":\"m 278 0 l 278 357 l 26 357 l 26 450 l 226 450 q 93 579 146 508 q 40 739 40 650 q 63 856 40 806 q 126 939 86 906 q 220 989 167 972 q 336 1006 274 1006 q 421 995 382 1006 q 491 968 460 985 q 548 929 522 951 q 594 885 574 907 l 533 810 q 456 880 501 849 q 344 911 410 911 q 205 864 254 911 q 156 736 156 817 q 208 590 156 658 q 374 450 261 521 l 497 450 l 603 443 l 603 357 l 392 357 l 392 0 l 278 0 z \"},\"ǂ\":{\"ha\":400,\"x_min\":8,\"x_max\":390,\"o\":\"m 8 460 l 8 519 l 115 525 l 167 525 l 167 1042 l 247 1042 l 247 525 l 390 525 l 390 460 l 247 460 l 247 289 l 390 289 l 390 224 l 247 224 l 247 -347 l 167 -347 l 167 224 l 8 224 l 8 282 l 115 289 l 167 289 l 167 460 l 8 460 z \"},\"ʘ\":{\"ha\":729,\"x_min\":82,\"x_max\":647,\"o\":\"m 365 -17 q 248 14 300 -17 q 159 108 196 44 q 102 268 122 171 q 82 499 82 365 q 158 877 82 749 q 365 1006 235 1006 q 571 876 494 1006 q 647 499 647 746 q 627 268 647 365 q 571 108 607 171 q 482 14 535 44 q 365 -17 429 -17 m 365 78 q 433 100 401 78 q 489 172 465 122 q 526 302 513 222 q 539 499 539 382 q 526 682 539 604 q 489 811 513 760 q 433 887 465 863 q 365 911 401 911 q 296 887 328 911 q 240 811 264 863 q 203 682 217 760 q 190 499 190 604 q 203 302 190 382 q 240 172 217 222 q 296 100 264 122 q 365 78 328 78 m 365 433 q 318 452 338 433 q 299 499 299 471 q 318 546 299 528 q 365 564 338 564 q 411 546 392 564 q 431 499 431 528 q 411 452 431 471 q 365 433 392 433 z \"},\"ﬀ\":{\"ha\":801,\"x_min\":42,\"x_max\":839,\"o\":\"m 529 0 l 529 582 l 247 582 l 247 0 l 133 0 l 133 582 l 42 582 l 42 668 l 133 675 l 133 764 q 185 931 133 869 q 343 992 238 992 q 409 985 376 992 q 467 967 442 978 l 443 881 q 353 899 401 899 q 275 863 303 899 q 247 761 247 828 l 247 675 l 529 675 l 529 782 q 577 946 529 886 q 726 1006 625 1006 q 787 999 758 1006 q 839 983 815 993 l 814 896 q 738 913 776 913 q 643 782 643 913 l 643 675 l 786 675 l 786 582 l 643 582 l 643 0 l 529 0 z \"},\"ﬃ\":{\"ha\":1143,\"x_min\":42,\"x_max\":1053,\"o\":\"m 529 0 l 529 582 l 247 582 l 247 0 l 133 0 l 133 582 l 42 582 l 42 668 l 133 675 l 133 764 q 185 931 133 869 q 343 992 238 992 q 409 985 376 992 q 467 967 442 978 l 443 881 q 353 899 401 899 q 275 863 303 899 q 247 761 247 828 l 247 675 l 529 675 l 529 782 q 577 946 529 886 q 726 1006 625 1006 q 787 999 758 1006 q 839 983 815 993 l 814 896 q 738 913 776 913 q 643 782 643 913 l 643 675 l 786 675 l 786 582 l 643 582 l 643 0 l 529 0 m 915 0 l 915 675 l 1029 675 l 1029 0 l 915 0 m 974 814 q 917 835 940 814 q 894 888 894 856 q 917 941 894 921 q 974 961 940 961 q 1030 941 1007 961 q 1053 888 1053 921 q 1030 835 1053 856 q 974 814 1007 814 z \"},\"ﬄ\":{\"ha\":1156,\"x_min\":42,\"x_max\":1101,\"o\":\"m 529 0 l 529 582 l 247 582 l 247 0 l 133 0 l 133 582 l 42 582 l 42 668 l 133 675 l 133 764 q 185 931 133 869 q 343 992 238 992 q 409 985 376 992 q 467 967 442 978 l 443 881 q 353 899 401 899 q 275 863 303 899 q 247 761 247 828 l 247 675 l 529 675 l 529 782 q 577 946 529 886 q 726 1006 625 1006 q 787 999 758 1006 q 839 983 815 993 l 814 896 q 738 913 776 913 q 643 782 643 913 l 643 675 l 786 675 l 786 582 l 643 582 l 643 0 l 529 0 m 1036 -17 q 943 22 971 -17 q 915 136 915 61 l 915 989 l 1029 989 l 1029 128 q 1039 89 1029 100 q 1061 78 1049 78 q 1072 78 1067 78 q 1086 81 1076 78 l 1101 -6 q 1075 -14 1090 -11 q 1036 -17 1060 -17 z \"},\"Α\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 z \"},\"Β\":{\"ha\":817,\"x_min\":125,\"x_max\":761,\"o\":\"m 125 0 l 125 911 l 396 911 q 523 899 465 911 q 622 860 581 886 q 685 791 663 833 q 708 689 708 749 q 674 566 708 621 q 575 490 640 511 l 575 485 q 710 415 658 469 q 761 267 761 361 q 736 150 761 200 q 665 67 711 100 q 556 17 619 33 q 415 0 492 0 l 125 0 m 240 524 l 375 524 q 543 564 492 524 q 594 674 594 604 q 541 786 594 753 q 381 819 488 819 l 240 819 l 240 524 m 240 92 l 399 92 q 582 135 517 92 q 647 271 647 179 q 583 395 647 356 q 399 435 519 435 l 240 435 l 240 92 z \"},\"Γ\":{\"ha\":692,\"x_min\":125,\"x_max\":650,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 0 l 125 0 z \"},\"Δ\":{\"ha\":817,\"x_min\":42,\"x_max\":775,\"o\":\"m 42 0 l 42 69 l 342 911 l 475 911 l 775 69 l 775 0 l 42 0 m 167 99 l 647 99 l 506 515 l 410 807 l 404 807 l 308 515 l 167 99 z \"},\"Ε\":{\"ha\":732,\"x_min\":125,\"x_max\":664,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 z \"},\"Ζ\":{\"ha\":749,\"x_min\":63,\"x_max\":690,\"o\":\"m 63 0 l 63 69 l 542 814 l 106 814 l 106 911 l 686 911 l 686 843 l 206 99 l 690 99 l 690 0 l 63 0 z \"},\"Η\":{\"ha\":906,\"x_min\":125,\"x_max\":781,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 529 l 664 529 l 664 911 l 781 911 l 781 0 l 664 0 l 664 429 l 240 429 l 240 0 l 125 0 z \"},\"Θ\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 306 429 l 306 529 l 617 529 l 617 429 l 306 429 m 461 -17 q 303 17 375 -17 q 181 112 232 50 q 101 262 129 174 q 72 460 72 350 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 823 262 851 350 q 742 112 794 174 q 619 17 690 50 q 461 -17 547 -17 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 z \"},\"Ι\":{\"ha\":365,\"x_min\":125,\"x_max\":240,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 0 l 125 0 z \"},\"Κ\":{\"ha\":804,\"x_min\":125,\"x_max\":799,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 454 l 244 454 l 624 911 l 754 911 l 469 564 l 799 0 l 669 0 l 397 474 l 240 289 l 240 0 l 125 0 z \"},\"Λ\":{\"ha\":715,\"x_min\":0,\"x_max\":715,\"o\":\"m 0 0 l 290 911 l 424 911 l 715 0 l 593 0 l 446 493 q 403 644 422 574 q 357 794 383 714 l 351 794 q 307 644 326 714 q 264 493 288 574 l 118 0 l 0 0 z \"},\"Μ\":{\"ha\":1010,\"x_min\":125,\"x_max\":885,\"o\":\"m 125 0 l 125 911 l 264 911 l 439 425 q 472 330 456 378 q 504 235 488 282 l 510 235 q 541 330 526 282 q 572 425 556 378 l 744 911 l 885 911 l 885 0 l 776 0 l 776 501 q 782 636 776 563 q 792 771 788 710 l 786 771 l 714 564 l 542 92 l 465 92 l 293 564 l 221 771 l 215 771 q 224 636 219 710 q 229 501 229 563 l 229 0 l 125 0 z \"},\"Ν\":{\"ha\":899,\"x_min\":125,\"x_max\":774,\"o\":\"m 125 0 l 125 911 l 244 911 l 574 339 l 672 150 l 678 150 q 669 294 674 219 q 664 440 664 368 l 664 911 l 774 911 l 774 0 l 654 0 l 324 574 l 225 761 l 219 761 q 230 620 225 692 q 235 476 235 549 l 235 0 l 125 0 z \"},\"Ξ\":{\"ha\":740,\"x_min\":68,\"x_max\":672,\"o\":\"m 68 0 l 68 99 l 672 99 l 672 0 l 68 0 m 172 429 l 172 528 l 568 528 l 568 429 l 172 429 m 82 814 l 82 911 l 658 911 l 658 814 l 82 814 z \"},\"Ο\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 17 375 -17 q 181 112 232 50 q 101 262 129 174 q 72 460 72 350 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 823 262 851 350 q 742 112 794 174 q 619 17 690 50 q 461 -17 547 -17 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 z \"},\"Π\":{\"ha\":896,\"x_min\":125,\"x_max\":771,\"o\":\"m 125 0 l 125 911 l 771 911 l 771 0 l 656 0 l 656 814 l 240 814 l 240 0 l 125 0 z \"},\"Ρ\":{\"ha\":786,\"x_min\":125,\"x_max\":726,\"o\":\"m 125 0 l 125 911 l 385 911 q 524 897 461 911 q 632 852 588 883 q 701 769 676 821 q 726 643 726 718 q 702 518 726 571 q 633 431 678 465 q 527 378 589 396 q 390 361 465 361 l 240 361 l 240 0 l 125 0 m 240 456 l 376 456 q 553 501 496 456 q 611 643 611 546 q 551 780 611 742 q 371 818 490 818 l 240 818 l 240 456 z \"},\"Σ\":{\"ha\":747,\"x_min\":61,\"x_max\":696,\"o\":\"m 61 0 l 61 69 l 375 463 l 67 843 l 67 911 l 654 911 l 654 814 l 213 814 l 492 465 l 208 99 l 696 99 l 696 0 l 61 0 z \"},\"Τ\":{\"ha\":744,\"x_min\":39,\"x_max\":706,\"o\":\"m 314 0 l 314 814 l 39 814 l 39 911 l 706 911 l 706 814 l 431 814 l 431 0 l 314 0 z \"},\"Υ\":{\"ha\":661,\"x_min\":-1,\"x_max\":663,\"o\":\"m 272 0 l 272 353 l -1 911 l 122 911 l 240 654 q 283 556 263 604 q 328 456 304 507 l 333 456 q 381 556 357 507 q 425 654 404 604 l 542 911 l 663 911 l 389 353 l 389 0 l 272 0 z \"},\"Φ\":{\"ha\":999,\"x_min\":67,\"x_max\":932,\"o\":\"m 819 460 q 747 647 819 576 q 551 724 675 717 l 551 189 q 663 214 613 193 q 747 270 713 235 q 801 353 782 306 q 819 460 819 401 m 179 460 q 198 353 179 401 q 251 270 217 306 q 336 214 286 235 q 447 189 386 193 l 447 724 q 251 647 324 717 q 179 460 179 576 m 447 -31 l 447 99 q 291 129 361 103 q 171 202 221 156 q 94 313 121 249 q 67 460 67 378 q 94 604 67 540 q 171 713 121 668 q 291 784 221 758 q 447 814 361 810 l 447 942 l 551 942 l 551 814 q 708 784 638 810 q 828 713 778 758 q 905 604 878 668 q 932 460 932 540 q 905 313 932 378 q 828 202 878 249 q 708 129 778 156 q 551 99 638 103 l 551 -31 l 447 -31 z \"},\"Χ\":{\"ha\":713,\"x_min\":21,\"x_max\":692,\"o\":\"m 21 0 l 286 471 l 39 911 l 167 911 l 290 678 q 324 616 308 646 q 361 546 340 586 l 367 546 q 401 616 386 586 q 432 678 415 646 l 553 911 l 675 911 l 426 465 l 692 0 l 564 0 l 431 246 q 394 315 413 279 q 353 392 375 350 l 347 392 q 310 315 328 350 q 275 246 292 279 l 143 0 l 21 0 z \"},\"Ψ\":{\"ha\":971,\"x_min\":88,\"x_max\":883,\"o\":\"m 431 0 l 431 340 q 178 430 269 347 q 88 688 88 513 l 88 911 l 201 911 l 201 693 q 259 500 201 561 q 431 433 317 439 l 431 911 l 540 911 l 540 433 q 711 501 654 440 q 768 693 768 561 l 768 911 l 883 911 l 883 688 q 860 536 883 600 q 792 430 836 472 q 684 366 747 388 q 540 340 621 344 l 540 0 l 431 0 z \"},\"Ω\":{\"ha\":942,\"x_min\":63,\"x_max\":879,\"o\":\"m 63 0 l 63 94 l 244 94 l 244 100 q 186 167 215 129 q 134 254 157 206 q 97 360 111 303 q 82 488 82 418 q 110 664 82 583 q 188 803 138 744 q 310 895 239 863 q 471 928 382 928 q 631 895 560 928 q 754 803 703 863 q 833 664 806 744 q 861 488 861 583 q 847 360 861 418 q 809 254 832 303 q 756 167 786 206 q 697 100 726 129 l 697 94 l 879 94 l 879 0 l 556 0 l 556 85 q 628 154 594 115 q 688 242 663 193 q 727 349 713 290 q 742 481 742 408 q 723 617 742 554 q 669 727 704 681 q 585 800 635 774 q 471 826 535 826 q 357 800 407 826 q 272 727 307 774 q 219 617 238 681 q 201 481 201 554 q 215 349 201 408 q 254 242 229 290 q 313 154 279 193 q 386 85 347 115 l 386 0 l 63 0 z \"},\"Ά\":{\"ha\":786,\"x_min\":8,\"x_max\":782,\"o\":\"m 313 510 l 269 371 l 543 371 l 500 510 q 453 662 475 586 q 408 817 431 738 l 403 817 q 360 662 382 738 q 313 510 338 586 m 35 0 l 343 911 l 474 911 l 782 0 l 658 0 l 572 278 l 240 278 l 153 0 l 35 0 m 8 660 l 49 931 l 154 915 l 85 644 l 8 660 z \"},\"Έ\":{\"ha\":821,\"x_min\":-26,\"x_max\":753,\"o\":\"m 214 0 l 214 911 l 739 911 l 739 814 l 329 814 l 329 528 l 675 528 l 675 429 l 329 429 l 329 99 l 753 99 l 753 0 l 214 0 m -26 660 l 14 931 l 119 915 l 50 644 l -26 660 z \"},\"Ή\":{\"ha\":994,\"x_min\":-26,\"x_max\":869,\"o\":\"m 214 0 l 214 911 l 329 911 l 329 529 l 753 529 l 753 911 l 869 911 l 869 0 l 753 0 l 753 429 l 329 429 l 329 0 l 214 0 m -26 660 l 14 931 l 119 915 l 50 644 l -26 660 z \"},\"Ί\":{\"ha\":454,\"x_min\":-26,\"x_max\":329,\"o\":\"m 214 0 l 214 911 l 329 911 l 329 0 l 214 0 m -26 660 l 14 931 l 119 915 l 50 644 l -26 660 z \"},\"Ϊ\":{\"ha\":365,\"x_min\":-29,\"x_max\":393,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 0 l 125 0 m 39 993 q -10 1013 10 993 q -29 1061 -29 1032 q -10 1110 -29 1092 q 39 1129 10 1129 q 88 1110 69 1129 q 107 1061 107 1092 q 88 1013 107 1032 q 39 993 69 993 m 325 993 q 276 1013 294 993 q 257 1061 257 1032 q 276 1110 257 1092 q 325 1129 294 1129 q 374 1110 354 1129 q 393 1061 393 1092 q 374 1013 393 1032 q 325 993 354 993 z \"},\"Ό\":{\"ha\":988,\"x_min\":-26,\"x_max\":917,\"o\":\"m 526 -17 q 369 17 440 -17 q 246 112 297 50 q 166 262 194 174 q 138 460 138 350 q 166 656 138 569 q 246 803 194 743 q 369 896 297 864 q 526 928 440 928 q 684 895 613 928 q 808 802 756 863 q 888 655 860 742 q 917 460 917 568 q 888 262 917 350 q 808 112 860 174 q 684 17 756 50 q 526 -17 613 -17 m 526 85 q 637 111 588 85 q 722 187 686 138 q 776 305 757 236 q 796 460 796 374 q 776 613 796 544 q 722 728 757 681 q 637 801 686 775 q 526 826 588 826 q 416 801 465 826 q 331 728 367 775 q 276 613 296 681 q 257 460 257 544 q 276 305 257 374 q 331 187 296 236 q 416 111 367 138 q 526 85 465 85 m -26 660 l 14 931 l 119 915 l 50 644 l -26 660 z \"},\"Ύ\":{\"ha\":833,\"x_min\":-26,\"x_max\":835,\"o\":\"m 444 0 l 444 353 l 171 911 l 294 911 l 413 654 q 456 556 435 604 q 500 456 476 507 l 506 456 q 553 556 529 507 q 597 654 576 604 l 714 911 l 835 911 l 561 353 l 561 0 l 444 0 m -26 660 l 14 931 l 119 915 l 50 644 l -26 660 z \"},\"Ϋ\":{\"ha\":661,\"x_min\":-1,\"x_max\":663,\"o\":\"m 272 0 l 272 353 l -1 911 l 122 911 l 240 654 q 283 556 263 604 q 328 456 304 507 l 333 456 q 381 556 357 507 q 425 654 404 604 l 542 911 l 663 911 l 389 353 l 389 0 l 272 0 m 188 993 q 139 1013 158 993 q 119 1061 119 1032 q 139 1110 119 1092 q 188 1129 158 1129 q 237 1110 218 1129 q 256 1061 256 1092 q 237 1013 256 1032 q 188 993 218 993 m 474 993 q 424 1013 443 993 q 406 1061 406 1032 q 424 1110 406 1092 q 474 1129 443 1129 q 522 1110 503 1129 q 542 1061 542 1092 q 522 1013 542 1032 q 474 993 503 993 z \"},\"Ώ\":{\"ha\":1004,\"x_min\":-31,\"x_max\":944,\"o\":\"m 128 0 l 128 94 l 310 94 l 310 100 q 251 167 281 129 q 199 254 222 206 q 162 360 176 303 q 147 488 147 418 q 175 664 147 583 q 253 803 203 744 q 376 895 304 863 q 536 928 447 928 q 697 895 625 928 q 819 803 768 863 q 899 664 871 744 q 926 488 926 583 q 912 360 926 418 q 874 254 897 303 q 822 167 851 206 q 763 100 792 129 l 763 94 l 944 94 l 944 0 l 621 0 l 621 85 q 694 154 660 115 q 753 242 728 193 q 792 349 778 290 q 807 481 807 408 q 788 617 807 554 q 735 727 769 681 q 650 800 700 774 q 536 826 600 826 q 422 800 472 826 q 338 727 372 774 q 285 617 303 681 q 267 481 267 554 q 281 349 267 408 q 319 242 294 290 q 378 154 344 193 q 451 85 413 115 l 451 0 l 128 0 m -31 660 l 10 931 l 115 915 l 46 644 l -31 660 z \"},\"α\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 z \"},\"β\":{\"ha\":785,\"x_min\":110,\"x_max\":724,\"o\":\"m 110 -249 l 110 682 q 126 811 110 751 q 178 914 143 871 q 265 981 213 957 q 388 1006 317 1006 q 483 991 438 1006 q 565 947 529 976 q 621 872 600 917 q 642 765 642 826 q 607 633 642 690 q 508 535 572 575 l 508 529 q 666 445 608 515 q 724 268 724 375 q 701 147 724 200 q 642 58 679 94 q 558 2 606 21 q 460 -17 511 -17 q 333 6 396 -17 q 218 86 271 28 q 222 -81 221 0 q 225 -249 224 -162 l 110 -249 m 433 79 q 501 92 469 79 q 558 131 533 106 q 596 192 582 156 q 610 275 610 229 q 563 410 610 356 q 421 464 515 464 q 351 456 385 464 l 333 543 q 425 576 388 554 q 486 628 463 599 q 520 690 510 657 q 531 757 531 724 q 519 825 531 796 q 489 874 508 854 q 444 903 469 893 q 390 913 418 913 q 267 850 311 913 q 222 667 224 788 q 219 426 219 544 q 218 185 218 307 q 324 101 267 122 q 433 79 381 79 z \"},\"γ\":{\"ha\":672,\"x_min\":8,\"x_max\":644,\"o\":\"m 272 -249 q 275 -208 274 -226 q 278 -170 276 -189 q 279 -130 279 -151 q 279 -81 279 -108 q 256 104 279 3 q 195 308 233 206 q 108 503 157 410 q 8 663 60 596 l 124 692 q 188 585 154 647 q 251 449 221 522 q 306 294 282 375 q 346 135 331 214 l 351 135 q 467 398 417 261 q 529 675 518 535 l 644 675 q 610 513 631 589 q 559 358 590 436 q 483 194 528 279 q 376 7 439 108 q 388 -122 385 -54 q 390 -249 390 -190 l 272 -249 z \"},\"δ\":{\"ha\":738,\"x_min\":72,\"x_max\":672,\"o\":\"m 374 -17 q 261 4 315 -17 q 165 65 207 25 q 98 161 124 104 q 72 290 72 218 q 92 402 72 351 q 147 492 113 453 q 230 560 182 532 q 332 606 278 589 q 262 659 296 632 q 202 716 228 686 q 161 780 176 746 q 146 854 146 814 q 159 912 146 885 q 199 960 172 939 q 268 993 226 981 q 367 1006 310 1006 q 657 951 490 1006 l 629 860 q 478 904 542 892 q 365 917 414 917 q 281 896 307 917 q 254 847 254 875 q 270 795 254 819 q 314 746 286 771 q 378 695 342 721 q 457 639 415 669 q 539 574 500 607 q 608 501 578 540 q 655 413 638 461 q 672 304 672 365 q 652 173 672 232 q 594 72 632 114 q 500 6 556 29 q 374 -17 444 -17 m 375 78 q 513 140 467 78 q 560 303 560 201 q 548 380 560 344 q 516 444 536 415 q 469 499 496 474 q 411 549 442 525 q 244 458 304 525 q 183 293 183 392 q 199 203 183 243 q 242 136 215 164 q 303 93 268 108 q 375 78 338 78 z \"},\"ε\":{\"ha\":622,\"x_min\":64,\"x_max\":594,\"o\":\"m 349 -17 q 234 -3 286 -17 q 144 38 182 11 q 85 101 106 64 q 64 186 64 139 q 105 299 64 260 q 204 354 146 339 l 204 360 q 124 421 151 379 q 97 510 97 463 q 118 590 97 556 q 174 647 139 625 q 256 681 210 669 q 356 692 303 692 q 472 672 417 692 q 574 618 526 653 l 528 542 q 447 586 488 571 q 358 601 406 601 q 253 575 296 601 q 211 496 211 549 q 247 421 211 450 q 365 392 283 392 q 404 392 385 392 q 450 396 424 393 l 450 307 q 394 310 419 310 q 344 310 369 310 q 178 196 178 310 q 226 107 178 139 q 361 75 274 75 q 453 90 410 75 q 546 143 497 106 l 594 67 q 476 1 533 19 q 349 -17 419 -17 z \"},\"ζ\":{\"ha\":589,\"x_min\":67,\"x_max\":578,\"o\":\"m 500 -256 l 408 -218 q 460 -149 444 -174 q 475 -96 475 -124 q 469 -69 475 -81 q 445 -48 463 -57 q 398 -30 428 -39 q 321 -11 368 -21 q 224 19 269 -1 q 143 76 178 40 q 88 169 108 113 q 67 308 67 225 q 101 471 67 386 q 189 635 135 556 q 309 785 243 715 q 439 903 375 854 q 367 903 410 903 q 279 901 325 903 q 188 899 233 900 q 110 896 143 897 l 110 989 l 568 989 l 568 896 l 561 896 q 429 781 496 850 q 308 631 363 711 q 219 468 254 551 q 185 314 185 385 q 199 213 185 254 q 239 146 213 172 q 303 104 265 119 q 388 81 340 89 q 472 59 436 71 q 532 31 508 47 q 567 -10 556 14 q 578 -69 578 -35 q 560 -149 578 -101 q 500 -256 542 -197 z \"},\"η\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 z \"},\"θ\":{\"ha\":725,\"x_min\":82,\"x_max\":643,\"o\":\"m 363 -17 q 245 14 297 -17 q 157 108 193 44 q 101 268 121 171 q 82 499 82 365 q 157 877 82 749 q 363 1006 232 1006 q 568 877 493 1006 q 643 499 643 749 q 624 268 643 365 q 568 108 604 171 q 480 14 532 44 q 363 -17 428 -17 m 363 911 q 299 890 328 911 q 247 825 269 869 q 211 710 225 781 q 194 542 197 640 l 531 542 q 514 710 528 640 q 478 825 500 781 q 426 890 456 869 q 363 911 397 911 m 363 78 q 427 97 397 78 q 479 162 457 117 q 515 280 501 207 q 531 460 528 353 l 194 460 q 210 280 196 353 q 246 162 224 207 q 298 97 268 117 q 363 78 328 78 z \"},\"ι\":{\"ha\":364,\"x_min\":114,\"x_max\":325,\"o\":\"m 243 -17 q 143 24 172 -17 q 114 140 114 65 l 114 675 l 229 675 q 224 396 226 538 q 221 132 221 254 q 268 78 221 78 q 310 86 285 78 l 325 0 q 290 -12 310 -7 q 243 -17 271 -17 z \"},\"κ\":{\"ha\":686,\"x_min\":101,\"x_max\":690,\"o\":\"m 564 -11 q 507 59 536 19 q 449 144 478 99 q 392 237 419 189 q 339 331 364 285 q 308 291 324 311 q 276 249 292 271 q 234 155 246 208 q 221 35 222 101 l 221 0 l 114 0 l 114 490 q 112 581 114 531 q 101 675 110 631 l 214 675 q 224 605 221 647 q 226 518 226 563 l 226 307 l 232 307 q 319 440 272 376 q 419 556 367 504 q 525 642 471 607 q 633 692 579 678 l 644 583 q 530 523 588 565 q 410 413 472 481 q 468 308 435 363 q 538 198 501 253 q 613 92 574 143 q 690 0 653 42 l 564 -11 z \"},\"λ\":{\"ha\":686,\"x_min\":22,\"x_max\":676,\"o\":\"m 143 -11 l 22 0 l 315 690 l 307 719 q 242 860 279 813 q 147 908 206 908 q 99 901 119 908 q 60 886 79 894 l 32 981 q 85 999 56 992 q 160 1006 114 1006 q 318 933 260 1006 q 421 714 376 860 l 676 0 l 556 0 l 369 560 l 364 560 l 143 -11 z \"},\"μ\":{\"ha\":781,\"x_min\":114,\"x_max\":743,\"o\":\"m 114 -249 l 114 675 l 228 675 l 228 263 q 256 127 228 172 q 351 82 285 82 q 396 87 374 82 q 440 106 418 92 q 485 147 463 121 q 531 214 507 172 l 531 675 l 646 675 q 640 396 643 538 q 638 132 638 254 q 651 91 638 104 q 688 78 665 78 q 728 86 704 78 l 743 0 q 709 -12 728 -7 q 663 -17 690 -17 q 576 15 604 -17 q 540 114 547 46 l 538 114 q 453 17 501 49 q 350 -14 406 -14 q 276 -1 310 -14 q 219 51 243 11 q 220 -37 219 1 q 222 -108 221 -75 q 225 -175 224 -142 q 229 -249 226 -208 l 114 -249 z \"},\"ν\":{\"ha\":658,\"x_min\":8,\"x_max\":631,\"o\":\"m 268 0 q 222 184 249 93 q 163 360 196 275 q 90 521 129 444 q 8 663 51 597 l 124 692 q 192 567 158 638 q 253 419 225 496 q 304 264 282 342 q 342 118 326 186 l 347 118 q 456 393 410 249 q 515 675 503 538 l 631 675 q 595 504 617 588 q 543 339 574 421 q 472 173 513 257 q 381 0 432 89 l 268 0 z \"},\"ξ\":{\"ha\":599,\"x_min\":39,\"x_max\":589,\"o\":\"m 510 -256 l 418 -218 q 469 -149 454 -174 q 485 -96 485 -124 q 478 -69 485 -81 q 453 -47 471 -57 q 406 -28 436 -37 q 331 -11 376 -19 q 229 17 276 -1 q 146 67 182 36 q 89 144 110 97 q 68 257 68 190 q 85 351 68 307 q 130 429 101 394 q 196 489 158 464 q 275 526 233 514 l 275 532 q 174 608 213 557 q 135 732 135 658 q 161 835 135 790 q 235 903 188 879 q 185 903 207 903 q 141 901 163 903 q 95 899 119 900 q 39 896 71 897 l 39 989 l 578 989 l 578 896 l 419 896 q 356 885 386 896 q 301 853 325 874 q 264 801 278 832 q 250 729 250 769 q 265 662 250 693 q 306 608 281 631 q 361 572 331 585 q 422 560 392 560 q 467 561 450 560 q 513 568 485 563 l 513 471 q 464 478 485 478 q 415 479 443 479 q 331 465 372 479 q 258 425 290 451 q 206 360 225 399 q 186 272 186 321 q 202 189 186 222 q 247 135 218 156 q 316 101 276 114 q 403 81 356 89 q 488 59 453 71 q 546 31 524 47 q 578 -10 568 14 q 589 -69 589 -35 q 570 -149 589 -101 q 510 -256 551 -197 z \"},\"ο\":{\"ha\":743,\"x_min\":64,\"x_max\":679,\"o\":\"m 371 -17 q 252 7 308 -17 q 154 76 196 31 q 88 186 113 121 q 64 336 64 251 q 88 488 64 421 q 154 599 113 554 q 252 668 196 644 q 371 692 308 692 q 491 668 435 692 q 589 599 547 644 q 655 488 631 554 q 679 336 679 421 q 655 186 679 251 q 589 76 631 121 q 491 7 547 31 q 371 -17 435 -17 m 371 78 q 511 148 461 78 q 561 336 561 218 q 511 526 561 454 q 371 597 461 597 q 231 526 281 597 q 182 336 182 454 q 231 148 182 218 q 371 78 281 78 z \"},\"π\":{\"ha\":814,\"x_min\":31,\"x_max\":779,\"o\":\"m 674 -17 q 560 26 593 -17 q 526 153 526 69 q 527 228 526 179 q 529 338 528 278 q 532 461 531 397 q 533 581 533 525 l 294 581 q 282 287 294 438 q 254 -7 269 136 l 139 0 q 175 293 163 143 q 188 581 188 443 l 31 581 l 31 668 l 128 675 l 779 675 l 779 581 l 644 581 q 640 458 642 524 q 636 330 638 392 q 634 219 635 268 q 633 144 633 169 q 649 93 633 108 q 697 78 665 78 q 751 86 714 78 l 767 -1 q 726 -12 749 -8 q 674 -17 703 -17 z \"},\"ρ\":{\"ha\":763,\"x_min\":108,\"x_max\":697,\"o\":\"m 108 -249 l 108 344 q 132 497 108 432 q 196 606 156 563 q 290 670 236 649 q 406 692 344 692 q 623 600 549 692 q 697 347 697 508 q 674 194 697 261 q 611 79 650 126 q 522 8 572 32 q 419 -17 472 -17 q 314 4 365 -17 q 215 79 263 25 q 218 -6 217 33 q 220 -85 219 -46 q 222 -164 221 -124 q 224 -249 224 -204 l 108 -249 m 399 79 q 469 98 436 79 q 526 151 501 117 q 565 235 551 185 q 579 347 579 285 q 569 449 579 403 q 537 527 558 494 q 482 578 515 560 q 401 596 449 596 q 331 580 364 596 q 272 533 297 564 q 233 454 247 501 q 218 343 218 407 l 218 171 q 310 97 265 114 q 399 79 354 79 z \"},\"σ\":{\"ha\":758,\"x_min\":64,\"x_max\":742,\"o\":\"m 367 -17 q 251 6 306 -17 q 154 73 196 29 q 88 182 113 117 q 64 331 64 247 q 90 484 64 419 q 158 591 115 549 q 257 654 201 633 q 372 675 313 675 l 742 675 l 742 578 q 635 585 683 582 q 528 589 586 588 l 528 583 q 626 479 590 547 q 661 315 661 411 q 638 175 661 236 q 576 71 615 114 q 483 6 536 28 q 367 -17 429 -17 m 368 78 q 441 95 407 78 q 499 144 475 113 q 536 222 522 176 q 550 325 550 268 q 538 422 550 375 q 503 503 526 468 q 447 560 481 539 q 369 581 413 581 q 235 519 289 581 q 182 331 182 457 q 196 226 182 272 q 235 146 210 179 q 294 95 260 113 q 368 78 328 78 z \"},\"τ\":{\"ha\":639,\"x_min\":36,\"x_max\":603,\"o\":\"m 400 -17 q 292 26 322 -17 q 263 153 263 69 l 263 582 l 36 582 l 36 668 l 133 675 l 603 675 l 603 582 l 375 582 q 371 358 372 468 q 369 144 369 247 q 384 93 369 108 q 426 78 399 78 q 458 81 442 78 q 492 89 475 85 l 508 1 q 460 -11 489 -6 q 400 -17 432 -17 z \"},\"υ\":{\"ha\":708,\"x_min\":83,\"x_max\":632,\"o\":\"m 346 -17 q 156 49 224 -17 q 89 250 89 115 q 92 370 89 311 q 94 490 94 429 q 92 576 94 531 q 83 675 90 622 l 194 675 q 203 601 201 639 q 206 518 206 563 q 204 455 206 489 q 201 384 203 421 q 199 311 200 347 q 197 244 197 275 q 209 167 197 199 q 242 116 221 136 q 290 87 263 96 q 347 78 317 78 q 469 140 421 78 q 517 333 517 201 q 505 492 517 411 q 461 665 493 572 l 572 692 q 617 516 601 604 q 632 338 632 428 q 611 185 632 251 q 553 74 590 119 q 463 6 515 29 q 346 -17 410 -17 z \"},\"φ\":{\"ha\":944,\"x_min\":64,\"x_max\":881,\"o\":\"m 182 339 q 201 230 182 278 q 251 149 219 182 q 327 96 283 115 q 419 75 371 76 l 419 600 q 327 579 371 597 q 251 528 283 561 q 201 447 219 494 q 182 339 182 399 m 763 339 q 697 528 763 460 q 525 600 631 596 l 525 75 q 618 96 575 76 q 693 149 661 115 q 744 230 725 182 q 763 339 763 278 m 419 -249 l 419 -12 q 286 13 350 -11 q 173 83 222 38 q 94 192 124 128 q 64 339 64 256 q 94 485 64 421 q 173 593 124 549 q 286 661 222 638 q 419 688 350 685 l 419 864 l 525 864 l 525 688 q 660 661 596 685 q 773 593 724 638 q 851 485 822 549 q 881 339 881 421 q 851 192 881 256 q 772 83 821 128 q 658 13 722 38 q 525 -12 593 -11 l 525 -249 l 419 -249 z \"},\"χ\":{\"ha\":668,\"x_min\":13,\"x_max\":678,\"o\":\"m 128 -265 l 13 -249 l 281 226 l 17 663 l 131 692 l 335 331 l 340 331 l 514 675 l 635 675 l 394 229 l 678 -236 l 567 -265 l 340 133 l 335 133 l 128 -265 z \"},\"ψ\":{\"ha\":957,\"x_min\":85,\"x_max\":879,\"o\":\"m 422 -249 l 422 -17 q 274 9 336 -15 q 173 76 213 33 q 114 178 133 118 q 94 310 94 238 l 94 490 q 93 576 94 531 q 85 675 92 622 l 196 675 q 203 601 201 639 q 204 518 204 563 q 203 459 204 490 q 203 399 203 428 q 202 344 203 369 q 201 303 201 319 q 256 138 201 200 q 422 76 310 76 l 422 864 l 529 864 l 529 76 q 702 151 642 81 q 763 365 763 221 q 760 438 763 403 q 751 509 757 474 q 734 583 744 544 q 707 665 724 621 l 818 692 q 865 532 850 607 q 879 369 879 457 q 788 88 879 188 q 529 -17 696 -12 l 529 -249 l 422 -249 z \"},\"ω\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 z \"},\"ς\":{\"ha\":600,\"x_min\":64,\"x_max\":560,\"o\":\"m 439 -250 l 347 -214 q 402 -137 383 -168 q 421 -76 421 -107 q 401 -21 421 -43 q 322 19 382 1 q 228 59 275 36 q 146 119 182 82 q 87 213 110 157 q 64 353 64 269 q 88 497 64 433 q 154 603 113 560 q 250 669 196 647 q 365 692 304 692 q 479 668 433 692 q 560 613 525 644 l 501 538 q 442 581 472 564 q 372 597 413 597 q 295 580 331 597 q 235 531 260 563 q 196 453 210 499 q 182 353 182 408 q 197 253 182 293 q 239 187 213 214 q 300 142 265 160 q 374 113 335 125 q 444 85 415 99 q 490 52 472 71 q 516 8 508 33 q 524 -51 524 -17 q 503 -140 524 -87 q 439 -250 482 -192 z \"},\"ϐ\":{\"ha\":778,\"x_min\":108,\"x_max\":717,\"o\":\"m 424 -17 q 313 1 369 -17 q 212 57 257 18 q 138 159 167 96 q 108 314 108 222 l 108 682 q 125 810 108 751 q 175 912 142 869 q 260 978 208 954 q 381 1003 311 1003 q 474 988 428 1003 q 555 944 519 974 q 612 871 590 915 q 633 765 633 826 q 595 631 633 690 q 478 535 557 572 l 478 529 q 653 445 590 518 q 717 263 717 372 q 694 145 717 197 q 631 57 671 93 q 538 2 592 21 q 424 -17 485 -17 m 219 667 q 219 585 219 622 q 218 514 218 547 q 361 555 303 531 q 456 610 419 579 q 507 677 492 640 q 522 756 522 714 q 483 872 522 835 q 388 908 443 908 q 265 848 308 908 q 219 667 222 788 m 421 83 q 551 133 500 83 q 603 269 603 183 q 592 344 603 308 q 556 406 581 379 q 495 449 532 433 q 407 465 458 465 q 342 458 385 465 q 217 426 299 450 l 217 331 q 238 208 217 256 q 290 132 258 160 q 356 94 321 104 q 421 83 392 83 z \"},\"ϑ\":{\"ha\":725,\"x_min\":92,\"x_max\":643,\"o\":\"m 201 751 q 216 665 201 707 q 267 593 231 624 q 368 549 304 563 q 531 550 432 536 q 513 719 528 650 q 472 831 497 788 q 411 892 446 874 q 335 911 376 911 q 239 867 276 911 q 201 751 201 824 m 360 -17 q 185 46 247 -17 q 122 235 122 108 q 121 331 122 294 q 111 404 119 368 l 219 404 q 228 342 228 381 q 229 249 229 304 q 240 167 229 200 q 268 115 250 135 q 311 86 286 94 q 364 78 336 78 q 428 95 399 78 q 481 157 458 113 q 516 278 503 201 q 531 474 529 354 q 318 478 403 457 q 183 543 233 500 q 113 643 133 586 q 92 753 92 700 q 110 855 92 808 q 162 935 129 901 q 238 987 194 968 q 331 1006 281 1006 q 565 879 486 1006 q 643 503 643 753 q 623 258 643 357 q 565 97 603 158 q 476 10 528 36 q 360 -17 424 -17 z \"},\"ϕ\":{\"ha\":944,\"x_min\":64,\"x_max\":881,\"o\":\"m 421 -249 l 421 -12 q 285 12 350 -11 q 172 78 221 35 q 93 187 122 122 q 64 338 64 251 q 106 532 64 442 q 213 697 149 622 l 306 631 q 252 560 275 594 q 213 489 229 525 q 189 413 197 453 q 181 325 181 372 q 199 222 181 267 q 249 144 217 176 q 324 95 281 113 q 421 75 368 78 l 421 411 q 478 623 421 554 q 626 692 536 692 q 731 668 683 692 q 811 601 778 644 q 863 494 844 557 q 881 353 881 432 q 851 200 881 267 q 773 87 822 133 q 660 15 724 40 q 525 -12 596 -11 q 528 -131 526 -72 q 531 -249 529 -190 l 421 -249 m 522 415 q 523 246 522 331 q 525 75 524 161 q 619 97 576 78 q 694 151 663 117 q 744 235 726 186 q 763 347 763 285 q 722 529 763 463 q 621 596 682 596 q 551 552 579 596 q 522 415 522 508 z \"},\"ά\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 349 790 l 408 1069 l 526 1049 l 428 775 l 349 790 z \"},\"έ\":{\"ha\":622,\"x_min\":64,\"x_max\":594,\"o\":\"m 349 -17 q 234 -3 286 -17 q 144 38 182 11 q 85 101 106 64 q 64 186 64 139 q 105 299 64 260 q 204 354 146 339 l 204 360 q 124 421 151 379 q 97 510 97 463 q 118 590 97 556 q 174 647 139 625 q 256 681 210 669 q 356 692 303 692 q 472 672 417 692 q 574 618 526 653 l 528 542 q 447 586 488 571 q 358 601 406 601 q 253 575 296 601 q 211 496 211 549 q 247 421 211 450 q 365 392 283 392 q 404 392 385 392 q 450 396 424 393 l 450 307 q 394 310 419 310 q 344 310 369 310 q 178 196 178 310 q 226 107 178 139 q 361 75 274 75 q 453 90 410 75 q 546 143 497 106 l 594 67 q 476 1 533 19 q 349 -17 419 -17 m 297 790 l 357 1069 l 475 1049 l 376 775 l 297 790 z \"},\"ή\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 357 790 l 417 1069 l 535 1049 l 436 775 l 357 790 z \"},\"ί\":{\"ha\":364,\"x_min\":114,\"x_max\":325,\"o\":\"m 243 -17 q 143 24 172 -17 q 114 140 114 65 l 114 675 l 229 675 q 224 396 226 538 q 221 132 221 254 q 268 78 221 78 q 310 86 285 78 l 325 0 q 290 -12 310 -7 q 243 -17 271 -17 m 126 790 l 186 1069 l 304 1049 l 206 775 l 126 790 z \"},\"ϊ\":{\"ha\":364,\"x_min\":-31,\"x_max\":375,\"o\":\"m 243 -17 q 143 24 172 -17 q 114 140 114 65 l 114 675 l 229 675 q 224 396 226 538 q 221 132 221 254 q 268 78 221 78 q 310 86 285 78 l 325 0 q 290 -12 310 -7 q 243 -17 271 -17 m 39 815 q -11 835 8 815 q -31 885 -31 856 q -11 934 -31 914 q 39 954 8 954 q 88 934 68 954 q 107 885 107 914 q 88 835 107 856 q 39 815 68 815 m 306 815 q 257 835 276 815 q 238 885 238 856 q 257 934 238 914 q 306 954 276 954 q 356 934 336 954 q 375 885 375 914 q 356 835 375 856 q 306 815 336 815 z \"},\"ό\":{\"ha\":743,\"x_min\":64,\"x_max\":679,\"o\":\"m 371 -17 q 252 7 308 -17 q 154 76 196 31 q 88 186 113 121 q 64 336 64 251 q 88 488 64 421 q 154 599 113 554 q 252 668 196 644 q 371 692 308 692 q 491 668 435 692 q 589 599 547 644 q 655 488 631 554 q 679 336 679 421 q 655 186 679 251 q 589 76 631 121 q 491 7 547 31 q 371 -17 435 -17 m 371 78 q 511 148 461 78 q 561 336 561 218 q 511 526 561 454 q 371 597 461 597 q 231 526 281 597 q 182 336 182 454 q 231 148 182 218 q 371 78 281 78 m 326 790 l 386 1069 l 504 1049 l 406 775 l 326 790 z \"},\"ύ\":{\"ha\":708,\"x_min\":83,\"x_max\":632,\"o\":\"m 346 -17 q 156 49 224 -17 q 89 250 89 115 q 92 370 89 311 q 94 490 94 429 q 92 576 94 531 q 83 675 90 622 l 194 675 q 203 601 201 639 q 206 518 206 563 q 204 455 206 489 q 201 384 203 421 q 199 311 200 347 q 197 244 197 275 q 209 167 197 199 q 242 116 221 136 q 290 87 263 96 q 347 78 317 78 q 469 140 421 78 q 517 333 517 201 q 505 492 517 411 q 461 665 493 572 l 572 692 q 617 516 601 604 q 632 338 632 428 q 611 185 632 251 q 553 74 590 119 q 463 6 515 29 q 346 -17 410 -17 m 293 790 l 353 1069 l 471 1049 l 372 775 l 293 790 z \"},\"ϋ\":{\"ha\":708,\"x_min\":83,\"x_max\":632,\"o\":\"m 346 -17 q 156 49 224 -17 q 89 250 89 115 q 92 370 89 311 q 94 490 94 429 q 92 576 94 531 q 83 675 90 622 l 194 675 q 203 601 201 639 q 206 518 206 563 q 204 455 206 489 q 201 384 203 421 q 199 311 200 347 q 197 244 197 275 q 209 167 197 199 q 242 116 221 136 q 290 87 263 96 q 347 78 317 78 q 469 140 421 78 q 517 333 517 201 q 505 492 517 411 q 461 665 493 572 l 572 692 q 617 516 601 604 q 632 338 632 428 q 611 185 632 251 q 553 74 590 119 q 463 6 515 29 q 346 -17 410 -17 m 206 815 q 156 835 175 815 q 136 885 136 856 q 156 934 136 914 q 206 954 175 954 q 254 934 235 954 q 274 885 274 914 q 254 835 274 856 q 206 815 235 815 m 472 815 q 424 835 443 815 q 404 885 404 856 q 424 934 404 914 q 472 954 443 954 q 522 934 503 954 q 542 885 542 914 q 522 835 542 856 q 472 815 503 815 z \"},\"ώ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 440 790 l 500 1069 l 618 1049 l 519 775 l 440 790 z \"},\"ΐ\":{\"ha\":364,\"x_min\":-43,\"x_max\":388,\"o\":\"m 243 -17 q 143 24 172 -17 q 114 140 114 65 l 114 675 l 229 675 q 224 396 226 538 q 221 132 221 254 q 268 78 221 78 q 310 86 285 78 l 325 0 q 290 -12 310 -7 q 243 -17 271 -17 m 117 796 l 179 1075 l 271 1056 l 176 782 l 117 796 m 15 826 q -26 842 -10 826 q -43 885 -43 858 q -26 927 -43 911 q 15 943 -10 943 q 56 927 39 943 q 72 885 72 911 q 56 842 72 858 q 15 826 39 826 m 329 826 q 289 842 306 826 q 272 885 272 858 q 289 927 272 911 q 329 943 306 943 q 371 927 354 943 q 388 885 388 911 q 371 842 388 858 q 329 826 354 826 z \"},\"ΰ\":{\"ha\":708,\"x_min\":83,\"x_max\":632,\"o\":\"m 346 -17 q 156 49 224 -17 q 89 250 89 115 q 92 370 89 311 q 94 490 94 429 q 92 576 94 531 q 83 675 90 622 l 194 675 q 203 601 201 639 q 206 518 206 563 q 204 455 206 489 q 201 384 203 421 q 199 311 200 347 q 197 244 197 275 q 209 167 197 199 q 242 116 221 136 q 290 87 263 96 q 347 78 317 78 q 469 140 421 78 q 517 333 517 201 q 505 492 517 411 q 461 665 493 572 l 572 692 q 617 516 601 604 q 632 338 632 428 q 611 185 632 251 q 553 74 590 119 q 463 6 515 29 q 346 -17 410 -17 m 283 796 l 346 1075 l 438 1056 l 343 782 l 283 796 m 182 826 q 140 842 157 826 q 124 885 124 858 q 140 927 124 911 q 182 943 157 943 q 222 927 206 943 q 239 885 239 911 q 222 842 239 858 q 182 826 206 826 m 496 826 q 456 842 472 826 q 439 885 439 858 q 456 927 439 911 q 496 943 472 943 q 538 927 521 943 q 554 885 554 911 q 538 842 554 858 q 496 826 521 826 z \"},\"Ἀ\":{\"ha\":806,\"x_min\":-8,\"x_max\":803,\"o\":\"m 333 510 l 290 371 l 564 371 l 521 510 q 474 662 496 586 q 429 817 451 738 l 424 817 q 381 662 403 738 q 333 510 358 586 m 56 0 l 364 911 l 494 911 l 803 0 l 679 0 l 593 278 l 261 278 l 174 0 l 56 0 m 42 640 l 29 693 q 84 726 61 706 q 107 785 107 747 q 78 836 107 817 q -8 858 50 856 l 4 924 q 146 890 96 921 q 196 797 196 858 q 183 733 196 760 q 149 689 171 707 q 100 659 128 671 q 42 640 72 647 z \"},\"Ἁ\":{\"ha\":796,\"x_min\":-18,\"x_max\":792,\"o\":\"m 322 510 l 279 371 l 553 371 l 510 510 q 463 662 485 586 q 418 817 440 738 l 413 817 q 369 662 392 738 q 322 510 347 586 m 44 0 l 353 911 l 483 911 l 792 0 l 668 0 l 582 278 l 250 278 l 163 0 l 44 0 m 136 640 q 78 659 106 647 q 28 689 50 671 q -6 733 7 707 q -18 797 -18 760 q 32 890 -18 858 q 174 924 82 921 l 186 858 q 99 836 128 856 q 71 785 71 817 q 94 726 71 747 q 149 693 117 706 l 136 640 z \"},\"Ὰ\":{\"ha\":786,\"x_min\":4,\"x_max\":782,\"o\":\"m 313 510 l 269 371 l 543 371 l 500 510 q 453 662 475 586 q 408 817 431 738 l 403 817 q 360 662 382 738 q 313 510 338 586 m 35 0 l 343 911 l 474 911 l 782 0 l 658 0 l 572 278 l 240 278 l 153 0 l 35 0 m 74 644 l 4 915 l 110 931 l 150 660 l 74 644 z \"},\"Ά\":{\"ha\":786,\"x_min\":8,\"x_max\":782,\"o\":\"m 313 510 l 269 371 l 543 371 l 500 510 q 453 662 475 586 q 408 817 431 738 l 403 817 q 360 662 382 738 q 313 510 338 586 m 35 0 l 343 911 l 474 911 l 782 0 l 658 0 l 572 278 l 240 278 l 153 0 l 35 0 m 8 660 l 49 931 l 154 915 l 85 644 l 8 660 z \"},\"Ἂ\":{\"ha\":992,\"x_min\":-17,\"x_max\":988,\"o\":\"m 518 510 l 475 371 l 749 371 l 706 510 q 658 662 681 586 q 614 817 636 738 l 608 817 q 565 662 588 738 q 518 510 543 586 m 240 0 l 549 911 l 679 911 l 988 0 l 864 0 l 778 278 l 446 278 l 358 0 l 240 0 m 279 644 l 210 915 l 315 931 l 356 660 l 279 644 m 33 644 l 17 697 q 59 733 42 713 q 76 783 76 754 q -17 863 76 857 l -4 928 q 115 892 71 925 q 160 796 160 860 q 149 741 160 765 q 120 698 138 717 q 80 666 103 679 q 33 644 57 653 z \"},\"Ἃ\":{\"ha\":986,\"x_min\":-18,\"x_max\":982,\"o\":\"m 513 510 l 469 371 l 743 371 l 700 510 q 653 662 675 586 q 608 817 631 738 l 603 817 q 560 662 582 738 q 513 510 538 586 m 235 0 l 543 911 l 674 911 l 982 0 l 858 0 l 772 278 l 440 278 l 353 0 l 235 0 m 275 644 l 204 915 l 310 931 l 350 660 l 275 644 m 108 644 q 62 666 85 653 q 22 698 39 679 q -7 741 4 717 q -18 796 -18 765 q 26 892 -18 860 q 146 928 71 925 l 158 863 q 65 783 65 857 q 83 733 65 754 q 125 697 100 713 l 108 644 z \"},\"Ἄ\":{\"ha\":985,\"x_min\":-17,\"x_max\":982,\"o\":\"m 513 510 l 469 371 l 743 371 l 700 510 q 653 662 675 586 q 608 817 631 738 l 603 817 q 560 662 582 738 q 513 510 538 586 m 235 0 l 543 911 l 674 911 l 982 0 l 858 0 l 772 278 l 440 278 l 353 0 l 235 0 m 210 660 l 250 931 l 356 915 l 286 644 l 210 660 m 33 644 l 17 697 q 59 733 42 713 q 76 783 76 754 q -17 863 76 857 l -4 928 q 115 892 71 925 q 160 796 160 860 q 149 741 160 765 q 120 698 138 717 q 80 666 103 679 q 33 644 57 653 z \"},\"Ἅ\":{\"ha\":979,\"x_min\":-18,\"x_max\":976,\"o\":\"m 507 510 l 464 371 l 738 371 l 694 510 q 647 662 669 586 q 603 817 625 738 l 597 817 q 554 662 576 738 q 507 510 532 586 m 229 0 l 538 911 l 668 911 l 976 0 l 853 0 l 767 278 l 435 278 l 347 0 l 229 0 m 204 660 l 244 931 l 350 915 l 281 644 l 204 660 m 108 644 q 62 666 85 653 q 22 698 39 679 q -7 741 4 717 q -18 796 -18 765 q 26 892 -18 860 q 146 928 71 925 l 158 863 q 65 783 65 857 q 83 733 65 754 q 125 697 100 713 l 108 644 z \"},\"Ἆ\":{\"ha\":851,\"x_min\":-33,\"x_max\":847,\"o\":\"m 378 510 l 335 371 l 608 371 l 565 510 q 518 662 540 586 q 474 817 496 738 l 468 817 q 425 662 447 738 q 378 510 403 586 m 100 0 l 408 911 l 539 911 l 847 0 l 724 0 l 638 278 l 306 278 l 218 0 l 100 0 m -33 836 q -6 909 -28 885 q 63 933 17 933 q 105 926 88 933 q 137 909 122 918 q 165 892 151 900 q 194 885 178 885 q 222 893 211 885 q 236 928 233 901 l 294 919 q 267 847 289 871 q 199 822 244 822 q 156 830 174 822 q 124 847 139 838 q 97 863 110 856 q 67 871 83 871 q 39 863 50 871 q 25 828 28 854 l -33 836 m 93 610 l 82 656 q 124 672 107 663 q 140 696 140 682 q 118 726 140 715 q 44 740 96 738 l 54 794 q 179 772 136 792 q 222 708 222 751 q 183 642 222 665 q 93 610 143 619 z \"},\"Ἇ\":{\"ha\":851,\"x_min\":-33,\"x_max\":847,\"o\":\"m 378 510 l 335 371 l 608 371 l 565 510 q 518 662 540 586 q 474 817 496 738 l 468 817 q 425 662 447 738 q 378 510 403 586 m 100 0 l 408 911 l 539 911 l 847 0 l 724 0 l 638 278 l 306 278 l 218 0 l 100 0 m 168 610 q 119 622 143 614 q 78 642 96 631 q 49 671 60 654 q 38 708 38 688 q 81 772 38 751 q 207 794 125 792 l 217 740 q 143 726 165 738 q 121 696 121 715 q 137 672 121 682 q 179 656 153 663 l 168 610 m -33 836 q -6 909 -28 885 q 63 933 17 933 q 105 926 88 933 q 137 909 122 918 q 165 892 151 900 q 194 885 178 885 q 222 893 211 885 q 236 928 233 901 l 294 919 q 267 847 289 871 q 199 822 244 822 q 156 830 174 822 q 124 847 139 838 q 97 863 110 856 q 67 871 83 871 q 39 863 50 871 q 25 828 28 854 l -33 836 z \"},\"Ᾰ\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 376 979 q 292 994 328 979 q 231 1033 256 1008 q 192 1090 206 1057 q 174 1158 178 1122 l 243 1169 q 284 1087 251 1121 q 376 1053 317 1053 q 469 1087 436 1053 q 510 1169 501 1121 l 579 1158 q 561 1090 575 1122 q 522 1033 547 1057 q 461 994 497 1008 q 376 979 425 979 z \"},\"Ᾱ\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 190 1021 l 190 1100 l 563 1100 l 563 1021 l 190 1021 z \"},\"Ἐ\":{\"ha\":896,\"x_min\":-17,\"x_max\":828,\"o\":\"m 289 0 l 289 911 l 814 911 l 814 814 l 404 814 l 404 528 l 750 528 l 750 429 l 404 429 l 404 99 l 828 99 l 828 0 l 289 0 m 33 640 l 21 693 q 76 726 53 706 q 99 785 99 747 q 70 836 99 817 q -17 858 42 856 l -4 924 q 138 890 88 921 q 188 797 188 858 q 175 733 188 760 q 141 689 163 707 q 92 659 119 671 q 33 640 64 647 z \"},\"Ἑ\":{\"ha\":896,\"x_min\":-18,\"x_max\":828,\"o\":\"m 289 0 l 289 911 l 814 911 l 814 814 l 404 814 l 404 528 l 750 528 l 750 429 l 404 429 l 404 99 l 828 99 l 828 0 l 289 0 m 136 640 q 78 659 106 647 q 28 689 50 671 q -6 733 7 707 q -18 797 -18 760 q 32 890 -18 858 q 174 924 82 921 l 186 858 q 99 836 128 856 q 71 785 71 817 q 94 726 71 747 q 149 693 117 706 l 136 640 z \"},\"Ὲ\":{\"ha\":821,\"x_min\":-31,\"x_max\":753,\"o\":\"m 214 0 l 214 911 l 739 911 l 739 814 l 329 814 l 329 528 l 675 528 l 675 429 l 329 429 l 329 99 l 753 99 l 753 0 l 214 0 m 39 644 l -31 915 l 75 931 l 115 660 l 39 644 z \"},\"Έ\":{\"ha\":821,\"x_min\":-26,\"x_max\":753,\"o\":\"m 214 0 l 214 911 l 739 911 l 739 814 l 329 814 l 329 528 l 675 528 l 675 429 l 329 429 l 329 99 l 753 99 l 753 0 l 214 0 m -26 660 l 14 931 l 119 915 l 50 644 l -26 660 z \"},\"Ἒ\":{\"ha\":1061,\"x_min\":-17,\"x_max\":993,\"o\":\"m 454 0 l 454 911 l 979 911 l 979 814 l 569 814 l 569 528 l 915 528 l 915 429 l 569 429 l 569 99 l 993 99 l 993 0 l 454 0 m 279 644 l 210 915 l 315 931 l 356 660 l 279 644 m 33 644 l 17 697 q 59 733 42 713 q 76 783 76 754 q -17 863 76 857 l -4 928 q 115 892 71 925 q 160 796 160 860 q 149 741 160 765 q 120 698 138 717 q 80 666 103 679 q 33 644 57 653 z \"},\"Ἓ\":{\"ha\":1057,\"x_min\":-18,\"x_max\":989,\"o\":\"m 450 0 l 450 911 l 975 911 l 975 814 l 565 814 l 565 528 l 911 528 l 911 429 l 565 429 l 565 99 l 989 99 l 989 0 l 450 0 m 275 644 l 204 915 l 310 931 l 350 660 l 275 644 m 108 644 q 62 666 85 653 q 22 698 39 679 q -7 741 4 717 q -18 796 -18 765 q 26 892 -18 860 q 146 928 71 925 l 158 863 q 65 783 65 857 q 83 733 65 754 q 125 697 100 713 l 108 644 z \"},\"Ἔ\":{\"ha\":1056,\"x_min\":-17,\"x_max\":988,\"o\":\"m 449 0 l 449 911 l 974 911 l 974 814 l 564 814 l 564 528 l 910 528 l 910 429 l 564 429 l 564 99 l 988 99 l 988 0 l 449 0 m 210 660 l 250 931 l 356 915 l 286 644 l 210 660 m 33 644 l 17 697 q 59 733 42 713 q 76 783 76 754 q -17 863 76 857 l -4 928 q 115 892 71 925 q 160 796 160 860 q 149 741 160 765 q 120 698 138 717 q 80 666 103 679 q 33 644 57 653 z \"},\"Ἕ\":{\"ha\":1050,\"x_min\":-18,\"x_max\":982,\"o\":\"m 443 0 l 443 911 l 968 911 l 968 814 l 558 814 l 558 528 l 904 528 l 904 429 l 558 429 l 558 99 l 982 99 l 982 0 l 443 0 m 204 660 l 244 931 l 350 915 l 281 644 l 204 660 m 108 644 q 62 666 85 653 q 22 698 39 679 q -7 741 4 717 q -18 796 -18 765 q 26 892 -18 860 q 146 928 71 925 l 158 863 q 65 783 65 857 q 83 733 65 754 q 125 697 100 713 l 108 644 z \"},\"Ἠ\":{\"ha\":1069,\"x_min\":-17,\"x_max\":944,\"o\":\"m 289 0 l 289 911 l 404 911 l 404 529 l 828 529 l 828 911 l 944 911 l 944 0 l 828 0 l 828 429 l 404 429 l 404 0 l 289 0 m 33 640 l 21 693 q 76 726 53 706 q 99 785 99 747 q 70 836 99 817 q -17 858 42 856 l -4 924 q 138 890 88 921 q 188 797 188 858 q 175 733 188 760 q 141 689 163 707 q 92 659 119 671 q 33 640 64 647 z \"},\"Ἡ\":{\"ha\":1069,\"x_min\":-18,\"x_max\":944,\"o\":\"m 289 0 l 289 911 l 404 911 l 404 529 l 828 529 l 828 911 l 944 911 l 944 0 l 828 0 l 828 429 l 404 429 l 404 0 l 289 0 m 136 640 q 78 659 106 647 q 28 689 50 671 q -6 733 7 707 q -18 797 -18 760 q 32 890 -18 858 q 174 924 82 921 l 186 858 q 99 836 128 856 q 71 785 71 817 q 94 726 71 747 q 149 693 117 706 l 136 640 z \"},\"Ὴ\":{\"ha\":994,\"x_min\":-31,\"x_max\":869,\"o\":\"m 214 0 l 214 911 l 329 911 l 329 529 l 753 529 l 753 911 l 869 911 l 869 0 l 753 0 l 753 429 l 329 429 l 329 0 l 214 0 m 39 644 l -31 915 l 75 931 l 115 660 l 39 644 z \"},\"Ή\":{\"ha\":994,\"x_min\":-26,\"x_max\":869,\"o\":\"m 214 0 l 214 911 l 329 911 l 329 529 l 753 529 l 753 911 l 869 911 l 869 0 l 753 0 l 753 429 l 329 429 l 329 0 l 214 0 m -26 660 l 14 931 l 119 915 l 50 644 l -26 660 z \"},\"Ἢ\":{\"ha\":1235,\"x_min\":-17,\"x_max\":1110,\"o\":\"m 454 0 l 454 911 l 569 911 l 569 529 l 993 529 l 993 911 l 1110 911 l 1110 0 l 993 0 l 993 429 l 569 429 l 569 0 l 454 0 m 279 644 l 210 915 l 315 931 l 356 660 l 279 644 m 33 644 l 17 697 q 59 733 42 713 q 76 783 76 754 q -17 863 76 857 l -4 928 q 115 892 71 925 q 160 796 160 860 q 149 741 160 765 q 120 698 138 717 q 80 666 103 679 q 33 644 57 653 z \"},\"Ἣ\":{\"ha\":1229,\"x_min\":-18,\"x_max\":1106,\"o\":\"m 450 0 l 450 911 l 565 911 l 565 529 l 989 529 l 989 911 l 1106 911 l 1106 0 l 989 0 l 989 429 l 565 429 l 565 0 l 450 0 m 275 644 l 204 915 l 310 931 l 350 660 l 275 644 m 108 644 q 62 666 85 653 q 22 698 39 679 q -7 741 4 717 q -18 796 -18 765 q 26 892 -18 860 q 146 928 71 925 l 158 863 q 65 783 65 857 q 83 733 65 754 q 125 697 100 713 l 108 644 z \"},\"Ἤ\":{\"ha\":1229,\"x_min\":-17,\"x_max\":1104,\"o\":\"m 449 0 l 449 911 l 564 911 l 564 529 l 988 529 l 988 911 l 1104 911 l 1104 0 l 988 0 l 988 429 l 564 429 l 564 0 l 449 0 m 210 660 l 250 931 l 356 915 l 286 644 l 210 660 m 33 644 l 17 697 q 59 733 42 713 q 76 783 76 754 q -17 863 76 857 l -4 928 q 115 892 71 925 q 160 796 160 860 q 149 741 160 765 q 120 698 138 717 q 80 666 103 679 q 33 644 57 653 z \"},\"Ἥ\":{\"ha\":1224,\"x_min\":-18,\"x_max\":1099,\"o\":\"m 443 0 l 443 911 l 558 911 l 558 529 l 982 529 l 982 911 l 1099 911 l 1099 0 l 982 0 l 982 429 l 558 429 l 558 0 l 443 0 m 204 660 l 244 931 l 350 915 l 281 644 l 204 660 m 108 644 q 62 666 85 653 q 22 698 39 679 q -7 741 4 717 q -18 796 -18 765 q 26 892 -18 860 q 146 928 71 925 l 158 863 q 65 783 65 857 q 83 733 65 754 q 125 697 100 713 l 108 644 z \"},\"Ἦ\":{\"ha\":1167,\"x_min\":-33,\"x_max\":1042,\"o\":\"m 386 0 l 386 911 l 501 911 l 501 529 l 925 529 l 925 911 l 1042 911 l 1042 0 l 925 0 l 925 429 l 501 429 l 501 0 l 386 0 m -33 836 q -6 909 -28 885 q 63 933 17 933 q 105 926 88 933 q 137 909 122 918 q 165 892 151 900 q 194 885 178 885 q 222 893 211 885 q 236 928 233 901 l 294 919 q 267 847 289 871 q 199 822 244 822 q 156 830 174 822 q 124 847 139 838 q 97 863 110 856 q 67 871 83 871 q 39 863 50 871 q 25 828 28 854 l -33 836 m 93 610 l 82 656 q 124 672 107 663 q 140 696 140 682 q 118 726 140 715 q 44 740 96 738 l 54 794 q 179 772 136 792 q 222 708 222 751 q 183 642 222 665 q 93 610 143 619 z \"},\"Ἧ\":{\"ha\":1167,\"x_min\":-33,\"x_max\":1042,\"o\":\"m 386 0 l 386 911 l 501 911 l 501 529 l 925 529 l 925 911 l 1042 911 l 1042 0 l 925 0 l 925 429 l 501 429 l 501 0 l 386 0 m 168 610 q 119 622 143 614 q 78 642 96 631 q 49 671 60 654 q 38 708 38 688 q 81 772 38 751 q 207 794 125 792 l 217 740 q 143 726 165 738 q 121 696 121 715 q 137 672 121 682 q 179 656 153 663 l 168 610 m -33 836 q -6 909 -28 885 q 63 933 17 933 q 105 926 88 933 q 137 909 122 918 q 165 892 151 900 q 194 885 178 885 q 222 893 211 885 q 236 928 233 901 l 294 919 q 267 847 289 871 q 199 822 244 822 q 156 830 174 822 q 124 847 139 838 q 97 863 110 856 q 67 871 83 871 q 39 863 50 871 q 25 828 28 854 l -33 836 z \"},\"Ἰ\":{\"ha\":529,\"x_min\":-17,\"x_max\":404,\"o\":\"m 289 0 l 289 911 l 404 911 l 404 0 l 289 0 m 33 640 l 21 693 q 76 726 53 706 q 99 785 99 747 q 70 836 99 817 q -17 858 42 856 l -4 924 q 138 890 88 921 q 188 797 188 858 q 175 733 188 760 q 141 689 163 707 q 92 659 119 671 q 33 640 64 647 z \"},\"Ἱ\":{\"ha\":529,\"x_min\":-18,\"x_max\":404,\"o\":\"m 289 0 l 289 911 l 404 911 l 404 0 l 289 0 m 136 640 q 78 659 106 647 q 28 689 50 671 q -6 733 7 707 q -18 797 -18 760 q 32 890 -18 858 q 174 924 82 921 l 186 858 q 99 836 128 856 q 71 785 71 817 q 94 726 71 747 q 149 693 117 706 l 136 640 z \"},\"Ὶ\":{\"ha\":454,\"x_min\":-31,\"x_max\":329,\"o\":\"m 214 0 l 214 911 l 329 911 l 329 0 l 214 0 m 39 644 l -31 915 l 75 931 l 115 660 l 39 644 z \"},\"Ί\":{\"ha\":454,\"x_min\":-26,\"x_max\":329,\"o\":\"m 214 0 l 214 911 l 329 911 l 329 0 l 214 0 m -26 660 l 14 931 l 119 915 l 50 644 l -26 660 z \"},\"Ἲ\":{\"ha\":694,\"x_min\":-17,\"x_max\":569,\"o\":\"m 454 0 l 454 911 l 569 911 l 569 0 l 454 0 m 279 644 l 210 915 l 315 931 l 356 660 l 279 644 m 33 644 l 17 697 q 59 733 42 713 q 76 783 76 754 q -17 863 76 857 l -4 928 q 115 892 71 925 q 160 796 160 860 q 149 741 160 765 q 120 698 138 717 q 80 666 103 679 q 33 644 57 653 z \"},\"Ἳ\":{\"ha\":690,\"x_min\":-18,\"x_max\":565,\"o\":\"m 450 0 l 450 911 l 565 911 l 565 0 l 450 0 m 275 644 l 204 915 l 310 931 l 350 660 l 275 644 m 108 644 q 62 666 85 653 q 22 698 39 679 q -7 741 4 717 q -18 796 -18 765 q 26 892 -18 860 q 146 928 71 925 l 158 863 q 65 783 65 857 q 83 733 65 754 q 125 697 100 713 l 108 644 z \"},\"Ἴ\":{\"ha\":689,\"x_min\":-17,\"x_max\":564,\"o\":\"m 449 0 l 449 911 l 564 911 l 564 0 l 449 0 m 210 660 l 250 931 l 356 915 l 286 644 l 210 660 m 33 644 l 17 697 q 59 733 42 713 q 76 783 76 754 q -17 863 76 857 l -4 928 q 115 892 71 925 q 160 796 160 860 q 149 741 160 765 q 120 698 138 717 q 80 666 103 679 q 33 644 57 653 z \"},\"Ἵ\":{\"ha\":683,\"x_min\":-18,\"x_max\":558,\"o\":\"m 443 0 l 443 911 l 558 911 l 558 0 l 443 0 m 204 660 l 244 931 l 350 915 l 281 644 l 204 660 m 108 644 q 62 666 85 653 q 22 698 39 679 q -7 741 4 717 q -18 796 -18 765 q 26 892 -18 860 q 146 928 71 925 l 158 863 q 65 783 65 857 q 83 733 65 754 q 125 697 100 713 l 108 644 z \"},\"Ἶ\":{\"ha\":626,\"x_min\":-33,\"x_max\":501,\"o\":\"m 386 0 l 386 911 l 501 911 l 501 0 l 386 0 m -33 836 q -6 909 -28 885 q 63 933 17 933 q 105 926 88 933 q 137 909 122 918 q 165 892 151 900 q 194 885 178 885 q 222 893 211 885 q 236 928 233 901 l 294 919 q 267 847 289 871 q 199 822 244 822 q 156 830 174 822 q 124 847 139 838 q 97 863 110 856 q 67 871 83 871 q 39 863 50 871 q 25 828 28 854 l -33 836 m 93 610 l 82 656 q 124 672 107 663 q 140 696 140 682 q 118 726 140 715 q 44 740 96 738 l 54 794 q 179 772 136 792 q 222 708 222 751 q 183 642 222 665 q 93 610 143 619 z \"},\"Ἷ\":{\"ha\":626,\"x_min\":-33,\"x_max\":501,\"o\":\"m 386 0 l 386 911 l 501 911 l 501 0 l 386 0 m 168 610 q 119 622 143 614 q 78 642 96 631 q 49 671 60 654 q 38 708 38 688 q 81 772 38 751 q 207 794 125 792 l 217 740 q 143 726 165 738 q 121 696 121 715 q 137 672 121 682 q 179 656 153 663 l 168 610 m -33 836 q -6 909 -28 885 q 63 933 17 933 q 105 926 88 933 q 137 909 122 918 q 165 892 151 900 q 194 885 178 885 q 222 893 211 885 q 236 928 233 901 l 294 919 q 267 847 289 871 q 199 822 244 822 q 156 830 174 822 q 124 847 139 838 q 97 863 110 856 q 67 871 83 871 q 39 863 50 871 q 25 828 28 854 l -33 836 z \"},\"Ῐ\":{\"ha\":365,\"x_min\":-21,\"x_max\":385,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 0 l 125 0 m 182 979 q 97 994 133 979 q 36 1033 61 1008 q -3 1090 11 1057 q -21 1158 -17 1122 l 49 1169 q 90 1087 57 1121 q 182 1053 122 1053 q 274 1087 242 1053 q 315 1169 307 1121 l 385 1158 q 367 1090 381 1122 q 328 1033 353 1057 q 267 994 303 1008 q 182 979 231 979 z \"},\"Ῑ\":{\"ha\":365,\"x_min\":-4,\"x_max\":368,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 0 l 125 0 m -4 1021 l -4 1100 l 368 1100 l 368 1021 l -4 1021 z \"},\"Ὀ\":{\"ha\":1057,\"x_min\":-17,\"x_max\":986,\"o\":\"m 596 -17 q 438 17 510 -17 q 315 112 367 50 q 235 262 264 174 q 207 460 207 350 q 235 656 207 569 q 315 803 264 743 q 438 896 367 864 q 596 928 510 928 q 753 895 682 928 q 877 802 825 863 q 958 655 929 742 q 986 460 986 568 q 958 262 986 350 q 877 112 929 174 q 753 17 825 50 q 596 -17 682 -17 m 596 85 q 706 111 657 85 q 791 187 756 138 q 846 305 826 236 q 865 460 865 374 q 846 613 865 544 q 791 728 826 681 q 706 801 756 775 q 596 826 657 826 q 485 801 535 826 q 401 728 436 775 q 346 613 365 681 q 326 460 326 544 q 346 305 326 374 q 401 187 365 236 q 485 111 436 138 q 596 85 535 85 m 33 640 l 21 693 q 76 726 53 706 q 99 785 99 747 q 70 836 99 817 q -17 858 42 856 l -4 924 q 138 890 88 921 q 188 797 188 858 q 175 733 188 760 q 141 689 163 707 q 92 659 119 671 q 33 640 64 647 z \"},\"Ὁ\":{\"ha\":1038,\"x_min\":-18,\"x_max\":967,\"o\":\"m 576 -17 q 419 17 490 -17 q 296 112 347 50 q 216 262 244 174 q 188 460 188 350 q 216 656 188 569 q 296 803 244 743 q 419 896 347 864 q 576 928 490 928 q 734 895 663 928 q 858 802 806 863 q 938 655 910 742 q 967 460 967 568 q 938 262 967 350 q 858 112 910 174 q 734 17 806 50 q 576 -17 663 -17 m 576 85 q 687 111 638 85 q 772 187 736 138 q 826 305 807 236 q 846 460 846 374 q 826 613 846 544 q 772 728 807 681 q 687 801 736 775 q 576 826 638 826 q 466 801 515 826 q 381 728 417 775 q 326 613 346 681 q 307 460 307 544 q 326 305 307 374 q 381 187 346 236 q 466 111 417 138 q 576 85 515 85 m 136 640 q 78 659 106 647 q 28 689 50 671 q -6 733 7 707 q -18 797 -18 760 q 32 890 -18 858 q 174 924 82 921 l 186 858 q 99 836 128 856 q 71 785 71 817 q 94 726 71 747 q 149 693 117 706 l 136 640 z \"},\"Ὸ\":{\"ha\":996,\"x_min\":-31,\"x_max\":925,\"o\":\"m 535 -17 q 377 17 449 -17 q 254 112 306 50 q 174 262 203 174 q 146 460 146 350 q 174 656 146 569 q 254 803 203 743 q 377 896 306 864 q 535 928 449 928 q 692 895 621 928 q 816 802 764 863 q 897 655 868 742 q 925 460 925 568 q 897 262 925 350 q 816 112 868 174 q 692 17 764 50 q 535 -17 621 -17 m 535 85 q 645 111 596 85 q 730 187 694 138 q 785 305 765 236 q 804 460 804 374 q 785 613 804 544 q 730 728 765 681 q 645 801 694 775 q 535 826 596 826 q 424 801 474 826 q 340 728 375 775 q 285 613 304 681 q 265 460 265 544 q 285 305 265 374 q 340 187 304 236 q 424 111 375 138 q 535 85 474 85 m 39 644 l -31 915 l 75 931 l 115 660 l 39 644 z \"},\"Ό\":{\"ha\":988,\"x_min\":-26,\"x_max\":917,\"o\":\"m 526 -17 q 369 17 440 -17 q 246 112 297 50 q 166 262 194 174 q 138 460 138 350 q 166 656 138 569 q 246 803 194 743 q 369 896 297 864 q 526 928 440 928 q 684 895 613 928 q 808 802 756 863 q 888 655 860 742 q 917 460 917 568 q 888 262 917 350 q 808 112 860 174 q 684 17 756 50 q 526 -17 613 -17 m 526 85 q 637 111 588 85 q 722 187 686 138 q 776 305 757 236 q 796 460 796 374 q 776 613 796 544 q 722 728 757 681 q 637 801 686 775 q 526 826 588 826 q 416 801 465 826 q 331 728 367 775 q 276 613 296 681 q 257 460 257 544 q 276 305 257 374 q 331 187 296 236 q 416 111 367 138 q 526 85 465 85 m -26 660 l 14 931 l 119 915 l 50 644 l -26 660 z \"},\"Ὂ\":{\"ha\":1228,\"x_min\":-17,\"x_max\":1165,\"o\":\"m 775 -17 q 617 17 689 -17 q 494 112 546 50 q 415 262 443 174 q 386 460 386 350 q 415 656 386 569 q 494 803 443 743 q 617 896 546 864 q 775 928 689 928 q 933 895 861 928 q 1056 802 1004 863 q 1137 655 1108 742 q 1165 460 1165 568 q 1137 262 1165 350 q 1056 112 1108 174 q 933 17 1004 50 q 775 -17 861 -17 m 775 85 q 885 111 836 85 q 970 187 935 138 q 1025 305 1006 236 q 1044 460 1044 374 q 1025 613 1044 544 q 970 728 1006 681 q 885 801 935 775 q 775 826 836 826 q 665 801 714 826 q 580 728 615 775 q 525 613 544 681 q 506 460 506 544 q 525 305 506 374 q 580 187 544 236 q 665 111 615 138 q 775 85 714 85 m 279 644 l 210 915 l 315 931 l 356 660 l 279 644 m 33 644 l 17 697 q 59 733 42 713 q 76 783 76 754 q -17 863 76 857 l -4 928 q 115 892 71 925 q 160 796 160 860 q 149 741 160 765 q 120 698 138 717 q 80 666 103 679 q 33 644 57 653 z \"},\"Ὃ\":{\"ha\":1231,\"x_min\":-18,\"x_max\":1160,\"o\":\"m 769 -17 q 612 17 683 -17 q 489 112 540 50 q 409 262 438 174 q 381 460 381 350 q 409 656 381 569 q 489 803 438 743 q 612 896 540 864 q 769 928 683 928 q 927 895 856 928 q 1051 802 999 863 q 1131 655 1103 742 q 1160 460 1160 568 q 1131 262 1160 350 q 1051 112 1103 174 q 927 17 999 50 q 769 -17 856 -17 m 769 85 q 880 111 831 85 q 965 187 929 138 q 1019 305 1000 236 q 1039 460 1039 374 q 1019 613 1039 544 q 965 728 1000 681 q 880 801 929 775 q 769 826 831 826 q 659 801 708 826 q 574 728 610 775 q 519 613 539 681 q 500 460 500 544 q 519 305 500 374 q 574 187 539 236 q 659 111 610 138 q 769 85 708 85 m 275 644 l 204 915 l 310 931 l 350 660 l 275 644 m 108 644 q 62 666 85 653 q 22 698 39 679 q -7 741 4 717 q -18 796 -18 765 q 26 892 -18 860 q 146 928 71 925 l 158 863 q 65 783 65 857 q 83 733 65 754 q 125 697 100 713 l 108 644 z \"},\"Ὄ\":{\"ha\":1222,\"x_min\":-17,\"x_max\":1151,\"o\":\"m 761 -17 q 603 17 675 -17 q 481 112 532 50 q 401 262 429 174 q 372 460 372 350 q 401 656 372 569 q 481 803 429 743 q 603 896 532 864 q 761 928 675 928 q 919 895 847 928 q 1042 802 990 863 q 1123 655 1094 742 q 1151 460 1151 568 q 1123 262 1151 350 q 1042 112 1094 174 q 919 17 990 50 q 761 -17 847 -17 m 761 85 q 872 111 822 85 q 956 187 921 138 q 1011 305 992 236 q 1031 460 1031 374 q 1011 613 1031 544 q 956 728 992 681 q 872 801 921 775 q 761 826 822 826 q 651 801 700 826 q 566 728 601 775 q 511 613 531 681 q 492 460 492 544 q 511 305 492 374 q 566 187 531 236 q 651 111 601 138 q 761 85 700 85 m 210 660 l 250 931 l 356 915 l 286 644 l 210 660 m 33 644 l 17 697 q 59 733 42 713 q 76 783 76 754 q -17 863 76 857 l -4 928 q 115 892 71 925 q 160 796 160 860 q 149 741 160 765 q 120 698 138 717 q 80 666 103 679 q 33 644 57 653 z \"},\"Ὅ\":{\"ha\":1217,\"x_min\":-18,\"x_max\":1146,\"o\":\"m 756 -17 q 598 17 669 -17 q 475 112 526 50 q 395 262 424 174 q 367 460 367 350 q 395 656 367 569 q 475 803 424 743 q 598 896 526 864 q 756 928 669 928 q 913 895 842 928 q 1037 802 985 863 q 1117 655 1089 742 q 1146 460 1146 568 q 1117 262 1146 350 q 1037 112 1089 174 q 913 17 985 50 q 756 -17 842 -17 m 756 85 q 866 111 817 85 q 951 187 915 138 q 1006 305 986 236 q 1025 460 1025 374 q 1006 613 1025 544 q 951 728 986 681 q 866 801 915 775 q 756 826 817 826 q 645 801 694 826 q 560 728 596 775 q 506 613 525 681 q 486 460 486 544 q 506 305 486 374 q 560 187 525 236 q 645 111 596 138 q 756 85 694 85 m 204 660 l 244 931 l 350 915 l 281 644 l 204 660 m 108 644 q 62 666 85 653 q 22 698 39 679 q -7 741 4 717 q -18 796 -18 765 q 26 892 -18 860 q 146 928 71 925 l 158 863 q 65 783 65 857 q 83 733 65 754 q 125 697 100 713 l 108 644 z \"},\"Ῥ\":{\"ha\":950,\"x_min\":-18,\"x_max\":890,\"o\":\"m 289 0 l 289 911 l 549 911 q 688 897 625 911 q 796 852 751 883 q 865 769 840 821 q 890 643 890 718 q 866 518 890 571 q 797 431 842 465 q 691 378 753 396 q 554 361 629 361 l 404 361 l 404 0 l 289 0 m 404 456 l 540 456 q 717 501 660 456 q 775 643 775 546 q 715 780 775 742 q 535 818 654 818 l 404 818 l 404 456 m 136 640 q 78 659 106 647 q 28 689 50 671 q -6 733 7 707 q -18 797 -18 760 q 32 890 -18 858 q 174 924 82 921 l 186 858 q 99 836 128 856 q 71 785 71 817 q 94 726 71 747 q 149 693 117 706 l 136 640 z \"},\"Ὑ\":{\"ha\":896,\"x_min\":-18,\"x_max\":897,\"o\":\"m 507 0 l 507 353 l 233 911 l 357 911 l 475 654 q 518 556 497 604 q 563 456 539 507 l 568 456 q 615 556 592 507 q 660 654 639 604 l 776 911 l 897 911 l 624 353 l 624 0 l 507 0 m 136 640 q 78 659 106 647 q 28 689 50 671 q -6 733 7 707 q -18 797 -18 760 q 32 890 -18 858 q 174 924 82 921 l 186 858 q 99 836 128 856 q 71 785 71 817 q 94 726 71 747 q 149 693 117 706 l 136 640 z \"},\"Ὺ\":{\"ha\":833,\"x_min\":-31,\"x_max\":835,\"o\":\"m 444 0 l 444 353 l 171 911 l 294 911 l 413 654 q 456 556 435 604 q 500 456 476 507 l 506 456 q 553 556 529 507 q 597 654 576 604 l 714 911 l 835 911 l 561 353 l 561 0 l 444 0 m 39 644 l -31 915 l 75 931 l 115 660 l 39 644 z \"},\"Ύ\":{\"ha\":833,\"x_min\":-26,\"x_max\":835,\"o\":\"m 444 0 l 444 353 l 171 911 l 294 911 l 413 654 q 456 556 435 604 q 500 456 476 507 l 506 456 q 553 556 529 507 q 597 654 576 604 l 714 911 l 835 911 l 561 353 l 561 0 l 444 0 m -26 660 l 14 931 l 119 915 l 50 644 l -26 660 z \"},\"Ὓ\":{\"ha\":1068,\"x_min\":-18,\"x_max\":1071,\"o\":\"m 681 0 l 681 353 l 407 911 l 531 911 l 649 654 q 692 556 671 604 q 736 456 713 507 l 742 456 q 789 556 765 507 q 833 654 813 604 l 950 911 l 1071 911 l 797 353 l 797 0 l 681 0 m 275 644 l 204 915 l 310 931 l 350 660 l 275 644 m 108 644 q 62 666 85 653 q 22 698 39 679 q -7 741 4 717 q -18 796 -18 765 q 26 892 -18 860 q 146 928 71 925 l 158 863 q 65 783 65 857 q 83 733 65 754 q 125 697 100 713 l 108 644 z \"},\"Ὕ\":{\"ha\":1063,\"x_min\":-18,\"x_max\":1064,\"o\":\"m 674 0 l 674 353 l 400 911 l 524 911 l 642 654 q 685 556 664 604 q 729 456 706 507 l 735 456 q 782 556 758 507 q 826 654 806 604 l 943 911 l 1064 911 l 790 353 l 790 0 l 674 0 m 204 660 l 244 931 l 350 915 l 281 644 l 204 660 m 108 644 q 62 666 85 653 q 22 698 39 679 q -7 741 4 717 q -18 796 -18 765 q 26 892 -18 860 q 146 928 71 925 l 158 863 q 65 783 65 857 q 83 733 65 754 q 125 697 100 713 l 108 644 z \"},\"Ὗ\":{\"ha\":997,\"x_min\":-33,\"x_max\":999,\"o\":\"m 608 0 l 608 353 l 335 911 l 458 911 l 576 654 q 619 556 599 604 q 664 456 640 507 l 669 456 q 717 556 693 507 q 761 654 740 604 l 878 911 l 999 911 l 725 353 l 725 0 l 608 0 m 168 610 q 119 622 143 614 q 78 642 96 631 q 49 671 60 654 q 38 708 38 688 q 81 772 38 751 q 207 794 125 792 l 217 740 q 143 726 165 738 q 121 696 121 715 q 137 672 121 682 q 179 656 153 663 l 168 610 m -33 836 q -6 909 -28 885 q 63 933 17 933 q 105 926 88 933 q 137 909 122 918 q 165 892 151 900 q 194 885 178 885 q 222 893 211 885 q 236 928 233 901 l 294 919 q 267 847 289 871 q 199 822 244 822 q 156 830 174 822 q 124 847 139 838 q 97 863 110 856 q 67 871 83 871 q 39 863 50 871 q 25 828 28 854 l -33 836 z \"},\"Ῠ\":{\"ha\":661,\"x_min\":-1,\"x_max\":663,\"o\":\"m 272 0 l 272 353 l -1 911 l 122 911 l 240 654 q 283 556 263 604 q 328 456 304 507 l 333 456 q 381 556 357 507 q 425 654 404 604 l 542 911 l 663 911 l 389 353 l 389 0 l 272 0 m 331 979 q 246 994 282 979 q 185 1033 210 1008 q 146 1090 160 1057 q 128 1158 132 1122 l 197 1169 q 238 1087 206 1121 q 331 1053 271 1053 q 423 1087 390 1053 q 464 1169 456 1121 l 533 1158 q 515 1090 529 1122 q 476 1033 501 1057 q 415 994 451 1008 q 331 979 379 979 z \"},\"Ῡ\":{\"ha\":661,\"x_min\":-1,\"x_max\":663,\"o\":\"m 272 0 l 272 353 l -1 911 l 122 911 l 240 654 q 283 556 263 604 q 328 456 304 507 l 333 456 q 381 556 357 507 q 425 654 404 604 l 542 911 l 663 911 l 389 353 l 389 0 l 272 0 m 144 1021 l 144 1100 l 517 1100 l 517 1021 l 144 1021 z \"},\"Ὠ\":{\"ha\":1074,\"x_min\":-17,\"x_max\":1014,\"o\":\"m 197 0 l 197 94 l 379 94 l 379 100 q 321 167 350 129 q 269 254 292 206 q 231 360 246 303 q 217 488 217 418 q 244 664 217 583 q 323 803 272 744 q 445 895 374 863 q 606 928 517 928 q 766 895 694 928 q 889 803 838 863 q 968 664 940 744 q 996 488 996 583 q 981 360 996 418 q 944 254 967 303 q 891 167 921 206 q 832 100 861 129 l 832 94 l 1014 94 l 1014 0 l 690 0 l 690 85 q 763 154 729 115 q 822 242 797 193 q 862 349 847 290 q 876 481 876 408 q 858 617 876 554 q 804 727 839 681 q 719 800 769 774 q 606 826 669 826 q 492 800 542 826 q 407 727 442 774 q 354 617 372 681 q 336 481 336 554 q 350 349 336 408 q 389 242 364 290 q 448 154 414 193 q 521 85 482 115 l 521 0 l 197 0 m 33 640 l 21 693 q 76 726 53 706 q 99 785 99 747 q 70 836 99 817 q -17 858 42 856 l -4 924 q 138 890 88 921 q 188 797 188 858 q 175 733 188 760 q 141 689 163 707 q 92 659 119 671 q 33 640 64 647 z \"},\"Ὡ\":{\"ha\":1054,\"x_min\":-18,\"x_max\":994,\"o\":\"m 178 0 l 178 94 l 360 94 l 360 100 q 301 167 331 129 q 249 254 272 206 q 212 360 226 303 q 197 488 197 418 q 225 664 197 583 q 303 803 253 744 q 426 895 354 863 q 586 928 497 928 q 747 895 675 928 q 869 803 818 863 q 949 664 921 744 q 976 488 976 583 q 962 360 976 418 q 924 254 947 303 q 872 167 901 206 q 813 100 842 129 l 813 94 l 994 94 l 994 0 l 671 0 l 671 85 q 744 154 710 115 q 803 242 778 193 q 842 349 828 290 q 857 481 857 408 q 838 617 857 554 q 785 727 819 681 q 700 800 750 774 q 586 826 650 826 q 472 800 522 826 q 388 727 422 774 q 335 617 353 681 q 317 481 317 554 q 331 349 317 408 q 369 242 344 290 q 428 154 394 193 q 501 85 463 115 l 501 0 l 178 0 m 136 640 q 78 659 106 647 q 28 689 50 671 q -6 733 7 707 q -18 797 -18 760 q 32 890 -18 858 q 174 924 82 921 l 186 858 q 99 836 128 856 q 71 785 71 817 q 94 726 71 747 q 149 693 117 706 l 136 640 z \"},\"Ὼ\":{\"ha\":1008,\"x_min\":-29,\"x_max\":949,\"o\":\"m 132 0 l 132 94 l 314 94 l 314 100 q 256 167 285 129 q 203 254 226 206 q 166 360 181 303 q 151 488 151 418 q 179 664 151 583 q 258 803 207 744 q 380 895 308 863 q 540 928 451 928 q 701 895 629 928 q 824 803 772 863 q 903 664 875 744 q 931 488 931 583 q 916 360 931 418 q 878 254 901 303 q 826 167 856 206 q 767 100 796 129 l 767 94 l 949 94 l 949 0 l 625 0 l 625 85 q 698 154 664 115 q 757 242 732 193 q 797 349 782 290 q 811 481 811 408 q 792 617 811 554 q 739 727 774 681 q 654 800 704 774 q 540 826 604 826 q 426 800 476 826 q 342 727 376 774 q 289 617 307 681 q 271 481 271 554 q 285 349 271 408 q 324 242 299 290 q 383 154 349 193 q 456 85 417 115 l 456 0 l 132 0 m 40 644 l -29 915 l 76 931 l 117 660 l 40 644 z \"},\"Ώ\":{\"ha\":1004,\"x_min\":-31,\"x_max\":944,\"o\":\"m 128 0 l 128 94 l 310 94 l 310 100 q 251 167 281 129 q 199 254 222 206 q 162 360 176 303 q 147 488 147 418 q 175 664 147 583 q 253 803 203 744 q 376 895 304 863 q 536 928 447 928 q 697 895 625 928 q 819 803 768 863 q 899 664 871 744 q 926 488 926 583 q 912 360 926 418 q 874 254 897 303 q 822 167 851 206 q 763 100 792 129 l 763 94 l 944 94 l 944 0 l 621 0 l 621 85 q 694 154 660 115 q 753 242 728 193 q 792 349 778 290 q 807 481 807 408 q 788 617 807 554 q 735 727 769 681 q 650 800 700 774 q 536 826 600 826 q 422 800 472 826 q 338 727 372 774 q 285 617 303 681 q 267 481 267 554 q 281 349 267 408 q 319 242 294 290 q 378 154 344 193 q 451 85 413 115 l 451 0 l 128 0 m -31 660 l 10 931 l 115 915 l 46 644 l -31 660 z \"},\"Ὢ\":{\"ha\":1250,\"x_min\":-17,\"x_max\":1190,\"o\":\"m 374 0 l 374 94 l 556 94 l 556 100 q 497 167 526 129 q 445 254 468 206 q 408 360 422 303 q 393 488 393 418 q 421 664 393 583 q 499 803 449 744 q 622 895 550 863 q 782 928 693 928 q 942 895 871 928 q 1065 803 1014 863 q 1144 664 1117 744 q 1172 488 1172 583 q 1158 360 1172 418 q 1120 254 1143 303 q 1067 167 1097 206 q 1008 100 1038 129 l 1008 94 l 1190 94 l 1190 0 l 867 0 l 867 85 q 940 154 906 115 q 999 242 974 193 q 1038 349 1024 290 q 1053 481 1053 408 q 1034 617 1053 554 q 981 727 1015 681 q 896 800 946 774 q 782 826 846 826 q 668 800 718 826 q 583 727 618 774 q 531 617 549 681 q 513 481 513 554 q 526 349 513 408 q 565 242 540 290 q 624 154 590 193 q 697 85 658 115 l 697 0 l 374 0 m 279 644 l 210 915 l 315 931 l 356 660 l 279 644 m 33 644 l 17 697 q 59 733 42 713 q 76 783 76 754 q -17 863 76 857 l -4 928 q 115 892 71 925 q 160 796 160 860 q 149 741 160 765 q 120 698 138 717 q 80 666 103 679 q 33 644 57 653 z \"},\"Ὣ\":{\"ha\":1244,\"x_min\":-18,\"x_max\":1185,\"o\":\"m 368 0 l 368 94 l 550 94 l 550 100 q 492 167 521 129 q 440 254 463 206 q 402 360 417 303 q 388 488 388 418 q 415 664 388 583 q 494 803 443 744 q 616 895 544 863 q 776 928 688 928 q 937 895 865 928 q 1060 803 1008 863 q 1139 664 1111 744 q 1167 488 1167 583 q 1152 360 1167 418 q 1115 254 1138 303 q 1062 167 1092 206 q 1003 100 1032 129 l 1003 94 l 1185 94 l 1185 0 l 861 0 l 861 85 q 934 154 900 115 q 993 242 968 193 q 1033 349 1018 290 q 1047 481 1047 408 q 1028 617 1047 554 q 975 727 1010 681 q 890 800 940 774 q 776 826 840 826 q 663 800 713 826 q 578 727 613 774 q 525 617 543 681 q 507 481 507 554 q 521 349 507 408 q 560 242 535 290 q 619 154 585 193 q 692 85 653 115 l 692 0 l 368 0 m 275 644 l 204 915 l 310 931 l 350 660 l 275 644 m 108 644 q 62 666 85 653 q 22 698 39 679 q -7 741 4 717 q -18 796 -18 765 q 26 892 -18 860 q 146 928 71 925 l 158 863 q 65 783 65 857 q 83 733 65 754 q 125 697 100 713 l 108 644 z \"},\"Ὤ\":{\"ha\":1243,\"x_min\":-17,\"x_max\":1183,\"o\":\"m 367 0 l 367 94 l 549 94 l 549 100 q 490 167 519 129 q 438 254 461 206 q 401 360 415 303 q 386 488 386 418 q 414 664 386 583 q 492 803 442 744 q 615 895 543 863 q 775 928 686 928 q 935 895 864 928 q 1058 803 1007 863 q 1138 664 1110 744 q 1165 488 1165 583 q 1151 360 1165 418 q 1113 254 1136 303 q 1060 167 1090 206 q 1001 100 1031 129 l 1001 94 l 1183 94 l 1183 0 l 860 0 l 860 85 q 933 154 899 115 q 992 242 967 193 q 1031 349 1017 290 q 1046 481 1046 408 q 1027 617 1046 554 q 974 727 1008 681 q 889 800 939 774 q 775 826 839 826 q 661 800 711 826 q 576 727 611 774 q 524 617 542 681 q 506 481 506 554 q 519 349 506 408 q 558 242 533 290 q 617 154 583 193 q 690 85 651 115 l 690 0 l 367 0 m 210 660 l 250 931 l 356 915 l 286 644 l 210 660 m 33 644 l 17 697 q 59 733 42 713 q 76 783 76 754 q -17 863 76 857 l -4 928 q 115 892 71 925 q 160 796 160 860 q 149 741 160 765 q 120 698 138 717 q 80 666 103 679 q 33 644 57 653 z \"},\"Ὥ\":{\"ha\":1238,\"x_min\":-18,\"x_max\":1179,\"o\":\"m 363 0 l 363 94 l 544 94 l 544 100 q 486 167 515 129 q 434 254 457 206 q 397 360 411 303 q 382 488 382 418 q 410 664 382 583 q 488 803 438 744 q 610 895 539 863 q 771 928 682 928 q 931 895 860 928 q 1054 803 1003 863 q 1133 664 1106 744 q 1161 488 1161 583 q 1147 360 1161 418 q 1109 254 1132 303 q 1056 167 1086 206 q 997 100 1026 129 l 997 94 l 1179 94 l 1179 0 l 856 0 l 856 85 q 928 154 894 115 q 988 242 963 193 q 1027 349 1013 290 q 1042 481 1042 408 q 1023 617 1042 554 q 969 727 1004 681 q 885 800 935 774 q 771 826 835 826 q 657 800 707 826 q 572 727 607 774 q 519 617 538 681 q 501 481 501 554 q 515 349 501 408 q 554 242 529 290 q 613 154 579 193 q 686 85 647 115 l 686 0 l 363 0 m 204 660 l 244 931 l 350 915 l 281 644 l 204 660 m 108 644 q 62 666 85 653 q 22 698 39 679 q -7 741 4 717 q -18 796 -18 765 q 26 892 -18 860 q 146 928 71 925 l 158 863 q 65 783 65 857 q 83 733 65 754 q 125 697 100 713 l 108 644 z \"},\"Ὦ\":{\"ha\":1135,\"x_min\":-33,\"x_max\":1075,\"o\":\"m 258 0 l 258 94 l 440 94 l 440 100 q 382 167 411 129 q 330 254 353 206 q 292 360 307 303 q 278 488 278 418 q 306 664 278 583 q 384 803 333 744 q 506 895 435 863 q 667 928 578 928 q 827 895 756 928 q 950 803 899 863 q 1029 664 1001 744 q 1057 488 1057 583 q 1042 360 1057 418 q 1005 254 1028 303 q 952 167 982 206 q 893 100 922 129 l 893 94 l 1075 94 l 1075 0 l 751 0 l 751 85 q 824 154 790 115 q 883 242 858 193 q 923 349 908 290 q 938 481 938 408 q 919 617 938 554 q 865 727 900 681 q 781 800 831 774 q 667 826 731 826 q 553 800 603 826 q 468 727 503 774 q 415 617 433 681 q 397 481 397 554 q 411 349 397 408 q 450 242 425 290 q 509 154 475 193 q 582 85 543 115 l 582 0 l 258 0 m -33 836 q -6 909 -28 885 q 63 933 17 933 q 105 926 88 933 q 137 909 122 918 q 165 892 151 900 q 194 885 178 885 q 222 893 211 885 q 236 928 233 901 l 294 919 q 267 847 289 871 q 199 822 244 822 q 156 830 174 822 q 124 847 139 838 q 97 863 110 856 q 67 871 83 871 q 39 863 50 871 q 25 828 28 854 l -33 836 m 93 610 l 82 656 q 124 672 107 663 q 140 696 140 682 q 118 726 140 715 q 44 740 96 738 l 54 794 q 179 772 136 792 q 222 708 222 751 q 183 642 222 665 q 93 610 143 619 z \"},\"Ὧ\":{\"ha\":1135,\"x_min\":-33,\"x_max\":1075,\"o\":\"m 258 0 l 258 94 l 440 94 l 440 100 q 382 167 411 129 q 330 254 353 206 q 292 360 307 303 q 278 488 278 418 q 306 664 278 583 q 384 803 333 744 q 506 895 435 863 q 667 928 578 928 q 827 895 756 928 q 950 803 899 863 q 1029 664 1001 744 q 1057 488 1057 583 q 1042 360 1057 418 q 1005 254 1028 303 q 952 167 982 206 q 893 100 922 129 l 893 94 l 1075 94 l 1075 0 l 751 0 l 751 85 q 824 154 790 115 q 883 242 858 193 q 923 349 908 290 q 938 481 938 408 q 919 617 938 554 q 865 727 900 681 q 781 800 831 774 q 667 826 731 826 q 553 800 603 826 q 468 727 503 774 q 415 617 433 681 q 397 481 397 554 q 411 349 397 408 q 450 242 425 290 q 509 154 475 193 q 582 85 543 115 l 582 0 l 258 0 m 168 610 q 119 622 143 614 q 78 642 96 631 q 49 671 60 654 q 38 708 38 688 q 81 772 38 751 q 207 794 125 792 l 217 740 q 143 726 165 738 q 121 696 121 715 q 137 672 121 682 q 179 656 153 663 l 168 610 m -33 836 q -6 909 -28 885 q 63 933 17 933 q 105 926 88 933 q 137 909 122 918 q 165 892 151 900 q 194 885 178 885 q 222 893 211 885 q 236 928 233 901 l 294 919 q 267 847 289 871 q 199 822 244 822 q 156 830 174 822 q 124 847 139 838 q 97 863 110 856 q 67 871 83 871 q 39 863 50 871 q 25 828 28 854 l -33 836 z \"},\"ᾼ\":{\"ha\":1114,\"x_min\":4,\"x_max\":1079,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 997 -17 q 897 24 926 -17 q 867 140 867 65 l 867 564 l 982 564 q 976 342 979 451 q 974 132 974 232 q 988 91 974 104 q 1024 78 1001 78 q 1064 86 1040 78 l 1079 0 q 1045 -12 1064 -7 q 997 -17 1026 -17 z \"},\"ᾈ\":{\"ha\":1165,\"x_min\":-8,\"x_max\":1131,\"o\":\"m 333 510 l 290 371 l 564 371 l 521 510 q 474 662 496 586 q 429 817 451 738 l 424 817 q 381 662 403 738 q 333 510 358 586 m 56 0 l 364 911 l 494 911 l 803 0 l 679 0 l 593 278 l 261 278 l 174 0 l 56 0 m 42 640 l 29 693 q 84 726 61 706 q 107 785 107 747 q 78 836 107 817 q -8 858 50 856 l 4 924 q 146 890 96 921 q 196 797 196 858 q 183 733 196 760 q 149 689 171 707 q 100 659 128 671 q 42 640 72 647 m 1049 -17 q 948 24 978 -17 q 918 140 918 65 l 918 564 l 1033 564 q 1028 342 1031 451 q 1025 132 1025 232 q 1039 91 1025 104 q 1075 78 1053 78 q 1115 86 1092 78 l 1131 0 q 1097 -12 1115 -7 q 1049 -17 1078 -17 z \"},\"ᾉ\":{\"ha\":1156,\"x_min\":-18,\"x_max\":1119,\"o\":\"m 322 510 l 279 371 l 553 371 l 510 510 q 463 662 485 586 q 418 817 440 738 l 413 817 q 369 662 392 738 q 322 510 347 586 m 44 0 l 353 911 l 483 911 l 792 0 l 668 0 l 582 278 l 250 278 l 163 0 l 44 0 m 136 640 q 78 659 106 647 q 28 689 50 671 q -6 733 7 707 q -18 797 -18 760 q 32 890 -18 858 q 174 924 82 921 l 186 858 q 99 836 128 856 q 71 785 71 817 q 94 726 71 747 q 149 693 117 706 l 136 640 m 1038 -17 q 937 24 967 -17 q 907 140 907 65 l 907 564 l 1022 564 q 1017 342 1019 451 q 1014 132 1014 232 q 1028 91 1014 104 q 1064 78 1042 78 q 1104 86 1081 78 l 1119 0 q 1085 -12 1104 -7 q 1038 -17 1067 -17 z \"},\"ᾊ\":{\"ha\":1350,\"x_min\":-17,\"x_max\":1315,\"o\":\"m 518 510 l 475 371 l 749 371 l 706 510 q 658 662 681 586 q 614 817 636 738 l 608 817 q 565 662 588 738 q 518 510 543 586 m 240 0 l 549 911 l 679 911 l 988 0 l 864 0 l 778 278 l 446 278 l 358 0 l 240 0 m 279 644 l 210 915 l 315 931 l 356 660 l 279 644 m 33 644 l 17 697 q 59 733 42 713 q 76 783 76 754 q -17 863 76 857 l -4 928 q 115 892 71 925 q 160 796 160 860 q 149 741 160 765 q 120 698 138 717 q 80 666 103 679 q 33 644 57 653 m 1233 -17 q 1133 24 1163 -17 q 1103 140 1103 65 l 1103 564 l 1218 564 q 1213 342 1215 451 q 1210 132 1210 232 q 1224 91 1210 104 q 1260 78 1238 78 q 1300 86 1276 78 l 1315 0 q 1281 -12 1300 -7 q 1233 -17 1263 -17 z \"},\"ᾋ\":{\"ha\":1344,\"x_min\":-18,\"x_max\":1310,\"o\":\"m 513 510 l 469 371 l 743 371 l 700 510 q 653 662 675 586 q 608 817 631 738 l 603 817 q 560 662 582 738 q 513 510 538 586 m 235 0 l 543 911 l 674 911 l 982 0 l 858 0 l 772 278 l 440 278 l 353 0 l 235 0 m 275 644 l 204 915 l 310 931 l 350 660 l 275 644 m 108 644 q 62 666 85 653 q 22 698 39 679 q -7 741 4 717 q -18 796 -18 765 q 26 892 -18 860 q 146 928 71 925 l 158 863 q 65 783 65 857 q 83 733 65 754 q 125 697 100 713 l 108 644 m 1228 -17 q 1127 24 1157 -17 q 1097 140 1097 65 l 1097 564 l 1213 564 q 1207 342 1210 451 q 1204 132 1204 232 q 1218 91 1204 104 q 1254 78 1232 78 q 1294 86 1271 78 l 1310 0 q 1276 -12 1294 -7 q 1228 -17 1257 -17 z \"},\"ᾌ\":{\"ha\":1344,\"x_min\":-17,\"x_max\":1308,\"o\":\"m 513 510 l 469 371 l 743 371 l 700 510 q 653 662 675 586 q 608 817 631 738 l 603 817 q 560 662 582 738 q 513 510 538 586 m 235 0 l 543 911 l 674 911 l 982 0 l 858 0 l 772 278 l 440 278 l 353 0 l 235 0 m 210 660 l 250 931 l 356 915 l 286 644 l 210 660 m 33 644 l 17 697 q 59 733 42 713 q 76 783 76 754 q -17 863 76 857 l -4 928 q 115 892 71 925 q 160 796 160 860 q 149 741 160 765 q 120 698 138 717 q 80 666 103 679 q 33 644 57 653 m 1226 -17 q 1126 24 1156 -17 q 1096 140 1096 65 l 1096 564 l 1211 564 q 1206 342 1208 451 q 1203 132 1203 232 q 1217 91 1203 104 q 1253 78 1231 78 q 1293 86 1269 78 l 1308 0 q 1274 -12 1293 -7 q 1226 -17 1256 -17 z \"},\"ᾍ\":{\"ha\":1339,\"x_min\":-18,\"x_max\":1303,\"o\":\"m 507 510 l 464 371 l 738 371 l 694 510 q 647 662 669 586 q 603 817 625 738 l 597 817 q 554 662 576 738 q 507 510 532 586 m 229 0 l 538 911 l 668 911 l 976 0 l 853 0 l 767 278 l 435 278 l 347 0 l 229 0 m 204 660 l 244 931 l 350 915 l 281 644 l 204 660 m 108 644 q 62 666 85 653 q 22 698 39 679 q -7 741 4 717 q -18 796 -18 765 q 26 892 -18 860 q 146 928 71 925 l 158 863 q 65 783 65 857 q 83 733 65 754 q 125 697 100 713 l 108 644 m 1221 -17 q 1120 24 1150 -17 q 1090 140 1090 65 l 1090 564 l 1206 564 q 1200 342 1203 451 q 1197 132 1197 232 q 1211 91 1197 104 q 1247 78 1225 78 q 1288 86 1264 78 l 1303 0 q 1269 -12 1288 -7 q 1221 -17 1250 -17 z \"},\"ᾎ\":{\"ha\":1211,\"x_min\":-33,\"x_max\":1175,\"o\":\"m 378 510 l 335 371 l 608 371 l 565 510 q 518 662 540 586 q 474 817 496 738 l 468 817 q 425 662 447 738 q 378 510 403 586 m 100 0 l 408 911 l 539 911 l 847 0 l 724 0 l 638 278 l 306 278 l 218 0 l 100 0 m -33 836 q -6 909 -28 885 q 63 933 17 933 q 105 926 88 933 q 137 909 122 918 q 165 892 151 900 q 194 885 178 885 q 222 893 211 885 q 236 928 233 901 l 294 919 q 267 847 289 871 q 199 822 244 822 q 156 830 174 822 q 124 847 139 838 q 97 863 110 856 q 67 871 83 871 q 39 863 50 871 q 25 828 28 854 l -33 836 m 93 610 l 82 656 q 124 672 107 663 q 140 696 140 682 q 118 726 140 715 q 44 740 96 738 l 54 794 q 179 772 136 792 q 222 708 222 751 q 183 642 222 665 q 93 610 143 619 m 1093 -17 q 992 24 1022 -17 q 963 140 963 65 l 963 564 l 1078 564 q 1072 342 1075 451 q 1069 132 1069 232 q 1083 91 1069 104 q 1119 78 1097 78 q 1160 86 1136 78 l 1175 0 q 1141 -12 1160 -7 q 1093 -17 1122 -17 z \"},\"ᾏ\":{\"ha\":1211,\"x_min\":-33,\"x_max\":1175,\"o\":\"m 378 510 l 335 371 l 608 371 l 565 510 q 518 662 540 586 q 474 817 496 738 l 468 817 q 425 662 447 738 q 378 510 403 586 m 100 0 l 408 911 l 539 911 l 847 0 l 724 0 l 638 278 l 306 278 l 218 0 l 100 0 m 168 610 q 119 622 143 614 q 78 642 96 631 q 49 671 60 654 q 38 708 38 688 q 81 772 38 751 q 207 794 125 792 l 217 740 q 143 726 165 738 q 121 696 121 715 q 137 672 121 682 q 179 656 153 663 l 168 610 m -33 836 q -6 909 -28 885 q 63 933 17 933 q 105 926 88 933 q 137 909 122 918 q 165 892 151 900 q 194 885 178 885 q 222 893 211 885 q 236 928 233 901 l 294 919 q 267 847 289 871 q 199 822 244 822 q 156 830 174 822 q 124 847 139 838 q 97 863 110 856 q 67 871 83 871 q 39 863 50 871 q 25 828 28 854 l -33 836 m 1093 -17 q 992 24 1022 -17 q 963 140 963 65 l 963 564 l 1078 564 q 1072 342 1075 451 q 1069 132 1069 232 q 1083 91 1069 104 q 1119 78 1097 78 q 1160 86 1136 78 l 1175 0 q 1141 -12 1160 -7 q 1093 -17 1122 -17 z \"},\"ῌ\":{\"ha\":1264,\"x_min\":125,\"x_max\":1229,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 529 l 664 529 l 664 911 l 781 911 l 781 0 l 664 0 l 664 429 l 240 429 l 240 0 l 125 0 m 1147 -17 q 1047 24 1076 -17 q 1017 140 1017 65 l 1017 564 l 1132 564 q 1126 342 1129 451 q 1124 132 1124 232 q 1138 91 1124 104 q 1174 78 1151 78 q 1214 86 1190 78 l 1229 0 q 1195 -12 1214 -7 q 1147 -17 1176 -17 z \"},\"ᾘ\":{\"ha\":1428,\"x_min\":-17,\"x_max\":1393,\"o\":\"m 289 0 l 289 911 l 404 911 l 404 529 l 828 529 l 828 911 l 944 911 l 944 0 l 828 0 l 828 429 l 404 429 l 404 0 l 289 0 m 33 640 l 21 693 q 76 726 53 706 q 99 785 99 747 q 70 836 99 817 q -17 858 42 856 l -4 924 q 138 890 88 921 q 188 797 188 858 q 175 733 188 760 q 141 689 163 707 q 92 659 119 671 q 33 640 64 647 m 1311 -17 q 1210 24 1240 -17 q 1181 140 1181 65 l 1181 564 l 1296 564 q 1290 342 1293 451 q 1288 132 1288 232 q 1301 91 1288 104 q 1338 78 1315 78 q 1378 86 1354 78 l 1393 0 q 1359 -12 1378 -7 q 1311 -17 1340 -17 z \"},\"ᾙ\":{\"ha\":1428,\"x_min\":-18,\"x_max\":1393,\"o\":\"m 289 0 l 289 911 l 404 911 l 404 529 l 828 529 l 828 911 l 944 911 l 944 0 l 828 0 l 828 429 l 404 429 l 404 0 l 289 0 m 136 640 q 78 659 106 647 q 28 689 50 671 q -6 733 7 707 q -18 797 -18 760 q 32 890 -18 858 q 174 924 82 921 l 186 858 q 99 836 128 856 q 71 785 71 817 q 94 726 71 747 q 149 693 117 706 l 136 640 m 1311 -17 q 1210 24 1240 -17 q 1181 140 1181 65 l 1181 564 l 1296 564 q 1290 342 1293 451 q 1288 132 1288 232 q 1301 91 1288 104 q 1338 78 1315 78 q 1378 86 1354 78 l 1393 0 q 1359 -12 1378 -7 q 1311 -17 1340 -17 z \"},\"ᾚ\":{\"ha\":1594,\"x_min\":-17,\"x_max\":1558,\"o\":\"m 454 0 l 454 911 l 569 911 l 569 529 l 993 529 l 993 911 l 1110 911 l 1110 0 l 993 0 l 993 429 l 569 429 l 569 0 l 454 0 m 279 644 l 210 915 l 315 931 l 356 660 l 279 644 m 33 644 l 17 697 q 59 733 42 713 q 76 783 76 754 q -17 863 76 857 l -4 928 q 115 892 71 925 q 160 796 160 860 q 149 741 160 765 q 120 698 138 717 q 80 666 103 679 q 33 644 57 653 m 1476 -17 q 1376 24 1406 -17 q 1346 140 1346 65 l 1346 564 l 1461 564 q 1456 342 1458 451 q 1453 132 1453 232 q 1467 91 1453 104 q 1503 78 1481 78 q 1543 86 1519 78 l 1558 0 q 1524 -12 1543 -7 q 1476 -17 1506 -17 z \"},\"ᾛ\":{\"ha\":1589,\"x_min\":-18,\"x_max\":1553,\"o\":\"m 450 0 l 450 911 l 565 911 l 565 529 l 989 529 l 989 911 l 1106 911 l 1106 0 l 989 0 l 989 429 l 565 429 l 565 0 l 450 0 m 275 644 l 204 915 l 310 931 l 350 660 l 275 644 m 108 644 q 62 666 85 653 q 22 698 39 679 q -7 741 4 717 q -18 796 -18 765 q 26 892 -18 860 q 146 928 71 925 l 158 863 q 65 783 65 857 q 83 733 65 754 q 125 697 100 713 l 108 644 m 1471 -17 q 1370 24 1400 -17 q 1340 140 1340 65 l 1340 564 l 1456 564 q 1450 342 1453 451 q 1447 132 1447 232 q 1461 91 1447 104 q 1497 78 1475 78 q 1538 86 1514 78 l 1553 0 q 1519 -12 1538 -7 q 1471 -17 1500 -17 z \"},\"ᾜ\":{\"ha\":1588,\"x_min\":-17,\"x_max\":1553,\"o\":\"m 449 0 l 449 911 l 564 911 l 564 529 l 988 529 l 988 911 l 1104 911 l 1104 0 l 988 0 l 988 429 l 564 429 l 564 0 l 449 0 m 210 660 l 250 931 l 356 915 l 286 644 l 210 660 m 33 644 l 17 697 q 59 733 42 713 q 76 783 76 754 q -17 863 76 857 l -4 928 q 115 892 71 925 q 160 796 160 860 q 149 741 160 765 q 120 698 138 717 q 80 666 103 679 q 33 644 57 653 m 1471 -17 q 1370 24 1400 -17 q 1340 140 1340 65 l 1340 564 l 1456 564 q 1450 342 1453 451 q 1447 132 1447 232 q 1461 91 1447 104 q 1497 78 1475 78 q 1538 86 1514 78 l 1553 0 q 1519 -12 1538 -7 q 1471 -17 1500 -17 z \"},\"ᾝ\":{\"ha\":1583,\"x_min\":-18,\"x_max\":1547,\"o\":\"m 443 0 l 443 911 l 558 911 l 558 529 l 982 529 l 982 911 l 1099 911 l 1099 0 l 982 0 l 982 429 l 558 429 l 558 0 l 443 0 m 204 660 l 244 931 l 350 915 l 281 644 l 204 660 m 108 644 q 62 666 85 653 q 22 698 39 679 q -7 741 4 717 q -18 796 -18 765 q 26 892 -18 860 q 146 928 71 925 l 158 863 q 65 783 65 857 q 83 733 65 754 q 125 697 100 713 l 108 644 m 1465 -17 q 1365 24 1394 -17 q 1335 140 1335 65 l 1335 564 l 1450 564 q 1444 342 1447 451 q 1442 132 1442 232 q 1456 91 1442 104 q 1492 78 1469 78 q 1532 86 1508 78 l 1547 0 q 1513 -12 1532 -7 q 1465 -17 1494 -17 z \"},\"ᾞ\":{\"ha\":1525,\"x_min\":-33,\"x_max\":1490,\"o\":\"m 386 0 l 386 911 l 501 911 l 501 529 l 925 529 l 925 911 l 1042 911 l 1042 0 l 925 0 l 925 429 l 501 429 l 501 0 l 386 0 m -33 836 q -6 909 -28 885 q 63 933 17 933 q 105 926 88 933 q 137 909 122 918 q 165 892 151 900 q 194 885 178 885 q 222 893 211 885 q 236 928 233 901 l 294 919 q 267 847 289 871 q 199 822 244 822 q 156 830 174 822 q 124 847 139 838 q 97 863 110 856 q 67 871 83 871 q 39 863 50 871 q 25 828 28 854 l -33 836 m 93 610 l 82 656 q 124 672 107 663 q 140 696 140 682 q 118 726 140 715 q 44 740 96 738 l 54 794 q 179 772 136 792 q 222 708 222 751 q 183 642 222 665 q 93 610 143 619 m 1408 -17 q 1308 24 1338 -17 q 1278 140 1278 65 l 1278 564 l 1393 564 q 1388 342 1390 451 q 1385 132 1385 232 q 1399 91 1385 104 q 1435 78 1413 78 q 1475 86 1451 78 l 1490 0 q 1456 -12 1475 -7 q 1408 -17 1438 -17 z \"},\"ᾟ\":{\"ha\":1525,\"x_min\":-33,\"x_max\":1490,\"o\":\"m 386 0 l 386 911 l 501 911 l 501 529 l 925 529 l 925 911 l 1042 911 l 1042 0 l 925 0 l 925 429 l 501 429 l 501 0 l 386 0 m 168 610 q 119 622 143 614 q 78 642 96 631 q 49 671 60 654 q 38 708 38 688 q 81 772 38 751 q 207 794 125 792 l 217 740 q 143 726 165 738 q 121 696 121 715 q 137 672 121 682 q 179 656 153 663 l 168 610 m -33 836 q -6 909 -28 885 q 63 933 17 933 q 105 926 88 933 q 137 909 122 918 q 165 892 151 900 q 194 885 178 885 q 222 893 211 885 q 236 928 233 901 l 294 919 q 267 847 289 871 q 199 822 244 822 q 156 830 174 822 q 124 847 139 838 q 97 863 110 856 q 67 871 83 871 q 39 863 50 871 q 25 828 28 854 l -33 836 m 1408 -17 q 1308 24 1338 -17 q 1278 140 1278 65 l 1278 564 l 1393 564 q 1388 342 1390 451 q 1385 132 1385 232 q 1399 91 1385 104 q 1435 78 1413 78 q 1475 86 1451 78 l 1490 0 q 1456 -12 1475 -7 q 1408 -17 1438 -17 z \"},\"ῼ\":{\"ha\":1299,\"x_min\":63,\"x_max\":1264,\"o\":\"m 63 0 l 63 94 l 244 94 l 244 100 q 186 167 215 129 q 134 254 157 206 q 97 360 111 303 q 82 488 82 418 q 110 664 82 583 q 188 803 138 744 q 310 895 239 863 q 471 928 382 928 q 631 895 560 928 q 754 803 703 863 q 833 664 806 744 q 861 488 861 583 q 847 360 861 418 q 809 254 832 303 q 756 167 786 206 q 697 100 726 129 l 697 94 l 879 94 l 879 0 l 556 0 l 556 85 q 628 154 594 115 q 688 242 663 193 q 727 349 713 290 q 742 481 742 408 q 723 617 742 554 q 669 727 704 681 q 585 800 635 774 q 471 826 535 826 q 357 800 407 826 q 272 727 307 774 q 219 617 238 681 q 201 481 201 554 q 215 349 201 408 q 254 242 229 290 q 313 154 279 193 q 386 85 347 115 l 386 0 l 63 0 m 1182 -17 q 1081 24 1111 -17 q 1051 140 1051 65 l 1051 564 l 1167 564 q 1161 342 1164 451 q 1158 132 1158 232 q 1172 91 1158 104 q 1208 78 1186 78 q 1249 86 1225 78 l 1264 0 q 1230 -12 1249 -7 q 1182 -17 1211 -17 z \"},\"ᾨ\":{\"ha\":1432,\"x_min\":-17,\"x_max\":1397,\"o\":\"m 197 0 l 197 94 l 379 94 l 379 100 q 321 167 350 129 q 269 254 292 206 q 231 360 246 303 q 217 488 217 418 q 244 664 217 583 q 323 803 272 744 q 445 895 374 863 q 606 928 517 928 q 766 895 694 928 q 889 803 838 863 q 968 664 940 744 q 996 488 996 583 q 981 360 996 418 q 944 254 967 303 q 891 167 921 206 q 832 100 861 129 l 832 94 l 1014 94 l 1014 0 l 690 0 l 690 85 q 763 154 729 115 q 822 242 797 193 q 862 349 847 290 q 876 481 876 408 q 858 617 876 554 q 804 727 839 681 q 719 800 769 774 q 606 826 669 826 q 492 800 542 826 q 407 727 442 774 q 354 617 372 681 q 336 481 336 554 q 350 349 336 408 q 389 242 364 290 q 448 154 414 193 q 521 85 482 115 l 521 0 l 197 0 m 33 640 l 21 693 q 76 726 53 706 q 99 785 99 747 q 70 836 99 817 q -17 858 42 856 l -4 924 q 138 890 88 921 q 188 797 188 858 q 175 733 188 760 q 141 689 163 707 q 92 659 119 671 q 33 640 64 647 m 1315 -17 q 1215 24 1244 -17 q 1185 140 1185 65 l 1185 564 l 1300 564 q 1294 342 1297 451 q 1292 132 1292 232 q 1306 91 1292 104 q 1342 78 1319 78 q 1382 86 1358 78 l 1397 0 q 1363 -12 1382 -7 q 1315 -17 1344 -17 z \"},\"ᾩ\":{\"ha\":1414,\"x_min\":-18,\"x_max\":1378,\"o\":\"m 178 0 l 178 94 l 360 94 l 360 100 q 301 167 331 129 q 249 254 272 206 q 212 360 226 303 q 197 488 197 418 q 225 664 197 583 q 303 803 253 744 q 426 895 354 863 q 586 928 497 928 q 747 895 675 928 q 869 803 818 863 q 949 664 921 744 q 976 488 976 583 q 962 360 976 418 q 924 254 947 303 q 872 167 901 206 q 813 100 842 129 l 813 94 l 994 94 l 994 0 l 671 0 l 671 85 q 744 154 710 115 q 803 242 778 193 q 842 349 828 290 q 857 481 857 408 q 838 617 857 554 q 785 727 819 681 q 700 800 750 774 q 586 826 650 826 q 472 800 522 826 q 388 727 422 774 q 335 617 353 681 q 317 481 317 554 q 331 349 317 408 q 369 242 344 290 q 428 154 394 193 q 501 85 463 115 l 501 0 l 178 0 m 136 640 q 78 659 106 647 q 28 689 50 671 q -6 733 7 707 q -18 797 -18 760 q 32 890 -18 858 q 174 924 82 921 l 186 858 q 99 836 128 856 q 71 785 71 817 q 94 726 71 747 q 149 693 117 706 l 136 640 m 1296 -17 q 1195 24 1225 -17 q 1165 140 1165 65 l 1165 564 l 1281 564 q 1275 342 1278 451 q 1272 132 1272 232 q 1286 91 1272 104 q 1322 78 1300 78 q 1363 86 1339 78 l 1378 0 q 1344 -12 1363 -7 q 1296 -17 1325 -17 z \"},\"ᾪ\":{\"ha\":1608,\"x_min\":-17,\"x_max\":1574,\"o\":\"m 374 0 l 374 94 l 556 94 l 556 100 q 497 167 526 129 q 445 254 468 206 q 408 360 422 303 q 393 488 393 418 q 421 664 393 583 q 499 803 449 744 q 622 895 550 863 q 782 928 693 928 q 942 895 871 928 q 1065 803 1014 863 q 1144 664 1117 744 q 1172 488 1172 583 q 1158 360 1172 418 q 1120 254 1143 303 q 1067 167 1097 206 q 1008 100 1038 129 l 1008 94 l 1190 94 l 1190 0 l 867 0 l 867 85 q 940 154 906 115 q 999 242 974 193 q 1038 349 1024 290 q 1053 481 1053 408 q 1034 617 1053 554 q 981 727 1015 681 q 896 800 946 774 q 782 826 846 826 q 668 800 718 826 q 583 727 618 774 q 531 617 549 681 q 513 481 513 554 q 526 349 513 408 q 565 242 540 290 q 624 154 590 193 q 697 85 658 115 l 697 0 l 374 0 m 279 644 l 210 915 l 315 931 l 356 660 l 279 644 m 33 644 l 17 697 q 59 733 42 713 q 76 783 76 754 q -17 863 76 857 l -4 928 q 115 892 71 925 q 160 796 160 860 q 149 741 160 765 q 120 698 138 717 q 80 666 103 679 q 33 644 57 653 m 1492 -17 q 1391 24 1421 -17 q 1361 140 1361 65 l 1361 564 l 1476 564 q 1471 342 1474 451 q 1468 132 1468 232 q 1482 91 1468 104 q 1518 78 1496 78 q 1558 86 1535 78 l 1574 0 q 1540 -12 1558 -7 q 1492 -17 1521 -17 z \"},\"ᾫ\":{\"ha\":1604,\"x_min\":-18,\"x_max\":1568,\"o\":\"m 368 0 l 368 94 l 550 94 l 550 100 q 492 167 521 129 q 440 254 463 206 q 402 360 417 303 q 388 488 388 418 q 415 664 388 583 q 494 803 443 744 q 616 895 544 863 q 776 928 688 928 q 937 895 865 928 q 1060 803 1008 863 q 1139 664 1111 744 q 1167 488 1167 583 q 1152 360 1167 418 q 1115 254 1138 303 q 1062 167 1092 206 q 1003 100 1032 129 l 1003 94 l 1185 94 l 1185 0 l 861 0 l 861 85 q 934 154 900 115 q 993 242 968 193 q 1033 349 1018 290 q 1047 481 1047 408 q 1028 617 1047 554 q 975 727 1010 681 q 890 800 940 774 q 776 826 840 826 q 663 800 713 826 q 578 727 613 774 q 525 617 543 681 q 507 481 507 554 q 521 349 507 408 q 560 242 535 290 q 619 154 585 193 q 692 85 653 115 l 692 0 l 368 0 m 275 644 l 204 915 l 310 931 l 350 660 l 275 644 m 108 644 q 62 666 85 653 q 22 698 39 679 q -7 741 4 717 q -18 796 -18 765 q 26 892 -18 860 q 146 928 71 925 l 158 863 q 65 783 65 857 q 83 733 65 754 q 125 697 100 713 l 108 644 m 1486 -17 q 1385 24 1415 -17 q 1356 140 1356 65 l 1356 564 l 1471 564 q 1465 342 1468 451 q 1463 132 1463 232 q 1476 91 1463 104 q 1513 78 1490 78 q 1553 86 1529 78 l 1568 0 q 1534 -12 1553 -7 q 1486 -17 1515 -17 z \"},\"ᾬ\":{\"ha\":1603,\"x_min\":-17,\"x_max\":1567,\"o\":\"m 367 0 l 367 94 l 549 94 l 549 100 q 490 167 519 129 q 438 254 461 206 q 401 360 415 303 q 386 488 386 418 q 414 664 386 583 q 492 803 442 744 q 615 895 543 863 q 775 928 686 928 q 935 895 864 928 q 1058 803 1007 863 q 1138 664 1110 744 q 1165 488 1165 583 q 1151 360 1165 418 q 1113 254 1136 303 q 1060 167 1090 206 q 1001 100 1031 129 l 1001 94 l 1183 94 l 1183 0 l 860 0 l 860 85 q 933 154 899 115 q 992 242 967 193 q 1031 349 1017 290 q 1046 481 1046 408 q 1027 617 1046 554 q 974 727 1008 681 q 889 800 939 774 q 775 826 839 826 q 661 800 711 826 q 576 727 611 774 q 524 617 542 681 q 506 481 506 554 q 519 349 506 408 q 558 242 533 290 q 617 154 583 193 q 690 85 651 115 l 690 0 l 367 0 m 210 660 l 250 931 l 356 915 l 286 644 l 210 660 m 33 644 l 17 697 q 59 733 42 713 q 76 783 76 754 q -17 863 76 857 l -4 928 q 115 892 71 925 q 160 796 160 860 q 149 741 160 765 q 120 698 138 717 q 80 666 103 679 q 33 644 57 653 m 1485 -17 q 1384 24 1414 -17 q 1354 140 1354 65 l 1354 564 l 1469 564 q 1464 342 1467 451 q 1461 132 1461 232 q 1475 91 1461 104 q 1511 78 1489 78 q 1551 86 1528 78 l 1567 0 q 1533 -12 1551 -7 q 1485 -17 1514 -17 z \"},\"ᾭ\":{\"ha\":1597,\"x_min\":-18,\"x_max\":1561,\"o\":\"m 363 0 l 363 94 l 544 94 l 544 100 q 486 167 515 129 q 434 254 457 206 q 397 360 411 303 q 382 488 382 418 q 410 664 382 583 q 488 803 438 744 q 610 895 539 863 q 771 928 682 928 q 931 895 860 928 q 1054 803 1003 863 q 1133 664 1106 744 q 1161 488 1161 583 q 1147 360 1161 418 q 1109 254 1132 303 q 1056 167 1086 206 q 997 100 1026 129 l 997 94 l 1179 94 l 1179 0 l 856 0 l 856 85 q 928 154 894 115 q 988 242 963 193 q 1027 349 1013 290 q 1042 481 1042 408 q 1023 617 1042 554 q 969 727 1004 681 q 885 800 935 774 q 771 826 835 826 q 657 800 707 826 q 572 727 607 774 q 519 617 538 681 q 501 481 501 554 q 515 349 501 408 q 554 242 529 290 q 613 154 579 193 q 686 85 647 115 l 686 0 l 363 0 m 204 660 l 244 931 l 350 915 l 281 644 l 204 660 m 108 644 q 62 666 85 653 q 22 698 39 679 q -7 741 4 717 q -18 796 -18 765 q 26 892 -18 860 q 146 928 71 925 l 158 863 q 65 783 65 857 q 83 733 65 754 q 125 697 100 713 l 108 644 m 1479 -17 q 1378 24 1408 -17 q 1349 140 1349 65 l 1349 564 l 1464 564 q 1458 342 1461 451 q 1456 132 1456 232 q 1469 91 1456 104 q 1506 78 1483 78 q 1546 86 1522 78 l 1561 0 q 1527 -12 1546 -7 q 1479 -17 1508 -17 z \"},\"ᾮ\":{\"ha\":1497,\"x_min\":-33,\"x_max\":1461,\"o\":\"m 258 0 l 258 94 l 440 94 l 440 100 q 382 167 411 129 q 330 254 353 206 q 292 360 307 303 q 278 488 278 418 q 306 664 278 583 q 384 803 333 744 q 506 895 435 863 q 667 928 578 928 q 827 895 756 928 q 950 803 899 863 q 1029 664 1001 744 q 1057 488 1057 583 q 1042 360 1057 418 q 1005 254 1028 303 q 952 167 982 206 q 893 100 922 129 l 893 94 l 1075 94 l 1075 0 l 751 0 l 751 85 q 824 154 790 115 q 883 242 858 193 q 923 349 908 290 q 938 481 938 408 q 919 617 938 554 q 865 727 900 681 q 781 800 831 774 q 667 826 731 826 q 553 800 603 826 q 468 727 503 774 q 415 617 433 681 q 397 481 397 554 q 411 349 397 408 q 450 242 425 290 q 509 154 475 193 q 582 85 543 115 l 582 0 l 258 0 m -33 836 q -6 909 -28 885 q 63 933 17 933 q 105 926 88 933 q 137 909 122 918 q 165 892 151 900 q 194 885 178 885 q 222 893 211 885 q 236 928 233 901 l 294 919 q 267 847 289 871 q 199 822 244 822 q 156 830 174 822 q 124 847 139 838 q 97 863 110 856 q 67 871 83 871 q 39 863 50 871 q 25 828 28 854 l -33 836 m 93 610 l 82 656 q 124 672 107 663 q 140 696 140 682 q 118 726 140 715 q 44 740 96 738 l 54 794 q 179 772 136 792 q 222 708 222 751 q 183 642 222 665 q 93 610 143 619 m 1379 -17 q 1278 24 1308 -17 q 1249 140 1249 65 l 1249 564 l 1364 564 q 1358 342 1361 451 q 1356 132 1356 232 q 1369 91 1356 104 q 1406 78 1383 78 q 1446 86 1422 78 l 1461 0 q 1427 -12 1446 -7 q 1379 -17 1408 -17 z \"},\"ᾯ\":{\"ha\":1497,\"x_min\":-33,\"x_max\":1461,\"o\":\"m 258 0 l 258 94 l 440 94 l 440 100 q 382 167 411 129 q 330 254 353 206 q 292 360 307 303 q 278 488 278 418 q 306 664 278 583 q 384 803 333 744 q 506 895 435 863 q 667 928 578 928 q 827 895 756 928 q 950 803 899 863 q 1029 664 1001 744 q 1057 488 1057 583 q 1042 360 1057 418 q 1005 254 1028 303 q 952 167 982 206 q 893 100 922 129 l 893 94 l 1075 94 l 1075 0 l 751 0 l 751 85 q 824 154 790 115 q 883 242 858 193 q 923 349 908 290 q 938 481 938 408 q 919 617 938 554 q 865 727 900 681 q 781 800 831 774 q 667 826 731 826 q 553 800 603 826 q 468 727 503 774 q 415 617 433 681 q 397 481 397 554 q 411 349 397 408 q 450 242 425 290 q 509 154 475 193 q 582 85 543 115 l 582 0 l 258 0 m 168 610 q 119 622 143 614 q 78 642 96 631 q 49 671 60 654 q 38 708 38 688 q 81 772 38 751 q 207 794 125 792 l 217 740 q 143 726 165 738 q 121 696 121 715 q 137 672 121 682 q 179 656 153 663 l 168 610 m -33 836 q -6 909 -28 885 q 63 933 17 933 q 105 926 88 933 q 137 909 122 918 q 165 892 151 900 q 194 885 178 885 q 222 893 211 885 q 236 928 233 901 l 294 919 q 267 847 289 871 q 199 822 244 822 q 156 830 174 822 q 124 847 139 838 q 97 863 110 856 q 67 871 83 871 q 39 863 50 871 q 25 828 28 854 l -33 836 m 1379 -17 q 1278 24 1308 -17 q 1249 140 1249 65 l 1249 564 l 1364 564 q 1358 342 1361 451 q 1356 132 1356 232 q 1369 91 1356 104 q 1406 78 1383 78 q 1446 86 1422 78 l 1461 0 q 1427 -12 1446 -7 q 1379 -17 1408 -17 z \"},\"ἀ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 350 808 l 338 864 q 393 887 371 872 q 415 929 415 901 q 300 994 415 989 l 307 1069 q 454 1034 403 1067 q 506 939 506 1001 q 492 887 506 908 q 458 849 479 865 q 408 824 436 833 q 350 808 381 814 z \"},\"ἁ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 439 797 q 381 812 408 803 q 331 836 353 821 q 297 873 310 851 q 283 925 283 894 q 335 1017 283 985 q 482 1051 386 1049 l 489 981 q 374 915 374 975 q 396 873 374 888 q 451 850 418 858 l 439 797 z \"},\"ὰ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 414 796 l 196 1008 l 276 1085 l 472 853 l 414 796 z \"},\"ά\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 375 796 l 317 853 l 513 1085 l 593 1008 l 375 796 z \"},\"ἂ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 228 801 l 214 854 q 260 876 242 861 q 279 919 279 892 q 178 979 279 974 l 183 1050 q 314 1018 265 1047 q 363 932 363 989 q 351 879 363 901 q 320 842 339 857 q 277 817 301 826 q 228 801 253 807 m 485 776 l 397 1050 l 500 1069 l 554 790 l 485 776 z \"},\"ἃ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 304 801 q 255 817 279 807 q 212 842 231 826 q 181 879 193 857 q 169 932 169 901 q 218 1018 169 989 q 349 1050 267 1047 l 354 979 q 253 919 253 974 q 271 876 253 892 q 317 854 289 861 l 304 801 m 476 776 l 388 1050 l 492 1069 l 544 790 l 476 776 z \"},\"ἄ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 228 801 l 214 854 q 260 876 242 861 q 279 919 279 892 q 178 979 279 974 l 183 1050 q 314 1018 265 1047 q 363 932 363 989 q 351 879 363 901 q 320 842 339 857 q 277 817 301 826 q 228 801 253 807 m 411 790 l 469 1069 l 572 1050 l 481 776 l 411 790 z \"},\"ἅ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 318 801 q 269 817 293 807 q 226 842 244 826 q 195 879 207 857 q 183 932 183 901 q 232 1018 183 989 q 363 1050 281 1047 l 368 979 q 267 919 267 974 q 285 876 267 892 q 331 854 303 861 l 318 801 m 401 790 l 461 1069 l 564 1050 l 471 776 l 401 790 z \"},\"ἆ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 199 999 q 228 1086 204 1051 q 304 1121 253 1121 q 358 1112 335 1121 q 402 1092 382 1103 q 441 1072 422 1081 q 479 1063 460 1063 q 510 1077 500 1063 q 525 1121 519 1092 l 590 1115 q 560 1028 585 1063 q 485 993 536 993 q 431 1002 454 993 q 387 1022 407 1011 q 348 1042 367 1033 q 310 1051 329 1051 q 279 1037 289 1051 q 264 993 269 1022 l 199 999 m 357 781 l 346 826 q 388 843 371 833 q 404 868 404 853 q 382 898 404 888 q 308 911 360 908 l 318 965 q 444 942 400 963 q 488 881 488 922 q 447 814 488 838 q 357 781 407 790 z \"},\"ἇ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 432 781 q 342 814 382 790 q 301 881 301 838 q 345 942 301 922 q 471 965 389 963 l 481 911 q 407 898 429 908 q 385 868 385 888 q 401 843 385 853 q 443 826 418 833 l 432 781 m 199 999 q 228 1086 204 1051 q 304 1121 253 1121 q 358 1112 335 1121 q 402 1092 382 1103 q 441 1072 422 1081 q 479 1063 460 1063 q 510 1077 500 1063 q 525 1121 519 1092 l 590 1115 q 560 1028 585 1063 q 485 993 536 993 q 431 1002 454 993 q 387 1022 407 1011 q 348 1042 367 1033 q 310 1051 329 1051 q 279 1037 289 1051 q 264 993 269 1022 l 199 999 z \"},\"ᾰ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 394 793 q 299 811 339 793 q 233 859 258 829 q 194 926 207 889 q 178 1003 181 964 l 249 1014 q 263 962 253 988 q 292 915 274 936 q 335 882 310 894 q 394 869 361 869 q 453 882 428 869 q 497 915 479 894 q 526 962 515 936 q 540 1014 536 988 l 611 1003 q 595 926 608 964 q 556 859 582 889 q 490 811 529 829 q 394 793 450 793 z \"},\"ᾱ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 210 835 l 210 914 l 579 914 l 579 835 l 210 835 z \"},\"ᾶ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 494 801 q 431 819 457 801 q 382 860 404 838 q 340 900 360 882 q 296 918 319 918 q 249 888 264 918 q 231 808 233 857 l 154 813 q 165 888 156 853 q 190 947 174 922 q 233 987 207 972 q 294 1001 258 1001 q 358 983 332 1001 q 407 943 385 965 q 449 903 429 921 q 494 885 469 885 q 540 915 525 885 q 558 994 556 946 l 635 989 q 624 915 633 949 q 599 856 615 881 q 556 816 582 831 q 494 801 531 801 z \"},\"ἐ\":{\"ha\":622,\"x_min\":64,\"x_max\":594,\"o\":\"m 349 -17 q 234 -3 286 -17 q 144 38 182 11 q 85 101 106 64 q 64 186 64 139 q 105 299 64 260 q 204 354 146 339 l 204 360 q 124 421 151 379 q 97 510 97 463 q 118 590 97 556 q 174 647 139 625 q 256 681 210 669 q 356 692 303 692 q 472 672 417 692 q 574 618 526 653 l 528 542 q 447 586 488 571 q 358 601 406 601 q 253 575 296 601 q 211 496 211 549 q 247 421 211 450 q 365 392 283 392 q 404 392 385 392 q 450 396 424 393 l 450 307 q 394 310 419 310 q 344 310 369 310 q 178 196 178 310 q 226 107 178 139 q 361 75 274 75 q 453 90 410 75 q 546 143 497 106 l 594 67 q 476 1 533 19 q 349 -17 419 -17 m 299 794 l 286 850 q 342 873 319 858 q 364 915 364 888 q 249 981 364 975 l 256 1056 q 403 1020 351 1053 q 454 925 454 988 q 441 873 454 894 q 406 835 428 851 q 357 810 385 819 q 299 794 329 800 z \"},\"ἑ\":{\"ha\":622,\"x_min\":64,\"x_max\":594,\"o\":\"m 349 -17 q 234 -3 286 -17 q 144 38 182 11 q 85 101 106 64 q 64 186 64 139 q 105 299 64 260 q 204 354 146 339 l 204 360 q 124 421 151 379 q 97 510 97 463 q 118 590 97 556 q 174 647 139 625 q 256 681 210 669 q 356 692 303 692 q 472 672 417 692 q 574 618 526 653 l 528 542 q 447 586 488 571 q 358 601 406 601 q 253 575 296 601 q 211 496 211 549 q 247 421 211 450 q 365 392 283 392 q 404 392 385 392 q 450 396 424 393 l 450 307 q 394 310 419 310 q 344 310 369 310 q 178 196 178 310 q 226 107 178 139 q 361 75 274 75 q 453 90 410 75 q 546 143 497 106 l 594 67 q 476 1 533 19 q 349 -17 419 -17 m 388 797 q 329 812 357 803 q 280 836 301 821 q 245 873 258 851 q 232 925 232 894 q 283 1017 232 985 q 431 1051 335 1049 l 438 981 q 322 915 322 975 q 344 873 322 888 q 400 850 367 858 l 388 797 z \"},\"ὲ\":{\"ha\":622,\"x_min\":64,\"x_max\":594,\"o\":\"m 349 -17 q 234 -3 286 -17 q 144 38 182 11 q 85 101 106 64 q 64 186 64 139 q 105 299 64 260 q 204 354 146 339 l 204 360 q 124 421 151 379 q 97 510 97 463 q 118 590 97 556 q 174 647 139 625 q 256 681 210 669 q 356 692 303 692 q 472 672 417 692 q 574 618 526 653 l 528 542 q 447 586 488 571 q 358 601 406 601 q 253 575 296 601 q 211 496 211 549 q 247 421 211 450 q 365 392 283 392 q 404 392 385 392 q 450 396 424 393 l 450 307 q 394 310 419 310 q 344 310 369 310 q 178 196 178 310 q 226 107 178 139 q 361 75 274 75 q 453 90 410 75 q 546 143 497 106 l 594 67 q 476 1 533 19 q 349 -17 419 -17 m 363 796 l 144 1008 l 225 1085 l 421 853 l 363 796 z \"},\"έ\":{\"ha\":622,\"x_min\":64,\"x_max\":594,\"o\":\"m 349 -17 q 234 -3 286 -17 q 144 38 182 11 q 85 101 106 64 q 64 186 64 139 q 105 299 64 260 q 204 354 146 339 l 204 360 q 124 421 151 379 q 97 510 97 463 q 118 590 97 556 q 174 647 139 625 q 256 681 210 669 q 356 692 303 692 q 472 672 417 692 q 574 618 526 653 l 528 542 q 447 586 488 571 q 358 601 406 601 q 253 575 296 601 q 211 496 211 549 q 247 421 211 450 q 365 392 283 392 q 404 392 385 392 q 450 396 424 393 l 450 307 q 394 310 419 310 q 344 310 369 310 q 178 196 178 310 q 226 107 178 139 q 361 75 274 75 q 453 90 410 75 q 546 143 497 106 l 594 67 q 476 1 533 19 q 349 -17 419 -17 m 324 796 l 265 853 l 461 1085 l 542 1008 l 324 796 z \"},\"ἒ\":{\"ha\":622,\"x_min\":64,\"x_max\":594,\"o\":\"m 349 -17 q 234 -3 286 -17 q 144 38 182 11 q 85 101 106 64 q 64 186 64 139 q 105 299 64 260 q 204 354 146 339 l 204 360 q 124 421 151 379 q 97 510 97 463 q 118 590 97 556 q 174 647 139 625 q 256 681 210 669 q 356 692 303 692 q 472 672 417 692 q 574 618 526 653 l 528 542 q 447 586 488 571 q 358 601 406 601 q 253 575 296 601 q 211 496 211 549 q 247 421 211 450 q 365 392 283 392 q 404 392 385 392 q 450 396 424 393 l 450 307 q 394 310 419 310 q 344 310 369 310 q 178 196 178 310 q 226 107 178 139 q 361 75 274 75 q 453 90 410 75 q 546 143 497 106 l 594 67 q 476 1 533 19 q 349 -17 419 -17 m 176 801 l 163 854 q 209 876 190 861 q 228 919 228 892 q 126 979 228 974 l 132 1050 q 263 1018 214 1047 q 311 932 311 989 q 299 879 311 901 q 269 842 288 857 q 226 817 250 826 q 176 801 201 807 m 433 776 l 346 1050 l 449 1069 l 503 790 l 433 776 z \"},\"ἓ\":{\"ha\":622,\"x_min\":64,\"x_max\":594,\"o\":\"m 349 -17 q 234 -3 286 -17 q 144 38 182 11 q 85 101 106 64 q 64 186 64 139 q 105 299 64 260 q 204 354 146 339 l 204 360 q 124 421 151 379 q 97 510 97 463 q 118 590 97 556 q 174 647 139 625 q 256 681 210 669 q 356 692 303 692 q 472 672 417 692 q 574 618 526 653 l 528 542 q 447 586 488 571 q 358 601 406 601 q 253 575 296 601 q 211 496 211 549 q 247 421 211 450 q 365 392 283 392 q 404 392 385 392 q 450 396 424 393 l 450 307 q 394 310 419 310 q 344 310 369 310 q 178 196 178 310 q 226 107 178 139 q 361 75 274 75 q 453 90 410 75 q 546 143 497 106 l 594 67 q 476 1 533 19 q 349 -17 419 -17 m 253 801 q 203 817 228 807 q 160 842 179 826 q 130 879 142 857 q 118 932 118 901 q 167 1018 118 989 q 297 1050 215 1047 l 303 979 q 201 919 201 974 q 219 876 201 892 q 265 854 238 861 l 253 801 m 425 776 l 336 1050 l 440 1069 l 493 790 l 425 776 z \"},\"ἔ\":{\"ha\":622,\"x_min\":64,\"x_max\":594,\"o\":\"m 349 -17 q 234 -3 286 -17 q 144 38 182 11 q 85 101 106 64 q 64 186 64 139 q 105 299 64 260 q 204 354 146 339 l 204 360 q 124 421 151 379 q 97 510 97 463 q 118 590 97 556 q 174 647 139 625 q 256 681 210 669 q 356 692 303 692 q 472 672 417 692 q 574 618 526 653 l 528 542 q 447 586 488 571 q 358 601 406 601 q 253 575 296 601 q 211 496 211 549 q 247 421 211 450 q 365 392 283 392 q 404 392 385 392 q 450 396 424 393 l 450 307 q 394 310 419 310 q 344 310 369 310 q 178 196 178 310 q 226 107 178 139 q 361 75 274 75 q 453 90 410 75 q 546 143 497 106 l 594 67 q 476 1 533 19 q 349 -17 419 -17 m 176 801 l 163 854 q 209 876 190 861 q 228 919 228 892 q 126 979 228 974 l 132 1050 q 263 1018 214 1047 q 311 932 311 989 q 299 879 311 901 q 269 842 288 857 q 226 817 250 826 q 176 801 201 807 m 360 790 l 418 1069 l 521 1050 l 429 776 l 360 790 z \"},\"ἕ\":{\"ha\":622,\"x_min\":64,\"x_max\":594,\"o\":\"m 349 -17 q 234 -3 286 -17 q 144 38 182 11 q 85 101 106 64 q 64 186 64 139 q 105 299 64 260 q 204 354 146 339 l 204 360 q 124 421 151 379 q 97 510 97 463 q 118 590 97 556 q 174 647 139 625 q 256 681 210 669 q 356 692 303 692 q 472 672 417 692 q 574 618 526 653 l 528 542 q 447 586 488 571 q 358 601 406 601 q 253 575 296 601 q 211 496 211 549 q 247 421 211 450 q 365 392 283 392 q 404 392 385 392 q 450 396 424 393 l 450 307 q 394 310 419 310 q 344 310 369 310 q 178 196 178 310 q 226 107 178 139 q 361 75 274 75 q 453 90 410 75 q 546 143 497 106 l 594 67 q 476 1 533 19 q 349 -17 419 -17 m 267 801 q 217 817 242 807 q 174 842 193 826 q 144 879 156 857 q 132 932 132 901 q 181 1018 132 989 q 311 1050 229 1047 l 317 979 q 215 919 215 974 q 233 876 215 892 q 279 854 251 861 l 267 801 m 350 790 l 410 1069 l 513 1050 l 419 776 l 350 790 z \"},\"ἠ\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 358 794 l 346 850 q 401 873 379 858 q 424 915 424 888 q 308 981 424 975 l 315 1056 q 463 1020 411 1053 q 514 925 514 988 q 501 873 514 894 q 466 835 488 851 q 417 810 444 819 q 358 794 389 800 z \"},\"ἡ\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 447 797 q 389 812 417 803 q 340 836 361 821 q 305 873 318 851 q 292 925 292 894 q 343 1017 292 985 q 490 1051 394 1049 l 497 981 q 382 915 382 975 q 404 873 382 888 q 460 850 426 858 l 447 797 z \"},\"ὴ\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 422 796 l 204 1008 l 285 1085 l 481 853 l 422 796 z \"},\"ή\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 383 796 l 325 853 l 521 1085 l 601 1008 l 383 796 z \"},\"ἢ\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 236 801 l 222 854 q 269 876 250 861 q 288 919 288 892 q 186 979 288 974 l 192 1050 q 322 1018 274 1047 q 371 932 371 989 q 359 879 371 901 q 328 842 347 857 q 285 817 310 826 q 236 801 261 807 m 493 776 l 406 1050 l 508 1069 l 563 790 l 493 776 z \"},\"ἣ\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 313 801 q 263 817 288 807 q 220 842 239 826 q 190 879 201 857 q 178 932 178 901 q 226 1018 178 989 q 357 1050 275 1047 l 363 979 q 261 919 261 974 q 279 876 261 892 q 325 854 297 861 l 313 801 m 485 776 l 396 1050 l 500 1069 l 553 790 l 485 776 z \"},\"ἤ\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 236 801 l 222 854 q 269 876 250 861 q 288 919 288 892 q 186 979 288 974 l 192 1050 q 322 1018 274 1047 q 371 932 371 989 q 359 879 371 901 q 328 842 347 857 q 285 817 310 826 q 236 801 261 807 m 419 790 l 478 1069 l 581 1050 l 489 776 l 419 790 z \"},\"ἥ\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 326 801 q 277 817 301 807 q 234 842 253 826 q 203 879 215 857 q 192 932 192 901 q 240 1018 192 989 q 371 1050 289 1047 l 376 979 q 275 919 275 974 q 293 876 275 892 q 339 854 311 861 l 326 801 m 410 790 l 469 1069 l 572 1050 l 479 776 l 410 790 z \"},\"ἦ\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 207 999 q 237 1086 213 1051 q 313 1121 261 1121 q 367 1112 343 1121 q 410 1092 390 1103 q 449 1072 431 1081 q 488 1063 468 1063 q 518 1077 508 1063 q 533 1121 528 1092 l 599 1115 q 569 1028 593 1063 q 493 993 544 993 q 439 1002 463 993 q 395 1022 415 1011 q 356 1042 375 1033 q 318 1051 338 1051 q 288 1037 297 1051 q 272 993 278 1022 l 207 999 m 365 781 l 354 826 q 396 843 379 833 q 413 868 413 853 q 390 898 413 888 q 317 911 368 908 l 326 965 q 452 942 408 963 q 496 881 496 922 q 456 814 496 838 q 365 781 415 790 z \"},\"ἧ\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 440 781 q 350 814 390 790 q 310 881 310 838 q 353 942 310 922 q 479 965 397 963 l 489 911 q 415 898 438 908 q 393 868 393 888 q 410 843 393 853 q 451 826 426 833 l 440 781 m 207 999 q 237 1086 213 1051 q 313 1121 261 1121 q 367 1112 343 1121 q 410 1092 390 1103 q 449 1072 431 1081 q 488 1063 468 1063 q 518 1077 508 1063 q 533 1121 528 1092 l 599 1115 q 569 1028 593 1063 q 493 993 544 993 q 439 1002 463 993 q 395 1022 415 1011 q 356 1042 375 1033 q 318 1051 338 1051 q 288 1037 297 1051 q 272 993 278 1022 l 207 999 z \"},\"ῆ\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 503 801 q 439 819 465 801 q 390 860 413 838 q 348 900 368 882 q 304 918 328 918 q 257 888 272 918 q 239 808 242 857 l 163 813 q 173 888 164 853 q 199 947 182 922 q 241 987 215 972 q 303 1001 267 1001 q 367 983 340 1001 q 415 943 393 965 q 458 903 438 921 q 503 885 478 885 q 549 915 533 885 q 567 994 564 946 l 643 989 q 633 915 642 949 q 607 856 624 881 q 565 816 590 831 q 503 801 539 801 z \"},\"ἰ\":{\"ha\":364,\"x_min\":78,\"x_max\":325,\"o\":\"m 243 -17 q 143 24 172 -17 q 114 140 114 65 l 114 675 l 229 675 q 224 396 226 538 q 221 132 221 254 q 268 78 221 78 q 310 86 285 78 l 325 0 q 290 -12 310 -7 q 243 -17 271 -17 m 128 808 l 115 864 q 171 887 149 872 q 193 929 193 901 q 78 994 193 989 l 85 1069 q 232 1034 181 1067 q 283 939 283 1001 q 270 887 283 908 q 235 849 257 865 q 186 824 214 833 q 128 808 158 814 z \"},\"ἱ\":{\"ha\":364,\"x_min\":61,\"x_max\":325,\"o\":\"m 243 -17 q 143 24 172 -17 q 114 140 114 65 l 114 675 l 229 675 q 224 396 226 538 q 221 132 221 254 q 268 78 221 78 q 310 86 285 78 l 325 0 q 290 -12 310 -7 q 243 -17 271 -17 m 217 797 q 158 812 186 803 q 109 836 131 821 q 74 873 88 851 q 61 925 61 894 q 113 1017 61 985 q 260 1051 164 1049 l 267 981 q 151 915 151 975 q 174 873 151 888 q 229 850 196 858 l 217 797 z \"},\"ὶ\":{\"ha\":364,\"x_min\":-26,\"x_max\":325,\"o\":\"m 243 -17 q 143 24 172 -17 q 114 140 114 65 l 114 675 l 229 675 q 224 396 226 538 q 221 132 221 254 q 268 78 221 78 q 310 86 285 78 l 325 0 q 290 -12 310 -7 q 243 -17 271 -17 m 192 796 l -26 1008 l 54 1085 l 250 853 l 192 796 z \"},\"ί\":{\"ha\":364,\"x_min\":94,\"x_max\":371,\"o\":\"m 243 -17 q 143 24 172 -17 q 114 140 114 65 l 114 675 l 229 675 q 224 396 226 538 q 221 132 221 254 q 268 78 221 78 q 310 86 285 78 l 325 0 q 290 -12 310 -7 q 243 -17 271 -17 m 153 796 l 94 853 l 290 1085 l 371 1008 l 153 796 z \"},\"ἲ\":{\"ha\":364,\"x_min\":-44,\"x_max\":332,\"o\":\"m 243 -17 q 143 24 172 -17 q 114 140 114 65 l 114 675 l 229 675 q 224 396 226 538 q 221 132 221 254 q 268 78 221 78 q 310 86 285 78 l 325 0 q 290 -12 310 -7 q 243 -17 271 -17 m 6 801 l -8 854 q 38 876 19 861 q 57 919 57 892 q -44 979 57 974 l -39 1050 q 92 1018 43 1047 q 140 932 140 989 q 128 879 140 901 q 98 842 117 857 q 55 817 79 826 q 6 801 31 807 m 263 776 l 175 1050 l 278 1069 l 332 790 l 263 776 z \"},\"ἳ\":{\"ha\":364,\"x_min\":-53,\"x_max\":325,\"o\":\"m 243 -17 q 143 24 172 -17 q 114 140 114 65 l 114 675 l 229 675 q 224 396 226 538 q 221 132 221 254 q 268 78 221 78 q 310 86 285 78 l 325 0 q 290 -12 310 -7 q 243 -17 271 -17 m 82 801 q 33 817 57 807 q -10 842 8 826 q -41 879 -29 857 q -53 932 -53 901 q -4 1018 -53 989 q 126 1050 44 1047 l 132 979 q 31 919 31 974 q 49 876 31 892 q 94 854 67 861 l 82 801 m 254 776 l 165 1050 l 269 1069 l 322 790 l 254 776 z \"},\"ἴ\":{\"ha\":364,\"x_min\":-44,\"x_max\":350,\"o\":\"m 243 -17 q 143 24 172 -17 q 114 140 114 65 l 114 675 l 229 675 q 224 396 226 538 q 221 132 221 254 q 268 78 221 78 q 310 86 285 78 l 325 0 q 290 -12 310 -7 q 243 -17 271 -17 m 6 801 l -8 854 q 38 876 19 861 q 57 919 57 892 q -44 979 57 974 l -39 1050 q 92 1018 43 1047 q 140 932 140 989 q 128 879 140 901 q 98 842 117 857 q 55 817 79 826 q 6 801 31 807 m 189 790 l 247 1069 l 350 1050 l 258 776 l 189 790 z \"},\"ἵ\":{\"ha\":364,\"x_min\":-39,\"x_max\":342,\"o\":\"m 243 -17 q 143 24 172 -17 q 114 140 114 65 l 114 675 l 229 675 q 224 396 226 538 q 221 132 221 254 q 268 78 221 78 q 310 86 285 78 l 325 0 q 290 -12 310 -7 q 243 -17 271 -17 m 96 801 q 47 817 71 807 q 3 842 22 826 q -27 879 -15 857 q -39 932 -39 901 q 10 1018 -39 989 q 140 1050 58 1047 l 146 979 q 44 919 44 974 q 63 876 44 892 q 108 854 81 861 l 96 801 m 179 790 l 239 1069 l 342 1050 l 249 776 l 179 790 z \"},\"ἶ\":{\"ha\":364,\"x_min\":-24,\"x_max\":368,\"o\":\"m 243 -17 q 143 24 172 -17 q 114 140 114 65 l 114 675 l 229 675 q 224 396 226 538 q 221 132 221 254 q 268 78 221 78 q 310 86 285 78 l 325 0 q 290 -12 310 -7 q 243 -17 271 -17 m -24 999 q 6 1086 -18 1051 q 82 1121 31 1121 q 136 1112 113 1121 q 180 1092 160 1103 q 219 1072 200 1081 q 257 1063 238 1063 q 288 1077 278 1063 q 303 1121 297 1092 l 368 1115 q 338 1028 363 1063 q 263 993 314 993 q 208 1002 232 993 q 165 1022 185 1011 q 126 1042 144 1033 q 88 1051 107 1051 q 57 1037 67 1051 q 42 993 47 1022 l -24 999 m 135 781 l 124 826 q 165 843 149 833 q 182 868 182 853 q 160 898 182 888 q 86 911 138 908 l 96 965 q 222 942 178 963 q 265 881 265 922 q 225 814 265 838 q 135 781 185 790 z \"},\"ἷ\":{\"ha\":364,\"x_min\":-24,\"x_max\":368,\"o\":\"m 243 -17 q 143 24 172 -17 q 114 140 114 65 l 114 675 l 229 675 q 224 396 226 538 q 221 132 221 254 q 268 78 221 78 q 310 86 285 78 l 325 0 q 290 -12 310 -7 q 243 -17 271 -17 m 210 781 q 119 814 160 790 q 79 881 79 838 q 123 942 79 922 q 249 965 167 963 l 258 911 q 185 898 207 908 q 163 868 163 888 q 179 843 163 853 q 221 826 196 833 l 210 781 m -24 999 q 6 1086 -18 1051 q 82 1121 31 1121 q 136 1112 113 1121 q 180 1092 160 1103 q 219 1072 200 1081 q 257 1063 238 1063 q 288 1077 278 1063 q 303 1121 297 1092 l 368 1115 q 338 1028 363 1063 q 263 993 314 993 q 208 1002 232 993 q 165 1022 185 1011 q 126 1042 144 1033 q 88 1051 107 1051 q 57 1037 67 1051 q 42 993 47 1022 l -24 999 z \"},\"ῐ\":{\"ha\":364,\"x_min\":-44,\"x_max\":389,\"o\":\"m 243 -17 q 143 24 172 -17 q 114 140 114 65 l 114 675 l 229 675 q 224 396 226 538 q 221 132 221 254 q 268 78 221 78 q 310 86 285 78 l 325 0 q 290 -12 310 -7 q 243 -17 271 -17 m 172 793 q 76 811 117 793 q 10 859 36 829 q -28 926 -15 889 q -44 1003 -42 964 l 26 1014 q 41 962 31 988 q 69 915 51 936 q 113 882 88 894 q 172 869 139 869 q 231 882 206 869 q 275 915 257 894 q 303 962 293 936 q 318 1014 314 988 l 389 1003 q 373 926 386 964 q 333 859 360 889 q 267 811 307 829 q 172 793 228 793 z \"},\"ῑ\":{\"ha\":364,\"x_min\":-12,\"x_max\":357,\"o\":\"m 243 -17 q 143 24 172 -17 q 114 140 114 65 l 114 675 l 229 675 q 224 396 226 538 q 221 132 221 254 q 268 78 221 78 q 310 86 285 78 l 325 0 q 290 -12 310 -7 q 243 -17 271 -17 m -12 835 l -12 914 l 357 914 l 357 835 l -12 835 z \"},\"ῖ\":{\"ha\":364,\"x_min\":-68,\"x_max\":413,\"o\":\"m 243 -17 q 143 24 172 -17 q 114 140 114 65 l 114 675 l 229 675 q 224 396 226 538 q 221 132 221 254 q 268 78 221 78 q 310 86 285 78 l 325 0 q 290 -12 310 -7 q 243 -17 271 -17 m 272 801 q 208 819 235 801 q 160 860 182 838 q 117 900 138 882 q 74 918 97 918 q 26 888 42 918 q 8 808 11 857 l -68 813 q -58 888 -67 853 q -32 947 -49 922 q 10 987 -15 972 q 72 1001 36 1001 q 136 983 110 1001 q 185 943 163 965 q 227 903 207 921 q 272 885 247 885 q 318 915 303 885 q 336 994 333 946 l 413 989 q 402 915 411 949 q 376 856 393 881 q 334 816 360 831 q 272 801 308 801 z \"},\"ῒ\":{\"ha\":364,\"x_min\":-43,\"x_max\":388,\"o\":\"m 243 -17 q 143 24 172 -17 q 114 140 114 65 l 114 675 l 229 675 q 224 396 226 538 q 221 132 221 254 q 268 78 221 78 q 310 86 285 78 l 325 0 q 290 -12 310 -7 q 243 -17 271 -17 m 15 826 q -26 842 -10 826 q -43 885 -43 858 q -26 927 -43 911 q 15 943 -10 943 q 56 927 39 943 q 72 885 72 911 q 56 842 72 858 q 15 826 39 826 m 168 782 l 79 1056 l 171 1075 l 228 796 l 168 782 m 329 826 q 289 842 306 826 q 272 885 272 858 q 289 927 272 911 q 329 943 306 943 q 371 927 354 943 q 388 885 388 911 q 371 842 388 858 q 329 826 354 826 z \"},\"ΐ\":{\"ha\":364,\"x_min\":-43,\"x_max\":388,\"o\":\"m 243 -17 q 143 24 172 -17 q 114 140 114 65 l 114 675 l 229 675 q 224 396 226 538 q 221 132 221 254 q 268 78 221 78 q 310 86 285 78 l 325 0 q 290 -12 310 -7 q 243 -17 271 -17 m 117 796 l 179 1075 l 271 1056 l 176 782 l 117 796 m 15 826 q -26 842 -10 826 q -43 885 -43 858 q -26 927 -43 911 q 15 943 -10 943 q 56 927 39 943 q 72 885 72 911 q 56 842 72 858 q 15 826 39 826 m 329 826 q 289 842 306 826 q 272 885 272 858 q 289 927 272 911 q 329 943 306 943 q 371 927 354 943 q 388 885 388 911 q 371 842 388 858 q 329 826 354 826 z \"},\"ῗ\":{\"ha\":364,\"x_min\":-40,\"x_max\":385,\"o\":\"m 243 -17 q 143 24 172 -17 q 114 140 114 65 l 114 675 l 229 675 q 224 396 226 538 q 221 132 221 254 q 268 78 221 78 q 310 86 285 78 l 325 0 q 290 -12 310 -7 q 243 -17 271 -17 m -40 992 q -8 1083 -37 1046 q 74 1119 21 1119 q 135 1109 110 1119 q 181 1085 160 1099 q 221 1062 201 1072 q 265 1051 240 1051 q 306 1067 289 1051 q 326 1115 322 1083 l 385 1110 q 353 1019 382 1056 q 271 982 324 982 q 210 992 235 982 q 164 1016 185 1003 q 124 1040 143 1029 q 79 1050 104 1050 q 39 1034 56 1050 q 18 986 22 1018 l -40 992 m 39 817 q -7 835 11 817 q -25 879 -25 853 q -7 925 -25 907 q 39 943 11 943 q 84 925 67 943 q 101 879 101 907 q 84 835 101 853 q 39 817 67 817 m 306 817 q 260 835 278 817 q 243 879 243 853 q 260 925 243 907 q 306 943 278 943 q 351 925 333 943 q 369 879 369 907 q 351 835 369 853 q 306 817 333 817 z \"},\"ὀ\":{\"ha\":743,\"x_min\":64,\"x_max\":679,\"o\":\"m 371 -17 q 252 7 308 -17 q 154 76 196 31 q 88 186 113 121 q 64 336 64 251 q 88 488 64 421 q 154 599 113 554 q 252 668 196 644 q 371 692 308 692 q 491 668 435 692 q 589 599 547 644 q 655 488 631 554 q 679 336 679 421 q 655 186 679 251 q 589 76 631 121 q 491 7 547 31 q 371 -17 435 -17 m 371 78 q 511 148 461 78 q 561 336 561 218 q 511 526 561 454 q 371 597 461 597 q 231 526 281 597 q 182 336 182 454 q 231 148 182 218 q 371 78 281 78 m 328 808 l 315 864 q 371 887 349 872 q 393 929 393 901 q 278 994 393 989 l 285 1069 q 432 1034 381 1067 q 483 939 483 1001 q 470 887 483 908 q 435 849 457 865 q 386 824 414 833 q 328 808 358 814 z \"},\"ὁ\":{\"ha\":743,\"x_min\":64,\"x_max\":679,\"o\":\"m 371 -17 q 252 7 308 -17 q 154 76 196 31 q 88 186 113 121 q 64 336 64 251 q 88 488 64 421 q 154 599 113 554 q 252 668 196 644 q 371 692 308 692 q 491 668 435 692 q 589 599 547 644 q 655 488 631 554 q 679 336 679 421 q 655 186 679 251 q 589 76 631 121 q 491 7 547 31 q 371 -17 435 -17 m 371 78 q 511 148 461 78 q 561 336 561 218 q 511 526 561 454 q 371 597 461 597 q 231 526 281 597 q 182 336 182 454 q 231 148 182 218 q 371 78 281 78 m 417 797 q 358 812 386 803 q 309 836 331 821 q 274 873 288 851 q 261 925 261 894 q 313 1017 261 985 q 460 1051 364 1049 l 467 981 q 351 915 351 975 q 374 873 351 888 q 429 850 396 858 l 417 797 z \"},\"ὸ\":{\"ha\":743,\"x_min\":64,\"x_max\":679,\"o\":\"m 371 -17 q 252 7 308 -17 q 154 76 196 31 q 88 186 113 121 q 64 336 64 251 q 88 488 64 421 q 154 599 113 554 q 252 668 196 644 q 371 692 308 692 q 491 668 435 692 q 589 599 547 644 q 655 488 631 554 q 679 336 679 421 q 655 186 679 251 q 589 76 631 121 q 491 7 547 31 q 371 -17 435 -17 m 371 78 q 511 148 461 78 q 561 336 561 218 q 511 526 561 454 q 371 597 461 597 q 231 526 281 597 q 182 336 182 454 q 231 148 182 218 q 371 78 281 78 m 392 796 l 174 1008 l 254 1085 l 450 853 l 392 796 z \"},\"ό\":{\"ha\":743,\"x_min\":64,\"x_max\":679,\"o\":\"m 371 -17 q 252 7 308 -17 q 154 76 196 31 q 88 186 113 121 q 64 336 64 251 q 88 488 64 421 q 154 599 113 554 q 252 668 196 644 q 371 692 308 692 q 491 668 435 692 q 589 599 547 644 q 655 488 631 554 q 679 336 679 421 q 655 186 679 251 q 589 76 631 121 q 491 7 547 31 q 371 -17 435 -17 m 371 78 q 511 148 461 78 q 561 336 561 218 q 511 526 561 454 q 371 597 461 597 q 231 526 281 597 q 182 336 182 454 q 231 148 182 218 q 371 78 281 78 m 353 796 l 294 853 l 490 1085 l 571 1008 l 353 796 z \"},\"ὂ\":{\"ha\":743,\"x_min\":64,\"x_max\":679,\"o\":\"m 371 -17 q 252 7 308 -17 q 154 76 196 31 q 88 186 113 121 q 64 336 64 251 q 88 488 64 421 q 154 599 113 554 q 252 668 196 644 q 371 692 308 692 q 491 668 435 692 q 589 599 547 644 q 655 488 631 554 q 679 336 679 421 q 655 186 679 251 q 589 76 631 121 q 491 7 547 31 q 371 -17 435 -17 m 371 78 q 511 148 461 78 q 561 336 561 218 q 511 526 561 454 q 371 597 461 597 q 231 526 281 597 q 182 336 182 454 q 231 148 182 218 q 371 78 281 78 m 206 801 l 192 854 q 238 876 219 861 q 257 919 257 892 q 156 979 257 974 l 161 1050 q 292 1018 243 1047 q 340 932 340 989 q 328 879 340 901 q 298 842 317 857 q 255 817 279 826 q 206 801 231 807 m 463 776 l 375 1050 l 478 1069 l 532 790 l 463 776 z \"},\"ὃ\":{\"ha\":743,\"x_min\":64,\"x_max\":679,\"o\":\"m 371 -17 q 252 7 308 -17 q 154 76 196 31 q 88 186 113 121 q 64 336 64 251 q 88 488 64 421 q 154 599 113 554 q 252 668 196 644 q 371 692 308 692 q 491 668 435 692 q 589 599 547 644 q 655 488 631 554 q 679 336 679 421 q 655 186 679 251 q 589 76 631 121 q 491 7 547 31 q 371 -17 435 -17 m 371 78 q 511 148 461 78 q 561 336 561 218 q 511 526 561 454 q 371 597 461 597 q 231 526 281 597 q 182 336 182 454 q 231 148 182 218 q 371 78 281 78 m 282 801 q 233 817 257 807 q 190 842 208 826 q 159 879 171 857 q 147 932 147 901 q 196 1018 147 989 q 326 1050 244 1047 l 332 979 q 231 919 231 974 q 249 876 231 892 q 294 854 267 861 l 282 801 m 454 776 l 365 1050 l 469 1069 l 522 790 l 454 776 z \"},\"ὄ\":{\"ha\":743,\"x_min\":64,\"x_max\":679,\"o\":\"m 371 -17 q 252 7 308 -17 q 154 76 196 31 q 88 186 113 121 q 64 336 64 251 q 88 488 64 421 q 154 599 113 554 q 252 668 196 644 q 371 692 308 692 q 491 668 435 692 q 589 599 547 644 q 655 488 631 554 q 679 336 679 421 q 655 186 679 251 q 589 76 631 121 q 491 7 547 31 q 371 -17 435 -17 m 371 78 q 511 148 461 78 q 561 336 561 218 q 511 526 561 454 q 371 597 461 597 q 231 526 281 597 q 182 336 182 454 q 231 148 182 218 q 371 78 281 78 m 206 801 l 192 854 q 238 876 219 861 q 257 919 257 892 q 156 979 257 974 l 161 1050 q 292 1018 243 1047 q 340 932 340 989 q 328 879 340 901 q 298 842 317 857 q 255 817 279 826 q 206 801 231 807 m 389 790 l 447 1069 l 550 1050 l 458 776 l 389 790 z \"},\"ὅ\":{\"ha\":743,\"x_min\":64,\"x_max\":679,\"o\":\"m 371 -17 q 252 7 308 -17 q 154 76 196 31 q 88 186 113 121 q 64 336 64 251 q 88 488 64 421 q 154 599 113 554 q 252 668 196 644 q 371 692 308 692 q 491 668 435 692 q 589 599 547 644 q 655 488 631 554 q 679 336 679 421 q 655 186 679 251 q 589 76 631 121 q 491 7 547 31 q 371 -17 435 -17 m 371 78 q 511 148 461 78 q 561 336 561 218 q 511 526 561 454 q 371 597 461 597 q 231 526 281 597 q 182 336 182 454 q 231 148 182 218 q 371 78 281 78 m 296 801 q 247 817 271 807 q 203 842 222 826 q 173 879 185 857 q 161 932 161 901 q 210 1018 161 989 q 340 1050 258 1047 l 346 979 q 244 919 244 974 q 263 876 244 892 q 308 854 281 861 l 296 801 m 379 790 l 439 1069 l 542 1050 l 449 776 l 379 790 z \"},\"ῤ\":{\"ha\":763,\"x_min\":108,\"x_max\":697,\"o\":\"m 108 -249 l 108 344 q 132 497 108 432 q 196 606 156 563 q 290 670 236 649 q 406 692 344 692 q 623 600 549 692 q 697 347 697 508 q 674 194 697 261 q 611 79 650 126 q 522 8 572 32 q 419 -17 472 -17 q 314 4 365 -17 q 215 79 263 25 q 218 -6 217 33 q 220 -85 219 -46 q 222 -164 221 -124 q 224 -249 224 -204 l 108 -249 m 399 79 q 469 98 436 79 q 526 151 501 117 q 565 235 551 185 q 579 347 579 285 q 569 449 579 403 q 537 527 558 494 q 482 578 515 560 q 401 596 449 596 q 331 580 364 596 q 272 533 297 564 q 233 454 247 501 q 218 343 218 407 l 218 171 q 310 97 265 114 q 399 79 354 79 m 361 808 l 349 864 q 404 887 382 872 q 426 929 426 901 q 311 994 426 989 l 318 1069 q 465 1034 414 1067 q 517 939 517 1001 q 503 887 517 908 q 469 849 490 865 q 419 824 447 833 q 361 808 392 814 z \"},\"ῥ\":{\"ha\":763,\"x_min\":108,\"x_max\":697,\"o\":\"m 108 -249 l 108 344 q 132 497 108 432 q 196 606 156 563 q 290 670 236 649 q 406 692 344 692 q 623 600 549 692 q 697 347 697 508 q 674 194 697 261 q 611 79 650 126 q 522 8 572 32 q 419 -17 472 -17 q 314 4 365 -17 q 215 79 263 25 q 218 -6 217 33 q 220 -85 219 -46 q 222 -164 221 -124 q 224 -249 224 -204 l 108 -249 m 399 79 q 469 98 436 79 q 526 151 501 117 q 565 235 551 185 q 579 347 579 285 q 569 449 579 403 q 537 527 558 494 q 482 578 515 560 q 401 596 449 596 q 331 580 364 596 q 272 533 297 564 q 233 454 247 501 q 218 343 218 407 l 218 171 q 310 97 265 114 q 399 79 354 79 m 450 797 q 392 812 419 803 q 342 836 364 821 q 308 873 321 851 q 294 925 294 894 q 346 1017 294 985 q 493 1051 397 1049 l 500 981 q 385 915 385 975 q 407 873 385 888 q 463 850 429 858 l 450 797 z \"},\"ὐ\":{\"ha\":708,\"x_min\":83,\"x_max\":632,\"o\":\"m 346 -17 q 156 49 224 -17 q 89 250 89 115 q 92 370 89 311 q 94 490 94 429 q 92 576 94 531 q 83 675 90 622 l 194 675 q 203 601 201 639 q 206 518 206 563 q 204 455 206 489 q 201 384 203 421 q 199 311 200 347 q 197 244 197 275 q 209 167 197 199 q 242 116 221 136 q 290 87 263 96 q 347 78 317 78 q 469 140 421 78 q 517 333 517 201 q 505 492 517 411 q 461 665 493 572 l 572 692 q 617 516 601 604 q 632 338 632 428 q 611 185 632 251 q 553 74 590 119 q 463 6 515 29 q 346 -17 410 -17 m 294 808 l 282 864 q 338 887 315 872 q 360 929 360 901 q 244 994 360 989 l 251 1069 q 399 1034 347 1067 q 450 939 450 1001 q 437 887 450 908 q 402 849 424 865 q 353 824 381 833 q 294 808 325 814 z \"},\"ὑ\":{\"ha\":708,\"x_min\":83,\"x_max\":632,\"o\":\"m 346 -17 q 156 49 224 -17 q 89 250 89 115 q 92 370 89 311 q 94 490 94 429 q 92 576 94 531 q 83 675 90 622 l 194 675 q 203 601 201 639 q 206 518 206 563 q 204 455 206 489 q 201 384 203 421 q 199 311 200 347 q 197 244 197 275 q 209 167 197 199 q 242 116 221 136 q 290 87 263 96 q 347 78 317 78 q 469 140 421 78 q 517 333 517 201 q 505 492 517 411 q 461 665 493 572 l 572 692 q 617 516 601 604 q 632 338 632 428 q 611 185 632 251 q 553 74 590 119 q 463 6 515 29 q 346 -17 410 -17 m 383 797 q 325 812 353 803 q 276 836 297 821 q 241 873 254 851 q 228 925 228 894 q 279 1017 228 985 q 426 1051 331 1049 l 433 981 q 318 915 318 975 q 340 873 318 888 q 396 850 363 858 l 383 797 z \"},\"ὺ\":{\"ha\":708,\"x_min\":83,\"x_max\":632,\"o\":\"m 346 -17 q 156 49 224 -17 q 89 250 89 115 q 92 370 89 311 q 94 490 94 429 q 92 576 94 531 q 83 675 90 622 l 194 675 q 203 601 201 639 q 206 518 206 563 q 204 455 206 489 q 201 384 203 421 q 199 311 200 347 q 197 244 197 275 q 209 167 197 199 q 242 116 221 136 q 290 87 263 96 q 347 78 317 78 q 469 140 421 78 q 517 333 517 201 q 505 492 517 411 q 461 665 493 572 l 572 692 q 617 516 601 604 q 632 338 632 428 q 611 185 632 251 q 553 74 590 119 q 463 6 515 29 q 346 -17 410 -17 m 358 796 l 140 1008 l 221 1085 l 417 853 l 358 796 z \"},\"ύ\":{\"ha\":708,\"x_min\":83,\"x_max\":632,\"o\":\"m 346 -17 q 156 49 224 -17 q 89 250 89 115 q 92 370 89 311 q 94 490 94 429 q 92 576 94 531 q 83 675 90 622 l 194 675 q 203 601 201 639 q 206 518 206 563 q 204 455 206 489 q 201 384 203 421 q 199 311 200 347 q 197 244 197 275 q 209 167 197 199 q 242 116 221 136 q 290 87 263 96 q 347 78 317 78 q 469 140 421 78 q 517 333 517 201 q 505 492 517 411 q 461 665 493 572 l 572 692 q 617 516 601 604 q 632 338 632 428 q 611 185 632 251 q 553 74 590 119 q 463 6 515 29 q 346 -17 410 -17 m 319 796 l 261 853 l 457 1085 l 538 1008 l 319 796 z \"},\"ὒ\":{\"ha\":708,\"x_min\":83,\"x_max\":632,\"o\":\"m 346 -17 q 156 49 224 -17 q 89 250 89 115 q 92 370 89 311 q 94 490 94 429 q 92 576 94 531 q 83 675 90 622 l 194 675 q 203 601 201 639 q 206 518 206 563 q 204 455 206 489 q 201 384 203 421 q 199 311 200 347 q 197 244 197 275 q 209 167 197 199 q 242 116 221 136 q 290 87 263 96 q 347 78 317 78 q 469 140 421 78 q 517 333 517 201 q 505 492 517 411 q 461 665 493 572 l 572 692 q 617 516 601 604 q 632 338 632 428 q 611 185 632 251 q 553 74 590 119 q 463 6 515 29 q 346 -17 410 -17 m 172 801 l 158 854 q 205 876 186 861 q 224 919 224 892 q 122 979 224 974 l 128 1050 q 258 1018 210 1047 q 307 932 307 989 q 295 879 307 901 q 265 842 283 857 q 222 817 246 826 q 172 801 197 807 m 429 776 l 342 1050 l 444 1069 l 499 790 l 429 776 z \"},\"ὓ\":{\"ha\":708,\"x_min\":83,\"x_max\":632,\"o\":\"m 346 -17 q 156 49 224 -17 q 89 250 89 115 q 92 370 89 311 q 94 490 94 429 q 92 576 94 531 q 83 675 90 622 l 194 675 q 203 601 201 639 q 206 518 206 563 q 204 455 206 489 q 201 384 203 421 q 199 311 200 347 q 197 244 197 275 q 209 167 197 199 q 242 116 221 136 q 290 87 263 96 q 347 78 317 78 q 469 140 421 78 q 517 333 517 201 q 505 492 517 411 q 461 665 493 572 l 572 692 q 617 516 601 604 q 632 338 632 428 q 611 185 632 251 q 553 74 590 119 q 463 6 515 29 q 346 -17 410 -17 m 249 801 q 199 817 224 807 q 156 842 175 826 q 126 879 138 857 q 114 932 114 901 q 163 1018 114 989 q 293 1050 211 1047 l 299 979 q 197 919 197 974 q 215 876 197 892 q 261 854 233 861 l 249 801 m 421 776 l 332 1050 l 436 1069 l 489 790 l 421 776 z \"},\"ὔ\":{\"ha\":708,\"x_min\":83,\"x_max\":632,\"o\":\"m 346 -17 q 156 49 224 -17 q 89 250 89 115 q 92 370 89 311 q 94 490 94 429 q 92 576 94 531 q 83 675 90 622 l 194 675 q 203 601 201 639 q 206 518 206 563 q 204 455 206 489 q 201 384 203 421 q 199 311 200 347 q 197 244 197 275 q 209 167 197 199 q 242 116 221 136 q 290 87 263 96 q 347 78 317 78 q 469 140 421 78 q 517 333 517 201 q 505 492 517 411 q 461 665 493 572 l 572 692 q 617 516 601 604 q 632 338 632 428 q 611 185 632 251 q 553 74 590 119 q 463 6 515 29 q 346 -17 410 -17 m 172 801 l 158 854 q 205 876 186 861 q 224 919 224 892 q 122 979 224 974 l 128 1050 q 258 1018 210 1047 q 307 932 307 989 q 295 879 307 901 q 265 842 283 857 q 222 817 246 826 q 172 801 197 807 m 356 790 l 414 1069 l 517 1050 l 425 776 l 356 790 z \"},\"ὕ\":{\"ha\":708,\"x_min\":83,\"x_max\":632,\"o\":\"m 346 -17 q 156 49 224 -17 q 89 250 89 115 q 92 370 89 311 q 94 490 94 429 q 92 576 94 531 q 83 675 90 622 l 194 675 q 203 601 201 639 q 206 518 206 563 q 204 455 206 489 q 201 384 203 421 q 199 311 200 347 q 197 244 197 275 q 209 167 197 199 q 242 116 221 136 q 290 87 263 96 q 347 78 317 78 q 469 140 421 78 q 517 333 517 201 q 505 492 517 411 q 461 665 493 572 l 572 692 q 617 516 601 604 q 632 338 632 428 q 611 185 632 251 q 553 74 590 119 q 463 6 515 29 q 346 -17 410 -17 m 263 801 q 213 817 238 807 q 170 842 189 826 q 140 879 151 857 q 128 932 128 901 q 176 1018 128 989 q 307 1050 225 1047 l 313 979 q 211 919 211 974 q 229 876 211 892 q 275 854 247 861 l 263 801 m 346 790 l 406 1069 l 508 1050 l 415 776 l 346 790 z \"},\"ὖ\":{\"ha\":708,\"x_min\":83,\"x_max\":632,\"o\":\"m 346 -17 q 156 49 224 -17 q 89 250 89 115 q 92 370 89 311 q 94 490 94 429 q 92 576 94 531 q 83 675 90 622 l 194 675 q 203 601 201 639 q 206 518 206 563 q 204 455 206 489 q 201 384 203 421 q 199 311 200 347 q 197 244 197 275 q 209 167 197 199 q 242 116 221 136 q 290 87 263 96 q 347 78 317 78 q 469 140 421 78 q 517 333 517 201 q 505 492 517 411 q 461 665 493 572 l 572 692 q 617 516 601 604 q 632 338 632 428 q 611 185 632 251 q 553 74 590 119 q 463 6 515 29 q 346 -17 410 -17 m 143 999 q 173 1086 149 1051 q 249 1121 197 1121 q 303 1112 279 1121 q 347 1092 326 1103 q 385 1072 367 1081 q 424 1063 404 1063 q 454 1077 444 1063 q 469 1121 464 1092 l 535 1115 q 505 1028 529 1063 q 429 993 481 993 q 375 1002 399 993 q 331 1022 351 1011 q 292 1042 311 1033 q 254 1051 274 1051 q 224 1037 233 1051 q 208 993 214 1022 l 143 999 m 301 781 l 290 826 q 332 843 315 833 q 349 868 349 853 q 326 898 349 888 q 253 911 304 908 l 263 965 q 388 942 344 963 q 432 881 432 922 q 392 814 432 838 q 301 781 351 790 z \"},\"ὗ\":{\"ha\":708,\"x_min\":83,\"x_max\":632,\"o\":\"m 346 -17 q 156 49 224 -17 q 89 250 89 115 q 92 370 89 311 q 94 490 94 429 q 92 576 94 531 q 83 675 90 622 l 194 675 q 203 601 201 639 q 206 518 206 563 q 204 455 206 489 q 201 384 203 421 q 199 311 200 347 q 197 244 197 275 q 209 167 197 199 q 242 116 221 136 q 290 87 263 96 q 347 78 317 78 q 469 140 421 78 q 517 333 517 201 q 505 492 517 411 q 461 665 493 572 l 572 692 q 617 516 601 604 q 632 338 632 428 q 611 185 632 251 q 553 74 590 119 q 463 6 515 29 q 346 -17 410 -17 m 376 781 q 286 814 326 790 q 246 881 246 838 q 290 942 246 922 q 415 965 333 963 l 425 911 q 351 898 374 908 q 329 868 329 888 q 346 843 329 853 q 388 826 363 833 l 376 781 m 143 999 q 173 1086 149 1051 q 249 1121 197 1121 q 303 1112 279 1121 q 347 1092 326 1103 q 385 1072 367 1081 q 424 1063 404 1063 q 454 1077 444 1063 q 469 1121 464 1092 l 535 1115 q 505 1028 529 1063 q 429 993 481 993 q 375 1002 399 993 q 331 1022 351 1011 q 292 1042 311 1033 q 254 1051 274 1051 q 224 1037 233 1051 q 208 993 214 1022 l 143 999 z \"},\"ῦ\":{\"ha\":708,\"x_min\":83,\"x_max\":632,\"o\":\"m 346 -17 q 156 49 224 -17 q 89 250 89 115 q 92 370 89 311 q 94 490 94 429 q 92 576 94 531 q 83 675 90 622 l 194 675 q 203 601 201 639 q 206 518 206 563 q 204 455 206 489 q 201 384 203 421 q 199 311 200 347 q 197 244 197 275 q 209 167 197 199 q 242 116 221 136 q 290 87 263 96 q 347 78 317 78 q 469 140 421 78 q 517 333 517 201 q 505 492 517 411 q 461 665 493 572 l 572 692 q 617 516 601 604 q 632 338 632 428 q 611 185 632 251 q 553 74 590 119 q 463 6 515 29 q 346 -17 410 -17 m 439 801 q 375 819 401 801 q 326 860 349 838 q 284 900 304 882 q 240 918 264 918 q 193 888 208 918 q 175 808 178 857 l 99 813 q 109 888 100 853 q 135 947 118 922 q 177 987 151 972 q 239 1001 203 1001 q 303 983 276 1001 q 351 943 329 965 q 394 903 374 921 q 439 885 414 885 q 485 915 469 885 q 503 994 500 946 l 579 989 q 569 915 578 949 q 543 856 560 881 q 501 816 526 831 q 439 801 475 801 z \"},\"ῠ\":{\"ha\":708,\"x_min\":83,\"x_max\":632,\"o\":\"m 346 -17 q 156 49 224 -17 q 89 250 89 115 q 92 370 89 311 q 94 490 94 429 q 92 576 94 531 q 83 675 90 622 l 194 675 q 203 601 201 639 q 206 518 206 563 q 204 455 206 489 q 201 384 203 421 q 199 311 200 347 q 197 244 197 275 q 209 167 197 199 q 242 116 221 136 q 290 87 263 96 q 347 78 317 78 q 469 140 421 78 q 517 333 517 201 q 505 492 517 411 q 461 665 493 572 l 572 692 q 617 516 601 604 q 632 338 632 428 q 611 185 632 251 q 553 74 590 119 q 463 6 515 29 q 346 -17 410 -17 m 339 793 q 243 811 283 793 q 177 859 203 829 q 138 926 151 889 q 122 1003 125 964 l 193 1014 q 208 962 197 988 q 236 915 218 936 q 280 882 254 894 q 339 869 306 869 q 398 882 372 869 q 442 915 424 894 q 470 962 460 936 q 485 1014 481 988 l 556 1003 q 540 926 553 964 q 500 859 526 889 q 434 811 474 829 q 339 793 394 793 z \"},\"ῡ\":{\"ha\":708,\"x_min\":83,\"x_max\":632,\"o\":\"m 346 -17 q 156 49 224 -17 q 89 250 89 115 q 92 370 89 311 q 94 490 94 429 q 92 576 94 531 q 83 675 90 622 l 194 675 q 203 601 201 639 q 206 518 206 563 q 204 455 206 489 q 201 384 203 421 q 199 311 200 347 q 197 244 197 275 q 209 167 197 199 q 242 116 221 136 q 290 87 263 96 q 347 78 317 78 q 469 140 421 78 q 517 333 517 201 q 505 492 517 411 q 461 665 493 572 l 572 692 q 617 516 601 604 q 632 338 632 428 q 611 185 632 251 q 553 74 590 119 q 463 6 515 29 q 346 -17 410 -17 m 154 835 l 154 914 l 524 914 l 524 835 l 154 835 z \"},\"ῢ\":{\"ha\":708,\"x_min\":83,\"x_max\":632,\"o\":\"m 346 -17 q 156 49 224 -17 q 89 250 89 115 q 92 370 89 311 q 94 490 94 429 q 92 576 94 531 q 83 675 90 622 l 194 675 q 203 601 201 639 q 206 518 206 563 q 204 455 206 489 q 201 384 203 421 q 199 311 200 347 q 197 244 197 275 q 209 167 197 199 q 242 116 221 136 q 290 87 263 96 q 347 78 317 78 q 469 140 421 78 q 517 333 517 201 q 505 492 517 411 q 461 665 493 572 l 572 692 q 617 516 601 604 q 632 338 632 428 q 611 185 632 251 q 553 74 590 119 q 463 6 515 29 q 346 -17 410 -17 m 182 826 q 140 842 157 826 q 124 885 124 858 q 140 927 124 911 q 182 943 157 943 q 222 927 206 943 q 239 885 239 911 q 222 842 239 858 q 182 826 206 826 m 335 782 l 246 1056 l 338 1075 l 394 796 l 335 782 m 496 826 q 456 842 472 826 q 439 885 439 858 q 456 927 439 911 q 496 943 472 943 q 538 927 521 943 q 554 885 554 911 q 538 842 554 858 q 496 826 521 826 z \"},\"ΰ\":{\"ha\":708,\"x_min\":83,\"x_max\":632,\"o\":\"m 346 -17 q 156 49 224 -17 q 89 250 89 115 q 92 370 89 311 q 94 490 94 429 q 92 576 94 531 q 83 675 90 622 l 194 675 q 203 601 201 639 q 206 518 206 563 q 204 455 206 489 q 201 384 203 421 q 199 311 200 347 q 197 244 197 275 q 209 167 197 199 q 242 116 221 136 q 290 87 263 96 q 347 78 317 78 q 469 140 421 78 q 517 333 517 201 q 505 492 517 411 q 461 665 493 572 l 572 692 q 617 516 601 604 q 632 338 632 428 q 611 185 632 251 q 553 74 590 119 q 463 6 515 29 q 346 -17 410 -17 m 283 796 l 346 1075 l 438 1056 l 343 782 l 283 796 m 182 826 q 140 842 157 826 q 124 885 124 858 q 140 927 124 911 q 182 943 157 943 q 222 927 206 943 q 239 885 239 911 q 222 842 239 858 q 182 826 206 826 m 496 826 q 456 842 472 826 q 439 885 439 858 q 456 927 439 911 q 496 943 472 943 q 538 927 521 943 q 554 885 554 911 q 538 842 554 858 q 496 826 521 826 z \"},\"ῧ\":{\"ha\":708,\"x_min\":83,\"x_max\":632,\"o\":\"m 346 -17 q 156 49 224 -17 q 89 250 89 115 q 92 370 89 311 q 94 490 94 429 q 92 576 94 531 q 83 675 90 622 l 194 675 q 203 601 201 639 q 206 518 206 563 q 204 455 206 489 q 201 384 203 421 q 199 311 200 347 q 197 244 197 275 q 209 167 197 199 q 242 116 221 136 q 290 87 263 96 q 347 78 317 78 q 469 140 421 78 q 517 333 517 201 q 505 492 517 411 q 461 665 493 572 l 572 692 q 617 516 601 604 q 632 338 632 428 q 611 185 632 251 q 553 74 590 119 q 463 6 515 29 q 346 -17 410 -17 m 126 992 q 158 1083 129 1046 q 240 1119 188 1119 q 301 1109 276 1119 q 347 1085 326 1099 q 388 1062 368 1072 q 432 1051 407 1051 q 472 1067 456 1051 q 493 1115 489 1083 l 551 1110 q 519 1019 549 1056 q 438 982 490 982 q 376 992 401 982 q 331 1016 351 1003 q 290 1040 310 1029 q 246 1050 271 1050 q 206 1034 222 1050 q 185 986 189 1018 l 126 992 m 206 817 q 160 835 178 817 q 142 879 142 853 q 160 925 142 907 q 206 943 178 943 q 251 925 233 943 q 268 879 268 907 q 251 835 268 853 q 206 817 233 817 m 472 817 q 427 835 444 817 q 410 879 410 853 q 427 925 410 907 q 472 943 444 943 q 518 925 500 943 q 536 879 536 907 q 518 835 536 853 q 472 817 500 817 z \"},\"ὠ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 442 808 l 429 864 q 485 887 463 872 q 507 929 507 901 q 392 994 507 989 l 399 1069 q 546 1034 494 1067 q 597 939 597 1001 q 584 887 597 908 q 549 849 571 865 q 500 824 528 833 q 442 808 472 814 z \"},\"ὡ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 531 797 q 472 812 500 803 q 423 836 444 821 q 388 873 401 851 q 375 925 375 894 q 426 1017 375 985 q 574 1051 478 1049 l 581 981 q 465 915 465 975 q 488 873 465 888 q 543 850 510 858 l 531 797 z \"},\"ὼ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 506 796 l 288 1008 l 368 1085 l 564 853 l 506 796 z \"},\"ώ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 467 796 l 408 853 l 604 1085 l 685 1008 l 467 796 z \"},\"ὢ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 319 801 l 306 854 q 352 876 333 861 q 371 919 371 892 q 269 979 371 974 l 275 1050 q 406 1018 357 1047 q 454 932 454 989 q 442 879 454 901 q 412 842 431 857 q 369 817 393 826 q 319 801 344 807 m 576 776 l 489 1050 l 592 1069 l 646 790 l 576 776 z \"},\"ὣ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 396 801 q 347 817 371 807 q 303 842 322 826 q 273 879 285 857 q 261 932 261 901 q 310 1018 261 989 q 440 1050 358 1047 l 446 979 q 344 919 344 974 q 363 876 344 892 q 408 854 381 861 l 396 801 m 568 776 l 479 1050 l 583 1069 l 636 790 l 568 776 z \"},\"ὤ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 319 801 l 306 854 q 352 876 333 861 q 371 919 371 892 q 269 979 371 974 l 275 1050 q 406 1018 357 1047 q 454 932 454 989 q 442 879 454 901 q 412 842 431 857 q 369 817 393 826 q 319 801 344 807 m 503 790 l 561 1069 l 664 1050 l 572 776 l 503 790 z \"},\"ὥ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 410 801 q 360 817 385 807 q 317 842 336 826 q 287 879 299 857 q 275 932 275 901 q 324 1018 275 989 q 454 1050 372 1047 l 460 979 q 358 919 358 974 q 376 876 358 892 q 422 854 394 861 l 410 801 m 493 790 l 553 1069 l 656 1050 l 563 776 l 493 790 z \"},\"ὦ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 290 999 q 320 1086 296 1051 q 396 1121 344 1121 q 450 1112 426 1121 q 494 1092 474 1103 q 533 1072 514 1081 q 571 1063 551 1063 q 601 1077 592 1063 q 617 1121 611 1092 l 682 1115 q 652 1028 676 1063 q 576 993 628 993 q 522 1002 546 993 q 478 1022 499 1011 q 440 1042 458 1033 q 401 1051 421 1051 q 371 1037 381 1051 q 356 993 361 1022 l 290 999 m 449 781 l 438 826 q 479 843 463 833 q 496 868 496 853 q 474 898 496 888 q 400 911 451 908 l 410 965 q 535 942 492 963 q 579 881 579 922 q 539 814 579 838 q 449 781 499 790 z \"},\"ὧ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 524 781 q 433 814 474 790 q 393 881 393 838 q 437 942 393 922 q 563 965 481 963 l 572 911 q 499 898 521 908 q 476 868 476 888 q 493 843 476 853 q 535 826 510 833 l 524 781 m 290 999 q 320 1086 296 1051 q 396 1121 344 1121 q 450 1112 426 1121 q 494 1092 474 1103 q 533 1072 514 1081 q 571 1063 551 1063 q 601 1077 592 1063 q 617 1121 611 1092 l 682 1115 q 652 1028 676 1063 q 576 993 628 993 q 522 1002 546 993 q 478 1022 499 1011 q 440 1042 458 1033 q 401 1051 421 1051 q 371 1037 381 1051 q 356 993 361 1022 l 290 999 z \"},\"ῶ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 586 801 q 522 819 549 801 q 474 860 496 838 q 431 900 451 882 q 388 918 411 918 q 340 888 356 918 q 322 808 325 857 l 246 813 q 256 888 247 853 q 282 947 265 922 q 324 987 299 972 q 386 1001 350 1001 q 450 983 424 1001 q 499 943 476 965 q 541 903 521 921 q 586 885 561 885 q 632 915 617 885 q 650 994 647 946 l 726 989 q 716 915 725 949 q 690 856 707 881 q 648 816 674 831 q 586 801 622 801 z \"},\"ᾳ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 460 -279 q 378 -246 404 -279 q 353 -150 353 -212 l 353 -86 l 442 -86 q 439 -124 439 -104 q 439 -160 439 -144 q 451 -193 439 -183 q 481 -203 464 -203 q 492 -202 486 -203 q 511 -199 497 -201 l 524 -267 q 497 -276 510 -272 q 460 -279 483 -279 z \"},\"ᾀ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 460 -279 q 378 -246 404 -279 q 353 -150 353 -212 l 353 -86 l 442 -86 q 439 -124 439 -104 q 439 -160 439 -144 q 451 -193 439 -183 q 481 -203 464 -203 q 492 -202 486 -203 q 511 -199 497 -201 l 524 -267 q 497 -276 510 -272 q 460 -279 483 -279 m 350 808 l 338 864 q 393 887 371 872 q 415 929 415 901 q 300 994 415 989 l 307 1069 q 454 1034 403 1067 q 506 939 506 1001 q 492 887 506 908 q 458 849 479 865 q 408 824 436 833 q 350 808 381 814 z \"},\"ᾁ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 460 -279 q 378 -246 404 -279 q 353 -150 353 -212 l 353 -86 l 442 -86 q 439 -124 439 -104 q 439 -160 439 -144 q 451 -193 439 -183 q 481 -203 464 -203 q 492 -202 486 -203 q 511 -199 497 -201 l 524 -267 q 497 -276 510 -272 q 460 -279 483 -279 m 439 797 q 381 812 408 803 q 331 836 353 821 q 297 873 310 851 q 283 925 283 894 q 335 1017 283 985 q 482 1051 386 1049 l 489 981 q 374 915 374 975 q 396 873 374 888 q 451 850 418 858 l 439 797 z \"},\"ᾲ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 460 -279 q 378 -246 404 -279 q 353 -150 353 -212 l 353 -86 l 442 -86 q 439 -124 439 -104 q 439 -160 439 -144 q 451 -193 439 -183 q 481 -203 464 -203 q 492 -202 486 -203 q 511 -199 497 -201 l 524 -267 q 497 -276 510 -272 q 460 -279 483 -279 m 414 796 l 196 1008 l 276 1085 l 472 853 l 414 796 z \"},\"ᾴ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 460 -279 q 378 -246 404 -279 q 353 -150 353 -212 l 353 -86 l 442 -86 q 439 -124 439 -104 q 439 -160 439 -144 q 451 -193 439 -183 q 481 -203 464 -203 q 492 -202 486 -203 q 511 -199 497 -201 l 524 -267 q 497 -276 510 -272 q 460 -279 483 -279 m 375 796 l 317 853 l 513 1085 l 593 1008 l 375 796 z \"},\"ᾂ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 460 -279 q 378 -246 404 -279 q 353 -150 353 -212 l 353 -86 l 442 -86 q 439 -124 439 -104 q 439 -160 439 -144 q 451 -193 439 -183 q 481 -203 464 -203 q 492 -202 486 -203 q 511 -199 497 -201 l 524 -267 q 497 -276 510 -272 q 460 -279 483 -279 m 228 801 l 214 854 q 260 876 242 861 q 279 919 279 892 q 178 979 279 974 l 183 1050 q 314 1018 265 1047 q 363 932 363 989 q 351 879 363 901 q 320 842 339 857 q 277 817 301 826 q 228 801 253 807 m 485 776 l 397 1050 l 500 1069 l 554 790 l 485 776 z \"},\"ᾃ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 460 -279 q 378 -246 404 -279 q 353 -150 353 -212 l 353 -86 l 442 -86 q 439 -124 439 -104 q 439 -160 439 -144 q 451 -193 439 -183 q 481 -203 464 -203 q 492 -202 486 -203 q 511 -199 497 -201 l 524 -267 q 497 -276 510 -272 q 460 -279 483 -279 m 304 801 q 255 817 279 807 q 212 842 231 826 q 181 879 193 857 q 169 932 169 901 q 218 1018 169 989 q 349 1050 267 1047 l 354 979 q 253 919 253 974 q 271 876 253 892 q 317 854 289 861 l 304 801 m 476 776 l 388 1050 l 492 1069 l 544 790 l 476 776 z \"},\"ᾄ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 460 -279 q 378 -246 404 -279 q 353 -150 353 -212 l 353 -86 l 442 -86 q 439 -124 439 -104 q 439 -160 439 -144 q 451 -193 439 -183 q 481 -203 464 -203 q 492 -202 486 -203 q 511 -199 497 -201 l 524 -267 q 497 -276 510 -272 q 460 -279 483 -279 m 228 801 l 214 854 q 260 876 242 861 q 279 919 279 892 q 178 979 279 974 l 183 1050 q 314 1018 265 1047 q 363 932 363 989 q 351 879 363 901 q 320 842 339 857 q 277 817 301 826 q 228 801 253 807 m 411 790 l 469 1069 l 572 1050 l 481 776 l 411 790 z \"},\"ᾅ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 460 -279 q 378 -246 404 -279 q 353 -150 353 -212 l 353 -86 l 442 -86 q 439 -124 439 -104 q 439 -160 439 -144 q 451 -193 439 -183 q 481 -203 464 -203 q 492 -202 486 -203 q 511 -199 497 -201 l 524 -267 q 497 -276 510 -272 q 460 -279 483 -279 m 318 801 q 269 817 293 807 q 226 842 244 826 q 195 879 207 857 q 183 932 183 901 q 232 1018 183 989 q 363 1050 281 1047 l 368 979 q 267 919 267 974 q 285 876 267 892 q 331 854 303 861 l 318 801 m 401 790 l 461 1069 l 564 1050 l 471 776 l 401 790 z \"},\"ᾆ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 460 -279 q 378 -246 404 -279 q 353 -150 353 -212 l 353 -86 l 442 -86 q 439 -124 439 -104 q 439 -160 439 -144 q 451 -193 439 -183 q 481 -203 464 -203 q 492 -202 486 -203 q 511 -199 497 -201 l 524 -267 q 497 -276 510 -272 q 460 -279 483 -279 m 199 999 q 228 1086 204 1051 q 304 1121 253 1121 q 358 1112 335 1121 q 402 1092 382 1103 q 441 1072 422 1081 q 479 1063 460 1063 q 510 1077 500 1063 q 525 1121 519 1092 l 590 1115 q 560 1028 585 1063 q 485 993 536 993 q 431 1002 454 993 q 387 1022 407 1011 q 348 1042 367 1033 q 310 1051 329 1051 q 279 1037 289 1051 q 264 993 269 1022 l 199 999 m 357 781 l 346 826 q 388 843 371 833 q 404 868 404 853 q 382 898 404 888 q 308 911 360 908 l 318 965 q 444 942 400 963 q 488 881 488 922 q 447 814 488 838 q 357 781 407 790 z \"},\"ᾇ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 460 -279 q 378 -246 404 -279 q 353 -150 353 -212 l 353 -86 l 442 -86 q 439 -124 439 -104 q 439 -160 439 -144 q 451 -193 439 -183 q 481 -203 464 -203 q 492 -202 486 -203 q 511 -199 497 -201 l 524 -267 q 497 -276 510 -272 q 460 -279 483 -279 m 432 781 q 342 814 382 790 q 301 881 301 838 q 345 942 301 922 q 471 965 389 963 l 481 911 q 407 898 429 908 q 385 868 385 888 q 401 843 385 853 q 443 826 418 833 l 432 781 m 199 999 q 228 1086 204 1051 q 304 1121 253 1121 q 358 1112 335 1121 q 402 1092 382 1103 q 441 1072 422 1081 q 479 1063 460 1063 q 510 1077 500 1063 q 525 1121 519 1092 l 590 1115 q 560 1028 585 1063 q 485 993 536 993 q 431 1002 454 993 q 387 1022 407 1011 q 348 1042 367 1033 q 310 1051 329 1051 q 279 1037 289 1051 q 264 993 269 1022 l 199 999 z \"},\"ᾷ\":{\"ha\":778,\"x_min\":64,\"x_max\":758,\"o\":\"m 324 -17 q 218 6 265 -17 q 136 72 171 28 q 83 178 101 115 q 64 325 64 242 q 88 481 64 413 q 153 595 113 549 q 248 667 194 642 q 360 692 301 692 q 481 651 422 692 q 568 515 539 611 l 571 515 l 600 675 l 713 675 q 684 535 699 608 q 657 392 669 463 q 636 258 644 321 q 628 149 628 194 q 647 96 628 114 q 694 78 667 78 q 718 81 706 78 q 742 89 731 85 l 758 1 q 722 -11 743 -6 q 671 -17 701 -17 q 574 17 610 -17 q 538 121 538 50 l 533 121 q 324 -17 456 -17 m 347 79 q 413 96 381 79 q 469 141 444 113 q 511 208 494 169 q 531 289 528 246 l 542 415 q 508 506 528 471 q 467 560 489 540 q 420 588 444 581 q 372 596 396 596 q 301 578 336 596 q 240 528 267 561 q 198 444 214 494 q 182 326 182 393 q 225 144 182 208 q 347 79 268 79 m 460 -279 q 378 -246 404 -279 q 353 -150 353 -212 l 353 -86 l 442 -86 q 439 -124 439 -104 q 439 -160 439 -144 q 451 -193 439 -183 q 481 -203 464 -203 q 492 -202 486 -203 q 511 -199 497 -201 l 524 -267 q 497 -276 510 -272 q 460 -279 483 -279 m 494 801 q 431 819 457 801 q 382 860 404 838 q 340 900 360 882 q 296 918 319 918 q 249 888 264 918 q 231 808 233 857 l 154 813 q 165 888 156 853 q 190 947 174 922 q 233 987 207 972 q 294 1001 258 1001 q 358 983 332 1001 q 407 943 385 965 q 449 903 429 921 q 494 885 469 885 q 540 915 525 885 q 558 994 556 946 l 635 989 q 624 915 633 949 q 599 856 615 881 q 556 816 582 831 q 494 801 531 801 z \"},\"ῃ\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 225 -279 q 144 -246 169 -279 q 118 -150 118 -212 l 118 -86 l 207 -86 q 204 -124 204 -104 q 204 -160 204 -144 q 217 -193 204 -183 q 246 -203 229 -203 q 257 -202 251 -203 q 276 -199 263 -201 l 289 -267 q 262 -276 275 -272 q 225 -279 249 -279 z \"},\"ᾐ\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 225 -279 q 144 -246 169 -279 q 118 -150 118 -212 l 118 -86 l 207 -86 q 204 -124 204 -104 q 204 -160 204 -144 q 217 -193 204 -183 q 246 -203 229 -203 q 257 -202 251 -203 q 276 -199 263 -201 l 289 -267 q 262 -276 275 -272 q 225 -279 249 -279 m 358 808 l 346 864 q 401 887 379 872 q 424 929 424 901 q 308 994 424 989 l 315 1069 q 463 1034 411 1067 q 514 939 514 1001 q 501 887 514 908 q 466 849 488 865 q 417 824 444 833 q 358 808 389 814 z \"},\"ᾑ\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 225 -279 q 144 -246 169 -279 q 118 -150 118 -212 l 118 -86 l 207 -86 q 204 -124 204 -104 q 204 -160 204 -144 q 217 -193 204 -183 q 246 -203 229 -203 q 257 -202 251 -203 q 276 -199 263 -201 l 289 -267 q 262 -276 275 -272 q 225 -279 249 -279 m 447 797 q 389 812 417 803 q 340 836 361 821 q 305 873 318 851 q 292 925 292 894 q 343 1017 292 985 q 490 1051 394 1049 l 497 981 q 382 915 382 975 q 404 873 382 888 q 460 850 426 858 l 447 797 z \"},\"ῂ\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 225 -279 q 144 -246 169 -279 q 118 -150 118 -212 l 118 -86 l 207 -86 q 204 -124 204 -104 q 204 -160 204 -144 q 217 -193 204 -183 q 246 -203 229 -203 q 257 -202 251 -203 q 276 -199 263 -201 l 289 -267 q 262 -276 275 -272 q 225 -279 249 -279 m 422 796 l 204 1008 l 285 1085 l 481 853 l 422 796 z \"},\"ῄ\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 225 -279 q 144 -246 169 -279 q 118 -150 118 -212 l 118 -86 l 207 -86 q 204 -124 204 -104 q 204 -160 204 -144 q 217 -193 204 -183 q 246 -203 229 -203 q 257 -202 251 -203 q 276 -199 263 -201 l 289 -267 q 262 -276 275 -272 q 225 -279 249 -279 m 383 796 l 325 853 l 521 1085 l 601 1008 l 383 796 z \"},\"ᾒ\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 225 -279 q 144 -246 169 -279 q 118 -150 118 -212 l 118 -86 l 207 -86 q 204 -124 204 -104 q 204 -160 204 -144 q 217 -193 204 -183 q 246 -203 229 -203 q 257 -202 251 -203 q 276 -199 263 -201 l 289 -267 q 262 -276 275 -272 q 225 -279 249 -279 m 236 801 l 222 854 q 269 876 250 861 q 288 919 288 892 q 186 979 288 974 l 192 1050 q 322 1018 274 1047 q 371 932 371 989 q 359 879 371 901 q 328 842 347 857 q 285 817 310 826 q 236 801 261 807 m 493 776 l 406 1050 l 508 1069 l 563 790 l 493 776 z \"},\"ᾓ\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 225 -279 q 144 -246 169 -279 q 118 -150 118 -212 l 118 -86 l 207 -86 q 204 -124 204 -104 q 204 -160 204 -144 q 217 -193 204 -183 q 246 -203 229 -203 q 257 -202 251 -203 q 276 -199 263 -201 l 289 -267 q 262 -276 275 -272 q 225 -279 249 -279 m 313 801 q 263 817 288 807 q 220 842 239 826 q 190 879 201 857 q 178 932 178 901 q 226 1018 178 989 q 357 1050 275 1047 l 363 979 q 261 919 261 974 q 279 876 261 892 q 325 854 297 861 l 313 801 m 485 776 l 396 1050 l 500 1069 l 553 790 l 485 776 z \"},\"ᾔ\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 225 -279 q 144 -246 169 -279 q 118 -150 118 -212 l 118 -86 l 207 -86 q 204 -124 204 -104 q 204 -160 204 -144 q 217 -193 204 -183 q 246 -203 229 -203 q 257 -202 251 -203 q 276 -199 263 -201 l 289 -267 q 262 -276 275 -272 q 225 -279 249 -279 m 236 801 l 222 854 q 269 876 250 861 q 288 919 288 892 q 186 979 288 974 l 192 1050 q 322 1018 274 1047 q 371 932 371 989 q 359 879 371 901 q 328 842 347 857 q 285 817 310 826 q 236 801 261 807 m 419 790 l 478 1069 l 581 1050 l 489 776 l 419 790 z \"},\"ᾕ\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 225 -279 q 144 -246 169 -279 q 118 -150 118 -212 l 118 -86 l 207 -86 q 204 -124 204 -104 q 204 -160 204 -144 q 217 -193 204 -183 q 246 -203 229 -203 q 257 -202 251 -203 q 276 -199 263 -201 l 289 -267 q 262 -276 275 -272 q 225 -279 249 -279 m 326 801 q 277 817 301 807 q 234 842 253 826 q 203 879 215 857 q 192 932 192 901 q 240 1018 192 989 q 371 1050 289 1047 l 376 979 q 275 919 275 974 q 293 876 275 892 q 339 854 311 861 l 326 801 m 410 790 l 469 1069 l 572 1050 l 479 776 l 410 790 z \"},\"ᾖ\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 225 -279 q 144 -246 169 -279 q 118 -150 118 -212 l 118 -86 l 207 -86 q 204 -124 204 -104 q 204 -160 204 -144 q 217 -193 204 -183 q 246 -203 229 -203 q 257 -202 251 -203 q 276 -199 263 -201 l 289 -267 q 262 -276 275 -272 q 225 -279 249 -279 m 207 999 q 237 1086 213 1051 q 313 1121 261 1121 q 367 1112 343 1121 q 410 1092 390 1103 q 449 1072 431 1081 q 488 1063 468 1063 q 518 1077 508 1063 q 533 1121 528 1092 l 599 1115 q 569 1028 593 1063 q 493 993 544 993 q 439 1002 463 993 q 395 1022 415 1011 q 356 1042 375 1033 q 318 1051 338 1051 q 288 1037 297 1051 q 272 993 278 1022 l 207 999 m 365 781 l 354 826 q 396 843 379 833 q 413 868 413 853 q 390 898 413 888 q 317 911 368 908 l 326 965 q 452 942 408 963 q 496 881 496 922 q 456 814 496 838 q 365 781 415 790 z \"},\"ᾗ\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 225 -279 q 144 -246 169 -279 q 118 -150 118 -212 l 118 -86 l 207 -86 q 204 -124 204 -104 q 204 -160 204 -144 q 217 -193 204 -183 q 246 -203 229 -203 q 257 -202 251 -203 q 276 -199 263 -201 l 289 -267 q 262 -276 275 -272 q 225 -279 249 -279 m 440 781 q 350 814 390 790 q 310 881 310 838 q 353 942 310 922 q 479 965 397 963 l 489 911 q 415 898 438 908 q 393 868 393 888 q 410 843 393 853 q 451 826 426 833 l 440 781 m 207 999 q 237 1086 213 1051 q 313 1121 261 1121 q 367 1112 343 1121 q 410 1092 390 1103 q 449 1072 431 1081 q 488 1063 468 1063 q 518 1077 508 1063 q 533 1121 528 1092 l 599 1115 q 569 1028 593 1063 q 493 993 544 993 q 439 1002 463 993 q 395 1022 415 1011 q 356 1042 375 1033 q 318 1051 338 1051 q 288 1037 297 1051 q 272 993 278 1022 l 207 999 z \"},\"ῇ\":{\"ha\":751,\"x_min\":104,\"x_max\":646,\"o\":\"m 531 -249 q 537 92 535 -82 q 539 413 539 265 q 514 551 539 508 q 429 593 489 593 q 377 585 401 593 q 329 560 353 578 q 281 513 306 542 q 228 442 257 485 l 228 0 l 114 0 l 114 490 q 113 576 114 531 q 104 675 111 622 l 208 675 l 218 535 l 222 535 q 331 653 275 614 q 463 692 388 692 q 603 625 561 692 q 646 428 646 558 l 646 -249 l 531 -249 m 225 -279 q 144 -246 169 -279 q 118 -150 118 -212 l 118 -86 l 207 -86 q 204 -124 204 -104 q 204 -160 204 -144 q 217 -193 204 -183 q 246 -203 229 -203 q 257 -202 251 -203 q 276 -199 263 -201 l 289 -267 q 262 -276 275 -272 q 225 -279 249 -279 m 503 801 q 439 819 465 801 q 390 860 413 838 q 348 900 368 882 q 304 918 328 918 q 257 888 272 918 q 239 808 242 857 l 163 813 q 173 888 164 853 q 199 947 182 922 q 241 987 215 972 q 303 1001 267 1001 q 367 983 340 1001 q 415 943 393 965 q 458 903 438 921 q 503 885 478 885 q 549 915 533 885 q 567 994 564 946 l 643 989 q 633 915 642 949 q 607 856 624 881 q 565 816 590 831 q 503 801 539 801 z \"},\"ῳ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 539 -279 q 458 -246 483 -279 q 432 -150 432 -212 l 432 -86 l 521 -86 q 518 -124 518 -104 q 518 -160 518 -144 q 531 -193 518 -183 q 560 -203 543 -203 q 571 -202 565 -203 q 590 -199 576 -201 l 603 -267 q 576 -276 589 -272 q 539 -279 563 -279 z \"},\"ᾠ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 539 -279 q 458 -246 483 -279 q 432 -150 432 -212 l 432 -86 l 521 -86 q 518 -124 518 -104 q 518 -160 518 -144 q 531 -193 518 -183 q 560 -203 543 -203 q 571 -202 565 -203 q 590 -199 576 -201 l 603 -267 q 576 -276 589 -272 q 539 -279 563 -279 m 442 808 l 429 864 q 485 887 463 872 q 507 929 507 901 q 392 994 507 989 l 399 1069 q 546 1034 494 1067 q 597 939 597 1001 q 584 887 597 908 q 549 849 571 865 q 500 824 528 833 q 442 808 472 814 z \"},\"ᾡ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 539 -279 q 458 -246 483 -279 q 432 -150 432 -212 l 432 -86 l 521 -86 q 518 -124 518 -104 q 518 -160 518 -144 q 531 -193 518 -183 q 560 -203 543 -203 q 571 -202 565 -203 q 590 -199 576 -201 l 603 -267 q 576 -276 589 -272 q 539 -279 563 -279 m 531 797 q 472 812 500 803 q 423 836 444 821 q 388 873 401 851 q 375 925 375 894 q 426 1017 375 985 q 574 1051 478 1049 l 581 981 q 465 915 465 975 q 488 873 465 888 q 543 850 510 858 l 531 797 z \"},\"ῲ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 539 -279 q 458 -246 483 -279 q 432 -150 432 -212 l 432 -86 l 521 -86 q 518 -124 518 -104 q 518 -160 518 -144 q 531 -193 518 -183 q 560 -203 543 -203 q 571 -202 565 -203 q 590 -199 576 -201 l 603 -267 q 576 -276 589 -272 q 539 -279 563 -279 m 506 796 l 288 1008 l 368 1085 l 564 853 l 506 796 z \"},\"ῴ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 539 -279 q 458 -246 483 -279 q 432 -150 432 -212 l 432 -86 l 521 -86 q 518 -124 518 -104 q 518 -160 518 -144 q 531 -193 518 -183 q 560 -203 543 -203 q 571 -202 565 -203 q 590 -199 576 -201 l 603 -267 q 576 -276 589 -272 q 539 -279 563 -279 m 467 796 l 408 853 l 604 1085 l 685 1008 l 467 796 z \"},\"ᾢ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 539 -279 q 458 -246 483 -279 q 432 -150 432 -212 l 432 -86 l 521 -86 q 518 -124 518 -104 q 518 -160 518 -144 q 531 -193 518 -183 q 560 -203 543 -203 q 571 -202 565 -203 q 590 -199 576 -201 l 603 -267 q 576 -276 589 -272 q 539 -279 563 -279 m 319 801 l 306 854 q 352 876 333 861 q 371 919 371 892 q 269 979 371 974 l 275 1050 q 406 1018 357 1047 q 454 932 454 989 q 442 879 454 901 q 412 842 431 857 q 369 817 393 826 q 319 801 344 807 m 576 776 l 489 1050 l 592 1069 l 646 790 l 576 776 z \"},\"ᾣ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 539 -279 q 458 -246 483 -279 q 432 -150 432 -212 l 432 -86 l 521 -86 q 518 -124 518 -104 q 518 -160 518 -144 q 531 -193 518 -183 q 560 -203 543 -203 q 571 -202 565 -203 q 590 -199 576 -201 l 603 -267 q 576 -276 589 -272 q 539 -279 563 -279 m 396 801 q 347 817 371 807 q 303 842 322 826 q 273 879 285 857 q 261 932 261 901 q 310 1018 261 989 q 440 1050 358 1047 l 446 979 q 344 919 344 974 q 363 876 344 892 q 408 854 381 861 l 396 801 m 568 776 l 479 1050 l 583 1069 l 636 790 l 568 776 z \"},\"ᾤ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 539 -279 q 458 -246 483 -279 q 432 -150 432 -212 l 432 -86 l 521 -86 q 518 -124 518 -104 q 518 -160 518 -144 q 531 -193 518 -183 q 560 -203 543 -203 q 571 -202 565 -203 q 590 -199 576 -201 l 603 -267 q 576 -276 589 -272 q 539 -279 563 -279 m 319 801 l 306 854 q 352 876 333 861 q 371 919 371 892 q 269 979 371 974 l 275 1050 q 406 1018 357 1047 q 454 932 454 989 q 442 879 454 901 q 412 842 431 857 q 369 817 393 826 q 319 801 344 807 m 503 790 l 561 1069 l 664 1050 l 572 776 l 503 790 z \"},\"ᾥ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 539 -279 q 458 -246 483 -279 q 432 -150 432 -212 l 432 -86 l 521 -86 q 518 -124 518 -104 q 518 -160 518 -144 q 531 -193 518 -183 q 560 -203 543 -203 q 571 -202 565 -203 q 590 -199 576 -201 l 603 -267 q 576 -276 589 -272 q 539 -279 563 -279 m 410 801 q 360 817 385 807 q 317 842 336 826 q 287 879 299 857 q 275 932 275 901 q 324 1018 275 989 q 454 1050 372 1047 l 460 979 q 358 919 358 974 q 376 876 358 892 q 422 854 394 861 l 410 801 m 493 790 l 553 1069 l 656 1050 l 563 776 l 493 790 z \"},\"ᾦ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 539 -279 q 458 -246 483 -279 q 432 -150 432 -212 l 432 -86 l 521 -86 q 518 -124 518 -104 q 518 -160 518 -144 q 531 -193 518 -183 q 560 -203 543 -203 q 571 -202 565 -203 q 590 -199 576 -201 l 603 -267 q 576 -276 589 -272 q 539 -279 563 -279 m 290 999 q 320 1086 296 1051 q 396 1121 344 1121 q 450 1112 426 1121 q 494 1092 474 1103 q 533 1072 514 1081 q 571 1063 551 1063 q 601 1077 592 1063 q 617 1121 611 1092 l 682 1115 q 652 1028 676 1063 q 576 993 628 993 q 522 1002 546 993 q 478 1022 499 1011 q 440 1042 458 1033 q 401 1051 421 1051 q 371 1037 381 1051 q 356 993 361 1022 l 290 999 m 449 781 l 438 826 q 479 843 463 833 q 496 868 496 853 q 474 898 496 888 q 400 911 451 908 l 410 965 q 535 942 492 963 q 579 881 579 922 q 539 814 579 838 q 449 781 499 790 z \"},\"ᾧ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 539 -279 q 458 -246 483 -279 q 432 -150 432 -212 l 432 -86 l 521 -86 q 518 -124 518 -104 q 518 -160 518 -144 q 531 -193 518 -183 q 560 -203 543 -203 q 571 -202 565 -203 q 590 -199 576 -201 l 603 -267 q 576 -276 589 -272 q 539 -279 563 -279 m 524 781 q 433 814 474 790 q 393 881 393 838 q 437 942 393 922 q 563 965 481 963 l 572 911 q 499 898 521 908 q 476 868 476 888 q 493 843 476 853 q 535 826 510 833 l 524 781 m 290 999 q 320 1086 296 1051 q 396 1121 344 1121 q 450 1112 426 1121 q 494 1092 474 1103 q 533 1072 514 1081 q 571 1063 551 1063 q 601 1077 592 1063 q 617 1121 611 1092 l 682 1115 q 652 1028 676 1063 q 576 993 628 993 q 522 1002 546 993 q 478 1022 499 1011 q 440 1042 458 1033 q 401 1051 421 1051 q 371 1037 381 1051 q 356 993 361 1022 l 290 999 z \"},\"ῷ\":{\"ha\":974,\"x_min\":71,\"x_max\":903,\"o\":\"m 306 -17 q 213 4 256 -17 q 138 67 169 25 q 89 172 107 108 q 71 318 71 235 q 107 519 71 426 q 196 692 143 613 l 300 646 q 249 565 271 604 q 211 483 226 525 q 188 396 196 442 q 181 297 181 350 q 217 135 181 192 q 311 78 254 78 q 358 87 336 78 q 397 116 381 96 q 424 168 414 136 q 433 247 433 200 q 431 331 433 289 q 422 428 428 374 l 547 428 q 539 331 542 374 q 536 247 536 289 q 546 166 536 199 q 572 114 556 133 q 611 86 589 94 q 657 78 633 78 q 750 135 714 78 q 786 315 786 193 q 780 409 786 367 q 760 490 774 451 q 727 567 747 529 q 678 649 707 606 l 781 692 q 831 611 808 651 q 869 526 853 571 q 894 431 885 481 q 903 322 903 381 q 840 67 903 151 q 671 -17 776 -17 q 563 13 613 -17 q 489 106 514 42 l 483 106 q 410 13 457 42 q 306 -17 364 -17 m 539 -279 q 458 -246 483 -279 q 432 -150 432 -212 l 432 -86 l 521 -86 q 518 -124 518 -104 q 518 -160 518 -144 q 531 -193 518 -183 q 560 -203 543 -203 q 571 -202 565 -203 q 590 -199 576 -201 l 603 -267 q 576 -276 589 -272 q 539 -279 563 -279 m 586 801 q 522 819 549 801 q 474 860 496 838 q 431 900 451 882 q 388 918 411 918 q 340 888 356 918 q 322 808 325 857 l 246 813 q 256 888 247 853 q 282 947 265 922 q 324 987 299 972 q 386 1001 350 1001 q 450 983 424 1001 q 499 943 476 965 q 541 903 521 921 q 586 885 561 885 q 632 915 617 885 q 650 994 647 946 l 726 989 q 716 915 725 949 q 690 856 707 881 q 648 816 674 831 q 586 801 622 801 z \"},\"ϗ\":{\"ha\":686,\"x_min\":101,\"x_max\":690,\"o\":\"m 503 -260 l 369 -249 q 473 -130 424 -192 q 563 -8 522 -68 q 506 62 535 22 q 447 146 476 101 q 390 238 418 190 q 339 331 363 285 q 308 291 324 311 q 276 249 292 271 q 234 155 246 208 q 221 35 222 101 l 221 0 l 114 0 l 114 490 q 112 581 114 531 q 101 675 110 631 l 214 675 q 224 605 221 647 q 226 518 226 563 l 226 307 l 232 307 q 319 440 272 376 q 419 556 367 504 q 525 642 471 607 q 633 692 579 678 l 644 583 q 530 523 588 565 q 410 413 472 481 q 468 308 435 363 q 538 198 501 253 q 613 92 574 143 q 690 0 653 42 q 594 -142 644 -74 q 503 -260 543 -211 z \"},\"ϙ\":{\"ha\":743,\"x_min\":64,\"x_max\":679,\"o\":\"m 371 75 q 511 146 461 75 q 561 336 561 217 q 511 526 561 454 q 371 597 461 597 q 231 526 281 597 q 182 336 182 454 q 231 146 182 217 q 371 75 281 75 m 319 -249 l 319 -12 q 219 24 265 -4 q 138 95 172 51 q 83 200 103 139 q 64 336 64 261 q 88 488 64 421 q 154 599 113 554 q 252 668 196 644 q 371 692 308 692 q 491 668 435 692 q 589 599 547 644 q 655 488 631 554 q 679 336 679 421 q 660 201 679 261 q 607 98 640 142 q 528 26 574 54 q 429 -11 482 -1 q 431 -71 431 -43 q 433 -126 432 -99 q 434 -183 433 -153 q 435 -249 435 -212 l 319 -249 z \"},\"ϛ\":{\"ha\":647,\"x_min\":64,\"x_max\":611,\"o\":\"m 488 -256 l 396 -218 q 449 -148 433 -174 q 464 -97 464 -122 q 460 -71 464 -83 q 442 -47 456 -58 q 405 -26 429 -36 q 340 -6 381 -15 q 235 33 285 8 q 147 97 185 57 q 86 194 108 136 q 64 331 64 251 q 90 484 64 419 q 161 591 115 549 q 269 654 207 633 q 401 675 331 675 l 611 675 l 611 578 q 519 581 571 581 q 410 581 467 581 q 244 519 306 581 q 182 331 182 457 q 198 235 182 275 q 242 166 214 194 q 309 119 269 138 q 396 89 349 100 q 530 30 493 65 q 567 -69 567 -6 q 547 -152 567 -101 q 488 -256 526 -203 z \"},\"ϝ\":{\"ha\":574,\"x_min\":114,\"x_max\":538,\"o\":\"m 114 -249 l 114 675 l 538 675 l 538 582 l 221 582 l 224 281 l 510 281 l 510 199 l 224 199 q 225 -20 224 86 q 229 -249 226 -126 l 114 -249 z \"},\"ϡ\":{\"ha\":692,\"x_min\":24,\"x_max\":658,\"o\":\"m 633 -249 l 522 -235 q 542 -104 536 -168 q 547 24 547 -40 q 533 199 547 117 q 362 119 446 158 q 182 31 278 79 l 135 126 l 513 296 q 454 461 492 383 q 267 375 358 418 q 71 279 175 332 l 24 375 l 410 549 q 271 731 351 649 q 86 874 190 813 l 157 958 q 372 783 278 885 q 528 561 465 682 q 625 303 592 440 q 658 22 658 167 q 653 -115 658 -49 q 633 -249 647 -181 z \"},\";\":{\"ha\":346,\"x_min\":65,\"x_max\":275,\"o\":\"m 174 485 q 115 509 139 485 q 90 571 90 533 q 115 635 90 611 q 174 660 139 660 q 231 635 207 660 q 256 571 256 611 q 231 509 256 533 q 174 485 207 485 m 93 -236 l 65 -169 q 158 -99 125 -143 q 190 0 192 -56 q 176 -1 186 -1 q 119 19 143 -1 q 94 78 94 39 q 119 137 94 115 q 179 158 144 158 q 249 122 224 158 q 275 24 275 86 q 226 -133 275 -67 q 93 -236 178 -200 z \"},\"·\":{\"ha\":346,\"x_min\":90,\"x_max\":256,\"o\":\"m 174 485 q 115 509 139 485 q 90 571 90 533 q 115 635 90 611 q 174 660 139 660 q 231 635 207 660 q 256 571 256 611 q 231 509 256 533 q 174 485 207 485 z \"},\"ʹ\":{\"ha\":346,\"x_min\":114,\"x_max\":257,\"o\":\"m 114 624 l 144 958 l 257 958 l 236 831 l 189 624 l 114 624 z \"},\"͵\":{\"ha\":346,\"x_min\":89,\"x_max\":232,\"o\":\"m 89 0 l 110 128 l 157 336 l 232 336 l 201 0 l 89 0 z \"},\"΄\":{\"ha\":753,\"x_min\":331,\"x_max\":508,\"o\":\"m 331 790 l 390 1069 l 508 1049 l 410 775 l 331 790 z \"},\"΅\":{\"ha\":753,\"x_min\":169,\"x_max\":600,\"o\":\"m 329 796 l 392 1075 l 483 1056 l 389 782 l 329 796 m 228 826 q 186 842 203 826 q 169 885 169 858 q 186 927 169 911 q 228 943 203 943 q 268 927 251 943 q 285 885 285 911 q 268 842 285 858 q 228 826 251 826 m 542 826 q 501 842 518 826 q 485 885 485 858 q 501 927 485 911 q 542 943 518 943 q 583 927 567 943 q 600 885 600 911 q 583 842 600 858 q 542 826 567 826 z \"},\"ͺ\":{\"ha\":753,\"x_min\":339,\"x_max\":510,\"o\":\"m 446 -279 q 365 -246 390 -279 q 339 -150 339 -212 l 339 -86 l 428 -86 q 425 -124 425 -104 q 425 -160 425 -144 q 438 -193 425 -183 q 467 -203 450 -203 q 478 -202 472 -203 q 497 -199 483 -201 l 510 -267 q 483 -276 496 -272 q 446 -279 469 -279 z \"},\"ι\":{\"ha\":364,\"x_min\":114,\"x_max\":326,\"o\":\"m 244 -17 q 144 24 174 -17 q 114 140 114 65 l 114 564 l 229 564 q 224 342 226 451 q 221 132 221 232 q 235 91 221 104 q 271 78 249 78 q 311 86 288 78 l 326 0 q 292 -12 311 -7 q 244 -17 274 -17 z \"},\"᾽\":{\"ha\":753,\"x_min\":282,\"x_max\":488,\"o\":\"m 332 794 l 319 850 q 375 873 353 858 q 397 915 397 888 q 282 981 397 975 l 289 1056 q 436 1020 385 1053 q 488 925 488 988 q 474 873 488 894 q 440 835 461 851 q 390 810 418 819 q 332 794 363 800 z \"},\"᾿\":{\"ha\":753,\"x_min\":282,\"x_max\":488,\"o\":\"m 332 794 l 319 850 q 375 873 353 858 q 397 915 397 888 q 282 981 397 975 l 289 1056 q 436 1020 385 1053 q 488 925 488 988 q 474 873 488 894 q 440 835 461 851 q 390 810 418 819 q 332 794 363 800 z \"},\"῾\":{\"ha\":753,\"x_min\":265,\"x_max\":471,\"o\":\"m 421 797 q 363 812 390 803 q 313 836 335 821 q 278 873 292 851 q 265 925 265 894 q 317 1017 265 985 q 464 1051 368 1049 l 471 981 q 356 915 356 975 q 378 873 356 888 q 433 850 400 858 l 421 797 z \"},\"`\":{\"ha\":753,\"x_min\":250,\"x_max\":422,\"o\":\"m 343 775 l 250 1049 l 368 1069 l 422 790 l 343 775 z \"},\"´\":{\"ha\":753,\"x_min\":331,\"x_max\":508,\"o\":\"m 331 790 l 390 1069 l 508 1049 l 410 775 l 331 790 z \"},\"῍\":{\"ha\":753,\"x_min\":160,\"x_max\":536,\"o\":\"m 210 801 l 196 854 q 242 876 224 861 q 261 919 261 892 q 160 979 261 974 l 165 1050 q 296 1018 247 1047 q 344 932 344 989 q 333 879 344 901 q 302 842 321 857 q 259 817 283 826 q 210 801 235 807 m 467 776 l 379 1050 l 482 1069 l 536 790 l 467 776 z \"},\"῝\":{\"ha\":753,\"x_min\":151,\"x_max\":526,\"o\":\"m 286 801 q 237 817 261 807 q 194 842 213 826 q 163 879 175 857 q 151 932 151 901 q 200 1018 151 989 q 331 1050 249 1047 l 336 979 q 235 919 235 974 q 253 876 235 892 q 299 854 271 861 l 286 801 m 458 776 l 369 1050 l 474 1069 l 526 790 l 458 776 z \"},\"῎\":{\"ha\":753,\"x_min\":160,\"x_max\":554,\"o\":\"m 210 801 l 196 854 q 242 876 224 861 q 261 919 261 892 q 160 979 261 974 l 165 1050 q 296 1018 247 1047 q 344 932 344 989 q 333 879 344 901 q 302 842 321 857 q 259 817 283 826 q 210 801 235 807 m 393 790 l 451 1069 l 554 1050 l 463 776 l 393 790 z \"},\"῞\":{\"ha\":753,\"x_min\":165,\"x_max\":546,\"o\":\"m 300 801 q 251 817 275 807 q 208 842 226 826 q 177 879 189 857 q 165 932 165 901 q 214 1018 165 989 q 344 1050 263 1047 l 350 979 q 249 919 249 974 q 267 876 249 892 q 313 854 285 861 l 300 801 m 383 790 l 443 1069 l 546 1050 l 453 776 l 383 790 z \"},\"῏\":{\"ha\":753,\"x_min\":181,\"x_max\":572,\"o\":\"m 181 999 q 210 1086 186 1051 q 286 1121 235 1121 q 340 1112 317 1121 q 384 1092 364 1103 q 423 1072 404 1081 q 461 1063 442 1063 q 492 1077 482 1063 q 507 1121 501 1092 l 572 1115 q 542 1028 567 1063 q 467 993 518 993 q 413 1002 436 993 q 369 1022 389 1011 q 330 1042 349 1033 q 292 1051 311 1051 q 261 1037 271 1051 q 246 993 251 1022 l 181 999 m 339 781 l 328 826 q 369 843 353 833 q 386 868 386 853 q 364 898 386 888 q 290 911 342 908 l 300 965 q 426 942 382 963 q 469 881 469 922 q 429 814 469 838 q 339 781 389 790 z \"},\"῟\":{\"ha\":753,\"x_min\":181,\"x_max\":572,\"o\":\"m 414 781 q 324 814 364 790 q 283 881 283 838 q 327 942 283 922 q 453 965 371 963 l 463 911 q 389 898 411 908 q 367 868 367 888 q 383 843 367 853 q 425 826 400 833 l 414 781 m 181 999 q 210 1086 186 1051 q 286 1121 235 1121 q 340 1112 317 1121 q 384 1092 364 1103 q 423 1072 404 1081 q 461 1063 442 1063 q 492 1077 482 1063 q 507 1121 501 1092 l 572 1115 q 542 1028 567 1063 q 467 993 518 993 q 413 1002 436 993 q 369 1022 389 1011 q 330 1042 349 1033 q 292 1051 311 1051 q 261 1037 271 1051 q 246 993 251 1022 l 181 999 z \"},\"῀\":{\"ha\":753,\"x_min\":136,\"x_max\":617,\"o\":\"m 476 801 q 413 819 439 801 q 364 860 386 838 q 322 900 342 882 q 278 918 301 918 q 231 888 246 918 q 213 808 215 857 l 136 813 q 147 888 138 853 q 172 947 156 922 q 215 987 189 972 q 276 1001 240 1001 q 340 983 314 1001 q 389 943 367 965 q 431 903 411 921 q 476 885 451 885 q 522 915 507 885 q 540 994 538 946 l 617 989 q 606 915 615 949 q 581 856 597 881 q 538 816 564 831 q 476 801 513 801 z \"},\"῭\":{\"ha\":753,\"x_min\":161,\"x_max\":592,\"o\":\"m 219 826 q 178 842 194 826 q 161 885 161 858 q 178 927 161 911 q 219 943 194 943 q 260 927 243 943 q 276 885 276 911 q 260 842 276 858 q 219 826 243 826 m 372 782 l 283 1056 l 375 1075 l 432 796 l 372 782 m 533 826 q 493 842 510 826 q 476 885 476 858 q 493 927 476 911 q 533 943 510 943 q 575 927 558 943 q 592 885 592 911 q 575 842 592 858 q 533 826 558 826 z \"},\"΅\":{\"ha\":753,\"x_min\":161,\"x_max\":592,\"o\":\"m 321 796 l 383 1075 l 475 1056 l 381 782 l 321 796 m 219 826 q 178 842 194 826 q 161 885 161 858 q 178 927 161 911 q 219 943 194 943 q 260 927 243 943 q 276 885 276 911 q 260 842 276 858 q 219 826 243 826 m 533 826 q 493 842 510 826 q 476 885 476 858 q 493 927 476 911 q 533 943 510 943 q 575 927 558 943 q 592 885 592 911 q 575 842 592 858 q 533 826 558 826 z \"},\"῁\":{\"ha\":753,\"x_min\":164,\"x_max\":589,\"o\":\"m 164 992 q 196 1083 167 1046 q 278 1119 225 1119 q 339 1109 314 1119 q 385 1085 364 1099 q 425 1062 406 1072 q 469 1051 444 1051 q 510 1067 493 1051 q 531 1115 526 1083 l 589 1110 q 557 1019 586 1056 q 475 982 528 982 q 414 992 439 982 q 368 1016 389 1003 q 328 1040 347 1029 q 283 1050 308 1050 q 243 1034 260 1050 q 222 986 226 1018 l 164 992 m 243 817 q 197 835 215 817 q 179 879 179 853 q 197 925 179 907 q 243 943 215 943 q 288 925 271 943 q 306 879 306 907 q 288 835 306 853 q 243 817 271 817 m 510 817 q 465 835 482 817 q 447 879 447 853 q 465 925 447 907 q 510 943 482 943 q 556 925 538 943 q 574 879 574 907 q 556 835 574 853 q 510 817 538 817 z \"},\"А\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 z \"},\"Б\":{\"ha\":806,\"x_min\":125,\"x_max\":749,\"o\":\"m 125 0 l 125 911 l 688 911 l 688 814 l 240 814 l 240 528 l 415 528 q 549 514 488 528 q 654 470 610 500 q 724 392 699 440 q 749 276 749 344 q 660 67 749 133 q 421 0 571 0 l 125 0 m 240 92 l 401 92 q 577 135 519 92 q 635 274 635 179 q 576 400 635 361 q 399 439 517 439 l 240 439 l 240 92 z \"},\"В\":{\"ha\":817,\"x_min\":125,\"x_max\":761,\"o\":\"m 125 0 l 125 911 l 396 911 q 523 899 465 911 q 622 860 581 886 q 685 791 663 833 q 708 689 708 749 q 674 566 708 621 q 575 490 640 511 l 575 485 q 710 415 658 469 q 761 267 761 361 q 736 150 761 200 q 665 67 711 100 q 556 17 619 33 q 415 0 492 0 l 125 0 m 240 524 l 375 524 q 543 564 492 524 q 594 674 594 604 q 541 786 594 753 q 381 819 488 819 l 240 819 l 240 524 m 240 92 l 399 92 q 582 135 517 92 q 647 271 647 179 q 583 395 647 356 q 399 435 519 435 l 240 435 l 240 92 z \"},\"Г\":{\"ha\":692,\"x_min\":125,\"x_max\":650,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 0 l 125 0 z \"},\"Д\":{\"ha\":886,\"x_min\":36,\"x_max\":850,\"o\":\"m 150 0 l 150 -261 l 49 -261 l 36 29 l 36 99 l 78 99 q 107 122 92 104 q 138 178 122 140 q 171 276 154 215 q 204 426 188 336 q 227 551 217 494 q 247 664 238 608 q 265 778 256 719 q 288 911 275 838 l 749 911 l 749 99 l 850 99 l 850 29 l 838 -261 l 736 -261 l 736 0 l 150 0 m 310 407 q 263 216 288 290 q 208 99 239 142 l 632 99 l 632 814 l 378 814 q 359 706 367 756 q 344 610 351 657 q 328 514 336 563 q 310 407 319 465 z \"},\"Е\":{\"ha\":732,\"x_min\":125,\"x_max\":664,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 z \"},\"Ж\":{\"ha\":1118,\"x_min\":8,\"x_max\":1108,\"o\":\"m 8 0 l 286 486 l 190 701 q 157 762 172 739 q 128 797 142 785 q 100 813 114 810 q 71 817 86 817 q 55 815 64 817 q 38 811 46 814 l 18 919 q 42 926 29 924 q 68 928 56 928 q 125 921 99 928 q 176 895 151 914 q 225 843 201 876 q 274 758 249 810 l 381 526 l 504 526 l 504 911 l 614 911 l 614 526 l 736 526 l 844 758 q 893 843 869 810 q 942 895 917 876 q 993 921 967 914 q 1050 928 1019 928 q 1076 926 1063 928 q 1100 919 1089 924 l 1081 811 q 1063 815 1071 814 q 1047 817 1054 817 q 1018 813 1032 817 q 990 797 1004 810 q 961 762 976 785 q 928 701 946 739 l 832 486 l 1108 0 l 982 0 l 746 432 l 614 432 l 614 0 l 504 0 l 504 432 l 372 432 l 136 0 l 8 0 z \"},\"З\":{\"ha\":769,\"x_min\":58,\"x_max\":714,\"o\":\"m 386 -17 q 207 15 286 -17 q 58 117 128 46 l 124 196 q 244 110 183 135 q 385 85 306 85 q 468 97 429 85 q 536 131 507 108 q 583 188 565 154 q 600 264 600 221 q 536 393 600 351 q 354 435 472 435 l 251 435 l 251 524 l 326 524 q 500 563 447 524 q 553 681 553 603 q 502 790 553 753 q 375 826 451 826 q 257 803 311 826 q 161 742 203 781 l 99 819 q 221 898 147 868 q 378 928 294 928 q 495 912 442 928 q 587 866 549 896 q 646 792 625 836 q 667 694 667 749 q 632 567 667 622 q 531 489 597 513 l 531 483 q 662 410 610 468 q 714 258 714 353 q 688 142 714 193 q 618 55 663 90 q 514 1 574 19 q 386 -17 454 -17 z \"},\"И\":{\"ha\":911,\"x_min\":125,\"x_max\":786,\"o\":\"m 125 0 l 125 911 l 239 911 l 239 440 q 234 294 239 368 q 225 150 229 219 l 231 150 l 329 336 l 664 911 l 786 911 l 786 0 l 672 0 l 672 476 q 677 620 672 549 q 686 761 682 692 l 681 761 l 582 575 l 247 0 l 125 0 z \"},\"Й\":{\"ha\":911,\"x_min\":125,\"x_max\":786,\"o\":\"m 125 0 l 125 911 l 239 911 l 239 440 q 234 294 239 368 q 225 150 229 219 l 231 150 l 329 336 l 664 911 l 786 911 l 786 0 l 672 0 l 672 476 q 677 620 672 549 q 686 761 682 692 l 681 761 l 582 575 l 247 0 l 125 0 m 461 985 q 364 1000 403 985 q 301 1041 325 1015 q 265 1100 276 1067 q 251 1168 253 1133 l 351 1168 q 378 1084 353 1119 q 461 1049 403 1049 q 510 1058 490 1049 q 544 1084 531 1068 q 563 1122 557 1100 q 571 1168 569 1143 l 671 1168 q 657 1100 668 1133 q 622 1041 646 1067 q 558 1000 597 1015 q 461 985 519 985 z \"},\"К\":{\"ha\":806,\"x_min\":125,\"x_max\":803,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 526 l 397 526 l 525 758 q 578 843 554 810 q 626 895 601 876 q 675 921 650 914 q 731 928 700 928 q 756 926 743 928 q 781 919 769 924 l 761 811 q 744 815 753 814 q 728 817 735 817 q 700 813 713 817 q 674 796 688 808 q 646 761 661 783 q 610 701 631 739 l 489 486 l 803 0 l 676 0 l 396 432 l 240 432 l 240 0 l 125 0 z \"},\"Л\":{\"ha\":875,\"x_min\":0,\"x_max\":750,\"o\":\"m 78 -17 q 38 -14 56 -17 q 0 -4 19 -11 l 24 103 q 63 94 44 94 q 97 102 81 94 q 128 135 113 110 q 159 210 144 161 q 190 339 174 258 q 243 621 218 482 q 294 911 268 760 l 750 911 l 750 0 l 635 0 l 635 814 l 385 814 q 342 568 363 688 q 299 326 322 449 q 258 156 279 222 q 210 51 236 89 q 151 -2 183 13 q 78 -17 119 -17 z \"},\"М\":{\"ha\":1010,\"x_min\":125,\"x_max\":885,\"o\":\"m 125 0 l 125 911 l 264 911 l 439 425 q 472 330 456 378 q 504 235 488 282 l 510 235 q 541 330 526 282 q 572 425 556 378 l 744 911 l 885 911 l 885 0 l 776 0 l 776 501 q 782 636 776 563 q 792 771 788 710 l 786 771 l 714 564 l 542 92 l 465 92 l 293 564 l 221 771 l 215 771 q 224 636 219 710 q 229 501 229 563 l 229 0 l 125 0 z \"},\"Н\":{\"ha\":906,\"x_min\":125,\"x_max\":781,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 529 l 664 529 l 664 911 l 781 911 l 781 0 l 664 0 l 664 429 l 240 429 l 240 0 l 125 0 z \"},\"О\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 17 375 -17 q 181 112 232 50 q 101 262 129 174 q 72 460 72 350 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 823 262 851 350 q 742 112 794 174 q 619 17 690 50 q 461 -17 547 -17 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 z \"},\"П\":{\"ha\":896,\"x_min\":125,\"x_max\":771,\"o\":\"m 125 0 l 125 911 l 771 911 l 771 0 l 656 0 l 656 814 l 240 814 l 240 0 l 125 0 z \"},\"Р\":{\"ha\":786,\"x_min\":125,\"x_max\":726,\"o\":\"m 125 0 l 125 911 l 385 911 q 524 897 461 911 q 632 852 588 883 q 701 769 676 821 q 726 643 726 718 q 702 518 726 571 q 633 431 678 465 q 527 378 589 396 q 390 361 465 361 l 240 361 l 240 0 l 125 0 m 240 456 l 376 456 q 553 501 496 456 q 611 643 611 546 q 551 780 611 742 q 371 818 490 818 l 240 818 l 240 456 z \"},\"С\":{\"ha\":793,\"x_min\":72,\"x_max\":749,\"o\":\"m 469 -17 q 311 15 383 -17 q 185 108 239 47 q 102 256 132 168 q 72 456 72 344 q 103 653 72 565 q 188 801 133 740 q 315 895 242 863 q 476 928 389 928 q 623 894 560 928 q 726 815 686 860 l 664 740 q 582 803 628 779 q 478 826 536 826 q 360 801 413 826 q 269 727 307 775 q 212 611 232 679 q 192 458 192 543 q 212 303 192 372 q 268 186 232 235 q 356 111 304 138 q 474 85 408 85 q 590 112 540 85 q 685 188 640 139 l 749 115 q 626 18 694 53 q 469 -17 558 -17 z \"},\"Т\":{\"ha\":744,\"x_min\":39,\"x_max\":706,\"o\":\"m 314 0 l 314 814 l 39 814 l 39 911 l 706 911 l 706 814 l 431 814 l 431 0 l 314 0 z \"},\"У\":{\"ha\":714,\"x_min\":7,\"x_max\":714,\"o\":\"m 189 -17 q 138 -13 158 -17 q 99 -3 118 -10 l 122 101 q 147 94 133 97 q 181 92 161 92 q 252 109 225 92 q 299 165 279 126 l 318 214 l 7 911 l 131 911 l 300 506 l 369 326 l 375 326 l 439 506 l 596 911 l 714 911 l 415 165 q 328 32 381 81 q 189 -17 276 -17 z \"},\"Ф\":{\"ha\":1017,\"x_min\":65,\"x_max\":951,\"o\":\"m 176 460 q 249 274 176 342 q 457 203 321 207 l 457 710 q 249 642 321 706 q 176 460 176 578 m 840 460 q 768 642 840 578 q 560 710 696 706 l 560 203 q 768 274 696 207 q 840 460 840 342 m 457 -17 l 457 114 q 168 210 271 121 q 65 460 65 299 q 168 706 65 619 q 457 799 271 793 l 457 928 l 560 928 l 560 799 q 849 706 746 793 q 951 460 951 619 q 849 210 951 299 q 560 114 746 121 l 560 -17 l 457 -17 z \"},\"Х\":{\"ha\":713,\"x_min\":21,\"x_max\":692,\"o\":\"m 21 0 l 286 471 l 39 911 l 167 911 l 290 678 q 324 616 308 646 q 361 546 340 586 l 367 546 q 401 616 386 586 q 432 678 415 646 l 553 911 l 675 911 l 426 465 l 692 0 l 564 0 l 431 246 q 394 315 413 279 q 353 392 375 350 l 347 392 q 310 315 328 350 q 275 246 292 279 l 143 0 l 21 0 z \"},\"Ц\":{\"ha\":892,\"x_min\":125,\"x_max\":856,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 99 l 639 99 l 639 911 l 754 911 l 754 99 l 856 99 l 856 29 l 843 -261 l 742 -261 l 742 0 l 125 0 z \"},\"Ч\":{\"ha\":831,\"x_min\":93,\"x_max\":706,\"o\":\"m 590 0 l 590 408 q 517 398 557 401 q 424 394 478 394 q 285 410 346 394 q 181 460 224 425 q 116 553 139 496 q 93 692 93 610 l 93 911 l 207 911 l 207 692 q 222 596 207 635 q 265 533 236 557 q 337 500 294 510 q 435 490 379 490 q 524 494 486 490 q 590 504 563 497 l 590 911 l 706 911 l 706 0 l 590 0 z \"},\"Ш\":{\"ha\":1201,\"x_min\":125,\"x_max\":1076,\"o\":\"m 125 0 l 125 911 l 239 911 l 239 99 l 544 99 l 544 911 l 657 911 l 657 99 l 963 99 l 963 911 l 1076 911 l 1076 0 l 125 0 z \"},\"Щ\":{\"ha\":1214,\"x_min\":125,\"x_max\":1178,\"o\":\"m 1064 -261 l 1064 0 l 125 0 l 125 911 l 239 911 l 239 99 l 544 99 l 544 911 l 657 911 l 657 99 l 963 99 l 963 911 l 1076 911 l 1076 99 l 1178 99 l 1178 29 l 1165 -261 l 1064 -261 z \"},\"Ъ\":{\"ha\":1000,\"x_min\":39,\"x_max\":939,\"o\":\"m 331 0 l 331 814 l 39 814 l 39 911 l 447 911 l 447 538 l 597 538 q 732 522 669 538 q 840 476 794 507 q 913 396 886 444 q 939 281 939 347 q 915 154 939 207 q 848 67 892 101 q 742 17 804 33 q 606 0 681 0 l 331 0 m 447 94 l 592 94 q 766 138 707 94 q 825 278 825 181 q 763 403 825 361 q 582 444 701 444 l 447 444 l 447 94 z \"},\"Ы\":{\"ha\":1108,\"x_min\":125,\"x_max\":983,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 538 l 382 538 q 519 523 457 538 q 625 477 581 508 q 694 397 669 446 q 718 281 718 349 q 694 154 718 207 q 627 67 671 101 q 522 17 583 33 q 383 0 460 0 l 125 0 m 240 94 l 369 94 q 544 138 485 94 q 604 278 604 181 q 544 405 604 365 q 365 444 485 444 l 240 444 l 240 94 m 868 0 l 868 911 l 983 911 l 983 0 l 868 0 z \"},\"Ь\":{\"ha\":806,\"x_min\":125,\"x_max\":744,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 538 l 408 538 q 545 523 483 538 q 651 477 607 508 q 720 397 696 446 q 744 281 744 349 q 721 154 744 207 q 653 67 697 101 q 548 17 610 33 q 410 0 486 0 l 125 0 m 240 94 l 394 94 q 571 138 511 94 q 631 278 631 181 q 571 405 631 365 q 392 444 511 444 l 240 444 l 240 94 z \"},\"Э\":{\"ha\":793,\"x_min\":44,\"x_max\":721,\"o\":\"m 338 -17 q 174 18 244 -17 q 44 115 103 53 l 108 188 q 209 112 154 139 q 335 85 264 85 q 526 170 456 85 q 604 429 597 256 l 222 429 l 222 528 l 603 528 q 522 750 590 674 q 333 826 453 826 q 221 803 272 826 q 129 740 169 781 l 65 815 q 181 894 110 860 q 338 928 253 928 q 494 897 424 928 q 615 807 565 867 q 693 659 665 747 q 721 456 721 571 q 692 251 721 339 q 613 103 664 163 q 491 14 561 44 q 338 -17 421 -17 z \"},\"Ю\":{\"ha\":1261,\"x_min\":125,\"x_max\":1189,\"o\":\"m 814 -17 q 667 15 733 -17 q 552 103 600 46 q 476 244 504 161 q 443 429 447 326 l 240 429 l 240 0 l 125 0 l 125 911 l 240 911 l 240 529 l 446 529 q 484 697 454 622 q 561 822 514 771 q 672 901 608 874 q 814 928 736 928 q 967 895 897 928 q 1085 802 1036 863 q 1162 655 1135 742 q 1189 460 1189 568 q 1162 262 1189 350 q 1085 112 1135 174 q 967 17 1036 50 q 814 -17 897 -17 m 814 85 q 921 111 874 85 q 1001 187 968 138 q 1052 305 1035 236 q 1069 460 1069 374 q 1052 613 1069 544 q 1001 728 1035 681 q 921 801 968 775 q 814 826 874 826 q 708 801 756 826 q 628 728 661 775 q 577 613 594 681 q 560 460 560 544 q 577 305 560 374 q 628 187 594 236 q 708 111 661 138 q 814 85 756 85 z \"},\"Я\":{\"ha\":808,\"x_min\":31,\"x_max\":683,\"o\":\"m 568 0 l 568 385 l 400 385 l 164 0 l 31 0 l 285 397 q 137 483 194 421 q 79 656 79 546 q 103 775 79 726 q 169 854 126 824 q 270 898 211 885 q 399 911 329 911 l 683 911 l 683 0 l 568 0 m 415 479 l 568 479 l 568 818 l 415 818 q 251 782 308 818 q 194 656 194 746 q 251 523 194 567 q 415 479 308 479 z \"},\"Ѐ\":{\"ha\":732,\"x_min\":125,\"x_max\":664,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 m 418 968 l 207 1128 l 272 1204 l 469 1026 l 418 968 z \"},\"Ё\":{\"ha\":732,\"x_min\":125,\"x_max\":664,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 m 251 993 q 203 1013 222 993 q 183 1061 183 1032 q 203 1110 183 1092 q 251 1129 222 1129 q 301 1110 282 1129 q 319 1061 319 1092 q 301 1013 319 1032 q 251 993 282 993 m 538 993 q 488 1013 507 993 q 469 1061 469 1032 q 488 1110 469 1092 q 538 1129 507 1129 q 586 1110 567 1129 q 606 1061 606 1092 q 586 1013 606 1032 q 538 993 567 993 z \"},\"Ђ\":{\"ha\":954,\"x_min\":39,\"x_max\":886,\"o\":\"m 636 -17 q 588 -12 613 -17 q 547 -3 563 -8 l 568 90 q 593 83 578 86 q 622 79 608 79 q 674 89 647 79 q 722 120 700 99 q 757 177 743 142 q 771 265 771 213 q 713 415 771 368 q 547 461 654 461 q 469 458 507 461 q 403 447 432 454 l 403 0 l 286 0 l 286 814 l 39 814 l 39 911 l 721 911 l 721 814 l 403 814 l 403 543 q 476 553 436 550 q 563 557 515 557 q 691 540 632 557 q 794 489 750 524 q 862 399 838 454 q 886 267 886 343 q 865 133 886 188 q 809 46 844 79 q 728 -2 774 13 q 636 -17 683 -17 z \"},\"Ѓ\":{\"ha\":692,\"x_min\":125,\"x_max\":650,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 0 l 125 0 m 379 968 l 328 1026 l 525 1204 l 590 1128 l 379 968 z \"},\"Є\":{\"ha\":793,\"x_min\":72,\"x_max\":749,\"o\":\"m 469 -17 q 309 14 382 -17 q 183 103 236 44 q 101 251 131 163 q 72 456 72 339 q 102 659 72 571 q 185 807 132 747 q 313 897 239 867 q 475 928 386 928 q 622 894 558 928 q 726 815 686 860 l 664 740 q 581 803 628 779 q 476 826 535 826 q 279 750 354 826 q 189 528 204 674 l 571 528 l 571 429 l 188 429 q 269 170 194 256 q 474 85 343 85 q 590 112 540 85 q 685 188 640 139 l 749 115 q 626 18 694 53 q 469 -17 558 -17 z \"},\"Ѕ\":{\"ha\":742,\"x_min\":58,\"x_max\":688,\"o\":\"m 378 -17 q 200 19 282 -17 q 58 118 118 56 l 128 199 q 242 116 176 147 q 379 85 308 85 q 519 126 469 85 q 569 233 569 167 q 558 292 569 268 q 526 334 546 317 q 478 365 506 351 q 418 394 450 379 l 288 451 q 222 485 256 465 q 163 532 189 504 q 119 598 136 560 q 103 686 103 636 q 124 782 103 738 q 184 859 146 826 q 274 910 222 892 q 389 928 326 928 q 540 897 471 928 q 658 815 610 865 l 596 740 q 503 803 554 781 q 389 826 453 826 q 266 791 313 826 q 219 693 219 756 q 233 637 219 660 q 268 597 246 614 q 317 566 290 579 q 371 542 343 553 l 500 486 q 574 448 539 469 q 633 398 608 426 q 673 331 658 369 q 688 243 688 293 q 666 142 688 189 q 604 59 644 94 q 507 3 564 24 q 378 -17 450 -17 z \"},\"І\":{\"ha\":365,\"x_min\":125,\"x_max\":240,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 0 l 125 0 z \"},\"Ї\":{\"ha\":365,\"x_min\":-29,\"x_max\":393,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 0 l 125 0 m 39 993 q -10 1013 10 993 q -29 1061 -29 1032 q -10 1110 -29 1092 q 39 1129 10 1129 q 88 1110 69 1129 q 107 1061 107 1092 q 88 1013 107 1032 q 39 993 69 993 m 325 993 q 276 1013 294 993 q 257 1061 257 1032 q 276 1110 257 1092 q 325 1129 294 1129 q 374 1110 354 1129 q 393 1061 393 1092 q 374 1013 393 1032 q 325 993 354 993 z \"},\"Ј\":{\"ha\":667,\"x_min\":43,\"x_max\":546,\"o\":\"m 294 -17 q 43 129 124 -17 l 126 188 q 196 109 157 133 q 283 85 235 85 q 393 130 357 85 q 429 279 429 175 l 429 911 l 546 911 l 546 268 q 531 158 546 210 q 487 67 517 106 q 409 6 457 28 q 294 -17 361 -17 z \"},\"Љ\":{\"ha\":1254,\"x_min\":8,\"x_max\":1193,\"o\":\"m 86 -17 q 46 -14 64 -17 q 8 -4 28 -11 l 32 103 q 71 94 50 94 q 105 102 89 94 q 136 135 121 110 q 167 210 151 161 q 199 339 182 258 q 251 621 226 482 q 303 911 276 760 l 731 911 l 731 538 l 857 538 q 994 523 932 538 q 1100 477 1056 508 q 1169 397 1144 446 q 1193 281 1193 349 q 1169 154 1193 207 q 1102 67 1146 101 q 997 17 1058 33 q 858 0 935 0 l 615 0 l 615 814 l 393 814 q 351 567 371 688 q 308 325 331 447 q 267 154 289 221 q 218 49 244 88 q 160 -3 192 11 q 86 -17 128 -17 m 731 94 l 843 94 q 1019 138 960 94 q 1079 278 1079 181 q 1019 405 1079 365 q 840 444 960 444 l 731 444 l 731 94 z \"},\"Њ\":{\"ha\":1290,\"x_min\":125,\"x_max\":1229,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 529 l 650 529 l 650 911 l 767 911 l 767 538 l 893 538 q 1030 523 968 538 q 1136 477 1092 508 q 1205 397 1181 446 q 1229 281 1229 349 q 1206 154 1229 207 q 1138 67 1182 101 q 1033 17 1094 33 q 894 0 971 0 l 650 0 l 650 429 l 240 429 l 240 0 l 125 0 m 767 94 l 879 94 q 1056 138 996 94 q 1115 278 1115 181 q 1056 405 1115 365 q 876 444 996 444 l 767 444 l 767 94 z \"},\"Ћ\":{\"ha\":967,\"x_min\":39,\"x_max\":874,\"o\":\"m 286 0 l 286 814 l 39 814 l 39 911 l 721 911 l 721 814 l 403 814 l 403 543 q 476 553 436 550 q 557 557 517 557 q 690 541 631 557 q 790 490 749 525 q 852 401 831 456 q 874 271 874 347 l 874 0 l 760 0 l 760 271 q 707 417 760 374 q 546 461 654 461 q 471 458 510 461 q 403 447 432 454 l 403 0 l 286 0 z \"},\"Ќ\":{\"ha\":806,\"x_min\":125,\"x_max\":803,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 526 l 397 526 l 525 758 q 578 843 554 810 q 626 895 601 876 q 675 921 650 914 q 731 928 700 928 q 756 926 743 928 q 781 919 769 924 l 761 811 q 744 815 753 814 q 728 817 735 817 q 700 813 713 817 q 674 796 688 808 q 646 761 661 783 q 610 701 631 739 l 489 486 l 803 0 l 676 0 l 396 432 l 240 432 l 240 0 l 125 0 m 426 974 l 375 1032 l 572 1210 l 638 1133 l 426 974 z \"},\"Ѝ\":{\"ha\":911,\"x_min\":125,\"x_max\":786,\"o\":\"m 125 0 l 125 911 l 239 911 l 239 440 q 234 294 239 368 q 225 150 229 219 l 231 150 l 329 336 l 664 911 l 786 911 l 786 0 l 672 0 l 672 476 q 677 620 672 549 q 686 761 682 692 l 681 761 l 582 575 l 247 0 l 125 0 m 485 974 l 274 1133 l 339 1210 l 536 1032 l 485 974 z \"},\"Ў\":{\"ha\":714,\"x_min\":7,\"x_max\":714,\"o\":\"m 189 -17 q 138 -13 158 -17 q 99 -3 118 -10 l 122 101 q 147 94 133 97 q 181 92 161 92 q 252 109 225 92 q 299 165 279 126 l 318 214 l 7 911 l 131 911 l 300 506 l 369 326 l 375 326 l 439 506 l 596 911 l 714 911 l 415 165 q 328 32 381 81 q 189 -17 276 -17 m 357 979 q 260 994 299 979 q 197 1035 221 1010 q 160 1094 172 1061 q 147 1163 149 1128 l 247 1163 q 274 1078 249 1114 q 357 1043 299 1043 q 406 1053 386 1043 q 440 1078 426 1063 q 459 1116 453 1094 q 467 1163 465 1138 l 567 1163 q 553 1094 564 1128 q 517 1035 542 1061 q 454 994 493 1010 q 357 979 415 979 z \"},\"Џ\":{\"ha\":896,\"x_min\":125,\"x_max\":771,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 99 l 656 99 l 656 911 l 771 911 l 771 0 l 511 0 l 500 -261 l 399 -261 l 399 0 l 125 0 z \"},\"Ѣ\":{\"ha\":853,\"x_min\":39,\"x_max\":792,\"o\":\"m 231 0 l 231 704 l 39 704 l 39 799 l 231 799 l 231 972 l 347 972 l 347 799 l 672 799 l 672 704 l 347 704 l 347 515 l 456 515 q 592 502 531 515 q 699 460 654 489 q 767 386 743 432 q 792 275 792 340 q 769 149 792 201 q 703 64 746 97 q 601 15 661 31 q 464 0 540 0 l 231 0 m 347 92 l 450 92 q 622 133 565 92 q 678 269 678 174 q 620 392 678 356 q 440 429 563 429 l 347 429 l 347 92 z \"},\"Ѳ\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 15 375 -17 q 181 108 232 47 q 101 257 129 168 q 72 460 72 346 q 101 660 72 574 q 181 807 129 747 q 303 897 232 867 q 461 928 375 928 q 619 897 547 928 q 742 807 690 867 q 823 660 794 747 q 851 460 851 572 q 823 257 851 346 q 742 108 794 168 q 619 15 690 47 q 461 -17 547 -17 m 461 831 q 275 752 347 831 q 189 526 203 674 l 733 526 q 647 752 719 674 q 461 831 575 831 m 461 81 q 656 171 582 81 q 736 432 729 261 l 186 432 q 267 171 193 261 q 461 81 340 81 z \"},\"Ѵ\":{\"ha\":735,\"x_min\":0,\"x_max\":779,\"o\":\"m 292 0 l 0 911 l 124 911 l 269 419 q 313 268 293 338 q 358 118 332 199 l 364 118 q 384 195 375 158 q 403 268 393 232 q 422 342 413 304 q 443 419 432 379 l 532 735 q 599 882 560 836 q 713 928 639 928 q 748 925 733 928 q 779 915 763 922 l 756 808 q 740 814 749 811 q 719 817 731 817 q 671 791 689 817 q 638 714 653 765 l 433 0 l 292 0 z \"},\"Ґ\":{\"ha\":692,\"x_min\":125,\"x_max\":663,\"o\":\"m 125 0 l 125 911 l 543 911 l 564 1150 l 663 1150 l 650 814 l 240 814 l 240 0 l 125 0 z \"},\"Ғ\":{\"ha\":724,\"x_min\":46,\"x_max\":681,\"o\":\"m 46 426 l 46 488 l 156 492 l 156 911 l 681 911 l 681 814 l 271 814 l 271 492 l 478 492 l 478 426 l 271 426 l 271 0 l 156 0 l 156 426 l 46 426 z \"},\"Җ\":{\"ha\":1176,\"x_min\":8,\"x_max\":1140,\"o\":\"m 1026 -261 l 1026 0 l 982 0 l 746 432 l 614 432 l 614 0 l 504 0 l 504 432 l 372 432 l 136 0 l 8 0 l 286 486 l 190 701 q 157 762 172 739 q 128 797 142 785 q 100 813 114 810 q 71 817 86 817 q 55 815 64 817 q 38 811 46 814 l 18 919 q 42 926 29 924 q 68 928 56 928 q 125 921 99 928 q 176 895 151 914 q 225 843 201 876 q 274 758 249 810 l 381 526 l 504 526 l 504 911 l 614 911 l 614 526 l 736 526 l 844 758 q 893 843 869 810 q 942 895 917 876 q 993 921 967 914 q 1050 928 1019 928 q 1076 926 1063 928 q 1100 919 1089 924 l 1081 811 q 1063 815 1071 814 q 1047 817 1054 817 q 1018 813 1032 817 q 990 797 1004 810 q 961 762 976 785 q 928 701 946 739 l 832 486 l 1053 99 l 1140 99 l 1140 29 l 1128 -261 l 1026 -261 z \"},\"Ҙ\":{\"ha\":769,\"x_min\":58,\"x_max\":714,\"o\":\"m 335 -261 l 335 -14 q 185 24 253 -7 q 58 117 118 54 l 124 196 q 244 110 183 135 q 385 85 306 85 q 468 97 429 85 q 536 131 507 108 q 583 188 565 154 q 600 264 600 221 q 536 393 600 351 q 354 435 472 435 l 251 435 l 251 524 l 326 524 q 500 563 447 524 q 553 681 553 603 q 502 790 553 753 q 375 826 451 826 q 257 803 311 826 q 161 742 203 781 l 99 819 q 221 898 147 868 q 378 928 294 928 q 495 912 442 928 q 587 866 549 896 q 646 792 625 836 q 667 694 667 749 q 632 567 667 622 q 531 489 597 513 l 531 483 q 662 410 610 468 q 714 258 714 353 q 694 153 714 200 q 638 72 674 106 q 553 16 603 38 q 447 -12 504 -6 l 436 -261 l 335 -261 z \"},\"Қ\":{\"ha\":872,\"x_min\":125,\"x_max\":836,\"o\":\"m 722 -261 l 722 0 l 676 0 l 396 432 l 240 432 l 240 0 l 125 0 l 125 911 l 240 911 l 240 526 l 397 526 l 525 758 q 578 843 554 810 q 626 895 601 876 q 675 921 650 914 q 731 928 700 928 q 756 926 743 928 q 781 919 769 924 l 761 811 q 744 815 753 814 q 728 817 735 817 q 700 813 713 817 q 674 796 688 808 q 646 761 661 783 q 610 701 631 739 l 489 486 l 739 99 l 836 99 l 836 29 l 824 -261 l 722 -261 z \"},\"Ҡ\":{\"ha\":994,\"x_min\":39,\"x_max\":992,\"o\":\"m 314 0 l 314 814 l 39 814 l 39 911 l 431 911 l 431 526 l 588 526 l 715 758 q 767 843 743 810 q 815 895 792 876 q 865 921 839 914 q 921 928 890 928 q 947 926 933 928 q 971 919 960 924 l 951 811 q 933 815 942 814 q 918 817 925 817 q 890 813 903 817 q 864 796 878 808 q 835 761 850 783 q 799 701 819 739 l 679 486 l 992 0 l 867 0 l 586 432 l 431 432 l 431 0 l 314 0 z \"},\"Ң\":{\"ha\":918,\"x_min\":125,\"x_max\":882,\"o\":\"m 768 -261 l 768 0 l 664 0 l 664 429 l 240 429 l 240 0 l 125 0 l 125 911 l 240 911 l 240 529 l 664 529 l 664 911 l 781 911 l 781 99 l 882 99 l 882 29 l 869 -261 l 768 -261 z \"},\"Ҫ\":{\"ha\":793,\"x_min\":72,\"x_max\":749,\"o\":\"m 415 -261 l 415 -14 q 277 32 340 -4 q 169 128 214 68 q 98 270 124 188 q 72 456 72 353 q 103 653 72 565 q 188 801 133 740 q 315 895 242 863 q 476 928 389 928 q 623 894 560 928 q 726 815 686 860 l 664 740 q 582 803 628 779 q 478 826 536 826 q 360 801 413 826 q 269 727 307 775 q 212 611 232 679 q 192 458 192 543 q 212 303 192 372 q 268 186 232 235 q 356 111 304 138 q 474 85 408 85 q 590 112 540 85 q 685 188 640 139 l 749 115 q 650 31 704 63 q 528 -12 596 -1 l 517 -261 l 415 -261 z \"},\"Ү\":{\"ha\":661,\"x_min\":-1,\"x_max\":663,\"o\":\"m 272 0 l 272 353 l -1 911 l 122 911 l 240 654 q 283 556 263 604 q 328 456 304 507 l 333 456 q 381 556 357 507 q 425 654 404 604 l 542 911 l 663 911 l 389 353 l 389 0 l 272 0 z \"},\"Ұ\":{\"ha\":661,\"x_min\":-1,\"x_max\":663,\"o\":\"m 79 338 l 79 399 l 201 403 l 247 403 l -1 911 l 122 911 l 240 654 q 283 556 263 604 q 328 456 304 507 l 333 456 q 381 556 357 507 q 425 654 404 604 l 542 911 l 663 911 l 414 403 l 582 403 l 582 338 l 389 338 l 389 0 l 272 0 l 272 338 l 79 338 z \"},\"Ҳ\":{\"ha\":765,\"x_min\":21,\"x_max\":731,\"o\":\"m 618 -261 l 618 0 l 564 0 l 431 246 q 394 315 413 279 q 353 392 375 350 l 347 392 q 310 315 328 350 q 275 246 292 279 l 143 0 l 21 0 l 286 471 l 39 911 l 167 911 l 290 678 q 324 616 308 646 q 361 546 340 586 l 367 546 q 401 616 386 586 q 432 678 415 646 l 553 911 l 675 911 l 426 465 l 636 99 l 731 99 l 731 29 l 718 -261 l 618 -261 z \"},\"Ҷ\":{\"ha\":843,\"x_min\":93,\"x_max\":807,\"o\":\"m 696 -261 l 696 0 l 590 0 l 590 408 q 517 398 557 401 q 424 394 478 394 q 285 410 346 394 q 181 460 224 425 q 116 553 139 496 q 93 692 93 610 l 93 911 l 207 911 l 207 692 q 222 596 207 635 q 265 533 236 557 q 337 500 294 510 q 435 490 379 490 q 524 494 486 490 q 590 504 563 497 l 590 911 l 706 911 l 706 99 l 807 99 l 807 29 l 794 -261 l 696 -261 z \"},\"Һ\":{\"ha\":831,\"x_min\":125,\"x_max\":738,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 553 q 313 563 274 558 q 406 567 353 567 q 545 551 483 567 q 649 501 607 536 q 715 408 692 465 q 738 269 738 351 l 738 0 l 624 0 l 624 269 q 609 365 624 326 q 565 428 594 404 q 493 461 536 451 q 394 471 450 471 q 306 467 344 471 q 240 457 268 463 l 240 0 l 125 0 z \"},\"Ӏ\":{\"ha\":365,\"x_min\":125,\"x_max\":240,\"o\":\"m 125 0 l 125 911 l 240 911 l 240 0 l 125 0 z \"},\"Ӂ\":{\"ha\":1118,\"x_min\":8,\"x_max\":1108,\"o\":\"m 8 0 l 286 486 l 190 701 q 157 762 172 739 q 128 797 142 785 q 100 813 114 810 q 71 817 86 817 q 55 815 64 817 q 38 811 46 814 l 18 919 q 42 926 29 924 q 68 928 56 928 q 125 921 99 928 q 176 895 151 914 q 225 843 201 876 q 274 758 249 810 l 381 526 l 504 526 l 504 911 l 614 911 l 614 526 l 736 526 l 844 758 q 893 843 869 810 q 942 895 917 876 q 993 921 967 914 q 1050 928 1019 928 q 1076 926 1063 928 q 1100 919 1089 924 l 1081 811 q 1063 815 1071 814 q 1047 817 1054 817 q 1018 813 1032 817 q 990 797 1004 810 q 961 762 976 785 q 928 701 946 739 l 832 486 l 1108 0 l 982 0 l 746 432 l 614 432 l 614 0 l 504 0 l 504 432 l 372 432 l 136 0 l 8 0 m 557 979 q 460 994 499 979 q 397 1035 421 1010 q 360 1094 372 1061 q 347 1163 349 1128 l 447 1163 q 474 1078 449 1114 q 557 1043 499 1043 q 606 1053 586 1043 q 640 1078 626 1063 q 659 1116 653 1094 q 667 1163 665 1138 l 767 1163 q 753 1094 764 1128 q 717 1035 742 1061 q 654 994 693 1010 q 557 979 615 979 z \"},\"Ӑ\":{\"ha\":756,\"x_min\":4,\"x_max\":751,\"o\":\"m 282 510 l 239 371 l 513 371 l 469 510 q 422 662 444 586 q 378 817 400 738 l 372 817 q 329 662 351 738 q 282 510 307 586 m 4 0 l 313 911 l 443 911 l 751 0 l 628 0 l 542 278 l 210 278 l 122 0 l 4 0 m 378 979 q 281 994 319 979 q 217 1035 242 1010 q 181 1094 193 1061 q 168 1163 169 1128 l 268 1163 q 294 1078 269 1114 q 378 1043 319 1043 q 427 1053 407 1043 q 460 1078 447 1063 q 480 1116 474 1094 q 488 1163 486 1138 l 588 1163 q 574 1094 585 1128 q 538 1035 563 1061 q 475 994 514 1010 q 378 979 436 979 z \"},\"Ӕ\":{\"ha\":1142,\"x_min\":11,\"x_max\":1074,\"o\":\"m 403 522 l 318 358 l 557 358 l 557 819 l 551 819 q 403 522 478 671 m 11 0 l 489 911 l 1060 911 l 1060 814 l 674 814 l 674 528 l 996 528 l 996 429 l 674 429 l 674 99 l 1074 99 l 1074 0 l 557 0 l 557 265 l 271 265 l 133 0 l 11 0 z \"},\"Ӗ\":{\"ha\":732,\"x_min\":125,\"x_max\":664,\"o\":\"m 125 0 l 125 911 l 650 911 l 650 814 l 240 814 l 240 528 l 586 528 l 586 429 l 240 429 l 240 99 l 664 99 l 664 0 l 125 0 m 394 979 q 297 994 336 979 q 234 1035 258 1010 q 198 1094 210 1061 q 185 1163 186 1128 l 285 1163 q 311 1078 286 1114 q 394 1043 336 1043 q 444 1053 424 1043 q 477 1078 464 1063 q 497 1116 490 1094 q 504 1163 503 1138 l 604 1163 q 590 1094 601 1128 q 555 1035 579 1061 q 492 994 531 1010 q 394 979 453 979 z \"},\"Ә\":{\"ha\":914,\"x_min\":81,\"x_max\":842,\"o\":\"m 454 -17 q 297 16 367 -17 q 180 110 228 49 q 106 258 132 171 q 81 451 81 344 q 81 467 81 458 q 83 486 82 476 l 728 486 q 651 743 721 654 q 451 832 582 832 q 326 807 382 832 q 229 742 269 782 l 172 821 q 294 898 221 868 q 460 928 367 928 q 740 808 639 928 q 842 458 842 688 q 815 256 842 344 q 737 108 788 168 q 615 15 686 47 q 454 -17 543 -17 m 454 79 q 642 160 571 79 q 725 397 714 242 l 199 397 q 274 163 206 246 q 454 79 343 79 z \"},\"Ӣ\":{\"ha\":911,\"x_min\":125,\"x_max\":786,\"o\":\"m 125 0 l 125 911 l 239 911 l 239 440 q 234 294 239 368 q 225 150 229 219 l 231 150 l 329 336 l 664 911 l 786 911 l 786 0 l 672 0 l 672 476 q 677 620 672 549 q 686 761 682 692 l 681 761 l 582 575 l 247 0 l 125 0 m 275 1026 l 275 1106 l 647 1106 l 647 1026 l 275 1026 z \"},\"Ӧ\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 17 375 -17 q 181 112 232 50 q 101 262 129 174 q 72 460 72 350 q 101 656 72 569 q 181 803 129 743 q 303 896 232 864 q 461 928 375 928 q 619 895 547 928 q 742 802 690 863 q 823 655 794 742 q 851 460 851 568 q 823 262 851 350 q 742 112 794 174 q 619 17 690 50 q 461 -17 547 -17 m 461 85 q 572 111 522 85 q 656 187 621 138 q 711 305 692 236 q 731 460 731 374 q 711 613 731 544 q 656 728 692 681 q 572 801 621 775 q 461 826 522 826 q 351 801 400 826 q 266 728 301 775 q 211 613 231 681 q 192 460 192 544 q 211 305 192 374 q 266 187 231 236 q 351 111 301 138 q 461 85 400 85 m 318 993 q 269 1013 289 993 q 250 1061 250 1032 q 269 1110 250 1092 q 318 1129 289 1129 q 367 1110 349 1129 q 386 1061 386 1092 q 367 1013 386 1032 q 318 993 349 993 m 604 993 q 555 1013 574 993 q 536 1061 536 1032 q 555 1110 536 1092 q 604 1129 574 1129 q 653 1110 633 1129 q 672 1061 672 1092 q 653 1013 672 1032 q 604 993 633 993 z \"},\"Ө\":{\"ha\":922,\"x_min\":72,\"x_max\":851,\"o\":\"m 461 -17 q 303 15 375 -17 q 181 108 232 47 q 101 257 129 168 q 72 460 72 346 q 101 660 72 574 q 181 807 129 747 q 303 897 232 867 q 461 928 375 928 q 619 897 547 928 q 742 807 690 867 q 823 660 794 747 q 851 460 851 572 q 823 257 851 346 q 742 108 794 168 q 619 15 690 47 q 461 -17 547 -17 m 461 831 q 275 752 347 831 q 189 526 203 674 l 733 526 q 647 752 719 674 q 461 831 575 831 m 461 81 q 656 171 582 81 q 736 432 729 261 l 186 432 q 267 171 193 261 q 461 81 340 81 z \"},\"Ӯ\":{\"ha\":714,\"x_min\":7,\"x_max\":714,\"o\":\"m 189 -17 q 138 -13 158 -17 q 99 -3 118 -10 l 122 101 q 147 94 133 97 q 181 92 161 92 q 252 109 225 92 q 299 165 279 126 l 318 214 l 7 911 l 131 911 l 300 506 l 369 326 l 375 326 l 439 506 l 596 911 l 714 911 l 415 165 q 328 32 381 81 q 189 -17 276 -17 m 164 1021 l 164 1100 l 536 1100 l 536 1021 l 164 1021 z \"},\"Ӳ\":{\"ha\":714,\"x_min\":7,\"x_max\":714,\"o\":\"m 189 -17 q 138 -13 158 -17 q 99 -3 118 -10 l 122 101 q 147 94 133 97 q 181 92 161 92 q 252 109 225 92 q 299 165 279 126 l 318 214 l 7 911 l 131 911 l 300 506 l 369 326 l 375 326 l 439 506 l 596 911 l 714 911 l 415 165 q 328 32 381 81 q 189 -17 276 -17 m 208 1006 l 336 1217 l 414 1172 l 268 976 l 208 1006 m 431 1006 l 558 1217 l 636 1172 l 490 976 l 431 1006 z \"},\"а\":{\"ha\":700,\"x_min\":72,\"x_max\":601,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 z \"},\"б\":{\"ha\":756,\"x_min\":74,\"x_max\":689,\"o\":\"m 392 -17 q 157 94 240 -17 q 74 410 74 204 q 103 685 74 581 q 189 849 133 789 q 323 935 244 910 q 497 976 401 961 q 544 984 525 981 q 580 992 564 988 q 609 1001 596 996 q 638 1014 622 1007 l 660 910 q 598 883 632 892 q 521 867 564 874 q 380 840 439 854 q 281 794 321 826 q 219 701 242 761 q 189 538 197 642 q 294 622 233 593 q 418 650 354 650 q 528 628 478 650 q 613 566 578 607 q 669 467 649 525 q 689 335 689 408 q 665 189 689 254 q 601 78 642 124 q 507 8 561 32 q 392 -17 453 -17 m 392 78 q 463 97 431 78 q 520 149 496 115 q 558 231 544 183 q 571 335 571 278 q 524 501 571 439 q 389 563 476 563 q 288 536 340 563 q 183 440 235 510 l 183 388 q 235 159 183 240 q 392 78 288 78 z \"},\"в\":{\"ha\":706,\"x_min\":114,\"x_max\":651,\"o\":\"m 114 0 l 114 675 l 374 675 q 475 665 429 675 q 553 635 521 656 q 604 583 586 615 q 622 504 622 550 q 592 411 622 447 q 510 360 563 375 l 510 356 q 565 336 539 349 q 610 304 590 324 q 640 257 629 285 q 651 193 651 229 q 631 107 651 143 q 576 47 611 71 q 492 11 540 22 q 385 0 443 0 l 114 0 m 226 392 l 354 392 q 475 419 439 392 q 511 493 511 446 q 476 567 511 540 q 363 593 442 593 l 226 593 l 226 392 m 226 82 l 372 82 q 497 113 456 82 q 538 200 538 143 q 494 281 538 251 q 365 310 451 310 l 226 310 l 226 82 z \"},\"г\":{\"ha\":571,\"x_min\":114,\"x_max\":535,\"o\":\"m 114 0 l 114 675 l 535 675 l 535 582 l 228 582 l 228 0 l 114 0 z \"},\"д\":{\"ha\":739,\"x_min\":26,\"x_max\":708,\"o\":\"m 138 0 l 138 -239 l 39 -239 l 26 21 l 26 93 l 60 93 q 87 116 74 101 q 111 161 100 131 q 133 243 122 192 q 154 376 144 294 l 190 675 l 610 675 l 610 93 l 708 93 l 708 21 l 697 -239 l 599 -239 l 599 0 l 138 0 m 254 354 q 224 192 243 254 q 182 93 206 129 l 496 93 l 496 582 l 281 582 l 254 354 z \"},\"е\":{\"ha\":689,\"x_min\":64,\"x_max\":636,\"o\":\"m 388 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 511 4 565 25 q 388 -17 457 -17 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 z \"},\"ж\":{\"ha\":946,\"x_min\":18,\"x_max\":928,\"o\":\"m 18 0 l 231 356 l 176 489 q 130 564 153 547 q 79 581 107 581 q 68 581 72 581 q 57 578 64 581 l 36 685 q 76 692 54 692 q 175 662 132 692 q 254 547 218 632 l 318 397 l 422 397 l 422 675 l 524 675 l 524 397 l 628 397 l 692 547 q 771 662 728 632 q 869 692 814 692 q 908 685 892 692 l 889 578 q 878 581 882 581 q 867 581 874 581 q 815 564 839 581 q 768 489 792 547 l 715 356 l 928 0 l 804 0 l 635 304 l 524 304 l 524 0 l 422 0 l 422 304 l 311 304 l 142 0 l 18 0 z \"},\"з\":{\"ha\":633,\"x_min\":51,\"x_max\":579,\"o\":\"m 307 -17 q 174 2 236 -17 q 51 69 111 21 l 100 143 q 197 90 147 104 q 297 75 246 75 q 363 83 332 75 q 416 107 393 92 q 452 145 439 122 q 465 196 465 168 q 421 282 465 254 q 293 310 376 310 l 200 310 l 200 392 l 276 392 q 399 420 358 392 q 439 499 439 449 q 400 576 439 550 q 299 601 361 601 q 198 586 240 601 q 115 542 156 571 l 67 617 q 173 672 115 651 q 304 692 231 692 q 399 681 354 692 q 476 647 443 669 q 530 590 510 625 q 550 510 550 556 q 521 421 550 461 q 439 360 492 381 l 439 354 q 538 299 497 339 q 579 186 579 260 q 557 101 579 139 q 497 38 535 64 q 410 -3 460 11 q 307 -17 361 -17 z \"},\"и\":{\"ha\":785,\"x_min\":114,\"x_max\":671,\"o\":\"m 114 0 l 114 675 l 225 675 l 225 394 q 222 276 225 340 q 214 146 218 211 l 219 146 q 265 218 239 178 q 308 290 290 258 l 564 675 l 671 675 l 671 0 l 560 0 l 560 281 q 563 399 560 335 q 571 531 567 464 l 565 531 q 520 458 546 499 q 476 386 494 417 l 219 0 l 114 0 z \"},\"й\":{\"ha\":785,\"x_min\":114,\"x_max\":671,\"o\":\"m 114 0 l 114 675 l 225 675 l 225 394 q 222 276 225 340 q 214 146 218 211 l 219 146 q 265 218 239 178 q 308 290 290 258 l 564 675 l 671 675 l 671 0 l 560 0 l 560 281 q 563 399 560 335 q 571 531 567 464 l 565 531 q 520 458 546 499 q 476 386 494 417 l 219 0 l 114 0 m 396 796 q 297 814 338 796 q 231 862 257 832 q 192 930 204 892 q 178 1008 179 968 l 272 1008 q 280 952 274 979 q 301 906 286 925 q 338 874 315 886 q 396 863 361 863 q 453 874 431 863 q 491 906 476 886 q 512 952 506 925 q 519 1008 518 979 l 614 1008 q 599 930 611 968 q 561 862 588 892 q 494 814 535 832 q 396 796 454 796 z \"},\"к\":{\"ha\":692,\"x_min\":114,\"x_max\":674,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 397 l 358 397 l 425 547 q 464 619 444 592 q 506 663 483 647 q 551 685 528 679 q 603 692 575 692 q 642 685 625 692 l 622 578 q 611 581 615 581 q 600 581 607 581 q 574 577 586 581 q 551 564 563 574 q 526 536 539 554 q 501 489 514 518 l 444 356 l 674 0 l 549 0 l 361 304 l 228 304 l 228 0 l 114 0 z \"},\"л\":{\"ha\":738,\"x_min\":14,\"x_max\":624,\"o\":\"m 75 -17 q 42 -14 56 -17 q 14 -6 29 -11 l 36 100 q 50 96 43 97 q 67 94 57 94 q 125 128 103 94 q 157 238 147 163 q 183 456 171 347 q 208 675 196 565 l 624 675 l 624 0 l 508 0 l 508 582 l 299 582 q 276 395 288 489 q 254 208 265 301 q 75 -17 225 -17 z \"},\"м\":{\"ha\":879,\"x_min\":114,\"x_max\":765,\"o\":\"m 114 0 l 114 675 l 246 675 l 378 358 q 408 276 393 317 q 439 194 424 235 l 444 194 q 476 276 460 235 q 506 358 492 317 l 635 675 l 765 675 l 765 0 l 661 0 l 661 303 q 663 355 661 325 q 666 416 664 385 q 670 478 668 447 q 675 536 672 510 l 669 536 q 638 455 654 496 q 607 376 622 414 l 479 64 l 403 64 l 272 376 q 241 455 257 414 q 210 536 225 496 l 204 536 q 208 478 206 510 q 212 416 210 447 q 215 355 214 385 q 217 303 217 325 l 217 0 l 114 0 z \"},\"н\":{\"ha\":781,\"x_min\":114,\"x_max\":667,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 401 l 553 401 l 553 675 l 667 675 l 667 0 l 553 0 l 553 300 l 228 300 l 228 0 l 114 0 z \"},\"о\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 495 668 439 692 q 594 599 551 644 q 663 487 638 553 q 689 336 689 421 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 z \"},\"п\":{\"ha\":768,\"x_min\":114,\"x_max\":654,\"o\":\"m 114 0 l 114 675 l 654 675 l 654 0 l 540 0 l 540 582 l 228 582 l 228 0 l 114 0 z \"},\"р\":{\"ha\":771,\"x_min\":114,\"x_max\":704,\"o\":\"m 114 -285 l 114 675 l 208 675 l 218 597 l 222 597 q 323 664 268 636 q 438 692 378 692 q 553 667 503 692 q 636 598 603 643 q 687 490 669 553 q 704 347 704 426 q 681 194 704 261 q 617 79 657 126 q 524 8 576 32 q 413 -17 471 -17 q 319 4 365 -17 q 225 61 272 25 l 228 -57 l 228 -285 l 114 -285 m 393 79 q 470 98 435 79 q 531 151 506 117 q 572 235 557 185 q 586 347 586 285 q 576 449 586 403 q 545 527 567 494 q 490 578 524 560 q 408 596 456 596 q 322 572 365 596 q 228 504 278 549 l 228 150 q 317 95 274 111 q 393 79 360 79 z \"},\"с\":{\"ha\":633,\"x_min\":64,\"x_max\":599,\"o\":\"m 381 -17 q 256 7 314 -17 q 155 76 197 31 q 88 187 113 121 q 64 336 64 253 q 90 487 64 421 q 161 599 117 553 q 265 668 206 644 q 389 692 324 692 q 503 668 456 692 q 586 613 550 644 l 528 538 q 466 581 499 564 q 393 597 433 597 q 308 578 347 597 q 242 525 269 560 q 198 442 214 490 q 182 336 182 394 q 197 231 182 278 q 240 149 213 183 q 306 97 267 115 q 390 78 344 78 q 477 98 438 78 q 549 146 517 118 l 599 69 q 497 6 553 29 q 381 -17 442 -17 z \"},\"т\":{\"ha\":639,\"x_min\":36,\"x_max\":603,\"o\":\"m 263 0 l 263 582 l 36 582 l 36 675 l 603 675 l 603 582 l 376 582 l 376 0 l 263 0 z \"},\"у\":{\"ha\":649,\"x_min\":17,\"x_max\":632,\"o\":\"m 125 -290 q 82 -287 101 -290 q 46 -276 63 -283 l 68 -186 q 93 -192 79 -189 q 119 -196 107 -196 q 215 -155 178 -196 q 272 -51 251 -114 l 288 -1 l 17 675 l 135 675 l 272 301 q 305 208 288 257 q 338 111 322 158 l 343 111 q 372 207 358 157 q 400 301 386 257 l 521 675 l 632 675 l 378 -56 q 338 -149 360 -106 q 285 -223 315 -192 q 215 -272 254 -254 q 125 -290 176 -290 z \"},\"ф\":{\"ha\":1019,\"x_min\":65,\"x_max\":954,\"o\":\"m 454 -285 l 454 -68 l 457 33 q 395 -2 429 13 q 321 -17 361 -17 q 135 75 204 -17 q 65 336 65 167 q 86 484 65 418 q 142 596 107 550 q 224 667 178 642 q 321 692 269 692 q 394 678 361 692 q 457 643 426 664 l 454 743 l 454 989 l 565 989 l 565 743 l 563 640 q 633 678 594 664 q 708 692 671 692 q 814 667 768 692 q 891 598 860 643 q 938 490 922 553 q 954 347 954 426 q 933 194 954 261 q 877 79 913 126 q 794 8 842 32 q 696 -17 747 -17 q 630 -4 664 -17 q 563 32 596 8 l 565 -68 l 565 -285 l 454 -285 m 346 79 q 403 90 376 79 q 457 128 429 100 l 457 550 q 399 585 429 575 q 340 596 369 596 q 278 577 307 596 q 228 524 250 558 q 195 443 207 490 q 183 338 183 396 q 226 147 183 215 q 346 79 268 79 m 676 79 q 792 150 747 79 q 836 347 836 221 q 827 449 836 403 q 799 527 818 494 q 751 578 781 560 q 681 596 722 596 q 624 586 653 596 q 563 549 594 576 l 563 125 q 623 88 593 97 q 676 79 653 79 z \"},\"х\":{\"ha\":619,\"x_min\":19,\"x_max\":600,\"o\":\"m 19 0 l 240 353 l 36 675 l 160 675 l 250 526 q 282 470 265 499 q 317 414 299 442 l 322 414 q 353 470 338 442 q 383 526 368 499 l 465 675 l 585 675 l 381 340 l 600 0 l 476 0 l 378 157 q 342 218 360 188 q 304 278 324 249 l 299 278 q 264 219 281 249 q 231 157 247 189 l 139 0 l 19 0 z \"},\"ц\":{\"ha\":769,\"x_min\":114,\"x_max\":743,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 93 l 531 93 l 531 675 l 644 675 l 644 93 l 743 93 l 743 21 l 732 -239 l 633 -239 l 633 0 l 114 0 z \"},\"ч\":{\"ha\":711,\"x_min\":82,\"x_max\":597,\"o\":\"m 483 0 l 483 269 q 451 263 465 265 q 422 259 436 261 q 390 256 407 257 q 351 256 374 256 q 152 310 222 256 q 82 490 82 364 l 82 675 l 196 675 l 196 490 q 238 382 196 415 q 374 349 281 349 q 429 351 404 349 q 483 361 454 354 l 483 675 l 597 675 l 597 0 l 483 0 z \"},\"ш\":{\"ha\":1040,\"x_min\":114,\"x_max\":926,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 93 l 465 93 l 465 675 l 575 675 l 575 93 l 814 93 l 814 675 l 926 675 l 926 0 l 114 0 z \"},\"щ\":{\"ha\":1051,\"x_min\":114,\"x_max\":1025,\"o\":\"m 915 -239 l 915 0 l 114 0 l 114 675 l 228 675 l 228 93 l 465 93 l 465 675 l 575 675 l 575 93 l 814 93 l 814 675 l 926 675 l 926 93 l 1025 93 l 1025 21 l 1014 -239 l 915 -239 z \"},\"ъ\":{\"ha\":828,\"x_min\":36,\"x_max\":769,\"o\":\"m 275 0 l 275 582 l 36 582 l 36 675 l 389 675 l 389 426 l 501 426 q 696 376 622 426 q 769 215 769 325 q 696 51 769 103 q 501 0 622 0 l 275 0 m 389 92 l 490 92 q 658 215 658 92 q 617 308 658 279 q 490 338 575 338 l 389 338 l 389 92 z \"},\"ы\":{\"ha\":936,\"x_min\":114,\"x_max\":822,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 426 l 324 426 q 433 414 383 426 q 517 376 482 401 q 572 310 553 350 q 592 215 592 271 q 572 118 592 158 q 517 51 553 78 q 433 13 482 25 q 324 0 383 0 l 114 0 m 228 92 l 311 92 q 479 215 479 92 q 438 308 479 279 q 311 338 397 338 l 228 338 l 228 92 m 708 0 l 708 675 l 822 675 l 822 0 l 708 0 z \"},\"ь\":{\"ha\":682,\"x_min\":114,\"x_max\":624,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 426 l 356 426 q 465 414 415 426 q 549 376 514 401 q 604 310 585 350 q 624 215 624 271 q 604 118 624 158 q 549 51 585 78 q 465 13 514 25 q 356 0 415 0 l 114 0 m 228 92 l 343 92 q 511 215 511 92 q 470 308 511 279 q 343 338 429 338 l 228 338 l 228 92 z \"},\"э\":{\"ha\":633,\"x_min\":33,\"x_max\":569,\"o\":\"m 254 -17 q 133 6 189 -17 q 33 69 76 29 l 81 139 q 153 93 113 111 q 244 75 194 75 q 395 133 338 75 q 460 310 453 192 l 161 310 l 161 392 l 457 392 q 390 549 444 497 q 254 601 335 601 q 167 584 204 601 q 101 542 131 567 l 47 611 q 134 667 82 643 q 261 692 186 692 q 380 670 324 692 q 478 605 436 649 q 545 494 521 561 q 569 336 569 426 q 546 181 569 247 q 480 72 522 115 q 380 6 438 28 q 254 -17 322 -17 z \"},\"ю\":{\"ha\":1025,\"x_min\":114,\"x_max\":961,\"o\":\"m 669 -17 q 558 4 610 -17 q 468 65 507 25 q 404 164 429 106 q 374 296 379 222 l 228 296 l 228 0 l 114 0 l 114 675 l 228 675 l 228 397 l 375 397 q 409 522 383 467 q 474 614 435 576 q 563 672 513 651 q 669 692 613 692 q 783 668 729 692 q 876 599 836 644 q 938 487 915 553 q 961 336 961 421 q 938 187 961 253 q 876 76 915 121 q 783 7 836 31 q 669 -17 729 -17 m 664 78 q 739 97 706 78 q 795 149 772 115 q 831 231 818 183 q 843 336 843 278 q 795 525 843 453 q 664 597 747 597 q 589 578 622 597 q 531 525 556 560 q 494 442 507 490 q 481 336 481 394 q 494 231 481 278 q 531 149 507 183 q 589 97 556 115 q 664 78 622 78 z \"},\"я\":{\"ha\":714,\"x_min\":44,\"x_max\":600,\"o\":\"m 486 0 l 486 267 l 361 267 l 360 267 l 174 0 l 44 0 l 250 282 q 140 348 185 301 q 96 475 96 394 q 116 569 96 531 q 172 631 136 607 q 256 665 207 654 q 361 675 304 675 l 600 675 l 600 0 l 486 0 m 381 350 l 486 350 l 486 586 l 381 586 q 256 559 301 586 q 211 472 211 532 q 256 381 211 413 q 381 350 301 350 z \"},\"ѐ\":{\"ha\":689,\"x_min\":64,\"x_max\":636,\"o\":\"m 388 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 511 4 565 25 q 388 -17 457 -17 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 m 388 796 l 169 1008 l 250 1085 l 446 853 l 388 796 z \"},\"ё\":{\"ha\":689,\"x_min\":64,\"x_max\":636,\"o\":\"m 388 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 511 4 565 25 q 388 -17 457 -17 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 m 235 815 q 185 835 204 815 q 165 885 165 856 q 185 934 165 914 q 235 954 204 954 q 283 934 264 954 q 303 885 303 914 q 283 835 303 856 q 235 815 264 815 m 501 815 q 453 835 472 815 q 433 885 433 856 q 453 934 433 914 q 501 954 472 954 q 551 934 532 954 q 571 885 571 914 q 551 835 571 856 q 501 815 532 815 z \"},\"ђ\":{\"ha\":761,\"x_min\":11,\"x_max\":693,\"o\":\"m 410 -301 q 362 -296 383 -301 q 325 -283 340 -290 l 347 -197 q 373 -205 358 -201 q 403 -208 388 -208 q 471 -189 439 -208 q 526 -121 503 -169 q 562 12 549 -72 q 575 225 575 96 q 565 374 575 314 q 533 470 554 433 q 480 522 511 507 q 407 538 449 538 q 319 513 360 538 q 228 438 278 489 l 228 0 l 114 0 l 114 793 l 11 793 l 11 853 l 114 860 l 114 989 l 228 989 l 228 860 l 481 860 l 481 793 l 228 793 l 228 664 l 222 529 q 322 606 269 575 q 443 638 375 638 q 629 542 565 638 q 693 238 693 446 q 674 -23 693 81 q 617 -188 654 -126 q 528 -276 581 -250 q 410 -301 475 -301 z \"},\"ѓ\":{\"ha\":571,\"x_min\":114,\"x_max\":542,\"o\":\"m 114 0 l 114 675 l 535 675 l 535 582 l 228 582 l 228 0 l 114 0 m 324 797 l 265 854 l 461 1086 l 542 1010 l 324 797 z \"},\"є\":{\"ha\":633,\"x_min\":64,\"x_max\":599,\"o\":\"m 381 -17 q 254 6 313 -17 q 153 72 196 28 q 88 181 111 115 q 64 336 64 247 q 90 492 64 425 q 160 603 115 560 q 263 669 204 647 q 388 692 322 692 q 502 668 454 692 q 586 613 550 644 l 532 540 q 467 584 501 567 q 388 601 432 601 q 247 549 304 601 q 176 392 190 496 l 490 392 l 490 310 l 174 310 q 238 133 181 192 q 390 75 294 75 q 480 94 439 75 q 553 142 521 114 l 599 69 q 497 6 553 29 q 381 -17 442 -17 z \"},\"ѕ\":{\"ha\":582,\"x_min\":39,\"x_max\":538,\"o\":\"m 290 -17 q 153 10 218 -17 q 39 76 88 36 l 96 153 q 187 94 140 117 q 294 72 233 72 q 394 103 361 72 q 428 178 428 133 q 414 224 428 204 q 378 258 400 243 q 329 283 357 272 q 274 306 301 294 q 201 334 238 318 q 137 373 165 350 q 90 426 108 396 q 72 500 72 457 q 88 576 72 540 q 134 637 104 611 q 207 677 164 663 q 304 692 250 692 q 422 669 368 692 q 514 615 475 647 l 460 543 q 388 586 425 569 q 306 603 350 603 q 212 574 242 603 q 182 506 182 544 q 194 465 182 482 q 228 434 207 447 q 276 410 249 421 q 332 389 303 400 q 405 360 368 375 q 471 322 442 344 q 519 265 500 299 q 538 185 538 232 q 522 107 538 143 q 474 43 506 71 q 397 -1 443 15 q 290 -17 350 -17 z \"},\"і\":{\"ha\":342,\"x_min\":93,\"x_max\":251,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 0 l 114 0 m 172 814 q 116 835 139 814 q 93 888 93 856 q 116 941 93 921 q 172 961 139 961 q 228 941 206 961 q 251 888 251 921 q 228 835 251 856 q 172 814 206 814 z \"},\"ї\":{\"ha\":342,\"x_min\":-32,\"x_max\":374,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 0 l 114 0 m 38 815 q -12 835 7 815 q -32 885 -32 856 q -12 934 -32 914 q 38 954 7 954 q 86 934 67 954 q 106 885 106 914 q 86 835 106 856 q 38 815 67 815 m 304 815 q 256 835 275 815 q 236 885 236 856 q 256 934 236 914 q 304 954 275 954 q 354 934 335 954 q 374 885 374 914 q 354 835 374 856 q 304 815 335 815 z \"},\"ј\":{\"ha\":343,\"x_min\":-56,\"x_max\":251,\"o\":\"m 44 -301 q -12 -296 13 -301 q -56 -283 -37 -290 l -32 -197 q -3 -205 -19 -201 q 32 -208 14 -208 q 99 -174 82 -208 q 115 -76 115 -139 l 115 675 l 229 675 l 229 -76 q 188 -240 229 -179 q 44 -301 146 -301 m 174 814 q 117 835 140 814 q 94 888 94 856 q 117 941 94 921 q 174 961 140 961 q 228 941 206 961 q 251 888 251 921 q 228 835 251 856 q 174 814 206 814 z \"},\"љ\":{\"ha\":1021,\"x_min\":17,\"x_max\":963,\"o\":\"m 78 -17 q 44 -14 58 -17 q 17 -6 31 -11 l 38 100 q 51 96 44 97 q 68 94 58 94 q 126 127 100 94 q 164 238 151 160 q 187 451 179 342 q 200 675 194 560 l 606 675 l 606 426 l 694 426 q 803 414 754 426 q 888 376 853 401 q 943 310 924 350 q 963 215 963 271 q 943 118 963 158 q 888 51 924 78 q 803 13 853 25 q 694 0 754 0 l 490 0 l 490 582 l 300 582 q 286 390 293 489 q 263 192 279 292 q 196 34 244 85 q 78 -17 147 -17 m 606 92 l 682 92 q 851 215 851 92 q 810 308 851 279 q 682 338 768 338 l 606 338 l 606 92 z \"},\"њ\":{\"ha\":1053,\"x_min\":114,\"x_max\":996,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 401 l 524 401 l 524 675 l 638 675 l 638 426 l 726 426 q 922 376 847 426 q 996 215 996 325 q 922 51 996 103 q 726 0 847 0 l 524 0 l 524 300 l 228 300 l 228 0 l 114 0 m 638 92 l 715 92 q 883 215 883 92 q 842 308 883 279 q 715 338 801 338 l 638 338 l 638 92 z \"},\"ћ\":{\"ha\":756,\"x_min\":11,\"x_max\":654,\"o\":\"m 114 0 l 114 793 l 11 793 l 11 853 l 114 860 l 114 989 l 228 989 l 228 860 l 481 860 l 481 793 l 228 793 l 228 664 l 224 525 q 325 604 272 571 q 449 638 378 638 q 605 571 556 638 q 654 374 654 504 l 654 0 l 540 0 l 540 358 q 510 496 540 454 q 413 538 479 538 q 319 512 360 538 q 228 435 279 486 l 228 0 l 114 0 z \"},\"ќ\":{\"ha\":692,\"x_min\":114,\"x_max\":674,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 397 l 358 397 l 425 547 q 464 619 444 592 q 506 663 483 647 q 551 685 528 679 q 603 692 575 692 q 642 685 625 692 l 622 578 q 611 581 615 581 q 600 581 607 581 q 574 577 586 581 q 551 564 563 574 q 526 536 539 554 q 501 489 514 518 l 444 356 l 674 0 l 549 0 l 361 304 l 228 304 l 228 0 l 114 0 m 365 797 l 307 854 l 503 1086 l 583 1010 l 365 797 z \"},\"ѝ\":{\"ha\":785,\"x_min\":114,\"x_max\":671,\"o\":\"m 114 0 l 114 675 l 225 675 l 225 394 q 222 276 225 340 q 214 146 218 211 l 219 146 q 265 218 239 178 q 308 290 290 258 l 564 675 l 671 675 l 671 0 l 560 0 l 560 281 q 563 399 560 335 q 571 531 567 464 l 565 531 q 520 458 546 499 q 476 386 494 417 l 219 0 l 114 0 m 415 797 l 197 1010 l 278 1086 l 474 854 l 415 797 z \"},\"ў\":{\"ha\":649,\"x_min\":17,\"x_max\":632,\"o\":\"m 125 -290 q 82 -287 101 -290 q 46 -276 63 -283 l 68 -186 q 93 -192 79 -189 q 119 -196 107 -196 q 215 -155 178 -196 q 272 -51 251 -114 l 288 -1 l 17 675 l 135 675 l 272 301 q 305 208 288 257 q 338 111 322 158 l 343 111 q 372 207 358 157 q 400 301 386 257 l 521 675 l 632 675 l 378 -56 q 338 -149 360 -106 q 285 -223 315 -192 q 215 -272 254 -254 q 125 -290 176 -290 m 336 794 q 238 813 278 794 q 171 860 197 831 q 132 928 144 890 q 118 1007 119 967 l 213 1007 q 220 951 214 978 q 241 904 226 924 q 278 873 256 885 q 336 861 301 861 q 394 873 371 861 q 431 904 417 885 q 452 951 446 924 q 460 1007 458 978 l 554 1007 q 540 928 551 967 q 501 860 528 890 q 435 813 475 831 q 336 794 394 794 z \"},\"џ\":{\"ha\":775,\"x_min\":114,\"x_max\":661,\"o\":\"m 114 0 l 114 675 l 228 675 l 228 93 l 547 93 l 547 675 l 661 675 l 661 0 l 447 0 l 435 -239 l 338 -239 l 333 0 l 114 0 z \"},\"ѣ\":{\"ha\":800,\"x_min\":36,\"x_max\":742,\"o\":\"m 247 0 l 247 610 l 36 610 l 36 703 l 247 703 l 247 864 l 361 864 l 361 703 l 622 703 l 622 610 l 361 610 l 361 426 l 474 426 q 668 376 594 426 q 742 215 742 325 q 668 51 742 103 q 474 0 594 0 l 247 0 m 361 92 l 461 92 q 631 215 631 92 q 589 308 631 279 q 461 338 547 338 l 361 338 l 361 92 z \"},\"ѳ\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 376 -17 q 257 6 314 -17 q 157 72 200 28 q 89 183 114 117 q 64 336 64 249 q 89 490 64 424 q 157 602 114 557 q 257 669 200 647 q 376 692 314 692 q 496 669 439 692 q 596 602 553 647 q 664 490 639 557 q 689 336 689 424 q 664 183 689 249 q 596 72 639 117 q 496 6 553 28 q 376 -17 439 -17 m 376 603 q 242 547 296 603 q 175 392 188 492 l 579 392 q 513 547 567 492 q 376 603 458 603 m 376 74 q 519 135 464 74 q 581 310 574 197 l 174 310 q 235 135 181 197 q 376 74 290 74 z \"},\"ѵ\":{\"ha\":663,\"x_min\":17,\"x_max\":692,\"o\":\"m 260 0 l 17 675 l 135 675 l 263 292 q 294 192 278 242 q 326 93 311 142 l 332 93 q 357 192 344 142 q 385 292 369 242 l 451 497 q 517 644 479 597 q 625 692 556 692 q 660 689 646 692 q 692 679 675 686 l 669 576 q 635 585 654 585 q 586 560 604 585 q 551 483 568 535 l 400 0 l 260 0 z \"},\"ґ\":{\"ha\":578,\"x_min\":114,\"x_max\":554,\"o\":\"m 114 0 l 114 675 l 439 675 l 461 914 l 554 914 l 542 582 l 228 582 l 228 0 l 114 0 z \"},\"ғ\":{\"ha\":589,\"x_min\":42,\"x_max\":554,\"o\":\"m 42 296 l 42 354 l 133 361 l 133 675 l 554 675 l 554 582 l 247 582 l 247 361 l 432 361 l 432 296 l 247 296 l 247 0 l 133 0 l 133 296 l 42 296 z \"},\"җ\":{\"ha\":997,\"x_min\":18,\"x_max\":971,\"o\":\"m 861 -239 l 861 0 l 804 0 l 635 304 l 524 304 l 524 0 l 422 0 l 422 304 l 311 304 l 142 0 l 18 0 l 231 356 l 176 489 q 130 564 153 547 q 79 581 107 581 q 68 581 72 581 q 57 578 64 581 l 36 685 q 76 692 54 692 q 175 662 132 692 q 254 547 218 632 l 318 397 l 422 397 l 422 675 l 524 675 l 524 397 l 628 397 l 692 547 q 771 662 728 632 q 869 692 814 692 q 908 685 892 692 l 889 578 q 878 581 882 581 q 867 581 874 581 q 815 564 839 581 q 768 489 792 547 l 715 356 l 872 93 l 971 93 l 971 21 l 960 -239 l 861 -239 z \"},\"ҙ\":{\"ha\":633,\"x_min\":51,\"x_max\":579,\"o\":\"m 258 -239 l 253 -14 q 150 10 200 -8 q 51 69 100 29 l 100 143 q 197 90 147 104 q 297 75 246 75 q 363 83 332 75 q 416 107 393 92 q 452 145 439 122 q 465 196 465 168 q 421 282 465 254 q 293 310 376 310 l 200 310 l 200 392 l 276 392 q 399 420 358 392 q 439 499 439 449 q 400 576 439 550 q 299 601 361 601 q 198 586 240 601 q 115 542 156 571 l 67 617 q 173 672 115 651 q 304 692 231 692 q 399 681 354 692 q 476 647 443 669 q 530 590 510 625 q 550 510 550 556 q 521 421 550 461 q 439 360 492 381 l 439 354 q 538 299 497 339 q 579 186 579 260 q 563 112 579 146 q 517 53 546 78 q 449 11 488 28 q 365 -12 410 -6 l 353 -239 l 258 -239 z \"},\"қ\":{\"ha\":744,\"x_min\":114,\"x_max\":718,\"o\":\"m 608 -239 l 608 0 l 549 0 l 361 304 l 228 304 l 228 0 l 114 0 l 114 675 l 228 675 l 228 397 l 358 397 l 425 547 q 464 619 444 592 q 506 663 483 647 q 551 685 528 679 q 603 692 575 692 q 642 685 625 692 l 622 578 q 611 581 615 581 q 600 581 607 581 q 574 577 586 581 q 551 564 563 574 q 526 536 539 554 q 501 489 514 518 l 444 356 l 614 93 l 718 93 l 718 21 l 706 -239 l 608 -239 z \"},\"ҡ\":{\"ha\":853,\"x_min\":36,\"x_max\":835,\"o\":\"m 275 0 l 275 582 l 36 582 l 36 675 l 389 675 l 389 397 l 519 397 l 586 547 q 625 619 606 592 q 666 663 644 647 q 711 685 688 679 q 763 692 735 692 q 803 685 785 692 l 782 578 q 771 581 775 581 q 760 581 767 581 q 735 577 747 581 q 711 564 722 574 q 688 536 700 554 q 663 489 675 518 l 606 354 l 835 0 l 708 0 l 521 304 l 389 304 l 389 0 l 275 0 z \"},\"ң\":{\"ha\":792,\"x_min\":115,\"x_max\":765,\"o\":\"m 654 -239 l 654 0 l 554 0 l 554 300 l 229 300 l 229 0 l 115 0 l 115 675 l 229 675 l 229 401 l 554 401 l 554 675 l 668 675 l 668 93 l 765 93 l 765 21 l 753 -239 l 654 -239 z \"},\"ҫ\":{\"ha\":633,\"x_min\":64,\"x_max\":599,\"o\":\"m 325 -239 l 319 -11 q 217 26 264 -1 q 135 99 169 54 q 83 203 101 143 q 64 336 64 263 q 90 487 64 421 q 161 599 117 553 q 265 668 206 644 q 389 692 324 692 q 503 668 456 692 q 586 613 550 644 l 528 538 q 466 581 499 564 q 393 597 433 597 q 308 578 347 597 q 242 525 269 560 q 198 442 214 490 q 182 336 182 394 q 197 231 182 278 q 240 149 213 183 q 306 97 267 115 q 390 78 344 78 q 477 98 438 78 q 549 146 517 118 l 599 69 q 432 -12 525 4 l 419 -239 l 325 -239 z \"},\"ү\":{\"ha\":649,\"x_min\":17,\"x_max\":632,\"o\":\"m 271 -285 l 271 0 l 17 675 l 135 675 l 261 307 q 293 208 276 257 q 325 111 310 158 l 331 111 q 362 208 346 158 q 393 307 378 257 l 519 675 l 632 675 l 385 0 l 385 -285 l 271 -285 z \"},\"ұ\":{\"ha\":649,\"x_min\":17,\"x_max\":632,\"o\":\"m 271 -285 l 271 0 l 65 0 l 65 58 l 174 65 l 246 65 l 17 675 l 135 675 l 261 307 q 293 208 276 257 q 325 111 310 158 l 331 111 q 362 208 346 158 q 393 307 378 257 l 519 675 l 632 675 l 408 65 l 582 65 l 582 0 l 385 0 l 385 -285 l 271 -285 z \"},\"ҳ\":{\"ha\":669,\"x_min\":19,\"x_max\":642,\"o\":\"m 533 -239 l 533 0 l 476 0 l 378 157 q 342 218 360 188 q 304 278 324 249 l 299 278 q 264 219 281 249 q 231 157 247 189 l 139 0 l 19 0 l 240 353 l 36 675 l 160 675 l 250 526 q 282 470 265 499 q 317 414 299 442 l 322 414 q 353 470 338 442 q 383 526 368 499 l 465 675 l 585 675 l 381 340 l 540 93 l 642 93 l 642 21 l 631 -239 l 533 -239 z \"},\"ҷ\":{\"ha\":722,\"x_min\":82,\"x_max\":696,\"o\":\"m 586 -239 l 586 0 l 483 0 l 483 269 q 451 263 465 265 q 422 259 436 261 q 390 256 407 257 q 351 256 374 256 q 152 310 222 256 q 82 490 82 364 l 82 675 l 196 675 l 196 490 q 238 382 196 415 q 374 349 281 349 q 429 351 404 349 q 483 361 454 354 l 483 675 l 597 675 l 597 93 l 696 93 l 696 21 l 683 -239 l 586 -239 z \"},\"һ\":{\"ha\":756,\"x_min\":114,\"x_max\":654,\"o\":\"m 114 0 l 114 989 l 228 989 l 228 719 l 224 581 q 325 659 272 626 q 449 692 378 692 q 605 625 556 692 q 654 428 654 558 l 654 0 l 540 0 l 540 413 q 510 551 540 508 q 413 593 479 593 q 319 567 360 593 q 228 489 279 540 l 228 0 l 114 0 z \"},\"ӂ\":{\"ha\":946,\"x_min\":18,\"x_max\":928,\"o\":\"m 18 0 l 231 356 l 176 489 q 130 564 153 547 q 79 581 107 581 q 68 581 72 581 q 57 578 64 581 l 36 685 q 76 692 54 692 q 175 662 132 692 q 254 547 218 632 l 318 397 l 422 397 l 422 675 l 524 675 l 524 397 l 628 397 l 692 547 q 771 662 728 632 q 869 692 814 692 q 908 685 892 692 l 889 578 q 878 581 882 581 q 867 581 874 581 q 815 564 839 581 q 768 489 792 547 l 715 356 l 928 0 l 804 0 l 635 304 l 524 304 l 524 0 l 422 0 l 422 304 l 311 304 l 142 0 l 18 0 m 474 794 q 375 813 415 794 q 308 860 335 831 q 269 928 282 890 q 256 1007 257 967 l 350 1007 q 358 951 351 978 q 378 904 364 924 q 416 873 393 885 q 474 861 439 861 q 531 873 508 861 q 569 904 554 885 q 590 951 583 924 q 597 1007 596 978 l 692 1007 q 677 928 689 967 q 639 860 665 890 q 572 813 613 831 q 474 794 532 794 z \"},\"ӏ\":{\"ha\":354,\"x_min\":114,\"x_max\":300,\"o\":\"m 235 -17 q 142 22 169 -17 q 114 136 114 61 l 114 989 l 228 989 l 228 128 q 238 89 228 100 q 260 78 247 78 q 270 78 265 78 q 285 81 275 78 l 300 -6 q 274 -14 289 -11 q 235 -17 258 -17 z \"},\"ӑ\":{\"ha\":700,\"x_min\":72,\"x_max\":601,\"o\":\"m 269 -17 q 128 33 185 -17 q 72 175 72 83 q 171 345 72 286 q 486 428 269 404 q 480 490 486 460 q 458 544 474 521 q 416 583 443 568 q 347 597 389 597 q 238 575 289 597 q 146 525 186 553 l 101 604 q 217 663 149 635 q 367 692 285 692 q 546 616 490 692 q 601 414 601 540 l 601 0 l 507 0 l 497 81 l 493 81 q 389 12 444 40 q 269 -17 333 -17 m 303 75 q 394 98 351 75 q 486 165 438 121 l 486 353 q 344 326 401 342 q 251 290 286 311 q 199 242 215 269 q 183 183 183 215 q 218 100 183 125 q 303 75 253 75 m 364 794 q 265 813 306 794 q 199 860 225 831 q 160 928 172 890 q 146 1007 147 967 l 240 1007 q 248 951 242 978 q 269 904 254 924 q 306 873 283 885 q 364 861 329 861 q 422 873 399 861 q 459 904 444 885 q 480 951 474 924 q 488 1007 486 978 l 582 1007 q 567 928 579 967 q 529 860 556 890 q 463 813 503 831 q 364 794 422 794 z \"},\"ӕ\":{\"ha\":1090,\"x_min\":81,\"x_max\":1038,\"o\":\"m 279 -17 q 137 33 193 -17 q 81 175 81 83 q 179 345 81 286 q 489 428 278 404 q 483 490 489 460 q 462 544 478 521 q 419 583 446 568 q 351 597 393 597 q 246 575 296 597 q 156 525 196 553 l 110 604 q 224 663 157 635 q 365 692 290 692 q 489 653 440 692 q 558 549 538 615 q 655 653 599 615 q 781 692 711 692 q 891 669 843 692 q 972 606 939 647 q 1021 505 1004 564 q 1038 374 1038 446 q 1033 310 1038 335 l 596 310 q 615 214 597 257 q 660 140 632 171 q 725 93 688 110 q 806 76 763 76 q 893 92 854 76 q 969 132 932 108 l 1011 53 q 914 4 967 25 q 792 -17 861 -17 q 650 22 707 -17 q 554 110 593 60 q 415 15 485 47 q 279 -17 344 -17 m 311 75 q 414 102 358 75 q 515 179 469 129 q 497 242 504 206 q 489 318 490 279 l 489 353 q 352 326 408 342 q 260 290 296 311 q 209 242 225 269 q 193 183 193 215 q 227 100 193 125 q 311 75 261 75 m 596 386 l 938 386 q 897 546 938 490 q 778 601 856 601 q 656 544 707 601 q 596 386 606 486 z \"},\"ӗ\":{\"ha\":689,\"x_min\":64,\"x_max\":636,\"o\":\"m 388 -17 q 260 8 319 -17 q 158 77 201 32 q 89 188 114 122 q 64 336 64 253 q 90 485 64 419 q 158 597 115 551 q 254 667 200 643 q 367 692 308 692 q 481 669 431 692 q 566 606 532 647 q 618 506 600 564 q 636 375 636 447 q 635 340 636 357 q 632 310 635 322 l 176 310 q 244 138 183 201 q 401 75 304 75 q 491 90 450 75 q 569 128 532 104 l 610 53 q 511 4 565 25 q 388 -17 457 -17 m 175 392 l 536 392 q 492 548 536 494 q 369 601 449 601 q 301 588 333 601 q 242 547 268 574 q 198 481 215 519 q 175 392 181 442 m 368 794 q 269 813 310 794 q 203 860 229 831 q 164 928 176 890 q 150 1007 151 967 l 244 1007 q 252 951 246 978 q 273 904 258 924 q 310 873 288 885 q 368 861 333 861 q 426 873 403 861 q 463 904 449 885 q 484 951 478 924 q 492 1007 490 978 l 586 1007 q 572 928 583 967 q 533 860 560 890 q 467 813 507 831 q 368 794 426 794 z \"},\"ә\":{\"ha\":689,\"x_min\":51,\"x_max\":625,\"o\":\"m 331 -17 q 215 6 267 -17 q 127 70 164 28 q 71 173 90 113 q 51 308 51 233 q 53 345 51 328 q 57 375 54 363 l 511 375 q 453 539 506 476 q 310 601 401 601 q 217 585 258 601 q 135 543 175 569 l 94 622 q 199 673 142 654 q 328 692 257 692 q 446 668 392 692 q 540 599 500 644 q 602 488 579 553 q 625 339 625 422 q 602 190 625 256 q 540 78 579 124 q 446 8 500 32 q 331 -17 392 -17 m 328 75 q 455 132 407 75 q 513 293 503 189 l 153 293 q 200 129 153 183 q 328 75 247 75 z \"},\"ӣ\":{\"ha\":785,\"x_min\":114,\"x_max\":671,\"o\":\"m 114 0 l 114 675 l 225 675 l 225 394 q 222 276 225 340 q 214 146 218 211 l 219 146 q 265 218 239 178 q 308 290 290 258 l 564 675 l 671 675 l 671 0 l 560 0 l 560 281 q 563 399 560 335 q 571 531 567 464 l 565 531 q 520 458 546 499 q 476 386 494 417 l 219 0 l 114 0 m 210 836 l 210 915 l 579 915 l 579 836 l 210 836 z \"},\"ӧ\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 376 -17 q 258 7 314 -17 q 158 76 201 31 q 90 187 115 121 q 64 336 64 253 q 90 487 64 421 q 158 599 115 553 q 258 668 201 644 q 376 692 314 692 q 495 668 439 692 q 594 599 551 644 q 663 487 638 553 q 689 336 689 421 q 663 187 689 253 q 594 76 638 121 q 495 7 551 31 q 376 -17 439 -17 m 376 78 q 456 97 419 78 q 517 149 492 115 q 557 231 543 183 q 571 336 571 278 q 557 442 571 394 q 517 525 543 490 q 456 578 492 560 q 376 597 419 597 q 297 578 333 597 q 235 525 261 560 q 196 442 210 490 q 182 336 182 394 q 196 231 182 278 q 235 149 210 183 q 297 97 261 115 q 376 78 333 78 m 243 815 q 193 835 213 815 q 174 885 174 856 q 193 934 174 914 q 243 954 213 954 q 292 934 272 954 q 311 885 311 914 q 292 835 311 856 q 243 815 272 815 m 510 815 q 461 835 481 815 q 442 885 442 856 q 461 934 442 914 q 510 954 481 954 q 560 934 540 954 q 579 885 579 914 q 560 835 579 856 q 510 815 540 815 z \"},\"ө\":{\"ha\":753,\"x_min\":64,\"x_max\":689,\"o\":\"m 376 -17 q 257 6 314 -17 q 157 72 200 28 q 89 183 114 117 q 64 336 64 249 q 89 490 64 424 q 157 602 114 557 q 257 669 200 647 q 376 692 314 692 q 496 669 439 692 q 596 602 553 647 q 664 490 639 557 q 689 336 689 424 q 664 183 689 249 q 596 72 639 117 q 496 6 553 28 q 376 -17 439 -17 m 376 603 q 242 547 296 603 q 175 392 188 492 l 579 392 q 513 547 567 492 q 376 603 458 603 m 376 74 q 519 135 464 74 q 581 310 574 197 l 174 310 q 235 135 181 197 q 376 74 290 74 z \"},\"ӯ\":{\"ha\":649,\"x_min\":17,\"x_max\":632,\"o\":\"m 125 -290 q 82 -287 101 -290 q 46 -276 63 -283 l 68 -186 q 93 -192 79 -189 q 119 -196 107 -196 q 215 -155 178 -196 q 272 -51 251 -114 l 288 -1 l 17 675 l 135 675 l 272 301 q 305 208 288 257 q 338 111 322 158 l 343 111 q 372 207 358 157 q 400 301 386 257 l 521 675 l 632 675 l 378 -56 q 338 -149 360 -106 q 285 -223 315 -192 q 215 -272 254 -254 q 125 -290 176 -290 m 151 835 l 151 914 l 521 914 l 521 835 l 151 835 z \"},\"ӳ\":{\"ha\":649,\"x_min\":17,\"x_max\":632,\"o\":\"m 125 -290 q 82 -287 101 -290 q 46 -276 63 -283 l 68 -186 q 93 -192 79 -189 q 119 -196 107 -196 q 215 -155 178 -196 q 272 -51 251 -114 l 288 -1 l 17 675 l 135 675 l 272 301 q 305 208 288 257 q 338 111 322 158 l 343 111 q 372 207 358 157 q 400 301 386 257 l 521 675 l 632 675 l 378 -56 q 338 -149 360 -106 q 285 -223 315 -192 q 215 -272 254 -254 q 125 -290 176 -290 m 265 789 l 203 818 l 322 1057 l 404 1018 l 265 789 m 475 789 l 411 818 l 532 1057 l 613 1018 l 475 789 z \"},\"№\":{\"ha\":1240,\"x_min\":82,\"x_max\":1221,\"o\":\"m 126 -17 q 108 -16 114 -17 q 92 -12 103 -15 l 82 78 q 117 90 106 78 q 129 136 129 103 l 129 886 l 257 886 q 382 601 321 743 q 503 315 443 460 l 582 136 l 588 136 q 579 256 582 201 q 574 358 576 310 q 572 451 572 406 q 571 546 571 496 l 571 765 q 597 869 571 835 q 679 903 622 903 q 697 901 690 903 q 714 897 703 900 l 724 807 q 688 795 700 807 q 675 750 675 783 l 675 0 l 547 0 q 424 285 485 143 q 301 572 363 426 l 224 750 l 218 750 q 226 631 224 685 q 231 528 229 576 q 233 435 232 481 q 233 340 233 390 l 233 119 q 208 17 233 51 q 126 -17 183 -17 m 1008 383 q 925 399 964 383 q 857 442 886 414 q 811 513 828 471 q 794 607 794 554 q 811 703 794 661 q 857 773 828 744 q 925 816 886 801 q 1008 831 964 831 q 1090 816 1051 831 q 1158 773 1129 801 q 1204 703 1188 744 q 1221 607 1221 661 q 1204 513 1221 554 q 1158 442 1188 471 q 1090 399 1129 414 q 1008 383 1051 383 m 1008 460 q 1095 499 1063 460 q 1128 607 1128 538 q 1095 717 1128 678 q 1008 756 1063 756 q 922 717 954 756 q 889 607 889 678 q 922 499 889 538 q 1008 460 954 460 m 832 208 l 832 278 l 1183 278 l 1183 208 l 832 208 z \"},\"&\":{\"ha\":846,\"x_min\":44,\"x_max\":825,\"o\":\"m 322 -17 q 209 2 260 -17 q 122 54 158 21 q 65 134 85 88 q 44 236 44 181 q 59 319 44 282 q 99 389 74 357 q 156 448 124 421 q 224 499 189 475 q 180 609 196 556 q 164 713 164 663 q 179 797 164 758 q 222 865 194 836 q 289 911 250 894 q 375 928 328 928 q 507 878 460 928 q 554 747 554 828 q 536 665 554 703 q 489 595 518 628 q 423 534 460 563 q 349 478 386 506 q 453 342 393 407 q 579 222 514 276 q 653 346 621 279 q 707 492 686 413 l 814 492 q 747 319 786 401 q 654 165 708 238 q 744 111 701 133 q 825 78 788 89 l 794 -17 q 693 23 746 -3 q 585 88 640 49 q 467 12 532 40 q 322 -17 403 -17 m 263 714 q 274 636 263 676 q 306 554 286 596 q 365 597 336 575 q 415 641 393 618 q 449 690 436 664 q 461 746 461 715 q 441 816 461 786 q 375 846 421 846 q 293 808 324 846 q 263 714 263 771 m 335 75 q 425 94 382 75 q 508 149 468 114 q 380 276 442 207 q 269 419 318 344 q 188 338 221 381 q 156 243 156 296 q 169 174 156 206 q 208 121 183 143 q 265 87 232 99 q 335 75 297 75 z \"},\".\":{\"ha\":346,\"x_min\":90,\"x_max\":256,\"o\":\"m 174 -17 q 115 8 139 -17 q 90 69 90 32 q 115 134 90 110 q 174 158 139 158 q 231 134 207 158 q 256 69 256 110 q 231 8 256 32 q 174 -17 207 -17 z \"},\",\":{\"ha\":346,\"x_min\":65,\"x_max\":275,\"o\":\"m 93 -236 l 65 -169 q 158 -99 125 -143 q 190 0 192 -56 q 176 -1 186 -1 q 119 19 143 -1 q 94 78 94 39 q 119 137 94 115 q 179 158 144 158 q 249 122 224 158 q 275 24 275 86 q 226 -133 275 -67 q 93 -236 178 -200 z \"},\":\":{\"ha\":346,\"x_min\":90,\"x_max\":256,\"o\":\"m 174 485 q 115 509 139 485 q 90 571 90 533 q 115 635 90 611 q 174 660 139 660 q 231 635 207 660 q 256 571 256 611 q 231 509 256 533 q 174 485 207 485 m 174 -17 q 115 8 139 -17 q 90 69 90 32 q 115 134 90 110 q 174 158 139 158 q 231 134 207 158 q 256 69 256 110 q 231 8 256 32 q 174 -17 207 -17 z \"},\";\":{\"ha\":346,\"x_min\":65,\"x_max\":275,\"o\":\"m 174 485 q 115 509 139 485 q 90 571 90 533 q 115 635 90 611 q 174 660 139 660 q 231 635 207 660 q 256 571 256 611 q 231 509 256 533 q 174 485 207 485 m 93 -236 l 65 -169 q 158 -99 125 -143 q 190 0 192 -56 q 176 -1 186 -1 q 119 19 143 -1 q 94 78 94 39 q 119 137 94 115 q 179 158 144 158 q 249 122 224 158 q 275 24 275 86 q 226 -133 275 -67 q 93 -236 178 -200 z \"},\"…\":{\"ha\":1317,\"x_min\":131,\"x_max\":1226,\"o\":\"m 214 -17 q 155 8 179 -17 q 131 69 131 32 q 155 134 131 110 q 214 158 179 158 q 272 134 247 158 q 296 69 296 110 q 272 8 296 32 q 214 -17 247 -17 m 679 -17 q 620 8 644 -17 q 596 69 596 32 q 620 134 596 110 q 679 158 644 158 q 737 134 713 158 q 761 69 761 110 q 737 8 761 32 q 679 -17 713 -17 m 1144 -17 q 1085 8 1110 -17 q 1061 69 1061 32 q 1085 134 1061 110 q 1144 158 1110 158 q 1202 134 1178 158 q 1226 69 1226 110 q 1202 8 1226 32 q 1144 -17 1178 -17 z \"},\"!\":{\"ha\":401,\"x_min\":118,\"x_max\":283,\"o\":\"m 161 275 l 146 800 l 143 931 l 258 931 l 256 800 l 240 275 l 161 275 m 201 -17 q 142 8 167 -17 q 118 69 118 32 q 142 134 118 110 q 201 158 167 158 q 259 134 235 158 q 283 69 283 110 q 259 8 283 32 q 201 -17 235 -17 z \"},\"¡\":{\"ha\":401,\"x_min\":118,\"x_max\":283,\"o\":\"m 143 -256 l 146 -125 l 161 400 l 240 400 l 256 -125 l 258 -256 l 143 -256 m 201 517 q 142 541 167 517 q 118 606 118 565 q 142 667 118 643 q 201 692 167 692 q 259 667 235 692 q 283 606 283 643 q 259 541 283 565 q 201 517 235 517 z \"},\"?\":{\"ha\":590,\"x_min\":53,\"x_max\":524,\"o\":\"m 222 275 q 226 373 214 329 q 258 453 238 417 q 306 522 279 490 q 357 585 333 554 q 397 649 381 617 q 413 718 413 681 q 378 813 413 774 q 278 853 344 853 q 191 831 232 853 q 118 772 150 810 l 53 832 q 156 915 97 882 q 292 947 215 947 q 460 888 397 947 q 524 725 524 829 q 507 642 524 679 q 466 571 490 604 q 415 505 442 538 q 365 438 388 472 q 329 363 342 403 q 322 275 317 324 l 222 275 m 275 -17 q 217 8 240 -17 q 193 69 193 32 q 217 134 193 110 q 275 158 240 158 q 334 134 310 158 q 358 69 358 110 q 334 8 358 32 q 275 -17 310 -17 z \"},\"¿\":{\"ha\":590,\"x_min\":67,\"x_max\":538,\"o\":\"m 299 -272 q 130 -213 193 -272 q 67 -50 67 -154 q 83 33 67 -4 q 124 104 100 71 q 176 170 149 138 q 225 238 203 203 q 260 312 247 272 q 267 400 272 351 l 368 400 q 364 302 375 346 q 332 222 353 258 q 284 153 311 185 q 233 90 257 121 q 194 26 210 58 q 178 -43 178 -7 q 211 -137 178 -99 q 313 -176 244 -176 q 399 -156 358 -176 q 471 -97 439 -135 l 538 -157 q 434 -239 493 -206 q 299 -272 375 -272 m 315 517 q 256 541 281 517 q 232 606 232 565 q 256 667 232 643 q 315 692 281 692 q 373 667 349 692 q 397 606 397 643 q 373 541 397 565 q 315 517 349 517 z \"},\"'\":{\"ha\":346,\"x_min\":111,\"x_max\":233,\"o\":\"m 138 599 l 115 831 l 111 958 l 233 958 l 229 831 l 207 599 l 138 599 z \"},\"\\\"\":{\"ha\":590,\"x_min\":111,\"x_max\":478,\"o\":\"m 138 599 l 115 831 l 111 958 l 233 958 l 229 831 l 207 599 l 138 599 m 382 599 l 360 831 l 356 958 l 478 958 l 474 831 l 451 599 l 382 599 z \"},\"‘\":{\"ha\":346,\"x_min\":79,\"x_max\":260,\"o\":\"m 167 594 q 102 626 125 594 q 79 719 79 658 q 117 864 79 803 q 226 967 154 925 l 260 913 q 181 838 207 878 q 154 740 154 799 q 167 742 158 742 q 217 724 194 742 q 240 671 240 706 q 219 615 240 635 q 167 594 199 594 z \"},\"’\":{\"ha\":346,\"x_min\":88,\"x_max\":268,\"o\":\"m 119 599 l 88 651 q 166 726 140 686 q 192 825 192 765 q 181 824 188 824 q 129 842 151 824 q 107 893 107 860 q 128 950 107 929 q 181 971 149 971 q 244 938 221 971 q 268 844 268 906 q 230 701 268 761 q 119 599 192 640 z \"},\"“\":{\"ha\":590,\"x_min\":79,\"x_max\":504,\"o\":\"m 167 594 q 102 626 125 594 q 79 719 79 658 q 117 864 79 803 q 226 967 154 925 l 260 913 q 181 838 207 878 q 154 740 154 799 q 167 742 158 742 q 217 724 194 742 q 240 671 240 706 q 219 615 240 635 q 167 594 199 594 m 411 594 q 347 626 369 594 q 324 719 324 658 q 361 864 324 803 q 471 967 399 925 l 504 913 q 425 838 451 878 q 399 740 399 799 q 411 742 403 742 q 462 724 439 742 q 485 671 485 706 q 464 615 485 635 q 411 594 443 594 z \"},\"”\":{\"ha\":590,\"x_min\":88,\"x_max\":513,\"o\":\"m 119 599 l 88 651 q 166 726 140 686 q 192 825 192 765 q 181 824 188 824 q 129 842 151 824 q 107 893 107 860 q 128 950 107 929 q 181 971 149 971 q 244 938 221 971 q 268 844 268 906 q 230 701 268 761 q 119 599 192 640 m 364 599 l 332 651 q 410 726 385 686 q 436 825 436 765 q 425 824 432 824 q 374 842 396 824 q 351 893 351 860 q 372 950 351 929 q 425 971 393 971 q 489 938 465 971 q 513 844 513 906 q 474 701 513 761 q 364 599 436 640 z \"},\"‚\":{\"ha\":346,\"x_min\":88,\"x_max\":268,\"o\":\"m 119 -200 l 88 -147 q 166 -73 140 -112 q 192 26 192 -33 q 181 25 188 25 q 129 43 151 25 q 107 94 107 61 q 128 151 107 131 q 181 172 149 172 q 244 140 221 172 q 268 46 268 107 q 230 -98 268 -37 q 119 -200 192 -158 z \"},\"„\":{\"ha\":590,\"x_min\":88,\"x_max\":513,\"o\":\"m 119 -200 l 88 -147 q 166 -73 140 -112 q 192 26 192 -33 q 181 25 188 25 q 129 43 151 25 q 107 94 107 61 q 128 151 107 131 q 181 172 149 172 q 244 140 221 172 q 268 46 268 107 q 230 -98 268 -37 q 119 -200 192 -158 m 364 -200 l 332 -147 q 410 -73 385 -112 q 436 26 436 -33 q 425 25 432 25 q 374 43 396 25 q 351 94 351 61 q 372 151 351 131 q 425 172 393 172 q 489 140 465 172 q 513 46 513 107 q 474 -98 513 -37 q 364 -200 436 -158 z \"},\"‹\":{\"ha\":376,\"x_min\":63,\"x_max\":301,\"o\":\"m 251 92 l 63 307 l 63 393 l 251 608 l 301 567 l 138 350 l 301 131 l 251 92 z \"},\"›\":{\"ha\":376,\"x_min\":75,\"x_max\":314,\"o\":\"m 124 92 l 75 131 l 239 350 l 75 567 l 124 608 l 314 393 l 314 307 l 124 92 z \"},\"«\":{\"ha\":596,\"x_min\":63,\"x_max\":521,\"o\":\"m 251 92 l 63 307 l 63 393 l 251 608 l 301 567 l 138 350 l 301 131 l 251 92 m 471 92 l 282 307 l 282 393 l 471 608 l 521 567 l 357 350 l 521 131 l 471 92 z \"},\"»\":{\"ha\":596,\"x_min\":75,\"x_max\":533,\"o\":\"m 124 92 l 75 131 l 239 350 l 75 567 l 124 608 l 314 393 l 314 307 l 124 92 m 343 92 l 294 131 l 458 350 l 294 567 l 343 608 l 533 393 l 533 307 l 343 92 z \"},\"-\":{\"ha\":432,\"x_min\":57,\"x_max\":376,\"o\":\"m 57 304 l 57 392 l 376 392 l 376 304 l 57 304 z \"},\"­\":{\"ha\":432,\"x_min\":57,\"x_max\":376,\"o\":\"m 57 304 l 57 392 l 376 392 l 376 304 l 57 304 z \"},\"–\":{\"ha\":667,\"x_min\":57,\"x_max\":610,\"o\":\"m 57 310 l 57 389 l 610 389 l 610 310 l 57 310 z \"},\"—\":{\"ha\":1111,\"x_min\":57,\"x_max\":1054,\"o\":\"m 57 310 l 57 389 l 1054 389 l 1054 310 l 57 310 z \"},\"⸺\":{\"ha\":2083,\"x_min\":57,\"x_max\":2026,\"o\":\"m 57 310 l 57 389 l 2026 389 l 2026 310 l 57 310 z \"},\"⸻\":{\"ha\":3056,\"x_min\":57,\"x_max\":2999,\"o\":\"m 2999 389 l 2999 310 l 57 310 l 57 389 l 2999 389 z \"},\"‒\":{\"ha\":690,\"x_min\":57,\"x_max\":635,\"o\":\"m 57 310 l 57 389 l 635 389 l 635 310 l 57 310 z \"},\"―\":{\"ha\":1111,\"x_min\":57,\"x_max\":1054,\"o\":\"m 57 310 l 57 389 l 1054 389 l 1054 310 l 57 310 z \"},\"·\":{\"ha\":346,\"x_min\":90,\"x_max\":256,\"o\":\"m 174 360 q 115 384 139 360 q 90 446 90 408 q 115 510 90 486 q 174 535 139 535 q 231 510 207 535 q 256 446 256 486 q 231 384 256 408 q 174 360 207 360 z \"},\"•\":{\"ha\":422,\"x_min\":56,\"x_max\":367,\"o\":\"m 211 199 q 151 210 179 199 q 102 244 124 222 q 68 297 81 267 q 56 365 56 328 q 68 434 56 403 q 102 487 81 465 q 151 521 124 508 q 211 533 179 533 q 270 521 242 533 q 320 487 299 508 q 354 434 342 465 q 367 365 367 403 q 354 297 367 328 q 320 244 342 267 q 270 210 299 222 q 211 199 242 199 z \"},\"_\":{\"ha\":694,\"x_min\":17,\"x_max\":678,\"o\":\"m 17 -175 l 17 -99 l 678 -99 l 678 -175 l 17 -175 z \"},\"‾\":{\"ha\":694,\"x_min\":17,\"x_max\":678,\"o\":\"m 17 789 l 17 865 l 678 865 l 678 789 l 17 789 z \"},\"‿\":{\"ha\":0,\"x_min\":-631,\"x_max\":631,\"o\":\"m 0 -324 q -334 -278 -178 -324 q -631 -146 -490 -233 l -597 -89 q -308 -206 -464 -169 q 0 -243 -151 -243 q 308 -206 151 -243 q 597 -89 464 -169 l 631 -146 q 334 -278 490 -233 q 0 -324 178 -324 z \"},\"(\":{\"ha\":421,\"x_min\":114,\"x_max\":368,\"o\":\"m 297 -244 q 163 49 211 -106 q 114 386 114 203 q 163 723 114 569 q 297 1017 211 876 l 368 983 q 248 698 288 850 q 208 386 208 546 q 248 74 208 226 q 368 -211 288 -78 l 297 -244 z \"},\")\":{\"ha\":421,\"x_min\":53,\"x_max\":307,\"o\":\"m 124 -244 l 53 -211 q 173 74 133 -78 q 213 386 213 226 q 173 698 213 546 q 53 983 133 850 l 124 1017 q 258 723 210 876 q 307 386 307 569 q 258 49 307 203 q 124 -244 210 -106 z \"},\"[\":{\"ha\":421,\"x_min\":131,\"x_max\":379,\"o\":\"m 131 -211 l 131 983 l 379 983 l 379 918 l 217 918 l 217 -146 l 379 -146 l 379 -211 l 131 -211 z \"},\"]\":{\"ha\":421,\"x_min\":43,\"x_max\":290,\"o\":\"m 43 -211 l 43 -146 l 204 -146 l 204 918 l 43 918 l 43 983 l 290 983 l 290 -211 l 43 -211 z \"},\"{\":{\"ha\":421,\"x_min\":47,\"x_max\":379,\"o\":\"m 317 -211 q 194 -172 235 -211 q 154 -26 154 -133 q 156 45 154 11 q 160 111 158 79 q 165 175 163 143 q 167 242 167 207 q 161 281 167 263 q 142 315 156 300 q 106 340 129 331 q 47 350 82 350 l 47 422 q 106 432 82 422 q 142 456 129 442 q 161 490 156 471 q 167 529 167 510 q 160 661 167 600 q 154 799 154 722 q 194 944 154 906 q 317 983 235 983 l 379 983 l 379 918 l 342 918 q 266 889 285 918 q 247 792 247 860 q 251 669 247 728 q 256 540 256 611 q 236 437 256 472 q 172 389 217 401 l 172 383 q 236 335 217 371 q 256 232 256 299 q 251 103 256 161 q 247 -19 247 44 q 266 -117 247 -87 q 342 -146 285 -146 l 379 -146 l 379 -211 l 317 -211 z \"},\"}\":{\"ha\":421,\"x_min\":43,\"x_max\":374,\"o\":\"m 43 -211 l 43 -146 l 79 -146 q 155 -117 136 -146 q 174 -19 174 -87 q 170 103 174 44 q 167 232 167 161 q 185 335 167 299 q 249 383 204 371 l 249 389 q 185 437 204 401 q 167 540 167 472 q 170 669 167 611 q 174 792 174 728 q 155 889 174 860 q 79 918 136 918 l 43 918 l 43 983 l 104 983 q 176 974 146 983 q 227 944 207 965 q 257 888 247 924 q 267 799 267 853 q 260 661 267 722 q 254 529 254 600 q 279 456 254 489 q 374 422 304 424 l 374 350 q 316 340 339 350 q 279 315 293 331 q 260 281 265 300 q 254 242 254 263 q 256 175 254 207 q 260 111 258 143 q 265 45 263 79 q 267 -26 267 11 q 257 -116 267 -81 q 227 -172 247 -151 q 176 -202 207 -193 q 104 -211 146 -211 l 43 -211 z \"},\"/\":{\"ha\":486,\"x_min\":14,\"x_max\":468,\"o\":\"m 14 -222 l 385 986 l 468 986 l 97 -222 l 14 -222 z \"},\"|\":{\"ha\":335,\"x_min\":128,\"x_max\":208,\"o\":\"m 128 -347 l 128 1042 l 208 1042 l 208 -347 l 128 -347 z \"},\"\\\\\":{\"ha\":486,\"x_min\":19,\"x_max\":472,\"o\":\"m 390 -222 l 19 986 l 101 986 l 472 -222 l 390 -222 z \"},\"¦\":{\"ha\":335,\"x_min\":128,\"x_max\":208,\"o\":\"m 128 404 l 128 1042 l 208 1042 l 208 404 l 128 404 m 128 -347 l 128 297 l 208 297 l 208 -347 l 128 -347 z \"},\"*\":{\"ha\":581,\"x_min\":81,\"x_max\":500,\"o\":\"m 192 583 l 136 624 l 215 754 l 81 810 l 101 874 l 243 839 l 256 989 l 324 989 l 336 840 l 479 874 l 500 810 l 365 754 l 443 624 l 389 583 l 290 703 l 192 583 z \"},\"†\":{\"ha\":631,\"x_min\":75,\"x_max\":556,\"o\":\"m 267 -111 l 274 682 l 75 675 l 75 774 l 274 767 l 267 989 l 364 989 l 357 767 l 556 774 l 556 675 l 357 682 l 364 -111 l 267 -111 z \"},\"‡\":{\"ha\":631,\"x_min\":75,\"x_max\":556,\"o\":\"m 267 -111 l 274 111 l 75 104 l 75 203 l 274 193 l 267 439 l 274 685 l 75 675 l 75 774 l 274 767 l 267 989 l 364 989 l 357 767 l 556 774 l 556 675 l 357 685 l 364 439 l 357 193 l 556 203 l 556 104 l 357 111 l 364 -111 l 267 -111 z \"},\"§\":{\"ha\":690,\"x_min\":63,\"x_max\":628,\"o\":\"m 163 483 q 190 408 163 438 q 260 356 218 378 q 352 313 303 333 q 444 268 401 293 q 506 314 485 288 q 528 386 528 340 q 500 464 528 433 q 431 517 472 494 q 340 560 389 540 q 247 604 290 579 q 185 554 207 582 q 163 483 163 526 m 328 -89 q 192 -62 253 -89 q 88 10 131 -36 l 157 72 q 232 19 192 39 q 328 0 272 0 q 415 28 383 0 q 446 96 446 56 q 417 161 446 135 q 347 208 389 188 q 254 249 304 229 q 162 299 204 269 q 91 370 119 328 q 63 476 63 413 q 96 582 63 538 q 182 656 129 626 q 149 706 161 678 q 138 769 138 733 q 151 838 138 806 q 191 896 164 871 q 257 935 218 921 q 349 950 296 950 q 469 926 415 950 q 563 871 522 903 l 507 797 q 436 843 474 825 q 353 861 399 861 q 269 835 294 861 q 243 774 243 810 q 272 711 243 736 q 343 665 300 686 q 435 624 386 644 q 528 573 485 603 q 599 501 571 543 q 628 394 628 458 q 595 287 628 328 q 510 215 563 246 q 540 165 529 192 q 551 101 551 138 q 535 25 551 60 q 488 -35 518 -10 q 417 -74 458 -60 q 328 -89 376 -89 z \"},\"¶\":{\"ha\":778,\"x_min\":57,\"x_max\":644,\"o\":\"m 528 -111 l 528 911 l 644 911 l 644 -111 l 528 -111 m 407 314 q 267 331 332 314 q 156 385 203 349 q 83 479 110 422 q 57 615 57 536 q 82 753 57 697 q 152 845 107 810 q 258 896 197 881 q 392 911 319 911 l 453 911 l 453 314 l 407 314 z \"},\"‖\":{\"ha\":542,\"x_min\":128,\"x_max\":415,\"o\":\"m 128 -347 l 128 1042 l 208 1042 l 208 -347 l 128 -347 m 335 -347 l 335 1042 l 415 1042 l 415 -347 l 335 -347 z \"},\"‼\":{\"ha\":763,\"x_min\":118,\"x_max\":644,\"o\":\"m 161 275 l 146 800 l 143 931 l 258 931 l 256 800 l 240 275 l 161 275 m 201 -17 q 142 8 167 -17 q 118 69 118 32 q 142 134 118 110 q 201 158 167 158 q 259 134 235 158 q 283 69 283 110 q 259 8 283 32 q 201 -17 235 -17 m 522 275 l 507 800 l 504 931 l 619 931 l 617 800 l 601 275 l 522 275 m 563 -17 q 503 8 528 -17 q 479 69 479 32 q 503 134 479 110 q 563 158 528 158 q 620 134 596 158 q 644 69 644 110 q 620 8 644 32 q 563 -17 596 -17 z \"},\"⁇\":{\"ha\":1132,\"x_min\":53,\"x_max\":1065,\"o\":\"m 222 275 q 226 373 214 329 q 258 453 238 417 q 306 522 279 490 q 357 585 333 554 q 397 649 381 617 q 413 718 413 681 q 378 813 413 774 q 278 853 344 853 q 191 831 232 853 q 118 772 150 810 l 53 832 q 156 915 97 882 q 292 947 215 947 q 460 888 397 947 q 524 725 524 829 q 507 642 524 679 q 466 571 490 604 q 415 505 442 538 q 365 438 388 472 q 329 363 342 403 q 322 275 317 324 l 222 275 m 275 -17 q 217 8 240 -17 q 193 69 193 32 q 217 134 193 110 q 275 158 240 158 q 334 134 310 158 q 358 69 358 110 q 334 8 358 32 q 275 -17 310 -17 m 764 275 q 767 373 756 329 q 800 453 779 417 q 848 522 821 490 q 899 585 875 554 q 938 649 922 617 q 954 718 954 681 q 920 813 954 774 q 819 853 886 853 q 733 831 774 853 q 660 772 692 810 l 594 832 q 698 915 639 882 q 833 947 757 947 q 1002 888 939 947 q 1065 725 1065 829 q 1049 642 1065 679 q 1008 571 1032 604 q 956 505 983 538 q 906 438 929 472 q 871 363 883 403 q 864 275 858 324 l 764 275 m 817 -17 q 758 8 782 -17 q 735 69 735 32 q 758 134 735 110 q 817 158 782 158 q 876 134 851 158 q 900 69 900 110 q 876 8 900 32 q 817 -17 851 -17 z \"},\"⁉\":{\"ha\":943,\"x_min\":118,\"x_max\":876,\"o\":\"m 161 275 l 146 800 l 143 931 l 258 931 l 256 800 l 240 275 l 161 275 m 201 -17 q 142 8 167 -17 q 118 69 118 32 q 142 134 118 110 q 201 158 167 158 q 259 134 235 158 q 283 69 283 110 q 259 8 283 32 q 201 -17 235 -17 m 575 275 q 578 373 567 329 q 611 453 590 417 q 659 522 632 490 q 710 585 686 554 q 749 649 733 617 q 765 718 765 681 q 731 813 765 774 q 631 853 697 853 q 544 831 585 853 q 471 772 503 810 l 406 832 q 509 915 450 882 q 644 947 568 947 q 813 888 750 947 q 876 725 876 829 q 860 642 876 679 q 819 571 843 604 q 767 505 794 538 q 717 438 740 472 q 682 363 694 403 q 675 275 669 324 l 575 275 m 628 -17 q 569 8 593 -17 q 546 69 546 32 q 569 134 546 110 q 628 158 593 158 q 687 134 663 158 q 711 69 711 110 q 687 8 711 32 q 628 -17 663 -17 z \"},\"⁈\":{\"ha\":943,\"x_min\":53,\"x_max\":825,\"o\":\"m 222 275 q 226 373 214 329 q 258 453 238 417 q 306 522 279 490 q 357 585 333 554 q 397 649 381 617 q 413 718 413 681 q 378 813 413 774 q 278 853 344 853 q 191 831 232 853 q 118 772 150 810 l 53 832 q 156 915 97 882 q 292 947 215 947 q 460 888 397 947 q 524 725 524 829 q 507 642 524 679 q 466 571 490 604 q 415 505 442 538 q 365 438 388 472 q 329 363 342 403 q 322 275 317 324 l 222 275 m 275 -17 q 217 8 240 -17 q 193 69 193 32 q 217 134 193 110 q 275 158 240 158 q 334 134 310 158 q 358 69 358 110 q 334 8 358 32 q 275 -17 310 -17 m 703 275 l 688 800 l 685 931 l 800 931 l 797 800 l 782 275 l 703 275 m 743 -17 q 684 8 708 -17 q 660 69 660 32 q 684 134 660 110 q 743 158 708 158 q 801 134 776 158 q 825 69 825 110 q 801 8 825 32 q 743 -17 776 -17 z \"},\"‽\":{\"ha\":600,\"x_min\":38,\"x_max\":535,\"o\":\"m 238 275 l 224 624 l 217 739 l 314 739 l 314 649 l 307 464 q 346 524 325 496 q 385 580 367 551 q 415 640 403 608 q 428 711 428 672 q 390 815 428 772 q 278 857 351 857 q 184 835 228 857 q 103 768 140 814 l 38 828 q 149 916 86 885 q 286 947 211 947 q 388 931 342 947 q 467 886 435 915 q 517 817 499 857 q 535 729 535 776 q 517 636 535 678 q 474 559 500 594 q 417 491 447 524 q 364 426 388 458 q 326 356 340 393 q 318 275 313 319 l 238 275 m 275 -17 q 217 8 240 -17 q 193 69 193 32 q 217 134 193 110 q 275 158 240 158 q 334 134 310 158 q 358 69 358 110 q 334 8 358 32 q 275 -17 310 -17 z \"},\"⌜\":{\"ha\":421,\"x_min\":131,\"x_max\":379,\"o\":\"m 131 0 l 131 957 l 379 957 l 379 892 l 217 892 l 217 0 l 131 0 z \"},\"⌝\":{\"ha\":421,\"x_min\":43,\"x_max\":290,\"o\":\"m 204 0 l 204 892 l 43 892 l 43 957 l 290 957 l 290 0 l 204 0 z \"},\"⌞\":{\"ha\":421,\"x_min\":131,\"x_max\":379,\"o\":\"m 131 -72 l 131 886 l 217 886 l 217 -7 l 379 -7 l 379 -72 l 131 -72 z \"},\"⌟\":{\"ha\":421,\"x_min\":43,\"x_max\":290,\"o\":\"m 43 -72 l 43 -7 l 204 -7 l 204 886 l 290 886 l 290 -72 l 43 -72 z \"},\"⟦\":{\"ha\":525,\"x_min\":131,\"x_max\":482,\"o\":\"m 131 -211 l 131 983 l 482 983 l 482 918 l 329 918 l 329 -146 l 482 -146 l 482 -211 l 131 -211 m 201 -146 l 264 -146 l 264 918 l 201 918 l 201 -146 z \"},\"⟧\":{\"ha\":525,\"x_min\":43,\"x_max\":394,\"o\":\"m 43 -211 l 43 -146 l 196 -146 l 196 918 l 43 918 l 43 983 l 394 983 l 394 -211 l 43 -211 m 261 -146 l 322 -146 l 322 918 l 261 918 l 261 -146 z \"},\"⸢\":{\"ha\":421,\"x_min\":131,\"x_max\":379,\"o\":\"m 131 386 l 131 983 l 379 983 l 379 918 l 217 918 l 217 386 l 131 386 z \"},\"⸣\":{\"ha\":421,\"x_min\":43,\"x_max\":290,\"o\":\"m 204 386 l 204 918 l 43 918 l 43 983 l 290 983 l 290 386 l 204 386 z \"},\"⸤\":{\"ha\":421,\"x_min\":131,\"x_max\":379,\"o\":\"m 131 -211 l 131 386 l 217 386 l 217 -146 l 379 -146 l 379 -211 l 131 -211 z \"},\"⸥\":{\"ha\":421,\"x_min\":43,\"x_max\":290,\"o\":\"m 43 -211 l 43 -146 l 204 -146 l 204 386 l 290 386 l 290 -211 l 43 -211 z \"},\"©\":{\"ha\":1033,\"x_min\":68,\"x_max\":965,\"o\":\"m 517 -15 q 344 17 426 -15 q 201 110 263 50 q 104 256 140 171 q 68 449 68 342 q 104 639 68 554 q 201 783 140 724 q 344 875 263 843 q 517 907 426 907 q 688 875 607 907 q 831 783 769 843 q 929 639 893 724 q 965 449 965 554 q 929 256 965 342 q 831 110 893 171 q 688 17 769 50 q 517 -15 607 -15 m 517 43 q 665 72 596 43 q 787 155 735 101 q 869 283 839 208 q 900 449 900 357 q 869 613 900 539 q 787 740 839 688 q 665 822 735 793 q 517 850 596 850 q 368 822 438 850 q 247 740 299 793 q 164 613 194 688 q 133 449 133 539 q 164 283 133 357 q 247 155 194 208 q 368 72 299 101 q 517 43 438 43 m 528 174 q 429 192 475 174 q 349 247 383 211 q 294 333 314 282 q 275 449 275 383 q 297 557 275 508 q 353 640 318 606 q 435 693 389 675 q 532 711 482 711 q 631 688 590 711 q 706 632 672 665 l 657 578 q 601 620 629 606 q 536 635 572 635 q 413 583 460 635 q 367 449 367 531 q 412 303 367 357 q 532 250 457 250 q 610 267 576 250 q 674 311 643 285 l 715 253 q 633 197 676 219 q 528 174 590 174 z \"},\"℗\":{\"ha\":1032,\"x_min\":68,\"x_max\":965,\"o\":\"m 517 -15 q 344 17 426 -15 q 201 110 263 50 q 104 256 140 171 q 68 449 68 342 q 104 639 68 554 q 201 783 140 724 q 344 875 263 843 q 517 907 426 907 q 688 875 607 907 q 831 783 769 843 q 929 639 893 724 q 965 449 965 554 q 929 256 965 342 q 831 110 893 171 q 688 17 769 50 q 517 -15 607 -15 m 517 43 q 665 72 596 43 q 787 155 735 101 q 869 283 839 208 q 900 449 900 357 q 869 613 900 539 q 787 740 839 688 q 665 822 735 793 q 517 850 596 850 q 368 822 438 850 q 247 740 299 793 q 164 613 194 688 q 133 449 133 539 q 164 283 133 357 q 247 155 194 208 q 368 72 299 101 q 517 43 438 43 m 351 190 l 351 694 l 543 694 q 624 685 586 694 q 689 656 661 675 q 733 605 717 636 q 749 532 749 574 q 733 452 749 486 q 689 395 717 418 q 624 361 661 372 q 543 350 586 350 l 442 350 l 442 190 l 351 190 m 442 419 l 528 419 q 624 445 590 419 q 658 529 658 471 q 624 601 658 579 q 528 624 590 624 l 442 624 l 442 419 z \"},\"®\":{\"ha\":588,\"x_min\":32,\"x_max\":556,\"o\":\"m 293 443 q 192 463 239 443 q 109 519 144 483 q 53 606 74 556 q 32 717 32 656 q 53 828 32 778 q 109 914 74 878 q 192 970 144 950 q 293 990 239 990 q 395 970 347 990 q 478 914 443 950 q 535 828 514 878 q 556 717 556 778 q 535 606 556 656 q 478 519 514 556 q 395 463 443 483 q 293 443 347 443 m 293 494 q 374 510 336 494 q 440 556 413 526 q 484 626 468 585 q 500 717 500 667 q 484 806 500 765 q 440 877 468 847 q 374 924 413 907 q 293 940 336 940 q 211 924 249 940 q 147 877 174 907 q 103 806 119 847 q 88 717 88 765 q 103 626 88 667 q 147 556 119 585 q 211 510 174 526 q 293 494 249 494 m 193 579 l 193 861 l 299 861 q 375 841 343 861 q 407 771 407 821 q 393 724 407 746 q 356 694 379 703 l 419 579 l 356 579 l 307 676 l 250 676 l 250 579 l 193 579 m 250 721 l 286 721 q 346 768 346 721 q 333 801 346 789 q 289 814 321 814 l 250 814 l 250 721 z \"},\"™\":{\"ha\":885,\"x_min\":4,\"x_max\":844,\"o\":\"m 142 508 l 142 864 l 4 864 l 4 939 l 364 939 l 364 864 l 225 864 l 225 508 l 142 508 m 431 508 l 431 939 l 532 939 l 597 778 l 636 669 l 642 669 l 681 778 l 744 939 l 844 939 l 844 508 l 768 508 l 768 699 l 778 844 l 772 844 l 671 575 l 606 575 l 504 844 l 499 844 l 508 699 l 508 508 l 431 508 z \"},\"℠\":{\"ha\":885,\"x_min\":38,\"x_max\":844,\"o\":\"m 194 492 q 109 509 149 492 q 38 558 69 526 l 83 610 q 137 572 108 586 q 200 557 165 557 q 250 572 232 557 q 268 611 268 586 q 253 649 268 639 q 208 675 239 660 l 143 707 q 85 750 111 722 q 60 826 60 778 q 100 915 60 881 q 206 949 140 949 q 279 933 244 949 q 338 896 314 918 l 297 842 q 250 871 275 858 q 201 883 225 883 q 153 867 169 883 q 136 831 136 851 q 151 797 136 810 q 194 771 167 783 l 258 739 q 322 694 299 721 q 346 618 346 667 q 335 571 346 593 q 305 531 325 549 q 257 502 285 513 q 194 492 229 492 m 431 508 l 431 939 l 532 939 l 597 778 l 636 669 l 642 669 l 681 778 l 744 939 l 844 939 l 844 508 l 768 508 l 768 699 l 778 844 l 772 844 l 671 575 l 606 575 l 504 844 l 499 844 l 508 699 l 508 508 l 431 508 z \"},\"@\":{\"ha\":1176,\"x_min\":71,\"x_max\":1106,\"o\":\"m 560 -215 q 368 -183 457 -215 q 213 -88 279 -151 q 109 68 147 -25 q 71 282 71 161 q 117 535 71 421 q 244 729 164 649 q 428 853 324 810 q 650 897 533 897 q 840 864 756 897 q 983 770 924 831 q 1074 625 1042 710 q 1106 438 1106 540 q 1080 277 1106 346 q 1014 162 1054 208 q 924 92 974 115 q 828 68 875 68 q 731 94 771 68 q 685 174 692 121 l 682 174 q 603 106 647 133 q 513 79 558 79 q 394 129 442 79 q 346 275 346 179 q 365 388 346 331 q 418 492 383 446 q 502 568 453 539 q 613 597 551 597 q 676 581 649 597 q 724 531 704 565 l 726 531 l 742 586 l 818 586 l 764 308 q 839 146 722 146 q 905 165 872 146 q 965 222 938 185 q 1008 312 992 258 q 1025 433 1025 365 q 1001 588 1025 517 q 928 711 976 660 q 807 792 879 763 q 640 821 735 821 q 460 783 547 821 q 304 675 372 744 q 195 507 236 606 q 154 286 154 408 q 185 106 154 185 q 272 -28 217 26 q 403 -110 328 -82 q 568 -139 479 -139 q 689 -122 632 -139 q 793 -76 746 -104 l 824 -144 q 560 -215 706 -215 m 535 157 q 595 176 564 157 q 663 239 626 196 l 703 460 q 663 505 683 492 q 614 518 642 518 q 540 496 572 518 q 484 439 507 474 q 449 363 461 404 q 438 282 438 321 q 465 186 438 215 q 535 157 493 157 z \"},\"#\":{\"ha\":690,\"x_min\":49,\"x_max\":649,\"o\":\"m 125 0 l 160 283 l 49 283 l 49 363 l 169 363 l 194 568 l 76 568 l 76 649 l 204 649 l 236 903 l 310 903 l 278 649 l 463 649 l 496 903 l 569 903 l 536 649 l 649 649 l 649 568 l 528 568 l 503 363 l 621 363 l 621 283 l 493 283 l 458 0 l 385 0 l 418 283 l 235 283 l 200 0 l 125 0 m 244 363 l 428 363 l 453 568 l 269 568 l 244 363 z \"},\"⁰\":{\"ha\":510,\"x_min\":49,\"x_max\":463,\"o\":\"m 256 532 q 105 607 161 532 q 49 821 49 682 q 105 1033 49 958 q 256 1107 161 1107 q 406 1033 349 1107 q 463 821 463 958 q 406 607 463 682 q 256 532 349 532 m 256 603 q 342 658 308 603 q 375 821 375 713 q 342 983 375 929 q 256 1036 308 1036 q 168 983 201 1036 q 135 821 135 929 q 168 658 135 713 q 256 603 201 603 z \"},\"¹\":{\"ha\":510,\"x_min\":121,\"x_max\":328,\"o\":\"m 239 549 l 239 976 l 121 976 l 121 1035 q 197 1056 167 1043 q 256 1090 228 1069 l 328 1090 l 328 549 l 239 549 z \"},\"²\":{\"ha\":510,\"x_min\":56,\"x_max\":444,\"o\":\"m 72 549 l 72 600 q 183 702 135 657 q 264 785 232 747 q 313 855 296 822 q 329 918 329 888 q 301 1001 329 971 q 225 1032 274 1032 q 161 1009 190 1032 q 108 953 132 986 l 56 1001 q 134 1078 88 1049 q 236 1107 181 1107 q 367 1063 318 1107 q 417 932 417 1018 q 401 857 417 893 q 359 784 386 821 q 295 708 332 747 q 215 625 258 669 l 444 625 l 444 549 l 72 549 z \"},\"³\":{\"ha\":510,\"x_min\":49,\"x_max\":443,\"o\":\"m 250 532 q 132 562 183 532 q 49 638 81 592 l 108 683 q 168 624 133 646 q 246 603 203 603 q 322 628 290 603 q 354 700 354 653 q 310 772 354 747 q 186 796 265 796 l 186 853 q 295 881 257 853 q 333 950 333 908 q 306 1013 333 989 q 235 1036 279 1036 q 176 1017 204 1036 q 125 971 149 999 l 71 1018 q 149 1083 107 1058 q 249 1107 192 1107 q 315 1097 283 1107 q 369 1069 346 1088 q 407 1023 393 1050 q 421 961 421 996 q 394 880 421 913 q 326 828 368 847 q 408 783 372 817 q 443 694 443 749 q 428 627 443 657 q 386 576 413 597 q 324 543 360 554 q 250 532 289 532 z \"},\"⁴\":{\"ha\":510,\"x_min\":58,\"x_max\":467,\"o\":\"m 306 549 l 306 693 l 58 693 l 58 739 l 286 1090 l 386 1090 l 386 757 l 467 757 l 467 693 l 386 693 l 386 549 l 306 549 m 151 757 l 306 757 l 306 854 l 311 1006 l 306 1006 l 236 893 l 151 757 z \"},\"⁵\":{\"ha\":510,\"x_min\":49,\"x_max\":449,\"o\":\"m 254 532 q 131 562 182 532 q 49 638 81 592 l 108 683 q 168 624 135 646 q 249 603 201 603 q 328 636 297 603 q 360 722 360 669 q 328 810 360 778 q 246 842 296 842 q 190 829 214 842 q 143 797 165 817 l 100 829 l 125 1090 l 421 1090 l 421 1013 l 199 1013 l 183 881 q 225 895 203 889 q 271 901 247 901 q 340 890 307 901 q 397 854 372 878 q 435 797 421 831 q 449 719 449 763 q 433 643 449 678 q 392 584 418 608 q 331 546 367 560 q 254 532 296 532 z \"},\"⁶\":{\"ha\":510,\"x_min\":63,\"x_max\":453,\"o\":\"m 272 532 q 119 604 176 532 q 63 806 63 676 q 81 939 63 882 q 131 1033 99 996 q 206 1089 163 1071 q 299 1107 249 1107 q 376 1094 346 1107 q 431 1065 407 1082 l 394 1003 q 352 1026 375 1017 q 301 1036 329 1036 q 197 987 240 1036 q 147 833 154 938 q 283 889 207 889 q 409 841 365 889 q 453 715 453 793 q 439 643 453 676 q 401 585 425 610 q 344 546 376 560 q 272 532 311 532 m 271 603 q 342 634 315 603 q 369 714 369 665 q 343 793 369 763 q 265 824 317 824 q 207 810 235 824 q 147 764 179 797 q 188 643 154 683 q 271 603 221 603 z \"},\"⁷\":{\"ha\":510,\"x_min\":69,\"x_max\":449,\"o\":\"m 182 549 q 197 679 186 619 q 228 794 208 739 q 277 903 247 850 q 349 1014 307 957 l 69 1014 l 69 1090 l 449 1090 l 449 1040 q 367 919 399 978 q 317 802 336 861 q 288 681 297 743 q 275 549 279 619 l 182 549 z \"},\"⁸\":{\"ha\":510,\"x_min\":63,\"x_max\":444,\"o\":\"m 253 532 q 175 544 210 532 q 115 576 140 556 q 76 625 90 597 q 63 683 63 653 q 94 773 63 735 q 165 835 125 811 l 165 840 q 107 892 129 864 q 85 964 85 921 q 98 1022 85 996 q 134 1067 111 1049 q 188 1097 157 1086 q 253 1107 218 1107 q 376 1069 326 1107 q 426 964 426 1031 q 419 921 426 940 q 399 885 411 901 q 372 856 386 868 q 343 833 357 843 l 343 828 q 417 770 390 804 q 444 688 444 736 q 430 626 444 654 q 390 576 415 597 q 329 544 364 556 q 253 532 294 532 m 285 858 q 329 908 315 882 q 343 961 343 933 q 317 1018 343 997 q 253 1039 290 1039 q 192 1017 217 1039 q 167 963 167 996 q 201 897 167 921 q 285 858 236 874 m 253 597 q 329 624 297 597 q 361 690 361 651 q 349 732 361 715 q 318 761 338 749 q 274 783 299 774 q 221 804 249 793 q 146 692 146 760 q 175 626 146 656 q 253 597 204 597 z \"},\"⁹\":{\"ha\":510,\"x_min\":54,\"x_max\":444,\"o\":\"m 240 815 q 300 828 272 815 q 360 875 328 842 q 319 996 353 956 q 235 1036 286 1036 q 164 1005 192 1036 q 136 925 136 974 q 163 846 136 876 q 240 815 190 815 m 208 532 q 130 544 161 532 q 75 574 99 557 l 113 636 q 155 613 132 622 q 206 603 178 603 q 310 653 267 603 q 360 807 353 703 q 224 750 300 750 q 98 798 142 750 q 54 924 54 846 q 68 996 54 963 q 106 1054 82 1029 q 163 1093 129 1079 q 233 1107 196 1107 q 388 1035 331 1107 q 444 833 444 963 q 426 700 444 757 q 376 606 408 643 q 301 550 344 568 q 208 532 258 532 z \"},\"⁽\":{\"ha\":329,\"x_min\":90,\"x_max\":275,\"o\":\"m 213 439 q 122 613 153 524 q 90 819 90 701 q 122 1024 90 936 q 213 1197 153 1113 l 275 1167 q 199 998 222 1085 q 176 819 176 911 q 199 640 176 726 q 275 469 222 553 l 213 439 z \"},\"⁾\":{\"ha\":329,\"x_min\":54,\"x_max\":239,\"o\":\"m 119 439 l 54 469 q 130 640 107 553 q 153 819 153 726 q 130 998 153 911 q 54 1167 107 1085 l 119 1197 q 208 1024 176 1113 q 239 819 239 936 q 208 613 239 701 q 119 439 178 524 z \"},\"₀\":{\"ha\":510,\"x_min\":49,\"x_max\":463,\"o\":\"m 256 -261 q 105 -186 161 -261 q 49 28 49 -111 q 105 240 49 165 q 256 314 161 314 q 406 240 349 314 q 463 28 463 165 q 406 -186 463 -111 q 256 -261 349 -261 m 256 -190 q 342 -135 308 -190 q 375 28 375 -81 q 342 190 375 136 q 256 243 308 243 q 168 190 201 243 q 135 28 135 136 q 168 -135 135 -81 q 256 -190 201 -190 z \"},\"₁\":{\"ha\":510,\"x_min\":121,\"x_max\":328,\"o\":\"m 239 -244 l 239 183 l 121 183 l 121 242 q 197 263 167 250 q 256 297 228 276 l 328 297 l 328 -244 l 239 -244 z \"},\"₂\":{\"ha\":510,\"x_min\":56,\"x_max\":444,\"o\":\"m 72 -244 l 72 -193 q 183 -91 135 -136 q 264 -8 232 -46 q 313 62 296 29 q 329 125 329 94 q 301 208 329 178 q 225 239 274 239 q 161 216 190 239 q 108 160 132 193 l 56 208 q 134 285 88 256 q 236 314 181 314 q 367 269 318 314 q 417 139 417 225 q 401 64 417 100 q 359 -9 386 28 q 295 -85 332 -46 q 215 -168 258 -124 l 444 -168 l 444 -244 l 72 -244 z \"},\"₃\":{\"ha\":510,\"x_min\":49,\"x_max\":443,\"o\":\"m 250 -261 q 132 -231 183 -261 q 49 -156 81 -201 l 108 -110 q 168 -169 133 -147 q 246 -190 203 -190 q 322 -165 290 -190 q 354 -93 354 -140 q 310 -22 354 -46 q 186 3 265 3 l 186 60 q 295 88 257 60 q 333 157 333 115 q 306 219 333 196 q 235 243 279 243 q 176 224 204 243 q 125 178 149 206 l 71 225 q 149 290 107 265 q 249 314 192 314 q 315 304 283 314 q 369 276 346 294 q 407 230 393 257 q 421 168 421 203 q 394 87 421 119 q 326 35 368 54 q 408 -10 372 24 q 443 -99 443 -44 q 428 -166 443 -136 q 386 -217 413 -196 q 324 -250 360 -239 q 250 -261 289 -261 z \"},\"₄\":{\"ha\":510,\"x_min\":58,\"x_max\":467,\"o\":\"m 306 -244 l 306 -100 l 58 -100 l 58 -54 l 286 297 l 386 297 l 386 -36 l 467 -36 l 467 -100 l 386 -100 l 386 -244 l 306 -244 m 151 -36 l 306 -36 l 306 61 l 311 213 l 306 213 l 236 100 l 151 -36 z \"},\"₅\":{\"ha\":510,\"x_min\":49,\"x_max\":449,\"o\":\"m 254 -261 q 131 -231 182 -261 q 49 -156 81 -201 l 108 -110 q 168 -169 135 -147 q 249 -190 201 -190 q 328 -157 297 -190 q 360 -71 360 -124 q 328 17 360 -15 q 246 49 296 49 q 190 36 214 49 q 143 4 165 24 l 100 36 l 125 297 l 421 297 l 421 219 l 199 219 l 183 88 q 225 102 203 96 q 271 108 247 108 q 340 97 307 108 q 397 61 372 85 q 435 3 421 38 q 449 -74 449 -31 q 433 -150 449 -115 q 392 -209 418 -185 q 331 -247 367 -233 q 254 -261 296 -261 z \"},\"₆\":{\"ha\":510,\"x_min\":63,\"x_max\":453,\"o\":\"m 272 -261 q 119 -189 176 -261 q 63 13 63 -117 q 81 146 63 89 q 131 240 99 203 q 206 296 163 278 q 299 314 249 314 q 376 301 346 314 q 431 272 407 289 l 394 210 q 352 233 375 224 q 301 243 329 243 q 197 194 240 243 q 147 40 154 144 q 283 96 207 96 q 409 48 365 96 q 453 -78 453 0 q 439 -150 453 -117 q 401 -208 425 -183 q 344 -247 376 -233 q 272 -261 311 -261 m 271 -190 q 342 -159 315 -190 q 369 -79 369 -128 q 343 0 369 -31 q 265 31 317 31 q 207 17 235 31 q 147 -29 179 4 q 188 -150 154 -110 q 271 -190 221 -190 z \"},\"₇\":{\"ha\":510,\"x_min\":69,\"x_max\":449,\"o\":\"m 182 -244 q 197 -114 186 -174 q 228 1 208 -54 q 277 110 247 57 q 349 221 307 164 l 69 221 l 69 297 l 449 297 l 449 247 q 367 126 399 185 q 317 9 336 68 q 288 -112 297 -50 q 275 -244 279 -174 l 182 -244 z \"},\"₈\":{\"ha\":510,\"x_min\":63,\"x_max\":444,\"o\":\"m 253 -261 q 175 -249 210 -261 q 115 -217 140 -237 q 76 -168 90 -196 q 63 -110 63 -140 q 94 -20 63 -58 q 165 42 125 18 l 165 47 q 107 99 129 71 q 85 171 85 128 q 98 229 85 203 q 134 274 111 256 q 188 303 157 293 q 253 314 218 314 q 376 276 326 314 q 426 171 426 238 q 419 128 426 147 q 399 92 411 108 q 372 63 386 75 q 343 40 357 50 l 343 35 q 417 -23 390 11 q 444 -106 444 -57 q 430 -167 444 -139 q 390 -217 415 -196 q 329 -249 364 -237 q 253 -261 294 -261 m 285 65 q 329 115 315 89 q 343 168 343 140 q 317 225 343 204 q 253 246 290 246 q 192 224 217 246 q 167 169 167 203 q 201 104 167 128 q 285 65 236 81 m 253 -196 q 329 -169 297 -196 q 361 -103 361 -142 q 349 -61 361 -78 q 318 -32 338 -44 q 274 -10 299 -19 q 221 11 249 0 q 146 -101 146 -33 q 175 -167 146 -137 q 253 -196 204 -196 z \"},\"₉\":{\"ha\":510,\"x_min\":54,\"x_max\":444,\"o\":\"m 240 22 q 300 35 272 22 q 360 82 328 49 q 319 203 353 163 q 235 243 286 243 q 164 212 192 243 q 136 132 136 181 q 163 53 136 83 q 240 22 190 22 m 208 -261 q 130 -249 161 -261 q 75 -219 99 -236 l 113 -157 q 155 -181 132 -171 q 206 -190 178 -190 q 310 -140 267 -190 q 360 14 353 -90 q 224 -43 300 -43 q 98 5 142 -43 q 54 131 54 53 q 68 203 54 169 q 106 261 82 236 q 163 300 129 286 q 233 314 196 314 q 388 242 331 314 q 444 40 444 169 q 426 -93 444 -36 q 376 -187 408 -150 q 301 -243 344 -225 q 208 -261 258 -261 z \"},\"₍\":{\"ha\":329,\"x_min\":90,\"x_max\":275,\"o\":\"m 213 -354 q 122 -181 153 -269 q 90 26 90 -92 q 122 231 90 143 q 213 404 153 319 l 275 374 q 199 205 222 292 q 176 26 176 118 q 199 -153 176 -67 q 275 -324 222 -240 l 213 -354 z \"},\"₎\":{\"ha\":329,\"x_min\":54,\"x_max\":239,\"o\":\"m 119 -354 l 54 -324 q 130 -153 107 -240 q 153 26 153 -67 q 130 205 153 118 q 54 374 107 292 l 119 404 q 208 231 176 319 q 239 26 239 143 q 208 -181 239 -92 q 119 -354 178 -269 z \"},\"ª\":{\"ha\":479,\"x_min\":51,\"x_max\":414,\"o\":\"m 189 538 q 89 573 126 538 q 51 668 51 608 q 117 780 51 742 q 328 833 183 818 q 308 906 326 878 q 242 935 290 935 q 167 920 206 935 q 101 888 129 906 l 69 947 q 152 987 104 968 q 254 1006 200 1006 q 376 957 338 1006 q 414 821 414 908 l 414 549 l 344 549 l 335 600 l 329 600 q 267 556 301 575 q 189 538 232 538 m 214 606 q 328 661 268 606 l 328 779 q 178 741 221 768 q 136 675 136 714 q 157 622 136 639 q 214 606 178 606 z \"},\"º\":{\"ha\":507,\"x_min\":42,\"x_max\":464,\"o\":\"m 253 538 q 172 553 210 538 q 104 599 133 569 q 58 672 75 629 q 42 771 42 715 q 58 870 42 826 q 104 944 75 914 q 172 990 133 975 q 253 1006 210 1006 q 334 990 296 1006 q 401 944 372 975 q 447 870 431 914 q 464 771 464 826 q 447 672 464 715 q 401 599 431 629 q 334 553 372 569 q 253 538 296 538 m 253 608 q 343 653 311 608 q 375 771 375 699 q 343 890 375 846 q 253 935 311 935 q 162 890 194 935 q 129 771 129 846 q 162 653 129 699 q 253 608 194 608 z \"},\"ᵃ\":{\"ha\":479,\"x_min\":51,\"x_max\":414,\"o\":\"m 189 538 q 89 573 126 538 q 51 668 51 608 q 117 780 51 742 q 328 833 183 818 q 308 906 326 878 q 242 935 290 935 q 167 920 206 935 q 101 888 129 906 l 69 947 q 152 987 104 968 q 254 1006 200 1006 q 376 957 338 1006 q 414 821 414 908 l 414 549 l 344 549 l 335 600 l 329 600 q 267 556 301 575 q 189 538 232 538 m 214 606 q 328 661 268 606 l 328 779 q 178 741 221 768 q 136 675 136 714 q 157 622 136 639 q 214 606 178 606 z \"},\"ᵇ\":{\"ha\":519,\"x_min\":72,\"x_max\":474,\"o\":\"m 279 538 q 214 551 247 538 q 153 593 181 565 l 147 593 l 139 549 l 72 549 l 72 1199 l 158 1199 l 158 1024 l 154 943 q 220 988 186 969 q 293 1006 254 1006 q 427 944 381 1006 q 474 779 474 883 q 458 677 474 722 q 415 601 442 632 q 353 553 388 569 q 279 538 318 538 m 267 608 q 351 652 317 608 q 385 779 385 696 q 358 893 385 851 q 272 935 331 935 q 158 875 218 935 l 158 651 q 215 618 186 628 q 267 608 243 608 z \"},\"ᶜ\":{\"ha\":425,\"x_min\":42,\"x_max\":403,\"o\":\"m 256 538 q 102 598 163 538 q 42 771 42 658 q 59 870 42 826 q 106 944 76 914 q 176 990 136 974 q 258 1006 215 1006 q 341 990 307 1006 q 396 957 375 975 l 354 901 q 314 926 333 918 q 264 935 294 935 q 167 890 206 935 q 129 771 129 844 q 167 653 129 699 q 264 608 204 608 q 324 619 300 608 q 367 646 347 631 l 403 590 q 344 553 379 569 q 256 538 308 538 z \"},\"ᵈ\":{\"ha\":519,\"x_min\":46,\"x_max\":447,\"o\":\"m 236 538 q 97 600 147 538 q 46 779 46 663 q 62 874 46 832 q 105 944 78 915 q 167 990 132 974 q 240 1006 203 1006 q 307 992 276 1006 q 365 956 338 979 l 361 1033 l 361 1199 l 447 1199 l 447 549 l 378 549 l 368 597 l 364 597 q 306 555 336 572 q 236 538 275 538 m 256 608 q 308 623 283 608 q 361 665 333 638 l 361 890 q 306 924 333 914 q 254 935 279 935 q 170 892 206 935 q 135 779 135 850 q 164 652 135 696 q 256 608 193 608 z \"},\"ᵉ\":{\"ha\":467,\"x_min\":39,\"x_max\":431,\"o\":\"m 258 538 q 172 553 213 538 q 103 598 132 568 q 56 671 74 628 q 39 771 39 714 q 56 869 39 825 q 101 942 72 913 q 167 989 129 972 q 247 1006 206 1006 q 334 986 299 1006 q 391 936 369 967 q 422 869 413 906 q 431 800 431 833 q 429 776 431 786 q 425 751 428 767 l 124 751 q 167 644 128 682 q 268 606 206 606 q 329 615 300 606 q 382 642 358 625 l 415 586 q 344 551 383 565 q 258 538 304 538 m 122 808 l 354 808 q 349 854 354 831 q 331 896 343 878 q 298 926 318 914 q 247 938 278 938 q 164 904 197 938 q 122 808 131 871 z \"},\"ᶠ\":{\"ha\":279,\"x_min\":26,\"x_max\":306,\"o\":\"m 89 549 l 89 926 l 26 926 l 26 992 l 89 994 l 89 1053 q 122 1169 89 1124 q 228 1214 156 1214 q 306 1200 272 1214 l 288 1136 q 265 1142 278 1139 q 236 1144 253 1144 q 190 1122 206 1144 q 175 1058 175 1099 l 175 994 l 269 994 l 269 926 l 175 926 l 175 549 l 89 549 z \"},\"ᵍ\":{\"ha\":476,\"x_min\":42,\"x_max\":461,\"o\":\"m 228 344 q 93 375 144 344 q 42 464 42 406 q 106 561 42 522 l 106 567 q 76 596 88 578 q 65 640 65 614 q 81 688 65 667 q 115 721 96 708 l 115 726 q 74 775 92 744 q 56 846 56 806 q 69 913 56 883 q 108 963 83 943 q 163 994 132 983 q 231 1006 194 1006 q 301 993 269 1006 l 454 993 l 454 926 l 368 926 q 391 890 382 913 q 400 843 400 868 q 387 778 400 807 q 351 728 374 749 q 297 698 328 708 q 231 688 265 688 q 198 690 215 688 q 164 701 181 693 q 145 681 153 693 q 138 654 138 669 q 154 621 138 632 q 215 610 171 610 l 301 610 q 422 584 383 610 q 461 500 461 558 q 445 440 461 468 q 399 391 429 413 q 325 357 368 369 q 228 344 282 344 m 231 746 q 295 773 268 746 q 322 846 322 800 q 295 917 322 892 q 231 943 268 943 q 164 918 190 943 q 138 846 138 893 q 164 773 138 800 q 231 746 190 746 m 242 404 q 340 430 303 404 q 378 488 378 456 q 355 526 378 515 q 290 538 332 538 l 217 538 q 190 538 206 538 q 158 543 174 539 q 115 476 115 513 q 149 423 115 442 q 242 404 182 404 z \"},\"ʰ\":{\"ha\":508,\"x_min\":72,\"x_max\":446,\"o\":\"m 72 549 l 72 1199 l 158 1199 l 158 1025 l 154 932 q 221 983 182 961 q 304 1006 260 1006 q 414 957 382 1006 q 446 831 446 908 l 446 549 l 360 549 l 360 818 q 344 901 360 871 q 275 932 328 932 q 158 867 224 932 l 158 549 l 72 549 z \"},\"ⁱ\":{\"ha\":231,\"x_min\":58,\"x_max\":175,\"o\":\"m 117 1081 q 75 1096 92 1081 q 58 1135 58 1111 q 75 1174 58 1158 q 117 1190 92 1190 q 158 1174 142 1190 q 175 1135 175 1158 q 158 1096 175 1111 q 117 1081 142 1081 m 72 549 l 72 994 l 158 994 l 158 549 l 72 549 z \"},\"ʲ\":{\"ha\":235,\"x_min\":-36,\"x_max\":178,\"o\":\"m 32 347 q -6 350 8 347 q -36 358 -21 353 l -18 426 q -1 420 -10 422 q 21 418 7 418 q 64 440 53 418 q 75 501 75 461 l 75 994 l 161 994 l 161 507 q 132 390 161 432 q 32 347 103 347 m 119 1081 q 78 1096 94 1081 q 61 1135 61 1111 q 78 1174 61 1158 q 119 1190 94 1190 q 161 1174 144 1190 q 178 1135 178 1158 q 161 1096 178 1111 q 119 1081 144 1081 z \"},\"ᵏ\":{\"ha\":468,\"x_min\":72,\"x_max\":461,\"o\":\"m 72 549 l 72 1199 l 158 1199 l 158 772 l 164 772 l 346 994 l 442 994 l 286 813 l 461 549 l 365 549 l 236 754 l 158 661 l 158 549 l 72 549 z \"},\"ˡ\":{\"ha\":242,\"x_min\":72,\"x_max\":213,\"o\":\"m 163 538 q 92 567 113 538 q 72 650 72 597 l 72 1199 l 158 1199 l 158 643 q 164 616 158 624 q 181 608 169 608 q 189 608 185 608 q 200 611 193 608 l 213 546 q 192 540 203 542 q 163 538 181 538 z \"},\"ᵐ\":{\"ha\":776,\"x_min\":72,\"x_max\":710,\"o\":\"m 72 549 l 72 994 l 142 994 l 149 932 l 154 932 q 215 984 182 963 q 294 1006 249 1006 q 419 922 388 1006 q 488 981 451 956 q 569 1006 525 1006 q 677 958 644 1006 q 710 831 710 910 l 710 549 l 624 549 l 624 818 q 607 901 624 871 q 542 932 590 932 q 491 917 517 932 q 433 867 465 901 l 433 549 l 347 549 l 347 818 q 331 901 347 871 q 265 932 314 932 q 216 917 242 932 q 158 867 190 901 l 158 549 l 72 549 z \"},\"ⁿ\":{\"ha\":513,\"x_min\":72,\"x_max\":446,\"o\":\"m 72 549 l 72 994 l 140 994 l 149 932 l 154 932 q 222 984 183 963 q 304 1006 260 1006 q 414 957 382 1006 q 446 831 446 908 l 446 549 l 360 549 l 360 818 q 344 901 360 871 q 276 932 328 932 q 158 867 224 932 l 158 549 l 72 549 z \"},\"ᵒ\":{\"ha\":507,\"x_min\":42,\"x_max\":464,\"o\":\"m 253 538 q 172 553 210 538 q 104 599 133 569 q 58 672 75 629 q 42 771 42 715 q 58 870 42 826 q 104 944 75 914 q 172 990 133 975 q 253 1006 210 1006 q 334 990 296 1006 q 401 944 372 975 q 447 870 431 914 q 464 771 464 826 q 447 672 464 715 q 401 599 431 629 q 334 553 372 569 q 253 538 296 538 m 253 608 q 343 653 311 608 q 375 771 375 699 q 343 890 375 846 q 253 935 311 935 q 162 890 194 935 q 129 771 129 846 q 162 653 129 699 q 253 608 194 608 z \"},\"ᵖ\":{\"ha\":519,\"x_min\":72,\"x_max\":474,\"o\":\"m 72 357 l 72 994 l 140 994 l 150 943 l 154 943 q 217 987 182 968 q 293 1006 253 1006 q 427 944 381 1006 q 474 779 474 883 q 458 677 474 722 q 415 601 442 632 q 353 553 388 569 q 279 538 318 538 q 215 551 249 538 q 153 589 181 564 l 158 501 l 158 357 l 72 357 m 267 608 q 351 652 317 608 q 385 779 385 696 q 358 893 385 851 q 272 935 331 935 q 158 875 218 935 l 158 651 q 215 618 186 628 q 267 608 243 608 z \"},\"ʳ\":{\"ha\":333,\"x_min\":72,\"x_max\":335,\"o\":\"m 72 549 l 72 994 l 142 994 l 151 917 l 156 917 q 282 1006 208 1006 q 335 997 318 1006 l 318 919 q 297 924 310 922 q 274 926 285 926 q 214 905 244 926 q 160 831 183 883 l 160 549 l 72 549 z \"},\"ˢ\":{\"ha\":393,\"x_min\":26,\"x_max\":365,\"o\":\"m 200 538 q 105 555 150 538 q 26 599 60 572 l 68 656 q 131 618 99 632 q 201 604 164 604 q 261 622 240 604 q 282 667 282 640 q 251 715 282 699 q 181 746 219 731 q 133 765 157 754 q 91 792 110 776 q 60 828 72 807 q 49 878 49 849 q 89 968 49 931 q 203 1006 129 1006 q 288 990 251 1006 q 351 956 324 975 l 308 900 q 260 929 283 919 q 206 939 238 939 q 149 922 168 939 q 131 883 131 904 q 139 857 131 868 q 161 838 147 846 q 193 822 175 829 q 231 807 211 815 q 278 788 254 799 q 322 763 303 778 q 353 727 342 749 q 365 675 365 706 q 321 576 365 614 q 200 538 276 538 z \"},\"ᵗ\":{\"ha\":322,\"x_min\":22,\"x_max\":313,\"o\":\"m 222 538 q 119 581 149 538 q 89 693 89 624 l 89 925 l 22 925 l 22 992 l 92 994 l 103 1121 l 175 1121 l 175 994 l 297 994 l 297 925 l 175 925 l 175 693 q 243 607 175 607 q 294 618 272 607 l 313 554 q 269 542 293 547 q 222 538 246 538 z \"},\"ᵘ\":{\"ha\":514,\"x_min\":69,\"x_max\":443,\"o\":\"m 213 538 q 102 585 135 538 q 69 711 69 633 l 69 994 l 156 994 l 156 724 q 172 641 156 671 q 240 611 188 611 q 297 626 268 611 q 357 676 325 642 l 357 994 l 443 994 l 443 549 l 375 549 l 365 611 l 361 611 q 295 559 333 581 q 213 538 257 538 z \"},\"ᵛ\":{\"ha\":446,\"x_min\":11,\"x_max\":435,\"o\":\"m 172 549 l 11 994 l 97 994 l 178 750 l 221 617 l 226 617 l 269 750 l 350 994 l 435 994 l 274 549 l 172 549 z \"},\"ʷ\":{\"ha\":676,\"x_min\":22,\"x_max\":654,\"o\":\"m 146 549 l 22 994 l 111 994 l 172 746 l 199 619 l 204 619 l 235 746 l 300 994 l 378 994 l 447 746 l 478 619 l 483 619 l 513 746 l 572 994 l 654 994 l 533 549 l 429 549 l 369 775 l 340 903 l 338 903 l 308 775 l 249 549 l 146 549 z \"},\"ˣ\":{\"ha\":426,\"x_min\":11,\"x_max\":414,\"o\":\"m 11 549 l 161 782 l 24 994 l 118 994 l 175 903 l 218 832 l 224 832 l 261 903 l 313 994 l 404 994 l 268 772 l 414 549 l 319 549 l 260 644 l 211 721 l 206 721 l 160 644 l 103 549 l 11 549 z \"},\"ʸ\":{\"ha\":443,\"x_min\":11,\"x_max\":432,\"o\":\"m 90 363 q 33 371 58 363 l 51 440 q 85 432 69 432 q 146 457 121 432 q 183 522 171 482 l 193 551 l 11 994 l 99 994 l 186 760 q 208 697 197 729 q 229 631 218 665 l 235 631 q 254 696 244 664 q 275 760 264 728 l 347 994 l 432 994 l 267 522 q 201 407 242 451 q 90 363 161 363 z \"},\"ᶻ\":{\"ha\":403,\"x_min\":29,\"x_max\":378,\"o\":\"m 29 549 l 29 594 l 263 925 l 57 925 l 57 994 l 371 994 l 371 947 l 139 618 l 378 618 l 378 549 l 29 549 z \"},\"ˁ\":{\"ha\":419,\"x_min\":31,\"x_max\":406,\"o\":\"m 186 549 l 186 808 q 74 904 117 854 q 31 1032 31 954 q 46 1110 31 1076 q 88 1166 61 1143 q 152 1200 115 1189 q 231 1211 189 1211 q 335 1186 293 1211 q 406 1131 378 1161 l 361 1075 q 310 1121 340 1101 q 238 1140 281 1140 q 148 1110 179 1140 q 117 1031 117 1081 q 153 933 117 974 q 271 844 189 892 l 271 549 l 186 549 z \"},\"ː\":{\"ha\":346,\"x_min\":69,\"x_max\":276,\"o\":\"m 69 0 l 165 192 l 181 192 l 276 0 l 69 0 m 165 454 l 69 643 l 276 643 l 181 454 l 165 454 z \"},\"ˑ\":{\"ha\":346,\"x_min\":69,\"x_max\":276,\"o\":\"m 165 374 l 69 563 l 276 563 l 181 374 l 165 374 z \"},\"˞\":{\"ha\":210,\"x_min\":-135,\"x_max\":238,\"o\":\"m 144 319 q 66 349 100 319 q 13 453 32 378 l -135 393 l -135 481 l 68 564 q 84 477 75 511 q 103 424 93 443 q 126 399 114 406 q 153 392 139 392 q 183 398 171 392 q 207 413 196 404 l 238 353 q 198 330 221 340 q 144 319 175 319 z \"},\"ˠ\":{\"ha\":442,\"x_min\":11,\"x_max\":431,\"o\":\"m 222 344 q 142 375 171 344 q 114 454 114 406 q 128 519 114 486 q 167 601 143 553 l 11 994 l 99 994 l 181 764 q 201 708 190 733 q 221 651 211 682 l 225 651 q 245 708 235 682 q 267 764 256 733 l 347 994 l 431 994 l 278 600 q 317 519 303 551 q 332 454 332 486 q 303 375 332 406 q 222 344 275 344 m 222 401 q 251 415 242 401 q 260 449 260 428 q 225 560 260 493 l 221 560 q 197 499 206 528 q 188 449 188 471 q 196 415 188 428 q 222 401 204 401 z \"},\"ₔ\":{\"ha\":467,\"x_min\":35,\"x_max\":426,\"o\":\"m 222 538 q 133 557 169 538 q 75 607 97 576 q 44 675 53 638 q 35 747 35 713 q 36 772 35 763 q 40 797 38 781 l 342 797 q 306 899 339 860 q 211 938 274 938 q 151 928 178 938 q 99 901 124 918 l 67 957 q 135 992 99 978 q 217 1006 172 1006 q 369 944 313 1006 q 426 771 426 883 q 410 674 426 717 q 367 601 394 631 q 302 554 339 571 q 222 538 265 538 m 221 606 q 305 639 272 606 q 342 740 338 672 l 111 740 q 136 645 111 685 q 221 606 161 606 z \"},\"°\":{\"ha\":460,\"x_min\":57,\"x_max\":404,\"o\":\"m 231 596 q 165 608 196 596 q 109 644 133 621 q 71 699 85 667 q 57 772 57 732 q 71 847 57 814 q 109 903 85 879 q 165 939 133 926 q 231 951 196 951 q 297 939 265 951 q 352 903 328 926 q 390 847 376 879 q 404 772 404 814 q 390 699 404 732 q 352 644 376 667 q 297 608 328 621 q 231 596 265 596 m 231 660 q 306 692 276 660 q 335 772 335 724 q 306 856 335 824 q 231 888 276 888 q 156 856 185 888 q 126 772 126 824 q 156 692 126 724 q 231 660 185 660 z \"},\"¤\":{\"ha\":690,\"x_min\":36,\"x_max\":654,\"o\":\"m 97 143 l 36 206 l 125 296 q 88 368 101 328 q 75 457 75 408 q 88 547 75 506 q 125 619 101 588 l 36 711 l 97 774 l 192 676 q 346 728 258 728 q 426 715 386 728 q 499 676 467 701 l 593 774 l 654 711 l 564 619 q 601 547 588 588 q 615 457 615 506 q 601 368 615 408 q 564 296 588 328 l 654 206 l 593 143 l 499 239 q 426 199 467 213 q 346 186 386 186 q 192 239 257 186 l 97 143 m 346 271 q 409 284 379 271 q 461 322 439 297 q 497 381 483 347 q 510 457 510 415 q 497 533 510 499 q 461 592 483 567 q 409 630 439 617 q 346 643 379 643 q 282 630 313 643 q 229 592 251 617 q 194 533 207 567 q 181 457 181 499 q 194 381 181 415 q 229 322 207 347 q 282 284 251 297 q 346 271 313 271 z \"},\"$\":{\"ha\":690,\"x_min\":72,\"x_max\":607,\"o\":\"m 308 -153 l 308 -15 q 179 22 242 -8 q 72 92 117 51 l 125 171 q 223 105 169 132 q 340 78 276 78 q 456 117 418 78 q 494 221 494 156 q 466 313 494 276 q 394 377 438 350 q 301 428 351 404 q 207 482 250 451 q 135 556 164 513 q 107 668 107 600 q 162 823 107 761 q 308 899 217 885 l 308 1039 l 392 1039 l 392 901 q 505 865 458 894 q 589 796 551 836 l 528 728 q 452 786 489 765 q 358 807 415 807 q 257 771 294 807 q 219 674 219 735 q 248 592 219 624 q 319 535 276 560 q 413 488 363 511 q 507 433 464 465 q 578 352 550 400 q 607 229 607 304 q 549 65 607 129 q 392 -12 492 1 l 392 -153 l 308 -153 z \"},\"£\":{\"ha\":690,\"x_min\":74,\"x_max\":629,\"o\":\"m 75 0 l 75 69 q 184 174 146 108 q 222 319 222 240 q 219 358 222 339 q 213 396 217 376 l 74 396 l 74 468 l 167 474 l 192 474 q 166 560 178 518 q 154 647 154 603 q 173 753 154 706 q 226 833 192 800 q 307 885 260 867 q 413 903 354 903 q 540 873 488 903 q 628 799 592 843 l 561 733 q 501 786 535 765 q 421 807 468 807 q 306 762 346 807 q 267 644 267 717 q 277 559 267 600 q 300 474 288 518 l 521 474 l 521 396 l 318 396 q 323 358 321 376 q 325 318 325 339 q 303 196 325 244 q 239 104 281 147 l 239 99 l 629 99 l 629 0 l 75 0 z \"},\"¥\":{\"ha\":690,\"x_min\":32,\"x_max\":658,\"o\":\"m 288 0 l 288 219 l 63 219 l 63 286 l 288 286 l 288 376 l 63 376 l 63 442 l 258 442 l 32 886 l 151 886 l 260 649 q 301 556 281 603 q 343 461 321 510 l 349 461 q 392 556 372 510 q 433 649 413 603 l 542 886 l 658 886 l 431 442 l 628 442 l 628 376 l 401 376 l 401 286 l 628 286 l 628 219 l 401 219 l 401 0 l 288 0 z \"},\"€\":{\"ha\":690,\"x_min\":32,\"x_max\":682,\"o\":\"m 443 -17 q 327 6 381 -17 q 232 74 274 29 q 162 181 190 118 q 121 326 133 244 l 32 326 l 32 386 l 114 392 q 113 417 113 404 q 113 442 113 429 q 113 464 113 453 q 114 486 113 475 l 32 486 l 32 547 l 121 554 q 163 701 133 636 q 235 810 192 765 q 337 879 279 856 q 463 903 394 903 q 579 872 525 903 q 669 794 633 840 l 601 729 q 538 788 572 765 q 458 811 503 811 q 311 743 367 811 q 238 554 256 675 l 590 554 l 590 486 l 232 486 q 231 467 231 476 q 231 446 231 457 q 231 419 231 432 q 232 393 231 406 l 535 393 l 535 326 l 239 326 q 310 142 257 208 q 450 75 364 75 q 540 100 501 75 q 614 174 578 125 l 682 113 q 578 17 636 51 q 443 -17 519 -17 z \"},\"¢\":{\"ha\":690,\"x_min\":85,\"x_max\":631,\"o\":\"m 199 431 q 242 276 199 338 q 364 197 285 215 l 364 663 q 243 583 288 644 q 199 431 199 522 m 364 -46 l 364 99 q 250 131 301 106 q 162 199 199 157 q 105 299 125 240 q 85 431 85 357 q 106 560 85 503 q 165 658 128 617 q 254 726 203 700 q 364 760 306 751 l 364 907 l 436 907 l 436 764 q 542 738 497 761 q 618 683 586 714 l 563 611 q 503 651 535 636 q 436 669 472 667 l 436 192 q 517 213 481 194 q 581 257 553 232 l 631 185 q 540 125 590 149 q 436 97 490 101 l 436 -46 l 364 -46 z \"},\"ƒ\":{\"ha\":690,\"x_min\":25,\"x_max\":642,\"o\":\"m 126 -135 q 68 -129 94 -135 q 25 -114 42 -124 l 46 -28 q 115 -42 78 -42 q 209 13 181 -42 q 249 175 238 68 l 282 479 l 161 479 l 161 561 l 257 567 l 292 567 l 300 644 q 369 856 315 783 q 533 928 422 928 q 593 920 564 928 q 642 903 622 913 l 617 815 q 583 828 601 822 q 539 835 565 835 q 485 819 507 835 q 448 779 463 804 q 424 722 433 754 q 411 654 415 689 l 401 567 l 576 567 l 576 479 l 392 479 l 356 150 q 333 34 349 86 q 292 -56 318 -18 q 225 -114 265 -93 q 126 -135 185 -135 z \"},\"₡\":{\"ha\":690,\"x_min\":85,\"x_max\":664,\"o\":\"m 442 811 q 422 810 431 811 q 403 808 413 810 l 319 108 q 397 78 354 83 l 483 806 q 463 810 472 808 q 442 811 453 811 m 203 446 q 221 278 203 351 q 274 157 239 206 l 349 790 q 240 665 278 754 q 203 446 203 576 m 369 -153 l 386 -15 q 307 4 347 -11 l 289 -153 l 236 -153 l 258 29 q 131 187 178 82 q 85 442 85 292 q 159 745 85 628 q 361 893 233 863 l 378 1039 l 431 1039 l 414 901 q 429 903 421 903 q 444 903 438 903 q 494 897 472 903 l 511 1039 l 564 1039 l 544 881 q 606 841 578 865 q 657 789 635 817 l 589 725 q 533 779 563 758 l 450 76 q 530 106 494 82 q 597 174 565 131 l 664 113 q 565 22 619 56 q 439 -17 510 -12 l 422 -153 l 369 -153 z \"},\"₤\":{\"ha\":690,\"x_min\":74,\"x_max\":629,\"o\":\"m 75 0 l 75 69 q 184 174 146 108 q 222 319 222 240 l 222 326 l 74 326 l 74 388 l 169 394 l 214 394 q 203 435 208 415 q 190 476 197 456 l 74 476 l 74 538 l 158 544 l 171 544 q 159 596 164 571 q 154 647 154 621 q 173 753 154 706 q 226 833 192 800 q 307 885 260 867 q 413 903 354 903 q 540 873 488 903 q 628 799 592 843 l 561 733 q 501 786 535 765 q 421 807 468 807 q 306 762 346 807 q 267 644 267 717 q 270 594 267 618 q 281 544 274 569 l 521 544 l 521 476 l 299 476 q 318 394 313 433 l 521 394 l 521 326 l 325 326 l 325 318 q 303 196 325 244 q 239 104 281 147 l 239 99 l 629 99 l 629 0 l 75 0 z \"},\"₦\":{\"ha\":690,\"x_min\":15,\"x_max\":671,\"o\":\"m 188 782 l 204 535 l 269 535 l 193 782 l 188 782 m 497 103 l 503 103 l 488 333 l 426 333 l 497 103 m 119 0 l 119 333 l 15 333 l 15 386 l 119 393 l 119 476 l 15 476 l 15 528 l 119 535 l 119 886 l 236 886 l 360 535 l 481 535 l 481 886 l 571 886 l 571 535 l 671 535 l 671 476 l 571 476 l 571 393 l 671 393 l 671 333 l 571 333 l 571 0 l 454 0 l 338 333 l 210 333 l 210 0 l 119 0 m 403 413 l 408 393 l 483 393 l 481 440 l 481 476 l 381 476 l 403 413 m 210 446 l 210 393 l 317 393 l 288 475 l 288 476 l 208 476 l 210 446 z \"},\"₧\":{\"ha\":690,\"x_min\":14,\"x_max\":672,\"o\":\"m 115 0 l 115 579 l 14 579 l 14 650 l 115 657 l 115 886 l 283 886 q 397 874 344 886 q 489 834 449 861 q 554 763 529 807 q 586 657 579 719 l 672 657 l 672 579 l 586 579 q 554 473 579 518 q 489 398 529 428 q 396 353 449 368 q 283 339 343 339 l 225 339 l 225 0 l 115 0 m 225 807 l 225 657 l 476 657 q 413 773 465 739 q 269 807 361 807 l 225 807 m 225 418 l 269 418 q 414 459 361 418 q 476 579 467 500 l 225 579 l 225 418 z \"},\"₩\":{\"ha\":690,\"x_min\":-21,\"x_max\":707,\"o\":\"m 319 517 l 315 481 l 375 481 l 369 518 l 349 743 l 343 743 l 319 517 m 497 86 l 503 86 l 518 275 l 532 421 l 456 421 l 476 275 l 497 86 m 133 0 l 78 421 l -21 421 l -21 474 l 69 479 l 15 886 l 122 886 l 163 481 l 250 481 l 299 831 l 399 831 l 447 481 l 538 481 l 578 886 l 676 886 l 625 481 l 707 481 l 707 421 l 617 421 l 564 0 l 440 0 l 383 421 l 307 421 l 251 0 l 133 0 m 197 86 l 203 86 l 221 275 l 242 421 l 168 421 l 182 275 l 197 86 z \"},\"₫\":{\"ha\":690,\"x_min\":94,\"x_max\":672,\"o\":\"m 313 153 q 153 220 213 153 q 94 415 94 288 q 113 518 94 472 q 164 597 132 564 q 236 647 196 629 q 321 664 276 664 q 405 647 372 664 q 472 600 438 631 l 467 715 l 467 763 l 264 763 l 264 831 l 467 831 l 467 924 l 564 924 l 564 831 l 672 831 l 672 769 l 564 763 l 564 167 l 483 167 l 475 226 l 471 226 q 401 174 440 194 q 313 153 361 153 m 332 235 q 401 252 368 235 q 467 308 433 269 l 467 524 q 404 567 432 554 q 338 581 376 581 q 283 568 308 581 q 238 533 257 556 q 207 481 218 511 q 196 417 196 451 q 231 283 196 331 q 332 235 267 235 m 110 0 l 110 68 l 608 68 l 608 0 l 110 0 z \"},\"₱\":{\"ha\":690,\"x_min\":14,\"x_max\":672,\"o\":\"m 115 0 l 115 524 l 14 524 l 14 574 l 115 581 l 115 663 l 14 663 l 14 714 l 115 719 l 115 886 l 283 886 q 467 848 389 886 q 574 719 544 810 l 672 719 l 672 663 l 585 663 q 587 640 586 651 q 588 617 588 629 q 588 598 588 607 q 586 581 588 589 l 672 581 l 672 524 l 575 524 q 469 384 547 429 q 283 339 390 339 l 225 339 l 225 0 l 115 0 m 225 807 l 225 719 l 460 719 q 388 787 436 767 q 269 807 340 807 l 225 807 m 479 617 q 478 640 479 629 q 476 663 478 651 l 225 663 l 225 581 l 476 581 q 478 598 478 589 q 479 617 479 607 m 225 418 l 269 418 q 463 524 418 418 l 225 524 l 225 418 z \"},\"₲\":{\"ha\":690,\"x_min\":65,\"x_max\":639,\"o\":\"m 360 -153 l 360 -14 q 240 29 294 -6 q 147 122 186 64 q 87 261 108 181 q 65 442 65 342 q 86 618 65 539 q 145 756 107 697 q 238 851 183 814 q 360 899 292 888 l 360 1039 l 443 1039 l 443 901 q 550 865 501 896 q 635 792 599 835 l 567 728 q 499 788 535 765 q 417 811 464 811 q 316 785 360 811 q 242 713 272 760 q 197 597 213 665 q 182 446 182 529 q 241 176 182 275 q 407 78 300 78 q 481 93 447 78 q 535 129 515 108 l 535 364 l 394 364 l 394 460 l 639 460 l 639 85 q 549 18 599 43 q 443 -14 500 -7 l 443 -153 l 360 -153 z \"},\"₴\":{\"ha\":690,\"x_min\":32,\"x_max\":657,\"o\":\"m 376 -17 q 187 42 258 -17 q 115 207 115 101 q 122 271 115 242 q 140 326 129 300 l 32 326 l 32 386 l 126 393 l 185 393 q 233 443 207 421 q 288 486 260 465 l 32 486 l 32 547 l 128 554 l 376 554 q 432 617 410 583 q 454 694 454 650 q 422 778 454 744 q 331 811 389 811 q 244 790 279 811 q 172 732 208 768 l 113 796 q 204 872 153 840 q 333 903 256 903 q 428 888 385 903 q 502 844 471 872 q 550 778 533 817 q 567 690 567 739 q 555 616 567 650 q 524 554 543 582 l 657 554 l 657 486 l 463 486 q 404 439 435 461 q 344 393 374 417 l 657 393 l 657 326 l 274 326 q 240 269 253 300 q 226 200 226 239 q 265 110 226 146 q 376 75 303 75 q 483 102 435 75 q 571 167 531 129 l 622 92 q 511 15 576 46 q 376 -17 446 -17 z \"},\"₵\":{\"ha\":690,\"x_min\":85,\"x_max\":664,\"o\":\"m 203 446 q 251 194 203 290 q 388 79 299 97 l 388 804 q 250 688 297 782 q 203 446 203 593 m 388 -153 l 388 -15 q 264 26 319 -8 q 169 118 208 60 q 107 258 129 176 q 85 442 85 340 q 106 619 85 539 q 167 757 128 699 q 263 851 207 815 q 388 899 318 888 l 388 1035 l 460 1035 l 460 903 q 567 868 518 899 q 651 794 617 838 l 583 729 q 528 784 558 763 q 460 810 499 806 l 460 78 q 533 109 500 85 q 597 174 567 133 l 664 113 q 574 27 624 60 q 460 -14 524 -6 l 460 -153 l 388 -153 z \"},\"₹\":{\"ha\":690,\"x_min\":100,\"x_max\":626,\"o\":\"m 100 350 l 100 443 l 199 443 q 356 483 299 443 q 421 607 414 524 l 100 607 l 100 668 l 196 675 l 418 675 q 347 765 403 739 q 199 792 290 792 l 100 792 l 100 886 l 626 886 l 626 818 l 429 818 q 496 760 469 797 q 532 675 522 724 l 626 675 l 626 607 l 535 607 q 471 442 528 503 q 324 361 414 382 l 585 0 l 454 0 l 207 350 l 100 350 z \"},\"₺\":{\"ha\":690,\"x_min\":32,\"x_max\":646,\"o\":\"m 160 -17 l 160 363 l 32 296 l 32 369 l 160 436 l 160 536 l 32 469 l 32 542 l 160 610 l 160 886 l 276 886 l 276 667 l 504 786 l 504 713 l 276 593 l 276 493 l 504 613 l 504 540 l 276 419 l 276 92 q 370 108 322 93 q 457 152 418 124 q 521 223 496 181 q 546 319 546 265 q 545 345 546 331 q 539 379 544 360 l 636 404 q 646 325 646 360 q 609 172 646 238 q 507 64 572 107 q 353 1 442 21 q 160 -17 264 -19 z \"},\"₮\":{\"ha\":690,\"x_min\":46,\"x_max\":640,\"o\":\"m 288 0 l 288 268 l 107 174 l 107 247 l 288 342 l 288 442 l 107 347 l 107 421 l 288 515 l 288 797 l 46 797 l 46 886 l 640 886 l 640 797 l 401 797 l 401 569 l 581 665 l 581 592 l 401 496 l 401 396 l 581 492 l 581 418 l 401 324 l 401 0 l 288 0 z \"},\"₸\":{\"ha\":690,\"x_min\":46,\"x_max\":640,\"o\":\"m 288 0 l 288 658 l 46 658 l 46 719 l 143 725 l 640 725 l 640 658 l 401 658 l 401 0 l 288 0 m 46 818 l 46 886 l 640 886 l 640 818 l 46 818 z \"},\"₽\":{\"ha\":690,\"x_min\":14,\"x_max\":588,\"o\":\"m 115 0 l 115 231 l 14 231 l 14 290 l 115 297 l 115 382 l 14 382 l 14 443 l 115 449 l 115 886 l 282 886 q 403 872 347 886 q 501 828 460 858 q 565 751 542 799 q 588 639 588 704 q 564 524 588 572 q 499 444 540 475 q 402 397 458 413 q 282 382 346 382 l 225 382 l 225 297 l 506 297 l 506 231 l 225 231 l 225 0 l 115 0 m 225 449 l 269 449 q 424 495 369 449 q 479 633 479 542 q 424 768 479 729 q 269 807 369 807 l 225 807 l 225 449 z \"},\"⁄\":{\"ha\":119,\"x_min\":-232,\"x_max\":349,\"o\":\"m -232 -17 l 271 928 l 349 928 l -154 -17 l -232 -17 z \"},\"∕\":{\"ha\":119,\"x_min\":-232,\"x_max\":349,\"o\":\"m -232 -17 l 271 928 l 349 928 l -154 -17 l -232 -17 z \"},\"%\":{\"ha\":1144,\"x_min\":49,\"x_max\":1097,\"o\":\"m 256 353 q 105 428 161 353 q 49 642 49 503 q 105 853 49 779 q 256 928 161 928 q 406 853 349 928 q 463 642 463 779 q 406 428 463 503 q 256 353 349 353 m 256 424 q 342 478 308 424 q 375 642 375 533 q 342 803 375 750 q 256 857 308 857 q 168 803 201 857 q 135 642 135 750 q 168 478 135 533 q 256 424 201 424 m 281 -17 l 783 928 l 861 928 l 358 -17 l 281 -17 m 890 -17 q 740 58 796 -17 q 683 272 683 133 q 740 484 683 410 q 890 558 796 558 q 1040 484 983 558 q 1097 272 1097 410 q 1040 58 1097 133 q 890 -17 983 -17 m 890 54 q 976 109 943 54 q 1010 272 1010 164 q 976 434 1010 381 q 890 488 943 488 q 803 434 836 488 q 769 272 769 381 q 803 109 769 164 q 890 54 836 54 z \"},\"‰\":{\"ha\":1658,\"x_min\":49,\"x_max\":1611,\"o\":\"m 278 -17 l 781 928 l 858 928 l 356 -17 l 278 -17 m 256 353 q 105 428 161 353 q 49 642 49 503 q 105 853 49 779 q 256 928 161 928 q 406 853 349 928 q 463 642 463 779 q 406 428 463 503 q 256 353 349 353 m 256 424 q 342 478 308 424 q 375 642 375 533 q 342 803 375 750 q 256 857 308 857 q 168 803 201 857 q 135 642 135 750 q 168 478 135 533 q 256 424 201 424 m 888 -17 q 737 58 793 -17 q 681 272 681 133 q 737 484 681 410 q 888 558 793 558 q 1038 484 981 558 q 1094 272 1094 410 q 1038 58 1094 133 q 888 -17 981 -17 m 888 54 q 974 109 940 54 q 1007 272 1007 164 q 974 434 1007 381 q 888 488 940 488 q 800 434 833 488 q 767 272 767 381 q 800 109 767 164 q 888 54 833 54 m 1404 -17 q 1253 58 1310 -17 q 1197 272 1197 133 q 1253 484 1197 410 q 1404 558 1310 558 q 1554 484 1497 558 q 1611 272 1611 410 q 1554 58 1611 133 q 1404 -17 1497 -17 m 1404 54 q 1490 109 1457 54 q 1524 272 1524 164 q 1490 434 1524 381 q 1404 488 1457 488 q 1317 434 1350 488 q 1283 272 1283 381 q 1317 109 1283 164 q 1404 54 1350 54 z \"},\"¼\":{\"ha\":1085,\"x_min\":89,\"x_max\":1040,\"o\":\"m 207 369 l 207 797 l 89 797 l 89 856 q 165 877 135 864 q 224 911 196 890 l 296 911 l 296 369 l 207 369 m 250 -17 l 753 928 l 831 928 l 328 -17 l 250 -17 m 879 0 l 879 144 l 632 144 l 632 190 l 860 542 l 960 542 l 960 208 l 1040 208 l 1040 144 l 960 144 l 960 0 l 879 0 m 725 208 l 879 208 l 879 306 l 885 457 l 879 457 l 810 344 l 725 208 z \"},\"½\":{\"ha\":1122,\"x_min\":89,\"x_max\":1057,\"o\":\"m 207 369 l 207 797 l 89 797 l 89 856 q 165 877 135 864 q 224 911 196 890 l 296 911 l 296 369 l 207 369 m 221 -17 l 724 928 l 801 928 l 299 -17 l 221 -17 m 685 0 l 685 51 q 796 153 747 108 q 876 236 844 199 q 925 306 908 274 q 942 369 942 339 q 914 453 942 422 q 838 483 886 483 q 774 460 803 483 q 721 404 744 438 l 668 453 q 747 529 700 500 q 849 558 793 558 q 980 514 931 558 q 1029 383 1029 469 q 1014 308 1029 344 q 972 235 999 272 q 908 160 944 199 q 828 76 871 121 l 1057 76 l 1057 0 l 685 0 z \"},\"¾\":{\"ha\":1106,\"x_min\":49,\"x_max\":1061,\"o\":\"m 250 353 q 132 383 183 353 q 49 458 81 413 l 108 504 q 168 445 133 467 q 246 424 203 424 q 322 449 290 424 q 354 521 354 474 q 310 592 354 568 q 186 617 265 617 l 186 674 q 295 701 257 674 q 333 771 333 729 q 306 833 333 810 q 235 857 279 857 q 176 838 204 857 q 125 792 149 819 l 71 839 q 149 903 107 879 q 249 928 192 928 q 315 918 283 928 q 369 890 346 908 q 407 844 393 871 q 421 782 421 817 q 394 701 421 733 q 326 649 368 668 q 408 603 372 638 q 443 515 443 569 q 428 448 443 478 q 386 397 413 418 q 324 364 360 375 q 250 353 289 353 m 301 -17 l 804 928 l 882 928 l 379 -17 l 301 -17 m 900 0 l 900 144 l 653 144 l 653 190 l 881 542 l 981 542 l 981 208 l 1061 208 l 1061 144 l 981 144 l 981 0 l 900 0 m 746 208 l 900 208 l 900 306 l 906 457 l 900 457 l 831 344 l 746 208 z \"},\"⅓\":{\"ha\":1117,\"x_min\":89,\"x_max\":1050,\"o\":\"m 207 369 l 207 797 l 89 797 l 89 856 q 165 877 135 864 q 224 911 196 890 l 296 911 l 296 369 l 207 369 m 213 -17 l 715 928 l 793 928 l 290 -17 l 213 -17 m 857 -17 q 739 13 790 -17 q 656 89 688 43 l 715 135 q 775 76 740 97 q 853 54 810 54 q 929 79 897 54 q 961 151 961 104 q 917 223 961 199 q 793 247 872 247 l 793 304 q 902 332 864 304 q 940 401 940 360 q 913 464 940 440 q 842 488 886 488 q 783 469 811 488 q 732 422 756 450 l 678 469 q 756 534 714 510 q 856 558 799 558 q 922 549 890 558 q 976 520 953 539 q 1014 474 1000 501 q 1028 413 1028 447 q 1001 331 1028 364 q 933 279 975 299 q 1015 234 979 268 q 1050 146 1050 200 q 1035 78 1050 108 q 993 27 1019 49 q 931 -6 967 6 q 857 -17 896 -17 z \"},\"⅔\":{\"ha\":1140,\"x_min\":57,\"x_max\":1072,\"o\":\"m 74 369 l 74 421 q 185 523 136 478 q 265 606 233 568 q 314 676 297 643 q 331 739 331 708 q 303 822 331 792 q 226 853 275 853 q 163 830 192 853 q 110 774 133 807 l 57 822 q 135 899 89 869 q 238 928 182 928 q 369 883 319 928 q 418 753 418 839 q 403 678 418 714 q 360 605 388 642 q 297 529 333 568 q 217 446 260 490 l 446 446 l 446 369 l 74 369 m 282 -17 l 785 928 l 863 928 l 360 -17 l 282 -17 m 879 -17 q 761 13 813 -17 q 678 89 710 43 l 738 135 q 797 76 763 97 q 875 54 832 54 q 951 79 919 54 q 983 151 983 104 q 939 223 983 199 q 815 247 894 247 l 815 304 q 924 332 886 304 q 963 401 963 360 q 935 464 963 440 q 864 488 908 488 q 806 469 833 488 q 754 422 778 450 l 700 469 q 778 534 736 510 q 878 558 821 558 q 944 549 913 558 q 999 520 975 539 q 1036 474 1022 501 q 1050 413 1050 447 q 1024 331 1050 364 q 956 279 997 299 q 1037 234 1001 268 q 1072 146 1072 200 q 1057 78 1072 108 q 1015 27 1042 49 q 953 -6 989 6 q 879 -17 918 -17 z \"},\"⅕\":{\"ha\":1117,\"x_min\":89,\"x_max\":1056,\"o\":\"m 207 369 l 207 797 l 89 797 l 89 856 q 165 877 135 864 q 224 911 196 890 l 296 911 l 296 369 l 207 369 m 213 -17 l 715 928 l 793 928 l 290 -17 l 213 -17 m 861 -17 q 738 13 789 -17 q 656 89 688 43 l 715 135 q 775 76 742 97 q 856 54 808 54 q 935 88 904 54 q 967 174 967 121 q 935 261 967 229 q 853 293 903 293 q 797 281 821 293 q 750 249 772 268 l 707 281 l 732 542 l 1028 542 l 1028 464 l 806 464 l 790 332 q 832 347 810 340 q 878 353 854 353 q 947 341 914 353 q 1003 306 979 329 q 1042 248 1028 282 q 1056 171 1056 214 q 1040 94 1056 129 q 999 35 1025 60 q 938 -3 974 11 q 861 -17 903 -17 z \"},\"⅖\":{\"ha\":1140,\"x_min\":57,\"x_max\":1078,\"o\":\"m 74 369 l 74 421 q 185 523 136 478 q 265 606 233 568 q 314 676 297 643 q 331 739 331 708 q 303 822 331 792 q 226 853 275 853 q 163 830 192 853 q 110 774 133 807 l 57 822 q 135 899 89 869 q 238 928 182 928 q 369 883 319 928 q 418 753 418 839 q 403 678 418 714 q 360 605 388 642 q 297 529 333 568 q 217 446 260 490 l 446 446 l 446 369 l 74 369 m 282 -17 l 785 928 l 863 928 l 360 -17 l 282 -17 m 883 -17 q 760 13 811 -17 q 678 89 710 43 l 738 135 q 797 76 764 97 q 878 54 831 54 q 958 88 926 54 q 989 174 989 121 q 957 261 989 229 q 875 293 925 293 q 819 281 843 293 q 772 249 794 268 l 729 281 l 754 542 l 1050 542 l 1050 464 l 828 464 l 813 332 q 854 347 832 340 q 900 353 876 353 q 969 341 936 353 q 1026 306 1001 329 q 1064 248 1050 282 q 1078 171 1078 214 q 1063 94 1078 129 q 1022 35 1047 60 q 960 -3 996 11 q 883 -17 925 -17 z \"},\"⅗\":{\"ha\":1140,\"x_min\":49,\"x_max\":1078,\"o\":\"m 250 353 q 132 383 183 353 q 49 458 81 413 l 108 504 q 168 445 133 467 q 246 424 203 424 q 322 449 290 424 q 354 521 354 474 q 310 592 354 568 q 186 617 265 617 l 186 674 q 295 701 257 674 q 333 771 333 729 q 306 833 333 810 q 235 857 279 857 q 176 838 204 857 q 125 792 149 819 l 71 839 q 149 903 107 879 q 249 928 192 928 q 315 918 283 928 q 369 890 346 908 q 407 844 393 871 q 421 782 421 817 q 394 701 421 733 q 326 649 368 668 q 408 603 372 638 q 443 515 443 569 q 428 448 443 478 q 386 397 413 418 q 324 364 360 375 q 250 353 289 353 m 278 -17 l 781 928 l 858 928 l 356 -17 l 278 -17 m 883 -17 q 760 13 811 -17 q 678 89 710 43 l 738 135 q 797 76 764 97 q 878 54 831 54 q 958 88 926 54 q 989 174 989 121 q 957 261 989 229 q 875 293 925 293 q 819 281 843 293 q 772 249 794 268 l 729 281 l 754 542 l 1050 542 l 1050 464 l 828 464 l 813 332 q 854 347 832 340 q 900 353 876 353 q 969 341 936 353 q 1026 306 1001 329 q 1064 248 1050 282 q 1078 171 1078 214 q 1063 94 1078 129 q 1022 35 1047 60 q 960 -3 996 11 q 883 -17 925 -17 z \"},\"⅘\":{\"ha\":1175,\"x_min\":58,\"x_max\":1113,\"o\":\"m 306 369 l 306 514 l 58 514 l 58 560 l 286 911 l 386 911 l 386 578 l 467 578 l 467 514 l 386 514 l 386 369 l 306 369 m 151 578 l 306 578 l 306 675 l 311 826 l 306 826 l 236 714 l 151 578 m 311 -17 l 814 928 l 892 928 l 389 -17 l 311 -17 m 918 -17 q 795 13 846 -17 q 713 89 744 43 l 772 135 q 832 76 799 97 q 913 54 865 54 q 992 88 961 54 q 1024 174 1024 121 q 992 261 1024 229 q 910 293 960 293 q 853 281 878 293 q 807 249 829 268 l 764 281 l 789 542 l 1085 542 l 1085 464 l 863 464 l 847 332 q 889 347 867 340 q 935 353 911 353 q 1003 341 971 353 q 1060 306 1036 329 q 1099 248 1085 282 q 1113 171 1113 214 q 1097 94 1113 129 q 1056 35 1082 60 q 995 -3 1031 11 q 918 -17 960 -17 z \"},\"⅙\":{\"ha\":1117,\"x_min\":89,\"x_max\":1046,\"o\":\"m 207 369 l 207 797 l 89 797 l 89 856 q 165 877 135 864 q 224 911 196 890 l 296 911 l 296 369 l 207 369 m 226 -17 l 729 928 l 807 928 l 304 -17 l 226 -17 m 865 -17 q 713 56 769 -17 q 656 257 656 128 q 674 390 656 333 q 724 485 692 447 q 799 540 756 522 q 892 558 842 558 q 969 546 939 558 q 1024 517 1000 533 l 988 454 q 945 478 968 468 q 894 488 922 488 q 790 438 833 488 q 740 285 747 389 q 876 340 800 340 q 1002 292 958 340 q 1046 167 1046 244 q 1032 94 1046 128 q 994 36 1018 61 q 937 -3 969 11 q 865 -17 904 -17 m 864 54 q 935 85 908 54 q 963 165 963 117 q 936 244 963 214 q 858 275 910 275 q 800 262 828 275 q 740 215 772 249 q 781 94 747 135 q 864 54 814 54 z \"},\"⅚\":{\"ha\":1140,\"x_min\":49,\"x_max\":1068,\"o\":\"m 254 353 q 131 383 182 353 q 49 458 81 413 l 108 504 q 168 445 135 467 q 249 424 201 424 q 328 457 297 424 q 360 543 360 490 q 328 631 360 599 q 246 663 296 663 q 190 650 214 663 q 143 618 165 638 l 100 650 l 125 911 l 421 911 l 421 833 l 199 833 l 183 701 q 225 716 203 710 q 271 722 247 722 q 340 710 307 722 q 397 675 372 699 q 435 617 421 651 q 449 540 449 583 q 433 464 449 499 q 392 405 418 429 q 331 367 367 381 q 254 353 296 353 m 278 -17 l 781 928 l 858 928 l 356 -17 l 278 -17 m 888 -17 q 735 56 792 -17 q 678 257 678 128 q 696 390 678 333 q 746 485 714 447 q 821 540 778 522 q 914 558 864 558 q 992 546 961 558 q 1046 517 1022 533 l 1010 454 q 967 478 990 468 q 917 488 944 488 q 813 438 856 488 q 763 285 769 389 q 899 340 822 340 q 1024 292 981 340 q 1068 167 1068 244 q 1054 94 1068 128 q 1016 36 1040 61 q 959 -3 992 11 q 888 -17 926 -17 m 886 54 q 958 85 931 54 q 985 165 985 117 q 958 244 985 214 q 881 275 932 275 q 822 262 850 275 q 763 215 794 249 q 803 94 769 135 q 886 54 836 54 z \"},\"⅐\":{\"ha\":1117,\"x_min\":89,\"x_max\":1056,\"o\":\"m 207 369 l 207 797 l 89 797 l 89 856 q 165 877 135 864 q 224 911 196 890 l 296 911 l 296 369 l 207 369 m 213 -17 l 715 928 l 793 928 l 290 -17 l 213 -17 m 789 0 q 804 131 793 71 q 835 246 815 190 q 884 355 854 301 q 956 465 914 408 l 676 465 l 676 542 l 1056 542 l 1056 492 q 974 371 1006 429 q 924 253 943 313 q 895 133 904 194 q 882 0 886 71 l 789 0 z \"},\"⅛\":{\"ha\":1117,\"x_min\":89,\"x_max\":1051,\"o\":\"m 207 369 l 207 797 l 89 797 l 89 856 q 165 877 135 864 q 224 911 196 890 l 296 911 l 296 369 l 207 369 m 226 -17 l 729 928 l 807 928 l 304 -17 l 226 -17 m 860 -17 q 782 -5 817 -17 q 722 28 747 7 q 683 76 697 49 q 669 135 669 104 q 701 224 669 186 q 772 286 732 263 l 772 292 q 714 344 736 315 q 692 415 692 372 q 705 474 692 447 q 741 519 718 500 q 794 548 764 538 q 860 558 825 558 q 983 520 933 558 q 1033 415 1033 482 q 1026 372 1033 392 q 1006 336 1018 353 q 978 307 993 319 q 950 285 964 294 l 950 279 q 1024 222 997 256 q 1051 139 1051 188 q 1037 77 1051 106 q 997 28 1022 49 q 936 -5 971 7 q 860 -17 901 -17 m 892 310 q 936 359 922 333 q 950 413 950 385 q 924 469 950 449 q 860 490 897 490 q 799 469 824 490 q 774 414 774 447 q 808 349 774 372 q 892 310 843 325 m 860 49 q 936 76 904 49 q 968 142 968 103 q 956 183 968 167 q 925 213 944 200 q 881 235 906 225 q 828 256 856 244 q 753 143 753 211 q 782 78 753 107 q 860 49 811 49 z \"},\"⅜\":{\"ha\":1140,\"x_min\":49,\"x_max\":1074,\"o\":\"m 250 353 q 132 383 183 353 q 49 458 81 413 l 108 504 q 168 445 133 467 q 246 424 203 424 q 322 449 290 424 q 354 521 354 474 q 310 592 354 568 q 186 617 265 617 l 186 674 q 295 701 257 674 q 333 771 333 729 q 306 833 333 810 q 235 857 279 857 q 176 838 204 857 q 125 792 149 819 l 71 839 q 149 903 107 879 q 249 928 192 928 q 315 918 283 928 q 369 890 346 908 q 407 844 393 871 q 421 782 421 817 q 394 701 421 733 q 326 649 368 668 q 408 603 372 638 q 443 515 443 569 q 428 448 443 478 q 386 397 413 418 q 324 364 360 375 q 250 353 289 353 m 278 -17 l 781 928 l 858 928 l 356 -17 l 278 -17 m 882 -17 q 804 -5 839 -17 q 744 28 769 7 q 706 76 719 49 q 692 135 692 104 q 723 224 692 186 q 794 286 754 263 l 794 292 q 736 344 758 315 q 714 415 714 372 q 727 474 714 447 q 763 519 740 500 q 817 548 786 538 q 882 558 847 558 q 1006 520 956 558 q 1056 415 1056 482 q 1048 372 1056 392 q 1028 336 1040 353 q 1001 307 1015 319 q 972 285 986 294 l 972 279 q 1047 222 1019 256 q 1074 139 1074 188 q 1059 77 1074 106 q 1019 28 1044 49 q 958 -5 993 7 q 882 -17 924 -17 m 914 310 q 958 359 944 333 q 972 413 972 385 q 946 469 972 449 q 882 490 919 490 q 821 469 846 490 q 796 414 796 447 q 831 349 796 372 q 914 310 865 325 m 882 49 q 958 76 926 49 q 990 142 990 103 q 978 183 990 167 q 947 213 967 200 q 903 235 928 225 q 850 256 878 244 q 775 143 775 211 q 804 78 775 107 q 882 49 833 49 z \"},\"⅝\":{\"ha\":1140,\"x_min\":49,\"x_max\":1074,\"o\":\"m 254 353 q 131 383 182 353 q 49 458 81 413 l 108 504 q 168 445 135 467 q 249 424 201 424 q 328 457 297 424 q 360 543 360 490 q 328 631 360 599 q 246 663 296 663 q 190 650 214 663 q 143 618 165 638 l 100 650 l 125 911 l 421 911 l 421 833 l 199 833 l 183 701 q 225 716 203 710 q 271 722 247 722 q 340 710 307 722 q 397 675 372 699 q 435 617 421 651 q 449 540 449 583 q 433 464 449 499 q 392 405 418 429 q 331 367 367 381 q 254 353 296 353 m 278 -17 l 781 928 l 858 928 l 356 -17 l 278 -17 m 882 -17 q 804 -5 839 -17 q 744 28 769 7 q 706 76 719 49 q 692 135 692 104 q 723 224 692 186 q 794 286 754 263 l 794 292 q 736 344 758 315 q 714 415 714 372 q 727 474 714 447 q 763 519 740 500 q 817 548 786 538 q 882 558 847 558 q 1006 520 956 558 q 1056 415 1056 482 q 1048 372 1056 392 q 1028 336 1040 353 q 1001 307 1015 319 q 972 285 986 294 l 972 279 q 1047 222 1019 256 q 1074 139 1074 188 q 1059 77 1074 106 q 1019 28 1044 49 q 958 -5 993 7 q 882 -17 924 -17 m 914 310 q 958 359 944 333 q 972 413 972 385 q 946 469 972 449 q 882 490 919 490 q 821 469 846 490 q 796 414 796 447 q 831 349 796 372 q 914 310 865 325 m 882 49 q 958 76 926 49 q 990 142 990 103 q 978 183 990 167 q 947 213 967 200 q 903 235 928 225 q 850 256 878 244 q 775 143 775 211 q 804 78 775 107 q 882 49 833 49 z \"},\"⅞\":{\"ha\":1113,\"x_min\":43,\"x_max\":1046,\"o\":\"m 156 369 q 171 500 160 440 q 201 615 182 560 q 251 724 221 671 q 322 835 281 778 l 43 835 l 43 911 l 422 911 l 422 861 q 341 740 372 799 q 290 623 310 682 q 262 502 271 564 q 249 369 253 440 l 156 369 m 208 -17 l 711 928 l 789 928 l 286 -17 l 208 -17 m 854 -17 q 776 -5 811 -17 q 717 28 742 7 q 678 76 692 49 q 664 135 664 104 q 695 224 664 186 q 767 286 726 263 l 767 292 q 708 344 731 315 q 686 415 686 372 q 699 474 686 447 q 735 519 713 500 q 789 548 758 538 q 854 558 819 558 q 978 520 928 558 q 1028 415 1028 482 q 1020 372 1028 392 q 1000 336 1013 353 q 973 307 988 319 q 944 285 958 294 l 944 279 q 1019 222 992 256 q 1046 139 1046 188 q 1031 77 1046 106 q 991 28 1017 49 q 931 -5 965 7 q 854 -17 896 -17 m 886 310 q 931 359 917 333 q 944 413 944 385 q 918 469 944 449 q 854 490 892 490 q 793 469 818 490 q 768 414 768 447 q 803 349 768 372 q 886 310 838 325 m 854 49 q 931 76 899 49 q 963 142 963 103 q 951 183 963 167 q 919 213 939 200 q 875 235 900 225 q 822 256 850 244 q 747 143 747 211 q 776 78 747 107 q 854 49 806 49 z \"},\"⅑\":{\"ha\":1117,\"x_min\":89,\"x_max\":1060,\"o\":\"m 207 369 l 207 797 l 89 797 l 89 856 q 165 877 135 864 q 224 911 196 890 l 296 911 l 296 369 l 207 369 m 226 -17 l 729 928 l 807 928 l 304 -17 l 226 -17 m 856 267 q 915 280 888 267 q 975 326 943 293 q 935 447 968 407 q 850 488 901 488 q 779 456 807 488 q 751 376 751 425 q 778 297 751 328 q 856 267 806 267 m 824 -17 q 745 -4 776 -17 q 690 25 714 8 l 728 88 q 770 64 747 74 q 821 54 793 54 q 925 104 882 54 q 975 258 968 154 q 839 201 915 201 q 713 249 757 201 q 669 375 669 297 q 683 447 669 414 q 721 506 697 481 q 778 544 744 531 q 849 558 811 558 q 1003 486 946 558 q 1060 285 1060 414 q 1042 151 1060 208 q 992 57 1024 94 q 917 1 960 19 q 824 -17 874 -17 z \"},\"⅒\":{\"ha\":1517,\"x_min\":88,\"x_max\":1468,\"o\":\"m 228 -17 l 731 928 l 808 928 l 306 -17 l 228 -17 m 206 369 l 206 797 l 88 797 l 88 856 q 164 877 133 864 q 222 911 194 890 l 294 911 l 294 369 l 206 369 m 825 0 l 825 428 l 707 428 l 707 486 q 783 508 753 494 q 842 542 814 521 l 914 542 l 914 0 l 825 0 m 1261 -17 q 1110 58 1167 -17 q 1054 272 1054 133 q 1110 484 1054 410 q 1261 558 1167 558 q 1411 484 1354 558 q 1468 272 1468 410 q 1411 58 1468 133 q 1261 -17 1354 -17 m 1261 54 q 1347 109 1314 54 q 1381 272 1381 164 q 1347 434 1381 381 q 1261 488 1314 488 q 1174 434 1207 488 q 1140 272 1140 381 q 1174 109 1140 164 q 1261 54 1207 54 z \"},\"↉\":{\"ha\":1140,\"x_min\":49,\"x_max\":1072,\"o\":\"m 256 353 q 105 428 161 353 q 49 642 49 503 q 105 853 49 779 q 256 928 161 928 q 406 853 349 928 q 463 642 463 779 q 406 428 463 503 q 256 353 349 353 m 256 424 q 342 478 308 424 q 375 642 375 533 q 342 803 375 750 q 256 857 308 857 q 168 803 201 857 q 135 642 135 750 q 168 478 135 533 q 256 424 201 424 m 278 -17 l 781 928 l 858 928 l 356 -17 l 278 -17 m 879 -17 q 761 13 813 -17 q 678 89 710 43 l 738 135 q 797 76 763 97 q 875 54 832 54 q 951 79 919 54 q 983 151 983 104 q 939 223 983 199 q 815 247 894 247 l 815 304 q 924 332 886 304 q 963 401 963 360 q 935 464 963 440 q 864 488 908 488 q 806 469 833 488 q 754 422 778 450 l 700 469 q 778 534 736 510 q 878 558 821 558 q 944 549 913 558 q 999 520 975 539 q 1036 474 1022 501 q 1050 413 1050 447 q 1024 331 1050 364 q 956 279 997 299 q 1037 234 1001 268 q 1072 146 1072 200 q 1057 78 1072 108 q 1015 27 1042 49 q 953 -6 989 6 q 879 -17 918 -17 z \"},\"+\":{\"ha\":690,\"x_min\":47,\"x_max\":643,\"o\":\"m 300 144 l 300 415 l 47 415 l 47 501 l 300 501 l 300 772 l 390 772 l 390 501 l 643 501 l 643 415 l 390 415 l 390 144 l 300 144 z \"},\"−\":{\"ha\":690,\"x_min\":47,\"x_max\":643,\"o\":\"m 47 415 l 47 501 l 643 501 l 643 415 l 47 415 z \"},\"×\":{\"ha\":690,\"x_min\":69,\"x_max\":621,\"o\":\"m 131 175 l 69 238 l 285 458 l 69 678 l 131 740 l 346 519 l 560 740 l 621 678 l 406 458 l 621 238 l 560 175 l 346 397 l 131 175 z \"},\"÷\":{\"ha\":690,\"x_min\":47,\"x_max\":643,\"o\":\"m 47 415 l 47 501 l 643 501 l 643 415 l 47 415 m 346 133 q 292 154 314 133 q 269 208 269 175 q 292 261 269 240 q 346 282 314 282 q 399 261 378 282 q 421 208 421 240 q 399 154 421 175 q 346 133 378 133 m 346 633 q 292 654 314 633 q 269 708 269 675 q 292 761 269 740 q 346 782 314 782 q 399 761 378 782 q 421 708 421 740 q 399 654 421 675 q 346 633 378 633 z \"},\"∙\":{\"ha\":697,\"x_min\":261,\"x_max\":426,\"o\":\"m 344 365 q 285 390 310 365 q 261 451 261 414 q 285 516 261 492 q 344 540 310 540 q 402 516 378 540 q 426 451 426 492 q 402 390 426 414 q 344 365 378 365 z \"},\"=\":{\"ha\":690,\"x_min\":47,\"x_max\":643,\"o\":\"m 47 564 l 47 650 l 643 650 l 643 564 l 47 564 m 47 268 l 47 354 l 643 354 l 643 268 l 47 268 z \"},\"<\":{\"ha\":690,\"x_min\":47,\"x_max\":643,\"o\":\"m 643 182 l 47 415 l 47 507 l 643 740 l 643 642 l 350 533 l 164 464 l 164 458 l 350 389 l 643 281 l 643 182 z \"},\">\":{\"ha\":690,\"x_min\":47,\"x_max\":643,\"o\":\"m 47 182 l 47 281 l 340 389 l 526 458 l 526 464 l 340 533 l 47 642 l 47 740 l 643 507 l 643 415 l 47 182 z \"},\"≤\":{\"ha\":690,\"x_min\":47,\"x_max\":643,\"o\":\"m 643 213 l 47 425 l 47 528 l 643 740 l 643 642 l 351 540 l 164 479 l 164 474 l 351 413 l 643 311 l 643 213 m 47 0 l 47 86 l 643 86 l 643 0 l 47 0 z \"},\"≥\":{\"ha\":690,\"x_min\":47,\"x_max\":643,\"o\":\"m 47 213 l 47 311 l 339 413 l 526 474 l 526 479 l 339 540 l 47 642 l 47 740 l 643 528 l 643 425 l 47 213 m 47 0 l 47 86 l 643 86 l 643 0 l 47 0 z \"},\"±\":{\"ha\":690,\"x_min\":47,\"x_max\":643,\"o\":\"m 300 176 l 300 422 l 47 422 l 47 508 l 300 508 l 300 772 l 390 772 l 390 508 l 643 508 l 643 422 l 390 422 l 390 176 l 300 176 m 47 0 l 47 86 l 643 86 l 643 0 l 47 0 z \"},\"^\":{\"ha\":690,\"x_min\":83,\"x_max\":607,\"o\":\"m 83 394 l 294 931 l 396 931 l 607 394 l 507 394 l 417 639 l 349 824 l 343 824 l 274 639 l 183 394 l 83 394 z \"},\"≠\":{\"ha\":690,\"x_min\":47,\"x_max\":643,\"o\":\"m 85 90 l 190 267 l 47 267 l 47 353 l 240 353 l 367 564 l 47 564 l 47 650 l 417 650 l 522 826 l 606 826 l 500 650 l 643 650 l 643 564 l 450 564 l 324 353 l 643 353 l 643 267 l 274 267 l 168 90 l 85 90 z \"},\"~\":{\"ha\":690,\"x_min\":50,\"x_max\":640,\"o\":\"m 467 357 q 392 375 425 357 q 331 415 360 393 q 276 456 303 438 q 221 474 250 474 q 164 453 190 474 q 114 389 138 433 l 50 435 q 133 531 88 501 q 224 560 179 560 q 298 542 265 560 q 359 501 331 524 q 414 461 388 479 q 469 443 440 443 q 526 463 500 443 q 576 528 553 483 l 640 481 q 557 385 603 414 q 467 357 511 357 z \"},\"≈\":{\"ha\":690,\"x_min\":50,\"x_max\":640,\"o\":\"m 467 506 q 392 524 425 506 q 331 564 360 542 q 276 604 303 586 q 221 622 250 622 q 164 602 190 622 q 114 538 138 582 l 50 583 q 133 679 88 650 q 224 708 179 708 q 298 690 265 708 q 359 650 331 672 q 414 610 388 628 q 469 592 440 592 q 526 612 500 592 q 576 676 553 632 l 640 629 q 557 534 603 563 q 467 506 511 506 m 467 210 q 392 228 425 210 q 331 268 360 246 q 276 308 303 290 q 221 326 250 326 q 164 306 190 326 q 114 242 138 286 l 50 288 q 133 383 88 354 q 224 413 179 413 q 298 394 265 413 q 359 354 331 376 q 414 314 388 332 q 469 296 440 296 q 526 316 500 296 q 576 381 553 336 l 640 333 q 557 238 603 267 q 467 210 511 210 z \"},\"¬\":{\"ha\":690,\"x_min\":47,\"x_max\":643,\"o\":\"m 551 144 l 551 415 l 47 415 l 47 501 l 643 501 l 643 144 l 551 144 z \"},\"∞\":{\"ha\":1086,\"x_min\":56,\"x_max\":1031,\"o\":\"m 792 204 q 638 249 703 204 q 511 374 574 294 l 506 374 q 464 328 488 353 q 410 281 440 303 q 344 245 381 260 q 265 231 308 231 q 184 248 222 231 q 117 295 146 265 q 72 365 89 325 q 56 450 56 404 q 73 549 56 506 q 120 624 90 593 q 192 671 150 654 q 282 688 233 688 q 359 674 324 688 q 424 640 394 661 q 476 592 453 618 q 518 542 499 567 l 524 542 q 577 605 549 575 q 639 658 606 635 q 710 696 672 682 q 793 710 749 710 q 888 692 844 710 q 963 641 932 674 q 1013 564 994 608 q 1031 467 1031 519 q 1013 358 1031 407 q 963 276 994 310 q 887 223 931 242 q 792 204 843 204 m 276 318 q 381 356 335 318 q 463 446 426 393 q 372 542 418 506 q 274 578 326 578 q 181 545 217 578 q 144 454 144 513 q 183 357 144 396 q 276 318 221 318 m 793 313 q 856 324 828 313 q 902 357 883 336 q 931 405 921 378 q 940 463 940 432 q 899 577 940 533 q 782 621 857 621 q 669 583 722 621 q 565 472 617 544 q 676 353 624 394 q 793 313 728 313 z \"},\"µ\":{\"ha\":781,\"x_min\":114,\"x_max\":743,\"o\":\"m 114 -249 l 114 675 l 228 675 l 228 263 q 256 127 228 172 q 351 82 285 82 q 396 87 374 82 q 440 106 418 92 q 485 147 463 121 q 531 214 507 172 l 531 675 l 646 675 q 640 396 643 538 q 638 132 638 254 q 651 91 638 104 q 688 78 665 78 q 728 86 704 78 l 743 0 q 709 -12 728 -7 q 663 -17 690 -17 q 576 15 604 -17 q 540 114 547 46 l 538 114 q 453 17 501 49 q 350 -14 406 -14 q 276 -1 310 -14 q 219 51 243 11 q 220 -37 219 1 q 222 -108 221 -75 q 225 -175 224 -142 q 229 -249 226 -208 l 114 -249 z \"},\"∂\":{\"ha\":733,\"x_min\":56,\"x_max\":676,\"o\":\"m 308 -17 q 213 2 258 -17 q 132 55 167 21 q 76 138 97 89 q 56 250 56 188 q 76 376 56 318 q 136 474 97 433 q 231 538 175 515 q 357 561 286 561 q 469 535 414 561 q 564 463 524 508 q 565 485 565 474 q 565 510 565 497 q 551 658 565 597 q 513 758 538 719 q 451 815 488 797 q 371 833 415 833 q 215 764 282 833 l 163 835 q 262 903 207 879 q 382 928 317 928 q 597 826 517 928 q 676 513 676 725 q 650 296 676 393 q 575 129 624 199 q 458 22 526 60 q 308 -17 390 -17 m 319 78 q 472 153 410 78 q 554 365 533 228 q 460 447 508 424 q 367 471 413 471 q 214 410 264 471 q 164 257 164 349 q 176 183 164 215 q 210 126 189 150 q 260 90 232 103 q 319 78 288 78 z \"},\"∫\":{\"ha\":461,\"x_min\":72,\"x_max\":426,\"o\":\"m 139 -219 q 72 -210 94 -219 l 86 -124 q 133 -129 101 -129 q 210 -72 193 -129 q 226 93 226 -15 q 217 257 226 169 q 197 435 208 344 q 177 613 186 525 q 168 779 168 701 q 176 904 168 846 q 205 1005 183 963 q 264 1072 226 1047 q 361 1096 301 1096 q 400 1093 382 1096 q 426 1088 418 1090 l 413 1001 q 391 1006 403 1004 q 364 1007 379 1007 q 290 948 307 1007 q 274 782 274 889 q 283 619 274 707 q 302 442 292 532 q 322 263 313 351 q 331 99 331 175 q 323 -28 331 31 q 294 -128 315 -86 q 236 -195 274 -171 q 139 -219 199 -219 z \"},\"√\":{\"ha\":774,\"x_min\":57,\"x_max\":779,\"o\":\"m 390 -132 l 182 463 l 83 418 l 57 481 l 242 563 l 403 82 q 415 38 410 60 q 426 -7 421 15 l 432 -7 q 440 38 436 15 q 449 82 444 60 l 696 1139 l 779 1139 l 478 -132 l 390 -132 z \"},\"∆\":{\"ha\":817,\"x_min\":42,\"x_max\":775,\"o\":\"m 42 0 l 42 69 l 342 911 l 475 911 l 775 69 l 775 0 l 42 0 m 167 99 l 647 99 l 506 515 l 410 807 l 404 807 l 308 515 l 167 99 z \"},\"Ω\":{\"ha\":942,\"x_min\":63,\"x_max\":879,\"o\":\"m 63 0 l 63 94 l 244 94 l 244 100 q 186 167 215 129 q 134 254 157 206 q 97 360 111 303 q 82 488 82 418 q 110 664 82 583 q 188 803 138 744 q 310 895 239 863 q 471 928 382 928 q 631 895 560 928 q 754 803 703 863 q 833 664 806 744 q 861 488 861 583 q 847 360 861 418 q 809 254 832 303 q 756 167 786 206 q 697 100 726 129 l 697 94 l 879 94 l 879 0 l 556 0 l 556 85 q 628 154 594 115 q 688 242 663 193 q 727 349 713 290 q 742 481 742 408 q 723 617 742 554 q 669 727 704 681 q 585 800 635 774 q 471 826 535 826 q 357 800 407 826 q 272 727 307 774 q 219 617 238 681 q 201 481 201 554 q 215 349 201 408 q 254 242 229 290 q 313 154 279 193 q 386 85 347 115 l 386 0 l 63 0 z \"},\"∑\":{\"ha\":700,\"x_min\":31,\"x_max\":696,\"o\":\"m 31 -167 l 31 -93 l 361 360 l 46 813 l 46 886 l 657 886 l 657 788 l 189 788 l 189 782 l 483 361 l 175 -62 l 175 -68 l 696 -68 l 696 -167 l 31 -167 z \"},\"∏\":{\"ha\":935,\"x_min\":124,\"x_max\":813,\"o\":\"m 124 -167 l 124 886 l 813 886 l 813 -167 l 694 -167 l 694 785 l 239 785 l 239 -167 l 124 -167 z \"},\"ℓ\":{\"ha\":568,\"x_min\":29,\"x_max\":558,\"o\":\"m 369 -17 q 219 43 282 -17 q 149 221 156 103 q 113 196 131 208 q 75 171 94 183 l 29 243 q 91 285 61 264 q 149 328 121 306 l 149 704 q 164 842 149 785 q 206 935 179 899 q 271 989 233 972 q 351 1006 308 1006 q 482 951 431 1006 q 533 793 533 897 q 461 538 533 660 q 261 307 389 417 l 261 258 q 297 121 261 161 q 385 81 333 81 q 458 99 428 81 q 513 142 488 118 l 558 71 q 476 11 522 39 q 369 -17 431 -17 m 261 725 l 261 429 q 389 603 343 513 q 435 790 435 693 q 412 890 435 861 q 354 918 389 918 q 289 872 317 918 q 261 725 261 826 z \"},\"℮\":{\"ha\":1111,\"x_min\":64,\"x_max\":1047,\"o\":\"m 556 -17 q 363 20 453 -17 q 207 120 274 57 q 102 268 140 183 q 64 450 64 353 q 102 632 64 547 q 207 780 140 717 q 363 880 274 843 q 556 917 453 917 q 747 880 657 917 q 903 780 836 843 q 1008 632 969 717 q 1047 450 1047 547 l 1047 439 l 250 439 q 244 433 244 439 l 244 178 q 248 163 244 169 q 256 150 251 157 q 390 48 313 85 q 558 11 468 11 q 735 53 653 11 q 875 167 817 96 l 947 167 q 776 33 878 83 q 556 -17 675 -17 m 250 464 l 861 464 q 869 472 869 464 l 869 728 q 856 758 869 744 q 721 854 797 819 q 558 889 644 889 q 391 852 468 889 q 256 753 314 815 q 248 738 251 746 q 244 722 244 731 l 244 472 q 250 464 244 464 z \"},\"←\":{\"ha\":860,\"x_min\":36,\"x_max\":804,\"o\":\"m 415 -21 l 36 347 l 36 353 l 415 721 l 474 657 l 194 397 l 804 397 l 804 303 l 194 303 l 474 43 l 415 -21 z \"},\"↑\":{\"ha\":860,\"x_min\":58,\"x_max\":801,\"o\":\"m 382 -35 l 382 575 l 122 296 l 58 354 l 426 732 l 432 732 l 801 354 l 736 296 l 476 575 l 476 -35 l 382 -35 z \"},\"→\":{\"ha\":860,\"x_min\":54,\"x_max\":821,\"o\":\"m 443 -21 l 383 43 l 663 303 l 54 303 l 54 397 l 663 397 l 383 657 l 443 721 l 821 353 l 821 347 l 443 -21 z \"},\"↓\":{\"ha\":860,\"x_min\":58,\"x_max\":801,\"o\":\"m 426 -35 l 58 344 l 122 403 l 382 124 l 382 732 l 476 732 l 476 124 l 736 403 l 801 344 l 432 -35 l 426 -35 z \"},\"■\":{\"ha\":1243,\"x_min\":63,\"x_max\":1181,\"o\":\"m 63 -83 l 63 1035 l 1181 1035 l 1181 -83 l 63 -83 z \"},\"◆\":{\"ha\":1243,\"x_min\":35,\"x_max\":1208,\"o\":\"m 622 -111 l 35 476 l 622 1063 l 1208 476 l 622 -111 z \"},\"◉\":{\"ha\":1243,\"x_min\":46,\"x_max\":1197,\"o\":\"m 622 -104 q 401 -65 506 -104 q 217 50 296 -25 q 92 233 138 125 q 46 476 46 340 q 92 717 46 610 q 217 899 138 824 q 401 1015 296 974 q 622 1056 506 1056 q 843 1015 739 1056 q 1026 899 947 974 q 1151 717 1106 824 q 1197 476 1197 610 q 1151 233 1197 340 q 1026 50 1106 125 q 843 -65 947 -25 q 622 -104 739 -104 m 622 -26 q 807 7 718 -26 q 963 105 896 40 q 1071 263 1031 169 q 1111 476 1111 357 q 1071 689 1111 596 q 963 847 1031 782 q 807 945 896 911 q 622 979 718 979 q 438 945 526 979 q 282 847 350 911 q 174 689 214 782 q 133 476 133 596 q 174 263 133 357 q 282 105 214 169 q 438 7 350 40 q 622 -26 526 -26 m 622 108 q 485 135 550 108 q 372 209 421 161 q 293 325 322 257 q 264 476 264 393 q 293 626 264 558 q 372 742 322 694 q 485 817 421 790 q 622 843 550 843 q 758 817 693 843 q 872 742 824 790 q 950 626 921 694 q 979 476 979 558 q 950 324 979 392 q 872 208 921 256 q 758 134 824 160 q 622 108 693 108 z \"},\"❒\":{\"ha\":1243,\"x_min\":63,\"x_max\":1181,\"o\":\"m 63 -83 l 63 957 l 154 1035 l 1181 1035 l 1181 8 l 1103 -83 l 63 -83 m 125 -22 l 1072 -22 l 1072 926 l 125 926 l 125 -22 z \"},\"▲\":{\"ha\":1243,\"x_min\":71,\"x_max\":1172,\"o\":\"m 71 -83 l 71 -81 l 619 1063 l 625 1063 l 1172 -81 l 1172 -83 l 71 -83 z \"},\"△\":{\"ha\":1243,\"x_min\":71,\"x_max\":1172,\"o\":\"m 71 -83 l 71 -81 l 619 1063 l 625 1063 l 1172 -81 l 1172 -83 l 71 -83 m 206 -3 l 1038 -3 l 622 885 l 206 -3 z \"},\"▶\":{\"ha\":1243,\"x_min\":63,\"x_max\":1208,\"o\":\"m 63 -75 l 63 1026 l 65 1026 l 1208 479 l 1208 474 l 65 -75 l 63 -75 z \"},\"▷\":{\"ha\":1243,\"x_min\":63,\"x_max\":1208,\"o\":\"m 63 -75 l 63 1026 l 65 1026 l 1208 479 l 1208 474 l 65 -75 l 63 -75 m 144 60 l 1033 476 l 144 892 l 144 60 z \"},\"▼\":{\"ha\":1243,\"x_min\":71,\"x_max\":1172,\"o\":\"m 1172 1035 l 1172 1032 l 625 -111 l 619 -111 l 71 1032 l 71 1035 l 1172 1035 z \"},\"▽\":{\"ha\":1243,\"x_min\":71,\"x_max\":1172,\"o\":\"m 1172 1035 l 1172 1032 l 625 -111 l 619 -111 l 71 1032 l 71 1035 l 1172 1035 m 1038 954 l 206 954 l 622 67 l 1038 954 z \"},\"◀\":{\"ha\":1243,\"x_min\":35,\"x_max\":1181,\"o\":\"m 1181 1026 l 1181 -75 l 1178 -75 l 35 474 l 35 479 l 1178 1026 l 1181 1026 z \"},\"◁\":{\"ha\":1243,\"x_min\":35,\"x_max\":1181,\"o\":\"m 1181 1026 l 1181 -75 l 1178 -75 l 35 474 l 35 479 l 1178 1026 l 1181 1026 m 1099 892 l 210 476 l 1099 60 l 1099 892 z \"},\"☐\":{\"ha\":1110,\"x_min\":103,\"x_max\":1007,\"o\":\"m 103 -14 l 103 861 l 188 932 l 1007 932 l 1007 71 l 933 -14 l 103 -14 m 163 46 l 903 46 l 903 829 l 163 829 l 163 46 z \"},\"☑\":{\"ha\":1110,\"x_min\":103,\"x_max\":1118,\"o\":\"m 485 144 q 399 346 447 251 q 290 529 350 440 l 368 582 q 462 414 419 501 q 532 239 504 326 l 538 239 q 655 543 582 392 q 819 829 728 694 l 163 829 l 163 46 l 903 46 l 903 786 q 731 497 808 654 q 604 158 654 339 l 485 144 m 103 -14 l 103 861 l 188 932 l 893 932 q 967 1023 929 981 q 1044 1104 1006 1065 l 1118 1035 q 1007 919 1061 982 l 1007 71 l 933 -14 l 103 -14 z \"},\"✓\":{\"ha\":850,\"x_min\":0,\"x_max\":856,\"o\":\"m 210 -28 q 117 187 168 88 q 0 382 67 286 l 78 435 q 183 253 136 347 q 261 67 229 160 l 267 67 q 358 314 304 190 q 479 552 413 438 q 622 768 546 667 q 781 950 699 869 l 856 881 q 696 708 774 804 q 550 497 618 611 q 425 255 482 383 q 329 -14 368 126 l 210 -28 z \"},\"♪\":{\"ha\":699,\"x_min\":40,\"x_max\":668,\"o\":\"m 181 -33 q 82 -7 124 -33 q 40 72 40 19 q 56 133 40 104 q 101 185 72 163 q 171 222 131 208 q 260 235 211 235 q 310 230 288 235 q 343 218 333 225 l 343 964 l 413 964 q 424 940 418 950 q 440 919 429 929 q 467 895 450 908 q 510 864 483 882 q 588 799 557 831 q 636 734 618 767 q 661 666 654 701 q 668 592 668 631 q 653 490 668 538 q 624 410 639 442 l 575 428 q 590 490 586 461 q 593 556 593 518 q 548 680 593 622 q 419 764 503 738 l 419 199 q 400 98 419 142 q 348 25 381 54 q 272 -19 315 -4 q 181 -33 228 -33 z \"},\"◊\":{\"ha\":718,\"x_min\":78,\"x_max\":640,\"o\":\"m 307 -14 l 78 458 l 307 931 l 411 931 l 640 458 l 411 -14 l 307 -14 m 357 82 l 363 82 l 449 267 l 539 458 l 449 649 l 363 835 l 357 835 l 269 649 l 179 458 l 269 267 l 357 82 z \"},\"′\":{\"ha\":346,\"x_min\":114,\"x_max\":257,\"o\":\"m 114 625 l 144 958 l 257 957 l 236 831 l 189 624 l 114 625 z \"},\"″\":{\"ha\":592,\"x_min\":114,\"x_max\":503,\"o\":\"m 114 625 l 144 958 l 257 957 l 236 831 l 189 624 l 114 625 m 360 625 l 390 958 l 503 957 l 482 831 l 435 624 l 360 625 z \"},\"‵\":{\"ha\":346,\"x_min\":89,\"x_max\":232,\"o\":\"m 232 625 l 157 624 l 110 831 l 89 957 l 201 958 l 232 625 z \"},\"ʹ\":{\"ha\":346,\"x_min\":114,\"x_max\":257,\"o\":\"m 114 625 l 144 958 l 257 957 l 236 831 l 189 624 l 114 625 z \"},\"ʻ\":{\"ha\":346,\"x_min\":79,\"x_max\":260,\"o\":\"m 167 594 q 102 626 125 594 q 79 719 79 658 q 117 864 79 803 q 226 967 154 925 l 260 913 q 181 838 207 878 q 154 740 154 799 q 167 742 158 742 q 217 724 194 742 q 240 671 240 706 q 219 615 240 635 q 167 594 199 594 z \"},\"ʼ\":{\"ha\":346,\"x_min\":88,\"x_max\":268,\"o\":\"m 119 599 l 88 651 q 166 726 140 686 q 192 825 192 765 q 181 824 188 824 q 129 842 151 824 q 107 893 107 860 q 128 950 107 929 q 181 971 149 971 q 244 938 221 971 q 268 844 268 906 q 230 701 268 761 q 119 599 192 640 z \"},\"ʾ\":{\"ha\":231,\"x_min\":42,\"x_max\":210,\"o\":\"m 42 763 l 42 811 q 120 835 97 811 q 143 897 143 858 q 120 960 143 936 q 42 983 97 983 l 42 1032 q 167 998 125 1035 q 210 897 210 961 q 167 797 210 833 q 42 763 125 760 z \"},\"ʿ\":{\"ha\":231,\"x_min\":21,\"x_max\":189,\"o\":\"m 189 763 q 63 797 106 760 q 21 897 21 833 q 63 998 21 961 q 189 1032 106 1035 l 189 983 q 110 960 133 983 q 88 897 88 936 q 110 835 88 858 q 189 811 133 811 l 189 763 z \"},\"`\":{\"ha\":753,\"x_min\":178,\"x_max\":454,\"o\":\"m 396 796 l 178 1008 l 258 1085 l 454 853 l 396 796 z \"},\"´\":{\"ha\":753,\"x_min\":299,\"x_max\":575,\"o\":\"m 357 796 l 299 853 l 494 1085 l 575 1008 l 357 796 z \"},\"ˆ\":{\"ha\":753,\"x_min\":161,\"x_max\":592,\"o\":\"m 161 833 l 319 1028 l 433 1028 l 592 833 l 543 789 l 379 946 l 374 946 l 210 789 l 161 833 z \"},\"ˇ\":{\"ha\":753,\"x_min\":161,\"x_max\":592,\"o\":\"m 319 797 l 161 992 l 210 1036 l 374 879 l 379 879 l 543 1036 l 592 992 l 433 797 l 319 797 z \"},\"ˈ\":{\"ha\":158,\"x_min\":31,\"x_max\":128,\"o\":\"m 39 740 l 31 1013 l 128 1013 l 119 740 l 39 740 z \"},\"ˉ\":{\"ha\":385,\"x_min\":8,\"x_max\":378,\"o\":\"m 8 835 l 8 914 l 378 914 l 378 835 l 8 835 z \"},\"ˊ\":{\"ha\":313,\"x_min\":76,\"x_max\":353,\"o\":\"m 135 796 l 76 853 l 272 1085 l 353 1008 l 135 796 z \"},\"ˋ\":{\"ha\":313,\"x_min\":-44,\"x_max\":232,\"o\":\"m 174 796 l -44 1008 l 36 1085 l 232 853 l 174 796 z \"},\"ˌ\":{\"ha\":158,\"x_min\":31,\"x_max\":128,\"o\":\"m 31 -369 l 39 -99 l 119 -99 l 128 -369 l 31 -369 z \"},\"˜\":{\"ha\":753,\"x_min\":136,\"x_max\":617,\"o\":\"m 476 801 q 413 819 439 801 q 364 860 386 838 q 322 900 342 882 q 278 918 301 918 q 231 888 246 918 q 213 808 215 857 l 136 813 q 147 888 138 853 q 172 947 156 922 q 215 987 189 972 q 276 1001 240 1001 q 340 983 314 1001 q 389 943 367 965 q 431 903 411 921 q 476 885 451 885 q 522 915 507 885 q 540 994 538 946 l 617 989 q 606 915 615 949 q 581 856 597 881 q 538 816 564 831 q 476 801 513 801 z \"},\"¨\":{\"ha\":753,\"x_min\":174,\"x_max\":579,\"o\":\"m 243 815 q 193 835 213 815 q 174 885 174 856 q 193 934 174 914 q 243 954 213 954 q 292 934 272 954 q 311 885 311 914 q 292 835 311 856 q 243 815 272 815 m 510 815 q 461 835 481 815 q 442 885 442 856 q 461 934 442 914 q 510 954 481 954 q 560 934 540 954 q 579 885 579 914 q 560 835 579 856 q 510 815 540 815 z \"},\"¯\":{\"ha\":753,\"x_min\":192,\"x_max\":561,\"o\":\"m 192 835 l 192 914 l 561 914 l 561 835 l 192 835 z \"},\"˘\":{\"ha\":753,\"x_min\":160,\"x_max\":593,\"o\":\"m 376 793 q 281 811 321 793 q 215 859 240 829 q 176 926 189 889 q 160 1003 163 964 l 231 1014 q 245 962 235 988 q 274 915 256 936 q 317 882 292 894 q 376 869 343 869 q 435 882 410 869 q 479 915 461 894 q 508 962 497 936 q 522 1014 518 988 l 593 1003 q 577 926 590 964 q 538 859 564 889 q 472 811 511 829 q 376 793 432 793 z \"},\"˚\":{\"ha\":753,\"x_min\":224,\"x_max\":529,\"o\":\"m 376 769 q 265 808 306 769 q 224 907 224 847 q 265 1004 224 965 q 376 1043 306 1043 q 488 1004 447 1043 q 529 907 529 965 q 488 808 529 847 q 376 769 447 769 m 376 821 q 433 844 410 821 q 456 907 456 867 q 433 969 456 946 q 376 992 410 992 q 320 969 343 992 q 297 907 297 946 q 320 844 297 867 q 376 821 343 821 z \"},\"˝\":{\"ha\":753,\"x_min\":243,\"x_max\":653,\"o\":\"m 306 789 l 243 818 l 363 1057 l 444 1018 l 306 789 m 515 789 l 451 818 l 572 1057 l 653 1018 l 515 789 z \"},\"˙\":{\"ha\":753,\"x_min\":301,\"x_max\":451,\"o\":\"m 376 814 q 323 835 344 814 q 301 889 301 856 q 323 942 301 921 q 376 964 344 964 q 430 942 408 964 q 451 889 451 921 q 430 835 451 856 q 376 814 408 814 z \"},\"¸\":{\"ha\":753,\"x_min\":253,\"x_max\":493,\"o\":\"m 264 -314 l 253 -258 q 372 -235 340 -251 q 404 -189 404 -219 q 381 -146 404 -161 q 297 -122 357 -131 l 358 4 l 432 4 l 392 -89 q 467 -122 440 -100 q 493 -187 493 -144 q 434 -278 493 -249 q 264 -314 375 -308 z \"},\"˛\":{\"ha\":753,\"x_min\":285,\"x_max\":519,\"o\":\"m 410 -286 q 321 -256 357 -286 q 285 -168 285 -226 q 317 -67 285 -111 q 383 4 349 -22 l 464 4 q 394 -67 419 -29 q 369 -146 369 -106 q 389 -194 369 -178 q 433 -210 408 -210 q 489 -192 464 -210 l 519 -249 q 468 -275 500 -264 q 410 -286 436 -286 z \"},\"◌\":{\"ha\":813,\"x_min\":64,\"x_max\":750,\"o\":\"m 150 135 q 117 148 131 135 q 103 185 103 161 q 117 224 103 210 q 150 238 131 238 q 186 224 172 238 q 200 185 200 210 q 187 148 200 161 q 150 135 174 135 m 111 286 q 78 300 92 286 q 64 338 64 314 q 78 375 64 363 q 111 388 92 388 q 148 375 133 388 q 163 338 163 363 q 149 300 163 314 q 111 286 135 286 m 150 439 q 117 453 131 439 q 103 492 103 467 q 117 529 103 517 q 150 542 131 542 q 186 529 172 542 q 200 492 200 517 q 187 453 200 467 q 150 439 174 439 m 258 21 q 225 34 239 21 q 211 74 211 47 q 225 110 211 97 q 258 122 239 122 q 294 110 279 122 q 308 74 308 97 q 294 34 308 47 q 258 21 281 21 m 258 553 q 225 566 239 553 q 211 603 211 579 q 225 642 211 629 q 258 654 239 654 q 294 642 279 654 q 308 603 308 629 q 294 566 308 579 q 258 553 281 553 m 406 -17 q 372 -3 386 -17 q 358 35 358 10 q 372 72 358 58 q 406 85 386 85 q 442 72 428 85 q 456 35 456 58 q 442 -3 456 10 q 406 -17 428 -17 m 406 589 q 372 603 386 589 q 358 642 358 617 q 372 678 358 665 q 406 692 386 692 q 442 678 428 692 q 456 642 456 665 q 442 603 456 617 q 406 589 428 589 m 553 21 q 519 34 533 21 q 506 74 506 47 q 519 110 506 97 q 553 122 533 122 q 588 110 574 122 q 603 74 603 97 q 590 34 603 47 q 553 21 576 21 m 553 551 q 519 565 533 551 q 506 603 506 579 q 519 641 506 628 q 553 654 533 654 q 588 641 574 654 q 603 603 603 628 q 590 565 603 579 q 553 551 576 551 m 663 135 q 628 148 643 135 q 614 185 614 161 q 628 224 614 210 q 663 238 643 238 q 697 224 683 238 q 711 185 711 210 q 699 148 711 161 q 663 135 686 135 m 700 286 q 665 300 679 286 q 651 338 651 314 q 665 375 651 363 q 700 388 679 388 q 735 375 719 388 q 750 338 750 363 q 736 300 750 314 q 700 286 722 286 m 663 439 q 628 452 643 439 q 614 490 614 465 q 628 527 614 514 q 663 540 643 540 q 697 527 683 540 q 711 490 711 514 q 663 439 711 439 z \"},\"̀\":{\"ha\":0,\"x_min\":-199,\"x_max\":78,\"o\":\"m 19 796 l -199 1008 l -118 1085 l 78 853 l 19 796 z \"},\"́\":{\"ha\":0,\"x_min\":-78,\"x_max\":199,\"o\":\"m -19 796 l -78 853 l 118 1085 l 199 1008 l -19 796 z \"},\"̂\":{\"ha\":0,\"x_min\":-215,\"x_max\":215,\"o\":\"m -215 833 l -57 1028 l 57 1028 l 215 833 l 167 789 l 3 946 l -3 946 l -167 789 l -215 833 z \"},\"̃\":{\"ha\":0,\"x_min\":-240,\"x_max\":240,\"o\":\"m 100 801 q 36 819 63 801 q -12 860 10 838 q -55 900 -35 882 q -99 918 -75 918 q -146 888 -131 918 q -164 808 -161 857 l -240 813 q -230 888 -239 853 q -204 947 -221 922 q -162 987 -187 972 q -100 1001 -136 1001 q -36 983 -62 1001 q 13 943 -10 965 q 55 903 35 921 q 100 885 75 885 q 146 915 131 885 q 164 994 161 946 l 240 989 q 230 915 239 949 q 204 856 221 881 q 162 816 188 831 q 100 801 136 801 z \"},\"̄\":{\"ha\":0,\"x_min\":-185,\"x_max\":185,\"o\":\"m -185 835 l -185 914 l 185 914 l 185 835 l -185 835 z \"},\"̅\":{\"ha\":0,\"x_min\":-185,\"x_max\":185,\"o\":\"m -185 835 l -185 914 l 185 914 l 185 835 l -185 835 z \"},\"̆\":{\"ha\":0,\"x_min\":-217,\"x_max\":217,\"o\":\"m 0 793 q -96 811 -56 793 q -162 859 -136 829 q -201 926 -187 889 q -217 1003 -214 964 l -146 1014 q -131 962 -142 988 q -103 915 -121 936 q -59 882 -85 894 q 0 869 -33 869 q 59 882 33 869 q 103 915 85 894 q 131 962 121 936 q 146 1014 142 988 l 217 1003 q 201 926 214 964 q 161 859 188 889 q 95 811 135 829 q 0 793 56 793 z \"},\"̇\":{\"ha\":0,\"x_min\":-75,\"x_max\":75,\"o\":\"m 0 814 q -53 835 -32 814 q -75 889 -75 856 q -53 942 -75 921 q 0 964 -32 964 q 53 942 32 964 q 75 889 75 921 q 53 835 75 856 q 0 814 32 814 z \"},\"̈\":{\"ha\":0,\"x_min\":-203,\"x_max\":203,\"o\":\"m -133 815 q -183 835 -164 815 q -203 885 -203 856 q -183 934 -203 914 q -133 954 -164 954 q -85 934 -104 954 q -65 885 -65 914 q -85 835 -65 856 q -133 815 -104 815 m 133 815 q 85 835 104 815 q 65 885 65 856 q 85 934 65 914 q 133 954 104 954 q 183 934 164 954 q 203 885 203 914 q 183 835 203 856 q 133 815 164 815 z \"},\"̉\":{\"ha\":0,\"x_min\":-94,\"x_max\":111,\"o\":\"m -44 794 l -57 850 q -1 873 -24 858 q 21 915 21 888 q -94 981 21 975 l -87 1056 q 60 1020 8 1053 q 111 925 111 988 q 98 873 111 894 q 63 835 85 851 q 14 810 42 819 q -44 794 -14 800 z \"},\"̊\":{\"ha\":0,\"x_min\":-153,\"x_max\":153,\"o\":\"m 0 769 q -112 808 -71 769 q -153 907 -153 847 q -112 1004 -153 965 q 0 1043 -71 1043 q 112 1004 71 1043 q 153 907 153 965 q 112 808 153 847 q 0 769 71 769 m 0 821 q 56 844 33 821 q 79 907 79 867 q 56 969 79 946 q 0 992 33 992 q -56 969 -33 992 q -79 907 -79 946 q -56 844 -79 867 q 0 821 -33 821 z \"},\"̋\":{\"ha\":0,\"x_min\":-133,\"x_max\":276,\"o\":\"m -71 789 l -133 818 l -14 1057 l 68 1018 l -71 789 m 139 789 l 75 818 l 196 1057 l 276 1018 l 139 789 z \"},\"̌\":{\"ha\":0,\"x_min\":-215,\"x_max\":215,\"o\":\"m -57 797 l -215 992 l -167 1036 l -3 879 l 3 879 l 167 1036 l 215 992 l 57 797 l -57 797 z \"},\"̏\":{\"ha\":0,\"x_min\":-276,\"x_max\":133,\"o\":\"m -139 789 l -276 1018 l -196 1057 l -75 818 l -139 789 m 71 789 l -68 1018 l 14 1057 l 133 818 l 71 789 z \"},\"̑\":{\"ha\":0,\"x_min\":-217,\"x_max\":217,\"o\":\"m -146 789 l -217 800 q -201 876 -214 839 q -162 944 -187 914 q -96 992 -136 974 q 0 1010 -56 1010 q 95 992 56 1010 q 161 944 135 974 q 201 876 188 914 q 217 800 214 839 l 146 789 q 131 841 142 815 q 103 888 121 867 q 59 921 85 908 q 0 933 33 933 q -59 921 -33 933 q -103 888 -85 908 q -131 841 -121 867 q -146 789 -142 815 z \"},\"̒\":{\"ha\":0,\"x_min\":-74,\"x_max\":64,\"o\":\"m -3 783 q -74 879 -74 783 q -47 971 -74 928 q 39 1042 -21 1014 l 64 997 q 6 954 24 978 q -15 899 -12 931 q -4 900 -11 900 q 35 886 17 900 q 53 844 53 872 q 37 799 53 814 q -3 783 21 783 z \"},\"̓\":{\"ha\":0,\"x_min\":-65,\"x_max\":71,\"o\":\"m -42 781 l -65 825 q 14 925 10 864 q 1 924 10 924 q -37 937 -19 924 q -56 978 -56 950 q -39 1025 -56 1010 q 1 1040 -22 1040 q 71 944 71 1040 q 44 852 71 896 q -42 781 18 808 z \"},\"̘\":{\"ha\":0,\"x_min\":-106,\"x_max\":118,\"o\":\"m 118 -346 l 49 -346 l 49 -246 l -106 -246 l -106 -181 l 49 -181 l 49 -81 l 118 -81 l 118 -346 z \"},\"̙\":{\"ha\":0,\"x_min\":-118,\"x_max\":106,\"o\":\"m 106 -246 l -49 -246 l -49 -346 l -118 -346 l -118 -81 l -49 -81 l -49 -181 l 106 -181 l 106 -246 z \"},\"̚\":{\"ha\":0,\"x_min\":-106,\"x_max\":118,\"o\":\"m 118 796 l 49 796 l 49 926 l -106 926 l -106 992 l 118 992 l 118 796 z \"},\"̛\":{\"ha\":0,\"x_min\":-12,\"x_max\":206,\"o\":\"m -1 603 l -12 660 q 104 774 104 678 q 99 814 104 796 q 85 851 93 832 l 174 893 q 197 842 188 868 q 206 782 206 815 q 190 709 206 740 q 146 656 174 678 q 80 622 118 635 q -1 603 42 608 z \"},\"̜\":{\"ha\":0,\"x_min\":-92,\"x_max\":76,\"o\":\"m 76 -358 q -49 -324 -7 -361 q -92 -224 -92 -287 q -49 -123 -92 -160 q 76 -89 -7 -86 l 76 -137 q -2 -161 21 -137 q -25 -224 -25 -185 q -2 -286 -25 -262 q 76 -310 21 -310 l 76 -358 z \"},\"̝\":{\"ha\":0,\"x_min\":-133,\"x_max\":133,\"o\":\"m 133 -293 l -133 -293 l -133 -228 l -35 -228 l -35 -81 l 35 -81 l 35 -228 l 133 -228 l 133 -293 z \"},\"̞\":{\"ha\":0,\"x_min\":-133,\"x_max\":133,\"o\":\"m 133 -199 l 35 -199 l 35 -346 l -35 -346 l -35 -199 l -133 -199 l -133 -133 l 133 -133 l 133 -199 z \"},\"̟\":{\"ha\":0,\"x_min\":-133,\"x_max\":133,\"o\":\"m 133 -246 l 35 -246 l 35 -346 l -35 -346 l -35 -246 l -133 -246 l -133 -181 l -35 -181 l -35 -81 l 35 -81 l 35 -181 l 133 -181 l 133 -246 z \"},\"̠\":{\"ha\":0,\"x_min\":-133,\"x_max\":133,\"o\":\"m -133 -246 l -133 -181 l 133 -181 l 133 -246 l -133 -246 z \"},\"̣\":{\"ha\":0,\"x_min\":-75,\"x_max\":75,\"o\":\"m 0 -285 q -53 -264 -32 -285 q -75 -210 -75 -243 q -53 -156 -75 -178 q 0 -135 -32 -135 q 53 -156 32 -135 q 75 -210 75 -178 q 53 -264 75 -243 q 0 -285 32 -285 z \"},\"̤\":{\"ha\":0,\"x_min\":-203,\"x_max\":203,\"o\":\"m -133 -279 q -183 -259 -164 -279 q -203 -210 -203 -239 q -183 -160 -203 -181 q -133 -140 -164 -140 q -85 -160 -104 -140 q -65 -210 -65 -181 q -85 -259 -65 -239 q -133 -279 -104 -279 m 133 -279 q 85 -259 104 -279 q 65 -210 65 -239 q 85 -160 65 -181 q 133 -140 104 -140 q 183 -160 164 -140 q 203 -210 203 -181 q 183 -259 203 -239 q 133 -279 164 -279 z \"},\"̥\":{\"ha\":0,\"x_min\":-153,\"x_max\":153,\"o\":\"m 0 -350 q -112 -311 -71 -350 q -153 -212 -153 -272 q -112 -115 -153 -154 q 0 -76 -71 -76 q 112 -115 71 -76 q 153 -212 153 -154 q 112 -311 153 -272 q 0 -350 71 -350 m 0 -299 q 56 -276 33 -299 q 79 -212 79 -253 q 56 -151 79 -174 q 0 -128 33 -128 q -56 -151 -33 -128 q -79 -212 -79 -174 q -56 -276 -79 -253 q 0 -299 -33 -299 z \"},\"̦\":{\"ha\":0,\"x_min\":-132,\"x_max\":108,\"o\":\"m -121 -314 l -132 -258 q -12 -235 -44 -251 q 19 -192 19 -219 q -6 -151 19 -164 q -79 -133 -31 -137 l -54 -81 q 72 -116 36 -92 q 108 -187 108 -140 q 49 -278 108 -249 q -121 -314 -10 -308 z \"},\"̧\":{\"ha\":0,\"x_min\":-132,\"x_max\":108,\"o\":\"m -121 -314 l -132 -258 q -12 -235 -44 -251 q 19 -189 19 -219 q -4 -146 19 -161 q -87 -122 -28 -131 l -26 4 l 47 4 l 7 -89 q 82 -122 56 -100 q 108 -187 108 -144 q 49 -278 108 -249 q -121 -314 -10 -308 z \"},\"̨\":{\"ha\":0,\"x_min\":-92,\"x_max\":143,\"o\":\"m 33 -286 q -56 -256 -19 -286 q -92 -168 -92 -226 q -60 -67 -92 -111 q 7 4 -28 -22 l 88 4 q 18 -67 43 -29 q -7 -146 -7 -106 q 13 -194 -7 -178 q 57 -210 32 -210 q 113 -192 88 -210 l 143 -249 q 92 -275 124 -264 q 33 -286 60 -286 z \"},\"̩\":{\"ha\":0,\"x_min\":-49,\"x_max\":49,\"o\":\"m -49 -369 l -40 -99 l 40 -99 l 49 -369 l -49 -369 z \"},\"̪\":{\"ha\":0,\"x_min\":-168,\"x_max\":168,\"o\":\"m 104 -314 l 104 -179 l -104 -179 l -104 -314 l -168 -314 l -168 -114 l 168 -114 l 168 -314 l 104 -314 z \"},\"̬\":{\"ha\":0,\"x_min\":-215,\"x_max\":215,\"o\":\"m -57 -310 l -215 -115 l -167 -71 l -3 -228 l 3 -228 l 167 -71 l 215 -115 l 57 -310 l -57 -310 z \"},\"̮\":{\"ha\":0,\"x_min\":-217,\"x_max\":217,\"o\":\"m 0 -319 q -96 -301 -56 -319 q -162 -253 -136 -283 q -201 -186 -187 -224 q -217 -110 -214 -149 l -146 -99 q -131 -151 -142 -125 q -103 -197 -121 -176 q -59 -231 -85 -218 q 0 -243 -33 -243 q 59 -231 33 -243 q 103 -197 85 -218 q 131 -151 121 -176 q 146 -99 142 -125 l 217 -110 q 201 -186 214 -149 q 161 -253 188 -224 q 95 -301 135 -283 q 0 -319 56 -319 z \"},\"̯\":{\"ha\":0,\"x_min\":-217,\"x_max\":217,\"o\":\"m -146 -328 l -217 -317 q -201 -240 -214 -278 q -162 -173 -187 -203 q -96 -125 -136 -143 q 0 -107 -56 -107 q 95 -125 56 -107 q 161 -173 135 -143 q 201 -240 188 -203 q 217 -317 214 -278 l 146 -328 q 131 -276 142 -301 q 103 -229 121 -250 q 59 -196 85 -208 q 0 -183 33 -183 q -59 -196 -33 -183 q -103 -229 -85 -208 q -131 -276 -121 -250 q -146 -328 -142 -301 z \"},\"̰\":{\"ha\":0,\"x_min\":-240,\"x_max\":240,\"o\":\"m 100 -308 q 36 -290 63 -308 q -12 -250 10 -272 q -55 -210 -35 -228 q -99 -192 -75 -192 q -146 -222 -131 -192 q -164 -301 -161 -253 l -240 -297 q -230 -222 -239 -257 q -204 -162 -221 -187 q -162 -123 -187 -137 q -100 -108 -136 -108 q -36 -126 -62 -108 q 13 -167 -10 -144 q 55 -207 35 -189 q 100 -225 75 -225 q 146 -194 131 -225 q 164 -115 161 -164 l 240 -121 q 230 -195 239 -161 q 204 -254 221 -229 q 162 -294 188 -279 q 100 -308 136 -308 z \"},\"̱\":{\"ha\":0,\"x_min\":-185,\"x_max\":185,\"o\":\"m -185 -235 l -185 -156 l 185 -156 l 185 -235 l -185 -235 z \"},\"̴\":{\"ha\":0,\"x_min\":-240,\"x_max\":240,\"o\":\"m 100 263 q 36 281 63 263 q -12 321 10 299 q -55 361 -35 343 q -99 379 -75 379 q -146 349 -131 379 q -164 269 -161 318 l -240 274 q -230 349 -239 314 q -204 408 -221 383 q -162 448 -187 433 q -100 463 -136 463 q -36 444 -62 463 q 13 404 -10 426 q 55 364 35 382 q 100 346 75 346 q 146 376 131 346 q 164 456 161 407 l 240 450 q 230 376 239 410 q 204 317 221 342 q 162 277 188 292 q 100 263 136 263 z \"},\"̹\":{\"ha\":0,\"x_min\":-76,\"x_max\":92,\"o\":\"m -76 -358 l -76 -310 q 2 -286 -21 -310 q 25 -224 25 -262 q 2 -161 25 -185 q -76 -137 -21 -137 l -76 -89 q 49 -123 7 -86 q 92 -224 92 -160 q 49 -324 92 -287 q -76 -358 7 -361 z \"},\"̺\":{\"ha\":0,\"x_min\":-168,\"x_max\":168,\"o\":\"m -168 -312 l -168 -114 l -104 -114 l -104 -247 l 104 -247 l 104 -114 l 168 -114 l 168 -312 l -168 -312 z \"},\"̻\":{\"ha\":0,\"x_min\":-168,\"x_max\":168,\"o\":\"m -168 -333 l -168 -107 l 168 -107 l 168 -333 l -168 -333 m -104 -278 l 104 -278 l 104 -161 l -104 -161 l -104 -278 z \"},\"̼\":{\"ha\":0,\"x_min\":-233,\"x_max\":233,\"o\":\"m -233 -317 q -200 -160 -233 -208 q -103 -111 -167 -111 q -40 -129 -67 -111 q -1 -192 -12 -147 l 1 -192 q 40 -129 13 -147 q 103 -111 67 -111 q 200 -160 167 -111 q 233 -317 233 -208 l 167 -325 q 148 -214 167 -242 q 97 -186 129 -186 q 49 -215 65 -186 q 33 -297 33 -244 l 33 -324 l -33 -324 l -33 -297 q -49 -215 -33 -244 q -99 -186 -65 -186 q -149 -214 -131 -186 q -167 -325 -167 -242 l -233 -317 z \"},\"̽\":{\"ha\":0,\"x_min\":-117,\"x_max\":117,\"o\":\"m -71 771 l -117 817 l -46 888 l -117 958 l -71 1006 l 0 935 l 71 1006 l 117 958 l 46 888 l 117 817 l 71 771 l 0 842 l -71 771 z \"},\"͂\":{\"ha\":0,\"x_min\":-240,\"x_max\":240,\"o\":\"m 100 801 q 36 819 63 801 q -12 860 10 838 q -55 900 -35 882 q -99 918 -75 918 q -146 888 -131 918 q -164 808 -161 857 l -240 813 q -230 888 -239 853 q -204 947 -221 922 q -162 987 -187 972 q -100 1001 -136 1001 q -36 983 -62 1001 q 13 943 -10 965 q 55 903 35 921 q 100 885 75 885 q 146 915 131 885 q 164 994 161 946 l 240 989 q 230 915 239 949 q 204 856 221 881 q 162 816 188 831 q 100 801 136 801 z \"},\"ͅ\":{\"ha\":0,\"x_min\":-46,\"x_max\":125,\"o\":\"m 61 -279 q -20 -246 6 -279 q -46 -150 -46 -212 l -46 -86 l 43 -86 q 40 -124 40 -104 q 40 -160 40 -144 q 53 -193 40 -183 q 82 -203 65 -203 q 93 -202 88 -203 q 113 -199 99 -201 l 125 -267 q 98 -276 111 -272 q 61 -279 85 -279 z \"},\"͡\":{\"ha\":0,\"x_min\":-631,\"x_max\":631,\"o\":\"m -597 764 l -631 822 q -334 953 -490 908 q 0 999 -178 999 q 334 953 178 999 q 631 822 490 908 l 597 764 q 308 881 464 844 q 0 918 151 918 q -308 881 -151 918 q -597 764 -464 844 z \"},\" \":{\"ha\":281,\"x_min\":0,\"x_max\":0,\"o\":\"\"},\" \":{\"ha\":690,\"x_min\":0,\"x_max\":0,\"o\":\"\"},\" \":{\"ha\":174,\"x_min\":0,\"x_max\":0,\"o\":\"\"},\"﻿\":{\"ha\":0,\"x_min\":0,\"x_max\":0,\"o\":\"\"},\"ﬁ\":{\"ha\":772,\"x_min\":42,\"x_max\":682,\"o\":\"m 133 0 l 133 582 l 42 582 l 42 668 l 133 675 l 133 782 q 181 946 133 886 q 331 1006 229 1006 q 391 999 363 1006 q 443 983 419 993 l 418 896 q 342 913 381 913 q 247 782 247 913 l 247 675 l 390 675 l 390 582 l 247 582 l 247 0 l 133 0 m 544 0 l 544 675 l 658 675 l 658 0 l 544 0 m 603 814 q 547 835 569 814 q 524 888 524 856 q 547 941 524 921 q 603 961 569 961 q 659 941 636 961 q 682 888 682 921 q 659 835 682 856 q 603 814 636 814 z \"},\"ﬂ\":{\"ha\":760,\"x_min\":42,\"x_max\":706,\"o\":\"m 133 0 l 133 582 l 42 582 l 42 668 l 133 675 l 133 782 q 181 946 133 886 q 331 1006 229 1006 q 391 999 363 1006 q 443 983 419 993 l 418 896 q 342 913 381 913 q 247 782 247 913 l 247 675 l 390 675 l 390 582 l 247 582 l 247 0 l 133 0 m 640 -17 q 547 22 575 -17 q 519 136 519 61 l 519 989 l 633 989 l 633 128 q 643 89 633 100 q 665 78 653 78 q 676 78 671 78 q 690 81 681 78 l 706 -6 q 679 -14 694 -11 q 640 -17 664 -17 z \"}},\"familyName\":\"Source Sans Pro\",\"ascender\":1367,\"descender\":-379,\"underlinePosition\":-75,\"underlineThickness\":50,\"boundingBox\":{\"yMin\":-292,\"xMin\":-454,\"yMax\":968,\"xMax\":2159},\"resolution\":1000,\"original_font_information\":{\"format\":0,\"copyright\":\"Copyright 2010, 2012, 2014 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name ‘Source’.\",\"fontFamily\":\"Source Sans Pro\",\"fontSubfamily\":\"Regular\",\"uniqueID\":\"2.020;ADBO;SourceSansPro-Regular;ADOBE\",\"fullName\":\"Source Sans Pro\",\"version\":\"Version 2.020;PS 2.000;hotconv 1.0.86;makeotf.lib2.5.63406\",\"postScriptName\":\"SourceSansPro-Regular\",\"trademark\":\"Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries.\",\"manufacturer\":\"Adobe Systems Incorporated\",\"designer\":\"Paul D. Hunt\",\"manufacturerURL\":\"http://www.adobe.com/type\",\"licence\":\"This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: http://scripts.sil.org/OFL. This Font Software is distributed on an ‘AS IS’ BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the SIL Open Font License for the specific language, permissions and limitations governing your use of this Font Software.\",\"licenceURL\":\"http://scripts.sil.org/OFL\",\"unknown1\":\"Slashed zero\",\"unknown2\":\"Straight l\",\"unknown3\":\"Alternate a\",\"unknown4\":\"Alternate g\",\"unknown5\":\"Serifed I\"},\"cssFontWeight\":\"normal\",\"cssFontStyle\":\"normal\"}"
  },
  {
    "path": "browser/data/fonts/helvetiker_bold.typeface.js",
    "content": "if (_typeface_js && _typeface_js.loadFace) _typeface_js.loadFace({\"glyphs\":{\"ο\":{\"x_min\":0,\"x_max\":764,\"ha\":863,\"o\":\"m 380 -25 q 105 87 211 -25 q 0 372 0 200 q 104 660 0 545 q 380 775 209 775 q 658 659 552 775 q 764 372 764 544 q 658 87 764 200 q 380 -25 552 -25 m 379 142 q 515 216 466 142 q 557 373 557 280 q 515 530 557 465 q 379 607 466 607 q 245 530 294 607 q 204 373 204 465 q 245 218 204 283 q 379 142 294 142 \"},\"S\":{\"x_min\":0,\"x_max\":826,\"ha\":915,\"o\":\"m 826 306 q 701 55 826 148 q 423 -29 587 -29 q 138 60 255 -29 q 0 318 13 154 l 208 318 q 288 192 216 238 q 437 152 352 152 q 559 181 506 152 q 623 282 623 217 q 466 411 623 372 q 176 487 197 478 q 18 719 18 557 q 136 958 18 869 q 399 1040 244 1040 q 670 956 561 1040 q 791 713 791 864 l 591 713 q 526 826 583 786 q 393 866 469 866 q 277 838 326 866 q 218 742 218 804 q 374 617 218 655 q 667 542 646 552 q 826 306 826 471 \"},\"¦\":{\"x_min\":0,\"x_max\":143,\"ha\":240,\"o\":\"m 143 462 l 0 462 l 0 984 l 143 984 l 143 462 m 143 -242 l 0 -242 l 0 280 l 143 280 l 143 -242 \"},\"/\":{\"x_min\":196.109375,\"x_max\":632.5625,\"ha\":828,\"o\":\"m 632 1040 l 289 -128 l 196 -128 l 538 1040 l 632 1040 \"},\"Τ\":{\"x_min\":-0.609375,\"x_max\":808,\"ha\":878,\"o\":\"m 808 831 l 508 831 l 508 0 l 298 0 l 298 831 l 0 831 l 0 1013 l 808 1013 l 808 831 \"},\"y\":{\"x_min\":0,\"x_max\":738.890625,\"ha\":828,\"o\":\"m 738 749 l 444 -107 q 361 -238 413 -199 q 213 -277 308 -277 q 156 -275 176 -277 q 120 -271 131 -271 l 120 -110 q 147 -113 134 -111 q 179 -116 161 -116 q 247 -91 226 -116 q 269 -17 269 -67 q 206 173 269 -4 q 84 515 162 301 q 0 749 41 632 l 218 749 l 376 207 l 529 749 l 738 749 \"},\"Π\":{\"x_min\":0,\"x_max\":809,\"ha\":922,\"o\":\"m 809 0 l 598 0 l 598 836 l 208 836 l 208 0 l 0 0 l 0 1012 l 809 1012 l 809 0 \"},\"ΐ\":{\"x_min\":-162,\"x_max\":364,\"ha\":364,\"o\":\"m 364 810 l 235 810 l 235 952 l 364 952 l 364 810 m 301 1064 l 86 810 l -12 810 l 123 1064 l 301 1064 m -33 810 l -162 810 l -162 952 l -33 952 l -33 810 m 200 0 l 0 0 l 0 748 l 200 748 l 200 0 \"},\"g\":{\"x_min\":0,\"x_max\":724,\"ha\":839,\"o\":\"m 724 48 q 637 -223 724 -142 q 357 -304 551 -304 q 140 -253 226 -304 q 23 -72 36 -192 l 243 -72 q 290 -127 255 -110 q 368 -144 324 -144 q 504 -82 470 -144 q 530 71 530 -38 l 530 105 q 441 25 496 51 q 319 0 386 0 q 79 115 166 0 q 0 377 0 219 q 77 647 0 534 q 317 775 166 775 q 534 656 456 775 l 534 748 l 724 748 l 724 48 m 368 167 q 492 237 447 167 q 530 382 530 297 q 490 529 530 466 q 364 603 444 603 q 240 532 284 603 q 201 386 201 471 q 240 239 201 300 q 368 167 286 167 \"},\"²\":{\"x_min\":0,\"x_max\":463,\"ha\":560,\"o\":\"m 463 791 q 365 627 463 706 q 151 483 258 555 l 455 483 l 455 382 l 0 382 q 84 565 0 488 q 244 672 97 576 q 331 784 331 727 q 299 850 331 824 q 228 876 268 876 q 159 848 187 876 q 132 762 132 820 l 10 762 q 78 924 10 866 q 228 976 137 976 q 392 925 322 976 q 463 791 463 874 \"},\"–\":{\"x_min\":0,\"x_max\":704.171875,\"ha\":801,\"o\":\"m 704 297 l 0 297 l 0 450 l 704 450 l 704 297 \"},\"Κ\":{\"x_min\":0,\"x_max\":899.671875,\"ha\":969,\"o\":\"m 899 0 l 646 0 l 316 462 l 208 355 l 208 0 l 0 0 l 0 1013 l 208 1013 l 208 596 l 603 1013 l 863 1013 l 460 603 l 899 0 \"},\"ƒ\":{\"x_min\":-46,\"x_max\":440,\"ha\":525,\"o\":\"m 440 609 l 316 609 l 149 -277 l -46 -277 l 121 609 l 14 609 l 14 749 l 121 749 q 159 949 121 894 q 344 1019 208 1019 l 440 1015 l 440 855 l 377 855 q 326 841 338 855 q 314 797 314 827 q 314 773 314 786 q 314 749 314 761 l 440 749 l 440 609 \"},\"e\":{\"x_min\":0,\"x_max\":708,\"ha\":808,\"o\":\"m 708 321 l 207 321 q 254 186 207 236 q 362 141 298 141 q 501 227 453 141 l 700 227 q 566 36 662 104 q 362 -26 477 -26 q 112 72 213 -26 q 0 369 0 182 q 95 683 0 573 q 358 793 191 793 q 619 677 531 793 q 708 321 708 561 m 501 453 q 460 571 501 531 q 353 612 420 612 q 247 570 287 612 q 207 453 207 529 l 501 453 \"},\"ό\":{\"x_min\":0,\"x_max\":764,\"ha\":863,\"o\":\"m 380 -25 q 105 87 211 -25 q 0 372 0 200 q 104 660 0 545 q 380 775 209 775 q 658 659 552 775 q 764 372 764 544 q 658 87 764 200 q 380 -25 552 -25 m 379 142 q 515 216 466 142 q 557 373 557 280 q 515 530 557 465 q 379 607 466 607 q 245 530 294 607 q 204 373 204 465 q 245 218 204 283 q 379 142 294 142 m 593 1039 l 391 823 l 293 823 l 415 1039 l 593 1039 \"},\"J\":{\"x_min\":0,\"x_max\":649,\"ha\":760,\"o\":\"m 649 294 q 573 48 649 125 q 327 -29 497 -29 q 61 82 136 -29 q 0 375 0 173 l 200 375 l 199 309 q 219 194 199 230 q 321 145 249 145 q 418 193 390 145 q 441 307 441 232 l 441 1013 l 649 1013 l 649 294 \"},\"»\":{\"x_min\":-0.234375,\"x_max\":526,\"ha\":624,\"o\":\"m 526 286 l 297 87 l 296 250 l 437 373 l 297 495 l 297 660 l 526 461 l 526 286 m 229 286 l 0 87 l 0 250 l 140 373 l 0 495 l 0 660 l 229 461 l 229 286 \"},\"©\":{\"x_min\":3,\"x_max\":1007,\"ha\":1104,\"o\":\"m 507 -6 q 129 153 269 -6 q 3 506 3 298 q 127 857 3 713 q 502 1017 266 1017 q 880 855 740 1017 q 1007 502 1007 711 q 882 152 1007 295 q 507 -6 743 -6 m 502 934 q 184 800 302 934 q 79 505 79 680 q 184 210 79 331 q 501 76 302 76 q 819 210 701 76 q 925 507 925 331 q 820 800 925 682 q 502 934 704 934 m 758 410 q 676 255 748 313 q 506 197 605 197 q 298 291 374 197 q 229 499 229 377 q 297 713 229 624 q 494 811 372 811 q 666 760 593 811 q 752 616 739 710 l 621 616 q 587 688 621 658 q 509 719 554 719 q 404 658 441 719 q 368 511 368 598 q 403 362 368 427 q 498 298 438 298 q 624 410 606 298 l 758 410 \"},\"ώ\":{\"x_min\":0,\"x_max\":945,\"ha\":1051,\"o\":\"m 566 528 l 372 528 l 372 323 q 372 298 372 311 q 373 271 372 285 q 360 183 373 211 q 292 142 342 142 q 219 222 243 142 q 203 365 203 279 q 241 565 203 461 q 334 748 273 650 l 130 748 q 36 552 68 650 q 0 337 0 444 q 69 96 0 204 q 276 -29 149 -29 q 390 0 337 -29 q 470 78 444 28 q 551 0 495 30 q 668 -29 608 -29 q 874 96 793 -29 q 945 337 945 205 q 910 547 945 444 q 814 748 876 650 l 610 748 q 703 565 671 650 q 742 365 742 462 q 718 189 742 237 q 651 142 694 142 q 577 190 597 142 q 565 289 565 221 l 565 323 l 566 528 m 718 1039 l 516 823 l 417 823 l 540 1039 l 718 1039 \"},\"^\":{\"x_min\":197.21875,\"x_max\":630.5625,\"ha\":828,\"o\":\"m 630 836 l 536 836 l 413 987 l 294 836 l 197 836 l 331 1090 l 493 1090 l 630 836 \"},\"«\":{\"x_min\":0,\"x_max\":526.546875,\"ha\":624,\"o\":\"m 526 87 l 297 286 l 297 461 l 526 660 l 526 495 l 385 373 l 526 250 l 526 87 m 229 87 l 0 286 l 0 461 l 229 660 l 229 495 l 88 373 l 229 250 l 229 87 \"},\"D\":{\"x_min\":0,\"x_max\":864,\"ha\":968,\"o\":\"m 400 1013 q 736 874 608 1013 q 864 523 864 735 q 717 146 864 293 q 340 0 570 0 l 0 0 l 0 1013 l 400 1013 m 398 837 l 206 837 l 206 182 l 372 182 q 584 276 507 182 q 657 504 657 365 q 594 727 657 632 q 398 837 522 837 \"},\"∙\":{\"x_min\":0,\"x_max\":207,\"ha\":304,\"o\":\"m 207 528 l 0 528 l 0 735 l 207 735 l 207 528 \"},\"ÿ\":{\"x_min\":0,\"x_max\":47,\"ha\":125,\"o\":\"m 47 3 q 37 -7 47 -7 q 28 0 30 -7 q 39 -4 32 -4 q 45 3 45 -1 l 37 0 q 28 9 28 0 q 39 19 28 19 l 47 16 l 47 19 l 47 3 m 37 1 q 44 8 44 1 q 37 16 44 16 q 30 8 30 16 q 37 1 30 1 m 26 1 l 23 22 l 14 0 l 3 22 l 3 3 l 0 25 l 13 1 l 22 25 l 26 1 \"},\"w\":{\"x_min\":0,\"x_max\":1056.953125,\"ha\":1150,\"o\":\"m 1056 749 l 848 0 l 647 0 l 527 536 l 412 0 l 211 0 l 0 749 l 202 749 l 325 226 l 429 748 l 633 748 l 740 229 l 864 749 l 1056 749 \"},\"$\":{\"x_min\":0,\"x_max\":704,\"ha\":800,\"o\":\"m 682 693 l 495 693 q 468 782 491 749 q 391 831 441 824 l 391 579 q 633 462 562 534 q 704 259 704 389 q 616 57 704 136 q 391 -22 528 -22 l 391 -156 l 308 -156 l 308 -22 q 76 69 152 -7 q 0 300 0 147 l 183 300 q 215 191 190 230 q 308 128 245 143 l 308 414 q 84 505 157 432 q 12 700 12 578 q 89 902 12 824 q 308 981 166 981 l 308 1069 l 391 1069 l 391 981 q 595 905 521 981 q 682 693 670 829 m 308 599 l 308 831 q 228 796 256 831 q 200 712 200 762 q 225 642 200 668 q 308 599 251 617 m 391 128 q 476 174 449 140 q 504 258 504 207 q 391 388 504 354 l 391 128 \"},\"\\\\\":{\"x_min\":-0.03125,\"x_max\":434.765625,\"ha\":532,\"o\":\"m 434 -128 l 341 -128 l 0 1039 l 91 1040 l 434 -128 \"},\"µ\":{\"x_min\":0,\"x_max\":647,\"ha\":754,\"o\":\"m 647 0 l 478 0 l 478 68 q 412 9 448 30 q 330 -11 375 -11 q 261 3 296 -11 q 199 43 226 18 l 199 -277 l 0 -277 l 0 749 l 199 749 l 199 358 q 216 221 199 267 q 322 151 244 151 q 435 240 410 151 q 448 401 448 283 l 448 749 l 647 749 l 647 0 \"},\"Ι\":{\"x_min\":42,\"x_max\":250,\"ha\":413,\"o\":\"m 250 0 l 42 0 l 42 1013 l 250 1013 l 250 0 \"},\"Ύ\":{\"x_min\":0,\"x_max\":1211.15625,\"ha\":1289,\"o\":\"m 1211 1012 l 907 376 l 907 0 l 697 0 l 697 376 l 374 1012 l 583 1012 l 802 576 l 1001 1012 l 1211 1012 m 313 1035 l 98 780 l 0 780 l 136 1035 l 313 1035 \"},\"’\":{\"x_min\":0,\"x_max\":192,\"ha\":289,\"o\":\"m 192 834 q 137 692 192 751 q 0 626 83 634 l 0 697 q 101 831 101 723 l 0 831 l 0 1013 l 192 1013 l 192 834 \"},\"Ν\":{\"x_min\":0,\"x_max\":833,\"ha\":946,\"o\":\"m 833 0 l 617 0 l 206 696 l 206 0 l 0 0 l 0 1013 l 216 1013 l 629 315 l 629 1013 l 833 1013 l 833 0 \"},\"-\":{\"x_min\":27.78125,\"x_max\":413.890625,\"ha\":525,\"o\":\"m 413 279 l 27 279 l 27 468 l 413 468 l 413 279 \"},\"Q\":{\"x_min\":0,\"x_max\":995.59375,\"ha\":1096,\"o\":\"m 995 49 l 885 -70 l 762 42 q 641 -12 709 4 q 497 -29 572 -29 q 135 123 271 -29 q 0 504 0 276 q 131 881 0 731 q 497 1040 270 1040 q 859 883 719 1040 q 994 506 994 731 q 966 321 994 413 q 884 152 938 229 l 995 49 m 730 299 q 767 395 755 344 q 779 504 779 446 q 713 743 779 644 q 505 857 638 857 q 284 745 366 857 q 210 501 210 644 q 279 265 210 361 q 492 157 357 157 q 615 181 557 157 l 508 287 l 620 405 l 730 299 \"},\"ς\":{\"x_min\":0,\"x_max\":731.78125,\"ha\":768,\"o\":\"m 731 448 l 547 448 q 485 571 531 533 q 369 610 440 610 q 245 537 292 610 q 204 394 204 473 q 322 186 204 238 q 540 133 430 159 q 659 -15 659 98 q 643 -141 659 -80 q 595 -278 627 -202 l 423 -278 q 458 -186 448 -215 q 474 -88 474 -133 q 352 0 474 -27 q 123 80 181 38 q 0 382 0 170 q 98 660 0 549 q 367 777 202 777 q 622 683 513 777 q 731 448 731 589 \"},\"M\":{\"x_min\":0,\"x_max\":1019,\"ha\":1135,\"o\":\"m 1019 0 l 823 0 l 823 819 l 618 0 l 402 0 l 194 818 l 194 0 l 0 0 l 0 1013 l 309 1012 l 510 241 l 707 1013 l 1019 1013 l 1019 0 \"},\"Ψ\":{\"x_min\":0,\"x_max\":995,\"ha\":1085,\"o\":\"m 995 698 q 924 340 995 437 q 590 200 841 227 l 590 0 l 404 0 l 404 200 q 70 340 152 227 q 0 698 0 437 l 0 1013 l 188 1013 l 188 694 q 212 472 188 525 q 404 383 254 383 l 404 1013 l 590 1013 l 590 383 q 781 472 740 383 q 807 694 807 525 l 807 1013 l 995 1013 l 995 698 \"},\"C\":{\"x_min\":0,\"x_max\":970.828125,\"ha\":1043,\"o\":\"m 970 345 q 802 70 933 169 q 490 -29 672 -29 q 130 130 268 -29 q 0 506 0 281 q 134 885 0 737 q 502 1040 275 1040 q 802 939 668 1040 q 965 679 936 838 l 745 679 q 649 809 716 761 q 495 857 582 857 q 283 747 361 857 q 214 508 214 648 q 282 267 214 367 q 493 154 359 154 q 651 204 584 154 q 752 345 718 255 l 970 345 \"},\"!\":{\"x_min\":0,\"x_max\":204,\"ha\":307,\"o\":\"m 204 739 q 182 515 204 686 q 152 282 167 398 l 52 282 q 13 589 27 473 q 0 739 0 704 l 0 1013 l 204 1013 l 204 739 m 204 0 l 0 0 l 0 203 l 204 203 l 204 0 \"},\"{\":{\"x_min\":0,\"x_max\":501.390625,\"ha\":599,\"o\":\"m 501 -285 q 229 -209 301 -285 q 176 -35 176 -155 q 182 47 176 -8 q 189 126 189 103 q 156 245 189 209 q 0 294 112 294 l 0 438 q 154 485 111 438 q 189 603 189 522 q 186 666 189 636 q 176 783 176 772 q 231 945 176 894 q 501 1015 306 1015 l 501 872 q 370 833 408 872 q 340 737 340 801 q 342 677 340 705 q 353 569 353 579 q 326 451 353 496 q 207 366 291 393 q 327 289 294 346 q 353 164 353 246 q 348 79 353 132 q 344 17 344 26 q 372 -95 344 -58 q 501 -141 408 -141 l 501 -285 \"},\"X\":{\"x_min\":0,\"x_max\":894.453125,\"ha\":999,\"o\":\"m 894 0 l 654 0 l 445 351 l 238 0 l 0 0 l 316 516 l 0 1013 l 238 1013 l 445 659 l 652 1013 l 894 1013 l 577 519 l 894 0 \"},\"#\":{\"x_min\":0,\"x_max\":1019.453125,\"ha\":1117,\"o\":\"m 1019 722 l 969 582 l 776 581 l 717 417 l 919 417 l 868 279 l 668 278 l 566 -6 l 413 -5 l 516 279 l 348 279 l 247 -6 l 94 -6 l 196 278 l 0 279 l 49 417 l 245 417 l 304 581 l 98 582 l 150 722 l 354 721 l 455 1006 l 606 1006 l 507 721 l 673 722 l 776 1006 l 927 1006 l 826 721 l 1019 722 m 627 581 l 454 581 l 394 417 l 567 417 l 627 581 \"},\"ι\":{\"x_min\":42,\"x_max\":242,\"ha\":389,\"o\":\"m 242 0 l 42 0 l 42 749 l 242 749 l 242 0 \"},\"Ά\":{\"x_min\":0,\"x_max\":995.828125,\"ha\":1072,\"o\":\"m 313 1035 l 98 780 l 0 780 l 136 1035 l 313 1035 m 995 0 l 776 0 l 708 208 l 315 208 l 247 0 l 29 0 l 390 1012 l 629 1012 l 995 0 m 652 376 l 509 809 l 369 376 l 652 376 \"},\")\":{\"x_min\":0,\"x_max\":389,\"ha\":486,\"o\":\"m 389 357 q 319 14 389 187 q 145 -293 259 -134 l 0 -293 q 139 22 90 -142 q 189 358 189 187 q 139 689 189 525 q 0 1013 90 853 l 145 1013 q 319 703 258 857 q 389 357 389 528 \"},\"ε\":{\"x_min\":16.671875,\"x_max\":652.78125,\"ha\":742,\"o\":\"m 652 259 q 565 49 652 123 q 340 -25 479 -25 q 102 39 188 -25 q 16 197 16 104 q 45 299 16 249 q 134 390 75 348 q 58 456 86 419 q 25 552 25 502 q 120 717 25 653 q 322 776 208 776 q 537 710 456 776 q 625 508 625 639 l 445 508 q 415 585 445 563 q 327 608 386 608 q 254 590 293 608 q 215 544 215 573 q 252 469 215 490 q 336 453 280 453 q 369 455 347 453 q 400 456 391 456 l 400 308 l 329 308 q 247 291 280 308 q 204 223 204 269 q 255 154 204 172 q 345 143 286 143 q 426 174 398 143 q 454 259 454 206 l 652 259 \"},\"Δ\":{\"x_min\":0,\"x_max\":981.953125,\"ha\":1057,\"o\":\"m 981 0 l 0 0 l 386 1013 l 594 1013 l 981 0 m 715 175 l 490 765 l 266 175 l 715 175 \"},\"}\":{\"x_min\":0,\"x_max\":500,\"ha\":597,\"o\":\"m 500 294 q 348 246 390 294 q 315 128 315 209 q 320 42 315 101 q 326 -48 326 -17 q 270 -214 326 -161 q 0 -285 196 -285 l 0 -141 q 126 -97 90 -141 q 154 8 154 -64 q 150 91 154 37 q 146 157 146 145 q 172 281 146 235 q 294 366 206 339 q 173 451 208 390 q 146 576 146 500 q 150 655 146 603 q 154 731 154 708 q 126 831 154 799 q 0 872 90 872 l 0 1015 q 270 944 196 1015 q 326 777 326 891 q 322 707 326 747 q 313 593 313 612 q 347 482 313 518 q 500 438 390 438 l 500 294 \"},\"‰\":{\"x_min\":0,\"x_max\":1681,\"ha\":1775,\"o\":\"m 861 484 q 1048 404 979 484 q 1111 228 1111 332 q 1048 51 1111 123 q 859 -29 979 -29 q 672 50 740 -29 q 610 227 610 122 q 672 403 610 331 q 861 484 741 484 m 861 120 q 939 151 911 120 q 967 226 967 183 q 942 299 967 270 q 861 333 912 333 q 783 301 811 333 q 756 226 756 269 q 783 151 756 182 q 861 120 810 120 m 904 984 l 316 -28 l 205 -29 l 793 983 l 904 984 m 250 984 q 436 904 366 984 q 499 730 499 832 q 436 552 499 626 q 248 472 366 472 q 62 552 132 472 q 0 728 0 624 q 62 903 0 831 q 250 984 132 984 m 249 835 q 169 801 198 835 q 140 725 140 768 q 167 652 140 683 q 247 621 195 621 q 327 654 298 621 q 357 730 357 687 q 329 803 357 772 q 249 835 301 835 m 1430 484 q 1618 404 1548 484 q 1681 228 1681 332 q 1618 51 1681 123 q 1429 -29 1548 -29 q 1241 50 1309 -29 q 1179 227 1179 122 q 1241 403 1179 331 q 1430 484 1311 484 m 1431 120 q 1509 151 1481 120 q 1537 226 1537 183 q 1511 299 1537 270 q 1431 333 1482 333 q 1352 301 1380 333 q 1325 226 1325 269 q 1352 151 1325 182 q 1431 120 1379 120 \"},\"a\":{\"x_min\":0,\"x_max\":700,\"ha\":786,\"o\":\"m 700 0 l 488 0 q 465 93 469 45 q 365 5 427 37 q 233 -26 303 -26 q 65 37 130 -26 q 0 205 0 101 q 120 409 0 355 q 343 452 168 431 q 465 522 465 468 q 424 588 465 565 q 337 611 384 611 q 250 581 285 611 q 215 503 215 552 l 26 503 q 113 707 26 633 q 328 775 194 775 q 538 723 444 775 q 657 554 657 659 l 657 137 q 666 73 657 101 q 700 33 675 45 l 700 0 m 465 297 l 465 367 q 299 322 358 340 q 193 217 193 287 q 223 150 193 174 q 298 127 254 127 q 417 175 370 127 q 465 297 465 224 \"},\"—\":{\"x_min\":0,\"x_max\":941.671875,\"ha\":1039,\"o\":\"m 941 297 l 0 297 l 0 450 l 941 450 l 941 297 \"},\"=\":{\"x_min\":29.171875,\"x_max\":798.609375,\"ha\":828,\"o\":\"m 798 502 l 29 502 l 29 635 l 798 635 l 798 502 m 798 204 l 29 204 l 29 339 l 798 339 l 798 204 \"},\"N\":{\"x_min\":0,\"x_max\":833,\"ha\":949,\"o\":\"m 833 0 l 617 0 l 206 695 l 206 0 l 0 0 l 0 1013 l 216 1013 l 629 315 l 629 1013 l 833 1013 l 833 0 \"},\"ρ\":{\"x_min\":0,\"x_max\":722,\"ha\":810,\"o\":\"m 364 -17 q 271 0 313 -17 q 194 48 230 16 l 194 -278 l 0 -278 l 0 370 q 87 656 0 548 q 358 775 183 775 q 626 655 524 775 q 722 372 722 541 q 621 95 722 208 q 364 -17 520 -17 m 360 607 q 237 529 280 607 q 201 377 201 463 q 234 229 201 292 q 355 147 277 147 q 467 210 419 147 q 515 374 515 273 q 471 537 515 468 q 360 607 428 607 \"},\"2\":{\"x_min\":64,\"x_max\":764,\"ha\":828,\"o\":\"m 764 685 q 675 452 764 541 q 484 325 637 415 q 307 168 357 250 l 754 168 l 754 0 l 64 0 q 193 301 64 175 q 433 480 202 311 q 564 673 564 576 q 519 780 564 737 q 416 824 475 824 q 318 780 358 824 q 262 633 270 730 l 80 633 q 184 903 80 807 q 415 988 276 988 q 654 907 552 988 q 764 685 764 819 \"},\"¯\":{\"x_min\":0,\"x_max\":775,\"ha\":771,\"o\":\"m 775 958 l 0 958 l 0 1111 l 775 1111 l 775 958 \"},\"Z\":{\"x_min\":0,\"x_max\":804.171875,\"ha\":906,\"o\":\"m 804 836 l 251 182 l 793 182 l 793 0 l 0 0 l 0 176 l 551 830 l 11 830 l 11 1013 l 804 1013 l 804 836 \"},\"u\":{\"x_min\":0,\"x_max\":668,\"ha\":782,\"o\":\"m 668 0 l 474 0 l 474 89 q 363 9 425 37 q 233 -19 301 -19 q 61 53 123 -19 q 0 239 0 126 l 0 749 l 199 749 l 199 296 q 225 193 199 233 q 316 146 257 146 q 424 193 380 146 q 469 304 469 240 l 469 749 l 668 749 l 668 0 \"},\"k\":{\"x_min\":0,\"x_max\":688.890625,\"ha\":771,\"o\":\"m 688 0 l 450 0 l 270 316 l 196 237 l 196 0 l 0 0 l 0 1013 l 196 1013 l 196 483 l 433 748 l 675 748 l 413 469 l 688 0 \"},\"Η\":{\"x_min\":0,\"x_max\":837,\"ha\":950,\"o\":\"m 837 0 l 627 0 l 627 450 l 210 450 l 210 0 l 0 0 l 0 1013 l 210 1013 l 210 635 l 627 635 l 627 1013 l 837 1013 l 837 0 \"},\"Α\":{\"x_min\":0,\"x_max\":966.671875,\"ha\":1043,\"o\":\"m 966 0 l 747 0 l 679 208 l 286 208 l 218 0 l 0 0 l 361 1013 l 600 1013 l 966 0 m 623 376 l 480 809 l 340 376 l 623 376 \"},\"s\":{\"x_min\":0,\"x_max\":681,\"ha\":775,\"o\":\"m 681 229 q 568 33 681 105 q 340 -29 471 -29 q 107 39 202 -29 q 0 245 0 114 l 201 245 q 252 155 201 189 q 358 128 295 128 q 436 144 401 128 q 482 205 482 166 q 363 284 482 255 q 143 348 181 329 q 25 533 25 408 q 129 716 25 647 q 340 778 220 778 q 554 710 465 778 q 658 522 643 643 l 463 522 q 419 596 458 570 q 327 622 380 622 q 255 606 290 622 q 221 556 221 590 q 339 473 221 506 q 561 404 528 420 q 681 229 681 344 \"},\"B\":{\"x_min\":0,\"x_max\":835,\"ha\":938,\"o\":\"m 674 547 q 791 450 747 518 q 835 304 835 383 q 718 75 835 158 q 461 0 612 0 l 0 0 l 0 1013 l 477 1013 q 697 951 609 1013 q 797 754 797 880 q 765 630 797 686 q 674 547 734 575 m 438 621 q 538 646 495 621 q 590 730 590 676 q 537 814 590 785 q 436 838 494 838 l 199 838 l 199 621 l 438 621 m 445 182 q 561 211 513 182 q 618 311 618 247 q 565 410 618 375 q 444 446 512 446 l 199 446 l 199 182 l 445 182 \"},\"…\":{\"x_min\":0,\"x_max\":819,\"ha\":963,\"o\":\"m 206 0 l 0 0 l 0 207 l 206 207 l 206 0 m 512 0 l 306 0 l 306 207 l 512 207 l 512 0 m 819 0 l 613 0 l 613 207 l 819 207 l 819 0 \"},\"?\":{\"x_min\":1,\"x_max\":687,\"ha\":785,\"o\":\"m 687 734 q 621 563 687 634 q 501 454 560 508 q 436 293 436 386 l 251 293 l 251 391 q 363 557 251 462 q 476 724 476 653 q 432 827 476 788 q 332 866 389 866 q 238 827 275 866 q 195 699 195 781 l 1 699 q 110 955 1 861 q 352 1040 210 1040 q 582 963 489 1040 q 687 734 687 878 m 446 0 l 243 0 l 243 203 l 446 203 l 446 0 \"},\"H\":{\"x_min\":0,\"x_max\":838,\"ha\":953,\"o\":\"m 838 0 l 628 0 l 628 450 l 210 450 l 210 0 l 0 0 l 0 1013 l 210 1013 l 210 635 l 628 635 l 628 1013 l 838 1013 l 838 0 \"},\"ν\":{\"x_min\":0,\"x_max\":740.28125,\"ha\":828,\"o\":\"m 740 749 l 473 0 l 266 0 l 0 749 l 222 749 l 373 211 l 529 749 l 740 749 \"},\"c\":{\"x_min\":0,\"x_max\":751.390625,\"ha\":828,\"o\":\"m 751 282 q 625 58 725 142 q 384 -26 526 -26 q 107 84 215 -26 q 0 366 0 195 q 98 651 0 536 q 370 774 204 774 q 616 700 518 774 q 751 486 715 626 l 536 486 q 477 570 516 538 q 380 607 434 607 q 248 533 298 607 q 204 378 204 466 q 242 219 204 285 q 377 139 290 139 q 483 179 438 139 q 543 282 527 220 l 751 282 \"},\"¶\":{\"x_min\":0,\"x_max\":566.671875,\"ha\":678,\"o\":\"m 21 892 l 52 892 l 98 761 l 145 892 l 176 892 l 178 741 l 157 741 l 157 867 l 108 741 l 88 741 l 40 871 l 40 741 l 21 741 l 21 892 m 308 854 l 308 731 q 252 691 308 691 q 227 691 240 691 q 207 696 213 695 l 207 712 l 253 706 q 288 733 288 706 l 288 763 q 244 741 279 741 q 193 797 193 741 q 261 860 193 860 q 287 860 273 860 q 308 854 302 855 m 288 842 l 263 843 q 213 796 213 843 q 248 756 213 756 q 288 796 288 756 l 288 842 m 566 988 l 502 988 l 502 -1 l 439 -1 l 439 988 l 317 988 l 317 -1 l 252 -1 l 252 602 q 81 653 155 602 q 0 805 0 711 q 101 989 0 918 q 309 1053 194 1053 l 566 1053 l 566 988 \"},\"β\":{\"x_min\":0,\"x_max\":703,\"ha\":789,\"o\":\"m 510 539 q 651 429 600 501 q 703 262 703 357 q 617 53 703 136 q 404 -29 532 -29 q 199 51 279 -29 l 199 -278 l 0 -278 l 0 627 q 77 911 0 812 q 343 1021 163 1021 q 551 957 464 1021 q 649 769 649 886 q 613 638 649 697 q 510 539 577 579 m 344 136 q 452 181 408 136 q 497 291 497 227 q 435 409 497 369 q 299 444 381 444 l 299 600 q 407 634 363 600 q 452 731 452 669 q 417 820 452 784 q 329 857 382 857 q 217 775 246 857 q 199 622 199 725 l 199 393 q 221 226 199 284 q 344 136 254 136 \"},\"Μ\":{\"x_min\":0,\"x_max\":1019,\"ha\":1132,\"o\":\"m 1019 0 l 823 0 l 823 818 l 617 0 l 402 0 l 194 818 l 194 0 l 0 0 l 0 1013 l 309 1013 l 509 241 l 708 1013 l 1019 1013 l 1019 0 \"},\"Ό\":{\"x_min\":0.15625,\"x_max\":1174,\"ha\":1271,\"o\":\"m 676 -29 q 312 127 451 -29 q 179 505 179 277 q 311 883 179 733 q 676 1040 449 1040 q 1040 883 901 1040 q 1174 505 1174 733 q 1041 127 1174 277 q 676 -29 903 -29 m 676 154 q 890 266 811 154 q 961 506 961 366 q 891 745 961 648 q 676 857 812 857 q 462 747 541 857 q 392 506 392 648 q 461 266 392 365 q 676 154 540 154 m 314 1034 l 98 779 l 0 779 l 136 1034 l 314 1034 \"},\"Ή\":{\"x_min\":0,\"x_max\":1248,\"ha\":1361,\"o\":\"m 1248 0 l 1038 0 l 1038 450 l 621 450 l 621 0 l 411 0 l 411 1012 l 621 1012 l 621 635 l 1038 635 l 1038 1012 l 1248 1012 l 1248 0 m 313 1035 l 98 780 l 0 780 l 136 1035 l 313 1035 \"},\"•\":{\"x_min\":-27.78125,\"x_max\":691.671875,\"ha\":775,\"o\":\"m 691 508 q 588 252 691 358 q 331 147 486 147 q 77 251 183 147 q -27 508 -27 355 q 75 761 -27 655 q 331 868 179 868 q 585 763 479 868 q 691 508 691 658 \"},\"¥\":{\"x_min\":0,\"x_max\":836,\"ha\":931,\"o\":\"m 195 625 l 0 1013 l 208 1013 l 427 576 l 626 1013 l 836 1013 l 650 625 l 777 625 l 777 472 l 578 472 l 538 389 l 777 389 l 777 236 l 532 236 l 532 0 l 322 0 l 322 236 l 79 236 l 79 389 l 315 389 l 273 472 l 79 472 l 79 625 l 195 625 \"},\"(\":{\"x_min\":0,\"x_max\":388.890625,\"ha\":486,\"o\":\"m 388 -293 l 243 -293 q 70 14 130 -134 q 0 357 0 189 q 69 703 0 526 q 243 1013 129 856 l 388 1013 q 248 695 297 860 q 200 358 200 530 q 248 24 200 187 q 388 -293 297 -138 \"},\"U\":{\"x_min\":0,\"x_max\":813,\"ha\":926,\"o\":\"m 813 362 q 697 79 813 187 q 405 -29 582 -29 q 114 78 229 -29 q 0 362 0 186 l 0 1013 l 210 1013 l 210 387 q 260 226 210 291 q 408 154 315 154 q 554 226 500 154 q 603 387 603 291 l 603 1013 l 813 1013 l 813 362 \"},\"γ\":{\"x_min\":0.0625,\"x_max\":729.234375,\"ha\":815,\"o\":\"m 729 749 l 457 37 l 457 -278 l 257 -278 l 257 37 q 218 155 243 95 q 170 275 194 215 l 0 749 l 207 749 l 363 284 l 522 749 l 729 749 \"},\"α\":{\"x_min\":-1,\"x_max\":722,\"ha\":835,\"o\":\"m 722 0 l 531 0 l 530 101 q 433 8 491 41 q 304 -25 375 -25 q 72 104 157 -25 q -1 372 -1 216 q 72 643 -1 530 q 308 775 158 775 q 433 744 375 775 q 528 656 491 713 l 528 749 l 722 749 l 722 0 m 361 601 q 233 527 277 601 q 196 375 196 464 q 232 224 196 288 q 358 144 277 144 q 487 217 441 144 q 528 370 528 281 q 489 523 528 457 q 361 601 443 601 \"},\"F\":{\"x_min\":0,\"x_max\":706.953125,\"ha\":778,\"o\":\"m 706 837 l 206 837 l 206 606 l 645 606 l 645 431 l 206 431 l 206 0 l 0 0 l 0 1013 l 706 1013 l 706 837 \"},\"­\":{\"x_min\":0,\"x_max\":704.171875,\"ha\":801,\"o\":\"m 704 297 l 0 297 l 0 450 l 704 450 l 704 297 \"},\":\":{\"x_min\":0,\"x_max\":207,\"ha\":304,\"o\":\"m 207 528 l 0 528 l 0 735 l 207 735 l 207 528 m 207 0 l 0 0 l 0 207 l 207 207 l 207 0 \"},\"Χ\":{\"x_min\":0,\"x_max\":894.453125,\"ha\":978,\"o\":\"m 894 0 l 654 0 l 445 351 l 238 0 l 0 0 l 316 516 l 0 1013 l 238 1013 l 445 660 l 652 1013 l 894 1013 l 577 519 l 894 0 \"},\"*\":{\"x_min\":115,\"x_max\":713,\"ha\":828,\"o\":\"m 713 740 l 518 688 l 651 525 l 531 438 l 412 612 l 290 439 l 173 523 l 308 688 l 115 741 l 159 880 l 342 816 l 343 1013 l 482 1013 l 481 816 l 664 880 l 713 740 \"},\"†\":{\"x_min\":0,\"x_max\":809,\"ha\":894,\"o\":\"m 509 804 l 809 804 l 809 621 l 509 621 l 509 0 l 299 0 l 299 621 l 0 621 l 0 804 l 299 804 l 299 1011 l 509 1011 l 509 804 \"},\"°\":{\"x_min\":-1,\"x_max\":363,\"ha\":460,\"o\":\"m 181 808 q 46 862 94 808 q -1 992 -1 917 q 44 1118 -1 1066 q 181 1175 96 1175 q 317 1118 265 1175 q 363 991 363 1066 q 315 862 363 917 q 181 808 267 808 m 181 908 q 240 933 218 908 q 263 992 263 958 q 242 1051 263 1027 q 181 1075 221 1075 q 120 1050 142 1075 q 99 991 99 1026 q 120 933 99 958 q 181 908 142 908 \"},\"V\":{\"x_min\":0,\"x_max\":895.828125,\"ha\":997,\"o\":\"m 895 1013 l 550 0 l 347 0 l 0 1013 l 231 1013 l 447 256 l 666 1013 l 895 1013 \"},\"Ξ\":{\"x_min\":0,\"x_max\":751.390625,\"ha\":800,\"o\":\"m 733 826 l 5 826 l 5 1012 l 733 1012 l 733 826 m 681 432 l 65 432 l 65 617 l 681 617 l 681 432 m 751 0 l 0 0 l 0 183 l 751 183 l 751 0 \"},\" \":{\"x_min\":0,\"x_max\":0,\"ha\":853},\"Ϋ\":{\"x_min\":-0.21875,\"x_max\":836.171875,\"ha\":914,\"o\":\"m 610 1046 l 454 1046 l 454 1215 l 610 1215 l 610 1046 m 369 1046 l 212 1046 l 212 1215 l 369 1215 l 369 1046 m 836 1012 l 532 376 l 532 0 l 322 0 l 322 376 l 0 1012 l 208 1012 l 427 576 l 626 1012 l 836 1012 \"},\"0\":{\"x_min\":51,\"x_max\":779,\"ha\":828,\"o\":\"m 415 -26 q 142 129 242 -26 q 51 476 51 271 q 141 825 51 683 q 415 984 242 984 q 687 825 585 984 q 779 476 779 682 q 688 131 779 271 q 415 -26 587 -26 m 415 137 q 529 242 485 137 q 568 477 568 338 q 530 713 568 619 q 415 821 488 821 q 303 718 344 821 q 262 477 262 616 q 301 237 262 337 q 415 137 341 137 \"},\"”\":{\"x_min\":0,\"x_max\":469,\"ha\":567,\"o\":\"m 192 834 q 137 692 192 751 q 0 626 83 634 l 0 697 q 101 831 101 723 l 0 831 l 0 1013 l 192 1013 l 192 834 m 469 834 q 414 692 469 751 q 277 626 360 634 l 277 697 q 379 831 379 723 l 277 831 l 277 1013 l 469 1013 l 469 834 \"},\"@\":{\"x_min\":0,\"x_max\":1276,\"ha\":1374,\"o\":\"m 1115 -52 q 895 -170 1015 -130 q 647 -211 776 -211 q 158 -34 334 -211 q 0 360 0 123 q 179 810 0 621 q 698 1019 377 1019 q 1138 859 981 1019 q 1276 514 1276 720 q 1173 210 1276 335 q 884 75 1062 75 q 784 90 810 75 q 737 186 749 112 q 647 104 698 133 q 532 75 596 75 q 360 144 420 75 q 308 308 308 205 q 398 568 308 451 q 638 696 497 696 q 731 671 690 696 q 805 604 772 647 l 840 673 l 964 673 q 886 373 915 490 q 856 239 856 257 q 876 201 856 214 q 920 188 895 188 q 1084 284 1019 188 q 1150 511 1150 380 q 1051 779 1150 672 q 715 905 934 905 q 272 734 439 905 q 121 363 121 580 q 250 41 121 170 q 647 -103 394 -103 q 863 -67 751 -103 q 1061 26 975 -32 l 1115 -52 m 769 483 q 770 500 770 489 q 733 567 770 539 q 651 596 695 596 q 508 504 566 596 q 457 322 457 422 q 483 215 457 256 q 561 175 509 175 q 671 221 625 175 q 733 333 718 268 l 769 483 \"},\"Ί\":{\"x_min\":0,\"x_max\":619,\"ha\":732,\"o\":\"m 313 1035 l 98 780 l 0 780 l 136 1035 l 313 1035 m 619 0 l 411 0 l 411 1012 l 619 1012 l 619 0 \"},\"i\":{\"x_min\":14,\"x_max\":214,\"ha\":326,\"o\":\"m 214 830 l 14 830 l 14 1013 l 214 1013 l 214 830 m 214 0 l 14 0 l 14 748 l 214 748 l 214 0 \"},\"Β\":{\"x_min\":0,\"x_max\":835,\"ha\":961,\"o\":\"m 675 547 q 791 450 747 518 q 835 304 835 383 q 718 75 835 158 q 461 0 612 0 l 0 0 l 0 1013 l 477 1013 q 697 951 609 1013 q 797 754 797 880 q 766 630 797 686 q 675 547 734 575 m 439 621 q 539 646 496 621 q 590 730 590 676 q 537 814 590 785 q 436 838 494 838 l 199 838 l 199 621 l 439 621 m 445 182 q 561 211 513 182 q 618 311 618 247 q 565 410 618 375 q 444 446 512 446 l 199 446 l 199 182 l 445 182 \"},\"υ\":{\"x_min\":0,\"x_max\":656,\"ha\":767,\"o\":\"m 656 416 q 568 55 656 145 q 326 -25 490 -25 q 59 97 137 -25 q 0 369 0 191 l 0 749 l 200 749 l 200 369 q 216 222 200 268 q 326 142 245 142 q 440 247 411 142 q 456 422 456 304 l 456 749 l 656 749 l 656 416 \"},\"]\":{\"x_min\":0,\"x_max\":349,\"ha\":446,\"o\":\"m 349 -300 l 0 -300 l 0 -154 l 163 -154 l 163 866 l 0 866 l 0 1013 l 349 1013 l 349 -300 \"},\"m\":{\"x_min\":0,\"x_max\":1065,\"ha\":1174,\"o\":\"m 1065 0 l 866 0 l 866 483 q 836 564 866 532 q 759 596 807 596 q 663 555 700 596 q 627 454 627 514 l 627 0 l 433 0 l 433 481 q 403 563 433 531 q 323 596 374 596 q 231 554 265 596 q 197 453 197 513 l 197 0 l 0 0 l 0 748 l 189 748 l 189 665 q 279 745 226 715 q 392 775 333 775 q 509 744 455 775 q 606 659 563 713 q 695 744 640 713 q 814 775 749 775 q 992 702 920 775 q 1065 523 1065 630 l 1065 0 \"},\"χ\":{\"x_min\":0,\"x_max\":759.71875,\"ha\":847,\"o\":\"m 759 -299 l 548 -299 l 379 66 l 215 -299 l 0 -299 l 261 233 l 13 749 l 230 749 l 379 400 l 527 749 l 738 749 l 500 238 l 759 -299 \"},\"8\":{\"x_min\":57,\"x_max\":770,\"ha\":828,\"o\":\"m 625 516 q 733 416 697 477 q 770 284 770 355 q 675 69 770 161 q 415 -29 574 -29 q 145 65 244 -29 q 57 273 57 150 q 93 413 57 350 q 204 516 130 477 q 112 609 142 556 q 83 718 83 662 q 177 905 83 824 q 414 986 272 986 q 650 904 555 986 q 745 715 745 822 q 716 608 745 658 q 625 516 688 558 m 414 590 q 516 624 479 590 q 553 706 553 659 q 516 791 553 755 q 414 828 480 828 q 311 792 348 828 q 275 706 275 757 q 310 624 275 658 q 414 590 345 590 m 413 135 q 527 179 487 135 q 564 279 564 218 q 525 386 564 341 q 411 436 482 436 q 298 387 341 436 q 261 282 261 344 q 300 178 261 222 q 413 135 340 135 \"},\"ί\":{\"x_min\":42,\"x_max\":371.171875,\"ha\":389,\"o\":\"m 242 0 l 42 0 l 42 748 l 242 748 l 242 0 m 371 1039 l 169 823 l 71 823 l 193 1039 l 371 1039 \"},\"Ζ\":{\"x_min\":0,\"x_max\":804.171875,\"ha\":886,\"o\":\"m 804 835 l 251 182 l 793 182 l 793 0 l 0 0 l 0 176 l 551 829 l 11 829 l 11 1012 l 804 1012 l 804 835 \"},\"R\":{\"x_min\":0,\"x_max\":836.109375,\"ha\":947,\"o\":\"m 836 0 l 608 0 q 588 53 596 20 q 581 144 581 86 q 581 179 581 162 q 581 215 581 197 q 553 345 581 306 q 428 393 518 393 l 208 393 l 208 0 l 0 0 l 0 1013 l 491 1013 q 720 944 630 1013 q 819 734 819 869 q 778 584 819 654 q 664 485 738 513 q 757 415 727 463 q 794 231 794 358 l 794 170 q 800 84 794 116 q 836 31 806 51 l 836 0 m 462 838 l 208 838 l 208 572 l 452 572 q 562 604 517 572 q 612 704 612 640 q 568 801 612 765 q 462 838 525 838 \"},\"o\":{\"x_min\":0,\"x_max\":764,\"ha\":871,\"o\":\"m 380 -26 q 105 86 211 -26 q 0 371 0 199 q 104 660 0 545 q 380 775 209 775 q 658 659 552 775 q 764 371 764 544 q 658 86 764 199 q 380 -26 552 -26 m 379 141 q 515 216 466 141 q 557 373 557 280 q 515 530 557 465 q 379 607 466 607 q 245 530 294 607 q 204 373 204 465 q 245 217 204 282 q 379 141 294 141 \"},\"5\":{\"x_min\":59,\"x_max\":767,\"ha\":828,\"o\":\"m 767 319 q 644 59 767 158 q 382 -29 533 -29 q 158 43 247 -29 q 59 264 59 123 l 252 264 q 295 165 252 201 q 400 129 339 129 q 512 172 466 129 q 564 308 564 220 q 514 437 564 387 q 398 488 464 488 q 329 472 361 488 q 271 420 297 456 l 93 428 l 157 958 l 722 958 l 722 790 l 295 790 l 271 593 q 348 635 306 621 q 431 649 389 649 q 663 551 560 649 q 767 319 767 453 \"},\"7\":{\"x_min\":65.28125,\"x_max\":762.5,\"ha\":828,\"o\":\"m 762 808 q 521 435 604 626 q 409 0 438 244 l 205 0 q 313 422 227 234 q 548 789 387 583 l 65 789 l 65 958 l 762 958 l 762 808 \"},\"K\":{\"x_min\":0,\"x_max\":900,\"ha\":996,\"o\":\"m 900 0 l 647 0 l 316 462 l 208 355 l 208 0 l 0 0 l 0 1013 l 208 1013 l 208 595 l 604 1013 l 863 1013 l 461 603 l 900 0 \"},\",\":{\"x_min\":0,\"x_max\":206,\"ha\":303,\"o\":\"m 206 5 q 150 -151 206 -88 q 0 -238 94 -213 l 0 -159 q 84 -100 56 -137 q 111 -2 111 -62 l 0 -2 l 0 205 l 206 205 l 206 5 \"},\"d\":{\"x_min\":0,\"x_max\":722,\"ha\":836,\"o\":\"m 722 0 l 530 0 l 530 101 q 303 -26 449 -26 q 72 103 155 -26 q 0 373 0 214 q 72 642 0 528 q 305 775 156 775 q 433 743 373 775 q 530 656 492 712 l 530 1013 l 722 1013 l 722 0 m 361 600 q 234 523 280 600 q 196 372 196 458 q 233 220 196 286 q 358 143 278 143 q 489 216 442 143 q 530 369 530 280 q 491 522 530 456 q 361 600 443 600 \"},\"¨\":{\"x_min\":212,\"x_max\":609,\"ha\":933,\"o\":\"m 609 1046 l 453 1046 l 453 1216 l 609 1216 l 609 1046 m 369 1046 l 212 1046 l 212 1216 l 369 1216 l 369 1046 \"},\"E\":{\"x_min\":0,\"x_max\":761.109375,\"ha\":824,\"o\":\"m 761 0 l 0 0 l 0 1013 l 734 1013 l 734 837 l 206 837 l 206 621 l 690 621 l 690 446 l 206 446 l 206 186 l 761 186 l 761 0 \"},\"Y\":{\"x_min\":0,\"x_max\":836,\"ha\":931,\"o\":\"m 836 1013 l 532 376 l 532 0 l 322 0 l 322 376 l 0 1013 l 208 1013 l 427 576 l 626 1013 l 836 1013 \"},\"\\\"\":{\"x_min\":0,\"x_max\":357,\"ha\":454,\"o\":\"m 357 604 l 225 604 l 225 988 l 357 988 l 357 604 m 132 604 l 0 604 l 0 988 l 132 988 l 132 604 \"},\"‹\":{\"x_min\":35.984375,\"x_max\":791.671875,\"ha\":828,\"o\":\"m 791 17 l 36 352 l 35 487 l 791 823 l 791 672 l 229 421 l 791 168 l 791 17 \"},\"„\":{\"x_min\":0,\"x_max\":483,\"ha\":588,\"o\":\"m 206 5 q 150 -151 206 -88 q 0 -238 94 -213 l 0 -159 q 84 -100 56 -137 q 111 -2 111 -62 l 0 -2 l 0 205 l 206 205 l 206 5 m 483 5 q 427 -151 483 -88 q 277 -238 371 -213 l 277 -159 q 361 -100 334 -137 q 388 -2 388 -62 l 277 -2 l 277 205 l 483 205 l 483 5 \"},\"δ\":{\"x_min\":6,\"x_max\":732,\"ha\":835,\"o\":\"m 732 352 q 630 76 732 177 q 354 -25 529 -25 q 101 74 197 -25 q 6 333 6 174 q 89 581 6 480 q 323 690 178 690 q 66 864 201 787 l 66 1013 l 669 1013 l 669 856 l 348 856 q 532 729 461 789 q 673 566 625 651 q 732 352 732 465 m 419 551 q 259 496 321 551 q 198 344 198 441 q 238 208 198 267 q 357 140 283 140 q 484 203 437 140 q 526 344 526 260 q 499 466 526 410 q 419 551 473 521 \"},\"έ\":{\"x_min\":16.671875,\"x_max\":652.78125,\"ha\":742,\"o\":\"m 652 259 q 565 49 652 123 q 340 -25 479 -25 q 102 39 188 -25 q 16 197 16 104 q 45 299 16 250 q 134 390 75 348 q 58 456 86 419 q 25 552 25 502 q 120 717 25 653 q 322 776 208 776 q 537 710 456 776 q 625 508 625 639 l 445 508 q 415 585 445 563 q 327 608 386 608 q 254 590 293 608 q 215 544 215 573 q 252 469 215 490 q 336 453 280 453 q 369 455 347 453 q 400 456 391 456 l 400 308 l 329 308 q 247 291 280 308 q 204 223 204 269 q 255 154 204 172 q 345 143 286 143 q 426 174 398 143 q 454 259 454 206 l 652 259 m 579 1039 l 377 823 l 279 823 l 401 1039 l 579 1039 \"},\"ω\":{\"x_min\":0,\"x_max\":945,\"ha\":1051,\"o\":\"m 565 323 l 565 289 q 577 190 565 221 q 651 142 597 142 q 718 189 694 142 q 742 365 742 237 q 703 565 742 462 q 610 749 671 650 l 814 749 q 910 547 876 650 q 945 337 945 444 q 874 96 945 205 q 668 -29 793 -29 q 551 0 608 -29 q 470 78 495 30 q 390 0 444 28 q 276 -29 337 -29 q 69 96 149 -29 q 0 337 0 204 q 36 553 0 444 q 130 749 68 650 l 334 749 q 241 565 273 650 q 203 365 203 461 q 219 222 203 279 q 292 142 243 142 q 360 183 342 142 q 373 271 373 211 q 372 298 372 285 q 372 323 372 311 l 372 528 l 566 528 l 565 323 \"},\"´\":{\"x_min\":0,\"x_max\":132,\"ha\":299,\"o\":\"m 132 604 l 0 604 l 0 988 l 132 988 l 132 604 \"},\"±\":{\"x_min\":29,\"x_max\":798,\"ha\":828,\"o\":\"m 798 480 l 484 480 l 484 254 l 344 254 l 344 480 l 29 480 l 29 615 l 344 615 l 344 842 l 484 842 l 484 615 l 798 615 l 798 480 m 798 0 l 29 0 l 29 136 l 798 136 l 798 0 \"},\"|\":{\"x_min\":0,\"x_max\":143,\"ha\":240,\"o\":\"m 143 462 l 0 462 l 0 984 l 143 984 l 143 462 m 143 -242 l 0 -242 l 0 280 l 143 280 l 143 -242 \"},\"ϋ\":{\"x_min\":0,\"x_max\":656,\"ha\":767,\"o\":\"m 535 810 l 406 810 l 406 952 l 535 952 l 535 810 m 271 810 l 142 810 l 142 952 l 271 952 l 271 810 m 656 417 q 568 55 656 146 q 326 -25 490 -25 q 59 97 137 -25 q 0 369 0 192 l 0 748 l 200 748 l 200 369 q 216 222 200 268 q 326 142 245 142 q 440 247 411 142 q 456 422 456 304 l 456 748 l 656 748 l 656 417 \"},\"§\":{\"x_min\":0,\"x_max\":633,\"ha\":731,\"o\":\"m 633 469 q 601 356 633 406 q 512 274 569 305 q 570 197 548 242 q 593 105 593 152 q 501 -76 593 -5 q 301 -142 416 -142 q 122 -82 193 -142 q 43 108 43 -15 l 212 108 q 251 27 220 53 q 321 1 283 1 q 389 23 360 1 q 419 83 419 46 q 310 194 419 139 q 108 297 111 295 q 0 476 0 372 q 33 584 0 537 q 120 659 62 626 q 72 720 91 686 q 53 790 53 755 q 133 978 53 908 q 312 1042 207 1042 q 483 984 412 1042 q 574 807 562 921 l 409 807 q 379 875 409 851 q 307 900 349 900 q 244 881 270 900 q 218 829 218 862 q 324 731 218 781 q 524 636 506 647 q 633 469 633 565 m 419 334 q 473 411 473 372 q 451 459 473 436 q 390 502 430 481 l 209 595 q 167 557 182 577 q 153 520 153 537 q 187 461 153 491 q 263 413 212 440 l 419 334 \"},\"b\":{\"x_min\":0,\"x_max\":722,\"ha\":822,\"o\":\"m 416 -26 q 289 6 346 -26 q 192 101 232 39 l 192 0 l 0 0 l 0 1013 l 192 1013 l 192 656 q 286 743 226 712 q 415 775 346 775 q 649 644 564 775 q 722 374 722 533 q 649 106 722 218 q 416 -26 565 -26 m 361 600 q 232 524 279 600 q 192 371 192 459 q 229 221 192 284 q 357 145 275 145 q 487 221 441 145 q 526 374 526 285 q 488 523 526 460 q 361 600 442 600 \"},\"q\":{\"x_min\":0,\"x_max\":722,\"ha\":833,\"o\":\"m 722 -298 l 530 -298 l 530 97 q 306 -25 449 -25 q 73 104 159 -25 q 0 372 0 216 q 72 643 0 529 q 305 775 156 775 q 430 742 371 775 q 530 654 488 709 l 530 750 l 722 750 l 722 -298 m 360 601 q 234 527 278 601 q 197 378 197 466 q 233 225 197 291 q 357 144 277 144 q 488 217 441 144 q 530 370 530 282 q 491 523 530 459 q 360 601 443 601 \"},\"Ω\":{\"x_min\":-0.03125,\"x_max\":1008.53125,\"ha\":1108,\"o\":\"m 1008 0 l 589 0 l 589 199 q 717 368 670 265 q 764 580 764 471 q 698 778 764 706 q 504 855 629 855 q 311 773 380 855 q 243 563 243 691 q 289 360 243 458 q 419 199 336 262 l 419 0 l 0 0 l 0 176 l 202 176 q 77 355 123 251 q 32 569 32 459 q 165 908 32 776 q 505 1040 298 1040 q 844 912 711 1040 q 977 578 977 785 q 931 362 977 467 q 805 176 886 256 l 1008 176 l 1008 0 \"},\"ύ\":{\"x_min\":0,\"x_max\":656,\"ha\":767,\"o\":\"m 656 417 q 568 55 656 146 q 326 -25 490 -25 q 59 97 137 -25 q 0 369 0 192 l 0 748 l 200 748 l 201 369 q 218 222 201 269 q 326 142 245 142 q 440 247 411 142 q 456 422 456 304 l 456 748 l 656 748 l 656 417 m 579 1039 l 378 823 l 279 823 l 401 1039 l 579 1039 \"},\"z\":{\"x_min\":0,\"x_max\":663.890625,\"ha\":753,\"o\":\"m 663 0 l 0 0 l 0 154 l 411 591 l 25 591 l 25 749 l 650 749 l 650 584 l 245 165 l 663 165 l 663 0 \"},\"™\":{\"x_min\":0,\"x_max\":951,\"ha\":1063,\"o\":\"m 405 921 l 255 921 l 255 506 l 149 506 l 149 921 l 0 921 l 0 1013 l 405 1013 l 405 921 m 951 506 l 852 506 l 852 916 l 750 506 l 643 506 l 539 915 l 539 506 l 442 506 l 442 1013 l 595 1012 l 695 625 l 794 1013 l 951 1013 l 951 506 \"},\"ή\":{\"x_min\":0,\"x_max\":669,\"ha\":779,\"o\":\"m 669 -278 l 469 -278 l 469 390 q 448 526 469 473 q 348 606 417 606 q 244 553 288 606 q 201 441 201 501 l 201 0 l 0 0 l 0 749 l 201 749 l 201 665 q 301 744 244 715 q 423 774 359 774 q 606 685 538 774 q 669 484 669 603 l 669 -278 m 495 1039 l 293 823 l 195 823 l 317 1039 l 495 1039 \"},\"Θ\":{\"x_min\":0,\"x_max\":993,\"ha\":1092,\"o\":\"m 497 -29 q 133 127 272 -29 q 0 505 0 277 q 133 883 0 733 q 497 1040 272 1040 q 861 883 722 1040 q 993 505 993 733 q 861 127 993 277 q 497 -29 722 -29 m 497 154 q 711 266 631 154 q 782 506 782 367 q 712 746 782 648 q 497 858 634 858 q 281 746 361 858 q 211 506 211 648 q 280 266 211 365 q 497 154 359 154 m 676 430 l 316 430 l 316 593 l 676 593 l 676 430 \"},\"®\":{\"x_min\":3,\"x_max\":1007,\"ha\":1104,\"o\":\"m 507 -6 q 129 153 269 -6 q 3 506 3 298 q 127 857 3 713 q 502 1017 266 1017 q 880 855 740 1017 q 1007 502 1007 711 q 882 152 1007 295 q 507 -6 743 -6 m 502 934 q 184 800 302 934 q 79 505 79 680 q 184 210 79 331 q 501 76 302 76 q 819 210 701 76 q 925 507 925 331 q 820 800 925 682 q 502 934 704 934 m 782 190 l 639 190 q 627 225 632 202 q 623 285 623 248 l 623 326 q 603 411 623 384 q 527 439 584 439 l 388 439 l 388 190 l 257 190 l 257 829 l 566 829 q 709 787 654 829 q 772 654 772 740 q 746 559 772 604 q 675 497 720 514 q 735 451 714 483 q 756 341 756 419 l 756 299 q 760 244 756 265 q 782 212 764 223 l 782 190 m 546 718 l 388 718 l 388 552 l 541 552 q 612 572 584 552 q 641 635 641 593 q 614 695 641 672 q 546 718 587 718 \"},\"~\":{\"x_min\":0,\"x_max\":851,\"ha\":949,\"o\":\"m 851 968 q 795 750 851 831 q 599 656 730 656 q 406 744 506 656 q 259 832 305 832 q 162 775 193 832 q 139 656 139 730 l 0 656 q 58 871 0 787 q 251 968 124 968 q 442 879 341 968 q 596 791 544 791 q 691 849 663 791 q 712 968 712 892 l 851 968 \"},\"Ε\":{\"x_min\":0,\"x_max\":761.546875,\"ha\":824,\"o\":\"m 761 0 l 0 0 l 0 1012 l 735 1012 l 735 836 l 206 836 l 206 621 l 690 621 l 690 446 l 206 446 l 206 186 l 761 186 l 761 0 \"},\"³\":{\"x_min\":0,\"x_max\":467,\"ha\":564,\"o\":\"m 467 555 q 393 413 467 466 q 229 365 325 365 q 70 413 134 365 q 0 565 0 467 l 123 565 q 163 484 131 512 q 229 461 190 461 q 299 486 269 461 q 329 553 329 512 q 281 627 329 607 q 187 641 248 641 l 187 722 q 268 737 237 722 q 312 804 312 758 q 285 859 312 837 q 224 882 259 882 q 165 858 189 882 q 135 783 140 834 l 12 783 q 86 930 20 878 q 230 976 145 976 q 379 931 314 976 q 444 813 444 887 q 423 744 444 773 q 365 695 402 716 q 439 640 412 676 q 467 555 467 605 \"},\"[\":{\"x_min\":0,\"x_max\":347.21875,\"ha\":444,\"o\":\"m 347 -300 l 0 -300 l 0 1013 l 347 1013 l 347 866 l 188 866 l 188 -154 l 347 -154 l 347 -300 \"},\"L\":{\"x_min\":0,\"x_max\":704.171875,\"ha\":763,\"o\":\"m 704 0 l 0 0 l 0 1013 l 208 1013 l 208 186 l 704 186 l 704 0 \"},\"σ\":{\"x_min\":0,\"x_max\":851.3125,\"ha\":940,\"o\":\"m 851 594 l 712 594 q 761 369 761 485 q 658 83 761 191 q 379 -25 555 -25 q 104 87 208 -25 q 0 372 0 200 q 103 659 0 544 q 378 775 207 775 q 464 762 407 775 q 549 750 521 750 l 851 750 l 851 594 m 379 142 q 515 216 466 142 q 557 373 557 280 q 515 530 557 465 q 379 608 465 608 q 244 530 293 608 q 203 373 203 465 q 244 218 203 283 q 379 142 293 142 \"},\"ζ\":{\"x_min\":0,\"x_max\":622,\"ha\":701,\"o\":\"m 622 -32 q 604 -158 622 -98 q 551 -278 587 -218 l 373 -278 q 426 -180 406 -229 q 446 -80 446 -131 q 421 -22 446 -37 q 354 -8 397 -8 q 316 -9 341 -8 q 280 -11 291 -11 q 75 69 150 -11 q 0 283 0 150 q 87 596 0 437 q 291 856 162 730 l 47 856 l 47 1013 l 592 1013 l 592 904 q 317 660 422 800 q 197 318 197 497 q 306 141 197 169 q 510 123 408 131 q 622 -32 622 102 \"},\"θ\":{\"x_min\":0,\"x_max\":714,\"ha\":817,\"o\":\"m 357 1022 q 633 833 534 1022 q 714 486 714 679 q 634 148 714 288 q 354 -25 536 -25 q 79 147 175 -25 q 0 481 0 288 q 79 831 0 679 q 357 1022 177 1022 m 510 590 q 475 763 510 687 q 351 862 430 862 q 233 763 272 862 q 204 590 204 689 l 510 590 m 510 440 l 204 440 q 233 251 204 337 q 355 131 274 131 q 478 248 434 131 q 510 440 510 337 \"},\"Ο\":{\"x_min\":0,\"x_max\":995,\"ha\":1092,\"o\":\"m 497 -29 q 133 127 272 -29 q 0 505 0 277 q 132 883 0 733 q 497 1040 270 1040 q 861 883 722 1040 q 995 505 995 733 q 862 127 995 277 q 497 -29 724 -29 m 497 154 q 711 266 632 154 q 781 506 781 365 q 711 745 781 647 q 497 857 632 857 q 283 747 361 857 q 213 506 213 647 q 282 266 213 365 q 497 154 361 154 \"},\"Γ\":{\"x_min\":0,\"x_max\":703.84375,\"ha\":742,\"o\":\"m 703 836 l 208 836 l 208 0 l 0 0 l 0 1012 l 703 1012 l 703 836 \"},\" \":{\"x_min\":0,\"x_max\":0,\"ha\":375},\"%\":{\"x_min\":0,\"x_max\":1111,\"ha\":1213,\"o\":\"m 861 484 q 1048 404 979 484 q 1111 228 1111 332 q 1048 51 1111 123 q 859 -29 979 -29 q 672 50 740 -29 q 610 227 610 122 q 672 403 610 331 q 861 484 741 484 m 861 120 q 939 151 911 120 q 967 226 967 183 q 942 299 967 270 q 861 333 912 333 q 783 301 811 333 q 756 226 756 269 q 783 151 756 182 q 861 120 810 120 m 904 984 l 316 -28 l 205 -29 l 793 983 l 904 984 m 250 984 q 436 904 366 984 q 499 730 499 832 q 436 552 499 626 q 248 472 366 472 q 62 552 132 472 q 0 728 0 624 q 62 903 0 831 q 250 984 132 984 m 249 835 q 169 801 198 835 q 140 725 140 768 q 167 652 140 683 q 247 621 195 621 q 327 654 298 621 q 357 730 357 687 q 329 803 357 772 q 249 835 301 835 \"},\"P\":{\"x_min\":0,\"x_max\":771,\"ha\":838,\"o\":\"m 208 361 l 208 0 l 0 0 l 0 1013 l 450 1013 q 682 919 593 1013 q 771 682 771 826 q 687 452 771 544 q 466 361 604 361 l 208 361 m 421 837 l 208 837 l 208 544 l 410 544 q 525 579 480 544 q 571 683 571 615 q 527 792 571 747 q 421 837 484 837 \"},\"Έ\":{\"x_min\":0,\"x_max\":1172.546875,\"ha\":1235,\"o\":\"m 1172 0 l 411 0 l 411 1012 l 1146 1012 l 1146 836 l 617 836 l 617 621 l 1101 621 l 1101 446 l 617 446 l 617 186 l 1172 186 l 1172 0 m 313 1035 l 98 780 l 0 780 l 136 1035 l 313 1035 \"},\"Ώ\":{\"x_min\":0.4375,\"x_max\":1189.546875,\"ha\":1289,\"o\":\"m 1189 0 l 770 0 l 770 199 q 897 369 849 263 q 945 580 945 474 q 879 778 945 706 q 685 855 810 855 q 492 773 561 855 q 424 563 424 691 q 470 360 424 458 q 600 199 517 262 l 600 0 l 180 0 l 180 176 l 383 176 q 258 355 304 251 q 213 569 213 459 q 346 908 213 776 q 686 1040 479 1040 q 1025 912 892 1040 q 1158 578 1158 785 q 1112 362 1158 467 q 986 176 1067 256 l 1189 176 l 1189 0 m 314 1092 l 99 837 l 0 837 l 136 1092 l 314 1092 \"},\"_\":{\"x_min\":61.109375,\"x_max\":766.671875,\"ha\":828,\"o\":\"m 766 -333 l 61 -333 l 61 -190 l 766 -190 l 766 -333 \"},\"Ϊ\":{\"x_min\":-56,\"x_max\":342,\"ha\":503,\"o\":\"m 342 1046 l 186 1046 l 186 1215 l 342 1215 l 342 1046 m 101 1046 l -56 1046 l -56 1215 l 101 1215 l 101 1046 m 249 0 l 41 0 l 41 1012 l 249 1012 l 249 0 \"},\"+\":{\"x_min\":43,\"x_max\":784,\"ha\":828,\"o\":\"m 784 353 l 483 353 l 483 0 l 343 0 l 343 353 l 43 353 l 43 489 l 343 489 l 343 840 l 483 840 l 483 489 l 784 489 l 784 353 \"},\"½\":{\"x_min\":0,\"x_max\":1090,\"ha\":1188,\"o\":\"m 1090 380 q 992 230 1090 301 q 779 101 886 165 q 822 94 784 95 q 924 93 859 93 l 951 93 l 973 93 l 992 93 l 1009 93 q 1046 93 1027 93 q 1085 93 1066 93 l 1085 0 l 650 0 l 654 38 q 815 233 665 137 q 965 376 965 330 q 936 436 965 412 q 869 461 908 461 q 806 435 831 461 q 774 354 780 409 l 659 354 q 724 505 659 451 q 870 554 783 554 q 1024 506 958 554 q 1090 380 1090 459 m 868 998 l 268 -28 l 154 -27 l 757 999 l 868 998 m 272 422 l 147 422 l 147 799 l 0 799 l 0 875 q 126 900 91 875 q 170 973 162 926 l 272 973 l 272 422 \"},\"Ρ\":{\"x_min\":0,\"x_max\":771,\"ha\":838,\"o\":\"m 208 361 l 208 0 l 0 0 l 0 1012 l 450 1012 q 682 919 593 1012 q 771 681 771 826 q 687 452 771 544 q 466 361 604 361 l 208 361 m 422 836 l 209 836 l 209 544 l 410 544 q 525 579 480 544 q 571 683 571 614 q 527 791 571 747 q 422 836 484 836 \"},\"'\":{\"x_min\":0,\"x_max\":192,\"ha\":289,\"o\":\"m 192 834 q 137 692 192 751 q 0 626 82 632 l 0 697 q 101 830 101 726 l 0 830 l 0 1013 l 192 1013 l 192 834 \"},\"ª\":{\"x_min\":0,\"x_max\":350,\"ha\":393,\"o\":\"m 350 625 l 245 625 q 237 648 241 636 q 233 672 233 661 q 117 611 192 611 q 33 643 66 611 q 0 727 0 675 q 116 846 0 828 q 233 886 233 864 q 211 919 233 907 q 168 931 190 931 q 108 877 108 931 l 14 877 q 56 977 14 942 q 165 1013 98 1013 q 270 987 224 1013 q 329 903 329 955 l 329 694 q 332 661 329 675 q 350 641 336 648 l 350 625 m 233 774 l 233 809 q 151 786 180 796 q 97 733 97 768 q 111 700 97 712 q 149 689 126 689 q 210 713 187 689 q 233 774 233 737 \"},\"΅\":{\"x_min\":57,\"x_max\":584,\"ha\":753,\"o\":\"m 584 810 l 455 810 l 455 952 l 584 952 l 584 810 m 521 1064 l 305 810 l 207 810 l 343 1064 l 521 1064 m 186 810 l 57 810 l 57 952 l 186 952 l 186 810 \"},\"T\":{\"x_min\":0,\"x_max\":809,\"ha\":894,\"o\":\"m 809 831 l 509 831 l 509 0 l 299 0 l 299 831 l 0 831 l 0 1013 l 809 1013 l 809 831 \"},\"Φ\":{\"x_min\":0,\"x_max\":949,\"ha\":1032,\"o\":\"m 566 0 l 385 0 l 385 121 q 111 230 222 121 q 0 508 0 340 q 112 775 0 669 q 385 892 219 875 l 385 1013 l 566 1013 l 566 892 q 836 776 732 875 q 949 507 949 671 q 838 231 949 341 q 566 121 728 121 l 566 0 m 566 285 q 701 352 650 285 q 753 508 753 419 q 703 658 753 597 q 566 729 653 720 l 566 285 m 385 285 l 385 729 q 245 661 297 717 q 193 516 193 604 q 246 356 193 427 q 385 285 300 285 \"},\"j\":{\"x_min\":-45.828125,\"x_max\":242,\"ha\":361,\"o\":\"m 242 830 l 42 830 l 42 1013 l 242 1013 l 242 830 m 242 -119 q 180 -267 242 -221 q 20 -308 127 -308 l -45 -308 l -45 -140 l -24 -140 q 25 -130 8 -140 q 42 -88 42 -120 l 42 748 l 242 748 l 242 -119 \"},\"Σ\":{\"x_min\":0,\"x_max\":772.21875,\"ha\":849,\"o\":\"m 772 0 l 0 0 l 0 140 l 368 526 l 18 862 l 18 1012 l 740 1012 l 740 836 l 315 836 l 619 523 l 298 175 l 772 175 l 772 0 \"},\"1\":{\"x_min\":197.609375,\"x_max\":628,\"ha\":828,\"o\":\"m 628 0 l 434 0 l 434 674 l 197 674 l 197 810 q 373 837 318 810 q 468 984 450 876 l 628 984 l 628 0 \"},\"›\":{\"x_min\":36.109375,\"x_max\":792,\"ha\":828,\"o\":\"m 792 352 l 36 17 l 36 168 l 594 420 l 36 672 l 36 823 l 792 487 l 792 352 \"},\"<\":{\"x_min\":35.984375,\"x_max\":791.671875,\"ha\":828,\"o\":\"m 791 17 l 36 352 l 35 487 l 791 823 l 791 672 l 229 421 l 791 168 l 791 17 \"},\"£\":{\"x_min\":0,\"x_max\":716.546875,\"ha\":814,\"o\":\"m 716 38 q 603 -9 658 5 q 502 -24 548 -24 q 398 -10 451 -24 q 239 25 266 25 q 161 12 200 25 q 77 -29 122 0 l 0 113 q 110 211 81 174 q 151 315 151 259 q 117 440 151 365 l 0 440 l 0 515 l 73 515 q 35 610 52 560 q 15 710 15 671 q 119 910 15 831 q 349 984 216 984 q 570 910 480 984 q 693 668 674 826 l 501 668 q 455 791 501 746 q 353 830 414 830 q 256 795 298 830 q 215 705 215 760 q 249 583 215 655 q 283 515 266 548 l 479 515 l 479 440 l 309 440 q 316 394 313 413 q 319 355 319 374 q 287 241 319 291 q 188 135 263 205 q 262 160 225 152 q 332 168 298 168 q 455 151 368 168 q 523 143 500 143 q 588 152 558 143 q 654 189 617 162 l 716 38 \"},\"t\":{\"x_min\":0,\"x_max\":412,\"ha\":511,\"o\":\"m 412 -6 q 349 -8 391 -6 q 287 -11 307 -11 q 137 38 177 -11 q 97 203 97 87 l 97 609 l 0 609 l 0 749 l 97 749 l 97 951 l 297 951 l 297 749 l 412 749 l 412 609 l 297 609 l 297 191 q 315 152 297 162 q 366 143 334 143 q 389 143 378 143 q 412 143 400 143 l 412 -6 \"},\"¬\":{\"x_min\":0,\"x_max\":704,\"ha\":801,\"o\":\"m 704 93 l 551 93 l 551 297 l 0 297 l 0 450 l 704 450 l 704 93 \"},\"λ\":{\"x_min\":0,\"x_max\":701.390625,\"ha\":775,\"o\":\"m 701 0 l 491 0 l 345 444 l 195 0 l 0 0 l 238 697 l 131 1013 l 334 1013 l 701 0 \"},\"W\":{\"x_min\":0,\"x_max\":1291.671875,\"ha\":1399,\"o\":\"m 1291 1013 l 1002 0 l 802 0 l 645 777 l 490 0 l 288 0 l 0 1013 l 215 1013 l 388 298 l 534 1012 l 757 1013 l 904 299 l 1076 1013 l 1291 1013 \"},\">\":{\"x_min\":36.109375,\"x_max\":792,\"ha\":828,\"o\":\"m 792 352 l 36 17 l 36 168 l 594 420 l 36 672 l 36 823 l 792 487 l 792 352 \"},\"v\":{\"x_min\":0,\"x_max\":740.28125,\"ha\":828,\"o\":\"m 740 749 l 473 0 l 266 0 l 0 749 l 222 749 l 373 211 l 529 749 l 740 749 \"},\"τ\":{\"x_min\":0.28125,\"x_max\":618.734375,\"ha\":699,\"o\":\"m 618 593 l 409 593 l 409 0 l 210 0 l 210 593 l 0 593 l 0 749 l 618 749 l 618 593 \"},\"ξ\":{\"x_min\":0,\"x_max\":640,\"ha\":715,\"o\":\"m 640 -14 q 619 -157 640 -84 q 563 -299 599 -230 l 399 -299 q 442 -194 433 -223 q 468 -85 468 -126 q 440 -25 468 -41 q 368 -10 412 -10 q 333 -11 355 -10 q 302 -13 311 -13 q 91 60 179 -13 q 0 259 0 138 q 56 426 0 354 q 201 530 109 493 q 106 594 144 553 q 65 699 65 642 q 94 787 65 747 q 169 856 123 828 l 22 856 l 22 1013 l 597 1013 l 597 856 l 497 857 q 345 840 398 857 q 257 736 257 812 q 366 614 257 642 q 552 602 416 602 l 552 446 l 513 446 q 313 425 379 446 q 199 284 199 389 q 312 162 199 184 q 524 136 418 148 q 640 -14 640 105 \"},\"&\":{\"x_min\":-1,\"x_max\":910.109375,\"ha\":1007,\"o\":\"m 910 -1 l 676 -1 l 607 83 q 291 -47 439 -47 q 50 100 135 -47 q -1 273 -1 190 q 51 431 -1 357 q 218 568 104 505 q 151 661 169 629 q 120 769 120 717 q 201 951 120 885 q 382 1013 276 1013 q 555 957 485 1013 q 635 789 635 894 q 584 644 635 709 q 468 539 548 597 l 615 359 q 664 527 654 440 l 844 527 q 725 223 824 359 l 910 -1 m 461 787 q 436 848 461 826 q 381 870 412 870 q 325 849 349 870 q 301 792 301 829 q 324 719 301 757 q 372 660 335 703 q 430 714 405 680 q 461 787 461 753 m 500 214 l 318 441 q 198 286 198 363 q 225 204 198 248 q 347 135 268 135 q 425 153 388 135 q 500 214 462 172 \"},\"Λ\":{\"x_min\":0,\"x_max\":894.453125,\"ha\":974,\"o\":\"m 894 0 l 666 0 l 447 757 l 225 0 l 0 0 l 344 1013 l 547 1013 l 894 0 \"},\"I\":{\"x_min\":41,\"x_max\":249,\"ha\":365,\"o\":\"m 249 0 l 41 0 l 41 1013 l 249 1013 l 249 0 \"},\"G\":{\"x_min\":0,\"x_max\":971,\"ha\":1057,\"o\":\"m 971 -1 l 829 -1 l 805 118 q 479 -29 670 -29 q 126 133 261 -29 q 0 509 0 286 q 130 884 0 737 q 493 1040 268 1040 q 790 948 659 1040 q 961 698 920 857 l 736 698 q 643 813 709 769 q 500 857 578 857 q 285 746 364 857 q 213 504 213 644 q 285 263 213 361 q 505 154 365 154 q 667 217 598 154 q 761 374 736 280 l 548 374 l 548 548 l 971 548 l 971 -1 \"},\"ΰ\":{\"x_min\":0,\"x_max\":655,\"ha\":767,\"o\":\"m 583 810 l 454 810 l 454 952 l 583 952 l 583 810 m 186 810 l 57 809 l 57 952 l 186 952 l 186 810 m 516 1039 l 315 823 l 216 823 l 338 1039 l 516 1039 m 655 417 q 567 55 655 146 q 326 -25 489 -25 q 59 97 137 -25 q 0 369 0 192 l 0 748 l 200 748 l 201 369 q 218 222 201 269 q 326 142 245 142 q 439 247 410 142 q 455 422 455 304 l 455 748 l 655 748 l 655 417 \"},\"`\":{\"x_min\":0,\"x_max\":190,\"ha\":288,\"o\":\"m 190 654 l 0 654 l 0 830 q 55 970 0 909 q 190 1040 110 1031 l 190 969 q 111 922 134 952 q 88 836 88 892 l 190 836 l 190 654 \"},\"·\":{\"x_min\":0,\"x_max\":207,\"ha\":304,\"o\":\"m 207 528 l 0 528 l 0 735 l 207 735 l 207 528 \"},\"Υ\":{\"x_min\":-0.21875,\"x_max\":836.171875,\"ha\":914,\"o\":\"m 836 1013 l 532 376 l 532 0 l 322 0 l 322 376 l 0 1013 l 208 1013 l 427 576 l 626 1013 l 836 1013 \"},\"r\":{\"x_min\":0,\"x_max\":431.9375,\"ha\":513,\"o\":\"m 431 564 q 269 536 320 564 q 200 395 200 498 l 200 0 l 0 0 l 0 748 l 183 748 l 183 618 q 285 731 224 694 q 431 768 345 768 l 431 564 \"},\"x\":{\"x_min\":0,\"x_max\":738.890625,\"ha\":826,\"o\":\"m 738 0 l 504 0 l 366 238 l 230 0 l 0 0 l 252 382 l 11 749 l 238 749 l 372 522 l 502 749 l 725 749 l 488 384 l 738 0 \"},\"μ\":{\"x_min\":0,\"x_max\":647,\"ha\":754,\"o\":\"m 647 0 l 477 0 l 477 68 q 411 9 448 30 q 330 -11 374 -11 q 261 3 295 -11 q 199 43 226 18 l 199 -278 l 0 -278 l 0 749 l 199 749 l 199 358 q 216 222 199 268 q 322 152 244 152 q 435 240 410 152 q 448 401 448 283 l 448 749 l 647 749 l 647 0 \"},\"h\":{\"x_min\":0,\"x_max\":669,\"ha\":782,\"o\":\"m 669 0 l 469 0 l 469 390 q 449 526 469 472 q 353 607 420 607 q 248 554 295 607 q 201 441 201 501 l 201 0 l 0 0 l 0 1013 l 201 1013 l 201 665 q 303 743 245 715 q 425 772 362 772 q 609 684 542 772 q 669 484 669 605 l 669 0 \"},\".\":{\"x_min\":0,\"x_max\":206,\"ha\":303,\"o\":\"m 206 0 l 0 0 l 0 207 l 206 207 l 206 0 \"},\"φ\":{\"x_min\":-1,\"x_max\":921,\"ha\":990,\"o\":\"m 542 -278 l 367 -278 l 367 -22 q 99 92 200 -22 q -1 376 -1 206 q 72 627 -1 520 q 288 769 151 742 l 288 581 q 222 495 243 550 q 202 378 202 439 q 240 228 202 291 q 367 145 285 157 l 367 776 l 515 776 q 807 667 694 776 q 921 379 921 558 q 815 93 921 209 q 542 -22 709 -22 l 542 -278 m 542 145 q 672 225 625 145 q 713 381 713 291 q 671 536 713 470 q 542 611 624 611 l 542 145 \"},\";\":{\"x_min\":0,\"x_max\":208,\"ha\":306,\"o\":\"m 208 528 l 0 528 l 0 735 l 208 735 l 208 528 m 208 6 q 152 -151 208 -89 q 0 -238 96 -212 l 0 -158 q 87 -100 61 -136 q 113 0 113 -65 l 0 0 l 0 207 l 208 207 l 208 6 \"},\"f\":{\"x_min\":0,\"x_max\":424,\"ha\":525,\"o\":\"m 424 609 l 300 609 l 300 0 l 107 0 l 107 609 l 0 609 l 0 749 l 107 749 q 145 949 107 894 q 328 1019 193 1019 l 424 1015 l 424 855 l 362 855 q 312 841 324 855 q 300 797 300 827 q 300 773 300 786 q 300 749 300 761 l 424 749 l 424 609 \"},\"“\":{\"x_min\":0,\"x_max\":468,\"ha\":567,\"o\":\"m 190 631 l 0 631 l 0 807 q 55 947 0 885 q 190 1017 110 1010 l 190 947 q 88 813 88 921 l 190 813 l 190 631 m 468 631 l 278 631 l 278 807 q 333 947 278 885 q 468 1017 388 1010 l 468 947 q 366 813 366 921 l 468 813 l 468 631 \"},\"A\":{\"x_min\":0,\"x_max\":966.671875,\"ha\":1069,\"o\":\"m 966 0 l 747 0 l 679 208 l 286 208 l 218 0 l 0 0 l 361 1013 l 600 1013 l 966 0 m 623 376 l 480 810 l 340 376 l 623 376 \"},\"6\":{\"x_min\":57,\"x_max\":771,\"ha\":828,\"o\":\"m 744 734 l 544 734 q 500 802 533 776 q 425 828 466 828 q 315 769 359 828 q 264 571 264 701 q 451 638 343 638 q 691 537 602 638 q 771 315 771 449 q 683 79 771 176 q 420 -29 586 -29 q 134 123 227 -29 q 57 455 57 250 q 184 865 57 721 q 452 988 293 988 q 657 916 570 988 q 744 734 744 845 m 426 128 q 538 178 498 128 q 578 300 578 229 q 538 422 578 372 q 415 479 493 479 q 303 430 342 479 q 264 313 264 381 q 308 184 264 240 q 426 128 352 128 \"},\"‘\":{\"x_min\":0,\"x_max\":190,\"ha\":289,\"o\":\"m 190 631 l 0 631 l 0 807 q 55 947 0 885 q 190 1017 110 1010 l 190 947 q 88 813 88 921 l 190 813 l 190 631 \"},\"ϊ\":{\"x_min\":-55,\"x_max\":337,\"ha\":389,\"o\":\"m 337 810 l 208 810 l 208 952 l 337 952 l 337 810 m 74 810 l -55 810 l -55 952 l 74 952 l 74 810 m 242 0 l 42 0 l 42 748 l 242 748 l 242 0 \"},\"π\":{\"x_min\":0.5,\"x_max\":838.890625,\"ha\":938,\"o\":\"m 838 593 l 750 593 l 750 0 l 549 0 l 549 593 l 287 593 l 287 0 l 88 0 l 88 593 l 0 593 l 0 749 l 838 749 l 838 593 \"},\"ά\":{\"x_min\":-1,\"x_max\":722,\"ha\":835,\"o\":\"m 722 0 l 531 0 l 530 101 q 433 8 491 41 q 304 -25 375 -25 q 72 104 157 -25 q -1 372 -1 216 q 72 643 -1 530 q 308 775 158 775 q 433 744 375 775 q 528 656 491 713 l 528 749 l 722 749 l 722 0 m 361 601 q 233 527 277 601 q 196 375 196 464 q 232 224 196 288 q 358 144 277 144 q 487 217 441 144 q 528 370 528 281 q 489 523 528 457 q 361 601 443 601 m 579 1039 l 377 823 l 279 823 l 401 1039 l 579 1039 \"},\"O\":{\"x_min\":0,\"x_max\":994,\"ha\":1094,\"o\":\"m 497 -29 q 133 127 272 -29 q 0 505 0 277 q 131 883 0 733 q 497 1040 270 1040 q 860 883 721 1040 q 994 505 994 733 q 862 127 994 277 q 497 -29 723 -29 m 497 154 q 710 266 631 154 q 780 506 780 365 q 710 745 780 647 q 497 857 631 857 q 283 747 361 857 q 213 506 213 647 q 282 266 213 365 q 497 154 361 154 \"},\"n\":{\"x_min\":0,\"x_max\":669,\"ha\":782,\"o\":\"m 669 0 l 469 0 l 469 452 q 442 553 469 513 q 352 601 412 601 q 245 553 290 601 q 200 441 200 505 l 200 0 l 0 0 l 0 748 l 194 748 l 194 659 q 289 744 230 713 q 416 775 349 775 q 600 700 531 775 q 669 509 669 626 l 669 0 \"},\"3\":{\"x_min\":61,\"x_max\":767,\"ha\":828,\"o\":\"m 767 290 q 653 51 767 143 q 402 -32 548 -32 q 168 48 262 -32 q 61 300 61 140 l 250 300 q 298 173 250 219 q 405 132 343 132 q 514 169 471 132 q 563 282 563 211 q 491 405 563 369 q 343 432 439 432 l 343 568 q 472 592 425 568 q 534 701 534 626 q 493 793 534 758 q 398 829 453 829 q 306 789 344 829 q 268 669 268 749 l 80 669 q 182 909 80 823 q 410 986 274 986 q 633 916 540 986 q 735 719 735 840 q 703 608 735 656 q 615 522 672 561 q 727 427 687 486 q 767 290 767 369 \"},\"9\":{\"x_min\":58,\"x_max\":769,\"ha\":828,\"o\":\"m 769 492 q 646 90 769 232 q 384 -33 539 -33 q 187 35 271 -33 q 83 224 98 107 l 282 224 q 323 154 286 182 q 404 127 359 127 q 513 182 471 127 q 563 384 563 248 q 475 335 532 355 q 372 315 418 315 q 137 416 224 315 q 58 642 58 507 q 144 877 58 781 q 407 984 239 984 q 694 827 602 984 q 769 492 769 699 m 416 476 q 525 521 488 476 q 563 632 563 566 q 521 764 563 709 q 403 826 474 826 q 297 773 337 826 q 258 649 258 720 q 295 530 258 577 q 416 476 339 476 \"},\"l\":{\"x_min\":41,\"x_max\":240,\"ha\":363,\"o\":\"m 240 0 l 41 0 l 41 1013 l 240 1013 l 240 0 \"},\"¤\":{\"x_min\":40.265625,\"x_max\":727.203125,\"ha\":825,\"o\":\"m 727 792 l 594 659 q 620 552 620 609 q 598 459 620 504 l 725 331 l 620 224 l 491 352 q 382 331 443 331 q 273 352 322 331 l 144 224 l 40 330 l 167 459 q 147 552 147 501 q 172 658 147 608 l 40 794 l 147 898 l 283 759 q 383 776 330 776 q 482 759 434 776 l 620 898 l 727 792 m 383 644 q 308 617 334 644 q 283 551 283 590 q 309 489 283 517 q 381 462 335 462 q 456 488 430 462 q 482 554 482 515 q 455 616 482 588 q 383 644 429 644 \"},\"κ\":{\"x_min\":0,\"x_max\":691.84375,\"ha\":779,\"o\":\"m 691 0 l 479 0 l 284 343 l 196 252 l 196 0 l 0 0 l 0 749 l 196 749 l 196 490 l 440 749 l 677 749 l 416 479 l 691 0 \"},\"4\":{\"x_min\":53,\"x_max\":775.21875,\"ha\":828,\"o\":\"m 775 213 l 660 213 l 660 0 l 470 0 l 470 213 l 53 213 l 53 384 l 416 958 l 660 958 l 660 370 l 775 370 l 775 213 m 474 364 l 474 786 l 204 363 l 474 364 \"},\"p\":{\"x_min\":0,\"x_max\":722,\"ha\":824,\"o\":\"m 415 -26 q 287 4 346 -26 q 192 92 228 34 l 192 -298 l 0 -298 l 0 750 l 192 750 l 192 647 q 289 740 230 706 q 416 775 347 775 q 649 645 566 775 q 722 375 722 534 q 649 106 722 218 q 415 -26 564 -26 m 363 603 q 232 529 278 603 q 192 375 192 465 q 230 222 192 286 q 360 146 276 146 q 487 221 441 146 q 526 371 526 285 q 488 523 526 458 q 363 603 443 603 \"},\"‡\":{\"x_min\":0,\"x_max\":809,\"ha\":894,\"o\":\"m 299 621 l 0 621 l 0 804 l 299 804 l 299 1011 l 509 1011 l 509 804 l 809 804 l 809 621 l 509 621 l 509 387 l 809 387 l 809 205 l 509 205 l 509 0 l 299 0 l 299 205 l 0 205 l 0 387 l 299 387 l 299 621 \"},\"ψ\":{\"x_min\":0,\"x_max\":875,\"ha\":979,\"o\":\"m 522 142 q 657 274 620 163 q 671 352 671 316 l 671 748 l 875 748 l 875 402 q 806 134 875 240 q 525 -22 719 -1 l 525 -278 l 349 -278 l 349 -22 q 65 135 152 -1 q 0 402 0 238 l 0 748 l 204 748 l 204 352 q 231 240 204 295 q 353 142 272 159 l 353 922 l 524 922 l 522 142 \"},\"η\":{\"x_min\":0,\"x_max\":669,\"ha\":779,\"o\":\"m 669 -278 l 469 -278 l 469 390 q 448 526 469 473 q 348 606 417 606 q 244 553 288 606 q 201 441 201 501 l 201 0 l 0 0 l 0 749 l 201 749 l 201 665 q 301 744 244 715 q 423 774 359 774 q 606 685 538 774 q 669 484 669 603 l 669 -278 \"}},\"cssFontWeight\":\"bold\",\"ascender\":1216,\"underlinePosition\":-100,\"cssFontStyle\":\"normal\",\"boundingBox\":{\"yMin\":-333,\"xMin\":-162,\"yMax\":1216,\"xMax\":1681},\"resolution\":1000,\"original_font_information\":{\"postscript_name\":\"Helvetiker-Bold\",\"version_string\":\"Version 1.00 2004 initial release\",\"vendor_url\":\"http://www.magenta.gr\",\"full_font_name\":\"Helvetiker Bold\",\"font_family_name\":\"Helvetiker\",\"copyright\":\"Copyright (c) Magenta ltd, 2004.\",\"description\":\"\",\"trademark\":\"\",\"designer\":\"\",\"designer_url\":\"\",\"unique_font_identifier\":\"Magenta ltd:Helvetiker Bold:22-10-104\",\"license_url\":\"http://www.ellak.gr/fonts/MgOpen/license.html\",\"license_description\":\"Copyright (c) 2004 by MAGENTA Ltd. All Rights Reserved.\\r\\n\\r\\nPermission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license (\\\"Fonts\\\") and associated documentation files (the \\\"Font Software\\\"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: \\r\\n\\r\\nThe above copyright and this permission notice shall be included in all copies of one or more of the Font Software typefaces.\\r\\n\\r\\nThe Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing the word \\\"MgOpen\\\", or if the modifications are accepted for inclusion in the Font Software itself by the each appointed Administrator.\\r\\n\\r\\nThis License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the \\\"MgOpen\\\" name.\\r\\n\\r\\nThe Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. \\r\\n\\r\\nTHE FONT SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL MAGENTA OR PERSONS OR BODIES IN CHARGE OF ADMINISTRATION AND MAINTENANCE OF THE FONT SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.\",\"manufacturer_name\":\"Magenta ltd\",\"font_sub_family_name\":\"Bold\"},\"descender\":-334,\"familyName\":\"Helvetiker\",\"lineHeight\":1549,\"underlineThickness\":50});"
  },
  {
    "path": "browser/data/fonts/helvetiker_regular.typeface.js",
    "content": "if (_typeface_js && _typeface_js.loadFace) _typeface_js.loadFace({\"glyphs\":{\"ο\":{\"x_min\":0,\"x_max\":712,\"ha\":815,\"o\":\"m 356 -25 q 96 88 192 -25 q 0 368 0 201 q 92 642 0 533 q 356 761 192 761 q 617 644 517 761 q 712 368 712 533 q 619 91 712 201 q 356 -25 520 -25 m 356 85 q 527 175 465 85 q 583 369 583 255 q 528 562 583 484 q 356 651 466 651 q 189 560 250 651 q 135 369 135 481 q 187 177 135 257 q 356 85 250 85 \"},\"S\":{\"x_min\":0,\"x_max\":788,\"ha\":890,\"o\":\"m 788 291 q 662 54 788 144 q 397 -26 550 -26 q 116 68 226 -26 q 0 337 0 168 l 131 337 q 200 152 131 220 q 384 85 269 85 q 557 129 479 85 q 650 270 650 183 q 490 429 650 379 q 194 513 341 470 q 33 739 33 584 q 142 964 33 881 q 388 1041 242 1041 q 644 957 543 1041 q 756 716 756 867 l 625 716 q 561 874 625 816 q 395 933 497 933 q 243 891 309 933 q 164 759 164 841 q 325 609 164 656 q 625 526 475 568 q 788 291 788 454 \"},\"¦\":{\"x_min\":343,\"x_max\":449,\"ha\":792,\"o\":\"m 449 462 l 343 462 l 343 986 l 449 986 l 449 462 m 449 -242 l 343 -242 l 343 280 l 449 280 l 449 -242 \"},\"/\":{\"x_min\":183.25,\"x_max\":608.328125,\"ha\":792,\"o\":\"m 608 1041 l 266 -129 l 183 -129 l 520 1041 l 608 1041 \"},\"Τ\":{\"x_min\":-0.4375,\"x_max\":777.453125,\"ha\":839,\"o\":\"m 777 893 l 458 893 l 458 0 l 319 0 l 319 892 l 0 892 l 0 1013 l 777 1013 l 777 893 \"},\"y\":{\"x_min\":0,\"x_max\":684.78125,\"ha\":771,\"o\":\"m 684 738 l 388 -83 q 311 -216 356 -167 q 173 -279 252 -279 q 97 -266 133 -279 l 97 -149 q 132 -155 109 -151 q 168 -160 155 -160 q 240 -114 213 -160 q 274 -26 248 -98 l 0 738 l 137 737 l 341 139 l 548 737 l 684 738 \"},\"Π\":{\"x_min\":0,\"x_max\":803,\"ha\":917,\"o\":\"m 803 0 l 667 0 l 667 886 l 140 886 l 140 0 l 0 0 l 0 1012 l 803 1012 l 803 0 \"},\"ΐ\":{\"x_min\":-111,\"x_max\":339,\"ha\":361,\"o\":\"m 339 800 l 229 800 l 229 925 l 339 925 l 339 800 m -1 800 l -111 800 l -111 925 l -1 925 l -1 800 m 284 3 q 233 -10 258 -5 q 182 -15 207 -15 q 85 26 119 -15 q 42 200 42 79 l 42 737 l 167 737 l 168 215 q 172 141 168 157 q 226 101 183 101 q 248 103 239 101 q 284 112 257 104 l 284 3 m 302 1040 l 113 819 l 30 819 l 165 1040 l 302 1040 \"},\"g\":{\"x_min\":0,\"x_max\":686,\"ha\":838,\"o\":\"m 686 34 q 586 -213 686 -121 q 331 -306 487 -306 q 131 -252 216 -306 q 31 -84 31 -190 l 155 -84 q 228 -174 166 -138 q 345 -207 284 -207 q 514 -109 454 -207 q 564 89 564 -27 q 461 6 521 36 q 335 -23 401 -23 q 88 100 184 -23 q 0 370 0 215 q 87 634 0 522 q 330 758 183 758 q 457 728 398 758 q 564 644 515 699 l 564 737 l 686 737 l 686 34 m 582 367 q 529 560 582 481 q 358 652 468 652 q 189 561 250 652 q 135 369 135 482 q 189 176 135 255 q 361 85 251 85 q 529 176 468 85 q 582 367 582 255 \"},\"²\":{\"x_min\":0,\"x_max\":442,\"ha\":539,\"o\":\"m 442 383 l 0 383 q 91 566 0 492 q 260 668 176 617 q 354 798 354 727 q 315 875 354 845 q 227 905 277 905 q 136 869 173 905 q 99 761 99 833 l 14 761 q 82 922 14 864 q 232 974 141 974 q 379 926 316 974 q 442 797 442 878 q 351 635 442 704 q 183 539 321 611 q 92 455 92 491 l 442 455 l 442 383 \"},\"–\":{\"x_min\":0,\"x_max\":705.5625,\"ha\":803,\"o\":\"m 705 334 l 0 334 l 0 410 l 705 410 l 705 334 \"},\"Κ\":{\"x_min\":0,\"x_max\":819.5625,\"ha\":893,\"o\":\"m 819 0 l 650 0 l 294 509 l 139 356 l 139 0 l 0 0 l 0 1013 l 139 1013 l 139 526 l 626 1013 l 809 1013 l 395 600 l 819 0 \"},\"ƒ\":{\"x_min\":-46.265625,\"x_max\":392,\"ha\":513,\"o\":\"m 392 651 l 259 651 l 79 -279 l -46 -278 l 134 651 l 14 651 l 14 751 l 135 751 q 151 948 135 900 q 304 1041 185 1041 q 334 1040 319 1041 q 392 1034 348 1039 l 392 922 q 337 931 360 931 q 271 883 287 931 q 260 793 260 853 l 260 751 l 392 751 l 392 651 \"},\"e\":{\"x_min\":0,\"x_max\":714,\"ha\":813,\"o\":\"m 714 326 l 140 326 q 200 157 140 227 q 359 87 260 87 q 488 130 431 87 q 561 245 545 174 l 697 245 q 577 48 670 123 q 358 -26 484 -26 q 97 85 195 -26 q 0 363 0 197 q 94 642 0 529 q 358 765 195 765 q 626 627 529 765 q 714 326 714 503 m 576 429 q 507 583 564 522 q 355 650 445 650 q 206 583 266 650 q 140 429 152 522 l 576 429 \"},\"ό\":{\"x_min\":0,\"x_max\":712,\"ha\":815,\"o\":\"m 356 -25 q 94 91 194 -25 q 0 368 0 202 q 92 642 0 533 q 356 761 192 761 q 617 644 517 761 q 712 368 712 533 q 619 91 712 201 q 356 -25 520 -25 m 356 85 q 527 175 465 85 q 583 369 583 255 q 528 562 583 484 q 356 651 466 651 q 189 560 250 651 q 135 369 135 481 q 187 177 135 257 q 356 85 250 85 m 576 1040 l 387 819 l 303 819 l 438 1040 l 576 1040 \"},\"J\":{\"x_min\":0,\"x_max\":588,\"ha\":699,\"o\":\"m 588 279 q 287 -26 588 -26 q 58 73 126 -26 q 0 327 0 158 l 133 327 q 160 172 133 227 q 288 96 198 96 q 426 171 391 96 q 449 336 449 219 l 449 1013 l 588 1013 l 588 279 \"},\"»\":{\"x_min\":-1,\"x_max\":503,\"ha\":601,\"o\":\"m 503 302 l 280 136 l 281 256 l 429 373 l 281 486 l 280 608 l 503 440 l 503 302 m 221 302 l 0 136 l 0 255 l 145 372 l 0 486 l -1 608 l 221 440 l 221 302 \"},\"©\":{\"x_min\":-3,\"x_max\":1008,\"ha\":1106,\"o\":\"m 502 -7 q 123 151 263 -7 q -3 501 -3 294 q 123 851 -3 706 q 502 1011 263 1011 q 881 851 739 1011 q 1008 501 1008 708 q 883 151 1008 292 q 502 -7 744 -7 m 502 60 q 830 197 709 60 q 940 501 940 322 q 831 805 940 681 q 502 944 709 944 q 174 805 296 944 q 65 501 65 680 q 173 197 65 320 q 502 60 294 60 m 741 394 q 661 246 731 302 q 496 190 591 190 q 294 285 369 190 q 228 497 228 370 q 295 714 228 625 q 499 813 370 813 q 656 762 588 813 q 733 625 724 711 l 634 625 q 589 704 629 673 q 498 735 550 735 q 377 666 421 735 q 334 504 334 597 q 374 340 334 408 q 490 272 415 272 q 589 304 549 272 q 638 394 628 337 l 741 394 \"},\"ώ\":{\"x_min\":0,\"x_max\":922,\"ha\":1030,\"o\":\"m 687 1040 l 498 819 l 415 819 l 549 1040 l 687 1040 m 922 339 q 856 97 922 203 q 650 -26 780 -26 q 538 9 587 -26 q 461 103 489 44 q 387 12 436 46 q 277 -22 339 -22 q 69 97 147 -22 q 0 338 0 202 q 45 551 0 444 q 161 737 84 643 l 302 737 q 175 552 219 647 q 124 336 124 446 q 155 179 124 248 q 275 88 197 88 q 375 163 341 88 q 400 294 400 219 l 400 572 l 524 572 l 524 294 q 561 135 524 192 q 643 88 591 88 q 762 182 719 88 q 797 341 797 257 q 745 555 797 450 q 619 737 705 637 l 760 737 q 874 551 835 640 q 922 339 922 444 \"},\"^\":{\"x_min\":193.0625,\"x_max\":598.609375,\"ha\":792,\"o\":\"m 598 772 l 515 772 l 395 931 l 277 772 l 193 772 l 326 1013 l 462 1013 l 598 772 \"},\"«\":{\"x_min\":0,\"x_max\":507.203125,\"ha\":604,\"o\":\"m 506 136 l 284 302 l 284 440 l 506 608 l 507 485 l 360 371 l 506 255 l 506 136 m 222 136 l 0 302 l 0 440 l 222 608 l 221 486 l 73 373 l 222 256 l 222 136 \"},\"D\":{\"x_min\":0,\"x_max\":828,\"ha\":935,\"o\":\"m 389 1013 q 714 867 593 1013 q 828 521 828 729 q 712 161 828 309 q 382 0 587 0 l 0 0 l 0 1013 l 389 1013 m 376 124 q 607 247 523 124 q 681 510 681 355 q 607 771 681 662 q 376 896 522 896 l 139 896 l 139 124 l 376 124 \"},\"∙\":{\"x_min\":0,\"x_max\":142,\"ha\":239,\"o\":\"m 142 585 l 0 585 l 0 738 l 142 738 l 142 585 \"},\"ÿ\":{\"x_min\":0,\"x_max\":47,\"ha\":125,\"o\":\"m 47 3 q 37 -7 47 -7 q 28 0 30 -7 q 39 -4 32 -4 q 45 3 45 -1 l 37 0 q 28 9 28 0 q 39 19 28 19 l 47 16 l 47 19 l 47 3 m 37 1 q 44 8 44 1 q 37 16 44 16 q 30 8 30 16 q 37 1 30 1 m 26 1 l 23 22 l 14 0 l 3 22 l 3 3 l 0 25 l 13 1 l 22 25 l 26 1 \"},\"w\":{\"x_min\":0,\"x_max\":1009.71875,\"ha\":1100,\"o\":\"m 1009 738 l 783 0 l 658 0 l 501 567 l 345 0 l 222 0 l 0 738 l 130 738 l 284 174 l 432 737 l 576 738 l 721 173 l 881 737 l 1009 738 \"},\"$\":{\"x_min\":0,\"x_max\":700,\"ha\":793,\"o\":\"m 664 717 l 542 717 q 490 825 531 785 q 381 872 450 865 l 381 551 q 620 446 540 522 q 700 241 700 370 q 618 45 700 116 q 381 -25 536 -25 l 381 -152 l 307 -152 l 307 -25 q 81 62 162 -25 q 0 297 0 149 l 124 297 q 169 146 124 204 q 307 81 215 89 l 307 441 q 80 536 148 469 q 13 725 13 603 q 96 910 13 839 q 307 982 180 982 l 307 1077 l 381 1077 l 381 982 q 574 917 494 982 q 664 717 664 845 m 307 565 l 307 872 q 187 831 233 872 q 142 724 142 791 q 180 618 142 656 q 307 565 218 580 m 381 76 q 562 237 562 96 q 517 361 562 313 q 381 423 472 409 l 381 76 \"},\"\\\\\":{\"x_min\":-0.015625,\"x_max\":425.0625,\"ha\":522,\"o\":\"m 425 -129 l 337 -129 l 0 1041 l 83 1041 l 425 -129 \"},\"µ\":{\"x_min\":0,\"x_max\":697.21875,\"ha\":747,\"o\":\"m 697 -4 q 629 -14 658 -14 q 498 97 513 -14 q 422 9 470 41 q 313 -23 374 -23 q 207 4 258 -23 q 119 81 156 32 l 119 -278 l 0 -278 l 0 738 l 124 738 l 124 343 q 165 173 124 246 q 308 83 216 83 q 452 178 402 83 q 493 359 493 255 l 493 738 l 617 738 l 617 214 q 623 136 617 160 q 673 92 637 92 q 697 96 684 92 l 697 -4 \"},\"Ι\":{\"x_min\":42,\"x_max\":181,\"ha\":297,\"o\":\"m 181 0 l 42 0 l 42 1013 l 181 1013 l 181 0 \"},\"Ύ\":{\"x_min\":0,\"x_max\":1144.5,\"ha\":1214,\"o\":\"m 1144 1012 l 807 416 l 807 0 l 667 0 l 667 416 l 325 1012 l 465 1012 l 736 533 l 1004 1012 l 1144 1012 m 277 1040 l 83 799 l 0 799 l 140 1040 l 277 1040 \"},\"’\":{\"x_min\":0,\"x_max\":139,\"ha\":236,\"o\":\"m 139 851 q 102 737 139 784 q 0 669 65 690 l 0 734 q 59 787 42 741 q 72 873 72 821 l 0 873 l 0 1013 l 139 1013 l 139 851 \"},\"Ν\":{\"x_min\":0,\"x_max\":801,\"ha\":915,\"o\":\"m 801 0 l 651 0 l 131 822 l 131 0 l 0 0 l 0 1013 l 151 1013 l 670 191 l 670 1013 l 801 1013 l 801 0 \"},\"-\":{\"x_min\":8.71875,\"x_max\":350.390625,\"ha\":478,\"o\":\"m 350 317 l 8 317 l 8 428 l 350 428 l 350 317 \"},\"Q\":{\"x_min\":0,\"x_max\":968,\"ha\":1072,\"o\":\"m 954 5 l 887 -79 l 744 35 q 622 -11 687 2 q 483 -26 556 -26 q 127 130 262 -26 q 0 504 0 279 q 127 880 0 728 q 484 1041 262 1041 q 841 884 708 1041 q 968 507 968 735 q 933 293 968 398 q 832 104 899 188 l 954 5 m 723 191 q 802 330 777 248 q 828 499 828 412 q 744 790 828 673 q 483 922 650 922 q 228 791 322 922 q 142 505 142 673 q 227 221 142 337 q 487 91 323 91 q 632 123 566 91 l 520 215 l 587 301 l 723 191 \"},\"ς\":{\"x_min\":1,\"x_max\":676.28125,\"ha\":740,\"o\":\"m 676 460 l 551 460 q 498 595 542 546 q 365 651 448 651 q 199 578 263 651 q 136 401 136 505 q 266 178 136 241 q 508 106 387 142 q 640 -50 640 62 q 625 -158 640 -105 q 583 -278 611 -211 l 465 -278 q 498 -182 490 -211 q 515 -80 515 -126 q 381 12 515 -15 q 134 91 197 51 q 1 388 1 179 q 100 651 1 542 q 354 761 199 761 q 587 680 498 761 q 676 460 676 599 \"},\"M\":{\"x_min\":0,\"x_max\":954,\"ha\":1067,\"o\":\"m 954 0 l 819 0 l 819 869 l 537 0 l 405 0 l 128 866 l 128 0 l 0 0 l 0 1013 l 200 1013 l 472 160 l 757 1013 l 954 1013 l 954 0 \"},\"Ψ\":{\"x_min\":0,\"x_max\":1006,\"ha\":1094,\"o\":\"m 1006 678 q 914 319 1006 429 q 571 200 814 200 l 571 0 l 433 0 l 433 200 q 92 319 194 200 q 0 678 0 429 l 0 1013 l 139 1013 l 139 679 q 191 417 139 492 q 433 326 255 326 l 433 1013 l 571 1013 l 571 326 l 580 326 q 813 423 747 326 q 868 679 868 502 l 868 1013 l 1006 1013 l 1006 678 \"},\"C\":{\"x_min\":0,\"x_max\":886,\"ha\":944,\"o\":\"m 886 379 q 760 87 886 201 q 455 -26 634 -26 q 112 136 236 -26 q 0 509 0 283 q 118 882 0 737 q 469 1041 245 1041 q 748 955 630 1041 q 879 708 879 859 l 745 708 q 649 862 724 805 q 473 920 573 920 q 219 791 312 920 q 136 509 136 675 q 217 229 136 344 q 470 99 311 99 q 672 179 591 99 q 753 379 753 259 l 886 379 \"},\"!\":{\"x_min\":0,\"x_max\":138,\"ha\":236,\"o\":\"m 138 684 q 116 409 138 629 q 105 244 105 299 l 33 244 q 16 465 33 313 q 0 684 0 616 l 0 1013 l 138 1013 l 138 684 m 138 0 l 0 0 l 0 151 l 138 151 l 138 0 \"},\"{\":{\"x_min\":0,\"x_max\":480.5625,\"ha\":578,\"o\":\"m 480 -286 q 237 -213 303 -286 q 187 -45 187 -159 q 194 48 187 -15 q 201 141 201 112 q 164 264 201 225 q 0 314 118 314 l 0 417 q 164 471 119 417 q 201 605 201 514 q 199 665 201 644 q 193 772 193 769 q 241 941 193 887 q 480 1015 308 1015 l 480 915 q 336 866 375 915 q 306 742 306 828 q 310 662 306 717 q 314 577 314 606 q 288 452 314 500 q 176 365 256 391 q 289 275 257 337 q 314 143 314 226 q 313 84 314 107 q 310 -11 310 -5 q 339 -131 310 -94 q 480 -182 377 -182 l 480 -286 \"},\"X\":{\"x_min\":-0.015625,\"x_max\":854.15625,\"ha\":940,\"o\":\"m 854 0 l 683 0 l 423 409 l 166 0 l 0 0 l 347 519 l 18 1013 l 186 1013 l 428 637 l 675 1013 l 836 1013 l 504 520 l 854 0 \"},\"#\":{\"x_min\":0,\"x_max\":963.890625,\"ha\":1061,\"o\":\"m 963 690 l 927 590 l 719 590 l 655 410 l 876 410 l 840 310 l 618 310 l 508 -3 l 393 -2 l 506 309 l 329 310 l 215 -2 l 102 -3 l 212 310 l 0 310 l 36 410 l 248 409 l 312 590 l 86 590 l 120 690 l 347 690 l 459 1006 l 573 1006 l 462 690 l 640 690 l 751 1006 l 865 1006 l 754 690 l 963 690 m 606 590 l 425 590 l 362 410 l 543 410 l 606 590 \"},\"ι\":{\"x_min\":42,\"x_max\":284,\"ha\":361,\"o\":\"m 284 3 q 233 -10 258 -5 q 182 -15 207 -15 q 85 26 119 -15 q 42 200 42 79 l 42 738 l 167 738 l 168 215 q 172 141 168 157 q 226 101 183 101 q 248 103 239 101 q 284 112 257 104 l 284 3 \"},\"Ά\":{\"x_min\":0,\"x_max\":906.953125,\"ha\":982,\"o\":\"m 283 1040 l 88 799 l 5 799 l 145 1040 l 283 1040 m 906 0 l 756 0 l 650 303 l 251 303 l 143 0 l 0 0 l 376 1012 l 529 1012 l 906 0 m 609 421 l 452 866 l 293 421 l 609 421 \"},\")\":{\"x_min\":0,\"x_max\":318,\"ha\":415,\"o\":\"m 318 365 q 257 25 318 191 q 87 -290 197 -141 l 0 -290 q 140 21 93 -128 q 193 360 193 189 q 141 704 193 537 q 0 1024 97 850 l 87 1024 q 257 706 197 871 q 318 365 318 542 \"},\"ε\":{\"x_min\":0,\"x_max\":634.71875,\"ha\":714,\"o\":\"m 634 234 q 527 38 634 110 q 300 -25 433 -25 q 98 29 183 -25 q 0 204 0 93 q 37 314 0 265 q 128 390 67 353 q 56 460 82 419 q 26 555 26 505 q 114 712 26 654 q 295 763 191 763 q 499 700 416 763 q 589 515 589 631 l 478 515 q 419 618 464 580 q 307 657 374 657 q 207 630 253 657 q 151 547 151 598 q 238 445 151 469 q 389 434 280 434 l 389 331 l 349 331 q 206 315 255 331 q 125 210 125 287 q 183 107 125 145 q 302 76 233 76 q 436 117 379 76 q 509 234 493 159 l 634 234 \"},\"Δ\":{\"x_min\":0,\"x_max\":952.78125,\"ha\":1028,\"o\":\"m 952 0 l 0 0 l 400 1013 l 551 1013 l 952 0 m 762 124 l 476 867 l 187 124 l 762 124 \"},\"}\":{\"x_min\":0,\"x_max\":481,\"ha\":578,\"o\":\"m 481 314 q 318 262 364 314 q 282 136 282 222 q 284 65 282 97 q 293 -58 293 -48 q 241 -217 293 -166 q 0 -286 174 -286 l 0 -182 q 143 -130 105 -182 q 171 -2 171 -93 q 168 81 171 22 q 165 144 165 140 q 188 275 165 229 q 306 365 220 339 q 191 455 224 391 q 165 588 165 505 q 168 681 165 624 q 171 742 171 737 q 141 865 171 827 q 0 915 102 915 l 0 1015 q 243 942 176 1015 q 293 773 293 888 q 287 675 293 741 q 282 590 282 608 q 318 466 282 505 q 481 417 364 417 l 481 314 \"},\"‰\":{\"x_min\":-3,\"x_max\":1672,\"ha\":1821,\"o\":\"m 846 0 q 664 76 732 0 q 603 244 603 145 q 662 412 603 344 q 846 489 729 489 q 1027 412 959 489 q 1089 244 1089 343 q 1029 76 1089 144 q 846 0 962 0 m 845 103 q 945 143 910 103 q 981 243 981 184 q 947 340 981 301 q 845 385 910 385 q 745 342 782 385 q 709 243 709 300 q 742 147 709 186 q 845 103 781 103 m 888 986 l 284 -25 l 199 -25 l 803 986 l 888 986 m 241 468 q 58 545 126 468 q -3 715 -3 615 q 56 881 -3 813 q 238 958 124 958 q 421 881 353 958 q 483 712 483 813 q 423 544 483 612 q 241 468 356 468 m 241 855 q 137 811 175 855 q 100 710 100 768 q 136 612 100 653 q 240 572 172 572 q 344 614 306 572 q 382 713 382 656 q 347 810 382 771 q 241 855 308 855 m 1428 0 q 1246 76 1314 0 q 1185 244 1185 145 q 1244 412 1185 344 q 1428 489 1311 489 q 1610 412 1542 489 q 1672 244 1672 343 q 1612 76 1672 144 q 1428 0 1545 0 m 1427 103 q 1528 143 1492 103 q 1564 243 1564 184 q 1530 340 1564 301 q 1427 385 1492 385 q 1327 342 1364 385 q 1291 243 1291 300 q 1324 147 1291 186 q 1427 103 1363 103 \"},\"a\":{\"x_min\":0,\"x_max\":698.609375,\"ha\":794,\"o\":\"m 698 0 q 661 -12 679 -7 q 615 -17 643 -17 q 536 12 564 -17 q 500 96 508 41 q 384 6 456 37 q 236 -25 312 -25 q 65 31 130 -25 q 0 194 0 88 q 118 390 0 334 q 328 435 180 420 q 488 483 476 451 q 495 523 495 504 q 442 619 495 584 q 325 654 389 654 q 209 617 257 654 q 152 513 161 580 l 33 513 q 123 705 33 633 q 332 772 207 772 q 528 712 448 772 q 617 531 617 645 l 617 163 q 624 108 617 126 q 664 90 632 90 l 698 94 l 698 0 m 491 262 l 491 372 q 272 329 350 347 q 128 201 128 294 q 166 113 128 144 q 264 83 205 83 q 414 130 346 83 q 491 262 491 183 \"},\"—\":{\"x_min\":0,\"x_max\":941.671875,\"ha\":1039,\"o\":\"m 941 334 l 0 334 l 0 410 l 941 410 l 941 334 \"},\"=\":{\"x_min\":8.71875,\"x_max\":780.953125,\"ha\":792,\"o\":\"m 780 510 l 8 510 l 8 606 l 780 606 l 780 510 m 780 235 l 8 235 l 8 332 l 780 332 l 780 235 \"},\"N\":{\"x_min\":0,\"x_max\":801,\"ha\":914,\"o\":\"m 801 0 l 651 0 l 131 823 l 131 0 l 0 0 l 0 1013 l 151 1013 l 670 193 l 670 1013 l 801 1013 l 801 0 \"},\"ρ\":{\"x_min\":0,\"x_max\":712,\"ha\":797,\"o\":\"m 712 369 q 620 94 712 207 q 362 -26 521 -26 q 230 2 292 -26 q 119 83 167 30 l 119 -278 l 0 -278 l 0 362 q 91 643 0 531 q 355 764 190 764 q 617 647 517 764 q 712 369 712 536 m 583 366 q 530 559 583 480 q 359 651 469 651 q 190 562 252 651 q 135 370 135 483 q 189 176 135 257 q 359 85 250 85 q 528 175 466 85 q 583 366 583 254 \"},\"2\":{\"x_min\":59,\"x_max\":731,\"ha\":792,\"o\":\"m 731 0 l 59 0 q 197 314 59 188 q 457 487 199 315 q 598 691 598 580 q 543 819 598 772 q 411 867 488 867 q 272 811 328 867 q 209 630 209 747 l 81 630 q 182 901 81 805 q 408 986 271 986 q 629 909 536 986 q 731 694 731 826 q 613 449 731 541 q 378 316 495 383 q 201 122 235 234 l 731 122 l 731 0 \"},\"¯\":{\"x_min\":0,\"x_max\":941.671875,\"ha\":938,\"o\":\"m 941 1033 l 0 1033 l 0 1109 l 941 1109 l 941 1033 \"},\"Z\":{\"x_min\":0,\"x_max\":779,\"ha\":849,\"o\":\"m 779 0 l 0 0 l 0 113 l 621 896 l 40 896 l 40 1013 l 779 1013 l 778 887 l 171 124 l 779 124 l 779 0 \"},\"u\":{\"x_min\":0,\"x_max\":617,\"ha\":729,\"o\":\"m 617 0 l 499 0 l 499 110 q 391 10 460 45 q 246 -25 322 -25 q 61 58 127 -25 q 0 258 0 136 l 0 738 l 125 738 l 125 284 q 156 148 125 202 q 273 82 197 82 q 433 165 369 82 q 493 340 493 243 l 493 738 l 617 738 l 617 0 \"},\"k\":{\"x_min\":0,\"x_max\":612.484375,\"ha\":697,\"o\":\"m 612 738 l 338 465 l 608 0 l 469 0 l 251 382 l 121 251 l 121 0 l 0 0 l 0 1013 l 121 1013 l 121 402 l 456 738 l 612 738 \"},\"Η\":{\"x_min\":0,\"x_max\":803,\"ha\":917,\"o\":\"m 803 0 l 667 0 l 667 475 l 140 475 l 140 0 l 0 0 l 0 1013 l 140 1013 l 140 599 l 667 599 l 667 1013 l 803 1013 l 803 0 \"},\"Α\":{\"x_min\":0,\"x_max\":906.953125,\"ha\":985,\"o\":\"m 906 0 l 756 0 l 650 303 l 251 303 l 143 0 l 0 0 l 376 1013 l 529 1013 l 906 0 m 609 421 l 452 866 l 293 421 l 609 421 \"},\"s\":{\"x_min\":0,\"x_max\":604,\"ha\":697,\"o\":\"m 604 217 q 501 36 604 104 q 292 -23 411 -23 q 86 43 166 -23 q 0 238 0 114 l 121 237 q 175 122 121 164 q 300 85 223 85 q 415 112 363 85 q 479 207 479 147 q 361 309 479 276 q 140 372 141 370 q 21 544 21 426 q 111 708 21 647 q 298 761 190 761 q 492 705 413 761 q 583 531 583 643 l 462 531 q 412 625 462 594 q 298 657 363 657 q 199 636 242 657 q 143 558 143 608 q 262 454 143 486 q 484 394 479 397 q 604 217 604 341 \"},\"B\":{\"x_min\":0,\"x_max\":778,\"ha\":876,\"o\":\"m 580 546 q 724 469 670 535 q 778 311 778 403 q 673 83 778 171 q 432 0 575 0 l 0 0 l 0 1013 l 411 1013 q 629 957 541 1013 q 732 768 732 892 q 691 633 732 693 q 580 546 650 572 m 393 899 l 139 899 l 139 588 l 379 588 q 521 624 462 588 q 592 744 592 667 q 531 859 592 819 q 393 899 471 899 m 419 124 q 566 169 504 124 q 635 303 635 219 q 559 436 635 389 q 402 477 494 477 l 139 477 l 139 124 l 419 124 \"},\"…\":{\"x_min\":0,\"x_max\":614,\"ha\":708,\"o\":\"m 142 0 l 0 0 l 0 151 l 142 151 l 142 0 m 378 0 l 236 0 l 236 151 l 378 151 l 378 0 m 614 0 l 472 0 l 472 151 l 614 151 l 614 0 \"},\"?\":{\"x_min\":0,\"x_max\":607,\"ha\":704,\"o\":\"m 607 777 q 543 599 607 674 q 422 474 482 537 q 357 272 357 391 l 236 272 q 297 487 236 395 q 411 619 298 490 q 474 762 474 691 q 422 885 474 838 q 301 933 371 933 q 179 880 228 933 q 124 706 124 819 l 0 706 q 94 963 0 872 q 302 1044 177 1044 q 511 973 423 1044 q 607 777 607 895 m 370 0 l 230 0 l 230 151 l 370 151 l 370 0 \"},\"H\":{\"x_min\":0,\"x_max\":803,\"ha\":915,\"o\":\"m 803 0 l 667 0 l 667 475 l 140 475 l 140 0 l 0 0 l 0 1013 l 140 1013 l 140 599 l 667 599 l 667 1013 l 803 1013 l 803 0 \"},\"ν\":{\"x_min\":0,\"x_max\":675,\"ha\":761,\"o\":\"m 675 738 l 404 0 l 272 0 l 0 738 l 133 738 l 340 147 l 541 738 l 675 738 \"},\"c\":{\"x_min\":1,\"x_max\":701.390625,\"ha\":775,\"o\":\"m 701 264 q 584 53 681 133 q 353 -26 487 -26 q 91 91 188 -26 q 1 370 1 201 q 92 645 1 537 q 353 761 190 761 q 572 688 479 761 q 690 493 666 615 l 556 493 q 487 606 545 562 q 356 650 428 650 q 186 563 246 650 q 134 372 134 487 q 188 179 134 258 q 359 88 250 88 q 492 136 437 88 q 566 264 548 185 l 701 264 \"},\"¶\":{\"x_min\":0,\"x_max\":566.671875,\"ha\":678,\"o\":\"m 21 892 l 52 892 l 98 761 l 145 892 l 176 892 l 178 741 l 157 741 l 157 867 l 108 741 l 88 741 l 40 871 l 40 741 l 21 741 l 21 892 m 308 854 l 308 731 q 252 691 308 691 q 227 691 240 691 q 207 696 213 695 l 207 712 l 253 706 q 288 733 288 706 l 288 763 q 244 741 279 741 q 193 797 193 741 q 261 860 193 860 q 287 860 273 860 q 308 854 302 855 m 288 842 l 263 843 q 213 796 213 843 q 248 756 213 756 q 288 796 288 756 l 288 842 m 566 988 l 502 988 l 502 -1 l 439 -1 l 439 988 l 317 988 l 317 -1 l 252 -1 l 252 602 q 81 653 155 602 q 0 805 0 711 q 101 989 0 918 q 309 1053 194 1053 l 566 1053 l 566 988 \"},\"β\":{\"x_min\":0,\"x_max\":660,\"ha\":745,\"o\":\"m 471 550 q 610 450 561 522 q 660 280 660 378 q 578 64 660 151 q 367 -22 497 -22 q 239 5 299 -22 q 126 82 178 32 l 126 -278 l 0 -278 l 0 593 q 54 903 0 801 q 318 1042 127 1042 q 519 964 436 1042 q 603 771 603 887 q 567 644 603 701 q 471 550 532 586 m 337 79 q 476 138 418 79 q 535 279 535 198 q 427 437 535 386 q 226 477 344 477 l 226 583 q 398 620 329 583 q 486 762 486 668 q 435 884 486 833 q 312 935 384 935 q 169 861 219 935 q 126 698 126 797 l 126 362 q 170 169 126 242 q 337 79 224 79 \"},\"Μ\":{\"x_min\":0,\"x_max\":954,\"ha\":1068,\"o\":\"m 954 0 l 819 0 l 819 868 l 537 0 l 405 0 l 128 865 l 128 0 l 0 0 l 0 1013 l 199 1013 l 472 158 l 758 1013 l 954 1013 l 954 0 \"},\"Ό\":{\"x_min\":0.109375,\"x_max\":1120,\"ha\":1217,\"o\":\"m 1120 505 q 994 132 1120 282 q 642 -29 861 -29 q 290 130 422 -29 q 167 505 167 280 q 294 883 167 730 q 650 1046 430 1046 q 999 882 868 1046 q 1120 505 1120 730 m 977 504 q 896 784 977 669 q 644 915 804 915 q 391 785 484 915 q 307 504 307 669 q 391 224 307 339 q 644 95 486 95 q 894 224 803 95 q 977 504 977 339 m 277 1040 l 83 799 l 0 799 l 140 1040 l 277 1040 \"},\"Ή\":{\"x_min\":0,\"x_max\":1158,\"ha\":1275,\"o\":\"m 1158 0 l 1022 0 l 1022 475 l 496 475 l 496 0 l 356 0 l 356 1012 l 496 1012 l 496 599 l 1022 599 l 1022 1012 l 1158 1012 l 1158 0 m 277 1040 l 83 799 l 0 799 l 140 1040 l 277 1040 \"},\"•\":{\"x_min\":0,\"x_max\":663.890625,\"ha\":775,\"o\":\"m 663 529 q 566 293 663 391 q 331 196 469 196 q 97 294 194 196 q 0 529 0 393 q 96 763 0 665 q 331 861 193 861 q 566 763 469 861 q 663 529 663 665 \"},\"¥\":{\"x_min\":0.1875,\"x_max\":819.546875,\"ha\":886,\"o\":\"m 563 561 l 697 561 l 696 487 l 520 487 l 482 416 l 482 380 l 697 380 l 695 308 l 482 308 l 482 0 l 342 0 l 342 308 l 125 308 l 125 380 l 342 380 l 342 417 l 303 487 l 125 487 l 125 561 l 258 561 l 0 1013 l 140 1013 l 411 533 l 679 1013 l 819 1013 l 563 561 \"},\"(\":{\"x_min\":0,\"x_max\":318.0625,\"ha\":415,\"o\":\"m 318 -290 l 230 -290 q 61 23 122 -142 q 0 365 0 190 q 62 712 0 540 q 230 1024 119 869 l 318 1024 q 175 705 219 853 q 125 360 125 542 q 176 22 125 187 q 318 -290 223 -127 \"},\"U\":{\"x_min\":0,\"x_max\":796,\"ha\":904,\"o\":\"m 796 393 q 681 93 796 212 q 386 -25 566 -25 q 101 95 208 -25 q 0 393 0 211 l 0 1013 l 138 1013 l 138 391 q 204 191 138 270 q 394 107 276 107 q 586 191 512 107 q 656 391 656 270 l 656 1013 l 796 1013 l 796 393 \"},\"γ\":{\"x_min\":0.5,\"x_max\":744.953125,\"ha\":822,\"o\":\"m 744 737 l 463 54 l 463 -278 l 338 -278 l 338 54 l 154 495 q 104 597 124 569 q 13 651 67 651 l 0 651 l 0 751 l 39 753 q 168 711 121 753 q 242 594 207 676 l 403 208 l 617 737 l 744 737 \"},\"α\":{\"x_min\":0,\"x_max\":765.5625,\"ha\":809,\"o\":\"m 765 -4 q 698 -14 726 -14 q 564 97 586 -14 q 466 7 525 40 q 337 -26 407 -26 q 88 98 186 -26 q 0 369 0 212 q 88 637 0 525 q 337 760 184 760 q 465 728 407 760 q 563 637 524 696 l 563 739 l 685 739 l 685 222 q 693 141 685 168 q 748 94 708 94 q 765 96 760 94 l 765 -4 m 584 371 q 531 562 584 485 q 360 653 470 653 q 192 566 254 653 q 135 379 135 489 q 186 181 135 261 q 358 84 247 84 q 528 176 465 84 q 584 371 584 260 \"},\"F\":{\"x_min\":0,\"x_max\":683.328125,\"ha\":717,\"o\":\"m 683 888 l 140 888 l 140 583 l 613 583 l 613 458 l 140 458 l 140 0 l 0 0 l 0 1013 l 683 1013 l 683 888 \"},\"­\":{\"x_min\":0,\"x_max\":705.5625,\"ha\":803,\"o\":\"m 705 334 l 0 334 l 0 410 l 705 410 l 705 334 \"},\":\":{\"x_min\":0,\"x_max\":142,\"ha\":239,\"o\":\"m 142 585 l 0 585 l 0 738 l 142 738 l 142 585 m 142 0 l 0 0 l 0 151 l 142 151 l 142 0 \"},\"Χ\":{\"x_min\":0,\"x_max\":854.171875,\"ha\":935,\"o\":\"m 854 0 l 683 0 l 423 409 l 166 0 l 0 0 l 347 519 l 18 1013 l 186 1013 l 427 637 l 675 1013 l 836 1013 l 504 521 l 854 0 \"},\"*\":{\"x_min\":116,\"x_max\":674,\"ha\":792,\"o\":\"m 674 768 l 475 713 l 610 544 l 517 477 l 394 652 l 272 478 l 178 544 l 314 713 l 116 766 l 153 876 l 341 812 l 342 1013 l 446 1013 l 446 811 l 635 874 l 674 768 \"},\"†\":{\"x_min\":0,\"x_max\":777,\"ha\":835,\"o\":\"m 458 804 l 777 804 l 777 683 l 458 683 l 458 0 l 319 0 l 319 681 l 0 683 l 0 804 l 319 804 l 319 1015 l 458 1013 l 458 804 \"},\"°\":{\"x_min\":0,\"x_max\":347,\"ha\":444,\"o\":\"m 173 802 q 43 856 91 802 q 0 977 0 905 q 45 1101 0 1049 q 173 1153 90 1153 q 303 1098 255 1153 q 347 977 347 1049 q 303 856 347 905 q 173 802 256 802 m 173 884 q 238 910 214 884 q 262 973 262 937 q 239 1038 262 1012 q 173 1064 217 1064 q 108 1037 132 1064 q 85 973 85 1010 q 108 910 85 937 q 173 884 132 884 \"},\"V\":{\"x_min\":0,\"x_max\":862.71875,\"ha\":940,\"o\":\"m 862 1013 l 505 0 l 361 0 l 0 1013 l 143 1013 l 434 165 l 718 1012 l 862 1013 \"},\"Ξ\":{\"x_min\":0,\"x_max\":734.71875,\"ha\":763,\"o\":\"m 723 889 l 9 889 l 9 1013 l 723 1013 l 723 889 m 673 463 l 61 463 l 61 589 l 673 589 l 673 463 m 734 0 l 0 0 l 0 124 l 734 124 l 734 0 \"},\" \":{\"x_min\":0,\"x_max\":0,\"ha\":853},\"Ϋ\":{\"x_min\":0.328125,\"x_max\":819.515625,\"ha\":889,\"o\":\"m 588 1046 l 460 1046 l 460 1189 l 588 1189 l 588 1046 m 360 1046 l 232 1046 l 232 1189 l 360 1189 l 360 1046 m 819 1012 l 482 416 l 482 0 l 342 0 l 342 416 l 0 1012 l 140 1012 l 411 533 l 679 1012 l 819 1012 \"},\"0\":{\"x_min\":73,\"x_max\":715,\"ha\":792,\"o\":\"m 394 -29 q 153 129 242 -29 q 73 479 73 272 q 152 829 73 687 q 394 989 241 989 q 634 829 545 989 q 715 479 715 684 q 635 129 715 270 q 394 -29 546 -29 m 394 89 q 546 211 489 89 q 598 479 598 322 q 548 748 598 640 q 394 871 491 871 q 241 748 298 871 q 190 479 190 637 q 239 211 190 319 q 394 89 296 89 \"},\"”\":{\"x_min\":0,\"x_max\":347,\"ha\":454,\"o\":\"m 139 851 q 102 737 139 784 q 0 669 65 690 l 0 734 q 59 787 42 741 q 72 873 72 821 l 0 873 l 0 1013 l 139 1013 l 139 851 m 347 851 q 310 737 347 784 q 208 669 273 690 l 208 734 q 267 787 250 741 q 280 873 280 821 l 208 873 l 208 1013 l 347 1013 l 347 851 \"},\"@\":{\"x_min\":0,\"x_max\":1260,\"ha\":1357,\"o\":\"m 1098 -45 q 877 -160 1001 -117 q 633 -203 752 -203 q 155 -29 327 -203 q 0 360 0 127 q 176 802 0 616 q 687 1008 372 1008 q 1123 854 969 1008 q 1260 517 1260 718 q 1155 216 1260 341 q 868 82 1044 82 q 772 106 801 82 q 737 202 737 135 q 647 113 700 144 q 527 82 594 82 q 367 147 420 82 q 314 312 314 212 q 401 565 314 452 q 639 690 498 690 q 810 588 760 690 l 849 668 l 938 668 q 877 441 900 532 q 833 226 833 268 q 853 182 833 198 q 902 167 873 167 q 1088 272 1012 167 q 1159 512 1159 372 q 1051 793 1159 681 q 687 925 925 925 q 248 747 415 925 q 97 361 97 586 q 226 26 97 159 q 627 -122 370 -122 q 856 -87 737 -122 q 1061 8 976 -53 l 1098 -45 m 786 488 q 738 580 777 545 q 643 615 700 615 q 483 517 548 615 q 425 322 425 430 q 457 203 425 250 q 552 156 490 156 q 722 273 665 156 q 786 488 738 309 \"},\"Ί\":{\"x_min\":0,\"x_max\":499,\"ha\":613,\"o\":\"m 277 1040 l 83 799 l 0 799 l 140 1040 l 277 1040 m 499 0 l 360 0 l 360 1012 l 499 1012 l 499 0 \"},\"i\":{\"x_min\":14,\"x_max\":136,\"ha\":275,\"o\":\"m 136 873 l 14 873 l 14 1013 l 136 1013 l 136 873 m 136 0 l 14 0 l 14 737 l 136 737 l 136 0 \"},\"Β\":{\"x_min\":0,\"x_max\":778,\"ha\":877,\"o\":\"m 580 545 q 724 468 671 534 q 778 310 778 402 q 673 83 778 170 q 432 0 575 0 l 0 0 l 0 1013 l 411 1013 q 629 957 541 1013 q 732 768 732 891 q 691 632 732 692 q 580 545 650 571 m 393 899 l 139 899 l 139 587 l 379 587 q 521 623 462 587 q 592 744 592 666 q 531 859 592 819 q 393 899 471 899 m 419 124 q 566 169 504 124 q 635 302 635 219 q 559 435 635 388 q 402 476 494 476 l 139 476 l 139 124 l 419 124 \"},\"υ\":{\"x_min\":0,\"x_max\":617,\"ha\":725,\"o\":\"m 617 352 q 540 94 617 199 q 308 -24 455 -24 q 76 94 161 -24 q 0 352 0 199 l 0 739 l 126 739 l 126 355 q 169 185 126 257 q 312 98 220 98 q 451 185 402 98 q 492 355 492 257 l 492 739 l 617 739 l 617 352 \"},\"]\":{\"x_min\":0,\"x_max\":275,\"ha\":372,\"o\":\"m 275 -281 l 0 -281 l 0 -187 l 151 -187 l 151 920 l 0 920 l 0 1013 l 275 1013 l 275 -281 \"},\"m\":{\"x_min\":0,\"x_max\":1019,\"ha\":1128,\"o\":\"m 1019 0 l 897 0 l 897 454 q 860 591 897 536 q 739 660 816 660 q 613 586 659 660 q 573 436 573 522 l 573 0 l 447 0 l 447 455 q 412 591 447 535 q 294 657 372 657 q 165 586 213 657 q 122 437 122 521 l 122 0 l 0 0 l 0 738 l 117 738 l 117 640 q 202 730 150 697 q 316 763 254 763 q 437 730 381 763 q 525 642 494 697 q 621 731 559 700 q 753 763 682 763 q 943 694 867 763 q 1019 512 1019 625 l 1019 0 \"},\"χ\":{\"x_min\":8.328125,\"x_max\":780.5625,\"ha\":815,\"o\":\"m 780 -278 q 715 -294 747 -294 q 616 -257 663 -294 q 548 -175 576 -227 l 379 133 l 143 -277 l 9 -277 l 313 254 l 163 522 q 127 586 131 580 q 36 640 91 640 q 8 637 27 640 l 8 752 l 52 757 q 162 719 113 757 q 236 627 200 690 l 383 372 l 594 737 l 726 737 l 448 250 l 625 -69 q 670 -153 647 -110 q 743 -188 695 -188 q 780 -184 759 -188 l 780 -278 \"},\"8\":{\"x_min\":55,\"x_max\":736,\"ha\":792,\"o\":\"m 571 527 q 694 424 652 491 q 736 280 736 358 q 648 71 736 158 q 395 -26 551 -26 q 142 69 238 -26 q 55 279 55 157 q 96 425 55 359 q 220 527 138 491 q 120 615 153 562 q 88 726 88 668 q 171 904 88 827 q 395 986 261 986 q 618 905 529 986 q 702 727 702 830 q 670 616 702 667 q 571 527 638 565 m 394 565 q 519 610 475 565 q 563 717 563 655 q 521 823 563 781 q 392 872 474 872 q 265 824 312 872 q 224 720 224 783 q 265 613 224 656 q 394 565 312 565 m 395 91 q 545 150 488 91 q 597 280 597 204 q 546 408 597 355 q 395 465 492 465 q 244 408 299 465 q 194 280 194 356 q 244 150 194 203 q 395 91 299 91 \"},\"ί\":{\"x_min\":42,\"x_max\":326.71875,\"ha\":361,\"o\":\"m 284 3 q 233 -10 258 -5 q 182 -15 207 -15 q 85 26 119 -15 q 42 200 42 79 l 42 737 l 167 737 l 168 215 q 172 141 168 157 q 226 101 183 101 q 248 102 239 101 q 284 112 257 104 l 284 3 m 326 1040 l 137 819 l 54 819 l 189 1040 l 326 1040 \"},\"Ζ\":{\"x_min\":0,\"x_max\":779.171875,\"ha\":850,\"o\":\"m 779 0 l 0 0 l 0 113 l 620 896 l 40 896 l 40 1013 l 779 1013 l 779 887 l 170 124 l 779 124 l 779 0 \"},\"R\":{\"x_min\":0,\"x_max\":781.953125,\"ha\":907,\"o\":\"m 781 0 l 623 0 q 587 242 590 52 q 407 433 585 433 l 138 433 l 138 0 l 0 0 l 0 1013 l 396 1013 q 636 946 539 1013 q 749 731 749 868 q 711 597 749 659 q 608 502 674 534 q 718 370 696 474 q 729 207 722 352 q 781 26 736 62 l 781 0 m 373 551 q 533 594 465 551 q 614 731 614 645 q 532 859 614 815 q 373 896 465 896 l 138 896 l 138 551 l 373 551 \"},\"o\":{\"x_min\":0,\"x_max\":713,\"ha\":821,\"o\":\"m 357 -25 q 94 91 194 -25 q 0 368 0 202 q 93 642 0 533 q 357 761 193 761 q 618 644 518 761 q 713 368 713 533 q 619 91 713 201 q 357 -25 521 -25 m 357 85 q 528 175 465 85 q 584 369 584 255 q 529 562 584 484 q 357 651 467 651 q 189 560 250 651 q 135 369 135 481 q 187 177 135 257 q 357 85 250 85 \"},\"5\":{\"x_min\":54.171875,\"x_max\":738,\"ha\":792,\"o\":\"m 738 314 q 626 60 738 153 q 382 -23 526 -23 q 155 47 248 -23 q 54 256 54 125 l 183 256 q 259 132 204 174 q 382 91 314 91 q 533 149 471 91 q 602 314 602 213 q 538 469 602 411 q 386 528 475 528 q 284 506 332 528 q 197 439 237 484 l 81 439 l 159 958 l 684 958 l 684 840 l 254 840 l 214 579 q 306 627 258 612 q 407 643 354 643 q 636 552 540 643 q 738 314 738 457 \"},\"7\":{\"x_min\":58.71875,\"x_max\":730.953125,\"ha\":792,\"o\":\"m 730 839 q 469 448 560 641 q 335 0 378 255 l 192 0 q 328 441 235 252 q 593 830 421 630 l 58 830 l 58 958 l 730 958 l 730 839 \"},\"K\":{\"x_min\":0,\"x_max\":819.46875,\"ha\":906,\"o\":\"m 819 0 l 649 0 l 294 509 l 139 355 l 139 0 l 0 0 l 0 1013 l 139 1013 l 139 526 l 626 1013 l 809 1013 l 395 600 l 819 0 \"},\",\":{\"x_min\":0,\"x_max\":142,\"ha\":239,\"o\":\"m 142 -12 q 105 -132 142 -82 q 0 -205 68 -182 l 0 -138 q 57 -82 40 -124 q 70 0 70 -51 l 0 0 l 0 151 l 142 151 l 142 -12 \"},\"d\":{\"x_min\":0,\"x_max\":683,\"ha\":796,\"o\":\"m 683 0 l 564 0 l 564 93 q 456 6 516 38 q 327 -25 395 -25 q 87 100 181 -25 q 0 365 0 215 q 90 639 0 525 q 343 763 187 763 q 564 647 486 763 l 564 1013 l 683 1013 l 683 0 m 582 373 q 529 562 582 484 q 361 653 468 653 q 190 561 253 653 q 135 365 135 479 q 189 175 135 254 q 358 85 251 85 q 529 178 468 85 q 582 373 582 258 \"},\"¨\":{\"x_min\":-109,\"x_max\":247,\"ha\":232,\"o\":\"m 247 1046 l 119 1046 l 119 1189 l 247 1189 l 247 1046 m 19 1046 l -109 1046 l -109 1189 l 19 1189 l 19 1046 \"},\"E\":{\"x_min\":0,\"x_max\":736.109375,\"ha\":789,\"o\":\"m 736 0 l 0 0 l 0 1013 l 725 1013 l 725 889 l 139 889 l 139 585 l 677 585 l 677 467 l 139 467 l 139 125 l 736 125 l 736 0 \"},\"Y\":{\"x_min\":0,\"x_max\":820,\"ha\":886,\"o\":\"m 820 1013 l 482 416 l 482 0 l 342 0 l 342 416 l 0 1013 l 140 1013 l 411 534 l 679 1012 l 820 1013 \"},\"\\\"\":{\"x_min\":0,\"x_max\":299,\"ha\":396,\"o\":\"m 299 606 l 203 606 l 203 988 l 299 988 l 299 606 m 96 606 l 0 606 l 0 988 l 96 988 l 96 606 \"},\"‹\":{\"x_min\":17.984375,\"x_max\":773.609375,\"ha\":792,\"o\":\"m 773 40 l 18 376 l 17 465 l 773 799 l 773 692 l 159 420 l 773 149 l 773 40 \"},\"„\":{\"x_min\":0,\"x_max\":364,\"ha\":467,\"o\":\"m 141 -12 q 104 -132 141 -82 q 0 -205 67 -182 l 0 -138 q 56 -82 40 -124 q 69 0 69 -51 l 0 0 l 0 151 l 141 151 l 141 -12 m 364 -12 q 327 -132 364 -82 q 222 -205 290 -182 l 222 -138 q 279 -82 262 -124 q 292 0 292 -51 l 222 0 l 222 151 l 364 151 l 364 -12 \"},\"δ\":{\"x_min\":1,\"x_max\":710,\"ha\":810,\"o\":\"m 710 360 q 616 87 710 196 q 356 -28 518 -28 q 99 82 197 -28 q 1 356 1 192 q 100 606 1 509 q 355 703 199 703 q 180 829 288 754 q 70 903 124 866 l 70 1012 l 643 1012 l 643 901 l 258 901 q 462 763 422 794 q 636 592 577 677 q 710 360 710 485 m 584 365 q 552 501 584 447 q 451 602 521 555 q 372 611 411 611 q 197 541 258 611 q 136 355 136 472 q 190 171 136 245 q 358 85 252 85 q 528 173 465 85 q 584 365 584 252 \"},\"έ\":{\"x_min\":0,\"x_max\":634.71875,\"ha\":714,\"o\":\"m 634 234 q 527 38 634 110 q 300 -25 433 -25 q 98 29 183 -25 q 0 204 0 93 q 37 313 0 265 q 128 390 67 352 q 56 459 82 419 q 26 555 26 505 q 114 712 26 654 q 295 763 191 763 q 499 700 416 763 q 589 515 589 631 l 478 515 q 419 618 464 580 q 307 657 374 657 q 207 630 253 657 q 151 547 151 598 q 238 445 151 469 q 389 434 280 434 l 389 331 l 349 331 q 206 315 255 331 q 125 210 125 287 q 183 107 125 145 q 302 76 233 76 q 436 117 379 76 q 509 234 493 159 l 634 234 m 520 1040 l 331 819 l 248 819 l 383 1040 l 520 1040 \"},\"ω\":{\"x_min\":0,\"x_max\":922,\"ha\":1031,\"o\":\"m 922 339 q 856 97 922 203 q 650 -26 780 -26 q 538 9 587 -26 q 461 103 489 44 q 387 12 436 46 q 277 -22 339 -22 q 69 97 147 -22 q 0 339 0 203 q 45 551 0 444 q 161 738 84 643 l 302 738 q 175 553 219 647 q 124 336 124 446 q 155 179 124 249 q 275 88 197 88 q 375 163 341 88 q 400 294 400 219 l 400 572 l 524 572 l 524 294 q 561 135 524 192 q 643 88 591 88 q 762 182 719 88 q 797 342 797 257 q 745 556 797 450 q 619 738 705 638 l 760 738 q 874 551 835 640 q 922 339 922 444 \"},\"´\":{\"x_min\":0,\"x_max\":96,\"ha\":251,\"o\":\"m 96 606 l 0 606 l 0 988 l 96 988 l 96 606 \"},\"±\":{\"x_min\":11,\"x_max\":781,\"ha\":792,\"o\":\"m 781 490 l 446 490 l 446 255 l 349 255 l 349 490 l 11 490 l 11 586 l 349 586 l 349 819 l 446 819 l 446 586 l 781 586 l 781 490 m 781 21 l 11 21 l 11 115 l 781 115 l 781 21 \"},\"|\":{\"x_min\":343,\"x_max\":449,\"ha\":792,\"o\":\"m 449 462 l 343 462 l 343 986 l 449 986 l 449 462 m 449 -242 l 343 -242 l 343 280 l 449 280 l 449 -242 \"},\"ϋ\":{\"x_min\":0,\"x_max\":617,\"ha\":725,\"o\":\"m 482 800 l 372 800 l 372 925 l 482 925 l 482 800 m 239 800 l 129 800 l 129 925 l 239 925 l 239 800 m 617 352 q 540 93 617 199 q 308 -24 455 -24 q 76 93 161 -24 q 0 352 0 199 l 0 738 l 126 738 l 126 354 q 169 185 126 257 q 312 98 220 98 q 451 185 402 98 q 492 354 492 257 l 492 738 l 617 738 l 617 352 \"},\"§\":{\"x_min\":0,\"x_max\":593,\"ha\":690,\"o\":\"m 593 425 q 554 312 593 369 q 467 233 516 254 q 537 83 537 172 q 459 -74 537 -12 q 288 -133 387 -133 q 115 -69 184 -133 q 47 96 47 -6 l 166 96 q 199 7 166 40 q 288 -26 232 -26 q 371 -5 332 -26 q 420 60 420 21 q 311 201 420 139 q 108 309 210 255 q 0 490 0 383 q 33 602 0 551 q 124 687 66 654 q 75 743 93 712 q 58 812 58 773 q 133 984 58 920 q 300 1043 201 1043 q 458 987 394 1043 q 529 814 529 925 l 411 814 q 370 908 404 877 q 289 939 336 939 q 213 911 246 939 q 180 841 180 883 q 286 720 180 779 q 484 612 480 615 q 593 425 593 534 m 467 409 q 355 544 467 473 q 196 630 228 612 q 146 587 162 609 q 124 525 124 558 q 239 387 124 462 q 398 298 369 315 q 448 345 429 316 q 467 409 467 375 \"},\"b\":{\"x_min\":0,\"x_max\":685,\"ha\":783,\"o\":\"m 685 372 q 597 99 685 213 q 347 -25 501 -25 q 219 5 277 -25 q 121 93 161 36 l 121 0 l 0 0 l 0 1013 l 121 1013 l 121 634 q 214 723 157 692 q 341 754 272 754 q 591 637 493 754 q 685 372 685 526 m 554 356 q 499 550 554 470 q 328 644 437 644 q 162 556 223 644 q 108 369 108 478 q 160 176 108 256 q 330 83 221 83 q 498 169 435 83 q 554 356 554 245 \"},\"q\":{\"x_min\":0,\"x_max\":683,\"ha\":876,\"o\":\"m 683 -278 l 564 -278 l 564 97 q 474 8 533 39 q 345 -23 415 -23 q 91 93 188 -23 q 0 364 0 203 q 87 635 0 522 q 337 760 184 760 q 466 727 408 760 q 564 637 523 695 l 564 737 l 683 737 l 683 -278 m 582 375 q 527 564 582 488 q 358 652 466 652 q 190 565 253 652 q 135 377 135 488 q 189 179 135 261 q 361 84 251 84 q 530 179 469 84 q 582 375 582 260 \"},\"Ω\":{\"x_min\":-0.171875,\"x_max\":969.5625,\"ha\":1068,\"o\":\"m 969 0 l 555 0 l 555 123 q 744 308 675 194 q 814 558 814 423 q 726 812 814 709 q 484 922 633 922 q 244 820 334 922 q 154 567 154 719 q 223 316 154 433 q 412 123 292 199 l 412 0 l 0 0 l 0 124 l 217 124 q 68 327 122 210 q 15 572 15 444 q 144 911 15 781 q 484 1041 274 1041 q 822 909 691 1041 q 953 569 953 777 q 899 326 953 443 q 750 124 846 210 l 969 124 l 969 0 \"},\"ύ\":{\"x_min\":0,\"x_max\":617,\"ha\":725,\"o\":\"m 617 352 q 540 93 617 199 q 308 -24 455 -24 q 76 93 161 -24 q 0 352 0 199 l 0 738 l 126 738 l 126 354 q 169 185 126 257 q 312 98 220 98 q 451 185 402 98 q 492 354 492 257 l 492 738 l 617 738 l 617 352 m 535 1040 l 346 819 l 262 819 l 397 1040 l 535 1040 \"},\"z\":{\"x_min\":-0.015625,\"x_max\":613.890625,\"ha\":697,\"o\":\"m 613 0 l 0 0 l 0 100 l 433 630 l 20 630 l 20 738 l 594 738 l 593 636 l 163 110 l 613 110 l 613 0 \"},\"™\":{\"x_min\":0,\"x_max\":894,\"ha\":1000,\"o\":\"m 389 951 l 229 951 l 229 503 l 160 503 l 160 951 l 0 951 l 0 1011 l 389 1011 l 389 951 m 894 503 l 827 503 l 827 939 l 685 503 l 620 503 l 481 937 l 481 503 l 417 503 l 417 1011 l 517 1011 l 653 580 l 796 1010 l 894 1011 l 894 503 \"},\"ή\":{\"x_min\":0.78125,\"x_max\":697,\"ha\":810,\"o\":\"m 697 -278 l 572 -278 l 572 454 q 540 587 572 536 q 425 650 501 650 q 271 579 337 650 q 206 420 206 509 l 206 0 l 81 0 l 81 489 q 73 588 81 562 q 0 644 56 644 l 0 741 q 68 755 38 755 q 158 721 124 755 q 200 630 193 687 q 297 726 234 692 q 434 761 359 761 q 620 692 544 761 q 697 516 697 624 l 697 -278 m 479 1040 l 290 819 l 207 819 l 341 1040 l 479 1040 \"},\"Θ\":{\"x_min\":0,\"x_max\":960,\"ha\":1056,\"o\":\"m 960 507 q 833 129 960 280 q 476 -32 698 -32 q 123 129 255 -32 q 0 507 0 280 q 123 883 0 732 q 476 1045 255 1045 q 832 883 696 1045 q 960 507 960 732 m 817 500 q 733 789 817 669 q 476 924 639 924 q 223 792 317 924 q 142 507 142 675 q 222 222 142 339 q 476 89 315 89 q 730 218 636 89 q 817 500 817 334 m 716 449 l 243 449 l 243 571 l 716 571 l 716 449 \"},\"®\":{\"x_min\":-3,\"x_max\":1008,\"ha\":1106,\"o\":\"m 503 532 q 614 562 566 532 q 672 658 672 598 q 614 747 672 716 q 503 772 569 772 l 338 772 l 338 532 l 503 532 m 502 -7 q 123 151 263 -7 q -3 501 -3 294 q 123 851 -3 706 q 502 1011 263 1011 q 881 851 739 1011 q 1008 501 1008 708 q 883 151 1008 292 q 502 -7 744 -7 m 502 60 q 830 197 709 60 q 940 501 940 322 q 831 805 940 681 q 502 944 709 944 q 174 805 296 944 q 65 501 65 680 q 173 197 65 320 q 502 60 294 60 m 788 146 l 678 146 q 653 316 655 183 q 527 449 652 449 l 338 449 l 338 146 l 241 146 l 241 854 l 518 854 q 688 808 621 854 q 766 658 766 755 q 739 563 766 607 q 668 497 713 519 q 751 331 747 472 q 788 164 756 190 l 788 146 \"},\"~\":{\"x_min\":0,\"x_max\":833,\"ha\":931,\"o\":\"m 833 958 q 778 753 833 831 q 594 665 716 665 q 402 761 502 665 q 240 857 302 857 q 131 795 166 857 q 104 665 104 745 l 0 665 q 54 867 0 789 q 237 958 116 958 q 429 861 331 958 q 594 765 527 765 q 704 827 670 765 q 729 958 729 874 l 833 958 \"},\"Ε\":{\"x_min\":0,\"x_max\":736.21875,\"ha\":778,\"o\":\"m 736 0 l 0 0 l 0 1013 l 725 1013 l 725 889 l 139 889 l 139 585 l 677 585 l 677 467 l 139 467 l 139 125 l 736 125 l 736 0 \"},\"³\":{\"x_min\":0,\"x_max\":450,\"ha\":547,\"o\":\"m 450 552 q 379 413 450 464 q 220 366 313 366 q 69 414 130 366 q 0 567 0 470 l 85 567 q 126 470 85 504 q 225 437 168 437 q 320 467 280 437 q 360 552 360 498 q 318 632 360 608 q 213 657 276 657 q 195 657 203 657 q 176 657 181 657 l 176 722 q 279 733 249 722 q 334 815 334 752 q 300 881 334 856 q 220 907 267 907 q 133 875 169 907 q 97 781 97 844 l 15 781 q 78 926 15 875 q 220 972 135 972 q 364 930 303 972 q 426 817 426 888 q 344 697 426 733 q 421 642 392 681 q 450 552 450 603 \"},\"[\":{\"x_min\":0,\"x_max\":273.609375,\"ha\":371,\"o\":\"m 273 -281 l 0 -281 l 0 1013 l 273 1013 l 273 920 l 124 920 l 124 -187 l 273 -187 l 273 -281 \"},\"L\":{\"x_min\":0,\"x_max\":645.828125,\"ha\":696,\"o\":\"m 645 0 l 0 0 l 0 1013 l 140 1013 l 140 126 l 645 126 l 645 0 \"},\"σ\":{\"x_min\":0,\"x_max\":803.390625,\"ha\":894,\"o\":\"m 803 628 l 633 628 q 713 368 713 512 q 618 93 713 204 q 357 -25 518 -25 q 94 91 194 -25 q 0 368 0 201 q 94 644 0 533 q 356 761 194 761 q 481 750 398 761 q 608 739 564 739 l 803 739 l 803 628 m 360 85 q 529 180 467 85 q 584 374 584 262 q 527 566 584 490 q 352 651 463 651 q 187 559 247 651 q 135 368 135 478 q 189 175 135 254 q 360 85 251 85 \"},\"ζ\":{\"x_min\":0,\"x_max\":573,\"ha\":642,\"o\":\"m 573 -40 q 553 -162 573 -97 q 510 -278 543 -193 l 400 -278 q 441 -187 428 -219 q 462 -90 462 -132 q 378 -14 462 -14 q 108 45 197 -14 q 0 290 0 117 q 108 631 0 462 q 353 901 194 767 l 55 901 l 55 1012 l 561 1012 l 561 924 q 261 669 382 831 q 128 301 128 489 q 243 117 128 149 q 458 98 350 108 q 573 -40 573 80 \"},\"θ\":{\"x_min\":0,\"x_max\":674,\"ha\":778,\"o\":\"m 674 496 q 601 160 674 304 q 336 -26 508 -26 q 73 153 165 -26 q 0 485 0 296 q 72 840 0 683 q 343 1045 166 1045 q 605 844 516 1045 q 674 496 674 692 m 546 579 q 498 798 546 691 q 336 935 437 935 q 178 798 237 935 q 126 579 137 701 l 546 579 m 546 475 l 126 475 q 170 233 126 348 q 338 80 230 80 q 504 233 447 80 q 546 475 546 346 \"},\"Ο\":{\"x_min\":0,\"x_max\":958,\"ha\":1054,\"o\":\"m 485 1042 q 834 883 703 1042 q 958 511 958 735 q 834 136 958 287 q 481 -26 701 -26 q 126 130 261 -26 q 0 504 0 279 q 127 880 0 729 q 485 1042 263 1042 m 480 98 q 731 225 638 98 q 815 504 815 340 q 733 783 815 670 q 480 913 640 913 q 226 785 321 913 q 142 504 142 671 q 226 224 142 339 q 480 98 319 98 \"},\"Γ\":{\"x_min\":0,\"x_max\":705.28125,\"ha\":749,\"o\":\"m 705 886 l 140 886 l 140 0 l 0 0 l 0 1012 l 705 1012 l 705 886 \"},\" \":{\"x_min\":0,\"x_max\":0,\"ha\":375},\"%\":{\"x_min\":-3,\"x_max\":1089,\"ha\":1186,\"o\":\"m 845 0 q 663 76 731 0 q 602 244 602 145 q 661 412 602 344 q 845 489 728 489 q 1027 412 959 489 q 1089 244 1089 343 q 1029 76 1089 144 q 845 0 962 0 m 844 103 q 945 143 909 103 q 981 243 981 184 q 947 340 981 301 q 844 385 909 385 q 744 342 781 385 q 708 243 708 300 q 741 147 708 186 q 844 103 780 103 m 888 986 l 284 -25 l 199 -25 l 803 986 l 888 986 m 241 468 q 58 545 126 468 q -3 715 -3 615 q 56 881 -3 813 q 238 958 124 958 q 421 881 353 958 q 483 712 483 813 q 423 544 483 612 q 241 468 356 468 m 241 855 q 137 811 175 855 q 100 710 100 768 q 136 612 100 653 q 240 572 172 572 q 344 614 306 572 q 382 713 382 656 q 347 810 382 771 q 241 855 308 855 \"},\"P\":{\"x_min\":0,\"x_max\":726,\"ha\":806,\"o\":\"m 424 1013 q 640 931 555 1013 q 726 719 726 850 q 637 506 726 587 q 413 426 548 426 l 140 426 l 140 0 l 0 0 l 0 1013 l 424 1013 m 379 889 l 140 889 l 140 548 l 372 548 q 522 589 459 548 q 593 720 593 637 q 528 845 593 801 q 379 889 463 889 \"},\"Έ\":{\"x_min\":0,\"x_max\":1078.21875,\"ha\":1118,\"o\":\"m 1078 0 l 342 0 l 342 1013 l 1067 1013 l 1067 889 l 481 889 l 481 585 l 1019 585 l 1019 467 l 481 467 l 481 125 l 1078 125 l 1078 0 m 277 1040 l 83 799 l 0 799 l 140 1040 l 277 1040 \"},\"Ώ\":{\"x_min\":0.125,\"x_max\":1136.546875,\"ha\":1235,\"o\":\"m 1136 0 l 722 0 l 722 123 q 911 309 842 194 q 981 558 981 423 q 893 813 981 710 q 651 923 800 923 q 411 821 501 923 q 321 568 321 720 q 390 316 321 433 q 579 123 459 200 l 579 0 l 166 0 l 166 124 l 384 124 q 235 327 289 210 q 182 572 182 444 q 311 912 182 782 q 651 1042 441 1042 q 989 910 858 1042 q 1120 569 1120 778 q 1066 326 1120 443 q 917 124 1013 210 l 1136 124 l 1136 0 m 277 1040 l 83 800 l 0 800 l 140 1041 l 277 1040 \"},\"_\":{\"x_min\":0,\"x_max\":705.5625,\"ha\":803,\"o\":\"m 705 -334 l 0 -334 l 0 -234 l 705 -234 l 705 -334 \"},\"Ϊ\":{\"x_min\":-110,\"x_max\":246,\"ha\":275,\"o\":\"m 246 1046 l 118 1046 l 118 1189 l 246 1189 l 246 1046 m 18 1046 l -110 1046 l -110 1189 l 18 1189 l 18 1046 m 136 0 l 0 0 l 0 1012 l 136 1012 l 136 0 \"},\"+\":{\"x_min\":23,\"x_max\":768,\"ha\":792,\"o\":\"m 768 372 l 444 372 l 444 0 l 347 0 l 347 372 l 23 372 l 23 468 l 347 468 l 347 840 l 444 840 l 444 468 l 768 468 l 768 372 \"},\"½\":{\"x_min\":0,\"x_max\":1050,\"ha\":1149,\"o\":\"m 1050 0 l 625 0 q 712 178 625 108 q 878 277 722 187 q 967 385 967 328 q 932 456 967 429 q 850 484 897 484 q 759 450 798 484 q 721 352 721 416 l 640 352 q 706 502 640 448 q 851 551 766 551 q 987 509 931 551 q 1050 385 1050 462 q 976 251 1050 301 q 829 179 902 215 q 717 68 740 133 l 1050 68 l 1050 0 m 834 985 l 215 -28 l 130 -28 l 750 984 l 834 985 m 224 422 l 142 422 l 142 811 l 0 811 l 0 867 q 104 889 62 867 q 164 973 157 916 l 224 973 l 224 422 \"},\"Ρ\":{\"x_min\":0,\"x_max\":720,\"ha\":783,\"o\":\"m 424 1013 q 637 933 554 1013 q 720 723 720 853 q 633 508 720 591 q 413 426 546 426 l 140 426 l 140 0 l 0 0 l 0 1013 l 424 1013 m 378 889 l 140 889 l 140 548 l 371 548 q 521 589 458 548 q 592 720 592 637 q 527 845 592 801 q 378 889 463 889 \"},\"'\":{\"x_min\":0,\"x_max\":139,\"ha\":236,\"o\":\"m 139 851 q 102 737 139 784 q 0 669 65 690 l 0 734 q 59 787 42 741 q 72 873 72 821 l 0 873 l 0 1013 l 139 1013 l 139 851 \"},\"ª\":{\"x_min\":0,\"x_max\":350,\"ha\":397,\"o\":\"m 350 625 q 307 616 328 616 q 266 631 281 616 q 247 673 251 645 q 190 628 225 644 q 116 613 156 613 q 32 641 64 613 q 0 722 0 669 q 72 826 0 800 q 247 866 159 846 l 247 887 q 220 934 247 916 q 162 953 194 953 q 104 934 129 953 q 76 882 80 915 l 16 882 q 60 976 16 941 q 166 1011 104 1011 q 266 979 224 1011 q 308 891 308 948 l 308 706 q 311 679 308 688 q 331 670 315 670 l 350 672 l 350 625 m 247 757 l 247 811 q 136 790 175 798 q 64 726 64 773 q 83 682 64 697 q 132 667 103 667 q 207 690 174 667 q 247 757 247 718 \"},\"΅\":{\"x_min\":0,\"x_max\":450,\"ha\":553,\"o\":\"m 450 800 l 340 800 l 340 925 l 450 925 l 450 800 m 406 1040 l 212 800 l 129 800 l 269 1040 l 406 1040 m 110 800 l 0 800 l 0 925 l 110 925 l 110 800 \"},\"T\":{\"x_min\":0,\"x_max\":777,\"ha\":835,\"o\":\"m 777 894 l 458 894 l 458 0 l 319 0 l 319 894 l 0 894 l 0 1013 l 777 1013 l 777 894 \"},\"Φ\":{\"x_min\":0,\"x_max\":915,\"ha\":997,\"o\":\"m 527 0 l 389 0 l 389 122 q 110 231 220 122 q 0 509 0 340 q 110 785 0 677 q 389 893 220 893 l 389 1013 l 527 1013 l 527 893 q 804 786 693 893 q 915 509 915 679 q 805 231 915 341 q 527 122 696 122 l 527 0 m 527 226 q 712 310 641 226 q 779 507 779 389 q 712 705 779 627 q 527 787 641 787 l 527 226 m 389 226 l 389 787 q 205 698 275 775 q 136 505 136 620 q 206 308 136 391 q 389 226 276 226 \"},\"⁋\":{\"x_min\":0,\"x_max\":0,\"ha\":694},\"j\":{\"x_min\":-77.78125,\"x_max\":167,\"ha\":349,\"o\":\"m 167 871 l 42 871 l 42 1013 l 167 1013 l 167 871 m 167 -80 q 121 -231 167 -184 q -26 -278 76 -278 l -77 -278 l -77 -164 l -41 -164 q 26 -143 11 -164 q 42 -65 42 -122 l 42 737 l 167 737 l 167 -80 \"},\"Σ\":{\"x_min\":0,\"x_max\":756.953125,\"ha\":819,\"o\":\"m 756 0 l 0 0 l 0 107 l 395 523 l 22 904 l 22 1013 l 745 1013 l 745 889 l 209 889 l 566 523 l 187 125 l 756 125 l 756 0 \"},\"1\":{\"x_min\":215.671875,\"x_max\":574,\"ha\":792,\"o\":\"m 574 0 l 442 0 l 442 697 l 215 697 l 215 796 q 386 833 330 796 q 475 986 447 875 l 574 986 l 574 0 \"},\"›\":{\"x_min\":18.0625,\"x_max\":774,\"ha\":792,\"o\":\"m 774 376 l 18 40 l 18 149 l 631 421 l 18 692 l 18 799 l 774 465 l 774 376 \"},\"<\":{\"x_min\":17.984375,\"x_max\":773.609375,\"ha\":792,\"o\":\"m 773 40 l 18 376 l 17 465 l 773 799 l 773 692 l 159 420 l 773 149 l 773 40 \"},\"£\":{\"x_min\":0,\"x_max\":704.484375,\"ha\":801,\"o\":\"m 704 41 q 623 -10 664 5 q 543 -26 583 -26 q 359 15 501 -26 q 243 36 288 36 q 158 23 197 36 q 73 -21 119 10 l 6 76 q 125 195 90 150 q 175 331 175 262 q 147 443 175 383 l 0 443 l 0 512 l 108 512 q 43 734 43 623 q 120 929 43 854 q 358 1010 204 1010 q 579 936 487 1010 q 678 729 678 857 l 678 684 l 552 684 q 504 838 552 780 q 362 896 457 896 q 216 852 263 896 q 176 747 176 815 q 199 627 176 697 q 248 512 217 574 l 468 512 l 468 443 l 279 443 q 297 356 297 398 q 230 194 297 279 q 153 107 211 170 q 227 133 190 125 q 293 142 264 142 q 410 119 339 142 q 516 96 482 96 q 579 105 550 96 q 648 142 608 115 l 704 41 \"},\"t\":{\"x_min\":0,\"x_max\":367,\"ha\":458,\"o\":\"m 367 0 q 312 -5 339 -2 q 262 -8 284 -8 q 145 28 183 -8 q 108 143 108 64 l 108 638 l 0 638 l 0 738 l 108 738 l 108 944 l 232 944 l 232 738 l 367 738 l 367 638 l 232 638 l 232 185 q 248 121 232 140 q 307 102 264 102 q 345 104 330 102 q 367 107 360 107 l 367 0 \"},\"¬\":{\"x_min\":0,\"x_max\":706,\"ha\":803,\"o\":\"m 706 411 l 706 158 l 630 158 l 630 335 l 0 335 l 0 411 l 706 411 \"},\"λ\":{\"x_min\":0,\"x_max\":750,\"ha\":803,\"o\":\"m 750 -7 q 679 -15 716 -15 q 538 59 591 -15 q 466 214 512 97 l 336 551 l 126 0 l 0 0 l 270 705 q 223 837 247 770 q 116 899 190 899 q 90 898 100 899 l 90 1004 q 152 1011 125 1011 q 298 938 244 1011 q 373 783 326 901 l 605 192 q 649 115 629 136 q 716 95 669 95 l 736 95 q 750 97 745 97 l 750 -7 \"},\"W\":{\"x_min\":0,\"x_max\":1263.890625,\"ha\":1351,\"o\":\"m 1263 1013 l 995 0 l 859 0 l 627 837 l 405 0 l 265 0 l 0 1013 l 136 1013 l 342 202 l 556 1013 l 701 1013 l 921 207 l 1133 1012 l 1263 1013 \"},\">\":{\"x_min\":18.0625,\"x_max\":774,\"ha\":792,\"o\":\"m 774 376 l 18 40 l 18 149 l 631 421 l 18 692 l 18 799 l 774 465 l 774 376 \"},\"v\":{\"x_min\":0,\"x_max\":675.15625,\"ha\":761,\"o\":\"m 675 738 l 404 0 l 272 0 l 0 738 l 133 737 l 340 147 l 541 737 l 675 738 \"},\"τ\":{\"x_min\":0.28125,\"x_max\":644.5,\"ha\":703,\"o\":\"m 644 628 l 382 628 l 382 179 q 388 120 382 137 q 436 91 401 91 q 474 94 447 91 q 504 97 501 97 l 504 0 q 454 -9 482 -5 q 401 -14 426 -14 q 278 67 308 -14 q 260 233 260 118 l 260 628 l 0 628 l 0 739 l 644 739 l 644 628 \"},\"ξ\":{\"x_min\":0,\"x_max\":624.9375,\"ha\":699,\"o\":\"m 624 -37 q 608 -153 624 -96 q 563 -278 593 -211 l 454 -278 q 491 -183 486 -200 q 511 -83 511 -126 q 484 -23 511 -44 q 370 1 452 1 q 323 0 354 1 q 283 -1 293 -1 q 84 76 169 -1 q 0 266 0 154 q 56 431 0 358 q 197 538 108 498 q 94 613 134 562 q 54 730 54 665 q 77 823 54 780 q 143 901 101 867 l 27 901 l 27 1012 l 576 1012 l 576 901 l 380 901 q 244 863 303 901 q 178 745 178 820 q 312 600 178 636 q 532 582 380 582 l 532 479 q 276 455 361 479 q 118 281 118 410 q 165 173 118 217 q 274 120 208 133 q 494 101 384 110 q 624 -37 624 76 \"},\"&\":{\"x_min\":-3,\"x_max\":894.25,\"ha\":992,\"o\":\"m 894 0 l 725 0 l 624 123 q 471 0 553 40 q 306 -41 390 -41 q 168 -7 231 -41 q 62 92 105 26 q 14 187 31 139 q -3 276 -3 235 q 55 433 -3 358 q 248 581 114 508 q 170 689 196 640 q 137 817 137 751 q 214 985 137 922 q 384 1041 284 1041 q 548 988 483 1041 q 622 824 622 928 q 563 666 622 739 q 431 556 516 608 l 621 326 q 649 407 639 361 q 663 493 653 426 l 781 493 q 703 229 781 352 l 894 0 m 504 818 q 468 908 504 877 q 384 940 433 940 q 293 907 331 940 q 255 818 255 875 q 289 714 255 767 q 363 628 313 678 q 477 729 446 682 q 504 818 504 771 m 556 209 l 314 499 q 179 395 223 449 q 135 283 135 341 q 146 222 135 253 q 183 158 158 192 q 333 80 241 80 q 556 209 448 80 \"},\"Λ\":{\"x_min\":0,\"x_max\":862.5,\"ha\":942,\"o\":\"m 862 0 l 719 0 l 426 847 l 143 0 l 0 0 l 356 1013 l 501 1013 l 862 0 \"},\"I\":{\"x_min\":41,\"x_max\":180,\"ha\":293,\"o\":\"m 180 0 l 41 0 l 41 1013 l 180 1013 l 180 0 \"},\"G\":{\"x_min\":0,\"x_max\":921,\"ha\":1011,\"o\":\"m 921 0 l 832 0 l 801 136 q 655 15 741 58 q 470 -28 568 -28 q 126 133 259 -28 q 0 499 0 284 q 125 881 0 731 q 486 1043 259 1043 q 763 957 647 1043 q 905 709 890 864 l 772 709 q 668 866 747 807 q 486 926 589 926 q 228 795 322 926 q 142 507 142 677 q 228 224 142 342 q 483 94 323 94 q 712 195 625 94 q 796 435 796 291 l 477 435 l 477 549 l 921 549 l 921 0 \"},\"ΰ\":{\"x_min\":0,\"x_max\":617,\"ha\":725,\"o\":\"m 524 800 l 414 800 l 414 925 l 524 925 l 524 800 m 183 800 l 73 800 l 73 925 l 183 925 l 183 800 m 617 352 q 540 93 617 199 q 308 -24 455 -24 q 76 93 161 -24 q 0 352 0 199 l 0 738 l 126 738 l 126 354 q 169 185 126 257 q 312 98 220 98 q 451 185 402 98 q 492 354 492 257 l 492 738 l 617 738 l 617 352 m 489 1040 l 300 819 l 216 819 l 351 1040 l 489 1040 \"},\"`\":{\"x_min\":0,\"x_max\":138.890625,\"ha\":236,\"o\":\"m 138 699 l 0 699 l 0 861 q 36 974 0 929 q 138 1041 72 1020 l 138 977 q 82 931 95 969 q 69 839 69 893 l 138 839 l 138 699 \"},\"·\":{\"x_min\":0,\"x_max\":142,\"ha\":239,\"o\":\"m 142 585 l 0 585 l 0 738 l 142 738 l 142 585 \"},\"Υ\":{\"x_min\":0.328125,\"x_max\":819.515625,\"ha\":889,\"o\":\"m 819 1013 l 482 416 l 482 0 l 342 0 l 342 416 l 0 1013 l 140 1013 l 411 533 l 679 1013 l 819 1013 \"},\"r\":{\"x_min\":0,\"x_max\":355.5625,\"ha\":432,\"o\":\"m 355 621 l 343 621 q 179 569 236 621 q 122 411 122 518 l 122 0 l 0 0 l 0 737 l 117 737 l 117 604 q 204 719 146 686 q 355 753 262 753 l 355 621 \"},\"x\":{\"x_min\":0,\"x_max\":675,\"ha\":764,\"o\":\"m 675 0 l 525 0 l 331 286 l 144 0 l 0 0 l 256 379 l 12 738 l 157 737 l 336 473 l 516 738 l 661 738 l 412 380 l 675 0 \"},\"μ\":{\"x_min\":0,\"x_max\":696.609375,\"ha\":747,\"o\":\"m 696 -4 q 628 -14 657 -14 q 498 97 513 -14 q 422 8 470 41 q 313 -24 374 -24 q 207 3 258 -24 q 120 80 157 31 l 120 -278 l 0 -278 l 0 738 l 124 738 l 124 343 q 165 172 124 246 q 308 82 216 82 q 451 177 402 82 q 492 358 492 254 l 492 738 l 616 738 l 616 214 q 623 136 616 160 q 673 92 636 92 q 696 95 684 92 l 696 -4 \"},\"h\":{\"x_min\":0,\"x_max\":615,\"ha\":724,\"o\":\"m 615 472 l 615 0 l 490 0 l 490 454 q 456 590 490 535 q 338 654 416 654 q 186 588 251 654 q 122 436 122 522 l 122 0 l 0 0 l 0 1013 l 122 1013 l 122 633 q 218 727 149 694 q 362 760 287 760 q 552 676 484 760 q 615 472 615 600 \"},\".\":{\"x_min\":0,\"x_max\":142,\"ha\":239,\"o\":\"m 142 0 l 0 0 l 0 151 l 142 151 l 142 0 \"},\"φ\":{\"x_min\":-2,\"x_max\":878,\"ha\":974,\"o\":\"m 496 -279 l 378 -279 l 378 -17 q 101 88 204 -17 q -2 367 -2 194 q 68 626 -2 510 q 283 758 151 758 l 283 646 q 167 537 209 626 q 133 373 133 462 q 192 177 133 254 q 378 93 259 93 l 378 758 q 445 764 426 763 q 476 765 464 765 q 765 659 653 765 q 878 377 878 553 q 771 96 878 209 q 496 -17 665 -17 l 496 -279 m 496 93 l 514 93 q 687 183 623 93 q 746 380 746 265 q 691 569 746 491 q 522 658 629 658 l 496 656 l 496 93 \"},\";\":{\"x_min\":0,\"x_max\":142,\"ha\":239,\"o\":\"m 142 585 l 0 585 l 0 738 l 142 738 l 142 585 m 142 -12 q 105 -132 142 -82 q 0 -206 68 -182 l 0 -138 q 58 -82 43 -123 q 68 0 68 -56 l 0 0 l 0 151 l 142 151 l 142 -12 \"},\"f\":{\"x_min\":0,\"x_max\":378,\"ha\":472,\"o\":\"m 378 638 l 246 638 l 246 0 l 121 0 l 121 638 l 0 638 l 0 738 l 121 738 q 137 935 121 887 q 290 1028 171 1028 q 320 1027 305 1028 q 378 1021 334 1026 l 378 908 q 323 918 346 918 q 257 870 273 918 q 246 780 246 840 l 246 738 l 378 738 l 378 638 \"},\"“\":{\"x_min\":1,\"x_max\":348.21875,\"ha\":454,\"o\":\"m 140 670 l 1 670 l 1 830 q 37 943 1 897 q 140 1011 74 990 l 140 947 q 82 900 97 940 q 68 810 68 861 l 140 810 l 140 670 m 348 670 l 209 670 l 209 830 q 245 943 209 897 q 348 1011 282 990 l 348 947 q 290 900 305 940 q 276 810 276 861 l 348 810 l 348 670 \"},\"A\":{\"x_min\":0.03125,\"x_max\":906.953125,\"ha\":1008,\"o\":\"m 906 0 l 756 0 l 648 303 l 251 303 l 142 0 l 0 0 l 376 1013 l 529 1013 l 906 0 m 610 421 l 452 867 l 293 421 l 610 421 \"},\"6\":{\"x_min\":53,\"x_max\":739,\"ha\":792,\"o\":\"m 739 312 q 633 62 739 162 q 400 -31 534 -31 q 162 78 257 -31 q 53 439 53 206 q 178 859 53 712 q 441 986 284 986 q 643 912 559 986 q 732 713 732 833 l 601 713 q 544 830 594 786 q 426 875 494 875 q 268 793 331 875 q 193 517 193 697 q 301 597 240 570 q 427 624 362 624 q 643 540 552 624 q 739 312 739 451 m 603 298 q 540 461 603 400 q 404 516 484 516 q 268 461 323 516 q 207 300 207 401 q 269 137 207 198 q 405 83 325 83 q 541 137 486 83 q 603 298 603 197 \"},\"‘\":{\"x_min\":1,\"x_max\":139.890625,\"ha\":236,\"o\":\"m 139 670 l 1 670 l 1 830 q 37 943 1 897 q 139 1011 74 990 l 139 947 q 82 900 97 940 q 68 810 68 861 l 139 810 l 139 670 \"},\"ϊ\":{\"x_min\":-70,\"x_max\":283,\"ha\":361,\"o\":\"m 283 800 l 173 800 l 173 925 l 283 925 l 283 800 m 40 800 l -70 800 l -70 925 l 40 925 l 40 800 m 283 3 q 232 -10 257 -5 q 181 -15 206 -15 q 84 26 118 -15 q 41 200 41 79 l 41 737 l 166 737 l 167 215 q 171 141 167 157 q 225 101 182 101 q 247 103 238 101 q 283 112 256 104 l 283 3 \"},\"π\":{\"x_min\":-0.21875,\"x_max\":773.21875,\"ha\":857,\"o\":\"m 773 -7 l 707 -11 q 575 40 607 -11 q 552 174 552 77 l 552 226 l 552 626 l 222 626 l 222 0 l 97 0 l 97 626 l 0 626 l 0 737 l 773 737 l 773 626 l 676 626 l 676 171 q 695 103 676 117 q 773 90 714 90 l 773 -7 \"},\"ά\":{\"x_min\":0,\"x_max\":765.5625,\"ha\":809,\"o\":\"m 765 -4 q 698 -14 726 -14 q 564 97 586 -14 q 466 7 525 40 q 337 -26 407 -26 q 88 98 186 -26 q 0 369 0 212 q 88 637 0 525 q 337 760 184 760 q 465 727 407 760 q 563 637 524 695 l 563 738 l 685 738 l 685 222 q 693 141 685 168 q 748 94 708 94 q 765 95 760 94 l 765 -4 m 584 371 q 531 562 584 485 q 360 653 470 653 q 192 566 254 653 q 135 379 135 489 q 186 181 135 261 q 358 84 247 84 q 528 176 465 84 q 584 371 584 260 m 604 1040 l 415 819 l 332 819 l 466 1040 l 604 1040 \"},\"O\":{\"x_min\":0,\"x_max\":958,\"ha\":1057,\"o\":\"m 485 1041 q 834 882 702 1041 q 958 512 958 734 q 834 136 958 287 q 481 -26 702 -26 q 126 130 261 -26 q 0 504 0 279 q 127 880 0 728 q 485 1041 263 1041 m 480 98 q 731 225 638 98 q 815 504 815 340 q 733 783 815 669 q 480 912 640 912 q 226 784 321 912 q 142 504 142 670 q 226 224 142 339 q 480 98 319 98 \"},\"n\":{\"x_min\":0,\"x_max\":615,\"ha\":724,\"o\":\"m 615 463 l 615 0 l 490 0 l 490 454 q 453 592 490 537 q 331 656 410 656 q 178 585 240 656 q 117 421 117 514 l 117 0 l 0 0 l 0 738 l 117 738 l 117 630 q 218 728 150 693 q 359 764 286 764 q 552 675 484 764 q 615 463 615 593 \"},\"3\":{\"x_min\":54,\"x_max\":737,\"ha\":792,\"o\":\"m 737 284 q 635 55 737 141 q 399 -25 541 -25 q 156 52 248 -25 q 54 308 54 140 l 185 308 q 245 147 185 202 q 395 96 302 96 q 539 140 484 96 q 602 280 602 190 q 510 429 602 390 q 324 454 451 454 l 324 565 q 487 584 441 565 q 565 719 565 617 q 515 835 565 791 q 395 879 466 879 q 255 824 307 879 q 203 661 203 769 l 78 661 q 166 909 78 822 q 387 992 250 992 q 603 921 513 992 q 701 723 701 844 q 669 607 701 656 q 578 524 637 558 q 696 434 655 499 q 737 284 737 369 \"},\"9\":{\"x_min\":53,\"x_max\":739,\"ha\":792,\"o\":\"m 739 524 q 619 94 739 241 q 362 -32 516 -32 q 150 47 242 -32 q 59 244 59 126 l 191 244 q 246 129 191 176 q 373 82 301 82 q 526 161 466 82 q 597 440 597 255 q 363 334 501 334 q 130 432 216 334 q 53 650 53 521 q 134 880 53 786 q 383 986 226 986 q 659 841 566 986 q 739 524 739 719 m 388 449 q 535 514 480 449 q 585 658 585 573 q 535 805 585 744 q 388 873 480 873 q 242 809 294 873 q 191 658 191 745 q 239 514 191 572 q 388 449 292 449 \"},\"l\":{\"x_min\":41,\"x_max\":166,\"ha\":279,\"o\":\"m 166 0 l 41 0 l 41 1013 l 166 1013 l 166 0 \"},\"¤\":{\"x_min\":40.09375,\"x_max\":728.796875,\"ha\":825,\"o\":\"m 728 304 l 649 224 l 512 363 q 383 331 458 331 q 256 363 310 331 l 119 224 l 40 304 l 177 441 q 150 553 150 493 q 184 673 150 621 l 40 818 l 119 898 l 267 749 q 321 766 291 759 q 384 773 351 773 q 447 766 417 773 q 501 749 477 759 l 649 898 l 728 818 l 585 675 q 612 618 604 648 q 621 553 621 587 q 591 441 621 491 l 728 304 m 384 682 q 280 643 318 682 q 243 551 243 604 q 279 461 243 499 q 383 423 316 423 q 487 461 449 423 q 525 553 525 500 q 490 641 525 605 q 384 682 451 682 \"},\"κ\":{\"x_min\":0,\"x_max\":632.328125,\"ha\":679,\"o\":\"m 632 0 l 482 0 l 225 384 l 124 288 l 124 0 l 0 0 l 0 738 l 124 738 l 124 446 l 433 738 l 596 738 l 312 466 l 632 0 \"},\"4\":{\"x_min\":48,\"x_max\":742.453125,\"ha\":792,\"o\":\"m 742 243 l 602 243 l 602 0 l 476 0 l 476 243 l 48 243 l 48 368 l 476 958 l 602 958 l 602 354 l 742 354 l 742 243 m 476 354 l 476 792 l 162 354 l 476 354 \"},\"p\":{\"x_min\":0,\"x_max\":685,\"ha\":786,\"o\":\"m 685 364 q 598 96 685 205 q 350 -23 504 -23 q 121 89 205 -23 l 121 -278 l 0 -278 l 0 738 l 121 738 l 121 633 q 220 726 159 691 q 351 761 280 761 q 598 636 504 761 q 685 364 685 522 m 557 371 q 501 560 557 481 q 330 651 437 651 q 162 559 223 651 q 108 366 108 479 q 162 177 108 254 q 333 87 224 87 q 502 178 441 87 q 557 371 557 258 \"},\"‡\":{\"x_min\":0,\"x_max\":777,\"ha\":835,\"o\":\"m 458 238 l 458 0 l 319 0 l 319 238 l 0 238 l 0 360 l 319 360 l 319 681 l 0 683 l 0 804 l 319 804 l 319 1015 l 458 1013 l 458 804 l 777 804 l 777 683 l 458 683 l 458 360 l 777 360 l 777 238 l 458 238 \"},\"ψ\":{\"x_min\":0,\"x_max\":808,\"ha\":907,\"o\":\"m 465 -278 l 341 -278 l 341 -15 q 87 102 180 -15 q 0 378 0 210 l 0 739 l 133 739 l 133 379 q 182 195 133 275 q 341 98 242 98 l 341 922 l 465 922 l 465 98 q 623 195 563 98 q 675 382 675 278 l 675 742 l 808 742 l 808 381 q 720 104 808 213 q 466 -13 627 -13 l 465 -278 \"},\"η\":{\"x_min\":0.78125,\"x_max\":697,\"ha\":810,\"o\":\"m 697 -278 l 572 -278 l 572 454 q 540 587 572 536 q 425 650 501 650 q 271 579 337 650 q 206 420 206 509 l 206 0 l 81 0 l 81 489 q 73 588 81 562 q 0 644 56 644 l 0 741 q 68 755 38 755 q 158 720 124 755 q 200 630 193 686 q 297 726 234 692 q 434 761 359 761 q 620 692 544 761 q 697 516 697 624 l 697 -278 \"}},\"cssFontWeight\":\"normal\",\"ascender\":1189,\"underlinePosition\":-100,\"cssFontStyle\":\"normal\",\"boundingBox\":{\"yMin\":-334,\"xMin\":-111,\"yMax\":1189,\"xMax\":1672},\"resolution\":1000,\"original_font_information\":{\"postscript_name\":\"Helvetiker-Regular\",\"version_string\":\"Version 1.00 2004 initial release\",\"vendor_url\":\"http://www.magenta.gr/\",\"full_font_name\":\"Helvetiker\",\"font_family_name\":\"Helvetiker\",\"copyright\":\"Copyright (c) Μagenta ltd, 2004\",\"description\":\"\",\"trademark\":\"\",\"designer\":\"\",\"designer_url\":\"\",\"unique_font_identifier\":\"Μagenta ltd:Helvetiker:22-10-104\",\"license_url\":\"http://www.ellak.gr/fonts/MgOpen/license.html\",\"license_description\":\"Copyright (c) 2004 by MAGENTA Ltd. All Rights Reserved.\\r\\n\\r\\nPermission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license (\\\"Fonts\\\") and associated documentation files (the \\\"Font Software\\\"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: \\r\\n\\r\\nThe above copyright and this permission notice shall be included in all copies of one or more of the Font Software typefaces.\\r\\n\\r\\nThe Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing the word \\\"MgOpen\\\", or if the modifications are accepted for inclusion in the Font Software itself by the each appointed Administrator.\\r\\n\\r\\nThis License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the \\\"MgOpen\\\" name.\\r\\n\\r\\nThe Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. \\r\\n\\r\\nTHE FONT SOFTWARE IS PROVIDED \\\"AS IS\\\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL MAGENTA OR PERSONS OR BODIES IN CHARGE OF ADMINISTRATION AND MAINTENANCE OF THE FONT SOFTWARE BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.\",\"manufacturer_name\":\"Μagenta ltd\",\"font_sub_family_name\":\"Regular\"},\"descender\":-334,\"familyName\":\"Helvetiker\",\"lineHeight\":1522,\"underlineThickness\":50});"
  },
  {
    "path": "browser/data/graphs/create-360.json",
    "content": "{\"abs_t\":176.425,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"three_scene\",\"x\":782,\"y\":224,\"uid\":\"00UK6F2YJ1Jm\",\"dyn_in\":[{\"type\":0,\"name\":\"0\",\"dt\":21,\"array\":true,\"uid\":\"DDzcOXqI6iRM\",\"dynamic\":true,\"index\":0,\"is_connected\":true},{\"type\":0,\"name\":\"1\",\"dt\":21,\"array\":true,\"uid\":\"GB53e2RyZLcu\",\"dynamic\":true,\"index\":1}]},{\"plugin\":\"graph\",\"x\":1008,\"y\":282,\"uid\":\"bq2VD7NF4DmB\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{\"WLWdrkwS3gFf\":\"z1KxOMnrGYf2\"},\"output_sids\":{}},\"title\":\"Camera Render\",\"graph\":{\"uid\":\"uWGVHqS8Cqa7\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_webgl_renderer\",\"x\":676,\"y\":281,\"uid\":\"qsf10FaUcxDW\",\"open\":false,\"state\":{\"always_update\":true}},{\"plugin\":\"graph\",\"x\":424,\"y\":230,\"uid\":\"Hroayz0vSwXM\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"liwCEB5q22Mo\":\"8GpdZjiiiEQa\"}},\"title\":\"VR camera\",\"graph\":{\"uid\":\"MFeJA4KxD3yv\",\"parent_uid\":\"uWGVHqS8Cqa7\",\"open\":true,\"nodes\":[{\"plugin\":\"three_vr_camera\",\"x\":974,\"y\":275,\"uid\":\"03wW6bFqTLmA\",\"open\":false,\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1211,\"y\":294,\"uid\":\"liwCEB5q22Mo\",\"title\":\"camera\",\"dyn_in\":[{\"name\":\"output\",\"dt\":6,\"def\":null,\"uid\":\"uyyGR7LQwSEh\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"slider_float_generator\",\"x\":413,\"y\":185,\"uid\":\"9wO11fjxyGFe\",\"state\":{\"val\":0,\"min\":-1,\"max\":1},\"title\":\"Position X\"},{\"plugin\":\"slider_float_generator\",\"x\":413,\"y\":286,\"uid\":\"m6yYmoa0DoBh\",\"state\":{\"val\":0,\"min\":-1,\"max\":1},\"title\":\"Position Y\"},{\"plugin\":\"slider_float_generator\",\"x\":414,\"y\":387,\"uid\":\"8KDkHtpbA7mU\",\"state\":{\"val\":0,\"min\":-2,\"max\":2},\"title\":\"Position Z\"},{\"plugin\":\"vector\",\"x\":736,\"y\":283,\"uid\":\"7r9opmp4EOfQ\",\"open\":false,\"title\":\"Camera position\"},{\"plugin\":\"const_float_generator\",\"x\":772,\"y\":183,\"uid\":\"mVMM95SpIE2X\",\"state\":{\"val\":90},\"title\":\"FOV\"}],\"conns\":[{\"src_nuid\":\"03wW6bFqTLmA\",\"dst_nuid\":\"liwCEB5q22Mo\",\"src_slot\":\"camera\",\"dst_slot\":0,\"uid\":\"h0Ri0uUMV2uy\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"9wO11fjxyGFe\",\"dst_nuid\":\"7r9opmp4EOfQ\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"tehTyxVKXZcW\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"m6yYmoa0DoBh\",\"dst_nuid\":\"7r9opmp4EOfQ\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"BKT8KTHDLuKn\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"8KDkHtpbA7mU\",\"dst_nuid\":\"7r9opmp4EOfQ\",\"src_slot\":\"value\",\"dst_slot\":\"z\",\"uid\":\"A6FEN4IZufRp\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"7r9opmp4EOfQ\",\"dst_nuid\":\"03wW6bFqTLmA\",\"src_slot\":\"vector\",\"dst_slot\":\"position\",\"uid\":\"LJqOmoC8BPDd\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"camera\",\"dt\":6,\"index\":0,\"uid\":\"8GpdZjiiiEQa\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":469,\"y\":345,\"uid\":\"WLWdrkwS3gFf\",\"title\":\"scene\",\"dyn_out\":[{\"name\":\"input\",\"dt\":11,\"uid\":\"i6ENeLxOTwVB\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]}],\"conns\":[{\"src_nuid\":\"Hroayz0vSwXM\",\"dst_nuid\":\"qsf10FaUcxDW\",\"src_slot\":0,\"dst_slot\":\"camera\",\"uid\":\"FarsJBXPrmI9\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"WLWdrkwS3gFf\",\"dst_nuid\":\"qsf10FaUcxDW\",\"src_slot\":0,\"dst_slot\":\"scene\",\"uid\":\"Ce7Hq5KgXSaD\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true}]},\"dyn_in\":[{\"name\":\"scene\",\"dt\":11,\"index\":0,\"uid\":\"z1KxOMnrGYf2\",\"dynamic\":true,\"type\":0,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":570,\"y\":130,\"uid\":\"wnpYpbex33Dg\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{\"SD9yM79tQagg\":\"lOz0fKTfMesH\"},\"output_sids\":{\"gvKr4YJkDYuY\":\"mh0rTKkFm0nD\"}},\"title\":\"360 photo\",\"graph\":{\"uid\":\"bGS6n5sMMRQQ\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1252,\"y\":373,\"uid\":\"GwM8FP5MBSmp\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1438,\"y\":405,\"uid\":\"gvKr4YJkDYuY\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_material\",\"x\":974,\"y\":130,\"uid\":\"WhHdndkrhvgM\"},{\"plugin\":\"const_float_generator\",\"x\":723,\"y\":214,\"uid\":\"FhGU4AVerbsG\",\"state\":{\"val\":1},\"title\":\"Side\"},{\"plugin\":\"three_uv_modifier\",\"x\":553,\"y\":87,\"uid\":\"M4Vd8umeJT4D\"},{\"plugin\":\"const_float_generator\",\"x\":297,\"y\":197,\"uid\":\"k37EVAuHVpru\",\"state\":{\"val\":-1},\"title\":\"X repeat photo\"},{\"plugin\":\"input_proxy\",\"x\":321,\"y\":122,\"uid\":\"SD9yM79tQagg\",\"title\":\"texture\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"q2TtZnBOutlf\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_geometry_sphere\",\"x\":939,\"y\":467,\"uid\":\"njf8DxW9mDNM\"},{\"plugin\":\"const_float_generator\",\"x\":670,\"y\":421,\"uid\":\"VMPPPeAxneNP\",\"state\":{\"val\":30},\"title\":\"Radius\"},{\"plugin\":\"const_float_generator\",\"x\":676,\"y\":502,\"uid\":\"CCkHwQSXU2wb\",\"state\":{\"val\":40},\"title\":\"Width Segments\"},{\"plugin\":\"const_float_generator\",\"x\":678,\"y\":584,\"uid\":\"t9GQgsE6qKcv\",\"state\":{\"val\":40},\"title\":\"Height Segments\"},{\"plugin\":\"toggle_button\",\"x\":724,\"y\":292,\"uid\":\"tDNLkWwrWMgK\",\"state\":{\"enabled\":false},\"title\":\"Fog\"}],\"conns\":[{\"src_nuid\":\"GwM8FP5MBSmp\",\"dst_nuid\":\"gvKr4YJkDYuY\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"5CBzvmnuqW5K\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"WhHdndkrhvgM\",\"dst_nuid\":\"GwM8FP5MBSmp\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"zpMuEXUxsz6Y\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"FhGU4AVerbsG\",\"dst_nuid\":\"WhHdndkrhvgM\",\"src_slot\":\"value\",\"dst_slot\":\"side\",\"uid\":\"95yfrvTKjaFg\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"M4Vd8umeJT4D\",\"dst_nuid\":\"WhHdndkrhvgM\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"4jcu4Q2REXGL\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"k37EVAuHVpru\",\"dst_nuid\":\"M4Vd8umeJT4D\",\"src_slot\":\"value\",\"dst_slot\":\"u repeat\",\"uid\":\"guYrCuvu7LrP\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"SD9yM79tQagg\",\"dst_nuid\":\"M4Vd8umeJT4D\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"pA4PHmjSZsyt\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"VMPPPeAxneNP\",\"dst_nuid\":\"njf8DxW9mDNM\",\"src_slot\":\"value\",\"dst_slot\":\"radius\",\"uid\":\"CcKEu3vaJj28\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"CCkHwQSXU2wb\",\"dst_nuid\":\"njf8DxW9mDNM\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"MvbBCGVMmLAp\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"t9GQgsE6qKcv\",\"dst_nuid\":\"njf8DxW9mDNM\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"mUs8e8U3CPQp\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"njf8DxW9mDNM\",\"dst_nuid\":\"GwM8FP5MBSmp\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"AXtfFzpYuLTW\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"tDNLkWwrWMgK\",\"dst_nuid\":\"WhHdndkrhvgM\",\"src_slot\":\"bool\",\"dst_slot\":\"fog\",\"uid\":\"aXfSUJK7Gdhm\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"texture\",\"dt\":2,\"index\":0,\"uid\":\"lOz0fKTfMesH\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":333,\"y\":131,\"uid\":\"7KLN6RS39D5P\",\"state\":{\"url\":\"/data/image/40ccadce098f8bf871aabbf66b94997890e94cad.png\"}}],\"conns\":[{\"src_nuid\":\"00UK6F2YJ1Jm\",\"dst_nuid\":\"bq2VD7NF4DmB\",\"src_slot\":\"scene\",\"dst_slot\":0,\"uid\":\"OhE7E2jFDGuE\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"7KLN6RS39D5P\",\"dst_nuid\":\"wnpYpbex33Dg\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"jaypKy3vmxK5\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"wnpYpbex33Dg\",\"dst_nuid\":\"00UK6F2YJ1Jm\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"xJc4PnPU9a43\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true}]}}"
  },
  {
    "path": "browser/data/graphs/default.json",
    "content": "{\"abs_t\":0.0,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":1351,\"y\":399,\"uid\":\"GKCJDXV2557h\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{\"FMcyzwxMutQ2\":\"lbU7hDvbnKfg\"},\"output_sids\":{}},\"title\":\"Camera\",\"graph\":{\"uid\":\"CM3ZPJd42DXF\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"input_proxy\",\"x\":366,\"y\":441,\"uid\":\"FMcyzwxMutQ2\",\"title\":\"scene\",\"dyn_out\":[{\"name\":\"input\",\"dt\":11,\"uid\":\"uGHXM4cdeVb3\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_webgl_renderer\",\"x\":992,\"y\":257,\"uid\":\"cNNpqQUaRrXL\",\"state\":{\"always_update\":true}},{\"plugin\":\"graph\",\"x\":330,\"y\":298,\"uid\":\"RtQdDec2QYjV\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"YaKvTqujhzz4\":\"8GpdZjiiiEQa\"}},\"title\":\"VR camera\",\"graph\":{\"uid\":\"TaKt97xAYuU9\",\"parent_uid\":\"CM3ZPJd42DXF\",\"open\":true,\"nodes\":[{\"plugin\":\"three_vr_camera\",\"x\":536,\"y\":212,\"uid\":\"pyUEv2XXrbau\",\"state\":{\"position\":{\"x\":0.0,\"y\":0.0,\"z\":3},\"quaternion\":{\"_x\":0.0,\"_y\":0.0,\"_z\":0.0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":787,\"y\":213,\"uid\":\"YaKvTqujhzz4\",\"title\":\"camera\",\"dyn_in\":[{\"name\":\"output\",\"dt\":6,\"def\":null,\"uid\":\"uyyGR7LQwSEh\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]}],\"conns\":[{\"src_nuid\":\"pyUEv2XXrbau\",\"dst_nuid\":\"YaKvTqujhzz4\",\"src_slot\":\"camera\",\"dst_slot\":0,\"uid\":\"wwcTdM5ynNXx\",\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"camera\",\"dt\":6,\"index\":0,\"uid\":\"8GpdZjiiiEQa\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"three_gaze_clicker\",\"x\":530,\"y\":383,\"uid\":\"GapUv39SvFCK\",\"state\":{}},{\"plugin\":\"toggle_button\",\"x\":791,\"y\":376,\"uid\":\"9S76s344PzLC\",\"open\":false,\"state\":{\"enabled\":true},\"title\":\"Shadows on\"}],\"conns\":[{\"src_nuid\":\"RtQdDec2QYjV\",\"dst_nuid\":\"cNNpqQUaRrXL\",\"src_slot\":0,\"dst_slot\":\"camera\",\"uid\":\"KVhCVJEf3aDx\",\"src_dyn\":true},{\"src_nuid\":\"RtQdDec2QYjV\",\"dst_nuid\":\"GapUv39SvFCK\",\"src_slot\":0,\"dst_slot\":\"camera\",\"uid\":\"SEaBb88BvVBk\",\"src_dyn\":true},{\"src_nuid\":\"FMcyzwxMutQ2\",\"dst_nuid\":\"GapUv39SvFCK\",\"src_slot\":0,\"dst_slot\":\"scene\",\"uid\":\"yfun7WkqrWqV\",\"src_dyn\":true},{\"src_nuid\":\"GapUv39SvFCK\",\"dst_nuid\":\"cNNpqQUaRrXL\",\"src_slot\":\"scene\",\"dst_slot\":\"scene\",\"uid\":\"zbCDXdmCu3Fv\"},{\"src_nuid\":\"9S76s344PzLC\",\"dst_nuid\":\"cNNpqQUaRrXL\",\"src_slot\":\"bool\",\"dst_slot\":\"shadowsEnabled\",\"uid\":\"b6Ew8t87ynjL\"}]},\"dyn_in\":[{\"name\":\"scene\",\"dt\":11,\"index\":0,\"uid\":\"lbU7hDvbnKfg\",\"dynamic\":true,\"type\":0,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":899,\"y\":279,\"uid\":\"gGw2wjkkNcZr\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"sEjMwSPqVFKn\":\"W3smJjpMU8x6\",\"5UWkvGtKHZMQ\":\"YLQ7aDrGGMXS\"}},\"title\":\"Sky\",\"graph\":{\"uid\":\"QNf3hjswwyQa\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_environment_settings\",\"x\":898,\"y\":559,\"uid\":\"6aMajKkzBEsn\",\"state\":{},\"title\":\"Fog settings\"},{\"plugin\":\"color_picker\",\"x\":337,\"y\":74,\"uid\":\"bWparLDbpKqm\",\"state\":{\"hue\":0.47191067415730337,\"sat\":0.23600000000000002,\"lum\":1},\"title\":\"Sky and Fog Color\"},{\"plugin\":\"slider_float_generator\",\"x\":627,\"y\":464,\"uid\":\"ezsRLhD3nuhr\",\"state\":{\"val\":0.1,\"min\":0.1,\"max\":40},\"title\":\"Fog near\"},{\"plugin\":\"slider_float_generator\",\"x\":624,\"y\":574,\"uid\":\"3zQdeStvZKD6\",\"state\":{\"val\":76.62,\"min\":1,\"max\":200},\"title\":\"Fog far\"},{\"plugin\":\"entity\",\"x\":600,\"y\":198,\"uid\":\"GnP3EqDAZDjd\",\"state\":{\"always_update\":true,\"input_sids\":{\"dCCgUsUnptyR\":\"J6FCvd7jCCh9\",\"rD2fSL9cxhD6\":\"dUVuVcE5KHpv\"},\"output_sids\":{\"487z7QL3NTHK\":\"mh0rTKkFm0nD\"}},\"title\":\"Sky settings\",\"graph\":{\"uid\":\"gnk7PdzWSt3r\",\"parent_uid\":\"QNf3hjswwyQa\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":967,\"y\":294,\"uid\":\"tm5ux6DBsr84\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1166,\"y\":295,\"uid\":\"487z7QL3NTHK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_material\",\"x\":747,\"y\":62,\"uid\":\"38HMD9C2Hs8F\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":470,\"y\":234,\"uid\":\"Zs34XH5J7MBC\",\"open\":false,\"state\":{\"val\":1},\"title\":\"Side\"},{\"plugin\":\"toggle_button\",\"x\":431,\"y\":172,\"uid\":\"29rXv8RLWtYB\",\"open\":false,\"state\":{\"enabled\":false},\"title\":\"Fog On/Off\"},{\"plugin\":\"const_float_generator\",\"x\":356,\"y\":365,\"uid\":\"sraW5fMgyEY7\",\"open\":false,\"state\":{\"val\":750},\"title\":\"Size\"},{\"plugin\":\"const_float_generator\",\"x\":356,\"y\":438,\"uid\":\"ryKFQHDbH5PU\",\"open\":false,\"state\":{\"val\":40},\"title\":\"Detail\"},{\"plugin\":\"three_geometry_sphere\",\"x\":623,\"y\":412,\"uid\":\"aqM9Hz4WzmUq\",\"open\":false},{\"plugin\":\"input_proxy\",\"x\":452,\"y\":82,\"uid\":\"dCCgUsUnptyR\",\"title\":\"Texture\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"tJGWHfug2jGf\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":447,\"y\":133,\"uid\":\"rD2fSL9cxhD6\",\"title\":\"Color\",\"dyn_out\":[{\"name\":\"input\",\"dt\":3,\"uid\":\"C2fAuEx8Qj2S\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]}],\"conns\":[{\"src_nuid\":\"tm5ux6DBsr84\",\"dst_nuid\":\"487z7QL3NTHK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"2zNpdYsheZyx\",\"dst_dyn\":true},{\"src_nuid\":\"38HMD9C2Hs8F\",\"dst_nuid\":\"tm5ux6DBsr84\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"PKyCn2K7daKD\"},{\"src_nuid\":\"sraW5fMgyEY7\",\"dst_nuid\":\"aqM9Hz4WzmUq\",\"src_slot\":\"value\",\"dst_slot\":\"radius\",\"uid\":\"Yp6t2CrYsebS\"},{\"src_nuid\":\"ryKFQHDbH5PU\",\"dst_nuid\":\"aqM9Hz4WzmUq\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"cg4YngDgNUjM\"},{\"src_nuid\":\"ryKFQHDbH5PU\",\"dst_nuid\":\"aqM9Hz4WzmUq\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"wJ9aXwNZYuU7\"},{\"src_nuid\":\"dCCgUsUnptyR\",\"dst_nuid\":\"38HMD9C2Hs8F\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"R22pNG6aMubg\",\"src_dyn\":true},{\"src_nuid\":\"29rXv8RLWtYB\",\"dst_nuid\":\"38HMD9C2Hs8F\",\"src_slot\":\"bool\",\"dst_slot\":\"fog\",\"uid\":\"CpQ8buBcCG3b\"},{\"src_nuid\":\"aqM9Hz4WzmUq\",\"dst_nuid\":\"tm5ux6DBsr84\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"mq8gFbK4FVAv\"},{\"src_nuid\":\"Zs34XH5J7MBC\",\"dst_nuid\":\"38HMD9C2Hs8F\",\"src_slot\":\"value\",\"dst_slot\":\"side\",\"uid\":\"7JnWV5UTFfwn\"},{\"src_nuid\":\"rD2fSL9cxhD6\",\"dst_nuid\":\"38HMD9C2Hs8F\",\"src_slot\":0,\"dst_slot\":\"color\",\"uid\":\"8VvqHuQJNkLg\",\"src_dyn\":true}]},\"dyn_in\":[{\"name\":\"Color\",\"dt\":3,\"index\":0,\"uid\":\"dUVuVcE5KHpv\",\"dynamic\":true,\"type\":0,\"is_connected\":true},{\"name\":\"Texture\",\"dt\":2,\"index\":1,\"uid\":\"J6FCvd7jCCh9\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":334,\"y\":575,\"uid\":\"YmLMVW2QfK9Z\",\"state\":{\"url\":\"/data/image/e1450576b103ce792bba386c0301d0124f20da15.png\"},\"title\":\"Sky texture\"},{\"plugin\":\"output_proxy\",\"x\":1145,\"y\":420,\"uid\":\"sEjMwSPqVFKn\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"Ls8p63cchBbJ\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"annotation\",\"x\":881,\"y\":260,\"uid\":\"5FKAhCQV8JnF\",\"state\":{\"text\":\"Connect the Sky texture\\ninto the texture slot\\nif you want a texture instead \\nof color for your sky. \\n\\nUse the Fog near & Far \\nto adjust the distance\\n fog effect\",\"width\":160,\"height\":144},\"title\":\"Sky & Fog\"},{\"plugin\":\"output_proxy\",\"x\":1141,\"y\":556,\"uid\":\"5UWkvGtKHZMQ\",\"title\":\"environment\",\"dyn_in\":[{\"name\":\"output\",\"dt\":23,\"def\":null,\"uid\":\"Yy89wKzOcZo4\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]}],\"conns\":[{\"src_nuid\":\"ezsRLhD3nuhr\",\"dst_nuid\":\"6aMajKkzBEsn\",\"src_slot\":\"value\",\"dst_slot\":\"fog near\",\"uid\":\"j6AZF6fwswAQ\"},{\"src_nuid\":\"3zQdeStvZKD6\",\"dst_nuid\":\"6aMajKkzBEsn\",\"src_slot\":\"value\",\"dst_slot\":\"fog far\",\"uid\":\"QECKtUeMeRzf\"},{\"src_nuid\":\"GnP3EqDAZDjd\",\"dst_nuid\":\"sEjMwSPqVFKn\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"tyTEy6kYyZms\",\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"6aMajKkzBEsn\",\"dst_nuid\":\"5UWkvGtKHZMQ\",\"src_slot\":\"environment\",\"dst_slot\":0,\"uid\":\"R88M83x4nTbj\",\"dst_dyn\":true},{\"src_nuid\":\"YmLMVW2QfK9Z\",\"dst_nuid\":\"GnP3EqDAZDjd\",\"src_slot\":\"texture\",\"dst_slot\":1,\"uid\":\"t3Yfm2muaxM6\",\"dst_dyn\":true},{\"src_nuid\":\"bWparLDbpKqm\",\"dst_nuid\":\"GnP3EqDAZDjd\",\"src_slot\":\"color\",\"dst_slot\":0,\"uid\":\"uchABqWHc4Ht\",\"dst_dyn\":true},{\"src_nuid\":\"bWparLDbpKqm\",\"dst_nuid\":\"6aMajKkzBEsn\",\"src_slot\":\"color\",\"dst_slot\":\"fog color\",\"uid\":\"xmfjjGeK359d\"}]},\"dyn_out\":[{\"name\":\"environment\",\"dt\":23,\"index\":0,\"uid\":\"YLQ7aDrGGMXS\",\"dynamic\":true,\"type\":1,\"is_connected\":true},{\"name\":\"object3d\",\"dt\":21,\"index\":1,\"uid\":\"W3smJjpMU8x6\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"entity\",\"x\":893,\"y\":471,\"uid\":\"3USmS2Z9TjT4\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"bzAtN4u4hmgG\":\"Ys30r7aVEks1\"}},\"title\":\"Backgound pillars\",\"graph\":{\"uid\":\"DfsTtHhphd24\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_loader_model\",\"x\":907,\"y\":297,\"uid\":\"A4dZ9RRevLuB\",\"state\":{\"url\":\"/data/edelblut/assets/scene/Withoutrock/Withoutrock.obj\"}},{\"plugin\":\"three_mesh\",\"x\":1132,\"y\":266,\"uid\":\"A3KKYCgwsfxc\",\"state\":{\"position\":{\"x\":-0.7388736918693957,\"y\":-3.5663631225742254,\"z\":-1.8983084867173656},\"scale\":{\"x\":0.16758118521039947,\"y\":0.16758118521039947,\"z\":0.16758118521039947},\"quaternion\":{\"_x\":0,\"_y\":0.8232873197514973,\"_z\":0,\"_w\":0.5676248665592408}}},{\"plugin\":\"output_proxy\",\"x\":1295,\"y\":265,\"uid\":\"bzAtN4u4hmgG\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_material_phong\",\"x\":732,\"y\":418,\"uid\":\"RuqDaQzXUqWe\",\"open\":false,\"state\":{}},{\"plugin\":\"url_texture_generator\",\"x\":507,\"y\":419,\"uid\":\"3UaQcKp33bqs\",\"state\":{\"url\":\"/data/image/404ff6790d55c6604147416956c5454cbbcf56cb.png\"}},{\"plugin\":\"toggle_button\",\"x\":930,\"y\":484,\"uid\":\"SaYKJ38CfxF9\",\"state\":{\"enabled\":false},\"title\":\"Cast Shadows\"},{\"plugin\":\"toggle_button\",\"x\":928,\"y\":570,\"uid\":\"d3EJg6RwZGVX\",\"state\":{\"enabled\":true},\"title\":\"Receive Shadows\"},{\"plugin\":\"const_float_generator\",\"x\":727,\"y\":508,\"uid\":\"SZ5HYKtEU2Qe\",\"state\":{\"val\":0},\"title\":\"Shine\"}],\"conns\":[{\"src_nuid\":\"A3KKYCgwsfxc\",\"dst_nuid\":\"bzAtN4u4hmgG\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"PpEWqha4gbED\",\"dst_dyn\":true},{\"src_nuid\":\"RuqDaQzXUqWe\",\"dst_nuid\":\"A3KKYCgwsfxc\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"WrME6Y2n7mUt\"},{\"src_nuid\":\"3UaQcKp33bqs\",\"dst_nuid\":\"RuqDaQzXUqWe\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"s7jjupzafByx\"},{\"src_nuid\":\"A4dZ9RRevLuB\",\"dst_nuid\":\"A3KKYCgwsfxc\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"7xv9VShmbhFZ\"},{\"src_nuid\":\"SaYKJ38CfxF9\",\"dst_nuid\":\"A3KKYCgwsfxc\",\"src_slot\":\"bool\",\"dst_slot\":\"castShadow\",\"uid\":\"z7sNzDbbPnyV\"},{\"src_nuid\":\"d3EJg6RwZGVX\",\"dst_nuid\":\"A3KKYCgwsfxc\",\"src_slot\":\"bool\",\"dst_slot\":\"receiveShadow\",\"uid\":\"mKfBMScCy7Gb\"},{\"src_nuid\":\"SZ5HYKtEU2Qe\",\"dst_nuid\":\"RuqDaQzXUqWe\",\"src_slot\":\"value\",\"dst_slot\":\"shininess\",\"uid\":\"WefRLvcSTwGH\"}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"three_scene\",\"x\":1182,\"y\":401,\"uid\":\"qwBLZESbz9QG\",\"title\":\"Scene 1\",\"dyn_in\":[{\"type\":0,\"name\":\"0\",\"dt\":21,\"array\":true,\"uid\":\"DDzcOXqI6iRM\",\"dynamic\":true,\"index\":0,\"is_connected\":true},{\"type\":0,\"name\":\"1\",\"dt\":21,\"array\":true,\"uid\":\"gH5pmBKZK4lm\",\"dynamic\":true,\"index\":1,\"is_connected\":true},{\"type\":0,\"name\":\"2\",\"dt\":21,\"array\":true,\"uid\":\"ExPIjji5rvFO\",\"dynamic\":true,\"index\":2,\"is_connected\":true},{\"type\":0,\"name\":\"3\",\"dt\":21,\"array\":true,\"uid\":\"hddJID3FkB4R\",\"dynamic\":true,\"index\":3,\"is_connected\":true},{\"type\":0,\"name\":\"4\",\"dt\":21,\"array\":true,\"uid\":\"uwvnEM7yqjQ6\",\"dynamic\":true,\"index\":4}]},{\"plugin\":\"entity\",\"x\":887,\"y\":381,\"uid\":\"95z94xDTMQTL\",\"state\":{\"always_update\":true,\"input_sids\":{\"RqPVBpez7TpG\":\"4gkNUaXKYNKw\"},\"output_sids\":{\"sCjDHfaR5eff\":\"Ys30r7aVEks1\"}},\"title\":\"Clouds\",\"graph\":{\"uid\":\"d6MXjfBhKsp2\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_loader_model\",\"x\":321,\"y\":234,\"uid\":\"8uWqxGJad5pV\",\"state\":{\"url\":\"/data/edelblut/assets/scene/C_01/C_01.obj\"}},{\"plugin\":\"three_mesh\",\"x\":687,\"y\":203,\"uid\":\"2475atgxu4qa\",\"state\":{\"position\":{\"x\":0,\"y\":7.0659139885435245,\"z\":0},\"scale\":{\"x\":0.10623163703322665,\"y\":0.10623163703322665,\"z\":0.10623163703322665},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":883,\"y\":205,\"uid\":\"sCjDHfaR5eff\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":302,\"y\":366,\"uid\":\"RqPVBpez7TpG\",\"title\":\"Rotate\",\"dyn_out\":[{\"name\":\"input\",\"dt\":0,\"uid\":\"M55DSdUurwVz\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"vector\",\"x\":455,\"y\":360,\"uid\":\"MrLVC4XfqqaV\",\"open\":false}],\"conns\":[{\"src_nuid\":\"8uWqxGJad5pV\",\"dst_nuid\":\"2475atgxu4qa\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"3BWYgsYsbSWg\"},{\"src_nuid\":\"2475atgxu4qa\",\"dst_nuid\":\"sCjDHfaR5eff\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"X6vcAn96L6B8\",\"dst_dyn\":true},{\"src_nuid\":\"8uWqxGJad5pV\",\"dst_nuid\":\"2475atgxu4qa\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"edK9N6FaBxkm\"},{\"src_nuid\":\"MrLVC4XfqqaV\",\"dst_nuid\":\"2475atgxu4qa\",\"src_slot\":\"vector\",\"dst_slot\":\"rotation\",\"uid\":\"AaQ3PsGEMhAZ\"},{\"src_nuid\":\"RqPVBpez7TpG\",\"dst_nuid\":\"MrLVC4XfqqaV\",\"src_slot\":0,\"dst_slot\":\"y\",\"uid\":\"sfcSycseQ5As\",\"src_dyn\":true}]},\"dyn_in\":[{\"name\":\"Rotate\",\"dt\":0,\"index\":0,\"uid\":\"4gkNUaXKYNKw\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"entity\",\"x\":895,\"y\":324,\"uid\":\"434UYP5QRpYc\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"p4Z37zgTVqBy\":\"tyqbqNA94pKm\"}},\"title\":\"Lighting\",\"graph\":{\"uid\":\"bNc9yEHShDGz\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_directional_light\",\"x\":983,\"y\":150,\"uid\":\"F7fd7yqdDxZU\",\"state\":{\"position\":{\"x\":-9.288166274248708,\"y\":3.1784032347933744,\"z\":-4.282165062828277},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0.4341264123549172,\"_w\":0.9008519623644322}},\"title\":\"Directional Light\"},{\"plugin\":\"three_hemisphere_light\",\"x\":1271,\"y\":534,\"uid\":\"bS8hhEw3wWED\",\"state\":{\"position\":{\"x\":2.0581831733658964,\"y\":3.768965627596401,\"z\":0.7217360648666267},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}},\"title\":\"Hemisphere Light\"},{\"plugin\":\"color_picker\",\"x\":720,\"y\":239,\"uid\":\"EhddnUnBCJEu\",\"state\":{\"hue\":0.8314540449438202,\"sat\":0.14606741573033707,\"lum\":0.9833333333333333},\"title\":\"D Light Color\"},{\"plugin\":\"slider_float_generator\",\"x\":723,\"y\":127,\"uid\":\"VmM4sugZzDKH\",\"state\":{\"val\":0.74,\"min\":0,\"max\":1},\"title\":\"D Intensity\"},{\"plugin\":\"color_picker\",\"x\":727,\"y\":645,\"uid\":\"e8EZx5buQ7kQ\",\"state\":{\"hue\":0.8426897752808988,\"sat\":0,\"lum\":1},\"title\":\"Sky Color\"},{\"plugin\":\"slider_float_generator\",\"x\":722,\"y\":521,\"uid\":\"WCP6dXVNYfv9\",\"state\":{\"val\":0.8,\"min\":0,\"max\":1},\"title\":\"Hemi Intensity\"},{\"plugin\":\"color_picker\",\"x\":954,\"y\":647,\"uid\":\"pNs2VjqPx3xh\",\"state\":{\"hue\":0.8876326966292135,\"sat\":1,\"lum\":0},\"title\":\"Ground Color\"},{\"plugin\":\"annotation\",\"x\":1208,\"y\":160,\"uid\":\"NhZDfCTjQJXj\",\"state\":{\"text\":\"There are two lights in this patch.  \\n\\nDirectional Light\\nThis is what casts the shadows, so adjust this light and its intensity and position to shape your shadows. But it is quite heavy on your GPU so use it with care. Its icon has a line indicating its direction.\\n\\nHemisphere Light\\nThis light imitates ambient and surface bounced light, so it has a colour emitted from the sky and one bounced from the ground. You can set both of these and overall intensity.\",\"width\":222,\"height\":255},\"title\":\"Lighting Patch\"},{\"plugin\":\"inputs_to_array\",\"x\":1740,\"y\":361,\"uid\":\"kPLZRQ8FSyTA\",\"open\":false,\"title\":\"Lights Array\",\"dyn_in\":[{\"name\":\"0\",\"dt\":21,\"array\":true,\"uid\":\"9JzPXguyL43x\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true},{\"type\":0,\"name\":\"1\",\"dt\":21,\"array\":true,\"uid\":\"H4BtMFq7rwyS\",\"dynamic\":true,\"index\":1,\"is_connected\":true},{\"type\":0,\"name\":\"2\",\"dt\":21,\"array\":true,\"uid\":\"pezuTz2wPd68\",\"dynamic\":true,\"index\":2}]},{\"plugin\":\"output_proxy\",\"x\":1930,\"y\":363,\"uid\":\"p4Z37zgTVqBy\",\"title\":\"lights\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"mPMEnQ86J3zZ\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true,\"array\":true}]}],\"conns\":[{\"src_nuid\":\"EhddnUnBCJEu\",\"dst_nuid\":\"F7fd7yqdDxZU\",\"src_slot\":\"color\",\"dst_slot\":\"color\",\"uid\":\"5ggxCcjw3BzV\"},{\"src_nuid\":\"VmM4sugZzDKH\",\"dst_nuid\":\"F7fd7yqdDxZU\",\"src_slot\":\"value\",\"dst_slot\":\"intensity\",\"uid\":\"rHawTeYg7BAa\"},{\"src_nuid\":\"e8EZx5buQ7kQ\",\"dst_nuid\":\"bS8hhEw3wWED\",\"src_slot\":\"color\",\"dst_slot\":\"color\",\"uid\":\"qTpantVRZ3h9\"},{\"src_nuid\":\"WCP6dXVNYfv9\",\"dst_nuid\":\"bS8hhEw3wWED\",\"src_slot\":\"value\",\"dst_slot\":\"intensity\",\"uid\":\"mjweqcu8q7L8\"},{\"src_nuid\":\"pNs2VjqPx3xh\",\"dst_nuid\":\"bS8hhEw3wWED\",\"src_slot\":\"color\",\"dst_slot\":\"groundColor\",\"uid\":\"3cHd7SmzNpb4\"},{\"src_nuid\":\"F7fd7yqdDxZU\",\"dst_nuid\":\"kPLZRQ8FSyTA\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"YwxaUuRYZ62q\",\"dst_dyn\":true},{\"src_nuid\":\"bS8hhEw3wWED\",\"dst_nuid\":\"kPLZRQ8FSyTA\",\"src_slot\":\"object3d\",\"dst_slot\":1,\"uid\":\"3ETJtAXfbcZ3\",\"dst_dyn\":true},{\"src_nuid\":\"kPLZRQ8FSyTA\",\"dst_nuid\":\"p4Z37zgTVqBy\",\"src_slot\":\"array\",\"dst_slot\":0,\"uid\":\"ELNUNCyD3x4p\",\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"lights\",\"dt\":21,\"index\":0,\"uid\":\"tyqbqNA94pKm\",\"dynamic\":true,\"type\":1,\"array\":true,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":710,\"y\":407,\"uid\":\"FHqdKXKGuJug\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{\"pn9v8mdVDRJb\":\"1\"},\"output_sids\":{\"vwP6masnnFRp\":\"0\"}},\"title\":\"Rotate\",\"graph\":{\"uid\":\"ytgWgLWhuNS8\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"delta_t_generator\",\"x\":234,\"y\":203,\"uid\":\"tGD2KcPbwLGN\"},{\"plugin\":\"multiply_modulator\",\"x\":359,\"y\":193,\"uid\":\"YVQxnXrkpP2Z\"},{\"plugin\":\"output_proxy\",\"x\":885,\"y\":248,\"uid\":\"vwP6masnnFRp\",\"title\":\"time\",\"dyn_in\":[{\"name\":\"input\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true,\"dynamic\":true}]},{\"plugin\":\"input_proxy\",\"x\":250,\"y\":262,\"uid\":\"pn9v8mdVDRJb\",\"title\":\"Speed\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"connected\":true,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"variable_local_read\",\"x\":376,\"y\":310,\"uid\":\"SNqTeYk32aaC\",\"title\":\"float\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"variable_local_write\",\"x\":793,\"y\":166,\"uid\":\"NxT3ndDyJ5Hr\",\"title\":\"float\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":0,\"is_connected\":true,\"dynamic\":true}]},{\"plugin\":\"add_modulator\",\"x\":484,\"y\":223,\"uid\":\"Gf45aL7qWMus\"},{\"plugin\":\"if_else_modulator\",\"x\":656,\"y\":248,\"uid\":\"84aScYek7xJT\"},{\"plugin\":\"const_float_generator\",\"x\":488,\"y\":351,\"uid\":\"hTab5GpVgXPc\",\"state\":{\"val\":0},\"title\":\"Reset\"},{\"plugin\":\"initialise_generator\",\"x\":520,\"y\":160,\"uid\":\"apCMNRgfgNK4\"}],\"conns\":[{\"src_nuid\":\"tGD2KcPbwLGN\",\"dst_nuid\":\"YVQxnXrkpP2Z\",\"src_slot\":\"seconds\",\"dst_slot\":\"a\",\"uid\":\"j88Js4gqWqQW\"},{\"src_nuid\":\"pn9v8mdVDRJb\",\"dst_nuid\":\"YVQxnXrkpP2Z\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"G9fvCKApsd9F\",\"src_dyn\":true},{\"src_nuid\":\"apCMNRgfgNK4\",\"dst_nuid\":\"84aScYek7xJT\",\"src_slot\":\"bool\",\"dst_slot\":\"condition\",\"uid\":\"g5NjwSU2EzKR\"},{\"src_nuid\":\"SNqTeYk32aaC\",\"dst_nuid\":\"Gf45aL7qWMus\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"Zx9XyXs43LfG\",\"src_dyn\":true},{\"src_nuid\":\"YVQxnXrkpP2Z\",\"dst_nuid\":\"Gf45aL7qWMus\",\"src_slot\":\"result\",\"dst_slot\":\"a\",\"uid\":\"xZAtRsCpuGWr\"},{\"src_nuid\":\"Gf45aL7qWMus\",\"dst_nuid\":\"84aScYek7xJT\",\"src_slot\":\"result\",\"dst_slot\":\"false value\",\"uid\":\"nQfMs49dYa9v\"},{\"src_nuid\":\"hTab5GpVgXPc\",\"dst_nuid\":\"84aScYek7xJT\",\"src_slot\":\"value\",\"dst_slot\":\"true value\",\"uid\":\"ApdLWBjJjJgM\"},{\"src_nuid\":\"84aScYek7xJT\",\"dst_nuid\":\"NxT3ndDyJ5Hr\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"2SLvN9TECtZ2\",\"dst_dyn\":true},{\"src_nuid\":\"84aScYek7xJT\",\"dst_nuid\":\"vwP6masnnFRp\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"Nk4kMQd2DVa5\",\"dst_dyn\":true,\"offset\":1}],\"variables\":[{\"id\":\"float\",\"dt\":0}]},\"dyn_in\":[{\"name\":\"Speed\",\"dt\":0,\"uid\":\"1\",\"index\":0,\"type\":0,\"is_connected\":true,\"dynamic\":true}],\"dyn_out\":[{\"name\":\"time\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"slider_float_generator\",\"x\":495,\"y\":407,\"uid\":\"GkJ3XpU3AzWN\",\"state\":{\"val\":-0.0229,\"min\":-0.2,\"max\":0.2},\"title\":\"Speed\"}],\"conns\":[{\"src_nuid\":\"qwBLZESbz9QG\",\"dst_nuid\":\"GKCJDXV2557h\",\"src_slot\":\"scene\",\"dst_slot\":0,\"uid\":\"NCLRk7ftfsE2\",\"dst_dyn\":true},{\"src_nuid\":\"gGw2wjkkNcZr\",\"dst_nuid\":\"qwBLZESbz9QG\",\"src_slot\":1,\"dst_slot\":0,\"uid\":\"4bVD5cnGZkRg\",\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"gGw2wjkkNcZr\",\"dst_nuid\":\"qwBLZESbz9QG\",\"src_slot\":0,\"dst_slot\":\"environment\",\"uid\":\"7m6CDLVweULX\",\"src_dyn\":true},{\"src_nuid\":\"GkJ3XpU3AzWN\",\"dst_nuid\":\"FHqdKXKGuJug\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"gE7Kpr3s4ze3\",\"dst_dyn\":true},{\"src_nuid\":\"FHqdKXKGuJug\",\"dst_nuid\":\"95z94xDTMQTL\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"tJyzuWzCETKD\",\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"434UYP5QRpYc\",\"dst_nuid\":\"qwBLZESbz9QG\",\"src_slot\":0,\"dst_slot\":1,\"uid\":\"EXwRgPYfypxy\",\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"95z94xDTMQTL\",\"dst_nuid\":\"qwBLZESbz9QG\",\"src_slot\":0,\"dst_slot\":2,\"uid\":\"jqRHcD5RyHUG\",\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"3USmS2Z9TjT4\",\"dst_nuid\":\"qwBLZESbz9QG\",\"src_slot\":0,\"dst_slot\":3,\"uid\":\"8Q6nvHSZhrNM\",\"src_dyn\":true,\"dst_dyn\":true}]}}\n"
  },
  {
    "path": "browser/data/graphs/example.json",
    "content": "{\"abs_t\":290.686,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"three_scene\",\"x\":839,\"y\":198,\"uid\":\"u2O8M5ItNlW5\",\"dyn_in\":[{\"type\":0,\"name\":\"0\",\"dt\":21,\"array\":true,\"uid\":\"DDzcOXqI6iRM\",\"dynamic\":true,\"index\":0,\"is_connected\":true},{\"type\":0,\"name\":\"1\",\"dt\":21,\"array\":true,\"uid\":\"gH5pmBKZK4lm\",\"dynamic\":true,\"index\":1,\"is_connected\":true},{\"type\":0,\"name\":\"2\",\"dt\":21,\"array\":true,\"uid\":\"ExPIjji5rvFO\",\"dynamic\":true,\"index\":2,\"is_connected\":true},{\"type\":0,\"name\":\"3\",\"dt\":21,\"array\":true,\"uid\":\"hddJID3FkB4R\",\"dynamic\":true,\"index\":3,\"is_connected\":true},{\"type\":0,\"name\":\"4\",\"dt\":21,\"array\":true,\"uid\":\"uSr941HZ6MvG\",\"dynamic\":true,\"index\":4,\"is_connected\":true},{\"type\":0,\"name\":\"5\",\"dt\":21,\"array\":true,\"uid\":\"oIEkIRoSmV9S\",\"dynamic\":true,\"index\":5,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":538,\"y\":162,\"uid\":\"d9slZ3PC0CIC\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"xfsyKARw231b\":\"tjoeHNDBhUcN\"}},\"title\":\"Environment settings\",\"graph\":{\"uid\":\"362z87EM3leu\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_environment_settings\",\"x\":572,\"y\":469,\"uid\":\"DU82zgpxCApv\",\"title\":\"Environment settings\"},{\"plugin\":\"output_proxy\",\"x\":980,\"y\":512,\"uid\":\"xfsyKARw231b\",\"title\":\"environment\",\"dyn_in\":[{\"name\":\"output\",\"dt\":23,\"def\":null,\"uid\":\"Yy89wKzOcZo4\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"color_picker\",\"x\":216,\"y\":254,\"uid\":\"9lwgQEWjB9z7\",\"state\":{\"hue\":0.4438202247191011,\"sat\":0.449438202247191,\"lum\":0.7916666666666666}},{\"plugin\":\"slider_float_generator\",\"x\":168,\"y\":565,\"uid\":\"I4FcCKaQ1VsZ\",\"open\":false,\"state\":{\"val\":5.287,\"min\":0.1,\"max\":40},\"title\":\"Fog near\"},{\"plugin\":\"slider_float_generator\",\"x\":168,\"y\":689,\"uid\":\"o2XmpYbvT21H\",\"open\":false,\"state\":{\"val\":18.706,\"min\":1,\"max\":40},\"title\":\"Fog far\"}],\"conns\":[{\"src_nuid\":\"DU82zgpxCApv\",\"dst_nuid\":\"xfsyKARw231b\",\"src_slot\":\"environment\",\"dst_slot\":0,\"uid\":\"y43ylTEng2A3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"9lwgQEWjB9z7\",\"dst_nuid\":\"DU82zgpxCApv\",\"src_slot\":\"color\",\"dst_slot\":\"fog color\",\"uid\":\"OpoOwp04Ujs1\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"I4FcCKaQ1VsZ\",\"dst_nuid\":\"DU82zgpxCApv\",\"src_slot\":\"value\",\"dst_slot\":\"fog near\",\"uid\":\"fbCsW7oq7D90\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"o2XmpYbvT21H\",\"dst_nuid\":\"DU82zgpxCApv\",\"src_slot\":\"value\",\"dst_slot\":\"fog far\",\"uid\":\"ba0BcdDsYNux\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"environment\",\"dt\":23,\"index\":0,\"uid\":\"tjoeHNDBhUcN\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":514,\"y\":214,\"uid\":\"nvHKHIESiXU4\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"CVIoBh0ZtDmi\":\"547odbJKrTzG\"}},\"title\":\"Point light 1\",\"graph\":{\"uid\":\"SY5HtB97QwvQ\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":1012,\"y\":374,\"uid\":\"CVIoBh0ZtDmi\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"vSy6Gj4JSPYs\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_point_light\",\"x\":730,\"y\":371,\"uid\":\"VD3yMohWpRUe\",\"open\":false,\"state\":{\"position\":{\"x\":-2.9420035670141815,\"y\":1.3598567240571549,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"const_float_generator\",\"x\":304,\"y\":295,\"uid\":\"EJ710G4QTm3r\",\"state\":{\"val\":1},\"title\":\"Intensity\"},{\"plugin\":\"color_picker\",\"x\":276,\"y\":449,\"uid\":\"Q61YriArv6Pm\",\"state\":{\"hue\":0,\"sat\":0,\"lum\":1}}],\"conns\":[{\"src_nuid\":\"VD3yMohWpRUe\",\"dst_nuid\":\"CVIoBh0ZtDmi\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"7hWfc0RsxJyE\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"EJ710G4QTm3r\",\"dst_nuid\":\"VD3yMohWpRUe\",\"src_slot\":\"value\",\"dst_slot\":\"intensity\",\"uid\":\"LWyX9S0LB0Kg\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Q61YriArv6Pm\",\"dst_nuid\":\"VD3yMohWpRUe\",\"src_slot\":\"color\",\"dst_slot\":\"color\",\"uid\":\"CZE6N3hYAMh3\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"547odbJKrTzG\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":510,\"y\":375,\"uid\":\"5zkZJ1kVzShg\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"0uogYZhTulp7\":\"mh0rTKkFm0nD\"}},\"title\":\"Floor\",\"graph\":{\"uid\":\"Hzr5rg9SHgsb\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":936,\"y\":221,\"uid\":\"GxMrrSaA44wq\",\"open\":false,\"state\":{\"position\":{\"x\":0,\"y\":-1.089785197190713,\"z\":0.001939648920875864},\"scale\":{\"x\":16.260185647641777,\"y\":16.260185647641777,\"z\":16.260185647641777},\"quaternion\":{\"_x\":-0.7077357707678449,\"_y\":0,\"_z\":0,\"_w\":0.7064772456816478}}},{\"plugin\":\"output_proxy\",\"x\":1105,\"y\":223,\"uid\":\"0uogYZhTulp7\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":153,\"y\":180,\"uid\":\"EtDika07Vgah\",\"state\":{\"url\":\"/data/image/3968db2bdad274fc19d8283eb73c4691b14ac0b1.png\"},\"title\":\"Box texture\"},{\"plugin\":\"three_material_phong\",\"x\":665,\"y\":280,\"uid\":\"IJzf3S2ECiJe\",\"open\":false},{\"plugin\":\"three_geometry_plane\",\"x\":751,\"y\":172,\"uid\":\"tr9n2eRfks8M\",\"open\":false},{\"plugin\":\"three_uv_modifier\",\"x\":459,\"y\":279,\"uid\":\"yFbNFt740ntr\",\"open\":false},{\"plugin\":\"const_float_generator\",\"x\":215,\"y\":386,\"uid\":\"4zFrJc6lCSIw\",\"state\":{\"val\":40},\"title\":\"Repeat\"}],\"conns\":[{\"src_nuid\":\"GxMrrSaA44wq\",\"dst_nuid\":\"0uogYZhTulp7\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"lJTzbafg9t8D\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"IJzf3S2ECiJe\",\"dst_nuid\":\"GxMrrSaA44wq\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"RpKIcJTsYoCQ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"tr9n2eRfks8M\",\"dst_nuid\":\"GxMrrSaA44wq\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"0XCswCxPk54c\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"EtDika07Vgah\",\"dst_nuid\":\"yFbNFt740ntr\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"zc3YwBYvy48H\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"yFbNFt740ntr\",\"dst_nuid\":\"IJzf3S2ECiJe\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"MDQEpZLF6BgA\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"4zFrJc6lCSIw\",\"dst_nuid\":\"yFbNFt740ntr\",\"src_slot\":\"value\",\"dst_slot\":\"u repeat\",\"uid\":\"QmYbjbM2eBox\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"4zFrJc6lCSIw\",\"dst_nuid\":\"yFbNFt740ntr\",\"src_slot\":\"value\",\"dst_slot\":\"v repeat\",\"uid\":\"3Udkt5dADKZd\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":529,\"y\":434,\"uid\":\"OFAU6PiJpRKz\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"2hsWszsB1Oqx\":\"mh0rTKkFm0nD\"}},\"title\":\"Sky sphere\",\"graph\":{\"uid\":\"d0ts6LaG0Ito\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":967,\"y\":294,\"uid\":\"teRtCbrPh2hp\",\"open\":false,\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1166,\"y\":295,\"uid\":\"2hsWszsB1Oqx\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":194,\"y\":63,\"uid\":\"CN1HiUFJop0r\",\"state\":{\"url\":\"/data/image/7cbc45195c04d1595c43be42418755520068c72e.png\"},\"title\":\"Texture\"},{\"plugin\":\"three_material\",\"x\":656,\"y\":156,\"uid\":\"GULXMKCn1srD\",\"open\":false},{\"plugin\":\"const_float_generator\",\"x\":470,\"y\":234,\"uid\":\"Q6dO15gKNxXy\",\"open\":false,\"state\":{\"val\":1},\"title\":\"Side\"},{\"plugin\":\"toggle_button\",\"x\":431,\"y\":172,\"uid\":\"yIJ9nHl2KjnJ\",\"open\":false,\"state\":{\"enabled\":false},\"title\":\"Fog On/Off\"},{\"plugin\":\"const_float_generator\",\"x\":356,\"y\":372,\"uid\":\"V3r2F4N05quW\",\"open\":false,\"state\":{\"val\":40},\"title\":\"Size\"},{\"plugin\":\"const_float_generator\",\"x\":356,\"y\":438,\"uid\":\"iaDi4g88cvfk\",\"open\":false,\"state\":{\"val\":40},\"title\":\"Detail\"},{\"plugin\":\"three_geometry_sphere\",\"x\":558,\"y\":402,\"uid\":\"AGL6UFkir1c7\",\"open\":false}],\"conns\":[{\"src_nuid\":\"teRtCbrPh2hp\",\"dst_nuid\":\"2hsWszsB1Oqx\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"Sr1R9KE4EAZz\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"CN1HiUFJop0r\",\"dst_nuid\":\"GULXMKCn1srD\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"CTWt2medCPTN\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"GULXMKCn1srD\",\"dst_nuid\":\"teRtCbrPh2hp\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"i2XtF3ECWcGl\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Q6dO15gKNxXy\",\"dst_nuid\":\"GULXMKCn1srD\",\"src_slot\":\"value\",\"dst_slot\":\"side\",\"uid\":\"MGvYD4B6ny36\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"yIJ9nHl2KjnJ\",\"dst_nuid\":\"GULXMKCn1srD\",\"src_slot\":\"bool\",\"dst_slot\":\"fog\",\"uid\":\"HctMlUo1nDt6\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"V3r2F4N05quW\",\"dst_nuid\":\"AGL6UFkir1c7\",\"src_slot\":\"value\",\"dst_slot\":\"radius\",\"uid\":\"9ofh4uafnCh4\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"iaDi4g88cvfk\",\"dst_nuid\":\"AGL6UFkir1c7\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"LSP6NcEmgITg\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"iaDi4g88cvfk\",\"dst_nuid\":\"AGL6UFkir1c7\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"GL4VE82BuHl7\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"AGL6UFkir1c7\",\"dst_nuid\":\"teRtCbrPh2hp\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"fNK1vxh3Jx44\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":490,\"y\":267,\"uid\":\"T6PXHoQNqdKa\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"f2swnVnJFdoy\":\"547odbJKrTzG\"}},\"title\":\"Point light 2\",\"graph\":{\"uid\":\"qjCrT5ZjfFq7\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":1012,\"y\":374,\"uid\":\"f2swnVnJFdoy\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"vSy6Gj4JSPYs\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_point_light\",\"x\":730,\"y\":371,\"uid\":\"zhn71BezVLqg\",\"open\":false,\"state\":{\"position\":{\"x\":2.9928296822160516,\"y\":1.034341986571219,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"const_float_generator\",\"x\":304,\"y\":295,\"uid\":\"F4J3NYEA4O6Y\",\"state\":{\"val\":1},\"title\":\"Intensity\"},{\"plugin\":\"color_picker\",\"x\":276,\"y\":449,\"uid\":\"8wyhZxwYzyha\",\"state\":{\"hue\":0,\"sat\":0,\"lum\":1}}],\"conns\":[{\"src_nuid\":\"zhn71BezVLqg\",\"dst_nuid\":\"f2swnVnJFdoy\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"CtaQMxmUCxIX\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"F4J3NYEA4O6Y\",\"dst_nuid\":\"zhn71BezVLqg\",\"src_slot\":\"value\",\"dst_slot\":\"intensity\",\"uid\":\"kORsBJuO0gRj\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"8wyhZxwYzyha\",\"dst_nuid\":\"zhn71BezVLqg\",\"src_slot\":\"color\",\"dst_slot\":\"color\",\"uid\":\"6PAHvh9N4Iv9\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"547odbJKrTzG\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":357,\"y\":320,\"uid\":\"FwHyeUHfyCWa\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"DLpjPNqdvYFP\":\"Ys30r7aVEks1\"}},\"title\":\"Moving Parrot\",\"graph\":{\"uid\":\"mXOiKSZQYmCb\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_loader_model\",\"x\":321,\"y\":234,\"uid\":\"1YaYrgLqosSj\",\"state\":{\"url\":\"/data/vizor/assets/scene/parrot/parrot.js\"}},{\"plugin\":\"three_mesh\",\"x\":805,\"y\":220,\"uid\":\"A5bh9JCEz6cE\",\"state\":{\"position\":{\"x\":0.9997309954641862,\"y\":1,\"z\":0.02319346261745574},\"scale\":{\"x\":0.0094948370835134,\"y\":0.0094948370835134,\"z\":0.0094948370835134},\"quaternion\":{\"_x\":0,\"_y\":-0.01159751128074042,\"_z\":0,\"_w\":0.9999327466045369}}},{\"plugin\":\"output_proxy\",\"x\":1318,\"y\":193,\"uid\":\"DLpjPNqdvYFP\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"vector\",\"x\":546,\"y\":389,\"uid\":\"0tkMqV609qjj\",\"open\":false,\"title\":\"Position\"},{\"plugin\":\"const_float_generator\",\"x\":336,\"y\":390,\"uid\":\"lSlb995jsuHn\",\"open\":false,\"state\":{\"val\":1}},{\"plugin\":\"three_clickable_object\",\"x\":1038,\"y\":183,\"uid\":\"78bj4lQY7Fr8\"},{\"plugin\":\"clock_generator\",\"x\":17,\"y\":500,\"uid\":\"X1VWMq3nnojI\"},{\"plugin\":\"sin_modulator\",\"x\":404,\"y\":524,\"uid\":\"7as5xOleqpl2\",\"open\":false},{\"plugin\":\"cos_modulator\",\"x\":396,\"y\":452,\"uid\":\"HnpTPrL3B4nj\",\"open\":false},{\"plugin\":\"vector\",\"x\":571,\"y\":607,\"uid\":\"tuNn9sWhTc9t\",\"open\":false,\"title\":\"Rotation\"},{\"plugin\":\"multiply_modulator\",\"x\":556,\"y\":492,\"uid\":\"yrfAjMnsRw2E\",\"open\":false},{\"plugin\":\"const_float_generator\",\"x\":571,\"y\":448,\"uid\":\"UXBKLkYamPwA\",\"open\":false,\"state\":{\"val\":-1}},{\"plugin\":\"multiply_modulator\",\"x\":263,\"y\":526,\"uid\":\"gpFMlOzMWUpr\",\"open\":false,\"title\":\"Mul\"},{\"plugin\":\"slider_float_generator\",\"x\":31,\"y\":618,\"uid\":\"NrUjXwJwHUIz\",\"state\":{\"val\":0.173,\"min\":0,\"max\":1},\"title\":\"Speed\"}],\"conns\":[{\"src_nuid\":\"1YaYrgLqosSj\",\"dst_nuid\":\"A5bh9JCEz6cE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"DWVhucMuPjiU\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"1YaYrgLqosSj\",\"dst_nuid\":\"A5bh9JCEz6cE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"jtjMX4Dkc2QR\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"0tkMqV609qjj\",\"dst_nuid\":\"A5bh9JCEz6cE\",\"src_slot\":\"vector\",\"dst_slot\":\"position\",\"uid\":\"DimfWNiOfi3T\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"A5bh9JCEz6cE\",\"dst_nuid\":\"78bj4lQY7Fr8\",\"src_slot\":\"object3d\",\"dst_slot\":\"object3d\",\"uid\":\"5dj57P3BUrjt\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"78bj4lQY7Fr8\",\"dst_nuid\":\"DLpjPNqdvYFP\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"qetiqafLBohK\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"lSlb995jsuHn\",\"dst_nuid\":\"0tkMqV609qjj\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"56Yn78vGA5qK\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"HnpTPrL3B4nj\",\"dst_nuid\":\"0tkMqV609qjj\",\"src_slot\":\"result\",\"dst_slot\":\"x\",\"uid\":\"2h2aX3PzymGg\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"7as5xOleqpl2\",\"dst_nuid\":\"0tkMqV609qjj\",\"src_slot\":\"result\",\"dst_slot\":\"z\",\"uid\":\"eHSrf7en4Xn7\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"tuNn9sWhTc9t\",\"dst_nuid\":\"A5bh9JCEz6cE\",\"src_slot\":\"vector\",\"dst_slot\":\"rotation\",\"uid\":\"8jdrqfeAVSOe\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"UXBKLkYamPwA\",\"dst_nuid\":\"yrfAjMnsRw2E\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"kUnafpwwZz9j\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"yrfAjMnsRw2E\",\"dst_nuid\":\"tuNn9sWhTc9t\",\"src_slot\":\"result\",\"dst_slot\":\"y\",\"uid\":\"OXpRNJqVOBby\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"X1VWMq3nnojI\",\"dst_nuid\":\"gpFMlOzMWUpr\",\"src_slot\":\"seconds\",\"dst_slot\":\"a\",\"uid\":\"NWR2vrgmAJ1v\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"gpFMlOzMWUpr\",\"dst_nuid\":\"7as5xOleqpl2\",\"src_slot\":\"result\",\"dst_slot\":\"value\",\"uid\":\"BhI48L9Q1z94\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"gpFMlOzMWUpr\",\"dst_nuid\":\"HnpTPrL3B4nj\",\"src_slot\":\"result\",\"dst_slot\":\"value\",\"uid\":\"dGr3ItTyHlNE\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"NrUjXwJwHUIz\",\"dst_nuid\":\"gpFMlOzMWUpr\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"7JAtwjTNZo9c\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"gpFMlOzMWUpr\",\"dst_nuid\":\"yrfAjMnsRw2E\",\"src_slot\":\"result\",\"dst_slot\":\"a\",\"uid\":\"827dowg8o18h\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":1300,\"y\":275,\"uid\":\"v7uRMObeuSEB\",\"state\":{\"always_update\":true,\"input_sids\":{\"GdrbhHgi6N3c\":\"lbU7hDvbnKfg\"},\"output_sids\":{}},\"title\":\"Render Camera\",\"graph\":{\"uid\":\"OTzr4pyyxpVM\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"input_proxy\",\"x\":375,\"y\":433,\"uid\":\"GdrbhHgi6N3c\",\"title\":\"scene\",\"dyn_out\":[{\"name\":\"input\",\"dt\":11,\"uid\":\"uGHXM4cdeVb3\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_webgl_renderer\",\"x\":986,\"y\":227,\"uid\":\"IUSawWm4OIJv\",\"state\":{\"always_update\":true}},{\"plugin\":\"graph\",\"x\":417,\"y\":171,\"uid\":\"whqQDLkepl25\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"QqxhOUB8HgX5\":\"8GpdZjiiiEQa\"}},\"title\":\"VR camera\",\"graph\":{\"uid\":\"xvFZowQd0GaE\",\"parent_uid\":\"OTzr4pyyxpVM\",\"open\":true,\"nodes\":[{\"plugin\":\"three_vr_camera\",\"x\":966,\"y\":211,\"uid\":\"ycnC8d9yfubZ\",\"open\":false},{\"plugin\":\"output_proxy\",\"x\":1217,\"y\":212,\"uid\":\"QqxhOUB8HgX5\",\"title\":\"camera\",\"dyn_in\":[{\"name\":\"output\",\"dt\":6,\"def\":null,\"uid\":\"uyyGR7LQwSEh\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"slider_float_generator\",\"x\":412,\"y\":169,\"uid\":\"7gyWBF6a5O17\",\"state\":{\"val\":0,\"min\":-10,\"max\":10},\"title\":\"Position X\"},{\"plugin\":\"slider_float_generator\",\"x\":413,\"y\":282,\"uid\":\"VqSAxJqipKya\",\"state\":{\"val\":0.8,\"min\":-10,\"max\":10},\"title\":\"Position Y\"},{\"plugin\":\"slider_float_generator\",\"x\":413,\"y\":397,\"uid\":\"Qfr9wlTnJTZF\",\"state\":{\"val\":2,\"min\":-10,\"max\":10},\"title\":\"Position Z\"},{\"plugin\":\"vector\",\"x\":736,\"y\":283,\"uid\":\"DXh5SJN2sJr3\",\"open\":false,\"title\":\"Camera position\"},{\"plugin\":\"const_float_generator\",\"x\":776,\"y\":140,\"uid\":\"bpunNmtoY3YY\",\"open\":false,\"state\":{\"val\":90},\"title\":\"FOV\"}],\"conns\":[{\"src_nuid\":\"ycnC8d9yfubZ\",\"dst_nuid\":\"QqxhOUB8HgX5\",\"src_slot\":\"camera\",\"dst_slot\":0,\"uid\":\"QotGit84R5fd\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"7gyWBF6a5O17\",\"dst_nuid\":\"DXh5SJN2sJr3\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"c5sFOb7XSeHU\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"VqSAxJqipKya\",\"dst_nuid\":\"DXh5SJN2sJr3\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"D4LPhCoA50hI\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Qfr9wlTnJTZF\",\"dst_nuid\":\"DXh5SJN2sJr3\",\"src_slot\":\"value\",\"dst_slot\":\"z\",\"uid\":\"BNIqeWngtFnI\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"DXh5SJN2sJr3\",\"dst_nuid\":\"ycnC8d9yfubZ\",\"src_slot\":\"vector\",\"dst_slot\":\"position\",\"uid\":\"jZWc0J7Ohz0N\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"bpunNmtoY3YY\",\"dst_nuid\":\"ycnC8d9yfubZ\",\"src_slot\":\"value\",\"dst_slot\":\"rotation\",\"uid\":\"LWxwIKR4GTIH\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"camera\",\"dt\":6,\"index\":0,\"uid\":\"8GpdZjiiiEQa\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"three_gaze_clicker\",\"x\":713,\"y\":330,\"uid\":\"uwBeesbFPJuG\"},{\"plugin\":\"slider_float_generator\",\"x\":434,\"y\":621,\"uid\":\"8Pm6DErrYkwu\",\"state\":{\"val\":0.0294,\"min\":0,\"max\":0.1}}],\"conns\":[{\"src_nuid\":\"whqQDLkepl25\",\"dst_nuid\":\"IUSawWm4OIJv\",\"src_slot\":0,\"dst_slot\":\"camera\",\"uid\":\"nGdPFMJnnc5g\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"whqQDLkepl25\",\"dst_nuid\":\"uwBeesbFPJuG\",\"src_slot\":0,\"dst_slot\":\"camera\",\"uid\":\"Et6ts7p7groj\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"uwBeesbFPJuG\",\"dst_nuid\":\"IUSawWm4OIJv\",\"src_slot\":\"scene\",\"dst_slot\":\"scene\",\"uid\":\"hiyzVZpalEv3\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"GdrbhHgi6N3c\",\"dst_nuid\":\"uwBeesbFPJuG\",\"src_slot\":0,\"dst_slot\":\"scene\",\"uid\":\"4VkmpjZZ39ll\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"8Pm6DErrYkwu\",\"dst_nuid\":\"uwBeesbFPJuG\",\"src_slot\":\"value\",\"dst_slot\":\"show icon\",\"uid\":\"Kz1g3E67Q2kH\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"scene\",\"dt\":11,\"index\":0,\"uid\":\"lbU7hDvbnKfg\",\"dynamic\":true,\"type\":0,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":504,\"y\":488,\"uid\":\"xixCbaXdrdry\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"6C46hhI3kAm1\":\"uD2ummgGvwHj\"}},\"title\":\"Click Counter\",\"graph\":{\"uid\":\"zZb0QXSHr2cV\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":1149,\"y\":134,\"uid\":\"ckX1aarGba6U\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{\"3W0JYbSnoPaO\":\"3ghUS8wkMr1K\"},\"output_sids\":{\"wlSFhZfM8ySX\":\"KQIJHdC6kfHo\"}},\"title\":\"Text\",\"graph\":{\"uid\":\"AGTL1D3AygTT\",\"parent_uid\":\"zZb0QXSHr2cV\",\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":854,\"y\":294,\"uid\":\"MJo7Ljhoq3nm\",\"state\":{\"always_update\":true,\"input_sids\":{\"zeZlFSkP2VPF\":\"sRlAkgcKhKMQ\",\"wDPZsmMm66Fz\":\"S2nnu4FGbdIz\",\"Xmz8pkVRq1Hc\":\"GQQJWiOcNgy4\"},\"output_sids\":{\"EneRwquXck5z\":\"mh0rTKkFm0nD\"}},\"title\":\"Text\",\"graph\":{\"uid\":\"o8rrHRs3pjhw\",\"parent_uid\":\"AGTL1D3AygTT\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1070,\"y\":391,\"uid\":\"u82lrOOlQGI0\",\"state\":{\"position\":{\"x\":1,\"y\":1,\"z\":-1},\"scale\":{\"x\":3.1907156068563065,\"y\":3.1907156068563065,\"z\":3.1907156068563065},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1269,\"y\":390,\"uid\":\"EneRwquXck5z\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":507,\"y\":622,\"uid\":\"img3rC5bwvzb\",\"open\":false,\"state\":{\"val\":2},\"title\":\"Segments\"},{\"plugin\":\"three_geometry_plane\",\"x\":683,\"y\":587,\"uid\":\"cwWILrVjWEyA\",\"open\":false},{\"plugin\":\"const_float_generator\",\"x\":472,\"y\":562,\"uid\":\"3ifKWXdIe5IH\",\"open\":false,\"state\":{\"val\":1},\"title\":\"Width & Height\"},{\"plugin\":\"input_proxy\",\"x\":146,\"y\":391,\"uid\":\"zeZlFSkP2VPF\",\"title\":\"font style\",\"dyn_out\":[{\"name\":\"input\",\"dt\":15,\"uid\":\"mbrd65kMPyo2\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":170,\"y\":126,\"uid\":\"wDPZsmMm66Fz\",\"title\":\"text\",\"dyn_out\":[{\"name\":\"input\",\"dt\":15,\"uid\":\"EHC1du1l07AS\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"texture_from_text_generator\",\"x\":336,\"y\":195,\"uid\":\"dVxxxW2g40Mm\",\"open\":false},{\"plugin\":\"const_float_generator\",\"x\":447,\"y\":455,\"uid\":\"jTvfpsIavepM\",\"state\":{\"val\":2}},{\"plugin\":\"three_material_phong\",\"x\":730,\"y\":96,\"uid\":\"wCLpWt6lDWlI\"},{\"plugin\":\"toggle_button\",\"x\":411,\"y\":381,\"uid\":\"awh2N4iJCffj\",\"open\":false,\"state\":{\"enabled\":true}},{\"plugin\":\"const_float_generator\",\"x\":141,\"y\":242,\"uid\":\"xJpx97i0b696\",\"open\":false,\"state\":{\"val\":1024},\"title\":\"Size\"},{\"plugin\":\"const_float_generator\",\"x\":156,\"y\":282,\"uid\":\"6uRFi5fgOd0Y\",\"state\":{\"val\":512},\"title\":\"X\"},{\"plugin\":\"const_float_generator\",\"x\":157,\"y\":351,\"uid\":\"ExwcOBe7NxDX\",\"state\":{\"val\":256},\"title\":\"Y\"},{\"plugin\":\"input_proxy\",\"x\":169,\"y\":38,\"uid\":\"Xmz8pkVRq1Hc\",\"title\":\"color\",\"dyn_out\":[{\"name\":\"input\",\"dt\":3,\"uid\":\"cG7DlCEla0O3\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"vector\",\"x\":764,\"y\":647,\"uid\":\"voB3zBf8Hhh4\"},{\"plugin\":\"const_float_generator\",\"x\":484,\"y\":730,\"uid\":\"KKiWw4tY0TeJ\",\"open\":false,\"state\":{\"val\":1}},{\"plugin\":\"const_float_generator\",\"x\":411,\"y\":663,\"uid\":\"30DTqlmJW9Ta\",\"open\":false,\"state\":{\"val\":1}},{\"plugin\":\"const_float_generator\",\"x\":483,\"y\":777,\"uid\":\"tMuM3DJupA8q\",\"state\":{\"val\":-1}}],\"conns\":[{\"src_nuid\":\"u82lrOOlQGI0\",\"dst_nuid\":\"EneRwquXck5z\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"syc2Sx7joJaK\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"cwWILrVjWEyA\",\"dst_nuid\":\"u82lrOOlQGI0\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"g8Od5n9IyVSD\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"3ifKWXdIe5IH\",\"dst_nuid\":\"cwWILrVjWEyA\",\"src_slot\":\"value\",\"dst_slot\":\"width\",\"uid\":\"ehTlcrpjnWRQ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"3ifKWXdIe5IH\",\"dst_nuid\":\"cwWILrVjWEyA\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"QdRPR9LzrjDB\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"img3rC5bwvzb\",\"dst_nuid\":\"cwWILrVjWEyA\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"7WmaKc7BQMSf\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"img3rC5bwvzb\",\"dst_nuid\":\"cwWILrVjWEyA\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"1yOmFaatA5Cq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"wDPZsmMm66Fz\",\"dst_nuid\":\"dVxxxW2g40Mm\",\"src_slot\":0,\"dst_slot\":\"text\",\"uid\":\"OIWRa8UcUOmc\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"zeZlFSkP2VPF\",\"dst_nuid\":\"dVxxxW2g40Mm\",\"src_slot\":0,\"dst_slot\":\"font style\",\"uid\":\"JOfXyYh6jd8T\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"dVxxxW2g40Mm\",\"dst_nuid\":\"wCLpWt6lDWlI\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"AA1ejjPCQEim\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"jTvfpsIavepM\",\"dst_nuid\":\"wCLpWt6lDWlI\",\"src_slot\":\"value\",\"dst_slot\":\"side\",\"uid\":\"2ljsYfsAKHun\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"wCLpWt6lDWlI\",\"dst_nuid\":\"u82lrOOlQGI0\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"EmJg2BgTwHR5\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"xJpx97i0b696\",\"dst_nuid\":\"dVxxxW2g40Mm\",\"src_slot\":\"value\",\"dst_slot\":\"width\",\"uid\":\"qdoqldW6MPoX\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"xJpx97i0b696\",\"dst_nuid\":\"dVxxxW2g40Mm\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"dsngDxDtlsyT\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"6uRFi5fgOd0Y\",\"dst_nuid\":\"dVxxxW2g40Mm\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"n5xsDfAHTgGJ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ExwcOBe7NxDX\",\"dst_nuid\":\"dVxxxW2g40Mm\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"5ofSEKsXIz5O\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"awh2N4iJCffj\",\"dst_nuid\":\"wCLpWt6lDWlI\",\"src_slot\":\"bool\",\"dst_slot\":\"transparent\",\"uid\":\"vHbnbILokzv9\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Xmz8pkVRq1Hc\",\"dst_nuid\":\"wCLpWt6lDWlI\",\"src_slot\":0,\"dst_slot\":\"color\",\"uid\":\"gRMQwq2b2FbA\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"voB3zBf8Hhh4\",\"dst_nuid\":\"u82lrOOlQGI0\",\"src_slot\":\"vector\",\"dst_slot\":\"position\",\"uid\":\"VXzaasra1zJb\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"KKiWw4tY0TeJ\",\"dst_nuid\":\"voB3zBf8Hhh4\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"BARYxtu0H3vC\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"30DTqlmJW9Ta\",\"dst_nuid\":\"voB3zBf8Hhh4\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"gZ2Yt3v2tQLp\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"tMuM3DJupA8q\",\"dst_nuid\":\"voB3zBf8Hhh4\",\"src_slot\":\"value\",\"dst_slot\":\"z\",\"uid\":\"IzPqSAogAI3O\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"color\",\"dt\":3,\"index\":0,\"uid\":\"GQQJWiOcNgy4\",\"dynamic\":true,\"type\":0,\"is_connected\":true},{\"name\":\"text\",\"dt\":15,\"index\":1,\"uid\":\"S2nnu4FGbdIz\",\"dynamic\":true,\"type\":0,\"is_connected\":true},{\"name\":\"font style\",\"dt\":15,\"index\":2,\"uid\":\"sRlAkgcKhKMQ\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"const_text_generator\",\"x\":556,\"y\":484,\"uid\":\"AzxNwijTsPSw\",\"state\":{\"text\":\"bold 64px arial\",\"width\":88.18181799999999,\"height\":11.181818},\"title\":\"Font Style\"},{\"plugin\":\"output_proxy\",\"x\":1139,\"y\":354,\"uid\":\"wlSFhZfM8ySX\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"IJEKqUWOR4PP\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":597,\"y\":388,\"uid\":\"3W0JYbSnoPaO\",\"title\":\"text\",\"dyn_out\":[{\"name\":\"input\",\"dt\":15,\"uid\":\"i10LW7KHRslc\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"color_picker\",\"x\":534,\"y\":124,\"uid\":\"4NkJzDMWUwnI\",\"state\":{\"hue\":0.6899417491441362,\"sat\":0.6415189250131671,\"lum\":0.5150568644205729}}],\"conns\":[{\"src_nuid\":\"AzxNwijTsPSw\",\"dst_nuid\":\"MJo7Ljhoq3nm\",\"src_slot\":\"text\",\"dst_slot\":2,\"uid\":\"mXzlhyWiqs6E\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"MJo7Ljhoq3nm\",\"dst_nuid\":\"wlSFhZfM8ySX\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"G9zqdywxMkPX\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"3W0JYbSnoPaO\",\"dst_nuid\":\"MJo7Ljhoq3nm\",\"src_slot\":0,\"dst_slot\":1,\"uid\":\"xvyW5OeKcLY6\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"4NkJzDMWUwnI\",\"dst_nuid\":\"MJo7Ljhoq3nm\",\"src_slot\":\"color\",\"dst_slot\":0,\"uid\":\"Ega0AIhNR5MN\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"name\":\"text\",\"dt\":15,\"index\":0,\"uid\":\"3ghUS8wkMr1K\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"KQIJHdC6kfHo\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":1348,\"y\":135,\"uid\":\"6C46hhI3kAm1\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"BuOO1EFA8VVD\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"if_else_modulator\",\"x\":593,\"y\":522,\"uid\":\"DFvfkPUVz3YB\"},{\"plugin\":\"variable_local_read\",\"x\":655,\"y\":718,\"uid\":\"4Bd3oyFHYwVq\",\"title\":\"clickCount\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"hAy6cFgLAsOi\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"variable_local_write\",\"x\":1038,\"y\":587,\"uid\":\"pMjF7VJrtcS9\",\"title\":\"clickCount\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"hQ6chP5rc6Sq\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":408,\"y\":612,\"uid\":\"pn7f3ymI8gTs\",\"state\":{\"val\":1}},{\"plugin\":\"add_modulator\",\"x\":850,\"y\":668,\"uid\":\"OkSsat6JvGOb\"},{\"plugin\":\"variable_local_read\",\"x\":631,\"y\":169,\"uid\":\"YEcAoAmIGZob\",\"title\":\"clickCount\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"hAy6cFgLAsOi\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"format_string_float\",\"x\":812,\"y\":192,\"uid\":\"ExJW8DkkTzZP\",\"open\":false},{\"plugin\":\"const_float_generator\",\"x\":635,\"y\":222,\"uid\":\"p4M5gGdaZRIm\",\"open\":false,\"state\":{\"val\":0}},{\"plugin\":\"string_concatenate_modulator\",\"x\":975,\"y\":147,\"uid\":\"DtSfH4d0THVe\",\"open\":false},{\"plugin\":\"const_text_generator\",\"x\":829,\"y\":97,\"uid\":\"A5MOlmaMaUnQ\",\"state\":{\"text\":\"Score: \",\"width\":99.18181799999999,\"height\":22.181818}},{\"plugin\":\"const_text_generator\",\"x\":51,\"y\":547,\"uid\":\"p4KdWP4lbhX8\",\"state\":{\"text\":\"objectClicked\",\"width\":105.18181799999999,\"height\":28.181818}},{\"plugin\":\"runtime_event_read\",\"x\":242,\"y\":513,\"uid\":\"DUcbYlrgKLQT\"}],\"conns\":[{\"src_nuid\":\"ckX1aarGba6U\",\"dst_nuid\":\"6C46hhI3kAm1\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"8LViumoNgMEO\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"pn7f3ymI8gTs\",\"dst_nuid\":\"DFvfkPUVz3YB\",\"src_slot\":\"value\",\"dst_slot\":\"true value\",\"uid\":\"UszczKRVvxwu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"DFvfkPUVz3YB\",\"dst_nuid\":\"OkSsat6JvGOb\",\"src_slot\":\"value\",\"dst_slot\":\"a\",\"uid\":\"mkOADmONAkgU\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"4Bd3oyFHYwVq\",\"dst_nuid\":\"OkSsat6JvGOb\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"l5odg9hsrkwb\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"OkSsat6JvGOb\",\"dst_nuid\":\"pMjF7VJrtcS9\",\"src_slot\":\"result\",\"dst_slot\":0,\"uid\":\"XNTihuP4TW2U\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"YEcAoAmIGZob\",\"dst_nuid\":\"ExJW8DkkTzZP\",\"src_slot\":0,\"dst_slot\":\"float\",\"uid\":\"WFjpnFsR94Sj\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"p4M5gGdaZRIm\",\"dst_nuid\":\"ExJW8DkkTzZP\",\"src_slot\":\"value\",\"dst_slot\":\"decimals\",\"uid\":\"oPS6gziXjIJA\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ExJW8DkkTzZP\",\"dst_nuid\":\"DtSfH4d0THVe\",\"src_slot\":\"text\",\"dst_slot\":\"b\",\"uid\":\"4dlrnGhhYe9k\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"DtSfH4d0THVe\",\"dst_nuid\":\"ckX1aarGba6U\",\"src_slot\":\"result\",\"dst_slot\":0,\"uid\":\"AioyICVLCPNi\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"A5MOlmaMaUnQ\",\"dst_nuid\":\"DtSfH4d0THVe\",\"src_slot\":\"text\",\"dst_slot\":\"a\",\"uid\":\"2tsmeJg7oqbd\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"DUcbYlrgKLQT\",\"dst_nuid\":\"DFvfkPUVz3YB\",\"src_slot\":\"triggered\",\"dst_slot\":\"condition\",\"uid\":\"Dmi0sRSHvvT9\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"p4KdWP4lbhX8\",\"dst_nuid\":\"DUcbYlrgKLQT\",\"src_slot\":\"text\",\"dst_slot\":\"eventName\",\"uid\":\"lj4rYONjgBGb\",\"src_connected\":true,\"dst_connected\":true}],\"variables\":[{\"id\":\"clickCounter\",\"dt\":8},{\"id\":\"clickCount\",\"dt\":0}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"uD2ummgGvwHj\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":526,\"y\":1162,\"uid\":\"bYEEfQW4ojAQ\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{}},\"title\":\"Audio\",\"graph\":{\"uid\":\"ANXBsabAj0qy\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"toggle_button\",\"x\":472,\"y\":265,\"uid\":\"Tz4KLQmiQf1l\",\"state\":{\"enabled\":true}},{\"plugin\":\"url_audio_generator\",\"x\":479,\"y\":165,\"uid\":\"OYvQy9pZHk2n\",\"state\":{\"url\":\"\"}},{\"plugin\":\"audio_player\",\"x\":751,\"y\":203,\"uid\":\"H3rbtojbulWM\"}],\"conns\":[{\"src_nuid\":\"Tz4KLQmiQf1l\",\"dst_nuid\":\"H3rbtojbulWM\",\"src_slot\":\"bool\",\"dst_slot\":\"play\",\"uid\":\"cruSavaMwSe5\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"OYvQy9pZHk2n\",\"dst_nuid\":\"H3rbtojbulWM\",\"src_slot\":\"audio\",\"dst_slot\":\"audio\",\"uid\":\"f32WW7H3BOXx\",\"src_connected\":true,\"dst_connected\":true}]}}],\"conns\":[{\"src_nuid\":\"d9slZ3PC0CIC\",\"dst_nuid\":\"u2O8M5ItNlW5\",\"src_slot\":0,\"dst_slot\":\"environment\",\"uid\":\"rzc7AKK9kBoJ\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"nvHKHIESiXU4\",\"dst_nuid\":\"u2O8M5ItNlW5\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"n6HvJBWbhUTp\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"OFAU6PiJpRKz\",\"dst_nuid\":\"u2O8M5ItNlW5\",\"src_slot\":0,\"dst_slot\":4,\"uid\":\"5kcE6nOcoLZR\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"5zkZJ1kVzShg\",\"dst_nuid\":\"u2O8M5ItNlW5\",\"src_slot\":0,\"dst_slot\":3,\"uid\":\"j7QD3FQVfiTJ\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"T6PXHoQNqdKa\",\"dst_nuid\":\"u2O8M5ItNlW5\",\"src_slot\":0,\"dst_slot\":1,\"uid\":\"4dPQlNzWSEeP\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"FwHyeUHfyCWa\",\"dst_nuid\":\"u2O8M5ItNlW5\",\"src_slot\":0,\"dst_slot\":2,\"uid\":\"vZyxj037ATPU\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"u2O8M5ItNlW5\",\"dst_nuid\":\"v7uRMObeuSEB\",\"src_slot\":\"scene\",\"dst_slot\":0,\"uid\":\"9qnXXGGVlcGW\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"xixCbaXdrdry\",\"dst_nuid\":\"u2O8M5ItNlW5\",\"src_slot\":0,\"dst_slot\":5,\"uid\":\"GjblljfnLNxV\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true}]}}"
  },
  {
    "path": "browser/data/video/attribution.txt",
    "content": "Copyright Stefan Mylleager.\n"
  },
  {
    "path": "browser/embed.html",
    "content": "<html>\n\t<h1>embed</h1>\n\t<!-- NOTE: use full URIs when testing cross-domain embeds -->\n\t<script src=\"/scripts/embed.js\" data-vizorurl=\"/eesn/flamingofront\"></script>\n</html>\n"
  },
  {
    "path": "browser/help/introduction.html",
    "content": "<html>\n\n<head>\n\t<title>Vizor Create</title>\n\n    <link href=\"style.css\" rel=\"Stylesheet\" type=\"text/css\"/>\n\n    <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />\n    <meta name=\"description\" content=\"Vizor lets you create compelling VR content right in your browser\" />\n\n    <link href='http://fonts.googleapis.com/css?family=Open+Sans:300' rel='stylesheet' type='text/css'>\n\n</head>\n\n<body>\n\t<div id=\"container\" style=\"width:800px\">\n\t\t<br><br>\n\t\t<img src=\"../images/logo--horizontal.png\">\n\n\t\t<br><br>\n\t\t\t<iframe width=\"560\" height=\"315\" src=\"//www.youtube.com/embed/9n9UdwaDe68\" frameborder=\"0\" allowfullscreen></iframe>\n\t\t<br>\n\n\t\t<h3>Editing graphs:</h3>\n\t\t<br>\n\t\t<span class=\"highlight\">Right click</span> on canvas to insert plugins or use the search box.<br><br>\n\t\tDrag connections from inputs and outputs to connect them.<br><br>\n\t\tPress <span class=\"highlight\">Play</span> to run your graph.<br><br>\n\t\tHold <span class=\"highlight\">shift</span> to delete connections from slots.<br><br>\n\t\tPress <span class=\"highlight\">backspace</span> to delete selected nodes.<br><br>\n\t\t<span class=\"highlight\">Double click</span> to add Patches to the graph.<br><br>\n\t\t<span class=\"highlight\">Click and drag</span> on the canvas to select plugins.<br><br>\n\t\tCollapse plugins by clicking on their header icon.<br>\n\t\t<br>\n\n\t\t<h3>Hotkeys:</h3>\n\t\t<br>\n\t\tOn Mac, the command key is used instead of control.\n\t\t<br>\n\t\t<br>\n\t\t<span class=\"highlight\">CTRL-C, CTRL-V, CTRL-X</span> Copy, Paste, Cut<br>\n\t\t<br>\n\t\t<span class=\"highlight\">CTRL-A</span> Select all<br>\n\t\t<br>\n\t\t<span class=\"highlight\">CTRL-B</span> Hide/show left pane<br>\n\t\t<br>\n\t\t<span class=\"highlight\">CTRL-L</span> Hide/show console.<br>\n\t\t<br>\n\t\t<span class=\"highlight\">Space</span> Play/Stop<br>\n\t\t<br>\n\t\t<span class=\"highlight\">Tab</span> Show/Hide graph<br>\n\t\t<br>\n\t\t<span class=\"highlight\">Backspace/Delete</span> Delete selected plugins<br>\n\t\t<br>\n\t\t<span class=\"highlight\">q or /</span> Search<br><br/>\n\t\t<span class=\"highlight\">f</span> Fullscreen<br><br/>\n\t\t<span class=\"highlight\">Enter</span> 'Commit': Deselect all, place<br><br/>\n\n\n\t\t<span class=\"highlight\">1</span>\n\t\t\tInput proxy<br><br>\n\t\t<span class=\"highlight\">2</span>\n\t\t\tGraph<br><br>\n\t\t<span class=\"highlight\">3</span>\n\t\t\tSlider<br><br>\n\t\t<span class=\"highlight\">4</span>\n\t\t\tFloat value input<br><br>\n\t\t<span class=\"highlight\">5</span>\n\t\t\tFloat debug<br><br>\n\t\t<span class=\"highlight\">6</span>\n\t\t\tMultiply number<br><br>\n\t\t<span class=\"highlight\">7</span>\n\t\t\tXYZ to Vector<br><br>\n\t\t<span class=\"highlight\">8</span>\n\t\t\tBoolean toggle<br><br>\n\t\t<span class=\"highlight\">9</span>\n\t\t\tKnob<br><br>\n\t\t<span class=\"highlight\">0</span>\n\t\t\tOutput proxy<br>\n\n\n\t\t<h3>Source code:</h3>\n\t\t<br>\n\t\tThe source code can be found from our <a href=\"https://github.com/vizorvr/create\">GitHub page</a>. Please report any issues to the <a href=\"https://github.com/vizorvr/create/issues\">GitHub issues page</a>.\n\t\t<br>\n\t\t\n\t\t<h3>Video:</h3>\n\t\t<br>\n\t\tVideos are .ogv files. Converting works with <a href=\"http://www.ffmpeg.org/\">ffmpeg</a> using these arguments:<br>\n\t\t<br>\n\t\t<span class=\"highlight\">ffmpeg -i inputfile.mpg -an -vcodec libtheora -vb 1024k -s 256x256 -aspect 1:1 output.ogv</span>\n\t\t<br>\n\n\t\t<h3>Audio:</h3>\n\t\t<br>\n\t\tAudio player plays standard .ogg files which can be converted with eg. <a href=\"http://audacity.sourceforge.net/\">Audacity</a>.\n\t\t<br>\n\n\t\t<h3>Plugin API</h3>\n\t\t<br>\n\t\t<a href=\"plugin_api.html\">Plugin API documentation.</a>\n\t\t<br>\n\n\t\t<h3>Attributions</h3>\n\t\t<br>\n\t\t<a href=\"https://site.vizor.io/patches-attribution\">Attributions</a>\n\t\t<br>\n\n\t\t<h3>Terms of Service & Privacy policy</h3>\n\t\t<a href=\"https://site.vizor.io/patches-tos\">Terms of Service</A> & <a href=\"https://site.vizor.io/patches-privacy-policy\">Privacy</a>\n\t\t\n\n\t</div>\n\n</body>\n</html>\n"
  },
  {
    "path": "browser/help/plugin_api.html",
    "content": "<html>\n<head>\n\t<title>Vizor Patches - Plugin development</title>\n\t<META http-equiv=\"refresh\" content=\"0;https://github.com/vizorvr/vizor/wiki/Plugin-Development-and-API\"> </META>\n</head>\n<body>\n\n<center>The Patches plugin API has moved to <a href=\"https://github.com/vizorvr/vizor/wiki/Plugin-Development-and-API\"/>https://github.com/vizorvr/vizor/wiki/Plugin-Development-and-API</a></center>\n\n</body>\n</html>\n"
  },
  {
    "path": "browser/help/style.css",
    "content": "body\n{\n    margin: 0 auto;\n    font-family: Verdana;\n    line-height: 1.2;\n    max-width: 960px;\n    padding: 30px;\n    margin-left: auto;\n    margin-right: auto;\n    background-color: #cacaca !important;\n  }  \n\n\ncode\n{\n\twhite-space: pre;\n\tfont-weight: bold;\n}\n\n\n\nh1, h2, h3, h4 {\n    color: #111111;\n    font-weight: 400;\n}\nh1, h2, h3, h4, h5, p {\n    margin-bottom: 24px;\n    padding: 0;\n}\nh1 {\n    font-size: 48px;\n        color: #333;\n}\nh2 {\n    font-size: 36px;\n    margin: 24px 0 6px;\n}\nh3 {\n    font-size: 24px;\n    margin-bottom: 5px;\n}\nh4 {\n    font-size: 21px;\n}\nh5 {\n    font-size: 18px;\n}\na {\n    color: #0099ff;\n    margin: 0;\n    padding: 0;\n    vertical-align: baseline;\n}\na:hover {\n    text-decoration: none;\n    color: #ff6600;\n}\nul, ol {\n    padding: 0;\n    margin: 0;\n}\nli {\n    line-height: 24px;\n}\nli ul, li ul {\n    margin-left: 24px;\n}\np, ul, ol {\n    font-size: 16px;\n    line-height: 24px;\n    max-width: 960px;\n}\npre {\n    padding: 0px 24px;\n    max-width: 800px;\n    white-space: pre-wrap;\n}\ncode {\n    font-family: Consolas, Monaco, Andale Mono, monospace;\n    line-height: 1.5;\n    font-size: 13px;\n}\naside {\n    display: block;\n    float: right;\n    width: 390px;\n}\nblockquote {\n    border-left:.5em solid #eee;\n    padding: 0 2em;\n    margin-left:0;\n    max-width: 476px;\n}\nblockquote  cite {\n    font-size:14px;\n    line-height:20px;\n    color:#bfbfbf;\n}\nblockquote cite:before {\n    content: '\\2014 \\00A0';\n}\n\nblockquote p {  \n    color: #666;\n    max-width: 460px;\n}\nhr {\n    width: 960px;\n    text-align: left;\n    margin: 10px auto 10px 0;\n    color: #999;\n}\ntable {\n    border-collapse: collapse;\n}\nth {\n    padding-bottom: 4px;\n    border-bottom: 4px double #888;\n}\ntd {\n    padding-right: 40px;\n    padding-top: 4px;\n    padding-bottom: 4px;\n    border-bottom: 1px solid #aaa;\n}\ntd:nth-last-child(1) {\n    padding-right: 0px;\n}\n\n.highlight {\n    color: #444;\n    background-color: #ddd;\n    border: 1;\n    font-family: times;\n    padding: 3px;\n}\n"
  },
  {
    "path": "browser/no_webgl.html",
    "content": "\n<html>\n<head>\n\t<title>Vizor - No WebGL found</title>\n</head>\n<link href=\"help/style.css\" rel=\"stylesheet\"></link>\n<body>\n\n<div id=\"container\" style=\"width:800px\">\n<img src=\"help/screenshot.png\"><br>\n<h1>Vizor is a visual programming platform for WebVR, WebGL and other HTML5 APIs</h1>\n<br>\nUnfortunately you need WebGL enabled browser to view our editor. Try it on your home computer with Chrome or Firefox!\n<br><br>\nVizor is open source and licensed under the MIT license. The source code is released at <a href=\"https://github.com/engijs/engi\">https://github.com/vizorvr/vizor</a><br>\n\n</div>\n</body>\n</html>\n"
  },
  {
    "path": "browser/patchTemplates/360photo.hbs",
    "content": "{\n    \"nodes\": [{\n        \"plugin\": \"threesixty_photo_entity\",\n        \"x\": 772,\n        \"y\": 672,\n        \"uid\": \"3C9Em6xdrgEM\",\n        \"state\": {\n            \"always_update\": true,\n            \"input_sids\": {},\n            \"output_sids\": {\n                \"DYZgrPjpJgXJ\": \"mh0rTKkFm0nD\"\n            }\n        },\n        \"title\": \"{{name}}\",\n        \"graph\": {\n            \"uid\": \"9DJ4ZqszKFMU\",\n            \"parent_uid\": \"root\",\n            \"open\": true,\n            \"nodes\": [{\n                \"plugin\": \"three_mesh\",\n                \"x\": 1252,\n                \"y\": 373,\n                \"uid\": \"3rgf6r3xbYSA\",\n                \"state\": {\n                    \"position\": {\n                        \"x\": 0,\n                        \"y\": 0,\n                        \"z\": 0\n                    },\n                    \"scale\": {\n                        \"x\": 1,\n                        \"y\": 1,\n                        \"z\": 1\n                    },\n                    \"quaternion\": {\n                        \"_x\": 0,\n                        \"_y\": 0,\n                        \"_z\": 0,\n                        \"_w\": 1\n                    }\n                }\n            }, {\n                \"plugin\": \"output_proxy\",\n                \"x\": 1438,\n                \"y\": 405,\n                \"uid\": \"DYZgrPjpJgXJ\",\n                \"title\": \"object3d\",\n                \"dyn_in\": [{\n                    \"name\": \"output\",\n                    \"dt\": 21,\n                    \"def\": null,\n                    \"uid\": \"bEdPpC9C6Rh1\",\n                    \"dynamic\": true,\n                    \"type\": 0,\n                    \"index\": 0,\n                    \"is_connected\": true,\n                    \"connected\": true\n                }]\n            }, {\n                \"plugin\": \"three_material\",\n                \"x\": 974,\n                \"y\": 130,\n                \"uid\": \"TD7n9my6NX9Z\",\n                \"state\": {}\n            }, {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 723,\n                \"y\": 214,\n                \"uid\": \"wqrVfMSYYqwN\",\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Side\"\n            }, {\n                \"plugin\": \"three_uv_modifier\",\n                \"x\": 553,\n                \"y\": 87,\n                \"uid\": \"NsYvEbNxsUR5\",\n                \"state\": {}\n            }, {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 297,\n                \"y\": 197,\n                \"uid\": \"W8QSRNB4kueG\",\n                \"state\": {\n                    \"val\": -1\n                },\n                \"title\": \"X repeat photo\"\n            }, {\n                \"plugin\": \"three_geometry_sphere\",\n                \"x\": 939,\n                \"y\": 467,\n                \"uid\": \"UQ9hvSqLBWRh\"\n            }, {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 675,\n                \"y\": 421,\n                \"uid\": \"VGntdzyvgDQP\",\n                \"state\": {\n                    \"val\": 30\n                },\n                \"title\": \"Radius\"\n            }, {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 676,\n                \"y\": 502,\n                \"uid\": \"gFaz858pqbTt\",\n                \"state\": {\n                    \"val\": 40\n                },\n                \"title\": \"Width Segments\"\n            }, {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 674,\n                \"y\": 584,\n                \"uid\": \"AbeR7zbHJYMg\",\n                \"state\": {\n                    \"val\": 40\n                },\n                \"title\": \"Height Segments\"\n            }, {\n                \"plugin\": \"toggle_button\",\n                \"x\": 724,\n                \"y\": 292,\n                \"uid\": \"N7d3TBFVFfDU\",\n                \"state\": {\n                    \"enabled\": false\n                },\n                \"title\": \"Fog\"\n            }, {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 301,\n                \"y\": 298,\n                \"uid\": \"Tbsrebx2e3nd\",\n                \"state\": {\n                    \"val\": 0.25,\n                    \"min\": 0,\n                    \"max\": 1\n                }\n            }, {\n                \"plugin\": \"photosphere_orientation_reader\",\n                \"x\": 671,\n                \"y\": 380,\n                \"uid\": \"3C3g2scg5WLj\",\n                \"open\": false,\n                \"state\": {}\n            }, {\n                \"plugin\": \"url_texture_generator\",\n                \"x\": 239,\n                \"y\": 544,\n                \"uid\": \"vtErWjYsRPJc\",\n                \"state\": {\n                    \"url\": \"{{url}}\"\n                }\n            }],\n            \"conns\": [{\n                \"src_nuid\": \"3rgf6r3xbYSA\",\n                \"dst_nuid\": \"DYZgrPjpJgXJ\",\n                \"src_slot\": \"object3d\",\n                \"dst_slot\": 0,\n                \"uid\": \"Lb5jAPDD6xmp\",\n                \"dst_dyn\": true\n            }, {\n                \"src_nuid\": \"TD7n9my6NX9Z\",\n                \"dst_nuid\": \"3rgf6r3xbYSA\",\n                \"src_slot\": \"material\",\n                \"dst_slot\": \"material\",\n                \"uid\": \"WsBWYJ7TBCuS\"\n            }, {\n                \"src_nuid\": \"wqrVfMSYYqwN\",\n                \"dst_nuid\": \"TD7n9my6NX9Z\",\n                \"src_slot\": \"value\",\n                \"dst_slot\": \"side\",\n                \"uid\": \"EEP2DepqwGyK\"\n            }, {\n                \"src_nuid\": \"NsYvEbNxsUR5\",\n                \"dst_nuid\": \"TD7n9my6NX9Z\",\n                \"src_slot\": \"texture\",\n                \"dst_slot\": \"texture\",\n                \"uid\": \"bkBZEsb5vUtw\"\n            }, {\n                \"src_nuid\": \"W8QSRNB4kueG\",\n                \"dst_nuid\": \"NsYvEbNxsUR5\",\n                \"src_slot\": \"value\",\n                \"dst_slot\": \"u repeat\",\n                \"uid\": \"94jAD2Wpg6jf\"\n            }, {\n                \"src_nuid\": \"VGntdzyvgDQP\",\n                \"dst_nuid\": \"UQ9hvSqLBWRh\",\n                \"src_slot\": \"value\",\n                \"dst_slot\": \"radius\",\n                \"uid\": \"APbNVtDhPS4x\"\n            }, {\n                \"src_nuid\": \"gFaz858pqbTt\",\n                \"dst_nuid\": \"UQ9hvSqLBWRh\",\n                \"src_slot\": \"value\",\n                \"dst_slot\": \"widthSegments\",\n                \"uid\": \"3MyuJH2NXjad\"\n            }, {\n                \"src_nuid\": \"AbeR7zbHJYMg\",\n                \"dst_nuid\": \"UQ9hvSqLBWRh\",\n                \"src_slot\": \"value\",\n                \"dst_slot\": \"heightSegments\",\n                \"uid\": \"wL9VJtsZbVVm\"\n            }, {\n                \"src_nuid\": \"UQ9hvSqLBWRh\",\n                \"dst_nuid\": \"3rgf6r3xbYSA\",\n                \"src_slot\": \"geometry\",\n                \"dst_slot\": \"geometry\",\n                \"uid\": \"RknMhhgac8KN\"\n            }, {\n                \"src_nuid\": \"N7d3TBFVFfDU\",\n                \"dst_nuid\": \"TD7n9my6NX9Z\",\n                \"src_slot\": \"bool\",\n                \"dst_slot\": \"fog\",\n                \"uid\": \"ftAP7yb4aeuw\"\n            }, {\n                \"src_nuid\": \"Tbsrebx2e3nd\",\n                \"dst_nuid\": \"NsYvEbNxsUR5\",\n                \"src_slot\": \"value\",\n                \"dst_slot\": \"u offset\",\n                \"uid\": \"K9vxt2VJ55xc\"\n            }, {\n                \"src_nuid\": \"3C3g2scg5WLj\",\n                \"dst_nuid\": \"3rgf6r3xbYSA\",\n                \"src_slot\": \"rotation\",\n                \"dst_slot\": \"rotation\",\n                \"uid\": \"Swcu4favYStt\"\n            }, {\n                \"src_nuid\": \"vtErWjYsRPJc\",\n                \"dst_nuid\": \"NsYvEbNxsUR5\",\n                \"src_slot\": \"texture\",\n                \"dst_slot\": \"texture\",\n                \"uid\": \"ve4CHkAZ9RB9\"\n            }, {\n                \"src_nuid\": \"vtErWjYsRPJc\",\n                \"dst_nuid\": \"3C3g2scg5WLj\",\n                \"src_slot\": \"texture\",\n                \"dst_slot\": \"texture\",\n                \"uid\": \"TNxCvSAe4bKp\"\n            }]\n        },\n        \"dyn_out\": [{\n            \"name\": \"object3d\",\n            \"dt\": 21,\n            \"index\": 0,\n            \"uid\": \"mh0rTKkFm0nD\",\n            \"dynamic\": true,\n            \"type\": 1,\n            \"is_connected\": false\n        }]\n    }],\n    \"conns\": [],\n    \"x1\": 822,\n    \"y1\": 722,\n    \"x2\": 977,\n    \"y2\": 781\n}"
  },
  {
    "path": "browser/patchTemplates/audio.hbs",
    "content": "{\n    \"nodes\": [{\n        \"plugin\": \"graph\",\n        \"x\": 691,\n        \"y\": 874,\n        \"uid\": \"L76H5Gvb5fXN\",\n        \"state\": {\n            \"always_update\": true,\n            \"input_sids\": {},\n            \"output_sids\": {}\n        },\n        \"title\": \"{{name}}\",\n        \"graph\": {\n            \"uid\": \"L24mFTGX3vQS\",\n            \"parent_uid\": \"root\",\n            \"open\": true,\n            \"nodes\": [{\n                \"plugin\": \"audio_source_player\",\n                \"x\": 1188,\n                \"y\": 94,\n                \"uid\": \"AEtyS7yXsWGf\"\n            }, {\n                \"plugin\": \"audio_buffer_source_modulator\",\n                \"x\": 853,\n                \"y\": 139,\n                \"uid\": \"sEfEATyGM7Df\"\n            }, {\n                \"plugin\": \"toggle_button\",\n                \"x\": 537,\n                \"y\": 360,\n                \"uid\": \"Cxvgc66nBF6Y\",\n                \"state\": {\n                    \"enabled\": false\n                },\n                \"title\": \"Loop\"\n            }, {\n                \"plugin\": \"annotation\",\n                \"x\": 1162,\n                \"y\": 176,\n                \"uid\": \"htXMzL88a8EZ\",\n                \"state\": {\n                    \"text\": \"Here we use WebAudio to play sound. Please note different browsers treat .MP3 and .OGG files differently.\",\n                    \"width\": 150,\n                    \"height\": 70\n                }\n            }, {\n                \"plugin\": \"url_audio_buffer_generator\",\n                \"x\": 485,\n                \"y\": 164,\n                \"uid\": \"nfpDHJd4Ehg8\",\n                \"state\": {\n                    \"url\": \"{{url}}\"\n                },\n                \"title\": \"Load audio file\"\n            }, {\n                \"plugin\": \"toggle_button\",\n                \"x\": 537,\n                \"y\": 269,\n                \"uid\": \"FmpwrDgExqBZ\",\n                \"state\": {\n                    \"enabled\": true\n                },\n                \"title\": \"Play\"\n            }],\n            \"conns\": [{\n                \"src_nuid\": \"Cxvgc66nBF6Y\",\n                \"dst_nuid\": \"sEfEATyGM7Df\",\n                \"src_slot\": \"bool\",\n                \"dst_slot\": \"loop\",\n                \"uid\": \"U64Qcq7KyAV4\"\n            }, {\n                \"src_nuid\": \"sEfEATyGM7Df\",\n                \"dst_nuid\": \"AEtyS7yXsWGf\",\n                \"src_slot\": \"source\",\n                \"dst_slot\": \"source\",\n                \"uid\": \"EtUCEKPAJVQv\"\n            }, {\n                \"src_nuid\": \"nfpDHJd4Ehg8\",\n                \"dst_nuid\": \"sEfEATyGM7Df\",\n                \"src_slot\": \"buffer\",\n                \"dst_slot\": \"buffer\",\n                \"uid\": \"EjYPeP9HBqeB\"\n            }, {\n                \"src_nuid\": \"FmpwrDgExqBZ\",\n                \"dst_nuid\": \"sEfEATyGM7Df\",\n                \"src_slot\": \"bool\",\n                \"dst_slot\": \"play\",\n                \"uid\": \"gukdZxYgWtmX\"\n            }]\n        }\n    }],\n    \"conns\": []\n}"
  },
  {
    "path": "browser/patchTemplates/scene.hbs",
    "content": "{\n\n    \"nodes\": [\n        {\n            \"plugin\": \"entity\",\n            \"x\": 273,\n            \"y\": 548,\n            \"uid\": \"3KbAxkHKuq90\",\n            \"open\": false,\n            \"state\": {\n                \"always_update\": true,\n                \"input_sids\": {},\n                \"output_sids\": {\n                    \"S2TweIhjn1vD\": \"Ys30r7aVEks1\"\n                }\n            },\n            \"title\": \"{{name}}\",\n            \"graph\": {\n                \"uid\": \"WWubrtgQmEwp\",\n                \"parent_uid\": \"root\",\n                \"open\": true,\n                \"nodes\": [\n                    {\n                        \"plugin\": \"output_proxy\",\n                        \"x\": 883,\n                        \"y\": 205,\n                        \"uid\": \"S2TweIhjn1vD\",\n                        \"title\": \"object3d\",\n                        \"dyn_in\": [\n                            {\n                                \"name\": \"output\",\n                                \"dt\": 21,\n                                \"def\": null,\n                                \"uid\": \"UW8xhKSPhTFp\",\n                                \"dynamic\": true,\n                                \"type\": 0,\n                                \"index\": 0,\n                                \"is_connected\": true,\n                                \"connected\": true\n                            }\n                        ]\n                    },\n                    {\n                        \"plugin\": \"three_loader_scene\",\n                        \"x\": 446,\n                        \"y\": 116,\n                        \"uid\": \"kTkQLcbSMN4G\",\n                        \"state\": {\n                            \"position\": {\n                                \"x\": 0,\n                                \"y\": 0,\n                                \"z\": 0\n                            },\n                            \"scale\": {\n                                \"x\": 0.00909090909090909,\n                                \"y\": 0.00909090909090909,\n                                \"z\": 0.00909090909090909\n                            },\n                            \"quaternion\": {\n                                \"_x\": 0,\n                                \"_y\": 0,\n                                \"_z\": 0,\n                                \"_w\": 1\n                            },\n                            \"url\": \"{{url}}\"\n                        }\n                    }\n\t\t\t\t],\n                \"conns\": [\n                    {\n                        \"src_nuid\": \"kTkQLcbSMN4G\",\n                        \"dst_nuid\": \"S2TweIhjn1vD\",\n                        \"src_slot\": 0,\n                        \"dst_slot\": 0,\n                        \"uid\": \"fEHjnSgovTSk\",\n                        \"src_connected\": true,\n                        \"dst_connected\": true,\n                        \"dst_dyn\": true\n                    }\n                ]\n            },\n            \"dyn_out\": [\n                {\n                    \"name\": \"object3d\",\n                    \"dt\": 21,\n                    \"index\": 0,\n                    \"uid\": \"Ys30r7aVEks1\",\n                    \"dynamic\": true,\n                    \"type\": 1,\n                    \"is_connected\": true\n                }\n            ]\n        }\n    ],\n    \"conns\": []\n}\n"
  },
  {
    "path": "browser/patchTemplates/texture-plane.hbs",
    "content": "{\n    \"nodes\": [\n        {\n            \"plugin\": \"entity\",\n            \"x\": 50,\n            \"y\": 501,\n            \"uid\": \"lSaWUPbjt5on\",\n            \"state\": {\n                \"always_update\": true,\n                \"input_sids\": {},\n                \"output_sids\": {\n                    \"aDPpmJxeYrvd\": \"mh0rTKkFm0nD\"\n                }\n            },\n            \"title\": \"{{name}}\",\n            \"graph\": {\n                \"uid\": \"nQMH4yQ6MgdG\",\n                \"parent_uid\": \"root\",\n                \"open\": true,\n                \"nodes\": [\n                    {\n                        \"plugin\": \"three_mesh\",\n                        \"x\": 1002,\n                        \"y\": 194,\n                        \"uid\": \"P6Etq7Awqeli\",\n                        \"state\": {\n                            \"position\": {\n                                \"x\": 0,\n                                \"y\": 0.5,\n                                \"z\": 0\n                            },\n                            \"scale\": {\n                                \"x\": 1,\n                                \"y\": 1,\n                                \"z\": 1\n                            },\n                            \"quaternion\": {\n                                \"_x\": 0,\n                                \"_y\": 0,\n                                \"_z\": 0,\n                                \"_w\": 1\n                            }\n                        }\n                    },\n                    {\n                        \"plugin\": \"output_proxy\",\n                        \"x\": 1233,\n                        \"y\": 197,\n                        \"uid\": \"aDPpmJxeYrvd\",\n                        \"title\": \"object3d\",\n                        \"dyn_in\": [\n                            {\n                                \"name\": \"output\",\n                                \"dt\": 21,\n                                \"def\": null,\n                                \"uid\": \"bEdPpC9C6Rh1\",\n                                \"dynamic\": true,\n                                \"type\": 0,\n                                \"index\": 0,\n                                \"is_connected\": true,\n                                \"connected\": true\n                            }\n                        ]\n                    },\n                    {\n                        \"plugin\": \"three_geometry_plane\",\n                        \"x\": 627,\n                        \"y\": 97,\n                        \"uid\": \"xeLvzijpadE6\"\n                    },\n                    {\n                        \"plugin\": \"three_material\",\n                        \"x\": 634,\n                        \"y\": 277,\n                        \"uid\": \"RkRPeA8c0KZg\",\n                        \"open\": false\n                    },\n                    {\n                        \"plugin\": \"url_texture_generator\",\n                        \"x\": 329,\n                        \"y\": 282,\n                        \"uid\": \"ft7D2KfJixmo\",\n                        \"state\": {\n                            \"url\": \"{{scaled.url}}\"\n                        }\n                    },\n                    {\n                        \"plugin\": \"const_float_generator\",\n                        \"x\": 404,\n                        \"y\": 124,\n                        \"uid\": \"ZuRQbYI3DQjB\",\n                        \"state\": {\n                            \"val\": 1\n                        },\n                        \"title\": \"Width & Height\"\n                    },\n                    {\n                        \"plugin\": \"const_float_generator\",\n                        \"x\": 402,\n                        \"y\": 442,\n                        \"uid\": \"dPw7g3tZqn1u\",\n                        \"state\": {\n                            \"val\": 2\n                        },\n                        \"title\": \"Sides\"\n                    },\n                    {\n                        \"plugin\": \"vector\",\n                        \"x\": 762,\n                        \"y\": 337,\n                        \"uid\": \"jyuUsyRpaRbo\",\n                        \"open\": false,\n                        \"title\": \"Position Vector\"\n                    },\n                    {\n                        \"plugin\": \"const_float_generator\",\n                        \"x\": 639,\n                        \"y\": 339,\n                        \"uid\": \"5WDYLQCFTuZN\",\n                        \"state\": {\n                            \"val\": 0.5\n                        },\n                        \"title\": \"Y\"\n                    }\n                ],\n                \"conns\": [\n                    {\n                        \"src_nuid\": \"P6Etq7Awqeli\",\n                        \"dst_nuid\": \"aDPpmJxeYrvd\",\n                        \"src_slot\": 0,\n                        \"dst_slot\": 0,\n                        \"uid\": \"MpWiwxN76xak\",\n                        \"src_connected\": true,\n                        \"dst_connected\": true,\n                        \"dst_dyn\": true\n                    },\n                    {\n                        \"src_nuid\": \"xeLvzijpadE6\",\n                        \"dst_nuid\": \"P6Etq7Awqeli\",\n                        \"src_slot\": 0,\n                        \"dst_slot\": 1,\n                        \"uid\": \"X7VxXu21TVo6\",\n                        \"src_connected\": true,\n                        \"dst_connected\": true\n                    },\n                    {\n                        \"src_nuid\": \"RkRPeA8c0KZg\",\n                        \"dst_nuid\": \"P6Etq7Awqeli\",\n                        \"src_slot\": 0,\n                        \"dst_slot\": 2,\n                        \"uid\": \"f9aGv5XSujSw\",\n                        \"src_connected\": true,\n                        \"dst_connected\": true\n                    },\n                    {\n                        \"src_nuid\": \"ft7D2KfJixmo\",\n                        \"dst_nuid\": \"RkRPeA8c0KZg\",\n                        \"src_slot\": 0,\n                        \"dst_slot\": 0,\n                        \"uid\": \"TsEIhffs6qaj\",\n                        \"src_connected\": true,\n                        \"dst_connected\": true\n                    },\n                    {\n                        \"src_nuid\": \"ZuRQbYI3DQjB\",\n                        \"dst_nuid\": \"xeLvzijpadE6\",\n                        \"src_slot\": 0,\n                        \"dst_slot\": 1,\n                        \"uid\": \"OnAuEC4QwK8m\",\n                        \"src_connected\": true,\n                        \"dst_connected\": true\n                    },\n                    {\n                        \"src_nuid\": \"ZuRQbYI3DQjB\",\n                        \"dst_nuid\": \"xeLvzijpadE6\",\n                        \"src_slot\": 0,\n                        \"dst_slot\": 0,\n                        \"uid\": \"vaonuZUykmiW\",\n                        \"src_connected\": true,\n                        \"dst_connected\": true\n                    },\n                    {\n                        \"src_nuid\": \"dPw7g3tZqn1u\",\n                        \"dst_nuid\": \"RkRPeA8c0KZg\",\n                        \"src_slot\": 0,\n                        \"dst_slot\": 8,\n                        \"uid\": \"NR8Qk6Y3YxLa\",\n                        \"src_connected\": true,\n                        \"dst_connected\": true\n                    },\n                    {\n                        \"src_nuid\": \"jyuUsyRpaRbo\",\n                        \"dst_nuid\": \"P6Etq7Awqeli\",\n                        \"src_slot\": 0,\n                        \"dst_slot\": 3,\n                        \"uid\": \"ayzVrzOk35Zx\",\n                        \"src_connected\": true,\n                        \"dst_connected\": true\n                    },\n                    {\n                        \"src_nuid\": \"5WDYLQCFTuZN\",\n                        \"dst_nuid\": \"jyuUsyRpaRbo\",\n                        \"src_slot\": 0,\n                        \"dst_slot\": 1,\n                        \"uid\": \"PZx8jE8uwdwj\",\n                        \"src_connected\": true,\n                        \"dst_connected\": true\n                    }\n                ]\n            },\n            \"dyn_out\": [\n                {\n                    \"name\": \"object3d\",\n                    \"dt\": 21,\n                    \"index\": 0,\n                    \"uid\": \"mh0rTKkFm0nD\",\n                    \"dynamic\": true,\n                    \"type\": 1,\n                    \"is_connected\": true\n                }\n            ]\n        }\n    ],\n    \"conns\": []\n}\n"
  },
  {
    "path": "browser/patchTemplates/video-plane.hbs",
    "content": "{\n    \"abs_t\": 367.574,\n    \"active_graph\": \"root\",\n    \"graph_uid\": \"TXDgBc0JJtS3\",\n    \"root\": {\n        \"uid\": \"root\",\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 256,\n                \"y\": 373,\n                \"uid\": \"5zkZJ1kVzShg\",\n                \"open\": false,\n                \"state\": {\n                    \"always_update\": true,\n                    \"input_sids\": {},\n                    \"output_sids\": {\n                        \"0uogYZhTulp7\": \"mh0rTKkFm0nD\"\n                    }\n                },\n                \"title\": \"Video Player\",\n                \"graph\": {\n                    \"uid\": \"Hzr5rg9SHgsb\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"three_mesh\",\n                            \"x\": 936,\n                            \"y\": 319,\n                            \"uid\": \"GxMrrSaA44wq\",\n                            \"open\": false,\n                            \"state\": {\n                                \"position\": {\n                                    \"x\": 0,\n                                    \"y\": -0.01311748567091614,\n                                    \"z\": 0.000023347093529794483\n                                },\n                                \"scale\": {\n                                    \"x\": 16.260185647641777,\n                                    \"y\": 16.260185647641777,\n                                    \"z\": 16.260185647641777\n                                },\n                                \"quaternion\": {\n                                    \"_x\": -0.7077357707678449,\n                                    \"_y\": 0,\n                                    \"_z\": 0,\n                                    \"_w\": 0.7064772456816478\n                                }\n                            }\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1105,\n                            \"y\": 321,\n                            \"uid\": \"0uogYZhTulp7\",\n                            \"title\": \"object3d\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 21,\n                                    \"def\": null,\n                                    \"uid\": \"bEdPpC9C6Rh1\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"three_geometry_plane\",\n                            \"x\": 751,\n                            \"y\": 270,\n                            \"uid\": \"tr9n2eRfks8M\",\n                            \"open\": false\n                        },\n                        {\n                            \"plugin\": \"video_player\",\n                            \"x\": 488,\n                            \"y\": 443,\n                            \"uid\": \"DKiwCxqBvTWY\",\n                            \"open\": false\n                        },\n                        {\n                            \"plugin\": \"url_video_generator\",\n                            \"x\": 213,\n                            \"y\": 383,\n                            \"uid\": \"fzrkMl5UU1Ai\",\n                            \"state\": {\n                                \"url\": \"{{url}}\"\n                            }\n                        },\n                        {\n                            \"plugin\": \"three_material\",\n                            \"x\": 727,\n                            \"y\": 443,\n                            \"uid\": \"HmBLJ6OJLRNE\",\n                            \"open\": false\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 234,\n                            \"y\": 475,\n                            \"uid\": \"py9oPpuzeuqs\",\n                            \"open\": false,\n                            \"state\": {\n                                \"enabled\": true\n                            }\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"GxMrrSaA44wq\",\n                            \"dst_nuid\": \"0uogYZhTulp7\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"lJTzbafg9t8D\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"tr9n2eRfks8M\",\n                            \"dst_nuid\": \"GxMrrSaA44wq\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"0XCswCxPk54c\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"DKiwCxqBvTWY\",\n                            \"dst_nuid\": \"HmBLJ6OJLRNE\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"41pe2v5jS54Y\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"HmBLJ6OJLRNE\",\n                            \"dst_nuid\": \"GxMrrSaA44wq\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"hXT3U5U8SycZ\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"fzrkMl5UU1Ai\",\n                            \"dst_nuid\": \"DKiwCxqBvTWY\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"Sp4C04pxormC\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"py9oPpuzeuqs\",\n                            \"dst_nuid\": \"DKiwCxqBvTWY\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"Jm6TxkfqY1az\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        }\n                    ]\n                },\n                \"dyn_out\": [\n                    {\n                        \"name\": \"object3d\",\n                        \"dt\": 21,\n                        \"index\": 0,\n                        \"uid\": \"mh0rTKkFm0nD\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/3d_plain_scene_loader.json",
    "content": "{\n    \"abs_t\": 94.896,\n    \"active_graph\": 0,\n    \"graph_uid\": 19,\n    \"root\": {\n        \"node_uid\": 66,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 760,\n                \"y\": 471,\n                \"uid\": 65,\n                \"dsid\": 1,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {\n                        \"39\": 0\n                    },\n                    \"output_sids\": {}\n                },\n                \"title\": \"Plain scene loader\",\n                \"graph\": {\n                    \"node_uid\": 40,\n                    \"uid\": 17,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 654,\n                            \"y\": 89,\n                            \"uid\": 0,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"1\": 0,\n                                    \"2\": 1,\n                                    \"10\": 2,\n                                    \"21\": 5,\n                                    \"23\": 6\n                                },\n                                \"output_sids\": {}\n                            },\n                            \"title\": \"Scene loader\",\n                            \"graph\": {\n                                \"node_uid\": 27,\n                                \"uid\": 18,\n                                \"parent_uid\": 17,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scene_renderer_emitter\",\n                                        \"x\": 866,\n                                        \"y\": 16,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 11,\n                                        \"y\": 308,\n                                        \"uid\": 1,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"scene\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 11,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 759,\n                                        \"y\": 89,\n                                        \"uid\": 2,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"scale_matrix\",\n                                        \"x\": 639,\n                                        \"y\": 215,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 514,\n                                        \"y\": 216,\n                                        \"uid\": 8\n                                    },\n                                    {\n                                        \"plugin\": \"divide_modulator\",\n                                        \"x\": 405,\n                                        \"y\": 236,\n                                        \"uid\": 9\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 297,\n                                        \"y\": 206,\n                                        \"uid\": 10,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"mesh scale\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"max_modulator\",\n                                        \"x\": 320,\n                                        \"y\": 307,\n                                        \"uid\": 11\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 220,\n                                        \"y\": 355,\n                                        \"uid\": 12\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 221,\n                                        \"y\": 288,\n                                        \"uid\": 13\n                                    },\n                                    {\n                                        \"plugin\": \"scene_get_bounding_box\",\n                                        \"x\": 89,\n                                        \"y\": 307,\n                                        \"uid\": 14\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 646,\n                                        \"y\": 277,\n                                        \"uid\": 21,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"transform\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 674,\n                                        \"y\": 61,\n                                        \"uid\": 23,\n                                        \"dsid\": 10,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 746,\n                                        \"y\": 215,\n                                        \"uid\": 26\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 13,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 1,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 14,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"scene\",\n                                    \"dt\": 11,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"mesh scale\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"transform\",\n                                    \"dt\": 4,\n                                    \"uid\": 5,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": false\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 6,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": false\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"url_scene_generator\",\n                            \"x\": 511,\n                            \"y\": 89,\n                            \"uid\": 37,\n                            \"state\": {\n                                \"url\": \"/data/scene/ladybug/scene.json\"\n                            }\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 521,\n                            \"y\": 186,\n                            \"uid\": 38,\n                            \"state\": {\n                                \"val\": 1\n                            }\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 406,\n                            \"y\": 135,\n                            \"uid\": 39,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"camera\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 6,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 38,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 39,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"camera\",\n                        \"dt\": 6,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/3d_plain_scene_loader_with_camera_and_light_out.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 7,\n    \"root\": {\n        \"node_uid\": 7,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 368,\n                \"y\": 250,\n                \"uid\": 5,\n                \"dsid\": 2,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"69\": 0,\n                        \"70\": 1\n                    },\n                    \"output_sids\": {}\n                },\n                \"title\": \"Scene controls\",\n                \"graph\": {\n                    \"node_uid\": 72,\n                    \"uid\": 2,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 784,\n                            \"y\": 104,\n                            \"uid\": 0,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"1\": 0,\n                                    \"2\": 1,\n                                    \"10\": 2,\n                                    \"21\": 5,\n                                    \"23\": 6\n                                },\n                                \"output_sids\": {}\n                            },\n                            \"title\": \"Scene loader\",\n                            \"graph\": {\n                                \"node_uid\": 26,\n                                \"uid\": 3,\n                                \"parent_uid\": 2,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scene_renderer_emitter\",\n                                        \"x\": 849,\n                                        \"y\": 16,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 11,\n                                        \"y\": 308,\n                                        \"uid\": 1,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"scene\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 11,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 707,\n                                        \"y\": 122,\n                                        \"uid\": 2,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"scale_matrix\",\n                                        \"x\": 648,\n                                        \"y\": 205,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 514,\n                                        \"y\": 216,\n                                        \"uid\": 8\n                                    },\n                                    {\n                                        \"plugin\": \"divide_modulator\",\n                                        \"x\": 400,\n                                        \"y\": 235,\n                                        \"uid\": 9\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 280,\n                                        \"y\": 204,\n                                        \"uid\": 10,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"mesh scale\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"max_modulator\",\n                                        \"x\": 320,\n                                        \"y\": 307,\n                                        \"uid\": 11\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 220,\n                                        \"y\": 355,\n                                        \"uid\": 12\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 221,\n                                        \"y\": 288,\n                                        \"uid\": 13\n                                    },\n                                    {\n                                        \"plugin\": \"scene_get_bounding_box\",\n                                        \"x\": 89,\n                                        \"y\": 307,\n                                        \"uid\": 14\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 647,\n                                        \"y\": 265,\n                                        \"uid\": 21,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"transform\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 605,\n                                        \"y\": 72,\n                                        \"uid\": 23,\n                                        \"dsid\": 11,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 743,\n                                        \"y\": 204,\n                                        \"uid\": 25\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 13,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 1,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 14,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"scene\",\n                                    \"dt\": 11,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"mesh scale\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"transform\",\n                                    \"dt\": 4,\n                                    \"uid\": 5,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 6,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"url_scene_generator\",\n                            \"x\": 629,\n                            \"y\": 124,\n                            \"uid\": 1,\n                            \"state\": {\n                                \"url\": \"/data/scene/ladybug/scene.json\"\n                            }\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 186,\n                            \"y\": 34,\n                            \"uid\": 6,\n                            \"state\": {\n                                \"val\": 1.7,\n                                \"min\": 0,\n                                \"max\": 10\n                            },\n                            \"title\": \"Mesh scale\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 420,\n                            \"y\": 137,\n                            \"uid\": 19,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"13\": 5,\n                                    \"14\": 6,\n                                    \"15\": 7\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Translate\",\n                            \"graph\": {\n                                \"node_uid\": 17,\n                                \"uid\": 4,\n                                \"parent_uid\": 2,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 303,\n                                        \"y\": 53,\n                                        \"uid\": 2,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 92,\n                                        \"y\": 53,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 23,\n                                        \"y\": 11,\n                                        \"uid\": 13,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 23,\n                                        \"y\": 73,\n                                        \"uid\": 14,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 23,\n                                        \"y\": 135,\n                                        \"uid\": 15,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"translation_matrix\",\n                                        \"x\": 204,\n                                        \"y\": 53,\n                                        \"uid\": 16\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 186,\n                            \"y\": 113,\n                            \"uid\": 20,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -10,\n                                \"max\": 10\n                            },\n                            \"title\": \"x position\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 186,\n                            \"y\": 192,\n                            \"uid\": 21,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -10,\n                                \"max\": 10\n                            },\n                            \"title\": \"y position\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 186,\n                            \"y\": 271,\n                            \"uid\": 22,\n                            \"state\": {\n                                \"val\": -2.6,\n                                \"min\": -10,\n                                \"max\": 10\n                            },\n                            \"title\": \"z position\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 588,\n                            \"y\": 313,\n                            \"uid\": 47,\n                            \"dsid\": 20,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"15\": 3,\n                                    \"21\": 4,\n                                    \"22\": 5,\n                                    \"23\": 6,\n                                    \"24\": 7,\n                                    \"25\": 8,\n                                    \"34\": 10,\n                                    \"39\": 12,\n                                    \"40\": 13,\n                                    \"41\": 14,\n                                    \"44\": 16,\n                                    \"47\": 18,\n                                    \"49\": 19\n                                },\n                                \"output_sids\": {\n                                    \"9\": 0\n                                }\n                            },\n                            \"title\": \"Material chain\",\n                            \"graph\": {\n                                \"node_uid\": 51,\n                                \"uid\": 5,\n                                \"parent_uid\": 2,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"material_diffuse_color_modulator\",\n                                        \"x\": 1029,\n                                        \"y\": 68,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"material_alpha_clip_modulator\",\n                                        \"x\": 1137,\n                                        \"y\": 68,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 1025,\n                                        \"y\": 145,\n                                        \"uid\": 6,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Alpha clip\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_texture_modulator\",\n                                        \"x\": 1252,\n                                        \"y\": 68,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 1361,\n                                        \"y\": 68,\n                                        \"uid\": 9,\n                                        \"dsid\": 35,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_blend_mode_modulator\",\n                                        \"x\": 898,\n                                        \"y\": 69,\n                                        \"uid\": 10\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 1173,\n                                        \"y\": 143,\n                                        \"uid\": 15,\n                                        \"dsid\": 35,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Image\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 2,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 134,\n                                        \"uid\": 21,\n                                        \"dsid\": 29,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 798,\n                                        \"y\": 183,\n                                        \"uid\": 22,\n                                        \"dsid\": 29,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 231,\n                                        \"uid\": 23,\n                                        \"dsid\": 29,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 799,\n                                        \"y\": 279,\n                                        \"uid\": 24,\n                                        \"dsid\": 29,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"alpha\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 70,\n                                        \"uid\": 25,\n                                        \"dsid\": 29,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"blend mode\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 907,\n                                        \"y\": 147,\n                                        \"uid\": 26\n                                    },\n                                    {\n                                        \"plugin\": \"material_z_buffer_modulator\",\n                                        \"x\": 672,\n                                        \"y\": 65,\n                                        \"uid\": 27\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 564,\n                                        \"y\": 212,\n                                        \"uid\": 28,\n                                        \"state\": {\n                                            \"enabled\": true\n                                        },\n                                        \"title\": \"Z-buffer\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_shinyness_modulator\",\n                                        \"x\": 558,\n                                        \"y\": 64,\n                                        \"uid\": 31\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 454,\n                                        \"y\": 148,\n                                        \"uid\": 32,\n                                        \"dsid\": 3,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"input_sids\": {\n                                                \"9\": 0\n                                            },\n                                            \"output_sids\": {\n                                                \"12\": 2\n                                            }\n                                        },\n                                        \"title\": \"min max calc\",\n                                        \"graph\": {\n                                            \"node_uid\": 13,\n                                            \"uid\": 6,\n                                            \"parent_uid\": 5,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 27,\n                                                    \"y\": 190,\n                                                    \"uid\": 2,\n                                                    \"state\": {\n                                                        \"val\": 10\n                                                    },\n                                                    \"title\": \"Maximum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"subtract_modulator\",\n                                                    \"x\": 144,\n                                                    \"y\": 65,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"absolute_modulator\",\n                                                    \"x\": 232,\n                                                    \"y\": 65,\n                                                    \"uid\": 4\n                                                },\n                                                {\n                                                    \"plugin\": \"multiply_modulator\",\n                                                    \"x\": 319,\n                                                    \"y\": 45,\n                                                    \"uid\": 5\n                                                },\n                                                {\n                                                    \"plugin\": \"add_modulator\",\n                                                    \"x\": 401,\n                                                    \"y\": 122,\n                                                    \"uid\": 7\n                                                },\n                                                {\n                                                    \"plugin\": \"min_modulator\",\n                                                    \"x\": 143,\n                                                    \"y\": 142,\n                                                    \"uid\": 8\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 248,\n                                                    \"y\": 9,\n                                                    \"uid\": 9,\n                                                    \"dsid\": 27,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 10,\n                                                    \"y\": 85,\n                                                    \"uid\": 11,\n                                                    \"state\": {\n                                                        \"val\": 0\n                                                    },\n                                                    \"title\": \"Minimum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 486,\n                                                    \"y\": 122,\n                                                    \"uid\": 12,\n                                                    \"dsid\": 27,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 4,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 4,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 7,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 8,\n                                                    \"dst_nuid\": 7,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 9,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 7,\n                                                    \"dst_nuid\": 12,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 2,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 361,\n                                        \"y\": 242,\n                                        \"uid\": 34,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"shinyness\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_double_sided_modulator\",\n                                        \"x\": 437,\n                                        \"y\": 61,\n                                        \"uid\": 35\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 323,\n                                        \"y\": 161,\n                                        \"uid\": 36,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Double-sided\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_ambient_color_modulator\",\n                                        \"x\": 290,\n                                        \"y\": 73,\n                                        \"uid\": 37\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 63,\n                                        \"y\": 153,\n                                        \"uid\": 39,\n                                        \"dsid\": 30,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 60,\n                                        \"y\": 202,\n                                        \"uid\": 40,\n                                        \"dsid\": 30,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 63,\n                                        \"y\": 250,\n                                        \"uid\": 41,\n                                        \"dsid\": 30,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 170,\n                                        \"y\": 166,\n                                        \"uid\": 43\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 61,\n                                        \"y\": 99,\n                                        \"uid\": 44,\n                                        \"dsid\": 19,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 40,\n                                        \"y\": 52,\n                                        \"uid\": 47,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 13,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_light_modulator\",\n                                        \"x\": 158,\n                                        \"y\": 22,\n                                        \"uid\": 48\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 54,\n                                        \"y\": 0,\n                                        \"uid\": 49,\n                                        \"dsid\": 11,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light index\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 574,\n                                        \"y\": 276,\n                                        \"uid\": 50,\n                                        \"state\": {\n                                            \"enabled\": true\n                                        },\n                                        \"title\": \"Depth write\"\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 27,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 28,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 31,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 32,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 34,\n                                        \"dst_nuid\": 32,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 35,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 36,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 37,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 39,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 40,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 41,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 43,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 47,\n                                        \"dst_nuid\": 48,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 44,\n                                        \"dst_nuid\": 48,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 48,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 49,\n                                        \"dst_nuid\": 48,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 50,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"Image\",\n                                    \"dt\": 2,\n                                    \"uid\": 3,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"alpha\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"blend mode\",\n                                    \"dt\": 0,\n                                    \"uid\": 8,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"shinyness\",\n                                    \"dt\": 0,\n                                    \"uid\": 10,\n                                    \"index\": 6,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 12,\n                                    \"index\": 7,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 13,\n                                    \"index\": 8,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 14,\n                                    \"index\": 9,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 16,\n                                    \"index\": 10,\n                                    \"type\": 0,\n                                    \"is_connected\": false\n                                },\n                                {\n                                    \"name\": \"light\",\n                                    \"dt\": 13,\n                                    \"uid\": 18,\n                                    \"index\": 11,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"light index\",\n                                    \"dt\": 0,\n                                    \"uid\": 19,\n                                    \"index\": 12,\n                                    \"type\": 0\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 233,\n                            \"y\": 365,\n                            \"uid\": 49,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 305,\n                            \"y\": 367,\n                            \"uid\": 50,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Saturation\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 384,\n                            \"y\": 367,\n                            \"uid\": 51,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Luminosity\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 465,\n                            \"y\": 367,\n                            \"uid\": 52,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Alpha\"\n                        },\n                        {\n                            \"plugin\": \"blend_mode_generator\",\n                            \"x\": 129,\n                            \"y\": 432,\n                            \"uid\": 53,\n                            \"state\": {\n                                \"mode\": 4\n                            }\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 129,\n                            \"y\": 488,\n                            \"uid\": 54,\n                            \"state\": {\n                                \"val\": 0.10000000000000003\n                            },\n                            \"title\": \"Shinyness\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 274,\n                            \"y\": 432,\n                            \"uid\": 55,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Ambient Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 366,\n                            \"y\": 432,\n                            \"uid\": 56,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Ambient Sat\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 454,\n                            \"y\": 432,\n                            \"uid\": 57,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Ambient Lum\"\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 505,\n                            \"y\": 553,\n                            \"uid\": 69,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 13,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 681,\n                            \"y\": 36,\n                            \"uid\": 70,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"camera\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 6,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"url_texture_generator\",\n                            \"x\": 113,\n                            \"y\": 365,\n                            \"uid\": 71,\n                            \"state\": {\n                                \"url\": \"\"\n                            }\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 20,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 49,\n                            \"dst_nuid\": 47,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 50,\n                            \"dst_nuid\": 47,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 51,\n                            \"dst_nuid\": 47,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 52,\n                            \"dst_nuid\": 47,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 53,\n                            \"dst_nuid\": 47,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 54,\n                            \"dst_nuid\": 47,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 6,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 57,\n                            \"dst_nuid\": 47,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 9,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 56,\n                            \"dst_nuid\": 47,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 8,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 55,\n                            \"dst_nuid\": 47,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 7,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 47,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 69,\n                            \"dst_nuid\": 47,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 11,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 70,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 71,\n                            \"dst_nuid\": 47,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"light\",\n                        \"dt\": 13,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": false\n                    },\n                    {\n                        \"name\": \"camera\",\n                        \"dt\": 6,\n                        \"uid\": 1,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"register_global_read\",\n                \"x\": 273,\n                \"y\": 310,\n                \"uid\": 6,\n                \"dsid\": 1,\n                \"state\": {\n                    \"slot_id\": 0\n                },\n                \"title\": \"camera\",\n                \"dyn_out\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 6,\n                        \"desc\": \"\",\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 6,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            }\n        ]\n    },\n    \"registers\": [\n        {\n            \"id\": \"camera\",\n            \"dt\": 6\n        }\n    ]\n}"
  },
  {
    "path": "browser/patches/3d_scene_loader_with_camera_and_transforms.json",
    "content": "{\n    \"abs_t\": 26.752,\n    \"active_graph\": 1,\n    \"graph_uid\": 5,\n    \"root\": {\n        \"node_uid\": 1,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 376,\n                \"y\": 455,\n                \"uid\": 0,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {},\n                    \"output_sids\": {}\n                },\n                \"title\": \"Scene controls\",\n                \"graph\": {\n                    \"node_uid\": 23,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 643,\n                            \"y\": 86,\n                            \"uid\": 0,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"1\": 0,\n                                    \"2\": 1,\n                                    \"10\": 2,\n                                    \"21\": 5,\n                                    \"23\": 6\n                                },\n                                \"output_sids\": {}\n                            },\n                            \"title\": \"Scene loader\",\n                            \"graph\": {\n                                \"node_uid\": 26,\n                                \"uid\": 2,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scene_renderer_emitter\",\n                                        \"x\": 868,\n                                        \"y\": 16,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 11,\n                                        \"y\": 308,\n                                        \"uid\": 1,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"scene\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 11,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 765,\n                                        \"y\": 90,\n                                        \"uid\": 2,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"scale_matrix\",\n                                        \"x\": 648,\n                                        \"y\": 205,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 514,\n                                        \"y\": 216,\n                                        \"uid\": 8\n                                    },\n                                    {\n                                        \"plugin\": \"divide_modulator\",\n                                        \"x\": 400,\n                                        \"y\": 235,\n                                        \"uid\": 9\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 280,\n                                        \"y\": 204,\n                                        \"uid\": 10,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"mesh scale\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"max_modulator\",\n                                        \"x\": 320,\n                                        \"y\": 307,\n                                        \"uid\": 11\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 220,\n                                        \"y\": 355,\n                                        \"uid\": 12\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 221,\n                                        \"y\": 288,\n                                        \"uid\": 13\n                                    },\n                                    {\n                                        \"plugin\": \"scene_get_bounding_box\",\n                                        \"x\": 89,\n                                        \"y\": 307,\n                                        \"uid\": 14\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 647,\n                                        \"y\": 265,\n                                        \"uid\": 21,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"transform\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 666,\n                                        \"y\": 76,\n                                        \"uid\": 23,\n                                        \"dsid\": 4,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 764,\n                                        \"y\": 205,\n                                        \"uid\": 25\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 13,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 1,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 14,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"scene\",\n                                    \"dt\": 11,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"mesh scale\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"transform\",\n                                    \"dt\": 4,\n                                    \"uid\": 5,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 6,\n                                    \"index\": 4,\n                                    \"type\": 0\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"url_scene_generator\",\n                            \"x\": 429,\n                            \"y\": 105,\n                            \"uid\": 1,\n                            \"state\": {\n                                \"url\": \"/data/scene/ladybug/scene.json\"\n                            }\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 444,\n                            \"y\": 219,\n                            \"uid\": 2,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"0\": 0,\n                                    \"1\": 1,\n                                    \"2\": 2\n                                },\n                                \"output_sids\": {\n                                    \"3\": 3\n                                }\n                            },\n                            \"title\": \"Camera\",\n                            \"graph\": {\n                                \"node_uid\": 17,\n                                \"uid\": 3,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 133,\n                                        \"y\": 210,\n                                        \"uid\": 0,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"rotation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 123,\n                                        \"y\": 122,\n                                        \"uid\": 1,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"elevation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 15,\n                                        \"y\": 44,\n                                        \"uid\": 2,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"dolly\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 566,\n                                        \"y\": 100,\n                                        \"uid\": 3,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"perspective_camera\",\n                                        \"x\": 448,\n                                        \"y\": 100,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 214,\n                                        \"y\": 52,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"rotation_xyz_matrix\",\n                                        \"x\": 218,\n                                        \"y\": 170,\n                                        \"uid\": 6\n                                    },\n                                    {\n                                        \"plugin\": \"vector_transform\",\n                                        \"x\": 340,\n                                        \"y\": 100,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"negate_modulator\",\n                                        \"x\": 107,\n                                        \"y\": 55,\n                                        \"uid\": 16\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"rotation\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"elevation\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"dolly\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 3,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 24,\n                            \"y\": 104,\n                            \"uid\": 3,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -180,\n                                \"max\": 180\n                            },\n                            \"title\": \"Camera Rotation\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 24,\n                            \"y\": 191,\n                            \"uid\": 4,\n                            \"state\": {\n                                \"val\": 1.2,\n                                \"min\": -20,\n                                \"max\": 20\n                            },\n                            \"title\": \"Camera Elevation\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 24,\n                            \"y\": 279,\n                            \"uid\": 5,\n                            \"state\": {\n                                \"val\": 5.1,\n                                \"min\": 0,\n                                \"max\": 10\n                            },\n                            \"title\": \"Camera Dolly\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 429,\n                            \"y\": 16,\n                            \"uid\": 6,\n                            \"state\": {\n                                \"val\": 3.5,\n                                \"min\": 0,\n                                \"max\": 10\n                            },\n                            \"title\": \"Mesh scale\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 466,\n                            \"y\": 344,\n                            \"uid\": 19,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"13\": 5,\n                                    \"14\": 6,\n                                    \"15\": 7\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Translate\",\n                            \"graph\": {\n                                \"node_uid\": 17,\n                                \"uid\": 4,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 303,\n                                        \"y\": 53,\n                                        \"uid\": 2,\n                                        \"dsid\": 9,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 92,\n                                        \"y\": 53,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 23,\n                                        \"y\": 11,\n                                        \"uid\": 13,\n                                        \"dsid\": 9,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 23,\n                                        \"y\": 73,\n                                        \"uid\": 14,\n                                        \"dsid\": 9,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 23,\n                                        \"y\": 135,\n                                        \"uid\": 15,\n                                        \"dsid\": 9,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"translation_matrix\",\n                                        \"x\": 204,\n                                        \"y\": 53,\n                                        \"uid\": 16\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 222,\n                            \"y\": 104,\n                            \"uid\": 20,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -10,\n                                \"max\": 10\n                            },\n                            \"title\": \"x position\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 222,\n                            \"y\": 191,\n                            \"uid\": 21,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -10,\n                                \"max\": 10\n                            },\n                            \"title\": \"y position\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 222,\n                            \"y\": 280,\n                            \"uid\": 22,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": \"-10\",\n                                \"max\": \"10\"\n                            },\n                            \"title\": \"z position\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 20,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                }\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/3d_scene_loader_with_mousecontrol.json",
    "content": "{\n    \"abs_t\": 41.681,\n    \"active_graph\": 3,\n    \"graph_uid\": 8,\n    \"root\": {\n        \"node_uid\": 2,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 380,\n                \"y\": 374,\n                \"uid\": 1,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {},\n                    \"output_sids\": {}\n                },\n                \"title\": \"Scene\",\n                \"graph\": {\n                    \"node_uid\": 29,\n                    \"uid\": 3,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 879,\n                            \"y\": 14,\n                            \"uid\": 0,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"58\": 0,\n                                    \"59\": 1,\n                                    \"61\": 2,\n                                    \"62\": 3,\n                                    \"63\": 4,\n                                    \"64\": 5,\n                                    \"75\": 6\n                                },\n                                \"output_sids\": {}\n                            },\n                            \"title\": \"Scene Loader\",\n                            \"graph\": {\n                                \"node_uid\": 77,\n                                \"uid\": 4,\n                                \"parent_uid\": 3,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scene_renderer_emitter\",\n                                        \"x\": 1866,\n                                        \"y\": 3,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"perspective_camera\",\n                                        \"x\": 1726,\n                                        \"y\": 157,\n                                        \"uid\": 2\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 1512,\n                                        \"y\": 171,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"vector_transform\",\n                                        \"x\": 1629,\n                                        \"y\": 217,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"rotation_xyz_matrix\",\n                                        \"x\": 1315,\n                                        \"y\": 414,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"mouse_position_generator\",\n                                        \"x\": 13,\n                                        \"y\": 558,\n                                        \"uid\": 10\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 1038,\n                                        \"y\": 453,\n                                        \"uid\": 11\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 944,\n                                        \"y\": 539,\n                                        \"uid\": 12,\n                                        \"state\": {\n                                            \"val\": -360\n                                        },\n                                        \"title\": \"Rotation range\"\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 859,\n                                        \"y\": 881,\n                                        \"uid\": 13\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 737,\n                                        \"y\": 929,\n                                        \"uid\": 14,\n                                        \"state\": {\n                                            \"val\": -10\n                                        },\n                                        \"title\": \"Elev. sensitivity\"\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 659,\n                                        \"y\": 841,\n                                        \"uid\": 18\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 527,\n                                        \"y\": 928,\n                                        \"uid\": 19,\n                                        \"state\": {\n                                            \"val\": 0.5\n                                        },\n                                        \"title\": \"Elevation bias\"\n                                    },\n                                    {\n                                        \"plugin\": \"mouse_button_generator\",\n                                        \"x\": 235,\n                                        \"y\": 669,\n                                        \"uid\": 20\n                                    },\n                                    {\n                                        \"plugin\": \"sample_and_hold_modulator\",\n                                        \"x\": 515,\n                                        \"y\": 841,\n                                        \"uid\": 22,\n                                        \"state\": {\n                                            \"value\": 0.48518518518518516\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"sample_and_hold_modulator\",\n                                        \"x\": 526,\n                                        \"y\": 538,\n                                        \"uid\": 23,\n                                        \"state\": {\n                                            \"value\": 0.46458333333333335\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"clock_generator\",\n                                        \"x\": 13,\n                                        \"y\": 390,\n                                        \"uid\": 24\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 119,\n                                        \"y\": 335,\n                                        \"uid\": 25\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 13,\n                                        \"y\": 321,\n                                        \"uid\": 26,\n                                        \"state\": {\n                                            \"val\": 0\n                                        },\n                                        \"title\": \"Zero\"\n                                    },\n                                    {\n                                        \"plugin\": \"add_modulator\",\n                                        \"x\": 660,\n                                        \"y\": 473,\n                                        \"uid\": 27\n                                    },\n                                    {\n                                        \"plugin\": \"lowpass_filter_modulator\",\n                                        \"x\": 1142,\n                                        \"y\": 489,\n                                        \"uid\": 28\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 731,\n                                        \"y\": 536,\n                                        \"uid\": 29,\n                                        \"state\": {\n                                            \"val\": 0.95\n                                        },\n                                        \"title\": \"LP filt. amt.\"\n                                    },\n                                    {\n                                        \"plugin\": \"annotation\",\n                                        \"x\": 505,\n                                        \"y\": 293,\n                                        \"uid\": 30,\n                                        \"state\": {\n                                            \"text\": \"Because the sample & hold plugin doesn't emit values more then once after it stops sampling, and since the lowpass filter would stall without continous input, we add a clock-driven, zeroed out float value to the output to 'drive' the lowpass filter, so that the kinetic rotation continues even when mouse input is blocked.\",\n                                            \"width\": 231,\n                                            \"height\": 120\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"mouse_wheel_generator\",\n                                        \"x\": 823,\n                                        \"y\": 88,\n                                        \"uid\": 31\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 976,\n                                        \"y\": 88,\n                                        \"uid\": 33\n                                    },\n                                    {\n                                        \"plugin\": \"clamped_accumulate_modulator\",\n                                        \"x\": 1111,\n                                        \"y\": 135,\n                                        \"uid\": 34,\n                                        \"state\": {\n                                            \"value\": 1\n                                        },\n                                        \"title\": \"Clamped acc.\"\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 993,\n                                        \"y\": 265,\n                                        \"uid\": 35,\n                                        \"state\": {\n                                            \"val\": 20\n                                        },\n                                        \"title\": \"Max. dolly\"\n                                    },\n                                    {\n                                        \"plugin\": \"lowpass_filter_modulator\",\n                                        \"x\": 1317,\n                                        \"y\": 272,\n                                        \"uid\": 36\n                                    },\n                                    {\n                                        \"plugin\": \"add_modulator\",\n                                        \"x\": 1232,\n                                        \"y\": 207,\n                                        \"uid\": 37\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 982,\n                                        \"y\": 201,\n                                        \"uid\": 38,\n                                        \"state\": {\n                                            \"val\": 1\n                                        },\n                                        \"title\": \"Min. dolly\"\n                                    },\n                                    {\n                                        \"plugin\": \"scale_matrix\",\n                                        \"x\": 1247,\n                                        \"y\": 840,\n                                        \"uid\": 39\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 1106,\n                                        \"y\": 1012,\n                                        \"uid\": 40\n                                    },\n                                    {\n                                        \"plugin\": \"scene_get_bounding_box\",\n                                        \"x\": 572,\n                                        \"y\": 1080,\n                                        \"uid\": 41\n                                    },\n                                    {\n                                        \"plugin\": \"max_modulator\",\n                                        \"x\": 799,\n                                        \"y\": 1082,\n                                        \"uid\": 42\n                                    },\n                                    {\n                                        \"plugin\": \"divide_modulator\",\n                                        \"x\": 1008,\n                                        \"y\": 1084,\n                                        \"uid\": 43\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 701,\n                                        \"y\": 1061,\n                                        \"uid\": 45\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 700,\n                                        \"y\": 1131,\n                                        \"uid\": 46\n                                    },\n                                    {\n                                        \"plugin\": \"annotation\",\n                                        \"x\": 1107,\n                                        \"y\": 1106,\n                                        \"uid\": 47,\n                                        \"state\": {\n                                            \"text\": \"Scale the scene such that the most distant vertex in local space is 'Mesh scale' units away from the world origin.\",\n                                            \"width\": 162,\n                                            \"height\": 61\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"annotation\",\n                                        \"x\": 530,\n                                        \"y\": 87,\n                                        \"uid\": 48,\n                                        \"state\": {\n                                            \"text\": \"Mouse z movement rotates the current scene and mouse y controls elevation. Mouse control can be en- or disabled by clicking the webgl canvas, so the camera can be frozen, while playing with the settings.\",\n                                            \"width\": 260,\n                                            \"height\": 63\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"annotation\",\n                                        \"x\": 516,\n                                        \"y\": 684,\n                                        \"uid\": 49,\n                                        \"state\": {\n                                            \"text\": \"Use sample and hold to either pass through the mouse coordinates or freeze the flow depending on the state of the toggle driven by left mouse click.\\n\\nUse clock driven lowpass (via the add) to give kinetic scrolling, even after the toggle has disabled.\",\n                                            \"width\": 217,\n                                            \"height\": 110\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"annotation\",\n                                        \"x\": 1234,\n                                        \"y\": 113,\n                                        \"uid\": 50,\n                                        \"state\": {\n                                            \"text\": \"This add is here to make this lowpass filter clock driven as well.\",\n                                            \"width\": 156,\n                                            \"height\": 37\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 1622,\n                                        \"y\": 726,\n                                        \"uid\": 51\n                                    },\n                                    {\n                                        \"plugin\": \"translation_matrix\",\n                                        \"x\": 1493,\n                                        \"y\": 947,\n                                        \"uid\": 52\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 1352,\n                                        \"y\": 946,\n                                        \"uid\": 53\n                                    },\n                                    {\n                                        \"plugin\": \"negate_modulator\",\n                                        \"x\": 743,\n                                        \"y\": 841,\n                                        \"uid\": 56\n                                    },\n                                    {\n                                        \"plugin\": \"annotation\",\n                                        \"x\": 854,\n                                        \"y\": 334,\n                                        \"uid\": 57,\n                                        \"state\": {\n                                            \"text\": \"Use the delta of the x mouse movement and accumulate it. By hooking the delta plugins reset slot up to the toggle trigger, we can avoid an unpleasant jump when the user reactivates rotation by clicking the canvas (for comparison, the elevation does jump).\",\n                                            \"width\": 294,\n                                            \"height\": 72\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 900,\n                                        \"y\": 1084,\n                                        \"uid\": 58,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Mesh Scale\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 1252,\n                                        \"y\": 906,\n                                        \"uid\": 59,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"X\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 1252,\n                                        \"y\": 966,\n                                        \"uid\": 61,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 1253,\n                                        \"y\": 1027,\n                                        \"uid\": 62,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 301,\n                                        \"y\": 100,\n                                        \"uid\": 63,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Scene\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 11,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 823,\n                                        \"y\": 143,\n                                        \"uid\": 64,\n                                        \"dsid\": 19,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Mouse sensitivity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 1604,\n                                        \"y\": 416,\n                                        \"uid\": 65\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 1473,\n                                        \"y\": 456,\n                                        \"uid\": 66,\n                                        \"state\": {\n                                            \"val\": 0\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 1477,\n                                        \"y\": 393,\n                                        \"uid\": 67,\n                                        \"state\": {\n                                            \"val\": 0.1\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 1486,\n                                        \"y\": 520,\n                                        \"uid\": 70,\n                                        \"state\": {\n                                            \"val\": 0.5\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"add_modulator\",\n                                        \"x\": 947,\n                                        \"y\": 454,\n                                        \"uid\": 71\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 795,\n                                        \"y\": 604,\n                                        \"uid\": 72,\n                                        \"state\": {\n                                            \"val\": 0.5\n                                        },\n                                        \"title\": \"Offset\"\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 1437,\n                                        \"y\": 115,\n                                        \"uid\": 75,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"negate_modulator\",\n                                        \"x\": 1418,\n                                        \"y\": 208,\n                                        \"uid\": 76\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 51,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 22,\n                                        \"src_slot\": 1,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 23,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 28,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 13,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 56,\n                                        \"dst_nuid\": 13,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 19,\n                                        \"dst_nuid\": 18,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 18,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 18,\n                                        \"dst_nuid\": 56,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 29,\n                                        \"dst_nuid\": 28,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 29,\n                                        \"dst_nuid\": 36,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 31,\n                                        \"dst_nuid\": 33,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 33,\n                                        \"dst_nuid\": 34,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 35,\n                                        \"dst_nuid\": 34,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 38,\n                                        \"dst_nuid\": 34,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 34,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 37,\n                                        \"dst_nuid\": 36,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 40,\n                                        \"dst_nuid\": 39,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 43,\n                                        \"dst_nuid\": 40,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 43,\n                                        \"dst_nuid\": 40,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 43,\n                                        \"dst_nuid\": 40,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 41,\n                                        \"dst_nuid\": 45,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 41,\n                                        \"dst_nuid\": 46,\n                                        \"src_slot\": 1,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 45,\n                                        \"dst_nuid\": 42,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 46,\n                                        \"dst_nuid\": 42,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 42,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 53,\n                                        \"dst_nuid\": 52,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 58,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 59,\n                                        \"dst_nuid\": 53,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 61,\n                                        \"dst_nuid\": 53,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 62,\n                                        \"dst_nuid\": 53,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 63,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 63,\n                                        \"dst_nuid\": 41,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 64,\n                                        \"dst_nuid\": 33,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 52,\n                                        \"dst_nuid\": 51,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 65,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 4\n                                    },\n                                    {\n                                        \"src_nuid\": 66,\n                                        \"dst_nuid\": 65,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 66,\n                                        \"dst_nuid\": 65,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 67,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 70,\n                                        \"dst_nuid\": 65,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 27,\n                                        \"dst_nuid\": 71,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 71,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 72,\n                                        \"dst_nuid\": 71,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 20,\n                                        \"dst_nuid\": 23,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 20,\n                                        \"dst_nuid\": 22,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 75,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 36,\n                                        \"dst_nuid\": 76,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 76,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 28,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 39,\n                                        \"dst_nuid\": 51,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"Mesh Scale\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"X\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Y\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Z\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Scene\",\n                                    \"dt\": 11,\n                                    \"uid\": 4,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Mouse sensitivity\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 6,\n                                    \"index\": 6,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 18,\n                            \"y\": 96,\n                            \"uid\": 1,\n                            \"state\": {\n                                \"val\": 1,\n                                \"min\": 1,\n                                \"max\": 10\n                            },\n                            \"title\": \"Mesh scale\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 416,\n                            \"y\": 10,\n                            \"uid\": 2,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -10,\n                                \"max\": 10\n                            },\n                            \"title\": \"Mesh X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 415,\n                            \"y\": 79,\n                            \"uid\": 3,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -10,\n                                \"max\": 10\n                            },\n                            \"title\": \"Mesh Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 417,\n                            \"y\": 149,\n                            \"uid\": 4,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -10,\n                                \"max\": 10\n                            },\n                            \"title\": \"Mesh Z\"\n                        },\n                        {\n                            \"plugin\": \"url_scene_generator\",\n                            \"x\": 737,\n                            \"y\": 14,\n                            \"uid\": 5,\n                            \"state\": {\n                                \"url\": \"/data/scene/ladybug/scene.json\"\n                            },\n                            \"title\": \"Load Scene\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 210,\n                            \"y\": 7,\n                            \"uid\": 6,\n                            \"state\": {\n                                \"val\": 0.9,\n                                \"min\": 0,\n                                \"max\": 1\n                            },\n                            \"title\": \"Mouse sensitivity\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 680,\n                            \"y\": 227,\n                            \"uid\": 19,\n                            \"dsid\": 18,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"21\": 4,\n                                    \"22\": 5,\n                                    \"23\": 6,\n                                    \"24\": 7,\n                                    \"25\": 8,\n                                    \"34\": 10,\n                                    \"39\": 12,\n                                    \"40\": 13,\n                                    \"41\": 14,\n                                    \"44\": 16\n                                },\n                                \"output_sids\": {\n                                    \"9\": 0\n                                }\n                            },\n                            \"title\": \"Material chain\",\n                            \"graph\": {\n                                \"node_uid\": 47,\n                                \"uid\": 6,\n                                \"parent_uid\": 3,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"material_diffuse_color_modulator\",\n                                        \"x\": 1029,\n                                        \"y\": 68,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"material_alpha_clip_modulator\",\n                                        \"x\": 1137,\n                                        \"y\": 68,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 1025,\n                                        \"y\": 145,\n                                        \"uid\": 6,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Alpha clip\"\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 1250,\n                                        \"y\": 71,\n                                        \"uid\": 9,\n                                        \"dsid\": 28,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_blend_mode_modulator\",\n                                        \"x\": 898,\n                                        \"y\": 69,\n                                        \"uid\": 10\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 134,\n                                        \"uid\": 21,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 798,\n                                        \"y\": 183,\n                                        \"uid\": 22,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 231,\n                                        \"uid\": 23,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 799,\n                                        \"y\": 279,\n                                        \"uid\": 24,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"alpha\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 70,\n                                        \"uid\": 25,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"blend mode\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 907,\n                                        \"y\": 147,\n                                        \"uid\": 26\n                                    },\n                                    {\n                                        \"plugin\": \"material_z_buffer_modulator\",\n                                        \"x\": 672,\n                                        \"y\": 65,\n                                        \"uid\": 27\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 574,\n                                        \"y\": 162,\n                                        \"uid\": 28,\n                                        \"state\": {\n                                            \"enabled\": true\n                                        },\n                                        \"title\": \"Z-buffer\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_shinyness_modulator\",\n                                        \"x\": 558,\n                                        \"y\": 64,\n                                        \"uid\": 31\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 470,\n                                        \"y\": 149,\n                                        \"uid\": 32,\n                                        \"dsid\": 3,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"9\": 0\n                                            },\n                                            \"output_sids\": {\n                                                \"12\": 2\n                                            }\n                                        },\n                                        \"title\": \"min max calc\",\n                                        \"graph\": {\n                                            \"node_uid\": 13,\n                                            \"uid\": 7,\n                                            \"parent_uid\": 6,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 27,\n                                                    \"y\": 190,\n                                                    \"uid\": 2,\n                                                    \"state\": {\n                                                        \"val\": 10\n                                                    },\n                                                    \"title\": \"Maximum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"subtract_modulator\",\n                                                    \"x\": 144,\n                                                    \"y\": 65,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"absolute_modulator\",\n                                                    \"x\": 232,\n                                                    \"y\": 65,\n                                                    \"uid\": 4\n                                                },\n                                                {\n                                                    \"plugin\": \"multiply_modulator\",\n                                                    \"x\": 319,\n                                                    \"y\": 45,\n                                                    \"uid\": 5\n                                                },\n                                                {\n                                                    \"plugin\": \"add_modulator\",\n                                                    \"x\": 401,\n                                                    \"y\": 122,\n                                                    \"uid\": 7\n                                                },\n                                                {\n                                                    \"plugin\": \"min_modulator\",\n                                                    \"x\": 143,\n                                                    \"y\": 142,\n                                                    \"uid\": 8\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 248,\n                                                    \"y\": 9,\n                                                    \"uid\": 9,\n                                                    \"dsid\": 20,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 10,\n                                                    \"y\": 85,\n                                                    \"uid\": 11,\n                                                    \"state\": {\n                                                        \"val\": 0\n                                                    },\n                                                    \"title\": \"Minimum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 486,\n                                                    \"y\": 122,\n                                                    \"uid\": 12,\n                                                    \"dsid\": 20,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 4,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 4,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 7,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 8,\n                                                    \"dst_nuid\": 7,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 9,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 7,\n                                                    \"dst_nuid\": 12,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 2,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 426,\n                                        \"y\": 241,\n                                        \"uid\": 34,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"shinyness\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_double_sided_modulator\",\n                                        \"x\": 437,\n                                        \"y\": 61,\n                                        \"uid\": 35\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 362,\n                                        \"y\": 146,\n                                        \"uid\": 36,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Double-sided\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_ambient_color_modulator\",\n                                        \"x\": 290,\n                                        \"y\": 73,\n                                        \"uid\": 37\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 63,\n                                        \"y\": 153,\n                                        \"uid\": 39,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 60,\n                                        \"y\": 202,\n                                        \"uid\": 40,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 63,\n                                        \"y\": 250,\n                                        \"uid\": 41,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 170,\n                                        \"y\": 166,\n                                        \"uid\": 43\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 58,\n                                        \"y\": 70,\n                                        \"uid\": 44,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 27,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 28,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 31,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 32,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 34,\n                                        \"dst_nuid\": 32,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 35,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 36,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 37,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 39,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 40,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 41,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 43,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 44,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"alpha\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"blend mode\",\n                                    \"dt\": 0,\n                                    \"uid\": 8,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"shinyness\",\n                                    \"dt\": 0,\n                                    \"uid\": 10,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 12,\n                                    \"index\": 6,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 13,\n                                    \"index\": 7,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 14,\n                                    \"index\": 8,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 16,\n                                    \"index\": 9,\n                                    \"type\": 0,\n                                    \"is_connected\": false\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 301,\n                            \"y\": 238,\n                            \"uid\": 20,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 374,\n                            \"y\": 238,\n                            \"uid\": 21,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Saturation\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 453,\n                            \"y\": 238,\n                            \"uid\": 22,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Luminosity\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 534,\n                            \"y\": 238,\n                            \"uid\": 23,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Alpha\"\n                        },\n                        {\n                            \"plugin\": \"blend_mode_generator\",\n                            \"x\": 455,\n                            \"y\": 304,\n                            \"uid\": 24,\n                            \"state\": {\n                                \"mode\": 4\n                            }\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 374,\n                            \"y\": 304,\n                            \"uid\": 25,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Shinyness\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 333,\n                            \"y\": 376,\n                            \"uid\": 26,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Ambient Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 425,\n                            \"y\": 376,\n                            \"uid\": 27,\n                            \"state\": {\n                                \"val\": 0.9600000000000004\n                            },\n                            \"title\": \"Ambient Sat\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 513,\n                            \"y\": 376,\n                            \"uid\": 28,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Ambient Lum\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 20,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 28,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 8,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 27,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 7,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 26,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 6,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 6,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                }\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/3d_scene_material_light_transforms.json",
    "content": "{\n    \"abs_t\": 27.443,\n    \"active_graph\": 0,\n    \"graph_uid\": 13,\n    \"root\": {\n        \"node_uid\": 7,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 795,\n                \"y\": 390,\n                \"uid\": 6,\n                \"dsid\": 1,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {\n                        \"104\": 0\n                    },\n                    \"output_sids\": {}\n                },\n                \"title\": \"Scene 1\",\n                \"graph\": {\n                    \"node_uid\": 105,\n                    \"uid\": 4,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 1459,\n                            \"y\": 113,\n                            \"uid\": 0,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"1\": 0,\n                                    \"2\": 1,\n                                    \"10\": 2,\n                                    \"21\": 5,\n                                    \"23\": 6\n                                },\n                                \"output_sids\": {}\n                            },\n                            \"title\": \"Scene loader\",\n                            \"graph\": {\n                                \"node_uid\": 26,\n                                \"uid\": 5,\n                                \"parent_uid\": 4,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scene_renderer_emitter\",\n                                        \"x\": 868,\n                                        \"y\": 16,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 11,\n                                        \"y\": 308,\n                                        \"uid\": 1,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"scene\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 11,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 788,\n                                        \"y\": 63,\n                                        \"uid\": 2,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"scale_matrix\",\n                                        \"x\": 648,\n                                        \"y\": 205,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 514,\n                                        \"y\": 216,\n                                        \"uid\": 8\n                                    },\n                                    {\n                                        \"plugin\": \"divide_modulator\",\n                                        \"x\": 400,\n                                        \"y\": 235,\n                                        \"uid\": 9\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 280,\n                                        \"y\": 204,\n                                        \"uid\": 10,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"mesh scale\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"max_modulator\",\n                                        \"x\": 320,\n                                        \"y\": 307,\n                                        \"uid\": 11\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 220,\n                                        \"y\": 355,\n                                        \"uid\": 12\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 221,\n                                        \"y\": 288,\n                                        \"uid\": 13\n                                    },\n                                    {\n                                        \"plugin\": \"scene_get_bounding_box\",\n                                        \"x\": 89,\n                                        \"y\": 307,\n                                        \"uid\": 14\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 647,\n                                        \"y\": 265,\n                                        \"uid\": 21,\n                                        \"dsid\": 20,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"transform\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 569,\n                                        \"y\": 434,\n                                        \"uid\": 23,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 763,\n                                        \"y\": 184,\n                                        \"uid\": 25\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 13,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 1,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 14,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"scene\",\n                                    \"dt\": 11,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"mesh scale\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"transform\",\n                                    \"dt\": 4,\n                                    \"uid\": 5,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 6,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"url_scene_generator\",\n                            \"x\": 198,\n                            \"y\": 50,\n                            \"uid\": 1,\n                            \"state\": {\n                                \"url\": \"/data/scene/ladybug/scene.json\"\n                            }\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 328,\n                            \"y\": 30,\n                            \"uid\": 6,\n                            \"state\": {\n                                \"val\": 1.6666666666666665,\n                                \"min\": 0,\n                                \"max\": 10\n                            },\n                            \"title\": \"Mesh scale\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 463,\n                            \"y\": 570,\n                            \"uid\": 69,\n                            \"open\": false,\n                            \"dsid\": 14,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"13\": 1,\n                                    \"14\": 2,\n                                    \"15\": 3,\n                                    \"16\": 4,\n                                    \"17\": 5,\n                                    \"18\": 6,\n                                    \"19\": 7,\n                                    \"22\": 8,\n                                    \"23\": 9,\n                                    \"24\": 10,\n                                    \"26\": 11,\n                                    \"28\": 13\n                                },\n                                \"output_sids\": {\n                                    \"27\": 12\n                                }\n                            },\n                            \"title\": \"Light chain\",\n                            \"graph\": {\n                                \"node_uid\": 29,\n                                \"uid\": 6,\n                                \"parent_uid\": 4,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"light_type_modulator\",\n                                        \"x\": 692,\n                                        \"y\": 216,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"light_position_modulator\",\n                                        \"x\": 604,\n                                        \"y\": 215,\n                                        \"uid\": 2\n                                    },\n                                    {\n                                        \"plugin\": \"light_diffuse_color_modulator\",\n                                        \"x\": 200,\n                                        \"y\": 217,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"light_direction_modulator\",\n                                        \"x\": 521,\n                                        \"y\": 215,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"light_intensity_modulator\",\n                                        \"x\": 430,\n                                        \"y\": 219,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"light_specular_color_modulator\",\n                                        \"x\": 309,\n                                        \"y\": 219,\n                                        \"uid\": 6\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 494,\n                                        \"y\": 380,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 609,\n                                        \"y\": 401,\n                                        \"uid\": 13,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light type\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 413,\n                                        \"y\": 532,\n                                        \"uid\": 14,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Pos x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 412,\n                                        \"y\": 581,\n                                        \"uid\": 15,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Pos y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 412,\n                                        \"y\": 627,\n                                        \"uid\": 16,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Pos z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 350,\n                                        \"y\": 358,\n                                        \"uid\": 17,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"intensity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 196,\n                                        \"y\": 340,\n                                        \"uid\": 18,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"specular color\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 3,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 80,\n                                        \"y\": 347,\n                                        \"uid\": 19,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"diffuse color\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 3,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector_normalize\",\n                                        \"x\": 361,\n                                        \"y\": 452,\n                                        \"uid\": 20\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 248,\n                                        \"y\": 461,\n                                        \"uid\": 21\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 146,\n                                        \"y\": 479,\n                                        \"uid\": 22,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Dir x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 145,\n                                        \"y\": 528,\n                                        \"uid\": 23,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Dir y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 145,\n                                        \"y\": 574,\n                                        \"uid\": 24,\n                                        \"dsid\": 24,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Dir z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_light_modulator\",\n                                        \"x\": 777,\n                                        \"y\": 133,\n                                        \"uid\": 25\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 681,\n                                        \"y\": 135,\n                                        \"uid\": 26,\n                                        \"dsid\": 20,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 900,\n                                        \"y\": 133,\n                                        \"uid\": 27,\n                                        \"dsid\": 20,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 569,\n                                        \"y\": 134,\n                                        \"uid\": 28,\n                                        \"dsid\": 20,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light index\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 17,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 18,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 19,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 20,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 28,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"light type\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Pos x\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Pos y\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Pos z\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"intensity\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"specular color\",\n                                    \"dt\": 3,\n                                    \"uid\": 6,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"diffuse color\",\n                                    \"dt\": 3,\n                                    \"uid\": 7,\n                                    \"index\": 6,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Dir x\",\n                                    \"dt\": 0,\n                                    \"uid\": 8,\n                                    \"index\": 7,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Dir y\",\n                                    \"dt\": 0,\n                                    \"uid\": 9,\n                                    \"index\": 8,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Dir z\",\n                                    \"dt\": 0,\n                                    \"uid\": 10,\n                                    \"index\": 9,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 11,\n                                    \"index\": 10,\n                                    \"type\": 0\n                                },\n                                {\n                                    \"name\": \"light index\",\n                                    \"dt\": 0,\n                                    \"uid\": 13,\n                                    \"index\": 11,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 12,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"light_type_generator\",\n                            \"x\": 28,\n                            \"y\": 575,\n                            \"uid\": 70,\n                            \"state\": {\n                                \"type\": 0\n                            }\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 269,\n                            \"y\": 577,\n                            \"uid\": 71,\n                            \"state\": {\n                                \"val\": 0.5333333333333333,\n                                \"min\": 0,\n                                \"max\": 2\n                            },\n                            \"title\": \"Intensity\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 69,\n                            \"y\": 648,\n                            \"uid\": 72,\n                            \"state\": {\n                                \"val\": -0.08,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Light position X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 69,\n                            \"y\": 714,\n                            \"uid\": 73,\n                            \"state\": {\n                                \"val\": -0.28,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Light position Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 69,\n                            \"y\": 782,\n                            \"uid\": 74,\n                            \"state\": {\n                                \"val\": 1.16,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Light position Z\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 267,\n                            \"y\": 649,\n                            \"uid\": 75,\n                            \"open\": false,\n                            \"state\": {\n                                \"val\": -0.44,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Light direction X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 267,\n                            \"y\": 718,\n                            \"uid\": 76,\n                            \"open\": false,\n                            \"state\": {\n                                \"val\": -1.04,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Light direction Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 267,\n                            \"y\": 783,\n                            \"uid\": 77,\n                            \"open\": false,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Light direction z\"\n                        },\n                        {\n                            \"plugin\": \"color_picker\",\n                            \"x\": 71,\n                            \"y\": 863,\n                            \"uid\": 78,\n                            \"state\": {\n                                \"hue\": 0,\n                                \"sat\": 0,\n                                \"lum\": 0.95\n                            },\n                            \"title\": \"Diffuse color\"\n                        },\n                        {\n                            \"plugin\": \"color_picker\",\n                            \"x\": 257,\n                            \"y\": 864,\n                            \"uid\": 79,\n                            \"state\": {\n                                \"hue\": 0,\n                                \"sat\": 0,\n                                \"lum\": 0.97\n                            },\n                            \"title\": \"Specular color\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 165,\n                            \"y\": 575,\n                            \"uid\": 80,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Light index\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 619,\n                            \"y\": 349,\n                            \"uid\": 81,\n                            \"open\": false,\n                            \"dsid\": 18,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"21\": 4,\n                                    \"22\": 5,\n                                    \"23\": 6,\n                                    \"24\": 7,\n                                    \"25\": 8,\n                                    \"34\": 10,\n                                    \"39\": 12,\n                                    \"40\": 13,\n                                    \"41\": 14,\n                                    \"44\": 16\n                                },\n                                \"output_sids\": {\n                                    \"9\": 0\n                                }\n                            },\n                            \"title\": \"Material chain\",\n                            \"graph\": {\n                                \"node_uid\": 47,\n                                \"uid\": 7,\n                                \"parent_uid\": 4,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"material_diffuse_color_modulator\",\n                                        \"x\": 1029,\n                                        \"y\": 68,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"material_alpha_clip_modulator\",\n                                        \"x\": 1137,\n                                        \"y\": 68,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 1025,\n                                        \"y\": 145,\n                                        \"uid\": 6,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Alpha clip\"\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 1250,\n                                        \"y\": 71,\n                                        \"uid\": 9,\n                                        \"dsid\": 36,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_blend_mode_modulator\",\n                                        \"x\": 898,\n                                        \"y\": 69,\n                                        \"uid\": 10\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 134,\n                                        \"uid\": 21,\n                                        \"dsid\": 30,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 798,\n                                        \"y\": 183,\n                                        \"uid\": 22,\n                                        \"dsid\": 30,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 231,\n                                        \"uid\": 23,\n                                        \"dsid\": 30,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 799,\n                                        \"y\": 279,\n                                        \"uid\": 24,\n                                        \"dsid\": 30,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"alpha\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 70,\n                                        \"uid\": 25,\n                                        \"dsid\": 30,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"blend mode\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 907,\n                                        \"y\": 147,\n                                        \"uid\": 26\n                                    },\n                                    {\n                                        \"plugin\": \"material_z_buffer_modulator\",\n                                        \"x\": 672,\n                                        \"y\": 65,\n                                        \"uid\": 27\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 564,\n                                        \"y\": 287,\n                                        \"uid\": 28,\n                                        \"state\": {\n                                            \"enabled\": true\n                                        },\n                                        \"title\": \"Z-buffer\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_shinyness_modulator\",\n                                        \"x\": 558,\n                                        \"y\": 64,\n                                        \"uid\": 31\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 470,\n                                        \"y\": 149,\n                                        \"uid\": 32,\n                                        \"dsid\": 3,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"9\": 0\n                                            },\n                                            \"output_sids\": {\n                                                \"12\": 2\n                                            }\n                                        },\n                                        \"title\": \"min max calc\",\n                                        \"graph\": {\n                                            \"node_uid\": 13,\n                                            \"uid\": 8,\n                                            \"parent_uid\": 7,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 27,\n                                                    \"y\": 190,\n                                                    \"uid\": 2,\n                                                    \"state\": {\n                                                        \"val\": 10\n                                                    },\n                                                    \"title\": \"Maximum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"subtract_modulator\",\n                                                    \"x\": 144,\n                                                    \"y\": 65,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"absolute_modulator\",\n                                                    \"x\": 232,\n                                                    \"y\": 65,\n                                                    \"uid\": 4\n                                                },\n                                                {\n                                                    \"plugin\": \"multiply_modulator\",\n                                                    \"x\": 319,\n                                                    \"y\": 45,\n                                                    \"uid\": 5\n                                                },\n                                                {\n                                                    \"plugin\": \"add_modulator\",\n                                                    \"x\": 401,\n                                                    \"y\": 122,\n                                                    \"uid\": 7\n                                                },\n                                                {\n                                                    \"plugin\": \"min_modulator\",\n                                                    \"x\": 143,\n                                                    \"y\": 142,\n                                                    \"uid\": 8\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 248,\n                                                    \"y\": 9,\n                                                    \"uid\": 9,\n                                                    \"dsid\": 28,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 10,\n                                                    \"y\": 85,\n                                                    \"uid\": 11,\n                                                    \"state\": {\n                                                        \"val\": 0\n                                                    },\n                                                    \"title\": \"Minimum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 486,\n                                                    \"y\": 122,\n                                                    \"uid\": 12,\n                                                    \"dsid\": 28,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 4,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 4,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 7,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 8,\n                                                    \"dst_nuid\": 7,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 9,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 7,\n                                                    \"dst_nuid\": 12,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 2,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 426,\n                                        \"y\": 241,\n                                        \"uid\": 34,\n                                        \"dsid\": 24,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"shinyness\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_double_sided_modulator\",\n                                        \"x\": 437,\n                                        \"y\": 61,\n                                        \"uid\": 35\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 362,\n                                        \"y\": 146,\n                                        \"uid\": 36,\n                                        \"state\": {\n                                            \"enabled\": true\n                                        },\n                                        \"title\": \"Double-sided\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_ambient_color_modulator\",\n                                        \"x\": 290,\n                                        \"y\": 73,\n                                        \"uid\": 37\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 63,\n                                        \"y\": 153,\n                                        \"uid\": 39,\n                                        \"dsid\": 31,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 60,\n                                        \"y\": 202,\n                                        \"uid\": 40,\n                                        \"dsid\": 31,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 63,\n                                        \"y\": 250,\n                                        \"uid\": 41,\n                                        \"dsid\": 31,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 170,\n                                        \"y\": 166,\n                                        \"uid\": 43\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 58,\n                                        \"y\": 70,\n                                        \"uid\": 44,\n                                        \"dsid\": 20,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 27,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 28,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 31,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 32,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 34,\n                                        \"dst_nuid\": 32,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 35,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 36,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 37,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 39,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 40,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 41,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 43,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 44,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"alpha\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"blend mode\",\n                                    \"dt\": 0,\n                                    \"uid\": 8,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"shinyness\",\n                                    \"dt\": 0,\n                                    \"uid\": 10,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 12,\n                                    \"index\": 6,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 13,\n                                    \"index\": 7,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 14,\n                                    \"index\": 8,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 16,\n                                    \"index\": 9,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 298,\n                            \"y\": 345,\n                            \"uid\": 82,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 378,\n                            \"y\": 349,\n                            \"uid\": 83,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Saturation\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 457,\n                            \"y\": 349,\n                            \"uid\": 84,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Luminosity\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 538,\n                            \"y\": 349,\n                            \"uid\": 85,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Alpha\"\n                        },\n                        {\n                            \"plugin\": \"blend_mode_generator\",\n                            \"x\": 459,\n                            \"y\": 415,\n                            \"uid\": 86,\n                            \"state\": {\n                                \"mode\": 4\n                            }\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 378,\n                            \"y\": 415,\n                            \"uid\": 87,\n                            \"state\": {\n                                \"val\": 0.09999999999999999\n                            },\n                            \"title\": \"Shinyness\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 337,\n                            \"y\": 487,\n                            \"uid\": 88,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Ambient Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 429,\n                            \"y\": 487,\n                            \"uid\": 89,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Ambient Sat\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 517,\n                            \"y\": 487,\n                            \"uid\": 90,\n                            \"state\": {\n                                \"val\": 0.04\n                            },\n                            \"title\": \"Ambient Lum\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 1163,\n                            \"y\": 333,\n                            \"uid\": 91,\n                            \"open\": false,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"8\": 1,\n                                    \"9\": 2,\n                                    \"10\": 3\n                                },\n                                \"output_sids\": {\n                                    \"1\": 0\n                                }\n                            },\n                            \"title\": \"Rotate\",\n                            \"graph\": {\n                                \"node_uid\": 21,\n                                \"uid\": 9,\n                                \"parent_uid\": 4,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"rotation_xyz_matrix\",\n                                        \"x\": 367,\n                                        \"y\": 174,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 485,\n                                        \"y\": 174,\n                                        \"uid\": 1,\n                                        \"dsid\": 11,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 45,\n                                        \"y\": 80,\n                                        \"uid\": 8,\n                                        \"dsid\": 11,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"X\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 45,\n                                        \"y\": 170,\n                                        \"uid\": 9,\n                                        \"dsid\": 11,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 46,\n                                        \"y\": 257,\n                                        \"uid\": 10,\n                                        \"dsid\": 11,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 40,\n                                        \"y\": 386,\n                                        \"uid\": 11,\n                                        \"state\": {\n                                            \"val\": 180\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 15,\n                                        \"y\": 317,\n                                        \"uid\": 12,\n                                        \"state\": {\n                                            \"val\": 360\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 165,\n                                        \"y\": 80,\n                                        \"uid\": 15\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 260,\n                                        \"y\": 105,\n                                        \"uid\": 16\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 165,\n                                        \"y\": 170,\n                                        \"uid\": 17\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 260,\n                                        \"y\": 195,\n                                        \"uid\": 18\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 163,\n                                        \"y\": 257,\n                                        \"uid\": 19\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 258,\n                                        \"y\": 282,\n                                        \"uid\": 20\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 17,\n                                        \"dst_nuid\": 18,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 19,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 15,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 17,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 15,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 17,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 18,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 18,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 20,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"X\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Y\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Z\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 872,\n                            \"y\": 324,\n                            \"uid\": 92,\n                            \"state\": {\n                                \"val\": 0.09000000000000002\n                            },\n                            \"title\": \"Rotate X\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 872,\n                            \"y\": 397,\n                            \"uid\": 93,\n                            \"state\": {\n                                \"val\": 0.009999999999999941\n                            },\n                            \"title\": \"Rotate Y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 872,\n                            \"y\": 471,\n                            \"uid\": 94,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Rotate Z\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 1161,\n                            \"y\": 396,\n                            \"uid\": 95,\n                            \"open\": false,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"13\": 5,\n                                    \"14\": 6,\n                                    \"15\": 7\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Scale\",\n                            \"graph\": {\n                                \"node_uid\": 16,\n                                \"uid\": 10,\n                                \"parent_uid\": 4,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scale_matrix\",\n                                        \"x\": 189,\n                                        \"y\": 49,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 278,\n                                        \"y\": 49,\n                                        \"uid\": 2,\n                                        \"dsid\": 10,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 73,\n                                        \"y\": 49,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 7,\n                                        \"y\": 9,\n                                        \"uid\": 13,\n                                        \"dsid\": 10,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 7,\n                                        \"y\": 69,\n                                        \"uid\": 14,\n                                        \"dsid\": 10,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 7,\n                                        \"y\": 132,\n                                        \"uid\": 15,\n                                        \"dsid\": 10,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 1162,\n                            \"y\": 365,\n                            \"uid\": 96,\n                            \"open\": false,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"13\": 5,\n                                    \"14\": 6,\n                                    \"15\": 7\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Translate\",\n                            \"graph\": {\n                                \"node_uid\": 17,\n                                \"uid\": 11,\n                                \"parent_uid\": 4,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 291,\n                                        \"y\": 50,\n                                        \"uid\": 2,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 74,\n                                        \"y\": 50,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 8,\n                                        \"y\": 10,\n                                        \"uid\": 13,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 8,\n                                        \"y\": 70,\n                                        \"uid\": 14,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 8,\n                                        \"y\": 129,\n                                        \"uid\": 15,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"translation_matrix\",\n                                        \"x\": 191,\n                                        \"y\": 50,\n                                        \"uid\": 16\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 959,\n                            \"y\": 328,\n                            \"uid\": 97,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Position X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 959,\n                            \"y\": 389,\n                            \"uid\": 98,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Position Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 959,\n                            \"y\": 451,\n                            \"uid\": 99,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Position Z\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 871,\n                            \"y\": 549,\n                            \"uid\": 100,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Scale X\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 870,\n                            \"y\": 608,\n                            \"uid\": 101,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Scale Y\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 868,\n                            \"y\": 668,\n                            \"uid\": 102,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Scale Z\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 1274,\n                            \"y\": 320,\n                            \"uid\": 103,\n                            \"open\": false,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"3\": 1,\n                                    \"4\": 2,\n                                    \"5\": 3\n                                },\n                                \"output_sids\": {\n                                    \"2\": 0\n                                }\n                            },\n                            \"title\": \"Concatenate x2\",\n                            \"graph\": {\n                                \"node_uid\": 6,\n                                \"uid\": 12,\n                                \"parent_uid\": 4,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 274,\n                                        \"y\": 13,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 92,\n                                        \"y\": 13,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 394,\n                                        \"y\": 13,\n                                        \"uid\": 2,\n                                        \"dsid\": 10,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 197,\n                                        \"y\": 14,\n                                        \"uid\": 3,\n                                        \"dsid\": 10,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 9,\n                                        \"y\": 13,\n                                        \"uid\": 4,\n                                        \"dsid\": 10,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 9,\n                                        \"y\": 71,\n                                        \"uid\": 5,\n                                        \"dsid\": 10,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 1036,\n                            \"y\": 65,\n                            \"uid\": 104,\n                            \"dsid\": 6,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"camera\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 6,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 70,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 71,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 72,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 73,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 74,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 75,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 7,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 76,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 8,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 77,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 9,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 78,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 6,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 79,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 80,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 11,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 82,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 83,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 84,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 85,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 86,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 87,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 90,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 8,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 89,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 7,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 88,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 6,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 69,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 9,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 81,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 92,\n                            \"dst_nuid\": 91,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 93,\n                            \"dst_nuid\": 91,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 94,\n                            \"dst_nuid\": 91,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 97,\n                            \"dst_nuid\": 96,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 98,\n                            \"dst_nuid\": 96,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 99,\n                            \"dst_nuid\": 96,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 100,\n                            \"dst_nuid\": 95,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 101,\n                            \"dst_nuid\": 95,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 102,\n                            \"dst_nuid\": 95,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 96,\n                            \"dst_nuid\": 103,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 91,\n                            \"dst_nuid\": 103,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 95,\n                            \"dst_nuid\": 103,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 103,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 104,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"camera\",\n                        \"dt\": 6,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": false\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/3d_scene_with_camera_material_lights.json",
    "content": "{\n    \"abs_t\": 420.018,\n    \"active_graph\": 0,\n    \"graph_uid\": 11,\n    \"root\": {\n        \"node_uid\": 1,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 408,\n                \"y\": 212,\n                \"uid\": 0,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": \"512\",\n                    \"rt_height\": \"512\",\n                    \"rt_filter\": \"9729\",\n                    \"input_sids\": {},\n                    \"output_sids\": {}\n                },\n                \"title\": \"3D scene\",\n                \"graph\": {\n                    \"node_uid\": 109,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 1428,\n                            \"y\": 227,\n                            \"uid\": 0,\n                            \"open\": false,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"rt_filter\": 9729,\n                                \"input_sids\": {\n                                    \"1\": 0,\n                                    \"2\": 1,\n                                    \"10\": 2,\n                                    \"21\": 5,\n                                    \"23\": 6\n                                },\n                                \"output_sids\": {}\n                            },\n                            \"title\": \"Scene loader\",\n                            \"graph\": {\n                                \"node_uid\": 26,\n                                \"uid\": 2,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scene_renderer_emitter\",\n                                        \"x\": 868,\n                                        \"y\": 16,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 11,\n                                        \"y\": 308,\n                                        \"uid\": 1,\n                                        \"dsid\": 18,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"scene\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 11,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 788,\n                                        \"y\": 63,\n                                        \"uid\": 2,\n                                        \"dsid\": 18,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"scale_matrix\",\n                                        \"x\": 648,\n                                        \"y\": 205,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 514,\n                                        \"y\": 216,\n                                        \"uid\": 8\n                                    },\n                                    {\n                                        \"plugin\": \"divide_modulator\",\n                                        \"x\": 400,\n                                        \"y\": 235,\n                                        \"uid\": 9\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 280,\n                                        \"y\": 204,\n                                        \"uid\": 10,\n                                        \"dsid\": 18,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"mesh scale\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"max_modulator\",\n                                        \"x\": 320,\n                                        \"y\": 307,\n                                        \"uid\": 11\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 220,\n                                        \"y\": 355,\n                                        \"uid\": 12\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 221,\n                                        \"y\": 288,\n                                        \"uid\": 13\n                                    },\n                                    {\n                                        \"plugin\": \"scene_get_bounding_box\",\n                                        \"x\": 89,\n                                        \"y\": 307,\n                                        \"uid\": 14\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 647,\n                                        \"y\": 265,\n                                        \"uid\": 21,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"transform\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 569,\n                                        \"y\": 434,\n                                        \"uid\": 23,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 763,\n                                        \"y\": 184,\n                                        \"uid\": 25\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 13,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 1,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 14,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"scene\",\n                                    \"dt\": 11,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"mesh scale\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"transform\",\n                                    \"dt\": 4,\n                                    \"uid\": 5,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 6,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"url_scene_generator\",\n                            \"x\": 87,\n                            \"y\": 46,\n                            \"uid\": 1,\n                            \"state\": {\n                                \"url\": \"/data/scene/ladybug/scene.json\"\n                            }\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 1319,\n                            \"y\": 281,\n                            \"uid\": 6,\n                            \"open\": false,\n                            \"state\": {\n                                \"val\": 1,\n                                \"min\": 0,\n                                \"max\": 10\n                            },\n                            \"title\": \"Mesh scale\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 551,\n                            \"y\": 807,\n                            \"uid\": 69,\n                            \"open\": false,\n                            \"dsid\": 14,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"rt_filter\": 9729,\n                                \"input_sids\": {\n                                    \"13\": 1,\n                                    \"14\": 2,\n                                    \"15\": 3,\n                                    \"16\": 4,\n                                    \"17\": 5,\n                                    \"18\": 6,\n                                    \"19\": 7,\n                                    \"22\": 8,\n                                    \"23\": 9,\n                                    \"24\": 10,\n                                    \"26\": 11,\n                                    \"28\": 13\n                                },\n                                \"output_sids\": {\n                                    \"27\": 12\n                                }\n                            },\n                            \"title\": \"Light chain\",\n                            \"graph\": {\n                                \"node_uid\": 29,\n                                \"uid\": 3,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"light_type_modulator\",\n                                        \"x\": 692,\n                                        \"y\": 216,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"light_position_modulator\",\n                                        \"x\": 604,\n                                        \"y\": 215,\n                                        \"uid\": 2\n                                    },\n                                    {\n                                        \"plugin\": \"light_diffuse_color_modulator\",\n                                        \"x\": 200,\n                                        \"y\": 217,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"light_direction_modulator\",\n                                        \"x\": 521,\n                                        \"y\": 215,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"light_intensity_modulator\",\n                                        \"x\": 430,\n                                        \"y\": 219,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"light_specular_color_modulator\",\n                                        \"x\": 309,\n                                        \"y\": 219,\n                                        \"uid\": 6\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 494,\n                                        \"y\": 380,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 609,\n                                        \"y\": 401,\n                                        \"uid\": 13,\n                                        \"dsid\": 18,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light type\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 413,\n                                        \"y\": 532,\n                                        \"uid\": 14,\n                                        \"dsid\": 18,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Pos x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 412,\n                                        \"y\": 581,\n                                        \"uid\": 15,\n                                        \"dsid\": 19,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Pos y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 412,\n                                        \"y\": 627,\n                                        \"uid\": 16,\n                                        \"dsid\": 20,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Pos z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 350,\n                                        \"y\": 358,\n                                        \"uid\": 17,\n                                        \"dsid\": 18,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"intensity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 196,\n                                        \"y\": 340,\n                                        \"uid\": 18,\n                                        \"dsid\": 18,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"specular color\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 3,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 80,\n                                        \"y\": 347,\n                                        \"uid\": 19,\n                                        \"dsid\": 19,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"diffuse color\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 3,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector_normalize\",\n                                        \"x\": 361,\n                                        \"y\": 452,\n                                        \"uid\": 20\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 248,\n                                        \"y\": 461,\n                                        \"uid\": 21\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 146,\n                                        \"y\": 479,\n                                        \"uid\": 22,\n                                        \"dsid\": 19,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Dir x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 145,\n                                        \"y\": 528,\n                                        \"uid\": 23,\n                                        \"dsid\": 20,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Dir y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 145,\n                                        \"y\": 574,\n                                        \"uid\": 24,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Dir z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_light_modulator\",\n                                        \"x\": 777,\n                                        \"y\": 133,\n                                        \"uid\": 25\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 681,\n                                        \"y\": 135,\n                                        \"uid\": 26,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 900,\n                                        \"y\": 133,\n                                        \"uid\": 27,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 569,\n                                        \"y\": 134,\n                                        \"uid\": 28,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light index\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 17,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 18,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 19,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 20,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 28,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"light type\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Pos x\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Pos y\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Pos z\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"intensity\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"specular color\",\n                                    \"dt\": 3,\n                                    \"uid\": 6,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"diffuse color\",\n                                    \"dt\": 3,\n                                    \"uid\": 7,\n                                    \"index\": 6,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Dir x\",\n                                    \"dt\": 0,\n                                    \"uid\": 8,\n                                    \"index\": 7,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Dir y\",\n                                    \"dt\": 0,\n                                    \"uid\": 9,\n                                    \"index\": 8,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Dir z\",\n                                    \"dt\": 0,\n                                    \"uid\": 10,\n                                    \"index\": 9,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 11,\n                                    \"index\": 10,\n                                    \"type\": 0\n                                },\n                                {\n                                    \"name\": \"light index\",\n                                    \"dt\": 0,\n                                    \"uid\": 13,\n                                    \"index\": 11,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 12,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"light_type_generator\",\n                            \"x\": 418,\n                            \"y\": 799,\n                            \"uid\": 70,\n                            \"state\": {\n                                \"type\": 0\n                            }\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 78,\n                            \"y\": 715,\n                            \"uid\": 71,\n                            \"state\": {\n                                \"val\": 1.06,\n                                \"min\": 0,\n                                \"max\": 2\n                            },\n                            \"title\": \"Light intensity\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 77,\n                            \"y\": 783,\n                            \"uid\": 72,\n                            \"state\": {\n                                \"val\": -1,\n                                \"min\": -5,\n                                \"max\": 5\n                            },\n                            \"title\": \"Light position X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 77,\n                            \"y\": 849,\n                            \"uid\": 73,\n                            \"state\": {\n                                \"val\": -4,\n                                \"min\": -5,\n                                \"max\": 5\n                            },\n                            \"title\": \"Light position Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 77,\n                            \"y\": 917,\n                            \"uid\": 74,\n                            \"state\": {\n                                \"val\": 0.33333333333333304,\n                                \"min\": -5,\n                                \"max\": 5\n                            },\n                            \"title\": \"Light position Z\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 417,\n                            \"y\": 843,\n                            \"uid\": 75,\n                            \"open\": false,\n                            \"state\": {\n                                \"val\": -0.44,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Light direction X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 417,\n                            \"y\": 864,\n                            \"uid\": 76,\n                            \"open\": false,\n                            \"state\": {\n                                \"val\": -1.04,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Light direction Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 417,\n                            \"y\": 889,\n                            \"uid\": 77,\n                            \"open\": false,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Light direction z\"\n                        },\n                        {\n                            \"plugin\": \"color_picker\",\n                            \"x\": 79,\n                            \"y\": 998,\n                            \"uid\": 78,\n                            \"state\": {\n                                \"hue\": 0,\n                                \"sat\": 0,\n                                \"lum\": 0.95\n                            },\n                            \"title\": \"Diffuse color\"\n                        },\n                        {\n                            \"plugin\": \"color_picker\",\n                            \"x\": 265,\n                            \"y\": 999,\n                            \"uid\": 79,\n                            \"state\": {\n                                \"hue\": 0,\n                                \"sat\": 0,\n                                \"lum\": 0.97\n                            },\n                            \"title\": \"Specular color\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 421,\n                            \"y\": 778,\n                            \"uid\": 80,\n                            \"open\": false,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Light index\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 748,\n                            \"y\": 802,\n                            \"uid\": 81,\n                            \"open\": false,\n                            \"dsid\": 18,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"rt_filter\": 9729,\n                                \"input_sids\": {\n                                    \"21\": 4,\n                                    \"22\": 5,\n                                    \"23\": 6,\n                                    \"24\": 7,\n                                    \"25\": 8,\n                                    \"34\": 10,\n                                    \"39\": 12,\n                                    \"40\": 13,\n                                    \"41\": 14,\n                                    \"44\": 16\n                                },\n                                \"output_sids\": {\n                                    \"9\": 0\n                                }\n                            },\n                            \"title\": \"Material chain\",\n                            \"graph\": {\n                                \"node_uid\": 47,\n                                \"uid\": 4,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"material_diffuse_color_modulator\",\n                                        \"x\": 1029,\n                                        \"y\": 68,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"material_alpha_clip_modulator\",\n                                        \"x\": 1137,\n                                        \"y\": 68,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 1025,\n                                        \"y\": 145,\n                                        \"uid\": 6,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Alpha clip\"\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 1250,\n                                        \"y\": 71,\n                                        \"uid\": 9,\n                                        \"dsid\": 33,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_blend_mode_modulator\",\n                                        \"x\": 898,\n                                        \"y\": 69,\n                                        \"uid\": 10\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 134,\n                                        \"uid\": 21,\n                                        \"dsid\": 27,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 798,\n                                        \"y\": 183,\n                                        \"uid\": 22,\n                                        \"dsid\": 27,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 231,\n                                        \"uid\": 23,\n                                        \"dsid\": 27,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 799,\n                                        \"y\": 279,\n                                        \"uid\": 24,\n                                        \"dsid\": 27,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"alpha\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 70,\n                                        \"uid\": 25,\n                                        \"dsid\": 27,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"blend mode\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 907,\n                                        \"y\": 147,\n                                        \"uid\": 26\n                                    },\n                                    {\n                                        \"plugin\": \"material_z_buffer_modulator\",\n                                        \"x\": 672,\n                                        \"y\": 65,\n                                        \"uid\": 27\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 564,\n                                        \"y\": 287,\n                                        \"uid\": 28,\n                                        \"state\": {\n                                            \"enabled\": true\n                                        },\n                                        \"title\": \"Z-buffer\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_shinyness_modulator\",\n                                        \"x\": 558,\n                                        \"y\": 64,\n                                        \"uid\": 31\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 470,\n                                        \"y\": 149,\n                                        \"uid\": 32,\n                                        \"dsid\": 3,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"rt_filter\": 9729,\n                                            \"input_sids\": {\n                                                \"9\": 0\n                                            },\n                                            \"output_sids\": {\n                                                \"12\": 2\n                                            }\n                                        },\n                                        \"title\": \"min max calc\",\n                                        \"graph\": {\n                                            \"node_uid\": 13,\n                                            \"uid\": 5,\n                                            \"parent_uid\": 4,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 27,\n                                                    \"y\": 190,\n                                                    \"uid\": 2,\n                                                    \"state\": {\n                                                        \"val\": 10\n                                                    },\n                                                    \"title\": \"Maximum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"subtract_modulator\",\n                                                    \"x\": 144,\n                                                    \"y\": 65,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"absolute_modulator\",\n                                                    \"x\": 232,\n                                                    \"y\": 65,\n                                                    \"uid\": 4\n                                                },\n                                                {\n                                                    \"plugin\": \"multiply_modulator\",\n                                                    \"x\": 319,\n                                                    \"y\": 45,\n                                                    \"uid\": 5\n                                                },\n                                                {\n                                                    \"plugin\": \"add_modulator\",\n                                                    \"x\": 401,\n                                                    \"y\": 122,\n                                                    \"uid\": 7\n                                                },\n                                                {\n                                                    \"plugin\": \"min_modulator\",\n                                                    \"x\": 143,\n                                                    \"y\": 142,\n                                                    \"uid\": 8\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 248,\n                                                    \"y\": 9,\n                                                    \"uid\": 9,\n                                                    \"dsid\": 25,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 10,\n                                                    \"y\": 85,\n                                                    \"uid\": 11,\n                                                    \"state\": {\n                                                        \"val\": 0\n                                                    },\n                                                    \"title\": \"Minimum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 486,\n                                                    \"y\": 122,\n                                                    \"uid\": 12,\n                                                    \"dsid\": 25,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 4,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 4,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 7,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 8,\n                                                    \"dst_nuid\": 7,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 9,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 7,\n                                                    \"dst_nuid\": 12,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 2,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 426,\n                                        \"y\": 241,\n                                        \"uid\": 34,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"shinyness\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_double_sided_modulator\",\n                                        \"x\": 437,\n                                        \"y\": 61,\n                                        \"uid\": 35\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 362,\n                                        \"y\": 146,\n                                        \"uid\": 36,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Double-sided\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_ambient_color_modulator\",\n                                        \"x\": 290,\n                                        \"y\": 73,\n                                        \"uid\": 37\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 63,\n                                        \"y\": 153,\n                                        \"uid\": 39,\n                                        \"dsid\": 28,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 60,\n                                        \"y\": 202,\n                                        \"uid\": 40,\n                                        \"dsid\": 28,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 63,\n                                        \"y\": 250,\n                                        \"uid\": 41,\n                                        \"dsid\": 28,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 170,\n                                        \"y\": 166,\n                                        \"uid\": 43\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 58,\n                                        \"y\": 70,\n                                        \"uid\": 44,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 27,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 28,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 31,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 32,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 34,\n                                        \"dst_nuid\": 32,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 35,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 36,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 37,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 39,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 40,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 41,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 43,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 44,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"alpha\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"blend mode\",\n                                    \"dt\": 0,\n                                    \"uid\": 8,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"shinyness\",\n                                    \"dt\": 0,\n                                    \"uid\": 10,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 12,\n                                    \"index\": 6,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 13,\n                                    \"index\": 7,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 14,\n                                    \"index\": 8,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 16,\n                                    \"index\": 9,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 87,\n                            \"y\": 348,\n                            \"uid\": 82,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 160,\n                            \"y\": 348,\n                            \"uid\": 83,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Saturation\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 239,\n                            \"y\": 348,\n                            \"uid\": 84,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Luminosity\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 320,\n                            \"y\": 348,\n                            \"uid\": 85,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Alpha\"\n                        },\n                        {\n                            \"plugin\": \"blend_mode_generator\",\n                            \"x\": 86,\n                            \"y\": 475,\n                            \"uid\": 86,\n                            \"state\": {\n                                \"mode\": 4\n                            }\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 299,\n                            \"y\": 717,\n                            \"uid\": 87,\n                            \"state\": {\n                                \"val\": 0.2599999999999999\n                            },\n                            \"title\": \"Material shinyness\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 212,\n                            \"y\": 410,\n                            \"uid\": 88,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Ambient Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 305,\n                            \"y\": 410,\n                            \"uid\": 89,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Ambient Saturation\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 87,\n                            \"y\": 410,\n                            \"uid\": 90,\n                            \"state\": {\n                                \"val\": 0.04\n                            },\n                            \"title\": \"Ambient luminosity\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 824,\n                            \"y\": 147,\n                            \"uid\": 91,\n                            \"open\": false,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"rt_filter\": 9729,\n                                \"input_sids\": {\n                                    \"8\": 1,\n                                    \"9\": 2,\n                                    \"10\": 3\n                                },\n                                \"output_sids\": {\n                                    \"1\": 0\n                                }\n                            },\n                            \"title\": \"Rotate\",\n                            \"graph\": {\n                                \"node_uid\": 21,\n                                \"uid\": 6,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"rotation_xyz_matrix\",\n                                        \"x\": 367,\n                                        \"y\": 174,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 485,\n                                        \"y\": 174,\n                                        \"uid\": 1,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 45,\n                                        \"y\": 80,\n                                        \"uid\": 8,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"X\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 45,\n                                        \"y\": 170,\n                                        \"uid\": 9,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 46,\n                                        \"y\": 257,\n                                        \"uid\": 10,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 40,\n                                        \"y\": 386,\n                                        \"uid\": 11,\n                                        \"state\": {\n                                            \"val\": 180\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 15,\n                                        \"y\": 317,\n                                        \"uid\": 12,\n                                        \"state\": {\n                                            \"val\": 360\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 165,\n                                        \"y\": 80,\n                                        \"uid\": 15\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 260,\n                                        \"y\": 105,\n                                        \"uid\": 16\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 165,\n                                        \"y\": 170,\n                                        \"uid\": 17\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 260,\n                                        \"y\": 195,\n                                        \"uid\": 18\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 163,\n                                        \"y\": 257,\n                                        \"uid\": 19\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 258,\n                                        \"y\": 282,\n                                        \"uid\": 20\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 17,\n                                        \"dst_nuid\": 18,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 19,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 15,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 17,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 15,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 17,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 18,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 18,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 20,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"X\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Y\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Z\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 509,\n                            \"y\": 138,\n                            \"uid\": 92,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Rotate X\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 509,\n                            \"y\": 211,\n                            \"uid\": 93,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Rotate Y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 509,\n                            \"y\": 285,\n                            \"uid\": 94,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Rotate Z\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 620,\n                            \"y\": 365,\n                            \"uid\": 95,\n                            \"open\": false,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"rt_filter\": 9729,\n                                \"input_sids\": {\n                                    \"13\": 5,\n                                    \"14\": 6,\n                                    \"15\": 7\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Scale\",\n                            \"graph\": {\n                                \"node_uid\": 16,\n                                \"uid\": 7,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scale_matrix\",\n                                        \"x\": 189,\n                                        \"y\": 49,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 278,\n                                        \"y\": 49,\n                                        \"uid\": 2,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 73,\n                                        \"y\": 49,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 7,\n                                        \"y\": 9,\n                                        \"uid\": 13,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 7,\n                                        \"y\": 69,\n                                        \"uid\": 14,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 7,\n                                        \"y\": 132,\n                                        \"uid\": 15,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 823,\n                            \"y\": 179,\n                            \"uid\": 96,\n                            \"open\": false,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"rt_filter\": 9729,\n                                \"input_sids\": {\n                                    \"13\": 5,\n                                    \"14\": 6,\n                                    \"15\": 7\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Translate\",\n                            \"graph\": {\n                                \"node_uid\": 17,\n                                \"uid\": 8,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 291,\n                                        \"y\": 50,\n                                        \"uid\": 2,\n                                        \"dsid\": 9,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 74,\n                                        \"y\": 50,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 8,\n                                        \"y\": 10,\n                                        \"uid\": 13,\n                                        \"dsid\": 9,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 8,\n                                        \"y\": 70,\n                                        \"uid\": 14,\n                                        \"dsid\": 9,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 8,\n                                        \"y\": 129,\n                                        \"uid\": 15,\n                                        \"dsid\": 9,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"translation_matrix\",\n                                        \"x\": 191,\n                                        \"y\": 50,\n                                        \"uid\": 16\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 596,\n                            \"y\": 142,\n                            \"uid\": 97,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Position X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 596,\n                            \"y\": 203,\n                            \"uid\": 98,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Position Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 596,\n                            \"y\": 265,\n                            \"uid\": 99,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Position Z\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 508,\n                            \"y\": 363,\n                            \"uid\": 100,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Scale\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 926,\n                            \"y\": 150,\n                            \"uid\": 103,\n                            \"open\": false,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"rt_filter\": 9729,\n                                \"input_sids\": {\n                                    \"3\": 1,\n                                    \"4\": 2,\n                                    \"5\": 3\n                                },\n                                \"output_sids\": {\n                                    \"2\": 0\n                                }\n                            },\n                            \"title\": \"Concatenate x2\",\n                            \"graph\": {\n                                \"node_uid\": 6,\n                                \"uid\": 9,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 274,\n                                        \"y\": 13,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 92,\n                                        \"y\": 13,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 394,\n                                        \"y\": 13,\n                                        \"uid\": 2,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 197,\n                                        \"y\": 14,\n                                        \"uid\": 3,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 9,\n                                        \"y\": 13,\n                                        \"uid\": 4,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 9,\n                                        \"y\": 71,\n                                        \"uid\": 5,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 340,\n                            \"y\": 204,\n                            \"uid\": 104,\n                            \"open\": false,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"rt_filter\": 9729,\n                                \"input_sids\": {\n                                    \"10\": 0,\n                                    \"11\": 1,\n                                    \"12\": 2\n                                },\n                                \"output_sids\": {\n                                    \"24\": 3\n                                }\n                            },\n                            \"title\": \"Orbit camera\",\n                            \"graph\": {\n                                \"node_uid\": 30,\n                                \"uid\": 10,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 173,\n                                        \"y\": 58,\n                                        \"uid\": 10,\n                                        \"dsid\": 5,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"rotation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 32,\n                                        \"y\": 122,\n                                        \"uid\": 11,\n                                        \"dsid\": 5,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"elevation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 26,\n                                        \"y\": 180,\n                                        \"uid\": 12,\n                                        \"dsid\": 5,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"distance\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"cos_modulator\",\n                                        \"x\": 355,\n                                        \"y\": 60,\n                                        \"uid\": 13\n                                    },\n                                    {\n                                        \"plugin\": \"sin_modulator\",\n                                        \"x\": 376,\n                                        \"y\": 118,\n                                        \"uid\": 14\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 487,\n                                        \"y\": 55,\n                                        \"uid\": 15\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 596,\n                                        \"y\": 132,\n                                        \"uid\": 16\n                                    },\n                                    {\n                                        \"plugin\": \"sin_modulator\",\n                                        \"x\": 364,\n                                        \"y\": 242,\n                                        \"uid\": 17\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 491,\n                                        \"y\": 220,\n                                        \"uid\": 18\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 586,\n                                        \"y\": 263,\n                                        \"uid\": 19\n                                    },\n                                    {\n                                        \"plugin\": \"cos_modulator\",\n                                        \"x\": 379,\n                                        \"y\": 332,\n                                        \"uid\": 20\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 474,\n                                        \"y\": 372,\n                                        \"uid\": 21\n                                    },\n                                    {\n                                        \"plugin\": \"perspective_camera\",\n                                        \"x\": 805,\n                                        \"y\": 213,\n                                        \"uid\": 22\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 692,\n                                        \"y\": 279,\n                                        \"uid\": 23\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 925,\n                                        \"y\": 213,\n                                        \"uid\": 24,\n                                        \"dsid\": 5,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"def\": null,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"pi_generator\",\n                                        \"x\": 97,\n                                        \"y\": 294,\n                                        \"uid\": 25\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 257,\n                                        \"y\": 58,\n                                        \"uid\": 26\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 257,\n                                        \"y\": 145,\n                                        \"uid\": 27\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 149,\n                                        \"y\": 117,\n                                        \"uid\": 28\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 34,\n                                        \"y\": 52,\n                                        \"uid\": 29,\n                                        \"state\": {\n                                            \"val\": 1\n                                        }\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 15,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 15,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 18,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 17,\n                                        \"dst_nuid\": 18,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 18,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 20,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 23,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 19,\n                                        \"dst_nuid\": 23,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 23,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 22,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 24,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 13,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 17,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 27,\n                                        \"dst_nuid\": 14,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 27,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 28,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 29,\n                                        \"dst_nuid\": 28,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 28,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"rotation\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"elevation\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"distance\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 3,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 83,\n                            \"y\": 119,\n                            \"uid\": 105,\n                            \"state\": {\n                                \"val\": -0.5,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"Rotation\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 83,\n                            \"y\": 187,\n                            \"uid\": 106,\n                            \"state\": {\n                                \"val\": 0.65,\n                                \"min\": 0.05,\n                                \"max\": 0.95\n                            },\n                            \"title\": \"Elevation\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 83,\n                            \"y\": 257,\n                            \"uid\": 107,\n                            \"state\": {\n                                \"val\": 3.4,\n                                \"min\": 0.1,\n                                \"max\": 10\n                            },\n                            \"title\": \"Distance\"\n                        },\n                        {\n                            \"plugin\": \"annotation\",\n                            \"x\": 79,\n                            \"y\": 635,\n                            \"uid\": 108,\n                            \"state\": {\n                                \"text\": \"Control the lights setup here.\",\n                                \"width\": 196.18181824684143,\n                                \"height\": 34.18181824684143\n                            },\n                            \"title\": \"Info\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 70,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 71,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 72,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 73,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 74,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 75,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 7,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 76,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 8,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 77,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 9,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 78,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 6,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 79,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 80,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 11,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 82,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 83,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 84,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 85,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 86,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 87,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 90,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 8,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 89,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 7,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 88,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 6,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 69,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 9,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 92,\n                            \"dst_nuid\": 91,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 93,\n                            \"dst_nuid\": 91,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 94,\n                            \"dst_nuid\": 91,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 97,\n                            \"dst_nuid\": 96,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 98,\n                            \"dst_nuid\": 96,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 99,\n                            \"dst_nuid\": 96,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 100,\n                            \"dst_nuid\": 95,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 96,\n                            \"dst_nuid\": 103,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 91,\n                            \"dst_nuid\": 103,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 95,\n                            \"dst_nuid\": 103,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 103,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 105,\n                            \"dst_nuid\": 104,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 106,\n                            \"dst_nuid\": 104,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 107,\n                            \"dst_nuid\": 104,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 104,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 81,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 100,\n                            \"dst_nuid\": 95,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 100,\n                            \"dst_nuid\": 95,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true,\n                            \"offset\": 2\n                        }\n                    ]\n                }\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/3d_scene_with_material_lights_transforms_camera_input.json",
    "content": "{\n    \"abs_t\": 221.846,\n    \"active_graph\": 0,\n    \"graph_uid\": 12,\n    \"root\": {\n        \"node_uid\": 1,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 624,\n                \"y\": 178,\n                \"uid\": 0,\n                \"dsid\": 1,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {\n                        \"104\": 0\n                    },\n                    \"output_sids\": {}\n                },\n                \"title\": \"Scene controls\",\n                \"graph\": {\n                    \"node_uid\": 105,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 1241,\n                            \"y\": 135,\n                            \"uid\": 0,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"1\": 0,\n                                    \"2\": 1,\n                                    \"10\": 2,\n                                    \"21\": 5,\n                                    \"23\": 6\n                                },\n                                \"output_sids\": {}\n                            },\n                            \"title\": \"Scene loader\",\n                            \"graph\": {\n                                \"node_uid\": 26,\n                                \"uid\": 2,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scene_renderer_emitter\",\n                                        \"x\": 868,\n                                        \"y\": 16,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 11,\n                                        \"y\": 308,\n                                        \"uid\": 1,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"scene\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 11,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 788,\n                                        \"y\": 63,\n                                        \"uid\": 2,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"scale_matrix\",\n                                        \"x\": 648,\n                                        \"y\": 205,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 514,\n                                        \"y\": 216,\n                                        \"uid\": 8\n                                    },\n                                    {\n                                        \"plugin\": \"divide_modulator\",\n                                        \"x\": 400,\n                                        \"y\": 235,\n                                        \"uid\": 9\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 280,\n                                        \"y\": 204,\n                                        \"uid\": 10,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"mesh scale\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"max_modulator\",\n                                        \"x\": 320,\n                                        \"y\": 307,\n                                        \"uid\": 11\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 220,\n                                        \"y\": 355,\n                                        \"uid\": 12\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 221,\n                                        \"y\": 288,\n                                        \"uid\": 13\n                                    },\n                                    {\n                                        \"plugin\": \"scene_get_bounding_box\",\n                                        \"x\": 89,\n                                        \"y\": 307,\n                                        \"uid\": 14\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 647,\n                                        \"y\": 265,\n                                        \"uid\": 21,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"transform\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 569,\n                                        \"y\": 434,\n                                        \"uid\": 23,\n                                        \"dsid\": 11,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 763,\n                                        \"y\": 184,\n                                        \"uid\": 25\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 13,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 1,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 14,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"scene\",\n                                    \"dt\": 11,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"mesh scale\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"transform\",\n                                    \"dt\": 4,\n                                    \"uid\": 5,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 6,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"url_scene_generator\",\n                            \"x\": 69,\n                            \"y\": 53,\n                            \"uid\": 1,\n                            \"state\": {\n                                \"url\": \"/data/scene/ladybug/scene.json\"\n                            }\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 433,\n                            \"y\": 55,\n                            \"uid\": 6,\n                            \"state\": {\n                                \"val\": 1.6,\n                                \"min\": 0,\n                                \"max\": 10\n                            },\n                            \"title\": \"Mesh scale\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 477,\n                            \"y\": 576,\n                            \"uid\": 69,\n                            \"open\": false,\n                            \"dsid\": 14,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"13\": 1,\n                                    \"14\": 2,\n                                    \"15\": 3,\n                                    \"16\": 4,\n                                    \"17\": 5,\n                                    \"18\": 6,\n                                    \"19\": 7,\n                                    \"22\": 8,\n                                    \"23\": 9,\n                                    \"24\": 10,\n                                    \"26\": 11,\n                                    \"28\": 13\n                                },\n                                \"output_sids\": {\n                                    \"27\": 12\n                                }\n                            },\n                            \"title\": \"Light chain\",\n                            \"graph\": {\n                                \"node_uid\": 29,\n                                \"uid\": 5,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"light_type_modulator\",\n                                        \"x\": 692,\n                                        \"y\": 216,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"light_position_modulator\",\n                                        \"x\": 604,\n                                        \"y\": 215,\n                                        \"uid\": 2\n                                    },\n                                    {\n                                        \"plugin\": \"light_diffuse_color_modulator\",\n                                        \"x\": 200,\n                                        \"y\": 217,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"light_direction_modulator\",\n                                        \"x\": 521,\n                                        \"y\": 215,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"light_intensity_modulator\",\n                                        \"x\": 430,\n                                        \"y\": 219,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"light_specular_color_modulator\",\n                                        \"x\": 309,\n                                        \"y\": 219,\n                                        \"uid\": 6\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 494,\n                                        \"y\": 380,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 609,\n                                        \"y\": 401,\n                                        \"uid\": 13,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light type\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 413,\n                                        \"y\": 532,\n                                        \"uid\": 14,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Pos x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 412,\n                                        \"y\": 581,\n                                        \"uid\": 15,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Pos y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 412,\n                                        \"y\": 627,\n                                        \"uid\": 16,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Pos z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 350,\n                                        \"y\": 358,\n                                        \"uid\": 17,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"intensity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 196,\n                                        \"y\": 340,\n                                        \"uid\": 18,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"specular color\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 3,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 80,\n                                        \"y\": 347,\n                                        \"uid\": 19,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"diffuse color\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 3,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector_normalize\",\n                                        \"x\": 361,\n                                        \"y\": 452,\n                                        \"uid\": 20\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 248,\n                                        \"y\": 461,\n                                        \"uid\": 21\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 146,\n                                        \"y\": 479,\n                                        \"uid\": 22,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Dir x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 145,\n                                        \"y\": 528,\n                                        \"uid\": 23,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Dir y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 145,\n                                        \"y\": 574,\n                                        \"uid\": 24,\n                                        \"dsid\": 18,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Dir z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_light_modulator\",\n                                        \"x\": 777,\n                                        \"y\": 133,\n                                        \"uid\": 25\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 681,\n                                        \"y\": 135,\n                                        \"uid\": 26,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 900,\n                                        \"y\": 133,\n                                        \"uid\": 27,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 569,\n                                        \"y\": 134,\n                                        \"uid\": 28,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light index\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 17,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 18,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 19,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 20,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 28,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"light type\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Pos x\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Pos y\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Pos z\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"intensity\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"specular color\",\n                                    \"dt\": 3,\n                                    \"uid\": 6,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"diffuse color\",\n                                    \"dt\": 3,\n                                    \"uid\": 7,\n                                    \"index\": 6,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Dir x\",\n                                    \"dt\": 0,\n                                    \"uid\": 8,\n                                    \"index\": 7,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Dir y\",\n                                    \"dt\": 0,\n                                    \"uid\": 9,\n                                    \"index\": 8,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Dir z\",\n                                    \"dt\": 0,\n                                    \"uid\": 10,\n                                    \"index\": 9,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 11,\n                                    \"index\": 10,\n                                    \"type\": 0\n                                },\n                                {\n                                    \"name\": \"light index\",\n                                    \"dt\": 0,\n                                    \"uid\": 13,\n                                    \"index\": 11,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 12,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"light_type_generator\",\n                            \"x\": 28,\n                            \"y\": 575,\n                            \"uid\": 70,\n                            \"state\": {\n                                \"type\": 0\n                            }\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 272,\n                            \"y\": 578,\n                            \"uid\": 71,\n                            \"state\": {\n                                \"val\": 1.06,\n                                \"min\": 0,\n                                \"max\": 2\n                            },\n                            \"title\": \"Intensity\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 69,\n                            \"y\": 648,\n                            \"uid\": 72,\n                            \"state\": {\n                                \"val\": -0.08,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Light position X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 69,\n                            \"y\": 714,\n                            \"uid\": 73,\n                            \"state\": {\n                                \"val\": -0.28,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Light position Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 69,\n                            \"y\": 782,\n                            \"uid\": 74,\n                            \"state\": {\n                                \"val\": 1.16,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Light position Z\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 267,\n                            \"y\": 649,\n                            \"uid\": 75,\n                            \"state\": {\n                                \"val\": -0.44,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Light direction X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 267,\n                            \"y\": 718,\n                            \"uid\": 76,\n                            \"state\": {\n                                \"val\": -1.04,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Light direction Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 267,\n                            \"y\": 783,\n                            \"uid\": 77,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Light direction z\"\n                        },\n                        {\n                            \"plugin\": \"color_picker\",\n                            \"x\": 71,\n                            \"y\": 863,\n                            \"uid\": 78,\n                            \"state\": {\n                                \"hue\": 0,\n                                \"sat\": 0,\n                                \"lum\": 0.95\n                            },\n                            \"title\": \"Diffuse color\"\n                        },\n                        {\n                            \"plugin\": \"color_picker\",\n                            \"x\": 257,\n                            \"y\": 864,\n                            \"uid\": 79,\n                            \"state\": {\n                                \"hue\": 0,\n                                \"sat\": 0,\n                                \"lum\": 0.97\n                            },\n                            \"title\": \"Specular color\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 165,\n                            \"y\": 575,\n                            \"uid\": 80,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Light index\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 474,\n                            \"y\": 548,\n                            \"uid\": 81,\n                            \"open\": false,\n                            \"dsid\": 18,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"21\": 4,\n                                    \"22\": 5,\n                                    \"23\": 6,\n                                    \"24\": 7,\n                                    \"25\": 8,\n                                    \"34\": 10,\n                                    \"39\": 12,\n                                    \"40\": 13,\n                                    \"41\": 14,\n                                    \"44\": 16\n                                },\n                                \"output_sids\": {\n                                    \"9\": 0\n                                }\n                            },\n                            \"title\": \"Material chain\",\n                            \"graph\": {\n                                \"node_uid\": 47,\n                                \"uid\": 6,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"material_diffuse_color_modulator\",\n                                        \"x\": 1029,\n                                        \"y\": 68,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"material_alpha_clip_modulator\",\n                                        \"x\": 1137,\n                                        \"y\": 68,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 1025,\n                                        \"y\": 145,\n                                        \"uid\": 6,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Alpha clip\"\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 1250,\n                                        \"y\": 71,\n                                        \"uid\": 9,\n                                        \"dsid\": 30,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_blend_mode_modulator\",\n                                        \"x\": 898,\n                                        \"y\": 69,\n                                        \"uid\": 10\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 134,\n                                        \"uid\": 21,\n                                        \"dsid\": 24,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 798,\n                                        \"y\": 183,\n                                        \"uid\": 22,\n                                        \"dsid\": 24,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 231,\n                                        \"uid\": 23,\n                                        \"dsid\": 24,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 799,\n                                        \"y\": 279,\n                                        \"uid\": 24,\n                                        \"dsid\": 24,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"alpha\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 70,\n                                        \"uid\": 25,\n                                        \"dsid\": 24,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"blend mode\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 907,\n                                        \"y\": 147,\n                                        \"uid\": 26\n                                    },\n                                    {\n                                        \"plugin\": \"material_z_buffer_modulator\",\n                                        \"x\": 672,\n                                        \"y\": 65,\n                                        \"uid\": 27\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 574,\n                                        \"y\": 162,\n                                        \"uid\": 28,\n                                        \"state\": {\n                                            \"enabled\": true\n                                        },\n                                        \"title\": \"Z-buffer\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_shinyness_modulator\",\n                                        \"x\": 558,\n                                        \"y\": 64,\n                                        \"uid\": 31\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 470,\n                                        \"y\": 149,\n                                        \"uid\": 32,\n                                        \"dsid\": 3,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"9\": 0\n                                            },\n                                            \"output_sids\": {\n                                                \"12\": 2\n                                            }\n                                        },\n                                        \"title\": \"min max calc\",\n                                        \"graph\": {\n                                            \"node_uid\": 13,\n                                            \"uid\": 7,\n                                            \"parent_uid\": 6,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 27,\n                                                    \"y\": 190,\n                                                    \"uid\": 2,\n                                                    \"state\": {\n                                                        \"val\": 10\n                                                    },\n                                                    \"title\": \"Maximum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"subtract_modulator\",\n                                                    \"x\": 144,\n                                                    \"y\": 65,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"absolute_modulator\",\n                                                    \"x\": 232,\n                                                    \"y\": 65,\n                                                    \"uid\": 4\n                                                },\n                                                {\n                                                    \"plugin\": \"multiply_modulator\",\n                                                    \"x\": 319,\n                                                    \"y\": 45,\n                                                    \"uid\": 5\n                                                },\n                                                {\n                                                    \"plugin\": \"add_modulator\",\n                                                    \"x\": 401,\n                                                    \"y\": 122,\n                                                    \"uid\": 7\n                                                },\n                                                {\n                                                    \"plugin\": \"min_modulator\",\n                                                    \"x\": 143,\n                                                    \"y\": 142,\n                                                    \"uid\": 8\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 248,\n                                                    \"y\": 9,\n                                                    \"uid\": 9,\n                                                    \"dsid\": 22,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 10,\n                                                    \"y\": 85,\n                                                    \"uid\": 11,\n                                                    \"state\": {\n                                                        \"val\": 0\n                                                    },\n                                                    \"title\": \"Minimum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 486,\n                                                    \"y\": 122,\n                                                    \"uid\": 12,\n                                                    \"dsid\": 22,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 4,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 4,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 7,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 8,\n                                                    \"dst_nuid\": 7,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 9,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 7,\n                                                    \"dst_nuid\": 12,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 2,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 426,\n                                        \"y\": 241,\n                                        \"uid\": 34,\n                                        \"dsid\": 18,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"shinyness\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_double_sided_modulator\",\n                                        \"x\": 437,\n                                        \"y\": 61,\n                                        \"uid\": 35\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 362,\n                                        \"y\": 146,\n                                        \"uid\": 36,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Double-sided\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_ambient_color_modulator\",\n                                        \"x\": 290,\n                                        \"y\": 73,\n                                        \"uid\": 37\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 63,\n                                        \"y\": 153,\n                                        \"uid\": 39,\n                                        \"dsid\": 25,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 60,\n                                        \"y\": 202,\n                                        \"uid\": 40,\n                                        \"dsid\": 25,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 63,\n                                        \"y\": 250,\n                                        \"uid\": 41,\n                                        \"dsid\": 25,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 170,\n                                        \"y\": 166,\n                                        \"uid\": 43\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 58,\n                                        \"y\": 70,\n                                        \"uid\": 44,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 27,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 28,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 31,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 32,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 34,\n                                        \"dst_nuid\": 32,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 35,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 36,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 37,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 39,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 40,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 41,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 43,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 44,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"alpha\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"blend mode\",\n                                    \"dt\": 0,\n                                    \"uid\": 8,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"shinyness\",\n                                    \"dt\": 0,\n                                    \"uid\": 10,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 12,\n                                    \"index\": 6,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 13,\n                                    \"index\": 7,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 14,\n                                    \"index\": 8,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 16,\n                                    \"index\": 9,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 77,\n                            \"y\": 362,\n                            \"uid\": 82,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 150,\n                            \"y\": 362,\n                            \"uid\": 83,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Saturation\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 229,\n                            \"y\": 362,\n                            \"uid\": 84,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Luminosity\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 311,\n                            \"y\": 365,\n                            \"uid\": 85,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Alpha\"\n                        },\n                        {\n                            \"plugin\": \"blend_mode_generator\",\n                            \"x\": 231,\n                            \"y\": 428,\n                            \"uid\": 86,\n                            \"state\": {\n                                \"mode\": 4\n                            }\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 150,\n                            \"y\": 428,\n                            \"uid\": 87,\n                            \"state\": {\n                                \"val\": 0.2599999999999999\n                            },\n                            \"title\": \"Shinyness\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 109,\n                            \"y\": 500,\n                            \"uid\": 88,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Ambient Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 201,\n                            \"y\": 500,\n                            \"uid\": 89,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Ambient Sat\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 289,\n                            \"y\": 500,\n                            \"uid\": 90,\n                            \"state\": {\n                                \"val\": 0.04\n                            },\n                            \"title\": \"Ambient Lum\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 723,\n                            \"y\": 137,\n                            \"uid\": 91,\n                            \"open\": false,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"8\": 1,\n                                    \"9\": 2,\n                                    \"10\": 3\n                                },\n                                \"output_sids\": {\n                                    \"1\": 0\n                                }\n                            },\n                            \"title\": \"Rotate\",\n                            \"graph\": {\n                                \"node_uid\": 21,\n                                \"uid\": 8,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"rotation_xyz_matrix\",\n                                        \"x\": 367,\n                                        \"y\": 174,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 485,\n                                        \"y\": 174,\n                                        \"uid\": 1,\n                                        \"dsid\": 5,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 45,\n                                        \"y\": 80,\n                                        \"uid\": 8,\n                                        \"dsid\": 5,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"X\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 45,\n                                        \"y\": 170,\n                                        \"uid\": 9,\n                                        \"dsid\": 5,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 46,\n                                        \"y\": 257,\n                                        \"uid\": 10,\n                                        \"dsid\": 5,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 40,\n                                        \"y\": 386,\n                                        \"uid\": 11,\n                                        \"state\": {\n                                            \"val\": 180\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 15,\n                                        \"y\": 317,\n                                        \"uid\": 12,\n                                        \"state\": {\n                                            \"val\": 360\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 165,\n                                        \"y\": 80,\n                                        \"uid\": 15\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 260,\n                                        \"y\": 105,\n                                        \"uid\": 16\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 165,\n                                        \"y\": 170,\n                                        \"uid\": 17\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 260,\n                                        \"y\": 195,\n                                        \"uid\": 18\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 163,\n                                        \"y\": 257,\n                                        \"uid\": 19\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 258,\n                                        \"y\": 282,\n                                        \"uid\": 20\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 17,\n                                        \"dst_nuid\": 18,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 19,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 15,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 17,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 15,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 17,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 18,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 18,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 20,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"X\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Y\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Z\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 432,\n                            \"y\": 128,\n                            \"uid\": 92,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Rotate X\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 432,\n                            \"y\": 201,\n                            \"uid\": 93,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Rotate Y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 432,\n                            \"y\": 275,\n                            \"uid\": 94,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Rotate Z\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 721,\n                            \"y\": 200,\n                            \"uid\": 95,\n                            \"open\": false,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"13\": 5,\n                                    \"14\": 6,\n                                    \"15\": 7\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Scale\",\n                            \"graph\": {\n                                \"node_uid\": 16,\n                                \"uid\": 9,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scale_matrix\",\n                                        \"x\": 189,\n                                        \"y\": 49,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 278,\n                                        \"y\": 49,\n                                        \"uid\": 2,\n                                        \"dsid\": 4,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 73,\n                                        \"y\": 49,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 7,\n                                        \"y\": 9,\n                                        \"uid\": 13,\n                                        \"dsid\": 4,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 7,\n                                        \"y\": 69,\n                                        \"uid\": 14,\n                                        \"dsid\": 4,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 7,\n                                        \"y\": 132,\n                                        \"uid\": 15,\n                                        \"dsid\": 4,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 722,\n                            \"y\": 169,\n                            \"uid\": 96,\n                            \"open\": false,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"13\": 5,\n                                    \"14\": 6,\n                                    \"15\": 7\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Translate\",\n                            \"graph\": {\n                                \"node_uid\": 17,\n                                \"uid\": 10,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 291,\n                                        \"y\": 50,\n                                        \"uid\": 2,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 74,\n                                        \"y\": 50,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 8,\n                                        \"y\": 10,\n                                        \"uid\": 13,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 8,\n                                        \"y\": 70,\n                                        \"uid\": 14,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 8,\n                                        \"y\": 129,\n                                        \"uid\": 15,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"translation_matrix\",\n                                        \"x\": 191,\n                                        \"y\": 50,\n                                        \"uid\": 16\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 519,\n                            \"y\": 132,\n                            \"uid\": 97,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Position X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 519,\n                            \"y\": 193,\n                            \"uid\": 98,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Position Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 519,\n                            \"y\": 255,\n                            \"uid\": 99,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Position Z\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 431,\n                            \"y\": 353,\n                            \"uid\": 100,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Scale X\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 430,\n                            \"y\": 412,\n                            \"uid\": 101,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Scale Y\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 428,\n                            \"y\": 472,\n                            \"uid\": 102,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Scale Z\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 817,\n                            \"y\": 161,\n                            \"uid\": 103,\n                            \"open\": false,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"3\": 1,\n                                    \"4\": 2,\n                                    \"5\": 3\n                                },\n                                \"output_sids\": {\n                                    \"2\": 0\n                                }\n                            },\n                            \"title\": \"Concatenate x2\",\n                            \"graph\": {\n                                \"node_uid\": 6,\n                                \"uid\": 11,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 274,\n                                        \"y\": 13,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 92,\n                                        \"y\": 13,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 394,\n                                        \"y\": 13,\n                                        \"uid\": 2,\n                                        \"dsid\": 4,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 197,\n                                        \"y\": 14,\n                                        \"uid\": 3,\n                                        \"dsid\": 4,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 9,\n                                        \"y\": 13,\n                                        \"uid\": 4,\n                                        \"dsid\": 4,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 9,\n                                        \"y\": 71,\n                                        \"uid\": 5,\n                                        \"dsid\": 4,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 1093,\n                            \"y\": 107,\n                            \"uid\": 104,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"camera\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 6,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 70,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 71,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 72,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 73,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 74,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 75,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 7,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 76,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 8,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 77,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 9,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 78,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 6,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 79,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 80,\n                            \"dst_nuid\": 69,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 11,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 82,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 83,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 84,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 85,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 86,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 87,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 90,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 8,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 89,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 7,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 88,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 6,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 69,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 9,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 81,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 92,\n                            \"dst_nuid\": 91,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 93,\n                            \"dst_nuid\": 91,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 94,\n                            \"dst_nuid\": 91,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 97,\n                            \"dst_nuid\": 96,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 98,\n                            \"dst_nuid\": 96,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 99,\n                            \"dst_nuid\": 96,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 100,\n                            \"dst_nuid\": 95,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 101,\n                            \"dst_nuid\": 95,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 102,\n                            \"dst_nuid\": 95,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 96,\n                            \"dst_nuid\": 103,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 91,\n                            \"dst_nuid\": 103,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 95,\n                            \"dst_nuid\": 103,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 103,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 104,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"camera\",\n                        \"dt\": 6,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/3d_scene_with_texture_out.json",
    "content": "{\n    \"abs_t\": 69.32,\n    \"active_graph\": 0,\n    \"graph_uid\": 8,\n    \"root\": {\n        \"node_uid\": 3,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 515,\n                \"y\": 370,\n                \"uid\": 0,\n                \"dsid\": 1,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {\n                        \"91\": 0\n                    },\n                    \"output_sids\": {}\n                },\n                \"title\": \"Scene controls\",\n                \"graph\": {\n                    \"node_uid\": 92,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 858,\n                            \"y\": 174,\n                            \"uid\": 0,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"1\": 0,\n                                    \"2\": 1,\n                                    \"10\": 2,\n                                    \"21\": 5,\n                                    \"23\": 6\n                                },\n                                \"output_sids\": {}\n                            },\n                            \"title\": \"Scene loader\",\n                            \"graph\": {\n                                \"node_uid\": 26,\n                                \"uid\": 2,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scene_renderer_emitter\",\n                                        \"x\": 868,\n                                        \"y\": 16,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 11,\n                                        \"y\": 308,\n                                        \"uid\": 1,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"scene\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 11,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 788,\n                                        \"y\": 63,\n                                        \"uid\": 2,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"scale_matrix\",\n                                        \"x\": 648,\n                                        \"y\": 205,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 514,\n                                        \"y\": 216,\n                                        \"uid\": 8\n                                    },\n                                    {\n                                        \"plugin\": \"divide_modulator\",\n                                        \"x\": 400,\n                                        \"y\": 235,\n                                        \"uid\": 9\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 280,\n                                        \"y\": 204,\n                                        \"uid\": 10,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"mesh scale\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"max_modulator\",\n                                        \"x\": 320,\n                                        \"y\": 307,\n                                        \"uid\": 11\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 220,\n                                        \"y\": 355,\n                                        \"uid\": 12\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 221,\n                                        \"y\": 288,\n                                        \"uid\": 13\n                                    },\n                                    {\n                                        \"plugin\": \"scene_get_bounding_box\",\n                                        \"x\": 89,\n                                        \"y\": 307,\n                                        \"uid\": 14\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 647,\n                                        \"y\": 265,\n                                        \"uid\": 21,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"transform\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 569,\n                                        \"y\": 434,\n                                        \"uid\": 23,\n                                        \"dsid\": 10,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 763,\n                                        \"y\": 184,\n                                        \"uid\": 25\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 13,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 1,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 14,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"scene\",\n                                    \"dt\": 11,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"mesh scale\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"transform\",\n                                    \"dt\": 4,\n                                    \"uid\": 5,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 6,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"url_scene_generator\",\n                            \"x\": 198,\n                            \"y\": 50,\n                            \"uid\": 1,\n                            \"state\": {\n                                \"url\": \"/data/scene/ladybug/scene.json\"\n                            }\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 631,\n                            \"y\": 8,\n                            \"uid\": 2,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"0\": 0,\n                                    \"1\": 1,\n                                    \"2\": 2\n                                },\n                                \"output_sids\": {\n                                    \"3\": 3\n                                }\n                            },\n                            \"title\": \"Camera\",\n                            \"graph\": {\n                                \"node_uid\": 17,\n                                \"uid\": 3,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 127,\n                                        \"y\": 210,\n                                        \"uid\": 0,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"rotation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 33,\n                                        \"y\": 92,\n                                        \"uid\": 1,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"elevation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 54,\n                                        \"y\": 37,\n                                        \"uid\": 2,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"dolly\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 554,\n                                        \"y\": 99,\n                                        \"uid\": 3,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"perspective_camera\",\n                                        \"x\": 436,\n                                        \"y\": 99,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 202,\n                                        \"y\": 51,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"rotation_xyz_matrix\",\n                                        \"x\": 206,\n                                        \"y\": 169,\n                                        \"uid\": 6\n                                    },\n                                    {\n                                        \"plugin\": \"vector_transform\",\n                                        \"x\": 328,\n                                        \"y\": 99,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"negate_modulator\",\n                                        \"x\": 123,\n                                        \"y\": 71,\n                                        \"uid\": 16\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"rotation\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"elevation\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"dolly\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 3,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 197,\n                            \"y\": 113,\n                            \"uid\": 3,\n                            \"state\": {\n                                \"val\": -36,\n                                \"min\": -180,\n                                \"max\": 180\n                            },\n                            \"title\": \"Camera Rotation\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 197,\n                            \"y\": 183,\n                            \"uid\": 4,\n                            \"state\": {\n                                \"val\": 1.2,\n                                \"min\": -20,\n                                \"max\": 20\n                            },\n                            \"title\": \"Camera Elevation\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 197,\n                            \"y\": 255,\n                            \"uid\": 5,\n                            \"state\": {\n                                \"val\": 5.1,\n                                \"min\": 0,\n                                \"max\": 10\n                            },\n                            \"title\": \"Camera Dolly\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 328,\n                            \"y\": 30,\n                            \"uid\": 6,\n                            \"state\": {\n                                \"val\": 3.5,\n                                \"min\": 0,\n                                \"max\": 10\n                            },\n                            \"title\": \"Mesh scale\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 632,\n                            \"y\": 149,\n                            \"uid\": 19,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"13\": 5,\n                                    \"14\": 6,\n                                    \"15\": 7\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Translate\",\n                            \"graph\": {\n                                \"node_uid\": 17,\n                                \"uid\": 4,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 303,\n                                        \"y\": 53,\n                                        \"uid\": 2,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 92,\n                                        \"y\": 53,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 23,\n                                        \"y\": 11,\n                                        \"uid\": 13,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 23,\n                                        \"y\": 73,\n                                        \"uid\": 14,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 23,\n                                        \"y\": 135,\n                                        \"uid\": 15,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"translation_matrix\",\n                                        \"x\": 204,\n                                        \"y\": 53,\n                                        \"uid\": 16\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 399,\n                            \"y\": 112,\n                            \"uid\": 20,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -10,\n                                \"max\": 10\n                            },\n                            \"title\": \"x position\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 399,\n                            \"y\": 178,\n                            \"uid\": 21,\n                            \"state\": {\n                                \"val\": -1,\n                                \"min\": -10,\n                                \"max\": 10\n                            },\n                            \"title\": \"y position\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 399,\n                            \"y\": 242,\n                            \"uid\": 22,\n                            \"state\": {\n                                \"val\": -1.6,\n                                \"min\": -10,\n                                \"max\": 10\n                            },\n                            \"title\": \"z position\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 667,\n                            \"y\": 335,\n                            \"uid\": 81,\n                            \"dsid\": 18,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"21\": 4,\n                                    \"22\": 5,\n                                    \"23\": 6,\n                                    \"24\": 7,\n                                    \"25\": 8,\n                                    \"34\": 10,\n                                    \"39\": 12,\n                                    \"40\": 13,\n                                    \"41\": 14,\n                                    \"44\": 16\n                                },\n                                \"output_sids\": {\n                                    \"9\": 0\n                                }\n                            },\n                            \"title\": \"Material chain\",\n                            \"graph\": {\n                                \"node_uid\": 47,\n                                \"uid\": 6,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"material_diffuse_color_modulator\",\n                                        \"x\": 1029,\n                                        \"y\": 68,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"material_alpha_clip_modulator\",\n                                        \"x\": 1137,\n                                        \"y\": 68,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 1025,\n                                        \"y\": 145,\n                                        \"uid\": 6,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Alpha clip\"\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 1250,\n                                        \"y\": 71,\n                                        \"uid\": 9,\n                                        \"dsid\": 29,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_blend_mode_modulator\",\n                                        \"x\": 898,\n                                        \"y\": 69,\n                                        \"uid\": 10\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 134,\n                                        \"uid\": 21,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 798,\n                                        \"y\": 183,\n                                        \"uid\": 22,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 231,\n                                        \"uid\": 23,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 799,\n                                        \"y\": 279,\n                                        \"uid\": 24,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"alpha\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 70,\n                                        \"uid\": 25,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"blend mode\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 907,\n                                        \"y\": 147,\n                                        \"uid\": 26\n                                    },\n                                    {\n                                        \"plugin\": \"material_z_buffer_modulator\",\n                                        \"x\": 672,\n                                        \"y\": 65,\n                                        \"uid\": 27\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 574,\n                                        \"y\": 162,\n                                        \"uid\": 28,\n                                        \"state\": {\n                                            \"enabled\": true\n                                        },\n                                        \"title\": \"Z-buffer\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_shinyness_modulator\",\n                                        \"x\": 558,\n                                        \"y\": 64,\n                                        \"uid\": 31\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 470,\n                                        \"y\": 149,\n                                        \"uid\": 32,\n                                        \"dsid\": 3,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"9\": 0\n                                            },\n                                            \"output_sids\": {\n                                                \"12\": 2\n                                            }\n                                        },\n                                        \"title\": \"min max calc\",\n                                        \"graph\": {\n                                            \"node_uid\": 13,\n                                            \"uid\": 7,\n                                            \"parent_uid\": 6,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 27,\n                                                    \"y\": 190,\n                                                    \"uid\": 2,\n                                                    \"state\": {\n                                                        \"val\": 10\n                                                    },\n                                                    \"title\": \"Maximum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"subtract_modulator\",\n                                                    \"x\": 144,\n                                                    \"y\": 65,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"absolute_modulator\",\n                                                    \"x\": 232,\n                                                    \"y\": 65,\n                                                    \"uid\": 4\n                                                },\n                                                {\n                                                    \"plugin\": \"multiply_modulator\",\n                                                    \"x\": 319,\n                                                    \"y\": 45,\n                                                    \"uid\": 5\n                                                },\n                                                {\n                                                    \"plugin\": \"add_modulator\",\n                                                    \"x\": 401,\n                                                    \"y\": 122,\n                                                    \"uid\": 7\n                                                },\n                                                {\n                                                    \"plugin\": \"min_modulator\",\n                                                    \"x\": 143,\n                                                    \"y\": 142,\n                                                    \"uid\": 8\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 248,\n                                                    \"y\": 9,\n                                                    \"uid\": 9,\n                                                    \"dsid\": 21,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 10,\n                                                    \"y\": 85,\n                                                    \"uid\": 11,\n                                                    \"state\": {\n                                                        \"val\": 0\n                                                    },\n                                                    \"title\": \"Minimum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 486,\n                                                    \"y\": 122,\n                                                    \"uid\": 12,\n                                                    \"dsid\": 21,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 4,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 4,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 7,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 8,\n                                                    \"dst_nuid\": 7,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 9,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 7,\n                                                    \"dst_nuid\": 12,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 2,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 426,\n                                        \"y\": 241,\n                                        \"uid\": 34,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"shinyness\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_double_sided_modulator\",\n                                        \"x\": 437,\n                                        \"y\": 61,\n                                        \"uid\": 35\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 362,\n                                        \"y\": 146,\n                                        \"uid\": 36,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Double-sided\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_ambient_color_modulator\",\n                                        \"x\": 290,\n                                        \"y\": 73,\n                                        \"uid\": 37\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 63,\n                                        \"y\": 153,\n                                        \"uid\": 39,\n                                        \"dsid\": 24,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 60,\n                                        \"y\": 202,\n                                        \"uid\": 40,\n                                        \"dsid\": 24,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 63,\n                                        \"y\": 250,\n                                        \"uid\": 41,\n                                        \"dsid\": 24,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 170,\n                                        \"y\": 166,\n                                        \"uid\": 43\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 58,\n                                        \"y\": 70,\n                                        \"uid\": 44,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 27,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 28,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 31,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 32,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 34,\n                                        \"dst_nuid\": 32,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 35,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 36,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 37,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 39,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 40,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 41,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 43,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 44,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"alpha\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"blend mode\",\n                                    \"dt\": 0,\n                                    \"uid\": 8,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"shinyness\",\n                                    \"dt\": 0,\n                                    \"uid\": 10,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 12,\n                                    \"index\": 6,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 13,\n                                    \"index\": 7,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 14,\n                                    \"index\": 8,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 16,\n                                    \"index\": 9,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 305,\n                            \"y\": 349,\n                            \"uid\": 82,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 378,\n                            \"y\": 349,\n                            \"uid\": 83,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Saturation\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 457,\n                            \"y\": 349,\n                            \"uid\": 84,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Luminosity\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 538,\n                            \"y\": 349,\n                            \"uid\": 85,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Alpha\"\n                        },\n                        {\n                            \"plugin\": \"blend_mode_generator\",\n                            \"x\": 459,\n                            \"y\": 415,\n                            \"uid\": 86,\n                            \"state\": {\n                                \"mode\": 4\n                            }\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 378,\n                            \"y\": 415,\n                            \"uid\": 87,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Shinyness\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 337,\n                            \"y\": 487,\n                            \"uid\": 88,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Ambient Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 429,\n                            \"y\": 487,\n                            \"uid\": 89,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Ambient Sat\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 517,\n                            \"y\": 487,\n                            \"uid\": 90,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Ambient Lum\"\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 108,\n                            \"y\": 425,\n                            \"uid\": 91,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"material\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 12,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 20,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 82,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 83,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 84,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 85,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 86,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 87,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 90,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 8,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 89,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 7,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 88,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 6,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 81,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 91,\n                            \"dst_nuid\": 81,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 9,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"material\",\n                        \"dt\": 12,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"material_texture_modulator\",\n                \"x\": 377,\n                \"y\": 433,\n                \"uid\": 1\n            },\n            {\n                \"plugin\": \"url_texture_generator\",\n                \"x\": 237,\n                \"y\": 540,\n                \"uid\": 2,\n                \"state\": {\n                    \"url\": \"/data/image/57422df4c11a76d5531ef36299d5d1ac5b6b6739.jpg\"\n                }\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 1,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 2,\n                \"dst_nuid\": 1,\n                \"src_slot\": 0,\n                \"dst_slot\": 2\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/_add-360-photo.json",
    "content": "{\"abs_t\":0,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":604,\"y\":248,\"uid\":\"cNMzg6ZebEEa\",\"state\":{\"always_update\":true,\"input_sids\":{\"awmP4ZwsSMnT\":\"lOz0fKTfMesH\"},\"output_sids\":{\"SnxfNPCbY2mR\":\"mh0rTKkFm0nD\"}},\"title\":\"360 photo\",\"graph\":{\"uid\":\"JLwFxpJQvpmz\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1252,\"y\":373,\"uid\":\"5YK7zqzaQmRU\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1438,\"y\":405,\"uid\":\"SnxfNPCbY2mR\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_material\",\"x\":974,\"y\":130,\"uid\":\"E6GQa92x5pH2\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":723,\"y\":214,\"uid\":\"p4MDf2dd79VV\",\"state\":{\"val\":1},\"title\":\"Side\"},{\"plugin\":\"three_uv_modifier\",\"x\":553,\"y\":87,\"uid\":\"wbJUnuvQTjn3\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":297,\"y\":197,\"uid\":\"VRgvdcbdUS9b\",\"state\":{\"val\":-1},\"title\":\"X repeat photo\"},{\"plugin\":\"input_proxy\",\"x\":321,\"y\":122,\"uid\":\"awmP4ZwsSMnT\",\"title\":\"texture\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"q2TtZnBOutlf\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_geometry_sphere\",\"x\":939,\"y\":467,\"uid\":\"5qVqPcEVJEWC\"},{\"plugin\":\"const_float_generator\",\"x\":675,\"y\":421,\"uid\":\"Cs6w6VnJvkgZ\",\"state\":{\"val\":30},\"title\":\"Radius\"},{\"plugin\":\"const_float_generator\",\"x\":676,\"y\":502,\"uid\":\"PQmxHFMSJVVK\",\"state\":{\"val\":40},\"title\":\"Width Segments\"},{\"plugin\":\"const_float_generator\",\"x\":674,\"y\":584,\"uid\":\"Em9GEsFss32z\",\"state\":{\"val\":40},\"title\":\"Height Segments\"},{\"plugin\":\"toggle_button\",\"x\":724,\"y\":292,\"uid\":\"W58En5EDdYgg\",\"state\":{\"enabled\":false},\"title\":\"Fog\"},{\"plugin\":\"slider_float_generator\",\"x\":301,\"y\":298,\"uid\":\"yCR996fEsESU\",\"state\":{\"val\":0.25,\"min\":0,\"max\":1}},{\"plugin\":\"photosphere_orientation_reader\",\"x\":671,\"y\":380,\"uid\":\"4chWNjA3cFaS\",\"open\":false,\"state\":{}}],\"conns\":[{\"src_nuid\":\"5YK7zqzaQmRU\",\"dst_nuid\":\"SnxfNPCbY2mR\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"TGnMec39tCeh\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"E6GQa92x5pH2\",\"dst_nuid\":\"5YK7zqzaQmRU\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"XmKQWrQX45Zj\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"p4MDf2dd79VV\",\"dst_nuid\":\"E6GQa92x5pH2\",\"src_slot\":\"value\",\"dst_slot\":\"side\",\"uid\":\"EFULGrMBWWfN\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"wbJUnuvQTjn3\",\"dst_nuid\":\"E6GQa92x5pH2\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"dqG7My9zp2B9\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"VRgvdcbdUS9b\",\"dst_nuid\":\"wbJUnuvQTjn3\",\"src_slot\":\"value\",\"dst_slot\":\"u repeat\",\"uid\":\"v5STSCRuqFRC\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"awmP4ZwsSMnT\",\"dst_nuid\":\"wbJUnuvQTjn3\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"eVy29jkNpxwb\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"Cs6w6VnJvkgZ\",\"dst_nuid\":\"5qVqPcEVJEWC\",\"src_slot\":\"value\",\"dst_slot\":\"radius\",\"uid\":\"FXu5dMUwAcKh\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"PQmxHFMSJVVK\",\"dst_nuid\":\"5qVqPcEVJEWC\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"JcSJvMhcSQUG\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Em9GEsFss32z\",\"dst_nuid\":\"5qVqPcEVJEWC\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"QDRHtFtNm5tC\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5qVqPcEVJEWC\",\"dst_nuid\":\"5YK7zqzaQmRU\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"4p3upjnwcFCp\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"W58En5EDdYgg\",\"dst_nuid\":\"E6GQa92x5pH2\",\"src_slot\":\"bool\",\"dst_slot\":\"fog\",\"uid\":\"QXd38cZG446y\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"yCR996fEsESU\",\"dst_nuid\":\"wbJUnuvQTjn3\",\"src_slot\":\"value\",\"dst_slot\":\"u offset\",\"uid\":\"u5sXAbbt9cp2\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"awmP4ZwsSMnT\",\"dst_nuid\":\"4chWNjA3cFaS\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"tMH27GLPnHKV\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"4chWNjA3cFaS\",\"dst_nuid\":\"5YK7zqzaQmRU\",\"src_slot\":\"rotation\",\"dst_slot\":\"rotation\",\"uid\":\"rPjNQp8Ze87C\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"texture\",\"dt\":2,\"index\":0,\"uid\":\"lOz0fKTfMesH\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":false}]},{\"plugin\":\"url_texture_generator\",\"x\":334,\"y\":219,\"uid\":\"Nvqv5tqCzTdz\",\"state\":{\"url\":\"/data/image/32046a219d7cb0c4a7b3d46f0b16ee9a77791192.png\"}}],\"conns\":[{\"src_nuid\":\"Nvqv5tqCzTdz\",\"dst_nuid\":\"cNMzg6ZebEEa\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"PtdeCHJjDCC5\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]}}\n"
  },
  {
    "path": "browser/patches/_add-3d-model.json",
    "content": "{\"abs_t\":31.491,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":441,\"y\":172,\"uid\":\"dGUhrR3y0Ugh\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"hqMOmKyCUHxE\":\"Ys30r7aVEks1\"}},\"title\":\"3D model\",\"graph\":{\"uid\":\"FwFVVKYAaxEY\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_loader_model\",\"x\":321,\"y\":234,\"uid\":\"20BsetSGKAXF\",\"state\":{\"url\":\"/data/scene/flamingo/flamingo.js\"}},{\"plugin\":\"three_mesh\",\"x\":687,\"y\":203,\"uid\":\"HfckSNLLNC1p\",\"open\":false,\"state\":{\"position\":{\"x\":0,\"y\":0.890837835382039,\"z\":0},\"scale\":{\"x\":0.0094948370835134,\"y\":0.0094948370835134,\"z\":0.0094948370835134},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":883,\"y\":205,\"uid\":\"hqMOmKyCUHxE\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]}],\"conns\":[{\"src_nuid\":\"20BsetSGKAXF\",\"dst_nuid\":\"HfckSNLLNC1p\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"qPPdkXfIwHIU\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"HfckSNLLNC1p\",\"dst_nuid\":\"hqMOmKyCUHxE\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"iT2wKJhju6fa\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"20BsetSGKAXF\",\"dst_nuid\":\"HfckSNLLNC1p\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"6z9Y75hrq8Jp\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}"
  },
  {
    "path": "browser/patches/_add-ambient-light.json",
    "content": "{\"abs_t\":768.069,\"active_graph\":\"root\",\"graph_uid\":\"F2SOwIkvCgXj\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"nodes\":[{\"plugin\":\"graph\",\"x\":240,\"y\":220,\"uid\":\"NQrb7p4ATQRp\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"1NSaWIRpIXTj\":\"547odbJKrTzG\"}},\"title\":\"Ambient light\",\"graph\":{\"uid\":\"MEBE1ALZUwwN\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":1110,\"y\":223,\"uid\":\"1NSaWIRpIXTj\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"vSy6Gj4JSPYs\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_ambient_light\",\"x\":810,\"y\":179,\"uid\":\"O71ojlBOwFCs\"},{\"plugin\":\"color_picker\",\"x\":481,\"y\":186,\"uid\":\"XBbrlsNMQmrO\",\"state\":{\"hue\":0,\"sat\":0.79,\"lum\":0.22999999999999998}}],\"conns\":[{\"src_nuid\":\"O71ojlBOwFCs\",\"dst_nuid\":\"1NSaWIRpIXTj\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"sUTFPxvnlDzH\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"XBbrlsNMQmrO\",\"dst_nuid\":\"O71ojlBOwFCs\",\"src_slot\":\"color\",\"dst_slot\":\"color\",\"uid\":\"vzWfEdxMadPI\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"547odbJKrTzG\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}"
  },
  {
    "path": "browser/patches/_add-box.json",
    "content": "{\"abs_t\":144.629,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"entity\",\"x\":457,\"y\":162,\"uid\":\"eLEA6x6YxKPr\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"fNHswe8pTzEQ\":\"mh0rTKkFm0nD\"}},\"title\":\"Box\",\"graph\":{\"uid\":\"GUfwJdYq7VRA\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_geometry_box\",\"x\":883,\"y\":690,\"uid\":\"MpLAkfW5KF6E\"},{\"plugin\":\"three_mesh\",\"x\":1254,\"y\":337,\"uid\":\"9mUDpEbgVPFQ\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1444,\"y\":331,\"uid\":\"fNHswe8pTzEQ\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":546,\"y\":151,\"uid\":\"Gyu3Cngfzeyv\",\"state\":{\"url\":\"/data/image/7cbc45195c04d1595c43be42418755520068c72e.png\"},\"title\":\"Box texture\"},{\"plugin\":\"three_material_phong\",\"open\":false,\"x\":878,\"y\":205,\"uid\":\"RGbtcdNzPhXj\"}],\"conns\":[{\"src_nuid\":\"9mUDpEbgVPFQ\",\"dst_nuid\":\"fNHswe8pTzEQ\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"CtRbrA2K4BWA\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"MpLAkfW5KF6E\",\"dst_nuid\":\"9mUDpEbgVPFQ\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"RPDYS3ZKXnhY\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Gyu3Cngfzeyv\",\"dst_nuid\":\"RGbtcdNzPhXj\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"GeYcfxLeYX2G\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"RGbtcdNzPhXj\",\"dst_nuid\":\"9mUDpEbgVPFQ\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"F3V4XBKDK8zH\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}"
  },
  {
    "path": "browser/patches/_add-cylinder.json",
    "content": "{\"abs_t\":357.565,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":563,\"y\":268,\"uid\":\"PpshTsypPpWG\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"99T9SYYvKdzn\":\"mh0rTKkFm0nD\"}},\"title\":\"Cylinder\",\"graph\":{\"uid\":\"7QdDZcCUYBTn\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1187,\"y\":356,\"uid\":\"gbXLvUzQx3NN\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1386,\"y\":355,\"uid\":\"99T9SYYvKdzn\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":392,\"y\":73,\"uid\":\"kcYBed9XmRnQ\",\"state\":{\"url\":\"/data/image/7cbc45195c04d1595c43be42418755520068c72e.png\"},\"title\":\"Texture\"},{\"plugin\":\"three_material_phong\",\"x\":759,\"y\":91,\"uid\":\"SyqMKmPREwZf\"},{\"plugin\":\"const_float_generator\",\"x\":277,\"y\":397,\"uid\":\"nMdEAK8h3skr\",\"state\":{\"val\":1},\"title\":\"Height\"},{\"plugin\":\"const_float_generator\",\"x\":557,\"y\":522,\"uid\":\"YfsWeDtxaGtU\",\"state\":{\"val\":1},\"title\":\"Radius\"},{\"plugin\":\"three_geometry_cylinder\",\"x\":759,\"y\":551,\"uid\":\"tzSeXzzpTU7x\"},{\"plugin\":\"const_float_generator\",\"x\":297,\"y\":575,\"uid\":\"A4Xvy7A4ppbp\",\"state\":{\"val\":1},\"title\":\"Height segments\"},{\"plugin\":\"const_float_generator\",\"x\":284,\"y\":488,\"uid\":\"DAzCeneuSsaZ\",\"state\":{\"val\":64},\"title\":\"Radius Segments\"},{\"plugin\":\"toggle_button\",\"x\":320,\"y\":662,\"uid\":\"BcLZKZQ7jm7b\",\"state\":{\"enabled\":false},\"title\":\"Open Ended ?\"}],\"conns\":[{\"src_nuid\":\"gbXLvUzQx3NN\",\"dst_nuid\":\"99T9SYYvKdzn\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"L7s77wgR6YQf\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"kcYBed9XmRnQ\",\"dst_nuid\":\"SyqMKmPREwZf\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"GHZ2HJDhQpsf\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"SyqMKmPREwZf\",\"dst_nuid\":\"gbXLvUzQx3NN\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"gqPd6UHH9AGU\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"tzSeXzzpTU7x\",\"dst_nuid\":\"gbXLvUzQx3NN\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"HtY8Y6StESSf\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"YfsWeDtxaGtU\",\"dst_nuid\":\"tzSeXzzpTU7x\",\"src_slot\":\"value\",\"dst_slot\":\"radiusTop\",\"uid\":\"y84d5C9XcFms\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"YfsWeDtxaGtU\",\"dst_nuid\":\"tzSeXzzpTU7x\",\"src_slot\":\"value\",\"dst_slot\":\"radiusBottom\",\"uid\":\"GpE29UssuQX7\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"nMdEAK8h3skr\",\"dst_nuid\":\"tzSeXzzpTU7x\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"GBVLr3Tkm9YU\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"A4Xvy7A4ppbp\",\"dst_nuid\":\"tzSeXzzpTU7x\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"7Z638zSVtpwR\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"DAzCeneuSsaZ\",\"dst_nuid\":\"tzSeXzzpTU7x\",\"src_slot\":\"value\",\"dst_slot\":\"radiusSegments\",\"uid\":\"4nWj8EAd2fvH\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"BcLZKZQ7jm7b\",\"dst_nuid\":\"tzSeXzzpTU7x\",\"src_slot\":\"bool\",\"dst_slot\":\"openEnded\",\"uid\":\"hKAuvUFK2vgb\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}"
  },
  {
    "path": "browser/patches/_add-directional-light.json",
    "content": "{\"abs_t\":573.637,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":708,\"y\":331,\"uid\":\"ksxrAudWHG44\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"a9CTd7P6Ydtk\":\"547odbJKrTzG\"}},\"title\":\"Directional light\",\"graph\":{\"uid\":\"jW3JJfyGAJ2n\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":1110,\"y\":223,\"uid\":\"a9CTd7P6Ydtk\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"vSy6Gj4JSPYs\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":304,\"y\":295,\"uid\":\"nPGfweNeNqWx\",\"state\":{\"val\":1},\"title\":\"Intensity\"},{\"plugin\":\"three_directional_light\",\"x\":877,\"y\":274,\"uid\":\"hZ62Har5UPNg\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}}],\"conns\":[{\"src_nuid\":\"nPGfweNeNqWx\",\"dst_nuid\":\"hZ62Har5UPNg\",\"src_slot\":\"value\",\"dst_slot\":\"intensity\",\"uid\":\"rw2SbJ7gH9uU\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"hZ62Har5UPNg\",\"dst_nuid\":\"a9CTd7P6Ydtk\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"tbUNWQvc5ej6\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"547odbJKrTzG\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}"
  },
  {
    "path": "browser/patches/_add-dodecahedron.json",
    "content": "{\"abs_t\":237.182,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":591,\"y\":378,\"uid\":\"KN7qWDuACMtT\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"TYhH63eWNPHR\":\"mh0rTKkFm0nD\"}},\"title\":\"Dodecahedron\",\"graph\":{\"uid\":\"SGHsV6FCaQSx\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1078,\"y\":402,\"uid\":\"deadv7NhKevb\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1322,\"y\":442,\"uid\":\"TYhH63eWNPHR\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":523,\"y\":159,\"uid\":\"es9SXtvYXkCF\",\"state\":{\"url\":\"/data/image/7cbc45195c04d1595c43be42418755520068c72e.png\"},\"title\":\"Texture\"},{\"plugin\":\"three_material_phong\",\"x\":762,\"y\":171,\"uid\":\"3bv8HmmAYKWR\"},{\"plugin\":\"const_float_generator\",\"x\":581,\"y\":734,\"uid\":\"XKT9szYBWVwd\",\"state\":{\"val\":0},\"title\":\"Detail\"},{\"plugin\":\"three_geometry_dodecahedron\",\"x\":753,\"y\":642,\"uid\":\"vdpquuBgA5sV\"},{\"plugin\":\"const_float_generator\",\"x\":580,\"y\":611,\"uid\":\"qEV7eez9mHCX\",\"state\":{\"val\":1},\"title\":\"Radius\"}],\"conns\":[{\"src_nuid\":\"deadv7NhKevb\",\"dst_nuid\":\"TYhH63eWNPHR\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"nCzh9jhVLWXB\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"es9SXtvYXkCF\",\"dst_nuid\":\"3bv8HmmAYKWR\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"Xb2Fmt5Z5bMU\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"3bv8HmmAYKWR\",\"dst_nuid\":\"deadv7NhKevb\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"3JgYPGABhnsc\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"vdpquuBgA5sV\",\"dst_nuid\":\"deadv7NhKevb\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"UnKAhsrzGQkD\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"XKT9szYBWVwd\",\"dst_nuid\":\"vdpquuBgA5sV\",\"src_slot\":\"value\",\"dst_slot\":\"detail\",\"uid\":\"L8gRmzRGwjTE\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"qEV7eez9mHCX\",\"dst_nuid\":\"vdpquuBgA5sV\",\"src_slot\":\"value\",\"dst_slot\":\"radius\",\"uid\":\"wpEAZzxRKAkh\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}"
  },
  {
    "path": "browser/patches/_add-floor.json",
    "content": "{\"abs_t\":1814.986,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":596,\"y\":344,\"uid\":\"TytYs7o6qFrI\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"UIK7rZC97h3v\":\"mh0rTKkFm0nD\"}},\"title\":\"Floor\",\"graph\":{\"uid\":\"BlNdO1aDXTMH\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":937,\"y\":235,\"uid\":\"YVKldc2mrHNN\",\"open\":false,\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1121,\"y\":236,\"uid\":\"UIK7rZC97h3v\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":177,\"y\":56,\"uid\":\"XyJRCGbYVK8Y\",\"state\":{\"url\":\"/data/image/ac491bcfd05a3ecf1315577d8eee830167fea233.png\"},\"title\":\"Box texture\"},{\"plugin\":\"three_material_phong\",\"x\":632,\"y\":176,\"uid\":\"sEponEvkFzs0\",\"open\":false},{\"plugin\":\"three_geometry_plane\",\"x\":733,\"y\":313,\"uid\":\"3dGuNNTsfzRj\",\"open\":false},{\"plugin\":\"three_uv_modifier\",\"x\":429,\"y\":176,\"uid\":\"xhUTz8qk89Mf\",\"open\":false},{\"plugin\":\"const_float_generator\",\"x\":236,\"y\":268,\"uid\":\"1DgdsTeinJUe\",\"state\":{\"val\":64}}],\"conns\":[{\"src_nuid\":\"YVKldc2mrHNN\",\"dst_nuid\":\"UIK7rZC97h3v\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"XN2Lk67XyRuk\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"sEponEvkFzs0\",\"dst_nuid\":\"YVKldc2mrHNN\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"fpyYmdQUFI3L\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"3dGuNNTsfzRj\",\"dst_nuid\":\"YVKldc2mrHNN\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"W3Zxa1IfhmOj\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"XyJRCGbYVK8Y\",\"dst_nuid\":\"xhUTz8qk89Mf\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"EALUab4w8FvI\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"xhUTz8qk89Mf\",\"dst_nuid\":\"sEponEvkFzs0\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"YYhwgHaEYXdl\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"1DgdsTeinJUe\",\"dst_nuid\":\"xhUTz8qk89Mf\",\"src_slot\":\"value\",\"dst_slot\":\"u repeat\",\"uid\":\"hvUCGLe3Soql\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"1DgdsTeinJUe\",\"dst_nuid\":\"xhUTz8qk89Mf\",\"src_slot\":\"value\",\"dst_slot\":\"v repeat\",\"uid\":\"r2ME2LpluGOB\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}"
  },
  {
    "path": "browser/patches/_add-hemisphere-light.json",
    "content": "{\"abs_t\":0,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":416,\"y\":511,\"uid\":\"Skrn6WL9nSrc\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"pfrqCuruhQ7Z\":\"5VCBtB7FNE6K\"}},\"title\":\"Hemisphere light\",\"graph\":{\"uid\":\"4FJHgUJGkabm\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":1130,\"y\":255,\"uid\":\"pfrqCuruhQ7Z\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"wr3tnpu9Vuge\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_hemisphere_light\",\"x\":791,\"y\":261,\"uid\":\"aWhyKDcXPpSt\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1},\"pivot\":{\"x\":0,\"y\":0,\"z\":0}}},{\"plugin\":\"vector\",\"x\":501,\"y\":625,\"uid\":\"TFpLnRYvzqGY\",\"open\":false},{\"plugin\":\"const_float_generator\",\"x\":299,\"y\":623,\"uid\":\"EkbheqMyx9Eb\",\"open\":false,\"state\":{\"val\":1}},{\"plugin\":\"color_picker\",\"x\":422,\"y\":61,\"uid\":\"MVRLT6UQTY7P\",\"state\":{\"hue\":0.44382134831460673,\"sat\":0.2247191011235955,\"lum\":0.975},\"title\":\"sky color\"},{\"plugin\":\"color_picker\",\"x\":424,\"y\":314,\"uid\":\"ePKM8rJjsF2x\",\"state\":{\"hue\":0.44382134831460673,\"sat\":0.19101123595505617,\"lum\":0.29166666666666663},\"title\":\"ground color\"}],\"conns\":[{\"src_nuid\":\"aWhyKDcXPpSt\",\"dst_nuid\":\"pfrqCuruhQ7Z\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"J4Cq3CVnCKwU\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"TFpLnRYvzqGY\",\"dst_nuid\":\"aWhyKDcXPpSt\",\"src_slot\":\"vector\",\"dst_slot\":\"position\",\"uid\":\"jR2srEunGU7a\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"EkbheqMyx9Eb\",\"dst_nuid\":\"TFpLnRYvzqGY\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"DtbQJ4L3WeHg\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"MVRLT6UQTY7P\",\"dst_nuid\":\"aWhyKDcXPpSt\",\"src_slot\":\"color\",\"dst_slot\":\"color\",\"uid\":\"a9RQU98MBJjj\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ePKM8rJjsF2x\",\"dst_nuid\":\"aWhyKDcXPpSt\",\"src_slot\":\"color\",\"dst_slot\":\"groundColor\",\"uid\":\"6wBeFserC3cS\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"5VCBtB7FNE6K\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}"
  },
  {
    "path": "browser/patches/_add-particle-emitter.json",
    "content": "{\"abs_t\":1245.138,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":483,\"y\":249,\"uid\":\"Lx6FI6LiESQ8\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"iznPjAkiDy5R\":\"deUvDlZx96Z4\"}},\"title\":\"Particle emitter\",\"graph\":{\"uid\":\"Bz3CyAcybJY7\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_particle_emitter\",\"x\":1088,\"y\":304,\"uid\":\"FoAqpYNhw8od\",\"open\":false},{\"plugin\":\"three_point_cloud_mesh\",\"x\":1333,\"y\":659,\"uid\":\"NBMGwm5lD7Rr\",\"open\":false,\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":0.12093798582984594,\"y\":0.12093798582984594,\"z\":0.12093798582984594},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"const_float_generator\",\"x\":514,\"y\":123,\"uid\":\"NngsNj3WHuTM\",\"state\":{\"val\":500},\"title\":\"Particle count\"},{\"plugin\":\"const_float_generator\",\"x\":852,\"y\":36,\"uid\":\"G7unM7sbtA0L\",\"state\":{\"val\":4},\"title\":\"Lifetime\"},{\"plugin\":\"three_point_cloud_material\",\"x\":1021,\"y\":1070,\"uid\":\"kQdMAy3wQeUC\",\"open\":false},{\"plugin\":\"const_float_generator\",\"x\":344,\"y\":36,\"uid\":\"hU5LQRrRzka5\",\"state\":{\"val\":0.1},\"title\":\"Size\"},{\"plugin\":\"url_texture_generator\",\"x\":291,\"y\":163,\"uid\":\"2PGkLSB2JG8x\",\"state\":{\"url\":\"/data/image/ba5501028e190cbd9bf920cb20a0509c37fc18b7.png\"}},{\"plugin\":\"toggle_button\",\"x\":749,\"y\":1161,\"uid\":\"qJAJTGsbtS8X\",\"open\":false,\"state\":{\"enabled\":true},\"title\":\"Transparent\"},{\"plugin\":\"const_float_generator\",\"x\":747,\"y\":1229,\"uid\":\"NY0DdXTkO1HG\",\"open\":false,\"state\":{\"val\":2},\"title\":\"Blending\"},{\"plugin\":\"const_float_generator\",\"x\":395,\"y\":362,\"uid\":\"PKY7loh5peSI\",\"state\":{\"val\":0},\"title\":\"Direction X\"},{\"plugin\":\"const_float_generator\",\"x\":394,\"y\":440,\"uid\":\"sDpdW2z1jQPv\",\"state\":{\"val\":1},\"title\":\"Direction Y\"},{\"plugin\":\"const_float_generator\",\"x\":393,\"y\":528,\"uid\":\"ahXkF2xyApP9\",\"state\":{\"val\":0},\"title\":\"Direction Z\"},{\"plugin\":\"vector\",\"x\":661,\"y\":406,\"uid\":\"p3r4I3eAXaHU\",\"open\":false,\"title\":\"Direction\"},{\"plugin\":\"const_float_generator\",\"x\":713,\"y\":35,\"uid\":\"3cq7HxBW0l2H\",\"state\":{\"val\":0.1},\"title\":\"Speed\"},{\"plugin\":\"const_float_generator\",\"x\":708,\"y\":239,\"uid\":\"pvqbqenLQ0vn\",\"state\":{\"val\":0.4},\"title\":\"Spread\"},{\"plugin\":\"const_float_generator\",\"x\":514,\"y\":239,\"uid\":\"208WZhA7KCeb\",\"state\":{\"val\":0.1},\"title\":\"Spawn rate\"},{\"plugin\":\"const_float_generator\",\"x\":396,\"y\":622,\"uid\":\"7gsqq6vac89r\",\"state\":{\"val\":0},\"title\":\"Gravity X\"},{\"plugin\":\"const_float_generator\",\"x\":395,\"y\":707,\"uid\":\"EwCNH5avikLB\",\"state\":{\"val\":-0.04},\"title\":\"Gravity Y\"},{\"plugin\":\"const_float_generator\",\"x\":394,\"y\":788,\"uid\":\"fRAwFmX0ab2W\",\"state\":{\"val\":0},\"title\":\"Gravity Z\"},{\"plugin\":\"vector\",\"x\":659,\"y\":709,\"uid\":\"hCY2zoW7ueh1\",\"open\":false,\"title\":\"Gravity\"},{\"plugin\":\"const_float_generator\",\"x\":889,\"y\":236,\"uid\":\"227LtN5DoMeP\",\"state\":{\"val\":0},\"title\":\"Noise\"},{\"plugin\":\"toggle_button\",\"x\":753,\"y\":1073,\"uid\":\"Bak4sT4lGkvi\",\"open\":false,\"state\":{\"enabled\":false},\"title\":\"DepthTest\"},{\"plugin\":\"output_proxy\",\"x\":1521,\"y\":660,\"uid\":\"iznPjAkiDy5R\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"cDIv1wXVwWo7\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"convert_hsl_color_modulator\",\"x\":733,\"y\":999,\"uid\":\"vKeSqSv2EiBY\",\"open\":false},{\"plugin\":\"knob_float_generator\",\"x\":395,\"y\":1072,\"uid\":\"5VREvs0v1BpH\",\"state\":{\"val\":0},\"title\":\"Hue\"},{\"plugin\":\"knob_float_generator\",\"x\":392,\"y\":1170,\"uid\":\"TQOmx5DBlgi9\",\"state\":{\"val\":0.7700000000000002},\"title\":\"Saturation\"},{\"plugin\":\"knob_float_generator\",\"x\":388,\"y\":1266,\"uid\":\"3qd9x7Erowy8\",\"state\":{\"val\":1},\"title\":\"Luminosity\"},{\"plugin\":\"knob_float_generator\",\"x\":394,\"y\":966,\"uid\":\"mxmt9W19gG4G\",\"state\":{\"val\":1},\"title\":\"Opacity\"}],\"conns\":[{\"src_nuid\":\"NngsNj3WHuTM\",\"dst_nuid\":\"FoAqpYNhw8od\",\"src_slot\":\"value\",\"dst_slot\":\"particle count\",\"uid\":\"rhm21ytcOG2i\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"208WZhA7KCeb\",\"dst_nuid\":\"FoAqpYNhw8od\",\"src_slot\":\"value\",\"dst_slot\":\"spawn rate\",\"uid\":\"7xMEKOmQRNxg\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"p3r4I3eAXaHU\",\"dst_nuid\":\"FoAqpYNhw8od\",\"src_slot\":\"vector\",\"dst_slot\":\"direction\",\"uid\":\"JjqJwCQ2jDrn\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"3cq7HxBW0l2H\",\"dst_nuid\":\"FoAqpYNhw8od\",\"src_slot\":\"value\",\"dst_slot\":\"speed\",\"uid\":\"HgeHrV0E34jV\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"pvqbqenLQ0vn\",\"dst_nuid\":\"FoAqpYNhw8od\",\"src_slot\":\"value\",\"dst_slot\":\"spread\",\"uid\":\"Zsi9jo0exbSO\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"G7unM7sbtA0L\",\"dst_nuid\":\"FoAqpYNhw8od\",\"src_slot\":\"value\",\"dst_slot\":\"lifetime\",\"uid\":\"DPwkq20DRXNb\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"hCY2zoW7ueh1\",\"dst_nuid\":\"FoAqpYNhw8od\",\"src_slot\":\"vector\",\"dst_slot\":\"gravity\",\"uid\":\"dBWuFkGFYtQB\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"227LtN5DoMeP\",\"dst_nuid\":\"FoAqpYNhw8od\",\"src_slot\":\"value\",\"dst_slot\":\"noise\",\"uid\":\"E0dKbiilSqce\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"FoAqpYNhw8od\",\"dst_nuid\":\"NBMGwm5lD7Rr\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"BY05b7bgYIq3\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"kQdMAy3wQeUC\",\"dst_nuid\":\"NBMGwm5lD7Rr\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"Yei3QEwKjjra\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"2PGkLSB2JG8x\",\"dst_nuid\":\"kQdMAy3wQeUC\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"L9wG2vaCcpbF\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"hU5LQRrRzka5\",\"dst_nuid\":\"kQdMAy3wQeUC\",\"src_slot\":\"value\",\"dst_slot\":\"size\",\"uid\":\"FphnLO0n1Ey8\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Bak4sT4lGkvi\",\"dst_nuid\":\"kQdMAy3wQeUC\",\"src_slot\":\"bool\",\"dst_slot\":\"depthTest\",\"uid\":\"z6WZVeMJiJT5\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"qJAJTGsbtS8X\",\"dst_nuid\":\"kQdMAy3wQeUC\",\"src_slot\":\"bool\",\"dst_slot\":\"transparent\",\"uid\":\"cmjVtMMGzvus\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"NY0DdXTkO1HG\",\"dst_nuid\":\"kQdMAy3wQeUC\",\"src_slot\":\"value\",\"dst_slot\":\"blending\",\"uid\":\"TCjrVJyqtLtR\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"PKY7loh5peSI\",\"dst_nuid\":\"p3r4I3eAXaHU\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"Bt0W3sbRDygy\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"sDpdW2z1jQPv\",\"dst_nuid\":\"p3r4I3eAXaHU\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"Uv5l1hYuNYb8\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ahXkF2xyApP9\",\"dst_nuid\":\"p3r4I3eAXaHU\",\"src_slot\":\"value\",\"dst_slot\":\"z\",\"uid\":\"pveLWjJ3AqmS\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"7gsqq6vac89r\",\"dst_nuid\":\"hCY2zoW7ueh1\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"GgBWHuuuSjnh\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"EwCNH5avikLB\",\"dst_nuid\":\"hCY2zoW7ueh1\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"ciocs7k1ioqp\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"fRAwFmX0ab2W\",\"dst_nuid\":\"hCY2zoW7ueh1\",\"src_slot\":\"value\",\"dst_slot\":\"z\",\"uid\":\"aMZAjzkR2HK9\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"NBMGwm5lD7Rr\",\"dst_nuid\":\"iznPjAkiDy5R\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"6OrTL9AcopIh\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"vKeSqSv2EiBY\",\"dst_nuid\":\"kQdMAy3wQeUC\",\"src_slot\":\"color\",\"dst_slot\":\"color\",\"uid\":\"PpV3dcqY7XTb\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5VREvs0v1BpH\",\"dst_nuid\":\"vKeSqSv2EiBY\",\"src_slot\":\"value\",\"dst_slot\":\"hue\",\"uid\":\"T4d1B08EwlXl\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"TQOmx5DBlgi9\",\"dst_nuid\":\"vKeSqSv2EiBY\",\"src_slot\":\"value\",\"dst_slot\":\"saturation\",\"uid\":\"srISdxScGFfg\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"3qd9x7Erowy8\",\"dst_nuid\":\"vKeSqSv2EiBY\",\"src_slot\":\"value\",\"dst_slot\":\"luminosity\",\"uid\":\"s8lYieVMy3nH\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"mxmt9W19gG4G\",\"dst_nuid\":\"kQdMAy3wQeUC\",\"src_slot\":\"value\",\"dst_slot\":\"opacity\",\"uid\":\"zK8SgDTZK6LV\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"deUvDlZx96Z4\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}"
  },
  {
    "path": "browser/patches/_add-particle-geometry.json",
    "content": "{\"abs_t\":703.463,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":714,\"y\":406,\"uid\":\"bGhqhe9PdfRx\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"HXAApmVysRWm\":\"deUvDlZx96Z4\"}},\"title\":\"Particle geometry\",\"graph\":{\"uid\":\"LA44eek4D9eC\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_point_cloud_mesh\",\"x\":1343,\"y\":345,\"uid\":\"HR7JSEsfpQwa\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"three_point_cloud_material\",\"x\":1035,\"y\":406,\"uid\":\"GCa6WUMcSP5S\"},{\"plugin\":\"toggle_button\",\"x\":791,\"y\":639,\"uid\":\"SDS5KCgk7PPQ\",\"state\":{\"enabled\":true},\"title\":\"Transparent\"},{\"plugin\":\"const_float_generator\",\"x\":810,\"y\":811,\"uid\":\"rUe2beM6cGYr\",\"state\":{\"val\":2},\"title\":\"Blending\"},{\"plugin\":\"toggle_button\",\"x\":799,\"y\":722,\"uid\":\"CXXBHNQzDMY9\",\"state\":{\"enabled\":false},\"title\":\"DepthTest\"},{\"plugin\":\"output_proxy\",\"x\":1685,\"y\":350,\"uid\":\"HXAApmVysRWm\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"cDIv1wXVwWo7\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"convert_hsl_color_modulator\",\"x\":854,\"y\":440,\"uid\":\"pVKMQVEC6Lat\",\"open\":false},{\"plugin\":\"knob_float_generator\",\"x\":376,\"y\":412,\"uid\":\"syAdDEe8fBDN\",\"state\":{\"val\":0},\"title\":\"Hue\"},{\"plugin\":\"knob_float_generator\",\"x\":453,\"y\":411,\"uid\":\"HYQshmbHbMm8\",\"state\":{\"val\":1},\"title\":\"Saturation\"},{\"plugin\":\"knob_float_generator\",\"x\":612,\"y\":410,\"uid\":\"eHadzQaT7gab\",\"state\":{\"val\":1},\"title\":\"Luminosity\"},{\"plugin\":\"knob_float_generator\",\"x\":376,\"y\":321,\"uid\":\"bpDQNegwy7Uv\",\"state\":{\"val\":1},\"title\":\"Opacity\"},{\"plugin\":\"three_geometry_sphere\",\"x\":993,\"y\":160,\"uid\":\"VzJA4u5aWQjB\"},{\"plugin\":\"const_float_generator\",\"x\":638,\"y\":192,\"uid\":\"u2zTUKfwXVZH\",\"state\":{\"val\":64}},{\"plugin\":\"const_float_generator\",\"x\":841,\"y\":559,\"uid\":\"VpuVaUydQACH\",\"state\":{\"val\":0.01},\"title\":\"Size\"},{\"plugin\":\"url_texture_generator\",\"x\":380,\"y\":513,\"uid\":\"6Zp3haRLGXqb\",\"state\":{\"url\":\"/data/image/ba5501028e190cbd9bf920cb20a0509c37fc18b7.png\"}}],\"conns\":[{\"src_nuid\":\"GCa6WUMcSP5S\",\"dst_nuid\":\"HR7JSEsfpQwa\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"WG3P8zCRdUku\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"CXXBHNQzDMY9\",\"dst_nuid\":\"GCa6WUMcSP5S\",\"src_slot\":\"bool\",\"dst_slot\":\"depthTest\",\"uid\":\"tLQKmBQS2WJc\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"SDS5KCgk7PPQ\",\"dst_nuid\":\"GCa6WUMcSP5S\",\"src_slot\":\"bool\",\"dst_slot\":\"transparent\",\"uid\":\"AZSsfmjSJNk6\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"rUe2beM6cGYr\",\"dst_nuid\":\"GCa6WUMcSP5S\",\"src_slot\":\"value\",\"dst_slot\":\"blending\",\"uid\":\"c3LtvaHE8rjW\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"HR7JSEsfpQwa\",\"dst_nuid\":\"HXAApmVysRWm\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"jBj4SjQ7JCwE\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"pVKMQVEC6Lat\",\"dst_nuid\":\"GCa6WUMcSP5S\",\"src_slot\":\"color\",\"dst_slot\":\"color\",\"uid\":\"fB3WsSzPnajj\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"syAdDEe8fBDN\",\"dst_nuid\":\"pVKMQVEC6Lat\",\"src_slot\":\"value\",\"dst_slot\":\"hue\",\"uid\":\"uAKJe2BbnY6P\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"HYQshmbHbMm8\",\"dst_nuid\":\"pVKMQVEC6Lat\",\"src_slot\":\"value\",\"dst_slot\":\"saturation\",\"uid\":\"rUGXTyTByQnz\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"eHadzQaT7gab\",\"dst_nuid\":\"pVKMQVEC6Lat\",\"src_slot\":\"value\",\"dst_slot\":\"luminosity\",\"uid\":\"T9Ldb4RjCErG\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"bpDQNegwy7Uv\",\"dst_nuid\":\"GCa6WUMcSP5S\",\"src_slot\":\"value\",\"dst_slot\":\"opacity\",\"uid\":\"ckUpZLkCcAvp\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"VzJA4u5aWQjB\",\"dst_nuid\":\"HR7JSEsfpQwa\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"b2yhTrZBZnsL\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"u2zTUKfwXVZH\",\"dst_nuid\":\"VzJA4u5aWQjB\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"eVMq8wwWM9A7\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"u2zTUKfwXVZH\",\"dst_nuid\":\"VzJA4u5aWQjB\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"avKB5TtduuXR\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"VpuVaUydQACH\",\"dst_nuid\":\"GCa6WUMcSP5S\",\"src_slot\":\"value\",\"dst_slot\":\"size\",\"uid\":\"9pWBxGYPLwEx\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"6Zp3haRLGXqb\",\"dst_nuid\":\"GCa6WUMcSP5S\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"gAWj9vZmcs7P\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"deUvDlZx96Z4\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}"
  },
  {
    "path": "browser/patches/_add-plane-no-shading.json",
    "content": "{\"abs_t\":275.925,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":773,\"y\":398,\"uid\":\"sH5Q9QtkUnPk\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"XStnefVKjgfK\":\"mh0rTKkFm0nD\"}},\"title\":\"Plane (not shaded)\",\"graph\":{\"uid\":\"eCgyyQZuJjGu\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1219,\"y\":454,\"uid\":\"TztxBubZhxqC\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1418,\"y\":453,\"uid\":\"XStnefVKjgfK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":468,\"y\":138,\"uid\":\"mZDdNagRpLrD\",\"state\":{\"url\":\"/data/image/7cbc45195c04d1595c43be42418755520068c72e.png\"},\"title\":\"Texture\"},{\"plugin\":\"const_float_generator\",\"x\":669,\"y\":542,\"uid\":\"dHeFLLbPpWJH\",\"state\":{\"val\":16},\"title\":\"Segments\"},{\"plugin\":\"three_geometry_plane\",\"x\":925,\"y\":466,\"uid\":\"ec2J7wjHbyzq\"},{\"plugin\":\"three_material\",\"x\":719,\"y\":90,\"uid\":\"ueR2MGGSNAgb\"},{\"plugin\":\"const_float_generator\",\"x\":664,\"y\":451,\"uid\":\"ZGBuXanp5pzG\",\"state\":{\"val\":1},\"title\":\"Width & Height\"}],\"conns\":[{\"src_nuid\":\"TztxBubZhxqC\",\"dst_nuid\":\"XStnefVKjgfK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"bVLCXJURnrZf\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"ec2J7wjHbyzq\",\"dst_nuid\":\"TztxBubZhxqC\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"Wh3skezBdHU6\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"mZDdNagRpLrD\",\"dst_nuid\":\"ueR2MGGSNAgb\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"Y7qEm2krS3Fd\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ueR2MGGSNAgb\",\"dst_nuid\":\"TztxBubZhxqC\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"NC9dnC2Kvv94\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ZGBuXanp5pzG\",\"dst_nuid\":\"ec2J7wjHbyzq\",\"src_slot\":\"value\",\"dst_slot\":\"width\",\"uid\":\"LV268xqsNWck\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ZGBuXanp5pzG\",\"dst_nuid\":\"ec2J7wjHbyzq\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"3zKApEEDywAp\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"dHeFLLbPpWJH\",\"dst_nuid\":\"ec2J7wjHbyzq\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"FMcgaLx4E3tv\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"dHeFLLbPpWJH\",\"dst_nuid\":\"ec2J7wjHbyzq\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"9KzCdHSDNcsW\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}"
  },
  {
    "path": "browser/patches/_add-point-light.json",
    "content": "{\"abs_t\":157.202,\"active_graph\":\"root\",\"graph_uid\":\"jG8ul210Feym\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"nodes\":[{\"plugin\":\"graph\",\"x\":382,\"y\":380,\"uid\":\"O8xyzxPzfIfv\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"fLBjNZOjqImx\":\"547odbJKrTzG\"}},\"title\":\"Point light\",\"graph\":{\"uid\":\"uXOZQEvlVzLa\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":1110,\"y\":223,\"uid\":\"fLBjNZOjqImx\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"vSy6Gj4JSPYs\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"slider_float_generator\",\"x\":306,\"y\":399,\"uid\":\"LAh9ouWvrhAg\",\"state\":{\"val\":1,\"min\":-1,\"max\":1},\"title\":\"X\"},{\"plugin\":\"slider_float_generator\",\"x\":306,\"y\":465,\"uid\":\"Pv9v8v3T9K25\",\"state\":{\"val\":0.06,\"min\":-1,\"max\":1},\"title\":\"Y\"},{\"plugin\":\"slider_float_generator\",\"x\":301,\"y\":532,\"uid\":\"YRcroRs76ZVv\",\"state\":{\"val\":2,\"min\":-1,\"max\":2},\"title\":\"Z\"},{\"plugin\":\"vector\",\"x\":645,\"y\":384,\"uid\":\"TmOFes2roAgE\",\"title\":\"Position\"},{\"plugin\":\"three_point_light\",\"x\":867,\"y\":322,\"uid\":\"jgVkG1a4gtyo\"},{\"plugin\":\"const_float_generator\",\"x\":304,\"y\":295,\"uid\":\"9N4joYATH9L8\",\"state\":{\"val\":1},\"title\":\"Intensity\"}],\"conns\":[{\"src_nuid\":\"LAh9ouWvrhAg\",\"dst_nuid\":\"TmOFes2roAgE\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"atvEsseSOZFX\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Pv9v8v3T9K25\",\"dst_nuid\":\"TmOFes2roAgE\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"I6gFMJgx63o9\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"YRcroRs76ZVv\",\"dst_nuid\":\"TmOFes2roAgE\",\"src_slot\":\"value\",\"dst_slot\":\"z\",\"uid\":\"LilZDlzcUNa2\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"jgVkG1a4gtyo\",\"dst_nuid\":\"fLBjNZOjqImx\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"fFbpRGwb2tc3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"TmOFes2roAgE\",\"dst_nuid\":\"jgVkG1a4gtyo\",\"src_slot\":\"vector\",\"dst_slot\":\"color\",\"uid\":\"BdZz1hTVNPTo\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"9N4joYATH9L8\",\"dst_nuid\":\"jgVkG1a4gtyo\",\"src_slot\":\"value\",\"dst_slot\":\"intensity\",\"uid\":\"7Gnn90kx8n5h\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"547odbJKrTzG\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}"
  },
  {
    "path": "browser/patches/_add-ring.json",
    "content": "{\"abs_t\":64.472,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":648,\"y\":420,\"uid\":\"Y5CzuXESNu92\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"jcNT4C6TMp52\":\"mh0rTKkFm0nD\"}},\"title\":\"Ring\",\"graph\":{\"uid\":\"gRsD4AdqG62P\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1254,\"y\":337,\"uid\":\"kZWB6EMQ6xXr\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1444,\"y\":331,\"uid\":\"jcNT4C6TMp52\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":541,\"y\":378,\"uid\":\"XBrnCQWZNzb6\",\"state\":{\"url\":\"/data/image/7cbc45195c04d1595c43be42418755520068c72e.png\"},\"title\":\"Torus texture\"},{\"plugin\":\"three_material_phong\",\"x\":871,\"y\":378,\"uid\":\"ZhyrZc2e8xmk\"},{\"plugin\":\"three_geometry_ring\",\"x\":856,\"y\":70,\"uid\":\"nC6TGB8pt2j4\"},{\"plugin\":\"const_float_generator\",\"x\":656,\"y\":840,\"uid\":\"GJLsNEYheKqT\",\"state\":{\"val\":2},\"title\":\"Side\"}],\"conns\":[{\"src_nuid\":\"kZWB6EMQ6xXr\",\"dst_nuid\":\"jcNT4C6TMp52\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"2DCxs4hXqNCN\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"XBrnCQWZNzb6\",\"dst_nuid\":\"ZhyrZc2e8xmk\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"MTKUMSwZAQu8\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ZhyrZc2e8xmk\",\"dst_nuid\":\"kZWB6EMQ6xXr\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"vgMxkcvpRDVj\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"nC6TGB8pt2j4\",\"dst_nuid\":\"kZWB6EMQ6xXr\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"T4nD5UB9aDeg\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"GJLsNEYheKqT\",\"dst_nuid\":\"ZhyrZc2e8xmk\",\"src_slot\":\"value\",\"dst_slot\":\"side\",\"uid\":\"a3W84cBdsAp8\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}"
  },
  {
    "path": "browser/patches/_add-room.json",
    "content": "{\"abs_t\":139.142,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":624,\"y\":145,\"uid\":\"LyjUUzYcQJDX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"6prUVLH8Mhzs\":\"mh0rTKkFm0nD\"}},\"title\":\"Room\",\"graph\":{\"uid\":\"kY4ASuQHXV8S\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_geometry_box\",\"x\":883,\"y\":690,\"uid\":\"9kscLz9y69au\"},{\"plugin\":\"three_mesh\",\"x\":1254,\"y\":337,\"uid\":\"3r8T4LqCWtDj\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":21.284179039880932,\"y\":11.848232853084218,\"z\":11.848232853084218},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1444,\"y\":331,\"uid\":\"6prUVLH8Mhzs\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":546,\"y\":151,\"uid\":\"hZhR2ENFEPMM\",\"state\":{\"url\":\"/data/image/7cbc45195c04d1595c43be42418755520068c72e.png\"},\"title\":\"Box texture\"},{\"plugin\":\"three_material_phong\",\"x\":878,\"y\":205,\"uid\":\"pA9kzjqBXJkC\"},{\"plugin\":\"const_float_generator\",\"x\":686,\"y\":844,\"uid\":\"AupqWu4LWeP6\",\"state\":{\"val\":1}},{\"plugin\":\"const_float_generator\",\"x\":636,\"y\":671,\"uid\":\"szVTvthU3Qzu\",\"state\":{\"val\":2}},{\"plugin\":\"annotation\",\"x\":388,\"y\":429,\"uid\":\"rXR64R6vs3pD\",\"state\":{\"text\":\"This is a big cube, and \\\"side\\\" is set to 2, meaning it renders the inside of it as well. So if the camera is inside of this, you get the illusion of being in a room.\",\"width\":150,\"height\":70},\"title\":\"Info\"}],\"conns\":[{\"src_nuid\":\"3r8T4LqCWtDj\",\"dst_nuid\":\"6prUVLH8Mhzs\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"NfGcNNLKSESt\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"9kscLz9y69au\",\"dst_nuid\":\"3r8T4LqCWtDj\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"C7smgBg6HmmG\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"hZhR2ENFEPMM\",\"dst_nuid\":\"pA9kzjqBXJkC\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"QbqRKbq6VzC8\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"pA9kzjqBXJkC\",\"dst_nuid\":\"3r8T4LqCWtDj\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"5wsLGLQg9UEp\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"szVTvthU3Qzu\",\"dst_nuid\":\"pA9kzjqBXJkC\",\"src_slot\":\"value\",\"dst_slot\":\"side\",\"uid\":\"ED8M7tCaxvPX\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}"
  },
  {
    "path": "browser/patches/_add-sky-sphere.json",
    "content": "{\"abs_t\":474.827,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":720,\"y\":337,\"uid\":\"bHgsY63zA4m5\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"Rsx2h9keR8YH\":\"mh0rTKkFm0nD\"}},\"title\":\"Sky sphere\",\"graph\":{\"uid\":\"g5jQ5LWWAAbp\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1070,\"y\":391,\"uid\":\"AqTJmpEVT23D\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":50,\"y\":50,\"z\":50},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1269,\"y\":390,\"uid\":\"Rsx2h9keR8YH\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":194,\"y\":64,\"uid\":\"SP7gGQqKYJaM\",\"state\":{\"url\":\"/data/image/7cbc45195c04d1595c43be42418755520068c72e.png\"},\"title\":\"Texture\"},{\"plugin\":\"graph\",\"x\":637,\"y\":660,\"uid\":\"p6nWamu6npQW\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"Yk8hckpSLzGL\":\"xnmIRUOwsegz\",\"mB9Mmv8uTwqY\":\"ejxO7eIJpw4m\",\"wbqdvRKD3qsR\":\"H3AwGhvcvewD\"}},\"title\":\"Position, Rotation, Scale\",\"graph\":{\"uid\":\"dzvsqtsKxusV\",\"parent_uid\":\"g5jQ5LWWAAbp\",\"open\":true,\"nodes\":[{\"plugin\":\"slider_float_generator\",\"x\":82,\"y\":105,\"uid\":\"sgKaJyRHDv7R\",\"state\":{\"val\":0,\"min\":-1,\"max\":1},\"title\":\"X\"},{\"plugin\":\"slider_float_generator\",\"x\":83,\"y\":172,\"uid\":\"zpYsqRyfrmwD\",\"state\":{\"val\":0,\"min\":-1,\"max\":1},\"title\":\"Y\"},{\"plugin\":\"slider_float_generator\",\"x\":81,\"y\":238,\"uid\":\"98Q9qJDnpdfU\",\"state\":{\"val\":0,\"min\":-1,\"max\":1},\"title\":\"Z\"},{\"plugin\":\"vector\",\"x\":585,\"y\":200,\"uid\":\"vfnUaMCY4Nt8\",\"title\":\"Position\"},{\"plugin\":\"vector\",\"x\":290,\"y\":610,\"uid\":\"xEeC9G7p4LmB\",\"title\":\"Scale\"},{\"plugin\":\"vector\",\"x\":581,\"y\":413,\"uid\":\"xnB7nxKsv5Mp\",\"title\":\"Rotation\"},{\"plugin\":\"const_float_generator\",\"x\":113,\"y\":636,\"uid\":\"sRaxKP4ex4VH\",\"state\":{\"val\":50},\"title\":\"XYZ\"},{\"plugin\":\"output_proxy\",\"x\":803,\"y\":252,\"uid\":\"Yk8hckpSLzGL\",\"title\":\"position\",\"dyn_in\":[{\"name\":\"output\",\"dt\":5,\"def\":null,\"uid\":\"S0aurqIbmI1x\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":818,\"y\":400,\"uid\":\"mB9Mmv8uTwqY\",\"title\":\"rotation\",\"dyn_in\":[{\"name\":\"output\",\"dt\":5,\"def\":null,\"uid\":\"ueZzDAy1hfyc\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":825,\"y\":549,\"uid\":\"wbqdvRKD3qsR\",\"title\":\"scale\",\"dyn_in\":[{\"name\":\"output\",\"dt\":5,\"def\":null,\"uid\":\"TTvvZvj40kZI\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"slider_float_generator\",\"x\":85,\"y\":369,\"uid\":\"hdQtQZga5HRU\",\"state\":{\"val\":0,\"min\":0,\"max\":5},\"title\":\"X\"},{\"plugin\":\"slider_float_generator\",\"x\":82,\"y\":436,\"uid\":\"gWarSJWqA8pd\",\"state\":{\"val\":0,\"min\":0,\"max\":5},\"title\":\"Y\"},{\"plugin\":\"slider_float_generator\",\"x\":80,\"y\":502,\"uid\":\"TUPLLEpJz4Ze\",\"state\":{\"val\":0,\"min\":0,\"max\":5},\"title\":\"Z\"}],\"conns\":[{\"src_nuid\":\"sgKaJyRHDv7R\",\"dst_nuid\":\"vfnUaMCY4Nt8\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"9Auh7zqtuhvk\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"zpYsqRyfrmwD\",\"dst_nuid\":\"vfnUaMCY4Nt8\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"fck7TUEaP8ws\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"98Q9qJDnpdfU\",\"dst_nuid\":\"vfnUaMCY4Nt8\",\"src_slot\":\"value\",\"dst_slot\":\"z\",\"uid\":\"uqDtEV7cTx7A\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"sRaxKP4ex4VH\",\"dst_nuid\":\"xEeC9G7p4LmB\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"9dREVLr7Mhw8\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"sRaxKP4ex4VH\",\"dst_nuid\":\"xEeC9G7p4LmB\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"fTnKCjWckH4A\",\"src_connected\":true,\"dst_connected\":true,\"offset\":1},{\"src_nuid\":\"sRaxKP4ex4VH\",\"dst_nuid\":\"xEeC9G7p4LmB\",\"src_slot\":\"value\",\"dst_slot\":\"z\",\"uid\":\"AfHFALBcV9RK\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"vfnUaMCY4Nt8\",\"dst_nuid\":\"Yk8hckpSLzGL\",\"src_slot\":\"vector\",\"dst_slot\":0,\"uid\":\"7ugecxEqnvc4\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"xnB7nxKsv5Mp\",\"dst_nuid\":\"mB9Mmv8uTwqY\",\"src_slot\":\"vector\",\"dst_slot\":0,\"uid\":\"bdpVQ8XpGYKA\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"xEeC9G7p4LmB\",\"dst_nuid\":\"wbqdvRKD3qsR\",\"src_slot\":\"vector\",\"dst_slot\":0,\"uid\":\"3PhyQ8yyEpB9\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"hdQtQZga5HRU\",\"dst_nuid\":\"xnB7nxKsv5Mp\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"bjrTAqBhaCh8\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"gWarSJWqA8pd\",\"dst_nuid\":\"xnB7nxKsv5Mp\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"T3dRPJ7cMYcs\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"TUPLLEpJz4Ze\",\"dst_nuid\":\"xnB7nxKsv5Mp\",\"src_slot\":\"value\",\"dst_slot\":\"z\",\"uid\":\"28QuvUKGVRgh\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"scale\",\"dt\":5,\"index\":0,\"uid\":\"H3AwGhvcvewD\",\"dynamic\":true,\"type\":1,\"is_connected\":true},{\"name\":\"rotation\",\"dt\":5,\"index\":1,\"uid\":\"ejxO7eIJpw4m\",\"dynamic\":true,\"type\":1,\"is_connected\":true},{\"name\":\"position\",\"dt\":5,\"index\":2,\"uid\":\"xnmIRUOwsegz\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"three_geometry_sphere\",\"x\":645,\"y\":408,\"uid\":\"r9KYzwPrEysg\"},{\"plugin\":\"const_float_generator\",\"x\":398,\"y\":448,\"uid\":\"jgYXGynLBPYD\",\"state\":{\"val\":32},\"title\":\"Segments\"},{\"plugin\":\"three_material\",\"x\":655,\"y\":112,\"uid\":\"v6muqDGgy6Da\"},{\"plugin\":\"const_float_generator\",\"x\":421,\"y\":338,\"uid\":\"LzqkkqL7AZ3y\",\"state\":{\"val\":1},\"title\":\"Side\"}],\"conns\":[{\"src_nuid\":\"AqTJmpEVT23D\",\"dst_nuid\":\"Rsx2h9keR8YH\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"uqKPJHJDbW29\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"p6nWamu6npQW\",\"dst_nuid\":\"AqTJmpEVT23D\",\"src_slot\":0,\"dst_slot\":\"scale\",\"uid\":\"ywK2TURrxGAj\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"p6nWamu6npQW\",\"dst_nuid\":\"AqTJmpEVT23D\",\"src_slot\":1,\"dst_slot\":\"rotation\",\"uid\":\"zsHkfZ6xVxwS\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"p6nWamu6npQW\",\"dst_nuid\":\"AqTJmpEVT23D\",\"src_slot\":2,\"dst_slot\":\"position\",\"uid\":\"Pkqfj3mndaXs\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"r9KYzwPrEysg\",\"dst_nuid\":\"AqTJmpEVT23D\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"k3Y5Skp5Sh2j\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"jgYXGynLBPYD\",\"dst_nuid\":\"r9KYzwPrEysg\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"GCQfBZs8CqDF\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"jgYXGynLBPYD\",\"dst_nuid\":\"r9KYzwPrEysg\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"2nyb6TDhp2SA\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"SP7gGQqKYJaM\",\"dst_nuid\":\"v6muqDGgy6Da\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"T8SbVnBKVvCU\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"v6muqDGgy6Da\",\"dst_nuid\":\"AqTJmpEVT23D\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"j4bAY2AREra6\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"LzqkkqL7AZ3y\",\"dst_nuid\":\"v6muqDGgy6Da\",\"src_slot\":\"value\",\"dst_slot\":\"side\",\"uid\":\"r88sVR8855nd\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}"
  },
  {
    "path": "browser/patches/_add-sphere.json",
    "content": "{\"abs_t\":72.448,\"active_graph\":\"XxZB4Aj6wVF3\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":623,\"y\":272,\"uid\":\"C9Fr5V3YWrAh\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"RpeFKf3A3gnD\":\"mh0rTKkFm0nD\"}},\"title\":\"Sphere\",\"graph\":{\"uid\":\"XxZB4Aj6wVF3\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1239,\"y\":326,\"uid\":\"dMv65ktxqfSc\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1438,\"y\":325,\"uid\":\"RpeFKf3A3gnD\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":425,\"y\":28,\"uid\":\"RCy5nYU4dmPc\",\"state\":{\"url\":\"/data/image/81238160a5dd3ebbe50a942ff7d4d1fca95bfcf7.png\"},\"title\":\"Box texture\"},{\"plugin\":\"three_material_phong\",\"x\":695,\"y\":112,\"uid\":\"RMtkaqTpJEHw\"},{\"plugin\":\"three_geometry_sphere\",\"x\":884,\"y\":568,\"uid\":\"TW6z9srQYDDz\"},{\"plugin\":\"const_float_generator\",\"x\":679,\"y\":615,\"uid\":\"yBqbSwXGESrd\",\"state\":{\"val\":32},\"title\":\"Segments\"}],\"conns\":[{\"src_nuid\":\"dMv65ktxqfSc\",\"dst_nuid\":\"RpeFKf3A3gnD\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"ru6d8kxqsRjF\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"RCy5nYU4dmPc\",\"dst_nuid\":\"RMtkaqTpJEHw\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"rrtc7JUw2vHn\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"RMtkaqTpJEHw\",\"dst_nuid\":\"dMv65ktxqfSc\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"B7TVgEM39VJf\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"TW6z9srQYDDz\",\"dst_nuid\":\"dMv65ktxqfSc\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"6mDCVEpwCsUx\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"yBqbSwXGESrd\",\"dst_nuid\":\"TW6z9srQYDDz\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"jsZptJaBV5Hc\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"yBqbSwXGESrd\",\"dst_nuid\":\"TW6z9srQYDDz\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"FHaVQbC964af\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}"
  },
  {
    "path": "browser/patches/_add-text.json",
    "content": "{\"abs_t\":788.427,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":388,\"y\":208,\"uid\":\"ULL3aBNb74pp\",\"state\":{\"always_update\":true,\"input_sids\":{\"Fq8SveLeVHkP\":\"mdjVRg52TeVf\"},\"output_sids\":{\"JpRvUYvAmC9K\":\"Uhe2f2gPcWCB\"}},\"title\":\"Text\",\"graph\":{\"uid\":\"C9GZtgTrQfJN\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":915,\"y\":215,\"uid\":\"JpRvUYvAmC9K\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"VVrkC4pSddJy\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_text_geometry\",\"x\":374,\"y\":160,\"uid\":\"bUSm3gbG9fYD\",\"state\":{}},{\"plugin\":\"three_mesh\",\"x\":700,\"y\":208,\"uid\":\"KDgnYzm7QmWd\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"three_material\",\"x\":365,\"y\":373,\"uid\":\"5tbakrWcjz7U\",\"state\":{}},{\"plugin\":\"color_picker\",\"x\":113,\"y\":392,\"uid\":\"eXJPgStZ5mug\",\"state\":{\"hue\":0,\"sat\":0,\"lum\":1}},{\"plugin\":\"input_proxy\",\"x\":166,\"y\":189,\"uid\":\"Fq8SveLeVHkP\",\"title\":\"text\",\"dyn_out\":[{\"name\":\"input\",\"dt\":15,\"uid\":\"BfjusZkKnTPF\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]}],\"conns\":[{\"src_nuid\":\"bUSm3gbG9fYD\",\"dst_nuid\":\"KDgnYzm7QmWd\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"6uUMahCbTENc\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5tbakrWcjz7U\",\"dst_nuid\":\"KDgnYzm7QmWd\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"ZCkypDmpz2cD\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"KDgnYzm7QmWd\",\"dst_nuid\":\"JpRvUYvAmC9K\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"mLWQvLZMPKVW\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"eXJPgStZ5mug\",\"dst_nuid\":\"5tbakrWcjz7U\",\"src_slot\":\"color\",\"dst_slot\":\"color\",\"uid\":\"WwZWMRGYX9YB\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Fq8SveLeVHkP\",\"dst_nuid\":\"bUSm3gbG9fYD\",\"src_slot\":0,\"dst_slot\":\"text\",\"uid\":\"fhkUVaR48U3e\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true}]},\"dyn_in\":[{\"name\":\"text\",\"dt\":15,\"index\":0,\"uid\":\"mdjVRg52TeVf\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Uhe2f2gPcWCB\",\"dynamic\":true,\"type\":1,\"is_connected\":false}]},{\"plugin\":\"const_text_generator\",\"x\":161,\"y\":240,\"uid\":\"AuZYQQgFCmuK\",\"state\":{\"text\":\"Welcome to Patches\",\"width\":118,\"height\":80}}],\"conns\":[{\"src_nuid\":\"AuZYQQgFCmuK\",\"dst_nuid\":\"ULL3aBNb74pp\",\"src_slot\":\"text\",\"dst_slot\":0,\"uid\":\"vbBnVnbPdhjC\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]}}\n"
  },
  {
    "path": "browser/patches/_add-torus.json",
    "content": "{\"abs_t\":7.107,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":1005,\"y\":415,\"uid\":\"s6kHrXDNXWFh\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"HADmZ8JNvF3p\":\"mh0rTKkFm0nD\"}},\"title\":\"Torus\",\"graph\":{\"uid\":\"EK98NFMxmh2c\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1254,\"y\":337,\"uid\":\"pseaWX8g5G7Y\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1444,\"y\":331,\"uid\":\"HADmZ8JNvF3p\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":541,\"y\":378,\"uid\":\"6gzVrYvb3aen\",\"state\":{\"url\":\"/data/image/7cbc45195c04d1595c43be42418755520068c72e.png\"},\"title\":\"Torus texture\"},{\"plugin\":\"three_material_phong\",\"x\":871,\"y\":378,\"uid\":\"4LxhHGbzGqkB\"},{\"plugin\":\"three_geometry_torus\",\"x\":815,\"y\":143,\"uid\":\"G8RXd4Mh63e6\"}],\"conns\":[{\"src_nuid\":\"pseaWX8g5G7Y\",\"dst_nuid\":\"HADmZ8JNvF3p\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"Zs73QxrvHmZs\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"6gzVrYvb3aen\",\"dst_nuid\":\"4LxhHGbzGqkB\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"UtHVKMxAuQyx\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"4LxhHGbzGqkB\",\"dst_nuid\":\"pseaWX8g5G7Y\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"ggnabDY7eCVv\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"G8RXd4Mh63e6\",\"dst_nuid\":\"pseaWX8g5G7Y\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"BNWXTCP4tJYZ\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}"
  },
  {
    "path": "browser/patches/_add_object_preset_Labv4-Genius_02.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Lab/Genius\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Labv4-Genius_02/Labv4-Genius_02.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Labv4_Happy_02.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Lab/Happy\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Labv4_Happy_02/Labv4_Happy_02.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Labv8lights.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Lab/Lights\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Labv8lights/Labv8lights.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Labv9.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Lab\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Labv9/Labv9.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_LabvTV.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Lab/TV\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/LabvTV/LabvTV.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Labvboombox.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Lab/BoomBox\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Labvboombox/Labvboombox.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Labvbox.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Lab/Box\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Labvbox/Labvbox.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Labvdesk.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Lab/Desk\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Labvdesk/Labvdesk.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Labvglasses.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Lab/Glasses\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Labvglasses/Labvglasses.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Labvglobe.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Lab/Globe\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Labvglobe/Labvglobe.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Labvlight2.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Lab/Lights\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Labvlight2/Labvlight2.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Labvmic.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Lab/Mic\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Labvmic/Labvmic.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Labvrocket.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Lab/Rocket\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Labvrocket/Labvrocket.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Labvstool.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Lab/Stool\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Labvstool/Labvstool.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Labvtrash.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Lab/Trash\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Labvtrash/Labvtrash.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Labvwrench.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Lab/Wrench\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Labvwrench/Labvwrench.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Labvzapper.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Lab/Zapper\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Labvzapper/Labvzapper.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Mountain_02.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Mountain\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Mountain_02/Mountain_02.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Mountain_PineTree_02.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Mountain/PineTree\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Mountain_PineTree_02/Mountain_PineTree_02.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Mountain_bush_01.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Mountain/Bush\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Mountain_bush_01/Mountain_bush_01.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Mountain_crystal_01.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Mountain/Crystal\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Mountain_crystal_01/Mountain_crystal_01.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Mountain_green_01.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Mountain/Green\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Mountain_green_01/Mountain_green_01.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Mountain_plumptree_01.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Mountain/PlumpTree1\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Mountain_plumptree_01/Mountain_plumptree_01.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Mountain_plumptree_02.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Mountain/PlumpTree2\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Mountain_plumptree_02/Mountain_plumptree_02.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Mountain_rocks_01.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Mountain/Rocks\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Mountain_rocks_01/Mountain_rocks_01.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Mountain_scope_01.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Mountain/Scope\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Mountain_scope_01/Mountain_scope_01.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Mountain_shroom_01.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Mountain/Shroom\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Mountain_shroom_01/Mountain_shroom_01.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Mountain_small_base_01.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Mountain-SmallBase1\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Mountain_small_base_01/Mountain_small_base_01.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Mountain_small_base_02.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Mountain/SmallBase2\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Mountain_small_base_02/Mountain_small_base_02.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_Mountain_water_02.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Mountain/Water\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/Mountain_water_02/Mountain_water_02.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_island-leaftreea.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Island/LeafTree\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/island-leaftreea/island-leaftreea.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_island-palmtree.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Island/PalmTree\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/island-palmtree/island-palmtree.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_island-stone-a.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Island/LowStoneA\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/island-stone-a/island-stone-a.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_island-stone-b.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Island/HighStoneA\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/island-stone-b/island-stone-b.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_island-stone-c.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Island/LowStoneB\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/island-stone-c/island-stone-c.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_island-stone-d.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Island/HighStoneB\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/island-stone-d/island-stone-d.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_object_preset_island-valley-baserock.json",
    "content": "{\"abs_t\":273.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":504,\"y\":214,\"uid\":\"nKGRUxdMNKUX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"JN8BbeEg6gmK\":\"Ys30r7aVEks1\"}},\"title\":\"Island/BaseRock\",\"graph\":{\"uid\":\"hjXfBtVNNNpD\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":913,\"y\":215,\"uid\":\"JN8BbeEg6gmK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":414,\"y\":242,\"uid\":\"Mt9TSk3ytX9j\",\"state\":{\"url\":\"/data/vizor/assets/scene/island-valley-baserock/island-valley-baserock.obj\"}},{\"plugin\":\"three_mesh\",\"x\":709,\"y\":215,\"uid\":\"5YxqY7yurrPE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"annotation\",\"x\":409,\"y\":357,\"uid\":\"Lj5WxCWyEep2\",\"state\":{\"text\":\"Create a Lambert material Patch (found in the 'Patches'-menu) and connect to the material input on the mesh. \",\"width\":120,\"height\":80},\"title\":\"Tip: Want to modify the material?\"}],\"conns\":[{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"y3TdW4ryKBRq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Mt9TSk3ytX9j\",\"dst_nuid\":\"5YxqY7yurrPE\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"pfupu7Agnyyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5YxqY7yurrPE\",\"dst_nuid\":\"JN8BbeEg6gmK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kFdQLwy7hJx3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}\n"
  },
  {
    "path": "browser/patches/_add_stereo_cubemap.json",
    "content": "{\"nodes\":[{\"plugin\":\"graph\",\"x\":501,\"y\":181,\"uid\":\"FPrWsQkbPcEC\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"afE4dp8D789k\":\"6xX46R7XF9ss\"}},\"title\":\"Stereo Cubemap\",\"graph\":{\"uid\":\"JNDgYVu7SvKc\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"url_stereo_cubemap_generator\",\"x\":466,\"y\":348,\"uid\":\"3pZKqsPUvhdt\",\"state\":{\"url\":\"/data/image/341612db85a9a7d339c2ca2a3bec389fcbdb0d8d.png\"}},{\"plugin\":\"output_proxy\",\"x\":1018,\"y\":394,\"uid\":\"afE4dp8D789k\",\"title\":\"stereo cube\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"adRs4Cy2hyFF\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true,\"array\":true}]},{\"plugin\":\"graph\",\"x\":712,\"y\":348,\"uid\":\"CA4mBgjCCXuw\",\"state\":{\"always_update\":true,\"input_sids\":{\"nfBEwwrHd42B\":\"SvM7RynkmLXx\",\"2RskHByHYuyQ\":\"kcXrHPHbPSNF\"},\"output_sids\":{\"5y9pHnpEDpya\":\"34PCrMfszSYK\"}},\"title\":\"Stereo Cube\",\"graph\":{\"uid\":\"Lnmxg23P4auj\",\"parent_uid\":\"JNDgYVu7SvKc\",\"open\":true,\"nodes\":[{\"plugin\":\"input_proxy\",\"x\":235,\"y\":383,\"uid\":\"nfBEwwrHd42B\",\"title\":\"left texture\",\"dyn_out\":[{\"name\":\"input\",\"dt\":24,\"uid\":\"YXQtyugqVjM9\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":235,\"y\":448,\"uid\":\"2RskHByHYuyQ\",\"title\":\"right texture\",\"dyn_out\":[{\"name\":\"input\",\"dt\":24,\"uid\":\"JgtcUJ54Pz9s\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":1539,\"y\":418,\"uid\":\"5y9pHnpEDpya\",\"title\":\"mesh array\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"V893c7GJpVC3\",\"dynamic\":true,\"type\":0,\"index\":0,\"array\":true,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_cube_material\",\"x\":777,\"y\":434,\"uid\":\"NTJRhHY6Wn5x\",\"open\":false,\"state\":{},\"title\":\"Left Eye Cube Material\"},{\"plugin\":\"three_geometry_box\",\"x\":774,\"y\":275,\"uid\":\"rwD4ctGwShJw\",\"open\":false},{\"plugin\":\"inputs_to_array\",\"x\":1365,\"y\":386,\"uid\":\"6GY5nfLW9Bfk\",\"dyn_in\":[{\"name\":\"0\",\"dt\":21,\"array\":true,\"uid\":\"v5WSyrQ3Hc42\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true},{\"type\":0,\"name\":\"1\",\"dt\":21,\"array\":true,\"uid\":\"asmggL8mfYFX\",\"dynamic\":true,\"index\":1,\"is_connected\":true},{\"type\":0,\"name\":\"2\",\"dt\":21,\"array\":true,\"uid\":\"REqADfVFmHe9\",\"dynamic\":true,\"index\":2,\"is_connected\":true},{\"type\":0,\"name\":\"3\",\"dt\":21,\"array\":true,\"uid\":\"eG4e8ZY3AMca\",\"dynamic\":true,\"index\":3}]},{\"plugin\":\"const_float_generator\",\"x\":777,\"y\":470,\"uid\":\"QAtsfKEnWZrv\",\"open\":false,\"state\":{\"val\":2},\"title\":\"Left Eye\"},{\"plugin\":\"const_float_generator\",\"x\":472,\"y\":469,\"uid\":\"ucpuTa9bY5QL\",\"open\":false,\"state\":{\"val\":1},\"title\":\"Backside Culling\"},{\"plugin\":\"const_float_generator\",\"x\":776,\"y\":583,\"uid\":\"2raLRjnNzQmA\",\"open\":false,\"state\":{\"val\":2},\"title\":\"Right Eye\"},{\"plugin\":\"three_cube_material\",\"x\":776,\"y\":544,\"uid\":\"cVeBSy4CVv74\",\"open\":false,\"state\":{},\"title\":\"Right Eye Cube Material\"},{\"plugin\":\"three_mesh\",\"x\":1105,\"y\":417,\"uid\":\"uSJyweGFFLqL\",\"open\":false,\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":50,\"y\":50,\"z\":50},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}},\"title\":\"Stereo / Left Eye Mesh\"},{\"plugin\":\"three_mesh\",\"x\":1104,\"y\":470,\"uid\":\"Lu6X5YKb9q7p\",\"open\":false,\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":50,\"y\":50,\"z\":50},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}},\"title\":\"Stereo / Right Eye Mesh\"},{\"plugin\":\"toggle_button\",\"x\":774,\"y\":740,\"uid\":\"ydaKf6Sj9Dtk\",\"open\":false,\"state\":{\"enabled\":true},\"title\":\"Lock Transform\"},{\"plugin\":\"toggle_button\",\"x\":774,\"y\":701,\"uid\":\"7syEsmWKKBLz\",\"open\":false,\"state\":{\"enabled\":false},\"title\":\"Shadows\"},{\"plugin\":\"three_mesh\",\"x\":1105,\"y\":524,\"uid\":\"5unD7Ly5FCEu\",\"open\":false,\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":50,\"y\":50,\"z\":50},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}},\"title\":\"Non-Stereo Mesh\"},{\"plugin\":\"const_float_generator\",\"x\":775,\"y\":821,\"uid\":\"jGcJwk3DZzYb\",\"open\":false,\"state\":{\"val\":3},\"title\":\"Both Eyes\"}],\"conns\":[{\"src_nuid\":\"ucpuTa9bY5QL\",\"dst_nuid\":\"NTJRhHY6Wn5x\",\"src_slot\":\"value\",\"dst_slot\":\"side\",\"uid\":\"vkPhFfaWmL6n\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ucpuTa9bY5QL\",\"dst_nuid\":\"cVeBSy4CVv74\",\"src_slot\":\"value\",\"dst_slot\":\"side\",\"uid\":\"yUgV4BqzapTa\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"nfBEwwrHd42B\",\"dst_nuid\":\"NTJRhHY6Wn5x\",\"src_slot\":0,\"dst_slot\":\"cube texture\",\"uid\":\"D6GNpzUERrwM\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"2RskHByHYuyQ\",\"dst_nuid\":\"cVeBSy4CVv74\",\"src_slot\":0,\"dst_slot\":\"cube texture\",\"uid\":\"wpmERGLz3F8n\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"6GY5nfLW9Bfk\",\"dst_nuid\":\"5y9pHnpEDpya\",\"src_slot\":\"array\",\"dst_slot\":0,\"uid\":\"9eLZkQSBfJ2c\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"uSJyweGFFLqL\",\"dst_nuid\":\"6GY5nfLW9Bfk\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"7KWGc7Nu6gYg\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"Lu6X5YKb9q7p\",\"dst_nuid\":\"6GY5nfLW9Bfk\",\"src_slot\":\"object3d\",\"dst_slot\":1,\"uid\":\"NW33EpV3Dwy6\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"rwD4ctGwShJw\",\"dst_nuid\":\"Lu6X5YKb9q7p\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"24rrWcwTFVja\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"rwD4ctGwShJw\",\"dst_nuid\":\"uSJyweGFFLqL\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"jtDT5uRp6sCP\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"cVeBSy4CVv74\",\"dst_nuid\":\"Lu6X5YKb9q7p\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"k4xAN7dxQnk3\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"NTJRhHY6Wn5x\",\"dst_nuid\":\"uSJyweGFFLqL\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"2DAcbYWa4Yk2\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"2raLRjnNzQmA\",\"dst_nuid\":\"Lu6X5YKb9q7p\",\"src_slot\":\"value\",\"dst_slot\":\"stereo view\",\"uid\":\"Drcg5g7yQ8nW\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"QAtsfKEnWZrv\",\"dst_nuid\":\"uSJyweGFFLqL\",\"src_slot\":\"value\",\"dst_slot\":\"stereo view\",\"uid\":\"CJcxS7YDTRht\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ydaKf6Sj9Dtk\",\"dst_nuid\":\"uSJyweGFFLqL\",\"src_slot\":\"bool\",\"dst_slot\":\"lock transform\",\"uid\":\"6KK3kaPyWHBN\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ydaKf6Sj9Dtk\",\"dst_nuid\":\"Lu6X5YKb9q7p\",\"src_slot\":\"bool\",\"dst_slot\":\"lock transform\",\"uid\":\"PByM4QuGfDXx\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"7syEsmWKKBLz\",\"dst_nuid\":\"uSJyweGFFLqL\",\"src_slot\":\"bool\",\"dst_slot\":\"castShadow\",\"uid\":\"CVyfc4qGYjQR\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"7syEsmWKKBLz\",\"dst_nuid\":\"Lu6X5YKb9q7p\",\"src_slot\":\"bool\",\"dst_slot\":\"castShadow\",\"uid\":\"gvMrqWNJGetK\",\"src_connected\":true,\"dst_connected\":true,\"offset\":1},{\"src_nuid\":\"7syEsmWKKBLz\",\"dst_nuid\":\"uSJyweGFFLqL\",\"src_slot\":\"bool\",\"dst_slot\":\"receiveShadow\",\"uid\":\"9BguWCSCg5Na\",\"src_connected\":true,\"dst_connected\":true,\"offset\":2},{\"src_nuid\":\"7syEsmWKKBLz\",\"dst_nuid\":\"Lu6X5YKb9q7p\",\"src_slot\":\"bool\",\"dst_slot\":\"receiveShadow\",\"uid\":\"ZvvtTaX6SKj7\",\"src_connected\":true,\"dst_connected\":true,\"offset\":3},{\"src_nuid\":\"5unD7Ly5FCEu\",\"dst_nuid\":\"6GY5nfLW9Bfk\",\"src_slot\":\"object3d\",\"dst_slot\":2,\"uid\":\"pdZF2b8B6Mej\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"rwD4ctGwShJw\",\"dst_nuid\":\"5unD7Ly5FCEu\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"F7pHPzebw4CM\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"NTJRhHY6Wn5x\",\"dst_nuid\":\"5unD7Ly5FCEu\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"V2SSmQy5x8vp\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"jGcJwk3DZzYb\",\"dst_nuid\":\"5unD7Ly5FCEu\",\"src_slot\":\"value\",\"dst_slot\":\"stereo view\",\"uid\":\"qYktWzd2fAuK\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ydaKf6Sj9Dtk\",\"dst_nuid\":\"5unD7Ly5FCEu\",\"src_slot\":\"bool\",\"dst_slot\":\"lock transform\",\"uid\":\"H7ZYReWMfgme\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"7syEsmWKKBLz\",\"dst_nuid\":\"5unD7Ly5FCEu\",\"src_slot\":\"bool\",\"dst_slot\":\"receiveShadow\",\"uid\":\"ayLzRcpcAWBm\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"7syEsmWKKBLz\",\"dst_nuid\":\"5unD7Ly5FCEu\",\"src_slot\":\"bool\",\"dst_slot\":\"castShadow\",\"uid\":\"CnTcC3zzHCCN\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"right texture\",\"dt\":24,\"index\":0,\"uid\":\"kcXrHPHbPSNF\",\"dynamic\":true,\"type\":0,\"is_connected\":true},{\"name\":\"left texture\",\"dt\":24,\"index\":1,\"uid\":\"SvM7RynkmLXx\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"mesh array\",\"dt\":21,\"index\":0,\"uid\":\"34PCrMfszSYK\",\"dynamic\":true,\"type\":1,\"is_connected\":true,\"array\":true}]}],\"conns\":[{\"src_nuid\":\"CA4mBgjCCXuw\",\"dst_nuid\":\"afE4dp8D789k\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"wKfvk2syzFmZ\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"3pZKqsPUvhdt\",\"dst_nuid\":\"CA4mBgjCCXuw\",\"src_slot\":\"right\",\"dst_slot\":0,\"uid\":\"2VWmtQ6mCDvf\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"3pZKqsPUvhdt\",\"dst_nuid\":\"CA4mBgjCCXuw\",\"src_slot\":\"left\",\"dst_slot\":1,\"uid\":\"ZFutv2KuUqB8\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"stereo cube\",\"dt\":21,\"index\":0,\"uid\":\"6xX46R7XF9ss\",\"dynamic\":true,\"type\":1,\"array\":true,\"is_connected\":true}]}],\"conns\":[],\"x1\":551,\"y1\":231,\"x2\":745,\"y2\":290}\n"
  },
  {
    "path": "browser/patches/_animate-on-trigger.json",
    "content": "{\"abs_t\":0,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":901,\"y\":291,\"uid\":\"BYchfENVKDhr\",\"state\":{\"always_update\":true,\"input_sids\":{\"F4Cq2d7VXaAE\":\"UsjEWfv3japH\",\"j6FXDPVspnRY\":\"EYxSWdpWxZWw\",\"UtHHhkD4UHtj\":\"sWCcHw3Xj7kN\",\"McqLjYynCbbC\":\"pbYeBe7P2M9M\",\"SkJsX53zuPLD\":\"HL47tt3dwVfw\",\"bhw3ga2xAJbF\":\"g5bh9RMd8SP7\"},\"output_sids\":{\"jGqdRGRhF4uH\":\"P6PcSWDex2Fs\",\"MfmUjLL4q7eh\":\"gfy3wZPpmRz9\"}},\"title\":\"Animate on Trigger\",\"graph\":{\"uid\":\"SM3tXyDCs8Gg\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"input_proxy\",\"x\":83,\"y\":457,\"uid\":\"F4Cq2d7VXaAE\",\"title\":\"trigger\",\"dyn_out\":[{\"name\":\"input\",\"dt\":7,\"uid\":\"rxWUe5Jeq6Mp\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":1812,\"y\":362,\"uid\":\"jGqdRGRhF4uH\",\"title\":\"value\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"def\":null,\"uid\":\"MzNS5zpb7YRw\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":771,\"y\":587,\"uid\":\"j6FXDPVspnRY\",\"title\":\"start\",\"dyn_out\":[{\"name\":\"input\",\"dt\":0,\"uid\":\"NRxfT23jMqW4\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":774,\"y\":638,\"uid\":\"UtHHhkD4UHtj\",\"title\":\"finish\",\"dyn_out\":[{\"name\":\"input\",\"dt\":0,\"uid\":\"NRxfT23jMqW4\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":1712,\"y\":308,\"uid\":\"MfmUjLL4q7eh\",\"title\":\"active\",\"dyn_in\":[{\"name\":\"output\",\"dt\":7,\"def\":null,\"uid\":\"WbQm9htuZPTp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":88,\"y\":381,\"uid\":\"McqLjYynCbbC\",\"title\":\"speed\",\"dyn_out\":[{\"name\":\"input\",\"dt\":0,\"uid\":\"YyGt4xxTMkca\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"if_else_modulator\",\"x\":1429,\"y\":423,\"uid\":\"tqvMCLVEmN8L\"},{\"plugin\":\"variable_local_write\",\"x\":1216,\"y\":218,\"uid\":\"sGgDzKPJJPuP\",\"title\":\"startTime\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"cRe8Z4uSgULq\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"variable_local_read\",\"x\":535,\"y\":214,\"uid\":\"Hf8w3tgVeA2p\",\"title\":\"startTime\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"bXGqb9YKKCQ4\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"if_else_modulator\",\"x\":1021,\"y\":218,\"uid\":\"AkHMyGrpU7pL\"},{\"plugin\":\"clock_generator\",\"x\":94,\"y\":326,\"uid\":\"CmUFXLY6cfKp\"},{\"plugin\":\"subtract_modulator\",\"x\":768,\"y\":443,\"uid\":\"MJ9FMhnQqUhC\",\"title\":\"clock - startTime\"},{\"plugin\":\"add_modulator\",\"x\":993,\"y\":428,\"uid\":\"P8ufBFvfKmaM\",\"title\":\"time since start\"},{\"plugin\":\"less_than_modulator\",\"x\":1226,\"y\":322,\"uid\":\"sZkfMR6vWn9k\"},{\"plugin\":\"multiply_modulator\",\"x\":449,\"y\":276,\"uid\":\"kpfK3WtqZQxn\",\"title\":\"clock * speed\"},{\"plugin\":\"input_proxy\",\"x\":147,\"y\":49,\"uid\":\"SkJsX53zuPLD\",\"title\":\"reset\",\"dyn_out\":[{\"name\":\"input\",\"dt\":7,\"uid\":\"GhVRQKt292Ku\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"if_else_modulator\",\"x\":626,\"y\":26,\"uid\":\"ngWCQqrCkA6t\"},{\"plugin\":\"variable_local_write\",\"x\":1251,\"y\":39,\"uid\":\"NatrgecNEhbT\",\"title\":\"isRunning\",\"dyn_in\":[{\"name\":\"value\",\"dt\":7,\"uid\":\"Zpa2xPNZbyRC\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"toggle_button\",\"x\":83,\"y\":109,\"uid\":\"CT3mq36mDQT2\",\"open\":false,\"state\":{\"enabled\":false},\"title\":\"false\"},{\"plugin\":\"variable_local_read\",\"x\":60,\"y\":152,\"uid\":\"Bz9tHa7WAFkf\",\"title\":\"isRunning\",\"dyn_out\":[{\"name\":\"value\",\"dt\":7,\"uid\":\"UnS3Pvtjb53s\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"if_else_modulator\",\"x\":1065,\"y\":27,\"uid\":\"txWr29uCMTNN\"},{\"plugin\":\"if_else_modulator\",\"x\":1722,\"y\":416,\"uid\":\"pqRmmcDLM7qq\"},{\"plugin\":\"toggle_button\",\"x\":780,\"y\":93,\"uid\":\"rcYSCtDdG7UG\",\"open\":false,\"state\":{\"enabled\":true},\"title\":\"true\"},{\"plugin\":\"input_proxy\",\"x\":103,\"y\":603,\"uid\":\"bhw3ga2xAJbF\",\"title\":\"one shot\",\"dyn_out\":[{\"name\":\"input\",\"dt\":7,\"uid\":\"bkNU5uGrSEY7\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"and_modulator\",\"x\":300,\"y\":483,\"uid\":\"2V6veuPysk3w\"},{\"plugin\":\"not_modulator\",\"x\":433,\"y\":451,\"uid\":\"pfe5KFRaMtXJ\"},{\"plugin\":\"and_modulator\",\"x\":610,\"y\":386,\"uid\":\"95eYjRSBdbd9\"}],\"conns\":[{\"src_nuid\":\"Hf8w3tgVeA2p\",\"dst_nuid\":\"AkHMyGrpU7pL\",\"src_slot\":0,\"dst_slot\":\"false value\",\"uid\":\"hXRpbwwdjVhE\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"AkHMyGrpU7pL\",\"dst_nuid\":\"sGgDzKPJJPuP\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"XCWTJLpHS8gf\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"Hf8w3tgVeA2p\",\"dst_nuid\":\"MJ9FMhnQqUhC\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"D8HVf6wcAH86\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"MJ9FMhnQqUhC\",\"dst_nuid\":\"P8ufBFvfKmaM\",\"src_slot\":\"result\",\"dst_slot\":\"a\",\"uid\":\"kVsS9qHYQLuz\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"j6FXDPVspnRY\",\"dst_nuid\":\"P8ufBFvfKmaM\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"gRYe7tV6duHm\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"P8ufBFvfKmaM\",\"dst_nuid\":\"tqvMCLVEmN8L\",\"src_slot\":\"result\",\"dst_slot\":\"true value\",\"uid\":\"D83AJG9MgQMT\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"P8ufBFvfKmaM\",\"dst_nuid\":\"sZkfMR6vWn9k\",\"src_slot\":\"result\",\"dst_slot\":\"value\",\"uid\":\"fWLKq32f7JRe\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"UtHHhkD4UHtj\",\"dst_nuid\":\"sZkfMR6vWn9k\",\"src_slot\":0,\"dst_slot\":\"reference\",\"uid\":\"HD74XS3XUSAC\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"sZkfMR6vWn9k\",\"dst_nuid\":\"tqvMCLVEmN8L\",\"src_slot\":\"bool\",\"dst_slot\":\"condition\",\"uid\":\"F93gG3YmHKMa\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"CmUFXLY6cfKp\",\"dst_nuid\":\"kpfK3WtqZQxn\",\"src_slot\":\"seconds\",\"dst_slot\":\"a\",\"uid\":\"tDUSqDHwjEJV\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"kpfK3WtqZQxn\",\"dst_nuid\":\"AkHMyGrpU7pL\",\"src_slot\":\"result\",\"dst_slot\":\"true value\",\"uid\":\"yvXNUchmLn7q\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"kpfK3WtqZQxn\",\"dst_nuid\":\"MJ9FMhnQqUhC\",\"src_slot\":\"result\",\"dst_slot\":\"a\",\"uid\":\"ZgzsNH8Lyk8C\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"McqLjYynCbbC\",\"dst_nuid\":\"kpfK3WtqZQxn\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"D8ZcY4MGKzHj\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"sZkfMR6vWn9k\",\"dst_nuid\":\"MfmUjLL4q7eh\",\"src_slot\":\"bool\",\"dst_slot\":0,\"uid\":\"3THwrXxCj65w\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"UtHHhkD4UHtj\",\"dst_nuid\":\"tqvMCLVEmN8L\",\"src_slot\":0,\"dst_slot\":\"false value\",\"uid\":\"6FSKQhPa2BvP\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"CT3mq36mDQT2\",\"dst_nuid\":\"ngWCQqrCkA6t\",\"src_slot\":\"bool\",\"dst_slot\":\"true value\",\"uid\":\"Zn27sqkQZe38\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Bz9tHa7WAFkf\",\"dst_nuid\":\"ngWCQqrCkA6t\",\"src_slot\":0,\"dst_slot\":\"false value\",\"uid\":\"UtRtpr32QkAg\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"ngWCQqrCkA6t\",\"dst_nuid\":\"txWr29uCMTNN\",\"src_slot\":\"value\",\"dst_slot\":\"false value\",\"uid\":\"FCasqXNyDpwh\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"txWr29uCMTNN\",\"dst_nuid\":\"NatrgecNEhbT\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"H5JDfbWgPvrT\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"F4Cq2d7VXaAE\",\"dst_nuid\":\"txWr29uCMTNN\",\"src_slot\":0,\"dst_slot\":\"condition\",\"uid\":\"4NE7RS2c3YXG\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"tqvMCLVEmN8L\",\"dst_nuid\":\"pqRmmcDLM7qq\",\"src_slot\":\"value\",\"dst_slot\":\"true value\",\"uid\":\"ERAJkSwTUBZT\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Bz9tHa7WAFkf\",\"dst_nuid\":\"pqRmmcDLM7qq\",\"src_slot\":0,\"dst_slot\":\"condition\",\"uid\":\"6EtmzQFH9Rzc\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"j6FXDPVspnRY\",\"dst_nuid\":\"pqRmmcDLM7qq\",\"src_slot\":0,\"dst_slot\":\"false value\",\"uid\":\"AUWRrt9SYKfb\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"pqRmmcDLM7qq\",\"dst_nuid\":\"jGqdRGRhF4uH\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"qAUgXTmMf7Mj\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"SkJsX53zuPLD\",\"dst_nuid\":\"ngWCQqrCkA6t\",\"src_slot\":0,\"dst_slot\":\"condition\",\"uid\":\"NQ7k3PxggWZk\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"rcYSCtDdG7UG\",\"dst_nuid\":\"txWr29uCMTNN\",\"src_slot\":\"bool\",\"dst_slot\":\"true value\",\"uid\":\"8cPkBD27wRWG\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Bz9tHa7WAFkf\",\"dst_nuid\":\"2V6veuPysk3w\",\"src_slot\":0,\"dst_slot\":\"a\",\"uid\":\"6YfzCUPaZ2Se\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"bhw3ga2xAJbF\",\"dst_nuid\":\"2V6veuPysk3w\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"ns5bnj89vbE7\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"2V6veuPysk3w\",\"dst_nuid\":\"pfe5KFRaMtXJ\",\"src_slot\":\"bool\",\"dst_slot\":\"bool\",\"uid\":\"x3J7MFxGZJ3b\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"F4Cq2d7VXaAE\",\"dst_nuid\":\"95eYjRSBdbd9\",\"src_slot\":0,\"dst_slot\":\"a\",\"uid\":\"8Ab3myWZfeGu\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"pfe5KFRaMtXJ\",\"dst_nuid\":\"95eYjRSBdbd9\",\"src_slot\":\"bool\",\"dst_slot\":\"b\",\"uid\":\"Akx8MxTzbQKP\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"95eYjRSBdbd9\",\"dst_nuid\":\"AkHMyGrpU7pL\",\"src_slot\":\"bool\",\"dst_slot\":\"condition\",\"uid\":\"67aavTqtjc5x\",\"src_connected\":true,\"dst_connected\":true}],\"variables\":[{\"id\":\"startTime\",\"dt\":0},{\"id\":\"isRunning\",\"dt\":7}]},\"dyn_in\":[{\"name\":\"one shot\",\"dt\":7,\"index\":0,\"uid\":\"g5bh9RMd8SP7\",\"dynamic\":true,\"type\":0,\"is_connected\":false},{\"name\":\"reset\",\"dt\":7,\"index\":1,\"uid\":\"HL47tt3dwVfw\",\"dynamic\":true,\"type\":0,\"is_connected\":false},{\"name\":\"speed\",\"dt\":0,\"index\":2,\"uid\":\"pbYeBe7P2M9M\",\"dynamic\":true,\"type\":0,\"is_connected\":true},{\"name\":\"finish\",\"dt\":0,\"index\":3,\"uid\":\"sWCcHw3Xj7kN\",\"dynamic\":true,\"type\":0,\"is_connected\":true},{\"name\":\"start\",\"dt\":0,\"index\":4,\"uid\":\"EYxSWdpWxZWw\",\"dynamic\":true,\"type\":0,\"is_connected\":true},{\"name\":\"trigger\",\"dt\":7,\"index\":5,\"uid\":\"UsjEWfv3japH\",\"dynamic\":true,\"type\":0,\"is_connected\":false}],\"dyn_out\":[{\"name\":\"active\",\"dt\":7,\"index\":0,\"uid\":\"gfy3wZPpmRz9\",\"dynamic\":true,\"type\":1,\"is_connected\":true},{\"name\":\"value\",\"dt\":0,\"index\":1,\"uid\":\"P6PcSWDex2Fs\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":612,\"y\":377,\"uid\":\"F8TyNqgDdMAb\",\"state\":{\"val\":1},\"title\":\"Finish Value\"},{\"plugin\":\"const_float_generator\",\"x\":613,\"y\":295,\"uid\":\"6m5z9qVBBTBW\",\"state\":{\"val\":0},\"title\":\"Start Value\"},{\"plugin\":\"const_float_generator\",\"x\":613,\"y\":459,\"uid\":\"YRntNC6Dun2b\",\"state\":{\"val\":1},\"title\":\"Speed\"}],\"conns\":[{\"src_nuid\":\"F8TyNqgDdMAb\",\"dst_nuid\":\"BYchfENVKDhr\",\"src_slot\":\"value\",\"dst_slot\":3,\"uid\":\"LAku8xzCg7Zp\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"6m5z9qVBBTBW\",\"dst_nuid\":\"BYchfENVKDhr\",\"src_slot\":\"value\",\"dst_slot\":4,\"uid\":\"ACbGXjmDPz79\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"YRntNC6Dun2b\",\"dst_nuid\":\"BYchfENVKDhr\",\"src_slot\":\"value\",\"dst_slot\":2,\"uid\":\"xGHjkQfeWXV3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]}}"
  },
  {
    "path": "browser/patches/_animation-move-in-a-circle-and-turn.json",
    "content": "{\"abs_t\":404.814,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":573,\"y\":140,\"uid\":\"WnVE1YawKV4A\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"o6XEV0HDGmfa\":\"ZEYFLq5Sq2zU\",\"qEzbtCxtSeC7\":\"rrOyXUL9oOEz\"}},\"title\":\"Move in a circle and turn\",\"graph\":{\"uid\":\"6Q8Wf83jqEhZ\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":840,\"y\":166,\"uid\":\"2rUne0tuX797\",\"state\":{\"always_update\":true,\"input_sids\":{\"eCvZo6Znlbjn\":\"1\"},\"output_sids\":{\"4t4OPW2rOY0B\":\"0\"}},\"title\":\"Basic clock\",\"graph\":{\"uid\":\"oviK17ZWvYuu\",\"parent_uid\":\"6Q8Wf83jqEhZ\",\"open\":true,\"nodes\":[{\"plugin\":\"delta_t_generator\",\"x\":234,\"y\":203,\"uid\":\"IinMeeTzj5Vs\"},{\"plugin\":\"multiply_modulator\",\"x\":359,\"y\":193,\"uid\":\"WuXx4H5crsxu\"},{\"plugin\":\"output_proxy\",\"x\":785,\"y\":240,\"uid\":\"4t4OPW2rOY0B\",\"title\":\"time\",\"dyn_in\":[{\"name\":\"input\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true,\"dynamic\":true}]},{\"plugin\":\"input_proxy\",\"x\":250,\"y\":262,\"uid\":\"eCvZo6Znlbjn\",\"title\":\"Speed\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"connected\":true,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"variable_local_read\",\"x\":376,\"y\":310,\"uid\":\"jubNbTMCcA13\",\"title\":\"float\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"variable_local_write\",\"x\":745,\"y\":188,\"uid\":\"QEISdU4sGq6J\",\"title\":\"float\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":0,\"is_connected\":true,\"dynamic\":true}]},{\"plugin\":\"add_modulator\",\"x\":484,\"y\":223,\"uid\":\"tG7bWaQYpkDm\"},{\"plugin\":\"if_else_modulator\",\"x\":604,\"y\":249,\"uid\":\"CkSMMSOMcFYJ\"},{\"plugin\":\"const_float_generator\",\"x\":488,\"y\":351,\"uid\":\"clmNr8InbGoX\",\"state\":{\"val\":0},\"title\":\"Reset\"},{\"plugin\":\"initialise_generator\",\"x\":520,\"y\":160,\"uid\":\"ER1lAFl6P1BH\"}],\"conns\":[{\"src_nuid\":\"IinMeeTzj5Vs\",\"dst_nuid\":\"WuXx4H5crsxu\",\"src_slot\":\"seconds\",\"dst_slot\":\"a\",\"uid\":\"zpmqa2x40rKk\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"eCvZo6Znlbjn\",\"dst_nuid\":\"WuXx4H5crsxu\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"Dz9kGtbAkn9e\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"ER1lAFl6P1BH\",\"dst_nuid\":\"CkSMMSOMcFYJ\",\"src_slot\":\"bool\",\"dst_slot\":\"condition\",\"uid\":\"U5ulkL0vnGBt\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"jubNbTMCcA13\",\"dst_nuid\":\"tG7bWaQYpkDm\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"yHStMcWadc5j\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"WuXx4H5crsxu\",\"dst_nuid\":\"tG7bWaQYpkDm\",\"src_slot\":\"result\",\"dst_slot\":\"a\",\"uid\":\"VzNN7886ejS6\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"tG7bWaQYpkDm\",\"dst_nuid\":\"CkSMMSOMcFYJ\",\"src_slot\":\"result\",\"dst_slot\":\"false value\",\"uid\":\"wuQI1hALmAnp\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"clmNr8InbGoX\",\"dst_nuid\":\"CkSMMSOMcFYJ\",\"src_slot\":\"value\",\"dst_slot\":\"true value\",\"uid\":\"fDdlcHFGGCUw\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"CkSMMSOMcFYJ\",\"dst_nuid\":\"QEISdU4sGq6J\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"3BhpkoDZ3vQU\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"CkSMMSOMcFYJ\",\"dst_nuid\":\"4t4OPW2rOY0B\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"8fhLwbYScO69\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true,\"offset\":1}],\"variables\":[{\"id\":\"float\",\"dt\":0}]},\"dyn_in\":[{\"name\":\"Speed\",\"dt\":0,\"uid\":\"1\",\"index\":0,\"type\":0,\"is_connected\":true,\"dynamic\":true}],\"dyn_out\":[{\"name\":\"time\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":300,\"y\":519,\"uid\":\"VTL7DjpBaqhe\",\"state\":{\"val\":1},\"title\":\"Circle radius\"},{\"plugin\":\"multiply_modulator\",\"x\":1238,\"y\":153,\"uid\":\"Idgvu84ysi6n\",\"open\":false},{\"plugin\":\"multiply_modulator\",\"x\":1229,\"y\":103,\"uid\":\"MYylIWlLCE1n\",\"open\":false},{\"plugin\":\"slider_float_generator\",\"x\":247,\"y\":403,\"uid\":\"a2RJUXVGMKUH\",\"state\":{\"val\":0.511,\"min\":0,\"max\":1},\"title\":\"Clock speed\"},{\"plugin\":\"const_float_generator\",\"x\":977,\"y\":355,\"uid\":\"Vo4YF4dpmsVQ\",\"open\":false,\"state\":{\"val\":-1},\"title\":\"Rotation amount\"},{\"plugin\":\"multiply_modulator\",\"x\":1237,\"y\":315,\"uid\":\"cxyLlX4K5Lsf\",\"open\":false},{\"plugin\":\"vector\",\"x\":1450,\"y\":316,\"uid\":\"dxWoR0mw5Vns\",\"open\":false,\"title\":\"Rotation\"},{\"plugin\":\"cos_modulator\",\"x\":1044,\"y\":148,\"uid\":\"4GLB7g3lfgFG\",\"open\":false},{\"plugin\":\"sin_modulator\",\"x\":1043,\"y\":218,\"uid\":\"jiRqIW0WCm0F\",\"open\":false},{\"plugin\":\"const_float_generator\",\"x\":273,\"y\":319,\"uid\":\"ccMpKHkKX0vi\",\"state\":{\"val\":1},\"title\":\"Height of object\"},{\"plugin\":\"vector\",\"x\":1461,\"y\":117,\"uid\":\"seQu0Uqhj96I\",\"open\":false,\"title\":\"Position\"},{\"plugin\":\"output_proxy\",\"x\":1700,\"y\":38,\"uid\":\"o6XEV0HDGmfa\",\"title\":\"position\",\"dyn_in\":[{\"name\":\"output\",\"dt\":5,\"def\":null,\"uid\":\"7XieETMkeKHN\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":1694,\"y\":313,\"uid\":\"qEzbtCxtSeC7\",\"title\":\"rotation\",\"dyn_in\":[{\"name\":\"output\",\"dt\":5,\"def\":null,\"uid\":\"8pZUaNqf0F41\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"annotation\",\"x\":344,\"y\":65,\"uid\":\"JqvgZxEBqeuM\",\"state\":{\"text\":\"Here are the basic controls:\\nHeight from ground,\\nClock speed and\\nCircle radius.\\n\\nConnect this nested patch\\nto \\\"position\\\" and \\\"rotation\\\" slots of an object to see your animation.\",\"width\":244,\"height\":148},\"title\":\"Info\"}],\"conns\":[{\"src_nuid\":\"a2RJUXVGMKUH\",\"dst_nuid\":\"2rUne0tuX797\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"VarYAcHxf6BG\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"2rUne0tuX797\",\"dst_nuid\":\"cxyLlX4K5Lsf\",\"src_slot\":0,\"dst_slot\":\"a\",\"uid\":\"3XIfS4w9hvfE\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"2rUne0tuX797\",\"dst_nuid\":\"4GLB7g3lfgFG\",\"src_slot\":0,\"dst_slot\":\"value\",\"uid\":\"UJw32Xqru729\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"2rUne0tuX797\",\"dst_nuid\":\"jiRqIW0WCm0F\",\"src_slot\":0,\"dst_slot\":\"value\",\"uid\":\"hwY0KI11jwAl\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"offset\":1},{\"src_nuid\":\"VTL7DjpBaqhe\",\"dst_nuid\":\"Idgvu84ysi6n\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"DoEmiU4TqAZr\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"VTL7DjpBaqhe\",\"dst_nuid\":\"MYylIWlLCE1n\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"n6YB5Vz9B4XD\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"jiRqIW0WCm0F\",\"dst_nuid\":\"Idgvu84ysi6n\",\"src_slot\":\"result\",\"dst_slot\":\"a\",\"uid\":\"NyflV8NNP3AC\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Idgvu84ysi6n\",\"dst_nuid\":\"seQu0Uqhj96I\",\"src_slot\":\"result\",\"dst_slot\":\"z\",\"uid\":\"TKvyVOXjGtyY\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"4GLB7g3lfgFG\",\"dst_nuid\":\"MYylIWlLCE1n\",\"src_slot\":\"result\",\"dst_slot\":\"a\",\"uid\":\"TIF0BxGFqml4\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"MYylIWlLCE1n\",\"dst_nuid\":\"seQu0Uqhj96I\",\"src_slot\":\"result\",\"dst_slot\":\"x\",\"uid\":\"c1LFJQW8nc7w\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Vo4YF4dpmsVQ\",\"dst_nuid\":\"cxyLlX4K5Lsf\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"zmXkIX2vEcHZ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"cxyLlX4K5Lsf\",\"dst_nuid\":\"dxWoR0mw5Vns\",\"src_slot\":\"result\",\"dst_slot\":\"y\",\"uid\":\"HozmlBg7T4Sa\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ccMpKHkKX0vi\",\"dst_nuid\":\"seQu0Uqhj96I\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"O6wt68c0d2rW\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"seQu0Uqhj96I\",\"dst_nuid\":\"o6XEV0HDGmfa\",\"src_slot\":\"vector\",\"dst_slot\":0,\"uid\":\"DJ6ngz1f48fV\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"dxWoR0mw5Vns\",\"dst_nuid\":\"qEzbtCxtSeC7\",\"src_slot\":\"vector\",\"dst_slot\":0,\"uid\":\"WEVhNfmO2cZT\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"rotation\",\"dt\":5,\"index\":0,\"uid\":\"rrOyXUL9oOEz\",\"dynamic\":true,\"type\":1,\"is_connected\":true},{\"name\":\"position\",\"dt\":5,\"index\":1,\"uid\":\"ZEYFLq5Sq2zU\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}"
  },
  {
    "path": "browser/patches/_audio-player-and-fft.json",
    "content": "{\n    \"abs_t\": 109.274,\n    \"active_graph\": \"root\",\n    \"graph_uid\": \"TXDgBc0JJtS3\",\n    \"root\": {\n        \"uid\": \"root\",\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 643,\n                \"y\": 143,\n                \"uid\": \"zYJ4w8XeWjh3\",\n                \"state\": {\n                    \"always_update\": true,\n                    \"input_sids\": {\n                        \"ECNDUqFeauhU\": \"wZXVLBHKaJkT\",\n                        \"Z6kQdB98tQCe\": \"vyDYtCSzVH3D\",\n                        \"ytka9379RXjT\": \"BkCNEjj55hF9\"\n                    },\n                    \"output_sids\": {\n                        \"7NGDgyCmxBu5\": \"Y5HOn4ZWnlUE\"\n                    }\n                },\n                \"title\": \"Music player with FFT output\",\n                \"graph\": {\n                    \"uid\": \"kgd6ThrVhkWB\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"audio_source_player\",\n                            \"x\": 1042,\n                            \"y\": 45,\n                            \"uid\": \"HrvJYNuL6v2A\",\n                            \"open\": false\n                        },\n                        {\n                            \"plugin\": \"audio_buffer_source_modulator\",\n                            \"x\": 450,\n                            \"y\": 90,\n                            \"uid\": \"hAcrDFhFpn5c\",\n                            \"state\": 1\n                        },\n                        {\n                            \"plugin\": \"audio_analyse_modulator\",\n                            \"x\": 783,\n                            \"y\": 136,\n                            \"uid\": \"LFTJXVtVuZxu\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 461,\n                            \"y\": 269,\n                            \"uid\": \"j8eSFJcCtAzk\",\n                            \"state\": {\n                                \"val\": 64\n                            },\n                            \"title\": \"Bin count\"\n                        },\n                        {\n                            \"plugin\": \"typed_array_get_modulator\",\n                            \"x\": 1307,\n                            \"y\": 96,\n                            \"uid\": \"r99wpQgKg8Za\"\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1531,\n                            \"y\": 136,\n                            \"uid\": \"7NGDgyCmxBu5\",\n                            \"title\": \"fft bin output\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"def\": null,\n                                    \"uid\": \"OM6pLe00QGiv\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 234,\n                            \"y\": 163,\n                            \"uid\": \"bLuL37k2ythk\",\n                            \"state\": {\n                                \"enabled\": false\n                            },\n                            \"title\": \"loop\"\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 247,\n                            \"y\": 29,\n                            \"uid\": \"ECNDUqFeauhU\",\n                            \"title\": \"input\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 18,\n                                    \"uid\": \"CUfxf4DHkFyf\",\n                                    \"dynamic\": true,\n                                    \"type\": 1,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 496,\n                            \"y\": 373,\n                            \"uid\": \"Z6kQdB98tQCe\",\n                            \"title\": \"mul\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"uid\": \"L23fd2b2gMeV\",\n                                    \"dynamic\": true,\n                                    \"type\": 1,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 258,\n                            \"y\": 118,\n                            \"uid\": \"ytka9379RXjT\",\n                            \"title\": \"play\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 7,\n                                    \"uid\": \"P9AV2kuWAvRQ\",\n                                    \"dynamic\": true,\n                                    \"type\": 1,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"annotation\",\n                            \"x\": 478,\n                            \"y\": 416,\n                            \"uid\": \"36guNYmn594E\",\n                            \"state\": {\n                                \"text\": \"We use 64 bins of frequencies between 0 and 22khz, and carefully select the  bin we would like to synch to depending on the music.\",\n                                \"width\": 347,\n                                \"height\": 136\n                            },\n                            \"title\": \"Info\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 1105,\n                            \"y\": 267,\n                            \"uid\": \"EG924WwwSmeZ\",\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Bin number\"\n                        },\n                        {\n                            \"plugin\": \"annotation\",\n                            \"x\": 1330,\n                            \"y\": 290,\n                            \"uid\": \"5kMJqYxYzg7U\",\n                            \"state\": {\n                                \"text\": \"To add more bins, Copypaste the following plugins:\\n\\n-Bin number\\n-Get typed array\\n-Bin output\\n\\nThen connect the fft-bins output from Analyse into the array of your new copypaste. Then change the bin number to something else.\",\n                                \"width\": 297,\n                                \"height\": 116\n                            },\n                            \"title\": \"Adding more bins\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"hAcrDFhFpn5c\",\n                            \"dst_nuid\": \"LFTJXVtVuZxu\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"dTw9CMhkM9Lz\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"LFTJXVtVuZxu\",\n                            \"dst_nuid\": \"HrvJYNuL6v2A\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"TXEgt9eqZvyE\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"j8eSFJcCtAzk\",\n                            \"dst_nuid\": \"LFTJXVtVuZxu\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"FtrCzsVNP2gT\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"LFTJXVtVuZxu\",\n                            \"dst_nuid\": \"r99wpQgKg8Za\",\n                            \"src_slot\": 1,\n                            \"dst_slot\": 0,\n                            \"uid\": \"yWN27acceUjU\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"r99wpQgKg8Za\",\n                            \"dst_nuid\": \"7NGDgyCmxBu5\",\n                            \"src_slot\": 1,\n                            \"dst_slot\": 0,\n                            \"uid\": \"UfBFKutHx7nS\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"bLuL37k2ythk\",\n                            \"dst_nuid\": \"hAcrDFhFpn5c\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"AG76j4Ht3ShJ\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"ECNDUqFeauhU\",\n                            \"dst_nuid\": \"hAcrDFhFpn5c\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"ReYW7AP6uEPc\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"Z6kQdB98tQCe\",\n                            \"dst_nuid\": \"LFTJXVtVuZxu\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"DFWUZnRh5nnj\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"ytka9379RXjT\",\n                            \"dst_nuid\": \"hAcrDFhFpn5c\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"aA7kB4MeKTUK\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"EG924WwwSmeZ\",\n                            \"dst_nuid\": \"r99wpQgKg8Za\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"nLp9UwjJynn4\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"play\",\n                        \"dt\": 7,\n                        \"index\": 0,\n                        \"uid\": \"BkCNEjj55hF9\",\n                        \"dynamic\": true,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"mul\",\n                        \"dt\": 0,\n                        \"index\": 1,\n                        \"uid\": \"vyDYtCSzVH3D\",\n                        \"dynamic\": true,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"input\",\n                        \"dt\": 18,\n                        \"index\": 2,\n                        \"uid\": \"wZXVLBHKaJkT\",\n                        \"dynamic\": true,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"fft bin output\",\n                        \"dt\": 0,\n                        \"index\": 0,\n                        \"uid\": \"Y5HOn4ZWnlUE\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"url_audio_buffer_generator\",\n                \"x\": 387,\n                \"y\": 207,\n                \"uid\": \"qY4FufJ8PLC2\",\n                \"state\": {\n                    \"url\": \"/data/audio/5bfd9d2ebdb633881640222bf57432d23d0af5c7.mp3\"\n                },\n                \"title\": \"Load audio file\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 385,\n                \"y\": 102,\n                \"uid\": \"dXBDr2yL9zet\",\n                \"state\": {\n                    \"val\": 41.222,\n                    \"min\": 1,\n                    \"max\": 222\n                },\n                \"title\": \"FFT multiplier\"\n            },\n            {\n                \"plugin\": \"toggle_button\",\n                \"x\": 387,\n                \"y\": 291,\n                \"uid\": \"QHuYYMpEB9ej\",\n                \"state\": {\n                    \"enabled\": true\n                },\n                \"title\": \"Play\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": \"QHuYYMpEB9ej\",\n                \"dst_nuid\": \"zYJ4w8XeWjh3\",\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"uid\": \"P5UR7feYX9S4\",\n                \"src_connected\": true,\n                \"dst_connected\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": \"dXBDr2yL9zet\",\n                \"dst_nuid\": \"zYJ4w8XeWjh3\",\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"uid\": \"gtmbuQGYBGbw\",\n                \"src_connected\": true,\n                \"dst_connected\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": \"qY4FufJ8PLC2\",\n                \"dst_nuid\": \"zYJ4w8XeWjh3\",\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"uid\": \"LQGh5sLymjaw\",\n                \"src_connected\": true,\n                \"dst_connected\": true,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/_audio-player.json",
    "content": "{\n    \"abs_t\": 12.068,\n    \"active_graph\": \"root\",\n    \"graph_uid\": \"TXDgBc0JJtS3\",\n    \"root\": {\n        \"uid\": \"root\",\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 505,\n                \"y\": 200,\n                \"uid\": \"EBH83Ab4xPCY\",\n                \"state\": {\n                    \"always_update\": true,\n                    \"input_sids\": {},\n                    \"output_sids\": {}\n                },\n                \"title\": \"Play music or sound\",\n                \"graph\": {\n                    \"uid\": \"Qf52WnCyVKdd\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"audio_source_player\",\n                            \"x\": 1188,\n                            \"y\": 94,\n                            \"uid\": \"eDGjPxwkBYqe\"\n                        },\n                        {\n                            \"plugin\": \"audio_buffer_source_modulator\",\n                            \"x\": 853,\n                            \"y\": 139,\n                            \"uid\": \"ZQNGC35pvhLU\",\n                            \"state\": 1\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 537,\n                            \"y\": 360,\n                            \"uid\": \"HYEaresHSY2G\",\n                            \"state\": {\n                                \"enabled\": false\n                            },\n                            \"title\": \"Loop\"\n                        },\n                        {\n                            \"plugin\": \"annotation\",\n                            \"x\": 1162,\n                            \"y\": 176,\n                            \"uid\": \"A9GeKDZUBDGQ\",\n                            \"state\": {\n                                \"text\": \"Here we use WebAudio to play sound. Please note different browsers treat .MP3 and .OGG files differently.\",\n                                \"width\": 150,\n                                \"height\": 70\n                            }\n                        },\n                        {\n                            \"plugin\": \"url_audio_buffer_generator\",\n                            \"x\": 485,\n                            \"y\": 164,\n                            \"uid\": \"CHRphVK4JdVW\",\n                            \"state\": {\n                                \"url\": \"/data/audio/5bfd9d2ebdb633881640222bf57432d23d0af5c7.mp3\"\n                            },\n                            \"title\": \"Load audio file\"\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 537,\n                            \"y\": 269,\n                            \"uid\": \"pTMfJxrBu88k\",\n                            \"state\": {\n                                \"enabled\": true\n                            },\n                            \"title\": \"Play\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"HYEaresHSY2G\",\n                            \"dst_nuid\": \"ZQNGC35pvhLU\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"Tm4r2PSCNEkv\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"ZQNGC35pvhLU\",\n                            \"dst_nuid\": \"eDGjPxwkBYqe\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"ZSW2RdjkCKZd\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"CHRphVK4JdVW\",\n                            \"dst_nuid\": \"ZQNGC35pvhLU\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"XSDNKYg2UMac\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"pTMfJxrBu88k\",\n                            \"dst_nuid\": \"ZQNGC35pvhLU\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"meAGRexQDg5N\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        }\n                    ]\n                }\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/_basic-clock.json",
    "content": "{\"abs_t\":1560.541,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":728,\"y\":242,\"uid\":\"FAvCOYsg6S0E\",\"state\":{\"always_update\":true,\"input_sids\":{\"lWZ6zcEWL28x\":\"1\"},\"output_sids\":{\"MFrrjLlHx0mc\":\"0\"}},\"title\":\"Basic clock\",\"graph\":{\"uid\":\"Kspfso87MuNq\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"delta_t_generator\",\"x\":234,\"y\":203,\"uid\":\"1d9VHAjac8c9\"},{\"plugin\":\"multiply_modulator\",\"x\":359,\"y\":193,\"uid\":\"HxOxxSg1yA0l\"},{\"plugin\":\"output_proxy\",\"x\":785,\"y\":240,\"uid\":\"MFrrjLlHx0mc\",\"title\":\"time\",\"dyn_in\":[{\"name\":\"input\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true,\"dynamic\":true}]},{\"plugin\":\"input_proxy\",\"x\":250,\"y\":262,\"uid\":\"lWZ6zcEWL28x\",\"title\":\"Speed\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"connected\":true,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"variable_local_read\",\"x\":376,\"y\":310,\"uid\":\"G0INFbPgkThM\",\"title\":\"float\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"variable_local_write\",\"x\":745,\"y\":188,\"uid\":\"HoAY9TAtDrzY\",\"title\":\"float\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":0,\"is_connected\":true,\"dynamic\":true}]},{\"plugin\":\"add_modulator\",\"x\":484,\"y\":223,\"uid\":\"DdN24g1a32H3\"},{\"plugin\":\"if_else_modulator\",\"x\":604,\"y\":249,\"uid\":\"PFwQIUjrqe8O\"},{\"plugin\":\"const_float_generator\",\"x\":488,\"y\":351,\"uid\":\"jALr1ZzL6lPF\",\"state\":{\"val\":0},\"title\":\"Reset\"},{\"plugin\":\"initialise_generator\",\"x\":520,\"y\":160,\"uid\":\"25WAISKP7Cxm\"}],\"conns\":[{\"src_nuid\":\"1d9VHAjac8c9\",\"dst_nuid\":\"HxOxxSg1yA0l\",\"src_slot\":\"seconds\",\"dst_slot\":\"a\",\"uid\":\"FWMZJAQBENbS\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"lWZ6zcEWL28x\",\"dst_nuid\":\"HxOxxSg1yA0l\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"BdZSpwaqDwNc\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"25WAISKP7Cxm\",\"dst_nuid\":\"PFwQIUjrqe8O\",\"src_slot\":\"bool\",\"dst_slot\":\"condition\",\"uid\":\"HhoSFcJRhL6I\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"G0INFbPgkThM\",\"dst_nuid\":\"DdN24g1a32H3\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"v5E9gZeH6IAA\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"HxOxxSg1yA0l\",\"dst_nuid\":\"DdN24g1a32H3\",\"src_slot\":\"result\",\"dst_slot\":\"a\",\"uid\":\"buq56NIoihEc\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"DdN24g1a32H3\",\"dst_nuid\":\"PFwQIUjrqe8O\",\"src_slot\":\"result\",\"dst_slot\":\"false value\",\"uid\":\"XSOOeCxAg0gQ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"jALr1ZzL6lPF\",\"dst_nuid\":\"PFwQIUjrqe8O\",\"src_slot\":\"value\",\"dst_slot\":\"true value\",\"uid\":\"O4y9aU75ayyu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"PFwQIUjrqe8O\",\"dst_nuid\":\"HoAY9TAtDrzY\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"by2g4CFnu9Xd\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"PFwQIUjrqe8O\",\"dst_nuid\":\"MFrrjLlHx0mc\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"UhgtavGUBgJS\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true,\"offset\":1}],\"variables\":[{\"id\":\"float\",\"dt\":0}]},\"dyn_in\":[{\"name\":\"Speed\",\"dt\":0,\"uid\":\"1\",\"index\":0,\"type\":0,\"is_connected\":true,\"dynamic\":true}],\"dyn_out\":[{\"name\":\"time\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"dynamic\":true}]},{\"plugin\":\"slider_float_generator\",\"x\":429,\"y\":274,\"uid\":\"LSlIirXXDY28\",\"state\":{\"val\":0.3,\"min\":0,\"max\":1},\"title\":\"Clock speed\"}],\"conns\":[{\"src_nuid\":\"LSlIirXXDY28\",\"dst_nuid\":\"FAvCOYsg6S0E\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"ZkDOKkmhiuoe\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]}}"
  },
  {
    "path": "browser/patches/_example-gaze-button.json",
    "content": "{\"abs_t\":253.709,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"on_three_object_gaze_clicked\",\"x\":332,\"y\":147,\"uid\":\"ysCSJh5vBXbW\",\"state\":{\"nodeRef\":\"XzNSpjZU7Bbj.TC53dADgAn72\",\"type\":0},\"title\":\"Gaze Click\"},{\"plugin\":\"graph\",\"x\":559,\"y\":82,\"uid\":\"ztt8Vrheyrzy\",\"state\":{\"always_update\":true,\"input_sids\":{\"cQnSgT6y7mHa\":\"uySY5hZYTGZz\"},\"output_sids\":{\"4Y4rfnC2dYVG\":\"meyY5XDMKJ8m\"}},\"title\":\"Scale on Click\",\"graph\":{\"uid\":\"CkN5jP8Y5y9r\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"input_proxy\",\"x\":410,\"y\":337,\"uid\":\"cQnSgT6y7mHa\",\"title\":\"click impulse\",\"dyn_out\":[{\"name\":\"input\",\"dt\":7,\"uid\":\"Gt2RHxRweRQW\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":1597,\"y\":395,\"uid\":\"4Y4rfnC2dYVG\",\"title\":\"value\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"def\":null,\"uid\":\"FnrtMvEHSK6L\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"array_blend_modulator_vector3\",\"x\":1210,\"y\":478,\"uid\":\"HqFHpZWXfUHk\",\"state\":{\"blendFuncId\":\"smoothstep-blend\"},\"dyn_in\":[{\"name\":\"0\",\"dt\":5,\"array\":false,\"uid\":\"LvzQAHbTLkGP\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true},{\"type\":0,\"name\":\"1\",\"dt\":5,\"array\":false,\"uid\":\"hy5VQWU4UJxB\",\"dynamic\":true,\"index\":1,\"is_connected\":true},{\"type\":0,\"name\":\"2\",\"dt\":5,\"array\":false,\"uid\":\"TgZwpQ7gzyTJ\",\"dynamic\":true,\"index\":2,\"is_connected\":false},{\"type\":0,\"name\":\"3\",\"dt\":5,\"array\":false,\"uid\":\"YQvd8hhj5tBF\",\"dynamic\":true,\"index\":3}]},{\"plugin\":\"vector\",\"x\":612,\"y\":624,\"uid\":\"VnNXDHzpMxG2\",\"title\":\"Scale 1\"},{\"plugin\":\"vector\",\"x\":692,\"y\":774,\"uid\":\"VKPNeAaeT9vf\",\"title\":\"Scale 2\"},{\"plugin\":\"const_float_generator\",\"x\":432,\"y\":803,\"uid\":\"ZShtRN6QTaB5\",\"state\":{\"val\":1}},{\"plugin\":\"const_float_generator\",\"x\":791,\"y\":524,\"uid\":\"XhfFJN7s3k6E\",\"state\":{\"val\":0.5},\"title\":\"animation duration\"},{\"plugin\":\"const_float_generator\",\"x\":394,\"y\":625,\"uid\":\"ebwu2ZQThWYQ\",\"state\":{\"val\":1.5}},{\"plugin\":\"convert_bool_float_modulator\",\"x\":611,\"y\":319,\"uid\":\"f2RrzSHbpPAF\"},{\"plugin\":\"accumulate_modulator\",\"x\":817,\"y\":316,\"uid\":\"kdmG93TBAZhJ\",\"open\":false,\"state\":{\"value\":553}},{\"plugin\":\"modulate_modulator\",\"x\":1023,\"y\":358,\"uid\":\"YButqPzbjp8e\",\"open\":false},{\"plugin\":\"const_float_generator\",\"x\":762,\"y\":417,\"uid\":\"ncKWDr6zeXZd\",\"state\":{\"val\":2},\"title\":\"number of positions\"},{\"plugin\":\"convert_vector_xyz_modulator\",\"x\":1529,\"y\":482,\"uid\":\"S78YeSNy6fWQ\"}],\"conns\":[{\"src_nuid\":\"XhfFJN7s3k6E\",\"dst_nuid\":\"HqFHpZWXfUHk\",\"src_slot\":\"value\",\"dst_slot\":\"duration\",\"uid\":\"X3mXjmUn5TJM\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"VKPNeAaeT9vf\",\"dst_nuid\":\"HqFHpZWXfUHk\",\"src_slot\":\"vector\",\"dst_slot\":1,\"uid\":\"ysCfHEacFsAV\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"VnNXDHzpMxG2\",\"dst_nuid\":\"HqFHpZWXfUHk\",\"src_slot\":\"vector\",\"dst_slot\":0,\"uid\":\"mzHBKDvCaDFz\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"cQnSgT6y7mHa\",\"dst_nuid\":\"f2RrzSHbpPAF\",\"src_slot\":0,\"dst_slot\":\"bool\",\"uid\":\"z7Qr8ZWtuQWe\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"f2RrzSHbpPAF\",\"dst_nuid\":\"kdmG93TBAZhJ\",\"src_slot\":\"value\",\"dst_slot\":\"value\",\"uid\":\"3C7X5e9ccXVW\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"kdmG93TBAZhJ\",\"dst_nuid\":\"YButqPzbjp8e\",\"src_slot\":\"value\",\"dst_slot\":\"value\",\"uid\":\"txzSfRG9p7g6\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"YButqPzbjp8e\",\"dst_nuid\":\"HqFHpZWXfUHk\",\"src_slot\":\"result\",\"dst_slot\":\"number\",\"uid\":\"4BKtMdtujQas\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ncKWDr6zeXZd\",\"dst_nuid\":\"YButqPzbjp8e\",\"src_slot\":\"value\",\"dst_slot\":\"limit\",\"uid\":\"UwXZMbADNp7y\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ebwu2ZQThWYQ\",\"dst_nuid\":\"VnNXDHzpMxG2\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"qqbecdaQp47d\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ebwu2ZQThWYQ\",\"dst_nuid\":\"VnNXDHzpMxG2\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"mvJHhwxQDCtX\",\"src_connected\":true,\"dst_connected\":true,\"offset\":1},{\"src_nuid\":\"ebwu2ZQThWYQ\",\"dst_nuid\":\"VnNXDHzpMxG2\",\"src_slot\":\"value\",\"dst_slot\":\"z\",\"uid\":\"sh2Cjeg5AGjX\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ZShtRN6QTaB5\",\"dst_nuid\":\"VKPNeAaeT9vf\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"b9VBAmPfjVNp\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ZShtRN6QTaB5\",\"dst_nuid\":\"VKPNeAaeT9vf\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"qKRzU2b5SwTr\",\"src_connected\":true,\"dst_connected\":true,\"offset\":1},{\"src_nuid\":\"ZShtRN6QTaB5\",\"dst_nuid\":\"VKPNeAaeT9vf\",\"src_slot\":\"value\",\"dst_slot\":\"z\",\"uid\":\"Mu3zyL5vMRSK\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"HqFHpZWXfUHk\",\"dst_nuid\":\"S78YeSNy6fWQ\",\"src_slot\":\"value\",\"dst_slot\":\"vector\",\"uid\":\"kApUWn3kTvKy\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"S78YeSNy6fWQ\",\"dst_nuid\":\"4Y4rfnC2dYVG\",\"src_slot\":\"x\",\"dst_slot\":0,\"uid\":\"awAXzXqsWuha\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"name\":\"click impulse\",\"dt\":7,\"index\":0,\"uid\":\"uySY5hZYTGZz\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"index\":0,\"uid\":\"meyY5XDMKJ8m\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":775,\"y\":82,\"uid\":\"waxfD4gVcEKS\",\"state\":{\"always_update\":true,\"input_sids\":{\"GFsvS9nLh4hD\":\"nqTUF4XZQUea\"},\"output_sids\":{\"sbW758CvUYfc\":\"mh0rTKkFm0nD\"}},\"title\":\"Red Button\",\"graph\":{\"uid\":\"XzNSpjZU7Bbj\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1187,\"y\":356,\"uid\":\"TC53dADgAn72\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1},\"pivot\":{\"x\":0,\"y\":0,\"z\":0}}},{\"plugin\":\"output_proxy\",\"x\":1386,\"y\":355,\"uid\":\"sbW758CvUYfc\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_material_phong\",\"x\":759,\"y\":91,\"uid\":\"ugMTunSc7zRn\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":538,\"y\":679,\"uid\":\"KLJw7vLxbNjA\",\"state\":{\"val\":0.6},\"title\":\"Radius\"},{\"plugin\":\"three_geometry_cylinder\",\"x\":652,\"y\":445,\"uid\":\"qLrT43WubKkM\"},{\"plugin\":\"const_float_generator\",\"x\":297,\"y\":575,\"uid\":\"h95K74wKzn6t\",\"state\":{\"val\":1},\"title\":\"Height segments\"},{\"plugin\":\"const_float_generator\",\"x\":284,\"y\":488,\"uid\":\"GccYw2JUYg6B\",\"state\":{\"val\":64},\"title\":\"Radius Segments\"},{\"plugin\":\"toggle_button\",\"x\":320,\"y\":662,\"uid\":\"BK3aPdrsZEvH\",\"state\":{\"enabled\":false},\"title\":\"Open Ended ?\"},{\"plugin\":\"input_proxy\",\"x\":358,\"y\":412,\"uid\":\"GFsvS9nLh4hD\",\"title\":\"height\",\"dyn_out\":[{\"name\":\"input\",\"dt\":0,\"uid\":\"t7ePrX5wunC8\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"color_picker\",\"x\":384,\"y\":189,\"uid\":\"3kbVGe5qeG5W\",\"state\":{\"hue\":0,\"sat\":1,\"lum\":1}}],\"conns\":[{\"src_nuid\":\"TC53dADgAn72\",\"dst_nuid\":\"sbW758CvUYfc\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"6QKkwrxjvxAF\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"ugMTunSc7zRn\",\"dst_nuid\":\"TC53dADgAn72\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"2bQpMRyJNdT2\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"qLrT43WubKkM\",\"dst_nuid\":\"TC53dADgAn72\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"JV8yRe8C6m9q\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"KLJw7vLxbNjA\",\"dst_nuid\":\"qLrT43WubKkM\",\"src_slot\":\"value\",\"dst_slot\":\"radiusTop\",\"uid\":\"3gnQVUyRwZBB\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"KLJw7vLxbNjA\",\"dst_nuid\":\"qLrT43WubKkM\",\"src_slot\":\"value\",\"dst_slot\":\"radiusBottom\",\"uid\":\"WMHngpQCBgtp\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"h95K74wKzn6t\",\"dst_nuid\":\"qLrT43WubKkM\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"VnauKkTRgvks\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"GccYw2JUYg6B\",\"dst_nuid\":\"qLrT43WubKkM\",\"src_slot\":\"value\",\"dst_slot\":\"radiusSegments\",\"uid\":\"dwR6NuMehf9K\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"BK3aPdrsZEvH\",\"dst_nuid\":\"qLrT43WubKkM\",\"src_slot\":\"bool\",\"dst_slot\":\"openEnded\",\"uid\":\"pJrjCkRQYWZa\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"GFsvS9nLh4hD\",\"dst_nuid\":\"qLrT43WubKkM\",\"src_slot\":0,\"dst_slot\":\"height\",\"uid\":\"d2pePW32rTsz\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"3kbVGe5qeG5W\",\"dst_nuid\":\"ugMTunSc7zRn\",\"src_slot\":\"color\",\"dst_slot\":\"color\",\"uid\":\"T6XmPrm9Xd2j\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"height\",\"dt\":0,\"index\":0,\"uid\":\"nqTUF4XZQUea\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":776,\"y\":149,\"uid\":\"NGdc2edkK2mp\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"BY45p6MF9k6c\":\"mh0rTKkFm0nD\"}},\"title\":\"Button base\",\"graph\":{\"uid\":\"preuGVd33qMX\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1187,\"y\":356,\"uid\":\"27JxJUyPW4NK\",\"state\":{\"position\":{\"x\":0,\"y\":-0.10034686220571776,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1},\"pivot\":{\"x\":0,\"y\":0,\"z\":0}}},{\"plugin\":\"output_proxy\",\"x\":1386,\"y\":355,\"uid\":\"BY45p6MF9k6c\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_material_phong\",\"x\":759,\"y\":91,\"uid\":\"8EFZnnU7k97C\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":277,\"y\":397,\"uid\":\"X5zRkR7cfgBS\",\"state\":{\"val\":1},\"title\":\"Height\"},{\"plugin\":\"const_float_generator\",\"x\":557,\"y\":522,\"uid\":\"84hWWjcL8WF8\",\"state\":{\"val\":1},\"title\":\"Radius\"},{\"plugin\":\"three_geometry_cylinder\",\"x\":759,\"y\":551,\"uid\":\"S3K4BZZrHZtj\"},{\"plugin\":\"const_float_generator\",\"x\":297,\"y\":575,\"uid\":\"3GwEB3cuSNap\",\"state\":{\"val\":1},\"title\":\"Height segments\"},{\"plugin\":\"const_float_generator\",\"x\":284,\"y\":488,\"uid\":\"kQuEhQXHxtFK\",\"state\":{\"val\":64},\"title\":\"Radius Segments\"},{\"plugin\":\"toggle_button\",\"x\":320,\"y\":662,\"uid\":\"KGHbzNBnT6Ap\",\"state\":{\"enabled\":false},\"title\":\"Open Ended ?\"},{\"plugin\":\"color_picker\",\"x\":435,\"y\":208,\"uid\":\"cdamFhkguKVY\",\"state\":{\"hue\":0,\"sat\":0.016853932584269662,\"lum\":0.8833333333333333}}],\"conns\":[{\"src_nuid\":\"27JxJUyPW4NK\",\"dst_nuid\":\"BY45p6MF9k6c\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"dWHeyRMSShXC\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"8EFZnnU7k97C\",\"dst_nuid\":\"27JxJUyPW4NK\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"Xd3Htna8Y4UK\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"S3K4BZZrHZtj\",\"dst_nuid\":\"27JxJUyPW4NK\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"uJxyvmtw4zR9\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"84hWWjcL8WF8\",\"dst_nuid\":\"S3K4BZZrHZtj\",\"src_slot\":\"value\",\"dst_slot\":\"radiusTop\",\"uid\":\"w478dbxRqGJj\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"84hWWjcL8WF8\",\"dst_nuid\":\"S3K4BZZrHZtj\",\"src_slot\":\"value\",\"dst_slot\":\"radiusBottom\",\"uid\":\"wquXH9AhyC9L\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"X5zRkR7cfgBS\",\"dst_nuid\":\"S3K4BZZrHZtj\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"93kWWa7jWs9C\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"3GwEB3cuSNap\",\"dst_nuid\":\"S3K4BZZrHZtj\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"jXKvzehTv746\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"kQuEhQXHxtFK\",\"dst_nuid\":\"S3K4BZZrHZtj\",\"src_slot\":\"value\",\"dst_slot\":\"radiusSegments\",\"uid\":\"TBqVEWm95QTE\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"KGHbzNBnT6Ap\",\"dst_nuid\":\"S3K4BZZrHZtj\",\"src_slot\":\"bool\",\"dst_slot\":\"openEnded\",\"uid\":\"Mqs3qtR4Xcpv\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"cdamFhkguKVY\",\"dst_nuid\":\"8EFZnnU7k97C\",\"src_slot\":\"color\",\"dst_slot\":\"color\",\"uid\":\"rpxpCmTY5zfm\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":776,\"y\":217,\"uid\":\"MwHdm8g9aC35\",\"state\":{\"always_update\":true,\"input_sids\":{\"XNHu654KeH9E\":\"Pv8Wpy7z9smn\"},\"output_sids\":{\"pCH8cMB8Qutg\":\"mh0rTKkFm0nD\"}},\"title\":\"Screen\",\"graph\":{\"uid\":\"zVT3KLNTvS6B\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1219,\"y\":454,\"uid\":\"7kzFCP8gSQbb\",\"state\":{\"position\":{\"x\":0.02082655270964437,\"y\":1.314264063809735,\"z\":-5.085863797386789},\"scale\":{\"x\":5.703307645992521,\"y\":2.2966869870654962,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1},\"pivot\":{\"x\":0,\"y\":0,\"z\":0}}},{\"plugin\":\"output_proxy\",\"x\":1418,\"y\":453,\"uid\":\"pCH8cMB8Qutg\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":669,\"y\":542,\"uid\":\"D8mFCDBRaXEA\",\"state\":{\"val\":16},\"title\":\"Segments\"},{\"plugin\":\"three_geometry_plane\",\"x\":925,\"y\":466,\"uid\":\"3KfTj6UGmzC8\"},{\"plugin\":\"three_material\",\"x\":799,\"y\":114,\"uid\":\"Fp7BZwPQfE37\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":664,\"y\":451,\"uid\":\"8ugWt5qRcCQs\",\"state\":{\"val\":1},\"title\":\"Width & Height\"},{\"plugin\":\"input_proxy\",\"x\":218,\"y\":291,\"uid\":\"XNHu654KeH9E\",\"title\":\"transparency\",\"dyn_out\":[{\"name\":\"input\",\"dt\":7,\"uid\":\"ChWME4uyuXxx\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":486,\"y\":229,\"uid\":\"H4vxrKJ7KGnP\",\"state\":{\"val\":0}},{\"plugin\":\"toggle_modulator\",\"x\":371,\"y\":364,\"uid\":\"4YUF3Yk7dtkh\",\"state\":{\"value\":false}}],\"conns\":[{\"src_nuid\":\"7kzFCP8gSQbb\",\"dst_nuid\":\"pCH8cMB8Qutg\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"5cXaAzQYhzfS\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"3KfTj6UGmzC8\",\"dst_nuid\":\"7kzFCP8gSQbb\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"69hLYUuxLgNH\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Fp7BZwPQfE37\",\"dst_nuid\":\"7kzFCP8gSQbb\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"mP8GFxFU7zZ8\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"8ugWt5qRcCQs\",\"dst_nuid\":\"3KfTj6UGmzC8\",\"src_slot\":\"value\",\"dst_slot\":\"width\",\"uid\":\"TxLF8bWqCSfQ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"8ugWt5qRcCQs\",\"dst_nuid\":\"3KfTj6UGmzC8\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"TJGDUebH3Kp8\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"D8mFCDBRaXEA\",\"dst_nuid\":\"3KfTj6UGmzC8\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"3z4t2rFvnL2w\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"D8mFCDBRaXEA\",\"dst_nuid\":\"3KfTj6UGmzC8\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"PeCYGGwXg9uv\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"H4vxrKJ7KGnP\",\"dst_nuid\":\"Fp7BZwPQfE37\",\"src_slot\":\"value\",\"dst_slot\":\"opacity\",\"uid\":\"vTFbEeZ52uea\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"XNHu654KeH9E\",\"dst_nuid\":\"4YUF3Yk7dtkh\",\"src_slot\":0,\"dst_slot\":\"trigger\",\"uid\":\"F7mS4yEwpTP6\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"4YUF3Yk7dtkh\",\"dst_nuid\":\"Fp7BZwPQfE37\",\"src_slot\":\"bool\",\"dst_slot\":\"transparent\",\"uid\":\"gwSpGHjywFZC\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"transparency\",\"dt\":7,\"index\":0,\"uid\":\"Pv8Wpy7z9smn\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"annotation\",\"x\":539,\"y\":155,\"uid\":\"mH2SWLc2WehA\",\"state\":{\"text\":\"Connect the three object3d slots to the scene to see this example.\\n\\nGaze clicking the button will display a screen in front of it.\",\"width\":150,\"height\":70}}],\"conns\":[{\"src_nuid\":\"ysCSJh5vBXbW\",\"dst_nuid\":\"ztt8Vrheyrzy\",\"src_slot\":\"trigger\",\"dst_slot\":0,\"uid\":\"CTkuMWgmm8gS\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"ztt8Vrheyrzy\",\"dst_nuid\":\"waxfD4gVcEKS\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"b99WbK9T4PEd\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"ysCSJh5vBXbW\",\"dst_nuid\":\"MwHdm8g9aC35\",\"src_slot\":\"trigger\",\"dst_slot\":0,\"uid\":\"tZ38hcgBdvdJ\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]}}"
  },
  {
    "path": "browser/patches/_example-gaze-clicking.json",
    "content": "{\n    \"abs_t\": 160.268,\n    \"active_graph\": \"root\",\n    \"graph_uid\": \"TXDgBc0JJtS3\",\n    \"root\": {\n        \"uid\": \"root\",\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 677,\n                \"y\": 117,\n                \"uid\": \"ECZAUK6pars4\",\n                \"state\": {\n                    \"always_update\": true,\n                    \"input_sids\": {\n                        \"4XFDvnsmAn6w\": \"uYApCSHb5Vth\"\n                    },\n                    \"output_sids\": {\n                        \"D2MNS7yzzHgN\": \"Ys30r7aVEks1\"\n                    }\n                },\n                \"title\": \"Box\",\n                \"graph\": {\n                    \"uid\": \"EURNtUKvtem6\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"three_mesh\",\n                            \"x\": 845,\n                            \"y\": 150,\n                            \"uid\": \"YH4ATZ6USrYD\",\n                            \"state\": {\n                                \"position\": {\n                                    \"x\": 0.03717239065720079,\n                                    \"y\": 0.03926023317848015,\n                                    \"z\": -1.193571944882679\n                                },\n                                \"scale\": {\n                                    \"x\": 0.0094948370835134,\n                                    \"y\": 0.0094948370835134,\n                                    \"z\": 0.0094948370835134\n                                },\n                                \"quaternion\": {\n                                    \"_x\": 0,\n                                    \"_y\": 0,\n                                    \"_z\": 0,\n                                    \"_w\": 1\n                                },\n                                \"pivot\": {\n                                    \"x\": 0,\n                                    \"y\": 0,\n                                    \"z\": 0\n                                }\n                            }\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1113,\n                            \"y\": 194,\n                            \"uid\": \"D2MNS7yzzHgN\",\n                            \"title\": \"object3d\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 21,\n                                    \"def\": null,\n                                    \"uid\": \"UW8xhKSPhTFp\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 293,\n                            \"y\": 254,\n                            \"uid\": \"4XFDvnsmAn6w\",\n                            \"title\": \"position\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 5,\n                                    \"uid\": \"DgJuxCAzpaau\",\n                                    \"dynamic\": true,\n                                    \"type\": 1,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"three_geometry_box\",\n                            \"x\": 548,\n                            \"y\": 164,\n                            \"uid\": \"MZ78sHYS4Sw4\",\n                            \"open\": false\n                        },\n                        {\n                            \"plugin\": \"three_material\",\n                            \"x\": 386,\n                            \"y\": 325,\n                            \"uid\": \"jBQ74fxeZ6qC\",\n                            \"state\": {}\n                        },\n                        {\n                            \"plugin\": \"color_picker\",\n                            \"x\": 148,\n                            \"y\": 324,\n                            \"uid\": \"u5Fkr6RMCHAG\",\n                            \"state\": {\n                                \"hue\": 0.7977468539325843,\n                                \"sat\": 0.9719101123595506,\n                                \"lum\": 0.925\n                            }\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"YH4ATZ6USrYD\",\n                            \"dst_nuid\": \"D2MNS7yzzHgN\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"DeR76prFmHqZ\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"4XFDvnsmAn6w\",\n                            \"dst_nuid\": \"YH4ATZ6USrYD\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"uid\": \"WzpRsKtJWNzE\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"MZ78sHYS4Sw4\",\n                            \"dst_nuid\": \"YH4ATZ6USrYD\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"qEyvR7Mvw2AC\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"jBQ74fxeZ6qC\",\n                            \"dst_nuid\": \"YH4ATZ6USrYD\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"Bshudzk3AaRM\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"u5Fkr6RMCHAG\",\n                            \"dst_nuid\": \"jBQ74fxeZ6qC\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"yV5SdVDGkv75\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"position\",\n                        \"dt\": 5,\n                        \"index\": 0,\n                        \"uid\": \"uYApCSHb5Vth\",\n                        \"dynamic\": true,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"object3d\",\n                        \"dt\": 21,\n                        \"index\": 0,\n                        \"uid\": \"Ys30r7aVEks1\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"on_three_object_gaze_clicked\",\n                \"x\": 179,\n                \"y\": 188,\n                \"uid\": \"MsXHsYbaJCVq\",\n                \"state\": {\n                    \"nodeRef\": \"EURNtUKvtem6.YH4ATZ6USrYD\",\n                    \"type\": 0\n                },\n                \"title\": \"Gaze clicked\"\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 382,\n                \"y\": 149,\n                \"uid\": \"v2cdTX2cEaAh\",\n                \"state\": {\n                    \"always_update\": true,\n                    \"input_sids\": {\n                        \"9JLXxK4FZyFk\": \"uySY5hZYTGZz\"\n                    },\n                    \"output_sids\": {\n                        \"t7pZQ2CrTXEn\": \"meyY5XDMKJ8m\"\n                    }\n                },\n                \"title\": \"Switch Position On Gaze Click\",\n                \"graph\": {\n                    \"uid\": \"xfEjBCPZb9Fa\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 263,\n                            \"y\": 415,\n                            \"uid\": \"9JLXxK4FZyFk\",\n                            \"title\": \"click impulse\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 7,\n                                    \"uid\": \"Gt2RHxRweRQW\",\n                                    \"dynamic\": true,\n                                    \"type\": 1,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1410,\n                            \"y\": 572,\n                            \"uid\": \"t7pZQ2CrTXEn\",\n                            \"title\": \"position\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 5,\n                                    \"def\": null,\n                                    \"uid\": \"FnrtMvEHSK6L\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"array_blend_modulator_vector3\",\n                            \"x\": 1095,\n                            \"y\": 542,\n                            \"uid\": \"MMz4nAAmWYNk\",\n                            \"state\": {\n                                \"blendFuncId\": \"smoothstep-blend\"\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"0\",\n                                    \"dt\": 5,\n                                    \"array\": false,\n                                    \"uid\": \"LvzQAHbTLkGP\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"type\": 0,\n                                    \"name\": \"1\",\n                                    \"dt\": 5,\n                                    \"array\": false,\n                                    \"uid\": \"hy5VQWU4UJxB\",\n                                    \"dynamic\": true,\n                                    \"index\": 1,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"type\": 0,\n                                    \"name\": \"2\",\n                                    \"dt\": 5,\n                                    \"array\": false,\n                                    \"uid\": \"TgZwpQ7gzyTJ\",\n                                    \"dynamic\": true,\n                                    \"index\": 2,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"type\": 0,\n                                    \"name\": \"3\",\n                                    \"dt\": 5,\n                                    \"array\": false,\n                                    \"uid\": \"DQeNWu8xf6Cw\",\n                                    \"dynamic\": true,\n                                    \"index\": 3,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"type\": 0,\n                                    \"name\": \"4\",\n                                    \"dt\": 5,\n                                    \"array\": false,\n                                    \"uid\": \"hNcuGpYtkLhF\",\n                                    \"dynamic\": true,\n                                    \"index\": 4\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 621,\n                            \"y\": 657,\n                            \"uid\": \"QeLnsz6GZxKt\",\n                            \"open\": false,\n                            \"title\": \"XYZ to Vector (lower left)\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 620,\n                            \"y\": 698,\n                            \"uid\": \"J6UxJQnx3Lpw\",\n                            \"open\": false,\n                            \"title\": \"XYZ to Vector (lower right)\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 334,\n                            \"y\": 754,\n                            \"uid\": \"KtPF4YrV8MWa\",\n                            \"state\": {\n                                \"val\": 1\n                            }\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 622,\n                            \"y\": 563,\n                            \"uid\": \"VQUJyBPLwDff\",\n                            \"state\": {\n                                \"val\": 2\n                            },\n                            \"title\": \"animation duration\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 335,\n                            \"y\": 660,\n                            \"uid\": \"Mw27vAuykS8y\",\n                            \"state\": {\n                                \"val\": -1\n                            }\n                        },\n                        {\n                            \"plugin\": \"convert_bool_float_modulator\",\n                            \"x\": 496,\n                            \"y\": 383,\n                            \"uid\": \"aNn8J2Qm5TPN\"\n                        },\n                        {\n                            \"plugin\": \"accumulate_modulator\",\n                            \"x\": 702,\n                            \"y\": 380,\n                            \"uid\": \"ntTR3zhwrZSk\",\n                            \"open\": false,\n                            \"state\": {\n                                \"value\": 6\n                            }\n                        },\n                        {\n                            \"plugin\": \"modulate_modulator\",\n                            \"x\": 908,\n                            \"y\": 422,\n                            \"uid\": \"bcRKqbqQHRX7\",\n                            \"open\": false\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 647,\n                            \"y\": 481,\n                            \"uid\": \"YAEpyYuUj5tf\",\n                            \"open\": false,\n                            \"state\": {\n                                \"val\": 4\n                            },\n                            \"title\": \"number of positions\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 620,\n                            \"y\": 738,\n                            \"uid\": \"REURq5KNY7gn\",\n                            \"open\": false,\n                            \"title\": \"XYZ to Vector (upper right)\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 621,\n                            \"y\": 780,\n                            \"uid\": \"wfcwKumFzxHh\",\n                            \"open\": false,\n                            \"title\": \"XYZ to Vector (upper left)\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"MMz4nAAmWYNk\",\n                            \"dst_nuid\": \"t7pZQ2CrTXEn\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"YMYJJScJPJcE\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"VQUJyBPLwDff\",\n                            \"dst_nuid\": \"MMz4nAAmWYNk\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"jJfYKk2cq3D3\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"Mw27vAuykS8y\",\n                            \"dst_nuid\": \"QeLnsz6GZxKt\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"WXeKveMHwC84\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"J6UxJQnx3Lpw\",\n                            \"dst_nuid\": \"MMz4nAAmWYNk\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"LxANDyhGmk4H\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"KtPF4YrV8MWa\",\n                            \"dst_nuid\": \"J6UxJQnx3Lpw\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"R78tdxkh2QNJ\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"QeLnsz6GZxKt\",\n                            \"dst_nuid\": \"MMz4nAAmWYNk\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"uCSfTqTTzj5x\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"9JLXxK4FZyFk\",\n                            \"dst_nuid\": \"aNn8J2Qm5TPN\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"GcxuauN5mghW\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"aNn8J2Qm5TPN\",\n                            \"dst_nuid\": \"ntTR3zhwrZSk\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"J6Gg2sM6ruDC\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"ntTR3zhwrZSk\",\n                            \"dst_nuid\": \"bcRKqbqQHRX7\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"nwu5hKHHfxV4\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"bcRKqbqQHRX7\",\n                            \"dst_nuid\": \"MMz4nAAmWYNk\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"X2rAykCVyYHB\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"YAEpyYuUj5tf\",\n                            \"dst_nuid\": \"bcRKqbqQHRX7\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"wEGdF8GePGj6\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"KtPF4YrV8MWa\",\n                            \"dst_nuid\": \"REURq5KNY7gn\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"VurTd2E4kDQa\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"Mw27vAuykS8y\",\n                            \"dst_nuid\": \"wfcwKumFzxHh\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"ZjG8CSLPuBzd\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"KtPF4YrV8MWa\",\n                            \"dst_nuid\": \"REURq5KNY7gn\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"ZZHXRQn9kZzS\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"KtPF4YrV8MWa\",\n                            \"dst_nuid\": \"wfcwKumFzxHh\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"rEgn6bM2Gjnp\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"REURq5KNY7gn\",\n                            \"dst_nuid\": \"MMz4nAAmWYNk\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"JjJsefmJrpVX\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"wfcwKumFzxHh\",\n                            \"dst_nuid\": \"MMz4nAAmWYNk\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"uid\": \"mpDKrc3rNfWC\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"click impulse\",\n                        \"dt\": 7,\n                        \"index\": 0,\n                        \"uid\": \"uySY5hZYTGZz\",\n                        \"dynamic\": true,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"position\",\n                        \"dt\": 5,\n                        \"index\": 0,\n                        \"uid\": \"meyY5XDMKJ8m\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": \"v2cdTX2cEaAh\",\n                \"dst_nuid\": \"ECZAUK6pars4\",\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"uid\": \"vr78UpdqLBsz\",\n                \"src_connected\": true,\n                \"dst_connected\": true,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": \"MsXHsYbaJCVq\",\n                \"dst_nuid\": \"v2cdTX2cEaAh\",\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"uid\": \"szLzju3avdA4\",\n                \"src_connected\": true,\n                \"dst_connected\": true,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/_example-inputs-to-array.json",
    "content": "{\"abs_t\":282.729,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"inputs_to_array\",\"x\":535,\"y\":54,\"uid\":\"vVgFnqfjmD9r\",\"dyn_in\":[{\"name\":\"0\",\"dt\":21,\"array\":false,\"uid\":\"vCwPv9Z4YFCw\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true},{\"type\":0,\"name\":\"1\",\"dt\":21,\"array\":false,\"uid\":\"5X9vjCZx4bHM\",\"dynamic\":true,\"index\":1,\"is_connected\":true},{\"type\":0,\"name\":\"2\",\"dt\":21,\"array\":false,\"uid\":\"J3BSBpYLSx2j\",\"dynamic\":true,\"index\":2,\"is_connected\":true},{\"type\":0,\"name\":\"3\",\"dt\":21,\"array\":false,\"uid\":\"St5PK5GBLUMQ\",\"dynamic\":true,\"index\":3}]},{\"plugin\":\"graph\",\"x\":338,\"y\":49,\"uid\":\"nvz6FkSBZYvX\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"tVpX6eFBZ5QF\":\"mh0rTKkFm0nD\"}},\"title\":\"Box\",\"graph\":{\"uid\":\"QH8WxurqPrnd\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_geometry_box\",\"x\":883,\"y\":690,\"uid\":\"CmSTvs6V9FkE\"},{\"plugin\":\"three_mesh\",\"x\":1254,\"y\":337,\"uid\":\"DK9QdMtKbztM\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1},\"pivot\":{\"x\":0,\"y\":0,\"z\":0}}},{\"plugin\":\"output_proxy\",\"x\":1444,\"y\":331,\"uid\":\"tVpX6eFBZ5QF\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":546,\"y\":151,\"uid\":\"TweGjq3U3BDj\",\"state\":{\"url\":\"/data/image/7cbc45195c04d1595c43be42418755520068c72e.png\"},\"title\":\"Box texture\"},{\"plugin\":\"three_material_phong\",\"x\":878,\"y\":205,\"uid\":\"tgZkTrM6LFcN\",\"state\":{}}],\"conns\":[{\"src_nuid\":\"DK9QdMtKbztM\",\"dst_nuid\":\"tVpX6eFBZ5QF\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"JDLMLVjAx9eR\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"CmSTvs6V9FkE\",\"dst_nuid\":\"DK9QdMtKbztM\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"ATQaGZypjZ9k\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"TweGjq3U3BDj\",\"dst_nuid\":\"tgZkTrM6LFcN\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"ArsrqCPHLfVr\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"tgZkTrM6LFcN\",\"dst_nuid\":\"DK9QdMtKbztM\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"2CHaqAUs3A6Y\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":331,\"y\":122,\"uid\":\"ZqNtGXD5HcxH\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"6ePgSMGBnDfp\":\"mh0rTKkFm0nD\"}},\"title\":\"Sphere\",\"graph\":{\"uid\":\"T3p4fuJQmntz\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1239,\"y\":326,\"uid\":\"sdPZv8XDymZq\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1},\"pivot\":{\"x\":0,\"y\":0,\"z\":0}}},{\"plugin\":\"output_proxy\",\"x\":1438,\"y\":325,\"uid\":\"6ePgSMGBnDfp\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":425,\"y\":28,\"uid\":\"fvU8zk7gcVb9\",\"state\":{\"url\":\"/data/image/81238160a5dd3ebbe50a942ff7d4d1fca95bfcf7.png\"},\"title\":\"Box texture\"},{\"plugin\":\"three_material_phong\",\"x\":695,\"y\":112,\"uid\":\"gDsWv7vwjuPR\",\"state\":{}},{\"plugin\":\"three_geometry_sphere\",\"x\":884,\"y\":568,\"uid\":\"S2GxaFAawnRk\"},{\"plugin\":\"const_float_generator\",\"x\":679,\"y\":615,\"uid\":\"eU8CHcGTTM8E\",\"state\":{\"val\":32},\"title\":\"Segments\"}],\"conns\":[{\"src_nuid\":\"sdPZv8XDymZq\",\"dst_nuid\":\"6ePgSMGBnDfp\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"eHEXSbLegKdR\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"fvU8zk7gcVb9\",\"dst_nuid\":\"gDsWv7vwjuPR\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"ZJKbPbXJCrpR\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"gDsWv7vwjuPR\",\"dst_nuid\":\"sdPZv8XDymZq\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"ajepMtaXk4e3\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"S2GxaFAawnRk\",\"dst_nuid\":\"sdPZv8XDymZq\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"BLV82TfuzLuf\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"eU8CHcGTTM8E\",\"dst_nuid\":\"S2GxaFAawnRk\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"cUPSv9KrSbpv\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"eU8CHcGTTM8E\",\"dst_nuid\":\"S2GxaFAawnRk\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"GBVZMQAm75Eg\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":344,\"y\":197,\"uid\":\"67xVcyQxByjy\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"PZujbx5PGHEq\":\"mh0rTKkFm0nD\"}},\"title\":\"Torus\",\"graph\":{\"uid\":\"twtM6eFST2eC\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1254,\"y\":337,\"uid\":\"hksSy2CL9PZX\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1},\"pivot\":{\"x\":0,\"y\":0,\"z\":0}}},{\"plugin\":\"output_proxy\",\"x\":1444,\"y\":331,\"uid\":\"PZujbx5PGHEq\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":541,\"y\":378,\"uid\":\"Xftqp3xbWJQY\",\"state\":{\"url\":\"/data/image/7cbc45195c04d1595c43be42418755520068c72e.png\"},\"title\":\"Torus texture\"},{\"plugin\":\"three_material_phong\",\"x\":871,\"y\":378,\"uid\":\"BMqF6ty8TGWn\",\"state\":{}},{\"plugin\":\"three_geometry_torus\",\"x\":815,\"y\":143,\"uid\":\"wE466dD4kBJS\",\"state\":{}}],\"conns\":[{\"src_nuid\":\"hksSy2CL9PZX\",\"dst_nuid\":\"PZujbx5PGHEq\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"MCJAhwx3KaHm\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"Xftqp3xbWJQY\",\"dst_nuid\":\"BMqF6ty8TGWn\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"5Bdf5VgLZcM8\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"BMqF6ty8TGWn\",\"dst_nuid\":\"hksSy2CL9PZX\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"eFFa9BbbdK9f\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"wE466dD4kBJS\",\"dst_nuid\":\"hksSy2CL9PZX\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"cpvyjnQmSqfB\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"annotation\",\"x\":532,\"y\":205,\"uid\":\"LTbW6W8pC7h8\",\"state\":{\"text\":\"Connect the \\\"array\\\" slot into scene to see the example.\\n\\nThis example combines three object3d´s into one array. It's convenient if you need to get several object3d's out from a single subpatch.\\n\",\"width\":280,\"height\":86},\"title\":\"Inputs to array example\"}],\"conns\":[{\"src_nuid\":\"nvz6FkSBZYvX\",\"dst_nuid\":\"vVgFnqfjmD9r\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"t6ZFZJzzUc6F\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"ZqNtGXD5HcxH\",\"dst_nuid\":\"vVgFnqfjmD9r\",\"src_slot\":0,\"dst_slot\":1,\"uid\":\"7FVdTRjgfNEX\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"67xVcyQxByjy\",\"dst_nuid\":\"vVgFnqfjmD9r\",\"src_slot\":0,\"dst_slot\":2,\"uid\":\"SpA8mj3ymJXW\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true}]}}"
  },
  {
    "path": "browser/patches/_example-particle-spawn-from-mesh.json",
    "content": "{\"abs_t\":676.203,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":307,\"y\":67,\"uid\":\"xs9Ye2NYCuyu\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"3LKrr2zt9prP\":\"ymFttax7zrEs\"}},\"title\":\"Spawn particles from mesh\",\"graph\":{\"uid\":\"LhwZ4fWaV3m4\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_point_cloud_mesh\",\"x\":2047,\"y\":537,\"uid\":\"mVFftJnMkFMW\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1},\"pivot\":{\"x\":0,\"y\":0,\"z\":0}}},{\"plugin\":\"three_point_cloud_material\",\"x\":1772,\"y\":772,\"uid\":\"qEGkpgqsJWkx\",\"state\":{}},{\"plugin\":\"three_particle_emitter\",\"x\":1316,\"y\":50,\"uid\":\"63dYBu6NfSVq\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":599,\"y\":364,\"uid\":\"fc3TeJ2MDJPb\",\"state\":{\"val\":1000},\"title\":\"Particle count\"},{\"plugin\":\"output_proxy\",\"x\":2290,\"y\":587,\"uid\":\"3LKrr2zt9prP\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"IqY3qicWRiJ4\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":788,\"y\":364,\"uid\":\"jpVmqKRumvBx\",\"state\":{\"val\":1},\"title\":\"Spawn rate\"},{\"plugin\":\"url_texture_generator\",\"x\":1515,\"y\":752,\"uid\":\"uDDhrCGd2BgD\",\"state\":{\"url\":\"/data/image/aa1f1d52c59230454ef8bd026baff7b87baca3ef.png\"},\"title\":\"Particle texture\"},{\"plugin\":\"const_float_generator\",\"x\":601,\"y\":447,\"uid\":\"y6g9d2NpGrhm\",\"state\":{\"val\":0.04},\"title\":\"Particle Size\"},{\"plugin\":\"toggle_button\",\"x\":1260,\"y\":881,\"uid\":\"AE6adMeL6WNE\",\"state\":{\"enabled\":false},\"title\":\"Depth test\"},{\"plugin\":\"toggle_button\",\"x\":1260,\"y\":965,\"uid\":\"2D5PubnyMdvJ\",\"state\":{\"enabled\":true},\"title\":\"Transparent\"},{\"plugin\":\"const_float_generator\",\"x\":1262,\"y\":1131,\"uid\":\"PZJXKd6PhLwE\",\"state\":{\"val\":2},\"title\":\"Blending\"},{\"plugin\":\"const_float_generator\",\"x\":789,\"y\":446,\"uid\":\"knhRNGKAmyFx\",\"state\":{\"val\":0.1},\"title\":\"Object scale\"},{\"plugin\":\"vector\",\"x\":965,\"y\":447,\"uid\":\"McRD3wbZnhpY\",\"open\":false,\"title\":\"scale\"},{\"plugin\":\"const_float_generator\",\"x\":960,\"y\":362,\"uid\":\"Le7ve3xjdXP7\",\"state\":{\"val\":3},\"title\":\"Lifetime\"},{\"plugin\":\"const_float_generator\",\"x\":930,\"y\":531,\"uid\":\"uBHEWtBUKbm9\",\"state\":{\"val\":0.1},\"title\":\"Speed\"},{\"plugin\":\"const_float_generator\",\"x\":790,\"y\":532,\"uid\":\"suFy5VsW8eKR\",\"state\":{\"val\":0.001},\"title\":\"Spread\"},{\"plugin\":\"const_float_generator\",\"x\":598,\"y\":646,\"uid\":\"Fgt8h7T3pegT\",\"state\":{\"val\":0},\"title\":\"X\"},{\"plugin\":\"const_float_generator\",\"x\":596,\"y\":728,\"uid\":\"X8qJqDBrKVXE\",\"state\":{\"val\":0},\"title\":\"Y\"},{\"plugin\":\"const_float_generator\",\"x\":596,\"y\":809,\"uid\":\"FKkTQ6UTkUgC\",\"state\":{\"val\":0},\"title\":\"Z\"},{\"plugin\":\"vector\",\"x\":733,\"y\":727,\"uid\":\"Ag5vbs7jakzt\",\"open\":false,\"title\":\"Direction\"},{\"plugin\":\"const_float_generator\",\"x\":1107,\"y\":362,\"uid\":\"bNgBP8pKf9fT\",\"state\":{\"val\":0},\"title\":\"Noise\"},{\"plugin\":\"color_picker\",\"x\":1512,\"y\":914,\"uid\":\"HRMnjtfE8wLt\",\"state\":{\"hue\":0.6801385498046875,\"sat\":0.979027099609375,\"lum\":0.6409722900390624},\"title\":\"Particle color\"},{\"plugin\":\"const_float_generator\",\"x\":1259,\"y\":1049,\"uid\":\"jgUMCc3kq7nS\",\"state\":{\"val\":1},\"title\":\"size Attenuation\"},{\"plugin\":\"three_geometry_torus\",\"x\":551,\"y\":175,\"uid\":\"vnXGC4G9WbqU\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":348,\"y\":200,\"uid\":\"eCDwu2Zu2TuZ\",\"state\":{\"val\":64},\"title\":\"Segments\"},{\"plugin\":\"annotation\",\"x\":761,\"y\":177,\"uid\":\"ZAU9hN9Sazka\",\"state\":{\"text\":\"Change the Spread, Speed or Noise to make the particles fly around in a more beautiful fashion.\",\"width\":150,\"height\":70},\"title\":\"Information\"},{\"plugin\":\"const_float_generator\",\"x\":901,\"y\":621,\"uid\":\"RFpZFUDaqegD\",\"state\":{\"val\":0},\"title\":\"X\"},{\"plugin\":\"const_float_generator\",\"x\":899,\"y\":703,\"uid\":\"4sErXNmRegC8\",\"state\":{\"val\":0},\"title\":\"Y\"},{\"plugin\":\"const_float_generator\",\"x\":899,\"y\":784,\"uid\":\"e2bZC6NMSs9K\",\"state\":{\"val\":0},\"title\":\"Z\"},{\"plugin\":\"vector\",\"x\":1036,\"y\":702,\"uid\":\"UFKKvYmuG7Np\",\"open\":false,\"title\":\"Gravity\"},{\"plugin\":\"annotation\",\"x\":456,\"y\":9,\"uid\":\"TqxL8sjYBQ7d\",\"state\":{\"text\":\"The particles now spawn from the 64 segments of this torus. Change the torus to another 3D object to spawn from something else.\",\"width\":150,\"height\":70}}],\"conns\":[{\"src_nuid\":\"qEGkpgqsJWkx\",\"dst_nuid\":\"mVFftJnMkFMW\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"fvKcRUJ8jkh7\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"63dYBu6NfSVq\",\"dst_nuid\":\"mVFftJnMkFMW\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"arpY3MUDLZPf\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"fc3TeJ2MDJPb\",\"dst_nuid\":\"63dYBu6NfSVq\",\"src_slot\":\"value\",\"dst_slot\":\"particle count\",\"uid\":\"QXVp7Qwus89S\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"mVFftJnMkFMW\",\"dst_nuid\":\"3LKrr2zt9prP\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"yv3JKxJKjCBF\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"jpVmqKRumvBx\",\"dst_nuid\":\"63dYBu6NfSVq\",\"src_slot\":\"value\",\"dst_slot\":\"spawn rate\",\"uid\":\"uRSpNw7FT3hs\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"uDDhrCGd2BgD\",\"dst_nuid\":\"qEGkpgqsJWkx\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"LTbTsq2JRXdP\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"y6g9d2NpGrhm\",\"dst_nuid\":\"qEGkpgqsJWkx\",\"src_slot\":\"value\",\"dst_slot\":\"size\",\"uid\":\"YAJTsNWAerS2\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"2D5PubnyMdvJ\",\"dst_nuid\":\"qEGkpgqsJWkx\",\"src_slot\":\"bool\",\"dst_slot\":\"transparent\",\"uid\":\"TuSf59XEZAtM\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"AE6adMeL6WNE\",\"dst_nuid\":\"qEGkpgqsJWkx\",\"src_slot\":\"bool\",\"dst_slot\":\"depthTest\",\"uid\":\"yc82arBg7GxQ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"PZJXKd6PhLwE\",\"dst_nuid\":\"qEGkpgqsJWkx\",\"src_slot\":\"value\",\"dst_slot\":\"blending\",\"uid\":\"XNuaS4FNQ9Rk\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"knhRNGKAmyFx\",\"dst_nuid\":\"McRD3wbZnhpY\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"uBtCKqGDWBbM\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"knhRNGKAmyFx\",\"dst_nuid\":\"McRD3wbZnhpY\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"Xz9ycsHFbVvx\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"knhRNGKAmyFx\",\"dst_nuid\":\"McRD3wbZnhpY\",\"src_slot\":\"value\",\"dst_slot\":\"z\",\"uid\":\"uT2VEMZmtYMV\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"McRD3wbZnhpY\",\"dst_nuid\":\"mVFftJnMkFMW\",\"src_slot\":\"vector\",\"dst_slot\":\"scale\",\"uid\":\"XgCPXFa6Hzab\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Le7ve3xjdXP7\",\"dst_nuid\":\"63dYBu6NfSVq\",\"src_slot\":\"value\",\"dst_slot\":\"lifetime\",\"uid\":\"sCdbWM3gUX4E\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"uBHEWtBUKbm9\",\"dst_nuid\":\"63dYBu6NfSVq\",\"src_slot\":\"value\",\"dst_slot\":\"speed\",\"uid\":\"VGXGBMRx2HZ8\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"suFy5VsW8eKR\",\"dst_nuid\":\"63dYBu6NfSVq\",\"src_slot\":\"value\",\"dst_slot\":\"spread\",\"uid\":\"vgdckebGQh5b\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Fgt8h7T3pegT\",\"dst_nuid\":\"Ag5vbs7jakzt\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"RkfvDw3YYzU2\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"X8qJqDBrKVXE\",\"dst_nuid\":\"Ag5vbs7jakzt\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"YFxUHjEj4uxX\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"FKkTQ6UTkUgC\",\"dst_nuid\":\"Ag5vbs7jakzt\",\"src_slot\":\"value\",\"dst_slot\":\"z\",\"uid\":\"3hCDmq3d4Hz4\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Ag5vbs7jakzt\",\"dst_nuid\":\"63dYBu6NfSVq\",\"src_slot\":\"vector\",\"dst_slot\":\"direction\",\"uid\":\"9RcPrkRdyWVY\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"bNgBP8pKf9fT\",\"dst_nuid\":\"63dYBu6NfSVq\",\"src_slot\":\"value\",\"dst_slot\":\"noise\",\"uid\":\"6dFzaK2xsMWs\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"HRMnjtfE8wLt\",\"dst_nuid\":\"qEGkpgqsJWkx\",\"src_slot\":\"color\",\"dst_slot\":\"color\",\"uid\":\"99uQDL6hSW6A\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"jgUMCc3kq7nS\",\"dst_nuid\":\"qEGkpgqsJWkx\",\"src_slot\":\"value\",\"dst_slot\":\"sizeAttenuation\",\"uid\":\"3tRLHbwqKjNf\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"vnXGC4G9WbqU\",\"dst_nuid\":\"63dYBu6NfSVq\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"9VYYDYagv7YZ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"eCDwu2Zu2TuZ\",\"dst_nuid\":\"vnXGC4G9WbqU\",\"src_slot\":\"value\",\"dst_slot\":\"radialSegments\",\"uid\":\"ByxQKuFB4fkN\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"eCDwu2Zu2TuZ\",\"dst_nuid\":\"vnXGC4G9WbqU\",\"src_slot\":\"value\",\"dst_slot\":\"tubularSegments\",\"uid\":\"7x7UQ3PbKEgD\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"RFpZFUDaqegD\",\"dst_nuid\":\"UFKKvYmuG7Np\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"Z6txvdWVZHS4\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"4sErXNmRegC8\",\"dst_nuid\":\"UFKKvYmuG7Np\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"aX7rzbdP2x4U\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"e2bZC6NMSs9K\",\"dst_nuid\":\"UFKKvYmuG7Np\",\"src_slot\":\"value\",\"dst_slot\":\"z\",\"uid\":\"5jKh4gbZMZym\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"UFKKvYmuG7Np\",\"dst_nuid\":\"63dYBu6NfSVq\",\"src_slot\":\"vector\",\"dst_slot\":\"gravity\",\"uid\":\"KV7pEsL7fyXy\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"ymFttax7zrEs\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"annotation\",\"x\":306,\"y\":129,\"uid\":\"4v2WWcx8buZ6\",\"state\":{\"text\":\"Connect the object3d slot to scene to see this example.\\n\\nParticles here spawn from any defined 3D geometry, in this case a torus. Click edit icon to change the settings.\",\"width\":150,\"height\":70},\"title\":\"Spawn particles from mesh\"}],\"conns\":[]}}"
  },
  {
    "path": "browser/patches/_example-rotating-cube.json",
    "content": "{\"abs_t\":101.499,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":376,\"y\":344,\"uid\":\"HMDxAKJMbBMA\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"5CFA6K7bghRV\":\"mh0rTKkFm0nD\"}},\"title\":\"Rotating box\",\"graph\":{\"uid\":\"wKX5kUHgjG84\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_geometry_box\",\"x\":723,\"y\":418,\"uid\":\"AwWZaNNR6BYQ\"},{\"plugin\":\"three_mesh\",\"x\":1070,\"y\":391,\"uid\":\"u8ZExcMDstNM\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1},\"pivot\":{\"x\":0,\"y\":0,\"z\":0}}},{\"plugin\":\"output_proxy\",\"x\":1269,\"y\":390,\"uid\":\"5CFA6K7bghRV\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":501,\"y\":43,\"uid\":\"afWQW8rErjJF\",\"state\":{\"url\":\"/data/image/b09b6c37eebe3b22dc21a9c5884be3cc4a1cda74.png\"},\"title\":\"Box texture\"},{\"plugin\":\"three_material_phong\",\"x\":758,\"y\":77,\"uid\":\"yYfTZYJnMjEh\",\"open\":false,\"state\":{}},{\"plugin\":\"vector\",\"x\":676,\"y\":241,\"uid\":\"5nPwurQndRp7\",\"title\":\"Rotation\"},{\"plugin\":\"graph\",\"x\":456,\"y\":270,\"uid\":\"FPypG6qBRFTX\",\"state\":{\"always_update\":true,\"input_sids\":{\"NKpJWxWzTMJ6\":\"1\"},\"output_sids\":{\"EZRccSbxACFy\":\"0\"}},\"title\":\"Clock\",\"graph\":{\"uid\":\"jzpXLSrgYxYh\",\"parent_uid\":\"wKX5kUHgjG84\",\"open\":true,\"nodes\":[{\"plugin\":\"delta_t_generator\",\"x\":234,\"y\":203,\"uid\":\"fdYEfLgK7rg5\"},{\"plugin\":\"multiply_modulator\",\"x\":359,\"y\":193,\"uid\":\"tRycJ7YmvwpG\"},{\"plugin\":\"output_proxy\",\"x\":785,\"y\":240,\"uid\":\"EZRccSbxACFy\",\"title\":\"time\",\"dyn_in\":[{\"name\":\"input\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true,\"dynamic\":true}]},{\"plugin\":\"input_proxy\",\"x\":250,\"y\":262,\"uid\":\"NKpJWxWzTMJ6\",\"title\":\"Speed\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"connected\":true,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"variable_local_read\",\"x\":376,\"y\":310,\"uid\":\"NkqXGPZHTMtW\",\"title\":\"float\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"variable_local_write\",\"x\":745,\"y\":188,\"uid\":\"AebE3e2y6M6y\",\"title\":\"float\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":0,\"is_connected\":true,\"dynamic\":true}]},{\"plugin\":\"add_modulator\",\"x\":484,\"y\":223,\"uid\":\"geLKEdpfnCPY\"},{\"plugin\":\"if_else_modulator\",\"x\":604,\"y\":249,\"uid\":\"vzTWFekyh4ux\"},{\"plugin\":\"const_float_generator\",\"x\":488,\"y\":351,\"uid\":\"XPAfkLd2tUL6\",\"state\":{\"val\":0},\"title\":\"Reset\"},{\"plugin\":\"initialise_generator\",\"x\":520,\"y\":160,\"uid\":\"deyCNPAEzscg\"}],\"conns\":[{\"src_nuid\":\"fdYEfLgK7rg5\",\"dst_nuid\":\"tRycJ7YmvwpG\",\"src_slot\":\"seconds\",\"dst_slot\":\"a\",\"uid\":\"RzYhmsY2QXKx\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"NKpJWxWzTMJ6\",\"dst_nuid\":\"tRycJ7YmvwpG\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"YEUtrVTKE7Mv\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"deyCNPAEzscg\",\"dst_nuid\":\"vzTWFekyh4ux\",\"src_slot\":\"bool\",\"dst_slot\":\"condition\",\"uid\":\"xpeV3z5HQYHR\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"NkqXGPZHTMtW\",\"dst_nuid\":\"geLKEdpfnCPY\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"4gSGHgCBHey3\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"tRycJ7YmvwpG\",\"dst_nuid\":\"geLKEdpfnCPY\",\"src_slot\":\"result\",\"dst_slot\":\"a\",\"uid\":\"FDnA9mVVZHGP\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"geLKEdpfnCPY\",\"dst_nuid\":\"vzTWFekyh4ux\",\"src_slot\":\"result\",\"dst_slot\":\"false value\",\"uid\":\"ysy5EXkQxRwG\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"XPAfkLd2tUL6\",\"dst_nuid\":\"vzTWFekyh4ux\",\"src_slot\":\"value\",\"dst_slot\":\"true value\",\"uid\":\"2emgNTKsdDah\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"vzTWFekyh4ux\",\"dst_nuid\":\"AebE3e2y6M6y\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"T2FdNEMHfAFD\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"vzTWFekyh4ux\",\"dst_nuid\":\"EZRccSbxACFy\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"bE3uGgjSchsr\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true,\"offset\":1}],\"variables\":[{\"id\":\"float\",\"dt\":0}]},\"dyn_in\":[{\"name\":\"Speed\",\"dt\":0,\"uid\":\"1\",\"index\":0,\"type\":0,\"is_connected\":true,\"dynamic\":true}],\"dyn_out\":[{\"name\":\"time\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"slider_float_generator\",\"x\":204,\"y\":308,\"uid\":\"JJdeQdTfE6Yb\",\"state\":{\"val\":0.3,\"min\":0,\"max\":1},\"title\":\"Clock speed\"}],\"conns\":[{\"src_nuid\":\"u8ZExcMDstNM\",\"dst_nuid\":\"5CFA6K7bghRV\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"aPG3eHcyJyfb\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"AwWZaNNR6BYQ\",\"dst_nuid\":\"u8ZExcMDstNM\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"4dnnBSS3xkYx\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"afWQW8rErjJF\",\"dst_nuid\":\"yYfTZYJnMjEh\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"wYTGFzu7e9YX\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"yYfTZYJnMjEh\",\"dst_nuid\":\"u8ZExcMDstNM\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"8EVv9mJbBx3X\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5nPwurQndRp7\",\"dst_nuid\":\"u8ZExcMDstNM\",\"src_slot\":\"vector\",\"dst_slot\":\"rotation\",\"uid\":\"CCTjJJP49cEz\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"JJdeQdTfE6Yb\",\"dst_nuid\":\"FPypG6qBRFTX\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"ePvR63wASzFm\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"FPypG6qBRFTX\",\"dst_nuid\":\"5nPwurQndRp7\",\"src_slot\":0,\"dst_slot\":\"x\",\"uid\":\"C7aVGZ8XuwNT\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"FPypG6qBRFTX\",\"dst_nuid\":\"5nPwurQndRp7\",\"src_slot\":0,\"dst_slot\":\"z\",\"uid\":\"9Efrc2PLs33E\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"annotation\",\"x\":373,\"y\":413,\"uid\":\"84MjSBKkJjH7\",\"state\":{\"text\":\"Here we rotate a box using a clock.\\n\\nConnect the object3d slot\\nof the Box into the Scene to see the example. Click the pen icon to see how the clock was connected.\\n\\n\",\"width\":232,\"height\":98},\"title\":\"Rotating box example\"}],\"conns\":[]}}"
  },
  {
    "path": "browser/patches/_example-switch-box-position-on-gaze-click.json",
    "content": "{\"abs_t\":18.777,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":319,\"y\":297,\"uid\":\"v8uQ2TM4Z4FP\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"P8L3xL34Q6Cz\":\"Ys30r7aVEks1\"}},\"title\":\"Switch box position on gaze click\",\"graph\":{\"uid\":\"VffUakcj37hu\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":875,\"y\":124,\"uid\":\"pvq2t6TeEhcC\",\"state\":{\"position\":{\"x\":0.03717239065720079,\"y\":0.03926023317848015,\"z\":-1.193571944882679},\"scale\":{\"x\":0.0094948370835134,\"y\":0.0094948370835134,\"z\":0.0094948370835134},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1},\"pivot\":{\"x\":0,\"y\":0,\"z\":0}}},{\"plugin\":\"output_proxy\",\"x\":1113,\"y\":194,\"uid\":\"P8L3xL34Q6Cz\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_material\",\"x\":427,\"y\":295,\"uid\":\"zTgjcXaGDkcm\",\"open\":false,\"state\":{}},{\"plugin\":\"vector\",\"x\":661,\"y\":343,\"uid\":\"xzTuuhtxh5rW\",\"open\":false},{\"plugin\":\"const_float_generator\",\"x\":486,\"y\":383,\"uid\":\"Ne9bdVGYjXUY\",\"state\":{\"val\":1}},{\"plugin\":\"three_geometry_box\",\"x\":647,\"y\":69,\"uid\":\"erpSxQjbpHY6\",\"open\":false},{\"plugin\":\"url_texture_generator\",\"x\":112,\"y\":322,\"uid\":\"KWB5DZtPXFTq\",\"state\":{\"url\":\"\"}},{\"plugin\":\"on_three_object_gaze_clicked\",\"x\":224,\"y\":162,\"uid\":\"pqMGxhpMQJEv\",\"state\":{\"nodeRef\":\"VffUakcj37hu.pvq2t6TeEhcC\",\"type\":0},\"title\":\"Gaze clicked\"},{\"plugin\":\"graph\",\"x\":462,\"y\":167,\"uid\":\"GnQDcHkFDcEa\",\"state\":{\"always_update\":true,\"input_sids\":{\"zsXPyN6zVN9X\":\"uySY5hZYTGZz\"},\"output_sids\":{\"Bd8FvryqTFuA\":\"meyY5XDMKJ8m\"}},\"title\":\"Switch Position On Gaze Click\",\"graph\":{\"uid\":\"Wj5V8qH3Yuxb\",\"parent_uid\":\"VffUakcj37hu\",\"open\":true,\"nodes\":[{\"plugin\":\"input_proxy\",\"x\":263,\"y\":415,\"uid\":\"zsXPyN6zVN9X\",\"title\":\"click impulse\",\"dyn_out\":[{\"name\":\"input\",\"dt\":7,\"uid\":\"Gt2RHxRweRQW\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":1410,\"y\":572,\"uid\":\"Bd8FvryqTFuA\",\"title\":\"position\",\"dyn_in\":[{\"name\":\"output\",\"dt\":5,\"def\":null,\"uid\":\"FnrtMvEHSK6L\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"array_blend_modulator_vector3\",\"x\":1095,\"y\":542,\"uid\":\"4TLyvMq5wPfn\",\"state\":{\"blendFuncId\":\"smoothstep-blend\"},\"dyn_in\":[{\"name\":\"0\",\"dt\":5,\"array\":false,\"uid\":\"LvzQAHbTLkGP\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true},{\"type\":0,\"name\":\"1\",\"dt\":5,\"array\":false,\"uid\":\"hy5VQWU4UJxB\",\"dynamic\":true,\"index\":1,\"is_connected\":true},{\"type\":0,\"name\":\"2\",\"dt\":5,\"array\":false,\"uid\":\"TgZwpQ7gzyTJ\",\"dynamic\":true,\"index\":2,\"is_connected\":true},{\"type\":0,\"name\":\"3\",\"dt\":5,\"array\":false,\"uid\":\"DQeNWu8xf6Cw\",\"dynamic\":true,\"index\":3,\"is_connected\":true},{\"type\":0,\"name\":\"4\",\"dt\":5,\"array\":false,\"uid\":\"hNcuGpYtkLhF\",\"dynamic\":true,\"index\":4}]},{\"plugin\":\"vector\",\"x\":621,\"y\":657,\"uid\":\"KzhdGjanBa6T\",\"open\":false,\"title\":\"XYZ to Vector (lower left)\"},{\"plugin\":\"vector\",\"x\":620,\"y\":698,\"uid\":\"jjxmcKAetr5C\",\"open\":false,\"title\":\"XYZ to Vector (lower right)\"},{\"plugin\":\"const_float_generator\",\"x\":334,\"y\":754,\"uid\":\"pnTfHjN7D2Gs\",\"state\":{\"val\":1}},{\"plugin\":\"const_float_generator\",\"x\":622,\"y\":563,\"uid\":\"JrFce8p3Fs8x\",\"state\":{\"val\":2},\"title\":\"animation duration\"},{\"plugin\":\"const_float_generator\",\"x\":335,\"y\":660,\"uid\":\"JS7SXsCcFKyR\",\"state\":{\"val\":-1}},{\"plugin\":\"convert_bool_float_modulator\",\"x\":496,\"y\":383,\"uid\":\"e7EUBvqvgkWE\"},{\"plugin\":\"accumulate_modulator\",\"x\":702,\"y\":380,\"uid\":\"3CCffGUeVx2J\",\"open\":false,\"state\":{\"value\":9}},{\"plugin\":\"modulate_modulator\",\"x\":908,\"y\":422,\"uid\":\"SbGGcsBvbeUQ\",\"open\":false},{\"plugin\":\"const_float_generator\",\"x\":647,\"y\":481,\"uid\":\"sgUkqJMZKyWK\",\"open\":false,\"state\":{\"val\":4},\"title\":\"number of positions\"},{\"plugin\":\"vector\",\"x\":620,\"y\":738,\"uid\":\"UdW5tMS7HHGg\",\"open\":false,\"title\":\"XYZ to Vector (upper right)\"},{\"plugin\":\"vector\",\"x\":621,\"y\":780,\"uid\":\"qNkWrw56vLQa\",\"open\":false,\"title\":\"XYZ to Vector (upper left)\"}],\"conns\":[{\"src_nuid\":\"4TLyvMq5wPfn\",\"dst_nuid\":\"Bd8FvryqTFuA\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"exKFmwmCCDE7\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"JrFce8p3Fs8x\",\"dst_nuid\":\"4TLyvMq5wPfn\",\"src_slot\":\"value\",\"dst_slot\":\"duration\",\"uid\":\"Up7zseus6tYC\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"JS7SXsCcFKyR\",\"dst_nuid\":\"KzhdGjanBa6T\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"RD2gZMrBeKPu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"jjxmcKAetr5C\",\"dst_nuid\":\"4TLyvMq5wPfn\",\"src_slot\":\"vector\",\"dst_slot\":1,\"uid\":\"uh4hfnmDmFxe\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"pnTfHjN7D2Gs\",\"dst_nuid\":\"jjxmcKAetr5C\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"RfRkDXE9kJLB\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"KzhdGjanBa6T\",\"dst_nuid\":\"4TLyvMq5wPfn\",\"src_slot\":\"vector\",\"dst_slot\":0,\"uid\":\"LePWpwnbEKRZ\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"zsXPyN6zVN9X\",\"dst_nuid\":\"e7EUBvqvgkWE\",\"src_slot\":0,\"dst_slot\":\"bool\",\"uid\":\"gL4XPhSBhzdH\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"e7EUBvqvgkWE\",\"dst_nuid\":\"3CCffGUeVx2J\",\"src_slot\":\"value\",\"dst_slot\":\"value\",\"uid\":\"Bf4k4NzKFN89\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"3CCffGUeVx2J\",\"dst_nuid\":\"SbGGcsBvbeUQ\",\"src_slot\":\"value\",\"dst_slot\":\"value\",\"uid\":\"Zak9asAnH5gh\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"SbGGcsBvbeUQ\",\"dst_nuid\":\"4TLyvMq5wPfn\",\"src_slot\":\"result\",\"dst_slot\":\"number\",\"uid\":\"k7S7aWLTUKnw\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"sgUkqJMZKyWK\",\"dst_nuid\":\"SbGGcsBvbeUQ\",\"src_slot\":\"value\",\"dst_slot\":\"limit\",\"uid\":\"MAqebNyKer7M\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"pnTfHjN7D2Gs\",\"dst_nuid\":\"UdW5tMS7HHGg\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"kvzXjSkSLQ6m\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"JS7SXsCcFKyR\",\"dst_nuid\":\"qNkWrw56vLQa\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"wMNdhj35FABF\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"pnTfHjN7D2Gs\",\"dst_nuid\":\"UdW5tMS7HHGg\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"x786WftVZu8z\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"pnTfHjN7D2Gs\",\"dst_nuid\":\"qNkWrw56vLQa\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"D6txqp3LWScs\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"UdW5tMS7HHGg\",\"dst_nuid\":\"4TLyvMq5wPfn\",\"src_slot\":\"vector\",\"dst_slot\":2,\"uid\":\"FdxtHagJXsYy\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"qNkWrw56vLQa\",\"dst_nuid\":\"4TLyvMq5wPfn\",\"src_slot\":\"vector\",\"dst_slot\":3,\"uid\":\"hE5MQE3wRAUs\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"name\":\"click impulse\",\"dt\":7,\"index\":0,\"uid\":\"uySY5hZYTGZz\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"position\",\"dt\":5,\"index\":0,\"uid\":\"meyY5XDMKJ8m\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":\"pvq2t6TeEhcC\",\"dst_nuid\":\"P8L3xL34Q6Cz\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"xtczuFAL4wM4\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"zTgjcXaGDkcm\",\"dst_nuid\":\"pvq2t6TeEhcC\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"xJkDjTmS7aDn\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"xzTuuhtxh5rW\",\"dst_nuid\":\"pvq2t6TeEhcC\",\"src_slot\":\"vector\",\"dst_slot\":\"scale\",\"uid\":\"LusQpyJVTxDR\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Ne9bdVGYjXUY\",\"dst_nuid\":\"xzTuuhtxh5rW\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"2B3fNSgbtpwk\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Ne9bdVGYjXUY\",\"dst_nuid\":\"xzTuuhtxh5rW\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"KTErdMpNRBWf\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Ne9bdVGYjXUY\",\"dst_nuid\":\"xzTuuhtxh5rW\",\"src_slot\":\"value\",\"dst_slot\":\"z\",\"uid\":\"qGZJN6DMhVZz\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"erpSxQjbpHY6\",\"dst_nuid\":\"pvq2t6TeEhcC\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"AQ6Z8m2YrU2Z\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"KWB5DZtPXFTq\",\"dst_nuid\":\"zTgjcXaGDkcm\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"xbk6RfUa94AR\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"pqMGxhpMQJEv\",\"dst_nuid\":\"GnQDcHkFDcEa\",\"src_slot\":\"trigger\",\"dst_slot\":0,\"uid\":\"reYwMwDraXba\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"GnQDcHkFDcEa\",\"dst_nuid\":\"pvq2t6TeEhcC\",\"src_slot\":0,\"dst_slot\":\"position\",\"uid\":\"CaJSBjkeH2mv\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"annotation\",\"x\":320,\"y\":363,\"uid\":\"gwSyHznZJfqG\",\"state\":{\"text\":\"Connect the object3d slot to scene to see this example.\\n\\nWe move the box between 4 different positions,  which are trigged by a gaze click.\",\"width\":272,\"height\":74},\"title\":\"Switch box position on gaze click\"}],\"conns\":[]}}"
  },
  {
    "path": "browser/patches/_increment_or_decrement_on_trigger.json",
    "content": "{\"abs_t\":0,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":735,\"y\":550,\"uid\":\"WBUxg9Q5fz2G\",\"state\":{\"always_update\":true,\"input_sids\":{\"rvLDgGVpjPRL\":\"mVnEUjXzKTu9\",\"PYjRb2vbEPLM\":\"RrXnGmd2CdV3\",\"X6fUWXLUjYtC\":\"fQQyfTyQhtVt\",\"t7vqUVc2qYF6\":\"vqzGBrdNCQUn\"},\"output_sids\":{\"wyekgcnREvCT\":\"33F9mKcYFhjZ\"}},\"title\":\"Increase / Decrease on Trigger\",\"graph\":{\"uid\":\"8wNUmn5UyRNh\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"input_proxy\",\"x\":300,\"y\":564,\"uid\":\"rvLDgGVpjPRL\",\"title\":\"increase trigger\",\"dyn_out\":[{\"name\":\"input\",\"dt\":7,\"uid\":\"aSZDePV2hR2J\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":300,\"y\":611,\"uid\":\"PYjRb2vbEPLM\",\"title\":\"decrease trigger\",\"dyn_out\":[{\"name\":\"input\",\"dt\":7,\"uid\":\"aSZDePV2hR2J\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":1723,\"y\":650,\"uid\":\"wyekgcnREvCT\",\"title\":\"value\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"def\":null,\"uid\":\"DsPSgcn6hY6J\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":301,\"y\":658,\"uid\":\"X6fUWXLUjYtC\",\"title\":\"reset trigger\",\"dyn_out\":[{\"name\":\"input\",\"dt\":7,\"uid\":\"aSZDePV2hR2J\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":301,\"y\":703,\"uid\":\"t7vqUVc2qYF6\",\"title\":\"start value\",\"dyn_out\":[{\"name\":\"input\",\"dt\":0,\"uid\":\"6JttH4uJyNfW\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"add_modulator\",\"x\":1396,\"y\":656,\"uid\":\"PP6HEsAbzZFU\"},{\"plugin\":\"if_else_modulator\",\"x\":597,\"y\":318,\"uid\":\"p8PsbPR8Qt8b\"},{\"plugin\":\"variable_local_read\",\"x\":338,\"y\":319,\"uid\":\"T7g4CTDphXGg\",\"title\":\"value\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"2szctpEgKtv8\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"variable_local_write\",\"x\":1541,\"y\":337,\"uid\":\"YtLz6CSsSsSX\",\"title\":\"value\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"3nZhVDGKFJvn\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"if_else_modulator\",\"x\":1020,\"y\":337,\"uid\":\"NXZEctuvQkDX\",\"title\":\"add on increase\"},{\"plugin\":\"add_modulator\",\"x\":783,\"y\":432,\"uid\":\"6eEMaVSPbYd9\"},{\"plugin\":\"const_float_generator\",\"x\":531,\"y\":163,\"uid\":\"7madAka4FkB5\",\"state\":{\"val\":1},\"title\":\"one\"},{\"plugin\":\"if_else_modulator\",\"x\":1286,\"y\":332,\"uid\":\"YhKCbHfESqLU\",\"title\":\"dec on decrease\"},{\"plugin\":\"subtract_modulator\",\"x\":1284,\"y\":487,\"uid\":\"KSR9RM8R83e2\"}],\"conns\":[{\"src_nuid\":\"t7vqUVc2qYF6\",\"dst_nuid\":\"PP6HEsAbzZFU\",\"src_slot\":0,\"dst_slot\":\"a\",\"uid\":\"8vF9nB5BvwEH\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"PP6HEsAbzZFU\",\"dst_nuid\":\"wyekgcnREvCT\",\"src_slot\":\"result\",\"dst_slot\":0,\"uid\":\"2cp9HQvqFt8V\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"X6fUWXLUjYtC\",\"dst_nuid\":\"p8PsbPR8Qt8b\",\"src_slot\":0,\"dst_slot\":\"condition\",\"uid\":\"nKYD2WDhsP8v\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"t7vqUVc2qYF6\",\"dst_nuid\":\"p8PsbPR8Qt8b\",\"src_slot\":0,\"dst_slot\":\"true value\",\"uid\":\"k7QYXMDvpkUe\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"T7g4CTDphXGg\",\"dst_nuid\":\"p8PsbPR8Qt8b\",\"src_slot\":0,\"dst_slot\":\"false value\",\"uid\":\"KzdWpZvwCZpV\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"rvLDgGVpjPRL\",\"dst_nuid\":\"NXZEctuvQkDX\",\"src_slot\":0,\"dst_slot\":\"condition\",\"uid\":\"QB9YCZwvtB85\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"p8PsbPR8Qt8b\",\"dst_nuid\":\"NXZEctuvQkDX\",\"src_slot\":\"value\",\"dst_slot\":\"false value\",\"uid\":\"BL2spfSRKQh9\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"p8PsbPR8Qt8b\",\"dst_nuid\":\"6eEMaVSPbYd9\",\"src_slot\":\"value\",\"dst_slot\":\"a\",\"uid\":\"jLakrUTAK2T3\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"7madAka4FkB5\",\"dst_nuid\":\"6eEMaVSPbYd9\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"d3xFELLp4Uw4\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"6eEMaVSPbYd9\",\"dst_nuid\":\"NXZEctuvQkDX\",\"src_slot\":\"result\",\"dst_slot\":\"true value\",\"uid\":\"rPEHMWkcwdLh\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"NXZEctuvQkDX\",\"dst_nuid\":\"YhKCbHfESqLU\",\"src_slot\":\"value\",\"dst_slot\":\"false value\",\"uid\":\"ZfQJxQMEXn2D\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"PYjRb2vbEPLM\",\"dst_nuid\":\"YhKCbHfESqLU\",\"src_slot\":0,\"dst_slot\":\"condition\",\"uid\":\"7p3GLB5NArRT\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"NXZEctuvQkDX\",\"dst_nuid\":\"KSR9RM8R83e2\",\"src_slot\":\"value\",\"dst_slot\":\"a\",\"uid\":\"Q7QYJnkEPULe\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"7madAka4FkB5\",\"dst_nuid\":\"KSR9RM8R83e2\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"fT3QymAQA7RP\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"KSR9RM8R83e2\",\"dst_nuid\":\"YhKCbHfESqLU\",\"src_slot\":\"result\",\"dst_slot\":\"true value\",\"uid\":\"uFpdDfrGrbAf\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"YhKCbHfESqLU\",\"dst_nuid\":\"YtLz6CSsSsSX\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"6rjG7dkUtyLv\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"YhKCbHfESqLU\",\"dst_nuid\":\"PP6HEsAbzZFU\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"HPxehfdsxTvX\",\"src_connected\":true,\"dst_connected\":true}],\"variables\":[{\"id\":\"value\",\"dt\":0}]},\"dyn_in\":[{\"name\":\"start value\",\"dt\":0,\"index\":0,\"uid\":\"vqzGBrdNCQUn\",\"dynamic\":true,\"type\":0,\"is_connected\":true},{\"name\":\"reset trigger\",\"dt\":7,\"index\":1,\"uid\":\"fQQyfTyQhtVt\",\"dynamic\":true,\"type\":0,\"is_connected\":false},{\"name\":\"decrease trigger\",\"dt\":7,\"index\":2,\"uid\":\"RrXnGmd2CdV3\",\"dynamic\":true,\"type\":0,\"is_connected\":false},{\"name\":\"increase trigger\",\"dt\":7,\"index\":3,\"uid\":\"mVnEUjXzKTu9\",\"dynamic\":true,\"type\":0,\"is_connected\":false}],\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"index\":0,\"uid\":\"33F9mKcYFhjZ\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":549,\"y\":536,\"uid\":\"WvHvCv6evReJ\",\"state\":{\"val\":0},\"title\":\"start\"}],\"conns\":[{\"src_nuid\":\"WvHvCv6evReJ\",\"dst_nuid\":\"WBUxg9Q5fz2G\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"rMFLMNAG3GET\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]}}"
  },
  {
    "path": "browser/patches/_oscillate-between-2-values.json",
    "content": "{\"abs_t\":1630.382,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":796,\"y\":185,\"uid\":\"nQ3exkmg1k8M\",\"state\":{\"always_update\":true,\"input_sids\":{\"qdAWNqjTMDpt\":\"6\",\"L3RYhqIF5iSs\":\"8\",\"RpPPfcKUADLq\":\"9\"},\"output_sids\":{\"pnMu38d5tpIy\":\"7\"}},\"title\":\"Oscillate (Sine)\",\"graph\":{\"uid\":\"unJPhA7kNyXk\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"delta_t_generator\",\"x\":62,\"y\":232,\"uid\":\"tEvhCAiOHnOh\"},{\"plugin\":\"multiply_modulator\",\"x\":187,\"y\":222,\"uid\":\"UbNPhLG6WVuQ\"},{\"plugin\":\"input_proxy\",\"x\":78,\"y\":291,\"uid\":\"qdAWNqjTMDpt\",\"title\":\"Speed\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"connected\":true,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"variable_local_read\",\"x\":204,\"y\":339,\"uid\":\"uf1TrCi8qUGN\",\"title\":\"float\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"variable_local_write\",\"x\":589,\"y\":178,\"uid\":\"TrIQRfjlqwOV\",\"title\":\"float\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":0,\"is_connected\":true,\"dynamic\":true}]},{\"plugin\":\"add_modulator\",\"x\":312,\"y\":252,\"uid\":\"prJidBzmvShX\"},{\"plugin\":\"if_else_modulator\",\"x\":432,\"y\":278,\"uid\":\"gnj5IIRQTW0T\"},{\"plugin\":\"const_float_generator\",\"x\":316,\"y\":380,\"uid\":\"BLGqcch4V6JG\",\"state\":{\"val\":0},\"title\":\"Reset\"},{\"plugin\":\"initialise_generator\",\"x\":348,\"y\":189,\"uid\":\"eCJswCeE17Ow\"},{\"plugin\":\"sine_modulator\",\"x\":550,\"y\":289,\"uid\":\"IGHSIp4fEfqd\"},{\"plugin\":\"subtract_modulator\",\"x\":664,\"y\":404,\"uid\":\"sJDeKgkFaDQ7\"},{\"plugin\":\"convert_oscilator_unit_modulator\",\"x\":629,\"y\":289,\"uid\":\"Ud5IPj53D7rO\"},{\"plugin\":\"multiply_modulator\",\"x\":753,\"y\":289,\"uid\":\"RLZbMIKFfcuG\"},{\"plugin\":\"add_modulator\",\"x\":836,\"y\":344,\"uid\":\"xmv41ykKy8Zu\"},{\"plugin\":\"output_proxy\",\"x\":919,\"y\":344,\"uid\":\"pnMu38d5tpIy\",\"title\":\"float\",\"dyn_in\":[{\"name\":\"input\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true,\"dynamic\":true}]},{\"plugin\":\"input_proxy\",\"x\":538,\"y\":399,\"uid\":\"L3RYhqIF5iSs\",\"title\":\"Min\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"connected\":true,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":604,\"y\":404,\"uid\":\"RpPPfcKUADLq\",\"title\":\"Max\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"connected\":true,\"dynamic\":true,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":\"tEvhCAiOHnOh\",\"dst_nuid\":\"UbNPhLG6WVuQ\",\"src_slot\":\"seconds\",\"dst_slot\":\"a\",\"uid\":\"KXPQPFFxSv88\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"qdAWNqjTMDpt\",\"dst_nuid\":\"UbNPhLG6WVuQ\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"vEnBKvboGxF1\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"UbNPhLG6WVuQ\",\"dst_nuid\":\"prJidBzmvShX\",\"src_slot\":\"result\",\"dst_slot\":\"a\",\"uid\":\"F9I7rkT8qaQ3\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"uf1TrCi8qUGN\",\"dst_nuid\":\"prJidBzmvShX\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"xfz2VJQMzaMr\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"prJidBzmvShX\",\"dst_nuid\":\"gnj5IIRQTW0T\",\"src_slot\":\"result\",\"dst_slot\":\"false value\",\"uid\":\"4mVlS6yjT4RC\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"eCJswCeE17Ow\",\"dst_nuid\":\"gnj5IIRQTW0T\",\"src_slot\":\"bool\",\"dst_slot\":\"condition\",\"uid\":\"lUnznMEjUMg4\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"BLGqcch4V6JG\",\"dst_nuid\":\"gnj5IIRQTW0T\",\"src_slot\":\"value\",\"dst_slot\":\"true value\",\"uid\":\"Tf1Yih0OChYv\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"IGHSIp4fEfqd\",\"dst_nuid\":\"Ud5IPj53D7rO\",\"src_slot\":\"value\",\"dst_slot\":\"value\",\"uid\":\"z6CNhO7O7HcZ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"RpPPfcKUADLq\",\"dst_nuid\":\"sJDeKgkFaDQ7\",\"src_slot\":0,\"dst_slot\":\"a\",\"uid\":\"v5gm00EkT9Nz\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"L3RYhqIF5iSs\",\"dst_nuid\":\"sJDeKgkFaDQ7\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"8Zg2muCtxEHv\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"offset\":1},{\"src_nuid\":\"sJDeKgkFaDQ7\",\"dst_nuid\":\"RLZbMIKFfcuG\",\"src_slot\":\"result\",\"dst_slot\":\"b\",\"uid\":\"cacBsrWi9zTV\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Ud5IPj53D7rO\",\"dst_nuid\":\"RLZbMIKFfcuG\",\"src_slot\":\"value\",\"dst_slot\":\"a\",\"uid\":\"B4ZS1sQLumSS\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"RLZbMIKFfcuG\",\"dst_nuid\":\"xmv41ykKy8Zu\",\"src_slot\":\"result\",\"dst_slot\":\"a\",\"uid\":\"WtbUQuDGr1u9\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"L3RYhqIF5iSs\",\"dst_nuid\":\"xmv41ykKy8Zu\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"XWJN7KgAzQpm\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"xmv41ykKy8Zu\",\"dst_nuid\":\"pnMu38d5tpIy\",\"src_slot\":\"result\",\"dst_slot\":0,\"uid\":\"OuzvuPIDL201\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":\"gnj5IIRQTW0T\",\"dst_nuid\":\"TrIQRfjlqwOV\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"GrjToQoyjq8C\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"gnj5IIRQTW0T\",\"dst_nuid\":\"IGHSIp4fEfqd\",\"src_slot\":\"value\",\"dst_slot\":\"time\",\"uid\":\"rxMKA6QOJxCV\",\"src_connected\":true,\"dst_connected\":true,\"offset\":1}],\"variables\":[{\"id\":\"float\",\"dt\":8}]},\"dyn_in\":[{\"name\":\"Speed\",\"dt\":0,\"uid\":\"6\",\"index\":0,\"type\":0,\"is_connected\":true,\"dynamic\":true},{\"name\":\"Min\",\"dt\":0,\"uid\":\"8\",\"index\":1,\"type\":0,\"is_connected\":true,\"dynamic\":true},{\"name\":\"Max\",\"dt\":0,\"uid\":\"9\",\"index\":2,\"type\":0,\"is_connected\":true,\"dynamic\":true}],\"dyn_out\":[{\"name\":\"float\",\"dt\":0,\"uid\":\"7\",\"index\":0,\"type\":1,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"slider_float_generator\",\"x\":516,\"y\":156,\"uid\":\"aeQwXvlB1ZgO\",\"state\":{\"val\":0.42,\"min\":0,\"max\":1},\"title\":\"Clock speed\"},{\"plugin\":\"const_float_generator\",\"x\":502,\"y\":265,\"uid\":\"4zdzeyOxKiJx\",\"state\":{\"val\":0},\"title\":\"Min\"},{\"plugin\":\"const_float_generator\",\"x\":625,\"y\":265,\"uid\":\"egmpRuU1FDCO\",\"state\":{\"val\":1},\"title\":\"Max\"}],\"conns\":[{\"src_nuid\":\"aeQwXvlB1ZgO\",\"dst_nuid\":\"nQ3exkmg1k8M\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"5WA3xVK13Gj7\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"egmpRuU1FDCO\",\"dst_nuid\":\"nQ3exkmg1k8M\",\"src_slot\":\"value\",\"dst_slot\":2,\"uid\":\"T0sQSS306nRv\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"4zdzeyOxKiJx\",\"dst_nuid\":\"nQ3exkmg1k8M\",\"src_slot\":\"value\",\"dst_slot\":1,\"uid\":\"tm1XlBeh02eo\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]}}"
  },
  {
    "path": "browser/patches/_oscillate-sawtooth.json",
    "content": "{\"abs_t\":1673.851,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":784,\"y\":264,\"uid\":\"2KfJGi5FygJr\",\"state\":{\"always_update\":true,\"input_sids\":{\"7lp29KnD8kND\":\"6\",\"JI3XGVwSccBV\":\"8\",\"nk9dwR98FxHJ\":\"9\"},\"output_sids\":{\"2Lbjuy0Py94H\":\"7\"}},\"title\":\"Oscillate Sawtooth\",\"graph\":{\"uid\":\"QvlGqr3ZNFzv\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"delta_t_generator\",\"x\":62,\"y\":232,\"uid\":\"Weo7eKicW3Gn\"},{\"plugin\":\"multiply_modulator\",\"x\":187,\"y\":222,\"uid\":\"eoFJRgUPokZf\"},{\"plugin\":\"input_proxy\",\"x\":78,\"y\":291,\"uid\":\"7lp29KnD8kND\",\"title\":\"Speed\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"connected\":true,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"variable_local_read\",\"x\":204,\"y\":339,\"uid\":\"mpKncp3hEffs\",\"title\":\"float\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"variable_local_write\",\"x\":589,\"y\":178,\"uid\":\"pxdhWaCnAzlP\",\"title\":\"float\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":0,\"is_connected\":true,\"dynamic\":true}]},{\"plugin\":\"add_modulator\",\"x\":312,\"y\":252,\"uid\":\"7AgA56ACdoxn\"},{\"plugin\":\"if_else_modulator\",\"x\":432,\"y\":278,\"uid\":\"2Vlf638yfXyb\"},{\"plugin\":\"const_float_generator\",\"x\":316,\"y\":380,\"uid\":\"STN6RF7dPWmO\",\"state\":{\"val\":0},\"title\":\"Reset\"},{\"plugin\":\"initialise_generator\",\"x\":348,\"y\":189,\"uid\":\"7RsyF1Ry1q9C\"},{\"plugin\":\"subtract_modulator\",\"x\":664,\"y\":404,\"uid\":\"A6zeOtpw35IN\"},{\"plugin\":\"convert_oscilator_unit_modulator\",\"x\":629,\"y\":289,\"uid\":\"eaHEZWueeMks\"},{\"plugin\":\"multiply_modulator\",\"x\":753,\"y\":289,\"uid\":\"9YdOJBWubtjA\"},{\"plugin\":\"add_modulator\",\"x\":836,\"y\":344,\"uid\":\"8RoT09Lwu2Hl\"},{\"plugin\":\"output_proxy\",\"x\":919,\"y\":344,\"uid\":\"2Lbjuy0Py94H\",\"title\":\"float\",\"dyn_in\":[{\"name\":\"input\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true,\"dynamic\":true}]},{\"plugin\":\"input_proxy\",\"x\":538,\"y\":399,\"uid\":\"JI3XGVwSccBV\",\"title\":\"Min\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"connected\":true,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":604,\"y\":404,\"uid\":\"nk9dwR98FxHJ\",\"title\":\"Max\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"connected\":true,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"sawtooth_modulator\",\"x\":543,\"y\":286,\"uid\":\"Gm5djnB2ptB2\"}],\"conns\":[{\"src_nuid\":\"Weo7eKicW3Gn\",\"dst_nuid\":\"eoFJRgUPokZf\",\"src_slot\":\"seconds\",\"dst_slot\":\"a\",\"uid\":\"vatuVESuHt5M\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"7lp29KnD8kND\",\"dst_nuid\":\"eoFJRgUPokZf\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"CJ1Sm7mjwglT\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"eoFJRgUPokZf\",\"dst_nuid\":\"7AgA56ACdoxn\",\"src_slot\":\"result\",\"dst_slot\":\"a\",\"uid\":\"z03Lx9KXJIUL\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"mpKncp3hEffs\",\"dst_nuid\":\"7AgA56ACdoxn\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"d0NmPjNQLVwZ\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"7AgA56ACdoxn\",\"dst_nuid\":\"2Vlf638yfXyb\",\"src_slot\":\"result\",\"dst_slot\":\"false value\",\"uid\":\"DjvORLdEWVsD\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"7RsyF1Ry1q9C\",\"dst_nuid\":\"2Vlf638yfXyb\",\"src_slot\":\"bool\",\"dst_slot\":\"condition\",\"uid\":\"AbC3dfHuIAz8\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"STN6RF7dPWmO\",\"dst_nuid\":\"2Vlf638yfXyb\",\"src_slot\":\"value\",\"dst_slot\":\"true value\",\"uid\":\"dmYylhh1seIL\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"nk9dwR98FxHJ\",\"dst_nuid\":\"A6zeOtpw35IN\",\"src_slot\":0,\"dst_slot\":\"a\",\"uid\":\"OmcMuaouKvPf\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"JI3XGVwSccBV\",\"dst_nuid\":\"A6zeOtpw35IN\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"pDIUwg5vxGqj\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"offset\":1},{\"src_nuid\":\"A6zeOtpw35IN\",\"dst_nuid\":\"9YdOJBWubtjA\",\"src_slot\":\"result\",\"dst_slot\":\"b\",\"uid\":\"ECmOO9q1M9l4\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"eaHEZWueeMks\",\"dst_nuid\":\"9YdOJBWubtjA\",\"src_slot\":\"value\",\"dst_slot\":\"a\",\"uid\":\"6U16jUeQIYv6\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"9YdOJBWubtjA\",\"dst_nuid\":\"8RoT09Lwu2Hl\",\"src_slot\":\"result\",\"dst_slot\":\"a\",\"uid\":\"OtuprF4bZN5i\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"JI3XGVwSccBV\",\"dst_nuid\":\"8RoT09Lwu2Hl\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"VGkhV09EnUxi\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"8RoT09Lwu2Hl\",\"dst_nuid\":\"2Lbjuy0Py94H\",\"src_slot\":\"result\",\"dst_slot\":0,\"uid\":\"XYiyBc16DSps\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":\"2Vlf638yfXyb\",\"dst_nuid\":\"pxdhWaCnAzlP\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"I9FxBlOv5sgC\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"2Vlf638yfXyb\",\"dst_nuid\":\"Gm5djnB2ptB2\",\"src_slot\":\"value\",\"dst_slot\":\"time\",\"uid\":\"C3b7xsV0LS3Z\",\"src_connected\":true,\"dst_connected\":true,\"offset\":1},{\"src_nuid\":\"Gm5djnB2ptB2\",\"dst_nuid\":\"eaHEZWueeMks\",\"src_slot\":\"value\",\"dst_slot\":\"value\",\"uid\":\"jRoI43gG2hRA\",\"src_connected\":true,\"dst_connected\":true}],\"variables\":[{\"id\":\"float\",\"dt\":8}]},\"dyn_in\":[{\"name\":\"Speed\",\"dt\":0,\"uid\":\"6\",\"index\":0,\"type\":0,\"is_connected\":true,\"dynamic\":true},{\"name\":\"Min\",\"dt\":0,\"uid\":\"8\",\"index\":1,\"type\":0,\"is_connected\":true,\"dynamic\":true},{\"name\":\"Max\",\"dt\":0,\"uid\":\"9\",\"index\":2,\"type\":0,\"is_connected\":true,\"dynamic\":true}],\"dyn_out\":[{\"name\":\"float\",\"dt\":0,\"uid\":\"7\",\"index\":0,\"type\":1,\"dynamic\":true}]},{\"plugin\":\"slider_float_generator\",\"x\":501,\"y\":234,\"uid\":\"ULwwZILoIuDL\",\"state\":{\"val\":0.42,\"min\":0,\"max\":1},\"title\":\"speed\"},{\"plugin\":\"const_float_generator\",\"x\":492,\"y\":343,\"uid\":\"QN8mZnWlWob0\",\"state\":{\"val\":0},\"title\":\"Min\"},{\"plugin\":\"const_float_generator\",\"x\":613,\"y\":343,\"uid\":\"AkJDjwjhqQ0A\",\"state\":{\"val\":1},\"title\":\"Max\"}],\"conns\":[{\"src_nuid\":\"ULwwZILoIuDL\",\"dst_nuid\":\"2KfJGi5FygJr\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"kGZrkcylNUnj\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"QN8mZnWlWob0\",\"dst_nuid\":\"2KfJGi5FygJr\",\"src_slot\":\"value\",\"dst_slot\":1,\"uid\":\"VwuLlUdlzVG9\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"AkJDjwjhqQ0A\",\"dst_nuid\":\"2KfJGi5FygJr\",\"src_slot\":\"value\",\"dst_slot\":2,\"uid\":\"scr5PbAt52bP\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]}}"
  },
  {
    "path": "browser/patches/_oscillate-with-in-tween.json",
    "content": "{\"abs_t\":672.995,\"active_graph\":\"root\",\"graph_uid\":\"F2SOwIkvCgXj\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"nodes\":[{\"plugin\":\"graph\",\"x\":455,\"y\":134,\"uid\":\"iW03WdPhB3Xd\",\"state\":{\"always_update\":true,\"input_sids\":{\"4jiMxFP9VcQ8\":\"6\",\"moQO71kmhyVv\":\"8\",\"wHtmDQUKAr4l\":\"9\"},\"output_sids\":{\"1S67zeqyUjEh\":\"7\"}},\"title\":\"Oscillate with In tween\",\"graph\":{\"uid\":\"tOR9xUmAmeuI\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"delta_t_generator\",\"x\":62,\"y\":232,\"uid\":\"jWnsLODuDTgG\"},{\"plugin\":\"multiply_modulator\",\"x\":187,\"y\":222,\"uid\":\"MyO3sGh55PXa\"},{\"plugin\":\"input_proxy\",\"x\":78,\"y\":291,\"uid\":\"4jiMxFP9VcQ8\",\"title\":\"Speed\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"connected\":true,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"variable_local_read\",\"x\":204,\"y\":339,\"uid\":\"fdihtWSBdanQ\",\"title\":\"float\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"variable_local_write\",\"x\":589,\"y\":178,\"uid\":\"wqm1RHo1AAj3\",\"title\":\"float\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":0,\"is_connected\":true,\"dynamic\":true}]},{\"plugin\":\"add_modulator\",\"x\":312,\"y\":252,\"uid\":\"KwS4R527HtmJ\"},{\"plugin\":\"if_else_modulator\",\"x\":432,\"y\":278,\"uid\":\"BleuACeYmUp1\"},{\"plugin\":\"const_float_generator\",\"x\":316,\"y\":380,\"uid\":\"v16ltBPAePJg\",\"state\":{\"val\":0},\"title\":\"Reset\"},{\"plugin\":\"initialise_generator\",\"x\":348,\"y\":189,\"uid\":\"lVL2HyA5QywG\"},{\"plugin\":\"sine_modulator\",\"x\":550,\"y\":289,\"uid\":\"ZTk3XcueFTJY\"},{\"plugin\":\"subtract_modulator\",\"x\":664,\"y\":404,\"uid\":\"HFtOeKTFYBZu\"},{\"plugin\":\"convert_oscilator_unit_modulator\",\"x\":629,\"y\":289,\"uid\":\"qox7zRhssGGu\"},{\"plugin\":\"multiply_modulator\",\"x\":967,\"y\":260,\"uid\":\"A0aUYQ5q4xKE\"},{\"plugin\":\"add_modulator\",\"x\":1067,\"y\":301,\"uid\":\"OjvSX1Nxp0bB\"},{\"plugin\":\"output_proxy\",\"x\":1158,\"y\":304,\"uid\":\"1S67zeqyUjEh\",\"title\":\"float\",\"dyn_in\":[{\"name\":\"input\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true,\"dynamic\":true}]},{\"plugin\":\"input_proxy\",\"x\":538,\"y\":399,\"uid\":\"moQO71kmhyVv\",\"title\":\"Min\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"connected\":true,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":604,\"y\":404,\"uid\":\"wHtmDQUKAr4l\",\"title\":\"Max\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"connected\":true,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"tween_in_modulator\",\"x\":774,\"y\":250,\"uid\":\"FYGsbZB2iIJC\",\"state\":{\"type\":0}}],\"conns\":[{\"src_nuid\":\"jWnsLODuDTgG\",\"dst_nuid\":\"MyO3sGh55PXa\",\"src_slot\":\"seconds\",\"dst_slot\":\"a\",\"uid\":\"3bTSEB0Okctm\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"4jiMxFP9VcQ8\",\"dst_nuid\":\"MyO3sGh55PXa\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"RMU62C5uHIHa\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"MyO3sGh55PXa\",\"dst_nuid\":\"KwS4R527HtmJ\",\"src_slot\":\"result\",\"dst_slot\":\"a\",\"uid\":\"7IEHBHb35BTo\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"fdihtWSBdanQ\",\"dst_nuid\":\"KwS4R527HtmJ\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"ABnkvfxO1d7C\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"KwS4R527HtmJ\",\"dst_nuid\":\"BleuACeYmUp1\",\"src_slot\":\"result\",\"dst_slot\":\"false value\",\"uid\":\"B2uvbeYFIA0u\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"lVL2HyA5QywG\",\"dst_nuid\":\"BleuACeYmUp1\",\"src_slot\":\"bool\",\"dst_slot\":\"condition\",\"uid\":\"hwqadyG7hn6s\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"v16ltBPAePJg\",\"dst_nuid\":\"BleuACeYmUp1\",\"src_slot\":\"value\",\"dst_slot\":\"true value\",\"uid\":\"KtupFc7OYOh1\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ZTk3XcueFTJY\",\"dst_nuid\":\"qox7zRhssGGu\",\"src_slot\":\"value\",\"dst_slot\":\"value\",\"uid\":\"zMRWIZo0N8Kx\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"wHtmDQUKAr4l\",\"dst_nuid\":\"HFtOeKTFYBZu\",\"src_slot\":0,\"dst_slot\":\"a\",\"uid\":\"SDQuW9EKTNuT\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"moQO71kmhyVv\",\"dst_nuid\":\"HFtOeKTFYBZu\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"uumWRqS8eFAo\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"offset\":1},{\"src_nuid\":\"HFtOeKTFYBZu\",\"dst_nuid\":\"A0aUYQ5q4xKE\",\"src_slot\":\"result\",\"dst_slot\":\"b\",\"uid\":\"KzrYPrfgWBFB\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"A0aUYQ5q4xKE\",\"dst_nuid\":\"OjvSX1Nxp0bB\",\"src_slot\":\"result\",\"dst_slot\":\"a\",\"uid\":\"crUynl3zdqqd\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"moQO71kmhyVv\",\"dst_nuid\":\"OjvSX1Nxp0bB\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"ZZUMyZH7UWMJ\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"OjvSX1Nxp0bB\",\"dst_nuid\":\"1S67zeqyUjEh\",\"src_slot\":\"result\",\"dst_slot\":0,\"uid\":\"BiphjiFRsabc\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":\"BleuACeYmUp1\",\"dst_nuid\":\"wqm1RHo1AAj3\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"weGo0a2dOFJS\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"BleuACeYmUp1\",\"dst_nuid\":\"ZTk3XcueFTJY\",\"src_slot\":\"value\",\"dst_slot\":\"time\",\"uid\":\"LoKYqc2N5jzA\",\"src_connected\":true,\"dst_connected\":true,\"offset\":1},{\"src_nuid\":\"qox7zRhssGGu\",\"dst_nuid\":\"FYGsbZB2iIJC\",\"src_slot\":\"value\",\"dst_slot\":\"time\",\"uid\":\"VCj9Vb7NpdNj\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"FYGsbZB2iIJC\",\"dst_nuid\":\"A0aUYQ5q4xKE\",\"src_slot\":\"result\",\"dst_slot\":\"a\",\"uid\":\"cnIH4SLDv2g8\",\"src_connected\":true,\"dst_connected\":true}],\"variables\":[{\"id\":\"float\",\"dt\":8}]},\"dyn_in\":[{\"name\":\"Speed\",\"dt\":0,\"uid\":\"6\",\"index\":0,\"type\":0,\"is_connected\":true,\"dynamic\":true},{\"name\":\"Min\",\"dt\":0,\"uid\":\"8\",\"index\":1,\"type\":0,\"is_connected\":true,\"dynamic\":true},{\"name\":\"Max\",\"dt\":0,\"uid\":\"9\",\"index\":2,\"type\":0,\"is_connected\":true,\"dynamic\":true}],\"dyn_out\":[{\"name\":\"float\",\"dt\":0,\"uid\":\"7\",\"index\":0,\"type\":1,\"dynamic\":true}]},{\"plugin\":\"slider_float_generator\",\"x\":177,\"y\":134,\"uid\":\"bQqBw0UNiZWg\",\"state\":{\"val\":0.42,\"min\":0,\"max\":1},\"title\":\"speed\"},{\"plugin\":\"const_float_generator\",\"x\":176,\"y\":198,\"uid\":\"yV9nkv6P4ipi\",\"state\":{\"val\":0},\"title\":\"Min\"},{\"plugin\":\"const_float_generator\",\"x\":264,\"y\":198,\"uid\":\"Qvdv4eR6oLnn\",\"state\":{\"val\":1},\"title\":\"Max\"}],\"conns\":[{\"src_nuid\":\"bQqBw0UNiZWg\",\"dst_nuid\":\"iW03WdPhB3Xd\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"Ig3oaaESD8zW\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"yV9nkv6P4ipi\",\"dst_nuid\":\"iW03WdPhB3Xd\",\"src_slot\":\"value\",\"dst_slot\":1,\"uid\":\"c0ckkZjZ8K3V\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"Qvdv4eR6oLnn\",\"dst_nuid\":\"iW03WdPhB3Xd\",\"src_slot\":\"value\",\"dst_slot\":2,\"uid\":\"cx3mwT7IbJcY\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]}}"
  },
  {
    "path": "browser/patches/_oscillate-with-out-tween.json",
    "content": "{\"abs_t\":644.064,\"active_graph\":\"root\",\"graph_uid\":\"F2SOwIkvCgXj\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"nodes\":[{\"plugin\":\"graph\",\"x\":450,\"y\":202,\"uid\":\"oW4pZr1uXRho\",\"state\":{\"always_update\":true,\"input_sids\":{\"tQbRXUKe2Gp0\":\"6\",\"I7Qw5ok7Buh0\":\"8\",\"3utWJDAWj15O\":\"9\"},\"output_sids\":{\"v2kPDMLI19Pl\":\"7\"}},\"title\":\"Oscillate with Out tween\",\"graph\":{\"uid\":\"UQTZhDSKurR1\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"delta_t_generator\",\"x\":62,\"y\":232,\"uid\":\"h9t9kCc7n9cW\"},{\"plugin\":\"multiply_modulator\",\"x\":187,\"y\":222,\"uid\":\"DAzAaH5pZBjU\"},{\"plugin\":\"input_proxy\",\"x\":78,\"y\":291,\"uid\":\"tQbRXUKe2Gp0\",\"title\":\"Speed\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"connected\":true,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"variable_local_read\",\"x\":204,\"y\":339,\"uid\":\"OHtQEmD9lMLe\",\"title\":\"float\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"variable_local_write\",\"x\":589,\"y\":178,\"uid\":\"RrdVC7pUuUHI\",\"title\":\"float\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":0,\"is_connected\":true,\"dynamic\":true}]},{\"plugin\":\"add_modulator\",\"x\":312,\"y\":252,\"uid\":\"GUuGLNCbF5E7\"},{\"plugin\":\"if_else_modulator\",\"x\":432,\"y\":278,\"uid\":\"WQ3M3KvOFYQf\"},{\"plugin\":\"const_float_generator\",\"x\":316,\"y\":380,\"uid\":\"num5v9hn6Kx1\",\"state\":{\"val\":0},\"title\":\"Reset\"},{\"plugin\":\"initialise_generator\",\"x\":348,\"y\":189,\"uid\":\"F1rQAvjXsFJr\"},{\"plugin\":\"sine_modulator\",\"x\":550,\"y\":289,\"uid\":\"aPSv3Zq2PfYs\"},{\"plugin\":\"subtract_modulator\",\"x\":664,\"y\":404,\"uid\":\"heVAnRB3XolV\"},{\"plugin\":\"convert_oscilator_unit_modulator\",\"x\":629,\"y\":289,\"uid\":\"THoPZ15mKHJR\"},{\"plugin\":\"multiply_modulator\",\"x\":967,\"y\":260,\"uid\":\"ssWnHQ5VwCFG\"},{\"plugin\":\"add_modulator\",\"x\":1067,\"y\":301,\"uid\":\"pXKYcc4mhxyU\"},{\"plugin\":\"output_proxy\",\"x\":1158,\"y\":304,\"uid\":\"v2kPDMLI19Pl\",\"title\":\"float\",\"dyn_in\":[{\"name\":\"input\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true,\"dynamic\":true}]},{\"plugin\":\"input_proxy\",\"x\":538,\"y\":399,\"uid\":\"I7Qw5ok7Buh0\",\"title\":\"Min\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"connected\":true,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":604,\"y\":404,\"uid\":\"3utWJDAWj15O\",\"title\":\"Max\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"connected\":true,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"tween_out_modulator\",\"x\":776,\"y\":277,\"uid\":\"MqR0aSiZgwNo\",\"state\":{\"type\":0}}],\"conns\":[{\"src_nuid\":\"h9t9kCc7n9cW\",\"dst_nuid\":\"DAzAaH5pZBjU\",\"src_slot\":\"seconds\",\"dst_slot\":\"a\",\"uid\":\"ZsCW9Co864j3\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"tQbRXUKe2Gp0\",\"dst_nuid\":\"DAzAaH5pZBjU\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"i6XGIBLi4mVN\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"DAzAaH5pZBjU\",\"dst_nuid\":\"GUuGLNCbF5E7\",\"src_slot\":\"result\",\"dst_slot\":\"a\",\"uid\":\"uXuktDiE9qOR\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"OHtQEmD9lMLe\",\"dst_nuid\":\"GUuGLNCbF5E7\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"jKB9fO3lPCjw\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"GUuGLNCbF5E7\",\"dst_nuid\":\"WQ3M3KvOFYQf\",\"src_slot\":\"result\",\"dst_slot\":\"false value\",\"uid\":\"fVRZcLVScNPB\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"F1rQAvjXsFJr\",\"dst_nuid\":\"WQ3M3KvOFYQf\",\"src_slot\":\"bool\",\"dst_slot\":\"condition\",\"uid\":\"0oINrFlVnlTa\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"num5v9hn6Kx1\",\"dst_nuid\":\"WQ3M3KvOFYQf\",\"src_slot\":\"value\",\"dst_slot\":\"true value\",\"uid\":\"fFksEYnlZwWc\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"aPSv3Zq2PfYs\",\"dst_nuid\":\"THoPZ15mKHJR\",\"src_slot\":\"value\",\"dst_slot\":\"value\",\"uid\":\"efZrwF1mKkJb\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"3utWJDAWj15O\",\"dst_nuid\":\"heVAnRB3XolV\",\"src_slot\":0,\"dst_slot\":\"a\",\"uid\":\"EQqYfh7H0P9y\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"I7Qw5ok7Buh0\",\"dst_nuid\":\"heVAnRB3XolV\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"ffJkKWtiYQzK\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"offset\":1},{\"src_nuid\":\"heVAnRB3XolV\",\"dst_nuid\":\"ssWnHQ5VwCFG\",\"src_slot\":\"result\",\"dst_slot\":\"b\",\"uid\":\"Jqu2yOFd7rDj\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ssWnHQ5VwCFG\",\"dst_nuid\":\"pXKYcc4mhxyU\",\"src_slot\":\"result\",\"dst_slot\":\"a\",\"uid\":\"HNaqgpkbVRpX\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"I7Qw5ok7Buh0\",\"dst_nuid\":\"pXKYcc4mhxyU\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"cUn7Rl0Hcrb6\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"pXKYcc4mhxyU\",\"dst_nuid\":\"v2kPDMLI19Pl\",\"src_slot\":\"result\",\"dst_slot\":0,\"uid\":\"tExWPZY4XN6S\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":\"WQ3M3KvOFYQf\",\"dst_nuid\":\"RrdVC7pUuUHI\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"yPOWFTo6y32D\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"WQ3M3KvOFYQf\",\"dst_nuid\":\"aPSv3Zq2PfYs\",\"src_slot\":\"value\",\"dst_slot\":\"time\",\"uid\":\"x7MPgJQ33eJo\",\"src_connected\":true,\"dst_connected\":true,\"offset\":1},{\"src_nuid\":\"THoPZ15mKHJR\",\"dst_nuid\":\"MqR0aSiZgwNo\",\"src_slot\":\"value\",\"dst_slot\":\"time\",\"uid\":\"PExYvMeQ7yWJ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"MqR0aSiZgwNo\",\"dst_nuid\":\"ssWnHQ5VwCFG\",\"src_slot\":\"result\",\"dst_slot\":\"a\",\"uid\":\"aWFRUTsI1o4x\",\"src_connected\":true,\"dst_connected\":true}],\"variables\":[{\"id\":\"float\",\"dt\":8}]},\"dyn_in\":[{\"name\":\"Speed\",\"dt\":0,\"uid\":\"6\",\"index\":0,\"type\":0,\"is_connected\":true,\"dynamic\":true},{\"name\":\"Min\",\"dt\":0,\"uid\":\"8\",\"index\":1,\"type\":0,\"is_connected\":true,\"dynamic\":true},{\"name\":\"Max\",\"dt\":0,\"uid\":\"9\",\"index\":2,\"type\":0,\"is_connected\":true,\"dynamic\":true}],\"dyn_out\":[{\"name\":\"float\",\"dt\":0,\"uid\":\"7\",\"index\":0,\"type\":1,\"dynamic\":true}]},{\"plugin\":\"slider_float_generator\",\"x\":174,\"y\":203,\"uid\":\"jaYxdScv3Ygd\",\"state\":{\"val\":0.42,\"min\":0,\"max\":1},\"title\":\"speed\"},{\"plugin\":\"const_float_generator\",\"x\":173,\"y\":267,\"uid\":\"67ltgtWGEyVk\",\"state\":{\"val\":0},\"title\":\"Min\"},{\"plugin\":\"const_float_generator\",\"x\":261,\"y\":267,\"uid\":\"gdfjV5IqopSg\",\"state\":{\"val\":1},\"title\":\"Max\"}],\"conns\":[{\"src_nuid\":\"jaYxdScv3Ygd\",\"dst_nuid\":\"oW4pZr1uXRho\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"vlFnm1jEmPQv\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"67ltgtWGEyVk\",\"dst_nuid\":\"oW4pZr1uXRho\",\"src_slot\":\"value\",\"dst_slot\":1,\"uid\":\"lRdQS64drRow\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"gdfjV5IqopSg\",\"dst_nuid\":\"oW4pZr1uXRho\",\"src_slot\":\"value\",\"dst_slot\":2,\"uid\":\"N8707bu62Zrv\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]}}"
  },
  {
    "path": "browser/patches/_stopwatch.json",
    "content": "{\"abs_t\":0,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":757,\"y\":333,\"uid\":\"EzXhcnCVVJ8W\",\"state\":{\"always_update\":true,\"input_sids\":{\"3geRrS9uymYk\":\"0\",\"T65JNQCdNYKY\":\"2\"},\"output_sids\":{\"8RWgadMmrbve\":\"3\"}},\"title\":\"Stopwatch\",\"graph\":{\"uid\":\"yKFxYDKWHPW2\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"delta_t_generator\",\"x\":878,\"y\":221,\"uid\":\"x9AnLEmJCuCr\"},{\"plugin\":\"add_modulator\",\"x\":1028,\"y\":221,\"uid\":\"sSkD6jxzqhLF\"},{\"plugin\":\"variable_local_read\",\"x\":44,\"y\":394,\"uid\":\"Nf3VDzw4VNkM\",\"title\":\"time\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":1,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"variable_local_write\",\"x\":1566,\"y\":201,\"uid\":\"PMLMmwmPPFwm\",\"title\":\"time\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":0,\"is_connected\":true,\"dynamic\":true}]},{\"plugin\":\"if_else_modulator\",\"x\":1267,\"y\":212,\"uid\":\"yT9W6VAtvaUz\"},{\"plugin\":\"const_float_generator\",\"x\":316,\"y\":505,\"uid\":\"8CCAwhe84rH5\",\"state\":{\"val\":0}},{\"plugin\":\"variable_local_write\",\"x\":737,\"y\":454,\"uid\":\"hTjWBxps6xnu\",\"title\":\"time\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"0\",\"index\":0,\"type\":0,\"is_connected\":true,\"dynamic\":true}]},{\"plugin\":\"const_float_generator\",\"x\":349,\"y\":189,\"uid\":\"gScZS37YD3aZ\",\"state\":{\"val\":1}},{\"plugin\":\"equals_modulator\",\"x\":1030,\"y\":98,\"uid\":\"ycJVQydnfzCW\"},{\"plugin\":\"input_proxy\",\"x\":369,\"y\":40,\"uid\":\"3geRrS9uymYk\",\"title\":\"running\",\"dyn_out\":[{\"name\":\"input\",\"dt\":7,\"uid\":\"0\",\"index\":0,\"type\":1,\"connected\":true,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":376,\"y\":409,\"uid\":\"T65JNQCdNYKY\",\"title\":\"reset\",\"dyn_out\":[{\"name\":\"input\",\"dt\":7,\"uid\":\"0\",\"index\":0,\"type\":1,\"connected\":true,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":1548,\"y\":434,\"uid\":\"8RWgadMmrbve\",\"title\":\"time\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"def\":null,\"uid\":\"0\",\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true,\"dynamic\":true}]},{\"plugin\":\"if_else_modulator\",\"x\":522,\"y\":418,\"uid\":\"dwdf4ntgzJjJ\"},{\"plugin\":\"convert_float_bool_modulator\",\"x\":644,\"y\":165,\"uid\":\"b7gUWYHWxQqN\"}],\"conns\":[{\"src_nuid\":\"x9AnLEmJCuCr\",\"dst_nuid\":\"sSkD6jxzqhLF\",\"src_slot\":\"seconds\",\"dst_slot\":\"a\",\"uid\":\"Sjc3guuNGuz4\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Nf3VDzw4VNkM\",\"dst_nuid\":\"sSkD6jxzqhLF\",\"src_slot\":0,\"dst_slot\":\"b\",\"uid\":\"fdYGxJWfhyt2\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"sSkD6jxzqhLF\",\"dst_nuid\":\"yT9W6VAtvaUz\",\"src_slot\":\"result\",\"dst_slot\":\"true value\",\"uid\":\"8kLujTUeVZEv\",\"src_connected\":true,\"dst_connected\":true,\"offset\":1},{\"src_nuid\":\"Nf3VDzw4VNkM\",\"dst_nuid\":\"yT9W6VAtvaUz\",\"src_slot\":0,\"dst_slot\":\"false value\",\"uid\":\"Kq3S83dywJaC\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"offset\":1},{\"src_nuid\":\"yT9W6VAtvaUz\",\"dst_nuid\":\"PMLMmwmPPFwm\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"bC4rN6QBdkmX\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"ycJVQydnfzCW\",\"dst_nuid\":\"yT9W6VAtvaUz\",\"src_slot\":\"bool\",\"dst_slot\":\"condition\",\"uid\":\"6wRUMfJVwJtg\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"yT9W6VAtvaUz\",\"dst_nuid\":\"8RWgadMmrbve\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"XbkxqqvLcUTk\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true,\"offset\":2},{\"src_nuid\":\"T65JNQCdNYKY\",\"dst_nuid\":\"dwdf4ntgzJjJ\",\"src_slot\":0,\"dst_slot\":\"condition\",\"uid\":\"m3tKLC8PM7rT\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"8CCAwhe84rH5\",\"dst_nuid\":\"dwdf4ntgzJjJ\",\"src_slot\":\"value\",\"dst_slot\":\"true value\",\"uid\":\"VtG6KCeScHp4\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"dwdf4ntgzJjJ\",\"dst_nuid\":\"hTjWBxps6xnu\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"uHhJ2222U7Q6\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"Nf3VDzw4VNkM\",\"dst_nuid\":\"dwdf4ntgzJjJ\",\"src_slot\":0,\"dst_slot\":\"false value\",\"uid\":\"NfrkTn83Us8B\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"gScZS37YD3aZ\",\"dst_nuid\":\"b7gUWYHWxQqN\",\"src_slot\":\"value\",\"dst_slot\":\"value\",\"uid\":\"WxFhkG4D4CD2\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"3geRrS9uymYk\",\"dst_nuid\":\"ycJVQydnfzCW\",\"src_slot\":0,\"dst_slot\":\"value\",\"uid\":\"TmPyQrqLPPmy\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"b7gUWYHWxQqN\",\"dst_nuid\":\"ycJVQydnfzCW\",\"src_slot\":\"bool\",\"dst_slot\":\"reference\",\"uid\":\"MLHWxSn9LQgw\",\"src_connected\":true,\"dst_connected\":true}],\"variables\":[{\"id\":\"time\",\"dt\":0}]},\"dyn_in\":[{\"name\":\"running\",\"dt\":7,\"uid\":\"0\",\"index\":0,\"type\":0,\"is_connected\":true,\"dynamic\":true},{\"name\":\"reset\",\"dt\":7,\"uid\":\"2\",\"index\":1,\"type\":0,\"is_connected\":true,\"dynamic\":true}],\"dyn_out\":[{\"name\":\"time\",\"dt\":0,\"uid\":\"3\",\"index\":0,\"type\":1,\"dynamic\":true,\"is_connected\":true}]},{\"plugin\":\"action_button\",\"x\":511,\"y\":392,\"uid\":\"VZCJrby9zGaf\",\"title\":\"Reset\"},{\"plugin\":\"float_display\",\"x\":1004,\"y\":343,\"uid\":\"peebMd9yEwXs\"},{\"plugin\":\"toggle_button\",\"x\":511,\"y\":306,\"uid\":\"QDuNMCYzzwUs\",\"state\":{\"enabled\":false},\"title\":\"Running\"}],\"conns\":[{\"src_nuid\":\"VZCJrby9zGaf\",\"dst_nuid\":\"EzXhcnCVVJ8W\",\"src_slot\":\"bool\",\"dst_slot\":1,\"uid\":\"YCB56372hckx\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"EzXhcnCVVJ8W\",\"dst_nuid\":\"peebMd9yEwXs\",\"src_slot\":0,\"dst_slot\":\"float\",\"uid\":\"dfCXbVXWW72r\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"QDuNMCYzzwUs\",\"dst_nuid\":\"EzXhcnCVVJ8W\",\"src_slot\":\"bool\",\"dst_slot\":0,\"uid\":\"UzVce3nrD68r\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]}}"
  },
  {
    "path": "browser/patches/_template-360-photo.json",
    "content": "{\r\n   \"abs_t\":68.879,\r\n   \"active_graph\":\"root\",\r\n   \"graph_uid\":\"TXDgBc0JJtS3\",\r\n   \"root\":{\r\n      \"uid\":\"root\",\r\n      \"parent_uid\":-1,\r\n      \"open\":true,\r\n      \"nodes\":[\r\n         {\r\n            \"plugin\":\"three_scene\",\r\n            \"x\":875,\r\n            \"y\":273,\r\n            \"uid\":\"u2O8M5ItNlW5\",\r\n            \"dyn_in\":[\r\n               {\r\n                  \"type\":0,\r\n                  \"name\":\"0\",\r\n                  \"dt\":21,\r\n                  \"array\":true,\r\n                  \"uid\":\"DDzcOXqI6iRM\",\r\n                  \"dynamic\":true,\r\n                  \"index\":0,\r\n                  \"is_connected\":true\r\n               },\r\n               {\r\n                  \"type\":0,\r\n                  \"name\":\"1\",\r\n                  \"dt\":21,\r\n                  \"array\":true,\r\n                  \"uid\":\"wVKKVFGKaWE8\",\r\n                  \"dynamic\":true,\r\n                  \"index\":1\r\n               }\r\n            ]\r\n         },\r\n         {\r\n            \"plugin\":\"entity\",\r\n            \"x\":582,\r\n            \"y\":272,\r\n            \"uid\":\"jKZUsNTh9S9j\",\r\n            \"state\":{\r\n               \"always_update\":true,\r\n               \"input_sids\":{\r\n                  \"XpAk3k4R62fA\":\"lOz0fKTfMesH\",\r\n                  \"vYWHQzbKwNRK\":\"C82r5UcvHc5s\",\r\n                  \"jvdEMGcajAge\":\"85fwdKUVE96S\"\r\n               },\r\n               \"output_sids\":{\r\n                  \"FFHBWxJ4VSaE\":\"mh0rTKkFm0nD\"\r\n               }\r\n            },\r\n            \"title\":\"360 photo\",\r\n            \"graph\":{\r\n               \"uid\":\"rnVdPCs2aRSb\",\r\n               \"parent_uid\":\"root\",\r\n               \"open\":true,\r\n               \"nodes\":[\r\n                  {\r\n                     \"plugin\":\"three_mesh\",\r\n                     \"x\":886,\r\n                     \"y\":6,\r\n                     \"uid\":\"VhKFCJfXjqaU\",\r\n                     \"state\":{\r\n                        \"position\":{\r\n                           \"x\":0,\r\n                           \"y\":0,\r\n                           \"z\":0\r\n                        },\r\n                        \"scale\":{\r\n                           \"x\":1,\r\n                           \"y\":1,\r\n                           \"z\":1\r\n                        },\r\n                        \"quaternion\":{\r\n                           \"_x\":0,\r\n                           \"_y\":0,\r\n                           \"_z\":0,\r\n                           \"_w\":1\r\n                        }\r\n                     }\r\n                  },\r\n                  {\r\n                     \"plugin\":\"output_proxy\",\r\n                     \"x\":1052,\r\n                     \"y\":6,\r\n                     \"uid\":\"FFHBWxJ4VSaE\",\r\n                     \"title\":\"object3d\",\r\n                     \"dyn_in\":[\r\n                        {\r\n                           \"name\":\"output\",\r\n                           \"dt\":21,\r\n                           \"def\":null,\r\n                           \"uid\":\"bEdPpC9C6Rh1\",\r\n                           \"dynamic\":true,\r\n                           \"type\":0,\r\n                           \"index\":0,\r\n                           \"is_connected\":true,\r\n                           \"connected\":true\r\n                        }\r\n                     ]\r\n                  },\r\n                  {\r\n                     \"plugin\":\"three_material\",\r\n                     \"x\":664,\r\n                     \"y\":292,\r\n                     \"uid\":\"JnhkETZKajQH\",\r\n                     \"state\":{\r\n\r\n                     }\r\n                  },\r\n                  {\r\n                     \"plugin\":\"const_float_generator\",\r\n                     \"x\":537,\r\n                     \"y\":540,\r\n                     \"uid\":\"J63sW4pqkQrw\",\r\n                     \"state\":{\r\n                        \"val\":1\r\n                     },\r\n                     \"title\":\"Side\"\r\n                  },\r\n                  {\r\n                     \"plugin\":\"three_uv_modifier\",\r\n                     \"x\":491,\r\n                     \"y\":323,\r\n                     \"uid\":\"73cbjNNMQ73q\",\r\n                     \"state\":{\r\n\r\n                     }\r\n                  },\r\n                  {\r\n                     \"plugin\":\"const_float_generator\",\r\n                     \"x\":305,\r\n                     \"y\":436,\r\n                     \"uid\":\"VCsmtxjNxvXH\",\r\n                     \"state\":{\r\n                        \"val\":-1\r\n                     },\r\n                     \"title\":\"X repeat photo\"\r\n                  },\r\n                  {\r\n                     \"plugin\":\"input_proxy\",\r\n                     \"x\":362,\r\n                     \"y\":355,\r\n                     \"uid\":\"XpAk3k4R62fA\",\r\n                     \"title\":\"texture\",\r\n                     \"dyn_out\":[\r\n                        {\r\n                           \"name\":\"input\",\r\n                           \"dt\":2,\r\n                           \"uid\":\"q2TtZnBOutlf\",\r\n                           \"dynamic\":true,\r\n                           \"type\":1,\r\n                           \"index\":0,\r\n                           \"is_connected\":true,\r\n                           \"connected\":true\r\n                        }\r\n                     ]\r\n                  },\r\n                  {\r\n                     \"plugin\":\"three_geometry_sphere\",\r\n                     \"x\":680,\r\n                     \"y\":65,\r\n                     \"uid\":\"jPJLNJY4qCBN\"\r\n                  },\r\n                  {\r\n                     \"plugin\":\"input_proxy\",\r\n                     \"x\":439,\r\n                     \"y\":49,\r\n                     \"uid\":\"vYWHQzbKwNRK\",\r\n                     \"title\":\"Radius\",\r\n                     \"dyn_out\":[\r\n                        {\r\n                           \"name\":\"input\",\r\n                           \"dt\":0,\r\n                           \"uid\":\"XMTdkuGQgC8b\",\r\n                           \"dynamic\":true,\r\n                           \"type\":1,\r\n                           \"index\":0,\r\n                           \"is_connected\":true,\r\n                           \"connected\":true\r\n                        }\r\n                     ]\r\n                  },\r\n                  {\r\n                     \"plugin\":\"input_proxy\",\r\n                     \"x\":349,\r\n                     \"y\":272,\r\n                     \"uid\":\"jvdEMGcajAge\",\r\n                     \"title\":\"WidthHeightSegments\",\r\n                     \"dyn_out\":[\r\n                        {\r\n                           \"name\":\"input\",\r\n                           \"dt\":0,\r\n                           \"uid\":\"yVNBBweKKPV5\",\r\n                           \"dynamic\":true,\r\n                           \"type\":1,\r\n                           \"index\":0,\r\n                           \"is_connected\":true,\r\n                           \"connected\":true\r\n                        }\r\n                     ]\r\n                  }\r\n               ],\r\n               \"conns\":[\r\n                  {\r\n                     \"src_nuid\":\"VhKFCJfXjqaU\",\r\n                     \"dst_nuid\":\"FFHBWxJ4VSaE\",\r\n                     \"src_slot\":\"object3d\",\r\n                     \"dst_slot\":0,\r\n                     \"uid\":\"HnzeJVCC965y\",\r\n                     \"dst_dyn\":true\r\n                  },\r\n                  {\r\n                     \"src_nuid\":\"JnhkETZKajQH\",\r\n                     \"dst_nuid\":\"VhKFCJfXjqaU\",\r\n                     \"src_slot\":\"material\",\r\n                     \"dst_slot\":\"material\",\r\n                     \"uid\":\"Lj3GwVEAuH8a\"\r\n                  },\r\n                  {\r\n                     \"src_nuid\":\"J63sW4pqkQrw\",\r\n                     \"dst_nuid\":\"JnhkETZKajQH\",\r\n                     \"src_slot\":\"value\",\r\n                     \"dst_slot\":\"side\",\r\n                     \"uid\":\"rVa5L7dNyBB4\"\r\n                  },\r\n                  {\r\n                     \"src_nuid\":\"73cbjNNMQ73q\",\r\n                     \"dst_nuid\":\"JnhkETZKajQH\",\r\n                     \"src_slot\":\"texture\",\r\n                     \"dst_slot\":\"texture\",\r\n                     \"uid\":\"wfYbSNwUSgN5\"\r\n                  },\r\n                  {\r\n                     \"src_nuid\":\"VCsmtxjNxvXH\",\r\n                     \"dst_nuid\":\"73cbjNNMQ73q\",\r\n                     \"src_slot\":\"value\",\r\n                     \"dst_slot\":\"u repeat\",\r\n                     \"uid\":\"FWYvbPqmzXeR\"\r\n                  },\r\n                  {\r\n                     \"src_nuid\":\"XpAk3k4R62fA\",\r\n                     \"dst_nuid\":\"73cbjNNMQ73q\",\r\n                     \"src_slot\":0,\r\n                     \"dst_slot\":\"texture\",\r\n                     \"uid\":\"JYKaxYtPhqta\",\r\n                     \"src_dyn\":true\r\n                  },\r\n                  {\r\n                     \"src_nuid\":\"jPJLNJY4qCBN\",\r\n                     \"dst_nuid\":\"VhKFCJfXjqaU\",\r\n                     \"src_slot\":\"geometry\",\r\n                     \"dst_slot\":\"geometry\",\r\n                     \"uid\":\"bFcr4TAYFY7v\"\r\n                  },\r\n                  {\r\n                     \"src_nuid\":\"vYWHQzbKwNRK\",\r\n                     \"dst_nuid\":\"jPJLNJY4qCBN\",\r\n                     \"src_slot\":0,\r\n                     \"dst_slot\":\"radius\",\r\n                     \"uid\":\"vs96guR4JGsu\",\r\n                     \"src_dyn\":true\r\n                  },\r\n                  {\r\n                     \"src_nuid\":\"jvdEMGcajAge\",\r\n                     \"dst_nuid\":\"jPJLNJY4qCBN\",\r\n                     \"src_slot\":0,\r\n                     \"dst_slot\":\"widthSegments\",\r\n                     \"uid\":\"cDzZ8nvsstM8\",\r\n                     \"src_dyn\":true\r\n                  },\r\n                  {\r\n                     \"src_nuid\":\"jvdEMGcajAge\",\r\n                     \"dst_nuid\":\"jPJLNJY4qCBN\",\r\n                     \"src_slot\":0,\r\n                     \"dst_slot\":\"heightSegments\",\r\n                     \"uid\":\"kaV3Bex2psqH\",\r\n                     \"src_dyn\":true\r\n                  }\r\n               ]\r\n            },\r\n            \"dyn_in\":[\r\n               {\r\n                  \"name\":\"WidthHeightSegments\",\r\n                  \"dt\":0,\r\n                  \"index\":0,\r\n                  \"uid\":\"85fwdKUVE96S\",\r\n                  \"dynamic\":true,\r\n                  \"type\":0,\r\n                  \"is_connected\":true\r\n               },\r\n               {\r\n                  \"name\":\"Radius\",\r\n                  \"dt\":0,\r\n                  \"index\":1,\r\n                  \"uid\":\"C82r5UcvHc5s\",\r\n                  \"dynamic\":true,\r\n                  \"type\":0,\r\n                  \"is_connected\":true\r\n               },\r\n               {\r\n                  \"name\":\"texture\",\r\n                  \"dt\":2,\r\n                  \"index\":2,\r\n                  \"uid\":\"lOz0fKTfMesH\",\r\n                  \"dynamic\":true,\r\n                  \"type\":0,\r\n                  \"is_connected\":true\r\n               }\r\n            ],\r\n            \"dyn_out\":[\r\n               {\r\n                  \"name\":\"object3d\",\r\n                  \"dt\":21,\r\n                  \"index\":0,\r\n                  \"uid\":\"mh0rTKkFm0nD\",\r\n                  \"dynamic\":true,\r\n                  \"type\":1,\r\n                  \"is_connected\":true\r\n               }\r\n            ]\r\n         },\r\n         {\r\n            \"plugin\":\"url_texture_generator\",\r\n            \"x\":356,\r\n            \"y\":359,\r\n            \"uid\":\"rbQzUJdSh2SH\",\r\n            \"state\":{\r\n               \"url\":\"/data/image/32046a219d7cb0c4a7b3d46f0b16ee9a77791192.png\",\r\n               \"urllow\":null\r\n            }\r\n         },\r\n         {\r\n            \"plugin\":\"three_webgl_renderer\",\r\n            \"x\":1023,\r\n            \"y\":214,\r\n            \"uid\":\"4Ykc8DAqcWkX\",\r\n            \"state\":{\r\n               \"always_update\":true\r\n            }\r\n         },\r\n         {\r\n            \"plugin\":\"three_vr_camera\",\r\n            \"x\":580,\r\n            \"y\":40,\r\n            \"uid\":\"axWAU7nYy2U5\",\r\n            \"state\":{\r\n               \"position\":{\r\n                  \"x\":-8.581592317734266,\r\n                  \"y\":0.480221928841524,\r\n                  \"z\":1.0609713432811405\r\n               },\r\n               \"quaternion\":{\r\n                  \"_x\":-0.02078093965682079,\r\n                  \"_y\":-0.6620520642378454,\r\n                  \"_z\":-0.018369939975076563,\r\n                  \"_w\":0.7489444313010309\r\n               }\r\n            }\r\n         },\r\n         {\r\n            \"plugin\":\"const_float_generator\",\r\n            \"x\":351,\r\n            \"y\":126,\r\n            \"uid\":\"VGKXeVCXzhnn\",\r\n            \"state\":{\r\n               \"val\":90\r\n            },\r\n            \"title\":\"Field of Vision (FOV)\"\r\n         },\r\n         {\r\n            \"plugin\":\"const_float_generator\",\r\n            \"x\":427,\r\n            \"y\":280,\r\n            \"uid\":\"eQRDr5KWW2JH\",\r\n            \"state\":{\r\n               \"val\":60\r\n            },\r\n            \"title\":\"Radius\"\r\n         },\r\n         {\r\n            \"plugin\":\"const_float_generator\",\r\n            \"x\":329,\r\n            \"y\":203,\r\n            \"uid\":\"hEcmuVCUgCZc\",\r\n            \"state\":{\r\n               \"val\":32\r\n            },\r\n            \"title\":\"width+HeightSegments\"\r\n         }\r\n      ],\r\n      \"conns\":[\r\n         {\r\n            \"src_nuid\":\"rbQzUJdSh2SH\",\r\n            \"dst_nuid\":\"jKZUsNTh9S9j\",\r\n            \"src_slot\":\"texture\",\r\n            \"dst_slot\":2,\r\n            \"uid\":\"r63GBtbuan9H\",\r\n            \"dst_dyn\":true\r\n         },\r\n         {\r\n            \"src_nuid\":\"jKZUsNTh9S9j\",\r\n            \"dst_nuid\":\"u2O8M5ItNlW5\",\r\n            \"src_slot\":0,\r\n            \"dst_slot\":0,\r\n            \"uid\":\"BLwXFTSmyxxc\",\r\n            \"src_dyn\":true,\r\n            \"dst_dyn\":true\r\n         },\r\n         {\r\n            \"src_nuid\":\"u2O8M5ItNlW5\",\r\n            \"dst_nuid\":\"4Ykc8DAqcWkX\",\r\n            \"src_slot\":\"scene\",\r\n            \"dst_slot\":\"scene\",\r\n            \"uid\":\"wVQMEJW2WPSJ\"\r\n         },\r\n         {\r\n            \"src_nuid\":\"axWAU7nYy2U5\",\r\n            \"dst_nuid\":\"4Ykc8DAqcWkX\",\r\n            \"src_slot\":\"camera\",\r\n            \"dst_slot\":\"camera\",\r\n            \"uid\":\"NV36fgyw9nXt\"\r\n         },\r\n         {\r\n            \"src_nuid\":\"VGKXeVCXzhnn\",\r\n            \"dst_nuid\":\"axWAU7nYy2U5\",\r\n            \"src_slot\":\"value\",\r\n            \"dst_slot\":\"fov\",\r\n            \"uid\":\"yZ8uzuct4yRq\"\r\n         },\r\n         {\r\n            \"src_nuid\":\"eQRDr5KWW2JH\",\r\n            \"dst_nuid\":\"jKZUsNTh9S9j\",\r\n            \"src_slot\":\"value\",\r\n            \"dst_slot\":1,\r\n            \"uid\":\"nVEfmNPQMBXS\",\r\n            \"dst_dyn\":true\r\n         },\r\n         {\r\n            \"src_nuid\":\"hEcmuVCUgCZc\",\r\n            \"dst_nuid\":\"jKZUsNTh9S9j\",\r\n            \"src_slot\":\"value\",\r\n            \"dst_slot\":0,\r\n            \"uid\":\"xWWfByRw4Am9\",\r\n            \"dst_dyn\":true\r\n         }\r\n      ]\r\n   }\r\n}\r\n"
  },
  {
    "path": "browser/patches/_template-basic-vr-scene.json",
    "content": "{\r\n    \"abs_t\": 399.458,\r\n    \"active_graph\": \"root\",\r\n    \"graph_uid\": \"TXDgBc0JJtS3\",\r\n    \"root\": {\r\n        \"uid\": \"root\",\r\n        \"parent_uid\": -1,\r\n        \"open\": true,\r\n        \"nodes\": [\r\n            {\r\n                \"plugin\": \"graph\",\r\n                \"x\": 488,\r\n                \"y\": 427,\r\n                \"uid\": \"MbhZTaM4pnmJ\",\r\n                \"open\": false,\r\n                \"state\": {\r\n                    \"always_update\": true,\r\n                    \"input_sids\": {},\r\n                    \"output_sids\": {\r\n                        \"G9kmmAFUggLr\": \"Ys30r7aVEks1\"\r\n                    }\r\n                },\r\n                \"title\": \"3D model\",\r\n                \"graph\": {\r\n                    \"uid\": \"WB55EhbvQ4Tt\",\r\n                    \"parent_uid\": \"root\",\r\n                    \"open\": true,\r\n                    \"nodes\": [\r\n                        {\r\n                            \"plugin\": \"three_loader_model\",\r\n                            \"x\": 321,\r\n                            \"y\": 234,\r\n                            \"uid\": \"CCzJgvWPTSqT\",\r\n                            \"state\": {\r\n                                \"url\": \"/data/scene/flamingo/flamingo.js\"\r\n                            }\r\n                        },\r\n                        {\r\n                            \"plugin\": \"three_mesh\",\r\n                            \"x\": 687,\r\n                            \"y\": 203,\r\n                            \"uid\": \"kF59HVNEZLeF\",\r\n                            \"open\": false,\r\n                            \"state\": {\r\n                                \"position\": {\r\n                                    \"x\": 0,\r\n                                    \"y\": 0.890837835382039,\r\n                                    \"z\": -1.9377822548397918\r\n                                },\r\n                                \"scale\": {\r\n                                    \"x\": 0.0094948370835134,\r\n                                    \"y\": 0.0094948370835134,\r\n                                    \"z\": 0.0094948370835134\r\n                                },\r\n                                \"quaternion\": {\r\n                                    \"_x\": 0,\r\n                                    \"_y\": 0,\r\n                                    \"_z\": 0,\r\n                                    \"_w\": 1\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            \"plugin\": \"output_proxy\",\r\n                            \"x\": 883,\r\n                            \"y\": 205,\r\n                            \"uid\": \"G9kmmAFUggLr\",\r\n                            \"title\": \"object3d\",\r\n                            \"dyn_in\": [\r\n                                {\r\n                                    \"name\": \"output\",\r\n                                    \"dt\": 21,\r\n                                    \"def\": null,\r\n                                    \"uid\": \"UW8xhKSPhTFp\",\r\n                                    \"dynamic\": true,\r\n                                    \"type\": 0,\r\n                                    \"index\": 0,\r\n                                    \"is_connected\": true,\r\n                                    \"connected\": true\r\n                                }\r\n                            ]\r\n                        }\r\n                    ],\r\n                    \"conns\": [\r\n                        {\r\n                            \"src_nuid\": \"CCzJgvWPTSqT\",\r\n                            \"dst_nuid\": \"kF59HVNEZLeF\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 1,\r\n                            \"uid\": \"dtMPVWE7GQNT\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"kF59HVNEZLeF\",\r\n                            \"dst_nuid\": \"G9kmmAFUggLr\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"B2FsJEL4CRqM\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true,\r\n                            \"dst_dyn\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"CCzJgvWPTSqT\",\r\n                            \"dst_nuid\": \"kF59HVNEZLeF\",\r\n                            \"src_slot\": 1,\r\n                            \"dst_slot\": 2,\r\n                            \"uid\": \"LP6EG4LbWhT4\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        }\r\n                    ]\r\n                },\r\n                \"dyn_out\": [\r\n                    {\r\n                        \"name\": \"object3d\",\r\n                        \"dt\": 21,\r\n                        \"index\": 0,\r\n                        \"uid\": \"Ys30r7aVEks1\",\r\n                        \"dynamic\": true,\r\n                        \"type\": 1,\r\n                        \"is_connected\": true\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"plugin\": \"three_scene\",\r\n                \"x\": 832,\r\n                \"y\": 327,\r\n                \"uid\": \"LeLkkRZThkyY\",\r\n                \"dyn_in\": [\r\n                    {\r\n                        \"type\": 0,\r\n                        \"name\": \"0\",\r\n                        \"dt\": 21,\r\n                        \"array\": true,\r\n                        \"uid\": \"DDzcOXqI6iRM\",\r\n                        \"dynamic\": true,\r\n                        \"index\": 0,\r\n                        \"is_connected\": true\r\n                    },\r\n                    {\r\n                        \"type\": 0,\r\n                        \"name\": \"1\",\r\n                        \"dt\": 21,\r\n                        \"array\": true,\r\n                        \"uid\": \"gH5pmBKZK4lm\",\r\n                        \"dynamic\": true,\r\n                        \"index\": 1,\r\n                        \"is_connected\": true\r\n                    },\r\n                    {\r\n                        \"type\": 0,\r\n                        \"name\": \"2\",\r\n                        \"dt\": 21,\r\n                        \"array\": true,\r\n                        \"uid\": \"ExPIjji5rvFO\",\r\n                        \"dynamic\": true,\r\n                        \"index\": 2,\r\n                        \"is_connected\": true\r\n                    },\r\n                    {\r\n                        \"type\": 0,\r\n                        \"name\": \"3\",\r\n                        \"dt\": 21,\r\n                        \"array\": true,\r\n                        \"uid\": \"hddJID3FkB4R\",\r\n                        \"dynamic\": true,\r\n                        \"index\": 3,\r\n                        \"is_connected\": true\r\n                    },\r\n                    {\r\n                        \"type\": 0,\r\n                        \"name\": \"4\",\r\n                        \"dt\": 21,\r\n                        \"array\": true,\r\n                        \"uid\": \"uSr941HZ6MvG\",\r\n                        \"dynamic\": true,\r\n                        \"index\": 4,\r\n                        \"is_connected\": true\r\n                    },\r\n                    {\r\n                        \"type\": 0,\r\n                        \"name\": \"5\",\r\n                        \"dt\": 21,\r\n                        \"array\": true,\r\n                        \"uid\": \"VyYhKANCjM3v\",\r\n                        \"dynamic\": true,\r\n                        \"index\": 5\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"plugin\": \"graph\",\r\n                \"x\": 544,\r\n                \"y\": 274,\r\n                \"uid\": \"HCha6a7ZxQNk\",\r\n                \"open\": false,\r\n                \"state\": {\r\n                    \"always_update\": true,\r\n                    \"input_sids\": {},\r\n                    \"output_sids\": {\r\n                        \"SfXESqZsurhe\": \"tjoeHNDBhUcN\"\r\n                    }\r\n                },\r\n                \"title\": \"Environment settings\",\r\n                \"graph\": {\r\n                    \"uid\": \"rfMLxRJcfeHU\",\r\n                    \"parent_uid\": \"root\",\r\n                    \"open\": true,\r\n                    \"nodes\": [\r\n                        {\r\n                            \"plugin\": \"three_environment_settings\",\r\n                            \"x\": 572,\r\n                            \"y\": 469,\r\n                            \"uid\": \"EAWutZHNesxD\",\r\n                            \"title\": \"Environment settings\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"output_proxy\",\r\n                            \"x\": 980,\r\n                            \"y\": 512,\r\n                            \"uid\": \"SfXESqZsurhe\",\r\n                            \"title\": \"environment\",\r\n                            \"dyn_in\": [\r\n                                {\r\n                                    \"name\": \"output\",\r\n                                    \"dt\": 23,\r\n                                    \"def\": null,\r\n                                    \"uid\": \"Yy89wKzOcZo4\",\r\n                                    \"dynamic\": true,\r\n                                    \"type\": 0,\r\n                                    \"index\": 0,\r\n                                    \"is_connected\": true,\r\n                                    \"connected\": true\r\n                                }\r\n                            ]\r\n                        },\r\n                        {\r\n                            \"plugin\": \"color_picker\",\r\n                            \"x\": 216,\r\n                            \"y\": 254,\r\n                            \"uid\": \"tGMdwhTdzqKe\",\r\n                            \"state\": {\r\n                                \"hue\": 0.4438202247191011,\r\n                                \"sat\": 0.449438202247191,\r\n                                \"lum\": 0.7916666666666666\r\n                            }\r\n                        },\r\n                        {\r\n                            \"plugin\": \"slider_float_generator\",\r\n                            \"x\": 168,\r\n                            \"y\": 565,\r\n                            \"uid\": \"yRs52j5CBJJq\",\r\n                            \"open\": false,\r\n                            \"state\": {\r\n                                \"val\": 5.287,\r\n                                \"min\": 0.1,\r\n                                \"max\": 40\r\n                            },\r\n                            \"title\": \"Fog near\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"slider_float_generator\",\r\n                            \"x\": 168,\r\n                            \"y\": 689,\r\n                            \"uid\": \"nHEyfyj926rV\",\r\n                            \"open\": false,\r\n                            \"state\": {\r\n                                \"val\": 18.706,\r\n                                \"min\": 1,\r\n                                \"max\": 40\r\n                            },\r\n                            \"title\": \"Fog far\"\r\n                        }\r\n                    ],\r\n                    \"conns\": [\r\n                        {\r\n                            \"src_nuid\": \"EAWutZHNesxD\",\r\n                            \"dst_nuid\": \"SfXESqZsurhe\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"Aj5fSgAkpzts\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true,\r\n                            \"dst_dyn\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"tGMdwhTdzqKe\",\r\n                            \"dst_nuid\": \"EAWutZHNesxD\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"cPNw6cWcVhZN\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"yRs52j5CBJJq\",\r\n                            \"dst_nuid\": \"EAWutZHNesxD\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 1,\r\n                            \"uid\": \"cGAQjstKBawg\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"nHEyfyj926rV\",\r\n                            \"dst_nuid\": \"EAWutZHNesxD\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 2,\r\n                            \"uid\": \"dAE6sBbYAp4B\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        }\r\n                    ]\r\n                },\r\n                \"dyn_out\": [\r\n                    {\r\n                        \"name\": \"environment\",\r\n                        \"dt\": 23,\r\n                        \"index\": 0,\r\n                        \"uid\": \"tjoeHNDBhUcN\",\r\n                        \"dynamic\": true,\r\n                        \"type\": 1,\r\n                        \"is_connected\": true\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"plugin\": \"graph\",\r\n                \"x\": 520,\r\n                \"y\": 326,\r\n                \"uid\": \"qWtKy9tqj6aU\",\r\n                \"open\": false,\r\n                \"state\": {\r\n                    \"always_update\": true,\r\n                    \"input_sids\": {},\r\n                    \"output_sids\": {\r\n                        \"WdGHEpFW86bz\": \"547odbJKrTzG\"\r\n                    }\r\n                },\r\n                \"title\": \"Point light 1\",\r\n                \"graph\": {\r\n                    \"uid\": \"auhShGZLzNLP\",\r\n                    \"parent_uid\": \"root\",\r\n                    \"open\": true,\r\n                    \"nodes\": [\r\n                        {\r\n                            \"plugin\": \"output_proxy\",\r\n                            \"x\": 1012,\r\n                            \"y\": 374,\r\n                            \"uid\": \"WdGHEpFW86bz\",\r\n                            \"title\": \"object3d\",\r\n                            \"dyn_in\": [\r\n                                {\r\n                                    \"name\": \"output\",\r\n                                    \"dt\": 21,\r\n                                    \"def\": null,\r\n                                    \"uid\": \"vSy6Gj4JSPYs\",\r\n                                    \"dynamic\": true,\r\n                                    \"type\": 0,\r\n                                    \"index\": 0,\r\n                                    \"is_connected\": true,\r\n                                    \"connected\": true\r\n                                }\r\n                            ]\r\n                        },\r\n                        {\r\n                            \"plugin\": \"three_point_light\",\r\n                            \"x\": 730,\r\n                            \"y\": 371,\r\n                            \"uid\": \"YWcJAfKzKMr7\",\r\n                            \"open\": false,\r\n                            \"state\": {\r\n                                \"position\": {\r\n                                    \"x\": -2.9420035670141815,\r\n                                    \"y\": 1.3598567240571549,\r\n                                    \"z\": 0\r\n                                },\r\n                                \"scale\": {\r\n                                    \"x\": 1,\r\n                                    \"y\": 1,\r\n                                    \"z\": 1\r\n                                },\r\n                                \"quaternion\": {\r\n                                    \"_x\": 0,\r\n                                    \"_y\": 0,\r\n                                    \"_z\": 0,\r\n                                    \"_w\": 1\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            \"plugin\": \"const_float_generator\",\r\n                            \"x\": 304,\r\n                            \"y\": 295,\r\n                            \"uid\": \"NP2zfaHzg34S\",\r\n                            \"state\": {\r\n                                \"val\": 1\r\n                            },\r\n                            \"title\": \"Intensity\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"color_picker\",\r\n                            \"x\": 276,\r\n                            \"y\": 449,\r\n                            \"uid\": \"Kw8esRt3uMnz\",\r\n                            \"state\": {\r\n                                \"hue\": 0,\r\n                                \"sat\": 0,\r\n                                \"lum\": 1\r\n                            }\r\n                        }\r\n                    ],\r\n                    \"conns\": [\r\n                        {\r\n                            \"src_nuid\": \"YWcJAfKzKMr7\",\r\n                            \"dst_nuid\": \"WdGHEpFW86bz\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"2hQmYsecbc3C\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true,\r\n                            \"dst_dyn\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"NP2zfaHzg34S\",\r\n                            \"dst_nuid\": \"YWcJAfKzKMr7\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"PzbJADq9FMtx\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"Kw8esRt3uMnz\",\r\n                            \"dst_nuid\": \"YWcJAfKzKMr7\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 3,\r\n                            \"uid\": \"Nn4CsL6mZpQz\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        }\r\n                    ]\r\n                },\r\n                \"dyn_out\": [\r\n                    {\r\n                        \"name\": \"object3d\",\r\n                        \"dt\": 21,\r\n                        \"index\": 0,\r\n                        \"uid\": \"547odbJKrTzG\",\r\n                        \"dynamic\": true,\r\n                        \"type\": 1,\r\n                        \"is_connected\": true\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"plugin\": \"graph\",\r\n                \"x\": 516,\r\n                \"y\": 487,\r\n                \"uid\": \"kSFjjcYBtZtS\",\r\n                \"open\": false,\r\n                \"state\": {\r\n                    \"always_update\": true,\r\n                    \"input_sids\": {},\r\n                    \"output_sids\": {\r\n                        \"3h5VMGVy55gj\": \"mh0rTKkFm0nD\"\r\n                    }\r\n                },\r\n                \"title\": \"Floor\",\r\n                \"graph\": {\r\n                    \"uid\": \"pfL9PkSq8NvE\",\r\n                    \"parent_uid\": \"root\",\r\n                    \"open\": true,\r\n                    \"nodes\": [\r\n                        {\r\n                            \"plugin\": \"three_mesh\",\r\n                            \"x\": 936,\r\n                            \"y\": 221,\r\n                            \"uid\": \"5bkrwERQjezL\",\r\n                            \"open\": false,\r\n                            \"state\": {\r\n                                \"position\": {\r\n                                    \"x\": 0,\r\n                                    \"y\": -0.019391319112426565,\r\n                                    \"z\": 0.000034513545685641685\r\n                                },\r\n                                \"scale\": {\r\n                                    \"x\": 16.260185647641777,\r\n                                    \"y\": 16.260185647641777,\r\n                                    \"z\": 16.260185647641777\r\n                                },\r\n                                \"quaternion\": {\r\n                                    \"_x\": -0.7077357707678449,\r\n                                    \"_y\": 0,\r\n                                    \"_z\": 0,\r\n                                    \"_w\": 0.7064772456816478\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            \"plugin\": \"output_proxy\",\r\n                            \"x\": 1105,\r\n                            \"y\": 223,\r\n                            \"uid\": \"3h5VMGVy55gj\",\r\n                            \"title\": \"object3d\",\r\n                            \"dyn_in\": [\r\n                                {\r\n                                    \"name\": \"output\",\r\n                                    \"dt\": 21,\r\n                                    \"def\": null,\r\n                                    \"uid\": \"bEdPpC9C6Rh1\",\r\n                                    \"dynamic\": true,\r\n                                    \"type\": 0,\r\n                                    \"index\": 0,\r\n                                    \"is_connected\": true,\r\n                                    \"connected\": true\r\n                                }\r\n                            ]\r\n                        },\r\n                        {\r\n                            \"plugin\": \"url_texture_generator\",\r\n                            \"x\": 153,\r\n                            \"y\": 180,\r\n                            \"uid\": \"5zZXRndQkE4p\",\r\n                            \"state\": {\r\n                                \"url\": \"/data/image/3968db2bdad274fc19d8283eb73c4691b14ac0b1.png\"\r\n                            },\r\n                            \"title\": \"Box texture\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"three_material_phong\",\r\n                            \"x\": 665,\r\n                            \"y\": 280,\r\n                            \"uid\": \"qcXuY5BkBUMz\",\r\n                            \"open\": false\r\n                        },\r\n                        {\r\n                            \"plugin\": \"three_geometry_plane\",\r\n                            \"x\": 751,\r\n                            \"y\": 172,\r\n                            \"uid\": \"QvnMFKfBBV5R\",\r\n                            \"open\": false\r\n                        },\r\n                        {\r\n                            \"plugin\": \"three_uv_modifier\",\r\n                            \"x\": 459,\r\n                            \"y\": 279,\r\n                            \"uid\": \"jHXhHywddqUL\",\r\n                            \"open\": false\r\n                        },\r\n                        {\r\n                            \"plugin\": \"const_float_generator\",\r\n                            \"x\": 215,\r\n                            \"y\": 386,\r\n                            \"uid\": \"P69E3GZq5Sgz\",\r\n                            \"state\": {\r\n                                \"val\": 40\r\n                            },\r\n                            \"title\": \"Repeat\"\r\n                        }\r\n                    ],\r\n                    \"conns\": [\r\n                        {\r\n                            \"src_nuid\": \"5bkrwERQjezL\",\r\n                            \"dst_nuid\": \"3h5VMGVy55gj\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"ukd6QKC4HbhE\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true,\r\n                            \"dst_dyn\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"qcXuY5BkBUMz\",\r\n                            \"dst_nuid\": \"5bkrwERQjezL\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 2,\r\n                            \"uid\": \"gSgGLGaLauMf\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"QvnMFKfBBV5R\",\r\n                            \"dst_nuid\": \"5bkrwERQjezL\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 1,\r\n                            \"uid\": \"3CUEjQ9T5kde\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"5zZXRndQkE4p\",\r\n                            \"dst_nuid\": \"jHXhHywddqUL\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"jDTq3YtPKq8G\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"jHXhHywddqUL\",\r\n                            \"dst_nuid\": \"qcXuY5BkBUMz\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"pparXYdYfKzj\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"P69E3GZq5Sgz\",\r\n                            \"dst_nuid\": \"jHXhHywddqUL\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 3,\r\n                            \"uid\": \"bubHv9MAEmtz\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"P69E3GZq5Sgz\",\r\n                            \"dst_nuid\": \"jHXhHywddqUL\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 4,\r\n                            \"uid\": \"5TutRQMMkztm\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        }\r\n                    ]\r\n                },\r\n                \"dyn_out\": [\r\n                    {\r\n                        \"name\": \"object3d\",\r\n                        \"dt\": 21,\r\n                        \"index\": 0,\r\n                        \"uid\": \"mh0rTKkFm0nD\",\r\n                        \"dynamic\": true,\r\n                        \"type\": 1,\r\n                        \"is_connected\": true\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"plugin\": \"graph\",\r\n                \"x\": 535,\r\n                \"y\": 546,\r\n                \"uid\": \"B2NQHZKfBYzV\",\r\n                \"open\": false,\r\n                \"state\": {\r\n                    \"always_update\": true,\r\n                    \"input_sids\": {},\r\n                    \"output_sids\": {\r\n                        \"A6vvXLq5uXNj\": \"mh0rTKkFm0nD\"\r\n                    }\r\n                },\r\n                \"title\": \"Sky sphere\",\r\n                \"graph\": {\r\n                    \"uid\": \"GGT5ah87tcRz\",\r\n                    \"parent_uid\": \"root\",\r\n                    \"open\": true,\r\n                    \"nodes\": [\r\n                        {\r\n                            \"plugin\": \"three_mesh\",\r\n                            \"x\": 967,\r\n                            \"y\": 294,\r\n                            \"uid\": \"fhh5QJMSC7rU\",\r\n                            \"open\": false,\r\n                            \"state\": {\r\n                                \"position\": {\r\n                                    \"x\": 0,\r\n                                    \"y\": 0,\r\n                                    \"z\": 0\r\n                                },\r\n                                \"scale\": {\r\n                                    \"x\": 1,\r\n                                    \"y\": 1,\r\n                                    \"z\": 1\r\n                                },\r\n                                \"quaternion\": {\r\n                                    \"_x\": 0,\r\n                                    \"_y\": 0,\r\n                                    \"_z\": 0,\r\n                                    \"_w\": 1\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            \"plugin\": \"output_proxy\",\r\n                            \"x\": 1166,\r\n                            \"y\": 295,\r\n                            \"uid\": \"A6vvXLq5uXNj\",\r\n                            \"title\": \"object3d\",\r\n                            \"dyn_in\": [\r\n                                {\r\n                                    \"name\": \"output\",\r\n                                    \"dt\": 21,\r\n                                    \"def\": null,\r\n                                    \"uid\": \"bEdPpC9C6Rh1\",\r\n                                    \"dynamic\": true,\r\n                                    \"type\": 0,\r\n                                    \"index\": 0,\r\n                                    \"is_connected\": true,\r\n                                    \"connected\": true\r\n                                }\r\n                            ]\r\n                        },\r\n                        {\r\n                            \"plugin\": \"url_texture_generator\",\r\n                            \"x\": 194,\r\n                            \"y\": 63,\r\n                            \"uid\": \"MtYbUTP9FKk6\",\r\n                            \"state\": {\r\n                                \"url\": \"/data/image/7cbc45195c04d1595c43be42418755520068c72e.png\"\r\n                            },\r\n                            \"title\": \"Texture\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"three_material\",\r\n                            \"x\": 656,\r\n                            \"y\": 156,\r\n                            \"uid\": \"yW97qMFvWVQY\",\r\n                            \"open\": false\r\n                        },\r\n                        {\r\n                            \"plugin\": \"const_float_generator\",\r\n                            \"x\": 470,\r\n                            \"y\": 234,\r\n                            \"uid\": \"k5LMrWjKyXJ9\",\r\n                            \"open\": false,\r\n                            \"state\": {\r\n                                \"val\": 1\r\n                            },\r\n                            \"title\": \"Side\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"toggle_button\",\r\n                            \"x\": 431,\r\n                            \"y\": 172,\r\n                            \"uid\": \"ue5RBj5Pmy4V\",\r\n                            \"open\": false,\r\n                            \"state\": {\r\n                                \"enabled\": false\r\n                            },\r\n                            \"title\": \"Fog On/Off\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"const_float_generator\",\r\n                            \"x\": 356,\r\n                            \"y\": 372,\r\n                            \"uid\": \"RtZ9H7mcXVwe\",\r\n                            \"open\": false,\r\n                            \"state\": {\r\n                                \"val\": 40\r\n                            },\r\n                            \"title\": \"Size\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"const_float_generator\",\r\n                            \"x\": 356,\r\n                            \"y\": 438,\r\n                            \"uid\": \"bkeTdDZLhmrr\",\r\n                            \"open\": false,\r\n                            \"state\": {\r\n                                \"val\": 40\r\n                            },\r\n                            \"title\": \"Detail\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"three_geometry_sphere\",\r\n                            \"x\": 558,\r\n                            \"y\": 402,\r\n                            \"uid\": \"nAVgSyUe3kqC\",\r\n                            \"open\": false\r\n                        }\r\n                    ],\r\n                    \"conns\": [\r\n                        {\r\n                            \"src_nuid\": \"fhh5QJMSC7rU\",\r\n                            \"dst_nuid\": \"A6vvXLq5uXNj\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"9RkAY8hY6SB3\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true,\r\n                            \"dst_dyn\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"MtYbUTP9FKk6\",\r\n                            \"dst_nuid\": \"yW97qMFvWVQY\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"puVS76wwdHnP\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"yW97qMFvWVQY\",\r\n                            \"dst_nuid\": \"fhh5QJMSC7rU\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 2,\r\n                            \"uid\": \"YguujvzsATPb\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"k5LMrWjKyXJ9\",\r\n                            \"dst_nuid\": \"yW97qMFvWVQY\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 8,\r\n                            \"uid\": \"MYZbDQfBgLQR\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"ue5RBj5Pmy4V\",\r\n                            \"dst_nuid\": \"yW97qMFvWVQY\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 3,\r\n                            \"uid\": \"pdNP54rvEZRx\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"RtZ9H7mcXVwe\",\r\n                            \"dst_nuid\": \"nAVgSyUe3kqC\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"NB2RhZmrc44D\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"bkeTdDZLhmrr\",\r\n                            \"dst_nuid\": \"nAVgSyUe3kqC\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 1,\r\n                            \"uid\": \"bMb3QTGfpApU\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"bkeTdDZLhmrr\",\r\n                            \"dst_nuid\": \"nAVgSyUe3kqC\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 2,\r\n                            \"uid\": \"CdfWXA8xjgtD\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"nAVgSyUe3kqC\",\r\n                            \"dst_nuid\": \"fhh5QJMSC7rU\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 1,\r\n                            \"uid\": \"hwwpGaQrXkby\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        }\r\n                    ]\r\n                },\r\n                \"dyn_out\": [\r\n                    {\r\n                        \"name\": \"object3d\",\r\n                        \"dt\": 21,\r\n                        \"index\": 0,\r\n                        \"uid\": \"mh0rTKkFm0nD\",\r\n                        \"dynamic\": true,\r\n                        \"type\": 1,\r\n                        \"is_connected\": true\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"plugin\": \"graph\",\r\n                \"x\": 1184,\r\n                \"y\": 428,\r\n                \"uid\": \"8u9pzzySmqs9\",\r\n                \"open\": false,\r\n                \"state\": {\r\n                    \"always_update\": true,\r\n                    \"input_sids\": {\r\n                        \"WUPf4ZdTWrM2\": \"lbU7hDvbnKfg\"\r\n                    },\r\n                    \"output_sids\": {}\r\n                },\r\n                \"title\": \"Render Camera\",\r\n                \"graph\": {\r\n                    \"uid\": \"uq87wSCZFF49\",\r\n                    \"parent_uid\": \"root\",\r\n                    \"open\": true,\r\n                    \"nodes\": [\r\n                        {\r\n                            \"plugin\": \"input_proxy\",\r\n                            \"x\": 576,\r\n                            \"y\": 363,\r\n                            \"uid\": \"WUPf4ZdTWrM2\",\r\n                            \"title\": \"scene\",\r\n                            \"dyn_out\": [\r\n                                {\r\n                                    \"name\": \"input\",\r\n                                    \"dt\": 11,\r\n                                    \"uid\": \"uGHXM4cdeVb3\",\r\n                                    \"dynamic\": true,\r\n                                    \"type\": 1,\r\n                                    \"index\": 0,\r\n                                    \"is_connected\": true,\r\n                                    \"connected\": true\r\n                                }\r\n                            ]\r\n                        },\r\n                        {\r\n                            \"plugin\": \"three_webgl_renderer\",\r\n                            \"x\": 829,\r\n                            \"y\": 234,\r\n                            \"uid\": \"nU8Mjdz8wsuC\",\r\n                            \"state\": {\r\n                                \"always_update\": true\r\n                            }\r\n                        },\r\n                        {\r\n                            \"plugin\": \"graph\",\r\n                            \"x\": 538,\r\n                            \"y\": 163,\r\n                            \"uid\": \"YY6qvEMcKEy7\",\r\n                            \"state\": {\r\n                                \"always_update\": true,\r\n                                \"input_sids\": {},\r\n                                \"output_sids\": {\r\n                                    \"J7kWLNKeQYTF\": \"8GpdZjiiiEQa\"\r\n                                }\r\n                            },\r\n                            \"title\": \"VR camera\",\r\n                            \"graph\": {\r\n                                \"uid\": \"gdmWHJyAUjUs\",\r\n                                \"parent_uid\": \"uq87wSCZFF49\",\r\n                                \"open\": true,\r\n                                \"nodes\": [\r\n                                    {\r\n                                        \"plugin\": \"three_vr_camera\",\r\n                                        \"x\": 966,\r\n                                        \"y\": 211,\r\n                                        \"uid\": \"bHk2s9znyKDj\",\r\n                                        \"open\": false,\r\n                                        \"state\": {\r\n                                            \"position\": {\r\n                                                \"x\": 0,\r\n                                                \"y\": 0.6160169417120982,\r\n                                                \"z\": 0\r\n                                            },\r\n                                            \"quaternion\": {\r\n                                                \"_x\": 0,\r\n                                                \"_y\": 0,\r\n                                                \"_z\": 0,\r\n                                                \"_w\": 1\r\n                                            }\r\n                                        }\r\n                                    },\r\n                                    {\r\n                                        \"plugin\": \"output_proxy\",\r\n                                        \"x\": 1217,\r\n                                        \"y\": 212,\r\n                                        \"uid\": \"J7kWLNKeQYTF\",\r\n                                        \"title\": \"camera\",\r\n                                        \"dyn_in\": [\r\n                                            {\r\n                                                \"name\": \"output\",\r\n                                                \"dt\": 6,\r\n                                                \"def\": null,\r\n                                                \"uid\": \"uyyGR7LQwSEh\",\r\n                                                \"dynamic\": true,\r\n                                                \"type\": 0,\r\n                                                \"index\": 0,\r\n                                                \"is_connected\": true,\r\n                                                \"connected\": true\r\n                                            }\r\n                                        ]\r\n                                    }\r\n                                ],\r\n                                \"conns\": [\r\n                                    {\r\n                                        \"src_nuid\": \"bHk2s9znyKDj\",\r\n                                        \"dst_nuid\": \"J7kWLNKeQYTF\",\r\n                                        \"src_slot\": 0,\r\n                                        \"dst_slot\": 0,\r\n                                        \"uid\": \"MvjmFqTFWUGX\",\r\n                                        \"src_connected\": true,\r\n                                        \"dst_connected\": true,\r\n                                        \"dst_dyn\": true\r\n                                    }\r\n                                ]\r\n                            },\r\n                            \"dyn_out\": [\r\n                                {\r\n                                    \"name\": \"camera\",\r\n                                    \"dt\": 6,\r\n                                    \"index\": 0,\r\n                                    \"uid\": \"8GpdZjiiiEQa\",\r\n                                    \"dynamic\": true,\r\n                                    \"type\": 1,\r\n                                    \"is_connected\": true\r\n                                }\r\n                            ]\r\n                        }\r\n                    ],\r\n                    \"conns\": [\r\n                        {\r\n                            \"src_nuid\": \"YY6qvEMcKEy7\",\r\n                            \"dst_nuid\": \"nU8Mjdz8wsuC\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"Hfu2pJHRkkEU\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true,\r\n                            \"src_dyn\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"WUPf4ZdTWrM2\",\r\n                            \"dst_nuid\": \"nU8Mjdz8wsuC\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 1,\r\n                            \"uid\": \"3acCKxS6BpsP\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true,\r\n                            \"src_dyn\": true\r\n                        }\r\n                    ]\r\n                },\r\n                \"dyn_in\": [\r\n                    {\r\n                        \"name\": \"scene\",\r\n                        \"dt\": 11,\r\n                        \"index\": 0,\r\n                        \"uid\": \"lbU7hDvbnKfg\",\r\n                        \"dynamic\": true,\r\n                        \"type\": 0,\r\n                        \"is_connected\": true\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"plugin\": \"graph\",\r\n                \"x\": 496,\r\n                \"y\": 379,\r\n                \"uid\": \"F89kVwQxhdMg\",\r\n                \"open\": false,\r\n                \"state\": {\r\n                    \"always_update\": true,\r\n                    \"input_sids\": {},\r\n                    \"output_sids\": {\r\n                        \"fkNnJXdrsR4y\": \"547odbJKrTzG\"\r\n                    }\r\n                },\r\n                \"title\": \"Point light 2\",\r\n                \"graph\": {\r\n                    \"uid\": \"KNHNWQ9mjP5f\",\r\n                    \"parent_uid\": \"root\",\r\n                    \"open\": true,\r\n                    \"nodes\": [\r\n                        {\r\n                            \"plugin\": \"output_proxy\",\r\n                            \"x\": 1012,\r\n                            \"y\": 374,\r\n                            \"uid\": \"fkNnJXdrsR4y\",\r\n                            \"title\": \"object3d\",\r\n                            \"dyn_in\": [\r\n                                {\r\n                                    \"name\": \"output\",\r\n                                    \"dt\": 21,\r\n                                    \"def\": null,\r\n                                    \"uid\": \"vSy6Gj4JSPYs\",\r\n                                    \"dynamic\": true,\r\n                                    \"type\": 0,\r\n                                    \"index\": 0,\r\n                                    \"is_connected\": true,\r\n                                    \"connected\": true\r\n                                }\r\n                            ]\r\n                        },\r\n                        {\r\n                            \"plugin\": \"three_point_light\",\r\n                            \"x\": 730,\r\n                            \"y\": 371,\r\n                            \"uid\": \"e9y4kNK9bSSz\",\r\n                            \"open\": false,\r\n                            \"state\": {\r\n                                \"position\": {\r\n                                    \"x\": 2.9928296822160516,\r\n                                    \"y\": 1.034341986571219,\r\n                                    \"z\": 0\r\n                                },\r\n                                \"scale\": {\r\n                                    \"x\": 1,\r\n                                    \"y\": 1,\r\n                                    \"z\": 1\r\n                                },\r\n                                \"quaternion\": {\r\n                                    \"_x\": 0,\r\n                                    \"_y\": 0,\r\n                                    \"_z\": 0,\r\n                                    \"_w\": 1\r\n                                }\r\n                            }\r\n                        },\r\n                        {\r\n                            \"plugin\": \"const_float_generator\",\r\n                            \"x\": 304,\r\n                            \"y\": 295,\r\n                            \"uid\": \"pTrwFwWgsHbB\",\r\n                            \"state\": {\r\n                                \"val\": 1\r\n                            },\r\n                            \"title\": \"Intensity\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"color_picker\",\r\n                            \"x\": 276,\r\n                            \"y\": 449,\r\n                            \"uid\": \"QTgvTPs8aTkm\",\r\n                            \"state\": {\r\n                                \"hue\": 0,\r\n                                \"sat\": 0,\r\n                                \"lum\": 1\r\n                            }\r\n                        }\r\n                    ],\r\n                    \"conns\": [\r\n                        {\r\n                            \"src_nuid\": \"e9y4kNK9bSSz\",\r\n                            \"dst_nuid\": \"fkNnJXdrsR4y\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"hJeuJUBYqKdW\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true,\r\n                            \"dst_dyn\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"pTrwFwWgsHbB\",\r\n                            \"dst_nuid\": \"e9y4kNK9bSSz\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"vpxXUtFHVBwy\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"QTgvTPs8aTkm\",\r\n                            \"dst_nuid\": \"e9y4kNK9bSSz\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 3,\r\n                            \"uid\": \"x8kFnscnRmmm\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        }\r\n                    ]\r\n                },\r\n                \"dyn_out\": [\r\n                    {\r\n                        \"name\": \"object3d\",\r\n                        \"dt\": 21,\r\n                        \"index\": 0,\r\n                        \"uid\": \"547odbJKrTzG\",\r\n                        \"dynamic\": true,\r\n                        \"type\": 1,\r\n                        \"is_connected\": true\r\n                    }\r\n                ]\r\n            }\r\n        ],\r\n        \"conns\": [\r\n            {\r\n                \"src_nuid\": \"HCha6a7ZxQNk\",\r\n                \"dst_nuid\": \"LeLkkRZThkyY\",\r\n                \"src_slot\": 0,\r\n                \"dst_slot\": 0,\r\n                \"uid\": \"jYKWy6AtRTEx\",\r\n                \"src_connected\": true,\r\n                \"dst_connected\": true,\r\n                \"src_dyn\": true\r\n            },\r\n            {\r\n                \"src_nuid\": \"qWtKy9tqj6aU\",\r\n                \"dst_nuid\": \"LeLkkRZThkyY\",\r\n                \"src_slot\": 0,\r\n                \"dst_slot\": 0,\r\n                \"uid\": \"ssrqX44Esvtz\",\r\n                \"src_connected\": true,\r\n                \"dst_connected\": true,\r\n                \"src_dyn\": true,\r\n                \"dst_dyn\": true\r\n            },\r\n            {\r\n                \"src_nuid\": \"LeLkkRZThkyY\",\r\n                \"dst_nuid\": \"8u9pzzySmqs9\",\r\n                \"src_slot\": 0,\r\n                \"dst_slot\": 0,\r\n                \"uid\": \"3QkDhkydNXtp\",\r\n                \"src_connected\": true,\r\n                \"dst_connected\": true,\r\n                \"dst_dyn\": true\r\n            },\r\n            {\r\n                \"src_nuid\": \"B2NQHZKfBYzV\",\r\n                \"dst_nuid\": \"LeLkkRZThkyY\",\r\n                \"src_slot\": 0,\r\n                \"dst_slot\": 4,\r\n                \"uid\": \"DG96RhpxDuGM\",\r\n                \"src_connected\": true,\r\n                \"dst_connected\": true,\r\n                \"src_dyn\": true,\r\n                \"dst_dyn\": true\r\n            },\r\n            {\r\n                \"src_nuid\": \"kSFjjcYBtZtS\",\r\n                \"dst_nuid\": \"LeLkkRZThkyY\",\r\n                \"src_slot\": 0,\r\n                \"dst_slot\": 3,\r\n                \"uid\": \"PmPgQucV7VAt\",\r\n                \"src_connected\": true,\r\n                \"dst_connected\": true,\r\n                \"src_dyn\": true,\r\n                \"dst_dyn\": true\r\n            },\r\n            {\r\n                \"src_nuid\": \"MbhZTaM4pnmJ\",\r\n                \"dst_nuid\": \"LeLkkRZThkyY\",\r\n                \"src_slot\": 0,\r\n                \"dst_slot\": 2,\r\n                \"uid\": \"BFSRhwY8RqFn\",\r\n                \"src_connected\": true,\r\n                \"dst_connected\": true,\r\n                \"src_dyn\": true,\r\n                \"dst_dyn\": true\r\n            },\r\n            {\r\n                \"src_nuid\": \"F89kVwQxhdMg\",\r\n                \"dst_nuid\": \"LeLkkRZThkyY\",\r\n                \"src_slot\": 0,\r\n                \"dst_slot\": 1,\r\n                \"uid\": \"6WAW7CHf97Sx\",\r\n                \"src_connected\": true,\r\n                \"dst_connected\": true,\r\n                \"src_dyn\": true,\r\n                \"dst_dyn\": true\r\n            }\r\n        ]\r\n    }\r\n}"
  },
  {
    "path": "browser/patches/_template-minimal-vr-scene.json",
    "content": "{\r\n    \"abs_t\": 37.174,\r\n    \"active_graph\": \"root\",\r\n    \"graph_uid\": \"TXDgBc0JJtS3\",\r\n    \"root\": {\r\n        \"uid\": \"root\",\r\n        \"parent_uid\": -1,\r\n        \"open\": true,\r\n        \"nodes\": [\r\n            {\r\n                \"plugin\": \"graph\",\r\n                \"x\": 353,\r\n                \"y\": 502,\r\n                \"uid\": \"2KEMeIH7wL7S\",\r\n                \"state\": {\r\n                    \"always_update\": true,\r\n                    \"input_sids\": {},\r\n                    \"output_sids\": {\r\n                        \"XFfBtKfcMuh6\": \"Ys30r7aVEks1\"\r\n                    }\r\n                },\r\n                \"title\": \"3D model\",\r\n                \"graph\": {\r\n                    \"uid\": \"3mI50zrJx2Bq\",\r\n                    \"parent_uid\": \"root\",\r\n                    \"open\": true,\r\n                    \"nodes\": [\r\n                        {\r\n                            \"plugin\": \"three_loader_model\",\r\n                            \"x\": 155,\r\n                            \"y\": 112,\r\n                            \"uid\": \"mUlYt365qrRS\",\r\n                            \"state\": {\r\n                                \"url\": \"/data/scene/flamingo/flamingo.js\"\r\n                            }\r\n                        },\r\n                        {\r\n                            \"plugin\": \"three_mesh\",\r\n                            \"x\": 886,\r\n                            \"y\": 217,\r\n                            \"uid\": \"N8xLOvJsutOD\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"output_proxy\",\r\n                            \"x\": 1104,\r\n                            \"y\": 160,\r\n                            \"uid\": \"XFfBtKfcMuh6\",\r\n                            \"title\": \"object3d\",\r\n                            \"dyn_in\": [\r\n                                {\r\n                                    \"name\": \"output\",\r\n                                    \"dt\": 21,\r\n                                    \"def\": null,\r\n                                    \"uid\": \"UW8xhKSPhTFp\",\r\n                                    \"dynamic\": true,\r\n                                    \"type\": 0,\r\n                                    \"index\": 0,\r\n                                    \"is_connected\": true,\r\n                                    \"connected\": true\r\n                                }\r\n                            ]\r\n                        },\r\n                        {\r\n                            \"plugin\": \"graph\",\r\n                            \"x\": 144,\r\n                            \"y\": 312,\r\n                            \"uid\": \"oc5YGXTa2w1n\",\r\n                            \"state\": {\r\n                                \"always_update\": true,\r\n                                \"input_sids\": {},\r\n                                \"output_sids\": {\r\n                                    \"6nIheFD7R8w3\": \"xnmIRUOwsegz\",\r\n                                    \"Jk1nTcdt9rzv\": \"ejxO7eIJpw4m\",\r\n                                    \"3aklgN3mA1p4\": \"H3AwGhvcvewD\"\r\n                                }\r\n                            },\r\n                            \"title\": \"Position, Rotation, Scale\",\r\n                            \"graph\": {\r\n                                \"uid\": \"9RKAHE4i2ldC\",\r\n                                \"parent_uid\": \"3mI50zrJx2Bq\",\r\n                                \"open\": true,\r\n                                \"nodes\": [\r\n                                    {\r\n                                        \"plugin\": \"slider_float_generator\",\r\n                                        \"x\": 82,\r\n                                        \"y\": 105,\r\n                                        \"uid\": \"nke9JEXzMAEz\",\r\n                                        \"state\": {\r\n                                            \"val\": 0,\r\n                                            \"min\": -1,\r\n                                            \"max\": 1\r\n                                        },\r\n                                        \"title\": \"Position X\"\r\n                                    },\r\n                                    {\r\n                                        \"plugin\": \"slider_float_generator\",\r\n                                        \"x\": 83,\r\n                                        \"y\": 172,\r\n                                        \"uid\": \"goB5PYf2hiVF\",\r\n                                        \"state\": {\r\n                                            \"val\": 0,\r\n                                            \"min\": -1,\r\n                                            \"max\": 1\r\n                                        },\r\n                                        \"title\": \"Position Y\"\r\n                                    },\r\n                                    {\r\n                                        \"plugin\": \"slider_float_generator\",\r\n                                        \"x\": 81,\r\n                                        \"y\": 238,\r\n                                        \"uid\": \"JPEAxPKL1qgp\",\r\n                                        \"state\": {\r\n                                            \"val\": 0,\r\n                                            \"min\": -1,\r\n                                            \"max\": 1\r\n                                        },\r\n                                        \"title\": \"Position Z\"\r\n                                    },\r\n                                    {\r\n                                        \"plugin\": \"vector\",\r\n                                        \"x\": 585,\r\n                                        \"y\": 200,\r\n                                        \"uid\": \"3dyLkxgVOEA0\",\r\n                                        \"open\": false,\r\n                                        \"title\": \"Position\"\r\n                                    },\r\n                                    {\r\n                                        \"plugin\": \"vector\",\r\n                                        \"x\": 290,\r\n                                        \"y\": 610,\r\n                                        \"uid\": \"HeclFuuUNCpM\",\r\n                                        \"title\": \"Scale\"\r\n                                    },\r\n                                    {\r\n                                        \"plugin\": \"vector\",\r\n                                        \"x\": 581,\r\n                                        \"y\": 413,\r\n                                        \"uid\": \"7HOHqXOxSBXS\",\r\n                                        \"open\": false,\r\n                                        \"title\": \"Rotation\"\r\n                                    },\r\n                                    {\r\n                                        \"plugin\": \"const_float_generator\",\r\n                                        \"x\": 113,\r\n                                        \"y\": 636,\r\n                                        \"uid\": \"0wxe1yAh8gVS\",\r\n                                        \"state\": {\r\n                                            \"val\": 0.01\r\n                                        },\r\n                                        \"title\": \"Scale XYZ\"\r\n                                    },\r\n                                    {\r\n                                        \"plugin\": \"output_proxy\",\r\n                                        \"x\": 803,\r\n                                        \"y\": 252,\r\n                                        \"uid\": \"6nIheFD7R8w3\",\r\n                                        \"title\": \"position\",\r\n                                        \"dyn_in\": [\r\n                                            {\r\n                                                \"name\": \"output\",\r\n                                                \"dt\": 5,\r\n                                                \"def\": null,\r\n                                                \"uid\": \"S0aurqIbmI1x\",\r\n                                                \"dynamic\": true,\r\n                                                \"type\": 0,\r\n                                                \"index\": 0,\r\n                                                \"is_connected\": true,\r\n                                                \"connected\": true\r\n                                            }\r\n                                        ]\r\n                                    },\r\n                                    {\r\n                                        \"plugin\": \"output_proxy\",\r\n                                        \"x\": 818,\r\n                                        \"y\": 400,\r\n                                        \"uid\": \"Jk1nTcdt9rzv\",\r\n                                        \"title\": \"rotation\",\r\n                                        \"dyn_in\": [\r\n                                            {\r\n                                                \"name\": \"output\",\r\n                                                \"dt\": 5,\r\n                                                \"def\": null,\r\n                                                \"uid\": \"ueZzDAy1hfyc\",\r\n                                                \"dynamic\": true,\r\n                                                \"type\": 0,\r\n                                                \"index\": 0,\r\n                                                \"is_connected\": true,\r\n                                                \"connected\": true\r\n                                            }\r\n                                        ]\r\n                                    },\r\n                                    {\r\n                                        \"plugin\": \"output_proxy\",\r\n                                        \"x\": 825,\r\n                                        \"y\": 549,\r\n                                        \"uid\": \"3aklgN3mA1p4\",\r\n                                        \"title\": \"scale\",\r\n                                        \"dyn_in\": [\r\n                                            {\r\n                                                \"name\": \"output\",\r\n                                                \"dt\": 5,\r\n                                                \"def\": null,\r\n                                                \"uid\": \"TTvvZvj40kZI\",\r\n                                                \"dynamic\": true,\r\n                                                \"type\": 0,\r\n                                                \"index\": 0,\r\n                                                \"is_connected\": true,\r\n                                                \"connected\": true\r\n                                            }\r\n                                        ]\r\n                                    },\r\n                                    {\r\n                                        \"plugin\": \"slider_float_generator\",\r\n                                        \"x\": 85,\r\n                                        \"y\": 369,\r\n                                        \"uid\": \"cTA1t9cI3UtW\",\r\n                                        \"state\": {\r\n                                            \"val\": 0,\r\n                                            \"min\": 0,\r\n                                            \"max\": 5\r\n                                        },\r\n                                        \"title\": \"Rotate X\"\r\n                                    },\r\n                                    {\r\n                                        \"plugin\": \"slider_float_generator\",\r\n                                        \"x\": 82,\r\n                                        \"y\": 436,\r\n                                        \"uid\": \"UgA0cOmgpKCv\",\r\n                                        \"state\": {\r\n                                            \"val\": 0,\r\n                                            \"min\": 0,\r\n                                            \"max\": 5\r\n                                        },\r\n                                        \"title\": \"Rotate Y\"\r\n                                    },\r\n                                    {\r\n                                        \"plugin\": \"slider_float_generator\",\r\n                                        \"x\": 80,\r\n                                        \"y\": 502,\r\n                                        \"uid\": \"3v7YhYTzSJmV\",\r\n                                        \"state\": {\r\n                                            \"val\": 0,\r\n                                            \"min\": 0,\r\n                                            \"max\": 5\r\n                                        },\r\n                                        \"title\": \"Rotate Z\"\r\n                                    }\r\n                                ],\r\n                                \"conns\": [\r\n                                    {\r\n                                        \"src_nuid\": \"nke9JEXzMAEz\",\r\n                                        \"dst_nuid\": \"3dyLkxgVOEA0\",\r\n                                        \"src_slot\": 0,\r\n                                        \"dst_slot\": 0,\r\n                                        \"uid\": \"JJp0zisZUlk9\",\r\n                                        \"src_connected\": true,\r\n                                        \"dst_connected\": true\r\n                                    },\r\n                                    {\r\n                                        \"src_nuid\": \"goB5PYf2hiVF\",\r\n                                        \"dst_nuid\": \"3dyLkxgVOEA0\",\r\n                                        \"src_slot\": 0,\r\n                                        \"dst_slot\": 1,\r\n                                        \"uid\": \"pJBNgSfhz1CZ\",\r\n                                        \"src_connected\": true,\r\n                                        \"dst_connected\": true\r\n                                    },\r\n                                    {\r\n                                        \"src_nuid\": \"JPEAxPKL1qgp\",\r\n                                        \"dst_nuid\": \"3dyLkxgVOEA0\",\r\n                                        \"src_slot\": 0,\r\n                                        \"dst_slot\": 2,\r\n                                        \"uid\": \"KKn9rh1MTNAk\",\r\n                                        \"src_connected\": true,\r\n                                        \"dst_connected\": true\r\n                                    },\r\n                                    {\r\n                                        \"src_nuid\": \"0wxe1yAh8gVS\",\r\n                                        \"dst_nuid\": \"HeclFuuUNCpM\",\r\n                                        \"src_slot\": 0,\r\n                                        \"dst_slot\": 0,\r\n                                        \"uid\": \"VV55ktVZYS55\",\r\n                                        \"src_connected\": true,\r\n                                        \"dst_connected\": true\r\n                                    },\r\n                                    {\r\n                                        \"src_nuid\": \"0wxe1yAh8gVS\",\r\n                                        \"dst_nuid\": \"HeclFuuUNCpM\",\r\n                                        \"src_slot\": 0,\r\n                                        \"dst_slot\": 1,\r\n                                        \"uid\": \"mqmXzAgE1Tqr\",\r\n                                        \"src_connected\": true,\r\n                                        \"dst_connected\": true,\r\n                                        \"offset\": 1\r\n                                    },\r\n                                    {\r\n                                        \"src_nuid\": \"0wxe1yAh8gVS\",\r\n                                        \"dst_nuid\": \"HeclFuuUNCpM\",\r\n                                        \"src_slot\": 0,\r\n                                        \"dst_slot\": 2,\r\n                                        \"uid\": \"3X6juXECSVfC\",\r\n                                        \"src_connected\": true,\r\n                                        \"dst_connected\": true\r\n                                    },\r\n                                    {\r\n                                        \"src_nuid\": \"3dyLkxgVOEA0\",\r\n                                        \"dst_nuid\": \"6nIheFD7R8w3\",\r\n                                        \"src_slot\": 0,\r\n                                        \"dst_slot\": 0,\r\n                                        \"uid\": \"EyxhqxbsjI53\",\r\n                                        \"src_connected\": true,\r\n                                        \"dst_connected\": true,\r\n                                        \"dst_dyn\": true\r\n                                    },\r\n                                    {\r\n                                        \"src_nuid\": \"7HOHqXOxSBXS\",\r\n                                        \"dst_nuid\": \"Jk1nTcdt9rzv\",\r\n                                        \"src_slot\": 0,\r\n                                        \"dst_slot\": 0,\r\n                                        \"uid\": \"N0DDMtlOzjgT\",\r\n                                        \"src_connected\": true,\r\n                                        \"dst_connected\": true,\r\n                                        \"dst_dyn\": true\r\n                                    },\r\n                                    {\r\n                                        \"src_nuid\": \"HeclFuuUNCpM\",\r\n                                        \"dst_nuid\": \"3aklgN3mA1p4\",\r\n                                        \"src_slot\": 0,\r\n                                        \"dst_slot\": 0,\r\n                                        \"uid\": \"71wtCAFolmmd\",\r\n                                        \"src_connected\": true,\r\n                                        \"dst_connected\": true,\r\n                                        \"dst_dyn\": true\r\n                                    },\r\n                                    {\r\n                                        \"src_nuid\": \"cTA1t9cI3UtW\",\r\n                                        \"dst_nuid\": \"7HOHqXOxSBXS\",\r\n                                        \"src_slot\": 0,\r\n                                        \"dst_slot\": 0,\r\n                                        \"uid\": \"T6MBWFFnrmtU\",\r\n                                        \"src_connected\": true,\r\n                                        \"dst_connected\": true\r\n                                    },\r\n                                    {\r\n                                        \"src_nuid\": \"UgA0cOmgpKCv\",\r\n                                        \"dst_nuid\": \"7HOHqXOxSBXS\",\r\n                                        \"src_slot\": 0,\r\n                                        \"dst_slot\": 1,\r\n                                        \"uid\": \"WUe9EkftoiIS\",\r\n                                        \"src_connected\": true,\r\n                                        \"dst_connected\": true\r\n                                    },\r\n                                    {\r\n                                        \"src_nuid\": \"3v7YhYTzSJmV\",\r\n                                        \"dst_nuid\": \"7HOHqXOxSBXS\",\r\n                                        \"src_slot\": 0,\r\n                                        \"dst_slot\": 2,\r\n                                        \"uid\": \"TLuTsPIXEg6c\",\r\n                                        \"src_connected\": true,\r\n                                        \"dst_connected\": true\r\n                                    }\r\n                                ]\r\n                            },\r\n                            \"dyn_out\": [\r\n                                {\r\n                                    \"name\": \"scale\",\r\n                                    \"dt\": 5,\r\n                                    \"index\": 0,\r\n                                    \"uid\": \"H3AwGhvcvewD\",\r\n                                    \"dynamic\": true,\r\n                                    \"type\": 1,\r\n                                    \"is_connected\": true\r\n                                },\r\n                                {\r\n                                    \"name\": \"rotation\",\r\n                                    \"dt\": 5,\r\n                                    \"index\": 1,\r\n                                    \"uid\": \"ejxO7eIJpw4m\",\r\n                                    \"dynamic\": true,\r\n                                    \"type\": 1,\r\n                                    \"is_connected\": true\r\n                                },\r\n                                {\r\n                                    \"name\": \"position\",\r\n                                    \"dt\": 5,\r\n                                    \"index\": 2,\r\n                                    \"uid\": \"xnmIRUOwsegz\",\r\n                                    \"dynamic\": true,\r\n                                    \"type\": 1,\r\n                                    \"is_connected\": true\r\n                                }\r\n                            ]\r\n                        },\r\n                        {\r\n                            \"plugin\": \"three_material_modifier\",\r\n                            \"x\": 628,\r\n                            \"y\": 282,\r\n                            \"uid\": \"GR0iB5InqApN\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"three_material_phong\",\r\n                            \"x\": 396,\r\n                            \"y\": 474,\r\n                            \"uid\": \"ZtD04w7VDW7z\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"url_texture_generator\",\r\n                            \"x\": 172,\r\n                            \"y\": 526,\r\n                            \"uid\": \"gAKle1F1YXyg\",\r\n                            \"state\": {\r\n                                \"url\": \"/data/image/b09b6c37eebe3b22dc21a9c5884be3cc4a1cda74.png\"\r\n                            }\r\n                        },\r\n                        {\r\n                            \"plugin\": \"annotation\",\r\n                            \"x\": 83,\r\n                            \"y\": 417,\r\n                            \"uid\": \"WkdcQ0klFS1R\",\r\n                            \"state\": {\r\n                                \"text\": \"To connect/modify a material, add a slot to the material modifier and connect the Phong material ...\",\r\n                                \"width\": 265,\r\n                                \"height\": 56\r\n                            }\r\n                        }\r\n                    ],\r\n                    \"conns\": [\r\n                        {\r\n                            \"src_nuid\": \"mUlYt365qrRS\",\r\n                            \"dst_nuid\": \"N8xLOvJsutOD\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 1,\r\n                            \"uid\": \"RuDFZhGAG4zB\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"N8xLOvJsutOD\",\r\n                            \"dst_nuid\": \"XFfBtKfcMuh6\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"DEcApD6DX1pb\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true,\r\n                            \"dst_dyn\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"oc5YGXTa2w1n\",\r\n                            \"dst_nuid\": \"N8xLOvJsutOD\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 5,\r\n                            \"uid\": \"EiwEpJTBRjpv\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true,\r\n                            \"src_dyn\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"oc5YGXTa2w1n\",\r\n                            \"dst_nuid\": \"N8xLOvJsutOD\",\r\n                            \"src_slot\": 1,\r\n                            \"dst_slot\": 4,\r\n                            \"uid\": \"dWNso3Ay1eQK\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true,\r\n                            \"src_dyn\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"oc5YGXTa2w1n\",\r\n                            \"dst_nuid\": \"N8xLOvJsutOD\",\r\n                            \"src_slot\": 2,\r\n                            \"dst_slot\": 3,\r\n                            \"uid\": \"oFUKyXyPibtR\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true,\r\n                            \"src_dyn\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"GR0iB5InqApN\",\r\n                            \"dst_nuid\": \"N8xLOvJsutOD\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 2,\r\n                            \"uid\": \"q5zxR18sj0IR\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"mUlYt365qrRS\",\r\n                            \"dst_nuid\": \"GR0iB5InqApN\",\r\n                            \"src_slot\": 1,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"JHLlUfnTRqQL\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"gAKle1F1YXyg\",\r\n                            \"dst_nuid\": \"ZtD04w7VDW7z\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"KNk1nttftNe8\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        }\r\n                    ]\r\n                },\r\n                \"dyn_out\": [\r\n                    {\r\n                        \"name\": \"object3d\",\r\n                        \"dt\": 21,\r\n                        \"index\": 0,\r\n                        \"uid\": \"Ys30r7aVEks1\",\r\n                        \"dynamic\": true,\r\n                        \"type\": 1,\r\n                        \"is_connected\": true\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"plugin\": \"three_webgl_renderer\",\r\n                \"x\": 814,\r\n                \"y\": 292,\r\n                \"uid\": \"l0ZekSTVYf3u\",\r\n                \"state\": {\r\n                    \"always_update\": true\r\n                }\r\n            },\r\n            {\r\n                \"plugin\": \"graph\",\r\n                \"x\": 559,\r\n                \"y\": 246,\r\n                \"uid\": \"M5k6GnIXQPkj\",\r\n                \"state\": {\r\n                    \"always_update\": true,\r\n                    \"input_sids\": {},\r\n                    \"output_sids\": {\r\n                        \"qyIujWaTV1Jn\": \"8GpdZjiiiEQa\"\r\n                    }\r\n                },\r\n                \"title\": \"VR camera\",\r\n                \"graph\": {\r\n                    \"uid\": \"l45Db7k1UhZo\",\r\n                    \"parent_uid\": \"root\",\r\n                    \"open\": true,\r\n                    \"nodes\": [\r\n                        {\r\n                            \"plugin\": \"three_vr_camera\",\r\n                            \"x\": 899,\r\n                            \"y\": 233,\r\n                            \"uid\": \"sCXs9Zom40ut\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"output_proxy\",\r\n                            \"x\": 1077,\r\n                            \"y\": 294,\r\n                            \"uid\": \"qyIujWaTV1Jn\",\r\n                            \"title\": \"camera\",\r\n                            \"dyn_in\": [\r\n                                {\r\n                                    \"name\": \"output\",\r\n                                    \"dt\": 6,\r\n                                    \"def\": null,\r\n                                    \"uid\": \"uyyGR7LQwSEh\",\r\n                                    \"dynamic\": true,\r\n                                    \"type\": 0,\r\n                                    \"index\": 0,\r\n                                    \"is_connected\": true,\r\n                                    \"connected\": true\r\n                                }\r\n                            ]\r\n                        },\r\n                        {\r\n                            \"plugin\": \"slider_float_generator\",\r\n                            \"x\": 413,\r\n                            \"y\": 221,\r\n                            \"uid\": \"P9CfgnQWbISC\",\r\n                            \"state\": {\r\n                                \"val\": 0,\r\n                                \"min\": -1,\r\n                                \"max\": 1\r\n                            },\r\n                            \"title\": \"Position X\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"slider_float_generator\",\r\n                            \"x\": 413,\r\n                            \"y\": 286,\r\n                            \"uid\": \"GupqtShRccSc\",\r\n                            \"state\": {\r\n                                \"val\": 0,\r\n                                \"min\": -1,\r\n                                \"max\": 1\r\n                            },\r\n                            \"title\": \"Position Y\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"slider_float_generator\",\r\n                            \"x\": 413,\r\n                            \"y\": 352,\r\n                            \"uid\": \"eORCAGcqzn2C\",\r\n                            \"state\": {\r\n                                \"val\": 2,\r\n                                \"min\": -2,\r\n                                \"max\": 2\r\n                            },\r\n                            \"title\": \"Position Z\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"vector\",\r\n                            \"x\": 736,\r\n                            \"y\": 283,\r\n                            \"uid\": \"XRgFpMMHFSTT\",\r\n                            \"open\": false,\r\n                            \"title\": \"Camera position\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"const_float_generator\",\r\n                            \"x\": 772,\r\n                            \"y\": 183,\r\n                            \"uid\": \"C7qh8h2ZMZJj\",\r\n                            \"state\": {\r\n                                \"val\": 90\r\n                            },\r\n                            \"title\": \"FOV\"\r\n                        }\r\n                    ],\r\n                    \"conns\": [\r\n                        {\r\n                            \"src_nuid\": \"sCXs9Zom40ut\",\r\n                            \"dst_nuid\": \"qyIujWaTV1Jn\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"2BOyTQlfR6oy\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true,\r\n                            \"dst_dyn\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"P9CfgnQWbISC\",\r\n                            \"dst_nuid\": \"XRgFpMMHFSTT\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"xeUZPAuKZ5ts\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"GupqtShRccSc\",\r\n                            \"dst_nuid\": \"XRgFpMMHFSTT\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 1,\r\n                            \"uid\": \"lcCiSrHyrtak\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"eORCAGcqzn2C\",\r\n                            \"dst_nuid\": \"XRgFpMMHFSTT\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 2,\r\n                            \"uid\": \"IAmJtTgbQObi\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"XRgFpMMHFSTT\",\r\n                            \"dst_nuid\": \"sCXs9Zom40ut\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"6KCQzWITix5b\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"C7qh8h2ZMZJj\",\r\n                            \"dst_nuid\": \"sCXs9Zom40ut\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 1,\r\n                            \"uid\": \"azX9RnR6Qp0V\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        }\r\n                    ]\r\n                },\r\n                \"dyn_out\": [\r\n                    {\r\n                        \"name\": \"camera\",\r\n                        \"dt\": 6,\r\n                        \"index\": 0,\r\n                        \"uid\": \"8GpdZjiiiEQa\",\r\n                        \"dynamic\": true,\r\n                        \"type\": 1,\r\n                        \"is_connected\": true\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"plugin\": \"three_scene\",\r\n                \"x\": 604,\r\n                \"y\": 447,\r\n                \"uid\": \"lj4cRZgtC5iX\",\r\n                \"dyn_in\": [\r\n                    {\r\n                        \"type\": 0,\r\n                        \"name\": \"0\",\r\n                        \"dt\": 21,\r\n                        \"array\": true,\r\n                        \"uid\": \"DDzcOXqI6iRM\",\r\n                        \"dynamic\": true,\r\n                        \"index\": 0,\r\n                        \"is_connected\": true\r\n                    },\r\n                    {\r\n                        \"type\": 0,\r\n                        \"name\": \"1\",\r\n                        \"dt\": 21,\r\n                        \"array\": true,\r\n                        \"uid\": \"gH5pmBKZK4lm\",\r\n                        \"dynamic\": true,\r\n                        \"index\": 1,\r\n                        \"is_connected\": true\r\n                    },\r\n                    {\r\n                        \"type\": 0,\r\n                        \"name\": \"2\",\r\n                        \"dt\": 21,\r\n                        \"array\": true,\r\n                        \"uid\": \"ExPIjji5rvFO\",\r\n                        \"dynamic\": true,\r\n                        \"index\": 2,\r\n                        \"is_connected\": false\r\n                    },\r\n                    {\r\n                        \"type\": 0,\r\n                        \"name\": \"3\",\r\n                        \"dt\": 21,\r\n                        \"array\": true,\r\n                        \"uid\": \"hddJID3FkB4R\",\r\n                        \"dynamic\": true,\r\n                        \"index\": 3,\r\n                        \"is_connected\": false\r\n                    },\r\n                    {\r\n                        \"type\": 0,\r\n                        \"name\": \"4\",\r\n                        \"dt\": 21,\r\n                        \"array\": true,\r\n                        \"uid\": \"fb1ifySJ5kUl\",\r\n                        \"dynamic\": true,\r\n                        \"index\": 4,\r\n                        \"is_connected\": false\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"plugin\": \"graph\",\r\n                \"x\": 331,\r\n                \"y\": 360,\r\n                \"uid\": \"oLb4Asq8ZBZ3\",\r\n                \"state\": {\r\n                    \"always_update\": true,\r\n                    \"input_sids\": {},\r\n                    \"output_sids\": {\r\n                        \"UR0zbYEtfEm0\": \"tjoeHNDBhUcN\"\r\n                    }\r\n                },\r\n                \"title\": \"Environment settings\",\r\n                \"graph\": {\r\n                    \"uid\": \"yuuHkhVvMlmM\",\r\n                    \"parent_uid\": \"root\",\r\n                    \"open\": true,\r\n                    \"nodes\": [\r\n                        {\r\n                            \"plugin\": \"three_environment_settings\",\r\n                            \"x\": 572,\r\n                            \"y\": 469,\r\n                            \"uid\": \"yK65ivXwpvwt\",\r\n                            \"title\": \"Environment settings\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"output_proxy\",\r\n                            \"x\": 980,\r\n                            \"y\": 512,\r\n                            \"uid\": \"UR0zbYEtfEm0\",\r\n                            \"title\": \"environment\",\r\n                            \"dyn_in\": [\r\n                                {\r\n                                    \"name\": \"output\",\r\n                                    \"dt\": 23,\r\n                                    \"def\": null,\r\n                                    \"uid\": \"Yy89wKzOcZo4\",\r\n                                    \"dynamic\": true,\r\n                                    \"type\": 0,\r\n                                    \"index\": 0,\r\n                                    \"is_connected\": true,\r\n                                    \"connected\": true\r\n                                }\r\n                            ]\r\n                        },\r\n                        {\r\n                            \"plugin\": \"color_picker\",\r\n                            \"x\": 216,\r\n                            \"y\": 254,\r\n                            \"uid\": \"QwATbg0pSF1b\",\r\n                            \"state\": {\r\n                                \"hue\": 0,\r\n                                \"sat\": 0,\r\n                                \"lum\": 1\r\n                            }\r\n                        },\r\n                        {\r\n                            \"plugin\": \"slider_float_generator\",\r\n                            \"x\": 140,\r\n                            \"y\": 502,\r\n                            \"uid\": \"ahmguxLjjItm\",\r\n                            \"state\": {\r\n                                \"val\": 0,\r\n                                \"min\": 0.1,\r\n                                \"max\": 1\r\n                            },\r\n                            \"title\": \"Fog near\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"slider_float_generator\",\r\n                            \"x\": 139,\r\n                            \"y\": 585,\r\n                            \"uid\": \"yYN1Hp15rzf5\",\r\n                            \"state\": {\r\n                                \"val\": 1004,\r\n                                \"min\": 500,\r\n                                \"max\": 1500\r\n                            },\r\n                            \"title\": \"Fog far\"\r\n                        }\r\n                    ],\r\n                    \"conns\": [\r\n                        {\r\n                            \"src_nuid\": \"yK65ivXwpvwt\",\r\n                            \"dst_nuid\": \"UR0zbYEtfEm0\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"212QSETB7ClB\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true,\r\n                            \"dst_dyn\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"QwATbg0pSF1b\",\r\n                            \"dst_nuid\": \"yK65ivXwpvwt\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"6ZLfj5rfQw1z\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"ahmguxLjjItm\",\r\n                            \"dst_nuid\": \"yK65ivXwpvwt\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 1,\r\n                            \"uid\": \"Ftx9xnIFRYgd\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"yYN1Hp15rzf5\",\r\n                            \"dst_nuid\": \"yK65ivXwpvwt\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 2,\r\n                            \"uid\": \"vIpJgDA6FDr5\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        }\r\n                    ]\r\n                },\r\n                \"dyn_out\": [\r\n                    {\r\n                        \"name\": \"environment\",\r\n                        \"dt\": 23,\r\n                        \"index\": 0,\r\n                        \"uid\": \"tjoeHNDBhUcN\",\r\n                        \"dynamic\": true,\r\n                        \"type\": 1,\r\n                        \"is_connected\": true\r\n                    }\r\n                ]\r\n            },\r\n            {\r\n                \"plugin\": \"graph\",\r\n                \"x\": 348,\r\n                \"y\": 438,\r\n                \"uid\": \"vINJ9n1TrLJQ\",\r\n                \"state\": {\r\n                    \"always_update\": true,\r\n                    \"input_sids\": {},\r\n                    \"output_sids\": {\r\n                        \"BJvc4ZcZYRNO\": \"547odbJKrTzG\"\r\n                    }\r\n                },\r\n                \"title\": \"Point light\",\r\n                \"graph\": {\r\n                    \"uid\": \"WztzoAJf48Dd\",\r\n                    \"parent_uid\": \"root\",\r\n                    \"open\": true,\r\n                    \"nodes\": [\r\n                        {\r\n                            \"plugin\": \"output_proxy\",\r\n                            \"x\": 1110,\r\n                            \"y\": 223,\r\n                            \"uid\": \"BJvc4ZcZYRNO\",\r\n                            \"title\": \"object3d\",\r\n                            \"dyn_in\": [\r\n                                {\r\n                                    \"name\": \"output\",\r\n                                    \"dt\": 21,\r\n                                    \"def\": null,\r\n                                    \"uid\": \"vSy6Gj4JSPYs\",\r\n                                    \"dynamic\": true,\r\n                                    \"type\": 0,\r\n                                    \"index\": 0,\r\n                                    \"is_connected\": true,\r\n                                    \"connected\": true\r\n                                }\r\n                            ]\r\n                        },\r\n                        {\r\n                            \"plugin\": \"slider_float_generator\",\r\n                            \"x\": 306,\r\n                            \"y\": 399,\r\n                            \"uid\": \"y0lVdyh7fReM\",\r\n                            \"state\": {\r\n                                \"val\": 1,\r\n                                \"min\": -1,\r\n                                \"max\": 1\r\n                            },\r\n                            \"title\": \"X\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"slider_float_generator\",\r\n                            \"x\": 306,\r\n                            \"y\": 465,\r\n                            \"uid\": \"I03CEQnmVnQa\",\r\n                            \"state\": {\r\n                                \"val\": 0.06,\r\n                                \"min\": -1,\r\n                                \"max\": 1\r\n                            },\r\n                            \"title\": \"Y\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"slider_float_generator\",\r\n                            \"x\": 301,\r\n                            \"y\": 532,\r\n                            \"uid\": \"bM41cvDFejPE\",\r\n                            \"state\": {\r\n                                \"val\": 2,\r\n                                \"min\": -1,\r\n                                \"max\": 2\r\n                            },\r\n                            \"title\": \"Z\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"vector\",\r\n                            \"x\": 645,\r\n                            \"y\": 384,\r\n                            \"uid\": \"UHng5nxFHo1u\",\r\n                            \"title\": \"Position\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"three_point_light\",\r\n                            \"x\": 867,\r\n                            \"y\": 322,\r\n                            \"uid\": \"fwoI1ziOGxyU\"\r\n                        },\r\n                        {\r\n                            \"plugin\": \"const_float_generator\",\r\n                            \"x\": 304,\r\n                            \"y\": 295,\r\n                            \"uid\": \"Ay0KZWlFZ8Ui\",\r\n                            \"state\": {\r\n                                \"val\": 1\r\n                            },\r\n                            \"title\": \"Intensity\"\r\n                        }\r\n                    ],\r\n                    \"conns\": [\r\n                        {\r\n                            \"src_nuid\": \"y0lVdyh7fReM\",\r\n                            \"dst_nuid\": \"UHng5nxFHo1u\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"8jXpJhKweMrf\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"I03CEQnmVnQa\",\r\n                            \"dst_nuid\": \"UHng5nxFHo1u\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 1,\r\n                            \"uid\": \"IiyoZP5LT49g\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"bM41cvDFejPE\",\r\n                            \"dst_nuid\": \"UHng5nxFHo1u\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 2,\r\n                            \"uid\": \"cDFnUGdc3gGJ\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"fwoI1ziOGxyU\",\r\n                            \"dst_nuid\": \"BJvc4ZcZYRNO\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"qWuUGLNOQfPp\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true,\r\n                            \"dst_dyn\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"UHng5nxFHo1u\",\r\n                            \"dst_nuid\": \"fwoI1ziOGxyU\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 3,\r\n                            \"uid\": \"0Xxreuya5o4S\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        },\r\n                        {\r\n                            \"src_nuid\": \"Ay0KZWlFZ8Ui\",\r\n                            \"dst_nuid\": \"fwoI1ziOGxyU\",\r\n                            \"src_slot\": 0,\r\n                            \"dst_slot\": 0,\r\n                            \"uid\": \"wS6UEMqueUIZ\",\r\n                            \"src_connected\": true,\r\n                            \"dst_connected\": true\r\n                        }\r\n                    ]\r\n                },\r\n                \"dyn_out\": [\r\n                    {\r\n                        \"name\": \"object3d\",\r\n                        \"dt\": 21,\r\n                        \"index\": 0,\r\n                        \"uid\": \"547odbJKrTzG\",\r\n                        \"dynamic\": true,\r\n                        \"type\": 1,\r\n                        \"is_connected\": true\r\n                    }\r\n                ]\r\n            }\r\n        ],\r\n        \"conns\": [\r\n            {\r\n                \"src_nuid\": \"M5k6GnIXQPkj\",\r\n                \"dst_nuid\": \"l0ZekSTVYf3u\",\r\n                \"src_slot\": 0,\r\n                \"dst_slot\": 0,\r\n                \"uid\": \"QJjyVtgpu0WU\",\r\n                \"src_connected\": true,\r\n                \"dst_connected\": true,\r\n                \"src_dyn\": true\r\n            },\r\n            {\r\n                \"src_nuid\": \"lj4cRZgtC5iX\",\r\n                \"dst_nuid\": \"l0ZekSTVYf3u\",\r\n                \"src_slot\": 0,\r\n                \"dst_slot\": 1,\r\n                \"uid\": \"lOQolDaRixyL\",\r\n                \"src_connected\": true,\r\n                \"dst_connected\": true\r\n            },\r\n            {\r\n                \"src_nuid\": \"oLb4Asq8ZBZ3\",\r\n                \"dst_nuid\": \"lj4cRZgtC5iX\",\r\n                \"src_slot\": 0,\r\n                \"dst_slot\": 0,\r\n                \"uid\": \"JkwJ6Unjd8qA\",\r\n                \"src_connected\": true,\r\n                \"dst_connected\": true,\r\n                \"src_dyn\": true\r\n            },\r\n            {\r\n                \"src_nuid\": \"vINJ9n1TrLJQ\",\r\n                \"dst_nuid\": \"lj4cRZgtC5iX\",\r\n                \"src_slot\": 0,\r\n                \"dst_slot\": 0,\r\n                \"uid\": \"sfkZb0dJp6Xg\",\r\n                \"src_connected\": true,\r\n                \"dst_connected\": true,\r\n                \"src_dyn\": true,\r\n                \"dst_dyn\": true\r\n            },\r\n            {\r\n                \"src_nuid\": \"2KEMeIH7wL7S\",\r\n                \"dst_nuid\": \"lj4cRZgtC5iX\",\r\n                \"src_slot\": 0,\r\n                \"dst_slot\": 1,\r\n                \"uid\": \"I5trUSGmGSHr\",\r\n                \"src_connected\": true,\r\n                \"dst_connected\": true,\r\n                \"src_dyn\": true,\r\n                \"dst_dyn\": true\r\n            }\r\n        ]\r\n    }\r\n}"
  },
  {
    "path": "browser/patches/_util-display-number.json",
    "content": "{\"abs_t\":65.728,\"active_graph\":\"root\",\"graph_uid\":\"jG8ul210Feym\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"nodes\":[{\"plugin\":\"graph\",\"x\":214,\"y\":275,\"uid\":\"FZxEaDwz8FIi\",\"state\":{\"always_update\":true,\"input_sids\":{\"oYe5etxYFvEp\":\"3avLd2vAV3XK\"},\"output_sids\":{\"aQsMSK6VwQ9H\":\"mh0rTKkFm0nD\"}},\"title\":\"Number\",\"graph\":{\"uid\":\"RzMUMHmcqbDE\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1070,\"y\":391,\"uid\":\"Z9zbqzCVbBHV\"},{\"plugin\":\"output_proxy\",\"x\":1269,\"y\":390,\"uid\":\"aQsMSK6VwQ9H\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"toggle_button\",\"x\":943,\"y\":320,\"uid\":\"3KOfCQakcejO\",\"state\":{\"enabled\":true},\"title\":\"Visible\"},{\"plugin\":\"graph\",\"x\":540,\"y\":571,\"uid\":\"tdRU5gTHJv50\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"MdPLfrLfHWVp\":\"xnmIRUOwsegz\",\"FsKkHY3OJXqL\":\"ejxO7eIJpw4m\",\"BRJLizxwKvkm\":\"H3AwGhvcvewD\"}},\"title\":\"Position, Rotation, Scale\",\"graph\":{\"uid\":\"EfzrVcM1vZav\",\"parent_uid\":\"RzMUMHmcqbDE\",\"open\":true,\"nodes\":[{\"plugin\":\"slider_float_generator\",\"x\":82,\"y\":105,\"uid\":\"pACj253dIqxh\",\"state\":{\"val\":0,\"min\":-1,\"max\":1},\"title\":\"Position X\"},{\"plugin\":\"slider_float_generator\",\"x\":83,\"y\":172,\"uid\":\"73ahqhMj9Efe\",\"state\":{\"val\":0,\"min\":-1,\"max\":1},\"title\":\"Position Y\"},{\"plugin\":\"slider_float_generator\",\"x\":81,\"y\":238,\"uid\":\"dKuESZ6ghybF\",\"state\":{\"val\":0,\"min\":-1,\"max\":1},\"title\":\"Position Z\"},{\"plugin\":\"vector\",\"x\":585,\"y\":200,\"uid\":\"l5Xi8omU4nOI\",\"open\":false,\"title\":\"Position\"},{\"plugin\":\"vector\",\"x\":290,\"y\":610,\"uid\":\"GnLBDbafLjOA\",\"title\":\"Scale\"},{\"plugin\":\"vector\",\"x\":581,\"y\":413,\"uid\":\"DWCQwFKxUaLe\",\"open\":false,\"title\":\"Rotation\"},{\"plugin\":\"const_float_generator\",\"x\":113,\"y\":636,\"uid\":\"yDltuw2NoKEx\",\"state\":{\"val\":2},\"title\":\"Scale XYZ\"},{\"plugin\":\"output_proxy\",\"x\":803,\"y\":252,\"uid\":\"MdPLfrLfHWVp\",\"title\":\"position\",\"dyn_in\":[{\"name\":\"output\",\"dt\":5,\"def\":null,\"uid\":\"S0aurqIbmI1x\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":818,\"y\":400,\"uid\":\"FsKkHY3OJXqL\",\"title\":\"rotation\",\"dyn_in\":[{\"name\":\"output\",\"dt\":5,\"def\":null,\"uid\":\"ueZzDAy1hfyc\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":825,\"y\":549,\"uid\":\"BRJLizxwKvkm\",\"title\":\"scale\",\"dyn_in\":[{\"name\":\"output\",\"dt\":5,\"def\":null,\"uid\":\"TTvvZvj40kZI\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"slider_float_generator\",\"x\":85,\"y\":369,\"uid\":\"hbsckNzS1Cbu\",\"state\":{\"val\":0,\"min\":0,\"max\":5},\"title\":\"Rotate X\"},{\"plugin\":\"slider_float_generator\",\"x\":82,\"y\":436,\"uid\":\"c2AJ2IuiNtiN\",\"state\":{\"val\":0,\"min\":0,\"max\":5},\"title\":\"Rotate Y\"},{\"plugin\":\"slider_float_generator\",\"x\":80,\"y\":502,\"uid\":\"uQdNvWALWKWa\",\"state\":{\"val\":0,\"min\":0,\"max\":5},\"title\":\"Rotate Z\"}],\"conns\":[{\"src_nuid\":\"pACj253dIqxh\",\"dst_nuid\":\"l5Xi8omU4nOI\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"bVDgW3tfxhAp\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"73ahqhMj9Efe\",\"dst_nuid\":\"l5Xi8omU4nOI\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"meewX7n5dDel\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"dKuESZ6ghybF\",\"dst_nuid\":\"l5Xi8omU4nOI\",\"src_slot\":\"value\",\"dst_slot\":\"z\",\"uid\":\"pCfIjgzj0PHb\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"yDltuw2NoKEx\",\"dst_nuid\":\"GnLBDbafLjOA\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"lew8Br6lFfBM\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"yDltuw2NoKEx\",\"dst_nuid\":\"GnLBDbafLjOA\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"OVjTjDVTI7Yg\",\"src_connected\":true,\"dst_connected\":true,\"offset\":1},{\"src_nuid\":\"yDltuw2NoKEx\",\"dst_nuid\":\"GnLBDbafLjOA\",\"src_slot\":\"value\",\"dst_slot\":\"z\",\"uid\":\"NDfwN3ETJkXD\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"l5Xi8omU4nOI\",\"dst_nuid\":\"MdPLfrLfHWVp\",\"src_slot\":\"vector\",\"dst_slot\":0,\"uid\":\"xnonaywgE2Hh\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"DWCQwFKxUaLe\",\"dst_nuid\":\"FsKkHY3OJXqL\",\"src_slot\":\"vector\",\"dst_slot\":0,\"uid\":\"dAXrwQ4s8SJZ\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"GnLBDbafLjOA\",\"dst_nuid\":\"BRJLizxwKvkm\",\"src_slot\":\"vector\",\"dst_slot\":0,\"uid\":\"mfHA3gXTpEdN\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"hbsckNzS1Cbu\",\"dst_nuid\":\"DWCQwFKxUaLe\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"OEL4Ksu8TaBJ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"c2AJ2IuiNtiN\",\"dst_nuid\":\"DWCQwFKxUaLe\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"c7N5VvVAYQUA\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"uQdNvWALWKWa\",\"dst_nuid\":\"DWCQwFKxUaLe\",\"src_slot\":\"value\",\"dst_slot\":\"z\",\"uid\":\"zEuDyJ8cesNe\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"scale\",\"dt\":5,\"index\":0,\"uid\":\"H3AwGhvcvewD\",\"dynamic\":true,\"type\":1,\"is_connected\":true},{\"name\":\"rotation\",\"dt\":5,\"index\":1,\"uid\":\"ejxO7eIJpw4m\",\"dynamic\":true,\"type\":1,\"is_connected\":true},{\"name\":\"position\",\"dt\":5,\"index\":2,\"uid\":\"xnmIRUOwsegz\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":523,\"y\":466,\"uid\":\"NS2bFQjY1Iyk\",\"state\":{\"val\":1},\"title\":\"Segments\"},{\"plugin\":\"three_geometry_plane\",\"x\":659,\"y\":441,\"uid\":\"PkoN8IyqyNDV\",\"open\":false},{\"plugin\":\"three_material\",\"x\":711,\"y\":252,\"uid\":\"BWDmwXWmcktG\",\"open\":false},{\"plugin\":\"const_float_generator\",\"x\":521,\"y\":413,\"uid\":\"HOQs7moTdzFX\",\"state\":{\"val\":1},\"title\":\"Width & Height\"},{\"plugin\":\"graph\",\"x\":339,\"y\":205,\"uid\":\"H3DVIcBFYPQv\",\"state\":{\"always_update\":true,\"input_sids\":{\"w3lWMYxHhiMZ\":\"jPDye0ahee25\"},\"output_sids\":{\"6sbR6h6pl2vp\":\"5CmKiuwpuSn6\"}},\"title\":\"Text settings\",\"graph\":{\"uid\":\"MFFA31zEQzVf\",\"parent_uid\":\"RzMUMHmcqbDE\",\"open\":true,\"nodes\":[{\"plugin\":\"texture_from_text_generator\",\"x\":755,\"y\":144,\"uid\":\"RQnLhl2U92ju\"},{\"plugin\":\"const_float_generator\",\"x\":231,\"y\":207,\"uid\":\"NW56qEYo7Zlg\",\"state\":{\"val\":2048},\"title\":\"Texture resolution\"},{\"plugin\":\"multiply_modulator\",\"x\":510,\"y\":176,\"uid\":\"YTrF54VPGPQV\",\"open\":false},{\"plugin\":\"knob_float_generator\",\"x\":382,\"y\":149,\"uid\":\"2vsHeLaI9Yr8\",\"state\":{\"val\":0.2799999999999999},\"title\":\"X position\"},{\"plugin\":\"multiply_modulator\",\"x\":523,\"y\":236,\"uid\":\"PmayiwOEL0MJ\",\"open\":false},{\"plugin\":\"knob_float_generator\",\"x\":379,\"y\":211,\"uid\":\"JoLC6NEbT9ti\",\"state\":{\"val\":0.16000000000000014},\"title\":\"Y position\"},{\"plugin\":\"output_proxy\",\"x\":910,\"y\":176,\"uid\":\"6sbR6h6pl2vp\",\"title\":\"texture\",\"dyn_in\":[{\"name\":\"output\",\"dt\":2,\"def\":null,\"uid\":\"6NOm574t5JhD\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":68,\"y\":81,\"uid\":\"w3lWMYxHhiMZ\",\"title\":\"text\",\"dyn_out\":[{\"name\":\"input\",\"dt\":15,\"uid\":\"iFnISyc7zSlI\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"const_text_generator\",\"x\":228,\"y\":150,\"uid\":\"Pq9fu5wQdPTm\",\"state\":{\"text\":\"italic 16px georgia\",\"width\":111,\"height\":22},\"title\":\"Text style\"},{\"plugin\":\"const_text_generator\",\"x\":230,\"y\":268,\"uid\":\"5JDfYUbcDCY8\",\"state\":{\"text\":\"#fff\",\"width\":99,\"height\":21},\"title\":\"Fill color (in hex)\"}],\"conns\":[{\"src_nuid\":\"NW56qEYo7Zlg\",\"dst_nuid\":\"RQnLhl2U92ju\",\"src_slot\":\"value\",\"dst_slot\":\"width\",\"uid\":\"z7uV49iNcWbC\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"NW56qEYo7Zlg\",\"dst_nuid\":\"RQnLhl2U92ju\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"l77kJEZrR1BI\",\"src_connected\":true,\"dst_connected\":true,\"offset\":2},{\"src_nuid\":\"YTrF54VPGPQV\",\"dst_nuid\":\"RQnLhl2U92ju\",\"src_slot\":\"result\",\"dst_slot\":\"x\",\"uid\":\"mBwMx5Bpg4oZ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"PmayiwOEL0MJ\",\"dst_nuid\":\"RQnLhl2U92ju\",\"src_slot\":\"result\",\"dst_slot\":\"y\",\"uid\":\"JogMkxc0sJQQ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"NW56qEYo7Zlg\",\"dst_nuid\":\"YTrF54VPGPQV\",\"src_slot\":\"value\",\"dst_slot\":\"a\",\"uid\":\"PNIeXyzsZXmE\",\"src_connected\":true,\"dst_connected\":true,\"offset\":1},{\"src_nuid\":\"NW56qEYo7Zlg\",\"dst_nuid\":\"PmayiwOEL0MJ\",\"src_slot\":\"value\",\"dst_slot\":\"a\",\"uid\":\"kRuNffY9hcMl\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"2vsHeLaI9Yr8\",\"dst_nuid\":\"YTrF54VPGPQV\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"9kkwDn3bGiHt\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"JoLC6NEbT9ti\",\"dst_nuid\":\"PmayiwOEL0MJ\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"9pQHtU6MwzoE\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"RQnLhl2U92ju\",\"dst_nuid\":\"6sbR6h6pl2vp\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"XzmA5vPRU83y\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"w3lWMYxHhiMZ\",\"dst_nuid\":\"RQnLhl2U92ju\",\"src_slot\":0,\"dst_slot\":\"text\",\"uid\":\"arm4WwTfZDED\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"Pq9fu5wQdPTm\",\"dst_nuid\":\"RQnLhl2U92ju\",\"src_slot\":\"text\",\"dst_slot\":\"font style\",\"uid\":\"mUki2KK6WHbD\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5JDfYUbcDCY8\",\"dst_nuid\":\"RQnLhl2U92ju\",\"src_slot\":\"text\",\"dst_slot\":\"fill style\",\"uid\":\"tnestFnfhbMY\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"text\",\"dt\":15,\"index\":0,\"uid\":\"jPDye0ahee25\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"texture\",\"dt\":2,\"index\":0,\"uid\":\"5CmKiuwpuSn6\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":482,\"y\":326,\"uid\":\"l0QcZMxI8r7d\",\"state\":{\"val\":2},\"title\":\"Blend mode\"},{\"plugin\":\"toggle_button\",\"x\":478,\"y\":265,\"uid\":\"KNT64DfruD1i\",\"state\":{\"enabled\":true},\"title\":\"Transparency\"},{\"plugin\":\"format_string_float\",\"x\":181,\"y\":250,\"uid\":\"kMQY1A9Cbn34\"},{\"plugin\":\"input_proxy\",\"x\":95,\"y\":257,\"uid\":\"oYe5etxYFvEp\",\"title\":\"float\",\"dyn_out\":[{\"name\":\"input\",\"dt\":0,\"uid\":\"NZfP4zFhepEv\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]}],\"conns\":[{\"src_nuid\":\"Z9zbqzCVbBHV\",\"dst_nuid\":\"aQsMSK6VwQ9H\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"SOhSln8IchH9\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"3KOfCQakcejO\",\"dst_nuid\":\"Z9zbqzCVbBHV\",\"src_slot\":\"bool\",\"dst_slot\":\"visible\",\"uid\":\"0J8y37Axm9W3\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"tdRU5gTHJv50\",\"dst_nuid\":\"Z9zbqzCVbBHV\",\"src_slot\":0,\"dst_slot\":\"scale\",\"uid\":\"OtzbEctAYMOE\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"tdRU5gTHJv50\",\"dst_nuid\":\"Z9zbqzCVbBHV\",\"src_slot\":1,\"dst_slot\":\"rotation\",\"uid\":\"JIzdgts77QnF\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"tdRU5gTHJv50\",\"dst_nuid\":\"Z9zbqzCVbBHV\",\"src_slot\":2,\"dst_slot\":\"position\",\"uid\":\"wgXBuBIIeu0j\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"PkoN8IyqyNDV\",\"dst_nuid\":\"Z9zbqzCVbBHV\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"ihAC78UH8MTE\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"BWDmwXWmcktG\",\"dst_nuid\":\"Z9zbqzCVbBHV\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"F68BzZ8dSh4h\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"HOQs7moTdzFX\",\"dst_nuid\":\"PkoN8IyqyNDV\",\"src_slot\":\"value\",\"dst_slot\":\"width\",\"uid\":\"OcLqEdWYf8Nm\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"HOQs7moTdzFX\",\"dst_nuid\":\"PkoN8IyqyNDV\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"9ycmnM9q0EAm\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"NS2bFQjY1Iyk\",\"dst_nuid\":\"PkoN8IyqyNDV\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"l20YCeaUSxNx\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"NS2bFQjY1Iyk\",\"dst_nuid\":\"PkoN8IyqyNDV\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"baaThFz694CQ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"H3DVIcBFYPQv\",\"dst_nuid\":\"BWDmwXWmcktG\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"wWrvJQ4OZVrC\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"l0QcZMxI8r7d\",\"dst_nuid\":\"BWDmwXWmcktG\",\"src_slot\":\"value\",\"dst_slot\":\"blending\",\"uid\":\"iZj9Qs5MnTWU\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"KNT64DfruD1i\",\"dst_nuid\":\"BWDmwXWmcktG\",\"src_slot\":\"bool\",\"dst_slot\":\"transparent\",\"uid\":\"BNWttGoDWjre\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"kMQY1A9Cbn34\",\"dst_nuid\":\"H3DVIcBFYPQv\",\"src_slot\":\"text\",\"dst_slot\":0,\"uid\":\"kuqQV7Z0jJK7\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"oYe5etxYFvEp\",\"dst_nuid\":\"kMQY1A9Cbn34\",\"src_slot\":0,\"dst_slot\":\"float\",\"uid\":\"uW8k31YeTTKn\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true}]},\"dyn_in\":[{\"name\":\"float\",\"dt\":0,\"index\":0,\"uid\":\"3avLd2vAV3XK\",\"dynamic\":true,\"type\":0}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[]}}"
  },
  {
    "path": "browser/patches/audio_audio_player.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 17,\n    \"root\": {\n        \"node_uid\": 75,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 227,\n                \"y\": 142,\n                \"uid\": 74,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {},\n                    \"output_sids\": {}\n                },\n                \"title\": \"Audio player\",\n                \"graph\": {\n                    \"node_uid\": 8,\n                    \"uid\": 16,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"url_audio_buffer_generator\",\n                            \"x\": 275,\n                            \"y\": 371,\n                            \"uid\": 0,\n                            \"state\": {\n                                \"url\": \"data/audio/inedible_candy.ogg\"\n                            }\n                        },\n                        {\n                            \"plugin\": \"audio_buffer_source_modulator\",\n                            \"x\": 434,\n                            \"y\": 438,\n                            \"uid\": 1\n                        },\n                        {\n                            \"plugin\": \"audio_source_player\",\n                            \"x\": 725,\n                            \"y\": 424,\n                            \"uid\": 2\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 308,\n                            \"y\": 439,\n                            \"uid\": 3,\n                            \"state\": {\n                                \"enabled\": true\n                            }\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 308,\n                            \"y\": 501,\n                            \"uid\": 4,\n                            \"state\": {\n                                \"enabled\": false\n                            }\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 309,\n                            \"y\": 562,\n                            \"uid\": 5,\n                            \"state\": {\n                                \"val\": 1\n                            }\n                        },\n                        {\n                            \"plugin\": \"audio_gain_modulator\",\n                            \"x\": 557,\n                            \"y\": 416,\n                            \"uid\": 6,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_uids\": [\n                                    0\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"0\",\n                                    \"dt\": 18,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 465,\n                            \"y\": 333,\n                            \"uid\": 7,\n                            \"state\": {\n                                \"val\": 0.40000000000000013\n                            },\n                            \"title\": \"Stop\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4\n                        },\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        }\n                    ]\n                }\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/audio_audio_player_old.json",
    "content": "{\n    \"abs_t\": 7.338,\n    \"active_graph\": 0,\n    \"graph_uid\": 36,\n    \"root\": {\n        \"node_uid\": 109,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"url_audio_generator\",\n                \"x\": 137,\n                \"y\": 356,\n                \"uid\": 99,\n                \"state\": {\n                    \"url\": \"data/audio/inedible_candy\"\n                }\n            },\n            {\n                \"plugin\": \"audio_get_current_time_modulator\",\n                \"x\": 295,\n                \"y\": 305,\n                \"uid\": 100\n            },\n            {\n                \"plugin\": \"float_display\",\n                \"x\": 405,\n                \"y\": 231,\n                \"uid\": 101\n            },\n            {\n                \"plugin\": \"audio_player\",\n                \"x\": 614,\n                \"y\": 404,\n                \"uid\": 102\n            },\n            {\n                \"plugin\": \"toggle_button\",\n                \"x\": 297,\n                \"y\": 417,\n                \"uid\": 103,\n                \"state\": {\n                    \"enabled\": false\n                },\n                \"title\": \"Play\"\n            },\n            {\n                \"plugin\": \"toggle_button\",\n                \"x\": 297,\n                \"y\": 478,\n                \"uid\": 104,\n                \"state\": {\n                    \"enabled\": false\n                },\n                \"title\": \"Mute audio\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 297,\n                \"y\": 538,\n                \"uid\": 105,\n                \"state\": {\n                    \"val\": 0.49999999999999956\n                },\n                \"title\": \"Volume\"\n            },\n            {\n                \"plugin\": \"audio_get_duration_modulator\",\n                \"x\": 297,\n                \"y\": 679,\n                \"uid\": 106\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 297,\n                \"y\": 607,\n                \"uid\": 107,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Playback position\"\n            },\n            {\n                \"plugin\": \"multiply_modulator\",\n                \"x\": 438,\n                \"y\": 638,\n                \"uid\": 108\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 99,\n                \"dst_nuid\": 100,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 100,\n                \"dst_nuid\": 101,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 99,\n                \"dst_nuid\": 102,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"offset\": 1\n            },\n            {\n                \"src_nuid\": 103,\n                \"dst_nuid\": 102,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 104,\n                \"dst_nuid\": 102,\n                \"src_slot\": 0,\n                \"dst_slot\": 2\n            },\n            {\n                \"src_nuid\": 105,\n                \"dst_nuid\": 102,\n                \"src_slot\": 0,\n                \"dst_slot\": 3\n            },\n            {\n                \"src_nuid\": 99,\n                \"dst_nuid\": 106,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"offset\": 2\n            },\n            {\n                \"src_nuid\": 107,\n                \"dst_nuid\": 108,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 106,\n                \"dst_nuid\": 108,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 108,\n                \"dst_nuid\": 102,\n                \"src_slot\": 0,\n                \"dst_slot\": 4\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/background_skybox.json",
    "content": "{\n    \"abs_t\": 31.941,\n    \"active_graph\": 46,\n    \"graph_uid\": 50,\n    \"root\": {\n        \"node_uid\": 8,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 561,\n                \"y\": 472,\n                \"uid\": 7,\n                \"dsid\": 1,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {\n                        \"56\": 0\n                    },\n                    \"output_sids\": {}\n                },\n                \"title\": \"Skybox\",\n                \"graph\": {\n                    \"node_uid\": 57,\n                    \"uid\": 46,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 714,\n                            \"y\": 78,\n                            \"uid\": 0,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"1\": 0,\n                                    \"2\": 1,\n                                    \"10\": 2,\n                                    \"21\": 5,\n                                    \"23\": 6\n                                },\n                                \"output_sids\": {}\n                            },\n                            \"title\": \"Scene loader\",\n                            \"graph\": {\n                                \"node_uid\": 26,\n                                \"uid\": 47,\n                                \"parent_uid\": 46,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scene_renderer_emitter\",\n                                        \"x\": 919,\n                                        \"y\": 19,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 11,\n                                        \"y\": 308,\n                                        \"uid\": 1,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"scene\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 11,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 837,\n                                        \"y\": 127,\n                                        \"uid\": 2,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"scale_matrix\",\n                                        \"x\": 631,\n                                        \"y\": 195,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 514,\n                                        \"y\": 216,\n                                        \"uid\": 8\n                                    },\n                                    {\n                                        \"plugin\": \"divide_modulator\",\n                                        \"x\": 400,\n                                        \"y\": 235,\n                                        \"uid\": 9\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 280,\n                                        \"y\": 204,\n                                        \"uid\": 10,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"mesh scale\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"max_modulator\",\n                                        \"x\": 320,\n                                        \"y\": 307,\n                                        \"uid\": 11\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 220,\n                                        \"y\": 355,\n                                        \"uid\": 12\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 221,\n                                        \"y\": 288,\n                                        \"uid\": 13\n                                    },\n                                    {\n                                        \"plugin\": \"scene_get_bounding_box\",\n                                        \"x\": 89,\n                                        \"y\": 307,\n                                        \"uid\": 14\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 632,\n                                        \"y\": 251,\n                                        \"uid\": 21,\n                                        \"dsid\": 11,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"transform\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 569,\n                                        \"y\": 434,\n                                        \"uid\": 23,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 727,\n                                        \"y\": 195,\n                                        \"uid\": 25\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 13,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 1,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 14,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"scene\",\n                                    \"dt\": 11,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"mesh scale\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"transform\",\n                                    \"dt\": 4,\n                                    \"uid\": 5,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": false\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 6,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"url_scene_generator\",\n                            \"x\": 581,\n                            \"y\": 35,\n                            \"uid\": 37,\n                            \"state\": {\n                                \"url\": \"/data/scene/skybox/scene.json\"\n                            }\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 430,\n                            \"y\": 195,\n                            \"uid\": 38,\n                            \"state\": {\n                                \"val\": 20,\n                                \"min\": 0,\n                                \"max\": 20\n                            }\n                        },\n                        {\n                            \"plugin\": \"material_double_sided_modulator\",\n                            \"x\": 569,\n                            \"y\": 312,\n                            \"uid\": 41\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 429,\n                            \"y\": 410,\n                            \"uid\": 42,\n                            \"state\": {\n                                \"enabled\": true\n                            }\n                        },\n                        {\n                            \"plugin\": \"material_texture_modulator\",\n                            \"x\": 427,\n                            \"y\": 312,\n                            \"uid\": 50\n                        },\n                        {\n                            \"plugin\": \"url_texture_generator\",\n                            \"x\": 256,\n                            \"y\": 456,\n                            \"uid\": 51,\n                            \"state\": {\n                                \"url\": \"data/scenes/skybox/skybox_1.jpg\"\n                            }\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 180,\n                            \"y\": 131,\n                            \"uid\": 56,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"camera\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 6,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 38,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 41,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 42,\n                            \"dst_nuid\": 41,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 50,\n                            \"dst_nuid\": 41,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 51,\n                            \"dst_nuid\": 50,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        },\n                        {\n                            \"src_nuid\": 56,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"camera\",\n                        \"dt\": 6,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/camera_orbit_camera.json",
    "content": "{\n    \"abs_t\": 62.106,\n    \"active_graph\": 0,\n    \"graph_uid\": 20,\n    \"root\": {\n        \"node_uid\": 7,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 284,\n                \"y\": 202,\n                \"uid\": 1,\n                \"dsid\": 4,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"rt_filter\": 9729,\n                    \"input_sids\": {\n                        \"10\": 0,\n                        \"11\": 1,\n                        \"12\": 2\n                    },\n                    \"output_sids\": {\n                        \"24\": 3\n                    }\n                },\n                \"title\": \"Orbit camera\",\n                \"graph\": {\n                    \"node_uid\": 30,\n                    \"uid\": 7,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 173,\n                            \"y\": 58,\n                            \"uid\": 10,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"rotation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 32,\n                            \"y\": 122,\n                            \"uid\": 11,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"elevation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 26,\n                            \"y\": 180,\n                            \"uid\": 12,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"distance\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"cos_modulator\",\n                            \"x\": 355,\n                            \"y\": 60,\n                            \"uid\": 13\n                        },\n                        {\n                            \"plugin\": \"sin_modulator\",\n                            \"x\": 376,\n                            \"y\": 118,\n                            \"uid\": 14\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 487,\n                            \"y\": 55,\n                            \"uid\": 15\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 596,\n                            \"y\": 132,\n                            \"uid\": 16\n                        },\n                        {\n                            \"plugin\": \"sin_modulator\",\n                            \"x\": 364,\n                            \"y\": 242,\n                            \"uid\": 17\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 491,\n                            \"y\": 220,\n                            \"uid\": 18\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 586,\n                            \"y\": 263,\n                            \"uid\": 19\n                        },\n                        {\n                            \"plugin\": \"cos_modulator\",\n                            \"x\": 379,\n                            \"y\": 332,\n                            \"uid\": 20\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 474,\n                            \"y\": 372,\n                            \"uid\": 21\n                        },\n                        {\n                            \"plugin\": \"perspective_camera\",\n                            \"x\": 805,\n                            \"y\": 213,\n                            \"uid\": 22\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 692,\n                            \"y\": 279,\n                            \"uid\": 23\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 925,\n                            \"y\": 213,\n                            \"uid\": 24,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"camera\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 6,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"def\": null,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"pi_generator\",\n                            \"x\": 97,\n                            \"y\": 294,\n                            \"uid\": 25\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 257,\n                            \"y\": 58,\n                            \"uid\": 26\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 257,\n                            \"y\": 145,\n                            \"uid\": 27\n                        },\n                        {\n                            \"plugin\": \"subtract_modulator\",\n                            \"x\": 149,\n                            \"y\": 117,\n                            \"uid\": 28\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 34,\n                            \"y\": 52,\n                            \"uid\": 29,\n                            \"state\": {\n                                \"val\": 1\n                            }\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 15,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 15,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 18,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 18,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 18,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 20,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"offset\": 2\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 23,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 23,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 23,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 22,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 24,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"offset\": 2\n                        },\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 26,\n                            \"dst_nuid\": 13,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 26,\n                            \"dst_nuid\": 17,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 27,\n                            \"dst_nuid\": 14,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 27,\n                            \"dst_nuid\": 20,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 28,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 29,\n                            \"dst_nuid\": 28,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 28,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"rotation\",\n                        \"dt\": 0,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"elevation\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"distance\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"camera\",\n                        \"dt\": 6,\n                        \"uid\": 3,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 30,\n                \"y\": 176,\n                \"uid\": 2,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -1,\n                    \"max\": 1\n                },\n                \"title\": \"Rotation\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 30,\n                \"y\": 238,\n                \"uid\": 3,\n                \"state\": {\n                    \"val\": 0.65,\n                    \"min\": 0.05,\n                    \"max\": 0.95\n                },\n                \"title\": \"Elevation\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 28,\n                \"y\": 300,\n                \"uid\": 4,\n                \"state\": {\n                    \"val\": 3.4,\n                    \"min\": 0.1,\n                    \"max\": 10\n                },\n                \"title\": \"Distance\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 2,\n                \"dst_nuid\": 1,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 3,\n                \"dst_nuid\": 1,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 1,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/camera_perspective_camera_setup.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 3,\n    \"root\": {\n        \"node_uid\": 12,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 371,\n                \"y\": 147,\n                \"uid\": 6,\n                \"dsid\": 6,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"0\": 0,\n                        \"1\": 1,\n                        \"2\": 2,\n                        \"25\": 5\n                    },\n                    \"output_sids\": {\n                        \"3\": 3\n                    }\n                },\n                \"title\": \"Camera\",\n                \"graph\": {\n                    \"node_uid\": 26,\n                    \"uid\": 2,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 74,\n                            \"y\": 173,\n                            \"uid\": 0,\n                            \"dsid\": 16,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"rotation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 129,\n                            \"y\": 89,\n                            \"uid\": 1,\n                            \"dsid\": 16,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"elevation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 52,\n                            \"y\": 48,\n                            \"uid\": 2,\n                            \"dsid\": 16,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"dolly\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 558,\n                            \"y\": 35,\n                            \"uid\": 3,\n                            \"dsid\": 16,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"camera\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 6,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"perspective_camera\",\n                            \"x\": 448,\n                            \"y\": 75,\n                            \"uid\": 4\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 218,\n                            \"y\": 28,\n                            \"uid\": 5\n                        },\n                        {\n                            \"plugin\": \"rotation_xyz_matrix\",\n                            \"x\": 160,\n                            \"y\": 153,\n                            \"uid\": 6\n                        },\n                        {\n                            \"plugin\": \"vector_transform\",\n                            \"x\": 342,\n                            \"y\": 77,\n                            \"uid\": 7\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 219,\n                            \"y\": 267,\n                            \"uid\": 21\n                        },\n                        {\n                            \"plugin\": \"vector_transform\",\n                            \"x\": 341,\n                            \"y\": 190,\n                            \"uid\": 22\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 104,\n                            \"y\": 287,\n                            \"uid\": 23,\n                            \"state\": {\n                                \"val\": 0.5\n                            }\n                        },\n                        {\n                            \"plugin\": \"negate_modulator\",\n                            \"x\": 132,\n                            \"y\": 33,\n                            \"uid\": 24\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 92,\n                            \"y\": 457,\n                            \"uid\": 25,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"target elevation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 22,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 22,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 24,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"rotation\",\n                        \"dt\": 0,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"elevation\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"dolly\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"target elevation\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 3,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"camera\",\n                        \"dt\": 6,\n                        \"uid\": 3,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 152,\n                \"y\": 104,\n                \"uid\": 7,\n                \"state\": {\n                    \"val\": -7.2,\n                    \"min\": -180,\n                    \"max\": 180\n                },\n                \"title\": \"Rotation\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 152,\n                \"y\": 187,\n                \"uid\": 8,\n                \"state\": {\n                    \"val\": -0.8,\n                    \"min\": -20,\n                    \"max\": 20\n                },\n                \"title\": \"Elevation\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 152,\n                \"y\": 270,\n                \"uid\": 9,\n                \"state\": {\n                    \"val\": 2.9,\n                    \"min\": 0,\n                    \"max\": 10\n                },\n                \"title\": \"Dolly\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 153,\n                \"y\": 352,\n                \"uid\": 11,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": 0,\n                    \"max\": 10\n                },\n                \"title\": \"target elevation\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 7,\n                \"dst_nuid\": 6,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 8,\n                \"dst_nuid\": 6,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 9,\n                \"dst_nuid\": 6,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 11,\n                \"dst_nuid\": 6,\n                \"src_slot\": 0,\n                \"dst_slot\": 3,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/camera_with_mouse_controls.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 7,\n    \"root\": {\n        \"node_uid\": 3,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 146,\n                \"y\": 24,\n                \"uid\": 1,\n                \"dsid\": 2,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"32\": 0\n                    },\n                    \"output_sids\": {\n                        \"39\": 1\n                    }\n                },\n                \"title\": \"Mouse cam\",\n                \"graph\": {\n                    \"node_uid\": 41,\n                    \"uid\": 6,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"perspective_camera\",\n                            \"x\": 1801,\n                            \"y\": 42,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 1530,\n                            \"y\": 48,\n                            \"uid\": 1\n                        },\n                        {\n                            \"plugin\": \"vector_transform\",\n                            \"x\": 1664,\n                            \"y\": 102,\n                            \"uid\": 2\n                        },\n                        {\n                            \"plugin\": \"rotation_xyz_matrix\",\n                            \"x\": 1302,\n                            \"y\": 326,\n                            \"uid\": 3\n                        },\n                        {\n                            \"plugin\": \"rotation_xyz_matrix\",\n                            \"x\": 1378,\n                            \"y\": 605,\n                            \"uid\": 4\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 1235,\n                            \"y\": 580,\n                            \"uid\": 5,\n                            \"state\": {\n                                \"val\": -90\n                            },\n                            \"title\": \"X rotation\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 1235,\n                            \"y\": 645,\n                            \"uid\": 6,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Y/Z rotation\"\n                        },\n                        {\n                            \"plugin\": \"mouse_position_generator\",\n                            \"x\": 0,\n                            \"y\": 470,\n                            \"uid\": 7\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 1025,\n                            \"y\": 365,\n                            \"uid\": 8\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 915,\n                            \"y\": 447,\n                            \"uid\": 9,\n                            \"state\": {\n                                \"val\": -360\n                            },\n                            \"title\": \"Rotation range\"\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 846,\n                            \"y\": 793,\n                            \"uid\": 10\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 724,\n                            \"y\": 841,\n                            \"uid\": 11,\n                            \"state\": {\n                                \"val\": -10\n                            },\n                            \"title\": \"Elev. sensitivity\"\n                        },\n                        {\n                            \"plugin\": \"subtract_modulator\",\n                            \"x\": 646,\n                            \"y\": 753,\n                            \"uid\": 12\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 514,\n                            \"y\": 840,\n                            \"uid\": 13,\n                            \"state\": {\n                                \"val\": 0.5\n                            },\n                            \"title\": \"Elevation bias\"\n                        },\n                        {\n                            \"plugin\": \"mouse_button_generator\",\n                            \"x\": 222,\n                            \"y\": 581,\n                            \"uid\": 14\n                        },\n                        {\n                            \"plugin\": \"toggle_modulator\",\n                            \"x\": 395,\n                            \"y\": 581,\n                            \"uid\": 15,\n                            \"state\": {\n                                \"value\": false\n                            }\n                        },\n                        {\n                            \"plugin\": \"sample_and_hold_modulator\",\n                            \"x\": 502,\n                            \"y\": 753,\n                            \"uid\": 16,\n                            \"state\": {\n                                \"value\": 0.5962962962962963\n                            }\n                        },\n                        {\n                            \"plugin\": \"sample_and_hold_modulator\",\n                            \"x\": 513,\n                            \"y\": 450,\n                            \"uid\": 17,\n                            \"state\": {\n                                \"value\": 0.48541666666666666\n                            }\n                        },\n                        {\n                            \"plugin\": \"clock_generator\",\n                            \"x\": 0,\n                            \"y\": 302,\n                            \"uid\": 18\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 106,\n                            \"y\": 247,\n                            \"uid\": 19\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 0,\n                            \"y\": 233,\n                            \"uid\": 20,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Zero\"\n                        },\n                        {\n                            \"plugin\": \"add_modulator\",\n                            \"x\": 647,\n                            \"y\": 385,\n                            \"uid\": 21\n                        },\n                        {\n                            \"plugin\": \"lowpass_filter_modulator\",\n                            \"x\": 1129,\n                            \"y\": 401,\n                            \"uid\": 22\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 718,\n                            \"y\": 448,\n                            \"uid\": 23,\n                            \"state\": {\n                                \"val\": 0.95\n                            },\n                            \"title\": \"LP filt. amt.\"\n                        },\n                        {\n                            \"plugin\": \"mouse_wheel_generator\",\n                            \"x\": 810,\n                            \"y\": 0,\n                            \"uid\": 24\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 963,\n                            \"y\": 0,\n                            \"uid\": 25\n                        },\n                        {\n                            \"plugin\": \"clamped_accumulate_modulator\",\n                            \"x\": 1098,\n                            \"y\": 47,\n                            \"uid\": 26,\n                            \"state\": {\n                                \"value\": 1\n                            },\n                            \"title\": \"Clamped acc.\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 980,\n                            \"y\": 177,\n                            \"uid\": 27,\n                            \"state\": {\n                                \"val\": 20\n                            },\n                            \"title\": \"Max. dolly\"\n                        },\n                        {\n                            \"plugin\": \"lowpass_filter_modulator\",\n                            \"x\": 1304,\n                            \"y\": 184,\n                            \"uid\": 28\n                        },\n                        {\n                            \"plugin\": \"add_modulator\",\n                            \"x\": 1219,\n                            \"y\": 119,\n                            \"uid\": 29\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 969,\n                            \"y\": 113,\n                            \"uid\": 30,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Min. dolly\"\n                        },\n                        {\n                            \"plugin\": \"negate_modulator\",\n                            \"x\": 730,\n                            \"y\": 753,\n                            \"uid\": 31\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 810,\n                            \"y\": 55,\n                            \"uid\": 32,\n                            \"dsid\": 20,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Mouse sensitivity\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 1591,\n                            \"y\": 328,\n                            \"uid\": 33\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 1460,\n                            \"y\": 368,\n                            \"uid\": 34,\n                            \"state\": {\n                                \"val\": 0\n                            }\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 1464,\n                            \"y\": 305,\n                            \"uid\": 35,\n                            \"state\": {\n                                \"val\": 0.1\n                            }\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 1473,\n                            \"y\": 432,\n                            \"uid\": 36,\n                            \"state\": {\n                                \"val\": 0\n                            }\n                        },\n                        {\n                            \"plugin\": \"add_modulator\",\n                            \"x\": 934,\n                            \"y\": 366,\n                            \"uid\": 37\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 782,\n                            \"y\": 516,\n                            \"uid\": 38,\n                            \"state\": {\n                                \"val\": 0.5\n                            },\n                            \"title\": \"Offset\"\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1897,\n                            \"y\": 41,\n                            \"uid\": 39,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"camera\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 6,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"negate_modulator\",\n                            \"x\": 1403,\n                            \"y\": 94,\n                            \"uid\": 40\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 33,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4\n                        },\n                        {\n                            \"src_nuid\": 35,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 39,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"offset\": 2\n                        },\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 1,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 17,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 8,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 8,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 8,\n                            \"dst_nuid\": 22,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 31,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 12,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 12,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 15,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 17,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 18,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 20,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 29,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 37,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 22,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 28,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 25,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 32,\n                            \"dst_nuid\": 25,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 27,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        },\n                        {\n                            \"src_nuid\": 30,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 26,\n                            \"dst_nuid\": 29,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 29,\n                            \"dst_nuid\": 28,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 34,\n                            \"dst_nuid\": 33,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 34,\n                            \"dst_nuid\": 33,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"offset\": 2\n                        },\n                        {\n                            \"src_nuid\": 36,\n                            \"dst_nuid\": 33,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 38,\n                            \"dst_nuid\": 37,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        },\n                        {\n                            \"src_nuid\": 28,\n                            \"dst_nuid\": 40,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 40,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Mouse sensitivity\",\n                        \"dt\": 0,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"camera\",\n                        \"dt\": 6,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 18,\n                \"y\": 88,\n                \"uid\": 2,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Mouse sensitivity\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 2,\n                \"dst_nuid\": 1,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}\n"
  },
  {
    "path": "browser/patches/camera_with_zoom_only.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 1,\n    \"graph_uid\": 2,\n    \"root\": {\n        \"node_uid\": 2,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 219,\n                \"y\": 29,\n                \"uid\": 0,\n                \"dsid\": 2,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"2\": 0\n                    },\n                    \"output_sids\": {\n                        \"3\": 1\n                    }\n                },\n                \"title\": \"Camera zoom\",\n                \"graph\": {\n                    \"node_uid\": 5,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"perspective_camera\",\n                            \"x\": 295,\n                            \"y\": 42,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 177,\n                            \"y\": 43,\n                            \"uid\": 1\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 19,\n                            \"y\": 64,\n                            \"uid\": 2,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"zoom\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 395,\n                            \"y\": 42,\n                            \"uid\": 3,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"camera\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 6,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"negate_modulator\",\n                            \"x\": 92,\n                            \"y\": 64,\n                            \"uid\": 4\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"zoom\",\n                        \"dt\": 0,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"camera\",\n                        \"dt\": 6,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 13,\n                \"y\": 49,\n                \"uid\": 1,\n                \"state\": {\n                    \"val\": 2,\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 1,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}\n"
  },
  {
    "path": "browser/patches/components/rotation-all-axes.json",
    "content": "{\"nodes\":[{\"plugin\":\"entity_component\",\"x\":652,\"y\":714,\"uid\":\"hCn3GJyfjcEr\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"6NRssES3S539\":\"hAAWj4zrpu6a\"}},\"title\":\"Rotation on all axes\",\"graph\":{\"uid\":\"uzKbncFj9hMV\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":962,\"y\":368,\"uid\":\"6NRssES3S539\",\"title\":\"rotation\",\"dyn_in\":[{\"name\":\"output\",\"dt\":5,\"def\":null,\"uid\":\"vEbx2hrxHrMs\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"vector\",\"x\":761,\"y\":366,\"uid\":\"mByauDKGhUcE\",\"open\":false},{\"plugin\":\"annotation\",\"x\":614,\"y\":146,\"uid\":\"ehLqT9eRpZYz\",\"state\":{\"text\":\"Component for Rotation on all axes.\",\"width\":207,\"height\":80}},{\"plugin\":\"clock_generator\",\"x\":454,\"y\":321,\"uid\":\"9ZWwk8CxkbDu\"},{\"plugin\":\"multiply_modulator\",\"x\":584,\"y\":366,\"uid\":\"WQHJpvWLhHFe\",\"open\":false,\"title\":\"Multiply\"},{\"plugin\":\"slider_float_generator\",\"x\":355,\"y\":379,\"uid\":\"eVqDfRjsgczd\",\"state\":{\"val\":1,\"min\":-10,\"max\":10},\"title\":\"Rotation Speed\"}],\"conns\":[{\"src_nuid\":\"mByauDKGhUcE\",\"dst_nuid\":\"6NRssES3S539\",\"src_slot\":\"vector\",\"dst_slot\":0,\"uid\":\"hdV32UYcDbSw\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"9ZWwk8CxkbDu\",\"dst_nuid\":\"WQHJpvWLhHFe\",\"src_slot\":\"seconds\",\"dst_slot\":\"a\",\"uid\":\"kBuq5TjfcYVp\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"eVqDfRjsgczd\",\"dst_nuid\":\"WQHJpvWLhHFe\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"EqPwJmeCbfPg\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"WQHJpvWLhHFe\",\"dst_nuid\":\"mByauDKGhUcE\",\"src_slot\":\"result\",\"dst_slot\":\"y\",\"uid\":\"NaswuRjrLXws\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"WQHJpvWLhHFe\",\"dst_nuid\":\"mByauDKGhUcE\",\"src_slot\":\"result\",\"dst_slot\":\"x\",\"uid\":\"eGAq3j49GGeK\",\"src_connected\":true,\"dst_connected\":true,\"offset\":1},{\"src_nuid\":\"WQHJpvWLhHFe\",\"dst_nuid\":\"mByauDKGhUcE\",\"src_slot\":\"result\",\"dst_slot\":\"z\",\"uid\":\"raWn6RG4AJmj\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"rotation\",\"dt\":5,\"index\":0,\"uid\":\"hAAWj4zrpu6a\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[],\"x1\":702,\"y1\":764,\"x2\":913,\"y2\":823}"
  },
  {
    "path": "browser/patches/components/rotation-y-axis.json",
    "content": "{\"nodes\":[{\"plugin\":\"entity_component\",\"x\":652,\"y\":714,\"uid\":\"7RAW4kBwdDZm\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"Yw9hjydQmna5\":\"hAAWj4zrpu6a\"}},\"title\":\"Rotation on Y axis\",\"graph\":{\"uid\":\"kJ4LmkQLqCbr\",\"parent_uid\":\"root\",\"open\":false,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":962,\"y\":368,\"uid\":\"Yw9hjydQmna5\",\"title\":\"rotation\",\"dyn_in\":[{\"name\":\"output\",\"dt\":5,\"def\":null,\"uid\":\"vEbx2hrxHrMs\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"vector\",\"x\":761,\"y\":366,\"uid\":\"MSS4MqKJVrfZ\",\"open\":false},{\"plugin\":\"annotation\",\"x\":614,\"y\":146,\"uid\":\"WKvprTgqjQKr\",\"state\":{\"text\":\"Component for Rotation on Y axis.\",\"width\":207,\"height\":80}},{\"plugin\":\"clock_generator\",\"x\":454,\"y\":321,\"uid\":\"y3aUteVxub4w\"},{\"plugin\":\"multiply_modulator\",\"x\":584,\"y\":366,\"uid\":\"APs2xAy2yffd\",\"open\":false,\"title\":\"Multiply\"},{\"plugin\":\"slider_float_generator\",\"x\":355,\"y\":379,\"uid\":\"E3fTqdzV6NNM\",\"state\":{\"val\":1,\"min\":-10,\"max\":10},\"title\":\"Y Rotation Speed\"}],\"conns\":[{\"src_nuid\":\"MSS4MqKJVrfZ\",\"dst_nuid\":\"Yw9hjydQmna5\",\"src_slot\":\"vector\",\"dst_slot\":0,\"uid\":\"xGKNHAcy2Cwt\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"y3aUteVxub4w\",\"dst_nuid\":\"APs2xAy2yffd\",\"src_slot\":\"seconds\",\"dst_slot\":\"a\",\"uid\":\"yccD9FSyubpP\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"E3fTqdzV6NNM\",\"dst_nuid\":\"APs2xAy2yffd\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"2HrPWUrEeYPa\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"APs2xAy2yffd\",\"dst_nuid\":\"MSS4MqKJVrfZ\",\"src_slot\":\"result\",\"dst_slot\":\"y\",\"uid\":\"yTMKzbpSYqRY\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"rotation\",\"dt\":5,\"index\":0,\"uid\":\"hAAWj4zrpu6a\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":\"7RAW4kBwdDZm\",\"dst_nuid\":\"GHGN2HCndg5D\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"Htn4yRLrvW9Z\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true}],\"x1\":652,\"y1\":764,\"x2\":852,\"y2\":823}"
  },
  {
    "path": "browser/patches/components/wobble-y-axis.json",
    "content": "{\"nodes\":[{\"plugin\":\"entity_component\",\"x\":353,\"y\":569,\"uid\":\"B9s6NLUFhEx7\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"vh3vhkHMwZVE\":\"hAAWj4zrpu6a\"}},\"title\":\"Wobble on Y axis\",\"graph\":{\"uid\":\"Huru3nKe58cN\",\"parent_uid\":\"VXrYhepwHyZH\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":825,\"y\":550,\"uid\":\"vh3vhkHMwZVE\",\"title\":\"position\",\"dyn_in\":[{\"name\":\"output\",\"dt\":5,\"def\":null,\"uid\":\"vEbx2hrxHrMs\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"vector\",\"x\":592,\"y\":549,\"uid\":\"rPvZeP2EYb9w\",\"open\":false},{\"plugin\":\"annotation\",\"x\":614,\"y\":146,\"uid\":\"zzVae32Epwr6\",\"state\":{\"text\":\"Wobble the Y position with a sinewave.\",\"width\":207,\"height\":80}},{\"plugin\":\"clock_generator\",\"x\":362,\"y\":415,\"uid\":\"wpjFNWJbSRZ4\"},{\"plugin\":\"sine_modulator\",\"x\":552,\"y\":498,\"uid\":\"dGRYxnQ6ewTs\",\"open\":false},{\"plugin\":\"slider_float_generator\",\"x\":280,\"y\":474,\"uid\":\"9u8Fcpp9SEFd\",\"state\":{\"val\":0.187,\"min\":0,\"max\":1},\"title\":\"Wobble Speed\"},{\"plugin\":\"multiply_modulator\",\"x\":505,\"y\":450,\"uid\":\"QLzyyGMYLGp4\",\"open\":false,\"title\":\"Multiply\"}],\"conns\":[{\"src_nuid\":\"rPvZeP2EYb9w\",\"dst_nuid\":\"vh3vhkHMwZVE\",\"src_slot\":\"vector\",\"dst_slot\":0,\"uid\":\"JzM7HgqjeQUE\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"dGRYxnQ6ewTs\",\"dst_nuid\":\"rPvZeP2EYb9w\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"r7vA9QJTEx9H\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"wpjFNWJbSRZ4\",\"dst_nuid\":\"QLzyyGMYLGp4\",\"src_slot\":\"seconds\",\"dst_slot\":\"a\",\"uid\":\"SJYez7RmA6KK\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"9u8Fcpp9SEFd\",\"dst_nuid\":\"QLzyyGMYLGp4\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"483geGtgJE6d\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"QLzyyGMYLGp4\",\"dst_nuid\":\"dGRYxnQ6ewTs\",\"src_slot\":\"result\",\"dst_slot\":\"time\",\"uid\":\"KY2uwcrvJu6S\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"position\",\"dt\":5,\"index\":0,\"uid\":\"hAAWj4zrpu6a\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":\"B9s6NLUFhEx7\",\"dst_nuid\":\"KuEQ556yBFDK\",\"src_slot\":0,\"dst_slot\":\"position\",\"uid\":\"4sAfB7ZQFkxT\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true}],\"x1\":403,\"y1\":619,\"x2\":597,\"y2\":678}"
  },
  {
    "path": "browser/patches/display_osc.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 1,\n    \"root\": {\n        \"node_uid\": 5,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"text_display\",\n                \"x\": 160,\n                \"y\": 74,\n                \"uid\": 1\n            },\n            {\n                \"plugin\": \"object_display\",\n                \"x\": 160,\n                \"y\": 137,\n                \"uid\": 3\n            },\n            {\n                \"plugin\": \"osc_receiver\",\n                \"x\": 21,\n                \"y\": 74,\n                \"uid\": 4\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 1,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 3,\n                \"src_slot\": 1,\n                \"dst_slot\": 0\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/instancing_array.json",
    "content": "{\n    \"abs_t\": 33.595,\n    \"active_graph\": 0,\n    \"graph_uid\": 43,\n    \"root\": {\n        \"node_uid\": 48,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 376,\n                \"y\": 701,\n                \"uid\": 47,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {},\n                    \"output_sids\": {}\n                },\n                \"title\": \"Array controls\",\n                \"graph\": {\n                    \"node_uid\": 75,\n                    \"uid\": 34,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 905,\n                            \"y\": 121,\n                            \"uid\": 0,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"12\": 2,\n                                    \"13\": 3,\n                                    \"14\": 4,\n                                    \"15\": 5,\n                                    \"18\": 7\n                                },\n                                \"output_sids\": {}\n                            },\n                            \"title\": \"Array instancing\",\n                            \"graph\": {\n                                \"node_uid\": 21,\n                                \"uid\": 35,\n                                \"parent_uid\": 34,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 166,\n                                        \"y\": 128,\n                                        \"uid\": 0,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"0\": 0,\n                                                \"1\": 1,\n                                                \"2\": 2,\n                                                \"4\": 3\n                                            },\n                                            \"output_sids\": {\n                                                \"8\": 4,\n                                                \"9\": 5\n                                            }\n                                        },\n                                        \"title\": \"Compute array parameters\",\n                                        \"graph\": {\n                                            \"node_uid\": 10,\n                                            \"uid\": 36,\n                                            \"parent_uid\": 35,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 29,\n                                                    \"y\": 13,\n                                                    \"uid\": 0,\n                                                    \"dsid\": 14,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"x\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 29,\n                                                    \"y\": 68,\n                                                    \"uid\": 1,\n                                                    \"dsid\": 14,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"y\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 43,\n                                                    \"y\": 123,\n                                                    \"uid\": 2,\n                                                    \"dsid\": 14,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"z\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"vector\",\n                                                    \"x\": 114,\n                                                    \"y\": 13,\n                                                    \"uid\": 3,\n                                                    \"title\": \"offset\"\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 112,\n                                                    \"y\": 109,\n                                                    \"uid\": 4,\n                                                    \"dsid\": 14,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"count\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"vector_scale\",\n                                                    \"x\": 187,\n                                                    \"y\": 89,\n                                                    \"uid\": 5\n                                                },\n                                                {\n                                                    \"plugin\": \"vector_scale\",\n                                                    \"x\": 285,\n                                                    \"y\": 89,\n                                                    \"uid\": 6\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 161,\n                                                    \"y\": 166,\n                                                    \"uid\": 7,\n                                                    \"state\": {\n                                                        \"val\": -0.5\n                                                    }\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 199,\n                                                    \"y\": 14,\n                                                    \"uid\": 8,\n                                                    \"dsid\": 14,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"offset\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 5,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 373,\n                                                    \"y\": 89,\n                                                    \"uid\": 9,\n                                                    \"dsid\": 14,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"start\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 5,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 0,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 1,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 2,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 4,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 6,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 7,\n                                                    \"dst_nuid\": 6,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 6,\n                                                    \"dst_nuid\": 9,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"x\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"y\",\n                                                \"dt\": 0,\n                                                \"uid\": 1,\n                                                \"index\": 1,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"z\",\n                                                \"dt\": 0,\n                                                \"uid\": 2,\n                                                \"index\": 2,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"count\",\n                                                \"dt\": 0,\n                                                \"uid\": 3,\n                                                \"index\": 3,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"offset\",\n                                                \"dt\": 5,\n                                                \"uid\": 4,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            },\n                                            {\n                                                \"name\": \"start\",\n                                                \"dt\": 5,\n                                                \"uid\": 5,\n                                                \"index\": 1,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"scene_renderer_emitter\",\n                                        \"x\": 463,\n                                        \"y\": 94,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"quad_mesh_generator\",\n                                        \"x\": 12,\n                                        \"y\": 9,\n                                        \"uid\": 9\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 365,\n                                        \"y\": 198,\n                                        \"uid\": 12,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 365,\n                                        \"y\": 254,\n                                        \"uid\": 13,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"transform\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 34,\n                                        \"y\": 84,\n                                        \"uid\": 14,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"instance count\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 14,\n                                        \"y\": 209,\n                                        \"uid\": 15,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"instance offset\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"instance_array_modulator\",\n                                        \"x\": 349,\n                                        \"y\": 24,\n                                        \"uid\": 17\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 146,\n                                        \"y\": 369,\n                                        \"uid\": 18,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 17,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 17,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 17,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 17,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 17,\n                                        \"src_slot\": 1,\n                                        \"dst_slot\": 2,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 18,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 2,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"transform\",\n                                    \"dt\": 4,\n                                    \"uid\": 3,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"instance count\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"instance offset\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 7,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 561,\n                            \"y\": 15,\n                            \"uid\": 5,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"13\": 5\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Scale\",\n                            \"graph\": {\n                                \"node_uid\": 16,\n                                \"uid\": 37,\n                                \"parent_uid\": 34,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scale_matrix\",\n                                        \"x\": 259,\n                                        \"y\": 14,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 350,\n                                        \"y\": 14,\n                                        \"uid\": 2,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 142,\n                                        \"y\": 14,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 48,\n                                        \"y\": 15,\n                                        \"uid\": 13,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"scale\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 2\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"scale\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 141,\n                            \"y\": 15,\n                            \"uid\": 6,\n                            \"state\": {\n                                \"val\": 0.72,\n                                \"min\": 0,\n                                \"max\": 2\n                            },\n                            \"title\": \"Quad instance size\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 36,\n                            \"y\": 15,\n                            \"uid\": 7,\n                            \"state\": {\n                                \"val\": 12\n                            },\n                            \"title\": \"instance count\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 576,\n                            \"y\": 115,\n                            \"uid\": 9,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"13\": 5,\n                                    \"14\": 6,\n                                    \"15\": 7\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Translate\",\n                            \"graph\": {\n                                \"node_uid\": 17,\n                                \"uid\": 38,\n                                \"parent_uid\": 34,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 326,\n                                        \"y\": 12,\n                                        \"uid\": 2,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 113,\n                                        \"y\": 12,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 42,\n                                        \"y\": 12,\n                                        \"uid\": 13,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 42,\n                                        \"y\": 71,\n                                        \"uid\": 14,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 51,\n                                        \"y\": 130,\n                                        \"uid\": 15,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"translation_matrix\",\n                                        \"x\": 225,\n                                        \"y\": 12,\n                                        \"uid\": 16\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 370,\n                            \"y\": 115,\n                            \"uid\": 10,\n                            \"state\": {\n                                \"val\": 0.04,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"array x position\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 370,\n                            \"y\": 185,\n                            \"uid\": 11,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"array y position\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 370,\n                            \"y\": 256,\n                            \"uid\": 12,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"array z position\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 337,\n                            \"y\": 15,\n                            \"uid\": 13,\n                            \"state\": {\n                                \"val\": 0.7,\n                                \"min\": 0,\n                                \"max\": 2\n                            },\n                            \"title\": \"instance offset xyz\"\n                        },\n                        {\n                            \"plugin\": \"concatenate_matrix_modulator\",\n                            \"x\": 788,\n                            \"y\": 93,\n                            \"uid\": 15\n                        },\n                        {\n                            \"plugin\": \"color_picker\",\n                            \"x\": 110,\n                            \"y\": 922,\n                            \"uid\": 32,\n                            \"state\": {\n                                \"hue\": 0,\n                                \"sat\": 0,\n                                \"lum\": 1\n                            },\n                            \"title\": \"Diffuse color\"\n                        },\n                        {\n                            \"plugin\": \"color_picker\",\n                            \"x\": 296,\n                            \"y\": 923,\n                            \"uid\": 33,\n                            \"state\": {\n                                \"hue\": 0,\n                                \"sat\": 0,\n                                \"lum\": 1\n                            },\n                            \"title\": \"Specular color\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 469,\n                            \"y\": 632,\n                            \"uid\": 53,\n                            \"dsid\": 14,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"14\": 2,\n                                    \"15\": 3,\n                                    \"16\": 4,\n                                    \"17\": 5,\n                                    \"18\": 6,\n                                    \"19\": 7\n                                },\n                                \"output_sids\": {\n                                    \"27\": 12\n                                }\n                            },\n                            \"title\": \"Light chain\",\n                            \"graph\": {\n                                \"node_uid\": 30,\n                                \"uid\": 39,\n                                \"parent_uid\": 34,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"light_type_modulator\",\n                                        \"x\": 762,\n                                        \"y\": 207,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"light_position_modulator\",\n                                        \"x\": 604,\n                                        \"y\": 215,\n                                        \"uid\": 2\n                                    },\n                                    {\n                                        \"plugin\": \"light_diffuse_color_modulator\",\n                                        \"x\": 200,\n                                        \"y\": 217,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"light_intensity_modulator\",\n                                        \"x\": 430,\n                                        \"y\": 219,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"light_specular_color_modulator\",\n                                        \"x\": 309,\n                                        \"y\": 219,\n                                        \"uid\": 6\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 494,\n                                        \"y\": 380,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 361,\n                                        \"y\": 467,\n                                        \"uid\": 14,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Pos x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 383,\n                                        \"y\": 549,\n                                        \"uid\": 15,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Pos y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 412,\n                                        \"y\": 627,\n                                        \"uid\": 16,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Pos z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 350,\n                                        \"y\": 358,\n                                        \"uid\": 17,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"intensity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 196,\n                                        \"y\": 340,\n                                        \"uid\": 18,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"specular color\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 3,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 93,\n                                        \"y\": 237,\n                                        \"uid\": 19,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"diffuse color\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 3,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 900,\n                                        \"y\": 133,\n                                        \"uid\": 27,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 13,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"light_type_generator\",\n                                        \"x\": 618,\n                                        \"y\": 302,\n                                        \"uid\": 29,\n                                        \"state\": {\n                                            \"type\": 0\n                                        }\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 17,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 18,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 19,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 29,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"Pos x\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Pos y\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Pos z\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"intensity\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"specular color\",\n                                    \"dt\": 3,\n                                    \"uid\": 6,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"diffuse color\",\n                                    \"dt\": 3,\n                                    \"uid\": 7,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"light\",\n                                    \"dt\": 13,\n                                    \"uid\": 12,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 84,\n                            \"y\": 632,\n                            \"uid\": 54,\n                            \"state\": {\n                                \"val\": 0.3333333333333333,\n                                \"min\": \"0\",\n                                \"max\": \"10\"\n                            },\n                            \"title\": \"Intensity\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 85,\n                            \"y\": 707,\n                            \"uid\": 55,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -20,\n                                \"max\": 20\n                            },\n                            \"title\": \"Light position X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 84,\n                            \"y\": 780,\n                            \"uid\": 56,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -20,\n                                \"max\": 20\n                            },\n                            \"title\": \"Light position Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 84,\n                            \"y\": 850,\n                            \"uid\": 57,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -20,\n                                \"max\": 20\n                            },\n                            \"title\": \"Light position Z\"\n                        },\n                        {\n                            \"plugin\": \"color_picker\",\n                            \"x\": 282,\n                            \"y\": 632,\n                            \"uid\": 58,\n                            \"state\": {\n                                \"hue\": 0,\n                                \"sat\": 0,\n                                \"lum\": 1\n                            },\n                            \"title\": \"Diffuse color\"\n                        },\n                        {\n                            \"plugin\": \"color_picker\",\n                            \"x\": 283,\n                            \"y\": 767,\n                            \"uid\": 59,\n                            \"state\": {\n                                \"hue\": 0,\n                                \"sat\": 0,\n                                \"lum\": 1\n                            },\n                            \"title\": \"Specular color\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 631,\n                            \"y\": 403,\n                            \"uid\": 60,\n                            \"dsid\": 20,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"15\": 3,\n                                    \"21\": 4,\n                                    \"22\": 5,\n                                    \"23\": 6,\n                                    \"24\": 7,\n                                    \"25\": 8,\n                                    \"34\": 10,\n                                    \"39\": 12,\n                                    \"40\": 13,\n                                    \"41\": 14,\n                                    \"44\": 16,\n                                    \"47\": 18,\n                                    \"49\": 19\n                                },\n                                \"output_sids\": {\n                                    \"9\": 0\n                                }\n                            },\n                            \"title\": \"Material chain\",\n                            \"graph\": {\n                                \"node_uid\": 50,\n                                \"uid\": 40,\n                                \"parent_uid\": 34,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"material_diffuse_color_modulator\",\n                                        \"x\": 1029,\n                                        \"y\": 68,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"material_alpha_clip_modulator\",\n                                        \"x\": 1137,\n                                        \"y\": 68,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 1025,\n                                        \"y\": 145,\n                                        \"uid\": 6,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Alpha clip\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_texture_modulator\",\n                                        \"x\": 1252,\n                                        \"y\": 68,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 1361,\n                                        \"y\": 68,\n                                        \"uid\": 9,\n                                        \"dsid\": 30,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_blend_mode_modulator\",\n                                        \"x\": 898,\n                                        \"y\": 69,\n                                        \"uid\": 10\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 1173,\n                                        \"y\": 143,\n                                        \"uid\": 15,\n                                        \"dsid\": 30,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Image\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 2,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 134,\n                                        \"uid\": 21,\n                                        \"dsid\": 24,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 798,\n                                        \"y\": 183,\n                                        \"uid\": 22,\n                                        \"dsid\": 24,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 231,\n                                        \"uid\": 23,\n                                        \"dsid\": 24,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 799,\n                                        \"y\": 279,\n                                        \"uid\": 24,\n                                        \"dsid\": 24,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"alpha\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 70,\n                                        \"uid\": 25,\n                                        \"dsid\": 24,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"blend mode\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 907,\n                                        \"y\": 147,\n                                        \"uid\": 26\n                                    },\n                                    {\n                                        \"plugin\": \"material_z_buffer_modulator\",\n                                        \"x\": 672,\n                                        \"y\": 65,\n                                        \"uid\": 27\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 564,\n                                        \"y\": 212,\n                                        \"uid\": 28,\n                                        \"state\": {\n                                            \"enabled\": true\n                                        },\n                                        \"title\": \"Z-buffer\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_shinyness_modulator\",\n                                        \"x\": 558,\n                                        \"y\": 64,\n                                        \"uid\": 31\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 454,\n                                        \"y\": 148,\n                                        \"uid\": 32,\n                                        \"dsid\": 3,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"9\": 0\n                                            },\n                                            \"output_sids\": {\n                                                \"12\": 2\n                                            }\n                                        },\n                                        \"title\": \"min max calc\",\n                                        \"graph\": {\n                                            \"node_uid\": 13,\n                                            \"uid\": 41,\n                                            \"parent_uid\": 40,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 27,\n                                                    \"y\": 190,\n                                                    \"uid\": 2,\n                                                    \"state\": {\n                                                        \"val\": 10\n                                                    },\n                                                    \"title\": \"Maximum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"subtract_modulator\",\n                                                    \"x\": 144,\n                                                    \"y\": 65,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"absolute_modulator\",\n                                                    \"x\": 232,\n                                                    \"y\": 65,\n                                                    \"uid\": 4\n                                                },\n                                                {\n                                                    \"plugin\": \"multiply_modulator\",\n                                                    \"x\": 319,\n                                                    \"y\": 45,\n                                                    \"uid\": 5\n                                                },\n                                                {\n                                                    \"plugin\": \"add_modulator\",\n                                                    \"x\": 401,\n                                                    \"y\": 122,\n                                                    \"uid\": 7\n                                                },\n                                                {\n                                                    \"plugin\": \"min_modulator\",\n                                                    \"x\": 143,\n                                                    \"y\": 142,\n                                                    \"uid\": 8\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 248,\n                                                    \"y\": 9,\n                                                    \"uid\": 9,\n                                                    \"dsid\": 22,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 10,\n                                                    \"y\": 85,\n                                                    \"uid\": 11,\n                                                    \"state\": {\n                                                        \"val\": 0\n                                                    },\n                                                    \"title\": \"Minimum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 486,\n                                                    \"y\": 122,\n                                                    \"uid\": 12,\n                                                    \"dsid\": 22,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 4,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 4,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 7,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 8,\n                                                    \"dst_nuid\": 7,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 9,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 7,\n                                                    \"dst_nuid\": 12,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 2,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 361,\n                                        \"y\": 242,\n                                        \"uid\": 34,\n                                        \"dsid\": 18,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"shinyness\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_double_sided_modulator\",\n                                        \"x\": 437,\n                                        \"y\": 61,\n                                        \"uid\": 35\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 323,\n                                        \"y\": 161,\n                                        \"uid\": 36,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Double-sided\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_ambient_color_modulator\",\n                                        \"x\": 290,\n                                        \"y\": 73,\n                                        \"uid\": 37\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 63,\n                                        \"y\": 153,\n                                        \"uid\": 39,\n                                        \"dsid\": 25,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 60,\n                                        \"y\": 202,\n                                        \"uid\": 40,\n                                        \"dsid\": 25,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 63,\n                                        \"y\": 250,\n                                        \"uid\": 41,\n                                        \"dsid\": 25,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 170,\n                                        \"y\": 166,\n                                        \"uid\": 43\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 61,\n                                        \"y\": 99,\n                                        \"uid\": 44,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 40,\n                                        \"y\": 52,\n                                        \"uid\": 47,\n                                        \"dsid\": 9,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 13,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_light_modulator\",\n                                        \"x\": 158,\n                                        \"y\": 22,\n                                        \"uid\": 48\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 54,\n                                        \"y\": 0,\n                                        \"uid\": 49,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light index\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 27,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 28,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 31,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 32,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 34,\n                                        \"dst_nuid\": 32,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 35,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 36,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 37,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 39,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 40,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 41,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 43,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 47,\n                                        \"dst_nuid\": 48,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 44,\n                                        \"dst_nuid\": 48,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 48,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 49,\n                                        \"dst_nuid\": 48,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"Image\",\n                                    \"dt\": 2,\n                                    \"uid\": 3,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"alpha\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"blend mode\",\n                                    \"dt\": 0,\n                                    \"uid\": 8,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"shinyness\",\n                                    \"dt\": 0,\n                                    \"uid\": 10,\n                                    \"index\": 6,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 12,\n                                    \"index\": 7,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 13,\n                                    \"index\": 8,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 14,\n                                    \"index\": 9,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 16,\n                                    \"index\": 10,\n                                    \"type\": 0,\n                                    \"is_connected\": false\n                                },\n                                {\n                                    \"name\": \"light\",\n                                    \"dt\": 13,\n                                    \"uid\": 18,\n                                    \"index\": 11,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"light index\",\n                                    \"dt\": 0,\n                                    \"uid\": 19,\n                                    \"index\": 12,\n                                    \"type\": 0\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"url_texture_generator\",\n                            \"x\": 214,\n                            \"y\": 403,\n                            \"uid\": 61,\n                            \"state\": {\n                                \"url\": \"/data/image/57422df4c11a76d5531ef36299d5d1ac5b6b6739.jpg\"\n                            },\n                            \"title\": \"Image\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 317,\n                            \"y\": 403,\n                            \"uid\": 62,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 390,\n                            \"y\": 403,\n                            \"uid\": 63,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Saturation\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 469,\n                            \"y\": 403,\n                            \"uid\": 64,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Luminosity\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 550,\n                            \"y\": 403,\n                            \"uid\": 65,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Alpha\"\n                        },\n                        {\n                            \"plugin\": \"blend_mode_generator\",\n                            \"x\": 471,\n                            \"y\": 469,\n                            \"uid\": 66,\n                            \"state\": {\n                                \"mode\": 4\n                            }\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 390,\n                            \"y\": 469,\n                            \"uid\": 67,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Shinyness\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 349,\n                            \"y\": 541,\n                            \"uid\": 68,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Ambient Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 441,\n                            \"y\": 541,\n                            \"uid\": 69,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Ambient Sat\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 529,\n                            \"y\": 541,\n                            \"uid\": 70,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Ambient Lum\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 228,\n                            \"y\": 170,\n                            \"uid\": 71,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"0\": 0,\n                                    \"1\": 1,\n                                    \"2\": 2\n                                },\n                                \"output_sids\": {\n                                    \"3\": 3\n                                }\n                            },\n                            \"title\": \"Camera\",\n                            \"graph\": {\n                                \"node_uid\": 25,\n                                \"uid\": 42,\n                                \"parent_uid\": 34,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 74,\n                                        \"y\": 173,\n                                        \"uid\": 0,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"rotation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 129,\n                                        \"y\": 89,\n                                        \"uid\": 1,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"elevation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 52,\n                                        \"y\": 48,\n                                        \"uid\": 2,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"dolly\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 558,\n                                        \"y\": 35,\n                                        \"uid\": 3,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"perspective_camera\",\n                                        \"x\": 448,\n                                        \"y\": 75,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 218,\n                                        \"y\": 28,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"rotation_xyz_matrix\",\n                                        \"x\": 160,\n                                        \"y\": 153,\n                                        \"uid\": 6\n                                    },\n                                    {\n                                        \"plugin\": \"vector_transform\",\n                                        \"x\": 342,\n                                        \"y\": 77,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 219,\n                                        \"y\": 267,\n                                        \"uid\": 21\n                                    },\n                                    {\n                                        \"plugin\": \"vector_transform\",\n                                        \"x\": 341,\n                                        \"y\": 190,\n                                        \"uid\": 22\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 104,\n                                        \"y\": 287,\n                                        \"uid\": 23,\n                                        \"state\": {\n                                            \"val\": 0.5\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"negate_modulator\",\n                                        \"x\": 132,\n                                        \"y\": 33,\n                                        \"uid\": 24\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 22,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 22,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 4\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 24,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"rotation\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"elevation\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"dolly\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 3,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 9,\n                            \"y\": 127,\n                            \"uid\": 72,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -180,\n                                \"max\": 180\n                            },\n                            \"title\": \"Rotation\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 9,\n                            \"y\": 210,\n                            \"uid\": 73,\n                            \"state\": {\n                                \"val\": -12,\n                                \"min\": \"-20\",\n                                \"max\": \"20\"\n                            },\n                            \"title\": \"Elevation\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 9,\n                            \"y\": 293,\n                            \"uid\": 74,\n                            \"state\": {\n                                \"val\": 5.5,\n                                \"min\": \"0\",\n                                \"max\": \"10\"\n                            },\n                            \"title\": \"Dolly\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 15,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 15,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 54,\n                            \"dst_nuid\": 53,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 55,\n                            \"dst_nuid\": 53,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 56,\n                            \"dst_nuid\": 53,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 57,\n                            \"dst_nuid\": 53,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 58,\n                            \"dst_nuid\": 53,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 59,\n                            \"dst_nuid\": 53,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 61,\n                            \"dst_nuid\": 60,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 62,\n                            \"dst_nuid\": 60,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 63,\n                            \"dst_nuid\": 60,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 64,\n                            \"dst_nuid\": 60,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 65,\n                            \"dst_nuid\": 60,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 66,\n                            \"dst_nuid\": 60,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 67,\n                            \"dst_nuid\": 60,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 6,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 70,\n                            \"dst_nuid\": 60,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 9,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 69,\n                            \"dst_nuid\": 60,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 8,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 68,\n                            \"dst_nuid\": 60,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 7,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 53,\n                            \"dst_nuid\": 60,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 11,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 60,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 72,\n                            \"dst_nuid\": 71,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 73,\n                            \"dst_nuid\": 71,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 74,\n                            \"dst_nuid\": 71,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 71,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                }\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/instancing_cube.json",
    "content": "{\n    \"abs_t\": 53.942,\n    \"active_graph\": 0,\n    \"graph_uid\": 34,\n    \"root\": {\n        \"node_uid\": 47,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 376,\n                \"y\": 701,\n                \"uid\": 46,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {},\n                    \"output_sids\": {}\n                },\n                \"title\": \"Cube controls\",\n                \"graph\": {\n                    \"node_uid\": 72,\n                    \"uid\": 25,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 867,\n                            \"y\": 137,\n                            \"uid\": 0,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"12\": 2,\n                                    \"13\": 3,\n                                    \"14\": 4,\n                                    \"15\": 5,\n                                    \"24\": 7\n                                },\n                                \"output_sids\": {}\n                            },\n                            \"title\": \"Cube instancing\",\n                            \"graph\": {\n                                \"node_uid\": 29,\n                                \"uid\": 26,\n                                \"parent_uid\": 25,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 232,\n                                        \"y\": 274,\n                                        \"uid\": 0,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"0\": 0,\n                                                \"1\": 1,\n                                                \"2\": 2,\n                                                \"4\": 3\n                                            },\n                                            \"output_sids\": {\n                                                \"8\": 4,\n                                                \"9\": 5\n                                            }\n                                        },\n                                        \"title\": \"Compute array parameters\",\n                                        \"graph\": {\n                                            \"node_uid\": 10,\n                                            \"uid\": 27,\n                                            \"parent_uid\": 26,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 7,\n                                                    \"y\": 9,\n                                                    \"uid\": 0,\n                                                    \"dsid\": 14,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"x\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 10,\n                                                    \"y\": 76,\n                                                    \"uid\": 1,\n                                                    \"dsid\": 14,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"y\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 28,\n                                                    \"y\": 139,\n                                                    \"uid\": 2,\n                                                    \"dsid\": 14,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"z\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"vector\",\n                                                    \"x\": 102,\n                                                    \"y\": 8,\n                                                    \"uid\": 3,\n                                                    \"title\": \"offset\"\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 101,\n                                                    \"y\": 107,\n                                                    \"uid\": 4,\n                                                    \"dsid\": 14,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"count\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"vector_scale\",\n                                                    \"x\": 187,\n                                                    \"y\": 51,\n                                                    \"uid\": 5\n                                                },\n                                                {\n                                                    \"plugin\": \"vector_scale\",\n                                                    \"x\": 288,\n                                                    \"y\": 90,\n                                                    \"uid\": 6\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 101,\n                                                    \"y\": 165,\n                                                    \"uid\": 7,\n                                                    \"state\": {\n                                                        \"val\": -0.5\n                                                    }\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 269,\n                                                    \"y\": 9,\n                                                    \"uid\": 8,\n                                                    \"dsid\": 14,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"offset\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 5,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 379,\n                                                    \"y\": 90,\n                                                    \"uid\": 9,\n                                                    \"dsid\": 14,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"start\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 5,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 0,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 1,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 2,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 4,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 6,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 7,\n                                                    \"dst_nuid\": 6,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 6,\n                                                    \"dst_nuid\": 9,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"x\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"y\",\n                                                \"dt\": 0,\n                                                \"uid\": 1,\n                                                \"index\": 1,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"z\",\n                                                \"dt\": 0,\n                                                \"uid\": 2,\n                                                \"index\": 2,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"count\",\n                                                \"dt\": 0,\n                                                \"uid\": 3,\n                                                \"index\": 3,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"offset\",\n                                                \"dt\": 5,\n                                                \"uid\": 4,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            },\n                                            {\n                                                \"name\": \"start\",\n                                                \"dt\": 5,\n                                                \"uid\": 5,\n                                                \"index\": 1,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"scene_renderer_emitter\",\n                                        \"x\": 856,\n                                        \"y\": 82,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"instance_cube_modulator\",\n                                        \"x\": 429,\n                                        \"y\": 87,\n                                        \"uid\": 2\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 223,\n                                        \"y\": 30,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 536,\n                                        \"y\": 189,\n                                        \"uid\": 12,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 533,\n                                        \"y\": 258,\n                                        \"uid\": 13,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"transform\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 85,\n                                        \"y\": 8,\n                                        \"uid\": 14,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"instance count\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 72,\n                                        \"y\": 334,\n                                        \"uid\": 15,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"instance offset\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 492,\n                                        \"y\": 405,\n                                        \"uid\": 24,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"sphere_mesh_generator\",\n                                        \"x\": 235,\n                                        \"y\": 164,\n                                        \"uid\": 27,\n                                        \"state\": {\n                                            \"v_res\": 25,\n                                            \"h_res\": 25\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 84,\n                                        \"y\": 223,\n                                        \"uid\": 28,\n                                        \"state\": {\n                                            \"val\": 25\n                                        }\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 1,\n                                        \"dst_slot\": 2,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true,\n                                        \"offset\": 3\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 27,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 28,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 28,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 2,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"transform\",\n                                    \"dt\": 4,\n                                    \"uid\": 3,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"instance count\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"instance offset\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 7,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 481,\n                            \"y\": 346,\n                            \"uid\": 5,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"13\": 5\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Scale\",\n                            \"graph\": {\n                                \"node_uid\": 16,\n                                \"uid\": 28,\n                                \"parent_uid\": 25,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scale_matrix\",\n                                        \"x\": 207,\n                                        \"y\": 43,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 296,\n                                        \"y\": 43,\n                                        \"uid\": 2,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 95,\n                                        \"y\": 43,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 8,\n                                        \"y\": 9,\n                                        \"uid\": 13,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"scale\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 2\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"scale\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 257,\n                            \"y\": 17,\n                            \"uid\": 6,\n                            \"state\": {\n                                \"val\": 0.21,\n                                \"min\": 0,\n                                \"max\": 1\n                            },\n                            \"title\": \"Instance scale\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 16,\n                            \"y\": 18,\n                            \"uid\": 7,\n                            \"state\": {\n                                \"val\": 4\n                            },\n                            \"title\": \"instance count\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 481,\n                            \"y\": 230,\n                            \"uid\": 9,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"13\": 5,\n                                    \"14\": 6,\n                                    \"15\": 7\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Translate\",\n                            \"graph\": {\n                                \"node_uid\": 17,\n                                \"uid\": 29,\n                                \"parent_uid\": 25,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 296,\n                                        \"y\": 12,\n                                        \"uid\": 2,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 82,\n                                        \"y\": 11,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 15,\n                                        \"y\": 12,\n                                        \"uid\": 13,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 14,\n                                        \"y\": 67,\n                                        \"uid\": 14,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 20,\n                                        \"y\": 124,\n                                        \"uid\": 15,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"translation_matrix\",\n                                        \"x\": 195,\n                                        \"y\": 12,\n                                        \"uid\": 16\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 210,\n                            \"y\": 115,\n                            \"uid\": 10,\n                            \"state\": {\n                                \"val\": 0.52,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"cube x position\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 210,\n                            \"y\": 186,\n                            \"uid\": 11,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"cube y position\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 209,\n                            \"y\": 256,\n                            \"uid\": 12,\n                            \"state\": {\n                                \"val\": 1.16,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"cube z position\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 644,\n                            \"y\": 37,\n                            \"uid\": 13,\n                            \"state\": {\n                                \"val\": 0.92,\n                                \"min\": 0,\n                                \"max\": 2\n                            },\n                            \"title\": \"instance offset xyz\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 690,\n                            \"y\": 474,\n                            \"uid\": 45,\n                            \"dsid\": 20,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"15\": 3,\n                                    \"21\": 4,\n                                    \"22\": 5,\n                                    \"23\": 6,\n                                    \"24\": 7,\n                                    \"25\": 8,\n                                    \"34\": 10,\n                                    \"39\": 12,\n                                    \"40\": 13,\n                                    \"41\": 14,\n                                    \"44\": 16,\n                                    \"47\": 18,\n                                    \"49\": 19\n                                },\n                                \"output_sids\": {\n                                    \"9\": 0\n                                }\n                            },\n                            \"title\": \"Material chain\",\n                            \"graph\": {\n                                \"node_uid\": 51,\n                                \"uid\": 30,\n                                \"parent_uid\": 25,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"material_diffuse_color_modulator\",\n                                        \"x\": 1029,\n                                        \"y\": 68,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"material_alpha_clip_modulator\",\n                                        \"x\": 1137,\n                                        \"y\": 68,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 1025,\n                                        \"y\": 145,\n                                        \"uid\": 6,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Alpha clip\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_texture_modulator\",\n                                        \"x\": 1252,\n                                        \"y\": 68,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 1361,\n                                        \"y\": 68,\n                                        \"uid\": 9,\n                                        \"dsid\": 31,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_blend_mode_modulator\",\n                                        \"x\": 898,\n                                        \"y\": 69,\n                                        \"uid\": 10\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 1173,\n                                        \"y\": 143,\n                                        \"uid\": 15,\n                                        \"dsid\": 31,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Image\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 2,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 134,\n                                        \"uid\": 21,\n                                        \"dsid\": 25,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 798,\n                                        \"y\": 183,\n                                        \"uid\": 22,\n                                        \"dsid\": 25,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 231,\n                                        \"uid\": 23,\n                                        \"dsid\": 25,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 799,\n                                        \"y\": 279,\n                                        \"uid\": 24,\n                                        \"dsid\": 25,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"alpha\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 70,\n                                        \"uid\": 25,\n                                        \"dsid\": 25,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"blend mode\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 907,\n                                        \"y\": 147,\n                                        \"uid\": 26\n                                    },\n                                    {\n                                        \"plugin\": \"material_z_buffer_modulator\",\n                                        \"x\": 672,\n                                        \"y\": 65,\n                                        \"uid\": 27\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 564,\n                                        \"y\": 212,\n                                        \"uid\": 28,\n                                        \"state\": {\n                                            \"enabled\": true\n                                        },\n                                        \"title\": \"Z-buffer\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_shinyness_modulator\",\n                                        \"x\": 558,\n                                        \"y\": 64,\n                                        \"uid\": 31\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 454,\n                                        \"y\": 148,\n                                        \"uid\": 32,\n                                        \"dsid\": 3,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"9\": 0\n                                            },\n                                            \"output_sids\": {\n                                                \"12\": 2\n                                            }\n                                        },\n                                        \"title\": \"min max calc\",\n                                        \"graph\": {\n                                            \"node_uid\": 13,\n                                            \"uid\": 31,\n                                            \"parent_uid\": 30,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 27,\n                                                    \"y\": 190,\n                                                    \"uid\": 2,\n                                                    \"state\": {\n                                                        \"val\": 10\n                                                    },\n                                                    \"title\": \"Maximum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"subtract_modulator\",\n                                                    \"x\": 144,\n                                                    \"y\": 65,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"absolute_modulator\",\n                                                    \"x\": 232,\n                                                    \"y\": 65,\n                                                    \"uid\": 4\n                                                },\n                                                {\n                                                    \"plugin\": \"multiply_modulator\",\n                                                    \"x\": 319,\n                                                    \"y\": 45,\n                                                    \"uid\": 5\n                                                },\n                                                {\n                                                    \"plugin\": \"add_modulator\",\n                                                    \"x\": 401,\n                                                    \"y\": 122,\n                                                    \"uid\": 7\n                                                },\n                                                {\n                                                    \"plugin\": \"min_modulator\",\n                                                    \"x\": 143,\n                                                    \"y\": 142,\n                                                    \"uid\": 8\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 248,\n                                                    \"y\": 9,\n                                                    \"uid\": 9,\n                                                    \"dsid\": 23,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 10,\n                                                    \"y\": 85,\n                                                    \"uid\": 11,\n                                                    \"state\": {\n                                                        \"val\": 0\n                                                    },\n                                                    \"title\": \"Minimum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 486,\n                                                    \"y\": 122,\n                                                    \"uid\": 12,\n                                                    \"dsid\": 23,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 4,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 4,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 7,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 8,\n                                                    \"dst_nuid\": 7,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 9,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 7,\n                                                    \"dst_nuid\": 12,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 2,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 361,\n                                        \"y\": 242,\n                                        \"uid\": 34,\n                                        \"dsid\": 19,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"shinyness\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_double_sided_modulator\",\n                                        \"x\": 437,\n                                        \"y\": 61,\n                                        \"uid\": 35\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 323,\n                                        \"y\": 161,\n                                        \"uid\": 36,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Double-sided\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_ambient_color_modulator\",\n                                        \"x\": 290,\n                                        \"y\": 73,\n                                        \"uid\": 37\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 63,\n                                        \"y\": 153,\n                                        \"uid\": 39,\n                                        \"dsid\": 26,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 60,\n                                        \"y\": 202,\n                                        \"uid\": 40,\n                                        \"dsid\": 26,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 63,\n                                        \"y\": 250,\n                                        \"uid\": 41,\n                                        \"dsid\": 26,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 170,\n                                        \"y\": 166,\n                                        \"uid\": 43\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 61,\n                                        \"y\": 99,\n                                        \"uid\": 44,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 40,\n                                        \"y\": 52,\n                                        \"uid\": 47,\n                                        \"dsid\": 10,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 13,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_light_modulator\",\n                                        \"x\": 158,\n                                        \"y\": 22,\n                                        \"uid\": 48\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 54,\n                                        \"y\": 0,\n                                        \"uid\": 49,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light index\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 574,\n                                        \"y\": 276,\n                                        \"uid\": 50,\n                                        \"state\": {\n                                            \"enabled\": true\n                                        },\n                                        \"title\": \"Depth write\"\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 27,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 28,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 31,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 32,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 34,\n                                        \"dst_nuid\": 32,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 35,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 36,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 37,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 39,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 40,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 41,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 43,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 47,\n                                        \"dst_nuid\": 48,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 44,\n                                        \"dst_nuid\": 48,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 48,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 49,\n                                        \"dst_nuid\": 48,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 50,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"Image\",\n                                    \"dt\": 2,\n                                    \"uid\": 3,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"alpha\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"blend mode\",\n                                    \"dt\": 0,\n                                    \"uid\": 8,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"shinyness\",\n                                    \"dt\": 0,\n                                    \"uid\": 10,\n                                    \"index\": 6,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 12,\n                                    \"index\": 7,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 13,\n                                    \"index\": 8,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 14,\n                                    \"index\": 9,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 16,\n                                    \"index\": 10,\n                                    \"type\": 0,\n                                    \"is_connected\": false\n                                },\n                                {\n                                    \"name\": \"light\",\n                                    \"dt\": 13,\n                                    \"uid\": 18,\n                                    \"index\": 11,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"light index\",\n                                    \"dt\": 0,\n                                    \"uid\": 19,\n                                    \"index\": 12,\n                                    \"type\": 0\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"url_texture_generator\",\n                            \"x\": 220,\n                            \"y\": 474,\n                            \"uid\": 46,\n                            \"state\": {\n                                \"url\": \"/data/image/57422df4c11a76d5531ef36299d5d1ac5b6b6739.jpg\"\n                            },\n                            \"title\": \"Image\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 324,\n                            \"y\": 472,\n                            \"uid\": 47,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 396,\n                            \"y\": 474,\n                            \"uid\": 48,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Saturation\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 475,\n                            \"y\": 474,\n                            \"uid\": 49,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Luminosity\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 556,\n                            \"y\": 474,\n                            \"uid\": 50,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Alpha\"\n                        },\n                        {\n                            \"plugin\": \"blend_mode_generator\",\n                            \"x\": 220,\n                            \"y\": 539,\n                            \"uid\": 51,\n                            \"state\": {\n                                \"mode\": 4\n                            }\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 220,\n                            \"y\": 595,\n                            \"uid\": 52,\n                            \"state\": {\n                                \"val\": 0.04\n                            },\n                            \"title\": \"Shinyness\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 365,\n                            \"y\": 539,\n                            \"uid\": 53,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Ambient Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 457,\n                            \"y\": 539,\n                            \"uid\": 54,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Ambient Sat\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 545,\n                            \"y\": 539,\n                            \"uid\": 55,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Ambient Lum\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 509,\n                            \"y\": 707,\n                            \"uid\": 56,\n                            \"dsid\": 16,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"13\": 1,\n                                    \"14\": 2,\n                                    \"15\": 3,\n                                    \"16\": 4,\n                                    \"17\": 5,\n                                    \"18\": 6,\n                                    \"19\": 7,\n                                    \"22\": 8,\n                                    \"23\": 9,\n                                    \"24\": 10\n                                },\n                                \"output_sids\": {\n                                    \"30\": 15\n                                }\n                            },\n                            \"title\": \"Light chain\",\n                            \"graph\": {\n                                \"node_uid\": 31,\n                                \"uid\": 32,\n                                \"parent_uid\": 25,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"light_type_modulator\",\n                                        \"x\": 692,\n                                        \"y\": 216,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"light_position_modulator\",\n                                        \"x\": 604,\n                                        \"y\": 215,\n                                        \"uid\": 2\n                                    },\n                                    {\n                                        \"plugin\": \"light_diffuse_color_modulator\",\n                                        \"x\": 200,\n                                        \"y\": 217,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"light_direction_modulator\",\n                                        \"x\": 521,\n                                        \"y\": 215,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"light_intensity_modulator\",\n                                        \"x\": 430,\n                                        \"y\": 219,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"light_specular_color_modulator\",\n                                        \"x\": 309,\n                                        \"y\": 219,\n                                        \"uid\": 6\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 494,\n                                        \"y\": 380,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 609,\n                                        \"y\": 401,\n                                        \"uid\": 13,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light type\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 413,\n                                        \"y\": 532,\n                                        \"uid\": 14,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Pos x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 412,\n                                        \"y\": 581,\n                                        \"uid\": 15,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Pos y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 412,\n                                        \"y\": 627,\n                                        \"uid\": 16,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Pos z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 350,\n                                        \"y\": 358,\n                                        \"uid\": 17,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"intensity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 196,\n                                        \"y\": 340,\n                                        \"uid\": 18,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"specular color\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 3,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 80,\n                                        \"y\": 347,\n                                        \"uid\": 19,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"diffuse color\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 3,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector_normalize\",\n                                        \"x\": 361,\n                                        \"y\": 452,\n                                        \"uid\": 20\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 248,\n                                        \"y\": 461,\n                                        \"uid\": 21\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 146,\n                                        \"y\": 479,\n                                        \"uid\": 22,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Dir x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 145,\n                                        \"y\": 528,\n                                        \"uid\": 23,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Dir y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 145,\n                                        \"y\": 574,\n                                        \"uid\": 24,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Dir z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 795,\n                                        \"y\": 219,\n                                        \"uid\": 30,\n                                        \"dsid\": 5,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 13,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 17,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 18,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 19,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 20,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 30,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"light type\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Pos x\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Pos y\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Pos z\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"intensity\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"specular color\",\n                                    \"dt\": 3,\n                                    \"uid\": 6,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"diffuse color\",\n                                    \"dt\": 3,\n                                    \"uid\": 7,\n                                    \"index\": 6,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Dir x\",\n                                    \"dt\": 0,\n                                    \"uid\": 8,\n                                    \"index\": 7,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Dir y\",\n                                    \"dt\": 0,\n                                    \"uid\": 9,\n                                    \"index\": 8,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Dir z\",\n                                    \"dt\": 0,\n                                    \"uid\": 10,\n                                    \"index\": 9,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"light\",\n                                    \"dt\": 13,\n                                    \"uid\": 15,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"light_type_generator\",\n                            \"x\": 105,\n                            \"y\": 707,\n                            \"uid\": 57,\n                            \"state\": {\n                                \"type\": 0\n                            }\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 307,\n                            \"y\": 707,\n                            \"uid\": 58,\n                            \"state\": {\n                                \"val\": 1.5,\n                                \"min\": \"0\",\n                                \"max\": \"10\"\n                            },\n                            \"title\": \"Intensity\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 106,\n                            \"y\": 780,\n                            \"uid\": 59,\n                            \"state\": {\n                                \"val\": -0.8,\n                                \"min\": -20,\n                                \"max\": 20\n                            },\n                            \"title\": \"Light position X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 106,\n                            \"y\": 846,\n                            \"uid\": 60,\n                            \"state\": {\n                                \"val\": -7.333333333333335,\n                                \"min\": \"-20\",\n                                \"max\": \"20\"\n                            },\n                            \"title\": \"Light position Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 106,\n                            \"y\": 914,\n                            \"uid\": 61,\n                            \"state\": {\n                                \"val\": 1.2,\n                                \"min\": -20,\n                                \"max\": 20\n                            },\n                            \"title\": \"Light position Z\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 304,\n                            \"y\": 781,\n                            \"uid\": 62,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Light direction X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 304,\n                            \"y\": 850,\n                            \"uid\": 63,\n                            \"state\": {\n                                \"val\": 0.04,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Light direction Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 304,\n                            \"y\": 915,\n                            \"uid\": 64,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Light direction z\"\n                        },\n                        {\n                            \"plugin\": \"color_picker\",\n                            \"x\": 108,\n                            \"y\": 995,\n                            \"uid\": 65,\n                            \"state\": {\n                                \"hue\": 0,\n                                \"sat\": 0,\n                                \"lum\": 0.98\n                            },\n                            \"title\": \"Diffuse color\"\n                        },\n                        {\n                            \"plugin\": \"color_picker\",\n                            \"x\": 294,\n                            \"y\": 996,\n                            \"uid\": 66,\n                            \"state\": {\n                                \"hue\": 0,\n                                \"sat\": 0,\n                                \"lum\": 1\n                            },\n                            \"title\": \"Specular color\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 226,\n                            \"y\": 349,\n                            \"uid\": 67,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"0\": 0,\n                                    \"1\": 1,\n                                    \"2\": 2\n                                },\n                                \"output_sids\": {\n                                    \"3\": 3\n                                }\n                            },\n                            \"title\": \"Camera\",\n                            \"graph\": {\n                                \"node_uid\": 25,\n                                \"uid\": 33,\n                                \"parent_uid\": 25,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 74,\n                                        \"y\": 173,\n                                        \"uid\": 0,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"rotation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 129,\n                                        \"y\": 89,\n                                        \"uid\": 1,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"elevation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 52,\n                                        \"y\": 48,\n                                        \"uid\": 2,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"dolly\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 558,\n                                        \"y\": 35,\n                                        \"uid\": 3,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"perspective_camera\",\n                                        \"x\": 448,\n                                        \"y\": 75,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 218,\n                                        \"y\": 28,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"rotation_xyz_matrix\",\n                                        \"x\": 160,\n                                        \"y\": 153,\n                                        \"uid\": 6\n                                    },\n                                    {\n                                        \"plugin\": \"vector_transform\",\n                                        \"x\": 342,\n                                        \"y\": 77,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 219,\n                                        \"y\": 267,\n                                        \"uid\": 21\n                                    },\n                                    {\n                                        \"plugin\": \"vector_transform\",\n                                        \"x\": 341,\n                                        \"y\": 190,\n                                        \"uid\": 22\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 104,\n                                        \"y\": 287,\n                                        \"uid\": 23,\n                                        \"state\": {\n                                            \"val\": 0.5\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"negate_modulator\",\n                                        \"x\": 132,\n                                        \"y\": 33,\n                                        \"uid\": 24\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 22,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 22,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 4\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 24,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"rotation\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"elevation\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"dolly\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 3,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 7,\n                            \"y\": 306,\n                            \"uid\": 68,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -180,\n                                \"max\": 180\n                            },\n                            \"title\": \"Rotation\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 7,\n                            \"y\": 389,\n                            \"uid\": 69,\n                            \"state\": {\n                                \"val\": 2.4,\n                                \"min\": -20,\n                                \"max\": 20\n                            },\n                            \"title\": \"Elevation\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 7,\n                            \"y\": 472,\n                            \"uid\": 70,\n                            \"state\": {\n                                \"val\": 4.6,\n                                \"min\": 0,\n                                \"max\": 10\n                            },\n                            \"title\": \"Dolly\"\n                        },\n                        {\n                            \"plugin\": \"concatenate_matrix_modulator\",\n                            \"x\": 679,\n                            \"y\": 276,\n                            \"uid\": 71\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 46,\n                            \"dst_nuid\": 45,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 47,\n                            \"dst_nuid\": 45,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 48,\n                            \"dst_nuid\": 45,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 49,\n                            \"dst_nuid\": 45,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 50,\n                            \"dst_nuid\": 45,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 51,\n                            \"dst_nuid\": 45,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 52,\n                            \"dst_nuid\": 45,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 6,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 55,\n                            \"dst_nuid\": 45,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 9,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 54,\n                            \"dst_nuid\": 45,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 8,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 53,\n                            \"dst_nuid\": 45,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 7,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 57,\n                            \"dst_nuid\": 56,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 58,\n                            \"dst_nuid\": 56,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 59,\n                            \"dst_nuid\": 56,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 60,\n                            \"dst_nuid\": 56,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 61,\n                            \"dst_nuid\": 56,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 62,\n                            \"dst_nuid\": 56,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 7,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 63,\n                            \"dst_nuid\": 56,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 8,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 64,\n                            \"dst_nuid\": 56,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 9,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 65,\n                            \"dst_nuid\": 56,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 6,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 66,\n                            \"dst_nuid\": 56,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 56,\n                            \"dst_nuid\": 45,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 11,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 45,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 68,\n                            \"dst_nuid\": 67,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 69,\n                            \"dst_nuid\": 67,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 70,\n                            \"dst_nuid\": 67,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 67,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 71,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 71,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 71,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true\n                        }\n                    ]\n                }\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/instancing_ifs.json",
    "content": "{\n    \"abs_t\": 30.301,\n    \"active_graph\": 0,\n    \"graph_uid\": 70,\n    \"root\": {\n        \"node_uid\": 49,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 376,\n                \"y\": 592,\n                \"uid\": 48,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {},\n                    \"output_sids\": {}\n                },\n                \"title\": \"IFS controls\",\n                \"graph\": {\n                    \"node_uid\": 94,\n                    \"uid\": 43,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 943,\n                            \"y\": 71,\n                            \"uid\": 0,\n                            \"dsid\": 24,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"5\": 0,\n                                    \"13\": 1,\n                                    \"25\": 2,\n                                    \"26\": 3,\n                                    \"27\": 4,\n                                    \"28\": 5,\n                                    \"29\": 6,\n                                    \"30\": 7,\n                                    \"31\": 8,\n                                    \"32\": 9,\n                                    \"33\": 10,\n                                    \"47\": 12,\n                                    \"48\": 13,\n                                    \"49\": 14,\n                                    \"50\": 15,\n                                    \"51\": 16,\n                                    \"52\": 17,\n                                    \"53\": 18,\n                                    \"54\": 19,\n                                    \"55\": 20,\n                                    \"56\": 21,\n                                    \"57\": 22,\n                                    \"58\": 23\n                                },\n                                \"output_sids\": {}\n                            },\n                            \"title\": \"IFS system\",\n                            \"graph\": {\n                                \"node_uid\": 69,\n                                \"uid\": 44,\n                                \"parent_uid\": 43,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"instance_ifs_modulator\",\n                                        \"x\": 771,\n                                        \"y\": 57,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"scene_renderer_emitter\",\n                                        \"x\": 1042,\n                                        \"y\": 65,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 597,\n                                        \"y\": 55,\n                                        \"uid\": 5,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"recursion depth\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 605,\n                                        \"y\": 108,\n                                        \"uid\": 13,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"mesh\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 9,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 284,\n                                        \"y\": 47,\n                                        \"uid\": 15,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"13\": 5,\n                                                \"14\": 6,\n                                                \"15\": 7\n                                            },\n                                            \"output_sids\": {\n                                                \"2\": 1\n                                            }\n                                        },\n                                        \"title\": \"Translate\",\n                                        \"graph\": {\n                                            \"node_uid\": 17,\n                                            \"uid\": 45,\n                                            \"parent_uid\": 44,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 525,\n                                                    \"y\": 243,\n                                                    \"uid\": 2,\n                                                    \"dsid\": 17,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"vector\",\n                                                    \"x\": 331,\n                                                    \"y\": 241,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 173,\n                                                    \"y\": 314,\n                                                    \"uid\": 13,\n                                                    \"dsid\": 17,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"x\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 204,\n                                                    \"y\": 397,\n                                                    \"uid\": 14,\n                                                    \"dsid\": 17,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"y\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 223,\n                                                    \"y\": 456,\n                                                    \"uid\": 15,\n                                                    \"dsid\": 17,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"z\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"translation_matrix\",\n                                                    \"x\": 435,\n                                                    \"y\": 243,\n                                                    \"uid\": 16\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 13,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 14,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 15,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 2,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 16,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 16,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"x\",\n                                                \"dt\": 0,\n                                                \"uid\": 5,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"y\",\n                                                \"dt\": 0,\n                                                \"uid\": 6,\n                                                \"index\": 1,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"z\",\n                                                \"dt\": 0,\n                                                \"uid\": 7,\n                                                \"index\": 2,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 1,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 272,\n                                        \"y\": 234,\n                                        \"uid\": 19,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"13\": 5,\n                                                \"14\": 6,\n                                                \"15\": 7\n                                            },\n                                            \"output_sids\": {\n                                                \"2\": 1\n                                            }\n                                        },\n                                        \"title\": \"Scale\",\n                                        \"graph\": {\n                                            \"node_uid\": 16,\n                                            \"uid\": 46,\n                                            \"parent_uid\": 44,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"scale_matrix\",\n                                                    \"x\": 456,\n                                                    \"y\": 245,\n                                                    \"uid\": 0\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 590,\n                                                    \"y\": 257,\n                                                    \"uid\": 2,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"vector\",\n                                                    \"x\": 331,\n                                                    \"y\": 241,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 173,\n                                                    \"y\": 314,\n                                                    \"uid\": 13,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"x\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 204,\n                                                    \"y\": 397,\n                                                    \"uid\": 14,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"y\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 223,\n                                                    \"y\": 456,\n                                                    \"uid\": 15,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"z\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 0,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 13,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 14,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 15,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 2,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"x\",\n                                                \"dt\": 0,\n                                                \"uid\": 5,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"y\",\n                                                \"dt\": 0,\n                                                \"uid\": 6,\n                                                \"index\": 1,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"z\",\n                                                \"dt\": 0,\n                                                \"uid\": 7,\n                                                \"index\": 2,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 1,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 479,\n                                        \"y\": 58,\n                                        \"uid\": 21,\n                                        \"dsid\": 4,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"8\": 1,\n                                                \"9\": 2,\n                                                \"10\": 3\n                                            },\n                                            \"output_sids\": {\n                                                \"1\": 0\n                                            }\n                                        },\n                                        \"title\": \"Rotate\",\n                                        \"graph\": {\n                                            \"node_uid\": 16,\n                                            \"uid\": 47,\n                                            \"parent_uid\": 44,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"rotation_xyz_matrix\",\n                                                    \"x\": 385,\n                                                    \"y\": 227,\n                                                    \"uid\": 0\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 509,\n                                                    \"y\": 216,\n                                                    \"uid\": 1,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 88,\n                                                    \"y\": 147,\n                                                    \"uid\": 8,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"X\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 68,\n                                                    \"y\": 231,\n                                                    \"uid\": 9,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"Y\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 67,\n                                                    \"y\": 353,\n                                                    \"uid\": 10,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"Z\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"graph\",\n                                                    \"x\": 179,\n                                                    \"y\": 272,\n                                                    \"uid\": 13,\n                                                    \"dsid\": 2,\n                                                    \"state\": {\n                                                        \"enabled\": true,\n                                                        \"always_update\": true,\n                                                        \"rt_width\": 512,\n                                                        \"rt_height\": 512,\n                                                        \"input_sids\": {\n                                                            \"7\": 0\n                                                        },\n                                                        \"output_sids\": {\n                                                            \"8\": 1\n                                                        }\n                                                    },\n                                                    \"title\": \"Knob compute\",\n                                                    \"graph\": {\n                                                        \"node_uid\": 9,\n                                                        \"uid\": 48,\n                                                        \"parent_uid\": 47,\n                                                        \"open\": true,\n                                                        \"nodes\": [\n                                                            {\n                                                                \"plugin\": \"add_modulator\",\n                                                                \"x\": 660,\n                                                                \"y\": 204,\n                                                                \"uid\": 0\n                                                            },\n                                                            {\n                                                                \"plugin\": \"multiply_modulator\",\n                                                                \"x\": 553,\n                                                                \"y\": 165,\n                                                                \"uid\": 1\n                                                            },\n                                                            {\n                                                                \"plugin\": \"subtract_modulator\",\n                                                                \"x\": 335,\n                                                                \"y\": 296,\n                                                                \"uid\": 2\n                                                            },\n                                                            {\n                                                                \"plugin\": \"absolute_modulator\",\n                                                                \"x\": 465,\n                                                                \"y\": 321,\n                                                                \"uid\": 3\n                                                            },\n                                                            {\n                                                                \"plugin\": \"min_modulator\",\n                                                                \"x\": 382,\n                                                                \"y\": 407,\n                                                                \"uid\": 4\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 124,\n                                                                \"y\": 212,\n                                                                \"uid\": 5,\n                                                                \"state\": {\n                                                                    \"val\": -180\n                                                                },\n                                                                \"title\": \"Minimum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 118,\n                                                                \"y\": 371,\n                                                                \"uid\": 6,\n                                                                \"state\": {\n                                                                    \"val\": 180\n                                                                },\n                                                                \"title\": \"Maximum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"input_proxy\",\n                                                                \"x\": 301,\n                                                                \"y\": 131,\n                                                                \"uid\": 7,\n                                                                \"dsid\": 15,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_out\": [\n                                                                    {\n                                                                        \"name\": \"output\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 1,\n                                                                        \"connected\": true\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"plugin\": \"output_proxy\",\n                                                                \"x\": 764,\n                                                                \"y\": 210,\n                                                                \"uid\": 8,\n                                                                \"dsid\": 15,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_in\": [\n                                                                    {\n                                                                        \"name\": \"input\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 0,\n                                                                        \"connected\": true,\n                                                                        \"is_connected\": true\n                                                                    }\n                                                                ]\n                                                            }\n                                                        ],\n                                                        \"conns\": [\n                                                            {\n                                                                \"src_nuid\": 1,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 4,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 3,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 2,\n                                                                \"dst_nuid\": 3,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 7,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"src_connected\": true,\n                                                                \"src_dyn\": true\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 0,\n                                                                \"dst_nuid\": 8,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"dst_connected\": true,\n                                                                \"dst_dyn\": true\n                                                            }\n                                                        ]\n                                                    },\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ],\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 1,\n                                                            \"index\": 0,\n                                                            \"type\": 1\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"graph\",\n                                                    \"x\": 172,\n                                                    \"y\": 352,\n                                                    \"uid\": 14,\n                                                    \"dsid\": 2,\n                                                    \"state\": {\n                                                        \"enabled\": true,\n                                                        \"always_update\": true,\n                                                        \"rt_width\": 512,\n                                                        \"rt_height\": 512,\n                                                        \"input_sids\": {\n                                                            \"7\": 0\n                                                        },\n                                                        \"output_sids\": {\n                                                            \"8\": 1\n                                                        }\n                                                    },\n                                                    \"title\": \"Knob compute\",\n                                                    \"graph\": {\n                                                        \"node_uid\": 9,\n                                                        \"uid\": 49,\n                                                        \"parent_uid\": 47,\n                                                        \"open\": true,\n                                                        \"nodes\": [\n                                                            {\n                                                                \"plugin\": \"add_modulator\",\n                                                                \"x\": 660,\n                                                                \"y\": 204,\n                                                                \"uid\": 0\n                                                            },\n                                                            {\n                                                                \"plugin\": \"multiply_modulator\",\n                                                                \"x\": 553,\n                                                                \"y\": 165,\n                                                                \"uid\": 1\n                                                            },\n                                                            {\n                                                                \"plugin\": \"subtract_modulator\",\n                                                                \"x\": 335,\n                                                                \"y\": 296,\n                                                                \"uid\": 2\n                                                            },\n                                                            {\n                                                                \"plugin\": \"absolute_modulator\",\n                                                                \"x\": 465,\n                                                                \"y\": 321,\n                                                                \"uid\": 3\n                                                            },\n                                                            {\n                                                                \"plugin\": \"min_modulator\",\n                                                                \"x\": 382,\n                                                                \"y\": 407,\n                                                                \"uid\": 4\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 124,\n                                                                \"y\": 212,\n                                                                \"uid\": 5,\n                                                                \"state\": {\n                                                                    \"val\": -180\n                                                                },\n                                                                \"title\": \"Minimum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 118,\n                                                                \"y\": 371,\n                                                                \"uid\": 6,\n                                                                \"state\": {\n                                                                    \"val\": 180\n                                                                },\n                                                                \"title\": \"Maximum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"input_proxy\",\n                                                                \"x\": 301,\n                                                                \"y\": 131,\n                                                                \"uid\": 7,\n                                                                \"dsid\": 16,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_out\": [\n                                                                    {\n                                                                        \"name\": \"output\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 1,\n                                                                        \"connected\": true\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"plugin\": \"output_proxy\",\n                                                                \"x\": 764,\n                                                                \"y\": 210,\n                                                                \"uid\": 8,\n                                                                \"dsid\": 16,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_in\": [\n                                                                    {\n                                                                        \"name\": \"input\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 0,\n                                                                        \"connected\": true,\n                                                                        \"is_connected\": true\n                                                                    }\n                                                                ]\n                                                            }\n                                                        ],\n                                                        \"conns\": [\n                                                            {\n                                                                \"src_nuid\": 1,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 4,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 3,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 2,\n                                                                \"dst_nuid\": 3,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 7,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"src_connected\": true,\n                                                                \"src_dyn\": true\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 0,\n                                                                \"dst_nuid\": 8,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"dst_connected\": true,\n                                                                \"dst_dyn\": true\n                                                            }\n                                                        ]\n                                                    },\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"is_connected\": true,\n                                                            \"connected\": false\n                                                        }\n                                                    ],\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 1,\n                                                            \"index\": 0,\n                                                            \"type\": 1\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"graph\",\n                                                    \"x\": 192,\n                                                    \"y\": 428,\n                                                    \"uid\": 15,\n                                                    \"dsid\": 2,\n                                                    \"state\": {\n                                                        \"enabled\": true,\n                                                        \"always_update\": true,\n                                                        \"rt_width\": 512,\n                                                        \"rt_height\": 512,\n                                                        \"input_sids\": {\n                                                            \"7\": 0\n                                                        },\n                                                        \"output_sids\": {\n                                                            \"8\": 1\n                                                        }\n                                                    },\n                                                    \"title\": \"Knob compute\",\n                                                    \"graph\": {\n                                                        \"node_uid\": 9,\n                                                        \"uid\": 50,\n                                                        \"parent_uid\": 47,\n                                                        \"open\": true,\n                                                        \"nodes\": [\n                                                            {\n                                                                \"plugin\": \"add_modulator\",\n                                                                \"x\": 660,\n                                                                \"y\": 204,\n                                                                \"uid\": 0\n                                                            },\n                                                            {\n                                                                \"plugin\": \"multiply_modulator\",\n                                                                \"x\": 553,\n                                                                \"y\": 165,\n                                                                \"uid\": 1\n                                                            },\n                                                            {\n                                                                \"plugin\": \"subtract_modulator\",\n                                                                \"x\": 335,\n                                                                \"y\": 296,\n                                                                \"uid\": 2\n                                                            },\n                                                            {\n                                                                \"plugin\": \"absolute_modulator\",\n                                                                \"x\": 465,\n                                                                \"y\": 321,\n                                                                \"uid\": 3\n                                                            },\n                                                            {\n                                                                \"plugin\": \"min_modulator\",\n                                                                \"x\": 382,\n                                                                \"y\": 407,\n                                                                \"uid\": 4\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 124,\n                                                                \"y\": 212,\n                                                                \"uid\": 5,\n                                                                \"state\": {\n                                                                    \"val\": -180\n                                                                },\n                                                                \"title\": \"Minimum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 118,\n                                                                \"y\": 371,\n                                                                \"uid\": 6,\n                                                                \"state\": {\n                                                                    \"val\": 180\n                                                                },\n                                                                \"title\": \"Maximum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"input_proxy\",\n                                                                \"x\": 301,\n                                                                \"y\": 131,\n                                                                \"uid\": 7,\n                                                                \"dsid\": 16,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_out\": [\n                                                                    {\n                                                                        \"name\": \"output\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 1,\n                                                                        \"connected\": true\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"plugin\": \"output_proxy\",\n                                                                \"x\": 764,\n                                                                \"y\": 210,\n                                                                \"uid\": 8,\n                                                                \"dsid\": 16,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_in\": [\n                                                                    {\n                                                                        \"name\": \"input\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 0,\n                                                                        \"connected\": true,\n                                                                        \"is_connected\": true\n                                                                    }\n                                                                ]\n                                                            }\n                                                        ],\n                                                        \"conns\": [\n                                                            {\n                                                                \"src_nuid\": 1,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 4,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 3,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 2,\n                                                                \"dst_nuid\": 3,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 7,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"src_connected\": true,\n                                                                \"src_dyn\": true\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 0,\n                                                                \"dst_nuid\": 8,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"dst_connected\": true,\n                                                                \"dst_dyn\": true\n                                                            }\n                                                        ]\n                                                    },\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"is_connected\": true,\n                                                            \"connected\": false\n                                                        }\n                                                    ],\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 1,\n                                                            \"index\": 0,\n                                                            \"type\": 1\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 0,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 8,\n                                                    \"dst_nuid\": 13,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 13,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 9,\n                                                    \"dst_nuid\": 14,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"dst_connected\": false,\n                                                    \"src_dyn\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 14,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 10,\n                                                    \"dst_nuid\": 15,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"dst_connected\": false,\n                                                    \"src_dyn\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 15,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 2,\n                                                    \"src_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"X\",\n                                                \"dt\": 0,\n                                                \"uid\": 1,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"Y\",\n                                                \"dt\": 0,\n                                                \"uid\": 2,\n                                                \"index\": 1,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"Z\",\n                                                \"dt\": 0,\n                                                \"uid\": 3,\n                                                \"index\": 2,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 114,\n                                        \"y\": 57,\n                                        \"uid\": 25,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"lvl pos x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 114,\n                                        \"y\": 110,\n                                        \"uid\": 26,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"lvl pos y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 114,\n                                        \"y\": 165,\n                                        \"uid\": 27,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"lvl pos z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 106,\n                                        \"y\": 298,\n                                        \"uid\": 28,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"lvl scl x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 105,\n                                        \"y\": 354,\n                                        \"uid\": 29,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"lvl scl y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 106,\n                                        \"y\": 417,\n                                        \"uid\": 30,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"lvl scl z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 391,\n                                        \"y\": 31,\n                                        \"uid\": 31,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"lvl rot x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 392,\n                                        \"y\": 98,\n                                        \"uid\": 32,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"lvl rot y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 392,\n                                        \"y\": 155,\n                                        \"uid\": 33,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"lvl rot z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 442,\n                                        \"y\": 586,\n                                        \"uid\": 36,\n                                        \"dsid\": 4,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"8\": 1,\n                                                \"9\": 2,\n                                                \"10\": 3\n                                            },\n                                            \"output_sids\": {\n                                                \"1\": 0\n                                            }\n                                        },\n                                        \"title\": \"branch rotate\",\n                                        \"graph\": {\n                                            \"node_uid\": 14,\n                                            \"uid\": 51,\n                                            \"parent_uid\": 44,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"rotation_xyz_matrix\",\n                                                    \"x\": 385,\n                                                    \"y\": 227,\n                                                    \"uid\": 0\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 509,\n                                                    \"y\": 216,\n                                                    \"uid\": 1,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 88,\n                                                    \"y\": 147,\n                                                    \"uid\": 8,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"X\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 190,\n                                                    \"y\": 106,\n                                                    \"uid\": 9,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"Y\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 272,\n                                                    \"y\": 181,\n                                                    \"uid\": 10,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"Z\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"graph\",\n                                                    \"x\": 161,\n                                                    \"y\": 264,\n                                                    \"uid\": 11,\n                                                    \"dsid\": 2,\n                                                    \"state\": {\n                                                        \"enabled\": true,\n                                                        \"always_update\": true,\n                                                        \"rt_width\": 512,\n                                                        \"rt_height\": 512,\n                                                        \"input_sids\": {\n                                                            \"7\": 0\n                                                        },\n                                                        \"output_sids\": {\n                                                            \"8\": 1\n                                                        }\n                                                    },\n                                                    \"title\": \"Knob compute\",\n                                                    \"graph\": {\n                                                        \"node_uid\": 9,\n                                                        \"uid\": 52,\n                                                        \"parent_uid\": 51,\n                                                        \"open\": true,\n                                                        \"nodes\": [\n                                                            {\n                                                                \"plugin\": \"add_modulator\",\n                                                                \"x\": 660,\n                                                                \"y\": 204,\n                                                                \"uid\": 0\n                                                            },\n                                                            {\n                                                                \"plugin\": \"multiply_modulator\",\n                                                                \"x\": 553,\n                                                                \"y\": 165,\n                                                                \"uid\": 1\n                                                            },\n                                                            {\n                                                                \"plugin\": \"subtract_modulator\",\n                                                                \"x\": 335,\n                                                                \"y\": 296,\n                                                                \"uid\": 2\n                                                            },\n                                                            {\n                                                                \"plugin\": \"absolute_modulator\",\n                                                                \"x\": 465,\n                                                                \"y\": 321,\n                                                                \"uid\": 3\n                                                            },\n                                                            {\n                                                                \"plugin\": \"min_modulator\",\n                                                                \"x\": 382,\n                                                                \"y\": 407,\n                                                                \"uid\": 4\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 124,\n                                                                \"y\": 212,\n                                                                \"uid\": 5,\n                                                                \"state\": {\n                                                                    \"val\": -180\n                                                                },\n                                                                \"title\": \"Minimum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 118,\n                                                                \"y\": 371,\n                                                                \"uid\": 6,\n                                                                \"state\": {\n                                                                    \"val\": 180\n                                                                },\n                                                                \"title\": \"Maximum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"input_proxy\",\n                                                                \"x\": 301,\n                                                                \"y\": 131,\n                                                                \"uid\": 7,\n                                                                \"dsid\": 16,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_out\": [\n                                                                    {\n                                                                        \"name\": \"output\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 1,\n                                                                        \"connected\": true\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"plugin\": \"output_proxy\",\n                                                                \"x\": 764,\n                                                                \"y\": 210,\n                                                                \"uid\": 8,\n                                                                \"dsid\": 16,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_in\": [\n                                                                    {\n                                                                        \"name\": \"input\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 0,\n                                                                        \"connected\": true,\n                                                                        \"is_connected\": true\n                                                                    }\n                                                                ]\n                                                            }\n                                                        ],\n                                                        \"conns\": [\n                                                            {\n                                                                \"src_nuid\": 1,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 4,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 3,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 2,\n                                                                \"dst_nuid\": 3,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 7,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"src_connected\": true,\n                                                                \"src_dyn\": true\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 0,\n                                                                \"dst_nuid\": 8,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"dst_connected\": true,\n                                                                \"dst_dyn\": true\n                                                            }\n                                                        ]\n                                                    },\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"is_connected\": true,\n                                                            \"connected\": false\n                                                        }\n                                                    ],\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 1,\n                                                            \"index\": 0,\n                                                            \"type\": 1\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"graph\",\n                                                    \"x\": 191,\n                                                    \"y\": 341,\n                                                    \"uid\": 12,\n                                                    \"dsid\": 2,\n                                                    \"state\": {\n                                                        \"enabled\": true,\n                                                        \"always_update\": true,\n                                                        \"rt_width\": 512,\n                                                        \"rt_height\": 512,\n                                                        \"input_sids\": {\n                                                            \"7\": 0\n                                                        },\n                                                        \"output_sids\": {\n                                                            \"8\": 1\n                                                        }\n                                                    },\n                                                    \"title\": \"Knob compute\",\n                                                    \"graph\": {\n                                                        \"node_uid\": 9,\n                                                        \"uid\": 53,\n                                                        \"parent_uid\": 51,\n                                                        \"open\": true,\n                                                        \"nodes\": [\n                                                            {\n                                                                \"plugin\": \"add_modulator\",\n                                                                \"x\": 660,\n                                                                \"y\": 204,\n                                                                \"uid\": 0\n                                                            },\n                                                            {\n                                                                \"plugin\": \"multiply_modulator\",\n                                                                \"x\": 553,\n                                                                \"y\": 165,\n                                                                \"uid\": 1\n                                                            },\n                                                            {\n                                                                \"plugin\": \"subtract_modulator\",\n                                                                \"x\": 335,\n                                                                \"y\": 296,\n                                                                \"uid\": 2\n                                                            },\n                                                            {\n                                                                \"plugin\": \"absolute_modulator\",\n                                                                \"x\": 465,\n                                                                \"y\": 321,\n                                                                \"uid\": 3\n                                                            },\n                                                            {\n                                                                \"plugin\": \"min_modulator\",\n                                                                \"x\": 382,\n                                                                \"y\": 407,\n                                                                \"uid\": 4\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 124,\n                                                                \"y\": 212,\n                                                                \"uid\": 5,\n                                                                \"state\": {\n                                                                    \"val\": -180\n                                                                },\n                                                                \"title\": \"Minimum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 118,\n                                                                \"y\": 371,\n                                                                \"uid\": 6,\n                                                                \"state\": {\n                                                                    \"val\": 180\n                                                                },\n                                                                \"title\": \"Maximum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"input_proxy\",\n                                                                \"x\": 301,\n                                                                \"y\": 131,\n                                                                \"uid\": 7,\n                                                                \"dsid\": 16,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_out\": [\n                                                                    {\n                                                                        \"name\": \"output\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 1,\n                                                                        \"connected\": true\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"plugin\": \"output_proxy\",\n                                                                \"x\": 764,\n                                                                \"y\": 210,\n                                                                \"uid\": 8,\n                                                                \"dsid\": 16,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_in\": [\n                                                                    {\n                                                                        \"name\": \"input\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 0,\n                                                                        \"connected\": true,\n                                                                        \"is_connected\": true\n                                                                    }\n                                                                ]\n                                                            }\n                                                        ],\n                                                        \"conns\": [\n                                                            {\n                                                                \"src_nuid\": 1,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 4,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 3,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 2,\n                                                                \"dst_nuid\": 3,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 7,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"src_connected\": true,\n                                                                \"src_dyn\": true\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 0,\n                                                                \"dst_nuid\": 8,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"dst_connected\": true,\n                                                                \"dst_dyn\": true\n                                                            }\n                                                        ]\n                                                    },\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"is_connected\": true,\n                                                            \"connected\": false\n                                                        }\n                                                    ],\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 1,\n                                                            \"index\": 0,\n                                                            \"type\": 1\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"graph\",\n                                                    \"x\": 222,\n                                                    \"y\": 427,\n                                                    \"uid\": 13,\n                                                    \"dsid\": 2,\n                                                    \"state\": {\n                                                        \"enabled\": true,\n                                                        \"always_update\": true,\n                                                        \"rt_width\": 512,\n                                                        \"rt_height\": 512,\n                                                        \"input_sids\": {\n                                                            \"7\": 0\n                                                        },\n                                                        \"output_sids\": {\n                                                            \"8\": 1\n                                                        }\n                                                    },\n                                                    \"title\": \"Knob compute\",\n                                                    \"graph\": {\n                                                        \"node_uid\": 9,\n                                                        \"uid\": 54,\n                                                        \"parent_uid\": 51,\n                                                        \"open\": true,\n                                                        \"nodes\": [\n                                                            {\n                                                                \"plugin\": \"add_modulator\",\n                                                                \"x\": 660,\n                                                                \"y\": 204,\n                                                                \"uid\": 0\n                                                            },\n                                                            {\n                                                                \"plugin\": \"multiply_modulator\",\n                                                                \"x\": 553,\n                                                                \"y\": 165,\n                                                                \"uid\": 1\n                                                            },\n                                                            {\n                                                                \"plugin\": \"subtract_modulator\",\n                                                                \"x\": 335,\n                                                                \"y\": 296,\n                                                                \"uid\": 2\n                                                            },\n                                                            {\n                                                                \"plugin\": \"absolute_modulator\",\n                                                                \"x\": 465,\n                                                                \"y\": 321,\n                                                                \"uid\": 3\n                                                            },\n                                                            {\n                                                                \"plugin\": \"min_modulator\",\n                                                                \"x\": 382,\n                                                                \"y\": 407,\n                                                                \"uid\": 4\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 124,\n                                                                \"y\": 212,\n                                                                \"uid\": 5,\n                                                                \"state\": {\n                                                                    \"val\": -180\n                                                                },\n                                                                \"title\": \"Minimum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 118,\n                                                                \"y\": 371,\n                                                                \"uid\": 6,\n                                                                \"state\": {\n                                                                    \"val\": 180\n                                                                },\n                                                                \"title\": \"Maximum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"input_proxy\",\n                                                                \"x\": 301,\n                                                                \"y\": 131,\n                                                                \"uid\": 7,\n                                                                \"dsid\": 16,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_out\": [\n                                                                    {\n                                                                        \"name\": \"output\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 1,\n                                                                        \"connected\": true\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"plugin\": \"output_proxy\",\n                                                                \"x\": 764,\n                                                                \"y\": 210,\n                                                                \"uid\": 8,\n                                                                \"dsid\": 16,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_in\": [\n                                                                    {\n                                                                        \"name\": \"input\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 0,\n                                                                        \"connected\": true,\n                                                                        \"is_connected\": true\n                                                                    }\n                                                                ]\n                                                            }\n                                                        ],\n                                                        \"conns\": [\n                                                            {\n                                                                \"src_nuid\": 1,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 4,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 3,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 2,\n                                                                \"dst_nuid\": 3,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 7,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"src_connected\": true,\n                                                                \"src_dyn\": true\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 0,\n                                                                \"dst_nuid\": 8,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"dst_connected\": true,\n                                                                \"dst_dyn\": true\n                                                            }\n                                                        ]\n                                                    },\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"is_connected\": true,\n                                                            \"connected\": false\n                                                        }\n                                                    ],\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 1,\n                                                            \"index\": 0,\n                                                            \"type\": 1\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 0,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 8,\n                                                    \"dst_nuid\": 11,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"dst_connected\": false,\n                                                    \"src_dyn\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 9,\n                                                    \"dst_nuid\": 12,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"dst_connected\": false,\n                                                    \"src_dyn\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 12,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 10,\n                                                    \"dst_nuid\": 13,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"dst_connected\": false,\n                                                    \"src_dyn\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 13,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 2,\n                                                    \"src_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"X\",\n                                                \"dt\": 0,\n                                                \"uid\": 1,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"Y\",\n                                                \"dt\": 0,\n                                                \"uid\": 2,\n                                                \"index\": 1,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"Z\",\n                                                \"dt\": 0,\n                                                \"uid\": 3,\n                                                \"index\": 2,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 438,\n                                        \"y\": 360,\n                                        \"uid\": 40,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"13\": 5,\n                                                \"14\": 6,\n                                                \"15\": 7\n                                            },\n                                            \"output_sids\": {\n                                                \"2\": 1\n                                            }\n                                        },\n                                        \"title\": \"branch trnslt\",\n                                        \"graph\": {\n                                            \"node_uid\": 17,\n                                            \"uid\": 55,\n                                            \"parent_uid\": 44,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 525,\n                                                    \"y\": 243,\n                                                    \"uid\": 2,\n                                                    \"dsid\": 17,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"vector\",\n                                                    \"x\": 331,\n                                                    \"y\": 241,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 173,\n                                                    \"y\": 314,\n                                                    \"uid\": 13,\n                                                    \"dsid\": 17,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"x\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 204,\n                                                    \"y\": 397,\n                                                    \"uid\": 14,\n                                                    \"dsid\": 17,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"y\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 223,\n                                                    \"y\": 456,\n                                                    \"uid\": 15,\n                                                    \"dsid\": 17,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"z\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"translation_matrix\",\n                                                    \"x\": 435,\n                                                    \"y\": 243,\n                                                    \"uid\": 16\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 13,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 14,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 15,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 2,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 16,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 16,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"x\",\n                                                \"dt\": 0,\n                                                \"uid\": 5,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"y\",\n                                                \"dt\": 0,\n                                                \"uid\": 6,\n                                                \"index\": 1,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"z\",\n                                                \"dt\": 0,\n                                                \"uid\": 7,\n                                                \"index\": 2,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 1,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 436,\n                                        \"y\": 474,\n                                        \"uid\": 44,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"13\": 5,\n                                                \"14\": 6,\n                                                \"15\": 7\n                                            },\n                                            \"output_sids\": {\n                                                \"2\": 1\n                                            }\n                                        },\n                                        \"title\": \"branch scale\",\n                                        \"graph\": {\n                                            \"node_uid\": 16,\n                                            \"uid\": 56,\n                                            \"parent_uid\": 44,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"scale_matrix\",\n                                                    \"x\": 456,\n                                                    \"y\": 245,\n                                                    \"uid\": 0\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 590,\n                                                    \"y\": 257,\n                                                    \"uid\": 2,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"vector\",\n                                                    \"x\": 331,\n                                                    \"y\": 241,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 173,\n                                                    \"y\": 314,\n                                                    \"uid\": 13,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"x\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 204,\n                                                    \"y\": 397,\n                                                    \"uid\": 14,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"y\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 223,\n                                                    \"y\": 456,\n                                                    \"uid\": 15,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"z\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 0,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 13,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 14,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 15,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 2,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"x\",\n                                                \"dt\": 0,\n                                                \"uid\": 5,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"y\",\n                                                \"dt\": 0,\n                                                \"uid\": 6,\n                                                \"index\": 1,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"z\",\n                                                \"dt\": 0,\n                                                \"uid\": 7,\n                                                \"index\": 2,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 1,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 330,\n                                        \"y\": 369,\n                                        \"uid\": 47,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"b trn x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 330,\n                                        \"y\": 422,\n                                        \"uid\": 48,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"b trn y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 328,\n                                        \"y\": 475,\n                                        \"uid\": 49,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"b trn z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 329,\n                                        \"y\": 543,\n                                        \"uid\": 50,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"b sc x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 330,\n                                        \"y\": 590,\n                                        \"uid\": 51,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"b sc y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 329,\n                                        \"y\": 636,\n                                        \"uid\": 52,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"b sc z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 327,\n                                        \"y\": 715,\n                                        \"uid\": 53,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"b rot x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 326,\n                                        \"y\": 757,\n                                        \"uid\": 54,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"b rot y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 327,\n                                        \"y\": 804,\n                                        \"uid\": 55,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"b rot z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 922,\n                                        \"y\": 185,\n                                        \"uid\": 56,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 924,\n                                        \"y\": 245,\n                                        \"uid\": 57,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"transform\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 820,\n                                        \"y\": 412,\n                                        \"uid\": 58,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 608,\n                                        \"y\": 390,\n                                        \"uid\": 64,\n                                        \"dsid\": 4,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"3\": 1,\n                                                \"4\": 2,\n                                                \"5\": 3\n                                            },\n                                            \"output_sids\": {\n                                                \"2\": 0\n                                            }\n                                        },\n                                        \"title\": \"Concatenate x2\",\n                                        \"graph\": {\n                                            \"node_uid\": 6,\n                                            \"uid\": 57,\n                                            \"parent_uid\": 44,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"concatenate_matrix_modulator\",\n                                                    \"x\": 392,\n                                                    \"y\": 263,\n                                                    \"uid\": 0\n                                                },\n                                                {\n                                                    \"plugin\": \"concatenate_matrix_modulator\",\n                                                    \"x\": 268,\n                                                    \"y\": 302,\n                                                    \"uid\": 1\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 532,\n                                                    \"y\": 244,\n                                                    \"uid\": 2,\n                                                    \"dsid\": 13,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 229,\n                                                    \"y\": 195,\n                                                    \"uid\": 3,\n                                                    \"dsid\": 13,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 148,\n                                                    \"y\": 343,\n                                                    \"uid\": 4,\n                                                    \"dsid\": 13,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 171,\n                                                    \"y\": 500,\n                                                    \"uid\": 5,\n                                                    \"dsid\": 13,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 1,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 0,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 4,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 1,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 2,\n                                                \"index\": 1,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 3,\n                                                \"index\": 2,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 574,\n                                        \"y\": 198,\n                                        \"uid\": 66,\n                                        \"dsid\": 4,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"3\": 1,\n                                                \"4\": 2,\n                                                \"5\": 3\n                                            },\n                                            \"output_sids\": {\n                                                \"2\": 0\n                                            }\n                                        },\n                                        \"title\": \"Concatenate x2\",\n                                        \"graph\": {\n                                            \"node_uid\": 6,\n                                            \"uid\": 58,\n                                            \"parent_uid\": 44,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"concatenate_matrix_modulator\",\n                                                    \"x\": 274,\n                                                    \"y\": 13,\n                                                    \"uid\": 0\n                                                },\n                                                {\n                                                    \"plugin\": \"concatenate_matrix_modulator\",\n                                                    \"x\": 92,\n                                                    \"y\": 13,\n                                                    \"uid\": 1\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 394,\n                                                    \"y\": 13,\n                                                    \"uid\": 2,\n                                                    \"dsid\": 8,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 197,\n                                                    \"y\": 14,\n                                                    \"uid\": 3,\n                                                    \"dsid\": 8,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 9,\n                                                    \"y\": 13,\n                                                    \"uid\": 4,\n                                                    \"dsid\": 8,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 9,\n                                                    \"y\": 71,\n                                                    \"uid\": 5,\n                                                    \"dsid\": 8,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 1,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 0,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 4,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 1,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 2,\n                                                \"index\": 1,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 3,\n                                                \"index\": 2,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 15,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 15,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 27,\n                                        \"dst_nuid\": 15,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 28,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 29,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 30,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 31,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 32,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 33,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 53,\n                                        \"dst_nuid\": 36,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 54,\n                                        \"dst_nuid\": 36,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 55,\n                                        \"dst_nuid\": 36,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 50,\n                                        \"dst_nuid\": 44,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 51,\n                                        \"dst_nuid\": 44,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 52,\n                                        \"dst_nuid\": 44,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 49,\n                                        \"dst_nuid\": 40,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 48,\n                                        \"dst_nuid\": 40,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 47,\n                                        \"dst_nuid\": 40,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 56,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 57,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 40,\n                                        \"dst_nuid\": 64,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 44,\n                                        \"dst_nuid\": 64,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 36,\n                                        \"dst_nuid\": 64,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 64,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 4,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 66,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 66,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 19,\n                                        \"dst_nuid\": 66,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 66,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 58,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"recursion depth\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"mesh\",\n                                    \"dt\": 9,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"lvl pos x\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"lvl pos y\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"lvl pos z\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"lvl scl x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"lvl scl y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 6,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"lvl scl z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 7,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"lvl rot x\",\n                                    \"dt\": 0,\n                                    \"uid\": 8,\n                                    \"index\": 8,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"lvl rot y\",\n                                    \"dt\": 0,\n                                    \"uid\": 9,\n                                    \"index\": 9,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"lvl rot z\",\n                                    \"dt\": 0,\n                                    \"uid\": 10,\n                                    \"index\": 10,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"b trn x\",\n                                    \"dt\": 0,\n                                    \"uid\": 12,\n                                    \"index\": 11,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"b trn y\",\n                                    \"dt\": 0,\n                                    \"uid\": 13,\n                                    \"index\": 12,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"b trn z\",\n                                    \"dt\": 0,\n                                    \"uid\": 14,\n                                    \"index\": 13,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"b sc x\",\n                                    \"dt\": 0,\n                                    \"uid\": 15,\n                                    \"index\": 14,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"b sc y\",\n                                    \"dt\": 0,\n                                    \"uid\": 16,\n                                    \"index\": 15,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"b sc z\",\n                                    \"dt\": 0,\n                                    \"uid\": 17,\n                                    \"index\": 16,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"b rot x\",\n                                    \"dt\": 0,\n                                    \"uid\": 18,\n                                    \"index\": 17,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"b rot y\",\n                                    \"dt\": 0,\n                                    \"uid\": 19,\n                                    \"index\": 18,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"b rot z\",\n                                    \"dt\": 0,\n                                    \"uid\": 20,\n                                    \"index\": 19,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 21,\n                                    \"index\": 20,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"transform\",\n                                    \"dt\": 4,\n                                    \"uid\": 22,\n                                    \"index\": 21,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 23,\n                                    \"index\": 22,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 173,\n                            \"y\": 20,\n                            \"uid\": 1,\n                            \"state\": {\n                                \"val\": 5\n                            },\n                            \"title\": \"recursion depth\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 21,\n                            \"y\": 111,\n                            \"uid\": 2,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"level position x\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 21,\n                            \"y\": 177,\n                            \"uid\": 3,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"level position y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 21,\n                            \"y\": 241,\n                            \"uid\": 4,\n                            \"state\": {\n                                \"val\": 0.04,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"level position z\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 221,\n                            \"y\": 111,\n                            \"uid\": 5,\n                            \"state\": {\n                                \"val\": 1.02,\n                                \"min\": 0,\n                                \"max\": 2\n                            },\n                            \"title\": \"level scale\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 431,\n                            \"y\": 110,\n                            \"uid\": 8,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"level rotation x\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 431,\n                            \"y\": 174,\n                            \"uid\": 9,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"level rotation y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 431,\n                            \"y\": 236,\n                            \"uid\": 10,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"level rotation z\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 17,\n                            \"y\": 331,\n                            \"uid\": 11,\n                            \"state\": {\n                                \"val\": 0.04,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"branch position x\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 17,\n                            \"y\": 397,\n                            \"uid\": 12,\n                            \"state\": {\n                                \"val\": 0.08,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"branch position y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 17,\n                            \"y\": 461,\n                            \"uid\": 13,\n                            \"state\": {\n                                \"val\": -0.04,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"branch position z\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 229,\n                            \"y\": 332,\n                            \"uid\": 14,\n                            \"state\": {\n                                \"val\": 1,\n                                \"min\": 0,\n                                \"max\": 2\n                            },\n                            \"title\": \"branch scale \"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 431,\n                            \"y\": 332,\n                            \"uid\": 17,\n                            \"state\": {\n                                \"val\": 0.05\n                            },\n                            \"title\": \"branch rotation x\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 431,\n                            \"y\": 396,\n                            \"uid\": 18,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"branch rotation y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 431,\n                            \"y\": 458,\n                            \"uid\": 19,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"branch rotation z\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 308,\n                            \"y\": 575,\n                            \"uid\": 31,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"13\": 5,\n                                    \"14\": 6,\n                                    \"15\": 7\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Translate\",\n                            \"graph\": {\n                                \"node_uid\": 17,\n                                \"uid\": 59,\n                                \"parent_uid\": 43,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 525,\n                                        \"y\": 243,\n                                        \"uid\": 2,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 331,\n                                        \"y\": 241,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 173,\n                                        \"y\": 314,\n                                        \"uid\": 13,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 204,\n                                        \"y\": 397,\n                                        \"uid\": 14,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 223,\n                                        \"y\": 456,\n                                        \"uid\": 15,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"translation_matrix\",\n                                        \"x\": 435,\n                                        \"y\": 243,\n                                        \"uid\": 16\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 104,\n                            \"y\": 576,\n                            \"uid\": 32,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"x position\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 104,\n                            \"y\": 642,\n                            \"uid\": 33,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"y position\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 104,\n                            \"y\": 706,\n                            \"uid\": 34,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"z position\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 406,\n                            \"y\": 574,\n                            \"uid\": 36,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"13\": 5,\n                                    \"14\": 6,\n                                    \"15\": 7\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Scale\",\n                            \"graph\": {\n                                \"node_uid\": 16,\n                                \"uid\": 60,\n                                \"parent_uid\": 43,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scale_matrix\",\n                                        \"x\": 456,\n                                        \"y\": 245,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 590,\n                                        \"y\": 257,\n                                        \"uid\": 2,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 331,\n                                        \"y\": 241,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 173,\n                                        \"y\": 314,\n                                        \"uid\": 13,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 204,\n                                        \"y\": 397,\n                                        \"uid\": 14,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 223,\n                                        \"y\": 456,\n                                        \"uid\": 15,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 304,\n                            \"y\": 694,\n                            \"uid\": 37,\n                            \"state\": {\n                                \"val\": 0.105,\n                                \"min\": 0,\n                                \"max\": 0.5\n                            },\n                            \"title\": \"instance size\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 612,\n                            \"y\": 601,\n                            \"uid\": 38,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"8\": 1,\n                                    \"9\": 2,\n                                    \"10\": 3\n                                },\n                                \"output_sids\": {\n                                    \"1\": 0\n                                }\n                            },\n                            \"title\": \"Rotate\",\n                            \"graph\": {\n                                \"node_uid\": 14,\n                                \"uid\": 61,\n                                \"parent_uid\": 43,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"rotation_xyz_matrix\",\n                                        \"x\": 385,\n                                        \"y\": 227,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 509,\n                                        \"y\": 216,\n                                        \"uid\": 1,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 88,\n                                        \"y\": 147,\n                                        \"uid\": 8,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"X\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 190,\n                                        \"y\": 106,\n                                        \"uid\": 9,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 272,\n                                        \"y\": 181,\n                                        \"uid\": 10,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 174,\n                                        \"y\": 272,\n                                        \"uid\": 11,\n                                        \"dsid\": 2,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"7\": 0\n                                            },\n                                            \"output_sids\": {\n                                                \"8\": 1\n                                            }\n                                        },\n                                        \"title\": \"Knob compute\",\n                                        \"graph\": {\n                                            \"node_uid\": 9,\n                                            \"uid\": 62,\n                                            \"parent_uid\": 61,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"add_modulator\",\n                                                    \"x\": 660,\n                                                    \"y\": 204,\n                                                    \"uid\": 0\n                                                },\n                                                {\n                                                    \"plugin\": \"multiply_modulator\",\n                                                    \"x\": 553,\n                                                    \"y\": 165,\n                                                    \"uid\": 1\n                                                },\n                                                {\n                                                    \"plugin\": \"subtract_modulator\",\n                                                    \"x\": 335,\n                                                    \"y\": 296,\n                                                    \"uid\": 2\n                                                },\n                                                {\n                                                    \"plugin\": \"absolute_modulator\",\n                                                    \"x\": 465,\n                                                    \"y\": 321,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"min_modulator\",\n                                                    \"x\": 382,\n                                                    \"y\": 407,\n                                                    \"uid\": 4\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 124,\n                                                    \"y\": 212,\n                                                    \"uid\": 5,\n                                                    \"state\": {\n                                                        \"val\": -180\n                                                    },\n                                                    \"title\": \"Minimum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 118,\n                                                    \"y\": 371,\n                                                    \"uid\": 6,\n                                                    \"state\": {\n                                                        \"val\": 180\n                                                    },\n                                                    \"title\": \"Maximum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 301,\n                                                    \"y\": 131,\n                                                    \"uid\": 7,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 764,\n                                                    \"y\": 210,\n                                                    \"uid\": 8,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 1,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 4,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 6,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 4,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 6,\n                                                    \"dst_nuid\": 4,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 7,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 0,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true,\n                                                \"connected\": false\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 1,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 178,\n                                        \"y\": 344,\n                                        \"uid\": 12,\n                                        \"dsid\": 2,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"7\": 0\n                                            },\n                                            \"output_sids\": {\n                                                \"8\": 1\n                                            }\n                                        },\n                                        \"title\": \"Knob compute\",\n                                        \"graph\": {\n                                            \"node_uid\": 9,\n                                            \"uid\": 63,\n                                            \"parent_uid\": 61,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"add_modulator\",\n                                                    \"x\": 660,\n                                                    \"y\": 204,\n                                                    \"uid\": 0\n                                                },\n                                                {\n                                                    \"plugin\": \"multiply_modulator\",\n                                                    \"x\": 553,\n                                                    \"y\": 165,\n                                                    \"uid\": 1\n                                                },\n                                                {\n                                                    \"plugin\": \"subtract_modulator\",\n                                                    \"x\": 335,\n                                                    \"y\": 296,\n                                                    \"uid\": 2\n                                                },\n                                                {\n                                                    \"plugin\": \"absolute_modulator\",\n                                                    \"x\": 465,\n                                                    \"y\": 321,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"min_modulator\",\n                                                    \"x\": 382,\n                                                    \"y\": 407,\n                                                    \"uid\": 4\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 124,\n                                                    \"y\": 212,\n                                                    \"uid\": 5,\n                                                    \"state\": {\n                                                        \"val\": -180\n                                                    },\n                                                    \"title\": \"Minimum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 118,\n                                                    \"y\": 371,\n                                                    \"uid\": 6,\n                                                    \"state\": {\n                                                        \"val\": 180\n                                                    },\n                                                    \"title\": \"Maximum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 301,\n                                                    \"y\": 131,\n                                                    \"uid\": 7,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 764,\n                                                    \"y\": 210,\n                                                    \"uid\": 8,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 1,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 4,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 6,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 4,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 6,\n                                                    \"dst_nuid\": 4,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 7,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 0,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true,\n                                                \"connected\": false\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 1,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 199,\n                                        \"y\": 418,\n                                        \"uid\": 13,\n                                        \"dsid\": 2,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"7\": 0\n                                            },\n                                            \"output_sids\": {\n                                                \"8\": 1\n                                            }\n                                        },\n                                        \"title\": \"Knob compute\",\n                                        \"graph\": {\n                                            \"node_uid\": 9,\n                                            \"uid\": 64,\n                                            \"parent_uid\": 61,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"add_modulator\",\n                                                    \"x\": 660,\n                                                    \"y\": 204,\n                                                    \"uid\": 0\n                                                },\n                                                {\n                                                    \"plugin\": \"multiply_modulator\",\n                                                    \"x\": 553,\n                                                    \"y\": 165,\n                                                    \"uid\": 1\n                                                },\n                                                {\n                                                    \"plugin\": \"subtract_modulator\",\n                                                    \"x\": 335,\n                                                    \"y\": 296,\n                                                    \"uid\": 2\n                                                },\n                                                {\n                                                    \"plugin\": \"absolute_modulator\",\n                                                    \"x\": 465,\n                                                    \"y\": 321,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"min_modulator\",\n                                                    \"x\": 382,\n                                                    \"y\": 407,\n                                                    \"uid\": 4\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 124,\n                                                    \"y\": 212,\n                                                    \"uid\": 5,\n                                                    \"state\": {\n                                                        \"val\": -180\n                                                    },\n                                                    \"title\": \"Minimum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 118,\n                                                    \"y\": 371,\n                                                    \"uid\": 6,\n                                                    \"state\": {\n                                                        \"val\": 180\n                                                    },\n                                                    \"title\": \"Maximum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 301,\n                                                    \"y\": 131,\n                                                    \"uid\": 7,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 764,\n                                                    \"y\": 210,\n                                                    \"uid\": 8,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 1,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 4,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 6,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 4,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 6,\n                                                    \"dst_nuid\": 4,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 7,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 0,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true,\n                                                \"connected\": false\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 1,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"dst_connected\": false,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"dst_connected\": false,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 13,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"dst_connected\": false,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"X\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Y\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Z\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 513,\n                            \"y\": 596,\n                            \"uid\": 39,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 513,\n                            \"y\": 660,\n                            \"uid\": 40,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 513,\n                            \"y\": 722,\n                            \"uid\": 41,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 707,\n                            \"y\": 604,\n                            \"uid\": 42,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"3\": 1,\n                                    \"4\": 2,\n                                    \"5\": 3\n                                },\n                                \"output_sids\": {\n                                    \"2\": 0\n                                }\n                            },\n                            \"title\": \"Concatenate x2\",\n                            \"graph\": {\n                                \"node_uid\": 6,\n                                \"uid\": 65,\n                                \"parent_uid\": 43,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 392,\n                                        \"y\": 263,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 268,\n                                        \"y\": 302,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 532,\n                                        \"y\": 244,\n                                        \"uid\": 2,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 229,\n                                        \"y\": 195,\n                                        \"uid\": 3,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 148,\n                                        \"y\": 343,\n                                        \"uid\": 4,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 171,\n                                        \"y\": 500,\n                                        \"uid\": 5,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"sphere_mesh_generator\",\n                            \"x\": 76,\n                            \"y\": 19,\n                            \"uid\": 71,\n                            \"state\": {\n                                \"v_res\": 15,\n                                \"h_res\": 15\n                            }\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 555,\n                            \"y\": 1031,\n                            \"uid\": 72,\n                            \"dsid\": 14,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"14\": 2,\n                                    \"15\": 3,\n                                    \"16\": 4,\n                                    \"17\": 5,\n                                    \"18\": 6,\n                                    \"19\": 7\n                                },\n                                \"output_sids\": {\n                                    \"27\": 12\n                                }\n                            },\n                            \"title\": \"Light chain\",\n                            \"graph\": {\n                                \"node_uid\": 30,\n                                \"uid\": 66,\n                                \"parent_uid\": 43,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"light_type_modulator\",\n                                        \"x\": 762,\n                                        \"y\": 207,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"light_position_modulator\",\n                                        \"x\": 604,\n                                        \"y\": 215,\n                                        \"uid\": 2\n                                    },\n                                    {\n                                        \"plugin\": \"light_diffuse_color_modulator\",\n                                        \"x\": 200,\n                                        \"y\": 217,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"light_intensity_modulator\",\n                                        \"x\": 430,\n                                        \"y\": 219,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"light_specular_color_modulator\",\n                                        \"x\": 309,\n                                        \"y\": 219,\n                                        \"uid\": 6\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 494,\n                                        \"y\": 380,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 361,\n                                        \"y\": 467,\n                                        \"uid\": 14,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Pos x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 383,\n                                        \"y\": 549,\n                                        \"uid\": 15,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Pos y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 412,\n                                        \"y\": 627,\n                                        \"uid\": 16,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Pos z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 350,\n                                        \"y\": 358,\n                                        \"uid\": 17,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"intensity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 196,\n                                        \"y\": 340,\n                                        \"uid\": 18,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"specular color\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 3,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 93,\n                                        \"y\": 237,\n                                        \"uid\": 19,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"diffuse color\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 3,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 900,\n                                        \"y\": 133,\n                                        \"uid\": 27,\n                                        \"dsid\": 11,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 13,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"light_type_generator\",\n                                        \"x\": 618,\n                                        \"y\": 302,\n                                        \"uid\": 29,\n                                        \"state\": {\n                                            \"type\": 0\n                                        }\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 17,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 18,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 19,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 29,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"Pos x\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Pos y\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Pos z\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"intensity\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"specular color\",\n                                    \"dt\": 3,\n                                    \"uid\": 6,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"diffuse color\",\n                                    \"dt\": 3,\n                                    \"uid\": 7,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"light\",\n                                    \"dt\": 13,\n                                    \"uid\": 12,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 170,\n                            \"y\": 1031,\n                            \"uid\": 73,\n                            \"state\": {\n                                \"val\": 1.5,\n                                \"min\": 0,\n                                \"max\": 10\n                            },\n                            \"title\": \"Intensity\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 171,\n                            \"y\": 1106,\n                            \"uid\": 74,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -20,\n                                \"max\": 20\n                            },\n                            \"title\": \"Light position X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 170,\n                            \"y\": 1179,\n                            \"uid\": 75,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -20,\n                                \"max\": 20\n                            },\n                            \"title\": \"Light position Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 170,\n                            \"y\": 1249,\n                            \"uid\": 76,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -20,\n                                \"max\": 20\n                            },\n                            \"title\": \"Light position Z\"\n                        },\n                        {\n                            \"plugin\": \"color_picker\",\n                            \"x\": 368,\n                            \"y\": 1031,\n                            \"uid\": 77,\n                            \"state\": {\n                                \"hue\": 0,\n                                \"sat\": 0,\n                                \"lum\": 1\n                            },\n                            \"title\": \"Diffuse color\"\n                        },\n                        {\n                            \"plugin\": \"color_picker\",\n                            \"x\": 369,\n                            \"y\": 1166,\n                            \"uid\": 78,\n                            \"state\": {\n                                \"hue\": 0,\n                                \"sat\": 0,\n                                \"lum\": 1\n                            },\n                            \"title\": \"Specular color\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 717,\n                            \"y\": 802,\n                            \"uid\": 79,\n                            \"dsid\": 20,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"15\": 3,\n                                    \"21\": 4,\n                                    \"22\": 5,\n                                    \"23\": 6,\n                                    \"24\": 7,\n                                    \"25\": 8,\n                                    \"34\": 10,\n                                    \"39\": 12,\n                                    \"40\": 13,\n                                    \"41\": 14,\n                                    \"44\": 16,\n                                    \"47\": 18,\n                                    \"49\": 19\n                                },\n                                \"output_sids\": {\n                                    \"9\": 0\n                                }\n                            },\n                            \"title\": \"Material chain\",\n                            \"graph\": {\n                                \"node_uid\": 50,\n                                \"uid\": 67,\n                                \"parent_uid\": 43,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"material_diffuse_color_modulator\",\n                                        \"x\": 1029,\n                                        \"y\": 68,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"material_alpha_clip_modulator\",\n                                        \"x\": 1137,\n                                        \"y\": 68,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 1025,\n                                        \"y\": 145,\n                                        \"uid\": 6,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Alpha clip\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_texture_modulator\",\n                                        \"x\": 1252,\n                                        \"y\": 68,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 1361,\n                                        \"y\": 68,\n                                        \"uid\": 9,\n                                        \"dsid\": 29,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_blend_mode_modulator\",\n                                        \"x\": 898,\n                                        \"y\": 69,\n                                        \"uid\": 10\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 1173,\n                                        \"y\": 143,\n                                        \"uid\": 15,\n                                        \"dsid\": 29,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Image\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 2,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 134,\n                                        \"uid\": 21,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 798,\n                                        \"y\": 183,\n                                        \"uid\": 22,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 231,\n                                        \"uid\": 23,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 799,\n                                        \"y\": 279,\n                                        \"uid\": 24,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"alpha\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 70,\n                                        \"uid\": 25,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"blend mode\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 907,\n                                        \"y\": 147,\n                                        \"uid\": 26\n                                    },\n                                    {\n                                        \"plugin\": \"material_z_buffer_modulator\",\n                                        \"x\": 672,\n                                        \"y\": 65,\n                                        \"uid\": 27\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 564,\n                                        \"y\": 212,\n                                        \"uid\": 28,\n                                        \"state\": {\n                                            \"enabled\": true\n                                        },\n                                        \"title\": \"Z-buffer\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_shinyness_modulator\",\n                                        \"x\": 558,\n                                        \"y\": 64,\n                                        \"uid\": 31\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 454,\n                                        \"y\": 148,\n                                        \"uid\": 32,\n                                        \"dsid\": 3,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"9\": 0\n                                            },\n                                            \"output_sids\": {\n                                                \"12\": 2\n                                            }\n                                        },\n                                        \"title\": \"min max calc\",\n                                        \"graph\": {\n                                            \"node_uid\": 13,\n                                            \"uid\": 68,\n                                            \"parent_uid\": 67,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 27,\n                                                    \"y\": 190,\n                                                    \"uid\": 2,\n                                                    \"state\": {\n                                                        \"val\": 10\n                                                    },\n                                                    \"title\": \"Maximum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"subtract_modulator\",\n                                                    \"x\": 144,\n                                                    \"y\": 65,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"absolute_modulator\",\n                                                    \"x\": 232,\n                                                    \"y\": 65,\n                                                    \"uid\": 4\n                                                },\n                                                {\n                                                    \"plugin\": \"multiply_modulator\",\n                                                    \"x\": 319,\n                                                    \"y\": 45,\n                                                    \"uid\": 5\n                                                },\n                                                {\n                                                    \"plugin\": \"add_modulator\",\n                                                    \"x\": 401,\n                                                    \"y\": 122,\n                                                    \"uid\": 7\n                                                },\n                                                {\n                                                    \"plugin\": \"min_modulator\",\n                                                    \"x\": 143,\n                                                    \"y\": 142,\n                                                    \"uid\": 8\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 248,\n                                                    \"y\": 9,\n                                                    \"uid\": 9,\n                                                    \"dsid\": 21,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 10,\n                                                    \"y\": 85,\n                                                    \"uid\": 11,\n                                                    \"state\": {\n                                                        \"val\": 0\n                                                    },\n                                                    \"title\": \"Minimum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 486,\n                                                    \"y\": 122,\n                                                    \"uid\": 12,\n                                                    \"dsid\": 21,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 4,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 4,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 7,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 8,\n                                                    \"dst_nuid\": 7,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 9,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 7,\n                                                    \"dst_nuid\": 12,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 2,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 361,\n                                        \"y\": 242,\n                                        \"uid\": 34,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"shinyness\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_double_sided_modulator\",\n                                        \"x\": 437,\n                                        \"y\": 61,\n                                        \"uid\": 35\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 323,\n                                        \"y\": 161,\n                                        \"uid\": 36,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Double-sided\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_ambient_color_modulator\",\n                                        \"x\": 290,\n                                        \"y\": 73,\n                                        \"uid\": 37\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 63,\n                                        \"y\": 153,\n                                        \"uid\": 39,\n                                        \"dsid\": 24,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 60,\n                                        \"y\": 202,\n                                        \"uid\": 40,\n                                        \"dsid\": 24,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 63,\n                                        \"y\": 250,\n                                        \"uid\": 41,\n                                        \"dsid\": 24,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 170,\n                                        \"y\": 166,\n                                        \"uid\": 43\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 61,\n                                        \"y\": 99,\n                                        \"uid\": 44,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 40,\n                                        \"y\": 52,\n                                        \"uid\": 47,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 13,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_light_modulator\",\n                                        \"x\": 158,\n                                        \"y\": 22,\n                                        \"uid\": 48\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 54,\n                                        \"y\": 0,\n                                        \"uid\": 49,\n                                        \"dsid\": 5,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light index\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 27,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 28,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 31,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 32,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 34,\n                                        \"dst_nuid\": 32,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 35,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 36,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 37,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 39,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 40,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 41,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 43,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 47,\n                                        \"dst_nuid\": 48,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 44,\n                                        \"dst_nuid\": 48,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 48,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 49,\n                                        \"dst_nuid\": 48,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"Image\",\n                                    \"dt\": 2,\n                                    \"uid\": 3,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"alpha\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"blend mode\",\n                                    \"dt\": 0,\n                                    \"uid\": 8,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"shinyness\",\n                                    \"dt\": 0,\n                                    \"uid\": 10,\n                                    \"index\": 6,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 12,\n                                    \"index\": 7,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 13,\n                                    \"index\": 8,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 14,\n                                    \"index\": 9,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 16,\n                                    \"index\": 10,\n                                    \"type\": 0,\n                                    \"is_connected\": false\n                                },\n                                {\n                                    \"name\": \"light\",\n                                    \"dt\": 13,\n                                    \"uid\": 18,\n                                    \"index\": 11,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"light index\",\n                                    \"dt\": 0,\n                                    \"uid\": 19,\n                                    \"index\": 12,\n                                    \"type\": 0\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"url_texture_generator\",\n                            \"x\": 300,\n                            \"y\": 802,\n                            \"uid\": 80,\n                            \"state\": {\n                                \"url\": \"/data/image/57422df4c11a76d5531ef36299d5d1ac5b6b6739.jpg\"\n                            },\n                            \"title\": \"Image\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 403,\n                            \"y\": 802,\n                            \"uid\": 81,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 476,\n                            \"y\": 802,\n                            \"uid\": 82,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Saturation\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 555,\n                            \"y\": 802,\n                            \"uid\": 83,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Luminosity\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 636,\n                            \"y\": 802,\n                            \"uid\": 84,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Alpha\"\n                        },\n                        {\n                            \"plugin\": \"blend_mode_generator\",\n                            \"x\": 557,\n                            \"y\": 868,\n                            \"uid\": 85,\n                            \"state\": {\n                                \"mode\": 4\n                            }\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 476,\n                            \"y\": 868,\n                            \"uid\": 86,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Shinyness\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 435,\n                            \"y\": 940,\n                            \"uid\": 87,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Ambient Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 527,\n                            \"y\": 940,\n                            \"uid\": 88,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Ambient Sat\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 615,\n                            \"y\": 940,\n                            \"uid\": 89,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Ambient Lum\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 781,\n                            \"y\": 193,\n                            \"uid\": 90,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"0\": 0,\n                                    \"1\": 1,\n                                    \"2\": 2\n                                },\n                                \"output_sids\": {\n                                    \"3\": 3\n                                }\n                            },\n                            \"title\": \"Camera\",\n                            \"graph\": {\n                                \"node_uid\": 25,\n                                \"uid\": 69,\n                                \"parent_uid\": 43,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 74,\n                                        \"y\": 173,\n                                        \"uid\": 0,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"rotation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 129,\n                                        \"y\": 89,\n                                        \"uid\": 1,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"elevation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 52,\n                                        \"y\": 48,\n                                        \"uid\": 2,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"dolly\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 558,\n                                        \"y\": 35,\n                                        \"uid\": 3,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"perspective_camera\",\n                                        \"x\": 448,\n                                        \"y\": 75,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 218,\n                                        \"y\": 28,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"rotation_xyz_matrix\",\n                                        \"x\": 160,\n                                        \"y\": 153,\n                                        \"uid\": 6\n                                    },\n                                    {\n                                        \"plugin\": \"vector_transform\",\n                                        \"x\": 342,\n                                        \"y\": 77,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 219,\n                                        \"y\": 267,\n                                        \"uid\": 21\n                                    },\n                                    {\n                                        \"plugin\": \"vector_transform\",\n                                        \"x\": 341,\n                                        \"y\": 190,\n                                        \"uid\": 22\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 104,\n                                        \"y\": 287,\n                                        \"uid\": 23,\n                                        \"state\": {\n                                            \"val\": 0.5\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"negate_modulator\",\n                                        \"x\": 132,\n                                        \"y\": 33,\n                                        \"uid\": 24\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 22,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 22,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 4\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 24,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"rotation\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"elevation\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"dolly\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 3,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 562,\n                            \"y\": 150,\n                            \"uid\": 91,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -180,\n                                \"max\": 180\n                            },\n                            \"title\": \"Rotation\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 562,\n                            \"y\": 233,\n                            \"uid\": 92,\n                            \"state\": {\n                                \"val\": 2.4,\n                                \"min\": -20,\n                                \"max\": 20\n                            },\n                            \"title\": \"Elevation\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 562,\n                            \"y\": 316,\n                            \"uid\": 93,\n                            \"state\": {\n                                \"val\": 4.6,\n                                \"min\": 0,\n                                \"max\": 10\n                            },\n                            \"title\": \"Dolly\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 11,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 12,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 13,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 14,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 8,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 8,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 9,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 10,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 17,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 18,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 18,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 19,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 42,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 21,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 32,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 33,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 34,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 31,\n                            \"dst_nuid\": 42,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true,\n                            \"offset\": 2\n                        },\n                        {\n                            \"src_nuid\": 36,\n                            \"dst_nuid\": 42,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 39,\n                            \"dst_nuid\": 38,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 40,\n                            \"dst_nuid\": 38,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 41,\n                            \"dst_nuid\": 38,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 38,\n                            \"dst_nuid\": 42,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 6,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 7,\n                            \"dst_dyn\": true,\n                            \"offset\": 2\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 15,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 16,\n                            \"dst_dyn\": true,\n                            \"offset\": 2\n                        },\n                        {\n                            \"src_nuid\": 71,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 73,\n                            \"dst_nuid\": 72,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 74,\n                            \"dst_nuid\": 72,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 75,\n                            \"dst_nuid\": 72,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 76,\n                            \"dst_nuid\": 72,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 77,\n                            \"dst_nuid\": 72,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 78,\n                            \"dst_nuid\": 72,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 80,\n                            \"dst_nuid\": 79,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 81,\n                            \"dst_nuid\": 79,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 82,\n                            \"dst_nuid\": 79,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 83,\n                            \"dst_nuid\": 79,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 84,\n                            \"dst_nuid\": 79,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 85,\n                            \"dst_nuid\": 79,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 86,\n                            \"dst_nuid\": 79,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 6,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 89,\n                            \"dst_nuid\": 79,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 9,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 88,\n                            \"dst_nuid\": 79,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 8,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 87,\n                            \"dst_nuid\": 79,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 7,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 72,\n                            \"dst_nuid\": 79,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 11,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 79,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 22,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 91,\n                            \"dst_nuid\": 90,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 92,\n                            \"dst_nuid\": 90,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 93,\n                            \"dst_nuid\": 90,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 90,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 20,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                }\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/instancing_ifs_with_camera_and_light_out.json",
    "content": "{\n    \"abs_t\": 28.071,\n    \"active_graph\": 0,\n    \"graph_uid\": 95,\n    \"root\": {\n        \"node_uid\": 50,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 376,\n                \"y\": 455,\n                \"uid\": 49,\n                \"dsid\": 2,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {\n                        \"90\": 0,\n                        \"91\": 1\n                    },\n                    \"output_sids\": {}\n                },\n                \"title\": \"IFS controls\",\n                \"graph\": {\n                    \"node_uid\": 92,\n                    \"uid\": 70,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 863,\n                            \"y\": 69,\n                            \"uid\": 0,\n                            \"dsid\": 24,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"5\": 0,\n                                    \"13\": 1,\n                                    \"25\": 2,\n                                    \"26\": 3,\n                                    \"27\": 4,\n                                    \"28\": 5,\n                                    \"29\": 6,\n                                    \"30\": 7,\n                                    \"31\": 8,\n                                    \"32\": 9,\n                                    \"33\": 10,\n                                    \"47\": 12,\n                                    \"48\": 13,\n                                    \"49\": 14,\n                                    \"50\": 15,\n                                    \"51\": 16,\n                                    \"52\": 17,\n                                    \"53\": 18,\n                                    \"54\": 19,\n                                    \"55\": 20,\n                                    \"56\": 21,\n                                    \"57\": 22,\n                                    \"58\": 23\n                                },\n                                \"output_sids\": {}\n                            },\n                            \"title\": \"IFS system\",\n                            \"graph\": {\n                                \"node_uid\": 69,\n                                \"uid\": 71,\n                                \"parent_uid\": 70,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"instance_ifs_modulator\",\n                                        \"x\": 771,\n                                        \"y\": 57,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"scene_renderer_emitter\",\n                                        \"x\": 1042,\n                                        \"y\": 65,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 597,\n                                        \"y\": 55,\n                                        \"uid\": 5,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"recursion depth\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 605,\n                                        \"y\": 108,\n                                        \"uid\": 13,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"mesh\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 9,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 284,\n                                        \"y\": 47,\n                                        \"uid\": 15,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"13\": 5,\n                                                \"14\": 6,\n                                                \"15\": 7\n                                            },\n                                            \"output_sids\": {\n                                                \"2\": 1\n                                            }\n                                        },\n                                        \"title\": \"Translate\",\n                                        \"graph\": {\n                                            \"node_uid\": 17,\n                                            \"uid\": 72,\n                                            \"parent_uid\": 71,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 525,\n                                                    \"y\": 243,\n                                                    \"uid\": 2,\n                                                    \"dsid\": 17,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"vector\",\n                                                    \"x\": 331,\n                                                    \"y\": 241,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 173,\n                                                    \"y\": 314,\n                                                    \"uid\": 13,\n                                                    \"dsid\": 17,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"x\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 204,\n                                                    \"y\": 397,\n                                                    \"uid\": 14,\n                                                    \"dsid\": 17,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"y\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 223,\n                                                    \"y\": 456,\n                                                    \"uid\": 15,\n                                                    \"dsid\": 17,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"z\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"translation_matrix\",\n                                                    \"x\": 435,\n                                                    \"y\": 243,\n                                                    \"uid\": 16\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 13,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 14,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 15,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 2,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 16,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 16,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"x\",\n                                                \"dt\": 0,\n                                                \"uid\": 5,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"y\",\n                                                \"dt\": 0,\n                                                \"uid\": 6,\n                                                \"index\": 1,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"z\",\n                                                \"dt\": 0,\n                                                \"uid\": 7,\n                                                \"index\": 2,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 1,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 272,\n                                        \"y\": 234,\n                                        \"uid\": 19,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"13\": 5,\n                                                \"14\": 6,\n                                                \"15\": 7\n                                            },\n                                            \"output_sids\": {\n                                                \"2\": 1\n                                            }\n                                        },\n                                        \"title\": \"Scale\",\n                                        \"graph\": {\n                                            \"node_uid\": 16,\n                                            \"uid\": 73,\n                                            \"parent_uid\": 71,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"scale_matrix\",\n                                                    \"x\": 456,\n                                                    \"y\": 245,\n                                                    \"uid\": 0\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 590,\n                                                    \"y\": 257,\n                                                    \"uid\": 2,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"vector\",\n                                                    \"x\": 331,\n                                                    \"y\": 241,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 173,\n                                                    \"y\": 314,\n                                                    \"uid\": 13,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"x\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 204,\n                                                    \"y\": 397,\n                                                    \"uid\": 14,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"y\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 223,\n                                                    \"y\": 456,\n                                                    \"uid\": 15,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"z\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 0,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 13,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 14,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 15,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 2,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"x\",\n                                                \"dt\": 0,\n                                                \"uid\": 5,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"y\",\n                                                \"dt\": 0,\n                                                \"uid\": 6,\n                                                \"index\": 1,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"z\",\n                                                \"dt\": 0,\n                                                \"uid\": 7,\n                                                \"index\": 2,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 1,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 479,\n                                        \"y\": 58,\n                                        \"uid\": 21,\n                                        \"dsid\": 4,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"8\": 1,\n                                                \"9\": 2,\n                                                \"10\": 3\n                                            },\n                                            \"output_sids\": {\n                                                \"1\": 0\n                                            }\n                                        },\n                                        \"title\": \"Rotate\",\n                                        \"graph\": {\n                                            \"node_uid\": 16,\n                                            \"uid\": 74,\n                                            \"parent_uid\": 71,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"rotation_xyz_matrix\",\n                                                    \"x\": 385,\n                                                    \"y\": 227,\n                                                    \"uid\": 0\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 509,\n                                                    \"y\": 216,\n                                                    \"uid\": 1,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 88,\n                                                    \"y\": 147,\n                                                    \"uid\": 8,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"X\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 68,\n                                                    \"y\": 231,\n                                                    \"uid\": 9,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"Y\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 67,\n                                                    \"y\": 353,\n                                                    \"uid\": 10,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"Z\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"graph\",\n                                                    \"x\": 179,\n                                                    \"y\": 272,\n                                                    \"uid\": 13,\n                                                    \"dsid\": 2,\n                                                    \"state\": {\n                                                        \"enabled\": true,\n                                                        \"always_update\": true,\n                                                        \"rt_width\": 512,\n                                                        \"rt_height\": 512,\n                                                        \"input_sids\": {\n                                                            \"7\": 0\n                                                        },\n                                                        \"output_sids\": {\n                                                            \"8\": 1\n                                                        }\n                                                    },\n                                                    \"title\": \"Knob compute\",\n                                                    \"graph\": {\n                                                        \"node_uid\": 9,\n                                                        \"uid\": 75,\n                                                        \"parent_uid\": 74,\n                                                        \"open\": true,\n                                                        \"nodes\": [\n                                                            {\n                                                                \"plugin\": \"add_modulator\",\n                                                                \"x\": 660,\n                                                                \"y\": 204,\n                                                                \"uid\": 0\n                                                            },\n                                                            {\n                                                                \"plugin\": \"multiply_modulator\",\n                                                                \"x\": 553,\n                                                                \"y\": 165,\n                                                                \"uid\": 1\n                                                            },\n                                                            {\n                                                                \"plugin\": \"subtract_modulator\",\n                                                                \"x\": 335,\n                                                                \"y\": 296,\n                                                                \"uid\": 2\n                                                            },\n                                                            {\n                                                                \"plugin\": \"absolute_modulator\",\n                                                                \"x\": 465,\n                                                                \"y\": 321,\n                                                                \"uid\": 3\n                                                            },\n                                                            {\n                                                                \"plugin\": \"min_modulator\",\n                                                                \"x\": 382,\n                                                                \"y\": 407,\n                                                                \"uid\": 4\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 124,\n                                                                \"y\": 212,\n                                                                \"uid\": 5,\n                                                                \"state\": {\n                                                                    \"val\": -180\n                                                                },\n                                                                \"title\": \"Minimum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 118,\n                                                                \"y\": 371,\n                                                                \"uid\": 6,\n                                                                \"state\": {\n                                                                    \"val\": 180\n                                                                },\n                                                                \"title\": \"Maximum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"input_proxy\",\n                                                                \"x\": 301,\n                                                                \"y\": 131,\n                                                                \"uid\": 7,\n                                                                \"dsid\": 15,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_out\": [\n                                                                    {\n                                                                        \"name\": \"output\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 1,\n                                                                        \"connected\": true\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"plugin\": \"output_proxy\",\n                                                                \"x\": 764,\n                                                                \"y\": 210,\n                                                                \"uid\": 8,\n                                                                \"dsid\": 15,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_in\": [\n                                                                    {\n                                                                        \"name\": \"input\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 0,\n                                                                        \"connected\": true,\n                                                                        \"is_connected\": true\n                                                                    }\n                                                                ]\n                                                            }\n                                                        ],\n                                                        \"conns\": [\n                                                            {\n                                                                \"src_nuid\": 1,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 4,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 3,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 2,\n                                                                \"dst_nuid\": 3,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 7,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"src_connected\": true,\n                                                                \"src_dyn\": true\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 0,\n                                                                \"dst_nuid\": 8,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"dst_connected\": true,\n                                                                \"dst_dyn\": true\n                                                            }\n                                                        ]\n                                                    },\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ],\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 1,\n                                                            \"index\": 0,\n                                                            \"type\": 1\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"graph\",\n                                                    \"x\": 172,\n                                                    \"y\": 352,\n                                                    \"uid\": 14,\n                                                    \"dsid\": 2,\n                                                    \"state\": {\n                                                        \"enabled\": true,\n                                                        \"always_update\": true,\n                                                        \"rt_width\": 512,\n                                                        \"rt_height\": 512,\n                                                        \"input_sids\": {\n                                                            \"7\": 0\n                                                        },\n                                                        \"output_sids\": {\n                                                            \"8\": 1\n                                                        }\n                                                    },\n                                                    \"title\": \"Knob compute\",\n                                                    \"graph\": {\n                                                        \"node_uid\": 9,\n                                                        \"uid\": 76,\n                                                        \"parent_uid\": 74,\n                                                        \"open\": true,\n                                                        \"nodes\": [\n                                                            {\n                                                                \"plugin\": \"add_modulator\",\n                                                                \"x\": 660,\n                                                                \"y\": 204,\n                                                                \"uid\": 0\n                                                            },\n                                                            {\n                                                                \"plugin\": \"multiply_modulator\",\n                                                                \"x\": 553,\n                                                                \"y\": 165,\n                                                                \"uid\": 1\n                                                            },\n                                                            {\n                                                                \"plugin\": \"subtract_modulator\",\n                                                                \"x\": 335,\n                                                                \"y\": 296,\n                                                                \"uid\": 2\n                                                            },\n                                                            {\n                                                                \"plugin\": \"absolute_modulator\",\n                                                                \"x\": 465,\n                                                                \"y\": 321,\n                                                                \"uid\": 3\n                                                            },\n                                                            {\n                                                                \"plugin\": \"min_modulator\",\n                                                                \"x\": 382,\n                                                                \"y\": 407,\n                                                                \"uid\": 4\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 124,\n                                                                \"y\": 212,\n                                                                \"uid\": 5,\n                                                                \"state\": {\n                                                                    \"val\": -180\n                                                                },\n                                                                \"title\": \"Minimum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 118,\n                                                                \"y\": 371,\n                                                                \"uid\": 6,\n                                                                \"state\": {\n                                                                    \"val\": 180\n                                                                },\n                                                                \"title\": \"Maximum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"input_proxy\",\n                                                                \"x\": 301,\n                                                                \"y\": 131,\n                                                                \"uid\": 7,\n                                                                \"dsid\": 16,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_out\": [\n                                                                    {\n                                                                        \"name\": \"output\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 1,\n                                                                        \"connected\": true\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"plugin\": \"output_proxy\",\n                                                                \"x\": 764,\n                                                                \"y\": 210,\n                                                                \"uid\": 8,\n                                                                \"dsid\": 16,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_in\": [\n                                                                    {\n                                                                        \"name\": \"input\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 0,\n                                                                        \"connected\": true,\n                                                                        \"is_connected\": true\n                                                                    }\n                                                                ]\n                                                            }\n                                                        ],\n                                                        \"conns\": [\n                                                            {\n                                                                \"src_nuid\": 1,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 4,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 3,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 2,\n                                                                \"dst_nuid\": 3,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 7,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"src_connected\": true,\n                                                                \"src_dyn\": true\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 0,\n                                                                \"dst_nuid\": 8,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"dst_connected\": true,\n                                                                \"dst_dyn\": true\n                                                            }\n                                                        ]\n                                                    },\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"is_connected\": true,\n                                                            \"connected\": false\n                                                        }\n                                                    ],\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 1,\n                                                            \"index\": 0,\n                                                            \"type\": 1\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"graph\",\n                                                    \"x\": 192,\n                                                    \"y\": 428,\n                                                    \"uid\": 15,\n                                                    \"dsid\": 2,\n                                                    \"state\": {\n                                                        \"enabled\": true,\n                                                        \"always_update\": true,\n                                                        \"rt_width\": 512,\n                                                        \"rt_height\": 512,\n                                                        \"input_sids\": {\n                                                            \"7\": 0\n                                                        },\n                                                        \"output_sids\": {\n                                                            \"8\": 1\n                                                        }\n                                                    },\n                                                    \"title\": \"Knob compute\",\n                                                    \"graph\": {\n                                                        \"node_uid\": 9,\n                                                        \"uid\": 77,\n                                                        \"parent_uid\": 74,\n                                                        \"open\": true,\n                                                        \"nodes\": [\n                                                            {\n                                                                \"plugin\": \"add_modulator\",\n                                                                \"x\": 660,\n                                                                \"y\": 204,\n                                                                \"uid\": 0\n                                                            },\n                                                            {\n                                                                \"plugin\": \"multiply_modulator\",\n                                                                \"x\": 553,\n                                                                \"y\": 165,\n                                                                \"uid\": 1\n                                                            },\n                                                            {\n                                                                \"plugin\": \"subtract_modulator\",\n                                                                \"x\": 335,\n                                                                \"y\": 296,\n                                                                \"uid\": 2\n                                                            },\n                                                            {\n                                                                \"plugin\": \"absolute_modulator\",\n                                                                \"x\": 465,\n                                                                \"y\": 321,\n                                                                \"uid\": 3\n                                                            },\n                                                            {\n                                                                \"plugin\": \"min_modulator\",\n                                                                \"x\": 382,\n                                                                \"y\": 407,\n                                                                \"uid\": 4\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 124,\n                                                                \"y\": 212,\n                                                                \"uid\": 5,\n                                                                \"state\": {\n                                                                    \"val\": -180\n                                                                },\n                                                                \"title\": \"Minimum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 118,\n                                                                \"y\": 371,\n                                                                \"uid\": 6,\n                                                                \"state\": {\n                                                                    \"val\": 180\n                                                                },\n                                                                \"title\": \"Maximum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"input_proxy\",\n                                                                \"x\": 301,\n                                                                \"y\": 131,\n                                                                \"uid\": 7,\n                                                                \"dsid\": 16,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_out\": [\n                                                                    {\n                                                                        \"name\": \"output\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 1,\n                                                                        \"connected\": true\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"plugin\": \"output_proxy\",\n                                                                \"x\": 764,\n                                                                \"y\": 210,\n                                                                \"uid\": 8,\n                                                                \"dsid\": 16,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_in\": [\n                                                                    {\n                                                                        \"name\": \"input\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 0,\n                                                                        \"connected\": true,\n                                                                        \"is_connected\": true\n                                                                    }\n                                                                ]\n                                                            }\n                                                        ],\n                                                        \"conns\": [\n                                                            {\n                                                                \"src_nuid\": 1,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 4,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 3,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 2,\n                                                                \"dst_nuid\": 3,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 7,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"src_connected\": true,\n                                                                \"src_dyn\": true\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 0,\n                                                                \"dst_nuid\": 8,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"dst_connected\": true,\n                                                                \"dst_dyn\": true\n                                                            }\n                                                        ]\n                                                    },\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"is_connected\": true,\n                                                            \"connected\": false\n                                                        }\n                                                    ],\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 1,\n                                                            \"index\": 0,\n                                                            \"type\": 1\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 0,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 8,\n                                                    \"dst_nuid\": 13,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 13,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 9,\n                                                    \"dst_nuid\": 14,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"dst_connected\": false,\n                                                    \"src_dyn\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 14,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 10,\n                                                    \"dst_nuid\": 15,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"dst_connected\": false,\n                                                    \"src_dyn\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 15,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 2,\n                                                    \"src_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"X\",\n                                                \"dt\": 0,\n                                                \"uid\": 1,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"Y\",\n                                                \"dt\": 0,\n                                                \"uid\": 2,\n                                                \"index\": 1,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"Z\",\n                                                \"dt\": 0,\n                                                \"uid\": 3,\n                                                \"index\": 2,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 114,\n                                        \"y\": 57,\n                                        \"uid\": 25,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"lvl pos x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 114,\n                                        \"y\": 110,\n                                        \"uid\": 26,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"lvl pos y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 114,\n                                        \"y\": 165,\n                                        \"uid\": 27,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"lvl pos z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 106,\n                                        \"y\": 298,\n                                        \"uid\": 28,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"lvl scl x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 105,\n                                        \"y\": 354,\n                                        \"uid\": 29,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"lvl scl y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 106,\n                                        \"y\": 417,\n                                        \"uid\": 30,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"lvl scl z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 391,\n                                        \"y\": 31,\n                                        \"uid\": 31,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"lvl rot x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 392,\n                                        \"y\": 98,\n                                        \"uid\": 32,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"lvl rot y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 392,\n                                        \"y\": 155,\n                                        \"uid\": 33,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"lvl rot z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 442,\n                                        \"y\": 586,\n                                        \"uid\": 36,\n                                        \"dsid\": 4,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"8\": 1,\n                                                \"9\": 2,\n                                                \"10\": 3\n                                            },\n                                            \"output_sids\": {\n                                                \"1\": 0\n                                            }\n                                        },\n                                        \"title\": \"branch rotate\",\n                                        \"graph\": {\n                                            \"node_uid\": 14,\n                                            \"uid\": 78,\n                                            \"parent_uid\": 71,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"rotation_xyz_matrix\",\n                                                    \"x\": 385,\n                                                    \"y\": 227,\n                                                    \"uid\": 0\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 509,\n                                                    \"y\": 216,\n                                                    \"uid\": 1,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 88,\n                                                    \"y\": 147,\n                                                    \"uid\": 8,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"X\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 190,\n                                                    \"y\": 106,\n                                                    \"uid\": 9,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"Y\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 272,\n                                                    \"y\": 181,\n                                                    \"uid\": 10,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"Z\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"graph\",\n                                                    \"x\": 161,\n                                                    \"y\": 264,\n                                                    \"uid\": 11,\n                                                    \"dsid\": 2,\n                                                    \"state\": {\n                                                        \"enabled\": true,\n                                                        \"always_update\": true,\n                                                        \"rt_width\": 512,\n                                                        \"rt_height\": 512,\n                                                        \"input_sids\": {\n                                                            \"7\": 0\n                                                        },\n                                                        \"output_sids\": {\n                                                            \"8\": 1\n                                                        }\n                                                    },\n                                                    \"title\": \"Knob compute\",\n                                                    \"graph\": {\n                                                        \"node_uid\": 9,\n                                                        \"uid\": 79,\n                                                        \"parent_uid\": 78,\n                                                        \"open\": true,\n                                                        \"nodes\": [\n                                                            {\n                                                                \"plugin\": \"add_modulator\",\n                                                                \"x\": 660,\n                                                                \"y\": 204,\n                                                                \"uid\": 0\n                                                            },\n                                                            {\n                                                                \"plugin\": \"multiply_modulator\",\n                                                                \"x\": 553,\n                                                                \"y\": 165,\n                                                                \"uid\": 1\n                                                            },\n                                                            {\n                                                                \"plugin\": \"subtract_modulator\",\n                                                                \"x\": 335,\n                                                                \"y\": 296,\n                                                                \"uid\": 2\n                                                            },\n                                                            {\n                                                                \"plugin\": \"absolute_modulator\",\n                                                                \"x\": 465,\n                                                                \"y\": 321,\n                                                                \"uid\": 3\n                                                            },\n                                                            {\n                                                                \"plugin\": \"min_modulator\",\n                                                                \"x\": 382,\n                                                                \"y\": 407,\n                                                                \"uid\": 4\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 124,\n                                                                \"y\": 212,\n                                                                \"uid\": 5,\n                                                                \"state\": {\n                                                                    \"val\": -180\n                                                                },\n                                                                \"title\": \"Minimum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 118,\n                                                                \"y\": 371,\n                                                                \"uid\": 6,\n                                                                \"state\": {\n                                                                    \"val\": 180\n                                                                },\n                                                                \"title\": \"Maximum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"input_proxy\",\n                                                                \"x\": 301,\n                                                                \"y\": 131,\n                                                                \"uid\": 7,\n                                                                \"dsid\": 16,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_out\": [\n                                                                    {\n                                                                        \"name\": \"output\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 1,\n                                                                        \"connected\": true\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"plugin\": \"output_proxy\",\n                                                                \"x\": 764,\n                                                                \"y\": 210,\n                                                                \"uid\": 8,\n                                                                \"dsid\": 16,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_in\": [\n                                                                    {\n                                                                        \"name\": \"input\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 0,\n                                                                        \"connected\": true,\n                                                                        \"is_connected\": true\n                                                                    }\n                                                                ]\n                                                            }\n                                                        ],\n                                                        \"conns\": [\n                                                            {\n                                                                \"src_nuid\": 1,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 4,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 3,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 2,\n                                                                \"dst_nuid\": 3,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 7,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"src_connected\": true,\n                                                                \"src_dyn\": true\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 0,\n                                                                \"dst_nuid\": 8,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"dst_connected\": true,\n                                                                \"dst_dyn\": true\n                                                            }\n                                                        ]\n                                                    },\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"is_connected\": true,\n                                                            \"connected\": false\n                                                        }\n                                                    ],\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 1,\n                                                            \"index\": 0,\n                                                            \"type\": 1\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"graph\",\n                                                    \"x\": 191,\n                                                    \"y\": 341,\n                                                    \"uid\": 12,\n                                                    \"dsid\": 2,\n                                                    \"state\": {\n                                                        \"enabled\": true,\n                                                        \"always_update\": true,\n                                                        \"rt_width\": 512,\n                                                        \"rt_height\": 512,\n                                                        \"input_sids\": {\n                                                            \"7\": 0\n                                                        },\n                                                        \"output_sids\": {\n                                                            \"8\": 1\n                                                        }\n                                                    },\n                                                    \"title\": \"Knob compute\",\n                                                    \"graph\": {\n                                                        \"node_uid\": 9,\n                                                        \"uid\": 80,\n                                                        \"parent_uid\": 78,\n                                                        \"open\": true,\n                                                        \"nodes\": [\n                                                            {\n                                                                \"plugin\": \"add_modulator\",\n                                                                \"x\": 660,\n                                                                \"y\": 204,\n                                                                \"uid\": 0\n                                                            },\n                                                            {\n                                                                \"plugin\": \"multiply_modulator\",\n                                                                \"x\": 553,\n                                                                \"y\": 165,\n                                                                \"uid\": 1\n                                                            },\n                                                            {\n                                                                \"plugin\": \"subtract_modulator\",\n                                                                \"x\": 335,\n                                                                \"y\": 296,\n                                                                \"uid\": 2\n                                                            },\n                                                            {\n                                                                \"plugin\": \"absolute_modulator\",\n                                                                \"x\": 465,\n                                                                \"y\": 321,\n                                                                \"uid\": 3\n                                                            },\n                                                            {\n                                                                \"plugin\": \"min_modulator\",\n                                                                \"x\": 382,\n                                                                \"y\": 407,\n                                                                \"uid\": 4\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 124,\n                                                                \"y\": 212,\n                                                                \"uid\": 5,\n                                                                \"state\": {\n                                                                    \"val\": -180\n                                                                },\n                                                                \"title\": \"Minimum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 118,\n                                                                \"y\": 371,\n                                                                \"uid\": 6,\n                                                                \"state\": {\n                                                                    \"val\": 180\n                                                                },\n                                                                \"title\": \"Maximum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"input_proxy\",\n                                                                \"x\": 301,\n                                                                \"y\": 131,\n                                                                \"uid\": 7,\n                                                                \"dsid\": 16,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_out\": [\n                                                                    {\n                                                                        \"name\": \"output\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 1,\n                                                                        \"connected\": true\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"plugin\": \"output_proxy\",\n                                                                \"x\": 764,\n                                                                \"y\": 210,\n                                                                \"uid\": 8,\n                                                                \"dsid\": 16,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_in\": [\n                                                                    {\n                                                                        \"name\": \"input\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 0,\n                                                                        \"connected\": true,\n                                                                        \"is_connected\": true\n                                                                    }\n                                                                ]\n                                                            }\n                                                        ],\n                                                        \"conns\": [\n                                                            {\n                                                                \"src_nuid\": 1,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 4,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 3,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 2,\n                                                                \"dst_nuid\": 3,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 7,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"src_connected\": true,\n                                                                \"src_dyn\": true\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 0,\n                                                                \"dst_nuid\": 8,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"dst_connected\": true,\n                                                                \"dst_dyn\": true\n                                                            }\n                                                        ]\n                                                    },\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"is_connected\": true,\n                                                            \"connected\": false\n                                                        }\n                                                    ],\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 1,\n                                                            \"index\": 0,\n                                                            \"type\": 1\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"graph\",\n                                                    \"x\": 222,\n                                                    \"y\": 427,\n                                                    \"uid\": 13,\n                                                    \"dsid\": 2,\n                                                    \"state\": {\n                                                        \"enabled\": true,\n                                                        \"always_update\": true,\n                                                        \"rt_width\": 512,\n                                                        \"rt_height\": 512,\n                                                        \"input_sids\": {\n                                                            \"7\": 0\n                                                        },\n                                                        \"output_sids\": {\n                                                            \"8\": 1\n                                                        }\n                                                    },\n                                                    \"title\": \"Knob compute\",\n                                                    \"graph\": {\n                                                        \"node_uid\": 9,\n                                                        \"uid\": 81,\n                                                        \"parent_uid\": 78,\n                                                        \"open\": true,\n                                                        \"nodes\": [\n                                                            {\n                                                                \"plugin\": \"add_modulator\",\n                                                                \"x\": 660,\n                                                                \"y\": 204,\n                                                                \"uid\": 0\n                                                            },\n                                                            {\n                                                                \"plugin\": \"multiply_modulator\",\n                                                                \"x\": 553,\n                                                                \"y\": 165,\n                                                                \"uid\": 1\n                                                            },\n                                                            {\n                                                                \"plugin\": \"subtract_modulator\",\n                                                                \"x\": 335,\n                                                                \"y\": 296,\n                                                                \"uid\": 2\n                                                            },\n                                                            {\n                                                                \"plugin\": \"absolute_modulator\",\n                                                                \"x\": 465,\n                                                                \"y\": 321,\n                                                                \"uid\": 3\n                                                            },\n                                                            {\n                                                                \"plugin\": \"min_modulator\",\n                                                                \"x\": 382,\n                                                                \"y\": 407,\n                                                                \"uid\": 4\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 124,\n                                                                \"y\": 212,\n                                                                \"uid\": 5,\n                                                                \"state\": {\n                                                                    \"val\": -180\n                                                                },\n                                                                \"title\": \"Minimum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"const_float_generator\",\n                                                                \"x\": 118,\n                                                                \"y\": 371,\n                                                                \"uid\": 6,\n                                                                \"state\": {\n                                                                    \"val\": 180\n                                                                },\n                                                                \"title\": \"Maximum\"\n                                                            },\n                                                            {\n                                                                \"plugin\": \"input_proxy\",\n                                                                \"x\": 301,\n                                                                \"y\": 131,\n                                                                \"uid\": 7,\n                                                                \"dsid\": 16,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_out\": [\n                                                                    {\n                                                                        \"name\": \"output\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 1,\n                                                                        \"connected\": true\n                                                                    }\n                                                                ]\n                                                            },\n                                                            {\n                                                                \"plugin\": \"output_proxy\",\n                                                                \"x\": 764,\n                                                                \"y\": 210,\n                                                                \"uid\": 8,\n                                                                \"dsid\": 16,\n                                                                \"state\": {\n                                                                    \"slot_id\": 0\n                                                                },\n                                                                \"title\": \"value\",\n                                                                \"dyn_in\": [\n                                                                    {\n                                                                        \"name\": \"input\",\n                                                                        \"dt\": 0,\n                                                                        \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                                        \"uid\": 0,\n                                                                        \"index\": 0,\n                                                                        \"type\": 0,\n                                                                        \"connected\": true,\n                                                                        \"is_connected\": true\n                                                                    }\n                                                                ]\n                                                            }\n                                                        ],\n                                                        \"conns\": [\n                                                            {\n                                                                \"src_nuid\": 1,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 4,\n                                                                \"dst_nuid\": 0,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 3,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 2,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 2,\n                                                                \"dst_nuid\": 3,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 5,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 6,\n                                                                \"dst_nuid\": 4,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 1,\n                                                                \"offset\": 1\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 7,\n                                                                \"dst_nuid\": 1,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"src_connected\": true,\n                                                                \"src_dyn\": true\n                                                            },\n                                                            {\n                                                                \"src_nuid\": 0,\n                                                                \"dst_nuid\": 8,\n                                                                \"src_slot\": 0,\n                                                                \"dst_slot\": 0,\n                                                                \"dst_connected\": true,\n                                                                \"dst_dyn\": true\n                                                            }\n                                                        ]\n                                                    },\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"is_connected\": true,\n                                                            \"connected\": false\n                                                        }\n                                                    ],\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"value\",\n                                                            \"dt\": 0,\n                                                            \"uid\": 1,\n                                                            \"index\": 0,\n                                                            \"type\": 1\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 0,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 8,\n                                                    \"dst_nuid\": 11,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"dst_connected\": false,\n                                                    \"src_dyn\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 9,\n                                                    \"dst_nuid\": 12,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"dst_connected\": false,\n                                                    \"src_dyn\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 12,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 10,\n                                                    \"dst_nuid\": 13,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"dst_connected\": false,\n                                                    \"src_dyn\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 13,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 2,\n                                                    \"src_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"X\",\n                                                \"dt\": 0,\n                                                \"uid\": 1,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"Y\",\n                                                \"dt\": 0,\n                                                \"uid\": 2,\n                                                \"index\": 1,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"Z\",\n                                                \"dt\": 0,\n                                                \"uid\": 3,\n                                                \"index\": 2,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 438,\n                                        \"y\": 360,\n                                        \"uid\": 40,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"13\": 5,\n                                                \"14\": 6,\n                                                \"15\": 7\n                                            },\n                                            \"output_sids\": {\n                                                \"2\": 1\n                                            }\n                                        },\n                                        \"title\": \"branch trnslt\",\n                                        \"graph\": {\n                                            \"node_uid\": 17,\n                                            \"uid\": 82,\n                                            \"parent_uid\": 71,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 525,\n                                                    \"y\": 243,\n                                                    \"uid\": 2,\n                                                    \"dsid\": 17,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"vector\",\n                                                    \"x\": 331,\n                                                    \"y\": 241,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 173,\n                                                    \"y\": 314,\n                                                    \"uid\": 13,\n                                                    \"dsid\": 17,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"x\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 204,\n                                                    \"y\": 397,\n                                                    \"uid\": 14,\n                                                    \"dsid\": 17,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"y\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 223,\n                                                    \"y\": 456,\n                                                    \"uid\": 15,\n                                                    \"dsid\": 17,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"z\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"translation_matrix\",\n                                                    \"x\": 435,\n                                                    \"y\": 243,\n                                                    \"uid\": 16\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 13,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 14,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 15,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 2,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 16,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 16,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"x\",\n                                                \"dt\": 0,\n                                                \"uid\": 5,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"y\",\n                                                \"dt\": 0,\n                                                \"uid\": 6,\n                                                \"index\": 1,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"z\",\n                                                \"dt\": 0,\n                                                \"uid\": 7,\n                                                \"index\": 2,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 1,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 436,\n                                        \"y\": 474,\n                                        \"uid\": 44,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"13\": 5,\n                                                \"14\": 6,\n                                                \"15\": 7\n                                            },\n                                            \"output_sids\": {\n                                                \"2\": 1\n                                            }\n                                        },\n                                        \"title\": \"branch scale\",\n                                        \"graph\": {\n                                            \"node_uid\": 16,\n                                            \"uid\": 83,\n                                            \"parent_uid\": 71,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"scale_matrix\",\n                                                    \"x\": 456,\n                                                    \"y\": 245,\n                                                    \"uid\": 0\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 590,\n                                                    \"y\": 257,\n                                                    \"uid\": 2,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"vector\",\n                                                    \"x\": 331,\n                                                    \"y\": 241,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 173,\n                                                    \"y\": 314,\n                                                    \"uid\": 13,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"x\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 204,\n                                                    \"y\": 397,\n                                                    \"uid\": 14,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"y\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 223,\n                                                    \"y\": 456,\n                                                    \"uid\": 15,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"z\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 0,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 13,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 14,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 15,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 2,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"x\",\n                                                \"dt\": 0,\n                                                \"uid\": 5,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"y\",\n                                                \"dt\": 0,\n                                                \"uid\": 6,\n                                                \"index\": 1,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"z\",\n                                                \"dt\": 0,\n                                                \"uid\": 7,\n                                                \"index\": 2,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 1,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 330,\n                                        \"y\": 369,\n                                        \"uid\": 47,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"b trn x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 330,\n                                        \"y\": 422,\n                                        \"uid\": 48,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"b trn y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 328,\n                                        \"y\": 475,\n                                        \"uid\": 49,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"b trn z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 329,\n                                        \"y\": 543,\n                                        \"uid\": 50,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"b sc x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 330,\n                                        \"y\": 590,\n                                        \"uid\": 51,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"b sc y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 329,\n                                        \"y\": 636,\n                                        \"uid\": 52,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"b sc z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 327,\n                                        \"y\": 715,\n                                        \"uid\": 53,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"b rot x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 326,\n                                        \"y\": 757,\n                                        \"uid\": 54,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"b rot y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 327,\n                                        \"y\": 804,\n                                        \"uid\": 55,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"b rot z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 922,\n                                        \"y\": 185,\n                                        \"uid\": 56,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 924,\n                                        \"y\": 245,\n                                        \"uid\": 57,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"transform\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 820,\n                                        \"y\": 412,\n                                        \"uid\": 58,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 608,\n                                        \"y\": 390,\n                                        \"uid\": 64,\n                                        \"dsid\": 4,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"3\": 1,\n                                                \"4\": 2,\n                                                \"5\": 3\n                                            },\n                                            \"output_sids\": {\n                                                \"2\": 0\n                                            }\n                                        },\n                                        \"title\": \"Concatenate x2\",\n                                        \"graph\": {\n                                            \"node_uid\": 6,\n                                            \"uid\": 84,\n                                            \"parent_uid\": 71,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"concatenate_matrix_modulator\",\n                                                    \"x\": 392,\n                                                    \"y\": 263,\n                                                    \"uid\": 0\n                                                },\n                                                {\n                                                    \"plugin\": \"concatenate_matrix_modulator\",\n                                                    \"x\": 268,\n                                                    \"y\": 302,\n                                                    \"uid\": 1\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 532,\n                                                    \"y\": 244,\n                                                    \"uid\": 2,\n                                                    \"dsid\": 13,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 229,\n                                                    \"y\": 195,\n                                                    \"uid\": 3,\n                                                    \"dsid\": 13,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 148,\n                                                    \"y\": 343,\n                                                    \"uid\": 4,\n                                                    \"dsid\": 13,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 171,\n                                                    \"y\": 500,\n                                                    \"uid\": 5,\n                                                    \"dsid\": 13,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 1,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 0,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 4,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 1,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 2,\n                                                \"index\": 1,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 3,\n                                                \"index\": 2,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 574,\n                                        \"y\": 198,\n                                        \"uid\": 66,\n                                        \"dsid\": 4,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"3\": 1,\n                                                \"4\": 2,\n                                                \"5\": 3\n                                            },\n                                            \"output_sids\": {\n                                                \"2\": 0\n                                            }\n                                        },\n                                        \"title\": \"Concatenate x2\",\n                                        \"graph\": {\n                                            \"node_uid\": 6,\n                                            \"uid\": 85,\n                                            \"parent_uid\": 71,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"concatenate_matrix_modulator\",\n                                                    \"x\": 274,\n                                                    \"y\": 13,\n                                                    \"uid\": 0\n                                                },\n                                                {\n                                                    \"plugin\": \"concatenate_matrix_modulator\",\n                                                    \"x\": 92,\n                                                    \"y\": 13,\n                                                    \"uid\": 1\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 394,\n                                                    \"y\": 13,\n                                                    \"uid\": 2,\n                                                    \"dsid\": 8,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 197,\n                                                    \"y\": 14,\n                                                    \"uid\": 3,\n                                                    \"dsid\": 8,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 9,\n                                                    \"y\": 13,\n                                                    \"uid\": 4,\n                                                    \"dsid\": 8,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 9,\n                                                    \"y\": 71,\n                                                    \"uid\": 5,\n                                                    \"dsid\": 8,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"matrix\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 1,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 0,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 4,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 1,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 2,\n                                                \"index\": 1,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 3,\n                                                \"index\": 2,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"matrix\",\n                                                \"dt\": 4,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 15,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 15,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 27,\n                                        \"dst_nuid\": 15,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 28,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 29,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 30,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 31,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 32,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 33,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 53,\n                                        \"dst_nuid\": 36,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 54,\n                                        \"dst_nuid\": 36,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 55,\n                                        \"dst_nuid\": 36,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 50,\n                                        \"dst_nuid\": 44,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 51,\n                                        \"dst_nuid\": 44,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 52,\n                                        \"dst_nuid\": 44,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 49,\n                                        \"dst_nuid\": 40,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 48,\n                                        \"dst_nuid\": 40,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 47,\n                                        \"dst_nuid\": 40,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 56,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 57,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 40,\n                                        \"dst_nuid\": 64,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 44,\n                                        \"dst_nuid\": 64,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 36,\n                                        \"dst_nuid\": 64,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 64,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 4,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 66,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 66,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 19,\n                                        \"dst_nuid\": 66,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 66,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 58,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"recursion depth\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"mesh\",\n                                    \"dt\": 9,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"lvl pos x\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"lvl pos y\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"lvl pos z\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"lvl scl x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"lvl scl y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 6,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"lvl scl z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 7,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"lvl rot x\",\n                                    \"dt\": 0,\n                                    \"uid\": 8,\n                                    \"index\": 8,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"lvl rot y\",\n                                    \"dt\": 0,\n                                    \"uid\": 9,\n                                    \"index\": 9,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"lvl rot z\",\n                                    \"dt\": 0,\n                                    \"uid\": 10,\n                                    \"index\": 10,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"b trn x\",\n                                    \"dt\": 0,\n                                    \"uid\": 12,\n                                    \"index\": 11,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"b trn y\",\n                                    \"dt\": 0,\n                                    \"uid\": 13,\n                                    \"index\": 12,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"b trn z\",\n                                    \"dt\": 0,\n                                    \"uid\": 14,\n                                    \"index\": 13,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"b sc x\",\n                                    \"dt\": 0,\n                                    \"uid\": 15,\n                                    \"index\": 14,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"b sc y\",\n                                    \"dt\": 0,\n                                    \"uid\": 16,\n                                    \"index\": 15,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"b sc z\",\n                                    \"dt\": 0,\n                                    \"uid\": 17,\n                                    \"index\": 16,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"b rot x\",\n                                    \"dt\": 0,\n                                    \"uid\": 18,\n                                    \"index\": 17,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"b rot y\",\n                                    \"dt\": 0,\n                                    \"uid\": 19,\n                                    \"index\": 18,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"b rot z\",\n                                    \"dt\": 0,\n                                    \"uid\": 20,\n                                    \"index\": 19,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 21,\n                                    \"index\": 20,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"transform\",\n                                    \"dt\": 4,\n                                    \"uid\": 22,\n                                    \"index\": 21,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 23,\n                                    \"index\": 22,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 173,\n                            \"y\": 20,\n                            \"uid\": 1,\n                            \"state\": {\n                                \"val\": 5\n                            },\n                            \"title\": \"recursion depth\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 21,\n                            \"y\": 111,\n                            \"uid\": 2,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"level position x\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 21,\n                            \"y\": 177,\n                            \"uid\": 3,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"level position y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 21,\n                            \"y\": 241,\n                            \"uid\": 4,\n                            \"state\": {\n                                \"val\": 0.04,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"level position z\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 221,\n                            \"y\": 111,\n                            \"uid\": 5,\n                            \"state\": {\n                                \"val\": 1.02,\n                                \"min\": 0,\n                                \"max\": 2\n                            },\n                            \"title\": \"level scale\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 431,\n                            \"y\": 110,\n                            \"uid\": 8,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"level rotation x\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 431,\n                            \"y\": 174,\n                            \"uid\": 9,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"level rotation y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 431,\n                            \"y\": 236,\n                            \"uid\": 10,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"level rotation z\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 17,\n                            \"y\": 331,\n                            \"uid\": 11,\n                            \"state\": {\n                                \"val\": 0.04,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"branch position x\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 17,\n                            \"y\": 397,\n                            \"uid\": 12,\n                            \"state\": {\n                                \"val\": 0.08,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"branch position y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 17,\n                            \"y\": 461,\n                            \"uid\": 13,\n                            \"state\": {\n                                \"val\": -0.04,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"branch position z\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 229,\n                            \"y\": 332,\n                            \"uid\": 14,\n                            \"state\": {\n                                \"val\": 1,\n                                \"min\": 0,\n                                \"max\": 2\n                            },\n                            \"title\": \"branch scale \"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 431,\n                            \"y\": 332,\n                            \"uid\": 17,\n                            \"state\": {\n                                \"val\": 0.05\n                            },\n                            \"title\": \"branch rotation x\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 431,\n                            \"y\": 396,\n                            \"uid\": 18,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"branch rotation y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 431,\n                            \"y\": 458,\n                            \"uid\": 19,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"branch rotation z\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 308,\n                            \"y\": 575,\n                            \"uid\": 31,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"13\": 5,\n                                    \"14\": 6,\n                                    \"15\": 7\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Translate\",\n                            \"graph\": {\n                                \"node_uid\": 17,\n                                \"uid\": 86,\n                                \"parent_uid\": 70,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 525,\n                                        \"y\": 243,\n                                        \"uid\": 2,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 331,\n                                        \"y\": 241,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 173,\n                                        \"y\": 314,\n                                        \"uid\": 13,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 204,\n                                        \"y\": 397,\n                                        \"uid\": 14,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 223,\n                                        \"y\": 456,\n                                        \"uid\": 15,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"translation_matrix\",\n                                        \"x\": 435,\n                                        \"y\": 243,\n                                        \"uid\": 16\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 104,\n                            \"y\": 576,\n                            \"uid\": 32,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"x position\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 104,\n                            \"y\": 642,\n                            \"uid\": 33,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"y position\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 104,\n                            \"y\": 706,\n                            \"uid\": 34,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"z position\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 406,\n                            \"y\": 574,\n                            \"uid\": 36,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"13\": 5,\n                                    \"14\": 6,\n                                    \"15\": 7\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Scale\",\n                            \"graph\": {\n                                \"node_uid\": 16,\n                                \"uid\": 87,\n                                \"parent_uid\": 70,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scale_matrix\",\n                                        \"x\": 456,\n                                        \"y\": 245,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 590,\n                                        \"y\": 257,\n                                        \"uid\": 2,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 331,\n                                        \"y\": 241,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 173,\n                                        \"y\": 314,\n                                        \"uid\": 13,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 204,\n                                        \"y\": 397,\n                                        \"uid\": 14,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 223,\n                                        \"y\": 456,\n                                        \"uid\": 15,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 304,\n                            \"y\": 694,\n                            \"uid\": 37,\n                            \"state\": {\n                                \"val\": 0.105,\n                                \"min\": 0,\n                                \"max\": 0.5\n                            },\n                            \"title\": \"instance size\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 612,\n                            \"y\": 601,\n                            \"uid\": 38,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"8\": 1,\n                                    \"9\": 2,\n                                    \"10\": 3\n                                },\n                                \"output_sids\": {\n                                    \"1\": 0\n                                }\n                            },\n                            \"title\": \"Rotate\",\n                            \"graph\": {\n                                \"node_uid\": 14,\n                                \"uid\": 88,\n                                \"parent_uid\": 70,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"rotation_xyz_matrix\",\n                                        \"x\": 385,\n                                        \"y\": 227,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 509,\n                                        \"y\": 216,\n                                        \"uid\": 1,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 88,\n                                        \"y\": 147,\n                                        \"uid\": 8,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"X\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 190,\n                                        \"y\": 106,\n                                        \"uid\": 9,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 272,\n                                        \"y\": 181,\n                                        \"uid\": 10,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 174,\n                                        \"y\": 272,\n                                        \"uid\": 11,\n                                        \"dsid\": 2,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"7\": 0\n                                            },\n                                            \"output_sids\": {\n                                                \"8\": 1\n                                            }\n                                        },\n                                        \"title\": \"Knob compute\",\n                                        \"graph\": {\n                                            \"node_uid\": 9,\n                                            \"uid\": 89,\n                                            \"parent_uid\": 88,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"add_modulator\",\n                                                    \"x\": 660,\n                                                    \"y\": 204,\n                                                    \"uid\": 0\n                                                },\n                                                {\n                                                    \"plugin\": \"multiply_modulator\",\n                                                    \"x\": 553,\n                                                    \"y\": 165,\n                                                    \"uid\": 1\n                                                },\n                                                {\n                                                    \"plugin\": \"subtract_modulator\",\n                                                    \"x\": 335,\n                                                    \"y\": 296,\n                                                    \"uid\": 2\n                                                },\n                                                {\n                                                    \"plugin\": \"absolute_modulator\",\n                                                    \"x\": 465,\n                                                    \"y\": 321,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"min_modulator\",\n                                                    \"x\": 382,\n                                                    \"y\": 407,\n                                                    \"uid\": 4\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 124,\n                                                    \"y\": 212,\n                                                    \"uid\": 5,\n                                                    \"state\": {\n                                                        \"val\": -180\n                                                    },\n                                                    \"title\": \"Minimum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 118,\n                                                    \"y\": 371,\n                                                    \"uid\": 6,\n                                                    \"state\": {\n                                                        \"val\": 180\n                                                    },\n                                                    \"title\": \"Maximum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 301,\n                                                    \"y\": 131,\n                                                    \"uid\": 7,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 764,\n                                                    \"y\": 210,\n                                                    \"uid\": 8,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 1,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 4,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 6,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 4,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 6,\n                                                    \"dst_nuid\": 4,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 7,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 0,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true,\n                                                \"connected\": false\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 1,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 178,\n                                        \"y\": 344,\n                                        \"uid\": 12,\n                                        \"dsid\": 2,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"7\": 0\n                                            },\n                                            \"output_sids\": {\n                                                \"8\": 1\n                                            }\n                                        },\n                                        \"title\": \"Knob compute\",\n                                        \"graph\": {\n                                            \"node_uid\": 9,\n                                            \"uid\": 90,\n                                            \"parent_uid\": 88,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"add_modulator\",\n                                                    \"x\": 660,\n                                                    \"y\": 204,\n                                                    \"uid\": 0\n                                                },\n                                                {\n                                                    \"plugin\": \"multiply_modulator\",\n                                                    \"x\": 553,\n                                                    \"y\": 165,\n                                                    \"uid\": 1\n                                                },\n                                                {\n                                                    \"plugin\": \"subtract_modulator\",\n                                                    \"x\": 335,\n                                                    \"y\": 296,\n                                                    \"uid\": 2\n                                                },\n                                                {\n                                                    \"plugin\": \"absolute_modulator\",\n                                                    \"x\": 465,\n                                                    \"y\": 321,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"min_modulator\",\n                                                    \"x\": 382,\n                                                    \"y\": 407,\n                                                    \"uid\": 4\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 124,\n                                                    \"y\": 212,\n                                                    \"uid\": 5,\n                                                    \"state\": {\n                                                        \"val\": -180\n                                                    },\n                                                    \"title\": \"Minimum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 118,\n                                                    \"y\": 371,\n                                                    \"uid\": 6,\n                                                    \"state\": {\n                                                        \"val\": 180\n                                                    },\n                                                    \"title\": \"Maximum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 301,\n                                                    \"y\": 131,\n                                                    \"uid\": 7,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 764,\n                                                    \"y\": 210,\n                                                    \"uid\": 8,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 1,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 4,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 6,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 4,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 6,\n                                                    \"dst_nuid\": 4,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 7,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 0,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true,\n                                                \"connected\": false\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 1,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 199,\n                                        \"y\": 418,\n                                        \"uid\": 13,\n                                        \"dsid\": 2,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"7\": 0\n                                            },\n                                            \"output_sids\": {\n                                                \"8\": 1\n                                            }\n                                        },\n                                        \"title\": \"Knob compute\",\n                                        \"graph\": {\n                                            \"node_uid\": 9,\n                                            \"uid\": 91,\n                                            \"parent_uid\": 88,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"add_modulator\",\n                                                    \"x\": 660,\n                                                    \"y\": 204,\n                                                    \"uid\": 0\n                                                },\n                                                {\n                                                    \"plugin\": \"multiply_modulator\",\n                                                    \"x\": 553,\n                                                    \"y\": 165,\n                                                    \"uid\": 1\n                                                },\n                                                {\n                                                    \"plugin\": \"subtract_modulator\",\n                                                    \"x\": 335,\n                                                    \"y\": 296,\n                                                    \"uid\": 2\n                                                },\n                                                {\n                                                    \"plugin\": \"absolute_modulator\",\n                                                    \"x\": 465,\n                                                    \"y\": 321,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"min_modulator\",\n                                                    \"x\": 382,\n                                                    \"y\": 407,\n                                                    \"uid\": 4\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 124,\n                                                    \"y\": 212,\n                                                    \"uid\": 5,\n                                                    \"state\": {\n                                                        \"val\": -180\n                                                    },\n                                                    \"title\": \"Minimum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 118,\n                                                    \"y\": 371,\n                                                    \"uid\": 6,\n                                                    \"state\": {\n                                                        \"val\": 180\n                                                    },\n                                                    \"title\": \"Maximum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 301,\n                                                    \"y\": 131,\n                                                    \"uid\": 7,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 764,\n                                                    \"y\": 210,\n                                                    \"uid\": 8,\n                                                    \"dsid\": 16,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 1,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 4,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 6,\n                                                    \"dst_nuid\": 2,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 4,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 6,\n                                                    \"dst_nuid\": 4,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 7,\n                                                    \"dst_nuid\": 1,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 0,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true,\n                                                \"connected\": false\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 1,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"dst_connected\": false,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"dst_connected\": false,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 13,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"dst_connected\": false,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"X\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Y\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Z\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 513,\n                            \"y\": 596,\n                            \"uid\": 39,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 513,\n                            \"y\": 660,\n                            \"uid\": 40,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 513,\n                            \"y\": 722,\n                            \"uid\": 41,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 707,\n                            \"y\": 604,\n                            \"uid\": 42,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"3\": 1,\n                                    \"4\": 2,\n                                    \"5\": 3\n                                },\n                                \"output_sids\": {\n                                    \"2\": 0\n                                }\n                            },\n                            \"title\": \"Concatenate x2\",\n                            \"graph\": {\n                                \"node_uid\": 6,\n                                \"uid\": 92,\n                                \"parent_uid\": 70,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 392,\n                                        \"y\": 263,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 268,\n                                        \"y\": 302,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 532,\n                                        \"y\": 244,\n                                        \"uid\": 2,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 229,\n                                        \"y\": 195,\n                                        \"uid\": 3,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 148,\n                                        \"y\": 343,\n                                        \"uid\": 4,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 171,\n                                        \"y\": 500,\n                                        \"uid\": 5,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"sphere_mesh_generator\",\n                            \"x\": 76,\n                            \"y\": 19,\n                            \"uid\": 71,\n                            \"state\": {\n                                \"v_res\": 15,\n                                \"h_res\": 15\n                            }\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 735,\n                            \"y\": 804,\n                            \"uid\": 79,\n                            \"dsid\": 20,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"15\": 3,\n                                    \"21\": 4,\n                                    \"22\": 5,\n                                    \"23\": 6,\n                                    \"24\": 7,\n                                    \"25\": 8,\n                                    \"34\": 10,\n                                    \"39\": 12,\n                                    \"40\": 13,\n                                    \"41\": 14,\n                                    \"44\": 16,\n                                    \"47\": 18,\n                                    \"49\": 19\n                                },\n                                \"output_sids\": {\n                                    \"9\": 0\n                                }\n                            },\n                            \"title\": \"Material chain\",\n                            \"graph\": {\n                                \"node_uid\": 50,\n                                \"uid\": 93,\n                                \"parent_uid\": 70,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"material_diffuse_color_modulator\",\n                                        \"x\": 1029,\n                                        \"y\": 68,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"material_alpha_clip_modulator\",\n                                        \"x\": 1137,\n                                        \"y\": 68,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 1025,\n                                        \"y\": 145,\n                                        \"uid\": 6,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Alpha clip\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_texture_modulator\",\n                                        \"x\": 1252,\n                                        \"y\": 68,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 1361,\n                                        \"y\": 68,\n                                        \"uid\": 9,\n                                        \"dsid\": 29,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_blend_mode_modulator\",\n                                        \"x\": 898,\n                                        \"y\": 69,\n                                        \"uid\": 10\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 1173,\n                                        \"y\": 143,\n                                        \"uid\": 15,\n                                        \"dsid\": 29,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Image\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 2,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 134,\n                                        \"uid\": 21,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 798,\n                                        \"y\": 183,\n                                        \"uid\": 22,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 231,\n                                        \"uid\": 23,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 799,\n                                        \"y\": 279,\n                                        \"uid\": 24,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"alpha\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 70,\n                                        \"uid\": 25,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"blend mode\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 907,\n                                        \"y\": 147,\n                                        \"uid\": 26\n                                    },\n                                    {\n                                        \"plugin\": \"material_z_buffer_modulator\",\n                                        \"x\": 672,\n                                        \"y\": 65,\n                                        \"uid\": 27\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 564,\n                                        \"y\": 212,\n                                        \"uid\": 28,\n                                        \"state\": {\n                                            \"enabled\": true\n                                        },\n                                        \"title\": \"Z-buffer\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_shinyness_modulator\",\n                                        \"x\": 558,\n                                        \"y\": 64,\n                                        \"uid\": 31\n                                    },\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 454,\n                                        \"y\": 148,\n                                        \"uid\": 32,\n                                        \"dsid\": 3,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"always_update\": true,\n                                            \"rt_width\": 512,\n                                            \"rt_height\": 512,\n                                            \"input_sids\": {\n                                                \"9\": 0\n                                            },\n                                            \"output_sids\": {\n                                                \"12\": 2\n                                            }\n                                        },\n                                        \"title\": \"min max calc\",\n                                        \"graph\": {\n                                            \"node_uid\": 13,\n                                            \"uid\": 94,\n                                            \"parent_uid\": 93,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 27,\n                                                    \"y\": 190,\n                                                    \"uid\": 2,\n                                                    \"state\": {\n                                                        \"val\": 10\n                                                    },\n                                                    \"title\": \"Maximum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"subtract_modulator\",\n                                                    \"x\": 144,\n                                                    \"y\": 65,\n                                                    \"uid\": 3\n                                                },\n                                                {\n                                                    \"plugin\": \"absolute_modulator\",\n                                                    \"x\": 232,\n                                                    \"y\": 65,\n                                                    \"uid\": 4\n                                                },\n                                                {\n                                                    \"plugin\": \"multiply_modulator\",\n                                                    \"x\": 319,\n                                                    \"y\": 45,\n                                                    \"uid\": 5\n                                                },\n                                                {\n                                                    \"plugin\": \"add_modulator\",\n                                                    \"x\": 401,\n                                                    \"y\": 122,\n                                                    \"uid\": 7\n                                                },\n                                                {\n                                                    \"plugin\": \"min_modulator\",\n                                                    \"x\": 143,\n                                                    \"y\": 142,\n                                                    \"uid\": 8\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 248,\n                                                    \"y\": 9,\n                                                    \"uid\": 9,\n                                                    \"dsid\": 21,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"const_float_generator\",\n                                                    \"x\": 10,\n                                                    \"y\": 85,\n                                                    \"uid\": 11,\n                                                    \"state\": {\n                                                        \"val\": 0\n                                                    },\n                                                    \"title\": \"Minimum\"\n                                                },\n                                                {\n                                                    \"plugin\": \"output_proxy\",\n                                                    \"x\": 486,\n                                                    \"y\": 122,\n                                                    \"uid\": 12,\n                                                    \"dsid\": 21,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"value\",\n                                                    \"dyn_in\": [\n                                                        {\n                                                            \"name\": \"input\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 0,\n                                                            \"connected\": true,\n                                                            \"is_connected\": true\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 3,\n                                                    \"dst_nuid\": 4,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 4,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 5,\n                                                    \"dst_nuid\": 7,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 8,\n                                                    \"dst_nuid\": 7,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 9,\n                                                    \"dst_nuid\": 5,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 3,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 7,\n                                                    \"dst_nuid\": 12,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"dst_connected\": true,\n                                                    \"dst_dyn\": true\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ],\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"uid\": 2,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 361,\n                                        \"y\": 242,\n                                        \"uid\": 34,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"shinyness\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_double_sided_modulator\",\n                                        \"x\": 437,\n                                        \"y\": 61,\n                                        \"uid\": 35\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 323,\n                                        \"y\": 161,\n                                        \"uid\": 36,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Double-sided\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_ambient_color_modulator\",\n                                        \"x\": 290,\n                                        \"y\": 73,\n                                        \"uid\": 37\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 63,\n                                        \"y\": 153,\n                                        \"uid\": 39,\n                                        \"dsid\": 24,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 60,\n                                        \"y\": 202,\n                                        \"uid\": 40,\n                                        \"dsid\": 24,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 63,\n                                        \"y\": 250,\n                                        \"uid\": 41,\n                                        \"dsid\": 24,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 170,\n                                        \"y\": 166,\n                                        \"uid\": 43\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 61,\n                                        \"y\": 99,\n                                        \"uid\": 44,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 40,\n                                        \"y\": 52,\n                                        \"uid\": 47,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 13,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_light_modulator\",\n                                        \"x\": 158,\n                                        \"y\": 22,\n                                        \"uid\": 48\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 54,\n                                        \"y\": 0,\n                                        \"uid\": 49,\n                                        \"dsid\": 5,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light index\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 27,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 28,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 31,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 32,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 34,\n                                        \"dst_nuid\": 32,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 35,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 36,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 37,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 39,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 40,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 41,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 43,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 47,\n                                        \"dst_nuid\": 48,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 44,\n                                        \"dst_nuid\": 48,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 48,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 49,\n                                        \"dst_nuid\": 48,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"Image\",\n                                    \"dt\": 2,\n                                    \"uid\": 3,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"alpha\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"blend mode\",\n                                    \"dt\": 0,\n                                    \"uid\": 8,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"shinyness\",\n                                    \"dt\": 0,\n                                    \"uid\": 10,\n                                    \"index\": 6,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 12,\n                                    \"index\": 7,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 13,\n                                    \"index\": 8,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 14,\n                                    \"index\": 9,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 16,\n                                    \"index\": 10,\n                                    \"type\": 0,\n                                    \"is_connected\": false\n                                },\n                                {\n                                    \"name\": \"light\",\n                                    \"dt\": 13,\n                                    \"uid\": 18,\n                                    \"index\": 11,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"light index\",\n                                    \"dt\": 0,\n                                    \"uid\": 19,\n                                    \"index\": 12,\n                                    \"type\": 0\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"url_texture_generator\",\n                            \"x\": 300,\n                            \"y\": 802,\n                            \"uid\": 80,\n                            \"state\": {\n                                \"url\": \"/data/image/57422df4c11a76d5531ef36299d5d1ac5b6b6739.jpg\"\n                            },\n                            \"title\": \"Image\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 403,\n                            \"y\": 802,\n                            \"uid\": 81,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 476,\n                            \"y\": 802,\n                            \"uid\": 82,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Saturation\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 555,\n                            \"y\": 802,\n                            \"uid\": 83,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Luminosity\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 636,\n                            \"y\": 802,\n                            \"uid\": 84,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Alpha\"\n                        },\n                        {\n                            \"plugin\": \"blend_mode_generator\",\n                            \"x\": 557,\n                            \"y\": 868,\n                            \"uid\": 85,\n                            \"state\": {\n                                \"mode\": 4\n                            }\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 476,\n                            \"y\": 868,\n                            \"uid\": 86,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Shinyness\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 435,\n                            \"y\": 940,\n                            \"uid\": 87,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Ambient Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 527,\n                            \"y\": 940,\n                            \"uid\": 88,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Ambient Sat\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 615,\n                            \"y\": 940,\n                            \"uid\": 89,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Ambient Lum\"\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 425,\n                            \"y\": 1063,\n                            \"uid\": 90,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 13,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 675,\n                            \"y\": 501,\n                            \"uid\": 91,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"camera\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 6,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 11,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 12,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 13,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 14,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 8,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 8,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 9,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 10,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 17,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 18,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 18,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 19,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 42,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 21,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 32,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 33,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 34,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 31,\n                            \"dst_nuid\": 42,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true,\n                            \"offset\": 2\n                        },\n                        {\n                            \"src_nuid\": 36,\n                            \"dst_nuid\": 42,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 39,\n                            \"dst_nuid\": 38,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 40,\n                            \"dst_nuid\": 38,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 41,\n                            \"dst_nuid\": 38,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 38,\n                            \"dst_nuid\": 42,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 6,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 7,\n                            \"dst_dyn\": true,\n                            \"offset\": 2\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 15,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 16,\n                            \"dst_dyn\": true,\n                            \"offset\": 2\n                        },\n                        {\n                            \"src_nuid\": 71,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 80,\n                            \"dst_nuid\": 79,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 81,\n                            \"dst_nuid\": 79,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 82,\n                            \"dst_nuid\": 79,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 83,\n                            \"dst_nuid\": 79,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 84,\n                            \"dst_nuid\": 79,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 85,\n                            \"dst_nuid\": 79,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 86,\n                            \"dst_nuid\": 79,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 6,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 89,\n                            \"dst_nuid\": 79,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 9,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 88,\n                            \"dst_nuid\": 79,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 8,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 87,\n                            \"dst_nuid\": 79,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 7,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 79,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 22,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 90,\n                            \"dst_nuid\": 79,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 11,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 91,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 20,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"light\",\n                        \"dt\": 13,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0\n                    },\n                    {\n                        \"name\": \"camera\",\n                        \"dt\": 6,\n                        \"uid\": 1,\n                        \"index\": 1,\n                        \"type\": 0\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/instancing_texture.json",
    "content": "{\n    \"abs_t\": 172.168,\n    \"active_graph\": 0,\n    \"graph_uid\": 101,\n    \"root\": {\n        \"node_uid\": 51,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 376,\n                \"y\": 543,\n                \"uid\": 50,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {},\n                    \"output_sids\": {}\n                },\n                \"title\": \"Texture instancing\",\n                \"graph\": {\n                    \"node_uid\": 31,\n                    \"uid\": 95,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 781,\n                            \"y\": 558,\n                            \"uid\": 0,\n                            \"dsid\": 9,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"15\": 3,\n                                    \"21\": 4,\n                                    \"22\": 5,\n                                    \"23\": 6,\n                                    \"24\": 7,\n                                    \"25\": 8\n                                },\n                                \"output_sids\": {\n                                    \"9\": 0\n                                }\n                            },\n                            \"title\": \"Material chain\",\n                            \"graph\": {\n                                \"node_uid\": 27,\n                                \"uid\": 96,\n                                \"parent_uid\": 95,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"material_diffuse_color_modulator\",\n                                        \"x\": 240,\n                                        \"y\": 43,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"material_alpha_clip_modulator\",\n                                        \"x\": 348,\n                                        \"y\": 43,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 236,\n                                        \"y\": 120,\n                                        \"uid\": 6,\n                                        \"state\": {\n                                            \"enabled\": true\n                                        },\n                                        \"title\": \"Alpha clip\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_texture_modulator\",\n                                        \"x\": 463,\n                                        \"y\": 43,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 572,\n                                        \"y\": 43,\n                                        \"uid\": 9,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_blend_mode_modulator\",\n                                        \"x\": 109,\n                                        \"y\": 44,\n                                        \"uid\": 10\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 384,\n                                        \"y\": 118,\n                                        \"uid\": 15,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Image\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 2,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 11,\n                                        \"y\": 109,\n                                        \"uid\": 21,\n                                        \"dsid\": 10,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 11,\n                                        \"y\": 176,\n                                        \"uid\": 22,\n                                        \"dsid\": 10,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 20,\n                                        \"y\": 237,\n                                        \"uid\": 23,\n                                        \"dsid\": 10,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 48,\n                                        \"y\": 303,\n                                        \"uid\": 24,\n                                        \"dsid\": 10,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"alpha\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 11,\n                                        \"y\": 45,\n                                        \"uid\": 25,\n                                        \"dsid\": 10,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"blend mode\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 118,\n                                        \"y\": 122,\n                                        \"uid\": 26\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"Image\",\n                                    \"dt\": 2,\n                                    \"uid\": 3,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"alpha\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"blend mode\",\n                                    \"dt\": 0,\n                                    \"uid\": 8,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"url_texture_generator\",\n                            \"x\": 224,\n                            \"y\": 382,\n                            \"uid\": 1,\n                            \"state\": {\n                                \"url\": \"/data/image/57422df4c11a76d5531ef36299d5d1ac5b6b6739.jpg\"\n                            },\n                            \"title\": \"Image\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 333,\n                            \"y\": 382,\n                            \"uid\": 2,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 410,\n                            \"y\": 382,\n                            \"uid\": 3,\n                            \"state\": {\n                                \"val\": 0.99\n                            },\n                            \"title\": \"Saturation\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 494,\n                            \"y\": 382,\n                            \"uid\": 4,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Luminosity\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 581,\n                            \"y\": 382,\n                            \"uid\": 5,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Alpha\"\n                        },\n                        {\n                            \"plugin\": \"blend_mode_generator\",\n                            \"x\": 509,\n                            \"y\": 453,\n                            \"uid\": 6,\n                            \"state\": {\n                                \"mode\": 4\n                            }\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 949,\n                            \"y\": 151,\n                            \"uid\": 7,\n                            \"dsid\": 10,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"3\": 0,\n                                    \"4\": 1,\n                                    \"5\": 2,\n                                    \"6\": 3,\n                                    \"7\": 4,\n                                    \"8\": 5,\n                                    \"11\": 7,\n                                    \"12\": 8,\n                                    \"13\": 9\n                                },\n                                \"output_sids\": {}\n                            },\n                            \"title\": \"Texture instancing\",\n                            \"graph\": {\n                                \"node_uid\": 14,\n                                \"uid\": 97,\n                                \"parent_uid\": 95,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scene_renderer_emitter\",\n                                        \"x\": 782,\n                                        \"y\": 194,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"instance_texture_modulator\",\n                                        \"x\": 571,\n                                        \"y\": 113,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 454,\n                                        \"y\": 95,\n                                        \"uid\": 3,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"count\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 349,\n                                        \"y\": 104,\n                                        \"uid\": 4,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"mesh\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 9,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 427,\n                                        \"y\": 224,\n                                        \"uid\": 5,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"texture\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 2,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 415,\n                                        \"y\": 476,\n                                        \"uid\": 6,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 657,\n                                        \"y\": 244,\n                                        \"uid\": 7,\n                                        \"dsid\": 5,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 623,\n                                        \"y\": 299,\n                                        \"uid\": 8,\n                                        \"dsid\": 5,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"transform\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 255,\n                                        \"y\": 196,\n                                        \"uid\": 10,\n                                        \"title\": \"scale of instance map\"\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 35,\n                                        \"y\": 202,\n                                        \"uid\": 11,\n                                        \"dsid\": 5,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"scale x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 39,\n                                        \"y\": 315,\n                                        \"uid\": 12,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"scale z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 35,\n                                        \"y\": 261,\n                                        \"uid\": 13,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"scale y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"count\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"mesh\",\n                                    \"dt\": 9,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"texture\",\n                                    \"dt\": 2,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 3,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 4,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"transform\",\n                                    \"dt\": 4,\n                                    \"uid\": 5,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"scale x\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 6,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"scale z\",\n                                    \"dt\": 0,\n                                    \"uid\": 8,\n                                    \"index\": 7,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"scale y\",\n                                    \"dt\": 0,\n                                    \"uid\": 9,\n                                    \"index\": 8,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"quad_mesh_generator\",\n                            \"x\": 220,\n                            \"y\": 28,\n                            \"uid\": 8\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 399,\n                            \"y\": 26,\n                            \"uid\": 9,\n                            \"state\": {\n                                \"val\": 200\n                            },\n                            \"title\": \"Instance Count\"\n                        },\n                        {\n                            \"plugin\": \"url_texture_generator\",\n                            \"x\": 285,\n                            \"y\": 26,\n                            \"uid\": 10,\n                            \"state\": {\n                                \"url\": \"/data/image/57422df4c11a76d5531ef36299d5d1ac5b6b6739.jpg\"\n                            },\n                            \"title\": \"Texture map\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 569,\n                            \"y\": 639,\n                            \"uid\": 16,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"13\": 5,\n                                    \"14\": 6,\n                                    \"15\": 7\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Scale\",\n                            \"graph\": {\n                                \"node_uid\": 16,\n                                \"uid\": 98,\n                                \"parent_uid\": 95,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scale_matrix\",\n                                        \"x\": 189,\n                                        \"y\": 49,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 278,\n                                        \"y\": 49,\n                                        \"uid\": 2,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 73,\n                                        \"y\": 49,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 7,\n                                        \"y\": 9,\n                                        \"uid\": 13,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 7,\n                                        \"y\": 69,\n                                        \"uid\": 14,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 7,\n                                        \"y\": 132,\n                                        \"uid\": 15,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 219,\n                            \"y\": 93,\n                            \"uid\": 17,\n                            \"state\": {\n                                \"val\": 0.13333333333333333,\n                                \"min\": \"0\",\n                                \"max\": \"1\"\n                            },\n                            \"title\": \"instance size\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 569,\n                            \"y\": 520,\n                            \"uid\": 18,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"13\": 5,\n                                    \"14\": 6,\n                                    \"15\": 7\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Translate\",\n                            \"graph\": {\n                                \"node_uid\": 17,\n                                \"uid\": 99,\n                                \"parent_uid\": 95,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 291,\n                                        \"y\": 50,\n                                        \"uid\": 2,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 74,\n                                        \"y\": 50,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 8,\n                                        \"y\": 10,\n                                        \"uid\": 13,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 8,\n                                        \"y\": 70,\n                                        \"uid\": 14,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 8,\n                                        \"y\": 129,\n                                        \"uid\": 15,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"translation_matrix\",\n                                        \"x\": 191,\n                                        \"y\": 50,\n                                        \"uid\": 16\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 219,\n                            \"y\": 160,\n                            \"uid\": 19,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -100,\n                                \"max\": 100\n                            },\n                            \"title\": \"Texture map position X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 219,\n                            \"y\": 225,\n                            \"uid\": 20,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": \"-100\",\n                                \"max\": \"100\"\n                            },\n                            \"title\": \"Texture map position Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 218,\n                            \"y\": 292,\n                            \"uid\": 21,\n                            \"state\": {\n                                \"val\": -10.000000000000007,\n                                \"min\": \"-100\",\n                                \"max\": \"100\"\n                            },\n                            \"title\": \"Texture map position Z\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 419,\n                            \"y\": 94,\n                            \"uid\": 22,\n                            \"state\": {\n                                \"val\": 9.666666666666666,\n                                \"min\": \"0\",\n                                \"max\": \"10\"\n                            },\n                            \"title\": \"Texture map scale x\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 418,\n                            \"y\": 173,\n                            \"uid\": 23,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": \"0\",\n                                \"max\": \"10\"\n                            },\n                            \"title\": \"Texture map scale y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 418,\n                            \"y\": 247,\n                            \"uid\": 24,\n                            \"state\": {\n                                \"val\": 7.833333333333333,\n                                \"min\": \"0\",\n                                \"max\": \"10\"\n                            },\n                            \"title\": \"Texture map scale z\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 706,\n                            \"y\": 204,\n                            \"uid\": 26,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"0\": 0,\n                                    \"1\": 1,\n                                    \"2\": 2\n                                },\n                                \"output_sids\": {\n                                    \"3\": 3\n                                }\n                            },\n                            \"title\": \"Camera\",\n                            \"graph\": {\n                                \"node_uid\": 25,\n                                \"uid\": 100,\n                                \"parent_uid\": 95,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 74,\n                                        \"y\": 173,\n                                        \"uid\": 0,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"rotation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 129,\n                                        \"y\": 89,\n                                        \"uid\": 1,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"elevation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 52,\n                                        \"y\": 48,\n                                        \"uid\": 2,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"dolly\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 558,\n                                        \"y\": 35,\n                                        \"uid\": 3,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"perspective_camera\",\n                                        \"x\": 448,\n                                        \"y\": 75,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 218,\n                                        \"y\": 28,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"rotation_xyz_matrix\",\n                                        \"x\": 160,\n                                        \"y\": 153,\n                                        \"uid\": 6\n                                    },\n                                    {\n                                        \"plugin\": \"vector_transform\",\n                                        \"x\": 342,\n                                        \"y\": 77,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 219,\n                                        \"y\": 267,\n                                        \"uid\": 21\n                                    },\n                                    {\n                                        \"plugin\": \"vector_transform\",\n                                        \"x\": 341,\n                                        \"y\": 190,\n                                        \"uid\": 22\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 104,\n                                        \"y\": 287,\n                                        \"uid\": 23,\n                                        \"state\": {\n                                            \"val\": 0.5\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"negate_modulator\",\n                                        \"x\": 132,\n                                        \"y\": 33,\n                                        \"uid\": 24\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 22,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 22,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 4\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 24,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"rotation\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"elevation\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"dolly\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 3,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 13,\n                            \"y\": 118,\n                            \"uid\": 27,\n                            \"state\": {\n                                \"val\": -5.999999999999986,\n                                \"min\": \"-180\",\n                                \"max\": \"180\"\n                            },\n                            \"title\": \"Rotation\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 13,\n                            \"y\": 201,\n                            \"uid\": 28,\n                            \"state\": {\n                                \"val\": 4,\n                                \"min\": \"-20\",\n                                \"max\": \"40\"\n                            },\n                            \"title\": \"Elevation\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 13,\n                            \"y\": 284,\n                            \"uid\": 29,\n                            \"state\": {\n                                \"val\": 9.666666666666666,\n                                \"min\": \"0\",\n                                \"max\": \"10\"\n                            },\n                            \"title\": \"Dolly\"\n                        },\n                        {\n                            \"plugin\": \"concatenate_matrix_modulator\",\n                            \"x\": 748,\n                            \"y\": 471,\n                            \"uid\": 30\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 8,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 6,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 8,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 7,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true,\n                            \"offset\": 2\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 18,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 20,\n                            \"dst_nuid\": 18,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 18,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 27,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 28,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 29,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 26,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 30,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 18,\n                            \"dst_nuid\": 30,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 30,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true\n                        }\n                    ]\n                }\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/interaction_keypress_number_up_down.json",
    "content": "{\n    \"abs_t\": 184.309,\n    \"active_graph\": 0,\n    \"graph_uid\": 2,\n    \"root\": {\n        \"node_uid\": 15,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 441,\n                \"y\": 453,\n                \"uid\": 10,\n                \"dsid\": 4,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"rt_filter\": 9729,\n                    \"input_sids\": {\n                        \"10\": 0,\n                        \"11\": 1,\n                        \"13\": 3\n                    },\n                    \"output_sids\": {\n                        \"12\": 2\n                    }\n                },\n                \"title\": \"Counter up / down\",\n                \"graph\": {\n                    \"node_uid\": 15,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"register_local_read\",\n                            \"x\": 386,\n                            \"y\": 243,\n                            \"uid\": 2,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"state\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"if_else_modulator\",\n                            \"x\": 584,\n                            \"y\": 280,\n                            \"uid\": 3\n                        },\n                        {\n                            \"plugin\": \"subtract_modulator\",\n                            \"x\": 461,\n                            \"y\": 375,\n                            \"uid\": 4\n                        },\n                        {\n                            \"plugin\": \"add_modulator\",\n                            \"x\": 712,\n                            \"y\": 525,\n                            \"uid\": 6\n                        },\n                        {\n                            \"plugin\": \"if_else_modulator\",\n                            \"x\": 817,\n                            \"y\": 453,\n                            \"uid\": 7\n                        },\n                        {\n                            \"plugin\": \"register_local_write\",\n                            \"x\": 953,\n                            \"y\": 382,\n                            \"uid\": 9,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"state\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 8,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 124,\n                            \"y\": 229,\n                            \"uid\": 10,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Key for up\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 7,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 369,\n                            \"y\": 636,\n                            \"uid\": 11,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Key for down\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 7,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 989,\n                            \"y\": 544,\n                            \"uid\": 12,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"float\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"def\": null,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 143,\n                            \"y\": 487,\n                            \"uid\": 13,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Speed\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"float_display\",\n                            \"x\": 952,\n                            \"y\": 457,\n                            \"uid\": 14\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true,\n                            \"offset\": 3\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 12,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 14,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"offset\": 2\n                        }\n                    ],\n                    \"registers\": [\n                        {\n                            \"id\": \"state\",\n                            \"dt\": 8\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Key for up\",\n                        \"dt\": 7,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Key for down\",\n                        \"dt\": 7,\n                        \"uid\": 1,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Speed\",\n                        \"dt\": 0,\n                        \"uid\": 3,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"float\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"key_press_generator\",\n                \"x\": 245,\n                \"y\": 438,\n                \"uid\": 11,\n                \"state\": {\n                    \"key\": 87,\n                    \"type\": 0\n                }\n            },\n            {\n                \"plugin\": \"key_press_generator\",\n                \"x\": 247,\n                \"y\": 503,\n                \"uid\": 12,\n                \"state\": {\n                    \"key\": 83,\n                    \"type\": 0\n                }\n            },\n            {\n                \"plugin\": \"float_display\",\n                \"x\": 656,\n                \"y\": 431,\n                \"uid\": 13\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 297,\n                \"y\": 567,\n                \"uid\": 14,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Speed\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 11,\n                \"dst_nuid\": 10,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 12,\n                \"dst_nuid\": 10,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 10,\n                \"dst_nuid\": 13,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_connected\": false,\n                \"src_dyn\": true\n            },\n            {\n                \"src_nuid\": 14,\n                \"dst_nuid\": 10,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            }\n        ],\n        \"registers\": [\n            {\n                \"id\": \"state\",\n                \"dt\": 0\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/interaction_up_and_down_counter_with_init_and_clamp.json",
    "content": "{\n    \"abs_t\": 118.223,\n    \"active_graph\": 0,\n    \"graph_uid\": 2,\n    \"root\": {\n        \"node_uid\": 36,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 636,\n                \"y\": 594,\n                \"uid\": 28,\n                \"dsid\": 7,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"rt_filter\": 9729,\n                    \"input_sids\": {\n                        \"21\": 1,\n                        \"22\": 2,\n                        \"23\": 3,\n                        \"24\": 4,\n                        \"25\": 5,\n                        \"26\": 6\n                    },\n                    \"output_sids\": {\n                        \"20\": 0\n                    }\n                },\n                \"title\": \"Up / Down counter\",\n                \"graph\": {\n                    \"node_uid\": 27,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"register_local_read\",\n                            \"x\": 691,\n                            \"y\": 371,\n                            \"uid\": 2,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"state\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"float_display\",\n                            \"x\": 1089,\n                            \"y\": 544,\n                            \"uid\": 4\n                        },\n                        {\n                            \"plugin\": \"register_local_write\",\n                            \"x\": 1089,\n                            \"y\": 490,\n                            \"uid\": 5,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"state\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 8,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 545,\n                            \"y\": 547,\n                            \"uid\": 6\n                        },\n                        {\n                            \"plugin\": \"delta_t_generator\",\n                            \"x\": 431,\n                            \"y\": 599,\n                            \"uid\": 7\n                        },\n                        {\n                            \"plugin\": \"convert_bool_float_modulator\",\n                            \"x\": 350,\n                            \"y\": 334,\n                            \"uid\": 8\n                        },\n                        {\n                            \"plugin\": \"negate_modulator\",\n                            \"x\": 457,\n                            \"y\": 334,\n                            \"uid\": 9\n                        },\n                        {\n                            \"plugin\": \"convert_bool_float_modulator\",\n                            \"x\": 348,\n                            \"y\": 464,\n                            \"uid\": 10\n                        },\n                        {\n                            \"plugin\": \"add_modulator\",\n                            \"x\": 554,\n                            \"y\": 373,\n                            \"uid\": 11\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 647,\n                            \"y\": 463,\n                            \"uid\": 12\n                        },\n                        {\n                            \"plugin\": \"add_modulator\",\n                            \"x\": 758,\n                            \"y\": 412,\n                            \"uid\": 13\n                        },\n                        {\n                            \"plugin\": \"if_else_modulator\",\n                            \"x\": 870,\n                            \"y\": 368,\n                            \"uid\": 14\n                        },\n                        {\n                            \"plugin\": \"initialise_generator\",\n                            \"x\": 786,\n                            \"y\": 334,\n                            \"uid\": 15\n                        },\n                        {\n                            \"plugin\": \"clamp_modulator\",\n                            \"x\": 992,\n                            \"y\": 492,\n                            \"uid\": 17\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1091,\n                            \"y\": 408,\n                            \"uid\": 20,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"float\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"def\": null,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 137,\n                            \"y\": 166,\n                            \"uid\": 21,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Keypress increase\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 7,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 138,\n                            \"y\": 506,\n                            \"uid\": 22,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Keypress decrease\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 7,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 296,\n                            \"y\": 683,\n                            \"uid\": 23,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"speed\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 788,\n                            \"y\": 481,\n                            \"uid\": 24,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"init to\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 699,\n                            \"y\": 634,\n                            \"uid\": 25,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Minimum\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 704,\n                            \"y\": 718,\n                            \"uid\": 26,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Maximum\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 13,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 12,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 8,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 11,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 11,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 12,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 13,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 14,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 14,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 17,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 20,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 2\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 8,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 14,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 17,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 26,\n                            \"dst_nuid\": 17,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        }\n                    ],\n                    \"registers\": [\n                        {\n                            \"id\": \"state\",\n                            \"dt\": 8\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Keypress increase\",\n                        \"dt\": 7,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Keypress decrease\",\n                        \"dt\": 7,\n                        \"uid\": 2,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"speed\",\n                        \"dt\": 0,\n                        \"uid\": 3,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"init to\",\n                        \"dt\": 0,\n                        \"uid\": 4,\n                        \"index\": 3,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Minimum\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 4,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Maximum\",\n                        \"dt\": 0,\n                        \"uid\": 6,\n                        \"index\": 5,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"float\",\n                        \"dt\": 0,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"key_press_generator\",\n                \"x\": 281,\n                \"y\": 597,\n                \"uid\": 29,\n                \"state\": {\n                    \"key\": 87,\n                    \"type\": 0\n                },\n                \"title\": \"Key to increase\"\n            },\n            {\n                \"plugin\": \"key_press_generator\",\n                \"x\": 281,\n                \"y\": 659,\n                \"uid\": 30,\n                \"state\": {\n                    \"key\": 83,\n                    \"type\": 0\n                },\n                \"title\": \"Key to decrease\"\n            },\n            {\n                \"plugin\": \"float_display\",\n                \"x\": 886,\n                \"y\": 513,\n                \"uid\": 31\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 426,\n                \"y\": 596,\n                \"uid\": 32,\n                \"state\": {\n                    \"val\": 10\n                },\n                \"title\": \"Speed\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 426,\n                \"y\": 643,\n                \"uid\": 33,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Initial value\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 520,\n                \"y\": 596,\n                \"uid\": 34,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Minimum\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 521,\n                \"y\": 641,\n                \"uid\": 35,\n                \"state\": {\n                    \"val\": 100\n                },\n                \"title\": \"Maximum\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 29,\n                \"dst_nuid\": 28,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 30,\n                \"dst_nuid\": 28,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 28,\n                \"dst_nuid\": 31,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"src_dyn\": true\n            },\n            {\n                \"src_nuid\": 32,\n                \"dst_nuid\": 28,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 33,\n                \"dst_nuid\": 28,\n                \"src_slot\": 0,\n                \"dst_slot\": 3,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 34,\n                \"dst_nuid\": 28,\n                \"src_slot\": 0,\n                \"dst_slot\": 4,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 35,\n                \"dst_nuid\": 28,\n                \"src_slot\": 0,\n                \"dst_slot\": 5,\n                \"dst_dyn\": true\n            }\n        ],\n        \"registers\": [\n            {\n                \"id\": \"state\",\n                \"dt\": 0\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/interaction_up_down_counter_simple.json",
    "content": "{\n    \"abs_t\": 173.383,\n    \"active_graph\": 0,\n    \"graph_uid\": 2,\n    \"root\": {\n        \"node_uid\": 27,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 331,\n                \"y\": 342,\n                \"uid\": 22,\n                \"dsid\": 4,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"rt_filter\": 9729,\n                    \"input_sids\": {\n                        \"15\": 1,\n                        \"16\": 2,\n                        \"17\": 3\n                    },\n                    \"output_sids\": {\n                        \"14\": 0\n                    }\n                },\n                \"title\": \"Up / Down counter\",\n                \"graph\": {\n                    \"node_uid\": 18,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"register_local_read\",\n                            \"x\": 798,\n                            \"y\": 371,\n                            \"uid\": 2,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"state\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"register_local_write\",\n                            \"x\": 970,\n                            \"y\": 412,\n                            \"uid\": 5,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"state\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 8,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 652,\n                            \"y\": 547,\n                            \"uid\": 6\n                        },\n                        {\n                            \"plugin\": \"delta_t_generator\",\n                            \"x\": 538,\n                            \"y\": 599,\n                            \"uid\": 7\n                        },\n                        {\n                            \"plugin\": \"convert_bool_float_modulator\",\n                            \"x\": 457,\n                            \"y\": 334,\n                            \"uid\": 8\n                        },\n                        {\n                            \"plugin\": \"negate_modulator\",\n                            \"x\": 564,\n                            \"y\": 334,\n                            \"uid\": 9\n                        },\n                        {\n                            \"plugin\": \"convert_bool_float_modulator\",\n                            \"x\": 455,\n                            \"y\": 464,\n                            \"uid\": 10\n                        },\n                        {\n                            \"plugin\": \"add_modulator\",\n                            \"x\": 661,\n                            \"y\": 373,\n                            \"uid\": 11\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 754,\n                            \"y\": 463,\n                            \"uid\": 12\n                        },\n                        {\n                            \"plugin\": \"add_modulator\",\n                            \"x\": 865,\n                            \"y\": 412,\n                            \"uid\": 13\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 956,\n                            \"y\": 160,\n                            \"uid\": 14,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"float\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"def\": null,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 381,\n                            \"y\": 594,\n                            \"uid\": 15,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Speed\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 218,\n                            \"y\": 198,\n                            \"uid\": 16,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Key press increase\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 7,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 206,\n                            \"y\": 489,\n                            \"uid\": 17,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Key press decrease\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 7,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 13,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 12,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 8,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 11,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 11,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 12,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 13,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 14,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 8,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        }\n                    ],\n                    \"registers\": [\n                        {\n                            \"id\": \"state\",\n                            \"dt\": 8\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Speed\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Key press increase\",\n                        \"dt\": 7,\n                        \"uid\": 2,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Key press decrease\",\n                        \"dt\": 7,\n                        \"uid\": 3,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"float\",\n                        \"dt\": 0,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"float_display\",\n                \"x\": 552,\n                \"y\": 336,\n                \"uid\": 23\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 227,\n                \"y\": 480,\n                \"uid\": 24,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Speed\"\n            },\n            {\n                \"plugin\": \"key_press_generator\",\n                \"x\": 170,\n                \"y\": 350,\n                \"uid\": 25,\n                \"state\": {\n                    \"key\": 37,\n                    \"type\": 0\n                }\n            },\n            {\n                \"plugin\": \"key_press_generator\",\n                \"x\": 170,\n                \"y\": 416,\n                \"uid\": 26,\n                \"state\": {\n                    \"key\": 39,\n                    \"type\": 0\n                }\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 22,\n                \"dst_nuid\": 23,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"src_dyn\": true\n            },\n            {\n                \"src_nuid\": 24,\n                \"dst_nuid\": 22,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 25,\n                \"dst_nuid\": 22,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 26,\n                \"dst_nuid\": 22,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            }\n        ],\n        \"registers\": [\n            {\n                \"id\": \"state\",\n                \"dt\": 0\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/material_all_texture_types.json",
    "content": "{\n    \"abs_t\": 200.128,\n    \"active_graph\": 0,\n    \"graph_uid\": 9,\n    \"root\": {\n        \"node_uid\": 13,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"material_texture_modulator\",\n                \"x\": 221,\n                \"y\": 55,\n                \"uid\": 1\n            },\n            {\n                \"plugin\": \"texture_type_generator\",\n                \"x\": 69,\n                \"y\": 54,\n                \"uid\": 2,\n                \"state\": {\n                    \"type\": 0\n                }\n            },\n            {\n                \"plugin\": \"url_texture_generator\",\n                \"x\": 108,\n                \"y\": 109,\n                \"uid\": 3,\n                \"state\": {\n                    \"url\": \"\"\n                }\n            },\n            {\n                \"plugin\": \"material_texture_modulator\",\n                \"x\": 226,\n                \"y\": 176,\n                \"uid\": 4\n            },\n            {\n                \"plugin\": \"texture_type_generator\",\n                \"x\": 66,\n                \"y\": 171,\n                \"uid\": 5,\n                \"state\": {\n                    \"type\": 2\n                }\n            },\n            {\n                \"plugin\": \"url_texture_generator\",\n                \"x\": 105,\n                \"y\": 227,\n                \"uid\": 6,\n                \"state\": {\n                    \"url\": \"\"\n                }\n            },\n            {\n                \"plugin\": \"material_texture_modulator\",\n                \"x\": 471,\n                \"y\": 56,\n                \"uid\": 7\n            },\n            {\n                \"plugin\": \"texture_type_generator\",\n                \"x\": 317,\n                \"y\": 56,\n                \"uid\": 8,\n                \"state\": {\n                    \"type\": 1\n                }\n            },\n            {\n                \"plugin\": \"url_texture_generator\",\n                \"x\": 357,\n                \"y\": 109,\n                \"uid\": 9,\n                \"state\": {\n                    \"url\": \"\"\n                }\n            },\n            {\n                \"plugin\": \"material_texture_modulator\",\n                \"x\": 477,\n                \"y\": 175,\n                \"uid\": 10\n            },\n            {\n                \"plugin\": \"texture_type_generator\",\n                \"x\": 323,\n                \"y\": 175,\n                \"uid\": 11,\n                \"state\": {\n                    \"type\": 3\n                }\n            },\n            {\n                \"plugin\": \"url_texture_generator\",\n                \"x\": 363,\n                \"y\": 228,\n                \"uid\": 12,\n                \"state\": {\n                    \"url\": \"\"\n                }\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 2,\n                \"dst_nuid\": 1,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 3,\n                \"dst_nuid\": 1,\n                \"src_slot\": 0,\n                \"dst_slot\": 2\n            },\n            {\n                \"src_nuid\": 1,\n                \"dst_nuid\": 4,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 4,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 6,\n                \"dst_nuid\": 4,\n                \"src_slot\": 0,\n                \"dst_slot\": 2\n            },\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 7,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 8,\n                \"dst_nuid\": 7,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 9,\n                \"dst_nuid\": 7,\n                \"src_slot\": 0,\n                \"dst_slot\": 2\n            },\n            {\n                \"src_nuid\": 7,\n                \"dst_nuid\": 10,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 11,\n                \"dst_nuid\": 10,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 12,\n                \"dst_nuid\": 10,\n                \"src_slot\": 0,\n                \"dst_slot\": 2\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/material_chain_with_hsla_and_blend_out.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 3,\n    \"root\": {\n        \"node_uid\": 11,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 620,\n                \"y\": 206,\n                \"uid\": 0,\n                \"dsid\": 18,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"15\": 3,\n                        \"21\": 4,\n                        \"22\": 5,\n                        \"23\": 6,\n                        \"24\": 7,\n                        \"25\": 8,\n                        \"34\": 10,\n                        \"39\": 12,\n                        \"40\": 13,\n                        \"41\": 14,\n                        \"44\": 16\n                    },\n                    \"output_sids\": {\n                        \"9\": 0\n                    }\n                },\n                \"title\": \"Material chain\",\n                \"graph\": {\n                    \"node_uid\": 47,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"material_diffuse_color_modulator\",\n                            \"x\": 1029,\n                            \"y\": 68,\n                            \"uid\": 1\n                        },\n                        {\n                            \"plugin\": \"material_alpha_clip_modulator\",\n                            \"x\": 1137,\n                            \"y\": 68,\n                            \"uid\": 5\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 1025,\n                            \"y\": 145,\n                            \"uid\": 6,\n                            \"state\": {\n                                \"enabled\": false\n                            },\n                            \"title\": \"Alpha clip\"\n                        },\n                        {\n                            \"plugin\": \"material_texture_modulator\",\n                            \"x\": 1252,\n                            \"y\": 68,\n                            \"uid\": 7\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1361,\n                            \"y\": 68,\n                            \"uid\": 9,\n                            \"dsid\": 18,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"material\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 12,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"material_blend_mode_modulator\",\n                            \"x\": 898,\n                            \"y\": 69,\n                            \"uid\": 10\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 1173,\n                            \"y\": 143,\n                            \"uid\": 15,\n                            \"dsid\": 18,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Image\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 2,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 800,\n                            \"y\": 134,\n                            \"uid\": 21,\n                            \"dsid\": 12,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"hue\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 798,\n                            \"y\": 183,\n                            \"uid\": 22,\n                            \"dsid\": 12,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"saturation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 800,\n                            \"y\": 231,\n                            \"uid\": 23,\n                            \"dsid\": 12,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"luminosity\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 799,\n                            \"y\": 279,\n                            \"uid\": 24,\n                            \"dsid\": 12,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"alpha\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 800,\n                            \"y\": 70,\n                            \"uid\": 25,\n                            \"dsid\": 12,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"blend mode\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"convert_hsla_color_modulator\",\n                            \"x\": 907,\n                            \"y\": 147,\n                            \"uid\": 26\n                        },\n                        {\n                            \"plugin\": \"material_z_buffer_modulator\",\n                            \"x\": 672,\n                            \"y\": 65,\n                            \"uid\": 27\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 574,\n                            \"y\": 162,\n                            \"uid\": 28,\n                            \"state\": {\n                                \"enabled\": false\n                            },\n                            \"title\": \"Z-buffer\"\n                        },\n                        {\n                            \"plugin\": \"material_shinyness_modulator\",\n                            \"x\": 558,\n                            \"y\": 64,\n                            \"uid\": 31\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 470,\n                            \"y\": 149,\n                            \"uid\": 32,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"9\": 0\n                                },\n                                \"output_sids\": {\n                                    \"12\": 2\n                                }\n                            },\n                            \"title\": \"min max calc\",\n                            \"graph\": {\n                                \"node_uid\": 13,\n                                \"uid\": 2,\n                                \"parent_uid\": 1,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 27,\n                                        \"y\": 190,\n                                        \"uid\": 2,\n                                        \"state\": {\n                                            \"val\": 10\n                                        },\n                                        \"title\": \"Maximum\"\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 144,\n                                        \"y\": 65,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"absolute_modulator\",\n                                        \"x\": 232,\n                                        \"y\": 65,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 319,\n                                        \"y\": 45,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"add_modulator\",\n                                        \"x\": 401,\n                                        \"y\": 122,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"min_modulator\",\n                                        \"x\": 143,\n                                        \"y\": 142,\n                                        \"uid\": 8\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 248,\n                                        \"y\": 9,\n                                        \"uid\": 9,\n                                        \"dsid\": 10,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"value\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 10,\n                                        \"y\": 85,\n                                        \"uid\": 11,\n                                        \"state\": {\n                                            \"val\": 0\n                                        },\n                                        \"title\": \"Minimum\"\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 486,\n                                        \"y\": 122,\n                                        \"uid\": 12,\n                                        \"dsid\": 10,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"value\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 426,\n                            \"y\": 241,\n                            \"uid\": 34,\n                            \"dsid\": 6,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"shinyness\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"material_double_sided_modulator\",\n                            \"x\": 437,\n                            \"y\": 61,\n                            \"uid\": 35\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 362,\n                            \"y\": 146,\n                            \"uid\": 36,\n                            \"state\": {\n                                \"enabled\": true\n                            },\n                            \"title\": \"Double-sided\"\n                        },\n                        {\n                            \"plugin\": \"material_ambient_color_modulator\",\n                            \"x\": 290,\n                            \"y\": 73,\n                            \"uid\": 37\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 63,\n                            \"y\": 153,\n                            \"uid\": 39,\n                            \"dsid\": 13,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"am hue\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 60,\n                            \"y\": 202,\n                            \"uid\": 40,\n                            \"dsid\": 13,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"am saturation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 63,\n                            \"y\": 250,\n                            \"uid\": 41,\n                            \"dsid\": 13,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"am luminosity\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"convert_hsla_color_modulator\",\n                            \"x\": 170,\n                            \"y\": 166,\n                            \"uid\": 43\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 58,\n                            \"y\": 70,\n                            \"uid\": 44,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"material\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 12,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 26,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 27,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 28,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 31,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 32,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 34,\n                            \"dst_nuid\": 32,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 35,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 36,\n                            \"dst_nuid\": 35,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 35,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 39,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 40,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 41,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 43,\n                            \"dst_nuid\": 37,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 44,\n                            \"dst_nuid\": 37,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Image\",\n                        \"dt\": 2,\n                        \"uid\": 3,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"hue\",\n                        \"dt\": 0,\n                        \"uid\": 4,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"saturation\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"luminosity\",\n                        \"dt\": 0,\n                        \"uid\": 6,\n                        \"index\": 3,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"alpha\",\n                        \"dt\": 0,\n                        \"uid\": 7,\n                        \"index\": 4,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"blend mode\",\n                        \"dt\": 0,\n                        \"uid\": 8,\n                        \"index\": 5,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"shinyness\",\n                        \"dt\": 0,\n                        \"uid\": 10,\n                        \"index\": 6,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"am hue\",\n                        \"dt\": 0,\n                        \"uid\": 12,\n                        \"index\": 7,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"am saturation\",\n                        \"dt\": 0,\n                        \"uid\": 13,\n                        \"index\": 8,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"am luminosity\",\n                        \"dt\": 0,\n                        \"uid\": 14,\n                        \"index\": 9,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"material\",\n                        \"dt\": 12,\n                        \"uid\": 16,\n                        \"index\": 10,\n                        \"type\": 0\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"material\",\n                        \"dt\": 12,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"url_texture_generator\",\n                \"x\": 203,\n                \"y\": 206,\n                \"uid\": 1,\n                \"state\": {\n                    \"url\": \"/data/image/f0e870569e5a143a8d3be0722e38e523141e4248.png\"\n                },\n                \"title\": \"Image\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 306,\n                \"y\": 206,\n                \"uid\": 2,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Hue\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 379,\n                \"y\": 206,\n                \"uid\": 3,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Saturation\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 458,\n                \"y\": 206,\n                \"uid\": 4,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Luminosity\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 539,\n                \"y\": 206,\n                \"uid\": 5,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Alpha\"\n            },\n            {\n                \"plugin\": \"blend_mode_generator\",\n                \"x\": 460,\n                \"y\": 272,\n                \"uid\": 6,\n                \"state\": {\n                    \"mode\": 4\n                }\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 379,\n                \"y\": 272,\n                \"uid\": 7,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Shinyness\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 338,\n                \"y\": 344,\n                \"uid\": 8,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Ambient Hue\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 430,\n                \"y\": 344,\n                \"uid\": 9,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Ambient Sat\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 518,\n                \"y\": 344,\n                \"uid\": 10,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Ambient Lum\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 1,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 2,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 3,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 3,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 4,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 6,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 5,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 7,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 6,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 10,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 9,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 9,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 8,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 8,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 7,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/material_chain_with_image_out.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 2,\n    \"root\": {\n        \"node_uid\": 2,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 532,\n                \"y\": 300,\n                \"uid\": 0,\n                \"dsid\": 4,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"15\": 3\n                    },\n                    \"output_sids\": {\n                        \"9\": 0\n                    }\n                },\n                \"title\": \"Material chain\",\n                \"graph\": {\n                    \"node_uid\": 18,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"material_diffuse_color_modulator\",\n                            \"x\": 488,\n                            \"y\": 182,\n                            \"uid\": 1\n                        },\n                        {\n                            \"plugin\": \"color_picker\",\n                            \"x\": 175,\n                            \"y\": 207,\n                            \"uid\": 2,\n                            \"state\": {\n                                \"hue\": 0,\n                                \"sat\": 0.03,\n                                \"lum\": 1\n                            },\n                            \"title\": \"Color picker\"\n                        },\n                        {\n                            \"plugin\": \"alpha_modulator\",\n                            \"x\": 394,\n                            \"y\": 280,\n                            \"uid\": 3\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 282,\n                            \"y\": 354,\n                            \"uid\": 4,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Alpha\"\n                        },\n                        {\n                            \"plugin\": \"material_alpha_clip_modulator\",\n                            \"x\": 607,\n                            \"y\": 182,\n                            \"uid\": 5\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 484,\n                            \"y\": 258,\n                            \"uid\": 6,\n                            \"state\": {\n                                \"enabled\": false\n                            },\n                            \"title\": \"Alpha clip\"\n                        },\n                        {\n                            \"plugin\": \"material_texture_modulator\",\n                            \"x\": 726,\n                            \"y\": 182,\n                            \"uid\": 7\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 836,\n                            \"y\": 182,\n                            \"uid\": 9,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"material\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 12,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"material_blend_mode_modulator\",\n                            \"x\": 336,\n                            \"y\": 123,\n                            \"uid\": 10\n                        },\n                        {\n                            \"plugin\": \"blend_mode_generator\",\n                            \"x\": 118,\n                            \"y\": 356,\n                            \"uid\": 12,\n                            \"state\": {\n                                \"mode\": 4\n                            }\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 644,\n                            \"y\": 258,\n                            \"uid\": 15,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Image\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 2,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"material_z_buffer_modulator\",\n                            \"x\": 144,\n                            \"y\": 73,\n                            \"uid\": 16\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 16,\n                            \"y\": 93,\n                            \"uid\": 17,\n                            \"state\": {\n                                \"enabled\": true\n                            },\n                            \"title\": \"Depth test\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Image\",\n                        \"dt\": 2,\n                        \"uid\": 3,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"material\",\n                        \"dt\": 12,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"url_texture_generator\",\n                \"x\": 408,\n                \"y\": 320,\n                \"uid\": 1,\n                \"state\": {\n                    \"url\": \"/data/image/f0e870569e5a143a8d3be0722e38e523141e4248.png\"\n                },\n                \"title\": \"Image\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 1,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/material_full_material_chain.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 2,\n    \"root\": {\n        \"node_uid\": 11,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 621,\n                \"y\": 391,\n                \"uid\": 0,\n                \"dsid\": 20,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {\n                        \"15\": 3,\n                        \"21\": 4,\n                        \"22\": 5,\n                        \"23\": 6,\n                        \"24\": 7,\n                        \"25\": 8,\n                        \"34\": 10,\n                        \"39\": 12,\n                        \"40\": 13,\n                        \"41\": 14,\n                        \"44\": 16,\n                        \"47\": 18,\n                        \"49\": 19\n                    },\n                    \"output_sids\": {\n                        \"9\": 0\n                    }\n                },\n                \"title\": \"Material chain\",\n                \"graph\": {\n                    \"node_uid\": 53,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"material_diffuse_color_modulator\",\n                            \"x\": 1054,\n                            \"y\": 73,\n                            \"uid\": 1\n                        },\n                        {\n                            \"plugin\": \"material_alpha_clip_modulator\",\n                            \"x\": 1176,\n                            \"y\": 73,\n                            \"uid\": 5\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 1064,\n                            \"y\": 151,\n                            \"uid\": 6,\n                            \"state\": {\n                                \"enabled\": false\n                            },\n                            \"title\": \"Alpha clip\"\n                        },\n                        {\n                            \"plugin\": \"material_texture_modulator\",\n                            \"x\": 1288,\n                            \"y\": 73,\n                            \"uid\": 7\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1396,\n                            \"y\": 73,\n                            \"uid\": 9,\n                            \"dsid\": 30,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"material\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 12,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"material_blend_mode_modulator\",\n                            \"x\": 839,\n                            \"y\": 73,\n                            \"uid\": 10\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 1207,\n                            \"y\": 150,\n                            \"uid\": 15,\n                            \"dsid\": 30,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Image\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 2,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 866,\n                            \"y\": 279,\n                            \"uid\": 21,\n                            \"dsid\": 24,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"hue\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 803,\n                            \"y\": 334,\n                            \"uid\": 22,\n                            \"dsid\": 24,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"saturation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 814,\n                            \"y\": 395,\n                            \"uid\": 23,\n                            \"dsid\": 24,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"luminosity\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 856,\n                            \"y\": 457,\n                            \"uid\": 24,\n                            \"dsid\": 24,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"alpha\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 739,\n                            \"y\": 204,\n                            \"uid\": 25,\n                            \"dsid\": 24,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"blend mode\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"convert_hsla_color_modulator\",\n                            \"x\": 943,\n                            \"y\": 296,\n                            \"uid\": 26\n                        },\n                        {\n                            \"plugin\": \"material_z_buffer_modulator\",\n                            \"x\": 706,\n                            \"y\": 72,\n                            \"uid\": 27\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 573,\n                            \"y\": 162,\n                            \"uid\": 28,\n                            \"state\": {\n                                \"enabled\": true\n                            },\n                            \"title\": \"Z-buffer\"\n                        },\n                        {\n                            \"plugin\": \"material_shinyness_modulator\",\n                            \"x\": 559,\n                            \"y\": 73,\n                            \"uid\": 31\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 375,\n                            \"y\": 234,\n                            \"uid\": 34,\n                            \"dsid\": 18,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"shinyness\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"material_double_sided_modulator\",\n                            \"x\": 432,\n                            \"y\": 73,\n                            \"uid\": 35\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 323,\n                            \"y\": 161,\n                            \"uid\": 36,\n                            \"state\": {\n                                \"enabled\": false\n                            },\n                            \"title\": \"Double-sided\"\n                        },\n                        {\n                            \"plugin\": \"material_ambient_color_modulator\",\n                            \"x\": 290,\n                            \"y\": 73,\n                            \"uid\": 37\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 83,\n                            \"y\": 181,\n                            \"uid\": 39,\n                            \"dsid\": 25,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"am hue\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 45,\n                            \"y\": 244,\n                            \"uid\": 40,\n                            \"dsid\": 25,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"am saturation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 56,\n                            \"y\": 305,\n                            \"uid\": 41,\n                            \"dsid\": 25,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"am luminosity\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"convert_hsla_color_modulator\",\n                            \"x\": 170,\n                            \"y\": 200,\n                            \"uid\": 43\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 17,\n                            \"y\": 38,\n                            \"uid\": 44,\n                            \"dsid\": 14,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"material\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 12,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 106,\n                            \"y\": 109,\n                            \"uid\": 47,\n                            \"dsid\": 9,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 13,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"material_light_modulator\",\n                            \"x\": 169,\n                            \"y\": 22,\n                            \"uid\": 48\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 18,\n                            \"y\": 93,\n                            \"uid\": 49,\n                            \"dsid\": 6,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light index\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 584,\n                            \"y\": 231,\n                            \"uid\": 50,\n                            \"state\": {\n                                \"enabled\": true\n                            },\n                            \"title\": \"Depth write\"\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 479,\n                            \"y\": 251,\n                            \"uid\": 51\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 353,\n                            \"y\": 296,\n                            \"uid\": 52,\n                            \"state\": {\n                                \"val\": 10\n                            }\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 26,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 27,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 28,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 31,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 35,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 36,\n                            \"dst_nuid\": 35,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 35,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 39,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 40,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 41,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 43,\n                            \"dst_nuid\": 37,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 47,\n                            \"dst_nuid\": 48,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 44,\n                            \"dst_nuid\": 48,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 48,\n                            \"dst_nuid\": 37,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 49,\n                            \"dst_nuid\": 48,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 50,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        },\n                        {\n                            \"src_nuid\": 34,\n                            \"dst_nuid\": 51,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 52,\n                            \"dst_nuid\": 51,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 51,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Image\",\n                        \"dt\": 2,\n                        \"uid\": 3,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"hue\",\n                        \"dt\": 0,\n                        \"uid\": 4,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"saturation\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"luminosity\",\n                        \"dt\": 0,\n                        \"uid\": 6,\n                        \"index\": 3,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"alpha\",\n                        \"dt\": 0,\n                        \"uid\": 7,\n                        \"index\": 4,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"blend mode\",\n                        \"dt\": 0,\n                        \"uid\": 8,\n                        \"index\": 5,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"shinyness\",\n                        \"dt\": 0,\n                        \"uid\": 10,\n                        \"index\": 6,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"am hue\",\n                        \"dt\": 0,\n                        \"uid\": 12,\n                        \"index\": 7,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"am saturation\",\n                        \"dt\": 0,\n                        \"uid\": 13,\n                        \"index\": 8,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"am luminosity\",\n                        \"dt\": 0,\n                        \"uid\": 14,\n                        \"index\": 9,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"material\",\n                        \"dt\": 12,\n                        \"uid\": 16,\n                        \"index\": 10,\n                        \"type\": 0,\n                        \"is_connected\": false\n                    },\n                    {\n                        \"name\": \"light\",\n                        \"dt\": 13,\n                        \"uid\": 18,\n                        \"index\": 11,\n                        \"type\": 0,\n                        \"is_connected\": false\n                    },\n                    {\n                        \"name\": \"light index\",\n                        \"dt\": 0,\n                        \"uid\": 19,\n                        \"index\": 12,\n                        \"type\": 0\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"material\",\n                        \"dt\": 12,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"url_texture_generator\",\n                \"x\": 131,\n                \"y\": 380,\n                \"uid\": 1,\n                \"state\": {\n                    \"url\": \"/data/image/57422df4c11a76d5531ef36299d5d1ac5b6b6739.jpg\"\n                },\n                \"title\": \"Image\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 250,\n                \"y\": 380,\n                \"uid\": 2,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Hue\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 333,\n                \"y\": 381,\n                \"uid\": 3,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Saturation\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 427,\n                \"y\": 380,\n                \"uid\": 4,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Luminosity\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 515,\n                \"y\": 380,\n                \"uid\": 5,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Alpha\"\n            },\n            {\n                \"plugin\": \"blend_mode_generator\",\n                \"x\": 130,\n                \"y\": 456,\n                \"uid\": 6,\n                \"state\": {\n                    \"mode\": 4\n                }\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 515,\n                \"y\": 530,\n                \"uid\": 7,\n                \"state\": {\n                    \"val\": 0.03\n                },\n                \"title\": \"Shinyness\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 319,\n                \"y\": 458,\n                \"uid\": 8,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Ambient Hue\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 419,\n                \"y\": 458,\n                \"uid\": 9,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Ambient Sat\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 515,\n                \"y\": 457,\n                \"uid\": 10,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Ambient Lum\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 1,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 2,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 3,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 3,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 4,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 6,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 5,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 7,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 6,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 10,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 9,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 9,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 8,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 8,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 7,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/material_light_chain.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 4,\n    \"root\": {\n        \"node_uid\": 22,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 438,\n                \"y\": 94,\n                \"uid\": 11,\n                \"dsid\": 16,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"13\": 1,\n                        \"14\": 2,\n                        \"15\": 3,\n                        \"16\": 4,\n                        \"17\": 5,\n                        \"18\": 6,\n                        \"19\": 7,\n                        \"22\": 8,\n                        \"23\": 9,\n                        \"24\": 10\n                    },\n                    \"output_sids\": {\n                        \"30\": 15\n                    }\n                },\n                \"title\": \"Light chain\",\n                \"graph\": {\n                    \"node_uid\": 31,\n                    \"uid\": 3,\n                    \"parent_uid\": 0,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"light_type_modulator\",\n                            \"x\": 692,\n                            \"y\": 216,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"light_position_modulator\",\n                            \"x\": 604,\n                            \"y\": 215,\n                            \"uid\": 2\n                        },\n                        {\n                            \"plugin\": \"light_diffuse_color_modulator\",\n                            \"x\": 200,\n                            \"y\": 217,\n                            \"uid\": 3\n                        },\n                        {\n                            \"plugin\": \"light_direction_modulator\",\n                            \"x\": 521,\n                            \"y\": 215,\n                            \"uid\": 4\n                        },\n                        {\n                            \"plugin\": \"light_intensity_modulator\",\n                            \"x\": 430,\n                            \"y\": 219,\n                            \"uid\": 5\n                        },\n                        {\n                            \"plugin\": \"light_specular_color_modulator\",\n                            \"x\": 309,\n                            \"y\": 219,\n                            \"uid\": 6\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 494,\n                            \"y\": 380,\n                            \"uid\": 7\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 609,\n                            \"y\": 401,\n                            \"uid\": 13,\n                            \"dsid\": 9,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light type\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 413,\n                            \"y\": 532,\n                            \"uid\": 14,\n                            \"dsid\": 9,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Pos x\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 412,\n                            \"y\": 581,\n                            \"uid\": 15,\n                            \"dsid\": 10,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Pos y\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 412,\n                            \"y\": 627,\n                            \"uid\": 16,\n                            \"dsid\": 11,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Pos z\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 350,\n                            \"y\": 358,\n                            \"uid\": 17,\n                            \"dsid\": 9,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"intensity\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 196,\n                            \"y\": 340,\n                            \"uid\": 18,\n                            \"dsid\": 9,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"specular color\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 3,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 80,\n                            \"y\": 347,\n                            \"uid\": 19,\n                            \"dsid\": 10,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"diffuse color\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 3,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"vector_normalize\",\n                            \"x\": 361,\n                            \"y\": 452,\n                            \"uid\": 20\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 248,\n                            \"y\": 461,\n                            \"uid\": 21\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 146,\n                            \"y\": 479,\n                            \"uid\": 22,\n                            \"dsid\": 10,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Dir x\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 145,\n                            \"y\": 528,\n                            \"uid\": 23,\n                            \"dsid\": 11,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Dir y\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 145,\n                            \"y\": 574,\n                            \"uid\": 24,\n                            \"dsid\": 12,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Dir z\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 795,\n                            \"y\": 219,\n                            \"uid\": 30,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 13,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 18,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 20,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 20,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 30,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"light type\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Pos x\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Pos y\",\n                        \"dt\": 0,\n                        \"uid\": 3,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Pos z\",\n                        \"dt\": 0,\n                        \"uid\": 4,\n                        \"index\": 3,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"intensity\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 4,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"specular color\",\n                        \"dt\": 3,\n                        \"uid\": 6,\n                        \"index\": 5,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"diffuse color\",\n                        \"dt\": 3,\n                        \"uid\": 7,\n                        \"index\": 6,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Dir x\",\n                        \"dt\": 0,\n                        \"uid\": 8,\n                        \"index\": 7,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Dir y\",\n                        \"dt\": 0,\n                        \"uid\": 9,\n                        \"index\": 8,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Dir z\",\n                        \"dt\": 0,\n                        \"uid\": 10,\n                        \"index\": 9,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"light\",\n                        \"dt\": 13,\n                        \"uid\": 15,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"light_type_generator\",\n                \"x\": 36,\n                \"y\": 94,\n                \"uid\": 12,\n                \"state\": {\n                    \"type\": 0\n                }\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 238,\n                \"y\": 94,\n                \"uid\": 13,\n                \"state\": {\n                    \"val\": 1.6,\n                    \"min\": 0,\n                    \"max\": 10\n                },\n                \"title\": \"Intensity\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 37,\n                \"y\": 167,\n                \"uid\": 14,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -20,\n                    \"max\": 20\n                },\n                \"title\": \"Light position X\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 37,\n                \"y\": 233,\n                \"uid\": 15,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -20,\n                    \"max\": 20\n                },\n                \"title\": \"Light position Y\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 37,\n                \"y\": 301,\n                \"uid\": 16,\n                \"state\": {\n                    \"val\": 1.2,\n                    \"min\": -20,\n                    \"max\": 20\n                },\n                \"title\": \"Light position Z\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 235,\n                \"y\": 168,\n                \"uid\": 17,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Light direction X\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 235,\n                \"y\": 237,\n                \"uid\": 18,\n                \"state\": {\n                    \"val\": 0.04,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Light direction Y\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 235,\n                \"y\": 302,\n                \"uid\": 19,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Light direction z\"\n            },\n            {\n                \"plugin\": \"color_picker\",\n                \"x\": 39,\n                \"y\": 382,\n                \"uid\": 20,\n                \"state\": {\n                    \"hue\": 0,\n                    \"sat\": 0,\n                    \"lum\": 1\n                },\n                \"title\": \"Diffuse color\"\n            },\n            {\n                \"plugin\": \"color_picker\",\n                \"x\": 225,\n                \"y\": 383,\n                \"uid\": 21,\n                \"state\": {\n                    \"hue\": 0,\n                    \"sat\": 0,\n                    \"lum\": 1\n                },\n                \"title\": \"Specular color\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 12,\n                \"dst_nuid\": 11,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 13,\n                \"dst_nuid\": 11,\n                \"src_slot\": 0,\n                \"dst_slot\": 4,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 14,\n                \"dst_nuid\": 11,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 15,\n                \"dst_nuid\": 11,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 16,\n                \"dst_nuid\": 11,\n                \"src_slot\": 0,\n                \"dst_slot\": 3,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 17,\n                \"dst_nuid\": 11,\n                \"src_slot\": 0,\n                \"dst_slot\": 7,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 18,\n                \"dst_nuid\": 11,\n                \"src_slot\": 0,\n                \"dst_slot\": 8,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 19,\n                \"dst_nuid\": 11,\n                \"src_slot\": 0,\n                \"dst_slot\": 9,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 20,\n                \"dst_nuid\": 11,\n                \"src_slot\": 0,\n                \"dst_slot\": 6,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 21,\n                \"dst_nuid\": 11,\n                \"src_slot\": 0,\n                \"dst_slot\": 5,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/material_material_and_light.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 7,\n    \"root\": {\n        \"node_uid\": 51,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 646,\n                \"y\": 195,\n                \"uid\": 29,\n                \"dsid\": 20,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {\n                        \"15\": 3,\n                        \"21\": 4,\n                        \"22\": 5,\n                        \"23\": 6,\n                        \"24\": 7,\n                        \"25\": 8,\n                        \"34\": 10,\n                        \"39\": 12,\n                        \"40\": 13,\n                        \"41\": 14,\n                        \"44\": 16,\n                        \"47\": 18,\n                        \"49\": 19\n                    },\n                    \"output_sids\": {\n                        \"9\": 0\n                    }\n                },\n                \"title\": \"Material chain\",\n                \"graph\": {\n                    \"node_uid\": 51,\n                    \"uid\": 4,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"material_diffuse_color_modulator\",\n                            \"x\": 1029,\n                            \"y\": 68,\n                            \"uid\": 1\n                        },\n                        {\n                            \"plugin\": \"material_alpha_clip_modulator\",\n                            \"x\": 1137,\n                            \"y\": 68,\n                            \"uid\": 5\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 1025,\n                            \"y\": 145,\n                            \"uid\": 6,\n                            \"state\": {\n                                \"enabled\": false\n                            },\n                            \"title\": \"Alpha clip\"\n                        },\n                        {\n                            \"plugin\": \"material_texture_modulator\",\n                            \"x\": 1252,\n                            \"y\": 68,\n                            \"uid\": 7\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1361,\n                            \"y\": 68,\n                            \"uid\": 9,\n                            \"dsid\": 28,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"material\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 12,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"material_blend_mode_modulator\",\n                            \"x\": 898,\n                            \"y\": 69,\n                            \"uid\": 10\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 1173,\n                            \"y\": 143,\n                            \"uid\": 15,\n                            \"dsid\": 28,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Image\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 2,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 800,\n                            \"y\": 134,\n                            \"uid\": 21,\n                            \"dsid\": 22,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"hue\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 798,\n                            \"y\": 183,\n                            \"uid\": 22,\n                            \"dsid\": 22,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"saturation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 800,\n                            \"y\": 231,\n                            \"uid\": 23,\n                            \"dsid\": 22,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"luminosity\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 799,\n                            \"y\": 279,\n                            \"uid\": 24,\n                            \"dsid\": 22,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"alpha\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 800,\n                            \"y\": 70,\n                            \"uid\": 25,\n                            \"dsid\": 22,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"blend mode\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"convert_hsla_color_modulator\",\n                            \"x\": 907,\n                            \"y\": 147,\n                            \"uid\": 26\n                        },\n                        {\n                            \"plugin\": \"material_z_buffer_modulator\",\n                            \"x\": 672,\n                            \"y\": 65,\n                            \"uid\": 27\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 564,\n                            \"y\": 212,\n                            \"uid\": 28,\n                            \"state\": {\n                                \"enabled\": true\n                            },\n                            \"title\": \"Z-buffer\"\n                        },\n                        {\n                            \"plugin\": \"material_shinyness_modulator\",\n                            \"x\": 558,\n                            \"y\": 64,\n                            \"uid\": 31\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 454,\n                            \"y\": 148,\n                            \"uid\": 32,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"9\": 0\n                                },\n                                \"output_sids\": {\n                                    \"12\": 2\n                                }\n                            },\n                            \"title\": \"min max calc\",\n                            \"graph\": {\n                                \"node_uid\": 13,\n                                \"uid\": 5,\n                                \"parent_uid\": 4,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 27,\n                                        \"y\": 190,\n                                        \"uid\": 2,\n                                        \"state\": {\n                                            \"val\": 10\n                                        },\n                                        \"title\": \"Maximum\"\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 144,\n                                        \"y\": 65,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"absolute_modulator\",\n                                        \"x\": 232,\n                                        \"y\": 65,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 319,\n                                        \"y\": 45,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"add_modulator\",\n                                        \"x\": 401,\n                                        \"y\": 122,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"min_modulator\",\n                                        \"x\": 143,\n                                        \"y\": 142,\n                                        \"uid\": 8\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 248,\n                                        \"y\": 9,\n                                        \"uid\": 9,\n                                        \"dsid\": 20,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"value\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 10,\n                                        \"y\": 85,\n                                        \"uid\": 11,\n                                        \"state\": {\n                                            \"val\": 0\n                                        },\n                                        \"title\": \"Minimum\"\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 486,\n                                        \"y\": 122,\n                                        \"uid\": 12,\n                                        \"dsid\": 20,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"value\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 361,\n                            \"y\": 242,\n                            \"uid\": 34,\n                            \"dsid\": 16,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"shinyness\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"material_double_sided_modulator\",\n                            \"x\": 437,\n                            \"y\": 61,\n                            \"uid\": 35\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 323,\n                            \"y\": 161,\n                            \"uid\": 36,\n                            \"state\": {\n                                \"enabled\": false\n                            },\n                            \"title\": \"Double-sided\"\n                        },\n                        {\n                            \"plugin\": \"material_ambient_color_modulator\",\n                            \"x\": 290,\n                            \"y\": 73,\n                            \"uid\": 37\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 63,\n                            \"y\": 153,\n                            \"uid\": 39,\n                            \"dsid\": 23,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"am hue\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 60,\n                            \"y\": 202,\n                            \"uid\": 40,\n                            \"dsid\": 23,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"am saturation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 63,\n                            \"y\": 250,\n                            \"uid\": 41,\n                            \"dsid\": 23,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"am luminosity\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"convert_hsla_color_modulator\",\n                            \"x\": 170,\n                            \"y\": 166,\n                            \"uid\": 43\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 61,\n                            \"y\": 99,\n                            \"uid\": 44,\n                            \"dsid\": 12,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"material\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 12,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 40,\n                            \"y\": 52,\n                            \"uid\": 47,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 13,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"material_light_modulator\",\n                            \"x\": 158,\n                            \"y\": 22,\n                            \"uid\": 48\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 54,\n                            \"y\": 0,\n                            \"uid\": 49,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light index\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 574,\n                            \"y\": 276,\n                            \"uid\": 50,\n                            \"state\": {\n                                \"enabled\": true\n                            },\n                            \"title\": \"Depth write\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 26,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 27,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 28,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 31,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 32,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 34,\n                            \"dst_nuid\": 32,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 35,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 36,\n                            \"dst_nuid\": 35,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 35,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 39,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 40,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 41,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 43,\n                            \"dst_nuid\": 37,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 47,\n                            \"dst_nuid\": 48,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 44,\n                            \"dst_nuid\": 48,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 48,\n                            \"dst_nuid\": 37,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 49,\n                            \"dst_nuid\": 48,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 50,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Image\",\n                        \"dt\": 2,\n                        \"uid\": 3,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"hue\",\n                        \"dt\": 0,\n                        \"uid\": 4,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"saturation\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"luminosity\",\n                        \"dt\": 0,\n                        \"uid\": 6,\n                        \"index\": 3,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"alpha\",\n                        \"dt\": 0,\n                        \"uid\": 7,\n                        \"index\": 4,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"blend mode\",\n                        \"dt\": 0,\n                        \"uid\": 8,\n                        \"index\": 5,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"shinyness\",\n                        \"dt\": 0,\n                        \"uid\": 10,\n                        \"index\": 6,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"am hue\",\n                        \"dt\": 0,\n                        \"uid\": 12,\n                        \"index\": 7,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"am saturation\",\n                        \"dt\": 0,\n                        \"uid\": 13,\n                        \"index\": 8,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"am luminosity\",\n                        \"dt\": 0,\n                        \"uid\": 14,\n                        \"index\": 9,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"material\",\n                        \"dt\": 12,\n                        \"uid\": 16,\n                        \"index\": 10,\n                        \"type\": 0,\n                        \"is_connected\": false\n                    },\n                    {\n                        \"name\": \"light\",\n                        \"dt\": 13,\n                        \"uid\": 18,\n                        \"index\": 11,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"light index\",\n                        \"dt\": 0,\n                        \"uid\": 19,\n                        \"index\": 12,\n                        \"type\": 0\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"material\",\n                        \"dt\": 12,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"url_texture_generator\",\n                \"x\": 220,\n                \"y\": 195,\n                \"uid\": 30,\n                \"state\": {\n                    \"url\": \"/data/image/57422df4c11a76d5531ef36299d5d1ac5b6b6739.jpg\"\n                },\n                \"title\": \"Image\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 324,\n                \"y\": 193,\n                \"uid\": 31,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Hue\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 396,\n                \"y\": 195,\n                \"uid\": 32,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Saturation\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 475,\n                \"y\": 195,\n                \"uid\": 33,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Luminosity\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 556,\n                \"y\": 195,\n                \"uid\": 34,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Alpha\"\n            },\n            {\n                \"plugin\": \"blend_mode_generator\",\n                \"x\": 220,\n                \"y\": 260,\n                \"uid\": 35,\n                \"state\": {\n                    \"mode\": 4\n                }\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 220,\n                \"y\": 316,\n                \"uid\": 36,\n                \"state\": {\n                    \"val\": 0.03\n                },\n                \"title\": \"Shinyness\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 365,\n                \"y\": 260,\n                \"uid\": 37,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Ambient Hue\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 457,\n                \"y\": 260,\n                \"uid\": 38,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Ambient Sat\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 545,\n                \"y\": 260,\n                \"uid\": 39,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Ambient Lum\"\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 509,\n                \"y\": 428,\n                \"uid\": 40,\n                \"dsid\": 16,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {\n                        \"13\": 1,\n                        \"14\": 2,\n                        \"15\": 3,\n                        \"16\": 4,\n                        \"17\": 5,\n                        \"18\": 6,\n                        \"19\": 7,\n                        \"22\": 8,\n                        \"23\": 9,\n                        \"24\": 10\n                    },\n                    \"output_sids\": {\n                        \"30\": 15\n                    }\n                },\n                \"title\": \"Light chain\",\n                \"graph\": {\n                    \"node_uid\": 31,\n                    \"uid\": 6,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"light_type_modulator\",\n                            \"x\": 692,\n                            \"y\": 216,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"light_position_modulator\",\n                            \"x\": 604,\n                            \"y\": 215,\n                            \"uid\": 2\n                        },\n                        {\n                            \"plugin\": \"light_diffuse_color_modulator\",\n                            \"x\": 200,\n                            \"y\": 217,\n                            \"uid\": 3\n                        },\n                        {\n                            \"plugin\": \"light_direction_modulator\",\n                            \"x\": 521,\n                            \"y\": 215,\n                            \"uid\": 4\n                        },\n                        {\n                            \"plugin\": \"light_intensity_modulator\",\n                            \"x\": 430,\n                            \"y\": 219,\n                            \"uid\": 5\n                        },\n                        {\n                            \"plugin\": \"light_specular_color_modulator\",\n                            \"x\": 309,\n                            \"y\": 219,\n                            \"uid\": 6\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 494,\n                            \"y\": 380,\n                            \"uid\": 7\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 609,\n                            \"y\": 401,\n                            \"uid\": 13,\n                            \"dsid\": 9,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light type\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 413,\n                            \"y\": 532,\n                            \"uid\": 14,\n                            \"dsid\": 9,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Pos x\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 412,\n                            \"y\": 581,\n                            \"uid\": 15,\n                            \"dsid\": 10,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Pos y\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 412,\n                            \"y\": 627,\n                            \"uid\": 16,\n                            \"dsid\": 11,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Pos z\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 350,\n                            \"y\": 358,\n                            \"uid\": 17,\n                            \"dsid\": 9,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"intensity\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 196,\n                            \"y\": 340,\n                            \"uid\": 18,\n                            \"dsid\": 9,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"specular color\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 3,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 80,\n                            \"y\": 347,\n                            \"uid\": 19,\n                            \"dsid\": 10,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"diffuse color\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 3,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"vector_normalize\",\n                            \"x\": 361,\n                            \"y\": 452,\n                            \"uid\": 20\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 248,\n                            \"y\": 461,\n                            \"uid\": 21\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 146,\n                            \"y\": 479,\n                            \"uid\": 22,\n                            \"dsid\": 10,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Dir x\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 145,\n                            \"y\": 528,\n                            \"uid\": 23,\n                            \"dsid\": 11,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Dir y\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 145,\n                            \"y\": 574,\n                            \"uid\": 24,\n                            \"dsid\": 12,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Dir z\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 795,\n                            \"y\": 219,\n                            \"uid\": 30,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 13,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 18,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 20,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 20,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 30,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"light type\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Pos x\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Pos y\",\n                        \"dt\": 0,\n                        \"uid\": 3,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Pos z\",\n                        \"dt\": 0,\n                        \"uid\": 4,\n                        \"index\": 3,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"intensity\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 4,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"specular color\",\n                        \"dt\": 3,\n                        \"uid\": 6,\n                        \"index\": 5,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"diffuse color\",\n                        \"dt\": 3,\n                        \"uid\": 7,\n                        \"index\": 6,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Dir x\",\n                        \"dt\": 0,\n                        \"uid\": 8,\n                        \"index\": 7,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Dir y\",\n                        \"dt\": 0,\n                        \"uid\": 9,\n                        \"index\": 8,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Dir z\",\n                        \"dt\": 0,\n                        \"uid\": 10,\n                        \"index\": 9,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"light\",\n                        \"dt\": 13,\n                        \"uid\": 15,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"light_type_generator\",\n                \"x\": 105,\n                \"y\": 428,\n                \"uid\": 41,\n                \"state\": {\n                    \"type\": 0\n                }\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 307,\n                \"y\": 428,\n                \"uid\": 42,\n                \"state\": {\n                    \"val\": 1.6,\n                    \"min\": 0,\n                    \"max\": 10\n                },\n                \"title\": \"Intensity\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 106,\n                \"y\": 501,\n                \"uid\": 43,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -20,\n                    \"max\": 20\n                },\n                \"title\": \"Light position X\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 106,\n                \"y\": 567,\n                \"uid\": 44,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -20,\n                    \"max\": 20\n                },\n                \"title\": \"Light position Y\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 106,\n                \"y\": 635,\n                \"uid\": 45,\n                \"state\": {\n                    \"val\": 1.2,\n                    \"min\": -20,\n                    \"max\": 20\n                },\n                \"title\": \"Light position Z\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 304,\n                \"y\": 502,\n                \"uid\": 46,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Light direction X\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 304,\n                \"y\": 571,\n                \"uid\": 47,\n                \"state\": {\n                    \"val\": 0.04,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Light direction Y\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 304,\n                \"y\": 636,\n                \"uid\": 48,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Light direction z\"\n            },\n            {\n                \"plugin\": \"color_picker\",\n                \"x\": 108,\n                \"y\": 716,\n                \"uid\": 49,\n                \"state\": {\n                    \"hue\": 0,\n                    \"sat\": 0,\n                    \"lum\": 1\n                },\n                \"title\": \"Diffuse color\"\n            },\n            {\n                \"plugin\": \"color_picker\",\n                \"x\": 294,\n                \"y\": 717,\n                \"uid\": 50,\n                \"state\": {\n                    \"hue\": 0,\n                    \"sat\": 0,\n                    \"lum\": 1\n                },\n                \"title\": \"Specular color\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 30,\n                \"dst_nuid\": 29,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 31,\n                \"dst_nuid\": 29,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 32,\n                \"dst_nuid\": 29,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 33,\n                \"dst_nuid\": 29,\n                \"src_slot\": 0,\n                \"dst_slot\": 3,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 34,\n                \"dst_nuid\": 29,\n                \"src_slot\": 0,\n                \"dst_slot\": 4,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 35,\n                \"dst_nuid\": 29,\n                \"src_slot\": 0,\n                \"dst_slot\": 5,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 36,\n                \"dst_nuid\": 29,\n                \"src_slot\": 0,\n                \"dst_slot\": 6,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 39,\n                \"dst_nuid\": 29,\n                \"src_slot\": 0,\n                \"dst_slot\": 9,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 38,\n                \"dst_nuid\": 29,\n                \"src_slot\": 0,\n                \"dst_slot\": 8,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 37,\n                \"dst_nuid\": 29,\n                \"src_slot\": 0,\n                \"dst_slot\": 7,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 41,\n                \"dst_nuid\": 40,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 42,\n                \"dst_nuid\": 40,\n                \"src_slot\": 0,\n                \"dst_slot\": 4,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 43,\n                \"dst_nuid\": 40,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 44,\n                \"dst_nuid\": 40,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 45,\n                \"dst_nuid\": 40,\n                \"src_slot\": 0,\n                \"dst_slot\": 3,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 46,\n                \"dst_nuid\": 40,\n                \"src_slot\": 0,\n                \"dst_slot\": 7,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 47,\n                \"dst_nuid\": 40,\n                \"src_slot\": 0,\n                \"dst_slot\": 8,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 48,\n                \"dst_nuid\": 40,\n                \"src_slot\": 0,\n                \"dst_slot\": 9,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 49,\n                \"dst_nuid\": 40,\n                \"src_slot\": 0,\n                \"dst_slot\": 6,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 50,\n                \"dst_nuid\": 40,\n                \"src_slot\": 0,\n                \"dst_slot\": 5,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 40,\n                \"dst_nuid\": 29,\n                \"src_slot\": 0,\n                \"dst_slot\": 11,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/material_material_and_light_no_texture.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 4,\n    \"root\": {\n        \"node_uid\": 22,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 619,\n                \"y\": 279,\n                \"uid\": 0,\n                \"dsid\": 14,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"13\": 1,\n                        \"14\": 2,\n                        \"15\": 3,\n                        \"16\": 4,\n                        \"17\": 5,\n                        \"18\": 6,\n                        \"19\": 7,\n                        \"22\": 8,\n                        \"23\": 9,\n                        \"24\": 10,\n                        \"26\": 11,\n                        \"28\": 13\n                    },\n                    \"output_sids\": {\n                        \"27\": 12\n                    }\n                },\n                \"title\": \"Light chain\",\n                \"graph\": {\n                    \"node_uid\": 29,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"light_type_modulator\",\n                            \"x\": 692,\n                            \"y\": 216,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"light_position_modulator\",\n                            \"x\": 604,\n                            \"y\": 215,\n                            \"uid\": 2\n                        },\n                        {\n                            \"plugin\": \"light_diffuse_color_modulator\",\n                            \"x\": 200,\n                            \"y\": 217,\n                            \"uid\": 3\n                        },\n                        {\n                            \"plugin\": \"light_direction_modulator\",\n                            \"x\": 521,\n                            \"y\": 215,\n                            \"uid\": 4\n                        },\n                        {\n                            \"plugin\": \"light_intensity_modulator\",\n                            \"x\": 430,\n                            \"y\": 219,\n                            \"uid\": 5\n                        },\n                        {\n                            \"plugin\": \"light_specular_color_modulator\",\n                            \"x\": 309,\n                            \"y\": 219,\n                            \"uid\": 6\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 494,\n                            \"y\": 380,\n                            \"uid\": 7\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 609,\n                            \"y\": 401,\n                            \"uid\": 13,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light type\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 413,\n                            \"y\": 532,\n                            \"uid\": 14,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Pos x\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 412,\n                            \"y\": 581,\n                            \"uid\": 15,\n                            \"dsid\": 9,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Pos y\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 412,\n                            \"y\": 627,\n                            \"uid\": 16,\n                            \"dsid\": 10,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Pos z\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 350,\n                            \"y\": 358,\n                            \"uid\": 17,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"intensity\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 196,\n                            \"y\": 340,\n                            \"uid\": 18,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"specular color\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 3,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 80,\n                            \"y\": 347,\n                            \"uid\": 19,\n                            \"dsid\": 9,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"diffuse color\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 3,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"vector_normalize\",\n                            \"x\": 361,\n                            \"y\": 452,\n                            \"uid\": 20\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 248,\n                            \"y\": 461,\n                            \"uid\": 21\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 146,\n                            \"y\": 479,\n                            \"uid\": 22,\n                            \"dsid\": 9,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Dir x\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 145,\n                            \"y\": 528,\n                            \"uid\": 23,\n                            \"dsid\": 10,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Dir y\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 145,\n                            \"y\": 574,\n                            \"uid\": 24,\n                            \"dsid\": 11,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Dir z\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"material_light_modulator\",\n                            \"x\": 777,\n                            \"y\": 133,\n                            \"uid\": 25\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 681,\n                            \"y\": 135,\n                            \"uid\": 26,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"material\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 12,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 900,\n                            \"y\": 133,\n                            \"uid\": 27,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"material\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 12,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 569,\n                            \"y\": 134,\n                            \"uid\": 28,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light index\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 18,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 20,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 20,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 25,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        },\n                        {\n                            \"src_nuid\": 26,\n                            \"dst_nuid\": 25,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 28,\n                            \"dst_nuid\": 25,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"light type\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Pos x\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Pos y\",\n                        \"dt\": 0,\n                        \"uid\": 3,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Pos z\",\n                        \"dt\": 0,\n                        \"uid\": 4,\n                        \"index\": 3,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"intensity\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 4,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"specular color\",\n                        \"dt\": 3,\n                        \"uid\": 6,\n                        \"index\": 5,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"diffuse color\",\n                        \"dt\": 3,\n                        \"uid\": 7,\n                        \"index\": 6,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Dir x\",\n                        \"dt\": 0,\n                        \"uid\": 8,\n                        \"index\": 7,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Dir y\",\n                        \"dt\": 0,\n                        \"uid\": 9,\n                        \"index\": 8,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Dir z\",\n                        \"dt\": 0,\n                        \"uid\": 10,\n                        \"index\": 9,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"material\",\n                        \"dt\": 12,\n                        \"uid\": 11,\n                        \"index\": 10,\n                        \"type\": 0\n                    },\n                    {\n                        \"name\": \"light index\",\n                        \"dt\": 0,\n                        \"uid\": 13,\n                        \"index\": 11,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"material\",\n                        \"dt\": 12,\n                        \"uid\": 12,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"light_type_generator\",\n                \"x\": 175,\n                \"y\": 279,\n                \"uid\": 1,\n                \"state\": {\n                    \"type\": 0\n                }\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 417,\n                \"y\": 279,\n                \"uid\": 2,\n                \"state\": {\n                    \"val\": 1.6,\n                    \"min\": 0,\n                    \"max\": 10\n                },\n                \"title\": \"Intensity\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 216,\n                \"y\": 352,\n                \"uid\": 3,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Light position X\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 216,\n                \"y\": 418,\n                \"uid\": 4,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Light position Y\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 216,\n                \"y\": 486,\n                \"uid\": 5,\n                \"state\": {\n                    \"val\": 1.08,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Light position Z\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 414,\n                \"y\": 353,\n                \"uid\": 6,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Light direction X\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 414,\n                \"y\": 422,\n                \"uid\": 7,\n                \"state\": {\n                    \"val\": -1.04,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Light direction Y\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 414,\n                \"y\": 487,\n                \"uid\": 8,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Light direction z\"\n            },\n            {\n                \"plugin\": \"color_picker\",\n                \"x\": 218,\n                \"y\": 567,\n                \"uid\": 9,\n                \"state\": {\n                    \"hue\": 0,\n                    \"sat\": 0,\n                    \"lum\": 1\n                },\n                \"title\": \"Diffuse color\"\n            },\n            {\n                \"plugin\": \"color_picker\",\n                \"x\": 404,\n                \"y\": 568,\n                \"uid\": 10,\n                \"state\": {\n                    \"hue\": 0,\n                    \"sat\": 0,\n                    \"lum\": 1\n                },\n                \"title\": \"Specular color\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 312,\n                \"y\": 279,\n                \"uid\": 11,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Light index\"\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 766,\n                \"y\": 53,\n                \"uid\": 12,\n                \"dsid\": 18,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"21\": 4,\n                        \"22\": 5,\n                        \"23\": 6,\n                        \"24\": 7,\n                        \"25\": 8,\n                        \"34\": 10,\n                        \"39\": 12,\n                        \"40\": 13,\n                        \"41\": 14,\n                        \"44\": 16\n                    },\n                    \"output_sids\": {\n                        \"9\": 0\n                    }\n                },\n                \"title\": \"Material chain\",\n                \"graph\": {\n                    \"node_uid\": 47,\n                    \"uid\": 2,\n                    \"parent_uid\": 0,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"material_diffuse_color_modulator\",\n                            \"x\": 1029,\n                            \"y\": 68,\n                            \"uid\": 1\n                        },\n                        {\n                            \"plugin\": \"material_alpha_clip_modulator\",\n                            \"x\": 1137,\n                            \"y\": 68,\n                            \"uid\": 5\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 1025,\n                            \"y\": 145,\n                            \"uid\": 6,\n                            \"state\": {\n                                \"enabled\": false\n                            },\n                            \"title\": \"Alpha clip\"\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1250,\n                            \"y\": 71,\n                            \"uid\": 9,\n                            \"dsid\": 23,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"material\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 12,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"material_blend_mode_modulator\",\n                            \"x\": 898,\n                            \"y\": 69,\n                            \"uid\": 10\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 800,\n                            \"y\": 134,\n                            \"uid\": 21,\n                            \"dsid\": 17,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"hue\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 798,\n                            \"y\": 183,\n                            \"uid\": 22,\n                            \"dsid\": 17,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"saturation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 800,\n                            \"y\": 231,\n                            \"uid\": 23,\n                            \"dsid\": 17,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"luminosity\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 799,\n                            \"y\": 279,\n                            \"uid\": 24,\n                            \"dsid\": 17,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"alpha\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 800,\n                            \"y\": 70,\n                            \"uid\": 25,\n                            \"dsid\": 17,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"blend mode\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"convert_hsla_color_modulator\",\n                            \"x\": 907,\n                            \"y\": 147,\n                            \"uid\": 26\n                        },\n                        {\n                            \"plugin\": \"material_z_buffer_modulator\",\n                            \"x\": 672,\n                            \"y\": 65,\n                            \"uid\": 27\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 574,\n                            \"y\": 162,\n                            \"uid\": 28,\n                            \"state\": {\n                                \"enabled\": true\n                            },\n                            \"title\": \"Z-buffer\"\n                        },\n                        {\n                            \"plugin\": \"material_shinyness_modulator\",\n                            \"x\": 558,\n                            \"y\": 64,\n                            \"uid\": 31\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 470,\n                            \"y\": 149,\n                            \"uid\": 32,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"9\": 0\n                                },\n                                \"output_sids\": {\n                                    \"12\": 2\n                                }\n                            },\n                            \"title\": \"min max calc\",\n                            \"graph\": {\n                                \"node_uid\": 13,\n                                \"uid\": 3,\n                                \"parent_uid\": 2,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 27,\n                                        \"y\": 190,\n                                        \"uid\": 2,\n                                        \"state\": {\n                                            \"val\": 10\n                                        },\n                                        \"title\": \"Maximum\"\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 144,\n                                        \"y\": 65,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"absolute_modulator\",\n                                        \"x\": 232,\n                                        \"y\": 65,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 319,\n                                        \"y\": 45,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"add_modulator\",\n                                        \"x\": 401,\n                                        \"y\": 122,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"min_modulator\",\n                                        \"x\": 143,\n                                        \"y\": 142,\n                                        \"uid\": 8\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 248,\n                                        \"y\": 9,\n                                        \"uid\": 9,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"value\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 10,\n                                        \"y\": 85,\n                                        \"uid\": 11,\n                                        \"state\": {\n                                            \"val\": 0\n                                        },\n                                        \"title\": \"Minimum\"\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 486,\n                                        \"y\": 122,\n                                        \"uid\": 12,\n                                        \"dsid\": 15,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"value\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 426,\n                            \"y\": 241,\n                            \"uid\": 34,\n                            \"dsid\": 11,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"shinyness\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"material_double_sided_modulator\",\n                            \"x\": 437,\n                            \"y\": 61,\n                            \"uid\": 35\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 362,\n                            \"y\": 146,\n                            \"uid\": 36,\n                            \"state\": {\n                                \"enabled\": false\n                            },\n                            \"title\": \"Double-sided\"\n                        },\n                        {\n                            \"plugin\": \"material_ambient_color_modulator\",\n                            \"x\": 290,\n                            \"y\": 73,\n                            \"uid\": 37\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 63,\n                            \"y\": 153,\n                            \"uid\": 39,\n                            \"dsid\": 18,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"am hue\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 60,\n                            \"y\": 202,\n                            \"uid\": 40,\n                            \"dsid\": 18,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"am saturation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 63,\n                            \"y\": 250,\n                            \"uid\": 41,\n                            \"dsid\": 18,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"am luminosity\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"convert_hsla_color_modulator\",\n                            \"x\": 170,\n                            \"y\": 166,\n                            \"uid\": 43\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 58,\n                            \"y\": 70,\n                            \"uid\": 44,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"material\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 12,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 26,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 27,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 28,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 31,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 32,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 34,\n                            \"dst_nuid\": 32,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 35,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 36,\n                            \"dst_nuid\": 35,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 35,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 39,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 40,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 41,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 43,\n                            \"dst_nuid\": 37,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 44,\n                            \"dst_nuid\": 37,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"hue\",\n                        \"dt\": 0,\n                        \"uid\": 4,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"saturation\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"luminosity\",\n                        \"dt\": 0,\n                        \"uid\": 6,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"alpha\",\n                        \"dt\": 0,\n                        \"uid\": 7,\n                        \"index\": 3,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"blend mode\",\n                        \"dt\": 0,\n                        \"uid\": 8,\n                        \"index\": 4,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"shinyness\",\n                        \"dt\": 0,\n                        \"uid\": 10,\n                        \"index\": 5,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"am hue\",\n                        \"dt\": 0,\n                        \"uid\": 12,\n                        \"index\": 6,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"am saturation\",\n                        \"dt\": 0,\n                        \"uid\": 13,\n                        \"index\": 7,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"am luminosity\",\n                        \"dt\": 0,\n                        \"uid\": 14,\n                        \"index\": 8,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"material\",\n                        \"dt\": 12,\n                        \"uid\": 16,\n                        \"index\": 9,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"material\",\n                        \"dt\": 12,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 452,\n                \"y\": 53,\n                \"uid\": 13,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Hue\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 525,\n                \"y\": 53,\n                \"uid\": 14,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Saturation\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 604,\n                \"y\": 53,\n                \"uid\": 15,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Luminosity\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 685,\n                \"y\": 53,\n                \"uid\": 16,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Alpha\"\n            },\n            {\n                \"plugin\": \"blend_mode_generator\",\n                \"x\": 606,\n                \"y\": 119,\n                \"uid\": 17,\n                \"state\": {\n                    \"mode\": 4\n                }\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 525,\n                \"y\": 119,\n                \"uid\": 18,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Shinyness\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 484,\n                \"y\": 191,\n                \"uid\": 19,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Ambient Hue\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 576,\n                \"y\": 191,\n                \"uid\": 20,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Ambient Sat\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 664,\n                \"y\": 191,\n                \"uid\": 21,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Ambient Lum\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 1,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 2,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 4,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 3,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 3,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 6,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 7,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 7,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 8,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 8,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 9,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 9,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 6,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 10,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 5,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 11,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 11,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 13,\n                \"dst_nuid\": 12,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 14,\n                \"dst_nuid\": 12,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 15,\n                \"dst_nuid\": 12,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 16,\n                \"dst_nuid\": 12,\n                \"src_slot\": 0,\n                \"dst_slot\": 3,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 17,\n                \"dst_nuid\": 12,\n                \"src_slot\": 0,\n                \"dst_slot\": 4,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 18,\n                \"dst_nuid\": 12,\n                \"src_slot\": 0,\n                \"dst_slot\": 5,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 21,\n                \"dst_nuid\": 12,\n                \"src_slot\": 0,\n                \"dst_slot\": 8,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 20,\n                \"dst_nuid\": 12,\n                \"src_slot\": 0,\n                \"dst_slot\": 7,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 19,\n                \"dst_nuid\": 12,\n                \"src_slot\": 0,\n                \"dst_slot\": 6,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 0,\n                \"dst_nuid\": 12,\n                \"src_slot\": 0,\n                \"dst_slot\": 9,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/material_material_and_point_light_chain.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 10,\n    \"root\": {\n        \"node_uid\": 69,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 531,\n                \"y\": 460,\n                \"uid\": 51,\n                \"dsid\": 14,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {\n                        \"14\": 2,\n                        \"15\": 3,\n                        \"16\": 4,\n                        \"17\": 5,\n                        \"18\": 6,\n                        \"19\": 7\n                    },\n                    \"output_sids\": {\n                        \"27\": 12\n                    }\n                },\n                \"title\": \"Light chain\",\n                \"graph\": {\n                    \"node_uid\": 30,\n                    \"uid\": 7,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"light_type_modulator\",\n                            \"x\": 762,\n                            \"y\": 207,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"light_position_modulator\",\n                            \"x\": 604,\n                            \"y\": 215,\n                            \"uid\": 2\n                        },\n                        {\n                            \"plugin\": \"light_diffuse_color_modulator\",\n                            \"x\": 200,\n                            \"y\": 217,\n                            \"uid\": 3\n                        },\n                        {\n                            \"plugin\": \"light_intensity_modulator\",\n                            \"x\": 430,\n                            \"y\": 219,\n                            \"uid\": 5\n                        },\n                        {\n                            \"plugin\": \"light_specular_color_modulator\",\n                            \"x\": 309,\n                            \"y\": 219,\n                            \"uid\": 6\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 494,\n                            \"y\": 380,\n                            \"uid\": 7\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 361,\n                            \"y\": 467,\n                            \"uid\": 14,\n                            \"dsid\": 10,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Pos x\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 383,\n                            \"y\": 549,\n                            \"uid\": 15,\n                            \"dsid\": 11,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Pos y\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 412,\n                            \"y\": 627,\n                            \"uid\": 16,\n                            \"dsid\": 12,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Pos z\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 350,\n                            \"y\": 358,\n                            \"uid\": 17,\n                            \"dsid\": 10,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"intensity\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 196,\n                            \"y\": 340,\n                            \"uid\": 18,\n                            \"dsid\": 10,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"specular color\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 3,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 93,\n                            \"y\": 237,\n                            \"uid\": 19,\n                            \"dsid\": 11,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"diffuse color\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 3,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 900,\n                            \"y\": 133,\n                            \"uid\": 27,\n                            \"dsid\": 9,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 13,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"light_type_generator\",\n                            \"x\": 618,\n                            \"y\": 302,\n                            \"uid\": 29,\n                            \"state\": {\n                                \"type\": 0\n                            }\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 18,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 29,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Pos x\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Pos y\",\n                        \"dt\": 0,\n                        \"uid\": 3,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Pos z\",\n                        \"dt\": 0,\n                        \"uid\": 4,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"intensity\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 3,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"specular color\",\n                        \"dt\": 3,\n                        \"uid\": 6,\n                        \"index\": 4,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"diffuse color\",\n                        \"dt\": 3,\n                        \"uid\": 7,\n                        \"index\": 5,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"light\",\n                        \"dt\": 13,\n                        \"uid\": 12,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 146,\n                \"y\": 460,\n                \"uid\": 52,\n                \"state\": {\n                    \"val\": 1.5,\n                    \"min\": 0,\n                    \"max\": 10\n                },\n                \"title\": \"Intensity\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 147,\n                \"y\": 535,\n                \"uid\": 53,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -20,\n                    \"max\": 20\n                },\n                \"title\": \"Light position X\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 146,\n                \"y\": 608,\n                \"uid\": 54,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -20,\n                    \"max\": 20\n                },\n                \"title\": \"Light position Y\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 146,\n                \"y\": 678,\n                \"uid\": 55,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -20,\n                    \"max\": 20\n                },\n                \"title\": \"Light position Z\"\n            },\n            {\n                \"plugin\": \"color_picker\",\n                \"x\": 344,\n                \"y\": 460,\n                \"uid\": 56,\n                \"state\": {\n                    \"hue\": 0,\n                    \"sat\": 0,\n                    \"lum\": 1\n                },\n                \"title\": \"Diffuse color\"\n            },\n            {\n                \"plugin\": \"color_picker\",\n                \"x\": 345,\n                \"y\": 595,\n                \"uid\": 57,\n                \"state\": {\n                    \"hue\": 0,\n                    \"sat\": 0,\n                    \"lum\": 1\n                },\n                \"title\": \"Specular color\"\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 693,\n                \"y\": 231,\n                \"uid\": 58,\n                \"dsid\": 20,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {\n                        \"15\": 3,\n                        \"21\": 4,\n                        \"22\": 5,\n                        \"23\": 6,\n                        \"24\": 7,\n                        \"25\": 8,\n                        \"34\": 10,\n                        \"39\": 12,\n                        \"40\": 13,\n                        \"41\": 14,\n                        \"44\": 16,\n                        \"47\": 18,\n                        \"49\": 19\n                    },\n                    \"output_sids\": {\n                        \"9\": 0\n                    }\n                },\n                \"title\": \"Material chain\",\n                \"graph\": {\n                    \"node_uid\": 50,\n                    \"uid\": 8,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"material_diffuse_color_modulator\",\n                            \"x\": 1029,\n                            \"y\": 68,\n                            \"uid\": 1\n                        },\n                        {\n                            \"plugin\": \"material_alpha_clip_modulator\",\n                            \"x\": 1137,\n                            \"y\": 68,\n                            \"uid\": 5\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 1025,\n                            \"y\": 145,\n                            \"uid\": 6,\n                            \"state\": {\n                                \"enabled\": false\n                            },\n                            \"title\": \"Alpha clip\"\n                        },\n                        {\n                            \"plugin\": \"material_texture_modulator\",\n                            \"x\": 1252,\n                            \"y\": 68,\n                            \"uid\": 7\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1361,\n                            \"y\": 68,\n                            \"uid\": 9,\n                            \"dsid\": 27,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"material\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 12,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"material_blend_mode_modulator\",\n                            \"x\": 898,\n                            \"y\": 69,\n                            \"uid\": 10\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 1173,\n                            \"y\": 143,\n                            \"uid\": 15,\n                            \"dsid\": 27,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Image\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 2,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 800,\n                            \"y\": 134,\n                            \"uid\": 21,\n                            \"dsid\": 21,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"hue\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 798,\n                            \"y\": 183,\n                            \"uid\": 22,\n                            \"dsid\": 21,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"saturation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 800,\n                            \"y\": 231,\n                            \"uid\": 23,\n                            \"dsid\": 21,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"luminosity\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 799,\n                            \"y\": 279,\n                            \"uid\": 24,\n                            \"dsid\": 21,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"alpha\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 800,\n                            \"y\": 70,\n                            \"uid\": 25,\n                            \"dsid\": 21,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"blend mode\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"convert_hsla_color_modulator\",\n                            \"x\": 907,\n                            \"y\": 147,\n                            \"uid\": 26\n                        },\n                        {\n                            \"plugin\": \"material_z_buffer_modulator\",\n                            \"x\": 672,\n                            \"y\": 65,\n                            \"uid\": 27\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 564,\n                            \"y\": 212,\n                            \"uid\": 28,\n                            \"state\": {\n                                \"enabled\": true\n                            },\n                            \"title\": \"Z-buffer\"\n                        },\n                        {\n                            \"plugin\": \"material_shinyness_modulator\",\n                            \"x\": 558,\n                            \"y\": 64,\n                            \"uid\": 31\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 454,\n                            \"y\": 148,\n                            \"uid\": 32,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"9\": 0\n                                },\n                                \"output_sids\": {\n                                    \"12\": 2\n                                }\n                            },\n                            \"title\": \"min max calc\",\n                            \"graph\": {\n                                \"node_uid\": 13,\n                                \"uid\": 9,\n                                \"parent_uid\": 8,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 27,\n                                        \"y\": 190,\n                                        \"uid\": 2,\n                                        \"state\": {\n                                            \"val\": 10\n                                        },\n                                        \"title\": \"Maximum\"\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 144,\n                                        \"y\": 65,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"absolute_modulator\",\n                                        \"x\": 232,\n                                        \"y\": 65,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 319,\n                                        \"y\": 45,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"add_modulator\",\n                                        \"x\": 401,\n                                        \"y\": 122,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"min_modulator\",\n                                        \"x\": 143,\n                                        \"y\": 142,\n                                        \"uid\": 8\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 248,\n                                        \"y\": 9,\n                                        \"uid\": 9,\n                                        \"dsid\": 19,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"value\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 10,\n                                        \"y\": 85,\n                                        \"uid\": 11,\n                                        \"state\": {\n                                            \"val\": 0\n                                        },\n                                        \"title\": \"Minimum\"\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 486,\n                                        \"y\": 122,\n                                        \"uid\": 12,\n                                        \"dsid\": 19,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"value\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 361,\n                            \"y\": 242,\n                            \"uid\": 34,\n                            \"dsid\": 15,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"shinyness\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"material_double_sided_modulator\",\n                            \"x\": 437,\n                            \"y\": 61,\n                            \"uid\": 35\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 323,\n                            \"y\": 161,\n                            \"uid\": 36,\n                            \"state\": {\n                                \"enabled\": false\n                            },\n                            \"title\": \"Double-sided\"\n                        },\n                        {\n                            \"plugin\": \"material_ambient_color_modulator\",\n                            \"x\": 290,\n                            \"y\": 73,\n                            \"uid\": 37\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 63,\n                            \"y\": 153,\n                            \"uid\": 39,\n                            \"dsid\": 22,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"am hue\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 60,\n                            \"y\": 202,\n                            \"uid\": 40,\n                            \"dsid\": 22,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"am saturation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 63,\n                            \"y\": 250,\n                            \"uid\": 41,\n                            \"dsid\": 22,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"am luminosity\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"convert_hsla_color_modulator\",\n                            \"x\": 170,\n                            \"y\": 166,\n                            \"uid\": 43\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 61,\n                            \"y\": 99,\n                            \"uid\": 44,\n                            \"dsid\": 11,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"material\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 12,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 40,\n                            \"y\": 52,\n                            \"uid\": 47,\n                            \"dsid\": 6,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 13,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"material_light_modulator\",\n                            \"x\": 158,\n                            \"y\": 22,\n                            \"uid\": 48\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 54,\n                            \"y\": 0,\n                            \"uid\": 49,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light index\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 26,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 27,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 28,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 31,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 32,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 34,\n                            \"dst_nuid\": 32,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 35,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 36,\n                            \"dst_nuid\": 35,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 35,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 39,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 40,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 41,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 43,\n                            \"dst_nuid\": 37,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 47,\n                            \"dst_nuid\": 48,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 44,\n                            \"dst_nuid\": 48,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 48,\n                            \"dst_nuid\": 37,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 49,\n                            \"dst_nuid\": 48,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Image\",\n                        \"dt\": 2,\n                        \"uid\": 3,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"hue\",\n                        \"dt\": 0,\n                        \"uid\": 4,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"saturation\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"luminosity\",\n                        \"dt\": 0,\n                        \"uid\": 6,\n                        \"index\": 3,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"alpha\",\n                        \"dt\": 0,\n                        \"uid\": 7,\n                        \"index\": 4,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"blend mode\",\n                        \"dt\": 0,\n                        \"uid\": 8,\n                        \"index\": 5,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"shinyness\",\n                        \"dt\": 0,\n                        \"uid\": 10,\n                        \"index\": 6,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"am hue\",\n                        \"dt\": 0,\n                        \"uid\": 12,\n                        \"index\": 7,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"am saturation\",\n                        \"dt\": 0,\n                        \"uid\": 13,\n                        \"index\": 8,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"am luminosity\",\n                        \"dt\": 0,\n                        \"uid\": 14,\n                        \"index\": 9,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"material\",\n                        \"dt\": 12,\n                        \"uid\": 16,\n                        \"index\": 10,\n                        \"type\": 0,\n                        \"is_connected\": false\n                    },\n                    {\n                        \"name\": \"light\",\n                        \"dt\": 13,\n                        \"uid\": 18,\n                        \"index\": 11,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"light index\",\n                        \"dt\": 0,\n                        \"uid\": 19,\n                        \"index\": 12,\n                        \"type\": 0\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"material\",\n                        \"dt\": 12,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"url_texture_generator\",\n                \"x\": 276,\n                \"y\": 231,\n                \"uid\": 59,\n                \"state\": {\n                    \"url\": \"/data/image/57422df4c11a76d5531ef36299d5d1ac5b6b6739.jpg\"\n                },\n                \"title\": \"Image\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 379,\n                \"y\": 231,\n                \"uid\": 60,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Hue\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 452,\n                \"y\": 231,\n                \"uid\": 61,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Saturation\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 531,\n                \"y\": 231,\n                \"uid\": 62,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Luminosity\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 612,\n                \"y\": 231,\n                \"uid\": 63,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Alpha\"\n            },\n            {\n                \"plugin\": \"blend_mode_generator\",\n                \"x\": 533,\n                \"y\": 297,\n                \"uid\": 64,\n                \"state\": {\n                    \"mode\": 4\n                }\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 452,\n                \"y\": 297,\n                \"uid\": 65,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Shinyness\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 411,\n                \"y\": 369,\n                \"uid\": 66,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Ambient Hue\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 503,\n                \"y\": 369,\n                \"uid\": 67,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Ambient Sat\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 591,\n                \"y\": 369,\n                \"uid\": 68,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Ambient Lum\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 52,\n                \"dst_nuid\": 51,\n                \"src_slot\": 0,\n                \"dst_slot\": 3,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 53,\n                \"dst_nuid\": 51,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 54,\n                \"dst_nuid\": 51,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 55,\n                \"dst_nuid\": 51,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 56,\n                \"dst_nuid\": 51,\n                \"src_slot\": 0,\n                \"dst_slot\": 5,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 57,\n                \"dst_nuid\": 51,\n                \"src_slot\": 0,\n                \"dst_slot\": 4,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 59,\n                \"dst_nuid\": 58,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 60,\n                \"dst_nuid\": 58,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 61,\n                \"dst_nuid\": 58,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 62,\n                \"dst_nuid\": 58,\n                \"src_slot\": 0,\n                \"dst_slot\": 3,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 63,\n                \"dst_nuid\": 58,\n                \"src_slot\": 0,\n                \"dst_slot\": 4,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 64,\n                \"dst_nuid\": 58,\n                \"src_slot\": 0,\n                \"dst_slot\": 5,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 65,\n                \"dst_nuid\": 58,\n                \"src_slot\": 0,\n                \"dst_slot\": 6,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 68,\n                \"dst_nuid\": 58,\n                \"src_slot\": 0,\n                \"dst_slot\": 9,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 67,\n                \"dst_nuid\": 58,\n                \"src_slot\": 0,\n                \"dst_slot\": 8,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 66,\n                \"dst_nuid\": 58,\n                \"src_slot\": 0,\n                \"dst_slot\": 7,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 51,\n                \"dst_nuid\": 58,\n                \"src_slot\": 0,\n                \"dst_slot\": 11,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/material_point_light_chain.json",
    "content": "{\n    \"abs_t\": 508.502,\n    \"active_graph\": 0,\n    \"graph_uid\": 16,\n    \"root\": {\n        \"node_uid\": 46,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 425,\n                \"y\": 38,\n                \"uid\": 10,\n                \"dsid\": 14,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"14\": 2,\n                        \"15\": 3,\n                        \"16\": 4,\n                        \"17\": 5,\n                        \"18\": 6,\n                        \"19\": 7\n                    },\n                    \"output_sids\": {\n                        \"27\": 12\n                    }\n                },\n                \"title\": \"Light chain\",\n                \"graph\": {\n                    \"node_uid\": 30,\n                    \"uid\": 8,\n                    \"parent_uid\": 0,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"light_type_modulator\",\n                            \"x\": 762,\n                            \"y\": 207,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"light_position_modulator\",\n                            \"x\": 604,\n                            \"y\": 215,\n                            \"uid\": 2\n                        },\n                        {\n                            \"plugin\": \"light_diffuse_color_modulator\",\n                            \"x\": 200,\n                            \"y\": 217,\n                            \"uid\": 3\n                        },\n                        {\n                            \"plugin\": \"light_intensity_modulator\",\n                            \"x\": 430,\n                            \"y\": 219,\n                            \"uid\": 5\n                        },\n                        {\n                            \"plugin\": \"light_specular_color_modulator\",\n                            \"x\": 309,\n                            \"y\": 219,\n                            \"uid\": 6\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 494,\n                            \"y\": 380,\n                            \"uid\": 7\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 361,\n                            \"y\": 467,\n                            \"uid\": 14,\n                            \"dsid\": 9,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Pos x\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 383,\n                            \"y\": 549,\n                            \"uid\": 15,\n                            \"dsid\": 10,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Pos y\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 412,\n                            \"y\": 627,\n                            \"uid\": 16,\n                            \"dsid\": 11,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Pos z\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 350,\n                            \"y\": 358,\n                            \"uid\": 17,\n                            \"dsid\": 9,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"intensity\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 196,\n                            \"y\": 340,\n                            \"uid\": 18,\n                            \"dsid\": 9,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"specular color\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 3,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 93,\n                            \"y\": 237,\n                            \"uid\": 19,\n                            \"dsid\": 10,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"diffuse color\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 3,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 900,\n                            \"y\": 133,\n                            \"uid\": 27,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 13,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"light_type_generator\",\n                            \"x\": 618,\n                            \"y\": 302,\n                            \"uid\": 29,\n                            \"state\": {\n                                \"type\": 0\n                            }\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 18,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 29,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Pos x\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Pos y\",\n                        \"dt\": 0,\n                        \"uid\": 3,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Pos z\",\n                        \"dt\": 0,\n                        \"uid\": 4,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"intensity\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 3,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"specular color\",\n                        \"dt\": 3,\n                        \"uid\": 6,\n                        \"index\": 4,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"diffuse color\",\n                        \"dt\": 3,\n                        \"uid\": 7,\n                        \"index\": 5,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"light\",\n                        \"dt\": 13,\n                        \"uid\": 12,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 40,\n                \"y\": 38,\n                \"uid\": 11,\n                \"state\": {\n                    \"val\": 1.5,\n                    \"min\": 0,\n                    \"max\": 10\n                },\n                \"title\": \"Intensity\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 41,\n                \"y\": 113,\n                \"uid\": 12,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -20,\n                    \"max\": 20\n                },\n                \"title\": \"Light position X\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 40,\n                \"y\": 186,\n                \"uid\": 13,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -20,\n                    \"max\": 20\n                },\n                \"title\": \"Light position Y\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 40,\n                \"y\": 256,\n                \"uid\": 14,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -20,\n                    \"max\": 20\n                },\n                \"title\": \"Light position Z\"\n            },\n            {\n                \"plugin\": \"color_picker\",\n                \"x\": 238,\n                \"y\": 38,\n                \"uid\": 15,\n                \"state\": {\n                    \"hue\": 0,\n                    \"sat\": 0,\n                    \"lum\": 1\n                },\n                \"title\": \"Diffuse color\"\n            },\n            {\n                \"plugin\": \"color_picker\",\n                \"x\": 239,\n                \"y\": 173,\n                \"uid\": 16,\n                \"state\": {\n                    \"hue\": 0,\n                    \"sat\": 0,\n                    \"lum\": 1\n                },\n                \"title\": \"Specular color\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 11,\n                \"dst_nuid\": 10,\n                \"src_slot\": 0,\n                \"dst_slot\": 3,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 12,\n                \"dst_nuid\": 10,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 13,\n                \"dst_nuid\": 10,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 14,\n                \"dst_nuid\": 10,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 15,\n                \"dst_nuid\": 10,\n                \"src_slot\": 0,\n                \"dst_slot\": 5,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 16,\n                \"dst_nuid\": 10,\n                \"src_slot\": 0,\n                \"dst_slot\": 4,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/material_texture.json",
    "content": "{\n    \"abs_t\": 190.925,\n    \"active_graph\": 0,\n    \"graph_uid\": 10,\n    \"root\": {\n        \"node_uid\": 21,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 333,\n                \"y\": 239,\n                \"uid\": 19,\n                \"dsid\": 2,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"rt_filter\": 9729,\n                    \"input_sids\": {\n                        \"0\": 0\n                    },\n                    \"output_sids\": {\n                        \"1\": 1\n                    }\n                },\n                \"title\": \"Texture\",\n                \"graph\": {\n                    \"node_uid\": 4,\n                    \"uid\": 9,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 189,\n                            \"y\": 225,\n                            \"uid\": 0,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"texture\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 2,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 520,\n                            \"y\": 153,\n                            \"uid\": 1,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"material\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 12,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"def\": null,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"material_texture_modulator\",\n                            \"x\": 307,\n                            \"y\": 130,\n                            \"uid\": 3\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"texture\",\n                        \"dt\": 2,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"material\",\n                        \"dt\": 12,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"url_texture_generator\",\n                \"x\": 199,\n                \"y\": 283,\n                \"uid\": 20,\n                \"state\": {\n                    \"url\": \"/data/image/57422df4c11a76d5531ef36299d5d1ac5b6b6739.jpg\"\n                },\n                \"title\": \"Image\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 20,\n                \"dst_nuid\": 19,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/matrix_circular_motion.json",
    "content": "{\n    \"abs_t\": 6069.914,\n    \"active_graph\": 0,\n    \"graph_uid\": 8,\n    \"root\": {\n        \"node_uid\": 77,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 258,\n                \"y\": 330,\n                \"uid\": 71,\n                \"dsid\": 3,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"11\": 1,\n                        \"19\": 2\n                    },\n                    \"output_sids\": {\n                        \"10\": 0\n                    }\n                },\n                \"title\": \"Circular motion\",\n                \"graph\": {\n                    \"node_uid\": 20,\n                    \"uid\": 4,\n                    \"parent_uid\": 0,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 338,\n                            \"y\": 416,\n                            \"uid\": 1,\n                            \"state\": {\n                                \"val\": 0.25\n                            }\n                        },\n                        {\n                            \"plugin\": \"sine_modulator\",\n                            \"x\": 476,\n                            \"y\": 146,\n                            \"uid\": 2\n                        },\n                        {\n                            \"plugin\": \"translation_matrix\",\n                            \"x\": 759,\n                            \"y\": 218,\n                            \"uid\": 4\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 655,\n                            \"y\": 184,\n                            \"uid\": 5\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 292,\n                            \"y\": 177,\n                            \"uid\": 6\n                        },\n                        {\n                            \"plugin\": \"delta_t_generator\",\n                            \"x\": 212,\n                            \"y\": 177,\n                            \"uid\": 8\n                        },\n                        {\n                            \"plugin\": \"accumulate_modulator\",\n                            \"x\": 372,\n                            \"y\": 177,\n                            \"uid\": 9,\n                            \"state\": {\n                                \"value\": -1164.778880000027\n                            }\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 849,\n                            \"y\": 217,\n                            \"uid\": 10,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 4,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 141,\n                            \"y\": 270,\n                            \"uid\": 11,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"speed\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"cosine_modulator\",\n                            \"x\": 486,\n                            \"y\": 230,\n                            \"uid\": 12\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 567,\n                            \"y\": 143,\n                            \"uid\": 16\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 558,\n                            \"y\": 225,\n                            \"uid\": 17\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 570,\n                            \"y\": 391,\n                            \"uid\": 19,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"radius\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 8,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 12,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 17,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": false\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 17,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"offset\": 1\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"speed\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"radius\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 61,\n                \"y\": 334,\n                \"uid\": 72,\n                \"state\": {\n                    \"val\": 0.44,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Speed\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 61,\n                \"y\": 419,\n                \"uid\": 76,\n                \"state\": {\n                    \"val\": 1.1,\n                    \"min\": 0,\n                    \"max\": 10\n                },\n                \"title\": \"radius\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 72,\n                \"dst_nuid\": 71,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 76,\n                \"dst_nuid\": 71,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/matrix_rotate_animated.json",
    "content": "{\n    \"abs_t\": 276.913,\n    \"active_graph\": 0,\n    \"graph_uid\": 25,\n    \"root\": {\n        \"node_uid\": 15,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 415,\n                \"y\": 114,\n                \"uid\": 10,\n                \"dsid\": 4,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"8\": 1,\n                        \"9\": 2,\n                        \"10\": 3\n                    },\n                    \"output_sids\": {\n                        \"1\": 0\n                    }\n                },\n                \"title\": \"Rotate\",\n                \"graph\": {\n                    \"node_uid\": 11,\n                    \"uid\": 20,\n                    \"parent_uid\": 0,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"rotation_xyz_matrix\",\n                            \"x\": 177,\n                            \"y\": 96,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 295,\n                            \"y\": 96,\n                            \"uid\": 1,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 70,\n                            \"y\": 9,\n                            \"uid\": 2,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"9\": 0\n                                },\n                                \"output_sids\": {\n                                    \"12\": 2\n                                }\n                            },\n                            \"title\": \"knob\",\n                            \"graph\": {\n                                \"node_uid\": 13,\n                                \"uid\": 21,\n                                \"parent_uid\": 20,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 29,\n                                        \"y\": 147,\n                                        \"uid\": 2,\n                                        \"state\": {\n                                            \"val\": 180\n                                        },\n                                        \"title\": \"Maximum\"\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 149,\n                                        \"y\": 48,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"absolute_modulator\",\n                                        \"x\": 237,\n                                        \"y\": 48,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 389,\n                                        \"y\": 28,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"add_modulator\",\n                                        \"x\": 470,\n                                        \"y\": 86,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"min_modulator\",\n                                        \"x\": 237,\n                                        \"y\": 106,\n                                        \"uid\": 8\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 317,\n                                        \"y\": 11,\n                                        \"uid\": 9,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"value\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 13,\n                                        \"y\": 69,\n                                        \"uid\": 11,\n                                        \"state\": {\n                                            \"val\": -180\n                                        },\n                                        \"title\": \"Minimum\"\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 552,\n                                        \"y\": 86,\n                                        \"uid\": 12,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"value\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 69,\n                            \"y\": 96,\n                            \"uid\": 4,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"9\": 0\n                                },\n                                \"output_sids\": {\n                                    \"12\": 2\n                                }\n                            },\n                            \"title\": \"knob values\",\n                            \"graph\": {\n                                \"node_uid\": 13,\n                                \"uid\": 22,\n                                \"parent_uid\": 20,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 39,\n                                        \"y\": 168,\n                                        \"uid\": 2,\n                                        \"state\": {\n                                            \"val\": 180\n                                        },\n                                        \"title\": \"Maximum\"\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 154,\n                                        \"y\": 67,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"absolute_modulator\",\n                                        \"x\": 246,\n                                        \"y\": 67,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 370,\n                                        \"y\": 48,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"add_modulator\",\n                                        \"x\": 454,\n                                        \"y\": 107,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"min_modulator\",\n                                        \"x\": 245,\n                                        \"y\": 127,\n                                        \"uid\": 8\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 297,\n                                        \"y\": 11,\n                                        \"uid\": 9,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"value\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 14,\n                                        \"y\": 88,\n                                        \"uid\": 11,\n                                        \"state\": {\n                                            \"val\": -180\n                                        },\n                                        \"title\": \"Minimum\"\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 542,\n                                        \"y\": 107,\n                                        \"uid\": 12,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"value\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 68,\n                            \"y\": 182,\n                            \"uid\": 6,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"9\": 0\n                                },\n                                \"output_sids\": {\n                                    \"12\": 2\n                                }\n                            },\n                            \"title\": \"knob\",\n                            \"graph\": {\n                                \"node_uid\": 13,\n                                \"uid\": 23,\n                                \"parent_uid\": 20,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 56,\n                                        \"y\": 217,\n                                        \"uid\": 2,\n                                        \"state\": {\n                                            \"val\": 180\n                                        },\n                                        \"title\": \"Maximum\"\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 174,\n                                        \"y\": 95,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"absolute_modulator\",\n                                        \"x\": 264,\n                                        \"y\": 95,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 360,\n                                        \"y\": 75,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"add_modulator\",\n                                        \"x\": 444,\n                                        \"y\": 135,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"min_modulator\",\n                                        \"x\": 263,\n                                        \"y\": 155,\n                                        \"uid\": 8\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 283,\n                                        \"y\": 23,\n                                        \"uid\": 9,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"value\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 19,\n                                        \"y\": 115,\n                                        \"uid\": 11,\n                                        \"state\": {\n                                            \"val\": -180\n                                        },\n                                        \"title\": \"Minimum\"\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 533,\n                                        \"y\": 135,\n                                        \"uid\": 12,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"value\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 8,\n                            \"y\": 9,\n                            \"uid\": 8,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"X\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 9,\n                            \"y\": 96,\n                            \"uid\": 9,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Y\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 8,\n                            \"y\": 181,\n                            \"uid\": 10,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Z\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 8,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"X\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Y\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Z\",\n                        \"dt\": 0,\n                        \"uid\": 3,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 316,\n                \"y\": 83,\n                \"uid\": 11,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"X\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 316,\n                \"y\": 148,\n                \"uid\": 12,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Z\"\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 318,\n                \"y\": 219,\n                \"uid\": 13,\n                \"dsid\": 2,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"7\": 1\n                    },\n                    \"output_sids\": {\n                        \"6\": 0\n                    }\n                },\n                \"title\": \"Time\",\n                \"graph\": {\n                    \"node_uid\": 8,\n                    \"uid\": 24,\n                    \"parent_uid\": 0,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"delta_t_generator\",\n                            \"x\": 7,\n                            \"y\": 7,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"accumulate_modulator\",\n                            \"x\": 181,\n                            \"y\": 7,\n                            \"uid\": 1,\n                            \"state\": {\n                                \"value\": 0.622960000000001\n                            }\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 101,\n                            \"y\": 7,\n                            \"uid\": 2\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 283,\n                            \"y\": 7,\n                            \"uid\": 6,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"time\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 23,\n                            \"y\": 66,\n                            \"uid\": 7,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Speed\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Speed\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"time\",\n                        \"dt\": 0,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 120,\n                \"y\": 239,\n                \"uid\": 14,\n                \"state\": {\n                    \"val\": 0.13,\n                    \"min\": -1,\n                    \"max\": 1\n                },\n                \"title\": \"Speed\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 11,\n                \"dst_nuid\": 10,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 13,\n                \"dst_nuid\": 10,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 12,\n                \"dst_nuid\": 10,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 14,\n                \"dst_nuid\": 13,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/matrix_rotate_with_knobs.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 5,\n    \"root\": {\n        \"node_uid\": 4,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 103,\n                \"y\": 113,\n                \"uid\": 0,\n                \"dsid\": 4,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"8\": 1,\n                        \"9\": 2,\n                        \"10\": 3\n                    },\n                    \"output_sids\": {\n                        \"1\": 0\n                    }\n                },\n                \"title\": \"Rotate\",\n                \"graph\": {\n                    \"node_uid\": 21,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"rotation_xyz_matrix\",\n                            \"x\": 367,\n                            \"y\": 174,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 485,\n                            \"y\": 174,\n                            \"uid\": 1,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 45,\n                            \"y\": 80,\n                            \"uid\": 8,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"X\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 45,\n                            \"y\": 170,\n                            \"uid\": 9,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Y\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 46,\n                            \"y\": 257,\n                            \"uid\": 10,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Z\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 40,\n                            \"y\": 386,\n                            \"uid\": 11,\n                            \"state\": {\n                                \"val\": 180\n                            }\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 15,\n                            \"y\": 317,\n                            \"uid\": 12,\n                            \"state\": {\n                                \"val\": 360\n                            }\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 165,\n                            \"y\": 80,\n                            \"uid\": 15\n                        },\n                        {\n                            \"plugin\": \"subtract_modulator\",\n                            \"x\": 260,\n                            \"y\": 105,\n                            \"uid\": 16\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 165,\n                            \"y\": 170,\n                            \"uid\": 17\n                        },\n                        {\n                            \"plugin\": \"subtract_modulator\",\n                            \"x\": 260,\n                            \"y\": 195,\n                            \"uid\": 18\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 163,\n                            \"y\": 257,\n                            \"uid\": 19\n                        },\n                        {\n                            \"plugin\": \"subtract_modulator\",\n                            \"x\": 258,\n                            \"y\": 282,\n                            \"uid\": 20\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 18,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 20,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 8,\n                            \"dst_nuid\": 15,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"dst_connected\": false,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 17,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"dst_connected\": false,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"dst_connected\": false,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 15,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_connected\": false\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 17,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_connected\": false,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_connected\": false,\n                            \"offset\": 2\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_connected\": false\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 18,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_connected\": false,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 20,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_connected\": false,\n                            \"offset\": 2\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 18,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 20,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"X\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Y\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Z\",\n                        \"dt\": 0,\n                        \"uid\": 3,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 10,\n                \"y\": 80,\n                \"uid\": 1,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"X\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 10,\n                \"y\": 153,\n                \"uid\": 2,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Y\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 10,\n                \"y\": 227,\n                \"uid\": 3,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Z\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 1,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 2,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 3,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}\n"
  },
  {
    "path": "browser/patches/matrix_scale.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 1,\n    \"graph_uid\": 2,\n    \"root\": {\n        \"node_uid\": 2,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 581,\n                \"y\": 310,\n                \"uid\": 0,\n                \"dsid\": 8,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"13\": 5,\n                        \"14\": 6,\n                        \"15\": 7\n                    },\n                    \"output_sids\": {\n                        \"2\": 1\n                    }\n                },\n                \"title\": \"Scale\",\n                \"graph\": {\n                    \"node_uid\": 16,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"scale_matrix\",\n                            \"x\": 189,\n                            \"y\": 49,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 278,\n                            \"y\": 49,\n                            \"uid\": 2,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 73,\n                            \"y\": 49,\n                            \"uid\": 3\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 7,\n                            \"y\": 9,\n                            \"uid\": 13,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"x\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 7,\n                            \"y\": 69,\n                            \"uid\": 14,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"y\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 7,\n                            \"y\": 132,\n                            \"uid\": 15,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"z\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"x\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"y\",\n                        \"dt\": 0,\n                        \"uid\": 6,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"z\",\n                        \"dt\": 0,\n                        \"uid\": 7,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 359,\n                \"y\": 311,\n                \"uid\": 1,\n                \"state\": {\n                    \"val\": 1,\n                    \"min\": 0,\n                    \"max\": 2\n                },\n                \"title\": \"size\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 1,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 1,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true,\n                \"offset\": 1\n            },\n            {\n                \"src_nuid\": 1,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true,\n                \"offset\": 2\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/matrix_shaky_translate_to_xy.json",
    "content": "{\n    \"abs_t\": 65.055,\n    \"active_graph\": 0,\n    \"graph_uid\": 16,\n    \"root\": {\n        \"node_uid\": 28,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 471,\n                \"y\": 568,\n                \"uid\": 27,\n                \"dsid\": 1,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {},\n                    \"output_sids\": {\n                        \"24\": 0\n                    }\n                },\n                \"title\": \"Shaky translate\",\n                \"graph\": {\n                    \"node_uid\": 25,\n                    \"uid\": 10,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"random_float_generator\",\n                            \"x\": 585,\n                            \"y\": 590,\n                            \"uid\": 0,\n                            \"open\": false\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 500,\n                            \"y\": 595,\n                            \"uid\": 1,\n                            \"open\": false,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"13\": 1,\n                                    \"14\": 2,\n                                    \"15\": 3\n                                },\n                                \"output_sids\": {\n                                    \"12\": 0\n                                }\n                            },\n                            \"title\": \"Oscillate\",\n                            \"graph\": {\n                                \"node_uid\": 25,\n                                \"uid\": 11,\n                                \"parent_uid\": 10,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"sine_modulator\",\n                                        \"x\": 291,\n                                        \"y\": 9,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 405,\n                                        \"y\": 124,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"convert_oscilator_unit_modulator\",\n                                        \"x\": 370,\n                                        \"y\": 9,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 494,\n                                        \"y\": 9,\n                                        \"uid\": 6\n                                    },\n                                    {\n                                        \"plugin\": \"add_modulator\",\n                                        \"x\": 577,\n                                        \"y\": 64,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 660,\n                                        \"y\": 64,\n                                        \"uid\": 12,\n                                        \"dsid\": 19,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"float\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 25,\n                                        \"y\": 67,\n                                        \"uid\": 13,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Speed\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 279,\n                                        \"y\": 119,\n                                        \"uid\": 14,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Min\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 345,\n                                        \"y\": 124,\n                                        \"uid\": 15,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Max\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"delta_t_generator\",\n                                        \"x\": 8,\n                                        \"y\": 9,\n                                        \"uid\": 18\n                                    },\n                                    {\n                                        \"plugin\": \"accumulate_modulator\",\n                                        \"x\": 187,\n                                        \"y\": 9,\n                                        \"uid\": 19,\n                                        \"state\": {\n                                            \"value\": 1.8264600000000004\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 102,\n                                        \"y\": 9,\n                                        \"uid\": 20\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 106,\n                                        \"y\": 111,\n                                        \"uid\": 24,\n                                        \"state\": {\n                                            \"val\": 0\n                                        },\n                                        \"title\": \"reset\"\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 18,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 20,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 19,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"Speed\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                },\n                                {\n                                    \"name\": \"Min\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                },\n                                {\n                                    \"name\": \"Max\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"float\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 499,\n                            \"y\": 639,\n                            \"uid\": 2,\n                            \"open\": false,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"13\": 1,\n                                    \"14\": 2,\n                                    \"15\": 3\n                                },\n                                \"output_sids\": {\n                                    \"12\": 0\n                                }\n                            },\n                            \"title\": \"Oscillate\",\n                            \"graph\": {\n                                \"node_uid\": 25,\n                                \"uid\": 12,\n                                \"parent_uid\": 10,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"sine_modulator\",\n                                        \"x\": 291,\n                                        \"y\": 9,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 405,\n                                        \"y\": 124,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"convert_oscilator_unit_modulator\",\n                                        \"x\": 370,\n                                        \"y\": 9,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 494,\n                                        \"y\": 9,\n                                        \"uid\": 6\n                                    },\n                                    {\n                                        \"plugin\": \"add_modulator\",\n                                        \"x\": 577,\n                                        \"y\": 64,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 660,\n                                        \"y\": 64,\n                                        \"uid\": 12,\n                                        \"dsid\": 20,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"float\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 25,\n                                        \"y\": 67,\n                                        \"uid\": 13,\n                                        \"dsid\": 18,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Speed\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 279,\n                                        \"y\": 119,\n                                        \"uid\": 14,\n                                        \"dsid\": 18,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Min\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 345,\n                                        \"y\": 124,\n                                        \"uid\": 15,\n                                        \"dsid\": 18,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Max\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"delta_t_generator\",\n                                        \"x\": 8,\n                                        \"y\": 9,\n                                        \"uid\": 18\n                                    },\n                                    {\n                                        \"plugin\": \"accumulate_modulator\",\n                                        \"x\": 187,\n                                        \"y\": 9,\n                                        \"uid\": 19,\n                                        \"state\": {\n                                            \"value\": 1.2509999999999981\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 102,\n                                        \"y\": 9,\n                                        \"uid\": 20\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 106,\n                                        \"y\": 111,\n                                        \"uid\": 24,\n                                        \"state\": {\n                                            \"val\": 0\n                                        },\n                                        \"title\": \"reset\"\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 18,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 20,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 19,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"Speed\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Min\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Max\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"float\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 291,\n                            \"y\": 647,\n                            \"uid\": 3,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Min\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 388,\n                            \"y\": 647,\n                            \"uid\": 4,\n                            \"state\": {\n                                \"val\": 2\n                            },\n                            \"title\": \"Max\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 498,\n                            \"y\": 682,\n                            \"uid\": 5,\n                            \"state\": {\n                                \"val\": 0.976\n                            },\n                            \"title\": \"Lowpass amount\"\n                        },\n                        {\n                            \"plugin\": \"lowpass_filter_modulator\",\n                            \"x\": 696,\n                            \"y\": 611,\n                            \"uid\": 6,\n                            \"open\": false\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 290,\n                            \"y\": 571,\n                            \"uid\": 7,\n                            \"state\": {\n                                \"val\": -2\n                            },\n                            \"title\": \"Min\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 389,\n                            \"y\": 571,\n                            \"uid\": 8,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Max\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 826,\n                            \"y\": 449,\n                            \"uid\": 9,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"13\": 5,\n                                    \"14\": 6,\n                                    \"15\": 7\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Translate\",\n                            \"graph\": {\n                                \"node_uid\": 17,\n                                \"uid\": 13,\n                                \"parent_uid\": 10,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 291,\n                                        \"y\": 50,\n                                        \"uid\": 2,\n                                        \"dsid\": 11,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 74,\n                                        \"y\": 50,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 8,\n                                        \"y\": 10,\n                                        \"uid\": 13,\n                                        \"dsid\": 11,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 8,\n                                        \"y\": 70,\n                                        \"uid\": 14,\n                                        \"dsid\": 11,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 8,\n                                        \"y\": 129,\n                                        \"uid\": 15,\n                                        \"dsid\": 11,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"translation_matrix\",\n                                        \"x\": 191,\n                                        \"y\": 50,\n                                        \"uid\": 16\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                },\n                                {\n                                    \"name\": \"z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 696,\n                            \"y\": 533,\n                            \"uid\": 10,\n                            \"open\": false,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"z position\"\n                        },\n                        {\n                            \"plugin\": \"random_float_generator\",\n                            \"x\": 585,\n                            \"y\": 422,\n                            \"uid\": 11,\n                            \"open\": false\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 496,\n                            \"y\": 411,\n                            \"uid\": 12,\n                            \"open\": false,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"13\": 1,\n                                    \"14\": 2,\n                                    \"15\": 3\n                                },\n                                \"output_sids\": {\n                                    \"12\": 0\n                                }\n                            },\n                            \"title\": \"Oscillate\",\n                            \"graph\": {\n                                \"node_uid\": 25,\n                                \"uid\": 14,\n                                \"parent_uid\": 10,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"sine_modulator\",\n                                        \"x\": 291,\n                                        \"y\": 9,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 405,\n                                        \"y\": 124,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"convert_oscilator_unit_modulator\",\n                                        \"x\": 370,\n                                        \"y\": 9,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 494,\n                                        \"y\": 9,\n                                        \"uid\": 6\n                                    },\n                                    {\n                                        \"plugin\": \"add_modulator\",\n                                        \"x\": 577,\n                                        \"y\": 64,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 660,\n                                        \"y\": 64,\n                                        \"uid\": 12,\n                                        \"dsid\": 19,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"float\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 25,\n                                        \"y\": 67,\n                                        \"uid\": 13,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Speed\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 279,\n                                        \"y\": 119,\n                                        \"uid\": 14,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Min\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 345,\n                                        \"y\": 124,\n                                        \"uid\": 15,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Max\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"delta_t_generator\",\n                                        \"x\": 8,\n                                        \"y\": 9,\n                                        \"uid\": 18\n                                    },\n                                    {\n                                        \"plugin\": \"accumulate_modulator\",\n                                        \"x\": 187,\n                                        \"y\": 9,\n                                        \"uid\": 19,\n                                        \"state\": {\n                                            \"value\": 1.1759400000000007\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 102,\n                                        \"y\": 9,\n                                        \"uid\": 20\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 106,\n                                        \"y\": 111,\n                                        \"uid\": 24,\n                                        \"state\": {\n                                            \"val\": 0\n                                        },\n                                        \"title\": \"reset\"\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 18,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 20,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 19,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"Speed\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                },\n                                {\n                                    \"name\": \"Min\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                },\n                                {\n                                    \"name\": \"Max\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"float\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 492,\n                            \"y\": 472,\n                            \"uid\": 13,\n                            \"open\": false,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"13\": 1,\n                                    \"14\": 2,\n                                    \"15\": 3\n                                },\n                                \"output_sids\": {\n                                    \"12\": 0\n                                }\n                            },\n                            \"title\": \"Oscillate\",\n                            \"graph\": {\n                                \"node_uid\": 25,\n                                \"uid\": 15,\n                                \"parent_uid\": 10,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"sine_modulator\",\n                                        \"x\": 291,\n                                        \"y\": 9,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 405,\n                                        \"y\": 124,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"convert_oscilator_unit_modulator\",\n                                        \"x\": 370,\n                                        \"y\": 9,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 494,\n                                        \"y\": 9,\n                                        \"uid\": 6\n                                    },\n                                    {\n                                        \"plugin\": \"add_modulator\",\n                                        \"x\": 577,\n                                        \"y\": 64,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 660,\n                                        \"y\": 64,\n                                        \"uid\": 12,\n                                        \"dsid\": 20,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"float\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 25,\n                                        \"y\": 67,\n                                        \"uid\": 13,\n                                        \"dsid\": 18,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Speed\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 279,\n                                        \"y\": 119,\n                                        \"uid\": 14,\n                                        \"dsid\": 18,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Min\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 345,\n                                        \"y\": 124,\n                                        \"uid\": 15,\n                                        \"dsid\": 18,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Max\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"delta_t_generator\",\n                                        \"x\": 8,\n                                        \"y\": 9,\n                                        \"uid\": 18\n                                    },\n                                    {\n                                        \"plugin\": \"accumulate_modulator\",\n                                        \"x\": 187,\n                                        \"y\": 9,\n                                        \"uid\": 19,\n                                        \"state\": {\n                                            \"value\": 0.8506800000000007\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 102,\n                                        \"y\": 9,\n                                        \"uid\": 20\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 106,\n                                        \"y\": 111,\n                                        \"uid\": 24,\n                                        \"state\": {\n                                            \"val\": 0\n                                        },\n                                        \"title\": \"reset\"\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 18,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 20,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 19,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"Speed\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Min\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Max\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"float\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 287,\n                            \"y\": 461,\n                            \"uid\": 14,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Min\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 383,\n                            \"y\": 461,\n                            \"uid\": 15,\n                            \"state\": {\n                                \"val\": 2\n                            },\n                            \"title\": \"Max\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 493,\n                            \"y\": 509,\n                            \"uid\": 16,\n                            \"state\": {\n                                \"val\": 0.989\n                            },\n                            \"title\": \"Lowpass amount\"\n                        },\n                        {\n                            \"plugin\": \"lowpass_filter_modulator\",\n                            \"x\": 692,\n                            \"y\": 456,\n                            \"uid\": 17,\n                            \"open\": false\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 285,\n                            \"y\": 381,\n                            \"uid\": 18,\n                            \"state\": {\n                                \"val\": -2\n                            },\n                            \"title\": \"Min\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 382,\n                            \"y\": 381,\n                            \"uid\": 19,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Max\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 209,\n                            \"y\": 380,\n                            \"uid\": 20,\n                            \"state\": {\n                                \"val\": 0.4700000000000002\n                            },\n                            \"title\": \"Speed\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 208,\n                            \"y\": 461,\n                            \"uid\": 21,\n                            \"state\": {\n                                \"val\": 0.34\n                            },\n                            \"title\": \"Speed\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 209,\n                            \"y\": 572,\n                            \"uid\": 22,\n                            \"state\": {\n                                \"val\": 0.7300000000000003\n                            },\n                            \"title\": \"Speed\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 212,\n                            \"y\": 644,\n                            \"uid\": 23,\n                            \"state\": {\n                                \"val\": 0.5000000000000001\n                            },\n                            \"title\": \"Speed\"\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 985,\n                            \"y\": 464,\n                            \"uid\": 24,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 8,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_connected\": false,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 8,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_connected\": false,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": false,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_connected\": false,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 24,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 11,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 11,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 17,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 18,\n                            \"dst_nuid\": 12,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_connected\": false,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 12,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_connected\": false,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 20,\n                            \"dst_nuid\": 12,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": false,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 13,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 13,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 13,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 17,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        }\n                    ]\n                },\n                \"dyn_out\": [\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 8,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/matrix_transforms_setup.json",
    "content": "{\n    \"abs_t\": 180.369,\n    \"active_graph\": 0,\n    \"graph_uid\": 10,\n    \"root\": {\n        \"node_uid\": 21,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 670,\n                \"y\": 154,\n                \"uid\": 8,\n                \"open\": false,\n                \"dsid\": 4,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"rt_filter\": 9729,\n                    \"input_sids\": {\n                        \"8\": 1,\n                        \"9\": 2,\n                        \"10\": 3\n                    },\n                    \"output_sids\": {\n                        \"1\": 0\n                    }\n                },\n                \"title\": \"Rotate\",\n                \"graph\": {\n                    \"node_uid\": 21,\n                    \"uid\": 6,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"rotation_xyz_matrix\",\n                            \"x\": 367,\n                            \"y\": 174,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 485,\n                            \"y\": 174,\n                            \"uid\": 1,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 45,\n                            \"y\": 80,\n                            \"uid\": 8,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"X\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 45,\n                            \"y\": 170,\n                            \"uid\": 9,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Y\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 46,\n                            \"y\": 257,\n                            \"uid\": 10,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Z\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 40,\n                            \"y\": 386,\n                            \"uid\": 11,\n                            \"state\": {\n                                \"val\": 180\n                            }\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 15,\n                            \"y\": 317,\n                            \"uid\": 12,\n                            \"state\": {\n                                \"val\": 360\n                            }\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 165,\n                            \"y\": 80,\n                            \"uid\": 15\n                        },\n                        {\n                            \"plugin\": \"subtract_modulator\",\n                            \"x\": 260,\n                            \"y\": 105,\n                            \"uid\": 16\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 165,\n                            \"y\": 170,\n                            \"uid\": 17\n                        },\n                        {\n                            \"plugin\": \"subtract_modulator\",\n                            \"x\": 260,\n                            \"y\": 195,\n                            \"uid\": 18\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 163,\n                            \"y\": 257,\n                            \"uid\": 19\n                        },\n                        {\n                            \"plugin\": \"subtract_modulator\",\n                            \"x\": 258,\n                            \"y\": 282,\n                            \"uid\": 20\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 18,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 20,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 8,\n                            \"dst_nuid\": 15,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 17,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 15,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 17,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"offset\": 2\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 18,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 20,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"offset\": 2\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 18,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 20,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"X\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Y\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Z\",\n                        \"dt\": 0,\n                        \"uid\": 3,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 323,\n                \"y\": 147,\n                \"uid\": 9,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Rotate X\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 323,\n                \"y\": 220,\n                \"uid\": 10,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Rotate Y\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 323,\n                \"y\": 294,\n                \"uid\": 11,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Rotate Z\"\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 676,\n                \"y\": 280,\n                \"uid\": 12,\n                \"open\": false,\n                \"dsid\": 8,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"rt_filter\": 9729,\n                    \"input_sids\": {\n                        \"13\": 5,\n                        \"14\": 6,\n                        \"15\": 7\n                    },\n                    \"output_sids\": {\n                        \"2\": 1\n                    }\n                },\n                \"title\": \"Scale\",\n                \"graph\": {\n                    \"node_uid\": 16,\n                    \"uid\": 7,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"scale_matrix\",\n                            \"x\": 189,\n                            \"y\": 49,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 278,\n                            \"y\": 49,\n                            \"uid\": 2,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 73,\n                            \"y\": 49,\n                            \"uid\": 3\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 7,\n                            \"y\": 9,\n                            \"uid\": 13,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"x\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 7,\n                            \"y\": 69,\n                            \"uid\": 14,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"y\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 7,\n                            \"y\": 132,\n                            \"uid\": 15,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"z\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"x\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"y\",\n                        \"dt\": 0,\n                        \"uid\": 6,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"z\",\n                        \"dt\": 0,\n                        \"uid\": 7,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 672,\n                \"y\": 215,\n                \"uid\": 13,\n                \"open\": false,\n                \"dsid\": 8,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"rt_filter\": 9729,\n                    \"input_sids\": {\n                        \"13\": 5,\n                        \"14\": 6,\n                        \"15\": 7\n                    },\n                    \"output_sids\": {\n                        \"2\": 1\n                    }\n                },\n                \"title\": \"Translate\",\n                \"graph\": {\n                    \"node_uid\": 17,\n                    \"uid\": 8,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 291,\n                            \"y\": 50,\n                            \"uid\": 2,\n                            \"dsid\": 6,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 74,\n                            \"y\": 50,\n                            \"uid\": 3\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 8,\n                            \"y\": 10,\n                            \"uid\": 13,\n                            \"dsid\": 6,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"x\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 8,\n                            \"y\": 70,\n                            \"uid\": 14,\n                            \"dsid\": 6,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"y\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 8,\n                            \"y\": 129,\n                            \"uid\": 15,\n                            \"dsid\": 6,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"z\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"translation_matrix\",\n                            \"x\": 191,\n                            \"y\": 50,\n                            \"uid\": 16\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"x\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"y\",\n                        \"dt\": 0,\n                        \"uid\": 6,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"z\",\n                        \"dt\": 0,\n                        \"uid\": 7,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 410,\n                \"y\": 151,\n                \"uid\": 14,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Position X\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 410,\n                \"y\": 212,\n                \"uid\": 15,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Position Y\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 410,\n                \"y\": 274,\n                \"uid\": 16,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Position Z\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 319,\n                \"y\": 368,\n                \"uid\": 17,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Scale XYZ\"\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 833,\n                \"y\": 153,\n                \"uid\": 20,\n                \"dsid\": 4,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"rt_filter\": 9729,\n                    \"input_sids\": {\n                        \"3\": 1,\n                        \"4\": 2,\n                        \"5\": 3\n                    },\n                    \"output_sids\": {\n                        \"2\": 0\n                    }\n                },\n                \"title\": \"Concatenate x2\",\n                \"graph\": {\n                    \"node_uid\": 6,\n                    \"uid\": 9,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"concatenate_matrix_modulator\",\n                            \"x\": 274,\n                            \"y\": 13,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"concatenate_matrix_modulator\",\n                            \"x\": 92,\n                            \"y\": 13,\n                            \"uid\": 1\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 394,\n                            \"y\": 13,\n                            \"uid\": 2,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 197,\n                            \"y\": 14,\n                            \"uid\": 3,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 9,\n                            \"y\": 13,\n                            \"uid\": 4,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 9,\n                            \"y\": 71,\n                            \"uid\": 5,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 2,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 3,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 9,\n                \"dst_nuid\": 8,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 10,\n                \"dst_nuid\": 8,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 11,\n                \"dst_nuid\": 8,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 14,\n                \"dst_nuid\": 13,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 15,\n                \"dst_nuid\": 13,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 16,\n                \"dst_nuid\": 13,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 17,\n                \"dst_nuid\": 12,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 13,\n                \"dst_nuid\": 20,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 8,\n                \"dst_nuid\": 20,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 12,\n                \"dst_nuid\": 20,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 17,\n                \"dst_nuid\": 12,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true,\n                \"offset\": 1\n            },\n            {\n                \"src_nuid\": 17,\n                \"dst_nuid\": 12,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true,\n                \"offset\": 2\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/matrix_translate.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 3,\n    \"root\": {\n        \"node_uid\": 7,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 562,\n                \"y\": 225,\n                \"uid\": 3,\n                \"dsid\": 8,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"13\": 5,\n                        \"14\": 6,\n                        \"15\": 7\n                    },\n                    \"output_sids\": {\n                        \"2\": 1\n                    }\n                },\n                \"title\": \"Translate\",\n                \"graph\": {\n                    \"node_uid\": 17,\n                    \"uid\": 2,\n                    \"parent_uid\": 0,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 291,\n                            \"y\": 50,\n                            \"uid\": 2,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 74,\n                            \"y\": 50,\n                            \"uid\": 3\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 8,\n                            \"y\": 10,\n                            \"uid\": 13,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"x\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 8,\n                            \"y\": 70,\n                            \"uid\": 14,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"y\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 8,\n                            \"y\": 129,\n                            \"uid\": 15,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"z\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"translation_matrix\",\n                            \"x\": 191,\n                            \"y\": 50,\n                            \"uid\": 16\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"x\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"y\",\n                        \"dt\": 0,\n                        \"uid\": 6,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"z\",\n                        \"dt\": 0,\n                        \"uid\": 7,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 366,\n                \"y\": 225,\n                \"uid\": 4,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"x position\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 366,\n                \"y\": 286,\n                \"uid\": 5,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"y position\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 366,\n                \"y\": 348,\n                \"uid\": 6,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"z position\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 3,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 3,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 6,\n                \"dst_nuid\": 3,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/newset_3d_scene_loader.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 4,\n    \"root\": {\n        \"node_uid\": 17,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 249,\n                \"y\": 143,\n                \"uid\": 0,\n                \"open\": false,\n                \"dsid\": 6,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"70\": 1,\n                        \"73\": 2,\n                        \"75\": 3,\n                        \"76\": 4,\n                        \"77\": 5\n                    },\n                    \"output_sids\": {}\n                },\n                \"title\": \"Scene loader\",\n                \"graph\": {\n                    \"node_uid\": 78,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 889,\n                            \"y\": 120,\n                            \"uid\": 0,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"1\": 0,\n                                    \"2\": 1,\n                                    \"10\": 2,\n                                    \"21\": 5,\n                                    \"23\": 6\n                                },\n                                \"output_sids\": {}\n                            },\n                            \"title\": \"Scene loader\",\n                            \"graph\": {\n                                \"node_uid\": 26,\n                                \"uid\": 2,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scene_renderer_emitter\",\n                                        \"x\": 849,\n                                        \"y\": 16,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 11,\n                                        \"y\": 308,\n                                        \"uid\": 1,\n                                        \"dsid\": 27,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"scene\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 11,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 707,\n                                        \"y\": 122,\n                                        \"uid\": 2,\n                                        \"dsid\": 27,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"scale_matrix\",\n                                        \"x\": 648,\n                                        \"y\": 205,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 514,\n                                        \"y\": 216,\n                                        \"uid\": 8\n                                    },\n                                    {\n                                        \"plugin\": \"divide_modulator\",\n                                        \"x\": 400,\n                                        \"y\": 235,\n                                        \"uid\": 9\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 280,\n                                        \"y\": 204,\n                                        \"uid\": 10,\n                                        \"dsid\": 27,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"mesh scale\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"max_modulator\",\n                                        \"x\": 320,\n                                        \"y\": 307,\n                                        \"uid\": 11\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 220,\n                                        \"y\": 355,\n                                        \"uid\": 12\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 221,\n                                        \"y\": 288,\n                                        \"uid\": 13\n                                    },\n                                    {\n                                        \"plugin\": \"scene_get_bounding_box\",\n                                        \"x\": 89,\n                                        \"y\": 307,\n                                        \"uid\": 14\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 647,\n                                        \"y\": 265,\n                                        \"uid\": 21,\n                                        \"dsid\": 26,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"transform\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 605,\n                                        \"y\": 72,\n                                        \"uid\": 23,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 743,\n                                        \"y\": 204,\n                                        \"uid\": 25\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 13,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 1,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 14,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"scene\",\n                                    \"dt\": 11,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"mesh scale\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"transform\",\n                                    \"dt\": 4,\n                                    \"uid\": 5,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 6,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 768,\n                            \"y\": 125,\n                            \"uid\": 70,\n                            \"open\": false,\n                            \"dsid\": 19,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"camera\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 6,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 766,\n                            \"y\": 190,\n                            \"uid\": 73,\n                            \"open\": false,\n                            \"dsid\": 12,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"transform\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 799,\n                            \"y\": 31,\n                            \"uid\": 75,\n                            \"dsid\": 10,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"scene\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 11,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 761,\n                            \"y\": 300,\n                            \"uid\": 76,\n                            \"dsid\": 10,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"mesh scale\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 776,\n                            \"y\": 233,\n                            \"uid\": 77,\n                            \"dsid\": 9,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"material\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 12,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 70,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 73,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 75,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 76,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 77,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"camera\",\n                        \"dt\": 6,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"transform\",\n                        \"dt\": 4,\n                        \"uid\": 2,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"scene\",\n                        \"dt\": 11,\n                        \"uid\": 3,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"mesh scale\",\n                        \"dt\": 0,\n                        \"uid\": 4,\n                        \"index\": 3,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"material\",\n                        \"dt\": 12,\n                        \"uid\": 5,\n                        \"index\": 4,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"register_global_read\",\n                \"x\": 173,\n                \"y\": 142,\n                \"uid\": 1,\n                \"open\": false,\n                \"dsid\": 13,\n                \"state\": {\n                    \"slot_id\": 0\n                },\n                \"title\": \"camera\",\n                \"dyn_out\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 6,\n                        \"desc\": \"\",\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"register_global_read\",\n                \"x\": 173,\n                \"y\": 173,\n                \"uid\": 2,\n                \"open\": false,\n                \"dsid\": 13,\n                \"state\": {\n                    \"slot_id\": 0\n                },\n                \"title\": \"matrix\",\n                \"dyn_out\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 4,\n                        \"desc\": \"\",\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"url_scene_generator\",\n                \"x\": 55,\n                \"y\": 141,\n                \"uid\": 3,\n                \"state\": {\n                    \"url\": \"/data/scene/ladybug/scene.json\"\n                }\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 53,\n                \"y\": 203,\n                \"uid\": 4,\n                \"state\": {\n                    \"val\": 1,\n                    \"min\": 0,\n                    \"max\": 10\n                },\n                \"title\": \"Mesh scale\"\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 682,\n                \"y\": 173,\n                \"uid\": 5,\n                \"open\": false,\n                \"dsid\": 21,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"21\": 4,\n                        \"22\": 5,\n                        \"23\": 6,\n                        \"24\": 7,\n                        \"25\": 8,\n                        \"39\": 12,\n                        \"40\": 13,\n                        \"41\": 14,\n                        \"44\": 16,\n                        \"47\": 18,\n                        \"49\": 19\n                    },\n                    \"output_sids\": {\n                        \"9\": 0\n                    }\n                },\n                \"title\": \"Material chain\",\n                \"graph\": {\n                    \"node_uid\": 54,\n                    \"uid\": 3,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"material_diffuse_color_modulator\",\n                            \"x\": 1029,\n                            \"y\": 68,\n                            \"uid\": 1\n                        },\n                        {\n                            \"plugin\": \"material_alpha_clip_modulator\",\n                            \"x\": 1137,\n                            \"y\": 68,\n                            \"uid\": 5\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 1025,\n                            \"y\": 145,\n                            \"uid\": 6,\n                            \"state\": {\n                                \"enabled\": false\n                            },\n                            \"title\": \"Alpha clip\"\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1361,\n                            \"y\": 68,\n                            \"uid\": 9,\n                            \"dsid\": 48,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"material\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 12,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"material_blend_mode_modulator\",\n                            \"x\": 898,\n                            \"y\": 69,\n                            \"uid\": 10\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 800,\n                            \"y\": 134,\n                            \"uid\": 21,\n                            \"dsid\": 42,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"hue\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 798,\n                            \"y\": 183,\n                            \"uid\": 22,\n                            \"dsid\": 42,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"saturation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 800,\n                            \"y\": 231,\n                            \"uid\": 23,\n                            \"dsid\": 42,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"luminosity\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 799,\n                            \"y\": 279,\n                            \"uid\": 24,\n                            \"dsid\": 42,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"alpha\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 800,\n                            \"y\": 70,\n                            \"uid\": 25,\n                            \"dsid\": 42,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"blend mode\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"convert_hsla_color_modulator\",\n                            \"x\": 907,\n                            \"y\": 147,\n                            \"uid\": 26\n                        },\n                        {\n                            \"plugin\": \"material_z_buffer_modulator\",\n                            \"x\": 672,\n                            \"y\": 65,\n                            \"uid\": 27\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 564,\n                            \"y\": 212,\n                            \"uid\": 28,\n                            \"state\": {\n                                \"enabled\": true\n                            },\n                            \"title\": \"Z-buffer\"\n                        },\n                        {\n                            \"plugin\": \"material_shinyness_modulator\",\n                            \"x\": 558,\n                            \"y\": 64,\n                            \"uid\": 31\n                        },\n                        {\n                            \"plugin\": \"material_double_sided_modulator\",\n                            \"x\": 437,\n                            \"y\": 61,\n                            \"uid\": 35\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 323,\n                            \"y\": 161,\n                            \"uid\": 36,\n                            \"state\": {\n                                \"enabled\": false\n                            },\n                            \"title\": \"Double-sided\"\n                        },\n                        {\n                            \"plugin\": \"material_ambient_color_modulator\",\n                            \"x\": 290,\n                            \"y\": 73,\n                            \"uid\": 37\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 63,\n                            \"y\": 153,\n                            \"uid\": 39,\n                            \"dsid\": 43,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"am hue\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 60,\n                            \"y\": 202,\n                            \"uid\": 40,\n                            \"dsid\": 43,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"am saturation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 63,\n                            \"y\": 250,\n                            \"uid\": 41,\n                            \"dsid\": 43,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"am luminosity\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"convert_hsla_color_modulator\",\n                            \"x\": 170,\n                            \"y\": 166,\n                            \"uid\": 43\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 61,\n                            \"y\": 99,\n                            \"uid\": 44,\n                            \"dsid\": 32,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"material\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 12,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 40,\n                            \"y\": 52,\n                            \"uid\": 47,\n                            \"dsid\": 27,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 13,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"material_light_modulator\",\n                            \"x\": 158,\n                            \"y\": 22,\n                            \"uid\": 48\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 54,\n                            \"y\": 0,\n                            \"uid\": 49,\n                            \"dsid\": 24,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light index\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 574,\n                            \"y\": 276,\n                            \"uid\": 50,\n                            \"state\": {\n                                \"enabled\": true\n                            },\n                            \"title\": \"Depth write\"\n                        },\n                        {\n                            \"plugin\": \"register_global_read\",\n                            \"x\": 477,\n                            \"y\": 164,\n                            \"uid\": 51,\n                            \"dsid\": 14,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"shinyness\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 26,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 27,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 28,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 31,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 35,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 36,\n                            \"dst_nuid\": 35,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 35,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 39,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 40,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 41,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 43,\n                            \"dst_nuid\": 37,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 47,\n                            \"dst_nuid\": 48,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 44,\n                            \"dst_nuid\": 48,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 48,\n                            \"dst_nuid\": 37,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 49,\n                            \"dst_nuid\": 48,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 50,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        },\n                        {\n                            \"src_nuid\": 51,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"hue\",\n                        \"dt\": 0,\n                        \"uid\": 4,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"saturation\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"luminosity\",\n                        \"dt\": 0,\n                        \"uid\": 6,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"alpha\",\n                        \"dt\": 0,\n                        \"uid\": 7,\n                        \"index\": 3,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"blend mode\",\n                        \"dt\": 0,\n                        \"uid\": 8,\n                        \"index\": 4,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"am hue\",\n                        \"dt\": 0,\n                        \"uid\": 12,\n                        \"index\": 5,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"am saturation\",\n                        \"dt\": 0,\n                        \"uid\": 13,\n                        \"index\": 6,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"am luminosity\",\n                        \"dt\": 0,\n                        \"uid\": 14,\n                        \"index\": 7,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"material\",\n                        \"dt\": 12,\n                        \"uid\": 16,\n                        \"index\": 8,\n                        \"type\": 0,\n                        \"is_connected\": false\n                    },\n                    {\n                        \"name\": \"light\",\n                        \"dt\": 13,\n                        \"uid\": 18,\n                        \"index\": 9,\n                        \"type\": 0,\n                        \"is_connected\": true,\n                        \"connected\": false\n                    },\n                    {\n                        \"name\": \"light index\",\n                        \"dt\": 0,\n                        \"uid\": 19,\n                        \"index\": 10,\n                        \"type\": 0\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"material\",\n                        \"dt\": 12,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 375,\n                \"y\": 177,\n                \"uid\": 6,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Hue\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 447,\n                \"y\": 179,\n                \"uid\": 7,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Saturation\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 526,\n                \"y\": 179,\n                \"uid\": 8,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Luminosity\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 607,\n                \"y\": 179,\n                \"uid\": 9,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Alpha\"\n            },\n            {\n                \"plugin\": \"blend_mode_generator\",\n                \"x\": 258,\n                \"y\": 247,\n                \"uid\": 10,\n                \"state\": {\n                    \"mode\": 4\n                }\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 416,\n                \"y\": 244,\n                \"uid\": 11,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Ambient Hue\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 508,\n                \"y\": 244,\n                \"uid\": 12,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Ambient Sat\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 596,\n                \"y\": 244,\n                \"uid\": 13,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Ambient Lum\"\n            },\n            {\n                \"plugin\": \"url_texture_generator\",\n                \"x\": 255,\n                \"y\": 177,\n                \"uid\": 14,\n                \"state\": {\n                   \"url\": \"/data/image/f0e870569e5a143a8d3be0722e38e523141e4248.png\"\n                },\n                \"title\": \"Texture\"\n            },\n            {\n                \"plugin\": \"material_texture_modulator\",\n                \"x\": 414,\n                \"y\": 315,\n                \"uid\": 15,\n                \"open\": false\n            },\n            {\n                \"plugin\": \"register_global_read\",\n                \"x\": 684,\n                \"y\": 204,\n                \"uid\": 16,\n                \"open\": false,\n                \"dsid\": 7,\n                \"state\": {\n                    \"slot_id\": 0\n                },\n                \"title\": \"light\",\n                \"dyn_out\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 13,\n                        \"desc\": \"\",\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 1,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 2,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 3,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 3,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 4,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 6,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 7,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 8,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 9,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 3,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 10,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 4,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 13,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 7,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 12,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 6,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 11,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 5,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 16,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 9,\n                \"dst_connected\": false,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 14,\n                \"dst_nuid\": 15,\n                \"src_slot\": 0,\n                \"dst_slot\": 2\n            }\n        ]\n    },\n    \"registers\": [\n        {\n            \"id\": \"camera\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"shinyness\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"light\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"matrix\",\n            \"dt\": 8\n        }\n    ]\n}"
  },
  {
    "path": "browser/patches/newset_3d_scene_loader_with_camera.json",
    "content": "{\n    \"abs_t\": 75.339,\n    \"active_graph\": 0,\n    \"graph_uid\": 5,\n    \"root\": {\n        \"node_uid\": 23,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 282,\n                \"y\": 222,\n                \"uid\": 0,\n                \"open\": false,\n                \"dsid\": 6,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"70\": 1,\n                        \"73\": 2,\n                        \"75\": 3,\n                        \"76\": 4,\n                        \"77\": 5\n                    },\n                    \"output_sids\": {}\n                },\n                \"title\": \"Scene loader\",\n                \"graph\": {\n                    \"node_uid\": 78,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 889,\n                            \"y\": 120,\n                            \"uid\": 0,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"1\": 0,\n                                    \"2\": 1,\n                                    \"10\": 2,\n                                    \"21\": 5,\n                                    \"23\": 6\n                                },\n                                \"output_sids\": {}\n                            },\n                            \"title\": \"Scene loader\",\n                            \"graph\": {\n                                \"node_uid\": 26,\n                                \"uid\": 2,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scene_renderer_emitter\",\n                                        \"x\": 849,\n                                        \"y\": 16,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 11,\n                                        \"y\": 308,\n                                        \"uid\": 1,\n                                        \"dsid\": 28,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"scene\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 11,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 707,\n                                        \"y\": 122,\n                                        \"uid\": 2,\n                                        \"dsid\": 28,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"scale_matrix\",\n                                        \"x\": 648,\n                                        \"y\": 205,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 514,\n                                        \"y\": 216,\n                                        \"uid\": 8\n                                    },\n                                    {\n                                        \"plugin\": \"divide_modulator\",\n                                        \"x\": 400,\n                                        \"y\": 235,\n                                        \"uid\": 9\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 280,\n                                        \"y\": 204,\n                                        \"uid\": 10,\n                                        \"dsid\": 28,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"mesh scale\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"max_modulator\",\n                                        \"x\": 320,\n                                        \"y\": 307,\n                                        \"uid\": 11\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 220,\n                                        \"y\": 355,\n                                        \"uid\": 12\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 221,\n                                        \"y\": 288,\n                                        \"uid\": 13\n                                    },\n                                    {\n                                        \"plugin\": \"scene_get_bounding_box\",\n                                        \"x\": 89,\n                                        \"y\": 307,\n                                        \"uid\": 14\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 647,\n                                        \"y\": 265,\n                                        \"uid\": 21,\n                                        \"dsid\": 27,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"transform\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 605,\n                                        \"y\": 72,\n                                        \"uid\": 23,\n                                        \"dsid\": 24,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 743,\n                                        \"y\": 204,\n                                        \"uid\": 25\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 13,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 1,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 14,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"scene\",\n                                    \"dt\": 11,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"mesh scale\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"transform\",\n                                    \"dt\": 4,\n                                    \"uid\": 5,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 6,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 768,\n                            \"y\": 125,\n                            \"uid\": 70,\n                            \"open\": false,\n                            \"dsid\": 20,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"camera\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 6,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 766,\n                            \"y\": 190,\n                            \"uid\": 73,\n                            \"open\": false,\n                            \"dsid\": 13,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"transform\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 799,\n                            \"y\": 31,\n                            \"uid\": 75,\n                            \"dsid\": 11,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"scene\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 11,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 761,\n                            \"y\": 300,\n                            \"uid\": 76,\n                            \"dsid\": 11,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"mesh scale\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 776,\n                            \"y\": 233,\n                            \"uid\": 77,\n                            \"dsid\": 10,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"material\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 12,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 70,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 73,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 75,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 76,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 77,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"camera\",\n                        \"dt\": 6,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"transform\",\n                        \"dt\": 4,\n                        \"uid\": 2,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"scene\",\n                        \"dt\": 11,\n                        \"uid\": 3,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"mesh scale\",\n                        \"dt\": 0,\n                        \"uid\": 4,\n                        \"index\": 3,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"material\",\n                        \"dt\": 12,\n                        \"uid\": 5,\n                        \"index\": 4,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"register_global_read\",\n                \"x\": 206,\n                \"y\": 221,\n                \"uid\": 1,\n                \"open\": false,\n                \"dsid\": 14,\n                \"state\": {\n                    \"slot_id\": 0\n                },\n                \"title\": \"camera\",\n                \"dyn_out\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 6,\n                        \"desc\": \"\",\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"register_global_read\",\n                \"x\": 206,\n                \"y\": 252,\n                \"uid\": 2,\n                \"open\": false,\n                \"dsid\": 14,\n                \"state\": {\n                    \"slot_id\": 0\n                },\n                \"title\": \"matrix\",\n                \"dyn_out\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 4,\n                        \"desc\": \"\",\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"url_scene_generator\",\n                \"x\": 88,\n                \"y\": 220,\n                \"uid\": 3,\n                \"state\": {\n                    \"url\": \"/data/scene/ladybug/scene.json\"\n                }\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 86,\n                \"y\": 282,\n                \"uid\": 4,\n                \"state\": {\n                    \"val\": 1,\n                    \"min\": 0,\n                    \"max\": 10\n                },\n                \"title\": \"Mesh scale\"\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 715,\n                \"y\": 252,\n                \"uid\": 5,\n                \"open\": false,\n                \"dsid\": 21,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"21\": 4,\n                        \"22\": 5,\n                        \"23\": 6,\n                        \"24\": 7,\n                        \"25\": 8,\n                        \"39\": 12,\n                        \"40\": 13,\n                        \"41\": 14,\n                        \"44\": 16,\n                        \"47\": 18,\n                        \"49\": 19\n                    },\n                    \"output_sids\": {\n                        \"9\": 0\n                    }\n                },\n                \"title\": \"Material chain\",\n                \"graph\": {\n                    \"node_uid\": 54,\n                    \"uid\": 3,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"material_diffuse_color_modulator\",\n                            \"x\": 1029,\n                            \"y\": 68,\n                            \"uid\": 1\n                        },\n                        {\n                            \"plugin\": \"material_alpha_clip_modulator\",\n                            \"x\": 1137,\n                            \"y\": 68,\n                            \"uid\": 5\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 1025,\n                            \"y\": 145,\n                            \"uid\": 6,\n                            \"state\": {\n                                \"enabled\": false\n                            },\n                            \"title\": \"Alpha clip\"\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1361,\n                            \"y\": 68,\n                            \"uid\": 9,\n                            \"dsid\": 49,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"material\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 12,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"material_blend_mode_modulator\",\n                            \"x\": 898,\n                            \"y\": 69,\n                            \"uid\": 10\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 800,\n                            \"y\": 134,\n                            \"uid\": 21,\n                            \"dsid\": 43,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"hue\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 798,\n                            \"y\": 183,\n                            \"uid\": 22,\n                            \"dsid\": 43,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"saturation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 800,\n                            \"y\": 231,\n                            \"uid\": 23,\n                            \"dsid\": 43,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"luminosity\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 799,\n                            \"y\": 279,\n                            \"uid\": 24,\n                            \"dsid\": 43,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"alpha\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 800,\n                            \"y\": 70,\n                            \"uid\": 25,\n                            \"dsid\": 43,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"blend mode\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"convert_hsla_color_modulator\",\n                            \"x\": 907,\n                            \"y\": 147,\n                            \"uid\": 26\n                        },\n                        {\n                            \"plugin\": \"material_z_buffer_modulator\",\n                            \"x\": 672,\n                            \"y\": 65,\n                            \"uid\": 27\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 564,\n                            \"y\": 212,\n                            \"uid\": 28,\n                            \"state\": {\n                                \"enabled\": true\n                            },\n                            \"title\": \"Z-buffer\"\n                        },\n                        {\n                            \"plugin\": \"material_shinyness_modulator\",\n                            \"x\": 558,\n                            \"y\": 64,\n                            \"uid\": 31\n                        },\n                        {\n                            \"plugin\": \"material_double_sided_modulator\",\n                            \"x\": 437,\n                            \"y\": 61,\n                            \"uid\": 35\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 323,\n                            \"y\": 161,\n                            \"uid\": 36,\n                            \"state\": {\n                                \"enabled\": false\n                            },\n                            \"title\": \"Double-sided\"\n                        },\n                        {\n                            \"plugin\": \"material_ambient_color_modulator\",\n                            \"x\": 290,\n                            \"y\": 73,\n                            \"uid\": 37\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 63,\n                            \"y\": 153,\n                            \"uid\": 39,\n                            \"dsid\": 44,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"am hue\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 60,\n                            \"y\": 202,\n                            \"uid\": 40,\n                            \"dsid\": 44,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"am saturation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 63,\n                            \"y\": 250,\n                            \"uid\": 41,\n                            \"dsid\": 44,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"am luminosity\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"convert_hsla_color_modulator\",\n                            \"x\": 170,\n                            \"y\": 166,\n                            \"uid\": 43\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 61,\n                            \"y\": 99,\n                            \"uid\": 44,\n                            \"dsid\": 33,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"material\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 12,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 40,\n                            \"y\": 52,\n                            \"uid\": 47,\n                            \"dsid\": 28,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 13,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"material_light_modulator\",\n                            \"x\": 158,\n                            \"y\": 22,\n                            \"uid\": 48\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 54,\n                            \"y\": 0,\n                            \"uid\": 49,\n                            \"dsid\": 25,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light index\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 574,\n                            \"y\": 276,\n                            \"uid\": 50,\n                            \"state\": {\n                                \"enabled\": true\n                            },\n                            \"title\": \"Depth write\"\n                        },\n                        {\n                            \"plugin\": \"register_global_read\",\n                            \"x\": 477,\n                            \"y\": 164,\n                            \"uid\": 51,\n                            \"dsid\": 15,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"shinyness\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 26,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 27,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 28,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 31,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 35,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 36,\n                            \"dst_nuid\": 35,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 35,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 39,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 40,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 41,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 43,\n                            \"dst_nuid\": 37,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 47,\n                            \"dst_nuid\": 48,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 44,\n                            \"dst_nuid\": 48,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 48,\n                            \"dst_nuid\": 37,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 49,\n                            \"dst_nuid\": 48,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 50,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        },\n                        {\n                            \"src_nuid\": 51,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"hue\",\n                        \"dt\": 0,\n                        \"uid\": 4,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"saturation\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"luminosity\",\n                        \"dt\": 0,\n                        \"uid\": 6,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"alpha\",\n                        \"dt\": 0,\n                        \"uid\": 7,\n                        \"index\": 3,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"blend mode\",\n                        \"dt\": 0,\n                        \"uid\": 8,\n                        \"index\": 4,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"am hue\",\n                        \"dt\": 0,\n                        \"uid\": 12,\n                        \"index\": 5,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"am saturation\",\n                        \"dt\": 0,\n                        \"uid\": 13,\n                        \"index\": 6,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"am luminosity\",\n                        \"dt\": 0,\n                        \"uid\": 14,\n                        \"index\": 7,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"material\",\n                        \"dt\": 12,\n                        \"uid\": 16,\n                        \"index\": 8,\n                        \"type\": 0,\n                        \"is_connected\": false\n                    },\n                    {\n                        \"name\": \"light\",\n                        \"dt\": 13,\n                        \"uid\": 18,\n                        \"index\": 9,\n                        \"type\": 0,\n                        \"is_connected\": true,\n                        \"connected\": false\n                    },\n                    {\n                        \"name\": \"light index\",\n                        \"dt\": 0,\n                        \"uid\": 19,\n                        \"index\": 10,\n                        \"type\": 0\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"material\",\n                        \"dt\": 12,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 408,\n                \"y\": 256,\n                \"uid\": 6,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Hue\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 480,\n                \"y\": 258,\n                \"uid\": 7,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Saturation\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 559,\n                \"y\": 258,\n                \"uid\": 8,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Luminosity\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 640,\n                \"y\": 258,\n                \"uid\": 9,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Alpha\"\n            },\n            {\n                \"plugin\": \"blend_mode_generator\",\n                \"x\": 291,\n                \"y\": 326,\n                \"uid\": 10,\n                \"state\": {\n                    \"mode\": 4\n                }\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 449,\n                \"y\": 323,\n                \"uid\": 11,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Ambient Hue\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 541,\n                \"y\": 323,\n                \"uid\": 12,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Ambient Sat\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 629,\n                \"y\": 323,\n                \"uid\": 13,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Ambient Lum\"\n            },\n            {\n                \"plugin\": \"url_texture_generator\",\n                \"x\": 288,\n                \"y\": 256,\n                \"uid\": 14,\n                \"state\": {\n                    \"url\": \"/data/image/f0e870569e5a143a8d3be0722e38e523141e4248.png\"\n                },\n                \"title\": \"Texture\"\n            },\n            {\n                \"plugin\": \"material_texture_modulator\",\n                \"x\": 447,\n                \"y\": 394,\n                \"uid\": 15,\n                \"open\": false\n            },\n            {\n                \"plugin\": \"register_global_read\",\n                \"x\": 717,\n                \"y\": 283,\n                \"uid\": 16,\n                \"open\": false,\n                \"dsid\": 8,\n                \"state\": {\n                    \"slot_id\": 0\n                },\n                \"title\": \"light\",\n                \"dyn_out\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 13,\n                        \"desc\": \"\",\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 869,\n                \"y\": 110,\n                \"uid\": 17,\n                \"open\": false,\n                \"dsid\": 6,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"0\": 0,\n                        \"1\": 1,\n                        \"2\": 2,\n                        \"25\": 5\n                    },\n                    \"output_sids\": {\n                        \"3\": 3\n                    }\n                },\n                \"title\": \"Camera\",\n                \"graph\": {\n                    \"node_uid\": 26,\n                    \"uid\": 4,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 74,\n                            \"y\": 173,\n                            \"uid\": 0,\n                            \"dsid\": 17,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"rotation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 129,\n                            \"y\": 89,\n                            \"uid\": 1,\n                            \"dsid\": 17,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"elevation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 52,\n                            \"y\": 48,\n                            \"uid\": 2,\n                            \"dsid\": 17,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"dolly\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 558,\n                            \"y\": 35,\n                            \"uid\": 3,\n                            \"dsid\": 17,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"camera\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 6,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"perspective_camera\",\n                            \"x\": 448,\n                            \"y\": 75,\n                            \"uid\": 4\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 218,\n                            \"y\": 28,\n                            \"uid\": 5\n                        },\n                        {\n                            \"plugin\": \"rotation_xyz_matrix\",\n                            \"x\": 160,\n                            \"y\": 153,\n                            \"uid\": 6\n                        },\n                        {\n                            \"plugin\": \"vector_transform\",\n                            \"x\": 342,\n                            \"y\": 77,\n                            \"uid\": 7\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 219,\n                            \"y\": 267,\n                            \"uid\": 21\n                        },\n                        {\n                            \"plugin\": \"vector_transform\",\n                            \"x\": 341,\n                            \"y\": 190,\n                            \"uid\": 22\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 104,\n                            \"y\": 287,\n                            \"uid\": 23,\n                            \"state\": {\n                                \"val\": 0.5\n                            }\n                        },\n                        {\n                            \"plugin\": \"negate_modulator\",\n                            \"x\": 132,\n                            \"y\": 33,\n                            \"uid\": 24\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 92,\n                            \"y\": 457,\n                            \"uid\": 25,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"target elevation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 22,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 22,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 24,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"rotation\",\n                        \"dt\": 0,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"elevation\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"dolly\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"target elevation\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 3,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"camera\",\n                        \"dt\": 6,\n                        \"uid\": 3,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 85,\n                \"y\": 107,\n                \"uid\": 18,\n                \"state\": {\n                    \"val\": -7.2,\n                    \"min\": -180,\n                    \"max\": 180\n                },\n                \"title\": \"Rotation\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 473,\n                \"y\": 108,\n                \"uid\": 19,\n                \"state\": {\n                    \"val\": -0.8,\n                    \"min\": -20,\n                    \"max\": 20\n                },\n                \"title\": \"Elevation\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 279,\n                \"y\": 108,\n                \"uid\": 20,\n                \"state\": {\n                    \"val\": 2.9,\n                    \"min\": 0,\n                    \"max\": 10\n                },\n                \"title\": \"Dolly\"\n            },\n            {\n                \"plugin\": \"register_global_write\",\n                \"x\": 941,\n                \"y\": 110,\n                \"uid\": 21,\n                \"open\": false,\n                \"dsid\": 4,\n                \"state\": {\n                    \"slot_id\": 0\n                },\n                \"title\": \"camera\",\n                \"dyn_in\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 8,\n                        \"desc\": \"\",\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 670,\n                \"y\": 108,\n                \"uid\": 22,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": 0,\n                    \"max\": 10\n                },\n                \"title\": \"Target elevation\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 1,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 2,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 3,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 3,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 4,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 6,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 7,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 8,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 9,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 3,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 10,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 4,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 13,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 7,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 12,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 6,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 11,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 5,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 16,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 9,\n                \"dst_connected\": false,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 14,\n                \"dst_nuid\": 15,\n                \"src_slot\": 0,\n                \"dst_slot\": 2\n            },\n            {\n                \"src_nuid\": 18,\n                \"dst_nuid\": 17,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 19,\n                \"dst_nuid\": 17,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 20,\n                \"dst_nuid\": 17,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 17,\n                \"dst_nuid\": 21,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 22,\n                \"dst_nuid\": 17,\n                \"src_slot\": 0,\n                \"dst_slot\": 3,\n                \"dst_dyn\": true\n            }\n        ]\n    },\n    \"registers\": [\n        {\n            \"id\": \"camera\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"matrix\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"shinyness\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"light\",\n            \"dt\": 8\n        }\n    ]\n}"
  },
  {
    "path": "browser/patches/newset_3d_scene_with_full_controls.json",
    "content": "{\n    \"abs_t\": 2.066,\n    \"active_graph\": 1,\n    \"graph_uid\": 11,\n    \"root\": {\n        \"node_uid\": 1,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 370,\n                \"y\": 250,\n                \"uid\": 0,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {},\n                    \"output_sids\": {}\n                },\n                \"title\": \"Scene controls\",\n                \"graph\": {\n                    \"node_uid\": 49,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 232,\n                            \"y\": 10,\n                            \"uid\": 0,\n                            \"dsid\": 6,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"70\": 1,\n                                    \"73\": 2,\n                                    \"75\": 3,\n                                    \"76\": 4,\n                                    \"77\": 5\n                                },\n                                \"output_sids\": {}\n                            },\n                            \"title\": \"Scene loader\",\n                            \"graph\": {\n                                \"node_uid\": 78,\n                                \"uid\": 2,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"graph\",\n                                        \"x\": 889,\n                                        \"y\": 120,\n                                        \"uid\": 0,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"enabled\": true,\n                                            \"input_sids\": {\n                                                \"1\": 0,\n                                                \"2\": 1,\n                                                \"10\": 2,\n                                                \"21\": 5,\n                                                \"23\": 6\n                                            },\n                                            \"output_sids\": {}\n                                        },\n                                        \"title\": \"Scene loader\",\n                                        \"graph\": {\n                                            \"node_uid\": 26,\n                                            \"uid\": 3,\n                                            \"parent_uid\": 2,\n                                            \"open\": true,\n                                            \"nodes\": [\n                                                {\n                                                    \"plugin\": \"scene_renderer_emitter\",\n                                                    \"x\": 849,\n                                                    \"y\": 16,\n                                                    \"uid\": 0\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 11,\n                                                    \"y\": 308,\n                                                    \"uid\": 1,\n                                                    \"dsid\": 29,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"scene\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 11,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 707,\n                                                    \"y\": 122,\n                                                    \"uid\": 2,\n                                                    \"dsid\": 29,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"camera\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 6,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"scale_matrix\",\n                                                    \"x\": 648,\n                                                    \"y\": 205,\n                                                    \"uid\": 7\n                                                },\n                                                {\n                                                    \"plugin\": \"vector\",\n                                                    \"x\": 514,\n                                                    \"y\": 216,\n                                                    \"uid\": 8\n                                                },\n                                                {\n                                                    \"plugin\": \"divide_modulator\",\n                                                    \"x\": 400,\n                                                    \"y\": 235,\n                                                    \"uid\": 9\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 280,\n                                                    \"y\": 204,\n                                                    \"uid\": 10,\n                                                    \"dsid\": 29,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"mesh scale\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 0,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"max_modulator\",\n                                                    \"x\": 320,\n                                                    \"y\": 307,\n                                                    \"uid\": 11\n                                                },\n                                                {\n                                                    \"plugin\": \"vector_magnitude\",\n                                                    \"x\": 220,\n                                                    \"y\": 355,\n                                                    \"uid\": 12\n                                                },\n                                                {\n                                                    \"plugin\": \"vector_magnitude\",\n                                                    \"x\": 221,\n                                                    \"y\": 288,\n                                                    \"uid\": 13\n                                                },\n                                                {\n                                                    \"plugin\": \"scene_get_bounding_box\",\n                                                    \"x\": 89,\n                                                    \"y\": 307,\n                                                    \"uid\": 14\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 647,\n                                                    \"y\": 265,\n                                                    \"uid\": 21,\n                                                    \"dsid\": 28,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"transform\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 4,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"input_proxy\",\n                                                    \"x\": 605,\n                                                    \"y\": 72,\n                                                    \"uid\": 23,\n                                                    \"dsid\": 25,\n                                                    \"state\": {\n                                                        \"slot_id\": 0\n                                                    },\n                                                    \"title\": \"material\",\n                                                    \"dyn_out\": [\n                                                        {\n                                                            \"name\": \"output\",\n                                                            \"dt\": 12,\n                                                            \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                            \"uid\": 0,\n                                                            \"index\": 0,\n                                                            \"type\": 1,\n                                                            \"connected\": true\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"plugin\": \"concatenate_matrix_modulator\",\n                                                    \"x\": 743,\n                                                    \"y\": 204,\n                                                    \"uid\": 25\n                                                }\n                                            ],\n                                            \"conns\": [\n                                                {\n                                                    \"src_nuid\": 1,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 2,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 2,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 8,\n                                                    \"dst_nuid\": 7,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 9,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 9,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 9,\n                                                    \"dst_nuid\": 8,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 2,\n                                                    \"offset\": 2\n                                                },\n                                                {\n                                                    \"src_nuid\": 10,\n                                                    \"dst_nuid\": 9,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 11,\n                                                    \"dst_nuid\": 9,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 12,\n                                                    \"dst_nuid\": 11,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 13,\n                                                    \"dst_nuid\": 11,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 14,\n                                                    \"dst_nuid\": 13,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 14,\n                                                    \"dst_nuid\": 12,\n                                                    \"src_slot\": 1,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 1,\n                                                    \"dst_nuid\": 14,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true,\n                                                    \"offset\": 1\n                                                },\n                                                {\n                                                    \"src_nuid\": 23,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 7,\n                                                    \"dst_nuid\": 25,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 0\n                                                },\n                                                {\n                                                    \"src_nuid\": 21,\n                                                    \"dst_nuid\": 25,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 1,\n                                                    \"src_connected\": true,\n                                                    \"src_dyn\": true\n                                                },\n                                                {\n                                                    \"src_nuid\": 25,\n                                                    \"dst_nuid\": 0,\n                                                    \"src_slot\": 0,\n                                                    \"dst_slot\": 3\n                                                }\n                                            ]\n                                        },\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"scene\",\n                                                \"dt\": 11,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"camera\",\n                                                \"dt\": 6,\n                                                \"uid\": 1,\n                                                \"index\": 1,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"mesh scale\",\n                                                \"dt\": 0,\n                                                \"uid\": 2,\n                                                \"index\": 2,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"transform\",\n                                                \"dt\": 4,\n                                                \"uid\": 5,\n                                                \"index\": 3,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            },\n                                            {\n                                                \"name\": \"material\",\n                                                \"dt\": 12,\n                                                \"uid\": 6,\n                                                \"index\": 4,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 768,\n                                        \"y\": 125,\n                                        \"uid\": 70,\n                                        \"open\": false,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 766,\n                                        \"y\": 190,\n                                        \"uid\": 73,\n                                        \"open\": false,\n                                        \"dsid\": 14,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"transform\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 799,\n                                        \"y\": 31,\n                                        \"uid\": 75,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"scene\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 11,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 761,\n                                        \"y\": 300,\n                                        \"uid\": 76,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"mesh scale\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 776,\n                                        \"y\": 233,\n                                        \"uid\": 77,\n                                        \"dsid\": 11,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 70,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 73,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 75,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 76,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 77,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 4,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"transform\",\n                                    \"dt\": 4,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"scene\",\n                                    \"dt\": 11,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"mesh scale\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 5,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"register_global_read\",\n                            \"x\": 156,\n                            \"y\": 9,\n                            \"uid\": 1,\n                            \"open\": false,\n                            \"dsid\": 15,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"camera\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 6,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"register_global_read\",\n                            \"x\": 156,\n                            \"y\": 40,\n                            \"uid\": 3,\n                            \"open\": false,\n                            \"dsid\": 15,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 4,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 251,\n                            \"y\": 225,\n                            \"uid\": 4,\n                            \"open\": false,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"0\": 0,\n                                    \"1\": 1,\n                                    \"2\": 2,\n                                    \"27\": 6\n                                },\n                                \"output_sids\": {\n                                    \"3\": 3\n                                }\n                            },\n                            \"title\": \"Camera\",\n                            \"graph\": {\n                                \"node_uid\": 28,\n                                \"uid\": 4,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 74,\n                                        \"y\": 173,\n                                        \"uid\": 0,\n                                        \"dsid\": 28,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"rotation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 129,\n                                        \"y\": 89,\n                                        \"uid\": 1,\n                                        \"dsid\": 28,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"elevation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 52,\n                                        \"y\": 48,\n                                        \"uid\": 2,\n                                        \"dsid\": 28,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"dolly\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 558,\n                                        \"y\": 35,\n                                        \"uid\": 3,\n                                        \"dsid\": 28,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"perspective_camera\",\n                                        \"x\": 448,\n                                        \"y\": 75,\n                                        \"uid\": 4\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 218,\n                                        \"y\": 28,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"rotation_xyz_matrix\",\n                                        \"x\": 160,\n                                        \"y\": 153,\n                                        \"uid\": 6\n                                    },\n                                    {\n                                        \"plugin\": \"vector_transform\",\n                                        \"x\": 342,\n                                        \"y\": 77,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 219,\n                                        \"y\": 267,\n                                        \"uid\": 21\n                                    },\n                                    {\n                                        \"plugin\": \"vector_transform\",\n                                        \"x\": 341,\n                                        \"y\": 190,\n                                        \"uid\": 22\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 104,\n                                        \"y\": 287,\n                                        \"uid\": 23,\n                                        \"state\": {\n                                            \"val\": 0.5\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"negate_modulator\",\n                                        \"x\": 132,\n                                        \"y\": 33,\n                                        \"uid\": 24\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 102,\n                                        \"y\": 365,\n                                        \"uid\": 27,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"target elevation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 22,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 22,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 4,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 4\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 24,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 27,\n                                        \"dst_nuid\": 21,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"rotation\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"elevation\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"dolly\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"target elevation\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 3,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 49,\n                            \"y\": 225,\n                            \"uid\": 5,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -180,\n                                \"max\": 180\n                            },\n                            \"title\": \"Rotation\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 49,\n                            \"y\": 294,\n                            \"uid\": 6,\n                            \"state\": {\n                                \"val\": 1.2,\n                                \"min\": -20,\n                                \"max\": 20\n                            },\n                            \"title\": \"Elevation\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 49,\n                            \"y\": 368,\n                            \"uid\": 7,\n                            \"state\": {\n                                \"val\": 1.3,\n                                \"min\": 0,\n                                \"max\": 10\n                            },\n                            \"title\": \"Dolly\"\n                        },\n                        {\n                            \"plugin\": \"register_global_write\",\n                            \"x\": 324,\n                            \"y\": 225,\n                            \"uid\": 8,\n                            \"open\": false,\n                            \"dsid\": 15,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"camera\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 8,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 743,\n                            \"y\": 2,\n                            \"uid\": 9,\n                            \"open\": false,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"8\": 1,\n                                    \"9\": 2,\n                                    \"10\": 3\n                                },\n                                \"output_sids\": {\n                                    \"1\": 0\n                                }\n                            },\n                            \"title\": \"Rotate\",\n                            \"graph\": {\n                                \"node_uid\": 21,\n                                \"uid\": 5,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"rotation_xyz_matrix\",\n                                        \"x\": 367,\n                                        \"y\": 174,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 485,\n                                        \"y\": 174,\n                                        \"uid\": 1,\n                                        \"dsid\": 18,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 45,\n                                        \"y\": 80,\n                                        \"uid\": 8,\n                                        \"dsid\": 18,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"X\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 45,\n                                        \"y\": 170,\n                                        \"uid\": 9,\n                                        \"dsid\": 18,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 46,\n                                        \"y\": 257,\n                                        \"uid\": 10,\n                                        \"dsid\": 18,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 40,\n                                        \"y\": 386,\n                                        \"uid\": 11,\n                                        \"state\": {\n                                            \"val\": 180\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 15,\n                                        \"y\": 317,\n                                        \"uid\": 12,\n                                        \"state\": {\n                                            \"val\": 360\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 165,\n                                        \"y\": 80,\n                                        \"uid\": 15\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 260,\n                                        \"y\": 105,\n                                        \"uid\": 16\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 165,\n                                        \"y\": 170,\n                                        \"uid\": 17\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 260,\n                                        \"y\": 195,\n                                        \"uid\": 18\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 163,\n                                        \"y\": 257,\n                                        \"uid\": 19\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 258,\n                                        \"y\": 282,\n                                        \"uid\": 20\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 17,\n                                        \"dst_nuid\": 18,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 19,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 15,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 17,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 15,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 17,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 18,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 18,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 20,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"X\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Y\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Z\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 353,\n                            \"y\": -1,\n                            \"uid\": 10,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Rotate X\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 353,\n                            \"y\": 72,\n                            \"uid\": 11,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Rotate Y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 353,\n                            \"y\": 146,\n                            \"uid\": 12,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Rotate Z\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 741,\n                            \"y\": 65,\n                            \"uid\": 13,\n                            \"open\": false,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"13\": 5,\n                                    \"14\": 6,\n                                    \"15\": 7\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Scale\",\n                            \"graph\": {\n                                \"node_uid\": 16,\n                                \"uid\": 6,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scale_matrix\",\n                                        \"x\": 189,\n                                        \"y\": 49,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 278,\n                                        \"y\": 49,\n                                        \"uid\": 2,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 73,\n                                        \"y\": 49,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 7,\n                                        \"y\": 9,\n                                        \"uid\": 13,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 7,\n                                        \"y\": 69,\n                                        \"uid\": 14,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 7,\n                                        \"y\": 132,\n                                        \"uid\": 15,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 742,\n                            \"y\": 34,\n                            \"uid\": 14,\n                            \"open\": false,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"13\": 5,\n                                    \"14\": 6,\n                                    \"15\": 7\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Translate\",\n                            \"graph\": {\n                                \"node_uid\": 17,\n                                \"uid\": 7,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 291,\n                                        \"y\": 50,\n                                        \"uid\": 2,\n                                        \"dsid\": 19,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 74,\n                                        \"y\": 50,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 8,\n                                        \"y\": 10,\n                                        \"uid\": 13,\n                                        \"dsid\": 19,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 8,\n                                        \"y\": 70,\n                                        \"uid\": 14,\n                                        \"dsid\": 19,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 8,\n                                        \"y\": 129,\n                                        \"uid\": 15,\n                                        \"dsid\": 19,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"translation_matrix\",\n                                        \"x\": 191,\n                                        \"y\": 50,\n                                        \"uid\": 16\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 434,\n                            \"y\": -1,\n                            \"uid\": 15,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Position X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 434,\n                            \"y\": 60,\n                            \"uid\": 16,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Position Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 434,\n                            \"y\": 122,\n                            \"uid\": 17,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Position Z\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 634,\n                            \"y\": 0,\n                            \"uid\": 18,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Scale X\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 633,\n                            \"y\": 59,\n                            \"uid\": 19,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Scale Y\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 631,\n                            \"y\": 119,\n                            \"uid\": 20,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Scale Z\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 742,\n                            \"y\": 97,\n                            \"uid\": 21,\n                            \"open\": false,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"3\": 1,\n                                    \"4\": 2,\n                                    \"5\": 3\n                                },\n                                \"output_sids\": {\n                                    \"2\": 0\n                                }\n                            },\n                            \"title\": \"Concatenate x2\",\n                            \"graph\": {\n                                \"node_uid\": 6,\n                                \"uid\": 8,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 274,\n                                        \"y\": 13,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 92,\n                                        \"y\": 13,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 394,\n                                        \"y\": 13,\n                                        \"uid\": 2,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 197,\n                                        \"y\": 14,\n                                        \"uid\": 3,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 9,\n                                        \"y\": 13,\n                                        \"uid\": 4,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 9,\n                                        \"y\": 71,\n                                        \"uid\": 5,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"register_global_write\",\n                            \"x\": 742,\n                            \"y\": 131,\n                            \"uid\": 22,\n                            \"open\": false,\n                            \"dsid\": 14,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 4,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 726,\n                            \"y\": 268,\n                            \"uid\": 23,\n                            \"open\": false,\n                            \"dsid\": 14,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"14\": 2,\n                                    \"15\": 3,\n                                    \"16\": 4,\n                                    \"17\": 5,\n                                    \"18\": 6,\n                                    \"19\": 7\n                                },\n                                \"output_sids\": {\n                                    \"27\": 12\n                                }\n                            },\n                            \"title\": \"Light chain\",\n                            \"graph\": {\n                                \"node_uid\": 33,\n                                \"uid\": 9,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"light_type_modulator\",\n                                        \"x\": 762,\n                                        \"y\": 207,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"light_position_modulator\",\n                                        \"x\": 604,\n                                        \"y\": 215,\n                                        \"uid\": 2\n                                    },\n                                    {\n                                        \"plugin\": \"light_diffuse_color_modulator\",\n                                        \"x\": 200,\n                                        \"y\": 217,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"light_intensity_modulator\",\n                                        \"x\": 430,\n                                        \"y\": 219,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"light_specular_color_modulator\",\n                                        \"x\": 309,\n                                        \"y\": 219,\n                                        \"uid\": 6\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 494,\n                                        \"y\": 380,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 361,\n                                        \"y\": 467,\n                                        \"uid\": 14,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Pos x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 383,\n                                        \"y\": 549,\n                                        \"uid\": 15,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Pos y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 412,\n                                        \"y\": 627,\n                                        \"uid\": 16,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Pos z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 350,\n                                        \"y\": 358,\n                                        \"uid\": 17,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"intensity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 196,\n                                        \"y\": 340,\n                                        \"uid\": 18,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"specular color\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 3,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 93,\n                                        \"y\": 237,\n                                        \"uid\": 19,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"diffuse color\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 3,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 900,\n                                        \"y\": 133,\n                                        \"uid\": 27,\n                                        \"dsid\": 20,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 13,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"light_type_generator\",\n                                        \"x\": 618,\n                                        \"y\": 302,\n                                        \"uid\": 29,\n                                        \"state\": {\n                                            \"type\": 0\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"register_global_write\",\n                                        \"x\": 547,\n                                        \"y\": 549,\n                                        \"uid\": 30,\n                                        \"dsid\": 3,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"lightx\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"desc\": \"\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"register_global_write\",\n                                        \"x\": 547,\n                                        \"y\": 600,\n                                        \"uid\": 31,\n                                        \"dsid\": 4,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"lighty\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"desc\": \"\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"register_global_write\",\n                                        \"x\": 546,\n                                        \"y\": 649,\n                                        \"uid\": 32,\n                                        \"dsid\": 4,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"lightz\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"desc\": \"\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 17,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 18,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 19,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 29,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 30,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 32,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"dst_dyn\": true,\n                                        \"offset\": 1\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"Pos x\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Pos y\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Pos z\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"intensity\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"specular color\",\n                                    \"dt\": 3,\n                                    \"uid\": 6,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"diffuse color\",\n                                    \"dt\": 3,\n                                    \"uid\": 7,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"light\",\n                                    \"dt\": 13,\n                                    \"uid\": 12,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 341,\n                            \"y\": 268,\n                            \"uid\": 24,\n                            \"state\": {\n                                \"val\": 1.26,\n                                \"min\": 0,\n                                \"max\": 2\n                            },\n                            \"title\": \"Intensity\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 342,\n                            \"y\": 343,\n                            \"uid\": 25,\n                            \"state\": {\n                                \"val\": -0.32,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Light position X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 341,\n                            \"y\": 416,\n                            \"uid\": 26,\n                            \"state\": {\n                                \"val\": -0.12,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Light position Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 341,\n                            \"y\": 486,\n                            \"uid\": 27,\n                            \"state\": {\n                                \"val\": 0.92,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Light position Z\"\n                        },\n                        {\n                            \"plugin\": \"color_picker\",\n                            \"x\": 539,\n                            \"y\": 268,\n                            \"uid\": 28,\n                            \"state\": {\n                                \"hue\": 0,\n                                \"sat\": 0,\n                                \"lum\": 1\n                            },\n                            \"title\": \"Diffuse color\"\n                        },\n                        {\n                            \"plugin\": \"color_picker\",\n                            \"x\": 540,\n                            \"y\": 403,\n                            \"uid\": 29,\n                            \"state\": {\n                                \"hue\": 0,\n                                \"sat\": 0,\n                                \"lum\": 1\n                            },\n                            \"title\": \"Specular color\"\n                        },\n                        {\n                            \"plugin\": \"register_global_write\",\n                            \"x\": 824,\n                            \"y\": 271,\n                            \"uid\": 30,\n                            \"open\": false,\n                            \"dsid\": 12,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 13,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 254,\n                            \"y\": 270,\n                            \"uid\": 31,\n                            \"state\": {\n                                \"val\": 0.4399999999999997\n                            },\n                            \"title\": \"shinyness\"\n                        },\n                        {\n                            \"plugin\": \"register_global_write\",\n                            \"x\": 823,\n                            \"y\": 324,\n                            \"uid\": 32,\n                            \"open\": false,\n                            \"dsid\": 12,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"shinyness\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 48,\n                            \"y\": 440,\n                            \"uid\": 33,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": 0,\n                                \"max\": 1\n                            },\n                            \"title\": \"target elevation\"\n                        },\n                        {\n                            \"plugin\": \"url_scene_generator\",\n                            \"x\": 38,\n                            \"y\": 8,\n                            \"uid\": 34,\n                            \"state\": {\n                                \"url\": \"/data/scene/ladybug/scene.json\"\n                            }\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 36,\n                            \"y\": 70,\n                            \"uid\": 35,\n                            \"state\": {\n                                \"val\": 1,\n                                \"min\": 0,\n                                \"max\": 10\n                            },\n                            \"title\": \"Mesh scale\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 465,\n                            \"y\": 582,\n                            \"uid\": 36,\n                            \"open\": false,\n                            \"dsid\": 21,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"21\": 4,\n                                    \"22\": 5,\n                                    \"23\": 6,\n                                    \"24\": 7,\n                                    \"25\": 8,\n                                    \"39\": 12,\n                                    \"40\": 13,\n                                    \"41\": 14,\n                                    \"44\": 16,\n                                    \"47\": 18,\n                                    \"49\": 19\n                                },\n                                \"output_sids\": {\n                                    \"9\": 0\n                                }\n                            },\n                            \"title\": \"Material chain\",\n                            \"graph\": {\n                                \"node_uid\": 54,\n                                \"uid\": 10,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"material_diffuse_color_modulator\",\n                                        \"x\": 1029,\n                                        \"y\": 68,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"material_alpha_clip_modulator\",\n                                        \"x\": 1137,\n                                        \"y\": 68,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 1025,\n                                        \"y\": 145,\n                                        \"uid\": 6,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Alpha clip\"\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 1361,\n                                        \"y\": 68,\n                                        \"uid\": 9,\n                                        \"dsid\": 50,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_blend_mode_modulator\",\n                                        \"x\": 898,\n                                        \"y\": 69,\n                                        \"uid\": 10\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 134,\n                                        \"uid\": 21,\n                                        \"dsid\": 44,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 798,\n                                        \"y\": 183,\n                                        \"uid\": 22,\n                                        \"dsid\": 44,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 231,\n                                        \"uid\": 23,\n                                        \"dsid\": 44,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 799,\n                                        \"y\": 279,\n                                        \"uid\": 24,\n                                        \"dsid\": 44,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"alpha\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 800,\n                                        \"y\": 70,\n                                        \"uid\": 25,\n                                        \"dsid\": 44,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"blend mode\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 907,\n                                        \"y\": 147,\n                                        \"uid\": 26\n                                    },\n                                    {\n                                        \"plugin\": \"material_z_buffer_modulator\",\n                                        \"x\": 672,\n                                        \"y\": 65,\n                                        \"uid\": 27\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 564,\n                                        \"y\": 212,\n                                        \"uid\": 28,\n                                        \"state\": {\n                                            \"enabled\": true\n                                        },\n                                        \"title\": \"Z-buffer\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_shinyness_modulator\",\n                                        \"x\": 558,\n                                        \"y\": 64,\n                                        \"uid\": 31\n                                    },\n                                    {\n                                        \"plugin\": \"material_double_sided_modulator\",\n                                        \"x\": 437,\n                                        \"y\": 61,\n                                        \"uid\": 35\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 323,\n                                        \"y\": 161,\n                                        \"uid\": 36,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Double-sided\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_ambient_color_modulator\",\n                                        \"x\": 290,\n                                        \"y\": 73,\n                                        \"uid\": 37\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 63,\n                                        \"y\": 153,\n                                        \"uid\": 39,\n                                        \"dsid\": 45,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 60,\n                                        \"y\": 202,\n                                        \"uid\": 40,\n                                        \"dsid\": 45,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 63,\n                                        \"y\": 250,\n                                        \"uid\": 41,\n                                        \"dsid\": 45,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 170,\n                                        \"y\": 166,\n                                        \"uid\": 43\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 61,\n                                        \"y\": 99,\n                                        \"uid\": 44,\n                                        \"dsid\": 34,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 40,\n                                        \"y\": 52,\n                                        \"uid\": 47,\n                                        \"dsid\": 29,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 13,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_light_modulator\",\n                                        \"x\": 158,\n                                        \"y\": 22,\n                                        \"uid\": 48\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 54,\n                                        \"y\": 0,\n                                        \"uid\": 49,\n                                        \"dsid\": 26,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"light index\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 574,\n                                        \"y\": 276,\n                                        \"uid\": 50,\n                                        \"state\": {\n                                            \"enabled\": true\n                                        },\n                                        \"title\": \"Depth write\"\n                                    },\n                                    {\n                                        \"plugin\": \"register_global_read\",\n                                        \"x\": 477,\n                                        \"y\": 164,\n                                        \"uid\": 51,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"shinyness\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"value\",\n                                                \"dt\": 0,\n                                                \"desc\": \"\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 27,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 28,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 31,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 35,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 36,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 37,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 39,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 40,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 41,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 43,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 47,\n                                        \"dst_nuid\": 48,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 44,\n                                        \"dst_nuid\": 48,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 48,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 49,\n                                        \"dst_nuid\": 48,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 50,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 51,\n                                        \"dst_nuid\": 31,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"alpha\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"blend mode\",\n                                    \"dt\": 0,\n                                    \"uid\": 8,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 12,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 13,\n                                    \"index\": 6,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 14,\n                                    \"index\": 7,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 16,\n                                    \"index\": 8,\n                                    \"type\": 0,\n                                    \"is_connected\": false\n                                },\n                                {\n                                    \"name\": \"light\",\n                                    \"dt\": 13,\n                                    \"uid\": 18,\n                                    \"index\": 9,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                },\n                                {\n                                    \"name\": \"light index\",\n                                    \"dt\": 0,\n                                    \"uid\": 19,\n                                    \"index\": 10,\n                                    \"type\": 0\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 158,\n                            \"y\": 586,\n                            \"uid\": 37,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 230,\n                            \"y\": 588,\n                            \"uid\": 38,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Saturation\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 309,\n                            \"y\": 588,\n                            \"uid\": 39,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Luminosity\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 390,\n                            \"y\": 588,\n                            \"uid\": 40,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Alpha\"\n                        },\n                        {\n                            \"plugin\": \"blend_mode_generator\",\n                            \"x\": 42,\n                            \"y\": 661,\n                            \"uid\": 41,\n                            \"state\": {\n                                \"mode\": 4\n                            }\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 199,\n                            \"y\": 653,\n                            \"uid\": 42,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Ambient Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 291,\n                            \"y\": 653,\n                            \"uid\": 43,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Ambient Sat\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 379,\n                            \"y\": 653,\n                            \"uid\": 44,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Ambient Lum\"\n                        },\n                        {\n                            \"plugin\": \"url_texture_generator\",\n                            \"x\": 38,\n                            \"y\": 586,\n                            \"uid\": 45,\n                            \"state\": {\n                               \"url\": \"/data/image/f0e870569e5a143a8d3be0722e38e523141e4248.png\"\n                            },\n                            \"title\": \"Texture\"\n                        },\n                        {\n                            \"plugin\": \"material_texture_modulator\",\n                            \"x\": 201,\n                            \"y\": 725,\n                            \"uid\": 46,\n                            \"open\": false\n                        },\n                        {\n                            \"plugin\": \"register_global_read\",\n                            \"x\": 396,\n                            \"y\": 801,\n                            \"uid\": 47,\n                            \"open\": false,\n                            \"dsid\": 9,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 13,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 34,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 35,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 36,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 33,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 8,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 18,\n                            \"dst_nuid\": 13,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 13,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 20,\n                            \"dst_nuid\": 13,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 14,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 14,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 14,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 22,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 23,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 23,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 26,\n                            \"dst_nuid\": 23,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 27,\n                            \"dst_nuid\": 23,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 28,\n                            \"dst_nuid\": 23,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 29,\n                            \"dst_nuid\": 23,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 30,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 31,\n                            \"dst_nuid\": 32,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 38,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 39,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 40,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 41,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 44,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 7,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 43,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 6,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 42,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 47,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 9,\n                            \"dst_connected\": false,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 45,\n                            \"dst_nuid\": 46,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        }\n                    ]\n                }\n            }\n        ],\n        \"conns\": []\n    },\n    \"registers\": [\n        {\n            \"id\": \"camera\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"lightx\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"lighty\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"lightz\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"light\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"shinyness\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"matrix\",\n            \"dt\": 8\n        }\n    ]\n}"
  },
  {
    "path": "browser/patches/newset_camera_setup.json",
    "content": "{\n    \"abs_t\": 32.9,\n    \"active_graph\": 0,\n    \"graph_uid\": 5,\n    \"root\": {\n        \"node_uid\": 23,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 344,\n                \"y\": 267,\n                \"uid\": 17,\n                \"open\": false,\n                \"dsid\": 6,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"0\": 0,\n                        \"1\": 1,\n                        \"2\": 2,\n                        \"25\": 5\n                    },\n                    \"output_sids\": {\n                        \"3\": 3\n                    }\n                },\n                \"title\": \"Camera\",\n                \"graph\": {\n                    \"node_uid\": 26,\n                    \"uid\": 4,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 74,\n                            \"y\": 173,\n                            \"uid\": 0,\n                            \"dsid\": 16,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"rotation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 129,\n                            \"y\": 89,\n                            \"uid\": 1,\n                            \"dsid\": 16,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"elevation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 52,\n                            \"y\": 48,\n                            \"uid\": 2,\n                            \"dsid\": 16,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"dolly\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 558,\n                            \"y\": 35,\n                            \"uid\": 3,\n                            \"dsid\": 16,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"camera\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 6,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"perspective_camera\",\n                            \"x\": 448,\n                            \"y\": 75,\n                            \"uid\": 4\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 218,\n                            \"y\": 28,\n                            \"uid\": 5\n                        },\n                        {\n                            \"plugin\": \"rotation_xyz_matrix\",\n                            \"x\": 160,\n                            \"y\": 153,\n                            \"uid\": 6\n                        },\n                        {\n                            \"plugin\": \"vector_transform\",\n                            \"x\": 342,\n                            \"y\": 77,\n                            \"uid\": 7\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 219,\n                            \"y\": 267,\n                            \"uid\": 21\n                        },\n                        {\n                            \"plugin\": \"vector_transform\",\n                            \"x\": 341,\n                            \"y\": 190,\n                            \"uid\": 22\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 104,\n                            \"y\": 287,\n                            \"uid\": 23,\n                            \"state\": {\n                                \"val\": 0.5\n                            }\n                        },\n                        {\n                            \"plugin\": \"negate_modulator\",\n                            \"x\": 132,\n                            \"y\": 33,\n                            \"uid\": 24\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 92,\n                            \"y\": 457,\n                            \"uid\": 25,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"target elevation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 22,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 22,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 24,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"rotation\",\n                        \"dt\": 0,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"elevation\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"dolly\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"target elevation\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 3,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"camera\",\n                        \"dt\": 6,\n                        \"uid\": 3,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 145,\n                \"y\": 266,\n                \"uid\": 18,\n                \"state\": {\n                    \"val\": -7.2,\n                    \"min\": -180,\n                    \"max\": 180\n                },\n                \"title\": \"Rotation\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 145,\n                \"y\": 336,\n                \"uid\": 19,\n                \"state\": {\n                    \"val\": -0.8,\n                    \"min\": -20,\n                    \"max\": 20\n                },\n                \"title\": \"Elevation\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 145,\n                \"y\": 410,\n                \"uid\": 20,\n                \"state\": {\n                    \"val\": 2.9,\n                    \"min\": 0,\n                    \"max\": 10\n                },\n                \"title\": \"Dolly\"\n            },\n            {\n                \"plugin\": \"register_global_write\",\n                \"x\": 421,\n                \"y\": 267,\n                \"uid\": 21,\n                \"open\": false,\n                \"dsid\": 3,\n                \"state\": {\n                    \"slot_id\": 0\n                },\n                \"title\": \"camera\",\n                \"dyn_in\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 8,\n                        \"desc\": \"\",\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 145,\n                \"y\": 486,\n                \"uid\": 22,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": 0,\n                    \"max\": 10\n                },\n                \"title\": \"Target elevation\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 18,\n                \"dst_nuid\": 17,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 19,\n                \"dst_nuid\": 17,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 20,\n                \"dst_nuid\": 17,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 17,\n                \"dst_nuid\": 21,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 22,\n                \"dst_nuid\": 17,\n                \"src_slot\": 0,\n                \"dst_slot\": 3,\n                \"dst_dyn\": true\n            }\n        ]\n    },\n    \"registers\": [\n        {\n            \"id\": \"camera\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"shinyness\",\n            \"dt\": 8\n        }\n    ]\n}"
  },
  {
    "path": "browser/patches/newset_matrix_transform_setup.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 5,\n    \"root\": {\n        \"node_uid\": 14,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 517,\n                \"y\": 87,\n                \"uid\": 0,\n                \"open\": false,\n                \"dsid\": 4,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"8\": 1,\n                        \"9\": 2,\n                        \"10\": 3\n                    },\n                    \"output_sids\": {\n                        \"1\": 0\n                    }\n                },\n                \"title\": \"Rotate\",\n                \"graph\": {\n                    \"node_uid\": 21,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"rotation_xyz_matrix\",\n                            \"x\": 367,\n                            \"y\": 174,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 485,\n                            \"y\": 174,\n                            \"uid\": 1,\n                            \"dsid\": 6,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 45,\n                            \"y\": 80,\n                            \"uid\": 8,\n                            \"dsid\": 6,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"X\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 45,\n                            \"y\": 170,\n                            \"uid\": 9,\n                            \"dsid\": 6,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Y\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 46,\n                            \"y\": 257,\n                            \"uid\": 10,\n                            \"dsid\": 6,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Z\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 40,\n                            \"y\": 386,\n                            \"uid\": 11,\n                            \"state\": {\n                                \"val\": 180\n                            }\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 15,\n                            \"y\": 317,\n                            \"uid\": 12,\n                            \"state\": {\n                                \"val\": 360\n                            }\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 165,\n                            \"y\": 80,\n                            \"uid\": 15\n                        },\n                        {\n                            \"plugin\": \"subtract_modulator\",\n                            \"x\": 260,\n                            \"y\": 105,\n                            \"uid\": 16\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 165,\n                            \"y\": 170,\n                            \"uid\": 17\n                        },\n                        {\n                            \"plugin\": \"subtract_modulator\",\n                            \"x\": 260,\n                            \"y\": 195,\n                            \"uid\": 18\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 163,\n                            \"y\": 257,\n                            \"uid\": 19\n                        },\n                        {\n                            \"plugin\": \"subtract_modulator\",\n                            \"x\": 258,\n                            \"y\": 282,\n                            \"uid\": 20\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 18,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 20,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 8,\n                            \"dst_nuid\": 15,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 17,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 15,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 17,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"offset\": 2\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 18,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 20,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"offset\": 2\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 18,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 20,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"X\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Y\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Z\",\n                        \"dt\": 0,\n                        \"uid\": 3,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 226,\n                \"y\": 78,\n                \"uid\": 1,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Rotate X\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 226,\n                \"y\": 151,\n                \"uid\": 2,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Rotate Y\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 226,\n                \"y\": 225,\n                \"uid\": 3,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Rotate Z\"\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 515,\n                \"y\": 150,\n                \"uid\": 4,\n                \"open\": false,\n                \"dsid\": 8,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"13\": 5,\n                        \"14\": 6,\n                        \"15\": 7\n                    },\n                    \"output_sids\": {\n                        \"2\": 1\n                    }\n                },\n                \"title\": \"Scale\",\n                \"graph\": {\n                    \"node_uid\": 16,\n                    \"uid\": 2,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"scale_matrix\",\n                            \"x\": 189,\n                            \"y\": 49,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 278,\n                            \"y\": 49,\n                            \"uid\": 2,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 73,\n                            \"y\": 49,\n                            \"uid\": 3\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 7,\n                            \"y\": 9,\n                            \"uid\": 13,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"x\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 7,\n                            \"y\": 69,\n                            \"uid\": 14,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"y\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 7,\n                            \"y\": 132,\n                            \"uid\": 15,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"z\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"x\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"y\",\n                        \"dt\": 0,\n                        \"uid\": 6,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"z\",\n                        \"dt\": 0,\n                        \"uid\": 7,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 516,\n                \"y\": 119,\n                \"uid\": 5,\n                \"open\": false,\n                \"dsid\": 8,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"13\": 5,\n                        \"14\": 6,\n                        \"15\": 7\n                    },\n                    \"output_sids\": {\n                        \"2\": 1\n                    }\n                },\n                \"title\": \"Translate\",\n                \"graph\": {\n                    \"node_uid\": 17,\n                    \"uid\": 3,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 291,\n                            \"y\": 50,\n                            \"uid\": 2,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 74,\n                            \"y\": 50,\n                            \"uid\": 3\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 8,\n                            \"y\": 10,\n                            \"uid\": 13,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"x\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 8,\n                            \"y\": 70,\n                            \"uid\": 14,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"y\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 8,\n                            \"y\": 129,\n                            \"uid\": 15,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"z\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"translation_matrix\",\n                            \"x\": 191,\n                            \"y\": 50,\n                            \"uid\": 16\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"x\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"y\",\n                        \"dt\": 0,\n                        \"uid\": 6,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"z\",\n                        \"dt\": 0,\n                        \"uid\": 7,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 313,\n                \"y\": 82,\n                \"uid\": 6,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Position X\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 313,\n                \"y\": 143,\n                \"uid\": 7,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Position Y\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 313,\n                \"y\": 205,\n                \"uid\": 8,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Position Z\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 116,\n                \"y\": 86,\n                \"uid\": 9,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Scale X\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 115,\n                \"y\": 145,\n                \"uid\": 10,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Scale Y\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 113,\n                \"y\": 205,\n                \"uid\": 11,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Scale Z\"\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 516,\n                \"y\": 182,\n                \"uid\": 12,\n                \"open\": false,\n                \"dsid\": 4,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"3\": 1,\n                        \"4\": 2,\n                        \"5\": 3\n                    },\n                    \"output_sids\": {\n                        \"2\": 0\n                    }\n                },\n                \"title\": \"Concatenate x2\",\n                \"graph\": {\n                    \"node_uid\": 6,\n                    \"uid\": 4,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"concatenate_matrix_modulator\",\n                            \"x\": 274,\n                            \"y\": 13,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"concatenate_matrix_modulator\",\n                            \"x\": 92,\n                            \"y\": 13,\n                            \"uid\": 1\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 394,\n                            \"y\": 13,\n                            \"uid\": 2,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 197,\n                            \"y\": 14,\n                            \"uid\": 3,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 9,\n                            \"y\": 13,\n                            \"uid\": 4,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 9,\n                            \"y\": 71,\n                            \"uid\": 5,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 2,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 3,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"register_global_write\",\n                \"x\": 516,\n                \"y\": 216,\n                \"uid\": 13,\n                \"open\": false,\n                \"dsid\": 2,\n                \"state\": {\n                    \"slot_id\": 0\n                },\n                \"title\": \"matrix\",\n                \"dyn_in\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 4,\n                        \"desc\": \"\",\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ]\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 1,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 2,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 3,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 6,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 7,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 8,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 9,\n                \"dst_nuid\": 4,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 10,\n                \"dst_nuid\": 4,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 11,\n                \"dst_nuid\": 4,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 12,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 0,\n                \"dst_nuid\": 12,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 12,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 12,\n                \"dst_nuid\": 13,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            }\n        ]\n    },\n    \"registers\": [\n        {\n            \"id\": \"matrix\",\n            \"dt\": 8\n        }\n    ]\n}"
  },
  {
    "path": "browser/patches/newset_point_light.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 2,\n    \"root\": {\n        \"node_uid\": 10,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 606,\n                \"y\": 148,\n                \"uid\": 0,\n                \"open\": false,\n                \"dsid\": 14,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"14\": 2,\n                        \"15\": 3,\n                        \"16\": 4,\n                        \"17\": 5,\n                        \"18\": 6,\n                        \"19\": 7\n                    },\n                    \"output_sids\": {\n                        \"27\": 12\n                    }\n                },\n                \"title\": \"Light chain\",\n                \"graph\": {\n                    \"node_uid\": 35,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"light_type_modulator\",\n                            \"x\": 762,\n                            \"y\": 207,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"light_position_modulator\",\n                            \"x\": 604,\n                            \"y\": 215,\n                            \"uid\": 2\n                        },\n                        {\n                            \"plugin\": \"light_diffuse_color_modulator\",\n                            \"x\": 200,\n                            \"y\": 217,\n                            \"uid\": 3\n                        },\n                        {\n                            \"plugin\": \"light_intensity_modulator\",\n                            \"x\": 430,\n                            \"y\": 219,\n                            \"uid\": 5\n                        },\n                        {\n                            \"plugin\": \"light_specular_color_modulator\",\n                            \"x\": 309,\n                            \"y\": 219,\n                            \"uid\": 6\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 494,\n                            \"y\": 380,\n                            \"uid\": 7\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 361,\n                            \"y\": 467,\n                            \"uid\": 14,\n                            \"dsid\": 21,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Pos x\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 383,\n                            \"y\": 549,\n                            \"uid\": 15,\n                            \"dsid\": 22,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Pos y\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 412,\n                            \"y\": 627,\n                            \"uid\": 16,\n                            \"dsid\": 23,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Pos z\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 350,\n                            \"y\": 358,\n                            \"uid\": 17,\n                            \"dsid\": 21,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"intensity\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 196,\n                            \"y\": 340,\n                            \"uid\": 18,\n                            \"dsid\": 21,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"specular color\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 3,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 93,\n                            \"y\": 237,\n                            \"uid\": 19,\n                            \"dsid\": 22,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"diffuse color\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 3,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 900,\n                            \"y\": 133,\n                            \"uid\": 27,\n                            \"dsid\": 20,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"light\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 13,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"light_type_generator\",\n                            \"x\": 618,\n                            \"y\": 302,\n                            \"uid\": 29,\n                            \"state\": {\n                                \"type\": 0\n                            }\n                        },\n                        {\n                            \"plugin\": \"register_global_write\",\n                            \"x\": 471,\n                            \"y\": 481,\n                            \"uid\": 32,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"lightx\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"register_global_write\",\n                            \"x\": 492,\n                            \"y\": 561,\n                            \"uid\": 33,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"lighty\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"register_global_write\",\n                            \"x\": 511,\n                            \"y\": 630,\n                            \"uid\": 34,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"lightz\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 18,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 29,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 32,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 33,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 34,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Pos x\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Pos y\",\n                        \"dt\": 0,\n                        \"uid\": 3,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Pos z\",\n                        \"dt\": 0,\n                        \"uid\": 4,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"intensity\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 3,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"specular color\",\n                        \"dt\": 3,\n                        \"uid\": 6,\n                        \"index\": 4,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"diffuse color\",\n                        \"dt\": 3,\n                        \"uid\": 7,\n                        \"index\": 5,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"light\",\n                        \"dt\": 13,\n                        \"uid\": 12,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 218,\n                \"y\": 141,\n                \"uid\": 1,\n                \"state\": {\n                    \"val\": 1.26,\n                    \"min\": 0,\n                    \"max\": 2\n                },\n                \"title\": \"Intensity\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 219,\n                \"y\": 216,\n                \"uid\": 2,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Light position X\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 218,\n                \"y\": 289,\n                \"uid\": 3,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Light position Y\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 218,\n                \"y\": 359,\n                \"uid\": 4,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Light position Z\"\n            },\n            {\n                \"plugin\": \"color_picker\",\n                \"x\": 416,\n                \"y\": 141,\n                \"uid\": 5,\n                \"state\": {\n                    \"hue\": 0,\n                    \"sat\": 0,\n                    \"lum\": 1\n                },\n                \"title\": \"Diffuse color\"\n            },\n            {\n                \"plugin\": \"color_picker\",\n                \"x\": 417,\n                \"y\": 276,\n                \"uid\": 6,\n                \"state\": {\n                    \"hue\": 0,\n                    \"sat\": 0,\n                    \"lum\": 1\n                },\n                \"title\": \"Specular color\"\n            },\n            {\n                \"plugin\": \"register_global_write\",\n                \"x\": 607,\n                \"y\": 187,\n                \"uid\": 7,\n                \"open\": false,\n                \"dsid\": 12,\n                \"state\": {\n                    \"slot_id\": 0\n                },\n                \"title\": \"light\",\n                \"dyn_in\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 13,\n                        \"desc\": \"\",\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 131,\n                \"y\": 143,\n                \"uid\": 8,\n                \"state\": {\n                    \"val\": 0.4399999999999997\n                },\n                \"title\": \"shinyness\"\n            },\n            {\n                \"plugin\": \"register_global_write\",\n                \"x\": 608,\n                \"y\": 222,\n                \"uid\": 9,\n                \"dsid\": 12,\n                \"state\": {\n                    \"slot_id\": 0\n                },\n                \"title\": \"shinyness\",\n                \"dyn_in\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 0,\n                        \"desc\": \"\",\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ]\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 1,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 3,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 2,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 3,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 5,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 6,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 4,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 0,\n                \"dst_nuid\": 7,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 8,\n                \"dst_nuid\": 9,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            }\n        ]\n    },\n    \"registers\": [\n        {\n            \"id\": \"lightx\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"lighty\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"lightz\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"light\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"shinyness\",\n            \"dt\": 8\n        }\n    ]\n}"
  },
  {
    "path": "browser/patches/newset_synch_add.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 1791,\n    \"root\": {\n        \"node_uid\": 226,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"register_global_read\",\n                \"x\": 282,\n                \"y\": 457,\n                \"uid\": 221,\n                \"dsid\": 2,\n                \"state\": {\n                    \"slot_id\": 0\n                },\n                \"title\": \"synch\",\n                \"dyn_out\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 0,\n                        \"desc\": \"\",\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 308,\n                \"y\": 540,\n                \"uid\": 222,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Base value\"\n            },\n            {\n                \"plugin\": \"add_modulator\",\n                \"x\": 440,\n                \"y\": 498,\n                \"uid\": 223,\n                \"open\": false\n            },\n            {\n                \"plugin\": \"lowpass_filter_modulator\",\n                \"x\": 530,\n                \"y\": 489,\n                \"uid\": 224\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 441,\n                \"y\": 531,\n                \"uid\": 225,\n                \"state\": {\n                    \"val\": 0.8400000000000004\n                },\n                \"title\": \"Filter\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 221,\n                \"dst_nuid\": 223,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"src_dyn\": true\n            },\n            {\n                \"src_nuid\": 222,\n                \"dst_nuid\": 223,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 223,\n                \"dst_nuid\": 224,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 225,\n                \"dst_nuid\": 224,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            }\n        ]\n    },\n    \"registers\": [\n        {\n            \"id\": \"amps\",\n            \"dt\": 0\n        },\n        {\n            \"id\": \"bd\",\n            \"dt\": 0\n        },\n        {\n            \"id\": \"sd\",\n            \"dt\": 0\n        },\n        {\n            \"id\": \"synch\",\n            \"dt\": 0\n        },\n        {\n            \"id\": \"camera\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"matrix\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"lightx\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"lighty\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"lightz\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"light\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"shinyness\",\n            \"dt\": 8\n        }\n    ]\n}"
  },
  {
    "path": "browser/patches/newset_synch_substract.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 1,\n    \"root\": {\n        \"node_uid\": 6,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"register_global_read\",\n                \"x\": 402,\n                \"y\": 326,\n                \"uid\": 0,\n                \"dsid\": 3,\n                \"state\": {\n                    \"slot_id\": 0\n                },\n                \"title\": \"synch\",\n                \"dyn_out\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 0,\n                        \"desc\": \"\",\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 370,\n                \"y\": 389,\n                \"uid\": 1,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Base value\"\n            },\n            {\n                \"plugin\": \"lowpass_filter_modulator\",\n                \"x\": 581,\n                \"y\": 364,\n                \"uid\": 3\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 483,\n                \"y\": 408,\n                \"uid\": 4,\n                \"state\": {\n                    \"val\": 0.8400000000000004\n                },\n                \"title\": \"Filter\"\n            },\n            {\n                \"plugin\": \"subtract_modulator\",\n                \"x\": 484,\n                \"y\": 367,\n                \"uid\": 5,\n                \"open\": false\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 3,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 0,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"src_dyn\": true\n            },\n            {\n                \"src_nuid\": 1,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 3,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            }\n        ]\n    },\n    \"registers\": [\n        {\n            \"id\": \"synch\",\n            \"dt\": 8\n        }\n    ]\n}"
  },
  {
    "path": "browser/patches/newset_synch_synchtrack.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 2,\n    \"root\": {\n        \"node_uid\": 11,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"url_audio_generator\",\n                \"x\": 11,\n                \"y\": 48,\n                \"uid\": 0,\n                \"state\": {\n                    \"url\": \"data/demos/radix/tiger_timing\"\n                }\n            },\n            {\n                \"plugin\": \"audio_player\",\n                \"x\": 559,\n                \"y\": 175,\n                \"uid\": 1\n            },\n            {\n                \"plugin\": \"toggle_button\",\n                \"x\": 412,\n                \"y\": 108,\n                \"uid\": 2,\n                \"open\": false,\n                \"state\": {\n                    \"enabled\": true\n                },\n                \"title\": \"Play\"\n            },\n            {\n                \"plugin\": \"toggle_button\",\n                \"x\": 412,\n                \"y\": 152,\n                \"uid\": 3,\n                \"open\": false,\n                \"state\": {\n                    \"enabled\": false\n                },\n                \"title\": \"Mute audio\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 413,\n                \"y\": 189,\n                \"uid\": 4,\n                \"open\": false,\n                \"state\": {\n                    \"val\": 0.49999999999999956\n                },\n                \"title\": \"Volume\"\n            },\n            {\n                \"plugin\": \"audio_get_duration_modulator\",\n                \"x\": 333,\n                \"y\": 225,\n                \"uid\": 5,\n                \"open\": false\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 321,\n                \"y\": 150,\n                \"uid\": 6,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Position\"\n            },\n            {\n                \"plugin\": \"multiply_modulator\",\n                \"x\": 426,\n                \"y\": 225,\n                \"uid\": 7,\n                \"open\": false\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 176,\n                \"y\": 40,\n                \"uid\": 8,\n                \"dsid\": 4,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {\n                        \"9\": 0,\n                        \"10\": 1\n                    },\n                    \"output_sids\": {\n                        \"12\": 3\n                    }\n                },\n                \"title\": \"Synchtrack for audio\",\n                \"graph\": {\n                    \"node_uid\": 17,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"audio_get_current_time_modulator\",\n                            \"x\": 109,\n                            \"y\": 258,\n                            \"uid\": 1\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 109,\n                            \"y\": 190,\n                            \"uid\": 5,\n                            \"state\": {\n                                \"val\": 30\n                            }\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 252,\n                            \"y\": 179,\n                            \"uid\": 6\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 455,\n                            \"y\": 168,\n                            \"uid\": 8,\n                            \"title\": \"Amp signal\"\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 26,\n                            \"y\": 259,\n                            \"uid\": 9,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"audio\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 10,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 247,\n                            \"y\": 257,\n                            \"uid\": 10,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Amp amount\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 562,\n                            \"y\": 169,\n                            \"uid\": 12,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"synch\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"url_json_generator\",\n                            \"x\": 10,\n                            \"y\": 40,\n                            \"uid\": 13,\n                            \"state\": {\n                                \"url\": \"data/demos/radix/tiger-drums-bd.json\"\n                            }\n                        },\n                        {\n                            \"plugin\": \"member_to_typed_array_modulator\",\n                            \"x\": 151,\n                            \"y\": 62,\n                            \"uid\": 14,\n                            \"state\": {\n                                \"datatype\": 6\n                            }\n                        },\n                        {\n                            \"plugin\": \"label_generator\",\n                            \"x\": 11,\n                            \"y\": 124,\n                            \"uid\": 15,\n                            \"state\": {\n                                \"text\": \"data\"\n                            }\n                        },\n                        {\n                            \"plugin\": \"array_get_modulator\",\n                            \"x\": 360,\n                            \"y\": 133,\n                            \"uid\": 16\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"offset\": 3\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 8,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 8,\n                            \"dst_nuid\": 12,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 14,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 14,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 8,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"audio\",\n                        \"dt\": 10,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Amp amount\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"synch\",\n                        \"dt\": 0,\n                        \"uid\": 3,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 10,\n                \"y\": 115,\n                \"uid\": 9,\n                \"state\": {\n                    \"val\": 100\n                },\n                \"title\": \"Amp\"\n            },\n            {\n                \"plugin\": \"register_global_write\",\n                \"x\": 370,\n                \"y\": 40,\n                \"uid\": 10,\n                \"dsid\": 5,\n                \"state\": {\n                    \"slot_id\": 0\n                },\n                \"title\": \"synch\",\n                \"dyn_in\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 0,\n                        \"desc\": \"\",\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true,\n                        \"connected\": false\n                    }\n                ]\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 0,\n                \"dst_nuid\": 1,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 0,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"offset\": 1\n            },\n            {\n                \"src_nuid\": 2,\n                \"dst_nuid\": 1,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 3,\n                \"dst_nuid\": 1,\n                \"src_slot\": 0,\n                \"dst_slot\": 2\n            },\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 1,\n                \"src_slot\": 0,\n                \"dst_slot\": 3\n            },\n            {\n                \"src_nuid\": 7,\n                \"dst_nuid\": 1,\n                \"src_slot\": 0,\n                \"dst_slot\": 4\n            },\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 7,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 6,\n                \"dst_nuid\": 7,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 9,\n                \"dst_nuid\": 8,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 8,\n                \"dst_nuid\": 10,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_connected\": false,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 0,\n                \"dst_nuid\": 8,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true,\n                \"offset\": 2\n            }\n        ]\n    },\n    \"registers\": [\n        {\n            \"id\": \"synch\",\n            \"dt\": 8\n        }\n    ]\n}\n"
  },
  {
    "path": "browser/patches/newset_transform_translate.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 5,\n    \"root\": {\n        \"node_uid\": 14,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 328,\n                \"y\": 83,\n                \"uid\": 5,\n                \"open\": false,\n                \"dsid\": 8,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"13\": 5,\n                        \"14\": 6,\n                        \"15\": 7\n                    },\n                    \"output_sids\": {\n                        \"2\": 1\n                    }\n                },\n                \"title\": \"Translate\",\n                \"graph\": {\n                    \"node_uid\": 17,\n                    \"uid\": 3,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 291,\n                            \"y\": 50,\n                            \"uid\": 2,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 74,\n                            \"y\": 50,\n                            \"uid\": 3\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 8,\n                            \"y\": 10,\n                            \"uid\": 13,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"x\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 8,\n                            \"y\": 70,\n                            \"uid\": 14,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"y\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 8,\n                            \"y\": 129,\n                            \"uid\": 15,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"z\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"translation_matrix\",\n                            \"x\": 191,\n                            \"y\": 50,\n                            \"uid\": 16\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"x\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"y\",\n                        \"dt\": 0,\n                        \"uid\": 6,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"z\",\n                        \"dt\": 0,\n                        \"uid\": 7,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 131,\n                \"y\": 80,\n                \"uid\": 6,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Position X\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 131,\n                \"y\": 141,\n                \"uid\": 7,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Position Y\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 131,\n                \"y\": 203,\n                \"uid\": 8,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Position Z\"\n            },\n            {\n                \"plugin\": \"register_global_write\",\n                \"x\": 328,\n                \"y\": 118,\n                \"uid\": 13,\n                \"open\": false,\n                \"dsid\": 2,\n                \"state\": {\n                    \"slot_id\": 0\n                },\n                \"title\": \"matrix\",\n                \"dyn_in\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 4,\n                        \"desc\": \"\",\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ]\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 6,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 7,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 8,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 13,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            }\n        ]\n    },\n    \"registers\": [\n        {\n            \"id\": \"matrix\",\n            \"dt\": 8\n        }\n    ]\n}"
  },
  {
    "path": "browser/patches/patches.json",
    "content": "{\r\n\r\n    \"EXAMPLES\": {\r\n        \"Rotating box\": {\r\n            \"name\": \"_example-rotating-cube\"\r\n        },\r\n        \"Gaze click: Button shows a screen\": {\r\n            \"name\": \"_example-gaze-button\"\r\n        },\r\n        \"Gaze click: switch object position\": {\r\n            \"name\": \"_example-switch-box-position-on-gaze-click\"\r\n        },\r\n        \"Inputs to Array\": {\r\n            \"name\": \"_example-inputs-to-array\"\r\n        },\r\n        \"Spawn particles from mesh\": {\r\n            \"name\": \"_example-particle-spawn-from-mesh\"\r\n        }\r\n    },\r\n\r\n    \"COMPONENTS: Wobble\": {\r\n        \"Wobble on Y axis\": {\r\n            \"name\": \"components/wobble-y-axis\",\r\n            \"type\": \"entity_component\"\r\n        }\r\n    },\r\n\r\n    \"COMPONENTS: Rotation\": {\r\n        \"Rotation on Y axis\": {\r\n            \"name\": \"components/rotation-y-axis\",\r\n            \"type\": \"entity_component\"\r\n        },\r\n        \"Rotation on all axes\": {\r\n            \"name\": \"components/rotation-all-axes\",\r\n            \"type\": \"entity_component\"\r\n        }\r\n    },\r\n\r\n    \"OBJECTS: BASIC\": {\r\n        \"3D model\": {\r\n            \"name\": \"_add-3d-model\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Box\": {\r\n            \"name\": \"_add-box\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"360 photo\": {\r\n            \"name\": \"_add-360-photo\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Sphere\": {\r\n            \"name\": \"_add-sphere\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Dodecahedron\": {\r\n            \"name\": \"_add-dodecahedron\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Plane\": {\r\n            \"name\": \"_add-plane-no-shading\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Cylinder\": {\r\n            \"name\": \"_add-cylinder\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Torus\": {\r\n            \"name\": \"_add-torus\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Ring\": {\r\n            \"name\": \"_add-ring\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Sky sphere\": {\r\n            \"name\": \"_add-sky-sphere\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Floor\": {\r\n            \"name\": \"_add-floor\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Room\": {\r\n            \"name\": \"_add-room\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Text\": {\r\n            \"name\": \"_add-text\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Stereo Cubemap\": {\r\n            \"name\": \"_add_stereo_cubemap\",\r\n            \"type\": \"entity\"\r\n        }\r\n    },\r\n\r\n    \"OBJECTS: ISLAND\": {\r\n        \"Base Rock\": {\r\n            \"name\": \"_add_object_preset_island-valley-baserock\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Leaf Tree\": {\r\n            \"name\": \"_add_object_preset_island-leaftreea\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Palm Tree\": {\r\n            \"name\": \"_add_object_preset_island-palmtree\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Low Stone A\": {\r\n            \"name\": \"_add_object_preset_island-stone-a\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Low Stone B\": {\r\n            \"name\": \"_add_object_preset_island-stone-c\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"High Stone A\": {\r\n            \"name\": \"_add_object_preset_island-stone-b\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"High Stone B\": {\r\n            \"name\": \"_add_object_preset_island-stone-d\",\r\n            \"type\": \"entity\"\r\n        }\r\n    },\r\n\r\n    \"OBJECTS: MOUNTAIN\": {\r\n        \"Mountain\": {\r\n            \"name\": \"_add_object_preset_Mountain_02\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Pine Tree\": {\r\n            \"name\": \"_add_object_preset_Mountain_PineTree_02\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Bush\": {\r\n            \"name\": \"_add_object_preset_Mountain_bush_01\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Crystal\": {\r\n            \"name\": \"_add_object_preset_Mountain_crystal_01\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Green\": {\r\n            \"name\": \"_add_object_preset_Mountain_green_01\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Plump Tree\": {\r\n            \"name\": \"_add_object_preset_Mountain_plumptree_01\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Plump Tree 2\": {\r\n            \"name\": \"_add_object_preset_Mountain_plumptree_02\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Rocks\": {\r\n            \"name\": \"_add_object_preset_Mountain_rocks_01\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Telescope\": {\r\n            \"name\": \"_add_object_preset_Mountain_scope_01\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Shroom\": {\r\n            \"name\": \"_add_object_preset_Mountain_shroom_01\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Small Base\": {\r\n            \"name\": \"_add_object_preset_Mountain_small_base_01\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Small Base 2\": {\r\n            \"name\": \"_add_object_preset_Mountain_small_base_02\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Water\": {\r\n            \"name\": \"_add_object_preset_Mountain_water_02\",\r\n            \"type\": \"entity\"\r\n        }\r\n    },\r\n\r\n    \"OBJECTS: LAB\": {\r\n        \"Lab\": {\r\n            \"name\": \"_add_object_preset_Labv9\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Genius\": {\r\n            \"name\": \"_add_object_preset_Labv4-Genius_02\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Happy Dude\": {\r\n            \"name\": \"_add_object_preset_Labv4_Happy_02\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Ceiling Lights\": {\r\n            \"name\": \"_add_object_preset_Labv8lights\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Television\": {\r\n            \"name\": \"_add_object_preset_LabvTV\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Boom Box\": {\r\n            \"name\": \"_add_object_preset_Labvboombox\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Box\": {\r\n            \"name\": \"_add_object_preset_Labvbox\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Desk\": {\r\n            \"name\": \"_add_object_preset_Labvdesk\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Glasses\": {\r\n            \"name\": \"_add_object_preset_Labvglasses\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Globe\": {\r\n            \"name\": \"_add_object_preset_Labvglobe\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Light\": {\r\n            \"name\": \"_add_object_preset_Labvlight2\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Mic\": {\r\n            \"name\": \"_add_object_preset_Labvmic\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Rocket\": {\r\n            \"name\": \"_add_object_preset_Labvrocket\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Stool\": {\r\n            \"name\": \"_add_object_preset_Labvstool\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Trash\": {\r\n            \"name\": \"_add_object_preset_Labvtrash\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Wrench\": {\r\n            \"name\": \"_add_object_preset_Labvwrench\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Zapper\": {\r\n            \"name\": \"_add_object_preset_Labvzapper\",\r\n            \"type\": \"entity\"\r\n        }\r\n    },\r\n\r\n\r\n    \"LIGHTS\": {\r\n        \"Point light\": {\r\n            \"name\": \"_add-point-light\",\r\n            \"type\": \"entity\"\r\n        }\r\n    },\r\n\r\n    \"PARTICLES\": {\r\n        \"Particle emitter\": {\r\n            \"name\": \"_add-particle-emitter\",\r\n            \"type\": \"entity\"\r\n        },\r\n        \"Geometry as particles\": {\r\n            \"name\": \"_add-particle-geometry\",\r\n            \"type\": \"entity\"\r\n        }\r\n    },\r\n\r\n    \"INTERACTION\": {\r\n        \"Increment / Decrement Value on Trigger\": {\r\n            \"name\": \"_increment_or_decrement_on_trigger\"\r\n        },\r\n        \"WASD+ZC Keyboard Movement\": {\r\n            \"name\": \"wasdzc-keyboard-movement\"\r\n        },\r\n        \"HTC Vive Controllers\": {\r\n            \"name\": \"vive-hands\"\r\n        }\r\n    },\r\n\r\n    \"MUSIC AND SOUND\": {\r\n        \"Play music or sound\": {\r\n            \"name\": \"_audio-player\"\r\n        },\r\n        \"Play music + FFT output\": {\r\n            \"name\": \"_audio-player-and-fft\"\r\n        }\r\n    },\r\n\r\n    \"TIME & ANIMATION \": {\r\n        \"Basic clock\": {\r\n            \"name\": \"_basic-clock\"\r\n        },\r\n        \"Animate on Trigger\": {\r\n            \"name\": \"_animate-on-trigger\"\r\n        },\r\n        \"Oscillate between 2 values\": {\r\n            \"name\": \"_oscillate-between-2-values\"\r\n        },\r\n        \"Oscillate 2 values with in tween\": {\r\n            \"name\": \"_oscillate-with-in-tween\"\r\n        },\r\n        \"Oscillate 2 values with out tween\": {\r\n            \"name\": \"_oscillate-with-out-tween\"\r\n        },\r\n        \"Oscillate with a sawtooth\": {\r\n            \"name\": \"_oscillate-sawtooth\"\r\n        },\r\n        \"Oscillate with a triangle\": {\r\n            \"name\": \"time_oscillate_with_triangle\"\r\n        },\r\n        \"Stopwatch\": {\r\n            \"name\": \"_stopwatch\"\r\n        },\r\n        \"Timer from 0 to 1\": {\r\n            \"name\": \"time_timer_from_0_to_1\"\r\n        },\r\n        \"Timer from 1 to 0\": {\r\n            \"name\": \"time_timer_from_1_to_0\"\r\n        },\r\n        \"Circular motion to XYZ\": {\r\n            \"name\": \"time_circular_motion_to_xyz\"\r\n        },\r\n        \"Shaky random between 0 & 1\": {\r\n            \"name\": \"time_shaky_random\"\r\n        },\r\n        \"Random with speed\": {\r\n            \"name\": \"util_random_with_speed\"\r\n        },\r\n        \"Move in a circle and turn\": {\r\n            \"name\": \"_animation-move-in-a-circle-and-turn\"\r\n        }\r\n    },\r\n\r\n    \"UTILS\": {\r\n        \"4 step stepsequencer\": {\r\n            \"name\": \"util_4_step_stepsequencer\"\r\n        },\r\n        \"1 step stepsequencer\": {\r\n            \"name\": \"util_1_step_stepsequencer\"\r\n        },\r\n        \"9 step stepsequencer\": {\r\n            \"name\": \"util_9_step_stepsequencer\"\r\n        },\r\n        \"Display number\": {\r\n            \"name\": \"_util-display-number\",\r\n            \"type\": \"patch\"\r\n        }\r\n    }\r\n}"
  },
  {
    "path": "browser/patches/shader_fog.json",
    "content": "{\n    \"abs_t\": 83.893,\n    \"active_graph\": 0,\n    \"graph_uid\": 25,\n    \"root\": {\n        \"node_uid\": 16,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"from_mesh_custom_shader\",\n                \"x\": 683,\n                \"y\": 324,\n                \"uid\": 13,\n                \"dsid\": 2,\n                \"state\": {\n                    \"vs_src\": \"void main(void) {\\n    vec4 tp = m_mat * vec4(v_pos, 1.0);\\n\\n    tp = v_mat * tp;\\n    gl_Position = p_mat * tp;\\n    f_col = d_col;\\n    f_norm = n_mat * v_norm;\\n    f_uv0 = v_uv0;\\n}\",\n                    \"ps_src\": \"void main(void) {\\n    float d = clamp((gl_FragCoord.z / gl_FragCoord.w) * fd, 0.0, 1.0);\\n    vec4 fc = vec4(0.0, 0.0, 0.0, f_col.a);\\n    \\n    fc.rgb = f_col.rgb;\\n    fc *= texture2D(d_tex, f_uv0.st);\\n    fc.rgb += a_col.rgb;\\n    fc.rbg = mix(fog_color.rbg, fc.rgb, 1.0 - d);\\n    \\n    gl_FragColor = fc; // vec4(d, d, d, 1.0);\\n}\",\n                    \"changed\": true,\n                    \"slot_ids\": {\n                        \"fog_color\": {\n                            \"id\": 0,\n                            \"dt\": {\n                                \"id\": 3,\n                                \"name\": \"Color\"\n                            },\n                            \"uniform\": {}\n                        },\n                        \"fd\": {\n                            \"id\": 1,\n                            \"dt\": {\n                                \"id\": 0,\n                                \"name\": \"Float\"\n                            },\n                            \"uniform\": {}\n                        }\n                    }\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"fog_color\",\n                        \"dt\": 3,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"fd\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 546,\n                \"y\": 562,\n                \"uid\": 14,\n                \"state\": {\n                    \"val\": 0.94\n                },\n                \"title\": \"Fog dist\"\n            },\n            {\n                \"plugin\": \"color_picker\",\n                \"x\": 285,\n                \"y\": 466,\n                \"uid\": 15,\n                \"state\": {\n                    \"hue\": 0,\n                    \"sat\": 0.2,\n                    \"lum\": 0.43999999999999995\n                }\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 15,\n                \"dst_nuid\": 13,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 14,\n                \"dst_nuid\": 13,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/synch_add.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 1791,\n    \"root\": {\n        \"node_uid\": 226,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"register_global_read\",\n                \"x\": 282,\n                \"y\": 457,\n                \"uid\": 221,\n                \"dsid\": 2,\n                \"state\": {\n                    \"slot_id\": 0\n                },\n                \"title\": \"synch\",\n                \"dyn_out\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 0,\n                        \"desc\": \"\",\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 308,\n                \"y\": 540,\n                \"uid\": 222,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Base value\"\n            },\n            {\n                \"plugin\": \"add_modulator\",\n                \"x\": 440,\n                \"y\": 498,\n                \"uid\": 223,\n                \"open\": false\n            },\n            {\n                \"plugin\": \"lowpass_filter_modulator\",\n                \"x\": 530,\n                \"y\": 489,\n                \"uid\": 224\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 441,\n                \"y\": 531,\n                \"uid\": 225,\n                \"state\": {\n                    \"val\": 0.8400000000000004\n                },\n                \"title\": \"Filter\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 221,\n                \"dst_nuid\": 223,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"src_dyn\": true\n            },\n            {\n                \"src_nuid\": 222,\n                \"dst_nuid\": 223,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 223,\n                \"dst_nuid\": 224,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 225,\n                \"dst_nuid\": 224,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            }\n        ]\n    },\n    \"registers\": [\n        {\n            \"id\": \"amps\",\n            \"dt\": 0\n        },\n        {\n            \"id\": \"bd\",\n            \"dt\": 0\n        },\n        {\n            \"id\": \"sd\",\n            \"dt\": 0\n        },\n        {\n            \"id\": \"synch\",\n            \"dt\": 0\n        },\n        {\n            \"id\": \"camera\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"matrix\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"lightx\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"lighty\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"lightz\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"light\",\n            \"dt\": 8\n        },\n        {\n            \"id\": \"shinyness\",\n            \"dt\": 8\n        }\n    ]\n}"
  },
  {
    "path": "browser/patches/synch_substract.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 1,\n    \"root\": {\n        \"node_uid\": 6,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"register_global_read\",\n                \"x\": 402,\n                \"y\": 326,\n                \"uid\": 0,\n                \"dsid\": 3,\n                \"state\": {\n                    \"slot_id\": 0\n                },\n                \"title\": \"synch\",\n                \"dyn_out\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 0,\n                        \"desc\": \"\",\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 370,\n                \"y\": 389,\n                \"uid\": 1,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Base value\"\n            },\n            {\n                \"plugin\": \"lowpass_filter_modulator\",\n                \"x\": 581,\n                \"y\": 364,\n                \"uid\": 3\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 483,\n                \"y\": 408,\n                \"uid\": 4,\n                \"state\": {\n                    \"val\": 0.8400000000000004\n                },\n                \"title\": \"Filter\"\n            },\n            {\n                \"plugin\": \"subtract_modulator\",\n                \"x\": 484,\n                \"y\": 367,\n                \"uid\": 5,\n                \"open\": false\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 3,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 0,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"src_dyn\": true\n            },\n            {\n                \"src_nuid\": 1,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 3,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            }\n        ]\n    },\n    \"registers\": [\n        {\n            \"id\": \"synch\",\n            \"dt\": 8\n        }\n    ]\n}"
  },
  {
    "path": "browser/patches/synch_synchtrack.json",
    "content": "{\n    \"abs_t\": 69.067,\n    \"active_graph\": 0,\n    \"graph_uid\": 2,\n    \"root\": {\n        \"node_uid\": 31,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"url_audio_generator\",\n                \"x\": 58,\n                \"y\": 126,\n                \"uid\": 20,\n                \"state\": {\n                    \"url\": \"data/audio\"\n                }\n            },\n            {\n                \"plugin\": \"audio_player\",\n                \"x\": 606,\n                \"y\": 253,\n                \"uid\": 21\n            },\n            {\n                \"plugin\": \"toggle_button\",\n                \"x\": 459,\n                \"y\": 186,\n                \"uid\": 22,\n                \"open\": false,\n                \"state\": {\n                    \"enabled\": true\n                },\n                \"title\": \"Play\"\n            },\n            {\n                \"plugin\": \"toggle_button\",\n                \"x\": 459,\n                \"y\": 230,\n                \"uid\": 23,\n                \"open\": false,\n                \"state\": {\n                    \"enabled\": false\n                },\n                \"title\": \"Mute audio\"\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 460,\n                \"y\": 267,\n                \"uid\": 24,\n                \"open\": false,\n                \"state\": {\n                    \"val\": 0.49999999999999956\n                },\n                \"title\": \"Volume\"\n            },\n            {\n                \"plugin\": \"audio_get_duration_modulator\",\n                \"x\": 380,\n                \"y\": 303,\n                \"uid\": 25,\n                \"open\": false\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 368,\n                \"y\": 228,\n                \"uid\": 26,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Position\"\n            },\n            {\n                \"plugin\": \"multiply_modulator\",\n                \"x\": 473,\n                \"y\": 303,\n                \"uid\": 27,\n                \"open\": false\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 223,\n                \"y\": 118,\n                \"uid\": 28,\n                \"dsid\": 4,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {\n                        \"9\": 0,\n                        \"10\": 1\n                    },\n                    \"output_sids\": {\n                        \"12\": 3\n                    }\n                },\n                \"title\": \"Synchtrack for audio\",\n                \"graph\": {\n                    \"node_uid\": 17,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"audio_get_current_time_modulator\",\n                            \"x\": 109,\n                            \"y\": 258,\n                            \"uid\": 1\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 109,\n                            \"y\": 190,\n                            \"uid\": 5,\n                            \"state\": {\n                                \"val\": 30\n                            }\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 252,\n                            \"y\": 179,\n                            \"uid\": 6\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 455,\n                            \"y\": 168,\n                            \"uid\": 8,\n                            \"title\": \"Amp signal\"\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 26,\n                            \"y\": 259,\n                            \"uid\": 9,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"audio\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 10,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 247,\n                            \"y\": 257,\n                            \"uid\": 10,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Amp amount\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 562,\n                            \"y\": 169,\n                            \"uid\": 12,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"synch\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"url_json_generator\",\n                            \"x\": 10,\n                            \"y\": 40,\n                            \"uid\": 13,\n                            \"state\": {\n                                \"url\": \"data/demos/radix/tiger-drums-bd.json\"\n                            }\n                        },\n                        {\n                            \"plugin\": \"member_to_typed_array_modulator\",\n                            \"x\": 151,\n                            \"y\": 62,\n                            \"uid\": 14,\n                            \"state\": {\n                                \"datatype\": 6\n                            }\n                        },\n                        {\n                            \"plugin\": \"label_generator\",\n                            \"x\": 11,\n                            \"y\": 124,\n                            \"uid\": 15,\n                            \"state\": {\n                                \"text\": \"data\"\n                            }\n                        },\n                        {\n                            \"plugin\": \"array_get_modulator\",\n                            \"x\": 360,\n                            \"y\": 133,\n                            \"uid\": 16\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"offset\": 3\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 8,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 8,\n                            \"dst_nuid\": 12,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 14,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 14,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 8,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"audio\",\n                        \"dt\": 10,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Amp amount\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"synch\",\n                        \"dt\": 0,\n                        \"uid\": 3,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 57,\n                \"y\": 193,\n                \"uid\": 29,\n                \"state\": {\n                    \"val\": 100\n                },\n                \"title\": \"Amp\"\n            },\n            {\n                \"plugin\": \"register_global_write\",\n                \"x\": 417,\n                \"y\": 118,\n                \"uid\": 30,\n                \"dsid\": 5,\n                \"state\": {\n                    \"slot_id\": 0\n                },\n                \"title\": \"synch\",\n                \"dyn_in\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 0,\n                        \"desc\": \"\",\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true,\n                        \"connected\": false\n                    }\n                ]\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 20,\n                \"dst_nuid\": 21,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 20,\n                \"dst_nuid\": 25,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"offset\": 1\n            },\n            {\n                \"src_nuid\": 22,\n                \"dst_nuid\": 21,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 23,\n                \"dst_nuid\": 21,\n                \"src_slot\": 0,\n                \"dst_slot\": 2\n            },\n            {\n                \"src_nuid\": 24,\n                \"dst_nuid\": 21,\n                \"src_slot\": 0,\n                \"dst_slot\": 3\n            },\n            {\n                \"src_nuid\": 27,\n                \"dst_nuid\": 21,\n                \"src_slot\": 0,\n                \"dst_slot\": 4\n            },\n            {\n                \"src_nuid\": 25,\n                \"dst_nuid\": 27,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 26,\n                \"dst_nuid\": 27,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 29,\n                \"dst_nuid\": 28,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 28,\n                \"dst_nuid\": 30,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_connected\": false,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 20,\n                \"dst_nuid\": 28,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true,\n                \"offset\": 2\n            }\n        ]\n    },\n    \"registers\": [\n        {\n            \"id\": \"synch\",\n            \"dt\": 8\n        }\n    ]\n}"
  },
  {
    "path": "browser/patches/template_master_camera_and_master_time.json",
    "content": "{\n    \"abs_t\": 1599.782,\n    \"active_graph\": 0,\n    \"graph_uid\": 9,\n    \"root\": {\n        \"node_uid\": 63,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 743,\n                \"y\": 251,\n                \"uid\": 55,\n                \"dsid\": 6,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {\n                        \"0\": 0,\n                        \"1\": 1,\n                        \"2\": 2,\n                        \"25\": 5\n                    },\n                    \"output_sids\": {\n                        \"3\": 3\n                    }\n                },\n                \"title\": \"Master Camera\",\n                \"graph\": {\n                    \"node_uid\": 26,\n                    \"uid\": 7,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 74,\n                            \"y\": 173,\n                            \"uid\": 0,\n                            \"dsid\": 18,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"rotation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 129,\n                            \"y\": 89,\n                            \"uid\": 1,\n                            \"dsid\": 18,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"elevation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 52,\n                            \"y\": 48,\n                            \"uid\": 2,\n                            \"dsid\": 18,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"dolly\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 558,\n                            \"y\": 35,\n                            \"uid\": 3,\n                            \"dsid\": 18,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"camera\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 6,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"perspective_camera\",\n                            \"x\": 448,\n                            \"y\": 75,\n                            \"uid\": 4\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 218,\n                            \"y\": 28,\n                            \"uid\": 5\n                        },\n                        {\n                            \"plugin\": \"rotation_xyz_matrix\",\n                            \"x\": 160,\n                            \"y\": 153,\n                            \"uid\": 6\n                        },\n                        {\n                            \"plugin\": \"vector_transform\",\n                            \"x\": 342,\n                            \"y\": 77,\n                            \"uid\": 7\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 219,\n                            \"y\": 267,\n                            \"uid\": 21\n                        },\n                        {\n                            \"plugin\": \"vector_transform\",\n                            \"x\": 341,\n                            \"y\": 190,\n                            \"uid\": 22\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 104,\n                            \"y\": 287,\n                            \"uid\": 23,\n                            \"state\": {\n                                \"val\": 0.5\n                            }\n                        },\n                        {\n                            \"plugin\": \"negate_modulator\",\n                            \"x\": 132,\n                            \"y\": 33,\n                            \"uid\": 24\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 92,\n                            \"y\": 457,\n                            \"uid\": 25,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"target elevation\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 22,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 22,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 24,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"rotation\",\n                        \"dt\": 0,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"elevation\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"dolly\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"target elevation\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 3,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"camera\",\n                        \"dt\": 6,\n                        \"uid\": 3,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 524,\n                \"y\": 208,\n                \"uid\": 56,\n                \"state\": {\n                    \"val\": -7.2,\n                    \"min\": -180,\n                    \"max\": 180\n                },\n                \"title\": \"Rotation\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 524,\n                \"y\": 291,\n                \"uid\": 57,\n                \"state\": {\n                    \"val\": -0.8,\n                    \"min\": -20,\n                    \"max\": 20\n                },\n                \"title\": \"Elevation\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 524,\n                \"y\": 374,\n                \"uid\": 58,\n                \"state\": {\n                    \"val\": 2.9,\n                    \"min\": 0,\n                    \"max\": 10\n                },\n                \"title\": \"Dolly\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 525,\n                \"y\": 456,\n                \"uid\": 59,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": 0,\n                    \"max\": 10\n                },\n                \"title\": \"target elevation\"\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 728,\n                \"y\": 573,\n                \"uid\": 60,\n                \"dsid\": 2,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {\n                        \"7\": 1\n                    },\n                    \"output_sids\": {\n                        \"6\": 0\n                    }\n                },\n                \"title\": \"Master time\",\n                \"graph\": {\n                    \"node_uid\": 9,\n                    \"uid\": 8,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"delta_t_generator\",\n                            \"x\": 7,\n                            \"y\": 7,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"accumulate_modulator\",\n                            \"x\": 181,\n                            \"y\": 7,\n                            \"uid\": 1,\n                            \"state\": {\n                                \"value\": 11.911499999999842\n                            }\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 101,\n                            \"y\": 7,\n                            \"uid\": 2\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 283,\n                            \"y\": 7,\n                            \"uid\": 6,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"time\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 23,\n                            \"y\": 66,\n                            \"uid\": 7,\n                            \"dsid\": 6,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Speed\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 97,\n                            \"y\": 93,\n                            \"uid\": 8,\n                            \"state\": {\n                                \"val\": 0\n                            }\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 8,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Speed\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"time\",\n                        \"dt\": 0,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 526,\n                \"y\": 593,\n                \"uid\": 61,\n                \"state\": {\n                    \"val\": 0.5,\n                    \"min\": 0,\n                    \"max\": 1\n                },\n                \"title\": \"Time speed\"\n            },\n            {\n                \"plugin\": \"float_display\",\n                \"x\": 902,\n                \"y\": 515,\n                \"uid\": 62\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 56,\n                \"dst_nuid\": 55,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 57,\n                \"dst_nuid\": 55,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 58,\n                \"dst_nuid\": 55,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 59,\n                \"dst_nuid\": 55,\n                \"src_slot\": 0,\n                \"dst_slot\": 3,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 61,\n                \"dst_nuid\": 60,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 60,\n                \"dst_nuid\": 62,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"src_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/three_ambient_light.json",
    "content": "{\n    \"abs_t\": 280.089,\n    \"active_graph\": \"root\",\n    \"graph_uid\": \"TI6whDg9VfHH\",\n    \"root\": {\n        \"uid\": \"root\",\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 334,\n                \"y\": 390,\n                \"uid\": \"ETIhnzRa27tx\",\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {},\n                    \"output_sids\": {\n                        \"2TBEHlKpKdeZ\": \"547odbJKrTzG\"\n                    }\n                },\n                \"title\": \"Ambient light\",\n                \"graph\": {\n                    \"uid\": \"9aW6RLPBpvQF\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1110,\n                            \"y\": 223,\n                            \"uid\": \"2TBEHlKpKdeZ\",\n                            \"title\": \"object3d\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 21,\n                                    \"def\": null,\n                                    \"uid\": \"vSy6Gj4JSPYs\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 306,\n                            \"y\": 399,\n                            \"uid\": \"kwCMxOSQcv8Z\",\n                            \"state\": {\n                                \"val\": -0.1,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 303,\n                            \"y\": 466,\n                            \"uid\": \"di2viokfSGiQ\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 301,\n                            \"y\": 532,\n                            \"uid\": \"zZZzs4Fc3j0o\",\n                            \"state\": {\n                                \"val\": 2,\n                                \"min\": -1,\n                                \"max\": 2\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 645,\n                            \"y\": 384,\n                            \"uid\": \"BaEgQmBUtKu4\",\n                            \"title\": \"Position\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 639,\n                            \"y\": 560,\n                            \"uid\": \"mL3vPhPmtWkQ\",\n                            \"title\": \"Scale\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 634,\n                            \"y\": 458,\n                            \"uid\": \"2wcPGgtDHKG1\",\n                            \"title\": \"Rotation\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 476,\n                            \"y\": 708,\n                            \"uid\": \"jDHmWr3I6hvJ\",\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"XYZ\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 304,\n                            \"y\": 637,\n                            \"uid\": \"uiguJdrTgGpU\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 301,\n                            \"y\": 700,\n                            \"uid\": \"m74Pb6oQAhbZ\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 299,\n                            \"y\": 756,\n                            \"uid\": \"kC2dWfRFYFZ3\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"three_ambient_light\",\n                            \"x\": 877,\n                            \"y\": 293,\n                            \"uid\": \"8mTl4shEDODm\"\n                        },\n                        {\n                            \"plugin\": \"annotation\",\n                            \"x\": 282,\n                            \"y\": 100,\n                            \"uid\": \"Dxg4WIHRiSQJ\",\n                            \"state\": {\n                                \"text\": \"How is this supposed to work?\\n\\nAmbient light should have a light color + intensity settings right?\\n\\n\",\n                                \"width\": 202,\n                                \"height\": 98\n                            }\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"kwCMxOSQcv8Z\",\n                            \"dst_nuid\": \"BaEgQmBUtKu4\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"LuuisWChGil7\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"di2viokfSGiQ\",\n                            \"dst_nuid\": \"BaEgQmBUtKu4\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"vETJj5adtnNY\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"zZZzs4Fc3j0o\",\n                            \"dst_nuid\": \"BaEgQmBUtKu4\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"nmjilnAAqqAS\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"jDHmWr3I6hvJ\",\n                            \"dst_nuid\": \"mL3vPhPmtWkQ\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"Zx6Zyo53OZjG\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"jDHmWr3I6hvJ\",\n                            \"dst_nuid\": \"mL3vPhPmtWkQ\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"OS0Iedx68c3G\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": \"jDHmWr3I6hvJ\",\n                            \"dst_nuid\": \"mL3vPhPmtWkQ\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"p73G40IW8coz\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"uiguJdrTgGpU\",\n                            \"dst_nuid\": \"2wcPGgtDHKG1\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"oMxwXmq6E9Yv\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"m74Pb6oQAhbZ\",\n                            \"dst_nuid\": \"2wcPGgtDHKG1\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"JAofaGhIpjUJ\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"kC2dWfRFYFZ3\",\n                            \"dst_nuid\": \"2wcPGgtDHKG1\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"y7CcQODl7SSy\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"8mTl4shEDODm\",\n                            \"dst_nuid\": \"2TBEHlKpKdeZ\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"J55ZnaX4GoAt\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"mL3vPhPmtWkQ\",\n                            \"dst_nuid\": \"8mTl4shEDODm\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"EtAyGxpvHFbL\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"2wcPGgtDHKG1\",\n                            \"dst_nuid\": \"8mTl4shEDODm\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"RweZ2X8TzwNM\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"BaEgQmBUtKu4\",\n                            \"dst_nuid\": \"8mTl4shEDODm\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"dMbktjRvPIcn\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        }\n                    ]\n                },\n                \"dyn_out\": [\n                    {\n                        \"name\": \"object3d\",\n                        \"dt\": 21,\n                        \"index\": 0,\n                        \"uid\": \"547odbJKrTzG\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/three_base.json",
    "content": "{\n    \"abs_t\": 206.702,\n    \"active_graph\": \"root\",\n    \"graph_uid\": \"TI6whDg9VfHH\",\n    \"root\": {\n        \"uid\": \"root\",\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"three_scene\",\n                \"x\": 464,\n                \"y\": 410,\n                \"uid\": \"y3ivxOrvIAAj\",\n                \"dyn_in\": [\n                    {\n                        \"type\": 0,\n                        \"name\": \"0\",\n                        \"dt\": 21,\n                        \"uid\": \"w4Hhf8HGnW3E\",\n                        \"dynamic\": true,\n                        \"index\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"type\": 0,\n                        \"name\": \"1\",\n                        \"dt\": 21,\n                        \"uid\": \"DAJQljPelpbx\",\n                        \"dynamic\": true,\n                        \"index\": 1,\n                        \"is_connected\": false\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"three_webgl_renderer\",\n                \"x\": 633,\n                \"y\": 347,\n                \"uid\": \"M6rxztB9mIlj\",\n                \"state\": {\n                    \"always_update\": true\n                }\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 239,\n                \"y\": 328,\n                \"uid\": \"9CoRLTlaVlKf\",\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {},\n                    \"output_sids\": {\n                        \"gQw2ofn97gPK\": \"547odbJKrTzG\"\n                    }\n                },\n                \"title\": \"Directional light\",\n                \"graph\": {\n                    \"uid\": \"qTbVdGEGtlj7\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1110,\n                            \"y\": 223,\n                            \"uid\": \"gQw2ofn97gPK\",\n                            \"title\": \"object3d\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 21,\n                                    \"def\": null,\n                                    \"uid\": \"vSy6Gj4JSPYs\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"three_directional_light\",\n                            \"x\": 831,\n                            \"y\": 306,\n                            \"uid\": \"fvJTRAjWqkAJ\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 619,\n                            \"y\": 270,\n                            \"uid\": \"UppO4JH6PR8C\",\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Intensity\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 306,\n                            \"y\": 399,\n                            \"uid\": \"n5Bj6yfEgS2F\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 303,\n                            \"y\": 466,\n                            \"uid\": \"oJ9Ib6bXFRjh\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 301,\n                            \"y\": 532,\n                            \"uid\": \"5zWy3Vvqu2Vj\",\n                            \"state\": {\n                                \"val\": 2,\n                                \"min\": -1,\n                                \"max\": 2\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 639,\n                            \"y\": 472,\n                            \"uid\": \"iMrWPDzp0HDp\",\n                            \"open\": false,\n                            \"title\": \"Position\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 639,\n                            \"y\": 560,\n                            \"uid\": \"dU71V7tUtX39\",\n                            \"open\": false,\n                            \"title\": \"Scale\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 642,\n                            \"y\": 524,\n                            \"uid\": \"FhDfRmby0oWX\",\n                            \"open\": false,\n                            \"title\": \"Rotation\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 476,\n                            \"y\": 708,\n                            \"uid\": \"JD09VgK0ORLF\",\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"XYZ\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 304,\n                            \"y\": 637,\n                            \"uid\": \"RaWIFEHnuPkE\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 301,\n                            \"y\": 700,\n                            \"uid\": \"4espaeyWAvzl\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 299,\n                            \"y\": 756,\n                            \"uid\": \"T6arHu2R2akL\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 728,\n                            \"y\": 366,\n                            \"uid\": \"GV2WOHyR70mb\",\n                            \"state\": {\n                                \"enabled\": true\n                            }\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"UppO4JH6PR8C\",\n                            \"dst_nuid\": \"fvJTRAjWqkAJ\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"ynZ4PkSK1BGl\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"n5Bj6yfEgS2F\",\n                            \"dst_nuid\": \"iMrWPDzp0HDp\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"LuuisWChGil7\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"oJ9Ib6bXFRjh\",\n                            \"dst_nuid\": \"iMrWPDzp0HDp\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"vETJj5adtnNY\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"5zWy3Vvqu2Vj\",\n                            \"dst_nuid\": \"iMrWPDzp0HDp\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"nmjilnAAqqAS\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"JD09VgK0ORLF\",\n                            \"dst_nuid\": \"dU71V7tUtX39\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"Zx6Zyo53OZjG\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"JD09VgK0ORLF\",\n                            \"dst_nuid\": \"dU71V7tUtX39\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"OS0Iedx68c3G\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": \"JD09VgK0ORLF\",\n                            \"dst_nuid\": \"dU71V7tUtX39\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"p73G40IW8coz\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"RaWIFEHnuPkE\",\n                            \"dst_nuid\": \"FhDfRmby0oWX\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"oMxwXmq6E9Yv\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"4espaeyWAvzl\",\n                            \"dst_nuid\": \"FhDfRmby0oWX\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"JAofaGhIpjUJ\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"T6arHu2R2akL\",\n                            \"dst_nuid\": \"FhDfRmby0oWX\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"y7CcQODl7SSy\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"iMrWPDzp0HDp\",\n                            \"dst_nuid\": \"fvJTRAjWqkAJ\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"2x3eRyU5SDWl\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"FhDfRmby0oWX\",\n                            \"dst_nuid\": \"fvJTRAjWqkAJ\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"94PZMYu2YD0S\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"dU71V7tUtX39\",\n                            \"dst_nuid\": \"fvJTRAjWqkAJ\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"uid\": \"7R8EspyYchdw\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"GV2WOHyR70mb\",\n                            \"dst_nuid\": \"fvJTRAjWqkAJ\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"uid\": \"0Ccx9SoUN7nS\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"fvJTRAjWqkAJ\",\n                            \"dst_nuid\": \"gQw2ofn97gPK\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"GneZHvJz4rZT\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_out\": [\n                    {\n                        \"name\": \"object3d\",\n                        \"dt\": 21,\n                        \"index\": 0,\n                        \"uid\": \"547odbJKrTzG\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 240,\n                \"y\": 254,\n                \"uid\": \"h0RBsP4aFUBz\",\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {},\n                    \"output_sids\": {\n                        \"fEG5xoCCwyYh\": \"8GpdZjiiiEQa\"\n                    }\n                },\n                \"title\": \"VR camera\",\n                \"graph\": {\n                    \"uid\": \"x4ehnPwqoNr4\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"three_vr_camera\",\n                            \"x\": 899,\n                            \"y\": 233,\n                            \"uid\": \"BJVbkRMKlKHl\"\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1077,\n                            \"y\": 294,\n                            \"uid\": \"fEG5xoCCwyYh\",\n                            \"title\": \"camera\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 6,\n                                    \"def\": null,\n                                    \"uid\": \"uyyGR7LQwSEh\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 443,\n                            \"y\": 217,\n                            \"uid\": \"JUTYouXSzZsU\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 440,\n                            \"y\": 284,\n                            \"uid\": \"i2OuDdmubj0J\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 438,\n                            \"y\": 350,\n                            \"uid\": \"CEEKYzcvgLB5\",\n                            \"state\": {\n                                \"val\": 2,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 736,\n                            \"y\": 244,\n                            \"uid\": \"kycPutnUNvGK\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 772,\n                            \"y\": 183,\n                            \"uid\": \"Mnjd6YiiizvP\",\n                            \"state\": {\n                                \"val\": 45\n                            },\n                            \"title\": \"FOV\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"BJVbkRMKlKHl\",\n                            \"dst_nuid\": \"fEG5xoCCwyYh\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"JsoCbqqXFrqv\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"JUTYouXSzZsU\",\n                            \"dst_nuid\": \"kycPutnUNvGK\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"SLv1XBnHMxMi\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"i2OuDdmubj0J\",\n                            \"dst_nuid\": \"kycPutnUNvGK\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"I9a5nju0SzbI\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"CEEKYzcvgLB5\",\n                            \"dst_nuid\": \"kycPutnUNvGK\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"ND97vtAXhssC\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"kycPutnUNvGK\",\n                            \"dst_nuid\": \"BJVbkRMKlKHl\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"Dz79JT5WRnA5\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"Mnjd6YiiizvP\",\n                            \"dst_nuid\": \"BJVbkRMKlKHl\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"eZFW97ARUAgE\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        }\n                    ]\n                },\n                \"dyn_out\": [\n                    {\n                        \"name\": \"camera\",\n                        \"dt\": 6,\n                        \"index\": 0,\n                        \"uid\": \"8GpdZjiiiEQa\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": \"9CoRLTlaVlKf\",\n                \"dst_nuid\": \"y3ivxOrvIAAj\",\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"uid\": \"2UcAMegYqiGI\",\n                \"src_connected\": true,\n                \"dst_connected\": true,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": \"y3ivxOrvIAAj\",\n                \"dst_nuid\": \"M6rxztB9mIlj\",\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"uid\": \"HL8XwBYW3z32\",\n                \"src_connected\": true,\n                \"dst_connected\": true\n            },\n            {\n                \"src_nuid\": \"h0RBsP4aFUBz\",\n                \"dst_nuid\": \"M6rxztB9mIlj\",\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"uid\": \"qJZmAGsusJ5d\",\n                \"src_connected\": true,\n                \"dst_connected\": true,\n                \"src_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/three_box.json",
    "content": "{\n    \"abs_t\": 277.623,\n    \"active_graph\": \"root\",\n    \"graph_uid\": \"TI6whDg9VfHH\",\n    \"root\": {\n        \"uid\": \"root\",\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 208,\n                \"y\": 324,\n                \"uid\": \"OgEjxS1jpWWB\",\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {},\n                    \"output_sids\": {\n                        \"Gw4uKJGQjgWn\": \"mh0rTKkFm0nD\"\n                    }\n                },\n                \"title\": \"Box\",\n                \"graph\": {\n                    \"uid\": \"NLZOLnNvJZiS\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"three_geometry_box\",\n                            \"x\": 554,\n                            \"y\": 338,\n                            \"uid\": \"YKKM9Y3iFjRm\"\n                        },\n                        {\n                            \"plugin\": \"three_mesh\",\n                            \"x\": 1057,\n                            \"y\": 390,\n                            \"uid\": \"4I5bwgLJeeVV\"\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1269,\n                            \"y\": 390,\n                            \"uid\": \"Gw4uKJGQjgWn\",\n                            \"title\": \"object3d\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 21,\n                                    \"def\": null,\n                                    \"uid\": \"bEdPpC9C6Rh1\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 100,\n                            \"y\": 418,\n                            \"uid\": \"1hQvgkrYzbad\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 97,\n                            \"y\": 485,\n                            \"uid\": \"yyDTw1fBl9DT\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 95,\n                            \"y\": 551,\n                            \"uid\": \"GQl4ayL5fXLb\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 441,\n                            \"y\": 467,\n                            \"uid\": \"zu8v9YoyjUX8\",\n                            \"open\": false,\n                            \"title\": \"Position\"\n                        },\n                        {\n                            \"plugin\": \"three_material\",\n                            \"x\": 575,\n                            \"y\": 61,\n                            \"uid\": \"kTrue5YTevjE\"\n                        },\n                        {\n                            \"plugin\": \"url_texture_generator\",\n                            \"x\": 194,\n                            \"y\": 64,\n                            \"uid\": \"PsMokHxycgXh\",\n                            \"state\": {\n                                \"url\": \"/data/image/86b4f99c40c9b047957cc6c5c3364a070cb3c101.png\"\n                            },\n                            \"title\": \"Box texture\"\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 943,\n                            \"y\": 320,\n                            \"uid\": \"Z3JMMdr9M8pM\",\n                            \"state\": {\n                                \"enabled\": true\n                            },\n                            \"title\": \"Visible\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 503,\n                            \"y\": 763,\n                            \"uid\": \"KOZeDEIu4knT\",\n                            \"open\": false,\n                            \"title\": \"Scale\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 236,\n                            \"y\": 671,\n                            \"uid\": \"t1TFvhCAXw1a\",\n                            \"open\": false,\n                            \"title\": \"Rotation\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 343,\n                            \"y\": 795,\n                            \"uid\": \"6g0qpOmHxG0y\",\n                            \"state\": {\n                                \"val\": 0.6\n                            },\n                            \"title\": \"XYZ\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 98,\n                            \"y\": 656,\n                            \"uid\": \"l6VmoftKGl83\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 95,\n                            \"y\": 719,\n                            \"uid\": \"Bx15C6yOAYwf\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 93,\n                            \"y\": 775,\n                            \"uid\": \"PBrpSnD5LqtH\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Z\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"YKKM9Y3iFjRm\",\n                            \"dst_nuid\": \"4I5bwgLJeeVV\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"8wg8q02esLtU\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"4I5bwgLJeeVV\",\n                            \"dst_nuid\": \"Gw4uKJGQjgWn\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"zRsWgnCa23py\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"zu8v9YoyjUX8\",\n                            \"dst_nuid\": \"4I5bwgLJeeVV\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"MbBT90ihyYHM\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"kTrue5YTevjE\",\n                            \"dst_nuid\": \"4I5bwgLJeeVV\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"KrguMemLb6DB\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"PsMokHxycgXh\",\n                            \"dst_nuid\": \"kTrue5YTevjE\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"dRTv7NFd67AJ\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"Z3JMMdr9M8pM\",\n                            \"dst_nuid\": \"4I5bwgLJeeVV\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"uid\": \"UiT1XfddE4s9\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"6g0qpOmHxG0y\",\n                            \"dst_nuid\": \"KOZeDEIu4knT\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"Zx6Zyo53OZjG\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"6g0qpOmHxG0y\",\n                            \"dst_nuid\": \"KOZeDEIu4knT\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"OS0Iedx68c3G\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": \"6g0qpOmHxG0y\",\n                            \"dst_nuid\": \"KOZeDEIu4knT\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"p73G40IW8coz\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"KOZeDEIu4knT\",\n                            \"dst_nuid\": \"4I5bwgLJeeVV\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"uid\": \"3DlUOn8efiMt\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"t1TFvhCAXw1a\",\n                            \"dst_nuid\": \"4I5bwgLJeeVV\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"uid\": \"XWlxV8bcX3pC\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"l6VmoftKGl83\",\n                            \"dst_nuid\": \"t1TFvhCAXw1a\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"oMxwXmq6E9Yv\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"Bx15C6yOAYwf\",\n                            \"dst_nuid\": \"t1TFvhCAXw1a\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"JAofaGhIpjUJ\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"PBrpSnD5LqtH\",\n                            \"dst_nuid\": \"t1TFvhCAXw1a\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"y7CcQODl7SSy\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"1hQvgkrYzbad\",\n                            \"dst_nuid\": \"zu8v9YoyjUX8\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"LuuisWChGil7\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"yyDTw1fBl9DT\",\n                            \"dst_nuid\": \"zu8v9YoyjUX8\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"vETJj5adtnNY\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"GQl4ayL5fXLb\",\n                            \"dst_nuid\": \"zu8v9YoyjUX8\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"nmjilnAAqqAS\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        }\n                    ]\n                },\n                \"dyn_out\": [\n                    {\n                        \"name\": \"object3d\",\n                        \"dt\": 21,\n                        \"index\": 0,\n                        \"uid\": \"mh0rTKkFm0nD\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/three_circle.json",
    "content": "{\n    \"abs_t\": 199.751,\n    \"active_graph\": \"root\",\n    \"graph_uid\": \"TI6whDg9VfHH\",\n    \"root\": {\n        \"uid\": \"root\",\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 343,\n                \"y\": 179,\n                \"uid\": \"cu4sqKNXXa92\",\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {},\n                    \"output_sids\": {\n                        \"YyeA6e9DTgAu\": \"mh0rTKkFm0nD\"\n                    }\n                },\n                \"title\": \"Circle\",\n                \"graph\": {\n                    \"uid\": \"BVq8nOGwJ8gG\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"three_mesh\",\n                            \"x\": 1057,\n                            \"y\": 390,\n                            \"uid\": \"1I2Q44vqvHFX\"\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1269,\n                            \"y\": 390,\n                            \"uid\": \"YyeA6e9DTgAu\",\n                            \"title\": \"object3d\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 21,\n                                    \"def\": null,\n                                    \"uid\": \"bEdPpC9C6Rh1\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 100,\n                            \"y\": 418,\n                            \"uid\": \"mqFImfS6JkaI\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 97,\n                            \"y\": 485,\n                            \"uid\": \"dSLD1FAFvezQ\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 95,\n                            \"y\": 551,\n                            \"uid\": \"M4u3PyCopmnI\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 441,\n                            \"y\": 467,\n                            \"uid\": \"Ld4URWNKQNkS\",\n                            \"open\": false,\n                            \"title\": \"Position\"\n                        },\n                        {\n                            \"plugin\": \"url_texture_generator\",\n                            \"x\": 194,\n                            \"y\": 64,\n                            \"uid\": \"mtQmDjxJiUx9\",\n                            \"state\": {\n                                \"url\": \"/data/image/a0ef7a98fe6f899443d2f5bf97b606bc2a94176a.png\"\n                            },\n                            \"title\": \"Box texture\"\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 943,\n                            \"y\": 320,\n                            \"uid\": \"r9yx7l9Psgxo\",\n                            \"state\": {\n                                \"enabled\": true\n                            },\n                            \"title\": \"Visible\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 503,\n                            \"y\": 763,\n                            \"uid\": \"tln5gTDkDPeU\",\n                            \"open\": false,\n                            \"title\": \"Scale\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 236,\n                            \"y\": 671,\n                            \"uid\": \"2saHKIa786i7\",\n                            \"open\": false,\n                            \"title\": \"Rotation\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 343,\n                            \"y\": 795,\n                            \"uid\": \"e9KC5m4QCFTH\",\n                            \"state\": {\n                                \"val\": 0.5\n                            },\n                            \"title\": \"XYZ\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 98,\n                            \"y\": 656,\n                            \"uid\": \"Ec3dUhBXcG6p\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 95,\n                            \"y\": 719,\n                            \"uid\": \"8RIzSPZbZl50\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 93,\n                            \"y\": 775,\n                            \"uid\": \"7so9INNZQNGs\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"three_material_lambert\",\n                            \"x\": 687,\n                            \"y\": 197,\n                            \"uid\": \"R60QCRDbmCZA\"\n                        },\n                        {\n                            \"plugin\": \"annotation\",\n                            \"x\": 485,\n                            \"y\": 809,\n                            \"uid\": \"qG7ehOJhKt4C\",\n                            \"state\": {\n                                \"text\": \"Radius vs Scale??\\n\",\n                                \"width\": 206,\n                                \"height\": 42\n                            }\n                        },\n                        {\n                            \"plugin\": \"three_geometry_circle\",\n                            \"x\": 743,\n                            \"y\": 324,\n                            \"uid\": \"B7xtvv0xVr4X\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 580,\n                            \"y\": 352,\n                            \"uid\": \"VF6IPdgcQYY9\",\n                            \"state\": {\n                                \"val\": 1\n                            }\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 577,\n                            \"y\": 422,\n                            \"uid\": \"2UD9ffTeSue0\",\n                            \"state\": {\n                                \"val\": 64\n                            }\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"1I2Q44vqvHFX\",\n                            \"dst_nuid\": \"YyeA6e9DTgAu\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"zRsWgnCa23py\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"Ld4URWNKQNkS\",\n                            \"dst_nuid\": \"1I2Q44vqvHFX\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"MbBT90ihyYHM\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"r9yx7l9Psgxo\",\n                            \"dst_nuid\": \"1I2Q44vqvHFX\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"uid\": \"UiT1XfddE4s9\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"e9KC5m4QCFTH\",\n                            \"dst_nuid\": \"tln5gTDkDPeU\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"Zx6Zyo53OZjG\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"e9KC5m4QCFTH\",\n                            \"dst_nuid\": \"tln5gTDkDPeU\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"OS0Iedx68c3G\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": \"e9KC5m4QCFTH\",\n                            \"dst_nuid\": \"tln5gTDkDPeU\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"p73G40IW8coz\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"tln5gTDkDPeU\",\n                            \"dst_nuid\": \"1I2Q44vqvHFX\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"uid\": \"3DlUOn8efiMt\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"2saHKIa786i7\",\n                            \"dst_nuid\": \"1I2Q44vqvHFX\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"uid\": \"XWlxV8bcX3pC\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"Ec3dUhBXcG6p\",\n                            \"dst_nuid\": \"2saHKIa786i7\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"oMxwXmq6E9Yv\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"8RIzSPZbZl50\",\n                            \"dst_nuid\": \"2saHKIa786i7\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"JAofaGhIpjUJ\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"7so9INNZQNGs\",\n                            \"dst_nuid\": \"2saHKIa786i7\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"y7CcQODl7SSy\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"mqFImfS6JkaI\",\n                            \"dst_nuid\": \"Ld4URWNKQNkS\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"LuuisWChGil7\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"dSLD1FAFvezQ\",\n                            \"dst_nuid\": \"Ld4URWNKQNkS\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"vETJj5adtnNY\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"M4u3PyCopmnI\",\n                            \"dst_nuid\": \"Ld4URWNKQNkS\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"nmjilnAAqqAS\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"mtQmDjxJiUx9\",\n                            \"dst_nuid\": \"R60QCRDbmCZA\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"M46o8TQTKZCl\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"R60QCRDbmCZA\",\n                            \"dst_nuid\": \"1I2Q44vqvHFX\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"hg54OEOqnkC2\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"B7xtvv0xVr4X\",\n                            \"dst_nuid\": \"1I2Q44vqvHFX\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"Ql8lWL4bqxIB\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"VF6IPdgcQYY9\",\n                            \"dst_nuid\": \"B7xtvv0xVr4X\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"8p4wjT3bYV1k\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"2UD9ffTeSue0\",\n                            \"dst_nuid\": \"B7xtvv0xVr4X\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"6ZefEmIgPucL\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        }\n                    ]\n                },\n                \"dyn_out\": [\n                    {\n                        \"name\": \"object3d\",\n                        \"dt\": 21,\n                        \"index\": 0,\n                        \"uid\": \"mh0rTKkFm0nD\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/three_cylinder.json",
    "content": "{\n    \"abs_t\": 216.269,\n    \"active_graph\": \"root\",\n    \"graph_uid\": \"TI6whDg9VfHH\",\n    \"root\": {\n        \"uid\": \"root\",\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 251,\n                \"y\": 244,\n                \"uid\": \"ZCaMnd8G6s2f\",\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {},\n                    \"output_sids\": {\n                        \"Cm6f8rtr1iVI\": \"mh0rTKkFm0nD\"\n                    }\n                },\n                \"title\": \"Cylinder\",\n                \"graph\": {\n                    \"uid\": \"LTjD2JhmNnv4\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"three_mesh\",\n                            \"x\": 1057,\n                            \"y\": 390,\n                            \"uid\": \"l8whsUFFq6Mt\"\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1269,\n                            \"y\": 390,\n                            \"uid\": \"Cm6f8rtr1iVI\",\n                            \"title\": \"object3d\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 21,\n                                    \"def\": null,\n                                    \"uid\": \"bEdPpC9C6Rh1\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 100,\n                            \"y\": 418,\n                            \"uid\": \"yrsHaUuJ9S0c\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 97,\n                            \"y\": 485,\n                            \"uid\": \"VbkpCdIhq5y7\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 95,\n                            \"y\": 551,\n                            \"uid\": \"7Z9ttLRFgpAa\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 441,\n                            \"y\": 467,\n                            \"uid\": \"GfvESOPSWsHN\",\n                            \"open\": false,\n                            \"title\": \"Position\"\n                        },\n                        {\n                            \"plugin\": \"url_texture_generator\",\n                            \"x\": 194,\n                            \"y\": 64,\n                            \"uid\": \"aYh1sdBe4USU\",\n                            \"state\": {\n                                \"url\": \"/data/image/a0ef7a98fe6f899443d2f5bf97b606bc2a94176a.png\"\n                            },\n                            \"title\": \"Box texture\"\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 943,\n                            \"y\": 320,\n                            \"uid\": \"vFzQT3JhyVuA\",\n                            \"state\": {\n                                \"enabled\": true\n                            },\n                            \"title\": \"Visible\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 503,\n                            \"y\": 763,\n                            \"uid\": \"junhAhI1VInp\",\n                            \"open\": false,\n                            \"title\": \"Scale\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 236,\n                            \"y\": 671,\n                            \"uid\": \"lmZdmTOP7rBZ\",\n                            \"open\": false,\n                            \"title\": \"Rotation\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 343,\n                            \"y\": 795,\n                            \"uid\": \"ewiXTX6luWIz\",\n                            \"state\": {\n                                \"val\": 0.5\n                            },\n                            \"title\": \"XYZ\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 98,\n                            \"y\": 656,\n                            \"uid\": \"9uvO6OEZMHy2\",\n                            \"state\": {\n                                \"val\": 0.4700000000000001\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 95,\n                            \"y\": 719,\n                            \"uid\": \"DTyW9vqjvK7V\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 93,\n                            \"y\": 775,\n                            \"uid\": \"YaN1ttDMtY14\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"three_material_lambert\",\n                            \"x\": 687,\n                            \"y\": 197,\n                            \"uid\": \"wcOMTgllUY1L\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 547,\n                            \"y\": 326,\n                            \"uid\": \"Rl4KgbLJJwQf\",\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Radius top\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 543,\n                            \"y\": 375,\n                            \"uid\": \"hvbMYTZIYpy1\",\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Radius bottom\"\n                        },\n                        {\n                            \"plugin\": \"annotation\",\n                            \"x\": 485,\n                            \"y\": 809,\n                            \"uid\": \"JrGslgv9dMx0\",\n                            \"state\": {\n                                \"text\": \"Radius vs Scale??\\n\",\n                                \"width\": 206,\n                                \"height\": 42\n                            }\n                        },\n                        {\n                            \"plugin\": \"three_geometry_cylinder\",\n                            \"x\": 734,\n                            \"y\": 342,\n                            \"uid\": \"wTXVxzhmulYW\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 542,\n                            \"y\": 422,\n                            \"uid\": \"ftujgzHJI1yU\",\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Height\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 539,\n                            \"y\": 480,\n                            \"uid\": \"q77FPsVMlLXm\",\n                            \"state\": {\n                                \"val\": 16\n                            },\n                            \"title\": \"Radius Segments\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 532,\n                            \"y\": 533,\n                            \"uid\": \"Nx1klZY2FyyX\",\n                            \"state\": {\n                                \"val\": 16\n                            },\n                            \"title\": \"Height Segments\"\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 553,\n                            \"y\": 585,\n                            \"uid\": \"38mCU3eDC4eX\",\n                            \"state\": {\n                                \"enabled\": false\n                            },\n                            \"title\": \"openEnded\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"l8whsUFFq6Mt\",\n                            \"dst_nuid\": \"Cm6f8rtr1iVI\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"zRsWgnCa23py\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"GfvESOPSWsHN\",\n                            \"dst_nuid\": \"l8whsUFFq6Mt\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"MbBT90ihyYHM\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"vFzQT3JhyVuA\",\n                            \"dst_nuid\": \"l8whsUFFq6Mt\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"uid\": \"UiT1XfddE4s9\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"ewiXTX6luWIz\",\n                            \"dst_nuid\": \"junhAhI1VInp\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"Zx6Zyo53OZjG\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"ewiXTX6luWIz\",\n                            \"dst_nuid\": \"junhAhI1VInp\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"OS0Iedx68c3G\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": \"ewiXTX6luWIz\",\n                            \"dst_nuid\": \"junhAhI1VInp\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"p73G40IW8coz\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"junhAhI1VInp\",\n                            \"dst_nuid\": \"l8whsUFFq6Mt\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"uid\": \"3DlUOn8efiMt\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"lmZdmTOP7rBZ\",\n                            \"dst_nuid\": \"l8whsUFFq6Mt\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"uid\": \"XWlxV8bcX3pC\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"9uvO6OEZMHy2\",\n                            \"dst_nuid\": \"lmZdmTOP7rBZ\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"oMxwXmq6E9Yv\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"DTyW9vqjvK7V\",\n                            \"dst_nuid\": \"lmZdmTOP7rBZ\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"JAofaGhIpjUJ\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"YaN1ttDMtY14\",\n                            \"dst_nuid\": \"lmZdmTOP7rBZ\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"y7CcQODl7SSy\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"yrsHaUuJ9S0c\",\n                            \"dst_nuid\": \"GfvESOPSWsHN\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"LuuisWChGil7\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"VbkpCdIhq5y7\",\n                            \"dst_nuid\": \"GfvESOPSWsHN\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"vETJj5adtnNY\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"7Z9ttLRFgpAa\",\n                            \"dst_nuid\": \"GfvESOPSWsHN\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"nmjilnAAqqAS\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"aYh1sdBe4USU\",\n                            \"dst_nuid\": \"wcOMTgllUY1L\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"M46o8TQTKZCl\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"wcOMTgllUY1L\",\n                            \"dst_nuid\": \"l8whsUFFq6Mt\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"hg54OEOqnkC2\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"wTXVxzhmulYW\",\n                            \"dst_nuid\": \"l8whsUFFq6Mt\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"SdHciPCUdoJB\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"Rl4KgbLJJwQf\",\n                            \"dst_nuid\": \"wTXVxzhmulYW\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"a3PHgsuze08Q\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"hvbMYTZIYpy1\",\n                            \"dst_nuid\": \"wTXVxzhmulYW\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"5ZrMFg0jB78C\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"ftujgzHJI1yU\",\n                            \"dst_nuid\": \"wTXVxzhmulYW\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"vu2l5RFGcWXG\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"q77FPsVMlLXm\",\n                            \"dst_nuid\": \"wTXVxzhmulYW\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"uid\": \"mqgs2ASFzSRm\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"Nx1klZY2FyyX\",\n                            \"dst_nuid\": \"wTXVxzhmulYW\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"uid\": \"CjLU9NazJOF9\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"38mCU3eDC4eX\",\n                            \"dst_nuid\": \"wTXVxzhmulYW\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"uid\": \"QpSIDvbYJjrc\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        }\n                    ]\n                },\n                \"dyn_out\": [\n                    {\n                        \"name\": \"object3d\",\n                        \"dt\": 21,\n                        \"index\": 0,\n                        \"uid\": \"mh0rTKkFm0nD\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/three_directional_light.json",
    "content": "{\n    \"abs_t\": 255.337,\n    \"active_graph\": \"root\",\n    \"graph_uid\": \"TI6whDg9VfHH\",\n    \"root\": {\n        \"uid\": \"root\",\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 110,\n                \"y\": 210,\n                \"uid\": \"rzCuIVwQdNMn\",\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {},\n                    \"output_sids\": {\n                        \"CpCjYdqPrFLH\": \"547odbJKrTzG\"\n                    }\n                },\n                \"title\": \"Directional light\",\n                \"graph\": {\n                    \"uid\": \"BZANvKRLi0rS\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1110,\n                            \"y\": 223,\n                            \"uid\": \"CpCjYdqPrFLH\",\n                            \"title\": \"object3d\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 21,\n                                    \"def\": null,\n                                    \"uid\": \"vSy6Gj4JSPYs\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"three_directional_light\",\n                            \"x\": 831,\n                            \"y\": 306,\n                            \"uid\": \"60mXmQJMMT3b\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 619,\n                            \"y\": 270,\n                            \"uid\": \"UqxYRwZ2kmpH\",\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Intensity\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 306,\n                            \"y\": 399,\n                            \"uid\": \"h3bavAJO540Y\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 303,\n                            \"y\": 466,\n                            \"uid\": \"XE312yfqrSJt\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 301,\n                            \"y\": 532,\n                            \"uid\": \"2EszqectGMSA\",\n                            \"state\": {\n                                \"val\": 2,\n                                \"min\": -1,\n                                \"max\": 2\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 639,\n                            \"y\": 472,\n                            \"uid\": \"wJ0qjuVpfpm3\",\n                            \"open\": false,\n                            \"title\": \"Position\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 639,\n                            \"y\": 560,\n                            \"uid\": \"5Db94QrW1GMj\",\n                            \"open\": false,\n                            \"title\": \"Scale\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 642,\n                            \"y\": 524,\n                            \"uid\": \"4ns9TIYjIdiR\",\n                            \"open\": false,\n                            \"title\": \"Rotation\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 476,\n                            \"y\": 708,\n                            \"uid\": \"58WAzSCQRNuu\",\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"XYZ\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 304,\n                            \"y\": 637,\n                            \"uid\": \"LzNjycd9TaMh\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 301,\n                            \"y\": 700,\n                            \"uid\": \"yibBQBDNQ2AT\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 299,\n                            \"y\": 756,\n                            \"uid\": \"F1Npc5NYLq6u\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 728,\n                            \"y\": 366,\n                            \"uid\": \"9sSEBj3n516K\",\n                            \"state\": {\n                                \"enabled\": true\n                            }\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"UqxYRwZ2kmpH\",\n                            \"dst_nuid\": \"60mXmQJMMT3b\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"ynZ4PkSK1BGl\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"h3bavAJO540Y\",\n                            \"dst_nuid\": \"wJ0qjuVpfpm3\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"LuuisWChGil7\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"XE312yfqrSJt\",\n                            \"dst_nuid\": \"wJ0qjuVpfpm3\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"vETJj5adtnNY\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"2EszqectGMSA\",\n                            \"dst_nuid\": \"wJ0qjuVpfpm3\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"nmjilnAAqqAS\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"58WAzSCQRNuu\",\n                            \"dst_nuid\": \"5Db94QrW1GMj\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"Zx6Zyo53OZjG\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"58WAzSCQRNuu\",\n                            \"dst_nuid\": \"5Db94QrW1GMj\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"OS0Iedx68c3G\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": \"58WAzSCQRNuu\",\n                            \"dst_nuid\": \"5Db94QrW1GMj\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"p73G40IW8coz\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"LzNjycd9TaMh\",\n                            \"dst_nuid\": \"4ns9TIYjIdiR\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"oMxwXmq6E9Yv\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"yibBQBDNQ2AT\",\n                            \"dst_nuid\": \"4ns9TIYjIdiR\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"JAofaGhIpjUJ\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"F1Npc5NYLq6u\",\n                            \"dst_nuid\": \"4ns9TIYjIdiR\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"y7CcQODl7SSy\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"wJ0qjuVpfpm3\",\n                            \"dst_nuid\": \"60mXmQJMMT3b\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"2x3eRyU5SDWl\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"4ns9TIYjIdiR\",\n                            \"dst_nuid\": \"60mXmQJMMT3b\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"94PZMYu2YD0S\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"5Db94QrW1GMj\",\n                            \"dst_nuid\": \"60mXmQJMMT3b\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"uid\": \"7R8EspyYchdw\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"9sSEBj3n516K\",\n                            \"dst_nuid\": \"60mXmQJMMT3b\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"uid\": \"0Ccx9SoUN7nS\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"60mXmQJMMT3b\",\n                            \"dst_nuid\": \"CpCjYdqPrFLH\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"GneZHvJz4rZT\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_out\": [\n                    {\n                        \"name\": \"object3d\",\n                        \"dt\": 21,\n                        \"index\": 0,\n                        \"uid\": \"547odbJKrTzG\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/three_dodecahedron.json",
    "content": "{\n    \"abs_t\": 226.303,\n    \"active_graph\": \"root\",\n    \"graph_uid\": \"TI6whDg9VfHH\",\n    \"root\": {\n        \"uid\": \"root\",\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 200,\n                \"y\": 300,\n                \"uid\": \"ASy8E1BHd7A3\",\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {},\n                    \"output_sids\": {\n                        \"G6MqByPr1xDl\": \"mh0rTKkFm0nD\"\n                    }\n                },\n                \"title\": \"Dodecahedron\",\n                \"graph\": {\n                    \"uid\": \"191JQlHe3z87\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"three_mesh\",\n                            \"x\": 1057,\n                            \"y\": 390,\n                            \"uid\": \"uLXvxVwEiPUm\"\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1269,\n                            \"y\": 390,\n                            \"uid\": \"G6MqByPr1xDl\",\n                            \"title\": \"object3d\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 21,\n                                    \"def\": null,\n                                    \"uid\": \"bEdPpC9C6Rh1\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 100,\n                            \"y\": 418,\n                            \"uid\": \"69iDAEtlxpF1\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 97,\n                            \"y\": 485,\n                            \"uid\": \"DBfK3ACi5Ilz\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 95,\n                            \"y\": 551,\n                            \"uid\": \"ffzr2I234a1H\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 441,\n                            \"y\": 467,\n                            \"uid\": \"p5Ly27Pb4pam\",\n                            \"open\": false,\n                            \"title\": \"Position\"\n                        },\n                        {\n                            \"plugin\": \"url_texture_generator\",\n                            \"x\": 194,\n                            \"y\": 64,\n                            \"uid\": \"WrKMGrGWFhI6\",\n                            \"state\": {\n                                \"url\": \"/data/image/a0ef7a98fe6f899443d2f5bf97b606bc2a94176a.png\"\n                            },\n                            \"title\": \"Box texture\"\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 943,\n                            \"y\": 320,\n                            \"uid\": \"LXsCs5b94Of5\",\n                            \"state\": {\n                                \"enabled\": true\n                            },\n                            \"title\": \"Visible\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 503,\n                            \"y\": 763,\n                            \"uid\": \"gb32eXALoZuz\",\n                            \"open\": false,\n                            \"title\": \"Scale\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 236,\n                            \"y\": 671,\n                            \"uid\": \"RyptkmGcsonn\",\n                            \"open\": false,\n                            \"title\": \"Rotation\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 343,\n                            \"y\": 795,\n                            \"uid\": \"7eAuGQoqBMIi\",\n                            \"state\": {\n                                \"val\": 0.1\n                            },\n                            \"title\": \"XYZ\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 98,\n                            \"y\": 656,\n                            \"uid\": \"k2uVOl3Md9xn\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 95,\n                            \"y\": 719,\n                            \"uid\": \"OHMVClw1okTR\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 93,\n                            \"y\": 775,\n                            \"uid\": \"Nsv0dM1FWVNe\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"three_material_lambert\",\n                            \"x\": 687,\n                            \"y\": 197,\n                            \"uid\": \"OjnsxMzhF28Q\"\n                        },\n                        {\n                            \"plugin\": \"three_geometry_dodecahedron\",\n                            \"x\": 672,\n                            \"y\": 342,\n                            \"uid\": \"G51Vk4iIHiYo\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 535,\n                            \"y\": 327,\n                            \"uid\": \"mTS2C4YoGooy\",\n                            \"state\": {\n                                \"val\": 3\n                            },\n                            \"title\": \"Radius\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 529,\n                            \"y\": 375,\n                            \"uid\": \"b8ThJav9e3zJ\",\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Detail\"\n                        },\n                        {\n                            \"plugin\": \"annotation\",\n                            \"x\": 667,\n                            \"y\": 408,\n                            \"uid\": \"ec2HSCBILsXS\",\n                            \"state\": {\n                                \"text\": \"Detail here is a bit weird?\\neven 1 seems to be quite high detail.\\n\",\n                                \"width\": 212,\n                                \"height\": 48\n                            }\n                        },\n                        {\n                            \"plugin\": \"annotation\",\n                            \"x\": 485,\n                            \"y\": 809,\n                            \"uid\": \"pua2f65zUFku\",\n                            \"state\": {\n                                \"text\": \"Radius vs Scale??\\n\",\n                                \"width\": 206,\n                                \"height\": 42\n                            }\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"uLXvxVwEiPUm\",\n                            \"dst_nuid\": \"G6MqByPr1xDl\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"zRsWgnCa23py\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"p5Ly27Pb4pam\",\n                            \"dst_nuid\": \"uLXvxVwEiPUm\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"MbBT90ihyYHM\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"LXsCs5b94Of5\",\n                            \"dst_nuid\": \"uLXvxVwEiPUm\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"uid\": \"UiT1XfddE4s9\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"7eAuGQoqBMIi\",\n                            \"dst_nuid\": \"gb32eXALoZuz\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"Zx6Zyo53OZjG\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"7eAuGQoqBMIi\",\n                            \"dst_nuid\": \"gb32eXALoZuz\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"OS0Iedx68c3G\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": \"7eAuGQoqBMIi\",\n                            \"dst_nuid\": \"gb32eXALoZuz\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"p73G40IW8coz\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"gb32eXALoZuz\",\n                            \"dst_nuid\": \"uLXvxVwEiPUm\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"uid\": \"3DlUOn8efiMt\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"RyptkmGcsonn\",\n                            \"dst_nuid\": \"uLXvxVwEiPUm\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"uid\": \"XWlxV8bcX3pC\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"k2uVOl3Md9xn\",\n                            \"dst_nuid\": \"RyptkmGcsonn\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"oMxwXmq6E9Yv\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"OHMVClw1okTR\",\n                            \"dst_nuid\": \"RyptkmGcsonn\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"JAofaGhIpjUJ\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"Nsv0dM1FWVNe\",\n                            \"dst_nuid\": \"RyptkmGcsonn\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"y7CcQODl7SSy\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"69iDAEtlxpF1\",\n                            \"dst_nuid\": \"p5Ly27Pb4pam\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"LuuisWChGil7\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"DBfK3ACi5Ilz\",\n                            \"dst_nuid\": \"p5Ly27Pb4pam\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"vETJj5adtnNY\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"ffzr2I234a1H\",\n                            \"dst_nuid\": \"p5Ly27Pb4pam\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"nmjilnAAqqAS\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"WrKMGrGWFhI6\",\n                            \"dst_nuid\": \"OjnsxMzhF28Q\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"M46o8TQTKZCl\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"OjnsxMzhF28Q\",\n                            \"dst_nuid\": \"uLXvxVwEiPUm\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"hg54OEOqnkC2\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"G51Vk4iIHiYo\",\n                            \"dst_nuid\": \"uLXvxVwEiPUm\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"nncNQZLooEDD\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"mTS2C4YoGooy\",\n                            \"dst_nuid\": \"G51Vk4iIHiYo\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"HGTJBu0IMMBv\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"b8ThJav9e3zJ\",\n                            \"dst_nuid\": \"G51Vk4iIHiYo\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"dwLKaAbUWL5f\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        }\n                    ]\n                },\n                \"dyn_out\": [\n                    {\n                        \"name\": \"object3d\",\n                        \"dt\": 21,\n                        \"index\": 0,\n                        \"uid\": \"mh0rTKkFm0nD\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/three_obj_loader.json",
    "content": "{\n    \"abs_t\": 14.223,\n    \"active_graph\": \"root\",\n    \"graph_uid\": \"MUi1NRN53bUh\",\n    \"root\": {\n        \"uid\": \"root\",\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 80,\n                \"y\": 187,\n                \"uid\": \"nv3XeKFMHdTv\",\n                \"state\": {\n                    \"always_update\": true,\n                    \"input_sids\": {},\n                    \"output_sids\": {\n                        \"tSKzgW8szxnl\": \"1TMlCKkGrwfO\"\n                    }\n                },\n                \"title\": \"OBJ loader\",\n                \"graph\": {\n                    \"uid\": \"tPJpWHVbluXb\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"three_loader_objmtl\",\n                            \"x\": 1810,\n                            \"y\": 208,\n                            \"uid\": \"C9sT6VIJPoCG\",\n                            \"state\": {\n                                \"url\": \"https://beta.vrsites.com/files/Murugo/bowser_peace.obj\"\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"dt\": 12,\n                                    \"uid\": \"aVQsCHhodVrcmat-bowser-body-m-eye\",\n                                    \"name\": \"mat-bowser-body-m-eye\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"dt\": 12,\n                                    \"uid\": \"aVQsCHhodVrcmat-bowser-body-m-body\",\n                                    \"name\": \"mat-bowser-body-m-body\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 1,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"const_text_generator\",\n                            \"x\": 933,\n                            \"y\": 114,\n                            \"uid\": \"o8s9dECeWzq9\",\n                            \"state\": {\n                                \"text\": \"https://beta.vrsites.com/files/Murugo/bowser_peace.obj\",\n                                \"width\": 255,\n                                \"height\": 229\n                            }\n                        },\n                        {\n                            \"plugin\": \"three_material_phong\",\n                            \"x\": 1422,\n                            \"y\": 501,\n                            \"uid\": \"qtqXSojM1zrv\"\n                        },\n                        {\n                            \"plugin\": \"url_texture_generator\",\n                            \"x\": 1121,\n                            \"y\": 489,\n                            \"uid\": \"O0173cSkHemR\",\n                            \"state\": {\n                                \"url\": \"/data/image/3620b475c9d54750238259412ea2f5550e82690a.png\"\n                            }\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 566,\n                            \"y\": 447,\n                            \"uid\": \"lP7vAKX8V8mv\",\n                            \"state\": {\n                                \"val\": -0.26271186,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 563,\n                            \"y\": 514,\n                            \"uid\": \"o8uhI9Tb6W7K\",\n                            \"state\": {\n                                \"val\": -0.3220339,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 561,\n                            \"y\": 580,\n                            \"uid\": \"10KDYLAY8m30\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 907,\n                            \"y\": 496,\n                            \"uid\": \"jwwcz9bgAc5l\",\n                            \"title\": \"Position\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 969,\n                            \"y\": 792,\n                            \"uid\": \"2IvEXe5HeKoR\",\n                            \"title\": \"Scale\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 702,\n                            \"y\": 700,\n                            \"uid\": \"cHEuXyDh5tBu\",\n                            \"title\": \"Rotation\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 809,\n                            \"y\": 824,\n                            \"uid\": \"E2Lamzl0UZZ5\",\n                            \"state\": {\n                                \"val\": 0.05\n                            },\n                            \"title\": \"XYZ\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 564,\n                            \"y\": 685,\n                            \"uid\": \"gSreAYoGr6XJ\",\n                            \"state\": {\n                                \"val\": 0.27000000000000013\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 561,\n                            \"y\": 748,\n                            \"uid\": \"hARBa2VXKsBy\",\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 559,\n                            \"y\": 804,\n                            \"uid\": \"dLuqRd7iJ6sO\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"color_picker\",\n                            \"x\": 1061,\n                            \"y\": 884,\n                            \"uid\": \"1PGm2HnrOC5u\",\n                            \"state\": {\n                                \"hue\": 0.71,\n                                \"sat\": 0.1,\n                                \"lum\": 0.76\n                            }\n                        },\n                        {\n                            \"plugin\": \"three_material_phong\",\n                            \"x\": 1424,\n                            \"y\": 818,\n                            \"uid\": \"2y9cqp5MSUNP\"\n                        },\n                        {\n                            \"plugin\": \"url_texture_generator\",\n                            \"x\": 1019,\n                            \"y\": 1055,\n                            \"uid\": \"69EnTBdB2Ef2\",\n                            \"state\": {\n                                \"url\": \"/data/image/e067e0db2aa5ea6d68e52c1ffaa76573506915f2.png\"\n                            }\n                        },\n                        {\n                            \"plugin\": \"color_picker\",\n                            \"x\": 1243,\n                            \"y\": 1124,\n                            \"uid\": \"Fj7sEsr6V5xk\",\n                            \"state\": {\n                                \"hue\": 0.71,\n                                \"sat\": 0,\n                                \"lum\": 0.91\n                            }\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 2282,\n                            \"y\": 184,\n                            \"uid\": \"tSKzgW8szxnl\",\n                            \"title\": \"object3d\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 21,\n                                    \"def\": null,\n                                    \"uid\": \"pdxePMgTTTRg\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 1610,\n                            \"y\": 298,\n                            \"uid\": \"hk7bdvpvdhKs\",\n                            \"state\": {\n                                \"enabled\": true\n                            },\n                            \"title\": \"Visible\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"o8s9dECeWzq9\",\n                            \"dst_nuid\": \"C9sT6VIJPoCG\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"DMn1LF8qXoJK\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"2y9cqp5MSUNP\",\n                            \"dst_nuid\": \"C9sT6VIJPoCG\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"Yfq8hVb8JsYs\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"jwwcz9bgAc5l\",\n                            \"dst_nuid\": \"C9sT6VIJPoCG\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"jKYwADE3O0Vb\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"qtqXSojM1zrv\",\n                            \"dst_nuid\": \"C9sT6VIJPoCG\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"SJskaU7FDotB\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"cHEuXyDh5tBu\",\n                            \"dst_nuid\": \"C9sT6VIJPoCG\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"Bqo30ENERkmv\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"2IvEXe5HeKoR\",\n                            \"dst_nuid\": \"C9sT6VIJPoCG\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"uid\": \"oP27gxtYqlvA\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"O0173cSkHemR\",\n                            \"dst_nuid\": \"qtqXSojM1zrv\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"71lHKWGKSdXf\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"1PGm2HnrOC5u\",\n                            \"dst_nuid\": \"qtqXSojM1zrv\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"LDk7Tkeqq0Om\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"lP7vAKX8V8mv\",\n                            \"dst_nuid\": \"jwwcz9bgAc5l\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"D8Y5utiigWu8\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"o8uhI9Tb6W7K\",\n                            \"dst_nuid\": \"jwwcz9bgAc5l\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"KVx7nIn9Gk4I\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"10KDYLAY8m30\",\n                            \"dst_nuid\": \"jwwcz9bgAc5l\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"wLEvPUHZIcoO\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"E2Lamzl0UZZ5\",\n                            \"dst_nuid\": \"2IvEXe5HeKoR\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"vb0DxxO6VVJX\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"E2Lamzl0UZZ5\",\n                            \"dst_nuid\": \"2IvEXe5HeKoR\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"BlhriHs2VUwh\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": \"E2Lamzl0UZZ5\",\n                            \"dst_nuid\": \"2IvEXe5HeKoR\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"66XOcidce7hW\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"gSreAYoGr6XJ\",\n                            \"dst_nuid\": \"cHEuXyDh5tBu\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"aG1i3FdxbWlp\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"dLuqRd7iJ6sO\",\n                            \"dst_nuid\": \"cHEuXyDh5tBu\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"OF8pSkYUhNYD\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"69EnTBdB2Ef2\",\n                            \"dst_nuid\": \"2y9cqp5MSUNP\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"DgtCDjjBWFHU\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"Fj7sEsr6V5xk\",\n                            \"dst_nuid\": \"2y9cqp5MSUNP\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"zNbkeDpp4K26\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"C9sT6VIJPoCG\",\n                            \"dst_nuid\": \"tSKzgW8szxnl\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"x4LV116lxfRP\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"hk7bdvpvdhKs\",\n                            \"dst_nuid\": \"C9sT6VIJPoCG\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"uid\": \"FEfUCoS7iVXB\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"hARBa2VXKsBy\",\n                            \"dst_nuid\": \"cHEuXyDh5tBu\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"r3dWxFBYnnIz\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        }\n                    ]\n                },\n                \"dyn_out\": [\n                    {\n                        \"name\": \"object3d\",\n                        \"dt\": 21,\n                        \"index\": 0,\n                        \"uid\": \"1TMlCKkGrwfO\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/three_plane_basic.json",
    "content": "{\n    \"abs_t\": 244.971,\n    \"active_graph\": \"root\",\n    \"graph_uid\": \"TI6whDg9VfHH\",\n    \"root\": {\n        \"uid\": \"root\",\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 359,\n                \"y\": 344,\n                \"uid\": \"lem9cU46wcpG\",\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {},\n                    \"output_sids\": {\n                        \"bF38HLzxbf14\": \"mh0rTKkFm0nD\"\n                    }\n                },\n                \"title\": \"Plane (basic material)\",\n                \"graph\": {\n                    \"uid\": \"ABAuyBeccEvs\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"three_mesh\",\n                            \"x\": 1057,\n                            \"y\": 390,\n                            \"uid\": \"muOUVUrWxDs2\"\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1269,\n                            \"y\": 390,\n                            \"uid\": \"bF38HLzxbf14\",\n                            \"title\": \"object3d\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 21,\n                                    \"def\": null,\n                                    \"uid\": \"bEdPpC9C6Rh1\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 100,\n                            \"y\": 418,\n                            \"uid\": \"hJCtQOnzpnCg\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 97,\n                            \"y\": 485,\n                            \"uid\": \"gb3R8J09RJGW\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 95,\n                            \"y\": 551,\n                            \"uid\": \"roeLp1eZMjHe\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 441,\n                            \"y\": 467,\n                            \"uid\": \"a8wJScwnzsOV\",\n                            \"open\": false,\n                            \"title\": \"Position\"\n                        },\n                        {\n                            \"plugin\": \"url_texture_generator\",\n                            \"x\": 194,\n                            \"y\": 64,\n                            \"uid\": \"xzra1rEc1V9G\",\n                            \"state\": {\n                                \"url\": \"/data/image/86b4f99c40c9b047957cc6c5c3364a070cb3c101.png\"\n                            },\n                            \"title\": \"Box texture\"\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 943,\n                            \"y\": 320,\n                            \"uid\": \"GouIJ4O7s5WH\",\n                            \"state\": {\n                                \"enabled\": true\n                            },\n                            \"title\": \"Visible\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 503,\n                            \"y\": 763,\n                            \"uid\": \"3UTelxL81ywd\",\n                            \"open\": false,\n                            \"title\": \"Scale\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 236,\n                            \"y\": 671,\n                            \"uid\": \"VKR5IqMxzC6A\",\n                            \"open\": false,\n                            \"title\": \"Rotation\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 343,\n                            \"y\": 795,\n                            \"uid\": \"nG0NsSe1F3fb\",\n                            \"state\": {\n                                \"val\": 0.4\n                            },\n                            \"title\": \"XYZ\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 98,\n                            \"y\": 656,\n                            \"uid\": \"9MDh739CO590\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 95,\n                            \"y\": 719,\n                            \"uid\": \"1Co3kqNJfQAh\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 93,\n                            \"y\": 775,\n                            \"uid\": \"w8Tj4lniCqfh\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"three_geometry_plane\",\n                            \"x\": 546,\n                            \"y\": 347,\n                            \"uid\": \"vDpbmXghWuRK\"\n                        },\n                        {\n                            \"plugin\": \"three_material\",\n                            \"x\": 664,\n                            \"y\": 235,\n                            \"uid\": \"mpyFKtinHERW\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"muOUVUrWxDs2\",\n                            \"dst_nuid\": \"bF38HLzxbf14\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"zRsWgnCa23py\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"a8wJScwnzsOV\",\n                            \"dst_nuid\": \"muOUVUrWxDs2\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"MbBT90ihyYHM\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"GouIJ4O7s5WH\",\n                            \"dst_nuid\": \"muOUVUrWxDs2\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"uid\": \"UiT1XfddE4s9\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"nG0NsSe1F3fb\",\n                            \"dst_nuid\": \"3UTelxL81ywd\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"Zx6Zyo53OZjG\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"nG0NsSe1F3fb\",\n                            \"dst_nuid\": \"3UTelxL81ywd\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"OS0Iedx68c3G\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": \"nG0NsSe1F3fb\",\n                            \"dst_nuid\": \"3UTelxL81ywd\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"p73G40IW8coz\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"3UTelxL81ywd\",\n                            \"dst_nuid\": \"muOUVUrWxDs2\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"uid\": \"3DlUOn8efiMt\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"VKR5IqMxzC6A\",\n                            \"dst_nuid\": \"muOUVUrWxDs2\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"uid\": \"XWlxV8bcX3pC\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"9MDh739CO590\",\n                            \"dst_nuid\": \"VKR5IqMxzC6A\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"oMxwXmq6E9Yv\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"1Co3kqNJfQAh\",\n                            \"dst_nuid\": \"VKR5IqMxzC6A\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"JAofaGhIpjUJ\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"w8Tj4lniCqfh\",\n                            \"dst_nuid\": \"VKR5IqMxzC6A\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"y7CcQODl7SSy\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"hJCtQOnzpnCg\",\n                            \"dst_nuid\": \"a8wJScwnzsOV\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"LuuisWChGil7\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"gb3R8J09RJGW\",\n                            \"dst_nuid\": \"a8wJScwnzsOV\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"vETJj5adtnNY\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"roeLp1eZMjHe\",\n                            \"dst_nuid\": \"a8wJScwnzsOV\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"nmjilnAAqqAS\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"vDpbmXghWuRK\",\n                            \"dst_nuid\": \"muOUVUrWxDs2\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"CpczJ00qqaEm\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"xzra1rEc1V9G\",\n                            \"dst_nuid\": \"mpyFKtinHERW\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"hITarW4B8jpa\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"mpyFKtinHERW\",\n                            \"dst_nuid\": \"muOUVUrWxDs2\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"KoLfW3krtROx\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        }\n                    ]\n                },\n                \"dyn_out\": [\n                    {\n                        \"name\": \"object3d\",\n                        \"dt\": 21,\n                        \"index\": 0,\n                        \"uid\": \"mh0rTKkFm0nD\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/three_plane_lambert.json",
    "content": "{\n    \"abs_t\": 233.887,\n    \"active_graph\": \"root\",\n    \"graph_uid\": \"TI6whDg9VfHH\",\n    \"root\": {\n        \"uid\": \"root\",\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 311,\n                \"y\": 282,\n                \"uid\": \"KaIlS7h7zt2C\",\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {},\n                    \"output_sids\": {\n                        \"dcsof4rW2C9s\": \"mh0rTKkFm0nD\"\n                    }\n                },\n                \"title\": \"Plane (lambert material)\",\n                \"graph\": {\n                    \"uid\": \"umMFaPLMkYsk\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"three_mesh\",\n                            \"x\": 1057,\n                            \"y\": 390,\n                            \"uid\": \"EOBhj8soVbo6\"\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1269,\n                            \"y\": 390,\n                            \"uid\": \"dcsof4rW2C9s\",\n                            \"title\": \"object3d\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 21,\n                                    \"def\": null,\n                                    \"uid\": \"bEdPpC9C6Rh1\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 100,\n                            \"y\": 418,\n                            \"uid\": \"yKIBFJncGGS6\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 97,\n                            \"y\": 485,\n                            \"uid\": \"Rmvr39EHS3As\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 95,\n                            \"y\": 551,\n                            \"uid\": \"rM2fJr161HJD\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 441,\n                            \"y\": 467,\n                            \"uid\": \"W4EJR6c9u34P\",\n                            \"open\": false,\n                            \"title\": \"Position\"\n                        },\n                        {\n                            \"plugin\": \"url_texture_generator\",\n                            \"x\": 194,\n                            \"y\": 64,\n                            \"uid\": \"QTvr7r2tdBPp\",\n                            \"state\": {\n                                \"url\": \"/data/image/86b4f99c40c9b047957cc6c5c3364a070cb3c101.png\"\n                            },\n                            \"title\": \"Box texture\"\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 943,\n                            \"y\": 320,\n                            \"uid\": \"RBZYm3j56Ui0\",\n                            \"state\": {\n                                \"enabled\": true\n                            },\n                            \"title\": \"Visible\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 503,\n                            \"y\": 763,\n                            \"uid\": \"phqwwZ9bDBkg\",\n                            \"open\": false,\n                            \"title\": \"Scale\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 236,\n                            \"y\": 671,\n                            \"uid\": \"JBErjUSCrWFr\",\n                            \"open\": false,\n                            \"title\": \"Rotation\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 343,\n                            \"y\": 795,\n                            \"uid\": \"XEU7UCJZ86Go\",\n                            \"state\": {\n                                \"val\": 0.4\n                            },\n                            \"title\": \"XYZ\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 98,\n                            \"y\": 656,\n                            \"uid\": \"fhnkYZrpm1AI\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 95,\n                            \"y\": 719,\n                            \"uid\": \"5RGhXAXRBhs7\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 93,\n                            \"y\": 775,\n                            \"uid\": \"VL0o8P7Igb6K\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"three_geometry_plane\",\n                            \"x\": 698,\n                            \"y\": 340,\n                            \"uid\": \"8LEIAian9Cw5\"\n                        },\n                        {\n                            \"plugin\": \"three_material_lambert\",\n                            \"x\": 694,\n                            \"y\": 260,\n                            \"uid\": \"Viu4rQaezA7L\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"EOBhj8soVbo6\",\n                            \"dst_nuid\": \"dcsof4rW2C9s\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"zRsWgnCa23py\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"W4EJR6c9u34P\",\n                            \"dst_nuid\": \"EOBhj8soVbo6\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"MbBT90ihyYHM\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"RBZYm3j56Ui0\",\n                            \"dst_nuid\": \"EOBhj8soVbo6\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"uid\": \"UiT1XfddE4s9\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"XEU7UCJZ86Go\",\n                            \"dst_nuid\": \"phqwwZ9bDBkg\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"Zx6Zyo53OZjG\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"XEU7UCJZ86Go\",\n                            \"dst_nuid\": \"phqwwZ9bDBkg\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"OS0Iedx68c3G\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": \"XEU7UCJZ86Go\",\n                            \"dst_nuid\": \"phqwwZ9bDBkg\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"p73G40IW8coz\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"phqwwZ9bDBkg\",\n                            \"dst_nuid\": \"EOBhj8soVbo6\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"uid\": \"3DlUOn8efiMt\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"JBErjUSCrWFr\",\n                            \"dst_nuid\": \"EOBhj8soVbo6\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"uid\": \"XWlxV8bcX3pC\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"fhnkYZrpm1AI\",\n                            \"dst_nuid\": \"JBErjUSCrWFr\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"oMxwXmq6E9Yv\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"5RGhXAXRBhs7\",\n                            \"dst_nuid\": \"JBErjUSCrWFr\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"JAofaGhIpjUJ\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"VL0o8P7Igb6K\",\n                            \"dst_nuid\": \"JBErjUSCrWFr\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"y7CcQODl7SSy\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"yKIBFJncGGS6\",\n                            \"dst_nuid\": \"W4EJR6c9u34P\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"LuuisWChGil7\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"Rmvr39EHS3As\",\n                            \"dst_nuid\": \"W4EJR6c9u34P\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"vETJj5adtnNY\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"rM2fJr161HJD\",\n                            \"dst_nuid\": \"W4EJR6c9u34P\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"nmjilnAAqqAS\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"8LEIAian9Cw5\",\n                            \"dst_nuid\": \"EOBhj8soVbo6\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"CpczJ00qqaEm\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"QTvr7r2tdBPp\",\n                            \"dst_nuid\": \"Viu4rQaezA7L\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"M46o8TQTKZCl\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"Viu4rQaezA7L\",\n                            \"dst_nuid\": \"EOBhj8soVbo6\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"hg54OEOqnkC2\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        }\n                    ]\n                },\n                \"dyn_out\": [\n                    {\n                        \"name\": \"object3d\",\n                        \"dt\": 21,\n                        \"index\": 0,\n                        \"uid\": \"mh0rTKkFm0nD\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/three_point_light.json",
    "content": "{\n    \"abs_t\": 288.29,\n    \"active_graph\": \"root\",\n    \"graph_uid\": \"TI6whDg9VfHH\",\n    \"root\": {\n        \"uid\": \"root\",\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 288,\n                \"y\": 426,\n                \"uid\": \"U31AITP6oikS\",\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {},\n                    \"output_sids\": {\n                        \"2X7kz5oxR4Np\": \"547odbJKrTzG\"\n                    }\n                },\n                \"title\": \"Point light\",\n                \"graph\": {\n                    \"uid\": \"DebjJSbmoYci\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1110,\n                            \"y\": 223,\n                            \"uid\": \"2X7kz5oxR4Np\",\n                            \"title\": \"object3d\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 21,\n                                    \"def\": null,\n                                    \"uid\": \"vSy6Gj4JSPYs\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 306,\n                            \"y\": 399,\n                            \"uid\": \"T2PfT2sS24YL\",\n                            \"state\": {\n                                \"val\": -0.1,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 303,\n                            \"y\": 466,\n                            \"uid\": \"J0tDdnNq5Xag\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 301,\n                            \"y\": 532,\n                            \"uid\": \"2jWWH8FrZvYk\",\n                            \"state\": {\n                                \"val\": 2,\n                                \"min\": -1,\n                                \"max\": 2\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 645,\n                            \"y\": 384,\n                            \"uid\": \"x8TTevSQ6fra\",\n                            \"title\": \"Position\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 639,\n                            \"y\": 560,\n                            \"uid\": \"u4za6r22HV6U\",\n                            \"title\": \"Scale\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 634,\n                            \"y\": 458,\n                            \"uid\": \"DatxkFfN7zFK\",\n                            \"title\": \"Rotation\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 476,\n                            \"y\": 708,\n                            \"uid\": \"tsIbmO65vL7t\",\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"XYZ\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 304,\n                            \"y\": 637,\n                            \"uid\": \"xSREktmMtEXu\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 301,\n                            \"y\": 700,\n                            \"uid\": \"PoAOIc3iNseu\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 299,\n                            \"y\": 756,\n                            \"uid\": \"h4240z6xBqaZ\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"three_point_light\",\n                            \"x\": 867,\n                            \"y\": 322,\n                            \"uid\": \"PA6GO5Ub9HSQ\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 702,\n                            \"y\": 273,\n                            \"uid\": \"tb3iWnDC6Row\",\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Intensity\"\n                        },\n                        {\n                            \"plugin\": \"annotation\",\n                            \"x\": 228,\n                            \"y\": 159,\n                            \"uid\": \"4vweKzjjJoCC\",\n                            \"state\": {\n                                \"text\": \"Can't make Point light work.\\nAnyone?\",\n                                \"width\": 189,\n                                \"height\": 92\n                            }\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"T2PfT2sS24YL\",\n                            \"dst_nuid\": \"x8TTevSQ6fra\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"LuuisWChGil7\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"J0tDdnNq5Xag\",\n                            \"dst_nuid\": \"x8TTevSQ6fra\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"vETJj5adtnNY\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"2jWWH8FrZvYk\",\n                            \"dst_nuid\": \"x8TTevSQ6fra\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"nmjilnAAqqAS\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"tsIbmO65vL7t\",\n                            \"dst_nuid\": \"u4za6r22HV6U\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"Zx6Zyo53OZjG\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"tsIbmO65vL7t\",\n                            \"dst_nuid\": \"u4za6r22HV6U\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"OS0Iedx68c3G\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": \"tsIbmO65vL7t\",\n                            \"dst_nuid\": \"u4za6r22HV6U\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"p73G40IW8coz\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"xSREktmMtEXu\",\n                            \"dst_nuid\": \"DatxkFfN7zFK\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"oMxwXmq6E9Yv\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"PoAOIc3iNseu\",\n                            \"dst_nuid\": \"DatxkFfN7zFK\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"JAofaGhIpjUJ\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"h4240z6xBqaZ\",\n                            \"dst_nuid\": \"DatxkFfN7zFK\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"y7CcQODl7SSy\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"PA6GO5Ub9HSQ\",\n                            \"dst_nuid\": \"2X7kz5oxR4Np\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"4cgiJstG5zSU\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"x8TTevSQ6fra\",\n                            \"dst_nuid\": \"PA6GO5Ub9HSQ\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"uid\": \"M2k7sKIBreZJ\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"DatxkFfN7zFK\",\n                            \"dst_nuid\": \"PA6GO5Ub9HSQ\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"uid\": \"vc1VPHZenmNx\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"u4za6r22HV6U\",\n                            \"dst_nuid\": \"PA6GO5Ub9HSQ\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"uid\": \"4Y1wGyUYKBGr\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"tb3iWnDC6Row\",\n                            \"dst_nuid\": \"PA6GO5Ub9HSQ\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"1nU0uv4JVEDG\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        }\n                    ]\n                },\n                \"dyn_out\": [\n                    {\n                        \"name\": \"object3d\",\n                        \"dt\": 21,\n                        \"index\": 0,\n                        \"uid\": \"547odbJKrTzG\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/three_position_rotation_scale.json",
    "content": "{\n    \"abs_t\": 80.562,\n    \"active_graph\": \"root\",\n    \"graph_uid\": \"MUi1NRN53bUh\",\n    \"root\": {\n        \"uid\": \"root\",\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 99,\n                \"y\": 231,\n                \"uid\": \"DzNSrVBlzYyw\",\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -1,\n                    \"max\": 1\n                },\n                \"title\": \"X\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 96,\n                \"y\": 298,\n                \"uid\": \"srA4RljtqBYa\",\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Y\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 94,\n                \"y\": 364,\n                \"uid\": \"1Jtbdi67JtfY\",\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -1,\n                    \"max\": 1\n                },\n                \"title\": \"Z\"\n            },\n            {\n                \"plugin\": \"vector\",\n                \"x\": 542,\n                \"y\": 246,\n                \"uid\": \"Yerg2g8jrrjK\",\n                \"title\": \"Position\"\n            },\n            {\n                \"plugin\": \"vector\",\n                \"x\": 555,\n                \"y\": 424,\n                \"uid\": \"5zBukuZaNcLg\",\n                \"title\": \"Scale\"\n            },\n            {\n                \"plugin\": \"vector\",\n                \"x\": 543,\n                \"y\": 325,\n                \"uid\": \"YRYs124ft7mW\",\n                \"title\": \"Rotation\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 403,\n                \"y\": 497,\n                \"uid\": \"2LFjrSvDZq3Q\",\n                \"state\": {\n                    \"val\": 0.4\n                },\n                \"title\": \"XYZ\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 72,\n                \"y\": 456,\n                \"uid\": \"flyTpK3YMWH0\",\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -5,\n                    \"max\": 5\n                },\n                \"title\": \"X\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 69,\n                \"y\": 523,\n                \"uid\": \"0FAW3eFwq3v9\",\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -5,\n                    \"max\": 5\n                },\n                \"title\": \"Y\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 67,\n                \"y\": 589,\n                \"uid\": \"xVZWXfnpt98K\",\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": -5,\n                    \"max\": 5\n                },\n                \"title\": \"Z\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": \"DzNSrVBlzYyw\",\n                \"dst_nuid\": \"Yerg2g8jrrjK\",\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"uid\": \"uPOkjA3S4Jpo\",\n                \"src_connected\": true,\n                \"dst_connected\": true\n            },\n            {\n                \"src_nuid\": \"srA4RljtqBYa\",\n                \"dst_nuid\": \"Yerg2g8jrrjK\",\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"uid\": \"TJQC8fKp7i44\",\n                \"src_connected\": true,\n                \"dst_connected\": true\n            },\n            {\n                \"src_nuid\": \"1Jtbdi67JtfY\",\n                \"dst_nuid\": \"Yerg2g8jrrjK\",\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"uid\": \"LjwzAKQFfYFn\",\n                \"src_connected\": true,\n                \"dst_connected\": true\n            },\n            {\n                \"src_nuid\": \"2LFjrSvDZq3Q\",\n                \"dst_nuid\": \"5zBukuZaNcLg\",\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"uid\": \"Fkqyp2DiLKtX\",\n                \"src_connected\": true,\n                \"dst_connected\": true\n            },\n            {\n                \"src_nuid\": \"2LFjrSvDZq3Q\",\n                \"dst_nuid\": \"5zBukuZaNcLg\",\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"uid\": \"PKiOPBfDD6Ak\",\n                \"src_connected\": true,\n                \"dst_connected\": true,\n                \"offset\": 1\n            },\n            {\n                \"src_nuid\": \"2LFjrSvDZq3Q\",\n                \"dst_nuid\": \"5zBukuZaNcLg\",\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"uid\": \"ym6iVJZfKeCK\",\n                \"src_connected\": true,\n                \"dst_connected\": true\n            },\n            {\n                \"src_nuid\": \"flyTpK3YMWH0\",\n                \"dst_nuid\": \"YRYs124ft7mW\",\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"uid\": \"cRW74a3G5jAf\",\n                \"src_connected\": true,\n                \"dst_connected\": true\n            },\n            {\n                \"src_nuid\": \"0FAW3eFwq3v9\",\n                \"dst_nuid\": \"YRYs124ft7mW\",\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"uid\": \"cnHzaNy5YMZo\",\n                \"src_connected\": true,\n                \"dst_connected\": true\n            },\n            {\n                \"src_nuid\": \"xVZWXfnpt98K\",\n                \"dst_nuid\": \"YRYs124ft7mW\",\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"uid\": \"vLgmqNknlVhZ\",\n                \"src_connected\": true,\n                \"dst_connected\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/three_sphere.json",
    "content": "{\n    \"abs_t\": 262.355,\n    \"active_graph\": \"root\",\n    \"graph_uid\": \"TI6whDg9VfHH\",\n    \"root\": {\n        \"uid\": \"root\",\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 221,\n                \"y\": 240,\n                \"uid\": \"J9dnwdsWM971\",\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {},\n                    \"output_sids\": {\n                        \"OzjF6BlVhopv\": \"mh0rTKkFm0nD\"\n                    }\n                },\n                \"title\": \"Sphere\",\n                \"graph\": {\n                    \"uid\": \"kUKodUvwNp7a\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"three_mesh\",\n                            \"x\": 1057,\n                            \"y\": 390,\n                            \"uid\": \"kra7lxXtBXtw\"\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1269,\n                            \"y\": 390,\n                            \"uid\": \"OzjF6BlVhopv\",\n                            \"title\": \"object3d\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 21,\n                                    \"def\": null,\n                                    \"uid\": \"bEdPpC9C6Rh1\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 100,\n                            \"y\": 418,\n                            \"uid\": \"FbwG33UiJpA1\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 97,\n                            \"y\": 485,\n                            \"uid\": \"sJGTQpgFCmF6\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 95,\n                            \"y\": 551,\n                            \"uid\": \"9jrYteJx4mxd\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 441,\n                            \"y\": 467,\n                            \"uid\": \"eFC8yqEjtGk8\",\n                            \"open\": false,\n                            \"title\": \"Position\"\n                        },\n                        {\n                            \"plugin\": \"url_texture_generator\",\n                            \"x\": 194,\n                            \"y\": 64,\n                            \"uid\": \"Ad9MoQf1UEN0\",\n                            \"state\": {\n                                \"url\": \"/data/image/a0ef7a98fe6f899443d2f5bf97b606bc2a94176a.png\"\n                            },\n                            \"title\": \"Box texture\"\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 943,\n                            \"y\": 320,\n                            \"uid\": \"yeur4Vur7Tho\",\n                            \"state\": {\n                                \"enabled\": true\n                            },\n                            \"title\": \"Visible\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 503,\n                            \"y\": 763,\n                            \"uid\": \"VTatipYNLPr1\",\n                            \"open\": false,\n                            \"title\": \"Scale\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 236,\n                            \"y\": 671,\n                            \"uid\": \"TrMsY1yRN43z\",\n                            \"open\": false,\n                            \"title\": \"Rotation\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 343,\n                            \"y\": 795,\n                            \"uid\": \"uHYY3yhwnnne\",\n                            \"state\": {\n                                \"val\": 0.4\n                            },\n                            \"title\": \"XYZ\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 98,\n                            \"y\": 656,\n                            \"uid\": \"O1lj2ZmCz727\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 95,\n                            \"y\": 719,\n                            \"uid\": \"RePm8TVYCJD6\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 93,\n                            \"y\": 775,\n                            \"uid\": \"MvO7hSR1ou9I\",\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"three_geometry_sphere\",\n                            \"x\": 595,\n                            \"y\": 249,\n                            \"uid\": \"UY8sf48e7Vxm\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 433,\n                            \"y\": 248,\n                            \"uid\": \"H49l6ai7iMFA\",\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Radius\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 435,\n                            \"y\": 301,\n                            \"uid\": \"XIUGcado485K\",\n                            \"state\": {\n                                \"val\": 64\n                            },\n                            \"title\": \"Segments\"\n                        },\n                        {\n                            \"plugin\": \"three_material_lambert\",\n                            \"x\": 613,\n                            \"y\": 128,\n                            \"uid\": \"bur5StFrSRuU\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"kra7lxXtBXtw\",\n                            \"dst_nuid\": \"OzjF6BlVhopv\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"zRsWgnCa23py\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"eFC8yqEjtGk8\",\n                            \"dst_nuid\": \"kra7lxXtBXtw\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"MbBT90ihyYHM\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"yeur4Vur7Tho\",\n                            \"dst_nuid\": \"kra7lxXtBXtw\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"uid\": \"UiT1XfddE4s9\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"uHYY3yhwnnne\",\n                            \"dst_nuid\": \"VTatipYNLPr1\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"Zx6Zyo53OZjG\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"uHYY3yhwnnne\",\n                            \"dst_nuid\": \"VTatipYNLPr1\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"OS0Iedx68c3G\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": \"uHYY3yhwnnne\",\n                            \"dst_nuid\": \"VTatipYNLPr1\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"p73G40IW8coz\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"VTatipYNLPr1\",\n                            \"dst_nuid\": \"kra7lxXtBXtw\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"uid\": \"3DlUOn8efiMt\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"TrMsY1yRN43z\",\n                            \"dst_nuid\": \"kra7lxXtBXtw\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"uid\": \"XWlxV8bcX3pC\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"O1lj2ZmCz727\",\n                            \"dst_nuid\": \"TrMsY1yRN43z\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"oMxwXmq6E9Yv\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"RePm8TVYCJD6\",\n                            \"dst_nuid\": \"TrMsY1yRN43z\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"JAofaGhIpjUJ\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"MvO7hSR1ou9I\",\n                            \"dst_nuid\": \"TrMsY1yRN43z\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"y7CcQODl7SSy\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"FbwG33UiJpA1\",\n                            \"dst_nuid\": \"eFC8yqEjtGk8\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"LuuisWChGil7\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"sJGTQpgFCmF6\",\n                            \"dst_nuid\": \"eFC8yqEjtGk8\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"vETJj5adtnNY\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"9jrYteJx4mxd\",\n                            \"dst_nuid\": \"eFC8yqEjtGk8\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"nmjilnAAqqAS\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"UY8sf48e7Vxm\",\n                            \"dst_nuid\": \"kra7lxXtBXtw\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"qJUj6fALecOx\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"H49l6ai7iMFA\",\n                            \"dst_nuid\": \"UY8sf48e7Vxm\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"LjGAtZyqK41r\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"XIUGcado485K\",\n                            \"dst_nuid\": \"UY8sf48e7Vxm\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"x6iVe9DW3eCj\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"XIUGcado485K\",\n                            \"dst_nuid\": \"UY8sf48e7Vxm\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"QDlkhdaQEHL3\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"bur5StFrSRuU\",\n                            \"dst_nuid\": \"kra7lxXtBXtw\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"x5owHyYcbb91\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"Ad9MoQf1UEN0\",\n                            \"dst_nuid\": \"bur5StFrSRuU\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"B9EMXM19mTOs\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        }\n                    ]\n                },\n                \"dyn_out\": [\n                    {\n                        \"name\": \"object3d\",\n                        \"dt\": 21,\n                        \"index\": 0,\n                        \"uid\": \"mh0rTKkFm0nD\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/three_vr_camera.json",
    "content": "{\n    \"abs_t\": 269.255,\n    \"active_graph\": \"root\",\n    \"graph_uid\": \"TI6whDg9VfHH\",\n    \"root\": {\n        \"uid\": \"root\",\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 261,\n                \"y\": 265,\n                \"uid\": \"J0OKNbEI1crw\",\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {},\n                    \"output_sids\": {\n                        \"xC7Qj8U2KDwf\": \"8GpdZjiiiEQa\"\n                    }\n                },\n                \"title\": \"VR camera\",\n                \"graph\": {\n                    \"uid\": \"GXxlOVFrRAQA\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"three_vr_camera\",\n                            \"x\": 899,\n                            \"y\": 233,\n                            \"uid\": \"hx7CYbhI78f1\"\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1077,\n                            \"y\": 294,\n                            \"uid\": \"xC7Qj8U2KDwf\",\n                            \"title\": \"camera\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 6,\n                                    \"def\": null,\n                                    \"uid\": \"uyyGR7LQwSEh\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 443,\n                            \"y\": 217,\n                            \"uid\": \"c6270oRHynAB\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 440,\n                            \"y\": 284,\n                            \"uid\": \"E3XYUASCT7VY\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 438,\n                            \"y\": 350,\n                            \"uid\": \"kTSZO6Hm038T\",\n                            \"state\": {\n                                \"val\": 2,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 736,\n                            \"y\": 244,\n                            \"uid\": \"y6TtFMcMXmUn\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 772,\n                            \"y\": 183,\n                            \"uid\": \"eguTXsRqSaX5\",\n                            \"state\": {\n                                \"val\": 45\n                            },\n                            \"title\": \"FOV\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"hx7CYbhI78f1\",\n                            \"dst_nuid\": \"xC7Qj8U2KDwf\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"JsoCbqqXFrqv\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"c6270oRHynAB\",\n                            \"dst_nuid\": \"y6TtFMcMXmUn\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"SLv1XBnHMxMi\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"E3XYUASCT7VY\",\n                            \"dst_nuid\": \"y6TtFMcMXmUn\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"I9a5nju0SzbI\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"kTSZO6Hm038T\",\n                            \"dst_nuid\": \"y6TtFMcMXmUn\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"ND97vtAXhssC\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"y6TtFMcMXmUn\",\n                            \"dst_nuid\": \"hx7CYbhI78f1\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"Dz79JT5WRnA5\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"eguTXsRqSaX5\",\n                            \"dst_nuid\": \"hx7CYbhI78f1\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"eZFW97ARUAgE\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        }\n                    ]\n                },\n                \"dyn_out\": [\n                    {\n                        \"name\": \"camera\",\n                        \"dt\": 6,\n                        \"index\": 0,\n                        \"uid\": \"8GpdZjiiiEQa\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/time_accumulating_time.json",
    "content": "{\n    \"abs_t\": 4.628,\n    \"active_graph\": 0,\n    \"graph_uid\": 2,\n    \"root\": {\n        \"node_uid\": 4,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 662,\n                \"y\": 456,\n                \"uid\": 0,\n                \"dsid\": 2,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"rt_filter\": 9729,\n                    \"input_sids\": {\n                        \"7\": 1\n                    },\n                    \"output_sids\": {\n                        \"6\": 0\n                    }\n                },\n                \"title\": \"Time\",\n                \"graph\": {\n                    \"node_uid\": 17,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"delta_t_generator\",\n                            \"x\": 234,\n                            \"y\": 203,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 359,\n                            \"y\": 193,\n                            \"uid\": 2\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 785,\n                            \"y\": 240,\n                            \"uid\": 6,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"time\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 250,\n                            \"y\": 262,\n                            \"uid\": 7,\n                            \"dsid\": 6,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Speed\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"register_local_read\",\n                            \"x\": 376,\n                            \"y\": 310,\n                            \"uid\": 9,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"float\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"register_local_write\",\n                            \"x\": 745,\n                            \"y\": 188,\n                            \"uid\": 10,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"float\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"add_modulator\",\n                            \"x\": 484,\n                            \"y\": 223,\n                            \"uid\": 11\n                        },\n                        {\n                            \"plugin\": \"if_else_modulator\",\n                            \"x\": 604,\n                            \"y\": 249,\n                            \"uid\": 13\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 488,\n                            \"y\": 351,\n                            \"uid\": 14,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Reset\"\n                        },\n                        {\n                            \"plugin\": \"initialise_generator\",\n                            \"x\": 520,\n                            \"y\": 160,\n                            \"uid\": 15\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 13,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 11,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 11,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 13,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 13,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        }\n                    ],\n                    \"registers\": [\n                        {\n                            \"id\": \"float\",\n                            \"dt\": 0\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Speed\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"time\",\n                        \"dt\": 0,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 460,\n                \"y\": 476,\n                \"uid\": 1,\n                \"state\": {\n                    \"val\": 0.36666666666666664,\n                    \"min\": 0,\n                    \"max\": 1\n                },\n                \"title\": \"Speed\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 1,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/time_circular_motion_to_xyz.json",
    "content": "{\"abs_t\":639.665,\"active_graph\":0,\"graph_uid\":5,\"root\":{\"node_uid\":38,\"uid\":0,\"parent_uid\":-1,\"nodes\":[{\"plugin\":\"graph\",\"x\":240,\"y\":29,\"uid\":18,\"dsid\":6,\"state\":{\"enabled\":true,\"input_sids\":{\"11\":1,\"19\":2},\"output_sids\":{\"22\":3,\"23\":4,\"24\":5}},\"title\":\"Circular motion\",\"graph\":{\"node_uid\":25,\"uid\":2,\"parent_uid\":0,\"nodes\":[{\"plugin\":\"const_float_generator\",\"x\":338,\"y\":416,\"uid\":1,\"state\":{\"val\":0.25}},{\"plugin\":\"sine_modulator\",\"x\":476,\"y\":146,\"uid\":2},{\"plugin\":\"multiply_modulator\",\"x\":292,\"y\":177,\"uid\":6},{\"plugin\":\"delta_t_generator\",\"x\":212,\"y\":177,\"uid\":8},{\"plugin\":\"accumulate_modulator\",\"x\":372,\"y\":177,\"uid\":9,\"state\":{\"value\":-204.69823999997405}},{\"plugin\":\"input_proxy\",\"x\":141,\"y\":270,\"uid\":11,\"dsid\":8,\"state\":{\"slot_id\":0},\"title\":\"speed\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"cosine_modulator\",\"x\":486,\"y\":230,\"uid\":12},{\"plugin\":\"multiply_modulator\",\"x\":567,\"y\":143,\"uid\":16},{\"plugin\":\"multiply_modulator\",\"x\":558,\"y\":225,\"uid\":17},{\"plugin\":\"input_proxy\",\"x\":570,\"y\":391,\"uid\":19,\"dsid\":8,\"state\":{\"slot_id\":0},\"title\":\"radius\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"sine_modulator\",\"x\":478,\"y\":305,\"uid\":20},{\"plugin\":\"multiply_modulator\",\"x\":569,\"y\":302,\"uid\":21},{\"plugin\":\"output_proxy\",\"x\":680,\"y\":174,\"uid\":22,\"dsid\":7,\"state\":{\"slot_id\":0},\"title\":\"X\",\"dyn_in\":[{\"name\":\"input\",\"dt\":0,\"desc\":\"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":694,\"y\":235,\"uid\":23,\"dsid\":8,\"state\":{\"slot_id\":0},\"title\":\"Y\",\"dyn_in\":[{\"name\":\"input\",\"dt\":0,\"desc\":\"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":666,\"y\":343,\"uid\":24,\"dsid\":8,\"state\":{\"slot_id\":0},\"title\":\"Z\",\"dyn_in\":[{\"name\":\"input\",\"dt\":0,\"desc\":\"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":9,\"dst_nuid\":2,\"src_slot\":\"value\",\"dst_slot\":\"time\"},{\"src_nuid\":8,\"dst_nuid\":6,\"src_slot\":\"seconds\",\"dst_slot\":\"a\"},{\"src_nuid\":6,\"dst_nuid\":9,\"src_slot\":\"result\",\"dst_slot\":\"value\"},{\"src_nuid\":11,\"dst_nuid\":6,\"src_slot\":0,\"dst_slot\":\"b\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":9,\"dst_nuid\":12,\"src_slot\":\"value\",\"dst_slot\":\"time\",\"offset\":1},{\"src_nuid\":2,\"dst_nuid\":16,\"src_slot\":\"value\",\"dst_slot\":\"a\"},{\"src_nuid\":12,\"dst_nuid\":17,\"src_slot\":\"value\",\"dst_slot\":\"a\"},{\"src_nuid\":19,\"dst_nuid\":16,\"src_slot\":0,\"dst_slot\":\"b\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":19,\"dst_nuid\":17,\"src_slot\":0,\"dst_slot\":\"b\",\"src_connected\":true,\"src_dyn\":true,\"offset\":1},{\"src_nuid\":20,\"dst_nuid\":21,\"src_slot\":\"value\",\"dst_slot\":\"a\"},{\"src_nuid\":19,\"dst_nuid\":21,\"src_slot\":0,\"dst_slot\":\"b\",\"src_connected\":true,\"src_dyn\":true,\"offset\":2},{\"src_nuid\":16,\"dst_nuid\":22,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":17,\"dst_nuid\":23,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":21,\"dst_nuid\":24,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"name\":\"speed\",\"dt\":0,\"uid\":1,\"index\":0,\"type\":0,\"is_connected\":true},{\"name\":\"radius\",\"dt\":0,\"uid\":2,\"index\":1,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"X\",\"dt\":0,\"uid\":3,\"index\":0,\"type\":1},{\"name\":\"Y\",\"dt\":0,\"uid\":4,\"index\":1,\"type\":1},{\"name\":\"Z\",\"dt\":0,\"uid\":5,\"index\":2,\"type\":1}]},{\"plugin\":\"slider_float_generator\",\"x\":43,\"y\":29,\"uid\":19,\"state\":{\"val\":-0.32,\"min\":-2,\"max\":2},\"title\":\"Speed\"},{\"plugin\":\"slider_float_generator\",\"x\":43,\"y\":97,\"uid\":20,\"state\":{\"val\":6,\"min\":0,\"max\":20},\"title\":\"radius\"}],\"conns\":[{\"src_nuid\":19,\"dst_nuid\":18,\"src_slot\":\"value\",\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":20,\"dst_nuid\":18,\"src_slot\":\"value\",\"dst_slot\":1,\"dst_dyn\":true}]}}"
  },
  {
    "path": "browser/patches/time_oscillate_2_values_in_tween.json",
    "content": "{\n    \"abs_t\": 222.061,\n    \"active_graph\": 0,\n    \"graph_uid\": 4,\n    \"root\": {\n        \"node_uid\": 8,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 527,\n                \"y\": 208,\n                \"uid\": 2,\n                \"dsid\": 10,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"rt_filter\": 9729,\n                    \"input_sids\": {\n                        \"28\": 6,\n                        \"41\": 8,\n                        \"42\": 9\n                    },\n                    \"output_sids\": {\n                        \"40\": 7\n                    }\n                },\n                \"title\": \"Oscillate with In tween\",\n                \"graph\": {\n                    \"node_uid\": 48,\n                    \"uid\": 2,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"delta_t_generator\",\n                            \"x\": 62,\n                            \"y\": 232,\n                            \"uid\": 25\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 187,\n                            \"y\": 222,\n                            \"uid\": 26\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 78,\n                            \"y\": 291,\n                            \"uid\": 28,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Speed\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"register_local_read\",\n                            \"x\": 204,\n                            \"y\": 339,\n                            \"uid\": 29,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"float\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"register_local_write\",\n                            \"x\": 589,\n                            \"y\": 178,\n                            \"uid\": 30,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"float\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"add_modulator\",\n                            \"x\": 312,\n                            \"y\": 252,\n                            \"uid\": 31\n                        },\n                        {\n                            \"plugin\": \"if_else_modulator\",\n                            \"x\": 432,\n                            \"y\": 278,\n                            \"uid\": 32\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 316,\n                            \"y\": 380,\n                            \"uid\": 33,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Reset\"\n                        },\n                        {\n                            \"plugin\": \"initialise_generator\",\n                            \"x\": 348,\n                            \"y\": 189,\n                            \"uid\": 34\n                        },\n                        {\n                            \"plugin\": \"sine_modulator\",\n                            \"x\": 550,\n                            \"y\": 289,\n                            \"uid\": 35\n                        },\n                        {\n                            \"plugin\": \"subtract_modulator\",\n                            \"x\": 664,\n                            \"y\": 404,\n                            \"uid\": 36\n                        },\n                        {\n                            \"plugin\": \"convert_oscilator_unit_modulator\",\n                            \"x\": 629,\n                            \"y\": 289,\n                            \"uid\": 37\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 967,\n                            \"y\": 260,\n                            \"uid\": 38\n                        },\n                        {\n                            \"plugin\": \"add_modulator\",\n                            \"x\": 1067,\n                            \"y\": 301,\n                            \"uid\": 39\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1158,\n                            \"y\": 304,\n                            \"uid\": 40,\n                            \"dsid\": 10,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"float\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 538,\n                            \"y\": 399,\n                            \"uid\": 41,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Min\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 604,\n                            \"y\": 404,\n                            \"uid\": 42,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Max\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"tween_in_modulator\",\n                            \"x\": 774,\n                            \"y\": 250,\n                            \"uid\": 47,\n                            \"state\": {\n                                \"type\": 0\n                            }\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 28,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 26,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 29,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 31,\n                            \"dst_nuid\": 32,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        },\n                        {\n                            \"src_nuid\": 34,\n                            \"dst_nuid\": 32,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 33,\n                            \"dst_nuid\": 32,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 35,\n                            \"dst_nuid\": 37,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 42,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 41,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 36,\n                            \"dst_nuid\": 38,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 38,\n                            \"dst_nuid\": 39,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 41,\n                            \"dst_nuid\": 39,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 39,\n                            \"dst_nuid\": 40,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 32,\n                            \"dst_nuid\": 30,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 32,\n                            \"dst_nuid\": 35,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 47,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": false\n                        },\n                        {\n                            \"src_nuid\": 47,\n                            \"dst_nuid\": 38,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        }\n                    ],\n                    \"registers\": [\n                        {\n                            \"id\": \"float\",\n                            \"dt\": 8\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Speed\",\n                        \"dt\": 0,\n                        \"uid\": 6,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Min\",\n                        \"dt\": 0,\n                        \"uid\": 8,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Max\",\n                        \"dt\": 0,\n                        \"uid\": 9,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"float\",\n                        \"dt\": 0,\n                        \"uid\": 7,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 333,\n                \"y\": 208,\n                \"uid\": 3,\n                \"state\": {\n                    \"val\": 0.42,\n                    \"min\": 0,\n                    \"max\": 1\n                },\n                \"title\": \"speed\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 332,\n                \"y\": 272,\n                \"uid\": 4,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Min\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 420,\n                \"y\": 272,\n                \"uid\": 5,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Max\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 3,\n                \"dst_nuid\": 2,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 2,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 2,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/time_oscillate_2_values_out_tween.json",
    "content": "{\n    \"abs_t\": 222.061,\n    \"active_graph\": 0,\n    \"graph_uid\": 4,\n    \"root\": {\n        \"node_uid\": 8,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 527,\n                \"y\": 208,\n                \"uid\": 2,\n                \"dsid\": 10,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"rt_filter\": 9729,\n                    \"input_sids\": {\n                        \"28\": 6,\n                        \"41\": 8,\n                        \"42\": 9\n                    },\n                    \"output_sids\": {\n                        \"40\": 7\n                    }\n                },\n                \"title\": \"Oscillate with Out tween\",\n                \"graph\": {\n                    \"node_uid\": 49,\n                    \"uid\": 2,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"delta_t_generator\",\n                            \"x\": 62,\n                            \"y\": 232,\n                            \"uid\": 25\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 187,\n                            \"y\": 222,\n                            \"uid\": 26\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 78,\n                            \"y\": 291,\n                            \"uid\": 28,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Speed\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"register_local_read\",\n                            \"x\": 204,\n                            \"y\": 339,\n                            \"uid\": 29,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"float\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"register_local_write\",\n                            \"x\": 589,\n                            \"y\": 178,\n                            \"uid\": 30,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"float\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"add_modulator\",\n                            \"x\": 312,\n                            \"y\": 252,\n                            \"uid\": 31\n                        },\n                        {\n                            \"plugin\": \"if_else_modulator\",\n                            \"x\": 432,\n                            \"y\": 278,\n                            \"uid\": 32\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 316,\n                            \"y\": 380,\n                            \"uid\": 33,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Reset\"\n                        },\n                        {\n                            \"plugin\": \"initialise_generator\",\n                            \"x\": 348,\n                            \"y\": 189,\n                            \"uid\": 34\n                        },\n                        {\n                            \"plugin\": \"sine_modulator\",\n                            \"x\": 550,\n                            \"y\": 289,\n                            \"uid\": 35\n                        },\n                        {\n                            \"plugin\": \"subtract_modulator\",\n                            \"x\": 664,\n                            \"y\": 404,\n                            \"uid\": 36\n                        },\n                        {\n                            \"plugin\": \"convert_oscilator_unit_modulator\",\n                            \"x\": 629,\n                            \"y\": 289,\n                            \"uid\": 37\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 967,\n                            \"y\": 260,\n                            \"uid\": 38\n                        },\n                        {\n                            \"plugin\": \"add_modulator\",\n                            \"x\": 1067,\n                            \"y\": 301,\n                            \"uid\": 39\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 1158,\n                            \"y\": 304,\n                            \"uid\": 40,\n                            \"dsid\": 10,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"float\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 538,\n                            \"y\": 399,\n                            \"uid\": 41,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Min\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 604,\n                            \"y\": 404,\n                            \"uid\": 42,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Max\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"tween_out_modulator\",\n                            \"x\": 776,\n                            \"y\": 277,\n                            \"uid\": 48,\n                            \"state\": {\n                                \"type\": 0\n                            }\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 28,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 26,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 29,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 31,\n                            \"dst_nuid\": 32,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        },\n                        {\n                            \"src_nuid\": 34,\n                            \"dst_nuid\": 32,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 33,\n                            \"dst_nuid\": 32,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 35,\n                            \"dst_nuid\": 37,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 42,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 41,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 36,\n                            \"dst_nuid\": 38,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 38,\n                            \"dst_nuid\": 39,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 41,\n                            \"dst_nuid\": 39,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 39,\n                            \"dst_nuid\": 40,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 32,\n                            \"dst_nuid\": 30,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 32,\n                            \"dst_nuid\": 35,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 48,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 48,\n                            \"dst_nuid\": 38,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        }\n                    ],\n                    \"registers\": [\n                        {\n                            \"id\": \"float\",\n                            \"dt\": 8\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Speed\",\n                        \"dt\": 0,\n                        \"uid\": 6,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Min\",\n                        \"dt\": 0,\n                        \"uid\": 8,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Max\",\n                        \"dt\": 0,\n                        \"uid\": 9,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"float\",\n                        \"dt\": 0,\n                        \"uid\": 7,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 333,\n                \"y\": 208,\n                \"uid\": 3,\n                \"state\": {\n                    \"val\": 0.42,\n                    \"min\": 0,\n                    \"max\": 1\n                },\n                \"title\": \"speed\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 332,\n                \"y\": 272,\n                \"uid\": 4,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Min\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 420,\n                \"y\": 272,\n                \"uid\": 5,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Max\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 3,\n                \"dst_nuid\": 2,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 2,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 2,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/time_oscillate_between_2_values.json",
    "content": "{\n    \"abs_t\": 222.061,\n    \"active_graph\": 0,\n    \"graph_uid\": 3,\n    \"root\": {\n        \"node_uid\": 8,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 527,\n                \"y\": 208,\n                \"uid\": 2,\n                \"dsid\": 10,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"rt_filter\": 9729,\n                    \"input_sids\": {\n                        \"28\": 6,\n                        \"41\": 8,\n                        \"42\": 9\n                    },\n                    \"output_sids\": {\n                        \"40\": 7\n                    }\n                },\n                \"title\": \"Oscillate\",\n                \"graph\": {\n                    \"node_uid\": 43,\n                    \"uid\": 2,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"delta_t_generator\",\n                            \"x\": 62,\n                            \"y\": 232,\n                            \"uid\": 25\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 187,\n                            \"y\": 222,\n                            \"uid\": 26\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 78,\n                            \"y\": 291,\n                            \"uid\": 28,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Speed\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"register_local_read\",\n                            \"x\": 204,\n                            \"y\": 339,\n                            \"uid\": 29,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"float\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"register_local_write\",\n                            \"x\": 589,\n                            \"y\": 178,\n                            \"uid\": 30,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"float\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"add_modulator\",\n                            \"x\": 312,\n                            \"y\": 252,\n                            \"uid\": 31\n                        },\n                        {\n                            \"plugin\": \"if_else_modulator\",\n                            \"x\": 432,\n                            \"y\": 278,\n                            \"uid\": 32\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 316,\n                            \"y\": 380,\n                            \"uid\": 33,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Reset\"\n                        },\n                        {\n                            \"plugin\": \"initialise_generator\",\n                            \"x\": 348,\n                            \"y\": 189,\n                            \"uid\": 34\n                        },\n                        {\n                            \"plugin\": \"sine_modulator\",\n                            \"x\": 550,\n                            \"y\": 289,\n                            \"uid\": 35\n                        },\n                        {\n                            \"plugin\": \"subtract_modulator\",\n                            \"x\": 664,\n                            \"y\": 404,\n                            \"uid\": 36\n                        },\n                        {\n                            \"plugin\": \"convert_oscilator_unit_modulator\",\n                            \"x\": 629,\n                            \"y\": 289,\n                            \"uid\": 37\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 753,\n                            \"y\": 289,\n                            \"uid\": 38\n                        },\n                        {\n                            \"plugin\": \"add_modulator\",\n                            \"x\": 836,\n                            \"y\": 344,\n                            \"uid\": 39\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 919,\n                            \"y\": 344,\n                            \"uid\": 40,\n                            \"dsid\": 9,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"float\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 538,\n                            \"y\": 399,\n                            \"uid\": 41,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Min\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 604,\n                            \"y\": 404,\n                            \"uid\": 42,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Max\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 28,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 26,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 29,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 31,\n                            \"dst_nuid\": 32,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        },\n                        {\n                            \"src_nuid\": 34,\n                            \"dst_nuid\": 32,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 33,\n                            \"dst_nuid\": 32,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 35,\n                            \"dst_nuid\": 37,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 42,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 41,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 36,\n                            \"dst_nuid\": 38,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 38,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 38,\n                            \"dst_nuid\": 39,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 41,\n                            \"dst_nuid\": 39,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 39,\n                            \"dst_nuid\": 40,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 32,\n                            \"dst_nuid\": 30,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 32,\n                            \"dst_nuid\": 35,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": false,\n                            \"offset\": 1\n                        }\n                    ],\n                    \"registers\": [\n                        {\n                            \"id\": \"float\",\n                            \"dt\": 8\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Speed\",\n                        \"dt\": 0,\n                        \"uid\": 6,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Min\",\n                        \"dt\": 0,\n                        \"uid\": 8,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Max\",\n                        \"dt\": 0,\n                        \"uid\": 9,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"float\",\n                        \"dt\": 0,\n                        \"uid\": 7,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 333,\n                \"y\": 208,\n                \"uid\": 3,\n                \"state\": {\n                    \"val\": 0.42,\n                    \"min\": 0,\n                    \"max\": 1\n                },\n                \"title\": \"speed\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 332,\n                \"y\": 272,\n                \"uid\": 4,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Min\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 420,\n                \"y\": 272,\n                \"uid\": 5,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Max\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 3,\n                \"dst_nuid\": 2,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 2,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 2,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/time_oscillate_with_sawtooth.json",
    "content": "{\n    \"abs_t\": 222.061,\n    \"active_graph\": 0,\n    \"graph_uid\": 9,\n    \"root\": {\n        \"node_uid\": 20,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 651,\n                \"y\": 426,\n                \"uid\": 16,\n                \"dsid\": 10,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"rt_filter\": 9729,\n                    \"input_sids\": {\n                        \"28\": 6,\n                        \"41\": 8,\n                        \"42\": 9\n                    },\n                    \"output_sids\": {\n                        \"40\": 7\n                    }\n                },\n                \"title\": \"Oscillate Sawtooth\",\n                \"graph\": {\n                    \"node_uid\": 48,\n                    \"uid\": 7,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"delta_t_generator\",\n                            \"x\": 62,\n                            \"y\": 232,\n                            \"uid\": 25\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 187,\n                            \"y\": 222,\n                            \"uid\": 26\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 78,\n                            \"y\": 291,\n                            \"uid\": 28,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Speed\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"register_local_read\",\n                            \"x\": 204,\n                            \"y\": 339,\n                            \"uid\": 29,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"float\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"register_local_write\",\n                            \"x\": 589,\n                            \"y\": 178,\n                            \"uid\": 30,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"float\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"add_modulator\",\n                            \"x\": 312,\n                            \"y\": 252,\n                            \"uid\": 31\n                        },\n                        {\n                            \"plugin\": \"if_else_modulator\",\n                            \"x\": 432,\n                            \"y\": 278,\n                            \"uid\": 32\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 316,\n                            \"y\": 380,\n                            \"uid\": 33,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Reset\"\n                        },\n                        {\n                            \"plugin\": \"initialise_generator\",\n                            \"x\": 348,\n                            \"y\": 189,\n                            \"uid\": 34\n                        },\n                        {\n                            \"plugin\": \"subtract_modulator\",\n                            \"x\": 664,\n                            \"y\": 404,\n                            \"uid\": 36\n                        },\n                        {\n                            \"plugin\": \"convert_oscilator_unit_modulator\",\n                            \"x\": 629,\n                            \"y\": 289,\n                            \"uid\": 37\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 753,\n                            \"y\": 289,\n                            \"uid\": 38\n                        },\n                        {\n                            \"plugin\": \"add_modulator\",\n                            \"x\": 836,\n                            \"y\": 344,\n                            \"uid\": 39\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 919,\n                            \"y\": 344,\n                            \"uid\": 40,\n                            \"dsid\": 10,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"float\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 538,\n                            \"y\": 399,\n                            \"uid\": 41,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Min\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 604,\n                            \"y\": 404,\n                            \"uid\": 42,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Max\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"sawtooth_modulator\",\n                            \"x\": 543,\n                            \"y\": 286,\n                            \"uid\": 47\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 28,\n                            \"dst_nuid\": 26,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 26,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 29,\n                            \"dst_nuid\": 31,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 31,\n                            \"dst_nuid\": 32,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        },\n                        {\n                            \"src_nuid\": 34,\n                            \"dst_nuid\": 32,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 33,\n                            \"dst_nuid\": 32,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 42,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 41,\n                            \"dst_nuid\": 36,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 36,\n                            \"dst_nuid\": 38,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 38,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 38,\n                            \"dst_nuid\": 39,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 41,\n                            \"dst_nuid\": 39,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 39,\n                            \"dst_nuid\": 40,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 32,\n                            \"dst_nuid\": 30,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 32,\n                            \"dst_nuid\": 47,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 47,\n                            \"dst_nuid\": 37,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        }\n                    ],\n                    \"registers\": [\n                        {\n                            \"id\": \"float\",\n                            \"dt\": 8\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Speed\",\n                        \"dt\": 0,\n                        \"uid\": 6,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Min\",\n                        \"dt\": 0,\n                        \"uid\": 8,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Max\",\n                        \"dt\": 0,\n                        \"uid\": 9,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"float\",\n                        \"dt\": 0,\n                        \"uid\": 7,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 457,\n                \"y\": 426,\n                \"uid\": 17,\n                \"state\": {\n                    \"val\": 0.42,\n                    \"min\": 0,\n                    \"max\": 1\n                },\n                \"title\": \"speed\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 456,\n                \"y\": 490,\n                \"uid\": 18,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Min\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 544,\n                \"y\": 490,\n                \"uid\": 19,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Max\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 17,\n                \"dst_nuid\": 16,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 19,\n                \"dst_nuid\": 16,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 18,\n                \"dst_nuid\": 16,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/time_oscillate_with_triangle.json",
    "content": "{\"abs_t\":222.061,\"active_graph\":0,\"graph_uid\":9,\"root\":{\"node_uid\":20,\"uid\":0,\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":651,\"y\":426,\"uid\":16,\"dsid\":10,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"rt_filter\":9729,\"input_sids\":{\"28\":6,\"41\":8,\"42\":9},\"output_sids\":{\"40\":7}},\"title\":\"Oscillate Triangle\",\"graph\":{\"node_uid\":49,\"uid\":7,\"parent_uid\":0,\"open\":true,\"nodes\":[{\"plugin\":\"delta_t_generator\",\"x\":62,\"y\":232,\"uid\":25},{\"plugin\":\"multiply_modulator\",\"x\":187,\"y\":222,\"uid\":26},{\"plugin\":\"input_proxy\",\"x\":78,\"y\":291,\"uid\":28,\"dsid\":8,\"state\":{\"slot_id\":0},\"title\":\"Speed\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"register_local_read\",\"x\":204,\"y\":339,\"uid\":29,\"dsid\":1,\"state\":{\"slot_id\":0},\"title\":\"float\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"desc\":\"\",\"uid\":0,\"index\":0,\"type\":1}]},{\"plugin\":\"register_local_write\",\"x\":589,\"y\":178,\"uid\":30,\"dsid\":1,\"state\":{\"slot_id\":0},\"title\":\"float\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"desc\":\"\",\"uid\":0,\"index\":0,\"type\":0,\"is_connected\":true}]},{\"plugin\":\"add_modulator\",\"x\":312,\"y\":252,\"uid\":31},{\"plugin\":\"if_else_modulator\",\"x\":432,\"y\":278,\"uid\":32},{\"plugin\":\"const_float_generator\",\"x\":316,\"y\":380,\"uid\":33,\"state\":{\"val\":0},\"title\":\"Reset\"},{\"plugin\":\"initialise_generator\",\"x\":348,\"y\":189,\"uid\":34},{\"plugin\":\"subtract_modulator\",\"x\":664,\"y\":404,\"uid\":36},{\"plugin\":\"convert_oscilator_unit_modulator\",\"x\":629,\"y\":289,\"uid\":37},{\"plugin\":\"multiply_modulator\",\"x\":753,\"y\":289,\"uid\":38},{\"plugin\":\"add_modulator\",\"x\":836,\"y\":344,\"uid\":39},{\"plugin\":\"output_proxy\",\"x\":919,\"y\":344,\"uid\":40,\"dsid\":10,\"state\":{\"slot_id\":0},\"title\":\"float\",\"dyn_in\":[{\"name\":\"input\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":538,\"y\":399,\"uid\":41,\"dsid\":8,\"state\":{\"slot_id\":0},\"title\":\"Min\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":604,\"y\":404,\"uid\":42,\"dsid\":8,\"state\":{\"slot_id\":0},\"title\":\"Max\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"triangle_modulator\",\"x\":552,\"y\":291,\"uid\":48}],\"conns\":[{\"src_nuid\":25,\"dst_nuid\":26,\"src_slot\":\"seconds\",\"dst_slot\":\"a\"},{\"src_nuid\":28,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":\"b\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":26,\"dst_nuid\":31,\"src_slot\":\"result\",\"dst_slot\":\"a\"},{\"src_nuid\":29,\"dst_nuid\":31,\"src_slot\":0,\"dst_slot\":\"b\",\"src_dyn\":true},{\"src_nuid\":31,\"dst_nuid\":32,\"src_slot\":\"result\",\"dst_slot\":\"false value\"},{\"src_nuid\":34,\"dst_nuid\":32,\"src_slot\":\"bool\",\"dst_slot\":\"condition\"},{\"src_nuid\":33,\"dst_nuid\":32,\"src_slot\":\"value\",\"dst_slot\":\"true value\"},{\"src_nuid\":42,\"dst_nuid\":36,\"src_slot\":0,\"dst_slot\":\"a\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":41,\"dst_nuid\":36,\"src_slot\":0,\"dst_slot\":\"b\",\"src_connected\":true,\"src_dyn\":true,\"offset\":1},{\"src_nuid\":36,\"dst_nuid\":38,\"src_slot\":\"result\",\"dst_slot\":\"b\"},{\"src_nuid\":37,\"dst_nuid\":38,\"src_slot\":\"value\",\"dst_slot\":\"a\"},{\"src_nuid\":38,\"dst_nuid\":39,\"src_slot\":\"result\",\"dst_slot\":\"a\"},{\"src_nuid\":41,\"dst_nuid\":39,\"src_slot\":0,\"dst_slot\":\"b\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":39,\"dst_nuid\":40,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":32,\"dst_nuid\":30,\"src_slot\":\"value\",\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":32,\"dst_nuid\":48,\"src_slot\":\"value\",\"dst_slot\":\"time\",\"offset\":1},{\"src_nuid\":48,\"dst_nuid\":37,\"src_slot\":\"value\",\"dst_slot\":\"value\"}],\"registers\":[{\"id\":\"float\",\"dt\":8}]},\"dyn_in\":[{\"name\":\"Speed\",\"dt\":0,\"uid\":6,\"index\":0,\"type\":0,\"is_connected\":true},{\"name\":\"Min\",\"dt\":0,\"uid\":8,\"index\":1,\"type\":0,\"is_connected\":true},{\"name\":\"Max\",\"dt\":0,\"uid\":9,\"index\":2,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"float\",\"dt\":0,\"uid\":7,\"index\":0,\"type\":1}]},{\"plugin\":\"slider_float_generator\",\"x\":457,\"y\":426,\"uid\":17,\"state\":{\"val\":0.42,\"min\":0,\"max\":1},\"title\":\"speed\"},{\"plugin\":\"const_float_generator\",\"x\":456,\"y\":490,\"uid\":18,\"state\":{\"val\":0},\"title\":\"Min\"},{\"plugin\":\"const_float_generator\",\"x\":544,\"y\":490,\"uid\":19,\"state\":{\"val\":1},\"title\":\"Max\"}],\"conns\":[{\"src_nuid\":17,\"dst_nuid\":16,\"src_slot\":\"value\",\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":19,\"dst_nuid\":16,\"src_slot\":\"value\",\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":18,\"dst_nuid\":16,\"src_slot\":\"value\",\"dst_slot\":1,\"dst_dyn\":true}]}}"
  },
  {
    "path": "browser/patches/time_shaky_random.json",
    "content": "{\"abs_t\":1672.846,\"active_graph\":0,\"graph_uid\":46,\"root\":{\"node_uid\":36,\"uid\":0,\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"random_float_generator\",\"x\":436,\"y\":351,\"uid\":25,\"open\":false},{\"plugin\":\"graph\",\"x\":311,\"y\":364,\"uid\":26,\"open\":false,\"dsid\":5,\"state\":{\"enabled\":true,\"input_sids\":{\"13\":1,\"14\":2,\"15\":3},\"output_sids\":{\"12\":0}},\"title\":\"Oscillate\",\"graph\":{\"node_uid\":25,\"uid\":44,\"parent_uid\":0,\"open\":true,\"nodes\":[{\"plugin\":\"sine_modulator\",\"x\":291,\"y\":9,\"uid\":1},{\"plugin\":\"subtract_modulator\",\"x\":405,\"y\":124,\"uid\":4},{\"plugin\":\"convert_oscilator_unit_modulator\",\"x\":370,\"y\":9,\"uid\":5},{\"plugin\":\"multiply_modulator\",\"x\":494,\"y\":9,\"uid\":6},{\"plugin\":\"add_modulator\",\"x\":577,\"y\":64,\"uid\":7},{\"plugin\":\"output_proxy\",\"x\":660,\"y\":64,\"uid\":12,\"dsid\":12,\"state\":{\"slot_id\":0},\"title\":\"float\",\"dyn_in\":[{\"name\":\"input\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":25,\"y\":67,\"uid\":13,\"dsid\":10,\"state\":{\"slot_id\":0},\"title\":\"Speed\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":279,\"y\":119,\"uid\":14,\"dsid\":10,\"state\":{\"slot_id\":0},\"title\":\"Min\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":345,\"y\":124,\"uid\":15,\"dsid\":10,\"state\":{\"slot_id\":0},\"title\":\"Max\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"delta_t_generator\",\"x\":8,\"y\":9,\"uid\":18},{\"plugin\":\"accumulate_modulator\",\"x\":187,\"y\":9,\"uid\":19,\"state\":{\"value\":36.434169999999725}},{\"plugin\":\"multiply_modulator\",\"x\":102,\"y\":9,\"uid\":20},{\"plugin\":\"const_float_generator\",\"x\":106,\"y\":111,\"uid\":24,\"state\":{\"val\":0},\"title\":\"reset\"}],\"conns\":[{\"src_nuid\":1,\"dst_nuid\":5,\"src_slot\":\"value\",\"dst_slot\":\"value\"},{\"src_nuid\":4,\"dst_nuid\":6,\"src_slot\":\"result\",\"dst_slot\":\"b\"},{\"src_nuid\":5,\"dst_nuid\":6,\"src_slot\":\"value\",\"dst_slot\":\"a\"},{\"src_nuid\":6,\"dst_nuid\":7,\"src_slot\":\"result\",\"dst_slot\":\"a\"},{\"src_nuid\":7,\"dst_nuid\":12,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":14,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":\"b\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":14,\"dst_nuid\":4,\"src_slot\":0,\"dst_slot\":\"b\",\"src_connected\":true,\"src_dyn\":true,\"offset\":1},{\"src_nuid\":15,\"dst_nuid\":4,\"src_slot\":0,\"dst_slot\":\"a\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":18,\"dst_nuid\":20,\"src_slot\":\"seconds\",\"dst_slot\":\"a\"},{\"src_nuid\":20,\"dst_nuid\":19,\"src_slot\":\"result\",\"dst_slot\":\"value\"},{\"src_nuid\":19,\"dst_nuid\":1,\"src_slot\":\"value\",\"dst_slot\":\"time\"},{\"src_nuid\":13,\"dst_nuid\":20,\"src_slot\":0,\"dst_slot\":\"b\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":24,\"dst_nuid\":19,\"src_slot\":\"value\",\"dst_slot\":\"reset\"}]},\"dyn_in\":[{\"name\":\"Speed\",\"dt\":0,\"uid\":1,\"index\":0,\"type\":0,\"is_connected\":true,\"connected\":false},{\"name\":\"Min\",\"dt\":0,\"uid\":2,\"index\":1,\"type\":0,\"is_connected\":true,\"connected\":false},{\"name\":\"Max\",\"dt\":0,\"uid\":3,\"index\":2,\"type\":0,\"is_connected\":true,\"connected\":false}],\"dyn_out\":[{\"name\":\"float\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1}]},{\"plugin\":\"graph\",\"x\":311,\"y\":403,\"uid\":27,\"open\":false,\"dsid\":5,\"state\":{\"enabled\":true,\"input_sids\":{\"13\":1,\"14\":2,\"15\":3},\"output_sids\":{\"12\":0}},\"title\":\"Oscillate\",\"graph\":{\"node_uid\":25,\"uid\":45,\"parent_uid\":0,\"open\":true,\"nodes\":[{\"plugin\":\"sine_modulator\",\"x\":291,\"y\":9,\"uid\":1},{\"plugin\":\"subtract_modulator\",\"x\":405,\"y\":124,\"uid\":4},{\"plugin\":\"convert_oscilator_unit_modulator\",\"x\":370,\"y\":9,\"uid\":5},{\"plugin\":\"multiply_modulator\",\"x\":494,\"y\":9,\"uid\":6},{\"plugin\":\"add_modulator\",\"x\":577,\"y\":64,\"uid\":7},{\"plugin\":\"output_proxy\",\"x\":660,\"y\":64,\"uid\":12,\"dsid\":13,\"state\":{\"slot_id\":0},\"title\":\"float\",\"dyn_in\":[{\"name\":\"input\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":25,\"y\":67,\"uid\":13,\"dsid\":11,\"state\":{\"slot_id\":0},\"title\":\"Speed\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":279,\"y\":119,\"uid\":14,\"dsid\":11,\"state\":{\"slot_id\":0},\"title\":\"Min\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":345,\"y\":124,\"uid\":15,\"dsid\":11,\"state\":{\"slot_id\":0},\"title\":\"Max\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"delta_t_generator\",\"x\":8,\"y\":9,\"uid\":18},{\"plugin\":\"accumulate_modulator\",\"x\":187,\"y\":9,\"uid\":19,\"state\":{\"value\":46.93829999999937}},{\"plugin\":\"multiply_modulator\",\"x\":102,\"y\":9,\"uid\":20},{\"plugin\":\"const_float_generator\",\"x\":106,\"y\":111,\"uid\":24,\"state\":{\"val\":0},\"title\":\"reset\"}],\"conns\":[{\"src_nuid\":1,\"dst_nuid\":5,\"src_slot\":\"value\",\"dst_slot\":\"value\"},{\"src_nuid\":4,\"dst_nuid\":6,\"src_slot\":\"result\",\"dst_slot\":\"b\"},{\"src_nuid\":5,\"dst_nuid\":6,\"src_slot\":\"value\",\"dst_slot\":\"a\"},{\"src_nuid\":6,\"dst_nuid\":7,\"src_slot\":\"result\",\"dst_slot\":\"a\"},{\"src_nuid\":7,\"dst_nuid\":12,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":14,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":\"b\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":14,\"dst_nuid\":4,\"src_slot\":0,\"dst_slot\":\"b\",\"src_connected\":true,\"src_dyn\":true,\"offset\":1},{\"src_nuid\":15,\"dst_nuid\":4,\"src_slot\":0,\"dst_slot\":\"a\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":18,\"dst_nuid\":20,\"src_slot\":\"seconds\",\"dst_slot\":\"a\"},{\"src_nuid\":20,\"dst_nuid\":19,\"src_slot\":\"result\",\"dst_slot\":\"value\"},{\"src_nuid\":19,\"dst_nuid\":1,\"src_slot\":\"value\",\"dst_slot\":\"time\"},{\"src_nuid\":13,\"dst_nuid\":20,\"src_slot\":0,\"dst_slot\":\"b\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":24,\"dst_nuid\":19,\"src_slot\":\"value\",\"dst_slot\":\"reset\"}]},\"dyn_in\":[{\"name\":\"Speed\",\"dt\":0,\"uid\":1,\"index\":0,\"type\":0,\"is_connected\":true},{\"name\":\"Min\",\"dt\":0,\"uid\":2,\"index\":1,\"type\":0,\"is_connected\":true},{\"name\":\"Max\",\"dt\":0,\"uid\":3,\"index\":2,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"float\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1}]},{\"plugin\":\"slider_float_generator\",\"x\":71,\"y\":445,\"uid\":28,\"state\":{\"val\":0.97,\"min\":0,\"max\":1},\"title\":\"speed\"},{\"plugin\":\"const_float_generator\",\"x\":71,\"y\":512,\"uid\":29,\"state\":{\"val\":0.3},\"title\":\"Min\"},{\"plugin\":\"const_float_generator\",\"x\":167,\"y\":512,\"uid\":30,\"state\":{\"val\":0.5},\"title\":\"Max\"},{\"plugin\":\"const_float_generator\",\"x\":409,\"y\":415,\"uid\":31,\"state\":{\"val\":0.989}},{\"plugin\":\"lowpass_filter_modulator\",\"x\":541,\"y\":349,\"uid\":32},{\"plugin\":\"slider_float_generator\",\"x\":66,\"y\":301,\"uid\":33,\"state\":{\"val\":0.97,\"min\":0,\"max\":1},\"title\":\"speed\"},{\"plugin\":\"const_float_generator\",\"x\":66,\"y\":376,\"uid\":34,\"state\":{\"val\":0.1},\"title\":\"Min\"},{\"plugin\":\"const_float_generator\",\"x\":162,\"y\":376,\"uid\":35,\"state\":{\"val\":0.3},\"title\":\"Max\"}],\"conns\":[{\"src_nuid\":26,\"dst_nuid\":25,\"src_slot\":0,\"dst_slot\":\"min\",\"src_dyn\":true},{\"src_nuid\":27,\"dst_nuid\":25,\"src_slot\":0,\"dst_slot\":\"max\",\"src_dyn\":true},{\"src_nuid\":25,\"dst_nuid\":32,\"src_slot\":\"value\",\"dst_slot\":\"value\"},{\"src_nuid\":28,\"dst_nuid\":27,\"src_slot\":\"value\",\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":29,\"dst_nuid\":27,\"src_slot\":\"value\",\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":30,\"dst_nuid\":27,\"src_slot\":\"value\",\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":31,\"dst_nuid\":32,\"src_slot\":\"value\",\"dst_slot\":\"amount\"},{\"src_nuid\":33,\"dst_nuid\":26,\"src_slot\":\"value\",\"dst_slot\":0,\"dst_connected\":false,\"dst_dyn\":true},{\"src_nuid\":34,\"dst_nuid\":26,\"src_slot\":\"value\",\"dst_slot\":1,\"dst_connected\":false,\"dst_dyn\":true},{\"src_nuid\":35,\"dst_nuid\":26,\"src_slot\":\"value\",\"dst_slot\":2,\"dst_connected\":false,\"dst_dyn\":true}]}}"
  },
  {
    "path": "browser/patches/time_timer_from_0_to_1 (1).json",
    "content": "{\n    \"abs_t\": 17.99,\n    \"active_graph\": 2,\n    \"graph_uid\": 3,\n    \"root\": {\n        \"node_uid\": 6,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 654,\n                \"y\": 448,\n                \"uid\": 4,\n                \"dsid\": 2,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"rt_filter\": 9729,\n                    \"input_sids\": {\n                        \"7\": 1\n                    },\n                    \"output_sids\": {\n                        \"6\": 0\n                    }\n                },\n                \"title\": \"Time\",\n                \"graph\": {\n                    \"node_uid\": 15,\n                    \"uid\": 2,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"delta_t_generator\",\n                            \"x\": 251,\n                            \"y\": 460,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"accumulate_modulator\",\n                            \"x\": 425,\n                            \"y\": 460,\n                            \"uid\": 1,\n                            \"state\": {\n                                \"value\": 9.003499999999939\n                            }\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 345,\n                            \"y\": 460,\n                            \"uid\": 2\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 836,\n                            \"y\": 455,\n                            \"uid\": 6,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"time\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 267,\n                            \"y\": 519,\n                            \"uid\": 7,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Speed\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 341,\n                            \"y\": 546,\n                            \"uid\": 8,\n                            \"state\": {\n                                \"val\": 0\n                            }\n                        },\n                        {\n                            \"plugin\": \"float_display\",\n                            \"x\": 743,\n                            \"y\": 331,\n                            \"uid\": 9\n                        },\n                        {\n                            \"plugin\": \"clamp_modulator\",\n                            \"x\": 652,\n                            \"y\": 454,\n                            \"uid\": 10\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 461,\n                            \"y\": 610,\n                            \"uid\": 11,\n                            \"state\": {\n                                \"val\": 1\n                            }\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 457,\n                            \"y\": 549,\n                            \"uid\": 12,\n                            \"state\": {\n                                \"val\": 0\n                            }\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 8,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Speed\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"time\",\n                        \"dt\": 0,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 452,\n                \"y\": 468,\n                \"uid\": 5,\n                \"state\": {\n                    \"val\": 0.5,\n                    \"min\": 0,\n                    \"max\": 1\n                },\n                \"title\": \"Speed\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 4,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/time_timer_from_0_to_1 (2).json",
    "content": "{\n    \"abs_t\": 10.327,\n    \"active_graph\": 0,\n    \"graph_uid\": 3,\n    \"root\": {\n        \"node_uid\": 7,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 654,\n                \"y\": 448,\n                \"uid\": 4,\n                \"dsid\": 2,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"rt_filter\": 9729,\n                    \"input_sids\": {\n                        \"7\": 1\n                    },\n                    \"output_sids\": {\n                        \"6\": 0\n                    }\n                },\n                \"title\": \"Time\",\n                \"graph\": {\n                    \"node_uid\": 15,\n                    \"uid\": 2,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"delta_t_generator\",\n                            \"x\": 251,\n                            \"y\": 460,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"accumulate_modulator\",\n                            \"x\": 461,\n                            \"y\": 459,\n                            \"uid\": 1,\n                            \"state\": {\n                                \"value\": -2.620049999999984\n                            }\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 345,\n                            \"y\": 460,\n                            \"uid\": 2\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 836,\n                            \"y\": 455,\n                            \"uid\": 6,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"time\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 267,\n                            \"y\": 519,\n                            \"uid\": 7,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Speed\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 341,\n                            \"y\": 546,\n                            \"uid\": 8,\n                            \"state\": {\n                                \"val\": 1\n                            }\n                        },\n                        {\n                            \"plugin\": \"float_display\",\n                            \"x\": 743,\n                            \"y\": 331,\n                            \"uid\": 9\n                        },\n                        {\n                            \"plugin\": \"clamp_modulator\",\n                            \"x\": 652,\n                            \"y\": 454,\n                            \"uid\": 10\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 461,\n                            \"y\": 610,\n                            \"uid\": 11,\n                            \"state\": {\n                                \"val\": 1\n                            }\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 457,\n                            \"y\": 549,\n                            \"uid\": 12,\n                            \"state\": {\n                                \"val\": 0\n                            }\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 8,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 10,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Speed\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"time\",\n                        \"dt\": 0,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 452,\n                \"y\": 468,\n                \"uid\": 5,\n                \"state\": {\n                    \"val\": -0.35,\n                    \"min\": -0.5,\n                    \"max\": 0\n                },\n                \"title\": \"Speed\"\n            },\n            {\n                \"plugin\": \"float_display\",\n                \"x\": 813,\n                \"y\": 394,\n                \"uid\": 6\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 4,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 6,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"src_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/time_timer_from_0_to_1.json",
    "content": "{\"abs_t\":5.784,\"active_graph\":0,\"graph_uid\":4,\"root\":{\"node_uid\":8,\"uid\":0,\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":657,\"y\":482,\"uid\":0,\"dsid\":5,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"rt_filter\":9729,\"input_sids\":{\"19\":2,\"30\":3,\"32\":4},\"output_sids\":{\"6\":0}},\"title\":\"Timer and stop\",\"graph\":{\"node_uid\":33,\"uid\":1,\"parent_uid\":0,\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":817,\"y\":347,\"uid\":6,\"dsid\":8,\"state\":{\"slot_id\":0},\"title\":\"time\",\"dyn_in\":[{\"name\":\"input\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"delta_t_generator\",\"x\":68,\"y\":274,\"uid\":17},{\"plugin\":\"multiply_modulator\",\"x\":199,\"y\":272,\"uid\":18},{\"plugin\":\"input_proxy\",\"x\":122,\"y\":333,\"uid\":19,\"dsid\":8,\"state\":{\"slot_id\":0},\"title\":\"Speed\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"register_local_read\",\"x\":216,\"y\":389,\"uid\":20,\"dsid\":1,\"state\":{\"slot_id\":0},\"title\":\"float\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"desc\":\"\",\"uid\":0,\"index\":0,\"type\":1}]},{\"plugin\":\"register_local_write\",\"x\":813,\"y\":237,\"uid\":21,\"dsid\":1,\"state\":{\"slot_id\":0},\"title\":\"float\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"desc\":\"\",\"uid\":0,\"index\":0,\"type\":0,\"is_connected\":true}]},{\"plugin\":\"add_modulator\",\"x\":324,\"y\":302,\"uid\":22},{\"plugin\":\"if_else_modulator\",\"x\":445,\"y\":322,\"uid\":23},{\"plugin\":\"const_float_generator\",\"x\":328,\"y\":430,\"uid\":24,\"state\":{\"val\":0},\"title\":\"Reset\"},{\"plugin\":\"initialise_generator\",\"x\":359,\"y\":236,\"uid\":25},{\"plugin\":\"clamp_modulator\",\"x\":701,\"y\":347,\"uid\":26},{\"plugin\":\"float_display\",\"x\":882,\"y\":300,\"uid\":29},{\"plugin\":\"input_proxy\",\"x\":608,\"y\":495,\"uid\":30,\"dsid\":1,\"state\":{\"slot_id\":0},\"title\":\"Min\",\"dyn_out\":[{\"name\":\"input\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":606,\"y\":551,\"uid\":32,\"dsid\":2,\"state\":{\"slot_id\":0},\"title\":\"Max\",\"dyn_out\":[{\"name\":\"input\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]}],\"conns\":[{\"src_nuid\":17,\"dst_nuid\":18,\"src_slot\":\"seconds\",\"dst_slot\":\"a\"},{\"src_nuid\":19,\"dst_nuid\":18,\"src_slot\":0,\"dst_slot\":\"b\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":18,\"dst_nuid\":22,\"src_slot\":\"result\",\"dst_slot\":\"a\"},{\"src_nuid\":20,\"dst_nuid\":22,\"src_slot\":0,\"dst_slot\":\"b\",\"src_dyn\":true},{\"src_nuid\":22,\"dst_nuid\":23,\"src_slot\":\"result\",\"dst_slot\":\"false value\"},{\"src_nuid\":25,\"dst_nuid\":23,\"src_slot\":\"bool\",\"dst_slot\":\"condition\"},{\"src_nuid\":24,\"dst_nuid\":23,\"src_slot\":\"value\",\"dst_slot\":\"true value\"},{\"src_nuid\":23,\"dst_nuid\":26,\"src_slot\":\"value\",\"dst_slot\":\"value\"},{\"src_nuid\":26,\"dst_nuid\":6,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":26,\"dst_nuid\":29,\"src_slot\":\"result\",\"dst_slot\":\"float\",\"offset\":2},{\"src_nuid\":23,\"dst_nuid\":21,\"src_slot\":\"value\",\"dst_slot\":0,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":30,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":\"min\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":32,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":\"max\",\"src_connected\":true,\"src_dyn\":true}],\"registers\":[{\"id\":\"float\",\"dt\":8}]},\"dyn_in\":[{\"name\":\"Speed\",\"dt\":0,\"uid\":2,\"index\":0,\"type\":0,\"is_connected\":true},{\"name\":\"Min\",\"dt\":0,\"uid\":3,\"index\":1,\"type\":0,\"is_connected\":true},{\"name\":\"Max\",\"dt\":0,\"uid\":4,\"index\":2,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"time\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1}]},{\"plugin\":\"slider_float_generator\",\"x\":460,\"y\":482,\"uid\":1,\"state\":{\"val\":0.5,\"min\":0,\"max\":1},\"title\":\"Speed\"},{\"plugin\":\"const_float_generator\",\"x\":550,\"y\":545,\"uid\":2,\"state\":{\"val\":1},\"title\":\"Maximum\"},{\"plugin\":\"const_float_generator\",\"x\":460,\"y\":545,\"uid\":3,\"state\":{\"val\":0},\"title\":\"Minimum\"}],\"conns\":[{\"src_nuid\":1,\"dst_nuid\":0,\"src_slot\":\"value\",\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":3,\"dst_nuid\":0,\"src_slot\":\"value\",\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":2,\"dst_nuid\":0,\"src_slot\":\"value\",\"dst_slot\":2,\"dst_dyn\":true}]}}"
  },
  {
    "path": "browser/patches/time_timer_from_1_to_0.json",
    "content": "{\"abs_t\":10.327,\"active_graph\":0,\"graph_uid\":3,\"root\":{\"node_uid\":7,\"uid\":0,\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":654,\"y\":448,\"uid\":4,\"dsid\":2,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"rt_filter\":9729,\"input_sids\":{\"7\":1},\"output_sids\":{\"6\":0}},\"title\":\"Time\",\"graph\":{\"node_uid\":15,\"uid\":2,\"parent_uid\":0,\"open\":true,\"nodes\":[{\"plugin\":\"delta_t_generator\",\"x\":251,\"y\":460,\"uid\":0},{\"plugin\":\"accumulate_modulator\",\"x\":461,\"y\":459,\"uid\":1,\"state\":{\"value\":-2.620049999999984}},{\"plugin\":\"multiply_modulator\",\"x\":345,\"y\":460,\"uid\":2},{\"plugin\":\"output_proxy\",\"x\":836,\"y\":455,\"uid\":6,\"dsid\":7,\"state\":{\"slot_id\":0},\"title\":\"time\",\"dyn_in\":[{\"name\":\"input\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":267,\"y\":519,\"uid\":7,\"dsid\":5,\"state\":{\"slot_id\":0},\"title\":\"Speed\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":341,\"y\":546,\"uid\":8,\"state\":{\"val\":1}},{\"plugin\":\"float_display\",\"x\":743,\"y\":331,\"uid\":9},{\"plugin\":\"clamp_modulator\",\"x\":652,\"y\":454,\"uid\":10},{\"plugin\":\"const_float_generator\",\"x\":461,\"y\":610,\"uid\":11,\"state\":{\"val\":1}},{\"plugin\":\"const_float_generator\",\"x\":457,\"y\":549,\"uid\":12,\"state\":{\"val\":0}}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":\"seconds\",\"dst_slot\":\"a\"},{\"src_nuid\":2,\"dst_nuid\":1,\"src_slot\":\"result\",\"dst_slot\":\"value\"},{\"src_nuid\":7,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":\"b\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":8,\"dst_nuid\":1,\"src_slot\":\"value\",\"dst_slot\":\"reset\"},{\"src_nuid\":11,\"dst_nuid\":10,\"src_slot\":\"value\",\"dst_slot\":\"max\"},{\"src_nuid\":12,\"dst_nuid\":10,\"src_slot\":\"value\",\"dst_slot\":\"min\"},{\"src_nuid\":10,\"dst_nuid\":9,\"src_slot\":\"result\",\"dst_slot\":\"float\"},{\"src_nuid\":10,\"dst_nuid\":6,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":1,\"dst_nuid\":10,\"src_slot\":\"value\",\"dst_slot\":\"value\"}]},\"dyn_in\":[{\"name\":\"Speed\",\"dt\":0,\"uid\":1,\"index\":0,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"time\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1}]},{\"plugin\":\"slider_float_generator\",\"x\":452,\"y\":468,\"uid\":5,\"state\":{\"val\":-0.35,\"min\":-0.5,\"max\":0},\"title\":\"Speed\"},{\"plugin\":\"float_display\",\"x\":813,\"y\":394,\"uid\":6}],\"conns\":[{\"src_nuid\":5,\"dst_nuid\":4,\"src_slot\":\"value\",\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":4,\"dst_nuid\":6,\"src_slot\":0,\"dst_slot\":\"float\",\"src_dyn\":true}]}}"
  },
  {
    "path": "browser/patches/transform_circular_movement_to_xy.json",
    "content": "{\n    \"abs_t\": 9.124,\n    \"active_graph\": 0,\n    \"graph_uid\": 2,\n    \"root\": {\n        \"node_uid\": 3,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 468,\n                \"y\": 206,\n                \"uid\": 0,\n                \"dsid\": 6,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"11\": 1,\n                        \"19\": 2\n                    },\n                    \"output_sids\": {\n                        \"21\": 4,\n                        \"22\": 5\n                    }\n                },\n                \"title\": \"Circular movement\",\n                \"graph\": {\n                    \"node_uid\": 23,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 338,\n                            \"y\": 416,\n                            \"uid\": 1,\n                            \"state\": {\n                                \"val\": 0.25\n                            }\n                        },\n                        {\n                            \"plugin\": \"sine_modulator\",\n                            \"x\": 476,\n                            \"y\": 146,\n                            \"uid\": 2\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 292,\n                            \"y\": 177,\n                            \"uid\": 6\n                        },\n                        {\n                            \"plugin\": \"delta_t_generator\",\n                            \"x\": 212,\n                            \"y\": 177,\n                            \"uid\": 8\n                        },\n                        {\n                            \"plugin\": \"accumulate_modulator\",\n                            \"x\": 372,\n                            \"y\": 177,\n                            \"uid\": 9,\n                            \"state\": {\n                                \"value\": -1160.7568400000366\n                            }\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 141,\n                            \"y\": 270,\n                            \"uid\": 11,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"speed\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"cosine_modulator\",\n                            \"x\": 486,\n                            \"y\": 230,\n                            \"uid\": 12\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 567,\n                            \"y\": 143,\n                            \"uid\": 16\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 558,\n                            \"y\": 225,\n                            \"uid\": 17\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 570,\n                            \"y\": 391,\n                            \"uid\": 19,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"radius\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 664,\n                            \"y\": 145,\n                            \"uid\": 21,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"x\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 669,\n                            \"y\": 227,\n                            \"uid\": 22,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"y\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 8,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 12,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 17,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 16,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 17,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 16,\n                            \"dst_nuid\": 21,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 17,\n                            \"dst_nuid\": 22,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"speed\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"radius\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"x\",\n                        \"dt\": 0,\n                        \"uid\": 4,\n                        \"index\": 0,\n                        \"type\": 1\n                    },\n                    {\n                        \"name\": \"y\",\n                        \"dt\": 0,\n                        \"uid\": 5,\n                        \"index\": 1,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 271,\n                \"y\": 209,\n                \"uid\": 1,\n                \"state\": {\n                    \"val\": 0.44,\n                    \"min\": -2,\n                    \"max\": 2\n                },\n                \"title\": \"Speed\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 271,\n                \"y\": 294,\n                \"uid\": 2,\n                \"state\": {\n                    \"val\": 1.1,\n                    \"min\": 0,\n                    \"max\": 10\n                },\n                \"title\": \"Radius\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 1,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 2,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/util_1_step_stepsequencer.json",
    "content": "{\"abs_t\":0,\"active_graph\":0,\"graph_uid\":3,\"root\":{\"node_uid\":3,\"uid\":0,\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":667,\"y\":200,\"uid\":0,\"dsid\":17,\"state\":{\"enabled\":true,\"input_sids\":{\"36\":13,\"38\":15,\"39\":16},\"output_sids\":{\"27\":6}},\"title\":\"1 Step sequencer\",\"graph\":{\"node_uid\":40,\"uid\":1,\"parent_uid\":0,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":570,\"y\":258,\"uid\":8,\"dsid\":5,\"state\":{\"enabled\":true,\"input_sids\":{\"3\":0,\"4\":1,\"6\":2,\"7\":3},\"output_sids\":{\"8\":4}},\"title\":\"more/less/and\",\"graph\":{\"node_uid\":9,\"uid\":2,\"parent_uid\":1,\"open\":true,\"nodes\":[{\"plugin\":\"more_than_modulator\",\"x\":380,\"y\":230,\"uid\":0},{\"plugin\":\"less_than_modulator\",\"x\":378,\"y\":330,\"uid\":1},{\"plugin\":\"and_modulator\",\"x\":516,\"y\":256,\"uid\":2},{\"plugin\":\"input_proxy\",\"x\":287,\"y\":223,\"uid\":3,\"dsid\":68,\"state\":{\"slot_id\":0},\"title\":\"clock\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":285,\"uid\":4,\"dsid\":68,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":290,\"y\":353,\"uid\":6,\"dsid\":68,\"state\":{\"slot_id\":0},\"title\":\"clock\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":418,\"uid\":7,\"dsid\":68,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":612,\"y\":253,\"uid\":8,\"dsid\":68,\"state\":{\"slot_id\":0},\"title\":\"bool\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"a\"},{\"src_nuid\":1,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"b\"},{\"src_nuid\":3,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":4,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":6,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":7,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":2,\"dst_nuid\":8,\"src_slot\":\"bool\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"name\":\"clock\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"is_connected\":true},{\"name\":\"constant\",\"dt\":0,\"uid\":1,\"index\":1,\"type\":0,\"is_connected\":true},{\"name\":\"clock\",\"dt\":0,\"uid\":2,\"index\":2,\"type\":0,\"is_connected\":true},{\"name\":\"constant\",\"dt\":0,\"uid\":3,\"index\":3,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"bool\",\"dt\":7,\"uid\":4,\"index\":0,\"type\":1}]},{\"plugin\":\"output_proxy\",\"x\":735,\"y\":284,\"uid\":27,\"dsid\":51,\"state\":{\"slot_id\":0},\"title\":\"Scene\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"desc\":\"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":327,\"y\":314,\"uid\":36,\"dsid\":49,\"state\":{\"slot_id\":0},\"title\":\"Time\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":448,\"y\":239,\"uid\":38,\"dsid\":51,\"state\":{\"slot_id\":0},\"title\":\"Step 0\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":439,\"y\":355,\"uid\":39,\"dsid\":53,\"state\":{\"slot_id\":0},\"title\":\"Step 1\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]}],\"conns\":[{\"src_nuid\":8,\"dst_nuid\":27,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":36,\"dst_nuid\":8,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":36,\"dst_nuid\":8,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":38,\"dst_nuid\":8,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":39,\"dst_nuid\":8,\"src_slot\":0,\"dst_slot\":3,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"name\":\"Time\",\"dt\":0,\"uid\":13,\"index\":0,\"type\":0,\"is_connected\":false},{\"name\":\"Step 0\",\"dt\":0,\"uid\":15,\"index\":1,\"type\":0,\"is_connected\":true},{\"name\":\"Step 1\",\"dt\":0,\"uid\":16,\"index\":2,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"Scene\",\"dt\":7,\"uid\":6,\"index\":0,\"type\":1}]},{\"plugin\":\"const_float_generator\",\"x\":548,\"y\":261,\"uid\":1,\"state\":{\"val\":2},\"title\":\"Scene off\"},{\"plugin\":\"const_float_generator\",\"x\":548,\"y\":207,\"uid\":2,\"state\":{\"val\":0},\"title\":\"Scene on\"}],\"conns\":[{\"src_nuid\":2,\"dst_nuid\":0,\"src_slot\":\"value\",\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":1,\"dst_nuid\":0,\"src_slot\":\"value\",\"dst_slot\":2,\"dst_dyn\":true}]}}"
  },
  {
    "path": "browser/patches/util_4_step_stepsequencer.json",
    "content": "{\"abs_t\":661.651,\"active_graph\":0,\"graph_uid\":246,\"root\":{\"node_uid\":153,\"uid\":0,\"parent_uid\":-1,\"nodes\":[{\"plugin\":\"graph\",\"x\":324,\"y\":86,\"uid\":140,\"dsid\":13,\"state\":{\"enabled\":true,\"input_sids\":{\"21\":0,\"22\":1,\"23\":2,\"24\":3,\"25\":4,\"34\":11,\"35\":12},\"output_sids\":{\"27\":6,\"28\":7,\"29\":8,\"30\":9,\"31\":10}},\"title\":\"Stepsequencer\",\"graph\":{\"node_uid\":36,\"uid\":178,\"parent_uid\":0,\"nodes\":[{\"plugin\":\"clock_generator\",\"x\":113,\"y\":297,\"uid\":1},{\"plugin\":\"modulate_modulator\",\"x\":264,\"y\":275,\"uid\":6},{\"plugin\":\"graph\",\"x\":570,\"y\":258,\"uid\":8,\"dsid\":5,\"state\":{\"enabled\":true,\"input_sids\":{\"3\":0,\"4\":1,\"6\":2,\"7\":3},\"output_sids\":{\"8\":4}},\"title\":\"more/less/and\",\"graph\":{\"node_uid\":9,\"uid\":186,\"parent_uid\":178,\"nodes\":[{\"plugin\":\"more_than_modulator\",\"x\":380,\"y\":230,\"uid\":0,\"state\":true},{\"plugin\":\"less_than_modulator\",\"x\":378,\"y\":330,\"uid\":1,\"state\":true},{\"plugin\":\"and_modulator\",\"x\":516,\"y\":256,\"uid\":2,\"state\":true},{\"plugin\":\"input_proxy\",\"x\":287,\"y\":223,\"uid\":3,\"dsid\":19,\"state\":{\"slot_id\":0},\"title\":\"clock\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":285,\"uid\":4,\"dsid\":19,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":290,\"y\":353,\"uid\":6,\"dsid\":19,\"state\":{\"slot_id\":0},\"title\":\"clock\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":418,\"uid\":7,\"dsid\":19,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":612,\"y\":253,\"uid\":8,\"dsid\":19,\"state\":{\"slot_id\":0},\"title\":\"bool\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"a\"},{\"src_nuid\":1,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"b\"},{\"src_nuid\":3,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":4,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":6,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":7,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":2,\"dst_nuid\":8,\"src_slot\":\"bool\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"name\":\"clock\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"is_connected\":true},{\"name\":\"constant\",\"dt\":0,\"uid\":1,\"index\":1,\"type\":0,\"is_connected\":true},{\"name\":\"clock\",\"dt\":0,\"uid\":2,\"index\":2,\"type\":0,\"is_connected\":true},{\"name\":\"constant\",\"dt\":0,\"uid\":3,\"index\":3,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"bool\",\"dt\":7,\"uid\":4,\"index\":0,\"type\":1}]},{\"plugin\":\"graph\",\"x\":569,\"y\":393,\"uid\":9,\"dsid\":5,\"state\":{\"enabled\":true,\"input_sids\":{\"3\":0,\"4\":1,\"6\":2,\"7\":3},\"output_sids\":{\"8\":4}},\"title\":\"more/less/and\",\"graph\":{\"node_uid\":9,\"uid\":187,\"parent_uid\":178,\"nodes\":[{\"plugin\":\"more_than_modulator\",\"x\":380,\"y\":230,\"uid\":0},{\"plugin\":\"less_than_modulator\",\"x\":378,\"y\":330,\"uid\":1,\"state\":true},{\"plugin\":\"and_modulator\",\"x\":516,\"y\":256,\"uid\":2},{\"plugin\":\"input_proxy\",\"x\":287,\"y\":223,\"uid\":3,\"dsid\":20,\"state\":{\"slot_id\":0},\"title\":\"clock\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":285,\"uid\":4,\"dsid\":20,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":290,\"y\":353,\"uid\":6,\"dsid\":20,\"state\":{\"slot_id\":0},\"title\":\"clock\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":418,\"uid\":7,\"dsid\":20,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":612,\"y\":253,\"uid\":8,\"dsid\":20,\"state\":{\"slot_id\":0},\"title\":\"bool\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"a\"},{\"src_nuid\":1,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"b\"},{\"src_nuid\":3,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":4,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":6,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":7,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":2,\"dst_nuid\":8,\"src_slot\":\"bool\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"name\":\"clock\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"is_connected\":true},{\"name\":\"constant\",\"dt\":0,\"uid\":1,\"index\":1,\"type\":0,\"is_connected\":true},{\"name\":\"clock\",\"dt\":0,\"uid\":2,\"index\":2,\"type\":0,\"is_connected\":true},{\"name\":\"constant\",\"dt\":0,\"uid\":3,\"index\":3,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"bool\",\"dt\":7,\"uid\":4,\"index\":0,\"type\":1}]},{\"plugin\":\"graph\",\"x\":568,\"y\":527,\"uid\":12,\"dsid\":5,\"state\":{\"enabled\":true,\"input_sids\":{\"3\":0,\"4\":1,\"6\":2,\"7\":3},\"output_sids\":{\"8\":4}},\"title\":\"more/less/and\",\"graph\":{\"node_uid\":9,\"uid\":195,\"parent_uid\":178,\"nodes\":[{\"plugin\":\"more_than_modulator\",\"x\":380,\"y\":230,\"uid\":0},{\"plugin\":\"less_than_modulator\",\"x\":378,\"y\":330,\"uid\":1,\"state\":true},{\"plugin\":\"and_modulator\",\"x\":516,\"y\":256,\"uid\":2},{\"plugin\":\"input_proxy\",\"x\":287,\"y\":223,\"uid\":3,\"dsid\":21,\"state\":{\"slot_id\":0},\"title\":\"clock\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":285,\"uid\":4,\"dsid\":21,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":290,\"y\":353,\"uid\":6,\"dsid\":21,\"state\":{\"slot_id\":0},\"title\":\"clock\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":418,\"uid\":7,\"dsid\":21,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":612,\"y\":253,\"uid\":8,\"dsid\":21,\"state\":{\"slot_id\":0},\"title\":\"bool\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"a\"},{\"src_nuid\":1,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"b\"},{\"src_nuid\":3,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":4,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":6,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":7,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":2,\"dst_nuid\":8,\"src_slot\":\"bool\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"name\":\"clock\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"is_connected\":true},{\"name\":\"constant\",\"dt\":0,\"uid\":1,\"index\":1,\"type\":0,\"is_connected\":true},{\"name\":\"clock\",\"dt\":0,\"uid\":2,\"index\":2,\"type\":0,\"is_connected\":true},{\"name\":\"constant\",\"dt\":0,\"uid\":3,\"index\":3,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"bool\",\"dt\":7,\"uid\":4,\"index\":0,\"type\":1}]},{\"plugin\":\"graph\",\"x\":565,\"y\":662,\"uid\":20,\"dsid\":5,\"state\":{\"enabled\":true,\"input_sids\":{\"3\":0,\"4\":1,\"6\":2,\"7\":3},\"output_sids\":{\"8\":4}},\"title\":\"more/less/and\",\"graph\":{\"node_uid\":9,\"uid\":208,\"parent_uid\":178,\"nodes\":[{\"plugin\":\"more_than_modulator\",\"x\":380,\"y\":230,\"uid\":0},{\"plugin\":\"less_than_modulator\",\"x\":378,\"y\":330,\"uid\":1,\"state\":true},{\"plugin\":\"and_modulator\",\"x\":516,\"y\":256,\"uid\":2},{\"plugin\":\"input_proxy\",\"x\":287,\"y\":223,\"uid\":3,\"dsid\":20,\"state\":{\"slot_id\":0},\"title\":\"clock\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":285,\"uid\":4,\"dsid\":20,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":290,\"y\":353,\"uid\":6,\"dsid\":20,\"state\":{\"slot_id\":0},\"title\":\"clock\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":418,\"uid\":7,\"dsid\":20,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":612,\"y\":253,\"uid\":8,\"dsid\":20,\"state\":{\"slot_id\":0},\"title\":\"bool\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"a\"},{\"src_nuid\":1,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"b\"},{\"src_nuid\":3,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":4,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":6,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":7,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":2,\"dst_nuid\":8,\"src_slot\":\"bool\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"name\":\"clock\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"is_connected\":true},{\"name\":\"constant\",\"dt\":0,\"uid\":1,\"index\":1,\"type\":0,\"is_connected\":true},{\"name\":\"clock\",\"dt\":0,\"uid\":2,\"index\":2,\"type\":0,\"is_connected\":true},{\"name\":\"constant\",\"dt\":0,\"uid\":3,\"index\":3,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"bool\",\"dt\":7,\"uid\":4,\"index\":0,\"type\":1}]},{\"plugin\":\"input_proxy\",\"x\":145,\"y\":560,\"uid\":21,\"dsid\":2,\"state\":{\"slot_id\":0},\"title\":\"Loop point\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":464,\"y\":383,\"uid\":22,\"dsid\":2,\"state\":{\"slot_id\":0},\"title\":\"Step 1\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":462,\"y\":511,\"uid\":23,\"dsid\":3,\"state\":{\"slot_id\":0},\"title\":\"Step 2\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":465,\"y\":641,\"uid\":24,\"dsid\":3,\"state\":{\"slot_id\":0},\"title\":\"Step 3\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":465,\"y\":777,\"uid\":25,\"dsid\":3,\"state\":{\"slot_id\":0},\"title\":\"Step 4\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":706,\"y\":336,\"uid\":27,\"dsid\":2,\"state\":{\"slot_id\":0},\"title\":\"scene 1\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"desc\":\"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":707,\"y\":419,\"uid\":28,\"dsid\":3,\"state\":{\"slot_id\":0},\"title\":\"scene 2\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"desc\":\"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":708,\"y\":547,\"uid\":29,\"dsid\":3,\"state\":{\"slot_id\":0},\"title\":\"scene 3\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"desc\":\"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":707,\"y\":627,\"uid\":30,\"dsid\":4,\"state\":{\"slot_id\":0},\"title\":\"scene 4\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"desc\":\"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":183,\"y\":161,\"uid\":31,\"dsid\":2,\"state\":{\"slot_id\":0},\"title\":\"Time display\",\"dyn_in\":[{\"name\":\"input\",\"dt\":0,\"desc\":\"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":143,\"y\":229,\"uid\":32,\"dsid\":2,\"state\":{\"enabled\":true,\"input_sids\":{\"7\":1},\"output_sids\":{\"6\":0}},\"title\":\"Time\",\"graph\":{\"node_uid\":8,\"uid\":245,\"parent_uid\":178,\"nodes\":[{\"plugin\":\"delta_t_generator\",\"x\":7,\"y\":7,\"uid\":0},{\"plugin\":\"accumulate_modulator\",\"x\":181,\"y\":7,\"uid\":1,\"state\":{\"value\":3138.7310999999117}},{\"plugin\":\"multiply_modulator\",\"x\":101,\"y\":7,\"uid\":2},{\"plugin\":\"output_proxy\",\"x\":283,\"y\":7,\"uid\":6,\"dsid\":7,\"state\":{\"slot_id\":0},\"title\":\"time\",\"dyn_in\":[{\"name\":\"input\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":23,\"y\":66,\"uid\":7,\"dsid\":5,\"state\":{\"slot_id\":0},\"title\":\"Speed\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":\"seconds\",\"dst_slot\":\"a\"},{\"src_nuid\":2,\"dst_nuid\":1,\"src_slot\":\"result\",\"dst_slot\":\"value\"},{\"src_nuid\":1,\"dst_nuid\":6,\"src_slot\":\"value\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":7,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":\"b\",\"src_connected\":true,\"src_dyn\":true}]},\"dyn_in\":[{\"name\":\"Speed\",\"dt\":0,\"uid\":1,\"index\":0,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"time\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1}]},{\"plugin\":\"input_proxy\",\"x\":100,\"y\":493,\"uid\":34,\"dsid\":2,\"state\":{\"slot_id\":0},\"title\":\"speed\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":461,\"y\":216,\"uid\":35,\"dsid\":1,\"state\":{\"slot_id\":0},\"title\":\"step 0\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]}],\"conns\":[{\"src_nuid\":6,\"dst_nuid\":9,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":6,\"dst_nuid\":9,\"src_slot\":\"result\",\"dst_slot\":2,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":6,\"dst_nuid\":12,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_dyn\":true,\"offset\":2},{\"src_nuid\":6,\"dst_nuid\":12,\"src_slot\":\"result\",\"dst_slot\":2,\"dst_dyn\":true,\"offset\":3},{\"src_nuid\":6,\"dst_nuid\":8,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_dyn\":true,\"offset\":4},{\"src_nuid\":6,\"dst_nuid\":8,\"src_slot\":\"result\",\"dst_slot\":2,\"dst_dyn\":true,\"offset\":5},{\"src_nuid\":6,\"dst_nuid\":20,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_dyn\":true,\"offset\":6},{\"src_nuid\":6,\"dst_nuid\":20,\"src_slot\":\"result\",\"dst_slot\":2,\"dst_dyn\":true,\"offset\":7},{\"src_nuid\":21,\"dst_nuid\":6,\"src_slot\":0,\"dst_slot\":\"limit\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":22,\"dst_nuid\":8,\"src_slot\":0,\"dst_slot\":3,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":22,\"dst_nuid\":9,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":23,\"dst_nuid\":9,\"src_slot\":0,\"dst_slot\":3,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":23,\"dst_nuid\":12,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":24,\"dst_nuid\":12,\"src_slot\":0,\"dst_slot\":3,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":24,\"dst_nuid\":20,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":25,\"dst_nuid\":20,\"src_slot\":0,\"dst_slot\":3,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":8,\"dst_nuid\":27,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":9,\"dst_nuid\":28,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":12,\"dst_nuid\":29,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":20,\"dst_nuid\":30,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":6,\"dst_nuid\":31,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true,\"offset\":8},{\"src_nuid\":32,\"dst_nuid\":6,\"src_slot\":0,\"dst_slot\":\"value\",\"src_dyn\":true},{\"src_nuid\":34,\"dst_nuid\":32,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":35,\"dst_nuid\":8,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"name\":\"Loop point\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"is_connected\":true},{\"name\":\"Step 1\",\"dt\":0,\"uid\":1,\"index\":1,\"type\":0,\"is_connected\":true},{\"name\":\"Step 2\",\"dt\":0,\"uid\":2,\"index\":2,\"type\":0,\"is_connected\":true},{\"name\":\"Step 3\",\"dt\":0,\"uid\":3,\"index\":3,\"type\":0,\"is_connected\":true},{\"name\":\"Step 4\",\"dt\":0,\"uid\":4,\"index\":4,\"type\":0,\"is_connected\":true},{\"name\":\"speed\",\"dt\":0,\"uid\":11,\"index\":5,\"type\":0,\"is_connected\":true},{\"name\":\"step 0\",\"dt\":0,\"uid\":12,\"index\":6,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"scene 1\",\"dt\":7,\"uid\":6,\"index\":0,\"type\":1},{\"name\":\"scene 2\",\"dt\":7,\"uid\":7,\"index\":1,\"type\":1},{\"name\":\"scene 3\",\"dt\":7,\"uid\":8,\"index\":2,\"type\":1},{\"name\":\"scene 4\",\"dt\":7,\"uid\":9,\"index\":3,\"type\":1},{\"name\":\"Time display\",\"dt\":0,\"uid\":10,\"index\":4,\"type\":1}]},{\"plugin\":\"const_float_generator\",\"x\":117,\"y\":84,\"uid\":141,\"state\":{\"val\":16},\"title\":\"Loop point\"},{\"plugin\":\"const_float_generator\",\"x\":213,\"y\":188,\"uid\":142,\"state\":{\"val\":4},\"title\":\"Step 2 start\"},{\"plugin\":\"const_float_generator\",\"x\":213,\"y\":242,\"uid\":143,\"state\":{\"val\":8},\"title\":\"Step 3 start\"},{\"plugin\":\"const_float_generator\",\"x\":213,\"y\":295,\"uid\":144,\"state\":{\"val\":12},\"title\":\"Step 4 start\"},{\"plugin\":\"const_float_generator\",\"x\":213,\"y\":349,\"uid\":145,\"state\":{\"val\":16},\"title\":\"End\"},{\"plugin\":\"float_display\",\"x\":213,\"y\":84,\"uid\":146,\"title\":\"Time display\"},{\"plugin\":\"slider_float_generator\",\"x\":118,\"y\":8,\"uid\":151,\"state\":{\"val\":4.2,\"min\":0,\"max\":20},\"title\":\"Speed\"},{\"plugin\":\"const_float_generator\",\"x\":213,\"y\":135,\"uid\":152,\"state\":{\"val\":0},\"title\":\"Step 1 start\"}],\"conns\":[{\"src_nuid\":141,\"dst_nuid\":140,\"src_slot\":\"value\",\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":142,\"dst_nuid\":140,\"src_slot\":\"value\",\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":143,\"dst_nuid\":140,\"src_slot\":\"value\",\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":144,\"dst_nuid\":140,\"src_slot\":\"value\",\"dst_slot\":3,\"dst_dyn\":true},{\"src_nuid\":145,\"dst_nuid\":140,\"src_slot\":\"value\",\"dst_slot\":4,\"dst_dyn\":true},{\"src_nuid\":140,\"dst_nuid\":146,\"src_slot\":4,\"dst_slot\":\"float\",\"src_dyn\":true},{\"src_nuid\":151,\"dst_nuid\":140,\"src_slot\":\"value\",\"dst_slot\":5,\"dst_dyn\":true},{\"src_nuid\":152,\"dst_nuid\":140,\"src_slot\":\"value\",\"dst_slot\":6,\"dst_dyn\":true}]}}"
  },
  {
    "path": "browser/patches/util_8_step_stepsequencer.json",
    "content": "{\n    \"abs_t\": 11.448,\n    \"active_graph\": 0,\n    \"graph_uid\": 11,\n    \"root\": {\n        \"node_uid\": 13,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 321,\n                \"y\": 123,\n                \"uid\": 0,\n                \"dsid\": 22,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"21\": 0,\n                        \"22\": 1,\n                        \"23\": 2,\n                        \"24\": 3,\n                        \"34\": 11,\n                        \"35\": 12,\n                        \"36\": 13,\n                        \"37\": 14,\n                        \"38\": 15,\n                        \"39\": 16\n                    },\n                    \"output_sids\": {\n                        \"27\": 6,\n                        \"28\": 7,\n                        \"29\": 8,\n                        \"30\": 9,\n                        \"44\": 17,\n                        \"45\": 18,\n                        \"46\": 19,\n                        \"47\": 20,\n                        \"48\": 21\n                    }\n                },\n                \"title\": \"Stepsequencer\",\n                \"graph\": {\n                    \"node_uid\": 49,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"modulate_modulator\",\n                            \"x\": 313,\n                            \"y\": 841,\n                            \"uid\": 6\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 570,\n                            \"y\": 258,\n                            \"uid\": 8,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"3\": 0,\n                                    \"4\": 1,\n                                    \"6\": 2,\n                                    \"7\": 3\n                                },\n                                \"output_sids\": {\n                                    \"8\": 4\n                                }\n                            },\n                            \"title\": \"more/less/and\",\n                            \"graph\": {\n                                \"node_uid\": 9,\n                                \"uid\": 2,\n                                \"parent_uid\": 1,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"more_than_modulator\",\n                                        \"x\": 380,\n                                        \"y\": 230,\n                                        \"uid\": 0,\n                                        \"state\": true\n                                    },\n                                    {\n                                        \"plugin\": \"less_than_modulator\",\n                                        \"x\": 378,\n                                        \"y\": 330,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"and_modulator\",\n                                        \"x\": 516,\n                                        \"y\": 256,\n                                        \"uid\": 2\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 287,\n                                        \"y\": 223,\n                                        \"uid\": 3,\n                                        \"dsid\": 20,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"clock\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 289,\n                                        \"y\": 285,\n                                        \"uid\": 4,\n                                        \"dsid\": 20,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"constant\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 290,\n                                        \"y\": 353,\n                                        \"uid\": 6,\n                                        \"dsid\": 20,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"clock\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 289,\n                                        \"y\": 418,\n                                        \"uid\": 7,\n                                        \"dsid\": 20,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"constant\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 612,\n                                        \"y\": 253,\n                                        \"uid\": 8,\n                                        \"dsid\": 20,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"bool\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 7,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"clock\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"constant\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"clock\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"constant\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"bool\",\n                                    \"dt\": 7,\n                                    \"uid\": 4,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 569,\n                            \"y\": 393,\n                            \"uid\": 9,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"3\": 0,\n                                    \"4\": 1,\n                                    \"6\": 2,\n                                    \"7\": 3\n                                },\n                                \"output_sids\": {\n                                    \"8\": 4\n                                }\n                            },\n                            \"title\": \"more/less/and\",\n                            \"graph\": {\n                                \"node_uid\": 9,\n                                \"uid\": 3,\n                                \"parent_uid\": 1,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"more_than_modulator\",\n                                        \"x\": 380,\n                                        \"y\": 230,\n                                        \"uid\": 0,\n                                        \"state\": true\n                                    },\n                                    {\n                                        \"plugin\": \"less_than_modulator\",\n                                        \"x\": 378,\n                                        \"y\": 330,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"and_modulator\",\n                                        \"x\": 516,\n                                        \"y\": 256,\n                                        \"uid\": 2\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 287,\n                                        \"y\": 223,\n                                        \"uid\": 3,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"clock\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 289,\n                                        \"y\": 285,\n                                        \"uid\": 4,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"constant\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 290,\n                                        \"y\": 353,\n                                        \"uid\": 6,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"clock\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 289,\n                                        \"y\": 418,\n                                        \"uid\": 7,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"constant\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 612,\n                                        \"y\": 253,\n                                        \"uid\": 8,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"bool\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 7,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"clock\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"constant\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"clock\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"constant\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"bool\",\n                                    \"dt\": 7,\n                                    \"uid\": 4,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 568,\n                            \"y\": 527,\n                            \"uid\": 12,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"3\": 0,\n                                    \"4\": 1,\n                                    \"6\": 2,\n                                    \"7\": 3\n                                },\n                                \"output_sids\": {\n                                    \"8\": 4\n                                }\n                            },\n                            \"title\": \"more/less/and\",\n                            \"graph\": {\n                                \"node_uid\": 9,\n                                \"uid\": 4,\n                                \"parent_uid\": 1,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"more_than_modulator\",\n                                        \"x\": 380,\n                                        \"y\": 230,\n                                        \"uid\": 0,\n                                        \"state\": true\n                                    },\n                                    {\n                                        \"plugin\": \"less_than_modulator\",\n                                        \"x\": 378,\n                                        \"y\": 330,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"and_modulator\",\n                                        \"x\": 516,\n                                        \"y\": 256,\n                                        \"uid\": 2\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 287,\n                                        \"y\": 223,\n                                        \"uid\": 3,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"clock\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 289,\n                                        \"y\": 285,\n                                        \"uid\": 4,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"constant\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 290,\n                                        \"y\": 353,\n                                        \"uid\": 6,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"clock\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 289,\n                                        \"y\": 418,\n                                        \"uid\": 7,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"constant\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 612,\n                                        \"y\": 253,\n                                        \"uid\": 8,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"bool\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 7,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"clock\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"constant\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"clock\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"constant\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"bool\",\n                                    \"dt\": 7,\n                                    \"uid\": 4,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 565,\n                            \"y\": 662,\n                            \"uid\": 20,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"3\": 0,\n                                    \"4\": 1,\n                                    \"6\": 2,\n                                    \"7\": 3\n                                },\n                                \"output_sids\": {\n                                    \"8\": 4\n                                }\n                            },\n                            \"title\": \"more/less/and\",\n                            \"graph\": {\n                                \"node_uid\": 9,\n                                \"uid\": 5,\n                                \"parent_uid\": 1,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"more_than_modulator\",\n                                        \"x\": 380,\n                                        \"y\": 230,\n                                        \"uid\": 0,\n                                        \"state\": true\n                                    },\n                                    {\n                                        \"plugin\": \"less_than_modulator\",\n                                        \"x\": 378,\n                                        \"y\": 330,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"and_modulator\",\n                                        \"x\": 516,\n                                        \"y\": 256,\n                                        \"uid\": 2\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 287,\n                                        \"y\": 223,\n                                        \"uid\": 3,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"clock\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 289,\n                                        \"y\": 285,\n                                        \"uid\": 4,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"constant\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 290,\n                                        \"y\": 353,\n                                        \"uid\": 6,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"clock\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 289,\n                                        \"y\": 418,\n                                        \"uid\": 7,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"constant\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 612,\n                                        \"y\": 253,\n                                        \"uid\": 8,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"bool\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 7,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"clock\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"constant\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"clock\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"constant\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"bool\",\n                                    \"dt\": 7,\n                                    \"uid\": 4,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 260,\n                            \"y\": 635,\n                            \"uid\": 21,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Loop point\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 464,\n                            \"y\": 383,\n                            \"uid\": 22,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Step 1\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 462,\n                            \"y\": 511,\n                            \"uid\": 23,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Step 2\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 465,\n                            \"y\": 641,\n                            \"uid\": 24,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Step 3\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 706,\n                            \"y\": 336,\n                            \"uid\": 27,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"scene 1\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 7,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 707,\n                            \"y\": 419,\n                            \"uid\": 28,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"scene 2\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 7,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 708,\n                            \"y\": 547,\n                            \"uid\": 29,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"scene 3\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 7,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 707,\n                            \"y\": 627,\n                            \"uid\": 30,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"scene 4\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 7,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 122,\n                            \"y\": 208,\n                            \"uid\": 32,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"7\": 1\n                                },\n                                \"output_sids\": {\n                                    \"6\": 0\n                                }\n                            },\n                            \"title\": \"Time\",\n                            \"graph\": {\n                                \"node_uid\": 8,\n                                \"uid\": 6,\n                                \"parent_uid\": 1,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"delta_t_generator\",\n                                        \"x\": 7,\n                                        \"y\": 7,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"accumulate_modulator\",\n                                        \"x\": 181,\n                                        \"y\": 7,\n                                        \"uid\": 1,\n                                        \"state\": {\n                                            \"value\": 8901.88200999996\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 101,\n                                        \"y\": 7,\n                                        \"uid\": 2\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 283,\n                                        \"y\": 7,\n                                        \"uid\": 6,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"time\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 23,\n                                        \"y\": 66,\n                                        \"uid\": 7,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Speed\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"Speed\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"time\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 42,\n                            \"y\": 280,\n                            \"uid\": 34,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"speed\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 461,\n                            \"y\": 216,\n                            \"uid\": 35,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"step 0\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 475,\n                            \"y\": 976,\n                            \"uid\": 36,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Step 5\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 473,\n                            \"y\": 1104,\n                            \"uid\": 37,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Step 6\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 476,\n                            \"y\": 1234,\n                            \"uid\": 38,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Step 7\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 472,\n                            \"y\": 809,\n                            \"uid\": 39,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Step 4\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 572,\n                            \"y\": 810,\n                            \"uid\": 40,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"3\": 0,\n                                    \"4\": 1,\n                                    \"6\": 2,\n                                    \"7\": 3\n                                },\n                                \"output_sids\": {\n                                    \"8\": 4\n                                }\n                            },\n                            \"title\": \"more/less/and\",\n                            \"graph\": {\n                                \"node_uid\": 9,\n                                \"uid\": 7,\n                                \"parent_uid\": 1,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"more_than_modulator\",\n                                        \"x\": 380,\n                                        \"y\": 230,\n                                        \"uid\": 0,\n                                        \"state\": true\n                                    },\n                                    {\n                                        \"plugin\": \"less_than_modulator\",\n                                        \"x\": 378,\n                                        \"y\": 330,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"and_modulator\",\n                                        \"x\": 516,\n                                        \"y\": 256,\n                                        \"uid\": 2\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 287,\n                                        \"y\": 223,\n                                        \"uid\": 3,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"clock\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 289,\n                                        \"y\": 285,\n                                        \"uid\": 4,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"constant\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 290,\n                                        \"y\": 353,\n                                        \"uid\": 6,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"clock\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 289,\n                                        \"y\": 418,\n                                        \"uid\": 7,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"constant\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 612,\n                                        \"y\": 253,\n                                        \"uid\": 8,\n                                        \"dsid\": 21,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"bool\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 7,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"clock\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                },\n                                {\n                                    \"name\": \"constant\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                },\n                                {\n                                    \"name\": \"clock\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                },\n                                {\n                                    \"name\": \"constant\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"bool\",\n                                    \"dt\": 7,\n                                    \"uid\": 4,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 571,\n                            \"y\": 945,\n                            \"uid\": 41,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"3\": 0,\n                                    \"4\": 1,\n                                    \"6\": 2,\n                                    \"7\": 3\n                                },\n                                \"output_sids\": {\n                                    \"8\": 4\n                                }\n                            },\n                            \"title\": \"more/less/and\",\n                            \"graph\": {\n                                \"node_uid\": 9,\n                                \"uid\": 8,\n                                \"parent_uid\": 1,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"more_than_modulator\",\n                                        \"x\": 380,\n                                        \"y\": 230,\n                                        \"uid\": 0,\n                                        \"state\": true\n                                    },\n                                    {\n                                        \"plugin\": \"less_than_modulator\",\n                                        \"x\": 378,\n                                        \"y\": 330,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"and_modulator\",\n                                        \"x\": 516,\n                                        \"y\": 256,\n                                        \"uid\": 2\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 287,\n                                        \"y\": 223,\n                                        \"uid\": 3,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"clock\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 289,\n                                        \"y\": 285,\n                                        \"uid\": 4,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"constant\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 290,\n                                        \"y\": 353,\n                                        \"uid\": 6,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"clock\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 289,\n                                        \"y\": 418,\n                                        \"uid\": 7,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"constant\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 612,\n                                        \"y\": 253,\n                                        \"uid\": 8,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"bool\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 7,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"clock\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                },\n                                {\n                                    \"name\": \"constant\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                },\n                                {\n                                    \"name\": \"clock\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                },\n                                {\n                                    \"name\": \"constant\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"bool\",\n                                    \"dt\": 7,\n                                    \"uid\": 4,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 570,\n                            \"y\": 1079,\n                            \"uid\": 42,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"3\": 0,\n                                    \"4\": 1,\n                                    \"6\": 2,\n                                    \"7\": 3\n                                },\n                                \"output_sids\": {\n                                    \"8\": 4\n                                }\n                            },\n                            \"title\": \"more/less/and\",\n                            \"graph\": {\n                                \"node_uid\": 9,\n                                \"uid\": 9,\n                                \"parent_uid\": 1,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"more_than_modulator\",\n                                        \"x\": 380,\n                                        \"y\": 230,\n                                        \"uid\": 0,\n                                        \"state\": true\n                                    },\n                                    {\n                                        \"plugin\": \"less_than_modulator\",\n                                        \"x\": 378,\n                                        \"y\": 330,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"and_modulator\",\n                                        \"x\": 516,\n                                        \"y\": 256,\n                                        \"uid\": 2\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 287,\n                                        \"y\": 223,\n                                        \"uid\": 3,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"clock\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 289,\n                                        \"y\": 285,\n                                        \"uid\": 4,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"constant\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 290,\n                                        \"y\": 353,\n                                        \"uid\": 6,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"clock\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 289,\n                                        \"y\": 418,\n                                        \"uid\": 7,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"constant\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 612,\n                                        \"y\": 253,\n                                        \"uid\": 8,\n                                        \"dsid\": 23,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"bool\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 7,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"clock\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                },\n                                {\n                                    \"name\": \"constant\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                },\n                                {\n                                    \"name\": \"clock\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                },\n                                {\n                                    \"name\": \"constant\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"bool\",\n                                    \"dt\": 7,\n                                    \"uid\": 4,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 567,\n                            \"y\": 1214,\n                            \"uid\": 43,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"input_sids\": {\n                                    \"3\": 0,\n                                    \"4\": 1,\n                                    \"6\": 2,\n                                    \"7\": 3\n                                },\n                                \"output_sids\": {\n                                    \"8\": 4\n                                }\n                            },\n                            \"title\": \"more/less/and\",\n                            \"graph\": {\n                                \"node_uid\": 9,\n                                \"uid\": 10,\n                                \"parent_uid\": 1,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"more_than_modulator\",\n                                        \"x\": 380,\n                                        \"y\": 230,\n                                        \"uid\": 0,\n                                        \"state\": true\n                                    },\n                                    {\n                                        \"plugin\": \"less_than_modulator\",\n                                        \"x\": 378,\n                                        \"y\": 330,\n                                        \"uid\": 1,\n                                        \"state\": true\n                                    },\n                                    {\n                                        \"plugin\": \"and_modulator\",\n                                        \"x\": 516,\n                                        \"y\": 256,\n                                        \"uid\": 2,\n                                        \"state\": true\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 287,\n                                        \"y\": 223,\n                                        \"uid\": 3,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"clock\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 289,\n                                        \"y\": 285,\n                                        \"uid\": 4,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"constant\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 290,\n                                        \"y\": 353,\n                                        \"uid\": 6,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"clock\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 289,\n                                        \"y\": 418,\n                                        \"uid\": 7,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"constant\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 612,\n                                        \"y\": 253,\n                                        \"uid\": 8,\n                                        \"dsid\": 22,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"bool\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 7,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"clock\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                },\n                                {\n                                    \"name\": \"constant\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": false,\n                                    \"connected\": false\n                                },\n                                {\n                                    \"name\": \"clock\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                },\n                                {\n                                    \"name\": \"constant\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": false\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"bool\",\n                                    \"dt\": 7,\n                                    \"uid\": 4,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 707,\n                            \"y\": 884,\n                            \"uid\": 44,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"scene 5\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 7,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 708,\n                            \"y\": 967,\n                            \"uid\": 45,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"scene 6\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 7,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 709,\n                            \"y\": 1095,\n                            \"uid\": 46,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"scene 7\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 7,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 714,\n                            \"y\": 1240,\n                            \"uid\": 47,\n                            \"dsid\": 6,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"scene 8\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 7,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 265,\n                            \"y\": 169,\n                            \"uid\": 48,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Time display\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 12,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true,\n                            \"offset\": 2\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 12,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true,\n                            \"offset\": 3\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 8,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true,\n                            \"offset\": 4\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 8,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true,\n                            \"offset\": 5\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 20,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true,\n                            \"offset\": 6\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 20,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true,\n                            \"offset\": 7\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 8,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 9,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 12,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 12,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 20,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 8,\n                            \"dst_nuid\": 27,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 28,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 29,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 20,\n                            \"dst_nuid\": 30,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 32,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 34,\n                            \"dst_nuid\": 32,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 35,\n                            \"dst_nuid\": 8,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 39,\n                            \"dst_nuid\": 20,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 39,\n                            \"dst_nuid\": 40,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"dst_connected\": false,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 36,\n                            \"dst_nuid\": 40,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_connected\": true,\n                            \"dst_connected\": false,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 36,\n                            \"dst_nuid\": 41,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"dst_connected\": false,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 41,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_connected\": true,\n                            \"dst_connected\": false,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 42,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"dst_connected\": false,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 38,\n                            \"dst_nuid\": 42,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_connected\": true,\n                            \"dst_connected\": false,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 21,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_connected\": true,\n                            \"dst_connected\": false,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 40,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": false,\n                            \"dst_dyn\": true,\n                            \"offset\": 8\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 40,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_connected\": false,\n                            \"dst_dyn\": true,\n                            \"offset\": 9\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 41,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": false,\n                            \"dst_dyn\": true,\n                            \"offset\": 10\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 41,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_connected\": false,\n                            \"dst_dyn\": true,\n                            \"offset\": 11\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 42,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": false,\n                            \"dst_dyn\": true,\n                            \"offset\": 12\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 42,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_connected\": false,\n                            \"dst_dyn\": true,\n                            \"offset\": 13\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": false,\n                            \"dst_dyn\": true,\n                            \"offset\": 14\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 43,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_connected\": false,\n                            \"dst_dyn\": true,\n                            \"offset\": 15\n                        },\n                        {\n                            \"src_nuid\": 40,\n                            \"dst_nuid\": 44,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 41,\n                            \"dst_nuid\": 45,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 42,\n                            \"dst_nuid\": 46,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 43,\n                            \"dst_nuid\": 47,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 48,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 16\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Loop point\",\n                        \"dt\": 0,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Step 1\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Step 2\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 2,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Step 3\",\n                        \"dt\": 0,\n                        \"uid\": 3,\n                        \"index\": 3,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"speed\",\n                        \"dt\": 0,\n                        \"uid\": 11,\n                        \"index\": 4,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"step 0\",\n                        \"dt\": 0,\n                        \"uid\": 12,\n                        \"index\": 5,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Step 5\",\n                        \"dt\": 0,\n                        \"uid\": 13,\n                        \"index\": 6,\n                        \"type\": 0\n                    },\n                    {\n                        \"name\": \"Step 6\",\n                        \"dt\": 0,\n                        \"uid\": 14,\n                        \"index\": 7,\n                        \"type\": 0\n                    },\n                    {\n                        \"name\": \"Step 7\",\n                        \"dt\": 0,\n                        \"uid\": 15,\n                        \"index\": 8,\n                        \"type\": 0\n                    },\n                    {\n                        \"name\": \"Step 4\",\n                        \"dt\": 0,\n                        \"uid\": 16,\n                        \"index\": 9,\n                        \"type\": 0\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"scene 1\",\n                        \"dt\": 7,\n                        \"uid\": 6,\n                        \"index\": 0,\n                        \"type\": 1\n                    },\n                    {\n                        \"name\": \"scene 2\",\n                        \"dt\": 7,\n                        \"uid\": 7,\n                        \"index\": 1,\n                        \"type\": 1\n                    },\n                    {\n                        \"name\": \"scene 3\",\n                        \"dt\": 7,\n                        \"uid\": 8,\n                        \"index\": 2,\n                        \"type\": 1\n                    },\n                    {\n                        \"name\": \"scene 4\",\n                        \"dt\": 7,\n                        \"uid\": 9,\n                        \"index\": 3,\n                        \"type\": 1\n                    },\n                    {\n                        \"name\": \"scene 5\",\n                        \"dt\": 7,\n                        \"uid\": 17,\n                        \"index\": 4,\n                        \"type\": 1\n                    },\n                    {\n                        \"name\": \"scene 6\",\n                        \"dt\": 7,\n                        \"uid\": 18,\n                        \"index\": 5,\n                        \"type\": 1\n                    },\n                    {\n                        \"name\": \"scene 7\",\n                        \"dt\": 7,\n                        \"uid\": 19,\n                        \"index\": 6,\n                        \"type\": 1\n                    },\n                    {\n                        \"name\": \"scene 8\",\n                        \"dt\": 7,\n                        \"uid\": 20,\n                        \"index\": 7,\n                        \"type\": 1\n                    },\n                    {\n                        \"name\": \"Time display\",\n                        \"dt\": 0,\n                        \"uid\": 21,\n                        \"index\": 8,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 212,\n                \"y\": 600,\n                \"uid\": 1,\n                \"state\": {\n                    \"val\": 8\n                },\n                \"title\": \"Loop point\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 210,\n                \"y\": 225,\n                \"uid\": 2,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"Step 2 start\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 210,\n                \"y\": 279,\n                \"uid\": 3,\n                \"state\": {\n                    \"val\": 2\n                },\n                \"title\": \"Step 3 start\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 210,\n                \"y\": 332,\n                \"uid\": 4,\n                \"state\": {\n                    \"val\": 3\n                },\n                \"title\": \"Step 4 start\"\n            },\n            {\n                \"plugin\": \"float_display\",\n                \"x\": 210,\n                \"y\": 121,\n                \"uid\": 6,\n                \"title\": \"Time display\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 115,\n                \"y\": 45,\n                \"uid\": 7,\n                \"state\": {\n                    \"val\": 2.12,\n                    \"min\": 0,\n                    \"max\": 4\n                },\n                \"title\": \"Speed\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 210,\n                \"y\": 172,\n                \"uid\": 8,\n                \"state\": {\n                    \"val\": 0\n                },\n                \"title\": \"Step 1 start\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 210,\n                \"y\": 389,\n                \"uid\": 9,\n                \"state\": {\n                    \"val\": 4\n                },\n                \"title\": \"Step 4 start\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 210,\n                \"y\": 443,\n                \"uid\": 10,\n                \"state\": {\n                    \"val\": 5\n                },\n                \"title\": \"Step 4 start\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 211,\n                \"y\": 497,\n                \"uid\": 11,\n                \"state\": {\n                    \"val\": 6\n                },\n                \"title\": \"Step 4 start\"\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 213,\n                \"y\": 547,\n                \"uid\": 12,\n                \"state\": {\n                    \"val\": 7\n                },\n                \"title\": \"Step 4 start\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 1,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 2,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 3,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 3,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 7,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 4,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 8,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 5,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 0,\n                \"dst_nuid\": 6,\n                \"src_slot\": 8,\n                \"dst_slot\": 0,\n                \"src_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/util_9_step_stepsequencer.json",
    "content": "{\"abs_t\":765.807,\"active_graph\":0,\"graph_uid\":348,\"root\":{\"node_uid\":76,\"uid\":0,\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":420,\"y\":131,\"uid\":60,\"dsid\":23,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"21\":0,\"22\":1,\"23\":2,\"24\":3,\"25\":4,\"34\":11,\"35\":12,\"44\":13,\"45\":14,\"46\":15,\"47\":16,\"48\":17},\"output_sids\":{\"27\":6,\"28\":7,\"29\":8,\"30\":9,\"31\":10,\"50\":18,\"51\":19,\"52\":20,\"53\":21,\"54\":22}},\"title\":\"Stepsequencer\",\"graph\":{\"node_uid\":55,\"uid\":337,\"parent_uid\":0,\"open\":true,\"nodes\":[{\"plugin\":\"modulate_modulator\",\"x\":264,\"y\":275,\"uid\":6},{\"plugin\":\"graph\",\"x\":568,\"y\":245,\"uid\":8,\"dsid\":5,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"3\":0,\"4\":1,\"7\":3},\"output_sids\":{\"8\":4}},\"title\":\"more/less/and\",\"graph\":{\"node_uid\":9,\"uid\":338,\"parent_uid\":337,\"open\":true,\"nodes\":[{\"plugin\":\"more_than_modulator\",\"x\":380,\"y\":230,\"uid\":0},{\"plugin\":\"less_than_modulator\",\"x\":378,\"y\":330,\"uid\":1},{\"plugin\":\"and_modulator\",\"x\":516,\"y\":256,\"uid\":2},{\"plugin\":\"input_proxy\",\"x\":201,\"y\":213,\"uid\":3,\"dsid\":24,\"state\":{\"slot_id\":0},\"title\":\"clock\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":285,\"uid\":4,\"dsid\":24,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":418,\"uid\":7,\"dsid\":24,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":612,\"y\":253,\"uid\":8,\"dsid\":24,\"state\":{\"slot_id\":0},\"title\":\"bool\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"a\"},{\"src_nuid\":1,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"b\"},{\"src_nuid\":3,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":4,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":7,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":2,\"dst_nuid\":8,\"src_slot\":\"bool\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":3,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true,\"offset\":1}]},\"dyn_in\":[{\"name\":\"clock\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"is_connected\":true},{\"name\":\"constant\",\"dt\":0,\"uid\":1,\"index\":1,\"type\":0,\"is_connected\":true},{\"name\":\"constant\",\"dt\":0,\"uid\":3,\"index\":2,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"bool\",\"dt\":7,\"uid\":4,\"index\":0,\"type\":1}]},{\"plugin\":\"graph\",\"x\":567,\"y\":376,\"uid\":9,\"dsid\":5,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"3\":0,\"4\":1,\"7\":3},\"output_sids\":{\"8\":4}},\"title\":\"more/less/and\",\"graph\":{\"node_uid\":9,\"uid\":339,\"parent_uid\":337,\"open\":true,\"nodes\":[{\"plugin\":\"more_than_modulator\",\"x\":380,\"y\":230,\"uid\":0},{\"plugin\":\"less_than_modulator\",\"x\":378,\"y\":330,\"uid\":1},{\"plugin\":\"and_modulator\",\"x\":516,\"y\":256,\"uid\":2},{\"plugin\":\"input_proxy\",\"x\":287,\"y\":223,\"uid\":3,\"dsid\":25,\"state\":{\"slot_id\":0},\"title\":\"clock\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":285,\"uid\":4,\"dsid\":25,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":418,\"uid\":7,\"dsid\":25,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":612,\"y\":253,\"uid\":8,\"dsid\":25,\"state\":{\"slot_id\":0},\"title\":\"bool\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"a\"},{\"src_nuid\":1,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"b\"},{\"src_nuid\":3,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":4,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":7,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":2,\"dst_nuid\":8,\"src_slot\":\"bool\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":3,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true,\"offset\":1}]},\"dyn_in\":[{\"name\":\"clock\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"is_connected\":true},{\"name\":\"constant\",\"dt\":0,\"uid\":1,\"index\":1,\"type\":0,\"is_connected\":true},{\"name\":\"constant\",\"dt\":0,\"uid\":3,\"index\":2,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"bool\",\"dt\":7,\"uid\":4,\"index\":0,\"type\":1}]},{\"plugin\":\"graph\",\"x\":566,\"y\":510,\"uid\":12,\"dsid\":5,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"3\":0,\"4\":1,\"7\":3},\"output_sids\":{\"8\":4}},\"title\":\"more/less/and\",\"graph\":{\"node_uid\":9,\"uid\":340,\"parent_uid\":337,\"open\":true,\"nodes\":[{\"plugin\":\"more_than_modulator\",\"x\":380,\"y\":230,\"uid\":0},{\"plugin\":\"less_than_modulator\",\"x\":378,\"y\":330,\"uid\":1},{\"plugin\":\"and_modulator\",\"x\":516,\"y\":256,\"uid\":2},{\"plugin\":\"input_proxy\",\"x\":287,\"y\":223,\"uid\":3,\"dsid\":26,\"state\":{\"slot_id\":0},\"title\":\"clock\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":242,\"y\":292,\"uid\":4,\"dsid\":26,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":418,\"uid\":7,\"dsid\":26,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":612,\"y\":253,\"uid\":8,\"dsid\":26,\"state\":{\"slot_id\":0},\"title\":\"bool\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"a\"},{\"src_nuid\":1,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"b\"},{\"src_nuid\":3,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":4,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":7,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":2,\"dst_nuid\":8,\"src_slot\":\"bool\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":3,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true,\"offset\":1}]},\"dyn_in\":[{\"name\":\"clock\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"is_connected\":true},{\"name\":\"constant\",\"dt\":0,\"uid\":1,\"index\":1,\"type\":0,\"is_connected\":true},{\"name\":\"constant\",\"dt\":0,\"uid\":3,\"index\":2,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"bool\",\"dt\":7,\"uid\":4,\"index\":0,\"type\":1}]},{\"plugin\":\"graph\",\"x\":564,\"y\":647,\"uid\":20,\"dsid\":5,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"3\":0,\"4\":1,\"7\":3},\"output_sids\":{\"8\":4}},\"title\":\"more/less/and\",\"graph\":{\"node_uid\":9,\"uid\":341,\"parent_uid\":337,\"open\":true,\"nodes\":[{\"plugin\":\"more_than_modulator\",\"x\":380,\"y\":230,\"uid\":0},{\"plugin\":\"less_than_modulator\",\"x\":378,\"y\":330,\"uid\":1},{\"plugin\":\"and_modulator\",\"x\":516,\"y\":256,\"uid\":2},{\"plugin\":\"input_proxy\",\"x\":287,\"y\":223,\"uid\":3,\"dsid\":25,\"state\":{\"slot_id\":0},\"title\":\"clock\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":285,\"uid\":4,\"dsid\":25,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":418,\"uid\":7,\"dsid\":25,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":612,\"y\":253,\"uid\":8,\"dsid\":25,\"state\":{\"slot_id\":0},\"title\":\"bool\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"a\"},{\"src_nuid\":1,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"b\"},{\"src_nuid\":3,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":4,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":7,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":2,\"dst_nuid\":8,\"src_slot\":\"bool\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":3,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true,\"offset\":1}]},\"dyn_in\":[{\"name\":\"clock\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"is_connected\":true},{\"name\":\"constant\",\"dt\":0,\"uid\":1,\"index\":1,\"type\":0,\"is_connected\":true},{\"name\":\"constant\",\"dt\":0,\"uid\":3,\"index\":2,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"bool\",\"dt\":7,\"uid\":4,\"index\":0,\"type\":1}]},{\"plugin\":\"input_proxy\",\"x\":145,\"y\":560,\"uid\":21,\"dsid\":7,\"state\":{\"slot_id\":0},\"title\":\"Loop point\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":455,\"y\":379,\"uid\":22,\"dsid\":7,\"state\":{\"slot_id\":0},\"title\":\"Step 1\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":462,\"y\":511,\"uid\":23,\"dsid\":8,\"state\":{\"slot_id\":0},\"title\":\"Step 2\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":465,\"y\":641,\"uid\":24,\"dsid\":8,\"state\":{\"slot_id\":0},\"title\":\"Step 3\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":463,\"y\":744,\"uid\":25,\"dsid\":8,\"state\":{\"slot_id\":0},\"title\":\"Step 4\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":792,\"y\":307,\"uid\":27,\"dsid\":7,\"state\":{\"slot_id\":0},\"title\":\"scene 1\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"desc\":\"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":793,\"y\":390,\"uid\":28,\"dsid\":8,\"state\":{\"slot_id\":0},\"title\":\"scene 2\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"desc\":\"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":794,\"y\":518,\"uid\":29,\"dsid\":8,\"state\":{\"slot_id\":0},\"title\":\"scene 3\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"desc\":\"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":793,\"y\":598,\"uid\":30,\"dsid\":9,\"state\":{\"slot_id\":0},\"title\":\"scene 4\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"desc\":\"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":131,\"y\":185,\"uid\":31,\"dsid\":7,\"state\":{\"slot_id\":0},\"title\":\"Time display\",\"dyn_in\":[{\"name\":\"input\",\"dt\":0,\"desc\":\"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":159,\"y\":310,\"uid\":32,\"open\":false,\"dsid\":2,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"7\":1},\"output_sids\":{\"6\":0}},\"title\":\"Time\",\"graph\":{\"node_uid\":8,\"uid\":342,\"parent_uid\":337,\"open\":true,\"nodes\":[{\"plugin\":\"delta_t_generator\",\"x\":7,\"y\":7,\"uid\":0},{\"plugin\":\"accumulate_modulator\",\"x\":181,\"y\":7,\"uid\":1,\"state\":{\"value\":23040.66376669547}},{\"plugin\":\"multiply_modulator\",\"x\":101,\"y\":7,\"uid\":2},{\"plugin\":\"output_proxy\",\"x\":283,\"y\":7,\"uid\":6,\"dsid\":12,\"state\":{\"slot_id\":0},\"title\":\"time\",\"dyn_in\":[{\"name\":\"input\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":23,\"y\":66,\"uid\":7,\"dsid\":10,\"state\":{\"slot_id\":0},\"title\":\"Speed\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":\"seconds\",\"dst_slot\":\"a\"},{\"src_nuid\":2,\"dst_nuid\":1,\"src_slot\":\"result\",\"dst_slot\":\"value\"},{\"src_nuid\":1,\"dst_nuid\":6,\"src_slot\":\"value\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":7,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":\"b\",\"src_connected\":true,\"src_dyn\":true}]},\"dyn_in\":[{\"name\":\"Speed\",\"dt\":0,\"uid\":1,\"index\":0,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"time\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1}]},{\"plugin\":\"input_proxy\",\"x\":80,\"y\":301,\"uid\":34,\"dsid\":7,\"state\":{\"slot_id\":0},\"title\":\"speed\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":461,\"y\":216,\"uid\":35,\"dsid\":6,\"state\":{\"slot_id\":0},\"title\":\"step 0\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"graph\",\"x\":564,\"y\":778,\"uid\":40,\"dsid\":5,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"3\":0,\"4\":1,\"7\":3},\"output_sids\":{\"8\":4}},\"title\":\"more/less/and\",\"graph\":{\"node_uid\":9,\"uid\":343,\"parent_uid\":337,\"open\":true,\"nodes\":[{\"plugin\":\"more_than_modulator\",\"x\":380,\"y\":230,\"uid\":0},{\"plugin\":\"less_than_modulator\",\"x\":378,\"y\":330,\"uid\":1},{\"plugin\":\"and_modulator\",\"x\":516,\"y\":256,\"uid\":2},{\"plugin\":\"input_proxy\",\"x\":201,\"y\":213,\"uid\":3,\"dsid\":25,\"state\":{\"slot_id\":0},\"title\":\"clock\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":285,\"uid\":4,\"dsid\":25,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":418,\"uid\":7,\"dsid\":25,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":612,\"y\":253,\"uid\":8,\"dsid\":25,\"state\":{\"slot_id\":0},\"title\":\"bool\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"a\"},{\"src_nuid\":1,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"b\"},{\"src_nuid\":3,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":4,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":7,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":2,\"dst_nuid\":8,\"src_slot\":\"bool\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":3,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true,\"offset\":1}]},\"dyn_in\":[{\"name\":\"clock\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"is_connected\":true,\"connected\":false},{\"name\":\"constant\",\"dt\":0,\"uid\":1,\"index\":1,\"type\":0,\"is_connected\":true,\"connected\":false},{\"name\":\"constant\",\"dt\":0,\"uid\":3,\"index\":2,\"type\":0,\"is_connected\":true,\"connected\":false}],\"dyn_out\":[{\"name\":\"bool\",\"dt\":7,\"uid\":4,\"index\":0,\"type\":1}]},{\"plugin\":\"graph\",\"x\":563,\"y\":909,\"uid\":41,\"dsid\":5,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"3\":0,\"4\":1,\"7\":3},\"output_sids\":{\"8\":4}},\"title\":\"more/less/and\",\"graph\":{\"node_uid\":9,\"uid\":344,\"parent_uid\":337,\"open\":true,\"nodes\":[{\"plugin\":\"more_than_modulator\",\"x\":380,\"y\":230,\"uid\":0},{\"plugin\":\"less_than_modulator\",\"x\":378,\"y\":330,\"uid\":1},{\"plugin\":\"and_modulator\",\"x\":516,\"y\":256,\"uid\":2},{\"plugin\":\"input_proxy\",\"x\":287,\"y\":223,\"uid\":3,\"dsid\":26,\"state\":{\"slot_id\":0},\"title\":\"clock\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":285,\"uid\":4,\"dsid\":26,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":418,\"uid\":7,\"dsid\":26,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":612,\"y\":253,\"uid\":8,\"dsid\":26,\"state\":{\"slot_id\":0},\"title\":\"bool\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"a\"},{\"src_nuid\":1,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"b\"},{\"src_nuid\":3,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":4,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":7,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":2,\"dst_nuid\":8,\"src_slot\":\"bool\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":3,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true,\"offset\":1}]},\"dyn_in\":[{\"name\":\"clock\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"is_connected\":true,\"connected\":false},{\"name\":\"constant\",\"dt\":0,\"uid\":1,\"index\":1,\"type\":0,\"is_connected\":true,\"connected\":false},{\"name\":\"constant\",\"dt\":0,\"uid\":3,\"index\":2,\"type\":0,\"is_connected\":true,\"connected\":false}],\"dyn_out\":[{\"name\":\"bool\",\"dt\":7,\"uid\":4,\"index\":0,\"type\":1}]},{\"plugin\":\"graph\",\"x\":562,\"y\":1043,\"uid\":42,\"dsid\":5,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"3\":0,\"4\":1,\"7\":3},\"output_sids\":{\"8\":4}},\"title\":\"more/less/and\",\"graph\":{\"node_uid\":9,\"uid\":345,\"parent_uid\":337,\"open\":true,\"nodes\":[{\"plugin\":\"more_than_modulator\",\"x\":380,\"y\":230,\"uid\":0},{\"plugin\":\"less_than_modulator\",\"x\":378,\"y\":330,\"uid\":1},{\"plugin\":\"and_modulator\",\"x\":516,\"y\":256,\"uid\":2},{\"plugin\":\"input_proxy\",\"x\":287,\"y\":223,\"uid\":3,\"dsid\":27,\"state\":{\"slot_id\":0},\"title\":\"clock\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":242,\"y\":292,\"uid\":4,\"dsid\":27,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":418,\"uid\":7,\"dsid\":27,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":612,\"y\":253,\"uid\":8,\"dsid\":27,\"state\":{\"slot_id\":0},\"title\":\"bool\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"a\"},{\"src_nuid\":1,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"b\"},{\"src_nuid\":3,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":4,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":7,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":2,\"dst_nuid\":8,\"src_slot\":\"bool\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":3,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true,\"offset\":1}]},\"dyn_in\":[{\"name\":\"clock\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"is_connected\":true,\"connected\":false},{\"name\":\"constant\",\"dt\":0,\"uid\":1,\"index\":1,\"type\":0,\"is_connected\":true,\"connected\":false},{\"name\":\"constant\",\"dt\":0,\"uid\":3,\"index\":2,\"type\":0,\"is_connected\":true,\"connected\":false}],\"dyn_out\":[{\"name\":\"bool\",\"dt\":7,\"uid\":4,\"index\":0,\"type\":1}]},{\"plugin\":\"graph\",\"x\":560,\"y\":1180,\"uid\":43,\"dsid\":5,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"3\":0,\"4\":1,\"7\":3},\"output_sids\":{\"8\":4}},\"title\":\"more/less/and\",\"graph\":{\"node_uid\":9,\"uid\":346,\"parent_uid\":337,\"open\":true,\"nodes\":[{\"plugin\":\"more_than_modulator\",\"x\":380,\"y\":230,\"uid\":0},{\"plugin\":\"less_than_modulator\",\"x\":378,\"y\":330,\"uid\":1},{\"plugin\":\"and_modulator\",\"x\":516,\"y\":256,\"uid\":2},{\"plugin\":\"input_proxy\",\"x\":287,\"y\":223,\"uid\":3,\"dsid\":26,\"state\":{\"slot_id\":0},\"title\":\"clock\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":285,\"uid\":4,\"dsid\":26,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":418,\"uid\":7,\"dsid\":26,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":612,\"y\":253,\"uid\":8,\"dsid\":26,\"state\":{\"slot_id\":0},\"title\":\"bool\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"a\"},{\"src_nuid\":1,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"b\"},{\"src_nuid\":3,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":4,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":7,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":2,\"dst_nuid\":8,\"src_slot\":\"bool\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":3,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true,\"offset\":1}]},\"dyn_in\":[{\"name\":\"clock\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"is_connected\":true,\"connected\":false},{\"name\":\"constant\",\"dt\":0,\"uid\":1,\"index\":1,\"type\":0,\"is_connected\":true,\"connected\":false},{\"name\":\"constant\",\"dt\":0,\"uid\":3,\"index\":2,\"type\":0,\"is_connected\":true,\"connected\":false}],\"dyn_out\":[{\"name\":\"bool\",\"dt\":7,\"uid\":4,\"index\":0,\"type\":1}]},{\"plugin\":\"input_proxy\",\"x\":450,\"y\":1031,\"uid\":44,\"dsid\":8,\"state\":{\"slot_id\":0},\"title\":\"Step 6\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":457,\"y\":1163,\"uid\":45,\"dsid\":9,\"state\":{\"slot_id\":0},\"title\":\"Step 7\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":460,\"y\":1293,\"uid\":46,\"dsid\":9,\"state\":{\"slot_id\":0},\"title\":\"Step 8\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":458,\"y\":1396,\"uid\":47,\"dsid\":9,\"state\":{\"slot_id\":0},\"title\":\"Step 9\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":456,\"y\":868,\"uid\":48,\"dsid\":7,\"state\":{\"slot_id\":0},\"title\":\"step 5\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"graph\",\"x\":564,\"y\":1319,\"uid\":49,\"dsid\":5,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"3\":0,\"4\":1,\"7\":3},\"output_sids\":{\"8\":4}},\"title\":\"more/less/and\",\"graph\":{\"node_uid\":9,\"uid\":347,\"parent_uid\":337,\"open\":true,\"nodes\":[{\"plugin\":\"more_than_modulator\",\"x\":380,\"y\":230,\"uid\":0},{\"plugin\":\"less_than_modulator\",\"x\":378,\"y\":330,\"uid\":1},{\"plugin\":\"and_modulator\",\"x\":516,\"y\":256,\"uid\":2},{\"plugin\":\"input_proxy\",\"x\":287,\"y\":223,\"uid\":3,\"dsid\":27,\"state\":{\"slot_id\":0},\"title\":\"clock\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":285,\"uid\":4,\"dsid\":27,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":289,\"y\":418,\"uid\":7,\"dsid\":27,\"state\":{\"slot_id\":0},\"title\":\"constant\",\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":612,\"y\":253,\"uid\":8,\"dsid\":27,\"state\":{\"slot_id\":0},\"title\":\"bool\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"a\"},{\"src_nuid\":1,\"dst_nuid\":2,\"src_slot\":\"bool\",\"dst_slot\":\"b\"},{\"src_nuid\":3,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":4,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":7,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"reference\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":2,\"dst_nuid\":8,\"src_slot\":\"bool\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":3,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"value\",\"src_connected\":true,\"src_dyn\":true,\"offset\":1}]},\"dyn_in\":[{\"name\":\"clock\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"is_connected\":true,\"connected\":false},{\"name\":\"constant\",\"dt\":0,\"uid\":1,\"index\":1,\"type\":0,\"is_connected\":true,\"connected\":false},{\"name\":\"constant\",\"dt\":0,\"uid\":3,\"index\":2,\"type\":0,\"is_connected\":true,\"connected\":false}],\"dyn_out\":[{\"name\":\"bool\",\"dt\":7,\"uid\":4,\"index\":0,\"type\":1}]},{\"plugin\":\"output_proxy\",\"x\":798,\"y\":795,\"uid\":50,\"dsid\":8,\"state\":{\"slot_id\":0},\"title\":\"scene 5\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"desc\":\"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":804,\"y\":915,\"uid\":51,\"dsid\":9,\"state\":{\"slot_id\":0},\"title\":\"scene 6\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"desc\":\"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":806,\"y\":1056,\"uid\":52,\"dsid\":9,\"state\":{\"slot_id\":0},\"title\":\"scene 7\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"desc\":\"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":802,\"y\":1189,\"uid\":53,\"dsid\":10,\"state\":{\"slot_id\":0},\"title\":\"scene 8\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"desc\":\"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":807,\"y\":1330,\"uid\":54,\"dsid\":11,\"state\":{\"slot_id\":0},\"title\":\"scene 9\",\"dyn_in\":[{\"name\":\"input\",\"dt\":7,\"desc\":\"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":6,\"dst_nuid\":9,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":6,\"dst_nuid\":12,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":6,\"dst_nuid\":8,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_dyn\":true,\"offset\":2},{\"src_nuid\":6,\"dst_nuid\":20,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_dyn\":true,\"offset\":3},{\"src_nuid\":21,\"dst_nuid\":6,\"src_slot\":0,\"dst_slot\":\"limit\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":22,\"dst_nuid\":8,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":22,\"dst_nuid\":9,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":23,\"dst_nuid\":9,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":23,\"dst_nuid\":12,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":24,\"dst_nuid\":12,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":24,\"dst_nuid\":20,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":25,\"dst_nuid\":20,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":8,\"dst_nuid\":27,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":9,\"dst_nuid\":28,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":12,\"dst_nuid\":29,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":20,\"dst_nuid\":30,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":6,\"dst_nuid\":31,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true,\"offset\":4},{\"src_nuid\":32,\"dst_nuid\":6,\"src_slot\":0,\"dst_slot\":\"value\",\"src_dyn\":true},{\"src_nuid\":34,\"dst_nuid\":32,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":35,\"dst_nuid\":8,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":6,\"dst_nuid\":40,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_connected\":false,\"dst_dyn\":true,\"offset\":5},{\"src_nuid\":6,\"dst_nuid\":41,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_connected\":false,\"dst_dyn\":true,\"offset\":6},{\"src_nuid\":6,\"dst_nuid\":42,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_connected\":false,\"dst_dyn\":true,\"offset\":7},{\"src_nuid\":6,\"dst_nuid\":43,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_connected\":false,\"dst_dyn\":true,\"offset\":8},{\"src_nuid\":25,\"dst_nuid\":40,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"dst_connected\":false,\"src_dyn\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":48,\"dst_nuid\":40,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"dst_connected\":false,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":48,\"dst_nuid\":41,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"dst_connected\":false,\"src_dyn\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":44,\"dst_nuid\":41,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"dst_connected\":false,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":44,\"dst_nuid\":42,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"dst_connected\":false,\"src_dyn\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":45,\"dst_nuid\":42,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"dst_connected\":false,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":45,\"dst_nuid\":43,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"dst_connected\":false,\"src_dyn\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":46,\"dst_nuid\":43,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"dst_connected\":false,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":46,\"dst_nuid\":49,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"dst_connected\":false,\"src_dyn\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":47,\"dst_nuid\":49,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"dst_connected\":false,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":6,\"dst_nuid\":49,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_connected\":false,\"dst_dyn\":true,\"offset\":9},{\"src_nuid\":40,\"dst_nuid\":50,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":41,\"dst_nuid\":51,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":42,\"dst_nuid\":52,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":43,\"dst_nuid\":53,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":49,\"dst_nuid\":54,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"name\":\"Loop point\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"is_connected\":true},{\"name\":\"Step 1\",\"dt\":0,\"uid\":1,\"index\":1,\"type\":0,\"is_connected\":true},{\"name\":\"Step 2\",\"dt\":0,\"uid\":2,\"index\":2,\"type\":0,\"is_connected\":true},{\"name\":\"Step 3\",\"dt\":0,\"uid\":3,\"index\":3,\"type\":0,\"is_connected\":true},{\"name\":\"Step 4\",\"dt\":0,\"uid\":4,\"index\":4,\"type\":0,\"is_connected\":true},{\"name\":\"speed\",\"dt\":0,\"uid\":11,\"index\":5,\"type\":0,\"is_connected\":true},{\"name\":\"step 0\",\"dt\":0,\"uid\":12,\"index\":6,\"type\":0,\"is_connected\":true},{\"name\":\"Step 6\",\"dt\":0,\"uid\":13,\"index\":7,\"type\":0,\"is_connected\":true},{\"name\":\"Step 7\",\"dt\":0,\"uid\":14,\"index\":8,\"type\":0,\"is_connected\":true},{\"name\":\"Step 8\",\"dt\":0,\"uid\":15,\"index\":9,\"type\":0,\"is_connected\":true},{\"name\":\"Step 9\",\"dt\":0,\"uid\":16,\"index\":10,\"type\":0,\"is_connected\":true},{\"name\":\"step 5\",\"dt\":0,\"uid\":17,\"index\":11,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"scene 1\",\"dt\":7,\"uid\":6,\"index\":0,\"type\":1},{\"name\":\"scene 2\",\"dt\":7,\"uid\":7,\"index\":1,\"type\":1},{\"name\":\"scene 3\",\"dt\":7,\"uid\":8,\"index\":2,\"type\":1},{\"name\":\"scene 4\",\"dt\":7,\"uid\":9,\"index\":3,\"type\":1},{\"name\":\"Time display\",\"dt\":0,\"uid\":10,\"index\":4,\"type\":1},{\"name\":\"scene 5\",\"dt\":7,\"uid\":18,\"index\":5,\"type\":1},{\"name\":\"scene 6\",\"dt\":7,\"uid\":19,\"index\":6,\"type\":1},{\"name\":\"scene 7\",\"dt\":7,\"uid\":20,\"index\":7,\"type\":1},{\"name\":\"scene 8\",\"dt\":7,\"uid\":21,\"index\":8,\"type\":1},{\"name\":\"scene 9\",\"dt\":7,\"uid\":22,\"index\":9,\"type\":1}]},{\"plugin\":\"const_float_generator\",\"x\":94,\"y\":455,\"uid\":61,\"state\":{\"val\":36},\"title\":\"Loop point\"},{\"plugin\":\"const_float_generator\",\"x\":264,\"y\":233,\"uid\":62,\"state\":{\"val\":4},\"title\":\"Step 2 start\"},{\"plugin\":\"const_float_generator\",\"x\":264,\"y\":287,\"uid\":63,\"state\":{\"val\":8},\"title\":\"Step 3 start\"},{\"plugin\":\"const_float_generator\",\"x\":263,\"y\":341,\"uid\":64,\"state\":{\"val\":12},\"title\":\"Step 4 start\"},{\"plugin\":\"const_float_generator\",\"x\":264,\"y\":394,\"uid\":65,\"state\":{\"val\":16},\"title\":\"Step 5 start\"},{\"plugin\":\"float_display\",\"x\":264,\"y\":129,\"uid\":66,\"title\":\"Time display\"},{\"plugin\":\"slider_float_generator\",\"x\":169,\"y\":53,\"uid\":67,\"state\":{\"val\":3.333333333333333,\"min\":0,\"max\":20},\"title\":\"Speed\"},{\"plugin\":\"const_float_generator\",\"x\":264,\"y\":180,\"uid\":68,\"state\":{\"val\":0},\"title\":\"Step 1 start\"},{\"plugin\":\"const_float_generator\",\"x\":264,\"y\":532,\"uid\":71,\"state\":{\"val\":24},\"title\":\"Step 7 start\"},{\"plugin\":\"const_float_generator\",\"x\":265,\"y\":599,\"uid\":72,\"state\":{\"val\":28},\"title\":\"Step 8 start\"},{\"plugin\":\"const_float_generator\",\"x\":270,\"y\":659,\"uid\":73,\"state\":{\"val\":32},\"title\":\"Step 9 start\"},{\"plugin\":\"const_float_generator\",\"x\":273,\"y\":719,\"uid\":74,\"state\":{\"val\":36},\"title\":\"End\"},{\"plugin\":\"const_float_generator\",\"x\":264,\"y\":462,\"uid\":75,\"state\":{\"val\":20},\"title\":\"Step 6 start\"}],\"conns\":[{\"src_nuid\":61,\"dst_nuid\":60,\"src_slot\":\"value\",\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":62,\"dst_nuid\":60,\"src_slot\":\"value\",\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":63,\"dst_nuid\":60,\"src_slot\":\"value\",\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":64,\"dst_nuid\":60,\"src_slot\":\"value\",\"dst_slot\":3,\"dst_dyn\":true},{\"src_nuid\":60,\"dst_nuid\":66,\"src_slot\":4,\"dst_slot\":\"float\",\"src_dyn\":true},{\"src_nuid\":67,\"dst_nuid\":60,\"src_slot\":\"value\",\"dst_slot\":5,\"dst_dyn\":true},{\"src_nuid\":68,\"dst_nuid\":60,\"src_slot\":\"value\",\"dst_slot\":6,\"dst_dyn\":true},{\"src_nuid\":65,\"dst_nuid\":60,\"src_slot\":\"value\",\"dst_slot\":4,\"dst_dyn\":true},{\"src_nuid\":75,\"dst_nuid\":60,\"src_slot\":\"value\",\"dst_slot\":11,\"dst_dyn\":true},{\"src_nuid\":71,\"dst_nuid\":60,\"src_slot\":\"value\",\"dst_slot\":7,\"dst_dyn\":true},{\"src_nuid\":72,\"dst_nuid\":60,\"src_slot\":\"value\",\"dst_slot\":8,\"dst_dyn\":true},{\"src_nuid\":73,\"dst_nuid\":60,\"src_slot\":\"value\",\"dst_slot\":9,\"dst_dyn\":true},{\"src_nuid\":74,\"dst_nuid\":60,\"src_slot\":\"value\",\"dst_slot\":10,\"dst_dyn\":true}]}}"
  },
  {
    "path": "browser/patches/util_accumulator.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 2,\n    \"root\": {\n        \"node_uid\": 1,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 55,\n                \"y\": 56,\n                \"uid\": 0,\n                \"dsid\": 2,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"0\": 0\n                    },\n                    \"output_sids\": {\n                        \"1\": 1\n                    }\n                },\n                \"title\": \"Accumulator\",\n                \"graph\": {\n                    \"node_uid\": 5,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 38,\n                            \"y\": 150,\n                            \"uid\": 0,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"value\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 242,\n                            \"y\": 151,\n                            \"uid\": 1,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"value\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"register_local_read\",\n                            \"x\": 54,\n                            \"y\": 69,\n                            \"uid\": 2,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"state\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"add_modulator\",\n                            \"x\": 132,\n                            \"y\": 104,\n                            \"uid\": 3\n                        },\n                        {\n                            \"plugin\": \"register_local_write\",\n                            \"x\": 241,\n                            \"y\": 73,\n                            \"uid\": 4,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"state\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 8,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        }\n                    ],\n                    \"registers\": [\n                        {\n                            \"id\": \"state\",\n                            \"dt\": 0\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 0,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}\n"
  },
  {
    "path": "browser/patches/util_aspect_ratio.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 2,\n    \"root\": {\n        \"node_uid\": 1,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 9,\n                \"y\": 5,\n                \"uid\": 0,\n                \"dsid\": 1,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {},\n                    \"output_sids\": {\n                        \"5\": 0\n                    }\n                },\n                \"title\": \"Aspect ratio\",\n                \"graph\": {\n                    \"node_uid\": 6,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"scale_matrix\",\n                            \"x\": 394,\n                            \"y\": 19,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 276,\n                            \"y\": 19,\n                            \"uid\": 1\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 10,\n                            \"y\": 6,\n                            \"uid\": 2,\n                            \"state\": {\n                                \"val\": 1\n                            }\n                        },\n                        {\n                            \"plugin\": \"divide_modulator\",\n                            \"x\": 159,\n                            \"y\": 101,\n                            \"uid\": 3\n                        },\n                        {\n                            \"plugin\": \"aspect_ratio_generator\",\n                            \"x\": 9,\n                            \"y\": 72,\n                            \"uid\": 4\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 488,\n                            \"y\": 19,\n                            \"uid\": 5,\n                            \"dsid\": 12,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 4,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"offset\": 2\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_out\": [\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/util_clamped_accumulator.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 2,\n    \"root\": {\n        \"node_uid\": 5,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 36,\n                \"y\": 57,\n                \"uid\": 0,\n                \"dsid\": 4,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"0\": 0,\n                        \"6\": 2,\n                        \"7\": 3\n                    },\n                    \"output_sids\": {\n                        \"1\": 1\n                    }\n                },\n                \"title\": \"Clamped accumulator\",\n                \"graph\": {\n                    \"node_uid\": 8,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 54,\n                            \"y\": 148,\n                            \"uid\": 0,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"value\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 358,\n                            \"y\": 153,\n                            \"uid\": 1,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"value\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"register_local_read\",\n                            \"x\": 70,\n                            \"y\": 67,\n                            \"uid\": 2,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"state\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 0,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"add_modulator\",\n                            \"x\": 148,\n                            \"y\": 102,\n                            \"uid\": 3\n                        },\n                        {\n                            \"plugin\": \"register_local_write\",\n                            \"x\": 360,\n                            \"y\": 86,\n                            \"uid\": 4,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"state\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"value\",\n                                    \"dt\": 8,\n                                    \"desc\": \"\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"clamp_modulator\",\n                            \"x\": 237,\n                            \"y\": 154,\n                            \"uid\": 5\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 55,\n                            \"y\": 213,\n                            \"uid\": 6,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"min\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 134,\n                            \"y\": 268,\n                            \"uid\": 7,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"max\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        }\n                    ],\n                    \"registers\": [\n                        {\n                            \"id\": \"state\",\n                            \"dt\": 0\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 0,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": false\n                    },\n                    {\n                        \"name\": \"min\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 1,\n                        \"type\": 0\n                    },\n                    {\n                        \"name\": \"max\",\n                        \"dt\": 0,\n                        \"uid\": 3,\n                        \"index\": 2,\n                        \"type\": 0\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}\n"
  },
  {
    "path": "browser/patches/util_clone_material_with_new_texture.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 11,\n    \"root\": {\n        \"node_uid\": 85,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"material_clone_modulator\",\n                \"x\": 325,\n                \"y\": 428,\n                \"uid\": 82\n            },\n            {\n                \"plugin\": \"material_texture_modulator\",\n                \"x\": 430,\n                \"y\": 428,\n                \"uid\": 83\n            },\n            {\n                \"plugin\": \"url_texture_generator\",\n                \"x\": 321,\n                \"y\": 481,\n                \"uid\": 84,\n                \"state\": {\n                    \"url\": \"data/textures/\"\n                },\n                \"title\": \"Image\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 82,\n                \"dst_nuid\": 83,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 84,\n                \"dst_nuid\": 83,\n                \"src_slot\": 0,\n                \"dst_slot\": 2\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/util_concatenate_x2.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 1,\n    \"graph_uid\": 2,\n    \"root\": {\n        \"node_uid\": 1,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 10,\n                \"y\": 7,\n                \"uid\": 0,\n                \"dsid\": 4,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"3\": 1,\n                        \"4\": 2,\n                        \"5\": 3\n                    },\n                    \"output_sids\": {\n                        \"2\": 0\n                    }\n                },\n                \"title\": \"Concatenate x2\",\n                \"graph\": {\n                    \"node_uid\": 6,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"concatenate_matrix_modulator\",\n                            \"x\": 274,\n                            \"y\": 13,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"concatenate_matrix_modulator\",\n                            \"x\": 92,\n                            \"y\": 13,\n                            \"uid\": 1\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 394,\n                            \"y\": 13,\n                            \"uid\": 2,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 197,\n                            \"y\": 14,\n                            \"uid\": 3,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 9,\n                            \"y\": 13,\n                            \"uid\": 4,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 9,\n                            \"y\": 71,\n                            \"uid\": 5,\n                            \"dsid\": 2,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 4,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0\n                    },\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 2,\n                        \"index\": 1,\n                        \"type\": 0\n                    },\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 3,\n                        \"index\": 2,\n                        \"type\": 0\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/util_concatenate_x3.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 1,\n    \"graph_uid\": 2,\n    \"root\": {\n        \"node_uid\": 1,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 9,\n                \"y\": 11,\n                \"uid\": 0,\n                \"dsid\": 5,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"4\": 1,\n                        \"5\": 2,\n                        \"6\": 3,\n                        \"7\": 4\n                    },\n                    \"output_sids\": {\n                        \"3\": 0\n                    }\n                },\n                \"title\": \"Concatanate x 3\",\n                \"graph\": {\n                    \"node_uid\": 8,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"concatenate_matrix_modulator\",\n                            \"x\": 341,\n                            \"y\": 9,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"concatenate_matrix_modulator\",\n                            \"x\": 230,\n                            \"y\": 9,\n                            \"uid\": 1\n                        },\n                        {\n                            \"plugin\": \"concatenate_matrix_modulator\",\n                            \"x\": 109,\n                            \"y\": 9,\n                            \"uid\": 2\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 457,\n                            \"y\": 9,\n                            \"uid\": 3,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 4,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 260,\n                            \"y\": 87,\n                            \"uid\": 4,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 4,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 140,\n                            \"y\": 86,\n                            \"uid\": 5,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 4,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 11,\n                            \"y\": 9,\n                            \"uid\": 6,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 4,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 11,\n                            \"y\": 70,\n                            \"uid\": 7,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"matrix\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 4,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0\n                    },\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 2,\n                        \"index\": 1,\n                        \"type\": 0\n                    },\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 3,\n                        \"index\": 2,\n                        \"type\": 0\n                    },\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 4,\n                        \"index\": 3,\n                        \"type\": 0\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"matrix\",\n                        \"dt\": 4,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/util_float_array_sequencer.json",
    "content": "{\n    \"abs_t\": 131.008,\n    \"active_graph\": 0,\n    \"graph_uid\": 3,\n    \"root\": {\n        \"node_uid\": 7,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 490,\n                \"y\": 327,\n                \"uid\": 0,\n                \"dsid\": 7,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {\n                        \"8\": 1,\n                        \"10\": 2\n                    },\n                    \"output_sids\": {\n                        \"18\": 6\n                    }\n                },\n                \"title\": \"Float sequence\",\n                \"graph\": {\n                    \"node_uid\": 19,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 286,\n                            \"y\": 104,\n                            \"uid\": 3,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"input_sids\": {\n                                    \"13\": 1,\n                                    \"15\": 3\n                                },\n                                \"output_sids\": {\n                                    \"12\": 0\n                                }\n                            },\n                            \"title\": \"Oscillate\",\n                            \"graph\": {\n                                \"node_uid\": 26,\n                                \"uid\": 2,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 544,\n                                        \"y\": 40,\n                                        \"uid\": 6\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 637,\n                                        \"y\": 40,\n                                        \"uid\": 12,\n                                        \"dsid\": 12,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"float\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 0,\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 27,\n                                        \"y\": 99,\n                                        \"uid\": 13,\n                                        \"dsid\": 10,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Speed\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 476,\n                                        \"y\": 102,\n                                        \"uid\": 15,\n                                        \"dsid\": 10,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Max\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"delta_t_generator\",\n                                        \"x\": 10,\n                                        \"y\": 41,\n                                        \"uid\": 18\n                                    },\n                                    {\n                                        \"plugin\": \"accumulate_modulator\",\n                                        \"x\": 203,\n                                        \"y\": 41,\n                                        \"uid\": 19,\n                                        \"state\": {\n                                            \"value\": 658.3121200000156\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 110,\n                                        \"y\": 41,\n                                        \"uid\": 20\n                                    },\n                                    {\n                                        \"plugin\": \"sawtooth_modulator\",\n                                        \"x\": 313,\n                                        \"y\": 43,\n                                        \"uid\": 24\n                                    },\n                                    {\n                                        \"plugin\": \"convert_oscilator_unit_modulator\",\n                                        \"x\": 411,\n                                        \"y\": 44,\n                                        \"uid\": 25\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 18,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 20,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 19,\n                                        \"dst_nuid\": 24,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 25,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 6,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"Speed\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Max\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"float\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 10,\n                            \"y\": 40,\n                            \"uid\": 8,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"array\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 17,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 203,\n                            \"y\": 107,\n                            \"uid\": 10,\n                            \"dsid\": 5,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"speed\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"array_length_modulator\",\n                            \"x\": 88,\n                            \"y\": 140,\n                            \"uid\": 12\n                        },\n                        {\n                            \"plugin\": \"subtract_modulator\",\n                            \"x\": 189,\n                            \"y\": 168,\n                            \"uid\": 13\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 66,\n                            \"y\": 208,\n                            \"uid\": 14,\n                            \"state\": {\n                                \"val\": 1\n                            }\n                        },\n                        {\n                            \"plugin\": \"array_get_modulator\",\n                            \"x\": 451,\n                            \"y\": 40,\n                            \"uid\": 15\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 619,\n                            \"y\": 167,\n                            \"uid\": 18,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"float\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"def\": null,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 8,\n                            \"dst_nuid\": 12,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 12,\n                            \"dst_nuid\": 13,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 13,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 8,\n                            \"dst_nuid\": 15,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 15,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 18,\n                            \"src_slot\": 1,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"array\",\n                        \"dt\": 17,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"speed\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"float\",\n                        \"dt\": 0,\n                        \"uid\": 6,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"float_display\",\n                \"x\": 665,\n                \"y\": 328,\n                \"uid\": 1\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 289,\n                \"y\": 409,\n                \"uid\": 2,\n                \"state\": {\n                    \"val\": 0.5,\n                    \"min\": 0,\n                    \"max\": 1\n                },\n                \"title\": \"speed\"\n            },\n            {\n                \"plugin\": \"text_editor_generator\",\n                \"x\": 119,\n                \"y\": 334,\n                \"uid\": 3,\n                \"state\": {\n                    \"text\": \"{\\n    \\\"data\\\": [10, 20, 30, 40, 50, 60, 70, 80]\\n}\"\n                }\n            },\n            {\n                \"plugin\": \"parse_json_modulator\",\n                \"x\": 228,\n                \"y\": 333,\n                \"uid\": 4\n            },\n            {\n                \"plugin\": \"member_to_typed_array_modulator\",\n                \"x\": 326,\n                \"y\": 333,\n                \"uid\": 5,\n                \"state\": {\n                    \"datatype\": 6\n                }\n            },\n            {\n                \"plugin\": \"label_generator\",\n                \"x\": 179,\n                \"y\": 389,\n                \"uid\": 6,\n                \"state\": {\n                    \"text\": \"data\"\n                }\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 2,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 3,\n                \"dst_nuid\": 4,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 6,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 0,\n                \"dst_nuid\": 1,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"src_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/util_float_array_sequencer_oscillator_out.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 3,\n    \"root\": {\n        \"node_uid\": 12,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 804,\n                \"y\": 150,\n                \"uid\": 0,\n                \"dsid\": 6,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {\n                        \"13\": 4,\n                        \"14\": 5\n                    },\n                    \"output_sids\": {\n                        \"7\": 0\n                    }\n                },\n                \"title\": \"Float sequence\",\n                \"graph\": {\n                    \"node_uid\": 16,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 208,\n                            \"y\": 40,\n                            \"uid\": 7,\n                            \"dsid\": 6,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"float sequence\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 11,\n                            \"y\": 113,\n                            \"uid\": 13,\n                            \"dsid\": 3,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"index\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 10,\n                            \"y\": 40,\n                            \"uid\": 14,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"array\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 17,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"array_get_modulator\",\n                            \"x\": 111,\n                            \"y\": 40,\n                            \"uid\": 15\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 14,\n                            \"dst_nuid\": 15,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 15,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"index\",\n                        \"dt\": 0,\n                        \"uid\": 4,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"array\",\n                        \"dt\": 17,\n                        \"uid\": 5,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"float sequence\",\n                        \"dt\": 0,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 641,\n                \"y\": 71,\n                \"uid\": 2,\n                \"dsid\": 5,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {\n                        \"13\": 1,\n                        \"15\": 3\n                    },\n                    \"output_sids\": {\n                        \"12\": 0\n                    }\n                },\n                \"title\": \"Oscillate\",\n                \"graph\": {\n                    \"node_uid\": 26,\n                    \"uid\": 2,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 542,\n                            \"y\": 43,\n                            \"uid\": 6\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 634,\n                            \"y\": 44,\n                            \"uid\": 12,\n                            \"dsid\": 14,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"index\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 27,\n                            \"y\": 99,\n                            \"uid\": 13,\n                            \"dsid\": 12,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Speed\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 476,\n                            \"y\": 121,\n                            \"uid\": 15,\n                            \"dsid\": 12,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Max\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"delta_t_generator\",\n                            \"x\": 10,\n                            \"y\": 41,\n                            \"uid\": 18\n                        },\n                        {\n                            \"plugin\": \"accumulate_modulator\",\n                            \"x\": 203,\n                            \"y\": 41,\n                            \"uid\": 19,\n                            \"state\": {\n                                \"value\": 636.8627766664778\n                            }\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 110,\n                            \"y\": 41,\n                            \"uid\": 20\n                        },\n                        {\n                            \"plugin\": \"sawtooth_modulator\",\n                            \"x\": 313,\n                            \"y\": 43,\n                            \"uid\": 24\n                        },\n                        {\n                            \"plugin\": \"convert_oscilator_unit_modulator\",\n                            \"x\": 411,\n                            \"y\": 44,\n                            \"uid\": 25\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 18,\n                            \"dst_nuid\": 20,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 20,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 20,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 24,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 25,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 12,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Speed\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Max\",\n                        \"dt\": 0,\n                        \"uid\": 3,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"index\",\n                        \"dt\": 0,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 429,\n                \"y\": 26,\n                \"uid\": 5,\n                \"state\": {\n                    \"val\": 5,\n                    \"min\": \"0\",\n                    \"max\": \"10\"\n                }\n            },\n            {\n                \"plugin\": \"text_editor_generator\",\n                \"x\": 28,\n                \"y\": 58,\n                \"uid\": 6,\n                \"state\": {\n                    \"text\": \"{\\n    \\\"data\\\": [10, 20, 30, 40, 50, 60, 70, 80]\\n}\"\n                }\n            },\n            {\n                \"plugin\": \"parse_json_modulator\",\n                \"x\": 136,\n                \"y\": 58,\n                \"uid\": 7\n            },\n            {\n                \"plugin\": \"member_to_typed_array_modulator\",\n                \"x\": 247,\n                \"y\": 58,\n                \"uid\": 8,\n                \"state\": {\n                    \"datatype\": 6\n                }\n            },\n            {\n                \"plugin\": \"label_generator\",\n                \"x\": 132,\n                \"y\": 116,\n                \"uid\": 9,\n                \"state\": {\n                    \"text\": \"data\"\n                }\n            },\n            {\n                \"plugin\": \"array_length_modulator\",\n                \"x\": 429,\n                \"y\": 111,\n                \"uid\": 10\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 2,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 2,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 6,\n                \"dst_nuid\": 7,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 7,\n                \"dst_nuid\": 8,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 9,\n                \"dst_nuid\": 8,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 8,\n                \"dst_nuid\": 10,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 10,\n                \"dst_nuid\": 2,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 8,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true,\n                \"offset\": 1\n            }\n        ]\n    }\n}\n"
  },
  {
    "path": "browser/patches/util_float_array_sequencer_with_interpolation.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 4,\n    \"root\": {\n        \"node_uid\": 37,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 383,\n                \"y\": 263,\n                \"uid\": 2,\n                \"state\": {\n                    \"val\": 0.15,\n                    \"min\": 0,\n                    \"max\": 1\n                },\n                \"title\": \"speed\"\n            },\n            {\n                \"plugin\": \"text_editor_generator\",\n                \"x\": 27,\n                \"y\": 40,\n                \"uid\": 4,\n                \"state\": {\n                    \"text\": \"{\\n    \\\"data\\\": [1.35, 1.35, 3.65, 3.65, 3.65]\\n}\"\n                }\n            },\n            {\n                \"plugin\": \"parse_json_modulator\",\n                \"x\": 135,\n                \"y\": 40,\n                \"uid\": 5\n            },\n            {\n                \"plugin\": \"member_to_typed_array_modulator\",\n                \"x\": 245,\n                \"y\": 40,\n                \"uid\": 6,\n                \"state\": {\n                    \"datatype\": 6\n                }\n            },\n            {\n                \"plugin\": \"label_generator\",\n                \"x\": 127,\n                \"y\": 103,\n                \"uid\": 7,\n                \"state\": {\n                    \"text\": \"data\"\n                }\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 617,\n                \"y\": 243,\n                \"uid\": 9,\n                \"dsid\": 5,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"input_sids\": {\n                        \"13\": 1,\n                        \"15\": 3\n                    },\n                    \"output_sids\": {\n                        \"12\": 0\n                    }\n                },\n                \"title\": \"Oscillate\",\n                \"graph\": {\n                    \"node_uid\": 26,\n                    \"uid\": 3,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 537,\n                            \"y\": 40,\n                            \"uid\": 6\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 629,\n                            \"y\": 40,\n                            \"uid\": 12,\n                            \"dsid\": 17,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"index\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 27,\n                            \"y\": 99,\n                            \"uid\": 13,\n                            \"dsid\": 15,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Speed\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 468,\n                            \"y\": 118,\n                            \"uid\": 15,\n                            \"dsid\": 15,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Max\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"delta_t_generator\",\n                            \"x\": 10,\n                            \"y\": 41,\n                            \"uid\": 18\n                        },\n                        {\n                            \"plugin\": \"accumulate_modulator\",\n                            \"x\": 203,\n                            \"y\": 41,\n                            \"uid\": 19,\n                            \"state\": {\n                                \"value\": 3167.548350004012\n                            }\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 110,\n                            \"y\": 41,\n                            \"uid\": 20\n                        },\n                        {\n                            \"plugin\": \"sawtooth_modulator\",\n                            \"x\": 308,\n                            \"y\": 41,\n                            \"uid\": 24\n                        },\n                        {\n                            \"plugin\": \"convert_oscilator_unit_modulator\",\n                            \"x\": 408,\n                            \"y\": 40,\n                            \"uid\": 25\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 18,\n                            \"dst_nuid\": 20,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 20,\n                            \"dst_nuid\": 19,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 13,\n                            \"dst_nuid\": 20,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 19,\n                            \"dst_nuid\": 24,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 25,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 6,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 12,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"Speed\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true,\n                        \"connected\": false\n                    },\n                    {\n                        \"name\": \"Max\",\n                        \"dt\": 0,\n                        \"uid\": 3,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true,\n                        \"connected\": false\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"index\",\n                        \"dt\": 0,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"array_length_modulator\",\n                \"x\": 433,\n                \"y\": 48,\n                \"uid\": 11\n            },\n            {\n                \"plugin\": \"subtract_modulator\",\n                \"x\": 521,\n                \"y\": 120,\n                \"uid\": 12\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 383,\n                \"y\": 183,\n                \"uid\": 13,\n                \"state\": {\n                    \"val\": 1\n                },\n                \"title\": \"one\"\n            },\n            {\n                \"plugin\": \"floor_modulator\",\n                \"x\": 768,\n                \"y\": 306,\n                \"uid\": 15\n            },\n            {\n                \"plugin\": \"subtract_modulator\",\n                \"x\": 868,\n                \"y\": 242,\n                \"uid\": 16\n            },\n            {\n                \"plugin\": \"add_modulator\",\n                \"x\": 871,\n                \"y\": 330,\n                \"uid\": 17\n            },\n            {\n                \"plugin\": \"min_modulator\",\n                \"x\": 971,\n                \"y\": 357,\n                \"uid\": 18\n            },\n            {\n                \"plugin\": \"subtract_modulator\",\n                \"x\": 1145,\n                \"y\": 72,\n                \"uid\": 19\n            },\n            {\n                \"plugin\": \"multiply_modulator\",\n                \"x\": 963,\n                \"y\": 180,\n                \"uid\": 20\n            },\n            {\n                \"plugin\": \"pi_generator\",\n                \"x\": 904,\n                \"y\": 165,\n                \"uid\": 21\n            },\n            {\n                \"plugin\": \"cos_modulator\",\n                \"x\": 1056,\n                \"y\": 180,\n                \"uid\": 22\n            },\n            {\n                \"plugin\": \"multiply_modulator\",\n                \"x\": 1242,\n                \"y\": 228,\n                \"uid\": 23\n            },\n            {\n                \"plugin\": \"const_float_generator\",\n                \"x\": 1126,\n                \"y\": 279,\n                \"uid\": 24,\n                \"state\": {\n                    \"val\": 0.5\n                }\n            },\n            {\n                \"plugin\": \"array_get_modulator\",\n                \"x\": 1268,\n                \"y\": 8,\n                \"uid\": 25\n            },\n            {\n                \"plugin\": \"array_get_modulator\",\n                \"x\": 1057,\n                \"y\": 399,\n                \"uid\": 26\n            },\n            {\n                \"plugin\": \"subtract_modulator\",\n                \"x\": 1345,\n                \"y\": 113,\n                \"uid\": 27\n            },\n            {\n                \"plugin\": \"multiply_modulator\",\n                \"x\": 1440,\n                \"y\": 61,\n                \"uid\": 28\n            },\n            {\n                \"plugin\": \"multiply_modulator\",\n                \"x\": 1259,\n                \"y\": 314,\n                \"uid\": 29\n            },\n            {\n                \"plugin\": \"add_modulator\",\n                \"x\": 1534,\n                \"y\": 185,\n                \"uid\": 30\n            },\n            {\n                \"plugin\": \"float_display\",\n                \"x\": 1624,\n                \"y\": 185,\n                \"uid\": 35\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 5,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 6,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 7,\n                \"dst_nuid\": 6,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 6,\n                \"dst_nuid\": 11,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 11,\n                \"dst_nuid\": 12,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 13,\n                \"dst_nuid\": 12,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 12,\n                \"dst_nuid\": 9,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_connected\": false,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 2,\n                \"dst_nuid\": 9,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_connected\": false,\n                \"dst_dyn\": true,\n                \"offset\": 1\n            },\n            {\n                \"src_nuid\": 9,\n                \"dst_nuid\": 15,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"src_dyn\": true\n            },\n            {\n                \"src_nuid\": 9,\n                \"dst_nuid\": 16,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"src_dyn\": true,\n                \"offset\": 1\n            },\n            {\n                \"src_nuid\": 15,\n                \"dst_nuid\": 16,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 15,\n                \"dst_nuid\": 17,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"offset\": 1\n            },\n            {\n                \"src_nuid\": 13,\n                \"dst_nuid\": 17,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"offset\": 1\n            },\n            {\n                \"src_nuid\": 17,\n                \"dst_nuid\": 18,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 12,\n                \"dst_nuid\": 18,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"offset\": 1\n            },\n            {\n                \"src_nuid\": 13,\n                \"dst_nuid\": 19,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"offset\": 2\n            },\n            {\n                \"src_nuid\": 16,\n                \"dst_nuid\": 20,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 21,\n                \"dst_nuid\": 20,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 20,\n                \"dst_nuid\": 22,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 22,\n                \"dst_nuid\": 19,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 19,\n                \"dst_nuid\": 23,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 24,\n                \"dst_nuid\": 23,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 15,\n                \"dst_nuid\": 25,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"offset\": 2\n            },\n            {\n                \"src_nuid\": 6,\n                \"dst_nuid\": 25,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"offset\": 1\n            },\n            {\n                \"src_nuid\": 6,\n                \"dst_nuid\": 26,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"offset\": 2\n            },\n            {\n                \"src_nuid\": 18,\n                \"dst_nuid\": 26,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 23,\n                \"dst_nuid\": 27,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 13,\n                \"dst_nuid\": 27,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"offset\": 3\n            },\n            {\n                \"src_nuid\": 27,\n                \"dst_nuid\": 28,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 25,\n                \"dst_nuid\": 28,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 26,\n                \"dst_nuid\": 29,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 16,\n                \"dst_nuid\": 29,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"offset\": 1\n            },\n            {\n                \"src_nuid\": 28,\n                \"dst_nuid\": 30,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 29,\n                \"dst_nuid\": 30,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 30,\n                \"dst_nuid\": 35,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            }\n        ]\n    }\n}\n"
  },
  {
    "path": "browser/patches/util_get_mesh_from_scene.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 2,\n    \"root\": {\n        \"node_uid\": 1,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 470,\n                \"y\": 310,\n                \"uid\": 0,\n                \"dsid\": 1,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {},\n                    \"output_sids\": {\n                        \"7\": 0\n                    }\n                },\n                \"title\": \"Get mesh\",\n                \"graph\": {\n                    \"node_uid\": 8,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"url_scene_generator\",\n                            \"x\": 122,\n                            \"y\": 46,\n                            \"uid\": 0,\n                            \"state\": {\n                               \"url\": \"/data/scene/ladybug/scene.json\"\n                            }\n                        },\n                        {\n                            \"plugin\": \"scene_get_mesh_count\",\n                            \"x\": 227,\n                            \"y\": 268,\n                            \"uid\": 1\n                        },\n                        {\n                            \"plugin\": \"subtract_modulator\",\n                            \"x\": 362,\n                            \"y\": 287,\n                            \"uid\": 2\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 235,\n                            \"y\": 333,\n                            \"uid\": 3,\n                            \"state\": {\n                                \"val\": 1\n                            }\n                        },\n                        {\n                            \"plugin\": \"scene_get_mesh_by_index\",\n                            \"x\": 550,\n                            \"y\": 134,\n                            \"uid\": 4\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 462,\n                            \"y\": 225,\n                            \"uid\": 5\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 93,\n                            \"y\": 181,\n                            \"uid\": 6,\n                            \"state\": {\n                                \"val\": 3.4,\n                                \"min\": 0,\n                                \"max\": 5\n                            },\n                            \"title\": \"Select mesh\"\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 703,\n                            \"y\": 132,\n                            \"uid\": 7,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"mesh\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 9,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 1,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 1,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 2,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 6,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_out\": [\n                    {\n                        \"name\": \"mesh\",\n                        \"dt\": 9,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/util_knob_with_min_max.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 1,\n    \"graph_uid\": 2,\n    \"root\": {\n        \"node_uid\": 2,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 98,\n                \"y\": 7,\n                \"uid\": 0,\n                \"dsid\": 3,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"9\": 0\n                    },\n                    \"output_sids\": {\n                        \"12\": 2\n                    }\n                },\n                \"title\": \"min max calc\",\n                \"graph\": {\n                    \"node_uid\": 13,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 27,\n                            \"y\": 190,\n                            \"uid\": 2,\n                            \"state\": {\n                                \"val\": -10\n                            },\n                            \"title\": \"Maximum\"\n                        },\n                        {\n                            \"plugin\": \"subtract_modulator\",\n                            \"x\": 144,\n                            \"y\": 65,\n                            \"uid\": 3\n                        },\n                        {\n                            \"plugin\": \"absolute_modulator\",\n                            \"x\": 232,\n                            \"y\": 65,\n                            \"uid\": 4\n                        },\n                        {\n                            \"plugin\": \"multiply_modulator\",\n                            \"x\": 319,\n                            \"y\": 45,\n                            \"uid\": 5\n                        },\n                        {\n                            \"plugin\": \"add_modulator\",\n                            \"x\": 401,\n                            \"y\": 122,\n                            \"uid\": 7\n                        },\n                        {\n                            \"plugin\": \"min_modulator\",\n                            \"x\": 143,\n                            \"y\": 142,\n                            \"uid\": 8\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 248,\n                            \"y\": 9,\n                            \"uid\": 9,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"value\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 10,\n                            \"y\": 85,\n                            \"uid\": 11,\n                            \"state\": {\n                                \"val\": 10\n                            },\n                            \"title\": \"Minimum\"\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 486,\n                            \"y\": 122,\n                            \"uid\": 12,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"value\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 2,\n                            \"dst_nuid\": 8,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 3,\n                            \"dst_nuid\": 4,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 8,\n                            \"dst_nuid\": 7,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 9,\n                            \"dst_nuid\": 5,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 11,\n                            \"dst_nuid\": 8,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 7,\n                            \"dst_nuid\": 12,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 0,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"value\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 8,\n                \"y\": 7,\n                \"uid\": 1,\n                \"state\": {\n                    \"val\": 0\n                }\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 1,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/util_random_with_speed.json",
    "content": "{\"abs_t\":166.41,\"active_graph\":0,\"graph_uid\":2,\"root\":{\"node_uid\":27,\"uid\":0,\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":451,\"y\":230,\"uid\":21,\"dsid\":7,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"rt_filter\":9729,\"input_sids\":{\"18\":0,\"23\":5,\"24\":6},\"output_sids\":{\"21\":3,\"22\":4}},\"title\":\"Random with speed\",\"graph\":{\"node_uid\":25,\"uid\":1,\"parent_uid\":0,\"open\":true,\"nodes\":[{\"plugin\":\"delta_t_generator\",\"x\":239,\"y\":280,\"uid\":0},{\"plugin\":\"add_modulator\",\"x\":341,\"y\":304,\"uid\":1},{\"plugin\":\"register_local_read\",\"x\":246,\"y\":355,\"uid\":2,\"dsid\":1,\"state\":{\"slot_id\":0},\"title\":\"acc_time\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"desc\":\"\",\"uid\":0,\"index\":0,\"type\":1}]},{\"plugin\":\"if_else_modulator\",\"x\":547,\"y\":379,\"uid\":3},{\"plugin\":\"more_than_modulator\",\"x\":441,\"y\":342,\"uid\":4},{\"plugin\":\"const_float_generator\",\"x\":216,\"y\":455,\"uid\":5,\"state\":{\"val\":1}},{\"plugin\":\"divide_modulator\",\"x\":325,\"y\":479,\"uid\":7},{\"plugin\":\"subtract_modulator\",\"x\":451,\"y\":471,\"uid\":8},{\"plugin\":\"register_local_write\",\"x\":671,\"y\":379,\"uid\":9,\"dsid\":1,\"state\":{\"slot_id\":0},\"title\":\"acc_time\",\"dyn_in\":[{\"name\":\"value\",\"dt\":8,\"desc\":\"\",\"uid\":0,\"index\":0,\"type\":0,\"is_connected\":true}]},{\"plugin\":\"if_else_modulator\",\"x\":604,\"y\":559,\"uid\":10},{\"plugin\":\"random_float_generator\",\"x\":486,\"y\":603,\"uid\":11},{\"plugin\":\"register_local_write\",\"x\":874,\"y\":659,\"uid\":12,\"dsid\":1,\"state\":{\"slot_id\":0},\"title\":\"random_val\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"desc\":\"\",\"uid\":0,\"index\":0,\"type\":0,\"is_connected\":true}]},{\"plugin\":\"register_local_read\",\"x\":487,\"y\":700,\"uid\":13,\"dsid\":1,\"state\":{\"slot_id\":0},\"title\":\"random_val\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"desc\":\"\",\"uid\":0,\"index\":0,\"type\":1}]},{\"plugin\":\"float_display\",\"x\":1057,\"y\":479,\"uid\":14},{\"plugin\":\"round_modulator\",\"x\":789,\"y\":549,\"uid\":17},{\"plugin\":\"input_proxy\",\"x\":122,\"y\":597,\"uid\":18,\"dsid\":1,\"state\":{\"slot_id\":0},\"title\":\"FPS\",\"dyn_out\":[{\"name\":\"input\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":1006,\"y\":561,\"uid\":21,\"dsid\":1,\"state\":{\"slot_id\":0},\"title\":\"integer\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\"def\":null,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":1020,\"y\":677,\"uid\":22,\"dsid\":1,\"state\":{\"slot_id\":0},\"title\":\"float\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"desc\":\"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\"def\":null,\"uid\":0,\"index\":0,\"type\":0,\"connected\":true,\"is_connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":203,\"y\":693,\"uid\":23,\"dsid\":1,\"state\":{\"slot_id\":0},\"title\":\"Random min\",\"dyn_out\":[{\"name\":\"input\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":275,\"y\":760,\"uid\":24,\"dsid\":1,\"state\":{\"slot_id\":0},\"title\":\"Random max\",\"dyn_out\":[{\"name\":\"input\",\"dt\":0,\"desc\":\"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\"uid\":0,\"index\":0,\"type\":1,\"connected\":true}]}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":1,\"src_slot\":\"seconds\",\"dst_slot\":\"a\"},{\"src_nuid\":2,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":\"b\",\"src_dyn\":true},{\"src_nuid\":1,\"dst_nuid\":4,\"src_slot\":\"result\",\"dst_slot\":\"value\"},{\"src_nuid\":1,\"dst_nuid\":8,\"src_slot\":\"result\",\"dst_slot\":\"a\",\"offset\":1},{\"src_nuid\":1,\"dst_nuid\":3,\"src_slot\":\"result\",\"dst_slot\":\"false value\",\"offset\":2},{\"src_nuid\":4,\"dst_nuid\":3,\"src_slot\":\"bool\",\"dst_slot\":\"condition\"},{\"src_nuid\":8,\"dst_nuid\":3,\"src_slot\":\"result\",\"dst_slot\":\"true value\"},{\"src_nuid\":3,\"dst_nuid\":9,\"src_slot\":\"value\",\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":7,\"dst_nuid\":4,\"src_slot\":\"result\",\"dst_slot\":\"reference\"},{\"src_nuid\":4,\"dst_nuid\":10,\"src_slot\":\"bool\",\"dst_slot\":\"condition\",\"offset\":1},{\"src_nuid\":5,\"dst_nuid\":7,\"src_slot\":\"value\",\"dst_slot\":\"value\"},{\"src_nuid\":7,\"dst_nuid\":8,\"src_slot\":\"result\",\"dst_slot\":\"b\",\"offset\":1},{\"src_nuid\":11,\"dst_nuid\":10,\"src_slot\":\"value\",\"dst_slot\":\"true value\"},{\"src_nuid\":13,\"dst_nuid\":10,\"src_slot\":0,\"dst_slot\":\"false value\",\"src_dyn\":true},{\"src_nuid\":10,\"dst_nuid\":12,\"src_slot\":\"value\",\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":10,\"dst_nuid\":17,\"src_slot\":\"value\",\"dst_slot\":\"value\",\"offset\":1},{\"src_nuid\":17,\"dst_nuid\":14,\"src_slot\":\"result\",\"dst_slot\":\"float\"},{\"src_nuid\":18,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":\"scalar\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":17,\"dst_nuid\":21,\"src_slot\":\"result\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true,\"offset\":1},{\"src_nuid\":10,\"dst_nuid\":22,\"src_slot\":\"value\",\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true,\"offset\":2},{\"src_nuid\":23,\"dst_nuid\":11,\"src_slot\":0,\"dst_slot\":\"min\",\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":24,\"dst_nuid\":11,\"src_slot\":0,\"dst_slot\":\"max\",\"src_connected\":true,\"src_dyn\":true}],\"registers\":[{\"id\":\"acc_time\",\"dt\":8},{\"id\":\"random_val\",\"dt\":8}]},\"dyn_in\":[{\"name\":\"FPS\",\"dt\":0,\"uid\":0,\"index\":0,\"type\":0,\"is_connected\":true},{\"name\":\"Random min\",\"dt\":0,\"uid\":5,\"index\":1,\"type\":0,\"is_connected\":true},{\"name\":\"Random max\",\"dt\":0,\"uid\":6,\"index\":2,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"integer\",\"dt\":0,\"uid\":3,\"index\":0,\"type\":1},{\"name\":\"float\",\"dt\":0,\"uid\":4,\"index\":1,\"type\":1}]},{\"plugin\":\"const_float_generator\",\"x\":324,\"y\":253,\"uid\":22,\"state\":{\"val\":10},\"title\":\"FPS (speed)\"},{\"plugin\":\"const_float_generator\",\"x\":323,\"y\":309,\"uid\":23,\"state\":{\"val\":1},\"title\":\"Min\"},{\"plugin\":\"const_float_generator\",\"x\":324,\"y\":368,\"uid\":24,\"state\":{\"val\":8},\"title\":\"Max\"}],\"conns\":[{\"src_nuid\":22,\"dst_nuid\":21,\"src_slot\":\"value\",\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":23,\"dst_nuid\":21,\"src_slot\":\"value\",\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":24,\"dst_nuid\":21,\"src_slot\":\"value\",\"dst_slot\":2,\"dst_dyn\":true}],\"registers\":[{\"id\":\"acc_time\",\"dt\":0},{\"id\":\"random_val\",\"dt\":0},{\"id\":\"random_value\",\"dt\":8}]}}"
  },
  {
    "path": "browser/patches/uv_offset.json",
    "content": "{\n    \"abs_t\": 169.341,\n    \"active_graph\": 0,\n    \"graph_uid\": 4,\n    \"root\": {\n        \"node_uid\": 6,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 487,\n                \"y\": 259,\n                \"uid\": 2,\n                \"dsid\": 3,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"4\": 1,\n                        \"5\": 2\n                    },\n                    \"output_sids\": {\n                        \"3\": 0\n                    }\n                },\n                \"title\": \"UV Offset\",\n                \"graph\": {\n                    \"node_uid\": 6,\n                    \"uid\": 3,\n                    \"parent_uid\": 0,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 387,\n                            \"y\": 149,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 610,\n                            \"y\": 210,\n                            \"uid\": 3,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"vector\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 5,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 282,\n                            \"y\": 131,\n                            \"uid\": 4,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"X offset\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 284,\n                            \"y\": 191,\n                            \"uid\": 5,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"Y offset\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 5,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"X offset\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"name\": \"Y offset\",\n                        \"dt\": 0,\n                        \"uid\": 2,\n                        \"index\": 1,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"vector\",\n                        \"dt\": 5,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 290,\n                \"y\": 259,\n                \"uid\": 4,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": 0,\n                    \"max\": 1\n                },\n                \"title\": \"X offset\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 291,\n                \"y\": 323,\n                \"uid\": 5,\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": 0,\n                    \"max\": 1\n                },\n                \"title\": \"Y offset\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 2,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 2,\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/uv_scale.json",
    "content": "{\n    \"abs_t\": 258.268,\n    \"active_graph\": 0,\n    \"graph_uid\": 4,\n    \"root\": {\n        \"node_uid\": 6,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 497,\n                \"y\": 245,\n                \"uid\": 2,\n                \"dsid\": 3,\n                \"state\": {\n                    \"enabled\": true,\n                    \"input_sids\": {\n                        \"4\": 1\n                    },\n                    \"output_sids\": {\n                        \"3\": 0\n                    }\n                },\n                \"title\": \"UV Scale\",\n                \"graph\": {\n                    \"node_uid\": 6,\n                    \"uid\": 3,\n                    \"parent_uid\": 0,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 387,\n                            \"y\": 149,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 610,\n                            \"y\": 210,\n                            \"uid\": 3,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"vector\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 5,\n                                    \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"connected\": true,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 282,\n                            \"y\": 131,\n                            \"uid\": 4,\n                            \"dsid\": 1,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"uv scale\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 0,\n                            \"dst_nuid\": 3,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 4,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"offset\": 1\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"uv scale\",\n                        \"dt\": 0,\n                        \"uid\": 1,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"vector\",\n                        \"dt\": 5,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 1\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 290,\n                \"y\": 259,\n                \"uid\": 4,\n                \"state\": {\n                    \"val\": 1,\n                    \"min\": 0,\n                    \"max\": 1\n                },\n                \"title\": \"UV scale\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 2,\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/video_video_player.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 1,\n    \"root\": {\n        \"node_uid\": 6,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"video_player\",\n                \"x\": 421,\n                \"y\": 226,\n                \"uid\": 0\n            },\n            {\n                \"plugin\": \"toggle_button\",\n                \"x\": 269,\n                \"y\": 277,\n                \"uid\": 1,\n                \"state\": {\n                    \"enabled\": true\n                },\n                \"title\": \"Play\"\n            },\n            {\n                \"plugin\": \"url_video_generator\",\n                \"x\": 269,\n                \"y\": 218,\n                \"uid\": 2,\n                \"state\": {\n                    \"url\": \"data/video/helicopter_la.ogv\"\n                }\n            },\n            {\n                \"plugin\": \"knob_float_generator\",\n                \"x\": 301,\n                \"y\": 400,\n                \"uid\": 4,\n                \"state\": {\n                    \"val\": 0.47\n                }\n            },\n            {\n                \"plugin\": \"toggle_button\",\n                \"x\": 270,\n                \"y\": 338,\n                \"uid\": 5,\n                \"state\": {\n                    \"enabled\": false\n                },\n                \"title\": \"Mute\"\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": 1,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 1\n            },\n            {\n                \"src_nuid\": 2,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 0\n            },\n            {\n                \"src_nuid\": 4,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 3\n            },\n            {\n                \"src_nuid\": 5,\n                \"dst_nuid\": 0,\n                \"src_slot\": 0,\n                \"dst_slot\": 2\n            }\n        ]\n    }\n}"
  },
  {
    "path": "browser/patches/vive-hands.json",
    "content": "{\"nodes\":[{\"plugin\":\"graph\",\"x\":325,\"y\":63,\"uid\":\"kknZXAvU7D9s\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"dvXtpavBFd28\":\"HdZG8u7tn4da\",\"kV8Zk8UnHm2u\":\"YYy8gFcf6BNz\",\"3544qUK5LkxS\":\"wSgmRdx643NP\",\"9zUgLb8sy9bH\":\"m8Q7AeWphBZA\",\"mdWvswufmMvD\":\"Tzz5AjwEvyp8\",\"Kqy6GD6BCNMZ\":\"fwQbGG75FamP\",\"mfwwrFgTXMEW\":\"9aAx3ggtXRDu\",\"SpetuBr6qKff\":\"JZAeaY663NSf\",\"CCcfRF8HTxQW\":\"wRnwZkmxQ2hX\",\"L9tGhMRjWKhd\":\"YkvN8q8pgwzp\",\"yyNxk6qStVYB\":\"3P4Lbg4dCFmB\",\"nLecEQ8DSQU6\":\"LYkndZNVst63\",\"S4WwcNutHK2F\":\"R6m8Lu5Tsk3x\",\"MBggYrXtHUxW\":\"Ca9KhGVPh74S\",\"GhUQyw6N7Rys\":\"tZD4aVqpE8HA\",\"MsPwFZxNMgmf\":\"p79EMRwXUV9n\"}},\"title\":\"Vive controllers\",\"graph\":{\"uid\":\"k7RqVAFXV6YB\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"vive_controller\",\"x\":227,\"y\":177,\"uid\":\"823nszbmDuwn\"},{\"plugin\":\"vive_controller\",\"x\":225,\"y\":680,\"uid\":\"QErpNfg3sEeg\"},{\"plugin\":\"const_float_generator\",\"x\":60,\"y\":681,\"uid\":\"jYx96JCfJxBC\",\"state\":{\"val\":1},\"title\":\"Hand 1\"},{\"plugin\":\"const_float_generator\",\"x\":62,\"y\":167,\"uid\":\"4WDRYzPeRyer\",\"state\":{\"val\":0},\"title\":\"Hand 0\"},{\"plugin\":\"graph\",\"x\":745,\"y\":505,\"uid\":\"dsheftXSF4cy\",\"state\":{\"always_update\":true,\"input_sids\":{\"pGLyWtRrY3W7\":\"YcwHBd87r7TB\",\"qdnJH2mMH9Ad\":\"6PBvFEnPszAB\"},\"output_sids\":{\"cbqJmWWfSeKJ\":\"mh0rTKkFm0nD\"}},\"title\":\"Vive controller\",\"graph\":{\"uid\":\"QF2F9MdaqCmq\",\"parent_uid\":\"k7RqVAFXV6YB\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1053,\"y\":281,\"uid\":\"9wp7gJaRFMnE\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1200,\"y\":283,\"uid\":\"cbqJmWWfSeKJ\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_material_phong\",\"x\":437,\"y\":327,\"uid\":\"3S8hLMMxNG27\",\"state\":{}},{\"plugin\":\"input_proxy\",\"x\":736,\"y\":441,\"uid\":\"pGLyWtRrY3W7\",\"title\":\"rotation\",\"dyn_out\":[{\"name\":\"input\",\"dt\":5,\"uid\":\"J5U3TQFSLTm8\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":763,\"y\":263,\"uid\":\"wZvp6kDj99AP\",\"state\":{\"url\":\"/data/fthr/assets/scene/vive2/vive2.obj\"}},{\"plugin\":\"url_texture_generator\",\"x\":166,\"y\":360,\"uid\":\"p98nxuwKEs7B\",\"state\":{\"url\":\"/data/image/404ff6790d55c6604147416956c5454cbbcf56cb.png\"}},{\"plugin\":\"toggle_button\",\"x\":775,\"y\":589,\"uid\":\"zWXKFuXEtujF\",\"state\":{\"enabled\":false}},{\"plugin\":\"input_proxy\",\"x\":730,\"y\":399,\"uid\":\"qdnJH2mMH9Ad\",\"title\":\"position\",\"dyn_out\":[{\"name\":\"input\",\"dt\":5,\"uid\":\"Pqq9t7vHP95W\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]}],\"conns\":[{\"src_nuid\":\"9wp7gJaRFMnE\",\"dst_nuid\":\"cbqJmWWfSeKJ\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"Hy6eEmQtUDgK\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"3S8hLMMxNG27\",\"dst_nuid\":\"9wp7gJaRFMnE\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"59zUbtxjGdE2\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"wZvp6kDj99AP\",\"dst_nuid\":\"9wp7gJaRFMnE\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"xSKwD8FwDUtg\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"p98nxuwKEs7B\",\"dst_nuid\":\"3S8hLMMxNG27\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"zTRCUKjJxJP7\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"zWXKFuXEtujF\",\"dst_nuid\":\"9wp7gJaRFMnE\",\"src_slot\":\"bool\",\"dst_slot\":\"castShadow\",\"uid\":\"VzC5Mp3DaxwN\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"pGLyWtRrY3W7\",\"dst_nuid\":\"9wp7gJaRFMnE\",\"src_slot\":0,\"dst_slot\":\"rotation\",\"uid\":\"Mvac7JHPsYzp\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"qdnJH2mMH9Ad\",\"dst_nuid\":\"9wp7gJaRFMnE\",\"src_slot\":0,\"dst_slot\":\"position\",\"uid\":\"pewAdxF6hknY\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"zWXKFuXEtujF\",\"dst_nuid\":\"9wp7gJaRFMnE\",\"src_slot\":\"bool\",\"dst_slot\":\"receiveShadow\",\"uid\":\"QTMAeLtkqg23\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"position\",\"dt\":5,\"index\":0,\"uid\":\"6PBvFEnPszAB\",\"dynamic\":true,\"type\":0,\"is_connected\":true},{\"name\":\"rotation\",\"dt\":5,\"index\":1,\"uid\":\"YcwHBd87r7TB\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":697,\"y\":1115,\"uid\":\"mjyj45KKkuat\",\"state\":{\"always_update\":true,\"input_sids\":{\"32xAhjgzRH3v\":\"YcwHBd87r7TB\",\"yajBkGerv34X\":\"6PBvFEnPszAB\"},\"output_sids\":{\"3mBfqSHrCeTz\":\"mh0rTKkFm0nD\"}},\"title\":\"Vive controller\",\"graph\":{\"uid\":\"5BtQHFzVAS2E\",\"parent_uid\":\"k7RqVAFXV6YB\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1292,\"y\":298,\"uid\":\"wNYA8hpFyawq\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1439,\"y\":300,\"uid\":\"3mBfqSHrCeTz\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_material_phong\",\"x\":676,\"y\":344,\"uid\":\"3FUxrFvSb3Z5\",\"open\":false,\"state\":{}},{\"plugin\":\"input_proxy\",\"x\":975,\"y\":458,\"uid\":\"32xAhjgzRH3v\",\"title\":\"rotation\",\"dyn_out\":[{\"name\":\"input\",\"dt\":5,\"uid\":\"J5U3TQFSLTm8\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_loader_model\",\"x\":1002,\"y\":280,\"uid\":\"9WkD98Z3UCGW\",\"state\":{\"url\":\"/data/fthr/assets/scene/vive2/vive2.obj\"}},{\"plugin\":\"url_texture_generator\",\"x\":405,\"y\":377,\"uid\":\"4xz6rfCJxMaF\",\"state\":{\"url\":\"/data/image/404ff6790d55c6604147416956c5454cbbcf56cb.png\"}},{\"plugin\":\"toggle_button\",\"x\":1033,\"y\":625,\"uid\":\"jTZdGsHCQ5my\",\"state\":{\"enabled\":false}},{\"plugin\":\"input_proxy\",\"x\":969,\"y\":416,\"uid\":\"yajBkGerv34X\",\"title\":\"position\",\"dyn_out\":[{\"name\":\"input\",\"dt\":5,\"uid\":\"Pqq9t7vHP95W\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]}],\"conns\":[{\"src_nuid\":\"wNYA8hpFyawq\",\"dst_nuid\":\"3mBfqSHrCeTz\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"Hc7me6FXRnrm\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"3FUxrFvSb3Z5\",\"dst_nuid\":\"wNYA8hpFyawq\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"QYGxJdRWYKxB\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"9WkD98Z3UCGW\",\"dst_nuid\":\"wNYA8hpFyawq\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"CZCM2rcFBus8\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"4xz6rfCJxMaF\",\"dst_nuid\":\"3FUxrFvSb3Z5\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"TYMrnTgxpHuC\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"jTZdGsHCQ5my\",\"dst_nuid\":\"wNYA8hpFyawq\",\"src_slot\":\"bool\",\"dst_slot\":\"castShadow\",\"uid\":\"VzMfaHrMZ4X2\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"32xAhjgzRH3v\",\"dst_nuid\":\"wNYA8hpFyawq\",\"src_slot\":0,\"dst_slot\":\"rotation\",\"uid\":\"HhaUPHkUY4a7\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"yajBkGerv34X\",\"dst_nuid\":\"wNYA8hpFyawq\",\"src_slot\":0,\"dst_slot\":\"position\",\"uid\":\"7jD3pwjsXJeD\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"jTZdGsHCQ5my\",\"dst_nuid\":\"wNYA8hpFyawq\",\"src_slot\":\"bool\",\"dst_slot\":\"receiveShadow\",\"uid\":\"VCnuWg8vDqez\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"position\",\"dt\":5,\"index\":0,\"uid\":\"6PBvFEnPszAB\",\"dynamic\":true,\"type\":0,\"is_connected\":true},{\"name\":\"rotation\",\"dt\":5,\"index\":1,\"uid\":\"YcwHBd87r7TB\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"bool_display\",\"x\":699,\"y\":820,\"uid\":\"yju5346RJDc3\",\"title\":\"Menu\"},{\"plugin\":\"bool_display\",\"x\":699,\"y\":754,\"uid\":\"w5bkQakqBNgV\",\"title\":\"Grip\"},{\"plugin\":\"bool_display\",\"x\":699,\"y\":688,\"uid\":\"zJBDUVRZZETW\",\"title\":\"Trigger\"},{\"plugin\":\"bool_display\",\"x\":699,\"y\":622,\"uid\":\"nzHNgGngnxah\",\"title\":\"Touchpad\"},{\"plugin\":\"bool_display\",\"x\":749,\"y\":238,\"uid\":\"HWS8gg7NBvnT\",\"title\":\"Menu\"},{\"plugin\":\"bool_display\",\"x\":749,\"y\":172,\"uid\":\"h7WF3qaUSu4E\",\"title\":\"Grip\"},{\"plugin\":\"bool_display\",\"x\":749,\"y\":106,\"uid\":\"XB7r55PQnXtu\",\"title\":\"Trigger\"},{\"plugin\":\"bool_display\",\"x\":749,\"y\":40,\"uid\":\"KMGQdawgD33m\",\"title\":\"Touchpad\"},{\"plugin\":\"float_display\",\"x\":748,\"y\":431,\"uid\":\"Y9T5dheuDvjm\",\"title\":\"Trigger Value\"},{\"plugin\":\"float_display\",\"x\":696,\"y\":1033,\"uid\":\"43Ft9cF8fSuV\",\"title\":\"Trigger Value\"},{\"plugin\":\"float_display\",\"x\":699,\"y\":888,\"uid\":\"WF9sK2dydYqa\",\"title\":\"Touchpad X\"},{\"plugin\":\"float_display\",\"x\":700,\"y\":955,\"uid\":\"rMvHEzSBjeNB\",\"title\":\"Touchpad Y\"},{\"plugin\":\"float_display\",\"x\":748,\"y\":304,\"uid\":\"phwLu7KszjuA\",\"title\":\"Touchpad X\"},{\"plugin\":\"float_display\",\"x\":747,\"y\":371,\"uid\":\"9mDjtDgMVMXC\",\"title\":\"Touchpad Y\"},{\"plugin\":\"output_proxy\",\"x\":896,\"y\":61,\"uid\":\"dvXtpavBFd28\",\"title\":\"left touchpad down\",\"dyn_in\":[{\"name\":\"output\",\"dt\":7,\"def\":null,\"uid\":\"3dsTr63LH54y\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":843,\"y\":642,\"uid\":\"kV8Zk8UnHm2u\",\"title\":\"right touchpad down\",\"dyn_in\":[{\"name\":\"output\",\"dt\":7,\"def\":null,\"uid\":\"26GVzQUVjqsM\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":899,\"y\":122,\"uid\":\"3544qUK5LkxS\",\"title\":\"left trigger down\",\"dyn_in\":[{\"name\":\"output\",\"dt\":7,\"def\":null,\"uid\":\"Ew6XCx5Vh9Yc\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":843,\"y\":708,\"uid\":\"9zUgLb8sy9bH\",\"title\":\"right trigger down\",\"dyn_in\":[{\"name\":\"output\",\"dt\":7,\"def\":null,\"uid\":\"bXc4RhcKG8B9\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":895,\"y\":190,\"uid\":\"mdWvswufmMvD\",\"title\":\"left grip down\",\"dyn_in\":[{\"name\":\"output\",\"dt\":7,\"def\":null,\"uid\":\"DBCFJfuaMuFt\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":844,\"y\":772,\"uid\":\"Kqy6GD6BCNMZ\",\"title\":\"right trigger down\",\"dyn_in\":[{\"name\":\"output\",\"dt\":7,\"def\":null,\"uid\":\"QrwYxNa4KDKe\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":901,\"y\":257,\"uid\":\"mfwwrFgTXMEW\",\"title\":\"left menu down\",\"dyn_in\":[{\"name\":\"output\",\"dt\":7,\"def\":null,\"uid\":\"JYbNBHMc84Sa\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":844,\"y\":835,\"uid\":\"SpetuBr6qKff\",\"title\":\"right menu down\",\"dyn_in\":[{\"name\":\"output\",\"dt\":7,\"def\":null,\"uid\":\"AqBKTzBZq5MC\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":901,\"y\":322,\"uid\":\"CCcfRF8HTxQW\",\"title\":\"left touchpad x\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"def\":null,\"uid\":\"vTs7ABAAZrt9\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":848,\"y\":907,\"uid\":\"L9tGhMRjWKhd\",\"title\":\"right touchpad x\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"def\":null,\"uid\":\"jLbGef2WYQaS\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":897,\"y\":387,\"uid\":\"yyNxk6qStVYB\",\"title\":\"left touchpad y\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"def\":null,\"uid\":\"fh6UzgXvv9N9\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":854,\"y\":972,\"uid\":\"nLecEQ8DSQU6\",\"title\":\"right touchpad y\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"def\":null,\"uid\":\"cJdgK2qv5h24\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":899,\"y\":451,\"uid\":\"S4WwcNutHK2F\",\"title\":\"left trigger value\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"def\":null,\"uid\":\"wSJTdh9hAzYN\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":1181,\"y\":537,\"uid\":\"MBggYrXtHUxW\",\"title\":\"left hand\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"Hzuv2QZk9xFT\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true,\"array\":true}]},{\"plugin\":\"output_proxy\",\"x\":1176,\"y\":1156,\"uid\":\"GhUQyw6N7Rys\",\"title\":\"right hand\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"RkxPTABrFQLb\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true,\"array\":true}]},{\"plugin\":\"output_proxy\",\"x\":854,\"y\":1051,\"uid\":\"MsPwFZxNMgmf\",\"title\":\"right trigger value\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"def\":null,\"uid\":\"63MStvWrCS4y\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]}],\"conns\":[{\"src_nuid\":\"4WDRYzPeRyer\",\"dst_nuid\":\"823nszbmDuwn\",\"src_slot\":\"value\",\"dst_slot\":\"pad number\",\"uid\":\"VCgqCsJyfMKU\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"823nszbmDuwn\",\"dst_nuid\":\"dsheftXSF4cy\",\"src_slot\":\"rotation\",\"dst_slot\":1,\"uid\":\"MpU7AuYn2gcV\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"jYx96JCfJxBC\",\"dst_nuid\":\"QErpNfg3sEeg\",\"src_slot\":\"value\",\"dst_slot\":\"pad number\",\"uid\":\"K2722HZzFhE5\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"QErpNfg3sEeg\",\"dst_nuid\":\"mjyj45KKkuat\",\"src_slot\":\"rotation\",\"dst_slot\":1,\"uid\":\"kzMhzvYcyDNC\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"823nszbmDuwn\",\"dst_nuid\":\"Y9T5dheuDvjm\",\"src_slot\":\"trigger value\",\"dst_slot\":\"float\",\"uid\":\"qskLBTv5kYL7\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"QErpNfg3sEeg\",\"dst_nuid\":\"43Ft9cF8fSuV\",\"src_slot\":\"trigger value\",\"dst_slot\":\"float\",\"uid\":\"TtGrUN8aKVfv\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"823nszbmDuwn\",\"dst_nuid\":\"dsheftXSF4cy\",\"src_slot\":\"position\",\"dst_slot\":0,\"uid\":\"LHR6bB8ryZjS\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"QErpNfg3sEeg\",\"dst_nuid\":\"mjyj45KKkuat\",\"src_slot\":\"position\",\"dst_slot\":0,\"uid\":\"wPQvkjYYFYm9\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"QErpNfg3sEeg\",\"dst_nuid\":\"WF9sK2dydYqa\",\"src_slot\":\"touchpad x value\",\"dst_slot\":\"float\",\"uid\":\"cxhEXRcwBDHs\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"QErpNfg3sEeg\",\"dst_nuid\":\"rMvHEzSBjeNB\",\"src_slot\":\"touchpad y value\",\"dst_slot\":\"float\",\"uid\":\"tA9LZJ94YYYL\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"823nszbmDuwn\",\"dst_nuid\":\"phwLu7KszjuA\",\"src_slot\":\"touchpad x value\",\"dst_slot\":\"float\",\"uid\":\"ugLeTpccVgfS\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"823nszbmDuwn\",\"dst_nuid\":\"9mDjtDgMVMXC\",\"src_slot\":\"touchpad y value\",\"dst_slot\":\"float\",\"uid\":\"GNS8NKdpXzf9\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"823nszbmDuwn\",\"dst_nuid\":\"CCcfRF8HTxQW\",\"src_slot\":\"touchpad x value\",\"dst_slot\":0,\"uid\":\"BwpTjHLU9Tb4\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"QErpNfg3sEeg\",\"dst_nuid\":\"L9tGhMRjWKhd\",\"src_slot\":\"touchpad x value\",\"dst_slot\":0,\"uid\":\"nrdBcZUS3E89\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"823nszbmDuwn\",\"dst_nuid\":\"yyNxk6qStVYB\",\"src_slot\":\"touchpad y value\",\"dst_slot\":0,\"uid\":\"w3tcVrFcBjjC\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"QErpNfg3sEeg\",\"dst_nuid\":\"nLecEQ8DSQU6\",\"src_slot\":\"touchpad y value\",\"dst_slot\":0,\"uid\":\"Pq9F6hy4G7qW\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"dsheftXSF4cy\",\"dst_nuid\":\"MBggYrXtHUxW\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"hE4QXyWWfFTx\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"mjyj45KKkuat\",\"dst_nuid\":\"GhUQyw6N7Rys\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"qpzMTjhhmTay\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"823nszbmDuwn\",\"dst_nuid\":\"S4WwcNutHK2F\",\"src_slot\":\"trigger value\",\"dst_slot\":0,\"uid\":\"AtuseMMpc6KG\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"QErpNfg3sEeg\",\"dst_nuid\":\"MsPwFZxNMgmf\",\"src_slot\":\"trigger value\",\"dst_slot\":0,\"uid\":\"Ys4ENcG7yT5h\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"823nszbmDuwn\",\"dst_nuid\":\"KMGQdawgD33m\",\"src_slot\":\"touchpad down\",\"dst_slot\":\"bool\",\"uid\":\"fRDpX4Q4c3HL\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"823nszbmDuwn\",\"dst_nuid\":\"dvXtpavBFd28\",\"src_slot\":\"touchpad down\",\"dst_slot\":0,\"uid\":\"wE4B7A5S34Dv\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"823nszbmDuwn\",\"dst_nuid\":\"XB7r55PQnXtu\",\"src_slot\":\"trigger down\",\"dst_slot\":\"bool\",\"uid\":\"rYDcJYf5XJxZ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"823nszbmDuwn\",\"dst_nuid\":\"3544qUK5LkxS\",\"src_slot\":\"trigger down\",\"dst_slot\":0,\"uid\":\"93WLBsKe5ZzC\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"823nszbmDuwn\",\"dst_nuid\":\"mdWvswufmMvD\",\"src_slot\":\"grip down\",\"dst_slot\":0,\"uid\":\"9k6WBpetPBRF\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"823nszbmDuwn\",\"dst_nuid\":\"h7WF3qaUSu4E\",\"src_slot\":\"grip down\",\"dst_slot\":\"bool\",\"uid\":\"cBmw56qbWyMk\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"823nszbmDuwn\",\"dst_nuid\":\"HWS8gg7NBvnT\",\"src_slot\":\"menu down\",\"dst_slot\":\"bool\",\"uid\":\"SxV2XDRrYj8Y\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"823nszbmDuwn\",\"dst_nuid\":\"mfwwrFgTXMEW\",\"src_slot\":\"menu down\",\"dst_slot\":0,\"uid\":\"HsFz4KR4qvtL\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"QErpNfg3sEeg\",\"dst_nuid\":\"nzHNgGngnxah\",\"src_slot\":\"touchpad down\",\"dst_slot\":\"bool\",\"uid\":\"T8RL46UTbhaX\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"QErpNfg3sEeg\",\"dst_nuid\":\"kV8Zk8UnHm2u\",\"src_slot\":\"touchpad down\",\"dst_slot\":0,\"uid\":\"93d8bvJswNs5\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"QErpNfg3sEeg\",\"dst_nuid\":\"zJBDUVRZZETW\",\"src_slot\":\"trigger down\",\"dst_slot\":\"bool\",\"uid\":\"s3Aqb7WhWUE2\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"QErpNfg3sEeg\",\"dst_nuid\":\"9zUgLb8sy9bH\",\"src_slot\":\"trigger down\",\"dst_slot\":0,\"uid\":\"DCgj5bSBbPmX\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"QErpNfg3sEeg\",\"dst_nuid\":\"w5bkQakqBNgV\",\"src_slot\":\"grip down\",\"dst_slot\":\"bool\",\"uid\":\"jb7Uam7KqpX9\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"QErpNfg3sEeg\",\"dst_nuid\":\"Kqy6GD6BCNMZ\",\"src_slot\":\"grip down\",\"dst_slot\":0,\"uid\":\"px3EE4qnGT36\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"QErpNfg3sEeg\",\"dst_nuid\":\"yju5346RJDc3\",\"src_slot\":\"menu down\",\"dst_slot\":\"bool\",\"uid\":\"ZmEpEeFac9aK\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"QErpNfg3sEeg\",\"dst_nuid\":\"SpetuBr6qKff\",\"src_slot\":\"menu down\",\"dst_slot\":0,\"uid\":\"Yvmhr7PCZPXX\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}],\"variables\":[{\"id\":\"vib\",\"dt\":7}]},\"dyn_out\":[{\"name\":\"right trigger value\",\"dt\":0,\"index\":0,\"uid\":\"p79EMRwXUV9n\",\"dynamic\":true,\"type\":1,\"is_connected\":true},{\"name\":\"left trigger value\",\"dt\":0,\"index\":1,\"uid\":\"R6m8Lu5Tsk3x\",\"dynamic\":true,\"type\":1,\"is_connected\":true},{\"name\":\"right touchpad y\",\"dt\":0,\"index\":2,\"uid\":\"LYkndZNVst63\",\"dynamic\":true,\"type\":1,\"is_connected\":true},{\"name\":\"left touchpad y\",\"dt\":0,\"index\":3,\"uid\":\"3P4Lbg4dCFmB\",\"dynamic\":true,\"type\":1,\"is_connected\":true},{\"name\":\"right touchpad x\",\"dt\":0,\"index\":4,\"uid\":\"YkvN8q8pgwzp\",\"dynamic\":true,\"type\":1,\"is_connected\":true},{\"name\":\"left touchpad x\",\"dt\":0,\"index\":5,\"uid\":\"wRnwZkmxQ2hX\",\"dynamic\":true,\"type\":1,\"is_connected\":true},{\"name\":\"right menu down\",\"dt\":7,\"index\":6,\"uid\":\"JZAeaY663NSf\",\"dynamic\":true,\"type\":1,\"is_connected\":true},{\"name\":\"left menu down\",\"dt\":7,\"index\":7,\"uid\":\"9aAx3ggtXRDu\",\"dynamic\":true,\"type\":1,\"is_connected\":true},{\"name\":\"right trigger down\",\"dt\":7,\"index\":8,\"uid\":\"fwQbGG75FamP\",\"dynamic\":true,\"type\":1},{\"name\":\"left grip down\",\"dt\":7,\"index\":9,\"uid\":\"Tzz5AjwEvyp8\",\"dynamic\":true,\"type\":1},{\"name\":\"right trigger down\",\"dt\":7,\"index\":10,\"uid\":\"m8Q7AeWphBZA\",\"dynamic\":true,\"type\":1},{\"name\":\"left trigger down\",\"dt\":7,\"index\":11,\"uid\":\"wSgmRdx643NP\",\"dynamic\":true,\"type\":1},{\"name\":\"right touchpad down\",\"dt\":7,\"index\":12,\"uid\":\"YYy8gFcf6BNz\",\"dynamic\":true,\"type\":1},{\"name\":\"left touchpad down\",\"dt\":7,\"index\":13,\"uid\":\"HdZG8u7tn4da\",\"dynamic\":true,\"type\":1},{\"name\":\"left hand\",\"dt\":21,\"index\":14,\"uid\":\"Ca9KhGVPh74S\",\"dynamic\":true,\"type\":1,\"is_connected\":true,\"array\":true},{\"name\":\"right hand\",\"dt\":21,\"index\":15,\"uid\":\"tZD4aVqpE8HA\",\"dynamic\":true,\"type\":1,\"is_connected\":true,\"array\":true}]}],\"conns\":[{\"src_nuid\":\"kknZXAvU7D9s\",\"dst_nuid\":\"YLZNrgLkWXy2\",\"src_slot\":7,\"dst_slot\":0,\"uid\":\"hG7DvnxNpRAy\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"kknZXAvU7D9s\",\"dst_nuid\":\"UTJChvqNvzkf\",\"src_slot\":6,\"dst_slot\":0,\"uid\":\"ZtZgKxyCHFMZ\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"kknZXAvU7D9s\",\"dst_nuid\":\"QhPZ3JP4LqNu\",\"src_slot\":14,\"dst_slot\":0,\"uid\":\"VXg5fZ2p97A8\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"kknZXAvU7D9s\",\"dst_nuid\":\"tMMahBWcp9XY\",\"src_slot\":15,\"dst_slot\":0,\"uid\":\"wVQnBDwpUcH4\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"kknZXAvU7D9s\",\"dst_nuid\":\"Yg5JVYK2ZYju\",\"src_slot\":1,\"dst_slot\":0,\"uid\":\"WPqeMsFpU3Am\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"kknZXAvU7D9s\",\"dst_nuid\":\"TKBUDqjWCXEB\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"UuN9AAYMCx4g\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"kknZXAvU7D9s\",\"dst_nuid\":\"ze3wq4ZD8Tvv\",\"src_slot\":2,\"dst_slot\":0,\"uid\":\"f6XZ9jEJaYcR\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"kknZXAvU7D9s\",\"dst_nuid\":\"bBhQSHKUr9yN\",\"src_slot\":3,\"dst_slot\":0,\"uid\":\"pLsa6rGBRNaR\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"kknZXAvU7D9s\",\"dst_nuid\":\"QDyh6Me9uEQB\",\"src_slot\":4,\"dst_slot\":0,\"uid\":\"5BagXPPPg4Gg\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"kknZXAvU7D9s\",\"dst_nuid\":\"rMmeyUmvSqdj\",\"src_slot\":5,\"dst_slot\":0,\"uid\":\"8XPQt9EdV6wZ\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true}],\"x1\":375,\"y1\":113,\"x2\":561,\"y2\":577}"
  },
  {
    "path": "browser/patches/vr_3d_object_loader.json",
    "content": "{\n    \"abs_t\": 0,\n    \"active_graph\": 0,\n    \"graph_uid\": 10,\n    \"root\": {\n        \"node_uid\": 1,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 343,\n                \"y\": 208,\n                \"uid\": 0,\n                \"dsid\": 1,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"rt_filter\": 9729,\n                    \"input_sids\": {\n                        \"39\": 0\n                    },\n                    \"output_sids\": {}\n                },\n                \"title\": \"VR 3D object loader\",\n                \"graph\": {\n                    \"node_uid\": 75,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 1053,\n                            \"y\": 78,\n                            \"uid\": 0,\n                            \"dsid\": 7,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"rt_filter\": 9729,\n                                \"input_sids\": {\n                                    \"1\": 0,\n                                    \"2\": 1,\n                                    \"10\": 2,\n                                    \"21\": 5,\n                                    \"23\": 6\n                                },\n                                \"output_sids\": {}\n                            },\n                            \"title\": \"Scene loader\",\n                            \"graph\": {\n                                \"node_uid\": 27,\n                                \"uid\": 2,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scene_renderer_emitter\",\n                                        \"x\": 866,\n                                        \"y\": 16,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 11,\n                                        \"y\": 308,\n                                        \"uid\": 1,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"scene\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 11,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 759,\n                                        \"y\": 89,\n                                        \"uid\": 2,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"camera\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 6,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"scale_matrix\",\n                                        \"x\": 639,\n                                        \"y\": 215,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 514,\n                                        \"y\": 216,\n                                        \"uid\": 8\n                                    },\n                                    {\n                                        \"plugin\": \"divide_modulator\",\n                                        \"x\": 405,\n                                        \"y\": 236,\n                                        \"uid\": 9\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 297,\n                                        \"y\": 206,\n                                        \"uid\": 10,\n                                        \"dsid\": 17,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"mesh scale\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"max_modulator\",\n                                        \"x\": 320,\n                                        \"y\": 307,\n                                        \"uid\": 11\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 220,\n                                        \"y\": 355,\n                                        \"uid\": 12\n                                    },\n                                    {\n                                        \"plugin\": \"vector_magnitude\",\n                                        \"x\": 221,\n                                        \"y\": 288,\n                                        \"uid\": 13\n                                    },\n                                    {\n                                        \"plugin\": \"scene_get_bounding_box\",\n                                        \"x\": 89,\n                                        \"y\": 307,\n                                        \"uid\": 14\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 646,\n                                        \"y\": 277,\n                                        \"uid\": 21,\n                                        \"dsid\": 16,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"transform\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 674,\n                                        \"y\": 61,\n                                        \"uid\": 23,\n                                        \"dsid\": 13,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 746,\n                                        \"y\": 215,\n                                        \"uid\": 26\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 2,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 8,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 11,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 13,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 12,\n                                        \"src_slot\": 1,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 14,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"scene\",\n                                    \"dt\": 11,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"camera\",\n                                    \"dt\": 6,\n                                    \"uid\": 1,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"mesh scale\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"transform\",\n                                    \"dt\": 4,\n                                    \"uid\": 5,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 6,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": false\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"url_scene_generator\",\n                            \"x\": 168,\n                            \"y\": 90,\n                            \"uid\": 37,\n                            \"state\": {\n                                \"url\": \"/data/scene/ladybug/scene.json\"\n                            },\n                            \"title\": \"Load 3D scene\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 846,\n                            \"y\": 158,\n                            \"uid\": 38,\n                            \"open\": false,\n                            \"state\": {\n                                \"val\": 1\n                            }\n                        },\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 406,\n                            \"y\": 135,\n                            \"uid\": 39,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"slot_id\": 0\n                            },\n                            \"title\": \"camera\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 6,\n                                    \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 504,\n                            \"y\": 306,\n                            \"uid\": 40,\n                            \"open\": false,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"rt_filter\": 9729,\n                                \"input_sids\": {\n                                    \"8\": 1,\n                                    \"9\": 2,\n                                    \"10\": 3\n                                },\n                                \"output_sids\": {\n                                    \"1\": 0\n                                }\n                            },\n                            \"title\": \"Rotate\",\n                            \"graph\": {\n                                \"node_uid\": 21,\n                                \"uid\": 3,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"rotation_xyz_matrix\",\n                                        \"x\": 367,\n                                        \"y\": 174,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 485,\n                                        \"y\": 174,\n                                        \"uid\": 1,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 45,\n                                        \"y\": 80,\n                                        \"uid\": 8,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"X\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 45,\n                                        \"y\": 170,\n                                        \"uid\": 9,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 46,\n                                        \"y\": 257,\n                                        \"uid\": 10,\n                                        \"dsid\": 7,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 40,\n                                        \"y\": 386,\n                                        \"uid\": 11,\n                                        \"state\": {\n                                            \"val\": 180\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 15,\n                                        \"y\": 317,\n                                        \"uid\": 12,\n                                        \"state\": {\n                                            \"val\": 360\n                                        }\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 165,\n                                        \"y\": 80,\n                                        \"uid\": 15\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 260,\n                                        \"y\": 105,\n                                        \"uid\": 16\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 165,\n                                        \"y\": 170,\n                                        \"uid\": 17\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 260,\n                                        \"y\": 195,\n                                        \"uid\": 18\n                                    },\n                                    {\n                                        \"plugin\": \"multiply_modulator\",\n                                        \"x\": 163,\n                                        \"y\": 257,\n                                        \"uid\": 19\n                                    },\n                                    {\n                                        \"plugin\": \"subtract_modulator\",\n                                        \"x\": 258,\n                                        \"y\": 282,\n                                        \"uid\": 20\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 17,\n                                        \"dst_nuid\": 18,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 19,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 8,\n                                        \"dst_nuid\": 15,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 9,\n                                        \"dst_nuid\": 17,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 15,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 17,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 12,\n                                        \"dst_nuid\": 19,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 18,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 11,\n                                        \"dst_nuid\": 20,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"offset\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 18,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 20,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"X\",\n                                    \"dt\": 0,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Y\",\n                                    \"dt\": 0,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"Z\",\n                                    \"dt\": 0,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 178,\n                            \"y\": 288,\n                            \"uid\": 41,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Rotate X\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 178,\n                            \"y\": 361,\n                            \"uid\": 42,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Rotate Y\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 178,\n                            \"y\": 435,\n                            \"uid\": 43,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Rotate Z\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 505,\n                            \"y\": 370,\n                            \"uid\": 44,\n                            \"open\": false,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"rt_filter\": 9729,\n                                \"input_sids\": {\n                                    \"13\": 5,\n                                    \"14\": 6,\n                                    \"15\": 7\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Scale\",\n                            \"graph\": {\n                                \"node_uid\": 16,\n                                \"uid\": 4,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"scale_matrix\",\n                                        \"x\": 189,\n                                        \"y\": 49,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 278,\n                                        \"y\": 49,\n                                        \"uid\": 2,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 73,\n                                        \"y\": 49,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 7,\n                                        \"y\": 9,\n                                        \"uid\": 13,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 7,\n                                        \"y\": 69,\n                                        \"uid\": 14,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 7,\n                                        \"y\": 132,\n                                        \"uid\": 15,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 503,\n                            \"y\": 338,\n                            \"uid\": 45,\n                            \"open\": false,\n                            \"dsid\": 8,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"rt_filter\": 9729,\n                                \"input_sids\": {\n                                    \"13\": 5,\n                                    \"14\": 6,\n                                    \"15\": 7\n                                },\n                                \"output_sids\": {\n                                    \"2\": 1\n                                }\n                            },\n                            \"title\": \"Translate\",\n                            \"graph\": {\n                                \"node_uid\": 17,\n                                \"uid\": 5,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 291,\n                                        \"y\": 50,\n                                        \"uid\": 2,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 74,\n                                        \"y\": 50,\n                                        \"uid\": 3\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 8,\n                                        \"y\": 10,\n                                        \"uid\": 13,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"x\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 8,\n                                        \"y\": 70,\n                                        \"uid\": 14,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"y\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 8,\n                                        \"y\": 129,\n                                        \"uid\": 15,\n                                        \"dsid\": 8,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"z\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"translation_matrix\",\n                                        \"x\": 191,\n                                        \"y\": 50,\n                                        \"uid\": 16\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 13,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 14,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 3,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 16,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 16,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"x\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"y\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"z\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 265,\n                            \"y\": 292,\n                            \"uid\": 46,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Position X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 265,\n                            \"y\": 353,\n                            \"uid\": 47,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Position Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 265,\n                            \"y\": 415,\n                            \"uid\": 48,\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Position Z\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 177,\n                            \"y\": 513,\n                            \"uid\": 49,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Scale XYZ\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 618,\n                            \"y\": 312,\n                            \"uid\": 52,\n                            \"open\": false,\n                            \"dsid\": 4,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"rt_filter\": 9729,\n                                \"input_sids\": {\n                                    \"3\": 1,\n                                    \"4\": 2,\n                                    \"5\": 3\n                                },\n                                \"output_sids\": {\n                                    \"2\": 0\n                                }\n                            },\n                            \"title\": \"Concatenate x2\",\n                            \"graph\": {\n                                \"node_uid\": 6,\n                                \"uid\": 6,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 274,\n                                        \"y\": 13,\n                                        \"uid\": 0\n                                    },\n                                    {\n                                        \"plugin\": \"concatenate_matrix_modulator\",\n                                        \"x\": 92,\n                                        \"y\": 13,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 394,\n                                        \"y\": 13,\n                                        \"uid\": 2,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 197,\n                                        \"y\": 14,\n                                        \"uid\": 3,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 9,\n                                        \"y\": 13,\n                                        \"uid\": 4,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 9,\n                                        \"y\": 71,\n                                        \"uid\": 5,\n                                        \"dsid\": 6,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"matrix\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 4,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 0,\n                                        \"dst_nuid\": 2,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 3,\n                                        \"dst_nuid\": 0,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 4,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 1,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 2,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 3,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"matrix\",\n                                    \"dt\": 4,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 37,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 38,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 39,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 41,\n                            \"dst_nuid\": 40,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 42,\n                            \"dst_nuid\": 40,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 43,\n                            \"dst_nuid\": 40,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 46,\n                            \"dst_nuid\": 45,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 47,\n                            \"dst_nuid\": 45,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 48,\n                            \"dst_nuid\": 45,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 45,\n                            \"dst_nuid\": 52,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 40,\n                            \"dst_nuid\": 52,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 44,\n                            \"dst_nuid\": 52,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 52,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 49,\n                            \"dst_nuid\": 44,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 49,\n                            \"dst_nuid\": 44,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 49,\n                            \"dst_nuid\": 44,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true,\n                            \"offset\": 2\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"camera\",\n                        \"dt\": 6,\n                        \"uid\": 0,\n                        \"index\": 0,\n                        \"type\": 0,\n                        \"is_connected\": false\n                    }\n                ]\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "browser/patches/wasdzc-keyboard-movement.json",
    "content": "{\"nodes\":[{\"plugin\":\"graph\",\"x\":652,\"y\":243,\"uid\":\"kLr9zfR7Q95L\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"LbV7nqj28wuV\":\"EWx39P4SbcFX\"}},\"title\":\"WASD + ZC keyboard movement\",\"graph\":{\"uid\":\"u8Dw3FgDvSXt\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"vector\",\"x\":943,\"y\":261,\"uid\":\"4jKprrxe8WTZ\"},{\"plugin\":\"graph\",\"x\":719,\"y\":392,\"uid\":\"VnGwGDbfd8cV\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"PakL8pjWd7q9\":\"EXXpsB6sqHbM\"}},\"title\":\"WS\",\"graph\":{\"uid\":\"P4Jjvaru6ATR\",\"parent_uid\":\"u8Dw3FgDvSXt\",\"open\":false,\"nodes\":[{\"plugin\":\"key_press_generator\",\"x\":429,\"y\":286,\"uid\":\"qTjqfMT5s8YB\",\"state\":{\"key\":87,\"type\":0}},{\"plugin\":\"graph\",\"x\":641,\"y\":213,\"uid\":\"mkWEafQEKyxE\",\"state\":{\"always_update\":true,\"input_sids\":{\"5txw3H4xzKjC\":\"mVnEUjXzKTu9\",\"YzQCtrgQtqNq\":\"RrXnGmd2CdV3\",\"GPcHvzECbgff\":\"fQQyfTyQhtVt\",\"nQgsF7xm3TUU\":\"vqzGBrdNCQUn\"},\"output_sids\":{\"pFgkUjCRg8hk\":\"33F9mKcYFhjZ\"}},\"title\":\"Increase / Decrease on Trigger\",\"graph\":{\"uid\":\"5YBZQrcnmpSc\",\"parent_uid\":\"P4Jjvaru6ATR\",\"open\":true,\"nodes\":[{\"plugin\":\"input_proxy\",\"x\":300,\"y\":564,\"uid\":\"5txw3H4xzKjC\",\"title\":\"increase trigger\",\"dyn_out\":[{\"name\":\"input\",\"dt\":7,\"uid\":\"aSZDePV2hR2J\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":300,\"y\":611,\"uid\":\"YzQCtrgQtqNq\",\"title\":\"decrease trigger\",\"dyn_out\":[{\"name\":\"input\",\"dt\":7,\"uid\":\"aSZDePV2hR2J\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":1723,\"y\":650,\"uid\":\"pFgkUjCRg8hk\",\"title\":\"value\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"def\":null,\"uid\":\"DsPSgcn6hY6J\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":301,\"y\":658,\"uid\":\"GPcHvzECbgff\",\"title\":\"reset trigger\",\"dyn_out\":[{\"name\":\"input\",\"dt\":7,\"uid\":\"aSZDePV2hR2J\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":301,\"y\":703,\"uid\":\"nQgsF7xm3TUU\",\"title\":\"start value\",\"dyn_out\":[{\"name\":\"input\",\"dt\":0,\"uid\":\"6JttH4uJyNfW\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"add_modulator\",\"x\":1396,\"y\":656,\"uid\":\"QRMSRyrN5Cvn\"},{\"plugin\":\"if_else_modulator\",\"x\":597,\"y\":318,\"uid\":\"RmePkN6PfLPn\"},{\"plugin\":\"variable_local_read\",\"x\":338,\"y\":319,\"uid\":\"UZmwPMzKacLK\",\"title\":\"value\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"2szctpEgKtv8\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"variable_local_write\",\"x\":1541,\"y\":337,\"uid\":\"ZKju2wAcMzaA\",\"title\":\"value\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"3nZhVDGKFJvn\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"if_else_modulator\",\"x\":1020,\"y\":337,\"uid\":\"8cuWKJrm828w\",\"title\":\"add on increase\"},{\"plugin\":\"add_modulator\",\"x\":783,\"y\":432,\"uid\":\"DvEFzLKTFyzv\"},{\"plugin\":\"const_float_generator\",\"x\":531,\"y\":163,\"uid\":\"a8fjt6AYybrn\",\"state\":{\"val\":1},\"title\":\"one\"},{\"plugin\":\"if_else_modulator\",\"x\":1286,\"y\":332,\"uid\":\"vXhtpxjBBqf9\",\"title\":\"dec on decrease\"},{\"plugin\":\"subtract_modulator\",\"x\":1284,\"y\":487,\"uid\":\"UkMQLCV4ANPp\"}],\"conns\":[{\"src_nuid\":\"nQgsF7xm3TUU\",\"dst_nuid\":\"QRMSRyrN5Cvn\",\"src_slot\":0,\"dst_slot\":\"a\",\"uid\":\"s7uNUjwrZabA\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"QRMSRyrN5Cvn\",\"dst_nuid\":\"pFgkUjCRg8hk\",\"src_slot\":\"result\",\"dst_slot\":0,\"uid\":\"3KRNHBtxED9X\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"GPcHvzECbgff\",\"dst_nuid\":\"RmePkN6PfLPn\",\"src_slot\":0,\"dst_slot\":\"condition\",\"uid\":\"zYFvcySyseK3\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"nQgsF7xm3TUU\",\"dst_nuid\":\"RmePkN6PfLPn\",\"src_slot\":0,\"dst_slot\":\"true value\",\"uid\":\"ZsQmNgQyTnAV\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"UZmwPMzKacLK\",\"dst_nuid\":\"RmePkN6PfLPn\",\"src_slot\":0,\"dst_slot\":\"false value\",\"uid\":\"ynRNHu7W8uzE\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"5txw3H4xzKjC\",\"dst_nuid\":\"8cuWKJrm828w\",\"src_slot\":0,\"dst_slot\":\"condition\",\"uid\":\"MaxGqMpg33wF\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"RmePkN6PfLPn\",\"dst_nuid\":\"8cuWKJrm828w\",\"src_slot\":\"value\",\"dst_slot\":\"false value\",\"uid\":\"pKwRBJnmRHdp\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"RmePkN6PfLPn\",\"dst_nuid\":\"DvEFzLKTFyzv\",\"src_slot\":\"value\",\"dst_slot\":\"a\",\"uid\":\"Z4uQaTY6FstJ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"a8fjt6AYybrn\",\"dst_nuid\":\"DvEFzLKTFyzv\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"YjdNxkg8vpfF\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"DvEFzLKTFyzv\",\"dst_nuid\":\"8cuWKJrm828w\",\"src_slot\":\"result\",\"dst_slot\":\"true value\",\"uid\":\"dG7PMzgaWnP8\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"8cuWKJrm828w\",\"dst_nuid\":\"vXhtpxjBBqf9\",\"src_slot\":\"value\",\"dst_slot\":\"false value\",\"uid\":\"y3bPCggcaXHn\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"YzQCtrgQtqNq\",\"dst_nuid\":\"vXhtpxjBBqf9\",\"src_slot\":0,\"dst_slot\":\"condition\",\"uid\":\"xJbeMhGLD9jD\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"8cuWKJrm828w\",\"dst_nuid\":\"UkMQLCV4ANPp\",\"src_slot\":\"value\",\"dst_slot\":\"a\",\"uid\":\"7JvbNQaMLKUb\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"a8fjt6AYybrn\",\"dst_nuid\":\"UkMQLCV4ANPp\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"9pg7kykQJ2UR\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"UkMQLCV4ANPp\",\"dst_nuid\":\"vXhtpxjBBqf9\",\"src_slot\":\"result\",\"dst_slot\":\"true value\",\"uid\":\"cW3EDGL8CCUs\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"vXhtpxjBBqf9\",\"dst_nuid\":\"ZKju2wAcMzaA\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"8wTmtJGxhnFu\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"vXhtpxjBBqf9\",\"dst_nuid\":\"QRMSRyrN5Cvn\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"PDQ2GJMjjP7V\",\"src_connected\":true,\"dst_connected\":true}],\"variables\":[{\"id\":\"value\",\"dt\":0}]},\"dyn_in\":[{\"name\":\"start value\",\"dt\":0,\"index\":0,\"uid\":\"vqzGBrdNCQUn\",\"dynamic\":true,\"type\":0,\"is_connected\":true},{\"name\":\"reset trigger\",\"dt\":7,\"index\":1,\"uid\":\"fQQyfTyQhtVt\",\"dynamic\":true,\"type\":0,\"is_connected\":false},{\"name\":\"decrease trigger\",\"dt\":7,\"index\":2,\"uid\":\"RrXnGmd2CdV3\",\"dynamic\":true,\"type\":0,\"is_connected\":true},{\"name\":\"increase trigger\",\"dt\":7,\"index\":3,\"uid\":\"mVnEUjXzKTu9\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"index\":0,\"uid\":\"33F9mKcYFhjZ\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":455,\"y\":191,\"uid\":\"Mv6u32hQhcRy\",\"state\":{\"val\":0.1},\"title\":\"start\"},{\"plugin\":\"key_press_generator\",\"x\":400,\"y\":402,\"uid\":\"Z99fXK8rYsmu\",\"state\":{\"key\":83,\"type\":0}},{\"plugin\":\"divide_modulator\",\"x\":966,\"y\":381,\"uid\":\"umSLUJA824jy\"},{\"plugin\":\"const_float_generator\",\"x\":692,\"y\":395,\"uid\":\"BWFJm5jfYsHG\",\"state\":{\"val\":50}},{\"plugin\":\"output_proxy\",\"x\":1202,\"y\":341,\"uid\":\"PakL8pjWd7q9\",\"title\":\"Z\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"def\":null,\"uid\":\"FZWfufkRZjhV\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]}],\"conns\":[{\"src_nuid\":\"qTjqfMT5s8YB\",\"dst_nuid\":\"mkWEafQEKyxE\",\"src_slot\":\"signal\",\"dst_slot\":2,\"uid\":\"u4JSTX6SaYjZ\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"Mv6u32hQhcRy\",\"dst_nuid\":\"mkWEafQEKyxE\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"6QRD76b9mz6E\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"Z99fXK8rYsmu\",\"dst_nuid\":\"mkWEafQEKyxE\",\"src_slot\":\"signal\",\"dst_slot\":3,\"uid\":\"rHnBtfgT7wkP\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"mkWEafQEKyxE\",\"dst_nuid\":\"umSLUJA824jy\",\"src_slot\":0,\"dst_slot\":\"value\",\"uid\":\"ewnc7rf3KWs4\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"BWFJm5jfYsHG\",\"dst_nuid\":\"umSLUJA824jy\",\"src_slot\":\"value\",\"dst_slot\":\"scalar\",\"uid\":\"gL8KkBKEejmr\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"umSLUJA824jy\",\"dst_nuid\":\"PakL8pjWd7q9\",\"src_slot\":\"result\",\"dst_slot\":0,\"uid\":\"NzGqNQcxgRr9\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"Z\",\"dt\":0,\"index\":0,\"uid\":\"EXXpsB6sqHbM\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":721,\"y\":251,\"uid\":\"wBNVHC3DeY65\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"8bBxHzTNDk6g\":\"XVgMPDERbV7g\"}},\"title\":\"AD\",\"graph\":{\"uid\":\"B3L5AxezKRVC\",\"parent_uid\":\"u8Dw3FgDvSXt\",\"open\":true,\"nodes\":[{\"plugin\":\"key_press_generator\",\"x\":539,\"y\":301,\"uid\":\"metyFMaen2sN\",\"state\":{\"key\":65,\"type\":0}},{\"plugin\":\"graph\",\"x\":751,\"y\":228,\"uid\":\"L863vkaHVWuy\",\"state\":{\"always_update\":true,\"input_sids\":{\"KS48EtUpjgsf\":\"mVnEUjXzKTu9\",\"b8ze3t3hNjHH\":\"RrXnGmd2CdV3\",\"KR2yT6Zyvd4G\":\"fQQyfTyQhtVt\",\"dYzSaeNJsVUy\":\"vqzGBrdNCQUn\"},\"output_sids\":{\"9D4WSvFWcfze\":\"33F9mKcYFhjZ\"}},\"title\":\"Increase / Decrease on Trigger\",\"graph\":{\"uid\":\"GQWGsu7nJf42\",\"parent_uid\":\"B3L5AxezKRVC\",\"open\":true,\"nodes\":[{\"plugin\":\"input_proxy\",\"x\":300,\"y\":564,\"uid\":\"KS48EtUpjgsf\",\"title\":\"increase trigger\",\"dyn_out\":[{\"name\":\"input\",\"dt\":7,\"uid\":\"aSZDePV2hR2J\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":300,\"y\":611,\"uid\":\"b8ze3t3hNjHH\",\"title\":\"decrease trigger\",\"dyn_out\":[{\"name\":\"input\",\"dt\":7,\"uid\":\"aSZDePV2hR2J\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":1723,\"y\":650,\"uid\":\"9D4WSvFWcfze\",\"title\":\"value\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"def\":null,\"uid\":\"DsPSgcn6hY6J\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":301,\"y\":658,\"uid\":\"KR2yT6Zyvd4G\",\"title\":\"reset trigger\",\"dyn_out\":[{\"name\":\"input\",\"dt\":7,\"uid\":\"aSZDePV2hR2J\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":301,\"y\":703,\"uid\":\"dYzSaeNJsVUy\",\"title\":\"start value\",\"dyn_out\":[{\"name\":\"input\",\"dt\":0,\"uid\":\"6JttH4uJyNfW\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"add_modulator\",\"x\":1396,\"y\":656,\"uid\":\"FLhMGezj54WK\"},{\"plugin\":\"if_else_modulator\",\"x\":597,\"y\":318,\"uid\":\"rsfZDrgXHuem\"},{\"plugin\":\"variable_local_read\",\"x\":338,\"y\":319,\"uid\":\"47cayBVRnG6g\",\"title\":\"value\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"2szctpEgKtv8\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"variable_local_write\",\"x\":1541,\"y\":337,\"uid\":\"RKUFqpGQfEjz\",\"title\":\"value\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"3nZhVDGKFJvn\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"if_else_modulator\",\"x\":1020,\"y\":337,\"uid\":\"226BGzrBejbc\",\"title\":\"add on increase\"},{\"plugin\":\"add_modulator\",\"x\":783,\"y\":432,\"uid\":\"qJWft2KDrSxH\"},{\"plugin\":\"const_float_generator\",\"x\":531,\"y\":163,\"uid\":\"gp5BGm7KWHRw\",\"state\":{\"val\":1},\"title\":\"one\"},{\"plugin\":\"if_else_modulator\",\"x\":1286,\"y\":332,\"uid\":\"kd5HAjWWy2gG\",\"title\":\"dec on decrease\"},{\"plugin\":\"subtract_modulator\",\"x\":1284,\"y\":487,\"uid\":\"rmY5vPS64GzQ\"}],\"conns\":[{\"src_nuid\":\"dYzSaeNJsVUy\",\"dst_nuid\":\"FLhMGezj54WK\",\"src_slot\":0,\"dst_slot\":\"a\",\"uid\":\"rCbpYZDqb2Bu\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"FLhMGezj54WK\",\"dst_nuid\":\"9D4WSvFWcfze\",\"src_slot\":\"result\",\"dst_slot\":0,\"uid\":\"QTYRxNVcZxZr\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"KR2yT6Zyvd4G\",\"dst_nuid\":\"rsfZDrgXHuem\",\"src_slot\":0,\"dst_slot\":\"condition\",\"uid\":\"yWWYFYr7gLSR\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"dYzSaeNJsVUy\",\"dst_nuid\":\"rsfZDrgXHuem\",\"src_slot\":0,\"dst_slot\":\"true value\",\"uid\":\"f7k99BBRCgdW\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"47cayBVRnG6g\",\"dst_nuid\":\"rsfZDrgXHuem\",\"src_slot\":0,\"dst_slot\":\"false value\",\"uid\":\"jpBgakeYu7wD\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"KS48EtUpjgsf\",\"dst_nuid\":\"226BGzrBejbc\",\"src_slot\":0,\"dst_slot\":\"condition\",\"uid\":\"ZbBPQ24pzx6D\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"rsfZDrgXHuem\",\"dst_nuid\":\"226BGzrBejbc\",\"src_slot\":\"value\",\"dst_slot\":\"false value\",\"uid\":\"EEHH9RrzMCGp\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"rsfZDrgXHuem\",\"dst_nuid\":\"qJWft2KDrSxH\",\"src_slot\":\"value\",\"dst_slot\":\"a\",\"uid\":\"MgMRAgsWpmvn\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"gp5BGm7KWHRw\",\"dst_nuid\":\"qJWft2KDrSxH\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"be3BvCRY7WCG\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"qJWft2KDrSxH\",\"dst_nuid\":\"226BGzrBejbc\",\"src_slot\":\"result\",\"dst_slot\":\"true value\",\"uid\":\"MdCw7M28uMzT\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"226BGzrBejbc\",\"dst_nuid\":\"kd5HAjWWy2gG\",\"src_slot\":\"value\",\"dst_slot\":\"false value\",\"uid\":\"bMPcJ4GK3MCk\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"b8ze3t3hNjHH\",\"dst_nuid\":\"kd5HAjWWy2gG\",\"src_slot\":0,\"dst_slot\":\"condition\",\"uid\":\"fzXf6HTpF7d8\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"226BGzrBejbc\",\"dst_nuid\":\"rmY5vPS64GzQ\",\"src_slot\":\"value\",\"dst_slot\":\"a\",\"uid\":\"Yr6hs5aQJ22q\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"gp5BGm7KWHRw\",\"dst_nuid\":\"rmY5vPS64GzQ\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"EqJGJGBgVCyq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"rmY5vPS64GzQ\",\"dst_nuid\":\"kd5HAjWWy2gG\",\"src_slot\":\"result\",\"dst_slot\":\"true value\",\"uid\":\"ftkzwb3pwwjh\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"kd5HAjWWy2gG\",\"dst_nuid\":\"RKUFqpGQfEjz\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"AzVLJuNC7S9N\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"kd5HAjWWy2gG\",\"dst_nuid\":\"FLhMGezj54WK\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"td52y9hqFPuA\",\"src_connected\":true,\"dst_connected\":true}],\"variables\":[{\"id\":\"value\",\"dt\":0}]},\"dyn_in\":[{\"name\":\"start value\",\"dt\":0,\"index\":0,\"uid\":\"vqzGBrdNCQUn\",\"dynamic\":true,\"type\":0,\"is_connected\":true},{\"name\":\"reset trigger\",\"dt\":7,\"index\":1,\"uid\":\"fQQyfTyQhtVt\",\"dynamic\":true,\"type\":0,\"is_connected\":false},{\"name\":\"decrease trigger\",\"dt\":7,\"index\":2,\"uid\":\"RrXnGmd2CdV3\",\"dynamic\":true,\"type\":0,\"is_connected\":true},{\"name\":\"increase trigger\",\"dt\":7,\"index\":3,\"uid\":\"mVnEUjXzKTu9\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"index\":0,\"uid\":\"33F9mKcYFhjZ\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":565,\"y\":206,\"uid\":\"YLbTkarR4CM6\",\"state\":{\"val\":0.1},\"title\":\"start\"},{\"plugin\":\"key_press_generator\",\"x\":510,\"y\":417,\"uid\":\"pTBDTLNY55SH\",\"state\":{\"key\":68,\"type\":0}},{\"plugin\":\"divide_modulator\",\"x\":1076,\"y\":396,\"uid\":\"WwzqXTPtnsVe\"},{\"plugin\":\"const_float_generator\",\"x\":802,\"y\":410,\"uid\":\"WZf4HNajLMuC\",\"state\":{\"val\":50}},{\"plugin\":\"output_proxy\",\"x\":1312,\"y\":356,\"uid\":\"8bBxHzTNDk6g\",\"title\":\"X\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"def\":null,\"uid\":\"FZWfufkRZjhV\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]}],\"conns\":[{\"src_nuid\":\"metyFMaen2sN\",\"dst_nuid\":\"L863vkaHVWuy\",\"src_slot\":\"signal\",\"dst_slot\":2,\"uid\":\"7VM6UDj46gEL\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"YLbTkarR4CM6\",\"dst_nuid\":\"L863vkaHVWuy\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"KmL5pFFCRwC7\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"pTBDTLNY55SH\",\"dst_nuid\":\"L863vkaHVWuy\",\"src_slot\":\"signal\",\"dst_slot\":3,\"uid\":\"pbFUC3ZhM2eU\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"L863vkaHVWuy\",\"dst_nuid\":\"WwzqXTPtnsVe\",\"src_slot\":0,\"dst_slot\":\"value\",\"uid\":\"MuGgvtrCfrev\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"WZf4HNajLMuC\",\"dst_nuid\":\"WwzqXTPtnsVe\",\"src_slot\":\"value\",\"dst_slot\":\"scalar\",\"uid\":\"5hE78mh2dqM6\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"WwzqXTPtnsVe\",\"dst_nuid\":\"8bBxHzTNDk6g\",\"src_slot\":\"result\",\"dst_slot\":0,\"uid\":\"8yq2c4UzBcEK\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"X\",\"dt\":0,\"index\":0,\"uid\":\"XVgMPDERbV7g\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":719,\"y\":322,\"uid\":\"zLwepetqbDpT\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"9FxfYMDNmyLG\":\"XVgMPDERbV7g\"}},\"title\":\"ZC\",\"graph\":{\"uid\":\"mpUqeYpkVR5r\",\"parent_uid\":\"u8Dw3FgDvSXt\",\"open\":true,\"nodes\":[{\"plugin\":\"key_press_generator\",\"x\":218,\"y\":202,\"uid\":\"2n7nNzvGVDrV\",\"state\":{\"key\":90,\"type\":0}},{\"plugin\":\"graph\",\"x\":430,\"y\":129,\"uid\":\"HAsNzysKvhvx\",\"state\":{\"always_update\":true,\"input_sids\":{\"WaHW55BeKVJ4\":\"mVnEUjXzKTu9\",\"s92AvGvkr8Ws\":\"RrXnGmd2CdV3\",\"qZX79YL8FWXC\":\"fQQyfTyQhtVt\",\"CzRNtsnuXTTk\":\"vqzGBrdNCQUn\"},\"output_sids\":{\"mwYv5fKz2MUp\":\"33F9mKcYFhjZ\"}},\"title\":\"Increase / Decrease on Trigger\",\"graph\":{\"uid\":\"abp8XM3VVAFv\",\"parent_uid\":\"mpUqeYpkVR5r\",\"open\":true,\"nodes\":[{\"plugin\":\"input_proxy\",\"x\":300,\"y\":564,\"uid\":\"WaHW55BeKVJ4\",\"title\":\"increase trigger\",\"dyn_out\":[{\"name\":\"input\",\"dt\":7,\"uid\":\"aSZDePV2hR2J\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":300,\"y\":611,\"uid\":\"s92AvGvkr8Ws\",\"title\":\"decrease trigger\",\"dyn_out\":[{\"name\":\"input\",\"dt\":7,\"uid\":\"aSZDePV2hR2J\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":1723,\"y\":650,\"uid\":\"mwYv5fKz2MUp\",\"title\":\"value\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"def\":null,\"uid\":\"DsPSgcn6hY6J\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":301,\"y\":658,\"uid\":\"qZX79YL8FWXC\",\"title\":\"reset trigger\",\"dyn_out\":[{\"name\":\"input\",\"dt\":7,\"uid\":\"aSZDePV2hR2J\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":301,\"y\":703,\"uid\":\"CzRNtsnuXTTk\",\"title\":\"start value\",\"dyn_out\":[{\"name\":\"input\",\"dt\":0,\"uid\":\"6JttH4uJyNfW\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"add_modulator\",\"x\":1396,\"y\":656,\"uid\":\"Qnwuf757Ax3A\"},{\"plugin\":\"if_else_modulator\",\"x\":597,\"y\":318,\"uid\":\"E3khMuSxqxWG\"},{\"plugin\":\"variable_local_read\",\"x\":338,\"y\":319,\"uid\":\"uumV3GchwJuj\",\"title\":\"value\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"2szctpEgKtv8\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"variable_local_write\",\"x\":1541,\"y\":337,\"uid\":\"TcVTnc2dQFnw\",\"title\":\"value\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"3nZhVDGKFJvn\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"if_else_modulator\",\"x\":1020,\"y\":337,\"uid\":\"DJsbEj8THYZu\",\"title\":\"add on increase\"},{\"plugin\":\"add_modulator\",\"x\":783,\"y\":432,\"uid\":\"djxB6TNpYVu8\"},{\"plugin\":\"const_float_generator\",\"x\":531,\"y\":163,\"uid\":\"at8NL9QF7Uax\",\"state\":{\"val\":1},\"title\":\"one\"},{\"plugin\":\"if_else_modulator\",\"x\":1286,\"y\":332,\"uid\":\"RYanNw3AEjh4\",\"title\":\"dec on decrease\"},{\"plugin\":\"subtract_modulator\",\"x\":1284,\"y\":487,\"uid\":\"XJxvftDEWjW7\"}],\"conns\":[{\"src_nuid\":\"CzRNtsnuXTTk\",\"dst_nuid\":\"Qnwuf757Ax3A\",\"src_slot\":0,\"dst_slot\":\"a\",\"uid\":\"jyRHqzx9GMQ9\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"Qnwuf757Ax3A\",\"dst_nuid\":\"mwYv5fKz2MUp\",\"src_slot\":\"result\",\"dst_slot\":0,\"uid\":\"CUtpXLTKA6wz\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"qZX79YL8FWXC\",\"dst_nuid\":\"E3khMuSxqxWG\",\"src_slot\":0,\"dst_slot\":\"condition\",\"uid\":\"C86eyyVfH9AY\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"CzRNtsnuXTTk\",\"dst_nuid\":\"E3khMuSxqxWG\",\"src_slot\":0,\"dst_slot\":\"true value\",\"uid\":\"TxW3p4cgWAFy\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"uumV3GchwJuj\",\"dst_nuid\":\"E3khMuSxqxWG\",\"src_slot\":0,\"dst_slot\":\"false value\",\"uid\":\"CUdyrRpbUZTr\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"WaHW55BeKVJ4\",\"dst_nuid\":\"DJsbEj8THYZu\",\"src_slot\":0,\"dst_slot\":\"condition\",\"uid\":\"hnU3g5vBGsGC\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"E3khMuSxqxWG\",\"dst_nuid\":\"DJsbEj8THYZu\",\"src_slot\":\"value\",\"dst_slot\":\"false value\",\"uid\":\"KzSsWv5bSj9W\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"E3khMuSxqxWG\",\"dst_nuid\":\"djxB6TNpYVu8\",\"src_slot\":\"value\",\"dst_slot\":\"a\",\"uid\":\"CHUNGY2kJngg\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"at8NL9QF7Uax\",\"dst_nuid\":\"djxB6TNpYVu8\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"sAd9XL99DGm9\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"djxB6TNpYVu8\",\"dst_nuid\":\"DJsbEj8THYZu\",\"src_slot\":\"result\",\"dst_slot\":\"true value\",\"uid\":\"Tj2yxHZXyhBZ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"DJsbEj8THYZu\",\"dst_nuid\":\"RYanNw3AEjh4\",\"src_slot\":\"value\",\"dst_slot\":\"false value\",\"uid\":\"4jVBpq9p626r\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"s92AvGvkr8Ws\",\"dst_nuid\":\"RYanNw3AEjh4\",\"src_slot\":0,\"dst_slot\":\"condition\",\"uid\":\"gRNCtz6368p6\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"DJsbEj8THYZu\",\"dst_nuid\":\"XJxvftDEWjW7\",\"src_slot\":\"value\",\"dst_slot\":\"a\",\"uid\":\"EY3pprxDqmwN\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"at8NL9QF7Uax\",\"dst_nuid\":\"XJxvftDEWjW7\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"Gry22vM5ChEA\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"XJxvftDEWjW7\",\"dst_nuid\":\"RYanNw3AEjh4\",\"src_slot\":\"result\",\"dst_slot\":\"true value\",\"uid\":\"mGF468eUcPLz\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"RYanNw3AEjh4\",\"dst_nuid\":\"TcVTnc2dQFnw\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"UYMq6GzdVgWB\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"RYanNw3AEjh4\",\"dst_nuid\":\"Qnwuf757Ax3A\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"YnhjFsCKECMe\",\"src_connected\":true,\"dst_connected\":true}],\"variables\":[{\"id\":\"value\",\"dt\":0}]},\"dyn_in\":[{\"name\":\"start value\",\"dt\":0,\"index\":0,\"uid\":\"vqzGBrdNCQUn\",\"dynamic\":true,\"type\":0,\"is_connected\":true},{\"name\":\"reset trigger\",\"dt\":7,\"index\":1,\"uid\":\"fQQyfTyQhtVt\",\"dynamic\":true,\"type\":0,\"is_connected\":false},{\"name\":\"decrease trigger\",\"dt\":7,\"index\":2,\"uid\":\"RrXnGmd2CdV3\",\"dynamic\":true,\"type\":0,\"is_connected\":true},{\"name\":\"increase trigger\",\"dt\":7,\"index\":3,\"uid\":\"mVnEUjXzKTu9\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"index\":0,\"uid\":\"33F9mKcYFhjZ\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":244,\"y\":107,\"uid\":\"NjhruD4d6fBW\",\"state\":{\"val\":0.1},\"title\":\"start\"},{\"plugin\":\"key_press_generator\",\"x\":189,\"y\":318,\"uid\":\"5x6F86LkPVGW\",\"state\":{\"key\":67,\"type\":0}},{\"plugin\":\"divide_modulator\",\"x\":755,\"y\":297,\"uid\":\"k4tgJSkxCtyz\"},{\"plugin\":\"const_float_generator\",\"x\":481,\"y\":311,\"uid\":\"dHbDqQApC5Sp\",\"state\":{\"val\":50}},{\"plugin\":\"output_proxy\",\"x\":991,\"y\":257,\"uid\":\"9FxfYMDNmyLG\",\"title\":\"Y\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"def\":null,\"uid\":\"FZWfufkRZjhV\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]}],\"conns\":[{\"src_nuid\":\"NjhruD4d6fBW\",\"dst_nuid\":\"HAsNzysKvhvx\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"mNxAMzwxQNNw\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"HAsNzysKvhvx\",\"dst_nuid\":\"k4tgJSkxCtyz\",\"src_slot\":0,\"dst_slot\":\"value\",\"uid\":\"PRL9a4fFtWQv\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"dHbDqQApC5Sp\",\"dst_nuid\":\"k4tgJSkxCtyz\",\"src_slot\":\"value\",\"dst_slot\":\"scalar\",\"uid\":\"tbDzfGNweTq2\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"k4tgJSkxCtyz\",\"dst_nuid\":\"9FxfYMDNmyLG\",\"src_slot\":\"result\",\"dst_slot\":0,\"uid\":\"jRjfKTbTDJnc\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"5x6F86LkPVGW\",\"dst_nuid\":\"HAsNzysKvhvx\",\"src_slot\":\"signal\",\"dst_slot\":2,\"uid\":\"n2CMdMTADMXq\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"2n7nNzvGVDrV\",\"dst_nuid\":\"HAsNzysKvhvx\",\"src_slot\":\"signal\",\"dst_slot\":3,\"uid\":\"bw3KJgudLc2H\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"Y\",\"dt\":0,\"index\":0,\"uid\":\"XVgMPDERbV7g\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":1244,\"y\":269,\"uid\":\"LbV7nqj28wuV\",\"title\":\"position\",\"dyn_in\":[{\"name\":\"output\",\"dt\":5,\"def\":null,\"uid\":\"jXDB3t6uHACa\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"annotation\",\"x\":947,\"y\":95,\"uid\":\"TLV4mF3F2uDd\",\"state\":{\"text\":\"Connect this to the position of the camera!\",\"width\":133,\"height\":80},\"title\":\"WASD:\"}],\"conns\":[{\"src_nuid\":\"wBNVHC3DeY65\",\"dst_nuid\":\"4jKprrxe8WTZ\",\"src_slot\":0,\"dst_slot\":\"x\",\"uid\":\"RCathDeH4rQt\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"zLwepetqbDpT\",\"dst_nuid\":\"4jKprrxe8WTZ\",\"src_slot\":0,\"dst_slot\":\"y\",\"uid\":\"LsLGEepzdHBS\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"VnGwGDbfd8cV\",\"dst_nuid\":\"4jKprrxe8WTZ\",\"src_slot\":0,\"dst_slot\":\"z\",\"uid\":\"zBtf7QL4GV9L\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"4jKprrxe8WTZ\",\"dst_nuid\":\"LbV7nqj28wuV\",\"src_slot\":\"vector\",\"dst_slot\":0,\"uid\":\"xpuWeQkmvkqS\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"position\",\"dt\":5,\"index\":0,\"uid\":\"EWx39P4SbcFX\",\"dynamic\":true,\"type\":1}]}],\"conns\":[],\"x1\":702,\"y1\":293,\"x2\":985,\"y2\":352}"
  },
  {
    "path": "browser/plugins/absolute_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"absolute_modulator\"] = function(core, node)\n{\n\n\tthis.desc = 'Emit the absolute value of the input.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Positive or negative input value', def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'result', dt: core.datatypes.FLOAT, desc: 'Positive output value', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.input_val = 0.0;\n\tthis.output_val = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.input_val = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.output_val = Math.abs(this.input_val);\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.output_val;\n};\n"
  },
  {
    "path": "browser/plugins/accumulate_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"accumulate_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Every input <b>value</b> is accumulated in an internal buffer (which resets to zero on playback stop).';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'A small value to be accumulated in an internal buffer.', def: 0.0 },\n\t\t{ name: 'reset', dt: core.datatypes.FLOAT, desc: 'Send a value to this slot to reset the accumulator to that value.', def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'The current value of the accumulation buffer.', def: 0.0 }\n\t];\n\t\n\tthis.state = { value: 0.0 };\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.updated = true;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.state.value += data;\n\telse\n\t\tthis.state.value = data;\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.state.value;\n};\t\n\n"
  },
  {
    "path": "browser/plugins/ace/ace.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * 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 *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING 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 * ***** END LICENSE BLOCK ***** */\n\n(function() {\n\nvar ACE_NAMESPACE = \"\";\n\nvar global = (function() {\n    return this;\n})();\n\n\nif (!ACE_NAMESPACE && typeof requirejs !== \"undefined\")\n    return;\n\n\nvar _define = function(module, deps, payload) {\n    if (typeof module !== 'string') {\n        if (_define.original)\n            _define.original.apply(window, arguments);\n        else {\n            console.error('dropping module because define wasn\\'t a string.');\n            console.trace();\n        }\n        return;\n    }\n\n    if (arguments.length == 2)\n        payload = deps;\n\n    if (!_define.modules) {\n        _define.modules = {};\n        _define.payloads = {};\n    }\n    \n    _define.payloads[module] = payload;\n    _define.modules[module] = null;\n};\nvar _require = function(parentId, module, callback) {\n    if (Object.prototype.toString.call(module) === \"[object Array]\") {\n        var params = [];\n        for (var i = 0, l = module.length; i < l; ++i) {\n            var dep = lookup(parentId, module[i]);\n            if (!dep && _require.original)\n                return _require.original.apply(window, arguments);\n            params.push(dep);\n        }\n        if (callback) {\n            callback.apply(null, params);\n        }\n    }\n    else if (typeof module === 'string') {\n        var payload = lookup(parentId, module);\n        if (!payload && _require.original)\n            return _require.original.apply(window, arguments);\n\n        if (callback) {\n            callback();\n        }\n\n        return payload;\n    }\n    else {\n        if (_require.original)\n            return _require.original.apply(window, arguments);\n    }\n};\n\nvar normalizeModule = function(parentId, moduleName) {\n    if (moduleName.indexOf(\"!\") !== -1) {\n        var chunks = moduleName.split(\"!\");\n        return normalizeModule(parentId, chunks[0]) + \"!\" + normalizeModule(parentId, chunks[1]);\n    }\n    if (moduleName.charAt(0) == \".\") {\n        var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n        moduleName = base + \"/\" + moduleName;\n\n        while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n            var previous = moduleName;\n            moduleName = moduleName.replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n        }\n    }\n\n    return moduleName;\n};\nvar lookup = function(parentId, moduleName) {\n\n    moduleName = normalizeModule(parentId, moduleName);\n\n    var module = _define.modules[moduleName];\n    if (!module) {\n        module = _define.payloads[moduleName];\n        if (typeof module === 'function') {\n            var exports = {};\n            var mod = {\n                id: moduleName,\n                uri: '',\n                exports: exports,\n                packaged: true\n            };\n\n            var req = function(module, callback) {\n                return _require(moduleName, module, callback);\n            };\n\n            var returnValue = module(req, exports, mod);\n            exports = returnValue || mod.exports;\n            _define.modules[moduleName] = exports;\n            delete _define.payloads[moduleName];\n        }\n        module = _define.modules[moduleName] = exports || module;\n    }\n    return module;\n};\n\nfunction exportAce(ns) {\n    var require = function(module, callback) {\n        return _require(\"\", module, callback);\n    };    \n\n    var root = global;\n    if (ns) {\n        if (!global[ns])\n            global[ns] = {};\n        root = global[ns];\n    }\n\n    if (!root.define || !root.define.packaged) {\n        _define.original = root.define;\n        root.define = _define;\n        root.define.packaged = true;\n    }\n\n    if (!root.require || !root.require.packaged) {\n        _require.original = root.require;\n        root.require = require;\n        root.require.packaged = true;\n    }\n}\n\nexportAce(ACE_NAMESPACE);\n\n})();\n\ndefine('ace/ace', ['require', 'exports', 'module' , 'ace/lib/fixoldbrowsers', 'ace/lib/dom', 'ace/lib/event', 'ace/editor', 'ace/edit_session', 'ace/undomanager', 'ace/virtual_renderer', 'ace/multi_select', 'ace/worker/worker_client', 'ace/keyboard/hash_handler', 'ace/placeholder', 'ace/mode/folding/fold_mode', 'ace/theme/textmate', 'ace/config'], function(require, exports, module) {\n\n\nrequire(\"./lib/fixoldbrowsers\");\n\nvar dom = require(\"./lib/dom\");\nvar event = require(\"./lib/event\");\n\nvar Editor = require(\"./editor\").Editor;\nvar EditSession = require(\"./edit_session\").EditSession;\nvar UndoManager = require(\"./undomanager\").UndoManager;\nvar Renderer = require(\"./virtual_renderer\").VirtualRenderer;\nvar MultiSelect = require(\"./multi_select\").MultiSelect;\nrequire(\"./worker/worker_client\");\nrequire(\"./keyboard/hash_handler\");\nrequire(\"./placeholder\");\nrequire(\"./mode/folding/fold_mode\");\nrequire(\"./theme/textmate\");\n\nexports.config = require(\"./config\");\nexports.require = require;\nexports.edit = function(el) {\n    if (typeof(el) == \"string\") {\n        var _id = el;\n        var el = document.getElementById(_id);\n        if (!el)\n            throw new Error(\"ace.edit can't find div #\" + _id);\n    }\n\n    if (el.env && el.env.editor instanceof Editor)\n        return el.env.editor;\n\n    var doc = exports.createEditSession(dom.getInnerText(el));\n    el.innerHTML = '';\n\n    var editor = new Editor(new Renderer(el));\n    new MultiSelect(editor);\n    editor.setSession(doc);\n\n    var env = {\n        document: doc,\n        editor: editor,\n        onResize: editor.resize.bind(editor, null)\n    };\n    event.addListener(window, \"resize\", env.onResize);\n    editor.on(\"destroy\", function() {\n        event.removeListener(window, \"resize\", env.onResize);\n    });\n    el.env = editor.env = env;\n    return editor;\n};\nexports.createEditSession = function(text, mode) {\n    var doc = new EditSession(text, mode);\n    doc.setUndoManager(new UndoManager());\n    return doc;\n}\nexports.EditSession = EditSession;\nexports.UndoManager = UndoManager;\n});\n\ndefine('ace/lib/fixoldbrowsers', ['require', 'exports', 'module' , 'ace/lib/regexp', 'ace/lib/es5-shim'], function(require, exports, module) {\n\n\nrequire(\"./regexp\");\nrequire(\"./es5-shim\");\n\n});\n \ndefine('ace/lib/regexp', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n    var real = {\n            exec: RegExp.prototype.exec,\n            test: RegExp.prototype.test,\n            match: String.prototype.match,\n            replace: String.prototype.replace,\n            split: String.prototype.split\n        },\n        compliantExecNpcg = real.exec.call(/()??/, \"\")[1] === undefined, // check `exec` handling of nonparticipating capturing groups\n        compliantLastIndexIncrement = function () {\n            var x = /^/g;\n            real.test.call(x, \"\");\n            return !x.lastIndex;\n        }();\n\n    if (compliantLastIndexIncrement && compliantExecNpcg)\n        return;\n    RegExp.prototype.exec = function (str) {\n        var match = real.exec.apply(this, arguments),\n            name, r2;\n        if ( typeof(str) == 'string' && match) {\n            if (!compliantExecNpcg && match.length > 1 && indexOf(match, \"\") > -1) {\n                r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), \"g\", \"\"));\n                real.replace.call(str.slice(match.index), r2, function () {\n                    for (var i = 1; i < arguments.length - 2; i++) {\n                        if (arguments[i] === undefined)\n                            match[i] = undefined;\n                    }\n                });\n            }\n            if (this._xregexp && this._xregexp.captureNames) {\n                for (var i = 1; i < match.length; i++) {\n                    name = this._xregexp.captureNames[i - 1];\n                    if (name)\n                       match[name] = match[i];\n                }\n            }\n            if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))\n                this.lastIndex--;\n        }\n        return match;\n    };\n    if (!compliantLastIndexIncrement) {\n        RegExp.prototype.test = function (str) {\n            var match = real.exec.call(this, str);\n            if (match && this.global && !match[0].length && (this.lastIndex > match.index))\n                this.lastIndex--;\n            return !!match;\n        };\n    }\n\n    function getNativeFlags (regex) {\n        return (regex.global     ? \"g\" : \"\") +\n               (regex.ignoreCase ? \"i\" : \"\") +\n               (regex.multiline  ? \"m\" : \"\") +\n               (regex.extended   ? \"x\" : \"\") + // Proposed for ES4; included in AS3\n               (regex.sticky     ? \"y\" : \"\");\n    }\n\n    function indexOf (array, item, from) {\n        if (Array.prototype.indexOf) // Use the native array method if available\n            return array.indexOf(item, from);\n        for (var i = from || 0; i < array.length; i++) {\n            if (array[i] === item)\n                return i;\n        }\n        return -1;\n    }\n\n});\n\ndefine('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) {\n\nfunction Empty() {}\n\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function bind(that) { // .length is 1\n        var target = this;\n        if (typeof target != \"function\") {\n            throw new TypeError(\"Function.prototype.bind called on incompatible \" + target);\n        }\n        var args = slice.call(arguments, 1); // for normal call\n        var bound = function () {\n\n            if (this instanceof bound) {\n\n                var result = target.apply(\n                    this,\n                    args.concat(slice.call(arguments))\n                );\n                if (Object(result) === result) {\n                    return result;\n                }\n                return this;\n\n            } else {\n                return target.apply(\n                    that,\n                    args.concat(slice.call(arguments))\n                );\n\n            }\n\n        };\n        if(target.prototype) {\n            Empty.prototype = target.prototype;\n            bound.prototype = new Empty();\n            Empty.prototype = null;\n        }\n        return bound;\n    };\n}\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar _toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n    defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n    defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n    lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n    lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\nif ([1,2].splice(0).length != 2) {\n    if(function() { // test IE < 9 to splice bug - see issue #138\n        function makeArray(l) {\n            var a = new Array(l+2);\n            a[0] = a[1] = 0;\n            return a;\n        }\n        var array = [], lengthBefore;\n        \n        array.splice.apply(array, makeArray(20));\n        array.splice.apply(array, makeArray(26));\n\n        lengthBefore = array.length; //46\n        array.splice(5, 0, \"XXX\"); // add one element\n\n        lengthBefore + 1 == array.length\n\n        if (lengthBefore + 1 == array.length) {\n            return true;// has right splice implementation without bugs\n        }\n    }()) {//IE 6/7\n        var array_splice = Array.prototype.splice;\n        Array.prototype.splice = function(start, deleteCount) {\n            if (!arguments.length) {\n                return [];\n            } else {\n                return array_splice.apply(this, [\n                    start === void 0 ? 0 : start,\n                    deleteCount === void 0 ? (this.length - start) : deleteCount\n                ].concat(slice.call(arguments, 2)))\n            }\n        };\n    } else {//IE8\n        Array.prototype.splice = function(pos, removeCount){\n            var length = this.length;\n            if (pos > 0) {\n                if (pos > length)\n                    pos = length;\n            } else if (pos == void 0) {\n                pos = 0;\n            } else if (pos < 0) {\n                pos = Math.max(length + pos, 0);\n            }\n\n            if (!(pos+removeCount < length))\n                removeCount = length - pos;\n\n            var removed = this.slice(pos, pos+removeCount);\n            var insert = slice.call(arguments, 2);\n            var add = insert.length;            \n            if (pos === length) {\n                if (add) {\n                    this.push.apply(this, insert);\n                }\n            } else {\n                var remove = Math.min(removeCount, length - pos);\n                var tailOldPos = pos + remove;\n                var tailNewPos = tailOldPos + add - remove;\n                var tailCount = length - tailOldPos;\n                var lengthAfterRemove = length - remove;\n\n                if (tailNewPos < tailOldPos) { // case A\n                    for (var i = 0; i < tailCount; ++i) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } else if (tailNewPos > tailOldPos) { // case B\n                    for (i = tailCount; i--; ) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } // else, add == remove (nothing to do)\n\n                if (add && pos === lengthAfterRemove) {\n                    this.length = lengthAfterRemove; // truncate array\n                    this.push.apply(this, insert);\n                } else {\n                    this.length = lengthAfterRemove + add; // reserves space\n                    for (i = 0; i < add; ++i) {\n                        this[pos+i] = insert[i];\n                    }\n                }\n            }\n            return removed;\n        };\n    }\n}\nif (!Array.isArray) {\n    Array.isArray = function isArray(obj) {\n        return _toString(obj) == \"[object Array]\";\n    };\n}\nvar boxedString = Object(\"a\"),\n    splitString = boxedString[0] != \"a\" || !(0 in boxedString);\n\nif (!Array.prototype.forEach) {\n    Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            thisp = arguments[1],\n            i = -1,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        while (++i < length) {\n            if (i in self) {\n                fun.call(thisp, self[i], i, object);\n            }\n        }\n    };\n}\nif (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            result = Array(length),\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self)\n                result[i] = fun.call(thisp, self[i], i, object);\n        }\n        return result;\n    };\n}\nif (!Array.prototype.filter) {\n    Array.prototype.filter = function filter(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                    object,\n            length = self.length >>> 0,\n            result = [],\n            value,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self) {\n                value = self[i];\n                if (fun.call(thisp, value, i, object)) {\n                    result.push(value);\n                }\n            }\n        }\n        return result;\n    };\n}\nif (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && !fun.call(thisp, self[i], i, object)) {\n                return false;\n            }\n        }\n        return true;\n    };\n}\nif (!Array.prototype.some) {\n    Array.prototype.some = function some(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, object)) {\n                return true;\n            }\n        }\n        return false;\n    };\n}\nif (!Array.prototype.reduce) {\n    Array.prototype.reduce = function reduce(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduce of empty array with no initial value\");\n        }\n\n        var i = 0;\n        var result;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i++];\n                    break;\n                }\n                if (++i >= length) {\n                    throw new TypeError(\"reduce of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        for (; i < length; i++) {\n            if (i in self) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        }\n\n        return result;\n    };\n}\nif (!Array.prototype.reduceRight) {\n    Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduceRight of empty array with no initial value\");\n        }\n\n        var result, i = length - 1;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i--];\n                    break;\n                }\n                if (--i < 0) {\n                    throw new TypeError(\"reduceRight of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        do {\n            if (i in this) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        } while (i--);\n\n        return result;\n    };\n}\nif (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {\n    Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n\n        var i = 0;\n        if (arguments.length > 1) {\n            i = toInteger(arguments[1]);\n        }\n        i = i >= 0 ? i : Math.max(0, length + i);\n        for (; i < length; i++) {\n            if (i in self && self[i] === sought) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {\n    Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n        var i = length - 1;\n        if (arguments.length > 1) {\n            i = Math.min(i, toInteger(arguments[1]));\n        }\n        i = i >= 0 ? i : length - Math.abs(i);\n        for (; i >= 0; i--) {\n            if (i in self && sought === self[i]) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Object.getPrototypeOf) {\n    Object.getPrototypeOf = function getPrototypeOf(object) {\n        return object.__proto__ || (\n            object.constructor ?\n            object.constructor.prototype :\n            prototypeOfObject\n        );\n    };\n}\nif (!Object.getOwnPropertyDescriptor) {\n    var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n                         \"non-object: \";\n    Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT + object);\n        if (!owns(object, property))\n            return;\n\n        var descriptor, getter, setter;\n        descriptor =  { enumerable: true, configurable: true };\n        if (supportsAccessors) {\n            var prototype = object.__proto__;\n            object.__proto__ = prototypeOfObject;\n\n            var getter = lookupGetter(object, property);\n            var setter = lookupSetter(object, property);\n            object.__proto__ = prototype;\n\n            if (getter || setter) {\n                if (getter) descriptor.get = getter;\n                if (setter) descriptor.set = setter;\n                return descriptor;\n            }\n        }\n        descriptor.value = object[property];\n        return descriptor;\n    };\n}\nif (!Object.getOwnPropertyNames) {\n    Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n        return Object.keys(object);\n    };\n}\nif (!Object.create) {\n    var createEmpty;\n    if (Object.prototype.__proto__ === null) {\n        createEmpty = function () {\n            return { \"__proto__\": null };\n        };\n    } else {\n        createEmpty = function () {\n            var empty = {};\n            for (var i in empty)\n                empty[i] = null;\n            empty.constructor =\n            empty.hasOwnProperty =\n            empty.propertyIsEnumerable =\n            empty.isPrototypeOf =\n            empty.toLocaleString =\n            empty.toString =\n            empty.valueOf =\n            empty.__proto__ = null;\n            return empty;\n        }\n    }\n\n    Object.create = function create(prototype, properties) {\n        var object;\n        if (prototype === null) {\n            object = createEmpty();\n        } else {\n            if (typeof prototype != \"object\")\n                throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n            var Type = function () {};\n            Type.prototype = prototype;\n            object = new Type();\n            object.__proto__ = prototype;\n        }\n        if (properties !== void 0)\n            Object.defineProperties(object, properties);\n        return object;\n    };\n}\n\nfunction doesDefinePropertyWork(object) {\n    try {\n        Object.defineProperty(object, \"sentinel\", {});\n        return \"sentinel\" in object;\n    } catch (exception) {\n    }\n}\nif (Object.defineProperty) {\n    var definePropertyWorksOnObject = doesDefinePropertyWork({});\n    var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n        doesDefinePropertyWork(document.createElement(\"div\"));\n    if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n        var definePropertyFallback = Object.defineProperty;\n    }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n    var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n    var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n    var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n                                      \"on this javascript engine\";\n\n    Object.defineProperty = function defineProperty(object, property, descriptor) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n        if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n            throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n        if (definePropertyFallback) {\n            try {\n                return definePropertyFallback.call(Object, object, property, descriptor);\n            } catch (exception) {\n            }\n        }\n        if (owns(descriptor, \"value\")) {\n\n            if (supportsAccessors && (lookupGetter(object, property) ||\n                                      lookupSetter(object, property)))\n            {\n                var prototype = object.__proto__;\n                object.__proto__ = prototypeOfObject;\n                delete object[property];\n                object[property] = descriptor.value;\n                object.__proto__ = prototype;\n            } else {\n                object[property] = descriptor.value;\n            }\n        } else {\n            if (!supportsAccessors)\n                throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n            if (owns(descriptor, \"get\"))\n                defineGetter(object, property, descriptor.get);\n            if (owns(descriptor, \"set\"))\n                defineSetter(object, property, descriptor.set);\n        }\n\n        return object;\n    };\n}\nif (!Object.defineProperties) {\n    Object.defineProperties = function defineProperties(object, properties) {\n        for (var property in properties) {\n            if (owns(properties, property))\n                Object.defineProperty(object, property, properties[property]);\n        }\n        return object;\n    };\n}\nif (!Object.seal) {\n    Object.seal = function seal(object) {\n        return object;\n    };\n}\nif (!Object.freeze) {\n    Object.freeze = function freeze(object) {\n        return object;\n    };\n}\ntry {\n    Object.freeze(function () {});\n} catch (exception) {\n    Object.freeze = (function freeze(freezeObject) {\n        return function freeze(object) {\n            if (typeof object == \"function\") {\n                return object;\n            } else {\n                return freezeObject(object);\n            }\n        };\n    })(Object.freeze);\n}\nif (!Object.preventExtensions) {\n    Object.preventExtensions = function preventExtensions(object) {\n        return object;\n    };\n}\nif (!Object.isSealed) {\n    Object.isSealed = function isSealed(object) {\n        return false;\n    };\n}\nif (!Object.isFrozen) {\n    Object.isFrozen = function isFrozen(object) {\n        return false;\n    };\n}\nif (!Object.isExtensible) {\n    Object.isExtensible = function isExtensible(object) {\n        if (Object(object) === object) {\n            throw new TypeError(); // TODO message\n        }\n        var name = '';\n        while (owns(object, name)) {\n            name += '?';\n        }\n        object[name] = true;\n        var returnValue = owns(object, name);\n        delete object[name];\n        return returnValue;\n    };\n}\nif (!Object.keys) {\n    var hasDontEnumBug = true,\n        dontEnums = [\n            \"toString\",\n            \"toLocaleString\",\n            \"valueOf\",\n            \"hasOwnProperty\",\n            \"isPrototypeOf\",\n            \"propertyIsEnumerable\",\n            \"constructor\"\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    for (var key in {\"toString\": null}) {\n        hasDontEnumBug = false;\n    }\n\n    Object.keys = function keys(object) {\n\n        if (\n            (typeof object != \"object\" && typeof object != \"function\") ||\n            object === null\n        ) {\n            throw new TypeError(\"Object.keys called on a non-object\");\n        }\n\n        var keys = [];\n        for (var name in object) {\n            if (owns(object, name)) {\n                keys.push(name);\n            }\n        }\n\n        if (hasDontEnumBug) {\n            for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n                var dontEnum = dontEnums[i];\n                if (owns(object, dontEnum)) {\n                    keys.push(dontEnum);\n                }\n            }\n        }\n        return keys;\n    };\n\n}\nif (!Date.now) {\n    Date.now = function now() {\n        return new Date().getTime();\n    };\n}\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n    \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n    \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n    ws = \"[\" + ws + \"]\";\n    var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n        trimEndRegexp = new RegExp(ws + ws + \"*$\");\n    String.prototype.trim = function trim() {\n        return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n    };\n}\n\nfunction toInteger(n) {\n    n = +n;\n    if (n !== n) { // isNaN\n        n = 0;\n    } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {\n        n = (n > 0 || -1) * Math.floor(Math.abs(n));\n    }\n    return n;\n}\n\nfunction isPrimitive(input) {\n    var type = typeof input;\n    return (\n        input === null ||\n        type === \"undefined\" ||\n        type === \"boolean\" ||\n        type === \"number\" ||\n        type === \"string\"\n    );\n}\n\nfunction toPrimitive(input) {\n    var val, valueOf, toString;\n    if (isPrimitive(input)) {\n        return input;\n    }\n    valueOf = input.valueOf;\n    if (typeof valueOf === \"function\") {\n        val = valueOf.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    toString = input.toString;\n    if (typeof toString === \"function\") {\n        val = toString.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    throw new TypeError();\n}\nvar toObject = function (o) {\n    if (o == null) { // this matches both null and undefined\n        throw new TypeError(\"can't convert \"+o+\" to object\");\n    }\n    return Object(o);\n};\n\n});\n\ndefine('ace/lib/dom', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nif (typeof document == \"undefined\")\n    return;\n\nvar XHTML_NS = \"http://www.w3.org/1999/xhtml\";\n\nexports.getDocumentHead = function(doc) {\n    if (!doc)\n        doc = document;\n    return doc.head || doc.getElementsByTagName(\"head\")[0] || doc.documentElement;\n}\n\nexports.createElement = function(tag, ns) {\n    return document.createElementNS ?\n           document.createElementNS(ns || XHTML_NS, tag) :\n           document.createElement(tag);\n};\n\nexports.hasCssClass = function(el, name) {\n    var classes = el.className.split(/\\s+/g);\n    return classes.indexOf(name) !== -1;\n};\nexports.addCssClass = function(el, name) {\n    if (!exports.hasCssClass(el, name)) {\n        el.className += \" \" + name;\n    }\n};\nexports.removeCssClass = function(el, name) {\n    var classes = el.className.split(/\\s+/g);\n    while (true) {\n        var index = classes.indexOf(name);\n        if (index == -1) {\n            break;\n        }\n        classes.splice(index, 1);\n    }\n    el.className = classes.join(\" \");\n};\n\nexports.toggleCssClass = function(el, name) {\n    var classes = el.className.split(/\\s+/g), add = true;\n    while (true) {\n        var index = classes.indexOf(name);\n        if (index == -1) {\n            break;\n        }\n        add = false;\n        classes.splice(index, 1);\n    }\n    if(add)\n        classes.push(name);\n\n    el.className = classes.join(\" \");\n    return add;\n};\nexports.setCssClass = function(node, className, include) {\n    if (include) {\n        exports.addCssClass(node, className);\n    } else {\n        exports.removeCssClass(node, className);\n    }\n};\n\nexports.hasCssString = function(id, doc) {\n    var index = 0, sheets;\n    doc = doc || document;\n\n    if (doc.createStyleSheet && (sheets = doc.styleSheets)) {\n        while (index < sheets.length)\n            if (sheets[index++].owningElement.id === id) return true;\n    } else if ((sheets = doc.getElementsByTagName(\"style\"))) {\n        while (index < sheets.length)\n            if (sheets[index++].id === id) return true;\n    }\n\n    return false;\n};\n\nexports.importCssString = function importCssString(cssText, id, doc) {\n    doc = doc || document;\n    if (id && exports.hasCssString(id, doc))\n        return null;\n    \n    var style;\n    \n    if (doc.createStyleSheet) {\n        style = doc.createStyleSheet();\n        style.cssText = cssText;\n        if (id)\n            style.owningElement.id = id;\n    } else {\n        style = doc.createElementNS\n            ? doc.createElementNS(XHTML_NS, \"style\")\n            : doc.createElement(\"style\");\n\n        style.appendChild(doc.createTextNode(cssText));\n        if (id)\n            style.id = id;\n\n        exports.getDocumentHead(doc).appendChild(style);\n    }\n};\n\nexports.importCssStylsheet = function(uri, doc) {\n    if (doc.createStyleSheet) {\n        doc.createStyleSheet(uri);\n    } else {\n        var link = exports.createElement('link');\n        link.rel = 'stylesheet';\n        link.href = uri;\n\n        exports.getDocumentHead(doc).appendChild(link);\n    }\n};\n\nexports.getInnerWidth = function(element) {\n    return (\n        parseInt(exports.computedStyle(element, \"paddingLeft\"), 10) +\n        parseInt(exports.computedStyle(element, \"paddingRight\"), 10) + \n        element.clientWidth\n    );\n};\n\nexports.getInnerHeight = function(element) {\n    return (\n        parseInt(exports.computedStyle(element, \"paddingTop\"), 10) +\n        parseInt(exports.computedStyle(element, \"paddingBottom\"), 10) +\n        element.clientHeight\n    );\n};\n\nif (window.pageYOffset !== undefined) {\n    exports.getPageScrollTop = function() {\n        return window.pageYOffset;\n    };\n\n    exports.getPageScrollLeft = function() {\n        return window.pageXOffset;\n    };\n}\nelse {\n    exports.getPageScrollTop = function() {\n        return document.body.scrollTop;\n    };\n\n    exports.getPageScrollLeft = function() {\n        return document.body.scrollLeft;\n    };\n}\n\nif (window.getComputedStyle)\n    exports.computedStyle = function(element, style) {\n        if (style)\n            return (window.getComputedStyle(element, \"\") || {})[style] || \"\";\n        return window.getComputedStyle(element, \"\") || {};\n    };\nelse\n    exports.computedStyle = function(element, style) {\n        if (style)\n            return element.currentStyle[style];\n        return element.currentStyle;\n    };\n\nexports.scrollbarWidth = function(document) {\n    var inner = exports.createElement(\"ace_inner\");\n    inner.style.width = \"100%\";\n    inner.style.minWidth = \"0px\";\n    inner.style.height = \"200px\";\n    inner.style.display = \"block\";\n\n    var outer = exports.createElement(\"ace_outer\");\n    var style = outer.style;\n\n    style.position = \"absolute\";\n    style.left = \"-10000px\";\n    style.overflow = \"hidden\";\n    style.width = \"200px\";\n    style.minWidth = \"0px\";\n    style.height = \"150px\";\n    style.display = \"block\";\n\n    outer.appendChild(inner);\n\n    var body = document.documentElement;\n    body.appendChild(outer);\n\n    var noScrollbar = inner.offsetWidth;\n\n    style.overflow = \"scroll\";\n    var withScrollbar = inner.offsetWidth;\n\n    if (noScrollbar == withScrollbar) {\n        withScrollbar = outer.clientWidth;\n    }\n\n    body.removeChild(outer);\n\n    return noScrollbar-withScrollbar;\n};\nexports.setInnerHtml = function(el, innerHtml) {\n    var element = el.cloneNode(false);//document.createElement(\"div\");\n    element.innerHTML = innerHtml;\n    el.parentNode.replaceChild(element, el);\n    return element;\n};\n\nif (\"textContent\" in document.documentElement) {\n    exports.setInnerText = function(el, innerText) {\n        el.textContent = innerText;\n    };\n\n    exports.getInnerText = function(el) {\n        return el.textContent;\n    };\n}\nelse {\n    exports.setInnerText = function(el, innerText) {\n        el.innerText = innerText;\n    };\n\n    exports.getInnerText = function(el) {\n        return el.innerText;\n    };\n}\n\nexports.getParentWindow = function(document) {\n    return document.defaultView || document.parentWindow;\n};\n\n});\n\ndefine('ace/lib/event', ['require', 'exports', 'module' , 'ace/lib/keys', 'ace/lib/useragent', 'ace/lib/dom'], function(require, exports, module) {\n\n\nvar keys = require(\"./keys\");\nvar useragent = require(\"./useragent\");\nvar dom = require(\"./dom\");\n\nexports.addListener = function(elem, type, callback) {\n    if (elem.addEventListener) {\n        return elem.addEventListener(type, callback, false);\n    }\n    if (elem.attachEvent) {\n        var wrapper = function() {\n            callback.call(elem, window.event);\n        };\n        callback._wrapper = wrapper;\n        elem.attachEvent(\"on\" + type, wrapper);\n    }\n};\n\nexports.removeListener = function(elem, type, callback) {\n    if (elem.removeEventListener) {\n        return elem.removeEventListener(type, callback, false);\n    }\n    if (elem.detachEvent) {\n        elem.detachEvent(\"on\" + type, callback._wrapper || callback);\n    }\n};\nexports.stopEvent = function(e) {\n    exports.stopPropagation(e);\n    exports.preventDefault(e);\n    return false;\n};\n\nexports.stopPropagation = function(e) {\n    if (e.stopPropagation)\n        e.stopPropagation();\n    else\n        e.cancelBubble = true;\n};\n\nexports.preventDefault = function(e) {\n    if (e.preventDefault)\n        e.preventDefault();\n    else\n        e.returnValue = false;\n};\nexports.getButton = function(e) {\n    if (e.type == \"dblclick\")\n        return 0;\n    if (e.type == \"contextmenu\" || (e.ctrlKey && useragent.isMac))\n        return 2;\n    if (e.preventDefault) {\n        return e.button;\n    }\n    else {\n        return {1:0, 2:2, 4:1}[e.button];\n    }\n};\n\nexports.capture = function(el, eventHandler, releaseCaptureHandler) {\n    function onMouseUp(e) {\n        eventHandler && eventHandler(e);\n        releaseCaptureHandler && releaseCaptureHandler(e);\n\n        exports.removeListener(document, \"mousemove\", eventHandler, true);\n        exports.removeListener(document, \"mouseup\", onMouseUp, true);\n        exports.removeListener(document, \"dragstart\", onMouseUp, true);\n    }\n\n    exports.addListener(document, \"mousemove\", eventHandler, true);\n    exports.addListener(document, \"mouseup\", onMouseUp, true);\n    exports.addListener(document, \"dragstart\", onMouseUp, true);\n};\n\nexports.addMouseWheelListener = function(el, callback) {\n    if (\"onmousewheel\" in el) {\n        var factor = 8;\n        exports.addListener(el, \"mousewheel\", function(e) {\n            if (e.wheelDeltaX !== undefined) {\n                e.wheelX = -e.wheelDeltaX / factor;\n                e.wheelY = -e.wheelDeltaY / factor;\n            } else {\n                e.wheelX = 0;\n                e.wheelY = -e.wheelDelta / factor;\n            }\n            callback(e);\n        });\n    } else if (\"onwheel\" in el) {\n        exports.addListener(el, \"wheel\",  function(e) {\n            e.wheelX = (e.deltaX || 0) * 5;\n            e.wheelY = (e.deltaY || 0) * 5;\n            callback(e);\n        });\n    } else {\n        exports.addListener(el, \"DOMMouseScroll\", function(e) {\n            if (e.axis && e.axis == e.HORIZONTAL_AXIS) {\n                e.wheelX = (e.detail || 0) * 5;\n                e.wheelY = 0;\n            } else {\n                e.wheelX = 0;\n                e.wheelY = (e.detail || 0) * 5;\n            }\n            callback(e);\n        });\n    }\n};\n\nexports.addMultiMouseDownListener = function(el, timeouts, eventHandler, callbackName) {\n    var clicks = 0;\n    var startX, startY, timer;\n    var eventNames = {\n        2: \"dblclick\",\n        3: \"tripleclick\",\n        4: \"quadclick\"\n    };\n\n    exports.addListener(el, \"mousedown\", function(e) {\n        if (exports.getButton(e) != 0) {\n            clicks = 0;\n        } else if (e.detail > 1) {\n            clicks++;\n            if (clicks > 4)\n                clicks = 1;\n        } else {\n            clicks = 1;\n        }\n        if (useragent.isIE) {\n            var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5;\n            if (isNewClick) {\n                clicks = 1;\n            }\n            if (clicks == 1) {\n                startX = e.clientX;\n                startY = e.clientY;\n            }\n        }\n\n        eventHandler[callbackName](\"mousedown\", e);\n\n        if (clicks > 4)\n            clicks = 0;\n        else if (clicks > 1)\n            return eventHandler[callbackName](eventNames[clicks], e);\n    });\n\n    if (useragent.isOldIE) {\n        exports.addListener(el, \"dblclick\", function(e) {\n            clicks = 2;\n            if (timer)\n                clearTimeout(timer);\n            timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600);\n            eventHandler[callbackName](\"mousedown\", e);\n            eventHandler[callbackName](eventNames[clicks], e);\n        });\n    }\n};\n\nfunction normalizeCommandKeys(callback, e, keyCode) {\n    var hashId = 0;\n    if ((useragent.isOpera && !(\"KeyboardEvent\" in window)) && useragent.isMac) {\n        hashId = 0 | (e.metaKey ? 1 : 0) | (e.altKey ? 2 : 0)\n            | (e.shiftKey ? 4 : 0) | (e.ctrlKey ? 8 : 0);\n    } else {\n        hashId = 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0)\n            | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0);\n    }\n\n    if (!useragent.isMac && pressedKeys) {\n        if (pressedKeys[91] || pressedKeys[92])\n            hashId |= 8;\n        if (pressedKeys.altGr) {\n            if ((3 & hashId) != 3)\n                pressedKeys.altGr = 0\n            else\n                return;\n        }\n        if (keyCode === 18 || keyCode === 17) {\n            var location = e.location || e.keyLocation;\n            if (keyCode === 17 && location === 1) {\n                ts = e.timeStamp;\n            } else if (keyCode === 18 && hashId === 3 && location === 2) {\n                var dt = -ts;\n                ts = e.timeStamp;\n                dt += ts;\n                if (dt < 3)\n                    pressedKeys.altGr = true;\n            }\n        }\n    }\n    \n    if (keyCode in keys.MODIFIER_KEYS) {\n        switch (keys.MODIFIER_KEYS[keyCode]) {\n            case \"Alt\":\n                hashId = 2;\n                break;\n            case \"Shift\":\n                hashId = 4;\n                break;\n            case \"Ctrl\":\n                hashId = 1;\n                break;\n            default:\n                hashId = 8;\n                break;\n        }\n        keyCode = 0;\n    }\n\n    if (hashId & 8 && (keyCode === 91 || keyCode === 93)) {\n        keyCode = 0;\n    }\n    \n    if (!hashId && keyCode === 13) {\n        if (e.location || e.keyLocation === 3) {\n            callback(e, hashId, -keyCode)\n            if (e.defaultPrevented)\n                return;\n        }\n    }\n    if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) {\n        return false;\n    }\n    \n    \n    \n    return callback(e, hashId, keyCode);\n}\n\nvar pressedKeys = null;\nvar ts = 0;\nexports.addCommandKeyListener = function(el, callback) {\n    var addListener = exports.addListener;\n    if (useragent.isOldGecko || (useragent.isOpera && !(\"KeyboardEvent\" in window))) {\n        var lastKeyDownKeyCode = null;\n        addListener(el, \"keydown\", function(e) {\n            lastKeyDownKeyCode = e.keyCode;\n        });\n        addListener(el, \"keypress\", function(e) {\n            return normalizeCommandKeys(callback, e, lastKeyDownKeyCode);\n        });\n    } else {\n        var lastDefaultPrevented = null;\n\n        addListener(el, \"keydown\", function(e) {\n            pressedKeys[e.keyCode] = true;\n            var result = normalizeCommandKeys(callback, e, e.keyCode);\n            lastDefaultPrevented = e.defaultPrevented;\n            return result;\n        });\n\n        addListener(el, \"keypress\", function(e) {\n            if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) {\n                exports.stopEvent(e);\n                lastDefaultPrevented = null;\n            }\n        });\n\n        addListener(el, \"keyup\", function(e) {\n            pressedKeys[e.keyCode] = null;\n        });\n\n        if (!pressedKeys) {\n            pressedKeys = Object.create(null);\n            addListener(window, \"focus\", function(e) {\n                pressedKeys = Object.create(null);\n            });\n        }\n    }\n};\n\nif (window.postMessage && !useragent.isOldIE) {\n    var postMessageId = 1;\n    exports.nextTick = function(callback, win) {\n        win = win || window;\n        var messageName = \"zero-timeout-message-\" + postMessageId;\n        exports.addListener(win, \"message\", function listener(e) {\n            if (e.data == messageName) {\n                exports.stopPropagation(e);\n                exports.removeListener(win, \"message\", listener);\n                callback();\n            }\n        });\n        win.postMessage(messageName, \"*\");\n    };\n}\n\n\nexports.nextFrame = window.requestAnimationFrame ||\n    window.mozRequestAnimationFrame ||\n    window.webkitRequestAnimationFrame ||\n    window.msRequestAnimationFrame ||\n    window.oRequestAnimationFrame;\n\nif (exports.nextFrame)\n    exports.nextFrame = exports.nextFrame.bind(window);\nelse\n    exports.nextFrame = function(callback) {\n        setTimeout(callback, 17);\n    };\n});\n\ndefine('ace/lib/keys', ['require', 'exports', 'module' , 'ace/lib/oop'], function(require, exports, module) {\n\n\nvar oop = require(\"./oop\");\nvar Keys = (function() {\n    var ret = {\n        MODIFIER_KEYS: {\n            16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta'\n        },\n\n        KEY_MODS: {\n            \"ctrl\": 1, \"alt\": 2, \"option\" : 2,\n            \"shift\": 4, \"meta\": 8, \"command\": 8, \"cmd\": 8\n        },\n\n        FUNCTION_KEYS : {\n            8  : \"Backspace\",\n            9  : \"Tab\",\n            13 : \"Return\",\n            19 : \"Pause\",\n            27 : \"Esc\",\n            32 : \"Space\",\n            33 : \"PageUp\",\n            34 : \"PageDown\",\n            35 : \"End\",\n            36 : \"Home\",\n            37 : \"Left\",\n            38 : \"Up\",\n            39 : \"Right\",\n            40 : \"Down\",\n            44 : \"Print\",\n            45 : \"Insert\",\n            46 : \"Delete\",\n            96 : \"Numpad0\",\n            97 : \"Numpad1\",\n            98 : \"Numpad2\",\n            99 : \"Numpad3\",\n            100: \"Numpad4\",\n            101: \"Numpad5\",\n            102: \"Numpad6\",\n            103: \"Numpad7\",\n            104: \"Numpad8\",\n            105: \"Numpad9\",\n            '-13': \"NumpadEnter\",\n            112: \"F1\",\n            113: \"F2\",\n            114: \"F3\",\n            115: \"F4\",\n            116: \"F5\",\n            117: \"F6\",\n            118: \"F7\",\n            119: \"F8\",\n            120: \"F9\",\n            121: \"F10\",\n            122: \"F11\",\n            123: \"F12\",\n            144: \"Numlock\",\n            145: \"Scrolllock\"\n        },\n\n        PRINTABLE_KEYS: {\n           32: ' ',  48: '0',  49: '1',  50: '2',  51: '3',  52: '4', 53:  '5',\n           54: '6',  55: '7',  56: '8',  57: '9',  59: ';',  61: '=', 65:  'a',\n           66: 'b',  67: 'c',  68: 'd',  69: 'e',  70: 'f',  71: 'g', 72:  'h',\n           73: 'i',  74: 'j',  75: 'k',  76: 'l',  77: 'm',  78: 'n', 79:  'o',\n           80: 'p',  81: 'q',  82: 'r',  83: 's',  84: 't',  85: 'u', 86:  'v',\n           87: 'w',  88: 'x',  89: 'y',  90: 'z', 107: '+', 109: '-', 110: '.',\n          188: ',', 190: '.', 191: '/', 192: '`', 219: '[', 220: '\\\\',\n          221: ']', 222: '\\''\n        }\n    };\n    for (var i in ret.FUNCTION_KEYS) {\n        var name = ret.FUNCTION_KEYS[i].toLowerCase();\n        ret[name] = parseInt(i, 10);\n    }\n    oop.mixin(ret, ret.MODIFIER_KEYS);\n    oop.mixin(ret, ret.PRINTABLE_KEYS);\n    oop.mixin(ret, ret.FUNCTION_KEYS);\n    ret.enter = ret[\"return\"];\n    ret.escape = ret.esc;\n    ret.del = ret[\"delete\"];\n    ret[173] = '-';\n\n    return ret;\n})();\noop.mixin(exports, Keys);\n\nexports.keyCodeToString = function(keyCode) {\n    return (Keys[keyCode] || String.fromCharCode(keyCode)).toLowerCase();\n}\n\n});\n\ndefine('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nexports.inherits = (function() {\n    var createObject = Object.create || function(prototype, properties) {\n        var Type = function () {};\n        Type.prototype = prototype;\n        object = new Type();\n        object.__proto__ = prototype;\n        if (typeof properties !== 'undefined' && Object.defineProperties) {\n            Object.defineProperties(object, properties);\n        }\n    };\n    return function(ctor, superCtor) {\n        ctor.super_ = superCtor;\n        ctor.prototype = createObject(superCtor.prototype, {\n            constructor: {\n                value: ctor,\n                enumerable: false,\n                writable: true,\n                configurable: true\n            }\n        });\n    };\n}());\n\nexports.mixin = function(obj, mixin) {\n    for (var key in mixin) {\n        obj[key] = mixin[key];\n    }\n    return obj;\n};\n\nexports.implement = function(proto, mixin) {\n    exports.mixin(proto, mixin);\n};\n\n});\n\ndefine('ace/lib/useragent', ['require', 'exports', 'module' ], function(require, exports, module) {\nexports.OS = {\n    LINUX: \"LINUX\",\n    MAC: \"MAC\",\n    WINDOWS: \"WINDOWS\"\n};\nexports.getOS = function() {\n    if (exports.isMac) {\n        return exports.OS.MAC;\n    } else if (exports.isLinux) {\n        return exports.OS.LINUX;\n    } else {\n        return exports.OS.WINDOWS;\n    }\n};\nif (typeof navigator != \"object\")\n    return;\n\nvar os = (navigator.platform.match(/mac|win|linux/i) || [\"other\"])[0].toLowerCase();\nvar ua = navigator.userAgent;\nexports.isWin = (os == \"win\");\nexports.isMac = (os == \"mac\");\nexports.isLinux = (os == \"linux\");\nexports.isIE = \n    (navigator.appName == \"Microsoft Internet Explorer\" || navigator.appName.indexOf(\"MSAppHost\") >= 0)\n    && parseFloat(navigator.userAgent.match(/MSIE ([0-9]+[\\.0-9]+)/)[1]);\n    \nexports.isOldIE = exports.isIE && exports.isIE < 9;\nexports.isGecko = exports.isMozilla = window.controllers && window.navigator.product === \"Gecko\";\nexports.isOldGecko = exports.isGecko && parseInt((navigator.userAgent.match(/rv\\:(\\d+)/)||[])[1], 10) < 4;\nexports.isOpera = window.opera && Object.prototype.toString.call(window.opera) == \"[object Opera]\";\nexports.isWebKit = parseFloat(ua.split(\"WebKit/\")[1]) || undefined;\n\nexports.isChrome = parseFloat(ua.split(\" Chrome/\")[1]) || undefined;\n\nexports.isAIR = ua.indexOf(\"AdobeAIR\") >= 0;\n\nexports.isIPad = ua.indexOf(\"iPad\") >= 0;\n\nexports.isTouchPad = ua.indexOf(\"TouchPad\") >= 0;\n\n});\n\ndefine('ace/editor', ['require', 'exports', 'module' , 'ace/lib/fixoldbrowsers', 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/lang', 'ace/lib/useragent', 'ace/keyboard/textinput', 'ace/mouse/mouse_handler', 'ace/mouse/fold_handler', 'ace/keyboard/keybinding', 'ace/edit_session', 'ace/search', 'ace/range', 'ace/lib/event_emitter', 'ace/commands/command_manager', 'ace/commands/default_commands', 'ace/config'], function(require, exports, module) {\n\n\nrequire(\"./lib/fixoldbrowsers\");\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nvar lang = require(\"./lib/lang\");\nvar useragent = require(\"./lib/useragent\");\nvar TextInput = require(\"./keyboard/textinput\").TextInput;\nvar MouseHandler = require(\"./mouse/mouse_handler\").MouseHandler;\nvar FoldHandler = require(\"./mouse/fold_handler\").FoldHandler;\nvar KeyBinding = require(\"./keyboard/keybinding\").KeyBinding;\nvar EditSession = require(\"./edit_session\").EditSession;\nvar Search = require(\"./search\").Search;\nvar Range = require(\"./range\").Range;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar CommandManager = require(\"./commands/command_manager\").CommandManager;\nvar defaultCommands = require(\"./commands/default_commands\").commands;\nvar config = require(\"./config\");\nvar Editor = function(renderer, session) {\n    var container = renderer.getContainerElement();\n    this.container = container;\n    this.renderer = renderer;\n\n    this.commands = new CommandManager(useragent.isMac ? \"mac\" : \"win\", defaultCommands);\n    this.textInput  = new TextInput(renderer.getTextAreaContainer(), this);\n    this.renderer.textarea = this.textInput.getElement();\n    this.keyBinding = new KeyBinding(this);\n    this.$mouseHandler = new MouseHandler(this);\n    new FoldHandler(this);\n\n    this.$blockScrolling = 0;\n    this.$search = new Search().set({\n        wrap: true\n    });\n\n    this.$historyTracker = this.$historyTracker.bind(this);\n    this.commands.on(\"exec\", this.$historyTracker);\n\n    this.$initOperationListeners();\n    \n    this._$emitInputEvent = lang.delayedCall(function() {\n        this._signal(\"input\", {});\n        this.session.bgTokenizer && this.session.bgTokenizer.scheduleStart();\n    }.bind(this));\n    \n    this.on(\"change\", function(_, _self) {\n        _self._$emitInputEvent.schedule(31);\n    });\n\n    this.setSession(session || new EditSession(\"\"));\n    config.resetOptions(this);\n    config._emit(\"editor\", this);\n};\n\n(function(){\n\n    oop.implement(this, EventEmitter);\n\n    this.$initOperationListeners = function() {\n        function last(a) {return a[a.length - 1]};\n\n        this.selections = [];\n        this.commands.on(\"exec\", function(e) {\n            this.startOperation(e);\n\n            var command = e.command;\n            if (command.group == \"fileJump\") {\n                var prev = this.prevOp;\n                if (!prev || prev.command.group != \"fileJump\") {\n                    this.lastFileJumpPos = last(this.selections)\n                }\n            } else {\n                this.lastFileJumpPos = null;\n            }\n        }.bind(this), true);\n\n        this.commands.on(\"afterExec\", function(e) {\n            var command = e.command;\n\n            if (command.group == \"fileJump\") {\n                if (this.lastFileJumpPos && !this.curOp.selectionChanged) {\n                    this.selection.fromJSON(this.lastFileJumpPos);\n                    return\n                }\n            }\n            this.endOperation(e);\n        }.bind(this), true);\n\n        this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this));\n\n        this.on(\"change\", function() {\n            this.curOp || this.startOperation();\n            this.curOp.docChanged = true;\n        }.bind(this), true);\n\n        this.on(\"changeSelection\", function() {\n            this.curOp || this.startOperation();\n            this.curOp.selectionChanged = true;\n        }.bind(this), true);\n    }\n\n    this.curOp = null;\n    this.prevOp = {};\n    this.startOperation = function(commadEvent) {\n        if (this.curOp) {\n            if (!commadEvent || this.curOp.command)\n                return;\n            this.prevOp = this.curOp;\n        }\n        if (!commadEvent) {\n            this.previousCommand = null;\n            commadEvent = {};\n        }\n\n        this.$opResetTimer.schedule();\n        this.curOp = {\n            command: commadEvent.command || {},\n            args: commadEvent.args\n        };\n        \n        var command = this.curOp.command;\n        if (command && command.scrollIntoView)\n            this.$blockScrolling++;\n\n        this.selections.push(this.selection.toJSON());\n    };\n\n    this.endOperation = function() {\n        if (this.curOp) {\n            var command = this.curOp.command;\n            if (command && command.scrollIntoView) {\n                this.$blockScrolling--;\n                switch (command.scrollIntoView) {\n                    case \"center\":\n                        this.renderer.scrollCursorIntoView(null, 0.5);\n                        break;\n                    case \"cursor\":\n                        this.renderer.scrollCursorIntoView();\n                        break;\n                    case \"selectionPart\":\n                        this.renderer.scrollCursorIntoView();\n                        break;\n                    default:\n                        break;\n                }\n            }\n            this.prevOp = this.curOp;\n            this.curOp = null;\n        }\n    };\n\n    this.$historyTracker = function(e) {\n        if (!this.$mergeUndoDeltas)\n            return;\n\n\n        var prev = this.prevOp;\n        var mergeableCommands = [\"backspace\", \"del\", \"insertstring\"];\n        var shouldMerge = prev.command && (e.command.name == prev.command.name);\n        if (e.command.name == \"insertstring\") {\n            var text = e.args;\n            if (this.mergeNextCommand === undefined)\n                this.mergeNextCommand = true;\n\n            shouldMerge = shouldMerge\n                && this.mergeNextCommand // previous command allows to coalesce with\n                && (!/\\s/.test(text) || /\\s/.test(prev.args)) // previous insertion was of same type\n\n            this.mergeNextCommand = true;\n        } else {\n            shouldMerge = shouldMerge\n                && mergeableCommands.indexOf(e.command.name) !== -1// the command is mergeable\n        }\n\n        if (\n            this.$mergeUndoDeltas != \"always\"\n            && Date.now() - this.sequenceStartTime > 2000\n        ) {\n            shouldMerge = false; // the sequence is too long\n        }\n\n        if (shouldMerge)\n            this.session.mergeUndoDeltas = true;\n        else if (mergeableCommands.indexOf(e.command.name) !== -1)\n            this.sequenceStartTime = Date.now();\n    };\n    this.setKeyboardHandler = function(keyboardHandler) {\n        if (!keyboardHandler) {\n            this.keyBinding.setKeyboardHandler(null);\n        } else if (typeof keyboardHandler == \"string\") {\n            this.$keybindingId = keyboardHandler;\n            var _self = this;\n            config.loadModule([\"keybinding\", keyboardHandler], function(module) {\n                if (_self.$keybindingId == keyboardHandler)\n                    _self.keyBinding.setKeyboardHandler(module && module.handler);\n            });\n        } else {\n            this.$keybindingId = null;\n            this.keyBinding.setKeyboardHandler(keyboardHandler);\n        }\n    };\n    this.getKeyboardHandler = function() {\n        return this.keyBinding.getKeyboardHandler();\n    };\n    this.setSession = function(session) {\n        if (this.session == session)\n            return;\n\n        if (this.session) {\n            var oldSession = this.session;\n            this.session.removeEventListener(\"change\", this.$onDocumentChange);\n            this.session.removeEventListener(\"changeMode\", this.$onChangeMode);\n            this.session.removeEventListener(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n            this.session.removeEventListener(\"changeTabSize\", this.$onChangeTabSize);\n            this.session.removeEventListener(\"changeWrapLimit\", this.$onChangeWrapLimit);\n            this.session.removeEventListener(\"changeWrapMode\", this.$onChangeWrapMode);\n            this.session.removeEventListener(\"onChangeFold\", this.$onChangeFold);\n            this.session.removeEventListener(\"changeFrontMarker\", this.$onChangeFrontMarker);\n            this.session.removeEventListener(\"changeBackMarker\", this.$onChangeBackMarker);\n            this.session.removeEventListener(\"changeBreakpoint\", this.$onChangeBreakpoint);\n            this.session.removeEventListener(\"changeAnnotation\", this.$onChangeAnnotation);\n            this.session.removeEventListener(\"changeOverwrite\", this.$onCursorChange);\n            this.session.removeEventListener(\"changeScrollTop\", this.$onScrollTopChange);\n            this.session.removeEventListener(\"changeScrollLeft\", this.$onScrollLeftChange);\n\n            var selection = this.session.getSelection();\n            selection.removeEventListener(\"changeCursor\", this.$onCursorChange);\n            selection.removeEventListener(\"changeSelection\", this.$onSelectionChange);\n        }\n\n        this.session = session;\n\n        this.$onDocumentChange = this.onDocumentChange.bind(this);\n        session.addEventListener(\"change\", this.$onDocumentChange);\n        this.renderer.setSession(session);\n\n        this.$onChangeMode = this.onChangeMode.bind(this);\n        session.addEventListener(\"changeMode\", this.$onChangeMode);\n\n        this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this);\n        session.addEventListener(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n\n        this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer);\n        session.addEventListener(\"changeTabSize\", this.$onChangeTabSize);\n\n        this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this);\n        session.addEventListener(\"changeWrapLimit\", this.$onChangeWrapLimit);\n\n        this.$onChangeWrapMode = this.onChangeWrapMode.bind(this);\n        session.addEventListener(\"changeWrapMode\", this.$onChangeWrapMode);\n\n        this.$onChangeFold = this.onChangeFold.bind(this);\n        session.addEventListener(\"changeFold\", this.$onChangeFold);\n\n        this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this);\n        this.session.addEventListener(\"changeFrontMarker\", this.$onChangeFrontMarker);\n\n        this.$onChangeBackMarker = this.onChangeBackMarker.bind(this);\n        this.session.addEventListener(\"changeBackMarker\", this.$onChangeBackMarker);\n\n        this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this);\n        this.session.addEventListener(\"changeBreakpoint\", this.$onChangeBreakpoint);\n\n        this.$onChangeAnnotation = this.onChangeAnnotation.bind(this);\n        this.session.addEventListener(\"changeAnnotation\", this.$onChangeAnnotation);\n\n        this.$onCursorChange = this.onCursorChange.bind(this);\n        this.session.addEventListener(\"changeOverwrite\", this.$onCursorChange);\n\n        this.$onScrollTopChange = this.onScrollTopChange.bind(this);\n        this.session.addEventListener(\"changeScrollTop\", this.$onScrollTopChange);\n\n        this.$onScrollLeftChange = this.onScrollLeftChange.bind(this);\n        this.session.addEventListener(\"changeScrollLeft\", this.$onScrollLeftChange);\n\n        this.selection = session.getSelection();\n        this.selection.addEventListener(\"changeCursor\", this.$onCursorChange);\n\n        this.$onSelectionChange = this.onSelectionChange.bind(this);\n        this.selection.addEventListener(\"changeSelection\", this.$onSelectionChange);\n\n        this.onChangeMode();\n\n        this.$blockScrolling += 1;\n        this.onCursorChange();\n        this.$blockScrolling -= 1;\n\n        this.onScrollTopChange();\n        this.onScrollLeftChange();\n        this.onSelectionChange();\n        this.onChangeFrontMarker();\n        this.onChangeBackMarker();\n        this.onChangeBreakpoint();\n        this.onChangeAnnotation();\n        this.session.getUseWrapMode() && this.renderer.adjustWrapLimit();\n        this.renderer.updateFull();\n\n        this._emit(\"changeSession\", {\n            session: session,\n            oldSession: oldSession\n        });\n    };\n    this.getSession = function() {\n        return this.session;\n    };\n    this.setValue = function(val, cursorPos) {\n        this.session.doc.setValue(val);\n\n        if (!cursorPos)\n            this.selectAll();\n        else if (cursorPos == 1)\n            this.navigateFileEnd();\n        else if (cursorPos == -1)\n            this.navigateFileStart();\n\n        return val;\n    };\n    this.getValue = function() {\n        return this.session.getValue();\n    };\n    this.getSelection = function() {\n        return this.selection;\n    };\n    this.resize = function(force) {\n        this.renderer.onResize(force);\n    };\n    this.setTheme = function(theme) {\n        this.renderer.setTheme(theme);\n    };\n    this.getTheme = function() {\n        return this.renderer.getTheme();\n    };\n    this.setStyle = function(style) {\n        this.renderer.setStyle(style);\n    };\n    this.unsetStyle = function(style) {\n        this.renderer.unsetStyle(style);\n    };\n    this.getFontSize = function () {\n        return this.getOption(\"fontSize\") ||\n           dom.computedStyle(this.container, \"fontSize\");\n    };\n    this.setFontSize = function(size) {\n        this.setOption(\"fontSize\", size);\n    };\n\n    this.$highlightBrackets = function() {\n        if (this.session.$bracketHighlight) {\n            this.session.removeMarker(this.session.$bracketHighlight);\n            this.session.$bracketHighlight = null;\n        }\n\n        if (this.$highlightPending) {\n            return;\n        }\n        var self = this;\n        this.$highlightPending = true;\n        setTimeout(function() {\n            self.$highlightPending = false;\n\n            var pos = self.session.findMatchingBracket(self.getCursorPosition());\n            if (pos) {\n                var range = new Range(pos.row, pos.column, pos.row, pos.column+1);\n            } else if (self.session.$mode.getMatching) {\n                var range = self.session.$mode.getMatching(self.session);\n            }\n            if (range)\n                self.session.$bracketHighlight = self.session.addMarker(range, \"ace_bracket\", \"text\");\n        }, 50);\n    };\n    this.focus = function() {\n        var _self = this;\n        setTimeout(function() {\n            _self.textInput.focus();\n        });\n        this.textInput.focus();\n    };\n    this.isFocused = function() {\n        return this.textInput.isFocused();\n    };\n    this.blur = function() {\n        this.textInput.blur();\n    };\n    this.onFocus = function() {\n        if (this.$isFocused)\n            return;\n        this.$isFocused = true;\n        this.renderer.showCursor();\n        this.renderer.visualizeFocus();\n        this._emit(\"focus\");\n    };\n    this.onBlur = function() {\n        if (!this.$isFocused)\n            return;\n        this.$isFocused = false;\n        this.renderer.hideCursor();\n        this.renderer.visualizeBlur();\n        this._emit(\"blur\");\n    };\n\n    this.$cursorChange = function() {\n        this.renderer.updateCursor();\n    };\n    this.onDocumentChange = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n        var lastRow;\n\n        if (range.start.row == range.end.row && delta.action != \"insertLines\" && delta.action != \"removeLines\")\n            lastRow = range.end.row;\n        else\n            lastRow = Infinity;\n        this.renderer.updateLines(range.start.row, lastRow);\n\n        this._emit(\"change\", e);\n        this.$cursorChange();\n    };\n\n    this.onTokenizerUpdate = function(e) {\n        var rows = e.data;\n        this.renderer.updateLines(rows.first, rows.last);\n    };\n\n\n    this.onScrollTopChange = function() {\n        this.renderer.scrollToY(this.session.getScrollTop());\n    };\n\n    this.onScrollLeftChange = function() {\n        this.renderer.scrollToX(this.session.getScrollLeft());\n    };\n    this.onCursorChange = function() {\n        this.$cursorChange();\n\n        if (!this.$blockScrolling) {\n            this.renderer.scrollCursorIntoView();\n        }\n\n        this.$highlightBrackets();\n        this.$updateHighlightActiveLine();\n        this._emit(\"changeSelection\");\n    };\n\n    this.$updateHighlightActiveLine = function() {\n        var session = this.getSession();\n\n        var highlight;\n        if (this.$highlightActiveLine) {\n            if ((this.$selectionStyle != \"line\" || !this.selection.isMultiLine()))\n                highlight = this.getCursorPosition();\n            if (this.renderer.$maxLines && this.session.getLength() === 1)\n                highlight = false;\n        }\n\n        if (session.$highlightLineMarker && !highlight) {\n            session.removeMarker(session.$highlightLineMarker.id);\n            session.$highlightLineMarker = null;\n        } else if (!session.$highlightLineMarker && highlight) {\n            var range = new Range(highlight.row, highlight.column, highlight.row, Infinity);\n            range.id = session.addMarker(range, \"ace_active-line\", \"screenLine\");\n            session.$highlightLineMarker = range;\n        } else if (highlight) {\n            session.$highlightLineMarker.start.row = highlight.row;\n            session.$highlightLineMarker.end.row = highlight.row;\n            session.$highlightLineMarker.start.column = highlight.column;\n            session._emit(\"changeBackMarker\");\n        }\n    };\n\n    this.onSelectionChange = function(e) {\n        var session = this.session;\n\n        if (session.$selectionMarker) {\n            session.removeMarker(session.$selectionMarker);\n        }\n        session.$selectionMarker = null;\n\n        if (!this.selection.isEmpty()) {\n            var range = this.selection.getRange();\n            var style = this.getSelectionStyle();\n            session.$selectionMarker = session.addMarker(range, \"ace_selection\", style);\n        } else {\n            this.$updateHighlightActiveLine();\n        }\n\n        var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp()\n        this.session.highlight(re);\n\n        this._emit(\"changeSelection\");\n    };\n\n    this.$getSelectionHighLightRegexp = function() {\n        var session = this.session;\n\n        var selection = this.getSelectionRange();\n        if (selection.isEmpty() || selection.isMultiLine())\n            return;\n\n        var startOuter = selection.start.column - 1;\n        var endOuter = selection.end.column + 1;\n        var line = session.getLine(selection.start.row);\n        var lineCols = line.length;\n        var needle = line.substring(Math.max(startOuter, 0),\n                                    Math.min(endOuter, lineCols));\n        if ((startOuter >= 0 && /^[\\w\\d]/.test(needle)) ||\n            (endOuter <= lineCols && /[\\w\\d]$/.test(needle)))\n            return;\n\n        needle = line.substring(selection.start.column, selection.end.column);\n        if (!/^[\\w\\d]+$/.test(needle))\n            return;\n\n        var re = this.$search.$assembleRegExp({\n            wholeWord: true,\n            caseSensitive: true,\n            needle: needle\n        });\n\n        return re;\n    };\n\n\n    this.onChangeFrontMarker = function() {\n        this.renderer.updateFrontMarkers();\n    };\n\n    this.onChangeBackMarker = function() {\n        this.renderer.updateBackMarkers();\n    };\n\n\n    this.onChangeBreakpoint = function() {\n        this.renderer.updateBreakpoints();\n    };\n\n    this.onChangeAnnotation = function() {\n        this.renderer.setAnnotations(this.session.getAnnotations());\n    };\n\n\n    this.onChangeMode = function(e) {\n        this.renderer.updateText();\n        this._emit(\"changeMode\", e);\n    };\n\n\n    this.onChangeWrapLimit = function() {\n        this.renderer.updateFull();\n    };\n\n    this.onChangeWrapMode = function() {\n        this.renderer.onResize(true);\n    };\n\n\n    this.onChangeFold = function() {\n        this.$updateHighlightActiveLine();\n        this.renderer.updateFull();\n    };\n    this.getSelectedText = function() {\n        return this.session.getTextRange(this.getSelectionRange());\n    };\n    this.getCopyText = function() {\n        var text = this.getSelectedText();\n        this._signal(\"copy\", text);\n        return text;\n    };\n    this.onCopy = function() {\n        this.commands.exec(\"copy\", this);\n    };\n    this.onCut = function() {\n        this.commands.exec(\"cut\", this);\n    };\n    this.onPaste = function(text) {\n        if (this.$readOnly)\n            return;\n        this._emit(\"paste\", text);\n        this.insert(text);\n    };\n\n\n    this.execCommand = function(command, args) {\n        this.commands.exec(command, this, args);\n    };\n    this.insert = function(text) {\n        var session = this.session;\n        var mode = session.getMode();\n        var cursor = this.getCursorPosition();\n\n        if (this.getBehavioursEnabled()) {\n            var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text);\n            if (transform) {\n                if (text !== transform.text) {\n                    this.session.mergeUndoDeltas = false;\n                    this.$mergeNextCommand = false;\n                }\n                text = transform.text;\n\n            }\n        }\n        \n        if (text == \"\\t\")\n            text = this.session.getTabString();\n        if (!this.selection.isEmpty()) {\n            var range = this.getSelectionRange();\n            cursor = this.session.remove(range);\n            this.clearSelection();\n        }\n        else if (this.session.getOverwrite()) {\n            var range = new Range.fromPoints(cursor, cursor);\n            range.end.column += text.length;\n            this.session.remove(range);\n        }\n\n        if (text == \"\\n\" || text == \"\\r\\n\") {\n            var line = session.getLine(cursor.row)\n            if (cursor.column > line.search(/\\S|$/)) {\n                var d = line.substr(cursor.column).search(/\\S|$/);\n                session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d);\n            }\n        }\n        this.clearSelection();\n\n        var start = cursor.column;\n        var lineState = session.getState(cursor.row);\n        var line = session.getLine(cursor.row);\n        var shouldOutdent = mode.checkOutdent(lineState, line, text);\n        var end = session.insert(cursor, text);\n\n        if (transform && transform.selection) {\n            if (transform.selection.length == 2) { // Transform relative to the current column\n                this.selection.setSelectionRange(\n                    new Range(cursor.row, start + transform.selection[0],\n                              cursor.row, start + transform.selection[1]));\n            } else { // Transform relative to the current row.\n                this.selection.setSelectionRange(\n                    new Range(cursor.row + transform.selection[0],\n                              transform.selection[1],\n                              cursor.row + transform.selection[2],\n                              transform.selection[3]));\n            }\n        }\n\n        if (session.getDocument().isNewLine(text)) {\n            var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString());\n\n            session.insert({row: cursor.row+1, column: 0}, lineIndent);\n        }\n        if (shouldOutdent)\n            mode.autoOutdent(lineState, session, cursor.row);\n    };\n\n    this.onTextInput = function(text) {\n        this.keyBinding.onTextInput(text);\n    };\n\n    this.onCommandKey = function(e, hashId, keyCode) {\n        this.keyBinding.onCommandKey(e, hashId, keyCode);\n    };\n    this.setOverwrite = function(overwrite) {\n        this.session.setOverwrite(overwrite);\n    };\n    this.getOverwrite = function() {\n        return this.session.getOverwrite();\n    };\n    this.toggleOverwrite = function() {\n        this.session.toggleOverwrite();\n    };\n    this.setScrollSpeed = function(speed) {\n        this.setOption(\"scrollSpeed\", speed);\n    };\n    this.getScrollSpeed = function() {\n        return this.getOption(\"scrollSpeed\");\n    };\n    this.setDragDelay = function(dragDelay) {\n        this.setOption(\"dragDelay\", dragDelay);\n    };\n    this.getDragDelay = function() {\n        return this.getOption(\"dragDelay\");\n    };\n    this.setSelectionStyle = function(val) {\n        this.setOption(\"selectionStyle\", val);\n    };\n    this.getSelectionStyle = function() {\n        return this.getOption(\"selectionStyle\");\n    };\n    this.setHighlightActiveLine = function(shouldHighlight) {\n        this.setOption(\"highlightActiveLine\", shouldHighlight);\n    };\n    this.getHighlightActiveLine = function() {\n        return this.getOption(\"highlightActiveLine\");\n    };\n    this.setHighlightGutterLine = function(shouldHighlight) {\n        this.setOption(\"highlightGutterLine\", shouldHighlight);\n    };\n\n    this.getHighlightGutterLine = function() {\n        return this.getOption(\"highlightGutterLine\");\n    };\n    this.setHighlightSelectedWord = function(shouldHighlight) {\n        this.setOption(\"highlightSelectedWord\", shouldHighlight);\n    };\n    this.getHighlightSelectedWord = function() {\n        return this.$highlightSelectedWord;\n    };\n\n    this.setAnimatedScroll = function(shouldAnimate){\n        this.renderer.setAnimatedScroll(shouldAnimate);\n    };\n\n    this.getAnimatedScroll = function(){\n        return this.renderer.getAnimatedScroll();\n    };\n    this.setShowInvisibles = function(showInvisibles) {\n        this.renderer.setShowInvisibles(showInvisibles);\n    };\n    this.getShowInvisibles = function() {\n        return this.renderer.getShowInvisibles();\n    };\n\n    this.setDisplayIndentGuides = function(display) {\n        this.renderer.setDisplayIndentGuides(display);\n    };\n\n    this.getDisplayIndentGuides = function() {\n        return this.renderer.getDisplayIndentGuides();\n    };\n    this.setShowPrintMargin = function(showPrintMargin) {\n        this.renderer.setShowPrintMargin(showPrintMargin);\n    };\n    this.getShowPrintMargin = function() {\n        return this.renderer.getShowPrintMargin();\n    };\n    this.setPrintMarginColumn = function(showPrintMargin) {\n        this.renderer.setPrintMarginColumn(showPrintMargin);\n    };\n    this.getPrintMarginColumn = function() {\n        return this.renderer.getPrintMarginColumn();\n    };\n    this.setReadOnly = function(readOnly) {\n        this.setOption(\"readOnly\", readOnly);\n    };\n    this.getReadOnly = function() {\n        return this.getOption(\"readOnly\");\n    };\n    this.setBehavioursEnabled = function (enabled) {\n        this.setOption(\"behavioursEnabled\", enabled);\n    };\n    this.getBehavioursEnabled = function () {\n        return this.getOption(\"behavioursEnabled\");\n    };\n    this.setWrapBehavioursEnabled = function (enabled) {\n        this.setOption(\"wrapBehavioursEnabled\", enabled);\n    };\n    this.getWrapBehavioursEnabled = function () {\n        return this.getOption(\"wrapBehavioursEnabled\");\n    };\n    this.setShowFoldWidgets = function(show) {\n        this.setOption(\"showFoldWidgets\", show);\n\n    };\n    this.getShowFoldWidgets = function() {\n        return this.getOption(\"showFoldWidgets\");\n    };\n\n    this.setFadeFoldWidgets = function(fade) {\n        this.setOption(\"fadeFoldWidgets\", fade);\n    };\n\n    this.getFadeFoldWidgets = function() {\n        return this.getOption(\"fadeFoldWidgets\");\n    };\n    this.remove = function(dir) {\n        if (this.selection.isEmpty()){\n            if (dir == \"left\")\n                this.selection.selectLeft();\n            else\n                this.selection.selectRight();\n        }\n\n        var range = this.getSelectionRange();\n        if (this.getBehavioursEnabled()) {\n            var session = this.session;\n            var state = session.getState(range.start.row);\n            var new_range = session.getMode().transformAction(state, 'deletion', this, session, range);\n\n            if (range.end.column == 0) {\n                var text = session.getTextRange(range);\n                if (text[text.length - 1] == \"\\n\") {\n                    var line = session.getLine(range.end.row)\n                    if (/^\\s+$/.test(line)) {\n                        range.end.column = line.length\n                    }\n                }\n            }\n            if (new_range)\n                range = new_range;\n        }\n\n        this.session.remove(range);\n        this.clearSelection();\n    };\n    this.removeWordRight = function() {\n        if (this.selection.isEmpty())\n            this.selection.selectWordRight();\n\n        this.session.remove(this.getSelectionRange());\n        this.clearSelection();\n    };\n    this.removeWordLeft = function() {\n        if (this.selection.isEmpty())\n            this.selection.selectWordLeft();\n\n        this.session.remove(this.getSelectionRange());\n        this.clearSelection();\n    };\n    this.removeToLineStart = function() {\n        if (this.selection.isEmpty())\n            this.selection.selectLineStart();\n\n        this.session.remove(this.getSelectionRange());\n        this.clearSelection();\n    };\n    this.removeToLineEnd = function() {\n        if (this.selection.isEmpty())\n            this.selection.selectLineEnd();\n\n        var range = this.getSelectionRange();\n        if (range.start.column == range.end.column && range.start.row == range.end.row) {\n            range.end.column = 0;\n            range.end.row++;\n        }\n\n        this.session.remove(range);\n        this.clearSelection();\n    };\n    this.splitLine = function() {\n        if (!this.selection.isEmpty()) {\n            this.session.remove(this.getSelectionRange());\n            this.clearSelection();\n        }\n\n        var cursor = this.getCursorPosition();\n        this.insert(\"\\n\");\n        this.moveCursorToPosition(cursor);\n    };\n    this.transposeLetters = function() {\n        if (!this.selection.isEmpty()) {\n            return;\n        }\n\n        var cursor = this.getCursorPosition();\n        var column = cursor.column;\n        if (column === 0)\n            return;\n\n        var line = this.session.getLine(cursor.row);\n        var swap, range;\n        if (column < line.length) {\n            swap = line.charAt(column) + line.charAt(column-1);\n            range = new Range(cursor.row, column-1, cursor.row, column+1);\n        }\n        else {\n            swap = line.charAt(column-1) + line.charAt(column-2);\n            range = new Range(cursor.row, column-2, cursor.row, column);\n        }\n        this.session.replace(range, swap);\n    };\n    this.toLowerCase = function() {\n        var originalRange = this.getSelectionRange();\n        if (this.selection.isEmpty()) {\n            this.selection.selectWord();\n        }\n\n        var range = this.getSelectionRange();\n        var text = this.session.getTextRange(range);\n        this.session.replace(range, text.toLowerCase());\n        this.selection.setSelectionRange(originalRange);\n    };\n    this.toUpperCase = function() {\n        var originalRange = this.getSelectionRange();\n        if (this.selection.isEmpty()) {\n            this.selection.selectWord();\n        }\n\n        var range = this.getSelectionRange();\n        var text = this.session.getTextRange(range);\n        this.session.replace(range, text.toUpperCase());\n        this.selection.setSelectionRange(originalRange);\n    };\n    this.indent = function() {\n        var session = this.session;\n        var range = this.getSelectionRange();\n\n        if (range.start.row < range.end.row) {\n            var rows = this.$getSelectedRows();\n            session.indentRows(rows.first, rows.last, \"\\t\");\n            return;\n        } else if (range.start.column < range.end.column) {\n            var text = session.getTextRange(range)\n            if (!/^\\s+$/.test(text)) {\n                var rows = this.$getSelectedRows();\n                session.indentRows(rows.first, rows.last, \"\\t\");\n                return;\n            }\n        }\n        \n        var line = session.getLine(range.start.row)\n        var position = range.start;\n        var size = session.getTabSize();\n        var column = session.documentToScreenColumn(position.row, position.column);\n\n        if (this.session.getUseSoftTabs()) {\n            var count = (size - column % size);\n            var indentString = lang.stringRepeat(\" \", count);\n        } else {\n            var count = column % size;\n            while (line[range.start.column] == \" \" && count) {\n                range.start.column--;\n                count--;\n            }\n            this.selection.setSelectionRange(range);\n            indentString = \"\\t\";\n        }\n        return this.insert(indentString);\n    };\n    this.blockIndent = function() {\n        var rows = this.$getSelectedRows();\n        this.session.indentRows(rows.first, rows.last, \"\\t\");\n    };\n    this.blockOutdent = function() {\n        var selection = this.session.getSelection();\n        this.session.outdentRows(selection.getRange());\n    };\n    this.sortLines = function() {\n        var rows = this.$getSelectedRows();\n        var session = this.session;\n\n        var lines = [];\n        for (i = rows.first; i <= rows.last; i++)\n            lines.push(session.getLine(i));\n\n        lines.sort(function(a, b) {\n            if (a.toLowerCase() < b.toLowerCase()) return -1;\n            if (a.toLowerCase() > b.toLowerCase()) return 1;\n            return 0;\n        });\n\n        var deleteRange = new Range(0, 0, 0, 0);\n        for (var i = rows.first; i <= rows.last; i++) {\n            var line = session.getLine(i);\n            deleteRange.start.row = i;\n            deleteRange.end.row = i;\n            deleteRange.end.column = line.length;\n            session.replace(deleteRange, lines[i-rows.first]);\n        }\n    };\n    this.toggleCommentLines = function() {\n        var state = this.session.getState(this.getCursorPosition().row);\n        var rows = this.$getSelectedRows();\n        this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last);\n    };\n\n    this.toggleBlockComment = function() {\n        var cursor = this.getCursorPosition();\n        var state = this.session.getState(cursor.row);\n        var range = this.getSelectionRange();\n        this.session.getMode().toggleBlockComment(state, this.session, range, cursor);\n    };\n    this.getNumberAt = function( row, column ) {\n        var _numberRx = /[\\-]?[0-9]+(?:\\.[0-9]+)?/g\n        _numberRx.lastIndex = 0\n\n        var s = this.session.getLine(row)\n        while (_numberRx.lastIndex < column) {\n            var m = _numberRx.exec(s)\n            if(m.index <= column && m.index+m[0].length >= column){\n                var number = {\n                    value: m[0],\n                    start: m.index,\n                    end: m.index+m[0].length\n                }\n                return number;\n            }\n        }\n        return null;\n    };\n    this.modifyNumber = function(amount) {\n        var row = this.selection.getCursor().row;\n        var column = this.selection.getCursor().column;\n        var charRange = new Range(row, column-1, row, column);\n\n        var c = this.session.getTextRange(charRange);\n        if (!isNaN(parseFloat(c)) && isFinite(c)) {\n            var nr = this.getNumberAt(row, column);\n            if (nr) {\n                var fp = nr.value.indexOf(\".\") >= 0 ? nr.start + nr.value.indexOf(\".\") + 1 : nr.end;\n                var decimals = nr.start + nr.value.length - fp;\n\n                var t = parseFloat(nr.value);\n                t *= Math.pow(10, decimals);\n\n\n                if(fp !== nr.end && column < fp){\n                    amount *= Math.pow(10, nr.end - column - 1);\n                } else {\n                    amount *= Math.pow(10, nr.end - column);\n                }\n\n                t += amount;\n                t /= Math.pow(10, decimals);\n                var nnr = t.toFixed(decimals);\n                var replaceRange = new Range(row, nr.start, row, nr.end);\n                this.session.replace(replaceRange, nnr);\n                this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length));\n\n            }\n        }\n    };\n    this.removeLines = function() {\n        var rows = this.$getSelectedRows();\n        var range;\n        if (rows.first === 0 || rows.last+1 < this.session.getLength())\n            range = new Range(rows.first, 0, rows.last+1, 0);\n        else\n            range = new Range(\n                rows.first-1, this.session.getLine(rows.first-1).length,\n                rows.last, this.session.getLine(rows.last).length\n            );\n        this.session.remove(range);\n        this.clearSelection();\n    };\n\n    this.duplicateSelection = function() {\n        var sel = this.selection;\n        var doc = this.session;\n        var range = sel.getRange();\n        var reverse = sel.isBackwards();\n        if (range.isEmpty()) {\n            var row = range.start.row;\n            doc.duplicateLines(row, row);\n        } else {\n            var point = reverse ? range.start : range.end;\n            var endPoint = doc.insert(point, doc.getTextRange(range), false);\n            range.start = point;\n            range.end = endPoint;\n\n            sel.setSelectionRange(range, reverse)\n        }\n    };\n    this.moveLinesDown = function() {\n        this.$moveLines(function(firstRow, lastRow) {\n            return this.session.moveLinesDown(firstRow, lastRow);\n        });\n    };\n    this.moveLinesUp = function() {\n        this.$moveLines(function(firstRow, lastRow) {\n            return this.session.moveLinesUp(firstRow, lastRow);\n        });\n    };\n    this.moveText = function(range, toPosition, copy) {\n        return this.session.moveText(range, toPosition, copy);\n    };\n    this.copyLinesUp = function() {\n        this.$moveLines(function(firstRow, lastRow) {\n            this.session.duplicateLines(firstRow, lastRow);\n            return 0;\n        });\n    };\n    this.copyLinesDown = function() {\n        this.$moveLines(function(firstRow, lastRow) {\n            return this.session.duplicateLines(firstRow, lastRow);\n        });\n    };\n    this.$moveLines = function(mover) {\n        var selection = this.selection;\n        if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) {\n            var range = selection.toOrientedRange();\n            var rows = this.$getSelectedRows(range);\n            var linesMoved = mover.call(this, rows.first, rows.last);\n            range.moveBy(linesMoved, 0);\n            selection.fromOrientedRange(range);\n        } else {\n            var ranges = selection.rangeList.ranges;\n            selection.rangeList.detach(this.session);\n\n            for (var i = ranges.length; i--; ) {\n                var rangeIndex = i;\n                var rows = ranges[i].collapseRows();\n                var last = rows.end.row;\n                var first = rows.start.row;\n                while (i--) {\n                    var rows = ranges[i].collapseRows();\n                    if (first - rows.end.row <= 1)\n                        first = rows.end.row;\n                    else\n                        break;\n                }\n                i++;\n\n                var linesMoved = mover.call(this, first, last);\n                while (rangeIndex >= i) {\n                    ranges[rangeIndex].moveBy(linesMoved, 0);\n                    rangeIndex--;\n                }\n            }\n            selection.fromOrientedRange(selection.ranges[0]);\n            selection.rangeList.attach(this.session);\n        }\n    };\n    this.$getSelectedRows = function() {\n        var range = this.getSelectionRange().collapseRows();\n\n        return {\n            first: this.session.getRowFoldStart(range.start.row),\n            last: this.session.getRowFoldEnd(range.end.row)\n        };\n    };\n\n    this.onCompositionStart = function(text) {\n        this.renderer.showComposition(this.getCursorPosition());\n    };\n\n    this.onCompositionUpdate = function(text) {\n        this.renderer.setCompositionText(text);\n    };\n\n    this.onCompositionEnd = function() {\n        this.renderer.hideComposition();\n    };\n    this.getFirstVisibleRow = function() {\n        return this.renderer.getFirstVisibleRow();\n    };\n    this.getLastVisibleRow = function() {\n        return this.renderer.getLastVisibleRow();\n    };\n    this.isRowVisible = function(row) {\n        return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow());\n    };\n    this.isRowFullyVisible = function(row) {\n        return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow());\n    };\n    this.$getVisibleRowCount = function() {\n        return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1;\n    };\n\n    this.$moveByPage = function(dir, select) {\n        var renderer = this.renderer;\n        var config = this.renderer.layerConfig;\n        var rows = dir * Math.floor(config.height / config.lineHeight);\n\n        this.$blockScrolling++;\n        if (select === true) {\n            this.selection.$moveSelection(function(){\n                this.moveCursorBy(rows, 0);\n            });\n        } else if (select === false) {\n            this.selection.moveCursorBy(rows, 0);\n            this.selection.clearSelection();\n        }\n        this.$blockScrolling--;\n\n        var scrollTop = renderer.scrollTop;\n\n        renderer.scrollBy(0, rows * config.lineHeight);\n        if (select != null)\n            renderer.scrollCursorIntoView(null, 0.5);\n\n        renderer.animateScrolling(scrollTop);\n    };\n    this.selectPageDown = function() {\n        this.$moveByPage(1, true);\n    };\n    this.selectPageUp = function() {\n        this.$moveByPage(-1, true);\n    };\n    this.gotoPageDown = function() {\n       this.$moveByPage(1, false);\n    };\n    this.gotoPageUp = function() {\n        this.$moveByPage(-1, false);\n    };\n    this.scrollPageDown = function() {\n        this.$moveByPage(1);\n    };\n    this.scrollPageUp = function() {\n        this.$moveByPage(-1);\n    };\n    this.scrollToRow = function(row) {\n        this.renderer.scrollToRow(row);\n    };\n    this.scrollToLine = function(line, center, animate, callback) {\n        this.renderer.scrollToLine(line, center, animate, callback);\n    };\n    this.centerSelection = function() {\n        var range = this.getSelectionRange();\n        var pos = {\n            row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2),\n            column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2)\n        }\n        this.renderer.alignCursor(pos, 0.5);\n    };\n    this.getCursorPosition = function() {\n        return this.selection.getCursor();\n    };\n    this.getCursorPositionScreen = function() {\n        return this.session.documentToScreenPosition(this.getCursorPosition());\n    };\n    this.getSelectionRange = function() {\n        return this.selection.getRange();\n    };\n    this.selectAll = function() {\n        this.$blockScrolling += 1;\n        this.selection.selectAll();\n        this.$blockScrolling -= 1;\n    };\n    this.clearSelection = function() {\n        this.selection.clearSelection();\n    };\n    this.moveCursorTo = function(row, column) {\n        this.selection.moveCursorTo(row, column);\n    };\n    this.moveCursorToPosition = function(pos) {\n        this.selection.moveCursorToPosition(pos);\n    };\n    this.jumpToMatching = function(select) {\n        var cursor = this.getCursorPosition();\n\n        var range = this.session.getBracketRange(cursor);\n        if (!range) {\n            range = this.find({\n                needle: /[{}()\\[\\]]/g,\n                preventScroll:true,\n                start: {row: cursor.row, column: cursor.column - 1}\n            });\n            if (!range)\n                return;\n            var pos = range.start;\n            if (pos.row == cursor.row && Math.abs(pos.column - cursor.column) < 2)\n                range = this.session.getBracketRange(pos);\n        }\n\n        pos = range && range.cursor || pos;\n        if (pos) {\n            if (select) {\n                if (range && range.isEqual(this.getSelectionRange()))\n                    this.clearSelection();\n                else\n                    this.selection.selectTo(pos.row, pos.column);\n            } else {\n                this.clearSelection();\n                this.moveCursorTo(pos.row, pos.column);\n            }\n        }\n    };\n    this.gotoLine = function(lineNumber, column, animate) {\n        this.selection.clearSelection();\n        this.session.unfold({row: lineNumber - 1, column: column || 0});\n\n        this.$blockScrolling += 1;\n        this.exitMultiSelectMode && this.exitMultiSelectMode();\n        this.moveCursorTo(lineNumber - 1, column || 0);\n        this.$blockScrolling -= 1;\n\n        if (!this.isRowFullyVisible(lineNumber - 1))\n            this.scrollToLine(lineNumber - 1, true, animate);\n    };\n    this.navigateTo = function(row, column) {\n        this.clearSelection();\n        this.moveCursorTo(row, column);\n    };\n    this.navigateUp = function(times) {\n        if (this.selection.isMultiLine() && !this.selection.isBackwards()) {\n            var selectionStart = this.selection.anchor.getPosition();\n            return this.moveCursorToPosition(selectionStart);\n        }\n        this.selection.clearSelection();\n        times = times || 1;\n        this.selection.moveCursorBy(-times, 0);\n    };\n    this.navigateDown = function(times) {\n        if (this.selection.isMultiLine() && this.selection.isBackwards()) {\n            var selectionEnd = this.selection.anchor.getPosition();\n            return this.moveCursorToPosition(selectionEnd);\n        }\n        this.selection.clearSelection();\n        times = times || 1;\n        this.selection.moveCursorBy(times, 0);\n    };\n    this.navigateLeft = function(times) {\n        if (!this.selection.isEmpty()) {\n            var selectionStart = this.getSelectionRange().start;\n            this.moveCursorToPosition(selectionStart);\n        }\n        else {\n            times = times || 1;\n            while (times--) {\n                this.selection.moveCursorLeft();\n            }\n        }\n        this.clearSelection();\n    };\n    this.navigateRight = function(times) {\n        if (!this.selection.isEmpty()) {\n            var selectionEnd = this.getSelectionRange().end;\n            this.moveCursorToPosition(selectionEnd);\n        }\n        else {\n            times = times || 1;\n            while (times--) {\n                this.selection.moveCursorRight();\n            }\n        }\n        this.clearSelection();\n    };\n    this.navigateLineStart = function() {\n        this.selection.moveCursorLineStart();\n        this.clearSelection();\n    };\n    this.navigateLineEnd = function() {\n        this.selection.moveCursorLineEnd();\n        this.clearSelection();\n    };\n    this.navigateFileEnd = function() {\n        var scrollTop = this.renderer.scrollTop;\n        this.selection.moveCursorFileEnd();\n        this.clearSelection();\n        this.renderer.animateScrolling(scrollTop);\n    };\n    this.navigateFileStart = function() {\n        var scrollTop = this.renderer.scrollTop;\n        this.selection.moveCursorFileStart();\n        this.clearSelection();\n        this.renderer.animateScrolling(scrollTop);\n    };\n    this.navigateWordRight = function() {\n        this.selection.moveCursorWordRight();\n        this.clearSelection();\n    };\n    this.navigateWordLeft = function() {\n        this.selection.moveCursorWordLeft();\n        this.clearSelection();\n    };\n    this.replace = function(replacement, options) {\n        if (options)\n            this.$search.set(options);\n\n        var range = this.$search.find(this.session);\n        var replaced = 0;\n        if (!range)\n            return replaced;\n\n        if (this.$tryReplace(range, replacement)) {\n            replaced = 1;\n        }\n        if (range !== null) {\n            this.selection.setSelectionRange(range);\n            this.renderer.scrollSelectionIntoView(range.start, range.end);\n        }\n\n        return replaced;\n    };\n    this.replaceAll = function(replacement, options) {\n        if (options) {\n            this.$search.set(options);\n        }\n\n        var ranges = this.$search.findAll(this.session);\n        var replaced = 0;\n        if (!ranges.length)\n            return replaced;\n\n        this.$blockScrolling += 1;\n\n        var selection = this.getSelectionRange();\n        this.clearSelection();\n        this.selection.moveCursorTo(0, 0);\n\n        for (var i = ranges.length - 1; i >= 0; --i) {\n            if(this.$tryReplace(ranges[i], replacement)) {\n                replaced++;\n            }\n        }\n\n        this.selection.setSelectionRange(selection);\n        this.$blockScrolling -= 1;\n\n        return replaced;\n    };\n\n    this.$tryReplace = function(range, replacement) {\n        var input = this.session.getTextRange(range);\n        replacement = this.$search.replace(input, replacement);\n        if (replacement !== null) {\n            range.end = this.session.replace(range, replacement);\n            return range;\n        } else {\n            return null;\n        }\n    };\n    this.getLastSearchOptions = function() {\n        return this.$search.getOptions();\n    };\n    this.find = function(needle, options, animate) {\n        if (!options)\n            options = {};\n\n        if (typeof needle == \"string\" || needle instanceof RegExp)\n            options.needle = needle;\n        else if (typeof needle == \"object\")\n            oop.mixin(options, needle);\n\n        var range = this.selection.getRange();\n        if (options.needle == null) {\n            needle = this.session.getTextRange(range)\n                || this.$search.$options.needle;\n            if (!needle) {\n                range = this.session.getWordRange(range.start.row, range.start.column);\n                needle = this.session.getTextRange(range);\n            }\n            this.$search.set({needle: needle});\n        }\n\n        this.$search.set(options);\n        if (!options.start)\n            this.$search.set({start: range});\n\n        var newRange = this.$search.find(this.session);\n        if (options.preventScroll)\n            return newRange;\n        if (newRange) {\n            this.revealRange(newRange, animate);\n            return newRange;\n        }\n        if (options.backwards)\n            range.start = range.end;\n        else\n            range.end = range.start;\n        this.selection.setRange(range);\n    };\n    this.findNext = function(options, animate) {\n        this.find({skipCurrent: true, backwards: false}, options, animate);\n    };\n    this.findPrevious = function(options, animate) {\n        this.find(options, {skipCurrent: true, backwards: true}, animate);\n    };\n\n    this.revealRange = function(range, animate) {\n        this.$blockScrolling += 1;\n        this.session.unfold(range);\n        this.selection.setSelectionRange(range);\n        this.$blockScrolling -= 1;\n\n        var scrollTop = this.renderer.scrollTop;\n        this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5);\n        if (animate !== false)\n            this.renderer.animateScrolling(scrollTop);\n    };\n    this.undo = function() {\n        this.$blockScrolling++;\n        this.session.getUndoManager().undo();\n        this.$blockScrolling--;\n        this.renderer.scrollCursorIntoView(null, 0.5);\n    };\n    this.redo = function() {\n        this.$blockScrolling++;\n        this.session.getUndoManager().redo();\n        this.$blockScrolling--;\n        this.renderer.scrollCursorIntoView(null, 0.5);\n    };\n    this.destroy = function() {\n        this.renderer.destroy();\n        this._emit(\"destroy\", this);\n    };\n    this.setAutoScrollEditorIntoView = function(enable) {\n        if (enable === false)\n            return;\n        var rect;\n        var self = this;\n        var shouldScroll = false;\n        if (!this.$scrollAnchor)\n            this.$scrollAnchor = document.createElement(\"div\");\n        var scrollAnchor = this.$scrollAnchor;\n        scrollAnchor.style.cssText = \"position:absolute\";\n        this.container.insertBefore(scrollAnchor, this.container.firstChild);\n        var onChangeSelection = this.on(\"changeSelection\", function() {\n            shouldScroll = true;\n        });\n        var onBeforeRender = this.renderer.on(\"beforeRender\", function() {\n            if (shouldScroll)\n                rect = self.renderer.container.getBoundingClientRect();\n        });\n        var onAfterRender = this.renderer.on(\"afterRender\", function() {\n            if (shouldScroll && rect && self.isFocused()) {\n                var renderer = self.renderer;\n                var pos = renderer.$cursorLayer.$pixelPos;\n                var config = renderer.layerConfig;\n                var top = pos.top - config.offset;\n                if (pos.top >= 0 && top + rect.top < 0) {\n                    shouldScroll = true;\n                } else if (pos.top < config.height &&\n                    pos.top + rect.top + config.lineHeight > window.innerHeight) {\n                    shouldScroll = false;\n                } else {\n                    shouldScroll = null;\n                }\n                if (shouldScroll != null) {\n                    scrollAnchor.style.top = top + \"px\";\n                    scrollAnchor.style.left = pos.left + \"px\";\n                    scrollAnchor.style.height = config.lineHeight + \"px\";\n                    scrollAnchor.scrollIntoView(shouldScroll);\n                }\n                shouldScroll = rect = null;\n            }\n        });\n        this.setAutoScrollEditorIntoView = function(enable) {\n            if (enable === true)\n                return;\n            delete this.setAutoScrollEditorIntoView;\n            this.removeEventListener(\"changeSelection\", onChangeSelection);\n            this.renderer.removeEventListener(\"afterRender\", onAfterRender);\n            this.renderer.removeEventListener(\"beforeRender\", onBeforeRender);\n        };\n    };\n\n\n    this.$resetCursorStyle = function() {\n        var style = this.$cursorStyle || \"ace\";\n        var cursorLayer = this.renderer.$cursorLayer;\n        if (!cursorLayer)\n            return;\n        cursorLayer.setSmoothBlinking(style == \"smooth\");\n        cursorLayer.isBlinking = !this.$readOnly && style != \"wide\";\n    };\n\n}).call(Editor.prototype);\n\n\n\nconfig.defineOptions(Editor.prototype, \"editor\", {\n    selectionStyle: {\n        set: function(style) {\n            this.onSelectionChange();\n            this._emit(\"changeSelectionStyle\", {data: style});\n        },\n        initialValue: \"line\"\n    },\n    highlightActiveLine: {\n        set: function() {this.$updateHighlightActiveLine();},\n        initialValue: true\n    },\n    highlightSelectedWord: {\n        set: function(shouldHighlight) {this.$onSelectionChange();},\n        initialValue: true\n    },\n    readOnly: {\n        set: function(readOnly) {\n            this.textInput.setReadOnly(readOnly); \n            this.$resetCursorStyle(); \n        },\n        initialValue: false\n    },\n    cursorStyle: {\n        set: function(val) { this.$resetCursorStyle(); },\n        values: [\"ace\", \"slim\", \"smooth\", \"wide\"],\n        initialValue: \"ace\"\n    },\n    mergeUndoDeltas: {\n        values: [false, true, \"always\"],\n        initialValue: true\n    },\n    behavioursEnabled: {initialValue: true},\n    wrapBehavioursEnabled: {initialValue: true},\n\n    hScrollBarAlwaysVisible: \"renderer\",\n    vScrollBarAlwaysVisible: \"renderer\",\n    highlightGutterLine: \"renderer\",\n    animatedScroll: \"renderer\",\n    showInvisibles: \"renderer\",\n    showPrintMargin: \"renderer\",\n    printMarginColumn: \"renderer\",\n    printMargin: \"renderer\",\n    fadeFoldWidgets: \"renderer\",\n    showFoldWidgets: \"renderer\",\n    showGutter: \"renderer\",\n    displayIndentGuides: \"renderer\",\n    fontSize: \"renderer\",\n    fontFamily: \"renderer\",\n    maxLines: \"renderer\",\n    minLines: \"renderer\",\n    scrollPastEnd: \"renderer\",\n    fixedWidthGutter: \"renderer\",\n\n    scrollSpeed: \"$mouseHandler\",\n    dragDelay: \"$mouseHandler\",\n    dragEnabled: \"$mouseHandler\",\n    focusTimout: \"$mouseHandler\",\n\n    firstLineNumber: \"session\",\n    overwrite: \"session\",\n    newLineMode: \"session\",\n    useWorker: \"session\",\n    useSoftTabs: \"session\",\n    tabSize: \"session\",\n    wrap: \"session\",\n    foldStyle: \"session\"\n});\n\nexports.Editor = Editor;\n});\n\ndefine('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nexports.stringReverse = function(string) {\n    return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n    var result = '';\n    while (count > 0) {\n        if (count & 1)\n            result += string;\n\n        if (count >>= 1)\n            string += string;\n    }\n    return result;\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n    return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n    return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n    var copy = {};\n    for (var key in obj) {\n        copy[key] = obj[key];\n    }\n    return copy;\n};\n\nexports.copyArray = function(array){\n    var copy = [];\n    for (var i=0, l=array.length; i<l; i++) {\n        if (array[i] && typeof array[i] == \"object\")\n            copy[i] = this.copyObject( array[i] );\n        else \n            copy[i] = array[i];\n    }\n    return copy;\n};\n\nexports.deepCopy = function (obj) {\n    if (typeof obj !== \"object\" || !obj)\n        return obj;\n    var cons = obj.constructor;\n    if (cons === RegExp)\n        return obj;\n    \n    var copy = cons();\n    for (var key in obj) {\n        if (typeof obj[key] === \"object\") {\n            copy[key] = exports.deepCopy(obj[key]);\n        } else {\n            copy[key] = obj[key];\n        }\n    }\n    return copy;\n};\n\nexports.arrayToMap = function(arr) {\n    var map = {};\n    for (var i=0; i<arr.length; i++) {\n        map[arr[i]] = 1;\n    }\n    return map;\n\n};\n\nexports.createMap = function(props) {\n    var map = Object.create(null);\n    for (var i in props) {\n        map[i] = props[i];\n    }\n    return map;\n};\nexports.arrayRemove = function(array, value) {\n  for (var i = 0; i <= array.length; i++) {\n    if (value === array[i]) {\n      array.splice(i, 1);\n    }\n  }\n};\n\nexports.escapeRegExp = function(str) {\n    return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n};\n\nexports.escapeHTML = function(str) {\n    return str.replace(/&/g, \"&#38;\").replace(/\"/g, \"&#34;\").replace(/'/g, \"&#39;\").replace(/</g, \"&#60;\");\n};\n\nexports.getMatchOffsets = function(string, regExp) {\n    var matches = [];\n\n    string.replace(regExp, function(str) {\n        matches.push({\n            offset: arguments[arguments.length-2],\n            length: str.length\n        });\n    });\n\n    return matches;\n};\nexports.deferredCall = function(fcn) {\n\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var deferred = function(timeout) {\n        deferred.cancel();\n        timer = setTimeout(callback, timeout || 0);\n        return deferred;\n    };\n\n    deferred.schedule = deferred;\n\n    deferred.call = function() {\n        this.cancel();\n        fcn();\n        return deferred;\n    };\n\n    deferred.cancel = function() {\n        clearTimeout(timer);\n        timer = null;\n        return deferred;\n    };\n    \n    deferred.isPending = function() {\n        return timer;\n    };\n\n    return deferred;\n};\n\n\nexports.delayedCall = function(fcn, defaultTimeout) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var _self = function(timeout) {\n        if (timer == null)\n            timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n\n    _self.delay = function(timeout) {\n        timer && clearTimeout(timer);\n        timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n    _self.schedule = _self;\n\n    _self.call = function() {\n        this.cancel();\n        fcn();\n    };\n\n    _self.cancel = function() {\n        timer && clearTimeout(timer);\n        timer = null;\n    };\n\n    _self.isPending = function() {\n        return timer;\n    };\n\n    return _self;\n};\n});\n\ndefine('ace/keyboard/textinput', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/lib/useragent', 'ace/lib/dom', 'ace/lib/lang'], function(require, exports, module) {\n\n\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nvar dom = require(\"../lib/dom\");\nvar lang = require(\"../lib/lang\");\nvar BROKEN_SETDATA = useragent.isChrome < 18;\n\nvar TextInput = function(parentNode, host) {\n    var text = dom.createElement(\"textarea\");\n    text.className = \"ace_text-input\";\n\n    if (useragent.isTouchPad)\n        text.setAttribute(\"x-palm-disable-auto-cap\", true);\n\n    text.wrap = \"off\";\n    text.autocorrect = \"off\";\n    text.autocapitalize = \"off\";\n    text.spellcheck = false;\n\n    text.style.opacity = \"0\";\n    parentNode.insertBefore(text, parentNode.firstChild);\n\n    var PLACEHOLDER = \"\\x01\\x01\";\n\n    var cut = false;\n    var copied = false;\n    var pasted = false;\n    var inComposition = false;\n    var tempStyle = '';\n    var isSelectionEmpty = true;\n    try { var isFocused = document.activeElement === text; } catch(e) {}\n    \n    event.addListener(text, \"blur\", function() {\n        host.onBlur();\n        isFocused = false;\n    });\n    event.addListener(text, \"focus\", function() {\n        isFocused = true;\n        host.onFocus();\n        resetSelection();\n    });\n    this.focus = function() { text.focus(); };\n    this.blur = function() { text.blur(); };\n    this.isFocused = function() {\n        return isFocused;\n    };\n    var syncSelection = lang.delayedCall(function() {\n        isFocused && resetSelection(isSelectionEmpty);\n    });\n    var syncValue = lang.delayedCall(function() {\n         if (!inComposition) {\n            text.value = PLACEHOLDER;\n            isFocused && resetSelection();\n         }\n    });\n\n    function resetSelection(isEmpty) {\n        if (inComposition)\n            return;\n        if (inputHandler) {\n            selectionStart = 0;\n            selectionEnd = isEmpty ? 0 : text.value.length - 1;\n        } else {\n            var selectionStart = isEmpty ? 2 : 1;\n            var selectionEnd = 2;\n        }\n        try {\n            text.setSelectionRange(selectionStart, selectionEnd);\n        } catch(e){}\n    }\n\n    function resetValue() {\n        if (inComposition)\n            return;\n        text.value = PLACEHOLDER;\n        if (useragent.isWebKit)\n            syncValue.schedule();\n    }\n\n    useragent.isWebKit || host.addEventListener('changeSelection', function() {\n        if (host.selection.isEmpty() != isSelectionEmpty) {\n            isSelectionEmpty = !isSelectionEmpty;\n            syncSelection.schedule();\n        }\n    });\n\n    resetValue();\n    if (isFocused)\n        host.onFocus();\n\n\n    var isAllSelected = function(text) {\n        return text.selectionStart === 0 && text.selectionEnd === text.value.length;\n    };\n    if (!text.setSelectionRange && text.createTextRange) {\n        text.setSelectionRange = function(selectionStart, selectionEnd) {\n            var range = this.createTextRange();\n            range.collapse(true);\n            range.moveStart('character', selectionStart);\n            range.moveEnd('character', selectionEnd);\n            range.select();\n        };\n        isAllSelected = function(text) {\n            try {\n                var range = text.ownerDocument.selection.createRange();\n            }catch(e) {}\n            if (!range || range.parentElement() != text) return false;\n                return range.text == text.value;\n        }\n    }\n    if (useragent.isOldIE) {\n        var inPropertyChange = false;\n        var onPropertyChange = function(e){\n            if (inPropertyChange)\n                return;\n            var data = text.value;\n            if (inComposition || !data || data == PLACEHOLDER)\n                return;\n            if (e && data == PLACEHOLDER[0])\n                return syncProperty.schedule();\n\n            sendText(data);\n            inPropertyChange = true;\n            resetValue();\n            inPropertyChange = false;\n        };\n        var syncProperty = lang.delayedCall(onPropertyChange);\n        event.addListener(text, \"propertychange\", onPropertyChange);\n\n        var keytable = { 13:1, 27:1 };\n        event.addListener(text, \"keyup\", function (e) {\n            if (inComposition && (!text.value || keytable[e.keyCode]))\n                setTimeout(onCompositionEnd, 0);\n            if ((text.value.charCodeAt(0)||0) < 129) {\n                return syncProperty.call();\n            }\n            inComposition ? onCompositionUpdate() : onCompositionStart();\n        });\n        event.addListener(text, \"keydown\", function (e) {\n            syncProperty.schedule(50);\n        });\n    }\n\n    var onSelect = function(e) {\n        if (cut) {\n            cut = false;\n        } else if (copied) {\n            copied = false;\n        } else if (isAllSelected(text)) {\n            host.selectAll();\n            resetSelection();\n        } else if (inputHandler) {\n            resetSelection(host.selection.isEmpty());\n        }\n    };\n\n    var inputHandler = null;\n    this.setInputHandler = function(cb) {inputHandler = cb};\n    this.getInputHandler = function() {return inputHandler};\n    var afterContextMenu = false;\n    \n    var sendText = function(data) {\n        if (inputHandler) {\n            data = inputHandler(data);\n            inputHandler = null;\n        }\n        if (pasted) {\n            resetSelection();\n            if (data)\n                host.onPaste(data);\n            pasted = false;\n        } else if (data == PLACEHOLDER.charAt(0)) {\n            if (afterContextMenu)\n                host.execCommand(\"del\", {source: \"ace\"});\n            else // some versions of android do not fire keydown when pressing backspace\n                host.execCommand(\"backspace\", {source: \"ace\"});\n        } else {\n            if (data.substring(0, 2) == PLACEHOLDER)\n                data = data.substr(2);\n            else if (data.charAt(0) == PLACEHOLDER.charAt(0))\n                data = data.substr(1);\n            else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n                data = data.slice(0, -1);\n            if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n                data = data.slice(0, -1);\n            \n            if (data)\n                host.onTextInput(data);\n        }\n        if (afterContextMenu)\n            afterContextMenu = false;\n    };\n    var onInput = function(e) {\n        if (inComposition)\n            return;\n        var data = text.value;\n        sendText(data);\n        resetValue();\n    };\n\n    var onCut = function(e) {\n        var data = host.getCopyText();\n        if (!data) {\n            event.preventDefault(e);\n            return;\n        }\n\n        var clipboardData = e.clipboardData || window.clipboardData;\n\n        if (clipboardData && !BROKEN_SETDATA) {\n            var supported = clipboardData.setData(\"Text\", data);\n            if (supported) {\n                host.onCut();\n                event.preventDefault(e);\n            }\n        }\n\n        if (!supported) {\n            cut = true;\n            text.value = data;\n            text.select();\n            setTimeout(function(){\n                cut = false;\n                resetValue();\n                resetSelection();\n                host.onCut();\n            });\n        }\n    };\n\n    var onCopy = function(e) {\n        var data = host.getCopyText();\n        if (!data) {\n            event.preventDefault(e);\n            return;\n        }\n\n        var clipboardData = e.clipboardData || window.clipboardData;\n        if (clipboardData && !BROKEN_SETDATA) {\n            var supported = clipboardData.setData(\"Text\", data);\n            if (supported) {\n                host.onCopy();\n                event.preventDefault(e);\n            }\n        }\n        if (!supported) {\n            copied = true;\n            text.value = data;\n            text.select();\n            setTimeout(function(){\n                copied = false;\n                resetValue();\n                resetSelection();\n                host.onCopy();\n            });\n        }\n    };\n\n    var onPaste = function(e) {\n        var clipboardData = e.clipboardData || window.clipboardData;\n\n        if (clipboardData) {\n            var data = clipboardData.getData(\"Text\");\n            if (data)\n                host.onPaste(data);\n            if (useragent.isIE)\n                setTimeout(resetSelection);\n            event.preventDefault(e);\n        }\n        else {\n            text.value = \"\";\n            pasted = true;\n        }\n    };\n\n    event.addCommandKeyListener(text, host.onCommandKey.bind(host));\n\n    event.addListener(text, \"select\", onSelect);\n\n    event.addListener(text, \"input\", onInput);\n\n    event.addListener(text, \"cut\", onCut);\n    event.addListener(text, \"copy\", onCopy);\n    event.addListener(text, \"paste\", onPaste);\n    if (!('oncut' in text) || !('oncopy' in text) || !('onpaste' in text)){\n        event.addListener(parentNode, \"keydown\", function(e) {\n            if ((useragent.isMac && !e.metaKey) || !e.ctrlKey)\n            return;\n\n            switch (e.keyCode) {\n                case 67:\n                    onCopy(e);\n                    break;\n                case 86:\n                    onPaste(e);\n                    break;\n                case 88:\n                    onCut(e);\n                    break;\n            }\n        });\n    }\n    var onCompositionStart = function(e) {\n        if (inComposition) return;\n        inComposition = {};\n        host.onCompositionStart();\n        setTimeout(onCompositionUpdate, 0);\n        host.on(\"mousedown\", onCompositionEnd);\n        if (!host.selection.isEmpty()) {\n            host.insert(\"\");\n            host.session.markUndoGroup();\n            host.selection.clearSelection();\n        }\n        host.session.markUndoGroup();\n    };\n\n    var onCompositionUpdate = function() {\n        if (!inComposition) return;\n        var val = text.value.replace(/\\x01/g, \"\");\n        if (inComposition.lastValue === val) return;\n        \n        host.onCompositionUpdate(val);\n        if (inComposition.lastValue)\n            host.undo();\n        inComposition.lastValue = val;\n        if (inComposition.lastValue) {\n            var r = host.selection.getRange();\n            host.insert(inComposition.lastValue);\n            host.session.markUndoGroup();\n            inComposition.range = host.selection.getRange();\n            host.selection.setRange(r);\n            host.selection.clearSelection();\n        }\n    };\n\n    var onCompositionEnd = function(e) {\n        var c = inComposition;\n        inComposition = false;\n        var timer = setTimeout(function() {\n            timer = null;\n            var str = text.value.replace(/\\x01/g, \"\");\n            if (inComposition)\n                return\n            else if (str == c.lastValue)\n                resetValue();\n            else if (!c.lastValue && str) {\n                resetValue();\n                sendText(str);\n            }\n        });\n        inputHandler = function compositionInputHandler(str) {\n            if (timer)\n                clearTimeout(timer);\n            str = str.replace(/\\x01/g, \"\");\n            if (str == c.lastValue)\n                return \"\";\n            if (c.lastValue && timer)\n                host.undo();\n            return str;\n        };\n        host.onCompositionEnd();\n        host.removeListener(\"mousedown\", onCompositionEnd);\n        if (e.type == \"compositionend\" && c.range) {\n            host.selection.setRange(c.range);\n        }\n    };\n    \n    \n\n    var syncComposition = lang.delayedCall(onCompositionUpdate, 50);\n\n    event.addListener(text, \"compositionstart\", onCompositionStart);\n    if (useragent.isGecko) {\n        event.addListener(text, \"text\", function(){syncComposition.schedule()});\n    } else {\n        event.addListener(text, \"keyup\", function(){syncComposition.schedule()});\n        event.addListener(text, \"keydown\", function(){syncComposition.schedule()});\n    }\n    event.addListener(text, \"compositionend\", onCompositionEnd);\n\n    this.getElement = function() {\n        return text;\n    };\n\n    this.setReadOnly = function(readOnly) {\n       text.readOnly = readOnly;\n    };\n\n    this.onContextMenu = function(e) {\n        afterContextMenu = true;\n        if (!tempStyle)\n            tempStyle = text.style.cssText;\n\n        text.style.cssText = \"z-index:100000;\" + (useragent.isIE ? \"opacity:0.1;\" : \"\");\n\n        resetSelection(host.selection.isEmpty());\n        host._emit(\"nativecontextmenu\", {target: host, domEvent: e});\n        var rect = host.container.getBoundingClientRect();\n        var style = dom.computedStyle(host.container);\n        var top = rect.top + (parseInt(style.borderTopWidth) || 0);\n        var left = rect.left + (parseInt(rect.borderLeftWidth) || 0);\n        var maxTop = rect.bottom - top - text.clientHeight;\n        var move = function(e) {\n            text.style.left = e.clientX - left - 2 + \"px\";\n            text.style.top = Math.min(e.clientY - top - 2, maxTop) + \"px\";\n        }; \n        move(e);\n\n        if (e.type != \"mousedown\")\n            return;\n\n        if (host.renderer.$keepTextAreaAtCursor)\n            host.renderer.$keepTextAreaAtCursor = null;\n        if (useragent.isWin)\n            event.capture(host.container, move, onContextMenuClose);\n    };\n\n    this.onContextMenuClose = onContextMenuClose;\n    function onContextMenuClose() {\n        setTimeout(function () {\n            if (tempStyle) {\n                text.style.cssText = tempStyle;\n                tempStyle = '';\n            }\n            if (host.renderer.$keepTextAreaAtCursor == null) {\n                host.renderer.$keepTextAreaAtCursor = true;\n                host.renderer.$moveTextAreaToCursor();\n            }\n        }, 0);\n    }\n    if (!useragent.isGecko || useragent.isMac) {\n        var onContextMenu = function(e) {\n            host.textInput.onContextMenu(e);\n            onContextMenuClose();\n        };\n        event.addListener(host.renderer.scroller, \"contextmenu\", onContextMenu);\n        event.addListener(text, \"contextmenu\", onContextMenu);\n    }\n};\n\nexports.TextInput = TextInput;\n});\n\ndefine('ace/mouse/mouse_handler', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/lib/useragent', 'ace/mouse/default_handlers', 'ace/mouse/default_gutter_handler', 'ace/mouse/mouse_event', 'ace/mouse/dragdrop_handler', 'ace/config'], function(require, exports, module) {\n\n\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nvar DefaultHandlers = require(\"./default_handlers\").DefaultHandlers;\nvar DefaultGutterHandler = require(\"./default_gutter_handler\").GutterHandler;\nvar MouseEvent = require(\"./mouse_event\").MouseEvent;\nvar DragdropHandler = require(\"./dragdrop_handler\").DragdropHandler;\nvar config = require(\"../config\");\n\nvar MouseHandler = function(editor) {\n    this.editor = editor;\n\n    new DefaultHandlers(this);\n    new DefaultGutterHandler(this);\n    new DragdropHandler(this);\n\n    var mouseTarget = editor.renderer.getMouseEventTarget();\n    event.addListener(mouseTarget, \"click\", this.onMouseEvent.bind(this, \"click\"));\n    event.addListener(mouseTarget, \"mousemove\", this.onMouseMove.bind(this, \"mousemove\"));\n    event.addMultiMouseDownListener(mouseTarget, [300, 300, 250], this, \"onMouseEvent\");\n    if (editor.renderer.scrollBarV) {\n        event.addMultiMouseDownListener(editor.renderer.scrollBarV.inner, [300, 300, 250], this, \"onMouseEvent\");\n        event.addMultiMouseDownListener(editor.renderer.scrollBarH.inner, [300, 300, 250], this, \"onMouseEvent\");\n    }\n    event.addMouseWheelListener(editor.container, this.onMouseWheel.bind(this, \"mousewheel\"));\n\n    var gutterEl = editor.renderer.$gutter;\n    event.addListener(gutterEl, \"mousedown\", this.onMouseEvent.bind(this, \"guttermousedown\"));\n    event.addListener(gutterEl, \"click\", this.onMouseEvent.bind(this, \"gutterclick\"));\n    event.addListener(gutterEl, \"dblclick\", this.onMouseEvent.bind(this, \"gutterdblclick\"));\n    event.addListener(gutterEl, \"mousemove\", this.onMouseEvent.bind(this, \"guttermousemove\"));\n\n    event.addListener(mouseTarget, \"mousedown\", function(e) {\n        editor.focus();\n    });\n\n    event.addListener(gutterEl, \"mousedown\", function(e) {\n        editor.focus();\n        return event.preventDefault(e);\n    });\n};\n\n(function() {\n    this.onMouseEvent = function(name, e) {\n        this.editor._emit(name, new MouseEvent(e, this.editor));\n    };\n\n    this.onMouseMove = function(name, e) {\n        var listeners = this.editor._eventRegistry && this.editor._eventRegistry.mousemove;\n        if (!listeners || !listeners.length)\n            return;\n\n        this.editor._emit(name, new MouseEvent(e, this.editor));\n    };\n\n    this.onMouseWheel = function(name, e) {\n        var mouseEvent = new MouseEvent(e, this.editor);\n        mouseEvent.speed = this.$scrollSpeed * 2;\n        mouseEvent.wheelX = e.wheelX;\n        mouseEvent.wheelY = e.wheelY;\n\n        this.editor._emit(name, mouseEvent);\n    };\n\n    this.setState = function(state) {\n        this.state = state;\n    };\n\n    this.captureMouse = function(ev, mouseMoveHandler) {\n        this.x = ev.x;\n        this.y = ev.y;\n\n        this.isMousePressed = true;\n        var renderer = this.editor.renderer;\n        if (renderer.$keepTextAreaAtCursor)\n            renderer.$keepTextAreaAtCursor = null;\n\n        var self = this;\n        var onMouseMove = function(e) {\n            self.x = e.clientX;\n            self.y = e.clientY;\n            mouseMoveHandler && mouseMoveHandler(e);\n        };\n\n        var onCaptureEnd = function(e) {\n            clearInterval(timerId);\n            onCaptureInterval();\n            self[self.state + \"End\"] && self[self.state + \"End\"](e);\n            self.$clickSelection = null;\n            if (renderer.$keepTextAreaAtCursor == null) {\n                renderer.$keepTextAreaAtCursor = true;\n                renderer.$moveTextAreaToCursor();\n            }\n            self.isMousePressed = false;\n            self.onMouseEvent(\"mouseup\", e);\n        };\n\n        var onCaptureInterval = function() {\n            self[self.state] && self[self.state]();\n        };\n\n        if (useragent.isOldIE && ev.domEvent.type == \"dblclick\") {\n            return setTimeout(function() {onCaptureEnd(ev);});\n        }\n\n        event.capture(this.editor.container, onMouseMove, onCaptureEnd);\n        var timerId = setInterval(onCaptureInterval, 20);\n    };\n}).call(MouseHandler.prototype);\n\nconfig.defineOptions(MouseHandler.prototype, \"mouseHandler\", {\n    scrollSpeed: {initialValue: 2},\n    dragDelay: {initialValue: 150},\n    dragEnabled: {initialValue: true},\n    focusTimout: {initialValue: 0}\n});\n\n\nexports.MouseHandler = MouseHandler;\n});\n\ndefine('ace/mouse/default_handlers', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/event', 'ace/lib/useragent'], function(require, exports, module) {\n\n\nvar dom = require(\"../lib/dom\");\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\n\nvar DRAG_OFFSET = 0; // pixels\n\nfunction DefaultHandlers(mouseHandler) {\n    mouseHandler.$clickSelection = null;\n\n    var editor = mouseHandler.editor;\n    editor.setDefaultHandler(\"mousedown\", this.onMouseDown.bind(mouseHandler));\n    editor.setDefaultHandler(\"dblclick\", this.onDoubleClick.bind(mouseHandler));\n    editor.setDefaultHandler(\"tripleclick\", this.onTripleClick.bind(mouseHandler));\n    editor.setDefaultHandler(\"quadclick\", this.onQuadClick.bind(mouseHandler));\n    editor.setDefaultHandler(\"mousewheel\", this.onMouseWheel.bind(mouseHandler));\n\n    var exports = [\"select\", \"startSelect\", \"selectEnd\", \"selectAllEnd\", \"selectByWordsEnd\",\n        \"selectByLinesEnd\", \"dragWait\", \"dragWaitEnd\", \"focusWait\"];\n\n    exports.forEach(function(x) {\n        mouseHandler[x] = this[x];\n    }, this);\n\n    mouseHandler.selectByLines = this.extendSelectionBy.bind(mouseHandler, \"getLineRange\");\n    mouseHandler.selectByWords = this.extendSelectionBy.bind(mouseHandler, \"getWordRange\");\n}\n\n(function() {\n\n    this.onMouseDown = function(ev) {\n        var inSelection = ev.inSelection();\n        var pos = ev.getDocumentPosition();\n        this.mousedownEvent = ev;\n        var editor = this.editor;\n\n        var button = ev.getButton();\n        if (button !== 0) {\n            var selectionRange = editor.getSelectionRange();\n            var selectionEmpty = selectionRange.isEmpty();\n\n            if (selectionEmpty) {\n                editor.moveCursorToPosition(pos);\n                editor.selection.clearSelection();\n            }\n            editor.textInput.onContextMenu(ev.domEvent);\n            return; // stopping event here breaks contextmenu on ff mac\n        }\n        if (inSelection && !editor.isFocused()) {\n            editor.focus();\n            if (this.$focusTimout && !this.$clickSelection && !editor.inMultiSelectMode) {\n                this.mousedownEvent.time = (new Date()).getTime();\n                this.setState(\"focusWait\");\n                this.captureMouse(ev);\n                return;\n            }\n        }\n\n        if (!inSelection || this.$clickSelection || ev.getShiftKey() || editor.inMultiSelectMode) {\n            this.startSelect(pos);\n        } else if (inSelection) {\n            this.mousedownEvent.time = (new Date()).getTime();\n            this.startSelect(pos);\n        }\n        this.captureMouse(ev);\n        return ev.preventDefault();\n    };\n\n    this.startSelect = function(pos) {\n        pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y);\n        var editor = this.editor;\n        var shiftPressed = this.mousedownEvent.getShiftKey();\n        setTimeout(function(){\n            if (shiftPressed) {\n                editor.selection.selectToPosition(pos);\n            }\n            else if (!this.$clickSelection) {\n                editor.moveCursorToPosition(pos);\n                editor.selection.clearSelection();\n            }\n        }.bind(this), 0);\n        if (editor.renderer.scroller.setCapture) {\n            editor.renderer.scroller.setCapture();\n        }\n        editor.setStyle(\"ace_selecting\");\n        this.setState(\"select\");\n    };\n\n    this.select = function() {\n        var anchor, editor = this.editor;\n        var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n\n        if (this.$clickSelection) {\n            var cmp = this.$clickSelection.comparePoint(cursor);\n\n            if (cmp == -1) {\n                anchor = this.$clickSelection.end;\n            } else if (cmp == 1) {\n                anchor = this.$clickSelection.start;\n            } else {\n                var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\n                cursor = orientedRange.cursor;\n                anchor = orientedRange.anchor;\n            }\n            editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n        }\n        editor.selection.selectToPosition(cursor);\n\n        editor.renderer.scrollCursorIntoView();\n    };\n\n    this.extendSelectionBy = function(unitName) {\n        var anchor, editor = this.editor;\n        var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n        var range = editor.selection[unitName](cursor.row, cursor.column);\n\n        if (this.$clickSelection) {\n            var cmpStart = this.$clickSelection.comparePoint(range.start);\n            var cmpEnd = this.$clickSelection.comparePoint(range.end);\n\n            if (cmpStart == -1 && cmpEnd <= 0) {\n                anchor = this.$clickSelection.end;\n                if (range.end.row != cursor.row || range.end.column != cursor.column)\n                    cursor = range.start;\n            } else if (cmpEnd == 1 && cmpStart >= 0) {\n                anchor = this.$clickSelection.start;\n                if (range.start.row != cursor.row || range.start.column != cursor.column)\n                    cursor = range.end;\n            } else if (cmpStart == -1 && cmpEnd == 1) {\n                cursor = range.end;\n                anchor = range.start;\n            } else {\n                var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\n                cursor = orientedRange.cursor;\n                anchor = orientedRange.anchor;\n            }\n            editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n        }\n        editor.selection.selectToPosition(cursor);\n\n        editor.renderer.scrollCursorIntoView();\n    };\n\n    this.selectEnd =\n    this.selectAllEnd =\n    this.selectByWordsEnd =\n    this.selectByLinesEnd = function() {\n        this.editor.unsetStyle(\"ace_selecting\");\n        if (this.editor.renderer.scroller.releaseCapture) {\n            this.editor.renderer.scroller.releaseCapture();\n        }\n    };\n\n    this.focusWait = function() {\n        var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n        var time = (new Date()).getTime();\n\n        if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimout)\n            this.startSelect(this.mousedownEvent.getDocumentPosition());\n    };\n\n    this.onDoubleClick = function(ev) {\n        var pos = ev.getDocumentPosition();\n        var editor = this.editor;\n        var session = editor.session;\n\n        var range = session.getBracketRange(pos);\n        if (range) {\n            if (range.isEmpty()) {\n                range.start.column--;\n                range.end.column++;\n            }\n            this.$clickSelection = range;\n            this.setState(\"select\");\n            return;\n        }\n\n        this.$clickSelection = editor.selection.getWordRange(pos.row, pos.column);\n        this.setState(\"selectByWords\");\n    };\n\n    this.onTripleClick = function(ev) {\n        var pos = ev.getDocumentPosition();\n        var editor = this.editor;\n\n        this.setState(\"selectByLines\");\n        this.$clickSelection = editor.selection.getLineRange(pos.row);\n    };\n\n    this.onQuadClick = function(ev) {\n        var editor = this.editor;\n\n        editor.selectAll();\n        this.$clickSelection = editor.getSelectionRange();\n        this.setState(\"selectAll\");\n    };\n\n    this.onMouseWheel = function(ev) {\n        if (ev.getShiftKey() || ev.getAccelKey())\n            return;\n        var t = ev.domEvent.timeStamp;\n        var dt = t - (this.$lastScrollTime||0);\n        \n        var editor = this.editor;\n        var isScrolable = editor.renderer.isScrollableBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);\n        if (isScrolable || dt < 200) {\n            this.$lastScrollTime = t;\n            editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);\n            return ev.stop();\n        }\n    };\n\n}).call(DefaultHandlers.prototype);\n\nexports.DefaultHandlers = DefaultHandlers;\n\nfunction calcDistance(ax, ay, bx, by) {\n    return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n}\n\nfunction calcRangeOrientation(range, cursor) {\n    if (range.start.row == range.end.row)\n        var cmp = 2 * cursor.column - range.start.column - range.end.column;\n    else if (range.start.row == range.end.row - 1 && !range.start.column && !range.end.column)\n        var cmp = cursor.column - 4;\n    else\n        var cmp = 2 * cursor.row - range.start.row - range.end.row;\n\n    if (cmp < 0)\n        return {cursor: range.start, anchor: range.end};\n    else\n        return {cursor: range.end, anchor: range.start};\n}\n\n});\n\ndefine('ace/mouse/default_gutter_handler', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/event'], function(require, exports, module) {\n\nvar dom = require(\"../lib/dom\");\nvar event = require(\"../lib/event\");\n\nfunction GutterHandler(mouseHandler) {\n    var editor = mouseHandler.editor;\n    var gutter = editor.renderer.$gutterLayer;\n\n    mouseHandler.editor.setDefaultHandler(\"guttermousedown\", function(e) {\n        if (!editor.isFocused() || e.getButton() != 0)\n            return;\n        var gutterRegion = gutter.getRegion(e);\n\n        if (gutterRegion == \"foldWidgets\")\n            return;\n\n        var row = e.getDocumentPosition().row;\n        var selection = editor.session.selection;\n\n        if (e.getShiftKey())\n            selection.selectTo(row, 0);\n        else {\n            if (e.domEvent.detail == 2) {\n                editor.selectAll();\n                return e.preventDefault();\n            }\n            mouseHandler.$clickSelection = editor.selection.getLineRange(row);\n        }\n        mouseHandler.setState(\"selectByLines\");\n        mouseHandler.captureMouse(e);\n        return e.preventDefault();\n    });\n\n\n    var tooltipTimeout, mouseEvent, tooltip, tooltipAnnotation;\n    function createTooltip() {\n        tooltip = dom.createElement(\"div\");\n        tooltip.className = \"ace_gutter-tooltip\";\n        tooltip.style.display = \"none\";\n        editor.container.appendChild(tooltip);\n    }\n\n    function showTooltip() {\n        if (!tooltip) {\n            createTooltip();\n        }\n        var row = mouseEvent.getDocumentPosition().row;\n        var annotation = gutter.$annotations[row];\n        if (!annotation)\n            return hideTooltip();\n\n        var maxRow = editor.session.getLength();\n        if (row == maxRow) {\n            var screenRow = editor.renderer.pixelToScreenCoordinates(0, mouseEvent.y).row;\n            var pos = mouseEvent.$pos;\n            if (screenRow > editor.session.documentToScreenRow(pos.row, pos.column))\n                return hideTooltip();\n        }\n\n        if (tooltipAnnotation == annotation)\n            return;\n        tooltipAnnotation = annotation.text.join(\"<br/>\");\n\n        tooltip.style.display = \"block\";\n        tooltip.innerHTML = tooltipAnnotation;\n        editor.on(\"mousewheel\", hideTooltip);\n\n        moveTooltip(mouseEvent);\n    }\n\n    function hideTooltip() {\n        if (tooltipTimeout)\n            tooltipTimeout = clearTimeout(tooltipTimeout);\n        if (tooltipAnnotation) {\n            tooltip.style.display = \"none\";\n            tooltipAnnotation = null;\n            editor.removeEventListener(\"mousewheel\", hideTooltip);\n        }\n    }\n\n    function moveTooltip(e) {\n        var rect = editor.renderer.$gutter.getBoundingClientRect();\n        tooltip.style.left = e.x + 15 + \"px\";\n        if (e.y + 3 * editor.renderer.lineHeight + 15 < rect.bottom) {\n            tooltip.style.bottom = \"\";\n            tooltip.style.top =  e.y + 15 + \"px\";\n        } else {\n            tooltip.style.top = \"\";\n            var innerHeight = window.innerHeight || document.documentElement.clientHeight;\n            tooltip.style.bottom = innerHeight - e.y + 5 + \"px\";\n        }\n    }\n\n    mouseHandler.editor.setDefaultHandler(\"guttermousemove\", function(e) {\n        var target = e.domEvent.target || e.domEvent.srcElement;\n        if (dom.hasCssClass(target, \"ace_fold-widget\"))\n            return hideTooltip();\n\n        if (tooltipAnnotation)\n            moveTooltip(e);\n\n        mouseEvent = e;\n        if (tooltipTimeout)\n            return;\n        tooltipTimeout = setTimeout(function() {\n            tooltipTimeout = null;\n            if (mouseEvent && !mouseHandler.isMousePressed)\n                showTooltip();\n            else\n                hideTooltip();\n        }, 50);\n    });\n\n    event.addListener(editor.renderer.$gutter, \"mouseout\", function(e) {\n        mouseEvent = null;\n        if (!tooltipAnnotation || tooltipTimeout)\n            return;\n\n        tooltipTimeout = setTimeout(function() {\n            tooltipTimeout = null;\n            hideTooltip();\n        }, 50);\n    });\n    \n    editor.on(\"changeSession\", hideTooltip);\n}\n\nexports.GutterHandler = GutterHandler;\n\n});\n\ndefine('ace/mouse/mouse_event', ['require', 'exports', 'module' , 'ace/lib/event', 'ace/lib/useragent'], function(require, exports, module) {\n\n\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nvar MouseEvent = exports.MouseEvent = function(domEvent, editor) {\n    this.domEvent = domEvent;\n    this.editor = editor;\n    \n    this.x = this.clientX = domEvent.clientX;\n    this.y = this.clientY = domEvent.clientY;\n\n    this.$pos = null;\n    this.$inSelection = null;\n    \n    this.propagationStopped = false;\n    this.defaultPrevented = false;\n};\n\n(function() {  \n    \n    this.stopPropagation = function() {\n        event.stopPropagation(this.domEvent);\n        this.propagationStopped = true;\n    };\n    \n    this.preventDefault = function() {\n        event.preventDefault(this.domEvent);\n        this.defaultPrevented = true;\n    };\n    \n    this.stop = function() {\n        this.stopPropagation();\n        this.preventDefault();\n    };\n    this.getDocumentPosition = function() {\n        if (this.$pos)\n            return this.$pos;\n        \n        this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY);\n        return this.$pos;\n    };\n    this.inSelection = function() {\n        if (this.$inSelection !== null)\n            return this.$inSelection;\n            \n        var editor = this.editor;\n        \n\n        var selectionRange = editor.getSelectionRange();\n        if (selectionRange.isEmpty())\n            this.$inSelection = false;\n        else {\n            var pos = this.getDocumentPosition();\n            this.$inSelection = selectionRange.contains(pos.row, pos.column);\n        }\n\n        return this.$inSelection;\n    };\n    this.getButton = function() {\n        return event.getButton(this.domEvent);\n    };\n    this.getShiftKey = function() {\n        return this.domEvent.shiftKey;\n    };\n    \n    this.getAccelKey = useragent.isMac\n        ? function() { return this.domEvent.metaKey; }\n        : function() { return this.domEvent.ctrlKey; };\n    \n}).call(MouseEvent.prototype);\n\n});\n\ndefine('ace/mouse/dragdrop_handler', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/event', 'ace/lib/useragent'], function(require, exports, module) {\n\n\nvar dom = require(\"../lib/dom\");\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\n\nvar AUTOSCROLL_DELAY = 200;\nvar SCROLL_CURSOR_DELAY = 200;\nvar SCROLL_CURSOR_HYSTERESIS = 5;\n\nfunction DragdropHandler(mouseHandler) {\n\n    var editor = mouseHandler.editor;\n\n    var blankImage = dom.createElement(\"img\");\n    blankImage.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n    if (useragent.isOpera)\n        blankImage.style.cssText = \"width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;\";\n\n    var exports = [\"dragWait\", \"dragWaitEnd\", \"startDrag\", \"dragReadyEnd\", \"onMouseDrag\"];\n\n     exports.forEach(function(x) {\n         mouseHandler[x] = this[x];\n    }, this);\n    editor.addEventListener(\"mousedown\", this.onMouseDown.bind(mouseHandler));\n\n\n    var mouseTarget = editor.container;\n    var dragSelectionMarker, x, y;\n    var timerId, range;\n    var dragCursor, counter = 0;\n    var dragOperation;\n    var isInternal;\n    var autoScrollStartTime;\n    var cursorMovedTime;\n    var cursorPointOnCaretMoved;\n\n    this.onDragStart = function(e) {\n        if (this.cancelDrag || !mouseTarget.draggable) {\n            var self = this;\n            setTimeout(function(){\n                self.startSelect();\n                self.captureMouse(e);\n            }, 0);\n            return e.preventDefault();\n        }\n        range = editor.getSelectionRange();\n\n        var dataTransfer = e.dataTransfer;\n        dataTransfer.effectAllowed = editor.getReadOnly() ? \"copy\" : \"copyMove\";\n        if (useragent.isOpera) {\n            editor.container.appendChild(blankImage);\n            blankImage._top = blankImage.offsetTop;\n        }\n        dataTransfer.setDragImage && dataTransfer.setDragImage(blankImage, 0, 0);\n        if (useragent.isOpera) {\n            editor.container.removeChild(blankImage);\n        }\n        dataTransfer.clearData();\n        dataTransfer.setData(\"Text\", editor.session.getTextRange());\n\n        isInternal = true;\n        this.setState(\"drag\");\n    };\n\n    this.onDragEnd = function(e) {\n        mouseTarget.draggable = false;\n        isInternal = false;\n        this.setState(null);\n        if (!editor.getReadOnly()) {\n            var dropEffect = e.dataTransfer.dropEffect;\n            if (!dragOperation && dropEffect == \"move\")\n                editor.session.remove(editor.getSelectionRange());\n            editor.renderer.$cursorLayer.setBlinking(true);\n        }\n        this.editor.unsetStyle(\"ace_dragging\");\n    };\n\n    this.onDragEnter = function(e) {\n        if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n            return;\n        if (!dragSelectionMarker)\n            addDragMarker();\n        counter++;\n        e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n        return event.preventDefault(e);\n    };\n\n    this.onDragOver = function(e) {\n        if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n            return;\n        if (!dragSelectionMarker) {\n            addDragMarker();\n            counter++;\n        }\n        if (onMouseMoveTimer !== null)\n            onMouseMoveTimer = null;\n        x = e.clientX;\n        y = e.clientY;\n\n        e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n        return event.preventDefault(e);\n    };\n\n    this.onDragLeave = function(e) {\n        counter--;\n        if (counter <= 0 && dragSelectionMarker) {\n            clearDragMarker();\n            dragOperation = null;\n            return event.preventDefault(e);\n        }\n    };\n\n    this.onDrop = function(e) {\n        if (!dragSelectionMarker)\n            return;\n        var dataTransfer = e.dataTransfer;\n        if (isInternal) {\n            switch (dragOperation) {\n                case \"move\":\n                    if (range.contains(dragCursor.row, dragCursor.column)) {\n                        range = {\n                            start: dragCursor,\n                            end: dragCursor\n                        };\n                    } else {\n                        range = editor.moveText(range, dragCursor);\n                    }\n                    break;\n                case \"copy\":\n                    range = editor.moveText(range, dragCursor, true);\n                    break;\n            }\n        } else {\n            var dropData = dataTransfer.getData('Text');\n            range = {\n                start: dragCursor,\n                end: editor.session.insert(dragCursor, dropData)\n            };\n            editor.focus();\n            dragOperation = null;\n        }\n        clearDragMarker();\n        return event.preventDefault(e);\n    };\n\n    event.addListener(mouseTarget, \"dragstart\", this.onDragStart.bind(mouseHandler));\n    event.addListener(mouseTarget, \"dragend\", this.onDragEnd.bind(mouseHandler));\n    event.addListener(mouseTarget, \"dragenter\", this.onDragEnter.bind(mouseHandler));\n    event.addListener(mouseTarget, \"dragover\", this.onDragOver.bind(mouseHandler));\n    event.addListener(mouseTarget, \"dragleave\", this.onDragLeave.bind(mouseHandler));\n    event.addListener(mouseTarget, \"drop\", this.onDrop.bind(mouseHandler));\n\n    function scrollCursorIntoView(cursor, prevCursor) {\n        var now = new Date().getTime();\n        var vMovement = !prevCursor || cursor.row != prevCursor.row;\n        var hMovement = !prevCursor || cursor.column != prevCursor.column;\n        if (!cursorMovedTime || vMovement || hMovement) {\n            editor.$blockScrolling += 1;\n            editor.moveCursorToPosition(cursor);\n            editor.$blockScrolling -= 1;\n            cursorMovedTime = now;\n            cursorPointOnCaretMoved = {x: x, y: y};\n        } else {\n            var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y);\n            if (distance > SCROLL_CURSOR_HYSTERESIS) {\n                cursorMovedTime = null;\n            } else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) {\n                editor.renderer.scrollCursorIntoView();\n                cursorMovedTime = null;\n            }\n        }\n    }\n\n    function autoScroll(cursor, prevCursor) {\n        var now = new Date().getTime();\n        var lineHeight = editor.renderer.layerConfig.lineHeight;\n        var characterWidth = editor.renderer.layerConfig.characterWidth;\n        var editorRect = editor.renderer.scroller.getBoundingClientRect();\n        var offsets = {\n           x: {\n               left: x - editorRect.left,\n               right: editorRect.right - x\n           },\n           y: {\n               top: y - editorRect.top,\n               bottom: editorRect.bottom - y\n           }\n        };\n        var nearestXOffset = Math.min(offsets.x.left, offsets.x.right);\n        var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom);\n        var scrollCursor = {row: cursor.row, column: cursor.column};\n        if (nearestXOffset / characterWidth <= 2) {\n            scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2);\n        }\n        if (nearestYOffset / lineHeight <= 1) {\n            scrollCursor.row += (offsets.y.top < offsets.y.bottom ? -1 : +1);\n        }\n        var vScroll = cursor.row != scrollCursor.row;\n        var hScroll = cursor.column != scrollCursor.column;\n        var vMovement = !prevCursor || cursor.row != prevCursor.row;\n        if (vScroll || (hScroll && !vMovement)) {\n            if (!autoScrollStartTime)\n                autoScrollStartTime = now;\n            else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY)\n                editor.renderer.scrollCursorIntoView(scrollCursor);\n        } else {\n            autoScrollStartTime = null;\n        }\n    }\n\n    function onDragInterval() {\n        var prevCursor = dragCursor;\n        dragCursor = editor.renderer.screenToTextCoordinates(x, y);\n        scrollCursorIntoView(dragCursor, prevCursor);\n        autoScroll(dragCursor, prevCursor);\n    }\n\n    function addDragMarker() {\n        range = editor.selection.toOrientedRange();\n        dragSelectionMarker = editor.session.addMarker(range, \"ace_selection\", editor.getSelectionStyle());\n        editor.clearSelection();\n        if (editor.isFocused())\n            editor.renderer.$cursorLayer.setBlinking(false);\n        clearInterval(timerId);\n        timerId = setInterval(onDragInterval, 20);\n        counter = 0;\n        event.addListener(document, \"mousemove\", onMouseMove);\n    }\n\n    function clearDragMarker() {\n        clearInterval(timerId);\n        editor.session.removeMarker(dragSelectionMarker);\n        dragSelectionMarker = null;\n        editor.$blockScrolling += 1;\n        editor.selection.fromOrientedRange(range);\n        editor.$blockScrolling -= 1;\n        if (editor.isFocused() && !isInternal)\n            editor.renderer.$cursorLayer.setBlinking(!editor.getReadOnly());\n        range = null;\n        counter = 0;\n        autoScrollStartTime = null;\n        cursorMovedTime = null;\n        event.removeListener(document, \"mousemove\", onMouseMove);\n    }\n    var onMouseMoveTimer = null;\n    function onMouseMove() {\n        if (onMouseMoveTimer == null) {\n            onMouseMoveTimer = setTimeout(function() {\n                if (onMouseMoveTimer != null && dragSelectionMarker)\n                    clearDragMarker();\n            }, 20);\n        }\n    }\n\n    function canAccept(dataTransfer) {\n        var types = dataTransfer.types;\n        return !types || Array.prototype.some.call(types, function(type) {\n            return type == 'text/plain' || type == 'Text';\n        });\n    }\n\n    function getDropEffect(e) {\n        var copyAllowed = ['copy', 'copymove', 'all', 'uninitialized'];\n        var moveAllowed = ['move', 'copymove', 'linkmove', 'all', 'uninitialized'];\n\n        var copyModifierState = useragent.isMac ? e.altKey : e.ctrlKey;\n        var effectAllowed = \"uninitialized\";\n        try {\n            effectAllowed = e.dataTransfer.effectAllowed.toLowerCase();\n        } catch (e) {}\n        var dropEffect = \"none\";\n\n        if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0)\n            dropEffect = \"copy\";\n        else if (moveAllowed.indexOf(effectAllowed) >= 0)\n            dropEffect = \"move\";\n        else if (copyAllowed.indexOf(effectAllowed) >= 0)\n            dropEffect = \"copy\";\n\n        return dropEffect;\n    }\n}\n\n(function() {\n\n    this.dragWait = function() {\n        var interval = (new Date()).getTime() - this.mousedownEvent.time;\n        if (interval > this.editor.getDragDelay())\n            this.startDrag();\n    };\n\n    this.dragWaitEnd = function() {\n        var target = this.editor.container;\n        target.draggable = false;\n        this.startSelect(this.mousedownEvent.getDocumentPosition());\n        this.selectEnd();\n    };\n\n    this.dragReadyEnd = function(e) {\n        this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly());\n        this.editor.unsetStyle(\"ace_dragging\");\n        this.dragWaitEnd();\n    };\n\n    this.startDrag = function(){\n        this.cancelDrag = false;\n        var target = this.editor.container;\n        target.draggable = true;\n        this.editor.renderer.$cursorLayer.setBlinking(false);\n        this.editor.setStyle(\"ace_dragging\");\n        this.setState(\"dragReady\");\n    };\n\n    this.onMouseDrag = function(e) {\n        var target = this.editor.container;\n        if (useragent.isIE && this.state == \"dragReady\") {\n            var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n            if (distance > 3)\n                target.dragDrop();\n        }\n        if (this.state === \"dragWait\") {\n            var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n            if (distance > 0) {\n                target.draggable = false;\n                this.startSelect(this.mousedownEvent.getDocumentPosition());\n            }\n        }\n    };\n\n    this.onMouseDown = function(e) {\n        if (!this.$dragEnabled)\n            return;\n        this.mousedownEvent = e;\n        var editor = this.editor;\n\n        var inSelection = e.inSelection();\n        var button = e.getButton();\n        var clickCount = e.domEvent.detail || 1;\n        if (clickCount === 1 && button === 0 && inSelection) {\n            this.mousedownEvent.time = (new Date()).getTime();\n            var eventTarget = e.domEvent.target || e.domEvent.srcElement;\n            if (\"unselectable\" in eventTarget)\n                eventTarget.unselectable = \"on\";\n            if (editor.getDragDelay()) {\n                if (useragent.isWebKit) {\n                    self.cancelDrag = true;\n                    var mouseTarget = editor.container;\n                    mouseTarget.draggable = true;\n                }\n                this.setState(\"dragWait\");\n            } else {\n                this.startDrag();\n            }\n            this.captureMouse(e, this.onMouseDrag.bind(this));\n            e.defaultPrevented = true;\n        }\n    };\n\n}).call(DragdropHandler.prototype);\n\n\nfunction calcDistance(ax, ay, bx, by) {\n    return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n}\n\nexports.DragdropHandler = DragdropHandler;\n\n});\n\ndefine('ace/config', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/lib/net', 'ace/lib/event_emitter'], function(require, exports, module) {\n\"no use strict\";\n\nvar lang = require(\"./lib/lang\");\nvar oop = require(\"./lib/oop\");\nvar net = require(\"./lib/net\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar global = (function() {\n    return this;\n})();\n\nvar options = {\n    packaged: false,\n    workerPath: null,\n    modePath: null,\n    themePath: null,\n    basePath: \"\",\n    suffix: \".js\",\n    $moduleUrls: {}\n};\n\nexports.get = function(key) {\n    if (!options.hasOwnProperty(key))\n        throw new Error(\"Unknown config key: \" + key);\n\n    return options[key];\n};\n\nexports.set = function(key, value) {\n    if (!options.hasOwnProperty(key))\n        throw new Error(\"Unknown config key: \" + key);\n\n    options[key] = value;\n};\n\nexports.all = function() {\n    return lang.copyObject(options);\n};\noop.implement(exports, EventEmitter);\n\nexports.moduleUrl = function(name, component) {\n    if (options.$moduleUrls[name])\n        return options.$moduleUrls[name];\n\n    var parts = name.split(\"/\");\n    component = component || parts[parts.length - 2] || \"\";\n    var sep = component == \"snippets\" ? \"/\" : \"-\";\n    var base = parts[parts.length - 1];    \n    if (sep == \"-\") {\n        var re = new RegExp(\"^\" + component + \"[\\\\-_]|[\\\\-_]\" + component + \"$\", \"g\");\n        base = base.replace(re, \"\");\n    }\n\n    if ((!base || base == component) && parts.length > 1)\n        base = parts[parts.length - 2];\n    var path = options[component + \"Path\"];\n    if (path == null) {\n        path = options.basePath;\n    } else if (sep == \"/\") {\n        component = sep = \"\";\n    }\n    if (path && path.slice(-1) != \"/\")\n        path += \"/\";\n    return path + component + sep + base + this.get(\"suffix\");\n};\n\nexports.setModuleUrl = function(name, subst) {\n    return options.$moduleUrls[name] = subst;\n};\n\nexports.$loading = {};\nexports.loadModule = function(moduleName, onLoad) {\n    var module, moduleType;\n    if (Array.isArray(moduleName)) {\n        moduleType = moduleName[0];\n        moduleName = moduleName[1];\n    }\n\n    try {\n        module = require(moduleName);\n    } catch (e) {}\n    if (module && !exports.$loading[moduleName])\n        return onLoad && onLoad(module);\n\n    if (!exports.$loading[moduleName])\n        exports.$loading[moduleName] = [];\n\n    exports.$loading[moduleName].push(onLoad);\n\n    if (exports.$loading[moduleName].length > 1)\n        return;\n\n    var afterLoad = function() {\n        require([moduleName], function(module) {\n            exports._emit(\"load.module\", {name: moduleName, module: module});\n            var listeners = exports.$loading[moduleName];\n            exports.$loading[moduleName] = null;\n            listeners.forEach(function(onLoad) {\n                onLoad && onLoad(module);\n            });\n        });\n    };\n\n    if (!exports.get(\"packaged\"))\n        return afterLoad();\n    net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad);\n};\nexports.init = function() {\n    options.packaged = require.packaged || module.packaged || (global.define && define.packaged);\n\n    if (!global.document)\n        return \"\";\n\n    var scriptOptions = {};\n    var scriptUrl = \"\";\n\n    var scripts = document.getElementsByTagName(\"script\");\n    for (var i=0; i<scripts.length; i++) {\n        var script = scripts[i];\n\n        var src = script.src || script.getAttribute(\"src\");\n        if (!src)\n            continue;\n\n        var attributes = script.attributes;\n        for (var j=0, l=attributes.length; j < l; j++) {\n            var attr = attributes[j];\n            if (attr.name.indexOf(\"data-ace-\") === 0) {\n                scriptOptions[deHyphenate(attr.name.replace(/^data-ace-/, \"\"))] = attr.value;\n            }\n        }\n\n        var m = src.match(/^(.*)\\/ace(\\-\\w+)?\\.js(\\?|$)/);\n        if (m)\n            scriptUrl = m[1];\n    }\n\n    if (scriptUrl) {\n        scriptOptions.base = scriptOptions.base || scriptUrl;\n        scriptOptions.packaged = true;\n    }\n\n    scriptOptions.basePath = scriptOptions.base;\n    scriptOptions.workerPath = scriptOptions.workerPath || scriptOptions.base;\n    scriptOptions.modePath = scriptOptions.modePath || scriptOptions.base;\n    scriptOptions.themePath = scriptOptions.themePath || scriptOptions.base;\n    delete scriptOptions.base;\n\n    for (var key in scriptOptions)\n        if (typeof scriptOptions[key] !== \"undefined\")\n            exports.set(key, scriptOptions[key]);\n};\n\nfunction deHyphenate(str) {\n    return str.replace(/-(.)/g, function(m, m1) { return m1.toUpperCase(); });\n}\n\nvar optionsProvider = {\n    setOptions: function(optList) {\n        Object.keys(optList).forEach(function(key) {\n            this.setOption(key, optList[key]);\n        }, this);\n    },\n    getOptions: function(optionNames) {\n        var result = {};\n        if (!optionNames) {\n            optionNames = Object.keys(this.$options);\n        } else if (!Array.isArray(optionNames)) {\n            result = optionNames;\n            optionNames = Object.keys(result);\n        }\n        optionNames.forEach(function(key) {\n            result[key] = this.getOption(key);\n        }, this);\n        return result;\n    },\n    setOption: function(name, value) {\n        if (this[\"$\" + name] === value)\n            return;\n        var opt = this.$options[name];\n        if (!opt) {\n            if (typeof console != \"undefined\" && console.warn)\n                console.warn('misspelled option \"' + name + '\"');\n            return undefined;\n        }\n        if (opt.forwardTo)\n            return this[opt.forwardTo] && this[opt.forwardTo].setOption(name, value);\n\n        if (!opt.handlesSet)\n            this[\"$\" + name] = value;\n        if (opt && opt.set)\n            opt.set.call(this, value);\n    },\n    getOption: function(name) {\n        var opt = this.$options[name];\n        if (!opt) {\n            if (typeof console != \"undefined\" && console.warn)\n                console.warn('misspelled option \"' + name + '\"');\n            return undefined;\n        }\n        if (opt.forwardTo)\n            return this[opt.forwardTo] && this[opt.forwardTo].getOption(name);\n        return opt && opt.get ? opt.get.call(this) : this[\"$\" + name];\n    }\n};\n\nvar defaultOptions = {};\nexports.defineOptions = function(obj, path, options) {\n    if (!obj.$options)\n        defaultOptions[path] = obj.$options = {};\n\n    Object.keys(options).forEach(function(key) {\n        var opt = options[key];\n        if (typeof opt == \"string\")\n            opt = {forwardTo: opt};\n\n        opt.name || (opt.name = key);\n        obj.$options[opt.name] = opt;\n        if (\"initialValue\" in opt)\n            obj[\"$\" + opt.name] = opt.initialValue;\n    });\n    oop.implement(obj, optionsProvider);\n\n    return this;\n};\n\nexports.resetOptions = function(obj) {\n    Object.keys(obj.$options).forEach(function(key) {\n        var opt = obj.$options[key];\n        if (\"value\" in opt)\n            obj.setOption(key, opt.value);\n    });\n};\n\nexports.setDefaultValue = function(path, name, value) {\n    var opts = defaultOptions[path] || (defaultOptions[path] = {});\n    if (opts[name]) {\n        if (opts.forwardTo)\n            exports.setDefaultValue(opts.forwardTo, name, value);\n        else\n            opts[name].value = value;\n    }\n};\n\nexports.setDefaultValues = function(path, optionHash) {\n    Object.keys(optionHash).forEach(function(key) {\n        exports.setDefaultValue(path, key, optionHash[key]);\n    });\n};\n\n});\ndefine('ace/lib/net', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) {\n\nvar dom = require(\"./dom\");\n\nexports.get = function (url, callback) {\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, true);\n    xhr.onreadystatechange = function () {\n        if (xhr.readyState === 4) {\n            callback(xhr.responseText);\n        }\n    };\n    xhr.send(null);\n};\n\nexports.loadScript = function(path, callback) {\n    var head = dom.getDocumentHead();\n    var s = document.createElement('script');\n\n    s.src = path;\n    head.appendChild(s);\n\n    s.onload = s.onreadystatechange = function(_, isAbort) {\n        if (isAbort || !s.readyState || s.readyState == \"loaded\" || s.readyState == \"complete\") {\n            s = s.onload = s.onreadystatechange = null;\n            if (!isAbort)\n                callback();\n        }\n    };\n};\n\n});\n\ndefine('ace/lib/event_emitter', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nvar EventEmitter = {};\nvar stopPropagation = function() { this.propagationStopped = true; };\nvar preventDefault = function() { this.defaultPrevented = true; };\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n    this._eventRegistry || (this._eventRegistry = {});\n    this._defaultHandlers || (this._defaultHandlers = {});\n\n    var listeners = this._eventRegistry[eventName] || [];\n    var defaultHandler = this._defaultHandlers[eventName];\n    if (!listeners.length && !defaultHandler)\n        return;\n\n    if (typeof e != \"object\" || !e)\n        e = {};\n\n    if (!e.type)\n        e.type = eventName;\n    if (!e.stopPropagation)\n        e.stopPropagation = stopPropagation;\n    if (!e.preventDefault)\n        e.preventDefault = preventDefault;\n\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++) {\n        listeners[i](e, this);\n        if (e.propagationStopped)\n            break;\n    }\n    \n    if (defaultHandler && !e.defaultPrevented)\n        return defaultHandler(e, this);\n};\n\n\nEventEmitter._signal = function(eventName, e) {\n    var listeners = (this._eventRegistry || {})[eventName];\n    if (!listeners)\n        return;\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++)\n        listeners[i](e, this);\n};\n\nEventEmitter.once = function(eventName, callback) {\n    var _self = this;\n    callback && this.addEventListener(eventName, function newCallback() {\n        _self.removeEventListener(eventName, newCallback);\n        callback.apply(null, arguments);\n    });\n};\n\n\nEventEmitter.setDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        handlers = this._defaultHandlers = {_disabled_: {}};\n    \n    if (handlers[eventName]) {\n        var old = handlers[eventName];\n        var disabled = handlers._disabled_[eventName];\n        if (!disabled)\n            handlers._disabled_[eventName] = disabled = [];\n        disabled.push(old);\n        var i = disabled.indexOf(callback);\n        if (i != -1) \n            disabled.splice(i, 1);\n    }\n    handlers[eventName] = callback;\n};\nEventEmitter.removeDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        return;\n    var disabled = handlers._disabled_[eventName];\n    \n    if (handlers[eventName] == callback) {\n        var old = handlers[eventName];\n        if (disabled)\n            this.setDefaultHandler(eventName, disabled.pop());\n    } else if (disabled) {\n        var i = disabled.indexOf(callback);\n        if (i != -1)\n            disabled.splice(i, 1);\n    }\n};\n\nEventEmitter.on =\nEventEmitter.addEventListener = function(eventName, callback, capturing) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        listeners = this._eventRegistry[eventName] = [];\n\n    if (listeners.indexOf(callback) == -1)\n        listeners[capturing ? \"unshift\" : \"push\"](callback);\n    return callback;\n};\n\nEventEmitter.off =\nEventEmitter.removeListener =\nEventEmitter.removeEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        return;\n\n    var index = listeners.indexOf(callback);\n    if (index !== -1)\n        listeners.splice(index, 1);\n};\n\nEventEmitter.removeAllListeners = function(eventName) {\n    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n};\n\nexports.EventEmitter = EventEmitter;\n\n});\n\ndefine('ace/mouse/fold_handler', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nfunction FoldHandler(editor) {\n\n    editor.on(\"click\", function(e) {\n        var position = e.getDocumentPosition();\n        var session = editor.session;\n        var fold = session.getFoldAt(position.row, position.column, 1);\n        if (fold) {\n            if (e.getAccelKey())\n                session.removeFold(fold);\n            else\n                session.expandFold(fold);\n\n            e.stop();\n        }\n    });\n\n    editor.on(\"gutterclick\", function(e) {\n        var gutterRegion = editor.renderer.$gutterLayer.getRegion(e);\n\n        if (gutterRegion == \"foldWidgets\") {\n            var row = e.getDocumentPosition().row;\n            var session = editor.session;\n            if (session.foldWidgets && session.foldWidgets[row])\n                editor.session.onFoldWidgetClick(row, e);\n            if (!editor.isFocused())\n                editor.focus();\n            e.stop();\n        }\n    });\n\n    editor.on(\"gutterdblclick\", function(e) {\n        var gutterRegion = editor.renderer.$gutterLayer.getRegion(e);\n\n        if (gutterRegion == \"foldWidgets\") {\n            var row = e.getDocumentPosition().row;\n            var session = editor.session;\n            var data = session.getParentFoldRangeData(row, true);\n            var range = data.range || data.firstRange;\n\n            if (range) {\n                row = range.start.row;\n                var fold = session.getFoldAt(row, session.getLine(row).length, 1);\n\n                if (fold) {\n                    session.removeFold(fold);\n                } else {\n                    session.addFold(\"...\", range);\n                    editor.renderer.scrollCursorIntoView({row: range.start.row, column: 0});\n                }\n            }\n            e.stop();\n        }\n    });\n}\n\nexports.FoldHandler = FoldHandler;\n\n});\n\ndefine('ace/keyboard/keybinding', ['require', 'exports', 'module' , 'ace/lib/keys', 'ace/lib/event'], function(require, exports, module) {\n\n\nvar keyUtil  = require(\"../lib/keys\");\nvar event = require(\"../lib/event\");\n\nvar KeyBinding = function(editor) {\n    this.$editor = editor;\n    this.$data = { };\n    this.$handlers = [];\n    this.setDefaultHandler(editor.commands);\n};\n\n(function() {\n    this.setDefaultHandler = function(kb) {\n        this.removeKeyboardHandler(this.$defaultHandler);\n        this.$defaultHandler = kb;\n        this.addKeyboardHandler(kb, 0);\n        this.$data = {editor: this.$editor};\n    };\n\n    this.setKeyboardHandler = function(kb) {\n        var h = this.$handlers;\n        if (h[h.length - 1] == kb)\n            return;\n\n        while (h[h.length - 1] && h[h.length - 1] != this.$defaultHandler)\n            this.removeKeyboardHandler(h[h.length - 1]);\n\n        this.addKeyboardHandler(kb, 1);\n    };\n\n    this.addKeyboardHandler = function(kb, pos) {\n        if (!kb)\n            return;\n        var i = this.$handlers.indexOf(kb);\n        if (i != -1)\n            this.$handlers.splice(i, 1);\n\n        if (pos == undefined)\n            this.$handlers.push(kb);\n        else\n            this.$handlers.splice(pos, 0, kb);\n\n        if (i == -1 && kb.attach)\n            kb.attach(this.$editor);\n    };\n\n    this.removeKeyboardHandler = function(kb) {\n        var i = this.$handlers.indexOf(kb);\n        if (i == -1)\n            return false;\n        this.$handlers.splice(i, 1);\n        kb.detach && kb.detach(this.$editor);\n        return true;\n    };\n\n    this.getKeyboardHandler = function() {\n        return this.$handlers[this.$handlers.length - 1];\n    };\n\n    this.$callKeyboardHandlers = function (hashId, keyString, keyCode, e) {\n        var toExecute;\n        var success = false;\n        var commands = this.$editor.commands;\n\n        for (var i = this.$handlers.length; i--;) {\n            toExecute = this.$handlers[i].handleKeyboard(\n                this.$data, hashId, keyString, keyCode, e\n            );\n            if (!toExecute || !toExecute.command)\n                continue;\n            if (toExecute.command == \"null\") {\n                success = true;\n            } else {\n                success = commands.exec(toExecute.command, this.$editor, toExecute.args, e);                \n            }\n            if (success && e && hashId != -1 && \n                toExecute.passEvent !== true && toExecute.command.passEvent !== true\n            ) {\n                event.stopEvent(e);\n            }\n            if (success)\n                break;\n        }\n        return success;\n    };\n\n    this.onCommandKey = function(e, hashId, keyCode) {\n        var keyString = keyUtil.keyCodeToString(keyCode);\n        this.$callKeyboardHandlers(hashId, keyString, keyCode, e);\n    };\n\n    this.onTextInput = function(text) {\n        var success = this.$callKeyboardHandlers(-1, text);\n        if (!success)\n            this.$editor.commands.exec(\"insertstring\", this.$editor, text);\n    };\n\n}).call(KeyBinding.prototype);\n\nexports.KeyBinding = KeyBinding;\n});\n\ndefine('ace/edit_session', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/config', 'ace/lib/event_emitter', 'ace/selection', 'ace/mode/text', 'ace/range', 'ace/document', 'ace/background_tokenizer', 'ace/search_highlight', 'ace/edit_session/folding', 'ace/edit_session/bracket_match'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar lang = require(\"./lib/lang\");\nvar config = require(\"./config\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Selection = require(\"./selection\").Selection;\nvar TextMode = require(\"./mode/text\").Mode;\nvar Range = require(\"./range\").Range;\nvar Document = require(\"./document\").Document;\nvar BackgroundTokenizer = require(\"./background_tokenizer\").BackgroundTokenizer;\nvar SearchHighlight = require(\"./search_highlight\").SearchHighlight;\n\nvar EditSession = function(text, mode) {\n    this.$breakpoints = [];\n    this.$decorations = [];\n    this.$frontMarkers = {};\n    this.$backMarkers = {};\n    this.$markerId = 1;\n    this.$undoSelect = true;\n\n    this.$foldData = [];\n    this.$foldData.toString = function() {\n        return this.join(\"\\n\");\n    }\n    this.on(\"changeFold\", this.onChangeFold.bind(this));\n    this.$onChange = this.onChange.bind(this);\n\n    if (typeof text != \"object\" || !text.getLine)\n        text = new Document(text);\n\n    this.setDocument(text);\n    this.selection = new Selection(this);\n\n    config.resetOptions(this);\n    this.setMode(mode);\n    config._emit(\"session\", this);\n};\n\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setDocument = function(doc) {\n        if (this.doc)\n            this.doc.removeListener(\"change\", this.$onChange);\n\n        this.doc = doc;\n        doc.on(\"change\", this.$onChange);\n\n        if (this.bgTokenizer)\n            this.bgTokenizer.setDocument(this.getDocument());\n\n        this.resetCaches();\n    };\n    this.getDocument = function() {\n        return this.doc;\n    };\n    this.$resetRowCache = function(docRow) {\n        if (!docRow) {\n            this.$docRowCache = [];\n            this.$screenRowCache = [];\n            return;\n        }\n        var l = this.$docRowCache.length;\n        var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1;\n        if (l > i) {\n            this.$docRowCache.splice(i, l);\n            this.$screenRowCache.splice(i, l);\n        }\n    };\n\n    this.$getRowCacheIndex = function(cacheArray, val) {\n        var low = 0;\n        var hi = cacheArray.length - 1;\n\n        while (low <= hi) {\n            var mid = (low + hi) >> 1;\n            var c = cacheArray[mid];\n\n            if (val > c)\n                low = mid + 1;\n            else if (val < c)\n                hi = mid - 1;\n            else\n                return mid;\n        }\n\n        return low -1;\n    };\n\n    this.resetCaches = function() {\n        this.$modified = true;\n        this.$wrapData = [];\n        this.$rowLengthCache = [];\n        this.$resetRowCache(0);\n        if (this.bgTokenizer)\n            this.bgTokenizer.start(0);\n    };\n\n    this.onChangeFold = function(e) {\n        var fold = e.data;\n        this.$resetRowCache(fold.start.row);\n    };\n\n    this.onChange = function(e) {\n        var delta = e.data;\n        this.$modified = true;\n\n        this.$resetRowCache(delta.range.start.row);\n\n        var removedFolds = this.$updateInternalDataOnChange(e);\n        if (!this.$fromUndo && this.$undoManager && !delta.ignore) {\n            this.$deltasDoc.push(delta);\n            if (removedFolds && removedFolds.length != 0) {\n                this.$deltasFold.push({\n                    action: \"removeFolds\",\n                    folds:  removedFolds\n                });\n            }\n\n            this.$informUndoManager.schedule();\n        }\n\n        this.bgTokenizer.$updateOnChange(delta);\n        this._emit(\"change\", e);\n    };\n    this.setValue = function(text) {\n        this.doc.setValue(text);\n        this.selection.moveCursorTo(0, 0);\n        this.selection.clearSelection();\n\n        this.$resetRowCache(0);\n        this.$deltas = [];\n        this.$deltasDoc = [];\n        this.$deltasFold = [];\n        this.getUndoManager().reset();\n    };\n    this.getValue =\n    this.toString = function() {\n        return this.doc.getValue();\n    };\n    this.getSelection = function() {\n        return this.selection;\n    };\n    this.getState = function(row) {\n        return this.bgTokenizer.getState(row);\n    };\n    this.getTokens = function(row) {\n        return this.bgTokenizer.getTokens(row);\n    };\n    this.getTokenAt = function(row, column) {\n        var tokens = this.bgTokenizer.getTokens(row);\n        var token, c = 0;\n        if (column == null) {\n            i = tokens.length - 1;\n            c = this.getLine(row).length;\n        } else {\n            for (var i = 0; i < tokens.length; i++) {\n                c += tokens[i].value.length;\n                if (c >= column)\n                    break;\n            }\n        }\n        token = tokens[i];\n        if (!token)\n            return null;\n        token.index = i;\n        token.start = c - token.value.length;\n        return token;\n    };\n    this.setUndoManager = function(undoManager) {\n        this.$undoManager = undoManager;\n        this.$deltas = [];\n        this.$deltasDoc = [];\n        this.$deltasFold = [];\n\n        if (this.$informUndoManager)\n            this.$informUndoManager.cancel();\n\n        if (undoManager) {\n            var self = this;\n\n            this.$syncInformUndoManager = function() {\n                self.$informUndoManager.cancel();\n\n                if (self.$deltasFold.length) {\n                    self.$deltas.push({\n                        group: \"fold\",\n                        deltas: self.$deltasFold\n                    });\n                    self.$deltasFold = [];\n                }\n\n                if (self.$deltasDoc.length) {\n                    self.$deltas.push({\n                        group: \"doc\",\n                        deltas: self.$deltasDoc\n                    });\n                    self.$deltasDoc = [];\n                }\n\n                if (self.$deltas.length > 0) {\n                    undoManager.execute({\n                        action: \"aceupdate\",\n                        args: [self.$deltas, self],\n                        merge: self.mergeUndoDeltas\n                    });\n                }\n                self.mergeUndoDeltas = false;\n                self.$deltas = [];\n            }\n            this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager);\n        }\n    };\n    this.markUndoGroup = function() {\n        if (this.$syncInformUndoManager)\n            this.$syncInformUndoManager();\n    };\n    \n    this.$defaultUndoManager = {\n        undo: function() {},\n        redo: function() {},\n        reset: function() {}\n    };\n    this.getUndoManager = function() {\n        return this.$undoManager || this.$defaultUndoManager;\n    };\n    this.getTabString = function() {\n        if (this.getUseSoftTabs()) {\n            return lang.stringRepeat(\" \", this.getTabSize());\n        } else {\n            return \"\\t\";\n        }\n    };\n    this.setUseSoftTabs = function(val) {\n        this.setOption(\"useSoftTabs\", val);\n    };\n    this.getUseSoftTabs = function() {\n        return this.$useSoftTabs && !this.$mode.$indentWithTabs;\n    };\n    this.setTabSize = function(tabSize) {\n        this.setOption(\"tabSize\", tabSize)\n    };\n    this.getTabSize = function() {\n        return this.$tabSize;\n    };\n    this.isTabStop = function(position) {\n        return this.$useSoftTabs && (position.column % this.$tabSize == 0);\n    };\n\n    this.$overwrite = false;\n    this.setOverwrite = function(overwrite) {\n        this.setOption(\"overwrite\", overwrite)\n    };\n    this.getOverwrite = function() {\n        return this.$overwrite;\n    };\n    this.toggleOverwrite = function() {\n        this.setOverwrite(!this.$overwrite);\n    };\n    this.addGutterDecoration = function(row, className) {\n        if (!this.$decorations[row])\n            this.$decorations[row] = \"\";\n        this.$decorations[row] += \" \" + className;\n        this._emit(\"changeBreakpoint\", {});\n    };\n    this.removeGutterDecoration = function(row, className) {\n        this.$decorations[row] = (this.$decorations[row] || \"\").replace(\" \" + className, \"\");\n        this._emit(\"changeBreakpoint\", {});\n    };\n    this.getBreakpoints = function() {\n        return this.$breakpoints;\n    };\n    this.setBreakpoints = function(rows) {\n        this.$breakpoints = [];\n        for (var i=0; i<rows.length; i++) {\n            this.$breakpoints[rows[i]] = \"ace_breakpoint\";\n        }\n        this._emit(\"changeBreakpoint\", {});\n    };\n    this.clearBreakpoints = function() {\n        this.$breakpoints = [];\n        this._emit(\"changeBreakpoint\", {});\n    };\n    this.setBreakpoint = function(row, className) {\n        if (className === undefined)\n            className = \"ace_breakpoint\";\n        if (className)\n            this.$breakpoints[row] = className;\n        else\n            delete this.$breakpoints[row];\n        this._emit(\"changeBreakpoint\", {});\n    };\n    this.clearBreakpoint = function(row) {\n        delete this.$breakpoints[row];\n        this._emit(\"changeBreakpoint\", {});\n    };\n    this.addMarker = function(range, clazz, type, inFront) {\n        var id = this.$markerId++;\n\n        var marker = {\n            range : range,\n            type : type || \"line\",\n            renderer: typeof type == \"function\" ? type : null,\n            clazz : clazz,\n            inFront: !!inFront,\n            id: id\n        }\n\n        if (inFront) {\n            this.$frontMarkers[id] = marker;\n            this._emit(\"changeFrontMarker\")\n        } else {\n            this.$backMarkers[id] = marker;\n            this._emit(\"changeBackMarker\")\n        }\n\n        return id;\n    };\n    this.addDynamicMarker = function(marker, inFront) {\n        if (!marker.update)\n            return;\n        var id = this.$markerId++;\n        marker.id = id;\n        marker.inFront = !!inFront;\n\n        if (inFront) {\n            this.$frontMarkers[id] = marker;\n            this._emit(\"changeFrontMarker\")\n        } else {\n            this.$backMarkers[id] = marker;\n            this._emit(\"changeBackMarker\")\n        }\n\n        return marker;\n    };\n    this.removeMarker = function(markerId) {\n        var marker = this.$frontMarkers[markerId] || this.$backMarkers[markerId];\n        if (!marker)\n            return;\n\n        var markers = marker.inFront ? this.$frontMarkers : this.$backMarkers;\n        if (marker) {\n            delete (markers[markerId]);\n            this._emit(marker.inFront ? \"changeFrontMarker\" : \"changeBackMarker\");\n        }\n    };\n    this.getMarkers = function(inFront) {\n        return inFront ? this.$frontMarkers : this.$backMarkers;\n    };\n\n    this.highlight = function(re) {\n        if (!this.$searchHighlight) {\n            var highlight = new SearchHighlight(null, \"ace_selected-word\", \"text\");\n            this.$searchHighlight = this.addDynamicMarker(highlight);\n        }\n        this.$searchHighlight.setRegexp(re);\n    }\n    this.highlightLines = function(startRow, endRow, clazz, inFront) {\n        if (typeof endRow != \"number\") {\n            clazz = endRow;\n            endRow = startRow;\n        }\n        if (!clazz)\n            clazz = \"ace_step\";\n\n        var range = new Range(startRow, 0, endRow, Infinity);\n        range.id = this.addMarker(range, clazz, \"fullLine\", inFront);\n        return range;\n    };\n    this.setAnnotations = function(annotations) {\n        this.$annotations = annotations;\n        this._emit(\"changeAnnotation\", {});\n    };\n    this.getAnnotations = function() {\n        return this.$annotations || [];\n    };\n    this.clearAnnotations = function() {\n        this.setAnnotations([]);\n    };\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r?\\n)/m);\n        if (match) {\n            this.$autoNewLine = match[1];\n        } else {\n            this.$autoNewLine = \"\\n\";\n        }\n    };\n    this.getWordRange = function(row, column) {\n        var line = this.getLine(row);\n\n        var inToken = false;\n        if (column > 0)\n            inToken = !!line.charAt(column - 1).match(this.tokenRe);\n\n        if (!inToken)\n            inToken = !!line.charAt(column).match(this.tokenRe);\n\n        if (inToken)\n            var re = this.tokenRe;\n        else if (/^\\s+$/.test(line.slice(column-1, column+1)))\n            var re = /\\s/;\n        else\n            var re = this.nonTokenRe;\n\n        var start = column;\n        if (start > 0) {\n            do {\n                start--;\n            }\n            while (start >= 0 && line.charAt(start).match(re));\n            start++;\n        }\n\n        var end = column;\n        while (end < line.length && line.charAt(end).match(re)) {\n            end++;\n        }\n\n        return new Range(row, start, row, end);\n    };\n    this.getAWordRange = function(row, column) {\n        var wordRange = this.getWordRange(row, column);\n        var line = this.getLine(wordRange.end.row);\n\n        while (line.charAt(wordRange.end.column).match(/[ \\t]/)) {\n            wordRange.end.column += 1;\n        }\n        return wordRange;\n    };\n    this.setNewLineMode = function(newLineMode) {\n        this.doc.setNewLineMode(newLineMode);\n    };\n    this.getNewLineMode = function() {\n        return this.doc.getNewLineMode();\n    };\n    this.setUseWorker = function(useWorker) { this.setOption(\"useWorker\", useWorker); };\n    this.getUseWorker = function() { return this.$useWorker; };\n    this.onReloadTokenizer = function(e) {\n        var rows = e.data;\n        this.bgTokenizer.start(rows.first);\n        this._emit(\"tokenizerUpdate\", e);\n    };\n\n    this.$modes = {};\n    this.$mode = null;\n    this.$modeId = null;\n    this.setMode = function(mode, cb) {\n        if (mode && typeof mode === \"object\") {\n            if (mode.getTokenizer)\n                return this.$onChangeMode(mode);\n            var options = mode;\n            var path = options.path;\n        } else {\n            path = mode || \"ace/mode/text\";\n        }\n        if (!this.$modes[\"ace/mode/text\"])\n            this.$modes[\"ace/mode/text\"] = new TextMode();\n\n        if (this.$modes[path] && !options) {\n            this.$onChangeMode(this.$modes[path]);\n            cb && cb();\n            return;\n        }\n        this.$modeId = path;\n        config.loadModule([\"mode\", path], function(m) {\n            if (this.$modeId !== path)\n                return cb && cb();\n            if (this.$modes[path] && !options)\n                return this.$onChangeMode(this.$modes[path]);\n            if (m && m.Mode) {\n                m = new m.Mode(options);\n                if (!options) {\n                    this.$modes[path] = m;\n                    m.$id = path;\n                }\n                this.$onChangeMode(m);\n                cb && cb();\n            }\n        }.bind(this));\n        if (!this.$mode)\n            this.$onChangeMode(this.$modes[\"ace/mode/text\"], true);\n    };\n\n    this.$onChangeMode = function(mode, $isPlaceholder) {\n        if (!$isPlaceholder)\n            this.$modeId = mode.$id;\n        if (this.$mode === mode) \n            return;\n\n        this.$mode = mode;\n\n        this.$stopWorker();\n\n        if (this.$useWorker)\n            this.$startWorker();\n\n        var tokenizer = mode.getTokenizer();\n\n        if(tokenizer.addEventListener !== undefined) {\n            var onReloadTokenizer = this.onReloadTokenizer.bind(this);\n            tokenizer.addEventListener(\"update\", onReloadTokenizer);\n        }\n\n        if (!this.bgTokenizer) {\n            this.bgTokenizer = new BackgroundTokenizer(tokenizer);\n            var _self = this;\n            this.bgTokenizer.addEventListener(\"update\", function(e) {\n                _self._emit(\"tokenizerUpdate\", e);\n            });\n        } else {\n            this.bgTokenizer.setTokenizer(tokenizer);\n        }\n\n        this.bgTokenizer.setDocument(this.getDocument());\n\n        this.tokenRe = mode.tokenRe;\n        this.nonTokenRe = mode.nonTokenRe;\n\n        \n        if (!$isPlaceholder) {\n            this.$options.wrapMethod.set.call(this, this.$wrapMethod);\n            this.$setFolding(mode.foldingRules);\n            this._emit(\"changeMode\");\n            this.bgTokenizer.start(0);\n        }\n    };\n\n\n    this.$stopWorker = function() {\n        if (this.$worker)\n            this.$worker.terminate();\n\n        this.$worker = null;\n    };\n\n    this.$startWorker = function() {\n        if (typeof Worker !== \"undefined\" && !require.noWorker) {\n            try {\n                this.$worker = this.$mode.createWorker(this);\n            } catch (e) {\n                console.log(\"Could not load worker\");\n                console.log(e);\n                this.$worker = null;\n            }\n        }\n        else\n            this.$worker = null;\n    };\n    this.getMode = function() {\n        return this.$mode;\n    };\n\n    this.$scrollTop = 0;\n    this.setScrollTop = function(scrollTop) {\n        if (this.$scrollTop === scrollTop || isNaN(scrollTop))\n            return;\n\n        this.$scrollTop = scrollTop;\n        this._signal(\"changeScrollTop\", scrollTop);\n    };\n    this.getScrollTop = function() {\n        return this.$scrollTop;\n    };\n\n    this.$scrollLeft = 0;\n    this.setScrollLeft = function(scrollLeft) {\n        if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft))\n            return;\n\n        this.$scrollLeft = scrollLeft;\n        this._signal(\"changeScrollLeft\", scrollLeft);\n    };\n    this.getScrollLeft = function() {\n        return this.$scrollLeft;\n    };\n    this.getScreenWidth = function() {\n        this.$computeWidth();\n        if (this.lineWidgets) \n            return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth);\n        return this.screenWidth;\n    };\n    \n    this.getLineWidgetMaxWidth = function() {\n        if (this.lineWidgetsWidth != null) return this.lineWidgetsWidth\n        var width = 0;\n        this.lineWidgets.forEach(function(w) {\n            if (w && w.screenWidth > width)\n                width = w.screenWidth;\n        });\n        return this.lineWidgetWidth = width;\n    }\n\n    this.$computeWidth = function(force) {\n        if (this.$modified || force) {\n            this.$modified = false;\n\n            if (this.$useWrapMode)\n                return this.screenWidth = this.$wrapLimit;\n\n            var lines = this.doc.getAllLines();\n            var cache = this.$rowLengthCache;\n            var longestScreenLine = 0;\n            var foldIndex = 0;\n            var foldLine = this.$foldData[foldIndex];\n            var foldStart = foldLine ? foldLine.start.row : Infinity;\n            var len = lines.length;\n\n            for (var i = 0; i < len; i++) {\n                if (i > foldStart) {\n                    i = foldLine.end.row + 1;\n                    if (i >= len)\n                        break;\n                    foldLine = this.$foldData[foldIndex++];\n                    foldStart = foldLine ? foldLine.start.row : Infinity;\n                }\n\n                if (cache[i] == null)\n                    cache[i] = this.$getStringScreenWidth(lines[i])[0];\n\n                if (cache[i] > longestScreenLine)\n                    longestScreenLine = cache[i];\n            }\n            this.screenWidth = longestScreenLine;\n        }\n    };\n    this.getLine = function(row) {\n        return this.doc.getLine(row);\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.doc.getLines(firstRow, lastRow);\n    };\n    this.getLength = function() {\n        return this.doc.getLength();\n    };\n    this.getTextRange = function(range) {\n        return this.doc.getTextRange(range || this.selection.getRange());\n    };\n    this.insert = function(position, text) {\n        return this.doc.insert(position, text);\n    };\n    this.remove = function(range) {\n        return this.doc.remove(range);\n    };\n    this.undoChanges = function(deltas, dontSelect) {\n        if (!deltas.length)\n            return;\n\n        this.$fromUndo = true;\n        var lastUndoRange = null;\n        for (var i = deltas.length - 1; i != -1; i--) {\n            var delta = deltas[i];\n            if (delta.group == \"doc\") {\n                this.doc.revertDeltas(delta.deltas);\n                lastUndoRange =\n                    this.$getUndoSelection(delta.deltas, true, lastUndoRange);\n            } else {\n                delta.deltas.forEach(function(foldDelta) {\n                    this.addFolds(foldDelta.folds);\n                }, this);\n            }\n        }\n        this.$fromUndo = false;\n        lastUndoRange &&\n            this.$undoSelect &&\n            !dontSelect &&\n            this.selection.setSelectionRange(lastUndoRange);\n        return lastUndoRange;\n    };\n    this.redoChanges = function(deltas, dontSelect) {\n        if (!deltas.length)\n            return;\n\n        this.$fromUndo = true;\n        var lastUndoRange = null;\n        for (var i = 0; i < deltas.length; i++) {\n            var delta = deltas[i];\n            if (delta.group == \"doc\") {\n                this.doc.applyDeltas(delta.deltas);\n                lastUndoRange =\n                    this.$getUndoSelection(delta.deltas, false, lastUndoRange);\n            }\n        }\n        this.$fromUndo = false;\n        lastUndoRange &&\n            this.$undoSelect &&\n            !dontSelect &&\n            this.selection.setSelectionRange(lastUndoRange);\n        return lastUndoRange;\n    };\n    this.setUndoSelect = function(enable) {\n        this.$undoSelect = enable;\n    };\n\n    this.$getUndoSelection = function(deltas, isUndo, lastUndoRange) {\n        function isInsert(delta) {\n            var insert =\n                delta.action === \"insertText\" || delta.action === \"insertLines\";\n            return isUndo ? !insert : insert;\n        }\n\n        var delta = deltas[0];\n        var range, point;\n        var lastDeltaIsInsert = false;\n        if (isInsert(delta)) {\n            range = Range.fromPoints(delta.range.start, delta.range.end);\n            lastDeltaIsInsert = true;\n        } else {\n            range = Range.fromPoints(delta.range.start, delta.range.start);\n            lastDeltaIsInsert = false;\n        }\n\n        for (var i = 1; i < deltas.length; i++) {\n            delta = deltas[i];\n            if (isInsert(delta)) {\n                point = delta.range.start;\n                if (range.compare(point.row, point.column) == -1) {\n                    range.setStart(delta.range.start);\n                }\n                point = delta.range.end;\n                if (range.compare(point.row, point.column) == 1) {\n                    range.setEnd(delta.range.end);\n                }\n                lastDeltaIsInsert = true;\n            } else {\n                point = delta.range.start;\n                if (range.compare(point.row, point.column) == -1) {\n                    range =\n                        Range.fromPoints(delta.range.start, delta.range.start);\n                }\n                lastDeltaIsInsert = false;\n            }\n        }\n        if (lastUndoRange != null) {\n            if (Range.comparePoints(lastUndoRange.start, range.start) == 0) {\n                lastUndoRange.start.column += range.end.column - range.start.column;\n                lastUndoRange.end.column += range.end.column - range.start.column;\n            }\n\n            var cmp = lastUndoRange.compareRange(range);\n            if (cmp == 1) {\n                range.setStart(lastUndoRange.start);\n            } else if (cmp == -1) {\n                range.setEnd(lastUndoRange.end);\n            }\n        }\n\n        return range;\n    };\n    this.replace = function(range, text) {\n        return this.doc.replace(range, text);\n    };\n    this.moveText = function(fromRange, toPosition, copy) {\n        var text = this.getTextRange(fromRange);\n        var folds = this.getFoldsInRange(fromRange);\n\n        var toRange = Range.fromPoints(toPosition, toPosition);\n        if (!copy) {\n            this.remove(fromRange);\n            var rowDiff = fromRange.start.row - fromRange.end.row;\n            var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column;\n            if (collDiff) {\n                if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column)\n                    toRange.start.column += collDiff;\n                if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column)\n                    toRange.end.column += collDiff;\n            }\n            if (rowDiff && toRange.start.row >= fromRange.end.row) {\n                toRange.start.row += rowDiff;\n                toRange.end.row += rowDiff;\n            }\n        }\n\n        toRange.end = this.insert(toRange.start, text);\n        if (folds.length) {\n            var oldStart = fromRange.start;\n            var newStart = toRange.start;\n            var rowDiff = newStart.row - oldStart.row;\n            var collDiff = newStart.column - oldStart.column;\n            this.addFolds(folds.map(function(x) {\n                x = x.clone();\n                if (x.start.row == oldStart.row)\n                    x.start.column += collDiff;\n                if (x.end.row == oldStart.row)\n                    x.end.column += collDiff;\n                x.start.row += rowDiff;\n                x.end.row += rowDiff;\n                return x;\n            }));\n        }\n\n        return toRange;\n    };\n    this.indentRows = function(startRow, endRow, indentString) {\n        indentString = indentString.replace(/\\t/g, this.getTabString());\n        for (var row=startRow; row<=endRow; row++)\n            this.insert({row: row, column:0}, indentString);\n    };\n    this.outdentRows = function (range) {\n        var rowRange = range.collapseRows();\n        var deleteRange = new Range(0, 0, 0, 0);\n        var size = this.getTabSize();\n\n        for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) {\n            var line = this.getLine(i);\n\n            deleteRange.start.row = i;\n            deleteRange.end.row = i;\n            for (var j = 0; j < size; ++j)\n                if (line.charAt(j) != ' ')\n                    break;\n            if (j < size && line.charAt(j) == '\\t') {\n                deleteRange.start.column = j;\n                deleteRange.end.column = j + 1;\n            } else {\n                deleteRange.start.column = 0;\n                deleteRange.end.column = j;\n            }\n            this.remove(deleteRange);\n        }\n    };\n\n    this.$moveLines = function(firstRow, lastRow, dir) {\n        firstRow = this.getRowFoldStart(firstRow);\n        lastRow = this.getRowFoldEnd(lastRow);\n        if (dir < 0) {\n            var row = this.getRowFoldStart(firstRow + dir);\n            if (row < 0) return 0;\n            var diff = row-firstRow;\n        } else if (dir > 0) {\n            var row = this.getRowFoldEnd(lastRow + dir);\n            if (row > this.doc.getLength()-1) return 0;\n            var diff = row-lastRow;\n        } else {\n            firstRow = this.$clipRowToDocument(firstRow);\n            lastRow = this.$clipRowToDocument(lastRow);\n            var diff = lastRow - firstRow + 1;\n        }\n\n        var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE);\n        var folds = this.getFoldsInRange(range).map(function(x){\n            x = x.clone();\n            x.start.row += diff;\n            x.end.row += diff;\n            return x;\n        });\n\n        var lines = dir == 0\n            ? this.doc.getLines(firstRow, lastRow)\n            : this.doc.removeLines(firstRow, lastRow);\n        this.doc.insertLines(firstRow+diff, lines);\n        folds.length && this.addFolds(folds);\n        return diff;\n    };\n    this.moveLinesUp = function(firstRow, lastRow) {\n        return this.$moveLines(firstRow, lastRow, -1);\n    };\n    this.moveLinesDown = function(firstRow, lastRow) {\n        return this.$moveLines(firstRow, lastRow, 1);\n    };\n    this.duplicateLines = function(firstRow, lastRow) {\n        return this.$moveLines(firstRow, lastRow, 0);\n    };\n\n\n    this.$clipRowToDocument = function(row) {\n        return Math.max(0, Math.min(row, this.doc.getLength()-1));\n    };\n\n    this.$clipColumnToRow = function(row, column) {\n        if (column < 0)\n            return 0;\n        return Math.min(this.doc.getLine(row).length, column);\n    };\n\n\n    this.$clipPositionToDocument = function(row, column) {\n        column = Math.max(0, column);\n\n        if (row < 0) {\n            row = 0;\n            column = 0;\n        } else {\n            var len = this.doc.getLength();\n            if (row >= len) {\n                row = len - 1;\n                column = this.doc.getLine(len-1).length;\n            } else {\n                column = Math.min(this.doc.getLine(row).length, column);\n            }\n        }\n\n        return {\n            row: row,\n            column: column\n        };\n    };\n\n    this.$clipRangeToDocument = function(range) {\n        if (range.start.row < 0) {\n            range.start.row = 0;\n            range.start.column = 0;\n        } else {\n            range.start.column = this.$clipColumnToRow(\n                range.start.row,\n                range.start.column\n            );\n        }\n\n        var len = this.doc.getLength() - 1;\n        if (range.end.row > len) {\n            range.end.row = len;\n            range.end.column = this.doc.getLine(len).length;\n        } else {\n            range.end.column = this.$clipColumnToRow(\n                range.end.row,\n                range.end.column\n            );\n        }\n        return range;\n    };\n    this.$wrapLimit = 80;\n    this.$useWrapMode = false;\n    this.$wrapLimitRange = {\n        min : null,\n        max : null\n    };\n    this.setUseWrapMode = function(useWrapMode) {\n        if (useWrapMode != this.$useWrapMode) {\n            this.$useWrapMode = useWrapMode;\n            this.$modified = true;\n            this.$resetRowCache(0);\n            if (useWrapMode) {\n                var len = this.getLength();\n                this.$wrapData = [];\n                for (var i = 0; i < len; i++) {\n                    this.$wrapData.push([]);\n                }\n                this.$updateWrapData(0, len - 1);\n            }\n\n            this._emit(\"changeWrapMode\");\n        }\n    };\n    this.getUseWrapMode = function() {\n        return this.$useWrapMode;\n    };\n    this.setWrapLimitRange = function(min, max) {\n        if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) {\n            this.$wrapLimitRange = {\n                min: min,\n                max: max\n            };\n            this.$modified = true;\n            this._emit(\"changeWrapMode\");\n        }\n    };\n    this.adjustWrapLimit = function(desiredLimit, $printMargin) {\n        var limits = this.$wrapLimitRange\n        if (limits.max < 0)\n            limits = {min: $printMargin, max: $printMargin};\n        var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max);\n        if (wrapLimit != this.$wrapLimit && wrapLimit > 1) {\n            this.$wrapLimit = wrapLimit;\n            this.$modified = true;\n            if (this.$useWrapMode) {\n                this.$updateWrapData(0, this.getLength() - 1);\n                this.$resetRowCache(0);\n                this._emit(\"changeWrapLimit\");\n            }\n            return true;\n        }\n        return false;\n    };\n\n    this.$constrainWrapLimit = function(wrapLimit, min, max) {\n        if (min)\n            wrapLimit = Math.max(min, wrapLimit);\n\n        if (max)\n            wrapLimit = Math.min(max, wrapLimit);\n\n        return wrapLimit;\n    };\n    this.getWrapLimit = function() {\n        return this.$wrapLimit;\n    };\n    this.setWrapLimit = function (limit) {\n        this.setWrapLimitRange(limit, limit);\n    };\n    this.getWrapLimitRange = function() {\n        return {\n            min : this.$wrapLimitRange.min,\n            max : this.$wrapLimitRange.max\n        };\n    };\n\n    this.$updateInternalDataOnChange = function(e) {\n        var useWrapMode = this.$useWrapMode;\n        var len;\n        var action = e.data.action;\n        var firstRow = e.data.range.start.row;\n        var lastRow = e.data.range.end.row;\n        var start = e.data.range.start;\n        var end = e.data.range.end;\n        var removedFolds = null;\n\n        if (action.indexOf(\"Lines\") != -1) {\n            if (action == \"insertLines\") {\n                lastRow = firstRow + (e.data.lines.length);\n            } else {\n                lastRow = firstRow;\n            }\n            len = e.data.lines ? e.data.lines.length : lastRow - firstRow;\n        } else {\n            len = lastRow - firstRow;\n        }\n\n        this.$updating = true;\n        if (len != 0) {\n            if (action.indexOf(\"remove\") != -1) {\n                this[useWrapMode ? \"$wrapData\" : \"$rowLengthCache\"].splice(firstRow, len);\n\n                var foldLines = this.$foldData;\n                removedFolds = this.getFoldsInRange(e.data.range);\n                this.removeFolds(removedFolds);\n\n                var foldLine = this.getFoldLine(end.row);\n                var idx = 0;\n                if (foldLine) {\n                    foldLine.addRemoveChars(end.row, end.column, start.column - end.column);\n                    foldLine.shiftRow(-len);\n\n                    var foldLineBefore = this.getFoldLine(firstRow);\n                    if (foldLineBefore && foldLineBefore !== foldLine) {\n                        foldLineBefore.merge(foldLine);\n                        foldLine = foldLineBefore;\n                    }\n                    idx = foldLines.indexOf(foldLine) + 1;\n                }\n\n                for (idx; idx < foldLines.length; idx++) {\n                    var foldLine = foldLines[idx];\n                    if (foldLine.start.row >= end.row) {\n                        foldLine.shiftRow(-len);\n                    }\n                }\n\n                lastRow = firstRow;\n            } else {\n                var args;\n                if (useWrapMode) {\n                    args = [firstRow, 0];\n                    for (var i = 0; i < len; i++) args.push([]);\n                    this.$wrapData.splice.apply(this.$wrapData, args);\n                } else {\n                    args = Array(len);\n                    args.unshift(firstRow, 0);\n                    this.$rowLengthCache.splice.apply(this.$rowLengthCache, args);\n                }\n                var foldLines = this.$foldData;\n                var foldLine = this.getFoldLine(firstRow);\n                var idx = 0;\n                if (foldLine) {\n                    var cmp = foldLine.range.compareInside(start.row, start.column)\n                    if (cmp == 0) {\n                        foldLine = foldLine.split(start.row, start.column);\n                        foldLine.shiftRow(len);\n                        foldLine.addRemoveChars(\n                            lastRow, 0, end.column - start.column);\n                    } else\n                    if (cmp == -1) {\n                        foldLine.addRemoveChars(firstRow, 0, end.column - start.column);\n                        foldLine.shiftRow(len);\n                    }\n                    idx = foldLines.indexOf(foldLine) + 1;\n                }\n\n                for (idx; idx < foldLines.length; idx++) {\n                    var foldLine = foldLines[idx];\n                    if (foldLine.start.row >= firstRow) {\n                        foldLine.shiftRow(len);\n                    }\n                }\n            }\n        } else {\n            len = Math.abs(e.data.range.start.column - e.data.range.end.column);\n            if (action.indexOf(\"remove\") != -1) {\n                removedFolds = this.getFoldsInRange(e.data.range);\n                this.removeFolds(removedFolds);\n\n                len = -len;\n            }\n            var foldLine = this.getFoldLine(firstRow);\n            if (foldLine) {\n                foldLine.addRemoveChars(firstRow, start.column, len);\n            }\n        }\n\n        if (useWrapMode && this.$wrapData.length != this.doc.getLength()) {\n            console.error(\"doc.getLength() and $wrapData.length have to be the same!\");\n        }\n        this.$updating = false;\n\n        if (useWrapMode)\n            this.$updateWrapData(firstRow, lastRow);\n        else\n            this.$updateRowLengthCache(firstRow, lastRow);\n\n        return removedFolds;\n    };\n\n    this.$updateRowLengthCache = function(firstRow, lastRow, b) {\n        this.$rowLengthCache[firstRow] = null;\n        this.$rowLengthCache[lastRow] = null;\n    };\n\n    this.$updateWrapData = function(firstRow, lastRow) {\n        var lines = this.doc.getAllLines();\n        var tabSize = this.getTabSize();\n        var wrapData = this.$wrapData;\n        var wrapLimit = this.$wrapLimit;\n        var tokens;\n        var foldLine;\n\n        var row = firstRow;\n        lastRow = Math.min(lastRow, lines.length - 1);\n        while (row <= lastRow) {\n            foldLine = this.getFoldLine(row, foldLine);\n            if (!foldLine) {\n                tokens = this.$getDisplayTokens(lines[row]);\n                wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n                row ++;\n            } else {\n                tokens = [];\n                foldLine.walk(function(placeholder, row, column, lastColumn) {\n                        var walkTokens;\n                        if (placeholder != null) {\n                            walkTokens = this.$getDisplayTokens(\n                                            placeholder, tokens.length);\n                            walkTokens[0] = PLACEHOLDER_START;\n                            for (var i = 1; i < walkTokens.length; i++) {\n                                walkTokens[i] = PLACEHOLDER_BODY;\n                            }\n                        } else {\n                            walkTokens = this.$getDisplayTokens(\n                                lines[row].substring(lastColumn, column),\n                                tokens.length);\n                        }\n                        tokens = tokens.concat(walkTokens);\n                    }.bind(this),\n                    foldLine.end.row,\n                    lines[foldLine.end.row].length + 1\n                );\n\n                wrapData[foldLine.start.row]\n                    = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n                row = foldLine.end.row + 1;\n            }\n        }\n    };\n    var CHAR = 1,\n        CHAR_EXT = 2,\n        PLACEHOLDER_START = 3,\n        PLACEHOLDER_BODY =  4,\n        PUNCTUATION = 9,\n        SPACE = 10,\n        TAB = 11,\n        TAB_SPACE = 12;\n\n\n    this.$computeWrapSplits = function(tokens, wrapLimit) {\n        if (tokens.length == 0) {\n            return [];\n        }\n\n        var splits = [];\n        var displayLength = tokens.length;\n        var lastSplit = 0, lastDocSplit = 0;\n\n        var isCode = this.$wrapAsCode;\n\n        function addSplit(screenPos) {\n            var displayed = tokens.slice(lastSplit, screenPos);\n            var len = displayed.length;\n            displayed.join(\"\").\n                replace(/12/g, function() {\n                    len -= 1;\n                }).\n                replace(/2/g, function() {\n                    len -= 1;\n                });\n\n            lastDocSplit += len;\n            splits.push(lastDocSplit);\n            lastSplit = screenPos;\n        }\n\n        while (displayLength - lastSplit > wrapLimit) {\n            var split = lastSplit + wrapLimit;\n            if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) {\n                addSplit(split);\n                continue;\n            }\n            if (tokens[split] == PLACEHOLDER_START || tokens[split] == PLACEHOLDER_BODY) {\n                for (split; split != lastSplit - 1; split--) {\n                    if (tokens[split] == PLACEHOLDER_START) {\n                        break;\n                    }\n                }\n                if (split > lastSplit) {\n                    addSplit(split);\n                    continue;\n                }\n                split = lastSplit + wrapLimit;\n                for (split; split < tokens.length; split++) {\n                    if (tokens[split] != PLACEHOLDER_BODY) {\n                        break;\n                    }\n                }\n                if (split == tokens.length) {\n                    break;  // Breaks the while-loop.\n                }\n                addSplit(split);\n                continue;\n            }\n            var minSplit = Math.max(split - (isCode ? 10 : wrapLimit-(wrapLimit>>2)), lastSplit - 1);\n            while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n                split --;\n            }\n            if (isCode) {\n                while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n                    split --;\n                }\n                while (split > minSplit && tokens[split] == PUNCTUATION) {\n                    split --;\n                }\n            } else {\n                while (split > minSplit && tokens[split] < SPACE) {\n                    split --;\n                }\n            }\n            if (split > minSplit) {\n                addSplit(++split);\n                continue;\n            }\n            split = lastSplit + wrapLimit;\n            addSplit(split);\n        }\n        return splits;\n    };\n    this.$getDisplayTokens = function(str, offset) {\n        var arr = [];\n        var tabSize;\n        offset = offset || 0;\n\n        for (var i = 0; i < str.length; i++) {\n            var c = str.charCodeAt(i);\n            if (c == 9) {\n                tabSize = this.getScreenTabSize(arr.length + offset);\n                arr.push(TAB);\n                for (var n = 1; n < tabSize; n++) {\n                    arr.push(TAB_SPACE);\n                }\n            }\n            else if (c == 32) {\n                arr.push(SPACE);\n            } else if((c > 39 && c < 48) || (c > 57 && c < 64)) {\n                arr.push(PUNCTUATION);\n            }\n            else if (c >= 0x1100 && isFullWidth(c)) {\n                arr.push(CHAR, CHAR_EXT);\n            } else {\n                arr.push(CHAR);\n            }\n        }\n        return arr;\n    };\n    this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {\n        if (maxScreenColumn == 0)\n            return [0, 0];\n        if (maxScreenColumn == null)\n            maxScreenColumn = Infinity;\n        screenColumn = screenColumn || 0;\n\n        var c, column;\n        for (column = 0; column < str.length; column++) {\n            c = str.charCodeAt(column);\n            if (c == 9) {\n                screenColumn += this.getScreenTabSize(screenColumn);\n            }\n            else if (c >= 0x1100 && isFullWidth(c)) {\n                screenColumn += 2;\n            } else {\n                screenColumn += 1;\n            }\n            if (screenColumn > maxScreenColumn) {\n                break;\n            }\n        }\n\n        return [screenColumn, column];\n    };\n\n    this.lineWidgets = null;\n    this.getRowLength = function(row) {\n        if (this.lineWidgets)\n            var h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n        else \n            h = 0\n        if (!this.$useWrapMode || !this.$wrapData[row]) {\n            return 1 + h;\n        } else {\n            return this.$wrapData[row].length + 1 + h;\n        }\n    };\n    this.getRowLineCount = function(row) {\n        if (!this.$useWrapMode || !this.$wrapData[row]) {\n            return 1;\n        } else {\n            return this.$wrapData[row].length + 1;\n        }\n    };\n    this.getScreenLastRowColumn = function(screenRow) {\n        var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);\n        return this.documentToScreenColumn(pos.row, pos.column);\n    };\n    this.getDocumentLastRowColumn = function(docRow, docColumn) {\n        var screenRow = this.documentToScreenRow(docRow, docColumn);\n        return this.getScreenLastRowColumn(screenRow);\n    };\n    this.getDocumentLastRowColumnPosition = function(docRow, docColumn) {\n        var screenRow = this.documentToScreenRow(docRow, docColumn);\n        return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10);\n    };\n    this.getRowSplitData = function(row) {\n        if (!this.$useWrapMode) {\n            return undefined;\n        } else {\n            return this.$wrapData[row];\n        }\n    };\n    this.getScreenTabSize = function(screenColumn) {\n        return this.$tabSize - screenColumn % this.$tabSize;\n    };\n\n\n    this.screenToDocumentRow = function(screenRow, screenColumn) {\n        return this.screenToDocumentPosition(screenRow, screenColumn).row;\n    };\n\n\n    this.screenToDocumentColumn = function(screenRow, screenColumn) {\n        return this.screenToDocumentPosition(screenRow, screenColumn).column;\n    };\n    this.screenToDocumentPosition = function(screenRow, screenColumn) {\n        if (screenRow < 0)\n            return {row: 0, column: 0};\n\n        var line;\n        var docRow = 0;\n        var docColumn = 0;\n        var column;\n        var row = 0;\n        var rowLength = 0;\n\n        var rowCache = this.$screenRowCache;\n        var i = this.$getRowCacheIndex(rowCache, screenRow);\n        var l = rowCache.length;\n        if (l && i >= 0) {\n            var row = rowCache[i];\n            var docRow = this.$docRowCache[i];\n            var doCache = screenRow > rowCache[l - 1];\n        } else {\n            var doCache = !l;\n        }\n\n        var maxRow = this.getLength() - 1;\n        var foldLine = this.getNextFoldLine(docRow);\n        var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n        while (row <= screenRow) {\n            rowLength = this.getRowLength(docRow);\n            if (row + rowLength > screenRow || docRow >= maxRow) {\n                break;\n            } else {\n                row += rowLength;\n                docRow++;\n                if (docRow > foldStart) {\n                    docRow = foldLine.end.row+1;\n                    foldLine = this.getNextFoldLine(docRow, foldLine);\n                    foldStart = foldLine ? foldLine.start.row : Infinity;\n                }\n            }\n\n            if (doCache) {\n                this.$docRowCache.push(docRow);\n                this.$screenRowCache.push(row);\n            }\n        }\n\n        if (foldLine && foldLine.start.row <= docRow) {\n            line = this.getFoldDisplayLine(foldLine);\n            docRow = foldLine.start.row;\n        } else if (row + rowLength <= screenRow || docRow > maxRow) {\n            return {\n                row: maxRow,\n                column: this.getLine(maxRow).length\n            }\n        } else {\n            line = this.getLine(docRow);\n            foldLine = null;\n        }\n\n        if (this.$useWrapMode) {\n            var splits = this.$wrapData[docRow];\n            if (splits) {\n                var splitIndex = Math.floor(screenRow - row);\n                column = splits[splitIndex];\n                if(splitIndex > 0 && splits.length) {\n                    docColumn = splits[splitIndex - 1] || splits[splits.length - 1];\n                    line = line.substring(docColumn);\n                }\n            }\n        }\n\n        docColumn += this.$getStringScreenWidth(line, screenColumn)[1];\n        if (this.$useWrapMode && docColumn >= column)\n            docColumn = column - 1;\n\n        if (foldLine)\n            return foldLine.idxToPosition(docColumn);\n\n        return {row: docRow, column: docColumn};\n    };\n    this.documentToScreenPosition = function(docRow, docColumn) {\n        if (typeof docColumn === \"undefined\")\n            var pos = this.$clipPositionToDocument(docRow.row, docRow.column);\n        else\n            pos = this.$clipPositionToDocument(docRow, docColumn);\n\n        docRow = pos.row;\n        docColumn = pos.column;\n\n        var screenRow = 0;\n        var foldStartRow = null;\n        var fold = null;\n        fold = this.getFoldAt(docRow, docColumn, 1);\n        if (fold) {\n            docRow = fold.start.row;\n            docColumn = fold.start.column;\n        }\n\n        var rowEnd, row = 0;\n\n\n        var rowCache = this.$docRowCache;\n        var i = this.$getRowCacheIndex(rowCache, docRow);\n        var l = rowCache.length;\n        if (l && i >= 0) {\n            var row = rowCache[i];\n            var screenRow = this.$screenRowCache[i];\n            var doCache = docRow > rowCache[l - 1];\n        } else {\n            var doCache = !l;\n        }\n\n        var foldLine = this.getNextFoldLine(row);\n        var foldStart = foldLine ?foldLine.start.row :Infinity;\n\n        while (row < docRow) {\n            if (row >= foldStart) {\n                rowEnd = foldLine.end.row + 1;\n                if (rowEnd > docRow)\n                    break;\n                foldLine = this.getNextFoldLine(rowEnd, foldLine);\n                foldStart = foldLine ?foldLine.start.row :Infinity;\n            }\n            else {\n                rowEnd = row + 1;\n            }\n\n            screenRow += this.getRowLength(row);\n            row = rowEnd;\n\n            if (doCache) {\n                this.$docRowCache.push(row);\n                this.$screenRowCache.push(screenRow);\n            }\n        }\n        var textLine = \"\";\n        if (foldLine && row >= foldStart) {\n            textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn);\n            foldStartRow = foldLine.start.row;\n        } else {\n            textLine = this.getLine(docRow).substring(0, docColumn);\n            foldStartRow = docRow;\n        }\n        if (this.$useWrapMode) {\n            var wrapRow = this.$wrapData[foldStartRow];\n            var screenRowOffset = 0;\n            while (textLine.length >= wrapRow[screenRowOffset]) {\n                screenRow ++;\n                screenRowOffset++;\n            }\n            textLine = textLine.substring(\n                wrapRow[screenRowOffset - 1] || 0, textLine.length\n            );\n        }\n\n        return {\n            row: screenRow,\n            column: this.$getStringScreenWidth(textLine)[0]\n        };\n    };\n    this.documentToScreenColumn = function(row, docColumn) {\n        return this.documentToScreenPosition(row, docColumn).column;\n    };\n    this.documentToScreenRow = function(docRow, docColumn) {\n        return this.documentToScreenPosition(docRow, docColumn).row;\n    };\n    this.getScreenLength = function() {\n        var screenRows = 0;\n        var fold = null;\n        if (!this.$useWrapMode) {\n            screenRows = this.getLength();\n            var foldData = this.$foldData;\n            for (var i = 0; i < foldData.length; i++) {\n                fold = foldData[i];\n                screenRows -= fold.end.row - fold.start.row;\n            }\n        } else {\n            var lastRow = this.$wrapData.length;\n            var row = 0, i = 0;\n            var fold = this.$foldData[i++];\n            var foldStart = fold ? fold.start.row :Infinity;\n\n            while (row < lastRow) {\n                screenRows += this.$wrapData[row].length + 1;\n                row ++;\n                if (row > foldStart) {\n                    row = fold.end.row+1;\n                    fold = this.$foldData[i++];\n                    foldStart = fold ?fold.start.row :Infinity;\n                }\n            }\n        }\n        if (this.lineWidgets)\n            screenRows += this.$getWidgetScreenLength();\n\n        return screenRows;\n    };\n    function isFullWidth(c) {\n        if (c < 0x1100)\n            return false;\n        return c >= 0x1100 && c <= 0x115F ||\n               c >= 0x11A3 && c <= 0x11A7 ||\n               c >= 0x11FA && c <= 0x11FF ||\n               c >= 0x2329 && c <= 0x232A ||\n               c >= 0x2E80 && c <= 0x2E99 ||\n               c >= 0x2E9B && c <= 0x2EF3 ||\n               c >= 0x2F00 && c <= 0x2FD5 ||\n               c >= 0x2FF0 && c <= 0x2FFB ||\n               c >= 0x3000 && c <= 0x303E ||\n               c >= 0x3041 && c <= 0x3096 ||\n               c >= 0x3099 && c <= 0x30FF ||\n               c >= 0x3105 && c <= 0x312D ||\n               c >= 0x3131 && c <= 0x318E ||\n               c >= 0x3190 && c <= 0x31BA ||\n               c >= 0x31C0 && c <= 0x31E3 ||\n               c >= 0x31F0 && c <= 0x321E ||\n               c >= 0x3220 && c <= 0x3247 ||\n               c >= 0x3250 && c <= 0x32FE ||\n               c >= 0x3300 && c <= 0x4DBF ||\n               c >= 0x4E00 && c <= 0xA48C ||\n               c >= 0xA490 && c <= 0xA4C6 ||\n               c >= 0xA960 && c <= 0xA97C ||\n               c >= 0xAC00 && c <= 0xD7A3 ||\n               c >= 0xD7B0 && c <= 0xD7C6 ||\n               c >= 0xD7CB && c <= 0xD7FB ||\n               c >= 0xF900 && c <= 0xFAFF ||\n               c >= 0xFE10 && c <= 0xFE19 ||\n               c >= 0xFE30 && c <= 0xFE52 ||\n               c >= 0xFE54 && c <= 0xFE66 ||\n               c >= 0xFE68 && c <= 0xFE6B ||\n               c >= 0xFF01 && c <= 0xFF60 ||\n               c >= 0xFFE0 && c <= 0xFFE6;\n    };\n\n}).call(EditSession.prototype);\n\nrequire(\"./edit_session/folding\").Folding.call(EditSession.prototype);\nrequire(\"./edit_session/bracket_match\").BracketMatch.call(EditSession.prototype);\n\n\nconfig.defineOptions(EditSession.prototype, \"session\", {\n    wrap: {\n        set: function(value) {\n            if (!value || value == \"off\")\n                value = false;\n            else if (value == \"free\")\n                value = true;\n            else if (value == \"printMargin\")\n                value = -1;\n            else if (typeof value == \"string\")\n                value = parseInt(value, 10) || false;\n\n            if (this.$wrap == value)\n                return;\n            if (!value) {\n                this.setUseWrapMode(false);\n            } else {\n                var col = typeof value == \"number\" ? value : null;\n                this.setWrapLimitRange(col, col);\n                this.setUseWrapMode(true);\n            }\n            this.$wrap = value;\n        },\n        get: function() {\n            return this.getUseWrapMode() ? this.getWrapLimitRange().min || \"free\" : \"off\";\n        },\n        handlesSet: true\n    },    \n    wrapMethod: {\n        set: function(val) {\n            val = val == \"auto\"\n                ? this.$mode.type != \"text\"\n                : val != \"text\";\n            if (val != this.$wrapAsCode) {\n                this.$wrapAsCode = val;\n                if (this.$useWrapMode) {\n                    this.$modified = true;\n                    this.$resetRowCache(0);\n                    this.$updateWrapData(0, this.getLength() - 1);\n                }\n            }\n        },\n        initialValue: \"auto\"\n    },\n    firstLineNumber: {\n        set: function() {this._emit(\"changeBreakpoint\");},\n        initialValue: 1\n    },\n    useWorker: {\n        set: function(useWorker) {\n            this.$useWorker = useWorker;\n\n            this.$stopWorker();\n            if (useWorker)\n                this.$startWorker();\n        },\n        initialValue: true\n    },\n    useSoftTabs: {initialValue: true},\n    tabSize: {\n        set: function(tabSize) {\n            if (isNaN(tabSize) || this.$tabSize === tabSize) return;\n\n            this.$modified = true;\n            this.$rowLengthCache = [];\n            this.$tabSize = tabSize;\n            this._emit(\"changeTabSize\");\n        },\n        initialValue: 4,\n        handlesSet: true\n    },\n    overwrite: {\n        set: function(val) {this._emit(\"changeOverwrite\");},\n        initialValue: false\n    },\n    newLineMode: {\n        set: function(val) {this.doc.setNewLineMode(val)},\n        get: function() {return this.doc.getNewLineMode()},\n        handlesSet: true\n    }\n});\n\nexports.EditSession = EditSession;\n});\n\ndefine('ace/selection', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/event_emitter', 'ace/range'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar lang = require(\"./lib/lang\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Selection = function(session) {\n    this.session = session;\n    this.doc = session.getDocument();\n\n    this.clearSelection();\n    this.lead = this.selectionLead = this.doc.createAnchor(0, 0);\n    this.anchor = this.selectionAnchor = this.doc.createAnchor(0, 0);\n\n    var self = this;\n    this.lead.on(\"change\", function(e) {\n        self._emit(\"changeCursor\");\n        if (!self.$isEmpty)\n            self._emit(\"changeSelection\");\n        if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column)\n            self.$desiredColumn = null;\n    });\n\n    this.selectionAnchor.on(\"change\", function() {\n        if (!self.$isEmpty)\n            self._emit(\"changeSelection\");\n    });\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.isEmpty = function() {\n        return (this.$isEmpty || (\n            this.anchor.row == this.lead.row &&\n            this.anchor.column == this.lead.column\n        ));\n    };\n    this.isMultiLine = function() {\n        if (this.isEmpty()) {\n            return false;\n        }\n\n        return this.getRange().isMultiLine();\n    };\n    this.getCursor = function() {\n        return this.lead.getPosition();\n    };\n    this.setSelectionAnchor = function(row, column) {\n        this.anchor.setPosition(row, column);\n\n        if (this.$isEmpty) {\n            this.$isEmpty = false;\n            this._emit(\"changeSelection\");\n        }\n    };\n    this.getSelectionAnchor = function() {\n        if (this.$isEmpty)\n            return this.getSelectionLead()\n        else\n            return this.anchor.getPosition();\n    };\n    this.getSelectionLead = function() {\n        return this.lead.getPosition();\n    };\n    this.shiftSelection = function(columns) {\n        if (this.$isEmpty) {\n            this.moveCursorTo(this.lead.row, this.lead.column + columns);\n            return;\n        };\n\n        var anchor = this.getSelectionAnchor();\n        var lead = this.getSelectionLead();\n\n        var isBackwards = this.isBackwards();\n\n        if (!isBackwards || anchor.column !== 0)\n            this.setSelectionAnchor(anchor.row, anchor.column + columns);\n\n        if (isBackwards || lead.column !== 0) {\n            this.$moveSelection(function() {\n                this.moveCursorTo(lead.row, lead.column + columns);\n            });\n        }\n    };\n    this.isBackwards = function() {\n        var anchor = this.anchor;\n        var lead = this.lead;\n        return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column));\n    };\n    this.getRange = function() {\n        var anchor = this.anchor;\n        var lead = this.lead;\n\n        if (this.isEmpty())\n            return Range.fromPoints(lead, lead);\n\n        if (this.isBackwards()) {\n            return Range.fromPoints(lead, anchor);\n        }\n        else {\n            return Range.fromPoints(anchor, lead);\n        }\n    };\n    this.clearSelection = function() {\n        if (!this.$isEmpty) {\n            this.$isEmpty = true;\n            this._emit(\"changeSelection\");\n        }\n    };\n    this.selectAll = function() {\n        var lastRow = this.doc.getLength() - 1;\n        this.setSelectionAnchor(0, 0);\n        this.moveCursorTo(lastRow, this.doc.getLine(lastRow).length);\n    };\n    this.setRange =\n    this.setSelectionRange = function(range, reverse) {\n        if (reverse) {\n            this.setSelectionAnchor(range.end.row, range.end.column);\n            this.selectTo(range.start.row, range.start.column);\n        } else {\n            this.setSelectionAnchor(range.start.row, range.start.column);\n            this.selectTo(range.end.row, range.end.column);\n        }\n        if (this.getRange().isEmpty())\n            this.$isEmpty = true;\n        this.$desiredColumn = null;\n    };\n\n    this.$moveSelection = function(mover) {\n        var lead = this.lead;\n        if (this.$isEmpty)\n            this.setSelectionAnchor(lead.row, lead.column);\n\n        mover.call(this);\n    };\n    this.selectTo = function(row, column) {\n        this.$moveSelection(function() {\n            this.moveCursorTo(row, column);\n        });\n    };\n    this.selectToPosition = function(pos) {\n        this.$moveSelection(function() {\n            this.moveCursorToPosition(pos);\n        });\n    };\n    this.selectUp = function() {\n        this.$moveSelection(this.moveCursorUp);\n    };\n    this.selectDown = function() {\n        this.$moveSelection(this.moveCursorDown);\n    };\n    this.selectRight = function() {\n        this.$moveSelection(this.moveCursorRight);\n    };\n    this.selectLeft = function() {\n        this.$moveSelection(this.moveCursorLeft);\n    };\n    this.selectLineStart = function() {\n        this.$moveSelection(this.moveCursorLineStart);\n    };\n    this.selectLineEnd = function() {\n        this.$moveSelection(this.moveCursorLineEnd);\n    };\n    this.selectFileEnd = function() {\n        this.$moveSelection(this.moveCursorFileEnd);\n    };\n    this.selectFileStart = function() {\n        this.$moveSelection(this.moveCursorFileStart);\n    };\n    this.selectWordRight = function() {\n        this.$moveSelection(this.moveCursorWordRight);\n    };\n    this.selectWordLeft = function() {\n        this.$moveSelection(this.moveCursorWordLeft);\n    };\n    this.getWordRange = function(row, column) {\n        if (typeof column == \"undefined\") {\n            var cursor = row || this.lead;\n            row = cursor.row;\n            column = cursor.column;\n        }\n        return this.session.getWordRange(row, column);\n    };\n    this.selectWord = function() {\n        this.setSelectionRange(this.getWordRange());\n    };\n    this.selectAWord = function() {\n        var cursor = this.getCursor();\n        var range = this.session.getAWordRange(cursor.row, cursor.column);\n        this.setSelectionRange(range);\n    };\n\n    this.getLineRange = function(row, excludeLastChar) {\n        var rowStart = typeof row == \"number\" ? row : this.lead.row;\n        var rowEnd;\n\n        var foldLine = this.session.getFoldLine(rowStart);\n        if (foldLine) {\n            rowStart = foldLine.start.row;\n            rowEnd = foldLine.end.row;\n        } else {\n            rowEnd = rowStart;\n        }\n        if (excludeLastChar === true)\n            return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length);\n        else\n            return new Range(rowStart, 0, rowEnd + 1, 0);\n    };\n    this.selectLine = function() {\n        this.setSelectionRange(this.getLineRange());\n    };\n    this.moveCursorUp = function() {\n        this.moveCursorBy(-1, 0);\n    };\n    this.moveCursorDown = function() {\n        this.moveCursorBy(1, 0);\n    };\n    this.moveCursorLeft = function() {\n        var cursor = this.lead.getPosition(),\n            fold;\n\n        if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) {\n            this.moveCursorTo(fold.start.row, fold.start.column);\n        } else if (cursor.column == 0) {\n            if (cursor.row > 0) {\n                this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length);\n            }\n        }\n        else {\n            var tabSize = this.session.getTabSize();\n            if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column-tabSize, cursor.column).split(\" \").length-1 == tabSize)\n                this.moveCursorBy(0, -tabSize);\n            else\n                this.moveCursorBy(0, -1);\n        }\n    };\n    this.moveCursorRight = function() {\n        var cursor = this.lead.getPosition(),\n            fold;\n        if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) {\n            this.moveCursorTo(fold.end.row, fold.end.column);\n        }\n        else if (this.lead.column == this.doc.getLine(this.lead.row).length) {\n            if (this.lead.row < this.doc.getLength() - 1) {\n                this.moveCursorTo(this.lead.row + 1, 0);\n            }\n        }\n        else {\n            var tabSize = this.session.getTabSize();\n            var cursor = this.lead;\n            if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column, cursor.column+tabSize).split(\" \").length-1 == tabSize)\n                this.moveCursorBy(0, tabSize);\n            else\n                this.moveCursorBy(0, 1);\n        }\n    };\n    this.moveCursorLineStart = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n        var screenRow = this.session.documentToScreenRow(row, column);\n        var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0);\n        var beforeCursor = this.session.getDisplayLine(\n            row, null, firstColumnPosition.row,\n            firstColumnPosition.column\n        );\n\n        var leadingSpace = beforeCursor.match(/^\\s*/);\n        if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart)\n            firstColumnPosition.column += leadingSpace[0].length;\n        this.moveCursorToPosition(firstColumnPosition);\n    };\n    this.moveCursorLineEnd = function() {\n        var lead = this.lead;\n        var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column);\n        if (this.lead.column == lineEnd.column) {\n            var line = this.session.getLine(lineEnd.row);\n            if (lineEnd.column == line.length) {\n                var textEnd = line.search(/\\s+$/);\n                if (textEnd > 0)\n                    lineEnd.column = textEnd;\n            }\n        }\n\n        this.moveCursorTo(lineEnd.row, lineEnd.column);\n    };\n    this.moveCursorFileEnd = function() {\n        var row = this.doc.getLength() - 1;\n        var column = this.doc.getLine(row).length;\n        this.moveCursorTo(row, column);\n    };\n    this.moveCursorFileStart = function() {\n        this.moveCursorTo(0, 0);\n    };\n    this.moveCursorLongWordRight = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n        var line = this.doc.getLine(row);\n        var rightOfCursor = line.substring(column);\n\n        var match;\n        this.session.nonTokenRe.lastIndex = 0;\n        this.session.tokenRe.lastIndex = 0;\n        var fold = this.session.getFoldAt(row, column, 1);\n        if (fold) {\n            this.moveCursorTo(fold.end.row, fold.end.column);\n            return;\n        }\n        if (match = this.session.nonTokenRe.exec(rightOfCursor)) {\n            column += this.session.nonTokenRe.lastIndex;\n            this.session.nonTokenRe.lastIndex = 0;\n            rightOfCursor = line.substring(column);\n        }\n        if (column >= line.length) {\n            this.moveCursorTo(row, line.length);\n            this.moveCursorRight();\n            if (row < this.doc.getLength() - 1)\n                this.moveCursorWordRight();\n            return;\n        }\n        if (match = this.session.tokenRe.exec(rightOfCursor)) {\n            column += this.session.tokenRe.lastIndex;\n            this.session.tokenRe.lastIndex = 0;\n        }\n\n        this.moveCursorTo(row, column);\n    };\n    this.moveCursorLongWordLeft = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n        var fold;\n        if (fold = this.session.getFoldAt(row, column, -1)) {\n            this.moveCursorTo(fold.start.row, fold.start.column);\n            return;\n        }\n\n        var str = this.session.getFoldStringAt(row, column, -1);\n        if (str == null) {\n            str = this.doc.getLine(row).substring(0, column)\n        }\n\n        var leftOfCursor = lang.stringReverse(str);\n        var match;\n        this.session.nonTokenRe.lastIndex = 0;\n        this.session.tokenRe.lastIndex = 0;\n        if (match = this.session.nonTokenRe.exec(leftOfCursor)) {\n            column -= this.session.nonTokenRe.lastIndex;\n            leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex);\n            this.session.nonTokenRe.lastIndex = 0;\n        }\n        if (column <= 0) {\n            this.moveCursorTo(row, 0);\n            this.moveCursorLeft();\n            if (row > 0)\n                this.moveCursorWordLeft();\n            return;\n        }\n        if (match = this.session.tokenRe.exec(leftOfCursor)) {\n            column -= this.session.tokenRe.lastIndex;\n            this.session.tokenRe.lastIndex = 0;\n        }\n\n        this.moveCursorTo(row, column);\n    };\n\n    this.$shortWordEndIndex = function(rightOfCursor) {\n        var match, index = 0, ch;\n        var whitespaceRe = /\\s/;\n        var tokenRe = this.session.tokenRe;\n\n        tokenRe.lastIndex = 0;\n        if (match = this.session.tokenRe.exec(rightOfCursor)) {\n            index = this.session.tokenRe.lastIndex;\n        } else {\n            while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n                index ++;\n\n            if (index < 1) {\n                tokenRe.lastIndex = 0;\n                 while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) {\n                    tokenRe.lastIndex = 0;\n                    index ++;\n                    if (whitespaceRe.test(ch)) {\n                        if (index > 2) {\n                            index--\n                            break;\n                        } else {\n                            while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n                                index ++;\n                            if (index > 2)\n                                break\n                        }\n                    }\n                }\n            }\n        }\n        tokenRe.lastIndex = 0;\n\n        return index;\n    };\n\n    this.moveCursorShortWordRight = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n        var line = this.doc.getLine(row);\n        var rightOfCursor = line.substring(column);\n\n        var fold = this.session.getFoldAt(row, column, 1);\n        if (fold)\n            return this.moveCursorTo(fold.end.row, fold.end.column);\n\n        if (column == line.length) {\n            var l = this.doc.getLength();\n            do {\n                row++;\n                rightOfCursor = this.doc.getLine(row)\n            } while (row < l && /^\\s*$/.test(rightOfCursor))\n\n            if (!/^\\s+/.test(rightOfCursor))\n                rightOfCursor = \"\"\n            column = 0;\n        }\n\n        var index = this.$shortWordEndIndex(rightOfCursor);\n\n        this.moveCursorTo(row, column + index);\n    };\n\n    this.moveCursorShortWordLeft = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n\n        var fold;\n        if (fold = this.session.getFoldAt(row, column, -1))\n            return this.moveCursorTo(fold.start.row, fold.start.column);\n\n        var line = this.session.getLine(row).substring(0, column);\n        if (column == 0) {\n            do {\n                row--;\n                line = this.doc.getLine(row);\n            } while (row > 0 && /^\\s*$/.test(line))\n\n            column = line.length;\n            if (!/\\s+$/.test(line))\n                line = \"\"\n        }\n\n        var leftOfCursor = lang.stringReverse(line);\n        var index = this.$shortWordEndIndex(leftOfCursor);\n\n        return this.moveCursorTo(row, column - index);\n    };\n\n    this.moveCursorWordRight = function() {\n        if (this.session.$selectLongWords)\n            this.moveCursorLongWordRight();\n        else\n            this.moveCursorShortWordRight();\n    };\n\n    this.moveCursorWordLeft = function() {\n        if (this.session.$selectLongWords)\n            this.moveCursorLongWordLeft();\n        else\n            this.moveCursorShortWordLeft();\n    };\n    this.moveCursorBy = function(rows, chars) {\n        var screenPos = this.session.documentToScreenPosition(\n            this.lead.row,\n            this.lead.column\n        );\n\n        if (chars === 0) {\n            if (this.$desiredColumn)\n                screenPos.column = this.$desiredColumn;\n            else\n                this.$desiredColumn = screenPos.column;\n        }\n\n        var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column);\n        \n        if (rows !== 0 && chars === 0 && docPos.row === this.lead.row && docPos.column === this.lead.column) {\n            if (this.session.lineWidgets && this.session.lineWidgets[docPos.row])\n                docPos.row++;\n        }\n        this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0);\n    };\n    this.moveCursorToPosition = function(position) {\n        this.moveCursorTo(position.row, position.column);\n    };\n    this.moveCursorTo = function(row, column, keepDesiredColumn) {\n        var fold = this.session.getFoldAt(row, column, 1);\n        if (fold) {\n            row = fold.start.row;\n            column = fold.start.column;\n        }\n\n        this.$keepDesiredColumnOnChange = true;\n        this.lead.setPosition(row, column);\n        this.$keepDesiredColumnOnChange = false;\n\n        if (!keepDesiredColumn)\n            this.$desiredColumn = null;\n    };\n    this.moveCursorToScreen = function(row, column, keepDesiredColumn) {\n        var pos = this.session.screenToDocumentPosition(row, column);\n        this.moveCursorTo(pos.row, pos.column, keepDesiredColumn);\n    };\n    this.detach = function() {\n        this.lead.detach();\n        this.anchor.detach();\n        this.session = this.doc = null;\n    }\n\n    this.fromOrientedRange = function(range) {\n        this.setSelectionRange(range, range.cursor == range.start);\n        this.$desiredColumn = range.desiredColumn || this.$desiredColumn;\n    }\n\n    this.toOrientedRange = function(range) {\n        var r = this.getRange();\n        if (range) {\n            range.start.column = r.start.column;\n            range.start.row = r.start.row;\n            range.end.column = r.end.column;\n            range.end.row = r.end.row;\n        } else {\n            range = r;\n        }\n\n        range.cursor = this.isBackwards() ? range.start : range.end;\n        range.desiredColumn = this.$desiredColumn;\n        return range;\n    }\n\n    this.toJSON = function() {\n        if (this.rangeCount) {\n            var data = this.ranges.map(function(r) {\n                var r1 = r.clone();\n                r1.isBackwards = r.cursor == r.start;\n                return r1;\n            });\n        } else {\n            var data = this.getRange();\n            data.isBackwards = this.isBackwards();\n        }\n        return data;\n    };\n\n    this.fromJSON = function(data) {\n        if (data.start == undefined) {\n            if (this.rangeList) {\n                this.toSingleRange(data[0]);\n                for (var i = data.length; i--; ) {\n                    var r = Range.fromPoints(data[i].start, data[i].end);\n                    if (data.isBackwards)\n                        r.cursor = r.start;\n                    this.addRange(r, true);\n                }\n                return;\n            } else\n                data = data[0];\n        }\n        if (this.rangeList)\n            this.toSingleRange(data);\n        this.setSelectionRange(data, data.isBackwards);\n    };\n\n    this.isEqual = function(data) {\n        if ((data.length || this.rangeCount) && data.length != this.rangeCount)\n            return false;\n        if (!data.length || !this.ranges)\n            return this.getRange().isEqual(data);\n\n        for (var i = this.ranges.length; i--; ) {\n            if (!this.ranges[i].isEqual(data[i]))\n                return false\n        }\n        return true;\n    }\n\n}).call(Selection.prototype);\n\nexports.Selection = Selection;\n});\n\ndefine('ace/range', ['require', 'exports', 'module' ], function(require, exports, module) {\n\nvar comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n    this.start = {\n        row: startRow,\n        column: startColumn\n    };\n\n    this.end = {\n        row: endRow,\n        column: endColumn\n    };\n};\n\n(function() {\n    this.isEqual = function(range) {\n        return this.start.row === range.start.row &&\n            this.end.row === range.end.row &&\n            this.start.column === range.start.column &&\n            this.end.column === range.end.column;\n    };\n    this.toString = function() {\n        return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n            \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n    };\n\n    this.contains = function(row, column) {\n        return this.compare(row, column) == 0;\n    };\n    this.compareRange = function(range) {\n        var cmp,\n            end = range.end,\n            start = range.start;\n\n        cmp = this.compare(end.row, end.column);\n        if (cmp == 1) {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == 1) {\n                return 2;\n            } else if (cmp == 0) {\n                return 1;\n            } else {\n                return 0;\n            }\n        } else if (cmp == -1) {\n            return -2;\n        } else {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == -1) {\n                return -1;\n            } else if (cmp == 1) {\n                return 42;\n            } else {\n                return 0;\n            }\n        }\n    };\n    this.comparePoint = function(p) {\n        return this.compare(p.row, p.column);\n    };\n    this.containsRange = function(range) {\n        return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n    };\n    this.intersects = function(range) {\n        var cmp = this.compareRange(range);\n        return (cmp == -1 || cmp == 0 || cmp == 1);\n    };\n    this.isEnd = function(row, column) {\n        return this.end.row == row && this.end.column == column;\n    };\n    this.isStart = function(row, column) {\n        return this.start.row == row && this.start.column == column;\n    };\n    this.setStart = function(row, column) {\n        if (typeof row == \"object\") {\n            this.start.column = row.column;\n            this.start.row = row.row;\n        } else {\n            this.start.row = row;\n            this.start.column = column;\n        }\n    };\n    this.setEnd = function(row, column) {\n        if (typeof row == \"object\") {\n            this.end.column = row.column;\n            this.end.row = row.row;\n        } else {\n            this.end.row = row;\n            this.end.column = column;\n        }\n    };\n    this.inside = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column) || this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideStart = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideEnd = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.compare = function(row, column) {\n        if (!this.isMultiLine()) {\n            if (row === this.start.row) {\n                return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n            };\n        }\n\n        if (row < this.start.row)\n            return -1;\n\n        if (row > this.end.row)\n            return 1;\n\n        if (this.start.row === row)\n            return column >= this.start.column ? 0 : -1;\n\n        if (this.end.row === row)\n            return column <= this.end.column ? 0 : 1;\n\n        return 0;\n    };\n    this.compareStart = function(row, column) {\n        if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareEnd = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareInside = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.clipRows = function(firstRow, lastRow) {\n        if (this.end.row > lastRow)\n            var end = {row: lastRow + 1, column: 0};\n        else if (this.end.row < firstRow)\n            var end = {row: firstRow, column: 0};\n\n        if (this.start.row > lastRow)\n            var start = {row: lastRow + 1, column: 0};\n        else if (this.start.row < firstRow)\n            var start = {row: firstRow, column: 0};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n    this.extend = function(row, column) {\n        var cmp = this.compare(row, column);\n\n        if (cmp == 0)\n            return this;\n        else if (cmp == -1)\n            var start = {row: row, column: column};\n        else\n            var end = {row: row, column: column};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n\n    this.isEmpty = function() {\n        return (this.start.row === this.end.row && this.start.column === this.end.column);\n    };\n    this.isMultiLine = function() {\n        return (this.start.row !== this.end.row);\n    };\n    this.clone = function() {\n        return Range.fromPoints(this.start, this.end);\n    };\n    this.collapseRows = function() {\n        if (this.end.column == 0)\n            return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)\n        else\n            return new Range(this.start.row, 0, this.end.row, 0)\n    };\n    this.toScreenRange = function(session) {\n        var screenPosStart = session.documentToScreenPosition(this.start);\n        var screenPosEnd = session.documentToScreenPosition(this.end);\n\n        return new Range(\n            screenPosStart.row, screenPosStart.column,\n            screenPosEnd.row, screenPosEnd.column\n        );\n    };\n    this.moveBy = function(row, column) {\n        this.start.row += row;\n        this.start.column += column;\n        this.end.row += row;\n        this.end.column += column;\n    };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n    return new Range(start.row, start.column, end.row, end.column);\n};\nRange.comparePoints = comparePoints;\n\nRange.comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\n\n\nexports.Range = Range;\n});\n\ndefine('ace/mode/text', ['require', 'exports', 'module' , 'ace/tokenizer', 'ace/mode/text_highlight_rules', 'ace/mode/behaviour', 'ace/unicode', 'ace/lib/lang', 'ace/token_iterator', 'ace/range'], function(require, exports, module) {\n\n\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar Behaviour = require(\"./behaviour\").Behaviour;\nvar unicode = require(\"../unicode\");\nvar lang = require(\"../lib/lang\");\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.HighlightRules = TextHighlightRules;\n    this.$behaviour = new Behaviour();\n};\n\n(function() {\n\n    this.tokenRe = new RegExp(\"^[\"\n        + unicode.packages.L\n        + unicode.packages.Mn + unicode.packages.Mc\n        + unicode.packages.Nd\n        + unicode.packages.Pc + \"\\\\$_]+\", \"g\"\n    );\n\n    this.nonTokenRe = new RegExp(\"^(?:[^\"\n        + unicode.packages.L\n        + unicode.packages.Mn + unicode.packages.Mc\n        + unicode.packages.Nd\n        + unicode.packages.Pc + \"\\\\$_]|\\s])+\", \"g\"\n    );\n\n    this.getTokenizer = function() {\n        if (!this.$tokenizer) {\n            this.$highlightRules = new this.HighlightRules();\n            this.$tokenizer = new Tokenizer(this.$highlightRules.getRules());\n        }\n        return this.$tokenizer;\n    };\n\n    this.lineCommentStart = \"\";\n    this.blockComment = \"\";\n\n    this.toggleCommentLines = function(state, session, startRow, endRow) {\n        var doc = session.doc;\n\n        var ignoreBlankLines = true;\n        var shouldRemove = true;\n        var minIndent = Infinity;\n        var tabSize = session.getTabSize();\n        var insertAtTabStop = false;\n\n        if (!this.lineCommentStart) {\n            if (!this.blockComment)\n                return false;\n            var lineCommentStart = this.blockComment.start;\n            var lineCommentEnd = this.blockComment.end;\n            var regexpStart = new RegExp(\"^(\\\\s*)(?:\" + lang.escapeRegExp(lineCommentStart) + \")\");\n            var regexpEnd = new RegExp(\"(?:\" + lang.escapeRegExp(lineCommentEnd) + \")\\\\s*$\");\n\n            var comment = function(line, i) {\n                if (testRemove(line, i))\n                    return;\n                if (!ignoreBlankLines || /\\S/.test(line)) {\n                    doc.insertInLine({row: i, column: line.length}, lineCommentEnd);\n                    doc.insertInLine({row: i, column: minIndent}, lineCommentStart);\n                }\n            };\n\n            var uncomment = function(line, i) {\n                var m;\n                if (m = line.match(regexpEnd))\n                    doc.removeInLine(i, line.length - m[0].length, line.length);\n                if (m = line.match(regexpStart))\n                    doc.removeInLine(i, m[1].length, m[0].length);\n            };\n\n            var testRemove = function(line, row) {\n                if (regexpStart.test(line))\n                    return true;\n                var tokens = session.getTokens(row);\n                for (var i = 0; i < tokens.length; i++) {\n                    if (tokens[i].type === 'comment')\n                        return true;\n                }\n            };\n        } else {\n            if (Array.isArray(this.lineCommentStart)) {\n                var regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join(\"|\");\n                var lineCommentStart = this.lineCommentStart[0];\n            } else {\n                var regexpStart = lang.escapeRegExp(this.lineCommentStart);\n                var lineCommentStart = this.lineCommentStart;\n            }\n            regexpStart = new RegExp(\"^(\\\\s*)(?:\" + regexpStart + \") ?\");\n            \n            insertAtTabStop = session.getUseSoftTabs();\n\n            var uncomment = function(line, i) {\n                var m = line.match(regexpStart);\n                if (!m) return;\n                var start = m[1].length, end = m[0].length;\n                if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == \" \")\n                    end--;\n                doc.removeInLine(i, start, end);\n            };\n            var commentWithSpace = lineCommentStart + \" \";\n            var comment = function(line, i) {\n                if (!ignoreBlankLines || /\\S/.test(line)) {\n                    if (shouldInsertSpace(line, minIndent, minIndent))\n                        doc.insertInLine({row: i, column: minIndent}, commentWithSpace);\n                    else\n                        doc.insertInLine({row: i, column: minIndent}, lineCommentStart);\n                }\n            };\n            var testRemove = function(line, i) {\n                return regexpStart.test(line);\n            };\n            \n            var shouldInsertSpace = function(line, before, after) {\n                var spaces = 0;\n                while (before-- && line.charAt(before) == \" \")\n                    spaces++;\n                if (spaces % tabSize != 0)\n                    return false;\n                var spaces = 0;\n                while (line.charAt(after++) == \" \")\n                    spaces++;\n                if (tabSize > 2)\n                    return spaces % tabSize != tabSize - 1;\n                else\n                    return spaces % tabSize == 0;\n                return true;\n            };\n        }\n\n        function iter(fun) {\n            for (var i = startRow; i <= endRow; i++)\n                fun(doc.getLine(i), i);\n        }\n\n\n        var minEmptyLength = Infinity;\n        iter(function(line, i) {\n            var indent = line.search(/\\S/);\n            if (indent !== -1) {\n                if (indent < minIndent)\n                    minIndent = indent;\n                if (shouldRemove && !testRemove(line, i))\n                    shouldRemove = false;\n            } else if (minEmptyLength > line.length) {\n                minEmptyLength = line.length;\n            }\n        });\n\n        if (minIndent == Infinity) {\n            minIndent = minEmptyLength;\n            ignoreBlankLines = false;\n            shouldRemove = false;\n        }\n\n        if (insertAtTabStop && minIndent % tabSize != 0)\n            minIndent = Math.floor(minIndent / tabSize) * tabSize;\n\n        iter(shouldRemove ? uncomment : comment);\n    };\n\n    this.toggleBlockComment = function(state, session, range, cursor) {\n        var comment = this.blockComment;\n        if (!comment)\n            return;\n        if (!comment.start && comment[0])\n            comment = comment[0];\n\n        var iterator = new TokenIterator(session, cursor.row, cursor.column);\n        var token = iterator.getCurrentToken();\n\n        var sel = session.selection;\n        var initialRange = session.selection.toOrientedRange();\n        var startRow, colDiff;\n\n        if (token && /comment/.test(token.type)) {\n            var startRange, endRange;\n            while (token && /comment/.test(token.type)) {\n                var i = token.value.indexOf(comment.start);\n                if (i != -1) {\n                    var row = iterator.getCurrentTokenRow();\n                    var column = iterator.getCurrentTokenColumn() + i;\n                    startRange = new Range(row, column, row, column + comment.start.length);\n                    break\n                }\n                token = iterator.stepBackward();\n            };\n\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            while (token && /comment/.test(token.type)) {\n                var i = token.value.indexOf(comment.end);\n                if (i != -1) {\n                    var row = iterator.getCurrentTokenRow();\n                    var column = iterator.getCurrentTokenColumn() + i;\n                    endRange = new Range(row, column, row, column + comment.end.length);\n                    break;\n                }\n                token = iterator.stepForward();\n            }\n            if (endRange)\n                session.remove(endRange);\n            if (startRange) {\n                session.remove(startRange);\n                startRow = startRange.start.row;\n                colDiff = -comment.start.length\n            }\n        } else {\n            colDiff = comment.start.length\n            startRow = range.start.row;\n            session.insert(range.end, comment.end);\n            session.insert(range.start, comment.start);\n        }\n        if (initialRange.start.row == startRow)\n            initialRange.start.column += colDiff;\n        if (initialRange.end.row == startRow)\n            initialRange.end.column += colDiff;\n        session.selection.fromOrientedRange(initialRange);\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n    this.createWorker = function(session) {\n        return null;\n    };\n\n    this.createModeDelegates = function (mapping) {\n        this.$embeds = [];\n        this.$modes = {};\n        for (var i in mapping) {\n            if (mapping[i]) {\n                this.$embeds.push(i);\n                this.$modes[i] = new mapping[i]();\n            }\n        }\n\n        var delegations = ['toggleCommentLines', 'getNextLineIndent', 'checkOutdent', 'autoOutdent', 'transformAction', 'getCompletions'];\n\n        for (var i = 0; i < delegations.length; i++) {\n            (function(scope) {\n              var functionName = delegations[i];\n              var defaultHandler = scope[functionName];\n              scope[delegations[i]] = function() {\n                  return this.$delegator(functionName, arguments, defaultHandler);\n              }\n            } (this));\n        }\n    };\n\n    this.$delegator = function(method, args, defaultHandler) {\n        var state = args[0];\n        if (typeof state != \"string\")\n            state = state[0];\n        for (var i = 0; i < this.$embeds.length; i++) {\n            if (!this.$modes[this.$embeds[i]]) continue;\n\n            var split = state.split(this.$embeds[i]);\n            if (!split[0] && split[1]) {\n                args[0] = split[1];\n                var mode = this.$modes[this.$embeds[i]];\n                return mode[method].apply(mode, args);\n            }\n        }\n        var ret = defaultHandler.apply(this, args);\n        return defaultHandler ? ret : undefined;\n    };\n\n    this.transformAction = function(state, action, editor, session, param) {\n        if (this.$behaviour) {\n            var behaviours = this.$behaviour.getBehaviours();\n            for (var key in behaviours) {\n                if (behaviours[key][action]) {\n                    var ret = behaviours[key][action].apply(this, arguments);\n                    if (ret) {\n                        return ret;\n                    }\n                }\n            }\n        }\n    };\n    \n    this.getKeywords = function(append) {\n        if (!this.completionKeywords) {\n            var rules = this.$tokenizer.rules;\n            var completionKeywords = [];\n            for (var rule in rules) {\n                var ruleItr = rules[rule];\n                for (var r = 0, l = ruleItr.length; r < l; r++) {\n                    if (typeof ruleItr[r].token === \"string\") {\n                        if (/keyword|support|storage/.test(ruleItr[r].token))\n                            completionKeywords.push(ruleItr[r].regex);\n                    }\n                    else if (typeof ruleItr[r].token === \"object\") {\n                        for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) {    \n                            if (/keyword|support|storage/.test(ruleItr[r].token[a])) {\n                                var rule = ruleItr[r].regex.match(/\\(.+?\\)/g)[a];\n                                completionKeywords.push(rule.substr(1, rule.length - 2));\n                            }\n                        }\n                    }\n                }\n            }\n            this.completionKeywords = completionKeywords;\n        }\n        if (!append)\n            return this.$keywordList;\n        return completionKeywords.concat(this.$keywordList || []);\n    };\n    \n    this.$createKeywordList = function() {\n        if (!this.$highlightRules)\n            this.getTokenizer();\n        return this.$keywordList = this.$highlightRules.$keywordList || [];\n    }\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        var keywords = this.$keywordList || this.$createKeywordList();\n        return keywords.map(function(word) {\n            return {\n                name: word,\n                value: word,\n                score: 0,\n                meta: \"keyword\"\n            };\n        });\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/tokenizer', ['require', 'exports', 'module' ], function(require, exports, module) {\nvar MAX_TOKEN_COUNT = 1000;\nvar Tokenizer = function(rules) {\n    this.states = rules;\n\n    this.regExps = {};\n    this.matchMappings = {};\n    for (var key in this.states) {\n        var state = this.states[key];\n        var ruleRegExps = [];\n        var matchTotal = 0;\n        var mapping = this.matchMappings[key] = {defaultToken: \"text\"};\n        var flag = \"g\";\n\n        var splitterRurles = [];\n        for (var i = 0; i < state.length; i++) {\n            var rule = state[i];\n            if (rule.defaultToken)\n                mapping.defaultToken = rule.defaultToken;\n            if (rule.caseInsensitive)\n                flag = \"gi\";\n            if (rule.regex == null)\n                continue;\n\n            if (rule.regex instanceof RegExp)\n                rule.regex = rule.regex.toString().slice(1, -1);\n            var adjustedregex = rule.regex;\n            var matchcount = new RegExp(\"(?:(\" + adjustedregex + \")|(.))\").exec(\"a\").length - 2;\n            if (Array.isArray(rule.token)) {\n                if (rule.token.length == 1 || matchcount == 1) {\n                    rule.token = rule.token[0];\n                } else if (matchcount - 1 != rule.token.length) {\n                    throw new Error(\"number of classes and regexp groups in '\" + \n                        rule.token + \"'\\n'\" + rule.regex +  \"' doesn't match\\n\"\n                        + (matchcount - 1) + \"!=\" + rule.token.length);\n                } else {\n                    rule.tokenArray = rule.token;\n                    rule.token = null;\n                    rule.onMatch = this.$arrayTokens;\n                }\n            } else if (typeof rule.token == \"function\" && !rule.onMatch) {\n                if (matchcount > 1)\n                    rule.onMatch = this.$applyToken;\n                else\n                    rule.onMatch = rule.token;\n            }\n\n            if (matchcount > 1) {\n                if (/\\\\\\d/.test(rule.regex)) {\n                    adjustedregex = rule.regex.replace(/\\\\([0-9]+)/g, function (match, digit) {\n                        return \"\\\\\" + (parseInt(digit, 10) + matchTotal + 1);\n                    });\n                } else {\n                    matchcount = 1;\n                    adjustedregex = this.removeCapturingGroups(rule.regex);\n                }\n                if (!rule.splitRegex && typeof rule.token != \"string\")\n                    splitterRurles.push(rule); // flag will be known only at the very end\n            }\n\n            mapping[matchTotal] = i;\n            matchTotal += matchcount;\n\n            ruleRegExps.push(adjustedregex);\n            if (!rule.onMatch)\n                rule.onMatch = null;\n            rule.__proto__ = null;\n        }\n        \n        splitterRurles.forEach(function(rule) {\n            rule.splitRegex = this.createSplitterRegexp(rule.regex, flag);\n        }, this);\n\n        this.regExps[key] = new RegExp(\"(\" + ruleRegExps.join(\")|(\") + \")|($)\", flag);\n    }\n};\n\n(function() {\n    this.$setMaxTokenCount = function(m) {\n        MAX_TOKEN_COUNT = m | 0;\n    };\n    \n    this.$applyToken = function(str) {\n        var values = this.splitRegex.exec(str).slice(1);\n        var types = this.token.apply(this, values);\n        if (typeof types === \"string\")\n            return [{type: types, value: str}];\n\n        var tokens = [];\n        for (var i = 0, l = types.length; i < l; i++) {\n            if (values[i])\n                tokens[tokens.length] = {\n                    type: types[i],\n                    value: values[i]\n                };\n        }\n        return tokens;\n    },\n\n    this.$arrayTokens = function(str) {\n        if (!str)\n            return [];\n        var values = this.splitRegex.exec(str);\n        if (!values)\n            return \"text\";\n        var tokens = [];\n        var types = this.tokenArray;\n        for (var i = 0, l = types.length; i < l; i++) {\n            if (values[i + 1])\n                tokens[tokens.length] = {\n                    type: types[i],\n                    value: values[i + 1]\n                };\n        }\n        return tokens;\n    };\n\n    this.removeCapturingGroups = function(src) {\n        var r = src.replace(\n            /\\[(?:\\\\.|[^\\]])*?\\]|\\\\.|\\(\\?[:=!]|(\\()/g,\n            function(x, y) {return y ? \"(?:\" : x;}\n        );\n        return r;\n    };\n\n    this.createSplitterRegexp = function(src, flag) {\n        if (src.indexOf(\"(?=\") != -1) {\n            var stack = 0;\n            var inChClass = false;\n            var lastCapture = {};\n            src.replace(/(\\\\.)|(\\((?:\\?[=!])?)|(\\))|([\\[\\]])/g, function(\n                m, esc, parenOpen, parenClose, square, index\n            ) {\n                if (inChClass) {\n                    inChClass = square != \"]\";\n                } else if (square) {\n                    inChClass = true;\n                } else if (parenClose) {\n                    if (stack == lastCapture.stack) {\n                        lastCapture.end = index+1;\n                        lastCapture.stack = -1;\n                    }\n                    stack--;\n                } else if (parenOpen) {\n                    stack++;\n                    if (parenOpen.length != 1) {\n                        lastCapture.stack = stack\n                        lastCapture.start = index;\n                    }\n                }\n                return m;\n            });\n\n            if (lastCapture.end != null && /^\\)*$/.test(src.substr(lastCapture.end)))\n                src = src.substring(0, lastCapture.start) + src.substr(lastCapture.end);\n        }\n        return new RegExp(src, (flag||\"\").replace(\"g\", \"\"));\n    };\n    this.getLineTokens = function(line, startState) {\n        if (startState && typeof startState != \"string\") {\n            var stack = startState.slice(0);\n            startState = stack[0];\n        } else\n            var stack = [];\n\n        var currentState = startState || \"start\";\n        var state = this.states[currentState];\n        var mapping = this.matchMappings[currentState];\n        var re = this.regExps[currentState];\n        re.lastIndex = 0;\n\n        var match, tokens = [];\n        var lastIndex = 0;\n\n        var token = {type: null, value: \"\"};\n\n        while (match = re.exec(line)) {\n            var type = mapping.defaultToken;\n            var rule = null;\n            var value = match[0];\n            var index = re.lastIndex;\n\n            if (index - value.length > lastIndex) {\n                var skipped = line.substring(lastIndex, index - value.length);\n                if (token.type == type) {\n                    token.value += skipped;\n                } else {\n                    if (token.type)\n                        tokens.push(token);\n                    token = {type: type, value: skipped};\n                }\n            }\n\n            for (var i = 0; i < match.length-2; i++) {\n                if (match[i + 1] === undefined)\n                    continue;\n\n                rule = state[mapping[i]];\n\n                if (rule.onMatch)\n                    type = rule.onMatch(value, currentState, stack);\n                else\n                    type = rule.token;\n\n                if (rule.next) {\n                    if (typeof rule.next == \"string\")\n                        currentState = rule.next;\n                    else\n                        currentState = rule.next(currentState, stack);\n\n                    state = this.states[currentState];\n                    if (!state) {\n                        window.console && console.error && console.error(currentState, \"doesn't exist\");\n                        currentState = \"start\";\n                        state = this.states[currentState];\n                    }\n                    mapping = this.matchMappings[currentState];\n                    lastIndex = index;\n                    re = this.regExps[currentState];\n                    re.lastIndex = index;\n                }\n                break;\n            }\n\n            if (value) {\n                if (typeof type == \"string\") {\n                    if ((!rule || rule.merge !== false) && token.type === type) {\n                        token.value += value;\n                    } else {\n                        if (token.type)\n                            tokens.push(token);\n                        token = {type: type, value: value};\n                    }\n                } else if (type) {\n                    if (token.type)\n                        tokens.push(token);\n                    token = {type: null, value: \"\"};\n                    for (var i = 0; i < type.length; i++)\n                        tokens.push(type[i]);\n                }\n            }\n\n            if (lastIndex == line.length)\n                break;\n\n            lastIndex = index;\n\n            if (tokens.length > MAX_TOKEN_COUNT) {\n                while (lastIndex < line.length) {\n                    if (token.type)\n                        tokens.push(token);\n                    token = {\n                        value: line.substring(lastIndex, lastIndex += 2000),\n                        type: \"overflow\"\n                    };\n                }\n                currentState = \"start\";\n                stack = [];\n                break;\n            }\n        }\n\n        if (token.type)\n            tokens.push(token);\n        \n        if (stack.length > 1) {\n            if (stack[0] !== currentState)\n                stack.unshift(currentState);\n        }\n        return {\n            tokens : tokens,\n            state : stack.length ? stack : currentState\n        };\n    };\n\n}).call(Tokenizer.prototype);\n\nexports.Tokenizer = Tokenizer;\n});\n\ndefine('ace/mode/text_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/lang'], function(require, exports, module) {\n\n\nvar lang = require(\"../lib/lang\");\n\nvar TextHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"empty_line\",\n            regex : '^$'\n        }, {\n            defaultToken : \"text\"\n        }]\n    };\n};\n\n(function() {\n\n    this.addRules = function(rules, prefix) {\n        if (!prefix) {\n            for (var key in rules)\n                this.$rules[key] = rules[key];\n            return;\n        }\n        for (var key in rules) {\n            var state = rules[key];\n            for (var i = 0; i < state.length; i++) {\n                var rule = state[i];\n                if (rule.next) {\n                    if (typeof rule.next != \"string\") {\n                        if (rule.nextState && rule.nextState.indexOf(prefix) !== 0)\n                            rule.nextState = prefix + rule.nextState;\n                    } else {\n                        if (rule.next.indexOf(prefix) !== 0)\n                            rule.next = prefix + rule.next;\n                    }\n\n                }\n            }\n            this.$rules[prefix + key] = state;\n        }\n    };\n\n    this.getRules = function() {\n        return this.$rules;\n    };\n\n    this.embedRules = function (HighlightRules, prefix, escapeRules, states, append) {\n        var embedRules = new HighlightRules().getRules();\n        if (states) {\n            for (var i = 0; i < states.length; i++)\n                states[i] = prefix + states[i];\n        } else {\n            states = [];\n            for (var key in embedRules)\n                states.push(prefix + key);\n        }\n\n        this.addRules(embedRules, prefix);\n\n        if (escapeRules) {\n            var addRules = Array.prototype[append ? \"push\" : \"unshift\"];\n            for (var i = 0; i < states.length; i++)\n                addRules.apply(this.$rules[states[i]], lang.deepCopy(escapeRules));\n        }\n\n        if (!this.$embeds)\n            this.$embeds = [];\n        this.$embeds.push(prefix);\n    };\n\n    this.getEmbeds = function() {\n        return this.$embeds;\n    };\n\n    var pushState = function(currentState, stack) {\n        if (currentState != \"start\")\n            stack.unshift(this.nextState, currentState);\n        return this.nextState;\n    };\n    var popState = function(currentState, stack) {\n        if (stack[0] !== currentState)\n            return \"start\";\n        stack.shift();\n        return stack.shift();\n    };\n\n    this.normalizeRules = function() {\n        var id = 0;\n        var rules = this.$rules;\n        function processState(key) {\n            var state = rules[key];\n            state.processed = true;\n            for (var i = 0; i < state.length; i++) {\n                var rule = state[i];\n                if (!rule.regex && rule.start) {\n                    rule.regex = rule.start;\n                    if (!rule.next)\n                        rule.next = [];\n                    rule.next.push({\n                        defaultToken: rule.token\n                    }, {\n                        token: rule.token + \".end\",\n                        regex: rule.end || rule.start,\n                        next: \"pop\"\n                    });\n                    rule.token = rule.token + \".start\";\n                    rule.push = true;\n                }\n                var next = rule.next || rule.push;\n                if (next && Array.isArray(next)) {\n                    var stateName = rule.stateName;\n                    if (!stateName)  {\n                        stateName = rule.token;\n                        if (typeof stateName != \"string\")\n                            stateName = stateName[0] || \"\";\n                        if (rules[stateName])\n                            stateName += id++;\n                    }\n                    rules[stateName] = next;\n                    rule.next = stateName;\n                    processState(stateName);\n                } else if (next == \"pop\") {\n                    rule.next = popState;\n                }\n\n                if (rule.push) {\n                    rule.nextState = rule.next || rule.push;\n                    rule.next = pushState;\n                    delete rule.push;\n                }\n\n                if (rule.rules) {\n                    for (var r in rule.rules) {\n                        if (rules[r]) {\n                            if (rules[r].push)\n                                rules[r].push.apply(rules[r], rule.rules[r]);\n                        } else {\n                            rules[r] = rule.rules[r];\n                        }\n                    }\n                }\n                if (rule.include || typeof rule == \"string\") {\n                    var includeName = rule.include || rule;\n                    var toInsert = rules[includeName];\n                } else if (Array.isArray(rule))\n                    toInsert = rule;\n\n                if (toInsert) {\n                    var args = [i, 1].concat(toInsert);\n                    if (rule.noEscape)\n                        args = args.filter(function(x) {return !x.next;});\n                    state.splice.apply(state, args);\n                    i--;\n                    toInsert = null\n                }\n                \n                if (rule.keywordMap) {\n                    rule.token = this.createKeywordMapper(\n                        rule.keywordMap, rule.defaultToken || \"text\", rule.caseInsensitive\n                    );\n                    delete rule.defaultToken;\n                }\n            }\n        };\n        Object.keys(rules).forEach(processState, this);\n    };\n\n    this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) {\n        var keywords = Object.create(null);\n        Object.keys(map).forEach(function(className) {\n            var a = map[className];\n            if (ignoreCase)\n                a = a.toLowerCase();\n            var list = a.split(splitChar || \"|\");\n            for (var i = list.length; i--; )\n                keywords[list[i]] = className;\n        });\n        if (Object.getPrototypeOf(keywords)) {\n            keywords.__proto__ = null;\n        }\n        this.$keywordList = Object.keys(keywords);\n        map = null;\n        return ignoreCase\n            ? function(value) {return keywords[value.toLowerCase()] || defaultToken }\n            : function(value) {return keywords[value] || defaultToken };\n    }\n\n    this.getKeywords = function() {\n        return this.$keywords;\n    };\n\n}).call(TextHighlightRules.prototype);\n\nexports.TextHighlightRules = TextHighlightRules;\n});\n\ndefine('ace/mode/behaviour', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nvar Behaviour = function() {\n   this.$behaviours = {};\n};\n\n(function () {\n\n    this.add = function (name, action, callback) {\n        switch (undefined) {\n          case this.$behaviours:\n              this.$behaviours = {};\n          case this.$behaviours[name]:\n              this.$behaviours[name] = {};\n        }\n        this.$behaviours[name][action] = callback;\n    }\n    \n    this.addBehaviours = function (behaviours) {\n        for (var key in behaviours) {\n            for (var action in behaviours[key]) {\n                this.add(key, action, behaviours[key][action]);\n            }\n        }\n    }\n    \n    this.remove = function (name) {\n        if (this.$behaviours && this.$behaviours[name]) {\n            delete this.$behaviours[name];\n        }\n    }\n    \n    this.inherit = function (mode, filter) {\n        if (typeof mode === \"function\") {\n            var behaviours = new mode().getBehaviours(filter);\n        } else {\n            var behaviours = mode.getBehaviours(filter);\n        }\n        this.addBehaviours(behaviours);\n    }\n    \n    this.getBehaviours = function (filter) {\n        if (!filter) {\n            return this.$behaviours;\n        } else {\n            var ret = {}\n            for (var i = 0; i < filter.length; i++) {\n                if (this.$behaviours[filter[i]]) {\n                    ret[filter[i]] = this.$behaviours[filter[i]];\n                }\n            }\n            return ret;\n        }\n    }\n\n}).call(Behaviour.prototype);\n\nexports.Behaviour = Behaviour;\n});\ndefine('ace/unicode', ['require', 'exports', 'module' ], function(require, exports, module) {\nexports.packages = {};\n\naddUnicodePackage({\n    L:  \"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\",\n    Ll: \"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A\",\n    Lu: \"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A\",\n    Lt: \"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC\",\n    Lm: \"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F\",\n    Lo: \"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\",\n    M:  \"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26\",\n    Mn: \"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26\",\n    Mc: \"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC\",\n    Me: \"0488048906DE20DD-20E020E2-20E4A670-A672\",\n    N:  \"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\",\n    Nd: \"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\",\n    Nl: \"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF\",\n    No: \"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835\",\n    P:  \"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65\",\n    Pd: \"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D\",\n    Ps: \"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62\",\n    Pe: \"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63\",\n    Pi: \"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20\",\n    Pf: \"00BB2019201D203A2E032E052E0A2E0D2E1D2E21\",\n    Pc: \"005F203F20402054FE33FE34FE4D-FE4FFF3F\",\n    Po: \"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65\",\n    S:  \"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD\",\n    Sm: \"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC\",\n    Sc: \"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6\",\n    Sk: \"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3\",\n    So: \"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD\",\n    Z:  \"002000A01680180E2000-200A20282029202F205F3000\",\n    Zs: \"002000A01680180E2000-200A202F205F3000\",\n    Zl: \"2028\",\n    Zp: \"2029\",\n    C:  \"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF\",\n    Cc: \"0000-001F007F-009F\",\n    Cf: \"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB\",\n    Co: \"E000-F8FF\",\n    Cs: \"D800-DFFF\",\n    Cn: \"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF\"\n});\n\nfunction addUnicodePackage (pack) {\n    var codePoint = /\\w{4}/g;\n    for (var name in pack)\n        exports.packages[name] = pack[name].replace(codePoint, \"\\\\u$&\");\n};\n\n});\n\ndefine('ace/token_iterator', ['require', 'exports', 'module' ], function(require, exports, module) {\nvar TokenIterator = function(session, initialRow, initialColumn) {\n    this.$session = session;\n    this.$row = initialRow;\n    this.$rowTokens = session.getTokens(initialRow);\n\n    var token = session.getTokenAt(initialRow, initialColumn);\n    this.$tokenIndex = token ? token.index : -1;\n};\n\n(function() { \n    this.stepBackward = function() {\n        this.$tokenIndex -= 1;\n        \n        while (this.$tokenIndex < 0) {\n            this.$row -= 1;\n            if (this.$row < 0) {\n                this.$row = 0;\n                return null;\n            }\n                \n            this.$rowTokens = this.$session.getTokens(this.$row);\n            this.$tokenIndex = this.$rowTokens.length - 1;\n        }\n            \n        return this.$rowTokens[this.$tokenIndex];\n    };   \n    this.stepForward = function() {\n        this.$tokenIndex += 1;\n        var rowCount;\n        while (this.$tokenIndex >= this.$rowTokens.length) {\n            this.$row += 1;\n            if (!rowCount)\n                rowCount = this.$session.getLength();\n            if (this.$row >= rowCount) {\n                this.$row = rowCount - 1;\n                return null;\n            }\n\n            this.$rowTokens = this.$session.getTokens(this.$row);\n            this.$tokenIndex = 0;\n        }\n            \n        return this.$rowTokens[this.$tokenIndex];\n    };      \n    this.getCurrentToken = function () {\n        return this.$rowTokens[this.$tokenIndex];\n    };      \n    this.getCurrentTokenRow = function () {\n        return this.$row;\n    };     \n    this.getCurrentTokenColumn = function() {\n        var rowTokens = this.$rowTokens;\n        var tokenIndex = this.$tokenIndex;\n        var column = rowTokens[tokenIndex].start;\n        if (column !== undefined)\n            return column;\n            \n        column = 0;\n        while (tokenIndex > 0) {\n            tokenIndex -= 1;\n            column += rowTokens[tokenIndex].value.length;\n        }\n        \n        return column;  \n    };\n            \n}).call(TokenIterator.prototype);\n\nexports.TokenIterator = TokenIterator;\n});\n\ndefine('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\nvar Document = function(text) {\n    this.$lines = [];\n    if (text.length == 0) {\n        this.$lines = [\"\"];\n    } else if (Array.isArray(text)) {\n        this._insertLines(0, text);\n    } else {\n        this.insert({row: 0, column:0}, text);\n    }\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setValue = function(text) {\n        var len = this.getLength();\n        this.remove(new Range(0, 0, len, this.getLine(len-1).length));\n        this.insert({row: 0, column:0}, text);\n    };\n    this.getValue = function() {\n        return this.getAllLines().join(this.getNewLineCharacter());\n    };\n    this.createAnchor = function(row, column) {\n        return new Anchor(this, row, column);\n    };\n    if (\"aaa\".split(/a/).length == 0)\n        this.$split = function(text) {\n            return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n        }\n    else\n        this.$split = function(text) {\n            return text.split(/\\r\\n|\\r|\\n/);\n        };\n\n\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n        this.$autoNewLine = match ? match[1] : \"\\n\";\n    };\n    this.getNewLineCharacter = function() {\n        switch (this.$newLineMode) {\n          case \"windows\":\n            return \"\\r\\n\";\n          case \"unix\":\n            return \"\\n\";\n          default:\n            return this.$autoNewLine;\n        }\n    };\n\n    this.$autoNewLine = \"\\n\";\n    this.$newLineMode = \"auto\";\n    this.setNewLineMode = function(newLineMode) {\n        if (this.$newLineMode === newLineMode)\n            return;\n\n        this.$newLineMode = newLineMode;\n    };\n    this.getNewLineMode = function() {\n        return this.$newLineMode;\n    };\n    this.isNewLine = function(text) {\n        return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n    };\n    this.getLine = function(row) {\n        return this.$lines[row] || \"\";\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.$lines.slice(firstRow, lastRow + 1);\n    };\n    this.getAllLines = function() {\n        return this.getLines(0, this.getLength());\n    };\n    this.getLength = function() {\n        return this.$lines.length;\n    };\n    this.getTextRange = function(range) {\n        if (range.start.row == range.end.row) {\n            return this.getLine(range.start.row)\n                .substring(range.start.column, range.end.column);\n        }\n        var lines = this.getLines(range.start.row, range.end.row);\n        lines[0] = (lines[0] || \"\").substring(range.start.column);\n        var l = lines.length - 1;\n        if (range.end.row - range.start.row == l)\n            lines[l] = lines[l].substring(0, range.end.column);\n        return lines.join(this.getNewLineCharacter());\n    };\n\n    this.$clipPosition = function(position) {\n        var length = this.getLength();\n        if (position.row >= length) {\n            position.row = Math.max(0, length - 1);\n            position.column = this.getLine(length-1).length;\n        } else if (position.row < 0)\n            position.row = 0;\n        return position;\n    };\n    this.insert = function(position, text) {\n        if (!text || text.length === 0)\n            return position;\n\n        position = this.$clipPosition(position);\n        if (this.getLength() <= 1)\n            this.$detectNewLine(text);\n\n        var lines = this.$split(text);\n        var firstLine = lines.splice(0, 1)[0];\n        var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];\n\n        position = this.insertInLine(position, firstLine);\n        if (lastLine !== null) {\n            position = this.insertNewLine(position); // terminate first line\n            position = this._insertLines(position.row, lines);\n            position = this.insertInLine(position, lastLine || \"\");\n        }\n        return position;\n    };\n    this.insertLines = function(row, lines) {\n        if (row >= this.getLength())\n            return this.insert({row: row, column: 0}, \"\\n\" + lines.join(\"\\n\"));\n        return this._insertLines(Math.max(row, 0), lines);\n    };\n    this._insertLines = function(row, lines) {\n        if (lines.length == 0)\n            return {row: row, column: 0};\n        if (lines.length > 0xFFFF) {\n            var end = this._insertLines(row, lines.slice(0xFFFF));\n            lines = lines.slice(0, 0xFFFF);\n        }\n\n        var args = [row, 0];\n        args.push.apply(args, lines);\n        this.$lines.splice.apply(this.$lines, args);\n\n        var range = new Range(row, 0, row + lines.length, 0);\n        var delta = {\n            action: \"insertLines\",\n            range: range,\n            lines: lines\n        };\n        this._emit(\"change\", { data: delta });\n        return end || range.end;\n    };\n    this.insertNewLine = function(position) {\n        position = this.$clipPosition(position);\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column);\n        this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));\n\n        var end = {\n            row : position.row + 1,\n            column : 0\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: this.getNewLineCharacter()\n        };\n        this._emit(\"change\", { data: delta });\n\n        return end;\n    };\n    this.insertInLine = function(position, text) {\n        if (text.length == 0)\n            return position;\n\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column) + text\n                + line.substring(position.column);\n\n        var end = {\n            row : position.row,\n            column : position.column + text.length\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: text\n        };\n        this._emit(\"change\", { data: delta });\n\n        return end;\n    };\n    this.remove = function(range) {\n        if (!range instanceof Range)\n            range = Range.fromPoints(range.start, range.end);\n        range.start = this.$clipPosition(range.start);\n        range.end = this.$clipPosition(range.end);\n\n        if (range.isEmpty())\n            return range.start;\n\n        var firstRow = range.start.row;\n        var lastRow = range.end.row;\n\n        if (range.isMultiLine()) {\n            var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;\n            var lastFullRow = lastRow - 1;\n\n            if (range.end.column > 0)\n                this.removeInLine(lastRow, 0, range.end.column);\n\n            if (lastFullRow >= firstFullRow)\n                this._removeLines(firstFullRow, lastFullRow);\n\n            if (firstFullRow != firstRow) {\n                this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);\n                this.removeNewLine(range.start.row);\n            }\n        }\n        else {\n            this.removeInLine(firstRow, range.start.column, range.end.column);\n        }\n        return range.start;\n    };\n    this.removeInLine = function(row, startColumn, endColumn) {\n        if (startColumn == endColumn)\n            return;\n\n        var range = new Range(row, startColumn, row, endColumn);\n        var line = this.getLine(row);\n        var removed = line.substring(startColumn, endColumn);\n        var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);\n        this.$lines.splice(row, 1, newLine);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: removed\n        };\n        this._emit(\"change\", { data: delta });\n        return range.start;\n    };\n    this.removeLines = function(firstRow, lastRow) {\n        if (firstRow < 0 || lastRow >= this.getLength())\n            return this.remove(new Range(firstRow, 0, lastRow + 1, 0));\n        return this._removeLines(firstRow, lastRow);\n    };\n\n    this._removeLines = function(firstRow, lastRow) {\n        var range = new Range(firstRow, 0, lastRow + 1, 0);\n        var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);\n\n        var delta = {\n            action: \"removeLines\",\n            range: range,\n            nl: this.getNewLineCharacter(),\n            lines: removed\n        };\n        this._emit(\"change\", { data: delta });\n        return removed;\n    };\n    this.removeNewLine = function(row) {\n        var firstLine = this.getLine(row);\n        var secondLine = this.getLine(row+1);\n\n        var range = new Range(row, firstLine.length, row+1, 0);\n        var line = firstLine + secondLine;\n\n        this.$lines.splice(row, 2, line);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: this.getNewLineCharacter()\n        };\n        this._emit(\"change\", { data: delta });\n    };\n    this.replace = function(range, text) {\n        if (!range instanceof Range)\n            range = Range.fromPoints(range.start, range.end);\n        if (text.length == 0 && range.isEmpty())\n            return range.start;\n        if (text == this.getTextRange(range))\n            return range.end;\n\n        this.remove(range);\n        if (text) {\n            var end = this.insert(range.start, text);\n        }\n        else {\n            end = range.start;\n        }\n\n        return end;\n    };\n    this.applyDeltas = function(deltas) {\n        for (var i=0; i<deltas.length; i++) {\n            var delta = deltas[i];\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"insertText\")\n                this.insert(range.start, delta.text);\n            else if (delta.action == \"removeLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"removeText\")\n                this.remove(range);\n        }\n    };\n    this.revertDeltas = function(deltas) {\n        for (var i=deltas.length-1; i>=0; i--) {\n            var delta = deltas[i];\n\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"insertText\")\n                this.remove(range);\n            else if (delta.action == \"removeLines\")\n                this._insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"removeText\")\n                this.insert(range.start, delta.text);\n        }\n    };\n    this.indexToPosition = function(index, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        for (var i = startRow || 0, l = lines.length; i < l; i++) {\n            index -= lines[i].length + newlineLength;\n            if (index < 0)\n                return {row: i, column: index + lines[i].length + newlineLength};\n        }\n        return {row: l-1, column: lines[l-1].length};\n    };\n    this.positionToIndex = function(pos, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        var index = 0;\n        var row = Math.min(pos.row, lines.length);\n        for (var i = startRow || 0; i < row; ++i)\n            index += lines[i].length + newlineLength;\n\n        return index + pos.column;\n    };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\ndefine('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n    this.$onChange = this.onChange.bind(this);\n    this.attach(doc);\n    \n    if (typeof column == \"undefined\")\n        this.setPosition(row.row, row.column);\n    else\n        this.setPosition(row, column);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.getPosition = function() {\n        return this.$clipPositionToDocument(this.row, this.column);\n    };\n    this.getDocument = function() {\n        return this.document;\n    };\n    this.$insertRight = false;\n    this.onChange = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n\n        if (range.start.row == range.end.row && range.start.row != this.row)\n            return;\n\n        if (range.start.row > this.row)\n            return;\n\n        if (range.start.row == this.row && range.start.column > this.column)\n            return;\n\n        var row = this.row;\n        var column = this.column;\n        var start = range.start;\n        var end = range.end;\n\n        if (delta.action === \"insertText\") {\n            if (start.row === row && start.column <= column) {\n                if (start.column === column && this.$insertRight) {\n                } else if (start.row === end.row) {\n                    column += end.column - start.column;\n                } else {\n                    column -= start.column;\n                    row += end.row - start.row;\n                }\n            } else if (start.row !== end.row && start.row < row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"insertLines\") {\n            if (start.row <= row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"removeText\") {\n            if (start.row === row && start.column < column) {\n                if (end.column >= column)\n                    column = start.column;\n                else\n                    column = Math.max(0, column - (end.column - start.column));\n\n            } else if (start.row !== end.row && start.row < row) {\n                if (end.row === row)\n                    column = Math.max(0, column - end.column) + start.column;\n                row -= (end.row - start.row);\n            } else if (end.row === row) {\n                row -= end.row - start.row;\n                column = Math.max(0, column - end.column) + start.column;\n            }\n        } else if (delta.action == \"removeLines\") {\n            if (start.row <= row) {\n                if (end.row <= row)\n                    row -= end.row - start.row;\n                else {\n                    row = start.row;\n                    column = 0;\n                }\n            }\n        }\n\n        this.setPosition(row, column, true);\n    };\n    this.setPosition = function(row, column, noClip) {\n        var pos;\n        if (noClip) {\n            pos = {\n                row: row,\n                column: column\n            };\n        } else {\n            pos = this.$clipPositionToDocument(row, column);\n        }\n\n        if (this.row == pos.row && this.column == pos.column)\n            return;\n\n        var old = {\n            row: this.row,\n            column: this.column\n        };\n\n        this.row = pos.row;\n        this.column = pos.column;\n        this._emit(\"change\", {\n            old: old,\n            value: pos\n        });\n    };\n    this.detach = function() {\n        this.document.removeEventListener(\"change\", this.$onChange);\n    };\n    this.attach = function(doc) {\n        this.document = doc || this.document;\n        this.document.on(\"change\", this.$onChange);\n    };\n    this.$clipPositionToDocument = function(row, column) {\n        var pos = {};\n\n        if (row >= this.document.getLength()) {\n            pos.row = Math.max(0, this.document.getLength() - 1);\n            pos.column = this.document.getLine(pos.row).length;\n        }\n        else if (row < 0) {\n            pos.row = 0;\n            pos.column = 0;\n        }\n        else {\n            pos.row = row;\n            pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n        }\n\n        if (column < 0)\n            pos.column = 0;\n\n        return pos;\n    };\n\n}).call(Anchor.prototype);\n\n});\n\ndefine('ace/background_tokenizer', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar BackgroundTokenizer = function(tokenizer, editor) {\n    this.running = false;\n    this.lines = [];\n    this.states = [];\n    this.currentLine = 0;\n    this.tokenizer = tokenizer;\n\n    var self = this;\n\n    this.$worker = function() {\n        if (!self.running) { return; }\n\n        var workerStart = new Date();\n        var currentLine = self.currentLine;\n        var endLine = -1;\n        var doc = self.doc;\n\n        while (self.lines[currentLine])\n            currentLine++;\n\n        var startLine = currentLine;\n\n        var len = doc.getLength();\n        var processedLines = 0;\n        self.running = false;\n        while (currentLine < len) {\n            self.$tokenizeRow(currentLine);\n            endLine = currentLine;\n            do {\n                currentLine++;\n            } while (self.lines[currentLine]);\n            processedLines ++;\n            if ((processedLines % 5 == 0) && (new Date() - workerStart) > 20) {                \n                self.running = setTimeout(self.$worker, 20);\n                self.currentLine = currentLine;\n                return;\n            }\n        }\n        self.currentLine = currentLine;\n        \n        if (startLine <= endLine)\n            self.fireUpdateEvent(startLine, endLine);\n    };\n};\n\n(function(){\n\n    oop.implement(this, EventEmitter);\n    this.setTokenizer = function(tokenizer) {\n        this.tokenizer = tokenizer;\n        this.lines = [];\n        this.states = [];\n\n        this.start(0);\n    };\n    this.setDocument = function(doc) {\n        this.doc = doc;\n        this.lines = [];\n        this.states = [];\n\n        this.stop();\n    };\n    this.fireUpdateEvent = function(firstRow, lastRow) {\n        var data = {\n            first: firstRow,\n            last: lastRow\n        };\n        this._emit(\"update\", {data: data});\n    };\n    this.start = function(startRow) {\n        this.currentLine = Math.min(startRow || 0, this.currentLine, this.doc.getLength());\n        this.lines.splice(this.currentLine, this.lines.length);\n        this.states.splice(this.currentLine, this.states.length);\n\n        this.stop();\n        this.running = setTimeout(this.$worker, 700);\n    };\n    \n    this.scheduleStart = function() {\n        if (!this.running)\n            this.running = setTimeout(this.$worker, 700);\n    }\n\n    this.$updateOnChange = function(delta) {\n        var range = delta.range;\n        var startRow = range.start.row;\n        var len = range.end.row - startRow;\n\n        if (len === 0) {\n            this.lines[startRow] = null;\n        } else if (delta.action == \"removeText\" || delta.action == \"removeLines\") {\n            this.lines.splice(startRow, len + 1, null);\n            this.states.splice(startRow, len + 1, null);\n        } else {\n            var args = Array(len + 1);\n            args.unshift(startRow, 1);\n            this.lines.splice.apply(this.lines, args);\n            this.states.splice.apply(this.states, args);\n        }\n\n        this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength());\n\n        this.stop();\n    };\n    this.stop = function() {\n        if (this.running)\n            clearTimeout(this.running);\n        this.running = false;\n    };\n    this.getTokens = function(row) {\n        return this.lines[row] || this.$tokenizeRow(row);\n    };\n    this.getState = function(row) {\n        if (this.currentLine == row)\n            this.$tokenizeRow(row);\n        return this.states[row] || \"start\";\n    };\n\n    this.$tokenizeRow = function(row) {\n        var line = this.doc.getLine(row);\n        var state = this.states[row - 1];\n\n        var data = this.tokenizer.getLineTokens(line, state, row);\n\n        if (this.states[row] + \"\" !== data.state + \"\") {\n            this.states[row] = data.state;\n            this.lines[row + 1] = null;\n            if (this.currentLine > row + 1)\n                this.currentLine = row + 1;\n        } else if (this.currentLine == row) {\n            this.currentLine = row + 1;\n        }\n\n        return this.lines[row] = data.tokens;\n    };\n\n}).call(BackgroundTokenizer.prototype);\n\nexports.BackgroundTokenizer = BackgroundTokenizer;\n});\n\ndefine('ace/search_highlight', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/range'], function(require, exports, module) {\n\n\nvar lang = require(\"./lib/lang\");\nvar oop = require(\"./lib/oop\");\nvar Range = require(\"./range\").Range;\n\nvar SearchHighlight = function(regExp, clazz, type) {\n    this.setRegexp(regExp);\n    this.clazz = clazz;\n    this.type = type || \"text\";\n};\n\n(function() {\n    this.MAX_RANGES = 500;\n    \n    this.setRegexp = function(regExp) {\n        if (this.regExp+\"\" == regExp+\"\")\n            return;\n        this.regExp = regExp;\n        this.cache = [];\n    };\n\n    this.update = function(html, markerLayer, session, config) {\n        if (!this.regExp)\n            return;\n        var start = config.firstRow, end = config.lastRow;\n\n        for (var i = start; i <= end; i++) {\n            var ranges = this.cache[i];\n            if (ranges == null) {\n                ranges = lang.getMatchOffsets(session.getLine(i), this.regExp);\n                if (ranges.length > this.MAX_RANGES)\n                    ranges = ranges.slice(0, this.MAX_RANGES);\n                ranges = ranges.map(function(match) {\n                    return new Range(i, match.offset, i, match.offset + match.length);\n                });\n                this.cache[i] = ranges.length ? ranges : \"\";\n            }\n\n            for (var j = ranges.length; j --; ) {\n                markerLayer.drawSingleLineMarker(\n                    html, ranges[j].toScreenRange(session), this.clazz, config);\n            }\n        }\n    };\n\n}).call(SearchHighlight.prototype);\n\nexports.SearchHighlight = SearchHighlight;\n});\n\ndefine('ace/edit_session/folding', ['require', 'exports', 'module' , 'ace/range', 'ace/edit_session/fold_line', 'ace/edit_session/fold', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\nvar FoldLine = require(\"./fold_line\").FoldLine;\nvar Fold = require(\"./fold\").Fold;\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\n\nfunction Folding() {\n    this.getFoldAt = function(row, column, side) {\n        var foldLine = this.getFoldLine(row);\n        if (!foldLine)\n            return null;\n\n        var folds = foldLine.folds;\n        for (var i = 0; i < folds.length; i++) {\n            var fold = folds[i];\n            if (fold.range.contains(row, column)) {\n                if (side == 1 && fold.range.isEnd(row, column)) {\n                    continue;\n                } else if (side == -1 && fold.range.isStart(row, column)) {\n                    continue;\n                }\n                return fold;\n            }\n        }\n    };\n    this.getFoldsInRange = function(range) {\n        var start = range.start;\n        var end = range.end;\n        var foldLines = this.$foldData;\n        var foundFolds = [];\n\n        start.column += 1;\n        end.column -= 1;\n\n        for (var i = 0; i < foldLines.length; i++) {\n            var cmp = foldLines[i].range.compareRange(range);\n            if (cmp == 2) {\n                continue;\n            }\n            else if (cmp == -2) {\n                break;\n            }\n\n            var folds = foldLines[i].folds;\n            for (var j = 0; j < folds.length; j++) {\n                var fold = folds[j];\n                cmp = fold.range.compareRange(range);\n                if (cmp == -2) {\n                    break;\n                } else if (cmp == 2) {\n                    continue;\n                } else\n                if (cmp == 42) {\n                    break;\n                }\n                foundFolds.push(fold);\n            }\n        }\n        start.column -= 1;\n        end.column += 1;\n\n        return foundFolds;\n    };\n\n    this.getFoldsInRangeList = function(ranges) {\n        if (Array.isArray(ranges)) {\n            var folds = [];\n            ranges.forEach(function(range) {\n                folds = folds.concat(this.getFoldsInRange(range));\n            }, this);\n        } else {\n            var folds = this.getFoldsInRange(ranges);\n        }\n        return folds;\n    }\n    this.getAllFolds = function() {\n        var folds = [];\n        var foldLines = this.$foldData;\n        \n        function addFold(fold) {\n            folds.push(fold);\n        }\n        \n        for (var i = 0; i < foldLines.length; i++)\n            for (var j = 0; j < foldLines[i].folds.length; j++)\n                addFold(foldLines[i].folds[j]);\n\n        return folds;\n    };\n    this.getFoldStringAt = function(row, column, trim, foldLine) {\n        foldLine = foldLine || this.getFoldLine(row);\n        if (!foldLine)\n            return null;\n\n        var lastFold = {\n            end: { column: 0 }\n        };\n        var str, fold;\n        for (var i = 0; i < foldLine.folds.length; i++) {\n            fold = foldLine.folds[i];\n            var cmp = fold.range.compareEnd(row, column);\n            if (cmp == -1) {\n                str = this\n                    .getLine(fold.start.row)\n                    .substring(lastFold.end.column, fold.start.column);\n                break;\n            }\n            else if (cmp === 0) {\n                return null;\n            }\n            lastFold = fold;\n        }\n        if (!str)\n            str = this.getLine(fold.start.row).substring(lastFold.end.column);\n\n        if (trim == -1)\n            return str.substring(0, column - lastFold.end.column);\n        else if (trim == 1)\n            return str.substring(column - lastFold.end.column);\n        else\n            return str;\n    };\n\n    this.getFoldLine = function(docRow, startFoldLine) {\n        var foldData = this.$foldData;\n        var i = 0;\n        if (startFoldLine)\n            i = foldData.indexOf(startFoldLine);\n        if (i == -1)\n            i = 0;\n        for (i; i < foldData.length; i++) {\n            var foldLine = foldData[i];\n            if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) {\n                return foldLine;\n            } else if (foldLine.end.row > docRow) {\n                return null;\n            }\n        }\n        return null;\n    };\n    this.getNextFoldLine = function(docRow, startFoldLine) {\n        var foldData = this.$foldData;\n        var i = 0;\n        if (startFoldLine)\n            i = foldData.indexOf(startFoldLine);\n        if (i == -1)\n            i = 0;\n        for (i; i < foldData.length; i++) {\n            var foldLine = foldData[i];\n            if (foldLine.end.row >= docRow) {\n                return foldLine;\n            }\n        }\n        return null;\n    };\n\n    this.getFoldedRowCount = function(first, last) {\n        var foldData = this.$foldData, rowCount = last-first+1;\n        for (var i = 0; i < foldData.length; i++) {\n            var foldLine = foldData[i],\n                end = foldLine.end.row,\n                start = foldLine.start.row;\n            if (end >= last) {\n                if(start < last) {\n                    if(start >= first)\n                        rowCount -= last-start;\n                    else\n                        rowCount = 0;//in one fold\n                }\n                break;\n            } else if(end >= first){\n                if (start >= first) //fold inside range\n                    rowCount -=  end-start;\n                else\n                    rowCount -=  end-first+1;\n            }\n        }\n        return rowCount;\n    };\n\n    this.$addFoldLine = function(foldLine) {\n        this.$foldData.push(foldLine);\n        this.$foldData.sort(function(a, b) {\n            return a.start.row - b.start.row;\n        });\n        return foldLine;\n    };\n    this.addFold = function(placeholder, range) {\n        var foldData = this.$foldData;\n        var added = false;\n        var fold;\n        \n        if (placeholder instanceof Fold)\n            fold = placeholder;\n        else {\n            fold = new Fold(range, placeholder);\n            fold.collapseChildren = range.collapseChildren;\n        }\n        this.$clipRangeToDocument(fold.range);\n\n        var startRow = fold.start.row;\n        var startColumn = fold.start.column;\n        var endRow = fold.end.row;\n        var endColumn = fold.end.column;\n        if (!(startRow < endRow || \n            startRow == endRow && startColumn <= endColumn - 2))\n            throw new Error(\"The range has to be at least 2 characters width\");\n\n        var startFold = this.getFoldAt(startRow, startColumn, 1);\n        var endFold = this.getFoldAt(endRow, endColumn, -1);\n        if (startFold && endFold == startFold)\n            return startFold.addSubFold(fold);\n\n        if (\n            (startFold && !startFold.range.isStart(startRow, startColumn))\n            || (endFold && !endFold.range.isEnd(endRow, endColumn))\n        ) {\n            throw new Error(\"A fold can't intersect already existing fold\" + fold.range + startFold.range);\n        }\n        var folds = this.getFoldsInRange(fold.range);\n        if (folds.length > 0) {\n            this.removeFolds(folds);\n            folds.forEach(function(subFold) {\n                fold.addSubFold(subFold);\n            });\n        }\n\n        for (var i = 0; i < foldData.length; i++) {\n            var foldLine = foldData[i];\n            if (endRow == foldLine.start.row) {\n                foldLine.addFold(fold);\n                added = true;\n                break;\n            } else if (startRow == foldLine.end.row) {\n                foldLine.addFold(fold);\n                added = true;\n                if (!fold.sameRow) {\n                    var foldLineNext = foldData[i + 1];\n                    if (foldLineNext && foldLineNext.start.row == endRow) {\n                        foldLine.merge(foldLineNext);\n                        break;\n                    }\n                }\n                break;\n            } else if (endRow <= foldLine.start.row) {\n                break;\n            }\n        }\n\n        if (!added)\n            foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold));\n\n        if (this.$useWrapMode)\n            this.$updateWrapData(foldLine.start.row, foldLine.start.row);\n        else\n            this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row);\n        this.$modified = true;\n        this._emit(\"changeFold\", { data: fold, action: \"add\" });\n\n        return fold;\n    };\n\n    this.addFolds = function(folds) {\n        folds.forEach(function(fold) {\n            this.addFold(fold);\n        }, this);\n    };\n\n    this.removeFold = function(fold) {\n        var foldLine = fold.foldLine;\n        var startRow = foldLine.start.row;\n        var endRow = foldLine.end.row;\n\n        var foldLines = this.$foldData;\n        var folds = foldLine.folds;\n        if (folds.length == 1) {\n            foldLines.splice(foldLines.indexOf(foldLine), 1);\n        } else\n        if (foldLine.range.isEnd(fold.end.row, fold.end.column)) {\n            folds.pop();\n            foldLine.end.row = folds[folds.length - 1].end.row;\n            foldLine.end.column = folds[folds.length - 1].end.column;\n        } else\n        if (foldLine.range.isStart(fold.start.row, fold.start.column)) {\n            folds.shift();\n            foldLine.start.row = folds[0].start.row;\n            foldLine.start.column = folds[0].start.column;\n        } else\n        if (fold.sameRow) {\n            folds.splice(folds.indexOf(fold), 1);\n        } else\n        {\n            var newFoldLine = foldLine.split(fold.start.row, fold.start.column);\n            folds = newFoldLine.folds;\n            folds.shift();\n            newFoldLine.start.row = folds[0].start.row;\n            newFoldLine.start.column = folds[0].start.column;\n        }\n\n        if (!this.$updating) {\n            if (this.$useWrapMode)\n                this.$updateWrapData(startRow, endRow);\n            else\n                this.$updateRowLengthCache(startRow, endRow);\n        }\n        this.$modified = true;\n        this._emit(\"changeFold\", { data: fold, action: \"remove\" });\n    };\n\n    this.removeFolds = function(folds) {\n        var cloneFolds = [];\n        for (var i = 0; i < folds.length; i++) {\n            cloneFolds.push(folds[i]);\n        }\n\n        cloneFolds.forEach(function(fold) {\n            this.removeFold(fold);\n        }, this);\n        this.$modified = true;\n    };\n\n    this.expandFold = function(fold) {\n        this.removeFold(fold);\n        fold.subFolds.forEach(function(subFold) {\n            fold.restoreRange(subFold);\n            this.addFold(subFold);\n        }, this);\n        if (fold.collapseChildren > 0) {\n            this.foldAll(fold.start.row+1, fold.end.row, fold.collapseChildren-1);\n        }\n        fold.subFolds = [];\n    };\n\n    this.expandFolds = function(folds) {\n        folds.forEach(function(fold) {\n            this.expandFold(fold);\n        }, this);\n    };\n\n    this.unfold = function(location, expandInner) {\n        var range, folds;\n        if (location == null) {\n            range = new Range(0, 0, this.getLength(), 0);\n            expandInner = true;\n        } else if (typeof location == \"number\")\n            range = new Range(location, 0, location, this.getLine(location).length);\n        else if (\"row\" in location)\n            range = Range.fromPoints(location, location);\n        else\n            range = location;\n        \n        folds = this.getFoldsInRangeList(range);\n        if (expandInner) {\n            this.removeFolds(folds);\n        } else {\n            while (folds.length) {\n                this.expandFolds(folds);\n                folds = this.getFoldsInRangeList(range);\n            }\n        }\n    };\n    this.isRowFolded = function(docRow, startFoldRow) {\n        return !!this.getFoldLine(docRow, startFoldRow);\n    };\n\n    this.getRowFoldEnd = function(docRow, startFoldRow) {\n        var foldLine = this.getFoldLine(docRow, startFoldRow);\n        return foldLine ? foldLine.end.row : docRow;\n    };\n\n    this.getRowFoldStart = function(docRow, startFoldRow) {\n        var foldLine = this.getFoldLine(docRow, startFoldRow);\n        return foldLine ? foldLine.start.row : docRow;\n    };\n\n    this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) {\n        if (startRow == null) {\n            startRow = foldLine.start.row;\n            startColumn = 0;\n        }\n\n        if (endRow == null) {\n            endRow = foldLine.end.row;\n            endColumn = this.getLine(endRow).length;\n        }\n        var doc = this.doc;\n        var textLine = \"\";\n\n        foldLine.walk(function(placeholder, row, column, lastColumn) {\n            if (row < startRow)\n                return;\n            if (row == startRow) {\n                if (column < startColumn)\n                    return;\n                lastColumn = Math.max(startColumn, lastColumn);\n            }\n\n            if (placeholder != null) {\n                textLine += placeholder;\n            } else {\n                textLine += doc.getLine(row).substring(lastColumn, column);\n            }\n        }, endRow, endColumn);\n        return textLine;\n    };\n\n    this.getDisplayLine = function(row, endColumn, startRow, startColumn) {\n        var foldLine = this.getFoldLine(row);\n\n        if (!foldLine) {\n            var line;\n            line = this.doc.getLine(row);\n            return line.substring(startColumn || 0, endColumn || line.length);\n        } else {\n            return this.getFoldDisplayLine(\n                foldLine, row, endColumn, startRow, startColumn);\n        }\n    };\n\n    this.$cloneFoldData = function() {\n        var fd = [];\n        fd = this.$foldData.map(function(foldLine) {\n            var folds = foldLine.folds.map(function(fold) {\n                return fold.clone();\n            });\n            return new FoldLine(fd, folds);\n        });\n\n        return fd;\n    };\n\n    this.toggleFold = function(tryToUnfold) {\n        var selection = this.selection;\n        var range = selection.getRange();\n        var fold;\n        var bracketPos;\n\n        if (range.isEmpty()) {\n            var cursor = range.start;\n            fold = this.getFoldAt(cursor.row, cursor.column);\n\n            if (fold) {\n                this.expandFold(fold);\n                return;\n            } else if (bracketPos = this.findMatchingBracket(cursor)) {\n                if (range.comparePoint(bracketPos) == 1) {\n                    range.end = bracketPos;\n                } else {\n                    range.start = bracketPos;\n                    range.start.column++;\n                    range.end.column--;\n                }\n            } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) {\n                if (range.comparePoint(bracketPos) == 1)\n                    range.end = bracketPos;\n                else\n                    range.start = bracketPos;\n\n                range.start.column++;\n            } else {\n                range = this.getCommentFoldRange(cursor.row, cursor.column) || range;\n            }\n        } else {\n            var folds = this.getFoldsInRange(range);\n            if (tryToUnfold && folds.length) {\n                this.expandFolds(folds);\n                return;\n            } else if (folds.length == 1 ) {\n                fold = folds[0];\n            }\n        }\n\n        if (!fold)\n            fold = this.getFoldAt(range.start.row, range.start.column);\n\n        if (fold && fold.range.toString() == range.toString()) {\n            this.expandFold(fold);\n            return;\n        }\n\n        var placeholder = \"...\";\n        if (!range.isMultiLine()) {\n            placeholder = this.getTextRange(range);\n            if(placeholder.length < 4)\n                return;\n            placeholder = placeholder.trim().substring(0, 2) + \"..\";\n        }\n\n        this.addFold(placeholder, range);\n    };\n\n    this.getCommentFoldRange = function(row, column, dir) {\n        var iterator = new TokenIterator(this, row, column);\n        var token = iterator.getCurrentToken();\n        if (token && /^comment|string/.test(token.type)) {\n            var range = new Range();\n            var re = new RegExp(token.type.replace(/\\..*/, \"\\\\.\"));\n            if (dir != 1) {\n                do {\n                    token = iterator.stepBackward();\n                } while(token && re.test(token.type));\n                iterator.stepForward();\n            }\n            \n            range.start.row = iterator.getCurrentTokenRow();\n            range.start.column = iterator.getCurrentTokenColumn() + 2;\n\n            iterator = new TokenIterator(this, row, column);\n            \n            if (dir != -1) {\n                do {\n                    token = iterator.stepForward();\n                } while(token && re.test(token.type));\n                token = iterator.stepBackward();\n            } else\n                token = iterator.getCurrentToken();\n\n            range.end.row = iterator.getCurrentTokenRow();\n            range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 2;\n            return range;\n        }\n    };\n\n    this.foldAll = function(startRow, endRow, depth) {\n        if (depth == undefined)\n            depth = 100000; // JSON.stringify doesn't hanle Infinity\n        var foldWidgets = this.foldWidgets;\n        if (!foldWidgets)\n            return; // mode doesn't support folding\n        endRow = endRow || this.getLength();\n        startRow = startRow || 0;\n        for (var row = startRow; row < endRow; row++) {\n            if (foldWidgets[row] == null)\n                foldWidgets[row] = this.getFoldWidget(row);\n            if (foldWidgets[row] != \"start\")\n                continue;\n\n            var range = this.getFoldWidgetRange(row);\n            if (range && range.isMultiLine()\n                && range.end.row <= endRow\n                && range.start.row >= startRow\n            ) try {\n                var fold = this.addFold(\"...\", range);\n                fold.collapseChildren = depth;\n                row = range.end.row;\n            } catch(e) {}\n        }\n    };\n    this.$foldStyles = {\n        \"manual\": 1,\n        \"markbegin\": 1,\n        \"markbeginend\": 1\n    };\n    this.$foldStyle = \"markbegin\";\n    this.setFoldStyle = function(style) {\n        if (!this.$foldStyles[style])\n            throw new Error(\"invalid fold style: \" + style + \"[\" + Object.keys(this.$foldStyles).join(\", \") + \"]\");\n        \n        if (this.$foldStyle == style)\n            return;\n\n        this.$foldStyle = style;\n        \n        if (style == \"manual\")\n            this.unfold();\n        var mode = this.$foldMode;\n        this.$setFolding(null);\n        this.$setFolding(mode);\n    };\n\n    this.$setFolding = function(foldMode) {\n        if (this.$foldMode == foldMode)\n            return;\n            \n        this.$foldMode = foldMode;\n        \n        this.removeListener('change', this.$updateFoldWidgets);\n        this._emit(\"changeAnnotation\");\n        \n        if (!foldMode || this.$foldStyle == \"manual\") {\n            this.foldWidgets = null;\n            return;\n        }\n        \n        this.foldWidgets = [];\n        this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle);\n        this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle);\n        \n        this.$updateFoldWidgets = this.updateFoldWidgets.bind(this);\n        this.on('change', this.$updateFoldWidgets);\n        \n    };\n\n    this.getParentFoldRangeData = function (row, ignoreCurrent) {\n        var fw = this.foldWidgets;\n        if (!fw || (ignoreCurrent && fw[row]))\n            return {};\n\n        var i = row - 1, firstRange;\n        while (i >= 0) {\n            var c = fw[i];\n            if (c == null)\n                c = fw[i] = this.getFoldWidget(i);\n\n            if (c == \"start\") {\n                var range = this.getFoldWidgetRange(i);\n                if (!firstRange)\n                    firstRange = range;\n                if (range && range.end.row >= row)\n                    break;\n            }\n            i--;\n        }\n\n        return {\n            range: i !== -1 && range,\n            firstRange: firstRange\n        };\n    }\n\n    this.onFoldWidgetClick = function(row, e) {\n        e = e.domEvent;\n        var options = {\n            children: e.shiftKey,\n            all: e.ctrlKey || e.metaKey,\n            siblings: e.altKey\n        };\n        \n        var range = this.$toggleFoldWidget(row, options);\n        if (!range)\n            (e.target || e.srcElement).className += \" ace_invalid\";\n    };\n    \n    this.$toggleFoldWidget = function(row, options) {\n        var type = this.getFoldWidget(row);\n        var line = this.getLine(row);\n\n        var dir = type === \"end\" ? -1 : 1;\n        var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir);\n\n        if (fold) {\n            if (options.children || options.all)\n                this.removeFold(fold);\n            else\n                this.expandFold(fold);\n            return;\n        }\n\n        var range = this.getFoldWidgetRange(row, true);\n        if (range && !range.isMultiLine()) {\n            fold = this.getFoldAt(range.start.row, range.start.column, 1);\n            if (fold && range.isEqual(fold.range)) {\n                this.removeFold(fold);\n                return;\n            }\n        }\n        \n        if (options.siblings) {\n            var data = this.getParentFoldRangeData(row);\n            if (data.range) {\n                var startRow = data.range.start.row + 1;\n                var endRow = data.range.end.row;\n            }\n            this.foldAll(startRow, endRow, options.all ? 10000 : 0);\n        } else if (options.children) {\n            endRow = range ? range.end.row : this.getLength();\n            this.foldAll(row + 1, range.end.row, options.all ? 10000 : 0);\n        } else if (range) {\n            if (options.all) \n                range.collapseChildren = 10000;\n            this.addFold(\"...\", range);\n        }\n        \n        return range;\n    };\n    \n    \n    \n    this.toggleFoldWidget = function(toggleParent) {\n        var row = this.selection.getCursor().row;\n        row = this.getRowFoldStart(row);\n        var range = this.$toggleFoldWidget(row, {});\n        \n        if (range)\n            return;\n        var data = this.getParentFoldRangeData(row, true);\n        range = data.range || data.firstRange;\n        \n        if (range) {\n            row = range.start.row;\n            var fold = this.getFoldAt(row, this.getLine(row).length, 1);\n\n            if (fold) {\n                this.removeFold(fold);\n            } else {\n                this.addFold(\"...\", range);\n            }\n        }\n    };\n\n    this.updateFoldWidgets = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n        var firstRow = range.start.row;\n        var len = range.end.row - firstRow;\n\n        if (len === 0) {\n            this.foldWidgets[firstRow] = null;\n        } else if (delta.action == \"removeText\" || delta.action == \"removeLines\") {\n            this.foldWidgets.splice(firstRow, len + 1, null);\n        } else {\n            var args = Array(len + 1);\n            args.unshift(firstRow, 1);\n            this.foldWidgets.splice.apply(this.foldWidgets, args);\n        }\n    };\n\n}\n\nexports.Folding = Folding;\n\n});\n\ndefine('ace/edit_session/fold_line', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\nfunction FoldLine(foldData, folds) {\n    this.foldData = foldData;\n    if (Array.isArray(folds)) {\n        this.folds = folds;\n    } else {\n        folds = this.folds = [ folds ];\n    }\n\n    var last = folds[folds.length - 1]\n    this.range = new Range(folds[0].start.row, folds[0].start.column,\n                           last.end.row, last.end.column);\n    this.start = this.range.start;\n    this.end   = this.range.end;\n\n    this.folds.forEach(function(fold) {\n        fold.setFoldLine(this);\n    }, this);\n}\n\n(function() {\n    this.shiftRow = function(shift) {\n        this.start.row += shift;\n        this.end.row += shift;\n        this.folds.forEach(function(fold) {\n            fold.start.row += shift;\n            fold.end.row += shift;\n        });\n    }\n\n    this.addFold = function(fold) {\n        if (fold.sameRow) {\n            if (fold.start.row < this.startRow || fold.endRow > this.endRow) {\n                throw new Error(\"Can't add a fold to this FoldLine as it has no connection\");\n            }\n            this.folds.push(fold);\n            this.folds.sort(function(a, b) {\n                return -a.range.compareEnd(b.start.row, b.start.column);\n            });\n            if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) {\n                this.end.row = fold.end.row;\n                this.end.column =  fold.end.column;\n            } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) {\n                this.start.row = fold.start.row;\n                this.start.column = fold.start.column;\n            }\n        } else if (fold.start.row == this.end.row) {\n            this.folds.push(fold);\n            this.end.row = fold.end.row;\n            this.end.column = fold.end.column;\n        } else if (fold.end.row == this.start.row) {\n            this.folds.unshift(fold);\n            this.start.row = fold.start.row;\n            this.start.column = fold.start.column;\n        } else {\n            throw new Error(\"Trying to add fold to FoldRow that doesn't have a matching row\");\n        }\n        fold.foldLine = this;\n    }\n\n    this.containsRow = function(row) {\n        return row >= this.start.row && row <= this.end.row;\n    }\n\n    this.walk = function(callback, endRow, endColumn) {\n        var lastEnd = 0,\n            folds = this.folds,\n            fold,\n            comp, stop, isNewRow = true;\n\n        if (endRow == null) {\n            endRow = this.end.row;\n            endColumn = this.end.column;\n        }\n\n        for (var i = 0; i < folds.length; i++) {\n            fold = folds[i];\n\n            comp = fold.range.compareStart(endRow, endColumn);\n            if (comp == -1) {\n                callback(null, endRow, endColumn, lastEnd, isNewRow);\n                return;\n            }\n\n            stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow);\n            stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd);\n            if (stop || comp == 0) {\n                return;\n            }\n            isNewRow = !fold.sameRow;\n            lastEnd = fold.end.column;\n        }\n        callback(null, endRow, endColumn, lastEnd, isNewRow);\n    }\n\n    this.getNextFoldTo = function(row, column) {\n        var fold, cmp;\n        for (var i = 0; i < this.folds.length; i++) {\n            fold = this.folds[i];\n            cmp = fold.range.compareEnd(row, column);\n            if (cmp == -1) {\n                return {\n                    fold: fold,\n                    kind: \"after\"\n                };\n            } else if (cmp == 0) {\n                return {\n                    fold: fold,\n                    kind: \"inside\"\n                }\n            }\n        }\n        return null;\n    }\n\n    this.addRemoveChars = function(row, column, len) {\n        var ret = this.getNextFoldTo(row, column),\n            fold, folds;\n        if (ret) {\n            fold = ret.fold;\n            if (ret.kind == \"inside\"\n                && fold.start.column != column\n                && fold.start.row != row)\n            {\n                window.console && window.console.log(row, column, fold);\n            } else if (fold.start.row == row) {\n                folds = this.folds;\n                var i = folds.indexOf(fold);\n                if (i == 0) {\n                    this.start.column += len;\n                }\n                for (i; i < folds.length; i++) {\n                    fold = folds[i];\n                    fold.start.column += len;\n                    if (!fold.sameRow) {\n                        return;\n                    }\n                    fold.end.column += len;\n                }\n                this.end.column += len;\n            }\n        }\n    }\n\n    this.split = function(row, column) {\n        var fold = this.getNextFoldTo(row, column).fold;\n        var folds = this.folds;\n        var foldData = this.foldData;\n\n        if (!fold)\n            return null;\n\n        var i = folds.indexOf(fold);\n        var foldBefore = folds[i - 1];\n        this.end.row = foldBefore.end.row;\n        this.end.column = foldBefore.end.column;\n        folds = folds.splice(i, folds.length - i);\n\n        var newFoldLine = new FoldLine(foldData, folds);\n        foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine);\n        return newFoldLine;\n    }\n\n    this.merge = function(foldLineNext) {\n        var folds = foldLineNext.folds;\n        for (var i = 0; i < folds.length; i++) {\n            this.addFold(folds[i]);\n        }\n        var foldData = this.foldData;\n        foldData.splice(foldData.indexOf(foldLineNext), 1);\n    }\n\n    this.toString = function() {\n        var ret = [this.range.toString() + \": [\" ];\n\n        this.folds.forEach(function(fold) {\n            ret.push(\"  \" + fold.toString());\n        });\n        ret.push(\"]\")\n        return ret.join(\"\\n\");\n    }\n\n    this.idxToPosition = function(idx) {\n        var lastFoldEndColumn = 0;\n        var fold;\n\n        for (var i = 0; i < this.folds.length; i++) {\n            var fold = this.folds[i];\n\n            idx -= fold.start.column - lastFoldEndColumn;\n            if (idx < 0) {\n                return {\n                    row: fold.start.row,\n                    column: fold.start.column + idx\n                };\n            }\n\n            idx -= fold.placeholder.length;\n            if (idx < 0) {\n                return fold.start;\n            }\n\n            lastFoldEndColumn = fold.end.column;\n        }\n\n        return {\n            row: this.end.row,\n            column: this.end.column + idx\n        };\n    }\n}).call(FoldLine.prototype);\n\nexports.FoldLine = FoldLine;\n});\n\ndefine('ace/edit_session/fold', ['require', 'exports', 'module' , 'ace/range', 'ace/range_list', 'ace/lib/oop'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\nvar RangeList = require(\"../range_list\").RangeList;\nvar oop = require(\"../lib/oop\")\nvar Fold = exports.Fold = function(range, placeholder) {\n    this.foldLine = null;\n    this.placeholder = placeholder;\n    this.range = range;\n    this.start = range.start;\n    this.end = range.end;\n\n    this.sameRow = range.start.row == range.end.row;\n    this.subFolds = this.ranges = [];\n};\n\noop.inherits(Fold, RangeList);\n\n(function() {\n\n    this.toString = function() {\n        return '\"' + this.placeholder + '\" ' + this.range.toString();\n    };\n\n    this.setFoldLine = function(foldLine) {\n        this.foldLine = foldLine;\n        this.subFolds.forEach(function(fold) {\n            fold.setFoldLine(foldLine);\n        });\n    };\n\n    this.clone = function() {\n        var range = this.range.clone();\n        var fold = new Fold(range, this.placeholder);\n        this.subFolds.forEach(function(subFold) {\n            fold.subFolds.push(subFold.clone());\n        });\n        fold.collapseChildren = this.collapseChildren;\n        return fold;\n    };\n\n    this.addSubFold = function(fold) {\n        if (this.range.isEqual(fold))\n            return;\n\n        if (!this.range.containsRange(fold))\n            throw new Error(\"A fold can't intersect already existing fold\" + fold.range + this.range);\n        consumeRange(fold, this.start);\n\n        var row = fold.start.row, column = fold.start.column;\n        for (var i = 0, cmp = -1; i < this.subFolds.length; i++) {\n            cmp = this.subFolds[i].range.compare(row, column);\n            if (cmp != 1)\n                break;\n        }\n        var afterStart = this.subFolds[i];\n\n        if (cmp == 0)\n            return afterStart.addSubFold(fold);\n        var row = fold.range.end.row, column = fold.range.end.column;\n        for (var j = i, cmp = -1; j < this.subFolds.length; j++) {\n            cmp = this.subFolds[j].range.compare(row, column);\n            if (cmp != 1)\n                break;\n        }\n        var afterEnd = this.subFolds[j];\n\n        if (cmp == 0)\n            throw new Error(\"A fold can't intersect already existing fold\" + fold.range + this.range);\n\n        var consumedFolds = this.subFolds.splice(i, j - i, fold);\n        fold.setFoldLine(this.foldLine);\n\n        return fold;\n    };\n    \n    this.restoreRange = function(range) {\n        return restoreRange(range, this.start);\n    };\n\n}).call(Fold.prototype);\n\nfunction consumePoint(point, anchor) {\n    point.row -= anchor.row;\n    if (point.row == 0)\n        point.column -= anchor.column;\n}\nfunction consumeRange(range, anchor) {\n    consumePoint(range.start, anchor);\n    consumePoint(range.end, anchor);\n}\nfunction restorePoint(point, anchor) {\n    if (point.row == 0)\n        point.column += anchor.column;\n    point.row += anchor.row;\n}\nfunction restoreRange(range, anchor) {\n    restorePoint(range.start, anchor);\n    restorePoint(range.end, anchor);\n}\n\n});\n\ndefine('ace/range_list', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\nvar Range = require(\"./range\").Range;\nvar comparePoints = Range.comparePoints;\n\nvar RangeList = function() {\n    this.ranges = [];\n};\n\n(function() {\n    this.comparePoints = comparePoints;\n\n    this.pointIndex = function(pos, excludeEdges, startIndex) {\n        var list = this.ranges;\n\n        for (var i = startIndex || 0; i < list.length; i++) {\n            var range = list[i];\n            var cmpEnd = comparePoints(pos, range.end);\n            if (cmpEnd > 0)\n                continue;\n            var cmpStart = comparePoints(pos, range.start);\n            if (cmpEnd === 0)\n                return excludeEdges && cmpStart !== 0 ? -i-2 : i;\n            if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges))\n                return i;\n\n            return -i-1;\n        }\n        return -i - 1;\n    };\n\n    this.add = function(range) {\n        var excludeEdges = !range.isEmpty();\n        var startIndex = this.pointIndex(range.start, excludeEdges);\n        if (startIndex < 0)\n            startIndex = -startIndex - 1;\n\n        var endIndex = this.pointIndex(range.end, excludeEdges, startIndex);\n\n        if (endIndex < 0)\n            endIndex = -endIndex - 1;\n        else\n            endIndex++;\n        return this.ranges.splice(startIndex, endIndex - startIndex, range);\n    };\n\n    this.addList = function(list) {\n        var removed = [];\n        for (var i = list.length; i--; ) {\n            removed.push.call(removed, this.add(list[i]));\n        }\n        return removed;\n    };\n\n    this.substractPoint = function(pos) {\n        var i = this.pointIndex(pos);\n\n        if (i >= 0)\n            return this.ranges.splice(i, 1);\n    };\n    this.merge = function() {\n        var removed = [];\n        var list = this.ranges;\n        \n        list = list.sort(function(a, b) {\n            return comparePoints(a.start, b.start);\n        });\n        \n        var next = list[0], range;\n        for (var i = 1; i < list.length; i++) {\n            range = next;\n            next = list[i];\n            var cmp = comparePoints(range.end, next.start);\n            if (cmp < 0)\n                continue;\n\n            if (cmp == 0 && !range.isEmpty() && !next.isEmpty())\n                continue;\n\n            if (comparePoints(range.end, next.end) < 0) {\n                range.end.row = next.end.row;\n                range.end.column = next.end.column;\n            }\n\n            list.splice(i, 1);\n            removed.push(next);\n            next = range;\n            i--;\n        }\n        \n        this.ranges = list;\n\n        return removed;\n    };\n\n    this.contains = function(row, column) {\n        return this.pointIndex({row: row, column: column}) >= 0;\n    };\n\n    this.containsPoint = function(pos) {\n        return this.pointIndex(pos) >= 0;\n    };\n\n    this.rangeAtPoint = function(pos) {\n        var i = this.pointIndex(pos);\n        if (i >= 0)\n            return this.ranges[i];\n    };\n\n\n    this.clipRows = function(startRow, endRow) {\n        var list = this.ranges;\n        if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow)\n            return [];\n\n        var startIndex = this.pointIndex({row: startRow, column: 0});\n        if (startIndex < 0)\n            startIndex = -startIndex - 1;\n        var endIndex = this.pointIndex({row: endRow, column: 0}, startIndex);\n        if (endIndex < 0)\n            endIndex = -endIndex - 1;\n\n        var clipped = [];\n        for (var i = startIndex; i < endIndex; i++) {\n            clipped.push(list[i]);\n        }\n        return clipped;\n    };\n\n    this.removeAll = function() {\n        return this.ranges.splice(0, this.ranges.length);\n    };\n\n    this.attach = function(session) {\n        if (this.session)\n            this.detach();\n\n        this.session = session;\n        this.onChange = this.$onChange.bind(this);\n\n        this.session.on('change', this.onChange);\n    };\n\n    this.detach = function() {\n        if (!this.session)\n            return;\n        this.session.removeListener('change', this.onChange);\n        this.session = null;\n    };\n\n    this.$onChange = function(e) {\n        var changeRange = e.data.range;\n        if (e.data.action[0] == \"i\"){\n            var start = changeRange.start;\n            var end = changeRange.end;\n        } else {\n            var end = changeRange.start;\n            var start = changeRange.end;\n        }\n        var startRow = start.row;\n        var endRow = end.row;\n        var lineDif = endRow - startRow;\n\n        var colDiff = -start.column + end.column;\n        var ranges = this.ranges;\n\n        for (var i = 0, n = ranges.length; i < n; i++) {\n            var r = ranges[i];\n            if (r.end.row < startRow)\n                continue;\n            if (r.start.row > startRow)\n                break;\n\n            if (r.start.row == startRow && r.start.column >= start.column ) {\n                if (r.start.column == start.column && this.$insertRight) {\n                } else {\n                    r.start.column += colDiff;\n                    r.start.row += lineDif;\n                }\n            }\n            if (r.end.row == startRow && r.end.column >= start.column) {\n                if (r.end.column == start.column && this.$insertRight) {\n                    continue;\n                }\n                if (r.end.column == start.column && colDiff > 0 && i < n - 1) {                \n                    if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column)\n                        r.end.column -= colDiff;\n                }\n                r.end.column += colDiff;\n                r.end.row += lineDif;\n            }\n        }\n\n        if (lineDif != 0 && i < n) {\n            for (; i < n; i++) {\n                var r = ranges[i];\n                r.start.row += lineDif;\n                r.end.row += lineDif;\n            }\n        }\n    };\n\n}).call(RangeList.prototype);\n\nexports.RangeList = RangeList;\n});\n\ndefine('ace/edit_session/bracket_match', ['require', 'exports', 'module' , 'ace/token_iterator', 'ace/range'], function(require, exports, module) {\n\n\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\nvar Range = require(\"../range\").Range;\n\n\nfunction BracketMatch() {\n\n    this.findMatchingBracket = function(position, chr) {\n        if (position.column == 0) return null;\n\n        var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1);\n        if (charBeforeCursor == \"\") return null;\n\n        var match = charBeforeCursor.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n        if (!match)\n            return null;\n\n        if (match[1])\n            return this.$findClosingBracket(match[1], position);\n        else\n            return this.$findOpeningBracket(match[2], position);\n    };\n    \n    this.getBracketRange = function(pos) {\n        var line = this.getLine(pos.row);\n        var before = true, range;\n\n        var chr = line.charAt(pos.column-1);\n        var match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n        if (!match) {\n            chr = line.charAt(pos.column);\n            pos = {row: pos.row, column: pos.column + 1};\n            match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n            before = false;\n        }\n        if (!match)\n            return null;\n\n        if (match[1]) {\n            var bracketPos = this.$findClosingBracket(match[1], pos);\n            if (!bracketPos)\n                return null;\n            range = Range.fromPoints(pos, bracketPos);\n            if (!before) {\n                range.end.column++;\n                range.start.column--;\n            }\n            range.cursor = range.end;\n        } else {\n            var bracketPos = this.$findOpeningBracket(match[2], pos);\n            if (!bracketPos)\n                return null;\n            range = Range.fromPoints(bracketPos, pos);\n            if (!before) {\n                range.start.column++;\n                range.end.column--;\n            }\n            range.cursor = range.start;\n        }\n        \n        return range;\n    };\n\n    this.$brackets = {\n        \")\": \"(\",\n        \"(\": \")\",\n        \"]\": \"[\",\n        \"[\": \"]\",\n        \"{\": \"}\",\n        \"}\": \"{\"\n    };\n\n    this.$findOpeningBracket = function(bracket, position, typeRe) {\n        var openBracket = this.$brackets[bracket];\n        var depth = 1;\n\n        var iterator = new TokenIterator(this, position.row, position.column);\n        var token = iterator.getCurrentToken();\n        if (!token)\n            token = iterator.stepForward();\n        if (!token)\n            return;\n        \n         if (!typeRe){\n            typeRe = new RegExp(\n                \"(\\\\.?\" +\n                token.type.replace(\".\", \"\\\\.\").replace(\"rparen\", \".paren\")\n                + \")+\"\n            );\n        }\n        var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2;\n        var value = token.value;\n        \n        while (true) {\n        \n            while (valueIndex >= 0) {\n                var chr = value.charAt(valueIndex);\n                if (chr == openBracket) {\n                    depth -= 1;\n                    if (depth == 0) {\n                        return {row: iterator.getCurrentTokenRow(),\n                            column: valueIndex + iterator.getCurrentTokenColumn()};\n                    }\n                }\n                else if (chr == bracket) {\n                    depth += 1;\n                }\n                valueIndex -= 1;\n            }\n            do {\n                token = iterator.stepBackward();\n            } while (token && !typeRe.test(token.type));\n\n            if (token == null)\n                break;\n                \n            value = token.value;\n            valueIndex = value.length - 1;\n        }\n        \n        return null;\n    };\n\n    this.$findClosingBracket = function(bracket, position, typeRe) {\n        var closingBracket = this.$brackets[bracket];\n        var depth = 1;\n\n        var iterator = new TokenIterator(this, position.row, position.column);\n        var token = iterator.getCurrentToken();\n        if (!token)\n            token = iterator.stepForward();\n        if (!token)\n            return;\n\n        if (!typeRe){\n            typeRe = new RegExp(\n                \"(\\\\.?\" +\n                token.type.replace(\".\", \"\\\\.\").replace(\"lparen\", \".paren\")\n                + \")+\"\n            );\n        }\n        var valueIndex = position.column - iterator.getCurrentTokenColumn();\n\n        while (true) {\n\n            var value = token.value;\n            var valueLength = value.length;\n            while (valueIndex < valueLength) {\n                var chr = value.charAt(valueIndex);\n                if (chr == closingBracket) {\n                    depth -= 1;\n                    if (depth == 0) {\n                        return {row: iterator.getCurrentTokenRow(),\n                            column: valueIndex + iterator.getCurrentTokenColumn()};\n                    }\n                }\n                else if (chr == bracket) {\n                    depth += 1;\n                }\n                valueIndex += 1;\n            }\n            do {\n                token = iterator.stepForward();\n            } while (token && !typeRe.test(token.type));\n\n            if (token == null)\n                break;\n\n            valueIndex = 0;\n        }\n        \n        return null;\n    };\n}\nexports.BracketMatch = BracketMatch;\n\n});\n\ndefine('ace/search', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/lib/oop', 'ace/range'], function(require, exports, module) {\n\n\nvar lang = require(\"./lib/lang\");\nvar oop = require(\"./lib/oop\");\nvar Range = require(\"./range\").Range;\n\nvar Search = function() {\n    this.$options = {};\n};\n\n(function() {\n    this.set = function(options) {\n        oop.mixin(this.$options, options);\n        return this;\n    };\n    this.getOptions = function() {\n        return lang.copyObject(this.$options);\n    };\n    this.setOptions = function(options) {\n        this.$options = options;\n    };\n    this.find = function(session) {\n        var iterator = this.$matchIterator(session, this.$options);\n\n        if (!iterator)\n            return false;\n\n        var firstRange = null;\n        iterator.forEach(function(range, row, offset) {\n            if (!range.start) {\n                var column = range.offset + (offset || 0);\n                firstRange = new Range(row, column, row, column+range.length);\n            } else\n                firstRange = range;\n            return true;\n        });\n\n        return firstRange;\n    };\n    this.findAll = function(session) {\n        var options = this.$options;\n        if (!options.needle)\n            return [];\n        this.$assembleRegExp(options);\n\n        var range = options.range;\n        var lines = range\n            ? session.getLines(range.start.row, range.end.row)\n            : session.doc.getAllLines();\n\n        var ranges = [];\n        var re = options.re;\n        if (options.$isMultiLine) {\n            var len = re.length;\n            var maxRow = lines.length - len;\n            for (var row = re.offset || 0; row <= maxRow; row++) {\n                for (var j = 0; j < len; j++)\n                    if (lines[row + j].search(re[j]) == -1)\n                        break;\n                \n                var startLine = lines[row];\n                var line = lines[row + len - 1];\n                var startIndex = startLine.match(re[0])[0].length;\n                var endIndex = line.match(re[len - 1])[0].length;\n\n                ranges.push(new Range(\n                    row, startLine.length - startIndex,\n                    row + len - 1, endIndex\n                ));\n            }\n        } else {\n            for (var i = 0; i < lines.length; i++) {\n                var matches = lang.getMatchOffsets(lines[i], re);\n                for (var j = 0; j < matches.length; j++) {\n                    var match = matches[j];\n                    ranges.push(new Range(i, match.offset, i, match.offset + match.length));\n                }\n            }\n        }\n\n        if (range) {\n            var startColumn = range.start.column;\n            var endColumn = range.start.column;\n            var i = 0, j = ranges.length - 1;\n            while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == range.start.row)\n                i++;\n\n            while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == range.end.row)\n                j--;\n            \n            ranges = ranges.slice(i, j + 1);\n            for (i = 0, j = ranges.length; i < j; i++) {\n                ranges[i].start.row += range.start.row;\n                ranges[i].end.row += range.start.row;\n            }\n        }\n\n        return ranges;\n    };\n    this.replace = function(input, replacement) {\n        var options = this.$options;\n\n        var re = this.$assembleRegExp(options);\n        if (options.$isMultiLine)\n            return replacement;\n\n        if (!re)\n            return;\n\n        var match = re.exec(input);\n        if (!match || match[0].length != input.length)\n            return null;\n        \n        replacement = input.replace(re, replacement);\n        if (options.preserveCase) {\n            replacement = replacement.split(\"\");\n            for (var i = Math.min(input.length, input.length); i--; ) {\n                var ch = input[i];\n                if (ch && ch.toLowerCase() != ch)\n                    replacement[i] = replacement[i].toUpperCase();\n                else\n                    replacement[i] = replacement[i].toLowerCase();\n            }\n            replacement = replacement.join(\"\");\n        }\n        \n        return replacement;\n    };\n\n    this.$matchIterator = function(session, options) {\n        var re = this.$assembleRegExp(options);\n        if (!re)\n            return false;\n\n        var self = this, callback, backwards = options.backwards;\n\n        if (options.$isMultiLine) {\n            var len = re.length;\n            var matchIterator = function(line, row, offset) {\n                var startIndex = line.search(re[0]);\n                if (startIndex == -1)\n                    return;\n                for (var i = 1; i < len; i++) {\n                    line = session.getLine(row + i);\n                    if (line.search(re[i]) == -1)\n                        return;\n                }\n\n                var endIndex = line.match(re[len - 1])[0].length;\n\n                var range = new Range(row, startIndex, row + len - 1, endIndex);\n                if (re.offset == 1) {\n                    range.start.row--;\n                    range.start.column = Number.MAX_VALUE;\n                } else if (offset)\n                    range.start.column += offset;\n\n                if (callback(range))\n                    return true;\n            };\n        } else if (backwards) {\n            var matchIterator = function(line, row, startIndex) {\n                var matches = lang.getMatchOffsets(line, re);\n                for (var i = matches.length-1; i >= 0; i--)\n                    if (callback(matches[i], row, startIndex))\n                        return true;\n            };\n        } else {\n            var matchIterator = function(line, row, startIndex) {\n                var matches = lang.getMatchOffsets(line, re);\n                for (var i = 0; i < matches.length; i++)\n                    if (callback(matches[i], row, startIndex))\n                        return true;\n            };\n        }\n\n        return {\n            forEach: function(_callback) {\n                callback = _callback;\n                self.$lineIterator(session, options).forEach(matchIterator);\n            }\n        };\n    };\n\n    this.$assembleRegExp = function(options, $disableFakeMultiline) {\n        if (options.needle instanceof RegExp)\n            return options.re = options.needle;\n\n        var needle = options.needle;\n\n        if (!options.needle)\n            return options.re = false;\n\n        if (!options.regExp)\n            needle = lang.escapeRegExp(needle);\n\n        if (options.wholeWord)\n            needle = \"\\\\b\" + needle + \"\\\\b\";\n\n        var modifier = options.caseSensitive ? \"g\" : \"gi\";\n\n        options.$isMultiLine = !$disableFakeMultiline && /[\\n\\r]/.test(needle);\n        if (options.$isMultiLine)\n            return options.re = this.$assembleMultilineRegExp(needle, modifier);\n\n        try {\n            var re = new RegExp(needle, modifier);\n        } catch(e) {\n            re = false;\n        }\n        return options.re = re;\n    };\n\n    this.$assembleMultilineRegExp = function(needle, modifier) {\n        var parts = needle.replace(/\\r\\n|\\r|\\n/g, \"$\\n^\").split(\"\\n\");\n        var re = [];\n        for (var i = 0; i < parts.length; i++) try {\n            re.push(new RegExp(parts[i], modifier));\n        } catch(e) {\n            return false;\n        }\n        if (parts[0] == \"\") {\n            re.shift();\n            re.offset = 1;\n        } else {\n            re.offset = 0;\n        }\n        return re;\n    };\n\n    this.$lineIterator = function(session, options) {\n        var backwards = options.backwards === true;\n        var skipCurrent = options.skipCurrent !== false;\n\n        var range = options.range;\n        var start = options.start;\n        if (!start)\n            start = range ? range[backwards ? \"end\" : \"start\"] : session.selection.getRange();\n         \n        if (start.start)\n            start = start[skipCurrent != backwards ? \"end\" : \"start\"];\n\n        var firstRow = range ? range.start.row : 0;\n        var lastRow = range ? range.end.row : session.getLength() - 1;\n\n        var forEach = backwards ? function(callback) {\n                var row = start.row;\n\n                var line = session.getLine(row).substring(0, start.column);\n                if (callback(line, row))\n                    return;\n\n                for (row--; row >= firstRow; row--)\n                    if (callback(session.getLine(row), row))\n                        return;\n\n                if (options.wrap === false)\n                    return;\n\n                for (row = lastRow, firstRow = start.row; row >= firstRow; row--)\n                    if (callback(session.getLine(row), row))\n                        return;\n            } : function(callback) {\n                var row = start.row;\n\n                var line = session.getLine(row).substr(start.column);\n                if (callback(line, row, start.column))\n                    return;\n\n                for (row = row+1; row <= lastRow; row++)\n                    if (callback(session.getLine(row), row))\n                        return;\n\n                if (options.wrap === false)\n                    return;\n\n                for (row = firstRow, lastRow = start.row; row <= lastRow; row++)\n                    if (callback(session.getLine(row), row))\n                        return;\n            };\n        \n        return {forEach: forEach};\n    };\n\n}).call(Search.prototype);\n\nexports.Search = Search;\n});\ndefine('ace/commands/command_manager', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/keyboard/hash_handler', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar HashHandler = require(\"../keyboard/hash_handler\").HashHandler;\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar CommandManager = function(platform, commands) {\n    HashHandler.call(this, commands, platform);\n    this.byName = this.commands;\n    this.setDefaultHandler(\"exec\", function(e) {\n        return e.command.exec(e.editor, e.args || {});\n    });\n};\n\noop.inherits(CommandManager, HashHandler);\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n\n    this.exec = function(command, editor, args) {\n        if (typeof command === 'string')\n            command = this.commands[command];\n\n        if (!command)\n            return false;\n\n        if (editor && editor.$readOnly && !command.readOnly)\n            return false;\n\n        var e = {editor: editor, command: command, args: args};\n        var retvalue = this._emit(\"exec\", e);\n        this._signal(\"afterExec\", e);\n\n        return retvalue === false ? false : true;\n    };\n\n    this.toggleRecording = function(editor) {\n        if (this.$inReplay)\n            return;\n\n        editor && editor._emit(\"changeStatus\");\n        if (this.recording) {\n            this.macro.pop();\n            this.removeEventListener(\"exec\", this.$addCommandToMacro);\n\n            if (!this.macro.length)\n                this.macro = this.oldMacro;\n\n            return this.recording = false;\n        }\n        if (!this.$addCommandToMacro) {\n            this.$addCommandToMacro = function(e) {\n                this.macro.push([e.command, e.args]);\n            }.bind(this);\n        }\n\n        this.oldMacro = this.macro;\n        this.macro = [];\n        this.on(\"exec\", this.$addCommandToMacro);\n        return this.recording = true;\n    };\n\n    this.replay = function(editor) {\n        if (this.$inReplay || !this.macro)\n            return;\n\n        if (this.recording)\n            return this.toggleRecording(editor);\n\n        try {\n            this.$inReplay = true;\n            this.macro.forEach(function(x) {\n                if (typeof x == \"string\")\n                    this.exec(x, editor);\n                else\n                    this.exec(x[0], editor, x[1]);\n            }, this);\n        } finally {\n            this.$inReplay = false;\n        }\n    };\n\n    this.trimMacro = function(m) {\n        return m.map(function(x){\n            if (typeof x[0] != \"string\")\n                x[0] = x[0].name;\n            if (!x[1])\n                x = x[0];\n            return x;\n        });\n    };\n\n}).call(CommandManager.prototype);\n\nexports.CommandManager = CommandManager;\n\n});\n\ndefine('ace/keyboard/hash_handler', ['require', 'exports', 'module' , 'ace/lib/keys', 'ace/lib/useragent'], function(require, exports, module) {\n\n\nvar keyUtil = require(\"../lib/keys\");\nvar useragent = require(\"../lib/useragent\");\n\nfunction HashHandler(config, platform) {\n    this.platform = platform || (useragent.isMac ? \"mac\" : \"win\");\n    this.commands = {};\n    this.commandKeyBinding = {};\n    if (this.__defineGetter__ && this.__defineSetter__ && typeof console != \"undefined\" && console.error) {\n        var warned = false;\n        var warn = function() {\n            if (!warned) {\n                warned = true;\n                console.error(\"commmandKeyBinding has too many m's. use commandKeyBinding\");\n            }\n        };\n        this.__defineGetter__(\"commmandKeyBinding\", function() {\n            warn();\n            return this.commandKeyBinding;\n        });\n        this.__defineSetter__(\"commmandKeyBinding\", function(val) {\n            warn();\n            return this.commandKeyBinding = val;\n        });\n    } else {\n        this.commmandKeyBinding = this.commandKeyBinding;\n    }\n\n    this.addCommands(config);\n};\n\n(function() {\n\n    this.addCommand = function(command) {\n        if (this.commands[command.name])\n            this.removeCommand(command);\n\n        this.commands[command.name] = command;\n\n        if (command.bindKey)\n            this._buildKeyHash(command);\n    };\n\n    this.removeCommand = function(command) {\n        var name = (typeof command === 'string' ? command : command.name);\n        command = this.commands[name];\n        delete this.commands[name];\n        var ckb = this.commandKeyBinding;\n        for (var hashId in ckb) {\n            for (var key in ckb[hashId]) {\n                if (ckb[hashId][key] == command)\n                    delete ckb[hashId][key];\n            }\n        }\n    };\n\n    this.bindKey = function(key, command) {\n        if(!key)\n            return;\n        if (typeof command == \"function\") {\n            this.addCommand({exec: command, bindKey: key, name: command.name || key});\n            return;\n        }\n\n        var ckb = this.commandKeyBinding;\n        key.split(\"|\").forEach(function(keyPart) {\n            var binding = this.parseKeys(keyPart, command);\n            var hashId = binding.hashId;\n            (ckb[hashId] || (ckb[hashId] = {}))[binding.key] = command;\n        }, this);\n    };\n\n    this.addCommands = function(commands) {\n        commands && Object.keys(commands).forEach(function(name) {\n            var command = commands[name];\n            if (!command)\n                return;\n            \n            if (typeof command === \"string\")\n                return this.bindKey(command, name);\n\n            if (typeof command === \"function\")\n                command = { exec: command };\n\n            if (typeof command !== \"object\")\n                return;\n\n            if (!command.name)\n                command.name = name;\n\n            this.addCommand(command);\n        }, this);\n    };\n\n    this.removeCommands = function(commands) {\n        Object.keys(commands).forEach(function(name) {\n            this.removeCommand(commands[name]);\n        }, this);\n    };\n\n    this.bindKeys = function(keyList) {\n        Object.keys(keyList).forEach(function(key) {\n            this.bindKey(key, keyList[key]);\n        }, this);\n    };\n\n    this._buildKeyHash = function(command) {\n        var binding = command.bindKey;\n        if (!binding)\n            return;\n\n        var key = typeof binding == \"string\" ? binding: binding[this.platform];\n        this.bindKey(key, command);\n    };\n    this.parseKeys = function(keys) {\n        if (keys.indexOf(\" \") != -1)\n            keys = keys.split(/\\s+/).pop();\n\n        var parts = keys.toLowerCase().split(/[\\-\\+]([\\-\\+])?/).filter(function(x){return x});\n        var key = parts.pop();\n\n        var keyCode = keyUtil[key];\n        if (keyUtil.FUNCTION_KEYS[keyCode])\n            key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase();\n        else if (!parts.length)\n            return {key: key, hashId: -1};\n        else if (parts.length == 1 && parts[0] == \"shift\")\n            return {key: key.toUpperCase(), hashId: -1};\n\n        var hashId = 0;\n        for (var i = parts.length; i--;) {\n            var modifier = keyUtil.KEY_MODS[parts[i]];\n            if (modifier == null) {\n                if (typeof console != \"undefined\")\n                console.error(\"invalid modifier \" + parts[i] + \" in \" + keys);\n                return false;\n            }\n            hashId |= modifier;\n        }\n        return {key: key, hashId: hashId};\n    };\n\n    this.findKeyCommand = function findKeyCommand(hashId, keyString) {\n        var ckbr = this.commandKeyBinding;\n        return ckbr[hashId] && ckbr[hashId][keyString];\n    };\n\n    this.handleKeyboard = function(data, hashId, keyString, keyCode) {\n        return {\n            command: this.findKeyCommand(hashId, keyString)\n        };\n    };\n\n}).call(HashHandler.prototype)\n\nexports.HashHandler = HashHandler;\n});\n\ndefine('ace/commands/default_commands', ['require', 'exports', 'module' , 'ace/lib/lang', 'ace/config'], function(require, exports, module) {\n\n\nvar lang = require(\"../lib/lang\");\nvar config = require(\"../config\");\n\nfunction bindKey(win, mac) {\n    return {win: win, mac: mac};\n}\nexports.commands = [{\n    name: \"showSettingsMenu\",\n    bindKey: bindKey(\"Ctrl-,\", \"Command-,\"),\n    exec: function(editor) {\n        config.loadModule(\"ace/ext/settings_menu\", function(module) {\n            module.init(editor);\n            editor.showSettingsMenu();\n        });\n    },\n    readOnly: true\n}, {\n    name: \"selectall\",\n    bindKey: bindKey(\"Ctrl-A\", \"Command-A\"),\n    exec: function(editor) { editor.selectAll(); },\n    readOnly: true\n}, {\n    name: \"centerselection\",\n    bindKey: bindKey(null, \"Ctrl-L\"),\n    exec: function(editor) { editor.centerSelection(); },\n    readOnly: true\n}, {\n    name: \"gotoline\",\n    bindKey: bindKey(\"Ctrl-L\", \"Command-L\"),\n    exec: function(editor) {\n        var line = parseInt(prompt(\"Enter line number:\"), 10);\n        if (!isNaN(line)) {\n            editor.gotoLine(line);\n        }\n    },\n    readOnly: true\n}, {\n    name: \"fold\",\n    bindKey: bindKey(\"Alt-L|Ctrl-F1\", \"Command-Alt-L|Command-F1\"),\n    exec: function(editor) { editor.session.toggleFold(false); },\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"unfold\",\n    bindKey: bindKey(\"Alt-Shift-L|Ctrl-Shift-F1\", \"Command-Alt-Shift-L|Command-Shift-F1\"),\n    exec: function(editor) { editor.session.toggleFold(true); },\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"toggleFoldWidget\",\n    bindKey: bindKey(\"F2\", \"F2\"),\n    exec: function(editor) { editor.session.toggleFoldWidget(); },\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"toggleParentFoldWidget\",\n    bindKey: bindKey(\"Alt-F2\", \"Alt-F2\"),\n    exec: function(editor) { editor.session.toggleFoldWidget(true); },\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"foldall\",\n    bindKey: bindKey(\"Ctrl-Alt-0\", \"Ctrl-Command-Option-0\"),\n    exec: function(editor) { editor.session.foldAll(); },\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"foldOther\",\n    bindKey: bindKey(\"Alt-0\", \"Command-Option-0\"),\n    exec: function(editor) { \n        editor.session.foldAll();\n        editor.session.unfold(editor.selection.getAllRanges());\n    },\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"unfoldall\",\n    bindKey: bindKey(\"Alt-Shift-0\", \"Command-Option-Shift-0\"),\n    exec: function(editor) { editor.session.unfold(); },\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"findnext\",\n    bindKey: bindKey(\"Ctrl-K\", \"Command-G\"),\n    exec: function(editor) { editor.findNext(); },\n    readOnly: true\n}, {\n    name: \"findprevious\",\n    bindKey: bindKey(\"Ctrl-Shift-K\", \"Command-Shift-G\"),\n    exec: function(editor) { editor.findPrevious(); },\n    readOnly: true\n}, {\n    name: \"find\",\n    bindKey: bindKey(\"Ctrl-F\", \"Command-F\"),\n    exec: function(editor) {\n        config.loadModule(\"ace/ext/searchbox\", function(e) {e.Search(editor)});\n    },\n    readOnly: true\n}, {\n    name: \"overwrite\",\n    bindKey: \"Insert\",\n    exec: function(editor) { editor.toggleOverwrite(); },\n    readOnly: true\n}, {\n    name: \"selecttostart\",\n    bindKey: bindKey(\"Ctrl-Shift-Home\", \"Command-Shift-Up\"),\n    exec: function(editor) { editor.getSelection().selectFileStart(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true,\n    group: \"fileJump\"\n}, {\n    name: \"gotostart\",\n    bindKey: bindKey(\"Ctrl-Home\", \"Command-Home|Command-Up\"),\n    exec: function(editor) { editor.navigateFileStart(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true,\n    group: \"fileJump\"\n}, {\n    name: \"selectup\",\n    bindKey: bindKey(\"Shift-Up\", \"Shift-Up\"),\n    exec: function(editor) { editor.getSelection().selectUp(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"golineup\",\n    bindKey: bindKey(\"Up\", \"Up|Ctrl-P\"),\n    exec: function(editor, args) { editor.navigateUp(args.times); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"selecttoend\",\n    bindKey: bindKey(\"Ctrl-Shift-End\", \"Command-Shift-Down\"),\n    exec: function(editor) { editor.getSelection().selectFileEnd(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true,\n    group: \"fileJump\"\n}, {\n    name: \"gotoend\",\n    bindKey: bindKey(\"Ctrl-End\", \"Command-End|Command-Down\"),\n    exec: function(editor) { editor.navigateFileEnd(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true,\n    group: \"fileJump\"\n}, {\n    name: \"selectdown\",\n    bindKey: bindKey(\"Shift-Down\", \"Shift-Down\"),\n    exec: function(editor) { editor.getSelection().selectDown(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"golinedown\",\n    bindKey: bindKey(\"Down\", \"Down|Ctrl-N\"),\n    exec: function(editor, args) { editor.navigateDown(args.times); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"selectwordleft\",\n    bindKey: bindKey(\"Ctrl-Shift-Left\", \"Option-Shift-Left\"),\n    exec: function(editor) { editor.getSelection().selectWordLeft(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"gotowordleft\",\n    bindKey: bindKey(\"Ctrl-Left\", \"Option-Left\"),\n    exec: function(editor) { editor.navigateWordLeft(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"selecttolinestart\",\n    bindKey: bindKey(\"Alt-Shift-Left\", \"Command-Shift-Left\"),\n    exec: function(editor) { editor.getSelection().selectLineStart(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"gotolinestart\",\n    bindKey: bindKey(\"Alt-Left|Home\", \"Command-Left|Home|Ctrl-A\"),\n    exec: function(editor) { editor.navigateLineStart(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"selectleft\",\n    bindKey: bindKey(\"Shift-Left\", \"Shift-Left\"),\n    exec: function(editor) { editor.getSelection().selectLeft(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"gotoleft\",\n    bindKey: bindKey(\"Left\", \"Left|Ctrl-B\"),\n    exec: function(editor, args) { editor.navigateLeft(args.times); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"selectwordright\",\n    bindKey: bindKey(\"Ctrl-Shift-Right\", \"Option-Shift-Right\"),\n    exec: function(editor) { editor.getSelection().selectWordRight(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"gotowordright\",\n    bindKey: bindKey(\"Ctrl-Right\", \"Option-Right\"),\n    exec: function(editor) { editor.navigateWordRight(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"selecttolineend\",\n    bindKey: bindKey(\"Alt-Shift-Right\", \"Command-Shift-Right\"),\n    exec: function(editor) { editor.getSelection().selectLineEnd(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"gotolineend\",\n    bindKey: bindKey(\"Alt-Right|End\", \"Command-Right|End|Ctrl-E\"),\n    exec: function(editor) { editor.navigateLineEnd(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"selectright\",\n    bindKey: bindKey(\"Shift-Right\", \"Shift-Right\"),\n    exec: function(editor) { editor.getSelection().selectRight(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"gotoright\",\n    bindKey: bindKey(\"Right\", \"Right|Ctrl-F\"),\n    exec: function(editor, args) { editor.navigateRight(args.times); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"selectpagedown\",\n    bindKey: \"Shift-PageDown\",\n    exec: function(editor) { editor.selectPageDown(); },\n    readOnly: true\n}, {\n    name: \"pagedown\",\n    bindKey: bindKey(null, \"Option-PageDown\"),\n    exec: function(editor) { editor.scrollPageDown(); },\n    readOnly: true\n}, {\n    name: \"gotopagedown\",\n    bindKey: bindKey(\"PageDown\", \"PageDown|Ctrl-V\"),\n    exec: function(editor) { editor.gotoPageDown(); },\n    readOnly: true\n}, {\n    name: \"selectpageup\",\n    bindKey: \"Shift-PageUp\",\n    exec: function(editor) { editor.selectPageUp(); },\n    readOnly: true\n}, {\n    name: \"pageup\",\n    bindKey: bindKey(null, \"Option-PageUp\"),\n    exec: function(editor) { editor.scrollPageUp(); },\n    readOnly: true\n}, {\n    name: \"gotopageup\",\n    bindKey: \"PageUp\",\n    exec: function(editor) { editor.gotoPageUp(); },\n    readOnly: true\n}, {\n    name: \"scrollup\",\n    bindKey: bindKey(\"Ctrl-Up\", null),\n    exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); },\n    readOnly: true\n}, {\n    name: \"scrolldown\",\n    bindKey: bindKey(\"Ctrl-Down\", null),\n    exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); },\n    readOnly: true\n}, {\n    name: \"selectlinestart\",\n    bindKey: \"Shift-Home\",\n    exec: function(editor) { editor.getSelection().selectLineStart(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"selectlineend\",\n    bindKey: \"Shift-End\",\n    exec: function(editor) { editor.getSelection().selectLineEnd(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"togglerecording\",\n    bindKey: bindKey(\"Ctrl-Alt-E\", \"Command-Option-E\"),\n    exec: function(editor) { editor.commands.toggleRecording(editor); },\n    readOnly: true\n}, {\n    name: \"replaymacro\",\n    bindKey: bindKey(\"Ctrl-Shift-E\", \"Command-Shift-E\"),\n    exec: function(editor) { editor.commands.replay(editor); },\n    readOnly: true\n}, {\n    name: \"jumptomatching\",\n    bindKey: bindKey(\"Ctrl-P\", \"Ctrl-Shift-P\"),\n    exec: function(editor) { editor.jumpToMatching(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"selecttomatching\",\n    bindKey: bindKey(\"Ctrl-Shift-P\", null),\n    exec: function(editor) { editor.jumpToMatching(true); },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, \n{\n    name: \"cut\",\n    exec: function(editor) {\n        var range = editor.getSelectionRange();\n        editor._emit(\"cut\", range);\n\n        if (!editor.selection.isEmpty()) {\n            editor.session.remove(range);\n            editor.clearSelection();\n        }\n    },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"removeline\",\n    bindKey: bindKey(\"Ctrl-D\", \"Command-D\"),\n    exec: function(editor) { editor.removeLines(); },\n    multiSelectAction: \"forEachLine\"\n}, {\n    name: \"duplicateSelection\",\n    bindKey: bindKey(\"Ctrl-Shift-D\", \"Command-Shift-D\"),\n    exec: function(editor) { editor.duplicateSelection(); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"sortlines\",\n    bindKey: bindKey(\"Ctrl-Alt-S\", \"Command-Alt-S\"),\n    exec: function(editor) { editor.sortLines(); },\n    multiSelectAction: \"forEachLine\"\n}, {\n    name: \"togglecomment\",\n    bindKey: bindKey(\"Ctrl-/\", \"Command-/\"),\n    exec: function(editor) { editor.toggleCommentLines(); },\n    multiSelectAction: \"forEachLine\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"toggleBlockComment\",\n    bindKey: bindKey(\"Ctrl-Shift-/\", \"Command-Shift-/\"),\n    exec: function(editor) { editor.toggleBlockComment(); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"modifyNumberUp\",\n    bindKey: bindKey(\"Ctrl-Shift-Up\", \"Alt-Shift-Up\"),\n    exec: function(editor) { editor.modifyNumber(1); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"modifyNumberDown\",\n    bindKey: bindKey(\"Ctrl-Shift-Down\", \"Alt-Shift-Down\"),\n    exec: function(editor) { editor.modifyNumber(-1); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"replace\",\n    bindKey: bindKey(\"Ctrl-H\", \"Command-Option-F\"),\n    exec: function(editor) {\n        config.loadModule(\"ace/ext/searchbox\", function(e) {e.Search(editor, true)});\n    }\n}, {\n    name: \"undo\",\n    bindKey: bindKey(\"Ctrl-Z\", \"Command-Z\"),\n    exec: function(editor) { editor.undo(); }\n}, {\n    name: \"redo\",\n    bindKey: bindKey(\"Ctrl-Shift-Z|Ctrl-Y\", \"Command-Shift-Z|Command-Y\"),\n    exec: function(editor) { editor.redo(); }\n}, {\n    name: \"copylinesup\",\n    bindKey: bindKey(\"Alt-Shift-Up\", \"Command-Option-Up\"),\n    exec: function(editor) { editor.copyLinesUp(); }\n}, {\n    name: \"movelinesup\",\n    bindKey: bindKey(\"Alt-Up\", \"Option-Up\"),\n    exec: function(editor) { editor.moveLinesUp(); }\n}, {\n    name: \"copylinesdown\",\n    bindKey: bindKey(\"Alt-Shift-Down\", \"Command-Option-Down\"),\n    exec: function(editor) { editor.copyLinesDown(); }\n}, {\n    name: \"movelinesdown\",\n    bindKey: bindKey(\"Alt-Down\", \"Option-Down\"),\n    exec: function(editor) { editor.moveLinesDown(); }\n}, {\n    name: \"del\",\n    bindKey: bindKey(\"Delete\", \"Delete|Ctrl-D|Shift-Delete\"),\n    exec: function(editor) { editor.remove(\"right\"); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"backspace\",\n    bindKey: bindKey(\n        \"Shift-Backspace|Backspace\",\n        \"Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H\"\n    ),\n    exec: function(editor) { editor.remove(\"left\"); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"cut_or_delete\",\n    bindKey: bindKey(\"Shift-Delete\", null),\n    exec: function(editor) { \n        if (editor.selection.isEmpty()) {\n            editor.remove(\"left\");\n        } else {\n            return false;\n        }\n    },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"removetolinestart\",\n    bindKey: bindKey(\"Alt-Backspace\", \"Command-Backspace\"),\n    exec: function(editor) { editor.removeToLineStart(); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"removetolineend\",\n    bindKey: bindKey(\"Alt-Delete\", \"Ctrl-K\"),\n    exec: function(editor) { editor.removeToLineEnd(); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"removewordleft\",\n    bindKey: bindKey(\"Ctrl-Backspace\", \"Alt-Backspace|Ctrl-Alt-Backspace\"),\n    exec: function(editor) { editor.removeWordLeft(); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"removewordright\",\n    bindKey: bindKey(\"Ctrl-Delete\", \"Alt-Delete\"),\n    exec: function(editor) { editor.removeWordRight(); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"outdent\",\n    bindKey: bindKey(\"Shift-Tab\", \"Shift-Tab\"),\n    exec: function(editor) { editor.blockOutdent(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"indent\",\n    bindKey: bindKey(\"Tab\", \"Tab\"),\n    exec: function(editor) { editor.indent(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"blockoutdent\",\n    bindKey: bindKey(\"Ctrl-[\", \"Ctrl-[\"),\n    exec: function(editor) { editor.blockOutdent(); },\n    multiSelectAction: \"forEachLine\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"blockindent\",\n    bindKey: bindKey(\"Ctrl-]\", \"Ctrl-]\"),\n    exec: function(editor) { editor.blockIndent(); },\n    multiSelectAction: \"forEachLine\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"insertstring\",\n    exec: function(editor, str) { editor.insert(str); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"inserttext\",\n    exec: function(editor, args) {\n        editor.insert(lang.stringRepeat(args.text  || \"\", args.times || 1));\n    },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"splitline\",\n    bindKey: bindKey(null, \"Ctrl-O\"),\n    exec: function(editor) { editor.splitLine(); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"transposeletters\",\n    bindKey: bindKey(\"Ctrl-T\", \"Ctrl-T\"),\n    exec: function(editor) { editor.transposeLetters(); },\n    multiSelectAction: function(editor) {editor.transposeSelections(1); }\n}, {\n    name: \"touppercase\",\n    bindKey: bindKey(\"Ctrl-U\", \"Ctrl-U\"),\n    exec: function(editor) { editor.toUpperCase(); },\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"tolowercase\",\n    bindKey: bindKey(\"Ctrl-Shift-U\", \"Ctrl-Shift-U\"),\n    exec: function(editor) { editor.toLowerCase(); },\n    multiSelectAction: \"forEach\"\n}];\n\n});\n\ndefine('ace/undomanager', ['require', 'exports', 'module' ], function(require, exports, module) {\nvar UndoManager = function() {\n    this.reset();\n};\n\n(function() {\n    this.execute = function(options) {\n        var deltas = options.args[0];\n        this.$doc  = options.args[1];\n        if (options.merge && this.hasUndo()){\n            deltas = this.$undoStack.pop().concat(deltas);\n        }\n        this.$undoStack.push(deltas);\n        this.$redoStack = [];\n\n        if (this.dirtyCounter < 0) {\n            this.dirtyCounter = NaN;\n        }\n        this.dirtyCounter++;\n    };\n    this.undo = function(dontSelect) {\n        var deltas = this.$undoStack.pop();\n        var undoSelectionRange = null;\n        if (deltas) {\n            undoSelectionRange =\n                this.$doc.undoChanges(deltas, dontSelect);\n            this.$redoStack.push(deltas);\n            this.dirtyCounter--;\n        }\n\n        return undoSelectionRange;\n    };\n    this.redo = function(dontSelect) {\n        var deltas = this.$redoStack.pop();\n        var redoSelectionRange = null;\n        if (deltas) {\n            redoSelectionRange =\n                this.$doc.redoChanges(deltas, dontSelect);\n            this.$undoStack.push(deltas);\n            this.dirtyCounter++;\n        }\n\n        return redoSelectionRange;\n    };\n    this.reset = function() {\n        this.$undoStack = [];\n        this.$redoStack = [];\n        this.dirtyCounter = 0;\n    };\n    this.hasUndo = function() {\n        return this.$undoStack.length > 0;\n    };\n    this.hasRedo = function() {\n        return this.$redoStack.length > 0;\n    };\n    this.markClean = function() {\n        this.dirtyCounter = 0;\n    };\n    this.isClean = function() {\n        return this.dirtyCounter === 0;\n    };\n\n}).call(UndoManager.prototype);\n\nexports.UndoManager = UndoManager;\n});\n\ndefine('ace/virtual_renderer', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/useragent', 'ace/config', 'ace/layer/gutter', 'ace/layer/marker', 'ace/layer/text', 'ace/layer/cursor', 'ace/scrollbar', 'ace/renderloop', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nvar useragent = require(\"./lib/useragent\");\nvar config = require(\"./config\");\nvar GutterLayer = require(\"./layer/gutter\").Gutter;\nvar MarkerLayer = require(\"./layer/marker\").Marker;\nvar TextLayer = require(\"./layer/text\").Text;\nvar CursorLayer = require(\"./layer/cursor\").Cursor;\nvar ScrollBarH = require(\"./scrollbar\").ScrollBarH;\nvar ScrollBarV = require(\"./scrollbar\").ScrollBarV;\nvar RenderLoop = require(\"./renderloop\").RenderLoop;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar editorCss = \".ace_editor {\\\nposition: relative;\\\noverflow: hidden;\\\nfont-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\\\nfont-size: 12px;\\\nline-height: normal;\\\ncolor: black;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\n}\\\n.ace_scroller {\\\nposition: absolute;\\\noverflow: hidden;\\\ntop: 0;\\\nbottom: 0;\\\nbackground-color: inherit;\\\n}\\\n.ace_content {\\\nposition: absolute;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\ncursor: text;\\\n}\\\n.ace_dragging, .ace_dragging * {\\\ncursor: move !important;\\\n}\\\n.ace_dragging .ace_scroller:before{\\\nposition: absolute;\\\ntop: 0;\\\nleft: 0;\\\nright: 0;\\\nbottom: 0;\\\ncontent: '';\\\nbackground: rgba(250, 250, 250, 0.01);\\\nz-index: 1000;\\\n}\\\n.ace_dragging.ace_dark .ace_scroller:before{\\\nbackground: rgba(0, 0, 0, 0.01);\\\n}\\\n.ace_selecting, .ace_selecting * {\\\ncursor: text !important;\\\n}\\\n.ace_gutter {\\\nposition: absolute;\\\noverflow : hidden;\\\nwidth: auto;\\\ntop: 0;\\\nbottom: 0;\\\nleft: 0;\\\ncursor: default;\\\nz-index: 4;\\\n}\\\n.ace_gutter-active-line {\\\nposition: absolute;\\\nleft: 0;\\\nright: 0;\\\n}\\\n.ace_scroller.ace_scroll-left {\\\nbox-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\\\n}\\\n.ace_gutter-cell {\\\npadding-left: 19px;\\\npadding-right: 6px;\\\nbackground-repeat: no-repeat;\\\n}\\\n.ace_gutter-cell.ace_error {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUM2OEZDQTQ4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUM2OEZDQTU4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQzY4RkNBMjhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQzY4RkNBMzhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkgXxbAAAAJbSURBVHjapFNNaBNBFH4zs5vdZLP5sQmNpT82QY209heh1ioWisaDRcSKF0WKJ0GQnrzrxasHsR6EnlrwD0TagxJabaVEpFYxLWlLSS822tr87m66ccfd2GKyVhA6MMybgfe97/vmPUQphd0sZjto9XIn9OOsvlu2nkqRzVU+6vvlzPf8W6bk8dxQ0NPbxAALgCgg2JkaQuhzQau/El0zbmUA7U0Es8v2CiYmKQJHGO1QICCLoqilMhkmurDAyapKgqItezi/USRdJqEYY4D5jCy03ht2yMkkvL91jTTX10qzyyu2hruPRN7jgbH+EOsXcMLgYiThEgAMhABW85oqy1DXdRIdvP1AHJ2acQXvDIrVHcdQNrEKNYSVMSZGMjEzIIAwDXIo+6G/FxcGnzkC3T2oMhLjre49sBB+RRcHLqdafK6sYdE/GGBwU1VpFNj0aN8pJbe+BkZyevUrvLl6Xmm0W9IuTc0DxrDNAJd5oEvI/KRsNC3bQyNjPO9yQ1YHcfj2QvfQc/5TUhJTBc2iM0U7AWDQtc1nJHvD/cfO2s7jaGkiTEfa/Ep8coLu7zmNmh8+dc5lZDuUeFAGUNA/OY6JVaypQ0vjr7XYjUvJM37vt+j1vuTK5DgVfVUoTjVe+y3/LxMxY2GgU+CSLy4cpfsYorRXuXIOi0Vt40h67uZFTdIo6nLaZcwUJWAzwNS0tBnqqKzQDnjdG/iPyZxo46HaKUpbvYkj8qYRTZsBhge+JHhZyh0x9b95JqjVJkT084kZIPwu/mPWqPgfQ5jXh2+92Ay7HedfAgwA6KDWafb4w3cAAAAASUVORK5CYII=\\\");\\\nbackground-repeat: no-repeat;\\\nbackground-position: 2px center;\\\n}\\\n.ace_gutter-cell.ace_warning {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QUM2OEZDQTg4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QUM2OEZDQTk4RTU0MTFFMUEzM0VFRTM2RUY1M0RBMjYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpBQzY4RkNBNjhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpBQzY4RkNBNzhFNTQxMUUxQTMzRUVFMzZFRjUzREEyNiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pgd7PfIAAAGmSURBVHjaYvr//z8DJZiJgUIANoCRkREb9gLiSVAaQx4OQM7AAkwd7XU2/v++/rOttdYGEB9dASEvOMydGKfH8Gv/p4XTkvRBfLxeQAP+1cUhXopyvzhP7P/IoSj7g7Mw09cNKO6J1QQ0L4gICPIv/veg/8W+JdFvQNLHVsW9/nmn9zk7B+cCkDwhL7gt6knSZnx9/LuCEOcvkIAMP+cvto9nfqyZmmUAksfnBUtbM60gX/3/kgyv3/xSFOL5DZT+L8vP+Yfh5cvfPvp/xUHyQHXGyAYwgpwBjZYFT3Y1OEl/OfCH4ffv3wzc4iwMvNIsDJ+f/mH4+vIPAxsb631WW0Yln6ZpQLXdMK/DXGDflh+sIv37EivD5x//Gb7+YWT4y86sl7BCCkSD+Z++/1dkvsFRl+HnD1Rvje4F8whjMXmGj58YGf5zsDMwcnAwfPvKcml62DsQDeaDxN+/Y0qwlpEHqrdB94IRNIDUgfgfKJChGK4OikEW3gTiXUB950ASLFAF54AC94A0G9QAfOnmF9DCDzABFqS08IHYDIScdijOjQABBgC+/9awBH96jwAAAABJRU5ErkJggg==\\\");\\\nbackground-position: 2px center;\\\n}\\\n.ace_gutter-cell.ace_info {\\\nbackground-image: url(\\\"data:image/gif;base64,R0lGODlhEAAQAMQAAAAAAEFBQVJSUl5eXmRkZGtra39/f4WFhYmJiZGRkaampry8vMPDw8zMzNXV1dzc3OTk5Orq6vDw8P///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAkAABQALAAAAAAQABAAAAUuICWOZGmeaBml5XGwFCQSBGyXRSAwtqQIiRuiwIM5BoYVbEFIyGCQoeJGrVptIQA7\\\");\\\nbackground-position: 2px center;\\\n}\\\n.ace_dark .ace_gutter-cell.ace_info {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGRTk5MTVGREIxNDkxMUUxOTc5Q0FFREQyMTNGMjBFQyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGRTk5MTVGRUIxNDkxMUUxOTc5Q0FFREQyMTNGMjBFQyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkZFOTkxNUZCQjE0OTExRTE5NzlDQUVERDIxM0YyMEVDIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFOTkxNUZDQjE0OTExRTE5NzlDQUVERDIxM0YyMEVDIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+SIDkjAAAAJ1JREFUeNpi/P//PwMlgImBQkB7A6qrq/+DMC55FkIGKCoq4pVnpFkgTp069f/+/fv/r1u37r+tre1/kg0A+ptn9uzZYLaRkRHpLvjw4cNXWVlZhufPnzOcO3eOdAO0tbVPAjHDmzdvGA4fPsxIsgGSkpJmv379Ynj37h2DjIyMCMkG3LhxQ/T27dsMampqDHZ2dq/pH41DxwCAAAMAFdc68dUsFZgAAAAASUVORK5CYII=\\\");\\\n}\\\n.ace_scrollbar {\\\nposition: absolute;\\\noverflow-x: hidden;\\\noverflow-y: auto;\\\nright: 0;\\\ntop: 0;\\\nbottom: 0;\\\nz-index: 6;\\\n}\\\n.ace_scrollbar-inner {\\\nposition: absolute;\\\ncursor: text;\\\nleft: 0;\\\ntop: 0;\\\n}\\\n.ace_scrollbar-h {\\\nposition: absolute;\\\noverflow-x: auto;\\\noverflow-y: hidden;\\\nright: 0;\\\nleft: 0;\\\nbottom: 0;\\\nz-index: 6;\\\n}\\\n.ace_print-margin {\\\nposition: absolute;\\\nheight: 100%;\\\n}\\\n.ace_text-input {\\\nposition: absolute;\\\nz-index: 0;\\\nwidth: 0.5em;\\\nheight: 1em;\\\nopacity: 0;\\\nbackground: transparent;\\\n-moz-appearance: none;\\\nappearance: none;\\\nborder: none;\\\nresize: none;\\\noutline: none;\\\noverflow: hidden;\\\nfont: inherit;\\\npadding: 0 1px;\\\nmargin: 0 -1px;\\\ntext-indent: -1em;\\\n-ms-user-select: text;\\\n-moz-user-select: text;\\\n-webkit-user-select: text;\\\nuser-select: text;\\\n}\\\n.ace_text-input.ace_composition {\\\nbackground: #f8f8f8;\\\ncolor: #111;\\\nz-index: 1000;\\\nopacity: 1;\\\ntext-indent: 0;\\\n}\\\n.ace_layer {\\\nz-index: 1;\\\nposition: absolute;\\\noverflow: hidden;\\\nwhite-space: pre;\\\nheight: 100%;\\\nwidth: 100%;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\n/* setting pointer-events: auto; on node under the mouse, which changes\\\nduring scroll, will break mouse wheel scrolling in Safari */\\\npointer-events: none;\\\n}\\\n.ace_gutter-layer {\\\nposition: relative;\\\nwidth: auto;\\\ntext-align: right;\\\npointer-events: auto;\\\n}\\\n.ace_text-layer {\\\nfont: inherit !important;\\\n}\\\n.ace_cjk {\\\ndisplay: inline-block;\\\ntext-align: center;\\\n}\\\n.ace_cursor-layer {\\\nz-index: 4;\\\n}\\\n.ace_cursor {\\\nz-index: 4;\\\nposition: absolute;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nborder-left: 2px solid\\\n}\\\n.ace_slim-cursors .ace_cursor {\\\nborder-left-width: 1px;\\\n}\\\n.ace_overwrite-cursors .ace_cursor {\\\nborder-left-width: 0px;\\\nborder-bottom: 1px solid;\\\n}\\\n.ace_hidden-cursors .ace_cursor {\\\nopacity: 0.2;\\\n}\\\n.ace_smooth-blinking .ace_cursor {\\\n-moz-transition: opacity 0.18s;\\\n-webkit-transition: opacity 0.18s;\\\n-o-transition: opacity 0.18s;\\\n-ms-transition: opacity 0.18s;\\\ntransition: opacity 0.18s;\\\n}\\\n.ace_cursor[style*=\\\"opacity: 0\\\"]{\\\n-ms-filter: \\\"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\\\";\\\n}\\\n.ace_editor.ace_multiselect .ace_cursor {\\\nborder-left-width: 1px;\\\n}\\\n.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\\\nposition: absolute;\\\nz-index: 3;\\\n}\\\n.ace_marker-layer .ace_selection {\\\nposition: absolute;\\\nz-index: 5;\\\n}\\\n.ace_marker-layer .ace_bracket {\\\nposition: absolute;\\\nz-index: 6;\\\n}\\\n.ace_marker-layer .ace_active-line {\\\nposition: absolute;\\\nz-index: 2;\\\n}\\\n.ace_marker-layer .ace_selected-word {\\\nposition: absolute;\\\nz-index: 4;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\n}\\\n.ace_line .ace_fold {\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\ndisplay: inline-block;\\\nheight: 11px;\\\nmargin-top: -2px;\\\nvertical-align: middle;\\\nbackground-image:\\\nurl(\\\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82\\\"),\\\nurl(\\\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%3AIDAT8%11c%FC%FF%FF%7F%18%03%1A%60%01%F2%3F%A0%891%80%04%FF%11-%F8%17%9BJ%E2%05%B1ZD%81v%26t%E7%80%F8%A3%82h%A12%1A%20%A3%01%02%0F%01%BA%25%06%00%19%C0%0D%AEF%D5%3ES%00%00%00%00IEND%AEB%60%82\\\");\\\nbackground-repeat: no-repeat, repeat-x;\\\nbackground-position: center center, top left;\\\ncolor: transparent;\\\nborder: 1px solid black;\\\n-moz-border-radius: 2px;\\\n-webkit-border-radius: 2px;\\\nborder-radius: 2px;\\\ncursor: pointer;\\\npointer-events: auto;\\\n}\\\n.ace_dark .ace_fold {\\\n}\\\n.ace_fold:hover{\\\nbackground-image:\\\nurl(\\\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%11%00%00%00%09%08%06%00%00%00%D4%E8%C7%0C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%00%B5IDAT(%15%A5%91%3D%0E%02!%10%85ac%E1%05%D6%CE%D6%C6%CE%D2%E8%ED%CD%DE%C0%C6%D6N.%E0V%F8%3D%9Ca%891XH%C2%BE%D9y%3F%90!%E6%9C%C3%BFk%E5%011%C6-%F5%C8N%04%DF%BD%FF%89%DFt%83DN%60%3E%F3%AB%A0%DE%1A%5Dg%BE%10Q%97%1B%40%9C%A8o%10%8F%5E%828%B4%1B%60%87%F6%02%26%85%1Ch%1E%C1%2B%5Bk%FF%86%EE%B7j%09%9A%DA%9B%ACe%A3%F9%EC%DA!9%B4%D5%A6%81%86%86%98%CC%3C%5B%40%FA%81%B3%E9%CB%23%94%C16Azo%05%D4%E1%C1%95a%3B%8A'%A0%E8%CC%17%22%85%1D%BA%00%A2%FA%DC%0A%94%D1%D1%8D%8B%3A%84%17B%C7%60%1A%25Z%FC%8D%00%00%00%00IEND%AEB%60%82\\\"),\\\nurl(\\\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%007%08%06%00%00%00%C4%DD%80C%00%00%03%1EiCCPICC%20Profile%00%00x%01%85T%DFk%D3P%14%FE%DAe%9D%B0%E1%8B%3Ag%11%09%3Eh%91ndStC%9C%B6kW%BA%CDZ%EA6%B7!H%9B%A6m%5C%9A%C6%24%ED~%B0%07%D9%8Bo%3A%C5w%F1%07%3E%F9%07%0C%D9%83o%7B%92%0D%C6%14a%F8%AC%88%22L%F6%22%B3%9E%9B4M'S%03%B9%F7%BB%DF%F9%EE9'%E7%E4%5E%A0%F9qZ%D3%14%2F%0F%14USO%C5%C2%FC%C4%E4%14%DF%F2%01%5E%1CC%2B%FChM%8B%86%16J%26G%40%0F%D3%B2y%EF%B3%F3%0E%1E%C6lt%EEo%DF%AB%FEc%D5%9A%95%0C%11%F0%1C%20%BE%945%C4%22%E1Y%A0i%5C%D4t%13%E0%D6%89%EF%9D15%C2%CDLsX%A7%04%09%1Fg8oc%81%E1%8C%8D%23%96f45%40%9A%09%C2%07%C5B%3AK%B8%408%98i%E0%F3%0D%D8%CE%81%14%E4'%26%A9%92.%8B%3C%ABER%2F%E5dE%B2%0C%F6%F0%1Fs%83%F2_%B0%A8%94%E9%9B%AD%E7%10%8Dm%9A%19N%D1%7C%8A%DE%1F9%7Dp%8C%E6%00%D5%C1%3F_%18%BDA%B8%9DpX6%E3%A35~B%CD%24%AE%11%26%BD%E7%EEti%98%EDe%9A%97Y)%12%25%1C%24%BCbT%AE3li%E6%0B%03%89%9A%E6%D3%ED%F4P%92%B0%9F4%BF43Y%F3%E3%EDP%95%04%EB1%C5%F5%F6KF%F4%BA%BD%D7%DB%91%93%07%E35%3E%A7)%D6%7F%40%FE%BD%F7%F5r%8A%E5y%92%F0%EB%B4%1E%8D%D5%F4%5B%92%3AV%DB%DB%E4%CD%A6%23%C3%C4wQ%3F%03HB%82%8E%1Cd(%E0%91B%0Ca%9Ac%C4%AA%F8L%16%19%22J%A4%D2itTy%B28%D6%3B(%93%96%ED%1CGx%C9_%0E%B8%5E%16%F5%5B%B2%B8%F6%E0%FB%9E%DD%25%D7%8E%BC%15%85%C5%B7%A3%D8Q%ED%B5%81%E9%BA%B2%13%9A%1B%7Fua%A5%A3n%E17%B9%E5%9B%1Bm%AB%0B%08Q%FE%8A%E5%B1H%5Ee%CAO%82Q%D7u6%E6%90S%97%FCu%0B%CF2%94%EE%25v%12X%0C%BA%AC%F0%5E%F8*l%0AO%85%17%C2%97%BF%D4%C8%CE%DE%AD%11%CB%80q%2C%3E%AB%9ES%CD%C6%EC%25%D2L%D2%EBd%B8%BF%8A%F5B%C6%18%F9%901CZ%9D%BE%24M%9C%8A9%F2%DAP%0B'%06w%82%EB%E6%E2%5C%2F%D7%07%9E%BB%CC%5D%E1%FA%B9%08%AD.r%23%8E%C2%17%F5E%7C!%F0%BE3%BE%3E_%B7o%88a%A7%DB%BE%D3d%EB%A31Z%EB%BB%D3%91%BA%A2%B1z%94%8F%DB'%F6%3D%8E%AA%13%19%B2%B1%BE%B1~V%08%2B%B4%A2cjJ%B3tO%00%03%25mN%97%F3%05%93%EF%11%84%0B%7C%88%AE-%89%8F%ABbW%90O%2B%0Ao%99%0C%5E%97%0CI%AFH%D9.%B0%3B%8F%ED%03%B6S%D6%5D%E6i_s9%F3*p%E9%1B%FD%C3%EB.7U%06%5E%19%C0%D1s.%17%A03u%E4%09%B0%7C%5E%2C%EB%15%DB%1F%3C%9E%B7%80%91%3B%DBc%AD%3Dma%BA%8B%3EV%AB%DBt.%5B%1E%01%BB%0F%AB%D5%9F%CF%AA%D5%DD%E7%E4%7F%0Bx%A3%FC%06%A9%23%0A%D6%C2%A1_2%00%00%00%09pHYs%00%00%0B%13%00%00%0B%13%01%00%9A%9C%18%00%00%003IDAT8%11c%FC%FF%FF%7F%3E%03%1A%60%01%F2%3F%A3%891%80%04%FFQ%26%F8w%C0%B43%A1%DB%0C%E2%8F%0A%A2%85%CAh%80%8C%06%08%3C%04%E8%96%18%00%A3S%0D%CD%CF%D8%C1%9D%00%00%00%00IEND%AEB%60%82\\\");\\\nbackground-repeat: no-repeat, repeat-x;\\\nbackground-position: center center, top left;\\\n}\\\n.ace_gutter-tooltip {\\\nbackground-color: #FFF;\\\nbackground-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));\\\nbackground-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\\\nborder: 1px solid gray;\\\nborder-radius: 1px;\\\nbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\\\ncolor: black;\\\ndisplay: inline-block;\\\nmax-width: 500px;\\\npadding: 4px;\\\nposition: fixed;\\\nz-index: 999999;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\ncursor: default;\\\nwhite-space: pre-line;\\\nword-wrap: break-word;\\\nline-height: normal;\\\nfont-style: normal;\\\nfont-weight: normal;\\\nletter-spacing: normal;\\\n}\\\n.ace_folding-enabled > .ace_gutter-cell {\\\npadding-right: 13px;\\\n}\\\n.ace_fold-widget {\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nmargin: 0 -12px 0 1px;\\\ndisplay: none;\\\nwidth: 11px;\\\nvertical-align: top;\\\nbackground-image: url(\\\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAe%8A%B1%0D%000%0C%C2%F2%2CK%96%BC%D0%8F9%81%88H%E9%D0%0E%96%C0%10%92%3E%02%80%5E%82%E4%A9*-%EEsw%C8%CC%11%EE%96w%D8%DC%E9*Eh%0C%151(%00%00%00%00IEND%AEB%60%82\\\");\\\nbackground-repeat: no-repeat;\\\nbackground-position: center;\\\nborder-radius: 3px;\\\nborder: 1px solid transparent;\\\ncursor: pointer;\\\n}\\\n.ace_folding-enabled .ace_fold-widget {\\\ndisplay: inline-block;   \\\n}\\\n.ace_fold-widget.ace_end {\\\nbackground-image: url(\\\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%05%00%00%00%05%08%06%00%00%00%8Do%26%E5%00%00%004IDATx%DAm%C7%C1%09%000%08C%D1%8C%ECE%C8E(%8E%EC%02)%1EZJ%F1%C1'%04%07I%E1%E5%EE%CAL%F5%A2%99%99%22%E2%D6%1FU%B5%FE0%D9x%A7%26Wz5%0E%D5%00%00%00%00IEND%AEB%60%82\\\");\\\n}\\\n.ace_fold-widget.ace_closed {\\\nbackground-image: url(\\\"data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%03%00%00%00%06%08%06%00%00%00%06%E5%24%0C%00%00%009IDATx%DA5%CA%C1%09%000%08%03%C0%AC*(%3E%04%C1%0D%BA%B1%23%A4Uh%E0%20%81%C0%CC%F8%82%81%AA%A2%AArGfr%88%08%11%11%1C%DD%7D%E0%EE%5B%F6%F6%CB%B8%05Q%2F%E9tai%D9%00%00%00%00IEND%AEB%60%82\\\");\\\n}\\\n.ace_fold-widget:hover {\\\nborder: 1px solid rgba(0, 0, 0, 0.3);\\\nbackground-color: rgba(255, 255, 255, 0.2);\\\n-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\\\n-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\\\n}\\\n.ace_fold-widget:active {\\\nborder: 1px solid rgba(0, 0, 0, 0.4);\\\nbackground-color: rgba(0, 0, 0, 0.05);\\\n-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\\\n-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\\\n}\\\n/**\\\n* Dark version for fold widgets\\\n*/\\\n.ace_dark .ace_fold-widget {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_dark .ace_fold-widget.ace_end {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_dark .ace_fold-widget.ace_closed {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_dark .ace_fold-widget:hover {\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\nbackground-color: rgba(255, 255, 255, 0.1);\\\n}\\\n.ace_dark .ace_fold-widget:active {\\\n-moz-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\n-webkit-box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\n}\\\n.ace_fold-widget.ace_invalid {\\\nbackground-color: #FFB4B4;\\\nborder-color: #DE5555;\\\n}\\\n.ace_fade-fold-widgets .ace_fold-widget {\\\n-moz-transition: opacity 0.4s ease 0.05s;\\\n-webkit-transition: opacity 0.4s ease 0.05s;\\\n-o-transition: opacity 0.4s ease 0.05s;\\\n-ms-transition: opacity 0.4s ease 0.05s;\\\ntransition: opacity 0.4s ease 0.05s;\\\nopacity: 0;\\\n}\\\n.ace_fade-fold-widgets:hover .ace_fold-widget {\\\n-moz-transition: opacity 0.05s ease 0.05s;\\\n-webkit-transition: opacity 0.05s ease 0.05s;\\\n-o-transition: opacity 0.05s ease 0.05s;\\\n-ms-transition: opacity 0.05s ease 0.05s;\\\ntransition: opacity 0.05s ease 0.05s;\\\nopacity:1;\\\n}\\\n.ace_underline {\\\ntext-decoration: underline;\\\n}\\\n.ace_bold {\\\nfont-weight: bold;\\\n}\\\n.ace_nobold .ace_bold {\\\nfont-weight: normal;\\\n}\\\n.ace_italic {\\\nfont-style: italic;\\\n}\\\n.ace_error-marker {\\\nbackground-color: rgba(255, 0, 0,0.2);\\\nposition: absolute;\\\nz-index: 9;\\\n}\\\n.ace_highlight-marker {\\\nbackground-color: rgba(255, 255, 0,0.2);\\\nposition: absolute;\\\nz-index: 8;\\\n}\\\n\";\n\ndom.importCssString(editorCss, \"ace_editor\");\n\nvar VirtualRenderer = function(container, theme) {\n    var _self = this;\n\n    this.container = container || dom.createElement(\"div\");\n    this.$keepTextAreaAtCursor = true;\n\n    dom.addCssClass(this.container, \"ace_editor\");\n\n    this.setTheme(theme);\n\n    this.$gutter = dom.createElement(\"div\");\n    this.$gutter.className = \"ace_gutter\";\n    this.container.appendChild(this.$gutter);\n\n    this.scroller = dom.createElement(\"div\");\n    this.scroller.className = \"ace_scroller\";\n    this.container.appendChild(this.scroller);\n\n    this.content = dom.createElement(\"div\");\n    this.content.className = \"ace_content\";\n    this.scroller.appendChild(this.content);\n\n    this.$gutterLayer = new GutterLayer(this.$gutter);\n    this.$gutterLayer.on(\"changeGutterWidth\", this.onGutterResize.bind(this));\n\n    this.$markerBack = new MarkerLayer(this.content);\n\n    var textLayer = this.$textLayer = new TextLayer(this.content);\n    this.canvas = textLayer.element;\n\n    this.$markerFront = new MarkerLayer(this.content);\n\n    this.$cursorLayer = new CursorLayer(this.content);\n    this.$horizScroll = false;\n    this.$vScroll = false;\n\n    this.scrollBar = \n    this.scrollBarV = new ScrollBarV(this.container, this);\n    this.scrollBarH = new ScrollBarH(this.container, this);\n    this.scrollBarV.addEventListener(\"scroll\", function(e) {\n        if (!_self.$scrollAnimation)\n            _self.session.setScrollTop(e.data - _self.scrollMargin.top);\n    });\n    this.scrollBarH.addEventListener(\"scroll\", function(e) {\n        if (!_self.$scrollAnimation)\n            _self.session.setScrollLeft(e.data - _self.scrollMargin.left);\n    });\n\n    this.scrollTop = 0;\n    this.scrollLeft = 0;\n\n    this.cursorPos = {\n        row : 0,\n        column : 0\n    };\n\n    this.$textLayer.addEventListener(\"changeCharacterSize\", function() {\n        _self.updateCharacterSize();\n        _self.onResize(true);\n        _self._signal(\"changeCharacterSize\");\n    });\n\n    this.$size = {\n        width: 0,\n        height: 0,\n        scrollerHeight: 0,\n        scrollerWidth: 0,\n        $dirty: true\n    };\n\n    this.layerConfig = {\n        width : 1,\n        padding : 0,\n        firstRow : 0,\n        firstRowScreen: 0,\n        lastRow : 0,\n        lineHeight : 0,\n        characterWidth : 0,\n        minHeight : 1,\n        maxHeight : 1,\n        offset : 0,\n        height : 1\n    };\n    \n    this.scrollMargin = {\n        left: 0,\n        right: 0,\n        top: 0,\n        bottom: 0,\n        v: 0,\n        h: 0\n    };\n\n    this.$loop = new RenderLoop(\n        this.$renderChanges.bind(this),\n        this.container.ownerDocument.defaultView\n    );\n    this.$loop.schedule(this.CHANGE_FULL);\n\n    this.updateCharacterSize();\n    this.setPadding(4);\n    config.resetOptions(this);\n    config._emit(\"renderer\", this);\n};\n\n(function() {\n\n    this.CHANGE_CURSOR = 1;\n    this.CHANGE_MARKER = 2;\n    this.CHANGE_GUTTER = 4;\n    this.CHANGE_SCROLL = 8;\n    this.CHANGE_LINES = 16;\n    this.CHANGE_TEXT = 32;\n    this.CHANGE_SIZE = 64;\n    this.CHANGE_MARKER_BACK = 128;\n    this.CHANGE_MARKER_FRONT = 256;\n    this.CHANGE_FULL = 512;\n    this.CHANGE_H_SCROLL = 1024;\n\n    oop.implement(this, EventEmitter);\n\n    this.updateCharacterSize = function() {\n        if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) {\n            this.$allowBoldFonts = this.$textLayer.allowBoldFonts;\n            this.setStyle(\"ace_nobold\", !this.$allowBoldFonts);\n        }\n\n        this.layerConfig.characterWidth =\n        this.characterWidth = this.$textLayer.getCharacterWidth();\n        this.layerConfig.lineHeight =\n        this.lineHeight = this.$textLayer.getLineHeight();\n        this.$updatePrintMargin();\n    };\n    this.setSession = function(session) {\n        this.session = session;\n        \n        if (this.scrollMargin.top && session.getScrollTop() <= 0)\n            session.setScrollTop(-this.scrollMargin.top);\n\n        this.scroller.className = \"ace_scroller\";\n\n        this.$cursorLayer.setSession(session);\n        this.$markerBack.setSession(session);\n        this.$markerFront.setSession(session);\n        this.$gutterLayer.setSession(session);\n        this.$textLayer.setSession(session);\n        this.$loop.schedule(this.CHANGE_FULL);\n    };\n    this.updateLines = function(firstRow, lastRow) {\n        if (lastRow === undefined)\n            lastRow = Infinity;\n\n        if (!this.$changedLines) {\n            this.$changedLines = {\n                firstRow: firstRow,\n                lastRow: lastRow\n            };\n        }\n        else {\n            if (this.$changedLines.firstRow > firstRow)\n                this.$changedLines.firstRow = firstRow;\n\n            if (this.$changedLines.lastRow < lastRow)\n                this.$changedLines.lastRow = lastRow;\n        }\n\n        if (this.$changedLines.firstRow > this.layerConfig.lastRow ||\n            this.$changedLines.lastRow < this.layerConfig.firstRow)\n            return;\n        this.$loop.schedule(this.CHANGE_LINES);\n    };\n\n    this.onChangeTabSize = function() {\n        this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER);\n        this.$textLayer.onChangeTabSize();\n    };\n    this.updateText = function() {\n        this.$loop.schedule(this.CHANGE_TEXT);\n    };\n    this.updateFull = function(force) {\n        if (force)\n            this.$renderChanges(this.CHANGE_FULL, true);\n        else\n            this.$loop.schedule(this.CHANGE_FULL);\n    };\n    this.updateFontSize = function() {\n        this.$textLayer.checkForSizeChanges();\n    };\n\n    this.$changes = 0;\n    this.$updateSizeAsync = function() {\n        if (this.$loop.pending)\n            this.$size.$dirty = true;\n        else\n            this.onResize();\n    };\n    this.onResize = function(force, gutterWidth, width, height) {\n        if (this.resizing > 2)\n            return;\n        else if (this.resizing > 0)\n            this.resizing++;\n        else\n            this.resizing = force ? 1 : 0;\n        var el = this.container;\n        if (!height)\n            height = el.clientHeight || el.scrollHeight;\n        if (!width)\n            width = el.clientWidth || el.scrollWidth;\n        var changes = this.$updateCachedSize(force, gutterWidth, width, height);\n        \n        if (!this.$size.scrollerHeight || (!width && !height))\n            return this.resizing = 0;\n\n        if (force)\n            this.$gutterLayer.$padding = null;\n\n        if (force)\n            this.$renderChanges(changes | this.$changes, true);\n        else\n            this.$loop.schedule(changes | this.$changes);\n\n        if (this.resizing)\n            this.resizing = 0;\n    };\n    \n    this.$updateCachedSize = function(force, gutterWidth, width, height) {\n        var changes = 0;\n        var size = this.$size;\n        var oldSize = {\n            width: size.width,\n            height: size.height,\n            scrollerHeight: size.scrollerHeight,\n            scrollerWidth: size.scrollerWidth\n        };\n        if (height && (force || size.height != height)) {\n            size.height = height;\n            changes = this.CHANGE_SIZE;\n\n            size.scrollerHeight = size.height;\n            if (this.$horizScroll)\n                size.scrollerHeight -= this.scrollBarH.getHeight();\n            this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + \"px\";\n\n            if (this.session) {\n                changes = changes | this.CHANGE_SCROLL;\n            }\n        }\n\n        if (width && (force || size.width != width)) {\n            changes = this.CHANGE_SIZE;\n            size.width = width;\n            \n            if (gutterWidth == null)\n                gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n            \n            this.gutterWidth = gutterWidth;\n            \n            this.scrollBarH.element.style.left = \n            this.scroller.style.left = gutterWidth + \"px\";\n            size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth());           \n            \n            this.scrollBarH.element.style.right = \n            this.scroller.style.right = this.scrollBarV.getWidth() + \"px\";\n            this.scroller.style.bottom = this.scrollBarH.getHeight() + \"px\";\n\n            if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force)\n                changes = changes | this.CHANGE_FULL;\n        }\n        \n        if (size.$dirty)\n            size.$dirty = !width && !height;\n\n        if (changes)\n            this._signal(\"resize\", oldSize);\n\n        return changes;\n    };\n\n    this.onGutterResize = function() {\n        var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n        if (gutterWidth != this.gutterWidth)\n            this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height);\n\n        if (this.session.getUseWrapMode() && this.adjustWrapLimit()) {\n            this.$loop.schedule(this.CHANGE_FULL);\n        } else if (this.$size.$dirty) {\n            this.$loop.schedule(this.CHANGE_FULL);\n        } else {\n            this.$computeLayerConfig();\n            this.$loop.schedule(this.CHANGE_MARKER);\n        }\n    };\n    this.adjustWrapLimit = function() {\n        var availableWidth = this.$size.scrollerWidth - this.$padding * 2;\n        var limit = Math.floor(availableWidth / this.characterWidth);\n        return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn);\n    };\n    this.setAnimatedScroll = function(shouldAnimate){\n        this.setOption(\"animatedScroll\", shouldAnimate);\n    };\n    this.getAnimatedScroll = function() {\n        return this.$animatedScroll;\n    };\n    this.setShowInvisibles = function(showInvisibles) {\n        this.setOption(\"showInvisibles\", showInvisibles);\n    };\n    this.getShowInvisibles = function() {\n        return this.getOption(\"showInvisibles\");\n    };\n    this.getDisplayIndentGuides = function() {\n        return this.getOption(\"displayIndentGuides\");\n    };\n\n    this.setDisplayIndentGuides = function(display) {\n        this.setOption(\"displayIndentGuides\", display);\n    };\n    this.setShowPrintMargin = function(showPrintMargin) {\n        this.setOption(\"showPrintMargin\", showPrintMargin);\n    };\n    this.getShowPrintMargin = function() {\n        return this.getOption(\"showPrintMargin\");\n    };\n    this.setPrintMarginColumn = function(showPrintMargin) {\n        this.setOption(\"printMarginColumn\", showPrintMargin);\n    };\n    this.getPrintMarginColumn = function() {\n        return this.getOption(\"printMarginColumn\");\n    };\n    this.getShowGutter = function(){\n        return this.getOption(\"showGutter\");\n    };\n    this.setShowGutter = function(show){\n        return this.setOption(\"showGutter\", show);\n    };\n\n    this.getFadeFoldWidgets = function(){\n        return this.getOption(\"fadeFoldWidgets\")\n    };\n\n    this.setFadeFoldWidgets = function(show) {\n        this.setOption(\"fadeFoldWidgets\", show);\n    };\n\n    this.setHighlightGutterLine = function(shouldHighlight) {\n        this.setOption(\"highlightGutterLine\", shouldHighlight);\n    };\n\n    this.getHighlightGutterLine = function() {\n        return this.getOption(\"highlightGutterLine\");\n    };\n\n    this.$updateGutterLineHighlight = function() {\n        var pos = this.$cursorLayer.$pixelPos;\n        var height = this.layerConfig.lineHeight;\n        if (this.session.getUseWrapMode()) {\n            var cursor = this.session.selection.getCursor();\n            cursor.column = 0;\n            pos = this.$cursorLayer.getPixelPosition(cursor, true);\n            height *= this.session.getRowLength(cursor.row);\n        }\n        this.$gutterLineHighlight.style.top = pos.top - this.layerConfig.offset + \"px\";\n        this.$gutterLineHighlight.style.height = height + \"px\";\n    };\n\n    this.$updatePrintMargin = function() {\n        if (!this.$showPrintMargin && !this.$printMarginEl)\n            return;\n\n        if (!this.$printMarginEl) {\n            var containerEl = dom.createElement(\"div\");\n            containerEl.className = \"ace_layer ace_print-margin-layer\";\n            this.$printMarginEl = dom.createElement(\"div\");\n            this.$printMarginEl.className = \"ace_print-margin\";\n            containerEl.appendChild(this.$printMarginEl);\n            this.content.insertBefore(containerEl, this.content.firstChild);\n        }\n\n        var style = this.$printMarginEl.style;\n        style.left = ((this.characterWidth * this.$printMarginColumn) + this.$padding) + \"px\";\n        style.visibility = this.$showPrintMargin ? \"visible\" : \"hidden\";\n        \n        if (this.session && this.session.$wrap == -1)\n            this.adjustWrapLimit();\n    };\n    this.getContainerElement = function() {\n        return this.container;\n    };\n    this.getMouseEventTarget = function() {\n        return this.content;\n    };\n    this.getTextAreaContainer = function() {\n        return this.container;\n    };\n    this.$moveTextAreaToCursor = function() {\n        if (!this.$keepTextAreaAtCursor)\n            return;\n        var config = this.layerConfig;\n        var posTop = this.$cursorLayer.$pixelPos.top;\n        var posLeft = this.$cursorLayer.$pixelPos.left;\n        posTop -= config.offset;\n\n        var h = this.lineHeight;\n        if (posTop < 0 || posTop > config.height - h)\n            return;\n\n        var w = this.characterWidth;\n        if (this.$composition) {\n            var val = this.textarea.value.replace(/^\\x01+/, \"\");\n            w *= (this.session.$getStringScreenWidth(val)[0]+2);\n            h += 2;\n            posTop -= 1;\n        }\n        posLeft -= this.scrollLeft;\n        if (posLeft > this.$size.scrollerWidth - w)\n            posLeft = this.$size.scrollerWidth - w;\n\n        posLeft -= this.scrollBar.width;\n\n        this.textarea.style.height = h + \"px\";\n        this.textarea.style.width = w + \"px\";\n        this.textarea.style.right = Math.max(0, this.$size.scrollerWidth - posLeft - w) + \"px\";\n        this.textarea.style.bottom = Math.max(0, this.$size.height - posTop - h) + \"px\";\n    };\n    this.getFirstVisibleRow = function() {\n        return this.layerConfig.firstRow;\n    };\n    this.getFirstFullyVisibleRow = function() {\n        return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1);\n    };\n    this.getLastFullyVisibleRow = function() {\n        var flint = Math.floor((this.layerConfig.height + this.layerConfig.offset) / this.layerConfig.lineHeight);\n        return this.layerConfig.firstRow - 1 + flint;\n    };\n    this.getLastVisibleRow = function() {\n        return this.layerConfig.lastRow;\n    };\n\n    this.$padding = null;\n    this.setPadding = function(padding) {\n        this.$padding = padding;\n        this.$textLayer.setPadding(padding);\n        this.$cursorLayer.setPadding(padding);\n        this.$markerFront.setPadding(padding);\n        this.$markerBack.setPadding(padding);\n        this.$loop.schedule(this.CHANGE_FULL);\n        this.$updatePrintMargin();\n    };\n    \n    this.setScrollMargin = function(top, bottom, left, right) {\n        var sm = this.scrollMargin;\n        sm.top = top|0;\n        sm.bottom = bottom|0;\n        sm.right = right|0;\n        sm.left = left|0;\n        sm.v = sm.top + sm.bottom;\n        sm.h = sm.left + sm.right;\n        if (sm.top && this.scrollTop <= 0 && this.session)\n            this.session.setScrollTop(sm.top);\n        this.updateFull();\n    };\n    this.getHScrollBarAlwaysVisible = function() {\n        return this.$hScrollBarAlwaysVisible;\n    };\n    this.setHScrollBarAlwaysVisible = function(alwaysVisible) {\n        this.setOption(\"hScrollBarAlwaysVisible\", alwaysVisible);\n    };\n    this.getVScrollBarAlwaysVisible = function() {\n        return this.$hScrollBarAlwaysVisible;\n    };\n    this.setVScrollBarAlwaysVisible = function(alwaysVisible) {\n        this.setOption(\"vScrollBarAlwaysVisible\", alwaysVisible);\n    };\n\n    this.$updateScrollBarV = function() {\n        this.scrollBarV.setInnerHeight(this.layerConfig.maxHeight + this.scrollMargin.v);\n        this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top);\n    };\n    this.$updateScrollBarH = function() {\n        this.scrollBarH.setInnerWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h);\n        this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left);\n    };\n\n    this.$renderChanges = function(changes, force) {\n        if (this.$changes) {\n            changes |= this.$changes;\n            this.$changes = 0;\n        }\n        if ((!this.session || !this.container.offsetWidth) || (!changes && !force)) {\n            this.$changes |= changes;\n            return; \n        } \n        if (this.$size.$dirty) {\n            this.$changes |= changes;\n            return this.onResize(true);\n        }\n        if (!this.lineHeight) {\n            this.$textLayer.checkForSizeChanges();\n        }\n        \n        this._signal(\"beforeRender\");\n        if (changes & this.CHANGE_FULL ||\n            changes & this.CHANGE_SIZE ||\n            changes & this.CHANGE_TEXT ||\n            changes & this.CHANGE_LINES ||\n            changes & this.CHANGE_SCROLL ||\n            changes & this.CHANGE_H_SCROLL\n        )\n            changes |= this.$computeLayerConfig();\n        if (changes & this.CHANGE_H_SCROLL) {\n            this.$updateScrollBarH();\n            this.content.style.marginLeft = -this.scrollLeft + \"px\";\n            this.scroller.className = this.scrollLeft <= 0 ? \"ace_scroller\" : \"ace_scroller ace_scroll-left\";\n        }\n        if (changes & this.CHANGE_FULL) {\n            this.$updateScrollBarV();\n            this.$updateScrollBarH();\n            this.$textLayer.update(this.layerConfig);\n            if (this.$showGutter)\n                this.$gutterLayer.update(this.layerConfig);\n            this.$markerBack.update(this.layerConfig);\n            this.$markerFront.update(this.layerConfig);\n            this.$cursorLayer.update(this.layerConfig);\n            this.$moveTextAreaToCursor();\n            this.$highlightGutterLine && this.$updateGutterLineHighlight();\n            this._signal(\"afterRender\");\n            return;\n        }\n        if (changes & this.CHANGE_SCROLL) {\n            this.$updateScrollBarV();\n            if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES)\n                this.$textLayer.update(this.layerConfig);\n            else\n                this.$textLayer.scrollLines(this.layerConfig);\n\n            if (this.$showGutter)\n                this.$gutterLayer.update(this.layerConfig);\n            this.$markerBack.update(this.layerConfig);\n            this.$markerFront.update(this.layerConfig);\n            this.$cursorLayer.update(this.layerConfig);\n            this.$highlightGutterLine && this.$updateGutterLineHighlight();\n            this.$moveTextAreaToCursor();\n            this._signal(\"afterRender\");\n            return;\n        }\n\n        if (changes & this.CHANGE_TEXT) {\n            this.$textLayer.update(this.layerConfig);\n            if (this.$showGutter)\n                this.$gutterLayer.update(this.layerConfig);\n        }\n        else if (changes & this.CHANGE_LINES) {\n            if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter)\n                this.$gutterLayer.update(this.layerConfig);\n        }\n        else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) {\n            if (this.$showGutter)\n                this.$gutterLayer.update(this.layerConfig);\n        }\n\n        if (changes & this.CHANGE_CURSOR) {\n            this.$cursorLayer.update(this.layerConfig);\n            this.$moveTextAreaToCursor();\n            this.$highlightGutterLine && this.$updateGutterLineHighlight();\n        }\n\n        if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) {\n            this.$markerFront.update(this.layerConfig);\n        }\n\n        if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) {\n            this.$markerBack.update(this.layerConfig);\n        }\n\n        if (changes & this.CHANGE_SIZE || changes & this.CHANGE_LINES) {\n            this.$updateScrollBarV();\n            this.$updateScrollBarH();\n        }\n\n        this._signal(\"afterRender\");\n    };\n\n    \n    this.$autosize = function(height, width) {\n        var height = this.session.getScreenLength() * this.lineHeight;\n        var maxHeight = this.$maxLines * this.lineHeight;\n        var desiredHeight = Math.max(\n            (this.$minLines||1) * this.lineHeight,\n            Math.min(maxHeight, height)\n        );\n        var vScroll = height > maxHeight;\n        \n        if (desiredHeight != this.desiredHeight ||\n            this.$size.height != this.desiredHeight || vScroll != this.$vScroll) {\n            if (vScroll != this.$vScroll) {\n                this.$vScroll = vScroll;\n                this.scrollBarV.setVisible(vScroll);\n            }\n            \n            var w = this.container.clientWidth;\n            this.container.style.height = desiredHeight + \"px\";\n            this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight);\n            this.desiredHeight = desiredHeight;\n        }\n    };\n    \n    this.$computeLayerConfig = function() {\n        if (this.$maxLines && this.lineHeight > 1)\n            this.$autosize();\n\n        var session = this.session;\n        \n        var hideScrollbars = this.$size.height <= 2 * this.lineHeight;\n        var screenLines = this.session.getScreenLength()\n        var maxHeight = screenLines * this.lineHeight;\n\n        var offset = this.scrollTop % this.lineHeight;\n        var minHeight = this.$size.scrollerHeight + this.lineHeight;\n\n        var longestLine = this.$getLongestLine();\n        \n        var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible ||\n            this.$size.scrollerWidth - longestLine - 2 * this.$padding < 0);\n\n        var hScrollChanged = this.$horizScroll !== horizScroll;\n        if (hScrollChanged) {\n            this.$horizScroll = horizScroll;\n            this.scrollBarH.setVisible(horizScroll);\n        }\n        \n        if (!this.$maxLines && this.$scrollPastEnd) {\n            if (this.scrollTop > maxHeight - this.$size.scrollerHeight)\n                maxHeight += Math.min(\n                    (this.$size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd,\n                    this.scrollTop - maxHeight + this.$size.scrollerHeight\n                );\n        }\n        \n        var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible ||\n            this.$size.scrollerHeight - maxHeight < 0);\n        var vScrollChanged = this.$vScroll !== vScroll;\n        if (vScrollChanged) {\n            this.$vScroll = vScroll;\n            this.scrollBarV.setVisible(vScroll);\n        }\n        \n        this.session.setScrollTop(Math.max(-this.scrollMargin.top,\n            Math.min(this.scrollTop, maxHeight - this.$size.scrollerHeight + this.scrollMargin.v)));\n\n        this.session.setScrollLeft(Math.max(-this.scrollMargin.left, Math.min(this.scrollLeft, \n            longestLine + 2 * this.$padding - this.$size.scrollerWidth + this.scrollMargin.h)));\n\n        var lineCount = Math.ceil(minHeight / this.lineHeight) - 1;\n        var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight));\n        var lastRow = firstRow + lineCount;\n        var firstRowScreen, firstRowHeight;\n        var lineHeight = this.lineHeight;\n        firstRow = session.screenToDocumentRow(firstRow, 0);\n        var foldLine = session.getFoldLine(firstRow);\n        if (foldLine) {\n            firstRow = foldLine.start.row;\n        }\n\n        firstRowScreen = session.documentToScreenRow(firstRow, 0);\n        firstRowHeight = session.getRowLength(firstRow) * lineHeight;\n\n        lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1);\n        minHeight = this.$size.scrollerHeight + session.getRowLength(lastRow) * lineHeight +\n                                                firstRowHeight;\n\n        offset = this.scrollTop - firstRowScreen * lineHeight;\n\n        var changes = 0;\n        if (hScrollChanged || vScrollChanged) {\n            changes = this.$updateCachedSize(true, this.gutterWidth, this.$size.width, this.$size.height);\n            this._signal(\"scrollbarVisibilityChanged\");\n            if (vScrollChanged)\n                longestLine = this.$getLongestLine();\n        }\n        \n        this.layerConfig = {\n            width : longestLine,\n            padding : this.$padding,\n            firstRow : firstRow,\n            firstRowScreen: firstRowScreen,\n            lastRow : lastRow,\n            lineHeight : lineHeight,\n            characterWidth : this.characterWidth,\n            minHeight : minHeight,\n            maxHeight : maxHeight,\n            offset : offset,\n            height : this.$size.scrollerHeight\n        };\n\n        this.$gutterLayer.element.style.marginTop = (-offset) + \"px\";\n        this.content.style.marginTop = (-offset) + \"px\";\n        this.content.style.width = longestLine + 2 * this.$padding + \"px\";\n        this.content.style.height = minHeight + \"px\";\n\n        return changes;\n        return changes;\n    };\n\n    this.$updateLines = function() {\n        var firstRow = this.$changedLines.firstRow;\n        var lastRow = this.$changedLines.lastRow;\n        this.$changedLines = null;\n\n        var layerConfig = this.layerConfig;\n\n        if (firstRow > layerConfig.lastRow + 1) { return; }\n        if (lastRow < layerConfig.firstRow) { return; }\n        if (lastRow === Infinity) {\n            if (this.$showGutter)\n                this.$gutterLayer.update(layerConfig);\n            this.$textLayer.update(layerConfig);\n            return;\n        }\n        this.$textLayer.updateLines(layerConfig, firstRow, lastRow);\n        return true;\n    };\n\n    this.$getLongestLine = function() {\n        var charCount = this.session.getScreenWidth();\n        if (this.showInvisibles && !this.session.$useWrapMode)\n            charCount += 1;\n\n        return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth));\n    };\n    this.updateFrontMarkers = function() {\n        this.$markerFront.setMarkers(this.session.getMarkers(true));\n        this.$loop.schedule(this.CHANGE_MARKER_FRONT);\n    };\n    this.updateBackMarkers = function() {\n        this.$markerBack.setMarkers(this.session.getMarkers());\n        this.$loop.schedule(this.CHANGE_MARKER_BACK);\n    };\n    this.addGutterDecoration = function(row, className){\n        this.$gutterLayer.addGutterDecoration(row, className);\n    };\n    this.removeGutterDecoration = function(row, className){\n        this.$gutterLayer.removeGutterDecoration(row, className);\n    };\n    this.updateBreakpoints = function(rows) {\n        this.$loop.schedule(this.CHANGE_GUTTER);\n    };\n    this.setAnnotations = function(annotations) {\n        this.$gutterLayer.setAnnotations(annotations);\n        this.$loop.schedule(this.CHANGE_GUTTER);\n    };\n    this.updateCursor = function() {\n        this.$loop.schedule(this.CHANGE_CURSOR);\n    };\n    this.hideCursor = function() {\n        this.$cursorLayer.hideCursor();\n    };\n    this.showCursor = function() {\n        this.$cursorLayer.showCursor();\n    };\n\n    this.scrollSelectionIntoView = function(anchor, lead, offset) {\n        this.scrollCursorIntoView(anchor, offset);\n        this.scrollCursorIntoView(lead, offset);\n    };\n    this.scrollCursorIntoView = function(cursor, offset) {\n        if (this.$size.scrollerHeight === 0)\n            return;\n\n        var pos = this.$cursorLayer.getPixelPosition(cursor);\n\n        var left = pos.left;\n        var top = pos.top;\n        \n        var scrollTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop;\n\n        if (scrollTop > top) {\n            if (offset)\n                top -= offset * this.$size.scrollerHeight;\n            if (top == 0)\n                top = - this.scrollMargin.top;\n            else if (top == 0)\n                top = + this.scrollMargin.bottom;\n            this.session.setScrollTop(top);\n        } else if (scrollTop + this.$size.scrollerHeight < top + this.lineHeight) {\n            if (offset)\n                top += offset * this.$size.scrollerHeight;\n            this.session.setScrollTop(top + this.lineHeight - this.$size.scrollerHeight);\n        }\n\n        var scrollLeft = this.scrollLeft;\n\n        if (scrollLeft > left) {\n            if (left < this.$padding + 2 * this.layerConfig.characterWidth)\n                left = -this.scrollMargin.left;\n            this.session.setScrollLeft(left);\n        } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) {\n            this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth));\n        } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) {\n            this.session.setScrollLeft(0);\n        }\n    };\n    this.getScrollTop = function() {\n        return this.session.getScrollTop();\n    };\n    this.getScrollLeft = function() {\n        return this.session.getScrollLeft();\n    };\n    this.getScrollTopRow = function() {\n        return this.scrollTop / this.lineHeight;\n    };\n    this.getScrollBottomRow = function() {\n        return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1);\n    };\n    this.scrollToRow = function(row) {\n        this.session.setScrollTop(row * this.lineHeight);\n    };\n\n    this.alignCursor = function(cursor, alignment) {\n        if (typeof cursor == \"number\")\n            cursor = {row: cursor, column: 0};\n\n        var pos = this.$cursorLayer.getPixelPosition(cursor);\n        var h = this.$size.scrollerHeight - this.lineHeight;\n        var offset = pos.top - h * (alignment || 0);\n\n        this.session.setScrollTop(offset);\n        return offset;\n    };\n\n    this.STEPS = 8;\n    this.$calcSteps = function(fromValue, toValue){\n        var i = 0;\n        var l = this.STEPS;\n        var steps = [];\n\n        var func  = function(t, x_min, dx) {\n            return dx * (Math.pow(t - 1, 3) + 1) + x_min;\n        };\n\n        for (i = 0; i < l; ++i)\n            steps.push(func(i / this.STEPS, fromValue, toValue - fromValue));\n\n        return steps;\n    };\n    this.scrollToLine = function(line, center, animate, callback) {\n        var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0});\n        var offset = pos.top;\n        if (center)\n            offset -= this.$size.scrollerHeight / 2;\n\n        var initialScroll = this.scrollTop;\n        this.session.setScrollTop(offset);\n        if (animate !== false)\n            this.animateScrolling(initialScroll, callback);\n    };\n\n    this.animateScrolling = function(fromValue, callback) {\n        var toValue = this.scrollTop;\n        if (!this.$animatedScroll)\n            return;\n        var _self = this;\n        \n        if (fromValue == toValue)\n            return;\n        \n        if (this.$scrollAnimation) {\n            var oldSteps = this.$scrollAnimation.steps;\n            if (oldSteps.length) {\n                fromValue = oldSteps[0];\n                if (fromValue == toValue)\n                    return;\n            }\n        }\n        \n        var steps = _self.$calcSteps(fromValue, toValue);\n        this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps};\n\n        clearInterval(this.$timer);\n\n        _self.session.setScrollTop(steps.shift());\n        this.$timer = setInterval(function() {\n            if (steps.length) {\n                _self.session.setScrollTop(steps.shift());\n                _self.session.$scrollTop = toValue;\n            } else if (toValue != null) {\n                _self.session.$scrollTop = -1;\n                _self.session.setScrollTop(toValue);\n                toValue = null;\n            } else {\n                _self.$timer = clearInterval(_self.$timer);\n                _self.$scrollAnimation = null;\n                callback && callback();\n            }\n        }, 10);\n    };\n    this.scrollToY = function(scrollTop) {\n        if (this.scrollTop !== scrollTop) {\n            this.$loop.schedule(this.CHANGE_SCROLL);\n            this.scrollTop = scrollTop;\n        }\n    };\n    this.scrollToX = function(scrollLeft) {\n        if (this.scrollLeft !== scrollLeft)\n            this.scrollLeft = scrollLeft;\n        this.$loop.schedule(this.CHANGE_H_SCROLL);\n    };\n    this.scrollTo = function(x, y) {\n        this.session.setScrollTop(y);\n        this.session.setScrollLeft(y);\n    };\n    this.scrollBy = function(deltaX, deltaY) {\n        deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY);\n        deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX);\n    };\n    this.isScrollableBy = function(deltaX, deltaY) {\n        if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top)\n           return true;\n        if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight\n            - this.layerConfig.maxHeight - (this.$size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd\n            < -1 + this.scrollMargin.bottom)\n           return true;\n        if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left)\n            return true;\n        if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth\n            - this.layerConfig.width < -1 + this.scrollMargin.right)\n           return true;\n    };\n\n    this.pixelToScreenCoordinates = function(x, y) {\n        var canvasPos = this.scroller.getBoundingClientRect();\n\n        var offset = (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth;\n        var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight);\n        var col = Math.round(offset);\n\n        return {row: row, column: col, side: offset - col > 0 ? 1 : -1};\n    };\n\n    this.screenToTextCoordinates = function(x, y) {\n        var canvasPos = this.scroller.getBoundingClientRect();\n\n        var col = Math.round(\n            (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth\n        );\n\n        var row = (y + this.scrollTop - canvasPos.top) / this.lineHeight;\n\n        return this.session.screenToDocumentPosition(row, Math.max(col, 0));\n    };\n    this.textToScreenCoordinates = function(row, column) {\n        var canvasPos = this.scroller.getBoundingClientRect();\n        var pos = this.session.documentToScreenPosition(row, column);\n\n        var x = this.$padding + Math.round(pos.column * this.characterWidth);\n        var y = pos.row * this.lineHeight;\n\n        return {\n            pageX: canvasPos.left + x - this.scrollLeft,\n            pageY: canvasPos.top + y - this.scrollTop\n        };\n    };\n    this.visualizeFocus = function() {\n        dom.addCssClass(this.container, \"ace_focus\");\n    };\n    this.visualizeBlur = function() {\n        dom.removeCssClass(this.container, \"ace_focus\");\n    };\n    this.showComposition = function(position) {\n        if (!this.$composition)\n            this.$composition = {\n                keepTextAreaAtCursor: this.$keepTextAreaAtCursor,\n                cssText: this.textarea.style.cssText\n            };\n\n        this.$keepTextAreaAtCursor = true;\n        dom.addCssClass(this.textarea, \"ace_composition\");\n        this.textarea.style.cssText = \"\";\n        this.$moveTextAreaToCursor();\n    };\n    this.setCompositionText = function(text) {\n        this.$moveTextAreaToCursor();\n    };\n    this.hideComposition = function() {\n        if (!this.$composition)\n            return;\n\n        dom.removeCssClass(this.textarea, \"ace_composition\");\n        this.$keepTextAreaAtCursor = this.$composition.keepTextAreaAtCursor;\n        this.textarea.style.cssText = this.$composition.cssText;\n        this.$composition = null;\n    };\n    this.setTheme = function(theme, cb) {\n        var _self = this;\n        this.$themeValue = theme;\n        _self._dispatchEvent('themeChange',{theme:theme});\n\n        if (!theme || typeof theme == \"string\") {\n            var moduleName = theme || \"ace/theme/textmate\";\n            config.loadModule([\"theme\", moduleName], afterLoad);\n        } else {\n            afterLoad(theme);\n        }\n\n        function afterLoad(module) {\n            if (_self.$themeValue != theme)\n                return cb && cb();\n            if (!module.cssClass)\n                return;\n            dom.importCssString(\n                module.cssText,\n                module.cssClass,\n                _self.container.ownerDocument\n            );\n\n            if (_self.theme)\n                dom.removeCssClass(_self.container, _self.theme.cssClass);\n            _self.$theme = module.cssClass;\n\n            _self.theme = module;\n            dom.addCssClass(_self.container, module.cssClass);\n            dom.setCssClass(_self.container, \"ace_dark\", module.isDark);\n\n            var padding = \"padding\" in module ? module.padding : 4;\n            if (_self.$padding && padding != _self.$padding)\n                _self.setPadding(padding);\n            if (_self.$size) {\n                _self.$size.width = 0;\n                _self.onResize();\n            }\n\n            _self._dispatchEvent('themeLoaded', {theme:module});\n            cb && cb();\n        }\n    };\n    this.getTheme = function() {\n        return this.$themeValue;\n    };\n    this.setStyle = function(style, include) {\n        dom.setCssClass(this.container, style, include !== false);\n    };\n    this.unsetStyle = function(style) {\n        dom.removeCssClass(this.container, style);\n    };\n    this.setMouseCursor = function(cursorStyle) {\n        this.content.style.cursor = cursorStyle;\n    };\n    this.destroy = function() {\n        this.$textLayer.destroy();\n        this.$cursorLayer.destroy();\n    };\n\n}).call(VirtualRenderer.prototype);\n\n\nconfig.defineOptions(VirtualRenderer.prototype, \"renderer\", {\n    animatedScroll: {initialValue: false},\n    showInvisibles: {\n        set: function(value) {\n            if (this.$textLayer.setShowInvisibles(value))\n                this.$loop.schedule(this.CHANGE_TEXT);\n        },\n        initialValue: false\n    },\n    showPrintMargin: {\n        set: function() { this.$updatePrintMargin(); },\n        initialValue: true\n    },\n    printMarginColumn: {\n        set: function() { this.$updatePrintMargin(); },\n        initialValue: 80\n    },\n    printMargin: {\n        set: function(val) {\n            if (typeof val == \"number\")\n                this.$printMarginColumn = val;\n            this.$showPrintMargin = !!val;\n            this.$updatePrintMargin();\n        },\n        get: function() {\n            return this.$showPrintMargin && this.$printMarginColumn; \n        }\n    },\n    showGutter: {\n        set: function(show){\n            this.$gutter.style.display = show ? \"block\" : \"none\";\n            this.onGutterResize();\n        },\n        initialValue: true\n    },\n    fadeFoldWidgets: {\n        set: function(show) {\n            dom.setCssClass(this.$gutter, \"ace_fade-fold-widgets\", show);\n        },\n        initialValue: false\n    },\n    showFoldWidgets: {\n        set: function(show) {this.$gutterLayer.setShowFoldWidgets(show)},\n        initialValue: true\n    },\n    displayIndentGuides: {\n        set: function(show) {\n            if (this.$textLayer.setDisplayIndentGuides(show))\n                this.$loop.schedule(this.CHANGE_TEXT);\n        },\n        initialValue: true\n    },\n    highlightGutterLine: {\n        set: function(shouldHighlight) {\n            if (!this.$gutterLineHighlight) {\n                this.$gutterLineHighlight = dom.createElement(\"div\");\n                this.$gutterLineHighlight.className = \"ace_gutter-active-line\";\n                this.$gutter.appendChild(this.$gutterLineHighlight);\n                return;\n            }\n\n            this.$gutterLineHighlight.style.display = shouldHighlight ? \"\" : \"none\";\n            if (this.$cursorLayer.$pixelPos)\n                this.$updateGutterLineHighlight();\n        },\n        initialValue: false,\n        value: true\n    },\n    hScrollBarAlwaysVisible: {\n        set: function(val) {\n            if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll)\n                this.$loop.schedule(this.CHANGE_SCROLL);\n        },\n        initialValue: false\n    },\n    vScrollBarAlwaysVisible: {\n        set: function(val) {\n            if (!this.$vScrollBarAlwaysVisible || !this.$vScroll)\n                this.$loop.schedule(this.CHANGE_SCROLL);\n        },\n        initialValue: false\n    },\n    fontSize:  {\n        set: function(size) {\n            if (typeof size == \"number\")\n                size = size + \"px\";\n            this.container.style.fontSize = size;\n            this.updateFontSize();\n        },\n        initialValue: 12\n    },\n    fontFamily: {\n        set: function(name) {\n            this.container.style.fontFamily = name;\n            this.updateFontSize();\n        }\n    },\n    maxLines: {\n        set: function(val) {\n            this.updateFull();\n        }\n    },\n    minLines: {\n        set: function(val) {\n            this.updateFull();\n        }\n    },\n    scrollPastEnd: {\n        set: function(val) {\n            val = +val || 0;\n            if (this.$scrollPastEnd == val)\n                return;\n            this.$scrollPastEnd = val;\n            this.$loop.schedule(this.CHANGE_SCROLL);\n        },\n        initialValue: 0,\n        handlesSet: true\n    },\n    fixedWidthGutter: {\n        set: function(val) {\n            this.$gutterLayer.$fixedWidth = !!val;\n            this.$loop.schedule(this.CHANGE_GUTTER);\n        }\n    }\n});\n\nexports.VirtualRenderer = VirtualRenderer;\n});\n\ndefine('ace/layer/gutter', ['require', 'exports', 'module' , 'ace/lib/dom', 'ace/lib/oop', 'ace/lib/lang', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar dom = require(\"../lib/dom\");\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar Gutter = function(parentEl) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_layer ace_gutter-layer\";\n    parentEl.appendChild(this.element);\n    this.setShowFoldWidgets(this.$showFoldWidgets);\n    \n    this.gutterWidth = 0;\n\n    this.$annotations = [];\n    this.$updateAnnotations = this.$updateAnnotations.bind(this);\n\n    this.$cells = [];\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n\n    this.setSession = function(session) {\n        if (this.session)\n            this.session.removeEventListener(\"change\", this.$updateAnnotations);\n        this.session = session;\n        session.on(\"change\", this.$updateAnnotations);\n    };\n\n    this.addGutterDecoration = function(row, className){\n        if (window.console)\n            console.warn && console.warn(\"deprecated use session.addGutterDecoration\");\n        this.session.addGutterDecoration(row, className);\n    };\n\n    this.removeGutterDecoration = function(row, className){\n        if (window.console)\n            console.warn && console.warn(\"deprecated use session.removeGutterDecoration\");\n        this.session.removeGutterDecoration(row, className);\n    };\n\n    this.setAnnotations = function(annotations) {\n        this.$annotations = [];\n        for (var i = 0; i < annotations.length; i++) {\n            var annotation = annotations[i];\n            var row = annotation.row;\n            var rowInfo = this.$annotations[row];\n            if (!rowInfo)\n                rowInfo = this.$annotations[row] = {text: []};\n           \n            var annoText = annotation.text;\n            annoText = annoText ? lang.escapeHTML(annoText) : annotation.html || \"\";\n\n            if (rowInfo.text.indexOf(annoText) === -1)\n                rowInfo.text.push(annoText);\n\n            var type = annotation.type;\n            if (type == \"error\")\n                rowInfo.className = \" ace_error\";\n            else if (type == \"warning\" && rowInfo.className != \" ace_error\")\n                rowInfo.className = \" ace_warning\";\n            else if (type == \"info\" && (!rowInfo.className))\n                rowInfo.className = \" ace_info\";\n        }\n    };\n\n    this.$updateAnnotations = function (e) {\n        if (!this.$annotations.length)\n            return;\n        var delta = e.data;\n        var range = delta.range;\n        var firstRow = range.start.row;\n        var len = range.end.row - firstRow;\n        if (len === 0) {\n        } else if (delta.action == \"removeText\" || delta.action == \"removeLines\") {\n            this.$annotations.splice(firstRow, len + 1, null);\n        } else {\n            var args = new Array(len + 1);\n            args.unshift(firstRow, 1);\n            this.$annotations.splice.apply(this.$annotations, args);\n        }\n    };\n\n    this.update = function(config) {\n        var firstRow = config.firstRow;\n        var lastRow = config.lastRow;\n        var session = this.session;\n        var fold = session.getNextFoldLine(firstRow);\n        var foldStart = fold ? fold.start.row : Infinity;\n        var foldWidgets = this.$showFoldWidgets && session.foldWidgets;\n        var breakpoints = session.$breakpoints;\n        var decorations = session.$decorations;\n        var firstLineNumber = session.$firstLineNumber;\n        var lastLineNumber = 0;\n        \n        var gutterRenderer = session.gutterRenderer;\n\n        var cell = null;\n        var index = -1;\n        var row = firstRow;\n        while (true) {\n            if (row > foldStart) {\n                row = fold.end.row + 1;\n                fold = session.getNextFoldLine(row, fold);\n                foldStart = fold ? fold.start.row : Infinity;\n            }\n            if (row > lastRow) {\n                while (this.$cells.length > index + 1) {\n                    cell = this.$cells.pop();\n                    this.element.removeChild(cell.element);\n                }\n                break;\n            }\n\n            cell = this.$cells[++index];\n            if (!cell) {\n                cell = {element: null, textNode: null, foldWidget: null};\n                cell.element = dom.createElement(\"div\");\n                cell.textNode = document.createTextNode('');\n                cell.element.appendChild(cell.textNode);\n                this.element.appendChild(cell.element);\n                this.$cells[index] = cell;\n            }\n\n            var className = \"ace_gutter-cell \";\n            if (breakpoints[row])\n                className += breakpoints[row];\n            if (decorations[row])\n                className += decorations[row];\n            if (this.$annotations[row])\n                className += this.$annotations[row].className;\n            if (cell.element.className != className)\n                cell.element.className = className;\n\n            var height = session.getRowLength(row) * config.lineHeight + \"px\";\n            if (height != cell.element.style.height)\n                cell.element.style.height = height;\n\n            if (foldWidgets) {\n                var c = foldWidgets[row];\n                if (c == null)\n                    c = foldWidgets[row] = session.getFoldWidget(row);\n            }\n\n            if (c) {\n                if (!cell.foldWidget) {\n                    cell.foldWidget = dom.createElement(\"span\");\n                    cell.element.appendChild(cell.foldWidget);\n                }\n                var className = \"ace_fold-widget ace_\" + c;\n                if (c == \"start\" && row == foldStart && row < fold.end.row)\n                    className += \" ace_closed\";\n                else\n                    className += \" ace_open\";\n                if (cell.foldWidget.className != className)\n                    cell.foldWidget.className = className;\n\n                var height = config.lineHeight + \"px\";\n                if (cell.foldWidget.style.height != height)\n                    cell.foldWidget.style.height = height;\n            } else {\n                if (cell.foldWidget) {\n                    cell.element.removeChild(cell.foldWidget);\n                    cell.foldWidget = null;\n                }\n            }\n            \n            var text = lastLineNumber = gutterRenderer\n                ? gutterRenderer.getText(session, row)\n                : row + firstLineNumber;\n            if (text != cell.textNode.data)\n                cell.textNode.data = text;\n\n            row++;\n        }\n\n        this.element.style.height = config.minHeight + \"px\";\n\n        if (this.$fixedWidth || session.$useWrapMode)\n            lastLineNumber = session.getLength();\n\n        var gutterWidth = gutterRenderer \n            ? gutterRenderer.getWidth(session, lastLineNumber, config)\n            : lastLineNumber.toString().length * config.characterWidth;\n        \n        var padding = this.$padding || this.$computePadding();\n        gutterWidth += padding.left + padding.right;\n        if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) {\n            this.gutterWidth = gutterWidth;\n            this.element.style.width = Math.ceil(this.gutterWidth) + \"px\";\n            this._emit(\"changeGutterWidth\", gutterWidth);\n        }\n    };\n\n    this.$fixedWidth = false;\n    \n    this.$showFoldWidgets = true;\n    this.setShowFoldWidgets = function(show) {\n        if (show)\n            dom.addCssClass(this.element, \"ace_folding-enabled\");\n        else\n            dom.removeCssClass(this.element, \"ace_folding-enabled\");\n\n        this.$showFoldWidgets = show;\n        this.$padding = null;\n    };\n    \n    this.getShowFoldWidgets = function() {\n        return this.$showFoldWidgets;\n    };\n\n    this.$computePadding = function() {\n        if (!this.element.firstChild)\n            return {left: 0, right: 0};\n        var style = dom.computedStyle(this.element.firstChild);\n        this.$padding = {};\n        this.$padding.left = parseInt(style.paddingLeft) + 1 || 0;\n        this.$padding.right = parseInt(style.paddingRight) || 0;\n        return this.$padding;\n    };\n\n    this.getRegion = function(point) {\n        var padding = this.$padding || this.$computePadding();\n        var rect = this.element.getBoundingClientRect();\n        if (point.x < padding.left + rect.left)\n            return \"markers\";\n        if (this.$showFoldWidgets && point.x > rect.right - padding.right)\n            return \"foldWidgets\";\n    };\n\n}).call(Gutter.prototype);\n\nexports.Gutter = Gutter;\n\n});\n\ndefine('ace/layer/marker', ['require', 'exports', 'module' , 'ace/range', 'ace/lib/dom'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\nvar dom = require(\"../lib/dom\");\n\nvar Marker = function(parentEl) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_layer ace_marker-layer\";\n    parentEl.appendChild(this.element);\n};\n\n(function() {\n\n    this.$padding = 0;\n\n    this.setPadding = function(padding) {\n        this.$padding = padding;\n    };\n    this.setSession = function(session) {\n        this.session = session;\n    };\n    \n    this.setMarkers = function(markers) {\n        this.markers = markers;\n    };\n\n    this.update = function(config) {\n        var config = config || this.config;\n        if (!config)\n            return;\n\n        this.config = config;\n\n\n        var html = [];\n        for (var key in this.markers) {\n            var marker = this.markers[key];\n\n            if (!marker.range) {\n                marker.update(html, this, this.session, config);\n                continue;\n            }\n\n            var range = marker.range.clipRows(config.firstRow, config.lastRow);\n            if (range.isEmpty()) continue;\n\n            range = range.toScreenRange(this.session);\n            if (marker.renderer) {\n                var top = this.$getTop(range.start.row, config);\n                var left = this.$padding + range.start.column * config.characterWidth;\n                marker.renderer(html, range, left, top, config);\n            } else if (marker.type == \"fullLine\") {\n                this.drawFullLineMarker(html, range, marker.clazz, config);\n            } else if (marker.type == \"screenLine\") {\n                this.drawScreenLineMarker(html, range, marker.clazz, config);\n            } else if (range.isMultiLine()) {\n                if (marker.type == \"text\")\n                    this.drawTextMarker(html, range, marker.clazz, config);\n                else\n                    this.drawMultiLineMarker(html, range, marker.clazz, config);\n            } else {\n                this.drawSingleLineMarker(html, range, marker.clazz + \" ace_start\", config);\n            }\n        }\n        this.element = dom.setInnerHtml(this.element, html.join(\"\"));\n    };\n\n    this.$getTop = function(row, layerConfig) {\n        return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight;\n    };\n    this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) {\n        var row = range.start.row;\n\n        var lineRange = new Range(\n            row, range.start.column,\n            row, this.session.getScreenLastRowColumn(row)\n        );\n        this.drawSingleLineMarker(stringBuilder, lineRange, clazz + \" ace_start\", layerConfig, 1, extraStyle);\n        row = range.end.row;\n        lineRange = new Range(row, 0, row, range.end.column);\n        this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 0, extraStyle);\n\n        for (row = range.start.row + 1; row < range.end.row; row++) {\n            lineRange.start.row = row;\n            lineRange.end.row = row;\n            lineRange.end.column = this.session.getScreenLastRowColumn(row);\n            this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 1, extraStyle);\n        }\n    };\n    this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n        var padding = this.$padding;\n        var height = config.lineHeight;\n        var top = this.$getTop(range.start.row, config);\n        var left = padding + range.start.column * config.characterWidth;\n        extraStyle = extraStyle || \"\";\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \" ace_start' style='\",\n            \"height:\", height, \"px;\",\n            \"right:0;\",\n            \"top:\", top, \"px;\",\n            \"left:\", left, \"px;\", extraStyle, \"'></div>\"\n        );\n        top = this.$getTop(range.end.row, config);\n        var width = range.end.column * config.characterWidth;\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \"' style='\",\n            \"height:\", height, \"px;\",\n            \"width:\", width, \"px;\",\n            \"top:\", top, \"px;\",\n            \"left:\", padding, \"px;\", extraStyle, \"'></div>\"\n        );\n        height = (range.end.row - range.start.row - 1) * config.lineHeight;\n        if (height < 0)\n            return;\n        top = this.$getTop(range.start.row + 1, config);\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \"' style='\",\n            \"height:\", height, \"px;\",\n            \"right:0;\",\n            \"top:\", top, \"px;\",\n            \"left:\", padding, \"px;\", extraStyle, \"'></div>\"\n        );\n    };\n    this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {\n        var height = config.lineHeight;\n        var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth;\n\n        var top = this.$getTop(range.start.row, config);\n        var left = this.$padding + range.start.column * config.characterWidth;\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \"' style='\",\n            \"height:\", height, \"px;\",\n            \"width:\", width, \"px;\",\n            \"top:\", top, \"px;\",\n            \"left:\", left, \"px;\", extraStyle || \"\", \"'></div>\"\n        );\n    };\n\n    this.drawFullLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n        var top = this.$getTop(range.start.row, config);\n        var height = config.lineHeight;\n        if (range.start.row != range.end.row)\n            height += this.$getTop(range.end.row, config) - top;\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \"' style='\",\n            \"height:\", height, \"px;\",\n            \"top:\", top, \"px;\",\n            \"left:0;right:0;\", extraStyle || \"\", \"'></div>\"\n        );\n    };\n    \n    this.drawScreenLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n        var top = this.$getTop(range.start.row, config);\n        var height = config.lineHeight;\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \"' style='\",\n            \"height:\", height, \"px;\",\n            \"top:\", top, \"px;\",\n            \"left:0;right:0;\", extraStyle || \"\", \"'></div>\"\n        );\n    };\n\n}).call(Marker.prototype);\n\nexports.Marker = Marker;\n\n});\n\ndefine('ace/layer/text', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/lang', 'ace/lib/useragent', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar dom = require(\"../lib/dom\");\nvar lang = require(\"../lib/lang\");\nvar useragent = require(\"../lib/useragent\");\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar Text = function(parentEl) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_layer ace_text-layer\";\n    parentEl.appendChild(this.element);\n\n    this.$characterSize = {width: 0, height: 0};\n    this.checkForSizeChanges();\n    this.$pollSizeChanges();\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n\n    this.EOF_CHAR = \"\\xB6\"; //\"&para;\";\n    this.EOL_CHAR = \"\\xAC\"; //\"&not;\";\n    this.TAB_CHAR = \"\\u2192\"; //\"&rarr;\" \"\\u21E5\";\n    this.SPACE_CHAR = \"\\xB7\"; //\"&middot;\";\n    this.$padding = 0;\n\n    this.setPadding = function(padding) {\n        this.$padding = padding;\n        this.element.style.padding = \"0 \" + padding + \"px\";\n    };\n\n    this.getLineHeight = function() {\n        return this.$characterSize.height || 0;\n    };\n\n    this.getCharacterWidth = function() {\n        return this.$characterSize.width || 0;\n    };\n\n    this.checkForSizeChanges = function() {\n        var size = this.$measureSizes();\n        if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) {\n            this.$measureNode.style.fontWeight = \"bold\";\n            var boldSize = this.$measureSizes();\n            this.$measureNode.style.fontWeight = \"\";\n            this.$characterSize = size;\n            this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height;\n            this._emit(\"changeCharacterSize\", {data: size});\n        }\n    };\n\n    this.$pollSizeChanges = function() {\n        var self = this;\n        this.$pollSizeChangesTimer = setInterval(function() {\n            self.checkForSizeChanges();\n        }, 500);\n    };\n\n    this.$fontStyles = {\n        fontFamily : 1,\n        fontSize : 1,\n        fontWeight : 1,\n        fontStyle : 1,\n        lineHeight : 1\n    };\n\n    this.$measureSizes = useragent.isIE || useragent.isOldGecko ? function() {\n        var n = 1000;\n        if (!this.$measureNode) {\n            var measureNode = this.$measureNode = dom.createElement(\"div\");\n            var style = measureNode.style;\n\n            style.width = style.height = \"auto\";\n            style.left = style.top = (-n * 40)  + \"px\";\n\n            style.visibility = \"hidden\";\n            style.position = \"fixed\";\n            style.overflow = \"visible\";\n            style.whiteSpace = \"nowrap\";\n            measureNode.innerHTML = lang.stringRepeat(\"Xy\", n);\n\n            if (this.element.ownerDocument.body) {\n                this.element.ownerDocument.body.appendChild(measureNode);\n            } else {\n                var container = this.element.parentNode;\n                while (!dom.hasCssClass(container, \"ace_editor\"))\n                    container = container.parentNode;\n                container.appendChild(measureNode);\n            }\n        }\n        if (!this.element.offsetWidth)\n            return null;\n\n        var style = this.$measureNode.style;\n        var computedStyle = dom.computedStyle(this.element);\n        for (var prop in this.$fontStyles)\n            style[prop] = computedStyle[prop];\n\n        var size = {\n            height: this.$measureNode.offsetHeight,\n            width: this.$measureNode.offsetWidth / (n * 2)\n        };\n        if (size.width == 0 || size.height == 0)\n            return null;\n\n        return size;\n    }\n    : function() {\n        if (!this.$measureNode) {\n            var measureNode = this.$measureNode = dom.createElement(\"div\");\n            var style = measureNode.style;\n\n            style.width = style.height = \"auto\";\n            style.left = style.top = -100 + \"px\";\n\n            style.visibility = \"hidden\";\n            style.position = \"fixed\";\n            style.overflow = \"visible\";\n            style.whiteSpace = \"nowrap\";\n            measureNode.innerHTML = lang.stringRepeat(\"X\", 100);\n\n            var container = this.element.parentNode;\n            while (container && !dom.hasCssClass(container, \"ace_editor\"))\n                container = container.parentNode;\n\n            if (!container)\n                return this.$measureNode = null;\n\n            container.appendChild(measureNode);\n        }\n\n        var rect = this.$measureNode.getBoundingClientRect();\n\n        var size = {\n            height: rect.height,\n            width: rect.width / 100\n        };\n        if (size.width == 0 || size.height == 0)\n            return null;\n\n        return size;\n    };\n\n    this.setSession = function(session) {\n        this.session = session;\n        this.$computeTabString();\n    };\n\n    this.showInvisibles = false;\n    this.setShowInvisibles = function(showInvisibles) {\n        if (this.showInvisibles == showInvisibles)\n            return false;\n\n        this.showInvisibles = showInvisibles;\n        this.$computeTabString();\n        return true;\n    };\n\n    this.displayIndentGuides = true;\n    this.setDisplayIndentGuides = function(display) {\n        if (this.displayIndentGuides == display)\n            return false;\n\n        this.displayIndentGuides = display;\n        this.$computeTabString();\n        return true;\n    };\n\n    this.$tabStrings = [];\n    this.onChangeTabSize =\n    this.$computeTabString = function() {\n        var tabSize = this.session.getTabSize();\n        this.tabSize = tabSize;\n        var tabStr = this.$tabStrings = [0];\n        for (var i = 1; i < tabSize + 1; i++) {\n            if (this.showInvisibles) {\n                tabStr.push(\"<span class='ace_invisible'>\"\n                    + this.TAB_CHAR\n                    + lang.stringRepeat(\"\\xa0\", i - 1)\n                    + \"</span>\");\n            } else {\n                tabStr.push(lang.stringRepeat(\"\\xa0\", i));\n            }\n        }\n        if (this.displayIndentGuides) {\n            this.$indentGuideRe =  /\\s\\S| \\t|\\t |\\s$/;\n            var className = \"ace_indent-guide\";\n            if (this.showInvisibles) {\n                className += \" ace_invisible\";\n                var spaceContent = lang.stringRepeat(this.SPACE_CHAR, this.tabSize);\n                var tabContent = this.TAB_CHAR + lang.stringRepeat(\"\\xa0\", this.tabSize - 1);\n            } else{\n                var spaceContent = lang.stringRepeat(\"\\xa0\", this.tabSize);\n                var tabContent = spaceContent;\n            }\n\n            this.$tabStrings[\" \"] = \"<span class='\" + className + \"'>\" + spaceContent + \"</span>\";\n            this.$tabStrings[\"\\t\"] = \"<span class='\" + className + \"'>\" + tabContent + \"</span>\";\n        }\n    };\n\n    this.updateLines = function(config, firstRow, lastRow) {\n        if (this.config.lastRow != config.lastRow ||\n            this.config.firstRow != config.firstRow) {\n            this.scrollLines(config);\n        }\n        this.config = config;\n\n        var first = Math.max(firstRow, config.firstRow);\n        var last = Math.min(lastRow, config.lastRow);\n\n        var lineElements = this.element.childNodes;\n        var lineElementsIdx = 0;\n\n        for (var row = config.firstRow; row < first; row++) {\n            var foldLine = this.session.getFoldLine(row);\n            if (foldLine) {\n                if (foldLine.containsRow(first)) {\n                    first = foldLine.start.row;\n                    break;\n                } else {\n                    row = foldLine.end.row;\n                }\n            }\n            lineElementsIdx ++;\n        }\n\n        var row = first;\n        var foldLine = this.session.getNextFoldLine(row);\n        var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n        while (true) {\n            if (row > foldStart) {\n                row = foldLine.end.row+1;\n                foldLine = this.session.getNextFoldLine(row, foldLine);\n                foldStart = foldLine ? foldLine.start.row :Infinity;\n            }\n            if (row > last)\n                break;\n\n            var lineElement = lineElements[lineElementsIdx++];\n            if (lineElement) {\n                var html = [];\n                this.$renderLine(\n                    html, row, !this.$useLineGroups(), row == foldStart ? foldLine : false\n                );\n                lineElement.style.height = config.lineHeight * this.session.getRowLength(row) + \"px\";\n                dom.setInnerHtml(lineElement, html.join(\"\"));\n            }\n            row++;\n        }\n    };\n\n    this.scrollLines = function(config) {\n        var oldConfig = this.config;\n        this.config = config;\n\n        if (!oldConfig || oldConfig.lastRow < config.firstRow)\n            return this.update(config);\n\n        if (config.lastRow < oldConfig.firstRow)\n            return this.update(config);\n\n        var el = this.element;\n        if (oldConfig.firstRow < config.firstRow)\n            for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--)\n                el.removeChild(el.firstChild);\n\n        if (oldConfig.lastRow > config.lastRow)\n            for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--)\n                el.removeChild(el.lastChild);\n\n        if (config.firstRow < oldConfig.firstRow) {\n            var fragment = this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1);\n            if (el.firstChild)\n                el.insertBefore(fragment, el.firstChild);\n            else\n                el.appendChild(fragment);\n        }\n\n        if (config.lastRow > oldConfig.lastRow) {\n            var fragment = this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow);\n            el.appendChild(fragment);\n        }\n    };\n\n    this.$renderLinesFragment = function(config, firstRow, lastRow) {\n        var fragment = this.element.ownerDocument.createDocumentFragment();\n        var row = firstRow;\n        var foldLine = this.session.getNextFoldLine(row);\n        var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n        while (true) {\n            if (row > foldStart) {\n                row = foldLine.end.row+1;\n                foldLine = this.session.getNextFoldLine(row, foldLine);\n                foldStart = foldLine ? foldLine.start.row : Infinity;\n            }\n            if (row > lastRow)\n                break;\n\n            var container = dom.createElement(\"div\");\n\n            var html = [];\n            this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\n            container.innerHTML = html.join(\"\");\n            if (this.$useLineGroups()) {\n                container.className = 'ace_line_group';\n                fragment.appendChild(container);\n                container.style.height = config.lineHeight * this.session.getRowLength(row) + \"px\";\n\n            } else {\n                var lines = container.childNodes\n                while(lines.length)\n                    fragment.appendChild(lines[0]);\n            }\n\n            row++;\n        }\n        return fragment;\n    };\n\n    this.update = function(config) {\n        this.config = config;\n\n        var html = [];\n        var firstRow = config.firstRow, lastRow = config.lastRow;\n\n        var row = firstRow;\n        var foldLine = this.session.getNextFoldLine(row);\n        var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n        while (true) {\n            if (row > foldStart) {\n                row = foldLine.end.row+1;\n                foldLine = this.session.getNextFoldLine(row, foldLine);\n                foldStart = foldLine ? foldLine.start.row :Infinity;\n            }\n            if (row > lastRow)\n                break;\n\n            if (this.$useLineGroups())\n                html.push(\"<div class='ace_line_group' style='height:\", config.lineHeight*this.session.getRowLength(row), \"px'>\")\n\n            this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\n\n            if (this.$useLineGroups())\n                html.push(\"</div>\"); // end the line group\n\n            row++;\n        }\n        this.element = dom.setInnerHtml(this.element, html.join(\"\"));\n    };\n\n    this.$textToken = {\n        \"text\": true,\n        \"rparen\": true,\n        \"lparen\": true\n    };\n\n    this.$renderToken = function(stringBuilder, screenColumn, token, value) {\n        var self = this;\n        var replaceReg = /\\t|&|<|( +)|([\\x00-\\x1f\\x80-\\xa0\\u1680\\u180E\\u2000-\\u200f\\u2028\\u2029\\u202F\\u205F\\u3000\\uFEFF])|[\\u1100-\\u115F\\u11A3-\\u11A7\\u11FA-\\u11FF\\u2329-\\u232A\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3000-\\u303E\\u3041-\\u3096\\u3099-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u3190-\\u31BA\\u31C0-\\u31E3\\u31F0-\\u321E\\u3220-\\u3247\\u3250-\\u32FE\\u3300-\\u4DBF\\u4E00-\\uA48C\\uA490-\\uA4C6\\uA960-\\uA97C\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFAFF\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE66\\uFE68-\\uFE6B\\uFF01-\\uFF60\\uFFE0-\\uFFE6]/g;\n        var replaceFunc = function(c, a, b, tabIdx, idx4) {\n            if (a) {\n                return self.showInvisibles ?\n                    \"<span class='ace_invisible'>\" + lang.stringRepeat(self.SPACE_CHAR, c.length) + \"</span>\" :\n                    lang.stringRepeat(\"\\xa0\", c.length);\n            } else if (c == \"&\") {\n                return \"&#38;\";\n            } else if (c == \"<\") {\n                return \"&#60;\";\n            } else if (c == \"\\t\") {\n                var tabSize = self.session.getScreenTabSize(screenColumn + tabIdx);\n                screenColumn += tabSize - 1;\n                return self.$tabStrings[tabSize];\n            } else if (c == \"\\u3000\") {\n                var classToUse = self.showInvisibles ? \"ace_cjk ace_invisible\" : \"ace_cjk\";\n                var space = self.showInvisibles ? self.SPACE_CHAR : \"\";\n                screenColumn += 1;\n                return \"<span class='\" + classToUse + \"' style='width:\" +\n                    (self.config.characterWidth * 2) +\n                    \"px'>\" + space + \"</span>\";\n            } else if (b) {\n                return \"<span class='ace_invisible ace_invalid'>\" + self.SPACE_CHAR + \"</span>\";\n            } else {\n                screenColumn += 1;\n                return \"<span class='ace_cjk' style='width:\" +\n                    (self.config.characterWidth * 2) +\n                    \"px'>\" + c + \"</span>\";\n            }\n        };\n\n        var output = value.replace(replaceReg, replaceFunc);\n\n        if (!this.$textToken[token.type]) {\n            var classes = \"ace_\" + token.type.replace(/\\./g, \" ace_\");\n            var style = \"\";\n            if (token.type == \"fold\")\n                style = \" style='width:\" + (token.value.length * this.config.characterWidth) + \"px;' \";\n            stringBuilder.push(\"<span class='\", classes, \"'\", style, \">\", output, \"</span>\");\n        }\n        else {\n            stringBuilder.push(output);\n        }\n        return screenColumn + value.length;\n    };\n\n    this.renderIndentGuide = function(stringBuilder, value, max) {\n        var cols = value.search(this.$indentGuideRe);\n        if (cols <= 0 || cols >= max)\n            return value;\n        if (value[0] == \" \") {\n            cols -= cols % this.tabSize;\n            stringBuilder.push(lang.stringRepeat(this.$tabStrings[\" \"], cols/this.tabSize));\n            return value.substr(cols);\n        } else if (value[0] == \"\\t\") {\n            stringBuilder.push(lang.stringRepeat(this.$tabStrings[\"\\t\"], cols));\n            return value.substr(cols);\n        }\n        return value;\n    };\n\n    this.$renderWrappedLine = function(stringBuilder, tokens, splits, onlyContents) {\n        var chars = 0;\n        var split = 0;\n        var splitChars = splits[0];\n        var screenColumn = 0;\n\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            var value = token.value;\n            if (i == 0 && this.displayIndentGuides) {\n                chars = value.length;\n                value = this.renderIndentGuide(stringBuilder, value, splitChars);\n                if (!value)\n                    continue;\n                chars -= value.length;\n            }\n\n            if (chars + value.length < splitChars) {\n                screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n                chars += value.length;\n            } else {\n                while (chars + value.length >= splitChars) {\n                    screenColumn = this.$renderToken(\n                        stringBuilder, screenColumn,\n                        token, value.substring(0, splitChars - chars)\n                    );\n                    value = value.substring(splitChars - chars);\n                    chars = splitChars;\n\n                    if (!onlyContents) {\n                        stringBuilder.push(\"</div>\",\n                            \"<div class='ace_line' style='height:\",\n                            this.config.lineHeight, \"px'>\"\n                        );\n                    }\n\n                    split ++;\n                    screenColumn = 0;\n                    splitChars = splits[split] || Number.MAX_VALUE;\n                }\n                if (value.length != 0) {\n                    chars += value.length;\n                    screenColumn = this.$renderToken(\n                        stringBuilder, screenColumn, token, value\n                    );\n                }\n            }\n        }\n    };\n\n    this.$renderSimpleLine = function(stringBuilder, tokens) {\n        var screenColumn = 0;\n        var token = tokens[0];\n        var value = token.value;\n        if (this.displayIndentGuides)\n            value = this.renderIndentGuide(stringBuilder, value);\n        if (value)\n            screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n        for (var i = 1; i < tokens.length; i++) {\n            token = tokens[i];\n            value = token.value;\n            screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n        }\n    };\n    this.$renderLine = function(stringBuilder, row, onlyContents, foldLine) {\n        if (!foldLine && foldLine !== false)\n            foldLine = this.session.getFoldLine(row);\n\n        if (foldLine)\n            var tokens = this.$getFoldLineTokens(row, foldLine);\n        else\n            var tokens = this.session.getTokens(row);\n\n\n        if (!onlyContents) {\n            stringBuilder.push(\n                \"<div class='ace_line' style='height:\", \n                    this.config.lineHeight * (\n                        this.$useLineGroups() ? 1 :this.session.getRowLength(row)\n                    ), \"px'>\"\n            );\n        }\n\n        if (tokens.length) {\n            var splits = this.session.getRowSplitData(row);\n            if (splits && splits.length)\n                this.$renderWrappedLine(stringBuilder, tokens, splits, onlyContents);\n            else\n                this.$renderSimpleLine(stringBuilder, tokens);\n        }\n\n        if (this.showInvisibles) {\n            if (foldLine)\n                row = foldLine.end.row\n\n            stringBuilder.push(\n                \"<span class='ace_invisible'>\",\n                row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR,\n                \"</span>\"\n            );\n        }\n        if (!onlyContents)\n            stringBuilder.push(\"</div>\");\n    };\n\n    this.$getFoldLineTokens = function(row, foldLine) {\n        var session = this.session;\n        var renderTokens = [];\n\n        function addTokens(tokens, from, to) {\n            var idx = 0, col = 0;\n            while ((col + tokens[idx].value.length) < from) {\n                col += tokens[idx].value.length;\n                idx++;\n\n                if (idx == tokens.length)\n                    return;\n            }\n            if (col != from) {\n                var value = tokens[idx].value.substring(from - col);\n                if (value.length > (to - from))\n                    value = value.substring(0, to - from);\n\n                renderTokens.push({\n                    type: tokens[idx].type,\n                    value: value\n                });\n\n                col = from + value.length;\n                idx += 1;\n            }\n\n            while (col < to && idx < tokens.length) {\n                var value = tokens[idx].value;\n                if (value.length + col > to) {\n                    renderTokens.push({\n                        type: tokens[idx].type,\n                        value: value.substring(0, to - col)\n                    });\n                } else\n                    renderTokens.push(tokens[idx]);\n                col += value.length;\n                idx += 1;\n            }\n        }\n\n        var tokens = session.getTokens(row);\n        foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) {\n            if (placeholder != null) {\n                renderTokens.push({\n                    type: \"fold\",\n                    value: placeholder\n                });\n            } else {\n                if (isNewRow)\n                    tokens = session.getTokens(row);\n\n                if (tokens.length)\n                    addTokens(tokens, lastColumn, column);\n            }\n        }, foldLine.end.row, this.session.getLine(foldLine.end.row).length);\n\n        return renderTokens;\n    };\n\n    this.$useLineGroups = function() {\n        return this.session.getUseWrapMode();\n    };\n\n    this.destroy = function() {\n        clearInterval(this.$pollSizeChangesTimer);\n        if (this.$measureNode)\n            this.$measureNode.parentNode.removeChild(this.$measureNode);\n        delete this.$measureNode;\n    };\n\n}).call(Text.prototype);\n\nexports.Text = Text;\n\n});\n\ndefine('ace/layer/cursor', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) {\n\n\nvar dom = require(\"../lib/dom\");\n\nvar Cursor = function(parentEl) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_layer ace_cursor-layer\";\n    parentEl.appendChild(this.element);\n\n    this.isVisible = false;\n    this.isBlinking = true;\n    this.blinkInterval = 1000;\n    this.smoothBlinking = false;\n\n    this.cursors = [];\n    this.cursor = this.addCursor();\n    dom.addCssClass(this.element, \"ace_hidden-cursors\");\n};\n\n(function() {\n\n    this.$padding = 0;\n    this.setPadding = function(padding) {\n        this.$padding = padding;\n    };\n\n    this.setSession = function(session) {\n        this.session = session;\n    };\n\n    this.setBlinking = function(blinking) {\n        if (blinking != this.isBlinking){\n            this.isBlinking = blinking;\n            this.restartTimer();\n        }\n    };\n\n    this.setBlinkInterval = function(blinkInterval) {\n        if (blinkInterval != this.blinkInterval){\n            this.blinkInterval = blinkInterval;\n            this.restartTimer();\n        }\n    };\n\n    this.setSmoothBlinking = function(smoothBlinking) {\n        if (smoothBlinking != this.smoothBlinking) {\n            this.smoothBlinking = smoothBlinking;\n            if (smoothBlinking)\n                dom.addCssClass(this.element, \"ace_smooth-blinking\");\n            else\n                dom.removeCssClass(this.element, \"ace_smooth-blinking\");\n            this.restartTimer();\n        }\n    };\n\n    this.addCursor = function() {\n        var el = dom.createElement(\"div\");\n        el.className = \"ace_cursor\";\n        this.element.appendChild(el);\n        this.cursors.push(el);\n        return el;\n    };\n\n    this.removeCursor = function() {\n        if (this.cursors.length > 1) {\n            var el = this.cursors.pop();\n            el.parentNode.removeChild(el);\n            return el;\n        }\n    };\n\n    this.hideCursor = function() {\n        this.isVisible = false;\n        dom.addCssClass(this.element, \"ace_hidden-cursors\");\n        this.restartTimer();\n    };\n\n    this.showCursor = function() {\n        this.isVisible = true;\n        dom.removeCssClass(this.element, \"ace_hidden-cursors\");\n        this.restartTimer();\n    };\n\n    this.restartTimer = function() {\n        clearInterval(this.intervalId);\n        clearTimeout(this.timeoutId);\n        if (this.smoothBlinking)\n            dom.removeCssClass(this.element, \"ace_smooth-blinking\");\n        for (var i = this.cursors.length; i--; )\n            this.cursors[i].style.opacity = \"\";\n\n        if (!this.isBlinking || !this.blinkInterval || !this.isVisible)\n            return;\n\n        if (this.smoothBlinking)\n            setTimeout(function(){\n                dom.addCssClass(this.element, \"ace_smooth-blinking\");\n            }.bind(this));\n\n        var blink = function(){\n            this.timeoutId = setTimeout(function() {\n                for (var i = this.cursors.length; i--; ) {\n                    this.cursors[i].style.opacity = 0;\n                }\n            }.bind(this), 0.6 * this.blinkInterval);\n        }.bind(this);\n\n        this.intervalId = setInterval(function() {\n            for (var i = this.cursors.length; i--; ) {\n                this.cursors[i].style.opacity = \"\";\n            }\n            blink();\n        }.bind(this), this.blinkInterval);\n\n        blink();\n    };\n\n    this.getPixelPosition = function(position, onScreen) {\n        if (!this.config || !this.session)\n            return {left : 0, top : 0};\n\n        if (!position)\n            position = this.session.selection.getCursor();\n        var pos = this.session.documentToScreenPosition(position);\n        var cursorLeft = this.$padding + pos.column * this.config.characterWidth;\n        var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) *\n            this.config.lineHeight;\n\n        return {left : cursorLeft, top : cursorTop};\n    };\n\n    this.update = function(config) {\n        this.config = config;\n\n        var selections = this.session.$selectionMarkers;\n        var i = 0, cursorIndex = 0;\n\n        if (selections === undefined || selections.length === 0){\n            selections = [{cursor: null}];\n        }\n\n        for (var i = 0, n = selections.length; i < n; i++) {\n            var pixelPos = this.getPixelPosition(selections[i].cursor, true);\n            if ((pixelPos.top > config.height + config.offset ||\n                 pixelPos.top < -config.offset) && i > 1) {\n                continue;\n            }\n\n            var style = (this.cursors[cursorIndex++] || this.addCursor()).style;\n\n            style.left = pixelPos.left + \"px\";\n            style.top = pixelPos.top + \"px\";\n            style.width = config.characterWidth + \"px\";\n            style.height = config.lineHeight + \"px\";\n        }\n        while (this.cursors.length > cursorIndex)\n            this.removeCursor();\n\n        var overwrite = this.session.getOverwrite();\n        this.$setOverwrite(overwrite);\n        this.$pixelPos = pixelPos;\n        this.restartTimer();\n    };\n\n    this.$setOverwrite = function(overwrite) {\n        if (overwrite != this.overwrite) {\n            this.overwrite = overwrite;\n            if (overwrite)\n                dom.addCssClass(this.element, \"ace_overwrite-cursors\");\n            else\n                dom.removeCssClass(this.element, \"ace_overwrite-cursors\");\n        }\n    };\n\n    this.destroy = function() {\n        clearInterval(this.intervalId);\n        clearTimeout(this.timeoutId);\n    };\n\n}).call(Cursor.prototype);\n\nexports.Cursor = Cursor;\n\n});\n\ndefine('ace/scrollbar', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/dom', 'ace/lib/event', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nvar event = require(\"./lib/event\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar ScrollBarV = function(parent, renderer) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_scrollbar\";\n\n    this.inner = dom.createElement(\"div\");\n    this.inner.className = \"ace_scrollbar-inner\";\n    this.element.appendChild(this.inner);\n\n    parent.appendChild(this.element);\n    renderer.$scrollbarWidth = \n    this.width = dom.scrollbarWidth(parent.ownerDocument);\n    renderer.$scrollbarWidth = \n    this.width = dom.scrollbarWidth(parent.ownerDocument);\n    this.fullWidth = this.width;\n    this.inner.style.width =\n    this.element.style.width = (this.width || 15) + 5 + \"px\";\n    this.setVisible(false);\n    this.element.style.overflowY = \"scroll\";\n    \n    event.addListener(this.element, \"scroll\", this.onScrollV.bind(this));\n    event.addListener(this.element, \"mousedown\", event.preventDefault);\n};\n\nvar ScrollBarH = function(parent, renderer) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_scrollbar-h\";\n\n    this.inner = dom.createElement(\"div\");\n    this.inner.className = \"ace_scrollbar-inner\";\n    this.element.appendChild(this.inner);\n\n    parent.appendChild(this.element);\n    this.height = renderer.$scrollbarWidth;\n    this.fullHeight = this.height;\n    this.inner.style.height =\n    this.element.style.height = (this.height || 15) + 5 + \"px\";\n    this.setVisible(false);\n    this.element.style.overflowX = \"scroll\";\n\n    event.addListener(this.element, \"scroll\", this.onScrollH.bind(this));\n    event.addListener(this.element, \"mousedown\", event.preventDefault);\n};\n\n(function() {\n    oop.implement(this, EventEmitter);\n\n    this.setVisible = function(show) {\n        if (show) {\n            this.element.style.display = \"\";\n            if (this.fullWidth)\n                this.width = this.fullWidth;\n            if (this.fullHeight)\n                this.height = this.fullHeight;\n        } else {\n            this.element.style.display = \"none\";\n            this.height = this.width = 0;\n        }\n    };\n    this.onScrollV = function() {\n        if (!this.skipEvent) {\n            this.scrollTop = this.element.scrollTop;\n            this._emit(\"scroll\", {data: this.scrollTop});\n        }\n        this.skipEvent = false;\n    };\n    this.onScrollH = function() {\n        if (!this.skipEvent) {\n            this.scrollLeft = this.element.scrollLeft;\n            this._emit(\"scroll\", {data: this.scrollLeft});\n        }\n        this.skipEvent = false;\n    };\n    this.getWidth = function() {\n        return this.width;\n    };\n\n    this.getHeight = function() {\n        return this.height;\n    };\n    this.setHeight = function(height) {\n        this.element.style.height = height + \"px\";\n    };\n    \n    this.setWidth = function(width) {\n        this.element.style.width = width + \"px\";\n    };\n    this.setInnerHeight = function(height) {\n        this.inner.style.height = height + \"px\";\n    };\n    \n    this.setInnerWidth = function(width) {\n        this.inner.style.width = width + \"px\";\n    };\n    this.setScrollTop = function(scrollTop) {\n        if (this.scrollTop != scrollTop) {\n            this.skipEvent = true;\n            this.scrollTop = this.element.scrollTop = scrollTop;\n        }\n    };\n    this.setScrollLeft = function(scrollLeft) {\n        if (this.scrollLeft != scrollLeft) {\n            this.skipEvent = true;\n            this.scrollLeft = this.element.scrollLeft = scrollLeft;\n        }\n    };\n\n}).call(ScrollBarV.prototype);\nScrollBarH.prototype = ScrollBarV.prototype;\n\n\n\nexports.ScrollBar = ScrollBarV; // backward compatibility\nexports.ScrollBarV = ScrollBarV;\nexports.ScrollBarH = ScrollBarH;\n});\n\ndefine('ace/renderloop', ['require', 'exports', 'module' , 'ace/lib/event'], function(require, exports, module) {\n\n\nvar event = require(\"./lib/event\");\n\n\nvar RenderLoop = function(onRender, win) {\n    this.onRender = onRender;\n    this.pending = false;\n    this.changes = 0;\n    this.window = win || window;\n};\n\n(function() {\n\n\n    this.schedule = function(change) {\n        this.changes = this.changes | change;\n        if (!this.pending) {\n            this.pending = true;\n            var _self = this;\n            event.nextFrame(function() {\n                _self.pending = false;\n                var changes;\n                while (changes = _self.changes) {\n                    _self.changes = 0;\n                    _self.onRender(changes);\n                }\n            }, this.window);\n        }\n    };\n\n}).call(RenderLoop.prototype);\n\nexports.RenderLoop = RenderLoop;\n});\n\ndefine('ace/multi_select', ['require', 'exports', 'module' , 'ace/range_list', 'ace/range', 'ace/selection', 'ace/mouse/multi_select_handler', 'ace/lib/event', 'ace/lib/lang', 'ace/commands/multi_select_commands', 'ace/search', 'ace/edit_session', 'ace/editor', 'ace/config'], function(require, exports, module) {\n\nvar RangeList = require(\"./range_list\").RangeList;\nvar Range = require(\"./range\").Range;\nvar Selection = require(\"./selection\").Selection;\nvar onMouseDown = require(\"./mouse/multi_select_handler\").onMouseDown;\nvar event = require(\"./lib/event\");\nvar lang = require(\"./lib/lang\");\nvar commands = require(\"./commands/multi_select_commands\");\nexports.commands = commands.defaultCommands.concat(commands.multiSelectCommands);\nvar Search = require(\"./search\").Search;\nvar search = new Search();\n\nfunction find(session, needle, dir) {\n    search.$options.wrap = true;\n    search.$options.needle = needle;\n    search.$options.backwards = dir == -1;\n    return search.find(session);\n}\nvar EditSession = require(\"./edit_session\").EditSession;\n(function() {\n    this.getSelectionMarkers = function() {\n        return this.$selectionMarkers;\n    };\n}).call(EditSession.prototype);\n(function() {\n    this.ranges = null;\n    this.rangeList = null;\n    this.addRange = function(range, $blockChangeEvents) {\n        if (!range)\n            return;\n\n        if (!this.inMultiSelectMode && this.rangeCount == 0) {\n            var oldRange = this.toOrientedRange();\n            this.rangeList.add(oldRange);\n            this.rangeList.add(range);\n            if (this.rangeList.ranges.length != 2) {\n                this.rangeList.removeAll();\n                return $blockChangeEvents || this.fromOrientedRange(range);\n            }\n            this.rangeList.removeAll();\n            this.rangeList.add(oldRange);\n            this.$onAddRange(oldRange);\n        }\n\n        if (!range.cursor)\n            range.cursor = range.end;\n\n        var removed = this.rangeList.add(range);\n\n        this.$onAddRange(range);\n\n        if (removed.length)\n            this.$onRemoveRange(removed);\n\n        if (this.rangeCount > 1 && !this.inMultiSelectMode) {\n            this._emit(\"multiSelect\");\n            this.inMultiSelectMode = true;\n            this.session.$undoSelect = false;\n            this.rangeList.attach(this.session);\n        }\n\n        return $blockChangeEvents || this.fromOrientedRange(range);\n    };\n\n    this.toSingleRange = function(range) {\n        range = range || this.ranges[0];\n        var removed = this.rangeList.removeAll();\n        if (removed.length)\n            this.$onRemoveRange(removed);\n\n        range && this.fromOrientedRange(range);\n    };\n    this.substractPoint = function(pos) {\n        var removed = this.rangeList.substractPoint(pos);\n        if (removed) {\n            this.$onRemoveRange(removed);\n            return removed[0];\n        }\n    };\n    this.mergeOverlappingRanges = function() {\n        var removed = this.rangeList.merge();\n        if (removed.length)\n            this.$onRemoveRange(removed);\n        else if(this.ranges[0])\n            this.fromOrientedRange(this.ranges[0]);\n    };\n\n    this.$onAddRange = function(range) {\n        this.rangeCount = this.rangeList.ranges.length;\n        this.ranges.unshift(range);\n        this._emit(\"addRange\", {range: range});\n    };\n\n    this.$onRemoveRange = function(removed) {\n        this.rangeCount = this.rangeList.ranges.length;\n        if (this.rangeCount == 1 && this.inMultiSelectMode) {\n            var lastRange = this.rangeList.ranges.pop();\n            removed.push(lastRange);\n            this.rangeCount = 0;\n        }\n\n        for (var i = removed.length; i--; ) {\n            var index = this.ranges.indexOf(removed[i]);\n            this.ranges.splice(index, 1);\n        }\n\n        this._emit(\"removeRange\", {ranges: removed});\n\n        if (this.rangeCount == 0 && this.inMultiSelectMode) {\n            this.inMultiSelectMode = false;\n            this._emit(\"singleSelect\");\n            this.session.$undoSelect = true;\n            this.rangeList.detach(this.session);\n        }\n\n        lastRange = lastRange || this.ranges[0];\n        if (lastRange && !lastRange.isEqual(this.getRange()))\n            this.fromOrientedRange(lastRange);\n    };\n    this.$initRangeList = function() {\n        if (this.rangeList)\n            return;\n\n        this.rangeList = new RangeList();\n        this.ranges = [];\n        this.rangeCount = 0;\n    };\n    this.getAllRanges = function() {\n        return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()];\n    };\n\n    this.splitIntoLines = function () {\n        if (this.rangeCount > 1) {\n            var ranges = this.rangeList.ranges;\n            var lastRange = ranges[ranges.length - 1];\n            var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n            this.toSingleRange();\n            this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n        } else {\n            var range = this.getRange();\n            var isBackwards = this.isBackwards();\n            var startRow = range.start.row;\n            var endRow = range.end.row;\n            if (startRow == endRow) {\n                if (isBackwards)\n                    var start = range.end, end = range.start;\n                else\n                    var start = range.start, end = range.end;\n                \n                this.addRange(Range.fromPoints(end, end));\n                this.addRange(Range.fromPoints(start, start));\n                return;\n            }\n\n            var rectSel = [];\n            var r = this.getLineRange(startRow, true);\n            r.start.column = range.start.column;\n            rectSel.push(r);\n\n            for (var i = startRow + 1; i < endRow; i++)\n                rectSel.push(this.getLineRange(i, true));\n\n            r = this.getLineRange(endRow, true);\n            r.end.column = range.end.column;\n            rectSel.push(r);\n\n            rectSel.forEach(this.addRange, this);\n        }\n    };\n    this.toggleBlockSelection = function () {\n        if (this.rangeCount > 1) {\n            var ranges = this.rangeList.ranges;\n            var lastRange = ranges[ranges.length - 1];\n            var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n            this.toSingleRange();\n            this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n        } else {\n            var cursor = this.session.documentToScreenPosition(this.selectionLead);\n            var anchor = this.session.documentToScreenPosition(this.selectionAnchor);\n\n            var rectSel = this.rectangularRangeBlock(cursor, anchor);\n            rectSel.forEach(this.addRange, this);\n        }\n    };\n    this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) {\n        var rectSel = [];\n\n        var xBackwards = screenCursor.column < screenAnchor.column;\n        if (xBackwards) {\n            var startColumn = screenCursor.column;\n            var endColumn = screenAnchor.column;\n        } else {\n            var startColumn = screenAnchor.column;\n            var endColumn = screenCursor.column;\n        }\n\n        var yBackwards = screenCursor.row < screenAnchor.row;\n        if (yBackwards) {\n            var startRow = screenCursor.row;\n            var endRow = screenAnchor.row;\n        } else {\n            var startRow = screenAnchor.row;\n            var endRow = screenCursor.row;\n        }\n\n        if (startColumn < 0)\n            startColumn = 0;\n        if (startRow < 0)\n            startRow = 0;\n\n        if (startRow == endRow)\n            includeEmptyLines = true;\n\n        for (var row = startRow; row <= endRow; row++) {\n            var range = Range.fromPoints(\n                this.session.screenToDocumentPosition(row, startColumn),\n                this.session.screenToDocumentPosition(row, endColumn)\n            );\n            if (range.isEmpty()) {\n                if (docEnd && isSamePoint(range.end, docEnd))\n                    break;\n                var docEnd = range.end;\n            }\n            range.cursor = xBackwards ? range.start : range.end;\n            rectSel.push(range);\n        }\n\n        if (yBackwards)\n            rectSel.reverse();\n\n        if (!includeEmptyLines) {\n            var end = rectSel.length - 1;\n            while (rectSel[end].isEmpty() && end > 0)\n                end--;\n            if (end > 0) {\n                var start = 0;\n                while (rectSel[start].isEmpty())\n                    start++;\n            }\n            for (var i = end; i >= start; i--) {\n                if (rectSel[i].isEmpty())\n                    rectSel.splice(i, 1);\n            }\n        }\n\n        return rectSel;\n    };\n}).call(Selection.prototype);\nvar Editor = require(\"./editor\").Editor;\n(function() {\n    this.updateSelectionMarkers = function() {\n        this.renderer.updateCursor();\n        this.renderer.updateBackMarkers();\n    };\n    this.addSelectionMarker = function(orientedRange) {\n        if (!orientedRange.cursor)\n            orientedRange.cursor = orientedRange.end;\n\n        var style = this.getSelectionStyle();\n        orientedRange.marker = this.session.addMarker(orientedRange, \"ace_selection\", style);\n\n        this.session.$selectionMarkers.push(orientedRange);\n        this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n        return orientedRange;\n    };\n    this.removeSelectionMarker = function(range) {\n        if (!range.marker)\n            return;\n        this.session.removeMarker(range.marker);\n        var index = this.session.$selectionMarkers.indexOf(range);\n        if (index != -1)\n            this.session.$selectionMarkers.splice(index, 1);\n        this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n    };\n\n    this.removeSelectionMarkers = function(ranges) {\n        var markerList = this.session.$selectionMarkers;\n        for (var i = ranges.length; i--; ) {\n            var range = ranges[i];\n            if (!range.marker)\n                continue;\n            this.session.removeMarker(range.marker);\n            var index = markerList.indexOf(range);\n            if (index != -1)\n                markerList.splice(index, 1);\n        }\n        this.session.selectionMarkerCount = markerList.length;\n    };\n\n    this.$onAddRange = function(e) {\n        this.addSelectionMarker(e.range);\n        this.renderer.updateCursor();\n        this.renderer.updateBackMarkers();\n    };\n\n    this.$onRemoveRange = function(e) {\n        this.removeSelectionMarkers(e.ranges);\n        this.renderer.updateCursor();\n        this.renderer.updateBackMarkers();\n    };\n\n    this.$onMultiSelect = function(e) {\n        if (this.inMultiSelectMode)\n            return;\n        this.inMultiSelectMode = true;\n\n        this.setStyle(\"ace_multiselect\");\n        this.keyBinding.addKeyboardHandler(commands.keyboardHandler);\n        this.commands.setDefaultHandler(\"exec\", this.$onMultiSelectExec);\n\n        this.renderer.updateCursor();\n        this.renderer.updateBackMarkers();\n    };\n\n    this.$onSingleSelect = function(e) {\n        if (this.session.multiSelect.inVirtualMode)\n            return;\n        this.inMultiSelectMode = false;\n\n        this.unsetStyle(\"ace_multiselect\");\n        this.keyBinding.removeKeyboardHandler(commands.keyboardHandler);\n\n        this.commands.removeDefaultHandler(\"exec\", this.$onMultiSelectExec);\n        this.renderer.updateCursor();\n        this.renderer.updateBackMarkers();\n    };\n\n    this.$onMultiSelectExec = function(e) {\n        var command = e.command;\n        var editor = e.editor;\n        if (!editor.multiSelect)\n            return;\n        if (!command.multiSelectAction) {\n            var result = command.exec(editor, e.args || {});\n            editor.multiSelect.addRange(editor.multiSelect.toOrientedRange());\n            editor.multiSelect.mergeOverlappingRanges();\n        } else if (command.multiSelectAction == \"forEach\") {\n            result = editor.forEachSelection(command, e.args);\n        } else if (command.multiSelectAction == \"forEachLine\") {\n            result = editor.forEachSelection(command, e.args, true);\n        } else if (command.multiSelectAction == \"single\") {\n            editor.exitMultiSelectMode();\n            result = command.exec(editor, e.args || {});\n        } else {\n            result = command.multiSelectAction(editor, e.args || {});\n        }\n        return result;\n    }; \n    this.forEachSelection = function(cmd, args, $byLines) {\n        if (this.inVirtualSelectionMode)\n            return;\n\n        var session = this.session;\n        var selection = this.selection;\n        var rangeList = selection.rangeList;\n        var result;\n        \n        var reg = selection._eventRegistry;\n        selection._eventRegistry = {};\n\n        var tmpSel = new Selection(session);\n        this.inVirtualSelectionMode = true;\n        for (var i = rangeList.ranges.length; i--;) {\n            if ($byLines) {\n                while (i > 0 && rangeList.ranges[i].start.row == rangeList.ranges[i - 1].end.row)\n                    i--;\n            }\n            tmpSel.fromOrientedRange(rangeList.ranges[i]);\n            this.selection = session.selection = tmpSel;\n            var cmdResult = cmd.exec(this, args || {});\n            if (!result == undefined)\n                result = cmdResult;\n            tmpSel.toOrientedRange(rangeList.ranges[i]);\n        }\n        tmpSel.detach();\n\n        this.selection = session.selection = selection;\n        this.inVirtualSelectionMode = false;\n        selection._eventRegistry = reg;\n        selection.mergeOverlappingRanges();\n        \n        var anim = this.renderer.$scrollAnimation;\n        this.onCursorChange();\n        this.onSelectionChange();\n        if (anim && anim.from == anim.to)\n            this.renderer.animateScrolling(anim.from);\n        \n        return result;\n    };\n    this.exitMultiSelectMode = function() {\n        if (!this.inMultiSelectMode || this.inVirtualSelectionMode)\n            return;\n        this.multiSelect.toSingleRange();\n    };\n\n    this.getSelectedText = function() {\n        var text = \"\";\n        if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n            var ranges = this.multiSelect.rangeList.ranges;\n            var buf = [];\n            for (var i = 0; i < ranges.length; i++) {\n                buf.push(this.session.getTextRange(ranges[i]));\n            }\n            var nl = this.session.getDocument().getNewLineCharacter();\n            text = buf.join(nl);\n            if (text.length == (buf.length - 1) * nl.length)\n                text = \"\";\n        } else if (!this.selection.isEmpty()) {\n            text = this.session.getTextRange(this.getSelectionRange());\n        }\n        return text;\n    };\n    this.onPaste = function(text) {\n        if (this.$readOnly)\n            return;\n\n        this._signal(\"paste\", text);\n        if (!this.inMultiSelectMode || this.inVirtualSelectionMode)\n            return this.insert(text);\n\n        var lines = text.split(/\\r\\n|\\r|\\n/);\n        var ranges = this.selection.rangeList.ranges;\n\n        if (lines.length > ranges.length || lines.length < 2 || !lines[1])\n            return this.commands.exec(\"insertstring\", this, text);\n\n        for (var i = ranges.length; i--;) {\n            var range = ranges[i];\n            if (!range.isEmpty())\n                this.session.remove(range);\n\n            this.session.insert(range.start, lines[i]);\n        }\n    };\n    this.findAll = function(needle, options, additive) {\n        options = options || {};\n        options.needle = needle || options.needle;\n        this.$search.set(options);\n\n        var ranges = this.$search.findAll(this.session);\n        if (!ranges.length)\n            return 0;\n\n        this.$blockScrolling += 1;\n        var selection = this.multiSelect;\n\n        if (!additive)\n            selection.toSingleRange(ranges[0]);\n\n        for (var i = ranges.length; i--; )\n            selection.addRange(ranges[i], true);\n\n        this.$blockScrolling -= 1;\n\n        return ranges.length;\n    };\n    this.selectMoreLines = function(dir, skip) {\n        var range = this.selection.toOrientedRange();\n        var isBackwards = range.cursor == range.end;\n\n        var screenLead = this.session.documentToScreenPosition(range.cursor);\n        if (this.selection.$desiredColumn)\n            screenLead.column = this.selection.$desiredColumn;\n\n        var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column);\n\n        if (!range.isEmpty()) {\n            var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start);\n            var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column);\n        } else {\n            var anchor = lead;\n        }\n\n        if (isBackwards) {\n            var newRange = Range.fromPoints(lead, anchor);\n            newRange.cursor = newRange.start;\n        } else {\n            var newRange = Range.fromPoints(anchor, lead);\n            newRange.cursor = newRange.end;\n        }\n\n        newRange.desiredColumn = screenLead.column;\n        if (!this.selection.inMultiSelectMode) {\n            this.selection.addRange(range);\n        } else {\n            if (skip)\n                var toRemove = range.cursor;\n        }\n\n        this.selection.addRange(newRange);\n        if (toRemove)\n            this.selection.substractPoint(toRemove);\n    };\n    this.transposeSelections = function(dir) {\n        var session = this.session;\n        var sel = session.multiSelect;\n        var all = sel.ranges;\n\n        for (var i = all.length; i--; ) {\n            var range = all[i];\n            if (range.isEmpty()) {\n                var tmp = session.getWordRange(range.start.row, range.start.column);\n                range.start.row = tmp.start.row;\n                range.start.column = tmp.start.column;\n                range.end.row = tmp.end.row;\n                range.end.column = tmp.end.column;\n            }\n        }\n        sel.mergeOverlappingRanges();\n\n        var words = [];\n        for (var i = all.length; i--; ) {\n            var range = all[i];\n            words.unshift(session.getTextRange(range));\n        }\n\n        if (dir < 0)\n            words.unshift(words.pop());\n        else\n            words.push(words.shift());\n\n        for (var i = all.length; i--; ) {\n            var range = all[i];\n            var tmp = range.clone();\n            session.replace(range, words[i]);\n            range.start.row = tmp.start.row;\n            range.start.column = tmp.start.column;\n        }\n    };\n    this.selectMore = function(dir, skip) {\n        var session = this.session;\n        var sel = session.multiSelect;\n\n        var range = sel.toOrientedRange();\n        if (range.isEmpty()) {\n            range = session.getWordRange(range.start.row, range.start.column);\n            range.cursor = dir == -1 ? range.start : range.end;\n            this.multiSelect.addRange(range);\n            return;\n        }\n        var needle = session.getTextRange(range);\n\n        var newRange = find(session, needle, dir);\n        if (newRange) {\n            newRange.cursor = dir == -1 ? newRange.start : newRange.end;\n            this.$blockScrolling += 1;\n            this.session.unfold(newRange);\n            this.multiSelect.addRange(newRange);\n            this.$blockScrolling -= 1;\n            this.renderer.scrollCursorIntoView(null, 0.5);\n        }\n        if (skip)\n            this.multiSelect.substractPoint(range.cursor);\n    };\n    this.alignCursors = function() {\n        var session = this.session;\n        var sel = session.multiSelect;\n        var ranges = sel.ranges;\n\n        if (!ranges.length) {\n            var range = this.selection.getRange();\n            var fr = range.start.row, lr = range.end.row;\n            var guessRange = fr == lr;\n            if (guessRange) {\n                var max = this.session.getLength();\n                var line;\n                do {\n                    line = this.session.getLine(lr);\n                } while (/[=:]/.test(line) && ++lr < max);\n                do {\n                    line = this.session.getLine(fr);\n                } while (/[=:]/.test(line) && --fr > 0);\n                \n                if (fr < 0) fr = 0;\n                if (lr >= max) lr = max - 1;\n            }\n            var lines = this.session.doc.removeLines(fr, lr);\n            lines = this.$reAlignText(lines, guessRange);\n            this.session.doc.insert({row: fr, column: 0}, lines.join(\"\\n\") + \"\\n\");\n            if (!guessRange) {\n                range.start.column = 0;\n                range.end.column = lines[lines.length - 1].length;\n            }\n            this.selection.setRange(range);\n        } else {\n            var row = -1;\n            var sameRowRanges = ranges.filter(function(r) {\n                if (r.cursor.row == row)\n                    return true;\n                row = r.cursor.row;\n            });\n            sel.$onRemoveRange(sameRowRanges);\n\n            var maxCol = 0;\n            var minSpace = Infinity;\n            var spaceOffsets = ranges.map(function(r) {\n                var p = r.cursor;\n                var line = session.getLine(p.row);\n                var spaceOffset = line.substr(p.column).search(/\\S/g);\n                if (spaceOffset == -1)\n                    spaceOffset = 0;\n\n                if (p.column > maxCol)\n                    maxCol = p.column;\n                if (spaceOffset < minSpace)\n                    minSpace = spaceOffset;\n                return spaceOffset;\n            });\n            ranges.forEach(function(r, i) {\n                var p = r.cursor;\n                var l = maxCol - p.column;\n                var d = spaceOffsets[i] - minSpace;\n                if (l > d)\n                    session.insert(p, lang.stringRepeat(\" \", l - d));\n                else\n                    session.remove(new Range(p.row, p.column, p.row, p.column - l + d));\n\n                r.start.column = r.end.column = maxCol;\n                r.start.row = r.end.row = p.row;\n                r.cursor = r.end;\n            });\n            sel.fromOrientedRange(ranges[0]);\n            this.renderer.updateCursor();\n            this.renderer.updateBackMarkers();\n        }\n    };\n\n    this.$reAlignText = function(lines, forceLeft) {\n        var isLeftAligned = true, isRightAligned = true;\n        var startW, textW, endW;\n\n        return lines.map(function(line) {\n            var m = line.match(/(\\s*)(.*?)(\\s*)([=:].*)/);\n            if (!m)\n                return [line];\n\n            if (startW == null) {\n                startW = m[1].length;\n                textW = m[2].length;\n                endW = m[3].length;\n                return m;\n            }\n\n            if (startW + textW + endW != m[1].length + m[2].length + m[3].length)\n                isRightAligned = false;\n            if (startW != m[1].length)\n                isLeftAligned = false;\n\n            if (startW > m[1].length)\n                startW = m[1].length;\n            if (textW < m[2].length)\n                textW = m[2].length;\n            if (endW > m[3].length)\n                endW = m[3].length;\n\n            return m;\n        }).map(forceLeft ? alignLeft :\n            isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign);\n\n        function spaces(n) {\n            return lang.stringRepeat(\" \", n);\n        }\n\n        function alignLeft(m) {\n            return !m[2] ? m[0] : spaces(startW) + m[2]\n                + spaces(textW - m[2].length + endW)\n                + m[4].replace(/^([=:])\\s+/, \"$1 \")\n        }\n        function alignRight(m) {\n            return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2]\n                + spaces(endW, \" \")\n                + m[4].replace(/^([=:])\\s+/, \"$1 \")\n        }\n        function unAlign(m) {\n            return !m[2] ? m[0] : spaces(startW) + m[2]\n                + spaces(endW)\n                + m[4].replace(/^([=:])\\s+/, \"$1 \")\n        }\n    }\n}).call(Editor.prototype);\n\n\nfunction isSamePoint(p1, p2) {\n    return p1.row == p2.row && p1.column == p2.column;\n}\nexports.onSessionChange = function(e) {\n    var session = e.session;\n    if (!session.multiSelect) {\n        session.$selectionMarkers = [];\n        session.selection.$initRangeList();\n        session.multiSelect = session.selection;\n    }\n    this.multiSelect = session.multiSelect;\n\n    var oldSession = e.oldSession;\n    if (oldSession) {\n        oldSession.multiSelect.removeEventListener(\"addRange\", this.$onAddRange);\n        oldSession.multiSelect.removeEventListener(\"removeRange\", this.$onRemoveRange);\n        oldSession.multiSelect.removeEventListener(\"multiSelect\", this.$onMultiSelect);\n        oldSession.multiSelect.removeEventListener(\"singleSelect\", this.$onSingleSelect);\n    }\n\n    session.multiSelect.on(\"addRange\", this.$onAddRange);\n    session.multiSelect.on(\"removeRange\", this.$onRemoveRange);\n    session.multiSelect.on(\"multiSelect\", this.$onMultiSelect);\n    session.multiSelect.on(\"singleSelect\", this.$onSingleSelect);\n\n    if (this.inMultiSelectMode != session.selection.inMultiSelectMode) {\n        if (session.selection.inMultiSelectMode)\n            this.$onMultiSelect();\n        else\n            this.$onSingleSelect();\n    }\n};\nfunction MultiSelect(editor) {\n    if (editor.$multiselectOnSessionChange)\n        return;\n    editor.$onAddRange = editor.$onAddRange.bind(editor);\n    editor.$onRemoveRange = editor.$onRemoveRange.bind(editor);\n    editor.$onMultiSelect = editor.$onMultiSelect.bind(editor);\n    editor.$onSingleSelect = editor.$onSingleSelect.bind(editor);\n    editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor);\n\n    editor.$multiselectOnSessionChange(editor);\n    editor.on(\"changeSession\", editor.$multiselectOnSessionChange);\n\n    editor.on(\"mousedown\", onMouseDown);\n    editor.commands.addCommands(commands.defaultCommands);\n\n    addAltCursorListeners(editor);\n}\n\nfunction addAltCursorListeners(editor){\n    var el = editor.textInput.getElement();\n    var altCursor = false;\n    event.addListener(el, \"keydown\", function(e) {\n        if (e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey)) {\n            if (!altCursor) {\n                editor.renderer.setMouseCursor(\"crosshair\");\n                altCursor = true;\n            }\n        } else if (altCursor) {\n            reset();\n        }\n    });\n\n    event.addListener(el, \"keyup\", reset);\n    event.addListener(el, \"blur\", reset);\n    function reset(e) {\n        if (altCursor) {\n            editor.renderer.setMouseCursor(\"\");\n            altCursor = false;\n        }\n    }\n}\n\nexports.MultiSelect = MultiSelect;\n\n\nrequire(\"./config\").defineOptions(Editor.prototype, \"editor\", {\n    enableMultiselect: {\n        set: function(val) {\n            MultiSelect(this);\n            if (val) {\n                this.on(\"changeSession\", this.$multiselectOnSessionChange);\n                this.on(\"mousedown\", onMouseDown);\n            } else {\n                this.off(\"changeSession\", this.$multiselectOnSessionChange);\n                this.off(\"mousedown\", onMouseDown);\n            }\n        },\n        value: true\n    }\n})\n\n\n\n});\n\ndefine('ace/mouse/multi_select_handler', ['require', 'exports', 'module' , 'ace/lib/event'], function(require, exports, module) {\n\nvar event = require(\"../lib/event\");\nfunction isSamePoint(p1, p2) {\n    return p1.row == p2.row && p1.column == p2.column;\n}\n\nfunction onMouseDown(e) {\n    var ev = e.domEvent;\n    var alt = ev.altKey;\n    var shift = ev.shiftKey;\n    var ctrl = e.getAccelKey();\n    var button = e.getButton();\n\n    if (e.editor.inMultiSelectMode && button == 2) {\n        e.editor.textInput.onContextMenu(e.domEvent);\n        return;\n    }\n    \n    if (!ctrl && !alt) {\n        if (button == 0 && e.editor.inMultiSelectMode)\n            e.editor.exitMultiSelectMode();\n        return;\n    }\n\n    var editor = e.editor;\n    var selection = editor.selection;\n    var isMultiSelect = editor.inMultiSelectMode;\n    var pos = e.getDocumentPosition();\n    var cursor = selection.getCursor();\n    var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor));\n\n\n    var mouseX = e.x, mouseY = e.y;\n    var onMouseSelection = function(e) {\n        mouseX = e.clientX;\n        mouseY = e.clientY;\n    };\n\n    var blockSelect = function() {\n        var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n        var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column);\n\n        if (isSamePoint(screenCursor, newCursor)\n            && isSamePoint(cursor, selection.selectionLead))\n            return;\n        screenCursor = newCursor;\n\n        editor.selection.moveCursorToPosition(cursor);\n        editor.selection.clearSelection();\n        editor.renderer.scrollCursorIntoView();\n\n        editor.removeSelectionMarkers(rectSel);\n        rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor);\n        rectSel.forEach(editor.addSelectionMarker, editor);\n        editor.updateSelectionMarkers();\n    };\n    \n    var session = editor.session;\n    var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n    var screenCursor = screenAnchor;\n\n    \n\n    if (ctrl && !shift && !alt && button == 0) {\n        if (!isMultiSelect && inSelection)\n            return; // dragging\n\n        if (!isMultiSelect) {\n            var range = selection.toOrientedRange();\n            editor.addSelectionMarker(range);\n        }\n\n        var oldRange = selection.rangeList.rangeAtPoint(pos);\n\n        editor.once(\"mouseup\", function() {\n            var tmpSel = selection.toOrientedRange();\n\n            if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor))\n                selection.substractPoint(tmpSel.cursor);\n            else {\n                if (range) {\n                    editor.removeSelectionMarker(range);\n                    selection.addRange(range);\n                }\n                selection.addRange(tmpSel);\n            }\n        });\n\n    } else if (alt && button == 0) {\n        e.stop();\n\n        if (isMultiSelect && !ctrl)\n            selection.toSingleRange();\n        else if (!isMultiSelect && ctrl)\n            selection.addRange();\n\n        var rectSel = [];\n        if (shift) {\n            screenAnchor = session.documentToScreenPosition(selection.lead);\n            blockSelect();\n        } else {\n            selection.moveCursorToPosition(pos);\n            selection.clearSelection();\n        }\n\n\n        var onMouseSelectionEnd = function(e) {\n            clearInterval(timerId);\n            editor.removeSelectionMarkers(rectSel);\n            for (var i = 0; i < rectSel.length; i++)\n                selection.addRange(rectSel[i]);\n        };\n\n        var onSelectionInterval = blockSelect;\n\n        event.capture(editor.container, onMouseSelection, onMouseSelectionEnd);\n        var timerId = setInterval(function() {onSelectionInterval();}, 20);\n\n        return e.preventDefault();\n    }\n}\n\n\nexports.onMouseDown = onMouseDown;\n\n});\n\ndefine('ace/commands/multi_select_commands', ['require', 'exports', 'module' , 'ace/keyboard/hash_handler'], function(require, exports, module) {\nexports.defaultCommands = [{\n    name: \"addCursorAbove\",\n    exec: function(editor) { editor.selectMoreLines(-1); },\n    bindKey: {win: \"Ctrl-Alt-Up\", mac: \"Ctrl-Alt-Up\"},\n    readonly: true\n}, {\n    name: \"addCursorBelow\",\n    exec: function(editor) { editor.selectMoreLines(1); },\n    bindKey: {win: \"Ctrl-Alt-Down\", mac: \"Ctrl-Alt-Down\"},\n    readonly: true\n}, {\n    name: \"addCursorAboveSkipCurrent\",\n    exec: function(editor) { editor.selectMoreLines(-1, true); },\n    bindKey: {win: \"Ctrl-Alt-Shift-Up\", mac: \"Ctrl-Alt-Shift-Up\"},\n    readonly: true\n}, {\n    name: \"addCursorBelowSkipCurrent\",\n    exec: function(editor) { editor.selectMoreLines(1, true); },\n    bindKey: {win: \"Ctrl-Alt-Shift-Down\", mac: \"Ctrl-Alt-Shift-Down\"},\n    readonly: true\n}, {\n    name: \"selectMoreBefore\",\n    exec: function(editor) { editor.selectMore(-1); },\n    bindKey: {win: \"Ctrl-Alt-Left\", mac: \"Ctrl-Alt-Left\"},\n    readonly: true\n}, {\n    name: \"selectMoreAfter\",\n    exec: function(editor) { editor.selectMore(1); },\n    bindKey: {win: \"Ctrl-Alt-Right\", mac: \"Ctrl-Alt-Right\"},\n    readonly: true\n}, {\n    name: \"selectNextBefore\",\n    exec: function(editor) { editor.selectMore(-1, true); },\n    bindKey: {win: \"Ctrl-Alt-Shift-Left\", mac: \"Ctrl-Alt-Shift-Left\"},\n    readonly: true\n}, {\n    name: \"selectNextAfter\",\n    exec: function(editor) { editor.selectMore(1, true); },\n    bindKey: {win: \"Ctrl-Alt-Shift-Right\", mac: \"Ctrl-Alt-Shift-Right\"},\n    readonly: true\n}, {\n    name: \"splitIntoLines\",\n    exec: function(editor) { editor.multiSelect.splitIntoLines(); },\n    bindKey: {win: \"Ctrl-Alt-L\", mac: \"Ctrl-Alt-L\"},\n    readonly: true\n}, {\n    name: \"alignCursors\",\n    exec: function(editor) { editor.alignCursors(); },\n    bindKey: {win: \"Ctrl-Alt-A\", mac: \"Ctrl-Alt-A\"}\n}];\nexports.multiSelectCommands = [{\n    name: \"singleSelection\",\n    bindKey: \"esc\",\n    exec: function(editor) { editor.exitMultiSelectMode(); },\n    readonly: true,\n    isAvailable: function(editor) {return editor && editor.inMultiSelectMode}\n}];\n\nvar HashHandler = require(\"../keyboard/hash_handler\").HashHandler;\nexports.keyboardHandler = new HashHandler(exports.multiSelectCommands);\n\n});\n\ndefine('ace/worker/worker_client', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/config'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\nvar config = require(\"../config\");\n\nvar WorkerClient = function(topLevelNamespaces, mod, classname) {\n    this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n    this.changeListener = this.changeListener.bind(this);\n    this.onMessage = this.onMessage.bind(this);\n    if (require.nameToUrl && !require.toUrl)\n        require.toUrl = require.nameToUrl;\n\n    var workerUrl;\n    if (config.get(\"packaged\") || !require.toUrl) {\n        workerUrl = config.moduleUrl(mod, \"worker\");\n    } else {\n        var normalizePath = this.$normalizePath;\n        workerUrl = normalizePath(require.toUrl(\"ace/worker/worker.js\", null, \"_\"));\n\n        var tlns = {};\n        topLevelNamespaces.forEach(function(ns) {\n            tlns[ns] = normalizePath(require.toUrl(ns, null, \"_\").replace(/(\\.js)?(\\?.*)?$/, \"\"));\n        });\n    }\n\n    this.$worker = new Worker(workerUrl);\n    this.$worker.postMessage({\n        init : true,\n        tlns: tlns,\n        module: mod,\n        classname: classname\n    });\n\n    this.callbackId = 1;\n    this.callbacks = {};\n\n    this.$worker.onmessage = this.onMessage;\n};\n\n(function(){\n\n    oop.implement(this, EventEmitter);\n\n    this.onMessage = function(e) {\n        var msg = e.data;\n        switch(msg.type) {\n            case \"log\":\n                window.console && console.log && console.log.apply(console, msg.data);\n                break;\n\n            case \"event\":\n                this._emit(msg.name, {data: msg.data});\n                break;\n\n            case \"call\":\n                var callback = this.callbacks[msg.id];\n                if (callback) {\n                    callback(msg.data);\n                    delete this.callbacks[msg.id];\n                }\n                break;\n        }\n    };\n\n    this.$normalizePath = function(path) {\n        if (!location.host) // needed for file:// protocol\n            return path;\n        path = path.replace(/^[a-z]+:\\/\\/[^\\/]+/, \"\"); // Remove domain name and rebuild it\n        path = location.protocol + \"//\" + location.host\n            + (path.charAt(0) == \"/\" ? \"\" : location.pathname.replace(/\\/[^\\/]*$/, \"\"))\n            + \"/\" + path.replace(/^[\\/]+/, \"\");\n        return path;\n    };\n\n    this.terminate = function() {\n        this._emit(\"terminate\", {});\n        this.deltaQueue = null;\n        this.$worker.terminate();\n        this.$worker = null;\n        this.$doc.removeEventListener(\"change\", this.changeListener);\n        this.$doc = null;\n    };\n\n    this.send = function(cmd, args) {\n        this.$worker.postMessage({command: cmd, args: args});\n    };\n\n    this.call = function(cmd, args, callback) {\n        if (callback) {\n            var id = this.callbackId++;\n            this.callbacks[id] = callback;\n            args.push(id);\n        }\n        this.send(cmd, args);\n    };\n\n    this.emit = function(event, data) {\n        try {\n            this.$worker.postMessage({event: event, data: {data: data.data}});\n        }\n        catch(ex) {}\n    };\n\n    this.attachToDocument = function(doc) {\n        if(this.$doc)\n            this.terminate();\n\n        this.$doc = doc;\n        this.call(\"setValue\", [doc.getValue()]);\n        doc.on(\"change\", this.changeListener);\n    };\n\n    this.changeListener = function(e) {\n        if (!this.deltaQueue) {\n            this.deltaQueue = [e.data];\n            setTimeout(this.$sendDeltaQueue, 0);\n        } else\n            this.deltaQueue.push(e.data);\n    };\n\n    this.$sendDeltaQueue = function() {\n        var q = this.deltaQueue;\n        if (!q) return;\n        this.deltaQueue = null;\n        if (q.length > 20 && q.length > this.$doc.getLength() >> 1) {\n            this.call(\"setValue\", [this.$doc.getValue()]);\n        } else\n            this.emit(\"change\", {data: q});\n    }\n\n}).call(WorkerClient.prototype);\n\n\nvar UIWorkerClient = function(topLevelNamespaces, mod, classname) {\n    this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n    this.changeListener = this.changeListener.bind(this);\n    this.callbackId = 1;\n    this.callbacks = {};\n    this.messageBuffer = [];\n\n    var main = null;\n    var sender = Object.create(EventEmitter);\n    var _self = this;\n\n    this.$worker = {};\n    this.$worker.terminate = function() {};\n    this.$worker.postMessage = function(e) {\n        _self.messageBuffer.push(e);\n        main && setTimeout(processNext);\n    };\n\n    var processNext = function() {\n        var msg = _self.messageBuffer.shift();\n        if (msg.command)\n            main[msg.command].apply(main, msg.args);\n        else if (msg.event)\n            sender._emit(msg.event, msg.data);\n    };\n\n    sender.postMessage = function(msg) {\n        _self.onMessage({data: msg});\n    };\n    sender.callback = function(data, callbackId) {\n        this.postMessage({type: \"call\", id: callbackId, data: data});\n    };\n    sender.emit = function(name, data) {\n        this.postMessage({type: \"event\", name: name, data: data});\n    };\n\n    config.loadModule([\"worker\", mod], function(Main) {\n        main = new Main[classname](sender);\n        while (_self.messageBuffer.length)\n            processNext();\n    });\n};\n\nUIWorkerClient.prototype = WorkerClient.prototype;\n\nexports.UIWorkerClient = UIWorkerClient;\nexports.WorkerClient = WorkerClient;\n\n});\ndefine('ace/placeholder', ['require', 'exports', 'module' , 'ace/range', 'ace/lib/event_emitter', 'ace/lib/oop'], function(require, exports, module) {\n\n\nvar Range = require(\"./range\").Range;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar oop = require(\"./lib/oop\");\n\nvar PlaceHolder = function(session, length, pos, others, mainClass, othersClass) {\n    var _self = this;\n    this.length = length;\n    this.session = session;\n    this.doc = session.getDocument();\n    this.mainClass = mainClass;\n    this.othersClass = othersClass;\n    this.$onUpdate = this.onUpdate.bind(this);\n    this.doc.on(\"change\", this.$onUpdate);\n    this.$others = others;\n    \n    this.$onCursorChange = function() {\n        setTimeout(function() {\n            _self.onCursorChange();\n        });\n    };\n    \n    this.$pos = pos;\n    var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1};\n    this.$undoStackDepth =  undoStack.length;\n    this.setup();\n\n    session.selection.on(\"changeCursor\", this.$onCursorChange);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setup = function() {\n        var _self = this;\n        var doc = this.doc;\n        var session = this.session;\n        var pos = this.$pos;\n\n        this.pos = doc.createAnchor(pos.row, pos.column);\n        this.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false);\n        this.pos.on(\"change\", function(event) {\n            session.removeMarker(_self.markerId);\n            _self.markerId = session.addMarker(new Range(event.value.row, event.value.column, event.value.row, event.value.column+_self.length), _self.mainClass, null, false);\n        });\n        this.others = [];\n        this.$others.forEach(function(other) {\n            var anchor = doc.createAnchor(other.row, other.column);\n            _self.others.push(anchor);\n        });\n        session.setUndoSelect(false);\n    };\n    this.showOtherMarkers = function() {\n        if(this.othersActive) return;\n        var session = this.session;\n        var _self = this;\n        this.othersActive = true;\n        this.others.forEach(function(anchor) {\n            anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false);\n            anchor.on(\"change\", function(event) {\n                session.removeMarker(anchor.markerId);\n                anchor.markerId = session.addMarker(new Range(event.value.row, event.value.column, event.value.row, event.value.column+_self.length), _self.othersClass, null, false);\n            });\n        });\n    };\n    this.hideOtherMarkers = function() {\n        if(!this.othersActive) return;\n        this.othersActive = false;\n        for (var i = 0; i < this.others.length; i++) {\n            this.session.removeMarker(this.others[i].markerId);\n        }\n    };\n    this.onUpdate = function(event) {\n        var delta = event.data;\n        var range = delta.range;\n        if(range.start.row !== range.end.row) return;\n        if(range.start.row !== this.pos.row) return;\n        if (this.$updating) return;\n        this.$updating = true;\n        var lengthDiff = delta.action === \"insertText\" ? range.end.column - range.start.column : range.start.column - range.end.column;\n        \n        if(range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1) {\n            var distanceFromStart = range.start.column - this.pos.column;\n            this.length += lengthDiff;\n            if(!this.session.$fromUndo) {\n                if(delta.action === \"insertText\") {\n                    for (var i = this.others.length - 1; i >= 0; i--) {\n                        var otherPos = this.others[i];\n                        var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n                        if(otherPos.row === range.start.row && range.start.column < otherPos.column)\n                            newPos.column += lengthDiff;\n                        this.doc.insert(newPos, delta.text);\n                    }\n                } else if(delta.action === \"removeText\") {\n                    for (var i = this.others.length - 1; i >= 0; i--) {\n                        var otherPos = this.others[i];\n                        var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n                        if(otherPos.row === range.start.row && range.start.column < otherPos.column)\n                            newPos.column += lengthDiff;\n                        this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff));\n                    }\n                }\n                if(range.start.column === this.pos.column && delta.action === \"insertText\") {\n                    setTimeout(function() {\n                        this.pos.setPosition(this.pos.row, this.pos.column - lengthDiff);\n                        for (var i = 0; i < this.others.length; i++) {\n                            var other = this.others[i];\n                            var newPos = {row: other.row, column: other.column - lengthDiff};\n                            if(other.row === range.start.row && range.start.column < other.column)\n                                newPos.column += lengthDiff;\n                            other.setPosition(newPos.row, newPos.column);\n                        }\n                    }.bind(this), 0);\n                }\n                else if(range.start.column === this.pos.column && delta.action === \"removeText\") {\n                    setTimeout(function() {\n                        for (var i = 0; i < this.others.length; i++) {\n                            var other = this.others[i];\n                            if(other.row === range.start.row && range.start.column < other.column) {\n                                other.setPosition(other.row, other.column - lengthDiff);\n                            }\n                        }\n                    }.bind(this), 0);\n                }\n            }\n            this.pos._emit(\"change\", {value: this.pos});\n            for (var i = 0; i < this.others.length; i++) {\n                this.others[i]._emit(\"change\", {value: this.others[i]});\n            }\n        }\n        this.$updating = false;\n    };\n\n    this.onCursorChange = function(event) {\n        if (this.$updating) return;\n        var pos = this.session.selection.getCursor();\n        if(pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) {\n            this.showOtherMarkers();\n            this._emit(\"cursorEnter\", event);\n        } else {\n            this.hideOtherMarkers();\n            this._emit(\"cursorLeave\", event);\n        }\n    };    \n    this.detach = function() {\n        this.session.removeMarker(this.markerId);\n        this.hideOtherMarkers();\n        this.doc.removeEventListener(\"change\", this.$onUpdate);\n        this.session.selection.removeEventListener(\"changeCursor\", this.$onCursorChange);\n        this.pos.detach();\n        for (var i = 0; i < this.others.length; i++) {\n            this.others[i].detach();\n        }\n        this.session.setUndoSelect(true);\n    };\n    this.cancel = function() {\n        if(this.$undoStackDepth === -1)\n            throw Error(\"Canceling placeholders only supported with undo manager attached to session.\");\n        var undoManager = this.session.getUndoManager();\n        var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth;\n        for (var i = 0; i < undosRequired; i++) {\n            undoManager.undo(true);\n        }\n    };\n}).call(PlaceHolder.prototype);\n\n\nexports.PlaceHolder = PlaceHolder;\n});\n\ndefine('ace/mode/folding/fold_mode', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = session.getFoldWidget(end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n    this.closingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var end = {row: row, column: column};\n        var start = session.$findOpeningBracket(bracket, end);\n\n        if (!start)\n            return;\n\n        start.column++;\n        end.column--;\n\n        return  Range.fromPoints(start, end);\n    };\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/theme/textmate', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) {\n\n\nexports.isDark = false;\nexports.cssClass = \"ace-tm\";\nexports.cssText = \".ace-tm .ace_gutter {\\\nbackground: #f0f0f0;\\\ncolor: #333;\\\n}\\\n.ace-tm .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8;\\\n}\\\n.ace-tm .ace_fold {\\\nbackground-color: #6B72E6;\\\n}\\\n.ace-tm {\\\nbackground-color: #FFFFFF;\\\n}\\\n.ace-tm .ace_cursor {\\\ncolor: black;\\\n}\\\n.ace-tm .ace_invisible {\\\ncolor: rgb(191, 191, 191);\\\n}\\\n.ace-tm .ace_storage,\\\n.ace-tm .ace_keyword {\\\ncolor: blue;\\\n}\\\n.ace-tm .ace_constant {\\\ncolor: rgb(197, 6, 11);\\\n}\\\n.ace-tm .ace_constant.ace_buildin {\\\ncolor: rgb(88, 72, 246);\\\n}\\\n.ace-tm .ace_constant.ace_language {\\\ncolor: rgb(88, 92, 246);\\\n}\\\n.ace-tm .ace_constant.ace_library {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_invalid {\\\nbackground-color: rgba(255, 0, 0, 0.1);\\\ncolor: red;\\\n}\\\n.ace-tm .ace_support.ace_function {\\\ncolor: rgb(60, 76, 114);\\\n}\\\n.ace-tm .ace_support.ace_constant {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_support.ace_type,\\\n.ace-tm .ace_support.ace_class {\\\ncolor: rgb(109, 121, 222);\\\n}\\\n.ace-tm .ace_keyword.ace_operator {\\\ncolor: rgb(104, 118, 135);\\\n}\\\n.ace-tm .ace_string {\\\ncolor: rgb(3, 106, 7);\\\n}\\\n.ace-tm .ace_comment {\\\ncolor: rgb(76, 136, 107);\\\n}\\\n.ace-tm .ace_comment.ace_doc {\\\ncolor: rgb(0, 102, 255);\\\n}\\\n.ace-tm .ace_comment.ace_doc.ace_tag {\\\ncolor: rgb(128, 159, 191);\\\n}\\\n.ace-tm .ace_constant.ace_numeric {\\\ncolor: rgb(0, 0, 205);\\\n}\\\n.ace-tm .ace_variable {\\\ncolor: rgb(49, 132, 149);\\\n}\\\n.ace-tm .ace_xml-pe {\\\ncolor: rgb(104, 104, 91);\\\n}\\\n.ace-tm .ace_entity.ace_name.ace_function {\\\ncolor: #0000A2;\\\n}\\\n.ace-tm .ace_heading {\\\ncolor: rgb(12, 7, 255);\\\n}\\\n.ace-tm .ace_list {\\\ncolor:rgb(185, 6, 144);\\\n}\\\n.ace-tm .ace_meta.ace_tag {\\\ncolor:rgb(0, 22, 142);\\\n}\\\n.ace-tm .ace_string.ace_regex {\\\ncolor: rgb(255, 0, 0)\\\n}\\\n.ace-tm .ace_marker-layer .ace_selection {\\\nbackground: rgb(181, 213, 255);\\\n}\\\n.ace-tm.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px white;\\\nborder-radius: 2px;\\\n}\\\n.ace-tm .ace_marker-layer .ace_step {\\\nbackground: rgb(252, 255, 0);\\\n}\\\n.ace-tm .ace_marker-layer .ace_stack {\\\nbackground: rgb(164, 229, 101);\\\n}\\\n.ace-tm .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgb(192, 192, 192);\\\n}\\\n.ace-tm .ace_marker-layer .ace_active-line {\\\nbackground: rgba(0, 0, 0, 0.07);\\\n}\\\n.ace-tm .ace_gutter-active-line {\\\nbackground-color : #dcdcdc;\\\n}\\\n.ace-tm .ace_marker-layer .ace_selected-word {\\\nbackground: rgb(250, 250, 255);\\\nborder: 1px solid rgb(200, 200, 250);\\\n}\\\n.ace-tm .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\\\n\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n;\n            (function() {\n                window.require([\"ace/ace\"], function(a) {\n                    a && a.config.init();\n                    if (!window.ace)\n                        window.ace = {};\n                    for (var key in a) if (a.hasOwnProperty(key))\n                        ace[key] = a[key];\n                });\n            })();\n        \n"
  },
  {
    "path": "browser/plugins/ace/mode-css.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * 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 *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING 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 * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/css_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/worker/worker_client', 'ace/mode/behaviour/css', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CssBehaviour = require(\"./behaviour/css\").CssBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = CssHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CssBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"csslint\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\ndefine('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar CssBehaviour = function () {\n\n    this.inherit(CstyleBehaviour);\n\n    this.add(\"colon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(cursor.row);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                if (rightChar === ':') {\n                    return {\n                       text: '',\n                       selection: [1, 1]\n                    }\n                }\n                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n                    return {\n                       text: ':;',\n                       selection: [1, 1]\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"colon\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(range.start.row);\n                var rightChar = line.substring(range.end.column, range.end.column + 1);\n                if (rightChar === ';') {\n                    range.end.column ++;\n                    return range;\n                }\n            }\n        }\n    });\n\n    this.add(\"semicolon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ';') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === ';') {\n                return {\n                   text: '',\n                   selection: [1, 1]\n                }\n            }\n        }\n    });\n\n}\noop.inherits(CssBehaviour, CstyleBehaviour);\n\nexports.CssBehaviour = CssBehaviour;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\n\nvar autoInsertedBrackets = 0;\nvar autoInsertedRow = -1;\nvar autoInsertedLineEnd = \"\";\nvar maybeInsertedBrackets = 0;\nvar maybeInsertedRow = -1;\nvar maybeInsertedLineStart = \"\";\nvar maybeInsertedLineEnd = \"\";\n\nvar CstyleBehaviour = function () {\n    \n    CstyleBehaviour.isSaneInsertion = function(editor, session) {\n        var cursor = editor.getCursorPosition();\n        var iterator = new TokenIterator(session, cursor.row, cursor.column);\n        if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n            var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n            if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n                return false;\n        }\n        iterator.stepForward();\n        return iterator.getCurrentTokenRow() !== cursor.row ||\n            this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n    };\n    \n    CstyleBehaviour.$matchTokenType = function(token, types) {\n        return types.indexOf(token.type || token) > -1;\n    };\n    \n    CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0]))\n            autoInsertedBrackets = 0;\n        autoInsertedRow = cursor.row;\n        autoInsertedLineEnd = bracket + line.substr(cursor.column);\n        autoInsertedBrackets++;\n    };\n    \n    CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (!this.isMaybeInsertedClosing(cursor, line))\n            maybeInsertedBrackets = 0;\n        maybeInsertedRow = cursor.row;\n        maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n        maybeInsertedLineEnd = line.substr(cursor.column);\n        maybeInsertedBrackets++;\n    };\n    \n    CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n        return autoInsertedBrackets > 0 &&\n            cursor.row === autoInsertedRow &&\n            bracket === autoInsertedLineEnd[0] &&\n            line.substr(cursor.column) === autoInsertedLineEnd;\n    };\n    \n    CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n        return maybeInsertedBrackets > 0 &&\n            cursor.row === maybeInsertedRow &&\n            line.substr(cursor.column) === maybeInsertedLineEnd &&\n            line.substr(0, cursor.column) == maybeInsertedLineStart;\n    };\n    \n    CstyleBehaviour.popAutoInsertedClosing = function() {\n        autoInsertedLineEnd = autoInsertedLineEnd.substr(1);\n        autoInsertedBrackets--;\n    };\n    \n    CstyleBehaviour.clearMaybeInsertedClosing = function() {\n        maybeInsertedBrackets = 0;\n        maybeInsertedRow = -1;\n    };\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column])) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}' || closing !== \"\") {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString());\n                var next_indent = this.$getIndent(line);\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent + closing,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    if (!CstyleBehaviour.isSaneInsertion(editor, session))\n                        return;\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/mode-glsl.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * 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 *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING 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 * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/glsl', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/c_cpp', 'ace/tokenizer', 'ace/mode/glsl_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar CMode = require(\"./c_cpp\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar glslHighlightRules = require(\"./glsl_highlight_rules\").glslHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = glslHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, CMode);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/c_cpp', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/c_cpp_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar c_cppHighlightRules = require(\"./c_cpp_highlight_rules\").c_cppHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = c_cppHighlightRules;\n\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\ndefine('ace/mode/c_cpp_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar cFunctions = exports.cFunctions = \"\\\\s*\\\\bhypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len)))\\\\b\"\n\nvar c_cppHighlightRules = function() {\n\n    var keywordControls = (\n        \"break|case|continue|default|do|else|for|goto|if|_Pragma|\" +\n        \"return|switch|while|catch|operator|try|throw|using\"\n    );\n    \n    var storageType = (\n        \"asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|\" +\n        \"_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|\" +\n        \"class|wchar_t|template\"\n    );\n\n    var storageModifiers = (\n        \"const|extern|register|restrict|static|volatile|inline|private:|\" +\n        \"protected:|public:|friend|explicit|virtual|export|mutable|typename\"\n    );\n\n    var keywordOperators = (\n        \"and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq\" +\n        \"const_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace\"\n    );\n\n    var builtinConstants = (\n        \"NULL|true|false|TRUE|FALSE\"\n    );\n\n    var keywordMapper = this.$keywords = this.createKeywordMapper({\n        \"keyword.control\" : keywordControls,\n        \"storage.type\" : storageType,\n        \"storage.modifier\" : storageModifiers,\n        \"keyword.operator\" : keywordOperators,\n        \"variable.language\": \"this\",\n        \"constant.language\": builtinConstants\n    }, \"identifier\");\n\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                regex : '[\"].*\\\\\\\\$',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"string\", // multi line string start\n                regex : \"['].*\\\\\\\\$\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"\n            }, {\n                token : \"keyword\", // pre-compiler directives\n                regex : \"#\\\\s*(?:include|import|pragma|line|define|undef|if|ifdef|else|elif|ifndef)\\\\b\",\n                next  : \"directive\"\n            }, {\n                token : \"keyword\", // special case pre-compiler directive\n                regex : \"(?:#\\\\s*endif)\\\\b\"\n            }, {\n                token : \"support.function.C99.c\",\n                regex : cFunctions\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)\"\n            }, {\n              token : \"punctuation.operator\",\n              regex : \"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '.+'\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '.+'\n            }\n        ],\n        \"directive\" : [\n            {\n                token : \"constant.other.multiline\",\n                regex : /\\\\/\n            },\n            {\n                token : \"constant.other.multiline\",\n                regex : /.*\\\\/\n            },\n            {\n                token : \"constant.other\",\n                regex : \"\\\\s*<.+?>\",\n                next : \"start\"\n            },\n            {\n                token : \"constant.other\", // single line\n                regex : '\\\\s*[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]',\n                next : \"start\"\n            }, \n            {\n                token : \"constant.other\", // single line\n                regex : \"\\\\s*['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\",\n                next : \"start\"\n            },\n            {\n                token : \"constant.other\",\n                regex : /[^\\\\\\/]+/,\n                next : \"start\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(c_cppHighlightRules, TextHighlightRules);\n\nexports.c_cppHighlightRules = c_cppHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc.tag\",\n            regex : \"\\\\bTODO\\\\b\"\n        }, {\n            defaultToken : \"comment.doc\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\n\nvar autoInsertedBrackets = 0;\nvar autoInsertedRow = -1;\nvar autoInsertedLineEnd = \"\";\nvar maybeInsertedBrackets = 0;\nvar maybeInsertedRow = -1;\nvar maybeInsertedLineStart = \"\";\nvar maybeInsertedLineEnd = \"\";\n\nvar CstyleBehaviour = function () {\n    \n    CstyleBehaviour.isSaneInsertion = function(editor, session) {\n        var cursor = editor.getCursorPosition();\n        var iterator = new TokenIterator(session, cursor.row, cursor.column);\n        if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n            var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n            if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n                return false;\n        }\n        iterator.stepForward();\n        return iterator.getCurrentTokenRow() !== cursor.row ||\n            this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n    };\n    \n    CstyleBehaviour.$matchTokenType = function(token, types) {\n        return types.indexOf(token.type || token) > -1;\n    };\n    \n    CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0]))\n            autoInsertedBrackets = 0;\n        autoInsertedRow = cursor.row;\n        autoInsertedLineEnd = bracket + line.substr(cursor.column);\n        autoInsertedBrackets++;\n    };\n    \n    CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (!this.isMaybeInsertedClosing(cursor, line))\n            maybeInsertedBrackets = 0;\n        maybeInsertedRow = cursor.row;\n        maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n        maybeInsertedLineEnd = line.substr(cursor.column);\n        maybeInsertedBrackets++;\n    };\n    \n    CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n        return autoInsertedBrackets > 0 &&\n            cursor.row === autoInsertedRow &&\n            bracket === autoInsertedLineEnd[0] &&\n            line.substr(cursor.column) === autoInsertedLineEnd;\n    };\n    \n    CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n        return maybeInsertedBrackets > 0 &&\n            cursor.row === maybeInsertedRow &&\n            line.substr(cursor.column) === maybeInsertedLineEnd &&\n            line.substr(0, cursor.column) == maybeInsertedLineStart;\n    };\n    \n    CstyleBehaviour.popAutoInsertedClosing = function() {\n        autoInsertedLineEnd = autoInsertedLineEnd.substr(1);\n        autoInsertedBrackets--;\n    };\n    \n    CstyleBehaviour.clearMaybeInsertedClosing = function() {\n        maybeInsertedBrackets = 0;\n        maybeInsertedRow = -1;\n    };\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column])) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}' || closing !== \"\") {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString());\n                var next_indent = this.$getIndent(line);\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent + closing,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    if (!CstyleBehaviour.isSaneInsertion(editor, session))\n                        return;\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/glsl_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/c_cpp_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar c_cppHighlightRules = require(\"./c_cpp_highlight_rules\").c_cppHighlightRules;\n\nvar glslHighlightRules = function() {\n\n    var keywords = (\n        \"attribute|const|uniform|varying|break|continue|do|for|while|\" +\n        \"if|else|in|out|inout|float|int|void|bool|true|false|\" +\n        \"lowp|mediump|highp|precision|invariant|discard|return|mat2|mat3|\" +\n        \"mat4|vec2|vec3|vec4|ivec2|ivec3|ivec4|bvec2|bvec3|bvec4|sampler2D|\" +\n        \"samplerCube|struct\"\n    );\n\n    var buildinConstants = (\n        \"radians|degrees|sin|cos|tan|asin|acos|atan|pow|\" +\n        \"exp|log|exp2|log2|sqrt|inversesqrt|abs|sign|floor|ceil|fract|mod|\" +\n        \"min|max|clamp|mix|step|smoothstep|length|distance|dot|cross|\" +\n        \"normalize|faceforward|reflect|refract|matrixCompMult|lessThan|\" +\n        \"lessThanEqual|greaterThan|greaterThanEqual|equal|notEqual|any|all|\" +\n        \"not|dFdx|dFdy|fwidth|texture2D|texture2DProj|texture2DLod|\" +\n        \"texture2DProjLod|textureCube|textureCubeLod|\" +\n        \"gl_MaxVertexAttribs|gl_MaxVertexUniformVectors|gl_MaxVaryingVectors|\" +\n        \"gl_MaxVertexTextureImageUnits|gl_MaxCombinedTextureImageUnits|\" +\n        \"gl_MaxTextureImageUnits|gl_MaxFragmentUniformVectors|gl_MaxDrawBuffers|\" +\n        \"gl_DepthRangeParameters|gl_DepthRange|\" +\n        \"gl_Position|gl_PointSize|\" +\n        \"gl_FragCoord|gl_FrontFacing|gl_PointCoord|gl_FragColor|gl_FragData\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": \"this\",\n        \"keyword\": keywords,\n        \"constant.language\": buildinConstants\n    }, \"identifier\");\n\n    this.$rules = new c_cppHighlightRules().$rules;\n    this.$rules.start.forEach(function(rule) {\n        if (typeof rule.token == \"function\")\n            rule.token = keywordMapper;\n    })\n};\n\noop.inherits(glslHighlightRules, c_cppHighlightRules);\n\nexports.glslHighlightRules = glslHighlightRules;\n});\n"
  },
  {
    "path": "browser/plugins/ace/mode-html.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * 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 *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING 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 * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/mode/javascript', 'ace/mode/css', 'ace/tokenizer', 'ace/mode/html_highlight_rules', 'ace/mode/behaviour/html', 'ace/mode/folding/html', 'ace/mode/html_completions'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar HtmlBehaviour = require(\"./behaviour/html\").HtmlBehaviour;\nvar HtmlFoldMode = require(\"./folding/html\").FoldMode;\nvar HtmlCompletions = require(\"./html_completions\").HtmlCompletions;\n\nvar Mode = function() {\n    this.HighlightRules = HtmlHighlightRules;\n    this.$behaviour = new HtmlBehaviour();\n    this.$completer = new HtmlCompletions();\n    \n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"css-\": CssMode\n    });\n    \n    this.foldingRules = new HtmlFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        return this.$completer.getCompletions(state, session, pos, prefix);\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/javascript_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function() {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|[!$%&*+\\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /\\?|\\:|\\,|\\;|\\./,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token : \"keyword.operator\",\n                regex : /\\/=?/,\n                next  : \"start\"\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/\\\\w*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\"}\n        ],\n        \"comment\" : [\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\"}\n        ],\n        \"line_comment_regex_allowed\" : [\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\"}\n        ],\n        \"line_comment\" : [\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\"}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc.tag\",\n            regex : \"\\\\bTODO\\\\b\"\n        }, {\n            defaultToken : \"comment.doc\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\n\nvar autoInsertedBrackets = 0;\nvar autoInsertedRow = -1;\nvar autoInsertedLineEnd = \"\";\nvar maybeInsertedBrackets = 0;\nvar maybeInsertedRow = -1;\nvar maybeInsertedLineStart = \"\";\nvar maybeInsertedLineEnd = \"\";\n\nvar CstyleBehaviour = function () {\n    \n    CstyleBehaviour.isSaneInsertion = function(editor, session) {\n        var cursor = editor.getCursorPosition();\n        var iterator = new TokenIterator(session, cursor.row, cursor.column);\n        if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n            var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n            if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n                return false;\n        }\n        iterator.stepForward();\n        return iterator.getCurrentTokenRow() !== cursor.row ||\n            this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n    };\n    \n    CstyleBehaviour.$matchTokenType = function(token, types) {\n        return types.indexOf(token.type || token) > -1;\n    };\n    \n    CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0]))\n            autoInsertedBrackets = 0;\n        autoInsertedRow = cursor.row;\n        autoInsertedLineEnd = bracket + line.substr(cursor.column);\n        autoInsertedBrackets++;\n    };\n    \n    CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (!this.isMaybeInsertedClosing(cursor, line))\n            maybeInsertedBrackets = 0;\n        maybeInsertedRow = cursor.row;\n        maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n        maybeInsertedLineEnd = line.substr(cursor.column);\n        maybeInsertedBrackets++;\n    };\n    \n    CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n        return autoInsertedBrackets > 0 &&\n            cursor.row === autoInsertedRow &&\n            bracket === autoInsertedLineEnd[0] &&\n            line.substr(cursor.column) === autoInsertedLineEnd;\n    };\n    \n    CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n        return maybeInsertedBrackets > 0 &&\n            cursor.row === maybeInsertedRow &&\n            line.substr(cursor.column) === maybeInsertedLineEnd &&\n            line.substr(0, cursor.column) == maybeInsertedLineStart;\n    };\n    \n    CstyleBehaviour.popAutoInsertedClosing = function() {\n        autoInsertedLineEnd = autoInsertedLineEnd.substr(1);\n        autoInsertedBrackets--;\n    };\n    \n    CstyleBehaviour.clearMaybeInsertedClosing = function() {\n        maybeInsertedBrackets = 0;\n        maybeInsertedRow = -1;\n    };\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column])) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}' || closing !== \"\") {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString());\n                var next_indent = this.$getIndent(line);\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent + closing,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    if (!CstyleBehaviour.isSaneInsertion(editor, session))\n                        return;\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/css_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/worker/worker_client', 'ace/mode/behaviour/css', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CssBehaviour = require(\"./behaviour/css\").CssBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = CssHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CssBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"csslint\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\ndefine('ace/mode/css_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\ndefine('ace/mode/behaviour/css', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar CssBehaviour = function () {\n\n    this.inherit(CstyleBehaviour);\n\n    this.add(\"colon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(cursor.row);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                if (rightChar === ':') {\n                    return {\n                       text: '',\n                       selection: [1, 1]\n                    }\n                }\n                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n                    return {\n                       text: ':;',\n                       selection: [1, 1]\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"colon\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(range.start.row);\n                var rightChar = line.substring(range.end.column, range.end.column + 1);\n                if (rightChar === ';') {\n                    range.end.column ++;\n                    return range;\n                }\n            }\n        }\n    });\n\n    this.add(\"semicolon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ';') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === ';') {\n                return {\n                   text: '',\n                   selection: [1, 1]\n                }\n            }\n        }\n    });\n\n}\noop.inherits(CssBehaviour, CstyleBehaviour);\n\nexports.CssBehaviour = CssBehaviour;\n});\n\ndefine('ace/mode/html_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/mode/css_highlight_rules', 'ace/mode/javascript_highlight_rules', 'ace/mode/xml_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    option      : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.addRules({\n        attributes: [{\n            include : \"space\"\n        }, {\n            token : \"entity.other.attribute-name\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"keyword.operator.separator\",\n            regex : \"=\",\n            push : [{\n                include: \"space\"\n            }, {\n                token : \"string\",\n                regex : \"[^<>='\\\"`\\\\s]+\",\n                next : \"pop\"\n            }, {\n                token : \"empty\",\n                regex : \"\",\n                next : \"pop\"\n            }]\n        }, {\n            include : \"string\"\n        }],\n        tag: [{\n            token : function(start, tag) {\n                var group = tagMap[tag];\n                return [\"meta.tag.punctuation.begin\",\n                    \"meta.tag.name\" + (group ? \".\" + group : \"\")];\n            },\n            regex : \"(<)([-_a-zA-Z0-9:]+)\",\n            next: \"start_tag_stuff\"\n        }, {\n            token : function(start, tag) {\n                var group = tagMap[tag];\n                return [\"meta.tag.punctuation.begin\",\n                    \"meta.tag.name\" + (group ? \".\" + group : \"\")];\n            },\n            regex : \"(</)([-_a-zA-Z0-9:]+)\",\n            next: \"end_tag_stuff\"\n        }],\n        start_tag_stuff: [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.end\", regex : \"/?>\", next : \"start\"}\n        ],\n        end_tag_stuff: [\n            {include : \"space\"},\n            {token : \"meta.tag.punctuation.end\", regex : \">\", next : \"start\"}\n        ]\n    });\n\n    this.embedTagRules(CssHighlightRules, \"css-\", \"style\");\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    if (this.constructor === HtmlHighlightRules)\n        this.normalizeRules();\n};\n\noop.inherits(HtmlHighlightRules, XmlHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\ndefine('ace/mode/xml_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar xmlUtil = require(\"./xml_util\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"punctuation.string.begin\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.instruction.begin\", \"keyword.instruction\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_declaration\"\n            },\n            {\n                token : [\"punctuation.instruction.begin\", \"keyword.instruction\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"instruction\"\n            },\n            {token : \"comment\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"punctuation.doctype.begin\", \"meta.tag.doctype\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\"\n            },\n            {include : \"tag\"},\n            {include : \"reference\"}\n        ],\n\n        xml_declaration : [\n            {include : \"attributes\"},\n            {include : \"instruction\"}\n        ],\n\n        instruction : [\n            {token : \"punctuation.instruction.end\", regex : \"\\\\?>\", next : \"start\"}\n        ],\n\n        doctype : [\n            {include : \"space\"},\n            {include : \"string\"},\n            {token : \"punctuation.doctype.end\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.begin\", regex : \"\\\\[\", push : \"declarations\"}\n        ],\n\n        declarations : [{\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.end\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.begin\", \"keyword\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.end\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.end\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text\", regex : \"\\\\s+\"},\n            {token : \"text\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment\"}\n        ],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.begin\", \"meta.tag.name\"],\n            regex : \"(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.end\", regex : \"/?>\", next : \"start\"}\n            ]\n        }, {\n            token : [\"meta.tag.punctuation.begin\", \"meta.tag.name\"],\n            regex : \"(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"space\"},\n                {token : \"meta.tag.punctuation.end\", regex : \">\", next : \"start\"}\n            ]\n        }],\n\n        space : [\n            {token : \"text\", regex : \"\\\\s+\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }, {\n            token : \"invalid.illegal\", regex : \"&\"\n        }],\n\n        string: [{\n            token : \"string\",\n            regex : \"'\",\n            push : \"qstring_inner\"\n        }, {\n            token : \"string\",\n            regex : '\"',\n            push : \"qqstring_inner\"\n        }],\n\n        qstring_inner: [\n            {token : \"string\", regex: \"'\", next: \"pop\"},\n            {include : \"reference\"},\n            {defaultToken : \"string\"}\n        ],\n\n        qqstring_inner: [\n            {token : \"string\", regex: '\"', next: \"pop\"},\n            {include : \"reference\"},\n            {defaultToken : \"string\"}\n        ],\n\n        attributes: [{\n            token : \"entity.other.attribute-name\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.separator\",\n            regex : \"=\"\n        }, {\n            include : \"space\"\n        }, {\n            include : \"string\"\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.begin\", \"meta.tag.name.\" + tag],\n            regex : \"(<)(\" + tag + \")\",\n            next: [\n                {include : \"space\"},\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.end\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"space\"},\n            {token : \"meta.tag.punctuation.end\", regex : \">\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.begin\", \"meta.tag.name.\" + tag],\n            regex : \"(</)(\" + tag + \")\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.begin\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.end\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\ndefine('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nfunction string(state) {\n    return [{\n        token : \"string\",\n        regex : '\"',\n        next : state + \"_qqstring\"\n    }, {\n        token : \"string\",\n        regex : \"'\",\n        next : state + \"_qstring\"\n    }];\n}\n\nfunction multiLineString(quote, state) {\n    return [\n        {token : \"string\", regex : quote, next : state},\n        {\n            token : \"constant.language.escape\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\" \n        },\n        {defaultToken : \"string\"}\n    ];\n}\n\nexports.tag = function(states, name, nextState, tagMap) {\n    states[name] = [{\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }, {\n        \n    token : !tagMap ? \"meta.tag.tag-name\" : function(value) {\n            if (tagMap[value])\n                return \"meta.tag.tag-name.\" + tagMap[value];\n            else\n                return \"meta.tag.tag-name\";\n        },\n        regex : \"[-_a-zA-Z0-9:]+\",\n        next : name + \"_embed_attribute_list\" \n    }, {\n        token: \"empty\",\n        regex: \"\",\n        next : name + \"_embed_attribute_list\"\n    }];\n\n    states[name + \"_qstring\"] = multiLineString(\"'\", name + \"_embed_attribute_list\");\n    states[name + \"_qqstring\"] = multiLineString(\"\\\"\", name + \"_embed_attribute_list\");\n    \n    states[name + \"_embed_attribute_list\"] = [{\n        token : \"meta.tag.r\",\n        regex : \"/?>\",\n        next : nextState\n    }, {\n        token : \"keyword.operator\",\n        regex : \"=\"\n    }, {\n        token : \"entity.other.attribute-name\",\n        regex : \"[-_a-zA-Z0-9:]+\"\n    }, {\n        token : \"constant.numeric\", // float\n        regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n    }, {\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }].concat(string(name));\n};\n\n});\n\ndefine('ace/mode/behaviour/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour/xml', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar XmlBehaviour = require(\"../behaviour/xml\").XmlBehaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar voidElements = ['area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input', 'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr'];\n\nfunction hasType(token, type) {\n    var tokenTypes = token.type.split('.');\n    return type.split('.').every(function(type){\n        return (tokenTypes.indexOf(type) !== -1);\n    });\n    return hasType;\n}\n\nvar HtmlBehaviour = function () {\n\n    this.inherit(XmlBehaviour); // Get xml behaviour\n    \n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken();\n\n            if (token && hasType(token, 'string') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n                return;\n            var atCursor = false;\n            if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){\n                do {\n                    token = iterator.stepBackward();\n                } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text')));\n            } else {\n                atCursor = true;\n            }\n            if (!token || !hasType(token, 'meta.tag.name') || iterator.stepBackward().value.match('/')) {\n                return;\n            }\n            var element = token.value;\n            if (atCursor){\n                var element = element.substring(0, position.column - token.start);\n            }\n            if (voidElements.indexOf(element) !== -1){\n                return;\n            }\n            return {\n               text: '>' + '</' + element + '>',\n               selection: [1, 1]\n            }\n        }\n    });\n}\noop.inherits(HtmlBehaviour, XmlBehaviour);\n\nexports.HtmlBehaviour = HtmlBehaviour;\n});\n\ndefine('ace/mode/behaviour/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nfunction hasType(token, type) {\n    var tokenTypes = token.type.split('.');\n    return type.split('.').every(function(type){\n        return (tokenTypes.indexOf(type) !== -1);\n    });\n    return hasType;\n}\n\nvar XmlBehaviour = function () {\n    \n    this.inherit(CstyleBehaviour, [\"string_dquotes\"]); // Get string behaviour\n    \n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken();\n\n            if (token && hasType(token, 'string') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n                return;\n            var atCursor = false;\n            if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){\n                do {\n                    token = iterator.stepBackward();\n                } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text')));\n            } else {\n                atCursor = true;\n            }\n            if (!token || !hasType(token, 'meta.tag.name') || iterator.stepBackward().value.match('/')) {\n                return;\n            }\n            var tag = token.value;\n            if (atCursor){\n                var tag = tag.substring(0, position.column - token.start);\n            }\n\n            return {\n               text: '>' + '</' + tag + '>',\n               selection: [1, 1]\n            }\n        }\n    });\n\n    this.add('autoindent', 'insertion', function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.getLine(cursor.row);\n            var rightChars = line.substring(cursor.column, cursor.column + 2);\n            if (rightChars == '</') {\n                var next_indent = this.$getIndent(line);\n                var indent = next_indent + session.getTabString();\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                }\n            }\n        }\n    });\n    \n}\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\ndefine('ace/mode/folding/html', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/mixed', 'ace/mode/folding/xml', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar MixedFoldMode = require(\"./mixed\").FoldMode;\nvar XmlFoldMode = require(\"./xml\").FoldMode;\nvar CStyleFoldMode = require(\"./cstyle\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {\n    MixedFoldMode.call(this, new XmlFoldMode({\n        \"area\": 1,\n        \"base\": 1,\n        \"br\": 1,\n        \"col\": 1,\n        \"command\": 1,\n        \"embed\": 1,\n        \"hr\": 1,\n        \"img\": 1,\n        \"input\": 1,\n        \"keygen\": 1,\n        \"link\": 1,\n        \"meta\": 1,\n        \"param\": 1,\n        \"source\": 1,\n        \"track\": 1,\n        \"wbr\": 1,\n        \"li\": 1,\n        \"dt\": 1,\n        \"dd\": 1,\n        \"p\": 1,\n        \"rt\": 1,\n        \"rp\": 1,\n        \"optgroup\": 1,\n        \"option\": 1,\n        \"colgroup\": 1,\n        \"td\": 1,\n        \"th\": 1\n    }), {\n        \"js-\": new CStyleFoldMode(),\n        \"css-\": new CStyleFoldMode()\n    });\n};\n\noop.inherits(FoldMode, MixedFoldMode);\n\n});\n\ndefine('ace/mode/folding/mixed', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n    this.defaultMode = defaultMode;\n    this.subModes = subModes;\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n\n    this.$getMode = function(state) {\n        if (typeof state != \"string\") \n            state = state[0];\n        for (var key in this.subModes) {\n            if (state.indexOf(key) === 0)\n                return this.subModes[key];\n        }\n        return null;\n    };\n    \n    this.$tryMode = function(state, session, foldStyle, row) {\n        var mode = this.$getMode(state);\n        return (mode ? mode.getFoldWidget(session, foldStyle, row) : \"\");\n    };\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        return (\n            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n            this.defaultMode.getFoldWidget(session, foldStyle, row)\n        );\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var mode = this.$getMode(session.getState(row-1));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.$getMode(session.getState(row));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.defaultMode;\n        \n        return mode.getFoldWidgetRange(session, foldStyle, row);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/folding/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/range', 'ace/mode/folding/fold_mode', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (tag.closing)\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || this.voidElements[tag.tagName.toLowerCase()])\n            return \"\";\n\n        if (tag.selfClosing)\n            return \"\";\n\n        if (tag.value.indexOf(\"/\" + tag.tagName) !== -1)\n            return \"\";\n\n        return \"start\";\n    };\n    \n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var value = \"\";\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (token.type.lastIndexOf(\"meta.tag\", 0) === 0)\n                value += token.value;\n            else\n                value += lang.stringRepeat(\" \", token.value.length);\n        }\n        \n        return this._parseTag(value);\n    };\n\n    this.tagRe = /^(\\s*)(<?(\\/?)([-_a-zA-Z0-9:!]*)\\s*(\\/?)>?)/;\n    this._parseTag = function(tag) {\n        \n        var match = tag.match(this.tagRe);\n        var column = 0;\n\n        return {\n            value: tag,\n            match: match ? match[2] : \"\",\n            closing: match ? !!match[3] : false,\n            selfClosing: match ? !!match[5] || match[2] == \"/>\" : false,\n            tagName: match ? match[4] : \"\",\n            column: match[1] ? column + match[1].length : column\n        };\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n            \n        var value = \"\";\n        var start;\n        \n        do {\n            if (token.type.lastIndexOf(\"meta.tag\", 0) === 0) {\n                if (!start) {\n                    var start = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn()\n                    };\n                }\n                value += token.value;\n                if (value.indexOf(\">\") !== -1) {\n                    var tag = this._parseTag(value);\n                    tag.start = start;\n                    tag.end = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn() + token.value.length\n                    };\n                    iterator.stepForward();\n                    return tag;\n                }\n            }\n        } while(token = iterator.stepForward());\n        \n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n            \n        var value = \"\";\n        var end;\n\n        do {\n            if (token.type.lastIndexOf(\"meta.tag\", 0) === 0) {\n                if (!end) {\n                    end = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn() + token.value.length\n                    };\n                }\n                value = token.value + value;\n                if (value.indexOf(\"<\") !== -1) {\n                    var tag = this._parseTag(value);\n                    tag.end = end;\n                    tag.start = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn()\n                    };\n                    iterator.stepBackward();\n                    return tag;\n                }\n            }\n        } while(token = iterator.stepBackward());\n        \n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.voidElements[tag.tagName]) {\n                return;\n            }\n            else if (this.voidElements[top.tagName]) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag.match)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.column);\n            var start = {\n                row: row,\n                column: firstTag.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag)\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length);\n            var end = {\n                row: row,\n                column: firstTag.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag)\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/html_completions', ['require', 'exports', 'module' , 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\n\nvar commonAttributes = [\n    \"accesskey\",\n    \"class\",\n    \"contenteditable\",\n    \"contextmenu\",\n    \"dir\",\n    \"draggable\",\n    \"dropzone\",\n    \"hidden\",\n    \"id\",\n    \"lang\",\n    \"spellcheck\",\n    \"style\",\n    \"tabindex\",\n    \"title\",\n    \"translate\"\n];\n\nvar eventAttributes = [\n    \"onabort\",\n    \"onblur\",\n    \"oncancel\",\n    \"oncanplay\",\n    \"oncanplaythrough\",\n    \"onchange\",\n    \"onclick\",\n    \"onclose\",\n    \"oncontextmenu\",\n    \"oncuechange\",\n    \"ondblclick\",\n    \"ondrag\",\n    \"ondragend\",\n    \"ondragenter\",\n    \"ondragleave\",\n    \"ondragover\",\n    \"ondragstart\",\n    \"ondrop\",\n    \"ondurationchange\",\n    \"onemptied\",\n    \"onended\",\n    \"onerror\",\n    \"onfocus\",\n    \"oninput\",\n    \"oninvalid\",\n    \"onkeydown\",\n    \"onkeypress\",\n    \"onkeyup\",\n    \"onload\",\n    \"onloadeddata\",\n    \"onloadedmetadata\",\n    \"onloadstart\",\n    \"onmousedown\",\n    \"onmousemove\",\n    \"onmouseout\",\n    \"onmouseover\",\n    \"onmouseup\",\n    \"onmousewheel\",\n    \"onpause\",\n    \"onplay\",\n    \"onplaying\",\n    \"onprogress\",\n    \"onratechange\",\n    \"onreset\",\n    \"onscroll\",\n    \"onseeked\",\n    \"onseeking\",\n    \"onselect\",\n    \"onshow\",\n    \"onstalled\",\n    \"onsubmit\",\n    \"onsuspend\",\n    \"ontimeupdate\",\n    \"onvolumechange\",\n    \"onwaiting\"\n];\n\nvar globalAttributes = commonAttributes.concat(eventAttributes);\n\nvar attributeMap = {\n    \"html\": [\"manifest\"],\n    \"head\": [],\n    \"title\": [],\n    \"base\": [\"href\", \"target\"],\n    \"link\": [\"href\", \"hreflang\", \"rel\", \"media\", \"type\", \"sizes\"],\n    \"meta\": [\"http-equiv\", \"name\", \"content\", \"charset\"],\n    \"style\": [\"type\", \"media\", \"scoped\"],\n    \"script\": [\"charset\", \"type\", \"src\", \"defer\", \"async\"],\n    \"noscript\": [\"href\"],\n    \"body\": [\"onafterprint\", \"onbeforeprint\", \"onbeforeunload\", \"onhashchange\", \"onmessage\", \"onoffline\", \"onpopstate\", \"onredo\", \"onresize\", \"onstorage\", \"onundo\", \"onunload\"],\n    \"section\": [],\n    \"nav\": [],\n    \"article\": [\"pubdate\"],\n    \"aside\": [],\n    \"h1\": [],\n    \"h2\": [],\n    \"h3\": [],\n    \"h4\": [],\n    \"h5\": [],\n    \"h6\": [],\n    \"header\": [],\n    \"footer\": [],\n    \"address\": [],\n    \"main\": [],\n    \"p\": [],\n    \"hr\": [],\n    \"pre\": [],\n    \"blockquote\": [\"cite\"],\n    \"ol\": [\"start\", \"reversed\"],\n    \"ul\": [],\n    \"li\": [\"value\"],\n    \"dl\": [],\n    \"dt\": [],\n    \"dd\": [],\n    \"figure\": [],\n    \"figcaption\": [],\n    \"div\": [],\n    \"a\": [\"href\", \"target\", \"ping\", \"rel\", \"media\", \"hreflang\", \"type\"],\n    \"em\": [],\n    \"strong\": [],\n    \"small\": [],\n    \"s\": [],\n    \"cite\": [],\n    \"q\": [\"cite\"],\n    \"dfn\": [],\n    \"abbr\": [],\n    \"data\": [],\n    \"time\": [\"datetime\"],\n    \"code\": [],\n    \"var\": [],\n    \"samp\": [],\n    \"kbd\": [],\n    \"sub\": [],\n    \"sup\": [],\n    \"i\": [],\n    \"b\": [],\n    \"u\": [],\n    \"mark\": [],\n    \"ruby\": [],\n    \"rt\": [],\n    \"rp\": [],\n    \"bdi\": [],\n    \"bdo\": [],\n    \"span\": [],\n    \"br\": [],\n    \"wbr\": [],\n    \"ins\": [\"cite\", \"datetime\"],\n    \"del\": [\"cite\", \"datetime\"],\n    \"img\": [\"alt\", \"src\", \"height\", \"width\", \"usemap\", \"ismap\"],\n    \"iframe\": [\"name\", \"src\", \"height\", \"width\", \"sandbox\", \"seamless\"],\n    \"embed\": [\"src\", \"height\", \"width\", \"type\"],\n    \"object\": [\"param\", \"data\", \"type\", \"height\" , \"width\", \"usemap\", \"name\", \"form\", \"classid\"],\n    \"param\": [\"name\", \"value\"],\n    \"video\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\", \"width\", \"height\", \"poster\"],\n    \"audio\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\"],\n    \"source\": [\"src\", \"type\", \"media\"],\n    \"track\": [\"kind\", \"src\", \"srclang\", \"label\", \"default\"],\n    \"canvas\": [\"width\", \"height\"],\n    \"map\": [\"name\"],\n    \"area\": [\"shape\", \"coords\", \"href\", \"hreflang\", \"alt\", \"target\", \"media\", \"rel\", \"ping\", \"type\"],\n    \"svg\": [],\n    \"math\": [],\n    \"table\": [\"summary\"],\n    \"caption\": [],\n    \"colgroup\": [\"span\"],\n    \"col\": [\"span\"],\n    \"tbody\": [],\n    \"thead\": [],\n    \"tfoot\": [],\n    \"tr\": [],\n    \"td\": [\"headers\", \"rowspan\", \"colspan\"],\n    \"th\": [\"headers\", \"rowspan\", \"colspan\", \"scope\"],\n    \"form\": [\"accept-charset\", \"action\", \"autocomplete\", \"enctype\", \"method\", \"name\", \"novalidate\", \"target\"],\n    \"fieldset\": [\"disabled\", \"form\", \"name\"],\n    \"legend\": [],\n    \"label\": [\"form\", \"for\"],\n    \"input\": [\"type\", \"accept\", \"alt\", \"autocomplete\", \"checked\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"height\", \"list\", \"max\", \"maxlength\", \"min\", \"multiple\", \"pattern\", \"placeholder\", \"readonly\", \"required\", \"size\", \"src\", \"step\", \"width\", \"files\", \"value\"],\n    \"button\": [\"autofocus\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"name\", \"value\", \"type\"],\n    \"select\": [\"autofocus\", \"disabled\", \"form\", \"multiple\", \"name\", \"size\"],\n    \"datalist\": [],\n    \"optgroup\": [\"disabled\", \"label\"],\n    \"option\": [\"disabled\", \"selected\", \"label\", \"value\"],\n    \"textarea\": [\"autofocus\", \"disabled\", \"form\", \"maxlength\", \"name\", \"placeholder\", \"readonly\", \"required\", \"rows\", \"cols\", \"wrap\"],\n    \"keygen\": [\"autofocus\", \"challenge\", \"disabled\", \"form\", \"keytype\", \"name\"],\n    \"output\": [\"for\", \"form\", \"name\"],\n    \"progress\": [\"value\", \"max\"],\n    \"meter\": [\"value\", \"min\", \"max\", \"low\", \"high\", \"optimum\"],\n    \"details\": [\"open\"],\n    \"summary\": [],\n    \"command\": [\"type\", \"label\", \"icon\", \"disabled\", \"checked\", \"radiogroup\", \"command\"],\n    \"menu\": [\"type\", \"label\"],\n    \"dialog\": [\"open\"]\n};\n\nvar allElements = Object.keys(attributeMap);\n\nfunction hasType(token, type) {\n    var tokenTypes = token.type.split('.');\n    return type.split('.').every(function(type){\n        return (tokenTypes.indexOf(type) !== -1);\n    });\n}\n\nfunction findTagName(session, pos) {\n    var iterator = new TokenIterator(session, pos.row, pos.column);\n    var token = iterator.getCurrentToken();\n    if (!token || !hasType(token, 'tag') && !(hasType(token, 'text') && token.value.match('/'))){\n        do {\n            token = iterator.stepBackward();\n        } while (token && (hasType(token, 'string') || hasType(token, 'operator') || hasType(token, 'attribute-name') || hasType(token, 'text')));\n    }\n    if (token && hasType(token, 'tag-name') && !iterator.stepBackward().value.match('/'))\n        return token.value;\n}\n\nvar HtmlCompletions = function() {\n\n};\n\n(function() {\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        var token = session.getTokenAt(pos.row, pos.column);\n\n        if (!token)\n            return [];\n        if (hasType(token, \"tag-name\") || (token.value == '<' && hasType(token, \"text\")))\n            return this.getTagCompletions(state, session, pos, prefix);\n        if (hasType(token, 'text') || hasType(token, 'attribute-name'))\n            return this.getAttributeCompetions(state, session, pos, prefix);\n\n        return [];\n    };\n\n    this.getTagCompletions = function(state, session, pos, prefix) {\n        var elements = allElements;\n        if (prefix) {\n            elements = elements.filter(function(element){\n                return element.indexOf(prefix) === 0;\n            });\n        }\n        return elements.map(function(element){\n            return {\n                value: element,\n                meta: \"tag\"\n            };\n        });\n    };\n\n    this.getAttributeCompetions = function(state, session, pos, prefix) {\n        var tagName = findTagName(session, pos);\n        if (!tagName)\n            return [];\n        var attributes = globalAttributes;\n        if (tagName in attributeMap) {\n            attributes = attributes.concat(attributeMap[tagName]);\n        }\n        if (prefix) {\n            attributes = attributes.filter(function(attribute){\n                return attribute.indexOf(prefix) === 0;\n            });\n        }\n        return attributes.map(function(attribute){\n            return {\n                caption: attribute,\n                snippet: attribute + '=\"$0\"',\n                meta: \"attribute\"\n            };\n        });\n    };\n\n}).call(HtmlCompletions.prototype);\n\nexports.HtmlCompletions = HtmlCompletions;\n});\n"
  },
  {
    "path": "browser/plugins/ace/mode-javascript.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * 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 *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING 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 * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/javascript_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function() {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|[!$%&*+\\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /\\?|\\:|\\,|\\;|\\./,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token : \"keyword.operator\",\n                regex : /\\/=?/,\n                next  : \"start\"\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/\\\\w*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\"}\n        ],\n        \"comment\" : [\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\"}\n        ],\n        \"line_comment_regex_allowed\" : [\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\"}\n        ],\n        \"line_comment\" : [\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\"}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc.tag\",\n            regex : \"\\\\bTODO\\\\b\"\n        }, {\n            defaultToken : \"comment.doc\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\n\nvar autoInsertedBrackets = 0;\nvar autoInsertedRow = -1;\nvar autoInsertedLineEnd = \"\";\nvar maybeInsertedBrackets = 0;\nvar maybeInsertedRow = -1;\nvar maybeInsertedLineStart = \"\";\nvar maybeInsertedLineEnd = \"\";\n\nvar CstyleBehaviour = function () {\n    \n    CstyleBehaviour.isSaneInsertion = function(editor, session) {\n        var cursor = editor.getCursorPosition();\n        var iterator = new TokenIterator(session, cursor.row, cursor.column);\n        if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n            var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n            if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n                return false;\n        }\n        iterator.stepForward();\n        return iterator.getCurrentTokenRow() !== cursor.row ||\n            this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n    };\n    \n    CstyleBehaviour.$matchTokenType = function(token, types) {\n        return types.indexOf(token.type || token) > -1;\n    };\n    \n    CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0]))\n            autoInsertedBrackets = 0;\n        autoInsertedRow = cursor.row;\n        autoInsertedLineEnd = bracket + line.substr(cursor.column);\n        autoInsertedBrackets++;\n    };\n    \n    CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (!this.isMaybeInsertedClosing(cursor, line))\n            maybeInsertedBrackets = 0;\n        maybeInsertedRow = cursor.row;\n        maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n        maybeInsertedLineEnd = line.substr(cursor.column);\n        maybeInsertedBrackets++;\n    };\n    \n    CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n        return autoInsertedBrackets > 0 &&\n            cursor.row === autoInsertedRow &&\n            bracket === autoInsertedLineEnd[0] &&\n            line.substr(cursor.column) === autoInsertedLineEnd;\n    };\n    \n    CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n        return maybeInsertedBrackets > 0 &&\n            cursor.row === maybeInsertedRow &&\n            line.substr(cursor.column) === maybeInsertedLineEnd &&\n            line.substr(0, cursor.column) == maybeInsertedLineStart;\n    };\n    \n    CstyleBehaviour.popAutoInsertedClosing = function() {\n        autoInsertedLineEnd = autoInsertedLineEnd.substr(1);\n        autoInsertedBrackets--;\n    };\n    \n    CstyleBehaviour.clearMaybeInsertedClosing = function() {\n        maybeInsertedBrackets = 0;\n        maybeInsertedRow = -1;\n    };\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column])) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}' || closing !== \"\") {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString());\n                var next_indent = this.$getIndent(line);\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent + closing,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    if (!CstyleBehaviour.isSaneInsertion(editor, session))\n                        return;\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/mode-json.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * 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 *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING 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 * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/json', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/json_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle', 'ace/worker/worker_client'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar HighlightRules = require(\"./json_highlight_rules\").JsonHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\n\nvar Mode = function() {\n    this.HighlightRules = HighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/json_worker\", \"JsonWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"error\", function(e) {\n            session.setAnnotations([e.data]);\n        });\n\n        worker.on(\"ok\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/json_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JsonHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"variable\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]\\\\s*(?=:)'\n            }, {\n                token : \"string\", // single line\n                regex : '\"',\n                next  : \"string\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : \"invalid.illegal\", // single quoted strings are not allowed\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"invalid.illegal\", // comments are not allowed\n                regex : \"\\\\/\\\\/.*$\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"string\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : /\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[\"\\\\\\/bfnrt])/\n            }, {\n                token : \"string\",\n                regex : '[^\"\\\\\\\\]+'\n            }, {\n                token : \"string\",\n                regex : '\"',\n                next  : \"start\"\n            }, {\n                token : \"string\",\n                regex : \"\",\n                next  : \"start\"\n            }\n        ]\n    };\n    \n};\n\noop.inherits(JsonHighlightRules, TextHighlightRules);\n\nexports.JsonHighlightRules = JsonHighlightRules;\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\n\nvar autoInsertedBrackets = 0;\nvar autoInsertedRow = -1;\nvar autoInsertedLineEnd = \"\";\nvar maybeInsertedBrackets = 0;\nvar maybeInsertedRow = -1;\nvar maybeInsertedLineStart = \"\";\nvar maybeInsertedLineEnd = \"\";\n\nvar CstyleBehaviour = function () {\n    \n    CstyleBehaviour.isSaneInsertion = function(editor, session) {\n        var cursor = editor.getCursorPosition();\n        var iterator = new TokenIterator(session, cursor.row, cursor.column);\n        if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n            var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n            if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n                return false;\n        }\n        iterator.stepForward();\n        return iterator.getCurrentTokenRow() !== cursor.row ||\n            this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n    };\n    \n    CstyleBehaviour.$matchTokenType = function(token, types) {\n        return types.indexOf(token.type || token) > -1;\n    };\n    \n    CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0]))\n            autoInsertedBrackets = 0;\n        autoInsertedRow = cursor.row;\n        autoInsertedLineEnd = bracket + line.substr(cursor.column);\n        autoInsertedBrackets++;\n    };\n    \n    CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (!this.isMaybeInsertedClosing(cursor, line))\n            maybeInsertedBrackets = 0;\n        maybeInsertedRow = cursor.row;\n        maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n        maybeInsertedLineEnd = line.substr(cursor.column);\n        maybeInsertedBrackets++;\n    };\n    \n    CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n        return autoInsertedBrackets > 0 &&\n            cursor.row === autoInsertedRow &&\n            bracket === autoInsertedLineEnd[0] &&\n            line.substr(cursor.column) === autoInsertedLineEnd;\n    };\n    \n    CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n        return maybeInsertedBrackets > 0 &&\n            cursor.row === maybeInsertedRow &&\n            line.substr(cursor.column) === maybeInsertedLineEnd &&\n            line.substr(0, cursor.column) == maybeInsertedLineStart;\n    };\n    \n    CstyleBehaviour.popAutoInsertedClosing = function() {\n        autoInsertedLineEnd = autoInsertedLineEnd.substr(1);\n        autoInsertedBrackets--;\n    };\n    \n    CstyleBehaviour.clearMaybeInsertedClosing = function() {\n        maybeInsertedBrackets = 0;\n        maybeInsertedRow = -1;\n    };\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column])) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}' || closing !== \"\") {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString());\n                var next_indent = this.$getIndent(line);\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent + closing,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    if (!CstyleBehaviour.isSaneInsertion(editor, session))\n                        return;\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/mode-svg.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * 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 *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING 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 * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/mode/svg', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/xml', 'ace/mode/javascript', 'ace/tokenizer', 'ace/mode/svg_highlight_rules', 'ace/mode/folding/mixed', 'ace/mode/folding/xml', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar XmlMode = require(\"./xml\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar SvgHighlightRules = require(\"./svg_highlight_rules\").SvgHighlightRules;\nvar MixedFoldMode = require(\"./folding/mixed\").FoldMode;\nvar XmlFoldMode = require(\"./folding/xml\").FoldMode;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    XmlMode.call(this);\n    \n    this.HighlightRules = SvgHighlightRules;\n    \n    this.createModeDelegates({\n        \"js-\": JavaScriptMode\n    });\n    \n    this.foldingRules = new MixedFoldMode(new XmlFoldMode({}), {\n        \"js-\": new CStyleFoldMode()\n    });\n};\n\noop.inherits(Mode, XmlMode);\n\n(function() {\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n    \n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/xml_highlight_rules', 'ace/mode/behaviour/xml', 'ace/mode/folding/xml'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar XmlFoldMode = require(\"./folding/xml\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = XmlHighlightRules;\n    this.$behaviour = new XmlBehaviour();\n    this.foldingRules = new XmlFoldMode();\n};\n\noop.inherits(Mode, TextMode);\n\n(function() {\n    \n    this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/xml_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/xml_util', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar xmlUtil = require(\"./xml_util\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"punctuation.string.begin\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.instruction.begin\", \"keyword.instruction\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_declaration\"\n            },\n            {\n                token : [\"punctuation.instruction.begin\", \"keyword.instruction\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"instruction\"\n            },\n            {token : \"comment\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"punctuation.doctype.begin\", \"meta.tag.doctype\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\"\n            },\n            {include : \"tag\"},\n            {include : \"reference\"}\n        ],\n\n        xml_declaration : [\n            {include : \"attributes\"},\n            {include : \"instruction\"}\n        ],\n\n        instruction : [\n            {token : \"punctuation.instruction.end\", regex : \"\\\\?>\", next : \"start\"}\n        ],\n\n        doctype : [\n            {include : \"space\"},\n            {include : \"string\"},\n            {token : \"punctuation.doctype.end\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.begin\", regex : \"\\\\[\", push : \"declarations\"}\n        ],\n\n        declarations : [{\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.end\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.begin\", \"keyword\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.end\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.end\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text\", regex : \"\\\\s+\"},\n            {token : \"text\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment\"}\n        ],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.begin\", \"meta.tag.name\"],\n            regex : \"(<)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.end\", regex : \"/?>\", next : \"start\"}\n            ]\n        }, {\n            token : [\"meta.tag.punctuation.begin\", \"meta.tag.name\"],\n            regex : \"(</)((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"space\"},\n                {token : \"meta.tag.punctuation.end\", regex : \">\", next : \"start\"}\n            ]\n        }],\n\n        space : [\n            {token : \"text\", regex : \"\\\\s+\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }, {\n            token : \"invalid.illegal\", regex : \"&\"\n        }],\n\n        string: [{\n            token : \"string\",\n            regex : \"'\",\n            push : \"qstring_inner\"\n        }, {\n            token : \"string\",\n            regex : '\"',\n            push : \"qqstring_inner\"\n        }],\n\n        qstring_inner: [\n            {token : \"string\", regex: \"'\", next: \"pop\"},\n            {include : \"reference\"},\n            {defaultToken : \"string\"}\n        ],\n\n        qqstring_inner: [\n            {token : \"string\", regex: '\"', next: \"pop\"},\n            {include : \"reference\"},\n            {defaultToken : \"string\"}\n        ],\n\n        attributes: [{\n            token : \"entity.other.attribute-name\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.separator\",\n            regex : \"=\"\n        }, {\n            include : \"space\"\n        }, {\n            include : \"string\"\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.begin\", \"meta.tag.name.\" + tag],\n            regex : \"(<)(\" + tag + \")\",\n            next: [\n                {include : \"space\"},\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.end\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"space\"},\n            {token : \"meta.tag.punctuation.end\", regex : \">\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.begin\", \"meta.tag.name.\" + tag],\n            regex : \"(</)(\" + tag + \")\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.begin\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.end\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\ndefine('ace/mode/xml_util', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nfunction string(state) {\n    return [{\n        token : \"string\",\n        regex : '\"',\n        next : state + \"_qqstring\"\n    }, {\n        token : \"string\",\n        regex : \"'\",\n        next : state + \"_qstring\"\n    }];\n}\n\nfunction multiLineString(quote, state) {\n    return [\n        {token : \"string\", regex : quote, next : state},\n        {\n            token : \"constant.language.escape\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\" \n        },\n        {defaultToken : \"string\"}\n    ];\n}\n\nexports.tag = function(states, name, nextState, tagMap) {\n    states[name] = [{\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }, {\n        \n    token : !tagMap ? \"meta.tag.tag-name\" : function(value) {\n            if (tagMap[value])\n                return \"meta.tag.tag-name.\" + tagMap[value];\n            else\n                return \"meta.tag.tag-name\";\n        },\n        regex : \"[-_a-zA-Z0-9:]+\",\n        next : name + \"_embed_attribute_list\" \n    }, {\n        token: \"empty\",\n        regex: \"\",\n        next : name + \"_embed_attribute_list\"\n    }];\n\n    states[name + \"_qstring\"] = multiLineString(\"'\", name + \"_embed_attribute_list\");\n    states[name + \"_qqstring\"] = multiLineString(\"\\\"\", name + \"_embed_attribute_list\");\n    \n    states[name + \"_embed_attribute_list\"] = [{\n        token : \"meta.tag.r\",\n        regex : \"/?>\",\n        next : nextState\n    }, {\n        token : \"keyword.operator\",\n        regex : \"=\"\n    }, {\n        token : \"entity.other.attribute-name\",\n        regex : \"[-_a-zA-Z0-9:]+\"\n    }, {\n        token : \"constant.numeric\", // float\n        regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n    }, {\n        token : \"text\",\n        regex : \"\\\\s+\"\n    }].concat(string(name));\n};\n\n});\n\ndefine('ace/mode/behaviour/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/mode/behaviour/cstyle', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nfunction hasType(token, type) {\n    var tokenTypes = token.type.split('.');\n    return type.split('.').every(function(type){\n        return (tokenTypes.indexOf(type) !== -1);\n    });\n    return hasType;\n}\n\nvar XmlBehaviour = function () {\n    \n    this.inherit(CstyleBehaviour, [\"string_dquotes\"]); // Get string behaviour\n    \n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken();\n\n            if (token && hasType(token, 'string') && iterator.getCurrentTokenColumn() + token.value.length > position.column)\n                return;\n            var atCursor = false;\n            if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){\n                do {\n                    token = iterator.stepBackward();\n                } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text')));\n            } else {\n                atCursor = true;\n            }\n            if (!token || !hasType(token, 'meta.tag.name') || iterator.stepBackward().value.match('/')) {\n                return;\n            }\n            var tag = token.value;\n            if (atCursor){\n                var tag = tag.substring(0, position.column - token.start);\n            }\n\n            return {\n               text: '>' + '</' + tag + '>',\n               selection: [1, 1]\n            }\n        }\n    });\n\n    this.add('autoindent', 'insertion', function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.getLine(cursor.row);\n            var rightChars = line.substring(cursor.column, cursor.column + 2);\n            if (rightChars == '</') {\n                var next_indent = this.$getIndent(line);\n                var indent = next_indent + session.getTabString();\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent,\n                    selection: [1, indent.length, 1, indent.length]\n                }\n            }\n        }\n    });\n    \n}\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\ndefine('ace/mode/behaviour/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/behaviour', 'ace/token_iterator', 'ace/lib/lang'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\n\nvar autoInsertedBrackets = 0;\nvar autoInsertedRow = -1;\nvar autoInsertedLineEnd = \"\";\nvar maybeInsertedBrackets = 0;\nvar maybeInsertedRow = -1;\nvar maybeInsertedLineStart = \"\";\nvar maybeInsertedLineEnd = \"\";\n\nvar CstyleBehaviour = function () {\n    \n    CstyleBehaviour.isSaneInsertion = function(editor, session) {\n        var cursor = editor.getCursorPosition();\n        var iterator = new TokenIterator(session, cursor.row, cursor.column);\n        if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n            var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n            if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n                return false;\n        }\n        iterator.stepForward();\n        return iterator.getCurrentTokenRow() !== cursor.row ||\n            this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n    };\n    \n    CstyleBehaviour.$matchTokenType = function(token, types) {\n        return types.indexOf(token.type || token) > -1;\n    };\n    \n    CstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (!this.isAutoInsertedClosing(cursor, line, autoInsertedLineEnd[0]))\n            autoInsertedBrackets = 0;\n        autoInsertedRow = cursor.row;\n        autoInsertedLineEnd = bracket + line.substr(cursor.column);\n        autoInsertedBrackets++;\n    };\n    \n    CstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (!this.isMaybeInsertedClosing(cursor, line))\n            maybeInsertedBrackets = 0;\n        maybeInsertedRow = cursor.row;\n        maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n        maybeInsertedLineEnd = line.substr(cursor.column);\n        maybeInsertedBrackets++;\n    };\n    \n    CstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n        return autoInsertedBrackets > 0 &&\n            cursor.row === autoInsertedRow &&\n            bracket === autoInsertedLineEnd[0] &&\n            line.substr(cursor.column) === autoInsertedLineEnd;\n    };\n    \n    CstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n        return maybeInsertedBrackets > 0 &&\n            cursor.row === maybeInsertedRow &&\n            line.substr(cursor.column) === maybeInsertedLineEnd &&\n            line.substr(0, cursor.column) == maybeInsertedLineStart;\n    };\n    \n    CstyleBehaviour.popAutoInsertedClosing = function() {\n        autoInsertedLineEnd = autoInsertedLineEnd.substr(1);\n        autoInsertedBrackets--;\n    };\n    \n    CstyleBehaviour.clearMaybeInsertedClosing = function() {\n        maybeInsertedBrackets = 0;\n        maybeInsertedRow = -1;\n    };\n\n    this.add(\"braces\", \"insertion\", function (state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column])) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}' || closing !== \"\") {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n\n                var indent = this.getNextLineIndent(state, line.substring(0, cursor.column), session.getTabString());\n                var next_indent = this.$getIndent(line);\n\n                return {\n                    text: '\\n' + indent + '\\n' + next_indent + closing,\n                    selection: [1, indent.length, 1, indent.length]\n                };\n            }\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '(') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '[') {\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                if (leftChar == '\\\\') {\n                    return null;\n                }\n                var tokens = session.getTokens(selection.start.row);\n                var col = 0, token;\n                var quotepos = -1; // Track whether we're inside an open quote.\n\n                for (var x = 0; x < tokens.length; x++) {\n                    token = tokens[x];\n                    if (token.type == \"string\") {\n                      quotepos = -1;\n                    } else if (quotepos < 0) {\n                      quotepos = token.value.indexOf(quote);\n                    }\n                    if ((token.value.length + col) > selection.start.column) {\n                        break;\n                    }\n                    col += tokens[x].value.length;\n                }\n                if (!token || (quotepos < 0 && token.type !== \"comment\" && (token.type !== \"string\" || ((selection.start.column !== token.value.length+col-1) && token.value.lastIndexOf(quote) === token.value.length-1)))) {\n                    if (!CstyleBehaviour.isSaneInsertion(editor, session))\n                        return;\n                    return {\n                        text: quote + quote,\n                        selection: [1,1]\n                    };\n                } else if (token && token.type === \"string\") {\n                    var rightChar = line.substring(cursor.column, cursor.column + 1);\n                    if (rightChar == quote) {\n                        return {\n                            text: '',\n                            selection: [1, 1]\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine('ace/mode/folding/xml', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/range', 'ace/mode/folding/fold_mode', 'ace/token_iterator'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (tag.closing)\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || this.voidElements[tag.tagName.toLowerCase()])\n            return \"\";\n\n        if (tag.selfClosing)\n            return \"\";\n\n        if (tag.value.indexOf(\"/\" + tag.tagName) !== -1)\n            return \"\";\n\n        return \"start\";\n    };\n    \n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var value = \"\";\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (token.type.lastIndexOf(\"meta.tag\", 0) === 0)\n                value += token.value;\n            else\n                value += lang.stringRepeat(\" \", token.value.length);\n        }\n        \n        return this._parseTag(value);\n    };\n\n    this.tagRe = /^(\\s*)(<?(\\/?)([-_a-zA-Z0-9:!]*)\\s*(\\/?)>?)/;\n    this._parseTag = function(tag) {\n        \n        var match = tag.match(this.tagRe);\n        var column = 0;\n\n        return {\n            value: tag,\n            match: match ? match[2] : \"\",\n            closing: match ? !!match[3] : false,\n            selfClosing: match ? !!match[5] || match[2] == \"/>\" : false,\n            tagName: match ? match[4] : \"\",\n            column: match[1] ? column + match[1].length : column\n        };\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n            \n        var value = \"\";\n        var start;\n        \n        do {\n            if (token.type.lastIndexOf(\"meta.tag\", 0) === 0) {\n                if (!start) {\n                    var start = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn()\n                    };\n                }\n                value += token.value;\n                if (value.indexOf(\">\") !== -1) {\n                    var tag = this._parseTag(value);\n                    tag.start = start;\n                    tag.end = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn() + token.value.length\n                    };\n                    iterator.stepForward();\n                    return tag;\n                }\n            }\n        } while(token = iterator.stepForward());\n        \n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n            \n        var value = \"\";\n        var end;\n\n        do {\n            if (token.type.lastIndexOf(\"meta.tag\", 0) === 0) {\n                if (!end) {\n                    end = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn() + token.value.length\n                    };\n                }\n                value = token.value + value;\n                if (value.indexOf(\"<\") !== -1) {\n                    var tag = this._parseTag(value);\n                    tag.end = end;\n                    tag.start = {\n                        row: iterator.getCurrentTokenRow(),\n                        column: iterator.getCurrentTokenColumn()\n                    };\n                    iterator.stepBackward();\n                    return tag;\n                }\n            }\n        } while(token = iterator.stepBackward());\n        \n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.voidElements[tag.tagName]) {\n                return;\n            }\n            else if (this.voidElements[top.tagName]) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag.match)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.column);\n            var start = {\n                row: row,\n                column: firstTag.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag)\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.column + firstTag.match.length);\n            var end = {\n                row: row,\n                column: firstTag.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag)\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/javascript', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text', 'ace/tokenizer', 'ace/mode/javascript_highlight_rules', 'ace/mode/matching_brace_outdent', 'ace/range', 'ace/worker/worker_client', 'ace/mode/behaviour/cstyle', 'ace/mode/folding/cstyle'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\ndefine('ace/mode/javascript_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/doc_comment_highlight_rules', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function() {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|[!$%&*+\\-~]|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|\\*=|%=|\\+=|\\-=|&=|\\^=/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /\\?|\\:|\\,|\\;|\\./,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token : \"keyword.operator\",\n                regex : /\\/=?/,\n                next  : \"start\"\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/\\\\w*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\"}\n        ],\n        \"comment\" : [\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\"}\n        ],\n        \"line_comment_regex_allowed\" : [\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\"}\n        ],\n        \"line_comment\" : [\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\"}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\ndefine('ace/mode/doc_comment_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/text_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, {\n            token : \"comment.doc.tag\",\n            regex : \"\\\\bTODO\\\\b\"\n        }, {\n            defaultToken : \"comment.doc\"\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\ndefine('ace/mode/matching_brace_outdent', ['require', 'exports', 'module' , 'ace/range'], function(require, exports, module) {\n\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine('ace/mode/folding/cstyle', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/range', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\ndefine('ace/mode/svg_highlight_rules', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/javascript_highlight_rules', 'ace/mode/xml_highlight_rules'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar SvgHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    this.normalizeRules();\n};\n\noop.inherits(SvgHighlightRules, XmlHighlightRules);\n\nexports.SvgHighlightRules = SvgHighlightRules;\n});\n\ndefine('ace/mode/folding/mixed', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/mode/folding/fold_mode'], function(require, exports, module) {\n\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n    this.defaultMode = defaultMode;\n    this.subModes = subModes;\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n\n    this.$getMode = function(state) {\n        if (typeof state != \"string\") \n            state = state[0];\n        for (var key in this.subModes) {\n            if (state.indexOf(key) === 0)\n                return this.subModes[key];\n        }\n        return null;\n    };\n    \n    this.$tryMode = function(state, session, foldStyle, row) {\n        var mode = this.$getMode(state);\n        return (mode ? mode.getFoldWidget(session, foldStyle, row) : \"\");\n    };\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        return (\n            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n            this.defaultMode.getFoldWidget(session, foldStyle, row)\n        );\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var mode = this.$getMode(session.getState(row-1));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.$getMode(session.getState(row));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.defaultMode;\n        \n        return mode.getFoldWidgetRange(session, foldStyle, row);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/ace.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * 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 *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING 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 * ***** END LICENSE BLOCK ***** */\n\n/**\n * Define a module along with a payload\n * @param module a name for the payload\n * @param payload a function to call with (require, exports, module) params\n */\n\n(function() {\n\nvar ACE_NAMESPACE = \"ace\";\n\nvar global = (function() {\n    return this;\n})();\n\n\nif (!ACE_NAMESPACE && typeof requirejs !== \"undefined\")\n    return;\n\n\nvar _define = function(module, deps, payload) {\n    if (typeof module !== 'string') {\n        if (_define.original)\n            _define.original.apply(window, arguments);\n        else {\n            console.error('dropping module because define wasn\\'t a string.');\n            console.trace();\n        }\n        return;\n    }\n\n    if (arguments.length == 2)\n        payload = deps;\n\n    if (!_define.modules) {\n        _define.modules = {};\n        _define.payloads = {};\n    }\n\n    _define.payloads[module] = payload;\n    _define.modules[module] = null;\n};\n\n/**\n * Get at functionality ace.define()ed using the function above\n */\nvar _require = function(parentId, module, callback) {\n    if (Object.prototype.toString.call(module) === \"[object Array]\") {\n        var params = [];\n        for (var i = 0, l = module.length; i < l; ++i) {\n            var dep = lookup(parentId, module[i]);\n            if (!dep && _require.original)\n                return _require.original.apply(window, arguments);\n            params.push(dep);\n        }\n        if (callback) {\n            callback.apply(null, params);\n        }\n    }\n    else if (typeof module === 'string') {\n        var payload = lookup(parentId, module);\n        if (!payload && _require.original)\n            return _require.original.apply(window, arguments);\n\n        if (callback) {\n            callback();\n        }\n\n        return payload;\n    }\n    else {\n        if (_require.original)\n            return _require.original.apply(window, arguments);\n    }\n};\n\nvar normalizeModule = function(parentId, moduleName) {\n    // normalize plugin requires\n    if (moduleName.indexOf(\"!\") !== -1) {\n        var chunks = moduleName.split(\"!\");\n        return normalizeModule(parentId, chunks[0]) + \"!\" + normalizeModule(parentId, chunks[1]);\n    }\n    // normalize relative requires\n    if (moduleName.charAt(0) == \".\") {\n        var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n        moduleName = base + \"/\" + moduleName;\n\n        while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n            var previous = moduleName;\n            moduleName = moduleName.replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n        }\n    }\n\n    return moduleName;\n};\n\n/**\n * Internal function to lookup moduleNames and resolve them by calling the\n * definition function if needed.\n */\nvar lookup = function(parentId, moduleName) {\n\n    moduleName = normalizeModule(parentId, moduleName);\n\n    var module = _define.modules[moduleName];\n    if (!module) {\n        module = _define.payloads[moduleName];\n        if (typeof module === 'function') {\n            var exports = {};\n            var mod = {\n                id: moduleName,\n                uri: '',\n                exports: exports,\n                packaged: true\n            };\n\n            var req = function(module, callback) {\n                return _require(moduleName, module, callback);\n            };\n\n            var returnValue = module(req, exports, mod);\n            exports = returnValue || mod.exports;\n            _define.modules[moduleName] = exports;\n            delete _define.payloads[moduleName];\n        }\n        module = _define.modules[moduleName] = exports || module;\n    }\n    return module;\n};\n\nfunction exportAce(ns) {\n    var require = function(module, callback) {\n        return _require(\"\", module, callback);\n    };\n\n    var root = global;\n    if (ns) {\n        if (!global[ns])\n            global[ns] = {};\n        root = global[ns];\n    }\n\n    if (!root.define || !root.define.packaged) {\n        _define.original = root.define;\n        root.define = _define;\n        root.define.packaged = true;\n    }\n\n    if (!root.require || !root.require.packaged) {\n        _require.original = root.require;\n        root.require = require;\n        root.require.packaged = true;\n    }\n}\n\nexportAce(ACE_NAMESPACE);\n\n})();\n\nace.define(\"ace/lib/regexp\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\n    var real = {\n            exec: RegExp.prototype.exec,\n            test: RegExp.prototype.test,\n            match: String.prototype.match,\n            replace: String.prototype.replace,\n            split: String.prototype.split\n        },\n        compliantExecNpcg = real.exec.call(/()??/, \"\")[1] === undefined, // check `exec` handling of nonparticipating capturing groups\n        compliantLastIndexIncrement = function () {\n            var x = /^/g;\n            real.test.call(x, \"\");\n            return !x.lastIndex;\n        }();\n\n    if (compliantLastIndexIncrement && compliantExecNpcg)\n        return;\n    RegExp.prototype.exec = function (str) {\n        var match = real.exec.apply(this, arguments),\n            name, r2;\n        if ( typeof(str) == 'string' && match) {\n            if (!compliantExecNpcg && match.length > 1 && indexOf(match, \"\") > -1) {\n                r2 = RegExp(this.source, real.replace.call(getNativeFlags(this), \"g\", \"\"));\n                real.replace.call(str.slice(match.index), r2, function () {\n                    for (var i = 1; i < arguments.length - 2; i++) {\n                        if (arguments[i] === undefined)\n                            match[i] = undefined;\n                    }\n                });\n            }\n            if (this._xregexp && this._xregexp.captureNames) {\n                for (var i = 1; i < match.length; i++) {\n                    name = this._xregexp.captureNames[i - 1];\n                    if (name)\n                       match[name] = match[i];\n                }\n            }\n            if (!compliantLastIndexIncrement && this.global && !match[0].length && (this.lastIndex > match.index))\n                this.lastIndex--;\n        }\n        return match;\n    };\n    if (!compliantLastIndexIncrement) {\n        RegExp.prototype.test = function (str) {\n            var match = real.exec.call(this, str);\n            if (match && this.global && !match[0].length && (this.lastIndex > match.index))\n                this.lastIndex--;\n            return !!match;\n        };\n    }\n\n    function getNativeFlags (regex) {\n        return (regex.global     ? \"g\" : \"\") +\n               (regex.ignoreCase ? \"i\" : \"\") +\n               (regex.multiline  ? \"m\" : \"\") +\n               (regex.extended   ? \"x\" : \"\") + // Proposed for ES4; included in AS3\n               (regex.sticky     ? \"y\" : \"\");\n    }\n\n    function indexOf (array, item, from) {\n        if (Array.prototype.indexOf) // Use the native array method if available\n            return array.indexOf(item, from);\n        for (var i = from || 0; i < array.length; i++) {\n            if (array[i] === item)\n                return i;\n        }\n        return -1;\n    }\n\n});\n\nace.define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\nfunction Empty() {}\n\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function bind(that) { // .length is 1\n        var target = this;\n        if (typeof target != \"function\") {\n            throw new TypeError(\"Function.prototype.bind called on incompatible \" + target);\n        }\n        var args = slice.call(arguments, 1); // for normal call\n        var bound = function () {\n\n            if (this instanceof bound) {\n\n                var result = target.apply(\n                    this,\n                    args.concat(slice.call(arguments))\n                );\n                if (Object(result) === result) {\n                    return result;\n                }\n                return this;\n\n            } else {\n                return target.apply(\n                    that,\n                    args.concat(slice.call(arguments))\n                );\n\n            }\n\n        };\n        if(target.prototype) {\n            Empty.prototype = target.prototype;\n            bound.prototype = new Empty();\n            Empty.prototype = null;\n        }\n        return bound;\n    };\n}\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar _toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n    defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n    defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n    lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n    lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\nif ([1,2].splice(0).length != 2) {\n    if(function() { // test IE < 9 to splice bug - see issue #138\n        function makeArray(l) {\n            var a = new Array(l+2);\n            a[0] = a[1] = 0;\n            return a;\n        }\n        var array = [], lengthBefore;\n        \n        array.splice.apply(array, makeArray(20));\n        array.splice.apply(array, makeArray(26));\n\n        lengthBefore = array.length; //46\n        array.splice(5, 0, \"XXX\"); // add one element\n\n        lengthBefore + 1 == array.length\n\n        if (lengthBefore + 1 == array.length) {\n            return true;// has right splice implementation without bugs\n        }\n    }()) {//IE 6/7\n        var array_splice = Array.prototype.splice;\n        Array.prototype.splice = function(start, deleteCount) {\n            if (!arguments.length) {\n                return [];\n            } else {\n                return array_splice.apply(this, [\n                    start === void 0 ? 0 : start,\n                    deleteCount === void 0 ? (this.length - start) : deleteCount\n                ].concat(slice.call(arguments, 2)))\n            }\n        };\n    } else {//IE8\n        Array.prototype.splice = function(pos, removeCount){\n            var length = this.length;\n            if (pos > 0) {\n                if (pos > length)\n                    pos = length;\n            } else if (pos == void 0) {\n                pos = 0;\n            } else if (pos < 0) {\n                pos = Math.max(length + pos, 0);\n            }\n\n            if (!(pos+removeCount < length))\n                removeCount = length - pos;\n\n            var removed = this.slice(pos, pos+removeCount);\n            var insert = slice.call(arguments, 2);\n            var add = insert.length;            \n            if (pos === length) {\n                if (add) {\n                    this.push.apply(this, insert);\n                }\n            } else {\n                var remove = Math.min(removeCount, length - pos);\n                var tailOldPos = pos + remove;\n                var tailNewPos = tailOldPos + add - remove;\n                var tailCount = length - tailOldPos;\n                var lengthAfterRemove = length - remove;\n\n                if (tailNewPos < tailOldPos) { // case A\n                    for (var i = 0; i < tailCount; ++i) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } else if (tailNewPos > tailOldPos) { // case B\n                    for (i = tailCount; i--; ) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } // else, add == remove (nothing to do)\n\n                if (add && pos === lengthAfterRemove) {\n                    this.length = lengthAfterRemove; // truncate array\n                    this.push.apply(this, insert);\n                } else {\n                    this.length = lengthAfterRemove + add; // reserves space\n                    for (i = 0; i < add; ++i) {\n                        this[pos+i] = insert[i];\n                    }\n                }\n            }\n            return removed;\n        };\n    }\n}\nif (!Array.isArray) {\n    Array.isArray = function isArray(obj) {\n        return _toString(obj) == \"[object Array]\";\n    };\n}\nvar boxedString = Object(\"a\"),\n    splitString = boxedString[0] != \"a\" || !(0 in boxedString);\n\nif (!Array.prototype.forEach) {\n    Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            thisp = arguments[1],\n            i = -1,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        while (++i < length) {\n            if (i in self) {\n                fun.call(thisp, self[i], i, object);\n            }\n        }\n    };\n}\nif (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            result = Array(length),\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self)\n                result[i] = fun.call(thisp, self[i], i, object);\n        }\n        return result;\n    };\n}\nif (!Array.prototype.filter) {\n    Array.prototype.filter = function filter(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                    object,\n            length = self.length >>> 0,\n            result = [],\n            value,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self) {\n                value = self[i];\n                if (fun.call(thisp, value, i, object)) {\n                    result.push(value);\n                }\n            }\n        }\n        return result;\n    };\n}\nif (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && !fun.call(thisp, self[i], i, object)) {\n                return false;\n            }\n        }\n        return true;\n    };\n}\nif (!Array.prototype.some) {\n    Array.prototype.some = function some(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, object)) {\n                return true;\n            }\n        }\n        return false;\n    };\n}\nif (!Array.prototype.reduce) {\n    Array.prototype.reduce = function reduce(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduce of empty array with no initial value\");\n        }\n\n        var i = 0;\n        var result;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i++];\n                    break;\n                }\n                if (++i >= length) {\n                    throw new TypeError(\"reduce of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        for (; i < length; i++) {\n            if (i in self) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        }\n\n        return result;\n    };\n}\nif (!Array.prototype.reduceRight) {\n    Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduceRight of empty array with no initial value\");\n        }\n\n        var result, i = length - 1;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i--];\n                    break;\n                }\n                if (--i < 0) {\n                    throw new TypeError(\"reduceRight of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        do {\n            if (i in this) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        } while (i--);\n\n        return result;\n    };\n}\nif (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {\n    Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n\n        var i = 0;\n        if (arguments.length > 1) {\n            i = toInteger(arguments[1]);\n        }\n        i = i >= 0 ? i : Math.max(0, length + i);\n        for (; i < length; i++) {\n            if (i in self && self[i] === sought) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {\n    Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n        var i = length - 1;\n        if (arguments.length > 1) {\n            i = Math.min(i, toInteger(arguments[1]));\n        }\n        i = i >= 0 ? i : length - Math.abs(i);\n        for (; i >= 0; i--) {\n            if (i in self && sought === self[i]) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Object.getPrototypeOf) {\n    Object.getPrototypeOf = function getPrototypeOf(object) {\n        return object.__proto__ || (\n            object.constructor ?\n            object.constructor.prototype :\n            prototypeOfObject\n        );\n    };\n}\nif (!Object.getOwnPropertyDescriptor) {\n    var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n                         \"non-object: \";\n    Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT + object);\n        if (!owns(object, property))\n            return;\n\n        var descriptor, getter, setter;\n        descriptor =  { enumerable: true, configurable: true };\n        if (supportsAccessors) {\n            var prototype = object.__proto__;\n            object.__proto__ = prototypeOfObject;\n\n            var getter = lookupGetter(object, property);\n            var setter = lookupSetter(object, property);\n            object.__proto__ = prototype;\n\n            if (getter || setter) {\n                if (getter) descriptor.get = getter;\n                if (setter) descriptor.set = setter;\n                return descriptor;\n            }\n        }\n        descriptor.value = object[property];\n        return descriptor;\n    };\n}\nif (!Object.getOwnPropertyNames) {\n    Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n        return Object.keys(object);\n    };\n}\nif (!Object.create) {\n    var createEmpty;\n    if (Object.prototype.__proto__ === null) {\n        createEmpty = function () {\n            return { \"__proto__\": null };\n        };\n    } else {\n        createEmpty = function () {\n            var empty = {};\n            for (var i in empty)\n                empty[i] = null;\n            empty.constructor =\n            empty.hasOwnProperty =\n            empty.propertyIsEnumerable =\n            empty.isPrototypeOf =\n            empty.toLocaleString =\n            empty.toString =\n            empty.valueOf =\n            empty.__proto__ = null;\n            return empty;\n        }\n    }\n\n    Object.create = function create(prototype, properties) {\n        var object;\n        if (prototype === null) {\n            object = createEmpty();\n        } else {\n            if (typeof prototype != \"object\")\n                throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n            var Type = function () {};\n            Type.prototype = prototype;\n            object = new Type();\n            object.__proto__ = prototype;\n        }\n        if (properties !== void 0)\n            Object.defineProperties(object, properties);\n        return object;\n    };\n}\n\nfunction doesDefinePropertyWork(object) {\n    try {\n        Object.defineProperty(object, \"sentinel\", {});\n        return \"sentinel\" in object;\n    } catch (exception) {\n    }\n}\nif (Object.defineProperty) {\n    var definePropertyWorksOnObject = doesDefinePropertyWork({});\n    var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n        doesDefinePropertyWork(document.createElement(\"div\"));\n    if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n        var definePropertyFallback = Object.defineProperty;\n    }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n    var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n    var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n    var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n                                      \"on this javascript engine\";\n\n    Object.defineProperty = function defineProperty(object, property, descriptor) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n        if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n            throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n        if (definePropertyFallback) {\n            try {\n                return definePropertyFallback.call(Object, object, property, descriptor);\n            } catch (exception) {\n            }\n        }\n        if (owns(descriptor, \"value\")) {\n\n            if (supportsAccessors && (lookupGetter(object, property) ||\n                                      lookupSetter(object, property)))\n            {\n                var prototype = object.__proto__;\n                object.__proto__ = prototypeOfObject;\n                delete object[property];\n                object[property] = descriptor.value;\n                object.__proto__ = prototype;\n            } else {\n                object[property] = descriptor.value;\n            }\n        } else {\n            if (!supportsAccessors)\n                throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n            if (owns(descriptor, \"get\"))\n                defineGetter(object, property, descriptor.get);\n            if (owns(descriptor, \"set\"))\n                defineSetter(object, property, descriptor.set);\n        }\n\n        return object;\n    };\n}\nif (!Object.defineProperties) {\n    Object.defineProperties = function defineProperties(object, properties) {\n        for (var property in properties) {\n            if (owns(properties, property))\n                Object.defineProperty(object, property, properties[property]);\n        }\n        return object;\n    };\n}\nif (!Object.seal) {\n    Object.seal = function seal(object) {\n        return object;\n    };\n}\nif (!Object.freeze) {\n    Object.freeze = function freeze(object) {\n        return object;\n    };\n}\ntry {\n    Object.freeze(function () {});\n} catch (exception) {\n    Object.freeze = (function freeze(freezeObject) {\n        return function freeze(object) {\n            if (typeof object == \"function\") {\n                return object;\n            } else {\n                return freezeObject(object);\n            }\n        };\n    })(Object.freeze);\n}\nif (!Object.preventExtensions) {\n    Object.preventExtensions = function preventExtensions(object) {\n        return object;\n    };\n}\nif (!Object.isSealed) {\n    Object.isSealed = function isSealed(object) {\n        return false;\n    };\n}\nif (!Object.isFrozen) {\n    Object.isFrozen = function isFrozen(object) {\n        return false;\n    };\n}\nif (!Object.isExtensible) {\n    Object.isExtensible = function isExtensible(object) {\n        if (Object(object) === object) {\n            throw new TypeError(); // TODO message\n        }\n        var name = '';\n        while (owns(object, name)) {\n            name += '?';\n        }\n        object[name] = true;\n        var returnValue = owns(object, name);\n        delete object[name];\n        return returnValue;\n    };\n}\nif (!Object.keys) {\n    var hasDontEnumBug = true,\n        dontEnums = [\n            \"toString\",\n            \"toLocaleString\",\n            \"valueOf\",\n            \"hasOwnProperty\",\n            \"isPrototypeOf\",\n            \"propertyIsEnumerable\",\n            \"constructor\"\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    for (var key in {\"toString\": null}) {\n        hasDontEnumBug = false;\n    }\n\n    Object.keys = function keys(object) {\n\n        if (\n            (typeof object != \"object\" && typeof object != \"function\") ||\n            object === null\n        ) {\n            throw new TypeError(\"Object.keys called on a non-object\");\n        }\n\n        var keys = [];\n        for (var name in object) {\n            if (owns(object, name)) {\n                keys.push(name);\n            }\n        }\n\n        if (hasDontEnumBug) {\n            for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n                var dontEnum = dontEnums[i];\n                if (owns(object, dontEnum)) {\n                    keys.push(dontEnum);\n                }\n            }\n        }\n        return keys;\n    };\n\n}\nif (!Date.now) {\n    Date.now = function now() {\n        return new Date().getTime();\n    };\n}\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n    \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n    \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n    ws = \"[\" + ws + \"]\";\n    var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n        trimEndRegexp = new RegExp(ws + ws + \"*$\");\n    String.prototype.trim = function trim() {\n        return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n    };\n}\n\nfunction toInteger(n) {\n    n = +n;\n    if (n !== n) { // isNaN\n        n = 0;\n    } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {\n        n = (n > 0 || -1) * Math.floor(Math.abs(n));\n    }\n    return n;\n}\n\nfunction isPrimitive(input) {\n    var type = typeof input;\n    return (\n        input === null ||\n        type === \"undefined\" ||\n        type === \"boolean\" ||\n        type === \"number\" ||\n        type === \"string\"\n    );\n}\n\nfunction toPrimitive(input) {\n    var val, valueOf, toString;\n    if (isPrimitive(input)) {\n        return input;\n    }\n    valueOf = input.valueOf;\n    if (typeof valueOf === \"function\") {\n        val = valueOf.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    toString = input.toString;\n    if (typeof toString === \"function\") {\n        val = toString.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    throw new TypeError();\n}\nvar toObject = function (o) {\n    if (o == null) { // this matches both null and undefined\n        throw new TypeError(\"can't convert \"+o+\" to object\");\n    }\n    return Object(o);\n};\n\n});\n\nace.define(\"ace/lib/fixoldbrowsers\",[\"require\",\"exports\",\"module\",\"ace/lib/regexp\",\"ace/lib/es5-shim\"], function(require, exports, module) {\n\"use strict\";\n\nrequire(\"./regexp\");\nrequire(\"./es5-shim\");\n\n});\n\nace.define(\"ace/lib/dom\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nvar XHTML_NS = \"http://www.w3.org/1999/xhtml\";\n\nexports.getDocumentHead = function(doc) {\n    if (!doc)\n        doc = document;\n    return doc.head || doc.getElementsByTagName(\"head\")[0] || doc.documentElement;\n}\n\nexports.createElement = function(tag, ns) {\n    return document.createElementNS ?\n           document.createElementNS(ns || XHTML_NS, tag) :\n           document.createElement(tag);\n};\n\nexports.hasCssClass = function(el, name) {\n    var classes = (el.className || \"\").split(/\\s+/g);\n    return classes.indexOf(name) !== -1;\n};\nexports.addCssClass = function(el, name) {\n    if (!exports.hasCssClass(el, name)) {\n        el.className += \" \" + name;\n    }\n};\nexports.removeCssClass = function(el, name) {\n    var classes = el.className.split(/\\s+/g);\n    while (true) {\n        var index = classes.indexOf(name);\n        if (index == -1) {\n            break;\n        }\n        classes.splice(index, 1);\n    }\n    el.className = classes.join(\" \");\n};\n\nexports.toggleCssClass = function(el, name) {\n    var classes = el.className.split(/\\s+/g), add = true;\n    while (true) {\n        var index = classes.indexOf(name);\n        if (index == -1) {\n            break;\n        }\n        add = false;\n        classes.splice(index, 1);\n    }\n    if(add)\n        classes.push(name);\n\n    el.className = classes.join(\" \");\n    return add;\n};\nexports.setCssClass = function(node, className, include) {\n    if (include) {\n        exports.addCssClass(node, className);\n    } else {\n        exports.removeCssClass(node, className);\n    }\n};\n\nexports.hasCssString = function(id, doc) {\n    var index = 0, sheets;\n    doc = doc || document;\n\n    if (doc.createStyleSheet && (sheets = doc.styleSheets)) {\n        while (index < sheets.length)\n            if (sheets[index++].owningElement.id === id) return true;\n    } else if ((sheets = doc.getElementsByTagName(\"style\"))) {\n        while (index < sheets.length)\n            if (sheets[index++].id === id) return true;\n    }\n\n    return false;\n};\n\nexports.importCssString = function importCssString(cssText, id, doc) {\n    doc = doc || document;\n    if (id && exports.hasCssString(id, doc))\n        return null;\n    \n    var style;\n    \n    if (doc.createStyleSheet) {\n        style = doc.createStyleSheet();\n        style.cssText = cssText;\n        if (id)\n            style.owningElement.id = id;\n    } else {\n        style = doc.createElementNS\n            ? doc.createElementNS(XHTML_NS, \"style\")\n            : doc.createElement(\"style\");\n\n        style.appendChild(doc.createTextNode(cssText));\n        if (id)\n            style.id = id;\n\n        exports.getDocumentHead(doc).appendChild(style);\n    }\n};\n\nexports.importCssStylsheet = function(uri, doc) {\n    if (doc.createStyleSheet) {\n        doc.createStyleSheet(uri);\n    } else {\n        var link = exports.createElement('link');\n        link.rel = 'stylesheet';\n        link.href = uri;\n\n        exports.getDocumentHead(doc).appendChild(link);\n    }\n};\n\nexports.getInnerWidth = function(element) {\n    return (\n        parseInt(exports.computedStyle(element, \"paddingLeft\"), 10) +\n        parseInt(exports.computedStyle(element, \"paddingRight\"), 10) + \n        element.clientWidth\n    );\n};\n\nexports.getInnerHeight = function(element) {\n    return (\n        parseInt(exports.computedStyle(element, \"paddingTop\"), 10) +\n        parseInt(exports.computedStyle(element, \"paddingBottom\"), 10) +\n        element.clientHeight\n    );\n};\n\n\nif (typeof document == \"undefined\")\n    return;\n\nif (window.pageYOffset !== undefined) {\n    exports.getPageScrollTop = function() {\n        return window.pageYOffset;\n    };\n\n    exports.getPageScrollLeft = function() {\n        return window.pageXOffset;\n    };\n}\nelse {\n    exports.getPageScrollTop = function() {\n        return document.body.scrollTop;\n    };\n\n    exports.getPageScrollLeft = function() {\n        return document.body.scrollLeft;\n    };\n}\n\nif (window.getComputedStyle)\n    exports.computedStyle = function(element, style) {\n        if (style)\n            return (window.getComputedStyle(element, \"\") || {})[style] || \"\";\n        return window.getComputedStyle(element, \"\") || {};\n    };\nelse\n    exports.computedStyle = function(element, style) {\n        if (style)\n            return element.currentStyle[style];\n        return element.currentStyle;\n    };\n\nexports.scrollbarWidth = function(document) {\n    var inner = exports.createElement(\"ace_inner\");\n    inner.style.width = \"100%\";\n    inner.style.minWidth = \"0px\";\n    inner.style.height = \"200px\";\n    inner.style.display = \"block\";\n\n    var outer = exports.createElement(\"ace_outer\");\n    var style = outer.style;\n\n    style.position = \"absolute\";\n    style.left = \"-10000px\";\n    style.overflow = \"hidden\";\n    style.width = \"200px\";\n    style.minWidth = \"0px\";\n    style.height = \"150px\";\n    style.display = \"block\";\n\n    outer.appendChild(inner);\n\n    var body = document.documentElement;\n    body.appendChild(outer);\n\n    var noScrollbar = inner.offsetWidth;\n\n    style.overflow = \"scroll\";\n    var withScrollbar = inner.offsetWidth;\n\n    if (noScrollbar == withScrollbar) {\n        withScrollbar = outer.clientWidth;\n    }\n\n    body.removeChild(outer);\n\n    return noScrollbar-withScrollbar;\n};\nexports.setInnerHtml = function(el, innerHtml) {\n    var element = el.cloneNode(false);//document.createElement(\"div\");\n    element.innerHTML = innerHtml;\n    el.parentNode.replaceChild(element, el);\n    return element;\n};\n\nif (\"textContent\" in document.documentElement) {\n    exports.setInnerText = function(el, innerText) {\n        el.textContent = innerText;\n    };\n\n    exports.getInnerText = function(el) {\n        return el.textContent;\n    };\n}\nelse {\n    exports.setInnerText = function(el, innerText) {\n        el.innerText = innerText;\n    };\n\n    exports.getInnerText = function(el) {\n        return el.innerText;\n    };\n}\n\nexports.getParentWindow = function(document) {\n    return document.defaultView || document.parentWindow;\n};\n\n});\n\nace.define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.inherits = function(ctor, 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\nexports.mixin = function(obj, mixin) {\n    for (var key in mixin) {\n        obj[key] = mixin[key];\n    }\n    return obj;\n};\n\nexports.implement = function(proto, mixin) {\n    exports.mixin(proto, mixin);\n};\n\n});\n\nace.define(\"ace/lib/keys\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/oop\"], function(require, exports, module) {\n\"use strict\";\n\nrequire(\"./fixoldbrowsers\");\n\nvar oop = require(\"./oop\");\nvar Keys = (function() {\n    var ret = {\n        MODIFIER_KEYS: {\n            16: 'Shift', 17: 'Ctrl', 18: 'Alt', 224: 'Meta'\n        },\n\n        KEY_MODS: {\n            \"ctrl\": 1, \"alt\": 2, \"option\" : 2, \"shift\": 4,\n            \"super\": 8, \"meta\": 8, \"command\": 8, \"cmd\": 8\n        },\n\n        FUNCTION_KEYS : {\n            8  : \"Backspace\",\n            9  : \"Tab\",\n            13 : \"Return\",\n            19 : \"Pause\",\n            27 : \"Esc\",\n            32 : \"Space\",\n            33 : \"PageUp\",\n            34 : \"PageDown\",\n            35 : \"End\",\n            36 : \"Home\",\n            37 : \"Left\",\n            38 : \"Up\",\n            39 : \"Right\",\n            40 : \"Down\",\n            44 : \"Print\",\n            45 : \"Insert\",\n            46 : \"Delete\",\n            96 : \"Numpad0\",\n            97 : \"Numpad1\",\n            98 : \"Numpad2\",\n            99 : \"Numpad3\",\n            100: \"Numpad4\",\n            101: \"Numpad5\",\n            102: \"Numpad6\",\n            103: \"Numpad7\",\n            104: \"Numpad8\",\n            105: \"Numpad9\",\n            '-13': \"NumpadEnter\",\n            112: \"F1\",\n            113: \"F2\",\n            114: \"F3\",\n            115: \"F4\",\n            116: \"F5\",\n            117: \"F6\",\n            118: \"F7\",\n            119: \"F8\",\n            120: \"F9\",\n            121: \"F10\",\n            122: \"F11\",\n            123: \"F12\",\n            144: \"Numlock\",\n            145: \"Scrolllock\"\n        },\n\n        PRINTABLE_KEYS: {\n           32: ' ',  48: '0',  49: '1',  50: '2',  51: '3',  52: '4', 53:  '5',\n           54: '6',  55: '7',  56: '8',  57: '9',  59: ';',  61: '=', 65:  'a',\n           66: 'b',  67: 'c',  68: 'd',  69: 'e',  70: 'f',  71: 'g', 72:  'h',\n           73: 'i',  74: 'j',  75: 'k',  76: 'l',  77: 'm',  78: 'n', 79:  'o',\n           80: 'p',  81: 'q',  82: 'r',  83: 's',  84: 't',  85: 'u', 86:  'v',\n           87: 'w',  88: 'x',  89: 'y',  90: 'z', 107: '+', 109: '-', 110: '.',\n          187: '=', 188: ',', 189: '-', 190: '.', 191: '/', 192: '`', 219: '[',\n          220: '\\\\',221: ']', 222: '\\''\n        }\n    };\n    var name, i;\n    for (i in ret.FUNCTION_KEYS) {\n        name = ret.FUNCTION_KEYS[i].toLowerCase();\n        ret[name] = parseInt(i, 10);\n    }\n    for (i in ret.PRINTABLE_KEYS) {\n        name = ret.PRINTABLE_KEYS[i].toLowerCase();\n        ret[name] = parseInt(i, 10);\n    }\n    oop.mixin(ret, ret.MODIFIER_KEYS);\n    oop.mixin(ret, ret.PRINTABLE_KEYS);\n    oop.mixin(ret, ret.FUNCTION_KEYS);\n    ret.enter = ret[\"return\"];\n    ret.escape = ret.esc;\n    ret.del = ret[\"delete\"];\n    ret[173] = '-';\n    \n    (function() {\n        var mods = [\"cmd\", \"ctrl\", \"alt\", \"shift\"];\n        for (var i = Math.pow(2, mods.length); i--;) {            \n            ret.KEY_MODS[i] = mods.filter(function(x) {\n                return i & ret.KEY_MODS[x];\n            }).join(\"-\") + \"-\";\n        }\n    })();\n\n    ret.KEY_MODS[0] = \"\";\n    ret.KEY_MODS[-1] = \"input\";\n\n    return ret;\n})();\noop.mixin(exports, Keys);\n\nexports.keyCodeToString = function(keyCode) {\n    var keyString = Keys[keyCode];\n    if (typeof keyString != \"string\")\n        keyString = String.fromCharCode(keyCode);\n    return keyString.toLowerCase();\n};\n\n});\n\nace.define(\"ace/lib/useragent\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nexports.OS = {\n    LINUX: \"LINUX\",\n    MAC: \"MAC\",\n    WINDOWS: \"WINDOWS\"\n};\nexports.getOS = function() {\n    if (exports.isMac) {\n        return exports.OS.MAC;\n    } else if (exports.isLinux) {\n        return exports.OS.LINUX;\n    } else {\n        return exports.OS.WINDOWS;\n    }\n};\nif (typeof navigator != \"object\")\n    return;\n\nvar os = (navigator.platform.match(/mac|win|linux/i) || [\"other\"])[0].toLowerCase();\nvar ua = navigator.userAgent;\nexports.isWin = (os == \"win\");\nexports.isMac = (os == \"mac\");\nexports.isLinux = (os == \"linux\");\nexports.isIE = \n    (navigator.appName == \"Microsoft Internet Explorer\" || navigator.appName.indexOf(\"MSAppHost\") >= 0)\n    ? parseFloat((ua.match(/(?:MSIE |Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/)||[])[1])\n    : parseFloat((ua.match(/(?:Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/)||[])[1]); // for ie\n    \nexports.isOldIE = exports.isIE && exports.isIE < 9;\nexports.isGecko = exports.isMozilla = (window.Controllers || window.controllers) && window.navigator.product === \"Gecko\";\nexports.isOldGecko = exports.isGecko && parseInt((ua.match(/rv\\:(\\d+)/)||[])[1], 10) < 4;\nexports.isOpera = window.opera && Object.prototype.toString.call(window.opera) == \"[object Opera]\";\nexports.isWebKit = parseFloat(ua.split(\"WebKit/\")[1]) || undefined;\n\nexports.isChrome = parseFloat(ua.split(\" Chrome/\")[1]) || undefined;\n\nexports.isAIR = ua.indexOf(\"AdobeAIR\") >= 0;\n\nexports.isIPad = ua.indexOf(\"iPad\") >= 0;\n\nexports.isTouchPad = ua.indexOf(\"TouchPad\") >= 0;\n\nexports.isChromeOS = ua.indexOf(\" CrOS \") >= 0;\n\n});\n\nace.define(\"ace/lib/event\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar keys = require(\"./keys\");\nvar useragent = require(\"./useragent\");\n\nexports.addListener = function(elem, type, callback) {\n    if (elem.addEventListener) {\n        return elem.addEventListener(type, callback, false);\n    }\n    if (elem.attachEvent) {\n        var wrapper = function() {\n            callback.call(elem, window.event);\n        };\n        callback._wrapper = wrapper;\n        elem.attachEvent(\"on\" + type, wrapper);\n    }\n};\n\nexports.removeListener = function(elem, type, callback) {\n    if (elem.removeEventListener) {\n        return elem.removeEventListener(type, callback, false);\n    }\n    if (elem.detachEvent) {\n        elem.detachEvent(\"on\" + type, callback._wrapper || callback);\n    }\n};\nexports.stopEvent = function(e) {\n    exports.stopPropagation(e);\n    exports.preventDefault(e);\n    return false;\n};\n\nexports.stopPropagation = function(e) {\n    if (e.stopPropagation)\n        e.stopPropagation();\n    else\n        e.cancelBubble = true;\n};\n\nexports.preventDefault = function(e) {\n    if (e.preventDefault)\n        e.preventDefault();\n    else\n        e.returnValue = false;\n};\nexports.getButton = function(e) {\n    if (e.type == \"dblclick\")\n        return 0;\n    if (e.type == \"contextmenu\" || (useragent.isMac && (e.ctrlKey && !e.altKey && !e.shiftKey)))\n        return 2;\n    if (e.preventDefault) {\n        return e.button;\n    }\n    else {\n        return {1:0, 2:2, 4:1}[e.button];\n    }\n};\n\nexports.capture = function(el, eventHandler, releaseCaptureHandler) {\n    function onMouseUp(e) {\n        eventHandler && eventHandler(e);\n        releaseCaptureHandler && releaseCaptureHandler(e);\n\n        exports.removeListener(document, \"mousemove\", eventHandler, true);\n        exports.removeListener(document, \"mouseup\", onMouseUp, true);\n        exports.removeListener(document, \"dragstart\", onMouseUp, true);\n    }\n\n    exports.addListener(document, \"mousemove\", eventHandler, true);\n    exports.addListener(document, \"mouseup\", onMouseUp, true);\n    exports.addListener(document, \"dragstart\", onMouseUp, true);\n    \n    return onMouseUp;\n};\n\nexports.addMouseWheelListener = function(el, callback) {\n    if (\"onmousewheel\" in el) {\n        exports.addListener(el, \"mousewheel\", function(e) {\n            var factor = 8;\n            if (e.wheelDeltaX !== undefined) {\n                e.wheelX = -e.wheelDeltaX / factor;\n                e.wheelY = -e.wheelDeltaY / factor;\n            } else {\n                e.wheelX = 0;\n                e.wheelY = -e.wheelDelta / factor;\n            }\n            callback(e);\n        });\n    } else if (\"onwheel\" in el) {\n        exports.addListener(el, \"wheel\",  function(e) {\n            var factor = 0.35;\n            switch (e.deltaMode) {\n                case e.DOM_DELTA_PIXEL:\n                    e.wheelX = e.deltaX * factor || 0;\n                    e.wheelY = e.deltaY * factor || 0;\n                    break;\n                case e.DOM_DELTA_LINE:\n                case e.DOM_DELTA_PAGE:\n                    e.wheelX = (e.deltaX || 0) * 5;\n                    e.wheelY = (e.deltaY || 0) * 5;\n                    break;\n            }\n            \n            callback(e);\n        });\n    } else {\n        exports.addListener(el, \"DOMMouseScroll\", function(e) {\n            if (e.axis && e.axis == e.HORIZONTAL_AXIS) {\n                e.wheelX = (e.detail || 0) * 5;\n                e.wheelY = 0;\n            } else {\n                e.wheelX = 0;\n                e.wheelY = (e.detail || 0) * 5;\n            }\n            callback(e);\n        });\n    }\n};\n\nexports.addMultiMouseDownListener = function(el, timeouts, eventHandler, callbackName) {\n    var clicks = 0;\n    var startX, startY, timer; \n    var eventNames = {\n        2: \"dblclick\",\n        3: \"tripleclick\",\n        4: \"quadclick\"\n    };\n\n    exports.addListener(el, \"mousedown\", function(e) {\n        if (exports.getButton(e) !== 0) {\n            clicks = 0;\n        } else if (e.detail > 1) {\n            clicks++;\n            if (clicks > 4)\n                clicks = 1;\n        } else {\n            clicks = 1;\n        }\n        if (useragent.isIE) {\n            var isNewClick = Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5;\n            if (!timer || isNewClick)\n                clicks = 1;\n            if (timer)\n                clearTimeout(timer);\n            timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600);\n\n            if (clicks == 1) {\n                startX = e.clientX;\n                startY = e.clientY;\n            }\n        }\n        \n        e._clicks = clicks;\n\n        eventHandler[callbackName](\"mousedown\", e);\n\n        if (clicks > 4)\n            clicks = 0;\n        else if (clicks > 1)\n            return eventHandler[callbackName](eventNames[clicks], e);\n    });\n\n    if (useragent.isOldIE) {\n        exports.addListener(el, \"dblclick\", function(e) {\n            clicks = 2;\n            if (timer)\n                clearTimeout(timer);\n            timer = setTimeout(function() {timer = null}, timeouts[clicks - 1] || 600);\n            eventHandler[callbackName](\"mousedown\", e);\n            eventHandler[callbackName](eventNames[clicks], e);\n        });\n    }\n};\n\nvar getModifierHash = useragent.isMac && useragent.isOpera && !(\"KeyboardEvent\" in window)\n    ? function(e) {\n        return 0 | (e.metaKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.ctrlKey ? 8 : 0);\n    }\n    : function(e) {\n        return 0 | (e.ctrlKey ? 1 : 0) | (e.altKey ? 2 : 0) | (e.shiftKey ? 4 : 0) | (e.metaKey ? 8 : 0);\n    };\n\nexports.getModifierString = function(e) {\n    return keys.KEY_MODS[getModifierHash(e)];\n};\n\nfunction normalizeCommandKeys(callback, e, keyCode) {\n    var hashId = getModifierHash(e);\n\n    if (!useragent.isMac && pressedKeys) {\n        if (pressedKeys[91] || pressedKeys[92])\n            hashId |= 8;\n        if (pressedKeys.altGr) {\n            if ((3 & hashId) != 3)\n                pressedKeys.altGr = 0;\n            else\n                return;\n        }\n        if (keyCode === 18 || keyCode === 17) {\n            var location = \"location\" in e ? e.location : e.keyLocation;\n            if (keyCode === 17 && location === 1) {\n                ts = e.timeStamp;\n            } else if (keyCode === 18 && hashId === 3 && location === 2) {\n                var dt = -ts;\n                ts = e.timeStamp;\n                dt += ts;\n                if (dt < 3)\n                    pressedKeys.altGr = true;\n            }\n        }\n    }\n    \n    if (keyCode in keys.MODIFIER_KEYS) {\n        switch (keys.MODIFIER_KEYS[keyCode]) {\n            case \"Alt\":\n                hashId = 2;\n                break;\n            case \"Shift\":\n                hashId = 4;\n                break;\n            case \"Ctrl\":\n                hashId = 1;\n                break;\n            default:\n                hashId = 8;\n                break;\n        }\n        keyCode = -1;\n    }\n\n    if (hashId & 8 && (keyCode === 91 || keyCode === 93)) {\n        keyCode = -1;\n    }\n    \n    if (!hashId && keyCode === 13) {\n        var location = \"location\" in e ? e.location : e.keyLocation;\n        if (location === 3) {\n            callback(e, hashId, -keyCode);\n            if (e.defaultPrevented)\n                return;\n        }\n    }\n    \n    if (useragent.isChromeOS && hashId & 8) {\n        callback(e, hashId, keyCode);\n        if (e.defaultPrevented)\n            return;\n        else\n            hashId &= ~8;\n    }\n    if (!hashId && !(keyCode in keys.FUNCTION_KEYS) && !(keyCode in keys.PRINTABLE_KEYS)) {\n        return false;\n    }\n    \n    return callback(e, hashId, keyCode);\n}\n\nvar pressedKeys = null;\nvar ts = 0;\nexports.addCommandKeyListener = function(el, callback) {\n    var addListener = exports.addListener;\n    if (useragent.isOldGecko || (useragent.isOpera && !(\"KeyboardEvent\" in window))) {\n        var lastKeyDownKeyCode = null;\n        addListener(el, \"keydown\", function(e) {\n            lastKeyDownKeyCode = e.keyCode;\n        });\n        addListener(el, \"keypress\", function(e) {\n            return normalizeCommandKeys(callback, e, lastKeyDownKeyCode);\n        });\n    } else {\n        var lastDefaultPrevented = null;\n\n        addListener(el, \"keydown\", function(e) {\n            pressedKeys[e.keyCode] = true;\n            var result = normalizeCommandKeys(callback, e, e.keyCode);\n            lastDefaultPrevented = e.defaultPrevented;\n            return result;\n        });\n\n        addListener(el, \"keypress\", function(e) {\n            if (lastDefaultPrevented && (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)) {\n                exports.stopEvent(e);\n                lastDefaultPrevented = null;\n            }\n        });\n\n        addListener(el, \"keyup\", function(e) {\n            pressedKeys[e.keyCode] = null;\n        });\n\n        if (!pressedKeys) {\n            pressedKeys = Object.create(null);\n            addListener(window, \"focus\", function(e) {\n                pressedKeys = Object.create(null);\n            });\n        }\n    }\n};\n\nif (window.postMessage && !useragent.isOldIE) {\n    var postMessageId = 1;\n    exports.nextTick = function(callback, win) {\n        win = win || window;\n        var messageName = \"zero-timeout-message-\" + postMessageId;\n        exports.addListener(win, \"message\", function listener(e) {\n            if (e.data == messageName) {\n                exports.stopPropagation(e);\n                exports.removeListener(win, \"message\", listener);\n                callback();\n            }\n        });\n        win.postMessage(messageName, \"*\");\n    };\n}\n\n\nexports.nextFrame = window.requestAnimationFrame ||\n    window.mozRequestAnimationFrame ||\n    window.webkitRequestAnimationFrame ||\n    window.msRequestAnimationFrame ||\n    window.oRequestAnimationFrame;\n\nif (exports.nextFrame)\n    exports.nextFrame = exports.nextFrame.bind(window);\nelse\n    exports.nextFrame = function(callback) {\n        setTimeout(callback, 17);\n    };\n});\n\nace.define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.last = function(a) {\n    return a[a.length - 1];\n};\n\nexports.stringReverse = function(string) {\n    return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n    var result = '';\n    while (count > 0) {\n        if (count & 1)\n            result += string;\n\n        if (count >>= 1)\n            string += string;\n    }\n    return result;\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n    return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n    return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n    var copy = {};\n    for (var key in obj) {\n        copy[key] = obj[key];\n    }\n    return copy;\n};\n\nexports.copyArray = function(array){\n    var copy = [];\n    for (var i=0, l=array.length; i<l; i++) {\n        if (array[i] && typeof array[i] == \"object\")\n            copy[i] = this.copyObject( array[i] );\n        else \n            copy[i] = array[i];\n    }\n    return copy;\n};\n\nexports.deepCopy = function (obj) {\n    if (typeof obj !== \"object\" || !obj)\n        return obj;\n    var cons = obj.constructor;\n    if (cons === RegExp)\n        return obj;\n    \n    var copy = cons();\n    for (var key in obj) {\n        if (typeof obj[key] === \"object\") {\n            copy[key] = exports.deepCopy(obj[key]);\n        } else {\n            copy[key] = obj[key];\n        }\n    }\n    return copy;\n};\n\nexports.arrayToMap = function(arr) {\n    var map = {};\n    for (var i=0; i<arr.length; i++) {\n        map[arr[i]] = 1;\n    }\n    return map;\n\n};\n\nexports.createMap = function(props) {\n    var map = Object.create(null);\n    for (var i in props) {\n        map[i] = props[i];\n    }\n    return map;\n};\nexports.arrayRemove = function(array, value) {\n  for (var i = 0; i <= array.length; i++) {\n    if (value === array[i]) {\n      array.splice(i, 1);\n    }\n  }\n};\n\nexports.escapeRegExp = function(str) {\n    return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n};\n\nexports.escapeHTML = function(str) {\n    return str.replace(/&/g, \"&#38;\").replace(/\"/g, \"&#34;\").replace(/'/g, \"&#39;\").replace(/</g, \"&#60;\");\n};\n\nexports.getMatchOffsets = function(string, regExp) {\n    var matches = [];\n\n    string.replace(regExp, function(str) {\n        matches.push({\n            offset: arguments[arguments.length-2],\n            length: str.length\n        });\n    });\n\n    return matches;\n};\nexports.deferredCall = function(fcn) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var deferred = function(timeout) {\n        deferred.cancel();\n        timer = setTimeout(callback, timeout || 0);\n        return deferred;\n    };\n\n    deferred.schedule = deferred;\n\n    deferred.call = function() {\n        this.cancel();\n        fcn();\n        return deferred;\n    };\n\n    deferred.cancel = function() {\n        clearTimeout(timer);\n        timer = null;\n        return deferred;\n    };\n    \n    deferred.isPending = function() {\n        return timer;\n    };\n\n    return deferred;\n};\n\n\nexports.delayedCall = function(fcn, defaultTimeout) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var _self = function(timeout) {\n        if (timer == null)\n            timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n\n    _self.delay = function(timeout) {\n        timer && clearTimeout(timer);\n        timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n    _self.schedule = _self;\n\n    _self.call = function() {\n        this.cancel();\n        fcn();\n    };\n\n    _self.cancel = function() {\n        timer && clearTimeout(timer);\n        timer = null;\n    };\n\n    _self.isPending = function() {\n        return timer;\n    };\n\n    return _self;\n};\n});\n\nace.define(\"ace/keyboard/textinput\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\",\"ace/lib/dom\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nvar dom = require(\"../lib/dom\");\nvar lang = require(\"../lib/lang\");\nvar BROKEN_SETDATA = useragent.isChrome < 18;\nvar USE_IE_MIME_TYPE =  useragent.isIE;\n\nvar TextInput = function(parentNode, host) {\n    var text = dom.createElement(\"textarea\");\n    text.className = \"ace_text-input\";\n\n    if (useragent.isTouchPad)\n        text.setAttribute(\"x-palm-disable-auto-cap\", true);\n\n    text.setAttribute(\"wrap\", \"off\");\n    text.setAttribute(\"autocorrect\", \"off\");\n    text.setAttribute(\"autocapitalize\", \"off\");\n    text.setAttribute(\"spellcheck\", false);\n\n    text.style.opacity = \"0\";\n    if (useragent.isOldIE) text.style.top = \"-100px\";\n    parentNode.insertBefore(text, parentNode.firstChild);\n\n    var PLACEHOLDER = \"\\x01\\x01\";\n\n    var copied = false;\n    var pasted = false;\n    var inComposition = false;\n    var tempStyle = '';\n    var isSelectionEmpty = true;\n    try { var isFocused = document.activeElement === text; } catch(e) {}\n    \n    event.addListener(text, \"blur\", function(e) {\n        host.onBlur(e);\n        isFocused = false;\n    });\n    event.addListener(text, \"focus\", function(e) {\n        isFocused = true;\n        host.onFocus(e);\n        resetSelection();\n    });\n    this.focus = function() {\n        text.style.position = \"fixed\";\n        text.style.top = \"-10000000px\";\n        text.focus();\n        setTimeout(function() {\n            text.style.position = \"\";\n        }, 0);\n    };\n    this.blur = function() { text.blur(); };\n    this.isFocused = function() {\n        return isFocused;\n    };\n    var syncSelection = lang.delayedCall(function() {\n        isFocused && resetSelection(isSelectionEmpty);\n    });\n    var syncValue = lang.delayedCall(function() {\n         if (!inComposition) {\n            text.value = PLACEHOLDER;\n            isFocused && resetSelection();\n         }\n    });\n\n    function resetSelection(isEmpty) {\n        if (inComposition)\n            return;\n        if (inputHandler) {\n            selectionStart = 0;\n            selectionEnd = isEmpty ? 0 : text.value.length - 1;\n        } else {\n            var selectionStart = isEmpty ? 2 : 1;\n            var selectionEnd = 2;\n        }\n        try {\n            text.setSelectionRange(selectionStart, selectionEnd);\n        } catch(e){}\n    }\n\n    function resetValue() {\n        if (inComposition)\n            return;\n        text.value = PLACEHOLDER;\n        if (useragent.isWebKit)\n            syncValue.schedule();\n    }\n\n    useragent.isWebKit || host.addEventListener('changeSelection', function() {\n        if (host.selection.isEmpty() != isSelectionEmpty) {\n            isSelectionEmpty = !isSelectionEmpty;\n            syncSelection.schedule();\n        }\n    });\n\n    resetValue();\n    if (isFocused)\n        host.onFocus();\n\n\n    var isAllSelected = function(text) {\n        return text.selectionStart === 0 && text.selectionEnd === text.value.length;\n    };\n    if (!text.setSelectionRange && text.createTextRange) {\n        text.setSelectionRange = function(selectionStart, selectionEnd) {\n            var range = this.createTextRange();\n            range.collapse(true);\n            range.moveStart('character', selectionStart);\n            range.moveEnd('character', selectionEnd);\n            range.select();\n        };\n        isAllSelected = function(text) {\n            try {\n                var range = text.ownerDocument.selection.createRange();\n            }catch(e) {}\n            if (!range || range.parentElement() != text) return false;\n                return range.text == text.value;\n        }\n    }\n    if (useragent.isOldIE) {\n        var inPropertyChange = false;\n        var onPropertyChange = function(e){\n            if (inPropertyChange)\n                return;\n            var data = text.value;\n            if (inComposition || !data || data == PLACEHOLDER)\n                return;\n            if (e && data == PLACEHOLDER[0])\n                return syncProperty.schedule();\n\n            sendText(data);\n            inPropertyChange = true;\n            resetValue();\n            inPropertyChange = false;\n        };\n        var syncProperty = lang.delayedCall(onPropertyChange);\n        event.addListener(text, \"propertychange\", onPropertyChange);\n\n        var keytable = { 13:1, 27:1 };\n        event.addListener(text, \"keyup\", function (e) {\n            if (inComposition && (!text.value || keytable[e.keyCode]))\n                setTimeout(onCompositionEnd, 0);\n            if ((text.value.charCodeAt(0)||0) < 129) {\n                return syncProperty.call();\n            }\n            inComposition ? onCompositionUpdate() : onCompositionStart();\n        });\n        event.addListener(text, \"keydown\", function (e) {\n            syncProperty.schedule(50);\n        });\n    }\n\n    var onSelect = function(e) {\n        if (copied) {\n            copied = false;\n        } else if (isAllSelected(text)) {\n            host.selectAll();\n            resetSelection();\n        } else if (inputHandler) {\n            resetSelection(host.selection.isEmpty());\n        }\n    };\n\n    var inputHandler = null;\n    this.setInputHandler = function(cb) {inputHandler = cb};\n    this.getInputHandler = function() {return inputHandler};\n    var afterContextMenu = false;\n    \n    var sendText = function(data) {\n        if (inputHandler) {\n            data = inputHandler(data);\n            inputHandler = null;\n        }\n        if (pasted) {\n            resetSelection();\n            if (data)\n                host.onPaste(data);\n            pasted = false;\n        } else if (data == PLACEHOLDER.charAt(0)) {\n            if (afterContextMenu)\n                host.execCommand(\"del\", {source: \"ace\"});\n            else // some versions of android do not fire keydown when pressing backspace\n                host.execCommand(\"backspace\", {source: \"ace\"});\n        } else {\n            if (data.substring(0, 2) == PLACEHOLDER)\n                data = data.substr(2);\n            else if (data.charAt(0) == PLACEHOLDER.charAt(0))\n                data = data.substr(1);\n            else if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n                data = data.slice(0, -1);\n            if (data.charAt(data.length - 1) == PLACEHOLDER.charAt(0))\n                data = data.slice(0, -1);\n            \n            if (data)\n                host.onTextInput(data);\n        }\n        if (afterContextMenu)\n            afterContextMenu = false;\n    };\n    var onInput = function(e) {\n        if (inComposition)\n            return;\n        var data = text.value;\n        sendText(data);\n        resetValue();\n    };\n    \n    var handleClipboardData = function(e, data) {\n        var clipboardData = e.clipboardData || window.clipboardData;\n        if (!clipboardData || BROKEN_SETDATA)\n            return;\n        var mime = USE_IE_MIME_TYPE ? \"Text\" : \"text/plain\";\n        if (data) {\n            return clipboardData.setData(mime, data) !== false;\n        } else {\n            return clipboardData.getData(mime);\n        }\n    };\n\n    var doCopy = function(e, isCut) {\n        var data = host.getCopyText();\n        if (!data)\n            return event.preventDefault(e);\n\n        if (handleClipboardData(e, data)) {\n            isCut ? host.onCut() : host.onCopy();\n            event.preventDefault(e);\n        } else {\n            copied = true;\n            text.value = data;\n            text.select();\n            setTimeout(function(){\n                copied = false;\n                resetValue();\n                resetSelection();\n                isCut ? host.onCut() : host.onCopy();\n            });\n        }\n    };\n    \n    var onCut = function(e) {\n        doCopy(e, true);\n    };\n    \n    var onCopy = function(e) {\n        doCopy(e, false);\n    };\n    \n    var onPaste = function(e) {\n        var data = handleClipboardData(e);\n        if (typeof data == \"string\") {\n            if (data)\n                host.onPaste(data);\n            if (useragent.isIE)\n                setTimeout(resetSelection);\n            event.preventDefault(e);\n        }\n        else {\n            text.value = \"\";\n            pasted = true;\n        }\n    };\n\n    event.addCommandKeyListener(text, host.onCommandKey.bind(host));\n\n    event.addListener(text, \"select\", onSelect);\n\n    event.addListener(text, \"input\", onInput);\n\n    event.addListener(text, \"cut\", onCut);\n    event.addListener(text, \"copy\", onCopy);\n    event.addListener(text, \"paste\", onPaste);\n    if (!('oncut' in text) || !('oncopy' in text) || !('onpaste' in text)){\n        event.addListener(parentNode, \"keydown\", function(e) {\n            if ((useragent.isMac && !e.metaKey) || !e.ctrlKey)\n                return;\n\n            switch (e.keyCode) {\n                case 67:\n                    onCopy(e);\n                    break;\n                case 86:\n                    onPaste(e);\n                    break;\n                case 88:\n                    onCut(e);\n                    break;\n            }\n        });\n    }\n    var onCompositionStart = function(e) {\n        if (inComposition || !host.onCompositionStart || host.$readOnly) \n            return;\n        inComposition = {};\n        host.onCompositionStart();\n        setTimeout(onCompositionUpdate, 0);\n        host.on(\"mousedown\", onCompositionEnd);\n        if (!host.selection.isEmpty()) {\n            host.insert(\"\");\n            host.session.markUndoGroup();\n            host.selection.clearSelection();\n        }\n        host.session.markUndoGroup();\n    };\n\n    var onCompositionUpdate = function() {\n        if (!inComposition || !host.onCompositionUpdate || host.$readOnly)\n            return;\n        var val = text.value.replace(/\\x01/g, \"\");\n        if (inComposition.lastValue === val) return;\n        \n        host.onCompositionUpdate(val);\n        if (inComposition.lastValue)\n            host.undo();\n        inComposition.lastValue = val;\n        if (inComposition.lastValue) {\n            var r = host.selection.getRange();\n            host.insert(inComposition.lastValue);\n            host.session.markUndoGroup();\n            inComposition.range = host.selection.getRange();\n            host.selection.setRange(r);\n            host.selection.clearSelection();\n        }\n    };\n\n    var onCompositionEnd = function(e) {\n        if (!host.onCompositionEnd || host.$readOnly) return;\n        var c = inComposition;\n        inComposition = false;\n        var timer = setTimeout(function() {\n            timer = null;\n            var str = text.value.replace(/\\x01/g, \"\");\n            if (inComposition)\n                return;\n            else if (str == c.lastValue)\n                resetValue();\n            else if (!c.lastValue && str) {\n                resetValue();\n                sendText(str);\n            }\n        });\n        inputHandler = function compositionInputHandler(str) {\n            if (timer)\n                clearTimeout(timer);\n            str = str.replace(/\\x01/g, \"\");\n            if (str == c.lastValue)\n                return \"\";\n            if (c.lastValue && timer)\n                host.undo();\n            return str;\n        };\n        host.onCompositionEnd();\n        host.removeListener(\"mousedown\", onCompositionEnd);\n        if (e.type == \"compositionend\" && c.range) {\n            host.selection.setRange(c.range);\n        }\n    };\n    \n    \n\n    var syncComposition = lang.delayedCall(onCompositionUpdate, 50);\n\n    event.addListener(text, \"compositionstart\", onCompositionStart);\n    if (useragent.isGecko) {\n        event.addListener(text, \"text\", function(){syncComposition.schedule()});\n    } else {\n        event.addListener(text, \"keyup\", function(){syncComposition.schedule()});\n        event.addListener(text, \"keydown\", function(){syncComposition.schedule()});\n    }\n    event.addListener(text, \"compositionend\", onCompositionEnd);\n\n    this.getElement = function() {\n        return text;\n    };\n\n    this.setReadOnly = function(readOnly) {\n       text.readOnly = readOnly;\n    };\n\n    this.onContextMenu = function(e) {\n        afterContextMenu = true;\n        resetSelection(host.selection.isEmpty());\n        host._emit(\"nativecontextmenu\", {target: host, domEvent: e});\n        this.moveToMouse(e, true);\n    };\n    \n    this.moveToMouse = function(e, bringToFront) {\n        if (!bringToFront && useragent.isOldIE)\n            return;\n        if (!tempStyle)\n            tempStyle = text.style.cssText;\n        text.style.cssText = (bringToFront ? \"z-index:100000;\" : \"\")\n            + \"height:\" + text.style.height + \";\"\n            + (useragent.isIE ? \"opacity:0.1;\" : \"\");\n\n        var rect = host.container.getBoundingClientRect();\n        var style = dom.computedStyle(host.container);\n        var top = rect.top + (parseInt(style.borderTopWidth) || 0);\n        var left = rect.left + (parseInt(rect.borderLeftWidth) || 0);\n        var maxTop = rect.bottom - top - text.clientHeight -2;\n        var move = function(e) {\n            text.style.left = e.clientX - left - 2 + \"px\";\n            text.style.top = Math.min(e.clientY - top - 2, maxTop) + \"px\";\n        }; \n        move(e);\n\n        if (e.type != \"mousedown\")\n            return;\n\n        if (host.renderer.$keepTextAreaAtCursor)\n            host.renderer.$keepTextAreaAtCursor = null;\n        if (useragent.isWin && !useragent.isOldIE)\n            event.capture(host.container, move, onContextMenuClose);\n    };\n\n    this.onContextMenuClose = onContextMenuClose;\n    var closeTimeout;\n    function onContextMenuClose() {\n        clearTimeout(closeTimeout)\n        closeTimeout = setTimeout(function () {\n            if (tempStyle) {\n                text.style.cssText = tempStyle;\n                tempStyle = '';\n            }\n            if (host.renderer.$keepTextAreaAtCursor == null) {\n                host.renderer.$keepTextAreaAtCursor = true;\n                host.renderer.$moveTextAreaToCursor();\n            }\n        }, useragent.isOldIE ? 200 : 0);\n    }\n\n    var onContextMenu = function(e) {\n        host.textInput.onContextMenu(e);\n        onContextMenuClose();\n    };\n    event.addListener(host.renderer.scroller, \"contextmenu\", onContextMenu);\n    event.addListener(text, \"contextmenu\", onContextMenu);\n};\n\nexports.TextInput = TextInput;\n});\n\nace.define(\"ace/mouse/default_handlers\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar dom = require(\"../lib/dom\");\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\n\nvar DRAG_OFFSET = 0; // pixels\n\nfunction DefaultHandlers(mouseHandler) {\n    mouseHandler.$clickSelection = null;\n\n    var editor = mouseHandler.editor;\n    editor.setDefaultHandler(\"mousedown\", this.onMouseDown.bind(mouseHandler));\n    editor.setDefaultHandler(\"dblclick\", this.onDoubleClick.bind(mouseHandler));\n    editor.setDefaultHandler(\"tripleclick\", this.onTripleClick.bind(mouseHandler));\n    editor.setDefaultHandler(\"quadclick\", this.onQuadClick.bind(mouseHandler));\n    editor.setDefaultHandler(\"mousewheel\", this.onMouseWheel.bind(mouseHandler));\n\n    var exports = [\"select\", \"startSelect\", \"selectEnd\", \"selectAllEnd\", \"selectByWordsEnd\",\n        \"selectByLinesEnd\", \"dragWait\", \"dragWaitEnd\", \"focusWait\"];\n\n    exports.forEach(function(x) {\n        mouseHandler[x] = this[x];\n    }, this);\n\n    mouseHandler.selectByLines = this.extendSelectionBy.bind(mouseHandler, \"getLineRange\");\n    mouseHandler.selectByWords = this.extendSelectionBy.bind(mouseHandler, \"getWordRange\");\n}\n\n(function() {\n\n    this.onMouseDown = function(ev) {\n        var inSelection = ev.inSelection();\n        var pos = ev.getDocumentPosition();\n        this.mousedownEvent = ev;\n        var editor = this.editor;\n\n        var button = ev.getButton();\n        if (button !== 0) {\n            var selectionRange = editor.getSelectionRange();\n            var selectionEmpty = selectionRange.isEmpty();\n            editor.$blockScrolling++;\n            if (selectionEmpty)\n                editor.selection.moveToPosition(pos);\n            editor.$blockScrolling--;\n            editor.textInput.onContextMenu(ev.domEvent);\n            return; // stopping event here breaks contextmenu on ff mac\n        }\n\n        this.mousedownEvent.time = Date.now();\n        if (inSelection && !editor.isFocused()) {\n            editor.focus();\n            if (this.$focusTimout && !this.$clickSelection && !editor.inMultiSelectMode) {\n                this.setState(\"focusWait\");\n                this.captureMouse(ev);\n                return;\n            }\n        }\n\n        this.captureMouse(ev);\n        this.startSelect(pos, ev.domEvent._clicks > 1);\n        return ev.preventDefault();\n    };\n\n    this.startSelect = function(pos, waitForClickSelection) {\n        pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y);\n        var editor = this.editor;\n        editor.$blockScrolling++;\n        if (this.mousedownEvent.getShiftKey())\n            editor.selection.selectToPosition(pos);\n        else if (!waitForClickSelection)\n            editor.selection.moveToPosition(pos);\n        if (!waitForClickSelection)\n            this.select();\n        if (editor.renderer.scroller.setCapture) {\n            editor.renderer.scroller.setCapture();\n        }\n        editor.setStyle(\"ace_selecting\");\n        this.setState(\"select\");\n        editor.$blockScrolling--;\n    };\n\n    this.select = function() {\n        var anchor, editor = this.editor;\n        var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n        editor.$blockScrolling++;\n        if (this.$clickSelection) {\n            var cmp = this.$clickSelection.comparePoint(cursor);\n\n            if (cmp == -1) {\n                anchor = this.$clickSelection.end;\n            } else if (cmp == 1) {\n                anchor = this.$clickSelection.start;\n            } else {\n                var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\n                cursor = orientedRange.cursor;\n                anchor = orientedRange.anchor;\n            }\n            editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n        }\n        editor.selection.selectToPosition(cursor);\n        editor.$blockScrolling--;\n        editor.renderer.scrollCursorIntoView();\n    };\n\n    this.extendSelectionBy = function(unitName) {\n        var anchor, editor = this.editor;\n        var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n        var range = editor.selection[unitName](cursor.row, cursor.column);\n        editor.$blockScrolling++;\n        if (this.$clickSelection) {\n            var cmpStart = this.$clickSelection.comparePoint(range.start);\n            var cmpEnd = this.$clickSelection.comparePoint(range.end);\n\n            if (cmpStart == -1 && cmpEnd <= 0) {\n                anchor = this.$clickSelection.end;\n                if (range.end.row != cursor.row || range.end.column != cursor.column)\n                    cursor = range.start;\n            } else if (cmpEnd == 1 && cmpStart >= 0) {\n                anchor = this.$clickSelection.start;\n                if (range.start.row != cursor.row || range.start.column != cursor.column)\n                    cursor = range.end;\n            } else if (cmpStart == -1 && cmpEnd == 1) {\n                cursor = range.end;\n                anchor = range.start;\n            } else {\n                var orientedRange = calcRangeOrientation(this.$clickSelection, cursor);\n                cursor = orientedRange.cursor;\n                anchor = orientedRange.anchor;\n            }\n            editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n        }\n        editor.selection.selectToPosition(cursor);\n        editor.$blockScrolling--;\n        editor.renderer.scrollCursorIntoView();\n    };\n\n    this.selectEnd =\n    this.selectAllEnd =\n    this.selectByWordsEnd =\n    this.selectByLinesEnd = function() {\n        this.$clickSelection = null;\n        this.editor.unsetStyle(\"ace_selecting\");\n        if (this.editor.renderer.scroller.releaseCapture) {\n            this.editor.renderer.scroller.releaseCapture();\n        }\n    };\n\n    this.focusWait = function() {\n        var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n        var time = Date.now();\n\n        if (distance > DRAG_OFFSET || time - this.mousedownEvent.time > this.$focusTimout)\n            this.startSelect(this.mousedownEvent.getDocumentPosition());\n    };\n\n    this.onDoubleClick = function(ev) {\n        var pos = ev.getDocumentPosition();\n        var editor = this.editor;\n        var session = editor.session;\n\n        var range = session.getBracketRange(pos);\n        if (range) {\n            if (range.isEmpty()) {\n                range.start.column--;\n                range.end.column++;\n            }\n            this.setState(\"select\");\n        } else {\n            range = editor.selection.getWordRange(pos.row, pos.column);\n            this.setState(\"selectByWords\");\n        }\n        this.$clickSelection = range;\n        this.select();\n    };\n\n    this.onTripleClick = function(ev) {\n        var pos = ev.getDocumentPosition();\n        var editor = this.editor;\n\n        this.setState(\"selectByLines\");\n        var range = editor.getSelectionRange();\n        if (range.isMultiLine() && range.contains(pos.row, pos.column)) {\n            this.$clickSelection = editor.selection.getLineRange(range.start.row);\n            this.$clickSelection.end = editor.selection.getLineRange(range.end.row).end;\n        } else {\n            this.$clickSelection = editor.selection.getLineRange(pos.row);\n        }\n        this.select();\n    };\n\n    this.onQuadClick = function(ev) {\n        var editor = this.editor;\n\n        editor.selectAll();\n        this.$clickSelection = editor.getSelectionRange();\n        this.setState(\"selectAll\");\n    };\n\n    this.onMouseWheel = function(ev) {\n        if (ev.getAccelKey())\n            return;\n        if (ev.getShiftKey() && ev.wheelY && !ev.wheelX) {\n            ev.wheelX = ev.wheelY;\n            ev.wheelY = 0;\n        }\n\n        var t = ev.domEvent.timeStamp;\n        var dt = t - (this.$lastScrollTime||0);\n        \n        var editor = this.editor;\n        var isScrolable = editor.renderer.isScrollableBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);\n        if (isScrolable || dt < 200) {\n            this.$lastScrollTime = t;\n            editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);\n            return ev.stop();\n        }\n    };\n\n}).call(DefaultHandlers.prototype);\n\nexports.DefaultHandlers = DefaultHandlers;\n\nfunction calcDistance(ax, ay, bx, by) {\n    return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n}\n\nfunction calcRangeOrientation(range, cursor) {\n    if (range.start.row == range.end.row)\n        var cmp = 2 * cursor.column - range.start.column - range.end.column;\n    else if (range.start.row == range.end.row - 1 && !range.start.column && !range.end.column)\n        var cmp = cursor.column - 4;\n    else\n        var cmp = 2 * cursor.row - range.start.row - range.end.row;\n\n    if (cmp < 0)\n        return {cursor: range.start, anchor: range.end};\n    else\n        return {cursor: range.end, anchor: range.start};\n}\n\n});\n\nace.define(\"ace/tooltip\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nfunction Tooltip (parentNode) {\n    this.isOpen = false;\n    this.$element = null;\n    this.$parentNode = parentNode;\n}\n\n(function() {\n    this.$init = function() {\n        this.$element = dom.createElement(\"div\");\n        this.$element.className = \"ace_tooltip\";\n        this.$element.style.display = \"none\";\n        this.$parentNode.appendChild(this.$element);\n        return this.$element;\n    };\n    this.getElement = function() {\n        return this.$element || this.$init();\n    };\n    this.setText = function(text) {\n        dom.setInnerText(this.getElement(), text);\n    };\n    this.setHtml = function(html) {\n        this.getElement().innerHTML = html;\n    };\n    this.setPosition = function(x, y) {\n        this.getElement().style.left = x + \"px\";\n        this.getElement().style.top = y + \"px\";\n    };\n    this.setClassName = function(className) {\n        dom.addCssClass(this.getElement(), className);\n    };\n    this.show = function(text, x, y) {\n        if (text != null)\n            this.setText(text);\n        if (x != null && y != null)\n            this.setPosition(x, y);\n        if (!this.isOpen) {\n            this.getElement().style.display = \"block\";\n            this.isOpen = true;\n        }\n    };\n\n    this.hide = function() {\n        if (this.isOpen) {\n            this.getElement().style.display = \"none\";\n            this.isOpen = false;\n        }\n    };\n    this.getHeight = function() {\n        return this.getElement().offsetHeight;\n    };\n    this.getWidth = function() {\n        return this.getElement().offsetWidth;\n    };\n\n}).call(Tooltip.prototype);\n\nexports.Tooltip = Tooltip;\n});\n\nace.define(\"ace/mouse/default_gutter_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/event\",\"ace/tooltip\"], function(require, exports, module) {\n\"use strict\";\nvar dom = require(\"../lib/dom\");\nvar oop = require(\"../lib/oop\");\nvar event = require(\"../lib/event\");\nvar Tooltip = require(\"../tooltip\").Tooltip;\n\nfunction GutterHandler(mouseHandler) {\n    var editor = mouseHandler.editor;\n    var gutter = editor.renderer.$gutterLayer;\n    var tooltip = new GutterTooltip(editor.container);\n\n    mouseHandler.editor.setDefaultHandler(\"guttermousedown\", function(e) {\n        if (!editor.isFocused() || e.getButton() != 0)\n            return;\n        var gutterRegion = gutter.getRegion(e);\n\n        if (gutterRegion == \"foldWidgets\")\n            return;\n\n        var row = e.getDocumentPosition().row;\n        var selection = editor.session.selection;\n\n        if (e.getShiftKey())\n            selection.selectTo(row, 0);\n        else {\n            if (e.domEvent.detail == 2) {\n                editor.selectAll();\n                return e.preventDefault();\n            }\n            mouseHandler.$clickSelection = editor.selection.getLineRange(row);\n        }\n        mouseHandler.setState(\"selectByLines\");\n        mouseHandler.captureMouse(e);\n        return e.preventDefault();\n    });\n\n\n    var tooltipTimeout, mouseEvent, tooltipAnnotation;\n\n    function showTooltip() {\n        var row = mouseEvent.getDocumentPosition().row;\n        var annotation = gutter.$annotations[row];\n        if (!annotation)\n            return hideTooltip();\n\n        var maxRow = editor.session.getLength();\n        if (row == maxRow) {\n            var screenRow = editor.renderer.pixelToScreenCoordinates(0, mouseEvent.y).row;\n            var pos = mouseEvent.$pos;\n            if (screenRow > editor.session.documentToScreenRow(pos.row, pos.column))\n                return hideTooltip();\n        }\n\n        if (tooltipAnnotation == annotation)\n            return;\n        tooltipAnnotation = annotation.text.join(\"<br/>\");\n\n        tooltip.setHtml(tooltipAnnotation);\n        tooltip.show();\n        editor.on(\"mousewheel\", hideTooltip);\n\n        if (mouseHandler.$tooltipFollowsMouse) {\n            moveTooltip(mouseEvent);\n        } else {\n            var gutterElement = gutter.$cells[editor.session.documentToScreenRow(row, 0)].element;\n            var rect = gutterElement.getBoundingClientRect();\n            var style = tooltip.getElement().style;\n            style.left = rect.right + \"px\";\n            style.top = rect.bottom + \"px\";\n        }\n    }\n\n    function hideTooltip() {\n        if (tooltipTimeout)\n            tooltipTimeout = clearTimeout(tooltipTimeout);\n        if (tooltipAnnotation) {\n            tooltip.hide();\n            tooltipAnnotation = null;\n            editor.removeEventListener(\"mousewheel\", hideTooltip);\n        }\n    }\n\n    function moveTooltip(e) {\n        tooltip.setPosition(e.x, e.y);\n    }\n\n    mouseHandler.editor.setDefaultHandler(\"guttermousemove\", function(e) {\n        var target = e.domEvent.target || e.domEvent.srcElement;\n        if (dom.hasCssClass(target, \"ace_fold-widget\"))\n            return hideTooltip();\n\n        if (tooltipAnnotation && mouseHandler.$tooltipFollowsMouse)\n            moveTooltip(e);\n\n        mouseEvent = e;\n        if (tooltipTimeout)\n            return;\n        tooltipTimeout = setTimeout(function() {\n            tooltipTimeout = null;\n            if (mouseEvent && !mouseHandler.isMousePressed)\n                showTooltip();\n            else\n                hideTooltip();\n        }, 50);\n    });\n\n    event.addListener(editor.renderer.$gutter, \"mouseout\", function(e) {\n        mouseEvent = null;\n        if (!tooltipAnnotation || tooltipTimeout)\n            return;\n\n        tooltipTimeout = setTimeout(function() {\n            tooltipTimeout = null;\n            hideTooltip();\n        }, 50);\n    });\n    \n    editor.on(\"changeSession\", hideTooltip);\n}\n\nfunction GutterTooltip(parentNode) {\n    Tooltip.call(this, parentNode);\n}\n\noop.inherits(GutterTooltip, Tooltip);\n\n(function(){\n    this.setPosition = function(x, y) {\n        var windowWidth = window.innerWidth || document.documentElement.clientWidth;\n        var windowHeight = window.innerHeight || document.documentElement.clientHeight;\n        var width = this.getWidth();\n        var height = this.getHeight();\n        x += 15;\n        y += 15;\n        if (x + width > windowWidth) {\n            x -= (x + width) - windowWidth;\n        }\n        if (y + height > windowHeight) {\n            y -= 20 + height;\n        }\n        Tooltip.prototype.setPosition.call(this, x, y);\n    };\n\n}).call(GutterTooltip.prototype);\n\n\n\nexports.GutterHandler = GutterHandler;\n\n});\n\nace.define(\"ace/mouse/mouse_event\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nvar MouseEvent = exports.MouseEvent = function(domEvent, editor) {\n    this.domEvent = domEvent;\n    this.editor = editor;\n    \n    this.x = this.clientX = domEvent.clientX;\n    this.y = this.clientY = domEvent.clientY;\n\n    this.$pos = null;\n    this.$inSelection = null;\n    \n    this.propagationStopped = false;\n    this.defaultPrevented = false;\n};\n\n(function() {  \n    \n    this.stopPropagation = function() {\n        event.stopPropagation(this.domEvent);\n        this.propagationStopped = true;\n    };\n    \n    this.preventDefault = function() {\n        event.preventDefault(this.domEvent);\n        this.defaultPrevented = true;\n    };\n    \n    this.stop = function() {\n        this.stopPropagation();\n        this.preventDefault();\n    };\n    this.getDocumentPosition = function() {\n        if (this.$pos)\n            return this.$pos;\n        \n        this.$pos = this.editor.renderer.screenToTextCoordinates(this.clientX, this.clientY);\n        return this.$pos;\n    };\n    this.inSelection = function() {\n        if (this.$inSelection !== null)\n            return this.$inSelection;\n            \n        var editor = this.editor;\n        \n\n        var selectionRange = editor.getSelectionRange();\n        if (selectionRange.isEmpty())\n            this.$inSelection = false;\n        else {\n            var pos = this.getDocumentPosition();\n            this.$inSelection = selectionRange.contains(pos.row, pos.column);\n        }\n\n        return this.$inSelection;\n    };\n    this.getButton = function() {\n        return event.getButton(this.domEvent);\n    };\n    this.getShiftKey = function() {\n        return this.domEvent.shiftKey;\n    };\n    \n    this.getAccelKey = useragent.isMac\n        ? function() { return this.domEvent.metaKey; }\n        : function() { return this.domEvent.ctrlKey; };\n    \n}).call(MouseEvent.prototype);\n\n});\n\nace.define(\"ace/mouse/dragdrop_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar dom = require(\"../lib/dom\");\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\n\nvar AUTOSCROLL_DELAY = 200;\nvar SCROLL_CURSOR_DELAY = 200;\nvar SCROLL_CURSOR_HYSTERESIS = 5;\n\nfunction DragdropHandler(mouseHandler) {\n\n    var editor = mouseHandler.editor;\n\n    var blankImage = dom.createElement(\"img\");\n    blankImage.src = \"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\";\n    if (useragent.isOpera)\n        blankImage.style.cssText = \"width:1px;height:1px;position:fixed;top:0;left:0;z-index:2147483647;opacity:0;\";\n\n    var exports = [\"dragWait\", \"dragWaitEnd\", \"startDrag\", \"dragReadyEnd\", \"onMouseDrag\"];\n\n     exports.forEach(function(x) {\n         mouseHandler[x] = this[x];\n    }, this);\n    editor.addEventListener(\"mousedown\", this.onMouseDown.bind(mouseHandler));\n\n\n    var mouseTarget = editor.container;\n    var dragSelectionMarker, x, y;\n    var timerId, range;\n    var dragCursor, counter = 0;\n    var dragOperation;\n    var isInternal;\n    var autoScrollStartTime;\n    var cursorMovedTime;\n    var cursorPointOnCaretMoved;\n\n    this.onDragStart = function(e) {\n        if (this.cancelDrag || !mouseTarget.draggable) {\n            var self = this;\n            setTimeout(function(){\n                self.startSelect();\n                self.captureMouse(e);\n            }, 0);\n            return e.preventDefault();\n        }\n        range = editor.getSelectionRange();\n\n        var dataTransfer = e.dataTransfer;\n        dataTransfer.effectAllowed = editor.getReadOnly() ? \"copy\" : \"copyMove\";\n        if (useragent.isOpera) {\n            editor.container.appendChild(blankImage);\n            blankImage.scrollTop = 0;\n        }\n        dataTransfer.setDragImage && dataTransfer.setDragImage(blankImage, 0, 0);\n        if (useragent.isOpera) {\n            editor.container.removeChild(blankImage);\n        }\n        dataTransfer.clearData();\n        dataTransfer.setData(\"Text\", editor.session.getTextRange());\n\n        isInternal = true;\n        this.setState(\"drag\");\n    };\n\n    this.onDragEnd = function(e) {\n        mouseTarget.draggable = false;\n        isInternal = false;\n        this.setState(null);\n        if (!editor.getReadOnly()) {\n            var dropEffect = e.dataTransfer.dropEffect;\n            if (!dragOperation && dropEffect == \"move\")\n                editor.session.remove(editor.getSelectionRange());\n            editor.renderer.$cursorLayer.setBlinking(true);\n        }\n        this.editor.unsetStyle(\"ace_dragging\");\n        this.editor.renderer.setCursorStyle(\"\");\n    };\n\n    this.onDragEnter = function(e) {\n        if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n            return;\n        x = e.clientX;\n        y = e.clientY;\n        if (!dragSelectionMarker)\n            addDragMarker();\n        counter++;\n        e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n        return event.preventDefault(e);\n    };\n\n    this.onDragOver = function(e) {\n        if (editor.getReadOnly() || !canAccept(e.dataTransfer))\n            return;\n        x = e.clientX;\n        y = e.clientY;\n        if (!dragSelectionMarker) {\n            addDragMarker();\n            counter++;\n        }\n        if (onMouseMoveTimer !== null)\n            onMouseMoveTimer = null;\n\n        e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n        return event.preventDefault(e);\n    };\n\n    this.onDragLeave = function(e) {\n        counter--;\n        if (counter <= 0 && dragSelectionMarker) {\n            clearDragMarker();\n            dragOperation = null;\n            return event.preventDefault(e);\n        }\n    };\n\n    this.onDrop = function(e) {\n        if (!dragCursor)\n            return;\n        var dataTransfer = e.dataTransfer;\n        if (isInternal) {\n            switch (dragOperation) {\n                case \"move\":\n                    if (range.contains(dragCursor.row, dragCursor.column)) {\n                        range = {\n                            start: dragCursor,\n                            end: dragCursor\n                        };\n                    } else {\n                        range = editor.moveText(range, dragCursor);\n                    }\n                    break;\n                case \"copy\":\n                    range = editor.moveText(range, dragCursor, true);\n                    break;\n            }\n        } else {\n            var dropData = dataTransfer.getData('Text');\n            range = {\n                start: dragCursor,\n                end: editor.session.insert(dragCursor, dropData)\n            };\n            editor.focus();\n            dragOperation = null;\n        }\n        clearDragMarker();\n        return event.preventDefault(e);\n    };\n\n    event.addListener(mouseTarget, \"dragstart\", this.onDragStart.bind(mouseHandler));\n    event.addListener(mouseTarget, \"dragend\", this.onDragEnd.bind(mouseHandler));\n    event.addListener(mouseTarget, \"dragenter\", this.onDragEnter.bind(mouseHandler));\n    event.addListener(mouseTarget, \"dragover\", this.onDragOver.bind(mouseHandler));\n    event.addListener(mouseTarget, \"dragleave\", this.onDragLeave.bind(mouseHandler));\n    event.addListener(mouseTarget, \"drop\", this.onDrop.bind(mouseHandler));\n\n    function scrollCursorIntoView(cursor, prevCursor) {\n        var now = Date.now();\n        var vMovement = !prevCursor || cursor.row != prevCursor.row;\n        var hMovement = !prevCursor || cursor.column != prevCursor.column;\n        if (!cursorMovedTime || vMovement || hMovement) {\n            editor.$blockScrolling += 1;\n            editor.moveCursorToPosition(cursor);\n            editor.$blockScrolling -= 1;\n            cursorMovedTime = now;\n            cursorPointOnCaretMoved = {x: x, y: y};\n        } else {\n            var distance = calcDistance(cursorPointOnCaretMoved.x, cursorPointOnCaretMoved.y, x, y);\n            if (distance > SCROLL_CURSOR_HYSTERESIS) {\n                cursorMovedTime = null;\n            } else if (now - cursorMovedTime >= SCROLL_CURSOR_DELAY) {\n                editor.renderer.scrollCursorIntoView();\n                cursorMovedTime = null;\n            }\n        }\n    }\n\n    function autoScroll(cursor, prevCursor) {\n        var now = Date.now();\n        var lineHeight = editor.renderer.layerConfig.lineHeight;\n        var characterWidth = editor.renderer.layerConfig.characterWidth;\n        var editorRect = editor.renderer.scroller.getBoundingClientRect();\n        var offsets = {\n           x: {\n               left: x - editorRect.left,\n               right: editorRect.right - x\n           },\n           y: {\n               top: y - editorRect.top,\n               bottom: editorRect.bottom - y\n           }\n        };\n        var nearestXOffset = Math.min(offsets.x.left, offsets.x.right);\n        var nearestYOffset = Math.min(offsets.y.top, offsets.y.bottom);\n        var scrollCursor = {row: cursor.row, column: cursor.column};\n        if (nearestXOffset / characterWidth <= 2) {\n            scrollCursor.column += (offsets.x.left < offsets.x.right ? -3 : +2);\n        }\n        if (nearestYOffset / lineHeight <= 1) {\n            scrollCursor.row += (offsets.y.top < offsets.y.bottom ? -1 : +1);\n        }\n        var vScroll = cursor.row != scrollCursor.row;\n        var hScroll = cursor.column != scrollCursor.column;\n        var vMovement = !prevCursor || cursor.row != prevCursor.row;\n        if (vScroll || (hScroll && !vMovement)) {\n            if (!autoScrollStartTime)\n                autoScrollStartTime = now;\n            else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY)\n                editor.renderer.scrollCursorIntoView(scrollCursor);\n        } else {\n            autoScrollStartTime = null;\n        }\n    }\n\n    function onDragInterval() {\n        var prevCursor = dragCursor;\n        dragCursor = editor.renderer.screenToTextCoordinates(x, y);\n        scrollCursorIntoView(dragCursor, prevCursor);\n        autoScroll(dragCursor, prevCursor);\n    }\n\n    function addDragMarker() {\n        range = editor.selection.toOrientedRange();\n        dragSelectionMarker = editor.session.addMarker(range, \"ace_selection\", editor.getSelectionStyle());\n        editor.clearSelection();\n        if (editor.isFocused())\n            editor.renderer.$cursorLayer.setBlinking(false);\n        clearInterval(timerId);\n        onDragInterval();\n        timerId = setInterval(onDragInterval, 20);\n        counter = 0;\n        event.addListener(document, \"mousemove\", onMouseMove);\n    }\n\n    function clearDragMarker() {\n        clearInterval(timerId);\n        editor.session.removeMarker(dragSelectionMarker);\n        dragSelectionMarker = null;\n        editor.$blockScrolling += 1;\n        editor.selection.fromOrientedRange(range);\n        editor.$blockScrolling -= 1;\n        if (editor.isFocused() && !isInternal)\n            editor.renderer.$cursorLayer.setBlinking(!editor.getReadOnly());\n        range = null;\n        dragCursor = null;\n        counter = 0;\n        autoScrollStartTime = null;\n        cursorMovedTime = null;\n        event.removeListener(document, \"mousemove\", onMouseMove);\n    }\n    var onMouseMoveTimer = null;\n    function onMouseMove() {\n        if (onMouseMoveTimer == null) {\n            onMouseMoveTimer = setTimeout(function() {\n                if (onMouseMoveTimer != null && dragSelectionMarker)\n                    clearDragMarker();\n            }, 20);\n        }\n    }\n\n    function canAccept(dataTransfer) {\n        var types = dataTransfer.types;\n        return !types || Array.prototype.some.call(types, function(type) {\n            return type == 'text/plain' || type == 'Text';\n        });\n    }\n\n    function getDropEffect(e) {\n        var copyAllowed = ['copy', 'copymove', 'all', 'uninitialized'];\n        var moveAllowed = ['move', 'copymove', 'linkmove', 'all', 'uninitialized'];\n\n        var copyModifierState = useragent.isMac ? e.altKey : e.ctrlKey;\n        var effectAllowed = \"uninitialized\";\n        try {\n            effectAllowed = e.dataTransfer.effectAllowed.toLowerCase();\n        } catch (e) {}\n        var dropEffect = \"none\";\n\n        if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0)\n            dropEffect = \"copy\";\n        else if (moveAllowed.indexOf(effectAllowed) >= 0)\n            dropEffect = \"move\";\n        else if (copyAllowed.indexOf(effectAllowed) >= 0)\n            dropEffect = \"copy\";\n\n        return dropEffect;\n    }\n}\n\n(function() {\n\n    this.dragWait = function() {\n        var interval = Date.now() - this.mousedownEvent.time;\n        if (interval > this.editor.getDragDelay())\n            this.startDrag();\n    };\n\n    this.dragWaitEnd = function() {\n        var target = this.editor.container;\n        target.draggable = false;\n        this.startSelect(this.mousedownEvent.getDocumentPosition());\n        this.selectEnd();\n    };\n\n    this.dragReadyEnd = function(e) {\n        this.editor.renderer.$cursorLayer.setBlinking(!this.editor.getReadOnly());\n        this.editor.unsetStyle(\"ace_dragging\");\n        this.editor.renderer.setCursorStyle(\"\");\n        this.dragWaitEnd();\n    };\n\n    this.startDrag = function(){\n        this.cancelDrag = false;\n        var editor = this.editor;\n        var target = editor.container;\n        target.draggable = true;\n        editor.renderer.$cursorLayer.setBlinking(false);\n        editor.setStyle(\"ace_dragging\");\n        var cursorStyle = useragent.isWin ? \"default\" : \"move\";\n        editor.renderer.setCursorStyle(cursorStyle);\n        this.setState(\"dragReady\");\n    };\n\n    this.onMouseDrag = function(e) {\n        var target = this.editor.container;\n        if (useragent.isIE && this.state == \"dragReady\") {\n            var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n            if (distance > 3)\n                target.dragDrop();\n        }\n        if (this.state === \"dragWait\") {\n            var distance = calcDistance(this.mousedownEvent.x, this.mousedownEvent.y, this.x, this.y);\n            if (distance > 0) {\n                target.draggable = false;\n                this.startSelect(this.mousedownEvent.getDocumentPosition());\n            }\n        }\n    };\n\n    this.onMouseDown = function(e) {\n        if (!this.$dragEnabled)\n            return;\n        this.mousedownEvent = e;\n        var editor = this.editor;\n\n        var inSelection = e.inSelection();\n        var button = e.getButton();\n        var clickCount = e.domEvent.detail || 1;\n        if (clickCount === 1 && button === 0 && inSelection) {\n            if (e.editor.inMultiSelectMode && (e.getAccelKey() || e.getShiftKey()))\n                return;\n            this.mousedownEvent.time = Date.now();\n            var eventTarget = e.domEvent.target || e.domEvent.srcElement;\n            if (\"unselectable\" in eventTarget)\n                eventTarget.unselectable = \"on\";\n            if (editor.getDragDelay()) {\n                if (useragent.isWebKit) {\n                    this.cancelDrag = true;\n                    var mouseTarget = editor.container;\n                    mouseTarget.draggable = true;\n                }\n                this.setState(\"dragWait\");\n            } else {\n                this.startDrag();\n            }\n            this.captureMouse(e, this.onMouseDrag.bind(this));\n            e.defaultPrevented = true;\n        }\n    };\n\n}).call(DragdropHandler.prototype);\n\n\nfunction calcDistance(ax, ay, bx, by) {\n    return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n}\n\nexports.DragdropHandler = DragdropHandler;\n\n});\n\nace.define(\"ace/lib/net\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\nvar dom = require(\"./dom\");\n\nexports.get = function (url, callback) {\n    var xhr = new XMLHttpRequest();\n    xhr.open('GET', url, true);\n    xhr.onreadystatechange = function () {\n        if (xhr.readyState === 4) {\n            callback(xhr.responseText);\n        }\n    };\n    xhr.send(null);\n};\n\nexports.loadScript = function(path, callback) {\n    var head = dom.getDocumentHead();\n    var s = document.createElement('script');\n\n    s.src = path;\n    head.appendChild(s);\n\n    s.onload = s.onreadystatechange = function(_, isAbort) {\n        if (isAbort || !s.readyState || s.readyState == \"loaded\" || s.readyState == \"complete\") {\n            s = s.onload = s.onreadystatechange = null;\n            if (!isAbort)\n                callback();\n        }\n    };\n};\nexports.qualifyURL = function(url) {\n    var a = document.createElement('a');\n    a.href = url;\n    return a.href;\n}\n\n});\n\nace.define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nvar EventEmitter = {};\nvar stopPropagation = function() { this.propagationStopped = true; };\nvar preventDefault = function() { this.defaultPrevented = true; };\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n    this._eventRegistry || (this._eventRegistry = {});\n    this._defaultHandlers || (this._defaultHandlers = {});\n\n    var listeners = this._eventRegistry[eventName] || [];\n    var defaultHandler = this._defaultHandlers[eventName];\n    if (!listeners.length && !defaultHandler)\n        return;\n\n    if (typeof e != \"object\" || !e)\n        e = {};\n\n    if (!e.type)\n        e.type = eventName;\n    if (!e.stopPropagation)\n        e.stopPropagation = stopPropagation;\n    if (!e.preventDefault)\n        e.preventDefault = preventDefault;\n\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++) {\n        listeners[i](e, this);\n        if (e.propagationStopped)\n            break;\n    }\n    \n    if (defaultHandler && !e.defaultPrevented)\n        return defaultHandler(e, this);\n};\n\n\nEventEmitter._signal = function(eventName, e) {\n    var listeners = (this._eventRegistry || {})[eventName];\n    if (!listeners)\n        return;\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++)\n        listeners[i](e, this);\n};\n\nEventEmitter.once = function(eventName, callback) {\n    var _self = this;\n    callback && this.addEventListener(eventName, function newCallback() {\n        _self.removeEventListener(eventName, newCallback);\n        callback.apply(null, arguments);\n    });\n};\n\n\nEventEmitter.setDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        handlers = this._defaultHandlers = {_disabled_: {}};\n    \n    if (handlers[eventName]) {\n        var old = handlers[eventName];\n        var disabled = handlers._disabled_[eventName];\n        if (!disabled)\n            handlers._disabled_[eventName] = disabled = [];\n        disabled.push(old);\n        var i = disabled.indexOf(callback);\n        if (i != -1) \n            disabled.splice(i, 1);\n    }\n    handlers[eventName] = callback;\n};\nEventEmitter.removeDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        return;\n    var disabled = handlers._disabled_[eventName];\n    \n    if (handlers[eventName] == callback) {\n        var old = handlers[eventName];\n        if (disabled)\n            this.setDefaultHandler(eventName, disabled.pop());\n    } else if (disabled) {\n        var i = disabled.indexOf(callback);\n        if (i != -1)\n            disabled.splice(i, 1);\n    }\n};\n\nEventEmitter.on =\nEventEmitter.addEventListener = function(eventName, callback, capturing) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        listeners = this._eventRegistry[eventName] = [];\n\n    if (listeners.indexOf(callback) == -1)\n        listeners[capturing ? \"unshift\" : \"push\"](callback);\n    return callback;\n};\n\nEventEmitter.off =\nEventEmitter.removeListener =\nEventEmitter.removeEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        return;\n\n    var index = listeners.indexOf(callback);\n    if (index !== -1)\n        listeners.splice(index, 1);\n};\n\nEventEmitter.removeAllListeners = function(eventName) {\n    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n};\n\nexports.EventEmitter = EventEmitter;\n\n});\n\nace.define(\"ace/lib/app_config\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"no use strict\";\n\nvar oop = require(\"./oop\");\nvar EventEmitter = require(\"./event_emitter\").EventEmitter;\n\nvar optionsProvider = {\n    setOptions: function(optList) {\n        Object.keys(optList).forEach(function(key) {\n            this.setOption(key, optList[key]);\n        }, this);\n    },\n    getOptions: function(optionNames) {\n        var result = {};\n        if (!optionNames) {\n            optionNames = Object.keys(this.$options);\n        } else if (!Array.isArray(optionNames)) {\n            result = optionNames;\n            optionNames = Object.keys(result);\n        }\n        optionNames.forEach(function(key) {\n            result[key] = this.getOption(key);\n        }, this);\n        return result;\n    },\n    setOption: function(name, value) {\n        if (this[\"$\" + name] === value)\n            return;\n        var opt = this.$options[name];\n        if (!opt) {\n            return warn('misspelled option \"' + name + '\"');\n        }\n        if (opt.forwardTo)\n            return this[opt.forwardTo] && this[opt.forwardTo].setOption(name, value);\n\n        if (!opt.handlesSet)\n            this[\"$\" + name] = value;\n        if (opt && opt.set)\n            opt.set.call(this, value);\n    },\n    getOption: function(name) {\n        var opt = this.$options[name];\n        if (!opt) {\n            return warn('misspelled option \"' + name + '\"');\n        }\n        if (opt.forwardTo)\n            return this[opt.forwardTo] && this[opt.forwardTo].getOption(name);\n        return opt && opt.get ? opt.get.call(this) : this[\"$\" + name];\n    }\n};\n\nfunction warn(message) {\n    if (typeof console != \"undefined\" && console.warn)\n        console.warn.apply(console, arguments);\n}\n\nfunction reportError(msg, data) {\n    var e = new Error(msg);\n    e.data = data;\n    if (typeof console == \"object\" && console.error)\n        console.error(e);\n    setTimeout(function() { throw e; });\n}\n\nvar AppConfig = function() {\n    this.$defaultOptions = {};\n};\n\n(function() {\n    oop.implement(this, EventEmitter);\n    this.defineOptions = function(obj, path, options) {\n        if (!obj.$options)\n            this.$defaultOptions[path] = obj.$options = {};\n\n        Object.keys(options).forEach(function(key) {\n            var opt = options[key];\n            if (typeof opt == \"string\")\n                opt = {forwardTo: opt};\n\n            opt.name || (opt.name = key);\n            obj.$options[opt.name] = opt;\n            if (\"initialValue\" in opt)\n                obj[\"$\" + opt.name] = opt.initialValue;\n        });\n        oop.implement(obj, optionsProvider);\n\n        return this;\n    };\n\n    this.resetOptions = function(obj) {\n        Object.keys(obj.$options).forEach(function(key) {\n            var opt = obj.$options[key];\n            if (\"value\" in opt)\n                obj.setOption(key, opt.value);\n        });\n    };\n\n    this.setDefaultValue = function(path, name, value) {\n        var opts = this.$defaultOptions[path] || (this.$defaultOptions[path] = {});\n        if (opts[name]) {\n            if (opts.forwardTo)\n                this.setDefaultValue(opts.forwardTo, name, value);\n            else\n                opts[name].value = value;\n        }\n    };\n\n    this.setDefaultValues = function(path, optionHash) {\n        Object.keys(optionHash).forEach(function(key) {\n            this.setDefaultValue(path, key, optionHash[key]);\n        }, this);\n    };\n    \n    this.warn = warn;\n    this.reportError = reportError;\n    \n}).call(AppConfig.prototype);\n\nexports.AppConfig = AppConfig;\n\n});\n\nace.define(\"ace/config\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/lib/net\",\"ace/lib/app_config\"], function(require, exports, module) {\n\"no use strict\";\n\nvar lang = require(\"./lib/lang\");\nvar oop = require(\"./lib/oop\");\nvar net = require(\"./lib/net\");\nvar AppConfig = require(\"./lib/app_config\").AppConfig;\n\nmodule.exports = exports = new AppConfig();\n\nvar global = (function() {\n    return this;\n})();\n\nvar options = {\n    packaged: false,\n    workerPath: null,\n    modePath: null,\n    themePath: null,\n    basePath: \"\",\n    suffix: \".js\",\n    $moduleUrls: {}\n};\n\nexports.get = function(key) {\n    if (!options.hasOwnProperty(key))\n        throw new Error(\"Unknown config key: \" + key);\n\n    return options[key];\n};\n\nexports.set = function(key, value) {\n    if (!options.hasOwnProperty(key))\n        throw new Error(\"Unknown config key: \" + key);\n\n    options[key] = value;\n};\n\nexports.all = function() {\n    return lang.copyObject(options);\n};\nexports.moduleUrl = function(name, component) {\n    if (options.$moduleUrls[name])\n        return options.$moduleUrls[name];\n\n    var parts = name.split(\"/\");\n    component = component || parts[parts.length - 2] || \"\";\n    var sep = component == \"snippets\" ? \"/\" : \"-\";\n    var base = parts[parts.length - 1];\n    if (component == \"worker\" && sep == \"-\") {\n        var re = new RegExp(\"^\" + component + \"[\\\\-_]|[\\\\-_]\" + component + \"$\", \"g\");\n        base = base.replace(re, \"\");\n    }\n\n    if ((!base || base == component) && parts.length > 1)\n        base = parts[parts.length - 2];\n    var path = options[component + \"Path\"];\n    if (path == null) {\n        path = options.basePath;\n    } else if (sep == \"/\") {\n        component = sep = \"\";\n    }\n    if (path && path.slice(-1) != \"/\")\n        path += \"/\";\n    return path + component + sep + base + this.get(\"suffix\");\n};\n\nexports.setModuleUrl = function(name, subst) {\n    return options.$moduleUrls[name] = subst;\n};\n\nexports.$loading = {};\nexports.loadModule = function(moduleName, onLoad) {\n    var module, moduleType;\n    if (Array.isArray(moduleName)) {\n        moduleType = moduleName[0];\n        moduleName = moduleName[1];\n    }\n\n    try {\n        module = require(moduleName);\n    } catch (e) {}\n    if (module && !exports.$loading[moduleName])\n        return onLoad && onLoad(module);\n\n    if (!exports.$loading[moduleName])\n        exports.$loading[moduleName] = [];\n\n    exports.$loading[moduleName].push(onLoad);\n\n    if (exports.$loading[moduleName].length > 1)\n        return;\n\n    var afterLoad = function() {\n        require([moduleName], function(module) {\n            exports._emit(\"load.module\", {name: moduleName, module: module});\n            var listeners = exports.$loading[moduleName];\n            exports.$loading[moduleName] = null;\n            listeners.forEach(function(onLoad) {\n                onLoad && onLoad(module);\n            });\n        });\n    };\n\n    if (!exports.get(\"packaged\"))\n        return afterLoad();\n    net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad);\n};\ninit(true);function init(packaged) {\n\n    options.packaged = packaged || require.packaged || module.packaged || (global.define && define.packaged);\n\n    if (!global.document)\n        return \"\";\n\n    var scriptOptions = {};\n    var scriptUrl = \"\";\n    var currentScript = (document.currentScript || document._currentScript ); // native or polyfill\n    var currentDocument = currentScript && currentScript.ownerDocument || document;\n    \n    var scripts = currentDocument.getElementsByTagName(\"script\");\n    for (var i=0; i<scripts.length; i++) {\n        var script = scripts[i];\n\n        var src = script.src || script.getAttribute(\"src\");\n        if (!src)\n            continue;\n\n        var attributes = script.attributes;\n        for (var j=0, l=attributes.length; j < l; j++) {\n            var attr = attributes[j];\n            if (attr.name.indexOf(\"data-ace-\") === 0) {\n                scriptOptions[deHyphenate(attr.name.replace(/^data-ace-/, \"\"))] = attr.value;\n            }\n        }\n\n        var m = src.match(/^(.*)\\/ace(\\-\\w+)?\\.js(\\?|$)/);\n        if (m)\n            scriptUrl = m[1];\n    }\n\n    if (scriptUrl) {\n        scriptOptions.base = scriptOptions.base || scriptUrl;\n        scriptOptions.packaged = true;\n    }\n\n    scriptOptions.basePath = scriptOptions.base;\n    scriptOptions.workerPath = scriptOptions.workerPath || scriptOptions.base;\n    scriptOptions.modePath = scriptOptions.modePath || scriptOptions.base;\n    scriptOptions.themePath = scriptOptions.themePath || scriptOptions.base;\n    delete scriptOptions.base;\n\n    for (var key in scriptOptions)\n        if (typeof scriptOptions[key] !== \"undefined\")\n            exports.set(key, scriptOptions[key]);\n};\n\nexports.init = init;\n\nfunction deHyphenate(str) {\n    return str.replace(/-(.)/g, function(m, m1) { return m1.toUpperCase(); });\n}\n\n});\n\nace.define(\"ace/mouse/mouse_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\",\"ace/mouse/default_handlers\",\"ace/mouse/default_gutter_handler\",\"ace/mouse/mouse_event\",\"ace/mouse/dragdrop_handler\",\"ace/config\"], function(require, exports, module) {\n\"use strict\";\n\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nvar DefaultHandlers = require(\"./default_handlers\").DefaultHandlers;\nvar DefaultGutterHandler = require(\"./default_gutter_handler\").GutterHandler;\nvar MouseEvent = require(\"./mouse_event\").MouseEvent;\nvar DragdropHandler = require(\"./dragdrop_handler\").DragdropHandler;\nvar config = require(\"../config\");\n\nvar MouseHandler = function(editor) {\n    var _self = this;\n    this.editor = editor;\n\n    new DefaultHandlers(this);\n    new DefaultGutterHandler(this);\n    new DragdropHandler(this);\n\n    var focusEditor = function(e) {\n        if (!document.hasFocus || !document.hasFocus())\n            window.focus();\n        editor.focus();\n    };\n\n    var mouseTarget = editor.renderer.getMouseEventTarget();\n    event.addListener(mouseTarget, \"click\", this.onMouseEvent.bind(this, \"click\"));\n    event.addListener(mouseTarget, \"mousemove\", this.onMouseMove.bind(this, \"mousemove\"));\n    event.addMultiMouseDownListener(mouseTarget, [400, 300, 250], this, \"onMouseEvent\");\n    if (editor.renderer.scrollBarV) {\n        event.addMultiMouseDownListener(editor.renderer.scrollBarV.inner, [400, 300, 250], this, \"onMouseEvent\");\n        event.addMultiMouseDownListener(editor.renderer.scrollBarH.inner, [400, 300, 250], this, \"onMouseEvent\");\n        if (useragent.isIE) {\n            event.addListener(editor.renderer.scrollBarV.element, \"mousedown\", focusEditor);\n            event.addListener(editor.renderer.scrollBarH.element, \"mousedown\", focusEditor);\n        }\n    }\n    event.addMouseWheelListener(editor.container, this.onMouseWheel.bind(this, \"mousewheel\"));\n\n    var gutterEl = editor.renderer.$gutter;\n    event.addListener(gutterEl, \"mousedown\", this.onMouseEvent.bind(this, \"guttermousedown\"));\n    event.addListener(gutterEl, \"click\", this.onMouseEvent.bind(this, \"gutterclick\"));\n    event.addListener(gutterEl, \"dblclick\", this.onMouseEvent.bind(this, \"gutterdblclick\"));\n    event.addListener(gutterEl, \"mousemove\", this.onMouseEvent.bind(this, \"guttermousemove\"));\n\n    event.addListener(mouseTarget, \"mousedown\", focusEditor);\n\n    event.addListener(gutterEl, \"mousedown\", function(e) {\n        editor.focus();\n        return event.preventDefault(e);\n    });\n\n    editor.on(\"mousemove\", function(e){\n        if (_self.state || _self.$dragDelay || !_self.$dragEnabled)\n            return;\n\n        var character = editor.renderer.screenToTextCoordinates(e.x, e.y);\n        var range = editor.session.selection.getRange();\n        var renderer = editor.renderer;\n\n        if (!range.isEmpty() && range.insideStart(character.row, character.column)) {\n            renderer.setCursorStyle(\"default\");\n        } else {\n            renderer.setCursorStyle(\"\");\n        }\n    });\n};\n\n(function() {\n    this.onMouseEvent = function(name, e) {\n        this.editor._emit(name, new MouseEvent(e, this.editor));\n    };\n\n    this.onMouseMove = function(name, e) {\n        var listeners = this.editor._eventRegistry && this.editor._eventRegistry.mousemove;\n        if (!listeners || !listeners.length)\n            return;\n\n        this.editor._emit(name, new MouseEvent(e, this.editor));\n    };\n\n    this.onMouseWheel = function(name, e) {\n        var mouseEvent = new MouseEvent(e, this.editor);\n        mouseEvent.speed = this.$scrollSpeed * 2;\n        mouseEvent.wheelX = e.wheelX;\n        mouseEvent.wheelY = e.wheelY;\n\n        this.editor._emit(name, mouseEvent);\n    };\n\n    this.setState = function(state) {\n        this.state = state;\n    };\n\n    this.captureMouse = function(ev, mouseMoveHandler) {\n        this.x = ev.x;\n        this.y = ev.y;\n\n        this.isMousePressed = true;\n        var renderer = this.editor.renderer;\n        if (renderer.$keepTextAreaAtCursor)\n            renderer.$keepTextAreaAtCursor = null;\n\n        var self = this;\n        var onMouseMove = function(e) {\n            if (!e) return;\n            if (useragent.isWebKit && !e.which && self.releaseMouse)\n                return self.releaseMouse();\n\n            self.x = e.clientX;\n            self.y = e.clientY;\n            mouseMoveHandler && mouseMoveHandler(e);\n            self.mouseEvent = new MouseEvent(e, self.editor);\n            self.$mouseMoved = true;\n        };\n\n        var onCaptureEnd = function(e) {\n            clearInterval(timerId);\n            onCaptureInterval();\n            self[self.state + \"End\"] && self[self.state + \"End\"](e);\n            self.state = \"\";\n            if (renderer.$keepTextAreaAtCursor == null) {\n                renderer.$keepTextAreaAtCursor = true;\n                renderer.$moveTextAreaToCursor();\n            }\n            self.isMousePressed = false;\n            self.$onCaptureMouseMove = self.releaseMouse = null;\n            e && self.onMouseEvent(\"mouseup\", e);\n        };\n\n        var onCaptureInterval = function() {\n            self[self.state] && self[self.state]();\n            self.$mouseMoved = false;\n        };\n\n        if (useragent.isOldIE && ev.domEvent.type == \"dblclick\") {\n            return setTimeout(function() {onCaptureEnd(ev);});\n        }\n\n        self.$onCaptureMouseMove = onMouseMove;\n        self.releaseMouse = event.capture(this.editor.container, onMouseMove, onCaptureEnd);\n        var timerId = setInterval(onCaptureInterval, 20);\n    };\n    this.releaseMouse = null;\n    this.cancelContextMenu = function() {\n        var stop = function(e) {\n            if (e && e.domEvent && e.domEvent.type != \"contextmenu\")\n                return;\n            this.editor.off(\"nativecontextmenu\", stop);\n            if (e && e.domEvent)\n                event.stopEvent(e.domEvent);\n        }.bind(this);\n        setTimeout(stop, 10);\n        this.editor.on(\"nativecontextmenu\", stop);\n    };\n}).call(MouseHandler.prototype);\n\nconfig.defineOptions(MouseHandler.prototype, \"mouseHandler\", {\n    scrollSpeed: {initialValue: 2},\n    dragDelay: {initialValue: (useragent.isMac ? 150 : 0)},\n    dragEnabled: {initialValue: true},\n    focusTimout: {initialValue: 0},\n    tooltipFollowsMouse: {initialValue: true}\n});\n\n\nexports.MouseHandler = MouseHandler;\n});\n\nace.define(\"ace/mouse/fold_handler\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nfunction FoldHandler(editor) {\n\n    editor.on(\"click\", function(e) {\n        var position = e.getDocumentPosition();\n        var session = editor.session;\n        var fold = session.getFoldAt(position.row, position.column, 1);\n        if (fold) {\n            if (e.getAccelKey())\n                session.removeFold(fold);\n            else\n                session.expandFold(fold);\n\n            e.stop();\n        }\n    });\n\n    editor.on(\"gutterclick\", function(e) {\n        var gutterRegion = editor.renderer.$gutterLayer.getRegion(e);\n\n        if (gutterRegion == \"foldWidgets\") {\n            var row = e.getDocumentPosition().row;\n            var session = editor.session;\n            if (session.foldWidgets && session.foldWidgets[row])\n                editor.session.onFoldWidgetClick(row, e);\n            if (!editor.isFocused())\n                editor.focus();\n            e.stop();\n        }\n    });\n\n    editor.on(\"gutterdblclick\", function(e) {\n        var gutterRegion = editor.renderer.$gutterLayer.getRegion(e);\n\n        if (gutterRegion == \"foldWidgets\") {\n            var row = e.getDocumentPosition().row;\n            var session = editor.session;\n            var data = session.getParentFoldRangeData(row, true);\n            var range = data.range || data.firstRange;\n\n            if (range) {\n                row = range.start.row;\n                var fold = session.getFoldAt(row, session.getLine(row).length, 1);\n\n                if (fold) {\n                    session.removeFold(fold);\n                } else {\n                    session.addFold(\"...\", range);\n                    editor.renderer.scrollCursorIntoView({row: range.start.row, column: 0});\n                }\n            }\n            e.stop();\n        }\n    });\n}\n\nexports.FoldHandler = FoldHandler;\n\n});\n\nace.define(\"ace/keyboard/keybinding\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/event\"], function(require, exports, module) {\n\"use strict\";\n\nvar keyUtil  = require(\"../lib/keys\");\nvar event = require(\"../lib/event\");\n\nvar KeyBinding = function(editor) {\n    this.$editor = editor;\n    this.$data = {editor: editor};\n    this.$handlers = [];\n    this.setDefaultHandler(editor.commands);\n};\n\n(function() {\n    this.setDefaultHandler = function(kb) {\n        this.removeKeyboardHandler(this.$defaultHandler);\n        this.$defaultHandler = kb;\n        this.addKeyboardHandler(kb, 0);\n    };\n\n    this.setKeyboardHandler = function(kb) {\n        var h = this.$handlers;\n        if (h[h.length - 1] == kb)\n            return;\n\n        while (h[h.length - 1] && h[h.length - 1] != this.$defaultHandler)\n            this.removeKeyboardHandler(h[h.length - 1]);\n\n        this.addKeyboardHandler(kb, 1);\n    };\n\n    this.addKeyboardHandler = function(kb, pos) {\n        if (!kb)\n            return;\n        if (typeof kb == \"function\" && !kb.handleKeyboard)\n            kb.handleKeyboard = kb;\n        var i = this.$handlers.indexOf(kb);\n        if (i != -1)\n            this.$handlers.splice(i, 1);\n\n        if (pos == undefined)\n            this.$handlers.push(kb);\n        else\n            this.$handlers.splice(pos, 0, kb);\n\n        if (i == -1 && kb.attach)\n            kb.attach(this.$editor);\n    };\n\n    this.removeKeyboardHandler = function(kb) {\n        var i = this.$handlers.indexOf(kb);\n        if (i == -1)\n            return false;\n        this.$handlers.splice(i, 1);\n        kb.detach && kb.detach(this.$editor);\n        return true;\n    };\n\n    this.getKeyboardHandler = function() {\n        return this.$handlers[this.$handlers.length - 1];\n    };\n    \n    this.getStatusText = function() {\n        var data = this.$data;\n        var editor = data.editor;\n        return this.$handlers.map(function(h) {\n            return h.getStatusText && h.getStatusText(editor, data) || \"\";\n        }).filter(Boolean).join(\" \");\n    };\n\n    this.$callKeyboardHandlers = function(hashId, keyString, keyCode, e) {\n        var toExecute;\n        var success = false;\n        var commands = this.$editor.commands;\n\n        for (var i = this.$handlers.length; i--;) {\n            toExecute = this.$handlers[i].handleKeyboard(\n                this.$data, hashId, keyString, keyCode, e\n            );\n            if (!toExecute || !toExecute.command)\n                continue;\n            if (toExecute.command == \"null\") {\n                success = true;\n            } else {\n                success = commands.exec(toExecute.command, this.$editor, toExecute.args, e);                \n            }\n            if (success && e && hashId != -1 && \n                toExecute.passEvent != true && toExecute.command.passEvent != true\n            ) {\n                event.stopEvent(e);\n            }\n            if (success)\n                break;\n        }\n        return success;\n    };\n\n    this.onCommandKey = function(e, hashId, keyCode) {\n        var keyString = keyUtil.keyCodeToString(keyCode);\n        this.$callKeyboardHandlers(hashId, keyString, keyCode, e);\n    };\n\n    this.onTextInput = function(text) {\n        var success = this.$callKeyboardHandlers(-1, text);\n        if (!success)\n            this.$editor.commands.exec(\"insertstring\", this.$editor, text);\n    };\n\n}).call(KeyBinding.prototype);\n\nexports.KeyBinding = KeyBinding;\n});\n\nace.define(\"ace/range\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nvar comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n    this.start = {\n        row: startRow,\n        column: startColumn\n    };\n\n    this.end = {\n        row: endRow,\n        column: endColumn\n    };\n};\n\n(function() {\n    this.isEqual = function(range) {\n        return this.start.row === range.start.row &&\n            this.end.row === range.end.row &&\n            this.start.column === range.start.column &&\n            this.end.column === range.end.column;\n    };\n    this.toString = function() {\n        return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n            \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n    };\n\n    this.contains = function(row, column) {\n        return this.compare(row, column) == 0;\n    };\n    this.compareRange = function(range) {\n        var cmp,\n            end = range.end,\n            start = range.start;\n\n        cmp = this.compare(end.row, end.column);\n        if (cmp == 1) {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == 1) {\n                return 2;\n            } else if (cmp == 0) {\n                return 1;\n            } else {\n                return 0;\n            }\n        } else if (cmp == -1) {\n            return -2;\n        } else {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == -1) {\n                return -1;\n            } else if (cmp == 1) {\n                return 42;\n            } else {\n                return 0;\n            }\n        }\n    };\n    this.comparePoint = function(p) {\n        return this.compare(p.row, p.column);\n    };\n    this.containsRange = function(range) {\n        return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n    };\n    this.intersects = function(range) {\n        var cmp = this.compareRange(range);\n        return (cmp == -1 || cmp == 0 || cmp == 1);\n    };\n    this.isEnd = function(row, column) {\n        return this.end.row == row && this.end.column == column;\n    };\n    this.isStart = function(row, column) {\n        return this.start.row == row && this.start.column == column;\n    };\n    this.setStart = function(row, column) {\n        if (typeof row == \"object\") {\n            this.start.column = row.column;\n            this.start.row = row.row;\n        } else {\n            this.start.row = row;\n            this.start.column = column;\n        }\n    };\n    this.setEnd = function(row, column) {\n        if (typeof row == \"object\") {\n            this.end.column = row.column;\n            this.end.row = row.row;\n        } else {\n            this.end.row = row;\n            this.end.column = column;\n        }\n    };\n    this.inside = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column) || this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideStart = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideEnd = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.compare = function(row, column) {\n        if (!this.isMultiLine()) {\n            if (row === this.start.row) {\n                return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n            };\n        }\n\n        if (row < this.start.row)\n            return -1;\n\n        if (row > this.end.row)\n            return 1;\n\n        if (this.start.row === row)\n            return column >= this.start.column ? 0 : -1;\n\n        if (this.end.row === row)\n            return column <= this.end.column ? 0 : 1;\n\n        return 0;\n    };\n    this.compareStart = function(row, column) {\n        if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareEnd = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareInside = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.clipRows = function(firstRow, lastRow) {\n        if (this.end.row > lastRow)\n            var end = {row: lastRow + 1, column: 0};\n        else if (this.end.row < firstRow)\n            var end = {row: firstRow, column: 0};\n\n        if (this.start.row > lastRow)\n            var start = {row: lastRow + 1, column: 0};\n        else if (this.start.row < firstRow)\n            var start = {row: firstRow, column: 0};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n    this.extend = function(row, column) {\n        var cmp = this.compare(row, column);\n\n        if (cmp == 0)\n            return this;\n        else if (cmp == -1)\n            var start = {row: row, column: column};\n        else\n            var end = {row: row, column: column};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n\n    this.isEmpty = function() {\n        return (this.start.row === this.end.row && this.start.column === this.end.column);\n    };\n    this.isMultiLine = function() {\n        return (this.start.row !== this.end.row);\n    };\n    this.clone = function() {\n        return Range.fromPoints(this.start, this.end);\n    };\n    this.collapseRows = function() {\n        if (this.end.column == 0)\n            return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)\n        else\n            return new Range(this.start.row, 0, this.end.row, 0)\n    };\n    this.toScreenRange = function(session) {\n        var screenPosStart = session.documentToScreenPosition(this.start);\n        var screenPosEnd = session.documentToScreenPosition(this.end);\n\n        return new Range(\n            screenPosStart.row, screenPosStart.column,\n            screenPosEnd.row, screenPosEnd.column\n        );\n    };\n    this.moveBy = function(row, column) {\n        this.start.row += row;\n        this.start.column += column;\n        this.end.row += row;\n        this.end.column += column;\n    };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n    return new Range(start.row, start.column, end.row, end.column);\n};\nRange.comparePoints = comparePoints;\n\nRange.comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\n\n\nexports.Range = Range;\n});\n\nace.define(\"ace/selection\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar lang = require(\"./lib/lang\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Selection = function(session) {\n    this.session = session;\n    this.doc = session.getDocument();\n\n    this.clearSelection();\n    this.lead = this.selectionLead = this.doc.createAnchor(0, 0);\n    this.anchor = this.selectionAnchor = this.doc.createAnchor(0, 0);\n\n    var self = this;\n    this.lead.on(\"change\", function(e) {\n        self._emit(\"changeCursor\");\n        if (!self.$isEmpty)\n            self._emit(\"changeSelection\");\n        if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column)\n            self.$desiredColumn = null;\n    });\n\n    this.selectionAnchor.on(\"change\", function() {\n        if (!self.$isEmpty)\n            self._emit(\"changeSelection\");\n    });\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.isEmpty = function() {\n        return (this.$isEmpty || (\n            this.anchor.row == this.lead.row &&\n            this.anchor.column == this.lead.column\n        ));\n    };\n    this.isMultiLine = function() {\n        if (this.isEmpty()) {\n            return false;\n        }\n\n        return this.getRange().isMultiLine();\n    };\n    this.getCursor = function() {\n        return this.lead.getPosition();\n    };\n    this.setSelectionAnchor = function(row, column) {\n        this.anchor.setPosition(row, column);\n\n        if (this.$isEmpty) {\n            this.$isEmpty = false;\n            this._emit(\"changeSelection\");\n        }\n    };\n    this.getSelectionAnchor = function() {\n        if (this.$isEmpty)\n            return this.getSelectionLead();\n        else\n            return this.anchor.getPosition();\n    };\n    this.getSelectionLead = function() {\n        return this.lead.getPosition();\n    };\n    this.shiftSelection = function(columns) {\n        if (this.$isEmpty) {\n            this.moveCursorTo(this.lead.row, this.lead.column + columns);\n            return;\n        }\n\n        var anchor = this.getSelectionAnchor();\n        var lead = this.getSelectionLead();\n\n        var isBackwards = this.isBackwards();\n\n        if (!isBackwards || anchor.column !== 0)\n            this.setSelectionAnchor(anchor.row, anchor.column + columns);\n\n        if (isBackwards || lead.column !== 0) {\n            this.$moveSelection(function() {\n                this.moveCursorTo(lead.row, lead.column + columns);\n            });\n        }\n    };\n    this.isBackwards = function() {\n        var anchor = this.anchor;\n        var lead = this.lead;\n        return (anchor.row > lead.row || (anchor.row == lead.row && anchor.column > lead.column));\n    };\n    this.getRange = function() {\n        var anchor = this.anchor;\n        var lead = this.lead;\n\n        if (this.isEmpty())\n            return Range.fromPoints(lead, lead);\n\n        if (this.isBackwards()) {\n            return Range.fromPoints(lead, anchor);\n        }\n        else {\n            return Range.fromPoints(anchor, lead);\n        }\n    };\n    this.clearSelection = function() {\n        if (!this.$isEmpty) {\n            this.$isEmpty = true;\n            this._emit(\"changeSelection\");\n        }\n    };\n    this.selectAll = function() {\n        var lastRow = this.doc.getLength() - 1;\n        this.setSelectionAnchor(0, 0);\n        this.moveCursorTo(lastRow, this.doc.getLine(lastRow).length);\n    };\n    this.setRange =\n    this.setSelectionRange = function(range, reverse) {\n        if (reverse) {\n            this.setSelectionAnchor(range.end.row, range.end.column);\n            this.selectTo(range.start.row, range.start.column);\n        } else {\n            this.setSelectionAnchor(range.start.row, range.start.column);\n            this.selectTo(range.end.row, range.end.column);\n        }\n        if (this.getRange().isEmpty())\n            this.$isEmpty = true;\n        this.$desiredColumn = null;\n    };\n\n    this.$moveSelection = function(mover) {\n        var lead = this.lead;\n        if (this.$isEmpty)\n            this.setSelectionAnchor(lead.row, lead.column);\n\n        mover.call(this);\n    };\n    this.selectTo = function(row, column) {\n        this.$moveSelection(function() {\n            this.moveCursorTo(row, column);\n        });\n    };\n    this.selectToPosition = function(pos) {\n        this.$moveSelection(function() {\n            this.moveCursorToPosition(pos);\n        });\n    };\n    this.moveTo = function(row, column) {\n        this.clearSelection();\n        this.moveCursorTo(row, column);\n    };\n    this.moveToPosition = function(pos) {\n        this.clearSelection();\n        this.moveCursorToPosition(pos);\n    };\n    this.selectUp = function() {\n        this.$moveSelection(this.moveCursorUp);\n    };\n    this.selectDown = function() {\n        this.$moveSelection(this.moveCursorDown);\n    };\n    this.selectRight = function() {\n        this.$moveSelection(this.moveCursorRight);\n    };\n    this.selectLeft = function() {\n        this.$moveSelection(this.moveCursorLeft);\n    };\n    this.selectLineStart = function() {\n        this.$moveSelection(this.moveCursorLineStart);\n    };\n    this.selectLineEnd = function() {\n        this.$moveSelection(this.moveCursorLineEnd);\n    };\n    this.selectFileEnd = function() {\n        this.$moveSelection(this.moveCursorFileEnd);\n    };\n    this.selectFileStart = function() {\n        this.$moveSelection(this.moveCursorFileStart);\n    };\n    this.selectWordRight = function() {\n        this.$moveSelection(this.moveCursorWordRight);\n    };\n    this.selectWordLeft = function() {\n        this.$moveSelection(this.moveCursorWordLeft);\n    };\n    this.getWordRange = function(row, column) {\n        if (typeof column == \"undefined\") {\n            var cursor = row || this.lead;\n            row = cursor.row;\n            column = cursor.column;\n        }\n        return this.session.getWordRange(row, column);\n    };\n    this.selectWord = function() {\n        this.setSelectionRange(this.getWordRange());\n    };\n    this.selectAWord = function() {\n        var cursor = this.getCursor();\n        var range = this.session.getAWordRange(cursor.row, cursor.column);\n        this.setSelectionRange(range);\n    };\n\n    this.getLineRange = function(row, excludeLastChar) {\n        var rowStart = typeof row == \"number\" ? row : this.lead.row;\n        var rowEnd;\n\n        var foldLine = this.session.getFoldLine(rowStart);\n        if (foldLine) {\n            rowStart = foldLine.start.row;\n            rowEnd = foldLine.end.row;\n        } else {\n            rowEnd = rowStart;\n        }\n        if (excludeLastChar === true)\n            return new Range(rowStart, 0, rowEnd, this.session.getLine(rowEnd).length);\n        else\n            return new Range(rowStart, 0, rowEnd + 1, 0);\n    };\n    this.selectLine = function() {\n        this.setSelectionRange(this.getLineRange());\n    };\n    this.moveCursorUp = function() {\n        this.moveCursorBy(-1, 0);\n    };\n    this.moveCursorDown = function() {\n        this.moveCursorBy(1, 0);\n    };\n    this.moveCursorLeft = function() {\n        var cursor = this.lead.getPosition(),\n            fold;\n\n        if (fold = this.session.getFoldAt(cursor.row, cursor.column, -1)) {\n            this.moveCursorTo(fold.start.row, fold.start.column);\n        } else if (cursor.column === 0) {\n            if (cursor.row > 0) {\n                this.moveCursorTo(cursor.row - 1, this.doc.getLine(cursor.row - 1).length);\n            }\n        }\n        else {\n            var tabSize = this.session.getTabSize();\n            if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column-tabSize, cursor.column).split(\" \").length-1 == tabSize)\n                this.moveCursorBy(0, -tabSize);\n            else\n                this.moveCursorBy(0, -1);\n        }\n    };\n    this.moveCursorRight = function() {\n        var cursor = this.lead.getPosition(),\n            fold;\n        if (fold = this.session.getFoldAt(cursor.row, cursor.column, 1)) {\n            this.moveCursorTo(fold.end.row, fold.end.column);\n        }\n        else if (this.lead.column == this.doc.getLine(this.lead.row).length) {\n            if (this.lead.row < this.doc.getLength() - 1) {\n                this.moveCursorTo(this.lead.row + 1, 0);\n            }\n        }\n        else {\n            var tabSize = this.session.getTabSize();\n            var cursor = this.lead;\n            if (this.session.isTabStop(cursor) && this.doc.getLine(cursor.row).slice(cursor.column, cursor.column+tabSize).split(\" \").length-1 == tabSize)\n                this.moveCursorBy(0, tabSize);\n            else\n                this.moveCursorBy(0, 1);\n        }\n    };\n    this.moveCursorLineStart = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n        var screenRow = this.session.documentToScreenRow(row, column);\n        var firstColumnPosition = this.session.screenToDocumentPosition(screenRow, 0);\n        var beforeCursor = this.session.getDisplayLine(\n            row, null, firstColumnPosition.row,\n            firstColumnPosition.column\n        );\n\n        var leadingSpace = beforeCursor.match(/^\\s*/);\n        if (leadingSpace[0].length != column && !this.session.$useEmacsStyleLineStart)\n            firstColumnPosition.column += leadingSpace[0].length;\n        this.moveCursorToPosition(firstColumnPosition);\n    };\n    this.moveCursorLineEnd = function() {\n        var lead = this.lead;\n        var lineEnd = this.session.getDocumentLastRowColumnPosition(lead.row, lead.column);\n        if (this.lead.column == lineEnd.column) {\n            var line = this.session.getLine(lineEnd.row);\n            if (lineEnd.column == line.length) {\n                var textEnd = line.search(/\\s+$/);\n                if (textEnd > 0)\n                    lineEnd.column = textEnd;\n            }\n        }\n\n        this.moveCursorTo(lineEnd.row, lineEnd.column);\n    };\n    this.moveCursorFileEnd = function() {\n        var row = this.doc.getLength() - 1;\n        var column = this.doc.getLine(row).length;\n        this.moveCursorTo(row, column);\n    };\n    this.moveCursorFileStart = function() {\n        this.moveCursorTo(0, 0);\n    };\n    this.moveCursorLongWordRight = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n        var line = this.doc.getLine(row);\n        var rightOfCursor = line.substring(column);\n\n        var match;\n        this.session.nonTokenRe.lastIndex = 0;\n        this.session.tokenRe.lastIndex = 0;\n        var fold = this.session.getFoldAt(row, column, 1);\n        if (fold) {\n            this.moveCursorTo(fold.end.row, fold.end.column);\n            return;\n        }\n        if (match = this.session.nonTokenRe.exec(rightOfCursor)) {\n            column += this.session.nonTokenRe.lastIndex;\n            this.session.nonTokenRe.lastIndex = 0;\n            rightOfCursor = line.substring(column);\n        }\n        if (column >= line.length) {\n            this.moveCursorTo(row, line.length);\n            this.moveCursorRight();\n            if (row < this.doc.getLength() - 1)\n                this.moveCursorWordRight();\n            return;\n        }\n        if (match = this.session.tokenRe.exec(rightOfCursor)) {\n            column += this.session.tokenRe.lastIndex;\n            this.session.tokenRe.lastIndex = 0;\n        }\n\n        this.moveCursorTo(row, column);\n    };\n    this.moveCursorLongWordLeft = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n        var fold;\n        if (fold = this.session.getFoldAt(row, column, -1)) {\n            this.moveCursorTo(fold.start.row, fold.start.column);\n            return;\n        }\n\n        var str = this.session.getFoldStringAt(row, column, -1);\n        if (str == null) {\n            str = this.doc.getLine(row).substring(0, column);\n        }\n\n        var leftOfCursor = lang.stringReverse(str);\n        var match;\n        this.session.nonTokenRe.lastIndex = 0;\n        this.session.tokenRe.lastIndex = 0;\n        if (match = this.session.nonTokenRe.exec(leftOfCursor)) {\n            column -= this.session.nonTokenRe.lastIndex;\n            leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex);\n            this.session.nonTokenRe.lastIndex = 0;\n        }\n        if (column <= 0) {\n            this.moveCursorTo(row, 0);\n            this.moveCursorLeft();\n            if (row > 0)\n                this.moveCursorWordLeft();\n            return;\n        }\n        if (match = this.session.tokenRe.exec(leftOfCursor)) {\n            column -= this.session.tokenRe.lastIndex;\n            this.session.tokenRe.lastIndex = 0;\n        }\n\n        this.moveCursorTo(row, column);\n    };\n\n    this.$shortWordEndIndex = function(rightOfCursor) {\n        var match, index = 0, ch;\n        var whitespaceRe = /\\s/;\n        var tokenRe = this.session.tokenRe;\n\n        tokenRe.lastIndex = 0;\n        if (match = this.session.tokenRe.exec(rightOfCursor)) {\n            index = this.session.tokenRe.lastIndex;\n        } else {\n            while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n                index ++;\n\n            if (index < 1) {\n                tokenRe.lastIndex = 0;\n                 while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) {\n                    tokenRe.lastIndex = 0;\n                    index ++;\n                    if (whitespaceRe.test(ch)) {\n                        if (index > 2) {\n                            index--;\n                            break;\n                        } else {\n                            while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n                                index ++;\n                            if (index > 2)\n                                break;\n                        }\n                    }\n                }\n            }\n        }\n        tokenRe.lastIndex = 0;\n\n        return index;\n    };\n\n    this.moveCursorShortWordRight = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n        var line = this.doc.getLine(row);\n        var rightOfCursor = line.substring(column);\n\n        var fold = this.session.getFoldAt(row, column, 1);\n        if (fold)\n            return this.moveCursorTo(fold.end.row, fold.end.column);\n\n        if (column == line.length) {\n            var l = this.doc.getLength();\n            do {\n                row++;\n                rightOfCursor = this.doc.getLine(row);\n            } while (row < l && /^\\s*$/.test(rightOfCursor));\n\n            if (!/^\\s+/.test(rightOfCursor))\n                rightOfCursor = \"\";\n            column = 0;\n        }\n\n        var index = this.$shortWordEndIndex(rightOfCursor);\n\n        this.moveCursorTo(row, column + index);\n    };\n\n    this.moveCursorShortWordLeft = function() {\n        var row = this.lead.row;\n        var column = this.lead.column;\n\n        var fold;\n        if (fold = this.session.getFoldAt(row, column, -1))\n            return this.moveCursorTo(fold.start.row, fold.start.column);\n\n        var line = this.session.getLine(row).substring(0, column);\n        if (column === 0) {\n            do {\n                row--;\n                line = this.doc.getLine(row);\n            } while (row > 0 && /^\\s*$/.test(line));\n\n            column = line.length;\n            if (!/\\s+$/.test(line))\n                line = \"\";\n        }\n\n        var leftOfCursor = lang.stringReverse(line);\n        var index = this.$shortWordEndIndex(leftOfCursor);\n\n        return this.moveCursorTo(row, column - index);\n    };\n\n    this.moveCursorWordRight = function() {\n        if (this.session.$selectLongWords)\n            this.moveCursorLongWordRight();\n        else\n            this.moveCursorShortWordRight();\n    };\n\n    this.moveCursorWordLeft = function() {\n        if (this.session.$selectLongWords)\n            this.moveCursorLongWordLeft();\n        else\n            this.moveCursorShortWordLeft();\n    };\n    this.moveCursorBy = function(rows, chars) {\n        var screenPos = this.session.documentToScreenPosition(\n            this.lead.row,\n            this.lead.column\n        );\n\n        if (chars === 0) {\n            if (this.$desiredColumn)\n                screenPos.column = this.$desiredColumn;\n            else\n                this.$desiredColumn = screenPos.column;\n        }\n\n        var docPos = this.session.screenToDocumentPosition(screenPos.row + rows, screenPos.column);\n        \n        if (rows !== 0 && chars === 0 && docPos.row === this.lead.row && docPos.column === this.lead.column) {\n            if (this.session.lineWidgets && this.session.lineWidgets[docPos.row])\n                docPos.row++;\n        }\n        this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0);\n    };\n    this.moveCursorToPosition = function(position) {\n        this.moveCursorTo(position.row, position.column);\n    };\n    this.moveCursorTo = function(row, column, keepDesiredColumn) {\n        var fold = this.session.getFoldAt(row, column, 1);\n        if (fold) {\n            row = fold.start.row;\n            column = fold.start.column;\n        }\n\n        this.$keepDesiredColumnOnChange = true;\n        this.lead.setPosition(row, column);\n        this.$keepDesiredColumnOnChange = false;\n\n        if (!keepDesiredColumn)\n            this.$desiredColumn = null;\n    };\n    this.moveCursorToScreen = function(row, column, keepDesiredColumn) {\n        var pos = this.session.screenToDocumentPosition(row, column);\n        this.moveCursorTo(pos.row, pos.column, keepDesiredColumn);\n    };\n    this.detach = function() {\n        this.lead.detach();\n        this.anchor.detach();\n        this.session = this.doc = null;\n    };\n\n    this.fromOrientedRange = function(range) {\n        this.setSelectionRange(range, range.cursor == range.start);\n        this.$desiredColumn = range.desiredColumn || this.$desiredColumn;\n    };\n\n    this.toOrientedRange = function(range) {\n        var r = this.getRange();\n        if (range) {\n            range.start.column = r.start.column;\n            range.start.row = r.start.row;\n            range.end.column = r.end.column;\n            range.end.row = r.end.row;\n        } else {\n            range = r;\n        }\n\n        range.cursor = this.isBackwards() ? range.start : range.end;\n        range.desiredColumn = this.$desiredColumn;\n        return range;\n    };\n    this.getRangeOfMovements = function(func) {\n        var start = this.getCursor();\n        try {\n            func.call(null, this);\n            var end = this.getCursor();\n            return Range.fromPoints(start,end);\n        } catch(e) {\n            return Range.fromPoints(start,start);\n        } finally {\n            this.moveCursorToPosition(start);\n        }\n    };\n\n    this.toJSON = function() {\n        if (this.rangeCount) {\n            var data = this.ranges.map(function(r) {\n                var r1 = r.clone();\n                r1.isBackwards = r.cursor == r.start;\n                return r1;\n            });\n        } else {\n            var data = this.getRange();\n            data.isBackwards = this.isBackwards();\n        }\n        return data;\n    };\n\n    this.fromJSON = function(data) {\n        if (data.start == undefined) {\n            if (this.rangeList) {\n                this.toSingleRange(data[0]);\n                for (var i = data.length; i--; ) {\n                    var r = Range.fromPoints(data[i].start, data[i].end);\n                    if (data.isBackwards)\n                        r.cursor = r.start;\n                    this.addRange(r, true);\n                }\n                return;\n            } else\n                data = data[0];\n        }\n        if (this.rangeList)\n            this.toSingleRange(data);\n        this.setSelectionRange(data, data.isBackwards);\n    };\n\n    this.isEqual = function(data) {\n        if ((data.length || this.rangeCount) && data.length != this.rangeCount)\n            return false;\n        if (!data.length || !this.ranges)\n            return this.getRange().isEqual(data);\n\n        for (var i = this.ranges.length; i--; ) {\n            if (!this.ranges[i].isEqual(data[i]))\n                return false;\n        }\n        return true;\n    };\n\n}).call(Selection.prototype);\n\nexports.Selection = Selection;\n});\n\nace.define(\"ace/tokenizer\",[\"require\",\"exports\",\"module\",\"ace/config\"], function(require, exports, module) {\n\"use strict\";\n\nvar config = require(\"./config\");\nvar MAX_TOKEN_COUNT = 2000;\nvar Tokenizer = function(rules) {\n    this.states = rules;\n\n    this.regExps = {};\n    this.matchMappings = {};\n    for (var key in this.states) {\n        var state = this.states[key];\n        var ruleRegExps = [];\n        var matchTotal = 0;\n        var mapping = this.matchMappings[key] = {defaultToken: \"text\"};\n        var flag = \"g\";\n\n        var splitterRurles = [];\n        for (var i = 0; i < state.length; i++) {\n            var rule = state[i];\n            if (rule.defaultToken)\n                mapping.defaultToken = rule.defaultToken;\n            if (rule.caseInsensitive)\n                flag = \"gi\";\n            if (rule.regex == null)\n                continue;\n\n            if (rule.regex instanceof RegExp)\n                rule.regex = rule.regex.toString().slice(1, -1);\n            var adjustedregex = rule.regex;\n            var matchcount = new RegExp(\"(?:(\" + adjustedregex + \")|(.))\").exec(\"a\").length - 2;\n            if (Array.isArray(rule.token)) {\n                if (rule.token.length == 1 || matchcount == 1) {\n                    rule.token = rule.token[0];\n                } else if (matchcount - 1 != rule.token.length) {\n                    this.reportError(\"number of classes and regexp groups doesn't match\", { \n                        rule: rule,\n                        groupCount: matchcount - 1\n                    });\n                    rule.token = rule.token[0];\n                } else {\n                    rule.tokenArray = rule.token;\n                    rule.token = null;\n                    rule.onMatch = this.$arrayTokens;\n                }\n            } else if (typeof rule.token == \"function\" && !rule.onMatch) {\n                if (matchcount > 1)\n                    rule.onMatch = this.$applyToken;\n                else\n                    rule.onMatch = rule.token;\n            }\n\n            if (matchcount > 1) {\n                if (/\\\\\\d/.test(rule.regex)) {\n                    adjustedregex = rule.regex.replace(/\\\\([0-9]+)/g, function(match, digit) {\n                        return \"\\\\\" + (parseInt(digit, 10) + matchTotal + 1);\n                    });\n                } else {\n                    matchcount = 1;\n                    adjustedregex = this.removeCapturingGroups(rule.regex);\n                }\n                if (!rule.splitRegex && typeof rule.token != \"string\")\n                    splitterRurles.push(rule); // flag will be known only at the very end\n            }\n\n            mapping[matchTotal] = i;\n            matchTotal += matchcount;\n\n            ruleRegExps.push(adjustedregex);\n            if (!rule.onMatch)\n                rule.onMatch = null;\n        }\n        \n        if (!ruleRegExps.length) {\n            mapping[0] = 0;\n            ruleRegExps.push(\"$\");\n        }\n        \n        splitterRurles.forEach(function(rule) {\n            rule.splitRegex = this.createSplitterRegexp(rule.regex, flag);\n        }, this);\n\n        this.regExps[key] = new RegExp(\"(\" + ruleRegExps.join(\")|(\") + \")|($)\", flag);\n    }\n};\n\n(function() {\n    this.$setMaxTokenCount = function(m) {\n        MAX_TOKEN_COUNT = m | 0;\n    };\n    \n    this.$applyToken = function(str) {\n        var values = this.splitRegex.exec(str).slice(1);\n        var types = this.token.apply(this, values);\n        if (typeof types === \"string\")\n            return [{type: types, value: str}];\n\n        var tokens = [];\n        for (var i = 0, l = types.length; i < l; i++) {\n            if (values[i])\n                tokens[tokens.length] = {\n                    type: types[i],\n                    value: values[i]\n                };\n        }\n        return tokens;\n    },\n\n    this.$arrayTokens = function(str) {\n        if (!str)\n            return [];\n        var values = this.splitRegex.exec(str);\n        if (!values)\n            return \"text\";\n        var tokens = [];\n        var types = this.tokenArray;\n        for (var i = 0, l = types.length; i < l; i++) {\n            if (values[i + 1])\n                tokens[tokens.length] = {\n                    type: types[i],\n                    value: values[i + 1]\n                };\n        }\n        return tokens;\n    };\n\n    this.removeCapturingGroups = function(src) {\n        var r = src.replace(\n            /\\[(?:\\\\.|[^\\]])*?\\]|\\\\.|\\(\\?[:=!]|(\\()/g,\n            function(x, y) {return y ? \"(?:\" : x;}\n        );\n        return r;\n    };\n\n    this.createSplitterRegexp = function(src, flag) {\n        if (src.indexOf(\"(?=\") != -1) {\n            var stack = 0;\n            var inChClass = false;\n            var lastCapture = {};\n            src.replace(/(\\\\.)|(\\((?:\\?[=!])?)|(\\))|([\\[\\]])/g, function(\n                m, esc, parenOpen, parenClose, square, index\n            ) {\n                if (inChClass) {\n                    inChClass = square != \"]\";\n                } else if (square) {\n                    inChClass = true;\n                } else if (parenClose) {\n                    if (stack == lastCapture.stack) {\n                        lastCapture.end = index+1;\n                        lastCapture.stack = -1;\n                    }\n                    stack--;\n                } else if (parenOpen) {\n                    stack++;\n                    if (parenOpen.length != 1) {\n                        lastCapture.stack = stack\n                        lastCapture.start = index;\n                    }\n                }\n                return m;\n            });\n\n            if (lastCapture.end != null && /^\\)*$/.test(src.substr(lastCapture.end)))\n                src = src.substring(0, lastCapture.start) + src.substr(lastCapture.end);\n        }\n        return new RegExp(src, (flag||\"\").replace(\"g\", \"\"));\n    };\n    this.getLineTokens = function(line, startState) {\n        if (startState && typeof startState != \"string\") {\n            var stack = startState.slice(0);\n            startState = stack[0];\n            if (startState === \"#tmp\") {\n                stack.shift()\n                startState = stack.shift()\n            }\n        } else\n            var stack = [];\n\n        var currentState = startState || \"start\";\n        var state = this.states[currentState];\n        if (!state) {\n            currentState = \"start\";\n            state = this.states[currentState];\n        }\n        var mapping = this.matchMappings[currentState];\n        var re = this.regExps[currentState];\n        re.lastIndex = 0;\n\n        var match, tokens = [];\n        var lastIndex = 0;\n        var matchAttempts = 0;\n\n        var token = {type: null, value: \"\"};\n\n        while (match = re.exec(line)) {\n            var type = mapping.defaultToken;\n            var rule = null;\n            var value = match[0];\n            var index = re.lastIndex;\n\n            if (index - value.length > lastIndex) {\n                var skipped = line.substring(lastIndex, index - value.length);\n                if (token.type == type) {\n                    token.value += skipped;\n                } else {\n                    if (token.type)\n                        tokens.push(token);\n                    token = {type: type, value: skipped};\n                }\n            }\n\n            for (var i = 0; i < match.length-2; i++) {\n                if (match[i + 1] === undefined)\n                    continue;\n\n                rule = state[mapping[i]];\n\n                if (rule.onMatch)\n                    type = rule.onMatch(value, currentState, stack);\n                else\n                    type = rule.token;\n\n                if (rule.next) {\n                    if (typeof rule.next == \"string\") {\n                        currentState = rule.next;\n                    } else {\n                        currentState = rule.next(currentState, stack);\n                    }\n                    \n                    state = this.states[currentState];\n                    if (!state) {\n                        this.reportError(\"state doesn't exist\", currentState);\n                        currentState = \"start\";\n                        state = this.states[currentState];\n                    }\n                    mapping = this.matchMappings[currentState];\n                    lastIndex = index;\n                    re = this.regExps[currentState];\n                    re.lastIndex = index;\n                }\n                break;\n            }\n\n            if (value) {\n                if (typeof type === \"string\") {\n                    if ((!rule || rule.merge !== false) && token.type === type) {\n                        token.value += value;\n                    } else {\n                        if (token.type)\n                            tokens.push(token);\n                        token = {type: type, value: value};\n                    }\n                } else if (type) {\n                    if (token.type)\n                        tokens.push(token);\n                    token = {type: null, value: \"\"};\n                    for (var i = 0; i < type.length; i++)\n                        tokens.push(type[i]);\n                }\n            }\n\n            if (lastIndex == line.length)\n                break;\n\n            lastIndex = index;\n\n            if (matchAttempts++ > MAX_TOKEN_COUNT) {\n                if (matchAttempts > 2 * line.length) {\n                    this.reportError(\"infinite loop with in ace tokenizer\", {\n                        startState: startState,\n                        line: line\n                    });\n                }\n                while (lastIndex < line.length) {\n                    if (token.type)\n                        tokens.push(token);\n                    token = {\n                        value: line.substring(lastIndex, lastIndex += 2000),\n                        type: \"overflow\"\n                    };\n                }\n                currentState = \"start\";\n                stack = [];\n                break;\n            }\n        }\n\n        if (token.type)\n            tokens.push(token);\n        \n        if (stack.length > 1) {\n            if (stack[0] !== currentState)\n                stack.unshift(\"#tmp\", currentState);\n        }\n        return {\n            tokens : tokens,\n            state : stack.length ? stack : currentState\n        };\n    };\n    \n    this.reportError = config.reportError;\n    \n}).call(Tokenizer.prototype);\n\nexports.Tokenizer = Tokenizer;\n});\n\nace.define(\"ace/mode/text_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar lang = require(\"../lib/lang\");\n\nvar TextHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"empty_line\",\n            regex : '^$'\n        }, {\n            defaultToken : \"text\"\n        }]\n    };\n};\n\n(function() {\n\n    this.addRules = function(rules, prefix) {\n        if (!prefix) {\n            for (var key in rules)\n                this.$rules[key] = rules[key];\n            return;\n        }\n        for (var key in rules) {\n            var state = rules[key];\n            for (var i = 0; i < state.length; i++) {\n                var rule = state[i];\n                if (rule.next || rule.onMatch) {\n                    if (typeof rule.next != \"string\") {\n                        if (rule.nextState && rule.nextState.indexOf(prefix) !== 0)\n                            rule.nextState = prefix + rule.nextState;\n                    } else {\n                        if (rule.next.indexOf(prefix) !== 0)\n                            rule.next = prefix + rule.next;\n                    }\n                }\n            }\n            this.$rules[prefix + key] = state;\n        }\n    };\n\n    this.getRules = function() {\n        return this.$rules;\n    };\n\n    this.embedRules = function (HighlightRules, prefix, escapeRules, states, append) {\n        var embedRules = typeof HighlightRules == \"function\"\n            ? new HighlightRules().getRules()\n            : HighlightRules;\n        if (states) {\n            for (var i = 0; i < states.length; i++)\n                states[i] = prefix + states[i];\n        } else {\n            states = [];\n            for (var key in embedRules)\n                states.push(prefix + key);\n        }\n\n        this.addRules(embedRules, prefix);\n\n        if (escapeRules) {\n            var addRules = Array.prototype[append ? \"push\" : \"unshift\"];\n            for (var i = 0; i < states.length; i++)\n                addRules.apply(this.$rules[states[i]], lang.deepCopy(escapeRules));\n        }\n\n        if (!this.$embeds)\n            this.$embeds = [];\n        this.$embeds.push(prefix);\n    };\n\n    this.getEmbeds = function() {\n        return this.$embeds;\n    };\n\n    var pushState = function(currentState, stack) {\n        if (currentState != \"start\" || stack.length)\n            stack.unshift(this.nextState, currentState);\n        return this.nextState;\n    };\n    var popState = function(currentState, stack) {\n        stack.shift();\n        return stack.shift() || \"start\";\n    };\n\n    this.normalizeRules = function() {\n        var id = 0;\n        var rules = this.$rules;\n        function processState(key) {\n            var state = rules[key];\n            state.processed = true;\n            for (var i = 0; i < state.length; i++) {\n                var rule = state[i];\n                if (!rule.regex && rule.start) {\n                    rule.regex = rule.start;\n                    if (!rule.next)\n                        rule.next = [];\n                    rule.next.push({\n                        defaultToken: rule.token\n                    }, {\n                        token: rule.token + \".end\",\n                        regex: rule.end || rule.start,\n                        next: \"pop\"\n                    });\n                    rule.token = rule.token + \".start\";\n                    rule.push = true;\n                }\n                var next = rule.next || rule.push;\n                if (next && Array.isArray(next)) {\n                    var stateName = rule.stateName;\n                    if (!stateName)  {\n                        stateName = rule.token;\n                        if (typeof stateName != \"string\")\n                            stateName = stateName[0] || \"\";\n                        if (rules[stateName])\n                            stateName += id++;\n                    }\n                    rules[stateName] = next;\n                    rule.next = stateName;\n                    processState(stateName);\n                } else if (next == \"pop\") {\n                    rule.next = popState;\n                }\n\n                if (rule.push) {\n                    rule.nextState = rule.next || rule.push;\n                    rule.next = pushState;\n                    delete rule.push;\n                }\n\n                if (rule.rules) {\n                    for (var r in rule.rules) {\n                        if (rules[r]) {\n                            if (rules[r].push)\n                                rules[r].push.apply(rules[r], rule.rules[r]);\n                        } else {\n                            rules[r] = rule.rules[r];\n                        }\n                    }\n                }\n                if (rule.include || typeof rule == \"string\") {\n                    var includeName = rule.include || rule;\n                    var toInsert = rules[includeName];\n                } else if (Array.isArray(rule))\n                    toInsert = rule;\n\n                if (toInsert) {\n                    var args = [i, 1].concat(toInsert);\n                    if (rule.noEscape)\n                        args = args.filter(function(x) {return !x.next;});\n                    state.splice.apply(state, args);\n                    i--;\n                    toInsert = null;\n                }\n                \n                if (rule.keywordMap) {\n                    rule.token = this.createKeywordMapper(\n                        rule.keywordMap, rule.defaultToken || \"text\", rule.caseInsensitive\n                    );\n                    delete rule.defaultToken;\n                }\n            }\n        }\n        Object.keys(rules).forEach(processState, this);\n    };\n\n    this.createKeywordMapper = function(map, defaultToken, ignoreCase, splitChar) {\n        var keywords = Object.create(null);\n        Object.keys(map).forEach(function(className) {\n            var a = map[className];\n            if (ignoreCase)\n                a = a.toLowerCase();\n            var list = a.split(splitChar || \"|\");\n            for (var i = list.length; i--; )\n                keywords[list[i]] = className;\n        });\n        if (Object.getPrototypeOf(keywords)) {\n            keywords.__proto__ = null;\n        }\n        this.$keywordList = Object.keys(keywords);\n        map = null;\n        return ignoreCase\n            ? function(value) {return keywords[value.toLowerCase()] || defaultToken }\n            : function(value) {return keywords[value] || defaultToken };\n    };\n\n    this.getKeywords = function() {\n        return this.$keywords;\n    };\n\n}).call(TextHighlightRules.prototype);\n\nexports.TextHighlightRules = TextHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nvar Behaviour = function() {\n   this.$behaviours = {};\n};\n\n(function () {\n\n    this.add = function (name, action, callback) {\n        switch (undefined) {\n          case this.$behaviours:\n              this.$behaviours = {};\n          case this.$behaviours[name]:\n              this.$behaviours[name] = {};\n        }\n        this.$behaviours[name][action] = callback;\n    }\n    \n    this.addBehaviours = function (behaviours) {\n        for (var key in behaviours) {\n            for (var action in behaviours[key]) {\n                this.add(key, action, behaviours[key][action]);\n            }\n        }\n    }\n    \n    this.remove = function (name) {\n        if (this.$behaviours && this.$behaviours[name]) {\n            delete this.$behaviours[name];\n        }\n    }\n    \n    this.inherit = function (mode, filter) {\n        if (typeof mode === \"function\") {\n            var behaviours = new mode().getBehaviours(filter);\n        } else {\n            var behaviours = mode.getBehaviours(filter);\n        }\n        this.addBehaviours(behaviours);\n    }\n    \n    this.getBehaviours = function (filter) {\n        if (!filter) {\n            return this.$behaviours;\n        } else {\n            var ret = {}\n            for (var i = 0; i < filter.length; i++) {\n                if (this.$behaviours[filter[i]]) {\n                    ret[filter[i]] = this.$behaviours[filter[i]];\n                }\n            }\n            return ret;\n        }\n    }\n\n}).call(Behaviour.prototype);\n\nexports.Behaviour = Behaviour;\n});\n\nace.define(\"ace/unicode\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nexports.packages = {};\n\naddUnicodePackage({\n    L:  \"0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05250531-055605590561-058705D0-05EA05F0-05F20621-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280904-0939093D09500958-0961097109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D0-10FA10FC1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D00-2D252D30-2D652D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\",\n    Ll: \"0061-007A00AA00B500BA00DF-00F600F8-00FF01010103010501070109010B010D010F01110113011501170119011B011D011F01210123012501270129012B012D012F01310133013501370138013A013C013E014001420144014601480149014B014D014F01510153015501570159015B015D015F01610163016501670169016B016D016F0171017301750177017A017C017E-0180018301850188018C018D019201950199-019B019E01A101A301A501A801AA01AB01AD01B001B401B601B901BA01BD-01BF01C601C901CC01CE01D001D201D401D601D801DA01DC01DD01DF01E101E301E501E701E901EB01ED01EF01F001F301F501F901FB01FD01FF02010203020502070209020B020D020F02110213021502170219021B021D021F02210223022502270229022B022D022F02310233-0239023C023F0240024202470249024B024D024F-02930295-02AF037103730377037B-037D039003AC-03CE03D003D103D5-03D703D903DB03DD03DF03E103E303E503E703E903EB03ED03EF-03F303F503F803FB03FC0430-045F04610463046504670469046B046D046F04710473047504770479047B047D047F0481048B048D048F04910493049504970499049B049D049F04A104A304A504A704A904AB04AD04AF04B104B304B504B704B904BB04BD04BF04C204C404C604C804CA04CC04CE04CF04D104D304D504D704D904DB04DD04DF04E104E304E504E704E904EB04ED04EF04F104F304F504F704F904FB04FD04FF05010503050505070509050B050D050F05110513051505170519051B051D051F0521052305250561-05871D00-1D2B1D62-1D771D79-1D9A1E011E031E051E071E091E0B1E0D1E0F1E111E131E151E171E191E1B1E1D1E1F1E211E231E251E271E291E2B1E2D1E2F1E311E331E351E371E391E3B1E3D1E3F1E411E431E451E471E491E4B1E4D1E4F1E511E531E551E571E591E5B1E5D1E5F1E611E631E651E671E691E6B1E6D1E6F1E711E731E751E771E791E7B1E7D1E7F1E811E831E851E871E891E8B1E8D1E8F1E911E931E95-1E9D1E9F1EA11EA31EA51EA71EA91EAB1EAD1EAF1EB11EB31EB51EB71EB91EBB1EBD1EBF1EC11EC31EC51EC71EC91ECB1ECD1ECF1ED11ED31ED51ED71ED91EDB1EDD1EDF1EE11EE31EE51EE71EE91EEB1EED1EEF1EF11EF31EF51EF71EF91EFB1EFD1EFF-1F071F10-1F151F20-1F271F30-1F371F40-1F451F50-1F571F60-1F671F70-1F7D1F80-1F871F90-1F971FA0-1FA71FB0-1FB41FB61FB71FBE1FC2-1FC41FC61FC71FD0-1FD31FD61FD71FE0-1FE71FF2-1FF41FF61FF7210A210E210F2113212F21342139213C213D2146-2149214E21842C30-2C5E2C612C652C662C682C6A2C6C2C712C732C742C76-2C7C2C812C832C852C872C892C8B2C8D2C8F2C912C932C952C972C992C9B2C9D2C9F2CA12CA32CA52CA72CA92CAB2CAD2CAF2CB12CB32CB52CB72CB92CBB2CBD2CBF2CC12CC32CC52CC72CC92CCB2CCD2CCF2CD12CD32CD52CD72CD92CDB2CDD2CDF2CE12CE32CE42CEC2CEE2D00-2D25A641A643A645A647A649A64BA64DA64FA651A653A655A657A659A65BA65DA65FA663A665A667A669A66BA66DA681A683A685A687A689A68BA68DA68FA691A693A695A697A723A725A727A729A72BA72DA72F-A731A733A735A737A739A73BA73DA73FA741A743A745A747A749A74BA74DA74FA751A753A755A757A759A75BA75DA75FA761A763A765A767A769A76BA76DA76FA771-A778A77AA77CA77FA781A783A785A787A78CFB00-FB06FB13-FB17FF41-FF5A\",\n    Lu: \"0041-005A00C0-00D600D8-00DE01000102010401060108010A010C010E01100112011401160118011A011C011E01200122012401260128012A012C012E01300132013401360139013B013D013F0141014301450147014A014C014E01500152015401560158015A015C015E01600162016401660168016A016C016E017001720174017601780179017B017D018101820184018601870189-018B018E-0191019301940196-0198019C019D019F01A001A201A401A601A701A901AC01AE01AF01B1-01B301B501B701B801BC01C401C701CA01CD01CF01D101D301D501D701D901DB01DE01E001E201E401E601E801EA01EC01EE01F101F401F6-01F801FA01FC01FE02000202020402060208020A020C020E02100212021402160218021A021C021E02200222022402260228022A022C022E02300232023A023B023D023E02410243-02460248024A024C024E03700372037603860388-038A038C038E038F0391-03A103A3-03AB03CF03D2-03D403D803DA03DC03DE03E003E203E403E603E803EA03EC03EE03F403F703F903FA03FD-042F04600462046404660468046A046C046E04700472047404760478047A047C047E0480048A048C048E04900492049404960498049A049C049E04A004A204A404A604A804AA04AC04AE04B004B204B404B604B804BA04BC04BE04C004C104C304C504C704C904CB04CD04D004D204D404D604D804DA04DC04DE04E004E204E404E604E804EA04EC04EE04F004F204F404F604F804FA04FC04FE05000502050405060508050A050C050E05100512051405160518051A051C051E0520052205240531-055610A0-10C51E001E021E041E061E081E0A1E0C1E0E1E101E121E141E161E181E1A1E1C1E1E1E201E221E241E261E281E2A1E2C1E2E1E301E321E341E361E381E3A1E3C1E3E1E401E421E441E461E481E4A1E4C1E4E1E501E521E541E561E581E5A1E5C1E5E1E601E621E641E661E681E6A1E6C1E6E1E701E721E741E761E781E7A1E7C1E7E1E801E821E841E861E881E8A1E8C1E8E1E901E921E941E9E1EA01EA21EA41EA61EA81EAA1EAC1EAE1EB01EB21EB41EB61EB81EBA1EBC1EBE1EC01EC21EC41EC61EC81ECA1ECC1ECE1ED01ED21ED41ED61ED81EDA1EDC1EDE1EE01EE21EE41EE61EE81EEA1EEC1EEE1EF01EF21EF41EF61EF81EFA1EFC1EFE1F08-1F0F1F18-1F1D1F28-1F2F1F38-1F3F1F48-1F4D1F591F5B1F5D1F5F1F68-1F6F1FB8-1FBB1FC8-1FCB1FD8-1FDB1FE8-1FEC1FF8-1FFB21022107210B-210D2110-211221152119-211D212421262128212A-212D2130-2133213E213F214521832C00-2C2E2C602C62-2C642C672C692C6B2C6D-2C702C722C752C7E-2C802C822C842C862C882C8A2C8C2C8E2C902C922C942C962C982C9A2C9C2C9E2CA02CA22CA42CA62CA82CAA2CAC2CAE2CB02CB22CB42CB62CB82CBA2CBC2CBE2CC02CC22CC42CC62CC82CCA2CCC2CCE2CD02CD22CD42CD62CD82CDA2CDC2CDE2CE02CE22CEB2CEDA640A642A644A646A648A64AA64CA64EA650A652A654A656A658A65AA65CA65EA662A664A666A668A66AA66CA680A682A684A686A688A68AA68CA68EA690A692A694A696A722A724A726A728A72AA72CA72EA732A734A736A738A73AA73CA73EA740A742A744A746A748A74AA74CA74EA750A752A754A756A758A75AA75CA75EA760A762A764A766A768A76AA76CA76EA779A77BA77DA77EA780A782A784A786A78BFF21-FF3A\",\n    Lt: \"01C501C801CB01F21F88-1F8F1F98-1F9F1FA8-1FAF1FBC1FCC1FFC\",\n    Lm: \"02B0-02C102C6-02D102E0-02E402EC02EE0374037A0559064006E506E607F407F507FA081A0824082809710E460EC610FC17D718431AA71C78-1C7D1D2C-1D611D781D9B-1DBF2071207F2090-20942C7D2D6F2E2F30053031-3035303B309D309E30FC-30FEA015A4F8-A4FDA60CA67FA717-A71FA770A788A9CFAA70AADDFF70FF9EFF9F\",\n    Lo: \"01BB01C0-01C3029405D0-05EA05F0-05F20621-063F0641-064A066E066F0671-06D306D506EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA0800-08150904-0939093D09500958-096109720979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E450E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EDC0EDD0F000F40-0F470F49-0F6C0F88-0F8B1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10D0-10FA1100-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317DC1820-18421844-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541B05-1B331B45-1B4B1B83-1BA01BAE1BAF1C00-1C231C4D-1C4F1C5A-1C771CE9-1CEC1CEE-1CF12135-21382D30-2D652D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE3006303C3041-3096309F30A1-30FA30FF3105-312D3131-318E31A0-31B731F0-31FF3400-4DB54E00-9FCBA000-A014A016-A48CA4D0-A4F7A500-A60BA610-A61FA62AA62BA66EA6A0-A6E5A7FB-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2AA00-AA28AA40-AA42AA44-AA4BAA60-AA6FAA71-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADBAADCABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-FA6DFA70-FAD9FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF66-FF6FFF71-FF9DFFA0-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC\",\n    M:  \"0300-036F0483-04890591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DE-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0903093C093E-094E0951-0955096209630981-098309BC09BE-09C409C709C809CB-09CD09D709E209E30A01-0A030A3C0A3E-0A420A470A480A4B-0A4D0A510A700A710A750A81-0A830ABC0ABE-0AC50AC7-0AC90ACB-0ACD0AE20AE30B01-0B030B3C0B3E-0B440B470B480B4B-0B4D0B560B570B620B630B820BBE-0BC20BC6-0BC80BCA-0BCD0BD70C01-0C030C3E-0C440C46-0C480C4A-0C4D0C550C560C620C630C820C830CBC0CBE-0CC40CC6-0CC80CCA-0CCD0CD50CD60CE20CE30D020D030D3E-0D440D46-0D480D4A-0D4D0D570D620D630D820D830DCA0DCF-0DD40DD60DD8-0DDF0DF20DF30E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F3E0F3F0F71-0F840F860F870F90-0F970F99-0FBC0FC6102B-103E1056-1059105E-10601062-10641067-106D1071-10741082-108D108F109A-109D135F1712-17141732-1734175217531772177317B6-17D317DD180B-180D18A91920-192B1930-193B19B0-19C019C819C91A17-1A1B1A55-1A5E1A60-1A7C1A7F1B00-1B041B34-1B441B6B-1B731B80-1B821BA1-1BAA1C24-1C371CD0-1CD21CD4-1CE81CED1CF21DC0-1DE61DFD-1DFF20D0-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66F-A672A67CA67DA6F0A6F1A802A806A80BA823-A827A880A881A8B4-A8C4A8E0-A8F1A926-A92DA947-A953A980-A983A9B3-A9C0AA29-AA36AA43AA4CAA4DAA7BAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE3-ABEAABECABEDFB1EFE00-FE0FFE20-FE26\",\n    Mn: \"0300-036F0483-04870591-05BD05BF05C105C205C405C505C70610-061A064B-065E067006D6-06DC06DF-06E406E706E806EA-06ED07110730-074A07A6-07B007EB-07F30816-0819081B-08230825-08270829-082D0900-0902093C0941-0948094D0951-095509620963098109BC09C1-09C409CD09E209E30A010A020A3C0A410A420A470A480A4B-0A4D0A510A700A710A750A810A820ABC0AC1-0AC50AC70AC80ACD0AE20AE30B010B3C0B3F0B41-0B440B4D0B560B620B630B820BC00BCD0C3E-0C400C46-0C480C4A-0C4D0C550C560C620C630CBC0CBF0CC60CCC0CCD0CE20CE30D41-0D440D4D0D620D630DCA0DD2-0DD40DD60E310E34-0E3A0E47-0E4E0EB10EB4-0EB90EBB0EBC0EC8-0ECD0F180F190F350F370F390F71-0F7E0F80-0F840F860F870F90-0F970F99-0FBC0FC6102D-10301032-10371039103A103D103E10581059105E-10601071-1074108210851086108D109D135F1712-17141732-1734175217531772177317B7-17BD17C617C9-17D317DD180B-180D18A91920-19221927192819321939-193B1A171A181A561A58-1A5E1A601A621A65-1A6C1A73-1A7C1A7F1B00-1B031B341B36-1B3A1B3C1B421B6B-1B731B801B811BA2-1BA51BA81BA91C2C-1C331C361C371CD0-1CD21CD4-1CE01CE2-1CE81CED1DC0-1DE61DFD-1DFF20D0-20DC20E120E5-20F02CEF-2CF12DE0-2DFF302A-302F3099309AA66FA67CA67DA6F0A6F1A802A806A80BA825A826A8C4A8E0-A8F1A926-A92DA947-A951A980-A982A9B3A9B6-A9B9A9BCAA29-AA2EAA31AA32AA35AA36AA43AA4CAAB0AAB2-AAB4AAB7AAB8AABEAABFAAC1ABE5ABE8ABEDFB1EFE00-FE0FFE20-FE26\",\n    Mc: \"0903093E-09400949-094C094E0982098309BE-09C009C709C809CB09CC09D70A030A3E-0A400A830ABE-0AC00AC90ACB0ACC0B020B030B3E0B400B470B480B4B0B4C0B570BBE0BBF0BC10BC20BC6-0BC80BCA-0BCC0BD70C01-0C030C41-0C440C820C830CBE0CC0-0CC40CC70CC80CCA0CCB0CD50CD60D020D030D3E-0D400D46-0D480D4A-0D4C0D570D820D830DCF-0DD10DD8-0DDF0DF20DF30F3E0F3F0F7F102B102C10311038103B103C105610571062-10641067-106D108310841087-108C108F109A-109C17B617BE-17C517C717C81923-19261929-192B193019311933-193819B0-19C019C819C91A19-1A1B1A551A571A611A631A641A6D-1A721B041B351B3B1B3D-1B411B431B441B821BA11BA61BA71BAA1C24-1C2B1C341C351CE11CF2A823A824A827A880A881A8B4-A8C3A952A953A983A9B4A9B5A9BAA9BBA9BD-A9C0AA2FAA30AA33AA34AA4DAA7BABE3ABE4ABE6ABE7ABE9ABEAABEC\",\n    Me: \"0488048906DE20DD-20E020E2-20E4A670-A672\",\n    N:  \"0030-003900B200B300B900BC-00BE0660-066906F0-06F907C0-07C90966-096F09E6-09EF09F4-09F90A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BF20C66-0C6F0C78-0C7E0CE6-0CEF0D66-0D750E50-0E590ED0-0ED90F20-0F331040-10491090-10991369-137C16EE-16F017E0-17E917F0-17F91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C5920702074-20792080-20892150-21822185-21892460-249B24EA-24FF2776-27932CFD30073021-30293038-303A3192-31953220-32293251-325F3280-328932B1-32BFA620-A629A6E6-A6EFA830-A835A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\",\n    Nd: \"0030-00390660-066906F0-06F907C0-07C90966-096F09E6-09EF0A66-0A6F0AE6-0AEF0B66-0B6F0BE6-0BEF0C66-0C6F0CE6-0CEF0D66-0D6F0E50-0E590ED0-0ED90F20-0F291040-10491090-109917E0-17E91810-18191946-194F19D0-19DA1A80-1A891A90-1A991B50-1B591BB0-1BB91C40-1C491C50-1C59A620-A629A8D0-A8D9A900-A909A9D0-A9D9AA50-AA59ABF0-ABF9FF10-FF19\",\n    Nl: \"16EE-16F02160-21822185-218830073021-30293038-303AA6E6-A6EF\",\n    No: \"00B200B300B900BC-00BE09F4-09F90BF0-0BF20C78-0C7E0D70-0D750F2A-0F331369-137C17F0-17F920702074-20792080-20892150-215F21892460-249B24EA-24FF2776-27932CFD3192-31953220-32293251-325F3280-328932B1-32BFA830-A835\",\n    P:  \"0021-00230025-002A002C-002F003A003B003F0040005B-005D005F007B007D00A100AB00B700BB00BF037E0387055A-055F0589058A05BE05C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F3A-0F3D0F850FD0-0FD4104A-104F10FB1361-13681400166D166E169B169C16EB-16ED1735173617D4-17D617D8-17DA1800-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD32010-20272030-20432045-20512053-205E207D207E208D208E2329232A2768-277527C527C627E6-27EF2983-299829D8-29DB29FC29FD2CF9-2CFC2CFE2CFF2E00-2E2E2E302E313001-30033008-30113014-301F3030303D30A030FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFD3EFD3FFE10-FE19FE30-FE52FE54-FE61FE63FE68FE6AFE6BFF01-FF03FF05-FF0AFF0C-FF0FFF1AFF1BFF1FFF20FF3B-FF3DFF3FFF5BFF5DFF5F-FF65\",\n    Pd: \"002D058A05BE140018062010-20152E172E1A301C303030A0FE31FE32FE58FE63FF0D\",\n    Ps: \"0028005B007B0F3A0F3C169B201A201E2045207D208D23292768276A276C276E27702772277427C527E627E827EA27EC27EE2983298529872989298B298D298F299129932995299729D829DA29FC2E222E242E262E283008300A300C300E3010301430163018301A301DFD3EFE17FE35FE37FE39FE3BFE3DFE3FFE41FE43FE47FE59FE5BFE5DFF08FF3BFF5BFF5FFF62\",\n    Pe: \"0029005D007D0F3B0F3D169C2046207E208E232A2769276B276D276F27712773277527C627E727E927EB27ED27EF298429862988298A298C298E2990299229942996299829D929DB29FD2E232E252E272E293009300B300D300F3011301530173019301B301E301FFD3FFE18FE36FE38FE3AFE3CFE3EFE40FE42FE44FE48FE5AFE5CFE5EFF09FF3DFF5DFF60FF63\",\n    Pi: \"00AB2018201B201C201F20392E022E042E092E0C2E1C2E20\",\n    Pf: \"00BB2019201D203A2E032E052E0A2E0D2E1D2E21\",\n    Pc: \"005F203F20402054FE33FE34FE4D-FE4FFF3F\",\n    Po: \"0021-00230025-0027002A002C002E002F003A003B003F0040005C00A100B700BF037E0387055A-055F058905C005C305C605F305F40609060A060C060D061B061E061F066A-066D06D40700-070D07F7-07F90830-083E0964096509700DF40E4F0E5A0E5B0F04-0F120F850FD0-0FD4104A-104F10FB1361-1368166D166E16EB-16ED1735173617D4-17D617D8-17DA1800-18051807-180A1944194519DE19DF1A1E1A1F1AA0-1AA61AA8-1AAD1B5A-1B601C3B-1C3F1C7E1C7F1CD3201620172020-20272030-2038203B-203E2041-20432047-205120532055-205E2CF9-2CFC2CFE2CFF2E002E012E06-2E082E0B2E0E-2E162E182E192E1B2E1E2E1F2E2A-2E2E2E302E313001-3003303D30FBA4FEA4FFA60D-A60FA673A67EA6F2-A6F7A874-A877A8CEA8CFA8F8-A8FAA92EA92FA95FA9C1-A9CDA9DEA9DFAA5C-AA5FAADEAADFABEBFE10-FE16FE19FE30FE45FE46FE49-FE4CFE50-FE52FE54-FE57FE5F-FE61FE68FE6AFE6BFF01-FF03FF05-FF07FF0AFF0CFF0EFF0FFF1AFF1BFF1FFF20FF3CFF61FF64FF65\",\n    S:  \"0024002B003C-003E005E0060007C007E00A2-00A900AC00AE-00B100B400B600B800D700F702C2-02C502D2-02DF02E5-02EB02ED02EF-02FF03750384038503F604820606-0608060B060E060F06E906FD06FE07F609F209F309FA09FB0AF10B700BF3-0BFA0C7F0CF10CF20D790E3F0F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-139917DB194019E0-19FF1B61-1B6A1B74-1B7C1FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE20442052207A-207C208A-208C20A0-20B8210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B2140-2144214A-214D214F2190-2328232B-23E82400-24262440-244A249C-24E92500-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE27C0-27C427C7-27CA27CC27D0-27E527F0-29822999-29D729DC-29FB29FE-2B4C2B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F309B309C319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A700-A716A720A721A789A78AA828-A82BA836-A839AA77-AA79FB29FDFCFDFDFE62FE64-FE66FE69FF04FF0BFF1C-FF1EFF3EFF40FF5CFF5EFFE0-FFE6FFE8-FFEEFFFCFFFD\",\n    Sm: \"002B003C-003E007C007E00AC00B100D700F703F60606-060820442052207A-207C208A-208C2140-2144214B2190-2194219A219B21A021A321A621AE21CE21CF21D221D421F4-22FF2308-230B23202321237C239B-23B323DC-23E125B725C125F8-25FF266F27C0-27C427C7-27CA27CC27D0-27E527F0-27FF2900-29822999-29D729DC-29FB29FE-2AFF2B30-2B442B47-2B4CFB29FE62FE64-FE66FF0BFF1C-FF1EFF5CFF5EFFE2FFE9-FFEC\",\n    Sc: \"002400A2-00A5060B09F209F309FB0AF10BF90E3F17DB20A0-20B8A838FDFCFE69FF04FFE0FFE1FFE5FFE6\",\n    Sk: \"005E006000A800AF00B400B802C2-02C502D2-02DF02E5-02EB02ED02EF-02FF0375038403851FBD1FBF-1FC11FCD-1FCF1FDD-1FDF1FED-1FEF1FFD1FFE309B309CA700-A716A720A721A789A78AFF3EFF40FFE3\",\n    So: \"00A600A700A900AE00B000B60482060E060F06E906FD06FE07F609FA0B700BF3-0BF80BFA0C7F0CF10CF20D790F01-0F030F13-0F170F1A-0F1F0F340F360F380FBE-0FC50FC7-0FCC0FCE0FCF0FD5-0FD8109E109F13601390-1399194019E0-19FF1B61-1B6A1B74-1B7C210021012103-21062108210921142116-2118211E-2123212521272129212E213A213B214A214C214D214F2195-2199219C-219F21A121A221A421A521A7-21AD21AF-21CD21D021D121D321D5-21F32300-2307230C-231F2322-2328232B-237B237D-239A23B4-23DB23E2-23E82400-24262440-244A249C-24E92500-25B625B8-25C025C2-25F72600-266E2670-26CD26CF-26E126E326E8-26FF2701-27042706-2709270C-27272729-274B274D274F-27522756-275E2761-276727942798-27AF27B1-27BE2800-28FF2B00-2B2F2B452B462B50-2B592CE5-2CEA2E80-2E992E9B-2EF32F00-2FD52FF0-2FFB300430123013302030363037303E303F319031913196-319F31C0-31E33200-321E322A-32503260-327F328A-32B032C0-32FE3300-33FF4DC0-4DFFA490-A4C6A828-A82BA836A837A839AA77-AA79FDFDFFE4FFE8FFEDFFEEFFFCFFFD\",\n    Z:  \"002000A01680180E2000-200A20282029202F205F3000\",\n    Zs: \"002000A01680180E2000-200A202F205F3000\",\n    Zl: \"2028\",\n    Zp: \"2029\",\n    C:  \"0000-001F007F-009F00AD03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-0605061C061D0620065F06DD070E070F074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17B417B517DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF200B-200F202A-202E2060-206F20722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-F8FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFD-FF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFFBFFFEFFFF\",\n    Cc: \"0000-001F007F-009F\",\n    Cf: \"00AD0600-060306DD070F17B417B5200B-200F202A-202E2060-2064206A-206FFEFFFFF9-FFFB\",\n    Co: \"E000-F8FF\",\n    Cs: \"D800-DFFF\",\n    Cn: \"03780379037F-0383038B038D03A20526-05300557055805600588058B-059005C8-05CF05EB-05EF05F5-05FF06040605061C061D0620065F070E074B074C07B2-07BF07FB-07FF082E082F083F-08FF093A093B094F095609570973-097809800984098D098E0991099209A909B109B3-09B509BA09BB09C509C609C909CA09CF-09D609D8-09DB09DE09E409E509FC-0A000A040A0B-0A0E0A110A120A290A310A340A370A3A0A3B0A3D0A43-0A460A490A4A0A4E-0A500A52-0A580A5D0A5F-0A650A76-0A800A840A8E0A920AA90AB10AB40ABA0ABB0AC60ACA0ACE0ACF0AD1-0ADF0AE40AE50AF00AF2-0B000B040B0D0B0E0B110B120B290B310B340B3A0B3B0B450B460B490B4A0B4E-0B550B58-0B5B0B5E0B640B650B72-0B810B840B8B-0B8D0B910B96-0B980B9B0B9D0BA0-0BA20BA5-0BA70BAB-0BAD0BBA-0BBD0BC3-0BC50BC90BCE0BCF0BD1-0BD60BD8-0BE50BFB-0C000C040C0D0C110C290C340C3A-0C3C0C450C490C4E-0C540C570C5A-0C5F0C640C650C70-0C770C800C810C840C8D0C910CA90CB40CBA0CBB0CC50CC90CCE-0CD40CD7-0CDD0CDF0CE40CE50CF00CF3-0D010D040D0D0D110D290D3A-0D3C0D450D490D4E-0D560D58-0D5F0D640D650D76-0D780D800D810D840D97-0D990DB20DBC0DBE0DBF0DC7-0DC90DCB-0DCE0DD50DD70DE0-0DF10DF5-0E000E3B-0E3E0E5C-0E800E830E850E860E890E8B0E8C0E8E-0E930E980EA00EA40EA60EA80EA90EAC0EBA0EBE0EBF0EC50EC70ECE0ECF0EDA0EDB0EDE-0EFF0F480F6D-0F700F8C-0F8F0F980FBD0FCD0FD9-0FFF10C6-10CF10FD-10FF1249124E124F12571259125E125F1289128E128F12B112B612B712BF12C112C612C712D7131113161317135B-135E137D-137F139A-139F13F5-13FF169D-169F16F1-16FF170D1715-171F1737-173F1754-175F176D17711774-177F17DE17DF17EA-17EF17FA-17FF180F181A-181F1878-187F18AB-18AF18F6-18FF191D-191F192C-192F193C-193F1941-1943196E196F1975-197F19AC-19AF19CA-19CF19DB-19DD1A1C1A1D1A5F1A7D1A7E1A8A-1A8F1A9A-1A9F1AAE-1AFF1B4C-1B4F1B7D-1B7F1BAB-1BAD1BBA-1BFF1C38-1C3A1C4A-1C4C1C80-1CCF1CF3-1CFF1DE7-1DFC1F161F171F1E1F1F1F461F471F4E1F4F1F581F5A1F5C1F5E1F7E1F7F1FB51FC51FD41FD51FDC1FF01FF11FF51FFF2065-206920722073208F2095-209F20B9-20CF20F1-20FF218A-218F23E9-23FF2427-243F244B-245F26CE26E226E4-26E727002705270A270B2728274C274E2753-2755275F27602795-279727B027BF27CB27CD-27CF2B4D-2B4F2B5A-2BFF2C2F2C5F2CF2-2CF82D26-2D2F2D66-2D6E2D70-2D7F2D97-2D9F2DA72DAF2DB72DBF2DC72DCF2DD72DDF2E32-2E7F2E9A2EF4-2EFF2FD6-2FEF2FFC-2FFF3040309730983100-3104312E-3130318F31B8-31BF31E4-31EF321F32FF4DB6-4DBF9FCC-9FFFA48D-A48FA4C7-A4CFA62C-A63FA660A661A674-A67BA698-A69FA6F8-A6FFA78D-A7FAA82C-A82FA83A-A83FA878-A87FA8C5-A8CDA8DA-A8DFA8FC-A8FFA954-A95EA97D-A97FA9CEA9DA-A9DDA9E0-A9FFAA37-AA3FAA4EAA4FAA5AAA5BAA7C-AA7FAAC3-AADAAAE0-ABBFABEEABEFABFA-ABFFD7A4-D7AFD7C7-D7CAD7FC-D7FFFA2EFA2FFA6EFA6FFADA-FAFFFB07-FB12FB18-FB1CFB37FB3DFB3FFB42FB45FBB2-FBD2FD40-FD4FFD90FD91FDC8-FDEFFDFEFDFFFE1A-FE1FFE27-FE2FFE53FE67FE6C-FE6FFE75FEFDFEFEFF00FFBF-FFC1FFC8FFC9FFD0FFD1FFD8FFD9FFDD-FFDFFFE7FFEF-FFF8FFFEFFFF\"\n});\n\nfunction addUnicodePackage (pack) {\n    var codePoint = /\\w{4}/g;\n    for (var name in pack)\n        exports.packages[name] = pack[name].replace(codePoint, \"\\\\u$&\");\n};\n\n});\n\nace.define(\"ace/token_iterator\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nvar TokenIterator = function(session, initialRow, initialColumn) {\n    this.$session = session;\n    this.$row = initialRow;\n    this.$rowTokens = session.getTokens(initialRow);\n\n    var token = session.getTokenAt(initialRow, initialColumn);\n    this.$tokenIndex = token ? token.index : -1;\n};\n\n(function() { \n    this.stepBackward = function() {\n        this.$tokenIndex -= 1;\n        \n        while (this.$tokenIndex < 0) {\n            this.$row -= 1;\n            if (this.$row < 0) {\n                this.$row = 0;\n                return null;\n            }\n                \n            this.$rowTokens = this.$session.getTokens(this.$row);\n            this.$tokenIndex = this.$rowTokens.length - 1;\n        }\n            \n        return this.$rowTokens[this.$tokenIndex];\n    };   \n    this.stepForward = function() {\n        this.$tokenIndex += 1;\n        var rowCount;\n        while (this.$tokenIndex >= this.$rowTokens.length) {\n            this.$row += 1;\n            if (!rowCount)\n                rowCount = this.$session.getLength();\n            if (this.$row >= rowCount) {\n                this.$row = rowCount - 1;\n                return null;\n            }\n\n            this.$rowTokens = this.$session.getTokens(this.$row);\n            this.$tokenIndex = 0;\n        }\n            \n        return this.$rowTokens[this.$tokenIndex];\n    };      \n    this.getCurrentToken = function () {\n        return this.$rowTokens[this.$tokenIndex];\n    };      \n    this.getCurrentTokenRow = function () {\n        return this.$row;\n    };     \n    this.getCurrentTokenColumn = function() {\n        var rowTokens = this.$rowTokens;\n        var tokenIndex = this.$tokenIndex;\n        var column = rowTokens[tokenIndex].start;\n        if (column !== undefined)\n            return column;\n            \n        column = 0;\n        while (tokenIndex > 0) {\n            tokenIndex -= 1;\n            column += rowTokens[tokenIndex].value.length;\n        }\n        \n        return column;  \n    };\n            \n}).call(TokenIterator.prototype);\n\nexports.TokenIterator = TokenIterator;\n});\n\nace.define(\"ace/mode/text\",[\"require\",\"exports\",\"module\",\"ace/tokenizer\",\"ace/mode/text_highlight_rules\",\"ace/mode/behaviour\",\"ace/unicode\",\"ace/lib/lang\",\"ace/token_iterator\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar Behaviour = require(\"./behaviour\").Behaviour;\nvar unicode = require(\"../unicode\");\nvar lang = require(\"../lib/lang\");\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.HighlightRules = TextHighlightRules;\n    this.$behaviour = new Behaviour();\n};\n\n(function() {\n\n    this.tokenRe = new RegExp(\"^[\"\n        + unicode.packages.L\n        + unicode.packages.Mn + unicode.packages.Mc\n        + unicode.packages.Nd\n        + unicode.packages.Pc + \"\\\\$_]+\", \"g\"\n    );\n\n    this.nonTokenRe = new RegExp(\"^(?:[^\"\n        + unicode.packages.L\n        + unicode.packages.Mn + unicode.packages.Mc\n        + unicode.packages.Nd\n        + unicode.packages.Pc + \"\\\\$_]|\\\\s])+\", \"g\"\n    );\n\n    this.getTokenizer = function() {\n        if (!this.$tokenizer) {\n            this.$highlightRules = this.$highlightRules || new this.HighlightRules();\n            this.$tokenizer = new Tokenizer(this.$highlightRules.getRules());\n        }\n        return this.$tokenizer;\n    };\n\n    this.lineCommentStart = \"\";\n    this.blockComment = \"\";\n\n    this.toggleCommentLines = function(state, session, startRow, endRow) {\n        var doc = session.doc;\n\n        var ignoreBlankLines = true;\n        var shouldRemove = true;\n        var minIndent = Infinity;\n        var tabSize = session.getTabSize();\n        var insertAtTabStop = false;\n\n        if (!this.lineCommentStart) {\n            if (!this.blockComment)\n                return false;\n            var lineCommentStart = this.blockComment.start;\n            var lineCommentEnd = this.blockComment.end;\n            var regexpStart = new RegExp(\"^(\\\\s*)(?:\" + lang.escapeRegExp(lineCommentStart) + \")\");\n            var regexpEnd = new RegExp(\"(?:\" + lang.escapeRegExp(lineCommentEnd) + \")\\\\s*$\");\n\n            var comment = function(line, i) {\n                if (testRemove(line, i))\n                    return;\n                if (!ignoreBlankLines || /\\S/.test(line)) {\n                    doc.insertInLine({row: i, column: line.length}, lineCommentEnd);\n                    doc.insertInLine({row: i, column: minIndent}, lineCommentStart);\n                }\n            };\n\n            var uncomment = function(line, i) {\n                var m;\n                if (m = line.match(regexpEnd))\n                    doc.removeInLine(i, line.length - m[0].length, line.length);\n                if (m = line.match(regexpStart))\n                    doc.removeInLine(i, m[1].length, m[0].length);\n            };\n\n            var testRemove = function(line, row) {\n                if (regexpStart.test(line))\n                    return true;\n                var tokens = session.getTokens(row);\n                for (var i = 0; i < tokens.length; i++) {\n                    if (tokens[i].type === 'comment')\n                        return true;\n                }\n            };\n        } else {\n            if (Array.isArray(this.lineCommentStart)) {\n                var regexpStart = this.lineCommentStart.map(lang.escapeRegExp).join(\"|\");\n                var lineCommentStart = this.lineCommentStart[0];\n            } else {\n                var regexpStart = lang.escapeRegExp(this.lineCommentStart);\n                var lineCommentStart = this.lineCommentStart;\n            }\n            regexpStart = new RegExp(\"^(\\\\s*)(?:\" + regexpStart + \") ?\");\n            \n            insertAtTabStop = session.getUseSoftTabs();\n\n            var uncomment = function(line, i) {\n                var m = line.match(regexpStart);\n                if (!m) return;\n                var start = m[1].length, end = m[0].length;\n                if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == \" \")\n                    end--;\n                doc.removeInLine(i, start, end);\n            };\n            var commentWithSpace = lineCommentStart + \" \";\n            var comment = function(line, i) {\n                if (!ignoreBlankLines || /\\S/.test(line)) {\n                    if (shouldInsertSpace(line, minIndent, minIndent))\n                        doc.insertInLine({row: i, column: minIndent}, commentWithSpace);\n                    else\n                        doc.insertInLine({row: i, column: minIndent}, lineCommentStart);\n                }\n            };\n            var testRemove = function(line, i) {\n                return regexpStart.test(line);\n            };\n            \n            var shouldInsertSpace = function(line, before, after) {\n                var spaces = 0;\n                while (before-- && line.charAt(before) == \" \")\n                    spaces++;\n                if (spaces % tabSize != 0)\n                    return false;\n                var spaces = 0;\n                while (line.charAt(after++) == \" \")\n                    spaces++;\n                if (tabSize > 2)\n                    return spaces % tabSize != tabSize - 1;\n                else\n                    return spaces % tabSize == 0;\n                return true;\n            };\n        }\n\n        function iter(fun) {\n            for (var i = startRow; i <= endRow; i++)\n                fun(doc.getLine(i), i);\n        }\n\n\n        var minEmptyLength = Infinity;\n        iter(function(line, i) {\n            var indent = line.search(/\\S/);\n            if (indent !== -1) {\n                if (indent < minIndent)\n                    minIndent = indent;\n                if (shouldRemove && !testRemove(line, i))\n                    shouldRemove = false;\n            } else if (minEmptyLength > line.length) {\n                minEmptyLength = line.length;\n            }\n        });\n\n        if (minIndent == Infinity) {\n            minIndent = minEmptyLength;\n            ignoreBlankLines = false;\n            shouldRemove = false;\n        }\n\n        if (insertAtTabStop && minIndent % tabSize != 0)\n            minIndent = Math.floor(minIndent / tabSize) * tabSize;\n\n        iter(shouldRemove ? uncomment : comment);\n    };\n\n    this.toggleBlockComment = function(state, session, range, cursor) {\n        var comment = this.blockComment;\n        if (!comment)\n            return;\n        if (!comment.start && comment[0])\n            comment = comment[0];\n\n        var iterator = new TokenIterator(session, cursor.row, cursor.column);\n        var token = iterator.getCurrentToken();\n\n        var sel = session.selection;\n        var initialRange = session.selection.toOrientedRange();\n        var startRow, colDiff;\n\n        if (token && /comment/.test(token.type)) {\n            var startRange, endRange;\n            while (token && /comment/.test(token.type)) {\n                var i = token.value.indexOf(comment.start);\n                if (i != -1) {\n                    var row = iterator.getCurrentTokenRow();\n                    var column = iterator.getCurrentTokenColumn() + i;\n                    startRange = new Range(row, column, row, column + comment.start.length);\n                    break;\n                }\n                token = iterator.stepBackward();\n            }\n\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            while (token && /comment/.test(token.type)) {\n                var i = token.value.indexOf(comment.end);\n                if (i != -1) {\n                    var row = iterator.getCurrentTokenRow();\n                    var column = iterator.getCurrentTokenColumn() + i;\n                    endRange = new Range(row, column, row, column + comment.end.length);\n                    break;\n                }\n                token = iterator.stepForward();\n            }\n            if (endRange)\n                session.remove(endRange);\n            if (startRange) {\n                session.remove(startRange);\n                startRow = startRange.start.row;\n                colDiff = -comment.start.length;\n            }\n        } else {\n            colDiff = comment.start.length;\n            startRow = range.start.row;\n            session.insert(range.end, comment.end);\n            session.insert(range.start, comment.start);\n        }\n        if (initialRange.start.row == startRow)\n            initialRange.start.column += colDiff;\n        if (initialRange.end.row == startRow)\n            initialRange.end.column += colDiff;\n        session.selection.fromOrientedRange(initialRange);\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n    this.createWorker = function(session) {\n        return null;\n    };\n\n    this.createModeDelegates = function (mapping) {\n        this.$embeds = [];\n        this.$modes = {};\n        for (var i in mapping) {\n            if (mapping[i]) {\n                this.$embeds.push(i);\n                this.$modes[i] = new mapping[i]();\n            }\n        }\n\n        var delegations = ['toggleBlockComment', 'toggleCommentLines', 'getNextLineIndent', \n            'checkOutdent', 'autoOutdent', 'transformAction', 'getCompletions'];\n\n        for (var i = 0; i < delegations.length; i++) {\n            (function(scope) {\n              var functionName = delegations[i];\n              var defaultHandler = scope[functionName];\n              scope[delegations[i]] = function() {\n                  return this.$delegator(functionName, arguments, defaultHandler);\n              };\n            } (this));\n        }\n    };\n\n    this.$delegator = function(method, args, defaultHandler) {\n        var state = args[0];\n        if (typeof state != \"string\")\n            state = state[0];\n        for (var i = 0; i < this.$embeds.length; i++) {\n            if (!this.$modes[this.$embeds[i]]) continue;\n\n            var split = state.split(this.$embeds[i]);\n            if (!split[0] && split[1]) {\n                args[0] = split[1];\n                var mode = this.$modes[this.$embeds[i]];\n                return mode[method].apply(mode, args);\n            }\n        }\n        var ret = defaultHandler.apply(this, args);\n        return defaultHandler ? ret : undefined;\n    };\n\n    this.transformAction = function(state, action, editor, session, param) {\n        if (this.$behaviour) {\n            var behaviours = this.$behaviour.getBehaviours();\n            for (var key in behaviours) {\n                if (behaviours[key][action]) {\n                    var ret = behaviours[key][action].apply(this, arguments);\n                    if (ret) {\n                        return ret;\n                    }\n                }\n            }\n        }\n    };\n    \n    this.getKeywords = function(append) {\n        if (!this.completionKeywords) {\n            var rules = this.$tokenizer.rules;\n            var completionKeywords = [];\n            for (var rule in rules) {\n                var ruleItr = rules[rule];\n                for (var r = 0, l = ruleItr.length; r < l; r++) {\n                    if (typeof ruleItr[r].token === \"string\") {\n                        if (/keyword|support|storage/.test(ruleItr[r].token))\n                            completionKeywords.push(ruleItr[r].regex);\n                    }\n                    else if (typeof ruleItr[r].token === \"object\") {\n                        for (var a = 0, aLength = ruleItr[r].token.length; a < aLength; a++) {    \n                            if (/keyword|support|storage/.test(ruleItr[r].token[a])) {\n                                var rule = ruleItr[r].regex.match(/\\(.+?\\)/g)[a];\n                                completionKeywords.push(rule.substr(1, rule.length - 2));\n                            }\n                        }\n                    }\n                }\n            }\n            this.completionKeywords = completionKeywords;\n        }\n        if (!append)\n            return this.$keywordList;\n        return completionKeywords.concat(this.$keywordList || []);\n    };\n    \n    this.$createKeywordList = function() {\n        if (!this.$highlightRules)\n            this.getTokenizer();\n        return this.$keywordList = this.$highlightRules.$keywordList || [];\n    };\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        var keywords = this.$keywordList || this.$createKeywordList();\n        return keywords.map(function(word) {\n            return {\n                name: word,\n                value: word,\n                score: 0,\n                meta: \"keyword\"\n            };\n        });\n    };\n\n    this.$id = \"ace/mode/text\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n    this.$onChange = this.onChange.bind(this);\n    this.attach(doc);\n    \n    if (typeof column == \"undefined\")\n        this.setPosition(row.row, row.column);\n    else\n        this.setPosition(row, column);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.getPosition = function() {\n        return this.$clipPositionToDocument(this.row, this.column);\n    };\n    this.getDocument = function() {\n        return this.document;\n    };\n    this.$insertRight = false;\n    this.onChange = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n\n        if (range.start.row == range.end.row && range.start.row != this.row)\n            return;\n\n        if (range.start.row > this.row)\n            return;\n\n        if (range.start.row == this.row && range.start.column > this.column)\n            return;\n\n        var row = this.row;\n        var column = this.column;\n        var start = range.start;\n        var end = range.end;\n\n        if (delta.action === \"insertText\") {\n            if (start.row === row && start.column <= column) {\n                if (start.column === column && this.$insertRight) {\n                } else if (start.row === end.row) {\n                    column += end.column - start.column;\n                } else {\n                    column -= start.column;\n                    row += end.row - start.row;\n                }\n            } else if (start.row !== end.row && start.row < row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"insertLines\") {\n            if (start.row === row && column === 0 && this.$insertRight) {\n            }\n            else if (start.row <= row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"removeText\") {\n            if (start.row === row && start.column < column) {\n                if (end.column >= column)\n                    column = start.column;\n                else\n                    column = Math.max(0, column - (end.column - start.column));\n\n            } else if (start.row !== end.row && start.row < row) {\n                if (end.row === row)\n                    column = Math.max(0, column - end.column) + start.column;\n                row -= (end.row - start.row);\n            } else if (end.row === row) {\n                row -= end.row - start.row;\n                column = Math.max(0, column - end.column) + start.column;\n            }\n        } else if (delta.action == \"removeLines\") {\n            if (start.row <= row) {\n                if (end.row <= row)\n                    row -= end.row - start.row;\n                else {\n                    row = start.row;\n                    column = 0;\n                }\n            }\n        }\n\n        this.setPosition(row, column, true);\n    };\n    this.setPosition = function(row, column, noClip) {\n        var pos;\n        if (noClip) {\n            pos = {\n                row: row,\n                column: column\n            };\n        } else {\n            pos = this.$clipPositionToDocument(row, column);\n        }\n\n        if (this.row == pos.row && this.column == pos.column)\n            return;\n\n        var old = {\n            row: this.row,\n            column: this.column\n        };\n\n        this.row = pos.row;\n        this.column = pos.column;\n        this._signal(\"change\", {\n            old: old,\n            value: pos\n        });\n    };\n    this.detach = function() {\n        this.document.removeEventListener(\"change\", this.$onChange);\n    };\n    this.attach = function(doc) {\n        this.document = doc || this.document;\n        this.document.on(\"change\", this.$onChange);\n    };\n    this.$clipPositionToDocument = function(row, column) {\n        var pos = {};\n\n        if (row >= this.document.getLength()) {\n            pos.row = Math.max(0, this.document.getLength() - 1);\n            pos.column = this.document.getLine(pos.row).length;\n        }\n        else if (row < 0) {\n            pos.row = 0;\n            pos.column = 0;\n        }\n        else {\n            pos.row = row;\n            pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n        }\n\n        if (column < 0)\n            pos.column = 0;\n\n        return pos;\n    };\n\n}).call(Anchor.prototype);\n\n});\n\nace.define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\nvar Document = function(text) {\n    this.$lines = [];\n    if (text.length === 0) {\n        this.$lines = [\"\"];\n    } else if (Array.isArray(text)) {\n        this._insertLines(0, text);\n    } else {\n        this.insert({row: 0, column:0}, text);\n    }\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setValue = function(text) {\n        var len = this.getLength();\n        this.remove(new Range(0, 0, len, this.getLine(len-1).length));\n        this.insert({row: 0, column:0}, text);\n    };\n    this.getValue = function() {\n        return this.getAllLines().join(this.getNewLineCharacter());\n    };\n    this.createAnchor = function(row, column) {\n        return new Anchor(this, row, column);\n    };\n    if (\"aaa\".split(/a/).length === 0)\n        this.$split = function(text) {\n            return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n        };\n    else\n        this.$split = function(text) {\n            return text.split(/\\r\\n|\\r|\\n/);\n        };\n\n\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n        this.$autoNewLine = match ? match[1] : \"\\n\";\n        this._signal(\"changeNewLineMode\");\n    };\n    this.getNewLineCharacter = function() {\n        switch (this.$newLineMode) {\n          case \"windows\":\n            return \"\\r\\n\";\n          case \"unix\":\n            return \"\\n\";\n          default:\n            return this.$autoNewLine || \"\\n\";\n        }\n    };\n\n    this.$autoNewLine = \"\";\n    this.$newLineMode = \"auto\";\n    this.setNewLineMode = function(newLineMode) {\n        if (this.$newLineMode === newLineMode)\n            return;\n\n        this.$newLineMode = newLineMode;\n        this._signal(\"changeNewLineMode\");\n    };\n    this.getNewLineMode = function() {\n        return this.$newLineMode;\n    };\n    this.isNewLine = function(text) {\n        return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n    };\n    this.getLine = function(row) {\n        return this.$lines[row] || \"\";\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.$lines.slice(firstRow, lastRow + 1);\n    };\n    this.getAllLines = function() {\n        return this.getLines(0, this.getLength());\n    };\n    this.getLength = function() {\n        return this.$lines.length;\n    };\n    this.getTextRange = function(range) {\n        if (range.start.row == range.end.row) {\n            return this.getLine(range.start.row)\n                .substring(range.start.column, range.end.column);\n        }\n        var lines = this.getLines(range.start.row, range.end.row);\n        lines[0] = (lines[0] || \"\").substring(range.start.column);\n        var l = lines.length - 1;\n        if (range.end.row - range.start.row == l)\n            lines[l] = lines[l].substring(0, range.end.column);\n        return lines.join(this.getNewLineCharacter());\n    };\n\n    this.$clipPosition = function(position) {\n        var length = this.getLength();\n        if (position.row >= length) {\n            position.row = Math.max(0, length - 1);\n            position.column = this.getLine(length-1).length;\n        } else if (position.row < 0)\n            position.row = 0;\n        return position;\n    };\n    this.insert = function(position, text) {\n        if (!text || text.length === 0)\n            return position;\n\n        position = this.$clipPosition(position);\n        if (this.getLength() <= 1)\n            this.$detectNewLine(text);\n\n        var lines = this.$split(text);\n        var firstLine = lines.splice(0, 1)[0];\n        var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];\n\n        position = this.insertInLine(position, firstLine);\n        if (lastLine !== null) {\n            position = this.insertNewLine(position); // terminate first line\n            position = this._insertLines(position.row, lines);\n            position = this.insertInLine(position, lastLine || \"\");\n        }\n        return position;\n    };\n    this.insertLines = function(row, lines) {\n        if (row >= this.getLength())\n            return this.insert({row: row, column: 0}, \"\\n\" + lines.join(\"\\n\"));\n        return this._insertLines(Math.max(row, 0), lines);\n    };\n    this._insertLines = function(row, lines) {\n        if (lines.length == 0)\n            return {row: row, column: 0};\n        while (lines.length > 0xF000) {\n            var end = this._insertLines(row, lines.slice(0, 0xF000));\n            lines = lines.slice(0xF000);\n            row = end.row;\n        }\n\n        var args = [row, 0];\n        args.push.apply(args, lines);\n        this.$lines.splice.apply(this.$lines, args);\n\n        var range = new Range(row, 0, row + lines.length, 0);\n        var delta = {\n            action: \"insertLines\",\n            range: range,\n            lines: lines\n        };\n        this._signal(\"change\", { data: delta });\n        return range.end;\n    };\n    this.insertNewLine = function(position) {\n        position = this.$clipPosition(position);\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column);\n        this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));\n\n        var end = {\n            row : position.row + 1,\n            column : 0\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: this.getNewLineCharacter()\n        };\n        this._signal(\"change\", { data: delta });\n\n        return end;\n    };\n    this.insertInLine = function(position, text) {\n        if (text.length == 0)\n            return position;\n\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column) + text\n                + line.substring(position.column);\n\n        var end = {\n            row : position.row,\n            column : position.column + text.length\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: text\n        };\n        this._signal(\"change\", { data: delta });\n\n        return end;\n    };\n    this.remove = function(range) {\n        if (!(range instanceof Range))\n            range = Range.fromPoints(range.start, range.end);\n        range.start = this.$clipPosition(range.start);\n        range.end = this.$clipPosition(range.end);\n\n        if (range.isEmpty())\n            return range.start;\n\n        var firstRow = range.start.row;\n        var lastRow = range.end.row;\n\n        if (range.isMultiLine()) {\n            var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;\n            var lastFullRow = lastRow - 1;\n\n            if (range.end.column > 0)\n                this.removeInLine(lastRow, 0, range.end.column);\n\n            if (lastFullRow >= firstFullRow)\n                this._removeLines(firstFullRow, lastFullRow);\n\n            if (firstFullRow != firstRow) {\n                this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);\n                this.removeNewLine(range.start.row);\n            }\n        }\n        else {\n            this.removeInLine(firstRow, range.start.column, range.end.column);\n        }\n        return range.start;\n    };\n    this.removeInLine = function(row, startColumn, endColumn) {\n        if (startColumn == endColumn)\n            return;\n\n        var range = new Range(row, startColumn, row, endColumn);\n        var line = this.getLine(row);\n        var removed = line.substring(startColumn, endColumn);\n        var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);\n        this.$lines.splice(row, 1, newLine);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: removed\n        };\n        this._signal(\"change\", { data: delta });\n        return range.start;\n    };\n    this.removeLines = function(firstRow, lastRow) {\n        if (firstRow < 0 || lastRow >= this.getLength())\n            return this.remove(new Range(firstRow, 0, lastRow + 1, 0));\n        return this._removeLines(firstRow, lastRow);\n    };\n\n    this._removeLines = function(firstRow, lastRow) {\n        var range = new Range(firstRow, 0, lastRow + 1, 0);\n        var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);\n\n        var delta = {\n            action: \"removeLines\",\n            range: range,\n            nl: this.getNewLineCharacter(),\n            lines: removed\n        };\n        this._signal(\"change\", { data: delta });\n        return removed;\n    };\n    this.removeNewLine = function(row) {\n        var firstLine = this.getLine(row);\n        var secondLine = this.getLine(row+1);\n\n        var range = new Range(row, firstLine.length, row+1, 0);\n        var line = firstLine + secondLine;\n\n        this.$lines.splice(row, 2, line);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: this.getNewLineCharacter()\n        };\n        this._signal(\"change\", { data: delta });\n    };\n    this.replace = function(range, text) {\n        if (!(range instanceof Range))\n            range = Range.fromPoints(range.start, range.end);\n        if (text.length == 0 && range.isEmpty())\n            return range.start;\n        if (text == this.getTextRange(range))\n            return range.end;\n\n        this.remove(range);\n        if (text) {\n            var end = this.insert(range.start, text);\n        }\n        else {\n            end = range.start;\n        }\n\n        return end;\n    };\n    this.applyDeltas = function(deltas) {\n        for (var i=0; i<deltas.length; i++) {\n            var delta = deltas[i];\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"insertText\")\n                this.insert(range.start, delta.text);\n            else if (delta.action == \"removeLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"removeText\")\n                this.remove(range);\n        }\n    };\n    this.revertDeltas = function(deltas) {\n        for (var i=deltas.length-1; i>=0; i--) {\n            var delta = deltas[i];\n\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"insertText\")\n                this.remove(range);\n            else if (delta.action == \"removeLines\")\n                this._insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"removeText\")\n                this.insert(range.start, delta.text);\n        }\n    };\n    this.indexToPosition = function(index, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        for (var i = startRow || 0, l = lines.length; i < l; i++) {\n            index -= lines[i].length + newlineLength;\n            if (index < 0)\n                return {row: i, column: index + lines[i].length + newlineLength};\n        }\n        return {row: l-1, column: lines[l-1].length};\n    };\n    this.positionToIndex = function(pos, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        var index = 0;\n        var row = Math.min(pos.row, lines.length);\n        for (var i = startRow || 0; i < row; ++i)\n            index += lines[i].length + newlineLength;\n\n        return index + pos.column;\n    };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\nace.define(\"ace/background_tokenizer\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar BackgroundTokenizer = function(tokenizer, editor) {\n    this.running = false;\n    this.lines = [];\n    this.states = [];\n    this.currentLine = 0;\n    this.tokenizer = tokenizer;\n\n    var self = this;\n\n    this.$worker = function() {\n        if (!self.running) { return; }\n\n        var workerStart = new Date();\n        var currentLine = self.currentLine;\n        var endLine = -1;\n        var doc = self.doc;\n\n        while (self.lines[currentLine])\n            currentLine++;\n\n        var startLine = currentLine;\n\n        var len = doc.getLength();\n        var processedLines = 0;\n        self.running = false;\n        while (currentLine < len) {\n            self.$tokenizeRow(currentLine);\n            endLine = currentLine;\n            do {\n                currentLine++;\n            } while (self.lines[currentLine]);\n            processedLines ++;\n            if ((processedLines % 5 === 0) && (new Date() - workerStart) > 20) {                \n                self.running = setTimeout(self.$worker, 20);\n                break;\n            }\n        }\n        self.currentLine = currentLine;\n        \n        if (startLine <= endLine)\n            self.fireUpdateEvent(startLine, endLine);\n    };\n};\n\n(function(){\n\n    oop.implement(this, EventEmitter);\n    this.setTokenizer = function(tokenizer) {\n        this.tokenizer = tokenizer;\n        this.lines = [];\n        this.states = [];\n\n        this.start(0);\n    };\n    this.setDocument = function(doc) {\n        this.doc = doc;\n        this.lines = [];\n        this.states = [];\n\n        this.stop();\n    };\n    this.fireUpdateEvent = function(firstRow, lastRow) {\n        var data = {\n            first: firstRow,\n            last: lastRow\n        };\n        this._signal(\"update\", {data: data});\n    };\n    this.start = function(startRow) {\n        this.currentLine = Math.min(startRow || 0, this.currentLine, this.doc.getLength());\n        this.lines.splice(this.currentLine, this.lines.length);\n        this.states.splice(this.currentLine, this.states.length);\n\n        this.stop();\n        this.running = setTimeout(this.$worker, 700);\n    };\n    \n    this.scheduleStart = function() {\n        if (!this.running)\n            this.running = setTimeout(this.$worker, 700);\n    }\n\n    this.$updateOnChange = function(delta) {\n        var range = delta.range;\n        var startRow = range.start.row;\n        var len = range.end.row - startRow;\n\n        if (len === 0) {\n            this.lines[startRow] = null;\n        } else if (delta.action == \"removeText\" || delta.action == \"removeLines\") {\n            this.lines.splice(startRow, len + 1, null);\n            this.states.splice(startRow, len + 1, null);\n        } else {\n            var args = Array(len + 1);\n            args.unshift(startRow, 1);\n            this.lines.splice.apply(this.lines, args);\n            this.states.splice.apply(this.states, args);\n        }\n\n        this.currentLine = Math.min(startRow, this.currentLine, this.doc.getLength());\n\n        this.stop();\n    };\n    this.stop = function() {\n        if (this.running)\n            clearTimeout(this.running);\n        this.running = false;\n    };\n    this.getTokens = function(row) {\n        return this.lines[row] || this.$tokenizeRow(row);\n    };\n    this.getState = function(row) {\n        if (this.currentLine == row)\n            this.$tokenizeRow(row);\n        return this.states[row] || \"start\";\n    };\n\n    this.$tokenizeRow = function(row) {\n        var line = this.doc.getLine(row);\n        var state = this.states[row - 1];\n\n        var data = this.tokenizer.getLineTokens(line, state, row);\n\n        if (this.states[row] + \"\" !== data.state + \"\") {\n            this.states[row] = data.state;\n            this.lines[row + 1] = null;\n            if (this.currentLine > row + 1)\n                this.currentLine = row + 1;\n        } else if (this.currentLine == row) {\n            this.currentLine = row + 1;\n        }\n\n        return this.lines[row] = data.tokens;\n    };\n\n}).call(BackgroundTokenizer.prototype);\n\nexports.BackgroundTokenizer = BackgroundTokenizer;\n});\n\nace.define(\"ace/search_highlight\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar lang = require(\"./lib/lang\");\nvar oop = require(\"./lib/oop\");\nvar Range = require(\"./range\").Range;\n\nvar SearchHighlight = function(regExp, clazz, type) {\n    this.setRegexp(regExp);\n    this.clazz = clazz;\n    this.type = type || \"text\";\n};\n\n(function() {\n    this.MAX_RANGES = 500;\n    \n    this.setRegexp = function(regExp) {\n        if (this.regExp+\"\" == regExp+\"\")\n            return;\n        this.regExp = regExp;\n        this.cache = [];\n    };\n\n    this.update = function(html, markerLayer, session, config) {\n        if (!this.regExp)\n            return;\n        var start = config.firstRow, end = config.lastRow;\n\n        for (var i = start; i <= end; i++) {\n            var ranges = this.cache[i];\n            if (ranges == null) {\n                ranges = lang.getMatchOffsets(session.getLine(i), this.regExp);\n                if (ranges.length > this.MAX_RANGES)\n                    ranges = ranges.slice(0, this.MAX_RANGES);\n                ranges = ranges.map(function(match) {\n                    return new Range(i, match.offset, i, match.offset + match.length);\n                });\n                this.cache[i] = ranges.length ? ranges : \"\";\n            }\n\n            for (var j = ranges.length; j --; ) {\n                markerLayer.drawSingleLineMarker(\n                    html, ranges[j].toScreenRange(session), this.clazz, config);\n            }\n        }\n    };\n\n}).call(SearchHighlight.prototype);\n\nexports.SearchHighlight = SearchHighlight;\n});\n\nace.define(\"ace/edit_session/fold_line\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\nfunction FoldLine(foldData, folds) {\n    this.foldData = foldData;\n    if (Array.isArray(folds)) {\n        this.folds = folds;\n    } else {\n        folds = this.folds = [ folds ];\n    }\n\n    var last = folds[folds.length - 1];\n    this.range = new Range(folds[0].start.row, folds[0].start.column,\n                           last.end.row, last.end.column);\n    this.start = this.range.start;\n    this.end   = this.range.end;\n\n    this.folds.forEach(function(fold) {\n        fold.setFoldLine(this);\n    }, this);\n}\n\n(function() {\n    this.shiftRow = function(shift) {\n        this.start.row += shift;\n        this.end.row += shift;\n        this.folds.forEach(function(fold) {\n            fold.start.row += shift;\n            fold.end.row += shift;\n        });\n    };\n\n    this.addFold = function(fold) {\n        if (fold.sameRow) {\n            if (fold.start.row < this.startRow || fold.endRow > this.endRow) {\n                throw new Error(\"Can't add a fold to this FoldLine as it has no connection\");\n            }\n            this.folds.push(fold);\n            this.folds.sort(function(a, b) {\n                return -a.range.compareEnd(b.start.row, b.start.column);\n            });\n            if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) {\n                this.end.row = fold.end.row;\n                this.end.column =  fold.end.column;\n            } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) {\n                this.start.row = fold.start.row;\n                this.start.column = fold.start.column;\n            }\n        } else if (fold.start.row == this.end.row) {\n            this.folds.push(fold);\n            this.end.row = fold.end.row;\n            this.end.column = fold.end.column;\n        } else if (fold.end.row == this.start.row) {\n            this.folds.unshift(fold);\n            this.start.row = fold.start.row;\n            this.start.column = fold.start.column;\n        } else {\n            throw new Error(\"Trying to add fold to FoldRow that doesn't have a matching row\");\n        }\n        fold.foldLine = this;\n    };\n\n    this.containsRow = function(row) {\n        return row >= this.start.row && row <= this.end.row;\n    };\n\n    this.walk = function(callback, endRow, endColumn) {\n        var lastEnd = 0,\n            folds = this.folds,\n            fold,\n            cmp, stop, isNewRow = true;\n\n        if (endRow == null) {\n            endRow = this.end.row;\n            endColumn = this.end.column;\n        }\n\n        for (var i = 0; i < folds.length; i++) {\n            fold = folds[i];\n\n            cmp = fold.range.compareStart(endRow, endColumn);\n            if (cmp == -1) {\n                callback(null, endRow, endColumn, lastEnd, isNewRow);\n                return;\n            }\n\n            stop = callback(null, fold.start.row, fold.start.column, lastEnd, isNewRow);\n            stop = !stop && callback(fold.placeholder, fold.start.row, fold.start.column, lastEnd);\n            if (stop || cmp === 0) {\n                return;\n            }\n            isNewRow = !fold.sameRow;\n            lastEnd = fold.end.column;\n        }\n        callback(null, endRow, endColumn, lastEnd, isNewRow);\n    };\n\n    this.getNextFoldTo = function(row, column) {\n        var fold, cmp;\n        for (var i = 0; i < this.folds.length; i++) {\n            fold = this.folds[i];\n            cmp = fold.range.compareEnd(row, column);\n            if (cmp == -1) {\n                return {\n                    fold: fold,\n                    kind: \"after\"\n                };\n            } else if (cmp === 0) {\n                return {\n                    fold: fold,\n                    kind: \"inside\"\n                };\n            }\n        }\n        return null;\n    };\n\n    this.addRemoveChars = function(row, column, len) {\n        var ret = this.getNextFoldTo(row, column),\n            fold, folds;\n        if (ret) {\n            fold = ret.fold;\n            if (ret.kind == \"inside\"\n                && fold.start.column != column\n                && fold.start.row != row)\n            {\n                window.console && window.console.log(row, column, fold);\n            } else if (fold.start.row == row) {\n                folds = this.folds;\n                var i = folds.indexOf(fold);\n                if (i === 0) {\n                    this.start.column += len;\n                }\n                for (i; i < folds.length; i++) {\n                    fold = folds[i];\n                    fold.start.column += len;\n                    if (!fold.sameRow) {\n                        return;\n                    }\n                    fold.end.column += len;\n                }\n                this.end.column += len;\n            }\n        }\n    };\n\n    this.split = function(row, column) {\n        var pos = this.getNextFoldTo(row, column);\n        \n        if (!pos || pos.kind == \"inside\")\n            return null;\n            \n        var fold = pos.fold;\n        var folds = this.folds;\n        var foldData = this.foldData;\n        \n        var i = folds.indexOf(fold);\n        var foldBefore = folds[i - 1];\n        this.end.row = foldBefore.end.row;\n        this.end.column = foldBefore.end.column;\n        folds = folds.splice(i, folds.length - i);\n\n        var newFoldLine = new FoldLine(foldData, folds);\n        foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine);\n        return newFoldLine;\n    };\n\n    this.merge = function(foldLineNext) {\n        var folds = foldLineNext.folds;\n        for (var i = 0; i < folds.length; i++) {\n            this.addFold(folds[i]);\n        }\n        var foldData = this.foldData;\n        foldData.splice(foldData.indexOf(foldLineNext), 1);\n    };\n\n    this.toString = function() {\n        var ret = [this.range.toString() + \": [\" ];\n\n        this.folds.forEach(function(fold) {\n            ret.push(\"  \" + fold.toString());\n        });\n        ret.push(\"]\");\n        return ret.join(\"\\n\");\n    };\n\n    this.idxToPosition = function(idx) {\n        var lastFoldEndColumn = 0;\n\n        for (var i = 0; i < this.folds.length; i++) {\n            var fold = this.folds[i];\n\n            idx -= fold.start.column - lastFoldEndColumn;\n            if (idx < 0) {\n                return {\n                    row: fold.start.row,\n                    column: fold.start.column + idx\n                };\n            }\n\n            idx -= fold.placeholder.length;\n            if (idx < 0) {\n                return fold.start;\n            }\n\n            lastFoldEndColumn = fold.end.column;\n        }\n\n        return {\n            row: this.end.row,\n            column: this.end.column + idx\n        };\n    };\n}).call(FoldLine.prototype);\n\nexports.FoldLine = FoldLine;\n});\n\nace.define(\"ace/range_list\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\nvar Range = require(\"./range\").Range;\nvar comparePoints = Range.comparePoints;\n\nvar RangeList = function() {\n    this.ranges = [];\n};\n\n(function() {\n    this.comparePoints = comparePoints;\n\n    this.pointIndex = function(pos, excludeEdges, startIndex) {\n        var list = this.ranges;\n\n        for (var i = startIndex || 0; i < list.length; i++) {\n            var range = list[i];\n            var cmpEnd = comparePoints(pos, range.end);\n            if (cmpEnd > 0)\n                continue;\n            var cmpStart = comparePoints(pos, range.start);\n            if (cmpEnd === 0)\n                return excludeEdges && cmpStart !== 0 ? -i-2 : i;\n            if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges))\n                return i;\n\n            return -i-1;\n        }\n        return -i - 1;\n    };\n\n    this.add = function(range) {\n        var excludeEdges = !range.isEmpty();\n        var startIndex = this.pointIndex(range.start, excludeEdges);\n        if (startIndex < 0)\n            startIndex = -startIndex - 1;\n\n        var endIndex = this.pointIndex(range.end, excludeEdges, startIndex);\n\n        if (endIndex < 0)\n            endIndex = -endIndex - 1;\n        else\n            endIndex++;\n        return this.ranges.splice(startIndex, endIndex - startIndex, range);\n    };\n\n    this.addList = function(list) {\n        var removed = [];\n        for (var i = list.length; i--; ) {\n            removed.push.call(removed, this.add(list[i]));\n        }\n        return removed;\n    };\n\n    this.substractPoint = function(pos) {\n        var i = this.pointIndex(pos);\n\n        if (i >= 0)\n            return this.ranges.splice(i, 1);\n    };\n    this.merge = function() {\n        var removed = [];\n        var list = this.ranges;\n        \n        list = list.sort(function(a, b) {\n            return comparePoints(a.start, b.start);\n        });\n        \n        var next = list[0], range;\n        for (var i = 1; i < list.length; i++) {\n            range = next;\n            next = list[i];\n            var cmp = comparePoints(range.end, next.start);\n            if (cmp < 0)\n                continue;\n\n            if (cmp == 0 && !range.isEmpty() && !next.isEmpty())\n                continue;\n\n            if (comparePoints(range.end, next.end) < 0) {\n                range.end.row = next.end.row;\n                range.end.column = next.end.column;\n            }\n\n            list.splice(i, 1);\n            removed.push(next);\n            next = range;\n            i--;\n        }\n        \n        this.ranges = list;\n\n        return removed;\n    };\n\n    this.contains = function(row, column) {\n        return this.pointIndex({row: row, column: column}) >= 0;\n    };\n\n    this.containsPoint = function(pos) {\n        return this.pointIndex(pos) >= 0;\n    };\n\n    this.rangeAtPoint = function(pos) {\n        var i = this.pointIndex(pos);\n        if (i >= 0)\n            return this.ranges[i];\n    };\n\n\n    this.clipRows = function(startRow, endRow) {\n        var list = this.ranges;\n        if (list[0].start.row > endRow || list[list.length - 1].start.row < startRow)\n            return [];\n\n        var startIndex = this.pointIndex({row: startRow, column: 0});\n        if (startIndex < 0)\n            startIndex = -startIndex - 1;\n        var endIndex = this.pointIndex({row: endRow, column: 0}, startIndex);\n        if (endIndex < 0)\n            endIndex = -endIndex - 1;\n\n        var clipped = [];\n        for (var i = startIndex; i < endIndex; i++) {\n            clipped.push(list[i]);\n        }\n        return clipped;\n    };\n\n    this.removeAll = function() {\n        return this.ranges.splice(0, this.ranges.length);\n    };\n\n    this.attach = function(session) {\n        if (this.session)\n            this.detach();\n\n        this.session = session;\n        this.onChange = this.$onChange.bind(this);\n\n        this.session.on('change', this.onChange);\n    };\n\n    this.detach = function() {\n        if (!this.session)\n            return;\n        this.session.removeListener('change', this.onChange);\n        this.session = null;\n    };\n\n    this.$onChange = function(e) {\n        var changeRange = e.data.range;\n        if (e.data.action[0] == \"i\"){\n            var start = changeRange.start;\n            var end = changeRange.end;\n        } else {\n            var end = changeRange.start;\n            var start = changeRange.end;\n        }\n        var startRow = start.row;\n        var endRow = end.row;\n        var lineDif = endRow - startRow;\n\n        var colDiff = -start.column + end.column;\n        var ranges = this.ranges;\n\n        for (var i = 0, n = ranges.length; i < n; i++) {\n            var r = ranges[i];\n            if (r.end.row < startRow)\n                continue;\n            if (r.start.row > startRow)\n                break;\n\n            if (r.start.row == startRow && r.start.column >= start.column ) {\n                if (r.start.column == start.column && this.$insertRight) {\n                } else {\n                    r.start.column += colDiff;\n                    r.start.row += lineDif;\n                }\n            }\n            if (r.end.row == startRow && r.end.column >= start.column) {\n                if (r.end.column == start.column && this.$insertRight) {\n                    continue;\n                }\n                if (r.end.column == start.column && colDiff > 0 && i < n - 1) {                \n                    if (r.end.column > r.start.column && r.end.column == ranges[i+1].start.column)\n                        r.end.column -= colDiff;\n                }\n                r.end.column += colDiff;\n                r.end.row += lineDif;\n            }\n        }\n\n        if (lineDif != 0 && i < n) {\n            for (; i < n; i++) {\n                var r = ranges[i];\n                r.start.row += lineDif;\n                r.end.row += lineDif;\n            }\n        }\n    };\n\n}).call(RangeList.prototype);\n\nexports.RangeList = RangeList;\n});\n\nace.define(\"ace/edit_session/fold\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/range_list\",\"ace/lib/oop\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\nvar RangeList = require(\"../range_list\").RangeList;\nvar oop = require(\"../lib/oop\")\nvar Fold = exports.Fold = function(range, placeholder) {\n    this.foldLine = null;\n    this.placeholder = placeholder;\n    this.range = range;\n    this.start = range.start;\n    this.end = range.end;\n\n    this.sameRow = range.start.row == range.end.row;\n    this.subFolds = this.ranges = [];\n};\n\noop.inherits(Fold, RangeList);\n\n(function() {\n\n    this.toString = function() {\n        return '\"' + this.placeholder + '\" ' + this.range.toString();\n    };\n\n    this.setFoldLine = function(foldLine) {\n        this.foldLine = foldLine;\n        this.subFolds.forEach(function(fold) {\n            fold.setFoldLine(foldLine);\n        });\n    };\n\n    this.clone = function() {\n        var range = this.range.clone();\n        var fold = new Fold(range, this.placeholder);\n        this.subFolds.forEach(function(subFold) {\n            fold.subFolds.push(subFold.clone());\n        });\n        fold.collapseChildren = this.collapseChildren;\n        return fold;\n    };\n\n    this.addSubFold = function(fold) {\n        if (this.range.isEqual(fold))\n            return;\n\n        if (!this.range.containsRange(fold))\n            throw new Error(\"A fold can't intersect already existing fold\" + fold.range + this.range);\n        consumeRange(fold, this.start);\n\n        var row = fold.start.row, column = fold.start.column;\n        for (var i = 0, cmp = -1; i < this.subFolds.length; i++) {\n            cmp = this.subFolds[i].range.compare(row, column);\n            if (cmp != 1)\n                break;\n        }\n        var afterStart = this.subFolds[i];\n\n        if (cmp == 0)\n            return afterStart.addSubFold(fold);\n        var row = fold.range.end.row, column = fold.range.end.column;\n        for (var j = i, cmp = -1; j < this.subFolds.length; j++) {\n            cmp = this.subFolds[j].range.compare(row, column);\n            if (cmp != 1)\n                break;\n        }\n        var afterEnd = this.subFolds[j];\n\n        if (cmp == 0)\n            throw new Error(\"A fold can't intersect already existing fold\" + fold.range + this.range);\n\n        var consumedFolds = this.subFolds.splice(i, j - i, fold);\n        fold.setFoldLine(this.foldLine);\n\n        return fold;\n    };\n    \n    this.restoreRange = function(range) {\n        return restoreRange(range, this.start);\n    };\n\n}).call(Fold.prototype);\n\nfunction consumePoint(point, anchor) {\n    point.row -= anchor.row;\n    if (point.row == 0)\n        point.column -= anchor.column;\n}\nfunction consumeRange(range, anchor) {\n    consumePoint(range.start, anchor);\n    consumePoint(range.end, anchor);\n}\nfunction restorePoint(point, anchor) {\n    if (point.row == 0)\n        point.column += anchor.column;\n    point.row += anchor.row;\n}\nfunction restoreRange(range, anchor) {\n    restorePoint(range.start, anchor);\n    restorePoint(range.end, anchor);\n}\n\n});\n\nace.define(\"ace/edit_session/folding\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/edit_session/fold_line\",\"ace/edit_session/fold\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\nvar FoldLine = require(\"./fold_line\").FoldLine;\nvar Fold = require(\"./fold\").Fold;\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\n\nfunction Folding() {\n    this.getFoldAt = function(row, column, side) {\n        var foldLine = this.getFoldLine(row);\n        if (!foldLine)\n            return null;\n\n        var folds = foldLine.folds;\n        for (var i = 0; i < folds.length; i++) {\n            var fold = folds[i];\n            if (fold.range.contains(row, column)) {\n                if (side == 1 && fold.range.isEnd(row, column)) {\n                    continue;\n                } else if (side == -1 && fold.range.isStart(row, column)) {\n                    continue;\n                }\n                return fold;\n            }\n        }\n    };\n    this.getFoldsInRange = function(range) {\n        var start = range.start;\n        var end = range.end;\n        var foldLines = this.$foldData;\n        var foundFolds = [];\n\n        start.column += 1;\n        end.column -= 1;\n\n        for (var i = 0; i < foldLines.length; i++) {\n            var cmp = foldLines[i].range.compareRange(range);\n            if (cmp == 2) {\n                continue;\n            }\n            else if (cmp == -2) {\n                break;\n            }\n\n            var folds = foldLines[i].folds;\n            for (var j = 0; j < folds.length; j++) {\n                var fold = folds[j];\n                cmp = fold.range.compareRange(range);\n                if (cmp == -2) {\n                    break;\n                } else if (cmp == 2) {\n                    continue;\n                } else\n                if (cmp == 42) {\n                    break;\n                }\n                foundFolds.push(fold);\n            }\n        }\n        start.column -= 1;\n        end.column += 1;\n\n        return foundFolds;\n    };\n\n    this.getFoldsInRangeList = function(ranges) {\n        if (Array.isArray(ranges)) {\n            var folds = [];\n            ranges.forEach(function(range) {\n                folds = folds.concat(this.getFoldsInRange(range));\n            }, this);\n        } else {\n            var folds = this.getFoldsInRange(ranges);\n        }\n        return folds;\n    }\n    this.getAllFolds = function() {\n        var folds = [];\n        var foldLines = this.$foldData;\n        \n        for (var i = 0; i < foldLines.length; i++)\n            for (var j = 0; j < foldLines[i].folds.length; j++)\n                folds.push(foldLines[i].folds[j]);\n\n        return folds;\n    };\n    this.getFoldStringAt = function(row, column, trim, foldLine) {\n        foldLine = foldLine || this.getFoldLine(row);\n        if (!foldLine)\n            return null;\n\n        var lastFold = {\n            end: { column: 0 }\n        };\n        var str, fold;\n        for (var i = 0; i < foldLine.folds.length; i++) {\n            fold = foldLine.folds[i];\n            var cmp = fold.range.compareEnd(row, column);\n            if (cmp == -1) {\n                str = this\n                    .getLine(fold.start.row)\n                    .substring(lastFold.end.column, fold.start.column);\n                break;\n            }\n            else if (cmp === 0) {\n                return null;\n            }\n            lastFold = fold;\n        }\n        if (!str)\n            str = this.getLine(fold.start.row).substring(lastFold.end.column);\n\n        if (trim == -1)\n            return str.substring(0, column - lastFold.end.column);\n        else if (trim == 1)\n            return str.substring(column - lastFold.end.column);\n        else\n            return str;\n    };\n\n    this.getFoldLine = function(docRow, startFoldLine) {\n        var foldData = this.$foldData;\n        var i = 0;\n        if (startFoldLine)\n            i = foldData.indexOf(startFoldLine);\n        if (i == -1)\n            i = 0;\n        for (i; i < foldData.length; i++) {\n            var foldLine = foldData[i];\n            if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) {\n                return foldLine;\n            } else if (foldLine.end.row > docRow) {\n                return null;\n            }\n        }\n        return null;\n    };\n    this.getNextFoldLine = function(docRow, startFoldLine) {\n        var foldData = this.$foldData;\n        var i = 0;\n        if (startFoldLine)\n            i = foldData.indexOf(startFoldLine);\n        if (i == -1)\n            i = 0;\n        for (i; i < foldData.length; i++) {\n            var foldLine = foldData[i];\n            if (foldLine.end.row >= docRow) {\n                return foldLine;\n            }\n        }\n        return null;\n    };\n\n    this.getFoldedRowCount = function(first, last) {\n        var foldData = this.$foldData, rowCount = last-first+1;\n        for (var i = 0; i < foldData.length; i++) {\n            var foldLine = foldData[i],\n                end = foldLine.end.row,\n                start = foldLine.start.row;\n            if (end >= last) {\n                if(start < last) {\n                    if(start >= first)\n                        rowCount -= last-start;\n                    else\n                        rowCount = 0;//in one fold\n                }\n                break;\n            } else if(end >= first){\n                if (start >= first) //fold inside range\n                    rowCount -=  end-start;\n                else\n                    rowCount -=  end-first+1;\n            }\n        }\n        return rowCount;\n    };\n\n    this.$addFoldLine = function(foldLine) {\n        this.$foldData.push(foldLine);\n        this.$foldData.sort(function(a, b) {\n            return a.start.row - b.start.row;\n        });\n        return foldLine;\n    };\n    this.addFold = function(placeholder, range) {\n        var foldData = this.$foldData;\n        var added = false;\n        var fold;\n        \n        if (placeholder instanceof Fold)\n            fold = placeholder;\n        else {\n            fold = new Fold(range, placeholder);\n            fold.collapseChildren = range.collapseChildren;\n        }\n        this.$clipRangeToDocument(fold.range);\n\n        var startRow = fold.start.row;\n        var startColumn = fold.start.column;\n        var endRow = fold.end.row;\n        var endColumn = fold.end.column;\n        if (!(startRow < endRow || \n            startRow == endRow && startColumn <= endColumn - 2))\n            throw new Error(\"The range has to be at least 2 characters width\");\n\n        var startFold = this.getFoldAt(startRow, startColumn, 1);\n        var endFold = this.getFoldAt(endRow, endColumn, -1);\n        if (startFold && endFold == startFold)\n            return startFold.addSubFold(fold);\n\n        if (startFold && !startFold.range.isStart(startRow, startColumn))\n            this.removeFold(startFold);\n        \n        if (endFold && !endFold.range.isEnd(endRow, endColumn))\n            this.removeFold(endFold);\n        var folds = this.getFoldsInRange(fold.range);\n        if (folds.length > 0) {\n            this.removeFolds(folds);\n            folds.forEach(function(subFold) {\n                fold.addSubFold(subFold);\n            });\n        }\n\n        for (var i = 0; i < foldData.length; i++) {\n            var foldLine = foldData[i];\n            if (endRow == foldLine.start.row) {\n                foldLine.addFold(fold);\n                added = true;\n                break;\n            } else if (startRow == foldLine.end.row) {\n                foldLine.addFold(fold);\n                added = true;\n                if (!fold.sameRow) {\n                    var foldLineNext = foldData[i + 1];\n                    if (foldLineNext && foldLineNext.start.row == endRow) {\n                        foldLine.merge(foldLineNext);\n                        break;\n                    }\n                }\n                break;\n            } else if (endRow <= foldLine.start.row) {\n                break;\n            }\n        }\n\n        if (!added)\n            foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold));\n\n        if (this.$useWrapMode)\n            this.$updateWrapData(foldLine.start.row, foldLine.start.row);\n        else\n            this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row);\n        this.$modified = true;\n        this._emit(\"changeFold\", { data: fold, action: \"add\" });\n\n        return fold;\n    };\n\n    this.addFolds = function(folds) {\n        folds.forEach(function(fold) {\n            this.addFold(fold);\n        }, this);\n    };\n\n    this.removeFold = function(fold) {\n        var foldLine = fold.foldLine;\n        var startRow = foldLine.start.row;\n        var endRow = foldLine.end.row;\n\n        var foldLines = this.$foldData;\n        var folds = foldLine.folds;\n        if (folds.length == 1) {\n            foldLines.splice(foldLines.indexOf(foldLine), 1);\n        } else\n        if (foldLine.range.isEnd(fold.end.row, fold.end.column)) {\n            folds.pop();\n            foldLine.end.row = folds[folds.length - 1].end.row;\n            foldLine.end.column = folds[folds.length - 1].end.column;\n        } else\n        if (foldLine.range.isStart(fold.start.row, fold.start.column)) {\n            folds.shift();\n            foldLine.start.row = folds[0].start.row;\n            foldLine.start.column = folds[0].start.column;\n        } else\n        if (fold.sameRow) {\n            folds.splice(folds.indexOf(fold), 1);\n        } else\n        {\n            var newFoldLine = foldLine.split(fold.start.row, fold.start.column);\n            folds = newFoldLine.folds;\n            folds.shift();\n            newFoldLine.start.row = folds[0].start.row;\n            newFoldLine.start.column = folds[0].start.column;\n        }\n\n        if (!this.$updating) {\n            if (this.$useWrapMode)\n                this.$updateWrapData(startRow, endRow);\n            else\n                this.$updateRowLengthCache(startRow, endRow);\n        }\n        this.$modified = true;\n        this._emit(\"changeFold\", { data: fold, action: \"remove\" });\n    };\n\n    this.removeFolds = function(folds) {\n        var cloneFolds = [];\n        for (var i = 0; i < folds.length; i++) {\n            cloneFolds.push(folds[i]);\n        }\n\n        cloneFolds.forEach(function(fold) {\n            this.removeFold(fold);\n        }, this);\n        this.$modified = true;\n    };\n\n    this.expandFold = function(fold) {\n        this.removeFold(fold);\n        fold.subFolds.forEach(function(subFold) {\n            fold.restoreRange(subFold);\n            this.addFold(subFold);\n        }, this);\n        if (fold.collapseChildren > 0) {\n            this.foldAll(fold.start.row+1, fold.end.row, fold.collapseChildren-1);\n        }\n        fold.subFolds = [];\n    };\n\n    this.expandFolds = function(folds) {\n        folds.forEach(function(fold) {\n            this.expandFold(fold);\n        }, this);\n    };\n\n    this.unfold = function(location, expandInner) {\n        var range, folds;\n        if (location == null) {\n            range = new Range(0, 0, this.getLength(), 0);\n            expandInner = true;\n        } else if (typeof location == \"number\")\n            range = new Range(location, 0, location, this.getLine(location).length);\n        else if (\"row\" in location)\n            range = Range.fromPoints(location, location);\n        else\n            range = location;\n        \n        folds = this.getFoldsInRangeList(range);\n        if (expandInner) {\n            this.removeFolds(folds);\n        } else {\n            var subFolds = folds;\n            while (subFolds.length) {\n                this.expandFolds(subFolds);\n                subFolds = this.getFoldsInRangeList(range);\n            }\n        }\n        if (folds.length)\n            return folds;\n    };\n    this.isRowFolded = function(docRow, startFoldRow) {\n        return !!this.getFoldLine(docRow, startFoldRow);\n    };\n\n    this.getRowFoldEnd = function(docRow, startFoldRow) {\n        var foldLine = this.getFoldLine(docRow, startFoldRow);\n        return foldLine ? foldLine.end.row : docRow;\n    };\n\n    this.getRowFoldStart = function(docRow, startFoldRow) {\n        var foldLine = this.getFoldLine(docRow, startFoldRow);\n        return foldLine ? foldLine.start.row : docRow;\n    };\n\n    this.getFoldDisplayLine = function(foldLine, endRow, endColumn, startRow, startColumn) {\n        if (startRow == null)\n            startRow = foldLine.start.row;\n        if (startColumn == null)\n            startColumn = 0;\n        if (endRow == null)\n            endRow = foldLine.end.row;\n        if (endColumn == null)\n            endColumn = this.getLine(endRow).length;\n        var doc = this.doc;\n        var textLine = \"\";\n\n        foldLine.walk(function(placeholder, row, column, lastColumn) {\n            if (row < startRow)\n                return;\n            if (row == startRow) {\n                if (column < startColumn)\n                    return;\n                lastColumn = Math.max(startColumn, lastColumn);\n            }\n\n            if (placeholder != null) {\n                textLine += placeholder;\n            } else {\n                textLine += doc.getLine(row).substring(lastColumn, column);\n            }\n        }, endRow, endColumn);\n        return textLine;\n    };\n\n    this.getDisplayLine = function(row, endColumn, startRow, startColumn) {\n        var foldLine = this.getFoldLine(row);\n\n        if (!foldLine) {\n            var line;\n            line = this.doc.getLine(row);\n            return line.substring(startColumn || 0, endColumn || line.length);\n        } else {\n            return this.getFoldDisplayLine(\n                foldLine, row, endColumn, startRow, startColumn);\n        }\n    };\n\n    this.$cloneFoldData = function() {\n        var fd = [];\n        fd = this.$foldData.map(function(foldLine) {\n            var folds = foldLine.folds.map(function(fold) {\n                return fold.clone();\n            });\n            return new FoldLine(fd, folds);\n        });\n\n        return fd;\n    };\n\n    this.toggleFold = function(tryToUnfold) {\n        var selection = this.selection;\n        var range = selection.getRange();\n        var fold;\n        var bracketPos;\n\n        if (range.isEmpty()) {\n            var cursor = range.start;\n            fold = this.getFoldAt(cursor.row, cursor.column);\n\n            if (fold) {\n                this.expandFold(fold);\n                return;\n            } else if (bracketPos = this.findMatchingBracket(cursor)) {\n                if (range.comparePoint(bracketPos) == 1) {\n                    range.end = bracketPos;\n                } else {\n                    range.start = bracketPos;\n                    range.start.column++;\n                    range.end.column--;\n                }\n            } else if (bracketPos = this.findMatchingBracket({row: cursor.row, column: cursor.column + 1})) {\n                if (range.comparePoint(bracketPos) == 1)\n                    range.end = bracketPos;\n                else\n                    range.start = bracketPos;\n\n                range.start.column++;\n            } else {\n                range = this.getCommentFoldRange(cursor.row, cursor.column) || range;\n            }\n        } else {\n            var folds = this.getFoldsInRange(range);\n            if (tryToUnfold && folds.length) {\n                this.expandFolds(folds);\n                return;\n            } else if (folds.length == 1 ) {\n                fold = folds[0];\n            }\n        }\n\n        if (!fold)\n            fold = this.getFoldAt(range.start.row, range.start.column);\n\n        if (fold && fold.range.toString() == range.toString()) {\n            this.expandFold(fold);\n            return;\n        }\n\n        var placeholder = \"...\";\n        if (!range.isMultiLine()) {\n            placeholder = this.getTextRange(range);\n            if(placeholder.length < 4)\n                return;\n            placeholder = placeholder.trim().substring(0, 2) + \"..\";\n        }\n\n        this.addFold(placeholder, range);\n    };\n\n    this.getCommentFoldRange = function(row, column, dir) {\n        var iterator = new TokenIterator(this, row, column);\n        var token = iterator.getCurrentToken();\n        if (token && /^comment|string/.test(token.type)) {\n            var range = new Range();\n            var re = new RegExp(token.type.replace(/\\..*/, \"\\\\.\"));\n            if (dir != 1) {\n                do {\n                    token = iterator.stepBackward();\n                } while(token && re.test(token.type));\n                iterator.stepForward();\n            }\n            \n            range.start.row = iterator.getCurrentTokenRow();\n            range.start.column = iterator.getCurrentTokenColumn() + 2;\n\n            iterator = new TokenIterator(this, row, column);\n            \n            if (dir != -1) {\n                do {\n                    token = iterator.stepForward();\n                } while(token && re.test(token.type));\n                token = iterator.stepBackward();\n            } else\n                token = iterator.getCurrentToken();\n\n            range.end.row = iterator.getCurrentTokenRow();\n            range.end.column = iterator.getCurrentTokenColumn() + token.value.length - 2;\n            return range;\n        }\n    };\n\n    this.foldAll = function(startRow, endRow, depth) {\n        if (depth == undefined)\n            depth = 100000; // JSON.stringify doesn't hanle Infinity\n        var foldWidgets = this.foldWidgets;\n        if (!foldWidgets)\n            return; // mode doesn't support folding\n        endRow = endRow || this.getLength();\n        startRow = startRow || 0;\n        for (var row = startRow; row < endRow; row++) {\n            if (foldWidgets[row] == null)\n                foldWidgets[row] = this.getFoldWidget(row);\n            if (foldWidgets[row] != \"start\")\n                continue;\n\n            var range = this.getFoldWidgetRange(row);\n            if (range && range.isMultiLine()\n                && range.end.row <= endRow\n                && range.start.row >= startRow\n            ) {\n                row = range.end.row;\n                try {\n                    var fold = this.addFold(\"...\", range);\n                    if (fold)\n                        fold.collapseChildren = depth;\n                } catch(e) {}\n            }\n        }\n    };\n    this.$foldStyles = {\n        \"manual\": 1,\n        \"markbegin\": 1,\n        \"markbeginend\": 1\n    };\n    this.$foldStyle = \"markbegin\";\n    this.setFoldStyle = function(style) {\n        if (!this.$foldStyles[style])\n            throw new Error(\"invalid fold style: \" + style + \"[\" + Object.keys(this.$foldStyles).join(\", \") + \"]\");\n        \n        if (this.$foldStyle == style)\n            return;\n\n        this.$foldStyle = style;\n        \n        if (style == \"manual\")\n            this.unfold();\n        var mode = this.$foldMode;\n        this.$setFolding(null);\n        this.$setFolding(mode);\n    };\n\n    this.$setFolding = function(foldMode) {\n        if (this.$foldMode == foldMode)\n            return;\n            \n        this.$foldMode = foldMode;\n        \n        this.off('change', this.$updateFoldWidgets);\n        this.off('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);\n        this._emit(\"changeAnnotation\");\n        \n        if (!foldMode || this.$foldStyle == \"manual\") {\n            this.foldWidgets = null;\n            return;\n        }\n        \n        this.foldWidgets = [];\n        this.getFoldWidget = foldMode.getFoldWidget.bind(foldMode, this, this.$foldStyle);\n        this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(foldMode, this, this.$foldStyle);\n        \n        this.$updateFoldWidgets = this.updateFoldWidgets.bind(this);\n        this.$tokenizerUpdateFoldWidgets = this.tokenizerUpdateFoldWidgets.bind(this);\n        this.on('change', this.$updateFoldWidgets);\n        this.on('tokenizerUpdate', this.$tokenizerUpdateFoldWidgets);\n    };\n\n    this.getParentFoldRangeData = function (row, ignoreCurrent) {\n        var fw = this.foldWidgets;\n        if (!fw || (ignoreCurrent && fw[row]))\n            return {};\n\n        var i = row - 1, firstRange;\n        while (i >= 0) {\n            var c = fw[i];\n            if (c == null)\n                c = fw[i] = this.getFoldWidget(i);\n\n            if (c == \"start\") {\n                var range = this.getFoldWidgetRange(i);\n                if (!firstRange)\n                    firstRange = range;\n                if (range && range.end.row >= row)\n                    break;\n            }\n            i--;\n        }\n\n        return {\n            range: i !== -1 && range,\n            firstRange: firstRange\n        };\n    }\n\n    this.onFoldWidgetClick = function(row, e) {\n        e = e.domEvent;\n        var options = {\n            children: e.shiftKey,\n            all: e.ctrlKey || e.metaKey,\n            siblings: e.altKey\n        };\n        \n        var range = this.$toggleFoldWidget(row, options);\n        if (!range) {\n            var el = (e.target || e.srcElement)\n            if (el && /ace_fold-widget/.test(el.className))\n                el.className += \" ace_invalid\";\n        }\n    };\n    \n    this.$toggleFoldWidget = function(row, options) {\n        if (!this.getFoldWidget)\n            return;\n        var type = this.getFoldWidget(row);\n        var line = this.getLine(row);\n\n        var dir = type === \"end\" ? -1 : 1;\n        var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir);\n\n        if (fold) {\n            if (options.children || options.all)\n                this.removeFold(fold);\n            else\n                this.expandFold(fold);\n            return;\n        }\n\n        var range = this.getFoldWidgetRange(row, true);\n        if (range && !range.isMultiLine()) {\n            fold = this.getFoldAt(range.start.row, range.start.column, 1);\n            if (fold && range.isEqual(fold.range)) {\n                this.removeFold(fold);\n                return;\n            }\n        }\n        \n        if (options.siblings) {\n            var data = this.getParentFoldRangeData(row);\n            if (data.range) {\n                var startRow = data.range.start.row + 1;\n                var endRow = data.range.end.row;\n            }\n            this.foldAll(startRow, endRow, options.all ? 10000 : 0);\n        } else if (options.children) {\n            endRow = range ? range.end.row : this.getLength();\n            this.foldAll(row + 1, range.end.row, options.all ? 10000 : 0);\n        } else if (range) {\n            if (options.all) \n                range.collapseChildren = 10000;\n            this.addFold(\"...\", range);\n        }\n        \n        return range;\n    };\n    \n    \n    \n    this.toggleFoldWidget = function(toggleParent) {\n        var row = this.selection.getCursor().row;\n        row = this.getRowFoldStart(row);\n        var range = this.$toggleFoldWidget(row, {});\n        \n        if (range)\n            return;\n        var data = this.getParentFoldRangeData(row, true);\n        range = data.range || data.firstRange;\n        \n        if (range) {\n            row = range.start.row;\n            var fold = this.getFoldAt(row, this.getLine(row).length, 1);\n\n            if (fold) {\n                this.removeFold(fold);\n            } else {\n                this.addFold(\"...\", range);\n            }\n        }\n    };\n\n    this.updateFoldWidgets = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n        var firstRow = range.start.row;\n        var len = range.end.row - firstRow;\n\n        if (len === 0) {\n            this.foldWidgets[firstRow] = null;\n        } else if (delta.action == \"removeText\" || delta.action == \"removeLines\") {\n            this.foldWidgets.splice(firstRow, len + 1, null);\n        } else {\n            var args = Array(len + 1);\n            args.unshift(firstRow, 1);\n            this.foldWidgets.splice.apply(this.foldWidgets, args);\n        }\n    };\n    this.tokenizerUpdateFoldWidgets = function(e) {\n        var rows = e.data;\n        if (rows.first != rows.last) {\n            if (this.foldWidgets.length > rows.first)\n                this.foldWidgets.splice(rows.first, this.foldWidgets.length);\n        }\n    }\n}\n\nexports.Folding = Folding;\n\n});\n\nace.define(\"ace/edit_session/bracket_match\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\nvar Range = require(\"../range\").Range;\n\n\nfunction BracketMatch() {\n\n    this.findMatchingBracket = function(position, chr) {\n        if (position.column == 0) return null;\n\n        var charBeforeCursor = chr || this.getLine(position.row).charAt(position.column-1);\n        if (charBeforeCursor == \"\") return null;\n\n        var match = charBeforeCursor.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n        if (!match)\n            return null;\n\n        if (match[1])\n            return this.$findClosingBracket(match[1], position);\n        else\n            return this.$findOpeningBracket(match[2], position);\n    };\n    \n    this.getBracketRange = function(pos) {\n        var line = this.getLine(pos.row);\n        var before = true, range;\n\n        var chr = line.charAt(pos.column-1);\n        var match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n        if (!match) {\n            chr = line.charAt(pos.column);\n            pos = {row: pos.row, column: pos.column + 1};\n            match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n            before = false;\n        }\n        if (!match)\n            return null;\n\n        if (match[1]) {\n            var bracketPos = this.$findClosingBracket(match[1], pos);\n            if (!bracketPos)\n                return null;\n            range = Range.fromPoints(pos, bracketPos);\n            if (!before) {\n                range.end.column++;\n                range.start.column--;\n            }\n            range.cursor = range.end;\n        } else {\n            var bracketPos = this.$findOpeningBracket(match[2], pos);\n            if (!bracketPos)\n                return null;\n            range = Range.fromPoints(bracketPos, pos);\n            if (!before) {\n                range.start.column++;\n                range.end.column--;\n            }\n            range.cursor = range.start;\n        }\n        \n        return range;\n    };\n\n    this.$brackets = {\n        \")\": \"(\",\n        \"(\": \")\",\n        \"]\": \"[\",\n        \"[\": \"]\",\n        \"{\": \"}\",\n        \"}\": \"{\"\n    };\n\n    this.$findOpeningBracket = function(bracket, position, typeRe) {\n        var openBracket = this.$brackets[bracket];\n        var depth = 1;\n\n        var iterator = new TokenIterator(this, position.row, position.column);\n        var token = iterator.getCurrentToken();\n        if (!token)\n            token = iterator.stepForward();\n        if (!token)\n            return;\n        \n         if (!typeRe){\n            typeRe = new RegExp(\n                \"(\\\\.?\" +\n                token.type.replace(\".\", \"\\\\.\").replace(\"rparen\", \".paren\")\n                    .replace(/\\b(?:end|start|begin)\\b/, \"\")\n                + \")+\"\n            );\n        }\n        var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2;\n        var value = token.value;\n        \n        while (true) {\n        \n            while (valueIndex >= 0) {\n                var chr = value.charAt(valueIndex);\n                if (chr == openBracket) {\n                    depth -= 1;\n                    if (depth == 0) {\n                        return {row: iterator.getCurrentTokenRow(),\n                            column: valueIndex + iterator.getCurrentTokenColumn()};\n                    }\n                }\n                else if (chr == bracket) {\n                    depth += 1;\n                }\n                valueIndex -= 1;\n            }\n            do {\n                token = iterator.stepBackward();\n            } while (token && !typeRe.test(token.type));\n\n            if (token == null)\n                break;\n                \n            value = token.value;\n            valueIndex = value.length - 1;\n        }\n        \n        return null;\n    };\n\n    this.$findClosingBracket = function(bracket, position, typeRe) {\n        var closingBracket = this.$brackets[bracket];\n        var depth = 1;\n\n        var iterator = new TokenIterator(this, position.row, position.column);\n        var token = iterator.getCurrentToken();\n        if (!token)\n            token = iterator.stepForward();\n        if (!token)\n            return;\n\n        if (!typeRe){\n            typeRe = new RegExp(\n                \"(\\\\.?\" +\n                token.type.replace(\".\", \"\\\\.\").replace(\"lparen\", \".paren\")\n                    .replace(/\\b(?:end|start|begin)\\b/, \"\")\n                + \")+\"\n            );\n        }\n        var valueIndex = position.column - iterator.getCurrentTokenColumn();\n\n        while (true) {\n\n            var value = token.value;\n            var valueLength = value.length;\n            while (valueIndex < valueLength) {\n                var chr = value.charAt(valueIndex);\n                if (chr == closingBracket) {\n                    depth -= 1;\n                    if (depth == 0) {\n                        return {row: iterator.getCurrentTokenRow(),\n                            column: valueIndex + iterator.getCurrentTokenColumn()};\n                    }\n                }\n                else if (chr == bracket) {\n                    depth += 1;\n                }\n                valueIndex += 1;\n            }\n            do {\n                token = iterator.stepForward();\n            } while (token && !typeRe.test(token.type));\n\n            if (token == null)\n                break;\n\n            valueIndex = 0;\n        }\n        \n        return null;\n    };\n}\nexports.BracketMatch = BracketMatch;\n\n});\n\nace.define(\"ace/edit_session\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/config\",\"ace/lib/event_emitter\",\"ace/selection\",\"ace/mode/text\",\"ace/range\",\"ace/document\",\"ace/background_tokenizer\",\"ace/search_highlight\",\"ace/edit_session/folding\",\"ace/edit_session/bracket_match\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar lang = require(\"./lib/lang\");\nvar config = require(\"./config\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Selection = require(\"./selection\").Selection;\nvar TextMode = require(\"./mode/text\").Mode;\nvar Range = require(\"./range\").Range;\nvar Document = require(\"./document\").Document;\nvar BackgroundTokenizer = require(\"./background_tokenizer\").BackgroundTokenizer;\nvar SearchHighlight = require(\"./search_highlight\").SearchHighlight;\n\nvar EditSession = function(text, mode) {\n    this.$breakpoints = [];\n    this.$decorations = [];\n    this.$frontMarkers = {};\n    this.$backMarkers = {};\n    this.$markerId = 1;\n    this.$undoSelect = true;\n\n    this.$foldData = [];\n    this.$foldData.toString = function() {\n        return this.join(\"\\n\");\n    }\n    this.on(\"changeFold\", this.onChangeFold.bind(this));\n    this.$onChange = this.onChange.bind(this);\n\n    if (typeof text != \"object\" || !text.getLine)\n        text = new Document(text);\n\n    this.setDocument(text);\n    this.selection = new Selection(this);\n\n    config.resetOptions(this);\n    this.setMode(mode);\n    config._signal(\"session\", this);\n};\n\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setDocument = function(doc) {\n        if (this.doc)\n            this.doc.removeListener(\"change\", this.$onChange);\n\n        this.doc = doc;\n        doc.on(\"change\", this.$onChange);\n\n        if (this.bgTokenizer)\n            this.bgTokenizer.setDocument(this.getDocument());\n\n        this.resetCaches();\n    };\n    this.getDocument = function() {\n        return this.doc;\n    };\n    this.$resetRowCache = function(docRow) {\n        if (!docRow) {\n            this.$docRowCache = [];\n            this.$screenRowCache = [];\n            return;\n        }\n        var l = this.$docRowCache.length;\n        var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1;\n        if (l > i) {\n            this.$docRowCache.splice(i, l);\n            this.$screenRowCache.splice(i, l);\n        }\n    };\n\n    this.$getRowCacheIndex = function(cacheArray, val) {\n        var low = 0;\n        var hi = cacheArray.length - 1;\n\n        while (low <= hi) {\n            var mid = (low + hi) >> 1;\n            var c = cacheArray[mid];\n\n            if (val > c)\n                low = mid + 1;\n            else if (val < c)\n                hi = mid - 1;\n            else\n                return mid;\n        }\n\n        return low -1;\n    };\n\n    this.resetCaches = function() {\n        this.$modified = true;\n        this.$wrapData = [];\n        this.$rowLengthCache = [];\n        this.$resetRowCache(0);\n        if (this.bgTokenizer)\n            this.bgTokenizer.start(0);\n    };\n\n    this.onChangeFold = function(e) {\n        var fold = e.data;\n        this.$resetRowCache(fold.start.row);\n    };\n\n    this.onChange = function(e) {\n        var delta = e.data;\n        this.$modified = true;\n\n        this.$resetRowCache(delta.range.start.row);\n\n        var removedFolds = this.$updateInternalDataOnChange(e);\n        if (!this.$fromUndo && this.$undoManager && !delta.ignore) {\n            this.$deltasDoc.push(delta);\n            if (removedFolds && removedFolds.length != 0) {\n                this.$deltasFold.push({\n                    action: \"removeFolds\",\n                    folds:  removedFolds\n                });\n            }\n\n            this.$informUndoManager.schedule();\n        }\n\n        this.bgTokenizer && this.bgTokenizer.$updateOnChange(delta);\n        this._signal(\"change\", e);\n    };\n    this.setValue = function(text) {\n        this.doc.setValue(text);\n        this.selection.moveTo(0, 0);\n\n        this.$resetRowCache(0);\n        this.$deltas = [];\n        this.$deltasDoc = [];\n        this.$deltasFold = [];\n        this.setUndoManager(this.$undoManager);\n        this.getUndoManager().reset();\n    };\n    this.getValue =\n    this.toString = function() {\n        return this.doc.getValue();\n    };\n    this.getSelection = function() {\n        return this.selection;\n    };\n    this.getState = function(row) {\n        return this.bgTokenizer.getState(row);\n    };\n    this.getTokens = function(row) {\n        return this.bgTokenizer.getTokens(row);\n    };\n    this.getTokenAt = function(row, column) {\n        var tokens = this.bgTokenizer.getTokens(row);\n        var token, c = 0;\n        if (column == null) {\n            i = tokens.length - 1;\n            c = this.getLine(row).length;\n        } else {\n            for (var i = 0; i < tokens.length; i++) {\n                c += tokens[i].value.length;\n                if (c >= column)\n                    break;\n            }\n        }\n        token = tokens[i];\n        if (!token)\n            return null;\n        token.index = i;\n        token.start = c - token.value.length;\n        return token;\n    };\n    this.setUndoManager = function(undoManager) {\n        this.$undoManager = undoManager;\n        this.$deltas = [];\n        this.$deltasDoc = [];\n        this.$deltasFold = [];\n\n        if (this.$informUndoManager)\n            this.$informUndoManager.cancel();\n\n        if (undoManager) {\n            var self = this;\n\n            this.$syncInformUndoManager = function() {\n                self.$informUndoManager.cancel();\n\n                if (self.$deltasFold.length) {\n                    self.$deltas.push({\n                        group: \"fold\",\n                        deltas: self.$deltasFold\n                    });\n                    self.$deltasFold = [];\n                }\n\n                if (self.$deltasDoc.length) {\n                    self.$deltas.push({\n                        group: \"doc\",\n                        deltas: self.$deltasDoc\n                    });\n                    self.$deltasDoc = [];\n                }\n\n                if (self.$deltas.length > 0) {\n                    undoManager.execute({\n                        action: \"aceupdate\",\n                        args: [self.$deltas, self],\n                        merge: self.mergeUndoDeltas\n                    });\n                }\n                self.mergeUndoDeltas = false;\n                self.$deltas = [];\n            };\n            this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager);\n        }\n    };\n    this.markUndoGroup = function() {\n        if (this.$syncInformUndoManager)\n            this.$syncInformUndoManager();\n    };\n    \n    this.$defaultUndoManager = {\n        undo: function() {},\n        redo: function() {},\n        reset: function() {}\n    };\n    this.getUndoManager = function() {\n        return this.$undoManager || this.$defaultUndoManager;\n    };\n    this.getTabString = function() {\n        if (this.getUseSoftTabs()) {\n            return lang.stringRepeat(\" \", this.getTabSize());\n        } else {\n            return \"\\t\";\n        }\n    };\n    this.setUseSoftTabs = function(val) {\n        this.setOption(\"useSoftTabs\", val);\n    };\n    this.getUseSoftTabs = function() {\n        return this.$useSoftTabs && !this.$mode.$indentWithTabs;\n    };\n    this.setTabSize = function(tabSize) {\n        this.setOption(\"tabSize\", tabSize);\n    };\n    this.getTabSize = function() {\n        return this.$tabSize;\n    };\n    this.isTabStop = function(position) {\n        return this.$useSoftTabs && (position.column % this.$tabSize === 0);\n    };\n\n    this.$overwrite = false;\n    this.setOverwrite = function(overwrite) {\n        this.setOption(\"overwrite\", overwrite);\n    };\n    this.getOverwrite = function() {\n        return this.$overwrite;\n    };\n    this.toggleOverwrite = function() {\n        this.setOverwrite(!this.$overwrite);\n    };\n    this.addGutterDecoration = function(row, className) {\n        if (!this.$decorations[row])\n            this.$decorations[row] = \"\";\n        this.$decorations[row] += \" \" + className;\n        this._signal(\"changeBreakpoint\", {});\n    };\n    this.removeGutterDecoration = function(row, className) {\n        this.$decorations[row] = (this.$decorations[row] || \"\").replace(\" \" + className, \"\");\n        this._signal(\"changeBreakpoint\", {});\n    };\n    this.getBreakpoints = function() {\n        return this.$breakpoints;\n    };\n    this.setBreakpoints = function(rows) {\n        this.$breakpoints = [];\n        for (var i=0; i<rows.length; i++) {\n            this.$breakpoints[rows[i]] = \"ace_breakpoint\";\n        }\n        this._signal(\"changeBreakpoint\", {});\n    };\n    this.clearBreakpoints = function() {\n        this.$breakpoints = [];\n        this._signal(\"changeBreakpoint\", {});\n    };\n    this.setBreakpoint = function(row, className) {\n        if (className === undefined)\n            className = \"ace_breakpoint\";\n        if (className)\n            this.$breakpoints[row] = className;\n        else\n            delete this.$breakpoints[row];\n        this._signal(\"changeBreakpoint\", {});\n    };\n    this.clearBreakpoint = function(row) {\n        delete this.$breakpoints[row];\n        this._signal(\"changeBreakpoint\", {});\n    };\n    this.addMarker = function(range, clazz, type, inFront) {\n        var id = this.$markerId++;\n\n        var marker = {\n            range : range,\n            type : type || \"line\",\n            renderer: typeof type == \"function\" ? type : null,\n            clazz : clazz,\n            inFront: !!inFront,\n            id: id\n        };\n\n        if (inFront) {\n            this.$frontMarkers[id] = marker;\n            this._signal(\"changeFrontMarker\");\n        } else {\n            this.$backMarkers[id] = marker;\n            this._signal(\"changeBackMarker\");\n        }\n\n        return id;\n    };\n    this.addDynamicMarker = function(marker, inFront) {\n        if (!marker.update)\n            return;\n        var id = this.$markerId++;\n        marker.id = id;\n        marker.inFront = !!inFront;\n\n        if (inFront) {\n            this.$frontMarkers[id] = marker;\n            this._signal(\"changeFrontMarker\");\n        } else {\n            this.$backMarkers[id] = marker;\n            this._signal(\"changeBackMarker\");\n        }\n\n        return marker;\n    };\n    this.removeMarker = function(markerId) {\n        var marker = this.$frontMarkers[markerId] || this.$backMarkers[markerId];\n        if (!marker)\n            return;\n\n        var markers = marker.inFront ? this.$frontMarkers : this.$backMarkers;\n        if (marker) {\n            delete (markers[markerId]);\n            this._signal(marker.inFront ? \"changeFrontMarker\" : \"changeBackMarker\");\n        }\n    };\n    this.getMarkers = function(inFront) {\n        return inFront ? this.$frontMarkers : this.$backMarkers;\n    };\n\n    this.highlight = function(re) {\n        if (!this.$searchHighlight) {\n            var highlight = new SearchHighlight(null, \"ace_selected-word\", \"text\");\n            this.$searchHighlight = this.addDynamicMarker(highlight);\n        }\n        this.$searchHighlight.setRegexp(re);\n    };\n    this.highlightLines = function(startRow, endRow, clazz, inFront) {\n        if (typeof endRow != \"number\") {\n            clazz = endRow;\n            endRow = startRow;\n        }\n        if (!clazz)\n            clazz = \"ace_step\";\n\n        var range = new Range(startRow, 0, endRow, Infinity);\n        range.id = this.addMarker(range, clazz, \"fullLine\", inFront);\n        return range;\n    };\n    this.setAnnotations = function(annotations) {\n        this.$annotations = annotations;\n        this._signal(\"changeAnnotation\", {});\n    };\n    this.getAnnotations = function() {\n        return this.$annotations || [];\n    };\n    this.clearAnnotations = function() {\n        this.setAnnotations([]);\n    };\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r?\\n)/m);\n        if (match) {\n            this.$autoNewLine = match[1];\n        } else {\n            this.$autoNewLine = \"\\n\";\n        }\n    };\n    this.getWordRange = function(row, column) {\n        var line = this.getLine(row);\n\n        var inToken = false;\n        if (column > 0)\n            inToken = !!line.charAt(column - 1).match(this.tokenRe);\n\n        if (!inToken)\n            inToken = !!line.charAt(column).match(this.tokenRe);\n\n        if (inToken)\n            var re = this.tokenRe;\n        else if (/^\\s+$/.test(line.slice(column-1, column+1)))\n            var re = /\\s/;\n        else\n            var re = this.nonTokenRe;\n\n        var start = column;\n        if (start > 0) {\n            do {\n                start--;\n            }\n            while (start >= 0 && line.charAt(start).match(re));\n            start++;\n        }\n\n        var end = column;\n        while (end < line.length && line.charAt(end).match(re)) {\n            end++;\n        }\n\n        return new Range(row, start, row, end);\n    };\n    this.getAWordRange = function(row, column) {\n        var wordRange = this.getWordRange(row, column);\n        var line = this.getLine(wordRange.end.row);\n\n        while (line.charAt(wordRange.end.column).match(/[ \\t]/)) {\n            wordRange.end.column += 1;\n        }\n        return wordRange;\n    };\n    this.setNewLineMode = function(newLineMode) {\n        this.doc.setNewLineMode(newLineMode);\n    };\n    this.getNewLineMode = function() {\n        return this.doc.getNewLineMode();\n    };\n    this.setUseWorker = function(useWorker) { this.setOption(\"useWorker\", useWorker); };\n    this.getUseWorker = function() { return this.$useWorker; };\n    this.onReloadTokenizer = function(e) {\n        var rows = e.data;\n        this.bgTokenizer.start(rows.first);\n        this._signal(\"tokenizerUpdate\", e);\n    };\n\n    this.$modes = {};\n    this.$mode = null;\n    this.$modeId = null;\n    this.setMode = function(mode, cb) {\n        if (mode && typeof mode === \"object\") {\n            if (mode.getTokenizer)\n                return this.$onChangeMode(mode);\n            var options = mode;\n            var path = options.path;\n        } else {\n            path = mode || \"ace/mode/text\";\n        }\n        if (!this.$modes[\"ace/mode/text\"])\n            this.$modes[\"ace/mode/text\"] = new TextMode();\n\n        if (this.$modes[path] && !options) {\n            this.$onChangeMode(this.$modes[path]);\n            cb && cb();\n            return;\n        }\n        this.$modeId = path;\n        config.loadModule([\"mode\", path], function(m) {\n            if (this.$modeId !== path)\n                return cb && cb();\n            if (this.$modes[path] && !options)\n                return this.$onChangeMode(this.$modes[path]);\n            if (m && m.Mode) {\n                m = new m.Mode(options);\n                if (!options) {\n                    this.$modes[path] = m;\n                    m.$id = path;\n                }\n                this.$onChangeMode(m);\n                cb && cb();\n            }\n        }.bind(this));\n        if (!this.$mode)\n            this.$onChangeMode(this.$modes[\"ace/mode/text\"], true);\n    };\n\n    this.$onChangeMode = function(mode, $isPlaceholder) {\n        if (!$isPlaceholder)\n            this.$modeId = mode.$id;\n        if (this.$mode === mode) \n            return;\n\n        this.$mode = mode;\n\n        this.$stopWorker();\n\n        if (this.$useWorker)\n            this.$startWorker();\n\n        var tokenizer = mode.getTokenizer();\n\n        if(tokenizer.addEventListener !== undefined) {\n            var onReloadTokenizer = this.onReloadTokenizer.bind(this);\n            tokenizer.addEventListener(\"update\", onReloadTokenizer);\n        }\n\n        if (!this.bgTokenizer) {\n            this.bgTokenizer = new BackgroundTokenizer(tokenizer);\n            var _self = this;\n            this.bgTokenizer.addEventListener(\"update\", function(e) {\n                _self._signal(\"tokenizerUpdate\", e);\n            });\n        } else {\n            this.bgTokenizer.setTokenizer(tokenizer);\n        }\n\n        this.bgTokenizer.setDocument(this.getDocument());\n\n        this.tokenRe = mode.tokenRe;\n        this.nonTokenRe = mode.nonTokenRe;\n\n        \n        if (!$isPlaceholder) {\n            if (mode.attachToSession)\n                mode.attachToSession(this);\n            this.$options.wrapMethod.set.call(this, this.$wrapMethod);\n            this.$setFolding(mode.foldingRules);\n            this.bgTokenizer.start(0);\n            this._emit(\"changeMode\");\n        }\n    };\n\n    this.$stopWorker = function() {\n        if (this.$worker) {\n            this.$worker.terminate();\n            this.$worker = null;\n        }\n    };\n\n    this.$startWorker = function() {\n        try {\n            this.$worker = this.$mode.createWorker(this);\n        } catch (e) {\n            config.warn(\"Could not load worker\", e);\n            this.$worker = null;\n        }\n    };\n    this.getMode = function() {\n        return this.$mode;\n    };\n\n    this.$scrollTop = 0;\n    this.setScrollTop = function(scrollTop) {\n        if (this.$scrollTop === scrollTop || isNaN(scrollTop))\n            return;\n\n        this.$scrollTop = scrollTop;\n        this._signal(\"changeScrollTop\", scrollTop);\n    };\n    this.getScrollTop = function() {\n        return this.$scrollTop;\n    };\n\n    this.$scrollLeft = 0;\n    this.setScrollLeft = function(scrollLeft) {\n        if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft))\n            return;\n\n        this.$scrollLeft = scrollLeft;\n        this._signal(\"changeScrollLeft\", scrollLeft);\n    };\n    this.getScrollLeft = function() {\n        return this.$scrollLeft;\n    };\n    this.getScreenWidth = function() {\n        this.$computeWidth();\n        if (this.lineWidgets) \n            return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth);\n        return this.screenWidth;\n    };\n    \n    this.getLineWidgetMaxWidth = function() {\n        if (this.lineWidgetsWidth != null) return this.lineWidgetsWidth;\n        var width = 0;\n        this.lineWidgets.forEach(function(w) {\n            if (w && w.screenWidth > width)\n                width = w.screenWidth;\n        });\n        return this.lineWidgetWidth = width;\n    };\n\n    this.$computeWidth = function(force) {\n        if (this.$modified || force) {\n            this.$modified = false;\n\n            if (this.$useWrapMode)\n                return this.screenWidth = this.$wrapLimit;\n\n            var lines = this.doc.getAllLines();\n            var cache = this.$rowLengthCache;\n            var longestScreenLine = 0;\n            var foldIndex = 0;\n            var foldLine = this.$foldData[foldIndex];\n            var foldStart = foldLine ? foldLine.start.row : Infinity;\n            var len = lines.length;\n\n            for (var i = 0; i < len; i++) {\n                if (i > foldStart) {\n                    i = foldLine.end.row + 1;\n                    if (i >= len)\n                        break;\n                    foldLine = this.$foldData[foldIndex++];\n                    foldStart = foldLine ? foldLine.start.row : Infinity;\n                }\n\n                if (cache[i] == null)\n                    cache[i] = this.$getStringScreenWidth(lines[i])[0];\n\n                if (cache[i] > longestScreenLine)\n                    longestScreenLine = cache[i];\n            }\n            this.screenWidth = longestScreenLine;\n        }\n    };\n    this.getLine = function(row) {\n        return this.doc.getLine(row);\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.doc.getLines(firstRow, lastRow);\n    };\n    this.getLength = function() {\n        return this.doc.getLength();\n    };\n    this.getTextRange = function(range) {\n        return this.doc.getTextRange(range || this.selection.getRange());\n    };\n    this.insert = function(position, text) {\n        return this.doc.insert(position, text);\n    };\n    this.remove = function(range) {\n        return this.doc.remove(range);\n    };\n    this.undoChanges = function(deltas, dontSelect) {\n        if (!deltas.length)\n            return;\n\n        this.$fromUndo = true;\n        var lastUndoRange = null;\n        for (var i = deltas.length - 1; i != -1; i--) {\n            var delta = deltas[i];\n            if (delta.group == \"doc\") {\n                this.doc.revertDeltas(delta.deltas);\n                lastUndoRange =\n                    this.$getUndoSelection(delta.deltas, true, lastUndoRange);\n            } else {\n                delta.deltas.forEach(function(foldDelta) {\n                    this.addFolds(foldDelta.folds);\n                }, this);\n            }\n        }\n        this.$fromUndo = false;\n        lastUndoRange &&\n            this.$undoSelect &&\n            !dontSelect &&\n            this.selection.setSelectionRange(lastUndoRange);\n        return lastUndoRange;\n    };\n    this.redoChanges = function(deltas, dontSelect) {\n        if (!deltas.length)\n            return;\n\n        this.$fromUndo = true;\n        var lastUndoRange = null;\n        for (var i = 0; i < deltas.length; i++) {\n            var delta = deltas[i];\n            if (delta.group == \"doc\") {\n                this.doc.applyDeltas(delta.deltas);\n                lastUndoRange =\n                    this.$getUndoSelection(delta.deltas, false, lastUndoRange);\n            }\n        }\n        this.$fromUndo = false;\n        lastUndoRange &&\n            this.$undoSelect &&\n            !dontSelect &&\n            this.selection.setSelectionRange(lastUndoRange);\n        return lastUndoRange;\n    };\n    this.setUndoSelect = function(enable) {\n        this.$undoSelect = enable;\n    };\n\n    this.$getUndoSelection = function(deltas, isUndo, lastUndoRange) {\n        function isInsert(delta) {\n            var insert =\n                delta.action === \"insertText\" || delta.action === \"insertLines\";\n            return isUndo ? !insert : insert;\n        }\n\n        var delta = deltas[0];\n        var range, point;\n        var lastDeltaIsInsert = false;\n        if (isInsert(delta)) {\n            range = Range.fromPoints(delta.range.start, delta.range.end);\n            lastDeltaIsInsert = true;\n        } else {\n            range = Range.fromPoints(delta.range.start, delta.range.start);\n            lastDeltaIsInsert = false;\n        }\n\n        for (var i = 1; i < deltas.length; i++) {\n            delta = deltas[i];\n            if (isInsert(delta)) {\n                point = delta.range.start;\n                if (range.compare(point.row, point.column) == -1) {\n                    range.setStart(delta.range.start);\n                }\n                point = delta.range.end;\n                if (range.compare(point.row, point.column) == 1) {\n                    range.setEnd(delta.range.end);\n                }\n                lastDeltaIsInsert = true;\n            } else {\n                point = delta.range.start;\n                if (range.compare(point.row, point.column) == -1) {\n                    range =\n                        Range.fromPoints(delta.range.start, delta.range.start);\n                }\n                lastDeltaIsInsert = false;\n            }\n        }\n        if (lastUndoRange != null) {\n            if (Range.comparePoints(lastUndoRange.start, range.start) === 0) {\n                lastUndoRange.start.column += range.end.column - range.start.column;\n                lastUndoRange.end.column += range.end.column - range.start.column;\n            }\n\n            var cmp = lastUndoRange.compareRange(range);\n            if (cmp == 1) {\n                range.setStart(lastUndoRange.start);\n            } else if (cmp == -1) {\n                range.setEnd(lastUndoRange.end);\n            }\n        }\n\n        return range;\n    };\n    this.replace = function(range, text) {\n        return this.doc.replace(range, text);\n    };\n    this.moveText = function(fromRange, toPosition, copy) {\n        var text = this.getTextRange(fromRange);\n        var folds = this.getFoldsInRange(fromRange);\n\n        var toRange = Range.fromPoints(toPosition, toPosition);\n        if (!copy) {\n            this.remove(fromRange);\n            var rowDiff = fromRange.start.row - fromRange.end.row;\n            var collDiff = rowDiff ? -fromRange.end.column : fromRange.start.column - fromRange.end.column;\n            if (collDiff) {\n                if (toRange.start.row == fromRange.end.row && toRange.start.column > fromRange.end.column)\n                    toRange.start.column += collDiff;\n                if (toRange.end.row == fromRange.end.row && toRange.end.column > fromRange.end.column)\n                    toRange.end.column += collDiff;\n            }\n            if (rowDiff && toRange.start.row >= fromRange.end.row) {\n                toRange.start.row += rowDiff;\n                toRange.end.row += rowDiff;\n            }\n        }\n\n        toRange.end = this.insert(toRange.start, text);\n        if (folds.length) {\n            var oldStart = fromRange.start;\n            var newStart = toRange.start;\n            var rowDiff = newStart.row - oldStart.row;\n            var collDiff = newStart.column - oldStart.column;\n            this.addFolds(folds.map(function(x) {\n                x = x.clone();\n                if (x.start.row == oldStart.row)\n                    x.start.column += collDiff;\n                if (x.end.row == oldStart.row)\n                    x.end.column += collDiff;\n                x.start.row += rowDiff;\n                x.end.row += rowDiff;\n                return x;\n            }));\n        }\n\n        return toRange;\n    };\n    this.indentRows = function(startRow, endRow, indentString) {\n        indentString = indentString.replace(/\\t/g, this.getTabString());\n        for (var row=startRow; row<=endRow; row++)\n            this.insert({row: row, column:0}, indentString);\n    };\n    this.outdentRows = function (range) {\n        var rowRange = range.collapseRows();\n        var deleteRange = new Range(0, 0, 0, 0);\n        var size = this.getTabSize();\n\n        for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) {\n            var line = this.getLine(i);\n\n            deleteRange.start.row = i;\n            deleteRange.end.row = i;\n            for (var j = 0; j < size; ++j)\n                if (line.charAt(j) != ' ')\n                    break;\n            if (j < size && line.charAt(j) == '\\t') {\n                deleteRange.start.column = j;\n                deleteRange.end.column = j + 1;\n            } else {\n                deleteRange.start.column = 0;\n                deleteRange.end.column = j;\n            }\n            this.remove(deleteRange);\n        }\n    };\n\n    this.$moveLines = function(firstRow, lastRow, dir) {\n        firstRow = this.getRowFoldStart(firstRow);\n        lastRow = this.getRowFoldEnd(lastRow);\n        if (dir < 0) {\n            var row = this.getRowFoldStart(firstRow + dir);\n            if (row < 0) return 0;\n            var diff = row-firstRow;\n        } else if (dir > 0) {\n            var row = this.getRowFoldEnd(lastRow + dir);\n            if (row > this.doc.getLength()-1) return 0;\n            var diff = row-lastRow;\n        } else {\n            firstRow = this.$clipRowToDocument(firstRow);\n            lastRow = this.$clipRowToDocument(lastRow);\n            var diff = lastRow - firstRow + 1;\n        }\n\n        var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE);\n        var folds = this.getFoldsInRange(range).map(function(x){\n            x = x.clone();\n            x.start.row += diff;\n            x.end.row += diff;\n            return x;\n        });\n\n        var lines = dir == 0\n            ? this.doc.getLines(firstRow, lastRow)\n            : this.doc.removeLines(firstRow, lastRow);\n        this.doc.insertLines(firstRow+diff, lines);\n        folds.length && this.addFolds(folds);\n        return diff;\n    };\n    this.moveLinesUp = function(firstRow, lastRow) {\n        return this.$moveLines(firstRow, lastRow, -1);\n    };\n    this.moveLinesDown = function(firstRow, lastRow) {\n        return this.$moveLines(firstRow, lastRow, 1);\n    };\n    this.duplicateLines = function(firstRow, lastRow) {\n        return this.$moveLines(firstRow, lastRow, 0);\n    };\n\n\n    this.$clipRowToDocument = function(row) {\n        return Math.max(0, Math.min(row, this.doc.getLength()-1));\n    };\n\n    this.$clipColumnToRow = function(row, column) {\n        if (column < 0)\n            return 0;\n        return Math.min(this.doc.getLine(row).length, column);\n    };\n\n\n    this.$clipPositionToDocument = function(row, column) {\n        column = Math.max(0, column);\n\n        if (row < 0) {\n            row = 0;\n            column = 0;\n        } else {\n            var len = this.doc.getLength();\n            if (row >= len) {\n                row = len - 1;\n                column = this.doc.getLine(len-1).length;\n            } else {\n                column = Math.min(this.doc.getLine(row).length, column);\n            }\n        }\n\n        return {\n            row: row,\n            column: column\n        };\n    };\n\n    this.$clipRangeToDocument = function(range) {\n        if (range.start.row < 0) {\n            range.start.row = 0;\n            range.start.column = 0;\n        } else {\n            range.start.column = this.$clipColumnToRow(\n                range.start.row,\n                range.start.column\n            );\n        }\n\n        var len = this.doc.getLength() - 1;\n        if (range.end.row > len) {\n            range.end.row = len;\n            range.end.column = this.doc.getLine(len).length;\n        } else {\n            range.end.column = this.$clipColumnToRow(\n                range.end.row,\n                range.end.column\n            );\n        }\n        return range;\n    };\n    this.$wrapLimit = 80;\n    this.$useWrapMode = false;\n    this.$wrapLimitRange = {\n        min : null,\n        max : null\n    };\n    this.setUseWrapMode = function(useWrapMode) {\n        if (useWrapMode != this.$useWrapMode) {\n            this.$useWrapMode = useWrapMode;\n            this.$modified = true;\n            this.$resetRowCache(0);\n            if (useWrapMode) {\n                var len = this.getLength();\n                this.$wrapData = Array(len);\n                this.$updateWrapData(0, len - 1);\n            }\n\n            this._signal(\"changeWrapMode\");\n        }\n    };\n    this.getUseWrapMode = function() {\n        return this.$useWrapMode;\n    };\n    this.setWrapLimitRange = function(min, max) {\n        if (this.$wrapLimitRange.min !== min || this.$wrapLimitRange.max !== max) {\n            this.$wrapLimitRange = {\n                min: min,\n                max: max\n            };\n            this.$modified = true;\n            this._signal(\"changeWrapMode\");\n        }\n    };\n    this.adjustWrapLimit = function(desiredLimit, $printMargin) {\n        var limits = this.$wrapLimitRange;\n        if (limits.max < 0)\n            limits = {min: $printMargin, max: $printMargin};\n        var wrapLimit = this.$constrainWrapLimit(desiredLimit, limits.min, limits.max);\n        if (wrapLimit != this.$wrapLimit && wrapLimit > 1) {\n            this.$wrapLimit = wrapLimit;\n            this.$modified = true;\n            if (this.$useWrapMode) {\n                this.$updateWrapData(0, this.getLength() - 1);\n                this.$resetRowCache(0);\n                this._signal(\"changeWrapLimit\");\n            }\n            return true;\n        }\n        return false;\n    };\n\n    this.$constrainWrapLimit = function(wrapLimit, min, max) {\n        if (min)\n            wrapLimit = Math.max(min, wrapLimit);\n\n        if (max)\n            wrapLimit = Math.min(max, wrapLimit);\n\n        return wrapLimit;\n    };\n    this.getWrapLimit = function() {\n        return this.$wrapLimit;\n    };\n    this.setWrapLimit = function (limit) {\n        this.setWrapLimitRange(limit, limit);\n    };\n    this.getWrapLimitRange = function() {\n        return {\n            min : this.$wrapLimitRange.min,\n            max : this.$wrapLimitRange.max\n        };\n    };\n\n    this.$updateInternalDataOnChange = function(e) {\n        var useWrapMode = this.$useWrapMode;\n        var len;\n        var action = e.data.action;\n        var firstRow = e.data.range.start.row;\n        var lastRow = e.data.range.end.row;\n        var start = e.data.range.start;\n        var end = e.data.range.end;\n        var removedFolds = null;\n\n        if (action.indexOf(\"Lines\") != -1) {\n            if (action == \"insertLines\") {\n                lastRow = firstRow + (e.data.lines.length);\n            } else {\n                lastRow = firstRow;\n            }\n            len = e.data.lines ? e.data.lines.length : lastRow - firstRow;\n        } else {\n            len = lastRow - firstRow;\n        }\n\n        this.$updating = true;\n        if (len != 0) {\n            if (action.indexOf(\"remove\") != -1) {\n                this[useWrapMode ? \"$wrapData\" : \"$rowLengthCache\"].splice(firstRow, len);\n\n                var foldLines = this.$foldData;\n                removedFolds = this.getFoldsInRange(e.data.range);\n                this.removeFolds(removedFolds);\n\n                var foldLine = this.getFoldLine(end.row);\n                var idx = 0;\n                if (foldLine) {\n                    foldLine.addRemoveChars(end.row, end.column, start.column - end.column);\n                    foldLine.shiftRow(-len);\n\n                    var foldLineBefore = this.getFoldLine(firstRow);\n                    if (foldLineBefore && foldLineBefore !== foldLine) {\n                        foldLineBefore.merge(foldLine);\n                        foldLine = foldLineBefore;\n                    }\n                    idx = foldLines.indexOf(foldLine) + 1;\n                }\n\n                for (idx; idx < foldLines.length; idx++) {\n                    var foldLine = foldLines[idx];\n                    if (foldLine.start.row >= end.row) {\n                        foldLine.shiftRow(-len);\n                    }\n                }\n\n                lastRow = firstRow;\n            } else {\n                var args = Array(len);\n                args.unshift(firstRow, 0);\n                var arr = useWrapMode ? this.$wrapData : this.$rowLengthCache\n                arr.splice.apply(arr, args);\n                var foldLines = this.$foldData;\n                var foldLine = this.getFoldLine(firstRow);\n                var idx = 0;\n                if (foldLine) {\n                    var cmp = foldLine.range.compareInside(start.row, start.column);\n                    if (cmp == 0) {\n                        foldLine = foldLine.split(start.row, start.column);\n                        if (foldLine) {\n                            foldLine.shiftRow(len);\n                            foldLine.addRemoveChars(lastRow, 0, end.column - start.column);\n                        }\n                    } else\n                    if (cmp == -1) {\n                        foldLine.addRemoveChars(firstRow, 0, end.column - start.column);\n                        foldLine.shiftRow(len);\n                    }\n                    idx = foldLines.indexOf(foldLine) + 1;\n                }\n\n                for (idx; idx < foldLines.length; idx++) {\n                    var foldLine = foldLines[idx];\n                    if (foldLine.start.row >= firstRow) {\n                        foldLine.shiftRow(len);\n                    }\n                }\n            }\n        } else {\n            len = Math.abs(e.data.range.start.column - e.data.range.end.column);\n            if (action.indexOf(\"remove\") != -1) {\n                removedFolds = this.getFoldsInRange(e.data.range);\n                this.removeFolds(removedFolds);\n\n                len = -len;\n            }\n            var foldLine = this.getFoldLine(firstRow);\n            if (foldLine) {\n                foldLine.addRemoveChars(firstRow, start.column, len);\n            }\n        }\n\n        if (useWrapMode && this.$wrapData.length != this.doc.getLength()) {\n            console.error(\"doc.getLength() and $wrapData.length have to be the same!\");\n        }\n        this.$updating = false;\n\n        if (useWrapMode)\n            this.$updateWrapData(firstRow, lastRow);\n        else\n            this.$updateRowLengthCache(firstRow, lastRow);\n\n        return removedFolds;\n    };\n\n    this.$updateRowLengthCache = function(firstRow, lastRow, b) {\n        this.$rowLengthCache[firstRow] = null;\n        this.$rowLengthCache[lastRow] = null;\n    };\n\n    this.$updateWrapData = function(firstRow, lastRow) {\n        var lines = this.doc.getAllLines();\n        var tabSize = this.getTabSize();\n        var wrapData = this.$wrapData;\n        var wrapLimit = this.$wrapLimit;\n        var tokens;\n        var foldLine;\n\n        var row = firstRow;\n        lastRow = Math.min(lastRow, lines.length - 1);\n        while (row <= lastRow) {\n            foldLine = this.getFoldLine(row, foldLine);\n            if (!foldLine) {\n                tokens = this.$getDisplayTokens(lines[row]);\n                wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n                row ++;\n            } else {\n                tokens = [];\n                foldLine.walk(function(placeholder, row, column, lastColumn) {\n                        var walkTokens;\n                        if (placeholder != null) {\n                            walkTokens = this.$getDisplayTokens(\n                                            placeholder, tokens.length);\n                            walkTokens[0] = PLACEHOLDER_START;\n                            for (var i = 1; i < walkTokens.length; i++) {\n                                walkTokens[i] = PLACEHOLDER_BODY;\n                            }\n                        } else {\n                            walkTokens = this.$getDisplayTokens(\n                                lines[row].substring(lastColumn, column),\n                                tokens.length);\n                        }\n                        tokens = tokens.concat(walkTokens);\n                    }.bind(this),\n                    foldLine.end.row,\n                    lines[foldLine.end.row].length + 1\n                );\n\n                wrapData[foldLine.start.row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n                row = foldLine.end.row + 1;\n            }\n        }\n    };\n    var CHAR = 1,\n        CHAR_EXT = 2,\n        PLACEHOLDER_START = 3,\n        PLACEHOLDER_BODY =  4,\n        PUNCTUATION = 9,\n        SPACE = 10,\n        TAB = 11,\n        TAB_SPACE = 12;\n\n\n    this.$computeWrapSplits = function(tokens, wrapLimit) {\n        if (tokens.length == 0) {\n            return [];\n        }\n\n        var splits = [];\n        var displayLength = tokens.length;\n        var lastSplit = 0, lastDocSplit = 0;\n\n        var isCode = this.$wrapAsCode;\n\n        function addSplit(screenPos) {\n            var displayed = tokens.slice(lastSplit, screenPos);\n            var len = displayed.length;\n            displayed.join(\"\").\n                replace(/12/g, function() {\n                    len -= 1;\n                }).\n                replace(/2/g, function() {\n                    len -= 1;\n                });\n\n            lastDocSplit += len;\n            splits.push(lastDocSplit);\n            lastSplit = screenPos;\n        }\n\n        while (displayLength - lastSplit > wrapLimit) {\n            var split = lastSplit + wrapLimit;\n            if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) {\n                addSplit(split);\n                continue;\n            }\n            if (tokens[split] == PLACEHOLDER_START || tokens[split] == PLACEHOLDER_BODY) {\n                for (split; split != lastSplit - 1; split--) {\n                    if (tokens[split] == PLACEHOLDER_START) {\n                        break;\n                    }\n                }\n                if (split > lastSplit) {\n                    addSplit(split);\n                    continue;\n                }\n                split = lastSplit + wrapLimit;\n                for (split; split < tokens.length; split++) {\n                    if (tokens[split] != PLACEHOLDER_BODY) {\n                        break;\n                    }\n                }\n                if (split == tokens.length) {\n                    break;  // Breaks the while-loop.\n                }\n                addSplit(split);\n                continue;\n            }\n            var minSplit = Math.max(split - (isCode ? 10 : wrapLimit-(wrapLimit>>2)), lastSplit - 1);\n            while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n                split --;\n            }\n            if (isCode) {\n                while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n                    split --;\n                }\n                while (split > minSplit && tokens[split] == PUNCTUATION) {\n                    split --;\n                }\n            } else {\n                while (split > minSplit && tokens[split] < SPACE) {\n                    split --;\n                }\n            }\n            if (split > minSplit) {\n                addSplit(++split);\n                continue;\n            }\n            split = lastSplit + wrapLimit;\n            if (tokens[split] == CHAR_EXT)\n                split--;\n            addSplit(split);\n        }\n        return splits;\n    };\n    this.$getDisplayTokens = function(str, offset) {\n        var arr = [];\n        var tabSize;\n        offset = offset || 0;\n\n        for (var i = 0; i < str.length; i++) {\n            var c = str.charCodeAt(i);\n            if (c == 9) {\n                tabSize = this.getScreenTabSize(arr.length + offset);\n                arr.push(TAB);\n                for (var n = 1; n < tabSize; n++) {\n                    arr.push(TAB_SPACE);\n                }\n            }\n            else if (c == 32) {\n                arr.push(SPACE);\n            } else if((c > 39 && c < 48) || (c > 57 && c < 64)) {\n                arr.push(PUNCTUATION);\n            }\n            else if (c >= 0x1100 && isFullWidth(c)) {\n                arr.push(CHAR, CHAR_EXT);\n            } else {\n                arr.push(CHAR);\n            }\n        }\n        return arr;\n    };\n    this.$getStringScreenWidth = function(str, maxScreenColumn, screenColumn) {\n        if (maxScreenColumn == 0)\n            return [0, 0];\n        if (maxScreenColumn == null)\n            maxScreenColumn = Infinity;\n        screenColumn = screenColumn || 0;\n\n        var c, column;\n        for (column = 0; column < str.length; column++) {\n            c = str.charCodeAt(column);\n            if (c == 9) {\n                screenColumn += this.getScreenTabSize(screenColumn);\n            }\n            else if (c >= 0x1100 && isFullWidth(c)) {\n                screenColumn += 2;\n            } else {\n                screenColumn += 1;\n            }\n            if (screenColumn > maxScreenColumn) {\n                break;\n            }\n        }\n\n        return [screenColumn, column];\n    };\n\n    this.lineWidgets = null;\n    this.getRowLength = function(row) {\n        if (this.lineWidgets)\n            var h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n        else \n            h = 0\n        if (!this.$useWrapMode || !this.$wrapData[row]) {\n            return 1 + h;\n        } else {\n            return this.$wrapData[row].length + 1 + h;\n        }\n    };\n    this.getRowLineCount = function(row) {\n        if (!this.$useWrapMode || !this.$wrapData[row]) {\n            return 1;\n        } else {\n            return this.$wrapData[row].length + 1;\n        }\n    };\n    this.getScreenLastRowColumn = function(screenRow) {\n        var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);\n        return this.documentToScreenColumn(pos.row, pos.column);\n    };\n    this.getDocumentLastRowColumn = function(docRow, docColumn) {\n        var screenRow = this.documentToScreenRow(docRow, docColumn);\n        return this.getScreenLastRowColumn(screenRow);\n    };\n    this.getDocumentLastRowColumnPosition = function(docRow, docColumn) {\n        var screenRow = this.documentToScreenRow(docRow, docColumn);\n        return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10);\n    };\n    this.getRowSplitData = function(row) {\n        if (!this.$useWrapMode) {\n            return undefined;\n        } else {\n            return this.$wrapData[row];\n        }\n    };\n    this.getScreenTabSize = function(screenColumn) {\n        return this.$tabSize - screenColumn % this.$tabSize;\n    };\n\n\n    this.screenToDocumentRow = function(screenRow, screenColumn) {\n        return this.screenToDocumentPosition(screenRow, screenColumn).row;\n    };\n\n\n    this.screenToDocumentColumn = function(screenRow, screenColumn) {\n        return this.screenToDocumentPosition(screenRow, screenColumn).column;\n    };\n    this.screenToDocumentPosition = function(screenRow, screenColumn) {\n        if (screenRow < 0)\n            return {row: 0, column: 0};\n\n        var line;\n        var docRow = 0;\n        var docColumn = 0;\n        var column;\n        var row = 0;\n        var rowLength = 0;\n\n        var rowCache = this.$screenRowCache;\n        var i = this.$getRowCacheIndex(rowCache, screenRow);\n        var l = rowCache.length;\n        if (l && i >= 0) {\n            var row = rowCache[i];\n            var docRow = this.$docRowCache[i];\n            var doCache = screenRow > rowCache[l - 1];\n        } else {\n            var doCache = !l;\n        }\n\n        var maxRow = this.getLength() - 1;\n        var foldLine = this.getNextFoldLine(docRow);\n        var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n        while (row <= screenRow) {\n            rowLength = this.getRowLength(docRow);\n            if (row + rowLength > screenRow || docRow >= maxRow) {\n                break;\n            } else {\n                row += rowLength;\n                docRow++;\n                if (docRow > foldStart) {\n                    docRow = foldLine.end.row+1;\n                    foldLine = this.getNextFoldLine(docRow, foldLine);\n                    foldStart = foldLine ? foldLine.start.row : Infinity;\n                }\n            }\n\n            if (doCache) {\n                this.$docRowCache.push(docRow);\n                this.$screenRowCache.push(row);\n            }\n        }\n\n        if (foldLine && foldLine.start.row <= docRow) {\n            line = this.getFoldDisplayLine(foldLine);\n            docRow = foldLine.start.row;\n        } else if (row + rowLength <= screenRow || docRow > maxRow) {\n            return {\n                row: maxRow,\n                column: this.getLine(maxRow).length\n            };\n        } else {\n            line = this.getLine(docRow);\n            foldLine = null;\n        }\n\n        if (this.$useWrapMode) {\n            var splits = this.$wrapData[docRow];\n            if (splits) {\n                var splitIndex = Math.floor(screenRow - row);\n                column = splits[splitIndex];\n                if(splitIndex > 0 && splits.length) {\n                    docColumn = splits[splitIndex - 1] || splits[splits.length - 1];\n                    line = line.substring(docColumn);\n                }\n            }\n        }\n\n        docColumn += this.$getStringScreenWidth(line, screenColumn)[1];\n        if (this.$useWrapMode && docColumn >= column)\n            docColumn = column - 1;\n\n        if (foldLine)\n            return foldLine.idxToPosition(docColumn);\n\n        return {row: docRow, column: docColumn};\n    };\n    this.documentToScreenPosition = function(docRow, docColumn) {\n        if (typeof docColumn === \"undefined\")\n            var pos = this.$clipPositionToDocument(docRow.row, docRow.column);\n        else\n            pos = this.$clipPositionToDocument(docRow, docColumn);\n\n        docRow = pos.row;\n        docColumn = pos.column;\n\n        var screenRow = 0;\n        var foldStartRow = null;\n        var fold = null;\n        fold = this.getFoldAt(docRow, docColumn, 1);\n        if (fold) {\n            docRow = fold.start.row;\n            docColumn = fold.start.column;\n        }\n\n        var rowEnd, row = 0;\n\n\n        var rowCache = this.$docRowCache;\n        var i = this.$getRowCacheIndex(rowCache, docRow);\n        var l = rowCache.length;\n        if (l && i >= 0) {\n            var row = rowCache[i];\n            var screenRow = this.$screenRowCache[i];\n            var doCache = docRow > rowCache[l - 1];\n        } else {\n            var doCache = !l;\n        }\n\n        var foldLine = this.getNextFoldLine(row);\n        var foldStart = foldLine ?foldLine.start.row :Infinity;\n\n        while (row < docRow) {\n            if (row >= foldStart) {\n                rowEnd = foldLine.end.row + 1;\n                if (rowEnd > docRow)\n                    break;\n                foldLine = this.getNextFoldLine(rowEnd, foldLine);\n                foldStart = foldLine ?foldLine.start.row :Infinity;\n            }\n            else {\n                rowEnd = row + 1;\n            }\n\n            screenRow += this.getRowLength(row);\n            row = rowEnd;\n\n            if (doCache) {\n                this.$docRowCache.push(row);\n                this.$screenRowCache.push(screenRow);\n            }\n        }\n        var textLine = \"\";\n        if (foldLine && row >= foldStart) {\n            textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn);\n            foldStartRow = foldLine.start.row;\n        } else {\n            textLine = this.getLine(docRow).substring(0, docColumn);\n            foldStartRow = docRow;\n        }\n        if (this.$useWrapMode) {\n            var wrapRow = this.$wrapData[foldStartRow];\n            if (wrapRow) {\n                var screenRowOffset = 0;\n                while (textLine.length >= wrapRow[screenRowOffset]) {\n                    screenRow ++;\n                    screenRowOffset++;\n                }\n                textLine = textLine.substring(\n                    wrapRow[screenRowOffset - 1] || 0, textLine.length\n                );\n            }\n        }\n\n        return {\n            row: screenRow,\n            column: this.$getStringScreenWidth(textLine)[0]\n        };\n    };\n    this.documentToScreenColumn = function(row, docColumn) {\n        return this.documentToScreenPosition(row, docColumn).column;\n    };\n    this.documentToScreenRow = function(docRow, docColumn) {\n        return this.documentToScreenPosition(docRow, docColumn).row;\n    };\n    this.getScreenLength = function() {\n        var screenRows = 0;\n        var fold = null;\n        if (!this.$useWrapMode) {\n            screenRows = this.getLength();\n            var foldData = this.$foldData;\n            for (var i = 0; i < foldData.length; i++) {\n                fold = foldData[i];\n                screenRows -= fold.end.row - fold.start.row;\n            }\n        } else {\n            var lastRow = this.$wrapData.length;\n            var row = 0, i = 0;\n            var fold = this.$foldData[i++];\n            var foldStart = fold ? fold.start.row :Infinity;\n\n            while (row < lastRow) {\n                var splits = this.$wrapData[row];\n                screenRows += splits ? splits.length + 1 : 1;\n                row ++;\n                if (row > foldStart) {\n                    row = fold.end.row+1;\n                    fold = this.$foldData[i++];\n                    foldStart = fold ?fold.start.row :Infinity;\n                }\n            }\n        }\n        if (this.lineWidgets)\n            screenRows += this.$getWidgetScreenLength();\n\n        return screenRows;\n    };\n    this.$setFontMetrics = function(fm) {\n    };\n    \n    this.destroy = function() {\n        if (this.bgTokenizer) {\n            this.bgTokenizer.setDocument(null);\n            this.bgTokenizer = null;\n        }\n        this.$stopWorker();\n    };\n    function isFullWidth(c) {\n        if (c < 0x1100)\n            return false;\n        return c >= 0x1100 && c <= 0x115F ||\n               c >= 0x11A3 && c <= 0x11A7 ||\n               c >= 0x11FA && c <= 0x11FF ||\n               c >= 0x2329 && c <= 0x232A ||\n               c >= 0x2E80 && c <= 0x2E99 ||\n               c >= 0x2E9B && c <= 0x2EF3 ||\n               c >= 0x2F00 && c <= 0x2FD5 ||\n               c >= 0x2FF0 && c <= 0x2FFB ||\n               c >= 0x3000 && c <= 0x303E ||\n               c >= 0x3041 && c <= 0x3096 ||\n               c >= 0x3099 && c <= 0x30FF ||\n               c >= 0x3105 && c <= 0x312D ||\n               c >= 0x3131 && c <= 0x318E ||\n               c >= 0x3190 && c <= 0x31BA ||\n               c >= 0x31C0 && c <= 0x31E3 ||\n               c >= 0x31F0 && c <= 0x321E ||\n               c >= 0x3220 && c <= 0x3247 ||\n               c >= 0x3250 && c <= 0x32FE ||\n               c >= 0x3300 && c <= 0x4DBF ||\n               c >= 0x4E00 && c <= 0xA48C ||\n               c >= 0xA490 && c <= 0xA4C6 ||\n               c >= 0xA960 && c <= 0xA97C ||\n               c >= 0xAC00 && c <= 0xD7A3 ||\n               c >= 0xD7B0 && c <= 0xD7C6 ||\n               c >= 0xD7CB && c <= 0xD7FB ||\n               c >= 0xF900 && c <= 0xFAFF ||\n               c >= 0xFE10 && c <= 0xFE19 ||\n               c >= 0xFE30 && c <= 0xFE52 ||\n               c >= 0xFE54 && c <= 0xFE66 ||\n               c >= 0xFE68 && c <= 0xFE6B ||\n               c >= 0xFF01 && c <= 0xFF60 ||\n               c >= 0xFFE0 && c <= 0xFFE6;\n    };\n\n}).call(EditSession.prototype);\n\nrequire(\"./edit_session/folding\").Folding.call(EditSession.prototype);\nrequire(\"./edit_session/bracket_match\").BracketMatch.call(EditSession.prototype);\n\n\nconfig.defineOptions(EditSession.prototype, \"session\", {\n    wrap: {\n        set: function(value) {\n            if (!value || value == \"off\")\n                value = false;\n            else if (value == \"free\")\n                value = true;\n            else if (value == \"printMargin\")\n                value = -1;\n            else if (typeof value == \"string\")\n                value = parseInt(value, 10) || false;\n\n            if (this.$wrap == value)\n                return;\n            if (!value) {\n                this.setUseWrapMode(false);\n            } else {\n                var col = typeof value == \"number\" ? value : null;\n                this.setWrapLimitRange(col, col);\n                this.setUseWrapMode(true);\n            }\n            this.$wrap = value;\n        },\n        get: function() {\n            if (this.getUseWrapMode()) {\n                if (this.$wrap == -1)\n                    return \"printMargin\";\n                if (!this.getWrapLimitRange().min)\n                    return \"free\";\n                return this.$wrap;\n            }\n            return \"off\";\n        },\n        handlesSet: true\n    },    \n    wrapMethod: {\n        set: function(val) {\n            val = val == \"auto\"\n                ? this.$mode.type != \"text\"\n                : val != \"text\";\n            if (val != this.$wrapAsCode) {\n                this.$wrapAsCode = val;\n                if (this.$useWrapMode) {\n                    this.$modified = true;\n                    this.$resetRowCache(0);\n                    this.$updateWrapData(0, this.getLength() - 1);\n                }\n            }\n        },\n        initialValue: \"auto\"\n    },\n    firstLineNumber: {\n        set: function() {this._signal(\"changeBreakpoint\");},\n        initialValue: 1\n    },\n    useWorker: {\n        set: function(useWorker) {\n            this.$useWorker = useWorker;\n\n            this.$stopWorker();\n            if (useWorker)\n                this.$startWorker();\n        },\n        initialValue: true\n    },\n    useSoftTabs: {initialValue: true},\n    tabSize: {\n        set: function(tabSize) {\n            if (isNaN(tabSize) || this.$tabSize === tabSize) return;\n\n            this.$modified = true;\n            this.$rowLengthCache = [];\n            this.$tabSize = tabSize;\n            this._signal(\"changeTabSize\");\n        },\n        initialValue: 4,\n        handlesSet: true\n    },\n    overwrite: {\n        set: function(val) {this._signal(\"changeOverwrite\");},\n        initialValue: false\n    },\n    newLineMode: {\n        set: function(val) {this.doc.setNewLineMode(val)},\n        get: function() {return this.doc.getNewLineMode()},\n        handlesSet: true\n    },\n    mode: {\n        set: function(val) { this.setMode(val) },\n        get: function() { return this.$modeId }\n    }\n});\n\nexports.EditSession = EditSession;\n});\n\nace.define(\"ace/search\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/lib/oop\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar lang = require(\"./lib/lang\");\nvar oop = require(\"./lib/oop\");\nvar Range = require(\"./range\").Range;\n\nvar Search = function() {\n    this.$options = {};\n};\n\n(function() {\n    this.set = function(options) {\n        oop.mixin(this.$options, options);\n        return this;\n    };\n    this.getOptions = function() {\n        return lang.copyObject(this.$options);\n    };\n    this.setOptions = function(options) {\n        this.$options = options;\n    };\n    this.find = function(session) {\n        var options = this.$options;\n        var iterator = this.$matchIterator(session, options);\n        if (!iterator)\n            return false;\n\n        var firstRange = null;\n        iterator.forEach(function(range, row, offset) {\n            if (!range.start) {\n                var column = range.offset + (offset || 0);\n                firstRange = new Range(row, column, row, column + range.length);\n                if (!range.length && options.start && options.start.start\n                    && options.skipCurrent != false && firstRange.isEqual(options.start)\n                ) {\n                    firstRange = null;\n                    return false;\n                }\n            } else\n                firstRange = range;\n            return true;\n        });\n\n        return firstRange;\n    };\n    this.findAll = function(session) {\n        var options = this.$options;\n        if (!options.needle)\n            return [];\n        this.$assembleRegExp(options);\n\n        var range = options.range;\n        var lines = range\n            ? session.getLines(range.start.row, range.end.row)\n            : session.doc.getAllLines();\n\n        var ranges = [];\n        var re = options.re;\n        if (options.$isMultiLine) {\n            var len = re.length;\n            var maxRow = lines.length - len;\n            var prevRange;\n            outer: for (var row = re.offset || 0; row <= maxRow; row++) {\n                for (var j = 0; j < len; j++)\n                    if (lines[row + j].search(re[j]) == -1)\n                        continue outer;\n                \n                var startLine = lines[row];\n                var line = lines[row + len - 1];\n                var startIndex = startLine.length - startLine.match(re[0])[0].length;\n                var endIndex = line.match(re[len - 1])[0].length;\n                \n                if (prevRange && prevRange.end.row === row &&\n                    prevRange.end.column > startIndex\n                ) {\n                    continue;\n                }\n                ranges.push(prevRange = new Range(\n                    row, startIndex, row + len - 1, endIndex\n                ));\n                if (len > 2)\n                    row = row + len - 2;\n            }\n        } else {\n            for (var i = 0; i < lines.length; i++) {\n                var matches = lang.getMatchOffsets(lines[i], re);\n                for (var j = 0; j < matches.length; j++) {\n                    var match = matches[j];\n                    ranges.push(new Range(i, match.offset, i, match.offset + match.length));\n                }\n            }\n        }\n\n        if (range) {\n            var startColumn = range.start.column;\n            var endColumn = range.start.column;\n            var i = 0, j = ranges.length - 1;\n            while (i < j && ranges[i].start.column < startColumn && ranges[i].start.row == range.start.row)\n                i++;\n\n            while (i < j && ranges[j].end.column > endColumn && ranges[j].end.row == range.end.row)\n                j--;\n            \n            ranges = ranges.slice(i, j + 1);\n            for (i = 0, j = ranges.length; i < j; i++) {\n                ranges[i].start.row += range.start.row;\n                ranges[i].end.row += range.start.row;\n            }\n        }\n\n        return ranges;\n    };\n    this.replace = function(input, replacement) {\n        var options = this.$options;\n\n        var re = this.$assembleRegExp(options);\n        if (options.$isMultiLine)\n            return replacement;\n\n        if (!re)\n            return;\n\n        var match = re.exec(input);\n        if (!match || match[0].length != input.length)\n            return null;\n        \n        replacement = input.replace(re, replacement);\n        if (options.preserveCase) {\n            replacement = replacement.split(\"\");\n            for (var i = Math.min(input.length, input.length); i--; ) {\n                var ch = input[i];\n                if (ch && ch.toLowerCase() != ch)\n                    replacement[i] = replacement[i].toUpperCase();\n                else\n                    replacement[i] = replacement[i].toLowerCase();\n            }\n            replacement = replacement.join(\"\");\n        }\n        \n        return replacement;\n    };\n\n    this.$matchIterator = function(session, options) {\n        var re = this.$assembleRegExp(options);\n        if (!re)\n            return false;\n\n        var callback;\n        if (options.$isMultiLine) {\n            var len = re.length;\n            var matchIterator = function(line, row, offset) {\n                var startIndex = line.search(re[0]);\n                if (startIndex == -1)\n                    return;\n                for (var i = 1; i < len; i++) {\n                    line = session.getLine(row + i);\n                    if (line.search(re[i]) == -1)\n                        return;\n                }\n\n                var endIndex = line.match(re[len - 1])[0].length;\n\n                var range = new Range(row, startIndex, row + len - 1, endIndex);\n                if (re.offset == 1) {\n                    range.start.row--;\n                    range.start.column = Number.MAX_VALUE;\n                } else if (offset)\n                    range.start.column += offset;\n\n                if (callback(range))\n                    return true;\n            };\n        } else if (options.backwards) {\n            var matchIterator = function(line, row, startIndex) {\n                var matches = lang.getMatchOffsets(line, re);\n                for (var i = matches.length-1; i >= 0; i--)\n                    if (callback(matches[i], row, startIndex))\n                        return true;\n            };\n        } else {\n            var matchIterator = function(line, row, startIndex) {\n                var matches = lang.getMatchOffsets(line, re);\n                for (var i = 0; i < matches.length; i++)\n                    if (callback(matches[i], row, startIndex))\n                        return true;\n            };\n        }\n        \n        var lineIterator = this.$lineIterator(session, options);\n\n        return {\n            forEach: function(_callback) {\n                callback = _callback;\n                lineIterator.forEach(matchIterator);\n            }\n        };\n    };\n\n    this.$assembleRegExp = function(options, $disableFakeMultiline) {\n        if (options.needle instanceof RegExp)\n            return options.re = options.needle;\n\n        var needle = options.needle;\n\n        if (!options.needle)\n            return options.re = false;\n\n        if (!options.regExp)\n            needle = lang.escapeRegExp(needle);\n\n        if (options.wholeWord)\n            needle = \"\\\\b\" + needle + \"\\\\b\";\n\n        var modifier = options.caseSensitive ? \"gm\" : \"gmi\";\n\n        options.$isMultiLine = !$disableFakeMultiline && /[\\n\\r]/.test(needle);\n        if (options.$isMultiLine)\n            return options.re = this.$assembleMultilineRegExp(needle, modifier);\n\n        try {\n            var re = new RegExp(needle, modifier);\n        } catch(e) {\n            re = false;\n        }\n        return options.re = re;\n    };\n\n    this.$assembleMultilineRegExp = function(needle, modifier) {\n        var parts = needle.replace(/\\r\\n|\\r|\\n/g, \"$\\n^\").split(\"\\n\");\n        var re = [];\n        for (var i = 0; i < parts.length; i++) try {\n            re.push(new RegExp(parts[i], modifier));\n        } catch(e) {\n            return false;\n        }\n        if (parts[0] == \"\") {\n            re.shift();\n            re.offset = 1;\n        } else {\n            re.offset = 0;\n        }\n        return re;\n    };\n\n    this.$lineIterator = function(session, options) {\n        var backwards = options.backwards == true;\n        var skipCurrent = options.skipCurrent != false;\n\n        var range = options.range;\n        var start = options.start;\n        if (!start)\n            start = range ? range[backwards ? \"end\" : \"start\"] : session.selection.getRange();\n         \n        if (start.start)\n            start = start[skipCurrent != backwards ? \"end\" : \"start\"];\n\n        var firstRow = range ? range.start.row : 0;\n        var lastRow = range ? range.end.row : session.getLength() - 1;\n\n        var forEach = backwards ? function(callback) {\n                var row = start.row;\n\n                var line = session.getLine(row).substring(0, start.column);\n                if (callback(line, row))\n                    return;\n\n                for (row--; row >= firstRow; row--)\n                    if (callback(session.getLine(row), row))\n                        return;\n\n                if (options.wrap == false)\n                    return;\n\n                for (row = lastRow, firstRow = start.row; row >= firstRow; row--)\n                    if (callback(session.getLine(row), row))\n                        return;\n            } : function(callback) {\n                var row = start.row;\n\n                var line = session.getLine(row).substr(start.column);\n                if (callback(line, row, start.column))\n                    return;\n\n                for (row = row+1; row <= lastRow; row++)\n                    if (callback(session.getLine(row), row))\n                        return;\n\n                if (options.wrap == false)\n                    return;\n\n                for (row = firstRow, lastRow = start.row; row <= lastRow; row++)\n                    if (callback(session.getLine(row), row))\n                        return;\n            };\n        \n        return {forEach: forEach};\n    };\n\n}).call(Search.prototype);\n\nexports.Search = Search;\n});\n\nace.define(\"ace/keyboard/hash_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\",\"ace/lib/useragent\"], function(require, exports, module) {\n\"use strict\";\n\nvar keyUtil = require(\"../lib/keys\");\nvar useragent = require(\"../lib/useragent\");\nvar KEY_MODS = keyUtil.KEY_MODS;\n\nfunction HashHandler(config, platform) {\n    this.platform = platform || (useragent.isMac ? \"mac\" : \"win\");\n    this.commands = {};\n    this.commandKeyBinding = {};\n    this.addCommands(config);\n    this.$singleCommand = true;\n}\n\nfunction MultiHashHandler(config, platform) {\n    HashHandler.call(this, config, platform);\n    this.$singleCommand = false;\n}\n\nMultiHashHandler.prototype = HashHandler.prototype;\n\n(function() {\n    \n\n    this.addCommand = function(command) {\n        if (this.commands[command.name])\n            this.removeCommand(command);\n\n        this.commands[command.name] = command;\n\n        if (command.bindKey)\n            this._buildKeyHash(command);\n    };\n\n    this.removeCommand = function(command, keepCommand) {\n        var name = command && (typeof command === 'string' ? command : command.name);\n        command = this.commands[name];\n        if (!keepCommand)\n            delete this.commands[name];\n        var ckb = this.commandKeyBinding;\n        for (var keyId in ckb) {\n            var cmdGroup = ckb[keyId];\n            if (cmdGroup == command) {\n                delete ckb[keyId];\n            } else if (Array.isArray(cmdGroup)) {\n                var i = cmdGroup.indexOf(command);\n                if (i != -1) {\n                    cmdGroup.splice(i, 1);\n                    if (cmdGroup.length == 1)\n                        ckb[keyId] = cmdGroup[0];\n                }\n            }\n        }\n    };\n\n    this.bindKey = function(key, command, asDefault) {\n        if (typeof key == \"object\")\n            key = key[this.platform];\n        if (!key)\n            return;\n        if (typeof command == \"function\")\n            return this.addCommand({exec: command, bindKey: key, name: command.name || key});\n        \n        key.split(\"|\").forEach(function(keyPart) {\n            var chain = \"\";\n            if (keyPart.indexOf(\" \") != -1) {\n                var parts = keyPart.split(/\\s+/);\n                keyPart = parts.pop();\n                parts.forEach(function(keyPart) {\n                    var binding = this.parseKeys(keyPart);\n                    var id = KEY_MODS[binding.hashId] + binding.key;\n                    chain += (chain ? \" \" : \"\") + id;\n                    this._addCommandToBinding(chain, \"chainKeys\");\n                }, this);\n                chain += \" \";\n            }\n            var binding = this.parseKeys(keyPart);\n            var id = KEY_MODS[binding.hashId] + binding.key;\n            this._addCommandToBinding(chain + id, command, asDefault);\n        }, this);\n    };\n    \n    this._addCommandToBinding = function(keyId, command, asDefault) {\n        var ckb = this.commandKeyBinding, i;\n        if (!command) {\n            delete ckb[keyId];\n        } else if (!ckb[keyId] || this.$singleCommand) {\n            ckb[keyId] = command;\n        } else {\n            if (!Array.isArray(ckb[keyId])) {\n                ckb[keyId] = [ckb[keyId]];\n            } else if ((i = ckb[keyId].indexOf(command)) != -1) {\n                ckb[keyId].splice(i, 1);\n            }\n            \n            if (asDefault || command.isDefault)\n                ckb[keyId].unshift(command);\n            else\n                ckb[keyId].push(command);\n        }\n    };\n\n    this.addCommands = function(commands) {\n        commands && Object.keys(commands).forEach(function(name) {\n            var command = commands[name];\n            if (!command)\n                return;\n            \n            if (typeof command === \"string\")\n                return this.bindKey(command, name);\n\n            if (typeof command === \"function\")\n                command = { exec: command };\n\n            if (typeof command !== \"object\")\n                return;\n\n            if (!command.name)\n                command.name = name;\n\n            this.addCommand(command);\n        }, this);\n    };\n\n    this.removeCommands = function(commands) {\n        Object.keys(commands).forEach(function(name) {\n            this.removeCommand(commands[name]);\n        }, this);\n    };\n\n    this.bindKeys = function(keyList) {\n        Object.keys(keyList).forEach(function(key) {\n            this.bindKey(key, keyList[key]);\n        }, this);\n    };\n\n    this._buildKeyHash = function(command) {\n        this.bindKey(command.bindKey, command);\n    };\n    this.parseKeys = function(keys) {\n        var parts = keys.toLowerCase().split(/[\\-\\+]([\\-\\+])?/).filter(function(x){return x});\n        var key = parts.pop();\n\n        var keyCode = keyUtil[key];\n        if (keyUtil.FUNCTION_KEYS[keyCode])\n            key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase();\n        else if (!parts.length)\n            return {key: key, hashId: -1};\n        else if (parts.length == 1 && parts[0] == \"shift\")\n            return {key: key.toUpperCase(), hashId: -1};\n\n        var hashId = 0;\n        for (var i = parts.length; i--;) {\n            var modifier = keyUtil.KEY_MODS[parts[i]];\n            if (modifier == null) {\n                if (typeof console != \"undefined\")\n                    console.error(\"invalid modifier \" + parts[i] + \" in \" + keys);\n                return false;\n            }\n            hashId |= modifier;\n        }\n        return {key: key, hashId: hashId};\n    };\n\n    this.findKeyCommand = function findKeyCommand(hashId, keyString) {\n        var key = KEY_MODS[hashId] + keyString;\n        return this.commandKeyBinding[key];\n    };\n\n    this.handleKeyboard = function(data, hashId, keyString, keyCode) {\n        var key = KEY_MODS[hashId] + keyString;\n        var command = this.commandKeyBinding[key];\n        if (data.$keyChain) {\n            data.$keyChain += \" \" + key;\n            command = this.commandKeyBinding[data.$keyChain] || command;\n        }\n        \n        if (command) {\n            if (command == \"chainKeys\" || command[command.length - 1] == \"chainKeys\") {\n                data.$keyChain = data.$keyChain || key;\n                return {command: \"null\"};\n            }\n        }\n        \n        if (data.$keyChain && keyCode > 0)\n            data.$keyChain = \"\";\n        return {command: command};\n    };\n\n}).call(HashHandler.prototype);\n\nexports.HashHandler = HashHandler;\nexports.MultiHashHandler = MultiHashHandler;\n});\n\nace.define(\"ace/commands/command_manager\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/keyboard/hash_handler\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar MultiHashHandler = require(\"../keyboard/hash_handler\").MultiHashHandler;\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar CommandManager = function(platform, commands) {\n    MultiHashHandler.call(this, commands, platform);\n    this.byName = this.commands;\n    this.setDefaultHandler(\"exec\", function(e) {\n        return e.command.exec(e.editor, e.args || {});\n    });\n};\n\noop.inherits(CommandManager, MultiHashHandler);\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n\n    this.exec = function(command, editor, args) {\n        if (Array.isArray(command)) {\n            for (var i = command.length; i--; ) {\n                if (this.exec(command[i], editor, args)) return true;\n            }\n            return false;\n        }\n        \n        if (typeof command === \"string\")\n            command = this.commands[command];\n\n        if (!command)\n            return false;\n\n        if (editor && editor.$readOnly && !command.readOnly)\n            return false;\n\n        var e = {editor: editor, command: command, args: args};\n        e.returnValue = this._emit(\"exec\", e);\n        this._signal(\"afterExec\", e);\n\n        return e.returnValue === false ? false : true;\n    };\n\n    this.toggleRecording = function(editor) {\n        if (this.$inReplay)\n            return;\n\n        editor && editor._emit(\"changeStatus\");\n        if (this.recording) {\n            this.macro.pop();\n            this.removeEventListener(\"exec\", this.$addCommandToMacro);\n\n            if (!this.macro.length)\n                this.macro = this.oldMacro;\n\n            return this.recording = false;\n        }\n        if (!this.$addCommandToMacro) {\n            this.$addCommandToMacro = function(e) {\n                this.macro.push([e.command, e.args]);\n            }.bind(this);\n        }\n\n        this.oldMacro = this.macro;\n        this.macro = [];\n        this.on(\"exec\", this.$addCommandToMacro);\n        return this.recording = true;\n    };\n\n    this.replay = function(editor) {\n        if (this.$inReplay || !this.macro)\n            return;\n\n        if (this.recording)\n            return this.toggleRecording(editor);\n\n        try {\n            this.$inReplay = true;\n            this.macro.forEach(function(x) {\n                if (typeof x == \"string\")\n                    this.exec(x, editor);\n                else\n                    this.exec(x[0], editor, x[1]);\n            }, this);\n        } finally {\n            this.$inReplay = false;\n        }\n    };\n\n    this.trimMacro = function(m) {\n        return m.map(function(x){\n            if (typeof x[0] != \"string\")\n                x[0] = x[0].name;\n            if (!x[1])\n                x = x[0];\n            return x;\n        });\n    };\n\n}).call(CommandManager.prototype);\n\nexports.CommandManager = CommandManager;\n\n});\n\nace.define(\"ace/commands/default_commands\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\",\"ace/config\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar lang = require(\"../lib/lang\");\nvar config = require(\"../config\");\nvar Range = require(\"../range\").Range;\n\nfunction bindKey(win, mac) {\n    return {win: win, mac: mac};\n}\nexports.commands = [{\n    name: \"showSettingsMenu\",\n    bindKey: bindKey(\"Ctrl-,\", \"Command-,\"),\n    exec: function(editor) {\n        config.loadModule(\"ace/ext/settings_menu\", function(module) {\n            module.init(editor);\n            editor.showSettingsMenu();\n        });\n    },\n    readOnly: true\n}, {\n    name: \"goToNextError\",\n    bindKey: bindKey(\"Alt-E\", \"Ctrl-E\"),\n    exec: function(editor) {\n        config.loadModule(\"ace/ext/error_marker\", function(module) {\n            module.showErrorMarker(editor, 1);\n        });\n    },\n    scrollIntoView: \"animate\",\n    readOnly: true\n}, {\n    name: \"goToPreviousError\",\n    bindKey: bindKey(\"Alt-Shift-E\", \"Ctrl-Shift-E\"),\n    exec: function(editor) {\n        config.loadModule(\"ace/ext/error_marker\", function(module) {\n            module.showErrorMarker(editor, -1);\n        });\n    },\n    scrollIntoView: \"animate\",\n    readOnly: true\n}, {\n    name: \"selectall\",\n    bindKey: bindKey(\"Ctrl-A\", \"Command-A\"),\n    exec: function(editor) { editor.selectAll(); },\n    readOnly: true\n}, {\n    name: \"centerselection\",\n    bindKey: bindKey(null, \"Ctrl-L\"),\n    exec: function(editor) { editor.centerSelection(); },\n    readOnly: true\n}, {\n    name: \"gotoline\",\n    bindKey: bindKey(\"Ctrl-L\", \"Command-L\"),\n    exec: function(editor) {\n        var line = parseInt(prompt(\"Enter line number:\"), 10);\n        if (!isNaN(line)) {\n            editor.gotoLine(line);\n        }\n    },\n    readOnly: true\n}, {\n    name: \"fold\",\n    bindKey: bindKey(\"Alt-L|Ctrl-F1\", \"Command-Alt-L|Command-F1\"),\n    exec: function(editor) { editor.session.toggleFold(false); },\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"unfold\",\n    bindKey: bindKey(\"Alt-Shift-L|Ctrl-Shift-F1\", \"Command-Alt-Shift-L|Command-Shift-F1\"),\n    exec: function(editor) { editor.session.toggleFold(true); },\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"toggleFoldWidget\",\n    bindKey: bindKey(\"F2\", \"F2\"),\n    exec: function(editor) { editor.session.toggleFoldWidget(); },\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"toggleParentFoldWidget\",\n    bindKey: bindKey(\"Alt-F2\", \"Alt-F2\"),\n    exec: function(editor) { editor.session.toggleFoldWidget(true); },\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"foldall\",\n    bindKey: bindKey(\"Ctrl-Alt-0\", \"Ctrl-Command-Option-0\"),\n    exec: function(editor) { editor.session.foldAll(); },\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"foldOther\",\n    bindKey: bindKey(\"Alt-0\", \"Command-Option-0\"),\n    exec: function(editor) { \n        editor.session.foldAll();\n        editor.session.unfold(editor.selection.getAllRanges());\n    },\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"unfoldall\",\n    bindKey: bindKey(\"Alt-Shift-0\", \"Command-Option-Shift-0\"),\n    exec: function(editor) { editor.session.unfold(); },\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"findnext\",\n    bindKey: bindKey(\"Ctrl-K\", \"Command-G\"),\n    exec: function(editor) { editor.findNext(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"findprevious\",\n    bindKey: bindKey(\"Ctrl-Shift-K\", \"Command-Shift-G\"),\n    exec: function(editor) { editor.findPrevious(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"center\",\n    readOnly: true\n}, {\n    name: \"selectOrFindNext\",\n    bindKey: bindKey(\"Alt-K\", \"Ctrl-G\"),\n    exec: function(editor) {\n        if (editor.selection.isEmpty())\n            editor.selection.selectWord();\n        else\n            editor.findNext(); \n    },\n    readOnly: true\n}, {\n    name: \"selectOrFindPrevious\",\n    bindKey: bindKey(\"Alt-Shift-K\", \"Ctrl-Shift-G\"),\n    exec: function(editor) { \n        if (editor.selection.isEmpty())\n            editor.selection.selectWord();\n        else\n            editor.findPrevious();\n    },\n    readOnly: true\n}, {\n    name: \"find\",\n    bindKey: bindKey(\"Ctrl-F\", \"Command-F\"),\n    exec: function(editor) {\n        config.loadModule(\"ace/ext/searchbox\", function(e) {e.Search(editor)});\n    },\n    readOnly: true\n}, {\n    name: \"overwrite\",\n    bindKey: \"Insert\",\n    exec: function(editor) { editor.toggleOverwrite(); },\n    readOnly: true\n}, {\n    name: \"selecttostart\",\n    bindKey: bindKey(\"Ctrl-Shift-Home\", \"Command-Shift-Up\"),\n    exec: function(editor) { editor.getSelection().selectFileStart(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true,\n    scrollIntoView: \"animate\",\n    aceCommandGroup: \"fileJump\"\n}, {\n    name: \"gotostart\",\n    bindKey: bindKey(\"Ctrl-Home\", \"Command-Home|Command-Up\"),\n    exec: function(editor) { editor.navigateFileStart(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true,\n    scrollIntoView: \"animate\",\n    aceCommandGroup: \"fileJump\"\n}, {\n    name: \"selectup\",\n    bindKey: bindKey(\"Shift-Up\", \"Shift-Up\"),\n    exec: function(editor) { editor.getSelection().selectUp(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"golineup\",\n    bindKey: bindKey(\"Up\", \"Up|Ctrl-P\"),\n    exec: function(editor, args) { editor.navigateUp(args.times); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selecttoend\",\n    bindKey: bindKey(\"Ctrl-Shift-End\", \"Command-Shift-Down\"),\n    exec: function(editor) { editor.getSelection().selectFileEnd(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true,\n    scrollIntoView: \"animate\",\n    aceCommandGroup: \"fileJump\"\n}, {\n    name: \"gotoend\",\n    bindKey: bindKey(\"Ctrl-End\", \"Command-End|Command-Down\"),\n    exec: function(editor) { editor.navigateFileEnd(); },\n    multiSelectAction: \"forEach\",\n    readOnly: true,\n    scrollIntoView: \"animate\",\n    aceCommandGroup: \"fileJump\"\n}, {\n    name: \"selectdown\",\n    bindKey: bindKey(\"Shift-Down\", \"Shift-Down\"),\n    exec: function(editor) { editor.getSelection().selectDown(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"golinedown\",\n    bindKey: bindKey(\"Down\", \"Down|Ctrl-N\"),\n    exec: function(editor, args) { editor.navigateDown(args.times); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectwordleft\",\n    bindKey: bindKey(\"Ctrl-Shift-Left\", \"Option-Shift-Left\"),\n    exec: function(editor) { editor.getSelection().selectWordLeft(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"gotowordleft\",\n    bindKey: bindKey(\"Ctrl-Left\", \"Option-Left\"),\n    exec: function(editor) { editor.navigateWordLeft(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selecttolinestart\",\n    bindKey: bindKey(\"Alt-Shift-Left\", \"Command-Shift-Left\"),\n    exec: function(editor) { editor.getSelection().selectLineStart(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"gotolinestart\",\n    bindKey: bindKey(\"Alt-Left|Home\", \"Command-Left|Home|Ctrl-A\"),\n    exec: function(editor) { editor.navigateLineStart(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectleft\",\n    bindKey: bindKey(\"Shift-Left\", \"Shift-Left\"),\n    exec: function(editor) { editor.getSelection().selectLeft(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"gotoleft\",\n    bindKey: bindKey(\"Left\", \"Left|Ctrl-B\"),\n    exec: function(editor, args) { editor.navigateLeft(args.times); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectwordright\",\n    bindKey: bindKey(\"Ctrl-Shift-Right\", \"Option-Shift-Right\"),\n    exec: function(editor) { editor.getSelection().selectWordRight(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"gotowordright\",\n    bindKey: bindKey(\"Ctrl-Right\", \"Option-Right\"),\n    exec: function(editor) { editor.navigateWordRight(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selecttolineend\",\n    bindKey: bindKey(\"Alt-Shift-Right\", \"Command-Shift-Right\"),\n    exec: function(editor) { editor.getSelection().selectLineEnd(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"gotolineend\",\n    bindKey: bindKey(\"Alt-Right|End\", \"Command-Right|End|Ctrl-E\"),\n    exec: function(editor) { editor.navigateLineEnd(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectright\",\n    bindKey: bindKey(\"Shift-Right\", \"Shift-Right\"),\n    exec: function(editor) { editor.getSelection().selectRight(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"gotoright\",\n    bindKey: bindKey(\"Right\", \"Right|Ctrl-F\"),\n    exec: function(editor, args) { editor.navigateRight(args.times); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectpagedown\",\n    bindKey: \"Shift-PageDown\",\n    exec: function(editor) { editor.selectPageDown(); },\n    readOnly: true\n}, {\n    name: \"pagedown\",\n    bindKey: bindKey(null, \"Option-PageDown\"),\n    exec: function(editor) { editor.scrollPageDown(); },\n    readOnly: true\n}, {\n    name: \"gotopagedown\",\n    bindKey: bindKey(\"PageDown\", \"PageDown|Ctrl-V\"),\n    exec: function(editor) { editor.gotoPageDown(); },\n    readOnly: true\n}, {\n    name: \"selectpageup\",\n    bindKey: \"Shift-PageUp\",\n    exec: function(editor) { editor.selectPageUp(); },\n    readOnly: true\n}, {\n    name: \"pageup\",\n    bindKey: bindKey(null, \"Option-PageUp\"),\n    exec: function(editor) { editor.scrollPageUp(); },\n    readOnly: true\n}, {\n    name: \"gotopageup\",\n    bindKey: \"PageUp\",\n    exec: function(editor) { editor.gotoPageUp(); },\n    readOnly: true\n}, {\n    name: \"scrollup\",\n    bindKey: bindKey(\"Ctrl-Up\", null),\n    exec: function(e) { e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight); },\n    readOnly: true\n}, {\n    name: \"scrolldown\",\n    bindKey: bindKey(\"Ctrl-Down\", null),\n    exec: function(e) { e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight); },\n    readOnly: true\n}, {\n    name: \"selectlinestart\",\n    bindKey: \"Shift-Home\",\n    exec: function(editor) { editor.getSelection().selectLineStart(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"selectlineend\",\n    bindKey: \"Shift-End\",\n    exec: function(editor) { editor.getSelection().selectLineEnd(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"togglerecording\",\n    bindKey: bindKey(\"Ctrl-Alt-E\", \"Command-Option-E\"),\n    exec: function(editor) { editor.commands.toggleRecording(editor); },\n    readOnly: true\n}, {\n    name: \"replaymacro\",\n    bindKey: bindKey(\"Ctrl-Shift-E\", \"Command-Shift-E\"),\n    exec: function(editor) { editor.commands.replay(editor); },\n    readOnly: true\n}, {\n    name: \"jumptomatching\",\n    bindKey: bindKey(\"Ctrl-P\", \"Ctrl-P\"),\n    exec: function(editor) { editor.jumpToMatching(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"animate\",\n    readOnly: true\n}, {\n    name: \"selecttomatching\",\n    bindKey: bindKey(\"Ctrl-Shift-P\", \"Ctrl-Shift-P\"),\n    exec: function(editor) { editor.jumpToMatching(true); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"animate\",\n    readOnly: true\n}, {\n    name: \"expandToMatching\",\n    bindKey: bindKey(\"Ctrl-Shift-M\", \"Ctrl-Shift-M\"),\n    exec: function(editor) { editor.jumpToMatching(true, true); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"animate\",\n    readOnly: true\n}, {\n    name: \"passKeysToBrowser\",\n    bindKey: bindKey(\"null\", \"null\"),\n    exec: function() {},\n    passEvent: true,\n    readOnly: true\n},\n{\n    name: \"cut\",\n    exec: function(editor) {\n        var range = editor.getSelectionRange();\n        editor._emit(\"cut\", range);\n\n        if (!editor.selection.isEmpty()) {\n            editor.session.remove(range);\n            editor.clearSelection();\n        }\n    },\n    scrollIntoView: \"cursor\",\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"removeline\",\n    bindKey: bindKey(\"Ctrl-D\", \"Command-D\"),\n    exec: function(editor) { editor.removeLines(); },\n    scrollIntoView: \"cursor\",\n    multiSelectAction: \"forEachLine\"\n}, {\n    name: \"duplicateSelection\",\n    bindKey: bindKey(\"Ctrl-Shift-D\", \"Command-Shift-D\"),\n    exec: function(editor) { editor.duplicateSelection(); },\n    scrollIntoView: \"cursor\",\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"sortlines\",\n    bindKey: bindKey(\"Ctrl-Alt-S\", \"Command-Alt-S\"),\n    exec: function(editor) { editor.sortLines(); },\n    scrollIntoView: \"selection\",\n    multiSelectAction: \"forEachLine\"\n}, {\n    name: \"togglecomment\",\n    bindKey: bindKey(\"Ctrl-/\", \"Command-/\"),\n    exec: function(editor) { editor.toggleCommentLines(); },\n    multiSelectAction: \"forEachLine\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"toggleBlockComment\",\n    bindKey: bindKey(\"Ctrl-Shift-/\", \"Command-Shift-/\"),\n    exec: function(editor) { editor.toggleBlockComment(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"modifyNumberUp\",\n    bindKey: bindKey(\"Ctrl-Shift-Up\", \"Alt-Shift-Up\"),\n    exec: function(editor) { editor.modifyNumber(1); },\n    scrollIntoView: \"cursor\",\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"modifyNumberDown\",\n    bindKey: bindKey(\"Ctrl-Shift-Down\", \"Alt-Shift-Down\"),\n    exec: function(editor) { editor.modifyNumber(-1); },\n    scrollIntoView: \"cursor\",\n    multiSelectAction: \"forEach\"\n}, {\n    name: \"replace\",\n    bindKey: bindKey(\"Ctrl-H\", \"Command-Option-F\"),\n    exec: function(editor) {\n        config.loadModule(\"ace/ext/searchbox\", function(e) {e.Search(editor, true)});\n    }\n}, {\n    name: \"undo\",\n    bindKey: bindKey(\"Ctrl-Z\", \"Command-Z\"),\n    exec: function(editor) { editor.undo(); }\n}, {\n    name: \"redo\",\n    bindKey: bindKey(\"Ctrl-Shift-Z|Ctrl-Y\", \"Command-Shift-Z|Command-Y\"),\n    exec: function(editor) { editor.redo(); }\n}, {\n    name: \"copylinesup\",\n    bindKey: bindKey(\"Alt-Shift-Up\", \"Command-Option-Up\"),\n    exec: function(editor) { editor.copyLinesUp(); },\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"movelinesup\",\n    bindKey: bindKey(\"Alt-Up\", \"Option-Up\"),\n    exec: function(editor) { editor.moveLinesUp(); },\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"copylinesdown\",\n    bindKey: bindKey(\"Alt-Shift-Down\", \"Command-Option-Down\"),\n    exec: function(editor) { editor.copyLinesDown(); },\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"movelinesdown\",\n    bindKey: bindKey(\"Alt-Down\", \"Option-Down\"),\n    exec: function(editor) { editor.moveLinesDown(); },\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"del\",\n    bindKey: bindKey(\"Delete\", \"Delete|Ctrl-D|Shift-Delete\"),\n    exec: function(editor) { editor.remove(\"right\"); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"backspace\",\n    bindKey: bindKey(\n        \"Shift-Backspace|Backspace\",\n        \"Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H\"\n    ),\n    exec: function(editor) { editor.remove(\"left\"); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"cut_or_delete\",\n    bindKey: bindKey(\"Shift-Delete\", null),\n    exec: function(editor) { \n        if (editor.selection.isEmpty()) {\n            editor.remove(\"left\");\n        } else {\n            return false;\n        }\n    },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"removetolinestart\",\n    bindKey: bindKey(\"Alt-Backspace\", \"Command-Backspace\"),\n    exec: function(editor) { editor.removeToLineStart(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"removetolineend\",\n    bindKey: bindKey(\"Alt-Delete\", \"Ctrl-K\"),\n    exec: function(editor) { editor.removeToLineEnd(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"removewordleft\",\n    bindKey: bindKey(\"Ctrl-Backspace\", \"Alt-Backspace|Ctrl-Alt-Backspace\"),\n    exec: function(editor) { editor.removeWordLeft(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"removewordright\",\n    bindKey: bindKey(\"Ctrl-Delete\", \"Alt-Delete\"),\n    exec: function(editor) { editor.removeWordRight(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"outdent\",\n    bindKey: bindKey(\"Shift-Tab\", \"Shift-Tab\"),\n    exec: function(editor) { editor.blockOutdent(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"indent\",\n    bindKey: bindKey(\"Tab\", \"Tab\"),\n    exec: function(editor) { editor.indent(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"blockoutdent\",\n    bindKey: bindKey(\"Ctrl-[\", \"Ctrl-[\"),\n    exec: function(editor) { editor.blockOutdent(); },\n    multiSelectAction: \"forEachLine\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"blockindent\",\n    bindKey: bindKey(\"Ctrl-]\", \"Ctrl-]\"),\n    exec: function(editor) { editor.blockIndent(); },\n    multiSelectAction: \"forEachLine\",\n    scrollIntoView: \"selectionPart\"\n}, {\n    name: \"insertstring\",\n    exec: function(editor, str) { editor.insert(str); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"inserttext\",\n    exec: function(editor, args) {\n        editor.insert(lang.stringRepeat(args.text  || \"\", args.times || 1));\n    },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"splitline\",\n    bindKey: bindKey(null, \"Ctrl-O\"),\n    exec: function(editor) { editor.splitLine(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"transposeletters\",\n    bindKey: bindKey(\"Ctrl-T\", \"Ctrl-T\"),\n    exec: function(editor) { editor.transposeLetters(); },\n    multiSelectAction: function(editor) {editor.transposeSelections(1); },\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"touppercase\",\n    bindKey: bindKey(\"Ctrl-U\", \"Ctrl-U\"),\n    exec: function(editor) { editor.toUpperCase(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"tolowercase\",\n    bindKey: bindKey(\"Ctrl-Shift-U\", \"Ctrl-Shift-U\"),\n    exec: function(editor) { editor.toLowerCase(); },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"expandtoline\",\n    bindKey: bindKey(\"Ctrl-Shift-L\", \"Command-Shift-L\"),\n    exec: function(editor) {\n        var range = editor.selection.getRange();\n\n        range.start.column = range.end.column = 0;\n        range.end.row++;\n        editor.selection.setRange(range, false);\n    },\n    multiSelectAction: \"forEach\",\n    scrollIntoView: \"cursor\",\n    readOnly: true\n}, {\n    name: \"joinlines\",\n    bindKey: bindKey(null, null),\n    exec: function(editor) {\n        var isBackwards = editor.selection.isBackwards();\n        var selectionStart = isBackwards ? editor.selection.getSelectionLead() : editor.selection.getSelectionAnchor();\n        var selectionEnd = isBackwards ? editor.selection.getSelectionAnchor() : editor.selection.getSelectionLead();\n        var firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length;\n        var selectedText = editor.session.doc.getTextRange(editor.selection.getRange());\n        var selectedCount = selectedText.replace(/\\n\\s*/, \" \").length;\n        var insertLine = editor.session.doc.getLine(selectionStart.row);\n\n        for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) {\n            var curLine = lang.stringTrimLeft(lang.stringTrimRight(editor.session.doc.getLine(i)));\n            if (curLine.length !== 0) {\n                curLine = \" \" + curLine;\n            }\n            insertLine += curLine;\n        }\n\n        if (selectionEnd.row + 1 < (editor.session.doc.getLength() - 1)) {\n            insertLine += editor.session.doc.getNewLineCharacter();\n        }\n\n        editor.clearSelection();\n        editor.session.doc.replace(new Range(selectionStart.row, 0, selectionEnd.row + 2, 0), insertLine);\n\n        if (selectedCount > 0) {\n            editor.selection.moveCursorTo(selectionStart.row, selectionStart.column);\n            editor.selection.selectTo(selectionStart.row, selectionStart.column + selectedCount);\n        } else {\n            firstLineEndCol = editor.session.doc.getLine(selectionStart.row).length > firstLineEndCol ? (firstLineEndCol + 1) : firstLineEndCol;\n            editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol);\n        }\n    },\n    multiSelectAction: \"forEach\",\n    readOnly: true\n}, {\n    name: \"invertSelection\",\n    bindKey: bindKey(null, null),\n    exec: function(editor) {\n        var endRow = editor.session.doc.getLength() - 1;\n        var endCol = editor.session.doc.getLine(endRow).length;\n        var ranges = editor.selection.rangeList.ranges;\n        var newRanges = [];\n        if (ranges.length < 1) {\n            ranges = [editor.selection.getRange()];\n        }\n\n        for (var i = 0; i < ranges.length; i++) {\n            if (i == (ranges.length - 1)) {\n                if (!(ranges[i].end.row === endRow && ranges[i].end.column === endCol)) {\n                    newRanges.push(new Range(ranges[i].end.row, ranges[i].end.column, endRow, endCol));\n                }\n            }\n\n            if (i === 0) {\n                if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) {\n                    newRanges.push(new Range(0, 0, ranges[i].start.row, ranges[i].start.column));\n                }\n            } else {\n                newRanges.push(new Range(ranges[i-1].end.row, ranges[i-1].end.column, ranges[i].start.row, ranges[i].start.column));\n            }\n        }\n\n        editor.exitMultiSelectMode();\n        editor.clearSelection();\n\n        for(var i = 0; i < newRanges.length; i++) {\n            editor.selection.addRange(newRanges[i], false);\n        }\n    },\n    readOnly: true,\n    scrollIntoView: \"none\"\n}];\n\n});\n\nace.define(\"ace/editor\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/keyboard/textinput\",\"ace/mouse/mouse_handler\",\"ace/mouse/fold_handler\",\"ace/keyboard/keybinding\",\"ace/edit_session\",\"ace/search\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/commands/command_manager\",\"ace/commands/default_commands\",\"ace/config\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nrequire(\"./lib/fixoldbrowsers\");\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nvar lang = require(\"./lib/lang\");\nvar useragent = require(\"./lib/useragent\");\nvar TextInput = require(\"./keyboard/textinput\").TextInput;\nvar MouseHandler = require(\"./mouse/mouse_handler\").MouseHandler;\nvar FoldHandler = require(\"./mouse/fold_handler\").FoldHandler;\nvar KeyBinding = require(\"./keyboard/keybinding\").KeyBinding;\nvar EditSession = require(\"./edit_session\").EditSession;\nvar Search = require(\"./search\").Search;\nvar Range = require(\"./range\").Range;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar CommandManager = require(\"./commands/command_manager\").CommandManager;\nvar defaultCommands = require(\"./commands/default_commands\").commands;\nvar config = require(\"./config\");\nvar TokenIterator = require(\"./token_iterator\").TokenIterator;\nvar Editor = function(renderer, session) {\n    var container = renderer.getContainerElement();\n    this.container = container;\n    this.renderer = renderer;\n\n    this.commands = new CommandManager(useragent.isMac ? \"mac\" : \"win\", defaultCommands);\n    this.textInput  = new TextInput(renderer.getTextAreaContainer(), this);\n    this.renderer.textarea = this.textInput.getElement();\n    this.keyBinding = new KeyBinding(this);\n    this.$mouseHandler = new MouseHandler(this);\n    new FoldHandler(this);\n\n    this.$blockScrolling = 0;\n    this.$search = new Search().set({\n        wrap: true\n    });\n\n    this.$historyTracker = this.$historyTracker.bind(this);\n    this.commands.on(\"exec\", this.$historyTracker);\n\n    this.$initOperationListeners();\n    \n    this._$emitInputEvent = lang.delayedCall(function() {\n        this._signal(\"input\", {});\n        if (this.session && this.session.bgTokenizer)\n            this.session.bgTokenizer.scheduleStart();\n    }.bind(this));\n    \n    this.on(\"change\", function(_, _self) {\n        _self._$emitInputEvent.schedule(31);\n    });\n\n    this.setSession(session || new EditSession(\"\"));\n    config.resetOptions(this);\n    config._signal(\"editor\", this);\n};\n\n(function(){\n\n    oop.implement(this, EventEmitter);\n\n    this.$initOperationListeners = function() {\n        function last(a) {return a[a.length - 1]}\n\n        this.selections = [];\n        this.commands.on(\"exec\", this.startOperation.bind(this), true);\n        this.commands.on(\"afterExec\", this.endOperation.bind(this), true);\n\n        this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this));\n\n        this.on(\"change\", function() {\n            this.curOp || this.startOperation();\n            this.curOp.docChanged = true;\n        }.bind(this), true);\n\n        this.on(\"changeSelection\", function() {\n            this.curOp || this.startOperation();\n            this.curOp.selectionChanged = true;\n        }.bind(this), true);\n    };\n\n    this.curOp = null;\n    this.prevOp = {};\n    this.startOperation = function(commadEvent) {\n        if (this.curOp) {\n            if (!commadEvent || this.curOp.command)\n                return;\n            this.prevOp = this.curOp;\n        }\n        if (!commadEvent) {\n            this.previousCommand = null;\n            commadEvent = {};\n        }\n\n        this.$opResetTimer.schedule();\n        this.curOp = {\n            command: commadEvent.command || {},\n            args: commadEvent.args,\n            scrollTop: this.renderer.scrollTop\n        };\n        if (this.curOp.command.name)\n            this.$blockScrolling++;\n    };\n\n    this.endOperation = function(e) {\n        if (this.curOp) {\n            if (e && e.returnValue === false)\n                return this.curOp = null;\n            this._signal(\"beforeEndOperation\");\n            var command = this.curOp.command;\n            if (command.name && this.$blockScrolling)\n                this.$blockScrolling--;\n            if (command && command.scrollIntoView) {\n                switch (command.scrollIntoView) {\n                    case \"center\":\n                        this.renderer.scrollCursorIntoView(null, 0.5);\n                        break;\n                    case \"animate\":\n                    case \"cursor\":\n                        this.renderer.scrollCursorIntoView();\n                        break;\n                    case \"selectionPart\":\n                        var range = this.selection.getRange();\n                        var config = this.renderer.layerConfig;\n                        if (range.start.row >= config.lastRow || range.end.row <= config.firstRow) {\n                            this.renderer.scrollSelectionIntoView(this.selection.anchor, this.selection.lead);\n                        }\n                        break;\n                    default:\n                        break;\n                }\n                if (command.scrollIntoView == \"animate\")\n                    this.renderer.animateScrolling(this.curOp.scrollTop);\n            }\n            \n            this.prevOp = this.curOp;\n            this.curOp = null;\n        }\n    };\n    this.$mergeableCommands = [\"backspace\", \"del\", \"insertstring\"];\n    this.$historyTracker = function(e) {\n        if (!this.$mergeUndoDeltas)\n            return;\n\n        var prev = this.prevOp;\n        var mergeableCommands = this.$mergeableCommands;\n        var shouldMerge = prev.command && (e.command.name == prev.command.name);\n        if (e.command.name == \"insertstring\") {\n            var text = e.args;\n            if (this.mergeNextCommand === undefined)\n                this.mergeNextCommand = true;\n\n            shouldMerge = shouldMerge\n                && this.mergeNextCommand // previous command allows to coalesce with\n                && (!/\\s/.test(text) || /\\s/.test(prev.args)); // previous insertion was of same type\n\n            this.mergeNextCommand = true;\n        } else {\n            shouldMerge = shouldMerge\n                && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable\n        }\n\n        if (\n            this.$mergeUndoDeltas != \"always\"\n            && Date.now() - this.sequenceStartTime > 2000\n        ) {\n            shouldMerge = false; // the sequence is too long\n        }\n\n        if (shouldMerge)\n            this.session.mergeUndoDeltas = true;\n        else if (mergeableCommands.indexOf(e.command.name) !== -1)\n            this.sequenceStartTime = Date.now();\n    };\n    this.setKeyboardHandler = function(keyboardHandler, cb) {\n        if (keyboardHandler && typeof keyboardHandler === \"string\") {\n            this.$keybindingId = keyboardHandler;\n            var _self = this;\n            config.loadModule([\"keybinding\", keyboardHandler], function(module) {\n                if (_self.$keybindingId == keyboardHandler)\n                    _self.keyBinding.setKeyboardHandler(module && module.handler);\n                cb && cb();\n            });\n        } else {\n            this.$keybindingId = null;\n            this.keyBinding.setKeyboardHandler(keyboardHandler);\n            cb && cb();\n        }\n    };\n    this.getKeyboardHandler = function() {\n        return this.keyBinding.getKeyboardHandler();\n    };\n    this.setSession = function(session) {\n        if (this.session == session)\n            return;\n\n        var oldSession = this.session;\n        if (oldSession) {\n            this.session.removeEventListener(\"change\", this.$onDocumentChange);\n            this.session.removeEventListener(\"changeMode\", this.$onChangeMode);\n            this.session.removeEventListener(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n            this.session.removeEventListener(\"changeTabSize\", this.$onChangeTabSize);\n            this.session.removeEventListener(\"changeWrapLimit\", this.$onChangeWrapLimit);\n            this.session.removeEventListener(\"changeWrapMode\", this.$onChangeWrapMode);\n            this.session.removeEventListener(\"onChangeFold\", this.$onChangeFold);\n            this.session.removeEventListener(\"changeFrontMarker\", this.$onChangeFrontMarker);\n            this.session.removeEventListener(\"changeBackMarker\", this.$onChangeBackMarker);\n            this.session.removeEventListener(\"changeBreakpoint\", this.$onChangeBreakpoint);\n            this.session.removeEventListener(\"changeAnnotation\", this.$onChangeAnnotation);\n            this.session.removeEventListener(\"changeOverwrite\", this.$onCursorChange);\n            this.session.removeEventListener(\"changeScrollTop\", this.$onScrollTopChange);\n            this.session.removeEventListener(\"changeScrollLeft\", this.$onScrollLeftChange);\n\n            var selection = this.session.getSelection();\n            selection.removeEventListener(\"changeCursor\", this.$onCursorChange);\n            selection.removeEventListener(\"changeSelection\", this.$onSelectionChange);\n        }\n\n        this.session = session;\n        if (session) {\n            this.$onDocumentChange = this.onDocumentChange.bind(this);\n            session.addEventListener(\"change\", this.$onDocumentChange);\n            this.renderer.setSession(session);\n    \n            this.$onChangeMode = this.onChangeMode.bind(this);\n            session.addEventListener(\"changeMode\", this.$onChangeMode);\n    \n            this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this);\n            session.addEventListener(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n    \n            this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(this.renderer);\n            session.addEventListener(\"changeTabSize\", this.$onChangeTabSize);\n    \n            this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this);\n            session.addEventListener(\"changeWrapLimit\", this.$onChangeWrapLimit);\n    \n            this.$onChangeWrapMode = this.onChangeWrapMode.bind(this);\n            session.addEventListener(\"changeWrapMode\", this.$onChangeWrapMode);\n    \n            this.$onChangeFold = this.onChangeFold.bind(this);\n            session.addEventListener(\"changeFold\", this.$onChangeFold);\n    \n            this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this);\n            this.session.addEventListener(\"changeFrontMarker\", this.$onChangeFrontMarker);\n    \n            this.$onChangeBackMarker = this.onChangeBackMarker.bind(this);\n            this.session.addEventListener(\"changeBackMarker\", this.$onChangeBackMarker);\n    \n            this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this);\n            this.session.addEventListener(\"changeBreakpoint\", this.$onChangeBreakpoint);\n    \n            this.$onChangeAnnotation = this.onChangeAnnotation.bind(this);\n            this.session.addEventListener(\"changeAnnotation\", this.$onChangeAnnotation);\n    \n            this.$onCursorChange = this.onCursorChange.bind(this);\n            this.session.addEventListener(\"changeOverwrite\", this.$onCursorChange);\n    \n            this.$onScrollTopChange = this.onScrollTopChange.bind(this);\n            this.session.addEventListener(\"changeScrollTop\", this.$onScrollTopChange);\n    \n            this.$onScrollLeftChange = this.onScrollLeftChange.bind(this);\n            this.session.addEventListener(\"changeScrollLeft\", this.$onScrollLeftChange);\n    \n            this.selection = session.getSelection();\n            this.selection.addEventListener(\"changeCursor\", this.$onCursorChange);\n    \n            this.$onSelectionChange = this.onSelectionChange.bind(this);\n            this.selection.addEventListener(\"changeSelection\", this.$onSelectionChange);\n    \n            this.onChangeMode();\n    \n            this.$blockScrolling += 1;\n            this.onCursorChange();\n            this.$blockScrolling -= 1;\n    \n            this.onScrollTopChange();\n            this.onScrollLeftChange();\n            this.onSelectionChange();\n            this.onChangeFrontMarker();\n            this.onChangeBackMarker();\n            this.onChangeBreakpoint();\n            this.onChangeAnnotation();\n            this.session.getUseWrapMode() && this.renderer.adjustWrapLimit();\n            this.renderer.updateFull();\n        } else {\n            this.selection = null;\n            this.renderer.setSession(session);\n        }\n\n        this._signal(\"changeSession\", {\n            session: session,\n            oldSession: oldSession\n        });\n        \n        oldSession && oldSession._signal(\"changeEditor\", {oldEditor: this});\n        session && session._signal(\"changeEditor\", {editor: this});\n    };\n    this.getSession = function() {\n        return this.session;\n    };\n    this.setValue = function(val, cursorPos) {\n        this.session.doc.setValue(val);\n\n        if (!cursorPos)\n            this.selectAll();\n        else if (cursorPos == 1)\n            this.navigateFileEnd();\n        else if (cursorPos == -1)\n            this.navigateFileStart();\n\n        return val;\n    };\n    this.getValue = function() {\n        return this.session.getValue();\n    };\n    this.getSelection = function() {\n        return this.selection;\n    };\n    this.resize = function(force) {\n        this.renderer.onResize(force);\n    };\n    this.setTheme = function(theme, cb) {\n        this.renderer.setTheme(theme, cb);\n    };\n    this.getTheme = function() {\n        return this.renderer.getTheme();\n    };\n    this.setStyle = function(style) {\n        this.renderer.setStyle(style);\n    };\n    this.unsetStyle = function(style) {\n        this.renderer.unsetStyle(style);\n    };\n    this.getFontSize = function () {\n        return this.getOption(\"fontSize\") ||\n           dom.computedStyle(this.container, \"fontSize\");\n    };\n    this.setFontSize = function(size) {\n        this.setOption(\"fontSize\", size);\n    };\n\n    this.$highlightBrackets = function() {\n        if (this.session.$bracketHighlight) {\n            this.session.removeMarker(this.session.$bracketHighlight);\n            this.session.$bracketHighlight = null;\n        }\n\n        if (this.$highlightPending) {\n            return;\n        }\n        var self = this;\n        this.$highlightPending = true;\n        setTimeout(function() {\n            self.$highlightPending = false;\n            var session = self.session;\n            if (!session || !session.bgTokenizer) return;\n            var pos = session.findMatchingBracket(self.getCursorPosition());\n            if (pos) {\n                var range = new Range(pos.row, pos.column, pos.row, pos.column + 1);\n            } else if (session.$mode.getMatching) {\n                var range = session.$mode.getMatching(self.session);\n            }\n            if (range)\n                session.$bracketHighlight = session.addMarker(range, \"ace_bracket\", \"text\");\n        }, 50);\n    };\n    this.$highlightTags = function() {\n        if (this.$highlightTagPending)\n            return;\n        var self = this;\n        this.$highlightTagPending = true;\n        setTimeout(function() {\n            self.$highlightTagPending = false;\n            \n            var session = self.session;\n            if (!session || !session.bgTokenizer) return;\n            \n            var pos = self.getCursorPosition();\n            var iterator = new TokenIterator(self.session, pos.row, pos.column);\n            var token = iterator.getCurrentToken();\n            \n            if (!token || !/\\b(?:tag-open|tag-name)/.test(token.type)) {\n                session.removeMarker(session.$tagHighlight);\n                session.$tagHighlight = null;\n                return;\n            }\n            \n            if (token.type.indexOf(\"tag-open\") != -1)\n                token = iterator.stepForward();\n\n            var tag = token.value;\n            var depth = 0;\n            var prevToken = iterator.stepBackward();\n            \n            if (prevToken.value == '<'){\n                do {\n                    prevToken = token;\n                    token = iterator.stepForward();\n                    \n                    if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) {\n                        if (prevToken.value === '<'){\n                            depth++;\n                        } else if (prevToken.value === '</'){\n                            depth--;\n                        }\n                    }\n                    \n                } while (token && depth >= 0);\n            } else {\n                do {\n                    token = prevToken;\n                    prevToken = iterator.stepBackward();\n                    \n                    if (token && token.value === tag && token.type.indexOf('tag-name') !== -1) {\n                        if (prevToken.value === '<') {\n                            depth++;\n                        } else if (prevToken.value === '</') {\n                            depth--;\n                        }\n                    }\n                } while (prevToken && depth <= 0);\n                iterator.stepForward();\n            }\n            \n            if (!token) {\n                session.removeMarker(session.$tagHighlight);\n                session.$tagHighlight = null;\n                return;\n            }\n            \n            var row = iterator.getCurrentTokenRow();\n            var column = iterator.getCurrentTokenColumn();\n            var range = new Range(row, column, row, column+token.value.length);\n            if (session.$tagHighlight && range.compareRange(session.$backMarkers[session.$tagHighlight].range)!==0) {\n                session.removeMarker(session.$tagHighlight);\n                session.$tagHighlight = null;\n            }\n            \n            if (range && !session.$tagHighlight)\n                session.$tagHighlight = session.addMarker(range, \"ace_bracket\", \"text\");\n        }, 50);\n    };\n    this.focus = function() {\n        var _self = this;\n        setTimeout(function() {\n            _self.textInput.focus();\n        });\n        this.textInput.focus();\n    };\n    this.isFocused = function() {\n        return this.textInput.isFocused();\n    };\n    this.blur = function() {\n        this.textInput.blur();\n    };\n    this.onFocus = function(e) {\n        if (this.$isFocused)\n            return;\n        this.$isFocused = true;\n        this.renderer.showCursor();\n        this.renderer.visualizeFocus();\n        this._emit(\"focus\", e);\n    };\n    this.onBlur = function(e) {\n        if (!this.$isFocused)\n            return;\n        this.$isFocused = false;\n        this.renderer.hideCursor();\n        this.renderer.visualizeBlur();\n        this._emit(\"blur\", e);\n    };\n\n    this.$cursorChange = function() {\n        this.renderer.updateCursor();\n    };\n    this.onDocumentChange = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n        var lastRow;\n\n        if (range.start.row == range.end.row && delta.action != \"insertLines\" && delta.action != \"removeLines\")\n            lastRow = range.end.row;\n        else\n            lastRow = Infinity;\n        this.renderer.updateLines(range.start.row, lastRow, this.session.$useWrapMode);\n\n        this._signal(\"change\", e);\n        this.$cursorChange();\n        this.$updateHighlightActiveLine();\n    };\n\n    this.onTokenizerUpdate = function(e) {\n        var rows = e.data;\n        this.renderer.updateLines(rows.first, rows.last);\n    };\n\n\n    this.onScrollTopChange = function() {\n        this.renderer.scrollToY(this.session.getScrollTop());\n    };\n\n    this.onScrollLeftChange = function() {\n        this.renderer.scrollToX(this.session.getScrollLeft());\n    };\n    this.onCursorChange = function() {\n        this.$cursorChange();\n\n        if (!this.$blockScrolling) {\n            config.warn(\"Automatically scrolling cursor into view after selection change\",\n                \"this will be disabled in the next version\",\n                \"set editor.$blockScrolling = Infinity to disable this message\"\n            );\n            this.renderer.scrollCursorIntoView();\n        }\n\n        this.$highlightBrackets();\n        this.$highlightTags();\n        this.$updateHighlightActiveLine();\n        this._signal(\"changeSelection\");\n    };\n\n    this.$updateHighlightActiveLine = function() {\n        var session = this.getSession();\n\n        var highlight;\n        if (this.$highlightActiveLine) {\n            if ((this.$selectionStyle != \"line\" || !this.selection.isMultiLine()))\n                highlight = this.getCursorPosition();\n            if (this.renderer.$maxLines && this.session.getLength() === 1 && !(this.renderer.$minLines > 1))\n                highlight = false;\n        }\n\n        if (session.$highlightLineMarker && !highlight) {\n            session.removeMarker(session.$highlightLineMarker.id);\n            session.$highlightLineMarker = null;\n        } else if (!session.$highlightLineMarker && highlight) {\n            var range = new Range(highlight.row, highlight.column, highlight.row, Infinity);\n            range.id = session.addMarker(range, \"ace_active-line\", \"screenLine\");\n            session.$highlightLineMarker = range;\n        } else if (highlight) {\n            session.$highlightLineMarker.start.row = highlight.row;\n            session.$highlightLineMarker.end.row = highlight.row;\n            session.$highlightLineMarker.start.column = highlight.column;\n            session._signal(\"changeBackMarker\");\n        }\n    };\n\n    this.onSelectionChange = function(e) {\n        var session = this.session;\n\n        if (session.$selectionMarker) {\n            session.removeMarker(session.$selectionMarker);\n        }\n        session.$selectionMarker = null;\n\n        if (!this.selection.isEmpty()) {\n            var range = this.selection.getRange();\n            var style = this.getSelectionStyle();\n            session.$selectionMarker = session.addMarker(range, \"ace_selection\", style);\n        } else {\n            this.$updateHighlightActiveLine();\n        }\n\n        var re = this.$highlightSelectedWord && this.$getSelectionHighLightRegexp();\n        this.session.highlight(re);\n\n        this._signal(\"changeSelection\");\n    };\n\n    this.$getSelectionHighLightRegexp = function() {\n        var session = this.session;\n\n        var selection = this.getSelectionRange();\n        if (selection.isEmpty() || selection.isMultiLine())\n            return;\n\n        var startOuter = selection.start.column - 1;\n        var endOuter = selection.end.column + 1;\n        var line = session.getLine(selection.start.row);\n        var lineCols = line.length;\n        var needle = line.substring(Math.max(startOuter, 0),\n                                    Math.min(endOuter, lineCols));\n        if ((startOuter >= 0 && /^[\\w\\d]/.test(needle)) ||\n            (endOuter <= lineCols && /[\\w\\d]$/.test(needle)))\n            return;\n\n        needle = line.substring(selection.start.column, selection.end.column);\n        if (!/^[\\w\\d]+$/.test(needle))\n            return;\n\n        var re = this.$search.$assembleRegExp({\n            wholeWord: true,\n            caseSensitive: true,\n            needle: needle\n        });\n\n        return re;\n    };\n\n\n    this.onChangeFrontMarker = function() {\n        this.renderer.updateFrontMarkers();\n    };\n\n    this.onChangeBackMarker = function() {\n        this.renderer.updateBackMarkers();\n    };\n\n\n    this.onChangeBreakpoint = function() {\n        this.renderer.updateBreakpoints();\n    };\n\n    this.onChangeAnnotation = function() {\n        this.renderer.setAnnotations(this.session.getAnnotations());\n    };\n\n\n    this.onChangeMode = function(e) {\n        this.renderer.updateText();\n        this._emit(\"changeMode\", e);\n    };\n\n\n    this.onChangeWrapLimit = function() {\n        this.renderer.updateFull();\n    };\n\n    this.onChangeWrapMode = function() {\n        this.renderer.onResize(true);\n    };\n\n\n    this.onChangeFold = function() {\n        this.$updateHighlightActiveLine();\n        this.renderer.updateFull();\n    };\n    this.getSelectedText = function() {\n        return this.session.getTextRange(this.getSelectionRange());\n    };\n    this.getCopyText = function() {\n        var text = this.getSelectedText();\n        this._signal(\"copy\", text);\n        return text;\n    };\n    this.onCopy = function() {\n        this.commands.exec(\"copy\", this);\n    };\n    this.onCut = function() {\n        this.commands.exec(\"cut\", this);\n    };\n    this.onPaste = function(text) {\n        if (this.$readOnly)\n            return;\n\n        var e = {text: text};\n        this._signal(\"paste\", e);\n        text = e.text;\n        if (!this.inMultiSelectMode || this.inVirtualSelectionMode) {\n            this.insert(text);\n        } else {\n            var lines = text.split(/\\r\\n|\\r|\\n/);\n            var ranges = this.selection.rangeList.ranges;\n    \n            if (lines.length > ranges.length || lines.length < 2 || !lines[1])\n                return this.commands.exec(\"insertstring\", this, text);\n    \n            for (var i = ranges.length; i--;) {\n                var range = ranges[i];\n                if (!range.isEmpty())\n                    this.session.remove(range);\n    \n                this.session.insert(range.start, lines[i]);\n            }\n        }\n        this.renderer.scrollCursorIntoView();\n    };\n\n    this.execCommand = function(command, args) {\n        return this.commands.exec(command, this, args);\n    };\n    this.insert = function(text, pasted) {\n        var session = this.session;\n        var mode = session.getMode();\n        var cursor = this.getCursorPosition();\n\n        if (this.getBehavioursEnabled() && !pasted) {\n            var transform = mode.transformAction(session.getState(cursor.row), 'insertion', this, session, text);\n            if (transform) {\n                if (text !== transform.text) {\n                    this.session.mergeUndoDeltas = false;\n                    this.$mergeNextCommand = false;\n                }\n                text = transform.text;\n\n            }\n        }\n        \n        if (text == \"\\t\")\n            text = this.session.getTabString();\n        if (!this.selection.isEmpty()) {\n            var range = this.getSelectionRange();\n            cursor = this.session.remove(range);\n            this.clearSelection();\n        }\n        else if (this.session.getOverwrite()) {\n            var range = new Range.fromPoints(cursor, cursor);\n            range.end.column += text.length;\n            this.session.remove(range);\n        }\n\n        if (text == \"\\n\" || text == \"\\r\\n\") {\n            var line = session.getLine(cursor.row);\n            if (cursor.column > line.search(/\\S|$/)) {\n                var d = line.substr(cursor.column).search(/\\S|$/);\n                session.doc.removeInLine(cursor.row, cursor.column, cursor.column + d);\n            }\n        }\n        this.clearSelection();\n\n        var start = cursor.column;\n        var lineState = session.getState(cursor.row);\n        var line = session.getLine(cursor.row);\n        var shouldOutdent = mode.checkOutdent(lineState, line, text);\n        var end = session.insert(cursor, text);\n\n        if (transform && transform.selection) {\n            if (transform.selection.length == 2) { // Transform relative to the current column\n                this.selection.setSelectionRange(\n                    new Range(cursor.row, start + transform.selection[0],\n                              cursor.row, start + transform.selection[1]));\n            } else { // Transform relative to the current row.\n                this.selection.setSelectionRange(\n                    new Range(cursor.row + transform.selection[0],\n                              transform.selection[1],\n                              cursor.row + transform.selection[2],\n                              transform.selection[3]));\n            }\n        }\n\n        if (session.getDocument().isNewLine(text)) {\n            var lineIndent = mode.getNextLineIndent(lineState, line.slice(0, cursor.column), session.getTabString());\n\n            session.insert({row: cursor.row+1, column: 0}, lineIndent);\n        }\n        if (shouldOutdent)\n            mode.autoOutdent(lineState, session, cursor.row);\n    };\n\n    this.onTextInput = function(text) {\n        this.keyBinding.onTextInput(text);\n    };\n\n    this.onCommandKey = function(e, hashId, keyCode) {\n        this.keyBinding.onCommandKey(e, hashId, keyCode);\n    };\n    this.setOverwrite = function(overwrite) {\n        this.session.setOverwrite(overwrite);\n    };\n    this.getOverwrite = function() {\n        return this.session.getOverwrite();\n    };\n    this.toggleOverwrite = function() {\n        this.session.toggleOverwrite();\n    };\n    this.setScrollSpeed = function(speed) {\n        this.setOption(\"scrollSpeed\", speed);\n    };\n    this.getScrollSpeed = function() {\n        return this.getOption(\"scrollSpeed\");\n    };\n    this.setDragDelay = function(dragDelay) {\n        this.setOption(\"dragDelay\", dragDelay);\n    };\n    this.getDragDelay = function() {\n        return this.getOption(\"dragDelay\");\n    };\n    this.setSelectionStyle = function(val) {\n        this.setOption(\"selectionStyle\", val);\n    };\n    this.getSelectionStyle = function() {\n        return this.getOption(\"selectionStyle\");\n    };\n    this.setHighlightActiveLine = function(shouldHighlight) {\n        this.setOption(\"highlightActiveLine\", shouldHighlight);\n    };\n    this.getHighlightActiveLine = function() {\n        return this.getOption(\"highlightActiveLine\");\n    };\n    this.setHighlightGutterLine = function(shouldHighlight) {\n        this.setOption(\"highlightGutterLine\", shouldHighlight);\n    };\n\n    this.getHighlightGutterLine = function() {\n        return this.getOption(\"highlightGutterLine\");\n    };\n    this.setHighlightSelectedWord = function(shouldHighlight) {\n        this.setOption(\"highlightSelectedWord\", shouldHighlight);\n    };\n    this.getHighlightSelectedWord = function() {\n        return this.$highlightSelectedWord;\n    };\n\n    this.setAnimatedScroll = function(shouldAnimate){\n        this.renderer.setAnimatedScroll(shouldAnimate);\n    };\n\n    this.getAnimatedScroll = function(){\n        return this.renderer.getAnimatedScroll();\n    };\n    this.setShowInvisibles = function(showInvisibles) {\n        this.renderer.setShowInvisibles(showInvisibles);\n    };\n    this.getShowInvisibles = function() {\n        return this.renderer.getShowInvisibles();\n    };\n\n    this.setDisplayIndentGuides = function(display) {\n        this.renderer.setDisplayIndentGuides(display);\n    };\n\n    this.getDisplayIndentGuides = function() {\n        return this.renderer.getDisplayIndentGuides();\n    };\n    this.setShowPrintMargin = function(showPrintMargin) {\n        this.renderer.setShowPrintMargin(showPrintMargin);\n    };\n    this.getShowPrintMargin = function() {\n        return this.renderer.getShowPrintMargin();\n    };\n    this.setPrintMarginColumn = function(showPrintMargin) {\n        this.renderer.setPrintMarginColumn(showPrintMargin);\n    };\n    this.getPrintMarginColumn = function() {\n        return this.renderer.getPrintMarginColumn();\n    };\n    this.setReadOnly = function(readOnly) {\n        this.setOption(\"readOnly\", readOnly);\n    };\n    this.getReadOnly = function() {\n        return this.getOption(\"readOnly\");\n    };\n    this.setBehavioursEnabled = function (enabled) {\n        this.setOption(\"behavioursEnabled\", enabled);\n    };\n    this.getBehavioursEnabled = function () {\n        return this.getOption(\"behavioursEnabled\");\n    };\n    this.setWrapBehavioursEnabled = function (enabled) {\n        this.setOption(\"wrapBehavioursEnabled\", enabled);\n    };\n    this.getWrapBehavioursEnabled = function () {\n        return this.getOption(\"wrapBehavioursEnabled\");\n    };\n    this.setShowFoldWidgets = function(show) {\n        this.setOption(\"showFoldWidgets\", show);\n\n    };\n    this.getShowFoldWidgets = function() {\n        return this.getOption(\"showFoldWidgets\");\n    };\n\n    this.setFadeFoldWidgets = function(fade) {\n        this.setOption(\"fadeFoldWidgets\", fade);\n    };\n\n    this.getFadeFoldWidgets = function() {\n        return this.getOption(\"fadeFoldWidgets\");\n    };\n    this.remove = function(dir) {\n        if (this.selection.isEmpty()){\n            if (dir == \"left\")\n                this.selection.selectLeft();\n            else\n                this.selection.selectRight();\n        }\n\n        var range = this.getSelectionRange();\n        if (this.getBehavioursEnabled()) {\n            var session = this.session;\n            var state = session.getState(range.start.row);\n            var new_range = session.getMode().transformAction(state, 'deletion', this, session, range);\n\n            if (range.end.column === 0) {\n                var text = session.getTextRange(range);\n                if (text[text.length - 1] == \"\\n\") {\n                    var line = session.getLine(range.end.row);\n                    if (/^\\s+$/.test(line)) {\n                        range.end.column = line.length;\n                    }\n                }\n            }\n            if (new_range)\n                range = new_range;\n        }\n\n        this.session.remove(range);\n        this.clearSelection();\n    };\n    this.removeWordRight = function() {\n        if (this.selection.isEmpty())\n            this.selection.selectWordRight();\n\n        this.session.remove(this.getSelectionRange());\n        this.clearSelection();\n    };\n    this.removeWordLeft = function() {\n        if (this.selection.isEmpty())\n            this.selection.selectWordLeft();\n\n        this.session.remove(this.getSelectionRange());\n        this.clearSelection();\n    };\n    this.removeToLineStart = function() {\n        if (this.selection.isEmpty())\n            this.selection.selectLineStart();\n\n        this.session.remove(this.getSelectionRange());\n        this.clearSelection();\n    };\n    this.removeToLineEnd = function() {\n        if (this.selection.isEmpty())\n            this.selection.selectLineEnd();\n\n        var range = this.getSelectionRange();\n        if (range.start.column == range.end.column && range.start.row == range.end.row) {\n            range.end.column = 0;\n            range.end.row++;\n        }\n\n        this.session.remove(range);\n        this.clearSelection();\n    };\n    this.splitLine = function() {\n        if (!this.selection.isEmpty()) {\n            this.session.remove(this.getSelectionRange());\n            this.clearSelection();\n        }\n\n        var cursor = this.getCursorPosition();\n        this.insert(\"\\n\");\n        this.moveCursorToPosition(cursor);\n    };\n    this.transposeLetters = function() {\n        if (!this.selection.isEmpty()) {\n            return;\n        }\n\n        var cursor = this.getCursorPosition();\n        var column = cursor.column;\n        if (column === 0)\n            return;\n\n        var line = this.session.getLine(cursor.row);\n        var swap, range;\n        if (column < line.length) {\n            swap = line.charAt(column) + line.charAt(column-1);\n            range = new Range(cursor.row, column-1, cursor.row, column+1);\n        }\n        else {\n            swap = line.charAt(column-1) + line.charAt(column-2);\n            range = new Range(cursor.row, column-2, cursor.row, column);\n        }\n        this.session.replace(range, swap);\n    };\n    this.toLowerCase = function() {\n        var originalRange = this.getSelectionRange();\n        if (this.selection.isEmpty()) {\n            this.selection.selectWord();\n        }\n\n        var range = this.getSelectionRange();\n        var text = this.session.getTextRange(range);\n        this.session.replace(range, text.toLowerCase());\n        this.selection.setSelectionRange(originalRange);\n    };\n    this.toUpperCase = function() {\n        var originalRange = this.getSelectionRange();\n        if (this.selection.isEmpty()) {\n            this.selection.selectWord();\n        }\n\n        var range = this.getSelectionRange();\n        var text = this.session.getTextRange(range);\n        this.session.replace(range, text.toUpperCase());\n        this.selection.setSelectionRange(originalRange);\n    };\n    this.indent = function() {\n        var session = this.session;\n        var range = this.getSelectionRange();\n\n        if (range.start.row < range.end.row) {\n            var rows = this.$getSelectedRows();\n            session.indentRows(rows.first, rows.last, \"\\t\");\n            return;\n        } else if (range.start.column < range.end.column) {\n            var text = session.getTextRange(range);\n            if (!/^\\s+$/.test(text)) {\n                var rows = this.$getSelectedRows();\n                session.indentRows(rows.first, rows.last, \"\\t\");\n                return;\n            }\n        }\n        \n        var line = session.getLine(range.start.row);\n        var position = range.start;\n        var size = session.getTabSize();\n        var column = session.documentToScreenColumn(position.row, position.column);\n\n        if (this.session.getUseSoftTabs()) {\n            var count = (size - column % size);\n            var indentString = lang.stringRepeat(\" \", count);\n        } else {\n            var count = column % size;\n            while (line[range.start.column] == \" \" && count) {\n                range.start.column--;\n                count--;\n            }\n            this.selection.setSelectionRange(range);\n            indentString = \"\\t\";\n        }\n        return this.insert(indentString);\n    };\n    this.blockIndent = function() {\n        var rows = this.$getSelectedRows();\n        this.session.indentRows(rows.first, rows.last, \"\\t\");\n    };\n    this.blockOutdent = function() {\n        var selection = this.session.getSelection();\n        this.session.outdentRows(selection.getRange());\n    };\n    this.sortLines = function() {\n        var rows = this.$getSelectedRows();\n        var session = this.session;\n\n        var lines = [];\n        for (i = rows.first; i <= rows.last; i++)\n            lines.push(session.getLine(i));\n\n        lines.sort(function(a, b) {\n            if (a.toLowerCase() < b.toLowerCase()) return -1;\n            if (a.toLowerCase() > b.toLowerCase()) return 1;\n            return 0;\n        });\n\n        var deleteRange = new Range(0, 0, 0, 0);\n        for (var i = rows.first; i <= rows.last; i++) {\n            var line = session.getLine(i);\n            deleteRange.start.row = i;\n            deleteRange.end.row = i;\n            deleteRange.end.column = line.length;\n            session.replace(deleteRange, lines[i-rows.first]);\n        }\n    };\n    this.toggleCommentLines = function() {\n        var state = this.session.getState(this.getCursorPosition().row);\n        var rows = this.$getSelectedRows();\n        this.session.getMode().toggleCommentLines(state, this.session, rows.first, rows.last);\n    };\n\n    this.toggleBlockComment = function() {\n        var cursor = this.getCursorPosition();\n        var state = this.session.getState(cursor.row);\n        var range = this.getSelectionRange();\n        this.session.getMode().toggleBlockComment(state, this.session, range, cursor);\n    };\n    this.getNumberAt = function(row, column) {\n        var _numberRx = /[\\-]?[0-9]+(?:\\.[0-9]+)?/g;\n        _numberRx.lastIndex = 0;\n\n        var s = this.session.getLine(row);\n        while (_numberRx.lastIndex < column) {\n            var m = _numberRx.exec(s);\n            if(m.index <= column && m.index+m[0].length >= column){\n                var number = {\n                    value: m[0],\n                    start: m.index,\n                    end: m.index+m[0].length\n                };\n                return number;\n            }\n        }\n        return null;\n    };\n    this.modifyNumber = function(amount) {\n        var row = this.selection.getCursor().row;\n        var column = this.selection.getCursor().column;\n        var charRange = new Range(row, column-1, row, column);\n\n        var c = this.session.getTextRange(charRange);\n        if (!isNaN(parseFloat(c)) && isFinite(c)) {\n            var nr = this.getNumberAt(row, column);\n            if (nr) {\n                var fp = nr.value.indexOf(\".\") >= 0 ? nr.start + nr.value.indexOf(\".\") + 1 : nr.end;\n                var decimals = nr.start + nr.value.length - fp;\n\n                var t = parseFloat(nr.value);\n                t *= Math.pow(10, decimals);\n\n\n                if(fp !== nr.end && column < fp){\n                    amount *= Math.pow(10, nr.end - column - 1);\n                } else {\n                    amount *= Math.pow(10, nr.end - column);\n                }\n\n                t += amount;\n                t /= Math.pow(10, decimals);\n                var nnr = t.toFixed(decimals);\n                var replaceRange = new Range(row, nr.start, row, nr.end);\n                this.session.replace(replaceRange, nnr);\n                this.moveCursorTo(row, Math.max(nr.start +1, column + nnr.length - nr.value.length));\n\n            }\n        }\n    };\n    this.removeLines = function() {\n        var rows = this.$getSelectedRows();\n        var range;\n        if (rows.first === 0 || rows.last+1 < this.session.getLength())\n            range = new Range(rows.first, 0, rows.last+1, 0);\n        else\n            range = new Range(\n                rows.first-1, this.session.getLine(rows.first-1).length,\n                rows.last, this.session.getLine(rows.last).length\n            );\n        this.session.remove(range);\n        this.clearSelection();\n    };\n\n    this.duplicateSelection = function() {\n        var sel = this.selection;\n        var doc = this.session;\n        var range = sel.getRange();\n        var reverse = sel.isBackwards();\n        if (range.isEmpty()) {\n            var row = range.start.row;\n            doc.duplicateLines(row, row);\n        } else {\n            var point = reverse ? range.start : range.end;\n            var endPoint = doc.insert(point, doc.getTextRange(range), false);\n            range.start = point;\n            range.end = endPoint;\n\n            sel.setSelectionRange(range, reverse);\n        }\n    };\n    this.moveLinesDown = function() {\n        this.$moveLines(1, false);\n    };\n    this.moveLinesUp = function() {\n        this.$moveLines(-1, false);\n    };\n    this.moveText = function(range, toPosition, copy) {\n        return this.session.moveText(range, toPosition, copy);\n    };\n    this.copyLinesUp = function() {\n        this.$moveLines(-1, true);\n    };\n    this.copyLinesDown = function() {\n        this.$moveLines(1, true);\n    };\n    this.$moveLines = function(dir, copy) {\n        var rows, moved;\n        var selection = this.selection;\n        if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) {\n            var range = selection.toOrientedRange();\n            rows = this.$getSelectedRows(range);\n            moved = this.session.$moveLines(rows.first, rows.last, copy ? 0 : dir);\n            if (copy && dir == -1) moved = 0;\n            range.moveBy(moved, 0);\n            selection.fromOrientedRange(range);\n        } else {\n            var ranges = selection.rangeList.ranges;\n            selection.rangeList.detach(this.session);\n            this.inVirtualSelectionMode = true;\n            \n            var diff = 0;\n            var totalDiff = 0;\n            var l = ranges.length;\n            for (var i = 0; i < l; i++) {\n                var rangeIndex = i;\n                ranges[i].moveBy(diff, 0);\n                rows = this.$getSelectedRows(ranges[i]);\n                var first = rows.first;\n                var last = rows.last;\n                while (++i < l) {\n                    if (totalDiff) ranges[i].moveBy(totalDiff, 0);\n                    var subRows = this.$getSelectedRows(ranges[i]);\n                    if (copy && subRows.first != last)\n                        break;\n                    else if (!copy && subRows.first > last + 1)\n                        break;\n                    last = subRows.last;\n                }\n                i--;\n                diff = this.session.$moveLines(first, last, copy ? 0 : dir);\n                if (copy && dir == -1) rangeIndex = i + 1;\n                while (rangeIndex <= i) {\n                    ranges[rangeIndex].moveBy(diff, 0);\n                    rangeIndex++;\n                }\n                if (!copy) diff = 0;\n                totalDiff += diff;\n            }\n            \n            selection.fromOrientedRange(selection.ranges[0]);\n            selection.rangeList.attach(this.session);\n            this.inVirtualSelectionMode = false;\n        }\n    };\n    this.$getSelectedRows = function(range) {\n        range = (range || this.getSelectionRange()).collapseRows();\n\n        return {\n            first: this.session.getRowFoldStart(range.start.row),\n            last: this.session.getRowFoldEnd(range.end.row)\n        };\n    };\n\n    this.onCompositionStart = function(text) {\n        this.renderer.showComposition(this.getCursorPosition());\n    };\n\n    this.onCompositionUpdate = function(text) {\n        this.renderer.setCompositionText(text);\n    };\n\n    this.onCompositionEnd = function() {\n        this.renderer.hideComposition();\n    };\n    this.getFirstVisibleRow = function() {\n        return this.renderer.getFirstVisibleRow();\n    };\n    this.getLastVisibleRow = function() {\n        return this.renderer.getLastVisibleRow();\n    };\n    this.isRowVisible = function(row) {\n        return (row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow());\n    };\n    this.isRowFullyVisible = function(row) {\n        return (row >= this.renderer.getFirstFullyVisibleRow() && row <= this.renderer.getLastFullyVisibleRow());\n    };\n    this.$getVisibleRowCount = function() {\n        return this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1;\n    };\n\n    this.$moveByPage = function(dir, select) {\n        var renderer = this.renderer;\n        var config = this.renderer.layerConfig;\n        var rows = dir * Math.floor(config.height / config.lineHeight);\n\n        this.$blockScrolling++;\n        if (select === true) {\n            this.selection.$moveSelection(function(){\n                this.moveCursorBy(rows, 0);\n            });\n        } else if (select === false) {\n            this.selection.moveCursorBy(rows, 0);\n            this.selection.clearSelection();\n        }\n        this.$blockScrolling--;\n\n        var scrollTop = renderer.scrollTop;\n\n        renderer.scrollBy(0, rows * config.lineHeight);\n        if (select != null)\n            renderer.scrollCursorIntoView(null, 0.5);\n\n        renderer.animateScrolling(scrollTop);\n    };\n    this.selectPageDown = function() {\n        this.$moveByPage(1, true);\n    };\n    this.selectPageUp = function() {\n        this.$moveByPage(-1, true);\n    };\n    this.gotoPageDown = function() {\n       this.$moveByPage(1, false);\n    };\n    this.gotoPageUp = function() {\n        this.$moveByPage(-1, false);\n    };\n    this.scrollPageDown = function() {\n        this.$moveByPage(1);\n    };\n    this.scrollPageUp = function() {\n        this.$moveByPage(-1);\n    };\n    this.scrollToRow = function(row) {\n        this.renderer.scrollToRow(row);\n    };\n    this.scrollToLine = function(line, center, animate, callback) {\n        this.renderer.scrollToLine(line, center, animate, callback);\n    };\n    this.centerSelection = function() {\n        var range = this.getSelectionRange();\n        var pos = {\n            row: Math.floor(range.start.row + (range.end.row - range.start.row) / 2),\n            column: Math.floor(range.start.column + (range.end.column - range.start.column) / 2)\n        };\n        this.renderer.alignCursor(pos, 0.5);\n    };\n    this.getCursorPosition = function() {\n        return this.selection.getCursor();\n    };\n    this.getCursorPositionScreen = function() {\n        return this.session.documentToScreenPosition(this.getCursorPosition());\n    };\n    this.getSelectionRange = function() {\n        return this.selection.getRange();\n    };\n    this.selectAll = function() {\n        this.$blockScrolling += 1;\n        this.selection.selectAll();\n        this.$blockScrolling -= 1;\n    };\n    this.clearSelection = function() {\n        this.selection.clearSelection();\n    };\n    this.moveCursorTo = function(row, column) {\n        this.selection.moveCursorTo(row, column);\n    };\n    this.moveCursorToPosition = function(pos) {\n        this.selection.moveCursorToPosition(pos);\n    };\n    this.jumpToMatching = function(select, expand) {\n        var cursor = this.getCursorPosition();\n        var iterator = new TokenIterator(this.session, cursor.row, cursor.column);\n        var prevToken = iterator.getCurrentToken();\n        var token = prevToken || iterator.stepForward();\n\n        if (!token) return;\n        var matchType;\n        var found = false;\n        var depth = {};\n        var i = cursor.column - token.start;\n        var bracketType;\n        var brackets = {\n            \")\": \"(\",\n            \"(\": \"(\",\n            \"]\": \"[\",\n            \"[\": \"[\",\n            \"{\": \"{\",\n            \"}\": \"{\"\n        };\n        \n        do {\n            if (token.value.match(/[{}()\\[\\]]/g)) {\n                for (; i < token.value.length && !found; i++) {\n                    if (!brackets[token.value[i]]) {\n                        continue;\n                    }\n\n                    bracketType = brackets[token.value[i]] + '.' + token.type.replace(\"rparen\", \"lparen\");\n\n                    if (isNaN(depth[bracketType])) {\n                        depth[bracketType] = 0;\n                    }\n\n                    switch (token.value[i]) {\n                        case '(':\n                        case '[':\n                        case '{':\n                            depth[bracketType]++;\n                            break;\n                        case ')':\n                        case ']':\n                        case '}':\n                            depth[bracketType]--;\n\n                            if (depth[bracketType] === -1) {\n                                matchType = 'bracket';\n                                found = true;\n                            }\n                        break;\n                    }\n                }\n            }\n            else if (token && token.type.indexOf('tag-name') !== -1) {\n                if (isNaN(depth[token.value])) {\n                    depth[token.value] = 0;\n                }\n                \n                if (prevToken.value === '<') {\n                    depth[token.value]++;\n                }\n                else if (prevToken.value === '</') {\n                    depth[token.value]--;\n                }\n                \n                if (depth[token.value] === -1) {\n                    matchType = 'tag';\n                    found = true;\n                }\n            }\n\n            if (!found) {\n                prevToken = token;\n                token = iterator.stepForward();\n                i = 0;\n            }\n        } while (token && !found);\n        if (!matchType)\n            return;\n\n        var range, pos;\n        if (matchType === 'bracket') {\n            range = this.session.getBracketRange(cursor);\n            if (!range) {\n                range = new Range(\n                    iterator.getCurrentTokenRow(),\n                    iterator.getCurrentTokenColumn() + i - 1,\n                    iterator.getCurrentTokenRow(),\n                    iterator.getCurrentTokenColumn() + i - 1\n                );\n                pos = range.start;\n                if (expand || pos.row === cursor.row && Math.abs(pos.column - cursor.column) < 2)\n                    range = this.session.getBracketRange(pos);\n            }\n        }\n        else if (matchType === 'tag') {\n            if (token && token.type.indexOf('tag-name') !== -1) \n                var tag = token.value;\n            else\n                return;\n\n            range = new Range(\n                iterator.getCurrentTokenRow(),\n                iterator.getCurrentTokenColumn() - 2,\n                iterator.getCurrentTokenRow(),\n                iterator.getCurrentTokenColumn() - 2\n            );\n            if (range.compare(cursor.row, cursor.column) === 0) {\n                found = false;\n                do {\n                    token = prevToken;\n                    prevToken = iterator.stepBackward();\n                    \n                    if (prevToken) {\n                        if (prevToken.type.indexOf('tag-close') !== -1) {\n                            range.setEnd(iterator.getCurrentTokenRow(), iterator.getCurrentTokenColumn() + 1);\n                        }\n\n                        if (token.value === tag && token.type.indexOf('tag-name') !== -1) {\n                            if (prevToken.value === '<') {\n                                depth[tag]++;\n                            }\n                            else if (prevToken.value === '</') {\n                                depth[tag]--;\n                            }\n                            \n                            if (depth[tag] === 0)\n                                found = true;\n                        }\n                    }\n                } while (prevToken && !found);\n            }\n            if (token && token.type.indexOf('tag-name')) {\n                pos = range.start;\n                if (pos.row == cursor.row && Math.abs(pos.column - cursor.column) < 2)\n                    pos = range.end;\n            }\n        }\n\n        pos = range && range.cursor || pos;\n        if (pos) {\n            if (select) {\n                if (range && expand) {\n                    this.selection.setRange(range);\n                } else if (range && range.isEqual(this.getSelectionRange())) {\n                    this.clearSelection();\n                } else {\n                    this.selection.selectTo(pos.row, pos.column);\n                }\n            } else {\n                this.selection.moveTo(pos.row, pos.column);\n            }\n        }\n    };\n    this.gotoLine = function(lineNumber, column, animate) {\n        this.selection.clearSelection();\n        this.session.unfold({row: lineNumber - 1, column: column || 0});\n\n        this.$blockScrolling += 1;\n        this.exitMultiSelectMode && this.exitMultiSelectMode();\n        this.moveCursorTo(lineNumber - 1, column || 0);\n        this.$blockScrolling -= 1;\n\n        if (!this.isRowFullyVisible(lineNumber - 1))\n            this.scrollToLine(lineNumber - 1, true, animate);\n    };\n    this.navigateTo = function(row, column) {\n        this.selection.moveTo(row, column);\n    };\n    this.navigateUp = function(times) {\n        if (this.selection.isMultiLine() && !this.selection.isBackwards()) {\n            var selectionStart = this.selection.anchor.getPosition();\n            return this.moveCursorToPosition(selectionStart);\n        }\n        this.selection.clearSelection();\n        this.selection.moveCursorBy(-times || -1, 0);\n    };\n    this.navigateDown = function(times) {\n        if (this.selection.isMultiLine() && this.selection.isBackwards()) {\n            var selectionEnd = this.selection.anchor.getPosition();\n            return this.moveCursorToPosition(selectionEnd);\n        }\n        this.selection.clearSelection();\n        this.selection.moveCursorBy(times || 1, 0);\n    };\n    this.navigateLeft = function(times) {\n        if (!this.selection.isEmpty()) {\n            var selectionStart = this.getSelectionRange().start;\n            this.moveCursorToPosition(selectionStart);\n        }\n        else {\n            times = times || 1;\n            while (times--) {\n                this.selection.moveCursorLeft();\n            }\n        }\n        this.clearSelection();\n    };\n    this.navigateRight = function(times) {\n        if (!this.selection.isEmpty()) {\n            var selectionEnd = this.getSelectionRange().end;\n            this.moveCursorToPosition(selectionEnd);\n        }\n        else {\n            times = times || 1;\n            while (times--) {\n                this.selection.moveCursorRight();\n            }\n        }\n        this.clearSelection();\n    };\n    this.navigateLineStart = function() {\n        this.selection.moveCursorLineStart();\n        this.clearSelection();\n    };\n    this.navigateLineEnd = function() {\n        this.selection.moveCursorLineEnd();\n        this.clearSelection();\n    };\n    this.navigateFileEnd = function() {\n        this.selection.moveCursorFileEnd();\n        this.clearSelection();\n    };\n    this.navigateFileStart = function() {\n        this.selection.moveCursorFileStart();\n        this.clearSelection();\n    };\n    this.navigateWordRight = function() {\n        this.selection.moveCursorWordRight();\n        this.clearSelection();\n    };\n    this.navigateWordLeft = function() {\n        this.selection.moveCursorWordLeft();\n        this.clearSelection();\n    };\n    this.replace = function(replacement, options) {\n        if (options)\n            this.$search.set(options);\n\n        var range = this.$search.find(this.session);\n        var replaced = 0;\n        if (!range)\n            return replaced;\n\n        if (this.$tryReplace(range, replacement)) {\n            replaced = 1;\n        }\n        if (range !== null) {\n            this.selection.setSelectionRange(range);\n            this.renderer.scrollSelectionIntoView(range.start, range.end);\n        }\n\n        return replaced;\n    };\n    this.replaceAll = function(replacement, options) {\n        if (options) {\n            this.$search.set(options);\n        }\n\n        var ranges = this.$search.findAll(this.session);\n        var replaced = 0;\n        if (!ranges.length)\n            return replaced;\n\n        this.$blockScrolling += 1;\n\n        var selection = this.getSelectionRange();\n        this.selection.moveTo(0, 0);\n\n        for (var i = ranges.length - 1; i >= 0; --i) {\n            if(this.$tryReplace(ranges[i], replacement)) {\n                replaced++;\n            }\n        }\n\n        this.selection.setSelectionRange(selection);\n        this.$blockScrolling -= 1;\n\n        return replaced;\n    };\n\n    this.$tryReplace = function(range, replacement) {\n        var input = this.session.getTextRange(range);\n        replacement = this.$search.replace(input, replacement);\n        if (replacement !== null) {\n            range.end = this.session.replace(range, replacement);\n            return range;\n        } else {\n            return null;\n        }\n    };\n    this.getLastSearchOptions = function() {\n        return this.$search.getOptions();\n    };\n    this.find = function(needle, options, animate) {\n        if (!options)\n            options = {};\n\n        if (typeof needle == \"string\" || needle instanceof RegExp)\n            options.needle = needle;\n        else if (typeof needle == \"object\")\n            oop.mixin(options, needle);\n\n        var range = this.selection.getRange();\n        if (options.needle == null) {\n            needle = this.session.getTextRange(range)\n                || this.$search.$options.needle;\n            if (!needle) {\n                range = this.session.getWordRange(range.start.row, range.start.column);\n                needle = this.session.getTextRange(range);\n            }\n            this.$search.set({needle: needle});\n        }\n\n        this.$search.set(options);\n        if (!options.start)\n            this.$search.set({start: range});\n\n        var newRange = this.$search.find(this.session);\n        if (options.preventScroll)\n            return newRange;\n        if (newRange) {\n            this.revealRange(newRange, animate);\n            return newRange;\n        }\n        if (options.backwards)\n            range.start = range.end;\n        else\n            range.end = range.start;\n        this.selection.setRange(range);\n    };\n    this.findNext = function(options, animate) {\n        this.find({skipCurrent: true, backwards: false}, options, animate);\n    };\n    this.findPrevious = function(options, animate) {\n        this.find(options, {skipCurrent: true, backwards: true}, animate);\n    };\n\n    this.revealRange = function(range, animate) {\n        this.$blockScrolling += 1;\n        this.session.unfold(range);\n        this.selection.setSelectionRange(range);\n        this.$blockScrolling -= 1;\n\n        var scrollTop = this.renderer.scrollTop;\n        this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5);\n        if (animate !== false)\n            this.renderer.animateScrolling(scrollTop);\n    };\n    this.undo = function() {\n        this.$blockScrolling++;\n        this.session.getUndoManager().undo();\n        this.$blockScrolling--;\n        this.renderer.scrollCursorIntoView(null, 0.5);\n    };\n    this.redo = function() {\n        this.$blockScrolling++;\n        this.session.getUndoManager().redo();\n        this.$blockScrolling--;\n        this.renderer.scrollCursorIntoView(null, 0.5);\n    };\n    this.destroy = function() {\n        this.renderer.destroy();\n        this._signal(\"destroy\", this);\n        if (this.session) {\n            this.session.destroy();\n        }\n    };\n    this.setAutoScrollEditorIntoView = function(enable) {\n        if (!enable)\n            return;\n        var rect;\n        var self = this;\n        var shouldScroll = false;\n        if (!this.$scrollAnchor)\n            this.$scrollAnchor = document.createElement(\"div\");\n        var scrollAnchor = this.$scrollAnchor;\n        scrollAnchor.style.cssText = \"position:absolute\";\n        this.container.insertBefore(scrollAnchor, this.container.firstChild);\n        var onChangeSelection = this.on(\"changeSelection\", function() {\n            shouldScroll = true;\n        });\n        var onBeforeRender = this.renderer.on(\"beforeRender\", function() {\n            if (shouldScroll)\n                rect = self.renderer.container.getBoundingClientRect();\n        });\n        var onAfterRender = this.renderer.on(\"afterRender\", function() {\n            if (shouldScroll && rect && (self.isFocused()\n                || self.searchBox && self.searchBox.isFocused())\n            ) {\n                var renderer = self.renderer;\n                var pos = renderer.$cursorLayer.$pixelPos;\n                var config = renderer.layerConfig;\n                var top = pos.top - config.offset;\n                if (pos.top >= 0 && top + rect.top < 0) {\n                    shouldScroll = true;\n                } else if (pos.top < config.height &&\n                    pos.top + rect.top + config.lineHeight > window.innerHeight) {\n                    shouldScroll = false;\n                } else {\n                    shouldScroll = null;\n                }\n                if (shouldScroll != null) {\n                    scrollAnchor.style.top = top + \"px\";\n                    scrollAnchor.style.left = pos.left + \"px\";\n                    scrollAnchor.style.height = config.lineHeight + \"px\";\n                    scrollAnchor.scrollIntoView(shouldScroll);\n                }\n                shouldScroll = rect = null;\n            }\n        });\n        this.setAutoScrollEditorIntoView = function(enable) {\n            if (enable)\n                return;\n            delete this.setAutoScrollEditorIntoView;\n            this.removeEventListener(\"changeSelection\", onChangeSelection);\n            this.renderer.removeEventListener(\"afterRender\", onAfterRender);\n            this.renderer.removeEventListener(\"beforeRender\", onBeforeRender);\n        };\n    };\n\n\n    this.$resetCursorStyle = function() {\n        var style = this.$cursorStyle || \"ace\";\n        var cursorLayer = this.renderer.$cursorLayer;\n        if (!cursorLayer)\n            return;\n        cursorLayer.setSmoothBlinking(/smooth/.test(style));\n        cursorLayer.isBlinking = !this.$readOnly && style != \"wide\";\n        dom.setCssClass(cursorLayer.element, \"ace_slim-cursors\", /slim/.test(style));\n    };\n\n}).call(Editor.prototype);\n\n\n\nconfig.defineOptions(Editor.prototype, \"editor\", {\n    selectionStyle: {\n        set: function(style) {\n            this.onSelectionChange();\n            this._signal(\"changeSelectionStyle\", {data: style});\n        },\n        initialValue: \"line\"\n    },\n    highlightActiveLine: {\n        set: function() {this.$updateHighlightActiveLine();},\n        initialValue: true\n    },\n    highlightSelectedWord: {\n        set: function(shouldHighlight) {this.$onSelectionChange();},\n        initialValue: true\n    },\n    readOnly: {\n        set: function(readOnly) {\n            this.$resetCursorStyle(); \n        },\n        initialValue: false\n    },\n    cursorStyle: {\n        set: function(val) { this.$resetCursorStyle(); },\n        values: [\"ace\", \"slim\", \"smooth\", \"wide\"],\n        initialValue: \"ace\"\n    },\n    mergeUndoDeltas: {\n        values: [false, true, \"always\"],\n        initialValue: true\n    },\n    behavioursEnabled: {initialValue: true},\n    wrapBehavioursEnabled: {initialValue: true},\n    autoScrollEditorIntoView: {\n        set: function(val) {this.setAutoScrollEditorIntoView(val)}\n    },\n\n    hScrollBarAlwaysVisible: \"renderer\",\n    vScrollBarAlwaysVisible: \"renderer\",\n    highlightGutterLine: \"renderer\",\n    animatedScroll: \"renderer\",\n    showInvisibles: \"renderer\",\n    showPrintMargin: \"renderer\",\n    printMarginColumn: \"renderer\",\n    printMargin: \"renderer\",\n    fadeFoldWidgets: \"renderer\",\n    showFoldWidgets: \"renderer\",\n    showLineNumbers: \"renderer\",\n    showGutter: \"renderer\",\n    displayIndentGuides: \"renderer\",\n    fontSize: \"renderer\",\n    fontFamily: \"renderer\",\n    maxLines: \"renderer\",\n    minLines: \"renderer\",\n    scrollPastEnd: \"renderer\",\n    fixedWidthGutter: \"renderer\",\n    theme: \"renderer\",\n\n    scrollSpeed: \"$mouseHandler\",\n    dragDelay: \"$mouseHandler\",\n    dragEnabled: \"$mouseHandler\",\n    focusTimout: \"$mouseHandler\",\n    tooltipFollowsMouse: \"$mouseHandler\",\n\n    firstLineNumber: \"session\",\n    overwrite: \"session\",\n    newLineMode: \"session\",\n    useWorker: \"session\",\n    useSoftTabs: \"session\",\n    tabSize: \"session\",\n    wrap: \"session\",\n    foldStyle: \"session\",\n    mode: \"session\"\n});\n\nexports.Editor = Editor;\n});\n\nace.define(\"ace/undomanager\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nvar UndoManager = function() {\n    this.reset();\n};\n\n(function() {\n    this.execute = function(options) {\n        var deltas = options.args[0];\n        this.$doc  = options.args[1];\n        if (options.merge && this.hasUndo()){\n            this.dirtyCounter--;\n            deltas = this.$undoStack.pop().concat(deltas);\n        }\n        this.$undoStack.push(deltas);\n        this.$redoStack = [];\n\n        if (this.dirtyCounter < 0) {\n            this.dirtyCounter = NaN;\n        }\n        this.dirtyCounter++;\n    };\n    this.undo = function(dontSelect) {\n        var deltas = this.$undoStack.pop();\n        var undoSelectionRange = null;\n        if (deltas) {\n            undoSelectionRange =\n                this.$doc.undoChanges(deltas, dontSelect);\n            this.$redoStack.push(deltas);\n            this.dirtyCounter--;\n        }\n\n        return undoSelectionRange;\n    };\n    this.redo = function(dontSelect) {\n        var deltas = this.$redoStack.pop();\n        var redoSelectionRange = null;\n        if (deltas) {\n            redoSelectionRange =\n                this.$doc.redoChanges(deltas, dontSelect);\n            this.$undoStack.push(deltas);\n            this.dirtyCounter++;\n        }\n\n        return redoSelectionRange;\n    };\n    this.reset = function() {\n        this.$undoStack = [];\n        this.$redoStack = [];\n        this.dirtyCounter = 0;\n    };\n    this.hasUndo = function() {\n        return this.$undoStack.length > 0;\n    };\n    this.hasRedo = function() {\n        return this.$redoStack.length > 0;\n    };\n    this.markClean = function() {\n        this.dirtyCounter = 0;\n    };\n    this.isClean = function() {\n        return this.dirtyCounter === 0;\n    };\n\n}).call(UndoManager.prototype);\n\nexports.UndoManager = UndoManager;\n});\n\nace.define(\"ace/layer/gutter\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar dom = require(\"../lib/dom\");\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar Gutter = function(parentEl) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_layer ace_gutter-layer\";\n    parentEl.appendChild(this.element);\n    this.setShowFoldWidgets(this.$showFoldWidgets);\n    \n    this.gutterWidth = 0;\n\n    this.$annotations = [];\n    this.$updateAnnotations = this.$updateAnnotations.bind(this);\n\n    this.$cells = [];\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n\n    this.setSession = function(session) {\n        if (this.session)\n            this.session.removeEventListener(\"change\", this.$updateAnnotations);\n        this.session = session;\n        if (session)\n            session.on(\"change\", this.$updateAnnotations);\n    };\n\n    this.addGutterDecoration = function(row, className){\n        if (window.console)\n            console.warn && console.warn(\"deprecated use session.addGutterDecoration\");\n        this.session.addGutterDecoration(row, className);\n    };\n\n    this.removeGutterDecoration = function(row, className){\n        if (window.console)\n            console.warn && console.warn(\"deprecated use session.removeGutterDecoration\");\n        this.session.removeGutterDecoration(row, className);\n    };\n\n    this.setAnnotations = function(annotations) {\n        this.$annotations = [];\n        for (var i = 0; i < annotations.length; i++) {\n            var annotation = annotations[i];\n            var row = annotation.row;\n            var rowInfo = this.$annotations[row];\n            if (!rowInfo)\n                rowInfo = this.$annotations[row] = {text: []};\n           \n            var annoText = annotation.text;\n            annoText = annoText ? lang.escapeHTML(annoText) : annotation.html || \"\";\n\n            if (rowInfo.text.indexOf(annoText) === -1)\n                rowInfo.text.push(annoText);\n\n            var type = annotation.type;\n            if (type == \"error\")\n                rowInfo.className = \" ace_error\";\n            else if (type == \"warning\" && rowInfo.className != \" ace_error\")\n                rowInfo.className = \" ace_warning\";\n            else if (type == \"info\" && (!rowInfo.className))\n                rowInfo.className = \" ace_info\";\n        }\n    };\n\n    this.$updateAnnotations = function (e) {\n        if (!this.$annotations.length)\n            return;\n        var delta = e.data;\n        var range = delta.range;\n        var firstRow = range.start.row;\n        var len = range.end.row - firstRow;\n        if (len === 0) {\n        } else if (delta.action == \"removeText\" || delta.action == \"removeLines\") {\n            this.$annotations.splice(firstRow, len + 1, null);\n        } else {\n            var args = new Array(len + 1);\n            args.unshift(firstRow, 1);\n            this.$annotations.splice.apply(this.$annotations, args);\n        }\n    };\n\n    this.update = function(config) {\n        var session = this.session;\n        var firstRow = config.firstRow;\n        var lastRow = Math.min(config.lastRow + config.gutterOffset,  // needed to compensate for hor scollbar\n            session.getLength() - 1);\n        var fold = session.getNextFoldLine(firstRow);\n        var foldStart = fold ? fold.start.row : Infinity;\n        var foldWidgets = this.$showFoldWidgets && session.foldWidgets;\n        var breakpoints = session.$breakpoints;\n        var decorations = session.$decorations;\n        var firstLineNumber = session.$firstLineNumber;\n        var lastLineNumber = 0;\n        \n        var gutterRenderer = session.gutterRenderer || this.$renderer;\n\n        var cell = null;\n        var index = -1;\n        var row = firstRow;\n        while (true) {\n            if (row > foldStart) {\n                row = fold.end.row + 1;\n                fold = session.getNextFoldLine(row, fold);\n                foldStart = fold ? fold.start.row : Infinity;\n            }\n            if (row > lastRow) {\n                while (this.$cells.length > index + 1) {\n                    cell = this.$cells.pop();\n                    this.element.removeChild(cell.element);\n                }\n                break;\n            }\n\n            cell = this.$cells[++index];\n            if (!cell) {\n                cell = {element: null, textNode: null, foldWidget: null};\n                cell.element = dom.createElement(\"div\");\n                cell.textNode = document.createTextNode('');\n                cell.element.appendChild(cell.textNode);\n                this.element.appendChild(cell.element);\n                this.$cells[index] = cell;\n            }\n\n            var className = \"ace_gutter-cell \";\n            if (breakpoints[row])\n                className += breakpoints[row];\n            if (decorations[row])\n                className += decorations[row];\n            if (this.$annotations[row])\n                className += this.$annotations[row].className;\n            if (cell.element.className != className)\n                cell.element.className = className;\n\n            var height = session.getRowLength(row) * config.lineHeight + \"px\";\n            if (height != cell.element.style.height)\n                cell.element.style.height = height;\n\n            if (foldWidgets) {\n                var c = foldWidgets[row];\n                if (c == null)\n                    c = foldWidgets[row] = session.getFoldWidget(row);\n            }\n\n            if (c) {\n                if (!cell.foldWidget) {\n                    cell.foldWidget = dom.createElement(\"span\");\n                    cell.element.appendChild(cell.foldWidget);\n                }\n                var className = \"ace_fold-widget ace_\" + c;\n                if (c == \"start\" && row == foldStart && row < fold.end.row)\n                    className += \" ace_closed\";\n                else\n                    className += \" ace_open\";\n                if (cell.foldWidget.className != className)\n                    cell.foldWidget.className = className;\n\n                var height = config.lineHeight + \"px\";\n                if (cell.foldWidget.style.height != height)\n                    cell.foldWidget.style.height = height;\n            } else {\n                if (cell.foldWidget) {\n                    cell.element.removeChild(cell.foldWidget);\n                    cell.foldWidget = null;\n                }\n            }\n            \n            var text = lastLineNumber = gutterRenderer\n                ? gutterRenderer.getText(session, row)\n                : row + firstLineNumber;\n            if (text != cell.textNode.data)\n                cell.textNode.data = text;\n\n            row++;\n        }\n\n        this.element.style.height = config.minHeight + \"px\";\n\n        if (this.$fixedWidth || session.$useWrapMode)\n            lastLineNumber = session.getLength() + firstLineNumber;\n\n        var gutterWidth = gutterRenderer \n            ? gutterRenderer.getWidth(session, lastLineNumber, config)\n            : lastLineNumber.toString().length * config.characterWidth;\n        \n        var padding = this.$padding || this.$computePadding();\n        gutterWidth += padding.left + padding.right;\n        if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) {\n            this.gutterWidth = gutterWidth;\n            this.element.style.width = Math.ceil(this.gutterWidth) + \"px\";\n            this._emit(\"changeGutterWidth\", gutterWidth);\n        }\n    };\n\n    this.$fixedWidth = false;\n    \n    this.$showLineNumbers = true;\n    this.$renderer = \"\";\n    this.setShowLineNumbers = function(show) {\n        this.$renderer = !show && {\n            getWidth: function() {return \"\"},\n            getText: function() {return \"\"}\n        };\n    };\n    \n    this.getShowLineNumbers = function() {\n        return this.$showLineNumbers;\n    };\n    \n    this.$showFoldWidgets = true;\n    this.setShowFoldWidgets = function(show) {\n        if (show)\n            dom.addCssClass(this.element, \"ace_folding-enabled\");\n        else\n            dom.removeCssClass(this.element, \"ace_folding-enabled\");\n\n        this.$showFoldWidgets = show;\n        this.$padding = null;\n    };\n    \n    this.getShowFoldWidgets = function() {\n        return this.$showFoldWidgets;\n    };\n\n    this.$computePadding = function() {\n        if (!this.element.firstChild)\n            return {left: 0, right: 0};\n        var style = dom.computedStyle(this.element.firstChild);\n        this.$padding = {};\n        this.$padding.left = parseInt(style.paddingLeft) + 1 || 0;\n        this.$padding.right = parseInt(style.paddingRight) || 0;\n        return this.$padding;\n    };\n\n    this.getRegion = function(point) {\n        var padding = this.$padding || this.$computePadding();\n        var rect = this.element.getBoundingClientRect();\n        if (point.x < padding.left + rect.left)\n            return \"markers\";\n        if (this.$showFoldWidgets && point.x > rect.right - padding.right)\n            return \"foldWidgets\";\n    };\n\n}).call(Gutter.prototype);\n\nexports.Gutter = Gutter;\n\n});\n\nace.define(\"ace/layer/marker\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\nvar dom = require(\"../lib/dom\");\n\nvar Marker = function(parentEl) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_layer ace_marker-layer\";\n    parentEl.appendChild(this.element);\n};\n\n(function() {\n\n    this.$padding = 0;\n\n    this.setPadding = function(padding) {\n        this.$padding = padding;\n    };\n    this.setSession = function(session) {\n        this.session = session;\n    };\n    \n    this.setMarkers = function(markers) {\n        this.markers = markers;\n    };\n\n    this.update = function(config) {\n        var config = config || this.config;\n        if (!config)\n            return;\n\n        this.config = config;\n\n\n        var html = [];\n        for (var key in this.markers) {\n            var marker = this.markers[key];\n\n            if (!marker.range) {\n                marker.update(html, this, this.session, config);\n                continue;\n            }\n\n            var range = marker.range.clipRows(config.firstRow, config.lastRow);\n            if (range.isEmpty()) continue;\n\n            range = range.toScreenRange(this.session);\n            if (marker.renderer) {\n                var top = this.$getTop(range.start.row, config);\n                var left = this.$padding + range.start.column * config.characterWidth;\n                marker.renderer(html, range, left, top, config);\n            } else if (marker.type == \"fullLine\") {\n                this.drawFullLineMarker(html, range, marker.clazz, config);\n            } else if (marker.type == \"screenLine\") {\n                this.drawScreenLineMarker(html, range, marker.clazz, config);\n            } else if (range.isMultiLine()) {\n                if (marker.type == \"text\")\n                    this.drawTextMarker(html, range, marker.clazz, config);\n                else\n                    this.drawMultiLineMarker(html, range, marker.clazz, config);\n            } else {\n                this.drawSingleLineMarker(html, range, marker.clazz + \" ace_start\", config);\n            }\n        }\n        this.element.innerHTML = html.join(\"\");\n    };\n\n    this.$getTop = function(row, layerConfig) {\n        return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight;\n    };\n    this.drawTextMarker = function(stringBuilder, range, clazz, layerConfig, extraStyle) {\n        var row = range.start.row;\n\n        var lineRange = new Range(\n            row, range.start.column,\n            row, this.session.getScreenLastRowColumn(row)\n        );\n        this.drawSingleLineMarker(stringBuilder, lineRange, clazz + \" ace_start\", layerConfig, 1, extraStyle);\n        row = range.end.row;\n        lineRange = new Range(row, 0, row, range.end.column);\n        this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 0, extraStyle);\n\n        for (row = range.start.row + 1; row < range.end.row; row++) {\n            lineRange.start.row = row;\n            lineRange.end.row = row;\n            lineRange.end.column = this.session.getScreenLastRowColumn(row);\n            this.drawSingleLineMarker(stringBuilder, lineRange, clazz, layerConfig, 1, extraStyle);\n        }\n    };\n    this.drawMultiLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n        var padding = this.$padding;\n        var height = config.lineHeight;\n        var top = this.$getTop(range.start.row, config);\n        var left = padding + range.start.column * config.characterWidth;\n        extraStyle = extraStyle || \"\";\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \" ace_start' style='\",\n            \"height:\", height, \"px;\",\n            \"right:0;\",\n            \"top:\", top, \"px;\",\n            \"left:\", left, \"px;\", extraStyle, \"'></div>\"\n        );\n        top = this.$getTop(range.end.row, config);\n        var width = range.end.column * config.characterWidth;\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \"' style='\",\n            \"height:\", height, \"px;\",\n            \"width:\", width, \"px;\",\n            \"top:\", top, \"px;\",\n            \"left:\", padding, \"px;\", extraStyle, \"'></div>\"\n        );\n        height = (range.end.row - range.start.row - 1) * config.lineHeight;\n        if (height < 0)\n            return;\n        top = this.$getTop(range.start.row + 1, config);\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \"' style='\",\n            \"height:\", height, \"px;\",\n            \"right:0;\",\n            \"top:\", top, \"px;\",\n            \"left:\", padding, \"px;\", extraStyle, \"'></div>\"\n        );\n    };\n    this.drawSingleLineMarker = function(stringBuilder, range, clazz, config, extraLength, extraStyle) {\n        var height = config.lineHeight;\n        var width = (range.end.column + (extraLength || 0) - range.start.column) * config.characterWidth;\n\n        var top = this.$getTop(range.start.row, config);\n        var left = this.$padding + range.start.column * config.characterWidth;\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \"' style='\",\n            \"height:\", height, \"px;\",\n            \"width:\", width, \"px;\",\n            \"top:\", top, \"px;\",\n            \"left:\", left, \"px;\", extraStyle || \"\", \"'></div>\"\n        );\n    };\n\n    this.drawFullLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n        var top = this.$getTop(range.start.row, config);\n        var height = config.lineHeight;\n        if (range.start.row != range.end.row)\n            height += this.$getTop(range.end.row, config) - top;\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \"' style='\",\n            \"height:\", height, \"px;\",\n            \"top:\", top, \"px;\",\n            \"left:0;right:0;\", extraStyle || \"\", \"'></div>\"\n        );\n    };\n    \n    this.drawScreenLineMarker = function(stringBuilder, range, clazz, config, extraStyle) {\n        var top = this.$getTop(range.start.row, config);\n        var height = config.lineHeight;\n\n        stringBuilder.push(\n            \"<div class='\", clazz, \"' style='\",\n            \"height:\", height, \"px;\",\n            \"top:\", top, \"px;\",\n            \"left:0;right:0;\", extraStyle || \"\", \"'></div>\"\n        );\n    };\n\n}).call(Marker.prototype);\n\nexports.Marker = Marker;\n\n});\n\nace.define(\"ace/layer/text\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar dom = require(\"../lib/dom\");\nvar lang = require(\"../lib/lang\");\nvar useragent = require(\"../lib/useragent\");\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar Text = function(parentEl) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_layer ace_text-layer\";\n    parentEl.appendChild(this.element);\n    this.$updateEolChar = this.$updateEolChar.bind(this);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n\n    this.EOF_CHAR = \"\\xB6\";\n    this.EOL_CHAR_LF = \"\\xAC\";\n    this.EOL_CHAR_CRLF = \"\\xa4\";\n    this.EOL_CHAR = this.EOL_CHAR_LF;\n    this.TAB_CHAR = \"\\u2192\"; //\"\\u21E5\";\n    this.SPACE_CHAR = \"\\xB7\";\n    this.$padding = 0;\n\n    this.$updateEolChar = function() {\n        var EOL_CHAR = this.session.doc.getNewLineCharacter() == \"\\n\"\n           ? this.EOL_CHAR_LF\n           : this.EOL_CHAR_CRLF;\n        if (this.EOL_CHAR != EOL_CHAR) {\n            this.EOL_CHAR = EOL_CHAR;\n            return true;\n        }\n    }\n\n    this.setPadding = function(padding) {\n        this.$padding = padding;\n        this.element.style.padding = \"0 \" + padding + \"px\";\n    };\n\n    this.getLineHeight = function() {\n        return this.$fontMetrics.$characterSize.height || 0;\n    };\n\n    this.getCharacterWidth = function() {\n        return this.$fontMetrics.$characterSize.width || 0;\n    };\n    \n    this.$setFontMetrics = function(measure) {\n        this.$fontMetrics = measure;\n        this.$fontMetrics.on(\"changeCharacterSize\", function(e) {\n            this._signal(\"changeCharacterSize\", e);\n        }.bind(this));\n        this.$pollSizeChanges();\n    }\n\n    this.checkForSizeChanges = function() {\n        this.$fontMetrics.checkForSizeChanges();\n    };\n    this.$pollSizeChanges = function() {\n        return this.$pollSizeChangesTimer = this.$fontMetrics.$pollSizeChanges();\n    };\n    this.setSession = function(session) {\n        this.session = session;\n        if (session)\n            this.$computeTabString();\n    };\n\n    this.showInvisibles = false;\n    this.setShowInvisibles = function(showInvisibles) {\n        if (this.showInvisibles == showInvisibles)\n            return false;\n\n        this.showInvisibles = showInvisibles;\n        this.$computeTabString();\n        return true;\n    };\n\n    this.displayIndentGuides = true;\n    this.setDisplayIndentGuides = function(display) {\n        if (this.displayIndentGuides == display)\n            return false;\n\n        this.displayIndentGuides = display;\n        this.$computeTabString();\n        return true;\n    };\n\n    this.$tabStrings = [];\n    this.onChangeTabSize =\n    this.$computeTabString = function() {\n        var tabSize = this.session.getTabSize();\n        this.tabSize = tabSize;\n        var tabStr = this.$tabStrings = [0];\n        for (var i = 1; i < tabSize + 1; i++) {\n            if (this.showInvisibles) {\n                tabStr.push(\"<span class='ace_invisible ace_invisible_tab'>\"\n                    + this.TAB_CHAR\n                    + lang.stringRepeat(\"\\xa0\", i - 1)\n                    + \"</span>\");\n            } else {\n                tabStr.push(lang.stringRepeat(\"\\xa0\", i));\n            }\n        }\n        if (this.displayIndentGuides) {\n            this.$indentGuideRe =  /\\s\\S| \\t|\\t |\\s$/;\n            var className = \"ace_indent-guide\";\n            var spaceClass = \"\";\n            var tabClass = \"\";\n            if (this.showInvisibles) {\n                className += \" ace_invisible\";\n                spaceClass = \" ace_invisible_space\";\n                tabClass = \" ace_invisible_tab\";\n                var spaceContent = lang.stringRepeat(this.SPACE_CHAR, this.tabSize);\n                var tabContent = this.TAB_CHAR + lang.stringRepeat(\"\\xa0\", this.tabSize - 1);\n            } else{\n                var spaceContent = lang.stringRepeat(\"\\xa0\", this.tabSize);\n                var tabContent = spaceContent;\n            }\n\n            this.$tabStrings[\" \"] = \"<span class='\" + className + spaceClass + \"'>\" + spaceContent + \"</span>\";\n            this.$tabStrings[\"\\t\"] = \"<span class='\" + className + tabClass + \"'>\" + tabContent + \"</span>\";\n        }\n    };\n\n    this.updateLines = function(config, firstRow, lastRow) {\n        if (this.config.lastRow != config.lastRow ||\n            this.config.firstRow != config.firstRow) {\n            this.scrollLines(config);\n        }\n        this.config = config;\n\n        var first = Math.max(firstRow, config.firstRow);\n        var last = Math.min(lastRow, config.lastRow);\n\n        var lineElements = this.element.childNodes;\n        var lineElementsIdx = 0;\n\n        for (var row = config.firstRow; row < first; row++) {\n            var foldLine = this.session.getFoldLine(row);\n            if (foldLine) {\n                if (foldLine.containsRow(first)) {\n                    first = foldLine.start.row;\n                    break;\n                } else {\n                    row = foldLine.end.row;\n                }\n            }\n            lineElementsIdx ++;\n        }\n\n        var row = first;\n        var foldLine = this.session.getNextFoldLine(row);\n        var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n        while (true) {\n            if (row > foldStart) {\n                row = foldLine.end.row+1;\n                foldLine = this.session.getNextFoldLine(row, foldLine);\n                foldStart = foldLine ? foldLine.start.row :Infinity;\n            }\n            if (row > last)\n                break;\n\n            var lineElement = lineElements[lineElementsIdx++];\n            if (lineElement) {\n                var html = [];\n                this.$renderLine(\n                    html, row, !this.$useLineGroups(), row == foldStart ? foldLine : false\n                );\n                lineElement.style.height = config.lineHeight * this.session.getRowLength(row) + \"px\";\n                lineElement.innerHTML = html.join(\"\");\n            }\n            row++;\n        }\n    };\n\n    this.scrollLines = function(config) {\n        var oldConfig = this.config;\n        this.config = config;\n\n        if (!oldConfig || oldConfig.lastRow < config.firstRow)\n            return this.update(config);\n\n        if (config.lastRow < oldConfig.firstRow)\n            return this.update(config);\n\n        var el = this.element;\n        if (oldConfig.firstRow < config.firstRow)\n            for (var row=this.session.getFoldedRowCount(oldConfig.firstRow, config.firstRow - 1); row>0; row--)\n                el.removeChild(el.firstChild);\n\n        if (oldConfig.lastRow > config.lastRow)\n            for (var row=this.session.getFoldedRowCount(config.lastRow + 1, oldConfig.lastRow); row>0; row--)\n                el.removeChild(el.lastChild);\n\n        if (config.firstRow < oldConfig.firstRow) {\n            var fragment = this.$renderLinesFragment(config, config.firstRow, oldConfig.firstRow - 1);\n            if (el.firstChild)\n                el.insertBefore(fragment, el.firstChild);\n            else\n                el.appendChild(fragment);\n        }\n\n        if (config.lastRow > oldConfig.lastRow) {\n            var fragment = this.$renderLinesFragment(config, oldConfig.lastRow + 1, config.lastRow);\n            el.appendChild(fragment);\n        }\n    };\n\n    this.$renderLinesFragment = function(config, firstRow, lastRow) {\n        var fragment = this.element.ownerDocument.createDocumentFragment();\n        var row = firstRow;\n        var foldLine = this.session.getNextFoldLine(row);\n        var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n        while (true) {\n            if (row > foldStart) {\n                row = foldLine.end.row+1;\n                foldLine = this.session.getNextFoldLine(row, foldLine);\n                foldStart = foldLine ? foldLine.start.row : Infinity;\n            }\n            if (row > lastRow)\n                break;\n\n            var container = dom.createElement(\"div\");\n\n            var html = [];\n            this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\n            container.innerHTML = html.join(\"\");\n            if (this.$useLineGroups()) {\n                container.className = 'ace_line_group';\n                fragment.appendChild(container);\n                container.style.height = config.lineHeight * this.session.getRowLength(row) + \"px\";\n\n            } else {\n                while(container.firstChild)\n                    fragment.appendChild(container.firstChild);\n            }\n\n            row++;\n        }\n        return fragment;\n    };\n\n    this.update = function(config) {\n        this.config = config;\n\n        var html = [];\n        var firstRow = config.firstRow, lastRow = config.lastRow;\n\n        var row = firstRow;\n        var foldLine = this.session.getNextFoldLine(row);\n        var foldStart = foldLine ? foldLine.start.row : Infinity;\n\n        while (true) {\n            if (row > foldStart) {\n                row = foldLine.end.row+1;\n                foldLine = this.session.getNextFoldLine(row, foldLine);\n                foldStart = foldLine ? foldLine.start.row :Infinity;\n            }\n            if (row > lastRow)\n                break;\n\n            if (this.$useLineGroups())\n                html.push(\"<div class='ace_line_group' style='height:\", config.lineHeight*this.session.getRowLength(row), \"px'>\")\n\n            this.$renderLine(html, row, false, row == foldStart ? foldLine : false);\n\n            if (this.$useLineGroups())\n                html.push(\"</div>\"); // end the line group\n\n            row++;\n        }\n        this.element.innerHTML = html.join(\"\");\n    };\n\n    this.$textToken = {\n        \"text\": true,\n        \"rparen\": true,\n        \"lparen\": true\n    };\n\n    this.$renderToken = function(stringBuilder, screenColumn, token, value) {\n        var self = this;\n        var replaceReg = /\\t|&|<|( +)|([\\x00-\\x1f\\x80-\\xa0\\xad\\u1680\\u180E\\u2000-\\u200f\\u2028\\u2029\\u202F\\u205F\\u3000\\uFEFF])|[\\u1100-\\u115F\\u11A3-\\u11A7\\u11FA-\\u11FF\\u2329-\\u232A\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3000-\\u303E\\u3041-\\u3096\\u3099-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u3190-\\u31BA\\u31C0-\\u31E3\\u31F0-\\u321E\\u3220-\\u3247\\u3250-\\u32FE\\u3300-\\u4DBF\\u4E00-\\uA48C\\uA490-\\uA4C6\\uA960-\\uA97C\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFAFF\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE66\\uFE68-\\uFE6B\\uFF01-\\uFF60\\uFFE0-\\uFFE6]/g;\n        var replaceFunc = function(c, a, b, tabIdx, idx4) {\n            if (a) {\n                return self.showInvisibles ?\n                    \"<span class='ace_invisible ace_invisible_space'>\" + lang.stringRepeat(self.SPACE_CHAR, c.length) + \"</span>\" :\n                    lang.stringRepeat(\"\\xa0\", c.length);\n            } else if (c == \"&\") {\n                return \"&#38;\";\n            } else if (c == \"<\") {\n                return \"&#60;\";\n            } else if (c == \"\\t\") {\n                var tabSize = self.session.getScreenTabSize(screenColumn + tabIdx);\n                screenColumn += tabSize - 1;\n                return self.$tabStrings[tabSize];\n            } else if (c == \"\\u3000\") {\n                var classToUse = self.showInvisibles ? \"ace_cjk ace_invisible ace_invisible_space\" : \"ace_cjk\";\n                var space = self.showInvisibles ? self.SPACE_CHAR : \"\";\n                screenColumn += 1;\n                return \"<span class='\" + classToUse + \"' style='width:\" +\n                    (self.config.characterWidth * 2) +\n                    \"px'>\" + space + \"</span>\";\n            } else if (b) {\n                return \"<span class='ace_invisible ace_invisible_space ace_invalid'>\" + self.SPACE_CHAR + \"</span>\";\n            } else {\n                screenColumn += 1;\n                return \"<span class='ace_cjk' style='width:\" +\n                    (self.config.characterWidth * 2) +\n                    \"px'>\" + c + \"</span>\";\n            }\n        };\n\n        var output = value.replace(replaceReg, replaceFunc);\n\n        if (!this.$textToken[token.type]) {\n            var classes = \"ace_\" + token.type.replace(/\\./g, \" ace_\");\n            var style = \"\";\n            if (token.type == \"fold\")\n                style = \" style='width:\" + (token.value.length * this.config.characterWidth) + \"px;' \";\n            stringBuilder.push(\"<span class='\", classes, \"'\", style, \">\", output, \"</span>\");\n        }\n        else {\n            stringBuilder.push(output);\n        }\n        return screenColumn + value.length;\n    };\n\n    this.renderIndentGuide = function(stringBuilder, value, max) {\n        var cols = value.search(this.$indentGuideRe);\n        if (cols <= 0 || cols >= max)\n            return value;\n        if (value[0] == \" \") {\n            cols -= cols % this.tabSize;\n            stringBuilder.push(lang.stringRepeat(this.$tabStrings[\" \"], cols/this.tabSize));\n            return value.substr(cols);\n        } else if (value[0] == \"\\t\") {\n            stringBuilder.push(lang.stringRepeat(this.$tabStrings[\"\\t\"], cols));\n            return value.substr(cols);\n        }\n        return value;\n    };\n\n    this.$renderWrappedLine = function(stringBuilder, tokens, splits, onlyContents) {\n        var chars = 0;\n        var split = 0;\n        var splitChars = splits[0];\n        var screenColumn = 0;\n\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            var value = token.value;\n            if (i == 0 && this.displayIndentGuides) {\n                chars = value.length;\n                value = this.renderIndentGuide(stringBuilder, value, splitChars);\n                if (!value)\n                    continue;\n                chars -= value.length;\n            }\n\n            if (chars + value.length < splitChars) {\n                screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n                chars += value.length;\n            } else {\n                while (chars + value.length >= splitChars) {\n                    screenColumn = this.$renderToken(\n                        stringBuilder, screenColumn,\n                        token, value.substring(0, splitChars - chars)\n                    );\n                    value = value.substring(splitChars - chars);\n                    chars = splitChars;\n\n                    if (!onlyContents) {\n                        stringBuilder.push(\"</div>\",\n                            \"<div class='ace_line' style='height:\",\n                            this.config.lineHeight, \"px'>\"\n                        );\n                    }\n\n                    split ++;\n                    screenColumn = 0;\n                    splitChars = splits[split] || Number.MAX_VALUE;\n                }\n                if (value.length != 0) {\n                    chars += value.length;\n                    screenColumn = this.$renderToken(\n                        stringBuilder, screenColumn, token, value\n                    );\n                }\n            }\n        }\n    };\n\n    this.$renderSimpleLine = function(stringBuilder, tokens) {\n        var screenColumn = 0;\n        var token = tokens[0];\n        var value = token.value;\n        if (this.displayIndentGuides)\n            value = this.renderIndentGuide(stringBuilder, value);\n        if (value)\n            screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n        for (var i = 1; i < tokens.length; i++) {\n            token = tokens[i];\n            value = token.value;\n            screenColumn = this.$renderToken(stringBuilder, screenColumn, token, value);\n        }\n    };\n    this.$renderLine = function(stringBuilder, row, onlyContents, foldLine) {\n        if (!foldLine && foldLine != false)\n            foldLine = this.session.getFoldLine(row);\n\n        if (foldLine)\n            var tokens = this.$getFoldLineTokens(row, foldLine);\n        else\n            var tokens = this.session.getTokens(row);\n\n\n        if (!onlyContents) {\n            stringBuilder.push(\n                \"<div class='ace_line' style='height:\", \n                    this.config.lineHeight * (\n                        this.$useLineGroups() ? 1 :this.session.getRowLength(row)\n                    ), \"px'>\"\n            );\n        }\n\n        if (tokens.length) {\n            var splits = this.session.getRowSplitData(row);\n            if (splits && splits.length)\n                this.$renderWrappedLine(stringBuilder, tokens, splits, onlyContents);\n            else\n                this.$renderSimpleLine(stringBuilder, tokens);\n        }\n\n        if (this.showInvisibles) {\n            if (foldLine)\n                row = foldLine.end.row\n\n            stringBuilder.push(\n                \"<span class='ace_invisible ace_invisible_eol'>\",\n                row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR,\n                \"</span>\"\n            );\n        }\n        if (!onlyContents)\n            stringBuilder.push(\"</div>\");\n    };\n\n    this.$getFoldLineTokens = function(row, foldLine) {\n        var session = this.session;\n        var renderTokens = [];\n\n        function addTokens(tokens, from, to) {\n            var idx = 0, col = 0;\n            while ((col + tokens[idx].value.length) < from) {\n                col += tokens[idx].value.length;\n                idx++;\n\n                if (idx == tokens.length)\n                    return;\n            }\n            if (col != from) {\n                var value = tokens[idx].value.substring(from - col);\n                if (value.length > (to - from))\n                    value = value.substring(0, to - from);\n\n                renderTokens.push({\n                    type: tokens[idx].type,\n                    value: value\n                });\n\n                col = from + value.length;\n                idx += 1;\n            }\n\n            while (col < to && idx < tokens.length) {\n                var value = tokens[idx].value;\n                if (value.length + col > to) {\n                    renderTokens.push({\n                        type: tokens[idx].type,\n                        value: value.substring(0, to - col)\n                    });\n                } else\n                    renderTokens.push(tokens[idx]);\n                col += value.length;\n                idx += 1;\n            }\n        }\n\n        var tokens = session.getTokens(row);\n        foldLine.walk(function(placeholder, row, column, lastColumn, isNewRow) {\n            if (placeholder != null) {\n                renderTokens.push({\n                    type: \"fold\",\n                    value: placeholder\n                });\n            } else {\n                if (isNewRow)\n                    tokens = session.getTokens(row);\n\n                if (tokens.length)\n                    addTokens(tokens, lastColumn, column);\n            }\n        }, foldLine.end.row, this.session.getLine(foldLine.end.row).length);\n\n        return renderTokens;\n    };\n\n    this.$useLineGroups = function() {\n        return this.session.getUseWrapMode();\n    };\n\n    this.destroy = function() {\n        clearInterval(this.$pollSizeChangesTimer);\n        if (this.$measureNode)\n            this.$measureNode.parentNode.removeChild(this.$measureNode);\n        delete this.$measureNode;\n    };\n\n}).call(Text.prototype);\n\nexports.Text = Text;\n\n});\n\nace.define(\"ace/layer/cursor\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar dom = require(\"../lib/dom\");\nvar IE8;\n\nvar Cursor = function(parentEl) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_layer ace_cursor-layer\";\n    parentEl.appendChild(this.element);\n    \n    if (IE8 === undefined)\n        IE8 = \"opacity\" in this.element;\n\n    this.isVisible = false;\n    this.isBlinking = true;\n    this.blinkInterval = 1000;\n    this.smoothBlinking = false;\n\n    this.cursors = [];\n    this.cursor = this.addCursor();\n    dom.addCssClass(this.element, \"ace_hidden-cursors\");\n    this.$updateCursors = this.$updateVisibility.bind(this);\n};\n\n(function() {\n    \n    this.$updateVisibility = function(val) {\n        var cursors = this.cursors;\n        for (var i = cursors.length; i--; )\n            cursors[i].style.visibility = val ? \"\" : \"hidden\";\n    };\n    this.$updateOpacity = function(val) {\n        var cursors = this.cursors;\n        for (var i = cursors.length; i--; )\n            cursors[i].style.opacity = val ? \"\" : \"0\";\n    };\n    \n\n    this.$padding = 0;\n    this.setPadding = function(padding) {\n        this.$padding = padding;\n    };\n\n    this.setSession = function(session) {\n        this.session = session;\n    };\n\n    this.setBlinking = function(blinking) {\n        if (blinking != this.isBlinking){\n            this.isBlinking = blinking;\n            this.restartTimer();\n        }\n    };\n\n    this.setBlinkInterval = function(blinkInterval) {\n        if (blinkInterval != this.blinkInterval){\n            this.blinkInterval = blinkInterval;\n            this.restartTimer();\n        }\n    };\n\n    this.setSmoothBlinking = function(smoothBlinking) {\n        if (smoothBlinking != this.smoothBlinking && !IE8) {\n            this.smoothBlinking = smoothBlinking;\n            dom.setCssClass(this.element, \"ace_smooth-blinking\", smoothBlinking);\n            this.$updateCursors(true);\n            this.$updateCursors = (smoothBlinking \n                ? this.$updateOpacity\n                : this.$updateVisibility).bind(this);\n            this.restartTimer();\n        }\n    };\n\n    this.addCursor = function() {\n        var el = dom.createElement(\"div\");\n        el.className = \"ace_cursor\";\n        this.element.appendChild(el);\n        this.cursors.push(el);\n        return el;\n    };\n\n    this.removeCursor = function() {\n        if (this.cursors.length > 1) {\n            var el = this.cursors.pop();\n            el.parentNode.removeChild(el);\n            return el;\n        }\n    };\n\n    this.hideCursor = function() {\n        this.isVisible = false;\n        dom.addCssClass(this.element, \"ace_hidden-cursors\");\n        this.restartTimer();\n    };\n\n    this.showCursor = function() {\n        this.isVisible = true;\n        dom.removeCssClass(this.element, \"ace_hidden-cursors\");\n        this.restartTimer();\n    };\n\n    this.restartTimer = function() {\n        var update = this.$updateCursors;\n        clearInterval(this.intervalId);\n        clearTimeout(this.timeoutId);\n        if (this.smoothBlinking) {\n            dom.removeCssClass(this.element, \"ace_smooth-blinking\");\n        }\n        \n        update(true);\n\n        if (!this.isBlinking || !this.blinkInterval || !this.isVisible)\n            return;\n\n        if (this.smoothBlinking) {\n            setTimeout(function(){\n                dom.addCssClass(this.element, \"ace_smooth-blinking\");\n            }.bind(this));\n        }\n        \n        var blink = function(){\n            this.timeoutId = setTimeout(function() {\n                update(false);\n            }, 0.6 * this.blinkInterval);\n        }.bind(this);\n\n        this.intervalId = setInterval(function() {\n            update(true);\n            blink();\n        }, this.blinkInterval);\n\n        blink();\n    };\n\n    this.getPixelPosition = function(position, onScreen) {\n        if (!this.config || !this.session)\n            return {left : 0, top : 0};\n\n        if (!position)\n            position = this.session.selection.getCursor();\n        var pos = this.session.documentToScreenPosition(position);\n        var cursorLeft = this.$padding + pos.column * this.config.characterWidth;\n        var cursorTop = (pos.row - (onScreen ? this.config.firstRowScreen : 0)) *\n            this.config.lineHeight;\n\n        return {left : cursorLeft, top : cursorTop};\n    };\n\n    this.update = function(config) {\n        this.config = config;\n\n        var selections = this.session.$selectionMarkers;\n        var i = 0, cursorIndex = 0;\n\n        if (selections === undefined || selections.length === 0){\n            selections = [{cursor: null}];\n        }\n\n        for (var i = 0, n = selections.length; i < n; i++) {\n            var pixelPos = this.getPixelPosition(selections[i].cursor, true);\n            if ((pixelPos.top > config.height + config.offset ||\n                 pixelPos.top < 0) && i > 1) {\n                continue;\n            }\n\n            var style = (this.cursors[cursorIndex++] || this.addCursor()).style;\n            \n            if (!this.drawCursor) {\n                style.left = pixelPos.left + \"px\";\n                style.top = pixelPos.top + \"px\";\n                style.width = config.characterWidth + \"px\";\n                style.height = config.lineHeight + \"px\";\n            } else {\n                this.drawCursor(style, pixelPos, config, selections[i], this.session);\n            }\n        }\n        while (this.cursors.length > cursorIndex)\n            this.removeCursor();\n\n        var overwrite = this.session.getOverwrite();\n        this.$setOverwrite(overwrite);\n        this.$pixelPos = pixelPos;\n        this.restartTimer();\n    };\n    \n    this.drawCursor = null;\n\n    this.$setOverwrite = function(overwrite) {\n        if (overwrite != this.overwrite) {\n            this.overwrite = overwrite;\n            if (overwrite)\n                dom.addCssClass(this.element, \"ace_overwrite-cursors\");\n            else\n                dom.removeCssClass(this.element, \"ace_overwrite-cursors\");\n        }\n    };\n\n    this.destroy = function() {\n        clearInterval(this.intervalId);\n        clearTimeout(this.timeoutId);\n    };\n\n}).call(Cursor.prototype);\n\nexports.Cursor = Cursor;\n\n});\n\nace.define(\"ace/scrollbar\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nvar event = require(\"./lib/event\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar ScrollBar = function(parent) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_scrollbar ace_scrollbar\" + this.classSuffix;\n\n    this.inner = dom.createElement(\"div\");\n    this.inner.className = \"ace_scrollbar-inner\";\n    this.element.appendChild(this.inner);\n\n    parent.appendChild(this.element);\n\n    this.setVisible(false);\n    this.skipEvent = false;\n\n    event.addListener(this.element, \"scroll\", this.onScroll.bind(this));\n    event.addListener(this.element, \"mousedown\", event.preventDefault);\n};\n\n(function() {\n    oop.implement(this, EventEmitter);\n\n    this.setVisible = function(isVisible) {\n        this.element.style.display = isVisible ? \"\" : \"none\";\n        this.isVisible = isVisible;\n    };\n}).call(ScrollBar.prototype);\nvar VScrollBar = function(parent, renderer) {\n    ScrollBar.call(this, parent);\n    this.scrollTop = 0;\n    renderer.$scrollbarWidth = \n    this.width = dom.scrollbarWidth(parent.ownerDocument);\n    this.inner.style.width =\n    this.element.style.width = (this.width || 15) + 5 + \"px\";\n};\n\noop.inherits(VScrollBar, ScrollBar);\n\n(function() {\n\n    this.classSuffix = '-v';\n    this.onScroll = function() {\n        if (!this.skipEvent) {\n            this.scrollTop = this.element.scrollTop;\n            this._emit(\"scroll\", {data: this.scrollTop});\n        }\n        this.skipEvent = false;\n    };\n    this.getWidth = function() {\n        return this.isVisible ? this.width : 0;\n    };\n    this.setHeight = function(height) {\n        this.element.style.height = height + \"px\";\n    };\n    this.setInnerHeight = function(height) {\n        this.inner.style.height = height + \"px\";\n    };\n    this.setScrollHeight = function(height) {\n        this.inner.style.height = height + \"px\";\n    };\n    this.setScrollTop = function(scrollTop) {\n        if (this.scrollTop != scrollTop) {\n            this.skipEvent = true;\n            this.scrollTop = this.element.scrollTop = scrollTop;\n        }\n    };\n\n}).call(VScrollBar.prototype);\nvar HScrollBar = function(parent, renderer) {\n    ScrollBar.call(this, parent);\n    this.scrollLeft = 0;\n    this.height = renderer.$scrollbarWidth;\n    this.inner.style.height =\n    this.element.style.height = (this.height || 15) + 5 + \"px\";\n};\n\noop.inherits(HScrollBar, ScrollBar);\n\n(function() {\n\n    this.classSuffix = '-h';\n    this.onScroll = function() {\n        if (!this.skipEvent) {\n            this.scrollLeft = this.element.scrollLeft;\n            this._emit(\"scroll\", {data: this.scrollLeft});\n        }\n        this.skipEvent = false;\n    };\n    this.getHeight = function() {\n        return this.isVisible ? this.height : 0;\n    };\n    this.setWidth = function(width) {\n        this.element.style.width = width + \"px\";\n    };\n    this.setInnerWidth = function(width) {\n        this.inner.style.width = width + \"px\";\n    };\n    this.setScrollWidth = function(width) {\n        this.inner.style.width = width + \"px\";\n    };\n    this.setScrollLeft = function(scrollLeft) {\n        if (this.scrollLeft != scrollLeft) {\n            this.skipEvent = true;\n            this.scrollLeft = this.element.scrollLeft = scrollLeft;\n        }\n    };\n\n}).call(HScrollBar.prototype);\n\n\nexports.ScrollBar = VScrollBar; // backward compatibility\nexports.ScrollBarV = VScrollBar; // backward compatibility\nexports.ScrollBarH = HScrollBar; // backward compatibility\n\nexports.VScrollBar = VScrollBar;\nexports.HScrollBar = HScrollBar;\n});\n\nace.define(\"ace/renderloop\",[\"require\",\"exports\",\"module\",\"ace/lib/event\"], function(require, exports, module) {\n\"use strict\";\n\nvar event = require(\"./lib/event\");\n\n\nvar RenderLoop = function(onRender, win) {\n    this.onRender = onRender;\n    this.pending = false;\n    this.changes = 0;\n    this.window = win || window;\n};\n\n(function() {\n\n\n    this.schedule = function(change) {\n        this.changes = this.changes | change;\n        if (!this.pending && this.changes) {\n            this.pending = true;\n            var _self = this;\n            event.nextFrame(function() {\n                _self.pending = false;\n                var changes;\n                while (changes = _self.changes) {\n                    _self.changes = 0;\n                    _self.onRender(changes);\n                }\n            }, this.window);\n        }\n    };\n\n}).call(RenderLoop.prototype);\n\nexports.RenderLoop = RenderLoop;\n});\n\nace.define(\"ace/layer/font_metrics\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/useragent\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\nvar oop = require(\"../lib/oop\");\nvar dom = require(\"../lib/dom\");\nvar lang = require(\"../lib/lang\");\nvar useragent = require(\"../lib/useragent\");\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n\nvar CHAR_COUNT = 0;\n\nvar FontMetrics = exports.FontMetrics = function(parentEl, interval) {\n    this.el = dom.createElement(\"div\");\n    this.$setMeasureNodeStyles(this.el.style, true);\n    \n    this.$main = dom.createElement(\"div\");\n    this.$setMeasureNodeStyles(this.$main.style);\n    \n    this.$measureNode = dom.createElement(\"div\");\n    this.$setMeasureNodeStyles(this.$measureNode.style);\n    \n    \n    this.el.appendChild(this.$main);\n    this.el.appendChild(this.$measureNode);\n    parentEl.appendChild(this.el);\n    \n    if (!CHAR_COUNT)\n        this.$testFractionalRect();\n    this.$measureNode.innerHTML = lang.stringRepeat(\"X\", CHAR_COUNT);\n    \n    this.$characterSize = {width: 0, height: 0};\n    this.checkForSizeChanges();\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n        \n    this.$characterSize = {width: 0, height: 0};\n    \n    this.$testFractionalRect = function() {\n        var el = dom.createElement(\"div\");\n        this.$setMeasureNodeStyles(el.style);\n        el.style.width = \"0.2px\";\n        document.documentElement.appendChild(el);\n        var w = el.getBoundingClientRect().width;\n        if (w > 0 && w < 1)\n            CHAR_COUNT = 50;\n        else\n            CHAR_COUNT = 100;\n        el.parentNode.removeChild(el);\n    };\n    \n    this.$setMeasureNodeStyles = function(style, isRoot) {\n        style.width = style.height = \"auto\";\n        style.left = style.top = \"0px\";\n        style.visibility = \"hidden\";\n        style.position = \"absolute\";\n        style.whiteSpace = \"pre\";\n\n        if (useragent.isIE < 8) {\n            style[\"font-family\"] = \"inherit\";\n        } else {\n            style.font = \"inherit\";\n        }\n        style.overflow = isRoot ? \"hidden\" : \"visible\";\n    };\n\n    this.checkForSizeChanges = function() {\n        var size = this.$measureSizes();\n        if (size && (this.$characterSize.width !== size.width || this.$characterSize.height !== size.height)) {\n            this.$measureNode.style.fontWeight = \"bold\";\n            var boldSize = this.$measureSizes();\n            this.$measureNode.style.fontWeight = \"\";\n            this.$characterSize = size;\n            this.charSizes = Object.create(null);\n            this.allowBoldFonts = boldSize && boldSize.width === size.width && boldSize.height === size.height;\n            this._emit(\"changeCharacterSize\", {data: size});\n        }\n    };\n\n    this.$pollSizeChanges = function() {\n        if (this.$pollSizeChangesTimer)\n            return this.$pollSizeChangesTimer;\n        var self = this;\n        return this.$pollSizeChangesTimer = setInterval(function() {\n            self.checkForSizeChanges();\n        }, 500);\n    };\n    \n    this.setPolling = function(val) {\n        if (val) {\n            this.$pollSizeChanges();\n        } else {\n            if (this.$pollSizeChangesTimer)\n                this.$pollSizeChangesTimer;\n        }\n    };\n\n    this.$measureSizes = function() {\n        if (CHAR_COUNT === 50) {\n            var rect = null;\n            try { \n               rect = this.$measureNode.getBoundingClientRect();\n            } catch(e) {\n               rect = {width: 0, height:0 };\n            };\n            var size = {\n                height: rect.height,\n                width: rect.width / CHAR_COUNT\n            };\n        } else {\n            var size = {\n                height: this.$measureNode.clientHeight,\n                width: this.$measureNode.clientWidth / CHAR_COUNT\n            };\n        }\n        if (size.width === 0 || size.height === 0)\n            return null;\n        return size;\n    };\n\n    this.$measureCharWidth = function(ch) {\n        this.$main.innerHTML = lang.stringRepeat(ch, CHAR_COUNT);\n        var rect = this.$main.getBoundingClientRect();\n        return rect.width / CHAR_COUNT;\n    };\n    \n    this.getCharacterWidth = function(ch) {\n        var w = this.charSizes[ch];\n        if (w === undefined) {\n            this.charSizes[ch] = this.$measureCharWidth(ch) / this.$characterSize.width;\n        }\n        return w;\n    };\n\n    this.destroy = function() {\n        clearInterval(this.$pollSizeChangesTimer);\n        if (this.el && this.el.parentNode)\n            this.el.parentNode.removeChild(this.el);\n    };\n\n}).call(FontMetrics.prototype);\n\n});\n\nace.define(\"ace/virtual_renderer\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/config\",\"ace/lib/useragent\",\"ace/layer/gutter\",\"ace/layer/marker\",\"ace/layer/text\",\"ace/layer/cursor\",\"ace/scrollbar\",\"ace/scrollbar\",\"ace/renderloop\",\"ace/layer/font_metrics\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nvar config = require(\"./config\");\nvar useragent = require(\"./lib/useragent\");\nvar GutterLayer = require(\"./layer/gutter\").Gutter;\nvar MarkerLayer = require(\"./layer/marker\").Marker;\nvar TextLayer = require(\"./layer/text\").Text;\nvar CursorLayer = require(\"./layer/cursor\").Cursor;\nvar HScrollBar = require(\"./scrollbar\").HScrollBar;\nvar VScrollBar = require(\"./scrollbar\").VScrollBar;\nvar RenderLoop = require(\"./renderloop\").RenderLoop;\nvar FontMetrics = require(\"./layer/font_metrics\").FontMetrics;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar editorCss = \".ace_editor {\\\nposition: relative;\\\noverflow: hidden;\\\nfont: 12px/normal 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace;\\\ndirection: ltr;\\\n}\\\n.ace_scroller {\\\nposition: absolute;\\\noverflow: hidden;\\\ntop: 0;\\\nbottom: 0;\\\nbackground-color: inherit;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\ncursor: text;\\\n}\\\n.ace_content {\\\nposition: absolute;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nmin-width: 100%;\\\n}\\\n.ace_dragging .ace_scroller:before{\\\nposition: absolute;\\\ntop: 0;\\\nleft: 0;\\\nright: 0;\\\nbottom: 0;\\\ncontent: '';\\\nbackground: rgba(250, 250, 250, 0.01);\\\nz-index: 1000;\\\n}\\\n.ace_dragging.ace_dark .ace_scroller:before{\\\nbackground: rgba(0, 0, 0, 0.01);\\\n}\\\n.ace_selecting, .ace_selecting * {\\\ncursor: text !important;\\\n}\\\n.ace_gutter {\\\nposition: absolute;\\\noverflow : hidden;\\\nwidth: auto;\\\ntop: 0;\\\nbottom: 0;\\\nleft: 0;\\\ncursor: default;\\\nz-index: 4;\\\n-ms-user-select: none;\\\n-moz-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\n}\\\n.ace_gutter-active-line {\\\nposition: absolute;\\\nleft: 0;\\\nright: 0;\\\n}\\\n.ace_scroller.ace_scroll-left {\\\nbox-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\\\n}\\\n.ace_gutter-cell {\\\npadding-left: 19px;\\\npadding-right: 6px;\\\nbackground-repeat: no-repeat;\\\n}\\\n.ace_gutter-cell.ace_error {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\\\");\\\nbackground-repeat: no-repeat;\\\nbackground-position: 2px center;\\\n}\\\n.ace_gutter-cell.ace_warning {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\\\");\\\nbackground-position: 2px center;\\\n}\\\n.ace_gutter-cell.ace_info {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\\\");\\\nbackground-position: 2px center;\\\n}\\\n.ace_dark .ace_gutter-cell.ace_info {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_scrollbar {\\\nposition: absolute;\\\nright: 0;\\\nbottom: 0;\\\nz-index: 6;\\\n}\\\n.ace_scrollbar-inner {\\\nposition: absolute;\\\ncursor: text;\\\nleft: 0;\\\ntop: 0;\\\n}\\\n.ace_scrollbar-v{\\\noverflow-x: hidden;\\\noverflow-y: scroll;\\\ntop: 0;\\\n}\\\n.ace_scrollbar-h {\\\noverflow-x: scroll;\\\noverflow-y: hidden;\\\nleft: 0;\\\n}\\\n.ace_print-margin {\\\nposition: absolute;\\\nheight: 100%;\\\n}\\\n.ace_text-input {\\\nposition: absolute;\\\nz-index: 0;\\\nwidth: 0.5em;\\\nheight: 1em;\\\nopacity: 0;\\\nbackground: transparent;\\\n-moz-appearance: none;\\\nappearance: none;\\\nborder: none;\\\nresize: none;\\\noutline: none;\\\noverflow: hidden;\\\nfont: inherit;\\\npadding: 0 1px;\\\nmargin: 0 -1px;\\\ntext-indent: -1em;\\\n-ms-user-select: text;\\\n-moz-user-select: text;\\\n-webkit-user-select: text;\\\nuser-select: text;\\\n}\\\n.ace_text-input.ace_composition {\\\nbackground: inherit;\\\ncolor: inherit;\\\nz-index: 1000;\\\nopacity: 1;\\\ntext-indent: 0;\\\n}\\\n.ace_layer {\\\nz-index: 1;\\\nposition: absolute;\\\noverflow: hidden;\\\nwhite-space: pre;\\\nheight: 100%;\\\nwidth: 100%;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\npointer-events: none;\\\n}\\\n.ace_gutter-layer {\\\nposition: relative;\\\nwidth: auto;\\\ntext-align: right;\\\npointer-events: auto;\\\n}\\\n.ace_text-layer {\\\nfont: inherit !important;\\\n}\\\n.ace_cjk {\\\ndisplay: inline-block;\\\ntext-align: center;\\\n}\\\n.ace_cursor-layer {\\\nz-index: 4;\\\n}\\\n.ace_cursor {\\\nz-index: 4;\\\nposition: absolute;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nborder-left: 2px solid\\\n}\\\n.ace_slim-cursors .ace_cursor {\\\nborder-left-width: 1px;\\\n}\\\n.ace_overwrite-cursors .ace_cursor {\\\nborder-left-width: 0;\\\nborder-bottom: 1px solid;\\\n}\\\n.ace_hidden-cursors .ace_cursor {\\\nopacity: 0.2;\\\n}\\\n.ace_smooth-blinking .ace_cursor {\\\n-webkit-transition: opacity 0.18s;\\\ntransition: opacity 0.18s;\\\n}\\\n.ace_editor.ace_multiselect .ace_cursor {\\\nborder-left-width: 1px;\\\n}\\\n.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\\\nposition: absolute;\\\nz-index: 3;\\\n}\\\n.ace_marker-layer .ace_selection {\\\nposition: absolute;\\\nz-index: 5;\\\n}\\\n.ace_marker-layer .ace_bracket {\\\nposition: absolute;\\\nz-index: 6;\\\n}\\\n.ace_marker-layer .ace_active-line {\\\nposition: absolute;\\\nz-index: 2;\\\n}\\\n.ace_marker-layer .ace_selected-word {\\\nposition: absolute;\\\nz-index: 4;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\n}\\\n.ace_line .ace_fold {\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\ndisplay: inline-block;\\\nheight: 11px;\\\nmargin-top: -2px;\\\nvertical-align: middle;\\\nbackground-image:\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\"),\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\\\");\\\nbackground-repeat: no-repeat, repeat-x;\\\nbackground-position: center center, top left;\\\ncolor: transparent;\\\nborder: 1px solid black;\\\nborder-radius: 2px;\\\ncursor: pointer;\\\npointer-events: auto;\\\n}\\\n.ace_dark .ace_fold {\\\n}\\\n.ace_fold:hover{\\\nbackground-image:\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\\\"),\\\nurl(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_tooltip {\\\nbackground-color: #FFF;\\\nbackground-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));\\\nbackground-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\\\nborder: 1px solid gray;\\\nborder-radius: 1px;\\\nbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\\\ncolor: black;\\\nmax-width: 100%;\\\npadding: 3px 4px;\\\nposition: fixed;\\\nz-index: 999999;\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\ncursor: default;\\\nwhite-space: pre;\\\nword-wrap: break-word;\\\nline-height: normal;\\\nfont-style: normal;\\\nfont-weight: normal;\\\nletter-spacing: normal;\\\npointer-events: none;\\\n}\\\n.ace_folding-enabled > .ace_gutter-cell {\\\npadding-right: 13px;\\\n}\\\n.ace_fold-widget {\\\n-moz-box-sizing: border-box;\\\n-webkit-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nmargin: 0 -12px 0 1px;\\\ndisplay: none;\\\nwidth: 11px;\\\nvertical-align: top;\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\\\");\\\nbackground-repeat: no-repeat;\\\nbackground-position: center;\\\nborder-radius: 3px;\\\nborder: 1px solid transparent;\\\ncursor: pointer;\\\n}\\\n.ace_folding-enabled .ace_fold-widget {\\\ndisplay: inline-block;   \\\n}\\\n.ace_fold-widget.ace_end {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_fold-widget.ace_closed {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\\\");\\\n}\\\n.ace_fold-widget:hover {\\\nborder: 1px solid rgba(0, 0, 0, 0.3);\\\nbackground-color: rgba(255, 255, 255, 0.2);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\\\n}\\\n.ace_fold-widget:active {\\\nborder: 1px solid rgba(0, 0, 0, 0.4);\\\nbackground-color: rgba(0, 0, 0, 0.05);\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\\\n}\\\n.ace_dark .ace_fold-widget {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace_dark .ace_fold-widget.ace_end {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_dark .ace_fold-widget.ace_closed {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\\\");\\\n}\\\n.ace_dark .ace_fold-widget:hover {\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\nbackground-color: rgba(255, 255, 255, 0.1);\\\n}\\\n.ace_dark .ace_fold-widget:active {\\\nbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\\n}\\\n.ace_fold-widget.ace_invalid {\\\nbackground-color: #FFB4B4;\\\nborder-color: #DE5555;\\\n}\\\n.ace_fade-fold-widgets .ace_fold-widget {\\\n-webkit-transition: opacity 0.4s ease 0.05s;\\\ntransition: opacity 0.4s ease 0.05s;\\\nopacity: 0;\\\n}\\\n.ace_fade-fold-widgets:hover .ace_fold-widget {\\\n-webkit-transition: opacity 0.05s ease 0.05s;\\\ntransition: opacity 0.05s ease 0.05s;\\\nopacity:1;\\\n}\\\n.ace_underline {\\\ntext-decoration: underline;\\\n}\\\n.ace_bold {\\\nfont-weight: bold;\\\n}\\\n.ace_nobold .ace_bold {\\\nfont-weight: normal;\\\n}\\\n.ace_italic {\\\nfont-style: italic;\\\n}\\\n.ace_error-marker {\\\nbackground-color: rgba(255, 0, 0,0.2);\\\nposition: absolute;\\\nz-index: 9;\\\n}\\\n.ace_highlight-marker {\\\nbackground-color: rgba(255, 255, 0,0.2);\\\nposition: absolute;\\\nz-index: 8;\\\n}\\\n\";\n\ndom.importCssString(editorCss, \"ace_editor\");\n\nvar VirtualRenderer = function(container, theme) {\n    var _self = this;\n\n    this.container = container || dom.createElement(\"div\");\n    this.$keepTextAreaAtCursor = !useragent.isOldIE;\n\n    dom.addCssClass(this.container, \"ace_editor\");\n\n    this.setTheme(theme);\n\n    this.$gutter = dom.createElement(\"div\");\n    this.$gutter.className = \"ace_gutter\";\n    this.container.appendChild(this.$gutter);\n\n    this.scroller = dom.createElement(\"div\");\n    this.scroller.className = \"ace_scroller\";\n    this.container.appendChild(this.scroller);\n\n    this.content = dom.createElement(\"div\");\n    this.content.className = \"ace_content\";\n    this.scroller.appendChild(this.content);\n\n    this.$gutterLayer = new GutterLayer(this.$gutter);\n    this.$gutterLayer.on(\"changeGutterWidth\", this.onGutterResize.bind(this));\n\n    this.$markerBack = new MarkerLayer(this.content);\n\n    var textLayer = this.$textLayer = new TextLayer(this.content);\n    this.canvas = textLayer.element;\n\n    this.$markerFront = new MarkerLayer(this.content);\n\n    this.$cursorLayer = new CursorLayer(this.content);\n    this.$horizScroll = false;\n    this.$vScroll = false;\n\n    this.scrollBar = \n    this.scrollBarV = new VScrollBar(this.container, this);\n    this.scrollBarH = new HScrollBar(this.container, this);\n    this.scrollBarV.addEventListener(\"scroll\", function(e) {\n        if (!_self.$scrollAnimation)\n            _self.session.setScrollTop(e.data - _self.scrollMargin.top);\n    });\n    this.scrollBarH.addEventListener(\"scroll\", function(e) {\n        if (!_self.$scrollAnimation)\n            _self.session.setScrollLeft(e.data - _self.scrollMargin.left);\n    });\n\n    this.scrollTop = 0;\n    this.scrollLeft = 0;\n\n    this.cursorPos = {\n        row : 0,\n        column : 0\n    };\n\n    this.$fontMetrics = new FontMetrics(this.container, 500);\n    this.$textLayer.$setFontMetrics(this.$fontMetrics);\n    this.$textLayer.addEventListener(\"changeCharacterSize\", function(e) {\n        _self.updateCharacterSize();\n        _self.onResize(true, _self.gutterWidth, _self.$size.width, _self.$size.height);\n        _self._signal(\"changeCharacterSize\", e);\n    });\n\n    this.$size = {\n        width: 0,\n        height: 0,\n        scrollerHeight: 0,\n        scrollerWidth: 0,\n        $dirty: true\n    };\n\n    this.layerConfig = {\n        width : 1,\n        padding : 0,\n        firstRow : 0,\n        firstRowScreen: 0,\n        lastRow : 0,\n        lineHeight : 0,\n        characterWidth : 0,\n        minHeight : 1,\n        maxHeight : 1,\n        offset : 0,\n        height : 1,\n        gutterOffset: 1\n    };\n    \n    this.scrollMargin = {\n        left: 0,\n        right: 0,\n        top: 0,\n        bottom: 0,\n        v: 0,\n        h: 0\n    };\n\n    this.$loop = new RenderLoop(\n        this.$renderChanges.bind(this),\n        this.container.ownerDocument.defaultView\n    );\n    this.$loop.schedule(this.CHANGE_FULL);\n\n    this.updateCharacterSize();\n    this.setPadding(4);\n    config.resetOptions(this);\n    config._emit(\"renderer\", this);\n};\n\n(function() {\n\n    this.CHANGE_CURSOR = 1;\n    this.CHANGE_MARKER = 2;\n    this.CHANGE_GUTTER = 4;\n    this.CHANGE_SCROLL = 8;\n    this.CHANGE_LINES = 16;\n    this.CHANGE_TEXT = 32;\n    this.CHANGE_SIZE = 64;\n    this.CHANGE_MARKER_BACK = 128;\n    this.CHANGE_MARKER_FRONT = 256;\n    this.CHANGE_FULL = 512;\n    this.CHANGE_H_SCROLL = 1024;\n\n    oop.implement(this, EventEmitter);\n\n    this.updateCharacterSize = function() {\n        if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) {\n            this.$allowBoldFonts = this.$textLayer.allowBoldFonts;\n            this.setStyle(\"ace_nobold\", !this.$allowBoldFonts);\n        }\n\n        this.layerConfig.characterWidth =\n        this.characterWidth = this.$textLayer.getCharacterWidth();\n        this.layerConfig.lineHeight =\n        this.lineHeight = this.$textLayer.getLineHeight();\n        this.$updatePrintMargin();\n    };\n    this.setSession = function(session) {\n        if (this.session)\n            this.session.doc.off(\"changeNewLineMode\", this.onChangeNewLineMode);\n            \n        this.session = session;\n        if (session && this.scrollMargin.top && session.getScrollTop() <= 0)\n            session.setScrollTop(-this.scrollMargin.top);\n\n        this.$cursorLayer.setSession(session);\n        this.$markerBack.setSession(session);\n        this.$markerFront.setSession(session);\n        this.$gutterLayer.setSession(session);\n        this.$textLayer.setSession(session);\n        if (!session)\n            return;\n        \n        this.$loop.schedule(this.CHANGE_FULL);\n        this.session.$setFontMetrics(this.$fontMetrics);\n        \n        this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this);\n        this.onChangeNewLineMode()\n        this.session.doc.on(\"changeNewLineMode\", this.onChangeNewLineMode);\n    };\n    this.updateLines = function(firstRow, lastRow, force) {\n        if (lastRow === undefined)\n            lastRow = Infinity;\n\n        if (!this.$changedLines) {\n            this.$changedLines = {\n                firstRow: firstRow,\n                lastRow: lastRow\n            };\n        }\n        else {\n            if (this.$changedLines.firstRow > firstRow)\n                this.$changedLines.firstRow = firstRow;\n\n            if (this.$changedLines.lastRow < lastRow)\n                this.$changedLines.lastRow = lastRow;\n        }\n        if (this.$changedLines.lastRow < this.layerConfig.firstRow) {\n            if (force)\n                this.$changedLines.lastRow = this.layerConfig.lastRow;\n            else\n                return;\n        }\n        if (this.$changedLines.firstRow > this.layerConfig.lastRow)\n            return;\n        this.$loop.schedule(this.CHANGE_LINES);\n    };\n\n    this.onChangeNewLineMode = function() {\n        this.$loop.schedule(this.CHANGE_TEXT);\n        this.$textLayer.$updateEolChar();\n    };\n    \n    this.onChangeTabSize = function() {\n        this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER);\n        this.$textLayer.onChangeTabSize();\n    };\n    this.updateText = function() {\n        this.$loop.schedule(this.CHANGE_TEXT);\n    };\n    this.updateFull = function(force) {\n        if (force)\n            this.$renderChanges(this.CHANGE_FULL, true);\n        else\n            this.$loop.schedule(this.CHANGE_FULL);\n    };\n    this.updateFontSize = function() {\n        this.$textLayer.checkForSizeChanges();\n    };\n\n    this.$changes = 0;\n    this.$updateSizeAsync = function() {\n        if (this.$loop.pending)\n            this.$size.$dirty = true;\n        else\n            this.onResize();\n    };\n    this.onResize = function(force, gutterWidth, width, height) {\n        if (this.resizing > 2)\n            return;\n        else if (this.resizing > 0)\n            this.resizing++;\n        else\n            this.resizing = force ? 1 : 0;\n        var el = this.container;\n        if (!height)\n            height = el.clientHeight || el.scrollHeight;\n        if (!width)\n            width = el.clientWidth || el.scrollWidth;\n        var changes = this.$updateCachedSize(force, gutterWidth, width, height);\n\n        \n        if (!this.$size.scrollerHeight || (!width && !height))\n            return this.resizing = 0;\n\n        if (force)\n            this.$gutterLayer.$padding = null;\n\n        if (force)\n            this.$renderChanges(changes | this.$changes, true);\n        else\n            this.$loop.schedule(changes | this.$changes);\n\n        if (this.resizing)\n            this.resizing = 0;\n        this.scrollBarV.scrollLeft = this.scrollBarV.scrollTop = null;\n    };\n    \n    this.$updateCachedSize = function(force, gutterWidth, width, height) {\n        height -= (this.$extraHeight || 0);\n        var changes = 0;\n        var size = this.$size;\n        var oldSize = {\n            width: size.width,\n            height: size.height,\n            scrollerHeight: size.scrollerHeight,\n            scrollerWidth: size.scrollerWidth\n        };\n        if (height && (force || size.height != height)) {\n            size.height = height;\n            changes |= this.CHANGE_SIZE;\n\n            size.scrollerHeight = size.height;\n            if (this.$horizScroll)\n                size.scrollerHeight -= this.scrollBarH.getHeight();\n            this.scrollBarV.element.style.bottom = this.scrollBarH.getHeight() + \"px\";\n\n            changes = changes | this.CHANGE_SCROLL;\n        }\n\n        if (width && (force || size.width != width)) {\n            changes |= this.CHANGE_SIZE;\n            size.width = width;\n            \n            if (gutterWidth == null)\n                gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n            \n            this.gutterWidth = gutterWidth;\n            \n            this.scrollBarH.element.style.left = \n            this.scroller.style.left = gutterWidth + \"px\";\n            size.scrollerWidth = Math.max(0, width - gutterWidth - this.scrollBarV.getWidth());           \n            \n            this.scrollBarH.element.style.right = \n            this.scroller.style.right = this.scrollBarV.getWidth() + \"px\";\n            this.scroller.style.bottom = this.scrollBarH.getHeight() + \"px\";\n\n            if (this.session && this.session.getUseWrapMode() && this.adjustWrapLimit() || force)\n                changes |= this.CHANGE_FULL;\n        }\n        \n        size.$dirty = !width || !height;\n\n        if (changes)\n            this._signal(\"resize\", oldSize);\n\n        return changes;\n    };\n\n    this.onGutterResize = function() {\n        var gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n        if (gutterWidth != this.gutterWidth)\n            this.$changes |= this.$updateCachedSize(true, gutterWidth, this.$size.width, this.$size.height);\n\n        if (this.session.getUseWrapMode() && this.adjustWrapLimit()) {\n            this.$loop.schedule(this.CHANGE_FULL);\n        } else if (this.$size.$dirty) {\n            this.$loop.schedule(this.CHANGE_FULL);\n        } else {\n            this.$computeLayerConfig();\n            this.$loop.schedule(this.CHANGE_MARKER);\n        }\n    };\n    this.adjustWrapLimit = function() {\n        var availableWidth = this.$size.scrollerWidth - this.$padding * 2;\n        var limit = Math.floor(availableWidth / this.characterWidth);\n        return this.session.adjustWrapLimit(limit, this.$showPrintMargin && this.$printMarginColumn);\n    };\n    this.setAnimatedScroll = function(shouldAnimate){\n        this.setOption(\"animatedScroll\", shouldAnimate);\n    };\n    this.getAnimatedScroll = function() {\n        return this.$animatedScroll;\n    };\n    this.setShowInvisibles = function(showInvisibles) {\n        this.setOption(\"showInvisibles\", showInvisibles);\n    };\n    this.getShowInvisibles = function() {\n        return this.getOption(\"showInvisibles\");\n    };\n    this.getDisplayIndentGuides = function() {\n        return this.getOption(\"displayIndentGuides\");\n    };\n\n    this.setDisplayIndentGuides = function(display) {\n        this.setOption(\"displayIndentGuides\", display);\n    };\n    this.setShowPrintMargin = function(showPrintMargin) {\n        this.setOption(\"showPrintMargin\", showPrintMargin);\n    };\n    this.getShowPrintMargin = function() {\n        return this.getOption(\"showPrintMargin\");\n    };\n    this.setPrintMarginColumn = function(showPrintMargin) {\n        this.setOption(\"printMarginColumn\", showPrintMargin);\n    };\n    this.getPrintMarginColumn = function() {\n        return this.getOption(\"printMarginColumn\");\n    };\n    this.getShowGutter = function(){\n        return this.getOption(\"showGutter\");\n    };\n    this.setShowGutter = function(show){\n        return this.setOption(\"showGutter\", show);\n    };\n\n    this.getFadeFoldWidgets = function(){\n        return this.getOption(\"fadeFoldWidgets\")\n    };\n\n    this.setFadeFoldWidgets = function(show) {\n        this.setOption(\"fadeFoldWidgets\", show);\n    };\n\n    this.setHighlightGutterLine = function(shouldHighlight) {\n        this.setOption(\"highlightGutterLine\", shouldHighlight);\n    };\n\n    this.getHighlightGutterLine = function() {\n        return this.getOption(\"highlightGutterLine\");\n    };\n\n    this.$updateGutterLineHighlight = function() {\n        var pos = this.$cursorLayer.$pixelPos;\n        var height = this.layerConfig.lineHeight;\n        if (this.session.getUseWrapMode()) {\n            var cursor = this.session.selection.getCursor();\n            cursor.column = 0;\n            pos = this.$cursorLayer.getPixelPosition(cursor, true);\n            height *= this.session.getRowLength(cursor.row);\n        }\n        this.$gutterLineHighlight.style.top = pos.top - this.layerConfig.offset + \"px\";\n        this.$gutterLineHighlight.style.height = height + \"px\";\n    };\n\n    this.$updatePrintMargin = function() {\n        if (!this.$showPrintMargin && !this.$printMarginEl)\n            return;\n\n        if (!this.$printMarginEl) {\n            var containerEl = dom.createElement(\"div\");\n            containerEl.className = \"ace_layer ace_print-margin-layer\";\n            this.$printMarginEl = dom.createElement(\"div\");\n            this.$printMarginEl.className = \"ace_print-margin\";\n            containerEl.appendChild(this.$printMarginEl);\n            this.content.insertBefore(containerEl, this.content.firstChild);\n        }\n\n        var style = this.$printMarginEl.style;\n        style.left = ((this.characterWidth * this.$printMarginColumn) + this.$padding) + \"px\";\n        style.visibility = this.$showPrintMargin ? \"visible\" : \"hidden\";\n        \n        if (this.session && this.session.$wrap == -1)\n            this.adjustWrapLimit();\n    };\n    this.getContainerElement = function() {\n        return this.container;\n    };\n    this.getMouseEventTarget = function() {\n        return this.content;\n    };\n    this.getTextAreaContainer = function() {\n        return this.container;\n    };\n    this.$moveTextAreaToCursor = function() {\n        if (!this.$keepTextAreaAtCursor)\n            return;\n        var config = this.layerConfig;\n        var posTop = this.$cursorLayer.$pixelPos.top;\n        var posLeft = this.$cursorLayer.$pixelPos.left;\n        posTop -= config.offset;\n\n        var style = this.textarea.style;\n        var h = this.lineHeight;\n        if (posTop < 0 || posTop > config.height - h) {\n            style.top = style.left = \"0\";\n            return;\n        }\n\n        var w = this.characterWidth;\n        if (this.$composition) {\n            var val = this.textarea.value.replace(/^\\x01+/, \"\");\n            w *= (this.session.$getStringScreenWidth(val)[0]+2);\n            h += 2;\n        }\n        posLeft -= this.scrollLeft;\n        if (posLeft > this.$size.scrollerWidth - w)\n            posLeft = this.$size.scrollerWidth - w;\n\n        posLeft += this.gutterWidth;\n        style.height = h + \"px\";\n        style.width = w + \"px\";\n        style.left = Math.min(posLeft, this.$size.scrollerWidth - w) + \"px\";\n        style.top = Math.min(posTop, this.$size.height - h) + \"px\";\n    };\n    this.getFirstVisibleRow = function() {\n        return this.layerConfig.firstRow;\n    };\n    this.getFirstFullyVisibleRow = function() {\n        return this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1);\n    };\n    this.getLastFullyVisibleRow = function() {\n        var flint = Math.floor((this.layerConfig.height + this.layerConfig.offset) / this.layerConfig.lineHeight);\n        return this.layerConfig.firstRow - 1 + flint;\n    };\n    this.getLastVisibleRow = function() {\n        return this.layerConfig.lastRow;\n    };\n\n    this.$padding = null;\n    this.setPadding = function(padding) {\n        this.$padding = padding;\n        this.$textLayer.setPadding(padding);\n        this.$cursorLayer.setPadding(padding);\n        this.$markerFront.setPadding(padding);\n        this.$markerBack.setPadding(padding);\n        this.$loop.schedule(this.CHANGE_FULL);\n        this.$updatePrintMargin();\n    };\n    \n    this.setScrollMargin = function(top, bottom, left, right) {\n        var sm = this.scrollMargin;\n        sm.top = top|0;\n        sm.bottom = bottom|0;\n        sm.right = right|0;\n        sm.left = left|0;\n        sm.v = sm.top + sm.bottom;\n        sm.h = sm.left + sm.right;\n        if (sm.top && this.scrollTop <= 0 && this.session)\n            this.session.setScrollTop(-sm.top);\n        this.updateFull();\n    };\n    this.getHScrollBarAlwaysVisible = function() {\n        return this.$hScrollBarAlwaysVisible;\n    };\n    this.setHScrollBarAlwaysVisible = function(alwaysVisible) {\n        this.setOption(\"hScrollBarAlwaysVisible\", alwaysVisible);\n    };\n    this.getVScrollBarAlwaysVisible = function() {\n        return this.$hScrollBarAlwaysVisible;\n    };\n    this.setVScrollBarAlwaysVisible = function(alwaysVisible) {\n        this.setOption(\"vScrollBarAlwaysVisible\", alwaysVisible);\n    };\n\n    this.$updateScrollBarV = function() {\n        var scrollHeight = this.layerConfig.maxHeight;\n        var scrollerHeight = this.$size.scrollerHeight;\n        if (!this.$maxLines && this.$scrollPastEnd) {\n            scrollHeight -= (scrollerHeight - this.lineHeight) * this.$scrollPastEnd;\n            if (this.scrollTop > scrollHeight - scrollerHeight) {\n                scrollHeight = this.scrollTop + scrollerHeight;\n                this.scrollBarV.scrollTop = null;\n            }\n        }\n        this.scrollBarV.setScrollHeight(scrollHeight + this.scrollMargin.v);\n        this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top);\n    };\n    this.$updateScrollBarH = function() {\n        this.scrollBarH.setScrollWidth(this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h);\n        this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left);\n    };\n    \n    this.$frozen = false;\n    this.freeze = function() {\n        this.$frozen = true;\n    };\n    \n    this.unfreeze = function() {\n        this.$frozen = false;\n    };\n\n    this.$renderChanges = function(changes, force) {\n        if (this.$changes) {\n            changes |= this.$changes;\n            this.$changes = 0;\n        }\n        if ((!this.session || !this.container.offsetWidth || this.$frozen) || (!changes && !force)) {\n            this.$changes |= changes;\n            return; \n        } \n        if (this.$size.$dirty) {\n            this.$changes |= changes;\n            return this.onResize(true);\n        }\n        if (!this.lineHeight) {\n            this.$textLayer.checkForSizeChanges();\n        }\n        \n        this._signal(\"beforeRender\");\n        var config = this.layerConfig;\n        if (changes & this.CHANGE_FULL ||\n            changes & this.CHANGE_SIZE ||\n            changes & this.CHANGE_TEXT ||\n            changes & this.CHANGE_LINES ||\n            changes & this.CHANGE_SCROLL ||\n            changes & this.CHANGE_H_SCROLL\n        ) {\n            changes |= this.$computeLayerConfig();\n            if (config.firstRow != this.layerConfig.firstRow && config.firstRowScreen == this.layerConfig.firstRowScreen) {\n                var st = this.scrollTop + (config.firstRow - this.layerConfig.firstRow) * this.lineHeight;\n                if (st > 0) {\n                    this.scrollTop = st;\n                    changes = changes | this.CHANGE_SCROLL;\n                    changes |= this.$computeLayerConfig();\n                }\n            }\n            config = this.layerConfig;\n            this.$updateScrollBarV();\n            if (changes & this.CHANGE_H_SCROLL)\n                this.$updateScrollBarH();\n            this.$gutterLayer.element.style.marginTop = (-config.offset) + \"px\";\n            this.content.style.marginTop = (-config.offset) + \"px\";\n            this.content.style.width = config.width + 2 * this.$padding + \"px\";\n            this.content.style.height = config.minHeight + \"px\";\n        }\n        if (changes & this.CHANGE_H_SCROLL) {\n            this.content.style.marginLeft = -this.scrollLeft + \"px\";\n            this.scroller.className = this.scrollLeft <= 0 ? \"ace_scroller\" : \"ace_scroller ace_scroll-left\";\n        }\n        if (changes & this.CHANGE_FULL) {\n            this.$textLayer.update(config);\n            if (this.$showGutter)\n                this.$gutterLayer.update(config);\n            this.$markerBack.update(config);\n            this.$markerFront.update(config);\n            this.$cursorLayer.update(config);\n            this.$moveTextAreaToCursor();\n            this.$highlightGutterLine && this.$updateGutterLineHighlight();\n            this._signal(\"afterRender\");\n            return;\n        }\n        if (changes & this.CHANGE_SCROLL) {\n            if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES)\n                this.$textLayer.update(config);\n            else\n                this.$textLayer.scrollLines(config);\n\n            if (this.$showGutter)\n                this.$gutterLayer.update(config);\n            this.$markerBack.update(config);\n            this.$markerFront.update(config);\n            this.$cursorLayer.update(config);\n            this.$highlightGutterLine && this.$updateGutterLineHighlight();\n            this.$moveTextAreaToCursor();\n            this._signal(\"afterRender\");\n            return;\n        }\n\n        if (changes & this.CHANGE_TEXT) {\n            this.$textLayer.update(config);\n            if (this.$showGutter)\n                this.$gutterLayer.update(config);\n        }\n        else if (changes & this.CHANGE_LINES) {\n            if (this.$updateLines() || (changes & this.CHANGE_GUTTER) && this.$showGutter)\n                this.$gutterLayer.update(config);\n        }\n        else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) {\n            if (this.$showGutter)\n                this.$gutterLayer.update(config);\n        }\n\n        if (changes & this.CHANGE_CURSOR) {\n            this.$cursorLayer.update(config);\n            this.$moveTextAreaToCursor();\n            this.$highlightGutterLine && this.$updateGutterLineHighlight();\n        }\n\n        if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) {\n            this.$markerFront.update(config);\n        }\n\n        if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) {\n            this.$markerBack.update(config);\n        }\n\n        this._signal(\"afterRender\");\n    };\n\n    \n    this.$autosize = function() {\n        var height = this.session.getScreenLength() * this.lineHeight;\n        var maxHeight = this.$maxLines * this.lineHeight;\n        var desiredHeight = Math.max(\n            (this.$minLines||1) * this.lineHeight,\n            Math.min(maxHeight, height)\n        ) + this.scrollMargin.v + (this.$extraHeight || 0);\n        var vScroll = height > maxHeight;\n        \n        if (desiredHeight != this.desiredHeight ||\n            this.$size.height != this.desiredHeight || vScroll != this.$vScroll) {\n            if (vScroll != this.$vScroll) {\n                this.$vScroll = vScroll;\n                this.scrollBarV.setVisible(vScroll);\n            }\n            \n            var w = this.container.clientWidth;\n            this.container.style.height = desiredHeight + \"px\";\n            this.$updateCachedSize(true, this.$gutterWidth, w, desiredHeight);\n            this.desiredHeight = desiredHeight;\n            \n            this._signal(\"autosize\");\n        }\n    };\n    \n    this.$computeLayerConfig = function() {\n        if (this.$maxLines && this.lineHeight > 1)\n            this.$autosize();\n\n        var session = this.session;\n        var size = this.$size;\n        \n        var hideScrollbars = size.height <= 2 * this.lineHeight;\n        var screenLines = this.session.getScreenLength();\n        var maxHeight = screenLines * this.lineHeight;\n\n        var offset = this.scrollTop % this.lineHeight;\n        var minHeight = size.scrollerHeight + this.lineHeight;\n\n        var longestLine = this.$getLongestLine();\n        \n        var horizScroll = !hideScrollbars && (this.$hScrollBarAlwaysVisible ||\n            size.scrollerWidth - longestLine - 2 * this.$padding < 0);\n\n        var hScrollChanged = this.$horizScroll !== horizScroll;\n        if (hScrollChanged) {\n            this.$horizScroll = horizScroll;\n            this.scrollBarH.setVisible(horizScroll);\n        }\n        \n        var scrollPastEnd = !this.$maxLines && this.$scrollPastEnd\n            ? (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd\n            : 0;\n        maxHeight += scrollPastEnd;\n        \n        this.session.setScrollTop(Math.max(-this.scrollMargin.top,\n            Math.min(this.scrollTop, maxHeight - size.scrollerHeight + this.scrollMargin.bottom)));\n\n        this.session.setScrollLeft(Math.max(-this.scrollMargin.left, Math.min(this.scrollLeft, \n            longestLine + 2 * this.$padding - size.scrollerWidth + this.scrollMargin.right)));\n        \n        var vScroll = !hideScrollbars && (this.$vScrollBarAlwaysVisible ||\n            size.scrollerHeight - maxHeight + scrollPastEnd < 0 || this.scrollTop);\n        var vScrollChanged = this.$vScroll !== vScroll;\n        if (vScrollChanged) {\n            this.$vScroll = vScroll;\n            this.scrollBarV.setVisible(vScroll);\n        }\n\n        var lineCount = Math.ceil(minHeight / this.lineHeight) - 1;\n        var firstRow = Math.max(0, Math.round((this.scrollTop - offset) / this.lineHeight));\n        var lastRow = firstRow + lineCount;\n        var firstRowScreen, firstRowHeight;\n        var lineHeight = this.lineHeight;\n        firstRow = session.screenToDocumentRow(firstRow, 0);\n        var foldLine = session.getFoldLine(firstRow);\n        if (foldLine) {\n            firstRow = foldLine.start.row;\n        }\n\n        firstRowScreen = session.documentToScreenRow(firstRow, 0);\n        firstRowHeight = session.getRowLength(firstRow) * lineHeight;\n\n        lastRow = Math.min(session.screenToDocumentRow(lastRow, 0), session.getLength() - 1);\n        minHeight = size.scrollerHeight + session.getRowLength(lastRow) * lineHeight +\n                                                firstRowHeight;\n\n        offset = this.scrollTop - firstRowScreen * lineHeight;\n\n        var changes = 0;\n        if (this.layerConfig.width != longestLine) \n            changes = this.CHANGE_H_SCROLL;\n        if (hScrollChanged || vScrollChanged) {\n            changes = this.$updateCachedSize(true, this.gutterWidth, size.width, size.height);\n            this._signal(\"scrollbarVisibilityChanged\");\n            if (vScrollChanged)\n                longestLine = this.$getLongestLine();\n        }\n        \n        this.layerConfig = {\n            width : longestLine,\n            padding : this.$padding,\n            firstRow : firstRow,\n            firstRowScreen: firstRowScreen,\n            lastRow : lastRow,\n            lineHeight : lineHeight,\n            characterWidth : this.characterWidth,\n            minHeight : minHeight,\n            maxHeight : maxHeight,\n            offset : offset,\n            gutterOffset : Math.max(0, Math.ceil((offset + size.height - size.scrollerHeight) / lineHeight)),\n            height : this.$size.scrollerHeight\n        };\n\n        return changes;\n    };\n\n    this.$updateLines = function() {\n        var firstRow = this.$changedLines.firstRow;\n        var lastRow = this.$changedLines.lastRow;\n        this.$changedLines = null;\n\n        var layerConfig = this.layerConfig;\n\n        if (firstRow > layerConfig.lastRow + 1) { return; }\n        if (lastRow < layerConfig.firstRow) { return; }\n        if (lastRow === Infinity) {\n            if (this.$showGutter)\n                this.$gutterLayer.update(layerConfig);\n            this.$textLayer.update(layerConfig);\n            return;\n        }\n        this.$textLayer.updateLines(layerConfig, firstRow, lastRow);\n        return true;\n    };\n\n    this.$getLongestLine = function() {\n        var charCount = this.session.getScreenWidth();\n        if (this.showInvisibles && !this.session.$useWrapMode)\n            charCount += 1;\n\n        return Math.max(this.$size.scrollerWidth - 2 * this.$padding, Math.round(charCount * this.characterWidth));\n    };\n    this.updateFrontMarkers = function() {\n        this.$markerFront.setMarkers(this.session.getMarkers(true));\n        this.$loop.schedule(this.CHANGE_MARKER_FRONT);\n    };\n    this.updateBackMarkers = function() {\n        this.$markerBack.setMarkers(this.session.getMarkers());\n        this.$loop.schedule(this.CHANGE_MARKER_BACK);\n    };\n    this.addGutterDecoration = function(row, className){\n        this.$gutterLayer.addGutterDecoration(row, className);\n    };\n    this.removeGutterDecoration = function(row, className){\n        this.$gutterLayer.removeGutterDecoration(row, className);\n    };\n    this.updateBreakpoints = function(rows) {\n        this.$loop.schedule(this.CHANGE_GUTTER);\n    };\n    this.setAnnotations = function(annotations) {\n        this.$gutterLayer.setAnnotations(annotations);\n        this.$loop.schedule(this.CHANGE_GUTTER);\n    };\n    this.updateCursor = function() {\n        this.$loop.schedule(this.CHANGE_CURSOR);\n    };\n    this.hideCursor = function() {\n        this.$cursorLayer.hideCursor();\n    };\n    this.showCursor = function() {\n        this.$cursorLayer.showCursor();\n    };\n\n    this.scrollSelectionIntoView = function(anchor, lead, offset) {\n        this.scrollCursorIntoView(anchor, offset);\n        this.scrollCursorIntoView(lead, offset);\n    };\n    this.scrollCursorIntoView = function(cursor, offset, $viewMargin) {\n        if (this.$size.scrollerHeight === 0)\n            return;\n\n        var pos = this.$cursorLayer.getPixelPosition(cursor);\n\n        var left = pos.left;\n        var top = pos.top;\n        \n        var topMargin = $viewMargin && $viewMargin.top || 0;\n        var bottomMargin = $viewMargin && $viewMargin.bottom || 0;\n        \n        var scrollTop = this.$scrollAnimation ? this.session.getScrollTop() : this.scrollTop;\n        \n        if (scrollTop + topMargin > top) {\n            if (offset)\n                top -= offset * this.$size.scrollerHeight;\n            if (top === 0)\n                top = -this.scrollMargin.top;\n            this.session.setScrollTop(top);\n        } else if (scrollTop + this.$size.scrollerHeight - bottomMargin < top + this.lineHeight) {\n            if (offset)\n                top += offset * this.$size.scrollerHeight;\n            this.session.setScrollTop(top + this.lineHeight - this.$size.scrollerHeight);\n        }\n\n        var scrollLeft = this.scrollLeft;\n\n        if (scrollLeft > left) {\n            if (left < this.$padding + 2 * this.layerConfig.characterWidth)\n                left = -this.scrollMargin.left;\n            this.session.setScrollLeft(left);\n        } else if (scrollLeft + this.$size.scrollerWidth < left + this.characterWidth) {\n            this.session.setScrollLeft(Math.round(left + this.characterWidth - this.$size.scrollerWidth));\n        } else if (scrollLeft <= this.$padding && left - scrollLeft < this.characterWidth) {\n            this.session.setScrollLeft(0);\n        }\n    };\n    this.getScrollTop = function() {\n        return this.session.getScrollTop();\n    };\n    this.getScrollLeft = function() {\n        return this.session.getScrollLeft();\n    };\n    this.getScrollTopRow = function() {\n        return this.scrollTop / this.lineHeight;\n    };\n    this.getScrollBottomRow = function() {\n        return Math.max(0, Math.floor((this.scrollTop + this.$size.scrollerHeight) / this.lineHeight) - 1);\n    };\n    this.scrollToRow = function(row) {\n        this.session.setScrollTop(row * this.lineHeight);\n    };\n\n    this.alignCursor = function(cursor, alignment) {\n        if (typeof cursor == \"number\")\n            cursor = {row: cursor, column: 0};\n\n        var pos = this.$cursorLayer.getPixelPosition(cursor);\n        var h = this.$size.scrollerHeight - this.lineHeight;\n        var offset = pos.top - h * (alignment || 0);\n\n        this.session.setScrollTop(offset);\n        return offset;\n    };\n\n    this.STEPS = 8;\n    this.$calcSteps = function(fromValue, toValue){\n        var i = 0;\n        var l = this.STEPS;\n        var steps = [];\n\n        var func  = function(t, x_min, dx) {\n            return dx * (Math.pow(t - 1, 3) + 1) + x_min;\n        };\n\n        for (i = 0; i < l; ++i)\n            steps.push(func(i / this.STEPS, fromValue, toValue - fromValue));\n\n        return steps;\n    };\n    this.scrollToLine = function(line, center, animate, callback) {\n        var pos = this.$cursorLayer.getPixelPosition({row: line, column: 0});\n        var offset = pos.top;\n        if (center)\n            offset -= this.$size.scrollerHeight / 2;\n\n        var initialScroll = this.scrollTop;\n        this.session.setScrollTop(offset);\n        if (animate !== false)\n            this.animateScrolling(initialScroll, callback);\n    };\n\n    this.animateScrolling = function(fromValue, callback) {\n        var toValue = this.scrollTop;\n        if (!this.$animatedScroll)\n            return;\n        var _self = this;\n        \n        if (fromValue == toValue)\n            return;\n        \n        if (this.$scrollAnimation) {\n            var oldSteps = this.$scrollAnimation.steps;\n            if (oldSteps.length) {\n                fromValue = oldSteps[0];\n                if (fromValue == toValue)\n                    return;\n            }\n        }\n        \n        var steps = _self.$calcSteps(fromValue, toValue);\n        this.$scrollAnimation = {from: fromValue, to: toValue, steps: steps};\n\n        clearInterval(this.$timer);\n\n        _self.session.setScrollTop(steps.shift());\n        _self.session.$scrollTop = toValue;\n        this.$timer = setInterval(function() {\n            if (steps.length) {\n                _self.session.setScrollTop(steps.shift());\n                _self.session.$scrollTop = toValue;\n            } else if (toValue != null) {\n                _self.session.$scrollTop = -1;\n                _self.session.setScrollTop(toValue);\n                toValue = null;\n            } else {\n                _self.$timer = clearInterval(_self.$timer);\n                _self.$scrollAnimation = null;\n                callback && callback();\n            }\n        }, 10);\n    };\n    this.scrollToY = function(scrollTop) {\n        if (this.scrollTop !== scrollTop) {\n            this.$loop.schedule(this.CHANGE_SCROLL);\n            this.scrollTop = scrollTop;\n        }\n    };\n    this.scrollToX = function(scrollLeft) {\n        if (this.scrollLeft !== scrollLeft)\n            this.scrollLeft = scrollLeft;\n        this.$loop.schedule(this.CHANGE_H_SCROLL);\n    };\n    this.scrollTo = function(x, y) {\n        this.session.setScrollTop(y);\n        this.session.setScrollLeft(y);\n    };\n    this.scrollBy = function(deltaX, deltaY) {\n        deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY);\n        deltaX && this.session.setScrollLeft(this.session.getScrollLeft() + deltaX);\n    };\n    this.isScrollableBy = function(deltaX, deltaY) {\n        if (deltaY < 0 && this.session.getScrollTop() >= 1 - this.scrollMargin.top)\n           return true;\n        if (deltaY > 0 && this.session.getScrollTop() + this.$size.scrollerHeight\n            - this.layerConfig.maxHeight < -1 + this.scrollMargin.bottom)\n           return true;\n        if (deltaX < 0 && this.session.getScrollLeft() >= 1 - this.scrollMargin.left)\n            return true;\n        if (deltaX > 0 && this.session.getScrollLeft() + this.$size.scrollerWidth\n            - this.layerConfig.width < -1 + this.scrollMargin.right)\n           return true;\n    };\n\n    this.pixelToScreenCoordinates = function(x, y) {\n        var canvasPos = this.scroller.getBoundingClientRect();\n\n        var offset = (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth;\n        var row = Math.floor((y + this.scrollTop - canvasPos.top) / this.lineHeight);\n        var col = Math.round(offset);\n\n        return {row: row, column: col, side: offset - col > 0 ? 1 : -1};\n    };\n\n    this.screenToTextCoordinates = function(x, y) {\n        var canvasPos = this.scroller.getBoundingClientRect();\n\n        var col = Math.round(\n            (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth\n        );\n\n        var row = (y + this.scrollTop - canvasPos.top) / this.lineHeight;\n\n        return this.session.screenToDocumentPosition(row, Math.max(col, 0));\n    };\n    this.textToScreenCoordinates = function(row, column) {\n        var canvasPos = this.scroller.getBoundingClientRect();\n        var pos = this.session.documentToScreenPosition(row, column);\n\n        var x = this.$padding + Math.round(pos.column * this.characterWidth);\n        var y = pos.row * this.lineHeight;\n\n        return {\n            pageX: canvasPos.left + x - this.scrollLeft,\n            pageY: canvasPos.top + y - this.scrollTop\n        };\n    };\n    this.visualizeFocus = function() {\n        dom.addCssClass(this.container, \"ace_focus\");\n    };\n    this.visualizeBlur = function() {\n        dom.removeCssClass(this.container, \"ace_focus\");\n    };\n    this.showComposition = function(position) {\n        if (!this.$composition)\n            this.$composition = {\n                keepTextAreaAtCursor: this.$keepTextAreaAtCursor,\n                cssText: this.textarea.style.cssText\n            };\n\n        this.$keepTextAreaAtCursor = true;\n        dom.addCssClass(this.textarea, \"ace_composition\");\n        this.textarea.style.cssText = \"\";\n        this.$moveTextAreaToCursor();\n    };\n    this.setCompositionText = function(text) {\n        this.$moveTextAreaToCursor();\n    };\n    this.hideComposition = function() {\n        if (!this.$composition)\n            return;\n\n        dom.removeCssClass(this.textarea, \"ace_composition\");\n        this.$keepTextAreaAtCursor = this.$composition.keepTextAreaAtCursor;\n        this.textarea.style.cssText = this.$composition.cssText;\n        this.$composition = null;\n    };\n    this.setTheme = function(theme, cb) {\n        var _self = this;\n        this.$themeId = theme;\n        _self._dispatchEvent('themeChange',{theme:theme});\n\n        if (!theme || typeof theme == \"string\") {\n            var moduleName = theme || this.$options.theme.initialValue;\n            config.loadModule([\"theme\", moduleName], afterLoad);\n        } else {\n            afterLoad(theme);\n        }\n\n        function afterLoad(module) {\n            if (_self.$themeId != theme)\n                return cb && cb();\n            if (!module.cssClass)\n                return;\n            dom.importCssString(\n                module.cssText,\n                module.cssClass,\n                _self.container.ownerDocument\n            );\n\n            if (_self.theme)\n                dom.removeCssClass(_self.container, _self.theme.cssClass);\n\n            var padding = \"padding\" in module ? module.padding \n                : \"padding\" in (_self.theme || {}) ? 4 : _self.$padding;\n            if (_self.$padding && padding != _self.$padding)\n                _self.setPadding(padding);\n            _self.$theme = module.cssClass;\n\n            _self.theme = module;\n            dom.addCssClass(_self.container, module.cssClass);\n            dom.setCssClass(_self.container, \"ace_dark\", module.isDark);\n            if (_self.$size) {\n                _self.$size.width = 0;\n                _self.$updateSizeAsync();\n            }\n\n            _self._dispatchEvent('themeLoaded', {theme:module});\n            cb && cb();\n        }\n    };\n    this.getTheme = function() {\n        return this.$themeId;\n    };\n    this.setStyle = function(style, include) {\n        dom.setCssClass(this.container, style, include !== false);\n    };\n    this.unsetStyle = function(style) {\n        dom.removeCssClass(this.container, style);\n    };\n    \n    this.setCursorStyle = function(style) {\n        if (this.scroller.style.cursor != style)\n            this.scroller.style.cursor = style;\n    };\n    this.setMouseCursor = function(cursorStyle) {\n        this.scroller.style.cursor = cursorStyle;\n    };\n    this.destroy = function() {\n        this.$textLayer.destroy();\n        this.$cursorLayer.destroy();\n    };\n\n}).call(VirtualRenderer.prototype);\n\n\nconfig.defineOptions(VirtualRenderer.prototype, \"renderer\", {\n    animatedScroll: {initialValue: false},\n    showInvisibles: {\n        set: function(value) {\n            if (this.$textLayer.setShowInvisibles(value))\n                this.$loop.schedule(this.CHANGE_TEXT);\n        },\n        initialValue: false\n    },\n    showPrintMargin: {\n        set: function() { this.$updatePrintMargin(); },\n        initialValue: true\n    },\n    printMarginColumn: {\n        set: function() { this.$updatePrintMargin(); },\n        initialValue: 80\n    },\n    printMargin: {\n        set: function(val) {\n            if (typeof val == \"number\")\n                this.$printMarginColumn = val;\n            this.$showPrintMargin = !!val;\n            this.$updatePrintMargin();\n        },\n        get: function() {\n            return this.$showPrintMargin && this.$printMarginColumn; \n        }\n    },\n    showGutter: {\n        set: function(show){\n            this.$gutter.style.display = show ? \"block\" : \"none\";\n            this.$loop.schedule(this.CHANGE_FULL);\n            this.onGutterResize();\n        },\n        initialValue: true\n    },\n    fadeFoldWidgets: {\n        set: function(show) {\n            dom.setCssClass(this.$gutter, \"ace_fade-fold-widgets\", show);\n        },\n        initialValue: false\n    },\n    showFoldWidgets: {\n        set: function(show) {this.$gutterLayer.setShowFoldWidgets(show)},\n        initialValue: true\n    },\n    showLineNumbers: {\n        set: function(show) {\n            this.$gutterLayer.setShowLineNumbers(show);\n            this.$loop.schedule(this.CHANGE_GUTTER);\n        },\n        initialValue: true\n    },\n    displayIndentGuides: {\n        set: function(show) {\n            if (this.$textLayer.setDisplayIndentGuides(show))\n                this.$loop.schedule(this.CHANGE_TEXT);\n        },\n        initialValue: true\n    },\n    highlightGutterLine: {\n        set: function(shouldHighlight) {\n            if (!this.$gutterLineHighlight) {\n                this.$gutterLineHighlight = dom.createElement(\"div\");\n                this.$gutterLineHighlight.className = \"ace_gutter-active-line\";\n                this.$gutter.appendChild(this.$gutterLineHighlight);\n                return;\n            }\n\n            this.$gutterLineHighlight.style.display = shouldHighlight ? \"\" : \"none\";\n            if (this.$cursorLayer.$pixelPos)\n                this.$updateGutterLineHighlight();\n        },\n        initialValue: false,\n        value: true\n    },\n    hScrollBarAlwaysVisible: {\n        set: function(val) {\n            if (!this.$hScrollBarAlwaysVisible || !this.$horizScroll)\n                this.$loop.schedule(this.CHANGE_SCROLL);\n        },\n        initialValue: false\n    },\n    vScrollBarAlwaysVisible: {\n        set: function(val) {\n            if (!this.$vScrollBarAlwaysVisible || !this.$vScroll)\n                this.$loop.schedule(this.CHANGE_SCROLL);\n        },\n        initialValue: false\n    },\n    fontSize:  {\n        set: function(size) {\n            if (typeof size == \"number\")\n                size = size + \"px\";\n            this.container.style.fontSize = size;\n            this.updateFontSize();\n        },\n        initialValue: 12\n    },\n    fontFamily: {\n        set: function(name) {\n            this.container.style.fontFamily = name;\n            this.updateFontSize();\n        }\n    },\n    maxLines: {\n        set: function(val) {\n            this.updateFull();\n        }\n    },\n    minLines: {\n        set: function(val) {\n            this.updateFull();\n        }\n    },\n    scrollPastEnd: {\n        set: function(val) {\n            val = +val || 0;\n            if (this.$scrollPastEnd == val)\n                return;\n            this.$scrollPastEnd = val;\n            this.$loop.schedule(this.CHANGE_SCROLL);\n        },\n        initialValue: 0,\n        handlesSet: true\n    },\n    fixedWidthGutter: {\n        set: function(val) {\n            this.$gutterLayer.$fixedWidth = !!val;\n            this.$loop.schedule(this.CHANGE_GUTTER);\n        }\n    },\n    theme: {\n        set: function(val) { this.setTheme(val) },\n        get: function() { return this.$themeId || this.theme; },\n        initialValue: \"./theme/textmate\",\n        handlesSet: true\n    }\n});\n\nexports.VirtualRenderer = VirtualRenderer;\n});\n\nace.define(\"ace/worker/worker_client\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/net\",\"ace/lib/event_emitter\",\"ace/config\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar net = require(\"../lib/net\");\nvar EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\nvar config = require(\"../config\");\n\nvar WorkerClient = function(topLevelNamespaces, mod, classname, workerUrl) {\n    this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n    this.changeListener = this.changeListener.bind(this);\n    this.onMessage = this.onMessage.bind(this);\n    if (require.nameToUrl && !require.toUrl)\n        require.toUrl = require.nameToUrl;\n    \n    if (config.get(\"packaged\") || !require.toUrl) {\n        workerUrl = workerUrl || config.moduleUrl(mod, \"worker\");\n    } else {\n        var normalizePath = this.$normalizePath;\n        workerUrl = workerUrl || normalizePath(require.toUrl(\"ace/worker/worker.js\", null, \"_\"));\n\n        var tlns = {};\n        topLevelNamespaces.forEach(function(ns) {\n            tlns[ns] = normalizePath(require.toUrl(ns, null, \"_\").replace(/(\\.js)?(\\?.*)?$/, \"\"));\n        });\n    }\n\n    try {\n        this.$worker = new Worker(workerUrl);\n    } catch(e) {\n        if (e instanceof window.DOMException) {\n            var blob = this.$workerBlob(workerUrl);\n            var URL = window.URL || window.webkitURL;\n            var blobURL = URL.createObjectURL(blob);\n\n            this.$worker = new Worker(blobURL);\n            URL.revokeObjectURL(blobURL);\n        } else {\n            throw e;\n        }\n    }\n    this.$worker.postMessage({\n        init : true,\n        tlns : tlns,\n        module : mod,\n        classname : classname\n    });\n\n    this.callbackId = 1;\n    this.callbacks = {};\n\n    this.$worker.onmessage = this.onMessage;\n};\n\n(function(){\n\n    oop.implement(this, EventEmitter);\n\n    this.onMessage = function(e) {\n        var msg = e.data;\n        switch(msg.type) {\n            case \"event\":\n                this._signal(msg.name, {data: msg.data});\n                break;\n            case \"call\":\n                var callback = this.callbacks[msg.id];\n                if (callback) {\n                    callback(msg.data);\n                    delete this.callbacks[msg.id];\n                }\n                break;\n            case \"error\":\n                this.reportError(msg.data);\n                break;\n            case \"log\":\n                window.console && console.log && console.log.apply(console, msg.data);\n                break;\n        }\n    };\n    \n    this.reportError = function(err) {\n        window.console && console.error && console.error(err);\n    };\n\n    this.$normalizePath = function(path) {\n        return net.qualifyURL(path);\n    };\n\n    this.terminate = function() {\n        this._signal(\"terminate\", {});\n        this.deltaQueue = null;\n        this.$worker.terminate();\n        this.$worker = null;\n        if (this.$doc)\n            this.$doc.off(\"change\", this.changeListener);\n        this.$doc = null;\n    };\n\n    this.send = function(cmd, args) {\n        this.$worker.postMessage({command: cmd, args: args});\n    };\n\n    this.call = function(cmd, args, callback) {\n        if (callback) {\n            var id = this.callbackId++;\n            this.callbacks[id] = callback;\n            args.push(id);\n        }\n        this.send(cmd, args);\n    };\n\n    this.emit = function(event, data) {\n        try {\n            this.$worker.postMessage({event: event, data: {data: data.data}});\n        }\n        catch(ex) {\n            console.error(ex.stack);\n        }\n    };\n\n    this.attachToDocument = function(doc) {\n        if(this.$doc)\n            this.terminate();\n\n        this.$doc = doc;\n        this.call(\"setValue\", [doc.getValue()]);\n        doc.on(\"change\", this.changeListener);\n    };\n\n    this.changeListener = function(e) {\n        if (!this.deltaQueue) {\n            this.deltaQueue = [e.data];\n            setTimeout(this.$sendDeltaQueue, 0);\n        } else\n            this.deltaQueue.push(e.data);\n    };\n\n    this.$sendDeltaQueue = function() {\n        var q = this.deltaQueue;\n        if (!q) return;\n        this.deltaQueue = null;\n        if (q.length > 20 && q.length > this.$doc.getLength() >> 1) {\n            this.call(\"setValue\", [this.$doc.getValue()]);\n        } else\n            this.emit(\"change\", {data: q});\n    };\n\n    this.$workerBlob = function(workerUrl) {\n        var script = \"importScripts('\" + net.qualifyURL(workerUrl) + \"');\";\n        try {\n            return new Blob([script], {\"type\": \"application/javascript\"});\n        } catch (e) { // Backwards-compatibility\n            var BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;\n            var blobBuilder = new BlobBuilder();\n            blobBuilder.append(script);\n            return blobBuilder.getBlob(\"application/javascript\");\n        }\n    };\n\n}).call(WorkerClient.prototype);\n\n\nvar UIWorkerClient = function(topLevelNamespaces, mod, classname) {\n    this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n    this.changeListener = this.changeListener.bind(this);\n    this.callbackId = 1;\n    this.callbacks = {};\n    this.messageBuffer = [];\n\n    var main = null;\n    var emitSync = false;\n    var sender = Object.create(EventEmitter);\n    var _self = this;\n\n    this.$worker = {};\n    this.$worker.terminate = function() {};\n    this.$worker.postMessage = function(e) {\n        _self.messageBuffer.push(e);\n        if (main) {\n            if (emitSync)\n                setTimeout(processNext);\n            else\n                processNext();\n        }\n    };\n    this.setEmitSync = function(val) { emitSync = val };\n\n    var processNext = function() {\n        var msg = _self.messageBuffer.shift();\n        if (msg.command)\n            main[msg.command].apply(main, msg.args);\n        else if (msg.event)\n            sender._signal(msg.event, msg.data);\n    };\n\n    sender.postMessage = function(msg) {\n        _self.onMessage({data: msg});\n    };\n    sender.callback = function(data, callbackId) {\n        this.postMessage({type: \"call\", id: callbackId, data: data});\n    };\n    sender.emit = function(name, data) {\n        this.postMessage({type: \"event\", name: name, data: data});\n    };\n\n    config.loadModule([\"worker\", mod], function(Main) {\n        main = new Main[classname](sender);\n        while (_self.messageBuffer.length)\n            processNext();\n    });\n};\n\nUIWorkerClient.prototype = WorkerClient.prototype;\n\nexports.UIWorkerClient = UIWorkerClient;\nexports.WorkerClient = WorkerClient;\n\n});\n\nace.define(\"ace/placeholder\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/lib/oop\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"./range\").Range;\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar oop = require(\"./lib/oop\");\n\nvar PlaceHolder = function(session, length, pos, others, mainClass, othersClass) {\n    var _self = this;\n    this.length = length;\n    this.session = session;\n    this.doc = session.getDocument();\n    this.mainClass = mainClass;\n    this.othersClass = othersClass;\n    this.$onUpdate = this.onUpdate.bind(this);\n    this.doc.on(\"change\", this.$onUpdate);\n    this.$others = others;\n    \n    this.$onCursorChange = function() {\n        setTimeout(function() {\n            _self.onCursorChange();\n        });\n    };\n    \n    this.$pos = pos;\n    var undoStack = session.getUndoManager().$undoStack || session.getUndoManager().$undostack || {length: -1};\n    this.$undoStackDepth =  undoStack.length;\n    this.setup();\n\n    session.selection.on(\"changeCursor\", this.$onCursorChange);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setup = function() {\n        var _self = this;\n        var doc = this.doc;\n        var session = this.session;\n        var pos = this.$pos;\n        \n        this.selectionBefore = session.selection.toJSON();\n        if (session.selection.inMultiSelectMode)\n            session.selection.toSingleRange();\n\n        this.pos = doc.createAnchor(pos.row, pos.column);\n        this.markerId = session.addMarker(new Range(pos.row, pos.column, pos.row, pos.column + this.length), this.mainClass, null, false);\n        this.pos.on(\"change\", function(event) {\n            session.removeMarker(_self.markerId);\n            _self.markerId = session.addMarker(new Range(event.value.row, event.value.column, event.value.row, event.value.column+_self.length), _self.mainClass, null, false);\n        });\n        this.others = [];\n        this.$others.forEach(function(other) {\n            var anchor = doc.createAnchor(other.row, other.column);\n            _self.others.push(anchor);\n        });\n        session.setUndoSelect(false);\n    };\n    this.showOtherMarkers = function() {\n        if(this.othersActive) return;\n        var session = this.session;\n        var _self = this;\n        this.othersActive = true;\n        this.others.forEach(function(anchor) {\n            anchor.markerId = session.addMarker(new Range(anchor.row, anchor.column, anchor.row, anchor.column+_self.length), _self.othersClass, null, false);\n            anchor.on(\"change\", function(event) {\n                session.removeMarker(anchor.markerId);\n                anchor.markerId = session.addMarker(new Range(event.value.row, event.value.column, event.value.row, event.value.column+_self.length), _self.othersClass, null, false);\n            });\n        });\n    };\n    this.hideOtherMarkers = function() {\n        if(!this.othersActive) return;\n        this.othersActive = false;\n        for (var i = 0; i < this.others.length; i++) {\n            this.session.removeMarker(this.others[i].markerId);\n        }\n    };\n    this.onUpdate = function(event) {\n        var delta = event.data;\n        var range = delta.range;\n        if(range.start.row !== range.end.row) return;\n        if(range.start.row !== this.pos.row) return;\n        if (this.$updating) return;\n        this.$updating = true;\n        var lengthDiff = delta.action === \"insertText\" ? range.end.column - range.start.column : range.start.column - range.end.column;\n        \n        if(range.start.column >= this.pos.column && range.start.column <= this.pos.column + this.length + 1) {\n            var distanceFromStart = range.start.column - this.pos.column;\n            this.length += lengthDiff;\n            if(!this.session.$fromUndo) {\n                if(delta.action === \"insertText\") {\n                    for (var i = this.others.length - 1; i >= 0; i--) {\n                        var otherPos = this.others[i];\n                        var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n                        if(otherPos.row === range.start.row && range.start.column < otherPos.column)\n                            newPos.column += lengthDiff;\n                        this.doc.insert(newPos, delta.text);\n                    }\n                } else if(delta.action === \"removeText\") {\n                    for (var i = this.others.length - 1; i >= 0; i--) {\n                        var otherPos = this.others[i];\n                        var newPos = {row: otherPos.row, column: otherPos.column + distanceFromStart};\n                        if(otherPos.row === range.start.row && range.start.column < otherPos.column)\n                            newPos.column += lengthDiff;\n                        this.doc.remove(new Range(newPos.row, newPos.column, newPos.row, newPos.column - lengthDiff));\n                    }\n                }\n                if(range.start.column === this.pos.column && delta.action === \"insertText\") {\n                    setTimeout(function() {\n                        this.pos.setPosition(this.pos.row, this.pos.column - lengthDiff);\n                        for (var i = 0; i < this.others.length; i++) {\n                            var other = this.others[i];\n                            var newPos = {row: other.row, column: other.column - lengthDiff};\n                            if(other.row === range.start.row && range.start.column < other.column)\n                                newPos.column += lengthDiff;\n                            other.setPosition(newPos.row, newPos.column);\n                        }\n                    }.bind(this), 0);\n                }\n                else if(range.start.column === this.pos.column && delta.action === \"removeText\") {\n                    setTimeout(function() {\n                        for (var i = 0; i < this.others.length; i++) {\n                            var other = this.others[i];\n                            if(other.row === range.start.row && range.start.column < other.column) {\n                                other.setPosition(other.row, other.column - lengthDiff);\n                            }\n                        }\n                    }.bind(this), 0);\n                }\n            }\n            this.pos._emit(\"change\", {value: this.pos});\n            for (var i = 0; i < this.others.length; i++) {\n                this.others[i]._emit(\"change\", {value: this.others[i]});\n            }\n        }\n        this.$updating = false;\n    };\n\n    this.onCursorChange = function(event) {\n        if (this.$updating || !this.session) return;\n        var pos = this.session.selection.getCursor();\n        if (pos.row === this.pos.row && pos.column >= this.pos.column && pos.column <= this.pos.column + this.length) {\n            this.showOtherMarkers();\n            this._emit(\"cursorEnter\", event);\n        } else {\n            this.hideOtherMarkers();\n            this._emit(\"cursorLeave\", event);\n        }\n    };    \n    this.detach = function() {\n        this.session.removeMarker(this.markerId);\n        this.hideOtherMarkers();\n        this.doc.removeEventListener(\"change\", this.$onUpdate);\n        this.session.selection.removeEventListener(\"changeCursor\", this.$onCursorChange);\n        this.pos.detach();\n        for (var i = 0; i < this.others.length; i++) {\n            this.others[i].detach();\n        }\n        this.session.setUndoSelect(true);\n        this.session = null;\n    };\n    this.cancel = function() {\n        if(this.$undoStackDepth === -1)\n            throw Error(\"Canceling placeholders only supported with undo manager attached to session.\");\n        var undoManager = this.session.getUndoManager();\n        var undosRequired = (undoManager.$undoStack || undoManager.$undostack).length - this.$undoStackDepth;\n        for (var i = 0; i < undosRequired; i++) {\n            undoManager.undo(true);\n        }\n        if (this.selectionBefore)\n            this.session.selection.fromJSON(this.selectionBefore);\n    };\n}).call(PlaceHolder.prototype);\n\n\nexports.PlaceHolder = PlaceHolder;\n});\n\nace.define(\"ace/mouse/multi_select_handler\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\"], function(require, exports, module) {\n\nvar event = require(\"../lib/event\");\nvar useragent = require(\"../lib/useragent\");\nfunction isSamePoint(p1, p2) {\n    return p1.row == p2.row && p1.column == p2.column;\n}\n\nfunction onMouseDown(e) {\n    var ev = e.domEvent;\n    var alt = ev.altKey;\n    var shift = ev.shiftKey;\n    var ctrl = ev.ctrlKey;\n    var accel = e.getAccelKey();\n    var button = e.getButton();\n    \n    if (ctrl && useragent.isMac)\n        button = ev.button;\n\n    if (e.editor.inMultiSelectMode && button == 2) {\n        e.editor.textInput.onContextMenu(e.domEvent);\n        return;\n    }\n    \n    if (!ctrl && !alt && !accel) {\n        if (button === 0 && e.editor.inMultiSelectMode)\n            e.editor.exitMultiSelectMode();\n        return;\n    }\n    \n    if (button !== 0)\n        return;\n\n    var editor = e.editor;\n    var selection = editor.selection;\n    var isMultiSelect = editor.inMultiSelectMode;\n    var pos = e.getDocumentPosition();\n    var cursor = selection.getCursor();\n    var inSelection = e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor));\n\n    var mouseX = e.x, mouseY = e.y;\n    var onMouseSelection = function(e) {\n        mouseX = e.clientX;\n        mouseY = e.clientY;\n    };\n    \n    var session = editor.session;\n    var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n    var screenCursor = screenAnchor;\n    \n    var selectionMode;\n    if (editor.$mouseHandler.$enableJumpToDef) {\n        if (ctrl && alt || accel && alt)\n            selectionMode = \"add\";\n        else if (alt)\n            selectionMode = \"block\";\n    } else {\n        if (accel && !alt) {\n            selectionMode = \"add\";\n            if (!isMultiSelect && shift)\n                return;\n        } else if (alt) {\n            selectionMode = \"block\";\n        }\n    }\n    \n    if (selectionMode && useragent.isMac && ev.ctrlKey) {\n        editor.$mouseHandler.cancelContextMenu();\n    }\n\n    if (selectionMode == \"add\") {\n        if (!isMultiSelect && inSelection)\n            return; // dragging\n\n        if (!isMultiSelect) {\n            var range = selection.toOrientedRange();\n            editor.addSelectionMarker(range);\n        }\n\n        var oldRange = selection.rangeList.rangeAtPoint(pos);\n        \n        \n        editor.$blockScrolling++;\n        editor.inVirtualSelectionMode = true;\n        \n        if (shift) {\n            oldRange = null;\n            range = selection.ranges[0];\n            editor.removeSelectionMarker(range);\n        }\n        editor.once(\"mouseup\", function() {\n            var tmpSel = selection.toOrientedRange();\n\n            if (oldRange && tmpSel.isEmpty() && isSamePoint(oldRange.cursor, tmpSel.cursor))\n                selection.substractPoint(tmpSel.cursor);\n            else {\n                if (shift) {\n                    selection.substractPoint(range.cursor);\n                } else if (range) {\n                    editor.removeSelectionMarker(range);\n                    selection.addRange(range);\n                }\n                selection.addRange(tmpSel);\n            }\n            editor.$blockScrolling--;\n            editor.inVirtualSelectionMode = false;\n        });\n\n    } else if (selectionMode == \"block\") {\n        e.stop();\n        editor.inVirtualSelectionMode = true;        \n        var initialRange;\n        var rectSel = [];\n        var blockSelect = function() {\n            var newCursor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n            var cursor = session.screenToDocumentPosition(newCursor.row, newCursor.column);\n\n            if (isSamePoint(screenCursor, newCursor) && isSamePoint(cursor, selection.lead))\n                return;\n            screenCursor = newCursor;\n            \n            editor.$blockScrolling++;\n            editor.selection.moveToPosition(cursor);\n            editor.renderer.scrollCursorIntoView();\n\n            editor.removeSelectionMarkers(rectSel);\n            rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor);\n            if (editor.$mouseHandler.$clickSelection && rectSel.length == 1 && rectSel[0].isEmpty())\n                rectSel[0] = editor.$mouseHandler.$clickSelection.clone();\n            rectSel.forEach(editor.addSelectionMarker, editor);\n            editor.updateSelectionMarkers();\n            editor.$blockScrolling--;\n        };\n        editor.$blockScrolling++;\n        if (isMultiSelect && !accel) {\n            selection.toSingleRange();\n        } else if (!isMultiSelect && accel) {\n            initialRange = selection.toOrientedRange();\n            editor.addSelectionMarker(initialRange);\n        }\n        \n        if (shift)\n            screenAnchor = session.documentToScreenPosition(selection.lead);            \n        else\n            selection.moveToPosition(pos);\n        editor.$blockScrolling--;\n        \n        screenCursor = {row: -1, column: -1};\n\n        var onMouseSelectionEnd = function(e) {\n            clearInterval(timerId);\n            editor.removeSelectionMarkers(rectSel);\n            if (!rectSel.length)\n                rectSel = [selection.toOrientedRange()];\n            editor.$blockScrolling++;\n            if (initialRange) {\n                editor.removeSelectionMarker(initialRange);\n                selection.toSingleRange(initialRange);\n            }\n            for (var i = 0; i < rectSel.length; i++)\n                selection.addRange(rectSel[i]);\n            editor.inVirtualSelectionMode = false;\n            editor.$mouseHandler.$clickSelection = null;\n            editor.$blockScrolling--;\n        };\n\n        var onSelectionInterval = blockSelect;\n\n        event.capture(editor.container, onMouseSelection, onMouseSelectionEnd);\n        var timerId = setInterval(function() {onSelectionInterval();}, 20);\n\n        return e.preventDefault();\n    }\n}\n\n\nexports.onMouseDown = onMouseDown;\n\n});\n\nace.define(\"ace/commands/multi_select_commands\",[\"require\",\"exports\",\"module\",\"ace/keyboard/hash_handler\"], function(require, exports, module) {\nexports.defaultCommands = [{\n    name: \"addCursorAbove\",\n    exec: function(editor) { editor.selectMoreLines(-1); },\n    bindKey: {win: \"Ctrl-Alt-Up\", mac: \"Ctrl-Alt-Up\"},\n    scrollIntoView: \"cursor\",\n    readonly: true\n}, {\n    name: \"addCursorBelow\",\n    exec: function(editor) { editor.selectMoreLines(1); },\n    bindKey: {win: \"Ctrl-Alt-Down\", mac: \"Ctrl-Alt-Down\"},\n    scrollIntoView: \"cursor\",\n    readonly: true\n}, {\n    name: \"addCursorAboveSkipCurrent\",\n    exec: function(editor) { editor.selectMoreLines(-1, true); },\n    bindKey: {win: \"Ctrl-Alt-Shift-Up\", mac: \"Ctrl-Alt-Shift-Up\"},\n    scrollIntoView: \"cursor\",\n    readonly: true\n}, {\n    name: \"addCursorBelowSkipCurrent\",\n    exec: function(editor) { editor.selectMoreLines(1, true); },\n    bindKey: {win: \"Ctrl-Alt-Shift-Down\", mac: \"Ctrl-Alt-Shift-Down\"},\n    scrollIntoView: \"cursor\",\n    readonly: true\n}, {\n    name: \"selectMoreBefore\",\n    exec: function(editor) { editor.selectMore(-1); },\n    bindKey: {win: \"Ctrl-Alt-Left\", mac: \"Ctrl-Alt-Left\"},\n    scrollIntoView: \"cursor\",\n    readonly: true\n}, {\n    name: \"selectMoreAfter\",\n    exec: function(editor) { editor.selectMore(1); },\n    bindKey: {win: \"Ctrl-Alt-Right\", mac: \"Ctrl-Alt-Right\"},\n    scrollIntoView: \"cursor\",\n    readonly: true\n}, {\n    name: \"selectNextBefore\",\n    exec: function(editor) { editor.selectMore(-1, true); },\n    bindKey: {win: \"Ctrl-Alt-Shift-Left\", mac: \"Ctrl-Alt-Shift-Left\"},\n    scrollIntoView: \"cursor\",\n    readonly: true\n}, {\n    name: \"selectNextAfter\",\n    exec: function(editor) { editor.selectMore(1, true); },\n    bindKey: {win: \"Ctrl-Alt-Shift-Right\", mac: \"Ctrl-Alt-Shift-Right\"},\n    scrollIntoView: \"cursor\",\n    readonly: true\n}, {\n    name: \"splitIntoLines\",\n    exec: function(editor) { editor.multiSelect.splitIntoLines(); },\n    bindKey: {win: \"Ctrl-Alt-L\", mac: \"Ctrl-Alt-L\"},\n    readonly: true\n}, {\n    name: \"alignCursors\",\n    exec: function(editor) { editor.alignCursors(); },\n    bindKey: {win: \"Ctrl-Alt-A\", mac: \"Ctrl-Alt-A\"},\n    scrollIntoView: \"cursor\"\n}, {\n    name: \"findAll\",\n    exec: function(editor) { editor.findAll(); },\n    bindKey: {win: \"Ctrl-Alt-K\", mac: \"Ctrl-Alt-G\"},\n    scrollIntoView: \"cursor\",\n    readonly: true\n}];\nexports.multiSelectCommands = [{\n    name: \"singleSelection\",\n    bindKey: \"esc\",\n    exec: function(editor) { editor.exitMultiSelectMode(); },\n    scrollIntoView: \"cursor\",\n    readonly: true,\n    isAvailable: function(editor) {return editor && editor.inMultiSelectMode}\n}];\n\nvar HashHandler = require(\"../keyboard/hash_handler\").HashHandler;\nexports.keyboardHandler = new HashHandler(exports.multiSelectCommands);\n\n});\n\nace.define(\"ace/multi_select\",[\"require\",\"exports\",\"module\",\"ace/range_list\",\"ace/range\",\"ace/selection\",\"ace/mouse/multi_select_handler\",\"ace/lib/event\",\"ace/lib/lang\",\"ace/commands/multi_select_commands\",\"ace/search\",\"ace/edit_session\",\"ace/editor\",\"ace/config\"], function(require, exports, module) {\n\nvar RangeList = require(\"./range_list\").RangeList;\nvar Range = require(\"./range\").Range;\nvar Selection = require(\"./selection\").Selection;\nvar onMouseDown = require(\"./mouse/multi_select_handler\").onMouseDown;\nvar event = require(\"./lib/event\");\nvar lang = require(\"./lib/lang\");\nvar commands = require(\"./commands/multi_select_commands\");\nexports.commands = commands.defaultCommands.concat(commands.multiSelectCommands);\nvar Search = require(\"./search\").Search;\nvar search = new Search();\n\nfunction find(session, needle, dir) {\n    search.$options.wrap = true;\n    search.$options.needle = needle;\n    search.$options.backwards = dir == -1;\n    return search.find(session);\n}\nvar EditSession = require(\"./edit_session\").EditSession;\n(function() {\n    this.getSelectionMarkers = function() {\n        return this.$selectionMarkers;\n    };\n}).call(EditSession.prototype);\n(function() {\n    this.ranges = null;\n    this.rangeList = null;\n    this.addRange = function(range, $blockChangeEvents) {\n        if (!range)\n            return;\n\n        if (!this.inMultiSelectMode && this.rangeCount === 0) {\n            var oldRange = this.toOrientedRange();\n            this.rangeList.add(oldRange);\n            this.rangeList.add(range);\n            if (this.rangeList.ranges.length != 2) {\n                this.rangeList.removeAll();\n                return $blockChangeEvents || this.fromOrientedRange(range);\n            }\n            this.rangeList.removeAll();\n            this.rangeList.add(oldRange);\n            this.$onAddRange(oldRange);\n        }\n\n        if (!range.cursor)\n            range.cursor = range.end;\n\n        var removed = this.rangeList.add(range);\n\n        this.$onAddRange(range);\n\n        if (removed.length)\n            this.$onRemoveRange(removed);\n\n        if (this.rangeCount > 1 && !this.inMultiSelectMode) {\n            this._signal(\"multiSelect\");\n            this.inMultiSelectMode = true;\n            this.session.$undoSelect = false;\n            this.rangeList.attach(this.session);\n        }\n\n        return $blockChangeEvents || this.fromOrientedRange(range);\n    };\n\n    this.toSingleRange = function(range) {\n        range = range || this.ranges[0];\n        var removed = this.rangeList.removeAll();\n        if (removed.length)\n            this.$onRemoveRange(removed);\n\n        range && this.fromOrientedRange(range);\n    };\n    this.substractPoint = function(pos) {\n        var removed = this.rangeList.substractPoint(pos);\n        if (removed) {\n            this.$onRemoveRange(removed);\n            return removed[0];\n        }\n    };\n    this.mergeOverlappingRanges = function() {\n        var removed = this.rangeList.merge();\n        if (removed.length)\n            this.$onRemoveRange(removed);\n        else if(this.ranges[0])\n            this.fromOrientedRange(this.ranges[0]);\n    };\n\n    this.$onAddRange = function(range) {\n        this.rangeCount = this.rangeList.ranges.length;\n        this.ranges.unshift(range);\n        this._signal(\"addRange\", {range: range});\n    };\n\n    this.$onRemoveRange = function(removed) {\n        this.rangeCount = this.rangeList.ranges.length;\n        if (this.rangeCount == 1 && this.inMultiSelectMode) {\n            var lastRange = this.rangeList.ranges.pop();\n            removed.push(lastRange);\n            this.rangeCount = 0;\n        }\n\n        for (var i = removed.length; i--; ) {\n            var index = this.ranges.indexOf(removed[i]);\n            this.ranges.splice(index, 1);\n        }\n\n        this._signal(\"removeRange\", {ranges: removed});\n\n        if (this.rangeCount === 0 && this.inMultiSelectMode) {\n            this.inMultiSelectMode = false;\n            this._signal(\"singleSelect\");\n            this.session.$undoSelect = true;\n            this.rangeList.detach(this.session);\n        }\n\n        lastRange = lastRange || this.ranges[0];\n        if (lastRange && !lastRange.isEqual(this.getRange()))\n            this.fromOrientedRange(lastRange);\n    };\n    this.$initRangeList = function() {\n        if (this.rangeList)\n            return;\n\n        this.rangeList = new RangeList();\n        this.ranges = [];\n        this.rangeCount = 0;\n    };\n    this.getAllRanges = function() {\n        return this.rangeCount ? this.rangeList.ranges.concat() : [this.getRange()];\n    };\n\n    this.splitIntoLines = function () {\n        if (this.rangeCount > 1) {\n            var ranges = this.rangeList.ranges;\n            var lastRange = ranges[ranges.length - 1];\n            var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n            this.toSingleRange();\n            this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n        } else {\n            var range = this.getRange();\n            var isBackwards = this.isBackwards();\n            var startRow = range.start.row;\n            var endRow = range.end.row;\n            if (startRow == endRow) {\n                if (isBackwards)\n                    var start = range.end, end = range.start;\n                else\n                    var start = range.start, end = range.end;\n                \n                this.addRange(Range.fromPoints(end, end));\n                this.addRange(Range.fromPoints(start, start));\n                return;\n            }\n\n            var rectSel = [];\n            var r = this.getLineRange(startRow, true);\n            r.start.column = range.start.column;\n            rectSel.push(r);\n\n            for (var i = startRow + 1; i < endRow; i++)\n                rectSel.push(this.getLineRange(i, true));\n\n            r = this.getLineRange(endRow, true);\n            r.end.column = range.end.column;\n            rectSel.push(r);\n\n            rectSel.forEach(this.addRange, this);\n        }\n    };\n    this.toggleBlockSelection = function () {\n        if (this.rangeCount > 1) {\n            var ranges = this.rangeList.ranges;\n            var lastRange = ranges[ranges.length - 1];\n            var range = Range.fromPoints(ranges[0].start, lastRange.end);\n\n            this.toSingleRange();\n            this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n        } else {\n            var cursor = this.session.documentToScreenPosition(this.selectionLead);\n            var anchor = this.session.documentToScreenPosition(this.selectionAnchor);\n\n            var rectSel = this.rectangularRangeBlock(cursor, anchor);\n            rectSel.forEach(this.addRange, this);\n        }\n    };\n    this.rectangularRangeBlock = function(screenCursor, screenAnchor, includeEmptyLines) {\n        var rectSel = [];\n\n        var xBackwards = screenCursor.column < screenAnchor.column;\n        if (xBackwards) {\n            var startColumn = screenCursor.column;\n            var endColumn = screenAnchor.column;\n        } else {\n            var startColumn = screenAnchor.column;\n            var endColumn = screenCursor.column;\n        }\n\n        var yBackwards = screenCursor.row < screenAnchor.row;\n        if (yBackwards) {\n            var startRow = screenCursor.row;\n            var endRow = screenAnchor.row;\n        } else {\n            var startRow = screenAnchor.row;\n            var endRow = screenCursor.row;\n        }\n\n        if (startColumn < 0)\n            startColumn = 0;\n        if (startRow < 0)\n            startRow = 0;\n\n        if (startRow == endRow)\n            includeEmptyLines = true;\n\n        for (var row = startRow; row <= endRow; row++) {\n            var range = Range.fromPoints(\n                this.session.screenToDocumentPosition(row, startColumn),\n                this.session.screenToDocumentPosition(row, endColumn)\n            );\n            if (range.isEmpty()) {\n                if (docEnd && isSamePoint(range.end, docEnd))\n                    break;\n                var docEnd = range.end;\n            }\n            range.cursor = xBackwards ? range.start : range.end;\n            rectSel.push(range);\n        }\n\n        if (yBackwards)\n            rectSel.reverse();\n\n        if (!includeEmptyLines) {\n            var end = rectSel.length - 1;\n            while (rectSel[end].isEmpty() && end > 0)\n                end--;\n            if (end > 0) {\n                var start = 0;\n                while (rectSel[start].isEmpty())\n                    start++;\n            }\n            for (var i = end; i >= start; i--) {\n                if (rectSel[i].isEmpty())\n                    rectSel.splice(i, 1);\n            }\n        }\n\n        return rectSel;\n    };\n}).call(Selection.prototype);\nvar Editor = require(\"./editor\").Editor;\n(function() {\n    this.updateSelectionMarkers = function() {\n        this.renderer.updateCursor();\n        this.renderer.updateBackMarkers();\n    };\n    this.addSelectionMarker = function(orientedRange) {\n        if (!orientedRange.cursor)\n            orientedRange.cursor = orientedRange.end;\n\n        var style = this.getSelectionStyle();\n        orientedRange.marker = this.session.addMarker(orientedRange, \"ace_selection\", style);\n\n        this.session.$selectionMarkers.push(orientedRange);\n        this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n        return orientedRange;\n    };\n    this.removeSelectionMarker = function(range) {\n        if (!range.marker)\n            return;\n        this.session.removeMarker(range.marker);\n        var index = this.session.$selectionMarkers.indexOf(range);\n        if (index != -1)\n            this.session.$selectionMarkers.splice(index, 1);\n        this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n    };\n\n    this.removeSelectionMarkers = function(ranges) {\n        var markerList = this.session.$selectionMarkers;\n        for (var i = ranges.length; i--; ) {\n            var range = ranges[i];\n            if (!range.marker)\n                continue;\n            this.session.removeMarker(range.marker);\n            var index = markerList.indexOf(range);\n            if (index != -1)\n                markerList.splice(index, 1);\n        }\n        this.session.selectionMarkerCount = markerList.length;\n    };\n\n    this.$onAddRange = function(e) {\n        this.addSelectionMarker(e.range);\n        this.renderer.updateCursor();\n        this.renderer.updateBackMarkers();\n    };\n\n    this.$onRemoveRange = function(e) {\n        this.removeSelectionMarkers(e.ranges);\n        this.renderer.updateCursor();\n        this.renderer.updateBackMarkers();\n    };\n\n    this.$onMultiSelect = function(e) {\n        if (this.inMultiSelectMode)\n            return;\n        this.inMultiSelectMode = true;\n\n        this.setStyle(\"ace_multiselect\");\n        this.keyBinding.addKeyboardHandler(commands.keyboardHandler);\n        this.commands.setDefaultHandler(\"exec\", this.$onMultiSelectExec);\n\n        this.renderer.updateCursor();\n        this.renderer.updateBackMarkers();\n    };\n\n    this.$onSingleSelect = function(e) {\n        if (this.session.multiSelect.inVirtualMode)\n            return;\n        this.inMultiSelectMode = false;\n\n        this.unsetStyle(\"ace_multiselect\");\n        this.keyBinding.removeKeyboardHandler(commands.keyboardHandler);\n\n        this.commands.removeDefaultHandler(\"exec\", this.$onMultiSelectExec);\n        this.renderer.updateCursor();\n        this.renderer.updateBackMarkers();\n        this._emit(\"changeSelection\");\n    };\n\n    this.$onMultiSelectExec = function(e) {\n        var command = e.command;\n        var editor = e.editor;\n        if (!editor.multiSelect)\n            return;\n        if (!command.multiSelectAction) {\n            var result = command.exec(editor, e.args || {});\n            editor.multiSelect.addRange(editor.multiSelect.toOrientedRange());\n            editor.multiSelect.mergeOverlappingRanges();\n        } else if (command.multiSelectAction == \"forEach\") {\n            result = editor.forEachSelection(command, e.args);\n        } else if (command.multiSelectAction == \"forEachLine\") {\n            result = editor.forEachSelection(command, e.args, true);\n        } else if (command.multiSelectAction == \"single\") {\n            editor.exitMultiSelectMode();\n            result = command.exec(editor, e.args || {});\n        } else {\n            result = command.multiSelectAction(editor, e.args || {});\n        }\n        return result;\n    }; \n    this.forEachSelection = function(cmd, args, options) {\n        if (this.inVirtualSelectionMode)\n            return;\n        var keepOrder = options && options.keepOrder;\n        var $byLines = options == true || options && options.$byLines\n        var session = this.session;\n        var selection = this.selection;\n        var rangeList = selection.rangeList;\n        var ranges = (keepOrder ? selection : rangeList).ranges;\n        var result;\n        \n        if (!ranges.length)\n            return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\n        \n        var reg = selection._eventRegistry;\n        selection._eventRegistry = {};\n\n        var tmpSel = new Selection(session);\n        this.inVirtualSelectionMode = true;\n        for (var i = ranges.length; i--;) {\n            if ($byLines) {\n                while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row)\n                    i--;\n            }\n            tmpSel.fromOrientedRange(ranges[i]);\n            tmpSel.index = i;\n            this.selection = session.selection = tmpSel;\n            var cmdResult = cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\n            if (!result && cmdResult !== undefined)\n                result = cmdResult;\n            tmpSel.toOrientedRange(ranges[i]);\n        }\n        tmpSel.detach();\n\n        this.selection = session.selection = selection;\n        this.inVirtualSelectionMode = false;\n        selection._eventRegistry = reg;\n        selection.mergeOverlappingRanges();\n        \n        var anim = this.renderer.$scrollAnimation;\n        this.onCursorChange();\n        this.onSelectionChange();\n        if (anim && anim.from == anim.to)\n            this.renderer.animateScrolling(anim.from);\n        \n        return result;\n    };\n    this.exitMultiSelectMode = function() {\n        if (!this.inMultiSelectMode || this.inVirtualSelectionMode)\n            return;\n        this.multiSelect.toSingleRange();\n    };\n\n    this.getSelectedText = function() {\n        var text = \"\";\n        if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n            var ranges = this.multiSelect.rangeList.ranges;\n            var buf = [];\n            for (var i = 0; i < ranges.length; i++) {\n                buf.push(this.session.getTextRange(ranges[i]));\n            }\n            var nl = this.session.getDocument().getNewLineCharacter();\n            text = buf.join(nl);\n            if (text.length == (buf.length - 1) * nl.length)\n                text = \"\";\n        } else if (!this.selection.isEmpty()) {\n            text = this.session.getTextRange(this.getSelectionRange());\n        }\n        return text;\n    };\n    \n    this.$checkMultiselectChange = function(e, anchor) {\n        if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n            var range = this.multiSelect.ranges[0];\n            if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor)\n                return;\n            var pos = anchor == this.multiSelect.anchor\n                ? range.cursor == range.start ? range.end : range.start\n                : range.cursor;\n            if (pos.row != anchor.row \n                || this.session.$clipPositionToDocument(pos.row, pos.column).column != anchor.column)\n                this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange());\n        }\n    };\n    this.findAll = function(needle, options, additive) {\n        options = options || {};\n        options.needle = needle || options.needle;\n        if (options.needle == undefined) {\n            var range = this.selection.isEmpty()\n                ? this.selection.getWordRange()\n                : this.selection.getRange();\n            options.needle = this.session.getTextRange(range);\n        }    \n        this.$search.set(options);\n        \n        var ranges = this.$search.findAll(this.session);\n        if (!ranges.length)\n            return 0;\n\n        this.$blockScrolling += 1;\n        var selection = this.multiSelect;\n\n        if (!additive)\n            selection.toSingleRange(ranges[0]);\n\n        for (var i = ranges.length; i--; )\n            selection.addRange(ranges[i], true);\n        if (range && selection.rangeList.rangeAtPoint(range.start))\n            selection.addRange(range, true);\n        \n        this.$blockScrolling -= 1;\n\n        return ranges.length;\n    };\n    this.selectMoreLines = function(dir, skip) {\n        var range = this.selection.toOrientedRange();\n        var isBackwards = range.cursor == range.end;\n\n        var screenLead = this.session.documentToScreenPosition(range.cursor);\n        if (this.selection.$desiredColumn)\n            screenLead.column = this.selection.$desiredColumn;\n\n        var lead = this.session.screenToDocumentPosition(screenLead.row + dir, screenLead.column);\n\n        if (!range.isEmpty()) {\n            var screenAnchor = this.session.documentToScreenPosition(isBackwards ? range.end : range.start);\n            var anchor = this.session.screenToDocumentPosition(screenAnchor.row + dir, screenAnchor.column);\n        } else {\n            var anchor = lead;\n        }\n\n        if (isBackwards) {\n            var newRange = Range.fromPoints(lead, anchor);\n            newRange.cursor = newRange.start;\n        } else {\n            var newRange = Range.fromPoints(anchor, lead);\n            newRange.cursor = newRange.end;\n        }\n\n        newRange.desiredColumn = screenLead.column;\n        if (!this.selection.inMultiSelectMode) {\n            this.selection.addRange(range);\n        } else {\n            if (skip)\n                var toRemove = range.cursor;\n        }\n\n        this.selection.addRange(newRange);\n        if (toRemove)\n            this.selection.substractPoint(toRemove);\n    };\n    this.transposeSelections = function(dir) {\n        var session = this.session;\n        var sel = session.multiSelect;\n        var all = sel.ranges;\n\n        for (var i = all.length; i--; ) {\n            var range = all[i];\n            if (range.isEmpty()) {\n                var tmp = session.getWordRange(range.start.row, range.start.column);\n                range.start.row = tmp.start.row;\n                range.start.column = tmp.start.column;\n                range.end.row = tmp.end.row;\n                range.end.column = tmp.end.column;\n            }\n        }\n        sel.mergeOverlappingRanges();\n\n        var words = [];\n        for (var i = all.length; i--; ) {\n            var range = all[i];\n            words.unshift(session.getTextRange(range));\n        }\n\n        if (dir < 0)\n            words.unshift(words.pop());\n        else\n            words.push(words.shift());\n\n        for (var i = all.length; i--; ) {\n            var range = all[i];\n            var tmp = range.clone();\n            session.replace(range, words[i]);\n            range.start.row = tmp.start.row;\n            range.start.column = tmp.start.column;\n        }\n    };\n    this.selectMore = function(dir, skip, stopAtFirst) {\n        var session = this.session;\n        var sel = session.multiSelect;\n\n        var range = sel.toOrientedRange();\n        if (range.isEmpty()) {\n            range = session.getWordRange(range.start.row, range.start.column);\n            range.cursor = dir == -1 ? range.start : range.end;\n            this.multiSelect.addRange(range);\n            if (stopAtFirst)\n                return;\n        }\n        var needle = session.getTextRange(range);\n\n        var newRange = find(session, needle, dir);\n        if (newRange) {\n            newRange.cursor = dir == -1 ? newRange.start : newRange.end;\n            this.$blockScrolling += 1;\n            this.session.unfold(newRange);\n            this.multiSelect.addRange(newRange);\n            this.$blockScrolling -= 1;\n            this.renderer.scrollCursorIntoView(null, 0.5);\n        }\n        if (skip)\n            this.multiSelect.substractPoint(range.cursor);\n    };\n    this.alignCursors = function() {\n        var session = this.session;\n        var sel = session.multiSelect;\n        var ranges = sel.ranges;\n        var row = -1;\n        var sameRowRanges = ranges.filter(function(r) {\n            if (r.cursor.row == row)\n                return true;\n            row = r.cursor.row;\n        });\n        \n        if (!ranges.length || sameRowRanges.length == ranges.length - 1) {\n            var range = this.selection.getRange();\n            var fr = range.start.row, lr = range.end.row;\n            var guessRange = fr == lr;\n            if (guessRange) {\n                var max = this.session.getLength();\n                var line;\n                do {\n                    line = this.session.getLine(lr);\n                } while (/[=:]/.test(line) && ++lr < max);\n                do {\n                    line = this.session.getLine(fr);\n                } while (/[=:]/.test(line) && --fr > 0);\n                \n                if (fr < 0) fr = 0;\n                if (lr >= max) lr = max - 1;\n            }\n            var lines = this.session.doc.removeLines(fr, lr);\n            lines = this.$reAlignText(lines, guessRange);\n            this.session.doc.insert({row: fr, column: 0}, lines.join(\"\\n\") + \"\\n\");\n            if (!guessRange) {\n                range.start.column = 0;\n                range.end.column = lines[lines.length - 1].length;\n            }\n            this.selection.setRange(range);\n        } else {\n            sameRowRanges.forEach(function(r) {\n                sel.substractPoint(r.cursor);\n            });\n\n            var maxCol = 0;\n            var minSpace = Infinity;\n            var spaceOffsets = ranges.map(function(r) {\n                var p = r.cursor;\n                var line = session.getLine(p.row);\n                var spaceOffset = line.substr(p.column).search(/\\S/g);\n                if (spaceOffset == -1)\n                    spaceOffset = 0;\n\n                if (p.column > maxCol)\n                    maxCol = p.column;\n                if (spaceOffset < minSpace)\n                    minSpace = spaceOffset;\n                return spaceOffset;\n            });\n            ranges.forEach(function(r, i) {\n                var p = r.cursor;\n                var l = maxCol - p.column;\n                var d = spaceOffsets[i] - minSpace;\n                if (l > d)\n                    session.insert(p, lang.stringRepeat(\" \", l - d));\n                else\n                    session.remove(new Range(p.row, p.column, p.row, p.column - l + d));\n\n                r.start.column = r.end.column = maxCol;\n                r.start.row = r.end.row = p.row;\n                r.cursor = r.end;\n            });\n            sel.fromOrientedRange(ranges[0]);\n            this.renderer.updateCursor();\n            this.renderer.updateBackMarkers();\n        }\n    };\n\n    this.$reAlignText = function(lines, forceLeft) {\n        var isLeftAligned = true, isRightAligned = true;\n        var startW, textW, endW;\n\n        return lines.map(function(line) {\n            var m = line.match(/(\\s*)(.*?)(\\s*)([=:].*)/);\n            if (!m)\n                return [line];\n\n            if (startW == null) {\n                startW = m[1].length;\n                textW = m[2].length;\n                endW = m[3].length;\n                return m;\n            }\n\n            if (startW + textW + endW != m[1].length + m[2].length + m[3].length)\n                isRightAligned = false;\n            if (startW != m[1].length)\n                isLeftAligned = false;\n\n            if (startW > m[1].length)\n                startW = m[1].length;\n            if (textW < m[2].length)\n                textW = m[2].length;\n            if (endW > m[3].length)\n                endW = m[3].length;\n\n            return m;\n        }).map(forceLeft ? alignLeft :\n            isLeftAligned ? isRightAligned ? alignRight : alignLeft : unAlign);\n\n        function spaces(n) {\n            return lang.stringRepeat(\" \", n);\n        }\n\n        function alignLeft(m) {\n            return !m[2] ? m[0] : spaces(startW) + m[2]\n                + spaces(textW - m[2].length + endW)\n                + m[4].replace(/^([=:])\\s+/, \"$1 \");\n        }\n        function alignRight(m) {\n            return !m[2] ? m[0] : spaces(startW + textW - m[2].length) + m[2]\n                + spaces(endW, \" \")\n                + m[4].replace(/^([=:])\\s+/, \"$1 \");\n        }\n        function unAlign(m) {\n            return !m[2] ? m[0] : spaces(startW) + m[2]\n                + spaces(endW)\n                + m[4].replace(/^([=:])\\s+/, \"$1 \");\n        }\n    };\n}).call(Editor.prototype);\n\n\nfunction isSamePoint(p1, p2) {\n    return p1.row == p2.row && p1.column == p2.column;\n}\nexports.onSessionChange = function(e) {\n    var session = e.session;\n    if (session && !session.multiSelect) {\n        session.$selectionMarkers = [];\n        session.selection.$initRangeList();\n        session.multiSelect = session.selection;\n    }\n    this.multiSelect = session && session.multiSelect;\n\n    var oldSession = e.oldSession;\n    if (oldSession) {\n        oldSession.multiSelect.off(\"addRange\", this.$onAddRange);\n        oldSession.multiSelect.off(\"removeRange\", this.$onRemoveRange);\n        oldSession.multiSelect.off(\"multiSelect\", this.$onMultiSelect);\n        oldSession.multiSelect.off(\"singleSelect\", this.$onSingleSelect);\n        oldSession.multiSelect.lead.off(\"change\",  this.$checkMultiselectChange);\n        oldSession.multiSelect.anchor.off(\"change\",  this.$checkMultiselectChange);\n    }\n\n    if (session) {\n        session.multiSelect.on(\"addRange\", this.$onAddRange);\n        session.multiSelect.on(\"removeRange\", this.$onRemoveRange);\n        session.multiSelect.on(\"multiSelect\", this.$onMultiSelect);\n        session.multiSelect.on(\"singleSelect\", this.$onSingleSelect);\n        session.multiSelect.lead.on(\"change\",  this.$checkMultiselectChange);\n        session.multiSelect.anchor.on(\"change\",  this.$checkMultiselectChange);\n    }\n\n    if (session && this.inMultiSelectMode != session.selection.inMultiSelectMode) {\n        if (session.selection.inMultiSelectMode)\n            this.$onMultiSelect();\n        else\n            this.$onSingleSelect();\n    }\n};\nfunction MultiSelect(editor) {\n    if (editor.$multiselectOnSessionChange)\n        return;\n    editor.$onAddRange = editor.$onAddRange.bind(editor);\n    editor.$onRemoveRange = editor.$onRemoveRange.bind(editor);\n    editor.$onMultiSelect = editor.$onMultiSelect.bind(editor);\n    editor.$onSingleSelect = editor.$onSingleSelect.bind(editor);\n    editor.$multiselectOnSessionChange = exports.onSessionChange.bind(editor);\n    editor.$checkMultiselectChange = editor.$checkMultiselectChange.bind(editor);\n\n    editor.$multiselectOnSessionChange(editor);\n    editor.on(\"changeSession\", editor.$multiselectOnSessionChange);\n\n    editor.on(\"mousedown\", onMouseDown);\n    editor.commands.addCommands(commands.defaultCommands);\n\n    addAltCursorListeners(editor);\n}\n\nfunction addAltCursorListeners(editor){\n    var el = editor.textInput.getElement();\n    var altCursor = false;\n    event.addListener(el, \"keydown\", function(e) {\n        if (e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey)) {\n            if (!altCursor) {\n                editor.renderer.setMouseCursor(\"crosshair\");\n                altCursor = true;\n            }\n        } else if (altCursor) {\n            reset();\n        }\n    });\n\n    event.addListener(el, \"keyup\", reset);\n    event.addListener(el, \"blur\", reset);\n    function reset(e) {\n        if (altCursor) {\n            editor.renderer.setMouseCursor(\"\");\n            altCursor = false;\n        }\n    }\n}\n\nexports.MultiSelect = MultiSelect;\n\n\nrequire(\"./config\").defineOptions(Editor.prototype, \"editor\", {\n    enableMultiselect: {\n        set: function(val) {\n            MultiSelect(this);\n            if (val) {\n                this.on(\"changeSession\", this.$multiselectOnSessionChange);\n                this.on(\"mousedown\", onMouseDown);\n            } else {\n                this.off(\"changeSession\", this.$multiselectOnSessionChange);\n                this.off(\"mousedown\", onMouseDown);\n            }\n        },\n        value: true\n    }\n});\n\n\n\n});\n\nace.define(\"ace/mode/folding/fold_mode\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\n\n(function() {\n\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (this.foldingStartMarker.test(line))\n            return \"start\";\n        if (foldStyle == \"markbeginend\"\n                && this.foldingStopMarker\n                && this.foldingStopMarker.test(line))\n            return \"end\";\n        return \"\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        return null;\n    };\n\n    this.indentationBlock = function(session, row, column) {\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1)\n            return;\n\n        var startColumn = column || line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            var level = session.getLine(row).search(re);\n\n            if (level == -1)\n                continue;\n\n            if (level <= startLevel)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n    this.openingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var start = {row: row, column: column + 1};\n        var end = session.$findClosingBracket(bracket, start, typeRe);\n        if (!end)\n            return;\n\n        var fw = session.foldWidgets[end.row];\n        if (fw == null)\n            fw = session.getFoldWidget(end.row);\n\n        if (fw == \"start\" && end.row > start.row) {\n            end.row --;\n            end.column = session.getLine(end.row).length;\n        }\n        return Range.fromPoints(start, end);\n    };\n\n    this.closingBracketBlock = function(session, bracket, row, column, typeRe) {\n        var end = {row: row, column: column};\n        var start = session.$findOpeningBracket(bracket, end);\n\n        if (!start)\n            return;\n\n        start.column++;\n        end.column--;\n\n        return  Range.fromPoints(start, end);\n    };\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/theme/textmate\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nexports.isDark = false;\nexports.cssClass = \"ace-tm\";\nexports.cssText = \".ace-tm .ace_gutter {\\\nbackground: #f0f0f0;\\\ncolor: #333;\\\n}\\\n.ace-tm .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8;\\\n}\\\n.ace-tm .ace_fold {\\\nbackground-color: #6B72E6;\\\n}\\\n.ace-tm {\\\nbackground-color: #FFFFFF;\\\ncolor: black;\\\n}\\\n.ace-tm .ace_cursor {\\\ncolor: black;\\\n}\\\n.ace-tm .ace_invisible {\\\ncolor: rgb(191, 191, 191);\\\n}\\\n.ace-tm .ace_storage,\\\n.ace-tm .ace_keyword {\\\ncolor: blue;\\\n}\\\n.ace-tm .ace_constant {\\\ncolor: rgb(197, 6, 11);\\\n}\\\n.ace-tm .ace_constant.ace_buildin {\\\ncolor: rgb(88, 72, 246);\\\n}\\\n.ace-tm .ace_constant.ace_language {\\\ncolor: rgb(88, 92, 246);\\\n}\\\n.ace-tm .ace_constant.ace_library {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_invalid {\\\nbackground-color: rgba(255, 0, 0, 0.1);\\\ncolor: red;\\\n}\\\n.ace-tm .ace_support.ace_function {\\\ncolor: rgb(60, 76, 114);\\\n}\\\n.ace-tm .ace_support.ace_constant {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_support.ace_type,\\\n.ace-tm .ace_support.ace_class {\\\ncolor: rgb(109, 121, 222);\\\n}\\\n.ace-tm .ace_keyword.ace_operator {\\\ncolor: rgb(104, 118, 135);\\\n}\\\n.ace-tm .ace_string {\\\ncolor: rgb(3, 106, 7);\\\n}\\\n.ace-tm .ace_comment {\\\ncolor: rgb(76, 136, 107);\\\n}\\\n.ace-tm .ace_comment.ace_doc {\\\ncolor: rgb(0, 102, 255);\\\n}\\\n.ace-tm .ace_comment.ace_doc.ace_tag {\\\ncolor: rgb(128, 159, 191);\\\n}\\\n.ace-tm .ace_constant.ace_numeric {\\\ncolor: rgb(0, 0, 205);\\\n}\\\n.ace-tm .ace_variable {\\\ncolor: rgb(49, 132, 149);\\\n}\\\n.ace-tm .ace_xml-pe {\\\ncolor: rgb(104, 104, 91);\\\n}\\\n.ace-tm .ace_entity.ace_name.ace_function {\\\ncolor: #0000A2;\\\n}\\\n.ace-tm .ace_heading {\\\ncolor: rgb(12, 7, 255);\\\n}\\\n.ace-tm .ace_list {\\\ncolor:rgb(185, 6, 144);\\\n}\\\n.ace-tm .ace_meta.ace_tag {\\\ncolor:rgb(0, 22, 142);\\\n}\\\n.ace-tm .ace_string.ace_regex {\\\ncolor: rgb(255, 0, 0)\\\n}\\\n.ace-tm .ace_marker-layer .ace_selection {\\\nbackground: rgb(181, 213, 255);\\\n}\\\n.ace-tm.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px white;\\\nborder-radius: 2px;\\\n}\\\n.ace-tm .ace_marker-layer .ace_step {\\\nbackground: rgb(252, 255, 0);\\\n}\\\n.ace-tm .ace_marker-layer .ace_stack {\\\nbackground: rgb(164, 229, 101);\\\n}\\\n.ace-tm .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgb(192, 192, 192);\\\n}\\\n.ace-tm .ace_marker-layer .ace_active-line {\\\nbackground: rgba(0, 0, 0, 0.07);\\\n}\\\n.ace-tm .ace_gutter-active-line {\\\nbackground-color : #dcdcdc;\\\n}\\\n.ace-tm .ace_marker-layer .ace_selected-word {\\\nbackground: rgb(250, 250, 255);\\\nborder: 1px solid rgb(200, 200, 250);\\\n}\\\n.ace-tm .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\\\n\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n\nace.define(\"ace/line_widgets\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/dom\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar dom = require(\"./lib/dom\");\nvar Range = require(\"./range\").Range;\n\n\nfunction LineWidgets(session) {\n    this.session = session;\n    this.session.widgetManager = this;\n    this.session.getRowLength = this.getRowLength;\n    this.session.$getWidgetScreenLength = this.$getWidgetScreenLength;\n    this.updateOnChange = this.updateOnChange.bind(this);\n    this.renderWidgets = this.renderWidgets.bind(this);\n    this.measureWidgets = this.measureWidgets.bind(this);\n    this.session._changedWidgets = [];\n    this.$onChangeEditor = this.$onChangeEditor.bind(this);\n    \n    this.session.on(\"change\", this.updateOnChange);\n    this.session.on(\"changeEditor\", this.$onChangeEditor);\n}\n\n(function() {\n    this.getRowLength = function(row) {\n        var h;\n        if (this.lineWidgets)\n            h = this.lineWidgets[row] && this.lineWidgets[row].rowCount || 0;\n        else \n            h = 0;\n        if (!this.$useWrapMode || !this.$wrapData[row]) {\n            return 1 + h;\n        } else {\n            return this.$wrapData[row].length + 1 + h;\n        }\n    };\n\n    this.$getWidgetScreenLength = function() {\n        var screenRows = 0;\n        this.lineWidgets.forEach(function(w){\n            if (w && w.rowCount)\n                screenRows +=w.rowCount;\n        });\n        return screenRows;\n    };    \n    \n    this.$onChangeEditor = function(e) {\n        this.attach(e.editor);\n    };\n    \n    this.attach = function(editor) {\n        if (editor  && editor.widgetManager && editor.widgetManager != this)\n            editor.widgetManager.detach();\n\n        if (this.editor == editor)\n            return;\n\n        this.detach();\n        this.editor = editor;\n        \n        if (editor) {\n            editor.widgetManager = this;\n            editor.renderer.on(\"beforeRender\", this.measureWidgets);\n            editor.renderer.on(\"afterRender\", this.renderWidgets);\n        }\n    };\n    this.detach = function(e) {\n        var editor = this.editor;\n        if (!editor)\n            return;\n        \n        this.editor = null;\n        editor.widgetManager = null;\n        \n        editor.renderer.off(\"beforeRender\", this.measureWidgets);\n        editor.renderer.off(\"afterRender\", this.renderWidgets);\n        var lineWidgets = this.session.lineWidgets;\n        lineWidgets && lineWidgets.forEach(function(w) {\n            if (w && w.el && w.el.parentNode) {\n                w._inDocument = false;\n                w.el.parentNode.removeChild(w.el);\n            }\n        });\n    };\n\n    this.updateOnChange = function(e) {\n        var lineWidgets = this.session.lineWidgets;\n        if (!lineWidgets) return;\n            \n        var delta = e.data;\n        var range = delta.range;\n        var startRow = range.start.row;\n        var len = range.end.row - startRow;\n\n        if (len === 0) {\n        } else if (delta.action == \"removeText\" || delta.action == \"removeLines\") {\n            var removed = lineWidgets.splice(startRow + 1, len);\n            removed.forEach(function(w) {\n                w && this.removeLineWidget(w);\n            }, this);\n            this.$updateRows();\n        } else {\n            var args = new Array(len);\n            args.unshift(startRow, 0);\n            lineWidgets.splice.apply(lineWidgets, args);\n            this.$updateRows();\n        }\n    };\n    \n    this.$updateRows = function() {\n        var lineWidgets = this.session.lineWidgets;\n        if (!lineWidgets) return;\n        var noWidgets = true;\n        lineWidgets.forEach(function(w, i) {\n            if (w) {\n                noWidgets = false;\n                w.row = i;\n            }\n        });\n        if (noWidgets)\n            this.session.lineWidgets = null;\n    };\n\n    this.addLineWidget = function(w) {\n        if (!this.session.lineWidgets)\n            this.session.lineWidgets = new Array(this.session.getLength());\n        \n        this.session.lineWidgets[w.row] = w;\n        \n        var renderer = this.editor.renderer;\n        if (w.html && !w.el) {\n            w.el = dom.createElement(\"div\");\n            w.el.innerHTML = w.html;\n        }\n        if (w.el) {\n            dom.addCssClass(w.el, \"ace_lineWidgetContainer\");\n            w.el.style.position = \"absolute\";\n            w.el.style.zIndex = 5;\n            renderer.container.appendChild(w.el);\n            w._inDocument = true;\n        }\n        \n        if (!w.coverGutter) {\n            w.el.style.zIndex = 3;\n        }\n        if (!w.pixelHeight) {\n            w.pixelHeight = w.el.offsetHeight;\n        }\n        if (w.rowCount == null)\n            w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight;\n        \n        this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n        \n        this.$updateRows();\n        this.renderWidgets(null, renderer);\n        return w;\n    };\n    \n    this.removeLineWidget = function(w) {\n        w._inDocument = false;\n        if (w.el && w.el.parentNode)\n            w.el.parentNode.removeChild(w.el);\n        if (w.editor && w.editor.destroy) try {\n            w.editor.destroy();\n        } catch(e){}\n        if (this.session.lineWidgets)\n            this.session.lineWidgets[w.row] = undefined;\n        this.session._emit(\"changeFold\", {data:{start:{row: w.row}}});\n        this.$updateRows();\n    };\n    \n    this.onWidgetChanged = function(w) {\n        this.session._changedWidgets.push(w);\n        this.editor && this.editor.renderer.updateFull();\n    };\n    \n    this.measureWidgets = function(e, renderer) {\n        var changedWidgets = this.session._changedWidgets;\n        var config = renderer.layerConfig;\n        \n        if (!changedWidgets || !changedWidgets.length) return;\n        var min = Infinity;\n        for (var i = 0; i < changedWidgets.length; i++) {\n            var w = changedWidgets[i];\n            if (!w._inDocument) {\n                w._inDocument = true;\n                renderer.container.appendChild(w.el);\n            }\n            \n            w.h = w.el.offsetHeight;\n            \n            if (!w.fixedWidth) {\n                w.w = w.el.offsetWidth;\n                w.screenWidth = Math.ceil(w.w / config.characterWidth);\n            }\n            \n            var rowCount = w.h / config.lineHeight;\n            if (w.coverLine) {\n                rowCount -= this.session.getRowLineCount(w.row);\n                if (rowCount < 0)\n                    rowCount = 0;\n            }\n            if (w.rowCount != rowCount) {\n                w.rowCount = rowCount;\n                if (w.row < min)\n                    min = w.row;\n            }\n        }\n        if (min != Infinity) {\n            this.session._emit(\"changeFold\", {data:{start:{row: min}}});\n            this.session.lineWidgetWidth = null;\n        }\n        this.session._changedWidgets = [];\n    };\n    \n    this.renderWidgets = function(e, renderer) {\n        var config = renderer.layerConfig;\n        var lineWidgets = this.session.lineWidgets;\n        if (!lineWidgets)\n            return;\n        var first = Math.min(this.firstRow, config.firstRow);\n        var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length);\n        \n        while (first > 0 && !lineWidgets[first])\n            first--;\n        \n        this.firstRow = config.firstRow;\n        this.lastRow = config.lastRow;\n\n        renderer.$cursorLayer.config = config;\n        for (var i = first; i <= last; i++) {\n            var w = lineWidgets[i];\n            if (!w || !w.el) continue;\n\n            if (!w._inDocument) {\n                w._inDocument = true;\n                renderer.container.appendChild(w.el);\n            }\n            var top = renderer.$cursorLayer.getPixelPosition({row: i, column:0}, true).top;\n            if (!w.coverLine)\n                top += config.lineHeight * this.session.getRowLineCount(w.row);\n            w.el.style.top = top - config.offset + \"px\";\n            \n            var left = w.coverGutter ? 0 : renderer.gutterWidth;\n            if (!w.fixedWidth)\n                left -= renderer.scrollLeft;\n            w.el.style.left = left + \"px\";\n\n            if (w.fixedWidth) {\n                w.el.style.right = renderer.scrollBar.getWidth() + \"px\";\n            } else {\n                w.el.style.right = \"\";\n            }\n        }\n    };\n    \n}).call(LineWidgets.prototype);\n\n\nexports.LineWidgets = LineWidgets;\n\n});\n\nace.define(\"ace/ext/error_marker\",[\"require\",\"exports\",\"module\",\"ace/line_widgets\",\"ace/lib/dom\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\nvar LineWidgets = require(\"../line_widgets\").LineWidgets;\nvar dom = require(\"../lib/dom\");\nvar Range = require(\"../range\").Range;\n\nfunction binarySearch(array, needle, comparator) {\n    var first = 0;\n    var last = array.length - 1;\n\n    while (first <= last) {\n        var mid = (first + last) >> 1;\n        var c = comparator(needle, array[mid]);\n        if (c > 0)\n            first = mid + 1;\n        else if (c < 0)\n            last = mid - 1;\n        else\n            return mid;\n    }\n    return -(first + 1);\n}\n\nfunction findAnnotations(session, row, dir) {\n    var annotations = session.getAnnotations().sort(Range.comparePoints);\n    if (!annotations.length)\n        return;\n    \n    var i = binarySearch(annotations, {row: row, column: -1}, Range.comparePoints);\n    if (i < 0)\n        i = -i - 1;\n    \n    if (i >= annotations.length - 1)\n        i = dir > 0 ? 0 : annotations.length - 1;\n    else if (i === 0 && dir < 0)\n        i = annotations.length - 1;\n    \n    var annotation = annotations[i];\n    if (!annotation || !dir)\n        return;\n\n    if (annotation.row === row) {\n        do {\n            annotation = annotations[i += dir];\n        } while (annotation && annotation.row === row);\n        if (!annotation)\n            return annotations.slice();\n    }\n    \n    \n    var matched = [];\n    row = annotation.row;\n    do {\n        matched[dir < 0 ? \"unshift\" : \"push\"](annotation);\n        annotation = annotations[i += dir];\n    } while (annotation && annotation.row == row);\n    return matched.length && matched;\n}\n\nexports.showErrorMarker = function(editor, dir) {\n    var session = editor.session;\n    if (!session.widgetManager) {\n        session.widgetManager = new LineWidgets(session);\n        session.widgetManager.attach(editor);\n    }\n    \n    var pos = editor.getCursorPosition();\n    var row = pos.row;\n    var oldWidget = session.lineWidgets && session.lineWidgets[row];\n    if (oldWidget) {\n        oldWidget.destroy();\n    } else {\n        row -= dir;\n    }\n    var annotations = findAnnotations(session, row, dir);\n    var gutterAnno;\n    if (annotations) {\n        var annotation = annotations[0];\n        pos.column = (annotation.pos && typeof annotation.column != \"number\"\n            ? annotation.pos.sc\n            : annotation.column) || 0;\n        pos.row = annotation.row;\n        gutterAnno = editor.renderer.$gutterLayer.$annotations[pos.row];\n    } else if (oldWidget) {\n        return;\n    } else {\n        gutterAnno = {\n            text: [\"Looks good!\"],\n            className: \"ace_ok\"\n        };\n    }\n    editor.session.unfold(pos.row);\n    editor.selection.moveToPosition(pos);\n    \n    var w = {\n        row: pos.row, \n        fixedWidth: true,\n        coverGutter: true,\n        el: dom.createElement(\"div\")\n    };\n    var el = w.el.appendChild(dom.createElement(\"div\"));\n    var arrow = w.el.appendChild(dom.createElement(\"div\"));\n    arrow.className = \"error_widget_arrow \" + gutterAnno.className;\n    \n    var left = editor.renderer.$cursorLayer\n        .getPixelPosition(pos).left;\n    arrow.style.left = left + editor.renderer.gutterWidth - 5 + \"px\";\n    \n    w.el.className = \"error_widget_wrapper\";\n    el.className = \"error_widget \" + gutterAnno.className;\n    el.innerHTML = gutterAnno.text.join(\"<br>\");\n    \n    el.appendChild(dom.createElement(\"div\"));\n    \n    var kb = function(_, hashId, keyString) {\n        if (hashId === 0 && (keyString === \"esc\" || keyString === \"return\")) {\n            w.destroy();\n            return {command: \"null\"};\n        }\n    };\n    \n    w.destroy = function() {\n        if (editor.$mouseHandler.isMousePressed)\n            return;\n        editor.keyBinding.removeKeyboardHandler(kb);\n        session.widgetManager.removeLineWidget(w);\n        editor.off(\"changeSelection\", w.destroy);\n        editor.off(\"changeSession\", w.destroy);\n        editor.off(\"mouseup\", w.destroy);\n        editor.off(\"change\", w.destroy);\n    };\n    \n    editor.keyBinding.addKeyboardHandler(kb);\n    editor.on(\"changeSelection\", w.destroy);\n    editor.on(\"changeSession\", w.destroy);\n    editor.on(\"mouseup\", w.destroy);\n    editor.on(\"change\", w.destroy);\n    \n    editor.session.widgetManager.addLineWidget(w);\n    \n    w.el.onmousedown = editor.focus.bind(editor);\n    \n    editor.renderer.scrollCursorIntoView(null, 0.5, {bottom: w.el.offsetHeight});\n};\n\n\ndom.importCssString(\"\\\n    .error_widget_wrapper {\\\n        background: inherit;\\\n        color: inherit;\\\n        border:none\\\n    }\\\n    .error_widget {\\\n        border-top: solid 2px;\\\n        border-bottom: solid 2px;\\\n        margin: 5px 0;\\\n        padding: 10px 40px;\\\n        white-space: pre-wrap;\\\n    }\\\n    .error_widget.ace_error, .error_widget_arrow.ace_error{\\\n        border-color: #ff5a5a\\\n    }\\\n    .error_widget.ace_warning, .error_widget_arrow.ace_warning{\\\n        border-color: #F1D817\\\n    }\\\n    .error_widget.ace_info, .error_widget_arrow.ace_info{\\\n        border-color: #5a5a5a\\\n    }\\\n    .error_widget.ace_ok, .error_widget_arrow.ace_ok{\\\n        border-color: #5aaa5a\\\n    }\\\n    .error_widget_arrow {\\\n        position: absolute;\\\n        border: solid 5px;\\\n        border-top-color: transparent!important;\\\n        border-right-color: transparent!important;\\\n        border-left-color: transparent!important;\\\n        top: -5px;\\\n    }\\\n\", \"\");\n\n});\n\nace.define(\"ace/ace\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/editor\",\"ace/edit_session\",\"ace/undomanager\",\"ace/virtual_renderer\",\"ace/worker/worker_client\",\"ace/keyboard/hash_handler\",\"ace/placeholder\",\"ace/multi_select\",\"ace/mode/folding/fold_mode\",\"ace/theme/textmate\",\"ace/ext/error_marker\",\"ace/config\"], function(require, exports, module) {\n\"use strict\";\n\nrequire(\"./lib/fixoldbrowsers\");\n\nvar dom = require(\"./lib/dom\");\nvar event = require(\"./lib/event\");\n\nvar Editor = require(\"./editor\").Editor;\nvar EditSession = require(\"./edit_session\").EditSession;\nvar UndoManager = require(\"./undomanager\").UndoManager;\nvar Renderer = require(\"./virtual_renderer\").VirtualRenderer;\nrequire(\"./worker/worker_client\");\nrequire(\"./keyboard/hash_handler\");\nrequire(\"./placeholder\");\nrequire(\"./multi_select\");\nrequire(\"./mode/folding/fold_mode\");\nrequire(\"./theme/textmate\");\nrequire(\"./ext/error_marker\");\n\nexports.config = require(\"./config\");\nexports.require = require;\nexports.edit = function(el) {\n    if (typeof(el) == \"string\") {\n        var _id = el;\n        el = document.getElementById(_id);\n        if (!el)\n            throw new Error(\"ace.edit can't find div #\" + _id);\n    }\n\n    if (el && el.env && el.env.editor instanceof Editor)\n        return el.env.editor;\n\n    var value = \"\";\n    if (el && /input|textarea/i.test(el.tagName)) {\n        var oldNode = el;\n        value = oldNode.value;\n        el = dom.createElement(\"pre\");\n        oldNode.parentNode.replaceChild(el, oldNode);\n    } else {\n        value = dom.getInnerText(el);\n        el.innerHTML = '';\n    }\n\n    var doc = exports.createEditSession(value);\n\n    var editor = new Editor(new Renderer(el));\n    editor.setSession(doc);\n\n    var env = {\n        document: doc,\n        editor: editor,\n        onResize: editor.resize.bind(editor, null)\n    };\n    if (oldNode) env.textarea = oldNode;\n    event.addListener(window, \"resize\", env.onResize);\n    editor.on(\"destroy\", function() {\n        event.removeListener(window, \"resize\", env.onResize);\n        env.editor.container.env = null; // prevent memory leak on old ie\n    });\n    editor.container.env = editor.env = env;\n    return editor;\n};\nexports.createEditSession = function(text, mode) {\n    var doc = new EditSession(text, mode);\n    doc.setUndoManager(new UndoManager());\n    return doc;\n}\nexports.EditSession = EditSession;\nexports.UndoManager = UndoManager;\n});\n            (function() {\n                ace.require([\"ace/ace\"], function(a) {\n                    a && a.config.init(true);\n                    if (!window.ace)\n                        window.ace = a;\n                    for (var key in a) if (a.hasOwnProperty(key))\n                        window.ace[key] = a[key];\n                });\n            })();\n        "
  },
  {
    "path": "browser/plugins/ace/src-noconflict/ext-beautify.js",
    "content": "ace.define(\"ace/ext/beautify/php_rules\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\nvar TokenIterator = require(\"ace/token_iterator\").TokenIterator;\nexports.newLines = [{\n    type: 'support.php_tag',\n    value: '<?php'\n}, {\n    type: 'support.php_tag',\n    value: '<?'\n}, {\n    type: 'support.php_tag',\n    value: '?>'\n}, {\n    type: 'paren.lparen',\n    value: '{',\n    indent: true\n}, {\n    type: 'paren.rparen',\n    breakBefore: true,\n    value: '}',\n    indent: false\n}, {\n    type: 'paren.rparen',\n    breakBefore: true,\n    value: '})',\n    indent: false,\n    dontBreak: true\n}, {\n    type: 'comment'\n}, {\n    type: 'text',\n    value: ';'\n}, {\n    type: 'text',\n    value: ':',\n    context: 'php'\n}, {\n    type: 'keyword',\n    value: 'case',\n    indent: true,\n    dontBreak: true\n}, {\n    type: 'keyword',\n    value: 'default',\n    indent: true,\n    dontBreak: true\n}, {\n    type: 'keyword',\n    value: 'break',\n    indent: false,\n    dontBreak: true\n}, {\n    type: 'punctuation.doctype.end',\n    value: '>'\n}, {\n    type: 'meta.tag.punctuation.end',\n    value: '>'\n}, {\n    type: 'meta.tag.punctuation.begin',\n    value: '<',\n    blockTag: true,\n    indent: true,\n    dontBreak: true\n}, {\n    type: 'meta.tag.punctuation.begin',\n    value: '</',\n    indent: false,\n    breakBefore: true,\n    dontBreak: true\n}, {\n    type: 'punctuation.operator',\n    value: ';'\n}];\n\nexports.spaces = [{\n    type: 'xml-pe',\n    prepend: true\n},{\n    type: 'entity.other.attribute-name',\n    prepend: true\n}, {\n    type: 'storage.type',\n    value: 'var',\n    append: true\n}, {\n    type: 'storage.type',\n    value: 'function',\n    append: true\n}, {\n    type: 'keyword.operator',\n    value: '='\n}, {\n    type: 'keyword',\n    value: 'as',\n    prepend: true,\n    append: true\n}, {\n    type: 'keyword',\n    value: 'function',\n    append: true\n}, {\n    type: 'support.function',\n    next: /[^\\(]/,\n    append: true\n}, {\n    type: 'keyword',\n    value: 'or',\n    append: true,\n    prepend: true\n}, {\n    type: 'keyword',\n    value: 'and',\n    append: true,\n    prepend: true\n}, {\n    type: 'keyword',\n    value: 'case',\n    append: true\n}, {\n    type: 'keyword.operator',\n    value: '||',\n    append: true,\n    prepend: true\n}, {\n    type: 'keyword.operator',\n    value: '&&',\n    append: true,\n    prepend: true\n}];\nexports.singleTags = ['!doctype','area','base','br','hr','input','img','link','meta'];\n\nexports.transform = function(iterator, maxPos, context) {\n    var token = iterator.getCurrentToken();\n    \n    var newLines = exports.newLines;\n    var spaces = exports.spaces;\n    var singleTags = exports.singleTags;\n\n    var code = '';\n    \n    var indentation = 0;\n    var dontBreak = false;\n    var tag;\n    var lastTag;\n    var lastToken = {};\n    var nextTag;\n    var nextToken = {};\n    var breakAdded = false;\n    var value = '';\n\n    while (token!==null) {\n        console.log(token);\n\n        if( !token ){\n            token = iterator.stepForward();\n            continue;\n        }\n        if( token.type == 'support.php_tag' && token.value != '?>' ){\n            context = 'php';\n        }\n        else if( token.type == 'support.php_tag' && token.value == '?>' ){\n            context = 'html';\n        }\n        else if( token.type == 'meta.tag.name.style' && context != 'css' ){\n            context = 'css';\n        }\n        else if( token.type == 'meta.tag.name.style' && context == 'css' ){\n            context = 'html';\n        }\n        else if( token.type == 'meta.tag.name.script' && context != 'js' ){\n            context = 'js';\n        }\n        else if( token.type == 'meta.tag.name.script' && context == 'js' ){\n            context = 'html';\n        }\n\n        nextToken = iterator.stepForward();\n        if (nextToken && nextToken.type.indexOf('meta.tag.name') == 0) {\n            nextTag = nextToken.value;\n        }\n        if ( lastToken.type == 'support.php_tag' && lastToken.value == '<?=') {\n            dontBreak = true;\n        }\n        if (token.type == 'meta.tag.name') {\n            token.value = token.value.toLowerCase();\n        }\n        if (token.type == 'text') {\n            token.value = token.value.trim();\n        }\n        if (!token.value) {\n            token = nextToken;\n            continue;\n        }\n        value = token.value;\n        for (var i in spaces) {\n            if (\n                token.type == spaces[i].type &&\n                (!spaces[i].value || token.value == spaces[i].value) &&\n                (\n                    nextToken &&\n                    (!spaces[i].next || spaces[i].next.test(nextToken.value))\n                )\n            ) {\n                if (spaces[i].prepend) {\n                    value = ' ' + token.value;\n                }\n\n                if (spaces[i].append) {\n                    value += ' ';\n                }\n            }\n        }\n        if (token.type.indexOf('meta.tag.name') == 0) {\n            tag = token.value;\n        }\n        breakAdded = false;\n        for (i in newLines) {\n            if (\n                token.type == newLines[i].type &&\n                (\n                    !newLines[i].value ||\n                    token.value == newLines[i].value\n                ) &&\n                (\n                    !newLines[i].blockTag ||\n                    singleTags.indexOf(nextTag) === -1\n                ) &&\n                (\n                    !newLines[i].context ||\n                    newLines[i].context === context\n                )\n            ) {\n                if (newLines[i].indent === false) {\n                    indentation--;\n                }\n\n                if (\n                    newLines[i].breakBefore &&\n                    ( !newLines[i].prev || newLines[i].prev.test(lastToken.value) )\n                ) {\n                    code += \"\\n\";\n                    breakAdded = true;\n                    for (i = 0; i < indentation; i++) {\n                        code += \"\\t\";\n                    }\n                }\n\n                break;\n            }\n        }\n\n        if (dontBreak===false) {\n            for (i in newLines) {\n                if (\n                    lastToken.type == newLines[i].type &&\n                    (\n                        !newLines[i].value || lastToken.value == newLines[i].value\n                    ) &&\n                    (\n                        !newLines[i].blockTag ||\n                        singleTags.indexOf(tag) === -1\n                    ) &&\n                    (\n                        !newLines[i].context ||\n                        newLines[i].context === context\n                    )\n                ) {\n                    if (newLines[i].indent === true) {\n                        indentation++;\n                    }\n\n                    if (!newLines[i].dontBreak  && !breakAdded) {\n                        code += \"\\n\";\n                        for (i = 0; i < indentation; i++) {\n                            code += \"\\t\";\n                        }\n                    }\n\n                    break;\n                }\n            }\n        }\n\n        code += value;\n        if ( lastToken.type == 'support.php_tag' && lastToken.value == '?>' ) {\n            dontBreak = false;\n        }\n        lastTag = tag;\n\n        lastToken = token;\n\n        token = nextToken;\n\n        if (token===null) {\n            break;\n        }\n    }\n    \n    return code;\n};\n\n\n\n});\n\nace.define(\"ace/ext/beautify\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\",\"ace/ext/beautify/php_rules\"], function(require, exports, module) {\n\"use strict\";\nvar TokenIterator = require(\"ace/token_iterator\").TokenIterator;\n\nvar phpTransform = require(\"./beautify/php_rules\").transform;\n\nexports.beautify = function(session) {\n    var iterator = new TokenIterator(session, 0, 0);\n    var token = iterator.getCurrentToken();\n\n    var context = session.$modeId.split(\"/\").pop();\n\n    var code = phpTransform(iterator, context);\n    session.doc.setValue(code);\n};\n\nexports.commands = [{\n    name: \"beautify\",\n    exec: function(editor) {\n        exports.beautify(editor.session);\n    },\n    bindKey: \"Ctrl-Shift-B\"\n}]\n\n});\n                (function() {\n                    ace.require([\"ace/ext/beautify\"], function() {});\n                })();\n            "
  },
  {
    "path": "browser/plugins/ace/src-noconflict/ext-chromevox.js",
    "content": "ace.define(\"ace/ext/chromevox\",[\"require\",\"exports\",\"module\",\"ace/editor\",\"ace/config\"], function(require, exports, module) {\nvar cvoxAce = {};\ncvoxAce.SpeechProperty;\ncvoxAce.Cursor;\ncvoxAce.Token;\ncvoxAce.Annotation;\nvar CONSTANT_PROP = {\n  'rate': 0.8,\n  'pitch': 0.4,\n  'volume': 0.9\n};\nvar DEFAULT_PROP = {\n  'rate': 1,\n  'pitch': 0.5,\n  'volume': 0.9\n};\nvar ENTITY_PROP = {\n  'rate': 0.8,\n  'pitch': 0.8,\n  'volume': 0.9\n};\nvar KEYWORD_PROP = {\n  'rate': 0.8,\n  'pitch': 0.3,\n  'volume': 0.9\n};\nvar STORAGE_PROP = {\n  'rate': 0.8,\n  'pitch': 0.7,\n  'volume': 0.9\n};\nvar VARIABLE_PROP = {\n  'rate': 0.8,\n  'pitch': 0.8,\n  'volume': 0.9\n};\nvar DELETED_PROP = {\n  'punctuationEcho': 'none',\n  'relativePitch': -0.6\n};\nvar ERROR_EARCON = 'ALERT_NONMODAL';\nvar MODE_SWITCH_EARCON = 'ALERT_MODAL';\nvar NO_MATCH_EARCON = 'INVALID_KEYPRESS';\nvar INSERT_MODE_STATE = 'insertMode';\nvar COMMAND_MODE_STATE = 'start';\n\nvar REPLACE_LIST = [\n  {\n    substr: ';',\n    newSubstr: ' semicolon '\n  },\n  {\n    substr: ':',\n    newSubstr: ' colon '\n  }\n];\nvar Command = {\n  SPEAK_ANNOT: 'annots',\n  SPEAK_ALL_ANNOTS: 'all_annots',\n  TOGGLE_LOCATION: 'toggle_location',\n  SPEAK_MODE: 'mode',\n  SPEAK_ROW_COL: 'row_col',\n  TOGGLE_DISPLACEMENT: 'toggle_displacement',\n  FOCUS_TEXT: 'focus_text'\n};\nvar KEY_PREFIX = 'CONTROL + SHIFT ';\ncvoxAce.editor = null;\nvar lastCursor = null;\nvar annotTable = {};\nvar shouldSpeakRowLocation = false;\nvar shouldSpeakDisplacement = false;\nvar changed = false;\nvar vimState = null;\nvar keyCodeToShortcutMap = {};\nvar cmdToShortcutMap = {};\nvar getKeyShortcutString = function(keyCode) {\n  return KEY_PREFIX + String.fromCharCode(keyCode);\n};\nvar isVimMode = function() {\n  var keyboardHandler = cvoxAce.editor.keyBinding.getKeyboardHandler();\n  return keyboardHandler.$id === 'ace/keyboard/vim';\n};\nvar getCurrentToken = function(cursor) {\n  return cvoxAce.editor.getSession().getTokenAt(cursor.row, cursor.column + 1);\n};\nvar getCurrentLine = function(cursor) {\n  return cvoxAce.editor.getSession().getLine(cursor.row);\n};\nvar onRowChange = function(currCursor) {\n  if (annotTable[currCursor.row]) {\n    cvox.Api.playEarcon(ERROR_EARCON);\n  }\n  if (shouldSpeakRowLocation) {\n    cvox.Api.stop();\n    speakChar(currCursor);\n    speakTokenQueue(getCurrentToken(currCursor));\n    speakLine(currCursor.row, 1);\n  } else {\n    speakLine(currCursor.row, 0);\n  }\n};\nvar isWord = function(cursor) {\n  var line = getCurrentLine(cursor);\n  var lineSuffix = line.substr(cursor.column - 1);\n  if (cursor.column === 0) {\n    lineSuffix = ' ' + line;\n  }\n  var firstWordRegExp = /^\\W(\\w+)/;\n  var words = firstWordRegExp.exec(lineSuffix);\n  return words !== null;\n};\nvar rules = {\n  'constant': {\n    prop: CONSTANT_PROP\n  },\n  'entity': {\n    prop: ENTITY_PROP\n  },\n  'keyword': {\n    prop: KEYWORD_PROP\n  },\n  'storage': {\n    prop: STORAGE_PROP\n  },\n  'variable': {\n    prop: VARIABLE_PROP\n  },\n  'meta': {\n    prop: DEFAULT_PROP,\n    replace: [\n      {\n        substr: '</',\n        newSubstr: ' closing tag '\n      },\n      {\n        substr: '/>',\n        newSubstr: ' close tag '\n      },\n      {\n        substr: '<',\n        newSubstr: ' tag start '\n      },\n      {\n        substr: '>',\n        newSubstr: ' tag end '\n      }\n    ]\n  }\n};\nvar DEFAULT_RULE = {\n  prop: DEFAULT_RULE\n};\nvar expand = function(value, replaceRules) {\n  var newValue = value;\n  for (var i = 0; i < replaceRules.length; i++) {\n    var replaceRule = replaceRules[i];\n    var regexp = new RegExp(replaceRule.substr, 'g');\n    newValue = newValue.replace(regexp, replaceRule.newSubstr);\n  }\n  return newValue;\n};\nvar mergeTokens = function(tokens, start, end) {\n  var newToken = {};\n  newToken.value = '';\n  newToken.type = tokens[start].type;\n  for (var j = start; j < end; j++) {\n    newToken.value += tokens[j].value;\n  }\n  return newToken;\n};\nvar mergeLikeTokens = function(tokens) {\n  if (tokens.length <= 1) {\n    return tokens;\n  }\n  var newTokens = [];\n  var lastLikeIndex = 0;\n  for (var i = 1; i < tokens.length; i++) {\n    var lastLikeToken = tokens[lastLikeIndex];\n    var currToken = tokens[i];\n    if (getTokenRule(lastLikeToken) !== getTokenRule(currToken)) {\n      newTokens.push(mergeTokens(tokens, lastLikeIndex, i));\n      lastLikeIndex = i;\n    }\n  }\n  newTokens.push(mergeTokens(tokens, lastLikeIndex, tokens.length));\n  return newTokens;\n};\nvar isRowWhiteSpace = function(row) {\n  var line = cvoxAce.editor.getSession().getLine(row);\n  var whiteSpaceRegexp = /^\\s*$/;\n  return whiteSpaceRegexp.exec(line) !== null;\n};\nvar speakLine = function(row, queue) {\n  var tokens = cvoxAce.editor.getSession().getTokens(row);\n  if (tokens.length === 0 || isRowWhiteSpace(row)) {\n    cvox.Api.playEarcon('EDITABLE_TEXT');\n    return;\n  }\n  tokens = mergeLikeTokens(tokens);\n  var firstToken = tokens[0];\n  tokens = tokens.filter(function(token) {\n    return token !== firstToken;\n  });\n  speakToken_(firstToken, queue);\n  tokens.forEach(speakTokenQueue);\n};\nvar speakTokenFlush = function(token) {\n  speakToken_(token, 0);\n};\nvar speakTokenQueue = function(token) {\n  speakToken_(token, 1);\n};\nvar getTokenRule = function(token) {\n  if (!token || !token.type) {\n    return;\n  }\n  var split = token.type.split('.');\n  if (split.length === 0) {\n    return;\n  }\n  var type = split[0];\n  var rule = rules[type];\n  if (!rule) {\n    return DEFAULT_RULE;\n  }\n  return rule;\n};\nvar speakToken_ = function(token, queue) {\n  var rule = getTokenRule(token);\n  var value = expand(token.value, REPLACE_LIST);\n  if (rule.replace) {\n    value = expand(value, rule.replace);\n  }\n  cvox.Api.speak(value, queue, rule.prop);\n};\nvar speakChar = function(cursor) {\n  var line = getCurrentLine(cursor);\n  cvox.Api.speak(line[cursor.column], 1);\n};\nvar speakDisplacement = function(lastCursor, currCursor) {\n  var line = getCurrentLine(currCursor);\n  var displace = line.substring(lastCursor.column, currCursor.column);\n  displace = displace.replace(/ /g, ' space ');\n  cvox.Api.speak(displace);\n};\nvar speakCharOrWordOrLine = function(lastCursor, currCursor) {\n  if (Math.abs(lastCursor.column - currCursor.column) !== 1) {\n    var currLineLength = getCurrentLine(currCursor).length;\n    if (currCursor.column === 0 || currCursor.column === currLineLength) {\n      speakLine(currCursor.row, 0);\n      return;\n    }\n    if (isWord(currCursor)) {\n      cvox.Api.stop();\n      speakTokenQueue(getCurrentToken(currCursor));\n      return;\n    }\n  }\n  speakChar(currCursor);\n};\nvar onColumnChange = function(lastCursor, currCursor) {\n  if (!cvoxAce.editor.selection.isEmpty()) {\n    speakDisplacement(lastCursor, currCursor);\n    cvox.Api.speak('selected', 1);\n  }\n  else if (shouldSpeakDisplacement) {\n    speakDisplacement(lastCursor, currCursor);\n  } else {\n    speakCharOrWordOrLine(lastCursor, currCursor);\n  }\n};\nvar onCursorChange = function(evt) {\n  if (changed) {\n    changed = false;\n    return;\n  }\n  var currCursor = cvoxAce.editor.selection.getCursor();\n  if (currCursor.row !== lastCursor.row) {\n    onRowChange(currCursor);\n  } else {\n    onColumnChange(lastCursor, currCursor);\n  }\n  lastCursor = currCursor;\n};\nvar onSelectionChange = function(evt) {\n  if (cvoxAce.editor.selection.isEmpty()) {\n    cvox.Api.speak('unselected');\n  }\n};\nvar onChange = function(evt) {\n  var data = evt.data;\n  switch (data.action) {\n  case 'removeText':\n    cvox.Api.speak(data.text, 0, DELETED_PROP);\n    changed = true;\n    break;\n  case 'insertText':\n    cvox.Api.speak(data.text, 0);\n    changed = true;\n    break;\n  }\n};\nvar isNewAnnotation = function(annot) {\n  var row = annot.row;\n  var col = annot.column;\n  return !annotTable[row] || !annotTable[row][col];\n};\nvar populateAnnotations = function(annotations) {\n  annotTable = {};\n  for (var i = 0; i < annotations.length; i++) {\n    var annotation = annotations[i];\n    var row = annotation.row;\n    var col = annotation.column;\n    if (!annotTable[row]) {\n      annotTable[row] = {};\n    }\n    annotTable[row][col] = annotation;\n  }\n};\nvar onAnnotationChange = function(evt) {\n  var annotations = cvoxAce.editor.getSession().getAnnotations();\n  var newAnnotations = annotations.filter(isNewAnnotation);\n  if (newAnnotations.length > 0) {\n    cvox.Api.playEarcon(ERROR_EARCON);\n  }\n  populateAnnotations(annotations);\n};\nvar speakAnnot = function(annot) {\n  var annotText = annot.type + ' ' + annot.text + ' on ' +\n      rowColToString(annot.row, annot.column);\n  annotText = annotText.replace(';', 'semicolon');\n  cvox.Api.speak(annotText, 1);\n};\nvar speakAnnotsByRow = function(row) {\n  var annots = annotTable[row];\n  for (var col in annots) {\n    speakAnnot(annots[col]);\n  }\n};\nvar rowColToString = function(row, col) {\n  return 'row ' + (row + 1) + ' column ' + (col + 1);\n};\nvar speakCurrRowAndCol = function() {\n  cvox.Api.speak(rowColToString(lastCursor.row, lastCursor.column));\n};\nvar speakAllAnnots = function() {\n  for (var row in annotTable) {\n    speakAnnotsByRow(row);\n  }\n};\nvar speakMode = function() {\n  if (!isVimMode()) {\n    return;\n  }\n  switch (cvoxAce.editor.keyBinding.$data.state) {\n  case INSERT_MODE_STATE:\n    cvox.Api.speak('Insert mode');\n    break;\n  case COMMAND_MODE_STATE:\n    cvox.Api.speak('Command mode');\n    break;\n  }\n};\nvar toggleSpeakRowLocation = function() {\n  shouldSpeakRowLocation = !shouldSpeakRowLocation;\n  if (shouldSpeakRowLocation) {\n    cvox.Api.speak('Speak location on row change enabled.');\n  } else {\n    cvox.Api.speak('Speak location on row change disabled.');\n  }\n};\nvar toggleSpeakDisplacement = function() {\n  shouldSpeakDisplacement = !shouldSpeakDisplacement;\n  if (shouldSpeakDisplacement) {\n    cvox.Api.speak('Speak displacement on column changes.');\n  } else {\n    cvox.Api.speak('Speak current character or word on column changes.');\n  }\n};\nvar onKeyDown = function(evt) {\n  if (evt.ctrlKey && evt.shiftKey) {\n    var shortcut = keyCodeToShortcutMap[evt.keyCode];\n    if (shortcut) {\n      shortcut.func();\n    }\n  }\n};\nvar onChangeStatus = function(evt, editor) {\n  if (!isVimMode()) {\n    return;\n  }\n  var state = editor.keyBinding.$data.state;\n  if (state === vimState) {\n    return;\n  }\n  switch (state) {\n  case INSERT_MODE_STATE:\n    cvox.Api.playEarcon(MODE_SWITCH_EARCON);\n    cvox.Api.setKeyEcho(true);\n    break;\n  case COMMAND_MODE_STATE:\n    cvox.Api.playEarcon(MODE_SWITCH_EARCON);\n    cvox.Api.setKeyEcho(false);\n    break;\n  }\n  vimState = state;\n};\nvar contextMenuHandler = function(evt) {\n  var cmd = evt.detail['customCommand'];\n  var shortcut = cmdToShortcutMap[cmd];\n  if (shortcut) {\n    shortcut.func();\n    cvoxAce.editor.focus();\n  }\n};\nvar initContextMenu = function() {\n  var ACTIONS = SHORTCUTS.map(function(shortcut) {\n    return {\n      desc: shortcut.desc + getKeyShortcutString(shortcut.keyCode),\n      cmd: shortcut.cmd\n    };\n  });\n  var body = document.querySelector('body');\n  body.setAttribute('contextMenuActions', JSON.stringify(ACTIONS));\n  body.addEventListener('ATCustomEvent', contextMenuHandler, true);\n};\nvar onFindSearchbox = function(evt) {\n  if (evt.match) {\n    speakLine(lastCursor.row, 0);\n  } else {\n    cvox.Api.playEarcon(NO_MATCH_EARCON);\n  }\n};\nvar focus = function() {\n  cvoxAce.editor.focus();\n};\nvar SHORTCUTS = [\n  {\n    keyCode: 49,\n    func: function() {\n      speakAnnotsByRow(lastCursor.row);\n    },\n    cmd: Command.SPEAK_ANNOT,\n    desc: 'Speak annotations on line'\n  },\n  {\n    keyCode: 50,\n    func: speakAllAnnots,\n    cmd: Command.SPEAK_ALL_ANNOTS,\n    desc: 'Speak all annotations'\n  },\n  {\n    keyCode: 51,\n    func: speakMode,\n    cmd: Command.SPEAK_MODE,\n    desc: 'Speak Vim mode'\n  },\n  {\n    keyCode: 52,\n    func: toggleSpeakRowLocation,\n    cmd: Command.TOGGLE_LOCATION,\n    desc: 'Toggle speak row location'\n  },\n  {\n    keyCode: 53,\n    func: speakCurrRowAndCol,\n    cmd: Command.SPEAK_ROW_COL,\n    desc: 'Speak row and column'\n  },\n  {\n    keyCode: 54,\n    func: toggleSpeakDisplacement,\n    cmd: Command.TOGGLE_DISPLACEMENT,\n    desc: 'Toggle speak displacement'\n  },\n  {\n    keyCode: 55,\n    func: focus,\n    cmd: Command.FOCUS_TEXT,\n    desc: 'Focus text'\n  }\n];\nvar onFocus = function() {\n  cvoxAce.editor = editor;\n  editor.getSession().selection.on('changeCursor', onCursorChange);\n  editor.getSession().selection.on('changeSelection', onSelectionChange);\n  editor.getSession().on('change', onChange);\n  editor.getSession().on('changeAnnotation', onAnnotationChange);\n  editor.on('changeStatus', onChangeStatus);\n  editor.on('findSearchBox', onFindSearchbox);\n  editor.container.addEventListener('keydown', onKeyDown);\n\n  lastCursor = editor.selection.getCursor();\n};\nvar init = function(editor) {\n  onFocus();\n  SHORTCUTS.forEach(function(shortcut) {\n    keyCodeToShortcutMap[shortcut.keyCode] = shortcut;\n    cmdToShortcutMap[shortcut.cmd] = shortcut;\n  });\n\n  editor.on('focus', onFocus);\n  if (isVimMode()) {\n    cvox.Api.setKeyEcho(false);\n  }\n  initContextMenu();\n};\nfunction cvoxApiExists() {\n  return (typeof(cvox) !== 'undefined') && cvox && cvox.Api;\n}\nvar tries = 0;\nvar MAX_TRIES = 15;\nfunction watchForCvoxLoad(editor) {\n  if (cvoxApiExists()) {\n    init(editor);\n  } else {\n    tries++;\n    if (tries >= MAX_TRIES) {\n      return;\n    }\n    window.setTimeout(watchForCvoxLoad, 500, editor);\n  }\n}\n\nvar Editor = require('../editor').Editor;\nrequire('../config').defineOptions(Editor.prototype, 'editor', {\n  enableChromevoxEnhancements: {\n    set: function(val) {\n      if (val) {\n        watchForCvoxLoad(this);\n      }\n    },\n    value: true // turn it on by default or check for window.cvox\n  }\n});\n\n});\n                (function() {\n                    ace.require([\"ace/ext/chromevox\"], function() {});\n                })();\n            "
  },
  {
    "path": "browser/plugins/ace/src-noconflict/ext-elastic_tabstops_lite.js",
    "content": "ace.define(\"ace/ext/elastic_tabstops_lite\",[\"require\",\"exports\",\"module\",\"ace/editor\",\"ace/config\"], function(require, exports, module) {\n\"use strict\";\n\nvar ElasticTabstopsLite = function(editor) {\n    this.$editor = editor;\n    var self = this;\n    var changedRows = [];\n    var recordChanges = false;\n    this.onAfterExec = function() {\n        recordChanges = false;\n        self.processRows(changedRows);\n        changedRows = [];\n    };\n    this.onExec = function() {\n        recordChanges = true;\n    };\n    this.onChange = function(e) {\n        var range = e.data.range\n        if (recordChanges) {\n            if (changedRows.indexOf(range.start.row) == -1)\n                changedRows.push(range.start.row);\n            if (range.end.row != range.start.row)\n                changedRows.push(range.end.row);\n        }\n    };\n};\n\n(function() {\n    this.processRows = function(rows) {\n        this.$inChange = true;\n        var checkedRows = [];\n\n        for (var r = 0, rowCount = rows.length; r < rowCount; r++) {\n            var row = rows[r];\n\n            if (checkedRows.indexOf(row) > -1)\n                continue;\n\n            var cellWidthObj = this.$findCellWidthsForBlock(row);\n            var cellWidths = this.$setBlockCellWidthsToMax(cellWidthObj.cellWidths);\n            var rowIndex = cellWidthObj.firstRow;\n\n            for (var w = 0, l = cellWidths.length; w < l; w++) {\n                var widths = cellWidths[w];\n                checkedRows.push(rowIndex);\n                this.$adjustRow(rowIndex, widths);\n                rowIndex++;\n            }\n        }\n        this.$inChange = false;\n    };\n\n    this.$findCellWidthsForBlock = function(row) {\n        var cellWidths = [], widths;\n        var rowIter = row;\n        while (rowIter >= 0) {\n            widths = this.$cellWidthsForRow(rowIter);\n            if (widths.length == 0)\n                break;\n\n            cellWidths.unshift(widths);\n            rowIter--;\n        }\n        var firstRow = rowIter + 1;\n        rowIter = row;\n        var numRows = this.$editor.session.getLength();\n\n        while (rowIter < numRows - 1) {\n            rowIter++;\n\n            widths = this.$cellWidthsForRow(rowIter);\n            if (widths.length == 0)\n                break;\n\n            cellWidths.push(widths);\n        }\n\n        return { cellWidths: cellWidths, firstRow: firstRow };\n    };\n\n    this.$cellWidthsForRow = function(row) {\n        var selectionColumns = this.$selectionColumnsForRow(row);\n\n        var tabs = [-1].concat(this.$tabsForRow(row));\n        var widths = tabs.map(function(el) { return 0; } ).slice(1);\n        var line = this.$editor.session.getLine(row);\n\n        for (var i = 0, len = tabs.length - 1; i < len; i++) {\n            var leftEdge = tabs[i]+1;\n            var rightEdge = tabs[i+1];\n\n            var rightmostSelection = this.$rightmostSelectionInCell(selectionColumns, rightEdge);\n            var cell = line.substring(leftEdge, rightEdge);\n            widths[i] = Math.max(cell.replace(/\\s+$/g,'').length, rightmostSelection - leftEdge);\n        }\n\n        return widths;\n    };\n\n    this.$selectionColumnsForRow = function(row) {\n        var selections = [], cursor = this.$editor.getCursorPosition();\n        if (this.$editor.session.getSelection().isEmpty()) {\n            if (row == cursor.row)\n                selections.push(cursor.column);\n        }\n\n        return selections;\n    };\n\n    this.$setBlockCellWidthsToMax = function(cellWidths) {\n        var startingNewBlock = true, blockStartRow, blockEndRow, maxWidth;\n        var columnInfo = this.$izip_longest(cellWidths);\n\n        for (var c = 0, l = columnInfo.length; c < l; c++) {\n            var column = columnInfo[c];\n            if (!column.push) {\n                console.error(column);\n                continue;\n            }\n            column.push(NaN);\n\n            for (var r = 0, s = column.length; r < s; r++) {\n                var width = column[r];\n                if (startingNewBlock) {\n                    blockStartRow = r;\n                    maxWidth = 0;\n                    startingNewBlock = false;\n                }\n                if (isNaN(width)) {\n                    blockEndRow = r;\n\n                    for (var j = blockStartRow; j < blockEndRow; j++) {\n                        cellWidths[j][c] = maxWidth;\n                    }\n                    startingNewBlock = true;\n                }\n\n                maxWidth = Math.max(maxWidth, width);\n            }\n        }\n\n        return cellWidths;\n    };\n\n    this.$rightmostSelectionInCell = function(selectionColumns, cellRightEdge) {\n        var rightmost = 0;\n\n        if (selectionColumns.length) {\n            var lengths = [];\n            for (var s = 0, length = selectionColumns.length; s < length; s++) {\n                if (selectionColumns[s] <= cellRightEdge)\n                    lengths.push(s);\n                else\n                    lengths.push(0);\n            }\n            rightmost = Math.max.apply(Math, lengths);\n        }\n\n        return rightmost;\n    };\n\n    this.$tabsForRow = function(row) {\n        var rowTabs = [], line = this.$editor.session.getLine(row),\n            re = /\\t/g, match;\n\n        while ((match = re.exec(line)) != null) {\n            rowTabs.push(match.index);\n        }\n\n        return rowTabs;\n    };\n\n    this.$adjustRow = function(row, widths) {\n        var rowTabs = this.$tabsForRow(row);\n\n        if (rowTabs.length == 0)\n            return;\n\n        var bias = 0, location = -1;\n        var expandedSet = this.$izip(widths, rowTabs);\n\n        for (var i = 0, l = expandedSet.length; i < l; i++) {\n            var w = expandedSet[i][0], it = expandedSet[i][1];\n            location += 1 + w;\n            it += bias;\n            var difference = location - it;\n\n            if (difference == 0)\n                continue;\n\n            var partialLine = this.$editor.session.getLine(row).substr(0, it );\n            var strippedPartialLine = partialLine.replace(/\\s*$/g, \"\");\n            var ispaces = partialLine.length - strippedPartialLine.length;\n\n            if (difference > 0) {\n                this.$editor.session.getDocument().insertInLine({row: row, column: it + 1}, Array(difference + 1).join(\" \") + \"\\t\");\n                this.$editor.session.getDocument().removeInLine(row, it, it + 1);\n\n                bias += difference;\n            }\n\n            if (difference < 0 && ispaces >= -difference) {\n                this.$editor.session.getDocument().removeInLine(row, it + difference, it);\n                bias += difference;\n            }\n        }\n    };\n    this.$izip_longest = function(iterables) {\n        if (!iterables[0])\n            return [];\n        var longest = iterables[0].length;\n        var iterablesLength = iterables.length;\n\n        for (var i = 1; i < iterablesLength; i++) {\n            var iLength = iterables[i].length;\n            if (iLength > longest)\n                longest = iLength;\n        }\n\n        var expandedSet = [];\n\n        for (var l = 0; l < longest; l++) {\n            var set = [];\n            for (var i = 0; i < iterablesLength; i++) {\n                if (iterables[i][l] === \"\")\n                    set.push(NaN);\n                else\n                    set.push(iterables[i][l]);\n            }\n\n            expandedSet.push(set);\n        }\n\n\n        return expandedSet;\n    };\n    this.$izip = function(widths, tabs) {\n        var size = widths.length >= tabs.length ? tabs.length : widths.length;\n\n        var expandedSet = [];\n        for (var i = 0; i < size; i++) {\n            var set = [ widths[i], tabs[i] ];\n            expandedSet.push(set);\n        }\n        return expandedSet;\n    };\n\n}).call(ElasticTabstopsLite.prototype);\n\nexports.ElasticTabstopsLite = ElasticTabstopsLite;\n\nvar Editor = require(\"../editor\").Editor;\nrequire(\"../config\").defineOptions(Editor.prototype, \"editor\", {\n    useElasticTabstops: {\n        set: function(val) {\n            if (val) {\n                if (!this.elasticTabstops)\n                    this.elasticTabstops = new ElasticTabstopsLite(this);\n                this.commands.on(\"afterExec\", this.elasticTabstops.onAfterExec);\n                this.commands.on(\"exec\", this.elasticTabstops.onExec);\n                this.on(\"change\", this.elasticTabstops.onChange);\n            } else if (this.elasticTabstops) {\n                this.commands.removeListener(\"afterExec\", this.elasticTabstops.onAfterExec);\n                this.commands.removeListener(\"exec\", this.elasticTabstops.onExec);\n                this.removeListener(\"change\", this.elasticTabstops.onChange);\n            }\n        }\n    }\n});\n\n});\n                (function() {\n                    ace.require([\"ace/ext/elastic_tabstops_lite\"], function() {});\n                })();\n            "
  },
  {
    "path": "browser/plugins/ace/src-noconflict/ext-emmet.js",
    "content": "ace.define(\"ace/snippets\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\",\"ace/lib/lang\",\"ace/range\",\"ace/anchor\",\"ace/keyboard/hash_handler\",\"ace/tokenizer\",\"ace/lib/dom\",\"ace/editor\"], function(require, exports, module) {\n\"use strict\";\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar lang = require(\"./lib/lang\");\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\nvar HashHandler = require(\"./keyboard/hash_handler\").HashHandler;\nvar Tokenizer = require(\"./tokenizer\").Tokenizer;\nvar comparePoints = Range.comparePoints;\n\nvar SnippetManager = function() {\n    this.snippetMap = {};\n    this.snippetNameMap = {};\n};\n\n(function() {\n    oop.implement(this, EventEmitter);\n    \n    this.getTokenizer = function() {\n        function TabstopToken(str, _, stack) {\n            str = str.substr(1);\n            if (/^\\d+$/.test(str) && !stack.inFormatString)\n                return [{tabstopId: parseInt(str, 10)}];\n            return [{text: str}];\n        }\n        function escape(ch) {\n            return \"(?:[^\\\\\\\\\" + ch + \"]|\\\\\\\\.)\";\n        }\n        SnippetManager.$tokenizer = new Tokenizer({\n            start: [\n                {regex: /:/, onMatch: function(val, state, stack) {\n                    if (stack.length && stack[0].expectIf) {\n                        stack[0].expectIf = false;\n                        stack[0].elseBranch = stack[0];\n                        return [stack[0]];\n                    }\n                    return \":\";\n                }},\n                {regex: /\\\\./, onMatch: function(val, state, stack) {\n                    var ch = val[1];\n                    if (ch == \"}\" && stack.length) {\n                        val = ch;\n                    }else if (\"`$\\\\\".indexOf(ch) != -1) {\n                        val = ch;\n                    } else if (stack.inFormatString) {\n                        if (ch == \"n\")\n                            val = \"\\n\";\n                        else if (ch == \"t\")\n                            val = \"\\n\";\n                        else if (\"ulULE\".indexOf(ch) != -1) {\n                            val = {changeCase: ch, local: ch > \"a\"};\n                        }\n                    }\n\n                    return [val];\n                }},\n                {regex: /}/, onMatch: function(val, state, stack) {\n                    return [stack.length ? stack.shift() : val];\n                }},\n                {regex: /\\$(?:\\d+|\\w+)/, onMatch: TabstopToken},\n                {regex: /\\$\\{[\\dA-Z_a-z]+/, onMatch: function(str, state, stack) {\n                    var t = TabstopToken(str.substr(1), state, stack);\n                    stack.unshift(t[0]);\n                    return t;\n                }, next: \"snippetVar\"},\n                {regex: /\\n/, token: \"newline\", merge: false}\n            ],\n            snippetVar: [\n                {regex: \"\\\\|\" + escape(\"\\\\|\") + \"*\\\\|\", onMatch: function(val, state, stack) {\n                    stack[0].choices = val.slice(1, -1).split(\",\");\n                }, next: \"start\"},\n                {regex: \"/(\" + escape(\"/\") + \"+)/(?:(\" + escape(\"/\") + \"*)/)(\\\\w*):?\",\n                 onMatch: function(val, state, stack) {\n                    var ts = stack[0];\n                    ts.fmtString = val;\n\n                    val = this.splitRegex.exec(val);\n                    ts.guard = val[1];\n                    ts.fmt = val[2];\n                    ts.flag = val[3];\n                    return \"\";\n                }, next: \"start\"},\n                {regex: \"`\" + escape(\"`\") + \"*`\", onMatch: function(val, state, stack) {\n                    stack[0].code = val.splice(1, -1);\n                    return \"\";\n                }, next: \"start\"},\n                {regex: \"\\\\?\", onMatch: function(val, state, stack) {\n                    if (stack[0])\n                        stack[0].expectIf = true;\n                }, next: \"start\"},\n                {regex: \"([^:}\\\\\\\\]|\\\\\\\\.)*:?\", token: \"\", next: \"start\"}\n            ],\n            formatString: [\n                {regex: \"/(\" + escape(\"/\") + \"+)/\", token: \"regex\"},\n                {regex: \"\", onMatch: function(val, state, stack) {\n                    stack.inFormatString = true;\n                }, next: \"start\"}\n            ]\n        });\n        SnippetManager.prototype.getTokenizer = function() {\n            return SnippetManager.$tokenizer;\n        };\n        return SnippetManager.$tokenizer;\n    };\n\n    this.tokenizeTmSnippet = function(str, startState) {\n        return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) {\n            return x.value || x;\n        });\n    };\n\n    this.$getDefaultValue = function(editor, name) {\n        if (/^[A-Z]\\d+$/.test(name)) {\n            var i = name.substr(1);\n            return (this.variables[name[0] + \"__\"] || {})[i];\n        }\n        if (/^\\d+$/.test(name)) {\n            return (this.variables.__ || {})[name];\n        }\n        name = name.replace(/^TM_/, \"\");\n\n        if (!editor)\n            return;\n        var s = editor.session;\n        switch(name) {\n            case \"CURRENT_WORD\":\n                var r = s.getWordRange();\n            case \"SELECTION\":\n            case \"SELECTED_TEXT\":\n                return s.getTextRange(r);\n            case \"CURRENT_LINE\":\n                return s.getLine(editor.getCursorPosition().row);\n            case \"PREV_LINE\": // not possible in textmate\n                return s.getLine(editor.getCursorPosition().row - 1);\n            case \"LINE_INDEX\":\n                return editor.getCursorPosition().column;\n            case \"LINE_NUMBER\":\n                return editor.getCursorPosition().row + 1;\n            case \"SOFT_TABS\":\n                return s.getUseSoftTabs() ? \"YES\" : \"NO\";\n            case \"TAB_SIZE\":\n                return s.getTabSize();\n            case \"FILENAME\":\n            case \"FILEPATH\":\n                return \"\";\n            case \"FULLNAME\":\n                return \"Ace\";\n        }\n    };\n    this.variables = {};\n    this.getVariableValue = function(editor, varName) {\n        if (this.variables.hasOwnProperty(varName))\n            return this.variables[varName](editor, varName) || \"\";\n        return this.$getDefaultValue(editor, varName) || \"\";\n    };\n    this.tmStrFormat = function(str, ch, editor) {\n        var flag = ch.flag || \"\";\n        var re = ch.guard;\n        re = new RegExp(re, flag.replace(/[^gi]/, \"\"));\n        var fmtTokens = this.tokenizeTmSnippet(ch.fmt, \"formatString\");\n        var _self = this;\n        var formatted = str.replace(re, function() {\n            _self.variables.__ = arguments;\n            var fmtParts = _self.resolveVariables(fmtTokens, editor);\n            var gChangeCase = \"E\";\n            for (var i  = 0; i < fmtParts.length; i++) {\n                var ch = fmtParts[i];\n                if (typeof ch == \"object\") {\n                    fmtParts[i] = \"\";\n                    if (ch.changeCase && ch.local) {\n                        var next = fmtParts[i + 1];\n                        if (next && typeof next == \"string\") {\n                            if (ch.changeCase == \"u\")\n                                fmtParts[i] = next[0].toUpperCase();\n                            else\n                                fmtParts[i] = next[0].toLowerCase();\n                            fmtParts[i + 1] = next.substr(1);\n                        }\n                    } else if (ch.changeCase) {\n                        gChangeCase = ch.changeCase;\n                    }\n                } else if (gChangeCase == \"U\") {\n                    fmtParts[i] = ch.toUpperCase();\n                } else if (gChangeCase == \"L\") {\n                    fmtParts[i] = ch.toLowerCase();\n                }\n            }\n            return fmtParts.join(\"\");\n        });\n        this.variables.__ = null;\n        return formatted;\n    };\n\n    this.resolveVariables = function(snippet, editor) {\n        var result = [];\n        for (var i = 0; i < snippet.length; i++) {\n            var ch = snippet[i];\n            if (typeof ch == \"string\") {\n                result.push(ch);\n            } else if (typeof ch != \"object\") {\n                continue;\n            } else if (ch.skip) {\n                gotoNext(ch);\n            } else if (ch.processed < i) {\n                continue;\n            } else if (ch.text) {\n                var value = this.getVariableValue(editor, ch.text);\n                if (value && ch.fmtString)\n                    value = this.tmStrFormat(value, ch);\n                ch.processed = i;\n                if (ch.expectIf == null) {\n                    if (value) {\n                        result.push(value);\n                        gotoNext(ch);\n                    }\n                } else {\n                    if (value) {\n                        ch.skip = ch.elseBranch;\n                    } else\n                        gotoNext(ch);\n                }\n            } else if (ch.tabstopId != null) {\n                result.push(ch);\n            } else if (ch.changeCase != null) {\n                result.push(ch);\n            }\n        }\n        function gotoNext(ch) {\n            var i1 = snippet.indexOf(ch, i + 1);\n            if (i1 != -1)\n                i = i1;\n        }\n        return result;\n    };\n\n    this.insertSnippetForSelection = function(editor, snippetText) {\n        var cursor = editor.getCursorPosition();\n        var line = editor.session.getLine(cursor.row);\n        var tabString = editor.session.getTabString();\n        var indentString = line.match(/^\\s*/)[0];\n        \n        if (cursor.column < indentString.length)\n            indentString = indentString.slice(0, cursor.column);\n\n        var tokens = this.tokenizeTmSnippet(snippetText);\n        tokens = this.resolveVariables(tokens, editor);\n        tokens = tokens.map(function(x) {\n            if (x == \"\\n\")\n                return x + indentString;\n            if (typeof x == \"string\")\n                return x.replace(/\\t/g, tabString);\n            return x;\n        });\n        var tabstops = [];\n        tokens.forEach(function(p, i) {\n            if (typeof p != \"object\")\n                return;\n            var id = p.tabstopId;\n            var ts = tabstops[id];\n            if (!ts) {\n                ts = tabstops[id] = [];\n                ts.index = id;\n                ts.value = \"\";\n            }\n            if (ts.indexOf(p) !== -1)\n                return;\n            ts.push(p);\n            var i1 = tokens.indexOf(p, i + 1);\n            if (i1 === -1)\n                return;\n\n            var value = tokens.slice(i + 1, i1);\n            var isNested = value.some(function(t) {return typeof t === \"object\"});          \n            if (isNested && !ts.value) {\n                ts.value = value;\n            } else if (value.length && (!ts.value || typeof ts.value !== \"string\")) {\n                ts.value = value.join(\"\");\n            }\n        });\n        tabstops.forEach(function(ts) {ts.length = 0});\n        var expanding = {};\n        function copyValue(val) {\n            var copy = [];\n            for (var i = 0; i < val.length; i++) {\n                var p = val[i];\n                if (typeof p == \"object\") {\n                    if (expanding[p.tabstopId])\n                        continue;\n                    var j = val.lastIndexOf(p, i - 1);\n                    p = copy[j] || {tabstopId: p.tabstopId};\n                }\n                copy[i] = p;\n            }\n            return copy;\n        }\n        for (var i = 0; i < tokens.length; i++) {\n            var p = tokens[i];\n            if (typeof p != \"object\")\n                continue;\n            var id = p.tabstopId;\n            var i1 = tokens.indexOf(p, i + 1);\n            if (expanding[id]) {\n                if (expanding[id] === p)\n                    expanding[id] = null;\n                continue;\n            }\n            \n            var ts = tabstops[id];\n            var arg = typeof ts.value == \"string\" ? [ts.value] : copyValue(ts.value);\n            arg.unshift(i + 1, Math.max(0, i1 - i));\n            arg.push(p);\n            expanding[id] = p;\n            tokens.splice.apply(tokens, arg);\n\n            if (ts.indexOf(p) === -1)\n                ts.push(p);\n        }\n        var row = 0, column = 0;\n        var text = \"\";\n        tokens.forEach(function(t) {\n            if (typeof t === \"string\") {\n                if (t[0] === \"\\n\"){\n                    column = t.length - 1;\n                    row ++;\n                } else\n                    column += t.length;\n                text += t;\n            } else {\n                if (!t.start)\n                    t.start = {row: row, column: column};\n                else\n                    t.end = {row: row, column: column};\n            }\n        });\n        var range = editor.getSelectionRange();\n        var end = editor.session.replace(range, text);\n\n        var tabstopManager = new TabstopManager(editor);\n        var selectionId = editor.inVirtualSelectionMode && editor.selection.index;\n        tabstopManager.addTabstops(tabstops, range.start, end, selectionId);\n    };\n    \n    this.insertSnippet = function(editor, snippetText) {\n        var self = this;\n        if (editor.inVirtualSelectionMode)\n            return self.insertSnippetForSelection(editor, snippetText);\n        \n        editor.forEachSelection(function() {\n            self.insertSnippetForSelection(editor, snippetText);\n        }, null, {keepOrder: true});\n        \n        if (editor.tabstopManager)\n            editor.tabstopManager.tabNext();\n    };\n\n    this.$getScope = function(editor) {\n        var scope = editor.session.$mode.$id || \"\";\n        scope = scope.split(\"/\").pop();\n        if (scope === \"html\" || scope === \"php\") {\n            if (scope === \"php\" && !editor.session.$mode.inlinePhp) \n                scope = \"html\";\n            var c = editor.getCursorPosition();\n            var state = editor.session.getState(c.row);\n            if (typeof state === \"object\") {\n                state = state[0];\n            }\n            if (state.substring) {\n                if (state.substring(0, 3) == \"js-\")\n                    scope = \"javascript\";\n                else if (state.substring(0, 4) == \"css-\")\n                    scope = \"css\";\n                else if (state.substring(0, 4) == \"php-\")\n                    scope = \"php\";\n            }\n        }\n        \n        return scope;\n    };\n\n    this.getActiveScopes = function(editor) {\n        var scope = this.$getScope(editor);\n        var scopes = [scope];\n        var snippetMap = this.snippetMap;\n        if (snippetMap[scope] && snippetMap[scope].includeScopes) {\n            scopes.push.apply(scopes, snippetMap[scope].includeScopes);\n        }\n        scopes.push(\"_\");\n        return scopes;\n    };\n\n    this.expandWithTab = function(editor, options) {\n        var self = this;\n        var result = editor.forEachSelection(function() {\n            return self.expandSnippetForSelection(editor, options);\n        }, null, {keepOrder: true});\n        if (result && editor.tabstopManager)\n            editor.tabstopManager.tabNext();\n        return result;\n    };\n    \n    this.expandSnippetForSelection = function(editor, options) {\n        var cursor = editor.getCursorPosition();\n        var line = editor.session.getLine(cursor.row);\n        var before = line.substring(0, cursor.column);\n        var after = line.substr(cursor.column);\n\n        var snippetMap = this.snippetMap;\n        var snippet;\n        this.getActiveScopes(editor).some(function(scope) {\n            var snippets = snippetMap[scope];\n            if (snippets)\n                snippet = this.findMatchingSnippet(snippets, before, after);\n            return !!snippet;\n        }, this);\n        if (!snippet)\n            return false;\n        if (options && options.dryRun)\n            return true;\n        editor.session.doc.removeInLine(cursor.row,\n            cursor.column - snippet.replaceBefore.length,\n            cursor.column + snippet.replaceAfter.length\n        );\n\n        this.variables.M__ = snippet.matchBefore;\n        this.variables.T__ = snippet.matchAfter;\n        this.insertSnippetForSelection(editor, snippet.content);\n\n        this.variables.M__ = this.variables.T__ = null;\n        return true;\n    };\n\n    this.findMatchingSnippet = function(snippetList, before, after) {\n        for (var i = snippetList.length; i--;) {\n            var s = snippetList[i];\n            if (s.startRe && !s.startRe.test(before))\n                continue;\n            if (s.endRe && !s.endRe.test(after))\n                continue;\n            if (!s.startRe && !s.endRe)\n                continue;\n\n            s.matchBefore = s.startRe ? s.startRe.exec(before) : [\"\"];\n            s.matchAfter = s.endRe ? s.endRe.exec(after) : [\"\"];\n            s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : \"\";\n            s.replaceAfter = s.endTriggerRe ? s.endTriggerRe.exec(after)[0] : \"\";\n            return s;\n        }\n    };\n\n    this.snippetMap = {};\n    this.snippetNameMap = {};\n    this.register = function(snippets, scope) {\n        var snippetMap = this.snippetMap;\n        var snippetNameMap = this.snippetNameMap;\n        var self = this;\n        \n        if (!snippets) \n            snippets = [];\n        \n        function wrapRegexp(src) {\n            if (src && !/^\\^?\\(.*\\)\\$?$|^\\\\b$/.test(src))\n                src = \"(?:\" + src + \")\";\n\n            return src || \"\";\n        }\n        function guardedRegexp(re, guard, opening) {\n            re = wrapRegexp(re);\n            guard = wrapRegexp(guard);\n            if (opening) {\n                re = guard + re;\n                if (re && re[re.length - 1] != \"$\")\n                    re = re + \"$\";\n            } else {\n                re = re + guard;\n                if (re && re[0] != \"^\")\n                    re = \"^\" + re;\n            }\n            return new RegExp(re);\n        }\n\n        function addSnippet(s) {\n            if (!s.scope)\n                s.scope = scope || \"_\";\n            scope = s.scope;\n            if (!snippetMap[scope]) {\n                snippetMap[scope] = [];\n                snippetNameMap[scope] = {};\n            }\n\n            var map = snippetNameMap[scope];\n            if (s.name) {\n                var old = map[s.name];\n                if (old)\n                    self.unregister(old);\n                map[s.name] = s;\n            }\n            snippetMap[scope].push(s);\n\n            if (s.tabTrigger && !s.trigger) {\n                if (!s.guard && /^\\w/.test(s.tabTrigger))\n                    s.guard = \"\\\\b\";\n                s.trigger = lang.escapeRegExp(s.tabTrigger);\n            }\n\n            s.startRe = guardedRegexp(s.trigger, s.guard, true);\n            s.triggerRe = new RegExp(s.trigger, \"\", true);\n\n            s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true);\n            s.endTriggerRe = new RegExp(s.endTrigger, \"\", true);\n        }\n\n        if (snippets && snippets.content)\n            addSnippet(snippets);\n        else if (Array.isArray(snippets))\n            snippets.forEach(addSnippet);\n        \n        this._signal(\"registerSnippets\", {scope: scope});\n    };\n    this.unregister = function(snippets, scope) {\n        var snippetMap = this.snippetMap;\n        var snippetNameMap = this.snippetNameMap;\n\n        function removeSnippet(s) {\n            var nameMap = snippetNameMap[s.scope||scope];\n            if (nameMap && nameMap[s.name]) {\n                delete nameMap[s.name];\n                var map = snippetMap[s.scope||scope];\n                var i = map && map.indexOf(s);\n                if (i >= 0)\n                    map.splice(i, 1);\n            }\n        }\n        if (snippets.content)\n            removeSnippet(snippets);\n        else if (Array.isArray(snippets))\n            snippets.forEach(removeSnippet);\n    };\n    this.parseSnippetFile = function(str) {\n        str = str.replace(/\\r/g, \"\");\n        var list = [], snippet = {};\n        var re = /^#.*|^({[\\s\\S]*})\\s*$|^(\\S+) (.*)$|^((?:\\n*\\t.*)+)/gm;\n        var m;\n        while (m = re.exec(str)) {\n            if (m[1]) {\n                try {\n                    snippet = JSON.parse(m[1]);\n                    list.push(snippet);\n                } catch (e) {}\n            } if (m[4]) {\n                snippet.content = m[4].replace(/^\\t/gm, \"\");\n                list.push(snippet);\n                snippet = {};\n            } else {\n                var key = m[2], val = m[3];\n                if (key == \"regex\") {\n                    var guardRe = /\\/((?:[^\\/\\\\]|\\\\.)*)|$/g;\n                    snippet.guard = guardRe.exec(val)[1];\n                    snippet.trigger = guardRe.exec(val)[1];\n                    snippet.endTrigger = guardRe.exec(val)[1];\n                    snippet.endGuard = guardRe.exec(val)[1];\n                } else if (key == \"snippet\") {\n                    snippet.tabTrigger = val.match(/^\\S*/)[0];\n                    if (!snippet.name)\n                        snippet.name = val;\n                } else {\n                    snippet[key] = val;\n                }\n            }\n        }\n        return list;\n    };\n    this.getSnippetByName = function(name, editor) {\n        var snippetMap = this.snippetNameMap;\n        var snippet;\n        this.getActiveScopes(editor).some(function(scope) {\n            var snippets = snippetMap[scope];\n            if (snippets)\n                snippet = snippets[name];\n            return !!snippet;\n        }, this);\n        return snippet;\n    };\n\n}).call(SnippetManager.prototype);\n\n\nvar TabstopManager = function(editor) {\n    if (editor.tabstopManager)\n        return editor.tabstopManager;\n    editor.tabstopManager = this;\n    this.$onChange = this.onChange.bind(this);\n    this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule;\n    this.$onChangeSession = this.onChangeSession.bind(this);\n    this.$onAfterExec = this.onAfterExec.bind(this);\n    this.attach(editor);\n};\n(function() {\n    this.attach = function(editor) {\n        this.index = 0;\n        this.ranges = [];\n        this.tabstops = [];\n        this.$openTabstops = null;\n        this.selectedTabstop = null;\n\n        this.editor = editor;\n        this.editor.on(\"change\", this.$onChange);\n        this.editor.on(\"changeSelection\", this.$onChangeSelection);\n        this.editor.on(\"changeSession\", this.$onChangeSession);\n        this.editor.commands.on(\"afterExec\", this.$onAfterExec);\n        this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler);\n    };\n    this.detach = function() {\n        this.tabstops.forEach(this.removeTabstopMarkers, this);\n        this.ranges = null;\n        this.tabstops = null;\n        this.selectedTabstop = null;\n        this.editor.removeListener(\"change\", this.$onChange);\n        this.editor.removeListener(\"changeSelection\", this.$onChangeSelection);\n        this.editor.removeListener(\"changeSession\", this.$onChangeSession);\n        this.editor.commands.removeListener(\"afterExec\", this.$onAfterExec);\n        this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);\n        this.editor.tabstopManager = null;\n        this.editor = null;\n    };\n\n    this.onChange = function(e) {\n        var changeRange = e.data.range;\n        var isRemove = e.data.action[0] == \"r\";\n        var start = changeRange.start;\n        var end = changeRange.end;\n        var startRow = start.row;\n        var endRow = end.row;\n        var lineDif = endRow - startRow;\n        var colDiff = end.column - start.column;\n\n        if (isRemove) {\n            lineDif = -lineDif;\n            colDiff = -colDiff;\n        }\n        if (!this.$inChange && isRemove) {\n            var ts = this.selectedTabstop;\n            var changedOutside = ts && !ts.some(function(r) {\n                return comparePoints(r.start, start) <= 0 && comparePoints(r.end, end) >= 0;\n            });\n            if (changedOutside)\n                return this.detach();\n        }\n        var ranges = this.ranges;\n        for (var i = 0; i < ranges.length; i++) {\n            var r = ranges[i];\n            if (r.end.row < start.row)\n                continue;\n\n            if (isRemove && comparePoints(start, r.start) < 0 && comparePoints(end, r.end) > 0) {\n                this.removeRange(r);\n                i--;\n                continue;\n            }\n\n            if (r.start.row == startRow && r.start.column > start.column)\n                r.start.column += colDiff;\n            if (r.end.row == startRow && r.end.column >= start.column)\n                r.end.column += colDiff;\n            if (r.start.row >= startRow)\n                r.start.row += lineDif;\n            if (r.end.row >= startRow)\n                r.end.row += lineDif;\n\n            if (comparePoints(r.start, r.end) > 0)\n                this.removeRange(r);\n        }\n        if (!ranges.length)\n            this.detach();\n    };\n    this.updateLinkedFields = function() {\n        var ts = this.selectedTabstop;\n        if (!ts || !ts.hasLinkedRanges)\n            return;\n        this.$inChange = true;\n        var session = this.editor.session;\n        var text = session.getTextRange(ts.firstNonLinked);\n        for (var i = ts.length; i--;) {\n            var range = ts[i];\n            if (!range.linked)\n                continue;\n            var fmt = exports.snippetManager.tmStrFormat(text, range.original);\n            session.replace(range, fmt);\n        }\n        this.$inChange = false;\n    };\n    this.onAfterExec = function(e) {\n        if (e.command && !e.command.readOnly)\n            this.updateLinkedFields();\n    };\n    this.onChangeSelection = function() {\n        if (!this.editor)\n            return;\n        var lead = this.editor.selection.lead;\n        var anchor = this.editor.selection.anchor;\n        var isEmpty = this.editor.selection.isEmpty();\n        for (var i = this.ranges.length; i--;) {\n            if (this.ranges[i].linked)\n                continue;\n            var containsLead = this.ranges[i].contains(lead.row, lead.column);\n            var containsAnchor = isEmpty || this.ranges[i].contains(anchor.row, anchor.column);\n            if (containsLead && containsAnchor)\n                return;\n        }\n        this.detach();\n    };\n    this.onChangeSession = function() {\n        this.detach();\n    };\n    this.tabNext = function(dir) {\n        var max = this.tabstops.length;\n        var index = this.index + (dir || 1);\n        index = Math.min(Math.max(index, 1), max);\n        if (index == max)\n            index = 0;\n        this.selectTabstop(index);\n        if (index === 0)\n            this.detach();\n    };\n    this.selectTabstop = function(index) {\n        this.$openTabstops = null;\n        var ts = this.tabstops[this.index];\n        if (ts)\n            this.addTabstopMarkers(ts);\n        this.index = index;\n        ts = this.tabstops[this.index];\n        if (!ts || !ts.length)\n            return;\n        \n        this.selectedTabstop = ts;\n        if (!this.editor.inVirtualSelectionMode) {        \n            var sel = this.editor.multiSelect;\n            sel.toSingleRange(ts.firstNonLinked.clone());\n            for (var i = ts.length; i--;) {\n                if (ts.hasLinkedRanges && ts[i].linked)\n                    continue;\n                sel.addRange(ts[i].clone(), true);\n            }\n            if (sel.ranges[0])\n                sel.addRange(sel.ranges[0].clone());\n        } else {\n            this.editor.selection.setRange(ts.firstNonLinked);\n        }\n        \n        this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler);\n    };\n    this.addTabstops = function(tabstops, start, end) {\n        if (!this.$openTabstops)\n            this.$openTabstops = [];\n        if (!tabstops[0]) {\n            var p = Range.fromPoints(end, end);\n            moveRelative(p.start, start);\n            moveRelative(p.end, start);\n            tabstops[0] = [p];\n            tabstops[0].index = 0;\n        }\n\n        var i = this.index;\n        var arg = [i + 1, 0];\n        var ranges = this.ranges;\n        tabstops.forEach(function(ts, index) {\n            var dest = this.$openTabstops[index] || ts;\n                \n            for (var i = ts.length; i--;) {\n                var p = ts[i];\n                var range = Range.fromPoints(p.start, p.end || p.start);\n                movePoint(range.start, start);\n                movePoint(range.end, start);\n                range.original = p;\n                range.tabstop = dest;\n                ranges.push(range);\n                if (dest != ts)\n                    dest.unshift(range);\n                else\n                    dest[i] = range;\n                if (p.fmtString) {\n                    range.linked = true;\n                    dest.hasLinkedRanges = true;\n                } else if (!dest.firstNonLinked)\n                    dest.firstNonLinked = range;\n            }\n            if (!dest.firstNonLinked)\n                dest.hasLinkedRanges = false;\n            if (dest === ts) {\n                arg.push(dest);\n                this.$openTabstops[index] = dest;\n            }\n            this.addTabstopMarkers(dest);\n        }, this);\n        \n        if (arg.length > 2) {\n            if (this.tabstops.length)\n                arg.push(arg.splice(2, 1)[0]);\n            this.tabstops.splice.apply(this.tabstops, arg);\n        }\n    };\n\n    this.addTabstopMarkers = function(ts) {\n        var session = this.editor.session;\n        ts.forEach(function(range) {\n            if  (!range.markerId)\n                range.markerId = session.addMarker(range, \"ace_snippet-marker\", \"text\");\n        });\n    };\n    this.removeTabstopMarkers = function(ts) {\n        var session = this.editor.session;\n        ts.forEach(function(range) {\n            session.removeMarker(range.markerId);\n            range.markerId = null;\n        });\n    };\n    this.removeRange = function(range) {\n        var i = range.tabstop.indexOf(range);\n        range.tabstop.splice(i, 1);\n        i = this.ranges.indexOf(range);\n        this.ranges.splice(i, 1);\n        this.editor.session.removeMarker(range.markerId);\n        if (!range.tabstop.length) {\n            i = this.tabstops.indexOf(range.tabstop);\n            if (i != -1)\n                this.tabstops.splice(i, 1);\n            if (!this.tabstops.length)\n                this.detach();\n        }\n    };\n\n    this.keyboardHandler = new HashHandler();\n    this.keyboardHandler.bindKeys({\n        \"Tab\": function(ed) {\n            if (exports.snippetManager && exports.snippetManager.expandWithTab(ed)) {\n                return;\n            }\n\n            ed.tabstopManager.tabNext(1);\n        },\n        \"Shift-Tab\": function(ed) {\n            ed.tabstopManager.tabNext(-1);\n        },\n        \"Esc\": function(ed) {\n            ed.tabstopManager.detach();\n        },\n        \"Return\": function(ed) {\n            return false;\n        }\n    });\n}).call(TabstopManager.prototype);\n\n\n\nvar changeTracker = {};\nchangeTracker.onChange = Anchor.prototype.onChange;\nchangeTracker.setPosition = function(row, column) {\n    this.pos.row = row;\n    this.pos.column = column;\n};\nchangeTracker.update = function(pos, delta, $insertRight) {\n    this.$insertRight = $insertRight;\n    this.pos = pos; \n    this.onChange(delta);\n};\n\nvar movePoint = function(point, diff) {\n    if (point.row == 0)\n        point.column += diff.column;\n    point.row += diff.row;\n};\n\nvar moveRelative = function(point, start) {\n    if (point.row == start.row)\n        point.column -= start.column;\n    point.row -= start.row;\n};\n\n\nrequire(\"./lib/dom\").importCssString(\"\\\n.ace_snippet-marker {\\\n    -moz-box-sizing: border-box;\\\n    box-sizing: border-box;\\\n    background: rgba(194, 193, 208, 0.09);\\\n    border: 1px dotted rgba(211, 208, 235, 0.62);\\\n    position: absolute;\\\n}\");\n\nexports.snippetManager = new SnippetManager();\n\n\nvar Editor = require(\"./editor\").Editor;\n(function() {\n    this.insertSnippet = function(content, options) {\n        return exports.snippetManager.insertSnippet(this, content, options);\n    };\n    this.expandSnippet = function(options) {\n        return exports.snippetManager.expandWithTab(this, options);\n    };\n}).call(Editor.prototype);\n\n});\n\nace.define(\"ace/ext/emmet\",[\"require\",\"exports\",\"module\",\"ace/keyboard/hash_handler\",\"ace/editor\",\"ace/snippets\",\"ace/range\",\"resources\",\"resources\",\"range\",\"tabStops\",\"resources\",\"utils\",\"actions\",\"ace/config\",\"ace/config\"], function(require, exports, module) {\n\"use strict\";\nvar HashHandler = require(\"ace/keyboard/hash_handler\").HashHandler;\nvar Editor = require(\"ace/editor\").Editor;\nvar snippetManager = require(\"ace/snippets\").snippetManager;\nvar Range = require(\"ace/range\").Range;\nvar emmet, emmetPath;\nfunction AceEmmetEditor() {}\n\nAceEmmetEditor.prototype = {\n    setupContext: function(editor) {\n        this.ace = editor;\n        this.indentation = editor.session.getTabString();\n        if (!emmet)\n            emmet = window.emmet;\n        emmet.require(\"resources\").setVariable(\"indentation\", this.indentation);\n        this.$syntax = null;\n        this.$syntax = this.getSyntax();\n    },\n    getSelectionRange: function() {\n        var range = this.ace.getSelectionRange();\n        var doc = this.ace.session.doc;\n        return {\n            start: doc.positionToIndex(range.start),\n            end: doc.positionToIndex(range.end)\n        };\n    },\n    createSelection: function(start, end) {\n        var doc = this.ace.session.doc;\n        this.ace.selection.setRange({\n            start: doc.indexToPosition(start),\n            end: doc.indexToPosition(end)\n        });\n    },\n    getCurrentLineRange: function() {\n        var ace = this.ace;\n        var row = ace.getCursorPosition().row;\n        var lineLength = ace.session.getLine(row).length;\n        var index = ace.session.doc.positionToIndex({row: row, column: 0});\n        return {\n            start: index,\n            end: index + lineLength\n        };\n    },\n    getCaretPos: function(){\n        var pos = this.ace.getCursorPosition();\n        return this.ace.session.doc.positionToIndex(pos);\n    },\n    setCaretPos: function(index){\n        var pos = this.ace.session.doc.indexToPosition(index);\n        this.ace.selection.moveToPosition(pos);\n    },\n    getCurrentLine: function() {\n        var row = this.ace.getCursorPosition().row;\n        return this.ace.session.getLine(row);\n    },\n    replaceContent: function(value, start, end, noIndent) {\n        if (end == null)\n            end = start == null ? this.getContent().length : start;\n        if (start == null)\n            start = 0;        \n        \n        var editor = this.ace;\n        var doc = editor.session.doc;\n        var range = Range.fromPoints(doc.indexToPosition(start), doc.indexToPosition(end));\n        editor.session.remove(range);\n        \n        range.end = range.start;\n        \n        value = this.$updateTabstops(value);\n        snippetManager.insertSnippet(editor, value);\n    },\n    getContent: function(){\n        return this.ace.getValue();\n    },\n    getSyntax: function() {\n        if (this.$syntax)\n            return this.$syntax;\n        var syntax = this.ace.session.$modeId.split(\"/\").pop();\n        if (syntax == \"html\" || syntax == \"php\") {\n            var cursor = this.ace.getCursorPosition();\n            var state = this.ace.session.getState(cursor.row);\n            if (typeof state != \"string\")\n                state = state[0];\n            if (state) {\n                state = state.split(\"-\");\n                if (state.length > 1)\n                    syntax = state[0];\n                else if (syntax == \"php\")\n                    syntax = \"html\";\n            }\n        }\n        return syntax;\n    },\n    getProfileName: function() {\n        switch(this.getSyntax()) {\n          case \"css\": return \"css\";\n          case \"xml\":\n          case \"xsl\":\n            return \"xml\";\n          case \"html\":\n            var profile = emmet.require(\"resources\").getVariable(\"profile\");\n            if (!profile)\n                profile = this.ace.session.getLines(0,2).join(\"\").search(/<!DOCTYPE[^>]+XHTML/i) != -1 ? \"xhtml\": \"html\";\n            return profile;\n        }\n        return \"xhtml\";\n    },\n    prompt: function(title) {\n        return prompt(title);\n    },\n    getSelection: function() {\n        return this.ace.session.getTextRange();\n    },\n    getFilePath: function() {\n        return \"\";\n    },\n    $updateTabstops: function(value) {\n        var base = 1000;\n        var zeroBase = 0;\n        var lastZero = null;\n        var range = emmet.require('range');\n        var ts = emmet.require('tabStops');\n        var settings = emmet.require('resources').getVocabulary(\"user\");\n        var tabstopOptions = {\n            tabstop: function(data) {\n                var group = parseInt(data.group, 10);\n                var isZero = group === 0;\n                if (isZero)\n                    group = ++zeroBase;\n                else\n                    group += base;\n\n                var placeholder = data.placeholder;\n                if (placeholder) {\n                    placeholder = ts.processText(placeholder, tabstopOptions);\n                }\n\n                var result = '${' + group + (placeholder ? ':' + placeholder : '') + '}';\n\n                if (isZero) {\n                    lastZero = range.create(data.start, result);\n                }\n\n                return result;\n            },\n            escape: function(ch) {\n                if (ch == '$') return '\\\\$';\n                if (ch == '\\\\') return '\\\\\\\\';\n                return ch;\n            }\n        };\n\n        value = ts.processText(value, tabstopOptions);\n\n        if (settings.variables['insert_final_tabstop'] && !/\\$\\{0\\}$/.test(value)) {\n            value += '${0}';\n        } else if (lastZero) {\n            value = emmet.require('utils').replaceSubstring(value, '${0}', lastZero);\n        }\n        \n        return value;\n    }\n};\n\n\nvar keymap = {\n    expand_abbreviation: {\"mac\": \"ctrl+alt+e\", \"win\": \"alt+e\"},\n    match_pair_outward: {\"mac\": \"ctrl+d\", \"win\": \"ctrl+,\"},\n    match_pair_inward: {\"mac\": \"ctrl+j\", \"win\": \"ctrl+shift+0\"},\n    matching_pair: {\"mac\": \"ctrl+alt+j\", \"win\": \"alt+j\"},\n    next_edit_point: \"alt+right\",\n    prev_edit_point: \"alt+left\",\n    toggle_comment: {\"mac\": \"command+/\", \"win\": \"ctrl+/\"},\n    split_join_tag: {\"mac\": \"shift+command+'\", \"win\": \"shift+ctrl+`\"},\n    remove_tag: {\"mac\": \"command+'\", \"win\": \"shift+ctrl+;\"},\n    evaluate_math_expression: {\"mac\": \"shift+command+y\", \"win\": \"shift+ctrl+y\"},\n    increment_number_by_1: \"ctrl+up\",\n    decrement_number_by_1: \"ctrl+down\",\n    increment_number_by_01: \"alt+up\",\n    decrement_number_by_01: \"alt+down\",\n    increment_number_by_10: {\"mac\": \"alt+command+up\", \"win\": \"shift+alt+up\"},\n    decrement_number_by_10: {\"mac\": \"alt+command+down\", \"win\": \"shift+alt+down\"},\n    select_next_item: {\"mac\": \"shift+command+.\", \"win\": \"shift+ctrl+.\"},\n    select_previous_item: {\"mac\": \"shift+command+,\", \"win\": \"shift+ctrl+,\"},\n    reflect_css_value: {\"mac\": \"shift+command+r\", \"win\": \"shift+ctrl+r\"},\n\n    encode_decode_data_url: {\"mac\": \"shift+ctrl+d\", \"win\": \"ctrl+'\"},\n    expand_abbreviation_with_tab: \"Tab\",\n    wrap_with_abbreviation: {\"mac\": \"shift+ctrl+a\", \"win\": \"shift+ctrl+a\"}\n};\n\nvar editorProxy = new AceEmmetEditor();\nexports.commands = new HashHandler();\nexports.runEmmetCommand = function(editor) {\n    try {\n        editorProxy.setupContext(editor);\n        if (editorProxy.getSyntax() == \"php\")\n            return false;\n        var actions = emmet.require(\"actions\");\n    \n        if (this.action == \"expand_abbreviation_with_tab\") {\n            if (!editor.selection.isEmpty())\n                return false;\n        }\n        \n        if (this.action == \"wrap_with_abbreviation\") {\n            return setTimeout(function() {\n                actions.run(\"wrap_with_abbreviation\", editorProxy);\n            }, 0);\n        }\n        \n        var pos = editor.selection.lead;\n        var token = editor.session.getTokenAt(pos.row, pos.column);\n        if (token && /\\btag\\b/.test(token.type))\n            return false;\n        \n        var result = actions.run(this.action, editorProxy);\n    } catch(e) {\n        editor._signal(\"changeStatus\", typeof e == \"string\" ? e : e.message);\n        console.log(e);\n        result = false;\n    }\n    return result;\n};\n\nfor (var command in keymap) {\n    exports.commands.addCommand({\n        name: \"emmet:\" + command,\n        action: command,\n        bindKey: keymap[command],\n        exec: exports.runEmmetCommand,\n        multiSelectAction: \"forEach\"\n    });\n}\n\nexports.updateCommands = function(editor, enabled) {\n    if (enabled) {\n        editor.keyBinding.addKeyboardHandler(exports.commands);\n    } else {\n        editor.keyBinding.removeKeyboardHandler(exports.commands);\n    }\n};\n\nexports.isSupportedMode = function(modeId) {\n    return modeId && /css|less|scss|sass|stylus|html|php|twig|ejs/.test(modeId);\n};\n\nvar onChangeMode = function(e, target) {\n    var editor = target;\n    if (!editor)\n        return;\n    var enabled = exports.isSupportedMode(editor.session.$modeId);\n    if (e.enableEmmet === false)\n        enabled = false;\n    if (enabled) {\n        if (typeof emmetPath == \"string\") {\n            require(\"ace/config\").loadModule(emmetPath, function() {\n                emmetPath = null;\n            });\n        }\n    }\n    exports.updateCommands(editor, enabled);\n};\n\nexports.AceEmmetEditor = AceEmmetEditor;\nrequire(\"ace/config\").defineOptions(Editor.prototype, \"editor\", {\n    enableEmmet: {\n        set: function(val) {\n            this[val ? \"on\" : \"removeListener\"](\"changeMode\", onChangeMode);\n            onChangeMode({enableEmmet: !!val}, this);\n        },\n        value: true\n    }\n});\n\nexports.setCore = function(e) {\n    if (typeof e == \"string\")\n       emmetPath = e;\n    else\n       emmet = e;\n};\n});\n                (function() {\n                    ace.require([\"ace/ext/emmet\"], function() {});\n                })();\n            "
  },
  {
    "path": "browser/plugins/ace/src-noconflict/ext-error_marker.js",
    "content": "\n;\n                (function() {\n                    ace.require([\"ace/ext/error_marker\"], function() {});\n                })();\n            "
  },
  {
    "path": "browser/plugins/ace/src-noconflict/ext-keybinding_menu.js",
    "content": "ace.define(\"ace/ext/menu_tools/overlay_page\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n'use strict';\nvar dom = require(\"../../lib/dom\");\nvar cssText = \"#ace_settingsmenu, #kbshortcutmenu {\\\nbackground-color: #F7F7F7;\\\ncolor: black;\\\nbox-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\\\npadding: 1em 0.5em 2em 1em;\\\noverflow: auto;\\\nposition: absolute;\\\nmargin: 0;\\\nbottom: 0;\\\nright: 0;\\\ntop: 0;\\\nz-index: 9991;\\\ncursor: default;\\\n}\\\n.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\\\nbox-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\\\nbackground-color: rgba(255, 255, 255, 0.6);\\\ncolor: black;\\\n}\\\n.ace_optionsMenuEntry:hover {\\\nbackground-color: rgba(100, 100, 100, 0.1);\\\n-webkit-transition: all 0.5s;\\\ntransition: all 0.3s\\\n}\\\n.ace_closeButton {\\\nbackground: rgba(245, 146, 146, 0.5);\\\nborder: 1px solid #F48A8A;\\\nborder-radius: 50%;\\\npadding: 7px;\\\nposition: absolute;\\\nright: -8px;\\\ntop: -8px;\\\nz-index: 1000;\\\n}\\\n.ace_closeButton{\\\nbackground: rgba(245, 146, 146, 0.9);\\\n}\\\n.ace_optionsMenuKey {\\\ncolor: darkslateblue;\\\nfont-weight: bold;\\\n}\\\n.ace_optionsMenuCommand {\\\ncolor: darkcyan;\\\nfont-weight: normal;\\\n}\";\ndom.importCssString(cssText);\nmodule.exports.overlayPage = function overlayPage(editor, contentElement, top, right, bottom, left) {\n    top = top ? 'top: ' + top + ';' : '';\n    bottom = bottom ? 'bottom: ' + bottom + ';' : '';\n    right = right ? 'right: ' + right + ';' : '';\n    left = left ? 'left: ' + left + ';' : '';\n\n    var closer = document.createElement('div');\n    var contentContainer = document.createElement('div');\n\n    function documentEscListener(e) {\n        if (e.keyCode === 27) {\n            closer.click();\n        }\n    }\n\n    closer.style.cssText = 'margin: 0; padding: 0; ' +\n        'position: fixed; top:0; bottom:0; left:0; right:0;' +\n        'z-index: 9990; ' +\n        'background-color: rgba(0, 0, 0, 0.3);';\n    closer.addEventListener('click', function() {\n        document.removeEventListener('keydown', documentEscListener);\n        closer.parentNode.removeChild(closer);\n        editor.focus();\n        closer = null;\n    });\n    document.addEventListener('keydown', documentEscListener);\n\n    contentContainer.style.cssText = top + right + bottom + left;\n    contentContainer.addEventListener('click', function(e) {\n        e.stopPropagation();\n    });\n\n    var wrapper = dom.createElement(\"div\");\n    wrapper.style.position = \"relative\";\n    \n    var closeButton = dom.createElement(\"div\");\n    closeButton.className = \"ace_closeButton\";\n    closeButton.addEventListener('click', function() {\n        closer.click();\n    });\n    \n    wrapper.appendChild(closeButton);\n    contentContainer.appendChild(wrapper);\n    \n    contentContainer.appendChild(contentElement);\n    closer.appendChild(contentContainer);\n    document.body.appendChild(closer);\n    editor.blur();\n};\n\n});\n\nace.define(\"ace/ext/menu_tools/get_editor_keyboard_shortcuts\",[\"require\",\"exports\",\"module\",\"ace/lib/keys\"], function(require, exports, module) {\n\"use strict\";\nvar keys = require(\"../../lib/keys\");\nmodule.exports.getEditorKeybordShortcuts = function(editor) {\n    var KEY_MODS = keys.KEY_MODS;\n    var keybindings = [];\n    var commandMap = {};\n    editor.keyBinding.$handlers.forEach(function(handler) {\n        var ckb = handler.commandKeyBinding;\n        for (var i in ckb) {\n            var key = i.replace(/(^|-)\\w/g, function(x) { return x.toUpperCase(); });\n            var commands = ckb[i];\n            if (!Array.isArray(commands))\n                commands = [commands];\n            commands.forEach(function(command) {\n                if (typeof command != \"string\")\n                    command  = command.name\n                if (commandMap[command]) {\n                    commandMap[command].key += \"|\" + key;\n                } else {\n                    commandMap[command] = {key: key, command: command};\n                    keybindings.push(commandMap[command]);\n                }         \n            });\n        }\n    });\n    return keybindings;\n};\n\n});\n\nace.define(\"ace/ext/keybinding_menu\",[\"require\",\"exports\",\"module\",\"ace/editor\",\"ace/ext/menu_tools/overlay_page\",\"ace/ext/menu_tools/get_editor_keyboard_shortcuts\"], function(require, exports, module) {\n    \"use strict\";\n    var Editor = require(\"ace/editor\").Editor;\n    function showKeyboardShortcuts (editor) {\n        if(!document.getElementById('kbshortcutmenu')) {\n            var overlayPage = require('./menu_tools/overlay_page').overlayPage;\n            var getEditorKeybordShortcuts = require('./menu_tools/get_editor_keyboard_shortcuts').getEditorKeybordShortcuts;\n            var kb = getEditorKeybordShortcuts(editor);\n            var el = document.createElement('div');\n            var commands = kb.reduce(function(previous, current) {\n                return previous + '<div class=\"ace_optionsMenuEntry\"><span class=\"ace_optionsMenuCommand\">' \n                    + current.command + '</span> : '\n                    + '<span class=\"ace_optionsMenuKey\">' + current.key + '</span></div>';\n            }, '');\n\n            el.id = 'kbshortcutmenu';\n            el.innerHTML = '<h1>Keyboard Shortcuts</h1>' + commands + '</div>';\n            overlayPage(editor, el, '0', '0', '0', null);\n        }\n    };\n    module.exports.init = function(editor) {\n        Editor.prototype.showKeyboardShortcuts = function() {\n            showKeyboardShortcuts(this);\n        };\n        editor.commands.addCommands([{\n            name: \"showKeyboardShortcuts\",\n            bindKey: {win: \"Ctrl-Alt-h\", mac: \"Command-Alt-h\"},\n            exec: function(editor, line) {\n                editor.showKeyboardShortcuts();\n            }\n        }]);\n    };\n\n});\n                (function() {\n                    ace.require([\"ace/ext/keybinding_menu\"], function() {});\n                })();\n            "
  },
  {
    "path": "browser/plugins/ace/src-noconflict/ext-language_tools.js",
    "content": "ace.define(\"ace/snippets\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\",\"ace/lib/lang\",\"ace/range\",\"ace/anchor\",\"ace/keyboard/hash_handler\",\"ace/tokenizer\",\"ace/lib/dom\",\"ace/editor\"], function(require, exports, module) {\n\"use strict\";\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar lang = require(\"./lib/lang\");\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\nvar HashHandler = require(\"./keyboard/hash_handler\").HashHandler;\nvar Tokenizer = require(\"./tokenizer\").Tokenizer;\nvar comparePoints = Range.comparePoints;\n\nvar SnippetManager = function() {\n    this.snippetMap = {};\n    this.snippetNameMap = {};\n};\n\n(function() {\n    oop.implement(this, EventEmitter);\n    \n    this.getTokenizer = function() {\n        function TabstopToken(str, _, stack) {\n            str = str.substr(1);\n            if (/^\\d+$/.test(str) && !stack.inFormatString)\n                return [{tabstopId: parseInt(str, 10)}];\n            return [{text: str}];\n        }\n        function escape(ch) {\n            return \"(?:[^\\\\\\\\\" + ch + \"]|\\\\\\\\.)\";\n        }\n        SnippetManager.$tokenizer = new Tokenizer({\n            start: [\n                {regex: /:/, onMatch: function(val, state, stack) {\n                    if (stack.length && stack[0].expectIf) {\n                        stack[0].expectIf = false;\n                        stack[0].elseBranch = stack[0];\n                        return [stack[0]];\n                    }\n                    return \":\";\n                }},\n                {regex: /\\\\./, onMatch: function(val, state, stack) {\n                    var ch = val[1];\n                    if (ch == \"}\" && stack.length) {\n                        val = ch;\n                    }else if (\"`$\\\\\".indexOf(ch) != -1) {\n                        val = ch;\n                    } else if (stack.inFormatString) {\n                        if (ch == \"n\")\n                            val = \"\\n\";\n                        else if (ch == \"t\")\n                            val = \"\\n\";\n                        else if (\"ulULE\".indexOf(ch) != -1) {\n                            val = {changeCase: ch, local: ch > \"a\"};\n                        }\n                    }\n\n                    return [val];\n                }},\n                {regex: /}/, onMatch: function(val, state, stack) {\n                    return [stack.length ? stack.shift() : val];\n                }},\n                {regex: /\\$(?:\\d+|\\w+)/, onMatch: TabstopToken},\n                {regex: /\\$\\{[\\dA-Z_a-z]+/, onMatch: function(str, state, stack) {\n                    var t = TabstopToken(str.substr(1), state, stack);\n                    stack.unshift(t[0]);\n                    return t;\n                }, next: \"snippetVar\"},\n                {regex: /\\n/, token: \"newline\", merge: false}\n            ],\n            snippetVar: [\n                {regex: \"\\\\|\" + escape(\"\\\\|\") + \"*\\\\|\", onMatch: function(val, state, stack) {\n                    stack[0].choices = val.slice(1, -1).split(\",\");\n                }, next: \"start\"},\n                {regex: \"/(\" + escape(\"/\") + \"+)/(?:(\" + escape(\"/\") + \"*)/)(\\\\w*):?\",\n                 onMatch: function(val, state, stack) {\n                    var ts = stack[0];\n                    ts.fmtString = val;\n\n                    val = this.splitRegex.exec(val);\n                    ts.guard = val[1];\n                    ts.fmt = val[2];\n                    ts.flag = val[3];\n                    return \"\";\n                }, next: \"start\"},\n                {regex: \"`\" + escape(\"`\") + \"*`\", onMatch: function(val, state, stack) {\n                    stack[0].code = val.splice(1, -1);\n                    return \"\";\n                }, next: \"start\"},\n                {regex: \"\\\\?\", onMatch: function(val, state, stack) {\n                    if (stack[0])\n                        stack[0].expectIf = true;\n                }, next: \"start\"},\n                {regex: \"([^:}\\\\\\\\]|\\\\\\\\.)*:?\", token: \"\", next: \"start\"}\n            ],\n            formatString: [\n                {regex: \"/(\" + escape(\"/\") + \"+)/\", token: \"regex\"},\n                {regex: \"\", onMatch: function(val, state, stack) {\n                    stack.inFormatString = true;\n                }, next: \"start\"}\n            ]\n        });\n        SnippetManager.prototype.getTokenizer = function() {\n            return SnippetManager.$tokenizer;\n        };\n        return SnippetManager.$tokenizer;\n    };\n\n    this.tokenizeTmSnippet = function(str, startState) {\n        return this.getTokenizer().getLineTokens(str, startState).tokens.map(function(x) {\n            return x.value || x;\n        });\n    };\n\n    this.$getDefaultValue = function(editor, name) {\n        if (/^[A-Z]\\d+$/.test(name)) {\n            var i = name.substr(1);\n            return (this.variables[name[0] + \"__\"] || {})[i];\n        }\n        if (/^\\d+$/.test(name)) {\n            return (this.variables.__ || {})[name];\n        }\n        name = name.replace(/^TM_/, \"\");\n\n        if (!editor)\n            return;\n        var s = editor.session;\n        switch(name) {\n            case \"CURRENT_WORD\":\n                var r = s.getWordRange();\n            case \"SELECTION\":\n            case \"SELECTED_TEXT\":\n                return s.getTextRange(r);\n            case \"CURRENT_LINE\":\n                return s.getLine(editor.getCursorPosition().row);\n            case \"PREV_LINE\": // not possible in textmate\n                return s.getLine(editor.getCursorPosition().row - 1);\n            case \"LINE_INDEX\":\n                return editor.getCursorPosition().column;\n            case \"LINE_NUMBER\":\n                return editor.getCursorPosition().row + 1;\n            case \"SOFT_TABS\":\n                return s.getUseSoftTabs() ? \"YES\" : \"NO\";\n            case \"TAB_SIZE\":\n                return s.getTabSize();\n            case \"FILENAME\":\n            case \"FILEPATH\":\n                return \"\";\n            case \"FULLNAME\":\n                return \"Ace\";\n        }\n    };\n    this.variables = {};\n    this.getVariableValue = function(editor, varName) {\n        if (this.variables.hasOwnProperty(varName))\n            return this.variables[varName](editor, varName) || \"\";\n        return this.$getDefaultValue(editor, varName) || \"\";\n    };\n    this.tmStrFormat = function(str, ch, editor) {\n        var flag = ch.flag || \"\";\n        var re = ch.guard;\n        re = new RegExp(re, flag.replace(/[^gi]/, \"\"));\n        var fmtTokens = this.tokenizeTmSnippet(ch.fmt, \"formatString\");\n        var _self = this;\n        var formatted = str.replace(re, function() {\n            _self.variables.__ = arguments;\n            var fmtParts = _self.resolveVariables(fmtTokens, editor);\n            var gChangeCase = \"E\";\n            for (var i  = 0; i < fmtParts.length; i++) {\n                var ch = fmtParts[i];\n                if (typeof ch == \"object\") {\n                    fmtParts[i] = \"\";\n                    if (ch.changeCase && ch.local) {\n                        var next = fmtParts[i + 1];\n                        if (next && typeof next == \"string\") {\n                            if (ch.changeCase == \"u\")\n                                fmtParts[i] = next[0].toUpperCase();\n                            else\n                                fmtParts[i] = next[0].toLowerCase();\n                            fmtParts[i + 1] = next.substr(1);\n                        }\n                    } else if (ch.changeCase) {\n                        gChangeCase = ch.changeCase;\n                    }\n                } else if (gChangeCase == \"U\") {\n                    fmtParts[i] = ch.toUpperCase();\n                } else if (gChangeCase == \"L\") {\n                    fmtParts[i] = ch.toLowerCase();\n                }\n            }\n            return fmtParts.join(\"\");\n        });\n        this.variables.__ = null;\n        return formatted;\n    };\n\n    this.resolveVariables = function(snippet, editor) {\n        var result = [];\n        for (var i = 0; i < snippet.length; i++) {\n            var ch = snippet[i];\n            if (typeof ch == \"string\") {\n                result.push(ch);\n            } else if (typeof ch != \"object\") {\n                continue;\n            } else if (ch.skip) {\n                gotoNext(ch);\n            } else if (ch.processed < i) {\n                continue;\n            } else if (ch.text) {\n                var value = this.getVariableValue(editor, ch.text);\n                if (value && ch.fmtString)\n                    value = this.tmStrFormat(value, ch);\n                ch.processed = i;\n                if (ch.expectIf == null) {\n                    if (value) {\n                        result.push(value);\n                        gotoNext(ch);\n                    }\n                } else {\n                    if (value) {\n                        ch.skip = ch.elseBranch;\n                    } else\n                        gotoNext(ch);\n                }\n            } else if (ch.tabstopId != null) {\n                result.push(ch);\n            } else if (ch.changeCase != null) {\n                result.push(ch);\n            }\n        }\n        function gotoNext(ch) {\n            var i1 = snippet.indexOf(ch, i + 1);\n            if (i1 != -1)\n                i = i1;\n        }\n        return result;\n    };\n\n    this.insertSnippetForSelection = function(editor, snippetText) {\n        var cursor = editor.getCursorPosition();\n        var line = editor.session.getLine(cursor.row);\n        var tabString = editor.session.getTabString();\n        var indentString = line.match(/^\\s*/)[0];\n        \n        if (cursor.column < indentString.length)\n            indentString = indentString.slice(0, cursor.column);\n\n        var tokens = this.tokenizeTmSnippet(snippetText);\n        tokens = this.resolveVariables(tokens, editor);\n        tokens = tokens.map(function(x) {\n            if (x == \"\\n\")\n                return x + indentString;\n            if (typeof x == \"string\")\n                return x.replace(/\\t/g, tabString);\n            return x;\n        });\n        var tabstops = [];\n        tokens.forEach(function(p, i) {\n            if (typeof p != \"object\")\n                return;\n            var id = p.tabstopId;\n            var ts = tabstops[id];\n            if (!ts) {\n                ts = tabstops[id] = [];\n                ts.index = id;\n                ts.value = \"\";\n            }\n            if (ts.indexOf(p) !== -1)\n                return;\n            ts.push(p);\n            var i1 = tokens.indexOf(p, i + 1);\n            if (i1 === -1)\n                return;\n\n            var value = tokens.slice(i + 1, i1);\n            var isNested = value.some(function(t) {return typeof t === \"object\"});          \n            if (isNested && !ts.value) {\n                ts.value = value;\n            } else if (value.length && (!ts.value || typeof ts.value !== \"string\")) {\n                ts.value = value.join(\"\");\n            }\n        });\n        tabstops.forEach(function(ts) {ts.length = 0});\n        var expanding = {};\n        function copyValue(val) {\n            var copy = [];\n            for (var i = 0; i < val.length; i++) {\n                var p = val[i];\n                if (typeof p == \"object\") {\n                    if (expanding[p.tabstopId])\n                        continue;\n                    var j = val.lastIndexOf(p, i - 1);\n                    p = copy[j] || {tabstopId: p.tabstopId};\n                }\n                copy[i] = p;\n            }\n            return copy;\n        }\n        for (var i = 0; i < tokens.length; i++) {\n            var p = tokens[i];\n            if (typeof p != \"object\")\n                continue;\n            var id = p.tabstopId;\n            var i1 = tokens.indexOf(p, i + 1);\n            if (expanding[id]) {\n                if (expanding[id] === p)\n                    expanding[id] = null;\n                continue;\n            }\n            \n            var ts = tabstops[id];\n            var arg = typeof ts.value == \"string\" ? [ts.value] : copyValue(ts.value);\n            arg.unshift(i + 1, Math.max(0, i1 - i));\n            arg.push(p);\n            expanding[id] = p;\n            tokens.splice.apply(tokens, arg);\n\n            if (ts.indexOf(p) === -1)\n                ts.push(p);\n        }\n        var row = 0, column = 0;\n        var text = \"\";\n        tokens.forEach(function(t) {\n            if (typeof t === \"string\") {\n                if (t[0] === \"\\n\"){\n                    column = t.length - 1;\n                    row ++;\n                } else\n                    column += t.length;\n                text += t;\n            } else {\n                if (!t.start)\n                    t.start = {row: row, column: column};\n                else\n                    t.end = {row: row, column: column};\n            }\n        });\n        var range = editor.getSelectionRange();\n        var end = editor.session.replace(range, text);\n\n        var tabstopManager = new TabstopManager(editor);\n        var selectionId = editor.inVirtualSelectionMode && editor.selection.index;\n        tabstopManager.addTabstops(tabstops, range.start, end, selectionId);\n    };\n    \n    this.insertSnippet = function(editor, snippetText) {\n        var self = this;\n        if (editor.inVirtualSelectionMode)\n            return self.insertSnippetForSelection(editor, snippetText);\n        \n        editor.forEachSelection(function() {\n            self.insertSnippetForSelection(editor, snippetText);\n        }, null, {keepOrder: true});\n        \n        if (editor.tabstopManager)\n            editor.tabstopManager.tabNext();\n    };\n\n    this.$getScope = function(editor) {\n        var scope = editor.session.$mode.$id || \"\";\n        scope = scope.split(\"/\").pop();\n        if (scope === \"html\" || scope === \"php\") {\n            if (scope === \"php\" && !editor.session.$mode.inlinePhp) \n                scope = \"html\";\n            var c = editor.getCursorPosition();\n            var state = editor.session.getState(c.row);\n            if (typeof state === \"object\") {\n                state = state[0];\n            }\n            if (state.substring) {\n                if (state.substring(0, 3) == \"js-\")\n                    scope = \"javascript\";\n                else if (state.substring(0, 4) == \"css-\")\n                    scope = \"css\";\n                else if (state.substring(0, 4) == \"php-\")\n                    scope = \"php\";\n            }\n        }\n        \n        return scope;\n    };\n\n    this.getActiveScopes = function(editor) {\n        var scope = this.$getScope(editor);\n        var scopes = [scope];\n        var snippetMap = this.snippetMap;\n        if (snippetMap[scope] && snippetMap[scope].includeScopes) {\n            scopes.push.apply(scopes, snippetMap[scope].includeScopes);\n        }\n        scopes.push(\"_\");\n        return scopes;\n    };\n\n    this.expandWithTab = function(editor, options) {\n        var self = this;\n        var result = editor.forEachSelection(function() {\n            return self.expandSnippetForSelection(editor, options);\n        }, null, {keepOrder: true});\n        if (result && editor.tabstopManager)\n            editor.tabstopManager.tabNext();\n        return result;\n    };\n    \n    this.expandSnippetForSelection = function(editor, options) {\n        var cursor = editor.getCursorPosition();\n        var line = editor.session.getLine(cursor.row);\n        var before = line.substring(0, cursor.column);\n        var after = line.substr(cursor.column);\n\n        var snippetMap = this.snippetMap;\n        var snippet;\n        this.getActiveScopes(editor).some(function(scope) {\n            var snippets = snippetMap[scope];\n            if (snippets)\n                snippet = this.findMatchingSnippet(snippets, before, after);\n            return !!snippet;\n        }, this);\n        if (!snippet)\n            return false;\n        if (options && options.dryRun)\n            return true;\n        editor.session.doc.removeInLine(cursor.row,\n            cursor.column - snippet.replaceBefore.length,\n            cursor.column + snippet.replaceAfter.length\n        );\n\n        this.variables.M__ = snippet.matchBefore;\n        this.variables.T__ = snippet.matchAfter;\n        this.insertSnippetForSelection(editor, snippet.content);\n\n        this.variables.M__ = this.variables.T__ = null;\n        return true;\n    };\n\n    this.findMatchingSnippet = function(snippetList, before, after) {\n        for (var i = snippetList.length; i--;) {\n            var s = snippetList[i];\n            if (s.startRe && !s.startRe.test(before))\n                continue;\n            if (s.endRe && !s.endRe.test(after))\n                continue;\n            if (!s.startRe && !s.endRe)\n                continue;\n\n            s.matchBefore = s.startRe ? s.startRe.exec(before) : [\"\"];\n            s.matchAfter = s.endRe ? s.endRe.exec(after) : [\"\"];\n            s.replaceBefore = s.triggerRe ? s.triggerRe.exec(before)[0] : \"\";\n            s.replaceAfter = s.endTriggerRe ? s.endTriggerRe.exec(after)[0] : \"\";\n            return s;\n        }\n    };\n\n    this.snippetMap = {};\n    this.snippetNameMap = {};\n    this.register = function(snippets, scope) {\n        var snippetMap = this.snippetMap;\n        var snippetNameMap = this.snippetNameMap;\n        var self = this;\n        \n        if (!snippets) \n            snippets = [];\n        \n        function wrapRegexp(src) {\n            if (src && !/^\\^?\\(.*\\)\\$?$|^\\\\b$/.test(src))\n                src = \"(?:\" + src + \")\";\n\n            return src || \"\";\n        }\n        function guardedRegexp(re, guard, opening) {\n            re = wrapRegexp(re);\n            guard = wrapRegexp(guard);\n            if (opening) {\n                re = guard + re;\n                if (re && re[re.length - 1] != \"$\")\n                    re = re + \"$\";\n            } else {\n                re = re + guard;\n                if (re && re[0] != \"^\")\n                    re = \"^\" + re;\n            }\n            return new RegExp(re);\n        }\n\n        function addSnippet(s) {\n            if (!s.scope)\n                s.scope = scope || \"_\";\n            scope = s.scope;\n            if (!snippetMap[scope]) {\n                snippetMap[scope] = [];\n                snippetNameMap[scope] = {};\n            }\n\n            var map = snippetNameMap[scope];\n            if (s.name) {\n                var old = map[s.name];\n                if (old)\n                    self.unregister(old);\n                map[s.name] = s;\n            }\n            snippetMap[scope].push(s);\n\n            if (s.tabTrigger && !s.trigger) {\n                if (!s.guard && /^\\w/.test(s.tabTrigger))\n                    s.guard = \"\\\\b\";\n                s.trigger = lang.escapeRegExp(s.tabTrigger);\n            }\n\n            s.startRe = guardedRegexp(s.trigger, s.guard, true);\n            s.triggerRe = new RegExp(s.trigger, \"\", true);\n\n            s.endRe = guardedRegexp(s.endTrigger, s.endGuard, true);\n            s.endTriggerRe = new RegExp(s.endTrigger, \"\", true);\n        }\n\n        if (snippets && snippets.content)\n            addSnippet(snippets);\n        else if (Array.isArray(snippets))\n            snippets.forEach(addSnippet);\n        \n        this._signal(\"registerSnippets\", {scope: scope});\n    };\n    this.unregister = function(snippets, scope) {\n        var snippetMap = this.snippetMap;\n        var snippetNameMap = this.snippetNameMap;\n\n        function removeSnippet(s) {\n            var nameMap = snippetNameMap[s.scope||scope];\n            if (nameMap && nameMap[s.name]) {\n                delete nameMap[s.name];\n                var map = snippetMap[s.scope||scope];\n                var i = map && map.indexOf(s);\n                if (i >= 0)\n                    map.splice(i, 1);\n            }\n        }\n        if (snippets.content)\n            removeSnippet(snippets);\n        else if (Array.isArray(snippets))\n            snippets.forEach(removeSnippet);\n    };\n    this.parseSnippetFile = function(str) {\n        str = str.replace(/\\r/g, \"\");\n        var list = [], snippet = {};\n        var re = /^#.*|^({[\\s\\S]*})\\s*$|^(\\S+) (.*)$|^((?:\\n*\\t.*)+)/gm;\n        var m;\n        while (m = re.exec(str)) {\n            if (m[1]) {\n                try {\n                    snippet = JSON.parse(m[1]);\n                    list.push(snippet);\n                } catch (e) {}\n            } if (m[4]) {\n                snippet.content = m[4].replace(/^\\t/gm, \"\");\n                list.push(snippet);\n                snippet = {};\n            } else {\n                var key = m[2], val = m[3];\n                if (key == \"regex\") {\n                    var guardRe = /\\/((?:[^\\/\\\\]|\\\\.)*)|$/g;\n                    snippet.guard = guardRe.exec(val)[1];\n                    snippet.trigger = guardRe.exec(val)[1];\n                    snippet.endTrigger = guardRe.exec(val)[1];\n                    snippet.endGuard = guardRe.exec(val)[1];\n                } else if (key == \"snippet\") {\n                    snippet.tabTrigger = val.match(/^\\S*/)[0];\n                    if (!snippet.name)\n                        snippet.name = val;\n                } else {\n                    snippet[key] = val;\n                }\n            }\n        }\n        return list;\n    };\n    this.getSnippetByName = function(name, editor) {\n        var snippetMap = this.snippetNameMap;\n        var snippet;\n        this.getActiveScopes(editor).some(function(scope) {\n            var snippets = snippetMap[scope];\n            if (snippets)\n                snippet = snippets[name];\n            return !!snippet;\n        }, this);\n        return snippet;\n    };\n\n}).call(SnippetManager.prototype);\n\n\nvar TabstopManager = function(editor) {\n    if (editor.tabstopManager)\n        return editor.tabstopManager;\n    editor.tabstopManager = this;\n    this.$onChange = this.onChange.bind(this);\n    this.$onChangeSelection = lang.delayedCall(this.onChangeSelection.bind(this)).schedule;\n    this.$onChangeSession = this.onChangeSession.bind(this);\n    this.$onAfterExec = this.onAfterExec.bind(this);\n    this.attach(editor);\n};\n(function() {\n    this.attach = function(editor) {\n        this.index = 0;\n        this.ranges = [];\n        this.tabstops = [];\n        this.$openTabstops = null;\n        this.selectedTabstop = null;\n\n        this.editor = editor;\n        this.editor.on(\"change\", this.$onChange);\n        this.editor.on(\"changeSelection\", this.$onChangeSelection);\n        this.editor.on(\"changeSession\", this.$onChangeSession);\n        this.editor.commands.on(\"afterExec\", this.$onAfterExec);\n        this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler);\n    };\n    this.detach = function() {\n        this.tabstops.forEach(this.removeTabstopMarkers, this);\n        this.ranges = null;\n        this.tabstops = null;\n        this.selectedTabstop = null;\n        this.editor.removeListener(\"change\", this.$onChange);\n        this.editor.removeListener(\"changeSelection\", this.$onChangeSelection);\n        this.editor.removeListener(\"changeSession\", this.$onChangeSession);\n        this.editor.commands.removeListener(\"afterExec\", this.$onAfterExec);\n        this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);\n        this.editor.tabstopManager = null;\n        this.editor = null;\n    };\n\n    this.onChange = function(e) {\n        var changeRange = e.data.range;\n        var isRemove = e.data.action[0] == \"r\";\n        var start = changeRange.start;\n        var end = changeRange.end;\n        var startRow = start.row;\n        var endRow = end.row;\n        var lineDif = endRow - startRow;\n        var colDiff = end.column - start.column;\n\n        if (isRemove) {\n            lineDif = -lineDif;\n            colDiff = -colDiff;\n        }\n        if (!this.$inChange && isRemove) {\n            var ts = this.selectedTabstop;\n            var changedOutside = ts && !ts.some(function(r) {\n                return comparePoints(r.start, start) <= 0 && comparePoints(r.end, end) >= 0;\n            });\n            if (changedOutside)\n                return this.detach();\n        }\n        var ranges = this.ranges;\n        for (var i = 0; i < ranges.length; i++) {\n            var r = ranges[i];\n            if (r.end.row < start.row)\n                continue;\n\n            if (isRemove && comparePoints(start, r.start) < 0 && comparePoints(end, r.end) > 0) {\n                this.removeRange(r);\n                i--;\n                continue;\n            }\n\n            if (r.start.row == startRow && r.start.column > start.column)\n                r.start.column += colDiff;\n            if (r.end.row == startRow && r.end.column >= start.column)\n                r.end.column += colDiff;\n            if (r.start.row >= startRow)\n                r.start.row += lineDif;\n            if (r.end.row >= startRow)\n                r.end.row += lineDif;\n\n            if (comparePoints(r.start, r.end) > 0)\n                this.removeRange(r);\n        }\n        if (!ranges.length)\n            this.detach();\n    };\n    this.updateLinkedFields = function() {\n        var ts = this.selectedTabstop;\n        if (!ts || !ts.hasLinkedRanges)\n            return;\n        this.$inChange = true;\n        var session = this.editor.session;\n        var text = session.getTextRange(ts.firstNonLinked);\n        for (var i = ts.length; i--;) {\n            var range = ts[i];\n            if (!range.linked)\n                continue;\n            var fmt = exports.snippetManager.tmStrFormat(text, range.original);\n            session.replace(range, fmt);\n        }\n        this.$inChange = false;\n    };\n    this.onAfterExec = function(e) {\n        if (e.command && !e.command.readOnly)\n            this.updateLinkedFields();\n    };\n    this.onChangeSelection = function() {\n        if (!this.editor)\n            return;\n        var lead = this.editor.selection.lead;\n        var anchor = this.editor.selection.anchor;\n        var isEmpty = this.editor.selection.isEmpty();\n        for (var i = this.ranges.length; i--;) {\n            if (this.ranges[i].linked)\n                continue;\n            var containsLead = this.ranges[i].contains(lead.row, lead.column);\n            var containsAnchor = isEmpty || this.ranges[i].contains(anchor.row, anchor.column);\n            if (containsLead && containsAnchor)\n                return;\n        }\n        this.detach();\n    };\n    this.onChangeSession = function() {\n        this.detach();\n    };\n    this.tabNext = function(dir) {\n        var max = this.tabstops.length;\n        var index = this.index + (dir || 1);\n        index = Math.min(Math.max(index, 1), max);\n        if (index == max)\n            index = 0;\n        this.selectTabstop(index);\n        if (index === 0)\n            this.detach();\n    };\n    this.selectTabstop = function(index) {\n        this.$openTabstops = null;\n        var ts = this.tabstops[this.index];\n        if (ts)\n            this.addTabstopMarkers(ts);\n        this.index = index;\n        ts = this.tabstops[this.index];\n        if (!ts || !ts.length)\n            return;\n        \n        this.selectedTabstop = ts;\n        if (!this.editor.inVirtualSelectionMode) {        \n            var sel = this.editor.multiSelect;\n            sel.toSingleRange(ts.firstNonLinked.clone());\n            for (var i = ts.length; i--;) {\n                if (ts.hasLinkedRanges && ts[i].linked)\n                    continue;\n                sel.addRange(ts[i].clone(), true);\n            }\n            if (sel.ranges[0])\n                sel.addRange(sel.ranges[0].clone());\n        } else {\n            this.editor.selection.setRange(ts.firstNonLinked);\n        }\n        \n        this.editor.keyBinding.addKeyboardHandler(this.keyboardHandler);\n    };\n    this.addTabstops = function(tabstops, start, end) {\n        if (!this.$openTabstops)\n            this.$openTabstops = [];\n        if (!tabstops[0]) {\n            var p = Range.fromPoints(end, end);\n            moveRelative(p.start, start);\n            moveRelative(p.end, start);\n            tabstops[0] = [p];\n            tabstops[0].index = 0;\n        }\n\n        var i = this.index;\n        var arg = [i + 1, 0];\n        var ranges = this.ranges;\n        tabstops.forEach(function(ts, index) {\n            var dest = this.$openTabstops[index] || ts;\n                \n            for (var i = ts.length; i--;) {\n                var p = ts[i];\n                var range = Range.fromPoints(p.start, p.end || p.start);\n                movePoint(range.start, start);\n                movePoint(range.end, start);\n                range.original = p;\n                range.tabstop = dest;\n                ranges.push(range);\n                if (dest != ts)\n                    dest.unshift(range);\n                else\n                    dest[i] = range;\n                if (p.fmtString) {\n                    range.linked = true;\n                    dest.hasLinkedRanges = true;\n                } else if (!dest.firstNonLinked)\n                    dest.firstNonLinked = range;\n            }\n            if (!dest.firstNonLinked)\n                dest.hasLinkedRanges = false;\n            if (dest === ts) {\n                arg.push(dest);\n                this.$openTabstops[index] = dest;\n            }\n            this.addTabstopMarkers(dest);\n        }, this);\n        \n        if (arg.length > 2) {\n            if (this.tabstops.length)\n                arg.push(arg.splice(2, 1)[0]);\n            this.tabstops.splice.apply(this.tabstops, arg);\n        }\n    };\n\n    this.addTabstopMarkers = function(ts) {\n        var session = this.editor.session;\n        ts.forEach(function(range) {\n            if  (!range.markerId)\n                range.markerId = session.addMarker(range, \"ace_snippet-marker\", \"text\");\n        });\n    };\n    this.removeTabstopMarkers = function(ts) {\n        var session = this.editor.session;\n        ts.forEach(function(range) {\n            session.removeMarker(range.markerId);\n            range.markerId = null;\n        });\n    };\n    this.removeRange = function(range) {\n        var i = range.tabstop.indexOf(range);\n        range.tabstop.splice(i, 1);\n        i = this.ranges.indexOf(range);\n        this.ranges.splice(i, 1);\n        this.editor.session.removeMarker(range.markerId);\n        if (!range.tabstop.length) {\n            i = this.tabstops.indexOf(range.tabstop);\n            if (i != -1)\n                this.tabstops.splice(i, 1);\n            if (!this.tabstops.length)\n                this.detach();\n        }\n    };\n\n    this.keyboardHandler = new HashHandler();\n    this.keyboardHandler.bindKeys({\n        \"Tab\": function(ed) {\n            if (exports.snippetManager && exports.snippetManager.expandWithTab(ed)) {\n                return;\n            }\n\n            ed.tabstopManager.tabNext(1);\n        },\n        \"Shift-Tab\": function(ed) {\n            ed.tabstopManager.tabNext(-1);\n        },\n        \"Esc\": function(ed) {\n            ed.tabstopManager.detach();\n        },\n        \"Return\": function(ed) {\n            return false;\n        }\n    });\n}).call(TabstopManager.prototype);\n\n\n\nvar changeTracker = {};\nchangeTracker.onChange = Anchor.prototype.onChange;\nchangeTracker.setPosition = function(row, column) {\n    this.pos.row = row;\n    this.pos.column = column;\n};\nchangeTracker.update = function(pos, delta, $insertRight) {\n    this.$insertRight = $insertRight;\n    this.pos = pos; \n    this.onChange(delta);\n};\n\nvar movePoint = function(point, diff) {\n    if (point.row == 0)\n        point.column += diff.column;\n    point.row += diff.row;\n};\n\nvar moveRelative = function(point, start) {\n    if (point.row == start.row)\n        point.column -= start.column;\n    point.row -= start.row;\n};\n\n\nrequire(\"./lib/dom\").importCssString(\"\\\n.ace_snippet-marker {\\\n    -moz-box-sizing: border-box;\\\n    box-sizing: border-box;\\\n    background: rgba(194, 193, 208, 0.09);\\\n    border: 1px dotted rgba(211, 208, 235, 0.62);\\\n    position: absolute;\\\n}\");\n\nexports.snippetManager = new SnippetManager();\n\n\nvar Editor = require(\"./editor\").Editor;\n(function() {\n    this.insertSnippet = function(content, options) {\n        return exports.snippetManager.insertSnippet(this, content, options);\n    };\n    this.expandSnippet = function(options) {\n        return exports.snippetManager.expandWithTab(this, options);\n    };\n}).call(Editor.prototype);\n\n});\n\nace.define(\"ace/autocomplete/popup\",[\"require\",\"exports\",\"module\",\"ace/edit_session\",\"ace/virtual_renderer\",\"ace/editor\",\"ace/range\",\"ace/lib/event\",\"ace/lib/lang\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar EditSession = require(\"../edit_session\").EditSession;\nvar Renderer = require(\"../virtual_renderer\").VirtualRenderer;\nvar Editor = require(\"../editor\").Editor;\nvar Range = require(\"../range\").Range;\nvar event = require(\"../lib/event\");\nvar lang = require(\"../lib/lang\");\nvar dom = require(\"../lib/dom\");\n\nvar $singleLineEditor = function(el) {\n    var renderer = new Renderer(el);\n\n    renderer.$maxLines = 4;\n\n    var editor = new Editor(renderer);\n\n    editor.setHighlightActiveLine(false);\n    editor.setShowPrintMargin(false);\n    editor.renderer.setShowGutter(false);\n    editor.renderer.setHighlightGutterLine(false);\n\n    editor.$mouseHandler.$focusWaitTimout = 0;\n    editor.$highlightTagPending = true;\n\n    return editor;\n};\n\nvar AcePopup = function(parentNode) {\n    var el = dom.createElement(\"div\");\n    var popup = new $singleLineEditor(el);\n\n    if (parentNode)\n        parentNode.appendChild(el);\n    el.style.display = \"none\";\n    popup.renderer.content.style.cursor = \"default\";\n    popup.renderer.setStyle(\"ace_autocomplete\");\n\n    popup.setOption(\"displayIndentGuides\", false);\n    popup.setOption(\"dragDelay\", 150);\n\n    var noop = function(){};\n\n    popup.focus = noop;\n    popup.$isFocused = true;\n\n    popup.renderer.$cursorLayer.restartTimer = noop;\n    popup.renderer.$cursorLayer.element.style.opacity = 0;\n\n    popup.renderer.$maxLines = 8;\n    popup.renderer.$keepTextAreaAtCursor = false;\n\n    popup.setHighlightActiveLine(false);\n    popup.session.highlight(\"\");\n    popup.session.$searchHighlight.clazz = \"ace_highlight-marker\";\n\n    popup.on(\"mousedown\", function(e) {\n        var pos = e.getDocumentPosition();\n        popup.selection.moveToPosition(pos);\n        selectionMarker.start.row = selectionMarker.end.row = pos.row;\n        e.stop();\n    });\n\n    var lastMouseEvent;\n    var hoverMarker = new Range(-1,0,-1,Infinity);\n    var selectionMarker = new Range(-1,0,-1,Infinity);\n    selectionMarker.id = popup.session.addMarker(selectionMarker, \"ace_active-line\", \"fullLine\");\n    popup.setSelectOnHover = function(val) {\n        if (!val) {\n            hoverMarker.id = popup.session.addMarker(hoverMarker, \"ace_line-hover\", \"fullLine\");\n        } else if (hoverMarker.id) {\n            popup.session.removeMarker(hoverMarker.id);\n            hoverMarker.id = null;\n        }\n    };\n    popup.setSelectOnHover(false);\n    popup.on(\"mousemove\", function(e) {\n        if (!lastMouseEvent) {\n            lastMouseEvent = e;\n            return;\n        }\n        if (lastMouseEvent.x == e.x && lastMouseEvent.y == e.y) {\n            return;\n        }\n        lastMouseEvent = e;\n        lastMouseEvent.scrollTop = popup.renderer.scrollTop;\n        var row = lastMouseEvent.getDocumentPosition().row;\n        if (hoverMarker.start.row != row) {\n            if (!hoverMarker.id)\n                popup.setRow(row);\n            setHoverMarker(row);\n        }\n    });\n    popup.renderer.on(\"beforeRender\", function() {\n        if (lastMouseEvent && hoverMarker.start.row != -1) {\n            lastMouseEvent.$pos = null;\n            var row = lastMouseEvent.getDocumentPosition().row;\n            if (!hoverMarker.id)\n                popup.setRow(row);\n            setHoverMarker(row, true);\n        }\n    });\n    popup.renderer.on(\"afterRender\", function() {\n        var row = popup.getRow();\n        var t = popup.renderer.$textLayer;\n        var selected = t.element.childNodes[row - t.config.firstRow];\n        if (selected == t.selectedNode)\n            return;\n        if (t.selectedNode)\n            dom.removeCssClass(t.selectedNode, \"ace_selected\");\n        t.selectedNode = selected;\n        if (selected)\n            dom.addCssClass(selected, \"ace_selected\");\n    });\n    var hideHoverMarker = function() { setHoverMarker(-1) };\n    var setHoverMarker = function(row, suppressRedraw) {\n        if (row !== hoverMarker.start.row) {\n            hoverMarker.start.row = hoverMarker.end.row = row;\n            if (!suppressRedraw)\n                popup.session._emit(\"changeBackMarker\");\n            popup._emit(\"changeHoverMarker\");\n        }\n    };\n    popup.getHoveredRow = function() {\n        return hoverMarker.start.row;\n    };\n\n    event.addListener(popup.container, \"mouseout\", hideHoverMarker);\n    popup.on(\"hide\", hideHoverMarker);\n    popup.on(\"changeSelection\", hideHoverMarker);\n\n    popup.session.doc.getLength = function() {\n        return popup.data.length;\n    };\n    popup.session.doc.getLine = function(i) {\n        var data = popup.data[i];\n        if (typeof data == \"string\")\n            return data;\n        return (data && data.value) || \"\";\n    };\n\n    var bgTokenizer = popup.session.bgTokenizer;\n    bgTokenizer.$tokenizeRow = function(row) {\n        var data = popup.data[row];\n        var tokens = [];\n        if (!data)\n            return tokens;\n        if (typeof data == \"string\")\n            data = {value: data};\n        if (!data.caption)\n            data.caption = data.value || data.name;\n\n        var last = -1;\n        var flag, c;\n        for (var i = 0; i < data.caption.length; i++) {\n            c = data.caption[i];\n            flag = data.matchMask & (1 << i) ? 1 : 0;\n            if (last !== flag) {\n                tokens.push({type: data.className || \"\" + ( flag ? \"completion-highlight\" : \"\"), value: c});\n                last = flag;\n            } else {\n                tokens[tokens.length - 1].value += c;\n            }\n        }\n\n        if (data.meta) {\n            var maxW = popup.renderer.$size.scrollerWidth / popup.renderer.layerConfig.characterWidth;\n            if (data.meta.length + data.caption.length < maxW - 2)\n                tokens.push({type: \"rightAlignedText\", value: data.meta});\n        }\n        return tokens;\n    };\n    bgTokenizer.$updateOnChange = noop;\n    bgTokenizer.start = noop;\n\n    popup.session.$computeWidth = function() {\n        return this.screenWidth = 0;\n    };\n\n    popup.$blockScrolling = Infinity;\n    popup.isOpen = false;\n    popup.isTopdown = false;\n\n    popup.data = [];\n    popup.setData = function(list) {\n        popup.data = list || [];\n        popup.setValue(lang.stringRepeat(\"\\n\", list.length), -1);\n        popup.setRow(0);\n    };\n    popup.getData = function(row) {\n        return popup.data[row];\n    };\n\n    popup.getRow = function() {\n        return selectionMarker.start.row;\n    };\n    popup.setRow = function(line) {\n        line = Math.max(-1, Math.min(this.data.length, line));\n        if (selectionMarker.start.row != line) {\n            popup.selection.clearSelection();\n            selectionMarker.start.row = selectionMarker.end.row = line || 0;\n            popup.session._emit(\"changeBackMarker\");\n            popup.moveCursorTo(line || 0, 0);\n            if (popup.isOpen)\n                popup._signal(\"select\");\n        }\n    };\n\n    popup.on(\"changeSelection\", function() {\n        if (popup.isOpen)\n            popup.setRow(popup.selection.lead.row);\n        popup.renderer.scrollCursorIntoView();\n    });\n\n    popup.hide = function() {\n        this.container.style.display = \"none\";\n        this._signal(\"hide\");\n        popup.isOpen = false;\n    };\n    popup.show = function(pos, lineHeight, topdownOnly) {\n        var el = this.container;\n        var screenHeight = window.innerHeight;\n        var screenWidth = window.innerWidth;\n        var renderer = this.renderer;\n        var maxH = renderer.$maxLines * lineHeight * 1.4;\n        var top = pos.top + this.$borderSize;\n        if (top + maxH > screenHeight - lineHeight && !topdownOnly) {\n            el.style.top = \"\";\n            el.style.bottom = screenHeight - top + \"px\";\n            popup.isTopdown = false;\n        } else {\n            top += lineHeight;\n            el.style.top = top + \"px\";\n            el.style.bottom = \"\";\n            popup.isTopdown = true;\n        }\n\n        el.style.display = \"\";\n        this.renderer.$textLayer.checkForSizeChanges();\n\n        var left = pos.left;\n        if (left + el.offsetWidth > screenWidth)\n            left = screenWidth - el.offsetWidth;\n\n        el.style.left = left + \"px\";\n\n        this._signal(\"show\");\n        lastMouseEvent = null;\n        popup.isOpen = true;\n    };\n\n    popup.getTextLeftOffset = function() {\n        return this.$borderSize + this.renderer.$padding + this.$imageSize;\n    };\n\n    popup.$imageSize = 0;\n    popup.$borderSize = 1;\n\n    return popup;\n};\n\ndom.importCssString(\"\\\n.ace_editor.ace_autocomplete .ace_marker-layer .ace_active-line {\\\n    background-color: #CAD6FA;\\\n    z-index: 1;\\\n}\\\n.ace_editor.ace_autocomplete .ace_line-hover {\\\n    border: 1px solid #abbffe;\\\n    margin-top: -1px;\\\n    background: rgba(233,233,253,0.4);\\\n}\\\n.ace_editor.ace_autocomplete .ace_line-hover {\\\n    position: absolute;\\\n    z-index: 2;\\\n}\\\n.ace_editor.ace_autocomplete .ace_scroller {\\\n   background: none;\\\n   border: none;\\\n   box-shadow: none;\\\n}\\\n.ace_rightAlignedText {\\\n    color: gray;\\\n    display: inline-block;\\\n    position: absolute;\\\n    right: 4px;\\\n    text-align: right;\\\n    z-index: -1;\\\n}\\\n.ace_editor.ace_autocomplete .ace_completion-highlight{\\\n    color: #000;\\\n    text-shadow: 0 0 0.01em;\\\n}\\\n.ace_editor.ace_autocomplete {\\\n    width: 280px;\\\n    z-index: 200000;\\\n    background: #fbfbfb;\\\n    color: #444;\\\n    border: 1px lightgray solid;\\\n    position: fixed;\\\n    box-shadow: 2px 3px 5px rgba(0,0,0,.2);\\\n    line-height: 1.4;\\\n}\");\n\nexports.AcePopup = AcePopup;\n\n});\n\nace.define(\"ace/autocomplete/util\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.parForEach = function(array, fn, callback) {\n    var completed = 0;\n    var arLength = array.length;\n    if (arLength === 0)\n        callback();\n    for (var i = 0; i < arLength; i++) {\n        fn(array[i], function(result, err) {\n            completed++;\n            if (completed === arLength)\n                callback(result, err);\n        });\n    }\n};\n\nvar ID_REGEX = /[a-zA-Z_0-9\\$\\-\\u00A2-\\uFFFF]/;\n\nexports.retrievePrecedingIdentifier = function(text, pos, regex) {\n    regex = regex || ID_REGEX;\n    var buf = [];\n    for (var i = pos-1; i >= 0; i--) {\n        if (regex.test(text[i]))\n            buf.push(text[i]);\n        else\n            break;\n    }\n    return buf.reverse().join(\"\");\n};\n\nexports.retrieveFollowingIdentifier = function(text, pos, regex) {\n    regex = regex || ID_REGEX;\n    var buf = [];\n    for (var i = pos; i < text.length; i++) {\n        if (regex.test(text[i]))\n            buf.push(text[i]);\n        else\n            break;\n    }\n    return buf;\n};\n\n});\n\nace.define(\"ace/autocomplete\",[\"require\",\"exports\",\"module\",\"ace/keyboard/hash_handler\",\"ace/autocomplete/popup\",\"ace/autocomplete/util\",\"ace/lib/event\",\"ace/lib/lang\",\"ace/lib/dom\",\"ace/snippets\"], function(require, exports, module) {\n\"use strict\";\n\nvar HashHandler = require(\"./keyboard/hash_handler\").HashHandler;\nvar AcePopup = require(\"./autocomplete/popup\").AcePopup;\nvar util = require(\"./autocomplete/util\");\nvar event = require(\"./lib/event\");\nvar lang = require(\"./lib/lang\");\nvar dom = require(\"./lib/dom\");\nvar snippetManager = require(\"./snippets\").snippetManager;\n\nvar Autocomplete = function() {\n    this.autoInsert = true;\n    this.autoSelect = true;\n    this.exactMatch = false;\n    this.keyboardHandler = new HashHandler();\n    this.keyboardHandler.bindKeys(this.commands);\n\n    this.blurListener = this.blurListener.bind(this);\n    this.changeListener = this.changeListener.bind(this);\n    this.mousedownListener = this.mousedownListener.bind(this);\n    this.mousewheelListener = this.mousewheelListener.bind(this);\n\n    this.changeTimer = lang.delayedCall(function() {\n        this.updateCompletions(true);\n    }.bind(this));\n\n    this.tooltipTimer = lang.delayedCall(this.updateDocTooltip.bind(this), 50);\n};\n\n(function() {\n    this.gatherCompletionsId = 0;\n\n    this.$init = function() {\n        this.popup = new AcePopup(document.body || document.documentElement);\n        this.popup.on(\"click\", function(e) {\n            this.insertMatch();\n            e.stop();\n        }.bind(this));\n        this.popup.focus = this.editor.focus.bind(this.editor);\n        this.popup.on(\"show\", this.tooltipTimer.bind(null, null));\n        this.popup.on(\"select\", this.tooltipTimer.bind(null, null));\n        this.popup.on(\"changeHoverMarker\", this.tooltipTimer.bind(null, null));\n        return this.popup;\n    };\n\n    this.getPopup = function() {\n        return this.popup || this.$init();\n    };\n\n    this.openPopup = function(editor, prefix, keepPopupPosition) {\n        if (!this.popup)\n            this.$init();\n\n        this.popup.setData(this.completions.filtered);\n\n        var renderer = editor.renderer;\n        this.popup.setRow(this.autoSelect ? 0 : -1);\n        if (!keepPopupPosition) {\n            this.popup.setTheme(editor.getTheme());\n            this.popup.setFontSize(editor.getFontSize());\n\n            var lineHeight = renderer.layerConfig.lineHeight;\n\n            var pos = renderer.$cursorLayer.getPixelPosition(this.base, true);\n            pos.left -= this.popup.getTextLeftOffset();\n\n            var rect = editor.container.getBoundingClientRect();\n            pos.top += rect.top - renderer.layerConfig.offset;\n            pos.left += rect.left - editor.renderer.scrollLeft;\n            pos.left += renderer.$gutterLayer.gutterWidth;\n\n            this.popup.show(pos, lineHeight);\n        } else if (keepPopupPosition && !prefix) {\n            this.detach();\n        }\n    };\n\n    this.detach = function() {\n        this.editor.keyBinding.removeKeyboardHandler(this.keyboardHandler);\n        this.editor.off(\"changeSelection\", this.changeListener);\n        this.editor.off(\"blur\", this.blurListener);\n        this.editor.off(\"mousedown\", this.mousedownListener);\n        this.editor.off(\"mousewheel\", this.mousewheelListener);\n        this.changeTimer.cancel();\n        this.hideDocTooltip();\n\n        if (this.popup && this.popup.isOpen) {\n            this.gatherCompletionsId += 1;\n            this.popup.hide();\n        }\n\n        if (this.base)\n            this.base.detach();\n        this.activated = false;\n        this.completions = this.base = null;\n    };\n\n    this.changeListener = function(e) {\n        var cursor = this.editor.selection.lead;\n        if (cursor.row != this.base.row || cursor.column < this.base.column) {\n            this.detach();\n        }\n        if (this.activated)\n            this.changeTimer.schedule();\n        else\n            this.detach();\n    };\n\n    this.blurListener = function(e) {\n        var el = document.activeElement;\n        var text = this.editor.textInput.getElement()\n        if (el != text && el.parentNode != this.popup.container\n            && el != this.tooltipNode && e.relatedTarget != this.tooltipNode\n            && e.relatedTarget != text\n        ) {\n            this.detach();\n        }\n    };\n\n    this.mousedownListener = function(e) {\n        this.detach();\n    };\n\n    this.mousewheelListener = function(e) {\n        this.detach();\n    };\n\n    this.goTo = function(where) {\n        var row = this.popup.getRow();\n        var max = this.popup.session.getLength() - 1;\n\n        switch(where) {\n            case \"up\": row = row <= 0 ? max : row - 1; break;\n            case \"down\": row = row >= max ? -1 : row + 1; break;\n            case \"start\": row = 0; break;\n            case \"end\": row = max; break;\n        }\n\n        this.popup.setRow(row);\n    };\n\n    this.insertMatch = function(data) {\n        if (!data)\n            data = this.popup.getData(this.popup.getRow());\n        if (!data)\n            return false;\n\n        if (data.completer && data.completer.insertMatch) {\n            data.completer.insertMatch(this.editor, data);\n        } else {\n            if (this.completions.filterText) {\n                var ranges = this.editor.selection.getAllRanges();\n                for (var i = 0, range; range = ranges[i]; i++) {\n                    range.start.column -= this.completions.filterText.length;\n                    this.editor.session.remove(range);\n                }\n            }\n            if (data.snippet)\n                snippetManager.insertSnippet(this.editor, data.snippet);\n            else\n                this.editor.execCommand(\"insertstring\", data.value || data);\n        }\n        this.detach();\n    };\n\n\n    this.commands = {\n        \"Up\": function(editor) { editor.completer.goTo(\"up\"); },\n        \"Down\": function(editor) { editor.completer.goTo(\"down\"); },\n        \"Ctrl-Up|Ctrl-Home\": function(editor) { editor.completer.goTo(\"start\"); },\n        \"Ctrl-Down|Ctrl-End\": function(editor) { editor.completer.goTo(\"end\"); },\n\n        \"Esc\": function(editor) { editor.completer.detach(); },\n        \"Space\": function(editor) { editor.completer.detach(); editor.insert(\" \");},\n        \"Return\": function(editor) { return editor.completer.insertMatch(); },\n        \"Shift-Return\": function(editor) { editor.completer.insertMatch(true); },\n        \"Tab\": function(editor) {\n            var result = editor.completer.insertMatch();\n            if (!result && !editor.tabstopManager)\n                editor.completer.goTo(\"down\");\n            else\n                return result;\n        },\n\n        \"PageUp\": function(editor) { editor.completer.popup.gotoPageUp(); },\n        \"PageDown\": function(editor) { editor.completer.popup.gotoPageDown(); }\n    };\n\n    this.gatherCompletions = function(editor, callback) {\n        var session = editor.getSession();\n        var pos = editor.getCursorPosition();\n\n        var line = session.getLine(pos.row);\n        var prefix = util.retrievePrecedingIdentifier(line, pos.column);\n\n        this.base = session.doc.createAnchor(pos.row, pos.column - prefix.length);\n        this.base.$insertRight = true;\n\n        var matches = [];\n        var total = editor.completers.length;\n        editor.completers.forEach(function(completer, i) {\n            completer.getCompletions(editor, session, pos, prefix, function(err, results) {\n                if (!err)\n                    matches = matches.concat(results);\n                var pos = editor.getCursorPosition();\n                var line = session.getLine(pos.row);\n                callback(null, {\n                    prefix: util.retrievePrecedingIdentifier(line, pos.column, results[0] && results[0].identifierRegex),\n                    matches: matches,\n                    finished: (--total === 0)\n                });\n            });\n        });\n        return true;\n    };\n\n    this.showPopup = function(editor) {\n        if (this.editor)\n            this.detach();\n\n        this.activated = true;\n\n        this.editor = editor;\n        if (editor.completer != this) {\n            if (editor.completer)\n                editor.completer.detach();\n            editor.completer = this;\n        }\n\n        editor.keyBinding.addKeyboardHandler(this.keyboardHandler);\n        editor.on(\"changeSelection\", this.changeListener);\n        editor.on(\"blur\", this.blurListener);\n        editor.on(\"mousedown\", this.mousedownListener);\n        editor.on(\"mousewheel\", this.mousewheelListener);\n\n        this.updateCompletions();\n    };\n\n    this.updateCompletions = function(keepPopupPosition) {\n        if (keepPopupPosition && this.base && this.completions) {\n            var pos = this.editor.getCursorPosition();\n            var prefix = this.editor.session.getTextRange({start: this.base, end: pos});\n            if (prefix == this.completions.filterText)\n                return;\n            this.completions.setFilter(prefix);\n            if (!this.completions.filtered.length)\n                return this.detach();\n            if (this.completions.filtered.length == 1\n            && this.completions.filtered[0].value == prefix\n            && !this.completions.filtered[0].snippet)\n                return this.detach();\n            this.openPopup(this.editor, prefix, keepPopupPosition);\n            return;\n        }\n        var _id = this.gatherCompletionsId;\n        this.gatherCompletions(this.editor, function(err, results) {\n            var detachIfFinished = function() {\n                if (!results.finished) return;\n                return this.detach();\n            }.bind(this);\n\n            var prefix = results.prefix;\n            var matches = results && results.matches;\n\n            if (!matches || !matches.length)\n                return detachIfFinished();\n            if (prefix.indexOf(results.prefix) !== 0 || _id != this.gatherCompletionsId)\n                return;\n\n            this.completions = new FilteredList(matches);\n\n            if (this.exactMatch)\n                this.completions.exactMatch = true;\n\n            this.completions.setFilter(prefix);\n            var filtered = this.completions.filtered;\n            if (!filtered.length)\n                return detachIfFinished();\n            if (filtered.length == 1 && filtered[0].value == prefix && !filtered[0].snippet)\n                return detachIfFinished();\n            if (this.autoInsert && filtered.length == 1 && results.finished)\n                return this.insertMatch(filtered[0]);\n\n            this.openPopup(this.editor, prefix, keepPopupPosition);\n        }.bind(this));\n    };\n\n    this.cancelContextMenu = function() {\n        this.editor.$mouseHandler.cancelContextMenu();\n    };\n\n    this.updateDocTooltip = function() {\n        var popup = this.popup;\n        var all = popup.data;\n        var selected = all && (all[popup.getHoveredRow()] || all[popup.getRow()]);\n        var doc = null;\n        if (!selected || !this.editor || !this.popup.isOpen)\n            return this.hideDocTooltip();\n        this.editor.completers.some(function(completer) {\n            if (completer.getDocTooltip)\n                doc = completer.getDocTooltip(selected);\n            return doc;\n        });\n        if (!doc)\n            doc = selected;\n\n        if (typeof doc == \"string\")\n            doc = {docText: doc}\n        if (!doc || !(doc.docHTML || doc.docText))\n            return this.hideDocTooltip();\n        this.showDocTooltip(doc);\n    };\n\n    this.showDocTooltip = function(item) {\n        if (!this.tooltipNode) {\n            this.tooltipNode = dom.createElement(\"div\");\n            this.tooltipNode.className = \"ace_tooltip ace_doc-tooltip\";\n            this.tooltipNode.style.margin = 0;\n            this.tooltipNode.style.pointerEvents = \"auto\";\n            this.tooltipNode.tabIndex = -1;\n            this.tooltipNode.onblur = this.blurListener.bind(this);\n        }\n\n        var tooltipNode = this.tooltipNode;\n        if (item.docHTML) {\n            tooltipNode.innerHTML = item.docHTML;\n        } else if (item.docText) {\n            tooltipNode.textContent = item.docText;\n        }\n\n        if (!tooltipNode.parentNode)\n            document.body.appendChild(tooltipNode);\n        var popup = this.popup;\n        var rect = popup.container.getBoundingClientRect();\n        tooltipNode.style.top = popup.container.style.top;\n        tooltipNode.style.bottom = popup.container.style.bottom;\n\n        if (window.innerWidth - rect.right < 320) {\n            tooltipNode.style.right = window.innerWidth - rect.left + \"px\";\n            tooltipNode.style.left = \"\";\n        } else {\n            tooltipNode.style.left = (rect.right + 1) + \"px\";\n            tooltipNode.style.right = \"\";\n        }\n        tooltipNode.style.display = \"block\";\n    };\n\n    this.hideDocTooltip = function() {\n        this.tooltipTimer.cancel();\n        if (!this.tooltipNode) return;\n        var el = this.tooltipNode;\n        if (!this.editor.isFocused() && document.activeElement == el)\n            this.editor.focus();\n        this.tooltipNode = null;\n        if (el.parentNode)\n            el.parentNode.removeChild(el);\n    };\n\n}).call(Autocomplete.prototype);\n\nAutocomplete.startCommand = {\n    name: \"startAutocomplete\",\n    exec: function(editor) {\n        if (!editor.completer)\n            editor.completer = new Autocomplete();\n        editor.completer.autoInsert =\n        editor.completer.autoSelect = true;\n        editor.completer.showPopup(editor);\n        editor.completer.cancelContextMenu();\n    },\n    bindKey: \"Ctrl-Space|Ctrl-Shift-Space|Alt-Space\"\n};\n\nvar FilteredList = function(array, filterText, mutateData) {\n    this.all = array;\n    this.filtered = array;\n    this.filterText = filterText || \"\";\n    this.exactMatch = false;\n};\n(function(){\n    this.setFilter = function(str) {\n        if (str.length > this.filterText && str.lastIndexOf(this.filterText, 0) === 0)\n            var matches = this.filtered;\n        else\n            var matches = this.all;\n\n        this.filterText = str;\n        matches = this.filterCompletions(matches, this.filterText);\n        matches = matches.sort(function(a, b) {\n            return b.exactMatch - a.exactMatch || b.score - a.score;\n        });\n        var prev = null;\n        matches = matches.filter(function(item){\n            var caption = item.snippet || item.caption || item.value;\n            if (caption === prev) return false;\n            prev = caption;\n            return true;\n        });\n\n        this.filtered = matches;\n    };\n    this.filterCompletions = function(items, needle) {\n        var results = [];\n        var upper = needle.toUpperCase();\n        var lower = needle.toLowerCase();\n        loop: for (var i = 0, item; item = items[i]; i++) {\n            var caption = item.value || item.caption || item.snippet;\n            if (!caption) continue;\n            var lastIndex = -1;\n            var matchMask = 0;\n            var penalty = 0;\n            var index, distance;\n\n            if (this.exactMatch) {\n                if (needle !== caption.substr(0, needle.length))\n                    continue loop;\n            }else{\n                for (var j = 0; j < needle.length; j++) {\n                    var i1 = caption.indexOf(lower[j], lastIndex + 1);\n                    var i2 = caption.indexOf(upper[j], lastIndex + 1);\n                    index = (i1 >= 0) ? ((i2 < 0 || i1 < i2) ? i1 : i2) : i2;\n                    if (index < 0)\n                        continue loop;\n                    distance = index - lastIndex - 1;\n                    if (distance > 0) {\n                        if (lastIndex === -1)\n                            penalty += 10;\n                        penalty += distance;\n                    }\n                    matchMask = matchMask | (1 << index);\n                    lastIndex = index;\n                }\n            }\n            item.matchMask = matchMask;\n            item.exactMatch = penalty ? 0 : 1;\n            item.score = (item.score || 0) - penalty;\n            results.push(item);\n        }\n        return results;\n    };\n}).call(FilteredList.prototype);\n\nexports.Autocomplete = Autocomplete;\nexports.FilteredList = FilteredList;\n\n});\n\nace.define(\"ace/autocomplete/text_completer\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n    var Range = require(\"../range\").Range;\n    \n    var splitRegex = /[^a-zA-Z_0-9\\$\\-\\u00C0-\\u1FFF\\u2C00-\\uD7FF\\w]+/;\n\n    function getWordIndex(doc, pos) {\n        var textBefore = doc.getTextRange(Range.fromPoints({row: 0, column:0}, pos));\n        return textBefore.split(splitRegex).length - 1;\n    }\n    function wordDistance(doc, pos) {\n        var prefixPos = getWordIndex(doc, pos);\n        var words = doc.getValue().split(splitRegex);\n        var wordScores = Object.create(null);\n        \n        var currentWord = words[prefixPos];\n\n        words.forEach(function(word, idx) {\n            if (!word || word === currentWord) return;\n\n            var distance = Math.abs(prefixPos - idx);\n            var score = words.length - distance;\n            if (wordScores[word]) {\n                wordScores[word] = Math.max(score, wordScores[word]);\n            } else {\n                wordScores[word] = score;\n            }\n        });\n        return wordScores;\n    }\n\n    exports.getCompletions = function(editor, session, pos, prefix, callback) {\n        var wordScore = wordDistance(session, pos, prefix);\n        var wordList = Object.keys(wordScore);\n        callback(null, wordList.map(function(word) {\n            return {\n                caption: word,\n                value: word,\n                score: wordScore[word],\n                meta: \"local\"\n            };\n        }));\n    };\n});\n\nace.define(\"ace/ext/language_tools\",[\"require\",\"exports\",\"module\",\"ace/snippets\",\"ace/autocomplete\",\"ace/config\",\"ace/lib/lang\",\"ace/autocomplete/util\",\"ace/autocomplete/text_completer\",\"ace/editor\",\"ace/config\"], function(require, exports, module) {\n\"use strict\";\n\nvar snippetManager = require(\"../snippets\").snippetManager;\nvar Autocomplete = require(\"../autocomplete\").Autocomplete;\nvar config = require(\"../config\");\nvar lang = require(\"../lib/lang\");\nvar util = require(\"../autocomplete/util\");\n\nvar textCompleter = require(\"../autocomplete/text_completer\");\nvar keyWordCompleter = {\n    getCompletions: function(editor, session, pos, prefix, callback) {\n        if (session.$mode.completer) {\n            return session.$mode.completer.getCompletions(editor, session, pos, prefix, callback);\n        }\n        var state = editor.session.getState(pos.row);\n        var completions = session.$mode.getCompletions(state, session, pos, prefix);\n        callback(null, completions);\n    }\n};\n\nvar snippetCompleter = {\n    getCompletions: function(editor, session, pos, prefix, callback) {\n        var snippetMap = snippetManager.snippetMap;\n        var completions = [];\n        snippetManager.getActiveScopes(editor).forEach(function(scope) {\n            var snippets = snippetMap[scope] || [];\n            for (var i = snippets.length; i--;) {\n                var s = snippets[i];\n                var caption = s.name || s.tabTrigger;\n                if (!caption)\n                    continue;\n                completions.push({\n                    caption: caption,\n                    snippet: s.content,\n                    meta: s.tabTrigger && !s.name ? s.tabTrigger + \"\\u21E5 \" : \"snippet\",\n                    type: \"snippet\"\n                });\n            }\n        }, this);\n        callback(null, completions);\n    },\n    getDocTooltip: function(item) {\n        if (item.type == \"snippet\" && !item.docHTML) {\n            item.docHTML = [\n                \"<b>\", lang.escapeHTML(item.caption), \"</b>\", \"<hr></hr>\",\n                lang.escapeHTML(item.snippet)\n            ].join(\"\");\n        }\n    }\n};\n\nvar completers = [snippetCompleter, textCompleter, keyWordCompleter];\nexports.setCompleters = function(val) {\n    completers = val || [];\n};\nexports.addCompleter = function(completer) {\n    completers.push(completer);\n};\nexports.textCompleter = textCompleter;\nexports.keyWordCompleter = keyWordCompleter;\nexports.snippetCompleter = snippetCompleter;\n\nvar expandSnippet = {\n    name: \"expandSnippet\",\n    exec: function(editor) {\n        return snippetManager.expandWithTab(editor);\n    },\n    bindKey: \"Tab\"\n};\n\nvar onChangeMode = function(e, editor) {\n    loadSnippetsForMode(editor.session.$mode);\n};\n\nvar loadSnippetsForMode = function(mode) {\n    var id = mode.$id;\n    if (!snippetManager.files)\n        snippetManager.files = {};\n    loadSnippetFile(id);\n    if (mode.modes)\n        mode.modes.forEach(loadSnippetsForMode);\n};\n\nvar loadSnippetFile = function(id) {\n    if (!id || snippetManager.files[id])\n        return;\n    var snippetFilePath = id.replace(\"mode\", \"snippets\");\n    snippetManager.files[id] = {};\n    config.loadModule(snippetFilePath, function(m) {\n        if (m) {\n            snippetManager.files[id] = m;\n            if (!m.snippets && m.snippetText)\n                m.snippets = snippetManager.parseSnippetFile(m.snippetText);\n            snippetManager.register(m.snippets || [], m.scope);\n            if (m.includeScopes) {\n                snippetManager.snippetMap[m.scope].includeScopes = m.includeScopes;\n                m.includeScopes.forEach(function(x) {\n                    loadSnippetFile(\"ace/mode/\" + x);\n                });\n            }\n        }\n    });\n};\n\nfunction getCompletionPrefix(editor) {\n    var pos = editor.getCursorPosition();\n    var line = editor.session.getLine(pos.row);\n    var prefix = util.retrievePrecedingIdentifier(line, pos.column);\n    editor.completers.forEach(function(completer) {\n        if (completer.identifierRegexps) {\n            completer.identifierRegexps.forEach(function(identifierRegex) {\n                if (!prefix && identifierRegex)\n                    prefix = util.retrievePrecedingIdentifier(line, pos.column, identifierRegex);\n            });\n        }\n    });\n    return prefix;\n}\n\nvar doLiveAutocomplete = function(e) {\n    var editor = e.editor;\n    var text = e.args || \"\";\n    var hasCompleter = editor.completer && editor.completer.activated;\n    if (e.command.name === \"backspace\") {\n        if (hasCompleter && !getCompletionPrefix(editor))\n            editor.completer.detach();\n    }\n    else if (e.command.name === \"insertstring\") {\n        var prefix = getCompletionPrefix(editor);\n        if (prefix && !hasCompleter) {\n            if (!editor.completer) {\n                editor.completer = new Autocomplete();\n            }\n            editor.completer.autoSelect = false;\n            editor.completer.autoInsert = false;\n            editor.completer.showPopup(editor);\n        }\n    }\n};\n\nvar Editor = require(\"../editor\").Editor;\nrequire(\"../config\").defineOptions(Editor.prototype, \"editor\", {\n    enableBasicAutocompletion: {\n        set: function(val) {\n            if (val) {\n                if (!this.completers)\n                    this.completers = Array.isArray(val)? val: completers;\n                this.commands.addCommand(Autocomplete.startCommand);\n            } else {\n                this.commands.removeCommand(Autocomplete.startCommand);\n            }\n        },\n        value: false\n    },\n    enableLiveAutocompletion: {\n        set: function(val) {\n            if (val) {\n                if (!this.completers)\n                    this.completers = Array.isArray(val)? val: completers;\n                this.commands.on('afterExec', doLiveAutocomplete);\n            } else {\n                this.commands.removeListener('afterExec', doLiveAutocomplete);\n            }\n        },\n        value: false\n    },\n    enableSnippets: {\n        set: function(val) {\n            if (val) {\n                this.commands.addCommand(expandSnippet);\n                this.on(\"changeMode\", onChangeMode);\n                onChangeMode(null, this);\n            } else {\n                this.commands.removeCommand(expandSnippet);\n                this.off(\"changeMode\", onChangeMode);\n            }\n        },\n        value: false\n    }\n});\n});\n                (function() {\n                    ace.require([\"ace/ext/language_tools\"], function() {});\n                })();\n            "
  },
  {
    "path": "browser/plugins/ace/src-noconflict/ext-linking.js",
    "content": "ace.define(\"ace/ext/linking\",[\"require\",\"exports\",\"module\",\"ace/editor\",\"ace/config\"], function(require, exports, module) {\n\nvar Editor = require(\"ace/editor\").Editor;\n\nrequire(\"../config\").defineOptions(Editor.prototype, \"editor\", {\n    enableLinking: {\n        set: function(val) {\n            if (val) {\n                this.on(\"click\", onClick);\n                this.on(\"mousemove\", onMouseMove);\n            } else {\n                this.off(\"click\", onClick);\n                this.off(\"mousemove\", onMouseMove);\n            }\n        },\n        value: false\n    }\n})\n\nfunction onMouseMove(e) {\n    var editor = e.editor;\n    var ctrl = e.getAccelKey();\n\n    if (ctrl) {\n        var editor = e.editor;\n        var docPos = e.getDocumentPosition();\n        var session = editor.session;\n        var token = session.getTokenAt(docPos.row, docPos.column);\n\n        editor._emit(\"linkHover\", {position: docPos, token: token});\n    }\n}\n\nfunction onClick(e) {\n    var ctrl = e.getAccelKey();\n    var button = e.getButton();\n\n    if (button == 0 && ctrl) {\n        var editor = e.editor;\n        var docPos = e.getDocumentPosition();\n        var session = editor.session;\n        var token = session.getTokenAt(docPos.row, docPos.column);\n\n        editor._emit(\"linkClick\", {position: docPos, token: token});\n    }\n}\n\n});\n                (function() {\n                    ace.require([\"ace/ext/linking\"], function() {});\n                })();\n            "
  },
  {
    "path": "browser/plugins/ace/src-noconflict/ext-modelist.js",
    "content": "ace.define(\"ace/ext/modelist\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nvar modes = [];\nfunction getModeForPath(path) {\n    var mode = modesByName.text;\n    var fileName = path.split(/[\\/\\\\]/).pop();\n    for (var i = 0; i < modes.length; i++) {\n        if (modes[i].supportsFile(fileName)) {\n            mode = modes[i];\n            break;\n        }\n    }\n    return mode;\n}\n\nvar Mode = function(name, caption, extensions) {\n    this.name = name;\n    this.caption = caption;\n    this.mode = \"ace/mode/\" + name;\n    this.extensions = extensions;\n    if (/\\^/.test(extensions)) {\n        var re = extensions.replace(/\\|(\\^)?/g, function(a, b){\n            return \"$|\" + (b ? \"^\" : \"^.*\\\\.\");\n        }) + \"$\";\n    } else {\n        var re = \"^.*\\\\.(\" + extensions + \")$\";\n    }\n\n    this.extRe = new RegExp(re, \"gi\");\n};\n\nMode.prototype.supportsFile = function(filename) {\n    return filename.match(this.extRe);\n};\nvar supportedModes = {\n    ABAP:        [\"abap\"],\n    ActionScript:[\"as\"],\n    ADA:         [\"ada|adb\"],\n    Apache_Conf: [\"^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd\"],\n    AsciiDoc:    [\"asciidoc\"],\n    Assembly_x86:[\"asm\"],\n    AutoHotKey:  [\"ahk\"],\n    BatchFile:   [\"bat|cmd\"],\n    C9Search:    [\"c9search_results\"],\n    C_Cpp:       [\"cpp|c|cc|cxx|h|hh|hpp\"],\n    Cirru:       [\"cirru|cr\"],\n    Clojure:     [\"clj|cljs\"],\n    Cobol:       [\"CBL|COB\"],\n    coffee:      [\"coffee|cf|cson|^Cakefile\"],\n    ColdFusion:  [\"cfm\"],\n    CSharp:      [\"cs\"],\n    CSS:         [\"css\"],\n    Curly:       [\"curly\"],\n    D:           [\"d|di\"],\n    Dart:        [\"dart\"],\n    Diff:        [\"diff|patch\"],\n    Dockerfile:  [\"^Dockerfile\"],\n    Dot:         [\"dot\"],\n    Dummy:       [\"dummy\"],\n    DummySyntax: [\"dummy\"],\n    Eiffel:      [\"e\"],\n    EJS:         [\"ejs\"],\n    Elixir:      [\"ex|exs\"],\n    Elm:         [\"elm\"],\n    Erlang:      [\"erl|hrl\"],\n    Forth:       [\"frt|fs|ldr\"],\n    FTL:         [\"ftl\"],\n    Gcode:       [\"gcode\"],\n    Gherkin:     [\"feature\"],\n    Gitignore:   [\"^.gitignore\"],\n    Glsl:        [\"glsl|frag|vert\"],\n    golang:      [\"go\"],\n    Groovy:      [\"groovy\"],\n    HAML:        [\"haml\"],\n    Handlebars:  [\"hbs|handlebars|tpl|mustache\"],\n    Haskell:     [\"hs\"],\n    haXe:        [\"hx\"],\n    HTML:        [\"html|htm|xhtml\"],\n    HTML_Ruby:   [\"erb|rhtml|html.erb\"],\n    INI:         [\"ini|conf|cfg|prefs\"],\n    Io:          [\"io\"],\n    Jack:        [\"jack\"],\n    Jade:        [\"jade\"],\n    Java:        [\"java\"],\n    JavaScript:  [\"js|jsm\"],\n    JSON:        [\"json\"],\n    JSONiq:      [\"jq\"],\n    JSP:         [\"jsp\"],\n    JSX:         [\"jsx\"],\n    Julia:       [\"jl\"],\n    LaTeX:       [\"tex|latex|ltx|bib\"],\n    LESS:        [\"less\"],\n    Liquid:      [\"liquid\"],\n    Lisp:        [\"lisp\"],\n    LiveScript:  [\"ls\"],\n    LogiQL:      [\"logic|lql\"],\n    LSL:         [\"lsl\"],\n    Lua:         [\"lua\"],\n    LuaPage:     [\"lp\"],\n    Lucene:      [\"lucene\"],\n    Makefile:    [\"^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make\"],\n    Markdown:    [\"md|markdown\"],\n    Mask:        [\"mask\"],\n    MATLAB:      [\"matlab\"],\n    MEL:         [\"mel\"],\n    MUSHCode:    [\"mc|mush\"],\n    MySQL:       [\"mysql\"],\n    Nix:         [\"nix\"],\n    ObjectiveC:  [\"m|mm\"],\n    OCaml:       [\"ml|mli\"],\n    Pascal:      [\"pas|p\"],\n    Perl:        [\"pl|pm\"],\n    pgSQL:       [\"pgsql\"],\n    PHP:         [\"php|phtml\"],\n    Powershell:  [\"ps1\"],\n    Praat:       [\"praat|praatscript|psc|proc\"],\n    Prolog:      [\"plg|prolog\"],\n    Properties:  [\"properties\"],\n    Protobuf:    [\"proto\"],\n    Python:      [\"py\"],\n    R:           [\"r\"],\n    RDoc:        [\"Rd\"],\n    RHTML:       [\"Rhtml\"],\n    Ruby:        [\"rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile\"],\n    Rust:        [\"rs\"],\n    SASS:        [\"sass\"],\n    SCAD:        [\"scad\"],\n    Scala:       [\"scala\"],\n    Scheme:      [\"scm|rkt\"],\n    SCSS:        [\"scss\"],\n    SH:          [\"sh|bash|^.bashrc\"],\n    SJS:         [\"sjs\"],\n    Smarty:      [\"smarty|tpl\"],\n    snippets:    [\"snippets\"],\n    Soy_Template:[\"soy\"],\n    Space:       [\"space\"],\n    SQL:         [\"sql\"],\n    Stylus:      [\"styl|stylus\"],\n    SVG:         [\"svg\"],\n    Tcl:         [\"tcl\"],\n    Tex:         [\"tex\"],\n    Text:        [\"txt\"],\n    Textile:     [\"textile\"],\n    Toml:        [\"toml\"],\n    Twig:        [\"twig\"],\n    Typescript:  [\"ts|typescript|str\"],\n    Vala:        [\"vala\"],\n    VBScript:    [\"vbs|vb\"],\n    Velocity:    [\"vm\"],\n    Verilog:     [\"v|vh|sv|svh\"],\n    VHDL:        [\"vhd|vhdl\"],\n    XML:         [\"xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl\"],\n    XQuery:      [\"xq\"],\n    YAML:        [\"yaml|yml\"]\n};\n\nvar nameOverrides = {\n    ObjectiveC: \"Objective-C\",\n    CSharp: \"C#\",\n    golang: \"Go\",\n    C_Cpp: \"C and C++\",\n    coffee: \"CoffeeScript\",\n    HTML_Ruby: \"HTML (Ruby)\",\n    FTL: \"FreeMarker\"\n};\nvar modesByName = {};\nfor (var name in supportedModes) {\n    var data = supportedModes[name];\n    var displayName = (nameOverrides[name] || name).replace(/_/g, \" \");\n    var filename = name.toLowerCase();\n    var mode = new Mode(filename, displayName, data[0]);\n    modesByName[filename] = mode;\n    modes.push(mode);\n}\n\nmodule.exports = {\n    getModeForPath: getModeForPath,\n    modes: modes,\n    modesByName: modesByName\n};\n\n});\n                (function() {\n                    ace.require([\"ace/ext/modelist\"], function() {});\n                })();\n            "
  },
  {
    "path": "browser/plugins/ace/src-noconflict/ext-old_ie.js",
    "content": "ace.define(\"ace/ext/searchbox\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/event\",\"ace/keyboard/hash_handler\",\"ace/lib/keys\"], function(require, exports, module) {\n\"use strict\";\n\nvar dom = require(\"../lib/dom\");\nvar lang = require(\"../lib/lang\");\nvar event = require(\"../lib/event\");\nvar searchboxCss = \"\\\n.ace_search {\\\nbackground-color: #ddd;\\\nborder: 1px solid #cbcbcb;\\\nborder-top: 0 none;\\\nmax-width: 325px;\\\noverflow: hidden;\\\nmargin: 0;\\\npadding: 4px;\\\npadding-right: 6px;\\\npadding-bottom: 0;\\\nposition: absolute;\\\ntop: 0px;\\\nz-index: 99;\\\nwhite-space: normal;\\\n}\\\n.ace_search.left {\\\nborder-left: 0 none;\\\nborder-radius: 0px 0px 5px 0px;\\\nleft: 0;\\\n}\\\n.ace_search.right {\\\nborder-radius: 0px 0px 0px 5px;\\\nborder-right: 0 none;\\\nright: 0;\\\n}\\\n.ace_search_form, .ace_replace_form {\\\nborder-radius: 3px;\\\nborder: 1px solid #cbcbcb;\\\nfloat: left;\\\nmargin-bottom: 4px;\\\noverflow: hidden;\\\n}\\\n.ace_search_form.ace_nomatch {\\\noutline: 1px solid red;\\\n}\\\n.ace_search_field {\\\nbackground-color: white;\\\nborder-right: 1px solid #cbcbcb;\\\nborder: 0 none;\\\n-webkit-box-sizing: border-box;\\\n-moz-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nfloat: left;\\\nheight: 22px;\\\noutline: 0;\\\npadding: 0 7px;\\\nwidth: 214px;\\\nmargin: 0;\\\n}\\\n.ace_searchbtn,\\\n.ace_replacebtn {\\\nbackground: #fff;\\\nborder: 0 none;\\\nborder-left: 1px solid #dcdcdc;\\\ncursor: pointer;\\\nfloat: left;\\\nheight: 22px;\\\nmargin: 0;\\\npadding: 0;\\\nposition: relative;\\\n}\\\n.ace_searchbtn:last-child,\\\n.ace_replacebtn:last-child {\\\nborder-top-right-radius: 3px;\\\nborder-bottom-right-radius: 3px;\\\n}\\\n.ace_searchbtn:disabled {\\\nbackground: none;\\\ncursor: default;\\\n}\\\n.ace_searchbtn {\\\nbackground-position: 50% 50%;\\\nbackground-repeat: no-repeat;\\\nwidth: 27px;\\\n}\\\n.ace_searchbtn.prev {\\\nbackground-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADFJREFUeNpiSU1NZUAC/6E0I0yACYskCpsJiySKIiY0SUZk40FyTEgCjGgKwTRAgAEAQJUIPCE+qfkAAAAASUVORK5CYII=);    \\\n}\\\n.ace_searchbtn.next {\\\nbackground-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADRJREFUeNpiTE1NZQCC/0DMyIAKwGJMUAYDEo3M/s+EpvM/mkKwCQxYjIeLMaELoLMBAgwAU7UJObTKsvAAAAAASUVORK5CYII=);    \\\n}\\\n.ace_searchbtn_close {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;\\\nborder-radius: 50%;\\\nborder: 0 none;\\\ncolor: #656565;\\\ncursor: pointer;\\\nfloat: right;\\\nfont: 16px/16px Arial;\\\nheight: 14px;\\\nmargin: 5px 1px 9px 5px;\\\npadding: 0;\\\ntext-align: center;\\\nwidth: 14px;\\\n}\\\n.ace_searchbtn_close:hover {\\\nbackground-color: #656565;\\\nbackground-position: 50% 100%;\\\ncolor: white;\\\n}\\\n.ace_replacebtn.prev {\\\nwidth: 54px\\\n}\\\n.ace_replacebtn.next {\\\nwidth: 27px\\\n}\\\n.ace_button {\\\nmargin-left: 2px;\\\ncursor: pointer;\\\n-webkit-user-select: none;\\\n-moz-user-select: none;\\\n-o-user-select: none;\\\n-ms-user-select: none;\\\nuser-select: none;\\\noverflow: hidden;\\\nopacity: 0.7;\\\nborder: 1px solid rgba(100,100,100,0.23);\\\npadding: 1px;\\\n-moz-box-sizing: border-box;\\\nbox-sizing:    border-box;\\\ncolor: black;\\\n}\\\n.ace_button:hover {\\\nbackground-color: #eee;\\\nopacity:1;\\\n}\\\n.ace_button:active {\\\nbackground-color: #ddd;\\\n}\\\n.ace_button.checked {\\\nborder-color: #3399ff;\\\nopacity:1;\\\n}\\\n.ace_search_options{\\\nmargin-bottom: 3px;\\\ntext-align: right;\\\n-webkit-user-select: none;\\\n-moz-user-select: none;\\\n-o-user-select: none;\\\n-ms-user-select: none;\\\nuser-select: none;\\\n}\";\nvar HashHandler = require(\"../keyboard/hash_handler\").HashHandler;\nvar keyUtil = require(\"../lib/keys\");\n\ndom.importCssString(searchboxCss, \"ace_searchbox\");\n\nvar html = '<div class=\"ace_search right\">\\\n    <button type=\"button\" action=\"hide\" class=\"ace_searchbtn_close\"></button>\\\n    <div class=\"ace_search_form\">\\\n        <input class=\"ace_search_field\" placeholder=\"Search for\" spellcheck=\"false\"></input>\\\n        <button type=\"button\" action=\"findNext\" class=\"ace_searchbtn next\"></button>\\\n        <button type=\"button\" action=\"findPrev\" class=\"ace_searchbtn prev\"></button>\\\n        <button type=\"button\" action=\"findAll\" class=\"ace_searchbtn\" title=\"Alt-Enter\">All</button>\\\n    </div>\\\n    <div class=\"ace_replace_form\">\\\n        <input class=\"ace_search_field\" placeholder=\"Replace with\" spellcheck=\"false\"></input>\\\n        <button type=\"button\" action=\"replaceAndFindNext\" class=\"ace_replacebtn\">Replace</button>\\\n        <button type=\"button\" action=\"replaceAll\" class=\"ace_replacebtn\">All</button>\\\n    </div>\\\n    <div class=\"ace_search_options\">\\\n        <span action=\"toggleRegexpMode\" class=\"ace_button\" title=\"RegExp Search\">.*</span>\\\n        <span action=\"toggleCaseSensitive\" class=\"ace_button\" title=\"CaseSensitive Search\">Aa</span>\\\n        <span action=\"toggleWholeWords\" class=\"ace_button\" title=\"Whole Word Search\">\\\\b</span>\\\n    </div>\\\n</div>'.replace(/>\\s+/g, \">\");\n\nvar SearchBox = function(editor, range, showReplaceForm) {\n    var div = dom.createElement(\"div\");\n    div.innerHTML = html;\n    this.element = div.firstChild;\n\n    this.$init();\n    this.setEditor(editor);\n};\n\n(function() {\n    this.setEditor = function(editor) {\n        editor.searchBox = this;\n        editor.container.appendChild(this.element);\n        this.editor = editor;\n    };\n\n    this.$initElements = function(sb) {\n        this.searchBox = sb.querySelector(\".ace_search_form\");\n        this.replaceBox = sb.querySelector(\".ace_replace_form\");\n        this.searchOptions = sb.querySelector(\".ace_search_options\");\n        this.regExpOption = sb.querySelector(\"[action=toggleRegexpMode]\");\n        this.caseSensitiveOption = sb.querySelector(\"[action=toggleCaseSensitive]\");\n        this.wholeWordOption = sb.querySelector(\"[action=toggleWholeWords]\");\n        this.searchInput = this.searchBox.querySelector(\".ace_search_field\");\n        this.replaceInput = this.replaceBox.querySelector(\".ace_search_field\");\n    };\n    \n    this.$init = function() {\n        var sb = this.element;\n        \n        this.$initElements(sb);\n        \n        var _this = this;\n        event.addListener(sb, \"mousedown\", function(e) {\n            setTimeout(function(){\n                _this.activeInput.focus();\n            }, 0);\n            event.stopPropagation(e);\n        });\n        event.addListener(sb, \"click\", function(e) {\n            var t = e.target || e.srcElement;\n            var action = t.getAttribute(\"action\");\n            if (action && _this[action])\n                _this[action]();\n            else if (_this.$searchBarKb.commands[action])\n                _this.$searchBarKb.commands[action].exec(_this);\n            event.stopPropagation(e);\n        });\n\n        event.addCommandKeyListener(sb, function(e, hashId, keyCode) {\n            var keyString = keyUtil.keyCodeToString(keyCode);\n            var command = _this.$searchBarKb.findKeyCommand(hashId, keyString);\n            if (command && command.exec) {\n                command.exec(_this);\n                event.stopEvent(e);\n            }\n        });\n\n        this.$onChange = lang.delayedCall(function() {\n            _this.find(false, false);\n        });\n\n        event.addListener(this.searchInput, \"input\", function() {\n            _this.$onChange.schedule(20);\n        });\n        event.addListener(this.searchInput, \"focus\", function() {\n            _this.activeInput = _this.searchInput;\n            _this.searchInput.value && _this.highlight();\n        });\n        event.addListener(this.replaceInput, \"focus\", function() {\n            _this.activeInput = _this.replaceInput;\n            _this.searchInput.value && _this.highlight();\n        });\n    };\n    this.$closeSearchBarKb = new HashHandler([{\n        bindKey: \"Esc\",\n        name: \"closeSearchBar\",\n        exec: function(editor) {\n            editor.searchBox.hide();\n        }\n    }]);\n    this.$searchBarKb = new HashHandler();\n    this.$searchBarKb.bindKeys({\n        \"Ctrl-f|Command-f|Ctrl-H|Command-Option-F\": function(sb) {\n            var isReplace = sb.isReplace = !sb.isReplace;\n            sb.replaceBox.style.display = isReplace ? \"\" : \"none\";\n            sb[isReplace ? \"replaceInput\" : \"searchInput\"].focus();\n        },\n        \"Ctrl-G|Command-G\": function(sb) {\n            sb.findNext();\n        },\n        \"Ctrl-Shift-G|Command-Shift-G\": function(sb) {\n            sb.findPrev();\n        },\n        \"esc\": function(sb) {\n            setTimeout(function() { sb.hide();});\n        },\n        \"Return\": function(sb) {\n            if (sb.activeInput == sb.replaceInput)\n                sb.replace();\n            sb.findNext();\n        },\n        \"Shift-Return\": function(sb) {\n            if (sb.activeInput == sb.replaceInput)\n                sb.replace();\n            sb.findPrev();\n        },\n        \"Alt-Return\": function(sb) {\n            if (sb.activeInput == sb.replaceInput)\n                sb.replaceAll();\n            sb.findAll();\n        },\n        \"Tab\": function(sb) {\n            (sb.activeInput == sb.replaceInput ? sb.searchInput : sb.replaceInput).focus();\n        }\n    });\n\n    this.$searchBarKb.addCommands([{\n        name: \"toggleRegexpMode\",\n        bindKey: {win: \"Alt-R|Alt-/\", mac: \"Ctrl-Alt-R|Ctrl-Alt-/\"},\n        exec: function(sb) {\n            sb.regExpOption.checked = !sb.regExpOption.checked;\n            sb.$syncOptions();\n        }\n    }, {\n        name: \"toggleCaseSensitive\",\n        bindKey: {win: \"Alt-C|Alt-I\", mac: \"Ctrl-Alt-R|Ctrl-Alt-I\"},\n        exec: function(sb) {\n            sb.caseSensitiveOption.checked = !sb.caseSensitiveOption.checked;\n            sb.$syncOptions();\n        }\n    }, {\n        name: \"toggleWholeWords\",\n        bindKey: {win: \"Alt-B|Alt-W\", mac: \"Ctrl-Alt-B|Ctrl-Alt-W\"},\n        exec: function(sb) {\n            sb.wholeWordOption.checked = !sb.wholeWordOption.checked;\n            sb.$syncOptions();\n        }\n    }]);\n\n    this.$syncOptions = function() {\n        dom.setCssClass(this.regExpOption, \"checked\", this.regExpOption.checked);\n        dom.setCssClass(this.wholeWordOption, \"checked\", this.wholeWordOption.checked);\n        dom.setCssClass(this.caseSensitiveOption, \"checked\", this.caseSensitiveOption.checked);\n        this.find(false, false);\n    };\n\n    this.highlight = function(re) {\n        this.editor.session.highlight(re || this.editor.$search.$options.re);\n        this.editor.renderer.updateBackMarkers()\n    };\n    this.find = function(skipCurrent, backwards) {\n        var range = this.editor.find(this.searchInput.value, {\n            skipCurrent: skipCurrent,\n            backwards: backwards,\n            wrap: true,\n            regExp: this.regExpOption.checked,\n            caseSensitive: this.caseSensitiveOption.checked,\n            wholeWord: this.wholeWordOption.checked\n        });\n        var noMatch = !range && this.searchInput.value;\n        dom.setCssClass(this.searchBox, \"ace_nomatch\", noMatch);\n        this.editor._emit(\"findSearchBox\", { match: !noMatch });\n        this.highlight();\n    };\n    this.findNext = function() {\n        this.find(true, false);\n    };\n    this.findPrev = function() {\n        this.find(true, true);\n    };\n    this.findAll = function(){\n        var range = this.editor.findAll(this.searchInput.value, {            \n            regExp: this.regExpOption.checked,\n            caseSensitive: this.caseSensitiveOption.checked,\n            wholeWord: this.wholeWordOption.checked\n        });\n        var noMatch = !range && this.searchInput.value;\n        dom.setCssClass(this.searchBox, \"ace_nomatch\", noMatch);\n        this.editor._emit(\"findSearchBox\", { match: !noMatch });\n        this.highlight();\n        this.hide();\n    };\n    this.replace = function() {\n        if (!this.editor.getReadOnly())\n            this.editor.replace(this.replaceInput.value);\n    };    \n    this.replaceAndFindNext = function() {\n        if (!this.editor.getReadOnly()) {\n            this.editor.replace(this.replaceInput.value);\n            this.findNext()\n        }\n    };\n    this.replaceAll = function() {\n        if (!this.editor.getReadOnly())\n            this.editor.replaceAll(this.replaceInput.value);\n    };\n\n    this.hide = function() {\n        this.element.style.display = \"none\";\n        this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb);\n        this.editor.focus();\n    };\n    this.show = function(value, isReplace) {\n        this.element.style.display = \"\";\n        this.replaceBox.style.display = isReplace ? \"\" : \"none\";\n\n        this.isReplace = isReplace;\n\n        if (value)\n            this.searchInput.value = value;\n        this.searchInput.focus();\n        this.searchInput.select();\n\n        this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb);\n    };\n\n    this.isFocused = function() {\n        var el = document.activeElement;\n        return el == this.searchInput || el == this.replaceInput;\n    }\n}).call(SearchBox.prototype);\n\nexports.SearchBox = SearchBox;\n\nexports.Search = function(editor, isReplace) {\n    var sb = editor.searchBox || new SearchBox(editor);\n    sb.show(editor.session.getTextRange(), isReplace);\n};\n\n});\n\nace.define(\"ace/ext/old_ie\",[\"require\",\"exports\",\"module\",\"ace/lib/useragent\",\"ace/tokenizer\",\"ace/ext/searchbox\",\"ace/mode/text\"], function(require, exports, module) {\n\"use strict\";\nvar MAX_TOKEN_COUNT = 1000;\nvar useragent = require(\"../lib/useragent\");\nvar TokenizerModule = require(\"../tokenizer\");\n\nfunction patch(obj, name, regexp, replacement) {\n    eval(\"obj['\" + name + \"']=\" + obj[name].toString().replace(\n        regexp, replacement\n    ));\n}\n\nif (useragent.isIE && useragent.isIE < 10 && window.top.document.compatMode === \"BackCompat\")\n    useragent.isOldIE = true;\n\nif (typeof document != \"undefined\" && !document.documentElement.querySelector) {    \n    useragent.isOldIE = true;\n    var qs = function(el, selector) {\n        if (selector.charAt(0) == \".\") {\n            var classNeme = selector.slice(1);\n        } else {\n            var m = selector.match(/(\\w+)=(\\w+)/);\n            var attr = m && m[1];\n            var attrVal = m && m[2];\n        }\n        for (var i = 0; i < el.all.length; i++) {\n            var ch = el.all[i];\n            if (classNeme) {\n                if (ch.className.indexOf(classNeme) != -1)\n                    return ch;\n            } else if (attr) {\n                if (ch.getAttribute(attr) == attrVal)\n                    return ch;\n            }\n        }\n    };\n    var sb = require(\"./searchbox\").SearchBox.prototype;\n    patch(\n        sb, \"$initElements\",\n        /([^\\s=]*).querySelector\\((\".*?\")\\)/g, \n        \"qs($1, $2)\"\n    );\n}\n    \nvar compliantExecNpcg = /()??/.exec(\"\")[1] === undefined;\nif (compliantExecNpcg)\n    return;\nvar proto = TokenizerModule.Tokenizer.prototype;\nTokenizerModule.Tokenizer_orig = TokenizerModule.Tokenizer;\nproto.getLineTokens_orig = proto.getLineTokens;\n\npatch(\n    TokenizerModule, \"Tokenizer\",\n    \"ruleRegExps.push(adjustedregex);\\n\", \n    function(m) {\n        return m + '\\\n        if (state[i].next && RegExp(adjustedregex).test(\"\"))\\n\\\n            rule._qre = RegExp(adjustedregex, \"g\");\\n\\\n        ';\n    }\n);\nTokenizerModule.Tokenizer.prototype = proto;\npatch(\n    proto, \"getLineTokens\",\n    /if \\(match\\[i \\+ 1\\] === undefined\\)\\s*continue;/, \n    \"if (!match[i + 1]) {\\n\\\n        if (value)continue;\\n\\\n        var qre = state[mapping[i]]._qre;\\n\\\n        if (!qre) continue;\\n\\\n        qre.lastIndex = lastIndex;\\n\\\n        if (!qre.exec(line) || qre.lastIndex != lastIndex)\\n\\\n            continue;\\n\\\n    }\"\n);\n\npatch(\n    require(\"../mode/text\").Mode.prototype, \"getTokenizer\",\n    /Tokenizer/,\n    \"TokenizerModule.Tokenizer\"\n);\n\nuseragent.isOldIE = true;\n\n});\n                (function() {\n                    ace.require([\"ace/ext/old_ie\"], function() {});\n                })();\n            "
  },
  {
    "path": "browser/plugins/ace/src-noconflict/ext-searchbox.js",
    "content": "ace.define(\"ace/ext/searchbox\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/lang\",\"ace/lib/event\",\"ace/keyboard/hash_handler\",\"ace/lib/keys\"], function(require, exports, module) {\n\"use strict\";\n\nvar dom = require(\"../lib/dom\");\nvar lang = require(\"../lib/lang\");\nvar event = require(\"../lib/event\");\nvar searchboxCss = \"\\\n.ace_search {\\\nbackground-color: #ddd;\\\nborder: 1px solid #cbcbcb;\\\nborder-top: 0 none;\\\nmax-width: 325px;\\\noverflow: hidden;\\\nmargin: 0;\\\npadding: 4px;\\\npadding-right: 6px;\\\npadding-bottom: 0;\\\nposition: absolute;\\\ntop: 0px;\\\nz-index: 99;\\\nwhite-space: normal;\\\n}\\\n.ace_search.left {\\\nborder-left: 0 none;\\\nborder-radius: 0px 0px 5px 0px;\\\nleft: 0;\\\n}\\\n.ace_search.right {\\\nborder-radius: 0px 0px 0px 5px;\\\nborder-right: 0 none;\\\nright: 0;\\\n}\\\n.ace_search_form, .ace_replace_form {\\\nborder-radius: 3px;\\\nborder: 1px solid #cbcbcb;\\\nfloat: left;\\\nmargin-bottom: 4px;\\\noverflow: hidden;\\\n}\\\n.ace_search_form.ace_nomatch {\\\noutline: 1px solid red;\\\n}\\\n.ace_search_field {\\\nbackground-color: white;\\\nborder-right: 1px solid #cbcbcb;\\\nborder: 0 none;\\\n-webkit-box-sizing: border-box;\\\n-moz-box-sizing: border-box;\\\nbox-sizing: border-box;\\\nfloat: left;\\\nheight: 22px;\\\noutline: 0;\\\npadding: 0 7px;\\\nwidth: 214px;\\\nmargin: 0;\\\n}\\\n.ace_searchbtn,\\\n.ace_replacebtn {\\\nbackground: #fff;\\\nborder: 0 none;\\\nborder-left: 1px solid #dcdcdc;\\\ncursor: pointer;\\\nfloat: left;\\\nheight: 22px;\\\nmargin: 0;\\\npadding: 0;\\\nposition: relative;\\\n}\\\n.ace_searchbtn:last-child,\\\n.ace_replacebtn:last-child {\\\nborder-top-right-radius: 3px;\\\nborder-bottom-right-radius: 3px;\\\n}\\\n.ace_searchbtn:disabled {\\\nbackground: none;\\\ncursor: default;\\\n}\\\n.ace_searchbtn {\\\nbackground-position: 50% 50%;\\\nbackground-repeat: no-repeat;\\\nwidth: 27px;\\\n}\\\n.ace_searchbtn.prev {\\\nbackground-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADFJREFUeNpiSU1NZUAC/6E0I0yACYskCpsJiySKIiY0SUZk40FyTEgCjGgKwTRAgAEAQJUIPCE+qfkAAAAASUVORK5CYII=);    \\\n}\\\n.ace_searchbtn.next {\\\nbackground-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAFCAYAAAB4ka1VAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADRJREFUeNpiTE1NZQCC/0DMyIAKwGJMUAYDEo3M/s+EpvM/mkKwCQxYjIeLMaELoLMBAgwAU7UJObTKsvAAAAAASUVORK5CYII=);    \\\n}\\\n.ace_searchbtn_close {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;\\\nborder-radius: 50%;\\\nborder: 0 none;\\\ncolor: #656565;\\\ncursor: pointer;\\\nfloat: right;\\\nfont: 16px/16px Arial;\\\nheight: 14px;\\\nmargin: 5px 1px 9px 5px;\\\npadding: 0;\\\ntext-align: center;\\\nwidth: 14px;\\\n}\\\n.ace_searchbtn_close:hover {\\\nbackground-color: #656565;\\\nbackground-position: 50% 100%;\\\ncolor: white;\\\n}\\\n.ace_replacebtn.prev {\\\nwidth: 54px\\\n}\\\n.ace_replacebtn.next {\\\nwidth: 27px\\\n}\\\n.ace_button {\\\nmargin-left: 2px;\\\ncursor: pointer;\\\n-webkit-user-select: none;\\\n-moz-user-select: none;\\\n-o-user-select: none;\\\n-ms-user-select: none;\\\nuser-select: none;\\\noverflow: hidden;\\\nopacity: 0.7;\\\nborder: 1px solid rgba(100,100,100,0.23);\\\npadding: 1px;\\\n-moz-box-sizing: border-box;\\\nbox-sizing:    border-box;\\\ncolor: black;\\\n}\\\n.ace_button:hover {\\\nbackground-color: #eee;\\\nopacity:1;\\\n}\\\n.ace_button:active {\\\nbackground-color: #ddd;\\\n}\\\n.ace_button.checked {\\\nborder-color: #3399ff;\\\nopacity:1;\\\n}\\\n.ace_search_options{\\\nmargin-bottom: 3px;\\\ntext-align: right;\\\n-webkit-user-select: none;\\\n-moz-user-select: none;\\\n-o-user-select: none;\\\n-ms-user-select: none;\\\nuser-select: none;\\\n}\";\nvar HashHandler = require(\"../keyboard/hash_handler\").HashHandler;\nvar keyUtil = require(\"../lib/keys\");\n\ndom.importCssString(searchboxCss, \"ace_searchbox\");\n\nvar html = '<div class=\"ace_search right\">\\\n    <button type=\"button\" action=\"hide\" class=\"ace_searchbtn_close\"></button>\\\n    <div class=\"ace_search_form\">\\\n        <input class=\"ace_search_field\" placeholder=\"Search for\" spellcheck=\"false\"></input>\\\n        <button type=\"button\" action=\"findNext\" class=\"ace_searchbtn next\"></button>\\\n        <button type=\"button\" action=\"findPrev\" class=\"ace_searchbtn prev\"></button>\\\n        <button type=\"button\" action=\"findAll\" class=\"ace_searchbtn\" title=\"Alt-Enter\">All</button>\\\n    </div>\\\n    <div class=\"ace_replace_form\">\\\n        <input class=\"ace_search_field\" placeholder=\"Replace with\" spellcheck=\"false\"></input>\\\n        <button type=\"button\" action=\"replaceAndFindNext\" class=\"ace_replacebtn\">Replace</button>\\\n        <button type=\"button\" action=\"replaceAll\" class=\"ace_replacebtn\">All</button>\\\n    </div>\\\n    <div class=\"ace_search_options\">\\\n        <span action=\"toggleRegexpMode\" class=\"ace_button\" title=\"RegExp Search\">.*</span>\\\n        <span action=\"toggleCaseSensitive\" class=\"ace_button\" title=\"CaseSensitive Search\">Aa</span>\\\n        <span action=\"toggleWholeWords\" class=\"ace_button\" title=\"Whole Word Search\">\\\\b</span>\\\n    </div>\\\n</div>'.replace(/>\\s+/g, \">\");\n\nvar SearchBox = function(editor, range, showReplaceForm) {\n    var div = dom.createElement(\"div\");\n    div.innerHTML = html;\n    this.element = div.firstChild;\n\n    this.$init();\n    this.setEditor(editor);\n};\n\n(function() {\n    this.setEditor = function(editor) {\n        editor.searchBox = this;\n        editor.container.appendChild(this.element);\n        this.editor = editor;\n    };\n\n    this.$initElements = function(sb) {\n        this.searchBox = sb.querySelector(\".ace_search_form\");\n        this.replaceBox = sb.querySelector(\".ace_replace_form\");\n        this.searchOptions = sb.querySelector(\".ace_search_options\");\n        this.regExpOption = sb.querySelector(\"[action=toggleRegexpMode]\");\n        this.caseSensitiveOption = sb.querySelector(\"[action=toggleCaseSensitive]\");\n        this.wholeWordOption = sb.querySelector(\"[action=toggleWholeWords]\");\n        this.searchInput = this.searchBox.querySelector(\".ace_search_field\");\n        this.replaceInput = this.replaceBox.querySelector(\".ace_search_field\");\n    };\n    \n    this.$init = function() {\n        var sb = this.element;\n        \n        this.$initElements(sb);\n        \n        var _this = this;\n        event.addListener(sb, \"mousedown\", function(e) {\n            setTimeout(function(){\n                _this.activeInput.focus();\n            }, 0);\n            event.stopPropagation(e);\n        });\n        event.addListener(sb, \"click\", function(e) {\n            var t = e.target || e.srcElement;\n            var action = t.getAttribute(\"action\");\n            if (action && _this[action])\n                _this[action]();\n            else if (_this.$searchBarKb.commands[action])\n                _this.$searchBarKb.commands[action].exec(_this);\n            event.stopPropagation(e);\n        });\n\n        event.addCommandKeyListener(sb, function(e, hashId, keyCode) {\n            var keyString = keyUtil.keyCodeToString(keyCode);\n            var command = _this.$searchBarKb.findKeyCommand(hashId, keyString);\n            if (command && command.exec) {\n                command.exec(_this);\n                event.stopEvent(e);\n            }\n        });\n\n        this.$onChange = lang.delayedCall(function() {\n            _this.find(false, false);\n        });\n\n        event.addListener(this.searchInput, \"input\", function() {\n            _this.$onChange.schedule(20);\n        });\n        event.addListener(this.searchInput, \"focus\", function() {\n            _this.activeInput = _this.searchInput;\n            _this.searchInput.value && _this.highlight();\n        });\n        event.addListener(this.replaceInput, \"focus\", function() {\n            _this.activeInput = _this.replaceInput;\n            _this.searchInput.value && _this.highlight();\n        });\n    };\n    this.$closeSearchBarKb = new HashHandler([{\n        bindKey: \"Esc\",\n        name: \"closeSearchBar\",\n        exec: function(editor) {\n            editor.searchBox.hide();\n        }\n    }]);\n    this.$searchBarKb = new HashHandler();\n    this.$searchBarKb.bindKeys({\n        \"Ctrl-f|Command-f|Ctrl-H|Command-Option-F\": function(sb) {\n            var isReplace = sb.isReplace = !sb.isReplace;\n            sb.replaceBox.style.display = isReplace ? \"\" : \"none\";\n            sb[isReplace ? \"replaceInput\" : \"searchInput\"].focus();\n        },\n        \"Ctrl-G|Command-G\": function(sb) {\n            sb.findNext();\n        },\n        \"Ctrl-Shift-G|Command-Shift-G\": function(sb) {\n            sb.findPrev();\n        },\n        \"esc\": function(sb) {\n            setTimeout(function() { sb.hide();});\n        },\n        \"Return\": function(sb) {\n            if (sb.activeInput == sb.replaceInput)\n                sb.replace();\n            sb.findNext();\n        },\n        \"Shift-Return\": function(sb) {\n            if (sb.activeInput == sb.replaceInput)\n                sb.replace();\n            sb.findPrev();\n        },\n        \"Alt-Return\": function(sb) {\n            if (sb.activeInput == sb.replaceInput)\n                sb.replaceAll();\n            sb.findAll();\n        },\n        \"Tab\": function(sb) {\n            (sb.activeInput == sb.replaceInput ? sb.searchInput : sb.replaceInput).focus();\n        }\n    });\n\n    this.$searchBarKb.addCommands([{\n        name: \"toggleRegexpMode\",\n        bindKey: {win: \"Alt-R|Alt-/\", mac: \"Ctrl-Alt-R|Ctrl-Alt-/\"},\n        exec: function(sb) {\n            sb.regExpOption.checked = !sb.regExpOption.checked;\n            sb.$syncOptions();\n        }\n    }, {\n        name: \"toggleCaseSensitive\",\n        bindKey: {win: \"Alt-C|Alt-I\", mac: \"Ctrl-Alt-R|Ctrl-Alt-I\"},\n        exec: function(sb) {\n            sb.caseSensitiveOption.checked = !sb.caseSensitiveOption.checked;\n            sb.$syncOptions();\n        }\n    }, {\n        name: \"toggleWholeWords\",\n        bindKey: {win: \"Alt-B|Alt-W\", mac: \"Ctrl-Alt-B|Ctrl-Alt-W\"},\n        exec: function(sb) {\n            sb.wholeWordOption.checked = !sb.wholeWordOption.checked;\n            sb.$syncOptions();\n        }\n    }]);\n\n    this.$syncOptions = function() {\n        dom.setCssClass(this.regExpOption, \"checked\", this.regExpOption.checked);\n        dom.setCssClass(this.wholeWordOption, \"checked\", this.wholeWordOption.checked);\n        dom.setCssClass(this.caseSensitiveOption, \"checked\", this.caseSensitiveOption.checked);\n        this.find(false, false);\n    };\n\n    this.highlight = function(re) {\n        this.editor.session.highlight(re || this.editor.$search.$options.re);\n        this.editor.renderer.updateBackMarkers()\n    };\n    this.find = function(skipCurrent, backwards) {\n        var range = this.editor.find(this.searchInput.value, {\n            skipCurrent: skipCurrent,\n            backwards: backwards,\n            wrap: true,\n            regExp: this.regExpOption.checked,\n            caseSensitive: this.caseSensitiveOption.checked,\n            wholeWord: this.wholeWordOption.checked\n        });\n        var noMatch = !range && this.searchInput.value;\n        dom.setCssClass(this.searchBox, \"ace_nomatch\", noMatch);\n        this.editor._emit(\"findSearchBox\", { match: !noMatch });\n        this.highlight();\n    };\n    this.findNext = function() {\n        this.find(true, false);\n    };\n    this.findPrev = function() {\n        this.find(true, true);\n    };\n    this.findAll = function(){\n        var range = this.editor.findAll(this.searchInput.value, {            \n            regExp: this.regExpOption.checked,\n            caseSensitive: this.caseSensitiveOption.checked,\n            wholeWord: this.wholeWordOption.checked\n        });\n        var noMatch = !range && this.searchInput.value;\n        dom.setCssClass(this.searchBox, \"ace_nomatch\", noMatch);\n        this.editor._emit(\"findSearchBox\", { match: !noMatch });\n        this.highlight();\n        this.hide();\n    };\n    this.replace = function() {\n        if (!this.editor.getReadOnly())\n            this.editor.replace(this.replaceInput.value);\n    };    \n    this.replaceAndFindNext = function() {\n        if (!this.editor.getReadOnly()) {\n            this.editor.replace(this.replaceInput.value);\n            this.findNext()\n        }\n    };\n    this.replaceAll = function() {\n        if (!this.editor.getReadOnly())\n            this.editor.replaceAll(this.replaceInput.value);\n    };\n\n    this.hide = function() {\n        this.element.style.display = \"none\";\n        this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb);\n        this.editor.focus();\n    };\n    this.show = function(value, isReplace) {\n        this.element.style.display = \"\";\n        this.replaceBox.style.display = isReplace ? \"\" : \"none\";\n\n        this.isReplace = isReplace;\n\n        if (value)\n            this.searchInput.value = value;\n        this.searchInput.focus();\n        this.searchInput.select();\n\n        this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb);\n    };\n\n    this.isFocused = function() {\n        var el = document.activeElement;\n        return el == this.searchInput || el == this.replaceInput;\n    }\n}).call(SearchBox.prototype);\n\nexports.SearchBox = SearchBox;\n\nexports.Search = function(editor, isReplace) {\n    var sb = editor.searchBox || new SearchBox(editor);\n    sb.show(editor.session.getTextRange(), isReplace);\n};\n\n});\n                (function() {\n                    ace.require([\"ace/ext/searchbox\"], function() {});\n                })();\n            "
  },
  {
    "path": "browser/plugins/ace/src-noconflict/ext-settings_menu.js",
    "content": "ace.define(\"ace/ext/menu_tools/element_generator\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n'use strict';\nmodule.exports.createOption = function createOption (obj) {\n    var attribute;\n    var el = document.createElement('option');\n    for(attribute in obj) {\n        if(obj.hasOwnProperty(attribute)) {\n            if(attribute === 'selected') {\n                el.setAttribute(attribute, obj[attribute]);\n            } else {\n                el[attribute] = obj[attribute];\n            }\n        }\n    }\n    return el;\n};\nmodule.exports.createCheckbox = function createCheckbox (id, checked, clss) {\n    var el = document.createElement('input');\n    el.setAttribute('type', 'checkbox');\n    el.setAttribute('id', id);\n    el.setAttribute('name', id);\n    el.setAttribute('value', checked);\n    el.setAttribute('class', clss);\n    if(checked) {\n        el.setAttribute('checked', 'checked');\n    }\n    return el;\n};\nmodule.exports.createInput = function createInput (id, value, clss) {\n    var el = document.createElement('input');\n    el.setAttribute('type', 'text');\n    el.setAttribute('id', id);\n    el.setAttribute('name', id);\n    el.setAttribute('value', value);\n    el.setAttribute('class', clss);\n    return el;\n};\nmodule.exports.createLabel = function createLabel (text, labelFor) {\n    var el = document.createElement('label');\n    el.setAttribute('for', labelFor);\n    el.textContent = text;\n    return el;\n};\nmodule.exports.createSelection = function createSelection (id, values, clss) {\n    var el = document.createElement('select');\n    el.setAttribute('id', id);\n    el.setAttribute('name', id);\n    el.setAttribute('class', clss);\n    values.forEach(function(item) {\n        el.appendChild(module.exports.createOption(item));\n    });\n    return el;\n};\n\n});\n\nace.define(\"ace/ext/modelist\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nvar modes = [];\nfunction getModeForPath(path) {\n    var mode = modesByName.text;\n    var fileName = path.split(/[\\/\\\\]/).pop();\n    for (var i = 0; i < modes.length; i++) {\n        if (modes[i].supportsFile(fileName)) {\n            mode = modes[i];\n            break;\n        }\n    }\n    return mode;\n}\n\nvar Mode = function(name, caption, extensions) {\n    this.name = name;\n    this.caption = caption;\n    this.mode = \"ace/mode/\" + name;\n    this.extensions = extensions;\n    if (/\\^/.test(extensions)) {\n        var re = extensions.replace(/\\|(\\^)?/g, function(a, b){\n            return \"$|\" + (b ? \"^\" : \"^.*\\\\.\");\n        }) + \"$\";\n    } else {\n        var re = \"^.*\\\\.(\" + extensions + \")$\";\n    }\n\n    this.extRe = new RegExp(re, \"gi\");\n};\n\nMode.prototype.supportsFile = function(filename) {\n    return filename.match(this.extRe);\n};\nvar supportedModes = {\n    ABAP:        [\"abap\"],\n    ActionScript:[\"as\"],\n    ADA:         [\"ada|adb\"],\n    Apache_Conf: [\"^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd\"],\n    AsciiDoc:    [\"asciidoc\"],\n    Assembly_x86:[\"asm\"],\n    AutoHotKey:  [\"ahk\"],\n    BatchFile:   [\"bat|cmd\"],\n    C9Search:    [\"c9search_results\"],\n    C_Cpp:       [\"cpp|c|cc|cxx|h|hh|hpp\"],\n    Cirru:       [\"cirru|cr\"],\n    Clojure:     [\"clj|cljs\"],\n    Cobol:       [\"CBL|COB\"],\n    coffee:      [\"coffee|cf|cson|^Cakefile\"],\n    ColdFusion:  [\"cfm\"],\n    CSharp:      [\"cs\"],\n    CSS:         [\"css\"],\n    Curly:       [\"curly\"],\n    D:           [\"d|di\"],\n    Dart:        [\"dart\"],\n    Diff:        [\"diff|patch\"],\n    Dockerfile:  [\"^Dockerfile\"],\n    Dot:         [\"dot\"],\n    Dummy:       [\"dummy\"],\n    DummySyntax: [\"dummy\"],\n    Eiffel:      [\"e\"],\n    EJS:         [\"ejs\"],\n    Elixir:      [\"ex|exs\"],\n    Elm:         [\"elm\"],\n    Erlang:      [\"erl|hrl\"],\n    Forth:       [\"frt|fs|ldr\"],\n    FTL:         [\"ftl\"],\n    Gcode:       [\"gcode\"],\n    Gherkin:     [\"feature\"],\n    Gitignore:   [\"^.gitignore\"],\n    Glsl:        [\"glsl|frag|vert\"],\n    golang:      [\"go\"],\n    Groovy:      [\"groovy\"],\n    HAML:        [\"haml\"],\n    Handlebars:  [\"hbs|handlebars|tpl|mustache\"],\n    Haskell:     [\"hs\"],\n    haXe:        [\"hx\"],\n    HTML:        [\"html|htm|xhtml\"],\n    HTML_Ruby:   [\"erb|rhtml|html.erb\"],\n    INI:         [\"ini|conf|cfg|prefs\"],\n    Io:          [\"io\"],\n    Jack:        [\"jack\"],\n    Jade:        [\"jade\"],\n    Java:        [\"java\"],\n    JavaScript:  [\"js|jsm\"],\n    JSON:        [\"json\"],\n    JSONiq:      [\"jq\"],\n    JSP:         [\"jsp\"],\n    JSX:         [\"jsx\"],\n    Julia:       [\"jl\"],\n    LaTeX:       [\"tex|latex|ltx|bib\"],\n    LESS:        [\"less\"],\n    Liquid:      [\"liquid\"],\n    Lisp:        [\"lisp\"],\n    LiveScript:  [\"ls\"],\n    LogiQL:      [\"logic|lql\"],\n    LSL:         [\"lsl\"],\n    Lua:         [\"lua\"],\n    LuaPage:     [\"lp\"],\n    Lucene:      [\"lucene\"],\n    Makefile:    [\"^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make\"],\n    Markdown:    [\"md|markdown\"],\n    Mask:        [\"mask\"],\n    MATLAB:      [\"matlab\"],\n    MEL:         [\"mel\"],\n    MUSHCode:    [\"mc|mush\"],\n    MySQL:       [\"mysql\"],\n    Nix:         [\"nix\"],\n    ObjectiveC:  [\"m|mm\"],\n    OCaml:       [\"ml|mli\"],\n    Pascal:      [\"pas|p\"],\n    Perl:        [\"pl|pm\"],\n    pgSQL:       [\"pgsql\"],\n    PHP:         [\"php|phtml\"],\n    Powershell:  [\"ps1\"],\n    Praat:       [\"praat|praatscript|psc|proc\"],\n    Prolog:      [\"plg|prolog\"],\n    Properties:  [\"properties\"],\n    Protobuf:    [\"proto\"],\n    Python:      [\"py\"],\n    R:           [\"r\"],\n    RDoc:        [\"Rd\"],\n    RHTML:       [\"Rhtml\"],\n    Ruby:        [\"rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile\"],\n    Rust:        [\"rs\"],\n    SASS:        [\"sass\"],\n    SCAD:        [\"scad\"],\n    Scala:       [\"scala\"],\n    Scheme:      [\"scm|rkt\"],\n    SCSS:        [\"scss\"],\n    SH:          [\"sh|bash|^.bashrc\"],\n    SJS:         [\"sjs\"],\n    Smarty:      [\"smarty|tpl\"],\n    snippets:    [\"snippets\"],\n    Soy_Template:[\"soy\"],\n    Space:       [\"space\"],\n    SQL:         [\"sql\"],\n    Stylus:      [\"styl|stylus\"],\n    SVG:         [\"svg\"],\n    Tcl:         [\"tcl\"],\n    Tex:         [\"tex\"],\n    Text:        [\"txt\"],\n    Textile:     [\"textile\"],\n    Toml:        [\"toml\"],\n    Twig:        [\"twig\"],\n    Typescript:  [\"ts|typescript|str\"],\n    Vala:        [\"vala\"],\n    VBScript:    [\"vbs|vb\"],\n    Velocity:    [\"vm\"],\n    Verilog:     [\"v|vh|sv|svh\"],\n    VHDL:        [\"vhd|vhdl\"],\n    XML:         [\"xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl\"],\n    XQuery:      [\"xq\"],\n    YAML:        [\"yaml|yml\"]\n};\n\nvar nameOverrides = {\n    ObjectiveC: \"Objective-C\",\n    CSharp: \"C#\",\n    golang: \"Go\",\n    C_Cpp: \"C and C++\",\n    coffee: \"CoffeeScript\",\n    HTML_Ruby: \"HTML (Ruby)\",\n    FTL: \"FreeMarker\"\n};\nvar modesByName = {};\nfor (var name in supportedModes) {\n    var data = supportedModes[name];\n    var displayName = (nameOverrides[name] || name).replace(/_/g, \" \");\n    var filename = name.toLowerCase();\n    var mode = new Mode(filename, displayName, data[0]);\n    modesByName[filename] = mode;\n    modes.push(mode);\n}\n\nmodule.exports = {\n    getModeForPath: getModeForPath,\n    modes: modes,\n    modesByName: modesByName\n};\n\n});\n\nace.define(\"ace/ext/themelist\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\"], function(require, exports, module) {\n\"use strict\";\nrequire(\"ace/lib/fixoldbrowsers\");\n\nvar themeData = [\n    [\"Chrome\"         ],\n    [\"Clouds\"         ],\n    [\"Crimson Editor\" ],\n    [\"Dawn\"           ],\n    [\"Dreamweaver\"    ],\n    [\"Eclipse\"        ],\n    [\"GitHub\"         ],\n    [\"Solarized Light\"],\n    [\"TextMate\"       ],\n    [\"Tomorrow\"       ],\n    [\"XCode\"          ],\n    [\"Kuroir\"],\n    [\"KatzenMilch\"],\n    [\"Ambiance\"             ,\"ambiance\"                ,  \"dark\"],\n    [\"Chaos\"                ,\"chaos\"                   ,  \"dark\"],\n    [\"Clouds Midnight\"      ,\"clouds_midnight\"         ,  \"dark\"],\n    [\"Cobalt\"               ,\"cobalt\"                  ,  \"dark\"],\n    [\"idle Fingers\"         ,\"idle_fingers\"            ,  \"dark\"],\n    [\"krTheme\"              ,\"kr_theme\"                ,  \"dark\"],\n    [\"Merbivore\"            ,\"merbivore\"               ,  \"dark\"],\n    [\"Merbivore Soft\"       ,\"merbivore_soft\"          ,  \"dark\"],\n    [\"Mono Industrial\"      ,\"mono_industrial\"         ,  \"dark\"],\n    [\"Monokai\"              ,\"monokai\"                 ,  \"dark\"],\n    [\"Pastel on dark\"       ,\"pastel_on_dark\"          ,  \"dark\"],\n    [\"Solarized Dark\"       ,\"solarized_dark\"          ,  \"dark\"],\n    [\"Terminal\"             ,\"terminal\"                ,  \"dark\"],\n    [\"Tomorrow Night\"       ,\"tomorrow_night\"          ,  \"dark\"],\n    [\"Tomorrow Night Blue\"  ,\"tomorrow_night_blue\"     ,  \"dark\"],\n    [\"Tomorrow Night Bright\",\"tomorrow_night_bright\"   ,  \"dark\"],\n    [\"Tomorrow Night 80s\"   ,\"tomorrow_night_eighties\" ,  \"dark\"],\n    [\"Twilight\"             ,\"twilight\"                ,  \"dark\"],\n    [\"Vibrant Ink\"          ,\"vibrant_ink\"             ,  \"dark\"]\n];\n\n\nexports.themesByName = {};\nexports.themes = themeData.map(function(data) {\n    var name = data[1] || data[0].replace(/ /g, \"_\").toLowerCase();\n    var theme = {\n        caption: data[0],\n        theme: \"ace/theme/\" + name,\n        isDark: data[2] == \"dark\",\n        name: name\n    };\n    exports.themesByName[name] = theme;\n    return theme;\n});\n\n});\n\nace.define(\"ace/ext/menu_tools/add_editor_menu_options\",[\"require\",\"exports\",\"module\",\"ace/ext/modelist\",\"ace/ext/themelist\"], function(require, exports, module) {\n'use strict';\nmodule.exports.addEditorMenuOptions = function addEditorMenuOptions (editor) {\n    var modelist = require('../modelist');\n    var themelist = require('../themelist');\n    editor.menuOptions = {\n        setNewLineMode: [{\n            textContent: \"unix\",\n            value: \"unix\"\n        }, {\n            textContent: \"windows\",\n            value: \"windows\"\n        }, {\n            textContent: \"auto\",\n            value: \"auto\"\n        }],\n        setTheme: [],\n        setMode: [],\n        setKeyboardHandler: [{\n            textContent: \"ace\",\n            value: \"\"\n        }, {\n            textContent: \"vim\",\n            value: \"ace/keyboard/vim\"\n        }, {\n            textContent: \"emacs\",\n            value: \"ace/keyboard/emacs\"\n        }, {\n            textContent: \"textarea\",\n            value: \"ace/keyboard/textarea\"\n        }, {\n            textContent: \"sublime\",\n            value: \"ace/keyboard/sublime\"\n        }]\n    };\n\n    editor.menuOptions.setTheme = themelist.themes.map(function(theme) {\n        return {\n            textContent: theme.caption,\n            value: theme.theme\n        };\n    });\n\n    editor.menuOptions.setMode = modelist.modes.map(function(mode) {\n        return {\n            textContent: mode.name,\n            value: mode.mode\n        };\n    });\n};\n\n\n});\n\nace.define(\"ace/ext/menu_tools/get_set_functions\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n'use strict';\nmodule.exports.getSetFunctions = function getSetFunctions (editor) {\n    var out = [];\n    var my = {\n        'editor' : editor,\n        'session' : editor.session,\n        'renderer' : editor.renderer\n    };\n    var opts = [];\n    var skip = [\n        'setOption',\n        'setUndoManager',\n        'setDocument',\n        'setValue',\n        'setBreakpoints',\n        'setScrollTop',\n        'setScrollLeft',\n        'setSelectionStyle',\n        'setWrapLimitRange'\n    ];\n    ['renderer', 'session', 'editor'].forEach(function(esra) {\n        var esr = my[esra];\n        var clss = esra;\n        for(var fn in esr) {\n            if(skip.indexOf(fn) === -1) {\n                if(/^set/.test(fn) && opts.indexOf(fn) === -1) {\n                    opts.push(fn);\n                    out.push({\n                        'functionName' : fn,\n                        'parentObj' : esr,\n                        'parentName' : clss\n                    });\n                }\n            }\n        }\n    });\n    return out;\n};\n\n});\n\nace.define(\"ace/ext/menu_tools/generate_settings_menu\",[\"require\",\"exports\",\"module\",\"ace/ext/menu_tools/element_generator\",\"ace/ext/menu_tools/add_editor_menu_options\",\"ace/ext/menu_tools/get_set_functions\"], function(require, exports, module) {\n'use strict';\nvar egen = require('./element_generator');\nvar addEditorMenuOptions = require('./add_editor_menu_options').addEditorMenuOptions;\nvar getSetFunctions = require('./get_set_functions').getSetFunctions;\nmodule.exports.generateSettingsMenu = function generateSettingsMenu (editor) {\n    var elements = [];\n    function cleanupElementsList() {\n        elements.sort(function(a, b) {\n            var x = a.getAttribute('contains');\n            var y = b.getAttribute('contains');\n            return x.localeCompare(y);\n        });\n    }\n    function wrapElements() {\n        var topmenu = document.createElement('div');\n        topmenu.setAttribute('id', 'ace_settingsmenu');\n        elements.forEach(function(element) {\n            topmenu.appendChild(element);\n        });\n        \n        var el = topmenu.appendChild(document.createElement('div'));\n        var version = \"1.1.8\";\n        el.style.padding = \"1em\";\n        el.textContent = \"Ace version \" + version;\n        \n        return topmenu;\n    }\n    function createNewEntry(obj, clss, item, val) {\n        var el;\n        var div = document.createElement('div');\n        div.setAttribute('contains', item);\n        div.setAttribute('class', 'ace_optionsMenuEntry');\n        div.setAttribute('style', 'clear: both;');\n\n        div.appendChild(egen.createLabel(\n            item.replace(/^set/, '').replace(/([A-Z])/g, ' $1').trim(),\n            item\n        ));\n\n        if (Array.isArray(val)) {\n            el = egen.createSelection(item, val, clss);\n            el.addEventListener('change', function(e) {\n                try{\n                    editor.menuOptions[e.target.id].forEach(function(x) {\n                        if(x.textContent !== e.target.textContent) {\n                            delete x.selected;\n                        }\n                    });\n                    obj[e.target.id](e.target.value);\n                } catch (err) {\n                    throw new Error(err);\n                }\n            });\n        } else if(typeof val === 'boolean') {\n            el = egen.createCheckbox(item, val, clss);\n            el.addEventListener('change', function(e) {\n                try{\n                    obj[e.target.id](!!e.target.checked);\n                } catch (err) {\n                    throw new Error(err);\n                }\n            });\n        } else {\n            el = egen.createInput(item, val, clss);\n            el.addEventListener('change', function(e) {\n                try{\n                    if(e.target.value === 'true') {\n                        obj[e.target.id](true);\n                    } else if(e.target.value === 'false') {\n                        obj[e.target.id](false);\n                    } else {\n                        obj[e.target.id](e.target.value);\n                    }\n                } catch (err) {\n                    throw new Error(err);\n                }\n            });\n        }\n        el.style.cssText = 'float:right;';\n        div.appendChild(el);\n        return div;\n    }\n    function makeDropdown(item, esr, clss, fn) {\n        var val = editor.menuOptions[item];\n        var currentVal = esr[fn]();\n        if (typeof currentVal == 'object')\n            currentVal = currentVal.$id;\n        val.forEach(function(valuex) {\n            if (valuex.value === currentVal)\n                valuex.selected = 'selected';\n        });\n        return createNewEntry(esr, clss, item, val);\n    }\n    function handleSet(setObj) {\n        var item = setObj.functionName;\n        var esr = setObj.parentObj;\n        var clss = setObj.parentName;\n        var val;\n        var fn = item.replace(/^set/, 'get');\n        if(editor.menuOptions[item] !== undefined) {\n            elements.push(makeDropdown(item, esr, clss, fn));\n        } else if(typeof esr[fn] === 'function') {\n            try {\n                val = esr[fn]();\n                if(typeof val === 'object') {\n                    val = val.$id;\n                }\n                elements.push(\n                    createNewEntry(esr, clss, item, val)\n                );\n            } catch (e) {\n            }\n        }\n    }\n    addEditorMenuOptions(editor);\n    getSetFunctions(editor).forEach(function(setObj) {\n        handleSet(setObj);\n    });\n    cleanupElementsList();\n    return wrapElements();\n};\n\n});\n\nace.define(\"ace/ext/menu_tools/overlay_page\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n'use strict';\nvar dom = require(\"../../lib/dom\");\nvar cssText = \"#ace_settingsmenu, #kbshortcutmenu {\\\nbackground-color: #F7F7F7;\\\ncolor: black;\\\nbox-shadow: -5px 4px 5px rgba(126, 126, 126, 0.55);\\\npadding: 1em 0.5em 2em 1em;\\\noverflow: auto;\\\nposition: absolute;\\\nmargin: 0;\\\nbottom: 0;\\\nright: 0;\\\ntop: 0;\\\nz-index: 9991;\\\ncursor: default;\\\n}\\\n.ace_dark #ace_settingsmenu, .ace_dark #kbshortcutmenu {\\\nbox-shadow: -20px 10px 25px rgba(126, 126, 126, 0.25);\\\nbackground-color: rgba(255, 255, 255, 0.6);\\\ncolor: black;\\\n}\\\n.ace_optionsMenuEntry:hover {\\\nbackground-color: rgba(100, 100, 100, 0.1);\\\n-webkit-transition: all 0.5s;\\\ntransition: all 0.3s\\\n}\\\n.ace_closeButton {\\\nbackground: rgba(245, 146, 146, 0.5);\\\nborder: 1px solid #F48A8A;\\\nborder-radius: 50%;\\\npadding: 7px;\\\nposition: absolute;\\\nright: -8px;\\\ntop: -8px;\\\nz-index: 1000;\\\n}\\\n.ace_closeButton{\\\nbackground: rgba(245, 146, 146, 0.9);\\\n}\\\n.ace_optionsMenuKey {\\\ncolor: darkslateblue;\\\nfont-weight: bold;\\\n}\\\n.ace_optionsMenuCommand {\\\ncolor: darkcyan;\\\nfont-weight: normal;\\\n}\";\ndom.importCssString(cssText);\nmodule.exports.overlayPage = function overlayPage(editor, contentElement, top, right, bottom, left) {\n    top = top ? 'top: ' + top + ';' : '';\n    bottom = bottom ? 'bottom: ' + bottom + ';' : '';\n    right = right ? 'right: ' + right + ';' : '';\n    left = left ? 'left: ' + left + ';' : '';\n\n    var closer = document.createElement('div');\n    var contentContainer = document.createElement('div');\n\n    function documentEscListener(e) {\n        if (e.keyCode === 27) {\n            closer.click();\n        }\n    }\n\n    closer.style.cssText = 'margin: 0; padding: 0; ' +\n        'position: fixed; top:0; bottom:0; left:0; right:0;' +\n        'z-index: 9990; ' +\n        'background-color: rgba(0, 0, 0, 0.3);';\n    closer.addEventListener('click', function() {\n        document.removeEventListener('keydown', documentEscListener);\n        closer.parentNode.removeChild(closer);\n        editor.focus();\n        closer = null;\n    });\n    document.addEventListener('keydown', documentEscListener);\n\n    contentContainer.style.cssText = top + right + bottom + left;\n    contentContainer.addEventListener('click', function(e) {\n        e.stopPropagation();\n    });\n\n    var wrapper = dom.createElement(\"div\");\n    wrapper.style.position = \"relative\";\n    \n    var closeButton = dom.createElement(\"div\");\n    closeButton.className = \"ace_closeButton\";\n    closeButton.addEventListener('click', function() {\n        closer.click();\n    });\n    \n    wrapper.appendChild(closeButton);\n    contentContainer.appendChild(wrapper);\n    \n    contentContainer.appendChild(contentElement);\n    closer.appendChild(contentContainer);\n    document.body.appendChild(closer);\n    editor.blur();\n};\n\n});\n\nace.define(\"ace/ext/settings_menu\",[\"require\",\"exports\",\"module\",\"ace/ext/menu_tools/generate_settings_menu\",\"ace/ext/menu_tools/overlay_page\",\"ace/editor\"], function(require, exports, module) {\n\"use strict\";\nvar generateSettingsMenu = require('./menu_tools/generate_settings_menu').generateSettingsMenu;\nvar overlayPage = require('./menu_tools/overlay_page').overlayPage;\nfunction showSettingsMenu(editor) {\n    var sm = document.getElementById('ace_settingsmenu');\n    if (!sm)    \n        overlayPage(editor, generateSettingsMenu(editor), '0', '0', '0');\n}\nmodule.exports.init = function(editor) {\n    var Editor = require(\"ace/editor\").Editor;\n    Editor.prototype.showSettingsMenu = function() {\n        showSettingsMenu(this);\n    };\n};\n});\n                (function() {\n                    ace.require([\"ace/ext/settings_menu\"], function() {});\n                })();\n            "
  },
  {
    "path": "browser/plugins/ace/src-noconflict/ext-spellcheck.js",
    "content": "ace.define(\"ace/ext/spellcheck\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/editor\",\"ace/config\"], function(require, exports, module) {\n\"use strict\";\nvar event = require(\"../lib/event\");\n\nexports.contextMenuHandler = function(e){\n    var host = e.target;\n    var text = host.textInput.getElement();\n    if (!host.selection.isEmpty())\n        return;\n    var c = host.getCursorPosition();\n    var r = host.session.getWordRange(c.row, c.column);\n    var w = host.session.getTextRange(r);\n\n    host.session.tokenRe.lastIndex = 0;\n    if (!host.session.tokenRe.test(w))\n        return;\n    var PLACEHOLDER = \"\\x01\\x01\";\n    var value = w + \" \" + PLACEHOLDER;\n    text.value = value;\n    text.setSelectionRange(w.length, w.length + 1);\n    text.setSelectionRange(0, 0);\n    text.setSelectionRange(0, w.length);\n\n    var afterKeydown = false;\n    event.addListener(text, \"keydown\", function onKeydown() {\n        event.removeListener(text, \"keydown\", onKeydown);\n        afterKeydown = true;\n    });\n\n    host.textInput.setInputHandler(function(newVal) {\n        console.log(newVal , value, text.selectionStart, text.selectionEnd)\n        if (newVal == value)\n            return '';\n        if (newVal.lastIndexOf(value, 0) === 0)\n            return newVal.slice(value.length);\n        if (newVal.substr(text.selectionEnd) == value)\n            return newVal.slice(0, -value.length);\n        if (newVal.slice(-2) == PLACEHOLDER) {\n            var val = newVal.slice(0, -2);\n            if (val.slice(-1) == \" \") {\n                if (afterKeydown)\n                    return val.substring(0, text.selectionEnd);\n                val = val.slice(0, -1);\n                host.session.replace(r, val);\n                return \"\";\n            }\n        }\n\n        return newVal;\n    });\n};\nvar Editor = require(\"../editor\").Editor;\nrequire(\"../config\").defineOptions(Editor.prototype, \"editor\", {\n    spellcheck: {\n        set: function(val) {\n            var text = this.textInput.getElement();\n            text.spellcheck = !!val;\n            if (!val)\n                this.removeListener(\"nativecontextmenu\", exports.contextMenuHandler);\n            else\n                this.on(\"nativecontextmenu\", exports.contextMenuHandler);\n        },\n        value: true\n    }\n});\n\n});\n                (function() {\n                    ace.require([\"ace/ext/spellcheck\"], function() {});\n                })();\n            "
  },
  {
    "path": "browser/plugins/ace/src-noconflict/ext-split.js",
    "content": "ace.define(\"ace/split\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/lib/event_emitter\",\"ace/editor\",\"ace/virtual_renderer\",\"ace/edit_session\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar lang = require(\"./lib/lang\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar Editor = require(\"./editor\").Editor;\nvar Renderer = require(\"./virtual_renderer\").VirtualRenderer;\nvar EditSession = require(\"./edit_session\").EditSession;\n\n\nvar Split = function(container, theme, splits) {\n    this.BELOW = 1;\n    this.BESIDE = 0;\n\n    this.$container = container;\n    this.$theme = theme;\n    this.$splits = 0;\n    this.$editorCSS = \"\";\n    this.$editors = [];\n    this.$orientation = this.BESIDE;\n\n    this.setSplits(splits || 1);\n    this.$cEditor = this.$editors[0];\n\n\n    this.on(\"focus\", function(editor) {\n        this.$cEditor = editor;\n    }.bind(this));\n};\n\n(function(){\n\n    oop.implement(this, EventEmitter);\n\n    this.$createEditor = function() {\n        var el = document.createElement(\"div\");\n        el.className = this.$editorCSS;\n        el.style.cssText = \"position: absolute; top:0px; bottom:0px\";\n        this.$container.appendChild(el);\n        var editor = new Editor(new Renderer(el, this.$theme));\n\n        editor.on(\"focus\", function() {\n            this._emit(\"focus\", editor);\n        }.bind(this));\n\n        this.$editors.push(editor);\n        editor.setFontSize(this.$fontSize);\n        return editor;\n    };\n\n    this.setSplits = function(splits) {\n        var editor;\n        if (splits < 1) {\n            throw \"The number of splits have to be > 0!\";\n        }\n\n        if (splits == this.$splits) {\n            return;\n        } else if (splits > this.$splits) {\n            while (this.$splits < this.$editors.length && this.$splits < splits) {\n                editor = this.$editors[this.$splits];\n                this.$container.appendChild(editor.container);\n                editor.setFontSize(this.$fontSize);\n                this.$splits ++;\n            }\n            while (this.$splits < splits) {\n                this.$createEditor();\n                this.$splits ++;\n            }\n        } else {\n            while (this.$splits > splits) {\n                editor = this.$editors[this.$splits - 1];\n                this.$container.removeChild(editor.container);\n                this.$splits --;\n            }\n        }\n        this.resize();\n    };\n    this.getSplits = function() {\n        return this.$splits;\n    };\n    this.getEditor = function(idx) {\n        return this.$editors[idx];\n    };\n    this.getCurrentEditor = function() {\n        return this.$cEditor;\n    };\n    this.focus = function() {\n        this.$cEditor.focus();\n    };\n    this.blur = function() {\n        this.$cEditor.blur();\n    };\n    this.setTheme = function(theme) {\n        this.$editors.forEach(function(editor) {\n            editor.setTheme(theme);\n        });\n    };\n    this.setKeyboardHandler = function(keybinding) {\n        this.$editors.forEach(function(editor) {\n            editor.setKeyboardHandler(keybinding);\n        });\n    };\n    this.forEach = function(callback, scope) {\n        this.$editors.forEach(callback, scope);\n    };\n\n\n    this.$fontSize = \"\";\n    this.setFontSize = function(size) {\n        this.$fontSize = size;\n        this.forEach(function(editor) {\n           editor.setFontSize(size);\n        });\n    };\n\n    this.$cloneSession = function(session) {\n        var s = new EditSession(session.getDocument(), session.getMode());\n\n        var undoManager = session.getUndoManager();\n        if (undoManager) {\n            var undoManagerProxy = new UndoManagerProxy(undoManager, s);\n            s.setUndoManager(undoManagerProxy);\n        }\n        s.$informUndoManager = lang.delayedCall(function() { s.$deltas = []; });\n        s.setTabSize(session.getTabSize());\n        s.setUseSoftTabs(session.getUseSoftTabs());\n        s.setOverwrite(session.getOverwrite());\n        s.setBreakpoints(session.getBreakpoints());\n        s.setUseWrapMode(session.getUseWrapMode());\n        s.setUseWorker(session.getUseWorker());\n        s.setWrapLimitRange(session.$wrapLimitRange.min,\n                            session.$wrapLimitRange.max);\n        s.$foldData = session.$cloneFoldData();\n\n        return s;\n    };\n    this.setSession = function(session, idx) {\n        var editor;\n        if (idx == null) {\n            editor = this.$cEditor;\n        } else {\n            editor = this.$editors[idx];\n        }\n        var isUsed = this.$editors.some(function(editor) {\n           return editor.session === session;\n        });\n\n        if (isUsed) {\n            session = this.$cloneSession(session);\n        }\n        editor.setSession(session);\n        return session;\n    };\n    this.getOrientation = function() {\n        return this.$orientation;\n    };\n    this.setOrientation = function(orientation) {\n        if (this.$orientation == orientation) {\n            return;\n        }\n        this.$orientation = orientation;\n        this.resize();\n    };\n    this.resize = function() {\n        var width = this.$container.clientWidth;\n        var height = this.$container.clientHeight;\n        var editor;\n\n        if (this.$orientation == this.BESIDE) {\n            var editorWidth = width / this.$splits;\n            for (var i = 0; i < this.$splits; i++) {\n                editor = this.$editors[i];\n                editor.container.style.width = editorWidth + \"px\";\n                editor.container.style.top = \"0px\";\n                editor.container.style.left = i * editorWidth + \"px\";\n                editor.container.style.height = height + \"px\";\n                editor.resize();\n            }\n        } else {\n            var editorHeight = height / this.$splits;\n            for (var i = 0; i < this.$splits; i++) {\n                editor = this.$editors[i];\n                editor.container.style.width = width + \"px\";\n                editor.container.style.top = i * editorHeight + \"px\";\n                editor.container.style.left = \"0px\";\n                editor.container.style.height = editorHeight + \"px\";\n                editor.resize();\n            }\n        }\n    };\n\n}).call(Split.prototype);\n\n \nfunction UndoManagerProxy(undoManager, session) {\n    this.$u = undoManager;\n    this.$doc = session;\n}\n\n(function() {\n    this.execute = function(options) {\n        this.$u.execute(options);\n    };\n\n    this.undo = function() {\n        var selectionRange = this.$u.undo(true);\n        if (selectionRange) {\n            this.$doc.selection.setSelectionRange(selectionRange);\n        }\n    };\n\n    this.redo = function() {\n        var selectionRange = this.$u.redo(true);\n        if (selectionRange) {\n            this.$doc.selection.setSelectionRange(selectionRange);\n        }\n    };\n\n    this.reset = function() {\n        this.$u.reset();\n    };\n\n    this.hasUndo = function() {\n        return this.$u.hasUndo();\n    };\n\n    this.hasRedo = function() {\n        return this.$u.hasRedo();\n    };\n}).call(UndoManagerProxy.prototype);\n\nexports.Split = Split;\n});\n\nace.define(\"ace/ext/split\",[\"require\",\"exports\",\"module\",\"ace/split\"], function(require, exports, module) {\n\"use strict\";\nmodule.exports = require(\"../split\");\n\n});\n                (function() {\n                    ace.require([\"ace/ext/split\"], function() {});\n                })();\n            "
  },
  {
    "path": "browser/plugins/ace/src-noconflict/ext-static_highlight.js",
    "content": "ace.define(\"ace/ext/static_highlight\",[\"require\",\"exports\",\"module\",\"ace/edit_session\",\"ace/layer/text\",\"ace/config\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar EditSession = require(\"../edit_session\").EditSession;\nvar TextLayer = require(\"../layer/text\").Text;\nvar baseStyles = \".ace_static_highlight {\\\nfont-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', 'Droid Sans Mono', monospace;\\\nfont-size: 12px;\\\n}\\\n.ace_static_highlight .ace_gutter {\\\nwidth: 25px !important;\\\nfloat: left;\\\ntext-align: right;\\\npadding: 0 3px 0 0;\\\nmargin-right: 3px;\\\nposition: static !important;\\\n}\\\n.ace_static_highlight .ace_line { clear: both; }\\\n.ace_static_highlight .ace_gutter-cell {\\\n-moz-user-select: -moz-none;\\\n-khtml-user-select: none;\\\n-webkit-user-select: none;\\\nuser-select: none;\\\n}\\\n.ace_static_highlight .ace_gutter-cell:before {\\\ncontent: counter(ace_line, decimal);\\\ncounter-increment: ace_line;\\\n}\\\n.ace_static_highlight {\\\ncounter-reset: ace_line;\\\n}\\\n\";\nvar config = require(\"../config\");\nvar dom = require(\"../lib/dom\");\n\n\nvar highlight = function(el, opts, callback) {\n    var m = el.className.match(/lang-(\\w+)/);\n    var mode = opts.mode || m && (\"ace/mode/\" + m[1]);\n    if (!mode)\n        return false;\n    var theme = opts.theme || \"ace/theme/textmate\";\n    \n    var data = \"\";\n    var nodes = [];\n\n    if (el.firstElementChild) {\n        var textLen = 0;\n        for (var i = 0; i < el.childNodes.length; i++) {\n            var ch = el.childNodes[i];\n            if (ch.nodeType == 3) {\n                textLen += ch.data.length;\n                data += ch.data;\n            } else {\n                nodes.push(textLen, ch);\n            }\n        }\n    } else {\n        data = dom.getInnerText(el);\n        if (opts.trim)\n            data = data.trim();\n    }\n    \n    highlight.render(data, mode, theme, opts.firstLineNumber, !opts.showGutter, function (highlighted) {\n        dom.importCssString(highlighted.css, \"ace_highlight\");\n        el.innerHTML = highlighted.html;\n        var container = el.firstChild.firstChild;\n        for (var i = 0; i < nodes.length; i += 2) {\n            var pos = highlighted.session.doc.indexToPosition(nodes[i]);\n            var node = nodes[i + 1];\n            var lineEl = container.children[pos.row];\n            lineEl && lineEl.appendChild(node);\n        }\n        callback && callback();\n    });\n};\nhighlight.render = function(input, mode, theme, lineStart, disableGutter, callback) {\n    var waiting = 1;\n    var modeCache = EditSession.prototype.$modes;\n    if (typeof theme == \"string\") {\n        waiting++;\n        config.loadModule(['theme', theme], function(m) {\n            theme = m;\n            --waiting || done();\n        });\n    }\n    var modeOptions;\n    if (mode && typeof mode === \"object\" && !mode.getTokenizer) {\n        modeOptions = mode;\n        mode = modeOptions.path;\n    }\n    if (typeof mode == \"string\") {\n        waiting++;\n        config.loadModule(['mode', mode], function(m) {\n            if (!modeCache[mode] || modeOptions)\n                modeCache[mode] = new m.Mode(modeOptions);\n            mode = modeCache[mode];\n            --waiting || done();\n        });\n    }\n    function done() {\n        var result = highlight.renderSync(input, mode, theme, lineStart, disableGutter);\n        return callback ? callback(result) : result;\n    }\n    return --waiting || done();\n};\nhighlight.renderSync = function(input, mode, theme, lineStart, disableGutter) {\n    lineStart = parseInt(lineStart || 1, 10);\n\n    var session = new EditSession(\"\");\n    session.setUseWorker(false);\n    session.setMode(mode);\n\n    var textLayer = new TextLayer(document.createElement(\"div\"));\n    textLayer.setSession(session);\n    textLayer.config = {\n        characterWidth: 10,\n        lineHeight: 20\n    };\n\n    session.setValue(input);\n\n    var stringBuilder = [];\n    var length =  session.getLength();\n\n    for(var ix = 0; ix < length; ix++) {\n        stringBuilder.push(\"<div class='ace_line'>\");\n        if (!disableGutter)\n            stringBuilder.push(\"<span class='ace_gutter ace_gutter-cell' unselectable='on'>\" + /*(ix + lineStart) + */ \"</span>\");\n        textLayer.$renderLine(stringBuilder, ix, true, false);\n        stringBuilder.push(\"\\n</div>\");\n    }\n    var html = \"<div class='\" + theme.cssClass + \"'>\" +\n        \"<div class='ace_static_highlight' style='counter-reset:ace_line \" + (lineStart - 1) + \"'>\" +\n            stringBuilder.join(\"\") +\n        \"</div>\" +\n    \"</div>\";\n\n    textLayer.destroy();\n\n    return {\n        css: baseStyles + theme.cssText,\n        html: html,\n        session: session\n    };\n};\n\nmodule.exports = highlight;\nmodule.exports.highlight =highlight;\n});\n                (function() {\n                    ace.require([\"ace/ext/static_highlight\"], function() {});\n                })();\n            "
  },
  {
    "path": "browser/plugins/ace/src-noconflict/ext-statusbar.js",
    "content": "ace.define(\"ace/ext/statusbar\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\nvar dom = require(\"ace/lib/dom\");\nvar lang = require(\"ace/lib/lang\");\n\nvar StatusBar = function(editor, parentNode) {\n    this.element = dom.createElement(\"div\");\n    this.element.className = \"ace_status-indicator\";\n    this.element.style.cssText = \"display: inline-block;\";\n    parentNode.appendChild(this.element);\n\n    var statusUpdate = lang.delayedCall(function(){\n        this.updateStatus(editor)\n    }.bind(this));\n    editor.on(\"changeStatus\", function() {\n        statusUpdate.schedule(100);\n    });\n    editor.on(\"changeSelection\", function() {\n        statusUpdate.schedule(100);\n    });\n};\n\n(function(){\n    this.updateStatus = function(editor) {\n        var status = [];\n        function add(str, separator) {\n            str && status.push(str, separator || \"|\");\n        }\n\n        add(editor.keyBinding.getStatusText(editor));\n        if (editor.commands.recording)\n            add(\"REC\");\n\n        var c = editor.selection.lead;\n        add(c.row + \":\" + c.column, \" \");\n        if (!editor.selection.isEmpty()) {\n            var r = editor.getSelectionRange();\n            add(\"(\" + (r.end.row - r.start.row) + \":\"  +(r.end.column - r.start.column) + \")\");\n        }\n        status.pop();\n        this.element.textContent = status.join(\"\");\n    };\n}).call(StatusBar.prototype);\n\nexports.StatusBar = StatusBar;\n\n});\n                (function() {\n                    ace.require([\"ace/ext/statusbar\"], function() {});\n                })();\n            "
  },
  {
    "path": "browser/plugins/ace/src-noconflict/ext-textarea.js",
    "content": "ace.define(\"ace/theme/textmate\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nexports.isDark = false;\nexports.cssClass = \"ace-tm\";\nexports.cssText = \".ace-tm .ace_gutter {\\\nbackground: #f0f0f0;\\\ncolor: #333;\\\n}\\\n.ace-tm .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8;\\\n}\\\n.ace-tm .ace_fold {\\\nbackground-color: #6B72E6;\\\n}\\\n.ace-tm {\\\nbackground-color: #FFFFFF;\\\ncolor: black;\\\n}\\\n.ace-tm .ace_cursor {\\\ncolor: black;\\\n}\\\n.ace-tm .ace_invisible {\\\ncolor: rgb(191, 191, 191);\\\n}\\\n.ace-tm .ace_storage,\\\n.ace-tm .ace_keyword {\\\ncolor: blue;\\\n}\\\n.ace-tm .ace_constant {\\\ncolor: rgb(197, 6, 11);\\\n}\\\n.ace-tm .ace_constant.ace_buildin {\\\ncolor: rgb(88, 72, 246);\\\n}\\\n.ace-tm .ace_constant.ace_language {\\\ncolor: rgb(88, 92, 246);\\\n}\\\n.ace-tm .ace_constant.ace_library {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_invalid {\\\nbackground-color: rgba(255, 0, 0, 0.1);\\\ncolor: red;\\\n}\\\n.ace-tm .ace_support.ace_function {\\\ncolor: rgb(60, 76, 114);\\\n}\\\n.ace-tm .ace_support.ace_constant {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_support.ace_type,\\\n.ace-tm .ace_support.ace_class {\\\ncolor: rgb(109, 121, 222);\\\n}\\\n.ace-tm .ace_keyword.ace_operator {\\\ncolor: rgb(104, 118, 135);\\\n}\\\n.ace-tm .ace_string {\\\ncolor: rgb(3, 106, 7);\\\n}\\\n.ace-tm .ace_comment {\\\ncolor: rgb(76, 136, 107);\\\n}\\\n.ace-tm .ace_comment.ace_doc {\\\ncolor: rgb(0, 102, 255);\\\n}\\\n.ace-tm .ace_comment.ace_doc.ace_tag {\\\ncolor: rgb(128, 159, 191);\\\n}\\\n.ace-tm .ace_constant.ace_numeric {\\\ncolor: rgb(0, 0, 205);\\\n}\\\n.ace-tm .ace_variable {\\\ncolor: rgb(49, 132, 149);\\\n}\\\n.ace-tm .ace_xml-pe {\\\ncolor: rgb(104, 104, 91);\\\n}\\\n.ace-tm .ace_entity.ace_name.ace_function {\\\ncolor: #0000A2;\\\n}\\\n.ace-tm .ace_heading {\\\ncolor: rgb(12, 7, 255);\\\n}\\\n.ace-tm .ace_list {\\\ncolor:rgb(185, 6, 144);\\\n}\\\n.ace-tm .ace_meta.ace_tag {\\\ncolor:rgb(0, 22, 142);\\\n}\\\n.ace-tm .ace_string.ace_regex {\\\ncolor: rgb(255, 0, 0)\\\n}\\\n.ace-tm .ace_marker-layer .ace_selection {\\\nbackground: rgb(181, 213, 255);\\\n}\\\n.ace-tm.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px white;\\\nborder-radius: 2px;\\\n}\\\n.ace-tm .ace_marker-layer .ace_step {\\\nbackground: rgb(252, 255, 0);\\\n}\\\n.ace-tm .ace_marker-layer .ace_stack {\\\nbackground: rgb(164, 229, 101);\\\n}\\\n.ace-tm .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgb(192, 192, 192);\\\n}\\\n.ace-tm .ace_marker-layer .ace_active-line {\\\nbackground: rgba(0, 0, 0, 0.07);\\\n}\\\n.ace-tm .ace_gutter-active-line {\\\nbackground-color : #dcdcdc;\\\n}\\\n.ace-tm .ace_marker-layer .ace_selected-word {\\\nbackground: rgb(250, 250, 255);\\\nborder: 1px solid rgb(200, 200, 250);\\\n}\\\n.ace-tm .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\\\n\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n\nace.define(\"ace/ace\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\",\"ace/lib/dom\",\"ace/lib/event\",\"ace/editor\",\"ace/edit_session\",\"ace/undomanager\",\"ace/virtual_renderer\",\"ace/worker/worker_client\",\"ace/keyboard/hash_handler\",\"ace/placeholder\",\"ace/multi_select\",\"ace/mode/folding/fold_mode\",\"ace/theme/textmate\",\"ace/ext/error_marker\",\"ace/config\"], function(require, exports, module) {\n\"use strict\";\n\nrequire(\"./lib/fixoldbrowsers\");\n\nvar dom = require(\"./lib/dom\");\nvar event = require(\"./lib/event\");\n\nvar Editor = require(\"./editor\").Editor;\nvar EditSession = require(\"./edit_session\").EditSession;\nvar UndoManager = require(\"./undomanager\").UndoManager;\nvar Renderer = require(\"./virtual_renderer\").VirtualRenderer;\nrequire(\"./worker/worker_client\");\nrequire(\"./keyboard/hash_handler\");\nrequire(\"./placeholder\");\nrequire(\"./multi_select\");\nrequire(\"./mode/folding/fold_mode\");\nrequire(\"./theme/textmate\");\nrequire(\"./ext/error_marker\");\n\nexports.config = require(\"./config\");\nexports.require = require;\nexports.edit = function(el) {\n    if (typeof(el) == \"string\") {\n        var _id = el;\n        el = document.getElementById(_id);\n        if (!el)\n            throw new Error(\"ace.edit can't find div #\" + _id);\n    }\n\n    if (el && el.env && el.env.editor instanceof Editor)\n        return el.env.editor;\n\n    var value = \"\";\n    if (el && /input|textarea/i.test(el.tagName)) {\n        var oldNode = el;\n        value = oldNode.value;\n        el = dom.createElement(\"pre\");\n        oldNode.parentNode.replaceChild(el, oldNode);\n    } else {\n        value = dom.getInnerText(el);\n        el.innerHTML = '';\n    }\n\n    var doc = exports.createEditSession(value);\n\n    var editor = new Editor(new Renderer(el));\n    editor.setSession(doc);\n\n    var env = {\n        document: doc,\n        editor: editor,\n        onResize: editor.resize.bind(editor, null)\n    };\n    if (oldNode) env.textarea = oldNode;\n    event.addListener(window, \"resize\", env.onResize);\n    editor.on(\"destroy\", function() {\n        event.removeListener(window, \"resize\", env.onResize);\n        env.editor.container.env = null; // prevent memory leak on old ie\n    });\n    editor.container.env = editor.env = env;\n    return editor;\n};\nexports.createEditSession = function(text, mode) {\n    var doc = new EditSession(text, mode);\n    doc.setUndoManager(new UndoManager());\n    return doc;\n}\nexports.EditSession = EditSession;\nexports.UndoManager = UndoManager;\n});\n\nace.define(\"ace/ext/textarea\",[\"require\",\"exports\",\"module\",\"ace/lib/event\",\"ace/lib/useragent\",\"ace/lib/net\",\"ace/ace\",\"ace/theme/textmate\"], function(require, exports, module) {\n\"use strict\";\n\nvar event = require(\"../lib/event\");\nvar UA = require(\"../lib/useragent\");\nvar net = require(\"../lib/net\");\nvar ace = require(\"../ace\");\n\nrequire(\"../theme/textmate\");\n\nmodule.exports = exports = ace;\nvar getCSSProperty = function(element, container, property) {\n    var ret = element.style[property];\n\n    if (!ret) {\n        if (window.getComputedStyle) {\n            ret = window.getComputedStyle(element, '').getPropertyValue(property);\n        } else {\n            ret = element.currentStyle[property];\n        }\n    }\n\n    if (!ret || ret == 'auto' || ret == 'intrinsic') {\n        ret = container.style[property];\n    }\n    return ret;\n};\n\nfunction applyStyles(elm, styles) {\n    for (var style in styles) {\n        elm.style[style] = styles[style];\n    }\n}\n\nfunction setupContainer(element, getValue) {\n    if (element.type != 'textarea') {\n        throw new Error(\"Textarea required!\");\n    }\n\n    var parentNode = element.parentNode;\n    var container = document.createElement('div');\n    var resizeEvent = function() {\n        var style = 'position:relative;';\n        [\n            'margin-top', 'margin-left', 'margin-right', 'margin-bottom'\n        ].forEach(function(item) {\n            style += item + ':' +\n                        getCSSProperty(element, container, item) + ';';\n        });\n        var width = getCSSProperty(element, container, 'width') || (element.clientWidth + \"px\");\n        var height = getCSSProperty(element, container, 'height')  || (element.clientHeight + \"px\");\n        style += 'height:' + height + ';width:' + width + ';';\n        style += 'display:inline-block;';\n        container.setAttribute('style', style);\n    };\n    event.addListener(window, 'resize', resizeEvent);\n    resizeEvent();\n    parentNode.insertBefore(container, element.nextSibling);\n    while (parentNode !== document) {\n        if (parentNode.tagName.toUpperCase() === 'FORM') {\n            var oldSumit = parentNode.onsubmit;\n            parentNode.onsubmit = function(evt) {\n                element.value = getValue();\n                if (oldSumit) {\n                    oldSumit.call(this, evt);\n                }\n            };\n            break;\n        }\n        parentNode = parentNode.parentNode;\n    }\n    return container;\n}\n\nexports.transformTextarea = function(element, options) {\n    var session;\n    var container = setupContainer(element, function() {\n        return session.getValue();\n    });\n    element.style.display = 'none';\n    container.style.background = 'white';\n    var editorDiv = document.createElement(\"div\");\n    applyStyles(editorDiv, {\n        top: \"0px\",\n        left: \"0px\",\n        right: \"0px\",\n        bottom: \"0px\",\n        border: \"1px solid gray\",\n        position: \"absolute\"\n    });\n    container.appendChild(editorDiv);\n\n    var settingOpener = document.createElement(\"div\");\n    applyStyles(settingOpener, {\n        position: \"absolute\",\n        right: \"0px\",\n        bottom: \"0px\",\n        background: \"red\",\n        cursor: \"nw-resize\",\n        borderStyle: \"solid\",\n        borderWidth: \"9px 8px 10px 9px\",\n        width: \"2px\",\n        borderColor: \"lightblue gray gray lightblue\",\n        zIndex: 101\n    });\n\n    var settingDiv = document.createElement(\"div\");\n    var settingDivStyles = {\n        top: \"0px\",\n        left: \"20%\",\n        right: \"0px\",\n        bottom: \"0px\",\n        position: \"absolute\",\n        padding: \"5px\",\n        zIndex: 100,\n        color: \"white\",\n        display: \"none\",\n        overflow: \"auto\",\n        fontSize: \"14px\",\n        boxShadow: \"-5px 2px 3px gray\"\n    };\n    if (!UA.isOldIE) {\n        settingDivStyles.backgroundColor = \"rgba(0, 0, 0, 0.6)\";\n    } else {\n        settingDivStyles.backgroundColor = \"#333\";\n    }\n\n    applyStyles(settingDiv, settingDivStyles);\n    container.appendChild(settingDiv);\n\n    options = options || exports.defaultOptions;\n    var editor = ace.edit(editorDiv);\n    session = editor.getSession();\n\n    session.setValue(element.value || element.innerHTML);\n    editor.focus();\n    container.appendChild(settingOpener);\n    setupApi(editor, editorDiv, settingDiv, ace, options, load);\n    setupSettingPanel(settingDiv, settingOpener, editor);\n\n    var state = \"\";\n    event.addListener(settingOpener, \"mousemove\", function(e) {\n        var rect = this.getBoundingClientRect();\n        var x = e.clientX - rect.left, y = e.clientY - rect.top;\n        if (x + y < (rect.width + rect.height)/2) {\n            this.style.cursor = \"pointer\";\n            state = \"toggle\";\n        } else {\n            state = \"resize\";\n            this.style.cursor = \"nw-resize\";\n        }\n    });\n\n    event.addListener(settingOpener, \"mousedown\", function(e) {\n        if (state == \"toggle\") {\n            editor.setDisplaySettings();\n            return;\n        }\n        container.style.zIndex = 100000;\n        var rect = container.getBoundingClientRect();\n        var startX = rect.width  + rect.left - e.clientX;\n        var startY = rect.height  + rect.top - e.clientY;\n        event.capture(settingOpener, function(e) {\n            container.style.width = e.clientX - rect.left + startX + \"px\";\n            container.style.height = e.clientY - rect.top + startY + \"px\";\n            editor.resize();\n        }, function() {});\n    });\n\n    return editor;\n};\n\nfunction load(url, module, callback) {\n    net.loadScript(url, function() {\n        require([module], callback);\n    });\n}\n\nfunction setupApi(editor, editorDiv, settingDiv, ace, options, loader) {\n    var session = editor.getSession();\n    var renderer = editor.renderer;\n    loader = loader || load;\n\n    function toBool(value) {\n        return value === \"true\" || value == true;\n    }\n\n    editor.setDisplaySettings = function(display) {\n        if (display == null)\n            display = settingDiv.style.display == \"none\";\n        if (display) {\n            settingDiv.style.display = \"block\";\n            settingDiv.hideButton.focus();\n            editor.on(\"focus\", function onFocus() {\n                editor.removeListener(\"focus\", onFocus);\n                settingDiv.style.display = \"none\";\n            });\n        } else {\n            editor.focus();\n        }\n    };\n\n    editor.$setOption = editor.setOption;\n    editor.$getOption = editor.getOption;\n    editor.setOption = function(key, value) {\n        switch (key) {\n            case \"mode\":\n                editor.$setOption(\"mode\", \"ace/mode/\" + value)\n            break;\n            case \"theme\":\n                editor.$setOption(\"theme\", \"ace/theme/\" + value)\n            break;\n            case \"keybindings\":\n                switch (value) {\n                    case \"vim\":\n                        editor.setKeyboardHandler(\"ace/keyboard/vim\");\n                        break;\n                    case \"emacs\":\n                        editor.setKeyboardHandler(\"ace/keyboard/emacs\");\n                        break;\n                    default:\n                        editor.setKeyboardHandler(null);\n                }\n            break;\n\n            case \"softWrap\":\n            case \"fontSize\":\n                editor.$setOption(key, value);\n            break;\n            \n            default:\n                editor.$setOption(key, toBool(value));\n        }\n    };\n\n    editor.getOption = function(key) {\n        switch (key) {\n            case \"mode\":\n                return editor.$getOption(\"mode\").substr(\"ace/mode/\".length)\n            break;\n\n            case \"theme\":\n                return editor.$getOption(\"theme\").substr(\"ace/theme/\".length)\n            break;\n\n            case \"keybindings\":\n                var value = editor.getKeyboardHandler()\n                switch (value && value.$id) {\n                    case \"ace/keyboard/vim\":\n                        return \"vim\";\n                    case \"ace/keyboard/emacs\":\n                        return \"emacs\";\n                    default:\n                        return \"ace\";\n                }\n            break;\n\n            default:\n                return editor.$getOption(key);\n        }\n    };\n\n    editor.setOptions(options);\n    return editor;\n}\n\nfunction setupSettingPanel(settingDiv, settingOpener, editor) {\n    var BOOL = null;\n\n    var desc = {\n        mode:            \"Mode:\",\n        wrap:            \"Soft Wrap:\",\n        theme:           \"Theme:\",\n        fontSize:        \"Font Size:\",\n        showGutter:      \"Display Gutter:\",\n        keybindings:     \"Keyboard\",\n        showPrintMargin: \"Show Print Margin:\",\n        useSoftTabs:     \"Use Soft Tabs:\",\n        showInvisibles:  \"Show Invisibles\"\n    };\n\n    var optionValues = {\n        mode: {\n            text:       \"Plain\",\n            javascript: \"JavaScript\",\n            xml:        \"XML\",\n            html:       \"HTML\",\n            css:        \"CSS\",\n            scss:       \"SCSS\",\n            python:     \"Python\",\n            php:        \"PHP\",\n            java:       \"Java\",\n            ruby:       \"Ruby\",\n            c_cpp:      \"C/C++\",\n            coffee:     \"CoffeeScript\",\n            json:       \"json\",\n            perl:       \"Perl\",\n            clojure:    \"Clojure\",\n            ocaml:      \"OCaml\",\n            csharp:     \"C#\",\n            haxe:       \"haXe\",\n            svg:        \"SVG\",\n            textile:    \"Textile\",\n            groovy:     \"Groovy\",\n            liquid:     \"Liquid\",\n            Scala:      \"Scala\"\n        },\n        theme: {\n            clouds:           \"Clouds\",\n            clouds_midnight:  \"Clouds Midnight\",\n            cobalt:           \"Cobalt\",\n            crimson_editor:   \"Crimson Editor\",\n            dawn:             \"Dawn\",\n            eclipse:          \"Eclipse\",\n            idle_fingers:     \"Idle Fingers\",\n            kr_theme:         \"Kr Theme\",\n            merbivore:        \"Merbivore\",\n            merbivore_soft:   \"Merbivore Soft\",\n            mono_industrial:  \"Mono Industrial\",\n            monokai:          \"Monokai\",\n            pastel_on_dark:   \"Pastel On Dark\",\n            solarized_dark:   \"Solarized Dark\",\n            solarized_light:  \"Solarized Light\",\n            textmate:         \"Textmate\",\n            twilight:         \"Twilight\",\n            vibrant_ink:      \"Vibrant Ink\"\n        },\n        showGutter: BOOL,\n        fontSize: {\n            \"10px\": \"10px\",\n            \"11px\": \"11px\",\n            \"12px\": \"12px\",\n            \"14px\": \"14px\",\n            \"16px\": \"16px\"\n        },\n        wrap: {\n            off:    \"Off\",\n            40:     \"40\",\n            80:     \"80\",\n            free:   \"Free\"\n        },\n        keybindings: {\n            ace: \"ace\",\n            vim: \"vim\",\n            emacs: \"emacs\"\n        },\n        showPrintMargin:    BOOL,\n        useSoftTabs:        BOOL,\n        showInvisibles:     BOOL\n    };\n\n    var table = [];\n    table.push(\"<table><tr><th>Setting</th><th>Value</th></tr>\");\n\n    function renderOption(builder, option, obj, cValue) {\n        if (!obj) {\n            builder.push(\n                \"<input type='checkbox' title='\", option, \"' \",\n                    cValue + \"\" == \"true\" ? \"checked='true'\" : \"\",\n               \"'></input>\"\n            );\n            return;\n        }\n        builder.push(\"<select title='\" + option + \"'>\");\n        for (var value in obj) {\n            builder.push(\"<option value='\" + value + \"' \");\n\n            if (cValue == value) {\n                builder.push(\" selected \");\n            }\n\n            builder.push(\">\",\n                obj[value],\n                \"</option>\");\n        }\n        builder.push(\"</select>\");\n    }\n\n    for (var option in exports.defaultOptions) {\n        table.push(\"<tr><td>\", desc[option], \"</td>\");\n        table.push(\"<td>\");\n        renderOption(table, option, optionValues[option], editor.getOption(option));\n        table.push(\"</td></tr>\");\n    }\n    table.push(\"</table>\");\n    settingDiv.innerHTML = table.join(\"\");\n\n    var onChange = function(e) {\n        var select = e.currentTarget;\n        editor.setOption(select.title, select.value);\n    };\n    var onClick = function(e) {\n        var cb = e.currentTarget;\n        editor.setOption(cb.title, cb.checked);\n    };\n    var selects = settingDiv.getElementsByTagName(\"select\");\n    for (var i = 0; i < selects.length; i++)\n        selects[i].onchange = onChange;\n    var cbs = settingDiv.getElementsByTagName(\"input\");\n    for (var i = 0; i < cbs.length; i++)\n        cbs[i].onclick = onClick;\n\n\n    var button = document.createElement(\"input\");\n    button.type = \"button\";\n    button.value = \"Hide\";\n    event.addListener(button, \"click\", function() {\n        editor.setDisplaySettings(false);\n    });\n    settingDiv.appendChild(button);\n    settingDiv.hideButton = button;\n}\nexports.defaultOptions = {\n    mode:               \"javascript\",\n    theme:              \"textmate\",\n    wrap:               \"off\",\n    fontSize:           \"12px\",\n    showGutter:         \"false\",\n    keybindings:        \"ace\",\n    showPrintMargin:    \"false\",\n    useSoftTabs:        \"true\",\n    showInvisibles:     \"false\"\n};\n\n});\n                (function() {\n                    ace.require([\"ace/ext/textarea\"], function() {});\n                })();\n            "
  },
  {
    "path": "browser/plugins/ace/src-noconflict/ext-themelist.js",
    "content": "ace.define(\"ace/ext/themelist\",[\"require\",\"exports\",\"module\",\"ace/lib/fixoldbrowsers\"], function(require, exports, module) {\n\"use strict\";\nrequire(\"ace/lib/fixoldbrowsers\");\n\nvar themeData = [\n    [\"Chrome\"         ],\n    [\"Clouds\"         ],\n    [\"Crimson Editor\" ],\n    [\"Dawn\"           ],\n    [\"Dreamweaver\"    ],\n    [\"Eclipse\"        ],\n    [\"GitHub\"         ],\n    [\"Solarized Light\"],\n    [\"TextMate\"       ],\n    [\"Tomorrow\"       ],\n    [\"XCode\"          ],\n    [\"Kuroir\"],\n    [\"KatzenMilch\"],\n    [\"Ambiance\"             ,\"ambiance\"                ,  \"dark\"],\n    [\"Chaos\"                ,\"chaos\"                   ,  \"dark\"],\n    [\"Clouds Midnight\"      ,\"clouds_midnight\"         ,  \"dark\"],\n    [\"Cobalt\"               ,\"cobalt\"                  ,  \"dark\"],\n    [\"idle Fingers\"         ,\"idle_fingers\"            ,  \"dark\"],\n    [\"krTheme\"              ,\"kr_theme\"                ,  \"dark\"],\n    [\"Merbivore\"            ,\"merbivore\"               ,  \"dark\"],\n    [\"Merbivore Soft\"       ,\"merbivore_soft\"          ,  \"dark\"],\n    [\"Mono Industrial\"      ,\"mono_industrial\"         ,  \"dark\"],\n    [\"Monokai\"              ,\"monokai\"                 ,  \"dark\"],\n    [\"Pastel on dark\"       ,\"pastel_on_dark\"          ,  \"dark\"],\n    [\"Solarized Dark\"       ,\"solarized_dark\"          ,  \"dark\"],\n    [\"Terminal\"             ,\"terminal\"                ,  \"dark\"],\n    [\"Tomorrow Night\"       ,\"tomorrow_night\"          ,  \"dark\"],\n    [\"Tomorrow Night Blue\"  ,\"tomorrow_night_blue\"     ,  \"dark\"],\n    [\"Tomorrow Night Bright\",\"tomorrow_night_bright\"   ,  \"dark\"],\n    [\"Tomorrow Night 80s\"   ,\"tomorrow_night_eighties\" ,  \"dark\"],\n    [\"Twilight\"             ,\"twilight\"                ,  \"dark\"],\n    [\"Vibrant Ink\"          ,\"vibrant_ink\"             ,  \"dark\"]\n];\n\n\nexports.themesByName = {};\nexports.themes = themeData.map(function(data) {\n    var name = data[1] || data[0].replace(/ /g, \"_\").toLowerCase();\n    var theme = {\n        caption: data[0],\n        theme: \"ace/theme/\" + name,\n        isDark: data[2] == \"dark\",\n        name: name\n    };\n    exports.themesByName[name] = theme;\n    return theme;\n});\n\n});\n                (function() {\n                    ace.require([\"ace/ext/themelist\"], function() {});\n                })();\n            "
  },
  {
    "path": "browser/plugins/ace/src-noconflict/ext-whitespace.js",
    "content": "ace.define(\"ace/ext/whitespace\",[\"require\",\"exports\",\"module\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar lang = require(\"../lib/lang\");\nexports.$detectIndentation = function(lines, fallback) {\n    var stats = [];\n    var changes = [];\n    var tabIndents = 0;\n    var prevSpaces = 0;\n    var max = Math.min(lines.length, 1000);\n    for (var i = 0; i < max; i++) {\n        var line = lines[i];\n        if (!/^\\s*[^*+\\-\\s]/.test(line))\n            continue;\n\n        if (line[0] == \"\\t\")\n            tabIndents++;\n\n        var spaces = line.match(/^ */)[0].length;\n        if (spaces && line[spaces] != \"\\t\") {\n            var diff = spaces - prevSpaces;\n            if (diff > 0 && !(prevSpaces%diff) && !(spaces%diff))\n                changes[diff] = (changes[diff] || 0) + 1;\n\n            stats[spaces] = (stats[spaces] || 0) + 1;\n        }\n        prevSpaces = spaces;\n        while (i < max && line[line.length - 1] == \"\\\\\")\n            line = lines[i++];\n    }\n    \n    function getScore(indent) {\n        var score = 0;\n        for (var i = indent; i < stats.length; i += indent)\n            score += stats[i] || 0;\n        return score;\n    }\n\n    var changesTotal = changes.reduce(function(a,b){return a+b}, 0);\n\n    var first = {score: 0, length: 0};\n    var spaceIndents = 0;\n    for (var i = 1; i < 12; i++) {\n        var score = getScore(i);\n        if (i == 1) {\n            spaceIndents = score;\n            score = stats[1] ? 0.9 : 0.8;\n            if (!stats.length)\n                score = 0\n        } else\n            score /= spaceIndents;\n\n        if (changes[i])\n            score += changes[i] / changesTotal;\n\n        if (score > first.score)\n            first = {score: score, length: i};\n    }\n\n    if (first.score && first.score > 1.4)\n        var tabLength = first.length;\n\n    if (tabIndents > spaceIndents + 1)\n        return {ch: \"\\t\", length: tabLength};\n\n    if (spaceIndents > tabIndents + 1)\n        return {ch: \" \", length: tabLength};\n};\n\nexports.detectIndentation = function(session) {\n    var lines = session.getLines(0, 1000);\n    var indent = exports.$detectIndentation(lines) || {};\n\n    if (indent.ch)\n        session.setUseSoftTabs(indent.ch == \" \");\n\n    if (indent.length)\n        session.setTabSize(indent.length);\n    return indent;\n};\n\nexports.trimTrailingSpace = function(session, trimEmpty) {\n    var doc = session.getDocument();\n    var lines = doc.getAllLines();\n    \n    var min = trimEmpty ? -1 : 0;\n\n    for (var i = 0, l=lines.length; i < l; i++) {\n        var line = lines[i];\n        var index = line.search(/\\s+$/);\n\n        if (index > min)\n            doc.removeInLine(i, index, line.length);\n    }\n};\n\nexports.convertIndentation = function(session, ch, len) {\n    var oldCh = session.getTabString()[0];\n    var oldLen = session.getTabSize();\n    if (!len) len = oldLen;\n    if (!ch) ch = oldCh;\n\n    var tab = ch == \"\\t\" ? ch: lang.stringRepeat(ch, len);\n\n    var doc = session.doc;\n    var lines = doc.getAllLines();\n\n    var cache = {};\n    var spaceCache = {};\n    for (var i = 0, l=lines.length; i < l; i++) {\n        var line = lines[i];\n        var match = line.match(/^\\s*/)[0];\n        if (match) {\n            var w = session.$getStringScreenWidth(match)[0];\n            var tabCount = Math.floor(w/oldLen);\n            var reminder = w%oldLen;\n            var toInsert = cache[tabCount] || (cache[tabCount] = lang.stringRepeat(tab, tabCount));\n            toInsert += spaceCache[reminder] || (spaceCache[reminder] = lang.stringRepeat(\" \", reminder));\n\n            if (toInsert != match) {\n                doc.removeInLine(i, 0, match.length);\n                doc.insertInLine({row: i, column: 0}, toInsert);\n            }\n        }\n    }\n    session.setTabSize(len);\n    session.setUseSoftTabs(ch == \" \");\n};\n\nexports.$parseStringArg = function(text) {\n    var indent = {};\n    if (/t/.test(text))\n        indent.ch = \"\\t\";\n    else if (/s/.test(text))\n        indent.ch = \" \";\n    var m = text.match(/\\d+/);\n    if (m)\n        indent.length = parseInt(m[0], 10);\n    return indent;\n};\n\nexports.$parseArg = function(arg) {\n    if (!arg)\n        return {};\n    if (typeof arg == \"string\")\n        return exports.$parseStringArg(arg);\n    if (typeof arg.text == \"string\")\n        return exports.$parseStringArg(arg.text);\n    return arg;\n};\n\nexports.commands = [{\n    name: \"detectIndentation\",\n    exec: function(editor) {\n        exports.detectIndentation(editor.session);\n    }\n}, {\n    name: \"trimTrailingSpace\",\n    exec: function(editor) {\n        exports.trimTrailingSpace(editor.session);\n    }\n}, {\n    name: \"convertIndentation\",\n    exec: function(editor, arg) {\n        var indent = exports.$parseArg(arg);\n        exports.convertIndentation(editor.session, indent.ch, indent.length);\n    }\n}, {\n    name: \"setIndentation\",\n    exec: function(editor, arg) {\n        var indent = exports.$parseArg(arg);\n        indent.length && editor.session.setTabSize(indent.length);\n        indent.ch && editor.session.setUseSoftTabs(indent.ch == \" \");\n    }\n}];\n\n});\n                (function() {\n                    ace.require([\"ace/ext/whitespace\"], function() {});\n                })();\n            "
  },
  {
    "path": "browser/plugins/ace/src-noconflict/keybinding-emacs.js",
    "content": "ace.define(\"ace/occur\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/search\",\"ace/edit_session\",\"ace/search_highlight\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar Range = require(\"./range\").Range;\nvar Search = require(\"./search\").Search;\nvar EditSession = require(\"./edit_session\").EditSession;\nvar SearchHighlight = require(\"./search_highlight\").SearchHighlight;\nfunction Occur() {}\n\noop.inherits(Occur, Search);\n\n(function() {\n    this.enter = function(editor, options) {\n        if (!options.needle) return false;\n        var pos = editor.getCursorPosition();\n        this.displayOccurContent(editor, options);\n        var translatedPos = this.originalToOccurPosition(editor.session, pos);\n        editor.moveCursorToPosition(translatedPos);\n        return true;\n    }\n    this.exit = function(editor, options) {\n        var pos = options.translatePosition && editor.getCursorPosition();\n        var translatedPos = pos && this.occurToOriginalPosition(editor.session, pos);\n        this.displayOriginalContent(editor);\n        if (translatedPos)\n            editor.moveCursorToPosition(translatedPos);\n        return true;\n    }\n\n    this.highlight = function(sess, regexp) {\n        var hl = sess.$occurHighlight = sess.$occurHighlight || sess.addDynamicMarker(\n                new SearchHighlight(null, \"ace_occur-highlight\", \"text\"));\n        hl.setRegexp(regexp);\n        sess._emit(\"changeBackMarker\"); // force highlight layer redraw\n    }\n\n    this.displayOccurContent = function(editor, options) {\n        this.$originalSession = editor.session;\n        var found = this.matchingLines(editor.session, options);\n        var lines = found.map(function(foundLine) { return foundLine.content; });\n        var occurSession = new EditSession(lines.join('\\n'));\n        occurSession.$occur = this;\n        occurSession.$occurMatchingLines = found;\n        editor.setSession(occurSession);\n        this.$useEmacsStyleLineStart = this.$originalSession.$useEmacsStyleLineStart;\n        occurSession.$useEmacsStyleLineStart = this.$useEmacsStyleLineStart;\n        this.highlight(occurSession, options.re);\n        occurSession._emit('changeBackMarker');\n    }\n\n    this.displayOriginalContent = function(editor) {\n        editor.setSession(this.$originalSession);\n        this.$originalSession.$useEmacsStyleLineStart = this.$useEmacsStyleLineStart;\n    }\n    this.originalToOccurPosition = function(session, pos) {\n        var lines = session.$occurMatchingLines;\n        var nullPos = {row: 0, column: 0};\n        if (!lines) return nullPos;\n        for (var i = 0; i < lines.length; i++) {\n            if (lines[i].row === pos.row)\n                return {row: i, column: pos.column};\n        }\n        return nullPos;\n    }\n    this.occurToOriginalPosition = function(session, pos) {\n        var lines = session.$occurMatchingLines;\n        if (!lines || !lines[pos.row])\n            return pos;\n        return {row: lines[pos.row].row, column: pos.column};\n    }\n\n    this.matchingLines = function(session, options) {\n        options = oop.mixin({}, options);\n        if (!session || !options.needle) return [];\n        var search = new Search();\n        search.set(options);\n        return search.findAll(session).reduce(function(lines, range) {\n            var row = range.start.row;\n            var last = lines[lines.length-1];\n            return last && last.row === row ?\n                lines :\n                lines.concat({row: row, content: session.getLine(row)});\n        }, []);\n    }\n\n}).call(Occur.prototype);\n\nvar dom = require('./lib/dom');\ndom.importCssString(\".ace_occur-highlight {\\n\\\n    border-radius: 4px;\\n\\\n    background-color: rgba(87, 255, 8, 0.25);\\n\\\n    position: absolute;\\n\\\n    z-index: 4;\\n\\\n    -moz-box-sizing: border-box;\\n\\\n    -webkit-box-sizing: border-box;\\n\\\n    box-sizing: border-box;\\n\\\n    box-shadow: 0 0 4px rgb(91, 255, 50);\\n\\\n}\\n\\\n.ace_dark .ace_occur-highlight {\\n\\\n    background-color: rgb(80, 140, 85);\\n\\\n    box-shadow: 0 0 4px rgb(60, 120, 70);\\n\\\n}\\n\", \"incremental-occur-highlighting\");\n\nexports.Occur = Occur;\n\n});\n\nace.define(\"ace/commands/occur_commands\",[\"require\",\"exports\",\"module\",\"ace/config\",\"ace/occur\",\"ace/keyboard/hash_handler\",\"ace/lib/oop\"], function(require, exports, module) {\n\nvar config = require(\"../config\"),\n    Occur = require(\"../occur\").Occur;\nvar occurStartCommand = {\n    name: \"occur\",\n    exec: function(editor, options) {\n        var alreadyInOccur = !!editor.session.$occur;\n        var occurSessionActive = new Occur().enter(editor, options);\n        if (occurSessionActive && !alreadyInOccur)\n            OccurKeyboardHandler.installIn(editor);\n    },\n    readOnly: true\n};\n\nvar occurCommands = [{\n    name: \"occurexit\",\n    bindKey: 'esc|Ctrl-G',\n    exec: function(editor) {\n        var occur = editor.session.$occur;\n        if (!occur) return;\n        occur.exit(editor, {});\n        if (!editor.session.$occur) OccurKeyboardHandler.uninstallFrom(editor);\n    },\n    readOnly: true\n}, {\n    name: \"occuraccept\",\n    bindKey: 'enter',\n    exec: function(editor) {\n        var occur = editor.session.$occur;\n        if (!occur) return;\n        occur.exit(editor, {translatePosition: true});\n        if (!editor.session.$occur) OccurKeyboardHandler.uninstallFrom(editor);\n    },\n    readOnly: true\n}];\n\nvar HashHandler = require(\"../keyboard/hash_handler\").HashHandler;\nvar oop = require(\"../lib/oop\");\n\n\nfunction OccurKeyboardHandler() {}\n\noop.inherits(OccurKeyboardHandler, HashHandler);\n\n;(function() {\n\n    this.isOccurHandler = true;\n\n    this.attach = function(editor) {\n        HashHandler.call(this, occurCommands, editor.commands.platform);\n        this.$editor = editor;\n    }\n\n    var handleKeyboard$super = this.handleKeyboard;\n    this.handleKeyboard = function(data, hashId, key, keyCode) {\n        var cmd = handleKeyboard$super.call(this, data, hashId, key, keyCode);\n        return (cmd && cmd.command) ? cmd : undefined;\n    }\n\n}).call(OccurKeyboardHandler.prototype);\n\nOccurKeyboardHandler.installIn = function(editor) {\n    var handler = new this();\n    editor.keyBinding.addKeyboardHandler(handler);\n    editor.commands.addCommands(occurCommands);\n}\n\nOccurKeyboardHandler.uninstallFrom = function(editor) {\n    editor.commands.removeCommands(occurCommands);\n    var handler = editor.getKeyboardHandler();\n    if (handler.isOccurHandler)\n        editor.keyBinding.removeKeyboardHandler(handler);\n}\n\nexports.occurStartCommand = occurStartCommand;\n\n});\n\nace.define(\"ace/commands/incremental_search_commands\",[\"require\",\"exports\",\"module\",\"ace/config\",\"ace/lib/oop\",\"ace/keyboard/hash_handler\",\"ace/commands/occur_commands\"], function(require, exports, module) {\n\nvar config = require(\"../config\");\nvar oop = require(\"../lib/oop\");\nvar HashHandler = require(\"../keyboard/hash_handler\").HashHandler;\nvar occurStartCommand = require(\"./occur_commands\").occurStartCommand;\nexports.iSearchStartCommands = [{\n    name: \"iSearch\",\n    bindKey: {win: \"Ctrl-F\", mac: \"Command-F\"},\n    exec: function(editor, options) {\n        config.loadModule([\"core\", \"ace/incremental_search\"], function(e) {\n            var iSearch = e.iSearch = e.iSearch || new e.IncrementalSearch();\n            iSearch.activate(editor, options.backwards);\n            if (options.jumpToFirstMatch) iSearch.next(options);\n        });\n    },\n    readOnly: true\n}, {\n    name: \"iSearchBackwards\",\n    exec: function(editor, jumpToNext) { editor.execCommand('iSearch', {backwards: true}); },\n    readOnly: true\n}, {\n    name: \"iSearchAndGo\",\n    bindKey: {win: \"Ctrl-K\", mac: \"Command-G\"},\n    exec: function(editor, jumpToNext) { editor.execCommand('iSearch', {jumpToFirstMatch: true, useCurrentOrPrevSearch: true}); },\n    readOnly: true\n}, {\n    name: \"iSearchBackwardsAndGo\",\n    bindKey: {win: \"Ctrl-Shift-K\", mac: \"Command-Shift-G\"},\n    exec: function(editor) { editor.execCommand('iSearch', {jumpToFirstMatch: true, backwards: true, useCurrentOrPrevSearch: true}); },\n    readOnly: true\n}];\nexports.iSearchCommands = [{\n    name: \"restartSearch\",\n    bindKey: {win: \"Ctrl-F\", mac: \"Command-F\"},\n    exec: function(iSearch) {\n        iSearch.cancelSearch(true);\n    },\n    readOnly: true,\n    isIncrementalSearchCommand: true\n}, {\n    name: \"searchForward\",\n    bindKey: {win: \"Ctrl-S|Ctrl-K\", mac: \"Ctrl-S|Command-G\"},\n    exec: function(iSearch, options) {\n        options.useCurrentOrPrevSearch = true;\n        iSearch.next(options);\n    },\n    readOnly: true,\n    isIncrementalSearchCommand: true\n}, {\n    name: \"searchBackward\",\n    bindKey: {win: \"Ctrl-R|Ctrl-Shift-K\", mac: \"Ctrl-R|Command-Shift-G\"},\n    exec: function(iSearch, options) {\n        options.useCurrentOrPrevSearch = true;\n        options.backwards = true;\n        iSearch.next(options);\n    },\n    readOnly: true,\n    isIncrementalSearchCommand: true\n}, {\n    name: \"extendSearchTerm\",\n    exec: function(iSearch, string) {\n        iSearch.addString(string);\n    },\n    readOnly: true,\n    isIncrementalSearchCommand: true\n}, {\n    name: \"extendSearchTermSpace\",\n    bindKey: \"space\",\n    exec: function(iSearch) { iSearch.addString(' '); },\n    readOnly: true,\n    isIncrementalSearchCommand: true\n}, {\n    name: \"shrinkSearchTerm\",\n    bindKey: \"backspace\",\n    exec: function(iSearch) {\n        iSearch.removeChar();\n    },\n    readOnly: true,\n    isIncrementalSearchCommand: true\n}, {\n    name: 'confirmSearch',\n    bindKey: 'return',\n    exec: function(iSearch) { iSearch.deactivate(); },\n    readOnly: true,\n    isIncrementalSearchCommand: true\n}, {\n    name: 'cancelSearch',\n    bindKey: 'esc|Ctrl-G',\n    exec: function(iSearch) { iSearch.deactivate(true); },\n    readOnly: true,\n    isIncrementalSearchCommand: true\n}, {\n    name: 'occurisearch',\n    bindKey: 'Ctrl-O',\n    exec: function(iSearch) {\n        var options = oop.mixin({}, iSearch.$options);\n        iSearch.deactivate();\n        occurStartCommand.exec(iSearch.$editor, options);\n    },\n    readOnly: true,\n    isIncrementalSearchCommand: true\n}, {\n    name: \"yankNextWord\",\n    bindKey: \"Ctrl-w\",\n    exec: function(iSearch) {\n        var ed = iSearch.$editor,\n            range = ed.selection.getRangeOfMovements(function(sel) { sel.moveCursorWordRight(); }),\n            string = ed.session.getTextRange(range);\n        iSearch.addString(string);\n    },\n    readOnly: true,\n    isIncrementalSearchCommand: true\n}, {\n    name: \"yankNextChar\",\n    bindKey: \"Ctrl-Alt-y\",\n    exec: function(iSearch) {\n        var ed = iSearch.$editor,\n            range = ed.selection.getRangeOfMovements(function(sel) { sel.moveCursorRight(); }),\n            string = ed.session.getTextRange(range);\n        iSearch.addString(string);\n    },\n    readOnly: true,\n    isIncrementalSearchCommand: true\n}, {\n    name: 'recenterTopBottom',\n    bindKey: 'Ctrl-l',\n    exec: function(iSearch) { iSearch.$editor.execCommand('recenterTopBottom'); },\n    readOnly: true,\n    isIncrementalSearchCommand: true\n}, {\n    name: 'selectAllMatches',\n    bindKey: 'Ctrl-space',\n    exec: function(iSearch) {\n        var ed = iSearch.$editor,\n            hl = ed.session.$isearchHighlight,\n            ranges = hl && hl.cache ? hl.cache\n                .reduce(function(ranges, ea) {\n                    return ranges.concat(ea ? ea : []); }, []) : [];\n        iSearch.deactivate(false);\n        ranges.forEach(ed.selection.addRange.bind(ed.selection));\n    },\n    readOnly: true,\n    isIncrementalSearchCommand: true\n}, {\n    name: 'searchAsRegExp',\n    bindKey: 'Alt-r',\n    exec: function(iSearch) {\n        iSearch.convertNeedleToRegExp();\n    },\n    readOnly: true,\n    isIncrementalSearchCommand: true\n}];\n\nfunction IncrementalSearchKeyboardHandler(iSearch) {\n    this.$iSearch = iSearch;\n}\n\noop.inherits(IncrementalSearchKeyboardHandler, HashHandler);\n\n;(function() {\n\n    this.attach = function(editor) {\n        var iSearch = this.$iSearch;\n        HashHandler.call(this, exports.iSearchCommands, editor.commands.platform);\n        this.$commandExecHandler = editor.commands.addEventListener('exec', function(e) {\n            if (!e.command.isIncrementalSearchCommand) return undefined;\n            e.stopPropagation();\n            e.preventDefault();\n            return e.command.exec(iSearch, e.args || {});\n        });\n    }\n\n    this.detach = function(editor) {\n        if (!this.$commandExecHandler) return;\n        editor.commands.removeEventListener('exec', this.$commandExecHandler);\n        delete this.$commandExecHandler;\n    }\n\n    var handleKeyboard$super = this.handleKeyboard;\n    this.handleKeyboard = function(data, hashId, key, keyCode) {\n        if (((hashId === 1/*ctrl*/ || hashId === 8/*command*/) && key === 'v')\n         || (hashId === 1/*ctrl*/ && key === 'y')) return null;\n        var cmd = handleKeyboard$super.call(this, data, hashId, key, keyCode);\n        if (cmd.command) { return cmd; }\n        if (hashId == -1) {\n            var extendCmd = this.commands.extendSearchTerm;\n            if (extendCmd) { return {command: extendCmd, args: key}; }\n        }\n        return {command: \"null\", passEvent: hashId == 0 || hashId == 4};\n    }\n\n}).call(IncrementalSearchKeyboardHandler.prototype);\n\n\nexports.IncrementalSearchKeyboardHandler = IncrementalSearchKeyboardHandler;\n\n});\n\nace.define(\"ace/incremental_search\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/search\",\"ace/search_highlight\",\"ace/commands/incremental_search_commands\",\"ace/lib/dom\",\"ace/commands/command_manager\",\"ace/editor\",\"ace/config\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar Range = require(\"./range\").Range;\nvar Search = require(\"./search\").Search;\nvar SearchHighlight = require(\"./search_highlight\").SearchHighlight;\nvar iSearchCommandModule = require(\"./commands/incremental_search_commands\");\nvar ISearchKbd = iSearchCommandModule.IncrementalSearchKeyboardHandler;\nfunction IncrementalSearch() {\n    this.$options = {wrap: false, skipCurrent: false};\n    this.$keyboardHandler = new ISearchKbd(this);\n}\n\noop.inherits(IncrementalSearch, Search);\n\nfunction isRegExp(obj) {\n    return obj instanceof RegExp;\n}\n\nfunction regExpToObject(re) {\n    var string = String(re),\n        start = string.indexOf('/'),\n        flagStart = string.lastIndexOf('/');\n    return {\n        expression: string.slice(start+1, flagStart),\n        flags: string.slice(flagStart+1)\n    }\n}\n\nfunction stringToRegExp(string, flags) {\n    try {\n        return new RegExp(string, flags);\n    } catch (e) { return string; }\n}\n\nfunction objectToRegExp(obj) {\n    return stringToRegExp(obj.expression, obj.flags);\n}\n\n;(function() {\n\n    this.activate = function(ed, backwards) {\n        this.$editor = ed;\n        this.$startPos = this.$currentPos = ed.getCursorPosition();\n        this.$options.needle = '';\n        this.$options.backwards = backwards;\n        ed.keyBinding.addKeyboardHandler(this.$keyboardHandler);\n        this.$originalEditorOnPaste = ed.onPaste; ed.onPaste = this.onPaste.bind(this);\n        this.$mousedownHandler = ed.addEventListener('mousedown', this.onMouseDown.bind(this));\n        this.selectionFix(ed);\n        this.statusMessage(true);\n    }\n\n    this.deactivate = function(reset) {\n        this.cancelSearch(reset);\n        var ed = this.$editor;\n        ed.keyBinding.removeKeyboardHandler(this.$keyboardHandler);\n        if (this.$mousedownHandler) {\n            ed.removeEventListener('mousedown', this.$mousedownHandler);\n            delete this.$mousedownHandler;\n        }\n        ed.onPaste = this.$originalEditorOnPaste;\n        this.message('');\n    }\n\n    this.selectionFix = function(editor) {\n        if (editor.selection.isEmpty() && !editor.session.$emacsMark) {\n            editor.clearSelection();\n        }\n    }\n\n    this.highlight = function(regexp) {\n        var sess = this.$editor.session,\n            hl = sess.$isearchHighlight = sess.$isearchHighlight || sess.addDynamicMarker(\n                new SearchHighlight(null, \"ace_isearch-result\", \"text\"));\n        hl.setRegexp(regexp);\n        sess._emit(\"changeBackMarker\"); // force highlight layer redraw\n    }\n\n    this.cancelSearch = function(reset) {\n        var e = this.$editor;\n        this.$prevNeedle = this.$options.needle;\n        this.$options.needle = '';\n        if (reset) {\n            e.moveCursorToPosition(this.$startPos);\n            this.$currentPos = this.$startPos;\n        } else {\n            e.pushEmacsMark && e.pushEmacsMark(this.$startPos, false);\n        }\n        this.highlight(null);\n        return Range.fromPoints(this.$currentPos, this.$currentPos);\n    }\n\n    this.highlightAndFindWithNeedle = function(moveToNext, needleUpdateFunc) {\n        if (!this.$editor) return null;\n        var options = this.$options;\n        if (needleUpdateFunc) {\n            options.needle = needleUpdateFunc.call(this, options.needle || '') || '';\n        }\n        if (options.needle.length === 0) {\n            this.statusMessage(true);\n            return this.cancelSearch(true);\n        };\n        options.start = this.$currentPos;\n        var session = this.$editor.session,\n            found = this.find(session),\n            shouldSelect = this.$editor.emacsMark ?\n                !!this.$editor.emacsMark() : !this.$editor.selection.isEmpty();\n        if (found) {\n            if (options.backwards) found = Range.fromPoints(found.end, found.start);\n            this.$editor.selection.setRange(Range.fromPoints(shouldSelect ? this.$startPos : found.end, found.end));\n            if (moveToNext) this.$currentPos = found.end;\n            this.highlight(options.re)\n        }\n\n        this.statusMessage(found);\n\n        return found;\n    }\n\n    this.addString = function(s) {\n        return this.highlightAndFindWithNeedle(false, function(needle) {\n            if (!isRegExp(needle))\n              return needle + s;\n            var reObj = regExpToObject(needle);\n            reObj.expression += s;\n            return objectToRegExp(reObj);\n        });\n    }\n\n    this.removeChar = function(c) {\n        return this.highlightAndFindWithNeedle(false, function(needle) {\n            if (!isRegExp(needle))\n              return needle.substring(0, needle.length-1);\n            var reObj = regExpToObject(needle);\n            reObj.expression = reObj.expression.substring(0, reObj.expression.length-1);\n            return objectToRegExp(reObj);\n        });\n    }\n\n    this.next = function(options) {\n        options = options || {};\n        this.$options.backwards = !!options.backwards;\n        this.$currentPos = this.$editor.getCursorPosition();\n        return this.highlightAndFindWithNeedle(true, function(needle) {\n            return options.useCurrentOrPrevSearch && needle.length === 0 ?\n                this.$prevNeedle || '' : needle;\n        });\n    }\n\n    this.onMouseDown = function(evt) {\n        this.deactivate();\n        return true;\n    }\n\n    this.onPaste = function(text) {\n        this.addString(text);\n    }\n\n    this.convertNeedleToRegExp = function() {\n        return this.highlightAndFindWithNeedle(false, function(needle) {\n            return isRegExp(needle) ? needle : stringToRegExp(needle, 'ig');\n        });\n    }\n\n    this.convertNeedleToString = function() {\n        return this.highlightAndFindWithNeedle(false, function(needle) {\n            return isRegExp(needle) ? regExpToObject(needle).expression : needle;\n        });\n    }\n\n    this.statusMessage = function(found) {\n        var options = this.$options, msg = '';\n        msg += options.backwards ? 'reverse-' : '';\n        msg += 'isearch: ' + options.needle;\n        msg += found ? '' : ' (not found)';\n        this.message(msg);\n    }\n\n    this.message = function(msg) {\n        if (this.$editor.showCommandLine) {\n            this.$editor.showCommandLine(msg);\n            this.$editor.focus();\n        } else {\n            console.log(msg);\n        }\n    }\n\n}).call(IncrementalSearch.prototype);\n\n\nexports.IncrementalSearch = IncrementalSearch;\n\nvar dom = require('./lib/dom');\ndom.importCssString && dom.importCssString(\"\\\n.ace_marker-layer .ace_isearch-result {\\\n  position: absolute;\\\n  z-index: 6;\\\n  -moz-box-sizing: border-box;\\\n  -webkit-box-sizing: border-box;\\\n  box-sizing: border-box;\\\n}\\\ndiv.ace_isearch-result {\\\n  border-radius: 4px;\\\n  background-color: rgba(255, 200, 0, 0.5);\\\n  box-shadow: 0 0 4px rgb(255, 200, 0);\\\n}\\\n.ace_dark div.ace_isearch-result {\\\n  background-color: rgb(100, 110, 160);\\\n  box-shadow: 0 0 4px rgb(80, 90, 140);\\\n}\", \"incremental-search-highlighting\");\nvar commands = require(\"./commands/command_manager\");\n(function() {\n    this.setupIncrementalSearch = function(editor, val) {\n        if (this.usesIncrementalSearch == val) return;\n        this.usesIncrementalSearch = val;\n        var iSearchCommands = iSearchCommandModule.iSearchStartCommands;\n        var method = val ? 'addCommands' : 'removeCommands';\n        this[method](iSearchCommands);\n    };\n}).call(commands.CommandManager.prototype);\nvar Editor = require(\"./editor\").Editor;\nrequire(\"./config\").defineOptions(Editor.prototype, \"editor\", {\n    useIncrementalSearch: {\n        set: function(val) {\n            this.keyBinding.$handlers.forEach(function(handler) {\n                if (handler.setupIncrementalSearch) {\n                    handler.setupIncrementalSearch(this, val);\n                }\n            });\n            this._emit('incrementalSearchSettingChanged', {isEnabled: val});\n        }\n    }\n});\n\n});\n\nace.define(\"ace/keyboard/emacs\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\",\"ace/incremental_search\",\"ace/commands/incremental_search_commands\",\"ace/keyboard/hash_handler\",\"ace/lib/keys\"], function(require, exports, module) {\n\"use strict\";\n\nvar dom = require(\"../lib/dom\");\nrequire(\"../incremental_search\");\nvar iSearchCommandModule = require(\"../commands/incremental_search_commands\");\n\n\nvar screenToTextBlockCoordinates = function(x, y) {\n    var canvasPos = this.scroller.getBoundingClientRect();\n\n    var col = Math.floor(\n        (x + this.scrollLeft - canvasPos.left - this.$padding) / this.characterWidth\n    );\n    var row = Math.floor(\n        (y + this.scrollTop - canvasPos.top) / this.lineHeight\n    );\n\n    return this.session.screenToDocumentPosition(row, col);\n};\n\nvar HashHandler = require(\"./hash_handler\").HashHandler;\nexports.handler = new HashHandler();\n\nexports.handler.isEmacs = true;\nexports.handler.$id = \"ace/keyboard/emacs\";\n\nvar initialized = false;\nvar $formerLongWords;\nvar $formerLineStart;\n\nexports.handler.attach = function(editor) {\n    if (!initialized) {\n        initialized = true;\n        dom.importCssString('\\\n            .emacs-mode .ace_cursor{\\\n                border: 1px rgba(50,250,50,0.8) solid!important;\\\n                -moz-box-sizing: border-box!important;\\\n                -webkit-box-sizing: border-box!important;\\\n                box-sizing: border-box!important;\\\n                background-color: rgba(0,250,0,0.9);\\\n                opacity: 0.5;\\\n            }\\\n            .emacs-mode .ace_hidden-cursors .ace_cursor{\\\n                opacity: 1;\\\n                background-color: transparent;\\\n            }\\\n            .emacs-mode .ace_overwrite-cursors .ace_cursor {\\\n                opacity: 1;\\\n                background-color: transparent;\\\n                border-width: 0 0 2px 2px !important;\\\n            }\\\n            .emacs-mode .ace_text-layer {\\\n                z-index: 4\\\n            }\\\n            .emacs-mode .ace_cursor-layer {\\\n                z-index: 2\\\n            }', 'emacsMode'\n        );\n    }\n    $formerLongWords = editor.session.$selectLongWords;\n    editor.session.$selectLongWords = true;\n    $formerLineStart = editor.session.$useEmacsStyleLineStart;\n    editor.session.$useEmacsStyleLineStart = true;\n\n    editor.session.$emacsMark = null; // the active mark\n    editor.session.$emacsMarkRing = editor.session.$emacsMarkRing || [];\n\n    editor.emacsMark = function() {\n        return this.session.$emacsMark;\n    };\n\n    editor.setEmacsMark = function(p) {\n        this.session.$emacsMark = p;\n    };\n\n    editor.pushEmacsMark = function(p, activate) {\n        var prevMark = this.session.$emacsMark;\n        if (prevMark)\n            this.session.$emacsMarkRing.push(prevMark);\n        if (!p || activate) this.setEmacsMark(p);\n        else this.session.$emacsMarkRing.push(p);\n    };\n\n    editor.popEmacsMark = function() {\n        var mark = this.emacsMark();\n        if (mark) { this.setEmacsMark(null); return mark; }\n        return this.session.$emacsMarkRing.pop();\n    };\n\n    editor.getLastEmacsMark = function(p) {\n        return this.session.$emacsMark || this.session.$emacsMarkRing.slice(-1)[0];\n    };\n\n    editor.emacsMarkForSelection = function(replacement) {\n        var sel = this.selection,\n            multiRangeLength = this.multiSelect ?\n                this.multiSelect.getAllRanges().length : 1,\n            selIndex = sel.index || 0,\n            markRing = this.session.$emacsMarkRing,\n            markIndex = markRing.length - (multiRangeLength - selIndex),\n            lastMark = markRing[markIndex] || sel.anchor;\n        if (replacement) {\n            markRing.splice(markIndex, 1,\n                \"row\" in replacement && \"column\" in replacement ?\n                    replacement : undefined);\n        }\n        return lastMark;\n    }\n\n    editor.on(\"click\", $resetMarkMode);\n    editor.on(\"changeSession\", $kbSessionChange);\n    editor.renderer.screenToTextCoordinates = screenToTextBlockCoordinates;\n    editor.setStyle(\"emacs-mode\");\n    editor.commands.addCommands(commands);\n    exports.handler.platform = editor.commands.platform;\n    editor.$emacsModeHandler = this;\n    editor.addEventListener('copy', this.onCopy);\n    editor.addEventListener('paste', this.onPaste);\n};\n\nexports.handler.detach = function(editor) {\n    delete editor.renderer.screenToTextCoordinates;\n    editor.session.$selectLongWords = $formerLongWords;\n    editor.session.$useEmacsStyleLineStart = $formerLineStart;\n    editor.removeEventListener(\"click\", $resetMarkMode);\n    editor.removeEventListener(\"changeSession\", $kbSessionChange);\n    editor.unsetStyle(\"emacs-mode\");\n    editor.commands.removeCommands(commands);\n    editor.removeEventListener('copy', this.onCopy);\n    editor.removeEventListener('paste', this.onPaste);\n    editor.$emacsModeHandler = null;\n};\n\nvar $kbSessionChange = function(e) {\n    if (e.oldSession) {\n        e.oldSession.$selectLongWords = $formerLongWords;\n        e.oldSession.$useEmacsStyleLineStart = $formerLineStart;\n    }\n\n    $formerLongWords = e.session.$selectLongWords;\n    e.session.$selectLongWords = true;\n    $formerLineStart = e.session.$useEmacsStyleLineStart;\n    e.session.$useEmacsStyleLineStart = true;\n\n    if (!e.session.hasOwnProperty('$emacsMark'))\n        e.session.$emacsMark = null;\n    if (!e.session.hasOwnProperty('$emacsMarkRing'))\n        e.session.$emacsMarkRing = [];\n};\n\nvar $resetMarkMode = function(e) {\n    e.editor.session.$emacsMark = null;\n};\n\nvar keys = require(\"../lib/keys\").KEY_MODS;\nvar eMods = {C: \"ctrl\", S: \"shift\", M: \"alt\", CMD: \"command\"};\nvar combinations = [\"C-S-M-CMD\",\n                    \"S-M-CMD\", \"C-M-CMD\", \"C-S-CMD\", \"C-S-M\",\n                    \"M-CMD\", \"S-CMD\", \"S-M\", \"C-CMD\", \"C-M\", \"C-S\",\n                    \"CMD\", \"M\", \"S\", \"C\"];\ncombinations.forEach(function(c) {\n    var hashId = 0;\n    c.split(\"-\").forEach(function(c) {\n        hashId = hashId | keys[eMods[c]];\n    });\n    eMods[hashId] = c.toLowerCase() + \"-\";\n});\n\nexports.handler.onCopy = function(e, editor) {\n    if (editor.$handlesEmacsOnCopy) return;\n    editor.$handlesEmacsOnCopy = true;\n    exports.handler.commands.killRingSave.exec(editor);\n    editor.$handlesEmacsOnCopy = false;\n};\n\nexports.handler.onPaste = function(e, editor) {\n    editor.pushEmacsMark(editor.getCursorPosition());\n};\n\nexports.handler.bindKey = function(key, command) {\n    if (typeof key == \"object\")\n        key = key[this.platform];\n    if (!key)\n        return;\n\n    var ckb = this.commandKeyBinding;\n    key.split(\"|\").forEach(function(keyPart) {\n        keyPart = keyPart.toLowerCase();\n        ckb[keyPart] = command;\n        var keyParts = keyPart.split(\" \").slice(0,-1);\n        keyParts.reduce(function(keyMapKeys, keyPart, i) {\n            var prefix = keyMapKeys[i-1] ? keyMapKeys[i-1] + ' ' : '';\n            return keyMapKeys.concat([prefix + keyPart]);\n        }, []).forEach(function(keyPart) {\n            if (!ckb[keyPart]) ckb[keyPart] = \"null\";\n        });\n    }, this);\n};\n\nexports.handler.getStatusText = function(editor, data) {\n  var str = \"\";\n  if (data.count)\n    str += data.count;\n  if (data.keyChain)\n    str += \" \" + data.keyChain\n  return str;\n};\n\nexports.handler.handleKeyboard = function(data, hashId, key, keyCode) {\n    if (keyCode === -1) return undefined;\n\n    var editor = data.editor;\n    editor._signal(\"changeStatus\");\n    if (hashId == -1) {\n        editor.pushEmacsMark();\n        if (data.count) {\n            var str = new Array(data.count + 1).join(key);\n            data.count = null;\n            return {command: \"insertstring\", args: str};\n        }\n    }\n\n    var modifier = eMods[hashId];\n    if (modifier == \"c-\" || data.count) {\n        var count = parseInt(key[key.length - 1]);\n        if (typeof count === 'number' && !isNaN(count)) {\n            data.count = Math.max(data.count, 0) || 0;\n            data.count = 10 * data.count + count;\n            return {command: \"null\"};\n        }\n    }\n    if (modifier) key = modifier + key;\n    if (data.keyChain) key = data.keyChain += \" \" + key;\n    var command = this.commandKeyBinding[key];\n    data.keyChain = command == \"null\" ? key : \"\";\n    if (!command) return undefined;\n    if (command === \"null\") return {command: \"null\"};\n\n    if (command === \"universalArgument\") {\n        data.count = -4;\n        return {command: \"null\"};\n    }\n    var args;\n    if (typeof command !== \"string\") {\n        args = command.args;\n        if (command.command) command = command.command;\n        if (command === \"goorselect\") {\n            command = editor.emacsMark() ? args[1] : args[0];\n            args = null;\n        }\n    }\n\n    if (typeof command === \"string\") {\n        if (command === \"insertstring\" ||\n            command === \"splitline\" ||\n            command === \"togglecomment\") {\n            editor.pushEmacsMark();\n        }\n        command = this.commands[command] || editor.commands.commands[command];\n        if (!command) return undefined;\n    }\n\n    if (!command.readOnly && !command.isYank)\n        data.lastCommand = null;\n\n    if (!command.readOnly && editor.emacsMark())\n        editor.setEmacsMark(null)\n        \n    if (data.count) {\n        var count = data.count;\n        data.count = 0;\n        if (!command || !command.handlesCount) {\n            return {\n                args: args,\n                command: {\n                    exec: function(editor, args) {\n                        for (var i = 0; i < count; i++)\n                            command.exec(editor, args);\n                    },\n                    multiSelectAction: command.multiSelectAction\n                }\n            };\n        } else {\n            if (!args) args = {};\n            if (typeof args === 'object') args.count = count;\n        }\n    }\n\n    return {command: command, args: args};\n};\n\nexports.emacsKeys = {\n    \"Up|C-p\"      : {command: \"goorselect\", args: [\"golineup\",\"selectup\"]},\n    \"Down|C-n\"    : {command: \"goorselect\", args: [\"golinedown\",\"selectdown\"]},\n    \"Left|C-b\"    : {command: \"goorselect\", args: [\"gotoleft\",\"selectleft\"]},\n    \"Right|C-f\"   : {command: \"goorselect\", args: [\"gotoright\",\"selectright\"]},\n    \"C-Left|M-b\"  : {command: \"goorselect\", args: [\"gotowordleft\",\"selectwordleft\"]},\n    \"C-Right|M-f\" : {command: \"goorselect\", args: [\"gotowordright\",\"selectwordright\"]},\n    \"Home|C-a\"    : {command: \"goorselect\", args: [\"gotolinestart\",\"selecttolinestart\"]},\n    \"End|C-e\"     : {command: \"goorselect\", args: [\"gotolineend\",\"selecttolineend\"]},\n    \"C-Home|S-M-,\": {command: \"goorselect\", args: [\"gotostart\",\"selecttostart\"]},\n    \"C-End|S-M-.\" : {command: \"goorselect\", args: [\"gotoend\",\"selecttoend\"]},\n    \"S-Up|S-C-p\"      : \"selectup\",\n    \"S-Down|S-C-n\"    : \"selectdown\",\n    \"S-Left|S-C-b\"    : \"selectleft\",\n    \"S-Right|S-C-f\"   : \"selectright\",\n    \"S-C-Left|S-M-b\"  : \"selectwordleft\",\n    \"S-C-Right|S-M-f\" : \"selectwordright\",\n    \"S-Home|S-C-a\"    : \"selecttolinestart\",\n    \"S-End|S-C-e\"     : \"selecttolineend\",\n    \"S-C-Home\"        : \"selecttostart\",\n    \"S-C-End\"         : \"selecttoend\",\n\n    \"C-l\" : \"recenterTopBottom\",\n    \"M-s\" : \"centerselection\",\n    \"M-g\": \"gotoline\",\n    \"C-x C-p\": \"selectall\",\n    \"C-Down\": {command: \"goorselect\", args: [\"gotopagedown\",\"selectpagedown\"]},\n    \"C-Up\": {command: \"goorselect\", args: [\"gotopageup\",\"selectpageup\"]},\n    \"PageDown|C-v\": {command: \"goorselect\", args: [\"gotopagedown\",\"selectpagedown\"]},\n    \"PageUp|M-v\": {command: \"goorselect\", args: [\"gotopageup\",\"selectpageup\"]},\n    \"S-C-Down\": \"selectpagedown\",\n    \"S-C-Up\": \"selectpageup\",\n\n    \"C-s\": \"iSearch\",\n    \"C-r\": \"iSearchBackwards\",\n\n    \"M-C-s\": \"findnext\",\n    \"M-C-r\": \"findprevious\",\n    \"S-M-5\": \"replace\",\n    \"Backspace\": \"backspace\",\n    \"Delete|C-d\": \"del\",\n    \"Return|C-m\": {command: \"insertstring\", args: \"\\n\"}, // \"newline\"\n    \"C-o\": \"splitline\",\n\n    \"M-d|C-Delete\": {command: \"killWord\", args: \"right\"},\n    \"C-Backspace|M-Backspace|M-Delete\": {command: \"killWord\", args: \"left\"},\n    \"C-k\": \"killLine\",\n\n    \"C-y|S-Delete\": \"yank\",\n    \"M-y\": \"yankRotate\",\n    \"C-g\": \"keyboardQuit\",\n\n    \"C-w|C-S-W\": \"killRegion\",\n    \"M-w\": \"killRingSave\",\n    \"C-Space\": \"setMark\",\n    \"C-x C-x\": \"exchangePointAndMark\",\n\n    \"C-t\": \"transposeletters\",\n    \"M-u\": \"touppercase\",    // Doesn't work\n    \"M-l\": \"tolowercase\",\n    \"M-/\": \"autocomplete\",   // Doesn't work\n    \"C-u\": \"universalArgument\",\n\n    \"M-;\": \"togglecomment\",\n\n    \"C-/|C-x u|S-C--|C-z\": \"undo\",\n    \"S-C-/|S-C-x u|C--|S-C-z\": \"redo\", //infinite undo?\n    \"C-x r\":  \"selectRectangularRegion\",\n    \"M-x\": {command: \"focusCommandLine\", args: \"M-x \"}\n};\n\n\nexports.handler.bindKeys(exports.emacsKeys);\n\nexports.handler.addCommands({\n    recenterTopBottom: function(editor) {\n        var renderer = editor.renderer;\n        var pos = renderer.$cursorLayer.getPixelPosition();\n        var h = renderer.$size.scrollerHeight - renderer.lineHeight;\n        var scrollTop = renderer.scrollTop;\n        if (Math.abs(pos.top - scrollTop) < 2) {\n            scrollTop = pos.top - h;\n        } else if (Math.abs(pos.top - scrollTop - h * 0.5) < 2) {\n            scrollTop = pos.top;\n        } else {\n            scrollTop = pos.top - h * 0.5;\n        }\n        editor.session.setScrollTop(scrollTop);\n    },\n    selectRectangularRegion:  function(editor) {\n        editor.multiSelect.toggleBlockSelection();\n    },\n    setMark:  {\n        exec: function(editor, args) {\n\n            if (args && args.count) {\n                if (editor.inMultiSelectMode) editor.forEachSelection(moveToMark);\n                else moveToMark();\n                moveToMark();\n                return;\n            }\n\n            var mark = editor.emacsMark(),\n                ranges = editor.selection.getAllRanges(),\n                rangePositions = ranges.map(function(r) { return {row: r.start.row, column: r.start.column}; }),\n                transientMarkModeActive = true,\n                hasNoSelection = ranges.every(function(range) { return range.isEmpty(); });\n            if (transientMarkModeActive && (mark || !hasNoSelection)) {\n                if (editor.inMultiSelectMode) editor.forEachSelection({exec: editor.clearSelection.bind(editor)})\n                else editor.clearSelection();\n                if (mark) editor.pushEmacsMark(null);\n                return;\n            }\n\n            if (!mark) {\n                rangePositions.forEach(function(pos) { editor.pushEmacsMark(pos); });\n                editor.setEmacsMark(rangePositions[rangePositions.length-1]);\n                return;\n            }\n\n            function moveToMark() {\n                var mark = editor.popEmacsMark();\n                mark && editor.moveCursorToPosition(mark);\n            }\n\n        },\n        readOnly: true,\n        handlesCount: true\n    },\n    exchangePointAndMark: {\n        exec: function exchangePointAndMark$exec(editor, args) {\n            var sel = editor.selection;\n            if (!args.count && !sel.isEmpty()) { // just invert selection\n                sel.setSelectionRange(sel.getRange(), !sel.isBackwards());\n                return;\n            }\n\n            if (args.count) { // replace mark and point\n                var pos = {row: sel.lead.row, column: sel.lead.column};\n                sel.clearSelection();\n                sel.moveCursorToPosition(editor.emacsMarkForSelection(pos));\n            } else { // create selection to last mark\n                sel.selectToPosition(editor.emacsMarkForSelection());\n            }\n        },\n        readOnly: true,\n        handlesCount: true,\n        multiSelectAction: \"forEach\"\n    },\n    killWord: {\n        exec: function(editor, dir) {\n            editor.clearSelection();\n            if (dir == \"left\")\n                editor.selection.selectWordLeft();\n            else\n                editor.selection.selectWordRight();\n\n            var range = editor.getSelectionRange();\n            var text = editor.session.getTextRange(range);\n            exports.killRing.add(text);\n\n            editor.session.remove(range);\n            editor.clearSelection();\n        },\n        multiSelectAction: \"forEach\"\n    },\n    killLine: function(editor) {\n        editor.pushEmacsMark(null);\n        var pos = editor.getCursorPosition();\n        if (pos.column === 0 &&\n            editor.session.doc.getLine(pos.row).length === 0) {\n            editor.selection.selectLine();\n        } else {\n            editor.clearSelection();\n            editor.selection.selectLineEnd();\n        }\n        var range = editor.getSelectionRange();\n        var text = editor.session.getTextRange(range);\n        exports.killRing.add(text);\n\n        editor.session.remove(range);\n        editor.clearSelection();\n    },\n    yank: function(editor) {\n        editor.onPaste(exports.killRing.get() || '');\n        editor.keyBinding.$data.lastCommand = \"yank\";\n    },\n    yankRotate: function(editor) {\n        if (editor.keyBinding.$data.lastCommand != \"yank\")\n            return;\n        editor.undo();\n        editor.session.$emacsMarkRing.pop(); // also undo recording mark\n        editor.onPaste(exports.killRing.rotate());\n        editor.keyBinding.$data.lastCommand = \"yank\";\n    },\n    killRegion: {\n        exec: function(editor) {\n            exports.killRing.add(editor.getCopyText());\n            editor.commands.byName.cut.exec(editor);\n        },\n        readOnly: true,\n        multiSelectAction: \"forEach\"\n    },\n    killRingSave: {\n        exec: function(editor) {\n\n            editor.$handlesEmacsOnCopy = true;\n            var marks = editor.session.$emacsMarkRing.slice(),\n                deselectedMarks = [];\n            exports.killRing.add(editor.getCopyText());\n\n            setTimeout(function() {\n                function deselect() {\n                    var sel = editor.selection, range = sel.getRange(),\n                        pos = sel.isBackwards() ? range.end : range.start;\n                    deselectedMarks.push({row: pos.row, column: pos.column});\n                    sel.clearSelection();\n                }\n                editor.$handlesEmacsOnCopy = false;\n                if (editor.inMultiSelectMode) editor.forEachSelection({exec: deselect});\n                else deselect();\n                editor.session.$emacsMarkRing = marks.concat(deselectedMarks.reverse());\n            }, 0);\n        },\n        readOnly: true\n    },\n    keyboardQuit: function(editor) {\n        editor.selection.clearSelection();\n        editor.setEmacsMark(null);\n        editor.keyBinding.$data.count = null;\n    },\n    focusCommandLine: function(editor, arg) {\n        if (editor.showCommandLine)\n            editor.showCommandLine(arg);\n    }\n});\n\nexports.handler.addCommands(iSearchCommandModule.iSearchStartCommands);\n\nvar commands = exports.handler.commands;\ncommands.yank.isYank = true;\ncommands.yankRotate.isYank = true;\n\nexports.killRing = {\n    $data: [],\n    add: function(str) {\n        str && this.$data.push(str);\n        if (this.$data.length > 30)\n            this.$data.shift();\n    },\n    get: function(n) {\n        n = n || 1;\n        return this.$data.slice(this.$data.length-n, this.$data.length).reverse().join('\\n');\n    },\n    pop: function() {\n        if (this.$data.length > 1)\n            this.$data.pop();\n        return this.get();\n    },\n    rotate: function() {\n        this.$data.unshift(this.$data.pop());\n        return this.get();\n    }\n};\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/keybinding-vim.js",
    "content": "ace.define(\"ace/keyboard/vim\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/event_emitter\",\"ace/lib/dom\",\"ace/lib/oop\",\"ace/lib/keys\",\"ace/lib/event\",\"ace/search\",\"ace/lib/useragent\",\"ace/search_highlight\",\"ace/commands/multi_select_commands\",\"ace/multi_select\"], function(require, exports, module) {\n  'use strict';\n\n  function log() {\n    var d = \"\";\n    function format(p) {\n      if (typeof p != \"object\")\n        return p + \"\"\n      if (\"line\" in p) {\n        return p.line + \":\" + p.ch\n      }\n      if (\"anchor\" in p) {\n        return format(p.anchor) + \"->\" + format(p.head)\n      }\n      if (Array.isArray(p))\n        return \"[\" + p.map(function(x) {return format(x)})+\"]\"\n      return JSON.stringify(p)\n    }\n    for (var i = 0; i < arguments.length; i++) {\n      var p = arguments[i]\n      var f = format(p)\n      d+= f+\"  \"\n    }\n    console.log(d)\n  }\n  var Range = require(\"../range\").Range;\n  var EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n  var dom = require(\"../lib/dom\");\n  var oop = require(\"../lib/oop\");\n  var KEYS = require(\"../lib/keys\");\n  var event = require(\"../lib/event\");\n  var Search = require(\"../search\").Search;\n  var useragent = require(\"../lib/useragent\");\n  var SearchHighlight = require(\"../search_highlight\").SearchHighlight;\n  var multiSelectCommands = require(\"../commands/multi_select_commands\");\n  require(\"../multi_select\");\n\n  var CodeMirror = function(ace) {\n    this.ace = ace;\n    this.state = {};\n    this.marks = {};\n    this.$uid = 0;\n    this.onChange = this.onChange.bind(this);\n    this.onSelectionChange = this.onSelectionChange.bind(this);\n    this.onBeforeEndOperation = this.onBeforeEndOperation.bind(this);\n    this.ace.on('change', this.onChange);\n    this.ace.on('changeSelection', this.onSelectionChange);\n    this.ace.on('beforeEndOperation', this.onBeforeEndOperation);\n  };\n  CodeMirror.Pos = function(line, ch) {\n    if (!(this instanceof Pos)) return new Pos(line, ch);\n    this.line = line; this.ch = ch;\n  };\n  CodeMirror.defineOption = function(name, val, setter) {};\n  CodeMirror.commands = {\n    redo: function(cm) { cm.ace.redo(); },\n    undo: function(cm) { cm.ace.undo(); },\n    newlineAndIndent: function(cm) { cm.ace.insert(\"\\n\"); },\n  };\n  CodeMirror.keyMap = {};\n  CodeMirror.addClass = CodeMirror.rmClass =\n  CodeMirror.e_stop = function() {};\n  CodeMirror.keyName = function(e) {\n    if (e.key) return e.key;\n    var key = (KEYS[e.keyCode] || \"\");\n    if (key.length == 1) key = key.toUpperCase();\n    key = event.getModifierString(e).replace(/(^|-)\\w/g, function(m) {\n      return m.toUpperCase();\n    }) + key;\n    return key;\n  };\n  CodeMirror.keyMap['default'] = function(key) {\n    return function(cm) {\n      var cmd = cm.ace.commands.commandKeyBinding[key.toLowerCase()];\n      return cmd && cm.ace.execCommand(cmd) !== false;\n    };\n  };\n  CodeMirror.lookupKey = function lookupKey(key, map, handle) {\n    if (typeof map == \"string\")\n      map = CodeMirror.keyMap[map];\n    var found = typeof map == \"function\" ? map(key) : map[key];\n    if (found === false) return \"nothing\";\n    if (found === \"...\") return \"multi\";\n    if (found != null && handle(found)) return \"handled\";\n\n    if (map.fallthrough) {\n      if (!Array.isArray(map.fallthrough))\n        return lookupKey(key, map.fallthrough, handle);\n      for (var i = 0; i < map.fallthrough.length; i++) {\n        var result = lookupKey(key, map.fallthrough[i], handle);\n        if (result) return result;\n      }\n    }\n  };\n\n  CodeMirror.signal = function(o, name, e) { return o._signal(name, e) };\n  CodeMirror.on = event.addListener;\n  CodeMirror.off = event.removeListener;\n(function() {\n  oop.implement(CodeMirror.prototype, EventEmitter);\n  \n  this.destroy = function() {\n    this.ace.off('change', this.onChange);\n    this.ace.off('changeSelection', this.onSelectionChange);\n    this.ace.off('beforeEndOperation', this.onBeforeEndOperation);\n    this.removeOverlay();\n  };\n  this.virtualSelectionMode = function() {\n    return this.ace.inVirtualSelectionMode && this.ace.selection.index\n  };\n  this.onChange = function(delta) {\n    var oldDelta = delta.data;\n    delta = {\n      start: oldDelta.range.start,\n      end: oldDelta.range.end,\n      action: oldDelta.action,\n      lines: oldDelta.lines || [oldDelta.text]\n    };// v1.2 api compatibility\n    if (delta.action[0] == 'i') {\n      var change = { text: delta.lines };\n      var curOp = this.curOp = this.curOp || {};\n      if (!curOp.changeHandlers)\n        curOp.changeHandlers = this._eventRegistry[\"change\"] && this._eventRegistry[\"change\"].slice();\n      if (this.virtualSelectionMode()) return;\n      if (!curOp.lastChange) {\n        curOp.lastChange = curOp.change = change;\n      } else {\n        curOp.lastChange.next = curOp.lastChange = change;\n      }\n    }\n    this.$updateMarkers(delta);\n  };\n  this.onSelectionChange = function() {\n    var curOp = this.curOp = this.curOp || {};\n    if (!curOp.cursorActivityHandlers)\n      curOp.cursorActivityHandlers = this._eventRegistry[\"cursorActivity\"] && this._eventRegistry[\"cursorActivity\"].slice();\n    this.curOp.cursorActivity = true;\n    if (this.ace.inMultiSelectMode) {\n      this.ace.keyBinding.removeKeyboardHandler(multiSelectCommands.keyboardHandler);\n    }\n  };\n  this.operation = function(fn, force) {\n    if (!force && this.curOp || force && this.curOp && this.curOp.force) {\n      return fn();\n    }\n    if (force || !this.ace.curOp) {\n      if (this.curOp)\n        this.onBeforeEndOperation();\n    }\n    if (!this.ace.curOp) {\n      var prevOp = this.ace.prevOp;\n      this.ace.startOperation({\n        command: { name: \"vim\",  scrollIntoView: \"cursor\" }\n      });\n    }\n    var curOp = this.curOp = this.curOp || {};\n    this.curOp.force = force;\n    var result = fn();\n    if (this.ace.curOp && this.ace.curOp.command.name == \"vim\") {\n      this.ace.endOperation();\n      if (!curOp.cursorActivity && !curOp.lastChange && prevOp)\n        this.ace.prevOp = prevOp;\n    }\n    if (force || !this.ace.curOp) {\n      if (this.curOp)\n        this.onBeforeEndOperation();\n    }\n    return result;\n  };\n  this.onBeforeEndOperation = function() {\n    var op = this.curOp;\n    if (op) {\n      if (op.change) { this.signal(\"change\", op.change, op); }\n      if (op && op.cursorActivity) { this.signal(\"cursorActivity\", null, op); }\n      this.curOp = null;\n    }\n  };\n\n  this.signal = function(eventName, e, handlers) {\n    var listeners = handlers ? handlers[eventName + \"Handlers\"]\n        : (this._eventRegistry || {})[eventName];\n    if (!listeners)\n        return;\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++)\n        listeners[i](this, e);\n  };\n  this.firstLine = function() { return 0; };\n  this.lastLine = function() { return this.ace.session.getLength() - 1; };\n  this.lineCount = function() { return this.ace.session.getLength(); };\n  this.setCursor = function(line, ch) {\n    if (typeof line === 'object') {\n      ch = line.ch;\n      line = line.line;\n    }\n    if (!this.ace.inVirtualSelectionMode)\n      this.ace.exitMultiSelectMode();\n    this.ace.selection.moveTo(line, ch);\n  };\n  this.getCursor = function(p) {\n    var sel = this.ace.selection;\n    var pos = p == 'anchor' ? (sel.isEmpty() ? sel.lead : sel.anchor) :\n        p == 'head' || !p ? sel.lead : sel.getRange()[p];\n    return toCmPos(pos);\n  };\n  this.listSelections = function(p) {\n    var ranges = this.ace.multiSelect.rangeList.ranges;\n    if (!ranges.length || this.ace.inVirtualSelectionMode)\n      return [{anchor: this.getCursor('anchor'), head: this.getCursor('head')}];\n    return ranges.map(function(r) {\n      return {\n        anchor: this.clipPos(toCmPos(r.cursor == r.end ? r.start : r.end)),\n        head: this.clipPos(toCmPos(r.cursor))\n      };\n    }, this);\n  };\n  this.setSelections = function(p, primIndex) {\n    var sel = this.ace.multiSelect;\n    var ranges = p.map(function(x) {\n      var anchor = toAcePos(x.anchor);\n      var head = toAcePos(x.head);\n      var r = Range.comparePoints(anchor, head) < 0\n        ? new Range.fromPoints(anchor, head)\n        : new Range.fromPoints(head, anchor);\n      r.cursor = Range.comparePoints(r.start, head) ? r.end : r.start;\n      return r;\n    });\n    \n    if (this.ace.inVirtualSelectionMode) {\n      this.ace.selection.fromOrientedRange(ranges[0]);\n      return;\n    }\n    if (!primIndex) {\n        ranges = ranges.reverse();\n    } else if (ranges[primIndex]) {\n       ranges.push(ranges.splice(primIndex, 1)[0]);\n    }\n    sel.toSingleRange(ranges[0].clone());\n    var session = this.ace.session;\n    for (var i = 0; i < ranges.length; i++) {\n      var range = session.$clipRangeToDocument(ranges[i]); // todo why ace doesn't do this?\n      sel.addRange(range);\n    }\n  };\n  this.setSelection = function(a, h, options) {\n    var sel = this.ace.selection;\n    sel.moveTo(a.line, a.ch);\n    sel.selectTo(h.line, h.ch);\n    if (options && options.origin == '*mouse') {\n      this.onBeforeEndOperation();\n    }\n  };\n  this.somethingSelected = function(p) {\n    return !this.ace.selection.isEmpty();\n  };\n  this.clipPos = function(p) {\n    var pos = this.ace.session.$clipPositionToDocument(p.line, p.ch);\n    return toCmPos(pos);\n  };\n  this.markText = function(cursor) {\n    return {clear: function() {}, find: function() {}};\n  };\n  this.$updateMarkers = function(delta) {\n    var isInsert = delta.action == \"insert\";\n    var start = delta.start;\n    var end = delta.end;\n    var rowShift = (end.row - start.row) * (isInsert ? 1 : -1);\n    var colShift = (end.column - start.column) * (isInsert ? 1 : -1);\n    if (isInsert) end = start;\n    \n    for (var i in this.marks) {\n      var point = this.marks[i];\n      var cmp = Range.comparePoints(point, start);\n      if (cmp < 0) {\n        continue; // delta starts after the range\n      }\n      if (cmp === 0) {\n        if (isInsert) {\n          if (point.bias == 1) {\n            cmp = 1;\n          } else {\n            point.bias == -1;\n            continue;\n          }\n        }\n      }\n      var cmp2 = isInsert ? cmp : Range.comparePoints(point, end);\n      if (cmp2 > 0) {\n        point.row += rowShift;\n        point.column += point.row == end.row ? colShift : 0;\n        continue;\n      }\n      if (!isInsert && cmp2 <= 0) {\n        point.row = start.row;\n        point.column = start.column;\n        if (cmp2 === 0)\n          point.bias = 1\n      }\n    }\n  };\n  var Marker = function(cm, id, row, column) {\n    this.cm = cm;\n    this.id = id;\n    this.row = row;\n    this.column = column;\n    cm.marks[this.id] = this;\n  };\n  Marker.prototype.clear = function() { delete this.cm.marks[this.id] };\n  Marker.prototype.find = function() { return toCmPos(this) };\n  this.setBookmark = function(cursor, options) {\n    var bm = new Marker(this, this.$uid++, cursor.line, cursor.ch);\n    if (!options || !options.insertLeft)\n      bm.$insertRight = true;\n    this.marks[bm.id] = bm;\n    return bm;\n  };\n  this.moveH = function(increment, unit) {\n    if (unit == 'char') {\n      var sel = this.ace.selection;\n      sel.clearSelection();\n      sel.moveCursorBy(0, increment);\n    }\n  };\n  this.findPosV = function(start, amaount, unit, goalColumn) {\n    if (unit == 'line') {\n      var screenPos = this.ace.session.documentToScreenPosition(start.line, start.ch);\n      if (goalColumn != null)\n        screenPos.column = goalColumn;\n      screenPos.row += amaount;\n      screenPos.row = Math.min(Math.max(0, screenPos.row), this.ace.session.getScreenLength() - 1);\n      var pos = this.ace.session.screenToDocumentPosition(screenPos.row, screenPos.column);\n      return toCmPos(pos);\n    } else {\n      debugger;\n    }\n  };\n  this.charCoords = function(pos, mode) {\n    if (mode == 'div' || !mode) {\n      var sc = this.ace.session.documentToScreenPosition(pos.line, pos.ch);\n      return {left: sc.column, top: sc.row};\n    }if (mode == 'local') {\n      var renderer = this.ace.renderer;\n      var sc = this.ace.session.documentToScreenPosition(pos.line, pos.ch);\n      var lh = renderer.layerConfig.lineHeight;\n      var cw = renderer.layerConfig.characterWidth;\n      var top = lh * sc.row;\n      return {left: sc.column * cw, top: top, bottom: top + lh};\n    }\n  };\n  this.coordsChar = function(pos, mode) {\n    var renderer = this.ace.renderer;\n    if (mode == 'local') {\n      var row = Math.max(0, Math.floor(pos.top / renderer.lineHeight));\n      var col = Math.max(0, Math.floor(pos.left / renderer.characterWidth));\n      var ch = renderer.session.screenToDocumentPosition(row, col);\n      return toCmPos(ch);\n    } else if (mode == 'div') {\n      throw \"not implemented\";\n    }\n  };\n  this.openDialog = function() { \n    debugger\n  };\n  this.getSearchCursor = function(query, pos, caseFold) {\n    var caseSensitive = false;\n    var isRegexp = false;\n    if (query instanceof RegExp && !query.global) {\n      caseSensitive = !query.ignoreCase;\n      query = query.source;\n      isRegexp = true;\n    }\n    var search = new Search();\n    if (pos.ch == undefined) pos.ch = Number.MAX_VALUE;\n    var acePos = {row: pos.line, column: pos.ch};\n    var cm = this;\n    var last = null;\n    return {\n      findNext: function() { return this.find(false) },\n      findPrevious: function() {return this.find(true) },\n      find: function(back) {\n        search.setOptions({\n          needle: query,\n          caseSensitive: caseSensitive,\n          wrap: false,\n          backwards: back,\n          regExp: isRegexp,\n          start: last || acePos\n        });\n        var range = search.find(cm.ace.session);\n        if (range && range.isEmpty()) {\n          if (cm.getLine(range.start.row).length == range.start.column) {\n            search.$options.start = range;\n            range = search.find(cm.ace.session);\n          }\n        }\n        last = range;\n        return last;\n      },\n      from: function() { return last && toCmPos(last.start) },\n      to: function() { return last && toCmPos(last.end) },\n      replace: function(text) {\n        if (last) {\n          last.end = cm.ace.session.doc.replace(last, text);\n        }\n      }\n    };\n  };\n  this.scrollTo = function(x, y) {\n    var renderer = this.ace.renderer;\n    var config = renderer.layerConfig;\n    var maxHeight = config.maxHeight;\n    maxHeight -= (renderer.$size.scrollerHeight - renderer.lineHeight) * renderer.$scrollPastEnd;\n    if (y != null) this.ace.session.setScrollTop(Math.max(0, Math.min(y, maxHeight)));\n    if (x != null) this.ace.session.setScrollLeft(Math.max(0, Math.min(x, config.width)));\n  };\n  this.scrollInfo = function() { return 0; };\n  this.scrollIntoView = function(pos, margin) {\n    if (pos)\n      this.ace.renderer.scrollCursorIntoView(toAcePos(pos), null, margin);\n  };\n  this.getLine = function(row) { return this.ace.session.getLine(row) };\n  this.getRange = function(s, e) {\n    return this.ace.session.getTextRange(new Range(s.line, s.ch, e.line, e.ch));\n  };\n  this.replaceRange = function(text, s, e) {\n    if (!e) e = s;\n    return this.ace.session.replace(new Range(s.line, s.ch, e.line, e.ch), text);\n  };\n  this.replaceSelections = function(p) {\n    var sel = this.ace.selection;\n    if (this.ace.inVirtualSelectionMode) {\n      this.ace.session.replace(sel.getRange(), p[0] || \"\");\n      return;\n    }\n    sel.inVirtualSelectionMode = true;\n    var ranges = sel.rangeList.ranges;\n    if (!ranges.length) ranges = [this.ace.multiSelect.getRange()];\n    for (var i = ranges.length; i--;)\n       this.ace.session.replace(ranges[i], p[i] || \"\");\n    sel.inVirtualSelectionMode = false;\n  };\n  this.getSelection = function() {\n    return this.ace.getSelectedText();\n  };\n  this.getSelections = function() {\n    return this.listSelections().map(function(x) {\n      return this.getRange(x.anchor, x.head);\n    }, this);\n  };\n  this.getInputField = function() {\n    return this.ace.textInput.getElement();\n  };\n  this.getWrapperElement = function() {\n    return this.ace.containter;\n  };\n  var optMap = {\n    indentWithTabs: \"useSoftTabs\",\n    indentUnit: \"tabSize\",\n    firstLineNumber: \"firstLineNumber\"\n  };\n  this.setOption = function(name, val) {\n    this.state[name] = val;\n    switch (name) {\n      case 'indentWithTabs':\n        name = optMap[name];\n        val = !val;\n      break;\n      default:\n        name = optMap[name];\n    }\n    if (name)\n      this.ace.setOption(name, val);\n  };\n  this.getOption = function(name, val) {\n    var aceOpt = optMap[name];\n    if (aceOpt)\n      val = this.ace.getOption(aceOpt);\n    switch (name) {\n      case 'indentWithTabs':\n        name = optMap[name];\n        return !val;\n    }\n    return aceOpt ? val : this.state[name];\n  };\n  this.toggleOverwrite = function(on) {\n    this.state.overwrite = on;\n    return this.ace.setOverwrite(on);\n  };\n  this.addOverlay = function(o) {\n    if (!this.$searchHighlight || !this.$searchHighlight.session) {\n      var highlight = new SearchHighlight(null, \"ace_highlight-marker\", \"text\");\n      var marker = this.ace.session.addDynamicMarker(highlight);\n      highlight.id = marker.id;\n      highlight.session = this.ace.session;\n      highlight.destroy = function(o) {\n        highlight.session.off(\"change\", highlight.updateOnChange);\n        highlight.session.off(\"changeEditor\", highlight.destroy);\n        highlight.session.removeMarker(highlight.id);\n        highlight.session = null;\n      };\n      highlight.updateOnChange = function(delta) {\n        delta = delta.data.range;// v1.2 api compatibility\n        var row = delta.start.row;\n        if (row == delta.end.row) highlight.cache[row] = undefined;\n        else highlight.cache.splice(row, highlight.cache.length);\n      }\n      highlight.session.on(\"changeEditor\", highlight.destroy);\n      highlight.session.on(\"change\", highlight.updateOnChange);\n    }\n    var re = new RegExp(o.query.source, \"gmi\");\n    console.log(re)\n    this.$searchHighlight = o.highlight = highlight;\n    this.$searchHighlight.setRegexp(re);\n    this.ace.renderer.updateBackMarkers();\n  };\n  this.removeOverlay = function(o) {\n    if (this.$searchHighlight && this.$searchHighlight.session) {\n      this.$searchHighlight.destroy();\n    }\n  };\n  this.getScrollInfo = function() {\n    var renderer = this.ace.renderer;\n    var config = renderer.layerConfig;\n    return {\n      left: renderer.scrollLeft,\n      top: renderer.scrollTop,\n      height: config.maxHeight,\n      width: config.width,\n      clientHeight: config.height,\n      clientWidth: config.width\n    };\n  };\n  this.getValue = function() {\n    return this.ace.getValue();\n  };\n  this.setValue = function(v) {\n    return this.ace.setValue(v);\n  };\n  this.getTokenTypeAt = function(pos) {\n    var token = this.ace.session.getTokenAt(pos.line, pos.ch);\n    return token && /comment|string/.test(token.type) ? \"string\" : \"\";\n  };\n  this.findMatchingBracket = function(pos) {\n    var m = this.ace.session.findMatchingBracket(toAcePos(pos));\n    return {to: m && toCmPos(m)};\n  };\n  this.indentLine = function(line, method) {\n    if (method === true)\n        this.ace.session.indentRows(line, line, \"\\t\");\n    else if (method === false)\n        this.ace.session.outdentRows(new Range(line, 0, line, 0));\n  };\n  this.indexFromPos = function(pos) {\n    return this.ace.session.doc.positionToIndex(toAcePos(pos));\n  };\n  this.posFromIndex = function(index) {\n    return toCmPos(this.ace.session.doc.indexToPosition(index));\n  };\n  this.focus = function(index) {\n    return this.ace.focus();\n  };\n  this.blur = function(index) {\n    return this.ace.blur();\n  };\n  this.defaultTextHeight = function(index) {\n    return this.ace.renderer.layerConfig.lineHeight;\n  };\n  this.scanForBracket = function(pos, dir, _, options) {\n    var re = options.bracketRegex.source;\n    if (dir == 1) {\n      var m = this.ace.session.$findClosingBracket(re.slice(1, 2), toAcePos(pos), /paren|text/);\n    } else {\n      var m = this.ace.session.$findOpeningBracket(re.slice(-2, -1), {row: pos.line, column: pos.ch + 1}, /paren|text/);\n    }\n    return m && {pos: toCmPos(m)};\n  };\n  this.refresh = function() {\n    return this.ace.resize(true);\n  };\n}).call(CodeMirror.prototype);\n  function toAcePos(cmPos) {\n    return {row: cmPos.line, column: cmPos.ch};\n  }\n  function toCmPos(acePos) {\n    return new Pos(acePos.row, acePos.column);\n  }\n\n  var StringStream = CodeMirror.StringStream = function(string, tabSize) {\n    this.pos = this.start = 0;\n    this.string = string;\n    this.tabSize = tabSize || 8;\n    this.lastColumnPos = this.lastColumnValue = 0;\n    this.lineStart = 0;\n  };\n\n  StringStream.prototype = {\n    eol: function() {return this.pos >= this.string.length;},\n    sol: function() {return this.pos == this.lineStart;},\n    peek: function() {return this.string.charAt(this.pos) || undefined;},\n    next: function() {\n      if (this.pos < this.string.length)\n        return this.string.charAt(this.pos++);\n    },\n    eat: function(match) {\n      var ch = this.string.charAt(this.pos);\n      if (typeof match == \"string\") var ok = ch == match;\n      else var ok = ch && (match.test ? match.test(ch) : match(ch));\n      if (ok) {++this.pos; return ch;}\n    },\n    eatWhile: function(match) {\n      var start = this.pos;\n      while (this.eat(match)){}\n      return this.pos > start;\n    },\n    eatSpace: function() {\n      var start = this.pos;\n      while (/[\\s\\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos;\n      return this.pos > start;\n    },\n    skipToEnd: function() {this.pos = this.string.length;},\n    skipTo: function(ch) {\n      var found = this.string.indexOf(ch, this.pos);\n      if (found > -1) {this.pos = found; return true;}\n    },\n    backUp: function(n) {this.pos -= n;},\n    column: function() {\n      throw \"not implemented\";\n    },\n    indentation: function() {\n      throw \"not implemented\";\n    },\n    match: function(pattern, consume, caseInsensitive) {\n      if (typeof pattern == \"string\") {\n        var cased = function(str) {return caseInsensitive ? str.toLowerCase() : str;};\n        var substr = this.string.substr(this.pos, pattern.length);\n        if (cased(substr) == cased(pattern)) {\n          if (consume !== false) this.pos += pattern.length;\n          return true;\n        }\n      } else {\n        var match = this.string.slice(this.pos).match(pattern);\n        if (match && match.index > 0) return null;\n        if (match && consume !== false) this.pos += match[0].length;\n        return match;\n      }\n    },\n    current: function(){return this.string.slice(this.start, this.pos);},\n    hideFirstChars: function(n, inner) {\n      this.lineStart += n;\n      try { return inner(); }\n      finally { this.lineStart -= n; }\n    }\n  };\nCodeMirror.defineExtension = function(name, fn) {\n  CodeMirror.prototype[name] = fn;\n};\ndom.importCssString(\".normal-mode .ace_cursor{\\\n  border: 0!important;\\\n  background-color: red;\\\n  opacity: 0.5;\\\n}.ace_dialog {\\\n  position: absolute;\\\n  left: 0; right: 0;\\\n  background: white;\\\n  z-index: 15;\\\n  padding: .1em .8em;\\\n  overflow: hidden;\\\n  color: #333;\\\n}\\\n.ace_dialog-top {\\\n  border-bottom: 1px solid #eee;\\\n  top: 0;\\\n}\\\n.ace_dialog-bottom {\\\n  border-top: 1px solid #eee;\\\n  bottom: 0;\\\n}\\\n.ace_dialog input {\\\n  border: none;\\\n  outline: none;\\\n  background: transparent;\\\n  width: 20em;\\\n  color: inherit;\\\n  font-family: monospace;\\\n}\", \"vimMode\");\n(function() {\n  function dialogDiv(cm, template, bottom) {\n    var wrap = cm.ace.container;\n    var dialog;\n    dialog = wrap.appendChild(document.createElement(\"div\"));\n    if (bottom)\n      dialog.className = \"ace_dialog ace_dialog-bottom\";\n    else\n      dialog.className = \"ace_dialog ace_dialog-top\";\n\n    if (typeof template == \"string\") {\n      dialog.innerHTML = template;\n    } else { // Assuming it's a detached DOM element.\n      dialog.appendChild(template);\n    }\n    return dialog;\n  }\n\n  function closeNotification(cm, newVal) {\n    if (cm.state.currentNotificationClose)\n      cm.state.currentNotificationClose();\n    cm.state.currentNotificationClose = newVal;\n  }\n\n  CodeMirror.defineExtension(\"openDialog\", function(template, callback, options) {\n    if (this.virtualSelectionMode()) return;\n    if (!options) options = {};\n\n    closeNotification(this, null);\n\n    var dialog = dialogDiv(this, template, options.bottom);\n    var closed = false, me = this;\n    function close(newVal) {\n      if (typeof newVal == 'string') {\n        inp.value = newVal;\n      } else {\n        if (closed) return;\n        closed = true;\n        dialog.parentNode.removeChild(dialog);\n        me.focus();\n\n        if (options.onClose) options.onClose(dialog);\n      }\n    }\n\n    var inp = dialog.getElementsByTagName(\"input\")[0], button;\n    if (inp) {\n      if (options.value) {\n        inp.value = options.value;\n        inp.select();\n      }\n\n      if (options.onInput)\n        CodeMirror.on(inp, \"input\", function(e) { options.onInput(e, inp.value, close);});\n      if (options.onKeyUp)\n        CodeMirror.on(inp, \"keyup\", function(e) {options.onKeyUp(e, inp.value, close);});\n\n      CodeMirror.on(inp, \"keydown\", function(e) {\n        if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; }\n        if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) {\n          inp.blur();\n          CodeMirror.e_stop(e);\n          close();\n        }\n        if (e.keyCode == 13) callback(inp.value);\n      });\n\n      if (options.closeOnBlur !== false) CodeMirror.on(inp, \"blur\", close);\n\n      inp.focus();\n    } else if (button = dialog.getElementsByTagName(\"button\")[0]) {\n      CodeMirror.on(button, \"click\", function() {\n        close();\n        me.focus();\n      });\n\n      if (options.closeOnBlur !== false) CodeMirror.on(button, \"blur\", close);\n\n      button.focus();\n    }\n    return close;\n  });\n\n  CodeMirror.defineExtension(\"openNotification\", function(template, options) {\n    if (this.virtualSelectionMode()) return;\n    closeNotification(this, close);\n    var dialog = dialogDiv(this, template, options && options.bottom);\n    var closed = false, doneTimer;\n    var duration = options && typeof options.duration !== \"undefined\" ? options.duration : 5000;\n\n    function close() {\n      if (closed) return;\n      closed = true;\n      clearTimeout(doneTimer);\n      dialog.parentNode.removeChild(dialog);\n    }\n\n    CodeMirror.on(dialog, 'click', function(e) {\n      CodeMirror.e_preventDefault(e);\n      close();\n    });\n\n    if (duration)\n      doneTimer = setTimeout(close, duration);\n\n    return close;\n  });\n})();\n\n  \n  var defaultKeymap = [\n    { keys: '<Left>', type: 'keyToKey', toKeys: 'h' },\n    { keys: '<Right>', type: 'keyToKey', toKeys: 'l' },\n    { keys: '<Up>', type: 'keyToKey', toKeys: 'k' },\n    { keys: '<Down>', type: 'keyToKey', toKeys: 'j' },\n    { keys: '<Space>', type: 'keyToKey', toKeys: 'l' },\n    { keys: '<BS>', type: 'keyToKey', toKeys: 'h' },\n    { keys: '<C-Space>', type: 'keyToKey', toKeys: 'W' },\n    { keys: '<C-BS>', type: 'keyToKey', toKeys: 'B' },\n    { keys: '<S-Space>', type: 'keyToKey', toKeys: 'w' },\n    { keys: '<S-BS>', type: 'keyToKey', toKeys: 'b' },\n    { keys: '<C-n>', type: 'keyToKey', toKeys: 'j' },\n    { keys: '<C-p>', type: 'keyToKey', toKeys: 'k' },\n    { keys: '<C-[>', type: 'keyToKey', toKeys: '<Esc>' },\n    { keys: '<C-c>', type: 'keyToKey', toKeys: '<Esc>' },\n    { keys: '<C-[>', type: 'keyToKey', toKeys: '<Esc>', context: 'insert' },\n    { keys: '<C-c>', type: 'keyToKey', toKeys: '<Esc>', context: 'insert' },\n    { keys: 's', type: 'keyToKey', toKeys: 'cl', context: 'normal' },\n    { keys: 's', type: 'keyToKey', toKeys: 'xi', context: 'visual'},\n    { keys: 'S', type: 'keyToKey', toKeys: 'cc', context: 'normal' },\n    { keys: 'S', type: 'keyToKey', toKeys: 'dcc', context: 'visual' },\n    { keys: '<Home>', type: 'keyToKey', toKeys: '0' },\n    { keys: '<End>', type: 'keyToKey', toKeys: '$' },\n    { keys: '<PageUp>', type: 'keyToKey', toKeys: '<C-b>' },\n    { keys: '<PageDown>', type: 'keyToKey', toKeys: '<C-f>' },\n    { keys: '<CR>', type: 'keyToKey', toKeys: 'j^', context: 'normal' },\n    { keys: 'H', type: 'motion', motion: 'moveToTopLine', motionArgs: { linewise: true, toJumplist: true }},\n    { keys: 'M', type: 'motion', motion: 'moveToMiddleLine', motionArgs: { linewise: true, toJumplist: true }},\n    { keys: 'L', type: 'motion', motion: 'moveToBottomLine', motionArgs: { linewise: true, toJumplist: true }},\n    { keys: 'h', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: false }},\n    { keys: 'l', type: 'motion', motion: 'moveByCharacters', motionArgs: { forward: true }},\n    { keys: 'j', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, linewise: true }},\n    { keys: 'k', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, linewise: true }},\n    { keys: 'gj', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: true }},\n    { keys: 'gk', type: 'motion', motion: 'moveByDisplayLines', motionArgs: { forward: false }},\n    { keys: 'w', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false }},\n    { keys: 'W', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: false, bigWord: true }},\n    { keys: 'e', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, inclusive: true }},\n    { keys: 'E', type: 'motion', motion: 'moveByWords', motionArgs: { forward: true, wordEnd: true, bigWord: true, inclusive: true }},\n    { keys: 'b', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false }},\n    { keys: 'B', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false, bigWord: true }},\n    { keys: 'ge', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, inclusive: true }},\n    { keys: 'gE', type: 'motion', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: true, bigWord: true, inclusive: true }},\n    { keys: '{', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: false, toJumplist: true }},\n    { keys: '}', type: 'motion', motion: 'moveByParagraph', motionArgs: { forward: true, toJumplist: true }},\n    { keys: '<C-f>', type: 'motion', motion: 'moveByPage', motionArgs: { forward: true }},\n    { keys: '<C-b>', type: 'motion', motion: 'moveByPage', motionArgs: { forward: false }},\n    { keys: '<C-d>', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: true, explicitRepeat: true }},\n    { keys: '<C-u>', type: 'motion', motion: 'moveByScroll', motionArgs: { forward: false, explicitRepeat: true }},\n    { keys: 'gg', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: false, explicitRepeat: true, linewise: true, toJumplist: true }},\n    { keys: 'G', type: 'motion', motion: 'moveToLineOrEdgeOfDocument', motionArgs: { forward: true, explicitRepeat: true, linewise: true, toJumplist: true }},\n    { keys: '0', type: 'motion', motion: 'moveToStartOfLine' },\n    { keys: '^', type: 'motion', motion: 'moveToFirstNonWhiteSpaceCharacter' },\n    { keys: '+', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar:true }},\n    { keys: '-', type: 'motion', motion: 'moveByLines', motionArgs: { forward: false, toFirstChar:true }},\n    { keys: '_', type: 'motion', motion: 'moveByLines', motionArgs: { forward: true, toFirstChar:true, repeatOffset:-1 }},\n    { keys: '$', type: 'motion', motion: 'moveToEol', motionArgs: { inclusive: true }},\n    { keys: '%', type: 'motion', motion: 'moveToMatchedSymbol', motionArgs: { inclusive: true, toJumplist: true }},\n    { keys: 'f<character>', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: true , inclusive: true }},\n    { keys: 'F<character>', type: 'motion', motion: 'moveToCharacter', motionArgs: { forward: false }},\n    { keys: 't<character>', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: true, inclusive: true }},\n    { keys: 'T<character>', type: 'motion', motion: 'moveTillCharacter', motionArgs: { forward: false }},\n    { keys: ';', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: true }},\n    { keys: ',', type: 'motion', motion: 'repeatLastCharacterSearch', motionArgs: { forward: false }},\n    { keys: '\\'<character>', type: 'motion', motion: 'goToMark', motionArgs: {toJumplist: true, linewise: true}},\n    { keys: '`<character>', type: 'motion', motion: 'goToMark', motionArgs: {toJumplist: true}},\n    { keys: ']`', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true } },\n    { keys: '[`', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false } },\n    { keys: ']\\'', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: true, linewise: true } },\n    { keys: '[\\'', type: 'motion', motion: 'jumpToMark', motionArgs: { forward: false, linewise: true } },\n    { keys: ']p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true, matchIndent: true}},\n    { keys: '[p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true, matchIndent: true}},\n    { keys: ']<character>', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: true, toJumplist: true}},\n    { keys: '[<character>', type: 'motion', motion: 'moveToSymbol', motionArgs: { forward: false, toJumplist: true}},\n    { keys: '|', type: 'motion', motion: 'moveToColumn'},\n    { keys: 'o', type: 'motion', motion: 'moveToOtherHighlightedEnd', context:'visual'},\n    { keys: 'O', type: 'motion', motion: 'moveToOtherHighlightedEnd', motionArgs: {sameLine: true}, context:'visual'},\n    { keys: 'd', type: 'operator', operator: 'delete' },\n    { keys: 'y', type: 'operator', operator: 'yank' },\n    { keys: 'c', type: 'operator', operator: 'change' },\n    { keys: '>', type: 'operator', operator: 'indent', operatorArgs: { indentRight: true }},\n    { keys: '<', type: 'operator', operator: 'indent', operatorArgs: { indentRight: false }},\n    { keys: 'g~', type: 'operator', operator: 'changeCase' },\n    { keys: 'gu', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: true}, isEdit: true },\n    { keys: 'gU', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, isEdit: true },\n    { keys: 'n', type: 'motion', motion: 'findNext', motionArgs: { forward: true, toJumplist: true }},\n    { keys: 'N', type: 'motion', motion: 'findNext', motionArgs: { forward: false, toJumplist: true }},\n    { keys: 'x', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorMotionArgs: { visualLine: false }},\n    { keys: 'X', type: 'operatorMotion', operator: 'delete', motion: 'moveByCharacters', motionArgs: { forward: false }, operatorMotionArgs: { visualLine: true }},\n    { keys: 'D', type: 'operatorMotion', operator: 'delete', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'},\n    { keys: 'D', type: 'operator', operator: 'delete', operatorArgs: { linewise: true }, context: 'visual'},\n    { keys: 'Y', type: 'operatorMotion', operator: 'yank', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'},\n    { keys: 'Y', type: 'operator', operator: 'yank', operatorArgs: { linewise: true }, context: 'visual'},\n    { keys: 'C', type: 'operatorMotion', operator: 'change', motion: 'moveToEol', motionArgs: { inclusive: true }, context: 'normal'},\n    { keys: 'C', type: 'operator', operator: 'change', operatorArgs: { linewise: true }, context: 'visual'},\n    { keys: '~', type: 'operatorMotion', operator: 'changeCase', motion: 'moveByCharacters', motionArgs: { forward: true }, operatorArgs: { shouldMoveCursor: true }, context: 'normal'},\n    { keys: '~', type: 'operator', operator: 'changeCase', context: 'visual'},\n    { keys: '<C-w>', type: 'operatorMotion', operator: 'delete', motion: 'moveByWords', motionArgs: { forward: false, wordEnd: false }, context: 'insert' },\n    { keys: '<C-i>', type: 'action', action: 'jumpListWalk', actionArgs: { forward: true }},\n    { keys: '<C-o>', type: 'action', action: 'jumpListWalk', actionArgs: { forward: false }},\n    { keys: '<C-e>', type: 'action', action: 'scroll', actionArgs: { forward: true, linewise: true }},\n    { keys: '<C-y>', type: 'action', action: 'scroll', actionArgs: { forward: false, linewise: true }},\n    { keys: 'a', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'charAfter' }, context: 'normal' },\n    { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'eol' }, context: 'normal' },\n    { keys: 'A', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'endOfSelectedArea' }, context: 'visual' },\n    { keys: 'i', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'inplace' }, context: 'normal' },\n    { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'firstNonBlank'}, context: 'normal' },\n    { keys: 'I', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { insertAt: 'startOfSelectedArea' }, context: 'visual' },\n    { keys: 'o', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: true }, context: 'normal' },\n    { keys: 'O', type: 'action', action: 'newLineAndEnterInsertMode', isEdit: true, interlaceInsertRepeat: true, actionArgs: { after: false }, context: 'normal' },\n    { keys: 'v', type: 'action', action: 'toggleVisualMode' },\n    { keys: 'V', type: 'action', action: 'toggleVisualMode', actionArgs: { linewise: true }},\n    { keys: '<C-v>', type: 'action', action: 'toggleVisualMode', actionArgs: { blockwise: true }},\n    { keys: 'gv', type: 'action', action: 'reselectLastSelection' },\n    { keys: 'J', type: 'action', action: 'joinLines', isEdit: true },\n    { keys: 'p', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: true, isEdit: true }},\n    { keys: 'P', type: 'action', action: 'paste', isEdit: true, actionArgs: { after: false, isEdit: true }},\n    { keys: 'r<character>', type: 'action', action: 'replace', isEdit: true },\n    { keys: '@<character>', type: 'action', action: 'replayMacro' },\n    { keys: 'q<character>', type: 'action', action: 'enterMacroRecordMode' },\n    { keys: 'R', type: 'action', action: 'enterInsertMode', isEdit: true, actionArgs: { replace: true }},\n    { keys: 'u', type: 'action', action: 'undo', context: 'normal' },\n    { keys: 'u', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: true}, context: 'visual', isEdit: true },\n    { keys: 'U', type: 'operator', operator: 'changeCase', operatorArgs: {toLower: false}, context: 'visual', isEdit: true },\n    { keys: '<C-r>', type: 'action', action: 'redo' },\n    { keys: 'm<character>', type: 'action', action: 'setMark' },\n    { keys: '\"<character>', type: 'action', action: 'setRegister' },\n    { keys: 'zz', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' }},\n    { keys: 'z.', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'center' }, motion: 'moveToFirstNonWhiteSpaceCharacter' },\n    { keys: 'zt', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' }},\n    { keys: 'z<CR>', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'top' }, motion: 'moveToFirstNonWhiteSpaceCharacter' },\n    { keys: 'z-', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }},\n    { keys: 'zb', type: 'action', action: 'scrollToCursor', actionArgs: { position: 'bottom' }, motion: 'moveToFirstNonWhiteSpaceCharacter' },\n    { keys: '.', type: 'action', action: 'repeatLastEdit' },\n    { keys: '<C-a>', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: true, backtrack: false}},\n    { keys: '<C-x>', type: 'action', action: 'incrementNumberToken', isEdit: true, actionArgs: {increase: false, backtrack: false}},\n    { keys: 'a<character>', type: 'motion', motion: 'textObjectManipulation' },\n    { keys: 'i<character>', type: 'motion', motion: 'textObjectManipulation', motionArgs: { textObjectInner: true }},\n    { keys: '/', type: 'search', searchArgs: { forward: true, querySrc: 'prompt', toJumplist: true }},\n    { keys: '?', type: 'search', searchArgs: { forward: false, querySrc: 'prompt', toJumplist: true }},\n    { keys: '*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }},\n    { keys: '#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', wholeWordOnly: true, toJumplist: true }},\n    { keys: 'g*', type: 'search', searchArgs: { forward: true, querySrc: 'wordUnderCursor', toJumplist: true }},\n    { keys: 'g#', type: 'search', searchArgs: { forward: false, querySrc: 'wordUnderCursor', toJumplist: true }},\n    { keys: ':', type: 'ex' }\n  ];\n\n  var Pos = CodeMirror.Pos;\n\n  var modifierCodes = [16, 17, 18, 91];\n  var specialKey = {Enter:'CR',Backspace:'BS',Delete:'Del'};\n  var mac = /Mac/.test(navigator.platform);\n  var Vim = function() { return vimApi; } //{\n    function lookupKey(e) {\n      var keyCode = e.keyCode;\n      if (modifierCodes.indexOf(keyCode) != -1) { return; }\n      var hasModifier = e.ctrlKey || e.metaKey;\n      var key = CodeMirror.keyNames[keyCode];\n      key = specialKey[key] || key;\n      var name = '';\n      if (e.ctrlKey) { name += 'C-'; }\n      if (e.altKey) { name += 'A-'; }\n      if (mac && e.metaKey || (!hasModifier && e.shiftKey) && key.length < 2) {\n        return;\n      } else if (e.shiftKey && !/^[A-Za-z]$/.test(key)) {\n        name += 'S-';\n      }\n      if (key.length == 1) { key = key.toLowerCase(); }\n      name += key;\n      if (name.length > 1) { name = '<' + name + '>'; }\n      return name;\n    }\n    function handleKeyDown(cm, e) {\n      var name = lookupKey(e);\n      if (!name) { return; }\n\n      CodeMirror.signal(cm, 'vim-keypress', name);\n      if (CodeMirror.Vim.handleKey(cm, name, 'user')) {\n        CodeMirror.e_stop(e);\n      }\n    }\n    function handleKeyPress(cm, e) {\n      var code = e.charCode || e.keyCode;\n      if (e.ctrlKey || e.metaKey || e.altKey ||\n          e.shiftKey && code < 32) { return; }\n      var name = String.fromCharCode(code);\n\n      CodeMirror.signal(cm, 'vim-keypress', name);\n      if (CodeMirror.Vim.handleKey(cm, name, 'user')) {\n        CodeMirror.e_stop(e);\n      }\n    }\n\n    function enterVimMode(cm) {\n      cm.setOption('disableInput', true);\n      cm.setOption('showCursorWhenSelecting', false);\n      CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"normal\"});\n      cm.on('cursorActivity', onCursorActivity);\n      maybeInitVimState(cm);\n      CodeMirror.on(cm.getInputField(), 'paste', getOnPasteFn(cm));\n      cm.on('keypress', handleKeyPress);\n      cm.on('keydown', handleKeyDown);\n    }\n\n    function leaveVimMode(cm) {\n      cm.setOption('disableInput', false);\n      cm.off('cursorActivity', onCursorActivity);\n      CodeMirror.off(cm.getInputField(), 'paste', getOnPasteFn(cm));\n      cm.state.vim = null;\n      cm.off('keypress', handleKeyPress);\n      cm.off('keydown', handleKeyDown);\n    }\n\n    function detachVimMap(cm, next) {\n      if (this == CodeMirror.keyMap.vim)\n        CodeMirror.rmClass(cm.getWrapperElement(), \"cm-fat-cursor\");\n\n      if (!next || next.attach != attachVimMap)\n        leaveVimMode(cm, false);\n    }\n    function attachVimMap(cm, prev) {\n      if (this == CodeMirror.keyMap.vim)\n        CodeMirror.addClass(cm.getWrapperElement(), \"cm-fat-cursor\");\n\n      if (!prev || prev.attach != attachVimMap)\n        enterVimMode(cm);\n    }\n    CodeMirror.defineOption('vimMode', false, function(cm, val, prev) {\n      if (val && cm.getOption(\"keyMap\") != \"vim\")\n        cm.setOption(\"keyMap\", \"vim\");\n      else if (!val && prev != CodeMirror.Init && /^vim/.test(cm.getOption(\"keyMap\")))\n        cm.setOption(\"keyMap\", \"default\");\n    });\n    function getOnPasteFn(cm) {\n      var vim = cm.state.vim;\n      if (!vim.onPasteFn) {\n        vim.onPasteFn = function() {\n          if (!vim.insertMode) {\n            cm.setCursor(offsetCursor(cm.getCursor(), 0, 1));\n            actions.enterInsertMode(cm, {}, vim);\n          }\n        };\n      }\n      return vim.onPasteFn;\n    }\n\n    var numberRegex = /[\\d]/;\n    var wordRegexp = [(/\\w/), (/[^\\w\\s]/)], bigWordRegexp = [(/\\S/)];\n    function makeKeyRange(start, size) {\n      var keys = [];\n      for (var i = start; i < start + size; i++) {\n        keys.push(String.fromCharCode(i));\n      }\n      return keys;\n    }\n    var upperCaseAlphabet = makeKeyRange(65, 26);\n    var lowerCaseAlphabet = makeKeyRange(97, 26);\n    var numbers = makeKeyRange(48, 10);\n    var validMarks = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['<', '>']);\n    var validRegisters = [].concat(upperCaseAlphabet, lowerCaseAlphabet, numbers, ['-', '\"', '.', ':', '/']);\n\n    function isLine(cm, line) {\n      return line >= cm.firstLine() && line <= cm.lastLine();\n    }\n    function isLowerCase(k) {\n      return (/^[a-z]$/).test(k);\n    }\n    function isMatchableSymbol(k) {\n      return '()[]{}'.indexOf(k) != -1;\n    }\n    function isNumber(k) {\n      return numberRegex.test(k);\n    }\n    function isUpperCase(k) {\n      return (/^[A-Z]$/).test(k);\n    }\n    function isWhiteSpaceString(k) {\n      return (/^\\s*$/).test(k);\n    }\n    function inArray(val, arr) {\n      for (var i = 0; i < arr.length; i++) {\n        if (arr[i] == val) {\n          return true;\n        }\n      }\n      return false;\n    }\n\n    var options = {};\n    function defineOption(name, defaultValue, type) {\n      if (defaultValue === undefined) { throw Error('defaultValue is required'); }\n      if (!type) { type = 'string'; }\n      var opt = name;\n      if (typeof name == \"string\")\n        opt = {\n          type: type,\n          defaultValue: defaultValue\n        };\n      else\n        name = opt.name;\n      options[name] = opt;\n      setOption(name, defaultValue);\n    }\n\n    function setOption(name, value, cm) {\n      var option = options[name];\n      if (!option) {\n        throw Error('Unknown option: ' + name);\n      }\n      if (option.type == 'boolean') {\n        if (value && value !== true) {\n          throw Error('Invalid argument: ' + name + '=' + value);\n        } else if (value !== false) {\n          value = true;\n        }\n      }\n      option.value = value;\n      if (option.set) option.set(value, cm);\n    }\n\n    function getOption(name) {\n      var option = options[name];\n      if (!option) {\n        throw Error('Unknown option: ' + name);\n      }\n      return option.value;\n    }\n\n    var createCircularJumpList = function() {\n      var size = 100;\n      var pointer = -1;\n      var head = 0;\n      var tail = 0;\n      var buffer = new Array(size);\n      function add(cm, oldCur, newCur) {\n        var current = pointer % size;\n        var curMark = buffer[current];\n        function useNextSlot(cursor) {\n          var next = ++pointer % size;\n          var trashMark = buffer[next];\n          if (trashMark) {\n            trashMark.clear();\n          }\n          buffer[next] = cm.setBookmark(cursor);\n        }\n        if (curMark) {\n          var markPos = curMark.find();\n          if (markPos && !cursorEqual(markPos, oldCur)) {\n            useNextSlot(oldCur);\n          }\n        } else {\n          useNextSlot(oldCur);\n        }\n        useNextSlot(newCur);\n        head = pointer;\n        tail = pointer - size + 1;\n        if (tail < 0) {\n          tail = 0;\n        }\n      }\n      function move(cm, offset) {\n        pointer += offset;\n        if (pointer > head) {\n          pointer = head;\n        } else if (pointer < tail) {\n          pointer = tail;\n        }\n        var mark = buffer[(size + pointer) % size];\n        if (mark && !mark.find()) {\n          var inc = offset > 0 ? 1 : -1;\n          var newCur;\n          var oldCur = cm.getCursor();\n          do {\n            pointer += inc;\n            mark = buffer[(size + pointer) % size];\n            if (mark &&\n                (newCur = mark.find()) &&\n                !cursorEqual(oldCur, newCur)) {\n              break;\n            }\n          } while (pointer < head && pointer > tail);\n        }\n        return mark;\n      }\n      return {\n        cachedCursor: undefined, //used for # and * jumps\n        add: add,\n        move: move\n      };\n    };\n    var createInsertModeChanges = function(c) {\n      if (c) {\n        return {\n          changes: c.changes,\n          expectCursorActivityForChange: c.expectCursorActivityForChange\n        };\n      }\n      return {\n        changes: [],\n        expectCursorActivityForChange: false\n      };\n    };\n\n    function MacroModeState() {\n      this.latestRegister = undefined;\n      this.isPlaying = false;\n      this.isRecording = false;\n      this.replaySearchQueries = [];\n      this.onRecordingDone = undefined;\n      this.lastInsertModeChanges = createInsertModeChanges();\n    }\n    MacroModeState.prototype = {\n      exitMacroRecordMode: function() {\n        var macroModeState = vimGlobalState.macroModeState;\n        if (macroModeState.onRecordingDone) {\n          macroModeState.onRecordingDone(); // close dialog\n        }\n        macroModeState.onRecordingDone = undefined;\n        macroModeState.isRecording = false;\n      },\n      enterMacroRecordMode: function(cm, registerName) {\n        var register =\n            vimGlobalState.registerController.getRegister(registerName);\n        if (register) {\n          register.clear();\n          this.latestRegister = registerName;\n          if (cm.openDialog) {\n            this.onRecordingDone = cm.openDialog(\n                '(recording)['+registerName+']', null, {bottom:true});\n          }\n          this.isRecording = true;\n        }\n      }\n    };\n\n    function maybeInitVimState(cm) {\n      if (!cm.state.vim) {\n        cm.state.vim = {\n          inputState: new InputState(),\n          lastEditInputState: undefined,\n          lastEditActionCommand: undefined,\n          lastHPos: -1,\n          lastHSPos: -1,\n          lastMotion: null,\n          marks: {},\n          fakeCursor: null,\n          insertMode: false,\n          insertModeRepeat: undefined,\n          visualMode: false,\n          visualLine: false,\n          visualBlock: false,\n          lastSelection: null,\n          lastPastedText: null,\n          sel: {\n          }\n        };\n      }\n      return cm.state.vim;\n    }\n    var vimGlobalState;\n    function resetVimGlobalState() {\n      vimGlobalState = {\n        searchQuery: null,\n        searchIsReversed: false,\n        lastSubstituteReplacePart: undefined,\n        jumpList: createCircularJumpList(),\n        macroModeState: new MacroModeState,\n        lastChararacterSearch: {increment:0, forward:true, selectedCharacter:''},\n        registerController: new RegisterController({}),\n        searchHistoryController: new HistoryController({}),\n        exCommandHistoryController : new HistoryController({})\n      };\n      for (var optionName in options) {\n        var option = options[optionName];\n        option.value = option.defaultValue;\n      }\n    }\n\n    var lastInsertModeKeyTimer;\n    var vimApi= {\n      buildKeyMap: function() {\n      },\n      getRegisterController: function() {\n        return vimGlobalState.registerController;\n      },\n      resetVimGlobalState_: resetVimGlobalState,\n      getVimGlobalState_: function() {\n        return vimGlobalState;\n      },\n      maybeInitVimState_: maybeInitVimState,\n\n      InsertModeKey: InsertModeKey,\n      map: function(lhs, rhs, ctx) {\n        exCommandDispatcher.map(lhs, rhs, ctx);\n      },\n      unmap: function(lhs, ctx) {\n        exCommandDispatcher.unmap(lhs, ctx);\n      },\n      setOption: setOption,\n      getOption: getOption,\n      defineOption: defineOption,\n      defineEx: function(name, prefix, func){\n        if (name.indexOf(prefix) !== 0) {\n          throw new Error('(Vim.defineEx) \"'+prefix+'\" is not a prefix of \"'+name+'\", command not registered');\n        }\n        exCommands[name]=func;\n        exCommandDispatcher.commandMap_[prefix]={name:name, shortName:prefix, type:'api'};\n      },\n      handleKey: function(cm, key, origin) {\n        var vim = maybeInitVimState(cm);\n        function handleMacroRecording() {\n          var macroModeState = vimGlobalState.macroModeState;\n          if (macroModeState.isRecording) {\n            if (key == 'q') {\n              macroModeState.exitMacroRecordMode();\n              clearInputState(cm);\n              return true;\n            }\n            if (origin != 'mapping') {\n              logKey(macroModeState, key);\n            }\n          }\n        }\n        function handleEsc() {\n          if (key == '<Esc>') {\n            clearInputState(cm);\n            if (vim.visualMode) {\n              exitVisualMode(cm);\n            } else if (vim.insertMode) {\n              exitInsertMode(cm);\n            }\n            return true;\n          }\n        }\n        function doKeyToKey(keys) {\n          var match;\n          while (keys) {\n            match = (/<\\w+-.+?>|<\\w+>|./).exec(keys);\n            key = match[0];\n            keys = keys.substring(match.index + key.length);\n            CodeMirror.Vim.handleKey(cm, key, 'mapping');\n          }\n        }\n\n        function handleKeyInsertMode() {\n          if (handleEsc()) { return true; }\n          var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key;\n          var keysAreChars = key.length == 1;\n          var match = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert');\n          while (keys.length > 1 && match.type != 'full') {\n            var keys = vim.inputState.keyBuffer = keys.slice(1);\n            var thisMatch = commandDispatcher.matchCommand(keys, defaultKeymap, vim.inputState, 'insert');\n            if (thisMatch.type != 'none') { match = thisMatch; }\n          }\n          if (match.type == 'none') { clearInputState(cm); return false; }\n          else if (match.type == 'partial') {\n            if (lastInsertModeKeyTimer) { window.clearTimeout(lastInsertModeKeyTimer); }\n            lastInsertModeKeyTimer = window.setTimeout(\n              function() { if (vim.insertMode && vim.inputState.keyBuffer) { clearInputState(cm); } },\n              getOption('insertModeEscKeysTimeout'));\n            return !keysAreChars;\n          }\n\n          if (lastInsertModeKeyTimer) { window.clearTimeout(lastInsertModeKeyTimer); }\n          if (keysAreChars) {\n            var here = cm.getCursor();\n            cm.replaceRange('', offsetCursor(here, 0, -(keys.length - 1)), here, '+input');\n          }\n          clearInputState(cm);\n          var command = match.command;\n          if (command.type == 'keyToKey') {\n            doKeyToKey(command.toKeys);\n          } else {\n            commandDispatcher.processCommand(cm, vim, command);\n          }\n          return true;\n        }\n\n        function handleKeyNonInsertMode() {\n          if (handleMacroRecording() || handleEsc()) { return true; };\n\n          var keys = vim.inputState.keyBuffer = vim.inputState.keyBuffer + key;\n          if (/^[1-9]\\d*$/.test(keys)) { return true; }\n\n          var keysMatcher = /^(\\d*)(.*)$/.exec(keys);\n          if (!keysMatcher) { clearInputState(cm); return false; }\n          var context = vim.visualMode ? 'visual' :\n                                         'normal';\n          var match = commandDispatcher.matchCommand(keysMatcher[2] || keysMatcher[1], defaultKeymap, vim.inputState, context);\n          if (match.type == 'none') { clearInputState(cm); return false; }\n          else if (match.type == 'partial') { return true; }\n\n          vim.inputState.keyBuffer = '';\n          var command = match.command;\n          var keysMatcher = /^(\\d*)(.*)$/.exec(keys);\n          if (keysMatcher[1] && keysMatcher[1] != '0') {\n            vim.inputState.pushRepeatDigit(keysMatcher[1]);\n          }\n          if (command.type == 'keyToKey') {\n            doKeyToKey(command.toKeys);\n          } else {\n            commandDispatcher.processCommand(cm, vim, command);\n          }\n          return true;\n        }\n\n        return cm.operation(function() {\n          cm.curOp.isVimOp = true;\n          try {\n            if (vim.insertMode) { return handleKeyInsertMode(); }\n            else { return handleKeyNonInsertMode(); }\n          } catch (e) {\n            cm.state.vim = undefined;\n            maybeInitVimState(cm);\n            throw e;\n          }\n        });\n      },\n      handleEx: function(cm, input) {\n        exCommandDispatcher.processCommand(cm, input);\n      }\n    };\n    function InputState() {\n      this.prefixRepeat = [];\n      this.motionRepeat = [];\n\n      this.operator = null;\n      this.operatorArgs = null;\n      this.motion = null;\n      this.motionArgs = null;\n      this.keyBuffer = []; // For matching multi-key commands.\n      this.registerName = null; // Defaults to the unnamed register.\n    }\n    InputState.prototype.pushRepeatDigit = function(n) {\n      if (!this.operator) {\n        this.prefixRepeat = this.prefixRepeat.concat(n);\n      } else {\n        this.motionRepeat = this.motionRepeat.concat(n);\n      }\n    };\n    InputState.prototype.getRepeat = function() {\n      var repeat = 0;\n      if (this.prefixRepeat.length > 0 || this.motionRepeat.length > 0) {\n        repeat = 1;\n        if (this.prefixRepeat.length > 0) {\n          repeat *= parseInt(this.prefixRepeat.join(''), 10);\n        }\n        if (this.motionRepeat.length > 0) {\n          repeat *= parseInt(this.motionRepeat.join(''), 10);\n        }\n      }\n      return repeat;\n    };\n\n    function clearInputState(cm, reason) {\n      cm.state.vim.inputState = new InputState();\n      CodeMirror.signal(cm, 'vim-command-done', reason);\n    }\n    function Register(text, linewise, blockwise) {\n      this.clear();\n      this.keyBuffer = [text || ''];\n      this.insertModeChanges = [];\n      this.searchQueries = [];\n      this.linewise = !!linewise;\n      this.blockwise = !!blockwise;\n    }\n    Register.prototype = {\n      setText: function(text, linewise, blockwise) {\n        this.keyBuffer = [text || ''];\n        this.linewise = !!linewise;\n        this.blockwise = !!blockwise;\n      },\n      pushText: function(text, linewise) {\n        if (linewise) {\n          if (!this.linewise) {\n            this.keyBuffer.push('\\n');\n          }\n          this.linewise = true;\n        }\n        this.keyBuffer.push(text);\n      },\n      pushInsertModeChanges: function(changes) {\n        this.insertModeChanges.push(createInsertModeChanges(changes));\n      },\n      pushSearchQuery: function(query) {\n        this.searchQueries.push(query);\n      },\n      clear: function() {\n        this.keyBuffer = [];\n        this.insertModeChanges = [];\n        this.searchQueries = [];\n        this.linewise = false;\n      },\n      toString: function() {\n        return this.keyBuffer.join('');\n      }\n    };\n    function RegisterController(registers) {\n      this.registers = registers;\n      this.unnamedRegister = registers['\"'] = new Register();\n      registers['.'] = new Register();\n      registers[':'] = new Register();\n      registers['/'] = new Register();\n    }\n    RegisterController.prototype = {\n      pushText: function(registerName, operator, text, linewise, blockwise) {\n        if (linewise && text.charAt(0) == '\\n') {\n          text = text.slice(1) + '\\n';\n        }\n        if (linewise && text.charAt(text.length - 1) !== '\\n'){\n          text += '\\n';\n        }\n        var register = this.isValidRegister(registerName) ?\n            this.getRegister(registerName) : null;\n        if (!register) {\n          switch (operator) {\n            case 'yank':\n              this.registers['0'] = new Register(text, linewise, blockwise);\n              break;\n            case 'delete':\n            case 'change':\n              if (text.indexOf('\\n') == -1) {\n                this.registers['-'] = new Register(text, linewise);\n              } else {\n                this.shiftNumericRegisters_();\n                this.registers['1'] = new Register(text, linewise);\n              }\n              break;\n          }\n          this.unnamedRegister.setText(text, linewise, blockwise);\n          return;\n        }\n        var append = isUpperCase(registerName);\n        if (append) {\n          register.pushText(text, linewise);\n        } else {\n          register.setText(text, linewise, blockwise);\n        }\n        this.unnamedRegister.setText(register.toString(), linewise);\n      },\n      getRegister: function(name) {\n        if (!this.isValidRegister(name)) {\n          return this.unnamedRegister;\n        }\n        name = name.toLowerCase();\n        if (!this.registers[name]) {\n          this.registers[name] = new Register();\n        }\n        return this.registers[name];\n      },\n      isValidRegister: function(name) {\n        return name && inArray(name, validRegisters);\n      },\n      shiftNumericRegisters_: function() {\n        for (var i = 9; i >= 2; i--) {\n          this.registers[i] = this.getRegister('' + (i - 1));\n        }\n      }\n    };\n    function HistoryController() {\n        this.historyBuffer = [];\n        this.iterator;\n        this.initialPrefix = null;\n    }\n    HistoryController.prototype = {\n      nextMatch: function (input, up) {\n        var historyBuffer = this.historyBuffer;\n        var dir = up ? -1 : 1;\n        if (this.initialPrefix === null) this.initialPrefix = input;\n        for (var i = this.iterator + dir; up ? i >= 0 : i < historyBuffer.length; i+= dir) {\n          var element = historyBuffer[i];\n          for (var j = 0; j <= element.length; j++) {\n            if (this.initialPrefix == element.substring(0, j)) {\n              this.iterator = i;\n              return element;\n            }\n          }\n        }\n        if (i >= historyBuffer.length) {\n          this.iterator = historyBuffer.length;\n          return this.initialPrefix;\n        }\n        if (i < 0 ) return input;\n      },\n      pushInput: function(input) {\n        var index = this.historyBuffer.indexOf(input);\n        if (index > -1) this.historyBuffer.splice(index, 1);\n        if (input.length) this.historyBuffer.push(input);\n      },\n      reset: function() {\n        this.initialPrefix = null;\n        this.iterator = this.historyBuffer.length;\n      }\n    };\n    var commandDispatcher = {\n      matchCommand: function(keys, keyMap, inputState, context) {\n        var matches = commandMatches(keys, keyMap, context, inputState);\n        if (!matches.full && !matches.partial) {\n          return {type: 'none'};\n        } else if (!matches.full && matches.partial) {\n          return {type: 'partial'};\n        }\n\n        var bestMatch;\n        for (var i = 0; i < matches.full.length; i++) {\n          var match = matches.full[i];\n          if (!bestMatch) {\n            bestMatch = match;\n          }\n        }\n        if (bestMatch.keys.slice(-11) == '<character>') {\n          inputState.selectedCharacter = lastChar(keys);\n        }\n        return {type: 'full', command: bestMatch};\n      },\n      processCommand: function(cm, vim, command) {\n        vim.inputState.repeatOverride = command.repeatOverride;\n        switch (command.type) {\n          case 'motion':\n            this.processMotion(cm, vim, command);\n            break;\n          case 'operator':\n            this.processOperator(cm, vim, command);\n            break;\n          case 'operatorMotion':\n            this.processOperatorMotion(cm, vim, command);\n            break;\n          case 'action':\n            this.processAction(cm, vim, command);\n            break;\n          case 'search':\n            this.processSearch(cm, vim, command);\n            clearInputState(cm);\n            break;\n          case 'ex':\n          case 'keyToEx':\n            this.processEx(cm, vim, command);\n            clearInputState(cm);\n            break;\n          default:\n            break;\n        }\n      },\n      processMotion: function(cm, vim, command) {\n        vim.inputState.motion = command.motion;\n        vim.inputState.motionArgs = copyArgs(command.motionArgs);\n        this.evalInput(cm, vim);\n      },\n      processOperator: function(cm, vim, command) {\n        var inputState = vim.inputState;\n        if (inputState.operator) {\n          if (inputState.operator == command.operator) {\n            inputState.motion = 'expandToLine';\n            inputState.motionArgs = { linewise: true };\n            this.evalInput(cm, vim);\n            return;\n          } else {\n            clearInputState(cm);\n          }\n        }\n        inputState.operator = command.operator;\n        inputState.operatorArgs = copyArgs(command.operatorArgs);\n        if (vim.visualMode) {\n          this.evalInput(cm, vim);\n        }\n      },\n      processOperatorMotion: function(cm, vim, command) {\n        var visualMode = vim.visualMode;\n        var operatorMotionArgs = copyArgs(command.operatorMotionArgs);\n        if (operatorMotionArgs) {\n          if (visualMode && operatorMotionArgs.visualLine) {\n            vim.visualLine = true;\n          }\n        }\n        this.processOperator(cm, vim, command);\n        if (!visualMode) {\n          this.processMotion(cm, vim, command);\n        }\n      },\n      processAction: function(cm, vim, command) {\n        var inputState = vim.inputState;\n        var repeat = inputState.getRepeat();\n        var repeatIsExplicit = !!repeat;\n        var actionArgs = copyArgs(command.actionArgs) || {};\n        if (inputState.selectedCharacter) {\n          actionArgs.selectedCharacter = inputState.selectedCharacter;\n        }\n        if (command.operator) {\n          this.processOperator(cm, vim, command);\n        }\n        if (command.motion) {\n          this.processMotion(cm, vim, command);\n        }\n        if (command.motion || command.operator) {\n          this.evalInput(cm, vim);\n        }\n        actionArgs.repeat = repeat || 1;\n        actionArgs.repeatIsExplicit = repeatIsExplicit;\n        actionArgs.registerName = inputState.registerName;\n        clearInputState(cm);\n        vim.lastMotion = null;\n        if (command.isEdit) {\n          this.recordLastEdit(vim, inputState, command);\n        }\n        actions[command.action](cm, actionArgs, vim);\n      },\n      processSearch: function(cm, vim, command) {\n        if (!cm.getSearchCursor) {\n          return;\n        }\n        var forward = command.searchArgs.forward;\n        var wholeWordOnly = command.searchArgs.wholeWordOnly;\n        getSearchState(cm).setReversed(!forward);\n        var promptPrefix = (forward) ? '/' : '?';\n        var originalQuery = getSearchState(cm).getQuery();\n        var originalScrollPos = cm.getScrollInfo();\n        function handleQuery(query, ignoreCase, smartCase) {\n          vimGlobalState.searchHistoryController.pushInput(query);\n          vimGlobalState.searchHistoryController.reset();\n          try {\n            updateSearchQuery(cm, query, ignoreCase, smartCase);\n          } catch (e) {\n            showConfirm(cm, 'Invalid regex: ' + query);\n            return;\n          }\n          commandDispatcher.processMotion(cm, vim, {\n            type: 'motion',\n            motion: 'findNext',\n            motionArgs: { forward: true, toJumplist: command.searchArgs.toJumplist }\n          });\n        }\n        function onPromptClose(query) {\n          cm.scrollTo(originalScrollPos.left, originalScrollPos.top);\n          handleQuery(query, true /** ignoreCase */, true /** smartCase */);\n          var macroModeState = vimGlobalState.macroModeState;\n          if (macroModeState.isRecording) {\n            logSearchQuery(macroModeState, query);\n          }\n        }\n        function onPromptKeyUp(e, query, close) {\n          var keyName = CodeMirror.keyName(e), up;\n          if (keyName == 'Up' || keyName == 'Down') {\n            up = keyName == 'Up' ? true : false;\n            query = vimGlobalState.searchHistoryController.nextMatch(query, up) || '';\n            close(query);\n          } else {\n            if ( keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift')\n              vimGlobalState.searchHistoryController.reset();\n          }\n          var parsedQuery;\n          try {\n            parsedQuery = updateSearchQuery(cm, query,\n                true /** ignoreCase */, true /** smartCase */);\n          } catch (e) {\n          }\n          if (parsedQuery) {\n            cm.scrollIntoView(findNext(cm, !forward, parsedQuery), 30);\n          } else {\n            clearSearchHighlight(cm);\n            cm.scrollTo(originalScrollPos.left, originalScrollPos.top);\n          }\n        }\n        function onPromptKeyDown(e, query, close) {\n          var keyName = CodeMirror.keyName(e);\n          if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[') {\n            vimGlobalState.searchHistoryController.pushInput(query);\n            vimGlobalState.searchHistoryController.reset();\n            updateSearchQuery(cm, originalQuery);\n            clearSearchHighlight(cm);\n            cm.scrollTo(originalScrollPos.left, originalScrollPos.top);\n            CodeMirror.e_stop(e);\n            close();\n            cm.focus();\n          }\n        }\n        switch (command.searchArgs.querySrc) {\n          case 'prompt':\n            var macroModeState = vimGlobalState.macroModeState;\n            if (macroModeState.isPlaying) {\n              var query = macroModeState.replaySearchQueries.shift();\n              handleQuery(query, true /** ignoreCase */, false /** smartCase */);\n            } else {\n              showPrompt(cm, {\n                  onClose: onPromptClose,\n                  prefix: promptPrefix,\n                  desc: searchPromptDesc,\n                  onKeyUp: onPromptKeyUp,\n                  onKeyDown: onPromptKeyDown\n              });\n            }\n            break;\n          case 'wordUnderCursor':\n            var word = expandWordUnderCursor(cm, false /** inclusive */,\n                true /** forward */, false /** bigWord */,\n                true /** noSymbol */);\n            var isKeyword = true;\n            if (!word) {\n              word = expandWordUnderCursor(cm, false /** inclusive */,\n                  true /** forward */, false /** bigWord */,\n                  false /** noSymbol */);\n              isKeyword = false;\n            }\n            if (!word) {\n              return;\n            }\n            var query = cm.getLine(word.start.line).substring(word.start.ch,\n                word.end.ch);\n            if (isKeyword && wholeWordOnly) {\n                query = '\\\\b' + query + '\\\\b';\n            } else {\n              query = escapeRegex(query);\n            }\n            vimGlobalState.jumpList.cachedCursor = cm.getCursor();\n            cm.setCursor(word.start);\n\n            handleQuery(query, true /** ignoreCase */, false /** smartCase */);\n            break;\n        }\n      },\n      processEx: function(cm, vim, command) {\n        function onPromptClose(input) {\n          vimGlobalState.exCommandHistoryController.pushInput(input);\n          vimGlobalState.exCommandHistoryController.reset();\n          exCommandDispatcher.processCommand(cm, input);\n        }\n        function onPromptKeyDown(e, input, close) {\n          var keyName = CodeMirror.keyName(e), up;\n          if (keyName == 'Esc' || keyName == 'Ctrl-C' || keyName == 'Ctrl-[') {\n            vimGlobalState.exCommandHistoryController.pushInput(input);\n            vimGlobalState.exCommandHistoryController.reset();\n            CodeMirror.e_stop(e);\n            close();\n            cm.focus();\n          }\n          if (keyName == 'Up' || keyName == 'Down') {\n            up = keyName == 'Up' ? true : false;\n            input = vimGlobalState.exCommandHistoryController.nextMatch(input, up) || '';\n            close(input);\n          } else {\n            if ( keyName != 'Left' && keyName != 'Right' && keyName != 'Ctrl' && keyName != 'Alt' && keyName != 'Shift')\n              vimGlobalState.exCommandHistoryController.reset();\n          }\n        }\n        if (command.type == 'keyToEx') {\n          exCommandDispatcher.processCommand(cm, command.exArgs.input);\n        } else {\n          if (vim.visualMode) {\n            showPrompt(cm, { onClose: onPromptClose, prefix: ':', value: '\\'<,\\'>',\n                onKeyDown: onPromptKeyDown});\n          } else {\n            showPrompt(cm, { onClose: onPromptClose, prefix: ':',\n                onKeyDown: onPromptKeyDown});\n          }\n        }\n      },\n      evalInput: function(cm, vim) {\n        var inputState = vim.inputState;\n        var motion = inputState.motion;\n        var motionArgs = inputState.motionArgs || {};\n        var operator = inputState.operator;\n        var operatorArgs = inputState.operatorArgs || {};\n        var registerName = inputState.registerName;\n        var sel = vim.sel;\n        var origHead = copyCursor(vim.visualMode ? sel.head: cm.getCursor('head'));\n        var origAnchor = copyCursor(vim.visualMode ? sel.anchor : cm.getCursor('anchor'));\n        var oldHead = copyCursor(origHead);\n        var oldAnchor = copyCursor(origAnchor);\n        var newHead, newAnchor;\n        var repeat;\n        if (operator) {\n          this.recordLastEdit(vim, inputState);\n        }\n        if (inputState.repeatOverride !== undefined) {\n          repeat = inputState.repeatOverride;\n        } else {\n          repeat = inputState.getRepeat();\n        }\n        if (repeat > 0 && motionArgs.explicitRepeat) {\n          motionArgs.repeatIsExplicit = true;\n        } else if (motionArgs.noRepeat ||\n            (!motionArgs.explicitRepeat && repeat === 0)) {\n          repeat = 1;\n          motionArgs.repeatIsExplicit = false;\n        }\n        if (inputState.selectedCharacter) {\n          motionArgs.selectedCharacter = operatorArgs.selectedCharacter =\n              inputState.selectedCharacter;\n        }\n        motionArgs.repeat = repeat;\n        clearInputState(cm);\n        if (motion) {\n          var motionResult = motions[motion](cm, origHead, motionArgs, vim);\n          vim.lastMotion = motions[motion];\n          if (!motionResult) {\n            return;\n          }\n          if (motionArgs.toJumplist) {\n            var jumpList = vimGlobalState.jumpList;\n            var cachedCursor = jumpList.cachedCursor;\n            if (cachedCursor) {\n              recordJumpPosition(cm, cachedCursor, motionResult);\n              delete jumpList.cachedCursor;\n            } else {\n              recordJumpPosition(cm, origHead, motionResult);\n            }\n          }\n          if (motionResult instanceof Array) {\n            newAnchor = motionResult[0];\n            newHead = motionResult[1];\n          } else {\n            newHead = motionResult;\n          }\n          if (!newHead) {\n            newHead = copyCursor(origHead);\n          }\n          if (vim.visualMode) {\n            newHead = clipCursorToContent(cm, newHead, true);\n            if (newAnchor) {\n              newAnchor = clipCursorToContent(cm, newAnchor, true);\n            }\n            newAnchor = newAnchor || oldAnchor;\n            sel.anchor = newAnchor;\n            sel.head = newHead;\n            updateCmSelection(cm);\n            updateMark(cm, vim, '<',\n                cursorIsBefore(newAnchor, newHead) ? newAnchor\n                    : newHead);\n            updateMark(cm, vim, '>',\n                cursorIsBefore(newAnchor, newHead) ? newHead\n                    : newAnchor);\n          } else if (!operator) {\n            newHead = clipCursorToContent(cm, newHead);\n            cm.setCursor(newHead.line, newHead.ch);\n          }\n        }\n        if (operator) {\n          if (operatorArgs.lastSel) {\n            newAnchor = oldAnchor;\n            var lastSel = operatorArgs.lastSel;\n            var lineOffset = Math.abs(lastSel.head.line - lastSel.anchor.line);\n            var chOffset = Math.abs(lastSel.head.ch - lastSel.anchor.ch);\n            if (lastSel.visualLine) {\n              newHead = Pos(oldAnchor.line + lineOffset, oldAnchor.ch);\n            } else if (lastSel.visualBlock) {\n              newHead = Pos(oldAnchor.line + lineOffset, oldAnchor.ch + chOffset);\n            } else if (lastSel.head.line == lastSel.anchor.line) {\n              newHead = Pos(oldAnchor.line, oldAnchor.ch + chOffset);\n            } else {\n              newHead = Pos(oldAnchor.line + lineOffset, oldAnchor.ch);\n            }\n            vim.visualMode = true;\n            vim.visualLine = lastSel.visualLine;\n            vim.visualBlock = lastSel.visualBlock;\n            sel = vim.sel = {\n              anchor: newAnchor,\n              head: newHead\n            };\n            updateCmSelection(cm);\n          } else if (vim.visualMode) {\n            operatorArgs.lastSel = {\n              anchor: copyCursor(sel.anchor),\n              head: copyCursor(sel.head),\n              visualBlock: vim.visualBlock,\n              visualLine: vim.visualLine\n            };\n          }\n          var curStart, curEnd, linewise, mode;\n          var cmSel;\n          if (vim.visualMode) {\n            curStart = cursorMin(sel.head, sel.anchor);\n            curEnd = cursorMax(sel.head, sel.anchor);\n            linewise = vim.visualLine || operatorArgs.linewise;\n            mode = vim.visualBlock ? 'block' :\n                   linewise ? 'line' :\n                   'char';\n            cmSel = makeCmSelection(cm, {\n              anchor: curStart,\n              head: curEnd\n            }, mode);\n            if (linewise) {\n              var ranges = cmSel.ranges;\n              if (mode == 'block') {\n                for (var i = 0; i < ranges.length; i++) {\n                  ranges[i].head.ch = lineLength(cm, ranges[i].head.line);\n                }\n              } else if (mode == 'line') {\n                ranges[0].head = Pos(ranges[0].head.line + 1, 0);\n              }\n            }\n          } else {\n            curStart = copyCursor(newAnchor || oldAnchor);\n            curEnd = copyCursor(newHead || oldHead);\n            if (cursorIsBefore(curEnd, curStart)) {\n              var tmp = curStart;\n              curStart = curEnd;\n              curEnd = tmp;\n            }\n            linewise = motionArgs.linewise || operatorArgs.linewise;\n            if (linewise) {\n              expandSelectionToLine(cm, curStart, curEnd);\n            } else if (motionArgs.forward) {\n              clipToLine(cm, curStart, curEnd);\n            }\n            mode = 'char';\n            var exclusive = !motionArgs.inclusive || linewise;\n            cmSel = makeCmSelection(cm, {\n              anchor: curStart,\n              head: curEnd\n            }, mode, exclusive);\n          }\n          cm.setSelections(cmSel.ranges, cmSel.primary);\n          vim.lastMotion = null;\n          operatorArgs.repeat = repeat; // For indent in visual mode.\n          operatorArgs.registerName = registerName;\n          operatorArgs.linewise = linewise;\n          var operatorMoveTo = operators[operator](\n            cm, operatorArgs, cmSel.ranges, oldAnchor, newHead);\n          if (vim.visualMode) {\n            exitVisualMode(cm);\n          }\n          if (operatorMoveTo) {\n            cm.setCursor(operatorMoveTo);\n          }\n        }\n      },\n      recordLastEdit: function(vim, inputState, actionCommand) {\n        var macroModeState = vimGlobalState.macroModeState;\n        if (macroModeState.isPlaying) { return; }\n        vim.lastEditInputState = inputState;\n        vim.lastEditActionCommand = actionCommand;\n        macroModeState.lastInsertModeChanges.changes = [];\n        macroModeState.lastInsertModeChanges.expectCursorActivityForChange = false;\n      }\n    };\n    var motions = {\n      moveToTopLine: function(cm, _head, motionArgs) {\n        var line = getUserVisibleLines(cm).top + motionArgs.repeat -1;\n        return Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));\n      },\n      moveToMiddleLine: function(cm) {\n        var range = getUserVisibleLines(cm);\n        var line = Math.floor((range.top + range.bottom) * 0.5);\n        return Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));\n      },\n      moveToBottomLine: function(cm, _head, motionArgs) {\n        var line = getUserVisibleLines(cm).bottom - motionArgs.repeat +1;\n        return Pos(line, findFirstNonWhiteSpaceCharacter(cm.getLine(line)));\n      },\n      expandToLine: function(_cm, head, motionArgs) {\n        var cur = head;\n        return Pos(cur.line + motionArgs.repeat - 1, Infinity);\n      },\n      findNext: function(cm, _head, motionArgs) {\n        var state = getSearchState(cm);\n        var query = state.getQuery();\n        if (!query) {\n          return;\n        }\n        var prev = !motionArgs.forward;\n        prev = (state.isReversed()) ? !prev : prev;\n        highlightSearchMatches(cm, query);\n        return findNext(cm, prev/** prev */, query, motionArgs.repeat);\n      },\n      goToMark: function(cm, _head, motionArgs, vim) {\n        var mark = vim.marks[motionArgs.selectedCharacter];\n        if (mark) {\n          var pos = mark.find();\n          return motionArgs.linewise ? { line: pos.line, ch: findFirstNonWhiteSpaceCharacter(cm.getLine(pos.line)) } : pos;\n        }\n        return null;\n      },\n      moveToOtherHighlightedEnd: function(cm, _head, motionArgs, vim) {\n        if (vim.visualBlock && motionArgs.sameLine) {\n          var sel = vim.sel;\n          return [\n            clipCursorToContent(cm, Pos(sel.anchor.line, sel.head.ch)),\n            clipCursorToContent(cm, Pos(sel.head.line, sel.anchor.ch))\n          ];\n        } else {\n          return ([vim.sel.head, vim.sel.anchor]);\n        }\n      },\n      jumpToMark: function(cm, head, motionArgs, vim) {\n        var best = head;\n        for (var i = 0; i < motionArgs.repeat; i++) {\n          var cursor = best;\n          for (var key in vim.marks) {\n            if (!isLowerCase(key)) {\n              continue;\n            }\n            var mark = vim.marks[key].find();\n            var isWrongDirection = (motionArgs.forward) ?\n              cursorIsBefore(mark, cursor) : cursorIsBefore(cursor, mark);\n\n            if (isWrongDirection) {\n              continue;\n            }\n            if (motionArgs.linewise && (mark.line == cursor.line)) {\n              continue;\n            }\n\n            var equal = cursorEqual(cursor, best);\n            var between = (motionArgs.forward) ?\n              cursorIsBetween(cursor, mark, best) :\n              cursorIsBetween(best, mark, cursor);\n\n            if (equal || between) {\n              best = mark;\n            }\n          }\n        }\n\n        if (motionArgs.linewise) {\n          best = Pos(best.line, findFirstNonWhiteSpaceCharacter(cm.getLine(best.line)));\n        }\n        return best;\n      },\n      moveByCharacters: function(_cm, head, motionArgs) {\n        var cur = head;\n        var repeat = motionArgs.repeat;\n        var ch = motionArgs.forward ? cur.ch + repeat : cur.ch - repeat;\n        return Pos(cur.line, ch);\n      },\n      moveByLines: function(cm, head, motionArgs, vim) {\n        var cur = head;\n        var endCh = cur.ch;\n        switch (vim.lastMotion) {\n          case this.moveByLines:\n          case this.moveByDisplayLines:\n          case this.moveByScroll:\n          case this.moveToColumn:\n          case this.moveToEol:\n            endCh = vim.lastHPos;\n            break;\n          default:\n            vim.lastHPos = endCh;\n        }\n        var repeat = motionArgs.repeat+(motionArgs.repeatOffset||0);\n        var line = motionArgs.forward ? cur.line + repeat : cur.line - repeat;\n        var first = cm.firstLine();\n        var last = cm.lastLine();\n        if ((line < first && cur.line == first) ||\n            (line > last && cur.line == last)) {\n          return;\n        }\n        if (motionArgs.toFirstChar){\n          endCh=findFirstNonWhiteSpaceCharacter(cm.getLine(line));\n          vim.lastHPos = endCh;\n        }\n        vim.lastHSPos = cm.charCoords(Pos(line, endCh),'div').left;\n        return Pos(line, endCh);\n      },\n      moveByDisplayLines: function(cm, head, motionArgs, vim) {\n        var cur = head;\n        switch (vim.lastMotion) {\n          case this.moveByDisplayLines:\n          case this.moveByScroll:\n          case this.moveByLines:\n          case this.moveToColumn:\n          case this.moveToEol:\n            break;\n          default:\n            vim.lastHSPos = cm.charCoords(cur,'div').left;\n        }\n        var repeat = motionArgs.repeat;\n        var res=cm.findPosV(cur,(motionArgs.forward ? repeat : -repeat),'line',vim.lastHSPos);\n        if (res.hitSide) {\n          if (motionArgs.forward) {\n            var lastCharCoords = cm.charCoords(res, 'div');\n            var goalCoords = { top: lastCharCoords.top + 8, left: vim.lastHSPos };\n            var res = cm.coordsChar(goalCoords, 'div');\n          } else {\n            var resCoords = cm.charCoords(Pos(cm.firstLine(), 0), 'div');\n            resCoords.left = vim.lastHSPos;\n            res = cm.coordsChar(resCoords, 'div');\n          }\n        }\n        vim.lastHPos = res.ch;\n        return res;\n      },\n      moveByPage: function(cm, head, motionArgs) {\n        var curStart = head;\n        var repeat = motionArgs.repeat;\n        return cm.findPosV(curStart, (motionArgs.forward ? repeat : -repeat), 'page');\n      },\n      moveByParagraph: function(cm, head, motionArgs) {\n        var line = head.line;\n        var repeat = motionArgs.repeat;\n        var inc = motionArgs.forward ? 1 : -1;\n        for (var i = 0; i < repeat; i++) {\n          if ((!motionArgs.forward && line === cm.firstLine() ) ||\n              (motionArgs.forward && line == cm.lastLine())) {\n            break;\n          }\n          line += inc;\n          while (line !== cm.firstLine() && line != cm.lastLine() && cm.getLine(line)) {\n            line += inc;\n          }\n        }\n        return Pos(line, 0);\n      },\n      moveByScroll: function(cm, head, motionArgs, vim) {\n        var scrollbox = cm.getScrollInfo();\n        var curEnd = null;\n        var repeat = motionArgs.repeat;\n        if (!repeat) {\n          repeat = scrollbox.clientHeight / (2 * cm.defaultTextHeight());\n        }\n        var orig = cm.charCoords(head, 'local');\n        motionArgs.repeat = repeat;\n        var curEnd = motions.moveByDisplayLines(cm, head, motionArgs, vim);\n        if (!curEnd) {\n          return null;\n        }\n        var dest = cm.charCoords(curEnd, 'local');\n        cm.scrollTo(null, scrollbox.top + dest.top - orig.top);\n        return curEnd;\n      },\n      moveByWords: function(cm, head, motionArgs) {\n        return moveToWord(cm, head, motionArgs.repeat, !!motionArgs.forward,\n            !!motionArgs.wordEnd, !!motionArgs.bigWord);\n      },\n      moveTillCharacter: function(cm, _head, motionArgs) {\n        var repeat = motionArgs.repeat;\n        var curEnd = moveToCharacter(cm, repeat, motionArgs.forward,\n            motionArgs.selectedCharacter);\n        var increment = motionArgs.forward ? -1 : 1;\n        recordLastCharacterSearch(increment, motionArgs);\n        if (!curEnd) return null;\n        curEnd.ch += increment;\n        return curEnd;\n      },\n      moveToCharacter: function(cm, head, motionArgs) {\n        var repeat = motionArgs.repeat;\n        recordLastCharacterSearch(0, motionArgs);\n        return moveToCharacter(cm, repeat, motionArgs.forward,\n            motionArgs.selectedCharacter) || head;\n      },\n      moveToSymbol: function(cm, head, motionArgs) {\n        var repeat = motionArgs.repeat;\n        return findSymbol(cm, repeat, motionArgs.forward,\n            motionArgs.selectedCharacter) || head;\n      },\n      moveToColumn: function(cm, head, motionArgs, vim) {\n        var repeat = motionArgs.repeat;\n        vim.lastHPos = repeat - 1;\n        vim.lastHSPos = cm.charCoords(head,'div').left;\n        return moveToColumn(cm, repeat);\n      },\n      moveToEol: function(cm, head, motionArgs, vim) {\n        var cur = head;\n        vim.lastHPos = Infinity;\n        var retval= Pos(cur.line + motionArgs.repeat - 1, Infinity);\n        var end=cm.clipPos(retval);\n        end.ch--;\n        vim.lastHSPos = cm.charCoords(end,'div').left;\n        return retval;\n      },\n      moveToFirstNonWhiteSpaceCharacter: function(cm, head) {\n        var cursor = head;\n        return Pos(cursor.line,\n                   findFirstNonWhiteSpaceCharacter(cm.getLine(cursor.line)));\n      },\n      moveToMatchedSymbol: function(cm, head) {\n        var cursor = head;\n        var line = cursor.line;\n        var ch = cursor.ch;\n        var lineText = cm.getLine(line);\n        var symbol;\n        do {\n          symbol = lineText.charAt(ch++);\n          if (symbol && isMatchableSymbol(symbol)) {\n            var style = cm.getTokenTypeAt(Pos(line, ch));\n            if (style !== \"string\" && style !== \"comment\") {\n              break;\n            }\n          }\n        } while (symbol);\n        if (symbol) {\n          var matched = cm.findMatchingBracket(Pos(line, ch));\n          return matched.to;\n        } else {\n          return cursor;\n        }\n      },\n      moveToStartOfLine: function(_cm, head) {\n        return Pos(head.line, 0);\n      },\n      moveToLineOrEdgeOfDocument: function(cm, _head, motionArgs) {\n        var lineNum = motionArgs.forward ? cm.lastLine() : cm.firstLine();\n        if (motionArgs.repeatIsExplicit) {\n          lineNum = motionArgs.repeat - cm.getOption('firstLineNumber');\n        }\n        return Pos(lineNum,\n                   findFirstNonWhiteSpaceCharacter(cm.getLine(lineNum)));\n      },\n      textObjectManipulation: function(cm, head, motionArgs) {\n        var mirroredPairs = {'(': ')', ')': '(',\n                             '{': '}', '}': '{',\n                             '[': ']', ']': '['};\n        var selfPaired = {'\\'': true, '\"': true};\n\n        var character = motionArgs.selectedCharacter;\n        if (character == 'b') {\n          character = '(';\n        } else if (character == 'B') {\n          character = '{';\n        }\n        var inclusive = !motionArgs.textObjectInner;\n\n        var tmp;\n        if (mirroredPairs[character]) {\n          tmp = selectCompanionObject(cm, head, character, inclusive);\n        } else if (selfPaired[character]) {\n          tmp = findBeginningAndEnd(cm, head, character, inclusive);\n        } else if (character === 'W') {\n          tmp = expandWordUnderCursor(cm, inclusive, true /** forward */,\n                                                     true /** bigWord */);\n        } else if (character === 'w') {\n          tmp = expandWordUnderCursor(cm, inclusive, true /** forward */,\n                                                     false /** bigWord */);\n        } else if (character === 'p') {\n          tmp = expandParagraphUnderCursor(cm, inclusive, true /** forward */,\n                                                     false /** bigWord */);\n        } else {\n          return null;\n        }\n\n        if (!cm.state.vim.visualMode) {\n          return [tmp.start, tmp.end];\n        } else {\n          return expandSelection(cm, tmp.start, tmp.end);\n        }\n      },\n\n      repeatLastCharacterSearch: function(cm, head, motionArgs) {\n        var lastSearch = vimGlobalState.lastChararacterSearch;\n        var repeat = motionArgs.repeat;\n        var forward = motionArgs.forward === lastSearch.forward;\n        var increment = (lastSearch.increment ? 1 : 0) * (forward ? -1 : 1);\n        cm.moveH(-increment, 'char');\n        motionArgs.inclusive = forward ? true : false;\n        var curEnd = moveToCharacter(cm, repeat, forward, lastSearch.selectedCharacter);\n        if (!curEnd) {\n          cm.moveH(increment, 'char');\n          return head;\n        }\n        curEnd.ch += increment;\n        return curEnd;\n      }\n    };\n\n    function fillArray(val, times) {\n      var arr = [];\n      for (var i = 0; i < times; i++) {\n        arr.push(val);\n      }\n      return arr;\n    }\n    var operators = {\n      change: function(cm, args, ranges) {\n        var finalHead, text;\n        var vim = cm.state.vim;\n        vimGlobalState.macroModeState.lastInsertModeChanges.inVisualBlock = vim.visualBlock;\n        if (!vim.visualMode) {\n          var anchor = ranges[0].anchor,\n              head = ranges[0].head;\n          text = cm.getRange(anchor, head);\n          if (!isWhiteSpaceString(text)) {\n            var match = (/\\s+$/).exec(text);\n            if (match) {\n              head = offsetCursor(head, 0, - match[0].length);\n              text = text.slice(0, - match[0].length);\n            }\n          }\n          var wasLastLine = head.line - 1 == cm.lastLine();\n          cm.replaceRange('', anchor, head);\n          if (args.linewise && !wasLastLine) {\n            CodeMirror.commands.newlineAndIndent(cm);\n            anchor.ch = null;\n          }\n          finalHead = anchor;\n        } else {\n          text = cm.getSelection();\n          var replacement = fillArray('', ranges.length);\n          cm.replaceSelections(replacement);\n          finalHead = cursorMin(ranges[0].head, ranges[0].anchor);\n        }\n        vimGlobalState.registerController.pushText(\n            args.registerName, 'change', text,\n            args.linewise, ranges.length > 1);\n        actions.enterInsertMode(cm, {head: finalHead}, cm.state.vim);\n      },\n      'delete': function(cm, args, ranges) {\n        var finalHead, text;\n        var vim = cm.state.vim;\n        if (!vim.visualBlock) {\n          var anchor = ranges[0].anchor,\n              head = ranges[0].head;\n          if (args.linewise &&\n              head.line != cm.firstLine() &&\n              anchor.line == cm.lastLine() &&\n              anchor.line == head.line - 1) {\n            if (anchor.line == cm.firstLine()) {\n              anchor.ch = 0;\n            } else {\n              anchor = Pos(anchor.line - 1, lineLength(cm, anchor.line - 1));\n            }\n          }\n          text = cm.getRange(anchor, head);\n          cm.replaceRange('', anchor, head);\n          finalHead = anchor;\n          if (args.linewise) {\n            finalHead = motions.moveToFirstNonWhiteSpaceCharacter(cm, anchor);\n          }\n        } else {\n          text = cm.getSelection();\n          var replacement = fillArray('', ranges.length);\n          cm.replaceSelections(replacement);\n          finalHead = ranges[0].anchor;\n        }\n        vimGlobalState.registerController.pushText(\n            args.registerName, 'delete', text,\n            args.linewise, vim.visualBlock);\n        return finalHead;\n      },\n      indent: function(cm, args, ranges) {\n        var vim = cm.state.vim;\n        var startLine = ranges[0].anchor.line;\n        var endLine = vim.visualBlock ?\n          ranges[ranges.length - 1].anchor.line :\n          ranges[0].head.line;\n        var repeat = (vim.visualMode) ? args.repeat : 1;\n        if (args.linewise) {\n          endLine--;\n        }\n        for (var i = startLine; i <= endLine; i++) {\n          for (var j = 0; j < repeat; j++) {\n            cm.indentLine(i, args.indentRight);\n          }\n        }\n        return motions.moveToFirstNonWhiteSpaceCharacter(cm, ranges[0].anchor);\n      },\n      changeCase: function(cm, args, ranges, oldAnchor, newHead) {\n        var selections = cm.getSelections();\n        var swapped = [];\n        var toLower = args.toLower;\n        for (var j = 0; j < selections.length; j++) {\n          var toSwap = selections[j];\n          var text = '';\n          if (toLower === true) {\n            text = toSwap.toLowerCase();\n          } else if (toLower === false) {\n            text = toSwap.toUpperCase();\n          } else {\n            for (var i = 0; i < toSwap.length; i++) {\n              var character = toSwap.charAt(i);\n              text += isUpperCase(character) ? character.toLowerCase() :\n                  character.toUpperCase();\n            }\n          }\n          swapped.push(text);\n        }\n        cm.replaceSelections(swapped);\n        if (args.shouldMoveCursor){\n          return newHead;\n        } else if (!cm.state.vim.visualMode && args.linewise && ranges[0].anchor.line + 1 == ranges[0].head.line) {\n          return motions.moveToFirstNonWhiteSpaceCharacter(cm, oldAnchor);\n        } else if (args.linewise){\n          return oldAnchor;\n        } else {\n          return cursorMin(ranges[0].anchor, ranges[0].head);\n        }\n      },\n      yank: function(cm, args, ranges, oldAnchor) {\n        var vim = cm.state.vim;\n        var text = cm.getSelection();\n        var endPos = vim.visualMode\n          ? cursorMin(vim.sel.anchor, vim.sel.head, ranges[0].head, ranges[0].anchor)\n          : oldAnchor;\n        vimGlobalState.registerController.pushText(\n            args.registerName, 'yank',\n            text, args.linewise, vim.visualBlock);\n        return endPos;\n      }\n    };\n\n    var actions = {\n      jumpListWalk: function(cm, actionArgs, vim) {\n        if (vim.visualMode) {\n          return;\n        }\n        var repeat = actionArgs.repeat;\n        var forward = actionArgs.forward;\n        var jumpList = vimGlobalState.jumpList;\n\n        var mark = jumpList.move(cm, forward ? repeat : -repeat);\n        var markPos = mark ? mark.find() : undefined;\n        markPos = markPos ? markPos : cm.getCursor();\n        cm.setCursor(markPos);\n      },\n      scroll: function(cm, actionArgs, vim) {\n        if (vim.visualMode) {\n          return;\n        }\n        var repeat = actionArgs.repeat || 1;\n        var lineHeight = cm.defaultTextHeight();\n        var top = cm.getScrollInfo().top;\n        var delta = lineHeight * repeat;\n        var newPos = actionArgs.forward ? top + delta : top - delta;\n        var cursor = copyCursor(cm.getCursor());\n        var cursorCoords = cm.charCoords(cursor, 'local');\n        if (actionArgs.forward) {\n          if (newPos > cursorCoords.top) {\n             cursor.line += (newPos - cursorCoords.top) / lineHeight;\n             cursor.line = Math.ceil(cursor.line);\n             cm.setCursor(cursor);\n             cursorCoords = cm.charCoords(cursor, 'local');\n             cm.scrollTo(null, cursorCoords.top);\n          } else {\n             cm.scrollTo(null, newPos);\n          }\n        } else {\n          var newBottom = newPos + cm.getScrollInfo().clientHeight;\n          if (newBottom < cursorCoords.bottom) {\n             cursor.line -= (cursorCoords.bottom - newBottom) / lineHeight;\n             cursor.line = Math.floor(cursor.line);\n             cm.setCursor(cursor);\n             cursorCoords = cm.charCoords(cursor, 'local');\n             cm.scrollTo(\n                 null, cursorCoords.bottom - cm.getScrollInfo().clientHeight);\n          } else {\n             cm.scrollTo(null, newPos);\n          }\n        }\n      },\n      scrollToCursor: function(cm, actionArgs) {\n        var lineNum = cm.getCursor().line;\n        var charCoords = cm.charCoords(Pos(lineNum, 0), 'local');\n        var height = cm.getScrollInfo().clientHeight;\n        var y = charCoords.top;\n        var lineHeight = charCoords.bottom - y;\n        switch (actionArgs.position) {\n          case 'center': y = y - (height / 2) + lineHeight;\n            break;\n          case 'bottom': y = y - height + lineHeight*1.4;\n            break;\n          case 'top': y = y + lineHeight*0.4;\n            break;\n        }\n        cm.scrollTo(null, y);\n      },\n      replayMacro: function(cm, actionArgs, vim) {\n        var registerName = actionArgs.selectedCharacter;\n        var repeat = actionArgs.repeat;\n        var macroModeState = vimGlobalState.macroModeState;\n        if (registerName == '@') {\n          registerName = macroModeState.latestRegister;\n        }\n        while(repeat--){\n          executeMacroRegister(cm, vim, macroModeState, registerName);\n        }\n      },\n      enterMacroRecordMode: function(cm, actionArgs) {\n        var macroModeState = vimGlobalState.macroModeState;\n        var registerName = actionArgs.selectedCharacter;\n        macroModeState.enterMacroRecordMode(cm, registerName);\n      },\n      enterInsertMode: function(cm, actionArgs, vim) {\n        if (cm.getOption('readOnly')) { return; }\n        vim.insertMode = true;\n        vim.insertModeRepeat = actionArgs && actionArgs.repeat || 1;\n        var insertAt = (actionArgs) ? actionArgs.insertAt : null;\n        var sel = vim.sel;\n        var head = actionArgs.head || cm.getCursor('head');\n        var height = cm.listSelections().length;\n        if (insertAt == 'eol') {\n          head = Pos(head.line, lineLength(cm, head.line));\n        } else if (insertAt == 'charAfter') {\n          head = offsetCursor(head, 0, 1);\n        } else if (insertAt == 'firstNonBlank') {\n          head = motions.moveToFirstNonWhiteSpaceCharacter(cm, head);\n        } else if (insertAt == 'startOfSelectedArea') {\n          if (!vim.visualBlock) {\n            if (sel.head.line < sel.anchor.line) {\n              head = sel.head;\n            } else {\n              head = Pos(sel.anchor.line, 0);\n            }\n          } else {\n            head = Pos(\n                Math.min(sel.head.line, sel.anchor.line),\n                Math.min(sel.head.ch, sel.anchor.ch));\n            height = Math.abs(sel.head.line - sel.anchor.line) + 1;\n          }\n        } else if (insertAt == 'endOfSelectedArea') {\n          if (!vim.visualBlock) {\n            if (sel.head.line >= sel.anchor.line) {\n              head = offsetCursor(sel.head, 0, 1);\n            } else {\n              head = Pos(sel.anchor.line, 0);\n            }\n          } else {\n            head = Pos(\n                Math.min(sel.head.line, sel.anchor.line),\n                Math.max(sel.head.ch + 1, sel.anchor.ch));\n            height = Math.abs(sel.head.line - sel.anchor.line) + 1;\n          }\n        } else if (insertAt == 'inplace') {\n          if (vim.visualMode){\n            return;\n          }\n        }\n        cm.setOption('keyMap', 'vim-insert');\n        cm.setOption('disableInput', false);\n        if (actionArgs && actionArgs.replace) {\n          cm.toggleOverwrite(true);\n          cm.setOption('keyMap', 'vim-replace');\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"replace\"});\n        } else {\n          cm.setOption('keyMap', 'vim-insert');\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"insert\"});\n        }\n        if (!vimGlobalState.macroModeState.isPlaying) {\n          cm.on('change', onChange);\n          CodeMirror.on(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown);\n        }\n        if (vim.visualMode) {\n          exitVisualMode(cm);\n        }\n        selectForInsert(cm, head, height);\n      },\n      toggleVisualMode: function(cm, actionArgs, vim) {\n        var repeat = actionArgs.repeat;\n        var anchor = cm.getCursor();\n        var head;\n        if (!vim.visualMode) {\n          vim.visualMode = true;\n          vim.visualLine = !!actionArgs.linewise;\n          vim.visualBlock = !!actionArgs.blockwise;\n          head = clipCursorToContent(\n              cm, Pos(anchor.line, anchor.ch + repeat - 1),\n              true /** includeLineBreak */);\n          vim.sel = {\n            anchor: anchor,\n            head: head\n          };\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\", subMode: vim.visualLine ? \"linewise\" : vim.visualBlock ? \"blockwise\" : \"\"});\n          updateCmSelection(cm);\n          updateMark(cm, vim, '<', cursorMin(anchor, head));\n          updateMark(cm, vim, '>', cursorMax(anchor, head));\n        } else if (vim.visualLine ^ actionArgs.linewise ||\n            vim.visualBlock ^ actionArgs.blockwise) {\n          vim.visualLine = !!actionArgs.linewise;\n          vim.visualBlock = !!actionArgs.blockwise;\n          CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\", subMode: vim.visualLine ? \"linewise\" : vim.visualBlock ? \"blockwise\" : \"\"});\n          updateCmSelection(cm);\n        } else {\n          exitVisualMode(cm);\n        }\n      },\n      reselectLastSelection: function(cm, _actionArgs, vim) {\n        var lastSelection = vim.lastSelection;\n        if (vim.visualMode) {\n          updateLastSelection(cm, vim);\n        }\n        if (lastSelection) {\n          var anchor = lastSelection.anchorMark.find();\n          var head = lastSelection.headMark.find();\n          if (!anchor || !head) {\n            return;\n          }\n          vim.sel = {\n            anchor: anchor,\n            head: head\n          };\n          vim.visualMode = true;\n          vim.visualLine = lastSelection.visualLine;\n          vim.visualBlock = lastSelection.visualBlock;\n          updateCmSelection(cm);\n          updateMark(cm, vim, '<', cursorMin(anchor, head));\n          updateMark(cm, vim, '>', cursorMax(anchor, head));\n          CodeMirror.signal(cm, 'vim-mode-change', {\n            mode: 'visual',\n            subMode: vim.visualLine ? 'linewise' :\n                     vim.visualBlock ? 'blockwise' : ''});\n        }\n      },\n      joinLines: function(cm, actionArgs, vim) {\n        var curStart, curEnd;\n        if (vim.visualMode) {\n          curStart = cm.getCursor('anchor');\n          curEnd = cm.getCursor('head');\n          curEnd.ch = lineLength(cm, curEnd.line) - 1;\n        } else {\n          var repeat = Math.max(actionArgs.repeat, 2);\n          curStart = cm.getCursor();\n          curEnd = clipCursorToContent(cm, Pos(curStart.line + repeat - 1,\n                                               Infinity));\n        }\n        var finalCh = 0;\n        for (var i = curStart.line; i < curEnd.line; i++) {\n          finalCh = lineLength(cm, curStart.line);\n          var tmp = Pos(curStart.line + 1,\n                        lineLength(cm, curStart.line + 1));\n          var text = cm.getRange(curStart, tmp);\n          text = text.replace(/\\n\\s*/g, ' ');\n          cm.replaceRange(text, curStart, tmp);\n        }\n        var curFinalPos = Pos(curStart.line, finalCh);\n        cm.setCursor(curFinalPos);\n        if (vim.visualMode) {\n          exitVisualMode(cm);\n        }\n      },\n      newLineAndEnterInsertMode: function(cm, actionArgs, vim) {\n        vim.insertMode = true;\n        var insertAt = copyCursor(cm.getCursor());\n        if (insertAt.line === cm.firstLine() && !actionArgs.after) {\n          cm.replaceRange('\\n', Pos(cm.firstLine(), 0));\n          cm.setCursor(cm.firstLine(), 0);\n        } else {\n          insertAt.line = (actionArgs.after) ? insertAt.line :\n              insertAt.line - 1;\n          insertAt.ch = lineLength(cm, insertAt.line);\n          cm.setCursor(insertAt);\n          var newlineFn = CodeMirror.commands.newlineAndIndentContinueComment ||\n              CodeMirror.commands.newlineAndIndent;\n          newlineFn(cm);\n        }\n        this.enterInsertMode(cm, { repeat: actionArgs.repeat }, vim);\n      },\n      paste: function(cm, actionArgs, vim) {\n        var cur = copyCursor(cm.getCursor());\n        var register = vimGlobalState.registerController.getRegister(\n            actionArgs.registerName);\n        var text = register.toString();\n        if (!text) {\n          return;\n        }\n        if (actionArgs.matchIndent) {\n          var tabSize = cm.getOption(\"tabSize\");\n          var whitespaceLength = function(str) {\n            var tabs = (str.split(\"\\t\").length - 1);\n            var spaces = (str.split(\" \").length - 1);\n            return tabs * tabSize + spaces * 1;\n          };\n          var currentLine = cm.getLine(cm.getCursor().line);\n          var indent = whitespaceLength(currentLine.match(/^\\s*/)[0]);\n          var chompedText = text.replace(/\\n$/, '');\n          var wasChomped = text !== chompedText;\n          var firstIndent = whitespaceLength(text.match(/^\\s*/)[0]);\n          var text = chompedText.replace(/^\\s*/gm, function(wspace) {\n            var newIndent = indent + (whitespaceLength(wspace) - firstIndent);\n            if (newIndent < 0) {\n              return \"\";\n            }\n            else if (cm.getOption(\"indentWithTabs\")) {\n              var quotient = Math.floor(newIndent / tabSize);\n              return Array(quotient + 1).join('\\t');\n            }\n            else {\n              return Array(newIndent + 1).join(' ');\n            }\n          });\n          text += wasChomped ? \"\\n\" : \"\";\n        }\n        if (actionArgs.repeat > 1) {\n          var text = Array(actionArgs.repeat + 1).join(text);\n        }\n        var linewise = register.linewise;\n        var blockwise = register.blockwise;\n        if (linewise) {\n          if(vim.visualMode) {\n            text = vim.visualLine ? text.slice(0, -1) : '\\n' + text.slice(0, text.length - 1) + '\\n';\n          } else if (actionArgs.after) {\n            text = '\\n' + text.slice(0, text.length - 1);\n            cur.ch = lineLength(cm, cur.line);\n          } else {\n            cur.ch = 0;\n          }\n        } else {\n          if (blockwise) {\n            text = text.split('\\n');\n            for (var i = 0; i < text.length; i++) {\n              text[i] = (text[i] == '') ? ' ' : text[i];\n            }\n          }\n          cur.ch += actionArgs.after ? 1 : 0;\n        }\n        var curPosFinal;\n        var idx;\n        if (vim.visualMode) {\n          vim.lastPastedText = text;\n          var lastSelectionCurEnd;\n          var selectedArea = getSelectedAreaRange(cm, vim);\n          var selectionStart = selectedArea[0];\n          var selectionEnd = selectedArea[1];\n          var selectedText = cm.getSelection();\n          var selections = cm.listSelections();\n          var emptyStrings = new Array(selections.length).join('1').split('1');\n          if (vim.lastSelection) {\n            lastSelectionCurEnd = vim.lastSelection.headMark.find();\n          }\n          vimGlobalState.registerController.unnamedRegister.setText(selectedText);\n          if (blockwise) {\n            cm.replaceSelections(emptyStrings);\n            selectionEnd = Pos(selectionStart.line + text.length-1, selectionStart.ch);\n            cm.setCursor(selectionStart);\n            selectBlock(cm, selectionEnd);\n            cm.replaceSelections(text);\n            curPosFinal = selectionStart;\n          } else if (vim.visualBlock) {\n            cm.replaceSelections(emptyStrings);\n            cm.setCursor(selectionStart);\n            cm.replaceRange(text, selectionStart, selectionStart);\n            curPosFinal = selectionStart;\n          } else {\n            cm.replaceRange(text, selectionStart, selectionEnd);\n            curPosFinal = cm.posFromIndex(cm.indexFromPos(selectionStart) + text.length - 1);\n          }\n          if(lastSelectionCurEnd) {\n            vim.lastSelection.headMark = cm.setBookmark(lastSelectionCurEnd);\n          }\n          if (linewise) {\n            curPosFinal.ch=0;\n          }\n        } else {\n          if (blockwise) {\n            cm.setCursor(cur);\n            for (var i = 0; i < text.length; i++) {\n              var line = cur.line+i;\n              if (line > cm.lastLine()) {\n                cm.replaceRange('\\n',  Pos(line, 0));\n              }\n              var lastCh = lineLength(cm, line);\n              if (lastCh < cur.ch) {\n                extendLineToColumn(cm, line, cur.ch);\n              }\n            }\n            cm.setCursor(cur);\n            selectBlock(cm, Pos(cur.line + text.length-1, cur.ch));\n            cm.replaceSelections(text);\n            curPosFinal = cur;\n          } else {\n            cm.replaceRange(text, cur);\n            if (linewise && actionArgs.after) {\n              curPosFinal = Pos(\n              cur.line + 1,\n              findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line + 1)));\n            } else if (linewise && !actionArgs.after) {\n              curPosFinal = Pos(\n                cur.line,\n                findFirstNonWhiteSpaceCharacter(cm.getLine(cur.line)));\n            } else if (!linewise && actionArgs.after) {\n              idx = cm.indexFromPos(cur);\n              curPosFinal = cm.posFromIndex(idx + text.length - 1);\n            } else {\n              idx = cm.indexFromPos(cur);\n              curPosFinal = cm.posFromIndex(idx + text.length);\n            }\n          }\n        }\n        if (vim.visualMode) {\n          exitVisualMode(cm);\n        }\n        cm.setCursor(curPosFinal);\n      },\n      undo: function(cm, actionArgs) {\n        cm.operation(function() {\n          repeatFn(cm, CodeMirror.commands.undo, actionArgs.repeat)();\n          cm.setCursor(cm.getCursor('anchor'));\n        });\n      },\n      redo: function(cm, actionArgs) {\n        repeatFn(cm, CodeMirror.commands.redo, actionArgs.repeat)();\n      },\n      setRegister: function(_cm, actionArgs, vim) {\n        vim.inputState.registerName = actionArgs.selectedCharacter;\n      },\n      setMark: function(cm, actionArgs, vim) {\n        var markName = actionArgs.selectedCharacter;\n        updateMark(cm, vim, markName, cm.getCursor());\n      },\n      replace: function(cm, actionArgs, vim) {\n        var replaceWith = actionArgs.selectedCharacter;\n        var curStart = cm.getCursor();\n        var replaceTo;\n        var curEnd;\n        var selections = cm.listSelections();\n        if (vim.visualMode) {\n          curStart = cm.getCursor('start');\n          curEnd = cm.getCursor('end');\n        } else {\n          var line = cm.getLine(curStart.line);\n          replaceTo = curStart.ch + actionArgs.repeat;\n          if (replaceTo > line.length) {\n            replaceTo=line.length;\n          }\n          curEnd = Pos(curStart.line, replaceTo);\n        }\n        if (replaceWith=='\\n') {\n          if (!vim.visualMode) cm.replaceRange('', curStart, curEnd);\n          (CodeMirror.commands.newlineAndIndentContinueComment || CodeMirror.commands.newlineAndIndent)(cm);\n        } else {\n          var replaceWithStr = cm.getRange(curStart, curEnd);\n          replaceWithStr = replaceWithStr.replace(/[^\\n]/g, replaceWith);\n          if (vim.visualBlock) {\n            var spaces = new Array(cm.getOption(\"tabSize\")+1).join(' ');\n            replaceWithStr = cm.getSelection();\n            replaceWithStr = replaceWithStr.replace(/\\t/g, spaces).replace(/[^\\n]/g, replaceWith).split('\\n');\n            cm.replaceSelections(replaceWithStr);\n          } else {\n            cm.replaceRange(replaceWithStr, curStart, curEnd);\n          }\n          if (vim.visualMode) {\n            curStart = cursorIsBefore(selections[0].anchor, selections[0].head) ?\n                         selections[0].anchor : selections[0].head;\n            cm.setCursor(curStart);\n            exitVisualMode(cm);\n          } else {\n            cm.setCursor(offsetCursor(curEnd, 0, -1));\n          }\n        }\n      },\n      incrementNumberToken: function(cm, actionArgs) {\n        var cur = cm.getCursor();\n        var lineStr = cm.getLine(cur.line);\n        var re = /-?\\d+/g;\n        var match;\n        var start;\n        var end;\n        var numberStr;\n        var token;\n        while ((match = re.exec(lineStr)) !== null) {\n          token = match[0];\n          start = match.index;\n          end = start + token.length;\n          if (cur.ch < end)break;\n        }\n        if (!actionArgs.backtrack && (end <= cur.ch))return;\n        if (token) {\n          var increment = actionArgs.increase ? 1 : -1;\n          var number = parseInt(token) + (increment * actionArgs.repeat);\n          var from = Pos(cur.line, start);\n          var to = Pos(cur.line, end);\n          numberStr = number.toString();\n          cm.replaceRange(numberStr, from, to);\n        } else {\n          return;\n        }\n        cm.setCursor(Pos(cur.line, start + numberStr.length - 1));\n      },\n      repeatLastEdit: function(cm, actionArgs, vim) {\n        var lastEditInputState = vim.lastEditInputState;\n        if (!lastEditInputState) { return; }\n        var repeat = actionArgs.repeat;\n        if (repeat && actionArgs.repeatIsExplicit) {\n          vim.lastEditInputState.repeatOverride = repeat;\n        } else {\n          repeat = vim.lastEditInputState.repeatOverride || repeat;\n        }\n        repeatLastEdit(cm, vim, repeat, false /** repeatForInsert */);\n      },\n      exitInsertMode: exitInsertMode\n    };\n    function clipCursorToContent(cm, cur, includeLineBreak) {\n      var line = Math.min(Math.max(cm.firstLine(), cur.line), cm.lastLine() );\n      var maxCh = lineLength(cm, line) - 1;\n      maxCh = (includeLineBreak) ? maxCh + 1 : maxCh;\n      var ch = Math.min(Math.max(0, cur.ch), maxCh);\n      return Pos(line, ch);\n    }\n    function copyArgs(args) {\n      var ret = {};\n      for (var prop in args) {\n        if (args.hasOwnProperty(prop)) {\n          ret[prop] = args[prop];\n        }\n      }\n      return ret;\n    }\n    function offsetCursor(cur, offsetLine, offsetCh) {\n      if (typeof offsetLine === 'object') {\n        offsetCh = offsetLine.ch;\n        offsetLine = offsetLine.line;\n      }\n      return Pos(cur.line + offsetLine, cur.ch + offsetCh);\n    }\n    function getOffset(anchor, head) {\n      return {\n        line: head.line - anchor.line,\n        ch: head.line - anchor.line\n      };\n    }\n    function commandMatches(keys, keyMap, context, inputState) {\n      var match, partial = [], full = [];\n      for (var i = 0; i < keyMap.length; i++) {\n        var command = keyMap[i];\n        if (context == 'insert' && command.context != 'insert' ||\n            command.context && command.context != context ||\n            inputState.operator && command.type == 'action' ||\n            !(match = commandMatch(keys, command.keys))) { continue; }\n        if (match == 'partial') { partial.push(command); }\n        if (match == 'full') { full.push(command); }\n      }\n      return {\n        partial: partial.length && partial,\n        full: full.length && full\n      };\n    }\n    function commandMatch(pressed, mapped) {\n      if (mapped.slice(-11) == '<character>') {\n        var prefixLen = mapped.length - 11;\n        var pressedPrefix = pressed.slice(0, prefixLen);\n        var mappedPrefix = mapped.slice(0, prefixLen);\n        return pressedPrefix == mappedPrefix && pressed.length > prefixLen ? 'full' :\n               mappedPrefix.indexOf(pressedPrefix) == 0 ? 'partial' : false;\n      } else {\n        return pressed == mapped ? 'full' :\n               mapped.indexOf(pressed) == 0 ? 'partial' : false;\n      }\n    }\n    function lastChar(keys) {\n      var match = /^.*(<[\\w\\-]+>)$/.exec(keys);\n      var selectedCharacter = match ? match[1] : keys.slice(-1);\n      if (selectedCharacter.length > 1){\n        switch(selectedCharacter){\n          case '<CR>':\n            selectedCharacter='\\n';\n            break;\n          case '<Space>':\n            selectedCharacter=' ';\n            break;\n          default:\n            break;\n        }\n      }\n      return selectedCharacter;\n    }\n    function repeatFn(cm, fn, repeat) {\n      return function() {\n        for (var i = 0; i < repeat; i++) {\n          fn(cm);\n        }\n      };\n    }\n    function copyCursor(cur) {\n      return Pos(cur.line, cur.ch);\n    }\n    function cursorEqual(cur1, cur2) {\n      return cur1.ch == cur2.ch && cur1.line == cur2.line;\n    }\n    function cursorIsBefore(cur1, cur2) {\n      if (cur1.line < cur2.line) {\n        return true;\n      }\n      if (cur1.line == cur2.line && cur1.ch < cur2.ch) {\n        return true;\n      }\n      return false;\n    }\n    function cursorMin(cur1, cur2) {\n      if (arguments.length > 2) {\n        cur2 = cursorMin.apply(undefined, Array.prototype.slice.call(arguments, 1));\n      }\n      return cursorIsBefore(cur1, cur2) ? cur1 : cur2;\n    }\n    function cursorMax(cur1, cur2) {\n      if (arguments.length > 2) {\n        cur2 = cursorMax.apply(undefined, Array.prototype.slice.call(arguments, 1));\n      }\n      return cursorIsBefore(cur1, cur2) ? cur2 : cur1;\n    }\n    function cursorIsBetween(cur1, cur2, cur3) {\n      var cur1before2 = cursorIsBefore(cur1, cur2);\n      var cur2before3 = cursorIsBefore(cur2, cur3);\n      return cur1before2 && cur2before3;\n    }\n    function lineLength(cm, lineNum) {\n      return cm.getLine(lineNum).length;\n    }\n    function reverse(s){\n      return s.split('').reverse().join('');\n    }\n    function trim(s) {\n      if (s.trim) {\n        return s.trim();\n      }\n      return s.replace(/^\\s+|\\s+$/g, '');\n    }\n    function escapeRegex(s) {\n      return s.replace(/([.?*+$\\[\\]\\/\\\\(){}|\\-])/g, '\\\\$1');\n    }\n    function extendLineToColumn(cm, lineNum, column) {\n      var endCh = lineLength(cm, lineNum);\n      var spaces = new Array(column-endCh+1).join(' ');\n      cm.setCursor(Pos(lineNum, endCh));\n      cm.replaceRange(spaces, cm.getCursor());\n    }\n    function selectBlock(cm, selectionEnd) {\n      var selections = [], ranges = cm.listSelections();\n      var head = copyCursor(cm.clipPos(selectionEnd));\n      var isClipped = !cursorEqual(selectionEnd, head);\n      var curHead = cm.getCursor('head');\n      var primIndex = getIndex(ranges, curHead);\n      var wasClipped = cursorEqual(ranges[primIndex].head, ranges[primIndex].anchor);\n      var max = ranges.length - 1;\n      var index = max - primIndex > primIndex ? max : 0;\n      var base = ranges[index].anchor;\n\n      var firstLine = Math.min(base.line, head.line);\n      var lastLine = Math.max(base.line, head.line);\n      var baseCh = base.ch, headCh = head.ch;\n\n      var dir = ranges[index].head.ch - baseCh;\n      var newDir = headCh - baseCh;\n      if (dir > 0 && newDir <= 0) {\n        baseCh++;\n        if (!isClipped) { headCh--; }\n      } else if (dir < 0 && newDir >= 0) {\n        baseCh--;\n        if (!wasClipped) { headCh++; }\n      } else if (dir < 0 && newDir == -1) {\n        baseCh--;\n        headCh++;\n      }\n      for (var line = firstLine; line <= lastLine; line++) {\n        var range = {anchor: new Pos(line, baseCh), head: new Pos(line, headCh)};\n        selections.push(range);\n      }\n      primIndex = head.line == lastLine ? selections.length - 1 : 0;\n      cm.setSelections(selections);\n      selectionEnd.ch = headCh;\n      base.ch = baseCh;\n      return base;\n    }\n    function selectForInsert(cm, head, height) {\n      var sel = [];\n      for (var i = 0; i < height; i++) {\n        var lineHead = offsetCursor(head, i, 0);\n        sel.push({anchor: lineHead, head: lineHead});\n      }\n      cm.setSelections(sel, 0);\n    }\n    function getIndex(ranges, cursor, end) {\n      for (var i = 0; i < ranges.length; i++) {\n        var atAnchor = end != 'head' && cursorEqual(ranges[i].anchor, cursor);\n        var atHead = end != 'anchor' && cursorEqual(ranges[i].head, cursor);\n        if (atAnchor || atHead) {\n          return i;\n        }\n      }\n      return -1;\n    }\n    function getSelectedAreaRange(cm, vim) {\n      var lastSelection = vim.lastSelection;\n      var getCurrentSelectedAreaRange = function() {\n        var selections = cm.listSelections();\n        var start =  selections[0];\n        var end = selections[selections.length-1];\n        var selectionStart = cursorIsBefore(start.anchor, start.head) ? start.anchor : start.head;\n        var selectionEnd = cursorIsBefore(end.anchor, end.head) ? end.head : end.anchor;\n        return [selectionStart, selectionEnd];\n      };\n      var getLastSelectedAreaRange = function() {\n        var selectionStart = cm.getCursor();\n        var selectionEnd = cm.getCursor();\n        var block = lastSelection.visualBlock;\n        if (block) {\n          var width = block.width;\n          var height = block.height;\n          selectionEnd = Pos(selectionStart.line + height, selectionStart.ch + width);\n          var selections = [];\n          for (var i = selectionStart.line; i < selectionEnd.line; i++) {\n            var anchor = Pos(i, selectionStart.ch);\n            var head = Pos(i, selectionEnd.ch);\n            var range = {anchor: anchor, head: head};\n            selections.push(range);\n          }\n          cm.setSelections(selections);\n        } else {\n          var start = lastSelection.anchorMark.find();\n          var end = lastSelection.headMark.find();\n          var line = end.line - start.line;\n          var ch = end.ch - start.ch;\n          selectionEnd = {line: selectionEnd.line + line, ch: line ? selectionEnd.ch : ch + selectionEnd.ch};\n          if (lastSelection.visualLine) {\n            selectionStart = Pos(selectionStart.line, 0);\n            selectionEnd = Pos(selectionEnd.line, lineLength(cm, selectionEnd.line));\n          }\n          cm.setSelection(selectionStart, selectionEnd);\n        }\n        return [selectionStart, selectionEnd];\n      };\n      if (!vim.visualMode) {\n        return getLastSelectedAreaRange();\n      } else {\n        return getCurrentSelectedAreaRange();\n      }\n    }\n    function updateLastSelection(cm, vim) {\n      var anchor = vim.sel.anchor;\n      var head = vim.sel.head;\n      if (vim.lastPastedText) {\n        head = cm.posFromIndex(cm.indexFromPos(anchor) + vim.lastPastedText.length);\n        vim.lastPastedText = null;\n      }\n      vim.lastSelection = {'anchorMark': cm.setBookmark(anchor),\n                           'headMark': cm.setBookmark(head),\n                           'anchor': copyCursor(anchor),\n                           'head': copyCursor(head),\n                           'visualMode': vim.visualMode,\n                           'visualLine': vim.visualLine,\n                           'visualBlock': vim.visualBlock};\n    }\n    function expandSelection(cm, start, end) {\n      var sel = cm.state.vim.sel;\n      var head = sel.head;\n      var anchor = sel.anchor;\n      var tmp;\n      if (cursorIsBefore(end, start)) {\n        tmp = end;\n        end = start;\n        start = tmp;\n      }\n      if (cursorIsBefore(head, anchor)) {\n        head = cursorMin(start, head);\n        anchor = cursorMax(anchor, end);\n      } else {\n        anchor = cursorMin(start, anchor);\n        head = cursorMax(head, end);\n        head = offsetCursor(head, 0, -1);\n        if (head.ch == -1 && head.line != cm.firstLine()) {\n          head = Pos(head.line - 1, lineLength(cm, head.line - 1));\n        }\n      }\n      return [anchor, head];\n    }\n    function updateCmSelection(cm, sel, mode) {\n      var vim = cm.state.vim;\n      sel = sel || vim.sel;\n      var mode = mode ||\n        vim.visualLine ? 'line' : vim.visualBlock ? 'block' : 'char';\n      var cmSel = makeCmSelection(cm, sel, mode);\n      cm.setSelections(cmSel.ranges, cmSel.primary);\n      updateFakeCursor(cm);\n    }\n    function makeCmSelection(cm, sel, mode, exclusive) {\n      var head = copyCursor(sel.head);\n      var anchor = copyCursor(sel.anchor);\n      if (mode == 'char') {\n        var headOffset = !exclusive && !cursorIsBefore(sel.head, sel.anchor) ? 1 : 0;\n        var anchorOffset = cursorIsBefore(sel.head, sel.anchor) ? 1 : 0;\n        head = offsetCursor(sel.head, 0, headOffset);\n        anchor = offsetCursor(sel.anchor, 0, anchorOffset);\n        return {\n          ranges: [{anchor: anchor, head: head}],\n          primary: 0\n        };\n      } else if (mode == 'line') {\n        if (!cursorIsBefore(sel.head, sel.anchor)) {\n          anchor.ch = 0;\n\n          var lastLine = cm.lastLine();\n          if (head.line > lastLine) {\n            head.line = lastLine;\n          }\n          head.ch = lineLength(cm, head.line);\n        } else {\n          head.ch = 0;\n          anchor.ch = lineLength(cm, anchor.line);\n        }\n        return {\n          ranges: [{anchor: anchor, head: head}],\n          primary: 0\n        };\n      } else if (mode == 'block') {\n        var top = Math.min(anchor.line, head.line),\n            left = Math.min(anchor.ch, head.ch),\n            bottom = Math.max(anchor.line, head.line),\n            right = Math.max(anchor.ch, head.ch) + 1;\n        var height = bottom - top + 1;\n        var primary = head.line == top ? 0 : height - 1;\n        var ranges = [];\n        for (var i = 0; i < height; i++) {\n          ranges.push({\n            anchor: Pos(top + i, left),\n            head: Pos(top + i, right)\n          });\n        }\n        return {\n          ranges: ranges,\n          primary: primary\n        };\n      }\n    }\n    function getHead(cm) {\n      var cur = cm.getCursor('head');\n      if (cm.getSelection().length == 1) {\n        cur = cursorMin(cur, cm.getCursor('anchor'));\n      }\n      return cur;\n    }\n    function exitVisualMode(cm, moveHead) {\n      var vim = cm.state.vim;\n      if (moveHead !== false) {\n        cm.setCursor(clipCursorToContent(cm, vim.sel.head));\n      }\n      updateLastSelection(cm, vim);\n      vim.visualMode = false;\n      vim.visualLine = false;\n      vim.visualBlock = false;\n      CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"normal\"});\n      if (vim.fakeCursor) {\n        vim.fakeCursor.clear();\n      }\n    }\n    function clipToLine(cm, curStart, curEnd) {\n      var selection = cm.getRange(curStart, curEnd);\n      if (/\\n\\s*$/.test(selection)) {\n        var lines = selection.split('\\n');\n        lines.pop();\n        var line;\n        for (var line = lines.pop(); lines.length > 0 && line && isWhiteSpaceString(line); line = lines.pop()) {\n          curEnd.line--;\n          curEnd.ch = 0;\n        }\n        if (line) {\n          curEnd.line--;\n          curEnd.ch = lineLength(cm, curEnd.line);\n        } else {\n          curEnd.ch = 0;\n        }\n      }\n    }\n    function expandSelectionToLine(_cm, curStart, curEnd) {\n      curStart.ch = 0;\n      curEnd.ch = 0;\n      curEnd.line++;\n    }\n\n    function findFirstNonWhiteSpaceCharacter(text) {\n      if (!text) {\n        return 0;\n      }\n      var firstNonWS = text.search(/\\S/);\n      return firstNonWS == -1 ? text.length : firstNonWS;\n    }\n\n    function expandWordUnderCursor(cm, inclusive, _forward, bigWord, noSymbol) {\n      var cur = getHead(cm);\n      var line = cm.getLine(cur.line);\n      var idx = cur.ch;\n      var textAfterIdx = line.substring(idx);\n      var firstMatchedChar;\n      if (noSymbol) {\n        firstMatchedChar = textAfterIdx.search(/\\w/);\n      } else {\n        firstMatchedChar = textAfterIdx.search(/\\S/);\n      }\n      if (firstMatchedChar == -1) {\n        return null;\n      }\n      idx += firstMatchedChar;\n      textAfterIdx = line.substring(idx);\n      var textBeforeIdx = line.substring(0, idx);\n\n      var matchRegex;\n      if (bigWord) {\n        matchRegex = /^\\S+/;\n      } else {\n        if ((/\\w/).test(line.charAt(idx))) {\n          matchRegex = /^\\w+/;\n        } else {\n          matchRegex = /^[^\\w\\s]+/;\n        }\n      }\n\n      var wordAfterRegex = matchRegex.exec(textAfterIdx);\n      var wordStart = idx;\n      var wordEnd = idx + wordAfterRegex[0].length;\n      var revTextBeforeIdx = reverse(textBeforeIdx);\n      var wordBeforeRegex = matchRegex.exec(revTextBeforeIdx);\n      if (wordBeforeRegex) {\n        wordStart -= wordBeforeRegex[0].length;\n      }\n\n      if (inclusive) {\n        var textAfterWordEnd = line.substring(wordEnd);\n        var whitespacesAfterWord = textAfterWordEnd.match(/^\\s*/)[0].length;\n        if (whitespacesAfterWord > 0) {\n          wordEnd += whitespacesAfterWord;\n        } else {\n          var revTrim = revTextBeforeIdx.length - wordStart;\n          var textBeforeWordStart = revTextBeforeIdx.substring(revTrim);\n          var whitespacesBeforeWord = textBeforeWordStart.match(/^\\s*/)[0].length;\n          wordStart -= whitespacesBeforeWord;\n        }\n      }\n\n      return { start: Pos(cur.line, wordStart),\n               end: Pos(cur.line, wordEnd) };\n    }\n\n    function recordJumpPosition(cm, oldCur, newCur) {\n      if (!cursorEqual(oldCur, newCur)) {\n        vimGlobalState.jumpList.add(cm, oldCur, newCur);\n      }\n    }\n\n    function recordLastCharacterSearch(increment, args) {\n        vimGlobalState.lastChararacterSearch.increment = increment;\n        vimGlobalState.lastChararacterSearch.forward = args.forward;\n        vimGlobalState.lastChararacterSearch.selectedCharacter = args.selectedCharacter;\n    }\n\n    var symbolToMode = {\n        '(': 'bracket', ')': 'bracket', '{': 'bracket', '}': 'bracket',\n        '[': 'section', ']': 'section',\n        '*': 'comment', '/': 'comment',\n        'm': 'method', 'M': 'method',\n        '#': 'preprocess'\n    };\n    var findSymbolModes = {\n      bracket: {\n        isComplete: function(state) {\n          if (state.nextCh === state.symb) {\n            state.depth++;\n            if (state.depth >= 1)return true;\n          } else if (state.nextCh === state.reverseSymb) {\n            state.depth--;\n          }\n          return false;\n        }\n      },\n      section: {\n        init: function(state) {\n          state.curMoveThrough = true;\n          state.symb = (state.forward ? ']' : '[') === state.symb ? '{' : '}';\n        },\n        isComplete: function(state) {\n          return state.index === 0 && state.nextCh === state.symb;\n        }\n      },\n      comment: {\n        isComplete: function(state) {\n          var found = state.lastCh === '*' && state.nextCh === '/';\n          state.lastCh = state.nextCh;\n          return found;\n        }\n      },\n      method: {\n        init: function(state) {\n          state.symb = (state.symb === 'm' ? '{' : '}');\n          state.reverseSymb = state.symb === '{' ? '}' : '{';\n        },\n        isComplete: function(state) {\n          if (state.nextCh === state.symb)return true;\n          return false;\n        }\n      },\n      preprocess: {\n        init: function(state) {\n          state.index = 0;\n        },\n        isComplete: function(state) {\n          if (state.nextCh === '#') {\n            var token = state.lineText.match(/#(\\w+)/)[1];\n            if (token === 'endif') {\n              if (state.forward && state.depth === 0) {\n                return true;\n              }\n              state.depth++;\n            } else if (token === 'if') {\n              if (!state.forward && state.depth === 0) {\n                return true;\n              }\n              state.depth--;\n            }\n            if (token === 'else' && state.depth === 0)return true;\n          }\n          return false;\n        }\n      }\n    };\n    function findSymbol(cm, repeat, forward, symb) {\n      var cur = copyCursor(cm.getCursor());\n      var increment = forward ? 1 : -1;\n      var endLine = forward ? cm.lineCount() : -1;\n      var curCh = cur.ch;\n      var line = cur.line;\n      var lineText = cm.getLine(line);\n      var state = {\n        lineText: lineText,\n        nextCh: lineText.charAt(curCh),\n        lastCh: null,\n        index: curCh,\n        symb: symb,\n        reverseSymb: (forward ?  { ')': '(', '}': '{' } : { '(': ')', '{': '}' })[symb],\n        forward: forward,\n        depth: 0,\n        curMoveThrough: false\n      };\n      var mode = symbolToMode[symb];\n      if (!mode)return cur;\n      var init = findSymbolModes[mode].init;\n      var isComplete = findSymbolModes[mode].isComplete;\n      if (init) { init(state); }\n      while (line !== endLine && repeat) {\n        state.index += increment;\n        state.nextCh = state.lineText.charAt(state.index);\n        if (!state.nextCh) {\n          line += increment;\n          state.lineText = cm.getLine(line) || '';\n          if (increment > 0) {\n            state.index = 0;\n          } else {\n            var lineLen = state.lineText.length;\n            state.index = (lineLen > 0) ? (lineLen-1) : 0;\n          }\n          state.nextCh = state.lineText.charAt(state.index);\n        }\n        if (isComplete(state)) {\n          cur.line = line;\n          cur.ch = state.index;\n          repeat--;\n        }\n      }\n      if (state.nextCh || state.curMoveThrough) {\n        return Pos(line, state.index);\n      }\n      return cur;\n    }\n    function findWord(cm, cur, forward, bigWord, emptyLineIsWord) {\n      var lineNum = cur.line;\n      var pos = cur.ch;\n      var line = cm.getLine(lineNum);\n      var dir = forward ? 1 : -1;\n      var regexps = bigWord ? bigWordRegexp : wordRegexp;\n\n      if (emptyLineIsWord && line == '') {\n        lineNum += dir;\n        line = cm.getLine(lineNum);\n        if (!isLine(cm, lineNum)) {\n          return null;\n        }\n        pos = (forward) ? 0 : line.length;\n      }\n\n      while (true) {\n        if (emptyLineIsWord && line == '') {\n          return { from: 0, to: 0, line: lineNum };\n        }\n        var stop = (dir > 0) ? line.length : -1;\n        var wordStart = stop, wordEnd = stop;\n        while (pos != stop) {\n          var foundWord = false;\n          for (var i = 0; i < regexps.length && !foundWord; ++i) {\n            if (regexps[i].test(line.charAt(pos))) {\n              wordStart = pos;\n              while (pos != stop && regexps[i].test(line.charAt(pos))) {\n                pos += dir;\n              }\n              wordEnd = pos;\n              foundWord = wordStart != wordEnd;\n              if (wordStart == cur.ch && lineNum == cur.line &&\n                  wordEnd == wordStart + dir) {\n                continue;\n              } else {\n                return {\n                  from: Math.min(wordStart, wordEnd + 1),\n                  to: Math.max(wordStart, wordEnd),\n                  line: lineNum };\n              }\n            }\n          }\n          if (!foundWord) {\n            pos += dir;\n          }\n        }\n        lineNum += dir;\n        if (!isLine(cm, lineNum)) {\n          return null;\n        }\n        line = cm.getLine(lineNum);\n        pos = (dir > 0) ? 0 : line.length;\n      }\n      throw new Error('The impossible happened.');\n    }\n    function moveToWord(cm, cur, repeat, forward, wordEnd, bigWord) {\n      var curStart = copyCursor(cur);\n      var words = [];\n      if (forward && !wordEnd || !forward && wordEnd) {\n        repeat++;\n      }\n      var emptyLineIsWord = !(forward && wordEnd);\n      for (var i = 0; i < repeat; i++) {\n        var word = findWord(cm, cur, forward, bigWord, emptyLineIsWord);\n        if (!word) {\n          var eodCh = lineLength(cm, cm.lastLine());\n          words.push(forward\n              ? {line: cm.lastLine(), from: eodCh, to: eodCh}\n              : {line: 0, from: 0, to: 0});\n          break;\n        }\n        words.push(word);\n        cur = Pos(word.line, forward ? (word.to - 1) : word.from);\n      }\n      var shortCircuit = words.length != repeat;\n      var firstWord = words[0];\n      var lastWord = words.pop();\n      if (forward && !wordEnd) {\n        if (!shortCircuit && (firstWord.from != curStart.ch || firstWord.line != curStart.line)) {\n          lastWord = words.pop();\n        }\n        return Pos(lastWord.line, lastWord.from);\n      } else if (forward && wordEnd) {\n        return Pos(lastWord.line, lastWord.to - 1);\n      } else if (!forward && wordEnd) {\n        if (!shortCircuit && (firstWord.to != curStart.ch || firstWord.line != curStart.line)) {\n          lastWord = words.pop();\n        }\n        return Pos(lastWord.line, lastWord.to);\n      } else {\n        return Pos(lastWord.line, lastWord.from);\n      }\n    }\n\n    function moveToCharacter(cm, repeat, forward, character) {\n      var cur = cm.getCursor();\n      var start = cur.ch;\n      var idx;\n      for (var i = 0; i < repeat; i ++) {\n        var line = cm.getLine(cur.line);\n        idx = charIdxInLine(start, line, character, forward, true);\n        if (idx == -1) {\n          return null;\n        }\n        start = idx;\n      }\n      return Pos(cm.getCursor().line, idx);\n    }\n\n    function moveToColumn(cm, repeat) {\n      var line = cm.getCursor().line;\n      return clipCursorToContent(cm, Pos(line, repeat - 1));\n    }\n\n    function updateMark(cm, vim, markName, pos) {\n      if (!inArray(markName, validMarks)) {\n        return;\n      }\n      if (vim.marks[markName]) {\n        vim.marks[markName].clear();\n      }\n      vim.marks[markName] = cm.setBookmark(pos);\n    }\n\n    function charIdxInLine(start, line, character, forward, includeChar) {\n      var idx;\n      if (forward) {\n        idx = line.indexOf(character, start + 1);\n        if (idx != -1 && !includeChar) {\n          idx -= 1;\n        }\n      } else {\n        idx = line.lastIndexOf(character, start - 1);\n        if (idx != -1 && !includeChar) {\n          idx += 1;\n        }\n      }\n      return idx;\n    }\n    function selectCompanionObject(cm, head, symb, inclusive) {\n      var cur = head, start, end;\n\n      var bracketRegexp = ({\n        '(': /[()]/, ')': /[()]/,\n        '[': /[[\\]]/, ']': /[[\\]]/,\n        '{': /[{}]/, '}': /[{}]/})[symb];\n      var openSym = ({\n        '(': '(', ')': '(',\n        '[': '[', ']': '[',\n        '{': '{', '}': '{'})[symb];\n      var curChar = cm.getLine(cur.line).charAt(cur.ch);\n      var offset = curChar === openSym ? 1 : 0;\n\n      start = cm.scanForBracket(Pos(cur.line, cur.ch + offset), -1, null, {'bracketRegex': bracketRegexp});\n      end = cm.scanForBracket(Pos(cur.line, cur.ch + offset), 1, null, {'bracketRegex': bracketRegexp});\n\n      if (!start || !end) {\n        return { start: cur, end: cur };\n      }\n\n      start = start.pos;\n      end = end.pos;\n\n      if ((start.line == end.line && start.ch > end.ch)\n          || (start.line > end.line)) {\n        var tmp = start;\n        start = end;\n        end = tmp;\n      }\n\n      if (inclusive) {\n        end.ch += 1;\n      } else {\n        start.ch += 1;\n      }\n\n      return { start: start, end: end };\n    }\n    function findBeginningAndEnd(cm, head, symb, inclusive) {\n      var cur = copyCursor(head);\n      var line = cm.getLine(cur.line);\n      var chars = line.split('');\n      var start, end, i, len;\n      var firstIndex = chars.indexOf(symb);\n      if (cur.ch < firstIndex) {\n        cur.ch = firstIndex;\n      }\n      else if (firstIndex < cur.ch && chars[cur.ch] == symb) {\n        end = cur.ch; // assign end to the current cursor\n        --cur.ch; // make sure to look backwards\n      }\n      if (chars[cur.ch] == symb && !end) {\n        start = cur.ch + 1; // assign start to ahead of the cursor\n      } else {\n        for (i = cur.ch; i > -1 && !start; i--) {\n          if (chars[i] == symb) {\n            start = i + 1;\n          }\n        }\n      }\n      if (start && !end) {\n        for (i = start, len = chars.length; i < len && !end; i++) {\n          if (chars[i] == symb) {\n            end = i;\n          }\n        }\n      }\n      if (!start || !end) {\n        return { start: cur, end: cur };\n      }\n      if (inclusive) {\n        --start; ++end;\n      }\n\n      return {\n        start: Pos(cur.line, start),\n        end: Pos(cur.line, end)\n      };\n    }\n    defineOption('pcre', true, 'boolean');\n    function SearchState() {}\n    SearchState.prototype = {\n      getQuery: function() {\n        return vimGlobalState.query;\n      },\n      setQuery: function(query) {\n        vimGlobalState.query = query;\n      },\n      getOverlay: function() {\n        return this.searchOverlay;\n      },\n      setOverlay: function(overlay) {\n        this.searchOverlay = overlay;\n      },\n      isReversed: function() {\n        return vimGlobalState.isReversed;\n      },\n      setReversed: function(reversed) {\n        vimGlobalState.isReversed = reversed;\n      }\n    };\n    function getSearchState(cm) {\n      var vim = cm.state.vim;\n      return vim.searchState_ || (vim.searchState_ = new SearchState());\n    }\n    function dialog(cm, template, shortText, onClose, options) {\n      if (cm.openDialog) {\n        cm.openDialog(template, onClose, { bottom: true, value: options.value,\n            onKeyDown: options.onKeyDown, onKeyUp: options.onKeyUp });\n      }\n      else {\n        onClose(prompt(shortText, ''));\n      }\n    }\n    function splitBySlash(argString) {\n      var slashes = findUnescapedSlashes(argString) || [];\n      if (!slashes.length) return [];\n      var tokens = [];\n      if (slashes[0] !== 0) return;\n      for (var i = 0; i < slashes.length; i++) {\n        if (typeof slashes[i] == 'number')\n          tokens.push(argString.substring(slashes[i] + 1, slashes[i+1]));\n      }\n      return tokens;\n    }\n\n    function findUnescapedSlashes(str) {\n      var escapeNextChar = false;\n      var slashes = [];\n      for (var i = 0; i < str.length; i++) {\n        var c = str.charAt(i);\n        if (!escapeNextChar && c == '/') {\n          slashes.push(i);\n        }\n        escapeNextChar = !escapeNextChar && (c == '\\\\');\n      }\n      return slashes;\n    }\n    function translateRegex(str) {\n      var specials = '|(){';\n      var unescape = '}';\n      var escapeNextChar = false;\n      var out = [];\n      for (var i = -1; i < str.length; i++) {\n        var c = str.charAt(i) || '';\n        var n = str.charAt(i+1) || '';\n        var specialComesNext = (n && specials.indexOf(n) != -1);\n        if (escapeNextChar) {\n          if (c !== '\\\\' || !specialComesNext) {\n            out.push(c);\n          }\n          escapeNextChar = false;\n        } else {\n          if (c === '\\\\') {\n            escapeNextChar = true;\n            if (n && unescape.indexOf(n) != -1) {\n              specialComesNext = true;\n            }\n            if (!specialComesNext || n === '\\\\') {\n              out.push(c);\n            }\n          } else {\n            out.push(c);\n            if (specialComesNext && n !== '\\\\') {\n              out.push('\\\\');\n            }\n          }\n        }\n      }\n      return out.join('');\n    }\n    function translateRegexReplace(str) {\n      var escapeNextChar = false;\n      var out = [];\n      for (var i = -1; i < str.length; i++) {\n        var c = str.charAt(i) || '';\n        var n = str.charAt(i+1) || '';\n        if (escapeNextChar) {\n          out.push(c);\n          escapeNextChar = false;\n        } else {\n          if (c === '\\\\') {\n            escapeNextChar = true;\n            if ((isNumber(n) || n === '$')) {\n              out.push('$');\n            } else if (n !== '/' && n !== '\\\\') {\n              out.push('\\\\');\n            }\n          } else {\n            if (c === '$') {\n              out.push('$');\n            }\n            out.push(c);\n            if (n === '/') {\n              out.push('\\\\');\n            }\n          }\n        }\n      }\n      return out.join('');\n    }\n    function unescapeRegexReplace(str) {\n      var stream = new CodeMirror.StringStream(str);\n      var output = [];\n      while (!stream.eol()) {\n        while (stream.peek() && stream.peek() != '\\\\') {\n          output.push(stream.next());\n        }\n        if (stream.match('\\\\/', true)) {\n          output.push('/');\n        } else if (stream.match('\\\\\\\\', true)) {\n          output.push('\\\\');\n        } else {\n          output.push(stream.next());\n        }\n      }\n      return output.join('');\n    }\n    function parseQuery(query, ignoreCase, smartCase) {\n      var lastSearchRegister = vimGlobalState.registerController.getRegister('/');\n      lastSearchRegister.setText(query);\n      if (query instanceof RegExp) { return query; }\n      var slashes = findUnescapedSlashes(query);\n      var regexPart;\n      var forceIgnoreCase;\n      if (!slashes.length) {\n        regexPart = query;\n      } else {\n        regexPart = query.substring(0, slashes[0]);\n        var flagsPart = query.substring(slashes[0]);\n        forceIgnoreCase = (flagsPart.indexOf('i') != -1);\n      }\n      if (!regexPart) {\n        return null;\n      }\n      if (!getOption('pcre')) {\n        regexPart = translateRegex(regexPart);\n      }\n      if (smartCase) {\n        ignoreCase = (/^[^A-Z]*$/).test(regexPart);\n      }\n      var regexp = new RegExp(regexPart,\n          (ignoreCase || forceIgnoreCase) ? 'i' : undefined);\n      return regexp;\n    }\n    function showConfirm(cm, text) {\n      if (cm.openNotification) {\n        cm.openNotification('<span style=\"color: red\">' + text + '</span>',\n                            {bottom: true, duration: 5000});\n      } else {\n        alert(text);\n      }\n    }\n    function makePrompt(prefix, desc) {\n      var raw = '';\n      if (prefix) {\n        raw += '<span style=\"font-family: monospace\">' + prefix + '</span>';\n      }\n      raw += '<input type=\"text\"/> ' +\n          '<span style=\"color: #888\">';\n      if (desc) {\n        raw += '<span style=\"color: #888\">';\n        raw += desc;\n        raw += '</span>';\n      }\n      return raw;\n    }\n    var searchPromptDesc = '(Javascript regexp)';\n    function showPrompt(cm, options) {\n      var shortText = (options.prefix || '') + ' ' + (options.desc || '');\n      var prompt = makePrompt(options.prefix, options.desc);\n      dialog(cm, prompt, shortText, options.onClose, options);\n    }\n    function regexEqual(r1, r2) {\n      if (r1 instanceof RegExp && r2 instanceof RegExp) {\n          var props = ['global', 'multiline', 'ignoreCase', 'source'];\n          for (var i = 0; i < props.length; i++) {\n              var prop = props[i];\n              if (r1[prop] !== r2[prop]) {\n                  return false;\n              }\n          }\n          return true;\n      }\n      return false;\n    }\n    function updateSearchQuery(cm, rawQuery, ignoreCase, smartCase) {\n      if (!rawQuery) {\n        return;\n      }\n      var state = getSearchState(cm);\n      var query = parseQuery(rawQuery, !!ignoreCase, !!smartCase);\n      if (!query) {\n        return;\n      }\n      highlightSearchMatches(cm, query);\n      if (regexEqual(query, state.getQuery())) {\n        return query;\n      }\n      state.setQuery(query);\n      return query;\n    }\n    function searchOverlay(query) {\n      if (query.source.charAt(0) == '^') {\n        var matchSol = true;\n      }\n      return {\n        token: function(stream) {\n          if (matchSol && !stream.sol()) {\n            stream.skipToEnd();\n            return;\n          }\n          var match = stream.match(query, false);\n          if (match) {\n            if (match[0].length == 0) {\n              stream.next();\n              return 'searching';\n            }\n            if (!stream.sol()) {\n              stream.backUp(1);\n              if (!query.exec(stream.next() + match[0])) {\n                stream.next();\n                return null;\n              }\n            }\n            stream.match(query);\n            return 'searching';\n          }\n          while (!stream.eol()) {\n            stream.next();\n            if (stream.match(query, false)) break;\n          }\n        },\n        query: query\n      };\n    }\n    function highlightSearchMatches(cm, query) {\n      var overlay = getSearchState(cm).getOverlay();\n      if (!overlay || query != overlay.query) {\n        if (overlay) {\n          cm.removeOverlay(overlay);\n        }\n        overlay = searchOverlay(query);\n        cm.addOverlay(overlay);\n        getSearchState(cm).setOverlay(overlay);\n      }\n    }\n    function findNext(cm, prev, query, repeat) {\n      if (repeat === undefined) { repeat = 1; }\n      return cm.operation(function() {\n        var pos = cm.getCursor();\n        var cursor = cm.getSearchCursor(query, pos);\n        for (var i = 0; i < repeat; i++) {\n          var found = cursor.find(prev);\n          if (i == 0 && found && cursorEqual(cursor.from(), pos)) { found = cursor.find(prev); }\n          if (!found) {\n            cursor = cm.getSearchCursor(query,\n                (prev) ? Pos(cm.lastLine()) : Pos(cm.firstLine(), 0) );\n            if (!cursor.find(prev)) {\n              return;\n            }\n          }\n        }\n        return cursor.from();\n      });\n    }\n    function clearSearchHighlight(cm) {\n      cm.removeOverlay(getSearchState(cm).getOverlay());\n      getSearchState(cm).setOverlay(null);\n    }\n    function isInRange(pos, start, end) {\n      if (typeof pos != 'number') {\n        pos = pos.line;\n      }\n      if (start instanceof Array) {\n        return inArray(pos, start);\n      } else {\n        if (end) {\n          return (pos >= start && pos <= end);\n        } else {\n          return pos == start;\n        }\n      }\n    }\n    function getUserVisibleLines(cm) {\n      var renderer = cm.ace.renderer;\n      return {\n        top: renderer.getFirstFullyVisibleRow(),\n        bottom: renderer.getLastFullyVisibleRow()\n      }\n    }\n    var defaultExCommandMap = [\n      { name: 'map' },\n      { name: 'imap', shortName: 'im' },\n      { name: 'nmap', shortName: 'nm' },\n      { name: 'vmap', shortName: 'vm' },\n      { name: 'unmap' },\n      { name: 'write', shortName: 'w' },\n      { name: 'undo', shortName: 'u' },\n      { name: 'redo', shortName: 'red' },\n      { name: 'set', shortName: 'set' },\n      { name: 'sort', shortName: 'sor' },\n      { name: 'substitute', shortName: 's', possiblyAsync: true },\n      { name: 'nohlsearch', shortName: 'noh' },\n      { name: 'delmarks', shortName: 'delm' },\n      { name: 'registers', shortName: 'reg', excludeFromCommandHistory: true },\n      { name: 'global', shortName: 'g' }\n    ];\n    var ExCommandDispatcher = function() {\n      this.buildCommandMap_();\n    };\n    ExCommandDispatcher.prototype = {\n      processCommand: function(cm, input, opt_params) {\n        var vim = cm.state.vim;\n        var commandHistoryRegister = vimGlobalState.registerController.getRegister(':');\n        var previousCommand = commandHistoryRegister.toString();\n        if (vim.visualMode) {\n          exitVisualMode(cm);\n        }\n        var inputStream = new CodeMirror.StringStream(input);\n        commandHistoryRegister.setText(input);\n        var params = opt_params || {};\n        params.input = input;\n        try {\n          this.parseInput_(cm, inputStream, params);\n        } catch(e) {\n          showConfirm(cm, e);\n          throw e;\n        }\n        var command;\n        var commandName;\n        if (!params.commandName) {\n          if (params.line !== undefined) {\n            commandName = 'move';\n          }\n        } else {\n          command = this.matchCommand_(params.commandName);\n          if (command) {\n            commandName = command.name;\n            if (command.excludeFromCommandHistory) {\n              commandHistoryRegister.setText(previousCommand);\n            }\n            this.parseCommandArgs_(inputStream, params, command);\n            if (command.type == 'exToKey') {\n              for (var i = 0; i < command.toKeys.length; i++) {\n                CodeMirror.Vim.handleKey(cm, command.toKeys[i], 'mapping');\n              }\n              return;\n            } else if (command.type == 'exToEx') {\n              this.processCommand(cm, command.toInput);\n              return;\n            }\n          }\n        }\n        if (!commandName) {\n          showConfirm(cm, 'Not an editor command \":' + input + '\"');\n          return;\n        }\n        try {\n          exCommands[commandName](cm, params);\n          if ((!command || !command.possiblyAsync) && params.callback) {\n            params.callback();\n          }\n        } catch(e) {\n          showConfirm(cm, e);\n          throw e;\n        }\n      },\n      parseInput_: function(cm, inputStream, result) {\n        inputStream.eatWhile(':');\n        if (inputStream.eat('%')) {\n          result.line = cm.firstLine();\n          result.lineEnd = cm.lastLine();\n        } else {\n          result.line = this.parseLineSpec_(cm, inputStream);\n          if (result.line !== undefined && inputStream.eat(',')) {\n            result.lineEnd = this.parseLineSpec_(cm, inputStream);\n          }\n        }\n        var commandMatch = inputStream.match(/^(\\w+)/);\n        if (commandMatch) {\n          result.commandName = commandMatch[1];\n        } else {\n          result.commandName = inputStream.match(/.*/)[0];\n        }\n\n        return result;\n      },\n      parseLineSpec_: function(cm, inputStream) {\n        var numberMatch = inputStream.match(/^(\\d+)/);\n        if (numberMatch) {\n          return parseInt(numberMatch[1], 10) - 1;\n        }\n        switch (inputStream.next()) {\n          case '.':\n            return cm.getCursor().line;\n          case '$':\n            return cm.lastLine();\n          case '\\'':\n            var mark = cm.state.vim.marks[inputStream.next()];\n            if (mark && mark.find()) {\n              return mark.find().line;\n            }\n            throw new Error('Mark not set');\n          default:\n            inputStream.backUp(1);\n            return undefined;\n        }\n      },\n      parseCommandArgs_: function(inputStream, params, command) {\n        if (inputStream.eol()) {\n          return;\n        }\n        params.argString = inputStream.match(/.*/)[0];\n        var delim = command.argDelimiter || /\\s+/;\n        var args = trim(params.argString).split(delim);\n        if (args.length && args[0]) {\n          params.args = args;\n        }\n      },\n      matchCommand_: function(commandName) {\n        for (var i = commandName.length; i > 0; i--) {\n          var prefix = commandName.substring(0, i);\n          if (this.commandMap_[prefix]) {\n            var command = this.commandMap_[prefix];\n            if (command.name.indexOf(commandName) === 0) {\n              return command;\n            }\n          }\n        }\n        return null;\n      },\n      buildCommandMap_: function() {\n        this.commandMap_ = {};\n        for (var i = 0; i < defaultExCommandMap.length; i++) {\n          var command = defaultExCommandMap[i];\n          var key = command.shortName || command.name;\n          this.commandMap_[key] = command;\n        }\n      },\n      map: function(lhs, rhs, ctx) {\n        if (lhs != ':' && lhs.charAt(0) == ':') {\n          if (ctx) { throw Error('Mode not supported for ex mappings'); }\n          var commandName = lhs.substring(1);\n          if (rhs != ':' && rhs.charAt(0) == ':') {\n            this.commandMap_[commandName] = {\n              name: commandName,\n              type: 'exToEx',\n              toInput: rhs.substring(1),\n              user: true\n            };\n          } else {\n            this.commandMap_[commandName] = {\n              name: commandName,\n              type: 'exToKey',\n              toKeys: rhs,\n              user: true\n            };\n          }\n        } else {\n          if (rhs != ':' && rhs.charAt(0) == ':') {\n            var mapping = {\n              keys: lhs,\n              type: 'keyToEx',\n              exArgs: { input: rhs.substring(1) },\n              user: true};\n            if (ctx) { mapping.context = ctx; }\n            defaultKeymap.unshift(mapping);\n          } else {\n            var mapping = {\n              keys: lhs,\n              type: 'keyToKey',\n              toKeys: rhs,\n              user: true\n            };\n            if (ctx) { mapping.context = ctx; }\n            defaultKeymap.unshift(mapping);\n          }\n        }\n      },\n      unmap: function(lhs, ctx) {\n        if (lhs != ':' && lhs.charAt(0) == ':') {\n          if (ctx) { throw Error('Mode not supported for ex mappings'); }\n          var commandName = lhs.substring(1);\n          if (this.commandMap_[commandName] && this.commandMap_[commandName].user) {\n            delete this.commandMap_[commandName];\n            return;\n          }\n        } else {\n          var keys = lhs;\n          for (var i = 0; i < defaultKeymap.length; i++) {\n            if (keys == defaultKeymap[i].keys\n                && defaultKeymap[i].context === ctx\n                && defaultKeymap[i].user) {\n              defaultKeymap.splice(i, 1);\n              return;\n            }\n          }\n        }\n        throw Error('No such mapping.');\n      }\n    };\n\n    var exCommands = {\n      map: function(cm, params, ctx) {\n        var mapArgs = params.args;\n        if (!mapArgs || mapArgs.length < 2) {\n          if (cm) {\n            showConfirm(cm, 'Invalid mapping: ' + params.input);\n          }\n          return;\n        }\n        exCommandDispatcher.map(mapArgs[0], mapArgs[1], ctx);\n      },\n      imap: function(cm, params) { this.map(cm, params, 'insert'); },\n      nmap: function(cm, params) { this.map(cm, params, 'normal'); },\n      vmap: function(cm, params) { this.map(cm, params, 'visual'); },\n      unmap: function(cm, params, ctx) {\n        var mapArgs = params.args;\n        if (!mapArgs || mapArgs.length < 1) {\n          if (cm) {\n            showConfirm(cm, 'No such mapping: ' + params.input);\n          }\n          return;\n        }\n        exCommandDispatcher.unmap(mapArgs[0], ctx);\n      },\n      move: function(cm, params) {\n        commandDispatcher.processCommand(cm, cm.state.vim, {\n            type: 'motion',\n            motion: 'moveToLineOrEdgeOfDocument',\n            motionArgs: { forward: false, explicitRepeat: true,\n              linewise: true },\n            repeatOverride: params.line+1});\n      },\n      set: function(cm, params) {\n        var setArgs = params.args;\n        if (!setArgs || setArgs.length < 1) {\n          if (cm) {\n            showConfirm(cm, 'Invalid mapping: ' + params.input);\n          }\n          return;\n        }\n        var expr = setArgs[0].split('=');\n        var optionName = expr[0];\n        var value = expr[1];\n        var forceGet = false;\n\n        if (optionName.charAt(optionName.length - 1) == '?') {\n          if (value) { throw Error('Trailing characters: ' + params.argString); }\n          optionName = optionName.substring(0, optionName.length - 1);\n          forceGet = true;\n        }\n        if (value === undefined && optionName.substring(0, 2) == 'no') {\n          optionName = optionName.substring(2);\n          value = false;\n        }\n        var optionIsBoolean = options[optionName] && options[optionName].type == 'boolean';\n        if (optionIsBoolean && value == undefined) {\n          value = true;\n        }\n        if (!optionIsBoolean && !value || forceGet) {\n          var oldValue = getOption(optionName);\n          if (oldValue === true || oldValue === false) {\n            showConfirm(cm, ' ' + (oldValue ? '' : 'no') + optionName);\n          } else {\n            showConfirm(cm, '  ' + optionName + '=' + oldValue);\n          }\n        } else {\n          setOption(optionName, value, cm);\n        }\n      },\n      registers: function(cm,params) {\n        var regArgs = params.args;\n        var registers = vimGlobalState.registerController.registers;\n        var regInfo = '----------Registers----------<br><br>';\n        if (!regArgs) {\n          for (var registerName in registers) {\n            var text = registers[registerName].toString();\n            if (text.length) {\n              regInfo += '\"' + registerName + '    ' + text + '<br>';\n            }\n          }\n        } else {\n          var registerName;\n          regArgs = regArgs.join('');\n          for (var i = 0; i < regArgs.length; i++) {\n            registerName = regArgs.charAt(i);\n            if (!vimGlobalState.registerController.isValidRegister(registerName)) {\n              continue;\n            }\n            var register = registers[registerName] || new Register();\n            regInfo += '\"' + registerName + '    ' + register.toString() + '<br>';\n          }\n        }\n        showConfirm(cm, regInfo);\n      },\n      sort: function(cm, params) {\n        var reverse, ignoreCase, unique, number;\n        function parseArgs() {\n          if (params.argString) {\n            var args = new CodeMirror.StringStream(params.argString);\n            if (args.eat('!')) { reverse = true; }\n            if (args.eol()) { return; }\n            if (!args.eatSpace()) { return 'Invalid arguments'; }\n            var opts = args.match(/[a-z]+/);\n            if (opts) {\n              opts = opts[0];\n              ignoreCase = opts.indexOf('i') != -1;\n              unique = opts.indexOf('u') != -1;\n              var decimal = opts.indexOf('d') != -1 && 1;\n              var hex = opts.indexOf('x') != -1 && 1;\n              var octal = opts.indexOf('o') != -1 && 1;\n              if (decimal + hex + octal > 1) { return 'Invalid arguments'; }\n              number = decimal && 'decimal' || hex && 'hex' || octal && 'octal';\n            }\n            if (args.eatSpace() && args.match(/\\/.*\\//)) { 'patterns not supported'; }\n          }\n        }\n        var err = parseArgs();\n        if (err) {\n          showConfirm(cm, err + ': ' + params.argString);\n          return;\n        }\n        var lineStart = params.line || cm.firstLine();\n        var lineEnd = params.lineEnd || params.line || cm.lastLine();\n        if (lineStart == lineEnd) { return; }\n        var curStart = Pos(lineStart, 0);\n        var curEnd = Pos(lineEnd, lineLength(cm, lineEnd));\n        var text = cm.getRange(curStart, curEnd).split('\\n');\n        var numberRegex = (number == 'decimal') ? /(-?)([\\d]+)/ :\n           (number == 'hex') ? /(-?)(?:0x)?([0-9a-f]+)/i :\n           (number == 'octal') ? /([0-7]+)/ : null;\n        var radix = (number == 'decimal') ? 10 : (number == 'hex') ? 16 : (number == 'octal') ? 8 : null;\n        var numPart = [], textPart = [];\n        if (number) {\n          for (var i = 0; i < text.length; i++) {\n            if (numberRegex.exec(text[i])) {\n              numPart.push(text[i]);\n            } else {\n              textPart.push(text[i]);\n            }\n          }\n        } else {\n          textPart = text;\n        }\n        function compareFn(a, b) {\n          if (reverse) { var tmp; tmp = a; a = b; b = tmp; }\n          if (ignoreCase) { a = a.toLowerCase(); b = b.toLowerCase(); }\n          var anum = number && numberRegex.exec(a);\n          var bnum = number && numberRegex.exec(b);\n          if (!anum) { return a < b ? -1 : 1; }\n          anum = parseInt((anum[1] + anum[2]).toLowerCase(), radix);\n          bnum = parseInt((bnum[1] + bnum[2]).toLowerCase(), radix);\n          return anum - bnum;\n        }\n        numPart.sort(compareFn);\n        textPart.sort(compareFn);\n        text = (!reverse) ? textPart.concat(numPart) : numPart.concat(textPart);\n        if (unique) { // Remove duplicate lines\n          var textOld = text;\n          var lastLine;\n          text = [];\n          for (var i = 0; i < textOld.length; i++) {\n            if (textOld[i] != lastLine) {\n              text.push(textOld[i]);\n            }\n            lastLine = textOld[i];\n          }\n        }\n        cm.replaceRange(text.join('\\n'), curStart, curEnd);\n      },\n      global: function(cm, params) {\n        var argString = params.argString;\n        if (!argString) {\n          showConfirm(cm, 'Regular Expression missing from global');\n          return;\n        }\n        var lineStart = (params.line !== undefined) ? params.line : cm.firstLine();\n        var lineEnd = params.lineEnd || params.line || cm.lastLine();\n        var tokens = splitBySlash(argString);\n        var regexPart = argString, cmd;\n        if (tokens.length) {\n          regexPart = tokens[0];\n          cmd = tokens.slice(1, tokens.length).join('/');\n        }\n        if (regexPart) {\n          try {\n           updateSearchQuery(cm, regexPart, true /** ignoreCase */,\n             true /** smartCase */);\n          } catch (e) {\n           showConfirm(cm, 'Invalid regex: ' + regexPart);\n           return;\n          }\n        }\n        var query = getSearchState(cm).getQuery();\n        var matchedLines = [], content = '';\n        for (var i = lineStart; i <= lineEnd; i++) {\n          var matched = query.test(cm.getLine(i));\n          if (matched) {\n            matchedLines.push(i+1);\n            content+= cm.getLine(i) + '<br>';\n          }\n        }\n        if (!cmd) {\n          showConfirm(cm, content);\n          return;\n        }\n        var index = 0;\n        var nextCommand = function() {\n          if (index < matchedLines.length) {\n            var command = matchedLines[index] + cmd;\n            exCommandDispatcher.processCommand(cm, command, {\n              callback: nextCommand\n            });\n          }\n          index++;\n        };\n        nextCommand();\n      },\n      substitute: function(cm, params) {\n        if (!cm.getSearchCursor) {\n          throw new Error('Search feature not available. Requires searchcursor.js or ' +\n              'any other getSearchCursor implementation.');\n        }\n        var argString = params.argString;\n        var tokens = argString ? splitBySlash(argString) : [];\n        var regexPart, replacePart = '', trailing, flagsPart, count;\n        var confirm = false; // Whether to confirm each replace.\n        var global = false; // True to replace all instances on a line, false to replace only 1.\n        if (tokens.length) {\n          regexPart = tokens[0];\n          replacePart = tokens[1];\n          if (replacePart !== undefined) {\n            if (getOption('pcre')) {\n              replacePart = unescapeRegexReplace(replacePart);\n            } else {\n              replacePart = translateRegexReplace(replacePart);\n            }\n            vimGlobalState.lastSubstituteReplacePart = replacePart;\n          }\n          trailing = tokens[2] ? tokens[2].split(' ') : [];\n        } else {\n          if (argString && argString.length) {\n            showConfirm(cm, 'Substitutions should be of the form ' +\n                ':s/pattern/replace/');\n            return;\n          }\n        }\n        if (trailing) {\n          flagsPart = trailing[0];\n          count = parseInt(trailing[1]);\n          if (flagsPart) {\n            if (flagsPart.indexOf('c') != -1) {\n              confirm = true;\n              flagsPart.replace('c', '');\n            }\n            if (flagsPart.indexOf('g') != -1) {\n              global = true;\n              flagsPart.replace('g', '');\n            }\n            regexPart = regexPart + '/' + flagsPart;\n          }\n        }\n        if (regexPart) {\n          try {\n            updateSearchQuery(cm, regexPart, true /** ignoreCase */,\n              true /** smartCase */);\n          } catch (e) {\n            showConfirm(cm, 'Invalid regex: ' + regexPart);\n            return;\n          }\n        }\n        replacePart = replacePart || vimGlobalState.lastSubstituteReplacePart;\n        if (replacePart === undefined) {\n          showConfirm(cm, 'No previous substitute regular expression');\n          return;\n        }\n        var state = getSearchState(cm);\n        var query = state.getQuery();\n        var lineStart = (params.line !== undefined) ? params.line : cm.getCursor().line;\n        var lineEnd = params.lineEnd || lineStart;\n        if (count) {\n          lineStart = lineEnd;\n          lineEnd = lineStart + count - 1;\n        }\n        var startPos = clipCursorToContent(cm, Pos(lineStart, 0));\n        var cursor = cm.getSearchCursor(query, startPos);\n        doReplace(cm, confirm, global, lineStart, lineEnd, cursor, query, replacePart, params.callback);\n      },\n      redo: CodeMirror.commands.redo,\n      undo: CodeMirror.commands.undo,\n      write: function(cm) {\n        if (CodeMirror.commands.save) {\n          CodeMirror.commands.save(cm);\n        } else {\n          cm.save();\n        }\n      },\n      nohlsearch: function(cm) {\n        clearSearchHighlight(cm);\n      },\n      delmarks: function(cm, params) {\n        if (!params.argString || !trim(params.argString)) {\n          showConfirm(cm, 'Argument required');\n          return;\n        }\n\n        var state = cm.state.vim;\n        var stream = new CodeMirror.StringStream(trim(params.argString));\n        while (!stream.eol()) {\n          stream.eatSpace();\n          var count = stream.pos;\n\n          if (!stream.match(/[a-zA-Z]/, false)) {\n            showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));\n            return;\n          }\n\n          var sym = stream.next();\n          if (stream.match('-', true)) {\n            if (!stream.match(/[a-zA-Z]/, false)) {\n              showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));\n              return;\n            }\n\n            var startMark = sym;\n            var finishMark = stream.next();\n            if (isLowerCase(startMark) && isLowerCase(finishMark) ||\n                isUpperCase(startMark) && isUpperCase(finishMark)) {\n              var start = startMark.charCodeAt(0);\n              var finish = finishMark.charCodeAt(0);\n              if (start >= finish) {\n                showConfirm(cm, 'Invalid argument: ' + params.argString.substring(count));\n                return;\n              }\n              for (var j = 0; j <= finish - start; j++) {\n                var mark = String.fromCharCode(start + j);\n                delete state.marks[mark];\n              }\n            } else {\n              showConfirm(cm, 'Invalid argument: ' + startMark + '-');\n              return;\n            }\n          } else {\n            delete state.marks[sym];\n          }\n        }\n      }\n    };\n\n    var exCommandDispatcher = new ExCommandDispatcher();\n    function doReplace(cm, confirm, global, lineStart, lineEnd, searchCursor, query,\n        replaceWith, callback) {\n      cm.state.vim.exMode = true;\n      var done = false;\n      var lastPos = searchCursor.from();\n      function replaceAll() {\n        cm.operation(function() {\n          while (!done) {\n            replace();\n            next();\n          }\n          stop();\n        });\n      }\n      function replace() {\n        var text = cm.getRange(searchCursor.from(), searchCursor.to());\n        var newText = text.replace(query, replaceWith);\n        searchCursor.replace(newText);\n      }\n      function next() {\n        var found;\n        while(found = searchCursor.findNext() &&\n              isInRange(searchCursor.from(), lineStart, lineEnd)) {\n          if (!global && lastPos && searchCursor.from().line == lastPos.line) {\n            continue;\n          }\n          cm.scrollIntoView(searchCursor.from(), 30);\n          cm.setSelection(searchCursor.from(), searchCursor.to());\n          lastPos = searchCursor.from();\n          done = false;\n          return;\n        }\n        done = true;\n      }\n      function stop(close) {\n        if (close) { close(); }\n        cm.focus();\n        if (lastPos) {\n          cm.setCursor(lastPos);\n          var vim = cm.state.vim;\n          vim.exMode = false;\n          vim.lastHPos = vim.lastHSPos = lastPos.ch;\n        }\n        if (callback) { callback(); }\n      }\n      function onPromptKeyDown(e, _value, close) {\n        CodeMirror.e_stop(e);\n        var keyName = CodeMirror.keyName(e);\n        switch (keyName) {\n          case 'Y':\n            replace(); next(); break;\n          case 'N':\n            next(); break;\n          case 'A':\n            var savedCallback = callback;\n            callback = undefined;\n            cm.operation(replaceAll);\n            callback = savedCallback;\n            break;\n          case 'L':\n            replace();\n          case 'Q':\n          case 'Esc':\n          case 'Ctrl-C':\n          case 'Ctrl-[':\n            stop(close);\n            break;\n        }\n        if (done) { stop(close); }\n        return true;\n      }\n      next();\n      if (done) {\n        showConfirm(cm, 'No matches for ' + query.source);\n        return;\n      }\n      if (!confirm) {\n        replaceAll();\n        if (callback) { callback(); };\n        return;\n      }\n      showPrompt(cm, {\n        prefix: 'replace with <strong>' + replaceWith + '</strong> (y/n/a/q/l)',\n        onKeyDown: onPromptKeyDown\n      });\n    }\n\n    CodeMirror.keyMap.vim = {\n      attach: attachVimMap,\n      detach: detachVimMap\n    };\n\n    function exitInsertMode(cm) {\n      var vim = cm.state.vim;\n      var macroModeState = vimGlobalState.macroModeState;\n      var insertModeChangeRegister = vimGlobalState.registerController.getRegister('.');\n      var isPlaying = macroModeState.isPlaying;\n      var lastChange = macroModeState.lastInsertModeChanges;\n      var text = [];\n      if (!isPlaying) {\n        var selLength = lastChange.inVisualBlock ? vim.lastSelection.visualBlock.height : 1;\n        var changes = lastChange.changes;\n        var text = [];\n        var i = 0;\n        while (i < changes.length) {\n          text.push(changes[i]);\n          if (changes[i] instanceof InsertModeKey) {\n             i++;\n          } else {\n             i+= selLength;\n          }\n        }\n        lastChange.changes = text;\n        cm.off('change', onChange);\n        CodeMirror.off(cm.getInputField(), 'keydown', onKeyEventTargetKeyDown);\n      }\n      if (!isPlaying && vim.insertModeRepeat > 1) {\n        repeatLastEdit(cm, vim, vim.insertModeRepeat - 1,\n            true /** repeatForInsert */);\n        vim.lastEditInputState.repeatOverride = vim.insertModeRepeat;\n      }\n      delete vim.insertModeRepeat;\n      vim.insertMode = false;\n      cm.setCursor(cm.getCursor().line, cm.getCursor().ch-1);\n      cm.setOption('keyMap', 'vim');\n      cm.setOption('disableInput', true);\n      cm.toggleOverwrite(false); // exit replace mode if we were in it.\n      insertModeChangeRegister.setText(lastChange.changes.join(''));\n      CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"normal\"});\n      if (macroModeState.isRecording) {\n        logInsertModeChange(macroModeState);\n      }\n    }\n    defineOption('insertModeEscKeysTimeout', 200, 'number');\n\n    CodeMirror.keyMap['vim-insert'] = {\n      'Ctrl-N': 'autocomplete',\n      'Ctrl-P': 'autocomplete',\n      'Enter': function(cm) {\n        var fn = CodeMirror.commands.newlineAndIndentContinueComment ||\n            CodeMirror.commands.newlineAndIndent;\n        fn(cm);\n      },\n      fallthrough: ['default'],\n      attach: attachVimMap,\n      detach: detachVimMap\n    };\n\n    CodeMirror.keyMap['await-second'] = {\n      fallthrough: ['vim-insert'],\n      attach: attachVimMap,\n      detach: detachVimMap\n    };\n\n    CodeMirror.keyMap['vim-replace'] = {\n      'Backspace': 'goCharLeft',\n      fallthrough: ['vim-insert'],\n      attach: attachVimMap,\n      detach: detachVimMap\n    };\n\n    function executeMacroRegister(cm, vim, macroModeState, registerName) {\n      var register = vimGlobalState.registerController.getRegister(registerName);\n      var keyBuffer = register.keyBuffer;\n      var imc = 0;\n      macroModeState.isPlaying = true;\n      macroModeState.replaySearchQueries = register.searchQueries.slice(0);\n      for (var i = 0; i < keyBuffer.length; i++) {\n        var text = keyBuffer[i];\n        var match, key;\n        while (text) {\n          match = (/<\\w+-.+?>|<\\w+>|./).exec(text);\n          key = match[0];\n          text = text.substring(match.index + key.length);\n          CodeMirror.Vim.handleKey(cm, key, 'macro');\n          if (vim.insertMode) {\n            var changes = register.insertModeChanges[imc++].changes;\n            vimGlobalState.macroModeState.lastInsertModeChanges.changes =\n                changes;\n            repeatInsertModeChanges(cm, changes, 1);\n            exitInsertMode(cm);\n          }\n        }\n      };\n      macroModeState.isPlaying = false;\n    }\n\n    function logKey(macroModeState, key) {\n      if (macroModeState.isPlaying) { return; }\n      var registerName = macroModeState.latestRegister;\n      var register = vimGlobalState.registerController.getRegister(registerName);\n      if (register) {\n        register.pushText(key);\n      }\n    }\n\n    function logInsertModeChange(macroModeState) {\n      if (macroModeState.isPlaying) { return; }\n      var registerName = macroModeState.latestRegister;\n      var register = vimGlobalState.registerController.getRegister(registerName);\n      if (register) {\n        register.pushInsertModeChanges(macroModeState.lastInsertModeChanges);\n      }\n    }\n\n    function logSearchQuery(macroModeState, query) {\n      if (macroModeState.isPlaying) { return; }\n      var registerName = macroModeState.latestRegister;\n      var register = vimGlobalState.registerController.getRegister(registerName);\n      if (register) {\n        register.pushSearchQuery(query);\n      }\n    }\n    function onChange(_cm, changeObj) {\n      var macroModeState = vimGlobalState.macroModeState;\n      var lastChange = macroModeState.lastInsertModeChanges;\n      if (!macroModeState.isPlaying) {\n        while(changeObj) {\n          lastChange.expectCursorActivityForChange = true;\n          if (changeObj.origin == '+input' || changeObj.origin == 'paste'\n              || changeObj.origin === undefined /* only in testing */) {\n            var text = changeObj.text.join('\\n');\n            lastChange.changes.push(text);\n          }\n          changeObj = changeObj.next;\n        }\n      }\n    }\n    function onCursorActivity(cm) {\n      var vim = cm.state.vim;\n      if (vim.insertMode) {\n        var macroModeState = vimGlobalState.macroModeState;\n        if (macroModeState.isPlaying) { return; }\n        var lastChange = macroModeState.lastInsertModeChanges;\n        if (lastChange.expectCursorActivityForChange) {\n          lastChange.expectCursorActivityForChange = false;\n        } else {\n          lastChange.changes = [];\n        }\n      } else if (!cm.curOp.isVimOp) {\n        handleExternalSelection(cm, vim);\n      }\n      if (vim.visualMode) {\n        updateFakeCursor(cm);\n      }\n    }\n    function updateFakeCursor(cm) {\n      var vim = cm.state.vim;\n      var from = copyCursor(vim.sel.head);\n      var to = offsetCursor(from, 0, 1);\n      if (vim.fakeCursor) {\n        vim.fakeCursor.clear();\n      }\n      vim.fakeCursor = cm.markText(from, to, {className: 'cm-animate-fat-cursor'});\n    }\n    function handleExternalSelection(cm, vim) {\n      var anchor = cm.getCursor('anchor');\n      var head = cm.getCursor('head');\n      if (vim.visualMode && cursorEqual(head, anchor) && lineLength(cm, head.line) > head.ch) {\n        exitVisualMode(cm, false);\n      } else if (!vim.visualMode && !vim.insertMode && cm.somethingSelected()) {\n        vim.visualMode = true;\n        vim.visualLine = false;\n        CodeMirror.signal(cm, \"vim-mode-change\", {mode: \"visual\"});\n      }\n      if (vim.visualMode) {\n        var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0;\n        var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0;\n        head = offsetCursor(head, 0, headOffset);\n        anchor = offsetCursor(anchor, 0, anchorOffset);\n        vim.sel = {\n          anchor: anchor,\n          head: head\n        };\n        updateMark(cm, vim, '<', cursorMin(head, anchor));\n        updateMark(cm, vim, '>', cursorMax(head, anchor));\n      } else if (!vim.insertMode) {\n        vim.lastHPos = cm.getCursor().ch;\n      }\n    }\n    function InsertModeKey(keyName) {\n      this.keyName = keyName;\n    }\n    function onKeyEventTargetKeyDown(e) {\n      var macroModeState = vimGlobalState.macroModeState;\n      var lastChange = macroModeState.lastInsertModeChanges;\n      var keyName = CodeMirror.keyName(e);\n      function onKeyFound() {\n        lastChange.changes.push(new InsertModeKey(keyName));\n        return true;\n      }\n      if (keyName.indexOf('Delete') != -1 || keyName.indexOf('Backspace') != -1) {\n        CodeMirror.lookupKey(keyName, 'vim-insert', onKeyFound);\n      }\n    }\n    function repeatLastEdit(cm, vim, repeat, repeatForInsert) {\n      var macroModeState = vimGlobalState.macroModeState;\n      macroModeState.isPlaying = true;\n      var isAction = !!vim.lastEditActionCommand;\n      var cachedInputState = vim.inputState;\n      function repeatCommand() {\n        if (isAction) {\n          commandDispatcher.processAction(cm, vim, vim.lastEditActionCommand);\n        } else {\n          commandDispatcher.evalInput(cm, vim);\n        }\n      }\n      function repeatInsert(repeat) {\n        if (macroModeState.lastInsertModeChanges.changes.length > 0) {\n          repeat = !vim.lastEditActionCommand ? 1 : repeat;\n          var changeObject = macroModeState.lastInsertModeChanges;\n          repeatInsertModeChanges(cm, changeObject.changes, repeat);\n        }\n      }\n      vim.inputState = vim.lastEditInputState;\n      if (isAction && vim.lastEditActionCommand.interlaceInsertRepeat) {\n        for (var i = 0; i < repeat; i++) {\n          repeatCommand();\n          repeatInsert(1);\n        }\n      } else {\n        if (!repeatForInsert) {\n          repeatCommand();\n        }\n        repeatInsert(repeat);\n      }\n      vim.inputState = cachedInputState;\n      if (vim.insertMode && !repeatForInsert) {\n        exitInsertMode(cm);\n      }\n      macroModeState.isPlaying = false;\n    };\n\n    function repeatInsertModeChanges(cm, changes, repeat) {\n      function keyHandler(binding) {\n        if (typeof binding == 'string') {\n          CodeMirror.commands[binding](cm);\n        } else {\n          binding(cm);\n        }\n        return true;\n      }\n      var head = cm.getCursor('head');\n      var inVisualBlock = vimGlobalState.macroModeState.lastInsertModeChanges.inVisualBlock;\n      if (inVisualBlock) {\n        var vim = cm.state.vim;\n        var lastSel = vim.lastSelection;\n        var offset = getOffset(lastSel.anchor, lastSel.head);\n        selectForInsert(cm, head, offset.line + 1);\n        repeat = cm.listSelections().length;\n        cm.setCursor(head);\n      }\n      for (var i = 0; i < repeat; i++) {\n        if (inVisualBlock) {\n          cm.setCursor(offsetCursor(head, i, 0));\n        }\n        for (var j = 0; j < changes.length; j++) {\n          var change = changes[j];\n          if (change instanceof InsertModeKey) {\n            CodeMirror.lookupKey(change.keyName, 'vim-insert', keyHandler);\n          } else {\n            var cur = cm.getCursor();\n            cm.replaceRange(change, cur, cur);\n          }\n        }\n      }\n      if (inVisualBlock) {\n        cm.setCursor(offsetCursor(head, 0, 1));\n      }\n    }\n\n    resetVimGlobalState();\n  CodeMirror.Vim = Vim();\n\n  Vim = CodeMirror.Vim;\n\n  specialKey = {'return':'CR',backspace:'BS','delete':'Del',esc:'Esc',\n    left:'Left',right:'Right',up:'Up',down:'Down',space: 'Space',\n    home:'Home',end:'End',pageup:'PageUp',pagedown:'PageDown', enter: 'CR'\n  };\n  function lookupKey(hashId, key, e) {\n    if (key.length > 1 && key[0] == \"n\") {\n      key = key.replace(\"numpad\", \"\");\n    }\n    key = specialKey[key] || key;\n    var name = '';\n    if (e.ctrlKey) { name += 'C-'; }\n    if (e.altKey) { name += 'A-'; }\n    if (e.shiftKey) { name += 'S-'; }\n\n    name += key;\n    if (name.length > 1) { name = '<' + name + '>'; }\n    return name;\n  }\n  var handleKey = Vim.handleKey\n  Vim.handleKey = function(cm, key, origin) {\n    return cm.operation(function() {\n      return handleKey(cm, key, origin);\n    }, true);\n  }\n  function cloneVimState(state) {\n    var n = new state.constructor();\n    Object.keys(state).forEach(function(key) {\n      var o = state[key];\n      if (Array.isArray(o))\n        o = o.slice();\n      else if (o && typeof o == \"object\" && o.constructor != Object)\n        o = cloneVimState(o);\n      n[key] = o;\n    });\n    if (state.sel) {\n      n.sel = {\n        head: state.sel.head && copyCursor(state.sel.head),\n        anchor: state.sel.anchor && copyCursor(state.sel.anchor)\n      };\n    }\n    return n;\n  }\n  function multiSelectHandleKey(cm, key, origin) {\n    var isHandled = false;\n    var vim = Vim.maybeInitVimState_(cm);\n    var visualBlock = vim.visualBlock || vim.wasInVisualBlock;\n    if (vim.wasInVisualBlock && !cm.ace.inMultiSelectMode) {\n      vim.wasInVisualBlock = false;\n    } else if (cm.ace.inMultiSelectMode && vim.visualBlock) {\n       vim.wasInVisualBlock = true;\n    }\n    \n    if (key == '<Esc>' && !vim.insertMode && !vim.visualMode && cm.ace.inMultiSelectMode) {\n      cm.ace.exitMultiSelectMode();\n    } else if (visualBlock || !cm.ace.inMultiSelectMode || cm.ace.inVirtualSelectionMode) {\n      isHandled = Vim.handleKey(cm, key, origin);\n    } else {\n      var old = cloneVimState(vim);\n      cm.operation(function() {\n        cm.ace.forEachSelection(function() {\n          var sel = cm.ace.selection;\n          cm.state.vim.lastHPos = sel.$desiredColumn == null ? sel.lead.column : sel.$desiredColumn;\n          var head = cm.getCursor(\"head\");\n          var anchor = cm.getCursor(\"anchor\");\n          var headOffset = !cursorIsBefore(head, anchor) ? -1 : 0;\n          var anchorOffset = cursorIsBefore(head, anchor) ? -1 : 0;\n          head = offsetCursor(head, 0, headOffset);\n          anchor = offsetCursor(anchor, 0, anchorOffset);\n          cm.state.vim.sel.head = head;\n          cm.state.vim.sel.anchor = anchor;\n          \n          isHandled = handleKey(cm, key, origin);\n          sel.$desiredColumn = cm.state.vim.lastHPos == -1 ? null : cm.state.vim.lastHPos;\n          if (cm.virtualSelectionMode()) {\n            cm.state.vim = cloneVimState(old);\n          }\n        });\n        if (cm.curOp.cursorActivity && !isHandled)\n          cm.curOp.cursorActivity = false;\n      }, true);\n    }\n    return isHandled;\n  };\n  exports.CodeMirror = CodeMirror;\n  var getVim = Vim.maybeInitVimState_;\n  exports.handler = {\n    $id: \"ace/keyboard/vim\",\n    drawCursor: function(style, pixelPos, config, sel, session) {\n      var vim = this.state.vim || {};\n      var w = config.characterWidth;\n      var h = config.lineHeight;\n      var top = pixelPos.top;\n      var left = pixelPos.left;\n      if (!vim.insertMode) {\n        var isbackwards = !sel.cursor \n            ? session.selection.isBackwards() || session.selection.isEmpty()\n            : Range.comparePoints(sel.cursor, sel.start) <= 0\n        if (!isbackwards && left > w)\n          left -= w\n      }     \n      if (!vim.insertMode && vim.status) {\n        h = h / 2;\n        top += h;\n      }\n      style.left = left + \"px\";\n      style.top =  top + \"px\";\n      style.width = w + \"px\";\n      style.height = h + \"px\";\n    },\n    handleKeyboard: function(data, hashId, key, keyCode, e) {\n      var editor = data.editor;\n      var cm = editor.state.cm;\n      var vim = getVim(cm);\n      if (keyCode == -1) return;\n      \n      if (key == \"c\" && hashId == 1) { // key == \"ctrl-c\"\n        if (!useragent.isMac && editor.getCopyText()) {\n          editor.once(\"copy\", function() {\n            editor.selection.clearSelection();\n          });\n          return {command: \"null\", passEvent: true};\n        }\n        return {command: coreCommands.stop};\n      } else if (!vim.insertMode) {\n        if (useragent.isMac && this.handleMacRepeat(data, hashId, key)) {\n          hashId = -1;\n          key = data.inputChar;\n        }\n      }\n      \n      if (hashId == -1 || hashId & 1 || hashId === 0 && key.length > 1) {\n        var insertMode = vim.insertMode;\n        var name = lookupKey(hashId, key, e || {});\n        if (vim.status == null)\n          vim.status = \"\";\n        var isHandled = multiSelectHandleKey(cm, name, 'user');\n        vim = getVim(cm); // may be changed by multiSelectHandleKey\n        if (isHandled && vim.status != null)\n          vim.status += name;\n        else if (vim.status == null)\n          vim.status = \"\";\n        cm._signal(\"changeStatus\");\n        if (!isHandled && (hashId != -1 || insertMode))\n          return;\n        return {command: \"null\", passEvent: !isHandled};\n      }\n    },\n    attach: function(editor) {\n      if (!editor.state) editor.state = {};\n      var cm = new CodeMirror(editor);\n      editor.state.cm = cm;\n      editor.$vimModeHandler = this;\n      CodeMirror.keyMap.vim.attach(cm);\n      getVim(cm).status = null;\n      cm.on('vim-command-done', function() {\n        if (cm.virtualSelectionMode()) return;\n        getVim(cm).status = null;\n        cm.ace._signal(\"changeStatus\");\n        cm.ace.session.markUndoGroup();\n      });\n      cm.on(\"changeStatus\", function() {\n        cm.ace.renderer.updateCursor();\n        cm.ace._signal(\"changeStatus\");\n      });\n      cm.on(\"vim-mode-change\", function() {\n        if (cm.virtualSelectionMode()) return;\n        cm.ace.renderer.setStyle(\"normal-mode\", !getVim(cm).insertMode);\n        cm._signal(\"changeStatus\");\n      });\n      cm.ace.renderer.setStyle(\"normal-mode\", !getVim(cm).insertMode);\n      editor.renderer.$cursorLayer.drawCursor = this.drawCursor.bind(cm);\n      this.updateMacCompositionHandlers(editor, true);\n    },\n    detach: function(editor) {\n      var cm = editor.state.cm;\n      CodeMirror.keyMap.vim.detach(cm);\n      cm.destroy();\n      editor.state.cm = null;\n      editor.$vimModeHandler = null;\n      editor.renderer.$cursorLayer.drawCursor = null;\n      editor.renderer.setStyle(\"normal-mode\", false);\n      this.updateMacCompositionHandlers(editor, false);\n    },\n    getStatusText: function(editor) {\n      var cm = editor.state.cm;\n      var vim = getVim(cm);\n      if (vim.insertMode)\n        return \"INSERT\";\n      var status = \"\";\n      if (vim.visualMode) {\n        status += \"VISUAL\";\n        if (vim.visualLine)\n          status += \" LINE\";\n        if (vim.visualBlock)\n          status += \" BLOCK\";\n      }\n      if (vim.status)\n        status += (status ? \" \" : \"\") + vim.status;\n      return status;\n    },\n    handleMacRepeat: function(data, hashId, key) {\n      if (hashId == -1) {\n        data.inputChar = key;\n        data.lastEvent = \"input\";\n      } else if (data.inputChar && data.$lastHash == hashId && data.$lastKey == key) {\n        if (data.lastEvent == \"input\") {\n          data.lastEvent = \"input1\";\n        } else if (data.lastEvent == \"input1\") {\n          return true;\n        }\n      } else {\n        data.$lastHash = hashId;\n        data.$lastKey = key;\n        data.lastEvent = \"keypress\";\n      }\n    },\n    updateMacCompositionHandlers: function(editor, enable) {\n      var onCompositionUpdateOverride = function(text) {\n        var cm = editor.state.cm;\n        var vim = getVim(cm);\n        if (!vim.insertMode) {\n          var el = this.textInput.getElement();\n          el.blur();\n          el.focus();\n          el.value = text;\n        } else {\n          this.onCompositionUpdateOrig(text);\n        }\n      };\n      var onCompositionStartOverride = function(text) {\n        var cm = editor.state.cm;\n        var vim = getVim(cm);\n        if (!vim.insertMode) {\n          this.onCompositionStartOrig(text);\n        }\n      };\n      if (enable) {\n        if (!editor.onCompositionUpdateOrig) {\n          editor.onCompositionUpdateOrig = editor.onCompositionUpdate;\n          editor.onCompositionUpdate = onCompositionUpdateOverride;\n          editor.onCompositionStartOrig = editor.onCompositionStart;\n          editor.onCompositionStart = onCompositionStartOverride;\n        }\n      } else {\n        if (editor.onCompositionUpdateOrig) {\n          editor.onCompositionUpdate = editor.onCompositionUpdateOrig;\n          editor.onCompositionUpdateOrig = null;\n          editor.onCompositionStart = editor.onCompositionStartOrig;\n          editor.onCompositionStartOrig = null;\n        }\n      }\n    }\n  }\n  var renderVirtualNumbers = {\n    getText: function(session, row) {\n      return (Math.abs(session.selection.lead.row - row)  || (row + 1 + (row < 9? \"\\xb7\" : \"\" ))) + \"\"\n    },\n    getWidth: function(session, lastLineNumber, config) {\n      return session.getLength().toString().length * config.characterWidth;\n    },\n    update: function(e, editor) {\n      editor.renderer.$loop.schedule(editor.renderer.CHANGE_GUTTER)\n    },\n    attach: function(editor) {\n      editor.renderer.$gutterLayer.$renderer = this;\n      editor.on(\"changeSelection\", this.update);\n    },\n    detach: function(editor) {\n      editor.renderer.$gutterLayer.$renderer = null;\n      editor.off(\"changeSelection\", this.update);\n    }\n  };\n  Vim.defineOption({\n    name: \"wrap\",\n    set: function(value, cm) {\n      if (cm) {cm.ace.setOption(\"wrap\", value)}\n    },\n    type: \"boolean\"\n  }, false);\n  defaultKeymap.push(\n    { keys: 'zc', type: 'action', action: 'fold', actionArgs: { open: false } },\n    { keys: 'zC', type: 'action', action: 'fold', actionArgs: { open: false, all: true } },\n    { keys: 'zo', type: 'action', action: 'fold', actionArgs: { open: true, } },\n    { keys: 'zO', type: 'action', action: 'fold', actionArgs: { open: true, all: true } },\n    { keys: 'za', type: 'action', action: 'fold', actionArgs: { toggle: true } },\n    { keys: 'zA', type: 'action', action: 'fold', actionArgs: { toggle: true, all: true } },\n    { keys: 'zf', type: 'action', action: 'fold', actionArgs: { open: true, all: true } },\n    { keys: 'zd', type: 'action', action: 'fold', actionArgs: { open: true, all: true } },\n    \n    { keys: '<C-A-j>', type: 'action', action: 'aceCommand', actionArgs: { name: \"addCursorAbove\" } },\n    { keys: '<C-A-k>', type: 'action', action: 'aceCommand', actionArgs: { name: \"addCursorBelow\" } },\n    { keys: '<C-A-S-j>', type: 'action', action: 'aceCommand', actionArgs: { name: \"addCursorAboveSkipCurrent\" } },\n    { keys: '<C-A-S-k>', type: 'action', action: 'aceCommand', actionArgs: { name: \"addCursorBelowSkipCurrent\" } },\n    { keys: '<C-A-h>', type: 'action', action: 'aceCommand', actionArgs: { name: \"selectMoreBefore\" } },\n    { keys: '<C-A-l>', type: 'action', action: 'aceCommand', actionArgs: { name: \"selectMoreAfter\" } },\n    { keys: '<C-A-S-h>', type: 'action', action: 'aceCommand', actionArgs: { name: \"selectNextBefore\" } },\n    { keys: '<C-A-S-l>', type: 'action', action: 'aceCommand', actionArgs: { name: \"selectNextAfter\" } }\n  );\n  actions.aceCommand = function(cm, actionArgs, vim) {\n    cm.vimCmd = actionArgs;\n    if (cm.ace.inVirtualSelectionMode)\n      cm.ace.on(\"beforeEndOperation\", delayedExecAceCommand);\n    else\n      delayedExecAceCommand(null, cm.ace)\n  };\n  function delayedExecAceCommand(op, ace) {\n    ace.off(\"beforeEndOperation\", delayedExecAceCommand);\n    var cmd = ace.state.cm.vimCmd;\n    if (cmd) {\n      ace.execCommand(cmd.exec ? cmd : cmd.name, cmd.args);\n    }\n    ace.curOp = ace.prevOp;\n  }\n  actions.fold = function(cm, actionArgs, vim) {\n    cm.ace.execCommand(['toggleFoldWidget', 'toggleFoldWidget', 'foldOther', 'unfoldall'\n      ][(actionArgs.all ? 2 : 0) + (actionArgs.open ? 1 : 0)]);\n  },\n\n  exports.handler.defaultKeymap = defaultKeymap;\n  \n  Vim.map(\"Y\", \"yy\");\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-abap.js",
    "content": "ace.define(\"ace/mode/abap_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar AbapHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": \"this\",\n        \"keyword\": \n            \"ADD ALIAS ALIASES ASSERT ASSIGN ASSIGNING AT BACK\" +\n            \" CALL CASE CATCH CHECK CLASS CLEAR CLOSE CNT COLLECT COMMIT COMMUNICATION COMPUTE CONCATENATE CONDENSE CONSTANTS CONTINUE CONTROLS CONVERT CREATE CURRENCY\" +\n            \" DATA DEFINE DEFINITION DEFERRED DELETE DESCRIBE DETAIL DIVIDE DO\" +\n            \" ELSE ELSEIF ENDAT ENDCASE ENDCLASS ENDDO ENDEXEC ENDFORM ENDFUNCTION ENDIF ENDIFEND ENDINTERFACE ENDLOOP ENDMETHOD ENDMODULE ENDON ENDPROVIDE ENDSELECT ENDTRY ENDWHILE EVENT EVENTS EXEC EXIT EXPORT EXPORTING EXTRACT\" +\n            \" FETCH FIELDS FORM FORMAT FREE FROM FUNCTION\" +\n            \" GENERATE GET\" +\n            \" HIDE\" +\n            \" IF IMPORT IMPORTING INDEX INFOTYPES INITIALIZATION INTERFACE INTERFACES INPUT INSERT IMPLEMENTATION\" +\n            \" LEAVE LIKE LINE LOAD LOCAL LOOP\" +\n            \" MESSAGE METHOD METHODS MODIFY MODULE MOVE MULTIPLY\" +\n            \" ON OVERLAY OPTIONAL OTHERS\" +\n            \" PACK PARAMETERS PERFORM POSITION PROGRAM PROVIDE PUT\" +\n            \" RAISE RANGES READ RECEIVE RECEIVING REDEFINITION REFERENCE REFRESH REJECT REPLACE REPORT RESERVE RESTORE RETURNING ROLLBACK\" +\n            \" SCAN SCROLL SEARCH SELECT SET SHIFT SKIP SORT SORTED SPLIT STANDARD STATICS STEP STOP SUBMIT SUBTRACT SUM SUMMARY SUPPRESS\" +\n            \" TABLES TIMES TRANSFER TRANSLATE TRY TYPE TYPES\" +\n            \" UNASSIGN ULINE UNPACK UPDATE\" +\n            \" WHEN WHILE WINDOW WRITE\" +\n            \" OCCURS STRUCTURE OBJECT PROPERTY\" +\n            \" CASTING APPEND RAISING VALUE COLOR\" +\n            \" CHANGING EXCEPTION EXCEPTIONS DEFAULT CHECKBOX COMMENT\" +\n            \" ID NUMBER FOR TITLE OUTPUT\" +\n            \" WITH EXIT USING\" +\n            \" INTO WHERE GROUP BY HAVING ORDER BY SINGLE\" +\n            \" APPENDING CORRESPONDING FIELDS OF TABLE\" +\n            \" LEFT RIGHT OUTER INNER JOIN AS CLIENT SPECIFIED BYPASSING BUFFER UP TO ROWS CONNECTING\" +\n            \" EQ NE LT LE GT GE NOT AND OR XOR IN LIKE BETWEEN\",\n        \"constant.language\": \n            \"TRUE FALSE NULL SPACE\",\n        \"support.type\": \n            \"c n i p f d t x string xstring decfloat16 decfloat34\",\n        \"keyword.operator\":\n            \"abs sign ceil floor trunc frac acos asin atan cos sin tan\" +\n            \" abapOperator cosh sinh tanh exp log log10 sqrt\" +\n            \" strlen xstrlen charlen numofchar dbmaxlen lines\" \n    }, \"text\", true, \" \");\n\n    var compoundKeywords = \"WITH\\\\W+(?:HEADER\\\\W+LINE|FRAME|KEY)|NO\\\\W+STANDARD\\\\W+PAGE\\\\W+HEADING|\"+\n        \"EXIT\\\\W+FROM\\\\W+STEP\\\\W+LOOP|BEGIN\\\\W+OF\\\\W+(?:BLOCK|LINE)|BEGIN\\\\W+OF|\"+\n        \"END\\\\W+OF\\\\W+(?:BLOCK|LINE)|END\\\\W+OF|NO\\\\W+INTERVALS|\"+\n        \"RESPECTING\\\\W+BLANKS|SEPARATED\\\\W+BY|USING\\\\W+(?:EDIT\\\\W+MASK)|\"+\n        \"WHERE\\\\W+(?:LINE)|RADIOBUTTON\\\\W+GROUP|REF\\\\W+TO|\"+\n        \"(?:PUBLIC|PRIVATE|PROTECTED)(?:\\\\W+SECTION)?|DELETING\\\\W+(?:TRAILING|LEADING)\"+\n        \"(?:ALL\\\\W+OCCURRENCES)|(?:FIRST|LAST)\\\\W+OCCURRENCE|INHERITING\\\\W+FROM|\"+\n        \"LINE-COUNT|ADD-CORRESPONDING|AUTHORITY-CHECK|BREAK-POINT|CLASS-DATA|CLASS-METHODS|\"+\n        \"CLASS-METHOD|DIVIDE-CORRESPONDING|EDITOR-CALL|END-OF-DEFINITION|END-OF-PAGE|END-OF-SELECTION|\"+\n        \"FIELD-GROUPS|FIELD-SYMBOLS|FUNCTION-POOL|MOVE-CORRESPONDING|MULTIPLY-CORRESPONDING|NEW-LINE|\"+\n        \"NEW-PAGE|NEW-SECTION|PRINT-CONTROL|RP-PROVIDE-FROM-LAST|SELECT-OPTIONS|SELECTION-SCREEN|\"+\n        \"START-OF-SELECTION|SUBTRACT-CORRESPONDING|SYNTAX-CHECK|SYNTAX-TRACE|TOP-OF-PAGE|TYPE-POOL|\"+\n        \"TYPE-POOLS|LINE-SIZE|LINE-COUNT|MESSAGE-ID|DISPLAY-MODE|READ(?:-ONLY)?|\"+\n        \"IS\\\\W+(?:NOT\\\\W+)?(?:ASSIGNED|BOUND|INITIAL|SUPPLIED)\";\n     \n    this.$rules = {\n        \"start\" : [\n            {token : \"string\", regex : \"`\", next  : \"string\"},\n            {token : \"string\", regex : \"'\", next  : \"qstring\"},\n            {token : \"doc.comment\", regex : /^\\*.+/},\n            {token : \"comment\",  regex : /\".+$/},\n            {token : \"invalid\", regex: \"\\\\.{2,}\"},\n            {token : \"keyword.operator\", regex: /\\W[\\-+\\%=<>*]\\W|\\*\\*|[~:,\\.&$]|->*?|=>/},\n            {token : \"paren.lparen\", regex : \"[\\\\[({]\"},\n            {token : \"paren.rparen\", regex : \"[\\\\])}]\"},\n            {token : \"constant.numeric\", regex: \"[+-]?\\\\d+\\\\b\"},\n            {token : \"variable.parameter\", regex : /sy|pa?\\d\\d\\d\\d\\|t\\d\\d\\d\\.|innnn/}, \n            {token : \"keyword\", regex : compoundKeywords}, \n            {token : \"variable.parameter\", regex : /\\w+-\\w+(?:-\\w+)*/}, \n            {token : keywordMapper, regex : \"\\\\b\\\\w+\\\\b\"},\n            {caseInsensitive: true}\n        ],\n        \"qstring\" : [\n            {token : \"constant.language.escape\",   regex : \"''\"},\n            {token : \"string\", regex : \"'\",     next  : \"start\"},\n            {defaultToken : \"string\"}\n        ],\n        \"string\" : [\n            {token : \"constant.language.escape\",   regex : \"``\"},\n            {token : \"string\", regex : \"`\",     next  : \"start\"},\n            {defaultToken : \"string\"}\n        ]\n    }\n};\noop.inherits(AbapHighlightRules, TextHighlightRules);\n\nexports.AbapHighlightRules = AbapHighlightRules;\n});\n\nace.define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var range = this.indentationBlock(session, row);\n        if (range)\n            return range;\n\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1 || line[startLevel] != \"#\")\n            return;\n\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var level = line.search(re);\n\n            if (level == -1)\n                continue;\n\n            if (line[level] != \"#\")\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        var next = session.getLine(row + 1);\n        var prev = session.getLine(row - 1);\n        var prevIndent = prev.search(/\\S/);\n        var nextIndent = next.search(/\\S/);\n\n        if (indent == -1) {\n            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? \"start\" : \"\";\n            return \"\";\n        }\n        if (prevIndent == -1) {\n            if (indent == nextIndent && line[indent] == \"#\" && next[indent] == \"#\") {\n                session.foldWidgets[row - 1] = \"\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"start\";\n            }\n        } else if (prevIndent == indent && line[indent] == \"#\" && prev[indent] == \"#\") {\n            if (session.getLine(row - 2).search(/\\S/) == -1) {\n                session.foldWidgets[row - 1] = \"start\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"\";\n            }\n        }\n\n        if (prevIndent!= -1 && prevIndent < indent)\n            session.foldWidgets[row - 1] = \"start\";\n        else\n            session.foldWidgets[row - 1] = \"\";\n\n        if (indent < nextIndent)\n            return \"start\";\n        else\n            return \"\";\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/abap\",[\"require\",\"exports\",\"module\",\"ace/mode/abap_highlight_rules\",\"ace/mode/folding/coffee\",\"ace/range\",\"ace/mode/text\",\"ace/lib/oop\"], function(require, exports, module) {\n\"use strict\";\n\nvar Rules = require(\"./abap_highlight_rules\").AbapHighlightRules;\nvar FoldMode = require(\"./folding/coffee\").FoldMode;\nvar Range = require(\"../range\").Range;\nvar TextMode = require(\"./text\").Mode;\nvar oop = require(\"../lib/oop\");\n\nfunction Mode() {\n    this.HighlightRules = Rules;\n    this.foldingRules = new FoldMode();\n}\n\noop.inherits(Mode, TextMode);\n\n(function() {\n    \n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        return indent;\n    };\n    \n    this.toggleCommentLines = function(state, doc, startRow, endRow){\n        var range = new Range(0, 0, 0, 0);\n        for (var i = startRow; i <= endRow; ++i) {\n            var line = doc.getLine(i);\n            if (hereComment.test(line))\n                continue;\n                \n            if (commentLine.test(line))\n                line = line.replace(commentLine, '$1');\n            else\n                line = line.replace(indentation, '$&#');\n    \n            range.end.row = range.start.row = i;\n            range.end.column = line.length + 1;\n            doc.replace(range, line);\n        }\n    };\n    \n    this.$id = \"ace/mode/abap\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-actionscript.js",
    "content": "ace.define(\"ace/mode/actionscript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar ActionScriptHighlightRules = function() {\n\n    this.$rules = { start: \n       [ { token: 'support.class.actionscript.2',\n           regex: '\\\\b(?:R(?:ecordset|DBMSResolver|adioButton(?:Group)?)|X(?:ML(?:Socket|Node|Connector)?|UpdateResolverDataHolder)|M(?:M(?:Save|Execute)|icrophoneMicrophone|o(?:use|vieClip(?:Loader)?)|e(?:nu(?:Bar)?|dia(?:Controller|Display|Playback))|ath)|B(?:yName|inding|utton)|S(?:haredObject|ystem|crollPane|t(?:yleSheet|age|ream)|ound|e(?:ndEvent|rviceObject)|OAPCall|lide)|N(?:umericStepper|et(?:stream|S(?:tream|ervices)|Connection|Debug(?:Config)?))|C(?:heckBox|o(?:ntextMenu(?:Item)?|okie|lor|m(?:ponentMixins|boBox))|ustomActions|lient|amera)|T(?:ypedValue|ext(?:Snapshot|Input|F(?:ield|ormat)|Area)|ree|AB)|Object|D(?:ownload|elta(?:Item|Packet)?|at(?:e(?:Chooser|Field)?|a(?:G(?:lue|rid)|Set|Type)))|U(?:RL|TC|IScrollBar)|P(?:opUpManager|endingCall|r(?:intJob|o(?:duct|gressBar)))|E(?:ndPoint|rror)|Video|Key|F(?:RadioButton|GridColumn|MessageBox|BarChart|S(?:croll(?:Bar|Pane)|tyleFormat|plitView)|orm|C(?:heckbox|omboBox|alendar)|unction|T(?:icker|ooltip(?:Lite)?|ree(?:Node)?)|IconButton|D(?:ataGrid|raggablePane)|P(?:ieChart|ushButton|ro(?:gressBar|mptBox))|L(?:i(?:stBox|neChart)|oadingBox)|AdvancedMessageBox)|W(?:indow|SDLURL|ebService(?:Connector)?)|L(?:ist|o(?:calConnection|ad(?:er|Vars)|g)|a(?:unch|bel))|A(?:sBroadcaster|cc(?:ordion|essibility)|S(?:Set(?:Native|PropFlags)|N(?:ew|ative)|C(?:onstructor|lamp(?:2)?)|InstanceOf)|pplication|lert|rray))\\\\b' },\n         { token: 'support.function.actionscript.2',\n           regex: '\\\\b(?:s(?:h(?:ift|ow(?:GridLines|Menu|Border|Settings|Headers|ColumnHeaders|Today|Preferences)?|ad(?:ow|ePane))|c(?:hema|ale(?:X|Mode|Y|Content)|r(?:oll(?:Track|Drag)?|een(?:Resolution|Color|DPI)))|t(?:yleSheet|op(?:Drag|A(?:nimation|llSounds|gent))?|epSize|a(?:tus|rt(?:Drag|A(?:nimation|gent))?))|i(?:n|ze|lence(?:TimeOut|Level))|o(?:ngname|urce|rt(?:Items(?:By)?|On(?:HeaderRelease)?|able(?:Columns)?)?)|u(?:ppressInvalidCalls|bstr(?:ing)?)|p(?:li(?:ce|t)|aceCol(?:umnsEqually|lumnsEqually))|e(?:nd(?:DefaultPushButtonEvent|AndLoad)?|curity|t(?:R(?:GB|o(?:otNode|w(?:Height|Count))|esizable(?:Columns)?|a(?:nge|te))|G(?:ain|roupName)|X(?:AxisTitle)?|M(?:i(?:n(?:imum|utes)|lliseconds)|o(?:nth(?:Names)?|tionLevel|de)|ultilineMode|e(?:ssage|nu(?:ItemEnabled(?:At)?|EnabledAt)|dia)|a(?:sk|ximum))|B(?:u(?:tton(?:s|Width)|fferTime)|a(?:seTabIndex|ndwidthLimit|ckground))|S(?:howAsDisabled|croll(?:ing|Speed|Content|Target|P(?:osition|roperties)|barState|Location)|t(?:yle(?:Property)?|opOnFocus|at(?:us|e))|i(?:ze|lenceLevel)|ort(?:able(?:Columns)?|Function)|p(?:litterBarPosition|acing)|e(?:conds|lect(?:Multiple|ion(?:Required|Type)?|Style|Color|ed(?:Node(?:s)?|Cell|I(?:nd(?:ices|ex)|tem(?:s)?))?|able))|kin|m(?:oothness|allScroll))|H(?:ighlight(?:s|Color)|Scroll|o(?:urs|rizontal)|eader(?:Symbol|Height|Text|Property|Format|Width|Location)?|as(?:Shader|CloseBox))|Y(?:ear|AxisTitle)?|N(?:ode(?:Properties|ExpansionHandler)|ewTextFormat)|C(?:h(?:ildNodes|a(?:ngeHandler|rt(?:Title|EventHandler)))|o(?:ntent(?:Size)?|okie|lumns)|ell(?:Symbol|Data)|l(?:i(?:ckHandler|pboard)|oseHandler)|redentials)|T(?:ype(?:dVaule)?|i(?:tle(?:barHeight)?|p(?:Target|Offset)?|me(?:out(?:Handler)?)?)|oggle|extFormat|ransform)|I(?:s(?:Branch|Open)|n(?:terval|putProperty)|con(?:SymbolName)?|te(?:rator|m(?:ByKey|Symbol)))|Orientation|D(?:i(?:splay(?:Range|Graphics|Mode|Clip|Text|edMonth)|rection)|uration|e(?:pth(?:Below|To|Above)|fault(?:GatewayURL|Mappings|NodeIconSymbolName)|l(?:iveryMode|ay)|bug(?:ID)?)|a(?:yOfWeekNames|t(?:e(?:Filter)?|a(?:Mapping(?:s)?|Item(?:Text|Property|Format)|Provider|All(?:Height|Property|Format|Width))?))|ra(?:wConnectors|gContent))|U(?:se(?:Shadow|HandCursor|EchoSuppression|rInput|Fade)|TC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear))|P(?:osition|ercentComplete|an(?:e(?:M(?:inimumSize|aximumSize)|Size|Title))?|ro(?:pert(?:y(?:Data)?|iesAt)|gress))|E(?:nabled|dit(?:Handler|able)|xpand(?:NodeTrigger|erSymbolName))|V(?:Scroll|olume|alue(?:Source)?)|KeyFrameInterval|Quality|F(?:i(?:eld|rst(?:DayOfWeek|VisibleNode))|ocus|ullYear|ps|ade(?:InLength|OutLength)|rame(?:Color|Width))|Width|L(?:ine(?:Color|Weight)|o(?:opback|adTarget)|a(?:rgeScroll|bel(?:Source|Placement)?))|A(?:s(?:Boolean|String|Number)|n(?:yTypedValue|imation)|ctiv(?:e(?:State(?:Handler)?|Handler)|ateHandler)|utoH(?:ideScrollBar|eight)))?|paratorBefore|ek|lect(?:ion(?:Disabled|Unfocused)?|ed(?:Node(?:s)?|Child|I(?:nd(?:ices|ex)|tem(?:s)?)|Dat(?:e|a))?|able(?:Ranges)?)|rver(?:String)?)|kip|qrt|wapDepths|lice|aveToSharedObj|moothing)|h(?:scroll(?:Policy)?|tml(?:Text)?|i(?:t(?:Test(?:TextNearPos)?|Area)|de(?:BuiltInItems|Child)?|ghlight(?:2D|3D)?)|orizontal|e(?:ight|ader(?:Re(?:nderer|lease)|Height|Text))|P(?:osition|ageScrollSize)|a(?:s(?:childNodes|MP3|S(?:creen(?:Broadcast|Playback)|treaming(?:Video|Audio)|ort)|Next|OwnProperty|Pr(?:inting|evious)|EmbeddedVideo|VideoEncoder|A(?:ccesibility|udio(?:Encoder)?))|ndlerName)|LineScrollSize)|ye(?:sLabel|ar)|n(?:o(?:t|de(?:Name|Close|Type|Open|Value)|Label)|u(?:llValue|mChild(?:S(?:creens|lides)|ren|Forms))|e(?:w(?:Item|line|Value|LocationDialog)|xt(?:S(?:cene|ibling|lide)|TabIndex|Value|Frame)?)?|ame(?:s)?)|c(?:h(?:ildNodes|eck|a(?:nge(?:sPending)?|r(?:CodeAt|At))|r)|o(?:s|n(?:st(?:ant|ructor)|nect|c(?:urrency|at)|t(?:ent(?:Type|Path)?|ains|rol(?:Placement|lerPolicy))|denseWhite|version)|py|l(?:or|umn(?:Stretch|Name(?:s)?|Count))|m(?:p(?:onent|lete)|ment))|u(?:stomItems|ePoint(?:s)?|r(?:veTo|Value|rent(?:Slide|ChildSlide|Item|F(?:ocused(?:S(?:creen|lide)|Form)|ps))))|e(?:il|ll(?:Renderer|Press|Edit|Focus(?:In|Out)))|l(?:i(?:ck|ents)|o(?:se(?:Button|Pane)?|ne(?:Node)?)|ear(?:S(?:haredObjects|treams)|Timeout|Interval)?)|a(?:ncelLabel|tch|p(?:tion|abilities)|l(?:cFields|l(?:e(?:e|r))?))|reate(?:GatewayConnection|Menu|Se(?:rver|gment)|C(?:hild(?:AtDepth)?|l(?:ient|ass(?:ChildAtDepth|Object(?:AtDepth)?))|all)|Text(?:Node|Field)|Item|Object(?:AtDepth)?|PopUp|E(?:lement|mptyMovieClip)))|t(?:h(?:is|row)|ype(?:of|Name)?|i(?:tle(?:StyleDeclaration)?|me(?:out)?)|o(?:talTime|String|olTipText|p|UpperCase|ggle(?:HighQuality)?|Lo(?:caleString|werCase))|e(?:st|llTarget|xt(?:RightMargin|Bold|S(?:ize|elected)|Height|Color|I(?:ndent|talic)|Disabled|Underline|F(?:ield|ont)|Width|LeftMargin|Align)?)|a(?:n|rget(?:Path)?|b(?:Stops|Children|Index|Enabled|leName))|r(?:y|igger|ac(?:e|k(?:AsMenu)?)))|i(?:s(?:Running|Branch|NaN|Con(?:soleOpen|nected)|Toggled|Installed|Open|D(?:own|ebugger)|P(?:urchased|ro(?:totypeOf|pertyEnumerable))|Empty|F(?:inite|ullyPopulated)|Local|Active)|n(?:s(?:tall|ertBefore)|cludeDeltaPacketInfo|t|it(?:ialize|Component|Pod|A(?:pplication|gent))?|de(?:nt|terminate|x(?:InParent(?:Slide|Form)?|Of)?)|put|validate|finity|LocalInternetCache)?|con(?:F(?:ield|unction))?|t(?:e(?:ratorScrolled|m(?:s|RollO(?:ut|ver)|ClassName))|alic)|d3|p|fFrameLoaded|gnore(?:Case|White))|o(?:s|n(?:R(?:ollO(?:ut|ver)|e(?:s(?:ize|ult)|l(?:ease(?:Outside)?|aseOutside)))|XML|Mouse(?:Move|Down|Up|Wheel)|S(?:ync|croller|tatus|oundComplete|e(?:tFocus|lect(?:edItem)?))|N(?:oticeEvent|etworkChange)|C(?:hanged|onnect|l(?:ipEvent|ose))|ID3|D(?:isconnect|eactivate|ata|ragO(?:ut|ver))|Un(?:install|load)|P(?:aymentResult|ress)|EnterFrame|K(?:illFocus|ey(?:Down|Up))|Fault|Lo(?:ad|g)|A(?:ctiv(?:ity|ate)|ppSt(?:op|art)))?|pe(?:n|ration)|verLayChildren|kLabel|ldValue|r(?:d)?)|d(?:i(?:s(?:connect|play(?:Normal|ed(?:Month|Year)|Full)|able(?:Shader|d(?:Ranges|Days)|CloseBox|Events))|rection)|o(?:cTypeDecl|tall|Decoding|main|LazyDecoding)|u(?:plicateMovieClip|ration)|e(?:stroy(?:ChildAt|Object)|code|fault(?:PushButton(?:Enabled)?|KeydownHandler)?|l(?:ta(?:Packet(?:Changed)?)?|ete(?:PopUp|All)?)|blocking)|a(?:shBoardSave|yNames|ta(?:Provider)?|rkshadow)|r(?:opdown(?:Width)?|a(?:w|gO(?:ut|ver))))|u(?:se(?:Sort|HandCursor|Codepage|EchoSuppression)|n(?:shift|install|derline|escape|format|watch|lo(?:ck|ad(?:Movie(?:Num)?)?))|pdate(?:Results|Mode|I(?:nputProperties|tem(?:ByIndex)?)|P(?:acket|roperties)|View|AfterEvent)|rl)|join|p(?:ixelAspectRatio|o(?:sition|p|w)|u(?:sh|rge|blish)|ercen(?:tComplete|Loaded)|lay(?:head(?:Change|Time)|ing|Hidden|erType)?|a(?:ssword|use|r(?:se(?:XML|CSS|Int|Float)|ent(?:Node|Is(?:S(?:creen|lide)|Form))|ams))|r(?:int(?:Num|AsBitmap(?:Num)?)?|o(?:to(?:type)?|pert(?:y|ies)|gress)|e(?:ss|v(?:ious(?:S(?:ibling|lide)|Value)?|Scene|Frame)|ferred(?:Height|Width))))|e(?:scape|n(?:code(?:r)?|ter(?:Frame)?|dFill|able(?:Shader|d|CloseBox|Events))|dit(?:able|Field|LocationDialog)|v(?:ent|al(?:uate)?)|q|x(?:tended|p|ec(?:ute)?|actSettings)|m(?:phasized(?:StyleDeclaration)?|bedFonts))|v(?:i(?:sible|ewPod)|ScrollPolicy|o(?:id|lume)|ersion|P(?:osition|ageScrollSize)|a(?:l(?:idat(?:ionError|e(?:Property|ActivationKey)?)|ue(?:Of)?)|riable)|LineScrollSize)|k(?:ind|ey(?:Down|Up|Press|FrameInterval))|q(?:sort|uality)|f(?:scommand|i(?:n(?:d(?:Text|First|Last)?|ally)|eldInfo|lter(?:ed|Func)?|rst(?:Slide|Child|DayOfWeek|VisibleNode)?)|o(?:nt|cus(?:In|edCell|Out|Enabled)|r(?:egroundDisabled|mat(?:ter)?))|unctionName|ps|l(?:oor|ush)|ace|romCharCode)|w(?:i(?:th|dth)|ordWrap|atch|riteAccess)|l(?:t|i(?:st(?:Owner)?|ne(?:Style|To))|o(?:c(?:k|a(?:t(?:ion|eByld)|l(?:ToGlobal|FileReadDisable)))|opback|ad(?:Movie(?:Num)?|S(?:crollContent|ound)|ed|Variables(?:Num)?|Application)?|g(?:Changes)?)|e(?:ngth|ft(?:Margin)?|ading)?|a(?:st(?:Slide|Child|Index(?:Of)?)?|nguage|b(?:el(?:Placement|F(?:ield|unction))?|leField)))|a(?:s(?:scociate(?:Controller|Display)|in|pectRatio|function)|nd|c(?:ceptConnection|tiv(?:ityLevel|ePlayControl)|os)|t(?:t(?:ach(?:Movie|Sound|Video|Audio)|ributes)|an(?:2)?)|dd(?:header|RequestHeader|Menu(?:Item(?:At)?|At)?|Sort|Header|No(?:tice|de(?:At)?)|C(?:olumn(?:At)?|uePoint)|T(?:oLocalInternetCache|reeNode(?:At)?)|I(?:con|tem(?:s(?:At)?|At)?)|DeltaItem|P(?:od|age|roperty)|EventListener|View|FieldInfo|Listener|Animation)?|uto(?:Size|Play|KeyNav|Load)|pp(?:endChild|ly(?:Changes|Updates)?)|vHardwareDisable|fterLoaded|l(?:ternateRowColors|ign|l(?:ow(?:InsecureDomain|Domain)|Transitions(?:InDone|OutDone))|bum)|r(?:tist|row|g(?:uments|List))|gent|bs)|r(?:ight(?:Margin)?|o(?:ot(?:S(?:creen|lide)|Form)|und|w(?:Height|Count)|llO(?:ut|ver))|e(?:s(?:yncDepth|t(?:orePane|artAnimation|rict)|iz(?:e|able(?:Columns)?)|olveDelta|ult(?:s)?|ponse)|c(?:o(?:ncile(?:Results|Updates)|rd)|eive(?:Video|Audio))|draw|jectConnection|place(?:Sel|ItemAt|AllItems)?|ve(?:al(?:Child)?|rse)|quest(?:SizeChange|Payment)?|f(?:errer|resh(?:ScrollContent|Destinations|Pane|FromSources)?)|lease(?:Outside)?|ad(?:Only|Access)|gister(?:SkinElement|C(?:olor(?:Style|Name)|lass)|InheritingStyle|Proxy)|move(?:Range|M(?:ovieClip|enu(?:Item(?:At)?|At))|Background|Sort|No(?:tice|de(?:sAt|At)?)|C(?:olum(?:nAt|At)|uePoints)|T(?:extField|reeNode(?:At)?)|Item(?:At)?|Pod|EventListener|FromLocalInternetCache|Listener|All(?:C(?:olumns|uePoints)|Items)?))|a(?:ndom|te|dioDot))|g(?:t|oto(?:Slide|NextSlide|PreviousSlide|FirstSlide|LastSlide|And(?:Stop|Play))|e(?:nre|t(?:R(?:GB|o(?:otNode|wCount)|e(?:sizable|mote))|X(?:AxisTitle)?|M(?:i(?:n(?:imum(?:Size)?|utes)|lliseconds)|onth(?:Names)?|ultilineMode|e(?:ssage|nu(?:ItemAt|EnabledAt|At))|aximum(?:Size)?)|B(?:ytes(?:Total|Loaded)|ounds|utton(?:s|Width)|eginIndex|a(?:ndwidthLimit|ckground))|S(?:howAsDisabled|croll(?:ing|Speed|Content|Position|barState|Location)|t(?:yle(?:Names)?|opOnFocus|ate)|ize|o(?:urce|rtState)|p(?:litterBarPosition|acing)|e(?:conds|lect(?:Multiple|ion(?:Required|Type)|Style|ed(?:Node(?:s)?|Cell|Text|I(?:nd(?:ices|ex)|tem(?:s)?))?)|rvice)|moothness|WFVersion)|H(?:ighlight(?:s|Color)|ours|e(?:ight|ader(?:Height|Text|Property|Format|Width|Location)?)|as(?:Shader|CloseBox))|Y(?:ear|AxisTitle)?|N(?:o(?:tices|de(?:DisplayedAt|At))|um(?:Children|berAvailable)|e(?:wTextFormat|xtHighestDepth))|C(?:h(?:ild(?:S(?:creen|lide)|Nodes|Form|At)|artTitle)|o(?:n(?:tent|figInfo)|okie|de|unt|lumn(?:Names|Count|Index|At))|uePoint|ellIndex|loseHandler|a(?:ll|retIndex))|T(?:ypedValue|i(?:tle(?:barHeight)?|p(?:Target|Offset)?|me(?:stamp|zoneOffset|out(?:State|Handler)|r)?)|oggle|ext(?:Extent|Format)?|r(?:ee(?:NodeAt|Length)|ans(?:form|actionId)))|I(?:s(?:Branch|Open)|n(?:stanceAtDepth|d(?:icesByKey|exByKey))|con(?:SymbolName)?|te(?:rator|m(?:sByKey|By(?:Name|Key)|id|ID|At))|d)|O(?:utput(?:Parameter(?:s|ByName)?|Value(?:s)?)|peration|ri(?:entation|ginalCellData))|D(?:i(?:s(?:play(?:Range|Mode|Clip|Index|edMonth)|kUsage)|rection)|uration|e(?:pth|faultNodeIconSymbolName|l(?:taPacket|ay)|bug(?:Config|ID)?)|a(?:y(?:OfWeekNames)?|t(?:e|a(?:Mapping(?:s)?|Item(?:Text|Property|Format)|Label|All(?:Height|Property|Format|Width))?))|rawConnectors)|U(?:se(?:Shadow|HandCursor|rInput|Fade)|RL|TC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear))|P(?:o(?:sition|ds)|ercentComplete|a(?:n(?:e(?:M(?:inimums|aximums)|Height|Title|Width))?|rentNode)|r(?:operty(?:Name|Data)?|efer(?:ences|red(?:Height|Width))))|E(?:n(?:dIndex|abled)|ditingData|x(?:panderSymbolName|andNodeTrigger))|V(?:iewed(?:Pods|Applications)|olume|ersion|alue(?:Source)?)|F(?:i(?:eld|rst(?:DayOfWeek|VisibleNode))|o(?:ntList|cus)|ullYear|ade(?:InLength|OutLength)|rame(?:Color|Width))|Width|L(?:ine(?:Color|Weight)|o(?:cal|adTarget)|ength|a(?:stTabIndex|bel(?:Source)?))|A(?:s(?:cii|Boolean|String|Number)|n(?:yTypedValue|imation)|ctiv(?:eState(?:Handler)?|ateHandler)|utoH(?:ideScrollBar|eight)|llItems|gent))?)?|lobal(?:StyleFormat|ToLocal)?|ain|roupName)|x(?:updatePackety|mlDecl)?|m(?:y(?:MethodName|Call)|in(?:imum)?|o(?:nthNames|tion(?:TimeOut|Level)|de(?:lChanged)?|use(?:Move|O(?:ut|ver)|Down(?:Somewhere|Outside)?|Up(?:Somewhere)?|WheelEnabled)|ve(?:To)?)|u(?:ted|lti(?:pleS(?:imultaneousAllowed|elections)|line))|e(?:ssage|nu(?:Show|Hide)?|th(?:od)?|diaType)|a(?:nufacturer|tch|x(?:scroll|hscroll|imum|HPosition|Chars|VPosition)?)|b(?:substring|chr|ord|length))|b(?:ytes(?:Total|Loaded)|indFormat(?:Strings|Function)|o(?:ttom(?:Scroll)?|ld|rder(?:Color)?)|u(?:tton(?:Height|Width)|iltInItems|ffer(?:Time|Length)|llet)|e(?:foreApplyUpdates|gin(?:GradientFill|Fill))|lockIndent|a(?:ndwidth|ckground(?:Style|Color|Disabled)?)|roadcastMessage)|onHTTPStatus)\\\\b' },\n         { token: 'support.constant.actionscript.2',\n           regex: '\\\\b(?:__proto__|__resolve|_accProps|_alpha|_changed|_currentframe|_droptarget|_flash|_focusrect|_framesloaded|_global|_height|_highquality|_level|_listeners|_lockroot|_name|_parent|_quality|_root|_rotation|_soundbuftime|_target|_totalframes|_url|_visible|_width|_x|_xmouse|_xscale|_y|_ymouse|_yscale)\\\\b' },\n         { token: 'keyword.control.actionscript.2',\n           regex: '\\\\b(?:dynamic|extends|import|implements|interface|public|private|new|static|super|var|for|in|break|continue|while|do|return|if|else|case|switch)\\\\b' },\n         { token: 'storage.type.actionscript.2',\n           regex: '\\\\b(?:Boolean|Number|String|Void)\\\\b' },\n         { token: 'constant.language.actionscript.2',\n           regex: '\\\\b(?:null|undefined|true|false)\\\\b' },\n         { token: 'constant.numeric.actionscript.2',\n           regex: '\\\\b(?:0(?:x|X)[0-9a-fA-F]*|(?:[0-9]+\\\\.?[0-9]*|\\\\.[0-9]+)(?:(?:e|E)(?:\\\\+|-)?[0-9]+)?)(?:L|l|UL|ul|u|U|F|f)?\\\\b' },\n         { token: 'punctuation.definition.string.begin.actionscript.2',\n           regex: '\"',\n           push: \n            [ { token: 'punctuation.definition.string.end.actionscript.2',\n                regex: '\"',\n                next: 'pop' },\n              { token: 'constant.character.escape.actionscript.2',\n                regex: '\\\\\\\\.' },\n              { defaultToken: 'string.quoted.double.actionscript.2' } ] },\n         { token: 'punctuation.definition.string.begin.actionscript.2',\n           regex: '\\'',\n           push: \n            [ { token: 'punctuation.definition.string.end.actionscript.2',\n                regex: '\\'',\n                next: 'pop' },\n              { token: 'constant.character.escape.actionscript.2',\n                regex: '\\\\\\\\.' },\n              { defaultToken: 'string.quoted.single.actionscript.2' } ] },\n         { token: 'support.constant.actionscript.2',\n           regex: '\\\\b(?:BACKSPACE|CAPSLOCK|CONTROL|DELETEKEY|DOWN|END|ENTER|HOME|INSERT|LEFT|LN10|LN2|LOG10E|LOG2E|MAX_VALUE|MIN_VALUE|NEGATIVE_INFINITY|NaN|PGDN|PGUP|PI|POSITIVE_INFINITY|RIGHT|SPACE|SQRT1_2|SQRT2|UP)\\\\b' },\n         { token: 'punctuation.definition.comment.actionscript.2',\n           regex: '/\\\\*',\n           push: \n            [ { token: 'punctuation.definition.comment.actionscript.2',\n                regex: '\\\\*/',\n                next: 'pop' },\n              { defaultToken: 'comment.block.actionscript.2' } ] },\n         { token: 'punctuation.definition.comment.actionscript.2',\n           regex: '//.*$',\n           push_: \n            [ { token: 'comment.line.double-slash.actionscript.2',\n                regex: '$',\n                next: 'pop' },\n              { defaultToken: 'comment.line.double-slash.actionscript.2' } ] },\n         { token: 'keyword.operator.actionscript.2',\n           regex: '\\\\binstanceof\\\\b' },\n         { token: 'keyword.operator.symbolic.actionscript.2',\n           regex: '[-!%&*+=/?:]' },\n         { token: \n            [ 'meta.preprocessor.actionscript.2',\n              'punctuation.definition.preprocessor.actionscript.2',\n              'meta.preprocessor.actionscript.2' ],\n           regex: '^([ \\\\t]*)(#)([a-zA-Z]+)' },\n         { token: \n            [ 'storage.type.function.actionscript.2',\n              'meta.function.actionscript.2',\n              'entity.name.function.actionscript.2',\n              'meta.function.actionscript.2',\n              'punctuation.definition.parameters.begin.actionscript.2' ],\n           regex: '\\\\b(function)(\\\\s+)([a-zA-Z_]\\\\w*)(\\\\s*)(\\\\()',\n           push: \n            [ { token: 'punctuation.definition.parameters.end.actionscript.2',\n                regex: '\\\\)',\n                next: 'pop' },\n              { token: 'variable.parameter.function.actionscript.2',\n                regex: '[^,)$]+' },\n              { defaultToken: 'meta.function.actionscript.2' } ] },\n         { token: \n            [ 'storage.type.class.actionscript.2',\n              'meta.class.actionscript.2',\n              'entity.name.type.class.actionscript.2',\n              'meta.class.actionscript.2',\n              'storage.modifier.extends.actionscript.2',\n              'meta.class.actionscript.2',\n              'entity.other.inherited-class.actionscript.2' ],\n           regex: '\\\\b(class)(\\\\s+)([a-zA-Z_](?:\\\\w|\\\\.)*)(?:(\\\\s+)(extends)(\\\\s+)([a-zA-Z_](?:\\\\w|\\\\.)*))?' } ] }\n    \n    this.normalizeRules();\n};\n\nActionScriptHighlightRules.metaData = { fileTypes: [ 'as' ],\n      keyEquivalent: '^~A',\n      name: 'ActionScript',\n      scopeName: 'source.actionscript.2' }\n\n\noop.inherits(ActionScriptHighlightRules, TextHighlightRules);\n\nexports.ActionScriptHighlightRules = ActionScriptHighlightRules;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/actionscript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/actionscript_highlight_rules\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar ActionScriptHighlightRules = require(\"./actionscript_highlight_rules\").ActionScriptHighlightRules;\nvar FoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = ActionScriptHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n    this.$id = \"ace/mode/actionscript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-ada.js",
    "content": "ace.define(\"ace/mode/ada_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar AdaHighlightRules = function() {\nvar keywords = \"abort|else|new|return|abs|elsif|not|reverse|abstract|end|null|accept|entry|select|\" +\n\"access|exception|of|separate|aliased|exit|or|some|all|others|subtype|and|for|out|synchronized|\" +\n\"array|function|overriding|at|tagged|generic|package|task|begin|goto|pragma|terminate|\" +\n\"body|private|then|if|procedure|type|case|in|protected|constant|interface|until|\" +\n\"|is|raise|use|declare|range|delay|limited|record|when|delta|loop|rem|while|digits|renames|with|do|mod|requeue|xor\";\n\n    var builtinConstants = (\n        \"true|false|null\"\n    );\n\n    var builtinFunctions = (\n        \"count|min|max|avg|sum|rank|now|coalesce|main\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": builtinFunctions,\n        \"keyword\": keywords,\n        \"constant.language\": builtinConstants\n    }, \"identifier\", true);\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment\",\n            regex : \"--.*$\"\n        }, {\n            token : \"string\",           // \" string\n            regex : '\".*?\"'\n        }, {\n            token : \"string\",           // ' string\n            regex : \"'.*?'\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\\\+|\\\\-|\\\\/|\\\\/\\\\/|%|<@>|@>|<@|&|\\\\^|~|<|>|<=|=>|==|!=|<>|=\"\n        }, {\n            token : \"paren.lparen\",\n            regex : \"[\\\\(]\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\)]\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        } ]\n    };\n};\n\noop.inherits(AdaHighlightRules, TextHighlightRules);\n\nexports.AdaHighlightRules = AdaHighlightRules;\n});\n\nace.define(\"ace/mode/ada\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/ada_highlight_rules\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar AdaHighlightRules = require(\"./ada_highlight_rules\").AdaHighlightRules;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.HighlightRules = AdaHighlightRules;\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"--\";\n\n    this.$id = \"ace/mode/ada\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-apache_conf.js",
    "content": "ace.define(\"ace/mode/apache_conf_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar ApacheConfHighlightRules = function() {\n\n    this.$rules = { start: \n       [ { token: \n            [ 'punctuation.definition.comment.apacheconf',\n              'comment.line.hash.ini',\n              'comment.line.hash.ini' ],\n           regex: '^((?:\\\\s)*)(#)(.*$)' },\n         { token: \n            [ 'punctuation.definition.tag.apacheconf',\n              'entity.tag.apacheconf',\n              'text',\n              'string.value.apacheconf',\n              'punctuation.definition.tag.apacheconf' ],\n           regex: '(<)(Proxy|ProxyMatch|IfVersion|Directory|DirectoryMatch|Files|FilesMatch|IfDefine|IfModule|Limit|LimitExcept|Location|LocationMatch|VirtualHost)(?:(\\\\s)(.+?))?(>)' },\n         { token: \n            [ 'punctuation.definition.tag.apacheconf',\n              'entity.tag.apacheconf',\n              'punctuation.definition.tag.apacheconf' ],\n           regex: '(</)(Proxy|ProxyMatch|IfVersion|Directory|DirectoryMatch|Files|FilesMatch|IfDefine|IfModule|Limit|LimitExcept|Location|LocationMatch|VirtualHost)(>)' },\n         { token: \n            [ 'keyword.alias.apacheconf', 'text',\n              'string.regexp.apacheconf', 'text',\n              'string.replacement.apacheconf', 'text' ],\n           regex: '(Rewrite(?:Rule|Cond))(\\\\s+)(.+?)(\\\\s+)(.+?)($|\\\\s)' },\n         { token: \n            [ 'keyword.alias.apacheconf', 'text',\n              'entity.status.apacheconf', 'text',\n              'string.regexp.apacheconf', 'text',\n              'string.path.apacheconf', 'text' ],\n           regex: '(RedirectMatch)(?:(\\\\s+)(\\\\d\\\\d\\\\d|permanent|temp|seeother|gone))?(\\\\s+)(.+?)(\\\\s+)(?:(.+?)($|\\\\s))?' },\n         { token: \n            [ 'keyword.alias.apacheconf', 'text', \n              'entity.status.apacheconf', 'text',\n              'string.path.apacheconf', 'text',\n              'string.path.apacheconf', 'text' ],\n           regex: '(Redirect)(?:(\\\\s+)(\\\\d\\\\d\\\\d|permanent|temp|seeother|gone))?(\\\\s+)(.+?)(\\\\s+)(?:(.+?)($|\\\\s))?' },\n         { token: \n            [ 'keyword.alias.apacheconf', 'text',\n              'string.regexp.apacheconf', 'text',\n              'string.path.apacheconf', 'text' ],\n           regex: '(ScriptAliasMatch|AliasMatch)(\\\\s+)(.+?)(\\\\s+)(?:(.+?)(\\\\s))?' },\n         { token: \n            [ 'keyword.alias.apacheconf', 'text',\n              'string.path.apacheconf', 'text',\n              'string.path.apacheconf', 'text' ],\n           regex: '(RedirectPermanent|RedirectTemp|ScriptAlias|Alias)(\\\\s+)(.+?)(\\\\s+)(?:(.+?)($|\\\\s))?' },\n         { token: 'keyword.core.apacheconf',\n           regex: '\\\\b(?:AcceptPathInfo|AccessFileName|AddDefaultCharset|AddOutputFilterByType|AllowEncodedSlashes|AllowOverride|AuthName|AuthType|CGIMapExtension|ContentDigest|DefaultType|DocumentRoot|EnableMMAP|EnableSendfile|ErrorDocument|ErrorLog|FileETag|ForceType|HostnameLookups|IdentityCheck|Include|KeepAlive|KeepAliveTimeout|LimitInternalRecursion|LimitRequestBody|LimitRequestFields|LimitRequestFieldSize|LimitRequestLine|LimitXMLRequestBody|LogLevel|MaxKeepAliveRequests|NameVirtualHost|Options|Require|RLimitCPU|RLimitMEM|RLimitNPROC|Satisfy|ScriptInterpreterSource|ServerAdmin|ServerAlias|ServerName|ServerPath|ServerRoot|ServerSignature|ServerTokens|SetHandler|SetInputFilter|SetOutputFilter|TimeOut|TraceEnable|UseCanonicalName)\\\\b' },\n         { token: 'keyword.mpm.apacheconf',\n           regex: '\\\\b(?:AcceptMutex|AssignUserID|BS2000Account|ChildPerUserID|CoreDumpDirectory|EnableExceptionHook|Group|Listen|ListenBacklog|LockFile|MaxClients|MaxMemFree|MaxRequestsPerChild|MaxRequestsPerThread|MaxSpareServers|MaxSpareThreads|MaxThreads|MaxThreadsPerChild|MinSpareServers|MinSpareThreads|NumServers|PidFile|ReceiveBufferSize|ScoreBoardFile|SendBufferSize|ServerLimit|StartServers|StartThreads|ThreadLimit|ThreadsPerChild|ThreadStackSize|User|Win32DisableAcceptEx)\\\\b' },\n         { token: 'keyword.access.apacheconf',\n           regex: '\\\\b(?:Allow|Deny|Order)\\\\b' },\n         { token: 'keyword.actions.apacheconf',\n           regex: '\\\\b(?:Action|Script)\\\\b' },\n         { token: 'keyword.alias.apacheconf',\n           regex: '\\\\b(?:Alias|AliasMatch|Redirect|RedirectMatch|RedirectPermanent|RedirectTemp|ScriptAlias|ScriptAliasMatch)\\\\b' },\n         { token: 'keyword.auth.apacheconf',\n           regex: '\\\\b(?:AuthAuthoritative|AuthGroupFile|AuthUserFile)\\\\b' },\n         { token: 'keyword.auth_anon.apacheconf',\n           regex: '\\\\b(?:Anonymous|Anonymous_Authoritative|Anonymous_LogEmail|Anonymous_MustGiveEmail|Anonymous_NoUserID|Anonymous_VerifyEmail)\\\\b' },\n         { token: 'keyword.auth_dbm.apacheconf',\n           regex: '\\\\b(?:AuthDBMAuthoritative|AuthDBMGroupFile|AuthDBMType|AuthDBMUserFile)\\\\b' },\n         { token: 'keyword.auth_digest.apacheconf',\n           regex: '\\\\b(?:AuthDigestAlgorithm|AuthDigestDomain|AuthDigestFile|AuthDigestGroupFile|AuthDigestNcCheck|AuthDigestNonceFormat|AuthDigestNonceLifetime|AuthDigestQop|AuthDigestShmemSize)\\\\b' },\n         { token: 'keyword.auth_ldap.apacheconf',\n           regex: '\\\\b(?:AuthLDAPAuthoritative|AuthLDAPBindDN|AuthLDAPBindPassword|AuthLDAPCharsetConfig|AuthLDAPCompareDNOnServer|AuthLDAPDereferenceAliases|AuthLDAPEnabled|AuthLDAPFrontPageHack|AuthLDAPGroupAttribute|AuthLDAPGroupAttributeIsDN|AuthLDAPRemoteUserIsDN|AuthLDAPUrl)\\\\b' },\n         { token: 'keyword.autoindex.apacheconf',\n           regex: '\\\\b(?:AddAlt|AddAltByEncoding|AddAltByType|AddDescription|AddIcon|AddIconByEncoding|AddIconByType|DefaultIcon|HeaderName|IndexIgnore|IndexOptions|IndexOrderDefault|ReadmeName)\\\\b' },\n         { token: 'keyword.cache.apacheconf',\n           regex: '\\\\b(?:CacheDefaultExpire|CacheDisable|CacheEnable|CacheForceCompletion|CacheIgnoreCacheControl|CacheIgnoreHeaders|CacheIgnoreNoLastMod|CacheLastModifiedFactor|CacheMaxExpire)\\\\b' },\n         { token: 'keyword.cern_meta.apacheconf',\n           regex: '\\\\b(?:MetaDir|MetaFiles|MetaSuffix)\\\\b' },\n         { token: 'keyword.cgi.apacheconf',\n           regex: '\\\\b(?:ScriptLog|ScriptLogBuffer|ScriptLogLength)\\\\b' },\n         { token: 'keyword.cgid.apacheconf',\n           regex: '\\\\b(?:ScriptLog|ScriptLogBuffer|ScriptLogLength|ScriptSock)\\\\b' },\n         { token: 'keyword.charset_lite.apacheconf',\n           regex: '\\\\b(?:CharsetDefault|CharsetOptions|CharsetSourceEnc)\\\\b' },\n         { token: 'keyword.dav.apacheconf',\n           regex: '\\\\b(?:Dav|DavDepthInfinity|DavMinTimeout|DavLockDB)\\\\b' },\n         { token: 'keyword.deflate.apacheconf',\n           regex: '\\\\b(?:DeflateBufferSize|DeflateCompressionLevel|DeflateFilterNote|DeflateMemLevel|DeflateWindowSize)\\\\b' },\n         { token: 'keyword.dir.apacheconf',\n           regex: '\\\\b(?:DirectoryIndex|DirectorySlash)\\\\b' },\n         { token: 'keyword.disk_cache.apacheconf',\n           regex: '\\\\b(?:CacheDirLength|CacheDirLevels|CacheExpiryCheck|CacheGcClean|CacheGcDaily|CacheGcInterval|CacheGcMemUsage|CacheGcUnused|CacheMaxFileSize|CacheMinFileSize|CacheRoot|CacheSize|CacheTimeMargin)\\\\b' },\n         { token: 'keyword.dumpio.apacheconf',\n           regex: '\\\\b(?:DumpIOInput|DumpIOOutput)\\\\b' },\n         { token: 'keyword.env.apacheconf',\n           regex: '\\\\b(?:PassEnv|SetEnv|UnsetEnv)\\\\b' },\n         { token: 'keyword.expires.apacheconf',\n           regex: '\\\\b(?:ExpiresActive|ExpiresByType|ExpiresDefault)\\\\b' },\n         { token: 'keyword.ext_filter.apacheconf',\n           regex: '\\\\b(?:ExtFilterDefine|ExtFilterOptions)\\\\b' },\n         { token: 'keyword.file_cache.apacheconf',\n           regex: '\\\\b(?:CacheFile|MMapFile)\\\\b' },\n         { token: 'keyword.headers.apacheconf',\n           regex: '\\\\b(?:Header|RequestHeader)\\\\b' },\n         { token: 'keyword.imap.apacheconf',\n           regex: '\\\\b(?:ImapBase|ImapDefault|ImapMenu)\\\\b' },\n         { token: 'keyword.include.apacheconf',\n           regex: '\\\\b(?:SSIEndTag|SSIErrorMsg|SSIStartTag|SSITimeFormat|SSIUndefinedEcho|XBitHack)\\\\b' },\n         { token: 'keyword.isapi.apacheconf',\n           regex: '\\\\b(?:ISAPIAppendLogToErrors|ISAPIAppendLogToQuery|ISAPICacheFile|ISAPIFakeAsync|ISAPILogNotSupported|ISAPIReadAheadBuffer)\\\\b' },\n         { token: 'keyword.ldap.apacheconf',\n           regex: '\\\\b(?:LDAPCacheEntries|LDAPCacheTTL|LDAPConnectionTimeout|LDAPOpCacheEntries|LDAPOpCacheTTL|LDAPSharedCacheFile|LDAPSharedCacheSize|LDAPTrustedCA|LDAPTrustedCAType)\\\\b' },\n         { token: 'keyword.log.apacheconf',\n           regex: '\\\\b(?:BufferedLogs|CookieLog|CustomLog|LogFormat|TransferLog|ForensicLog)\\\\b' },\n         { token: 'keyword.mem_cache.apacheconf',\n           regex: '\\\\b(?:MCacheMaxObjectCount|MCacheMaxObjectSize|MCacheMaxStreamingBuffer|MCacheMinObjectSize|MCacheRemovalAlgorithm|MCacheSize)\\\\b' },\n         { token: 'keyword.mime.apacheconf',\n           regex: '\\\\b(?:AddCharset|AddEncoding|AddHandler|AddInputFilter|AddLanguage|AddOutputFilter|AddType|DefaultLanguage|ModMimeUsePathInfo|MultiviewsMatch|RemoveCharset|RemoveEncoding|RemoveHandler|RemoveInputFilter|RemoveLanguage|RemoveOutputFilter|RemoveType|TypesConfig)\\\\b' },\n         { token: 'keyword.misc.apacheconf',\n           regex: '\\\\b(?:ProtocolEcho|Example|AddModuleInfo|MimeMagicFile|CheckSpelling|ExtendedStatus|SuexecUserGroup|UserDir)\\\\b' },\n         { token: 'keyword.negotiation.apacheconf',\n           regex: '\\\\b(?:CacheNegotiatedDocs|ForceLanguagePriority|LanguagePriority)\\\\b' },\n         { token: 'keyword.nw_ssl.apacheconf',\n           regex: '\\\\b(?:NWSSLTrustedCerts|NWSSLUpgradeable|SecureListen)\\\\b' },\n         { token: 'keyword.proxy.apacheconf',\n           regex: '\\\\b(?:AllowCONNECT|NoProxy|ProxyBadHeader|ProxyBlock|ProxyDomain|ProxyErrorOverride|ProxyFtpDirCharset|ProxyIOBufferSize|ProxyMaxForwards|ProxyPass|ProxyPassReverse|ProxyPreserveHost|ProxyReceiveBufferSize|ProxyRemote|ProxyRemoteMatch|ProxyRequests|ProxyTimeout|ProxyVia)\\\\b' },\n         { token: 'keyword.rewrite.apacheconf',\n           regex: '\\\\b(?:RewriteBase|RewriteCond|RewriteEngine|RewriteLock|RewriteLog|RewriteLogLevel|RewriteMap|RewriteOptions|RewriteRule)\\\\b' },\n         { token: 'keyword.setenvif.apacheconf',\n           regex: '\\\\b(?:BrowserMatch|BrowserMatchNoCase|SetEnvIf|SetEnvIfNoCase)\\\\b' },\n         { token: 'keyword.so.apacheconf',\n           regex: '\\\\b(?:LoadFile|LoadModule)\\\\b' },\n         { token: 'keyword.ssl.apacheconf',\n           regex: '\\\\b(?:SSLCACertificateFile|SSLCACertificatePath|SSLCARevocationFile|SSLCARevocationPath|SSLCertificateChainFile|SSLCertificateFile|SSLCertificateKeyFile|SSLCipherSuite|SSLEngine|SSLMutex|SSLOptions|SSLPassPhraseDialog|SSLProtocol|SSLProxyCACertificateFile|SSLProxyCACertificatePath|SSLProxyCARevocationFile|SSLProxyCARevocationPath|SSLProxyCipherSuite|SSLProxyEngine|SSLProxyMachineCertificateFile|SSLProxyMachineCertificatePath|SSLProxyProtocol|SSLProxyVerify|SSLProxyVerifyDepth|SSLRandomSeed|SSLRequire|SSLRequireSSL|SSLSessionCache|SSLSessionCacheTimeout|SSLUserName|SSLVerifyClient|SSLVerifyDepth)\\\\b' },\n         { token: 'keyword.usertrack.apacheconf',\n           regex: '\\\\b(?:CookieDomain|CookieExpires|CookieName|CookieStyle|CookieTracking)\\\\b' },\n         { token: 'keyword.vhost_alias.apacheconf',\n           regex: '\\\\b(?:VirtualDocumentRoot|VirtualDocumentRootIP|VirtualScriptAlias|VirtualScriptAliasIP)\\\\b' },\n         { token: \n            [ 'keyword.php.apacheconf',\n              'text',\n              'entity.property.apacheconf',\n              'text',\n              'string.value.apacheconf',\n              'text' ],\n           regex: '\\\\b(php_value|php_flag)\\\\b(?:(\\\\s+)(.+?)(?:(\\\\s+)(.+?))?)?(\\\\s)' },\n         { token: \n            [ 'punctuation.variable.apacheconf',\n              'variable.env.apacheconf',\n              'variable.misc.apacheconf',\n              'punctuation.variable.apacheconf' ],\n           regex: '(%\\\\{)(?:(HTTP_USER_AGENT|HTTP_REFERER|HTTP_COOKIE|HTTP_FORWARDED|HTTP_HOST|HTTP_PROXY_CONNECTION|HTTP_ACCEPT|REMOTE_ADDR|REMOTE_HOST|REMOTE_PORT|REMOTE_USER|REMOTE_IDENT|REQUEST_METHOD|SCRIPT_FILENAME|PATH_INFO|QUERY_STRING|AUTH_TYPE|DOCUMENT_ROOT|SERVER_ADMIN|SERVER_NAME|SERVER_ADDR|SERVER_PORT|SERVER_PROTOCOL|SERVER_SOFTWARE|TIME_YEAR|TIME_MON|TIME_DAY|TIME_HOUR|TIME_MIN|TIME_SEC|TIME_WDAY|TIME|API_VERSION|THE_REQUEST|REQUEST_URI|REQUEST_FILENAME|IS_SUBREQ|HTTPS)|(.*?))(\\\\})' },\n         { token: [ 'entity.mime-type.apacheconf', 'text' ],\n           regex: '\\\\b((?:text|image|application|video|audio)/.+?)(\\\\s)' },\n         { token: 'entity.helper.apacheconf',\n           regex: '\\\\b(?:from|unset|set|on|off)\\\\b',\n           caseInsensitive: true },\n         { token: 'constant.integer.apacheconf', regex: '\\\\b\\\\d+\\\\b' },\n         { token: \n            [ 'text',\n              'punctuation.definition.flag.apacheconf',\n              'string.flag.apacheconf',\n              'punctuation.definition.flag.apacheconf',\n              'text' ],\n           regex: '(\\\\s)(\\\\[)(.*?)(\\\\])(\\\\s)' } ] }\n    \n    this.normalizeRules();\n};\n\nApacheConfHighlightRules.metaData = { fileTypes: \n       [ 'conf',\n         'CONF',\n         'htaccess',\n         'HTACCESS',\n         'htgroups',\n         'HTGROUPS',\n         'htpasswd',\n         'HTPASSWD',\n         '.htaccess',\n         '.HTACCESS',\n         '.htgroups',\n         '.HTGROUPS',\n         '.htpasswd',\n         '.HTPASSWD' ],\n      name: 'Apache Conf',\n      scopeName: 'source.apacheconf' }\n\n\noop.inherits(ApacheConfHighlightRules, TextHighlightRules);\n\nexports.ApacheConfHighlightRules = ApacheConfHighlightRules;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/apache_conf\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/apache_conf_highlight_rules\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar ApacheConfHighlightRules = require(\"./apache_conf_highlight_rules\").ApacheConfHighlightRules;\nvar FoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = ApacheConfHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"#\";\n    this.$id = \"ace/mode/apache_conf\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-applescript.js",
    "content": "ace.define(\"ace/mode/applescript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar AppleScriptHighlightRules = function() {\n    var keywords = (\n        \"about|above|after|against|and|around|as|at|back|before|beginning|\" +\n        \"behind|below|beneath|beside|between|but|by|considering|\" +\n        \"contain|contains|continue|copy|div|does|eighth|else|end|equal|\" +\n        \"equals|error|every|exit|fifth|first|for|fourth|from|front|\" +\n        \"get|given|global|if|ignoring|in|into|is|it|its|last|local|me|\" +\n        \"middle|mod|my|ninth|not|of|on|onto|or|over|prop|property|put|ref|\" +\n        \"reference|repeat|returning|script|second|set|seventh|since|\" +\n        \"sixth|some|tell|tenth|that|the|then|third|through|thru|\" +\n        \"timeout|times|to|transaction|try|until|where|while|whose|with|without\"\n    );\n\n    var builtinConstants = (\n        \"AppleScript|false|linefeed|return|pi|quote|result|space|tab|true\"\n    );\n\n    var builtinFunctions = (\n        \"activate|beep|count|delay|launch|log|offset|read|round|run|say|\" +\n        \"summarize|write\"\n    );\n\n    var builtinTypes = (\n        \"alias|application|boolean|class|constant|date|file|integer|list|\" +\n        \"number|real|record|string|text|character|characters|contents|day|\" +\n        \"frontmost|id|item|length|month|name|paragraph|paragraphs|rest|\" +\n        \"reverse|running|time|version|weekday|word|words|year\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": builtinFunctions,\n        \"constant.language\": builtinConstants,\n        \"support.type\": builtinTypes,\n        \"keyword\": keywords\n    }, \"identifier\");\n\n    this.$rules = {\n        \"start\": [\n            {\n                token: \"comment\",\n                regex: \"--.*$\"\n            },\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\(\\\\*\",\n                next : \"comment\"\n            },\n            {\n                token: \"string\",           // \" string\n                regex: '\".*?\"'\n            },\n            {\n                token: \"support.type\",\n                regex: '\\\\b(POSIX file|POSIX path|(date|time) string|quoted form)\\\\b'\n            },\n            {\n                token: \"support.function\",\n                regex: '\\\\b(clipboard info|the clipboard|info for|list (disks|folder)|' +\n          'mount volume|path to|(close|open for) access|(get|set) eof|' +\n          'current date|do shell script|get volume settings|random number|' +\n          'set volume|system attribute|system info|time to GMT|' +\n          '(load|run|store) script|scripting components|' +\n          'ASCII (character|number)|localized string|' +\n          'choose (application|color|file|file name|' +\n          'folder|from list|remote application|URL)|' +\n          'display (alert|dialog))\\\\b|^\\\\s*return\\\\b'\n            },\n            {\n                token: \"constant.language\",\n                regex: '\\\\b(text item delimiters|current application|missing value)\\\\b'\n            },\n            {\n                token: \"keyword\",\n                regex: '\\\\b(apart from|aside from|instead of|out of|greater than|' +\n          \"isn't|(doesn't|does not) (equal|come before|come after|contain)|\" +\n          '(greater|less) than( or equal)?|(starts?|ends|begins?) with|' +\n          'contained by|comes (before|after)|a (ref|reference))\\\\b'\n            },\n            {\n                token: keywordMapper,\n                regex: \"[a-zA-Z][a-zA-Z0-9_]*\\\\b\"\n            }\n        ],\n        \"comment\": [\n            {\n                token: \"comment\", // closing comment\n                regex: \"\\\\*\\\\)\",\n                next: \"start\"\n            }, {\n                defaultToken: \"comment\"\n            }\n        ]\n    }\n\n    this.normalizeRules();\n};\n\noop.inherits(AppleScriptHighlightRules, TextHighlightRules);\n\nexports.AppleScriptHighlightRules = AppleScriptHighlightRules;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/applescript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/tokenizer\",\"ace/mode/applescript_highlight_rules\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar AppleScriptHighlightRules = require(\"./applescript_highlight_rules\").AppleScriptHighlightRules;\nvar FoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = AppleScriptHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"--\";\n    this.blockComment = {start: \"(*\", end: \"*)\"};\n    this.$id = \"ace/mode/applescript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-asciidoc.js",
    "content": "ace.define(\"ace/mode/asciidoc_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar AsciidocHighlightRules = function() {\n    var identifierRe = \"[a-zA-Z\\u00a1-\\uffff]+\\\\b\";\n\n    this.$rules = {\n        \"start\": [\n            {token: \"empty\",   regex: /$/},\n            {token: \"literal\", regex: /^\\.{4,}\\s*$/,  next: \"listingBlock\"},\n            {token: \"literal\", regex: /^-{4,}\\s*$/,   next: \"literalBlock\"},\n            {token: \"string\",  regex: /^\\+{4,}\\s*$/,  next: \"passthroughBlock\"},\n            {token: \"keyword\", regex: /^={4,}\\s*$/},\n            {token: \"text\",    regex: /^\\s*$/},\n            {token: \"empty\", regex: \"\", next: \"dissallowDelimitedBlock\"}\n        ],\n\n        \"dissallowDelimitedBlock\": [\n            {include: \"paragraphEnd\"},\n            {token: \"comment\", regex: '^//.+$'},\n            {token: \"keyword\", regex: \"^(?:NOTE|TIP|IMPORTANT|WARNING|CAUTION):\"},\n\n            {include: \"listStart\"},\n            {token: \"literal\", regex: /^\\s+.+$/, next: \"indentedBlock\"},\n            {token: \"empty\",   regex: \"\", next: \"text\"}\n        ],\n\n        \"paragraphEnd\": [\n            {token: \"doc.comment\", regex: /^\\/{4,}\\s*$/,    next: \"commentBlock\"},\n            {token: \"tableBlock\",  regex: /^\\s*[|!]=+\\s*$/, next: \"tableBlock\"},\n            {token: \"keyword\",     regex: /^(?:--|''')\\s*$/, next: \"start\"},\n            {token: \"option\",      regex: /^\\[.*\\]\\s*$/,     next: \"start\"},\n            {token: \"pageBreak\",   regex: /^>{3,}$/,         next: \"start\"},\n            {token: \"literal\",     regex: /^\\.{4,}\\s*$/,     next: \"listingBlock\"},\n            {token: \"titleUnderline\",    regex: /^(?:={2,}|-{2,}|~{2,}|\\^{2,}|\\+{2,})\\s*$/, next: \"start\"},\n            {token: \"singleLineTitle\",   regex: /^={1,5}\\s+\\S.*$/, next: \"start\"},\n\n            {token: \"otherBlock\",    regex: /^(?:\\*{2,}|_{2,})\\s*$/, next: \"start\"},\n            {token: \"optionalTitle\", regex: /^\\.[^.\\s].+$/,  next: \"start\"}\n        ],\n\n        \"listStart\": [\n            {token: \"keyword\",  regex: /^\\s*(?:\\d+\\.|[a-zA-Z]\\.|[ixvmIXVM]+\\)|\\*{1,5}|-|\\.{1,5})\\s/, next: \"listText\"},\n            {token: \"meta.tag\", regex: /^.+(?::{2,4}|;;)(?: |$)/, next: \"listText\"},\n            {token: \"support.function.list.callout\", regex: /^(?:<\\d+>|\\d+>|>) /, next: \"text\"},\n            {token: \"keyword\",  regex: /^\\+\\s*$/, next: \"start\"}\n        ],\n\n        \"text\": [\n            {token: [\"link\", \"variable.language\"], regex: /((?:https?:\\/\\/|ftp:\\/\\/|file:\\/\\/|mailto:|callto:)[^\\s\\[]+)(\\[.*?\\])/},\n            {token: \"link\", regex: /(?:https?:\\/\\/|ftp:\\/\\/|file:\\/\\/|mailto:|callto:)[^\\s\\[]+/},\n            {token: \"link\", regex: /\\b[\\w\\.\\/\\-]+@[\\w\\.\\/\\-]+\\b/},\n            {include: \"macros\"},\n            {include: \"paragraphEnd\"},\n            {token: \"literal\", regex:/\\+{3,}/, next:\"smallPassthrough\"},\n            {token: \"escape\", regex: /\\((?:C|TM|R)\\)|\\.{3}|->|<-|=>|<=|&#(?:\\d+|x[a-fA-F\\d]+);|(?: |^)--(?=\\s+\\S)/},\n            {token: \"escape\", regex: /\\\\[_*'`+#]|\\\\{2}[_*'`+#]{2}/},\n            {token: \"keyword\", regex: /\\s\\+$/},\n            {token: \"text\", regex: identifierRe},\n            {token: [\"keyword\", \"string\", \"keyword\"],\n                regex: /(<<[\\w\\d\\-$]+,)(.*?)(>>|$)/},\n            {token: \"keyword\", regex: /<<[\\w\\d\\-$]+,?|>>/},\n            {token: \"constant.character\", regex: /\\({2,3}.*?\\){2,3}/},\n            {token: \"keyword\", regex: /\\[\\[.+?\\]\\]/},\n            {token: \"support\", regex: /^\\[{3}[\\w\\d =\\-]+\\]{3}/},\n\n            {include: \"quotes\"},\n            {token: \"empty\", regex: /^\\s*$/, next: \"start\"}\n        ],\n\n        \"listText\": [\n            {include: \"listStart\"},\n            {include: \"text\"}\n        ],\n\n        \"indentedBlock\": [\n            {token: \"literal\", regex: /^[\\s\\w].+$/, next: \"indentedBlock\"},\n            {token: \"literal\", regex: \"\", next: \"start\"}\n        ],\n\n        \"listingBlock\": [\n            {token: \"literal\", regex: /^\\.{4,}\\s*$/, next: \"dissallowDelimitedBlock\"},\n            {token: \"constant.numeric\", regex: '<\\\\d+>'},\n            {token: \"literal\", regex: '[^<]+'},\n            {token: \"literal\", regex: '<'}\n        ],\n        \"literalBlock\": [\n            {token: \"literal\", regex: /^-{4,}\\s*$/, next: \"dissallowDelimitedBlock\"},\n            {token: \"constant.numeric\", regex: '<\\\\d+>'},\n            {token: \"literal\", regex: '[^<]+'},\n            {token: \"literal\", regex: '<'}\n        ],\n        \"passthroughBlock\": [\n            {token: \"literal\", regex: /^\\+{4,}\\s*$/, next: \"dissallowDelimitedBlock\"},\n            {token: \"literal\", regex: identifierRe + \"|\\\\d+\"},\n            {include: \"macros\"},\n            {token: \"literal\", regex: \".\"}\n        ],\n\n        \"smallPassthrough\": [\n            {token: \"literal\", regex: /[+]{3,}/, next: \"dissallowDelimitedBlock\"},\n            {token: \"literal\", regex: /^\\s*$/, next: \"dissallowDelimitedBlock\"},\n            {token: \"literal\", regex: identifierRe + \"|\\\\d+\"},\n            {include: \"macros\"}\n        ],\n\n        \"commentBlock\": [\n            {token: \"doc.comment\", regex: /^\\/{4,}\\s*$/, next: \"dissallowDelimitedBlock\"},\n            {token: \"doc.comment\", regex: '^.*$'}\n        ],\n        \"tableBlock\": [\n            {token: \"tableBlock\", regex: /^\\s*\\|={3,}\\s*$/, next: \"dissallowDelimitedBlock\"},\n            {token: \"tableBlock\", regex: /^\\s*!={3,}\\s*$/, next: \"innerTableBlock\"},\n            {token: \"tableBlock\", regex: /\\|/},\n            {include: \"text\", noEscape: true}\n        ],\n        \"innerTableBlock\": [\n            {token: \"tableBlock\", regex: /^\\s*!={3,}\\s*$/, next: \"tableBlock\"},\n            {token: \"tableBlock\", regex: /^\\s*|={3,}\\s*$/, next: \"dissallowDelimitedBlock\"},\n            {token: \"tableBlock\", regex: /\\!/}\n        ],\n        \"macros\": [\n            {token: \"macro\", regex: /{[\\w\\-$]+}/},\n            {token: [\"text\", \"string\", \"text\", \"constant.character\", \"text\"], regex: /({)([\\w\\-$]+)(:)?(.+)?(})/},\n            {token: [\"text\", \"markup.list.macro\", \"keyword\", \"string\"], regex: /(\\w+)(footnote(?:ref)?::?)([^\\s\\[]+)?(\\[.*?\\])?/},\n            {token: [\"markup.list.macro\", \"keyword\", \"string\"], regex: /([a-zA-Z\\-][\\w\\.\\/\\-]*::?)([^\\s\\[]+)(\\[.*?\\])?/},\n            {token: [\"markup.list.macro\", \"keyword\"], regex: /([a-zA-Z\\-][\\w\\.\\/\\-]+::?)(\\[.*?\\])/},\n            {token: \"keyword\",     regex: /^:.+?:(?= |$)/}\n        ],\n\n        \"quotes\": [\n            {token: \"string.italic\", regex: /__[^_\\s].*?__/},\n            {token: \"string.italic\", regex: quoteRule(\"_\")},\n            \n            {token: \"keyword.bold\", regex: /\\*\\*[^*\\s].*?\\*\\*/},\n            {token: \"keyword.bold\", regex: quoteRule(\"\\\\*\")},\n            \n            {token: \"literal\", regex: quoteRule(\"\\\\+\")},\n            {token: \"literal\", regex: /\\+\\+[^+\\s].*?\\+\\+/},\n            {token: \"literal\", regex: /\\$\\$.+?\\$\\$/},\n            {token: \"literal\", regex: quoteRule(\"`\")},\n\n            {token: \"keyword\", regex: quoteRule(\"^\")},\n            {token: \"keyword\", regex: quoteRule(\"~\")},\n            {token: \"keyword\", regex: /##?/},\n            {token: \"keyword\", regex: /(?:\\B|^)``|\\b''/}\n        ]\n\n    };\n\n    function quoteRule(ch) {\n        var prefix = /\\w/.test(ch) ? \"\\\\b\" : \"(?:\\\\B|^)\";\n        return prefix + ch + \"[^\" + ch + \"].*?\" + ch + \"(?![\\\\w*])\";\n    }\n\n    var tokenMap = {\n        macro: \"constant.character\",\n        tableBlock: \"doc.comment\",\n        titleUnderline: \"markup.heading\",\n        singleLineTitle: \"markup.heading\",\n        pageBreak: \"string\",\n        option: \"string.regexp\",\n        otherBlock: \"markup.list\",\n        literal: \"support.function\",\n        optionalTitle: \"constant.numeric\",\n        escape: \"constant.language.escape\",\n        link: \"markup.underline.list\"\n    };\n\n    for (var state in this.$rules) {\n        var stateRules = this.$rules[state];\n        for (var i = stateRules.length; i--; ) {\n            var rule = stateRules[i];\n            if (rule.include || typeof rule == \"string\") {\n                var args = [i, 1].concat(this.$rules[rule.include || rule]);\n                if (rule.noEscape) {\n                    args = args.filter(function(x) {\n                        return !x.next;\n                    });\n                }\n                stateRules.splice.apply(stateRules, args);\n            } else if (rule.token in tokenMap) {\n                rule.token = tokenMap[rule.token];\n            }\n        }\n    }\n};\noop.inherits(AsciidocHighlightRules, TextHighlightRules);\n\nexports.AsciidocHighlightRules = AsciidocHighlightRules;\n});\n\nace.define(\"ace/mode/folding/asciidoc\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    this.foldingStartMarker = /^(?:\\|={10,}|[\\.\\/=\\-~^+]{4,}\\s*$|={1,5} )/;\n    this.singleLineHeadingRe = /^={1,5}(?=\\s+\\S)/;\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (!this.foldingStartMarker.test(line))\n            return \"\"\n\n        if (line[0] == \"=\") {\n            if (this.singleLineHeadingRe.test(line))\n                return \"start\";\n            if (session.getLine(row - 1).length != session.getLine(row).length)\n                return \"\";\n            return \"start\";\n        }\n        if (session.bgTokenizer.getState(row) == \"dissallowDelimitedBlock\")\n            return \"end\";\n        return \"start\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n        if (!line.match(this.foldingStartMarker))\n            return;\n\n        var token;\n        function getTokenType(row) {\n            token = session.getTokens(row)[0];\n            return token && token.type;\n        }\n\n        var levels = [\"=\",\"-\",\"~\",\"^\",\"+\"];\n        var heading = \"markup.heading\";\n        var singleLineHeadingRe = this.singleLineHeadingRe;\n        function getLevel() {\n            var match = token.value.match(singleLineHeadingRe);\n            if (match)\n                return match[0].length;\n            var level = levels.indexOf(token.value[0]) + 1;\n            if (level == 1) {\n                if (session.getLine(row - 1).length != session.getLine(row).length)\n                    return Infinity;\n            }\n            return level;\n        }\n\n        if (getTokenType(row) == heading) {\n            var startHeadingLevel = getLevel();\n            while (++row < maxRow) {\n                if (getTokenType(row) != heading)\n                    continue;\n                var level = getLevel();\n                if (level <= startHeadingLevel)\n                    break;\n            }\n\n            var isSingleLineHeading = token && token.value.match(this.singleLineHeadingRe);\n            endRow = isSingleLineHeading ? row - 1 : row - 2;\n\n            if (endRow > startRow) {\n                while (endRow > startRow && (!getTokenType(endRow) || token.value[0] == \"[\"))\n                    endRow--;\n            }\n\n            if (endRow > startRow) {\n                var endColumn = session.getLine(endRow).length;\n                return new Range(startRow, startColumn, endRow, endColumn);\n            }\n        } else {\n            var state = session.bgTokenizer.getState(row);\n            if (state == \"dissallowDelimitedBlock\") {\n                while (row -- > 0) {\n                    if (session.bgTokenizer.getState(row).lastIndexOf(\"Block\") == -1)\n                        break;\n                }\n                endRow = row + 1;\n                if (endRow < startRow) {\n                    var endColumn = session.getLine(row).length;\n                    return new Range(endRow, 5, startRow, startColumn - 5);\n                }\n            } else {\n                while (++row < maxRow) {\n                    if (session.bgTokenizer.getState(row) == \"dissallowDelimitedBlock\")\n                        break;\n                }\n                endRow = row;\n                if (endRow > startRow) {\n                    var endColumn = session.getLine(row).length;\n                    return new Range(startRow, 5, endRow, endColumn - 5);\n                }\n            }\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/asciidoc\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/asciidoc_highlight_rules\",\"ace/mode/folding/asciidoc\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar AsciidocHighlightRules = require(\"./asciidoc_highlight_rules\").AsciidocHighlightRules;\nvar AsciidocFoldMode = require(\"./folding/asciidoc\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = AsciidocHighlightRules;\n    \n    this.foldingRules = new AsciidocFoldMode();    \n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.type = \"text\";\n    this.getNextLineIndent = function(state, line, tab) {\n        if (state == \"listblock\") {\n            var match = /^((?:.+)?)([-+*][ ]+)/.exec(line);\n            if (match) {\n                return new Array(match[1].length + 1).join(\" \") + match[2];\n            } else {\n                return \"\";\n            }\n        } else {\n            return this.$getIndent(line);\n        }\n    };\n    this.$id = \"ace/mode/asciidoc\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-assembly_x86.js",
    "content": "ace.define(\"ace/mode/assembly_x86_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar AssemblyX86HighlightRules = function() {\n\n    this.$rules = { start: \n       [ { token: 'keyword.control.assembly',\n           regex: '\\\\b(?:aaa|aad|aam|aas|adc|add|addpd|addps|addsd|addss|addsubpd|addsubps|aesdec|aesdeclast|aesenc|aesenclast|aesimc|aeskeygenassist|and|andpd|andps|andnpd|andnps|arpl|blendpd|blendps|blendvpd|blendvps|bound|bsf|bsr|bswap|bt|btc|btr|bts|cbw|cwde|cdqe|clc|cld|cflush|clts|cmc|cmov(?:n?e|ge?|ae?|le?|be?|n?o|n?z)|cmp|cmppd|cmpps|cmps|cnpsb|cmpsw|cmpsd|cmpsq|cmpss|cmpxchg|cmpxchg8b|cmpxchg16b|comisd|comiss|cpuid|crc32|cvtdq2pd|cvtdq2ps|cvtpd2dq|cvtpd2pi|cvtpd2ps|cvtpi2pd|cvtpi2ps|cvtps2dq|cvtps2pd|cvtps2pi|cvtsd2si|cvtsd2ss|cvts2sd|cvtsi2ss|cvtss2sd|cvtss2si|cvttpd2dq|cvtpd2pi|cvttps2dq|cvttps2pi|cvttps2dq|cvttps2pi|cvttsd2si|cvttss2si|cwd|cdq|cqo|daa|das|dec|div|divpd|divps|divsd|divss|dppd|dpps|emms|enter|extractps|f2xm1|fabs|fadd|faddp|fiadd|fbld|fbstp|fchs|fclex|fnclex|fcmov(?:n?e|ge?|ae?|le?|be?|n?o|n?z)|fcom|fcmop|fcompp|fcomi|fcomip|fucomi|fucomip|fcos|fdecstp|fdiv|fdivp|fidiv|fdivr|fdivrp|fidivr|ffree|ficom|ficomp|fild|fincstp|finit|fnint|fist|fistp|fisttp|fld|fld1|fldl2t|fldl2e|fldpi|fldlg2|fldln2|fldz|fldcw|fldenv|fmul|fmulp|fimul|fnop|fpatan|fprem|fprem1|fptan|frndint|frstor|fsave|fnsave|fscale|fsin|fsincos|fsqrt|fst|fstp|fstcw|fnstcw|fstenv|fnstenv|fsts|fnstsw|fsub|fsubp|fisub|fsubr|fsubrp|fisubr|ftst|fucom|fucomp|fucompp|fxam|fxch|fxrstor|fxsave|fxtract|fyl2x|fyl2xp1|haddpd|haddps|husbpd|hsubps|idiv|imul|in|inc|ins|insb|insw|insd|insertps|int|into|invd|invplg|invpcid|iret|iretd|iretq|lahf|lar|lddqu|ldmxcsr|lds|les|lfs|lgs|lss|lea|leave|lfence|lgdt|lidt|llgdt|lmsw|lock|lods|lodsb|lodsw|lodsd|lodsq|lsl|ltr|maskmovdqu|maskmovq|maxpd|maxps|maxsd|maxss|mfence|minpd|minps|minsd|minss|monitor|mov|movapd|movaps|movbe|movd|movq|movddup|movdqa|movdqu|movq2q|movhlps|movhpd|movhps|movlhps|movlpd|movlps|movmskpd|movmskps|movntdqa|movntdq|movnti|movntpd|movntps|movntq|movq|movq2dq|movs|movsb|movsw|movsd|movsq|movsd|movshdup|movsldup|movss|movsx|movsxd|movupd|movups|movzx|mpsadbw|mul|mulpd|mulps|mulsd|mulss|mwait|neg|not|or|orpd|orps|out|outs|outsb|outsw|outsd|pabsb|pabsw|pabsd|packsswb|packssdw|packusdw|packuswbpaddb|paddw|paddd|paddq|paddsb|paddsw|paddusb|paddusw|palignr|pand|pandn|pause|pavgb|pavgw|pblendvb|pblendw|pclmulqdq|pcmpeqb|pcmpeqw|pcmpeqd|pcmpeqq|pcmpestri|pcmpestrm|pcmptb|pcmptgw|pcmpgtd|pcmpgtq|pcmpistri|pcmpisrm|pextrb|pextrd|pextrq|pextrw|phaddw|phaddd|phaddsw|phinposuw|phsubw|phsubd|phsubsw|pinsrb|pinsrd|pinsrq|pinsrw|pmaddubsw|pmadddwd|pmaxsb|pmaxsd|pmaxsw|pmaxsw|pmaxub|pmaxud|pmaxuw|pminsb|pminsd|pminsw|pminub|pminud|pminuw|pmovmskb|pmovsx|pmovzx|pmuldq|pmulhrsw|pmulhuw|pmulhw|pmulld|pmullw|pmuludw|pop|popa|popad|popcnt|popf|popfd|popfq|por|prefetch|psadbw|pshufb|pshufd|pshufhw|pshuflw|pshufw|psignb|psignw|psignd|pslldq|psllw|pslld|psllq|psraw|psrad|psrldq|psrlw|psrld|psrlq|psubb|psubw|psubd|psubq|psubsb|psubsw|psubusb|psubusw|test|ptest|punpckhbw|punpckhwd|punpckhdq|punpckhddq|punpcklbw|punpcklwd|punpckldq|punpckldqd|push|pusha|pushad|pushf|pushfd|pxor|prcl|rcr|rol|ror|rcpps|rcpss|rdfsbase|rdgsbase|rdmsr|rdpmc|rdrand|rdtsc|rdtscp|rep|repe|repz|repne|repnz|roundpd|roundps|roundsd|roundss|rsm|rsqrps|rsqrtss|sahf|sal|sar|shl|shr|sbb|scas|scasb|scasw|scasd|set(?:n?e|ge?|ae?|le?|be?|n?o|n?z)|sfence|sgdt|shld|shrd|shufpd|shufps|sidt|sldt|smsw|sqrtpd|sqrtps|sqrtsd|sqrtss|stc|std|stmxcsr|stos|stosb|stosw|stosd|stosq|str|sub|subpd|subps|subsd|subss|swapgs|syscall|sysenter|sysexit|sysret|teset|ucomisd|ucomiss|ud2|unpckhpd|unpckhps|unpcklpd|unpcklps|vbroadcast|vcvtph2ps|vcvtp2sph|verr|verw|vextractf128|vinsertf128|vmaskmov|vpermilpd|vpermilps|vperm2f128|vtestpd|vtestps|vzeroall|vzeroupper|wait|fwait|wbinvd|wrfsbase|wrgsbase|wrmsr|xadd|xchg|xgetbv|xlat|xlatb|xor|xorpd|xorps|xrstor|xsave|xsaveopt|xsetbv|lzcnt|extrq|insertq|movntsd|movntss|vfmaddpd|vfmaddps|vfmaddsd|vfmaddss|vfmaddsubbpd|vfmaddsubps|vfmsubaddpd|vfmsubaddps|vfmsubpd|vfmsubps|vfmsubsd|vfnmaddpd|vfnmaddps|vfnmaddsd|vfnmaddss|vfnmsubpd|vfnmusbps|vfnmusbsd|vfnmusbss|cvt|xor|cli|sti|hlt|nop|lock|wait|enter|leave|ret|loop(?:n?e|n?z)?|call|j(?:mp|n?e|ge?|ae?|le?|be?|n?o|n?z))\\\\b',\n           caseInsensitive: true },\n         { token: 'variable.parameter.register.assembly',\n           regex: '\\\\b(?:CS|DS|ES|FS|GS|SS|RAX|EAX|RBX|EBX|RCX|ECX|RDX|EDX|RCX|RIP|EIP|IP|RSP|ESP|SP|RSI|ESI|SI|RDI|EDI|DI|RFLAGS|EFLAGS|FLAGS|R8-15|(?:Y|X)MM(?:[0-9]|10|11|12|13|14|15)|(?:A|B|C|D)(?:X|H|L)|CR(?:[0-4]|DR(?:[0-7]|TR6|TR7|EFER)))\\\\b',\n           caseInsensitive: true },\n         { token: 'constant.character.decimal.assembly',\n           regex: '\\\\b[0-9]+\\\\b' },\n         { token: 'constant.character.hexadecimal.assembly',\n           regex: '\\\\b0x[A-F0-9]+\\\\b',\n           caseInsensitive: true },\n         { token: 'constant.character.hexadecimal.assembly',\n           regex: '\\\\b[A-F0-9]+h\\\\b',\n           caseInsensitive: true },\n         { token: 'string.assembly', regex: /'([^\\\\']|\\\\.)*'/ },\n         { token: 'string.assembly', regex: /\"([^\\\\\"]|\\\\.)*\"/ },\n         { token: 'support.function.directive.assembly',\n           regex: '^\\\\[',\n           push: \n            [ { token: 'support.function.directive.assembly',\n                regex: '\\\\]$',\n                next: 'pop' },\n              { defaultToken: 'support.function.directive.assembly' } ] },\n         { token: \n            [ 'support.function.directive.assembly',\n              'support.function.directive.assembly',\n              'entity.name.function.assembly' ],\n           regex: '(^struc)( )([_a-zA-Z][_a-zA-Z0-9]*)' },\n         { token: 'support.function.directive.assembly',\n           regex: '^endstruc\\\\b' },\n        { token: \n            [ 'support.function.directive.assembly',\n              'entity.name.function.assembly',\n              'support.function.directive.assembly',\n              'constant.character.assembly' ],\n           regex: '^(%macro )([_a-zA-Z][_a-zA-Z0-9]*)( )([0-9]+)' },\n         { token: 'support.function.directive.assembly',\n           regex: '^%endmacro' },\n         { token: \n            [ 'text',\n              'support.function.directive.assembly',\n              'text',\n              'entity.name.function.assembly' ],\n           regex: '(\\\\s*)(%define|%xdefine|%idefine|%undef|%assign|%defstr|%strcat|%strlen|%substr|%00|%0|%rotate|%rep|%endrep|%include|\\\\$\\\\$|\\\\$|%unmacro|%if|%elif|%else|%endif|%(?:el)?ifdef|%(?:el)?ifmacro|%(?:el)?ifctx|%(?:el)?ifidn|%(?:el)?ifidni|%(?:el)?ifid|%(?:el)?ifnum|%(?:el)?ifstr|%(?:el)?iftoken|%(?:el)?ifempty|%(?:el)?ifenv|%pathsearch|%depend|%use|%push|%pop|%repl|%arg|%stacksize|%local|%error|%warning|%fatal|%line|%!|%comment|%endcomment|__NASM_VERSION_ID__|__NASM_VER__|__FILE__|__LINE__|__BITS__|__OUTPUT_FORMAT__|__DATE__|__TIME__|__DATE_NUM__|_TIME__NUM__|__UTC_DATE__|__UTC_TIME__|__UTC_DATE_NUM__|__UTC_TIME_NUM__|__POSIX_TIME__|__PASS__|ISTRUC|AT|IEND|BITS 16|BITS 32|BITS 64|USE16|USE32|__SECT__|ABSOLUTE|EXTERN|GLOBAL|COMMON|CPU|FLOAT)\\\\b( ?)((?:[_a-zA-Z][_a-zA-Z0-9]*)?)',\n           caseInsensitive: true },\n          { token: 'support.function.directive.assembly',\n           regex: '\\\\b(?:d[bwdqtoy]|res[bwdqto]|equ|times|align|alignb|sectalign|section|ptr|byte|word|dword|qword|incbin)\\\\b',\n           caseInsensitive: true },\n         { token: 'entity.name.function.assembly', regex: '^\\\\s*%%[\\\\w.]+?:$' },\n         { token: 'entity.name.function.assembly', regex: '^\\\\s*%\\\\$[\\\\w.]+?:$' },\n         { token: 'entity.name.function.assembly', regex: '^[\\\\w.]+?:' },\n         { token: 'entity.name.function.assembly', regex: '^[\\\\w.]+?\\\\b' },\n         { token: 'comment.assembly', regex: ';.*$' } ] \n    }\n    \n    this.normalizeRules();\n};\n\nAssemblyX86HighlightRules.metaData = { fileTypes: [ 'asm' ],\n      name: 'Assembly x86',\n      scopeName: 'source.assembly' }\n\n\noop.inherits(AssemblyX86HighlightRules, TextHighlightRules);\n\nexports.AssemblyX86HighlightRules = AssemblyX86HighlightRules;\n});\n\nace.define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var range = this.indentationBlock(session, row);\n        if (range)\n            return range;\n\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1 || line[startLevel] != \"#\")\n            return;\n\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var level = line.search(re);\n\n            if (level == -1)\n                continue;\n\n            if (line[level] != \"#\")\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        var next = session.getLine(row + 1);\n        var prev = session.getLine(row - 1);\n        var prevIndent = prev.search(/\\S/);\n        var nextIndent = next.search(/\\S/);\n\n        if (indent == -1) {\n            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? \"start\" : \"\";\n            return \"\";\n        }\n        if (prevIndent == -1) {\n            if (indent == nextIndent && line[indent] == \"#\" && next[indent] == \"#\") {\n                session.foldWidgets[row - 1] = \"\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"start\";\n            }\n        } else if (prevIndent == indent && line[indent] == \"#\" && prev[indent] == \"#\") {\n            if (session.getLine(row - 2).search(/\\S/) == -1) {\n                session.foldWidgets[row - 1] = \"start\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"\";\n            }\n        }\n\n        if (prevIndent!= -1 && prevIndent < indent)\n            session.foldWidgets[row - 1] = \"start\";\n        else\n            session.foldWidgets[row - 1] = \"\";\n\n        if (indent < nextIndent)\n            return \"start\";\n        else\n            return \"\";\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/assembly_x86\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/assembly_x86_highlight_rules\",\"ace/mode/folding/coffee\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar AssemblyX86HighlightRules = require(\"./assembly_x86_highlight_rules\").AssemblyX86HighlightRules;\nvar FoldMode = require(\"./folding/coffee\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = AssemblyX86HighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \";\";\n    this.$id = \"ace/mode/assembly_x86\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-autohotkey.js",
    "content": "ace.define(\"ace/mode/autohotkey_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar AutoHotKeyHighlightRules = function() {\n    var autoItKeywords = 'And|ByRef|Case|Const|ContinueCase|ContinueLoop|Default|Dim|Do|Else|ElseIf|EndFunc|EndIf|EndSelect|EndSwitch|EndWith|Enum|Exit|ExitLoop|False|For|Func|Global|If|In|Local|Next|Not|Or|ReDim|Return|Select|Step|Switch|Then|To|True|Until|WEnd|While|With|' +       \n        'Abs|ACos|AdlibDisable|AdlibEnable|Asc|AscW|ASin|Assign|ATan|AutoItSetOption|AutoItWinGetTitle|AutoItWinSetTitle|Beep|Binary|BinaryLen|BinaryMid|BinaryToString|BitAND|BitNOT|BitOR|BitRotate|BitShift|BitXOR|BlockInput|Break|Call|CDTray|Ceiling|Chr|ChrW|ClipGet|ClipPut|ConsoleRead|ConsoleWrite|ConsoleWriteError|ControlClick|ControlCommand|ControlDisable|ControlEnable|ControlFocus|ControlGetFocus|ControlGetHandle|ControlGetPos|ControlGetText|ControlHide|ControlListView|ControlMove|ControlSend|ControlSetText|ControlShow|ControlTreeView|Cos|Dec|DirCopy|DirCreate|DirGetSize|DirMove|DirRemove|DllCall|DllCallbackFree|DllCallbackGetPtr|DllCallbackRegister|DllClose|DllOpen|DllStructCreate|DllStructGetData|DllStructGetPtr|DllStructGetSize|DllStructSetData|DriveGetDrive|DriveGetFileSystem|DriveGetLabel|DriveGetSerial|DriveGetType|DriveMapAdd|DriveMapDel|DriveMapGet|DriveSetLabel|DriveSpaceFree|DriveSpaceTotal|DriveStatus|EnvGet|EnvSet|EnvUpdate|Eval|Execute|Exp|FileChangeDir|FileClose|FileCopy|FileCreateNTFSLink|FileCreateShortcut|FileDelete|FileExists|FileFindFirstFile|FileFindNextFile|FileGetAttrib|FileGetLongName|FileGetShortcut|FileGetShortName|FileGetSize|FileGetTime|FileGetVersion|FileInstall|FileMove|FileOpen|FileOpenDialog|FileRead|FileReadLine|FileRecycle|FileRecycleEmpty|FileSaveDialog|FileSelectFolder|FileSetAttrib|FileSetTime|FileWrite|FileWriteLine|Floor|FtpSetProxy|GUICreate|GUICtrlCreateAvi|GUICtrlCreateButton|GUICtrlCreateCheckbox|GUICtrlCreateCombo|GUICtrlCreateContextMenu|GUICtrlCreateDate|GUICtrlCreateDummy|GUICtrlCreateEdit|GUICtrlCreateGraphic|GUICtrlCreateGroup|GUICtrlCreateIcon|GUICtrlCreateInput|GUICtrlCreateLabel|GUICtrlCreateList|GUICtrlCreateListView|GUICtrlCreateListViewItem|GUICtrlCreateMenu|GUICtrlCreateMenuItem|GUICtrlCreateMonthCal|GUICtrlCreateObj|GUICtrlCreatePic|GUICtrlCreateProgress|GUICtrlCreateRadio|GUICtrlCreateSlider|GUICtrlCreateTab|GUICtrlCreateTabItem|GUICtrlCreateTreeView|GUICtrlCreateTreeViewItem|GUICtrlCreateUpdown|GUICtrlDelete|GUICtrlGetHandle|GUICtrlGetState|GUICtrlRead|GUICtrlRecvMsg|GUICtrlRegisterListViewSort|GUICtrlSendMsg|GUICtrlSendToDummy|GUICtrlSetBkColor|GUICtrlSetColor|GUICtrlSetCursor|GUICtrlSetData|GUICtrlSetFont|GUICtrlSetDefColor|GUICtrlSetDefBkColor|GUICtrlSetGraphic|GUICtrlSetImage|GUICtrlSetLimit|GUICtrlSetOnEvent|GUICtrlSetPos|GUICtrlSetResizing|GUICtrlSetState|GUICtrlSetStyle|GUICtrlSetTip|GUIDelete|GUIGetCursorInfo|GUIGetMsg|GUIGetStyle|GUIRegisterMsg|GUISetAccelerators()|GUISetBkColor|GUISetCoord|GUISetCursor|GUISetFont|GUISetHelp|GUISetIcon|GUISetOnEvent|GUISetState|GUISetStyle|GUIStartGroup|GUISwitch|Hex|HotKeySet|HttpSetProxy|HWnd|InetGet|InetGetSize|IniDelete|IniRead|IniReadSection|IniReadSectionNames|IniRenameSection|IniWrite|IniWriteSection|InputBox|Int|IsAdmin|IsArray|IsBinary|IsBool|IsDeclared|IsDllStruct|IsFloat|IsHWnd|IsInt|IsKeyword|IsNumber|IsObj|IsPtr|IsString|Log|MemGetStats|Mod|MouseClick|MouseClickDrag|MouseDown|MouseGetCursor|MouseGetPos|MouseMove|MouseUp|MouseWheel|MsgBox|Number|ObjCreate|ObjEvent|ObjGet|ObjName|Opt|Ping|PixelChecksum|PixelGetColor|PixelSearch|PluginClose|PluginOpen|ProcessClose|ProcessExists|ProcessGetStats|ProcessList|ProcessSetPriority|ProcessWait|ProcessWaitClose|ProgressOff|ProgressOn|ProgressSet|Ptr|Random|RegDelete|RegEnumKey|RegEnumVal|RegRead|RegWrite|Round|Run|RunAs|RunAsWait|RunWait|Send|SendKeepActive|SetError|SetExtended|ShellExecute|ShellExecuteWait|Shutdown|Sin|Sleep|SoundPlay|SoundSetWaveVolume|SplashImageOn|SplashOff|SplashTextOn|Sqrt|SRandom|StatusbarGetText|StderrRead|StdinWrite|StdioClose|StdoutRead|String|StringAddCR|StringCompare|StringFormat|StringInStr|StringIsAlNum|StringIsAlpha|StringIsASCII|StringIsDigit|StringIsFloat|StringIsInt|StringIsLower|StringIsSpace|StringIsUpper|StringIsXDigit|StringLeft|StringLen|StringLower|StringMid|StringRegExp|StringRegExpReplace|StringReplace|StringRight|StringSplit|StringStripCR|StringStripWS|StringToBinary|StringTrimLeft|StringTrimRight|StringUpper|Tan|TCPAccept|TCPCloseSocket|TCPConnect|TCPListen|TCPNameToIP|TCPRecv|TCPSend|TCPShutdown|TCPStartup|TimerDiff|TimerInit|ToolTip|TrayCreateItem|TrayCreateMenu|TrayGetMsg|TrayItemDelete|TrayItemGetHandle|TrayItemGetState|TrayItemGetText|TrayItemSetOnEvent|TrayItemSetState|TrayItemSetText|TraySetClick|TraySetIcon|TraySetOnEvent|TraySetPauseIcon|TraySetState|TraySetToolTip|TrayTip|UBound|UDPBind|UDPCloseSocket|UDPOpen|UDPRecv|UDPSend|UDPShutdown|UDPStartup|VarGetType|WinActivate|WinActive|WinClose|WinExists|WinFlash|WinGetCaretPos|WinGetClassList|WinGetClientSize|WinGetHandle|WinGetPos|WinGetProcess|WinGetState|WinGetText|WinGetTitle|WinKill|WinList|WinMenuSelectItem|WinMinimizeAll|WinMinimizeAllUndo|WinMove|WinSetOnTop|WinSetState|WinSetTitle|WinSetTrans|WinWait|WinWaitActive|WinWaitClose|WinWaitNotActive|' +\n        'ArrayAdd|ArrayBinarySearch|ArrayConcatenate|ArrayDelete|ArrayDisplay|ArrayFindAll|ArrayInsert|ArrayMax|ArrayMaxIndex|ArrayMin|ArrayMinIndex|ArrayPop|ArrayPush|ArrayReverse|ArraySearch|ArraySort|ArraySwap|ArrayToClip|ArrayToString|ArrayTrim|ChooseColor|ChooseFont|ClipBoard_ChangeChain|ClipBoard_Close|ClipBoard_CountFormats|ClipBoard_Empty|ClipBoard_EnumFormats|ClipBoard_FormatStr|ClipBoard_GetData|ClipBoard_GetDataEx|ClipBoard_GetFormatName|ClipBoard_GetOpenWindow|ClipBoard_GetOwner|ClipBoard_GetPriorityFormat|ClipBoard_GetSequenceNumber|ClipBoard_GetViewer|ClipBoard_IsFormatAvailable|ClipBoard_Open|ClipBoard_RegisterFormat|ClipBoard_SetData|ClipBoard_SetDataEx|ClipBoard_SetViewer|ClipPutFile|ColorConvertHSLtoRGB|ColorConvertRGBtoHSL|ColorGetBlue|ColorGetGreen|ColorGetRed|Date_Time_CompareFileTime|Date_Time_DOSDateTimeToArray|Date_Time_DOSDateTimeToFileTime|Date_Time_DOSDateTimeToStr|Date_Time_DOSDateToArray|Date_Time_DOSDateToStr|Date_Time_DOSTimeToArray|Date_Time_DOSTimeToStr|Date_Time_EncodeFileTime|Date_Time_EncodeSystemTime|Date_Time_FileTimeToArray|Date_Time_FileTimeToDOSDateTime|Date_Time_FileTimeToLocalFileTime|Date_Time_FileTimeToStr|Date_Time_FileTimeToSystemTime|Date_Time_GetFileTime|Date_Time_GetLocalTime|Date_Time_GetSystemTime|Date_Time_GetSystemTimeAdjustment|Date_Time_GetSystemTimeAsFileTime|Date_Time_GetSystemTimes|Date_Time_GetTickCount|Date_Time_GetTimeZoneInformation|Date_Time_LocalFileTimeToFileTime|Date_Time_SetFileTime|Date_Time_SetLocalTime|Date_Time_SetSystemTime|Date_Time_SetSystemTimeAdjustment|Date_Time_SetTimeZoneInformation|Date_Time_SystemTimeToArray|Date_Time_SystemTimeToDateStr|Date_Time_SystemTimeToDateTimeStr|Date_Time_SystemTimeToFileTime|Date_Time_SystemTimeToTimeStr|Date_Time_SystemTimeToTzSpecificLocalTime|Date_Time_TzSpecificLocalTimeToSystemTime|DateAdd|DateDayOfWeek|DateDaysInMonth|DateDiff|DateIsLeapYear|DateIsValid|DateTimeFormat|DateTimeSplit|DateToDayOfWeek|DateToDayOfWeekISO|DateToDayValue|DateToMonth|DayValueToDate|DebugBugReportEnv|DebugOut|DebugSetup|Degree|EventLog__Backup|EventLog__Clear|EventLog__Close|EventLog__Count|EventLog__DeregisterSource|EventLog__Full|EventLog__Notify|EventLog__Oldest|EventLog__Open|EventLog__OpenBackup|EventLog__Read|EventLog__RegisterSource|EventLog__Report|FileCountLines|FileCreate|FileListToArray|FilePrint|FileReadToArray|FileWriteFromArray|FileWriteLog|FileWriteToLine|GDIPlus_ArrowCapCreate|GDIPlus_ArrowCapDispose|GDIPlus_ArrowCapGetFillState|GDIPlus_ArrowCapGetHeight|GDIPlus_ArrowCapGetMiddleInset|GDIPlus_ArrowCapGetWidth|GDIPlus_ArrowCapSetFillState|GDIPlus_ArrowCapSetHeight|GDIPlus_ArrowCapSetMiddleInset|GDIPlus_ArrowCapSetWidth|GDIPlus_BitmapCloneArea|GDIPlus_BitmapCreateFromFile|GDIPlus_BitmapCreateFromGraphics|GDIPlus_BitmapCreateFromHBITMAP|GDIPlus_BitmapCreateHBITMAPFromBitmap|GDIPlus_BitmapDispose|GDIPlus_BitmapLockBits|GDIPlus_BitmapUnlockBits|GDIPlus_BrushClone|GDIPlus_BrushCreateSolid|GDIPlus_BrushDispose|GDIPlus_BrushGetType|GDIPlus_CustomLineCapDispose|GDIPlus_Decoders|GDIPlus_DecodersGetCount|GDIPlus_DecodersGetSize|GDIPlus_Encoders|GDIPlus_EncodersGetCLSID|GDIPlus_EncodersGetCount|GDIPlus_EncodersGetParamList|GDIPlus_EncodersGetParamListSize|GDIPlus_EncodersGetSize|GDIPlus_FontCreate|GDIPlus_FontDispose|GDIPlus_FontFamilyCreate|GDIPlus_FontFamilyDispose|GDIPlus_GraphicsClear|GDIPlus_GraphicsCreateFromHDC|GDIPlus_GraphicsCreateFromHWND|GDIPlus_GraphicsDispose|GDIPlus_GraphicsDrawArc|GDIPlus_GraphicsDrawBezier|GDIPlus_GraphicsDrawClosedCurve|GDIPlus_GraphicsDrawCurve|GDIPlus_GraphicsDrawEllipse|GDIPlus_GraphicsDrawImage|GDIPlus_GraphicsDrawImageRect|GDIPlus_GraphicsDrawImageRectRect|GDIPlus_GraphicsDrawLine|GDIPlus_GraphicsDrawPie|GDIPlus_GraphicsDrawPolygon|GDIPlus_GraphicsDrawRect|GDIPlus_GraphicsDrawString|GDIPlus_GraphicsDrawStringEx|GDIPlus_GraphicsFillClosedCurve|GDIPlus_GraphicsFillEllipse|GDIPlus_GraphicsFillPie|GDIPlus_GraphicsFillRect|GDIPlus_GraphicsGetDC|GDIPlus_GraphicsGetSmoothingMode|GDIPlus_GraphicsMeasureString|GDIPlus_GraphicsReleaseDC|GDIPlus_GraphicsSetSmoothingMode|GDIPlus_GraphicsSetTransform|GDIPlus_ImageDispose|GDIPlus_ImageGetGraphicsContext|GDIPlus_ImageGetHeight|GDIPlus_ImageGetWidth|GDIPlus_ImageLoadFromFile|GDIPlus_ImageSaveToFile|GDIPlus_ImageSaveToFileEx|GDIPlus_MatrixCreate|GDIPlus_MatrixDispose|GDIPlus_MatrixRotate|GDIPlus_ParamAdd|GDIPlus_ParamInit|GDIPlus_PenCreate|GDIPlus_PenDispose|GDIPlus_PenGetAlignment|GDIPlus_PenGetColor|GDIPlus_PenGetCustomEndCap|GDIPlus_PenGetDashCap|GDIPlus_PenGetDashStyle|GDIPlus_PenGetEndCap|GDIPlus_PenGetWidth|GDIPlus_PenSetAlignment|GDIPlus_PenSetColor|GDIPlus_PenSetCustomEndCap|GDIPlus_PenSetDashCap|GDIPlus_PenSetDashStyle|GDIPlus_PenSetEndCap|GDIPlus_PenSetWidth|GDIPlus_RectFCreate|GDIPlus_Shutdown|GDIPlus_Startup|GDIPlus_StringFormatCreate|GDIPlus_StringFormatDispose|GetIP|GUICtrlAVI_Close|GUICtrlAVI_Create|GUICtrlAVI_Destroy|GUICtrlAVI_Open|GUICtrlAVI_OpenEx|GUICtrlAVI_Play|GUICtrlAVI_Seek|GUICtrlAVI_Show|GUICtrlAVI_Stop|GUICtrlButton_Click|GUICtrlButton_Create|GUICtrlButton_Destroy|GUICtrlButton_Enable|GUICtrlButton_GetCheck|GUICtrlButton_GetFocus|GUICtrlButton_GetIdealSize|GUICtrlButton_GetImage|GUICtrlButton_GetImageList|GUICtrlButton_GetState|GUICtrlButton_GetText|GUICtrlButton_GetTextMargin|GUICtrlButton_SetCheck|GUICtrlButton_SetFocus|GUICtrlButton_SetImage|GUICtrlButton_SetImageList|GUICtrlButton_SetSize|GUICtrlButton_SetState|GUICtrlButton_SetStyle|GUICtrlButton_SetText|GUICtrlButton_SetTextMargin|GUICtrlButton_Show|GUICtrlComboBox_AddDir|GUICtrlComboBox_AddString|GUICtrlComboBox_AutoComplete|GUICtrlComboBox_BeginUpdate|GUICtrlComboBox_Create|GUICtrlComboBox_DeleteString|GUICtrlComboBox_Destroy|GUICtrlComboBox_EndUpdate|GUICtrlComboBox_FindString|GUICtrlComboBox_FindStringExact|GUICtrlComboBox_GetComboBoxInfo|GUICtrlComboBox_GetCount|GUICtrlComboBox_GetCurSel|GUICtrlComboBox_GetDroppedControlRect|GUICtrlComboBox_GetDroppedControlRectEx|GUICtrlComboBox_GetDroppedState|GUICtrlComboBox_GetDroppedWidth|GUICtrlComboBox_GetEditSel|GUICtrlComboBox_GetEditText|GUICtrlComboBox_GetExtendedUI|GUICtrlComboBox_GetHorizontalExtent|GUICtrlComboBox_GetItemHeight|GUICtrlComboBox_GetLBText|GUICtrlComboBox_GetLBTextLen|GUICtrlComboBox_GetList|GUICtrlComboBox_GetListArray|GUICtrlComboBox_GetLocale|GUICtrlComboBox_GetLocaleCountry|GUICtrlComboBox_GetLocaleLang|GUICtrlComboBox_GetLocalePrimLang|GUICtrlComboBox_GetLocaleSubLang|GUICtrlComboBox_GetMinVisible|GUICtrlComboBox_GetTopIndex|GUICtrlComboBox_InitStorage|GUICtrlComboBox_InsertString|GUICtrlComboBox_LimitText|GUICtrlComboBox_ReplaceEditSel|GUICtrlComboBox_ResetContent|GUICtrlComboBox_SelectString|GUICtrlComboBox_SetCurSel|GUICtrlComboBox_SetDroppedWidth|GUICtrlComboBox_SetEditSel|GUICtrlComboBox_SetEditText|GUICtrlComboBox_SetExtendedUI|GUICtrlComboBox_SetHorizontalExtent|GUICtrlComboBox_SetItemHeight|GUICtrlComboBox_SetMinVisible|GUICtrlComboBox_SetTopIndex|GUICtrlComboBox_ShowDropDown|GUICtrlComboBoxEx_AddDir|GUICtrlComboBoxEx_AddString|GUICtrlComboBoxEx_BeginUpdate|GUICtrlComboBoxEx_Create|GUICtrlComboBoxEx_CreateSolidBitMap|GUICtrlComboBoxEx_DeleteString|GUICtrlComboBoxEx_Destroy|GUICtrlComboBoxEx_EndUpdate|GUICtrlComboBoxEx_FindStringExact|GUICtrlComboBoxEx_GetComboBoxInfo|GUICtrlComboBoxEx_GetComboControl|GUICtrlComboBoxEx_GetCount|GUICtrlComboBoxEx_GetCurSel|GUICtrlComboBoxEx_GetDroppedControlRect|GUICtrlComboBoxEx_GetDroppedControlRectEx|GUICtrlComboBoxEx_GetDroppedState|GUICtrlComboBoxEx_GetDroppedWidth|GUICtrlComboBoxEx_GetEditControl|GUICtrlComboBoxEx_GetEditSel|GUICtrlComboBoxEx_GetEditText|GUICtrlComboBoxEx_GetExtendedStyle|GUICtrlComboBoxEx_GetExtendedUI|GUICtrlComboBoxEx_GetImageList|GUICtrlComboBoxEx_GetItem|GUICtrlComboBoxEx_GetItemEx|GUICtrlComboBoxEx_GetItemHeight|GUICtrlComboBoxEx_GetItemImage|GUICtrlComboBoxEx_GetItemIndent|GUICtrlComboBoxEx_GetItemOverlayImage|GUICtrlComboBoxEx_GetItemParam|GUICtrlComboBoxEx_GetItemSelectedImage|GUICtrlComboBoxEx_GetItemText|GUICtrlComboBoxEx_GetItemTextLen|GUICtrlComboBoxEx_GetList|GUICtrlComboBoxEx_GetListArray|GUICtrlComboBoxEx_GetLocale|GUICtrlComboBoxEx_GetLocaleCountry|GUICtrlComboBoxEx_GetLocaleLang|GUICtrlComboBoxEx_GetLocalePrimLang|GUICtrlComboBoxEx_GetLocaleSubLang|GUICtrlComboBoxEx_GetMinVisible|GUICtrlComboBoxEx_GetTopIndex|GUICtrlComboBoxEx_InitStorage|GUICtrlComboBoxEx_InsertString|GUICtrlComboBoxEx_LimitText|GUICtrlComboBoxEx_ReplaceEditSel|GUICtrlComboBoxEx_ResetContent|GUICtrlComboBoxEx_SetCurSel|GUICtrlComboBoxEx_SetDroppedWidth|GUICtrlComboBoxEx_SetEditSel|GUICtrlComboBoxEx_SetEditText|GUICtrlComboBoxEx_SetExtendedStyle|GUICtrlComboBoxEx_SetExtendedUI|GUICtrlComboBoxEx_SetImageList|GUICtrlComboBoxEx_SetItem|GUICtrlComboBoxEx_SetItemEx|GUICtrlComboBoxEx_SetItemHeight|GUICtrlComboBoxEx_SetItemImage|GUICtrlComboBoxEx_SetItemIndent|GUICtrlComboBoxEx_SetItemOverlayImage|GUICtrlComboBoxEx_SetItemParam|GUICtrlComboBoxEx_SetItemSelectedImage|GUICtrlComboBoxEx_SetMinVisible|GUICtrlComboBoxEx_SetTopIndex|GUICtrlComboBoxEx_ShowDropDown|GUICtrlDTP_Create|GUICtrlDTP_Destroy|GUICtrlDTP_GetMCColor|GUICtrlDTP_GetMCFont|GUICtrlDTP_GetMonthCal|GUICtrlDTP_GetRange|GUICtrlDTP_GetRangeEx|GUICtrlDTP_GetSystemTime|GUICtrlDTP_GetSystemTimeEx|GUICtrlDTP_SetFormat|GUICtrlDTP_SetMCColor|GUICtrlDTP_SetMCFont|GUICtrlDTP_SetRange|GUICtrlDTP_SetRangeEx|GUICtrlDTP_SetSystemTime|GUICtrlDTP_SetSystemTimeEx|GUICtrlEdit_AppendText|GUICtrlEdit_BeginUpdate|GUICtrlEdit_CanUndo|GUICtrlEdit_CharFromPos|GUICtrlEdit_Create|GUICtrlEdit_Destroy|GUICtrlEdit_EmptyUndoBuffer|GUICtrlEdit_EndUpdate|GUICtrlEdit_Find|GUICtrlEdit_FmtLines|GUICtrlEdit_GetFirstVisibleLine|GUICtrlEdit_GetLimitText|GUICtrlEdit_GetLine|GUICtrlEdit_GetLineCount|GUICtrlEdit_GetMargins|GUICtrlEdit_GetModify|GUICtrlEdit_GetPasswordChar|GUICtrlEdit_GetRECT|GUICtrlEdit_GetRECTEx|GUICtrlEdit_GetSel|GUICtrlEdit_GetText|GUICtrlEdit_GetTextLen|GUICtrlEdit_HideBalloonTip|GUICtrlEdit_InsertText|GUICtrlEdit_LineFromChar|GUICtrlEdit_LineIndex|GUICtrlEdit_LineLength|GUICtrlEdit_LineScroll|GUICtrlEdit_PosFromChar|GUICtrlEdit_ReplaceSel|GUICtrlEdit_Scroll|GUICtrlEdit_SetLimitText|GUICtrlEdit_SetMargins|GUICtrlEdit_SetModify|GUICtrlEdit_SetPasswordChar|GUICtrlEdit_SetReadOnly|GUICtrlEdit_SetRECT|GUICtrlEdit_SetRECTEx|GUICtrlEdit_SetRECTNP|GUICtrlEdit_SetRectNPEx|GUICtrlEdit_SetSel|GUICtrlEdit_SetTabStops|GUICtrlEdit_SetText|GUICtrlEdit_ShowBalloonTip|GUICtrlEdit_Undo|GUICtrlHeader_AddItem|GUICtrlHeader_ClearFilter|GUICtrlHeader_ClearFilterAll|GUICtrlHeader_Create|GUICtrlHeader_CreateDragImage|GUICtrlHeader_DeleteItem|GUICtrlHeader_Destroy|GUICtrlHeader_EditFilter|GUICtrlHeader_GetBitmapMargin|GUICtrlHeader_GetImageList|GUICtrlHeader_GetItem|GUICtrlHeader_GetItemAlign|GUICtrlHeader_GetItemBitmap|GUICtrlHeader_GetItemCount|GUICtrlHeader_GetItemDisplay|GUICtrlHeader_GetItemFlags|GUICtrlHeader_GetItemFormat|GUICtrlHeader_GetItemImage|GUICtrlHeader_GetItemOrder|GUICtrlHeader_GetItemParam|GUICtrlHeader_GetItemRect|GUICtrlHeader_GetItemRectEx|GUICtrlHeader_GetItemText|GUICtrlHeader_GetItemWidth|GUICtrlHeader_GetOrderArray|GUICtrlHeader_GetUnicodeFormat|GUICtrlHeader_HitTest|GUICtrlHeader_InsertItem|GUICtrlHeader_Layout|GUICtrlHeader_OrderToIndex|GUICtrlHeader_SetBitmapMargin|GUICtrlHeader_SetFilterChangeTimeout|GUICtrlHeader_SetHotDivider|GUICtrlHeader_SetImageList|GUICtrlHeader_SetItem|GUICtrlHeader_SetItemAlign|GUICtrlHeader_SetItemBitmap|GUICtrlHeader_SetItemDisplay|GUICtrlHeader_SetItemFlags|GUICtrlHeader_SetItemFormat|GUICtrlHeader_SetItemImage|GUICtrlHeader_SetItemOrder|GUICtrlHeader_SetItemParam|GUICtrlHeader_SetItemText|GUICtrlHeader_SetItemWidth|GUICtrlHeader_SetOrderArray|GUICtrlHeader_SetUnicodeFormat|GUICtrlIpAddress_ClearAddress|GUICtrlIpAddress_Create|GUICtrlIpAddress_Destroy|GUICtrlIpAddress_Get|GUICtrlIpAddress_GetArray|GUICtrlIpAddress_GetEx|GUICtrlIpAddress_IsBlank|GUICtrlIpAddress_Set|GUICtrlIpAddress_SetArray|GUICtrlIpAddress_SetEx|GUICtrlIpAddress_SetFocus|GUICtrlIpAddress_SetFont|GUICtrlIpAddress_SetRange|GUICtrlIpAddress_ShowHide|GUICtrlListBox_AddFile|GUICtrlListBox_AddString|GUICtrlListBox_BeginUpdate|GUICtrlListBox_Create|GUICtrlListBox_DeleteString|GUICtrlListBox_Destroy|GUICtrlListBox_Dir|GUICtrlListBox_EndUpdate|GUICtrlListBox_FindInText|GUICtrlListBox_FindString|GUICtrlListBox_GetAnchorIndex|GUICtrlListBox_GetCaretIndex|GUICtrlListBox_GetCount|GUICtrlListBox_GetCurSel|GUICtrlListBox_GetHorizontalExtent|GUICtrlListBox_GetItemData|GUICtrlListBox_GetItemHeight|GUICtrlListBox_GetItemRect|GUICtrlListBox_GetItemRectEx|GUICtrlListBox_GetListBoxInfo|GUICtrlListBox_GetLocale|GUICtrlListBox_GetLocaleCountry|GUICtrlListBox_GetLocaleLang|GUICtrlListBox_GetLocalePrimLang|GUICtrlListBox_GetLocaleSubLang|GUICtrlListBox_GetSel|GUICtrlListBox_GetSelCount|GUICtrlListBox_GetSelItems|GUICtrlListBox_GetSelItemsText|GUICtrlListBox_GetText|GUICtrlListBox_GetTextLen|GUICtrlListBox_GetTopIndex|GUICtrlListBox_InitStorage|GUICtrlListBox_InsertString|GUICtrlListBox_ItemFromPoint|GUICtrlListBox_ReplaceString|GUICtrlListBox_ResetContent|GUICtrlListBox_SelectString|GUICtrlListBox_SelItemRange|GUICtrlListBox_SelItemRangeEx|GUICtrlListBox_SetAnchorIndex|GUICtrlListBox_SetCaretIndex|GUICtrlListBox_SetColumnWidth|GUICtrlListBox_SetCurSel|GUICtrlListBox_SetHorizontalExtent|GUICtrlListBox_SetItemData|GUICtrlListBox_SetItemHeight|GUICtrlListBox_SetLocale|GUICtrlListBox_SetSel|GUICtrlListBox_SetTabStops|GUICtrlListBox_SetTopIndex|GUICtrlListBox_Sort|GUICtrlListBox_SwapString|GUICtrlListBox_UpdateHScroll|GUICtrlListView_AddArray|GUICtrlListView_AddColumn|GUICtrlListView_AddItem|GUICtrlListView_AddSubItem|GUICtrlListView_ApproximateViewHeight|GUICtrlListView_ApproximateViewRect|GUICtrlListView_ApproximateViewWidth|GUICtrlListView_Arrange|GUICtrlListView_BeginUpdate|GUICtrlListView_CancelEditLabel|GUICtrlListView_ClickItem|GUICtrlListView_CopyItems|GUICtrlListView_Create|GUICtrlListView_CreateDragImage|GUICtrlListView_CreateSolidBitMap|GUICtrlListView_DeleteAllItems|GUICtrlListView_DeleteColumn|GUICtrlListView_DeleteItem|GUICtrlListView_DeleteItemsSelected|GUICtrlListView_Destroy|GUICtrlListView_DrawDragImage|GUICtrlListView_EditLabel|GUICtrlListView_EnableGroupView|GUICtrlListView_EndUpdate|GUICtrlListView_EnsureVisible|GUICtrlListView_FindInText|GUICtrlListView_FindItem|GUICtrlListView_FindNearest|GUICtrlListView_FindParam|GUICtrlListView_FindText|GUICtrlListView_GetBkColor|GUICtrlListView_GetBkImage|GUICtrlListView_GetCallbackMask|GUICtrlListView_GetColumn|GUICtrlListView_GetColumnCount|GUICtrlListView_GetColumnOrder|GUICtrlListView_GetColumnOrderArray|GUICtrlListView_GetColumnWidth|GUICtrlListView_GetCounterPage|GUICtrlListView_GetEditControl|GUICtrlListView_GetExtendedListViewStyle|GUICtrlListView_GetGroupInfo|GUICtrlListView_GetGroupViewEnabled|GUICtrlListView_GetHeader|GUICtrlListView_GetHotCursor|GUICtrlListView_GetHotItem|GUICtrlListView_GetHoverTime|GUICtrlListView_GetImageList|GUICtrlListView_GetISearchString|GUICtrlListView_GetItem|GUICtrlListView_GetItemChecked|GUICtrlListView_GetItemCount|GUICtrlListView_GetItemCut|GUICtrlListView_GetItemDropHilited|GUICtrlListView_GetItemEx|GUICtrlListView_GetItemFocused|GUICtrlListView_GetItemGroupID|GUICtrlListView_GetItemImage|GUICtrlListView_GetItemIndent|GUICtrlListView_GetItemParam|GUICtrlListView_GetItemPosition|GUICtrlListView_GetItemPositionX|GUICtrlListView_GetItemPositionY|GUICtrlListView_GetItemRect|GUICtrlListView_GetItemRectEx|GUICtrlListView_GetItemSelected|GUICtrlListView_GetItemSpacing|GUICtrlListView_GetItemSpacingX|GUICtrlListView_GetItemSpacingY|GUICtrlListView_GetItemState|GUICtrlListView_GetItemStateImage|GUICtrlListView_GetItemText|GUICtrlListView_GetItemTextArray|GUICtrlListView_GetItemTextString|GUICtrlListView_GetNextItem|GUICtrlListView_GetNumberOfWorkAreas|GUICtrlListView_GetOrigin|GUICtrlListView_GetOriginX|GUICtrlListView_GetOriginY|GUICtrlListView_GetOutlineColor|GUICtrlListView_GetSelectedColumn|GUICtrlListView_GetSelectedCount|GUICtrlListView_GetSelectedIndices|GUICtrlListView_GetSelectionMark|GUICtrlListView_GetStringWidth|GUICtrlListView_GetSubItemRect|GUICtrlListView_GetTextBkColor|GUICtrlListView_GetTextColor|GUICtrlListView_GetToolTips|GUICtrlListView_GetTopIndex|GUICtrlListView_GetUnicodeFormat|GUICtrlListView_GetView|GUICtrlListView_GetViewDetails|GUICtrlListView_GetViewLarge|GUICtrlListView_GetViewList|GUICtrlListView_GetViewRect|GUICtrlListView_GetViewSmall|GUICtrlListView_GetViewTile|GUICtrlListView_HideColumn|GUICtrlListView_HitTest|GUICtrlListView_InsertColumn|GUICtrlListView_InsertGroup|GUICtrlListView_InsertItem|GUICtrlListView_JustifyColumn|GUICtrlListView_MapIDToIndex|GUICtrlListView_MapIndexToID|GUICtrlListView_RedrawItems|GUICtrlListView_RegisterSortCallBack|GUICtrlListView_RemoveAllGroups|GUICtrlListView_RemoveGroup|GUICtrlListView_Scroll|GUICtrlListView_SetBkColor|GUICtrlListView_SetBkImage|GUICtrlListView_SetCallBackMask|GUICtrlListView_SetColumn|GUICtrlListView_SetColumnOrder|GUICtrlListView_SetColumnOrderArray|GUICtrlListView_SetColumnWidth|GUICtrlListView_SetExtendedListViewStyle|GUICtrlListView_SetGroupInfo|GUICtrlListView_SetHotItem|GUICtrlListView_SetHoverTime|GUICtrlListView_SetIconSpacing|GUICtrlListView_SetImageList|GUICtrlListView_SetItem|GUICtrlListView_SetItemChecked|GUICtrlListView_SetItemCount|GUICtrlListView_SetItemCut|GUICtrlListView_SetItemDropHilited|GUICtrlListView_SetItemEx|GUICtrlListView_SetItemFocused|GUICtrlListView_SetItemGroupID|GUICtrlListView_SetItemImage|GUICtrlListView_SetItemIndent|GUICtrlListView_SetItemParam|GUICtrlListView_SetItemPosition|GUICtrlListView_SetItemPosition32|GUICtrlListView_SetItemSelected|GUICtrlListView_SetItemState|GUICtrlListView_SetItemStateImage|GUICtrlListView_SetItemText|GUICtrlListView_SetOutlineColor|GUICtrlListView_SetSelectedColumn|GUICtrlListView_SetSelectionMark|GUICtrlListView_SetTextBkColor|GUICtrlListView_SetTextColor|GUICtrlListView_SetToolTips|GUICtrlListView_SetUnicodeFormat|GUICtrlListView_SetView|GUICtrlListView_SetWorkAreas|GUICtrlListView_SimpleSort|GUICtrlListView_SortItems|GUICtrlListView_SubItemHitTest|GUICtrlListView_UnRegisterSortCallBack|GUICtrlMenu_AddMenuItem|GUICtrlMenu_AppendMenu|GUICtrlMenu_CheckMenuItem|GUICtrlMenu_CheckRadioItem|GUICtrlMenu_CreateMenu|GUICtrlMenu_CreatePopup|GUICtrlMenu_DeleteMenu|GUICtrlMenu_DestroyMenu|GUICtrlMenu_DrawMenuBar|GUICtrlMenu_EnableMenuItem|GUICtrlMenu_FindItem|GUICtrlMenu_FindParent|GUICtrlMenu_GetItemBmp|GUICtrlMenu_GetItemBmpChecked|GUICtrlMenu_GetItemBmpUnchecked|GUICtrlMenu_GetItemChecked|GUICtrlMenu_GetItemCount|GUICtrlMenu_GetItemData|GUICtrlMenu_GetItemDefault|GUICtrlMenu_GetItemDisabled|GUICtrlMenu_GetItemEnabled|GUICtrlMenu_GetItemGrayed|GUICtrlMenu_GetItemHighlighted|GUICtrlMenu_GetItemID|GUICtrlMenu_GetItemInfo|GUICtrlMenu_GetItemRect|GUICtrlMenu_GetItemRectEx|GUICtrlMenu_GetItemState|GUICtrlMenu_GetItemStateEx|GUICtrlMenu_GetItemSubMenu|GUICtrlMenu_GetItemText|GUICtrlMenu_GetItemType|GUICtrlMenu_GetMenu|GUICtrlMenu_GetMenuBackground|GUICtrlMenu_GetMenuBarInfo|GUICtrlMenu_GetMenuContextHelpID|GUICtrlMenu_GetMenuData|GUICtrlMenu_GetMenuDefaultItem|GUICtrlMenu_GetMenuHeight|GUICtrlMenu_GetMenuInfo|GUICtrlMenu_GetMenuStyle|GUICtrlMenu_GetSystemMenu|GUICtrlMenu_InsertMenuItem|GUICtrlMenu_InsertMenuItemEx|GUICtrlMenu_IsMenu|GUICtrlMenu_LoadMenu|GUICtrlMenu_MapAccelerator|GUICtrlMenu_MenuItemFromPoint|GUICtrlMenu_RemoveMenu|GUICtrlMenu_SetItemBitmaps|GUICtrlMenu_SetItemBmp|GUICtrlMenu_SetItemBmpChecked|GUICtrlMenu_SetItemBmpUnchecked|GUICtrlMenu_SetItemChecked|GUICtrlMenu_SetItemData|GUICtrlMenu_SetItemDefault|GUICtrlMenu_SetItemDisabled|GUICtrlMenu_SetItemEnabled|GUICtrlMenu_SetItemGrayed|GUICtrlMenu_SetItemHighlighted|GUICtrlMenu_SetItemID|GUICtrlMenu_SetItemInfo|GUICtrlMenu_SetItemState|GUICtrlMenu_SetItemSubMenu|GUICtrlMenu_SetItemText|GUICtrlMenu_SetItemType|GUICtrlMenu_SetMenu|GUICtrlMenu_SetMenuBackground|GUICtrlMenu_SetMenuContextHelpID|GUICtrlMenu_SetMenuData|GUICtrlMenu_SetMenuDefaultItem|GUICtrlMenu_SetMenuHeight|GUICtrlMenu_SetMenuInfo|GUICtrlMenu_SetMenuStyle|GUICtrlMenu_TrackPopupMenu|GUICtrlMonthCal_Create|GUICtrlMonthCal_Destroy|GUICtrlMonthCal_GetColor|GUICtrlMonthCal_GetColorArray|GUICtrlMonthCal_GetCurSel|GUICtrlMonthCal_GetCurSelStr|GUICtrlMonthCal_GetFirstDOW|GUICtrlMonthCal_GetFirstDOWStr|GUICtrlMonthCal_GetMaxSelCount|GUICtrlMonthCal_GetMaxTodayWidth|GUICtrlMonthCal_GetMinReqHeight|GUICtrlMonthCal_GetMinReqRect|GUICtrlMonthCal_GetMinReqRectArray|GUICtrlMonthCal_GetMinReqWidth|GUICtrlMonthCal_GetMonthDelta|GUICtrlMonthCal_GetMonthRange|GUICtrlMonthCal_GetMonthRangeMax|GUICtrlMonthCal_GetMonthRangeMaxStr|GUICtrlMonthCal_GetMonthRangeMin|GUICtrlMonthCal_GetMonthRangeMinStr|GUICtrlMonthCal_GetMonthRangeSpan|GUICtrlMonthCal_GetRange|GUICtrlMonthCal_GetRangeMax|GUICtrlMonthCal_GetRangeMaxStr|GUICtrlMonthCal_GetRangeMin|GUICtrlMonthCal_GetRangeMinStr|GUICtrlMonthCal_GetSelRange|GUICtrlMonthCal_GetSelRangeMax|GUICtrlMonthCal_GetSelRangeMaxStr|GUICtrlMonthCal_GetSelRangeMin|GUICtrlMonthCal_GetSelRangeMinStr|GUICtrlMonthCal_GetToday|GUICtrlMonthCal_GetTodayStr|GUICtrlMonthCal_GetUnicodeFormat|GUICtrlMonthCal_HitTest|GUICtrlMonthCal_SetColor|GUICtrlMonthCal_SetCurSel|GUICtrlMonthCal_SetDayState|GUICtrlMonthCal_SetFirstDOW|GUICtrlMonthCal_SetMaxSelCount|GUICtrlMonthCal_SetMonthDelta|GUICtrlMonthCal_SetRange|GUICtrlMonthCal_SetSelRange|GUICtrlMonthCal_SetToday|GUICtrlMonthCal_SetUnicodeFormat|GUICtrlRebar_AddBand|GUICtrlRebar_AddToolBarBand|GUICtrlRebar_BeginDrag|GUICtrlRebar_Create|GUICtrlRebar_DeleteBand|GUICtrlRebar_Destroy|GUICtrlRebar_DragMove|GUICtrlRebar_EndDrag|GUICtrlRebar_GetBandBackColor|GUICtrlRebar_GetBandBorders|GUICtrlRebar_GetBandBordersEx|GUICtrlRebar_GetBandChildHandle|GUICtrlRebar_GetBandChildSize|GUICtrlRebar_GetBandCount|GUICtrlRebar_GetBandForeColor|GUICtrlRebar_GetBandHeaderSize|GUICtrlRebar_GetBandID|GUICtrlRebar_GetBandIdealSize|GUICtrlRebar_GetBandLength|GUICtrlRebar_GetBandLParam|GUICtrlRebar_GetBandMargins|GUICtrlRebar_GetBandMarginsEx|GUICtrlRebar_GetBandRect|GUICtrlRebar_GetBandRectEx|GUICtrlRebar_GetBandStyle|GUICtrlRebar_GetBandStyleBreak|GUICtrlRebar_GetBandStyleChildEdge|GUICtrlRebar_GetBandStyleFixedBMP|GUICtrlRebar_GetBandStyleFixedSize|GUICtrlRebar_GetBandStyleGripperAlways|GUICtrlRebar_GetBandStyleHidden|GUICtrlRebar_GetBandStyleHideTitle|GUICtrlRebar_GetBandStyleNoGripper|GUICtrlRebar_GetBandStyleTopAlign|GUICtrlRebar_GetBandStyleUseChevron|GUICtrlRebar_GetBandStyleVariableHeight|GUICtrlRebar_GetBandText|GUICtrlRebar_GetBarHeight|GUICtrlRebar_GetBKColor|GUICtrlRebar_GetColorScheme|GUICtrlRebar_GetRowCount|GUICtrlRebar_GetRowHeight|GUICtrlRebar_GetTextColor|GUICtrlRebar_GetToolTips|GUICtrlRebar_GetUnicodeFormat|GUICtrlRebar_HitTest|GUICtrlRebar_IDToIndex|GUICtrlRebar_MaximizeBand|GUICtrlRebar_MinimizeBand|GUICtrlRebar_MoveBand|GUICtrlRebar_SetBandBackColor|GUICtrlRebar_SetBandForeColor|GUICtrlRebar_SetBandHeaderSize|GUICtrlRebar_SetBandID|GUICtrlRebar_SetBandIdealSize|GUICtrlRebar_SetBandLength|GUICtrlRebar_SetBandLParam|GUICtrlRebar_SetBandStyle|GUICtrlRebar_SetBandStyleBreak|GUICtrlRebar_SetBandStyleChildEdge|GUICtrlRebar_SetBandStyleFixedBMP|GUICtrlRebar_SetBandStyleFixedSize|GUICtrlRebar_SetBandStyleGripperAlways|GUICtrlRebar_SetBandStyleHidden|GUICtrlRebar_SetBandStyleHideTitle|GUICtrlRebar_SetBandStyleNoGripper|GUICtrlRebar_SetBandStyleTopAlign|GUICtrlRebar_SetBandStyleUseChevron|GUICtrlRebar_SetBandStyleVariableHeight|GUICtrlRebar_SetBandText|GUICtrlRebar_SetBKColor|GUICtrlRebar_SetColorScheme|GUICtrlRebar_SetTextColor|GUICtrlRebar_SetToolTips|GUICtrlRebar_SetUnicodeFormat|GUICtrlRebar_ShowBand|GUICtrlSlider_ClearSel|GUICtrlSlider_ClearTics|GUICtrlSlider_Create|GUICtrlSlider_Destroy|GUICtrlSlider_GetBuddy|GUICtrlSlider_GetChannelRect|GUICtrlSlider_GetLineSize|GUICtrlSlider_GetNumTics|GUICtrlSlider_GetPageSize|GUICtrlSlider_GetPos|GUICtrlSlider_GetPTics|GUICtrlSlider_GetRange|GUICtrlSlider_GetRangeMax|GUICtrlSlider_GetRangeMin|GUICtrlSlider_GetSel|GUICtrlSlider_GetSelEnd|GUICtrlSlider_GetSelStart|GUICtrlSlider_GetThumbLength|GUICtrlSlider_GetThumbRect|GUICtrlSlider_GetThumbRectEx|GUICtrlSlider_GetTic|GUICtrlSlider_GetTicPos|GUICtrlSlider_GetToolTips|GUICtrlSlider_GetUnicodeFormat|GUICtrlSlider_SetBuddy|GUICtrlSlider_SetLineSize|GUICtrlSlider_SetPageSize|GUICtrlSlider_SetPos|GUICtrlSlider_SetRange|GUICtrlSlider_SetRangeMax|GUICtrlSlider_SetRangeMin|GUICtrlSlider_SetSel|GUICtrlSlider_SetSelEnd|GUICtrlSlider_SetSelStart|GUICtrlSlider_SetThumbLength|GUICtrlSlider_SetTic|GUICtrlSlider_SetTicFreq|GUICtrlSlider_SetTipSide|GUICtrlSlider_SetToolTips|GUICtrlSlider_SetUnicodeFormat|GUICtrlStatusBar_Create|GUICtrlStatusBar_Destroy|GUICtrlStatusBar_EmbedControl|GUICtrlStatusBar_GetBorders|GUICtrlStatusBar_GetBordersHorz|GUICtrlStatusBar_GetBordersRect|GUICtrlStatusBar_GetBordersVert|GUICtrlStatusBar_GetCount|GUICtrlStatusBar_GetHeight|GUICtrlStatusBar_GetIcon|GUICtrlStatusBar_GetParts|GUICtrlStatusBar_GetRect|GUICtrlStatusBar_GetRectEx|GUICtrlStatusBar_GetText|GUICtrlStatusBar_GetTextFlags|GUICtrlStatusBar_GetTextLength|GUICtrlStatusBar_GetTextLengthEx|GUICtrlStatusBar_GetTipText|GUICtrlStatusBar_GetUnicodeFormat|GUICtrlStatusBar_GetWidth|GUICtrlStatusBar_IsSimple|GUICtrlStatusBar_Resize|GUICtrlStatusBar_SetBkColor|GUICtrlStatusBar_SetIcon|GUICtrlStatusBar_SetMinHeight|GUICtrlStatusBar_SetParts|GUICtrlStatusBar_SetSimple|GUICtrlStatusBar_SetText|GUICtrlStatusBar_SetTipText|GUICtrlStatusBar_SetUnicodeFormat|GUICtrlStatusBar_ShowHide|GUICtrlTab_Create|GUICtrlTab_DeleteAllItems|GUICtrlTab_DeleteItem|GUICtrlTab_DeselectAll|GUICtrlTab_Destroy|GUICtrlTab_FindTab|GUICtrlTab_GetCurFocus|GUICtrlTab_GetCurSel|GUICtrlTab_GetDisplayRect|GUICtrlTab_GetDisplayRectEx|GUICtrlTab_GetExtendedStyle|GUICtrlTab_GetImageList|GUICtrlTab_GetItem|GUICtrlTab_GetItemCount|GUICtrlTab_GetItemImage|GUICtrlTab_GetItemParam|GUICtrlTab_GetItemRect|GUICtrlTab_GetItemRectEx|GUICtrlTab_GetItemState|GUICtrlTab_GetItemText|GUICtrlTab_GetRowCount|GUICtrlTab_GetToolTips|GUICtrlTab_GetUnicodeFormat|GUICtrlTab_HighlightItem|GUICtrlTab_HitTest|GUICtrlTab_InsertItem|GUICtrlTab_RemoveImage|GUICtrlTab_SetCurFocus|GUICtrlTab_SetCurSel|GUICtrlTab_SetExtendedStyle|GUICtrlTab_SetImageList|GUICtrlTab_SetItem|GUICtrlTab_SetItemImage|GUICtrlTab_SetItemParam|GUICtrlTab_SetItemSize|GUICtrlTab_SetItemState|GUICtrlTab_SetItemText|GUICtrlTab_SetMinTabWidth|GUICtrlTab_SetPadding|GUICtrlTab_SetToolTips|GUICtrlTab_SetUnicodeFormat|GUICtrlToolbar_AddBitmap|GUICtrlToolbar_AddButton|GUICtrlToolbar_AddButtonSep|GUICtrlToolbar_AddString|GUICtrlToolbar_ButtonCount|GUICtrlToolbar_CheckButton|GUICtrlToolbar_ClickAccel|GUICtrlToolbar_ClickButton|GUICtrlToolbar_ClickIndex|GUICtrlToolbar_CommandToIndex|GUICtrlToolbar_Create|GUICtrlToolbar_Customize|GUICtrlToolbar_DeleteButton|GUICtrlToolbar_Destroy|GUICtrlToolbar_EnableButton|GUICtrlToolbar_FindToolbar|GUICtrlToolbar_GetAnchorHighlight|GUICtrlToolbar_GetBitmapFlags|GUICtrlToolbar_GetButtonBitmap|GUICtrlToolbar_GetButtonInfo|GUICtrlToolbar_GetButtonInfoEx|GUICtrlToolbar_GetButtonParam|GUICtrlToolbar_GetButtonRect|GUICtrlToolbar_GetButtonRectEx|GUICtrlToolbar_GetButtonSize|GUICtrlToolbar_GetButtonState|GUICtrlToolbar_GetButtonStyle|GUICtrlToolbar_GetButtonText|GUICtrlToolbar_GetColorScheme|GUICtrlToolbar_GetDisabledImageList|GUICtrlToolbar_GetExtendedStyle|GUICtrlToolbar_GetHotImageList|GUICtrlToolbar_GetHotItem|GUICtrlToolbar_GetImageList|GUICtrlToolbar_GetInsertMark|GUICtrlToolbar_GetInsertMarkColor|GUICtrlToolbar_GetMaxSize|GUICtrlToolbar_GetMetrics|GUICtrlToolbar_GetPadding|GUICtrlToolbar_GetRows|GUICtrlToolbar_GetString|GUICtrlToolbar_GetStyle|GUICtrlToolbar_GetStyleAltDrag|GUICtrlToolbar_GetStyleCustomErase|GUICtrlToolbar_GetStyleFlat|GUICtrlToolbar_GetStyleList|GUICtrlToolbar_GetStyleRegisterDrop|GUICtrlToolbar_GetStyleToolTips|GUICtrlToolbar_GetStyleTransparent|GUICtrlToolbar_GetStyleWrapable|GUICtrlToolbar_GetTextRows|GUICtrlToolbar_GetToolTips|GUICtrlToolbar_GetUnicodeFormat|GUICtrlToolbar_HideButton|GUICtrlToolbar_HighlightButton|GUICtrlToolbar_HitTest|GUICtrlToolbar_IndexToCommand|GUICtrlToolbar_InsertButton|GUICtrlToolbar_InsertMarkHitTest|GUICtrlToolbar_IsButtonChecked|GUICtrlToolbar_IsButtonEnabled|GUICtrlToolbar_IsButtonHidden|GUICtrlToolbar_IsButtonHighlighted|GUICtrlToolbar_IsButtonIndeterminate|GUICtrlToolbar_IsButtonPressed|GUICtrlToolbar_LoadBitmap|GUICtrlToolbar_LoadImages|GUICtrlToolbar_MapAccelerator|GUICtrlToolbar_MoveButton|GUICtrlToolbar_PressButton|GUICtrlToolbar_SetAnchorHighlight|GUICtrlToolbar_SetBitmapSize|GUICtrlToolbar_SetButtonBitMap|GUICtrlToolbar_SetButtonInfo|GUICtrlToolbar_SetButtonInfoEx|GUICtrlToolbar_SetButtonParam|GUICtrlToolbar_SetButtonSize|GUICtrlToolbar_SetButtonState|GUICtrlToolbar_SetButtonStyle|GUICtrlToolbar_SetButtonText|GUICtrlToolbar_SetButtonWidth|GUICtrlToolbar_SetCmdID|GUICtrlToolbar_SetColorScheme|GUICtrlToolbar_SetDisabledImageList|GUICtrlToolbar_SetDrawTextFlags|GUICtrlToolbar_SetExtendedStyle|GUICtrlToolbar_SetHotImageList|GUICtrlToolbar_SetHotItem|GUICtrlToolbar_SetImageList|GUICtrlToolbar_SetIndent|GUICtrlToolbar_SetIndeterminate|GUICtrlToolbar_SetInsertMark|GUICtrlToolbar_SetInsertMarkColor|GUICtrlToolbar_SetMaxTextRows|GUICtrlToolbar_SetMetrics|GUICtrlToolbar_SetPadding|GUICtrlToolbar_SetParent|GUICtrlToolbar_SetRows|GUICtrlToolbar_SetStyle|GUICtrlToolbar_SetStyleAltDrag|GUICtrlToolbar_SetStyleCustomErase|GUICtrlToolbar_SetStyleFlat|GUICtrlToolbar_SetStyleList|GUICtrlToolbar_SetStyleRegisterDrop|GUICtrlToolbar_SetStyleToolTips|GUICtrlToolbar_SetStyleTransparent|GUICtrlToolbar_SetStyleWrapable|GUICtrlToolbar_SetToolTips|GUICtrlToolbar_SetUnicodeFormat|GUICtrlToolbar_SetWindowTheme|GUICtrlTreeView_Add|GUICtrlTreeView_AddChild|GUICtrlTreeView_AddChildFirst|GUICtrlTreeView_AddFirst|GUICtrlTreeView_BeginUpdate|GUICtrlTreeView_ClickItem|GUICtrlTreeView_Create|GUICtrlTreeView_CreateDragImage|GUICtrlTreeView_CreateSolidBitMap|GUICtrlTreeView_Delete|GUICtrlTreeView_DeleteAll|GUICtrlTreeView_DeleteChildren|GUICtrlTreeView_Destroy|GUICtrlTreeView_DisplayRect|GUICtrlTreeView_DisplayRectEx|GUICtrlTreeView_EditText|GUICtrlTreeView_EndEdit|GUICtrlTreeView_EndUpdate|GUICtrlTreeView_EnsureVisible|GUICtrlTreeView_Expand|GUICtrlTreeView_ExpandedOnce|GUICtrlTreeView_FindItem|GUICtrlTreeView_FindItemEx|GUICtrlTreeView_GetBkColor|GUICtrlTreeView_GetBold|GUICtrlTreeView_GetChecked|GUICtrlTreeView_GetChildCount|GUICtrlTreeView_GetChildren|GUICtrlTreeView_GetCount|GUICtrlTreeView_GetCut|GUICtrlTreeView_GetDropTarget|GUICtrlTreeView_GetEditControl|GUICtrlTreeView_GetExpanded|GUICtrlTreeView_GetFirstChild|GUICtrlTreeView_GetFirstItem|GUICtrlTreeView_GetFirstVisible|GUICtrlTreeView_GetFocused|GUICtrlTreeView_GetHeight|GUICtrlTreeView_GetImageIndex|GUICtrlTreeView_GetImageListIconHandle|GUICtrlTreeView_GetIndent|GUICtrlTreeView_GetInsertMarkColor|GUICtrlTreeView_GetISearchString|GUICtrlTreeView_GetItemByIndex|GUICtrlTreeView_GetItemHandle|GUICtrlTreeView_GetItemParam|GUICtrlTreeView_GetLastChild|GUICtrlTreeView_GetLineColor|GUICtrlTreeView_GetNext|GUICtrlTreeView_GetNextChild|GUICtrlTreeView_GetNextSibling|GUICtrlTreeView_GetNextVisible|GUICtrlTreeView_GetNormalImageList|GUICtrlTreeView_GetParentHandle|GUICtrlTreeView_GetParentParam|GUICtrlTreeView_GetPrev|GUICtrlTreeView_GetPrevChild|GUICtrlTreeView_GetPrevSibling|GUICtrlTreeView_GetPrevVisible|GUICtrlTreeView_GetScrollTime|GUICtrlTreeView_GetSelected|GUICtrlTreeView_GetSelectedImageIndex|GUICtrlTreeView_GetSelection|GUICtrlTreeView_GetSiblingCount|GUICtrlTreeView_GetState|GUICtrlTreeView_GetStateImageIndex|GUICtrlTreeView_GetStateImageList|GUICtrlTreeView_GetText|GUICtrlTreeView_GetTextColor|GUICtrlTreeView_GetToolTips|GUICtrlTreeView_GetTree|GUICtrlTreeView_GetUnicodeFormat|GUICtrlTreeView_GetVisible|GUICtrlTreeView_GetVisibleCount|GUICtrlTreeView_HitTest|GUICtrlTreeView_HitTestEx|GUICtrlTreeView_HitTestItem|GUICtrlTreeView_Index|GUICtrlTreeView_InsertItem|GUICtrlTreeView_IsFirstItem|GUICtrlTreeView_IsParent|GUICtrlTreeView_Level|GUICtrlTreeView_SelectItem|GUICtrlTreeView_SelectItemByIndex|GUICtrlTreeView_SetBkColor|GUICtrlTreeView_SetBold|GUICtrlTreeView_SetChecked|GUICtrlTreeView_SetCheckedByIndex|GUICtrlTreeView_SetChildren|GUICtrlTreeView_SetCut|GUICtrlTreeView_SetDropTarget|GUICtrlTreeView_SetFocused|GUICtrlTreeView_SetHeight|GUICtrlTreeView_SetIcon|GUICtrlTreeView_SetImageIndex|GUICtrlTreeView_SetIndent|GUICtrlTreeView_SetInsertMark|GUICtrlTreeView_SetInsertMarkColor|GUICtrlTreeView_SetItemHeight|GUICtrlTreeView_SetItemParam|GUICtrlTreeView_SetLineColor|GUICtrlTreeView_SetNormalImageList|GUICtrlTreeView_SetScrollTime|GUICtrlTreeView_SetSelected|GUICtrlTreeView_SetSelectedImageIndex|GUICtrlTreeView_SetState|GUICtrlTreeView_SetStateImageIndex|GUICtrlTreeView_SetStateImageList|GUICtrlTreeView_SetText|GUICtrlTreeView_SetTextColor|GUICtrlTreeView_SetToolTips|GUICtrlTreeView_SetUnicodeFormat|GUICtrlTreeView_Sort|GUIImageList_Add|GUIImageList_AddBitmap|GUIImageList_AddIcon|GUIImageList_AddMasked|GUIImageList_BeginDrag|GUIImageList_Copy|GUIImageList_Create|GUIImageList_Destroy|GUIImageList_DestroyIcon|GUIImageList_DragEnter|GUIImageList_DragLeave|GUIImageList_DragMove|GUIImageList_Draw|GUIImageList_DrawEx|GUIImageList_Duplicate|GUIImageList_EndDrag|GUIImageList_GetBkColor|GUIImageList_GetIcon|GUIImageList_GetIconHeight|GUIImageList_GetIconSize|GUIImageList_GetIconSizeEx|GUIImageList_GetIconWidth|GUIImageList_GetImageCount|GUIImageList_GetImageInfoEx|GUIImageList_Remove|GUIImageList_ReplaceIcon|GUIImageList_SetBkColor|GUIImageList_SetIconSize|GUIImageList_SetImageCount|GUIImageList_Swap|GUIScrollBars_EnableScrollBar|GUIScrollBars_GetScrollBarInfoEx|GUIScrollBars_GetScrollBarRect|GUIScrollBars_GetScrollBarRGState|GUIScrollBars_GetScrollBarXYLineButton|GUIScrollBars_GetScrollBarXYThumbBottom|GUIScrollBars_GetScrollBarXYThumbTop|GUIScrollBars_GetScrollInfo|GUIScrollBars_GetScrollInfoEx|GUIScrollBars_GetScrollInfoMax|GUIScrollBars_GetScrollInfoMin|GUIScrollBars_GetScrollInfoPage|GUIScrollBars_GetScrollInfoPos|GUIScrollBars_GetScrollInfoTrackPos|GUIScrollBars_GetScrollPos|GUIScrollBars_GetScrollRange|GUIScrollBars_Init|GUIScrollBars_ScrollWindow|GUIScrollBars_SetScrollInfo|GUIScrollBars_SetScrollInfoMax|GUIScrollBars_SetScrollInfoMin|GUIScrollBars_SetScrollInfoPage|GUIScrollBars_SetScrollInfoPos|GUIScrollBars_SetScrollRange|GUIScrollBars_ShowScrollBar|GUIToolTip_Activate|GUIToolTip_AddTool|GUIToolTip_AdjustRect|GUIToolTip_BitsToTTF|GUIToolTip_Create|GUIToolTip_DelTool|GUIToolTip_Destroy|GUIToolTip_EnumTools|GUIToolTip_GetBubbleHeight|GUIToolTip_GetBubbleSize|GUIToolTip_GetBubbleWidth|GUIToolTip_GetCurrentTool|GUIToolTip_GetDelayTime|GUIToolTip_GetMargin|GUIToolTip_GetMarginEx|GUIToolTip_GetMaxTipWidth|GUIToolTip_GetText|GUIToolTip_GetTipBkColor|GUIToolTip_GetTipTextColor|GUIToolTip_GetTitleBitMap|GUIToolTip_GetTitleText|GUIToolTip_GetToolCount|GUIToolTip_GetToolInfo|GUIToolTip_HitTest|GUIToolTip_NewToolRect|GUIToolTip_Pop|GUIToolTip_PopUp|GUIToolTip_SetDelayTime|GUIToolTip_SetMargin|GUIToolTip_SetMaxTipWidth|GUIToolTip_SetTipBkColor|GUIToolTip_SetTipTextColor|GUIToolTip_SetTitle|GUIToolTip_SetToolInfo|GUIToolTip_SetWindowTheme|GUIToolTip_ToolExists|GUIToolTip_ToolToArray|GUIToolTip_TrackActivate|GUIToolTip_TrackPosition|GUIToolTip_TTFToBits|GUIToolTip_Update|GUIToolTip_UpdateTipText|HexToString|IE_Example|IE_Introduction|IE_VersionInfo|IEAction|IEAttach|IEBodyReadHTML|IEBodyReadText|IEBodyWriteHTML|IECreate|IECreateEmbedded|IEDocGetObj|IEDocInsertHTML|IEDocInsertText|IEDocReadHTML|IEDocWriteHTML|IEErrorHandlerDeRegister|IEErrorHandlerRegister|IEErrorNotify|IEFormElementCheckBoxSelect|IEFormElementGetCollection|IEFormElementGetObjByName|IEFormElementGetValue|IEFormElementOptionSelect|IEFormElementRadioSelect|IEFormElementSetValue|IEFormGetCollection|IEFormGetObjByName|IEFormImageClick|IEFormReset|IEFormSubmit|IEFrameGetCollection|IEFrameGetObjByName|IEGetObjById|IEGetObjByName|IEHeadInsertEventScript|IEImgClick|IEImgGetCollection|IEIsFrameSet|IELinkClickByIndex|IELinkClickByText|IELinkGetCollection|IELoadWait|IELoadWaitTimeout|IENavigate|IEPropertyGet|IEPropertySet|IEQuit|IETableGetCollection|IETableWriteToArray|IETagNameAllGetCollection|IETagNameGetCollection|Iif|INetExplorerCapable|INetGetSource|INetMail|INetSmtpMail|IsPressed|MathCheckDiv|Max|MemGlobalAlloc|MemGlobalFree|MemGlobalLock|MemGlobalSize|MemGlobalUnlock|MemMoveMemory|MemMsgBox|MemShowError|MemVirtualAlloc|MemVirtualAllocEx|MemVirtualFree|MemVirtualFreeEx|Min|MouseTrap|NamedPipes_CallNamedPipe|NamedPipes_ConnectNamedPipe|NamedPipes_CreateNamedPipe|NamedPipes_CreatePipe|NamedPipes_DisconnectNamedPipe|NamedPipes_GetNamedPipeHandleState|NamedPipes_GetNamedPipeInfo|NamedPipes_PeekNamedPipe|NamedPipes_SetNamedPipeHandleState|NamedPipes_TransactNamedPipe|NamedPipes_WaitNamedPipe|Net_Share_ConnectionEnum|Net_Share_FileClose|Net_Share_FileEnum|Net_Share_FileGetInfo|Net_Share_PermStr|Net_Share_ResourceStr|Net_Share_SessionDel|Net_Share_SessionEnum|Net_Share_SessionGetInfo|Net_Share_ShareAdd|Net_Share_ShareCheck|Net_Share_ShareDel|Net_Share_ShareEnum|Net_Share_ShareGetInfo|Net_Share_ShareSetInfo|Net_Share_StatisticsGetSvr|Net_Share_StatisticsGetWrk|Now|NowCalc|NowCalcDate|NowDate|NowTime|PathFull|PathMake|PathSplit|ProcessGetName|ProcessGetPriority|Radian|ReplaceStringInFile|RunDOS|ScreenCapture_Capture|ScreenCapture_CaptureWnd|ScreenCapture_SaveImage|ScreenCapture_SetBMPFormat|ScreenCapture_SetJPGQuality|ScreenCapture_SetTIFColorDepth|ScreenCapture_SetTIFCompression|Security__AdjustTokenPrivileges|Security__GetAccountSid|Security__GetLengthSid|Security__GetTokenInformation|Security__ImpersonateSelf|Security__IsValidSid|Security__LookupAccountName|Security__LookupAccountSid|Security__LookupPrivilegeValue|Security__OpenProcessToken|Security__OpenThreadToken|Security__OpenThreadTokenEx|Security__SetPrivilege|Security__SidToStringSid|Security__SidTypeStr|Security__StringSidToSid|SendMessage|SendMessageA|SetDate|SetTime|Singleton|SoundClose|SoundLength|SoundOpen|SoundPause|SoundPlay|SoundPos|SoundResume|SoundSeek|SoundStatus|SoundStop|SQLite_Changes|SQLite_Close|SQLite_Display2DResult|SQLite_Encode|SQLite_ErrCode|SQLite_ErrMsg|SQLite_Escape|SQLite_Exec|SQLite_FetchData|SQLite_FetchNames|SQLite_GetTable|SQLite_GetTable2d|SQLite_LastInsertRowID|SQLite_LibVersion|SQLite_Open|SQLite_Query|SQLite_QueryFinalize|SQLite_QueryReset|SQLite_QuerySingleRow|SQLite_SaveMode|SQLite_SetTimeout|SQLite_Shutdown|SQLite_SQLiteExe|SQLite_Startup|SQLite_TotalChanges|StringAddComma|StringBetween|StringEncrypt|StringInsert|StringProper|StringRepeat|StringReverse|StringSplit|StringToHex|TCPIpToName|TempFile|TicksToTime|Timer_Diff|Timer_GetTimerID|Timer_Init|Timer_KillAllTimers|Timer_KillTimer|Timer_SetTimer|TimeToTicks|VersionCompare|viClose|viExecCommand|viFindGpib|viGpibBusReset|viGTL|viOpen|viSetAttribute|viSetTimeout|WeekNumberISO|WinAPI_AttachConsole|WinAPI_AttachThreadInput|WinAPI_Beep|WinAPI_BitBlt|WinAPI_CallNextHookEx|WinAPI_Check|WinAPI_ClientToScreen|WinAPI_CloseHandle|WinAPI_CommDlgExtendedError|WinAPI_CopyIcon|WinAPI_CreateBitmap|WinAPI_CreateCompatibleBitmap|WinAPI_CreateCompatibleDC|WinAPI_CreateEvent|WinAPI_CreateFile|WinAPI_CreateFont|WinAPI_CreateFontIndirect|WinAPI_CreateProcess|WinAPI_CreateSolidBitmap|WinAPI_CreateSolidBrush|WinAPI_CreateWindowEx|WinAPI_DefWindowProc|WinAPI_DeleteDC|WinAPI_DeleteObject|WinAPI_DestroyIcon|WinAPI_DestroyWindow|WinAPI_DrawEdge|WinAPI_DrawFrameControl|WinAPI_DrawIcon|WinAPI_DrawIconEx|WinAPI_DrawText|WinAPI_EnableWindow|WinAPI_EnumDisplayDevices|WinAPI_EnumWindows|WinAPI_EnumWindowsPopup|WinAPI_EnumWindowsTop|WinAPI_ExpandEnvironmentStrings|WinAPI_ExtractIconEx|WinAPI_FatalAppExit|WinAPI_FillRect|WinAPI_FindExecutable|WinAPI_FindWindow|WinAPI_FlashWindow|WinAPI_FlashWindowEx|WinAPI_FloatToInt|WinAPI_FlushFileBuffers|WinAPI_FormatMessage|WinAPI_FrameRect|WinAPI_FreeLibrary|WinAPI_GetAncestor|WinAPI_GetAsyncKeyState|WinAPI_GetClassName|WinAPI_GetClientHeight|WinAPI_GetClientRect|WinAPI_GetClientWidth|WinAPI_GetCurrentProcess|WinAPI_GetCurrentProcessID|WinAPI_GetCurrentThread|WinAPI_GetCurrentThreadId|WinAPI_GetCursorInfo|WinAPI_GetDC|WinAPI_GetDesktopWindow|WinAPI_GetDeviceCaps|WinAPI_GetDIBits|WinAPI_GetDlgCtrlID|WinAPI_GetDlgItem|WinAPI_GetFileSizeEx|WinAPI_GetFocus|WinAPI_GetForegroundWindow|WinAPI_GetIconInfo|WinAPI_GetLastError|WinAPI_GetLastErrorMessage|WinAPI_GetModuleHandle|WinAPI_GetMousePos|WinAPI_GetMousePosX|WinAPI_GetMousePosY|WinAPI_GetObject|WinAPI_GetOpenFileName|WinAPI_GetOverlappedResult|WinAPI_GetParent|WinAPI_GetProcessAffinityMask|WinAPI_GetSaveFileName|WinAPI_GetStdHandle|WinAPI_GetStockObject|WinAPI_GetSysColor|WinAPI_GetSysColorBrush|WinAPI_GetSystemMetrics|WinAPI_GetTextExtentPoint32|WinAPI_GetWindow|WinAPI_GetWindowDC|WinAPI_GetWindowHeight|WinAPI_GetWindowLong|WinAPI_GetWindowRect|WinAPI_GetWindowText|WinAPI_GetWindowThreadProcessId|WinAPI_GetWindowWidth|WinAPI_GetXYFromPoint|WinAPI_GlobalMemStatus|WinAPI_GUIDFromString|WinAPI_GUIDFromStringEx|WinAPI_HiWord|WinAPI_InProcess|WinAPI_IntToFloat|WinAPI_InvalidateRect|WinAPI_IsClassName|WinAPI_IsWindow|WinAPI_IsWindowVisible|WinAPI_LoadBitmap|WinAPI_LoadImage|WinAPI_LoadLibrary|WinAPI_LoadLibraryEx|WinAPI_LoadShell32Icon|WinAPI_LoadString|WinAPI_LocalFree|WinAPI_LoWord|WinAPI_MakeDWord|WinAPI_MAKELANGID|WinAPI_MAKELCID|WinAPI_MakeLong|WinAPI_MessageBeep|WinAPI_Mouse_Event|WinAPI_MoveWindow|WinAPI_MsgBox|WinAPI_MulDiv|WinAPI_MultiByteToWideChar|WinAPI_MultiByteToWideCharEx|WinAPI_OpenProcess|WinAPI_PointFromRect|WinAPI_PostMessage|WinAPI_PrimaryLangId|WinAPI_PtInRect|WinAPI_ReadFile|WinAPI_ReadProcessMemory|WinAPI_RectIsEmpty|WinAPI_RedrawWindow|WinAPI_RegisterWindowMessage|WinAPI_ReleaseCapture|WinAPI_ReleaseDC|WinAPI_ScreenToClient|WinAPI_SelectObject|WinAPI_SetBkColor|WinAPI_SetCapture|WinAPI_SetCursor|WinAPI_SetDefaultPrinter|WinAPI_SetDIBits|WinAPI_SetEvent|WinAPI_SetFocus|WinAPI_SetFont|WinAPI_SetHandleInformation|WinAPI_SetLastError|WinAPI_SetParent|WinAPI_SetProcessAffinityMask|WinAPI_SetSysColors|WinAPI_SetTextColor|WinAPI_SetWindowLong|WinAPI_SetWindowPos|WinAPI_SetWindowsHookEx|WinAPI_SetWindowText|WinAPI_ShowCursor|WinAPI_ShowError|WinAPI_ShowMsg|WinAPI_ShowWindow|WinAPI_StringFromGUID|WinAPI_SubLangId|WinAPI_SystemParametersInfo|WinAPI_TwipsPerPixelX|WinAPI_TwipsPerPixelY|WinAPI_UnhookWindowsHookEx|WinAPI_UpdateLayeredWindow|WinAPI_UpdateWindow|WinAPI_ValidateClassName|WinAPI_WaitForInputIdle|WinAPI_WaitForMultipleObjects|WinAPI_WaitForSingleObject|WinAPI_WideCharToMultiByte|WinAPI_WindowFromPoint|WinAPI_WriteConsole|WinAPI_WriteFile|WinAPI_WriteProcessMemory|WinNet_AddConnection|WinNet_AddConnection2|WinNet_AddConnection3|WinNet_CancelConnection|WinNet_CancelConnection2|WinNet_CloseEnum|WinNet_ConnectionDialog|WinNet_ConnectionDialog1|WinNet_DisconnectDialog|WinNet_DisconnectDialog1|WinNet_EnumResource|WinNet_GetConnection|WinNet_GetConnectionPerformance|WinNet_GetLastError|WinNet_GetNetworkInformation|WinNet_GetProviderName|WinNet_GetResourceInformation|WinNet_GetResourceParent|WinNet_GetUniversalName|WinNet_GetUser|WinNet_OpenEnum|WinNet_RestoreConnection|WinNet_UseConnection|Word_VersionInfo|WordAttach|WordCreate|WordDocAdd|WordDocAddLink|WordDocAddPicture|WordDocClose|WordDocFindReplace|WordDocGetCollection|WordDocLinkGetCollection|WordDocOpen|WordDocPrint|WordDocPropertyGet|WordDocPropertySet|WordDocSave|WordDocSaveAs|WordErrorHandlerDeRegister|WordErrorHandlerRegister|WordErrorNotify|WordMacroRun|WordPropertyGet|WordPropertySet|WordQuit|' +\n        'ce|comments-end|comments-start|cs|include|include-once|NoTrayIcon|RequireAdmin|' +\n        'AutoIt3Wrapper_Au3Check_Parameters|AutoIt3Wrapper_Au3Check_Stop_OnWarning|AutoIt3Wrapper_Change2CUI|AutoIt3Wrapper_Compression|AutoIt3Wrapper_cvsWrapper_Parameters|AutoIt3Wrapper_Icon|AutoIt3Wrapper_Outfile|AutoIt3Wrapper_Outfile_Type|AutoIt3Wrapper_Plugin_Funcs|AutoIt3Wrapper_Res_Comment|AutoIt3Wrapper_Res_Description|AutoIt3Wrapper_Res_Field|AutoIt3Wrapper_Res_File_Add|AutoIt3Wrapper_Res_Fileversion|AutoIt3Wrapper_Res_FileVersion_AutoIncrement|AutoIt3Wrapper_Res_Icon_Add|AutoIt3Wrapper_Res_Language|AutoIt3Wrapper_Res_LegalCopyright|AutoIt3Wrapper_res_requestedExecutionLevel|AutoIt3Wrapper_Res_SaveSource|AutoIt3Wrapper_Run_After|AutoIt3Wrapper_Run_Au3check|AutoIt3Wrapper_Run_Before|AutoIt3Wrapper_Run_cvsWrapper|AutoIt3Wrapper_Run_Debug_Mode|AutoIt3Wrapper_Run_Obfuscator|AutoIt3Wrapper_Run_Tidy|AutoIt3Wrapper_Tidy_Stop_OnError|AutoIt3Wrapper_UseAnsi|AutoIt3Wrapper_UseUpx|AutoIt3Wrapper_UseX64|AutoIt3Wrapper_Version|EndRegion|forceref|Obfuscator_Ignore_Funcs|Obfuscator_Ignore_Variables|Obfuscator_Parameters|Region|Tidy_Parameters'\n    var atKeywords = 'AppDataCommonDir|AppDataDir|AutoItExe|AutoItPID|AutoItUnicode|AutoItVersion|AutoItX64|COM_EventObj|CommonFilesDir|Compiled|ComputerName|ComSpec|CR|CRLF|DesktopCommonDir|DesktopDepth|DesktopDir|DesktopHeight|DesktopRefresh|DesktopWidth|DocumentsCommonDir|error|exitCode|exitMethod|extended|FavoritesCommonDir|FavoritesDir|GUI_CtrlHandle|GUI_CtrlId|GUI_DragFile|GUI_DragId|GUI_DropId|GUI_WinHandle|HomeDrive|HomePath|HomeShare|HotKeyPressed|HOUR|InetGetActive|InetGetBytesRead|IPAddress1|IPAddress2|IPAddress3|IPAddress4|KBLayout|LF|LogonDNSDomain|LogonDomain|LogonServer|MDAY|MIN|MON|MyDocumentsDir|NumParams|OSBuild|OSLang|OSServicePack|OSTYPE|OSVersion|ProcessorArch|ProgramFilesDir|ProgramsCommonDir|ProgramsDir|ScriptDir|ScriptFullPath|ScriptLineNumber|ScriptName|SEC|StartMenuCommonDir|StartMenuDir|StartupCommonDir|StartupDir|SW_DISABLE|SW_ENABLE|SW_HIDE|SW_LOCK|SW_MAXIMIZE|SW_MINIMIZE|SW_RESTORE|SW_SHOW|SW_SHOWDEFAULT|SW_SHOWMAXIMIZED|SW_SHOWMINIMIZED|SW_SHOWMINNOACTIVE|SW_SHOWNA|SW_SHOWNOACTIVATE|SW_SHOWNORMAL|SW_UNLOCK|SystemDir|TAB|TempDir|TRAY_ID|TrayIconFlashing|TrayIconVisible|UserName|UserProfileDir|WDAY|WindowsDir|WorkingDir|YDAY|YEAR'\n    \n    this.$rules = { start: \n       [ { token: 'comment.line.ahk', regex: '(?:^| );.*$' },\n         { token: 'comment.block.ahk',\n           regex: '/\\\\*', push: \n            [ { token: 'comment.block.ahk', regex: '\\\\*/', next: 'pop' },\n              { defaultToken: 'comment.block.ahk' } ] },\n         { token: 'doc.comment.ahk',\n           regex: '#cs', push: \n            [ { token: 'doc.comment.ahk', regex: '#ce', next: 'pop' },\n              { defaultToken: 'doc.comment.ahk' } ] },\n         { token: 'keyword.command.ahk',\n           regex: '(?:\\\\b|^)(?:allowsamelinecomments|clipboardtimeout|commentflag|errorstdout|escapechar|hotkeyinterval|hotkeymodifiertimeout|hotstring|include|includeagain|installkeybdhook|installmousehook|keyhistory|ltrim|maxhotkeysperinterval|maxmem|maxthreads|maxthreadsbuffer|maxthreadsperhotkey|noenv|notrayicon|persistent|singleinstance|usehook|winactivateforce|autotrim|blockinput|click|clipwait|continue|control|controlclick|controlfocus|controlget|controlgetfocus|controlgetpos|controlgettext|controlmove|controlsend|controlsendraw|controlsettext|coordmode|critical|detecthiddentext|detecthiddenwindows|drive|driveget|drivespacefree|edit|endrepeat|envadd|envdiv|envget|envmult|envset|envsub|envupdate|exit|exitapp|fileappend|filecopy|filecopydir|filecreatedir|filecreateshortcut|filedelete|filegetattrib|filegetshortcut|filegetsize|filegettime|filegetversion|fileinstall|filemove|filemovedir|fileread|filereadline|filerecycle|filerecycleempty|fileremovedir|fileselectfile|fileselectfolder|filesetattrib|filesettime|formattime|getkeystate|gosub|goto|groupactivate|groupadd|groupclose|groupdeactivate|gui|guicontrol|guicontrolget|hideautoitwin|hotkey|ifequal|ifexist|ifgreater|ifgreaterorequal|ifinstring|ifless|iflessorequal|ifmsgbox|ifnotequal|ifnotexist|ifnotinstring|ifwinactive|ifwinexist|ifwinnotactive|ifwinnotexist|imagesearch|inidelete|iniread|iniwrite|input|inputbox|keyhistory|keywait|listhotkeys|listlines|listvars|menu|mouseclick|mouseclickdrag|mousegetpos|mousemove|msgbox|onexit|outputdebug|pause|pixelgetcolor|pixelsearch|postmessage|process|progress|random|regdelete|regread|regwrite|reload|repeat|run|runas|runwait|send|sendevent|sendinput|sendmode|sendplay|sendmessage|sendraw|setbatchlines|setcapslockstate|setcontroldelay|setdefaultmousespeed|setenv|setformat|setkeydelay|setmousedelay|setnumlockstate|setscrolllockstate|setstorecapslockmode|settimer|settitlematchmode|setwindelay|setworkingdir|shutdown|sleep|sort|soundbeep|soundget|soundgetwavevolume|soundplay|soundset|soundsetwavevolume|splashimage|splashtextoff|splashtexton|splitpath|statusbargettext|statusbarwait|stringcasesense|stringgetpos|stringleft|stringlen|stringlower|stringmid|stringreplace|stringright|stringsplit|stringtrimleft|stringtrimright|stringupper|suspend|sysget|thread|tooltip|transform|traytip|urldownloadtofile|while|winactivate|winactivatebottom|winclose|winget|wingetactivestats|wingetactivetitle|wingetclass|wingetpos|wingettext|wingettitle|winhide|winkill|winmaximize|winmenuselectitem|winminimize|winminimizeall|winminimizeallundo|winmove|winrestore|winset|winsettitle|winshow|winwait|winwaitactive|winwaitclose|winwaitnotactive)\\\\b',\n           caseInsensitive: true },\n         { token: 'keyword.control.ahk',\n           regex: '(?:\\\\b|^)(?:if|else|return|loop|break|for|while|global|local|byref)\\\\b',\n           caseInsensitive: true },\n         { token: 'support.function.ahk',\n           regex: '(?:\\\\b|^)(?:abs|acos|asc|asin|atan|ceil|chr|cos|dllcall|exp|fileexist|floor|getkeystate|il_add|il_create|il_destroy|instr|substr|isfunc|islabel|ln|log|lv_add|lv_delete|lv_deletecol|lv_getcount|lv_getnext|lv_gettext|lv_insert|lv_insertcol|lv_modify|lv_modifycol|lv_setimagelist|mod|onmessage|numget|numput|registercallback|regexmatch|regexreplace|round|sin|tan|sqrt|strlen|sb_seticon|sb_setparts|sb_settext|tv_add|tv_delete|tv_getchild|tv_getcount|tv_getnext|tv_get|tv_getparent|tv_getprev|tv_getselection|tv_gettext|tv_modify|varsetcapacity|winactive|winexist)\\\\b',\n           caseInsensitive: true },\n         { token: 'variable.predefined.ahk',\n           regex: '(?:\\\\b|^)(?:a_ahkpath|a_ahkversion|a_appdata|a_appdatacommon|a_autotrim|a_batchlines|a_caretx|a_carety|a_computername|a_controldelay|a_cursor|a_dd|a_ddd|a_dddd|a_defaultmousespeed|a_desktop|a_desktopcommon|a_detecthiddentext|a_detecthiddenwindows|a_endchar|a_eventinfo|a_exitreason|a_formatfloat|a_formatinteger|a_gui|a_guievent|a_guicontrol|a_guicontrolevent|a_guiheight|a_guiwidth|a_guix|a_guiy|a_hour|a_iconfile|a_iconhidden|a_iconnumber|a_icontip|a_index|a_ipaddress1|a_ipaddress2|a_ipaddress3|a_ipaddress4|a_isadmin|a_iscompiled|a_iscritical|a_ispaused|a_issuspended|a_keydelay|a_language|a_lasterror|a_linefile|a_linenumber|a_loopfield|a_loopfileattrib|a_loopfiledir|a_loopfileext|a_loopfilefullpath|a_loopfilelongpath|a_loopfilename|a_loopfileshortname|a_loopfileshortpath|a_loopfilesize|a_loopfilesizekb|a_loopfilesizemb|a_loopfiletimeaccessed|a_loopfiletimecreated|a_loopfiletimemodified|a_loopreadline|a_loopregkey|a_loopregname|a_loopregsubkey|a_loopregtimemodified|a_loopregtype|a_mday|a_min|a_mm|a_mmm|a_mmmm|a_mon|a_mousedelay|a_msec|a_mydocuments|a_now|a_nowutc|a_numbatchlines|a_ostype|a_osversion|a_priorhotkey|programfiles|a_programfiles|a_programs|a_programscommon|a_screenheight|a_screenwidth|a_scriptdir|a_scriptfullpath|a_scriptname|a_sec|a_space|a_startmenu|a_startmenucommon|a_startup|a_startupcommon|a_stringcasesense|a_tab|a_temp|a_thisfunc|a_thishotkey|a_thislabel|a_thismenu|a_thismenuitem|a_thismenuitempos|a_tickcount|a_timeidle|a_timeidlephysical|a_timesincepriorhotkey|a_timesincethishotkey|a_titlematchmode|a_titlematchmodespeed|a_username|a_wday|a_windelay|a_windir|a_workingdir|a_yday|a_year|a_yweek|a_yyyy|clipboard|clipboardall|comspec|errorlevel)\\\\b',\n           caseInsensitive: true },\n         { token: 'support.constant.ahk',\n           regex: '(?:\\\\b|^)(?:shift|lshift|rshift|alt|lalt|ralt|control|lcontrol|rcontrol|ctrl|lctrl|rctrl|lwin|rwin|appskey|altdown|altup|shiftdown|shiftup|ctrldown|ctrlup|lwindown|lwinup|rwindown|rwinup|lbutton|rbutton|mbutton|wheelup|wheelleft|wheelright|wheeldown|xbutton1|xbutton2|joy1|joy2|joy3|joy4|joy5|joy6|joy7|joy8|joy9|joy10|joy11|joy12|joy13|joy14|joy15|joy16|joy17|joy18|joy19|joy20|joy21|joy22|joy23|joy24|joy25|joy26|joy27|joy28|joy29|joy30|joy31|joy32|joyx|joyy|joyz|joyr|joyu|joyv|joypov|joyname|joybuttons|joyaxes|joyinfo|space|tab|enter|escape|esc|backspace|bs|delete|del|insert|ins|pgup|pgdn|home|end|up|down|left|right|printscreen|ctrlbreak|pause|scrolllock|capslock|numlock|numpad0|numpad1|numpad2|numpad3|numpad4|numpad5|numpad6|numpad7|numpad8|numpad9|numpadmult|numpadadd|numpadsub|numpaddiv|numpaddot|numpaddel|numpadins|numpadclear|numpadup|numpaddown|numpadleft|numpadright|numpadhome|numpadend|numpadpgup|numpadpgdn|numpadenter|f1|f2|f3|f4|f5|f6|f7|f8|f9|f10|f11|f12|f13|f14|f15|f16|f17|f18|f19|f20|f21|f22|f23|f24|browser_back|browser_forward|browser_refresh|browser_stop|browser_search|browser_favorites|browser_home|volume_mute|volume_down|volume_up|media_next|media_prev|media_stop|media_play_pause|launch_mail|launch_media|launch_app1|launch_app2)\\\\b',\n           caseInsensitive: true },\n         { token: 'variable.parameter',\n           regex: '(?:\\\\b|^)(?:pixel|mouse|screen|relative|rgb|ltrim|rtrim|join|low|belownormal|normal|abovenormal|high|realtime|ahk_id|ahk_pid|ahk_class|ahk_group|between|contains|in|is|integer|float|integerfast|floatfast|number|digit|xdigit|alpha|upper|lower|alnum|time|date|not|or|and|alwaysontop|topmost|top|bottom|transparent|transcolor|redraw|region|id|idlast|processname|minmax|controllist|count|list|capacity|statuscd|eject|lock|unlock|label|filesystem|label|setlabel|serial|type|status|static|seconds|minutes|hours|days|read|parse|logoff|close|error|single|tray|add|rename|check|uncheck|togglecheck|enable|disable|toggleenable|default|nodefault|standard|nostandard|color|delete|deleteall|icon|noicon|tip|click|show|mainwindow|nomainwindow|useerrorlevel|text|picture|pic|groupbox|button|checkbox|radio|dropdownlist|ddl|combobox|listbox|listview|datetime|monthcal|updown|slider|tab|tab2|statusbar|treeview|iconsmall|tile|report|sortdesc|nosort|nosorthdr|grid|hdr|autosize|range|xm|ym|ys|xs|xp|yp|font|resize|owner|submit|nohide|minimize|maximize|restore|noactivate|na|cancel|destroy|center|margin|maxsize|minsize|owndialogs|guiescape|guiclose|guisize|guicontextmenu|guidropfiles|tabstop|section|altsubmit|wrap|hscroll|vscroll|border|top|bottom|buttons|expand|first|imagelist|lines|wantctrla|wantf2|vis|visfirst|number|uppercase|lowercase|limit|password|multi|wantreturn|group|background|bold|italic|strike|underline|norm|backgroundtrans|theme|caption|delimiter|minimizebox|maximizebox|sysmenu|toolwindow|flash|style|exstyle|check3|checked|checkedgray|readonly|password|hidden|left|right|center|notab|section|move|focus|hide|choose|choosestring|text|pos|enabled|disabled|visible|lastfound|lastfoundexist|alttab|shiftalttab|alttabmenu|alttabandmenu|alttabmenudismiss|notimers|interrupt|priority|waitclose|blind|raw|unicode|deref|pow|bitnot|bitand|bitor|bitxor|bitshiftleft|bitshiftright|yes|no|ok|cancel|abort|retry|ignore|tryagain|on|off|all|hkey_local_machine|hkey_users|hkey_current_user|hkey_classes_root|hkey_current_config|hklm|hku|hkcu|hkcr|hkcc|reg_sz|reg_expand_sz|reg_multi_sz|reg_dword|reg_qword|reg_binary|reg_link|reg_resource_list|reg_full_resource_descriptor|reg_resource_requirements_list|reg_dword_big_endian)\\\\b',\n           caseInsensitive: true },\n         { keywordMap: {\"constant.language\": autoItKeywords}, regex: '\\\\w+\\\\b'},\n         { keywordMap: {\"variable.function\": atKeywords}, regex: '@\\\\w+\\\\b'},\n         { token : \"constant.numeric\", regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"},\n         { token: 'keyword.operator.ahk',\n           regex: '=|==|<>|:=|<|>|\\\\*|\\\\/|\\\\+|:|\\\\?|\\\\-' },\n         { token: 'punctuation.ahk',\n           regex: '#|`|::|,|\\\\{|\\\\}|\\\\(|\\\\)|\\\\%' },\n         { token: \n            [ 'punctuation.quote.double',\n              'string.quoted.ahk',\n              'punctuation.quote.double' ],\n           regex: '(\")((?:[^\"]|\"\")*)(\")' },\n         { token: [ 'label.ahk', 'punctuation.definition.label.ahk' ],\n           regex: '^([^: ]+)(:)(?!:)' } ] }\n    \n    this.normalizeRules();\n};\n\nAutoHotKeyHighlightRules.metaData = { name: 'AutoHotKey',\n      scopeName: 'source.ahk',\n      fileTypes: [ 'ahk' ],\n      foldingStartMarker: '^\\\\s*/\\\\*|^(?![^{]*?;|[^{]*?/\\\\*(?!.*?\\\\*/.*?\\\\{)).*?\\\\{\\\\s*($|;|/\\\\*(?!.*?\\\\*/.*\\\\S))',\n      foldingStopMarker: '^\\\\s*\\\\*/|^\\\\s*\\\\}' }\n\n\noop.inherits(AutoHotKeyHighlightRules, TextHighlightRules);\n\nexports.AutoHotKeyHighlightRules = AutoHotKeyHighlightRules;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/autohotkey\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/autohotkey_highlight_rules\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar AutoHotKeyHighlightRules = require(\"./autohotkey_highlight_rules\").AutoHotKeyHighlightRules;\nvar FoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = AutoHotKeyHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \";\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n    this.$id = \"ace/mode/autohotkey\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-batchfile.js",
    "content": "ace.define(\"ace/mode/batchfile_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar BatchFileHighlightRules = function() {\n\n    this.$rules = { start: \n       [ { token: 'keyword.command.dosbatch',\n           regex: '\\\\b(?:append|assoc|at|attrib|break|cacls|cd|chcp|chdir|chkdsk|chkntfs|cls|cmd|color|comp|compact|convert|copy|date|del|dir|diskcomp|diskcopy|doskey|echo|endlocal|erase|fc|find|findstr|format|ftype|graftabl|help|keyb|label|md|mkdir|mode|more|move|path|pause|popd|print|prompt|pushd|rd|recover|ren|rename|replace|restore|rmdir|set|setlocal|shift|sort|start|subst|time|title|tree|type|ver|verify|vol|xcopy)\\\\b',\n           caseInsensitive: true },\n         { token: 'keyword.control.statement.dosbatch',\n           regex: '\\\\b(?:goto|call|exit)\\\\b',\n           caseInsensitive: true },\n         { token: 'keyword.control.conditional.if.dosbatch',\n           regex: '\\\\bif\\\\s+not\\\\s+(?:exist|defined|errorlevel|cmdextversion)\\\\b',\n           caseInsensitive: true },\n         { token: 'keyword.control.conditional.dosbatch',\n           regex: '\\\\b(?:if|else)\\\\b',\n           caseInsensitive: true },\n         { token: 'keyword.control.repeat.dosbatch',\n           regex: '\\\\bfor\\\\b',\n           caseInsensitive: true },\n         { token: 'keyword.operator.dosbatch',\n           regex: '\\\\b(?:EQU|NEQ|LSS|LEQ|GTR|GEQ)\\\\b' },\n         { token: ['doc.comment', 'comment'],\n           regex: '(?:^|\\\\b)(rem)($|\\\\s.*$)',\n           caseInsensitive: true },\n         { token: 'comment.line.colons.dosbatch',\n           regex: '::.*$' },\n         { include: 'variable' },\n         { token: 'punctuation.definition.string.begin.shell',\n           regex: '\"',\n           push: [ \n              { token: 'punctuation.definition.string.end.shell', regex: '\"', next: 'pop' },\n              { include: 'variable' },\n              { defaultToken: 'string.quoted.double.dosbatch' } ] },\n         { token: 'keyword.operator.pipe.dosbatch', regex: '[|]' },\n         { token: 'keyword.operator.redirect.shell',\n           regex: '&>|\\\\d*>&\\\\d*|\\\\d*(?:>>|>|<)|\\\\d*<&|\\\\d*<>' } ],\n        variable: [\n         { token: 'constant.numeric', regex: '%%\\\\w+|%[*\\\\d]|%\\\\w+%'},\n         { token: 'constant.numeric', regex: '%~\\\\d+'},\n         { token: ['markup.list', 'constant.other', 'markup.list'],\n            regex: '(%)(\\\\w+)(%?)' }]}\n    \n    this.normalizeRules();\n};\n\nBatchFileHighlightRules.metaData = { name: 'Batch File',\n      scopeName: 'source.dosbatch',\n      fileTypes: [ 'bat' ] }\n\n\noop.inherits(BatchFileHighlightRules, TextHighlightRules);\n\nexports.BatchFileHighlightRules = BatchFileHighlightRules;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/batchfile\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/batchfile_highlight_rules\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar BatchFileHighlightRules = require(\"./batchfile_highlight_rules\").BatchFileHighlightRules;\nvar FoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = BatchFileHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"::\";\n    this.blockComment = \"\";\n    this.$id = \"ace/mode/batchfile\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-c9search.js",
    "content": "ace.define(\"ace/mode/c9search_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nfunction safeCreateRegexp(source, flag) {\n    try {\n        return new RegExp(source, flag);\n    } catch(e) {}\n}\n\nvar C9SearchHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [\n            {\n                tokenNames : [\"c9searchresults.constant.numeric\", \"c9searchresults.text\", \"c9searchresults.text\", \"c9searchresults.keyword\"],\n                regex : \"(^\\\\s+[0-9]+)(:\\\\s)(.+)\",\n                onMatch : function(val, state, stack) {\n                    var values = this.splitRegex.exec(val);\n                    var types = this.tokenNames;\n                    var tokens = [{\n                        type: types[0],\n                        value: values[1]\n                    },{\n                        type: types[1],\n                        value: values[2]\n                    }];\n                    \n                    var regex = stack[1];\n                    var str = values[3];\n                    \n                    var m;\n                    var last = 0;\n                    if (regex && regex.exec) {\n                        regex.lastIndex = 0;\n                        while (m = regex.exec(str)) {\n                            var skipped = str.substring(last, m.index);\n                            last = regex.lastIndex;\n                            if (skipped)\n                                tokens.push({type: types[2], value: skipped});\n                            if (m[0])\n                                tokens.push({type: types[3], value: m[0]});\n                            else if (!skipped)\n                                break;\n                        }\n                    }\n                    if (last < str.length)\n                        tokens.push({type: types[2], value: str.substr(last)});\n                    return tokens;\n                }\n            },\n            {\n                token : [\"string\", \"text\"], // single line\n                regex : \"(\\\\S.*)(:$)\"\n            },\n            {\n                regex : \"Searching for .*$\",\n                onMatch: function(val, state, stack) {\n                    var parts = val.split(\"\\x01\");\n                    if (parts.length < 3)\n                        return \"text\";\n\n                    var options, search, replace;\n                    \n                    var i = 0;\n                    var tokens = [{\n                        value: parts[i++] + \"'\",\n                        type: \"text\"\n                    }, {\n                        value: search = parts[i++],\n                        type: \"text\" // \"c9searchresults.keyword\"\n                    }, {\n                        value: \"'\" + parts[i++],\n                        type: \"text\"\n                    }];\n                    if (parts[2] !== \" in\") {\n                        replace = parts[i];\n                        tokens.push({\n                            value: \"'\" + parts[i++] + \"'\",\n                            type: \"text\"\n                        }, {\n                            value: parts[i++],\n                            type: \"text\"\n                        });\n                    }\n                    tokens.push({\n                        value: \" \" + parts[i++] + \" \",\n                        type: \"text\"\n                    });\n                    if (parts[i+1]) {\n                        options = parts[i+1];\n                        tokens.push({\n                            value: \"(\" + parts[i+1] + \")\",\n                            type: \"text\"\n                        });\n                        i += 1;\n                    } else {\n                        i -= 1;\n                    }\n                    while (i++ < parts.length) {\n                        parts[i] && tokens.push({\n                            value: parts[i],\n                            type: \"text\"\n                        });\n                    }\n                    \n                    if (replace) {\n                        search = replace;\n                        options = \"\";\n                    }\n                    \n                    if (search) {\n                        if (!/regex/.test(options))\n                            search = lang.escapeRegExp(search);\n                        if (/whole/.test(options))\n                            search = \"\\\\b\" + search + \"\\\\b\";\n                    }\n                    \n                    var regex = search && safeCreateRegexp(\n                        \"(\" + search + \")\",\n                        / sensitive/.test(options) ? \"g\" : \"ig\"\n                    );\n                    if (regex) {\n                        stack[0] = state;\n                        stack[1] = regex;\n                    }\n                    \n                    return tokens;\n                }\n            },\n            {\n                regex : \"\\\\d+\",\n                token: \"constant.numeric\"\n            }\n        ]\n    };\n};\n\noop.inherits(C9SearchHighlightRules, TextHighlightRules);\n\nexports.C9SearchHighlightRules = C9SearchHighlightRules;\n\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/folding/c9search\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /^(\\S.*\\:|Searching for.*)$/;\n    this.foldingStopMarker = /^(\\s+|Found.*)$/;\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var lines = session.doc.getAllLines(row);\n        var line = lines[row];\n        var level1 = /^(Found.*|Searching for.*)$/;\n        var level2 = /^(\\S.*\\:|\\s*)$/;\n        var re = level1.test(line) ? level1 : level2;\n        \n        var startRow = row;\n        var endRow = row;\n\n        if (this.foldingStartMarker.test(line)) {            \n            for (var i = row + 1, l = session.getLength(); i < l; i++) {\n                if (re.test(lines[i]))\n                    break;\n            }\n            endRow = i;\n        }\n        else if (this.foldingStopMarker.test(line)) {\n            for (var i = row - 1; i >= 0; i--) {\n                line = lines[i];\n                if (re.test(line))\n                    break;\n            }\n            startRow = i;\n        }\n        if (startRow != endRow) {\n            var col = line.length;\n            if (re === level1)\n                col = line.search(/\\(Found[^)]+\\)$|$/);\n            return new Range(startRow, col, endRow, 0);\n        }\n    };\n    \n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/c9search\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/c9search_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/folding/c9search\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar C9SearchHighlightRules = require(\"./c9search_highlight_rules\").C9SearchHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar C9StyleFoldMode = require(\"./folding/c9search\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = C9SearchHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.foldingRules = new C9StyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    \n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/c9search\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-c_cpp.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/c_cpp_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar cFunctions = exports.cFunctions = \"\\\\b(?:hypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len))))\\\\b\"\n\nvar c_cppHighlightRules = function() {\n\n    var keywordControls = (\n        \"break|case|continue|default|do|else|for|goto|if|_Pragma|\" +\n        \"return|switch|while|catch|operator|try|throw|using\"\n    );\n    \n    var storageType = (\n        \"asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|\" +\n        \"_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|\" +\n        \"class|wchar_t|template\"\n    );\n\n    var storageModifiers = (\n        \"const|extern|register|restrict|static|volatile|inline|private|\" +\n        \"protected|public|friend|explicit|virtual|export|mutable|typename|\" +\n        \"constexpr|new|delete\"\n    );\n\n    var keywordOperators = (\n        \"and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq\" +\n        \"const_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace\"\n    );\n\n    var builtinConstants = (\n        \"NULL|true|false|TRUE|FALSE\"\n    );\n\n    var keywordMapper = this.$keywords = this.createKeywordMapper({\n        \"keyword.control\" : keywordControls,\n        \"storage.type\" : storageType,\n        \"storage.modifier\" : storageModifiers,\n        \"keyword.operator\" : keywordOperators,\n        \"variable.language\": \"this\",\n        \"constant.language\": builtinConstants\n    }, \"identifier\");\n\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    this.$rules = { \n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"//\",\n                next : \"singleLineComment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                regex : '[\"].*\\\\\\\\$',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"string\", // multi line string start\n                regex : \"['].*\\\\\\\\$\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"\n            }, {\n                token : \"keyword\", // pre-compiler directives\n                regex : \"#\\\\s*(?:include|import|pragma|line|define|undef|if|ifdef|else|elif|ifndef)\\\\b\",\n                next  : \"directive\"\n            }, {\n                token : \"keyword\", // special case pre-compiler directive\n                regex : \"(?:#\\\\s*endif)\\\\b\"\n            }, {\n                token : \"support.function.C99.c\",\n                regex : cFunctions\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)\"\n            }, {\n              token : \"punctuation.operator\",\n              regex : \"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ],\n        \"singleLineComment\" : [\n            {\n                token : \"comment\",\n                regex : /\\\\$/,\n                next : \"singleLineComment\"\n            }, {\n                token : \"comment\",\n                regex : /$/,\n                next : \"start\"\n            }, {\n                defaultToken: \"comment\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n                next : \"start\"\n            }, {\n                defaultToken : \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n                next : \"start\"\n            }, {\n                defaultToken : \"string\"\n            }\n        ],\n        \"directive\" : [\n            {\n                token : \"constant.other.multiline\",\n                regex : /\\\\/\n            },\n            {\n                token : \"constant.other.multiline\",\n                regex : /.*\\\\/\n            },\n            {\n                token : \"constant.other\",\n                regex : \"\\\\s*<.+?>\",\n                next : \"start\"\n            },\n            {\n                token : \"constant.other\", // single line\n                regex : '\\\\s*[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]',\n                next : \"start\"\n            }, \n            {\n                token : \"constant.other\", // single line\n                regex : \"\\\\s*['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\",\n                next : \"start\"\n            },\n            {\n                token : \"constant.other\",\n                regex : /[^\\\\\\/]+/,\n                next : \"start\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(c_cppHighlightRules, TextHighlightRules);\n\nexports.c_cppHighlightRules = c_cppHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/c_cpp\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/c_cpp_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar c_cppHighlightRules = require(\"./c_cpp_highlight_rules\").c_cppHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = c_cppHighlightRules;\n\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/c_cpp\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-cirru.js",
    "content": "ace.define(\"ace/mode/cirru_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar CirruHighlightRules = function() {\n    this.$rules = {\n        start: [{\n            token: 'constant.numeric',\n            regex: /[\\d\\.]+/\n        }, {\n            token: 'comment.line.double-dash',\n            regex: /--/,\n            next: 'comment',\n        }, {\n            token: 'storage.modifier',\n            regex: /\\(/,\n        }, {\n            token: 'storage.modifier',\n            regex: /\\,/,\n            next: 'line',\n        }, {\n            token: 'support.function',\n            regex: /[^\\(\\)\\\"\\s]+/,\n            next: 'line'\n        }, {\n            token: 'string.quoted.double',\n            regex: /\"/,\n            next: 'string',\n        }, {\n            token: 'storage.modifier',\n            regex: /\\)/,\n        }],\n        comment: [{\n            token: 'comment.line.double-dash',\n            regex: /\\ +[^\\n]+/,\n            next: 'start',\n        }],\n        string: [{\n            token: 'string.quoted.double',\n            regex: /\"/,\n            next: 'line',\n        }, {\n            token: 'constant.character.escape',\n            regex: /\\\\/,\n            next: 'escape',\n        }, {\n            token: 'string.quoted.double',\n            regex: /[^\\\\\\\"]+/,\n        }],\n        escape: [{\n            token: 'constant.character.escape',\n            regex: /./,\n            next: 'string',\n        }],\n        line: [{\n            token: 'constant.numeric',\n            regex: /[\\d\\.]+/\n        }, {\n            token: 'markup.raw',\n            regex: /^\\s*/,\n            next: 'start',\n        }, {\n            token: 'storage.modifier',\n            regex: /\\$/,\n            next: 'start',\n        }, {\n            token: 'variable.parameter',\n            regex: /[^\\(\\)\\\"\\s]+/\n        }, {\n            token: 'storage.modifier',\n            regex: /\\(/,\n            next: 'start'\n        }, {\n            token: 'storage.modifier',\n            regex: /\\)/,\n        }, {\n            token: 'markup.raw',\n            regex: /^\\ */,\n            next: 'start',\n        }, {\n            token: 'string.quoted.double',\n            regex: /\"/,\n            next: 'string',\n        }]\n    }\n\n};\n\noop.inherits(CirruHighlightRules, TextHighlightRules);\n\nexports.CirruHighlightRules = CirruHighlightRules;\n});\n\nace.define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var range = this.indentationBlock(session, row);\n        if (range)\n            return range;\n\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1 || line[startLevel] != \"#\")\n            return;\n\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var level = line.search(re);\n\n            if (level == -1)\n                continue;\n\n            if (line[level] != \"#\")\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        var next = session.getLine(row + 1);\n        var prev = session.getLine(row - 1);\n        var prevIndent = prev.search(/\\S/);\n        var nextIndent = next.search(/\\S/);\n\n        if (indent == -1) {\n            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? \"start\" : \"\";\n            return \"\";\n        }\n        if (prevIndent == -1) {\n            if (indent == nextIndent && line[indent] == \"#\" && next[indent] == \"#\") {\n                session.foldWidgets[row - 1] = \"\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"start\";\n            }\n        } else if (prevIndent == indent && line[indent] == \"#\" && prev[indent] == \"#\") {\n            if (session.getLine(row - 2).search(/\\S/) == -1) {\n                session.foldWidgets[row - 1] = \"start\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"\";\n            }\n        }\n\n        if (prevIndent!= -1 && prevIndent < indent)\n            session.foldWidgets[row - 1] = \"start\";\n        else\n            session.foldWidgets[row - 1] = \"\";\n\n        if (indent < nextIndent)\n            return \"start\";\n        else\n            return \"\";\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/cirru\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/cirru_highlight_rules\",\"ace/mode/folding/coffee\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar CirruHighlightRules = require(\"./cirru_highlight_rules\").CirruHighlightRules;\nvar CoffeeFoldMode = require(\"./folding/coffee\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = CirruHighlightRules;\n    this.foldingRules = new CoffeeFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"--\";\n    this.$id = \"ace/mode/cirru\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-clojure.js",
    "content": "ace.define(\"ace/mode/clojure_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\n\n\nvar ClojureHighlightRules = function() {\n\n    var builtinFunctions = (\n        '* *1 *2 *3 *agent* *allow-unresolved-vars* *assert* *clojure-version* ' +\n        '*command-line-args* *compile-files* *compile-path* *e *err* *file* ' +\n        '*flush-on-newline* *in* *macro-meta* *math-context* *ns* *out* ' +\n        '*print-dup* *print-length* *print-level* *print-meta* *print-readably* ' +\n        '*read-eval* *source-path* *use-context-classloader* ' +\n        '*warn-on-reflection* + - -> ->> .. / < <= = ' +\n        '== > &gt; >= &gt;= accessor aclone ' +\n        'add-classpath add-watch agent agent-errors aget alength alias all-ns ' +\n        'alter alter-meta! alter-var-root amap ancestors and apply areduce ' +\n        'array-map aset aset-boolean aset-byte aset-char aset-double aset-float ' +\n        'aset-int aset-long aset-short assert assoc assoc! assoc-in associative? ' +\n        'atom await await-for await1 bases bean bigdec bigint binding bit-and ' +\n        'bit-and-not bit-clear bit-flip bit-not bit-or bit-set bit-shift-left ' +\n        'bit-shift-right bit-test bit-xor boolean boolean-array booleans ' +\n        'bound-fn bound-fn* butlast byte byte-array bytes cast char char-array ' +\n        'char-escape-string char-name-string char? chars chunk chunk-append ' +\n        'chunk-buffer chunk-cons chunk-first chunk-next chunk-rest chunked-seq? ' +\n        'class class? clear-agent-errors clojure-version coll? comment commute ' +\n        'comp comparator compare compare-and-set! compile complement concat cond ' +\n        'condp conj conj! cons constantly construct-proxy contains? count ' +\n        'counted? create-ns create-struct cycle dec decimal? declare definline ' +\n        'defmacro defmethod defmulti defn defn- defonce defstruct delay delay? ' +\n        'deliver deref derive descendants destructure disj disj! dissoc dissoc! ' +\n        'distinct distinct? doall doc dorun doseq dosync dotimes doto double ' +\n        'double-array doubles drop drop-last drop-while empty empty? ensure ' +\n        'enumeration-seq eval even? every? false? ffirst file-seq filter find ' +\n        'find-doc find-ns find-var first float float-array float? floats flush ' +\n        'fn fn? fnext for force format future future-call future-cancel ' +\n        'future-cancelled? future-done? future? gen-class gen-interface gensym ' +\n        'get get-in get-method get-proxy-class get-thread-bindings get-validator ' +\n        'hash hash-map hash-set identical? identity if-let if-not ifn? import ' +\n        'in-ns inc init-proxy instance? int int-array integer? interleave intern ' +\n        'interpose into into-array ints io! isa? iterate iterator-seq juxt key ' +\n        'keys keyword keyword? last lazy-cat lazy-seq let letfn line-seq list ' +\n        'list* list? load load-file load-reader load-string loaded-libs locking ' +\n        'long long-array longs loop macroexpand macroexpand-1 make-array ' +\n        'make-hierarchy map map? mapcat max max-key memfn memoize merge ' +\n        'merge-with meta method-sig methods min min-key mod name namespace neg? ' +\n        'newline next nfirst nil? nnext not not-any? not-empty not-every? not= ' +\n        'ns ns-aliases ns-imports ns-interns ns-map ns-name ns-publics ' +\n        'ns-refers ns-resolve ns-unalias ns-unmap nth nthnext num number? odd? ' +\n        'or parents partial partition pcalls peek persistent! pmap pop pop! ' +\n        'pop-thread-bindings pos? pr pr-str prefer-method prefers ' +\n        'primitives-classnames print print-ctor print-doc print-dup print-method ' +\n        'print-namespace-doc print-simple print-special-doc print-str printf ' +\n        'println println-str prn prn-str promise proxy proxy-call-with-super ' +\n        'proxy-mappings proxy-name proxy-super push-thread-bindings pvalues quot ' +\n        'rand rand-int range ratio? rational? rationalize re-find re-groups ' +\n        're-matcher re-matches re-pattern re-seq read read-line read-string ' +\n        'reduce ref ref-history-count ref-max-history ref-min-history ref-set ' +\n        'refer refer-clojure release-pending-sends rem remove remove-method ' +\n        'remove-ns remove-watch repeat repeatedly replace replicate require ' +\n        'reset! reset-meta! resolve rest resultset-seq reverse reversible? rseq ' +\n        'rsubseq second select-keys send send-off seq seq? seque sequence ' +\n        'sequential? set set-validator! set? short short-array shorts ' +\n        'shutdown-agents slurp some sort sort-by sorted-map sorted-map-by ' +\n        'sorted-set sorted-set-by sorted? special-form-anchor special-symbol? ' +\n        'split-at split-with str stream? string? struct struct-map subs subseq ' +\n        'subvec supers swap! symbol symbol? sync syntax-symbol-anchor take ' +\n        'take-last take-nth take-while test the-ns time to-array to-array-2d ' +\n        'trampoline transient tree-seq true? type unchecked-add unchecked-dec ' +\n        'unchecked-divide unchecked-inc unchecked-multiply unchecked-negate ' +\n        'unchecked-remainder unchecked-subtract underive unquote ' +\n        'unquote-splicing update-in update-proxy use val vals var-get var-set ' +\n        'var? vary-meta vec vector vector? when when-first when-let when-not ' +\n        'while with-bindings with-bindings* with-in-str with-loading-context ' +\n        'with-local-vars with-meta with-open with-out-str with-precision xml-seq ' +\n        'zero? zipmap'\n    );\n\n    var keywords = ('throw try var ' +\n        'def do fn if let loop monitor-enter monitor-exit new quote recur set!'\n    );\n\n    var buildinConstants = (\"true false nil\");\n\n    var keywordMapper = this.createKeywordMapper({\n        \"keyword\": keywords,\n        \"constant.language\": buildinConstants,\n        \"support.function\": builtinFunctions\n    }, \"identifier\", false, \" \");\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \";.*$\"\n            }, {\n                token : \"keyword\", //parens\n                regex : \"[\\\\(|\\\\)]\"\n            }, {\n                token : \"keyword\", //lists\n                regex : \"[\\\\'\\\\(]\"\n            }, {\n                token : \"keyword\", //vectors\n                regex : \"[\\\\[|\\\\]]\"\n            }, {\n                token : \"keyword\", //sets and maps\n                regex : \"[\\\\{|\\\\}|\\\\#\\\\{|\\\\#\\\\}]\"\n            }, {\n                    token : \"keyword\", // ampersands\n                    regex : '[\\\\&]'\n            }, {\n                    token : \"keyword\", // metadata\n                    regex : '[\\\\#\\\\^\\\\{]'\n            }, {\n                    token : \"keyword\", // anonymous fn syntactic sugar\n                    regex : '[\\\\%]'\n            }, {\n                    token : \"keyword\", // deref reader macro\n                    regex : '[@]'\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language\",\n                regex : '[!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+||=|!=|<=|>=|<>|<|>|!|&&]'\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$\\\\-]*\\\\b\"\n            }, {\n                token : \"string\", // single line\n                regex : '\"',\n                next: \"string\"\n            }, {\n                token : \"constant\", // symbol\n                regex : /:[^()\\[\\]{}'\"\\^%`,;\\s]+/\n            }, {\n                token : \"string.regexp\", //Regular Expressions\n                regex : '/#\"(?:\\\\.|(?:\\\\\\\")|[^\\\"\"\\n])*\"/g'\n            }\n\n        ],\n        \"string\" : [\n            {\n                token : \"constant.language.escape\",                \n                regex : \"\\\\\\\\.|\\\\\\\\$\"\n            }, {\n                token : \"string\",                \n                regex : '[^\"\\\\\\\\]+'\n            }, {\n                token : \"string\",\n                regex : '\"',\n                next : \"start\"\n            }\n        ]\n    };\n};\n\noop.inherits(ClojureHighlightRules, TextHighlightRules);\n\nexports.ClojureHighlightRules = ClojureHighlightRules;\n});\n\nace.define(\"ace/mode/matching_parens_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingParensOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\)/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\))/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        var match = line.match(/^(\\s+)/);\n        if (match) {\n            return match[1];\n        }\n\n        return \"\";\n    };\n\n}).call(MatchingParensOutdent.prototype);\n\nexports.MatchingParensOutdent = MatchingParensOutdent;\n});\n\nace.define(\"ace/mode/clojure\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/clojure_highlight_rules\",\"ace/mode/matching_parens_outdent\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar ClojureHighlightRules = require(\"./clojure_highlight_rules\").ClojureHighlightRules;\nvar MatchingParensOutdent = require(\"./matching_parens_outdent\").MatchingParensOutdent;\n\nvar Mode = function() {\n    this.HighlightRules = ClojureHighlightRules;\n    this.$outdent = new MatchingParensOutdent();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \";\";\n    this.minorIndentFunctions = [\"defn\", \"defn-\", \"defmacro\", \"def\", \"deftest\", \"testing\"];\n\n    this.$toIndent = function(str) {\n        return str.split('').map(function(ch) {\n            if (/\\s/.exec(ch)) {\n                return ch;\n            } else {\n                return ' ';\n            }\n        }).join('');\n    };\n\n    this.$calculateIndent = function(line, tab) {\n        var baseIndent = this.$getIndent(line);\n        var delta = 0;\n        var isParen, ch;\n        for (var i = line.length - 1; i >= 0; i--) {\n            ch = line[i];\n            if (ch === '(') {\n                delta--;\n                isParen = true;\n            } else if (ch === '(' || ch === '[' || ch === '{') {\n                delta--;\n                isParen = false;\n            } else if (ch === ')' || ch === ']' || ch === '}') {\n                delta++;\n            }\n            if (delta < 0) {\n                break;\n            }\n        }\n        if (delta < 0 && isParen) {\n            i += 1;\n            var iBefore = i;\n            var fn = '';\n            while (true) {\n                ch = line[i];\n                if (ch === ' ' || ch === '\\t') {\n                    if(this.minorIndentFunctions.indexOf(fn) !== -1) {\n                        return this.$toIndent(line.substring(0, iBefore - 1) + tab);\n                    } else {\n                        return this.$toIndent(line.substring(0, i + 1));\n                    }\n                } else if (ch === undefined) {\n                    return this.$toIndent(line.substring(0, iBefore - 1) + tab);\n                }\n                fn += line[i];\n                i++;\n            }\n        } else if(delta < 0 && !isParen) {\n            return this.$toIndent(line.substring(0, i+1));\n        } else if(delta > 0) {\n            baseIndent = baseIndent.substring(0, baseIndent.length - tab.length);\n            return baseIndent;\n        } else {\n            return baseIndent;\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$calculateIndent(line, tab);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/clojure\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-cobol.js",
    "content": "ace.define(\"ace/mode/cobol_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar CobolHighlightRules = function() {\nvar keywords = \"ACCEPT|MERGE|SUM|ADD||MESSAGE|TABLE|ADVANCING|MODE|TAPE|\" +\n\"AFTER|MULTIPLY|TEST|ALL|NEGATIVE|TEXT|ALPHABET|NEXT|THAN|\" +\n\"ALSO|NO|THEN|ALTERNATE|NOT|THROUGH|AND|NUMBER|THRU|ANY|OCCURS|\" +\n\"TIME|ARE|OF|TO|AREA|OFF|TOP||ASCENDING|OMITTED|TRUE|ASSIGN|ON|TYPE|AT|OPEN|\" +\n\"UNIT|AUTHOR|OR|UNTIL|BEFORE|OTHER|UP|BLANK|OUTPUT|USE|BLOCK|PAGE|USING|BOTTOM|\" +\n\"PERFORM|VALUE|BY|PIC|VALUES|CALL|PICTURE|WHEN|CANCEL|PLUS|WITH|CD|POINTER|WRITE|\" +\n\"CHARACTER|POSITION||ZERO|CLOSE|POSITIVE|ZEROS|COLUMN|PROCEDURE|ZEROES|COMMA|PROGRAM|\" +\n\"COMMON|PROGRAM-ID|COMMUNICATION|QUOTE|COMP|RANDOM|COMPUTE|READ|CONTAINS|RECEIVE|CONFIGURATION|\" +\n\"RECORD|CONTINUE|REDEFINES|CONTROL|REFERENCE|COPY|REMAINDER|COUNT|REPLACE|DATA|REPORT|DATE|RESERVE|\" +\n\"DAY|RESET|DELETE|RETURN|DESTINATION|REWIND|DISABLE|REWRITE|DISPLAY|RIGHT|DIVIDE|RUN|DOWN|SAME|\" +\n\"ELSE|SEARCH|ENABLE|SECTION|END|SELECT|ENVIRONMENT|SENTENCE|EQUAL|SET|ERROR|SIGN|EXIT|SEQUENTIAL|\" +\n\"EXTERNAL|SIZE|FLASE|SORT|FILE|SOURCE|LENGTH|SPACE|LESS|STANDARD|LIMIT|START|LINE|STOP|LOCK|STRING|LOW-VALUE|SUBTRACT\";\n\n    var builtinConstants = (\n        \"true|false|null\"\n    );\n\n    var builtinFunctions = (\n        \"count|min|max|avg|sum|rank|now|coalesce|main\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": builtinFunctions,\n        \"keyword\": keywords,\n        \"constant.language\": builtinConstants\n    }, \"identifier\", true);\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment\",\n            regex : \"\\\\*.*$\"\n        }, {\n            token : \"string\",           // \" string\n            regex : '\".*?\"'\n        }, {\n            token : \"string\",           // ' string\n            regex : \"'.*?'\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\\\+|\\\\-|\\\\/|\\\\/\\\\/|%|<@>|@>|<@|&|\\\\^|~|<|>|<=|=>|==|!=|<>|=\"\n        }, {\n            token : \"paren.lparen\",\n            regex : \"[\\\\(]\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\)]\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        } ]\n    };\n};\n\noop.inherits(CobolHighlightRules, TextHighlightRules);\n\nexports.CobolHighlightRules = CobolHighlightRules;\n});\n\nace.define(\"ace/mode/cobol\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/cobol_highlight_rules\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar CobolHighlightRules = require(\"./cobol_highlight_rules\").CobolHighlightRules;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.HighlightRules = CobolHighlightRules;\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"*\";\n\n    this.$id = \"ace/mode/cobol\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-coffee.js",
    "content": "ace.define(\"ace/mode/coffee_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\n    var oop = require(\"../lib/oop\");\n    var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\n    oop.inherits(CoffeeHighlightRules, TextHighlightRules);\n\n    function CoffeeHighlightRules() {\n        var identifier = \"[$A-Za-z_\\\\x7f-\\\\uffff][$\\\\w\\\\x7f-\\\\uffff]*\";\n\n        var keywords = (\n            \"this|throw|then|try|typeof|super|switch|return|break|by|continue|\" +\n            \"catch|class|in|instanceof|is|isnt|if|else|extends|for|own|\" +\n            \"finally|function|while|when|new|no|not|delete|debugger|do|loop|of|off|\" +\n            \"or|on|unless|until|and|yes\"\n        );\n\n        var langConstant = (\n            \"true|false|null|undefined|NaN|Infinity\"\n        );\n\n        var illegal = (\n            \"case|const|default|function|var|void|with|enum|export|implements|\" +\n            \"interface|let|package|private|protected|public|static|yield|\" +\n            \"__hasProp|slice|bind|indexOf\"\n        );\n\n        var supportClass = (\n            \"Array|Boolean|Date|Function|Number|Object|RegExp|ReferenceError|String|\" +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\" +\n            \"SyntaxError|TypeError|URIError|\"  +\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\" +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray\"\n        );\n\n        var supportFunction = (\n            \"Math|JSON|isNaN|isFinite|parseInt|parseFloat|encodeURI|\" +\n            \"encodeURIComponent|decodeURI|decodeURIComponent|String|\"\n        );\n\n        var variableLanguage = (\n            \"window|arguments|prototype|document\"\n        );\n\n        var keywordMapper = this.createKeywordMapper({\n            \"keyword\": keywords,\n            \"constant.language\": langConstant,\n            \"invalid.illegal\": illegal,\n            \"language.support.class\": supportClass,\n            \"language.support.function\": supportFunction,\n            \"variable.language\": variableLanguage\n        }, \"identifier\");\n\n        var functionRule = {\n            token: [\"paren.lparen\", \"variable.parameter\", \"paren.rparen\", \"text\", \"storage.type\"],\n            regex: /(?:(\\()((?:\"[^\")]*?\"|'[^')]*?'|\\/[^\\/)]*?\\/|[^()\\\"'\\/])*?)(\\))(\\s*))?([\\-=]>)/.source\n        };\n\n        var stringEscape = /\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)/;\n\n        this.$rules = {\n            start : [\n                {\n                    token : \"constant.numeric\",\n                    regex : \"(?:0x[\\\\da-fA-F]+|(?:\\\\d+(?:\\\\.\\\\d+)?|\\\\.\\\\d+)(?:[eE][+-]?\\\\d+)?)\"\n                }, {\n                    stateName: \"qdoc\",\n                    token : \"string\", regex : \"'''\", next : [\n                        {token : \"string\", regex : \"'''\", next : \"start\"},\n                        {token : \"constant.language.escape\", regex : stringEscape},\n                        {defaultToken: \"string\"}\n                    ]\n                }, {\n                    stateName: \"qqdoc\",\n                    token : \"string\",\n                    regex : '\"\"\"',\n                    next : [\n                        {token : \"string\", regex : '\"\"\"', next : \"start\"},\n                        {token : \"paren.string\", regex : '#{', push : \"start\"},\n                        {token : \"constant.language.escape\", regex : stringEscape},\n                        {defaultToken: \"string\"}\n                    ]\n                }, {\n                    stateName: \"qstring\",\n                    token : \"string\", regex : \"'\", next : [\n                        {token : \"string\", regex : \"'\", next : \"start\"},\n                        {token : \"constant.language.escape\", regex : stringEscape},\n                        {defaultToken: \"string\"}\n                    ]\n                }, {\n                    stateName: \"qqstring\",\n                    token : \"string.start\", regex : '\"', next : [\n                        {token : \"string.end\", regex : '\"', next : \"start\"},\n                        {token : \"paren.string\", regex : '#{', push : \"start\"},\n                        {token : \"constant.language.escape\", regex : stringEscape},\n                        {defaultToken: \"string\"}\n                    ]\n                }, {\n                    stateName: \"js\",\n                    token : \"string\", regex : \"`\", next : [\n                        {token : \"string\", regex : \"`\", next : \"start\"},\n                        {token : \"constant.language.escape\", regex : stringEscape},\n                        {defaultToken: \"string\"}\n                    ]\n                }, {\n                    regex: \"[{}]\", onMatch: function(val, state, stack) {\n                        this.next = \"\";\n                        if (val == \"{\" && stack.length) {\n                            stack.unshift(\"start\", state);\n                            return \"paren\";\n                        }\n                        if (val == \"}\" && stack.length) {\n                            stack.shift();\n                            this.next = stack.shift() || \"\";\n                            if (this.next.indexOf(\"string\") != -1)\n                                return \"paren.string\";\n                        }\n                        return \"paren\";\n                    }\n                }, {\n                    token : \"string.regex\",\n                    regex : \"///\",\n                    next : \"heregex\"\n                }, {\n                    token : \"string.regex\",\n                    regex : /(?:\\/(?![\\s=])[^[\\/\\n\\\\]*(?:(?:\\\\[\\s\\S]|\\[[^\\]\\n\\\\]*(?:\\\\[\\s\\S][^\\]\\n\\\\]*)*])[^[\\/\\n\\\\]*)*\\/)(?:[imgy]{0,4})(?!\\w)/\n                }, {\n                    token : \"comment\",\n                    regex : \"###(?!#)\",\n                    next : \"comment\"\n                }, {\n                    token : \"comment\",\n                    regex : \"#.*\"\n                }, {\n                    token : [\"punctuation.operator\", \"text\", \"identifier\"],\n                    regex : \"(\\\\.)(\\\\s*)(\" + illegal + \")\"\n                }, {\n                    token : \"punctuation.operator\",\n                    regex : \"\\\\.\"\n                }, {\n                    token : [\"keyword\", \"text\", \"language.support.class\",\n                     \"text\", \"keyword\", \"text\", \"language.support.class\"],\n                    regex : \"(class)(\\\\s+)(\" + identifier + \")(?:(\\\\s+)(extends)(\\\\s+)(\" + identifier + \"))?\"\n                }, {\n                    token : [\"entity.name.function\", \"text\", \"keyword.operator\", \"text\"].concat(functionRule.token),\n                    regex : \"(\" + identifier + \")(\\\\s*)([=:])(\\\\s*)\" + functionRule.regex\n                }, \n                functionRule, \n                {\n                    token : \"variable\",\n                    regex : \"@(?:\" + identifier + \")?\"\n                }, {\n                    token: keywordMapper,\n                    regex : identifier\n                }, {\n                    token : \"punctuation.operator\",\n                    regex : \"\\\\,|\\\\.\"\n                }, {\n                    token : \"storage.type\",\n                    regex : \"[\\\\-=]>\"\n                }, {\n                    token : \"keyword.operator\",\n                    regex : \"(?:[-+*/%<>&|^!?=]=|>>>=?|\\\\-\\\\-|\\\\+\\\\+|::|&&=|\\\\|\\\\|=|<<=|>>=|\\\\?\\\\.|\\\\.{2,3}|[!*+-=><])\"\n                }, {\n                    token : \"paren.lparen\",\n                    regex : \"[({[]\"\n                }, {\n                    token : \"paren.rparen\",\n                    regex : \"[\\\\]})]\"\n                }, {\n                    token : \"text\",\n                    regex : \"\\\\s+\"\n                }],\n\n\n            heregex : [{\n                token : \"string.regex\",\n                regex : '.*?///[imgy]{0,4}',\n                next : \"start\"\n            }, {\n                token : \"comment.regex\",\n                regex : \"\\\\s+(?:#.*)?\"\n            }, {\n                token : \"string.regex\",\n                regex : \"\\\\S+\"\n            }],\n\n            comment : [{\n                token : \"comment\",\n                regex : '###',\n                next : \"start\"\n            }, {\n                defaultToken : \"comment\"\n            }]\n        };\n        this.normalizeRules();\n    }\n\n    exports.CoffeeHighlightRules = CoffeeHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var range = this.indentationBlock(session, row);\n        if (range)\n            return range;\n\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1 || line[startLevel] != \"#\")\n            return;\n\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var level = line.search(re);\n\n            if (level == -1)\n                continue;\n\n            if (line[level] != \"#\")\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        var next = session.getLine(row + 1);\n        var prev = session.getLine(row - 1);\n        var prevIndent = prev.search(/\\S/);\n        var nextIndent = next.search(/\\S/);\n\n        if (indent == -1) {\n            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? \"start\" : \"\";\n            return \"\";\n        }\n        if (prevIndent == -1) {\n            if (indent == nextIndent && line[indent] == \"#\" && next[indent] == \"#\") {\n                session.foldWidgets[row - 1] = \"\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"start\";\n            }\n        } else if (prevIndent == indent && line[indent] == \"#\" && prev[indent] == \"#\") {\n            if (session.getLine(row - 2).search(/\\S/) == -1) {\n                session.foldWidgets[row - 1] = \"start\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"\";\n            }\n        }\n\n        if (prevIndent!= -1 && prevIndent < indent)\n            session.foldWidgets[row - 1] = \"start\";\n        else\n            session.foldWidgets[row - 1] = \"\";\n\n        if (indent < nextIndent)\n            return \"start\";\n        else\n            return \"\";\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/coffee\",[\"require\",\"exports\",\"module\",\"ace/mode/coffee_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/folding/coffee\",\"ace/range\",\"ace/mode/text\",\"ace/worker/worker_client\",\"ace/lib/oop\"], function(require, exports, module) {\n\"use strict\";\n\nvar Rules = require(\"./coffee_highlight_rules\").CoffeeHighlightRules;\nvar Outdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar FoldMode = require(\"./folding/coffee\").FoldMode;\nvar Range = require(\"../range\").Range;\nvar TextMode = require(\"./text\").Mode;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar oop = require(\"../lib/oop\");\n\nfunction Mode() {\n    this.HighlightRules = Rules;\n    this.$outdent = new Outdent();\n    this.foldingRules = new FoldMode();\n}\n\noop.inherits(Mode, TextMode);\n\n(function() {\n    var indenter = /(?:[({[=:]|[-=]>|\\b(?:else|try|(?:swi|ca)tch(?:\\s+[$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]*)?|finally))\\s*$|^\\s*(else\\b\\s*)?(?:if|for|while|loop)\\b(?!.*\\bthen\\b)/;\n    var commentLine = /^(\\s*)#/;\n    var hereComment = /^\\s*###(?!#)/;\n    var indentation = /^\\s*/;\n    \n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n    \n        if (!(tokens.length && tokens[tokens.length - 1].type === 'comment') &&\n            state === 'start' && indenter.test(line))\n            indent += tab;\n        return indent;\n    };\n    \n    this.toggleCommentLines = function(state, doc, startRow, endRow){\n        console.log(\"toggle\");\n        var range = new Range(0, 0, 0, 0);\n        for (var i = startRow; i <= endRow; ++i) {\n            var line = doc.getLine(i);\n            if (hereComment.test(line))\n                continue;\n                \n            if (commentLine.test(line))\n                line = line.replace(commentLine, '$1');\n            else\n                line = line.replace(indentation, '$&#');\n    \n            range.end.row = range.start.row = i;\n            range.end.column = line.length + 1;\n            doc.replace(range, line);\n        }\n    };\n    \n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n    \n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n    \n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/coffee_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n        \n        worker.on(\"error\", function(e) {\n            session.setAnnotations([e.data]);\n        });\n        \n        worker.on(\"ok\", function(e) {\n            session.clearAnnotations();\n        });\n        \n        return worker;\n    };\n\n    this.$id = \"ace/mode/coffee\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-coldfusion.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\nace.define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar CssBehaviour = function () {\n\n    this.inherit(CstyleBehaviour);\n\n    this.add(\"colon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(cursor.row);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                if (rightChar === ':') {\n                    return {\n                       text: '',\n                       selection: [1, 1]\n                    }\n                }\n                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n                    return {\n                       text: ':;',\n                       selection: [1, 1]\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"colon\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(range.start.row);\n                var rightChar = line.substring(range.end.column, range.end.column + 1);\n                if (rightChar === ';') {\n                    range.end.column ++;\n                    return range;\n                }\n            }\n        }\n    });\n\n    this.add(\"semicolon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ';') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === ';') {\n                return {\n                   text: '',\n                   selection: [1, 1]\n                }\n            }\n        }\n    });\n\n}\noop.inherits(CssBehaviour, CstyleBehaviour);\n\nexports.CssBehaviour = CssBehaviour;\n});\n\nace.define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CssBehaviour = require(\"./behaviour/css\").CssBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = CssHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CssBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"csslint\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/css\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\nace.define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"string.cdata.xml\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.xml-decl.xml\", \"keyword.xml-decl.xml\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_decl\", caseInsensitive: true\n            },\n            {\n                token : [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"processing_instruction\",\n            },\n            {token : \"comment.xml\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\", caseInsensitive: true\n            },\n            {include : \"tag\"},\n            {token : \"text.end-tag-open.xml\", regex: \"</\"},\n            {token : \"text.tag-open.xml\", regex: \"<\"},\n            {include : \"reference\"},\n            {defaultToken : \"text.xml\"}\n        ],\n\n        xml_decl : [{\n            token : \"entity.other.attribute-name.decl-attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.decl-attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"whitespace\"\n        }, {\n            include: \"string\"\n        }, {\n            token : \"punctuation.xml-decl.xml\",\n            regex : \"\\\\?>\",\n            next : \"start\"\n        }],\n\n        processing_instruction : [\n            {token : \"punctuation.instruction.xml\", regex : \"\\\\?>\", next : \"start\"},\n            {defaultToken : \"instruction.xml\"}\n        ],\n\n        doctype : [\n            {include : \"whitespace\"},\n            {include : \"string\"},\n            {token : \"xml-pe.doctype.xml\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe.xml\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.int-subset\", regex : \"\\\\[\", push : \"int_subset\"}\n        ],\n\n        int_subset : [{\n            token : \"text.xml\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.int-subset.xml\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.markup-decl.xml\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.cdata.xml\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text.xml\", regex : \"\\\\s+\"},\n            {token : \"text.xml\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment.xml\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment.xml\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape.reference.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        attr_reference : [{\n            token : \"constant.language.escape.reference.attribute-value.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n            regex : \"(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n            ]\n        }],\n\n        tag_whitespace : [\n            {token : \"text.tag-whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        whitespace : [\n            {token : \"text.whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        string: [{\n            token : \"string.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.xml\", regex: \"'\", next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }, {\n            token : \"string.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.xml\", regex: '\"', next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }],\n\n        attributes: [{\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"tag_whitespace\"\n        }, {\n            include: \"attribute_value\"\n        }],\n\n        attribute_value: [{\n            token : \"string.attribute-value.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }, {\n            token : \"string.attribute-value.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\nace.define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    option      : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.addRules({\n        attributes: [{\n            include : \"tag_whitespace\"\n        }, {\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\",\n            push : [{\n                include: \"tag_whitespace\"\n            }, {\n                token : \"string.unquoted.attribute-value.html\",\n                regex : \"[^<>='\\\"`\\\\s]+\",\n                next : \"pop\"\n            }, {\n                token : \"empty\",\n                regex : \"\",\n                next : \"pop\"\n            }]\n        }, {\n            include : \"attribute_value\"\n        }],\n        tag: [{\n            token : function(start, tag) {\n                var group = tagMap[tag];\n                return [\"meta.tag.punctuation.\" + (start == \"<\" ? \"\" : \"end-\") + \"tag-open.xml\",\n                    \"meta.tag\" + (group ? \".\" + group : \"\") + \".tag-name.xml\"];\n            },\n            regex : \"(</?)([-_a-zA-Z0-9:]+)\",\n            next: \"tag_stuff\"\n        }],\n        tag_stuff: [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n        ],\n    });\n\n    this.embedTagRules(CssHighlightRules, \"css-\", \"style\");\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    if (this.constructor === HtmlHighlightRules)\n        this.normalizeRules();\n};\n\noop.inherits(HtmlHighlightRules, XmlHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nvar XmlBehaviour = function () {\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selected = session.doc.getTextRange(editor.getSelectionRange());\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            }\n\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (rightChar == quote && (is(token, \"attribute-value\") || is(token, \"string\"))) {\n                return {\n                    text: \"\",\n                    selection: [1, 1]\n                };\n            }\n\n            if (!token)\n                token = iterator.stepBackward();\n\n            if (!token)\n                return;\n\n            while (is(token, \"tag-whitespace\") || is(token, \"whitespace\")) {\n                token = iterator.stepBackward();\n            }\n            var rightSpace = !rightChar || rightChar.match(/\\s/);\n            if (is(token, \"attribute-equals\") && (rightSpace || rightChar == '>') || (is(token, \"decl-attribute-equals\") && (rightSpace || rightChar == '?'))) {\n                return {\n                    text: quote + quote,\n                    selection: [1, 1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken() || iterator.stepBackward();\n            if (!token || !(is(token, \"tag-name\") || is(token, \"tag-whitespace\") || is(token, \"attribute-name\") || is(token, \"attribute-equals\") || is(token, \"attribute-value\")))\n                return;\n            if (is(token, \"reference.attribute-value\"))\n                return;\n            if (is(token, \"attribute-value\")) {\n                var firstChar = token.value.charAt(0);\n                if (firstChar == '\"' || firstChar == \"'\") {\n                    var lastChar = token.value.charAt(token.value.length - 1);\n                    var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length;\n                    if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar)\n                        return;\n                }\n            }\n            while (!is(token, \"tag-name\")) {\n                token = iterator.stepBackward();\n            }\n\n            var tokenRow = iterator.getCurrentTokenRow();\n            var tokenColumn = iterator.getCurrentTokenColumn();\n            if (is(iterator.stepBackward(), \"end-tag-open\"))\n                return;\n\n            var element = token.value;\n            if (tokenRow == position.row)\n                element = element.substring(0, position.column - tokenColumn);\n\n            if (this.voidElements.hasOwnProperty(element.toLowerCase()))\n                 return;\n\n            return {\n               text: \">\" + \"</\" + element + \">\",\n               selection: [1, 1]\n            };\n        }\n    });\n\n    this.add(\"autoindent\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.getLine(cursor.row);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (token && token.type.indexOf(\"tag-close\") !== -1) {\n                while (token && token.type.indexOf(\"tag-name\") === -1) {\n                    token = iterator.stepBackward();\n                }\n\n                if (!token) {\n                    return;\n                }\n\n                var tag = token.value;\n                var row = iterator.getCurrentTokenRow();\n                token = iterator.stepBackward();\n                if (!token || token.type.indexOf(\"end-tag\") !== -1) {\n                    return;\n                }\n\n                if (this.voidElements && !this.voidElements[tag]) {\n                    var nextToken = session.getTokenAt(cursor.row, cursor.column+1);\n                    var line = session.getLine(row);\n                    var nextIndent = this.$getIndent(line);\n                    var indent = nextIndent + session.getTabString();\n\n                    if (nextToken && nextToken.value === \"</\") {\n                        return {\n                            text: \"\\n\" + indent + \"\\n\" + nextIndent,\n                            selection: [1, indent.length, 1, indent.length]\n                        };\n                    } else {\n                        return {\n                            text: \"\\n\" + indent\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n};\n\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\nace.define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n    this.defaultMode = defaultMode;\n    this.subModes = subModes;\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n\n    this.$getMode = function(state) {\n        if (typeof state != \"string\") \n            state = state[0];\n        for (var key in this.subModes) {\n            if (state.indexOf(key) === 0)\n                return this.subModes[key];\n        }\n        return null;\n    };\n    \n    this.$tryMode = function(state, session, foldStyle, row) {\n        var mode = this.$getMode(state);\n        return (mode ? mode.getFoldWidget(session, foldStyle, row) : \"\");\n    };\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        return (\n            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n            this.defaultMode.getFoldWidget(session, foldStyle, row)\n        );\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var mode = this.$getMode(session.getState(row-1));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.$getMode(session.getState(row));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.defaultMode;\n        \n        return mode.getFoldWidgetRange(session, foldStyle, row);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalEndTags) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n    this.optionalEndTags = oop.mixin({}, this.voidElements);\n    if (optionalEndTags)\n        oop.mixin(this.optionalEndTags, optionalEndTags);\n    \n};\noop.inherits(FoldMode, BaseFoldMode);\n\nvar Tag = function() {\n    this.tagName = \"\";\n    this.closing = false;\n    this.selfClosing = false;\n    this.start = {row: 0, column: 0};\n    this.end = {row: 0, column: 0};\n};\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (!tag)\n            return \"\";\n\n        if (tag.closing || (!tag.tagName && tag.selfClosing))\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase()))\n            return \"\";\n\n        if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column))\n            return \"\";\n\n        return \"start\";\n    };\n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var tag = new Tag();\n\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (is(token, \"tag-open\")) {\n                tag.end.column = tag.start.column + token.value.length;\n                tag.closing = is(token, \"end-tag-open\");\n                token = tokens[++i];\n                if (!token)\n                    return null;\n                tag.tagName = token.value;\n                tag.end.column += token.value.length;\n                for (i++; i < tokens.length; i++) {\n                    token = tokens[i];\n                    tag.end.column += token.value.length;\n                    if (is(token, \"tag-close\")) {\n                        tag.selfClosing = token.value == '/>';\n                        break;\n                    }\n                }\n                return tag;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == '/>';\n                return tag;\n            }\n            tag.start.column += token.value.length;\n        }\n\n        return null;\n    };\n\n    this._findEndTagInLine = function(session, row, tagName, startColumn) {\n        var tokens = session.getTokens(row);\n        var column = 0;\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            column += token.value.length;\n            if (column < startColumn)\n                continue;\n            if (is(token, \"end-tag-open\")) {\n                token = tokens[i + 1];\n                if (token && token.value == tagName)\n                    return true;\n            }\n        }\n        return false;\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n                iterator.stepForward();\n                return tag;\n            }\n        } while(token = iterator.stepForward());\n\n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n                iterator.stepBackward();\n                return tag;\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n            }\n        } while(token = iterator.stepBackward());\n\n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.optionalEndTags.hasOwnProperty(top.tagName)) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.start.column);\n            var start = {\n                row: row,\n                column: firstTag.start.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.end.column);\n            var end = {\n                row: row,\n                column: firstTag.start.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar MixedFoldMode = require(\"./mixed\").FoldMode;\nvar XmlFoldMode = require(\"./xml\").FoldMode;\nvar CStyleFoldMode = require(\"./cstyle\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalTags) {\n    MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), {\n        \"js-\": new CStyleFoldMode(),\n        \"css-\": new CStyleFoldMode()\n    });\n};\n\noop.inherits(FoldMode, MixedFoldMode);\n\n});\n\nace.define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\n\nvar commonAttributes = [\n    \"accesskey\",\n    \"class\",\n    \"contenteditable\",\n    \"contextmenu\",\n    \"dir\",\n    \"draggable\",\n    \"dropzone\",\n    \"hidden\",\n    \"id\",\n    \"inert\",\n    \"itemid\",\n    \"itemprop\",\n    \"itemref\",\n    \"itemscope\",\n    \"itemtype\",\n    \"lang\",\n    \"spellcheck\",\n    \"style\",\n    \"tabindex\",\n    \"title\",\n    \"translate\"\n];\n\nvar eventAttributes = [\n    \"onabort\",\n    \"onblur\",\n    \"oncancel\",\n    \"oncanplay\",\n    \"oncanplaythrough\",\n    \"onchange\",\n    \"onclick\",\n    \"onclose\",\n    \"oncontextmenu\",\n    \"oncuechange\",\n    \"ondblclick\",\n    \"ondrag\",\n    \"ondragend\",\n    \"ondragenter\",\n    \"ondragleave\",\n    \"ondragover\",\n    \"ondragstart\",\n    \"ondrop\",\n    \"ondurationchange\",\n    \"onemptied\",\n    \"onended\",\n    \"onerror\",\n    \"onfocus\",\n    \"oninput\",\n    \"oninvalid\",\n    \"onkeydown\",\n    \"onkeypress\",\n    \"onkeyup\",\n    \"onload\",\n    \"onloadeddata\",\n    \"onloadedmetadata\",\n    \"onloadstart\",\n    \"onmousedown\",\n    \"onmousemove\",\n    \"onmouseout\",\n    \"onmouseover\",\n    \"onmouseup\",\n    \"onmousewheel\",\n    \"onpause\",\n    \"onplay\",\n    \"onplaying\",\n    \"onprogress\",\n    \"onratechange\",\n    \"onreset\",\n    \"onscroll\",\n    \"onseeked\",\n    \"onseeking\",\n    \"onselect\",\n    \"onshow\",\n    \"onstalled\",\n    \"onsubmit\",\n    \"onsuspend\",\n    \"ontimeupdate\",\n    \"onvolumechange\",\n    \"onwaiting\"\n];\n\nvar globalAttributes = commonAttributes.concat(eventAttributes);\n\nvar attributeMap = {\n    \"html\": [\"manifest\"],\n    \"head\": [],\n    \"title\": [],\n    \"base\": [\"href\", \"target\"],\n    \"link\": [\"href\", \"hreflang\", \"rel\", \"media\", \"type\", \"sizes\"],\n    \"meta\": [\"http-equiv\", \"name\", \"content\", \"charset\"],\n    \"style\": [\"type\", \"media\", \"scoped\"],\n    \"script\": [\"charset\", \"type\", \"src\", \"defer\", \"async\"],\n    \"noscript\": [\"href\"],\n    \"body\": [\"onafterprint\", \"onbeforeprint\", \"onbeforeunload\", \"onhashchange\", \"onmessage\", \"onoffline\", \"onpopstate\", \"onredo\", \"onresize\", \"onstorage\", \"onundo\", \"onunload\"],\n    \"section\": [],\n    \"nav\": [],\n    \"article\": [\"pubdate\"],\n    \"aside\": [],\n    \"h1\": [],\n    \"h2\": [],\n    \"h3\": [],\n    \"h4\": [],\n    \"h5\": [],\n    \"h6\": [],\n    \"header\": [],\n    \"footer\": [],\n    \"address\": [],\n    \"main\": [],\n    \"p\": [],\n    \"hr\": [],\n    \"pre\": [],\n    \"blockquote\": [\"cite\"],\n    \"ol\": [\"start\", \"reversed\"],\n    \"ul\": [],\n    \"li\": [\"value\"],\n    \"dl\": [],\n    \"dt\": [],\n    \"dd\": [],\n    \"figure\": [],\n    \"figcaption\": [],\n    \"div\": [],\n    \"a\": [\"href\", \"target\", \"ping\", \"rel\", \"media\", \"hreflang\", \"type\"],\n    \"em\": [],\n    \"strong\": [],\n    \"small\": [],\n    \"s\": [],\n    \"cite\": [],\n    \"q\": [\"cite\"],\n    \"dfn\": [],\n    \"abbr\": [],\n    \"data\": [],\n    \"time\": [\"datetime\"],\n    \"code\": [],\n    \"var\": [],\n    \"samp\": [],\n    \"kbd\": [],\n    \"sub\": [],\n    \"sup\": [],\n    \"i\": [],\n    \"b\": [],\n    \"u\": [],\n    \"mark\": [],\n    \"ruby\": [],\n    \"rt\": [],\n    \"rp\": [],\n    \"bdi\": [],\n    \"bdo\": [],\n    \"span\": [],\n    \"br\": [],\n    \"wbr\": [],\n    \"ins\": [\"cite\", \"datetime\"],\n    \"del\": [\"cite\", \"datetime\"],\n    \"img\": [\"alt\", \"src\", \"height\", \"width\", \"usemap\", \"ismap\"],\n    \"iframe\": [\"name\", \"src\", \"height\", \"width\", \"sandbox\", \"seamless\"],\n    \"embed\": [\"src\", \"height\", \"width\", \"type\"],\n    \"object\": [\"param\", \"data\", \"type\", \"height\" , \"width\", \"usemap\", \"name\", \"form\", \"classid\"],\n    \"param\": [\"name\", \"value\"],\n    \"video\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\", \"width\", \"height\", \"poster\"],\n    \"audio\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\"],\n    \"source\": [\"src\", \"type\", \"media\"],\n    \"track\": [\"kind\", \"src\", \"srclang\", \"label\", \"default\"],\n    \"canvas\": [\"width\", \"height\"],\n    \"map\": [\"name\"],\n    \"area\": [\"shape\", \"coords\", \"href\", \"hreflang\", \"alt\", \"target\", \"media\", \"rel\", \"ping\", \"type\"],\n    \"svg\": [],\n    \"math\": [],\n    \"table\": [\"summary\"],\n    \"caption\": [],\n    \"colgroup\": [\"span\"],\n    \"col\": [\"span\"],\n    \"tbody\": [],\n    \"thead\": [],\n    \"tfoot\": [],\n    \"tr\": [],\n    \"td\": [\"headers\", \"rowspan\", \"colspan\"],\n    \"th\": [\"headers\", \"rowspan\", \"colspan\", \"scope\"],\n    \"form\": [\"accept-charset\", \"action\", \"autocomplete\", \"enctype\", \"method\", \"name\", \"novalidate\", \"target\"],\n    \"fieldset\": [\"disabled\", \"form\", \"name\"],\n    \"legend\": [],\n    \"label\": [\"form\", \"for\"],\n    \"input\": [\"type\", \"accept\", \"alt\", \"autocomplete\", \"checked\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"height\", \"list\", \"max\", \"maxlength\", \"min\", \"multiple\", \"pattern\", \"placeholder\", \"readonly\", \"required\", \"size\", \"src\", \"step\", \"width\", \"files\", \"value\"],\n    \"button\": [\"autofocus\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"name\", \"value\", \"type\"],\n    \"select\": [\"autofocus\", \"disabled\", \"form\", \"multiple\", \"name\", \"size\"],\n    \"datalist\": [],\n    \"optgroup\": [\"disabled\", \"label\"],\n    \"option\": [\"disabled\", \"selected\", \"label\", \"value\"],\n    \"textarea\": [\"autofocus\", \"disabled\", \"form\", \"maxlength\", \"name\", \"placeholder\", \"readonly\", \"required\", \"rows\", \"cols\", \"wrap\"],\n    \"keygen\": [\"autofocus\", \"challenge\", \"disabled\", \"form\", \"keytype\", \"name\"],\n    \"output\": [\"for\", \"form\", \"name\"],\n    \"progress\": [\"value\", \"max\"],\n    \"meter\": [\"value\", \"min\", \"max\", \"low\", \"high\", \"optimum\"],\n    \"details\": [\"open\"],\n    \"summary\": [],\n    \"command\": [\"type\", \"label\", \"icon\", \"disabled\", \"checked\", \"radiogroup\", \"command\"],\n    \"menu\": [\"type\", \"label\"],\n    \"dialog\": [\"open\"]\n};\n\nvar elements = Object.keys(attributeMap);\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nfunction findTagName(session, pos) {\n    var iterator = new TokenIterator(session, pos.row, pos.column);\n    var token = iterator.getCurrentToken();\n    while (token && !is(token, \"tag-name\")){\n        token = iterator.stepBackward();\n    }\n    if (token)\n        return token.value;\n}\n\nvar HtmlCompletions = function() {\n\n};\n\n(function() {\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        var token = session.getTokenAt(pos.row, pos.column);\n\n        if (!token)\n            return [];\n        if (is(token, \"tag-name\") || is(token, \"tag-open\") || is(token, \"end-tag-open\"))\n            return this.getTagCompletions(state, session, pos, prefix);\n        if (is(token, \"tag-whitespace\") || is(token, \"attribute-name\"))\n            return this.getAttributeCompetions(state, session, pos, prefix);\n\n        return [];\n    };\n\n    this.getTagCompletions = function(state, session, pos, prefix) {\n        return elements.map(function(element){\n            return {\n                value: element,\n                meta: \"tag\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n    this.getAttributeCompetions = function(state, session, pos, prefix) {\n        var tagName = findTagName(session, pos);\n        if (!tagName)\n            return [];\n        var attributes = globalAttributes;\n        if (tagName in attributeMap) {\n            attributes = attributes.concat(attributeMap[tagName]);\n        }\n        return attributes.map(function(attribute){\n            return {\n                caption: attribute,\n                snippet: attribute + '=\"$0\"',\n                meta: \"attribute\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n}).call(HtmlCompletions.prototype);\n\nexports.HtmlCompletions = HtmlCompletions;\n});\n\nace.define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar HtmlFoldMode = require(\"./folding/html\").FoldMode;\nvar HtmlCompletions = require(\"./html_completions\").HtmlCompletions;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar voidElements = [\"area\", \"base\", \"br\", \"col\", \"embed\", \"hr\", \"img\", \"input\", \"keygen\", \"link\", \"meta\", \"menuitem\", \"param\", \"source\", \"track\", \"wbr\"];\nvar optionalEndTags = [\"li\", \"dt\", \"dd\", \"p\", \"rt\", \"rp\", \"optgroup\", \"option\", \"colgroup\", \"td\", \"th\"];\n\nvar Mode = function(options) {\n    this.fragmentContext = options && options.fragmentContext;\n    this.HighlightRules = HtmlHighlightRules;\n    this.$behaviour = new XmlBehaviour();\n    this.$completer = new HtmlCompletions();\n    \n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"css-\": CssMode\n    });\n    \n    this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags));\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n    this.voidElements = lang.arrayToMap(voidElements);\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        return this.$completer.getCompletions(state, session, pos, prefix);\n    };\n\n    this.createWorker = function(session) {\n        if (this.constructor != Mode)\n            return;\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/html_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        if (this.fragmentContext)\n            worker.call(\"setOptions\", [{context: this.fragmentContext}]);\n\n        worker.on(\"error\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/html\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/coldfusion_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/html_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\n\nvar ColdfusionHighlightRules = function() {\n    HtmlHighlightRules.call(this);\n\n    this.embedTagRules(JavaScriptHighlightRules, \"cfjs-\", \"cfscript\");\n\n    this.normalizeRules();\n};\n\noop.inherits(ColdfusionHighlightRules, HtmlHighlightRules);\n\nexports.ColdfusionHighlightRules = ColdfusionHighlightRules;\n});\n\nace.define(\"ace/mode/coldfusion\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/html\",\"ace/mode/coldfusion_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar HtmlMode = require(\"./html\").Mode;\nvar ColdfusionHighlightRules = require(\"./coldfusion_highlight_rules\").ColdfusionHighlightRules;\n\nvar voidElements = \"cfabort|cfapplication|cfargument|cfassociate|cfbreak|cfcache|cfcollection|cfcookie|cfdbinfo|cfdirectory|cfdump|cfelse|cfelseif|cferror|cfexchangecalendar|cfexchangeconnection|cfexchangecontact|cfexchangefilter|cfexchangetask|cfexit|cffeed|cffile|cfflush|cfftp|cfheader|cfhtmlhead|cfhttpparam|cfimage|cfimport|cfinclude|cfindex|cfinsert|cfinvokeargument|cflocation|cflog|cfmailparam|cfNTauthenticate|cfobject|cfobjectcache|cfparam|cfpdfformparam|cfprint|cfprocparam|cfprocresult|cfproperty|cfqueryparam|cfregistry|cfreportparam|cfrethrow|cfreturn|cfschedule|cfsearch|cfset|cfsetting|cfthrow|cfzipparam)\".split(\"|\");\n\nvar Mode = function() {\n    HtmlMode.call(this);\n    \n    this.HighlightRules = ColdfusionHighlightRules;\n};\noop.inherits(Mode, HtmlMode);\n\n(function() {\n    this.voidElements = oop.mixin(lang.arrayToMap(voidElements), this.voidElements);\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.$id = \"ace/mode/coldfusion\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-csharp.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/csharp_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar CSharpHighlightRules = function() {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": \"this\",\n        \"keyword\": \"abstract|event|new|struct|as|explicit|null|switch|base|extern|object|this|bool|false|operator|throw|break|finally|out|true|byte|fixed|override|try|case|float|params|typeof|catch|for|private|uint|char|foreach|protected|ulong|checked|goto|public|unchecked|class|if|readonly|unsafe|const|implicit|ref|ushort|continue|in|return|using|decimal|int|sbyte|virtual|default|interface|sealed|volatile|delegate|internal|short|void|do|is|sizeof|while|double|lock|stackalloc|else|long|static|enum|namespace|string|var|dynamic\",\n        \"constant.language\": \"null|true|false\"\n    }, \"identifier\");\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // character\n                regex : /'(?:.|\\\\(:?u[\\da-fA-F]+|x[\\da-fA-F]+|[tbrf'\"n]))'/\n            }, {\n                token : \"string\", start : '\"', end : '\"|$', next: [\n                    {token: \"constant.language.escape\", regex: /\\\\(:?u[\\da-fA-F]+|x[\\da-fA-F]+|[tbrf'\"n])/},\n                    {token: \"invalid\", regex: /\\\\./}\n                ]\n            }, {\n                token : \"string\", start : '@\"', end : '\"', next:[\n                    {token: \"constant.language.escape\", regex: '\"\"'}\n                ]\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"\n            }, {\n                token : \"keyword\",\n                regex : \"^\\\\s*#(if|else|elif|endif|define|undef|warning|error|line|region|endregion|pragma)\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : \"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n    this.normalizeRules();\n};\n\noop.inherits(CSharpHighlightRules, TextHighlightRules);\n\nexports.CSharpHighlightRules = CSharpHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/csharp\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar CFoldMode = require(\"./cstyle\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, CFoldMode);\n\n(function() {\n    this.usingRe = /^\\s*using \\S/;\n\n    this.getFoldWidgetRangeBase = this.getFoldWidgetRange;\n    this.getFoldWidgetBase = this.getFoldWidget;\n    \n    this.getFoldWidget = function(session, foldStyle, row) {\n        var fw = this.getFoldWidgetBase(session, foldStyle, row);\n        if (!fw) {\n            var line = session.getLine(row);\n            if (/^\\s*#region\\b/.test(line)) \n                return \"start\";\n            var usingRe = this.usingRe;\n            if (usingRe.test(line)) {\n                var prev = session.getLine(row - 1);\n                var next = session.getLine(row + 1);\n                if (!usingRe.test(prev) && usingRe.test(next))\n                    return \"start\"\n            }\n        }\n        return fw;\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var range = this.getFoldWidgetRangeBase(session, foldStyle, row);\n        if (range)\n            return range;\n\n        var line = session.getLine(row);\n        if (this.usingRe.test(line))\n            return this.getUsingStatementBlock(session, line, row);\n            \n        if (/^\\s*#region\\b/.test(line))\n            return this.getRegionBlock(session, line, row);\n    };\n    \n    this.getUsingStatementBlock = function(session, line, row) {\n        var startColumn = line.match(this.usingRe)[0].length - 1;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            if (/^\\s*$/.test(line))\n                continue;\n            if (!this.usingRe.test(line))\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n    \n    this.getRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m)\n                continue;\n            if (m[1])\n                depth--;\n            else\n                depth++;\n\n            if (!depth)\n                break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/csharp\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/csharp_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/csharp\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar CSharpHighlightRules = require(\"./csharp_highlight_rules\").CSharpHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/csharp\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = CSharpHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    \n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n    \n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n  \n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n  \n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n    \n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n  \n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n  \n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n\n    this.createWorker = function(session) {\n        return null;\n    };\n\n    this.$id = \"ace/mode/csharp\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-css.js",
    "content": "ace.define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar CssBehaviour = function () {\n\n    this.inherit(CstyleBehaviour);\n\n    this.add(\"colon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(cursor.row);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                if (rightChar === ':') {\n                    return {\n                       text: '',\n                       selection: [1, 1]\n                    }\n                }\n                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n                    return {\n                       text: ':;',\n                       selection: [1, 1]\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"colon\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(range.start.row);\n                var rightChar = line.substring(range.end.column, range.end.column + 1);\n                if (rightChar === ';') {\n                    range.end.column ++;\n                    return range;\n                }\n            }\n        }\n    });\n\n    this.add(\"semicolon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ';') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === ';') {\n                return {\n                   text: '',\n                   selection: [1, 1]\n                }\n            }\n        }\n    });\n\n}\noop.inherits(CssBehaviour, CstyleBehaviour);\n\nexports.CssBehaviour = CssBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CssBehaviour = require(\"./behaviour/css\").CssBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = CssHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CssBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"csslint\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/css\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-curly.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\nace.define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar CssBehaviour = function () {\n\n    this.inherit(CstyleBehaviour);\n\n    this.add(\"colon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(cursor.row);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                if (rightChar === ':') {\n                    return {\n                       text: '',\n                       selection: [1, 1]\n                    }\n                }\n                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n                    return {\n                       text: ':;',\n                       selection: [1, 1]\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"colon\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(range.start.row);\n                var rightChar = line.substring(range.end.column, range.end.column + 1);\n                if (rightChar === ';') {\n                    range.end.column ++;\n                    return range;\n                }\n            }\n        }\n    });\n\n    this.add(\"semicolon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ';') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === ';') {\n                return {\n                   text: '',\n                   selection: [1, 1]\n                }\n            }\n        }\n    });\n\n}\noop.inherits(CssBehaviour, CstyleBehaviour);\n\nexports.CssBehaviour = CssBehaviour;\n});\n\nace.define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CssBehaviour = require(\"./behaviour/css\").CssBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = CssHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CssBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"csslint\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/css\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\nace.define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"string.cdata.xml\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.xml-decl.xml\", \"keyword.xml-decl.xml\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_decl\", caseInsensitive: true\n            },\n            {\n                token : [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"processing_instruction\",\n            },\n            {token : \"comment.xml\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\", caseInsensitive: true\n            },\n            {include : \"tag\"},\n            {token : \"text.end-tag-open.xml\", regex: \"</\"},\n            {token : \"text.tag-open.xml\", regex: \"<\"},\n            {include : \"reference\"},\n            {defaultToken : \"text.xml\"}\n        ],\n\n        xml_decl : [{\n            token : \"entity.other.attribute-name.decl-attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.decl-attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"whitespace\"\n        }, {\n            include: \"string\"\n        }, {\n            token : \"punctuation.xml-decl.xml\",\n            regex : \"\\\\?>\",\n            next : \"start\"\n        }],\n\n        processing_instruction : [\n            {token : \"punctuation.instruction.xml\", regex : \"\\\\?>\", next : \"start\"},\n            {defaultToken : \"instruction.xml\"}\n        ],\n\n        doctype : [\n            {include : \"whitespace\"},\n            {include : \"string\"},\n            {token : \"xml-pe.doctype.xml\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe.xml\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.int-subset\", regex : \"\\\\[\", push : \"int_subset\"}\n        ],\n\n        int_subset : [{\n            token : \"text.xml\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.int-subset.xml\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.markup-decl.xml\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.cdata.xml\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text.xml\", regex : \"\\\\s+\"},\n            {token : \"text.xml\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment.xml\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment.xml\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape.reference.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        attr_reference : [{\n            token : \"constant.language.escape.reference.attribute-value.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n            regex : \"(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n            ]\n        }],\n\n        tag_whitespace : [\n            {token : \"text.tag-whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        whitespace : [\n            {token : \"text.whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        string: [{\n            token : \"string.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.xml\", regex: \"'\", next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }, {\n            token : \"string.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.xml\", regex: '\"', next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }],\n\n        attributes: [{\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"tag_whitespace\"\n        }, {\n            include: \"attribute_value\"\n        }],\n\n        attribute_value: [{\n            token : \"string.attribute-value.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }, {\n            token : \"string.attribute-value.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\nace.define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    option      : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.addRules({\n        attributes: [{\n            include : \"tag_whitespace\"\n        }, {\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\",\n            push : [{\n                include: \"tag_whitespace\"\n            }, {\n                token : \"string.unquoted.attribute-value.html\",\n                regex : \"[^<>='\\\"`\\\\s]+\",\n                next : \"pop\"\n            }, {\n                token : \"empty\",\n                regex : \"\",\n                next : \"pop\"\n            }]\n        }, {\n            include : \"attribute_value\"\n        }],\n        tag: [{\n            token : function(start, tag) {\n                var group = tagMap[tag];\n                return [\"meta.tag.punctuation.\" + (start == \"<\" ? \"\" : \"end-\") + \"tag-open.xml\",\n                    \"meta.tag\" + (group ? \".\" + group : \"\") + \".tag-name.xml\"];\n            },\n            regex : \"(</?)([-_a-zA-Z0-9:]+)\",\n            next: \"tag_stuff\"\n        }],\n        tag_stuff: [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n        ],\n    });\n\n    this.embedTagRules(CssHighlightRules, \"css-\", \"style\");\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    if (this.constructor === HtmlHighlightRules)\n        this.normalizeRules();\n};\n\noop.inherits(HtmlHighlightRules, XmlHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nvar XmlBehaviour = function () {\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selected = session.doc.getTextRange(editor.getSelectionRange());\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            }\n\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (rightChar == quote && (is(token, \"attribute-value\") || is(token, \"string\"))) {\n                return {\n                    text: \"\",\n                    selection: [1, 1]\n                };\n            }\n\n            if (!token)\n                token = iterator.stepBackward();\n\n            if (!token)\n                return;\n\n            while (is(token, \"tag-whitespace\") || is(token, \"whitespace\")) {\n                token = iterator.stepBackward();\n            }\n            var rightSpace = !rightChar || rightChar.match(/\\s/);\n            if (is(token, \"attribute-equals\") && (rightSpace || rightChar == '>') || (is(token, \"decl-attribute-equals\") && (rightSpace || rightChar == '?'))) {\n                return {\n                    text: quote + quote,\n                    selection: [1, 1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken() || iterator.stepBackward();\n            if (!token || !(is(token, \"tag-name\") || is(token, \"tag-whitespace\") || is(token, \"attribute-name\") || is(token, \"attribute-equals\") || is(token, \"attribute-value\")))\n                return;\n            if (is(token, \"reference.attribute-value\"))\n                return;\n            if (is(token, \"attribute-value\")) {\n                var firstChar = token.value.charAt(0);\n                if (firstChar == '\"' || firstChar == \"'\") {\n                    var lastChar = token.value.charAt(token.value.length - 1);\n                    var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length;\n                    if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar)\n                        return;\n                }\n            }\n            while (!is(token, \"tag-name\")) {\n                token = iterator.stepBackward();\n            }\n\n            var tokenRow = iterator.getCurrentTokenRow();\n            var tokenColumn = iterator.getCurrentTokenColumn();\n            if (is(iterator.stepBackward(), \"end-tag-open\"))\n                return;\n\n            var element = token.value;\n            if (tokenRow == position.row)\n                element = element.substring(0, position.column - tokenColumn);\n\n            if (this.voidElements.hasOwnProperty(element.toLowerCase()))\n                 return;\n\n            return {\n               text: \">\" + \"</\" + element + \">\",\n               selection: [1, 1]\n            };\n        }\n    });\n\n    this.add(\"autoindent\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.getLine(cursor.row);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (token && token.type.indexOf(\"tag-close\") !== -1) {\n                while (token && token.type.indexOf(\"tag-name\") === -1) {\n                    token = iterator.stepBackward();\n                }\n\n                if (!token) {\n                    return;\n                }\n\n                var tag = token.value;\n                var row = iterator.getCurrentTokenRow();\n                token = iterator.stepBackward();\n                if (!token || token.type.indexOf(\"end-tag\") !== -1) {\n                    return;\n                }\n\n                if (this.voidElements && !this.voidElements[tag]) {\n                    var nextToken = session.getTokenAt(cursor.row, cursor.column+1);\n                    var line = session.getLine(row);\n                    var nextIndent = this.$getIndent(line);\n                    var indent = nextIndent + session.getTabString();\n\n                    if (nextToken && nextToken.value === \"</\") {\n                        return {\n                            text: \"\\n\" + indent + \"\\n\" + nextIndent,\n                            selection: [1, indent.length, 1, indent.length]\n                        };\n                    } else {\n                        return {\n                            text: \"\\n\" + indent\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n};\n\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\nace.define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n    this.defaultMode = defaultMode;\n    this.subModes = subModes;\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n\n    this.$getMode = function(state) {\n        if (typeof state != \"string\") \n            state = state[0];\n        for (var key in this.subModes) {\n            if (state.indexOf(key) === 0)\n                return this.subModes[key];\n        }\n        return null;\n    };\n    \n    this.$tryMode = function(state, session, foldStyle, row) {\n        var mode = this.$getMode(state);\n        return (mode ? mode.getFoldWidget(session, foldStyle, row) : \"\");\n    };\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        return (\n            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n            this.defaultMode.getFoldWidget(session, foldStyle, row)\n        );\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var mode = this.$getMode(session.getState(row-1));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.$getMode(session.getState(row));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.defaultMode;\n        \n        return mode.getFoldWidgetRange(session, foldStyle, row);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalEndTags) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n    this.optionalEndTags = oop.mixin({}, this.voidElements);\n    if (optionalEndTags)\n        oop.mixin(this.optionalEndTags, optionalEndTags);\n    \n};\noop.inherits(FoldMode, BaseFoldMode);\n\nvar Tag = function() {\n    this.tagName = \"\";\n    this.closing = false;\n    this.selfClosing = false;\n    this.start = {row: 0, column: 0};\n    this.end = {row: 0, column: 0};\n};\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (!tag)\n            return \"\";\n\n        if (tag.closing || (!tag.tagName && tag.selfClosing))\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase()))\n            return \"\";\n\n        if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column))\n            return \"\";\n\n        return \"start\";\n    };\n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var tag = new Tag();\n\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (is(token, \"tag-open\")) {\n                tag.end.column = tag.start.column + token.value.length;\n                tag.closing = is(token, \"end-tag-open\");\n                token = tokens[++i];\n                if (!token)\n                    return null;\n                tag.tagName = token.value;\n                tag.end.column += token.value.length;\n                for (i++; i < tokens.length; i++) {\n                    token = tokens[i];\n                    tag.end.column += token.value.length;\n                    if (is(token, \"tag-close\")) {\n                        tag.selfClosing = token.value == '/>';\n                        break;\n                    }\n                }\n                return tag;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == '/>';\n                return tag;\n            }\n            tag.start.column += token.value.length;\n        }\n\n        return null;\n    };\n\n    this._findEndTagInLine = function(session, row, tagName, startColumn) {\n        var tokens = session.getTokens(row);\n        var column = 0;\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            column += token.value.length;\n            if (column < startColumn)\n                continue;\n            if (is(token, \"end-tag-open\")) {\n                token = tokens[i + 1];\n                if (token && token.value == tagName)\n                    return true;\n            }\n        }\n        return false;\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n                iterator.stepForward();\n                return tag;\n            }\n        } while(token = iterator.stepForward());\n\n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n                iterator.stepBackward();\n                return tag;\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n            }\n        } while(token = iterator.stepBackward());\n\n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.optionalEndTags.hasOwnProperty(top.tagName)) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.start.column);\n            var start = {\n                row: row,\n                column: firstTag.start.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.end.column);\n            var end = {\n                row: row,\n                column: firstTag.start.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar MixedFoldMode = require(\"./mixed\").FoldMode;\nvar XmlFoldMode = require(\"./xml\").FoldMode;\nvar CStyleFoldMode = require(\"./cstyle\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalTags) {\n    MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), {\n        \"js-\": new CStyleFoldMode(),\n        \"css-\": new CStyleFoldMode()\n    });\n};\n\noop.inherits(FoldMode, MixedFoldMode);\n\n});\n\nace.define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\n\nvar commonAttributes = [\n    \"accesskey\",\n    \"class\",\n    \"contenteditable\",\n    \"contextmenu\",\n    \"dir\",\n    \"draggable\",\n    \"dropzone\",\n    \"hidden\",\n    \"id\",\n    \"inert\",\n    \"itemid\",\n    \"itemprop\",\n    \"itemref\",\n    \"itemscope\",\n    \"itemtype\",\n    \"lang\",\n    \"spellcheck\",\n    \"style\",\n    \"tabindex\",\n    \"title\",\n    \"translate\"\n];\n\nvar eventAttributes = [\n    \"onabort\",\n    \"onblur\",\n    \"oncancel\",\n    \"oncanplay\",\n    \"oncanplaythrough\",\n    \"onchange\",\n    \"onclick\",\n    \"onclose\",\n    \"oncontextmenu\",\n    \"oncuechange\",\n    \"ondblclick\",\n    \"ondrag\",\n    \"ondragend\",\n    \"ondragenter\",\n    \"ondragleave\",\n    \"ondragover\",\n    \"ondragstart\",\n    \"ondrop\",\n    \"ondurationchange\",\n    \"onemptied\",\n    \"onended\",\n    \"onerror\",\n    \"onfocus\",\n    \"oninput\",\n    \"oninvalid\",\n    \"onkeydown\",\n    \"onkeypress\",\n    \"onkeyup\",\n    \"onload\",\n    \"onloadeddata\",\n    \"onloadedmetadata\",\n    \"onloadstart\",\n    \"onmousedown\",\n    \"onmousemove\",\n    \"onmouseout\",\n    \"onmouseover\",\n    \"onmouseup\",\n    \"onmousewheel\",\n    \"onpause\",\n    \"onplay\",\n    \"onplaying\",\n    \"onprogress\",\n    \"onratechange\",\n    \"onreset\",\n    \"onscroll\",\n    \"onseeked\",\n    \"onseeking\",\n    \"onselect\",\n    \"onshow\",\n    \"onstalled\",\n    \"onsubmit\",\n    \"onsuspend\",\n    \"ontimeupdate\",\n    \"onvolumechange\",\n    \"onwaiting\"\n];\n\nvar globalAttributes = commonAttributes.concat(eventAttributes);\n\nvar attributeMap = {\n    \"html\": [\"manifest\"],\n    \"head\": [],\n    \"title\": [],\n    \"base\": [\"href\", \"target\"],\n    \"link\": [\"href\", \"hreflang\", \"rel\", \"media\", \"type\", \"sizes\"],\n    \"meta\": [\"http-equiv\", \"name\", \"content\", \"charset\"],\n    \"style\": [\"type\", \"media\", \"scoped\"],\n    \"script\": [\"charset\", \"type\", \"src\", \"defer\", \"async\"],\n    \"noscript\": [\"href\"],\n    \"body\": [\"onafterprint\", \"onbeforeprint\", \"onbeforeunload\", \"onhashchange\", \"onmessage\", \"onoffline\", \"onpopstate\", \"onredo\", \"onresize\", \"onstorage\", \"onundo\", \"onunload\"],\n    \"section\": [],\n    \"nav\": [],\n    \"article\": [\"pubdate\"],\n    \"aside\": [],\n    \"h1\": [],\n    \"h2\": [],\n    \"h3\": [],\n    \"h4\": [],\n    \"h5\": [],\n    \"h6\": [],\n    \"header\": [],\n    \"footer\": [],\n    \"address\": [],\n    \"main\": [],\n    \"p\": [],\n    \"hr\": [],\n    \"pre\": [],\n    \"blockquote\": [\"cite\"],\n    \"ol\": [\"start\", \"reversed\"],\n    \"ul\": [],\n    \"li\": [\"value\"],\n    \"dl\": [],\n    \"dt\": [],\n    \"dd\": [],\n    \"figure\": [],\n    \"figcaption\": [],\n    \"div\": [],\n    \"a\": [\"href\", \"target\", \"ping\", \"rel\", \"media\", \"hreflang\", \"type\"],\n    \"em\": [],\n    \"strong\": [],\n    \"small\": [],\n    \"s\": [],\n    \"cite\": [],\n    \"q\": [\"cite\"],\n    \"dfn\": [],\n    \"abbr\": [],\n    \"data\": [],\n    \"time\": [\"datetime\"],\n    \"code\": [],\n    \"var\": [],\n    \"samp\": [],\n    \"kbd\": [],\n    \"sub\": [],\n    \"sup\": [],\n    \"i\": [],\n    \"b\": [],\n    \"u\": [],\n    \"mark\": [],\n    \"ruby\": [],\n    \"rt\": [],\n    \"rp\": [],\n    \"bdi\": [],\n    \"bdo\": [],\n    \"span\": [],\n    \"br\": [],\n    \"wbr\": [],\n    \"ins\": [\"cite\", \"datetime\"],\n    \"del\": [\"cite\", \"datetime\"],\n    \"img\": [\"alt\", \"src\", \"height\", \"width\", \"usemap\", \"ismap\"],\n    \"iframe\": [\"name\", \"src\", \"height\", \"width\", \"sandbox\", \"seamless\"],\n    \"embed\": [\"src\", \"height\", \"width\", \"type\"],\n    \"object\": [\"param\", \"data\", \"type\", \"height\" , \"width\", \"usemap\", \"name\", \"form\", \"classid\"],\n    \"param\": [\"name\", \"value\"],\n    \"video\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\", \"width\", \"height\", \"poster\"],\n    \"audio\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\"],\n    \"source\": [\"src\", \"type\", \"media\"],\n    \"track\": [\"kind\", \"src\", \"srclang\", \"label\", \"default\"],\n    \"canvas\": [\"width\", \"height\"],\n    \"map\": [\"name\"],\n    \"area\": [\"shape\", \"coords\", \"href\", \"hreflang\", \"alt\", \"target\", \"media\", \"rel\", \"ping\", \"type\"],\n    \"svg\": [],\n    \"math\": [],\n    \"table\": [\"summary\"],\n    \"caption\": [],\n    \"colgroup\": [\"span\"],\n    \"col\": [\"span\"],\n    \"tbody\": [],\n    \"thead\": [],\n    \"tfoot\": [],\n    \"tr\": [],\n    \"td\": [\"headers\", \"rowspan\", \"colspan\"],\n    \"th\": [\"headers\", \"rowspan\", \"colspan\", \"scope\"],\n    \"form\": [\"accept-charset\", \"action\", \"autocomplete\", \"enctype\", \"method\", \"name\", \"novalidate\", \"target\"],\n    \"fieldset\": [\"disabled\", \"form\", \"name\"],\n    \"legend\": [],\n    \"label\": [\"form\", \"for\"],\n    \"input\": [\"type\", \"accept\", \"alt\", \"autocomplete\", \"checked\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"height\", \"list\", \"max\", \"maxlength\", \"min\", \"multiple\", \"pattern\", \"placeholder\", \"readonly\", \"required\", \"size\", \"src\", \"step\", \"width\", \"files\", \"value\"],\n    \"button\": [\"autofocus\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"name\", \"value\", \"type\"],\n    \"select\": [\"autofocus\", \"disabled\", \"form\", \"multiple\", \"name\", \"size\"],\n    \"datalist\": [],\n    \"optgroup\": [\"disabled\", \"label\"],\n    \"option\": [\"disabled\", \"selected\", \"label\", \"value\"],\n    \"textarea\": [\"autofocus\", \"disabled\", \"form\", \"maxlength\", \"name\", \"placeholder\", \"readonly\", \"required\", \"rows\", \"cols\", \"wrap\"],\n    \"keygen\": [\"autofocus\", \"challenge\", \"disabled\", \"form\", \"keytype\", \"name\"],\n    \"output\": [\"for\", \"form\", \"name\"],\n    \"progress\": [\"value\", \"max\"],\n    \"meter\": [\"value\", \"min\", \"max\", \"low\", \"high\", \"optimum\"],\n    \"details\": [\"open\"],\n    \"summary\": [],\n    \"command\": [\"type\", \"label\", \"icon\", \"disabled\", \"checked\", \"radiogroup\", \"command\"],\n    \"menu\": [\"type\", \"label\"],\n    \"dialog\": [\"open\"]\n};\n\nvar elements = Object.keys(attributeMap);\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nfunction findTagName(session, pos) {\n    var iterator = new TokenIterator(session, pos.row, pos.column);\n    var token = iterator.getCurrentToken();\n    while (token && !is(token, \"tag-name\")){\n        token = iterator.stepBackward();\n    }\n    if (token)\n        return token.value;\n}\n\nvar HtmlCompletions = function() {\n\n};\n\n(function() {\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        var token = session.getTokenAt(pos.row, pos.column);\n\n        if (!token)\n            return [];\n        if (is(token, \"tag-name\") || is(token, \"tag-open\") || is(token, \"end-tag-open\"))\n            return this.getTagCompletions(state, session, pos, prefix);\n        if (is(token, \"tag-whitespace\") || is(token, \"attribute-name\"))\n            return this.getAttributeCompetions(state, session, pos, prefix);\n\n        return [];\n    };\n\n    this.getTagCompletions = function(state, session, pos, prefix) {\n        return elements.map(function(element){\n            return {\n                value: element,\n                meta: \"tag\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n    this.getAttributeCompetions = function(state, session, pos, prefix) {\n        var tagName = findTagName(session, pos);\n        if (!tagName)\n            return [];\n        var attributes = globalAttributes;\n        if (tagName in attributeMap) {\n            attributes = attributes.concat(attributeMap[tagName]);\n        }\n        return attributes.map(function(attribute){\n            return {\n                caption: attribute,\n                snippet: attribute + '=\"$0\"',\n                meta: \"attribute\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n}).call(HtmlCompletions.prototype);\n\nexports.HtmlCompletions = HtmlCompletions;\n});\n\nace.define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar HtmlFoldMode = require(\"./folding/html\").FoldMode;\nvar HtmlCompletions = require(\"./html_completions\").HtmlCompletions;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar voidElements = [\"area\", \"base\", \"br\", \"col\", \"embed\", \"hr\", \"img\", \"input\", \"keygen\", \"link\", \"meta\", \"menuitem\", \"param\", \"source\", \"track\", \"wbr\"];\nvar optionalEndTags = [\"li\", \"dt\", \"dd\", \"p\", \"rt\", \"rp\", \"optgroup\", \"option\", \"colgroup\", \"td\", \"th\"];\n\nvar Mode = function(options) {\n    this.fragmentContext = options && options.fragmentContext;\n    this.HighlightRules = HtmlHighlightRules;\n    this.$behaviour = new XmlBehaviour();\n    this.$completer = new HtmlCompletions();\n    \n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"css-\": CssMode\n    });\n    \n    this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags));\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n    this.voidElements = lang.arrayToMap(voidElements);\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        return this.$completer.getCompletions(state, session, pos, prefix);\n    };\n\n    this.createWorker = function(session) {\n        if (this.constructor != Mode)\n            return;\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/html_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        if (this.fragmentContext)\n            worker.call(\"setOptions\", [{context: this.fragmentContext}]);\n\n        worker.on(\"error\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/html\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/curly_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\n\n\nvar CurlyHighlightRules = function() {\n    HtmlHighlightRules.call(this);\n\n    this.$rules[\"start\"].unshift({\n        token: \"variable\",\n        regex: \"{{\",\n        push: \"curly-start\"\n    });\n\n    this.$rules[\"curly-start\"] = [{\n        token: \"variable\",\n        regex: \"}}\",\n        next: \"pop\"\n    }];\n\n    this.normalizeRules();\n};\n\noop.inherits(CurlyHighlightRules, HtmlHighlightRules);\n\nexports.CurlyHighlightRules = CurlyHighlightRules;\n\n});\n\nace.define(\"ace/mode/curly\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html\",\"ace/mode/matching_brace_outdent\",\"ace/mode/html_highlight_rules\",\"ace/mode/folding/html\",\"ace/mode/curly_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar HtmlMode = require(\"./html\").Mode;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar HtmlFoldMode = require(\"./folding/html\").FoldMode;\nvar CurlyHighlightRules = require(\"./curly_highlight_rules\").CurlyHighlightRules;\n\nvar Mode = function() {\n    HtmlMode.call(this);\n    this.HighlightRules = CurlyHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.foldingRules = new HtmlFoldMode();\n};\noop.inherits(Mode, HtmlMode);\n\n(function() {\n    this.$id = \"ace/mode/curly\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-d.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/d_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DHighlightRules = function() {\n\n    var keywords = (\n        \"this|super|import|module|body|mixin|__traits|invariant|alias|asm|delete|\"+\n        \"typeof|typeid|sizeof|cast|new|in|is|typedef|__vector|__parameters\"\n    );\n\n    var keywordControls = (\n        \"break|case|continue|default|do|else|for|foreach|foreach_reverse|goto|if|\" +\n        \"return|switch|while|catch|try|throw|finally|version|assert|unittest|with\"\n    );\n    \n    var types = (\n        \"auto|bool|char|dchar|wchar|byte|ubyte|float|double|real|\" +\n        \"cfloat|creal|cdouble|cent|ifloat|ireal|idouble|\" +\n        \"int|long|short|void|uint|ulong|ushort|ucent|\" +\n        \"function|delegate|string|wstring|dstring|size_t|ptrdiff_t|hash_t|Object\"\n    );\n\n    var modifiers = (\n        \"abstract|align|debug|deprecated|export|extern|const|final|in|inout|out|\" +\n        \"ref|immutable|lazy|nothrow|override|package|pragma|private|protected|\" +\n        \"public|pure|scope|shared|__gshared|synchronized|static|volatile\"\n    );\n    \n    var storages = (\n        \"class|struct|union|template|interface|enum|macro\"\n    );\n    \n    var stringEscapesSeq =  {\n        token: \"constant.language.escape\",\n        regex: \"\\\\\\\\(?:(?:x[0-9A-F]{2})|(?:[0-7]{1,3})|(?:['\\\"\\\\?0abfnrtv\\\\\\\\])|\" +\n            \"(?:u[0-9a-fA-F]{4})|(?:U[0-9a-fA-F]{8}))\"\n    };\n\n    var builtinConstants = (\n        \"null|true|false|\"+\n        \"__DATE__|__EOF__|__TIME__|__TIMESTAMP__|__VENDOR__|__VERSION__|\"+\n        \"__FILE__|__MODULE__|__LINE__|__FUNCTION__|__PRETTY_FUNCTION__\"\n    );\n    \n    var operators = (\n        \"/|/\\\\=|&|&\\\\=|&&|\\\\|\\\\|\\\\=|\\\\|\\\\||\\\\-|\\\\-\\\\=|\\\\-\\\\-|\\\\+|\" +\n        \"\\\\+\\\\=|\\\\+\\\\+|\\\\<|\\\\<\\\\=|\\\\<\\\\<|\\\\<\\\\<\\\\=|\\\\<\\\\>|\\\\<\\\\>\\\\=|\\\\>|\\\\>\\\\=|\\\\>\\\\>\\\\=|\" +\n        \"\\\\>\\\\>\\\\>\\\\=|\\\\>\\\\>|\\\\>\\\\>\\\\>|\\\\!|\\\\!\\\\=|\\\\!\\\\<\\\\>|\\\\!\\\\<\\\\>\\\\=|\\\\!\\\\<|\\\\!\\\\<\\\\=|\" +\n        \"\\\\!\\\\>|\\\\!\\\\>\\\\=|\\\\?|\\\\$|\\\\=|\\\\=\\\\=|\\\\*|\\\\*\\\\=|%|%\\\\=|\" +\n        \"\\\\^|\\\\^\\\\=|\\\\^\\\\^|\\\\^\\\\^\\\\=|~|~\\\\=|\\\\=\\\\>|#\"\n    );\n\n    var keywordMapper = this.$keywords = this.createKeywordMapper({\n        \"keyword.modifier\" : modifiers,\n        \"keyword.control\" :  keywordControls,\n        \"keyword.type\" :     types,\n        \"keyword\":           keywords,\n        \"keyword.storage\":   storages,\n        \"punctation\": \"\\\\.|\\\\,|;|\\\\.\\\\.|\\\\.\\\\.\\\\.\",\n        \"keyword.operator\" : operators,\n        \"constant.language\": builtinConstants\n    }, \"identifier\");\n    \n    var identifierRe = \"[a-zA-Z_\\u00a1-\\uffff][a-zA-Z\\\\d_\\u00a1-\\uffff]*\\\\b\";\n\n    this.$rules = {\n        \"start\" : [\n            {     //-------------------------------------------------------- COMMENTS\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"star-comment\"\n            }, {\n                token: \"comment.shebang\",\n                regex: \"^\\s*#!.*\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\+\",\n                next: \"plus-comment\"\n            }, {  //-------------------------------------------------------- STRINGS\n                onMatch: function(value, currentState, state) {\n                    state.unshift(this.next, value.substr(2));\n                    return \"string\";\n                },\n                regex: 'q\"(?:[\\\\[\\\\(\\\\{\\\\<]+)',\n                next: 'operator-heredoc-string'\n            }, {\n                onMatch: function(value, currentState, state) {\n                    state.unshift(this.next, value.substr(2));\n                    return \"string\";\n                },\n                regex: 'q\"(?:[a-zA-Z_]+)$',\n                next: 'identifier-heredoc-string'\n            }, {\n                token : \"string\", // multi line string start\n                regex : '[xr]?\"',\n                next : \"quote-string\"\n            }, {\n                token : \"string\", // multi line string start\n                regex : '[xr]?`',\n                next : \"backtick-string\"\n            }, {\n                token : \"string\", // single line\n                regex : \"[xr]?['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?['][cdw]?\"\n            }, {  //-------------------------------------------------------- RULES\n                token: [\"keyword\", \"text\", \"paren.lparen\"],\n                regex: /(asm)(\\s*)({)/,\n                next: \"d-asm\"\n            }, {\n                token: [\"keyword\", \"text\", \"paren.lparen\", \"constant.language\"],\n                regex: \"(__traits)(\\\\s*)(\\\\()(\"+identifierRe+\")\"\n            }, { // import|module abc\n                token: [\"keyword\", \"text\", \"variable.module\"],\n                regex: \"(import|module)(\\\\s+)((?:\"+identifierRe+\"\\\\.?)*)\"\n            }, { // storage Name\n                token: [\"keyword.storage\", \"text\", \"entity.name.type\"],\n                regex: \"(\"+storages+\")(\\\\s*)(\"+identifierRe+\")\"\n            }, { // alias|typedef foo bar;\n                token: [\"keyword\", \"text\", \"variable.storage\", \"text\"],\n                regex: \"(alias|typedef)(\\\\s*)(\"+identifierRe+\")(\\\\s*)\"\n            }, {  //-------------------------------------------------------- OTHERS\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F_]+(l|ul|u|f|F|L|U|UL)?\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d[\\\\d_]*(?:(?:\\\\.[\\\\d_]*)?(?:[eE][+-]?[\\\\d_]+)?)?(l|ul|u|f|F|L|U|UL)?\\\\b\"\n            }, {\n                token: \"entity.other.attribute-name\",\n                regex: \"@\"+identifierRe\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_][a-zA-Z0-9_]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : operators\n            }, {\n                token : \"punctuation.operator\",\n                regex : \"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.|\\\\:\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"star-comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \"\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                defaultToken: 'comment'\n            }\n        ],\n        \"plus-comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \"\\\\+\\\\/\",\n                next : \"start\"\n            }, {\n                defaultToken: 'comment'\n            }\n        ],\n        \n        \"quote-string\" : [\n           stringEscapesSeq,\n           {\n                token : \"string\",\n                regex : '\"[cdw]?',\n                next : \"start\"\n            }, {\n                defaultToken: 'string'\n            }\n        ],\n        \n        \"backtick-string\" : [\n           stringEscapesSeq,\n           {\n                token : \"string\",\n                regex : '`[cdw]?',\n                next : \"start\"\n            }, {\n                defaultToken: 'string'\n            }\n        ],\n        \n        \"operator-heredoc-string\": [\n            {\n                onMatch: function(value, currentState, state) {\n                    value = value.substring(value.length-2, value.length-1);\n                    var map = {'>':'<',']':'[',')':'(','}':'{'};\n                    if(Object.keys(map).indexOf(value) != -1)\n                        value = map[value];\n                    if(value != state[1]) return \"string\";\n                    state.shift();\n                    state.shift();\n                    \n                    return \"string\";\n                },\n                regex: '(?:[\\\\]\\\\)}>]+)\"',\n                next: 'start'\n            }, {\n                token: 'string',\n                regex: '[^\\\\]\\\\)}>]+'\n            }\n        ],\n        \n        \"identifier-heredoc-string\": [\n            {\n                onMatch: function(value, currentState, state) {\n                    value = value.substring(0, value.length-1);\n                    if(value != state[1]) return \"string\";\n                    state.shift();\n                    state.shift();\n                    \n                    return \"string\";\n                },\n                regex: '^(?:[A-Za-z_][a-zA-Z0-9]+)\"',\n                next: 'start'\n            }, {\n                token: 'string',\n                regex: '[^\\\\]\\\\)}>]+'\n            }\n        ],\n        \n        \"d-asm\": [\n            {\n                token: \"paren.rparen\",\n                regex: \"\\\\}\",\n                next: \"start\"\n            }, {\n                token: 'keyword.instruction',\n                regex: '[a-zA-Z]+',\n                next: 'd-asm-instruction' \n            }, {\n                token: \"text\",\n                regex: \"\\\\s+\"\n            }\n        ],\n        'd-asm-instruction': [\n            {\n                token: 'constant.language',\n                regex: /AL|AH|AX|EAX|BL|BH|BX|EBX|CL|CH|CX|ECX|DL|DH|DX|EDX|BP|EBP|SP|ESP|DI|EDI|SI|ESI/i\n            }, {\n                token: 'identifier',\n                regex: '[a-zA-Z]+'\n            }, {\n                token: 'string',\n                regex: '\".*\"'\n            }, {\n                token: 'comment',\n                regex: '//.*$'\n            }, {\n                token: 'constant.numeric',\n                regex: '[0-9.xA-F]+'\n            }, {\n                token: 'punctuation.operator',\n                regex: '\\\\,'\n            }, {\n                token: 'punctuation.operator',\n                regex: ';',\n                next: 'd-asm'\n            }, {\n                token: 'text',\n                regex: '\\\\s+'\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\nDHighlightRules.metaData = {\n      comment: 'D language',\n      fileTypes: [ 'd', 'di' ],\n      firstLineMatch: '^#!.*\\\\b[glr]?dmd\\\\b.',\n      foldingStartMarker: '(?x)/\\\\*\\\\*(?!\\\\*)|^(?![^{]*?//|[^{]*?/\\\\*(?!.*?\\\\*/.*?\\\\{)).*?\\\\{\\\\s*($|//|/\\\\*(?!.*?\\\\*/.*\\\\S))',\n      foldingStopMarker: '(?<!\\\\*)\\\\*\\\\*/|^\\\\s*\\\\}',\n      keyEquivalent: '^~D',\n      name: 'D',\n      scopeName: 'source.d'\n};\noop.inherits(DHighlightRules, TextHighlightRules);\n\nexports.DHighlightRules = DHighlightRules;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/d\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/d_highlight_rules\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar DHighlightRules = require(\"./d_highlight_rules\").DHighlightRules;\nvar FoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = DHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n    this.$id = \"ace/mode/d\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-dart.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/c_cpp_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar cFunctions = exports.cFunctions = \"\\\\b(?:hypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len))))\\\\b\"\n\nvar c_cppHighlightRules = function() {\n\n    var keywordControls = (\n        \"break|case|continue|default|do|else|for|goto|if|_Pragma|\" +\n        \"return|switch|while|catch|operator|try|throw|using\"\n    );\n    \n    var storageType = (\n        \"asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|\" +\n        \"_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|\" +\n        \"class|wchar_t|template\"\n    );\n\n    var storageModifiers = (\n        \"const|extern|register|restrict|static|volatile|inline|private|\" +\n        \"protected|public|friend|explicit|virtual|export|mutable|typename|\" +\n        \"constexpr|new|delete\"\n    );\n\n    var keywordOperators = (\n        \"and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq\" +\n        \"const_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace\"\n    );\n\n    var builtinConstants = (\n        \"NULL|true|false|TRUE|FALSE\"\n    );\n\n    var keywordMapper = this.$keywords = this.createKeywordMapper({\n        \"keyword.control\" : keywordControls,\n        \"storage.type\" : storageType,\n        \"storage.modifier\" : storageModifiers,\n        \"keyword.operator\" : keywordOperators,\n        \"variable.language\": \"this\",\n        \"constant.language\": builtinConstants\n    }, \"identifier\");\n\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    this.$rules = { \n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"//\",\n                next : \"singleLineComment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                regex : '[\"].*\\\\\\\\$',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"string\", // multi line string start\n                regex : \"['].*\\\\\\\\$\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"\n            }, {\n                token : \"keyword\", // pre-compiler directives\n                regex : \"#\\\\s*(?:include|import|pragma|line|define|undef|if|ifdef|else|elif|ifndef)\\\\b\",\n                next  : \"directive\"\n            }, {\n                token : \"keyword\", // special case pre-compiler directive\n                regex : \"(?:#\\\\s*endif)\\\\b\"\n            }, {\n                token : \"support.function.C99.c\",\n                regex : cFunctions\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)\"\n            }, {\n              token : \"punctuation.operator\",\n              regex : \"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ],\n        \"singleLineComment\" : [\n            {\n                token : \"comment\",\n                regex : /\\\\$/,\n                next : \"singleLineComment\"\n            }, {\n                token : \"comment\",\n                regex : /$/,\n                next : \"start\"\n            }, {\n                defaultToken: \"comment\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n                next : \"start\"\n            }, {\n                defaultToken : \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n                next : \"start\"\n            }, {\n                defaultToken : \"string\"\n            }\n        ],\n        \"directive\" : [\n            {\n                token : \"constant.other.multiline\",\n                regex : /\\\\/\n            },\n            {\n                token : \"constant.other.multiline\",\n                regex : /.*\\\\/\n            },\n            {\n                token : \"constant.other\",\n                regex : \"\\\\s*<.+?>\",\n                next : \"start\"\n            },\n            {\n                token : \"constant.other\", // single line\n                regex : '\\\\s*[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]',\n                next : \"start\"\n            }, \n            {\n                token : \"constant.other\", // single line\n                regex : \"\\\\s*['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\",\n                next : \"start\"\n            },\n            {\n                token : \"constant.other\",\n                regex : /[^\\\\\\/]+/,\n                next : \"start\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(c_cppHighlightRules, TextHighlightRules);\n\nexports.c_cppHighlightRules = c_cppHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/c_cpp\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/c_cpp_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar c_cppHighlightRules = require(\"./c_cpp_highlight_rules\").c_cppHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = c_cppHighlightRules;\n\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/c_cpp\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/dart_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DartHighlightRules = function() {\n\n    var constantLanguage = \"true|false|null\";\n    var variableLanguage = \"this|super\";\n    var keywordControl = \"try|catch|finally|throw|rethrow|assert|break|case|continue|default|do|else|for|if|in|return|switch|while|new|deferred|async|await\";\n    var keywordDeclaration = \"abstract|class|extends|external|factory|implements|get|native|operator|set|typedef|with|enum\";\n    var storageModifier = \"static|final|const\";\n    var storageType = \"void|bool|num|int|double|dynamic|var|String\";\n\n    var keywordMapper = this.createKeywordMapper({\n        \"constant.language.dart\": constantLanguage,\n        \"variable.language.dart\": variableLanguage,\n        \"keyword.control.dart\": keywordControl,\n        \"keyword.declaration.dart\": keywordDeclaration,\n        \"storage.modifier.dart\": storageModifier,\n        \"storage.type.primitive.dart\": storageType\n    }, \"identifier\");\n\n    var stringfill = {\n        token : \"string\",\n        regex : \".+\"\n    };\n\n    this.$rules = \n        {\n    \"start\": [\n        {\n            token : \"comment\",\n            regex : /\\/\\/.*$/\n        },\n        DocCommentHighlightRules.getStartRule(\"doc-start\"),\n        {\n            token : \"comment\", // multi line comment\n            regex : /\\/\\*/,\n            next : \"comment\"\n        },\n        {\n            token: [\"meta.preprocessor.script.dart\"],\n            regex: \"^(#!.*)$\"\n        },\n        {\n            token: \"keyword.other.import.dart\",\n            regex: \"(?:\\\\b)(?:library|import|export|part|of|show|hide)(?:\\\\b)\"\n        },\n        {\n            token : [\"keyword.other.import.dart\", \"text\"],\n            regex : \"(?:\\\\b)(prefix)(\\\\s*:)\"\n        },\n        {\n            regex: \"\\\\bas\\\\b\",\n            token: \"keyword.cast.dart\"\n        },\n        {\n            regex: \"\\\\?|:\",\n            token: \"keyword.control.ternary.dart\"\n        },\n        {\n            regex: \"(?:\\\\b)(is\\\\!?)(?:\\\\b)\",\n            token: [\"keyword.operator.dart\"]\n        },\n        {\n            regex: \"(<<|>>>?|~|\\\\^|\\\\||&)\",\n            token: [\"keyword.operator.bitwise.dart\"]\n        },\n        {\n            regex: \"((?:&|\\\\^|\\\\||<<|>>>?)=)\",\n            token: [\"keyword.operator.assignment.bitwise.dart\"]\n        },\n        {\n            regex: \"(===?|!==?|<=?|>=?)\",\n            token: [\"keyword.operator.comparison.dart\"]\n        },\n        {\n            regex: \"((?:[+*/%-]|\\\\~)=)\",\n            token: [\"keyword.operator.assignment.arithmetic.dart\"]\n        },\n        {\n            regex: \"=\",\n            token: \"keyword.operator.assignment.dart\"\n        },\n        {\n            token : \"string\",\n            regex : \"'''\",\n            next : \"qdoc\"\n        }, \n        {\n            token : \"string\",\n            regex : '\"\"\"',\n            next : \"qqdoc\"\n        }, \n        {\n            token : \"string\",\n            regex : \"'\",\n            next : \"qstring\"\n        }, \n        {\n            token : \"string\",\n            regex : '\"',\n            next : \"qqstring\"\n        }, \n        {\n            regex: \"(\\\\-\\\\-|\\\\+\\\\+)\",\n            token: [\"keyword.operator.increment-decrement.dart\"]\n        },\n        {\n            regex: \"(\\\\-|\\\\+|\\\\*|\\\\/|\\\\~\\\\/|%)\",\n            token: [\"keyword.operator.arithmetic.dart\"]\n        },\n        {\n            regex: \"(!|&&|\\\\|\\\\|)\",\n            token: [\"keyword.operator.logical.dart\"]\n        },\n        {\n            token : \"constant.numeric\", // hex\n            regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n        }, \n        {\n            token : \"constant.numeric\", // float\n            regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n        }, \n        {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }\n    ],\n    \"comment\" : [\n        {\n            token : \"comment\", // closing comment\n            regex : \".*?\\\\*\\\\/\",\n            next : \"start\"\n        }, {\n            token : \"comment\", // comment spanning whole line\n            regex : \".+\"\n        }\n    ],\n    \"qdoc\" : [\n        {\n            token : \"string\",\n            regex : \".*?'''\",\n            next : \"start\"\n        }, stringfill],\n\n    \"qqdoc\" : [\n        {\n            token : \"string\",\n            regex : '.*?\"\"\"',\n            next : \"start\"\n        }, stringfill],\n\n    \"qstring\" : [\n        {\n            token : \"string\",\n            regex : \"[^\\\\\\\\']*(?:\\\\\\\\.[^\\\\\\\\']*)*'\",\n            next : \"start\"\n        }, stringfill],\n\n    \"qqstring\" : [\n        {\n            token : \"string\",\n            regex : '[^\\\\\\\\\"]*(?:\\\\\\\\.[^\\\\\\\\\"]*)*\"',\n            next : \"start\"\n        }, stringfill]\n}\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(DartHighlightRules, TextHighlightRules);\n\nexports.DartHighlightRules = DartHighlightRules;\n});\n\nace.define(\"ace/mode/dart\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/c_cpp\",\"ace/mode/dart_highlight_rules\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar CMode = require(\"./c_cpp\").Mode;\nvar DartHighlightRules = require(\"./dart_highlight_rules\").DartHighlightRules;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    CMode.call(this);\n    this.HighlightRules = DartHighlightRules;\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, CMode);\n\n(function() { \n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n    this.$id = \"ace/mode/dart\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-diff.js",
    "content": "ace.define(\"ace/mode/diff_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\r\n\"use strict\";\r\n\r\nvar oop = require(\"../lib/oop\");\r\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\r\n\r\nvar DiffHighlightRules = function() {\r\r\r\n\r\n    this.$rules = {\r\n        \"start\" : [{\r\n                regex: \"^(?:\\\\*{15}|={67}|-{3}|\\\\+{3})$\",\r\n                token: \"punctuation.definition.separator.diff\",\r\n                \"name\": \"keyword\"\r\n            }, { //diff.range.unified\r\n                regex: \"^(@@)(\\\\s*.+?\\\\s*)(@@)(.*)$\",\r\n                token: [\r\n                    \"constant\",\r\n                    \"constant.numeric\",\r\n                    \"constant\",\r\n                    \"comment.doc.tag\"\r\n                ]\r\n            }, { //diff.range.normal\r\n                regex: \"^(\\\\d+)([,\\\\d]+)(a|d|c)(\\\\d+)([,\\\\d]+)(.*)$\",\r\n                token: [\r\n                    \"constant.numeric\",\r\n                    \"punctuation.definition.range.diff\",\r\n                    \"constant.function\",\r\n                    \"constant.numeric\",\r\n                    \"punctuation.definition.range.diff\",\r\n                    \"invalid\"\r\n                ],\r\n                \"name\": \"meta.\"\r\n            }, {\r\n                regex: \"^(\\\\-{3}|\\\\+{3}|\\\\*{3})( .+)$\",\n                token: [\n                    \"constant.numeric\",\r\n                    \"meta.tag\"\r\n                ]\r\n            }, { // added\r\n                regex: \"^([!+>])(.*?)(\\\\s*)$\",\r\n                token: [\r\n                    \"support.constant\",\r\n                    \"text\",\r\n                    \"invalid\"\r\n                ]\r\n            }, { // removed\r\n                regex: \"^([<\\\\-])(.*?)(\\\\s*)$\",\r\n                token: [\r\n                    \"support.function\",\r\n                    \"string\",\r\n                    \"invalid\"\r\n                ]\r\n            }, {\r\n                regex: \"^(diff)(\\\\s+--\\\\w+)?(.+?)( .+)?$\",\r\n                token: [\"variable\", \"variable\", \"keyword\", \"variable\"]\r\n            }, {\r\n                regex: \"^Index.+$\",\r\n                token: \"variable\"\r\n            }, {\r\n                regex: \"^\\\\s+$\",\n                token: \"text\"\n            }, {\r\n                regex: \"\\\\s*$\",\n                token: \"invalid\"\n            }, {\n                defaultToken: \"invisible\",\n                caseInsensitive: true\n            }\r\n        ]\r\n    };\r\n};\r\n\r\noop.inherits(DiffHighlightRules, TextHighlightRules);\r\n\r\nexports.DiffHighlightRules = DiffHighlightRules;\r\n});\n\nace.define(\"ace/mode/folding/diff\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function(levels, flag) {\n\tthis.regExpList = levels;\n\tthis.flag = flag;\n\tthis.foldingStartMarker = RegExp(\"^(\" + levels.join(\"|\") + \")\", this.flag);\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var start = {row: row, column: line.length};\n\n        var regList = this.regExpList;\n        for (var i = 1; i <= regList.length; i++) {\n            var re = RegExp(\"^(\" + regList.slice(0, i).join(\"|\") + \")\", this.flag);\n            if (re.test(line))\n                break;\n        }\n\n        for (var l = session.getLength(); ++row < l; ) {\n            line = session.getLine(row);\n            if (re.test(line))\n                break;\n        }\n        if (row == start.row + 1)\n            return;\n        return  Range.fromPoints(start, {row: row - 1, column: line.length});\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/diff\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/diff_highlight_rules\",\"ace/mode/folding/diff\"], function(require, exports, module) {\r\n\"use strict\";\r\n\r\nvar oop = require(\"../lib/oop\");\r\nvar TextMode = require(\"./text\").Mode;\r\nvar HighlightRules = require(\"./diff_highlight_rules\").DiffHighlightRules;\r\nvar FoldMode = require(\"./folding/diff\").FoldMode;\r\n\r\nvar Mode = function() {\r\n    this.HighlightRules = HighlightRules;\r\n    this.foldingRules = new FoldMode([\"diff\", \"index\", \"\\\\+{3}\", \"@@|\\\\*{5}\"], \"i\");\n};\r\noop.inherits(Mode, TextMode);\r\n\r\n(function() {\r\n\r\n    this.$id = \"ace/mode/diff\";\n}).call(Mode.prototype);\r\n\r\nexports.Mode = Mode;\r\n\r\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-django.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\nace.define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar CssBehaviour = function () {\n\n    this.inherit(CstyleBehaviour);\n\n    this.add(\"colon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(cursor.row);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                if (rightChar === ':') {\n                    return {\n                       text: '',\n                       selection: [1, 1]\n                    }\n                }\n                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n                    return {\n                       text: ':;',\n                       selection: [1, 1]\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"colon\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(range.start.row);\n                var rightChar = line.substring(range.end.column, range.end.column + 1);\n                if (rightChar === ';') {\n                    range.end.column ++;\n                    return range;\n                }\n            }\n        }\n    });\n\n    this.add(\"semicolon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ';') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === ';') {\n                return {\n                   text: '',\n                   selection: [1, 1]\n                }\n            }\n        }\n    });\n\n}\noop.inherits(CssBehaviour, CstyleBehaviour);\n\nexports.CssBehaviour = CssBehaviour;\n});\n\nace.define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CssBehaviour = require(\"./behaviour/css\").CssBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = CssHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CssBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"csslint\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/css\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\nace.define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"string.cdata.xml\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.xml-decl.xml\", \"keyword.xml-decl.xml\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_decl\", caseInsensitive: true\n            },\n            {\n                token : [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"processing_instruction\",\n            },\n            {token : \"comment.xml\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\", caseInsensitive: true\n            },\n            {include : \"tag\"},\n            {token : \"text.end-tag-open.xml\", regex: \"</\"},\n            {token : \"text.tag-open.xml\", regex: \"<\"},\n            {include : \"reference\"},\n            {defaultToken : \"text.xml\"}\n        ],\n\n        xml_decl : [{\n            token : \"entity.other.attribute-name.decl-attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.decl-attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"whitespace\"\n        }, {\n            include: \"string\"\n        }, {\n            token : \"punctuation.xml-decl.xml\",\n            regex : \"\\\\?>\",\n            next : \"start\"\n        }],\n\n        processing_instruction : [\n            {token : \"punctuation.instruction.xml\", regex : \"\\\\?>\", next : \"start\"},\n            {defaultToken : \"instruction.xml\"}\n        ],\n\n        doctype : [\n            {include : \"whitespace\"},\n            {include : \"string\"},\n            {token : \"xml-pe.doctype.xml\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe.xml\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.int-subset\", regex : \"\\\\[\", push : \"int_subset\"}\n        ],\n\n        int_subset : [{\n            token : \"text.xml\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.int-subset.xml\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.markup-decl.xml\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.cdata.xml\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text.xml\", regex : \"\\\\s+\"},\n            {token : \"text.xml\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment.xml\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment.xml\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape.reference.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        attr_reference : [{\n            token : \"constant.language.escape.reference.attribute-value.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n            regex : \"(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n            ]\n        }],\n\n        tag_whitespace : [\n            {token : \"text.tag-whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        whitespace : [\n            {token : \"text.whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        string: [{\n            token : \"string.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.xml\", regex: \"'\", next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }, {\n            token : \"string.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.xml\", regex: '\"', next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }],\n\n        attributes: [{\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"tag_whitespace\"\n        }, {\n            include: \"attribute_value\"\n        }],\n\n        attribute_value: [{\n            token : \"string.attribute-value.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }, {\n            token : \"string.attribute-value.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\nace.define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    option      : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.addRules({\n        attributes: [{\n            include : \"tag_whitespace\"\n        }, {\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\",\n            push : [{\n                include: \"tag_whitespace\"\n            }, {\n                token : \"string.unquoted.attribute-value.html\",\n                regex : \"[^<>='\\\"`\\\\s]+\",\n                next : \"pop\"\n            }, {\n                token : \"empty\",\n                regex : \"\",\n                next : \"pop\"\n            }]\n        }, {\n            include : \"attribute_value\"\n        }],\n        tag: [{\n            token : function(start, tag) {\n                var group = tagMap[tag];\n                return [\"meta.tag.punctuation.\" + (start == \"<\" ? \"\" : \"end-\") + \"tag-open.xml\",\n                    \"meta.tag\" + (group ? \".\" + group : \"\") + \".tag-name.xml\"];\n            },\n            regex : \"(</?)([-_a-zA-Z0-9:]+)\",\n            next: \"tag_stuff\"\n        }],\n        tag_stuff: [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n        ],\n    });\n\n    this.embedTagRules(CssHighlightRules, \"css-\", \"style\");\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    if (this.constructor === HtmlHighlightRules)\n        this.normalizeRules();\n};\n\noop.inherits(HtmlHighlightRules, XmlHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nvar XmlBehaviour = function () {\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selected = session.doc.getTextRange(editor.getSelectionRange());\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            }\n\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (rightChar == quote && (is(token, \"attribute-value\") || is(token, \"string\"))) {\n                return {\n                    text: \"\",\n                    selection: [1, 1]\n                };\n            }\n\n            if (!token)\n                token = iterator.stepBackward();\n\n            if (!token)\n                return;\n\n            while (is(token, \"tag-whitespace\") || is(token, \"whitespace\")) {\n                token = iterator.stepBackward();\n            }\n            var rightSpace = !rightChar || rightChar.match(/\\s/);\n            if (is(token, \"attribute-equals\") && (rightSpace || rightChar == '>') || (is(token, \"decl-attribute-equals\") && (rightSpace || rightChar == '?'))) {\n                return {\n                    text: quote + quote,\n                    selection: [1, 1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken() || iterator.stepBackward();\n            if (!token || !(is(token, \"tag-name\") || is(token, \"tag-whitespace\") || is(token, \"attribute-name\") || is(token, \"attribute-equals\") || is(token, \"attribute-value\")))\n                return;\n            if (is(token, \"reference.attribute-value\"))\n                return;\n            if (is(token, \"attribute-value\")) {\n                var firstChar = token.value.charAt(0);\n                if (firstChar == '\"' || firstChar == \"'\") {\n                    var lastChar = token.value.charAt(token.value.length - 1);\n                    var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length;\n                    if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar)\n                        return;\n                }\n            }\n            while (!is(token, \"tag-name\")) {\n                token = iterator.stepBackward();\n            }\n\n            var tokenRow = iterator.getCurrentTokenRow();\n            var tokenColumn = iterator.getCurrentTokenColumn();\n            if (is(iterator.stepBackward(), \"end-tag-open\"))\n                return;\n\n            var element = token.value;\n            if (tokenRow == position.row)\n                element = element.substring(0, position.column - tokenColumn);\n\n            if (this.voidElements.hasOwnProperty(element.toLowerCase()))\n                 return;\n\n            return {\n               text: \">\" + \"</\" + element + \">\",\n               selection: [1, 1]\n            };\n        }\n    });\n\n    this.add(\"autoindent\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.getLine(cursor.row);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (token && token.type.indexOf(\"tag-close\") !== -1) {\n                while (token && token.type.indexOf(\"tag-name\") === -1) {\n                    token = iterator.stepBackward();\n                }\n\n                if (!token) {\n                    return;\n                }\n\n                var tag = token.value;\n                var row = iterator.getCurrentTokenRow();\n                token = iterator.stepBackward();\n                if (!token || token.type.indexOf(\"end-tag\") !== -1) {\n                    return;\n                }\n\n                if (this.voidElements && !this.voidElements[tag]) {\n                    var nextToken = session.getTokenAt(cursor.row, cursor.column+1);\n                    var line = session.getLine(row);\n                    var nextIndent = this.$getIndent(line);\n                    var indent = nextIndent + session.getTabString();\n\n                    if (nextToken && nextToken.value === \"</\") {\n                        return {\n                            text: \"\\n\" + indent + \"\\n\" + nextIndent,\n                            selection: [1, indent.length, 1, indent.length]\n                        };\n                    } else {\n                        return {\n                            text: \"\\n\" + indent\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n};\n\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\nace.define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n    this.defaultMode = defaultMode;\n    this.subModes = subModes;\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n\n    this.$getMode = function(state) {\n        if (typeof state != \"string\") \n            state = state[0];\n        for (var key in this.subModes) {\n            if (state.indexOf(key) === 0)\n                return this.subModes[key];\n        }\n        return null;\n    };\n    \n    this.$tryMode = function(state, session, foldStyle, row) {\n        var mode = this.$getMode(state);\n        return (mode ? mode.getFoldWidget(session, foldStyle, row) : \"\");\n    };\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        return (\n            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n            this.defaultMode.getFoldWidget(session, foldStyle, row)\n        );\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var mode = this.$getMode(session.getState(row-1));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.$getMode(session.getState(row));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.defaultMode;\n        \n        return mode.getFoldWidgetRange(session, foldStyle, row);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalEndTags) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n    this.optionalEndTags = oop.mixin({}, this.voidElements);\n    if (optionalEndTags)\n        oop.mixin(this.optionalEndTags, optionalEndTags);\n    \n};\noop.inherits(FoldMode, BaseFoldMode);\n\nvar Tag = function() {\n    this.tagName = \"\";\n    this.closing = false;\n    this.selfClosing = false;\n    this.start = {row: 0, column: 0};\n    this.end = {row: 0, column: 0};\n};\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (!tag)\n            return \"\";\n\n        if (tag.closing || (!tag.tagName && tag.selfClosing))\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase()))\n            return \"\";\n\n        if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column))\n            return \"\";\n\n        return \"start\";\n    };\n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var tag = new Tag();\n\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (is(token, \"tag-open\")) {\n                tag.end.column = tag.start.column + token.value.length;\n                tag.closing = is(token, \"end-tag-open\");\n                token = tokens[++i];\n                if (!token)\n                    return null;\n                tag.tagName = token.value;\n                tag.end.column += token.value.length;\n                for (i++; i < tokens.length; i++) {\n                    token = tokens[i];\n                    tag.end.column += token.value.length;\n                    if (is(token, \"tag-close\")) {\n                        tag.selfClosing = token.value == '/>';\n                        break;\n                    }\n                }\n                return tag;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == '/>';\n                return tag;\n            }\n            tag.start.column += token.value.length;\n        }\n\n        return null;\n    };\n\n    this._findEndTagInLine = function(session, row, tagName, startColumn) {\n        var tokens = session.getTokens(row);\n        var column = 0;\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            column += token.value.length;\n            if (column < startColumn)\n                continue;\n            if (is(token, \"end-tag-open\")) {\n                token = tokens[i + 1];\n                if (token && token.value == tagName)\n                    return true;\n            }\n        }\n        return false;\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n                iterator.stepForward();\n                return tag;\n            }\n        } while(token = iterator.stepForward());\n\n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n                iterator.stepBackward();\n                return tag;\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n            }\n        } while(token = iterator.stepBackward());\n\n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.optionalEndTags.hasOwnProperty(top.tagName)) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.start.column);\n            var start = {\n                row: row,\n                column: firstTag.start.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.end.column);\n            var end = {\n                row: row,\n                column: firstTag.start.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar MixedFoldMode = require(\"./mixed\").FoldMode;\nvar XmlFoldMode = require(\"./xml\").FoldMode;\nvar CStyleFoldMode = require(\"./cstyle\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalTags) {\n    MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), {\n        \"js-\": new CStyleFoldMode(),\n        \"css-\": new CStyleFoldMode()\n    });\n};\n\noop.inherits(FoldMode, MixedFoldMode);\n\n});\n\nace.define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\n\nvar commonAttributes = [\n    \"accesskey\",\n    \"class\",\n    \"contenteditable\",\n    \"contextmenu\",\n    \"dir\",\n    \"draggable\",\n    \"dropzone\",\n    \"hidden\",\n    \"id\",\n    \"inert\",\n    \"itemid\",\n    \"itemprop\",\n    \"itemref\",\n    \"itemscope\",\n    \"itemtype\",\n    \"lang\",\n    \"spellcheck\",\n    \"style\",\n    \"tabindex\",\n    \"title\",\n    \"translate\"\n];\n\nvar eventAttributes = [\n    \"onabort\",\n    \"onblur\",\n    \"oncancel\",\n    \"oncanplay\",\n    \"oncanplaythrough\",\n    \"onchange\",\n    \"onclick\",\n    \"onclose\",\n    \"oncontextmenu\",\n    \"oncuechange\",\n    \"ondblclick\",\n    \"ondrag\",\n    \"ondragend\",\n    \"ondragenter\",\n    \"ondragleave\",\n    \"ondragover\",\n    \"ondragstart\",\n    \"ondrop\",\n    \"ondurationchange\",\n    \"onemptied\",\n    \"onended\",\n    \"onerror\",\n    \"onfocus\",\n    \"oninput\",\n    \"oninvalid\",\n    \"onkeydown\",\n    \"onkeypress\",\n    \"onkeyup\",\n    \"onload\",\n    \"onloadeddata\",\n    \"onloadedmetadata\",\n    \"onloadstart\",\n    \"onmousedown\",\n    \"onmousemove\",\n    \"onmouseout\",\n    \"onmouseover\",\n    \"onmouseup\",\n    \"onmousewheel\",\n    \"onpause\",\n    \"onplay\",\n    \"onplaying\",\n    \"onprogress\",\n    \"onratechange\",\n    \"onreset\",\n    \"onscroll\",\n    \"onseeked\",\n    \"onseeking\",\n    \"onselect\",\n    \"onshow\",\n    \"onstalled\",\n    \"onsubmit\",\n    \"onsuspend\",\n    \"ontimeupdate\",\n    \"onvolumechange\",\n    \"onwaiting\"\n];\n\nvar globalAttributes = commonAttributes.concat(eventAttributes);\n\nvar attributeMap = {\n    \"html\": [\"manifest\"],\n    \"head\": [],\n    \"title\": [],\n    \"base\": [\"href\", \"target\"],\n    \"link\": [\"href\", \"hreflang\", \"rel\", \"media\", \"type\", \"sizes\"],\n    \"meta\": [\"http-equiv\", \"name\", \"content\", \"charset\"],\n    \"style\": [\"type\", \"media\", \"scoped\"],\n    \"script\": [\"charset\", \"type\", \"src\", \"defer\", \"async\"],\n    \"noscript\": [\"href\"],\n    \"body\": [\"onafterprint\", \"onbeforeprint\", \"onbeforeunload\", \"onhashchange\", \"onmessage\", \"onoffline\", \"onpopstate\", \"onredo\", \"onresize\", \"onstorage\", \"onundo\", \"onunload\"],\n    \"section\": [],\n    \"nav\": [],\n    \"article\": [\"pubdate\"],\n    \"aside\": [],\n    \"h1\": [],\n    \"h2\": [],\n    \"h3\": [],\n    \"h4\": [],\n    \"h5\": [],\n    \"h6\": [],\n    \"header\": [],\n    \"footer\": [],\n    \"address\": [],\n    \"main\": [],\n    \"p\": [],\n    \"hr\": [],\n    \"pre\": [],\n    \"blockquote\": [\"cite\"],\n    \"ol\": [\"start\", \"reversed\"],\n    \"ul\": [],\n    \"li\": [\"value\"],\n    \"dl\": [],\n    \"dt\": [],\n    \"dd\": [],\n    \"figure\": [],\n    \"figcaption\": [],\n    \"div\": [],\n    \"a\": [\"href\", \"target\", \"ping\", \"rel\", \"media\", \"hreflang\", \"type\"],\n    \"em\": [],\n    \"strong\": [],\n    \"small\": [],\n    \"s\": [],\n    \"cite\": [],\n    \"q\": [\"cite\"],\n    \"dfn\": [],\n    \"abbr\": [],\n    \"data\": [],\n    \"time\": [\"datetime\"],\n    \"code\": [],\n    \"var\": [],\n    \"samp\": [],\n    \"kbd\": [],\n    \"sub\": [],\n    \"sup\": [],\n    \"i\": [],\n    \"b\": [],\n    \"u\": [],\n    \"mark\": [],\n    \"ruby\": [],\n    \"rt\": [],\n    \"rp\": [],\n    \"bdi\": [],\n    \"bdo\": [],\n    \"span\": [],\n    \"br\": [],\n    \"wbr\": [],\n    \"ins\": [\"cite\", \"datetime\"],\n    \"del\": [\"cite\", \"datetime\"],\n    \"img\": [\"alt\", \"src\", \"height\", \"width\", \"usemap\", \"ismap\"],\n    \"iframe\": [\"name\", \"src\", \"height\", \"width\", \"sandbox\", \"seamless\"],\n    \"embed\": [\"src\", \"height\", \"width\", \"type\"],\n    \"object\": [\"param\", \"data\", \"type\", \"height\" , \"width\", \"usemap\", \"name\", \"form\", \"classid\"],\n    \"param\": [\"name\", \"value\"],\n    \"video\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\", \"width\", \"height\", \"poster\"],\n    \"audio\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\"],\n    \"source\": [\"src\", \"type\", \"media\"],\n    \"track\": [\"kind\", \"src\", \"srclang\", \"label\", \"default\"],\n    \"canvas\": [\"width\", \"height\"],\n    \"map\": [\"name\"],\n    \"area\": [\"shape\", \"coords\", \"href\", \"hreflang\", \"alt\", \"target\", \"media\", \"rel\", \"ping\", \"type\"],\n    \"svg\": [],\n    \"math\": [],\n    \"table\": [\"summary\"],\n    \"caption\": [],\n    \"colgroup\": [\"span\"],\n    \"col\": [\"span\"],\n    \"tbody\": [],\n    \"thead\": [],\n    \"tfoot\": [],\n    \"tr\": [],\n    \"td\": [\"headers\", \"rowspan\", \"colspan\"],\n    \"th\": [\"headers\", \"rowspan\", \"colspan\", \"scope\"],\n    \"form\": [\"accept-charset\", \"action\", \"autocomplete\", \"enctype\", \"method\", \"name\", \"novalidate\", \"target\"],\n    \"fieldset\": [\"disabled\", \"form\", \"name\"],\n    \"legend\": [],\n    \"label\": [\"form\", \"for\"],\n    \"input\": [\"type\", \"accept\", \"alt\", \"autocomplete\", \"checked\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"height\", \"list\", \"max\", \"maxlength\", \"min\", \"multiple\", \"pattern\", \"placeholder\", \"readonly\", \"required\", \"size\", \"src\", \"step\", \"width\", \"files\", \"value\"],\n    \"button\": [\"autofocus\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"name\", \"value\", \"type\"],\n    \"select\": [\"autofocus\", \"disabled\", \"form\", \"multiple\", \"name\", \"size\"],\n    \"datalist\": [],\n    \"optgroup\": [\"disabled\", \"label\"],\n    \"option\": [\"disabled\", \"selected\", \"label\", \"value\"],\n    \"textarea\": [\"autofocus\", \"disabled\", \"form\", \"maxlength\", \"name\", \"placeholder\", \"readonly\", \"required\", \"rows\", \"cols\", \"wrap\"],\n    \"keygen\": [\"autofocus\", \"challenge\", \"disabled\", \"form\", \"keytype\", \"name\"],\n    \"output\": [\"for\", \"form\", \"name\"],\n    \"progress\": [\"value\", \"max\"],\n    \"meter\": [\"value\", \"min\", \"max\", \"low\", \"high\", \"optimum\"],\n    \"details\": [\"open\"],\n    \"summary\": [],\n    \"command\": [\"type\", \"label\", \"icon\", \"disabled\", \"checked\", \"radiogroup\", \"command\"],\n    \"menu\": [\"type\", \"label\"],\n    \"dialog\": [\"open\"]\n};\n\nvar elements = Object.keys(attributeMap);\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nfunction findTagName(session, pos) {\n    var iterator = new TokenIterator(session, pos.row, pos.column);\n    var token = iterator.getCurrentToken();\n    while (token && !is(token, \"tag-name\")){\n        token = iterator.stepBackward();\n    }\n    if (token)\n        return token.value;\n}\n\nvar HtmlCompletions = function() {\n\n};\n\n(function() {\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        var token = session.getTokenAt(pos.row, pos.column);\n\n        if (!token)\n            return [];\n        if (is(token, \"tag-name\") || is(token, \"tag-open\") || is(token, \"end-tag-open\"))\n            return this.getTagCompletions(state, session, pos, prefix);\n        if (is(token, \"tag-whitespace\") || is(token, \"attribute-name\"))\n            return this.getAttributeCompetions(state, session, pos, prefix);\n\n        return [];\n    };\n\n    this.getTagCompletions = function(state, session, pos, prefix) {\n        return elements.map(function(element){\n            return {\n                value: element,\n                meta: \"tag\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n    this.getAttributeCompetions = function(state, session, pos, prefix) {\n        var tagName = findTagName(session, pos);\n        if (!tagName)\n            return [];\n        var attributes = globalAttributes;\n        if (tagName in attributeMap) {\n            attributes = attributes.concat(attributeMap[tagName]);\n        }\n        return attributes.map(function(attribute){\n            return {\n                caption: attribute,\n                snippet: attribute + '=\"$0\"',\n                meta: \"attribute\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n}).call(HtmlCompletions.prototype);\n\nexports.HtmlCompletions = HtmlCompletions;\n});\n\nace.define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar HtmlFoldMode = require(\"./folding/html\").FoldMode;\nvar HtmlCompletions = require(\"./html_completions\").HtmlCompletions;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar voidElements = [\"area\", \"base\", \"br\", \"col\", \"embed\", \"hr\", \"img\", \"input\", \"keygen\", \"link\", \"meta\", \"menuitem\", \"param\", \"source\", \"track\", \"wbr\"];\nvar optionalEndTags = [\"li\", \"dt\", \"dd\", \"p\", \"rt\", \"rp\", \"optgroup\", \"option\", \"colgroup\", \"td\", \"th\"];\n\nvar Mode = function(options) {\n    this.fragmentContext = options && options.fragmentContext;\n    this.HighlightRules = HtmlHighlightRules;\n    this.$behaviour = new XmlBehaviour();\n    this.$completer = new HtmlCompletions();\n    \n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"css-\": CssMode\n    });\n    \n    this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags));\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n    this.voidElements = lang.arrayToMap(voidElements);\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        return this.$completer.getCompletions(state, session, pos, prefix);\n    };\n\n    this.createWorker = function(session) {\n        if (this.constructor != Mode)\n            return;\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/html_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        if (this.fragmentContext)\n            worker.call(\"setOptions\", [{context: this.fragmentContext}]);\n\n        worker.on(\"error\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/html\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/django\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html\",\"ace/mode/html_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\nvar oop = require(\"../lib/oop\");\nvar HtmlMode = require(\"./html\").Mode;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DjangoHighlightRules = function(){\n    this.$rules = {\n        'start': [{\n            token: \"string\",\n            regex: '\".*?\"'\n        }, {\n            token: \"string\",\n            regex: \"'.*?'\"\n        }, {\n            token: \"constant\",\n            regex: '[0-9]+'\n        }, {\n            token: \"variable\",\n            regex: \"[-_a-zA-Z0-9:]+\"\n        }],\n        'comment': [{\n            token : \"comment.block\",\n            merge: true,\n            regex : \".+?\"\n        }],\n        'tag': [{\n            token: \"entity.name.function\",\n            regex: \"[a-zA-Z][_a-zA-Z0-9]*\",\n            next: \"start\"\n        }]\n    };\n};\n\noop.inherits(DjangoHighlightRules, TextHighlightRules)\n\nvar DjangoHtmlHighlightRules = function() {\n    this.$rules = new HtmlHighlightRules().getRules();\n\n    for (var i in this.$rules) {\n        this.$rules[i].unshift({\n            token: \"comment.line\",\n            regex: \"\\\\{#.*?#\\\\}\"\n        }, {\n            token: \"comment.block\",\n            regex: \"\\\\{\\\\%\\\\s*comment\\\\s*\\\\%\\\\}\",\n            merge: true,\n            next: \"django-comment\"\n        }, {\n            token: \"constant.language\",\n            regex: \"\\\\{\\\\{\",\n            next: \"django-start\"\n        }, {\n            token: \"constant.language\",\n            regex: \"\\\\{\\\\%\",\n            next: \"django-tag\"\n        });\n        this.embedRules(DjangoHighlightRules, \"django-\", [{\n                token: \"comment.block\",\n                regex: \"\\\\{\\\\%\\\\s*endcomment\\\\s*\\\\%\\\\}\",\n                merge: true,\n                next: \"start\"\n            }, {\n                token: \"constant.language\",\n                regex: \"\\\\%\\\\}\",\n                next: \"start\"\n            }, {\n                token: \"constant.language\",\n                regex: \"\\\\}\\\\}\",\n                next: \"start\"\n        }]);\n    }\n};\n\noop.inherits(DjangoHtmlHighlightRules, HtmlHighlightRules);\n\nvar Mode = function() {\n    HtmlMode.call(this);\n    this.HighlightRules = DjangoHtmlHighlightRules;\n};\noop.inherits(Mode, HtmlMode);\n\n(function() {\n    this.$id = \"ace/mode/django\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-dockerfile.js",
    "content": "ace.define(\"ace/mode/sh_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar reservedKeywords = exports.reservedKeywords = (\n        '!|{|}|case|do|done|elif|else|'+\n        'esac|fi|for|if|in|then|until|while|'+\n        '&|;|export|local|read|typeset|unset|'+\n        'elif|select|set'\n    );\n\nvar languageConstructs = exports.languageConstructs = (\n    '[|]|alias|bg|bind|break|builtin|'+\n     'cd|command|compgen|complete|continue|'+\n     'dirs|disown|echo|enable|eval|exec|'+\n     'exit|fc|fg|getopts|hash|help|history|'+\n     'jobs|kill|let|logout|popd|printf|pushd|'+\n     'pwd|return|set|shift|shopt|source|'+\n     'suspend|test|times|trap|type|ulimit|'+\n     'umask|unalias|wait'\n);\n\nvar ShHighlightRules = function() {\n    var keywordMapper = this.createKeywordMapper({\n        \"keyword\": reservedKeywords,\n        \"support.function.builtin\": languageConstructs,\n        \"invalid.deprecated\": \"debugger\"\n    }, \"identifier\");\n\n    var integer = \"(?:(?:[1-9]\\\\d*)|(?:0))\";\n\n    var fraction = \"(?:\\\\.\\\\d+)\";\n    var intPart = \"(?:\\\\d+)\";\n    var pointFloat = \"(?:(?:\" + intPart + \"?\" + fraction + \")|(?:\" + intPart + \"\\\\.))\";\n    var exponentFloat = \"(?:(?:\" + pointFloat + \"|\" +  intPart + \")\" + \")\";\n    var floatNumber = \"(?:\" + exponentFloat + \"|\" + pointFloat + \")\";\n    var fileDescriptor = \"(?:&\" + intPart + \")\";\n\n    var variableName = \"[a-zA-Z_][a-zA-Z0-9_]*\";\n    var variable = \"(?:(?:\\\\$\" + variableName + \")|(?:\" + variableName + \"=))\";\n\n    var builtinVariable = \"(?:\\\\$(?:SHLVL|\\\\$|\\\\!|\\\\?))\";\n\n    var func = \"(?:\" + variableName + \"\\\\s*\\\\(\\\\))\";\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"constant\",\n            regex : /\\\\./\n        }, {\n            token : [\"text\", \"comment\"],\n            regex : /(^|\\s)(#.*)$/\n        }, {\n            token : \"string\",\n            regex : '\"',\n            push : [{\n                token : \"constant.language.escape\",\n                regex : /\\\\(?:[$abeEfnrtv\\\\'\"]|x[a-fA-F\\d]{1,2}|u[a-fA-F\\d]{4}([a-fA-F\\d]{4})?|c.|\\d{1,3})/\n            }, {\n                token : \"constant\",\n                regex : /\\$\\w+/\n            }, {\n                token : \"string\",\n                regex : '\"',\n                next: \"pop\"\n            }, {\n                defaultToken: \"string\"\n            }]\n        }, {\n            regex : \"<<<\",\n            token : \"keyword.operator\"\n        }, {\n            stateName: \"heredoc\",\n            regex : \"(<<)(\\\\s*)(['\\\"`]?)([\\\\w\\\\-]+)(['\\\"`]?)\",\n            onMatch : function(value, currentState, stack) {\n                var next = value[2] == '-' ? \"indentedHeredoc\" : \"heredoc\";\n                var tokens = value.split(this.splitRegex);\n                stack.push(next, tokens[4]);\n                return [\n                    {type:\"constant\", value: tokens[1]},\n                    {type:\"text\", value: tokens[2]},\n                    {type:\"string\", value: tokens[3]},\n                    {type:\"support.class\", value: tokens[4]},\n                    {type:\"string\", value: tokens[5]}\n                ];\n            },\n            rules: {\n                heredoc: [{\n                    onMatch:  function(value, currentState, stack) {\n                        if (value === stack[1]) {\n                            stack.shift();\n                            stack.shift();\n                            this.next = stack[0] || \"start\";\n                            return \"support.class\";\n                        }\n                        this.next = \"\";\n                        return \"string\";\n                    },\n                    regex: \".*$\",\n                    next: \"start\"\n                }],\n                indentedHeredoc: [{\n                    token: \"string\",\n                    regex: \"^\\t+\"\n                }, {\n                    onMatch:  function(value, currentState, stack) {\n                        if (value === stack[1]) {\n                            stack.shift();\n                            stack.shift();\n                            this.next = stack[0] || \"start\";\n                            return \"support.class\";\n                        }\n                        this.next = \"\";\n                        return \"string\";\n                    },\n                    regex: \".*$\",\n                    next: \"start\"\n                }]\n            }\n        }, {\n            regex : \"$\",\n            token : \"empty\",\n            next : function(currentState, stack) {\n                if (stack[0] === \"heredoc\" || stack[0] === \"indentedHeredoc\")\n                    return stack[0];\n                return currentState;\n            }\n        }, {\n            token : \"variable.language\",\n            regex : builtinVariable\n        }, {\n            token : \"variable\",\n            regex : variable\n        }, {\n            token : \"support.function\",\n            regex : func\n        }, {\n            token : \"support.function\",\n            regex : fileDescriptor\n        }, {\n            token : \"string\",           // ' string\n            start : \"'\", end : \"'\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : floatNumber\n        }, {\n            token : \"constant.numeric\", // integer\n            regex : integer + \"\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_][a-zA-Z0-9_]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\\\+|\\\\-|\\\\*|\\\\*\\\\*|\\\\/|\\\\/\\\\/|~|<|>|<=|=>|=|!=\"\n        }, {\n            token : \"paren.lparen\",\n            regex : \"[\\\\[\\\\(\\\\{]\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\]\\\\)\\\\}]\"\n        } ]\n    };\n    \n    this.normalizeRules();\n};\n\noop.inherits(ShHighlightRules, TextHighlightRules);\n\nexports.ShHighlightRules = ShHighlightRules;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/sh\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/sh_highlight_rules\",\"ace/range\",\"ace/mode/folding/cstyle\",\"ace/mode/behaviour/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar ShHighlightRules = require(\"./sh_highlight_rules\").ShHighlightRules;\nvar Range = require(\"../range\").Range;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\n\nvar Mode = function() {\n    this.HighlightRules = ShHighlightRules;\n    this.foldingRules = new CStyleFoldMode();\n    this.$behaviour = new CstyleBehaviour();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n   \n    this.lineCommentStart = \"#\";\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[\\:]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    var outdents = {\n        \"pass\": 1,\n        \"return\": 1,\n        \"raise\": 1,\n        \"break\": 1,\n        \"continue\": 1\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        if (input !== \"\\r\\n\" && input !== \"\\r\" && input !== \"\\n\")\n            return false;\n\n        var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens;\n\n        if (!tokens)\n            return false;\n        do {\n            var last = tokens.pop();\n        } while (last && (last.type == \"comment\" || (last.type == \"text\" && last.value.match(/^\\s+$/))));\n\n        if (!last)\n            return false;\n\n        return (last.type == \"keyword\" && outdents[last.value]);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n\n        row += 1;\n        var indent = this.$getIndent(doc.getLine(row));\n        var tab = doc.getTabString();\n        if (indent.slice(-tab.length) == tab)\n            doc.remove(new Range(row, indent.length-tab.length, row, indent.length));\n    };\n\n    this.$id = \"ace/mode/sh\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/dockerfile_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/sh_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar ShHighlightRules = require(\"./sh_highlight_rules\").ShHighlightRules;\n\nvar DockerfileHighlightRules = function() {\n    ShHighlightRules.call(this);\n\n    var startRules = this.$rules.start;\n    for (var i = 0; i < startRules.length; i++) {\n        if (startRules[i].token == \"variable.language\") {\n            startRules.splice(i, 0, {\n                token: \"constant.language\",\n                regex: \"(?:^(?:FROM|MAINTAINER|RUN|CMD|EXPOSE|ENV|ADD|ENTRYPOINT|VOLUME|USER|WORKDIR|ONBUILD|COPY)\\\\b)\",\n                caseInsensitive: true\n            });\n            break;\n        }\n    }\n    \n};\n\noop.inherits(DockerfileHighlightRules, ShHighlightRules);\n\nexports.DockerfileHighlightRules = DockerfileHighlightRules;\n});\n\nace.define(\"ace/mode/dockerfile\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/sh\",\"ace/mode/dockerfile_highlight_rules\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar ShMode = require(\"./sh\").Mode;\nvar DockerfileHighlightRules = require(\"./dockerfile_highlight_rules\").DockerfileHighlightRules;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    ShMode.call(this);\n    \n    this.HighlightRules = DockerfileHighlightRules;\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, ShMode);\n\n(function() {\n    this.$id = \"ace/mode/dockerfile\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-dot.js",
    "content": "ace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/dot_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\",\"ace/mode/doc_comment_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\n\nvar DotHighlightRules = function() {\n\n   var keywords = lang.arrayToMap(\n        (\"strict|node|edge|graph|digraph|subgraph\").split(\"|\")\n   );\n\n   var attributes = lang.arrayToMap(\n        (\"damping|k|url|area|arrowhead|arrowsize|arrowtail|aspect|bb|bgcolor|center|charset|clusterrank|color|colorscheme|comment|compound|concentrate|constraint|decorate|defaultdist|dim|dimen|dir|diredgeconstraints|distortion|dpi|edgeurl|edgehref|edgetarget|edgetooltip|epsilon|esep|fillcolor|fixedsize|fontcolor|fontname|fontnames|fontpath|fontsize|forcelabels|gradientangle|group|headurl|head_lp|headclip|headhref|headlabel|headport|headtarget|headtooltip|height|href|id|image|imagepath|imagescale|label|labelurl|label_scheme|labelangle|labeldistance|labelfloat|labelfontcolor|labelfontname|labelfontsize|labelhref|labeljust|labelloc|labeltarget|labeltooltip|landscape|layer|layerlistsep|layers|layerselect|layersep|layout|len|levels|levelsgap|lhead|lheight|lp|ltail|lwidth|margin|maxiter|mclimit|mindist|minlen|mode|model|mosek|nodesep|nojustify|normalize|nslimit|nslimit1|ordering|orientation|outputorder|overlap|overlap_scaling|pack|packmode|pad|page|pagedir|pencolor|penwidth|peripheries|pin|pos|quadtree|quantum|rank|rankdir|ranksep|ratio|rects|regular|remincross|repulsiveforce|resolution|root|rotate|rotation|samehead|sametail|samplepoints|scale|searchsize|sep|shape|shapefile|showboxes|sides|size|skew|smoothing|sortv|splines|start|style|stylesheet|tailurl|tail_lp|tailclip|tailhref|taillabel|tailport|tailtarget|tailtooltip|target|tooltip|truecolor|vertices|viewport|voro_margin|weight|width|xlabel|xlp|z\").split(\"|\")\n   );\n\n   this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : /\\/\\/.*$/\n            }, {\n                token : \"comment\",\n                regex : /#.*$/\n            }, {\n                token : \"comment\", // multi line comment\n                merge : true,\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\",\n                regex : /[+\\-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?)?\\b/\n            }, {\n                token : \"keyword.operator\",\n                regex : /\\+|=|\\->/\n            }, {\n                token : \"punctuation.operator\",\n                regex : /,|;/\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[{]/\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\]}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }, {\n                token: function(value) {\n                    if (keywords.hasOwnProperty(value.toLowerCase())) {\n                        return \"keyword\";\n                    }\n                    else if (attributes.hasOwnProperty(value.toLowerCase())) {\n                        return \"variable\";\n                    }\n                    else {\n                        return \"text\";\n                    }\n                },\n                regex: \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n           }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                merge : true,\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                merge : true,\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '[^\"\\\\\\\\]+',\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"start\",\n                merge : true\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : \"[^'\\\\\\\\]+\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\",\n                merge : true\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"start\",\n                merge : true\n            }\n        ]\n   };\n};\n\noop.inherits(DotHighlightRules, TextHighlightRules);\n\nexports.DotHighlightRules = DotHighlightRules;\n\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/dot\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/matching_brace_outdent\",\"ace/mode/dot_highlight_rules\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar DotHighlightRules = require(\"./dot_highlight_rules\").DotHighlightRules;\nvar DotFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = DotHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.foldingRules = new DotFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = [\"//\", \"#\"];\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/dot\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-eiffel.js",
    "content": "ace.define(\"ace/mode/eiffel_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar EiffelHighlightRules = function() {\n    var keywords = \"across|agent|alias|all|attached|as|assign|attribute|check|\" +\n        \"class|convert|create|debug|deferred|detachable|do|else|elseif|end|\" +\n        \"ensure|expanded|export|external|feature|from|frozen|if|inherit|\" +\n        \"inspect|invariant|like|local|loop|not|note|obsolete|old|once|\" +\n        \"Precursor|redefine|rename|require|rescue|retry|select|separate|\" +\n        \"some|then|undefine|until|variant|when\";\n\n    var operatorKeywords = \"and|implies|or|xor\";\n\n    var languageConstants = \"Void\";\n\n    var booleanConstants = \"True|False\";\n\n    var languageVariables = \"Current|Result\";\n\n    var keywordMapper = this.createKeywordMapper({\n        \"constant.language\": languageConstants,\n        \"constant.language.boolean\": booleanConstants,\n        \"variable.language\": languageVariables,\n        \"keyword.operator\": operatorKeywords,\n        \"keyword\": keywords\n    }, \"identifier\", true);\n\n    var simpleString = /(?:[^\"%\\b\\f\\v]|%[A-DFHLNQR-V%'\"()<>]|%\\/(?:0[xX][\\da-fA-F](?:_*[\\da-fA-F])*|0[cC][0-7](?:_*[0-7])*|0[bB][01](?:_*[01])*|\\d(?:_*\\d)*)\\/)+?/;\n\n    this.$rules = {\n        \"start\": [{\n                token : \"string.quoted.other\", // Aligned-verbatim-strings (verbatim option not supported)\n                regex : /\"\\[/,\n                next: \"aligned_verbatim_string\"\n            }, {\n                token : \"string.quoted.other\", // Non-aligned-verbatim-strings (verbatim option not supported)\n                regex : /\"\\{/,\n                next: \"non-aligned_verbatim_string\"\n            }, {\n                token : \"string.quoted.double\",\n                regex : /\"(?:[^%\\b\\f\\n\\r\\v]|%[A-DFHLNQR-V%'\"()<>]|%\\/(?:0[xX][\\da-fA-F](?:_*[\\da-fA-F])*|0[cC][0-7](?:_*[0-7])*|0[bB][01](?:_*[01])*|\\d(?:_*\\d)*)\\/)*?\"/\n            }, {\n                token : \"comment.line.double-dash\",\n                regex : /--.*/\n            }, {\n                token : \"constant.character\",\n                regex : /'(?:[^%\\b\\f\\n\\r\\t\\v]|%[A-DFHLNQR-V%'\"()<>]|%\\/(?:0[xX][\\da-fA-F](?:_*[\\da-fA-F])*|0[cC][0-7](?:_*[0-7])*|0[bB][01](?:_*[01])*|\\d(?:_*\\d)*)\\/)'/\n            }, {\n                token : \"constant.numeric\", // hexa | octal | bin\n                regex : /\\b0(?:[xX][\\da-fA-F](?:_*[\\da-fA-F])*|[cC][0-7](?:_*[0-7])*|[bB][01](?:_*[01])*)\\b/\n            }, {\n                token : \"constant.numeric\",\n                regex : /(?:\\d(?:_*\\d)*)?\\.(?:(?:\\d(?:_*\\d)*)?[eE][+-]?)?\\d(?:_*\\d)*|\\d(?:_*\\d)*\\.?/\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]|<<|\\|\\(/\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]|>>|\\|\\)/\n            }, {\n                token : \"keyword.operator\", // punctuation\n                regex : /:=|->|\\.(?=\\w)|[;,:?]/\n            }, {\n                token : \"keyword.operator\",\n                regex : /\\\\\\\\|\\|\\.\\.\\||\\.\\.|\\/[~\\/]?|[><\\/]=?|[-+*^=~]/\n            }, {\n                token : function (v) {\n                    var result = keywordMapper (v);\n                    if (result === \"identifier\" && v === v.toUpperCase ()) {\n                        result =  \"entity.name.type\";\n                    }\n                    return result;\n                },\n                regex : /[a-zA-Z][a-zA-Z\\d_]*\\b/\n            }, {\n                token : \"text\",\n                regex : /\\s+/\n            }\n        ],\n        \"aligned_verbatim_string\" : [{\n                token : \"string\",\n                regex : /]\"/,\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : simpleString\n            }\n        ],\n        \"non-aligned_verbatim_string\" : [{\n                token : \"string.quoted.other\",\n                regex : /}\"/,\n                next : \"start\"\n            }, {\n                token : \"string.quoted.other\",\n                regex : simpleString\n            }\n        ]};\n};\n\noop.inherits(EiffelHighlightRules, TextHighlightRules);\n\nexports.EiffelHighlightRules = EiffelHighlightRules;\n});\n\nace.define(\"ace/mode/eiffel\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/eiffel_highlight_rules\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar EiffelHighlightRules = require(\"./eiffel_highlight_rules\").EiffelHighlightRules;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.HighlightRules = EiffelHighlightRules;\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"--\";\n    this.$id = \"ace/mode/eiffel\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-ejs.js",
    "content": "ace.define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\nace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"string.cdata.xml\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.xml-decl.xml\", \"keyword.xml-decl.xml\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_decl\", caseInsensitive: true\n            },\n            {\n                token : [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"processing_instruction\",\n            },\n            {token : \"comment.xml\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\", caseInsensitive: true\n            },\n            {include : \"tag\"},\n            {token : \"text.end-tag-open.xml\", regex: \"</\"},\n            {token : \"text.tag-open.xml\", regex: \"<\"},\n            {include : \"reference\"},\n            {defaultToken : \"text.xml\"}\n        ],\n\n        xml_decl : [{\n            token : \"entity.other.attribute-name.decl-attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.decl-attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"whitespace\"\n        }, {\n            include: \"string\"\n        }, {\n            token : \"punctuation.xml-decl.xml\",\n            regex : \"\\\\?>\",\n            next : \"start\"\n        }],\n\n        processing_instruction : [\n            {token : \"punctuation.instruction.xml\", regex : \"\\\\?>\", next : \"start\"},\n            {defaultToken : \"instruction.xml\"}\n        ],\n\n        doctype : [\n            {include : \"whitespace\"},\n            {include : \"string\"},\n            {token : \"xml-pe.doctype.xml\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe.xml\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.int-subset\", regex : \"\\\\[\", push : \"int_subset\"}\n        ],\n\n        int_subset : [{\n            token : \"text.xml\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.int-subset.xml\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.markup-decl.xml\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.cdata.xml\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text.xml\", regex : \"\\\\s+\"},\n            {token : \"text.xml\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment.xml\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment.xml\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape.reference.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        attr_reference : [{\n            token : \"constant.language.escape.reference.attribute-value.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n            regex : \"(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n            ]\n        }],\n\n        tag_whitespace : [\n            {token : \"text.tag-whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        whitespace : [\n            {token : \"text.whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        string: [{\n            token : \"string.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.xml\", regex: \"'\", next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }, {\n            token : \"string.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.xml\", regex: '\"', next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }],\n\n        attributes: [{\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"tag_whitespace\"\n        }, {\n            include: \"attribute_value\"\n        }],\n\n        attribute_value: [{\n            token : \"string.attribute-value.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }, {\n            token : \"string.attribute-value.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\nace.define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    option      : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.addRules({\n        attributes: [{\n            include : \"tag_whitespace\"\n        }, {\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\",\n            push : [{\n                include: \"tag_whitespace\"\n            }, {\n                token : \"string.unquoted.attribute-value.html\",\n                regex : \"[^<>='\\\"`\\\\s]+\",\n                next : \"pop\"\n            }, {\n                token : \"empty\",\n                regex : \"\",\n                next : \"pop\"\n            }]\n        }, {\n            include : \"attribute_value\"\n        }],\n        tag: [{\n            token : function(start, tag) {\n                var group = tagMap[tag];\n                return [\"meta.tag.punctuation.\" + (start == \"<\" ? \"\" : \"end-\") + \"tag-open.xml\",\n                    \"meta.tag\" + (group ? \".\" + group : \"\") + \".tag-name.xml\"];\n            },\n            regex : \"(</?)([-_a-zA-Z0-9:]+)\",\n            next: \"tag_stuff\"\n        }],\n        tag_stuff: [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n        ],\n    });\n\n    this.embedTagRules(CssHighlightRules, \"css-\", \"style\");\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    if (this.constructor === HtmlHighlightRules)\n        this.normalizeRules();\n};\n\noop.inherits(HtmlHighlightRules, XmlHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar CssBehaviour = function () {\n\n    this.inherit(CstyleBehaviour);\n\n    this.add(\"colon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(cursor.row);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                if (rightChar === ':') {\n                    return {\n                       text: '',\n                       selection: [1, 1]\n                    }\n                }\n                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n                    return {\n                       text: ':;',\n                       selection: [1, 1]\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"colon\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(range.start.row);\n                var rightChar = line.substring(range.end.column, range.end.column + 1);\n                if (rightChar === ';') {\n                    range.end.column ++;\n                    return range;\n                }\n            }\n        }\n    });\n\n    this.add(\"semicolon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ';') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === ';') {\n                return {\n                   text: '',\n                   selection: [1, 1]\n                }\n            }\n        }\n    });\n\n}\noop.inherits(CssBehaviour, CstyleBehaviour);\n\nexports.CssBehaviour = CssBehaviour;\n});\n\nace.define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CssBehaviour = require(\"./behaviour/css\").CssBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = CssHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CssBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"csslint\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/css\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\nace.define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nvar XmlBehaviour = function () {\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selected = session.doc.getTextRange(editor.getSelectionRange());\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            }\n\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (rightChar == quote && (is(token, \"attribute-value\") || is(token, \"string\"))) {\n                return {\n                    text: \"\",\n                    selection: [1, 1]\n                };\n            }\n\n            if (!token)\n                token = iterator.stepBackward();\n\n            if (!token)\n                return;\n\n            while (is(token, \"tag-whitespace\") || is(token, \"whitespace\")) {\n                token = iterator.stepBackward();\n            }\n            var rightSpace = !rightChar || rightChar.match(/\\s/);\n            if (is(token, \"attribute-equals\") && (rightSpace || rightChar == '>') || (is(token, \"decl-attribute-equals\") && (rightSpace || rightChar == '?'))) {\n                return {\n                    text: quote + quote,\n                    selection: [1, 1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken() || iterator.stepBackward();\n            if (!token || !(is(token, \"tag-name\") || is(token, \"tag-whitespace\") || is(token, \"attribute-name\") || is(token, \"attribute-equals\") || is(token, \"attribute-value\")))\n                return;\n            if (is(token, \"reference.attribute-value\"))\n                return;\n            if (is(token, \"attribute-value\")) {\n                var firstChar = token.value.charAt(0);\n                if (firstChar == '\"' || firstChar == \"'\") {\n                    var lastChar = token.value.charAt(token.value.length - 1);\n                    var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length;\n                    if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar)\n                        return;\n                }\n            }\n            while (!is(token, \"tag-name\")) {\n                token = iterator.stepBackward();\n            }\n\n            var tokenRow = iterator.getCurrentTokenRow();\n            var tokenColumn = iterator.getCurrentTokenColumn();\n            if (is(iterator.stepBackward(), \"end-tag-open\"))\n                return;\n\n            var element = token.value;\n            if (tokenRow == position.row)\n                element = element.substring(0, position.column - tokenColumn);\n\n            if (this.voidElements.hasOwnProperty(element.toLowerCase()))\n                 return;\n\n            return {\n               text: \">\" + \"</\" + element + \">\",\n               selection: [1, 1]\n            };\n        }\n    });\n\n    this.add(\"autoindent\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.getLine(cursor.row);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (token && token.type.indexOf(\"tag-close\") !== -1) {\n                while (token && token.type.indexOf(\"tag-name\") === -1) {\n                    token = iterator.stepBackward();\n                }\n\n                if (!token) {\n                    return;\n                }\n\n                var tag = token.value;\n                var row = iterator.getCurrentTokenRow();\n                token = iterator.stepBackward();\n                if (!token || token.type.indexOf(\"end-tag\") !== -1) {\n                    return;\n                }\n\n                if (this.voidElements && !this.voidElements[tag]) {\n                    var nextToken = session.getTokenAt(cursor.row, cursor.column+1);\n                    var line = session.getLine(row);\n                    var nextIndent = this.$getIndent(line);\n                    var indent = nextIndent + session.getTabString();\n\n                    if (nextToken && nextToken.value === \"</\") {\n                        return {\n                            text: \"\\n\" + indent + \"\\n\" + nextIndent,\n                            selection: [1, indent.length, 1, indent.length]\n                        };\n                    } else {\n                        return {\n                            text: \"\\n\" + indent\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n};\n\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\nace.define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n    this.defaultMode = defaultMode;\n    this.subModes = subModes;\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n\n    this.$getMode = function(state) {\n        if (typeof state != \"string\") \n            state = state[0];\n        for (var key in this.subModes) {\n            if (state.indexOf(key) === 0)\n                return this.subModes[key];\n        }\n        return null;\n    };\n    \n    this.$tryMode = function(state, session, foldStyle, row) {\n        var mode = this.$getMode(state);\n        return (mode ? mode.getFoldWidget(session, foldStyle, row) : \"\");\n    };\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        return (\n            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n            this.defaultMode.getFoldWidget(session, foldStyle, row)\n        );\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var mode = this.$getMode(session.getState(row-1));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.$getMode(session.getState(row));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.defaultMode;\n        \n        return mode.getFoldWidgetRange(session, foldStyle, row);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalEndTags) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n    this.optionalEndTags = oop.mixin({}, this.voidElements);\n    if (optionalEndTags)\n        oop.mixin(this.optionalEndTags, optionalEndTags);\n    \n};\noop.inherits(FoldMode, BaseFoldMode);\n\nvar Tag = function() {\n    this.tagName = \"\";\n    this.closing = false;\n    this.selfClosing = false;\n    this.start = {row: 0, column: 0};\n    this.end = {row: 0, column: 0};\n};\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (!tag)\n            return \"\";\n\n        if (tag.closing || (!tag.tagName && tag.selfClosing))\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase()))\n            return \"\";\n\n        if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column))\n            return \"\";\n\n        return \"start\";\n    };\n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var tag = new Tag();\n\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (is(token, \"tag-open\")) {\n                tag.end.column = tag.start.column + token.value.length;\n                tag.closing = is(token, \"end-tag-open\");\n                token = tokens[++i];\n                if (!token)\n                    return null;\n                tag.tagName = token.value;\n                tag.end.column += token.value.length;\n                for (i++; i < tokens.length; i++) {\n                    token = tokens[i];\n                    tag.end.column += token.value.length;\n                    if (is(token, \"tag-close\")) {\n                        tag.selfClosing = token.value == '/>';\n                        break;\n                    }\n                }\n                return tag;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == '/>';\n                return tag;\n            }\n            tag.start.column += token.value.length;\n        }\n\n        return null;\n    };\n\n    this._findEndTagInLine = function(session, row, tagName, startColumn) {\n        var tokens = session.getTokens(row);\n        var column = 0;\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            column += token.value.length;\n            if (column < startColumn)\n                continue;\n            if (is(token, \"end-tag-open\")) {\n                token = tokens[i + 1];\n                if (token && token.value == tagName)\n                    return true;\n            }\n        }\n        return false;\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n                iterator.stepForward();\n                return tag;\n            }\n        } while(token = iterator.stepForward());\n\n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n                iterator.stepBackward();\n                return tag;\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n            }\n        } while(token = iterator.stepBackward());\n\n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.optionalEndTags.hasOwnProperty(top.tagName)) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.start.column);\n            var start = {\n                row: row,\n                column: firstTag.start.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.end.column);\n            var end = {\n                row: row,\n                column: firstTag.start.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar MixedFoldMode = require(\"./mixed\").FoldMode;\nvar XmlFoldMode = require(\"./xml\").FoldMode;\nvar CStyleFoldMode = require(\"./cstyle\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalTags) {\n    MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), {\n        \"js-\": new CStyleFoldMode(),\n        \"css-\": new CStyleFoldMode()\n    });\n};\n\noop.inherits(FoldMode, MixedFoldMode);\n\n});\n\nace.define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\n\nvar commonAttributes = [\n    \"accesskey\",\n    \"class\",\n    \"contenteditable\",\n    \"contextmenu\",\n    \"dir\",\n    \"draggable\",\n    \"dropzone\",\n    \"hidden\",\n    \"id\",\n    \"inert\",\n    \"itemid\",\n    \"itemprop\",\n    \"itemref\",\n    \"itemscope\",\n    \"itemtype\",\n    \"lang\",\n    \"spellcheck\",\n    \"style\",\n    \"tabindex\",\n    \"title\",\n    \"translate\"\n];\n\nvar eventAttributes = [\n    \"onabort\",\n    \"onblur\",\n    \"oncancel\",\n    \"oncanplay\",\n    \"oncanplaythrough\",\n    \"onchange\",\n    \"onclick\",\n    \"onclose\",\n    \"oncontextmenu\",\n    \"oncuechange\",\n    \"ondblclick\",\n    \"ondrag\",\n    \"ondragend\",\n    \"ondragenter\",\n    \"ondragleave\",\n    \"ondragover\",\n    \"ondragstart\",\n    \"ondrop\",\n    \"ondurationchange\",\n    \"onemptied\",\n    \"onended\",\n    \"onerror\",\n    \"onfocus\",\n    \"oninput\",\n    \"oninvalid\",\n    \"onkeydown\",\n    \"onkeypress\",\n    \"onkeyup\",\n    \"onload\",\n    \"onloadeddata\",\n    \"onloadedmetadata\",\n    \"onloadstart\",\n    \"onmousedown\",\n    \"onmousemove\",\n    \"onmouseout\",\n    \"onmouseover\",\n    \"onmouseup\",\n    \"onmousewheel\",\n    \"onpause\",\n    \"onplay\",\n    \"onplaying\",\n    \"onprogress\",\n    \"onratechange\",\n    \"onreset\",\n    \"onscroll\",\n    \"onseeked\",\n    \"onseeking\",\n    \"onselect\",\n    \"onshow\",\n    \"onstalled\",\n    \"onsubmit\",\n    \"onsuspend\",\n    \"ontimeupdate\",\n    \"onvolumechange\",\n    \"onwaiting\"\n];\n\nvar globalAttributes = commonAttributes.concat(eventAttributes);\n\nvar attributeMap = {\n    \"html\": [\"manifest\"],\n    \"head\": [],\n    \"title\": [],\n    \"base\": [\"href\", \"target\"],\n    \"link\": [\"href\", \"hreflang\", \"rel\", \"media\", \"type\", \"sizes\"],\n    \"meta\": [\"http-equiv\", \"name\", \"content\", \"charset\"],\n    \"style\": [\"type\", \"media\", \"scoped\"],\n    \"script\": [\"charset\", \"type\", \"src\", \"defer\", \"async\"],\n    \"noscript\": [\"href\"],\n    \"body\": [\"onafterprint\", \"onbeforeprint\", \"onbeforeunload\", \"onhashchange\", \"onmessage\", \"onoffline\", \"onpopstate\", \"onredo\", \"onresize\", \"onstorage\", \"onundo\", \"onunload\"],\n    \"section\": [],\n    \"nav\": [],\n    \"article\": [\"pubdate\"],\n    \"aside\": [],\n    \"h1\": [],\n    \"h2\": [],\n    \"h3\": [],\n    \"h4\": [],\n    \"h5\": [],\n    \"h6\": [],\n    \"header\": [],\n    \"footer\": [],\n    \"address\": [],\n    \"main\": [],\n    \"p\": [],\n    \"hr\": [],\n    \"pre\": [],\n    \"blockquote\": [\"cite\"],\n    \"ol\": [\"start\", \"reversed\"],\n    \"ul\": [],\n    \"li\": [\"value\"],\n    \"dl\": [],\n    \"dt\": [],\n    \"dd\": [],\n    \"figure\": [],\n    \"figcaption\": [],\n    \"div\": [],\n    \"a\": [\"href\", \"target\", \"ping\", \"rel\", \"media\", \"hreflang\", \"type\"],\n    \"em\": [],\n    \"strong\": [],\n    \"small\": [],\n    \"s\": [],\n    \"cite\": [],\n    \"q\": [\"cite\"],\n    \"dfn\": [],\n    \"abbr\": [],\n    \"data\": [],\n    \"time\": [\"datetime\"],\n    \"code\": [],\n    \"var\": [],\n    \"samp\": [],\n    \"kbd\": [],\n    \"sub\": [],\n    \"sup\": [],\n    \"i\": [],\n    \"b\": [],\n    \"u\": [],\n    \"mark\": [],\n    \"ruby\": [],\n    \"rt\": [],\n    \"rp\": [],\n    \"bdi\": [],\n    \"bdo\": [],\n    \"span\": [],\n    \"br\": [],\n    \"wbr\": [],\n    \"ins\": [\"cite\", \"datetime\"],\n    \"del\": [\"cite\", \"datetime\"],\n    \"img\": [\"alt\", \"src\", \"height\", \"width\", \"usemap\", \"ismap\"],\n    \"iframe\": [\"name\", \"src\", \"height\", \"width\", \"sandbox\", \"seamless\"],\n    \"embed\": [\"src\", \"height\", \"width\", \"type\"],\n    \"object\": [\"param\", \"data\", \"type\", \"height\" , \"width\", \"usemap\", \"name\", \"form\", \"classid\"],\n    \"param\": [\"name\", \"value\"],\n    \"video\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\", \"width\", \"height\", \"poster\"],\n    \"audio\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\"],\n    \"source\": [\"src\", \"type\", \"media\"],\n    \"track\": [\"kind\", \"src\", \"srclang\", \"label\", \"default\"],\n    \"canvas\": [\"width\", \"height\"],\n    \"map\": [\"name\"],\n    \"area\": [\"shape\", \"coords\", \"href\", \"hreflang\", \"alt\", \"target\", \"media\", \"rel\", \"ping\", \"type\"],\n    \"svg\": [],\n    \"math\": [],\n    \"table\": [\"summary\"],\n    \"caption\": [],\n    \"colgroup\": [\"span\"],\n    \"col\": [\"span\"],\n    \"tbody\": [],\n    \"thead\": [],\n    \"tfoot\": [],\n    \"tr\": [],\n    \"td\": [\"headers\", \"rowspan\", \"colspan\"],\n    \"th\": [\"headers\", \"rowspan\", \"colspan\", \"scope\"],\n    \"form\": [\"accept-charset\", \"action\", \"autocomplete\", \"enctype\", \"method\", \"name\", \"novalidate\", \"target\"],\n    \"fieldset\": [\"disabled\", \"form\", \"name\"],\n    \"legend\": [],\n    \"label\": [\"form\", \"for\"],\n    \"input\": [\"type\", \"accept\", \"alt\", \"autocomplete\", \"checked\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"height\", \"list\", \"max\", \"maxlength\", \"min\", \"multiple\", \"pattern\", \"placeholder\", \"readonly\", \"required\", \"size\", \"src\", \"step\", \"width\", \"files\", \"value\"],\n    \"button\": [\"autofocus\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"name\", \"value\", \"type\"],\n    \"select\": [\"autofocus\", \"disabled\", \"form\", \"multiple\", \"name\", \"size\"],\n    \"datalist\": [],\n    \"optgroup\": [\"disabled\", \"label\"],\n    \"option\": [\"disabled\", \"selected\", \"label\", \"value\"],\n    \"textarea\": [\"autofocus\", \"disabled\", \"form\", \"maxlength\", \"name\", \"placeholder\", \"readonly\", \"required\", \"rows\", \"cols\", \"wrap\"],\n    \"keygen\": [\"autofocus\", \"challenge\", \"disabled\", \"form\", \"keytype\", \"name\"],\n    \"output\": [\"for\", \"form\", \"name\"],\n    \"progress\": [\"value\", \"max\"],\n    \"meter\": [\"value\", \"min\", \"max\", \"low\", \"high\", \"optimum\"],\n    \"details\": [\"open\"],\n    \"summary\": [],\n    \"command\": [\"type\", \"label\", \"icon\", \"disabled\", \"checked\", \"radiogroup\", \"command\"],\n    \"menu\": [\"type\", \"label\"],\n    \"dialog\": [\"open\"]\n};\n\nvar elements = Object.keys(attributeMap);\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nfunction findTagName(session, pos) {\n    var iterator = new TokenIterator(session, pos.row, pos.column);\n    var token = iterator.getCurrentToken();\n    while (token && !is(token, \"tag-name\")){\n        token = iterator.stepBackward();\n    }\n    if (token)\n        return token.value;\n}\n\nvar HtmlCompletions = function() {\n\n};\n\n(function() {\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        var token = session.getTokenAt(pos.row, pos.column);\n\n        if (!token)\n            return [];\n        if (is(token, \"tag-name\") || is(token, \"tag-open\") || is(token, \"end-tag-open\"))\n            return this.getTagCompletions(state, session, pos, prefix);\n        if (is(token, \"tag-whitespace\") || is(token, \"attribute-name\"))\n            return this.getAttributeCompetions(state, session, pos, prefix);\n\n        return [];\n    };\n\n    this.getTagCompletions = function(state, session, pos, prefix) {\n        return elements.map(function(element){\n            return {\n                value: element,\n                meta: \"tag\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n    this.getAttributeCompetions = function(state, session, pos, prefix) {\n        var tagName = findTagName(session, pos);\n        if (!tagName)\n            return [];\n        var attributes = globalAttributes;\n        if (tagName in attributeMap) {\n            attributes = attributes.concat(attributeMap[tagName]);\n        }\n        return attributes.map(function(attribute){\n            return {\n                caption: attribute,\n                snippet: attribute + '=\"$0\"',\n                meta: \"attribute\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n}).call(HtmlCompletions.prototype);\n\nexports.HtmlCompletions = HtmlCompletions;\n});\n\nace.define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar HtmlFoldMode = require(\"./folding/html\").FoldMode;\nvar HtmlCompletions = require(\"./html_completions\").HtmlCompletions;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar voidElements = [\"area\", \"base\", \"br\", \"col\", \"embed\", \"hr\", \"img\", \"input\", \"keygen\", \"link\", \"meta\", \"menuitem\", \"param\", \"source\", \"track\", \"wbr\"];\nvar optionalEndTags = [\"li\", \"dt\", \"dd\", \"p\", \"rt\", \"rp\", \"optgroup\", \"option\", \"colgroup\", \"td\", \"th\"];\n\nvar Mode = function(options) {\n    this.fragmentContext = options && options.fragmentContext;\n    this.HighlightRules = HtmlHighlightRules;\n    this.$behaviour = new XmlBehaviour();\n    this.$completer = new HtmlCompletions();\n    \n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"css-\": CssMode\n    });\n    \n    this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags));\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n    this.voidElements = lang.arrayToMap(voidElements);\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        return this.$completer.getCompletions(state, session, pos, prefix);\n    };\n\n    this.createWorker = function(session) {\n        if (this.constructor != Mode)\n            return;\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/html_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        if (this.fragmentContext)\n            worker.call(\"setOptions\", [{context: this.fragmentContext}]);\n\n        worker.on(\"error\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/html\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/ruby_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar constantOtherSymbol = exports.constantOtherSymbol = {\n    token : \"constant.other.symbol.ruby\", // symbol\n    regex : \"[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?\"\n};\n\nvar qString = exports.qString = {\n    token : \"string\", // single line\n    regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n};\n\nvar qqString = exports.qqString = {\n    token : \"string\", // single line\n    regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n};\n\nvar tString = exports.tString = {\n    token : \"string\", // backtick string\n    regex : \"[`](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[`]\"\n};\n\nvar constantNumericHex = exports.constantNumericHex = {\n    token : \"constant.numeric\", // hex\n    regex : \"0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\\\b\"\n};\n\nvar constantNumericFloat = exports.constantNumericFloat = {\n    token : \"constant.numeric\", // float\n    regex : \"[+-]?\\\\d(?:\\\\d|_(?=\\\\d))*(?:(?:\\\\.\\\\d(?:\\\\d|_(?=\\\\d))*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n};\n\nvar RubyHighlightRules = function() {\n\n    var builtinFunctions = (\n        \"abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|\" +\n        \"assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|\" +\n        \"assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|\" +\n        \"assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|\" +\n        \"assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|\" +\n        \"assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|\" +\n        \"attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|\" +\n        \"caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|\" +\n        \"exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|\" +\n        \"gsub!|get_via_redirect|host!|https?|https!|include|Integer|lambda|link_to|\" +\n        \"link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|\" +\n        \"p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|\" +\n        \"raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|\" +\n        \"set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|\" +\n        \"throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|\" +\n        \"render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|\" +\n        \"content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|\" +\n        \"fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|\" +\n        \"time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|\" +\n        \"select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|\" +\n        \"file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|\" +\n        \"protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|\" +\n        \"send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|\" +\n        \"validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|\" +\n        \"validates_inclusion_of|validates_numericality_of|validates_with|validates_each|\" +\n        \"authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|\" +\n        \"filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|\" +\n        \"translate|localize|extract_locale_from_tld|caches_page|expire_page|caches_action|expire_action|\" +\n        \"cache|expire_fragment|expire_cache_for|observe|cache_sweeper|\" +\n        \"has_many|has_one|belongs_to|has_and_belongs_to_many\"\n    );\n\n    var keywords = (\n        \"alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|\" +\n        \"__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|\" +\n        \"redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield\"\n    );\n\n    var buildinConstants = (\n        \"true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|\" +\n        \"RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING\"\n    );\n\n    var builtinVariables = (\n        \"\\$DEBUG|\\$defout|\\$FILENAME|\\$LOAD_PATH|\\$SAFE|\\$stdin|\\$stdout|\\$stderr|\\$VERBOSE|\" +\n        \"$!|root_url|flash|session|cookies|params|request|response|logger|self\"\n    );\n\n    var keywordMapper = this.$keywords = this.createKeywordMapper({\n        \"keyword\": keywords,\n        \"constant.language\": buildinConstants,\n        \"variable.language\": builtinVariables,\n        \"support.function\": builtinFunctions,\n        \"invalid.deprecated\": \"debugger\" // TODO is this a remnant from js mode?\n    }, \"identifier\");\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"#.*$\"\n            }, {\n                token : \"comment\", // multi line comment\n                regex : \"^=begin(?:$|\\\\s.*$)\",\n                next : \"comment\"\n            }, {\n                token : \"string.regexp\",\n                regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"\n            },\n\n            [{\n                regex: \"[{}]\", onMatch: function(val, state, stack) {\n                    this.next = val == \"{\" ? this.nextState : \"\";\n                    if (val == \"{\" && stack.length) {\n                        stack.unshift(\"start\", state);\n                        return \"paren.lparen\";\n                    }\n                    if (val == \"}\" && stack.length) {\n                        stack.shift();\n                        this.next = stack.shift();\n                        if (this.next.indexOf(\"string\") != -1)\n                            return \"paren.end\";\n                    }\n                    return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n                },\n                nextState: \"start\"\n            }, {\n                token : \"string.start\",\n                regex : /\"/,\n                push  : [{\n                    token : \"constant.language.escape\",\n                    regex : /\\\\(?:[nsrtvfbae'\"\\\\]|c.|C-.|M-.(?:\\\\C-.)?|[0-7]{3}|x[\\da-fA-F]{2}|u[\\da-fA-F]{4})/\n                }, {\n                    token : \"paren.start\",\n                    regex : /\\#{/,\n                    push  : \"start\"\n                }, {\n                    token : \"string.end\",\n                    regex : /\"/,\n                    next  : \"pop\"\n                }, {\n                    defaultToken: \"string\"\n                }]\n            }, {\n                token : \"string.start\",\n                regex : /`/,\n                push  : [{\n                    token : \"constant.language.escape\",\n                    regex : /\\\\(?:[nsrtvfbae'\"\\\\]|c.|C-.|M-.(?:\\\\C-.)?|[0-7]{3}|x[\\da-fA-F]{2}|u[\\da-fA-F]{4})/\n                }, {\n                    token : \"paren.start\",\n                    regex : /\\#{/,\n                    push  : \"start\"\n                }, {\n                    token : \"string.end\",\n                    regex : /`/,\n                    next  : \"pop\"\n                }, {\n                    defaultToken: \"string\"\n                }]\n            }, {\n                token : \"string.start\",\n                regex : /'/,\n                push  : [{\n                    token : \"constant.language.escape\",\n                    regex : /\\\\['\\\\]/\n                },  {\n                    token : \"string.end\",\n                    regex : /'/,\n                    next  : \"pop\"\n                }, {\n                    defaultToken: \"string\"\n                }]\n            }],\n\n            {\n                token : \"text\", // namespaces aren't symbols\n                regex : \"::\"\n            }, {\n                token : \"variable.instance\", // instance variable\n                regex : \"@{1,2}[a-zA-Z_\\\\d]+\"\n            }, {\n                token : \"support.class\", // class name\n                regex : \"[A-Z][a-zA-Z_\\\\d]+\"\n            },\n\n            constantOtherSymbol,\n            constantNumericHex,\n            constantNumericFloat,\n\n            {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"punctuation.separator.key-value\",\n                regex : \"=>\"\n            }, {\n                stateName: \"heredoc\",\n                onMatch : function(value, currentState, stack) {\n                    var next = value[2] == '-' ? \"indentedHeredoc\" : \"heredoc\";\n                    var tokens = value.split(this.splitRegex);\n                    stack.push(next, tokens[3]);\n                    return [\n                        {type:\"constant\", value: tokens[1]},\n                        {type:\"string\", value: tokens[2]},\n                        {type:\"support.class\", value: tokens[3]},\n                        {type:\"string\", value: tokens[4]}\n                    ];\n                },\n                regex : \"(<<-?)(['\\\"`]?)([\\\\w]+)(['\\\"`]?)\",\n                rules: {\n                    heredoc: [{\n                        onMatch:  function(value, currentState, stack) {\n                            if (value === stack[1]) {\n                                stack.shift();\n                                stack.shift();\n                                this.next = stack[0] || \"start\";\n                                return \"support.class\";\n                            }\n                            this.next = \"\";\n                            return \"string\";\n                        },\n                        regex: \".*$\",\n                        next: \"start\"\n                    }],\n                    indentedHeredoc: [{\n                        token: \"string\",\n                        regex: \"^ +\"\n                    }, {\n                        onMatch:  function(value, currentState, stack) {\n                            if (value === stack[1]) {\n                                stack.shift();\n                                stack.shift();\n                                this.next = stack[0] || \"start\";\n                                return \"support.class\";\n                            }\n                            this.next = \"\";\n                            return \"string\";\n                        },\n                        regex: \".*$\",\n                        next: \"start\"\n                    }]\n                }\n            }, {\n                regex : \"$\",\n                token : \"empty\",\n                next : function(currentState, stack) {\n                    if (stack[0] === \"heredoc\" || stack[0] === \"indentedHeredoc\")\n                        return stack[0];\n                    return currentState;\n                }\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \"^=end(?:$|\\\\s.*$)\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(RubyHighlightRules, TextHighlightRules);\n\nexports.RubyHighlightRules = RubyHighlightRules;\n});\n\nace.define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var range = this.indentationBlock(session, row);\n        if (range)\n            return range;\n\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1 || line[startLevel] != \"#\")\n            return;\n\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var level = line.search(re);\n\n            if (level == -1)\n                continue;\n\n            if (line[level] != \"#\")\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        var next = session.getLine(row + 1);\n        var prev = session.getLine(row - 1);\n        var prevIndent = prev.search(/\\S/);\n        var nextIndent = next.search(/\\S/);\n\n        if (indent == -1) {\n            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? \"start\" : \"\";\n            return \"\";\n        }\n        if (prevIndent == -1) {\n            if (indent == nextIndent && line[indent] == \"#\" && next[indent] == \"#\") {\n                session.foldWidgets[row - 1] = \"\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"start\";\n            }\n        } else if (prevIndent == indent && line[indent] == \"#\" && prev[indent] == \"#\") {\n            if (session.getLine(row - 2).search(/\\S/) == -1) {\n                session.foldWidgets[row - 1] = \"start\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"\";\n            }\n        }\n\n        if (prevIndent!= -1 && prevIndent < indent)\n            session.foldWidgets[row - 1] = \"start\";\n        else\n            session.foldWidgets[row - 1] = \"\";\n\n        if (indent < nextIndent)\n            return \"start\";\n        else\n            return \"\";\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/ruby\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/ruby_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/coffee\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar RubyHighlightRules = require(\"./ruby_highlight_rules\").RubyHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar FoldMode = require(\"./folding/coffee\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = RubyHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n\n    this.lineCommentStart = \"#\";\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            var startingClassOrMethod = line.match(/^\\s*(class|def|module)\\s.*$/);\n            var startingDoBlock = line.match(/.*do(\\s*|\\s+\\|.*\\|\\s*)$/);\n            var startingConditional = line.match(/^\\s*(if|else)\\s*/)\n            if (match || startingClassOrMethod || startingDoBlock || startingConditional) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return /^\\s+(end|else)$/.test(line + input) || this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, session, row) {\n        var line = session.getLine(row);\n        if (/}/.test(line))\n            return this.$outdent.autoOutdent(session, row);\n        var indent = this.$getIndent(line);\n        var prevLine = session.getLine(row - 1);\n        var prevIndent = this.$getIndent(prevLine);\n        var tab = session.getTabString();\n        if (prevIndent.length <= indent.length) {\n            if (indent.slice(-tab.length) == tab)\n                session.remove(new Range(row, indent.length-tab.length, row, indent.length));\n        }\n    };\n\n    this.$id = \"ace/mode/ruby\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/ejs\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/lib/oop\",\"ace/mode/html\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/ruby\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\n\nvar EjsHighlightRules = function(start, end) {\n    HtmlHighlightRules.call(this);\n    \n    if (!start)\n        start = \"(?:<%|<\\\\?|{{)\";\n    if (!end)\n        end = \"(?:%>|\\\\?>|}})\";\n\n    for (var i in this.$rules) {\n        this.$rules[i].unshift({\n            token : \"markup.list.meta.tag\",\n            regex : start + \"(?![>}])[-=]?\",\n            push  : \"ejs-start\"\n        });\n    }\n    \n    this.embedRules(JavaScriptHighlightRules, \"ejs-\");\n    \n    this.$rules[\"ejs-start\"].unshift({\n        token : \"markup.list.meta.tag\",\n        regex : \"-?\" + end,\n        next  : \"pop\"\n    }, {\n        token: \"comment\",\n        regex: \"//.*?\" + end,\n        next: \"pop\"\n    });\n\n    this.$rules[\"ejs-no_regex\"].unshift({\n        token : \"markup.list.meta.tag\",\n        regex : \"-?\" + end,\n        next  : \"pop\"\n    }, {\n        token: \"comment\",\n        regex: \"//.*?\" + end,\n        next: \"pop\"\n    });\n    \n    this.normalizeRules();\n};\n\n\noop.inherits(EjsHighlightRules, HtmlHighlightRules);\n\nexports.EjsHighlightRules = EjsHighlightRules;\n\n\nvar oop = require(\"../lib/oop\");\nvar HtmlMode = require(\"./html\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\nvar RubyMode = require(\"./ruby\").Mode;\n\nvar Mode = function() {\n    HtmlMode.call(this);\n    this.HighlightRules = EjsHighlightRules;    \n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"css-\": CssMode,\n        \"ejs-\": JavaScriptMode\n    });\n};\noop.inherits(Mode, HtmlMode);\n\n(function() {\n\n    this.$id = \"ace/mode/ejs\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-elixir.js",
    "content": "ace.define(\"ace/mode/elixir_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar ElixirHighlightRules = function() {\n\n    this.$rules = { start: \n       [ { token: \n            [ 'meta.module.elixir',\n              'keyword.control.module.elixir',\n              'meta.module.elixir',\n              'entity.name.type.module.elixir' ],\n           regex: '^(\\\\s*)(defmodule)(\\\\s+)((?:[A-Z]\\\\w*\\\\s*\\\\.\\\\s*)*[A-Z]\\\\w*)' },\n         { token: 'comment.documentation.heredoc',\n           regex: '@(?:module|type)?doc (?:~[a-z])?\"\"\"',\n           push: \n            [ { token: 'comment.documentation.heredoc',\n                regex: '\\\\s*\"\"\"',\n                next: 'pop' },\n              { include: '#interpolated_elixir' },\n              { include: '#escaped_char' },\n              { defaultToken: 'comment.documentation.heredoc' } ],\n           comment: '@doc with heredocs is treated as documentation' },\n         { token: 'comment.documentation.heredoc',\n           regex: '@(?:module|type)?doc ~[A-Z]\"\"\"',\n           push: \n            [ { token: 'comment.documentation.heredoc',\n                regex: '\\\\s*\"\"\"',\n                next: 'pop' },\n              { defaultToken: 'comment.documentation.heredoc' } ],\n           comment: '@doc with heredocs is treated as documentation' },\n         { token: 'comment.documentation.heredoc',\n           regex: '@(?:module|type)?doc (?:~[a-z])?\\'\\'\\'',\n           push: \n            [ { token: 'comment.documentation.heredoc',\n                regex: '\\\\s*\\'\\'\\'',\n                next: 'pop' },\n              { include: '#interpolated_elixir' },\n              { include: '#escaped_char' },\n              { defaultToken: 'comment.documentation.heredoc' } ],\n           comment: '@doc with heredocs is treated as documentation' },\n         { token: 'comment.documentation.heredoc',\n           regex: '@(?:module|type)?doc ~[A-Z]\\'\\'\\'',\n           push: \n            [ { token: 'comment.documentation.heredoc',\n                regex: '\\\\s*\\'\\'\\'',\n                next: 'pop' },\n              { defaultToken: 'comment.documentation.heredoc' } ],\n           comment: '@doc with heredocs is treated as documentation' },\n         { token: 'comment.documentation.false',\n           regex: '@(?:module|type)?doc false',\n           comment: '@doc false is treated as documentation' },\n         { token: 'comment.documentation.string',\n           regex: '@(?:module|type)?doc \"',\n           push: \n            [ { token: 'comment.documentation.string',\n                regex: '\"',\n                next: 'pop' },\n              { include: '#interpolated_elixir' },\n              { include: '#escaped_char' },\n              { defaultToken: 'comment.documentation.string' } ],\n           comment: '@doc with string is treated as documentation' },\n         { token: 'keyword.control.elixir',\n           regex: '\\\\b(?:do|end|case|bc|lc|for|if|cond|unless|try|receive|fn|defmodule|defp?|defprotocol|defimpl|defrecord|defstruct|defmacrop?|defdelegate|defcallback|defmacrocallback|defexception|defoverridable|exit|after|rescue|catch|else|raise|throw|import|require|alias|use|quote|unquote|super)\\\\b(?![?!])',\n           TODO: 'FIXME: regexp doesn\\'t have js equivalent',\n           originalRegex: '(?<!\\\\.)\\\\b(do|end|case|bc|lc|for|if|cond|unless|try|receive|fn|defmodule|defp?|defprotocol|defimpl|defrecord|defstruct|defmacrop?|defdelegate|defcallback|defmacrocallback|defexception|defoverridable|exit|after|rescue|catch|else|raise|throw|import|require|alias|use|quote|unquote|super)\\\\b(?![?!])' },\n         { token: 'keyword.operator.elixir',\n           regex: '\\\\b(?:and|not|or|when|xor|in|inlist|inbits)\\\\b',\n           TODO: 'FIXME: regexp doesn\\'t have js equivalent',\n           originalRegex: '(?<!\\\\.)\\\\b(and|not|or|when|xor|in|inlist|inbits)\\\\b',\n           comment: ' as above, just doesn\\'t need a \\'end\\' and does a logic operation' },\n         { token: 'constant.language.elixir',\n           regex: '\\\\b(?:nil|true|false)\\\\b(?![?!])' },\n         { token: 'variable.language.elixir',\n           regex: '\\\\b__(?:CALLER|ENV|MODULE|DIR)__\\\\b(?![?!])' },\n         { token: \n            [ 'punctuation.definition.variable.elixir',\n              'variable.other.readwrite.module.elixir' ],\n           regex: '(@)([a-zA-Z_]\\\\w*)' },\n         { token: \n            [ 'punctuation.definition.variable.elixir',\n              'variable.other.anonymous.elixir' ],\n           regex: '(&)(\\\\d*)' },\n         { token: 'variable.other.constant.elixir',\n           regex: '\\\\b[A-Z]\\\\w*\\\\b' },\n         { token: 'constant.numeric.elixir',\n           regex: '\\\\b(?:0x[\\\\da-fA-F](?:_?[\\\\da-fA-F])*|\\\\d(?:_?\\\\d)*(?:\\\\.(?![^[:space:][:digit:]])(?:_?\\\\d)*)?(?:[eE][-+]?\\\\d(?:_?\\\\d)*)?|0b[01]+|0o[0-7]+)\\\\b',\n           TODO: 'FIXME: regexp doesn\\'t have js equivalent',\n           originalRegex: '\\\\b(0x\\\\h(?>_?\\\\h)*|\\\\d(?>_?\\\\d)*(\\\\.(?![^[:space:][:digit:]])(?>_?\\\\d)*)?([eE][-+]?\\\\d(?>_?\\\\d)*)?|0b[01]+|0o[0-7]+)\\\\b' },\n         { token: 'punctuation.definition.constant.elixir',\n           regex: ':\\'',\n           push: \n            [ { token: 'punctuation.definition.constant.elixir',\n                regex: '\\'',\n                next: 'pop' },\n              { include: '#interpolated_elixir' },\n              { include: '#escaped_char' },\n              { defaultToken: 'constant.other.symbol.single-quoted.elixir' } ] },\n         { token: 'punctuation.definition.constant.elixir',\n           regex: ':\"',\n           push: \n            [ { token: 'punctuation.definition.constant.elixir',\n                regex: '\"',\n                next: 'pop' },\n              { include: '#interpolated_elixir' },\n              { include: '#escaped_char' },\n              { defaultToken: 'constant.other.symbol.double-quoted.elixir' } ] },\n         { token: 'punctuation.definition.string.begin.elixir',\n           regex: '(?:\\'\\'\\')',\n           TODO: 'FIXME: regexp doesn\\'t have js equivalent',\n           originalRegex: '(?>\\'\\'\\')',\n           push: \n            [ { token: 'punctuation.definition.string.end.elixir',\n                regex: '^\\\\s*\\'\\'\\'',\n                next: 'pop' },\n              { include: '#interpolated_elixir' },\n              { include: '#escaped_char' },\n              { defaultToken: 'support.function.variable.quoted.single.heredoc.elixir' } ],\n           comment: 'Single-quoted heredocs' },\n         { token: 'punctuation.definition.string.begin.elixir',\n           regex: '\\'',\n           push: \n            [ { token: 'punctuation.definition.string.end.elixir',\n                regex: '\\'',\n                next: 'pop' },\n              { include: '#interpolated_elixir' },\n              { include: '#escaped_char' },\n              { defaultToken: 'support.function.variable.quoted.single.elixir' } ],\n           comment: 'single quoted string (allows for interpolation)' },\n         { token: 'punctuation.definition.string.begin.elixir',\n           regex: '(?:\"\"\")',\n           TODO: 'FIXME: regexp doesn\\'t have js equivalent',\n           originalRegex: '(?>\"\"\")',\n           push: \n            [ { token: 'punctuation.definition.string.end.elixir',\n                regex: '^\\\\s*\"\"\"',\n                next: 'pop' },\n              { include: '#interpolated_elixir' },\n              { include: '#escaped_char' },\n              { defaultToken: 'string.quoted.double.heredoc.elixir' } ],\n           comment: 'Double-quoted heredocs' },\n         { token: 'punctuation.definition.string.begin.elixir',\n           regex: '\"',\n           push: \n            [ { token: 'punctuation.definition.string.end.elixir',\n                regex: '\"',\n                next: 'pop' },\n              { include: '#interpolated_elixir' },\n              { include: '#escaped_char' },\n              { defaultToken: 'string.quoted.double.elixir' } ],\n           comment: 'double quoted string (allows for interpolation)' },\n         { token: 'punctuation.definition.string.begin.elixir',\n           regex: '~[a-z](?:\"\"\")',\n           TODO: 'FIXME: regexp doesn\\'t have js equivalent',\n           originalRegex: '~[a-z](?>\"\"\")',\n           push: \n            [ { token: 'punctuation.definition.string.end.elixir',\n                regex: '^\\\\s*\"\"\"',\n                next: 'pop' },\n              { include: '#interpolated_elixir' },\n              { include: '#escaped_char' },\n              { defaultToken: 'string.quoted.double.heredoc.elixir' } ],\n           comment: 'Double-quoted heredocs sigils' },\n         { token: 'punctuation.definition.string.begin.elixir',\n           regex: '~[a-z]\\\\{',\n           push: \n            [ { token: 'punctuation.definition.string.end.elixir',\n                regex: '\\\\}[a-z]*',\n                next: 'pop' },\n              { include: '#interpolated_elixir' },\n              { include: '#escaped_char' },\n              { defaultToken: 'string.interpolated.elixir' } ],\n           comment: 'sigil (allow for interpolation)' },\n         { token: 'punctuation.definition.string.begin.elixir',\n           regex: '~[a-z]\\\\[',\n           push: \n            [ { token: 'punctuation.definition.string.end.elixir',\n                regex: '\\\\][a-z]*',\n                next: 'pop' },\n              { include: '#interpolated_elixir' },\n              { include: '#escaped_char' },\n              { defaultToken: 'string.interpolated.elixir' } ],\n           comment: 'sigil (allow for interpolation)' },\n         { token: 'punctuation.definition.string.begin.elixir',\n           regex: '~[a-z]\\\\<',\n           push: \n            [ { token: 'punctuation.definition.string.end.elixir',\n                regex: '\\\\>[a-z]*',\n                next: 'pop' },\n              { include: '#interpolated_elixir' },\n              { include: '#escaped_char' },\n              { defaultToken: 'string.interpolated.elixir' } ],\n           comment: 'sigil (allow for interpolation)' },\n         { token: 'punctuation.definition.string.begin.elixir',\n           regex: '~[a-z]\\\\(',\n           push: \n            [ { token: 'punctuation.definition.string.end.elixir',\n                regex: '\\\\)[a-z]*',\n                next: 'pop' },\n              { include: '#interpolated_elixir' },\n              { include: '#escaped_char' },\n              { defaultToken: 'string.interpolated.elixir' } ],\n           comment: 'sigil (allow for interpolation)' },\n         { token: 'punctuation.definition.string.begin.elixir',\n           regex: '~[a-z][^\\\\w]',\n           push: \n            [ { token: 'punctuation.definition.string.end.elixir',\n                regex: '[^\\\\w][a-z]*',\n                next: 'pop' },\n              { include: '#interpolated_elixir' },\n              { include: '#escaped_char' },\n              { include: '#escaped_char' },\n              { defaultToken: 'string.interpolated.elixir' } ],\n           comment: 'sigil (allow for interpolation)' },\n         { token: 'punctuation.definition.string.begin.elixir',\n           regex: '~[A-Z](?:\"\"\")',\n           TODO: 'FIXME: regexp doesn\\'t have js equivalent',\n           originalRegex: '~[A-Z](?>\"\"\")',\n           push: \n            [ { token: 'punctuation.definition.string.end.elixir',\n                regex: '^\\\\s*\"\"\"',\n                next: 'pop' },\n              { defaultToken: 'string.quoted.other.literal.upper.elixir' } ],\n           comment: 'Double-quoted heredocs sigils' },\n         { token: 'punctuation.definition.string.begin.elixir',\n           regex: '~[A-Z]\\\\{',\n           push: \n            [ { token: 'punctuation.definition.string.end.elixir',\n                regex: '\\\\}[a-z]*',\n                next: 'pop' },\n              { defaultToken: 'string.quoted.other.literal.upper.elixir' } ],\n           comment: 'sigil (without interpolation)' },\n         { token: 'punctuation.definition.string.begin.elixir',\n           regex: '~[A-Z]\\\\[',\n           push: \n            [ { token: 'punctuation.definition.string.end.elixir',\n                regex: '\\\\][a-z]*',\n                next: 'pop' },\n              { defaultToken: 'string.quoted.other.literal.upper.elixir' } ],\n           comment: 'sigil (without interpolation)' },\n         { token: 'punctuation.definition.string.begin.elixir',\n           regex: '~[A-Z]\\\\<',\n           push: \n            [ { token: 'punctuation.definition.string.end.elixir',\n                regex: '\\\\>[a-z]*',\n                next: 'pop' },\n              { defaultToken: 'string.quoted.other.literal.upper.elixir' } ],\n           comment: 'sigil (without interpolation)' },\n         { token: 'punctuation.definition.string.begin.elixir',\n           regex: '~[A-Z]\\\\(',\n           push: \n            [ { token: 'punctuation.definition.string.end.elixir',\n                regex: '\\\\)[a-z]*',\n                next: 'pop' },\n              { defaultToken: 'string.quoted.other.literal.upper.elixir' } ],\n           comment: 'sigil (without interpolation)' },\n         { token: 'punctuation.definition.string.begin.elixir',\n           regex: '~[A-Z][^\\\\w]',\n           push: \n            [ { token: 'punctuation.definition.string.end.elixir',\n                regex: '[^\\\\w][a-z]*',\n                next: 'pop' },\n              { defaultToken: 'string.quoted.other.literal.upper.elixir' } ],\n           comment: 'sigil (without interpolation)' },\n         { token: ['punctuation.definition.constant.elixir', 'constant.other.symbol.elixir'],\n           regex: '(:)([a-zA-Z_][\\\\w@]*(?:[?!]|=(?![>=]))?|\\\\<\\\\>|===?|!==?|<<>>|<<<|>>>|~~~|::|<\\\\-|\\\\|>|=>|~|~=|=|/|\\\\\\\\\\\\\\\\|\\\\*\\\\*?|\\\\.\\\\.?\\\\.?|>=?|<=?|&&?&?|\\\\+\\\\+?|\\\\-\\\\-?|\\\\|\\\\|?\\\\|?|\\\\!|@|\\\\%?\\\\{\\\\}|%|\\\\[\\\\]|\\\\^(?:\\\\^\\\\^)?)',\n           TODO: 'FIXME: regexp doesn\\'t have js equivalent',\n           originalRegex: '(?<!:)(:)(?>[a-zA-Z_][\\\\w@]*(?>[?!]|=(?![>=]))?|\\\\<\\\\>|===?|!==?|<<>>|<<<|>>>|~~~|::|<\\\\-|\\\\|>|=>|~|~=|=|/|\\\\\\\\\\\\\\\\|\\\\*\\\\*?|\\\\.\\\\.?\\\\.?|>=?|<=?|&&?&?|\\\\+\\\\+?|\\\\-\\\\-?|\\\\|\\\\|?\\\\|?|\\\\!|@|\\\\%?\\\\{\\\\}|%|\\\\[\\\\]|\\\\^(\\\\^\\\\^)?)',\n           comment: 'symbols' },\n         { token: 'punctuation.definition.constant.elixir',\n           regex: '(?:[a-zA-Z_][\\\\w@]*(?:[?!])?):(?!:)',\n           TODO: 'FIXME: regexp doesn\\'t have js equivalent',\n           originalRegex: '(?>[a-zA-Z_][\\\\w@]*(?>[?!])?)(:)(?!:)',\n           comment: 'symbols' },\n         { token: \n            [ 'punctuation.definition.comment.elixir',\n              'comment.line.number-sign.elixir' ],\n           regex: '(#)(.*)' },\n         { token: 'constant.numeric.elixir',\n           regex: '\\\\?(?:\\\\\\\\(?:x[\\\\da-fA-F]{1,2}(?![\\\\da-fA-F])\\\\b|[^xMC])|[^\\\\s\\\\\\\\])',\n           TODO: 'FIXME: regexp doesn\\'t have js equivalent',\n           originalRegex: '(?<!\\\\w)\\\\?(\\\\\\\\(x\\\\h{1,2}(?!\\\\h)\\\\b|[^xMC])|[^\\\\s\\\\\\\\])',\n           comment: '\\n\\t\\t\\tmatches questionmark-letters.\\n\\n\\t\\t\\texamples (1st alternation = hex):\\n\\t\\t\\t?\\\\x1     ?\\\\x61\\n\\n\\t\\t\\texamples (2rd alternation = escaped):\\n\\t\\t\\t?\\\\n      ?\\\\b\\n\\n\\t\\t\\texamples (3rd alternation = normal):\\n\\t\\t\\t?a       ?A       ?0 \\n\\t\\t\\t?*       ?\"       ?( \\n\\t\\t\\t?.       ?#\\n\\t\\t\\t\\n\\t\\t\\tthe negative lookbehind prevents against matching\\n\\t\\t\\tp(42.tainted?)\\n\\t\\t\\t' },\n         { token: 'keyword.operator.assignment.augmented.elixir',\n           regex: '\\\\+=|\\\\-=|\\\\|\\\\|=|~=|&&=' },\n         { token: 'keyword.operator.comparison.elixir',\n           regex: '===?|!==?|<=?|>=?' },\n         { token: 'keyword.operator.bitwise.elixir',\n           regex: '\\\\|{3}|&{3}|\\\\^{3}|<{3}|>{3}|~{3}' },\n         { token: 'keyword.operator.logical.elixir',\n           regex: '!+|\\\\bnot\\\\b|&&|\\\\band\\\\b|\\\\|\\\\||\\\\bor\\\\b|\\\\bxor\\\\b',\n           originalRegex: '(?<=[ \\\\t])!+|\\\\bnot\\\\b|&&|\\\\band\\\\b|\\\\|\\\\||\\\\bor\\\\b|\\\\bxor\\\\b' },\n         { token: 'keyword.operator.arithmetic.elixir',\n           regex: '\\\\*|\\\\+|\\\\-|/' },\n         { token: 'keyword.operator.other.elixir',\n           regex: '\\\\||\\\\+\\\\+|\\\\-\\\\-|\\\\*\\\\*|\\\\\\\\\\\\\\\\|\\\\<\\\\-|\\\\<\\\\>|\\\\<\\\\<|\\\\>\\\\>|\\\\:\\\\:|\\\\.\\\\.|\\\\|>|~|=>' },\n         { token: 'keyword.operator.assignment.elixir', regex: '=' },\n         { token: 'punctuation.separator.other.elixir', regex: ':' },\n         { token: 'punctuation.separator.statement.elixir',\n           regex: '\\\\;' },\n         { token: 'punctuation.separator.object.elixir', regex: ',' },\n         { token: 'punctuation.separator.method.elixir', regex: '\\\\.' },\n         { token: 'punctuation.section.scope.elixir', regex: '\\\\{|\\\\}' },\n         { token: 'punctuation.section.array.elixir', regex: '\\\\[|\\\\]' },\n         { token: 'punctuation.section.function.elixir',\n           regex: '\\\\(|\\\\)' } ],\n      '#escaped_char': \n       [ { token: 'constant.character.escape.elixir',\n           regex: '\\\\\\\\(?:x[\\\\da-fA-F]{1,2}|.)' } ],\n      '#interpolated_elixir': \n       [ { token: \n            [ 'source.elixir.embedded.source',\n              'source.elixir.embedded.source.empty' ],\n           regex: '(#\\\\{)(\\\\})' },\n         { todo: \n            { token: 'punctuation.section.embedded.elixir',\n              regex: '#\\\\{',\n              push: \n               [ { token: 'punctuation.section.embedded.elixir',\n                   regex: '\\\\}',\n                   next: 'pop' },\n                 { include: '#nest_curly_and_self' },\n                 { include: '$self' },\n                 { defaultToken: 'source.elixir.embedded.source' } ] } } ],\n      '#nest_curly_and_self': \n       [ { token: 'punctuation.section.scope.elixir',\n           regex: '\\\\{',\n           push: \n            [ { token: 'punctuation.section.scope.elixir',\n                regex: '\\\\}',\n                next: 'pop' },\n              { include: '#nest_curly_and_self' } ] },\n         { include: '$self' } ],\n      '#regex_sub': \n       [ { include: '#interpolated_elixir' },\n         { include: '#escaped_char' },\n         { token: \n            [ 'punctuation.definition.arbitrary-repitition.elixir',\n              'string.regexp.arbitrary-repitition.elixir',\n              'string.regexp.arbitrary-repitition.elixir',\n              'punctuation.definition.arbitrary-repitition.elixir' ],\n           regex: '(\\\\{)(\\\\d+)((?:,\\\\d+)?)(\\\\})' },\n         { token: 'punctuation.definition.character-class.elixir',\n           regex: '\\\\[(?:\\\\^?\\\\])?',\n           push: \n            [ { token: 'punctuation.definition.character-class.elixir',\n                regex: '\\\\]',\n                next: 'pop' },\n              { include: '#escaped_char' },\n              { defaultToken: 'string.regexp.character-class.elixir' } ] },\n         { token: 'punctuation.definition.group.elixir',\n           regex: '\\\\(',\n           push: \n            [ { token: 'punctuation.definition.group.elixir',\n                regex: '\\\\)',\n                next: 'pop' },\n              { include: '#regex_sub' },\n              { defaultToken: 'string.regexp.group.elixir' } ] },\n         { token: \n            [ 'punctuation.definition.comment.elixir',\n              'comment.line.number-sign.elixir' ],\n           regex: '(?:^|\\\\s)(#)(\\\\s[[a-zA-Z0-9,. \\\\t?!-][^\\\\x00-\\\\x7F]]*$)',\n           originalRegex: '(?<=^|\\\\s)(#)\\\\s[[a-zA-Z0-9,. \\\\t?!-][^\\\\x{00}-\\\\x{7F}]]*$',\n           comment: 'We are restrictive in what we allow to go after the comment character to avoid false positives, since the availability of comments depend on regexp flags.' } ] }\n    \n    this.normalizeRules();\n};\n\nElixirHighlightRules.metaData = { comment: 'Textmate bundle for Elixir Programming Language.',\n      fileTypes: [ 'ex', 'exs' ],\n      firstLineMatch: '^#!/.*\\\\belixir',\n      foldingStartMarker: '(after|else|catch|rescue|\\\\-\\\\>|\\\\{|\\\\[|do)\\\\s*$',\n      foldingStopMarker: '^\\\\s*((\\\\}|\\\\]|after|else|catch|rescue)\\\\s*$|end\\\\b)',\n      keyEquivalent: '^~E',\n      name: 'Elixir',\n      scopeName: 'source.elixir' }\n\n\noop.inherits(ElixirHighlightRules, TextHighlightRules);\n\nexports.ElixirHighlightRules = ElixirHighlightRules;\n});\n\nace.define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var range = this.indentationBlock(session, row);\n        if (range)\n            return range;\n\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1 || line[startLevel] != \"#\")\n            return;\n\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var level = line.search(re);\n\n            if (level == -1)\n                continue;\n\n            if (line[level] != \"#\")\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        var next = session.getLine(row + 1);\n        var prev = session.getLine(row - 1);\n        var prevIndent = prev.search(/\\S/);\n        var nextIndent = next.search(/\\S/);\n\n        if (indent == -1) {\n            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? \"start\" : \"\";\n            return \"\";\n        }\n        if (prevIndent == -1) {\n            if (indent == nextIndent && line[indent] == \"#\" && next[indent] == \"#\") {\n                session.foldWidgets[row - 1] = \"\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"start\";\n            }\n        } else if (prevIndent == indent && line[indent] == \"#\" && prev[indent] == \"#\") {\n            if (session.getLine(row - 2).search(/\\S/) == -1) {\n                session.foldWidgets[row - 1] = \"start\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"\";\n            }\n        }\n\n        if (prevIndent!= -1 && prevIndent < indent)\n            session.foldWidgets[row - 1] = \"start\";\n        else\n            session.foldWidgets[row - 1] = \"\";\n\n        if (indent < nextIndent)\n            return \"start\";\n        else\n            return \"\";\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/elixir\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/elixir_highlight_rules\",\"ace/mode/folding/coffee\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar ElixirHighlightRules = require(\"./elixir_highlight_rules\").ElixirHighlightRules;\nvar FoldMode = require(\"./folding/coffee\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = ElixirHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"#\";\n    this.$id = \"ace/mode/elixir\"\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-elm.js",
    "content": "ace.define(\"ace/mode/elm_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar ElmHighlightRules = function() {\n    var keywordMapper = this.createKeywordMapper({\n       \"keyword\": \"as|case|class|data|default|deriving|do|else|export|foreign|\" +\n            \"hiding|jsevent|if|import|in|infix|infixl|infixr|instance|let|\" +\n            \"module|newtype|of|open|then|type|where|_|port|\\u03BB\"\n    }, \"identifier\");\n    \n    var escapeRe = /\\\\(\\d+|['\"\\\\&trnbvf])/;\n    \n    var smallRe = /[a-z_]/.source;\n    var largeRe = /[A-Z]/.source;\n    var idRe = /[a-z_A-Z0-9\\']/.source;\n\n    this.$rules = {\n        start: [{\n            token: \"string.start\",\n            regex: '\"',\n            next: \"string\"\n        }, {\n            token: \"string.character\",\n            regex: \"'(?:\" + escapeRe.source + \"|.)'?\"\n        }, {\n            regex: /0(?:[xX][0-9A-Fa-f]+|[oO][0-7]+)|\\d+(\\.\\d+)?([eE][-+]?\\d*)?/,\n            token: \"constant.numeric\"\n        }, {\n            token : \"keyword\",\n            regex : /\\.\\.|\\||:|=|\\\\|\\\"|->|<-|\\u2192/\n        }, {\n            token : \"keyword.operator\",\n            regex : /[-!#$%&*+.\\/<=>?@\\\\^|~:\\u03BB\\u2192]+/\n        }, {\n            token : \"operator.punctuation\",\n            regex : /[,;`]/\n        }, {\n            regex : largeRe + idRe + \"+\\\\.?\",\n            token : function(value) {\n                if (value[value.length - 1] == \".\")\n                    return \"entity.name.function\"; \n                return \"constant.language\"; \n            }\n        }, {\n            regex : \"^\" + smallRe  + idRe + \"+\",\n            token : function(value) {\n                return \"constant.language\"; \n            }\n        }, {\n            token : keywordMapper,\n            regex : \"[\\\\w\\\\xff-\\\\u218e\\\\u2455-\\\\uffff]+\\\\b\"\n        }, {\n            regex: \"{-#?\",\n            token: \"comment.start\",\n            onMatch: function(value, currentState, stack) {\n                this.next = value.length == 2 ? \"blockComment\" : \"docComment\";\n                return this.token;\n            }\n        }, {\n            token: \"variable.language\",\n            regex: /\\[markdown\\|/,\n            next: \"markdown\"\n        }, {\n            token: \"paren.lparen\",\n            regex: /[\\[({]/ \n        }, {\n            token: \"paren.rparen\",\n            regex: /[\\])}]/\n        }, ],\n        markdown: [{\n            regex: /\\|\\]/,\n            next: \"start\"\n        }, {\n            defaultToken : \"string\"\n        }],\n        blockComment: [{\n            regex: \"{-\",\n            token: \"comment.start\",\n            push: \"blockComment\"\n        }, {\n            regex: \"-}\",\n            token: \"comment.end\",\n            next: \"pop\"\n        }, {\n            defaultToken: \"comment\"\n        }],\n        docComment: [{\n            regex: \"{-\",\n            token: \"comment.start\",\n            push: \"docComment\"\n        }, {\n            regex: \"-}\",\n            token: \"comment.end\",\n            next: \"pop\" \n        }, {\n            defaultToken: \"doc.comment\"\n        }],\n        string: [{\n            token: \"constant.language.escape\",\n            regex: escapeRe,\n        }, {\n            token: \"text\",\n            regex: /\\\\(\\s|$)/,\n            next: \"stringGap\"\n        }, {\n            token: \"string.end\",\n            regex: '\"',\n            next: \"start\"\n        }],\n        stringGap: [{\n            token: \"text\",\n            regex: /\\\\/,\n            next: \"string\"\n        }, {\n            token: \"error\",\n            regex: \"\",\n            next: \"start\"\n        }],\n    };\n    \n    this.normalizeRules();\n};\n\noop.inherits(ElmHighlightRules, TextHighlightRules);\n\nexports.ElmHighlightRules = ElmHighlightRules;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/elm\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/elm_highlight_rules\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar HighlightRules = require(\"./elm_highlight_rules\").ElmHighlightRules;\nvar FoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = HighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"--\";\n    this.blockComment = {start: \"{-\", end: \"-}\"};\n    this.$id = \"ace/mode/elm\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-erlang.js",
    "content": "ace.define(\"ace/mode/erlang_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar ErlangHighlightRules = function() {\n\n    this.$rules = { start: \n       [ { include: '#module-directive' },\n         { include: '#import-export-directive' },\n         { include: '#behaviour-directive' },\n         { include: '#record-directive' },\n         { include: '#define-directive' },\n         { include: '#macro-directive' },\n         { include: '#directive' },\n         { include: '#function' },\n         { include: '#everything-else' } ],\n      '#atom': \n       [ { token: 'punctuation.definition.symbol.begin.erlang',\n           regex: '\\'',\n           push: \n            [ { token: 'punctuation.definition.symbol.end.erlang',\n                regex: '\\'',\n                next: 'pop' },\n              { token: \n                 [ 'punctuation.definition.escape.erlang',\n                   'constant.other.symbol.escape.erlang',\n                   'punctuation.definition.escape.erlang',\n                   'constant.other.symbol.escape.erlang',\n                   'constant.other.symbol.escape.erlang' ],\n                regex: '(\\\\\\\\)(?:([bdefnrstv\\\\\\\\\\'\"])|(\\\\^)([@-_])|([0-7]{1,3}))' },\n              { token: 'invalid.illegal.atom.erlang', regex: '\\\\\\\\\\\\^?.?' },\n              { defaultToken: 'constant.other.symbol.quoted.single.erlang' } ] },\n         { token: 'constant.other.symbol.unquoted.erlang',\n           regex: '[a-z][a-zA-Z\\\\d@_]*' } ],\n      '#behaviour-directive': \n       [ { token: \n            [ 'meta.directive.behaviour.erlang',\n              'punctuation.section.directive.begin.erlang',\n              'meta.directive.behaviour.erlang',\n              'keyword.control.directive.behaviour.erlang',\n              'meta.directive.behaviour.erlang',\n              'punctuation.definition.parameters.begin.erlang',\n              'meta.directive.behaviour.erlang',\n              'entity.name.type.class.behaviour.definition.erlang',\n              'meta.directive.behaviour.erlang',\n              'punctuation.definition.parameters.end.erlang',\n              'meta.directive.behaviour.erlang',\n              'punctuation.section.directive.end.erlang' ],\n           regex: '^(\\\\s*)(-)(\\\\s*)(behaviour)(\\\\s*)(\\\\()(\\\\s*)([a-z][a-zA-Z\\\\d@_]*)(\\\\s*)(\\\\))(\\\\s*)(\\\\.)' } ],\n      '#binary': \n       [ { token: 'punctuation.definition.binary.begin.erlang',\n           regex: '<<',\n           push: \n            [ { token: 'punctuation.definition.binary.end.erlang',\n                regex: '>>',\n                next: 'pop' },\n              { token: \n                 [ 'punctuation.separator.binary.erlang',\n                   'punctuation.separator.value-size.erlang' ],\n                regex: '(,)|(:)' },\n              { include: '#internal-type-specifiers' },\n              { include: '#everything-else' },\n              { defaultToken: 'meta.structure.binary.erlang' } ] } ],\n      '#character': \n       [ { token: \n            [ 'punctuation.definition.character.erlang',\n              'punctuation.definition.escape.erlang',\n              'constant.character.escape.erlang',\n              'punctuation.definition.escape.erlang',\n              'constant.character.escape.erlang',\n              'constant.character.escape.erlang' ],\n           regex: '(\\\\$)(\\\\\\\\)(?:([bdefnrstv\\\\\\\\\\'\"])|(\\\\^)([@-_])|([0-7]{1,3}))' },\n         { token: 'invalid.illegal.character.erlang',\n           regex: '\\\\$\\\\\\\\\\\\^?.?' },\n         { token: \n            [ 'punctuation.definition.character.erlang',\n              'constant.character.erlang' ],\n           regex: '(\\\\$)(\\\\S)' },\n         { token: 'invalid.illegal.character.erlang', regex: '\\\\$.?' } ],\n      '#comment': \n       [ { token: 'punctuation.definition.comment.erlang',\n           regex: '%.*$',\n           push_: \n            [ { token: 'comment.line.percentage.erlang',\n                regex: '$',\n                next: 'pop' },\n              { defaultToken: 'comment.line.percentage.erlang' } ] } ],\n      '#define-directive': \n       [ { token: \n            [ 'meta.directive.define.erlang',\n              'punctuation.section.directive.begin.erlang',\n              'meta.directive.define.erlang',\n              'keyword.control.directive.define.erlang',\n              'meta.directive.define.erlang',\n              'punctuation.definition.parameters.begin.erlang',\n              'meta.directive.define.erlang',\n              'entity.name.function.macro.definition.erlang',\n              'meta.directive.define.erlang',\n              'punctuation.separator.parameters.erlang' ],\n           regex: '^(\\\\s*)(-)(\\\\s*)(define)(\\\\s*)(\\\\()(\\\\s*)([a-zA-Z\\\\d@_]+)(\\\\s*)(,)',\n           push: \n            [ { token: \n                 [ 'punctuation.definition.parameters.end.erlang',\n                   'meta.directive.define.erlang',\n                   'punctuation.section.directive.end.erlang' ],\n                regex: '(\\\\))(\\\\s*)(\\\\.)',\n                next: 'pop' },\n              { include: '#everything-else' },\n              { defaultToken: 'meta.directive.define.erlang' } ] },\n         { token: 'meta.directive.define.erlang',\n           regex: '(?=^\\\\s*-\\\\s*define\\\\s*\\\\(\\\\s*[a-zA-Z\\\\d@_]+\\\\s*\\\\()',\n           push: \n            [ { token: \n                 [ 'punctuation.definition.parameters.end.erlang',\n                   'meta.directive.define.erlang',\n                   'punctuation.section.directive.end.erlang' ],\n                regex: '(\\\\))(\\\\s*)(\\\\.)',\n                next: 'pop' },\n              { token: \n                 [ 'text',\n                   'punctuation.section.directive.begin.erlang',\n                   'text',\n                   'keyword.control.directive.define.erlang',\n                   'text',\n                   'punctuation.definition.parameters.begin.erlang',\n                   'text',\n                   'entity.name.function.macro.definition.erlang',\n                   'text',\n                   'punctuation.definition.parameters.begin.erlang' ],\n                regex: '^(\\\\s*)(-)(\\\\s*)(define)(\\\\s*)(\\\\()(\\\\s*)([a-zA-Z\\\\d@_]+)(\\\\s*)(\\\\()',\n                push: \n                 [ { token: \n                      [ 'punctuation.definition.parameters.end.erlang',\n                        'text',\n                        'punctuation.separator.parameters.erlang' ],\n                     regex: '(\\\\))(\\\\s*)(,)',\n                     next: 'pop' },\n                   { token: 'punctuation.separator.parameters.erlang', regex: ',' },\n                   { include: '#everything-else' } ] },\n              { token: 'punctuation.separator.define.erlang',\n                regex: '\\\\|\\\\||\\\\||:|;|,|\\\\.|->' },\n              { include: '#everything-else' },\n              { defaultToken: 'meta.directive.define.erlang' } ] } ],\n      '#directive': \n       [ { token: \n            [ 'meta.directive.erlang',\n              'punctuation.section.directive.begin.erlang',\n              'meta.directive.erlang',\n              'keyword.control.directive.erlang',\n              'meta.directive.erlang',\n              'punctuation.definition.parameters.begin.erlang' ],\n           regex: '^(\\\\s*)(-)(\\\\s*)([a-z][a-zA-Z\\\\d@_]*)(\\\\s*)(\\\\(?)',\n           push: \n            [ { token: \n                 [ 'punctuation.definition.parameters.end.erlang',\n                   'meta.directive.erlang',\n                   'punctuation.section.directive.end.erlang' ],\n                regex: '(\\\\)?)(\\\\s*)(\\\\.)',\n                next: 'pop' },\n              { include: '#everything-else' },\n              { defaultToken: 'meta.directive.erlang' } ] },\n         { token: \n            [ 'meta.directive.erlang',\n              'punctuation.section.directive.begin.erlang',\n              'meta.directive.erlang',\n              'keyword.control.directive.erlang',\n              'meta.directive.erlang',\n              'punctuation.section.directive.end.erlang' ],\n           regex: '^(\\\\s*)(-)(\\\\s*)([a-z][a-zA-Z\\\\d@_]*)(\\\\s*)(\\\\.)' } ],\n      '#everything-else': \n       [ { include: '#comment' },\n         { include: '#record-usage' },\n         { include: '#macro-usage' },\n         { include: '#expression' },\n         { include: '#keyword' },\n         { include: '#textual-operator' },\n         { include: '#function-call' },\n         { include: '#tuple' },\n         { include: '#list' },\n         { include: '#binary' },\n         { include: '#parenthesized-expression' },\n         { include: '#character' },\n         { include: '#number' },\n         { include: '#atom' },\n         { include: '#string' },\n         { include: '#symbolic-operator' },\n         { include: '#variable' } ],\n      '#expression': \n       [ { token: 'keyword.control.if.erlang',\n           regex: '\\\\bif\\\\b',\n           push: \n            [ { token: 'keyword.control.end.erlang',\n                regex: '\\\\bend\\\\b',\n                next: 'pop' },\n              { include: '#internal-expression-punctuation' },\n              { include: '#everything-else' },\n              { defaultToken: 'meta.expression.if.erlang' } ] },\n         { token: 'keyword.control.case.erlang',\n           regex: '\\\\bcase\\\\b',\n           push: \n            [ { token: 'keyword.control.end.erlang',\n                regex: '\\\\bend\\\\b',\n                next: 'pop' },\n              { include: '#internal-expression-punctuation' },\n              { include: '#everything-else' },\n              { defaultToken: 'meta.expression.case.erlang' } ] },\n         { token: 'keyword.control.receive.erlang',\n           regex: '\\\\breceive\\\\b',\n           push: \n            [ { token: 'keyword.control.end.erlang',\n                regex: '\\\\bend\\\\b',\n                next: 'pop' },\n              { include: '#internal-expression-punctuation' },\n              { include: '#everything-else' },\n              { defaultToken: 'meta.expression.receive.erlang' } ] },\n         { token: \n            [ 'keyword.control.fun.erlang',\n              'text',\n              'entity.name.type.class.module.erlang',\n              'text',\n              'punctuation.separator.module-function.erlang',\n              'text',\n              'entity.name.function.erlang',\n              'text',\n              'punctuation.separator.function-arity.erlang' ],\n           regex: '\\\\b(fun)(\\\\s*)(?:([a-z][a-zA-Z\\\\d@_]*)(\\\\s*)(:)(\\\\s*))?([a-z][a-zA-Z\\\\d@_]*)(\\\\s*)(/)' },\n         { token: 'keyword.control.fun.erlang',\n           regex: '\\\\bfun\\\\b',\n           push: \n            [ { token: 'keyword.control.end.erlang',\n                regex: '\\\\bend\\\\b',\n                next: 'pop' },\n              { token: 'text',\n                regex: '(?=\\\\()',\n                push: \n                 [ { token: 'punctuation.separator.clauses.erlang',\n                     regex: ';|(?=\\\\bend\\\\b)',\n                     next: 'pop' },\n                   { include: '#internal-function-parts' } ] },\n              { include: '#everything-else' },\n              { defaultToken: 'meta.expression.fun.erlang' } ] },\n         { token: 'keyword.control.try.erlang',\n           regex: '\\\\btry\\\\b',\n           push: \n            [ { token: 'keyword.control.end.erlang',\n                regex: '\\\\bend\\\\b',\n                next: 'pop' },\n              { include: '#internal-expression-punctuation' },\n              { include: '#everything-else' },\n              { defaultToken: 'meta.expression.try.erlang' } ] },\n         { token: 'keyword.control.begin.erlang',\n           regex: '\\\\bbegin\\\\b',\n           push: \n            [ { token: 'keyword.control.end.erlang',\n                regex: '\\\\bend\\\\b',\n                next: 'pop' },\n              { include: '#internal-expression-punctuation' },\n              { include: '#everything-else' },\n              { defaultToken: 'meta.expression.begin.erlang' } ] },\n         { token: 'keyword.control.query.erlang',\n           regex: '\\\\bquery\\\\b',\n           push: \n            [ { token: 'keyword.control.end.erlang',\n                regex: '\\\\bend\\\\b',\n                next: 'pop' },\n              { include: '#everything-else' },\n              { defaultToken: 'meta.expression.query.erlang' } ] } ],\n      '#function': \n       [ { token: \n            [ 'meta.function.erlang',\n              'entity.name.function.definition.erlang',\n              'meta.function.erlang' ],\n           regex: '^(\\\\s*)([a-z][a-zA-Z\\\\d@_]*|\\'[^\\']*\\')(\\\\s*)(?=\\\\()',\n           push: \n            [ { token: 'punctuation.terminator.function.erlang',\n                regex: '\\\\.',\n                next: 'pop' },\n              { token: [ 'text', 'entity.name.function.erlang', 'text' ],\n                regex: '^(\\\\s*)([a-z][a-zA-Z\\\\d@_]*|\\'[^\\']*\\')(\\\\s*)(?=\\\\()' },\n              { token: 'text',\n                regex: '(?=\\\\()',\n                push: \n                 [ { token: 'punctuation.separator.clauses.erlang',\n                     regex: ';|(?=\\\\.)',\n                     next: 'pop' },\n                   { include: '#parenthesized-expression' },\n                   { include: '#internal-function-parts' } ] },\n              { include: '#everything-else' },\n              { defaultToken: 'meta.function.erlang' } ] } ],\n      '#function-call': \n       [ { token: 'meta.function-call.erlang',\n           regex: '(?=(?:[a-z][a-zA-Z\\\\d@_]*|\\'[^\\']*\\')\\\\s*(?:\\\\(|:\\\\s*(?:[a-z][a-zA-Z\\\\d@_]*|\\'[^\\']*\\')\\\\s*\\\\())',\n           push: \n            [ { token: 'punctuation.definition.parameters.end.erlang',\n                regex: '\\\\)',\n                next: 'pop' },\n              { token: \n                 [ 'entity.name.type.class.module.erlang',\n                   'text',\n                   'punctuation.separator.module-function.erlang',\n                   'text',\n                   'entity.name.function.guard.erlang',\n                   'text',\n                   'punctuation.definition.parameters.begin.erlang' ],\n                regex: '(?:(erlang)(\\\\s*)(:)(\\\\s*))?(is_atom|is_binary|is_constant|is_float|is_function|is_integer|is_list|is_number|is_pid|is_port|is_reference|is_tuple|is_record|abs|element|hd|length|node|round|self|size|tl|trunc)(\\\\s*)(\\\\()',\n                push: \n                 [ { token: 'text', regex: '(?=\\\\))', next: 'pop' },\n                   { token: 'punctuation.separator.parameters.erlang', regex: ',' },\n                   { include: '#everything-else' } ] },\n              { token: \n                 [ 'entity.name.type.class.module.erlang',\n                   'text',\n                   'punctuation.separator.module-function.erlang',\n                   'text',\n                   'entity.name.function.erlang',\n                   'text',\n                   'punctuation.definition.parameters.begin.erlang' ],\n                regex: '(?:([a-z][a-zA-Z\\\\d@_]*|\\'[^\\']*\\')(\\\\s*)(:)(\\\\s*))?([a-z][a-zA-Z\\\\d@_]*|\\'[^\\']*\\')(\\\\s*)(\\\\()',\n                push: \n                 [ { token: 'text', regex: '(?=\\\\))', next: 'pop' },\n                   { token: 'punctuation.separator.parameters.erlang', regex: ',' },\n                   { include: '#everything-else' } ] },\n              { defaultToken: 'meta.function-call.erlang' } ] } ],\n      '#import-export-directive': \n       [ { token: \n            [ 'meta.directive.import.erlang',\n              'punctuation.section.directive.begin.erlang',\n              'meta.directive.import.erlang',\n              'keyword.control.directive.import.erlang',\n              'meta.directive.import.erlang',\n              'punctuation.definition.parameters.begin.erlang',\n              'meta.directive.import.erlang',\n              'entity.name.type.class.module.erlang',\n              'meta.directive.import.erlang',\n              'punctuation.separator.parameters.erlang' ],\n           regex: '^(\\\\s*)(-)(\\\\s*)(import)(\\\\s*)(\\\\()(\\\\s*)([a-z][a-zA-Z\\\\d@_]*|\\'[^\\']*\\')(\\\\s*)(,)',\n           push: \n            [ { token: \n                 [ 'punctuation.definition.parameters.end.erlang',\n                   'meta.directive.import.erlang',\n                   'punctuation.section.directive.end.erlang' ],\n                regex: '(\\\\))(\\\\s*)(\\\\.)',\n                next: 'pop' },\n              { include: '#internal-function-list' },\n              { defaultToken: 'meta.directive.import.erlang' } ] },\n         { token: \n            [ 'meta.directive.export.erlang',\n              'punctuation.section.directive.begin.erlang',\n              'meta.directive.export.erlang',\n              'keyword.control.directive.export.erlang',\n              'meta.directive.export.erlang',\n              'punctuation.definition.parameters.begin.erlang' ],\n           regex: '^(\\\\s*)(-)(\\\\s*)(export)(\\\\s*)(\\\\()',\n           push: \n            [ { token: \n                 [ 'punctuation.definition.parameters.end.erlang',\n                   'meta.directive.export.erlang',\n                   'punctuation.section.directive.end.erlang' ],\n                regex: '(\\\\))(\\\\s*)(\\\\.)',\n                next: 'pop' },\n              { include: '#internal-function-list' },\n              { defaultToken: 'meta.directive.export.erlang' } ] } ],\n      '#internal-expression-punctuation': \n       [ { token: \n            [ 'punctuation.separator.clause-head-body.erlang',\n              'punctuation.separator.clauses.erlang',\n              'punctuation.separator.expressions.erlang' ],\n           regex: '(->)|(;)|(,)' } ],\n      '#internal-function-list': \n       [ { token: 'punctuation.definition.list.begin.erlang',\n           regex: '\\\\[',\n           push: \n            [ { token: 'punctuation.definition.list.end.erlang',\n                regex: '\\\\]',\n                next: 'pop' },\n              { token: \n                 [ 'entity.name.function.erlang',\n                   'text',\n                   'punctuation.separator.function-arity.erlang' ],\n                regex: '([a-z][a-zA-Z\\\\d@_]*|\\'[^\\']*\\')(\\\\s*)(/)',\n                push: \n                 [ { token: 'punctuation.separator.list.erlang',\n                     regex: ',|(?=\\\\])',\n                     next: 'pop' },\n                   { include: '#everything-else' } ] },\n              { include: '#everything-else' },\n              { defaultToken: 'meta.structure.list.function.erlang' } ] } ],\n      '#internal-function-parts': \n       [ { token: 'text',\n           regex: '(?=\\\\()',\n           push: \n            [ { token: 'punctuation.separator.clause-head-body.erlang',\n                regex: '->',\n                next: 'pop' },\n              { token: 'punctuation.definition.parameters.begin.erlang',\n                regex: '\\\\(',\n                push: \n                 [ { token: 'punctuation.definition.parameters.end.erlang',\n                     regex: '\\\\)',\n                     next: 'pop' },\n                   { token: 'punctuation.separator.parameters.erlang', regex: ',' },\n                   { include: '#everything-else' } ] },\n              { token: 'punctuation.separator.guards.erlang', regex: ',|;' },\n              { include: '#everything-else' } ] },\n         { token: 'punctuation.separator.expressions.erlang',\n           regex: ',' },\n         { include: '#everything-else' } ],\n      '#internal-record-body': \n       [ { token: 'punctuation.definition.class.record.begin.erlang',\n           regex: '\\\\{',\n           push: \n            [ { token: 'meta.structure.record.erlang',\n                regex: '(?=\\\\})',\n                next: 'pop' },\n              { token: \n                 [ 'variable.other.field.erlang',\n                   'variable.language.omitted.field.erlang',\n                   'text',\n                   'keyword.operator.assignment.erlang' ],\n                regex: '(?:([a-z][a-zA-Z\\\\d@_]*|\\'[^\\']*\\')|(_))(\\\\s*)(=|::)',\n                push: \n                 [ { token: 'punctuation.separator.class.record.erlang',\n                     regex: ',|(?=\\\\})',\n                     next: 'pop' },\n                   { include: '#everything-else' } ] },\n              { token: \n                 [ 'variable.other.field.erlang',\n                   'text',\n                   'punctuation.separator.class.record.erlang' ],\n                regex: '([a-z][a-zA-Z\\\\d@_]*|\\'[^\\']*\\')(\\\\s*)((?:,)?)' },\n              { include: '#everything-else' },\n              { defaultToken: 'meta.structure.record.erlang' } ] } ],\n      '#internal-type-specifiers': \n       [ { token: 'punctuation.separator.value-type.erlang',\n           regex: '/',\n           push: \n            [ { token: 'text', regex: '(?=,|:|>>)', next: 'pop' },\n              { token: \n                 [ 'storage.type.erlang',\n                   'storage.modifier.signedness.erlang',\n                   'storage.modifier.endianness.erlang',\n                   'storage.modifier.unit.erlang',\n                   'punctuation.separator.type-specifiers.erlang' ],\n                regex: '(integer|float|binary|bytes|bitstring|bits)|(signed|unsigned)|(big|little|native)|(unit)|(-)' } ] } ],\n      '#keyword': \n       [ { token: 'keyword.control.erlang',\n           regex: '\\\\b(?:after|begin|case|catch|cond|end|fun|if|let|of|query|try|receive|when)\\\\b' } ],\n      '#list': \n       [ { token: 'punctuation.definition.list.begin.erlang',\n           regex: '\\\\[',\n           push: \n            [ { token: 'punctuation.definition.list.end.erlang',\n                regex: '\\\\]',\n                next: 'pop' },\n              { token: 'punctuation.separator.list.erlang',\n                regex: '\\\\||\\\\|\\\\||,' },\n              { include: '#everything-else' },\n              { defaultToken: 'meta.structure.list.erlang' } ] } ],\n      '#macro-directive': \n       [ { token: \n            [ 'meta.directive.ifdef.erlang',\n              'punctuation.section.directive.begin.erlang',\n              'meta.directive.ifdef.erlang',\n              'keyword.control.directive.ifdef.erlang',\n              'meta.directive.ifdef.erlang',\n              'punctuation.definition.parameters.begin.erlang',\n              'meta.directive.ifdef.erlang',\n              'entity.name.function.macro.erlang',\n              'meta.directive.ifdef.erlang',\n              'punctuation.definition.parameters.end.erlang',\n              'meta.directive.ifdef.erlang',\n              'punctuation.section.directive.end.erlang' ],\n           regex: '^(\\\\s*)(-)(\\\\s*)(ifdef)(\\\\s*)(\\\\()(\\\\s*)([a-zA-z\\\\d@_]+)(\\\\s*)(\\\\))(\\\\s*)(\\\\.)' },\n         { token: \n            [ 'meta.directive.ifndef.erlang',\n              'punctuation.section.directive.begin.erlang',\n              'meta.directive.ifndef.erlang',\n              'keyword.control.directive.ifndef.erlang',\n              'meta.directive.ifndef.erlang',\n              'punctuation.definition.parameters.begin.erlang',\n              'meta.directive.ifndef.erlang',\n              'entity.name.function.macro.erlang',\n              'meta.directive.ifndef.erlang',\n              'punctuation.definition.parameters.end.erlang',\n              'meta.directive.ifndef.erlang',\n              'punctuation.section.directive.end.erlang' ],\n           regex: '^(\\\\s*)(-)(\\\\s*)(ifndef)(\\\\s*)(\\\\()(\\\\s*)([a-zA-z\\\\d@_]+)(\\\\s*)(\\\\))(\\\\s*)(\\\\.)' },\n         { token: \n            [ 'meta.directive.undef.erlang',\n              'punctuation.section.directive.begin.erlang',\n              'meta.directive.undef.erlang',\n              'keyword.control.directive.undef.erlang',\n              'meta.directive.undef.erlang',\n              'punctuation.definition.parameters.begin.erlang',\n              'meta.directive.undef.erlang',\n              'entity.name.function.macro.erlang',\n              'meta.directive.undef.erlang',\n              'punctuation.definition.parameters.end.erlang',\n              'meta.directive.undef.erlang',\n              'punctuation.section.directive.end.erlang' ],\n           regex: '^(\\\\s*)(-)(\\\\s*)(undef)(\\\\s*)(\\\\()(\\\\s*)([a-zA-z\\\\d@_]+)(\\\\s*)(\\\\))(\\\\s*)(\\\\.)' } ],\n      '#macro-usage': \n       [ { token: \n            [ 'keyword.operator.macro.erlang',\n              'meta.macro-usage.erlang',\n              'entity.name.function.macro.erlang' ],\n           regex: '(\\\\?\\\\??)(\\\\s*)([a-zA-Z\\\\d@_]+)' } ],\n      '#module-directive': \n       [ { token: \n            [ 'meta.directive.module.erlang',\n              'punctuation.section.directive.begin.erlang',\n              'meta.directive.module.erlang',\n              'keyword.control.directive.module.erlang',\n              'meta.directive.module.erlang',\n              'punctuation.definition.parameters.begin.erlang',\n              'meta.directive.module.erlang',\n              'entity.name.type.class.module.definition.erlang',\n              'meta.directive.module.erlang',\n              'punctuation.definition.parameters.end.erlang',\n              'meta.directive.module.erlang',\n              'punctuation.section.directive.end.erlang' ],\n           regex: '^(\\\\s*)(-)(\\\\s*)(module)(\\\\s*)(\\\\()(\\\\s*)([a-z][a-zA-Z\\\\d@_]*)(\\\\s*)(\\\\))(\\\\s*)(\\\\.)' } ],\n      '#number': \n       [ { token: 'text',\n           regex: '(?=\\\\d)',\n           push: \n            [ { token: 'text', regex: '(?!\\\\d)', next: 'pop' },\n              { token: \n                 [ 'constant.numeric.float.erlang',\n                   'punctuation.separator.integer-float.erlang',\n                   'constant.numeric.float.erlang',\n                   'punctuation.separator.float-exponent.erlang' ],\n                regex: '(\\\\d+)(\\\\.)(\\\\d+)((?:[eE][\\\\+\\\\-]?\\\\d+)?)' },\n              { token: \n                 [ 'constant.numeric.integer.binary.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.binary.erlang' ],\n                regex: '(2)(#)([0-1]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-3.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-3.erlang' ],\n                regex: '(3)(#)([0-2]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-4.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-4.erlang' ],\n                regex: '(4)(#)([0-3]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-5.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-5.erlang' ],\n                regex: '(5)(#)([0-4]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-6.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-6.erlang' ],\n                regex: '(6)(#)([0-5]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-7.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-7.erlang' ],\n                regex: '(7)(#)([0-6]+)' },\n              { token: \n                 [ 'constant.numeric.integer.octal.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.octal.erlang' ],\n                regex: '(8)(#)([0-7]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-9.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-9.erlang' ],\n                regex: '(9)(#)([0-8]+)' },\n              { token: \n                 [ 'constant.numeric.integer.decimal.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.decimal.erlang' ],\n                regex: '(10)(#)(\\\\d+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-11.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-11.erlang' ],\n                regex: '(11)(#)([\\\\daA]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-12.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-12.erlang' ],\n                regex: '(12)(#)([\\\\da-bA-B]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-13.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-13.erlang' ],\n                regex: '(13)(#)([\\\\da-cA-C]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-14.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-14.erlang' ],\n                regex: '(14)(#)([\\\\da-dA-D]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-15.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-15.erlang' ],\n                regex: '(15)(#)([\\\\da-eA-E]+)' },\n              { token: \n                 [ 'constant.numeric.integer.hexadecimal.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.hexadecimal.erlang' ],\n                regex: '(16)(#)([\\\\da-fA-F]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-17.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-17.erlang' ],\n                regex: '(17)(#)([\\\\da-gA-G]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-18.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-18.erlang' ],\n                regex: '(18)(#)([\\\\da-hA-H]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-19.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-19.erlang' ],\n                regex: '(19)(#)([\\\\da-iA-I]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-20.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-20.erlang' ],\n                regex: '(20)(#)([\\\\da-jA-J]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-21.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-21.erlang' ],\n                regex: '(21)(#)([\\\\da-kA-K]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-22.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-22.erlang' ],\n                regex: '(22)(#)([\\\\da-lA-L]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-23.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-23.erlang' ],\n                regex: '(23)(#)([\\\\da-mA-M]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-24.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-24.erlang' ],\n                regex: '(24)(#)([\\\\da-nA-N]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-25.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-25.erlang' ],\n                regex: '(25)(#)([\\\\da-oA-O]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-26.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-26.erlang' ],\n                regex: '(26)(#)([\\\\da-pA-P]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-27.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-27.erlang' ],\n                regex: '(27)(#)([\\\\da-qA-Q]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-28.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-28.erlang' ],\n                regex: '(28)(#)([\\\\da-rA-R]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-29.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-29.erlang' ],\n                regex: '(29)(#)([\\\\da-sA-S]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-30.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-30.erlang' ],\n                regex: '(30)(#)([\\\\da-tA-T]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-31.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-31.erlang' ],\n                regex: '(31)(#)([\\\\da-uA-U]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-32.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-32.erlang' ],\n                regex: '(32)(#)([\\\\da-vA-V]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-33.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-33.erlang' ],\n                regex: '(33)(#)([\\\\da-wA-W]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-34.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-34.erlang' ],\n                regex: '(34)(#)([\\\\da-xA-X]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-35.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-35.erlang' ],\n                regex: '(35)(#)([\\\\da-yA-Y]+)' },\n              { token: \n                 [ 'constant.numeric.integer.base-36.erlang',\n                   'punctuation.separator.base-integer.erlang',\n                   'constant.numeric.integer.base-36.erlang' ],\n                regex: '(36)(#)([\\\\da-zA-Z]+)' },\n              { token: 'invalid.illegal.integer.erlang',\n                regex: '\\\\d+#[\\\\da-zA-Z]+' },\n              { token: 'constant.numeric.integer.decimal.erlang',\n                regex: '\\\\d+' } ] } ],\n      '#parenthesized-expression': \n       [ { token: 'punctuation.section.expression.begin.erlang',\n           regex: '\\\\(',\n           push: \n            [ { token: 'punctuation.section.expression.end.erlang',\n                regex: '\\\\)',\n                next: 'pop' },\n              { include: '#everything-else' },\n              { defaultToken: 'meta.expression.parenthesized' } ] } ],\n      '#record-directive': \n       [ { token: \n            [ 'meta.directive.record.erlang',\n              'punctuation.section.directive.begin.erlang',\n              'meta.directive.record.erlang',\n              'keyword.control.directive.import.erlang',\n              'meta.directive.record.erlang',\n              'punctuation.definition.parameters.begin.erlang',\n              'meta.directive.record.erlang',\n              'entity.name.type.class.record.definition.erlang',\n              'meta.directive.record.erlang',\n              'punctuation.separator.parameters.erlang' ],\n           regex: '^(\\\\s*)(-)(\\\\s*)(record)(\\\\s*)(\\\\()(\\\\s*)([a-z][a-zA-Z\\\\d@_]*|\\'[^\\']*\\')(\\\\s*)(,)',\n           push: \n            [ { token: \n                 [ 'punctuation.definition.class.record.end.erlang',\n                   'meta.directive.record.erlang',\n                   'punctuation.definition.parameters.end.erlang',\n                   'meta.directive.record.erlang',\n                   'punctuation.section.directive.end.erlang' ],\n                regex: '(\\\\})(\\\\s*)(\\\\))(\\\\s*)(\\\\.)',\n                next: 'pop' },\n              { include: '#internal-record-body' },\n              { defaultToken: 'meta.directive.record.erlang' } ] } ],\n      '#record-usage': \n       [ { token: \n            [ 'keyword.operator.record.erlang',\n              'meta.record-usage.erlang',\n              'entity.name.type.class.record.erlang',\n              'meta.record-usage.erlang',\n              'punctuation.separator.record-field.erlang',\n              'meta.record-usage.erlang',\n              'variable.other.field.erlang' ],\n           regex: '(#)(\\\\s*)([a-z][a-zA-Z\\\\d@_]*|\\'[^\\']*\\')(\\\\s*)(\\\\.)(\\\\s*)([a-z][a-zA-Z\\\\d@_]*|\\'[^\\']*\\')' },\n         { token: \n            [ 'keyword.operator.record.erlang',\n              'meta.record-usage.erlang',\n              'entity.name.type.class.record.erlang' ],\n           regex: '(#)(\\\\s*)([a-z][a-zA-Z\\\\d@_]*|\\'[^\\']*\\')',\n           push: \n            [ { token: 'punctuation.definition.class.record.end.erlang',\n                regex: '\\\\}',\n                next: 'pop' },\n              { include: '#internal-record-body' },\n              { defaultToken: 'meta.record-usage.erlang' } ] } ],\n      '#string': \n       [ { token: 'punctuation.definition.string.begin.erlang',\n           regex: '\"',\n           push: \n            [ { token: 'punctuation.definition.string.end.erlang',\n                regex: '\"',\n                next: 'pop' },\n              { token: \n                 [ 'punctuation.definition.escape.erlang',\n                   'constant.character.escape.erlang',\n                   'punctuation.definition.escape.erlang',\n                   'constant.character.escape.erlang',\n                   'constant.character.escape.erlang' ],\n                regex: '(\\\\\\\\)(?:([bdefnrstv\\\\\\\\\\'\"])|(\\\\^)([@-_])|([0-7]{1,3}))' },\n              { token: 'invalid.illegal.string.erlang', regex: '\\\\\\\\\\\\^?.?' },\n              { token: \n                 [ 'punctuation.definition.placeholder.erlang',\n                   'punctuation.separator.placeholder-parts.erlang',\n                   'constant.other.placeholder.erlang',\n                   'punctuation.separator.placeholder-parts.erlang',\n                   'punctuation.separator.placeholder-parts.erlang',\n                   'constant.other.placeholder.erlang',\n                   'punctuation.separator.placeholder-parts.erlang',\n                   'punctuation.separator.placeholder-parts.erlang',\n                   'punctuation.separator.placeholder-parts.erlang',\n                   'constant.other.placeholder.erlang',\n                   'constant.other.placeholder.erlang' ],\n                regex: '(~)(?:((?:\\\\-)?)(\\\\d+)|(\\\\*))?(?:(\\\\.)(?:(\\\\d+)|(\\\\*)))?(?:(\\\\.)(?:(\\\\*)|(.)))?([~cfegswpWPBX#bx\\\\+ni])' },\n              { token: \n                 [ 'punctuation.definition.placeholder.erlang',\n                   'punctuation.separator.placeholder-parts.erlang',\n                   'constant.other.placeholder.erlang',\n                   'constant.other.placeholder.erlang' ],\n                regex: '(~)((?:\\\\*)?)((?:\\\\d+)?)([~du\\\\-#fsacl])' },\n              { token: 'invalid.illegal.string.erlang', regex: '~.?' },\n              { defaultToken: 'string.quoted.double.erlang' } ] } ],\n      '#symbolic-operator': \n       [ { token: 'keyword.operator.symbolic.erlang',\n           regex: '\\\\+\\\\+|\\\\+|--|-|\\\\*|/=|/|=/=|=:=|==|=<|=|<-|<|>=|>|!|::' } ],\n      '#textual-operator': \n       [ { token: 'keyword.operator.textual.erlang',\n           regex: '\\\\b(?:andalso|band|and|bxor|xor|bor|orelse|or|bnot|not|bsl|bsr|div|rem)\\\\b' } ],\n      '#tuple': \n       [ { token: 'punctuation.definition.tuple.begin.erlang',\n           regex: '\\\\{',\n           push: \n            [ { token: 'punctuation.definition.tuple.end.erlang',\n                regex: '\\\\}',\n                next: 'pop' },\n              { token: 'punctuation.separator.tuple.erlang', regex: ',' },\n              { include: '#everything-else' },\n              { defaultToken: 'meta.structure.tuple.erlang' } ] } ],\n      '#variable': \n       [ { token: [ 'variable.other.erlang', 'variable.language.omitted.erlang' ],\n           regex: '(_[a-zA-Z\\\\d@_]+|[A-Z][a-zA-Z\\\\d@_]*)|(_)' } ] }\n    \n    this.normalizeRules();\n};\n\nErlangHighlightRules.metaData = { comment: 'The recognition of function definitions and compiler directives (such as module, record and macro definitions) requires that each of the aforementioned constructs must be the first string inside a line (except for whitespace).  Also, the function/module/record/macro names must be given unquoted.  -- desp',\n      fileTypes: [ 'erl', 'hrl' ],\n      keyEquivalent: '^~E',\n      name: 'Erlang',\n      scopeName: 'source.erlang' }\n\n\noop.inherits(ErlangHighlightRules, TextHighlightRules);\n\nexports.ErlangHighlightRules = ErlangHighlightRules;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/erlang\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/erlang_highlight_rules\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar ErlangHighlightRules = require(\"./erlang_highlight_rules\").ErlangHighlightRules;\nvar FoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = ErlangHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"%\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n    this.$id = \"ace/mode/erlang\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-forth.js",
    "content": "ace.define(\"ace/mode/forth_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar ForthHighlightRules = function() {\n\n    this.$rules = { start: [ { include: '#forth' } ],\n      '#comment': \n       [ { token: 'comment.line.double-dash.forth',\n           regex: '(?:^|\\\\s)--\\\\s.*$',\n           comment: 'line comments for iForth' },\n         { token: 'comment.line.backslash.forth',\n           regex: '(?:^|\\\\s)\\\\\\\\[\\\\s\\\\S]*$',\n           comment: 'ANSI line comment' },\n         { token: 'comment.line.backslash-g.forth',\n           regex: '(?:^|\\\\s)\\\\\\\\[Gg] .*$',\n           comment: 'gForth line comment' },\n         { token: 'comment.block.forth',\n           regex: '(?:^|\\\\s)\\\\(\\\\*(?=\\\\s|$)',\n           push: \n            [ { token: 'comment.block.forth',\n                regex: '(?:^|\\\\s)\\\\*\\\\)(?=\\\\s|$)',\n                next: 'pop' },\n              { defaultToken: 'comment.block.forth' } ],\n           comment: 'multiline comments for iForth' },\n         { token: 'comment.block.documentation.forth',\n           regex: '\\\\bDOC\\\\b',\n           caseInsensitive: true,\n           push: \n            [ { token: 'comment.block.documentation.forth',\n                regex: '\\\\bENDDOC\\\\b',\n                caseInsensitive: true,\n                next: 'pop' },\n              { defaultToken: 'comment.block.documentation.forth' } ],\n           comment: 'documentation comments for iForth' },\n         { token: 'comment.line.parentheses.forth',\n           regex: '(?:^|\\\\s)\\\\.?\\\\( [^)]*\\\\)',\n           comment: 'ANSI line comment' } ],\n      '#constant': \n       [ { token: 'constant.language.forth',\n           regex: '(?:^|\\\\s)(?:TRUE|FALSE|BL|PI|CELL|C/L|R/O|W/O|R/W)(?=\\\\s|$)',\n           caseInsensitive: true},\n         { token: 'constant.numeric.forth',\n           regex: '(?:^|\\\\s)[$#%]?[-+]?[0-9]+(?:\\\\.[0-9]*e-?[0-9]+|\\\\.?[0-9a-fA-F]*)(?=\\\\s|$)'},\n         { token: 'constant.character.forth',\n           regex: '(?:^|\\\\s)(?:[&^]\\\\S|(?:\"|\\')\\\\S(?:\"|\\'))(?=\\\\s|$)'}],\n      '#forth': \n       [ { include: '#constant' },\n         { include: '#comment' },\n         { include: '#string' },\n         { include: '#word' },\n         { include: '#variable' },\n         { include: '#storage' },\n         { include: '#word-def' } ],\n      '#storage': \n       [ { token: 'storage.type.forth',\n           regex: '(?:^|\\\\s)(?:2CONSTANT|2VARIABLE|ALIAS|CONSTANT|CREATE-INTERPRET/COMPILE[:]?|CREATE|DEFER|FCONSTANT|FIELD|FVARIABLE|USER|VALUE|VARIABLE|VOCABULARY)(?=\\\\s|$)',\n           caseInsensitive: true}],\n      '#string': \n       [ { token: 'string.quoted.double.forth',\n           regex: '(ABORT\" |BREAK\" |\\\\.\" |C\" |0\"|S\\\\\\\\?\" )([^\"]+\")',\n           caseInsensitive: true},\n         { token: 'string.unquoted.forth',\n           regex: '(?:INCLUDE|NEEDS|REQUIRE|USE)[ ]\\\\S+(?=\\\\s|$)',\n           caseInsensitive: true}],\n      '#variable': \n       [ { token: 'variable.language.forth',\n           regex: '\\\\b(?:I|J)\\\\b',\n           caseInsensitive: true } ],\n      '#word': \n       [ { token: 'keyword.control.immediate.forth',\n           regex: '(?:^|\\\\s)\\\\[(?:\\\\?DO|\\\\+LOOP|AGAIN|BEGIN|DEFINED|DO|ELSE|ENDIF|FOR|IF|IFDEF|IFUNDEF|LOOP|NEXT|REPEAT|THEN|UNTIL|WHILE)\\\\](?=\\\\s|$)',\n           caseInsensitive: true},\n         { token: 'keyword.other.immediate.forth',\n           regex: '(?:^|\\\\s)(?:COMPILE-ONLY|IMMEDIATE|IS|RESTRICT|TO|WHAT\\'S|])(?=\\\\s|$)',\n           caseInsensitive: true},\n         { token: 'keyword.control.compile-only.forth',\n           regex: '(?:^|\\\\s)(?:-DO|\\\\-LOOP|\\\\?DO|\\\\?LEAVE|\\\\+DO|\\\\+LOOP|ABORT\\\\\"|AGAIN|AHEAD|BEGIN|CASE|DO|ELSE|ENDCASE|ENDIF|ENDOF|ENDTRY\\\\-IFERROR|ENDTRY|FOR|IF|IFERROR|LEAVE|LOOP|NEXT|RECOVER|REPEAT|RESTORE|THEN|TRY|U\\\\-DO|U\\\\+DO|UNTIL|WHILE)(?=\\\\s|$)',\n           caseInsensitive: true},\n         { token: 'keyword.other.compile-only.forth',\n           regex: '(?:^|\\\\s)(?:\\\\?DUP-0=-IF|\\\\?DUP-IF|\\\\)|\\\\[|\\\\[\\'\\\\]|\\\\[CHAR\\\\]|\\\\[COMPILE\\\\]|\\\\[IS\\\\]|\\\\[TO\\\\]|<COMPILATION|<INTERPRETATION|ASSERT\\\\(|ASSERT0\\\\(|ASSERT1\\\\(|ASSERT2\\\\(|ASSERT3\\\\(|COMPILATION>|DEFERS|DOES>|INTERPRETATION>|OF|POSTPONE)(?=\\\\s|$)',\n           caseInsensitive: true},\n         { token: 'keyword.other.non-immediate.forth',\n           regex: '(?:^|\\\\s)(?:\\'|<IS>|<TO>|CHAR|END-STRUCT|INCLUDE[D]?|LOAD|NEEDS|REQUIRE[D]?|REVISION|SEE|STRUCT|THRU|USE)(?=\\\\s|$)',\n           caseInsensitive: true},\n         { token: 'keyword.other.warning.forth',\n           regex: '(?:^|\\\\s)(?:~~|BREAK:|BREAK\"|DBG)(?=\\\\s|$)',\n           caseInsensitive: true}],\n      '#word-def': \n       [ { token: \n            [ 'keyword.other.compile-only.forth',\n              'keyword.other.compile-only.forth',\n              'meta.block.forth',\n              'entity.name.function.forth' ],\n           regex: '(:NONAME)|(^:|\\\\s:)(\\\\s)(\\\\S+)(?=\\\\s|$)',\n           caseInsensitive: true,\n           push: \n            [ { token: 'keyword.other.compile-only.forth',\n                regex: ';(?:CODE)?',\n                caseInsensitive: true,\n                next: 'pop' },\n              { include: '#constant' },\n              { include: '#comment' },\n              { include: '#string' },\n              { include: '#word' },\n              { include: '#variable' },\n              { include: '#storage' },\n              { defaultToken: 'meta.block.forth' } ] } ] }\n    \n    this.normalizeRules();\n};\n\nForthHighlightRules.metaData = { fileTypes: [ 'frt', 'fs', 'ldr' ],\n      foldingStartMarker: '/\\\\*\\\\*|\\\\{\\\\s*$',\n      foldingStopMarker: '\\\\*\\\\*/|^\\\\s*\\\\}',\n      keyEquivalent: '^~F',\n      name: 'Forth',\n      scopeName: 'source.forth' }\n\n\noop.inherits(ForthHighlightRules, TextHighlightRules);\n\nexports.ForthHighlightRules = ForthHighlightRules;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/forth\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/forth_highlight_rules\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar ForthHighlightRules = require(\"./forth_highlight_rules\").ForthHighlightRules;\nvar FoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = ForthHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"--\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n    this.$id = \"ace/mode/forth\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-ftl.js",
    "content": "ace.define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\nace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"string.cdata.xml\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.xml-decl.xml\", \"keyword.xml-decl.xml\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_decl\", caseInsensitive: true\n            },\n            {\n                token : [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"processing_instruction\",\n            },\n            {token : \"comment.xml\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\", caseInsensitive: true\n            },\n            {include : \"tag\"},\n            {token : \"text.end-tag-open.xml\", regex: \"</\"},\n            {token : \"text.tag-open.xml\", regex: \"<\"},\n            {include : \"reference\"},\n            {defaultToken : \"text.xml\"}\n        ],\n\n        xml_decl : [{\n            token : \"entity.other.attribute-name.decl-attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.decl-attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"whitespace\"\n        }, {\n            include: \"string\"\n        }, {\n            token : \"punctuation.xml-decl.xml\",\n            regex : \"\\\\?>\",\n            next : \"start\"\n        }],\n\n        processing_instruction : [\n            {token : \"punctuation.instruction.xml\", regex : \"\\\\?>\", next : \"start\"},\n            {defaultToken : \"instruction.xml\"}\n        ],\n\n        doctype : [\n            {include : \"whitespace\"},\n            {include : \"string\"},\n            {token : \"xml-pe.doctype.xml\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe.xml\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.int-subset\", regex : \"\\\\[\", push : \"int_subset\"}\n        ],\n\n        int_subset : [{\n            token : \"text.xml\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.int-subset.xml\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.markup-decl.xml\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.cdata.xml\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text.xml\", regex : \"\\\\s+\"},\n            {token : \"text.xml\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment.xml\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment.xml\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape.reference.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        attr_reference : [{\n            token : \"constant.language.escape.reference.attribute-value.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n            regex : \"(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n            ]\n        }],\n\n        tag_whitespace : [\n            {token : \"text.tag-whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        whitespace : [\n            {token : \"text.whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        string: [{\n            token : \"string.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.xml\", regex: \"'\", next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }, {\n            token : \"string.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.xml\", regex: '\"', next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }],\n\n        attributes: [{\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"tag_whitespace\"\n        }, {\n            include: \"attribute_value\"\n        }],\n\n        attribute_value: [{\n            token : \"string.attribute-value.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }, {\n            token : \"string.attribute-value.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\nace.define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    option      : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.addRules({\n        attributes: [{\n            include : \"tag_whitespace\"\n        }, {\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\",\n            push : [{\n                include: \"tag_whitespace\"\n            }, {\n                token : \"string.unquoted.attribute-value.html\",\n                regex : \"[^<>='\\\"`\\\\s]+\",\n                next : \"pop\"\n            }, {\n                token : \"empty\",\n                regex : \"\",\n                next : \"pop\"\n            }]\n        }, {\n            include : \"attribute_value\"\n        }],\n        tag: [{\n            token : function(start, tag) {\n                var group = tagMap[tag];\n                return [\"meta.tag.punctuation.\" + (start == \"<\" ? \"\" : \"end-\") + \"tag-open.xml\",\n                    \"meta.tag\" + (group ? \".\" + group : \"\") + \".tag-name.xml\"];\n            },\n            regex : \"(</?)([-_a-zA-Z0-9:]+)\",\n            next: \"tag_stuff\"\n        }],\n        tag_stuff: [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n        ],\n    });\n\n    this.embedTagRules(CssHighlightRules, \"css-\", \"style\");\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    if (this.constructor === HtmlHighlightRules)\n        this.normalizeRules();\n};\n\noop.inherits(HtmlHighlightRules, XmlHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\nace.define(\"ace/mode/ftl_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar FtlLangHighlightRules = function () {\n\n    var stringBuiltIns = \"\\\\?|substring|cap_first|uncap_first|capitalize|chop_linebreak|date|time|datetime|\"\n        + \"ends_with|html|groups|index_of|j_string|js_string|json_string|last_index_of|length|lower_case|\"\n        + \"left_pad|right_pad|contains|matches|number|replace|rtf|url|split|starts_with|string|trim|\"\n        + \"upper_case|word_list|xhtml|xml\";\n    var numberBuiltIns = \"c|round|floor|ceiling\";\n    var dateBuiltIns = \"iso_[a-z_]+\";\n    var seqBuiltIns = \"first|last|seq_contains|seq_index_of|seq_last_index_of|reverse|size|sort|sort_by|chunk\";\n    var hashBuiltIns = \"keys|values\";\n    var xmlBuiltIns = \"children|parent|root|ancestors|node_name|node_type|node_namespace\";\n    var expertBuiltIns = \"byte|double|float|int|long|short|number_to_date|number_to_time|number_to_datetime|\"\n        + \"eval|has_content|interpret|is_[a-z_]+|namespacenew\";\n    var allBuiltIns = stringBuiltIns + numberBuiltIns + dateBuiltIns + seqBuiltIns + hashBuiltIns\n        + xmlBuiltIns + expertBuiltIns;\n\n    var deprecatedBuiltIns = \"default|exists|if_exists|web_safe\";\n\n    var variables = \"data_model|error|globals|lang|locale|locals|main|namespace|node|current_node|\"\n        + \"now|output_encoding|template_name|url_escaping_charset|vars|version\";\n\n    var operators = \"gt|gte|lt|lte|as|in|using\";\n\n    var reserved = \"true|false\";\n\n    var attributes = \"encoding|parse|locale|number_format|date_format|time_format|datetime_format|time_zone|\"\n        + \"url_escaping_charset|classic_compatible|strip_whitespace|strip_text|strict_syntax|ns_prefixes|\"\n        + \"attributes\";\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"constant.character.entity\",\n            regex : /&[^;]+;/\n        }, {\n            token : \"support.function\",\n            regex : \"\\\\?(\"+allBuiltIns+\")\"\n        },  {\n            token : \"support.function.deprecated\",\n            regex : \"\\\\?(\"+deprecatedBuiltIns+\")\"\n        }, {\n            token : \"language.variable\",\n            regex : \"\\\\.(?:\"+variables+\")\"\n        }, {\n            token : \"constant.language\",\n            regex : \"\\\\b(\"+reserved+\")\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\\\b(?:\"+operators+\")\\\\b\"\n        }, {\n            token : \"entity.other.attribute-name\",\n            regex : attributes\n        }, {\n            token : \"string\", //\n            regex : /['\"]/,\n            next : \"qstring\"\n        }, {\n            token : function(value) {\n                if (value.match(\"^[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?$\")) {\n                    return \"constant.numeric\";\n                } else {\n                    return \"variable\";\n                }\n            },\n            regex : /[\\w.+\\-]+/\n        }, {\n            token : \"keyword.operator\",\n            regex : \"!|\\\\.|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=\"\n        }, {\n            token : \"paren.lparen\",\n            regex : \"[[({]\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\])}]\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }],\n\n        \"qstring\" : [{\n            token : \"constant.character.escape\",\n            regex : '\\\\\\\\[nrtvef\\\\\\\\\"$]'\n        }, {\n            token : \"string\",\n            regex : /['\"]/,\n            next : \"start\"\n        }, {\n            defaultToken : \"string\"\n        }]\n    };\n};\n\noop.inherits(FtlLangHighlightRules, TextHighlightRules);\n\nvar FtlHighlightRules = function() {\n    HtmlHighlightRules.call(this);\n\n    var directives = \"assign|attempt|break|case|compress|default|elseif|else|escape|fallback|function|flush|\"\n        + \"ftl|global|if|import|include|list|local|lt|macro|nested|noescape|noparse|nt|recover|recurse|return|rt|\"\n        + \"setting|stop|switch|t|visit\";\n\n    var startRules = [\n        {\n            token : \"comment\",\n            regex : \"<#--\",\n            next : \"ftl-dcomment\"\n        }, {\n            token : \"string.interpolated\",\n            regex : \"\\\\${\",\n            push  : \"ftl-start\"\n        }, {\n            token : \"keyword.function\",\n            regex :  \"</?#(\"+directives+\")\",\n            push : \"ftl-start\"\n        }, {\n            token : \"keyword.other\",\n            regex : \"</?@[a-zA-Z\\\\.]+\",\n            push : \"ftl-start\"\n        }\n    ];\n\n    var endRules = [\n        {\n           token : \"keyword\",\n            regex : \"/?>\",\n            next  : \"pop\"\n        }, {\n            token : \"string.interpolated\",\n            regex : \"}\",\n            next  : \"pop\"\n        }\n    ];\n\n    for (var key in this.$rules)\n        this.$rules[key].unshift.apply(this.$rules[key], startRules);\n\n    this.embedRules(FtlLangHighlightRules, \"ftl-\", endRules, [\"start\"]);\n\n    this.addRules({\n        \"ftl-dcomment\" : [{\n            token : \"comment\",\n            regex : \".*?-->\",\n            next : \"pop\"\n        }, {\n            token : \"comment\",\n            regex : \".+\"\n        }]\n    });\n\n    this.normalizeRules();\n};\n\noop.inherits(FtlHighlightRules, HtmlHighlightRules);\n\nexports.FtlHighlightRules = FtlHighlightRules;\n});\n\nace.define(\"ace/mode/ftl\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/ftl_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar FtlHighlightRules = require(\"./ftl_highlight_rules\").FtlHighlightRules;\n\nvar Mode = function() {\n    this.HighlightRules = FtlHighlightRules;\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.$id = \"ace/mode/ftl\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-gcode.js",
    "content": "ace.define(\"ace/mode/gcode_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n    \"use strict\";\n\n    var oop = require(\"../lib/oop\");\n    var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\n    var GcodeHighlightRules = function() {\n\n        var keywords = (\n            \"IF|DO|WHILE|ENDWHILE|CALL|ENDIF|SUB|ENDSUB|GOTO|REPEAT|ENDREPEAT|CALL\"\n            );\n\n        var builtinConstants = (\n            \"PI\"\n            );\n\n        var builtinFunctions = (\n            \"ATAN|ABS|ACOS|ASIN|SIN|COS|EXP|FIX|FUP|ROUND|LN|TAN\"\n            );\n        var keywordMapper = this.createKeywordMapper({\n            \"support.function\": builtinFunctions,\n            \"keyword\": keywords,\n            \"constant.language\": builtinConstants\n        }, \"identifier\", true);\n\n        this.$rules = {\n            \"start\" : [ {\n                token : \"comment\",\n                regex : \"\\\\(.*\\\\)\"\n            }, {\n                token : \"comment\",           // block number\n                regex : \"([N])([0-9]+)\"\n            }, {\n                token : \"string\",           // \" string\n                regex : \"([G])([0-9]+\\\\.?[0-9]?)\"\n            }, {\n                token : \"string\",           // ' string\n                regex : \"([M])([0-9]+\\\\.?[0-9]?)\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"([-+]?([0-9]*\\\\.?[0-9]+\\\\.?))|(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\"\n            }, {\n                token : keywordMapper,\n                regex : \"[A-Z]\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"EQ|LT|GT|NE|GE|LE|OR|XOR\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[\\\\[]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\]]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            } ]\n        };\n    };\n\n    oop.inherits(GcodeHighlightRules, TextHighlightRules);\n\n    exports.GcodeHighlightRules = GcodeHighlightRules;\n});\n\nace.define(\"ace/mode/gcode\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/gcode_highlight_rules\",\"ace/range\"], function(require, exports, module) {\n    \"use strict\";\n\n    var oop = require(\"../lib/oop\");\n    var TextMode = require(\"./text\").Mode;\n    var GcodeHighlightRules = require(\"./gcode_highlight_rules\").GcodeHighlightRules;\n    var Range = require(\"../range\").Range;\n\n    var Mode = function() {\n        this.HighlightRules = GcodeHighlightRules;\n    };\n    oop.inherits(Mode, TextMode);\n\n    (function() {\n        this.$id = \"ace/mode/gcode\";\n    }).call(Mode.prototype);\n\n    exports.Mode = Mode;\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-gherkin.js",
    "content": "ace.define(\"ace/mode/gherkin_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar stringEscape =  \"\\\\\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\\\\\abfnrtv'\\\"]|U[0-9A-Fa-f]{8}|u[0-9A-Fa-f]{4})\";\n\nvar GherkinHighlightRules = function() {\n    this.$rules = {\n    \tstart : [{\n            token: 'constant.numeric',\n            regex: \"(?:(?:[1-9]\\\\d*)|(?:0))\"\n \t\t}, {\n    \t\ttoken : \"comment\",\n    \t\tregex : \"#.*$\"\n    \t}, {\n    \t\ttoken : \"keyword\",\n    \t\tregex : \"Feature:|Background:|Scenario:|Scenario\\ Outline:|Examples:|Given|When|Then|And|But|\\\\*\",\n    \t}, {\n            token : \"string\",           // multi line \"\"\" string start\n            regex : '\"{3}',\n            next : \"qqstring3\"\n        }, {\n            token : \"string\",           // \" string\n            regex : '\"',\n            next : \"qqstring\"\n        }, {\n        \ttoken : \"comment\",\n        \tregex : \"@[A-Za-z0-9]+\",\n        \tnext : \"start\"\n        }, {\n        \ttoken : \"comment\",\n        \tregex : \"<.+>\"\n        }, {\n        \ttoken : \"comment\",\n        \tregex : \"\\\\| \",\n        \tnext : \"table-item\"\n        }, {\n        \ttoken : \"comment\",\n        \tregex : \"\\\\|$\",\n        \tnext : \"start\"\n        }],\n    \t\"qqstring3\" : [ {\n            token : \"constant.language.escape\",\n            regex : stringEscape\n        }, {\n            token : \"string\", // multi line \"\"\" string end\n            regex : '\"{3}',\n            next : \"start\"\n        }, {\n            defaultToken : \"string\"\n        }],\n    \t\"qqstring\" : [{\n            token : \"constant.language.escape\",\n            regex : stringEscape\n        }, {\n            token : \"string\",\n            regex : \"\\\\\\\\$\",\n            next  : \"qqstring\"\n        }, {\n            token : \"string\",\n            regex : '\"|$',\n            next  : \"start\"\n        }, {\n            defaultToken: \"string\"\n        }],\n        \"table-item\" : [{\n            token : \"string\",\n            regex : \"[A-Za-z0-9 ]*\",\n            next  : \"start\"\n        }],\n    };\n    \n}\n\noop.inherits(GherkinHighlightRules, TextHighlightRules);\n\nexports.GherkinHighlightRules = GherkinHighlightRules;\n});\n\nace.define(\"ace/mode/gherkin\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/gherkin_highlight_rules\"], function(require, exports, module) {\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar GherkinHighlightRules = require(\"./gherkin_highlight_rules\").GherkinHighlightRules;\n\nvar Mode = function() {\n    this.HighlightRules = GherkinHighlightRules;\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"#\";\n    this.$id = \"ace/mode/gherkin\";\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var space2 = \"  \";\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        \n        console.log(state)\n        \n        if(line.match(\"[ ]*\\\\|\")) {\n            indent += \"| \";\n        }\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n        \n\n        if (state == \"start\") {\n            if (line.match(\"Scenario:|Feature:|Scenario\\ Outline:|Background:\")) {\n                indent += space2;\n            } else if(line.match(\"(Given|Then).+(:)$|Examples:\")) {\n            \tindent += space2;\n            } else if(line.match(\"\\\\*.+\")) {\n            \tindent += \"* \";\n            } \n        }\n        \n\n        return indent;\n    };\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-gitignore.js",
    "content": "ace.define(\"ace/mode/gitignore_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar GitignoreHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : /^\\s*#.*$/\n            }, {\n                token : \"keyword\", // negated patterns\n                regex : /^\\s*!.*$/\n            }\n        ]\n    };\n    \n    this.normalizeRules();\n};\n\nGitignoreHighlightRules.metaData = {\n    fileTypes: ['gitignore'],\n    name: 'Gitignore'\n};\n\noop.inherits(GitignoreHighlightRules, TextHighlightRules);\n\nexports.GitignoreHighlightRules = GitignoreHighlightRules;\n});\n\nace.define(\"ace/mode/gitignore\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/gitignore_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar GitignoreHighlightRules = require(\"./gitignore_highlight_rules\").GitignoreHighlightRules;\n\nvar Mode = function() {\n    this.HighlightRules = GitignoreHighlightRules;\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"#\";\n    this.$id = \"ace/mode/gitignore\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-glsl.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/c_cpp_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar cFunctions = exports.cFunctions = \"\\\\b(?:hypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len))))\\\\b\"\n\nvar c_cppHighlightRules = function() {\n\n    var keywordControls = (\n        \"break|case|continue|default|do|else|for|goto|if|_Pragma|\" +\n        \"return|switch|while|catch|operator|try|throw|using\"\n    );\n    \n    var storageType = (\n        \"asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|\" +\n        \"_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|\" +\n        \"class|wchar_t|template\"\n    );\n\n    var storageModifiers = (\n        \"const|extern|register|restrict|static|volatile|inline|private|\" +\n        \"protected|public|friend|explicit|virtual|export|mutable|typename|\" +\n        \"constexpr|new|delete\"\n    );\n\n    var keywordOperators = (\n        \"and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq\" +\n        \"const_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace\"\n    );\n\n    var builtinConstants = (\n        \"NULL|true|false|TRUE|FALSE\"\n    );\n\n    var keywordMapper = this.$keywords = this.createKeywordMapper({\n        \"keyword.control\" : keywordControls,\n        \"storage.type\" : storageType,\n        \"storage.modifier\" : storageModifiers,\n        \"keyword.operator\" : keywordOperators,\n        \"variable.language\": \"this\",\n        \"constant.language\": builtinConstants\n    }, \"identifier\");\n\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    this.$rules = { \n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"//\",\n                next : \"singleLineComment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                regex : '[\"].*\\\\\\\\$',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"string\", // multi line string start\n                regex : \"['].*\\\\\\\\$\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"\n            }, {\n                token : \"keyword\", // pre-compiler directives\n                regex : \"#\\\\s*(?:include|import|pragma|line|define|undef|if|ifdef|else|elif|ifndef)\\\\b\",\n                next  : \"directive\"\n            }, {\n                token : \"keyword\", // special case pre-compiler directive\n                regex : \"(?:#\\\\s*endif)\\\\b\"\n            }, {\n                token : \"support.function.C99.c\",\n                regex : cFunctions\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)\"\n            }, {\n              token : \"punctuation.operator\",\n              regex : \"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ],\n        \"singleLineComment\" : [\n            {\n                token : \"comment\",\n                regex : /\\\\$/,\n                next : \"singleLineComment\"\n            }, {\n                token : \"comment\",\n                regex : /$/,\n                next : \"start\"\n            }, {\n                defaultToken: \"comment\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n                next : \"start\"\n            }, {\n                defaultToken : \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n                next : \"start\"\n            }, {\n                defaultToken : \"string\"\n            }\n        ],\n        \"directive\" : [\n            {\n                token : \"constant.other.multiline\",\n                regex : /\\\\/\n            },\n            {\n                token : \"constant.other.multiline\",\n                regex : /.*\\\\/\n            },\n            {\n                token : \"constant.other\",\n                regex : \"\\\\s*<.+?>\",\n                next : \"start\"\n            },\n            {\n                token : \"constant.other\", // single line\n                regex : '\\\\s*[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]',\n                next : \"start\"\n            }, \n            {\n                token : \"constant.other\", // single line\n                regex : \"\\\\s*['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\",\n                next : \"start\"\n            },\n            {\n                token : \"constant.other\",\n                regex : /[^\\\\\\/]+/,\n                next : \"start\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(c_cppHighlightRules, TextHighlightRules);\n\nexports.c_cppHighlightRules = c_cppHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/c_cpp\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/c_cpp_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar c_cppHighlightRules = require(\"./c_cpp_highlight_rules\").c_cppHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = c_cppHighlightRules;\n\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/c_cpp\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/glsl_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/c_cpp_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar c_cppHighlightRules = require(\"./c_cpp_highlight_rules\").c_cppHighlightRules;\n\nvar glslHighlightRules = function() {\n\n    var keywords = (\n        \"attribute|const|uniform|varying|break|continue|do|for|while|\" +\n        \"if|else|in|out|inout|float|int|void|bool|true|false|\" +\n        \"lowp|mediump|highp|precision|invariant|discard|return|mat2|mat3|\" +\n        \"mat4|vec2|vec3|vec4|ivec2|ivec3|ivec4|bvec2|bvec3|bvec4|sampler2D|\" +\n        \"samplerCube|struct\"\n    );\n\n    var buildinConstants = (\n        \"radians|degrees|sin|cos|tan|asin|acos|atan|pow|\" +\n        \"exp|log|exp2|log2|sqrt|inversesqrt|abs|sign|floor|ceil|fract|mod|\" +\n        \"min|max|clamp|mix|step|smoothstep|length|distance|dot|cross|\" +\n        \"normalize|faceforward|reflect|refract|matrixCompMult|lessThan|\" +\n        \"lessThanEqual|greaterThan|greaterThanEqual|equal|notEqual|any|all|\" +\n        \"not|dFdx|dFdy|fwidth|texture2D|texture2DProj|texture2DLod|\" +\n        \"texture2DProjLod|textureCube|textureCubeLod|\" +\n        \"gl_MaxVertexAttribs|gl_MaxVertexUniformVectors|gl_MaxVaryingVectors|\" +\n        \"gl_MaxVertexTextureImageUnits|gl_MaxCombinedTextureImageUnits|\" +\n        \"gl_MaxTextureImageUnits|gl_MaxFragmentUniformVectors|gl_MaxDrawBuffers|\" +\n        \"gl_DepthRangeParameters|gl_DepthRange|\" +\n        \"gl_Position|gl_PointSize|\" +\n        \"gl_FragCoord|gl_FrontFacing|gl_PointCoord|gl_FragColor|gl_FragData\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": \"this\",\n        \"keyword\": keywords,\n        \"constant.language\": buildinConstants\n    }, \"identifier\");\n\n    this.$rules = new c_cppHighlightRules().$rules;\n    this.$rules.start.forEach(function(rule) {\n        if (typeof rule.token == \"function\")\n            rule.token = keywordMapper;\n    })\n};\n\noop.inherits(glslHighlightRules, c_cppHighlightRules);\n\nexports.glslHighlightRules = glslHighlightRules;\n});\n\nace.define(\"ace/mode/glsl\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/c_cpp\",\"ace/mode/glsl_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar CMode = require(\"./c_cpp\").Mode;\nvar glslHighlightRules = require(\"./glsl_highlight_rules\").glslHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = glslHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, CMode);\n\n(function() {\n    this.$id = \"ace/mode/glsl\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-golang.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/golang_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n    var oop = require(\"../lib/oop\");\n    var DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\n    var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\n    var GolangHighlightRules = function() {\n        var keywords = (\n            \"else|break|case|return|goto|if|const|select|\" +\n            \"continue|struct|default|switch|for|range|\" +\n            \"func|import|package|chan|defer|fallthrough|go|interface|map|range|\" +\n            \"select|type|var\"\n        );\n        var builtinTypes = (\n            \"string|uint8|uint16|uint32|uint64|int8|int16|int32|int64|float32|\" +\n            \"float64|complex64|complex128|byte|rune|uint|int|uintptr|bool|error\"\n        );\n        var builtinFunctions = (\n            \"make|close|new|panic|recover\"\n        );\n        var builtinConstants = (\"nil|true|false|iota\");\n\n        var keywordMapper = this.createKeywordMapper({\n            \"keyword\": keywords,\n            \"constant.language\": builtinConstants,\n            \"support.function\": builtinFunctions,\n            \"support.type\": builtinTypes\n        }, \"identifier\");\n\n        this.$rules = {\n            \"start\" : [\n                {\n                    token : \"comment\",\n                    regex : \"\\\\/\\\\/.*$\"\n                },\n                DocCommentHighlightRules.getStartRule(\"doc-start\"),\n                {\n                    token : \"comment\", // multi line comment\n                    regex : \"\\\\/\\\\*\",\n                    next : \"comment\"\n                }, {\n                    token : \"string\", // single line\n                    regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n                }, {\n                    token : \"string\", // single line\n                    regex : '[`](?:[^`]*)[`]'\n                }, {\n                    token : \"string\", // multi line string start\n                    merge : true,\n                    regex : '[`](?:[^`]*)$',\n                    next : \"bqstring\"\n                }, {\n                    token : \"constant.numeric\", // rune\n                    regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))[']\"\n                }, {\n                    token : \"constant.numeric\", // hex\n                    regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n                }, {\n                    token : \"constant.numeric\", // float\n                    regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n                }, {\n                    token : keywordMapper,\n                    regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n                }, {\n                    token : \"keyword.operator\",\n                    regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=\"\n                }, {\n                    token : \"punctuation.operator\",\n                    regex : \"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"\n                }, {\n                    token : \"paren.lparen\",\n                    regex : \"[[({]\"\n                }, {\n                    token : \"paren.rparen\",\n                    regex : \"[\\\\])}]\"\n                }, {\n                    token : \"text\",\n                    regex : \"\\\\s+\"\n                }\n            ],\n            \"comment\" : [\n                {\n                    token : \"comment\", // closing comment\n                    regex : \".*?\\\\*\\\\/\",\n                    next : \"start\"\n                }, {\n                    token : \"comment\", // comment spanning whole line\n                    regex : \".+\"\n                }\n            ],\n            \"bqstring\" : [\n                {\n                    token : \"string\",\n                    regex : '(?:[^`]*)`',\n                    next : \"start\"\n                }, {\n                    token : \"string\",\n                    regex : '.+'\n                }\n            ]\n        };\n\n        this.embedRules(DocCommentHighlightRules, \"doc-\",\n            [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n    };\n    oop.inherits(GolangHighlightRules, TextHighlightRules);\n\n    exports.GolangHighlightRules = GolangHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/golang\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/golang_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar GolangHighlightRules = require(\"./golang_highlight_rules\").GolangHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = GolangHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    \n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n        \n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };//end getNextLineIndent\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/golang\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-groovy.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/groovy_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar GroovyHighlightRules = function() {\n\n    var keywords = (\n        \"assert|with|abstract|continue|for|new|switch|\" +\n        \"assert|default|goto|package|synchronized|\" +\n        \"boolean|do|if|private|this|\" +\n        \"break|double|implements|protected|throw|\" +\n        \"byte|else|import|public|throws|\" +\n        \"case|enum|instanceof|return|transient|\" +\n        \"catch|extends|int|short|try|\" +\n        \"char|final|interface|static|void|\" +\n        \"class|finally|long|strictfp|volatile|\" +\n        \"def|float|native|super|while\"\n    );\n\n    var buildinConstants = (\n        \"null|Infinity|NaN|undefined\"\n    );\n\n    var langClasses = (\n        \"AbstractMethodError|AssertionError|ClassCircularityError|\"+\n        \"ClassFormatError|Deprecated|EnumConstantNotPresentException|\"+\n        \"ExceptionInInitializerError|IllegalAccessError|\"+\n        \"IllegalThreadStateException|InstantiationError|InternalError|\"+\n        \"NegativeArraySizeException|NoSuchFieldError|Override|Process|\"+\n        \"ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|\"+\n        \"SuppressWarnings|TypeNotPresentException|UnknownError|\"+\n        \"UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|\"+\n        \"InstantiationException|IndexOutOfBoundsException|\"+\n        \"ArrayIndexOutOfBoundsException|CloneNotSupportedException|\"+\n        \"NoSuchFieldException|IllegalArgumentException|NumberFormatException|\"+\n        \"SecurityException|Void|InheritableThreadLocal|IllegalStateException|\"+\n        \"InterruptedException|NoSuchMethodException|IllegalAccessException|\"+\n        \"UnsupportedOperationException|Enum|StrictMath|Package|Compiler|\"+\n        \"Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|\"+\n        \"NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|\"+\n        \"NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|\"+\n        \"Character|Boolean|StackTraceElement|Appendable|StringBuffer|\"+\n        \"Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|\"+\n        \"StackOverflowError|OutOfMemoryError|VirtualMachineError|\"+\n        \"ArrayStoreException|ClassCastException|LinkageError|\"+\n        \"NoClassDefFoundError|ClassNotFoundException|RuntimeException|\"+\n        \"Exception|ThreadDeath|Error|Throwable|System|ClassLoader|\"+\n        \"Cloneable|Class|CharSequence|Comparable|String|Object\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": \"this\",\n        \"keyword\": keywords,\n        \"support.function\": langClasses,\n        \"constant.language\": buildinConstants\n    }, \"identifier\");\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string.regexp\",\n                regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"\n            }, {\n                token : \"string\",\n                regex : '\"\"\"',\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : \"'''\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"\\\\?:|\\\\?\\\\.|\\\\*\\\\.|<=>|=~|==~|\\\\.@|\\\\*\\\\.@|\\\\.&|as|in|is|!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"\n            }, {\n                token : \"lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : /\\\\(?:u[0-9A-Fa-f]{4}|.|$)/\n            }, {\n                token : \"constant.language.escape\",\n                regex : /\\$[\\w\\d]+/\n            }, {\n                token : \"constant.language.escape\",\n                regex : /\\$\\{[^\"\\}]+\\}?/\n            }, {\n                token : \"string\",\n                regex : '\"{3,5}',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '.+?'\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : /\\\\(?:u[0-9A-Fa-f]{4}|.|$)/\n            }, {\n                token : \"string\",\n                regex : \"'{3,5}\",\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : \".+?\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(GroovyHighlightRules, TextHighlightRules);\n\nexports.GroovyHighlightRules = GroovyHighlightRules;\n});\n\nace.define(\"ace/mode/groovy\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/javascript\",\"ace/mode/groovy_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar GroovyHighlightRules = require(\"./groovy_highlight_rules\").GroovyHighlightRules;\n\nvar Mode = function() {\n    JavaScriptMode.call(this);\n    this.HighlightRules = GroovyHighlightRules;\n};\noop.inherits(Mode, JavaScriptMode);\n\n(function() {\n\n    this.createWorker = function(session) {\n        return null;\n    };\n\n    this.$id = \"ace/mode/groovy\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-haml.js",
    "content": "ace.define(\"ace/mode/ruby_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar constantOtherSymbol = exports.constantOtherSymbol = {\n    token : \"constant.other.symbol.ruby\", // symbol\n    regex : \"[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?\"\n};\n\nvar qString = exports.qString = {\n    token : \"string\", // single line\n    regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n};\n\nvar qqString = exports.qqString = {\n    token : \"string\", // single line\n    regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n};\n\nvar tString = exports.tString = {\n    token : \"string\", // backtick string\n    regex : \"[`](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[`]\"\n};\n\nvar constantNumericHex = exports.constantNumericHex = {\n    token : \"constant.numeric\", // hex\n    regex : \"0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\\\b\"\n};\n\nvar constantNumericFloat = exports.constantNumericFloat = {\n    token : \"constant.numeric\", // float\n    regex : \"[+-]?\\\\d(?:\\\\d|_(?=\\\\d))*(?:(?:\\\\.\\\\d(?:\\\\d|_(?=\\\\d))*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n};\n\nvar RubyHighlightRules = function() {\n\n    var builtinFunctions = (\n        \"abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|\" +\n        \"assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|\" +\n        \"assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|\" +\n        \"assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|\" +\n        \"assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|\" +\n        \"assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|\" +\n        \"attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|\" +\n        \"caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|\" +\n        \"exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|\" +\n        \"gsub!|get_via_redirect|host!|https?|https!|include|Integer|lambda|link_to|\" +\n        \"link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|\" +\n        \"p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|\" +\n        \"raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|\" +\n        \"set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|\" +\n        \"throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|\" +\n        \"render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|\" +\n        \"content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|\" +\n        \"fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|\" +\n        \"time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|\" +\n        \"select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|\" +\n        \"file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|\" +\n        \"protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|\" +\n        \"send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|\" +\n        \"validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|\" +\n        \"validates_inclusion_of|validates_numericality_of|validates_with|validates_each|\" +\n        \"authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|\" +\n        \"filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|\" +\n        \"translate|localize|extract_locale_from_tld|caches_page|expire_page|caches_action|expire_action|\" +\n        \"cache|expire_fragment|expire_cache_for|observe|cache_sweeper|\" +\n        \"has_many|has_one|belongs_to|has_and_belongs_to_many\"\n    );\n\n    var keywords = (\n        \"alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|\" +\n        \"__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|\" +\n        \"redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield\"\n    );\n\n    var buildinConstants = (\n        \"true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|\" +\n        \"RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING\"\n    );\n\n    var builtinVariables = (\n        \"\\$DEBUG|\\$defout|\\$FILENAME|\\$LOAD_PATH|\\$SAFE|\\$stdin|\\$stdout|\\$stderr|\\$VERBOSE|\" +\n        \"$!|root_url|flash|session|cookies|params|request|response|logger|self\"\n    );\n\n    var keywordMapper = this.$keywords = this.createKeywordMapper({\n        \"keyword\": keywords,\n        \"constant.language\": buildinConstants,\n        \"variable.language\": builtinVariables,\n        \"support.function\": builtinFunctions,\n        \"invalid.deprecated\": \"debugger\" // TODO is this a remnant from js mode?\n    }, \"identifier\");\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"#.*$\"\n            }, {\n                token : \"comment\", // multi line comment\n                regex : \"^=begin(?:$|\\\\s.*$)\",\n                next : \"comment\"\n            }, {\n                token : \"string.regexp\",\n                regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"\n            },\n\n            [{\n                regex: \"[{}]\", onMatch: function(val, state, stack) {\n                    this.next = val == \"{\" ? this.nextState : \"\";\n                    if (val == \"{\" && stack.length) {\n                        stack.unshift(\"start\", state);\n                        return \"paren.lparen\";\n                    }\n                    if (val == \"}\" && stack.length) {\n                        stack.shift();\n                        this.next = stack.shift();\n                        if (this.next.indexOf(\"string\") != -1)\n                            return \"paren.end\";\n                    }\n                    return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n                },\n                nextState: \"start\"\n            }, {\n                token : \"string.start\",\n                regex : /\"/,\n                push  : [{\n                    token : \"constant.language.escape\",\n                    regex : /\\\\(?:[nsrtvfbae'\"\\\\]|c.|C-.|M-.(?:\\\\C-.)?|[0-7]{3}|x[\\da-fA-F]{2}|u[\\da-fA-F]{4})/\n                }, {\n                    token : \"paren.start\",\n                    regex : /\\#{/,\n                    push  : \"start\"\n                }, {\n                    token : \"string.end\",\n                    regex : /\"/,\n                    next  : \"pop\"\n                }, {\n                    defaultToken: \"string\"\n                }]\n            }, {\n                token : \"string.start\",\n                regex : /`/,\n                push  : [{\n                    token : \"constant.language.escape\",\n                    regex : /\\\\(?:[nsrtvfbae'\"\\\\]|c.|C-.|M-.(?:\\\\C-.)?|[0-7]{3}|x[\\da-fA-F]{2}|u[\\da-fA-F]{4})/\n                }, {\n                    token : \"paren.start\",\n                    regex : /\\#{/,\n                    push  : \"start\"\n                }, {\n                    token : \"string.end\",\n                    regex : /`/,\n                    next  : \"pop\"\n                }, {\n                    defaultToken: \"string\"\n                }]\n            }, {\n                token : \"string.start\",\n                regex : /'/,\n                push  : [{\n                    token : \"constant.language.escape\",\n                    regex : /\\\\['\\\\]/\n                },  {\n                    token : \"string.end\",\n                    regex : /'/,\n                    next  : \"pop\"\n                }, {\n                    defaultToken: \"string\"\n                }]\n            }],\n\n            {\n                token : \"text\", // namespaces aren't symbols\n                regex : \"::\"\n            }, {\n                token : \"variable.instance\", // instance variable\n                regex : \"@{1,2}[a-zA-Z_\\\\d]+\"\n            }, {\n                token : \"support.class\", // class name\n                regex : \"[A-Z][a-zA-Z_\\\\d]+\"\n            },\n\n            constantOtherSymbol,\n            constantNumericHex,\n            constantNumericFloat,\n\n            {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"punctuation.separator.key-value\",\n                regex : \"=>\"\n            }, {\n                stateName: \"heredoc\",\n                onMatch : function(value, currentState, stack) {\n                    var next = value[2] == '-' ? \"indentedHeredoc\" : \"heredoc\";\n                    var tokens = value.split(this.splitRegex);\n                    stack.push(next, tokens[3]);\n                    return [\n                        {type:\"constant\", value: tokens[1]},\n                        {type:\"string\", value: tokens[2]},\n                        {type:\"support.class\", value: tokens[3]},\n                        {type:\"string\", value: tokens[4]}\n                    ];\n                },\n                regex : \"(<<-?)(['\\\"`]?)([\\\\w]+)(['\\\"`]?)\",\n                rules: {\n                    heredoc: [{\n                        onMatch:  function(value, currentState, stack) {\n                            if (value === stack[1]) {\n                                stack.shift();\n                                stack.shift();\n                                this.next = stack[0] || \"start\";\n                                return \"support.class\";\n                            }\n                            this.next = \"\";\n                            return \"string\";\n                        },\n                        regex: \".*$\",\n                        next: \"start\"\n                    }],\n                    indentedHeredoc: [{\n                        token: \"string\",\n                        regex: \"^ +\"\n                    }, {\n                        onMatch:  function(value, currentState, stack) {\n                            if (value === stack[1]) {\n                                stack.shift();\n                                stack.shift();\n                                this.next = stack[0] || \"start\";\n                                return \"support.class\";\n                            }\n                            this.next = \"\";\n                            return \"string\";\n                        },\n                        regex: \".*$\",\n                        next: \"start\"\n                    }]\n                }\n            }, {\n                regex : \"$\",\n                token : \"empty\",\n                next : function(currentState, stack) {\n                    if (stack[0] === \"heredoc\" || stack[0] === \"indentedHeredoc\")\n                        return stack[0];\n                    return currentState;\n                }\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \"^=end(?:$|\\\\s.*$)\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(RubyHighlightRules, TextHighlightRules);\n\nexports.RubyHighlightRules = RubyHighlightRules;\n});\n\nace.define(\"ace/mode/haml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\",\"ace/mode/ruby_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar RubyExports = require(\"./ruby_highlight_rules\");\nvar RubyHighlightRules = RubyExports.RubyHighlightRules;\n\nvar HamlHighlightRules = function() {\n\n    this.$rules = \n        {\n    \"start\": [\n        {\n            token : \"punctuation.section.comment\",\n            regex : /^\\s*\\/.*/\n        },\n        {\n            token : \"punctuation.section.comment\",\n            regex : /^\\s*#.*/\n        },\n        {\n            token: \"string.quoted.double\",\n            regex: \"==.+?==\"\n        },\n        {\n            token: \"keyword.other.doctype\",\n            regex: \"^!!!\\\\s*(?:[a-zA-Z0-9-_]+)?\"\n        },\n        RubyExports.qString,\n        RubyExports.qqString,\n        RubyExports.tString,\n        {\n            token: [\"entity.name.tag.haml\"],\n            regex: /^\\s*%[\\w:]+/,\n            next: \"tag_single\"\n        },\n        {\n            token: [ \"meta.escape.haml\" ],\n            regex: \"^\\\\s*\\\\\\\\.\"\n        },\n        RubyExports.constantNumericHex,\n        RubyExports.constantNumericFloat,\n        \n        RubyExports.constantOtherSymbol,\n        {\n            token: \"text\",\n            regex: \"=|-|~\",\n            next: \"embedded_ruby\"\n        }\n    ],\n    \"tag_single\": [\n        {\n            token: \"entity.other.attribute-name.class.haml\",\n            regex: \"\\\\.[\\\\w-]+\"\n        },\n        {\n            token: \"entity.other.attribute-name.id.haml\",\n            regex: \"#[\\\\w-]+\"\n        },\n        {\n            token: \"punctuation.section\",\n            regex: \"\\\\{\",\n            next: \"section\"\n        },\n        \n        RubyExports.constantOtherSymbol,\n        \n        {\n            token: \"text\",\n            regex: /\\s/,\n            next: \"start\"\n        },\n        {\n            token: \"empty\",\n            regex: \"$|(?!\\\\.|#|\\\\{|\\\\[|=|-|~|\\\\/)\",\n            next: \"start\"\n        }\n    ],\n    \"section\": [\n        RubyExports.constantOtherSymbol,\n        \n        RubyExports.qString,\n        RubyExports.qqString,\n        RubyExports.tString,\n        \n        RubyExports.constantNumericHex,\n        RubyExports.constantNumericFloat,\n        {\n            token: \"punctuation.section\",\n            regex: \"\\\\}\",\n            next: \"start\"\n        } \n    ],\n    \"embedded_ruby\": [ \n        RubyExports.constantNumericHex,\n        RubyExports.constantNumericFloat,\n        {\n                token : \"support.class\", // class name\n                regex : \"[A-Z][a-zA-Z_\\\\d]+\"\n        },    \n        {\n            token : new RubyHighlightRules().getKeywords(),\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        },\n        {\n            token : [\"keyword\", \"text\", \"text\"],\n            regex : \"(?:do|\\\\{)(?: \\\\|[^|]+\\\\|)?$\",\n            next  : \"start\"\n        }, \n        {\n            token : [\"text\"],\n            regex : \"^$\",\n            next  : \"start\"\n        }, \n        {\n            token : [\"text\"],\n            regex : \"^(?!.*\\\\|\\\\s*$)\",\n            next  : \"start\"\n        }\n    ]\n}\n\n};\n\noop.inherits(HamlHighlightRules, TextHighlightRules);\n\nexports.HamlHighlightRules = HamlHighlightRules;\n});\n\nace.define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var range = this.indentationBlock(session, row);\n        if (range)\n            return range;\n\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1 || line[startLevel] != \"#\")\n            return;\n\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var level = line.search(re);\n\n            if (level == -1)\n                continue;\n\n            if (line[level] != \"#\")\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        var next = session.getLine(row + 1);\n        var prev = session.getLine(row - 1);\n        var prevIndent = prev.search(/\\S/);\n        var nextIndent = next.search(/\\S/);\n\n        if (indent == -1) {\n            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? \"start\" : \"\";\n            return \"\";\n        }\n        if (prevIndent == -1) {\n            if (indent == nextIndent && line[indent] == \"#\" && next[indent] == \"#\") {\n                session.foldWidgets[row - 1] = \"\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"start\";\n            }\n        } else if (prevIndent == indent && line[indent] == \"#\" && prev[indent] == \"#\") {\n            if (session.getLine(row - 2).search(/\\S/) == -1) {\n                session.foldWidgets[row - 1] = \"start\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"\";\n            }\n        }\n\n        if (prevIndent!= -1 && prevIndent < indent)\n            session.foldWidgets[row - 1] = \"start\";\n        else\n            session.foldWidgets[row - 1] = \"\";\n\n        if (indent < nextIndent)\n            return \"start\";\n        else\n            return \"\";\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/haml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/haml_highlight_rules\",\"ace/mode/folding/coffee\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar HamlHighlightRules = require(\"./haml_highlight_rules\").HamlHighlightRules;\nvar FoldMode = require(\"./folding/coffee\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = HamlHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = [\"//\", \"#\"];\n    \n    this.$id = \"ace/mode/haml\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-handlebars.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\nace.define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar CssBehaviour = function () {\n\n    this.inherit(CstyleBehaviour);\n\n    this.add(\"colon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(cursor.row);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                if (rightChar === ':') {\n                    return {\n                       text: '',\n                       selection: [1, 1]\n                    }\n                }\n                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n                    return {\n                       text: ':;',\n                       selection: [1, 1]\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"colon\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(range.start.row);\n                var rightChar = line.substring(range.end.column, range.end.column + 1);\n                if (rightChar === ';') {\n                    range.end.column ++;\n                    return range;\n                }\n            }\n        }\n    });\n\n    this.add(\"semicolon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ';') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === ';') {\n                return {\n                   text: '',\n                   selection: [1, 1]\n                }\n            }\n        }\n    });\n\n}\noop.inherits(CssBehaviour, CstyleBehaviour);\n\nexports.CssBehaviour = CssBehaviour;\n});\n\nace.define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CssBehaviour = require(\"./behaviour/css\").CssBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = CssHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CssBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"csslint\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/css\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\nace.define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"string.cdata.xml\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.xml-decl.xml\", \"keyword.xml-decl.xml\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_decl\", caseInsensitive: true\n            },\n            {\n                token : [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"processing_instruction\",\n            },\n            {token : \"comment.xml\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\", caseInsensitive: true\n            },\n            {include : \"tag\"},\n            {token : \"text.end-tag-open.xml\", regex: \"</\"},\n            {token : \"text.tag-open.xml\", regex: \"<\"},\n            {include : \"reference\"},\n            {defaultToken : \"text.xml\"}\n        ],\n\n        xml_decl : [{\n            token : \"entity.other.attribute-name.decl-attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.decl-attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"whitespace\"\n        }, {\n            include: \"string\"\n        }, {\n            token : \"punctuation.xml-decl.xml\",\n            regex : \"\\\\?>\",\n            next : \"start\"\n        }],\n\n        processing_instruction : [\n            {token : \"punctuation.instruction.xml\", regex : \"\\\\?>\", next : \"start\"},\n            {defaultToken : \"instruction.xml\"}\n        ],\n\n        doctype : [\n            {include : \"whitespace\"},\n            {include : \"string\"},\n            {token : \"xml-pe.doctype.xml\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe.xml\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.int-subset\", regex : \"\\\\[\", push : \"int_subset\"}\n        ],\n\n        int_subset : [{\n            token : \"text.xml\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.int-subset.xml\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.markup-decl.xml\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.cdata.xml\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text.xml\", regex : \"\\\\s+\"},\n            {token : \"text.xml\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment.xml\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment.xml\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape.reference.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        attr_reference : [{\n            token : \"constant.language.escape.reference.attribute-value.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n            regex : \"(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n            ]\n        }],\n\n        tag_whitespace : [\n            {token : \"text.tag-whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        whitespace : [\n            {token : \"text.whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        string: [{\n            token : \"string.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.xml\", regex: \"'\", next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }, {\n            token : \"string.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.xml\", regex: '\"', next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }],\n\n        attributes: [{\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"tag_whitespace\"\n        }, {\n            include: \"attribute_value\"\n        }],\n\n        attribute_value: [{\n            token : \"string.attribute-value.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }, {\n            token : \"string.attribute-value.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\nace.define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    option      : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.addRules({\n        attributes: [{\n            include : \"tag_whitespace\"\n        }, {\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\",\n            push : [{\n                include: \"tag_whitespace\"\n            }, {\n                token : \"string.unquoted.attribute-value.html\",\n                regex : \"[^<>='\\\"`\\\\s]+\",\n                next : \"pop\"\n            }, {\n                token : \"empty\",\n                regex : \"\",\n                next : \"pop\"\n            }]\n        }, {\n            include : \"attribute_value\"\n        }],\n        tag: [{\n            token : function(start, tag) {\n                var group = tagMap[tag];\n                return [\"meta.tag.punctuation.\" + (start == \"<\" ? \"\" : \"end-\") + \"tag-open.xml\",\n                    \"meta.tag\" + (group ? \".\" + group : \"\") + \".tag-name.xml\"];\n            },\n            regex : \"(</?)([-_a-zA-Z0-9:]+)\",\n            next: \"tag_stuff\"\n        }],\n        tag_stuff: [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n        ],\n    });\n\n    this.embedTagRules(CssHighlightRules, \"css-\", \"style\");\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    if (this.constructor === HtmlHighlightRules)\n        this.normalizeRules();\n};\n\noop.inherits(HtmlHighlightRules, XmlHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nvar XmlBehaviour = function () {\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selected = session.doc.getTextRange(editor.getSelectionRange());\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            }\n\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (rightChar == quote && (is(token, \"attribute-value\") || is(token, \"string\"))) {\n                return {\n                    text: \"\",\n                    selection: [1, 1]\n                };\n            }\n\n            if (!token)\n                token = iterator.stepBackward();\n\n            if (!token)\n                return;\n\n            while (is(token, \"tag-whitespace\") || is(token, \"whitespace\")) {\n                token = iterator.stepBackward();\n            }\n            var rightSpace = !rightChar || rightChar.match(/\\s/);\n            if (is(token, \"attribute-equals\") && (rightSpace || rightChar == '>') || (is(token, \"decl-attribute-equals\") && (rightSpace || rightChar == '?'))) {\n                return {\n                    text: quote + quote,\n                    selection: [1, 1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken() || iterator.stepBackward();\n            if (!token || !(is(token, \"tag-name\") || is(token, \"tag-whitespace\") || is(token, \"attribute-name\") || is(token, \"attribute-equals\") || is(token, \"attribute-value\")))\n                return;\n            if (is(token, \"reference.attribute-value\"))\n                return;\n            if (is(token, \"attribute-value\")) {\n                var firstChar = token.value.charAt(0);\n                if (firstChar == '\"' || firstChar == \"'\") {\n                    var lastChar = token.value.charAt(token.value.length - 1);\n                    var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length;\n                    if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar)\n                        return;\n                }\n            }\n            while (!is(token, \"tag-name\")) {\n                token = iterator.stepBackward();\n            }\n\n            var tokenRow = iterator.getCurrentTokenRow();\n            var tokenColumn = iterator.getCurrentTokenColumn();\n            if (is(iterator.stepBackward(), \"end-tag-open\"))\n                return;\n\n            var element = token.value;\n            if (tokenRow == position.row)\n                element = element.substring(0, position.column - tokenColumn);\n\n            if (this.voidElements.hasOwnProperty(element.toLowerCase()))\n                 return;\n\n            return {\n               text: \">\" + \"</\" + element + \">\",\n               selection: [1, 1]\n            };\n        }\n    });\n\n    this.add(\"autoindent\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.getLine(cursor.row);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (token && token.type.indexOf(\"tag-close\") !== -1) {\n                while (token && token.type.indexOf(\"tag-name\") === -1) {\n                    token = iterator.stepBackward();\n                }\n\n                if (!token) {\n                    return;\n                }\n\n                var tag = token.value;\n                var row = iterator.getCurrentTokenRow();\n                token = iterator.stepBackward();\n                if (!token || token.type.indexOf(\"end-tag\") !== -1) {\n                    return;\n                }\n\n                if (this.voidElements && !this.voidElements[tag]) {\n                    var nextToken = session.getTokenAt(cursor.row, cursor.column+1);\n                    var line = session.getLine(row);\n                    var nextIndent = this.$getIndent(line);\n                    var indent = nextIndent + session.getTabString();\n\n                    if (nextToken && nextToken.value === \"</\") {\n                        return {\n                            text: \"\\n\" + indent + \"\\n\" + nextIndent,\n                            selection: [1, indent.length, 1, indent.length]\n                        };\n                    } else {\n                        return {\n                            text: \"\\n\" + indent\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n};\n\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\nace.define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n    this.defaultMode = defaultMode;\n    this.subModes = subModes;\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n\n    this.$getMode = function(state) {\n        if (typeof state != \"string\") \n            state = state[0];\n        for (var key in this.subModes) {\n            if (state.indexOf(key) === 0)\n                return this.subModes[key];\n        }\n        return null;\n    };\n    \n    this.$tryMode = function(state, session, foldStyle, row) {\n        var mode = this.$getMode(state);\n        return (mode ? mode.getFoldWidget(session, foldStyle, row) : \"\");\n    };\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        return (\n            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n            this.defaultMode.getFoldWidget(session, foldStyle, row)\n        );\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var mode = this.$getMode(session.getState(row-1));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.$getMode(session.getState(row));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.defaultMode;\n        \n        return mode.getFoldWidgetRange(session, foldStyle, row);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalEndTags) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n    this.optionalEndTags = oop.mixin({}, this.voidElements);\n    if (optionalEndTags)\n        oop.mixin(this.optionalEndTags, optionalEndTags);\n    \n};\noop.inherits(FoldMode, BaseFoldMode);\n\nvar Tag = function() {\n    this.tagName = \"\";\n    this.closing = false;\n    this.selfClosing = false;\n    this.start = {row: 0, column: 0};\n    this.end = {row: 0, column: 0};\n};\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (!tag)\n            return \"\";\n\n        if (tag.closing || (!tag.tagName && tag.selfClosing))\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase()))\n            return \"\";\n\n        if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column))\n            return \"\";\n\n        return \"start\";\n    };\n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var tag = new Tag();\n\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (is(token, \"tag-open\")) {\n                tag.end.column = tag.start.column + token.value.length;\n                tag.closing = is(token, \"end-tag-open\");\n                token = tokens[++i];\n                if (!token)\n                    return null;\n                tag.tagName = token.value;\n                tag.end.column += token.value.length;\n                for (i++; i < tokens.length; i++) {\n                    token = tokens[i];\n                    tag.end.column += token.value.length;\n                    if (is(token, \"tag-close\")) {\n                        tag.selfClosing = token.value == '/>';\n                        break;\n                    }\n                }\n                return tag;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == '/>';\n                return tag;\n            }\n            tag.start.column += token.value.length;\n        }\n\n        return null;\n    };\n\n    this._findEndTagInLine = function(session, row, tagName, startColumn) {\n        var tokens = session.getTokens(row);\n        var column = 0;\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            column += token.value.length;\n            if (column < startColumn)\n                continue;\n            if (is(token, \"end-tag-open\")) {\n                token = tokens[i + 1];\n                if (token && token.value == tagName)\n                    return true;\n            }\n        }\n        return false;\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n                iterator.stepForward();\n                return tag;\n            }\n        } while(token = iterator.stepForward());\n\n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n                iterator.stepBackward();\n                return tag;\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n            }\n        } while(token = iterator.stepBackward());\n\n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.optionalEndTags.hasOwnProperty(top.tagName)) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.start.column);\n            var start = {\n                row: row,\n                column: firstTag.start.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.end.column);\n            var end = {\n                row: row,\n                column: firstTag.start.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar MixedFoldMode = require(\"./mixed\").FoldMode;\nvar XmlFoldMode = require(\"./xml\").FoldMode;\nvar CStyleFoldMode = require(\"./cstyle\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalTags) {\n    MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), {\n        \"js-\": new CStyleFoldMode(),\n        \"css-\": new CStyleFoldMode()\n    });\n};\n\noop.inherits(FoldMode, MixedFoldMode);\n\n});\n\nace.define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\n\nvar commonAttributes = [\n    \"accesskey\",\n    \"class\",\n    \"contenteditable\",\n    \"contextmenu\",\n    \"dir\",\n    \"draggable\",\n    \"dropzone\",\n    \"hidden\",\n    \"id\",\n    \"inert\",\n    \"itemid\",\n    \"itemprop\",\n    \"itemref\",\n    \"itemscope\",\n    \"itemtype\",\n    \"lang\",\n    \"spellcheck\",\n    \"style\",\n    \"tabindex\",\n    \"title\",\n    \"translate\"\n];\n\nvar eventAttributes = [\n    \"onabort\",\n    \"onblur\",\n    \"oncancel\",\n    \"oncanplay\",\n    \"oncanplaythrough\",\n    \"onchange\",\n    \"onclick\",\n    \"onclose\",\n    \"oncontextmenu\",\n    \"oncuechange\",\n    \"ondblclick\",\n    \"ondrag\",\n    \"ondragend\",\n    \"ondragenter\",\n    \"ondragleave\",\n    \"ondragover\",\n    \"ondragstart\",\n    \"ondrop\",\n    \"ondurationchange\",\n    \"onemptied\",\n    \"onended\",\n    \"onerror\",\n    \"onfocus\",\n    \"oninput\",\n    \"oninvalid\",\n    \"onkeydown\",\n    \"onkeypress\",\n    \"onkeyup\",\n    \"onload\",\n    \"onloadeddata\",\n    \"onloadedmetadata\",\n    \"onloadstart\",\n    \"onmousedown\",\n    \"onmousemove\",\n    \"onmouseout\",\n    \"onmouseover\",\n    \"onmouseup\",\n    \"onmousewheel\",\n    \"onpause\",\n    \"onplay\",\n    \"onplaying\",\n    \"onprogress\",\n    \"onratechange\",\n    \"onreset\",\n    \"onscroll\",\n    \"onseeked\",\n    \"onseeking\",\n    \"onselect\",\n    \"onshow\",\n    \"onstalled\",\n    \"onsubmit\",\n    \"onsuspend\",\n    \"ontimeupdate\",\n    \"onvolumechange\",\n    \"onwaiting\"\n];\n\nvar globalAttributes = commonAttributes.concat(eventAttributes);\n\nvar attributeMap = {\n    \"html\": [\"manifest\"],\n    \"head\": [],\n    \"title\": [],\n    \"base\": [\"href\", \"target\"],\n    \"link\": [\"href\", \"hreflang\", \"rel\", \"media\", \"type\", \"sizes\"],\n    \"meta\": [\"http-equiv\", \"name\", \"content\", \"charset\"],\n    \"style\": [\"type\", \"media\", \"scoped\"],\n    \"script\": [\"charset\", \"type\", \"src\", \"defer\", \"async\"],\n    \"noscript\": [\"href\"],\n    \"body\": [\"onafterprint\", \"onbeforeprint\", \"onbeforeunload\", \"onhashchange\", \"onmessage\", \"onoffline\", \"onpopstate\", \"onredo\", \"onresize\", \"onstorage\", \"onundo\", \"onunload\"],\n    \"section\": [],\n    \"nav\": [],\n    \"article\": [\"pubdate\"],\n    \"aside\": [],\n    \"h1\": [],\n    \"h2\": [],\n    \"h3\": [],\n    \"h4\": [],\n    \"h5\": [],\n    \"h6\": [],\n    \"header\": [],\n    \"footer\": [],\n    \"address\": [],\n    \"main\": [],\n    \"p\": [],\n    \"hr\": [],\n    \"pre\": [],\n    \"blockquote\": [\"cite\"],\n    \"ol\": [\"start\", \"reversed\"],\n    \"ul\": [],\n    \"li\": [\"value\"],\n    \"dl\": [],\n    \"dt\": [],\n    \"dd\": [],\n    \"figure\": [],\n    \"figcaption\": [],\n    \"div\": [],\n    \"a\": [\"href\", \"target\", \"ping\", \"rel\", \"media\", \"hreflang\", \"type\"],\n    \"em\": [],\n    \"strong\": [],\n    \"small\": [],\n    \"s\": [],\n    \"cite\": [],\n    \"q\": [\"cite\"],\n    \"dfn\": [],\n    \"abbr\": [],\n    \"data\": [],\n    \"time\": [\"datetime\"],\n    \"code\": [],\n    \"var\": [],\n    \"samp\": [],\n    \"kbd\": [],\n    \"sub\": [],\n    \"sup\": [],\n    \"i\": [],\n    \"b\": [],\n    \"u\": [],\n    \"mark\": [],\n    \"ruby\": [],\n    \"rt\": [],\n    \"rp\": [],\n    \"bdi\": [],\n    \"bdo\": [],\n    \"span\": [],\n    \"br\": [],\n    \"wbr\": [],\n    \"ins\": [\"cite\", \"datetime\"],\n    \"del\": [\"cite\", \"datetime\"],\n    \"img\": [\"alt\", \"src\", \"height\", \"width\", \"usemap\", \"ismap\"],\n    \"iframe\": [\"name\", \"src\", \"height\", \"width\", \"sandbox\", \"seamless\"],\n    \"embed\": [\"src\", \"height\", \"width\", \"type\"],\n    \"object\": [\"param\", \"data\", \"type\", \"height\" , \"width\", \"usemap\", \"name\", \"form\", \"classid\"],\n    \"param\": [\"name\", \"value\"],\n    \"video\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\", \"width\", \"height\", \"poster\"],\n    \"audio\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\"],\n    \"source\": [\"src\", \"type\", \"media\"],\n    \"track\": [\"kind\", \"src\", \"srclang\", \"label\", \"default\"],\n    \"canvas\": [\"width\", \"height\"],\n    \"map\": [\"name\"],\n    \"area\": [\"shape\", \"coords\", \"href\", \"hreflang\", \"alt\", \"target\", \"media\", \"rel\", \"ping\", \"type\"],\n    \"svg\": [],\n    \"math\": [],\n    \"table\": [\"summary\"],\n    \"caption\": [],\n    \"colgroup\": [\"span\"],\n    \"col\": [\"span\"],\n    \"tbody\": [],\n    \"thead\": [],\n    \"tfoot\": [],\n    \"tr\": [],\n    \"td\": [\"headers\", \"rowspan\", \"colspan\"],\n    \"th\": [\"headers\", \"rowspan\", \"colspan\", \"scope\"],\n    \"form\": [\"accept-charset\", \"action\", \"autocomplete\", \"enctype\", \"method\", \"name\", \"novalidate\", \"target\"],\n    \"fieldset\": [\"disabled\", \"form\", \"name\"],\n    \"legend\": [],\n    \"label\": [\"form\", \"for\"],\n    \"input\": [\"type\", \"accept\", \"alt\", \"autocomplete\", \"checked\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"height\", \"list\", \"max\", \"maxlength\", \"min\", \"multiple\", \"pattern\", \"placeholder\", \"readonly\", \"required\", \"size\", \"src\", \"step\", \"width\", \"files\", \"value\"],\n    \"button\": [\"autofocus\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"name\", \"value\", \"type\"],\n    \"select\": [\"autofocus\", \"disabled\", \"form\", \"multiple\", \"name\", \"size\"],\n    \"datalist\": [],\n    \"optgroup\": [\"disabled\", \"label\"],\n    \"option\": [\"disabled\", \"selected\", \"label\", \"value\"],\n    \"textarea\": [\"autofocus\", \"disabled\", \"form\", \"maxlength\", \"name\", \"placeholder\", \"readonly\", \"required\", \"rows\", \"cols\", \"wrap\"],\n    \"keygen\": [\"autofocus\", \"challenge\", \"disabled\", \"form\", \"keytype\", \"name\"],\n    \"output\": [\"for\", \"form\", \"name\"],\n    \"progress\": [\"value\", \"max\"],\n    \"meter\": [\"value\", \"min\", \"max\", \"low\", \"high\", \"optimum\"],\n    \"details\": [\"open\"],\n    \"summary\": [],\n    \"command\": [\"type\", \"label\", \"icon\", \"disabled\", \"checked\", \"radiogroup\", \"command\"],\n    \"menu\": [\"type\", \"label\"],\n    \"dialog\": [\"open\"]\n};\n\nvar elements = Object.keys(attributeMap);\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nfunction findTagName(session, pos) {\n    var iterator = new TokenIterator(session, pos.row, pos.column);\n    var token = iterator.getCurrentToken();\n    while (token && !is(token, \"tag-name\")){\n        token = iterator.stepBackward();\n    }\n    if (token)\n        return token.value;\n}\n\nvar HtmlCompletions = function() {\n\n};\n\n(function() {\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        var token = session.getTokenAt(pos.row, pos.column);\n\n        if (!token)\n            return [];\n        if (is(token, \"tag-name\") || is(token, \"tag-open\") || is(token, \"end-tag-open\"))\n            return this.getTagCompletions(state, session, pos, prefix);\n        if (is(token, \"tag-whitespace\") || is(token, \"attribute-name\"))\n            return this.getAttributeCompetions(state, session, pos, prefix);\n\n        return [];\n    };\n\n    this.getTagCompletions = function(state, session, pos, prefix) {\n        return elements.map(function(element){\n            return {\n                value: element,\n                meta: \"tag\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n    this.getAttributeCompetions = function(state, session, pos, prefix) {\n        var tagName = findTagName(session, pos);\n        if (!tagName)\n            return [];\n        var attributes = globalAttributes;\n        if (tagName in attributeMap) {\n            attributes = attributes.concat(attributeMap[tagName]);\n        }\n        return attributes.map(function(attribute){\n            return {\n                caption: attribute,\n                snippet: attribute + '=\"$0\"',\n                meta: \"attribute\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n}).call(HtmlCompletions.prototype);\n\nexports.HtmlCompletions = HtmlCompletions;\n});\n\nace.define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar HtmlFoldMode = require(\"./folding/html\").FoldMode;\nvar HtmlCompletions = require(\"./html_completions\").HtmlCompletions;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar voidElements = [\"area\", \"base\", \"br\", \"col\", \"embed\", \"hr\", \"img\", \"input\", \"keygen\", \"link\", \"meta\", \"menuitem\", \"param\", \"source\", \"track\", \"wbr\"];\nvar optionalEndTags = [\"li\", \"dt\", \"dd\", \"p\", \"rt\", \"rp\", \"optgroup\", \"option\", \"colgroup\", \"td\", \"th\"];\n\nvar Mode = function(options) {\n    this.fragmentContext = options && options.fragmentContext;\n    this.HighlightRules = HtmlHighlightRules;\n    this.$behaviour = new XmlBehaviour();\n    this.$completer = new HtmlCompletions();\n    \n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"css-\": CssMode\n    });\n    \n    this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags));\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n    this.voidElements = lang.arrayToMap(voidElements);\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        return this.$completer.getCompletions(state, session, pos, prefix);\n    };\n\n    this.createWorker = function(session) {\n        if (this.constructor != Mode)\n            return;\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/html_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        if (this.fragmentContext)\n            worker.call(\"setOptions\", [{context: this.fragmentContext}]);\n\n        worker.on(\"error\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/html\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/handlebars_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\n\nfunction pop2(currentState, stack) {\n    stack.splice(0, 3);\n    return stack.shift() || \"start\";\n}\nvar HandlebarsHighlightRules = function() {\n    HtmlHighlightRules.call(this);\n    var hbs = {\n        regex : \"(?={{)\",\n        push : \"handlebars\"\n    };\n    for (var key in this.$rules) {\n        this.$rules[key].unshift(hbs);\n    }\n    this.$rules.handlebars = [{\n        token : \"comment.start\",\n        regex : \"{{!--\",\n        push : [{\n            token : \"comment.end\",\n            regex : \"--}}\",\n            next : pop2\n        }, {\n            defaultToken : \"comment\"\n        }]\n    }, {\n        token : \"comment.start\",\n        regex : \"{{!\",\n        push : [{\n            token : \"comment.end\",\n            regex : \"}}\",\n            next : pop2\n        }, {\n            defaultToken : \"comment\"\n        }]\n    }, {\n        token : \"support.function\", // unescaped variable\n        regex : \"{{{\",\n        push : [{\n            token : \"support.function\",\n            regex : \"}}}\",\n            next : pop2\n        }, {\n            token : \"variable.parameter\",\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\"\n        }]\n    }, {\n        token : \"storage.type.start\", // begin section\n        regex : \"{{[#\\\\^/&]?\",\n        push : [{\n            token : \"storage.type.end\",\n            regex : \"}}\",\n            next : pop2\n        }, {\n            token : \"variable.parameter\",\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\"\n        }]\n    }];\n\n    this.normalizeRules();\n};\n\noop.inherits(HandlebarsHighlightRules, HtmlHighlightRules);\n\nexports.HandlebarsHighlightRules = HandlebarsHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour/xml\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar XmlBehaviour = require(\"../behaviour/xml\").XmlBehaviour;\n\nvar HtmlBehaviour = function () {\n\n    XmlBehaviour.call(this);\n\n};\n\noop.inherits(HtmlBehaviour, XmlBehaviour);\n\nexports.HtmlBehaviour = HtmlBehaviour;\n});\n\nace.define(\"ace/mode/handlebars\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html\",\"ace/mode/handlebars_highlight_rules\",\"ace/mode/behaviour/html\",\"ace/mode/folding/html\"], function(require, exports, module) {\n  \"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar HtmlMode = require(\"./html\").Mode;\nvar HandlebarsHighlightRules = require(\"./handlebars_highlight_rules\").HandlebarsHighlightRules;\nvar HtmlBehaviour = require(\"./behaviour/html\").HtmlBehaviour;\nvar HtmlFoldMode = require(\"./folding/html\").FoldMode;\n\nvar Mode = function() {\n    HtmlMode.call(this);\n    this.HighlightRules = HandlebarsHighlightRules;\n    this.$behaviour = new HtmlBehaviour();\n\n    \n    this.foldingRules = new HtmlFoldMode();\n};\n\noop.inherits(Mode, HtmlMode);\n\n(function() {\n    this.blockComment = {start: \"{!--\", end: \"--}\"};\n    this.$id = \"ace/mode/handlebars\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-haskell.js",
    "content": "ace.define(\"ace/mode/haskell_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar HaskellHighlightRules = function() {\n\n    this.$rules = { start: \n       [ { token: \n            [ 'punctuation.definition.entity.haskell',\n              'keyword.operator.function.infix.haskell',\n              'punctuation.definition.entity.haskell' ],\n           regex: '(`)([a-zA-Z_\\']*?)(`)',\n           comment: 'In case this regex seems unusual for an infix operator, note that Haskell allows any ordinary function application (elem 4 [1..10]) to be rewritten as an infix expression (4 `elem` [1..10]).' },\n         { token: 'constant.language.unit.haskell', regex: '\\\\(\\\\)' },\n         { token: 'constant.language.empty-list.haskell',\n           regex: '\\\\[\\\\]' },\n         { token: 'keyword.other.haskell',\n           regex: 'module',\n           push: \n            [ { token: 'keyword.other.haskell', regex: 'where', next: 'pop' },\n              { include: '#module_name' },\n              { include: '#module_exports' },\n              { token: 'invalid', regex: '[a-z]+' },\n              { defaultToken: 'meta.declaration.module.haskell' } ] },\n         { token: 'keyword.other.haskell',\n           regex: '\\\\bclass\\\\b',\n           push: \n            [ { token: 'keyword.other.haskell',\n                regex: '\\\\bwhere\\\\b',\n                next: 'pop' },\n              { token: 'support.class.prelude.haskell',\n                regex: '\\\\b(?:Monad|Functor|Eq|Ord|Read|Show|Num|(?:Frac|Ra)tional|Enum|Bounded|Real(?:Frac|Float)?|Integral|Floating)\\\\b' },\n              { token: 'entity.other.inherited-class.haskell',\n                regex: '[A-Z][A-Za-z_\\']*' },\n              { token: 'variable.other.generic-type.haskell',\n                regex: '\\\\b[a-z][a-zA-Z0-9_\\']*\\\\b' },\n              { defaultToken: 'meta.declaration.class.haskell' } ] },\n         { token: 'keyword.other.haskell',\n           regex: '\\\\binstance\\\\b',\n           push: \n            [ { token: 'keyword.other.haskell',\n                regex: '\\\\bwhere\\\\b|$',\n                next: 'pop' },\n              { include: '#type_signature' },\n              { defaultToken: 'meta.declaration.instance.haskell' } ] },\n         { token: 'keyword.other.haskell',\n           regex: 'import',\n           push: \n            [ { token: 'meta.import.haskell', regex: '$|;', next: 'pop' },\n              { token: 'keyword.other.haskell', regex: 'qualified|as|hiding' },\n              { include: '#module_name' },\n              { include: '#module_exports' },\n              { defaultToken: 'meta.import.haskell' } ] },\n         { token: [ 'keyword.other.haskell', 'meta.deriving.haskell' ],\n           regex: '(deriving)(\\\\s*\\\\()',\n           push: \n            [ { token: 'meta.deriving.haskell', regex: '\\\\)', next: 'pop' },\n              { token: 'entity.other.inherited-class.haskell',\n                regex: '\\\\b[A-Z][a-zA-Z_\\']*' },\n              { defaultToken: 'meta.deriving.haskell' } ] },\n         { token: 'keyword.other.haskell',\n           regex: '\\\\b(?:deriving|where|data|type|case|of|let|in|newtype|default)\\\\b' },\n         { token: 'keyword.operator.haskell', regex: '\\\\binfix[lr]?\\\\b' },\n         { token: 'keyword.control.haskell',\n           regex: '\\\\b(?:do|if|then|else)\\\\b' },\n         { token: 'constant.numeric.float.haskell',\n           regex: '\\\\b(?:[0-9]+\\\\.[0-9]+(?:[eE][+-]?[0-9]+)?|[0-9]+[eE][+-]?[0-9]+)\\\\b',\n           comment: 'Floats are always decimal' },\n         { token: 'constant.numeric.haskell',\n           regex: '\\\\b(?:[0-9]+|0(?:[xX][0-9a-fA-F]+|[oO][0-7]+))\\\\b' },\n         { token: \n            [ 'meta.preprocessor.c',\n              'punctuation.definition.preprocessor.c',\n              'meta.preprocessor.c' ],\n           regex: '^(\\\\s*)(#)(\\\\s*\\\\w+)',\n           comment: 'In addition to Haskell\\'s \"native\" syntax, GHC permits the C preprocessor to be run on a source file.' },\n         { include: '#pragma' },\n         { token: 'punctuation.definition.string.begin.haskell',\n           regex: '\"',\n           push: \n            [ { token: 'punctuation.definition.string.end.haskell',\n                regex: '\"',\n                next: 'pop' },\n              { token: 'constant.character.escape.haskell',\n                regex: '\\\\\\\\(?:NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|[abfnrtv\\\\\\\\\\\\\"\\'\\\\&])' },\n              { token: 'constant.character.escape.octal.haskell',\n                regex: '\\\\\\\\o[0-7]+|\\\\\\\\x[0-9A-Fa-f]+|\\\\\\\\[0-9]+' },\n              { token: 'constant.character.escape.control.haskell',\n                regex: '\\\\^[A-Z@\\\\[\\\\]\\\\\\\\\\\\^_]' },\n              { defaultToken: 'string.quoted.double.haskell' } ] },\n         { token: \n            [ 'punctuation.definition.string.begin.haskell',\n              'string.quoted.single.haskell',\n              'constant.character.escape.haskell',\n              'constant.character.escape.octal.haskell',\n              'constant.character.escape.hexadecimal.haskell',\n              'constant.character.escape.control.haskell',\n              'punctuation.definition.string.end.haskell' ],\n           regex: '(\\')(?:([\\\\ -\\\\[\\\\]-~])|(\\\\\\\\(?:NUL|SOH|STX|ETX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|SO|SI|DLE|DC1|DC2|DC3|DC4|NAK|SYN|ETB|CAN|EM|SUB|ESC|FS|GS|RS|US|SP|DEL|[abfnrtv\\\\\\\\\\\\\"\\'\\\\&]))|(\\\\\\\\o[0-7]+)|(\\\\\\\\x[0-9A-Fa-f]+)|(\\\\^[A-Z@\\\\[\\\\]\\\\\\\\\\\\^_]))(\\')' },\n         { token: \n            [ 'meta.function.type-declaration.haskell',\n              'entity.name.function.haskell',\n              'meta.function.type-declaration.haskell',\n              'keyword.other.double-colon.haskell' ],\n           regex: '^(\\\\s*)([a-z_][a-zA-Z0-9_\\']*|\\\\([|!%$+\\\\-.,=</>]+\\\\))(\\\\s*)(::)',\n           push: \n            [ { token: 'meta.function.type-declaration.haskell',\n                regex: '$',\n                next: 'pop' },\n              { include: '#type_signature' },\n              { defaultToken: 'meta.function.type-declaration.haskell' } ] },\n         { token: 'support.constant.haskell',\n           regex: '\\\\b(?:Just|Nothing|Left|Right|True|False|LT|EQ|GT|\\\\(\\\\)|\\\\[\\\\])\\\\b' },\n         { token: 'constant.other.haskell', regex: '\\\\b[A-Z]\\\\w*\\\\b' },\n         { include: '#comments' },\n         { token: 'support.function.prelude.haskell',\n           regex: '\\\\b(?:abs|acos|acosh|all|and|any|appendFile|applyM|asTypeOf|asin|asinh|atan|atan2|atanh|break|catch|ceiling|compare|concat|concatMap|const|cos|cosh|curry|cycle|decodeFloat|div|divMod|drop|dropWhile|elem|encodeFloat|enumFrom|enumFromThen|enumFromThenTo|enumFromTo|error|even|exp|exponent|fail|filter|flip|floatDigits|floatRadix|floatRange|floor|fmap|foldl|foldl1|foldr|foldr1|fromEnum|fromInteger|fromIntegral|fromRational|fst|gcd|getChar|getContents|getLine|head|id|init|interact|ioError|isDenormalized|isIEEE|isInfinite|isNaN|isNegativeZero|iterate|last|lcm|length|lex|lines|log|logBase|lookup|map|mapM|mapM_|max|maxBound|maximum|maybe|min|minBound|minimum|mod|negate|not|notElem|null|odd|or|otherwise|pi|pred|print|product|properFraction|putChar|putStr|putStrLn|quot|quotRem|read|readFile|readIO|readList|readLn|readParen|reads|readsPrec|realToFrac|recip|rem|repeat|replicate|return|reverse|round|scaleFloat|scanl|scanl1|scanr|scanr1|seq|sequence|sequence_|show|showChar|showList|showParen|showString|shows|showsPrec|significand|signum|sin|sinh|snd|span|splitAt|sqrt|subtract|succ|sum|tail|take|takeWhile|tan|tanh|toEnum|toInteger|toRational|truncate|uncurry|undefined|unlines|until|unwords|unzip|unzip3|userError|words|writeFile|zip|zip3|zipWith|zipWith3)\\\\b' },\n         { include: '#infix_op' },\n         { token: 'keyword.operator.haskell',\n           regex: '[|!%$?~+:\\\\-.=</>\\\\\\\\]+',\n           comment: 'In case this regex seems overly general, note that Haskell permits the definition of new operators which can be nearly any string of punctuation characters, such as $%^&*.' },\n         { token: 'punctuation.separator.comma.haskell', regex: ',' } ],\n      '#block_comment': \n       [ { token: 'punctuation.definition.comment.haskell',\n           regex: '\\\\{-(?!#)',\n           push: \n            [ { include: '#block_comment' },\n              { token: 'punctuation.definition.comment.haskell',\n                regex: '-\\\\}',\n                next: 'pop' },\n              { defaultToken: 'comment.block.haskell' } ] } ],\n      '#comments': \n       [ { token: 'punctuation.definition.comment.haskell',\n           regex: '--.*',\n           push_: \n            [ { token: 'comment.line.double-dash.haskell',\n                regex: '$',\n                next: 'pop' },\n              { defaultToken: 'comment.line.double-dash.haskell' } ] },\n         { include: '#block_comment' } ],\n      '#infix_op': \n       [ { token: 'entity.name.function.infix.haskell',\n           regex: '\\\\([|!%$+:\\\\-.=</>]+\\\\)|\\\\(,+\\\\)' } ],\n      '#module_exports': \n       [ { token: 'meta.declaration.exports.haskell',\n           regex: '\\\\(',\n           push: \n            [ { token: 'meta.declaration.exports.haskell',\n                regex: '\\\\)',\n                next: 'pop' },\n              { token: 'entity.name.function.haskell',\n                regex: '\\\\b[a-z][a-zA-Z_\\']*' },\n              { token: 'storage.type.haskell', regex: '\\\\b[A-Z][A-Za-z_\\']*' },\n              { token: 'punctuation.separator.comma.haskell', regex: ',' },\n              { include: '#infix_op' },\n              { token: 'meta.other.unknown.haskell',\n                regex: '\\\\(.*?\\\\)',\n                comment: 'So named because I don\\'t know what to call this.' },\n              { defaultToken: 'meta.declaration.exports.haskell' } ] } ],\n      '#module_name': \n       [ { token: 'support.other.module.haskell',\n           regex: '[A-Z][A-Za-z._\\']*' } ],\n      '#pragma': \n       [ { token: 'meta.preprocessor.haskell',\n           regex: '\\\\{-#',\n           push: \n            [ { token: 'meta.preprocessor.haskell',\n                regex: '#-\\\\}',\n                next: 'pop' },\n              { token: 'keyword.other.preprocessor.haskell',\n                regex: '\\\\b(?:LANGUAGE|UNPACK|INLINE)\\\\b' },\n              { defaultToken: 'meta.preprocessor.haskell' } ] } ],\n      '#type_signature': \n       [ { token: \n            [ 'meta.class-constraint.haskell',\n              'entity.other.inherited-class.haskell',\n              'meta.class-constraint.haskell',\n              'variable.other.generic-type.haskell',\n              'meta.class-constraint.haskell',\n              'keyword.other.big-arrow.haskell' ],\n           regex: '(\\\\(\\\\s*)([A-Z][A-Za-z]*)(\\\\s+)([a-z][A-Za-z_\\']*)(\\\\)\\\\s*)(=>)' },\n         { include: '#pragma' },\n         { token: 'keyword.other.arrow.haskell', regex: '->' },\n         { token: 'keyword.other.big-arrow.haskell', regex: '=>' },\n         { token: 'support.type.prelude.haskell',\n           regex: '\\\\b(?:Int(?:eger)?|Maybe|Either|Bool|Float|Double|Char|String|Ordering|ShowS|ReadS|FilePath|IO(?:Error)?)\\\\b' },\n         { token: 'variable.other.generic-type.haskell',\n           regex: '\\\\b[a-z][a-zA-Z0-9_\\']*\\\\b' },\n         { token: 'storage.type.haskell',\n           regex: '\\\\b[A-Z][a-zA-Z0-9_\\']*\\\\b' },\n         { token: 'support.constant.unit.haskell', regex: '\\\\(\\\\)' },\n         { include: '#comments' } ] }\n    \n    this.normalizeRules();\n};\n\nHaskellHighlightRules.metaData = { fileTypes: [ 'hs' ],\n      keyEquivalent: '^~H',\n      name: 'Haskell',\n      scopeName: 'source.haskell' }\n\n\noop.inherits(HaskellHighlightRules, TextHighlightRules);\n\nexports.HaskellHighlightRules = HaskellHighlightRules;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/haskell\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/haskell_highlight_rules\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar HaskellHighlightRules = require(\"./haskell_highlight_rules\").HaskellHighlightRules;\nvar FoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = HaskellHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"--\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n    this.$id = \"ace/mode/haskell\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-haxe.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/haxe_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\n\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar HaxeHighlightRules = function() {\n\n    var keywords = (\n        \"break|case|cast|catch|class|continue|default|else|enum|extends|for|function|if|implements|import|in|inline|interface|new|override|package|private|public|return|static|super|switch|this|throw|trace|try|typedef|untyped|var|while|Array|Void|Bool|Int|UInt|Float|Dynamic|String|List|Hash|IntHash|Error|Unknown|Type|Std\"\n    );\n\n    var buildinConstants = (\n        \"null|true|false\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": \"this\",\n        \"keyword\": keywords,\n        \"constant.language\": buildinConstants\n    }, \"identifier\");\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string.regexp\",\n                regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : \"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({<]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}>]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(HaxeHighlightRules, TextHighlightRules);\n\nexports.HaxeHighlightRules = HaxeHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/haxe\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/haxe_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar HaxeHighlightRules = require(\"./haxe_highlight_rules\").HaxeHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = HaxeHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n    \n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/haxe\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-html.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\nace.define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar CssBehaviour = function () {\n\n    this.inherit(CstyleBehaviour);\n\n    this.add(\"colon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(cursor.row);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                if (rightChar === ':') {\n                    return {\n                       text: '',\n                       selection: [1, 1]\n                    }\n                }\n                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n                    return {\n                       text: ':;',\n                       selection: [1, 1]\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"colon\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(range.start.row);\n                var rightChar = line.substring(range.end.column, range.end.column + 1);\n                if (rightChar === ';') {\n                    range.end.column ++;\n                    return range;\n                }\n            }\n        }\n    });\n\n    this.add(\"semicolon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ';') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === ';') {\n                return {\n                   text: '',\n                   selection: [1, 1]\n                }\n            }\n        }\n    });\n\n}\noop.inherits(CssBehaviour, CstyleBehaviour);\n\nexports.CssBehaviour = CssBehaviour;\n});\n\nace.define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CssBehaviour = require(\"./behaviour/css\").CssBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = CssHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CssBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"csslint\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/css\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\nace.define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"string.cdata.xml\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.xml-decl.xml\", \"keyword.xml-decl.xml\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_decl\", caseInsensitive: true\n            },\n            {\n                token : [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"processing_instruction\",\n            },\n            {token : \"comment.xml\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\", caseInsensitive: true\n            },\n            {include : \"tag\"},\n            {token : \"text.end-tag-open.xml\", regex: \"</\"},\n            {token : \"text.tag-open.xml\", regex: \"<\"},\n            {include : \"reference\"},\n            {defaultToken : \"text.xml\"}\n        ],\n\n        xml_decl : [{\n            token : \"entity.other.attribute-name.decl-attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.decl-attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"whitespace\"\n        }, {\n            include: \"string\"\n        }, {\n            token : \"punctuation.xml-decl.xml\",\n            regex : \"\\\\?>\",\n            next : \"start\"\n        }],\n\n        processing_instruction : [\n            {token : \"punctuation.instruction.xml\", regex : \"\\\\?>\", next : \"start\"},\n            {defaultToken : \"instruction.xml\"}\n        ],\n\n        doctype : [\n            {include : \"whitespace\"},\n            {include : \"string\"},\n            {token : \"xml-pe.doctype.xml\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe.xml\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.int-subset\", regex : \"\\\\[\", push : \"int_subset\"}\n        ],\n\n        int_subset : [{\n            token : \"text.xml\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.int-subset.xml\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.markup-decl.xml\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.cdata.xml\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text.xml\", regex : \"\\\\s+\"},\n            {token : \"text.xml\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment.xml\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment.xml\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape.reference.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        attr_reference : [{\n            token : \"constant.language.escape.reference.attribute-value.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n            regex : \"(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n            ]\n        }],\n\n        tag_whitespace : [\n            {token : \"text.tag-whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        whitespace : [\n            {token : \"text.whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        string: [{\n            token : \"string.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.xml\", regex: \"'\", next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }, {\n            token : \"string.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.xml\", regex: '\"', next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }],\n\n        attributes: [{\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"tag_whitespace\"\n        }, {\n            include: \"attribute_value\"\n        }],\n\n        attribute_value: [{\n            token : \"string.attribute-value.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }, {\n            token : \"string.attribute-value.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\nace.define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    option      : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.addRules({\n        attributes: [{\n            include : \"tag_whitespace\"\n        }, {\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\",\n            push : [{\n                include: \"tag_whitespace\"\n            }, {\n                token : \"string.unquoted.attribute-value.html\",\n                regex : \"[^<>='\\\"`\\\\s]+\",\n                next : \"pop\"\n            }, {\n                token : \"empty\",\n                regex : \"\",\n                next : \"pop\"\n            }]\n        }, {\n            include : \"attribute_value\"\n        }],\n        tag: [{\n            token : function(start, tag) {\n                var group = tagMap[tag];\n                return [\"meta.tag.punctuation.\" + (start == \"<\" ? \"\" : \"end-\") + \"tag-open.xml\",\n                    \"meta.tag\" + (group ? \".\" + group : \"\") + \".tag-name.xml\"];\n            },\n            regex : \"(</?)([-_a-zA-Z0-9:]+)\",\n            next: \"tag_stuff\"\n        }],\n        tag_stuff: [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n        ],\n    });\n\n    this.embedTagRules(CssHighlightRules, \"css-\", \"style\");\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    if (this.constructor === HtmlHighlightRules)\n        this.normalizeRules();\n};\n\noop.inherits(HtmlHighlightRules, XmlHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nvar XmlBehaviour = function () {\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selected = session.doc.getTextRange(editor.getSelectionRange());\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            }\n\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (rightChar == quote && (is(token, \"attribute-value\") || is(token, \"string\"))) {\n                return {\n                    text: \"\",\n                    selection: [1, 1]\n                };\n            }\n\n            if (!token)\n                token = iterator.stepBackward();\n\n            if (!token)\n                return;\n\n            while (is(token, \"tag-whitespace\") || is(token, \"whitespace\")) {\n                token = iterator.stepBackward();\n            }\n            var rightSpace = !rightChar || rightChar.match(/\\s/);\n            if (is(token, \"attribute-equals\") && (rightSpace || rightChar == '>') || (is(token, \"decl-attribute-equals\") && (rightSpace || rightChar == '?'))) {\n                return {\n                    text: quote + quote,\n                    selection: [1, 1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken() || iterator.stepBackward();\n            if (!token || !(is(token, \"tag-name\") || is(token, \"tag-whitespace\") || is(token, \"attribute-name\") || is(token, \"attribute-equals\") || is(token, \"attribute-value\")))\n                return;\n            if (is(token, \"reference.attribute-value\"))\n                return;\n            if (is(token, \"attribute-value\")) {\n                var firstChar = token.value.charAt(0);\n                if (firstChar == '\"' || firstChar == \"'\") {\n                    var lastChar = token.value.charAt(token.value.length - 1);\n                    var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length;\n                    if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar)\n                        return;\n                }\n            }\n            while (!is(token, \"tag-name\")) {\n                token = iterator.stepBackward();\n            }\n\n            var tokenRow = iterator.getCurrentTokenRow();\n            var tokenColumn = iterator.getCurrentTokenColumn();\n            if (is(iterator.stepBackward(), \"end-tag-open\"))\n                return;\n\n            var element = token.value;\n            if (tokenRow == position.row)\n                element = element.substring(0, position.column - tokenColumn);\n\n            if (this.voidElements.hasOwnProperty(element.toLowerCase()))\n                 return;\n\n            return {\n               text: \">\" + \"</\" + element + \">\",\n               selection: [1, 1]\n            };\n        }\n    });\n\n    this.add(\"autoindent\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.getLine(cursor.row);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (token && token.type.indexOf(\"tag-close\") !== -1) {\n                while (token && token.type.indexOf(\"tag-name\") === -1) {\n                    token = iterator.stepBackward();\n                }\n\n                if (!token) {\n                    return;\n                }\n\n                var tag = token.value;\n                var row = iterator.getCurrentTokenRow();\n                token = iterator.stepBackward();\n                if (!token || token.type.indexOf(\"end-tag\") !== -1) {\n                    return;\n                }\n\n                if (this.voidElements && !this.voidElements[tag]) {\n                    var nextToken = session.getTokenAt(cursor.row, cursor.column+1);\n                    var line = session.getLine(row);\n                    var nextIndent = this.$getIndent(line);\n                    var indent = nextIndent + session.getTabString();\n\n                    if (nextToken && nextToken.value === \"</\") {\n                        return {\n                            text: \"\\n\" + indent + \"\\n\" + nextIndent,\n                            selection: [1, indent.length, 1, indent.length]\n                        };\n                    } else {\n                        return {\n                            text: \"\\n\" + indent\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n};\n\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\nace.define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n    this.defaultMode = defaultMode;\n    this.subModes = subModes;\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n\n    this.$getMode = function(state) {\n        if (typeof state != \"string\") \n            state = state[0];\n        for (var key in this.subModes) {\n            if (state.indexOf(key) === 0)\n                return this.subModes[key];\n        }\n        return null;\n    };\n    \n    this.$tryMode = function(state, session, foldStyle, row) {\n        var mode = this.$getMode(state);\n        return (mode ? mode.getFoldWidget(session, foldStyle, row) : \"\");\n    };\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        return (\n            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n            this.defaultMode.getFoldWidget(session, foldStyle, row)\n        );\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var mode = this.$getMode(session.getState(row-1));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.$getMode(session.getState(row));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.defaultMode;\n        \n        return mode.getFoldWidgetRange(session, foldStyle, row);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalEndTags) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n    this.optionalEndTags = oop.mixin({}, this.voidElements);\n    if (optionalEndTags)\n        oop.mixin(this.optionalEndTags, optionalEndTags);\n    \n};\noop.inherits(FoldMode, BaseFoldMode);\n\nvar Tag = function() {\n    this.tagName = \"\";\n    this.closing = false;\n    this.selfClosing = false;\n    this.start = {row: 0, column: 0};\n    this.end = {row: 0, column: 0};\n};\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (!tag)\n            return \"\";\n\n        if (tag.closing || (!tag.tagName && tag.selfClosing))\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase()))\n            return \"\";\n\n        if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column))\n            return \"\";\n\n        return \"start\";\n    };\n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var tag = new Tag();\n\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (is(token, \"tag-open\")) {\n                tag.end.column = tag.start.column + token.value.length;\n                tag.closing = is(token, \"end-tag-open\");\n                token = tokens[++i];\n                if (!token)\n                    return null;\n                tag.tagName = token.value;\n                tag.end.column += token.value.length;\n                for (i++; i < tokens.length; i++) {\n                    token = tokens[i];\n                    tag.end.column += token.value.length;\n                    if (is(token, \"tag-close\")) {\n                        tag.selfClosing = token.value == '/>';\n                        break;\n                    }\n                }\n                return tag;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == '/>';\n                return tag;\n            }\n            tag.start.column += token.value.length;\n        }\n\n        return null;\n    };\n\n    this._findEndTagInLine = function(session, row, tagName, startColumn) {\n        var tokens = session.getTokens(row);\n        var column = 0;\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            column += token.value.length;\n            if (column < startColumn)\n                continue;\n            if (is(token, \"end-tag-open\")) {\n                token = tokens[i + 1];\n                if (token && token.value == tagName)\n                    return true;\n            }\n        }\n        return false;\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n                iterator.stepForward();\n                return tag;\n            }\n        } while(token = iterator.stepForward());\n\n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n                iterator.stepBackward();\n                return tag;\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n            }\n        } while(token = iterator.stepBackward());\n\n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.optionalEndTags.hasOwnProperty(top.tagName)) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.start.column);\n            var start = {\n                row: row,\n                column: firstTag.start.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.end.column);\n            var end = {\n                row: row,\n                column: firstTag.start.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar MixedFoldMode = require(\"./mixed\").FoldMode;\nvar XmlFoldMode = require(\"./xml\").FoldMode;\nvar CStyleFoldMode = require(\"./cstyle\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalTags) {\n    MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), {\n        \"js-\": new CStyleFoldMode(),\n        \"css-\": new CStyleFoldMode()\n    });\n};\n\noop.inherits(FoldMode, MixedFoldMode);\n\n});\n\nace.define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\n\nvar commonAttributes = [\n    \"accesskey\",\n    \"class\",\n    \"contenteditable\",\n    \"contextmenu\",\n    \"dir\",\n    \"draggable\",\n    \"dropzone\",\n    \"hidden\",\n    \"id\",\n    \"inert\",\n    \"itemid\",\n    \"itemprop\",\n    \"itemref\",\n    \"itemscope\",\n    \"itemtype\",\n    \"lang\",\n    \"spellcheck\",\n    \"style\",\n    \"tabindex\",\n    \"title\",\n    \"translate\"\n];\n\nvar eventAttributes = [\n    \"onabort\",\n    \"onblur\",\n    \"oncancel\",\n    \"oncanplay\",\n    \"oncanplaythrough\",\n    \"onchange\",\n    \"onclick\",\n    \"onclose\",\n    \"oncontextmenu\",\n    \"oncuechange\",\n    \"ondblclick\",\n    \"ondrag\",\n    \"ondragend\",\n    \"ondragenter\",\n    \"ondragleave\",\n    \"ondragover\",\n    \"ondragstart\",\n    \"ondrop\",\n    \"ondurationchange\",\n    \"onemptied\",\n    \"onended\",\n    \"onerror\",\n    \"onfocus\",\n    \"oninput\",\n    \"oninvalid\",\n    \"onkeydown\",\n    \"onkeypress\",\n    \"onkeyup\",\n    \"onload\",\n    \"onloadeddata\",\n    \"onloadedmetadata\",\n    \"onloadstart\",\n    \"onmousedown\",\n    \"onmousemove\",\n    \"onmouseout\",\n    \"onmouseover\",\n    \"onmouseup\",\n    \"onmousewheel\",\n    \"onpause\",\n    \"onplay\",\n    \"onplaying\",\n    \"onprogress\",\n    \"onratechange\",\n    \"onreset\",\n    \"onscroll\",\n    \"onseeked\",\n    \"onseeking\",\n    \"onselect\",\n    \"onshow\",\n    \"onstalled\",\n    \"onsubmit\",\n    \"onsuspend\",\n    \"ontimeupdate\",\n    \"onvolumechange\",\n    \"onwaiting\"\n];\n\nvar globalAttributes = commonAttributes.concat(eventAttributes);\n\nvar attributeMap = {\n    \"html\": [\"manifest\"],\n    \"head\": [],\n    \"title\": [],\n    \"base\": [\"href\", \"target\"],\n    \"link\": [\"href\", \"hreflang\", \"rel\", \"media\", \"type\", \"sizes\"],\n    \"meta\": [\"http-equiv\", \"name\", \"content\", \"charset\"],\n    \"style\": [\"type\", \"media\", \"scoped\"],\n    \"script\": [\"charset\", \"type\", \"src\", \"defer\", \"async\"],\n    \"noscript\": [\"href\"],\n    \"body\": [\"onafterprint\", \"onbeforeprint\", \"onbeforeunload\", \"onhashchange\", \"onmessage\", \"onoffline\", \"onpopstate\", \"onredo\", \"onresize\", \"onstorage\", \"onundo\", \"onunload\"],\n    \"section\": [],\n    \"nav\": [],\n    \"article\": [\"pubdate\"],\n    \"aside\": [],\n    \"h1\": [],\n    \"h2\": [],\n    \"h3\": [],\n    \"h4\": [],\n    \"h5\": [],\n    \"h6\": [],\n    \"header\": [],\n    \"footer\": [],\n    \"address\": [],\n    \"main\": [],\n    \"p\": [],\n    \"hr\": [],\n    \"pre\": [],\n    \"blockquote\": [\"cite\"],\n    \"ol\": [\"start\", \"reversed\"],\n    \"ul\": [],\n    \"li\": [\"value\"],\n    \"dl\": [],\n    \"dt\": [],\n    \"dd\": [],\n    \"figure\": [],\n    \"figcaption\": [],\n    \"div\": [],\n    \"a\": [\"href\", \"target\", \"ping\", \"rel\", \"media\", \"hreflang\", \"type\"],\n    \"em\": [],\n    \"strong\": [],\n    \"small\": [],\n    \"s\": [],\n    \"cite\": [],\n    \"q\": [\"cite\"],\n    \"dfn\": [],\n    \"abbr\": [],\n    \"data\": [],\n    \"time\": [\"datetime\"],\n    \"code\": [],\n    \"var\": [],\n    \"samp\": [],\n    \"kbd\": [],\n    \"sub\": [],\n    \"sup\": [],\n    \"i\": [],\n    \"b\": [],\n    \"u\": [],\n    \"mark\": [],\n    \"ruby\": [],\n    \"rt\": [],\n    \"rp\": [],\n    \"bdi\": [],\n    \"bdo\": [],\n    \"span\": [],\n    \"br\": [],\n    \"wbr\": [],\n    \"ins\": [\"cite\", \"datetime\"],\n    \"del\": [\"cite\", \"datetime\"],\n    \"img\": [\"alt\", \"src\", \"height\", \"width\", \"usemap\", \"ismap\"],\n    \"iframe\": [\"name\", \"src\", \"height\", \"width\", \"sandbox\", \"seamless\"],\n    \"embed\": [\"src\", \"height\", \"width\", \"type\"],\n    \"object\": [\"param\", \"data\", \"type\", \"height\" , \"width\", \"usemap\", \"name\", \"form\", \"classid\"],\n    \"param\": [\"name\", \"value\"],\n    \"video\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\", \"width\", \"height\", \"poster\"],\n    \"audio\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\"],\n    \"source\": [\"src\", \"type\", \"media\"],\n    \"track\": [\"kind\", \"src\", \"srclang\", \"label\", \"default\"],\n    \"canvas\": [\"width\", \"height\"],\n    \"map\": [\"name\"],\n    \"area\": [\"shape\", \"coords\", \"href\", \"hreflang\", \"alt\", \"target\", \"media\", \"rel\", \"ping\", \"type\"],\n    \"svg\": [],\n    \"math\": [],\n    \"table\": [\"summary\"],\n    \"caption\": [],\n    \"colgroup\": [\"span\"],\n    \"col\": [\"span\"],\n    \"tbody\": [],\n    \"thead\": [],\n    \"tfoot\": [],\n    \"tr\": [],\n    \"td\": [\"headers\", \"rowspan\", \"colspan\"],\n    \"th\": [\"headers\", \"rowspan\", \"colspan\", \"scope\"],\n    \"form\": [\"accept-charset\", \"action\", \"autocomplete\", \"enctype\", \"method\", \"name\", \"novalidate\", \"target\"],\n    \"fieldset\": [\"disabled\", \"form\", \"name\"],\n    \"legend\": [],\n    \"label\": [\"form\", \"for\"],\n    \"input\": [\"type\", \"accept\", \"alt\", \"autocomplete\", \"checked\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"height\", \"list\", \"max\", \"maxlength\", \"min\", \"multiple\", \"pattern\", \"placeholder\", \"readonly\", \"required\", \"size\", \"src\", \"step\", \"width\", \"files\", \"value\"],\n    \"button\": [\"autofocus\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"name\", \"value\", \"type\"],\n    \"select\": [\"autofocus\", \"disabled\", \"form\", \"multiple\", \"name\", \"size\"],\n    \"datalist\": [],\n    \"optgroup\": [\"disabled\", \"label\"],\n    \"option\": [\"disabled\", \"selected\", \"label\", \"value\"],\n    \"textarea\": [\"autofocus\", \"disabled\", \"form\", \"maxlength\", \"name\", \"placeholder\", \"readonly\", \"required\", \"rows\", \"cols\", \"wrap\"],\n    \"keygen\": [\"autofocus\", \"challenge\", \"disabled\", \"form\", \"keytype\", \"name\"],\n    \"output\": [\"for\", \"form\", \"name\"],\n    \"progress\": [\"value\", \"max\"],\n    \"meter\": [\"value\", \"min\", \"max\", \"low\", \"high\", \"optimum\"],\n    \"details\": [\"open\"],\n    \"summary\": [],\n    \"command\": [\"type\", \"label\", \"icon\", \"disabled\", \"checked\", \"radiogroup\", \"command\"],\n    \"menu\": [\"type\", \"label\"],\n    \"dialog\": [\"open\"]\n};\n\nvar elements = Object.keys(attributeMap);\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nfunction findTagName(session, pos) {\n    var iterator = new TokenIterator(session, pos.row, pos.column);\n    var token = iterator.getCurrentToken();\n    while (token && !is(token, \"tag-name\")){\n        token = iterator.stepBackward();\n    }\n    if (token)\n        return token.value;\n}\n\nvar HtmlCompletions = function() {\n\n};\n\n(function() {\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        var token = session.getTokenAt(pos.row, pos.column);\n\n        if (!token)\n            return [];\n        if (is(token, \"tag-name\") || is(token, \"tag-open\") || is(token, \"end-tag-open\"))\n            return this.getTagCompletions(state, session, pos, prefix);\n        if (is(token, \"tag-whitespace\") || is(token, \"attribute-name\"))\n            return this.getAttributeCompetions(state, session, pos, prefix);\n\n        return [];\n    };\n\n    this.getTagCompletions = function(state, session, pos, prefix) {\n        return elements.map(function(element){\n            return {\n                value: element,\n                meta: \"tag\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n    this.getAttributeCompetions = function(state, session, pos, prefix) {\n        var tagName = findTagName(session, pos);\n        if (!tagName)\n            return [];\n        var attributes = globalAttributes;\n        if (tagName in attributeMap) {\n            attributes = attributes.concat(attributeMap[tagName]);\n        }\n        return attributes.map(function(attribute){\n            return {\n                caption: attribute,\n                snippet: attribute + '=\"$0\"',\n                meta: \"attribute\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n}).call(HtmlCompletions.prototype);\n\nexports.HtmlCompletions = HtmlCompletions;\n});\n\nace.define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar HtmlFoldMode = require(\"./folding/html\").FoldMode;\nvar HtmlCompletions = require(\"./html_completions\").HtmlCompletions;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar voidElements = [\"area\", \"base\", \"br\", \"col\", \"embed\", \"hr\", \"img\", \"input\", \"keygen\", \"link\", \"meta\", \"menuitem\", \"param\", \"source\", \"track\", \"wbr\"];\nvar optionalEndTags = [\"li\", \"dt\", \"dd\", \"p\", \"rt\", \"rp\", \"optgroup\", \"option\", \"colgroup\", \"td\", \"th\"];\n\nvar Mode = function(options) {\n    this.fragmentContext = options && options.fragmentContext;\n    this.HighlightRules = HtmlHighlightRules;\n    this.$behaviour = new XmlBehaviour();\n    this.$completer = new HtmlCompletions();\n    \n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"css-\": CssMode\n    });\n    \n    this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags));\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n    this.voidElements = lang.arrayToMap(voidElements);\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        return this.$completer.getCompletions(state, session, pos, prefix);\n    };\n\n    this.createWorker = function(session) {\n        if (this.constructor != Mode)\n            return;\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/html_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        if (this.fragmentContext)\n            worker.call(\"setOptions\", [{context: this.fragmentContext}]);\n\n        worker.on(\"error\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/html\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-html_ruby.js",
    "content": "ace.define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\nace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"string.cdata.xml\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.xml-decl.xml\", \"keyword.xml-decl.xml\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_decl\", caseInsensitive: true\n            },\n            {\n                token : [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"processing_instruction\",\n            },\n            {token : \"comment.xml\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\", caseInsensitive: true\n            },\n            {include : \"tag\"},\n            {token : \"text.end-tag-open.xml\", regex: \"</\"},\n            {token : \"text.tag-open.xml\", regex: \"<\"},\n            {include : \"reference\"},\n            {defaultToken : \"text.xml\"}\n        ],\n\n        xml_decl : [{\n            token : \"entity.other.attribute-name.decl-attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.decl-attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"whitespace\"\n        }, {\n            include: \"string\"\n        }, {\n            token : \"punctuation.xml-decl.xml\",\n            regex : \"\\\\?>\",\n            next : \"start\"\n        }],\n\n        processing_instruction : [\n            {token : \"punctuation.instruction.xml\", regex : \"\\\\?>\", next : \"start\"},\n            {defaultToken : \"instruction.xml\"}\n        ],\n\n        doctype : [\n            {include : \"whitespace\"},\n            {include : \"string\"},\n            {token : \"xml-pe.doctype.xml\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe.xml\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.int-subset\", regex : \"\\\\[\", push : \"int_subset\"}\n        ],\n\n        int_subset : [{\n            token : \"text.xml\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.int-subset.xml\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.markup-decl.xml\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.cdata.xml\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text.xml\", regex : \"\\\\s+\"},\n            {token : \"text.xml\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment.xml\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment.xml\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape.reference.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        attr_reference : [{\n            token : \"constant.language.escape.reference.attribute-value.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n            regex : \"(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n            ]\n        }],\n\n        tag_whitespace : [\n            {token : \"text.tag-whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        whitespace : [\n            {token : \"text.whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        string: [{\n            token : \"string.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.xml\", regex: \"'\", next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }, {\n            token : \"string.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.xml\", regex: '\"', next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }],\n\n        attributes: [{\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"tag_whitespace\"\n        }, {\n            include: \"attribute_value\"\n        }],\n\n        attribute_value: [{\n            token : \"string.attribute-value.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }, {\n            token : \"string.attribute-value.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\nace.define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    option      : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.addRules({\n        attributes: [{\n            include : \"tag_whitespace\"\n        }, {\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\",\n            push : [{\n                include: \"tag_whitespace\"\n            }, {\n                token : \"string.unquoted.attribute-value.html\",\n                regex : \"[^<>='\\\"`\\\\s]+\",\n                next : \"pop\"\n            }, {\n                token : \"empty\",\n                regex : \"\",\n                next : \"pop\"\n            }]\n        }, {\n            include : \"attribute_value\"\n        }],\n        tag: [{\n            token : function(start, tag) {\n                var group = tagMap[tag];\n                return [\"meta.tag.punctuation.\" + (start == \"<\" ? \"\" : \"end-\") + \"tag-open.xml\",\n                    \"meta.tag\" + (group ? \".\" + group : \"\") + \".tag-name.xml\"];\n            },\n            regex : \"(</?)([-_a-zA-Z0-9:]+)\",\n            next: \"tag_stuff\"\n        }],\n        tag_stuff: [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n        ],\n    });\n\n    this.embedTagRules(CssHighlightRules, \"css-\", \"style\");\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    if (this.constructor === HtmlHighlightRules)\n        this.normalizeRules();\n};\n\noop.inherits(HtmlHighlightRules, XmlHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\nace.define(\"ace/mode/ruby_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar constantOtherSymbol = exports.constantOtherSymbol = {\n    token : \"constant.other.symbol.ruby\", // symbol\n    regex : \"[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?\"\n};\n\nvar qString = exports.qString = {\n    token : \"string\", // single line\n    regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n};\n\nvar qqString = exports.qqString = {\n    token : \"string\", // single line\n    regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n};\n\nvar tString = exports.tString = {\n    token : \"string\", // backtick string\n    regex : \"[`](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[`]\"\n};\n\nvar constantNumericHex = exports.constantNumericHex = {\n    token : \"constant.numeric\", // hex\n    regex : \"0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\\\b\"\n};\n\nvar constantNumericFloat = exports.constantNumericFloat = {\n    token : \"constant.numeric\", // float\n    regex : \"[+-]?\\\\d(?:\\\\d|_(?=\\\\d))*(?:(?:\\\\.\\\\d(?:\\\\d|_(?=\\\\d))*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n};\n\nvar RubyHighlightRules = function() {\n\n    var builtinFunctions = (\n        \"abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|\" +\n        \"assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|\" +\n        \"assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|\" +\n        \"assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|\" +\n        \"assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|\" +\n        \"assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|\" +\n        \"attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|\" +\n        \"caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|\" +\n        \"exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|\" +\n        \"gsub!|get_via_redirect|host!|https?|https!|include|Integer|lambda|link_to|\" +\n        \"link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|\" +\n        \"p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|\" +\n        \"raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|\" +\n        \"set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|\" +\n        \"throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|\" +\n        \"render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|\" +\n        \"content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|\" +\n        \"fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|\" +\n        \"time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|\" +\n        \"select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|\" +\n        \"file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|\" +\n        \"protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|\" +\n        \"send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|\" +\n        \"validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|\" +\n        \"validates_inclusion_of|validates_numericality_of|validates_with|validates_each|\" +\n        \"authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|\" +\n        \"filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|\" +\n        \"translate|localize|extract_locale_from_tld|caches_page|expire_page|caches_action|expire_action|\" +\n        \"cache|expire_fragment|expire_cache_for|observe|cache_sweeper|\" +\n        \"has_many|has_one|belongs_to|has_and_belongs_to_many\"\n    );\n\n    var keywords = (\n        \"alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|\" +\n        \"__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|\" +\n        \"redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield\"\n    );\n\n    var buildinConstants = (\n        \"true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|\" +\n        \"RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING\"\n    );\n\n    var builtinVariables = (\n        \"\\$DEBUG|\\$defout|\\$FILENAME|\\$LOAD_PATH|\\$SAFE|\\$stdin|\\$stdout|\\$stderr|\\$VERBOSE|\" +\n        \"$!|root_url|flash|session|cookies|params|request|response|logger|self\"\n    );\n\n    var keywordMapper = this.$keywords = this.createKeywordMapper({\n        \"keyword\": keywords,\n        \"constant.language\": buildinConstants,\n        \"variable.language\": builtinVariables,\n        \"support.function\": builtinFunctions,\n        \"invalid.deprecated\": \"debugger\" // TODO is this a remnant from js mode?\n    }, \"identifier\");\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"#.*$\"\n            }, {\n                token : \"comment\", // multi line comment\n                regex : \"^=begin(?:$|\\\\s.*$)\",\n                next : \"comment\"\n            }, {\n                token : \"string.regexp\",\n                regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"\n            },\n\n            [{\n                regex: \"[{}]\", onMatch: function(val, state, stack) {\n                    this.next = val == \"{\" ? this.nextState : \"\";\n                    if (val == \"{\" && stack.length) {\n                        stack.unshift(\"start\", state);\n                        return \"paren.lparen\";\n                    }\n                    if (val == \"}\" && stack.length) {\n                        stack.shift();\n                        this.next = stack.shift();\n                        if (this.next.indexOf(\"string\") != -1)\n                            return \"paren.end\";\n                    }\n                    return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n                },\n                nextState: \"start\"\n            }, {\n                token : \"string.start\",\n                regex : /\"/,\n                push  : [{\n                    token : \"constant.language.escape\",\n                    regex : /\\\\(?:[nsrtvfbae'\"\\\\]|c.|C-.|M-.(?:\\\\C-.)?|[0-7]{3}|x[\\da-fA-F]{2}|u[\\da-fA-F]{4})/\n                }, {\n                    token : \"paren.start\",\n                    regex : /\\#{/,\n                    push  : \"start\"\n                }, {\n                    token : \"string.end\",\n                    regex : /\"/,\n                    next  : \"pop\"\n                }, {\n                    defaultToken: \"string\"\n                }]\n            }, {\n                token : \"string.start\",\n                regex : /`/,\n                push  : [{\n                    token : \"constant.language.escape\",\n                    regex : /\\\\(?:[nsrtvfbae'\"\\\\]|c.|C-.|M-.(?:\\\\C-.)?|[0-7]{3}|x[\\da-fA-F]{2}|u[\\da-fA-F]{4})/\n                }, {\n                    token : \"paren.start\",\n                    regex : /\\#{/,\n                    push  : \"start\"\n                }, {\n                    token : \"string.end\",\n                    regex : /`/,\n                    next  : \"pop\"\n                }, {\n                    defaultToken: \"string\"\n                }]\n            }, {\n                token : \"string.start\",\n                regex : /'/,\n                push  : [{\n                    token : \"constant.language.escape\",\n                    regex : /\\\\['\\\\]/\n                },  {\n                    token : \"string.end\",\n                    regex : /'/,\n                    next  : \"pop\"\n                }, {\n                    defaultToken: \"string\"\n                }]\n            }],\n\n            {\n                token : \"text\", // namespaces aren't symbols\n                regex : \"::\"\n            }, {\n                token : \"variable.instance\", // instance variable\n                regex : \"@{1,2}[a-zA-Z_\\\\d]+\"\n            }, {\n                token : \"support.class\", // class name\n                regex : \"[A-Z][a-zA-Z_\\\\d]+\"\n            },\n\n            constantOtherSymbol,\n            constantNumericHex,\n            constantNumericFloat,\n\n            {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"punctuation.separator.key-value\",\n                regex : \"=>\"\n            }, {\n                stateName: \"heredoc\",\n                onMatch : function(value, currentState, stack) {\n                    var next = value[2] == '-' ? \"indentedHeredoc\" : \"heredoc\";\n                    var tokens = value.split(this.splitRegex);\n                    stack.push(next, tokens[3]);\n                    return [\n                        {type:\"constant\", value: tokens[1]},\n                        {type:\"string\", value: tokens[2]},\n                        {type:\"support.class\", value: tokens[3]},\n                        {type:\"string\", value: tokens[4]}\n                    ];\n                },\n                regex : \"(<<-?)(['\\\"`]?)([\\\\w]+)(['\\\"`]?)\",\n                rules: {\n                    heredoc: [{\n                        onMatch:  function(value, currentState, stack) {\n                            if (value === stack[1]) {\n                                stack.shift();\n                                stack.shift();\n                                this.next = stack[0] || \"start\";\n                                return \"support.class\";\n                            }\n                            this.next = \"\";\n                            return \"string\";\n                        },\n                        regex: \".*$\",\n                        next: \"start\"\n                    }],\n                    indentedHeredoc: [{\n                        token: \"string\",\n                        regex: \"^ +\"\n                    }, {\n                        onMatch:  function(value, currentState, stack) {\n                            if (value === stack[1]) {\n                                stack.shift();\n                                stack.shift();\n                                this.next = stack[0] || \"start\";\n                                return \"support.class\";\n                            }\n                            this.next = \"\";\n                            return \"string\";\n                        },\n                        regex: \".*$\",\n                        next: \"start\"\n                    }]\n                }\n            }, {\n                regex : \"$\",\n                token : \"empty\",\n                next : function(currentState, stack) {\n                    if (stack[0] === \"heredoc\" || stack[0] === \"indentedHeredoc\")\n                        return stack[0];\n                    return currentState;\n                }\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \"^=end(?:$|\\\\s.*$)\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(RubyHighlightRules, TextHighlightRules);\n\nexports.RubyHighlightRules = RubyHighlightRules;\n});\n\nace.define(\"ace/mode/html_ruby_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html_highlight_rules\",\"ace/mode/ruby_highlight_rules\"], function(require, exports, module) {\n    \"use strict\";\n\n    var oop = require(\"../lib/oop\");\n    var HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\n    var RubyHighlightRules = require(\"./ruby_highlight_rules\").RubyHighlightRules;\n\n    var HtmlRubyHighlightRules = function() {\n        HtmlHighlightRules.call(this);\n\n        var startRules = [\n            {\n                regex: \"<%%|%%>\",\n                token: \"constant.language.escape\"\n            }, {\n                token : \"comment.start.erb\",\n                regex : \"<%#\",\n                push  : [{\n                    token : \"comment.end.erb\",\n                    regex: \"%>\",\n                    next: \"pop\",\n                    defaultToken:\"comment\"\n                }]\n            }, {\n                token : \"support.ruby_tag\",\n                regex : \"<%+(?!>)[-=]?\",\n                push  : \"ruby-start\"\n            }\n        ];\n\n        var endRules = [\n            {\n                token : \"support.ruby_tag\",\n                regex : \"%>\",\n                next  : \"pop\"\n            }, {\n                token: \"comment\",\n                regex: \"#(?:[^%]|%[^>])*\"\n            }\n        ];\n\n        for (var key in this.$rules)\n            this.$rules[key].unshift.apply(this.$rules[key], startRules);\n\n        this.embedRules(RubyHighlightRules, \"ruby-\", endRules, [\"start\"]);\n\n        this.normalizeRules();\n    };\n\n\n    oop.inherits(HtmlRubyHighlightRules, HtmlHighlightRules);\n\n    exports.HtmlRubyHighlightRules = HtmlRubyHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar CssBehaviour = function () {\n\n    this.inherit(CstyleBehaviour);\n\n    this.add(\"colon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(cursor.row);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                if (rightChar === ':') {\n                    return {\n                       text: '',\n                       selection: [1, 1]\n                    }\n                }\n                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n                    return {\n                       text: ':;',\n                       selection: [1, 1]\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"colon\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(range.start.row);\n                var rightChar = line.substring(range.end.column, range.end.column + 1);\n                if (rightChar === ';') {\n                    range.end.column ++;\n                    return range;\n                }\n            }\n        }\n    });\n\n    this.add(\"semicolon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ';') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === ';') {\n                return {\n                   text: '',\n                   selection: [1, 1]\n                }\n            }\n        }\n    });\n\n}\noop.inherits(CssBehaviour, CstyleBehaviour);\n\nexports.CssBehaviour = CssBehaviour;\n});\n\nace.define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CssBehaviour = require(\"./behaviour/css\").CssBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = CssHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CssBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"csslint\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/css\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\nace.define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nvar XmlBehaviour = function () {\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selected = session.doc.getTextRange(editor.getSelectionRange());\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            }\n\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (rightChar == quote && (is(token, \"attribute-value\") || is(token, \"string\"))) {\n                return {\n                    text: \"\",\n                    selection: [1, 1]\n                };\n            }\n\n            if (!token)\n                token = iterator.stepBackward();\n\n            if (!token)\n                return;\n\n            while (is(token, \"tag-whitespace\") || is(token, \"whitespace\")) {\n                token = iterator.stepBackward();\n            }\n            var rightSpace = !rightChar || rightChar.match(/\\s/);\n            if (is(token, \"attribute-equals\") && (rightSpace || rightChar == '>') || (is(token, \"decl-attribute-equals\") && (rightSpace || rightChar == '?'))) {\n                return {\n                    text: quote + quote,\n                    selection: [1, 1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken() || iterator.stepBackward();\n            if (!token || !(is(token, \"tag-name\") || is(token, \"tag-whitespace\") || is(token, \"attribute-name\") || is(token, \"attribute-equals\") || is(token, \"attribute-value\")))\n                return;\n            if (is(token, \"reference.attribute-value\"))\n                return;\n            if (is(token, \"attribute-value\")) {\n                var firstChar = token.value.charAt(0);\n                if (firstChar == '\"' || firstChar == \"'\") {\n                    var lastChar = token.value.charAt(token.value.length - 1);\n                    var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length;\n                    if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar)\n                        return;\n                }\n            }\n            while (!is(token, \"tag-name\")) {\n                token = iterator.stepBackward();\n            }\n\n            var tokenRow = iterator.getCurrentTokenRow();\n            var tokenColumn = iterator.getCurrentTokenColumn();\n            if (is(iterator.stepBackward(), \"end-tag-open\"))\n                return;\n\n            var element = token.value;\n            if (tokenRow == position.row)\n                element = element.substring(0, position.column - tokenColumn);\n\n            if (this.voidElements.hasOwnProperty(element.toLowerCase()))\n                 return;\n\n            return {\n               text: \">\" + \"</\" + element + \">\",\n               selection: [1, 1]\n            };\n        }\n    });\n\n    this.add(\"autoindent\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.getLine(cursor.row);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (token && token.type.indexOf(\"tag-close\") !== -1) {\n                while (token && token.type.indexOf(\"tag-name\") === -1) {\n                    token = iterator.stepBackward();\n                }\n\n                if (!token) {\n                    return;\n                }\n\n                var tag = token.value;\n                var row = iterator.getCurrentTokenRow();\n                token = iterator.stepBackward();\n                if (!token || token.type.indexOf(\"end-tag\") !== -1) {\n                    return;\n                }\n\n                if (this.voidElements && !this.voidElements[tag]) {\n                    var nextToken = session.getTokenAt(cursor.row, cursor.column+1);\n                    var line = session.getLine(row);\n                    var nextIndent = this.$getIndent(line);\n                    var indent = nextIndent + session.getTabString();\n\n                    if (nextToken && nextToken.value === \"</\") {\n                        return {\n                            text: \"\\n\" + indent + \"\\n\" + nextIndent,\n                            selection: [1, indent.length, 1, indent.length]\n                        };\n                    } else {\n                        return {\n                            text: \"\\n\" + indent\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n};\n\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\nace.define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n    this.defaultMode = defaultMode;\n    this.subModes = subModes;\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n\n    this.$getMode = function(state) {\n        if (typeof state != \"string\") \n            state = state[0];\n        for (var key in this.subModes) {\n            if (state.indexOf(key) === 0)\n                return this.subModes[key];\n        }\n        return null;\n    };\n    \n    this.$tryMode = function(state, session, foldStyle, row) {\n        var mode = this.$getMode(state);\n        return (mode ? mode.getFoldWidget(session, foldStyle, row) : \"\");\n    };\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        return (\n            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n            this.defaultMode.getFoldWidget(session, foldStyle, row)\n        );\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var mode = this.$getMode(session.getState(row-1));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.$getMode(session.getState(row));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.defaultMode;\n        \n        return mode.getFoldWidgetRange(session, foldStyle, row);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalEndTags) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n    this.optionalEndTags = oop.mixin({}, this.voidElements);\n    if (optionalEndTags)\n        oop.mixin(this.optionalEndTags, optionalEndTags);\n    \n};\noop.inherits(FoldMode, BaseFoldMode);\n\nvar Tag = function() {\n    this.tagName = \"\";\n    this.closing = false;\n    this.selfClosing = false;\n    this.start = {row: 0, column: 0};\n    this.end = {row: 0, column: 0};\n};\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (!tag)\n            return \"\";\n\n        if (tag.closing || (!tag.tagName && tag.selfClosing))\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase()))\n            return \"\";\n\n        if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column))\n            return \"\";\n\n        return \"start\";\n    };\n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var tag = new Tag();\n\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (is(token, \"tag-open\")) {\n                tag.end.column = tag.start.column + token.value.length;\n                tag.closing = is(token, \"end-tag-open\");\n                token = tokens[++i];\n                if (!token)\n                    return null;\n                tag.tagName = token.value;\n                tag.end.column += token.value.length;\n                for (i++; i < tokens.length; i++) {\n                    token = tokens[i];\n                    tag.end.column += token.value.length;\n                    if (is(token, \"tag-close\")) {\n                        tag.selfClosing = token.value == '/>';\n                        break;\n                    }\n                }\n                return tag;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == '/>';\n                return tag;\n            }\n            tag.start.column += token.value.length;\n        }\n\n        return null;\n    };\n\n    this._findEndTagInLine = function(session, row, tagName, startColumn) {\n        var tokens = session.getTokens(row);\n        var column = 0;\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            column += token.value.length;\n            if (column < startColumn)\n                continue;\n            if (is(token, \"end-tag-open\")) {\n                token = tokens[i + 1];\n                if (token && token.value == tagName)\n                    return true;\n            }\n        }\n        return false;\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n                iterator.stepForward();\n                return tag;\n            }\n        } while(token = iterator.stepForward());\n\n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n                iterator.stepBackward();\n                return tag;\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n            }\n        } while(token = iterator.stepBackward());\n\n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.optionalEndTags.hasOwnProperty(top.tagName)) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.start.column);\n            var start = {\n                row: row,\n                column: firstTag.start.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.end.column);\n            var end = {\n                row: row,\n                column: firstTag.start.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar MixedFoldMode = require(\"./mixed\").FoldMode;\nvar XmlFoldMode = require(\"./xml\").FoldMode;\nvar CStyleFoldMode = require(\"./cstyle\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalTags) {\n    MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), {\n        \"js-\": new CStyleFoldMode(),\n        \"css-\": new CStyleFoldMode()\n    });\n};\n\noop.inherits(FoldMode, MixedFoldMode);\n\n});\n\nace.define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\n\nvar commonAttributes = [\n    \"accesskey\",\n    \"class\",\n    \"contenteditable\",\n    \"contextmenu\",\n    \"dir\",\n    \"draggable\",\n    \"dropzone\",\n    \"hidden\",\n    \"id\",\n    \"inert\",\n    \"itemid\",\n    \"itemprop\",\n    \"itemref\",\n    \"itemscope\",\n    \"itemtype\",\n    \"lang\",\n    \"spellcheck\",\n    \"style\",\n    \"tabindex\",\n    \"title\",\n    \"translate\"\n];\n\nvar eventAttributes = [\n    \"onabort\",\n    \"onblur\",\n    \"oncancel\",\n    \"oncanplay\",\n    \"oncanplaythrough\",\n    \"onchange\",\n    \"onclick\",\n    \"onclose\",\n    \"oncontextmenu\",\n    \"oncuechange\",\n    \"ondblclick\",\n    \"ondrag\",\n    \"ondragend\",\n    \"ondragenter\",\n    \"ondragleave\",\n    \"ondragover\",\n    \"ondragstart\",\n    \"ondrop\",\n    \"ondurationchange\",\n    \"onemptied\",\n    \"onended\",\n    \"onerror\",\n    \"onfocus\",\n    \"oninput\",\n    \"oninvalid\",\n    \"onkeydown\",\n    \"onkeypress\",\n    \"onkeyup\",\n    \"onload\",\n    \"onloadeddata\",\n    \"onloadedmetadata\",\n    \"onloadstart\",\n    \"onmousedown\",\n    \"onmousemove\",\n    \"onmouseout\",\n    \"onmouseover\",\n    \"onmouseup\",\n    \"onmousewheel\",\n    \"onpause\",\n    \"onplay\",\n    \"onplaying\",\n    \"onprogress\",\n    \"onratechange\",\n    \"onreset\",\n    \"onscroll\",\n    \"onseeked\",\n    \"onseeking\",\n    \"onselect\",\n    \"onshow\",\n    \"onstalled\",\n    \"onsubmit\",\n    \"onsuspend\",\n    \"ontimeupdate\",\n    \"onvolumechange\",\n    \"onwaiting\"\n];\n\nvar globalAttributes = commonAttributes.concat(eventAttributes);\n\nvar attributeMap = {\n    \"html\": [\"manifest\"],\n    \"head\": [],\n    \"title\": [],\n    \"base\": [\"href\", \"target\"],\n    \"link\": [\"href\", \"hreflang\", \"rel\", \"media\", \"type\", \"sizes\"],\n    \"meta\": [\"http-equiv\", \"name\", \"content\", \"charset\"],\n    \"style\": [\"type\", \"media\", \"scoped\"],\n    \"script\": [\"charset\", \"type\", \"src\", \"defer\", \"async\"],\n    \"noscript\": [\"href\"],\n    \"body\": [\"onafterprint\", \"onbeforeprint\", \"onbeforeunload\", \"onhashchange\", \"onmessage\", \"onoffline\", \"onpopstate\", \"onredo\", \"onresize\", \"onstorage\", \"onundo\", \"onunload\"],\n    \"section\": [],\n    \"nav\": [],\n    \"article\": [\"pubdate\"],\n    \"aside\": [],\n    \"h1\": [],\n    \"h2\": [],\n    \"h3\": [],\n    \"h4\": [],\n    \"h5\": [],\n    \"h6\": [],\n    \"header\": [],\n    \"footer\": [],\n    \"address\": [],\n    \"main\": [],\n    \"p\": [],\n    \"hr\": [],\n    \"pre\": [],\n    \"blockquote\": [\"cite\"],\n    \"ol\": [\"start\", \"reversed\"],\n    \"ul\": [],\n    \"li\": [\"value\"],\n    \"dl\": [],\n    \"dt\": [],\n    \"dd\": [],\n    \"figure\": [],\n    \"figcaption\": [],\n    \"div\": [],\n    \"a\": [\"href\", \"target\", \"ping\", \"rel\", \"media\", \"hreflang\", \"type\"],\n    \"em\": [],\n    \"strong\": [],\n    \"small\": [],\n    \"s\": [],\n    \"cite\": [],\n    \"q\": [\"cite\"],\n    \"dfn\": [],\n    \"abbr\": [],\n    \"data\": [],\n    \"time\": [\"datetime\"],\n    \"code\": [],\n    \"var\": [],\n    \"samp\": [],\n    \"kbd\": [],\n    \"sub\": [],\n    \"sup\": [],\n    \"i\": [],\n    \"b\": [],\n    \"u\": [],\n    \"mark\": [],\n    \"ruby\": [],\n    \"rt\": [],\n    \"rp\": [],\n    \"bdi\": [],\n    \"bdo\": [],\n    \"span\": [],\n    \"br\": [],\n    \"wbr\": [],\n    \"ins\": [\"cite\", \"datetime\"],\n    \"del\": [\"cite\", \"datetime\"],\n    \"img\": [\"alt\", \"src\", \"height\", \"width\", \"usemap\", \"ismap\"],\n    \"iframe\": [\"name\", \"src\", \"height\", \"width\", \"sandbox\", \"seamless\"],\n    \"embed\": [\"src\", \"height\", \"width\", \"type\"],\n    \"object\": [\"param\", \"data\", \"type\", \"height\" , \"width\", \"usemap\", \"name\", \"form\", \"classid\"],\n    \"param\": [\"name\", \"value\"],\n    \"video\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\", \"width\", \"height\", \"poster\"],\n    \"audio\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\"],\n    \"source\": [\"src\", \"type\", \"media\"],\n    \"track\": [\"kind\", \"src\", \"srclang\", \"label\", \"default\"],\n    \"canvas\": [\"width\", \"height\"],\n    \"map\": [\"name\"],\n    \"area\": [\"shape\", \"coords\", \"href\", \"hreflang\", \"alt\", \"target\", \"media\", \"rel\", \"ping\", \"type\"],\n    \"svg\": [],\n    \"math\": [],\n    \"table\": [\"summary\"],\n    \"caption\": [],\n    \"colgroup\": [\"span\"],\n    \"col\": [\"span\"],\n    \"tbody\": [],\n    \"thead\": [],\n    \"tfoot\": [],\n    \"tr\": [],\n    \"td\": [\"headers\", \"rowspan\", \"colspan\"],\n    \"th\": [\"headers\", \"rowspan\", \"colspan\", \"scope\"],\n    \"form\": [\"accept-charset\", \"action\", \"autocomplete\", \"enctype\", \"method\", \"name\", \"novalidate\", \"target\"],\n    \"fieldset\": [\"disabled\", \"form\", \"name\"],\n    \"legend\": [],\n    \"label\": [\"form\", \"for\"],\n    \"input\": [\"type\", \"accept\", \"alt\", \"autocomplete\", \"checked\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"height\", \"list\", \"max\", \"maxlength\", \"min\", \"multiple\", \"pattern\", \"placeholder\", \"readonly\", \"required\", \"size\", \"src\", \"step\", \"width\", \"files\", \"value\"],\n    \"button\": [\"autofocus\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"name\", \"value\", \"type\"],\n    \"select\": [\"autofocus\", \"disabled\", \"form\", \"multiple\", \"name\", \"size\"],\n    \"datalist\": [],\n    \"optgroup\": [\"disabled\", \"label\"],\n    \"option\": [\"disabled\", \"selected\", \"label\", \"value\"],\n    \"textarea\": [\"autofocus\", \"disabled\", \"form\", \"maxlength\", \"name\", \"placeholder\", \"readonly\", \"required\", \"rows\", \"cols\", \"wrap\"],\n    \"keygen\": [\"autofocus\", \"challenge\", \"disabled\", \"form\", \"keytype\", \"name\"],\n    \"output\": [\"for\", \"form\", \"name\"],\n    \"progress\": [\"value\", \"max\"],\n    \"meter\": [\"value\", \"min\", \"max\", \"low\", \"high\", \"optimum\"],\n    \"details\": [\"open\"],\n    \"summary\": [],\n    \"command\": [\"type\", \"label\", \"icon\", \"disabled\", \"checked\", \"radiogroup\", \"command\"],\n    \"menu\": [\"type\", \"label\"],\n    \"dialog\": [\"open\"]\n};\n\nvar elements = Object.keys(attributeMap);\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nfunction findTagName(session, pos) {\n    var iterator = new TokenIterator(session, pos.row, pos.column);\n    var token = iterator.getCurrentToken();\n    while (token && !is(token, \"tag-name\")){\n        token = iterator.stepBackward();\n    }\n    if (token)\n        return token.value;\n}\n\nvar HtmlCompletions = function() {\n\n};\n\n(function() {\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        var token = session.getTokenAt(pos.row, pos.column);\n\n        if (!token)\n            return [];\n        if (is(token, \"tag-name\") || is(token, \"tag-open\") || is(token, \"end-tag-open\"))\n            return this.getTagCompletions(state, session, pos, prefix);\n        if (is(token, \"tag-whitespace\") || is(token, \"attribute-name\"))\n            return this.getAttributeCompetions(state, session, pos, prefix);\n\n        return [];\n    };\n\n    this.getTagCompletions = function(state, session, pos, prefix) {\n        return elements.map(function(element){\n            return {\n                value: element,\n                meta: \"tag\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n    this.getAttributeCompetions = function(state, session, pos, prefix) {\n        var tagName = findTagName(session, pos);\n        if (!tagName)\n            return [];\n        var attributes = globalAttributes;\n        if (tagName in attributeMap) {\n            attributes = attributes.concat(attributeMap[tagName]);\n        }\n        return attributes.map(function(attribute){\n            return {\n                caption: attribute,\n                snippet: attribute + '=\"$0\"',\n                meta: \"attribute\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n}).call(HtmlCompletions.prototype);\n\nexports.HtmlCompletions = HtmlCompletions;\n});\n\nace.define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar HtmlFoldMode = require(\"./folding/html\").FoldMode;\nvar HtmlCompletions = require(\"./html_completions\").HtmlCompletions;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar voidElements = [\"area\", \"base\", \"br\", \"col\", \"embed\", \"hr\", \"img\", \"input\", \"keygen\", \"link\", \"meta\", \"menuitem\", \"param\", \"source\", \"track\", \"wbr\"];\nvar optionalEndTags = [\"li\", \"dt\", \"dd\", \"p\", \"rt\", \"rp\", \"optgroup\", \"option\", \"colgroup\", \"td\", \"th\"];\n\nvar Mode = function(options) {\n    this.fragmentContext = options && options.fragmentContext;\n    this.HighlightRules = HtmlHighlightRules;\n    this.$behaviour = new XmlBehaviour();\n    this.$completer = new HtmlCompletions();\n    \n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"css-\": CssMode\n    });\n    \n    this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags));\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n    this.voidElements = lang.arrayToMap(voidElements);\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        return this.$completer.getCompletions(state, session, pos, prefix);\n    };\n\n    this.createWorker = function(session) {\n        if (this.constructor != Mode)\n            return;\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/html_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        if (this.fragmentContext)\n            worker.call(\"setOptions\", [{context: this.fragmentContext}]);\n\n        worker.on(\"error\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/html\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var range = this.indentationBlock(session, row);\n        if (range)\n            return range;\n\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1 || line[startLevel] != \"#\")\n            return;\n\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var level = line.search(re);\n\n            if (level == -1)\n                continue;\n\n            if (line[level] != \"#\")\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        var next = session.getLine(row + 1);\n        var prev = session.getLine(row - 1);\n        var prevIndent = prev.search(/\\S/);\n        var nextIndent = next.search(/\\S/);\n\n        if (indent == -1) {\n            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? \"start\" : \"\";\n            return \"\";\n        }\n        if (prevIndent == -1) {\n            if (indent == nextIndent && line[indent] == \"#\" && next[indent] == \"#\") {\n                session.foldWidgets[row - 1] = \"\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"start\";\n            }\n        } else if (prevIndent == indent && line[indent] == \"#\" && prev[indent] == \"#\") {\n            if (session.getLine(row - 2).search(/\\S/) == -1) {\n                session.foldWidgets[row - 1] = \"start\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"\";\n            }\n        }\n\n        if (prevIndent!= -1 && prevIndent < indent)\n            session.foldWidgets[row - 1] = \"start\";\n        else\n            session.foldWidgets[row - 1] = \"\";\n\n        if (indent < nextIndent)\n            return \"start\";\n        else\n            return \"\";\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/ruby\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/ruby_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/coffee\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar RubyHighlightRules = require(\"./ruby_highlight_rules\").RubyHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar FoldMode = require(\"./folding/coffee\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = RubyHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n\n    this.lineCommentStart = \"#\";\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            var startingClassOrMethod = line.match(/^\\s*(class|def|module)\\s.*$/);\n            var startingDoBlock = line.match(/.*do(\\s*|\\s+\\|.*\\|\\s*)$/);\n            var startingConditional = line.match(/^\\s*(if|else)\\s*/)\n            if (match || startingClassOrMethod || startingDoBlock || startingConditional) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return /^\\s+(end|else)$/.test(line + input) || this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, session, row) {\n        var line = session.getLine(row);\n        if (/}/.test(line))\n            return this.$outdent.autoOutdent(session, row);\n        var indent = this.$getIndent(line);\n        var prevLine = session.getLine(row - 1);\n        var prevIndent = this.$getIndent(prevLine);\n        var tab = session.getTabString();\n        if (prevIndent.length <= indent.length) {\n            if (indent.slice(-tab.length) == tab)\n                session.remove(new Range(row, indent.length-tab.length, row, indent.length));\n        }\n    };\n\n    this.$id = \"ace/mode/ruby\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/html_ruby\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html_ruby_highlight_rules\",\"ace/mode/html\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/ruby\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar HtmlRubyHighlightRules = require(\"./html_ruby_highlight_rules\").HtmlRubyHighlightRules;\nvar HtmlMode = require(\"./html\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\nvar RubyMode = require(\"./ruby\").Mode;\n\nvar Mode = function() {\n    HtmlMode.call(this);   \n    this.HighlightRules = HtmlRubyHighlightRules;    \n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"css-\": CssMode,\n        \"ruby-\": RubyMode\n    });\n};\noop.inherits(Mode, HtmlMode);\n\n(function() {\n\n    this.$id = \"ace/mode/html_ruby\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-ini.js",
    "content": "ace.define(\"ace/mode/ini_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar escapeRe = \"\\\\\\\\(?:[\\\\\\\\0abtrn;#=:]|x[a-fA-F\\\\d]{4})\";\n\nvar IniHighlightRules = function() {\n    this.$rules = {\n        start: [{\n            token: 'punctuation.definition.comment.ini',\n            regex: '#.*',\n            push_: [{\n                token: 'comment.line.number-sign.ini',\n                regex: '$|^',\n                next: 'pop'\n            }, {\n                defaultToken: 'comment.line.number-sign.ini'\n            }]\n        }, {\n            token: 'punctuation.definition.comment.ini',\n            regex: ';.*',\n            push_: [{\n                token: 'comment.line.semicolon.ini',\n                regex: '$|^',\n                next: 'pop'\n            }, {\n                defaultToken: 'comment.line.semicolon.ini'\n            }]\n        }, {\n            token: ['keyword.other.definition.ini', 'text', 'punctuation.separator.key-value.ini'],\n            regex: '\\\\b([a-zA-Z0-9_.-]+)\\\\b(\\\\s*)(=)'\n        }, {\n            token: ['punctuation.definition.entity.ini', 'constant.section.group-title.ini', 'punctuation.definition.entity.ini'],\n            regex: '^(\\\\[)(.*?)(\\\\])'\n        }, {\n            token: 'punctuation.definition.string.begin.ini',\n            regex: \"'\",\n            push: [{\n                token: 'punctuation.definition.string.end.ini',\n                regex: \"'\",\n                next: 'pop'\n            }, {\n                token: \"constant.language.escape\",\n                regex: escapeRe\n            }, {\n                defaultToken: 'string.quoted.single.ini'\n            }]\n        }, {\n            token: 'punctuation.definition.string.begin.ini',\n            regex: '\"',\n            push: [{\n                token: \"constant.language.escape\",\n                regex: escapeRe\n            }, {\n                token: 'punctuation.definition.string.end.ini',\n                regex: '\"',\n                next: 'pop'\n            }, {\n                defaultToken: 'string.quoted.double.ini'\n            }]\n        }]\n    };\n\n    this.normalizeRules();\n};\n\nIniHighlightRules.metaData = {\n    fileTypes: ['ini', 'conf'],\n    keyEquivalent: '^~I',\n    name: 'Ini',\n    scopeName: 'source.ini'\n};\n\n\noop.inherits(IniHighlightRules, TextHighlightRules);\n\nexports.IniHighlightRules = IniHighlightRules;\n});\n\nace.define(\"ace/mode/folding/ini\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /^\\s*\\[([^\\])]*)]\\s*(?:$|[;#])/;\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var re = this.foldingStartMarker;\n        var line = session.getLine(row);\n        \n        var m = line.match(re);\n        \n        if (!m) return;\n        \n        var startName = m[1] + \".\";\n        \n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            if (/^\\s*$/.test(line))\n                continue;\n            m = line.match(re);\n            if (m && m[1].lastIndexOf(startName, 0) !== 0)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/ini\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/ini_highlight_rules\",\"ace/mode/folding/ini\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar IniHighlightRules = require(\"./ini_highlight_rules\").IniHighlightRules;\nvar FoldMode = require(\"./folding/ini\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = IniHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \";\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n    this.$id = \"ace/mode/ini\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-io.js",
    "content": "ace.define(\"ace/mode/io_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar IoHighlightRules = function() {\n\n    this.$rules = { start: \n       [ { token: [ 'text', 'meta.empty-parenthesis.io' ],\n           regex: '(\\\\()(\\\\))',\n           comment: 'we match this to overload return inside () --Allan; scoping rules for what gets the scope have changed, so we now group the ) instead of the ( -- Rob' },\n         { token: [ 'text', 'meta.comma-parenthesis.io' ],\n           regex: '(\\\\,)(\\\\))',\n           comment: 'We want to do the same for ,) -- Seckar; same as above -- Rob' },\n         { token: 'keyword.control.io',\n           regex: '\\\\b(?:if|ifTrue|ifFalse|ifTrueIfFalse|for|loop|reverseForeach|foreach|map|continue|break|while|do|return)\\\\b' },\n         { token: 'punctuation.definition.comment.io',\n           regex: '/\\\\*',\n           push: \n            [ { token: 'punctuation.definition.comment.io',\n                regex: '\\\\*/',\n                next: 'pop' },\n              { defaultToken: 'comment.block.io' } ] },\n         { token: 'punctuation.definition.comment.io',\n           regex: '//',\n           push: \n            [ { token: 'comment.line.double-slash.io',\n                regex: '$',\n                next: 'pop' },\n              { defaultToken: 'comment.line.double-slash.io' } ] },\n         { token: 'punctuation.definition.comment.io',\n           regex: '#',\n           push: \n            [ { token: 'comment.line.number-sign.io', regex: '$', next: 'pop' },\n              { defaultToken: 'comment.line.number-sign.io' } ] },\n         { token: 'variable.language.io',\n           regex: '\\\\b(?:self|sender|target|proto|protos|parent)\\\\b',\n           comment: 'I wonder if some of this isn\\'t variable.other.language? --Allan; scoping this as variable.language to match Objective-C\\'s handling of \\'self\\', which is inconsistent with C++\\'s handling of \\'this\\' but perhaps intentionally so -- Rob' },\n         { token: 'keyword.operator.io',\n           regex: '<=|>=|=|:=|\\\\*|\\\\||\\\\|\\\\||\\\\+|-|/|&|&&|>|<|\\\\?|@|@@|\\\\b(?:and|or)\\\\b' },\n         { token: 'constant.other.io', regex: '\\\\bGL[\\\\w_]+\\\\b' },\n         { token: 'support.class.io', regex: '\\\\b[A-Z](?:\\\\w+)?\\\\b' },\n         { token: 'support.function.io',\n           regex: '\\\\b(?:clone|call|init|method|list|vector|block|\\\\w+(?=\\\\s*\\\\())\\\\b' },\n         { token: 'support.function.open-gl.io',\n           regex: '\\\\bgl(?:u|ut)?[A-Z]\\\\w+\\\\b' },\n         { token: 'punctuation.definition.string.begin.io',\n           regex: '\"\"\"',\n           push: \n            [ { token: 'punctuation.definition.string.end.io',\n                regex: '\"\"\"',\n                next: 'pop' },\n              { token: 'constant.character.escape.io', regex: '\\\\\\\\.' },\n              { defaultToken: 'string.quoted.triple.io' } ] },\n         { token: 'punctuation.definition.string.begin.io',\n           regex: '\"',\n           push: \n            [ { token: 'punctuation.definition.string.end.io',\n                regex: '\"',\n                next: 'pop' },\n              { token: 'constant.character.escape.io', regex: '\\\\\\\\.' },\n              { defaultToken: 'string.quoted.double.io' } ] },\n         { token: 'constant.numeric.io',\n           regex: '\\\\b(?:0(?:x|X)[0-9a-fA-F]*|(?:[0-9]+\\\\.?[0-9]*|\\\\.[0-9]+)(?:(?:e|E)(?:\\\\+|-)?[0-9]+)?)(?:L|l|UL|ul|u|U|F|f)?\\\\b' },\n         { token: 'variable.other.global.io', regex: 'Lobby\\\\b' },\n         { token: 'constant.language.io',\n           regex: '\\\\b(?:TRUE|true|FALSE|false|NULL|null|Null|Nil|nil|YES|NO)\\\\b' } ] }\n    \n    this.normalizeRules();\n};\n\nIoHighlightRules.metaData = { fileTypes: [ 'io' ],\n      keyEquivalent: '^~I',\n      name: 'Io',\n      scopeName: 'source.io' }\n\n\noop.inherits(IoHighlightRules, TextHighlightRules);\n\nexports.IoHighlightRules = IoHighlightRules;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/io\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/tokenizer\",\"ace/mode/io_highlight_rules\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar IoHighlightRules = require(\"./io_highlight_rules\").IoHighlightRules;\nvar FoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = IoHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n    this.$id = \"ace/mode/io\"\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-jack.js",
    "content": "ace.define(\"ace/mode/jack_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JackHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"string\",\n                regex : '\"',\n                next  : \"string2\"\n            }, {\n                token : \"string\",\n                regex : \"'\",\n                next  : \"string1\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex: \"-?0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"(?:0|[-+]?[1-9][0-9]*)\\\\b\"\n            }, {\n                token : \"constant.binary\",\n                regex : \"<[0-9A-Fa-f][0-9A-Fa-f](\\\\s+[0-9A-Fa-f][0-9A-Fa-f])*>\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : \"constant.language.null\",\n                regex : \"null\\\\b\"\n            }, {\n                token : \"storage.type\",\n                regex: \"(?:Integer|Boolean|Null|String|Buffer|Tuple|List|Object|Function|Coroutine|Form)\\\\b\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:return|abort|vars|for|delete|in|is|escape|exec|split|and|if|elif|else|while)\\\\b\"\n            }, {\n                token : \"language.builtin\",\n                regex : \"(?:lines|source|parse|read-stream|interval|substr|parseint|write|print|range|rand|inspect|bind|i-values|i-pairs|i-map|i-filter|i-chunk|i-all\\\\?|i-any\\\\?|i-collect|i-zip|i-merge|i-each)\\\\b\"\n            }, {\n                token : \"comment\",\n                regex : \"--.*$\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"storage.form\",\n                regex : \"@[a-z]+\"\n            }, {\n                token : \"constant.other.symbol\",\n                regex : ':+[a-zA-Z_]([-]?[a-zA-Z0-9_])*[?!]?'\n            }, {\n                token : \"variable\",\n                regex : '[a-zA-Z_]([-]?[a-zA-Z0-9_])*[?!]?'\n            }, {\n                token : \"keyword.operator\",\n                regex : \"\\\\|\\\\||\\\\^\\\\^|&&|!=|==|<=|<|>=|>|\\\\+|-|\\\\*|\\\\/|\\\\^|\\\\%|\\\\#|\\\\!\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"string1\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : /\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|['\"\\\\\\/bfnrt])/\n            }, {\n                token : \"string\",\n                regex : \"[^'\\\\\\\\]+\"\n            }, {\n                token : \"string\",\n                regex : \"'\",\n                next  : \"start\"\n            }, {\n                token : \"string\",\n                regex : \"\",\n                next  : \"start\"\n            }\n        ],\n        \"string2\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : /\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|['\"\\\\\\/bfnrt])/\n            }, {\n                token : \"string\",\n                regex : '[^\"\\\\\\\\]+'\n            }, {\n                token : \"string\",\n                regex : '\"',\n                next  : \"start\"\n            }, {\n                token : \"string\",\n                regex : \"\",\n                next  : \"start\"\n            }\n        ]\n    };\n    \n};\n\noop.inherits(JackHighlightRules, TextHighlightRules);\n\nexports.JackHighlightRules = JackHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/jack\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/jack_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar HighlightRules = require(\"./jack_highlight_rules\").JackHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = HighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"--\";\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n\n    this.$id = \"ace/mode/jack\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-jade.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"string.cdata.xml\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.xml-decl.xml\", \"keyword.xml-decl.xml\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_decl\", caseInsensitive: true\n            },\n            {\n                token : [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"processing_instruction\",\n            },\n            {token : \"comment.xml\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\", caseInsensitive: true\n            },\n            {include : \"tag\"},\n            {token : \"text.end-tag-open.xml\", regex: \"</\"},\n            {token : \"text.tag-open.xml\", regex: \"<\"},\n            {include : \"reference\"},\n            {defaultToken : \"text.xml\"}\n        ],\n\n        xml_decl : [{\n            token : \"entity.other.attribute-name.decl-attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.decl-attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"whitespace\"\n        }, {\n            include: \"string\"\n        }, {\n            token : \"punctuation.xml-decl.xml\",\n            regex : \"\\\\?>\",\n            next : \"start\"\n        }],\n\n        processing_instruction : [\n            {token : \"punctuation.instruction.xml\", regex : \"\\\\?>\", next : \"start\"},\n            {defaultToken : \"instruction.xml\"}\n        ],\n\n        doctype : [\n            {include : \"whitespace\"},\n            {include : \"string\"},\n            {token : \"xml-pe.doctype.xml\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe.xml\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.int-subset\", regex : \"\\\\[\", push : \"int_subset\"}\n        ],\n\n        int_subset : [{\n            token : \"text.xml\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.int-subset.xml\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.markup-decl.xml\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.cdata.xml\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text.xml\", regex : \"\\\\s+\"},\n            {token : \"text.xml\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment.xml\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment.xml\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape.reference.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        attr_reference : [{\n            token : \"constant.language.escape.reference.attribute-value.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n            regex : \"(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n            ]\n        }],\n\n        tag_whitespace : [\n            {token : \"text.tag-whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        whitespace : [\n            {token : \"text.whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        string: [{\n            token : \"string.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.xml\", regex: \"'\", next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }, {\n            token : \"string.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.xml\", regex: '\"', next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }],\n\n        attributes: [{\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"tag_whitespace\"\n        }, {\n            include: \"attribute_value\"\n        }],\n\n        attribute_value: [{\n            token : \"string.attribute-value.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }, {\n            token : \"string.attribute-value.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\nace.define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\nace.define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    option      : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.addRules({\n        attributes: [{\n            include : \"tag_whitespace\"\n        }, {\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\",\n            push : [{\n                include: \"tag_whitespace\"\n            }, {\n                token : \"string.unquoted.attribute-value.html\",\n                regex : \"[^<>='\\\"`\\\\s]+\",\n                next : \"pop\"\n            }, {\n                token : \"empty\",\n                regex : \"\",\n                next : \"pop\"\n            }]\n        }, {\n            include : \"attribute_value\"\n        }],\n        tag: [{\n            token : function(start, tag) {\n                var group = tagMap[tag];\n                return [\"meta.tag.punctuation.\" + (start == \"<\" ? \"\" : \"end-\") + \"tag-open.xml\",\n                    \"meta.tag\" + (group ? \".\" + group : \"\") + \".tag-name.xml\"];\n            },\n            regex : \"(</?)([-_a-zA-Z0-9:]+)\",\n            next: \"tag_stuff\"\n        }],\n        tag_stuff: [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n        ],\n    });\n\n    this.embedTagRules(CssHighlightRules, \"css-\", \"style\");\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    if (this.constructor === HtmlHighlightRules)\n        this.normalizeRules();\n};\n\noop.inherits(HtmlHighlightRules, XmlHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\nace.define(\"ace/mode/markdown_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\",\"ace/mode/html_highlight_rules\",\"ace/mode/css_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\n\nvar escaped = function(ch) {\n    return \"(?:[^\" + lang.escapeRegExp(ch) + \"\\\\\\\\]|\\\\\\\\.)*\";\n}\n\nfunction github_embed(tag, prefix) {\n    return { // Github style block\n        token : \"support.function\",\n        regex : \"^\\\\s*```\" + tag + \"\\\\s*$\",\n        push  : prefix + \"start\"\n    };\n}\n\nvar MarkdownHighlightRules = function() {\n    HtmlHighlightRules.call(this);\n\n    this.$rules[\"start\"].unshift({\n        token : \"empty_line\",\n        regex : '^$',\n        next: \"allowBlock\"\n    }, { // h1\n        token: \"markup.heading.1\",\n        regex: \"^=+(?=\\\\s*$)\"\n    }, { // h2\n        token: \"markup.heading.2\",\n        regex: \"^\\\\-+(?=\\\\s*$)\"\n    }, {\n        token : function(value) {\n            return \"markup.heading.\" + value.length;\n        },\n        regex : /^#{1,6}(?=\\s*[^ #]|\\s+#.)/,\n        next : \"header\"\n    },\n       github_embed(\"(?:javascript|js)\", \"jscode-\"),\n       github_embed(\"xml\", \"xmlcode-\"),\n       github_embed(\"html\", \"htmlcode-\"),\n       github_embed(\"css\", \"csscode-\"),\n    { // Github style block\n        token : \"support.function\",\n        regex : \"^\\\\s*```\\\\s*\\\\S*(?:{.*?\\\\})?\\\\s*$\",\n        next  : \"githubblock\"\n    }, { // block quote\n        token : \"string.blockquote\",\n        regex : \"^\\\\s*>\\\\s*(?:[*+-]|\\\\d+\\\\.)?\\\\s+\",\n        next  : \"blockquote\"\n    }, { // HR * - _\n        token : \"constant\",\n        regex : \"^ {0,2}(?:(?: ?\\\\* ?){3,}|(?: ?\\\\- ?){3,}|(?: ?\\\\_ ?){3,})\\\\s*$\",\n        next: \"allowBlock\"\n    }, { // list\n        token : \"markup.list\",\n        regex : \"^\\\\s{0,3}(?:[*+-]|\\\\d+\\\\.)\\\\s+\",\n        next  : \"listblock-start\"\n    }, {\n        include : \"basic\"\n    });\n\n    this.addRules({\n        \"basic\" : [{\n            token : \"constant.language.escape\",\n            regex : /\\\\[\\\\`*_{}\\[\\]()#+\\-.!]/\n        }, { // code span `\n            token : \"support.function\",\n            regex : \"(`+)(.*?[^`])(\\\\1)\"\n        }, { // reference\n            token : [\"text\", \"constant\", \"text\", \"url\", \"string\", \"text\"],\n            regex : \"^([ ]{0,3}\\\\[)([^\\\\]]+)(\\\\]:\\\\s*)([^ ]+)(\\\\s*(?:[\\\"][^\\\"]+[\\\"])?(\\\\s*))$\"\n        }, { // link by reference\n            token : [\"text\", \"string\", \"text\", \"constant\", \"text\"],\n            regex : \"(\\\\[)(\" + escaped(\"]\") + \")(\\\\]\\s*\\\\[)(\"+ escaped(\"]\") + \")(\\\\])\"\n        }, { // link by url\n            token : [\"text\", \"string\", \"text\", \"markup.underline\", \"string\", \"text\"],\n            regex : \"(\\\\[)(\" +                                        // [\n                    escaped(\"]\") +                                    // link text\n                    \")(\\\\]\\\\()\"+                                      // ](\n                    '((?:[^\\\\)\\\\s\\\\\\\\]|\\\\\\\\.|\\\\s(?=[^\"]))*)' +        // href\n                    '(\\\\s*\"' +  escaped('\"') + '\"\\\\s*)?' +            // \"title\"\n                    \"(\\\\))\"                                           // )\n        }, { // strong ** __\n            token : \"string.strong\",\n            regex : \"([*]{2}|[_]{2}(?=\\\\S))(.*?\\\\S[*_]*)(\\\\1)\"\n        }, { // emphasis * _\n            token : \"string.emphasis\",\n            regex : \"([*]|[_](?=\\\\S))(.*?\\\\S[*_]*)(\\\\1)\"\n        }, { //\n            token : [\"text\", \"url\", \"text\"],\n            regex : \"(<)(\"+\n                      \"(?:https?|ftp|dict):[^'\\\">\\\\s]+\"+\n                      \"|\"+\n                      \"(?:mailto:)?[-.\\\\w]+\\\\@[-a-z0-9]+(?:\\\\.[-a-z0-9]+)*\\\\.[a-z]+\"+\n                    \")(>)\"\n        }],\n        \"allowBlock\": [\n            {token : \"support.function\", regex : \"^ {4}.+\", next : \"allowBlock\"},\n            {token : \"empty\", regex : \"\", next : \"start\"}\n        ],\n\n        \"header\" : [{\n            regex: \"$\",\n            next : \"start\"\n        }, {\n            include: \"basic\"\n        }, {\n            defaultToken : \"heading\"\n        } ],\n\n        \"listblock-start\" : [{\n            token : \"support.variable\",\n            regex : /(?:\\[[ x]\\])?/,\n            next  : \"listblock\"\n        }],\n\n        \"listblock\" : [ { // Lists only escape on completely blank lines.\n            token : \"empty_line\",\n            regex : \"^$\",\n            next  : \"start\"\n        }, { // list\n            token : \"markup.list\",\n            regex : \"^\\\\s{0,3}(?:[*+-]|\\\\d+\\\\.)\\\\s+\",\n            next  : \"listblock-start\"\n        }, {\n            include : \"basic\", noEscape: true\n        }, { // Github style block\n            token : \"support.function\",\n            regex : \"^\\\\s*```\\\\s*[a-zA-Z]*(?:{.*?\\\\})?\\\\s*$\",\n            next  : \"githubblock\"\n        }, {\n            defaultToken : \"list\" //do not use markup.list to allow stling leading `*` differntly\n        } ],\n\n        \"blockquote\" : [ { // Blockquotes only escape on blank lines.\n            token : \"empty_line\",\n            regex : \"^\\\\s*$\",\n            next  : \"start\"\n        }, { // block quote\n            token : \"string.blockquote\",\n            regex : \"^\\\\s*>\\\\s*(?:[*+-]|\\\\d+\\\\.)?\\\\s+\",\n            next  : \"blockquote\"\n        }, {\n            include : \"basic\", noEscape: true\n        }, {\n            defaultToken : \"string.blockquote\"\n        } ],\n\n        \"githubblock\" : [ {\n            token : \"support.function\",\n            regex : \"^\\\\s*```\",\n            next  : \"start\"\n        }, {\n            token : \"support.function\",\n            regex : \".+\"\n        } ]\n    });\n\n    this.embedRules(JavaScriptHighlightRules, \"jscode-\", [{\n       token : \"support.function\",\n       regex : \"^\\\\s*```\",\n       next  : \"pop\"\n    }]);\n\n    this.embedRules(HtmlHighlightRules, \"htmlcode-\", [{\n       token : \"support.function\",\n       regex : \"^\\\\s*```\",\n       next  : \"pop\"\n    }]);\n\n    this.embedRules(CssHighlightRules, \"csscode-\", [{\n       token : \"support.function\",\n       regex : \"^\\\\s*```\",\n       next  : \"pop\"\n    }]);\n\n    this.embedRules(XmlHighlightRules, \"xmlcode-\", [{\n       token : \"support.function\",\n       regex : \"^\\\\s*```\",\n       next  : \"pop\"\n    }]);\n\n    this.normalizeRules();\n};\noop.inherits(MarkdownHighlightRules, TextHighlightRules);\n\nexports.MarkdownHighlightRules = MarkdownHighlightRules;\n});\n\nace.define(\"ace/mode/scss_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar ScssHighlightRules = function() {\n    \n    var properties = lang.arrayToMap( (function () {\n\n        var browserPrefix = (\"-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-\").split(\"|\");\n        \n        var prefixProperties = (\"appearance|background-clip|background-inline-policy|background-origin|\" + \n             \"background-size|binding|border-bottom-colors|border-left-colors|\" + \n             \"border-right-colors|border-top-colors|border-end|border-end-color|\" + \n             \"border-end-style|border-end-width|border-image|border-start|\" + \n             \"border-start-color|border-start-style|border-start-width|box-align|\" + \n             \"box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|\" + \n             \"box-pack|box-sizing|column-count|column-gap|column-width|column-rule|\" + \n             \"column-rule-width|column-rule-style|column-rule-color|float-edge|\" + \n             \"font-feature-settings|font-language-override|force-broken-image-icon|\" + \n             \"image-region|margin-end|margin-start|opacity|outline|outline-color|\" + \n             \"outline-offset|outline-radius|outline-radius-bottomleft|\" + \n             \"outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|\" + \n             \"outline-style|outline-width|padding-end|padding-start|stack-sizing|\" + \n             \"tab-size|text-blink|text-decoration-color|text-decoration-line|\" + \n             \"text-decoration-style|transform|transform-origin|transition|\" + \n             \"transition-delay|transition-duration|transition-property|\" + \n             \"transition-timing-function|user-focus|user-input|user-modify|user-select|\" +\n             \"window-shadow|border-radius\").split(\"|\");\n        \n        var properties = (\"azimuth|background-attachment|background-color|background-image|\" +\n            \"background-position|background-repeat|background|border-bottom-color|\" +\n            \"border-bottom-style|border-bottom-width|border-bottom|border-collapse|\" +\n            \"border-color|border-left-color|border-left-style|border-left-width|\" +\n            \"border-left|border-right-color|border-right-style|border-right-width|\" +\n            \"border-right|border-spacing|border-style|border-top-color|\" +\n            \"border-top-style|border-top-width|border-top|border-width|border|bottom|\" +\n            \"box-shadow|box-sizing|caption-side|clear|clip|color|content|counter-increment|\" +\n            \"counter-reset|cue-after|cue-before|cue|cursor|direction|display|\" +\n            \"elevation|empty-cells|float|font-family|font-size-adjust|font-size|\" +\n            \"font-stretch|font-style|font-variant|font-weight|font|height|left|\" +\n            \"letter-spacing|line-height|list-style-image|list-style-position|\" +\n            \"list-style-type|list-style|margin-bottom|margin-left|margin-right|\" +\n            \"margin-top|marker-offset|margin|marks|max-height|max-width|min-height|\" +\n            \"min-width|opacity|orphans|outline-color|\" +\n            \"outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|\" +\n            \"padding-left|padding-right|padding-top|padding|page-break-after|\" +\n            \"page-break-before|page-break-inside|page|pause-after|pause-before|\" +\n            \"pause|pitch-range|pitch|play-during|position|quotes|richness|right|\" +\n            \"size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|\" +\n            \"stress|table-layout|text-align|text-decoration|text-indent|\" +\n            \"text-shadow|text-transform|top|unicode-bidi|vertical-align|\" +\n            \"visibility|voice-family|volume|white-space|widows|width|word-spacing|\" +\n            \"z-index\").split(\"|\");\n        var ret = [];\n        for (var i=0, ln=browserPrefix.length; i<ln; i++) {\n            Array.prototype.push.apply(\n                ret,\n                (( browserPrefix[i] + prefixProperties.join(\"|\" + browserPrefix[i]) ).split(\"|\"))\n            );\n        }\n        Array.prototype.push.apply(ret, prefixProperties);\n        Array.prototype.push.apply(ret, properties);\n        \n        return ret;\n        \n    })() );\n    \n\n\n    var functions = lang.arrayToMap(\n        (\"hsl|hsla|rgb|rgba|url|attr|counter|counters|abs|adjust_color|adjust_hue|\" +\n         \"alpha|join|blue|ceil|change_color|comparable|complement|darken|desaturate|\" + \n         \"floor|grayscale|green|hue|if|invert|join|length|lighten|lightness|mix|\" + \n         \"nth|opacify|opacity|percentage|quote|red|round|saturate|saturation|\" +\n         \"scale_color|transparentize|type_of|unit|unitless|unqoute\").split(\"|\")\n    );\n\n    var constants = lang.arrayToMap(\n        (\"absolute|all-scroll|always|armenian|auto|baseline|below|bidi-override|\" +\n        \"block|bold|bolder|border-box|both|bottom|break-all|break-word|capitalize|center|\" +\n        \"char|circle|cjk-ideographic|col-resize|collapse|content-box|crosshair|dashed|\" +\n        \"decimal-leading-zero|decimal|default|disabled|disc|\" +\n        \"distribute-all-lines|distribute-letter|distribute-space|\" +\n        \"distribute|dotted|double|e-resize|ellipsis|fixed|georgian|groove|\" +\n        \"hand|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|\" +\n        \"ideograph-alpha|ideograph-numeric|ideograph-parenthesis|\" +\n        \"ideograph-space|inactive|inherit|inline-block|inline|inset|inside|\" +\n        \"inter-ideograph|inter-word|italic|justify|katakana-iroha|katakana|\" +\n        \"keep-all|left|lighter|line-edge|line-through|line|list-item|loose|\" +\n        \"lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|\" +\n        \"medium|middle|move|n-resize|ne-resize|newspaper|no-drop|no-repeat|\" +\n        \"nw-resize|none|normal|not-allowed|nowrap|oblique|outset|outside|\" +\n        \"overline|pointer|progress|relative|repeat-x|repeat-y|repeat|right|\" +\n        \"ridge|row-resize|rtl|s-resize|scroll|se-resize|separate|small-caps|\" +\n        \"solid|square|static|strict|super|sw-resize|table-footer-group|\" +\n        \"table-header-group|tb-rl|text-bottom|text-top|text|thick|thin|top|\" +\n        \"transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|\" +\n        \"vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|\" +\n        \"zero\").split(\"|\")\n    );\n\n    var colors = lang.arrayToMap(\n        (\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|\" +\n        \"purple|red|silver|teal|white|yellow\").split(\"|\")\n    );\n    \n    var keywords = lang.arrayToMap(\n        (\"@mixin|@extend|@include|@import|@media|@debug|@warn|@if|@for|@each|@while|@else|@font-face|@-webkit-keyframes|if|and|!default|module|def|end|declare\").split(\"|\")\n    )\n    \n    var tags = lang.arrayToMap(\n        (\"a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdo|\" + \n         \"big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|\" + \n         \"command|datalist|dd|del|details|dfn|dir|div|dl|dt|em|embed|fieldset|\" + \n         \"figcaption|figure|font|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|\" + \n         \"header|hgroup|hr|html|i|iframe|img|input|ins|keygen|kbd|label|legend|li|\" + \n         \"link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|\" + \n         \"option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|\" + \n         \"small|source|span|strike|strong|style|sub|summary|sup|table|tbody|td|\" + \n         \"textarea|tfoot|th|thead|time|title|tr|tt|u|ul|var|video|wbr|xmp\").split(\"|\")\n    );\n\n    var numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                regex : '[\"].*\\\\\\\\$',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"string\", // multi line string start\n                regex : \"['].*\\\\\\\\$\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\",\n                regex : numRe + \"(?:em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)\"\n            }, {\n                token : \"constant.numeric\", // hex6 color\n                regex : \"#[a-f0-9]{6}\"\n            }, {\n                token : \"constant.numeric\", // hex3 color\n                regex : \"#[a-f0-9]{3}\"\n            }, {\n                token : \"constant.numeric\",\n                regex : numRe\n            }, {\n                token : [\"support.function\", \"string\", \"support.function\"],\n                regex : \"(url\\\\()(.*)(\\\\))\"\n            }, {\n                token : function(value) {\n                    if (properties.hasOwnProperty(value.toLowerCase()))\n                        return \"support.type\";\n                    if (keywords.hasOwnProperty(value))\n                        return \"keyword\";\n                    else if (constants.hasOwnProperty(value))\n                        return \"constant.language\";\n                    else if (functions.hasOwnProperty(value))\n                        return \"support.function\";\n                    else if (colors.hasOwnProperty(value.toLowerCase()))\n                        return \"support.constant.color\";\n                    else if (tags.hasOwnProperty(value.toLowerCase()))\n                        return \"variable.language\";\n                    else\n                        return \"text\";\n                },\n                regex : \"\\\\-?[@a-z_][@a-z0-9_\\\\-]*\"\n            }, {\n                token : \"variable\",\n                regex : \"[a-z_\\\\-$][a-z0-9_\\\\-$]*\\\\b\"\n            }, {\n                token: \"variable.language\",\n                regex: \"#[a-z0-9-_]+\"\n            }, {\n                token: \"variable.language\",\n                regex: \"\\\\.[a-z0-9-_]+\"\n            }, {\n                token: \"variable.language\",\n                regex: \":[a-z0-9-_]+\"\n            }, {\n                token: \"constant\",\n                regex: \"[a-z0-9-_]+\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"<|>|<=|>=|==|!=|-|%|#|\\\\+|\\\\$|\\\\+|\\\\*\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }, {\n                caseInsensitive: true\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '.+'\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '.+'\n            }\n        ]\n    };\n};\n\noop.inherits(ScssHighlightRules, TextHighlightRules);\n\nexports.ScssHighlightRules = ScssHighlightRules;\n\n});\n\nace.define(\"ace/mode/less_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar LessHighlightRules = function() {\n    \n    var properties = lang.arrayToMap( (function () {\n\n        var browserPrefix = (\"-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-\").split(\"|\");\n        \n        var prefixProperties = (\"appearance|background-clip|background-inline-policy|background-origin|\" + \n             \"background-size|binding|border-bottom-colors|border-left-colors|\" + \n             \"border-right-colors|border-top-colors|border-end|border-end-color|\" + \n             \"border-end-style|border-end-width|border-image|border-start|\" + \n             \"border-start-color|border-start-style|border-start-width|box-align|\" + \n             \"box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|\" + \n             \"box-pack|box-sizing|column-count|column-gap|column-width|column-rule|\" + \n             \"column-rule-width|column-rule-style|column-rule-color|float-edge|\" + \n             \"font-feature-settings|font-language-override|force-broken-image-icon|\" + \n             \"image-region|margin-end|margin-start|opacity|outline|outline-color|\" + \n             \"outline-offset|outline-radius|outline-radius-bottomleft|\" + \n             \"outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|\" + \n             \"outline-style|outline-width|padding-end|padding-start|stack-sizing|\" + \n             \"tab-size|text-blink|text-decoration-color|text-decoration-line|\" + \n             \"text-decoration-style|transform|transform-origin|transition|\" + \n             \"transition-delay|transition-duration|transition-property|\" + \n             \"transition-timing-function|user-focus|user-input|user-modify|user-select|\" +\n             \"window-shadow|border-radius\").split(\"|\");\n        \n        var properties = (\"azimuth|background-attachment|background-color|background-image|\" +\n            \"background-position|background-repeat|background|border-bottom-color|\" +\n            \"border-bottom-style|border-bottom-width|border-bottom|border-collapse|\" +\n            \"border-color|border-left-color|border-left-style|border-left-width|\" +\n            \"border-left|border-right-color|border-right-style|border-right-width|\" +\n            \"border-right|border-spacing|border-style|border-top-color|\" +\n            \"border-top-style|border-top-width|border-top|border-width|border|\" +\n            \"bottom|box-sizing|caption-side|clear|clip|color|content|counter-increment|\" +\n            \"counter-reset|cue-after|cue-before|cue|cursor|direction|display|\" +\n            \"elevation|empty-cells|float|font-family|font-size-adjust|font-size|\" +\n            \"font-stretch|font-style|font-variant|font-weight|font|height|left|\" +\n            \"letter-spacing|line-height|list-style-image|list-style-position|\" +\n            \"list-style-type|list-style|margin-bottom|margin-left|margin-right|\" +\n            \"margin-top|marker-offset|margin|marks|max-height|max-width|min-height|\" +\n            \"min-width|opacity|orphans|outline-color|\" +\n            \"outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|\" +\n            \"padding-left|padding-right|padding-top|padding|page-break-after|\" +\n            \"page-break-before|page-break-inside|page|pause-after|pause-before|\" +\n            \"pause|pitch-range|pitch|play-during|position|quotes|richness|right|\" +\n            \"size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|\" +\n            \"stress|table-layout|text-align|text-decoration|text-indent|\" +\n            \"text-shadow|text-transform|top|unicode-bidi|vertical-align|\" +\n            \"visibility|voice-family|volume|white-space|widows|width|word-spacing|\" +\n            \"z-index\").split(\"|\");\n        var ret = [];\n        for (var i=0, ln=browserPrefix.length; i<ln; i++) {\n            Array.prototype.push.apply(\n                ret,\n                (( browserPrefix[i] + prefixProperties.join(\"|\" + browserPrefix[i]) ).split(\"|\"))\n            );\n        }\n        Array.prototype.push.apply(ret, prefixProperties);\n        Array.prototype.push.apply(ret, properties);\n        \n        return ret;\n        \n    })() );\n    \n\n\n    var functions = lang.arrayToMap(\n        (\"hsl|hsla|rgb|rgba|url|attr|counter|counters|lighten|darken|saturate|\" +\n        \"desaturate|fadein|fadeout|fade|spin|mix|hue|saturation|lightness|\" +\n        \"alpha|round|ceil|floor|percentage|color|iscolor|isnumber|isstring|\" +\n        \"iskeyword|isurl|ispixel|ispercentage|isem\").split(\"|\")\n    );\n\n    var constants = lang.arrayToMap(\n        (\"absolute|all-scroll|always|armenian|auto|baseline|below|bidi-override|\" +\n        \"block|bold|bolder|border-box|both|bottom|break-all|break-word|capitalize|center|\" +\n        \"char|circle|cjk-ideographic|col-resize|collapse|content-box|crosshair|dashed|\" +\n        \"decimal-leading-zero|decimal|default|disabled|disc|\" +\n        \"distribute-all-lines|distribute-letter|distribute-space|\" +\n        \"distribute|dotted|double|e-resize|ellipsis|fixed|georgian|groove|\" +\n        \"hand|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|\" +\n        \"ideograph-alpha|ideograph-numeric|ideograph-parenthesis|\" +\n        \"ideograph-space|inactive|inherit|inline-block|inline|inset|inside|\" +\n        \"inter-ideograph|inter-word|italic|justify|katakana-iroha|katakana|\" +\n        \"keep-all|left|lighter|line-edge|line-through|line|list-item|loose|\" +\n        \"lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|\" +\n        \"medium|middle|move|n-resize|ne-resize|newspaper|no-drop|no-repeat|\" +\n        \"nw-resize|none|normal|not-allowed|nowrap|oblique|outset|outside|\" +\n        \"overline|pointer|progress|relative|repeat-x|repeat-y|repeat|right|\" +\n        \"ridge|row-resize|rtl|s-resize|scroll|se-resize|separate|small-caps|\" +\n        \"solid|square|static|strict|super|sw-resize|table-footer-group|\" +\n        \"table-header-group|tb-rl|text-bottom|text-top|text|thick|thin|top|\" +\n        \"transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|\" +\n        \"vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|\" +\n        \"zero\").split(\"|\")\n    );\n\n    var colors = lang.arrayToMap(\n        (\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|\" +\n        \"purple|red|silver|teal|white|yellow\").split(\"|\")\n    );\n    \n    var keywords = lang.arrayToMap(\n        (\"@mixin|@extend|@include|@import|@media|@debug|@warn|@if|@for|@each|\" +\n        \"@while|@else|@font-face|@-webkit-keyframes|if|and|!default|module|\" +\n        \"def|end|declare|when|not|and\").split(\"|\")\n    );\n    \n    var tags = lang.arrayToMap(\n        (\"a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdo|\" + \n         \"big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|\" + \n         \"command|datalist|dd|del|details|dfn|dir|div|dl|dt|em|embed|fieldset|\" + \n         \"figcaption|figure|font|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|\" + \n         \"header|hgroup|hr|html|i|iframe|img|input|ins|keygen|kbd|label|legend|li|\" + \n         \"link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|\" + \n         \"option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|\" + \n         \"small|source|span|strike|strong|style|sub|summary|sup|table|tbody|td|\" + \n         \"textarea|tfoot|th|thead|time|title|tr|tt|u|ul|var|video|wbr|xmp\").split(\"|\")\n    );\n\n    var numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"constant.numeric\",\n                regex : numRe + \"(?:em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)\"\n            }, {\n                token : \"constant.numeric\", // hex6 color\n                regex : \"#[a-f0-9]{6}\"\n            }, {\n                token : \"constant.numeric\", // hex3 color\n                regex : \"#[a-f0-9]{3}\"\n            }, {\n                token : \"constant.numeric\",\n                regex : numRe\n            }, {\n                token : function(value) {\n                    if (keywords.hasOwnProperty(value))\n                        return \"keyword\";\n                    else\n                        return \"variable\";\n                },\n                regex : \"@[a-z0-9_\\\\-@]*\\\\b\"\n            }, {\n                token : function(value) {\n                    if (properties.hasOwnProperty(value.toLowerCase()))\n                        return \"support.type\";\n                    else if (keywords.hasOwnProperty(value))\n                        return \"keyword\";\n                    else if (constants.hasOwnProperty(value))\n                        return \"constant.language\";\n                    else if (functions.hasOwnProperty(value))\n                        return \"support.function\";\n                    else if (colors.hasOwnProperty(value.toLowerCase()))\n                        return \"support.constant.color\";\n                    else if (tags.hasOwnProperty(value.toLowerCase()))\n                        return \"variable.language\";\n                    else\n                        return \"text\";\n                },\n                regex : \"\\\\-?[@a-z_][@a-z0-9_\\\\-]*\"\n            }, {\n                token: \"variable.language\",\n                regex: \"#[a-z0-9-_]+\"\n            }, {\n                token: \"variable.language\",\n                regex: \"\\\\.[a-z0-9-_]+\"\n            }, {\n                token: \"variable.language\",\n                regex: \":[a-z0-9-_]+\"\n            }, {\n                token: \"constant\",\n                regex: \"[a-z0-9-_]+\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"<|>|<=|>=|==|!=|-|%|#|\\\\+|\\\\$|\\\\+|\\\\*\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }, {\n                caseInsensitive: true\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ]\n    };\n};\n\noop.inherits(LessHighlightRules, TextHighlightRules);\n\nexports.LessHighlightRules = LessHighlightRules;\n\n});\n\nace.define(\"ace/mode/coffee_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\n    var oop = require(\"../lib/oop\");\n    var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\n    oop.inherits(CoffeeHighlightRules, TextHighlightRules);\n\n    function CoffeeHighlightRules() {\n        var identifier = \"[$A-Za-z_\\\\x7f-\\\\uffff][$\\\\w\\\\x7f-\\\\uffff]*\";\n\n        var keywords = (\n            \"this|throw|then|try|typeof|super|switch|return|break|by|continue|\" +\n            \"catch|class|in|instanceof|is|isnt|if|else|extends|for|own|\" +\n            \"finally|function|while|when|new|no|not|delete|debugger|do|loop|of|off|\" +\n            \"or|on|unless|until|and|yes\"\n        );\n\n        var langConstant = (\n            \"true|false|null|undefined|NaN|Infinity\"\n        );\n\n        var illegal = (\n            \"case|const|default|function|var|void|with|enum|export|implements|\" +\n            \"interface|let|package|private|protected|public|static|yield|\" +\n            \"__hasProp|slice|bind|indexOf\"\n        );\n\n        var supportClass = (\n            \"Array|Boolean|Date|Function|Number|Object|RegExp|ReferenceError|String|\" +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\" +\n            \"SyntaxError|TypeError|URIError|\"  +\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\" +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray\"\n        );\n\n        var supportFunction = (\n            \"Math|JSON|isNaN|isFinite|parseInt|parseFloat|encodeURI|\" +\n            \"encodeURIComponent|decodeURI|decodeURIComponent|String|\"\n        );\n\n        var variableLanguage = (\n            \"window|arguments|prototype|document\"\n        );\n\n        var keywordMapper = this.createKeywordMapper({\n            \"keyword\": keywords,\n            \"constant.language\": langConstant,\n            \"invalid.illegal\": illegal,\n            \"language.support.class\": supportClass,\n            \"language.support.function\": supportFunction,\n            \"variable.language\": variableLanguage\n        }, \"identifier\");\n\n        var functionRule = {\n            token: [\"paren.lparen\", \"variable.parameter\", \"paren.rparen\", \"text\", \"storage.type\"],\n            regex: /(?:(\\()((?:\"[^\")]*?\"|'[^')]*?'|\\/[^\\/)]*?\\/|[^()\\\"'\\/])*?)(\\))(\\s*))?([\\-=]>)/.source\n        };\n\n        var stringEscape = /\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)/;\n\n        this.$rules = {\n            start : [\n                {\n                    token : \"constant.numeric\",\n                    regex : \"(?:0x[\\\\da-fA-F]+|(?:\\\\d+(?:\\\\.\\\\d+)?|\\\\.\\\\d+)(?:[eE][+-]?\\\\d+)?)\"\n                }, {\n                    stateName: \"qdoc\",\n                    token : \"string\", regex : \"'''\", next : [\n                        {token : \"string\", regex : \"'''\", next : \"start\"},\n                        {token : \"constant.language.escape\", regex : stringEscape},\n                        {defaultToken: \"string\"}\n                    ]\n                }, {\n                    stateName: \"qqdoc\",\n                    token : \"string\",\n                    regex : '\"\"\"',\n                    next : [\n                        {token : \"string\", regex : '\"\"\"', next : \"start\"},\n                        {token : \"paren.string\", regex : '#{', push : \"start\"},\n                        {token : \"constant.language.escape\", regex : stringEscape},\n                        {defaultToken: \"string\"}\n                    ]\n                }, {\n                    stateName: \"qstring\",\n                    token : \"string\", regex : \"'\", next : [\n                        {token : \"string\", regex : \"'\", next : \"start\"},\n                        {token : \"constant.language.escape\", regex : stringEscape},\n                        {defaultToken: \"string\"}\n                    ]\n                }, {\n                    stateName: \"qqstring\",\n                    token : \"string.start\", regex : '\"', next : [\n                        {token : \"string.end\", regex : '\"', next : \"start\"},\n                        {token : \"paren.string\", regex : '#{', push : \"start\"},\n                        {token : \"constant.language.escape\", regex : stringEscape},\n                        {defaultToken: \"string\"}\n                    ]\n                }, {\n                    stateName: \"js\",\n                    token : \"string\", regex : \"`\", next : [\n                        {token : \"string\", regex : \"`\", next : \"start\"},\n                        {token : \"constant.language.escape\", regex : stringEscape},\n                        {defaultToken: \"string\"}\n                    ]\n                }, {\n                    regex: \"[{}]\", onMatch: function(val, state, stack) {\n                        this.next = \"\";\n                        if (val == \"{\" && stack.length) {\n                            stack.unshift(\"start\", state);\n                            return \"paren\";\n                        }\n                        if (val == \"}\" && stack.length) {\n                            stack.shift();\n                            this.next = stack.shift() || \"\";\n                            if (this.next.indexOf(\"string\") != -1)\n                                return \"paren.string\";\n                        }\n                        return \"paren\";\n                    }\n                }, {\n                    token : \"string.regex\",\n                    regex : \"///\",\n                    next : \"heregex\"\n                }, {\n                    token : \"string.regex\",\n                    regex : /(?:\\/(?![\\s=])[^[\\/\\n\\\\]*(?:(?:\\\\[\\s\\S]|\\[[^\\]\\n\\\\]*(?:\\\\[\\s\\S][^\\]\\n\\\\]*)*])[^[\\/\\n\\\\]*)*\\/)(?:[imgy]{0,4})(?!\\w)/\n                }, {\n                    token : \"comment\",\n                    regex : \"###(?!#)\",\n                    next : \"comment\"\n                }, {\n                    token : \"comment\",\n                    regex : \"#.*\"\n                }, {\n                    token : [\"punctuation.operator\", \"text\", \"identifier\"],\n                    regex : \"(\\\\.)(\\\\s*)(\" + illegal + \")\"\n                }, {\n                    token : \"punctuation.operator\",\n                    regex : \"\\\\.\"\n                }, {\n                    token : [\"keyword\", \"text\", \"language.support.class\",\n                     \"text\", \"keyword\", \"text\", \"language.support.class\"],\n                    regex : \"(class)(\\\\s+)(\" + identifier + \")(?:(\\\\s+)(extends)(\\\\s+)(\" + identifier + \"))?\"\n                }, {\n                    token : [\"entity.name.function\", \"text\", \"keyword.operator\", \"text\"].concat(functionRule.token),\n                    regex : \"(\" + identifier + \")(\\\\s*)([=:])(\\\\s*)\" + functionRule.regex\n                }, \n                functionRule, \n                {\n                    token : \"variable\",\n                    regex : \"@(?:\" + identifier + \")?\"\n                }, {\n                    token: keywordMapper,\n                    regex : identifier\n                }, {\n                    token : \"punctuation.operator\",\n                    regex : \"\\\\,|\\\\.\"\n                }, {\n                    token : \"storage.type\",\n                    regex : \"[\\\\-=]>\"\n                }, {\n                    token : \"keyword.operator\",\n                    regex : \"(?:[-+*/%<>&|^!?=]=|>>>=?|\\\\-\\\\-|\\\\+\\\\+|::|&&=|\\\\|\\\\|=|<<=|>>=|\\\\?\\\\.|\\\\.{2,3}|[!*+-=><])\"\n                }, {\n                    token : \"paren.lparen\",\n                    regex : \"[({[]\"\n                }, {\n                    token : \"paren.rparen\",\n                    regex : \"[\\\\]})]\"\n                }, {\n                    token : \"text\",\n                    regex : \"\\\\s+\"\n                }],\n\n\n            heregex : [{\n                token : \"string.regex\",\n                regex : '.*?///[imgy]{0,4}',\n                next : \"start\"\n            }, {\n                token : \"comment.regex\",\n                regex : \"\\\\s+(?:#.*)?\"\n            }, {\n                token : \"string.regex\",\n                regex : \"\\\\S+\"\n            }],\n\n            comment : [{\n                token : \"comment\",\n                regex : '###',\n                next : \"start\"\n            }, {\n                defaultToken : \"comment\"\n            }]\n        };\n        this.normalizeRules();\n    }\n\n    exports.CoffeeHighlightRules = CoffeeHighlightRules;\n});\n\nace.define(\"ace/mode/jade_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\",\"ace/mode/markdown_highlight_rules\",\"ace/mode/scss_highlight_rules\",\"ace/mode/less_highlight_rules\",\"ace/mode/coffee_highlight_rules\",\"ace/mode/javascript_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar MarkdownHighlightRules = require(\"./markdown_highlight_rules\").MarkdownHighlightRules;\nvar SassHighlightRules = require(\"./scss_highlight_rules\").ScssHighlightRules;\nvar LessHighlightRules = require(\"./less_highlight_rules\").LessHighlightRules;\nvar CoffeeHighlightRules = require(\"./coffee_highlight_rules\").CoffeeHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\n\nfunction mixin_embed(tag, prefix) {\n    return { \n        token : \"entity.name.function.jade\",\n        regex : \"^\\\\s*\\\\:\" + tag,\n        next  : prefix + \"start\"\n    };\n}\n\nvar JadeHighlightRules = function() {\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = \n        {\n    \"start\": [\n        {\n            token: \"keyword.control.import.include.jade\",\n            regex: \"\\\\s*\\\\binclude\\\\b\"\n        },\n        {\n            token: \"keyword.other.doctype.jade\",\n            regex: \"^!!!\\\\s*(?:[a-zA-Z0-9-_]+)?\"\n        },\n        {\n            token : \"punctuation.section.comment\",\n            regex : \"^\\\\s*\\/\\/(?:\\\\s*[^-\\\\s]|\\\\s+\\\\S)(?:.*$)\"\n        },\n        {\n            onMatch: function(value, currentState, stack) {\n                stack.unshift(this.next, value.length - 2, currentState);\n                return \"comment\";\n            },\n            regex: /^\\s*\\/\\//,\n            next: \"comment_block\"\n        },\n        mixin_embed(\"markdown\", \"markdown-\"),\n        mixin_embed(\"sass\", \"sass-\"),\n        mixin_embed(\"less\", \"less-\"),\n        mixin_embed(\"coffee\", \"coffee-\"),\n        {\n            token: [ \"storage.type.function.jade\",\n                       \"entity.name.function.jade\",\n                       \"punctuation.definition.parameters.begin.jade\",\n                       \"variable.parameter.function.jade\",\n                       \"punctuation.definition.parameters.end.jade\"\n                    ],\n            regex: \"^(\\\\s*mixin)( [\\\\w\\\\-]+)(\\\\s*\\\\()(.*?)(\\\\))\"\n        },\n        {\n            token: [ \"storage.type.function.jade\", \"entity.name.function.jade\"],\n            regex: \"^(\\\\s*mixin)( [\\\\w\\\\-]+)\"\n        },\n        {\n            token: \"source.js.embedded.jade\",\n            regex: \"^\\\\s*(?:-|=|!=)\",\n            next: \"js-start\"\n        },\n        {\n            token: \"string.interpolated.jade\",\n            regex: \"[#!]\\\\{[^\\\\}]+\\\\}\"\n        },\n        {\n            token: \"meta.tag.any.jade\",\n            regex: /^\\s*(?!\\w+\\:)(?:[\\w]+|(?=\\.|#)])/,\n            next: \"tag_single\"\n        },\n        {\n            token: \"suport.type.attribute.id.jade\",\n            regex: \"#\\\\w+\"\n        },\n        {\n            token: \"suport.type.attribute.class.jade\",\n            regex: \"\\\\.\\\\w+\"\n        },\n        {\n            token: \"punctuation\",\n            regex: \"\\\\s*(?:\\\\()\",\n            next: \"tag_attributes\"\n        }\n    ],\n    \"comment_block\": [\n        {regex: /^\\s*/, onMatch: function(value, currentState, stack) {\n            if (value.length <= stack[1]) {\n                stack.shift();\n                stack.shift();\n                this.next = stack.shift();\n                return \"text\";\n            } else {\n                this.next = \"\";\n                return \"comment\";\n            }\n        }, next: \"start\"},\n        {defaultToken: \"comment\"}\n    ],\n    \"tag_single\": [\n        {\n            token: \"entity.other.attribute-name.class.jade\",\n            regex: \"\\\\.[\\\\w-]+\"\n        },\n        {\n            token: \"entity.other.attribute-name.id.jade\",\n            regex: \"#[\\\\w-]+\"\n        },\n        {\n            token: [\"text\", \"punctuation\"],\n            regex: \"($)|((?!\\\\.|#|=|-))\",\n            next: \"start\"\n        }\n    ],\n    \"tag_attributes\": [ \n        {\n            token : \"string\",\n            regex : \"'(?=.)\",\n            next  : \"qstring\"\n        }, \n        {\n            token : \"string\",\n            regex : '\"(?=.)',\n            next  : \"qqstring\"\n        },\n        {\n            token: \"entity.other.attribute-name.jade\",\n            regex: \"\\\\b[a-zA-Z\\\\-:]+\"\n        },\n        {\n            token: [\"entity.other.attribute-name.jade\", \"punctuation\"],\n            regex: \"\\\\b([a-zA-Z:\\\\.-]+)(=)\",\n            next: \"attribute_strings\"\n        },\n        {\n            token: \"punctuation\",\n            regex: \"\\\\)\",\n            next: \"start\"\n        }\n    ],\n    \"attribute_strings\": [\n        {\n            token : \"string\",\n            regex : \"'(?=.)\",\n            next  : \"qstring\"\n        }, \n        {\n            token : \"string\",\n            regex : '\"(?=.)',\n            next  : \"qqstring\"\n        }\n    ],\n    \"qqstring\" : [\n        {\n            token : \"constant.language.escape\",\n            regex : escapedRe\n        }, {\n            token : \"string\",\n            regex : '[^\"\\\\\\\\]+'\n        }, {\n            token : \"string\",\n            regex : \"\\\\\\\\$\",\n            next  : \"qqstring\"\n        }, {\n            token : \"string\",\n            regex : '\"|$',\n            next  : \"tag_attributes\"\n        }\n    ],\n    \"qstring\" : [\n        {\n            token : \"constant.language.escape\",\n            regex : escapedRe\n        }, {\n            token : \"string\",\n            regex : \"[^'\\\\\\\\]+\"\n        }, {\n            token : \"string\",\n            regex : \"\\\\\\\\$\",\n            next  : \"qstring\"\n        }, {\n            token : \"string\",\n            regex : \"'|$\",\n            next  : \"tag_attributes\"\n        }\n    ]\n};\n\n    this.embedRules(JavaScriptHighlightRules, \"js-\", [{\n        token: \"text\",\n        regex: \".$\",\n        next: \"start\"\n    }]);\n};\n\noop.inherits(JadeHighlightRules, TextHighlightRules);\n\nexports.JadeHighlightRules = JadeHighlightRules;\n});\n\nace.define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var range = this.indentationBlock(session, row);\n        if (range)\n            return range;\n\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1 || line[startLevel] != \"#\")\n            return;\n\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var level = line.search(re);\n\n            if (level == -1)\n                continue;\n\n            if (line[level] != \"#\")\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        var next = session.getLine(row + 1);\n        var prev = session.getLine(row - 1);\n        var prevIndent = prev.search(/\\S/);\n        var nextIndent = next.search(/\\S/);\n\n        if (indent == -1) {\n            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? \"start\" : \"\";\n            return \"\";\n        }\n        if (prevIndent == -1) {\n            if (indent == nextIndent && line[indent] == \"#\" && next[indent] == \"#\") {\n                session.foldWidgets[row - 1] = \"\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"start\";\n            }\n        } else if (prevIndent == indent && line[indent] == \"#\" && prev[indent] == \"#\") {\n            if (session.getLine(row - 2).search(/\\S/) == -1) {\n                session.foldWidgets[row - 1] = \"start\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"\";\n            }\n        }\n\n        if (prevIndent!= -1 && prevIndent < indent)\n            session.foldWidgets[row - 1] = \"start\";\n        else\n            session.foldWidgets[row - 1] = \"\";\n\n        if (indent < nextIndent)\n            return \"start\";\n        else\n            return \"\";\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/jade\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/jade_highlight_rules\",\"ace/mode/folding/coffee\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JadeHighlightRules = require(\"./jade_highlight_rules\").JadeHighlightRules;\nvar FoldMode = require(\"./folding/coffee\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JadeHighlightRules;\n    \n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() { \n\tthis.lineCommentStart = \"//\";\n    this.$id = \"ace/mode/jade\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-java.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/java_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaHighlightRules = function() {\n    var keywords = (\n    \"abstract|continue|for|new|switch|\" +\n    \"assert|default|goto|package|synchronized|\" +\n    \"boolean|do|if|private|this|\" +\n    \"break|double|implements|protected|throw|\" +\n    \"byte|else|import|public|throws|\" +\n    \"case|enum|instanceof|return|transient|\" +\n    \"catch|extends|int|short|try|\" +\n    \"char|final|interface|static|void|\" +\n    \"class|finally|long|strictfp|volatile|\" +\n    \"const|float|native|super|while\"\n    );\n\n    var buildinConstants = (\"null|Infinity|NaN|undefined\");\n\n\n    var langClasses = (\n        \"AbstractMethodError|AssertionError|ClassCircularityError|\"+\n        \"ClassFormatError|Deprecated|EnumConstantNotPresentException|\"+\n        \"ExceptionInInitializerError|IllegalAccessError|\"+\n        \"IllegalThreadStateException|InstantiationError|InternalError|\"+\n        \"NegativeArraySizeException|NoSuchFieldError|Override|Process|\"+\n        \"ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|\"+\n        \"SuppressWarnings|TypeNotPresentException|UnknownError|\"+\n        \"UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|\"+\n        \"InstantiationException|IndexOutOfBoundsException|\"+\n        \"ArrayIndexOutOfBoundsException|CloneNotSupportedException|\"+\n        \"NoSuchFieldException|IllegalArgumentException|NumberFormatException|\"+\n        \"SecurityException|Void|InheritableThreadLocal|IllegalStateException|\"+\n        \"InterruptedException|NoSuchMethodException|IllegalAccessException|\"+\n        \"UnsupportedOperationException|Enum|StrictMath|Package|Compiler|\"+\n        \"Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|\"+\n        \"NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|\"+\n        \"NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|\"+\n        \"Character|Boolean|StackTraceElement|Appendable|StringBuffer|\"+\n        \"Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|\"+\n        \"StackOverflowError|OutOfMemoryError|VirtualMachineError|\"+\n        \"ArrayStoreException|ClassCastException|LinkageError|\"+\n        \"NoClassDefFoundError|ClassNotFoundException|RuntimeException|\"+\n        \"Exception|ThreadDeath|Error|Throwable|System|ClassLoader|\"+\n        \"Cloneable|Class|CharSequence|Comparable|String|Object\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": \"this\",\n        \"keyword\": keywords,\n        \"constant.language\": buildinConstants,\n        \"support.function\": langClasses\n    }, \"identifier\");\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"\n            }, {\n                token : \"lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(JavaHighlightRules, TextHighlightRules);\n\nexports.JavaHighlightRules = JavaHighlightRules;\n});\n\nace.define(\"ace/mode/java\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/javascript\",\"ace/mode/java_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar JavaHighlightRules = require(\"./java_highlight_rules\").JavaHighlightRules;\n\nvar Mode = function() {\n    JavaScriptMode.call(this);\n    this.HighlightRules = JavaHighlightRules;\n};\noop.inherits(Mode, JavaScriptMode);\n\n(function() {\n    \n    this.createWorker = function(session) {\n        return null;\n    };\n\n    this.$id = \"ace/mode/java\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-javascript.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-json.js",
    "content": "ace.define(\"ace/mode/json_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JsonHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"variable\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]\\\\s*(?=:)'\n            }, {\n                token : \"string\", // single line\n                regex : '\"',\n                next  : \"string\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : \"invalid.illegal\", // single quoted strings are not allowed\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"invalid.illegal\", // comments are not allowed\n                regex : \"\\\\/\\\\/.*$\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"string\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : /\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[\"\\\\\\/bfnrt])/\n            }, {\n                token : \"string\",\n                regex : '[^\"\\\\\\\\]+'\n            }, {\n                token : \"string\",\n                regex : '\"',\n                next  : \"start\"\n            }, {\n                token : \"string\",\n                regex : \"\",\n                next  : \"start\"\n            }\n        ]\n    };\n    \n};\n\noop.inherits(JsonHighlightRules, TextHighlightRules);\n\nexports.JsonHighlightRules = JsonHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/json\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/json_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\",\"ace/worker/worker_client\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar HighlightRules = require(\"./json_highlight_rules\").JsonHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\n\nvar Mode = function() {\n    this.HighlightRules = HighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/json_worker\", \"JsonWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"error\", function(e) {\n            session.setAnnotations([e.data]);\n        });\n\n        worker.on(\"ok\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n\n    this.$id = \"ace/mode/json\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-jsoniq.js",
    "content": "ace.define(\"ace/mode/xquery/jsoniq_lexer\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\nmodule.exports = (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);throw new Error(\"Cannot find module '\"+o+\"'\")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.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})({\n1:[function(_dereq_,module,exports){\n                                                            var JSONiqTokenizer = exports.JSONiqTokenizer = function JSONiqTokenizer(string, parsingEventHandler)\n                                                            {\n                                                              init(string, parsingEventHandler);\n  var self = this;\n\n  this.ParseException = function(b, e, s, o, x)\n  {\n    var\n      begin = b,\n      end = e,\n      state = s,\n      offending = o,\n      expected = x;\n\n    this.getBegin = function() {return begin;};\n    this.getEnd = function() {return end;};\n    this.getState = function() {return state;};\n    this.getExpected = function() {return expected;};\n    this.getOffending = function() {return offending;};\n\n    this.getMessage = function()\n    {\n      return offending < 0 ? \"lexical analysis failed\" : \"syntax error\";\n    };\n  };\n\n  function init(string, parsingEventHandler)\n  {\n    eventHandler = parsingEventHandler;\n    input = string;\n    size = string.length;\n    reset(0, 0, 0);\n  }\n\n  this.getInput = function()\n  {\n    return input;\n  };\n\n  function reset(l, b, e)\n  {\n            b0 = b; e0 = b;\n    l1 = l; b1 = b; e1 = e;\n    end = e;\n    eventHandler.reset(input);\n  }\n\n  this.getOffendingToken = function(e)\n  {\n    var o = e.getOffending();\n    return o >= 0 ? JSONiqTokenizer.TOKEN[o] : null;\n  };\n\n  this.getExpectedTokenSet = function(e)\n  {\n    var expected;\n    if (e.getExpected() < 0)\n    {\n      expected = JSONiqTokenizer.getTokenSet(- e.getState());\n    }\n    else\n    {\n      expected = [JSONiqTokenizer.TOKEN[e.getExpected()]];\n    }\n    return expected;\n  };\n\n  this.getErrorMessage = function(e)\n  {\n    var tokenSet = this.getExpectedTokenSet(e);\n    var found = this.getOffendingToken(e);\n    var prefix = input.substring(0, e.getBegin());\n    var lines = prefix.split(\"\\n\");\n    var line = lines.length;\n    var column = lines[line - 1].length + 1;\n    var size = e.getEnd() - e.getBegin();\n    return e.getMessage()\n         + (found == null ? \"\" : \", found \" + found)\n         + \"\\nwhile expecting \"\n         + (tokenSet.length == 1 ? tokenSet[0] : (\"[\" + tokenSet.join(\", \") + \"]\"))\n         + \"\\n\"\n         + (size == 0 || found != null ? \"\" : \"after successfully scanning \" + size + \" characters beginning \")\n         + \"at line \" + line + \", column \" + column + \":\\n...\"\n         + input.substring(e.getBegin(), Math.min(input.length, e.getBegin() + 64))\n         + \"...\";\n  };\n\n  this.parse_start = function()\n  {\n    eventHandler.startNonterminal(\"start\", e0);\n    lookahead1W(14);                // ModuleDecl | Annotation | OptionDecl | Operator | Variable | Tag | AttrTest |\n    switch (l1)\n    {\n    case 58:                        // '<![CDATA['\n      shift(58);                    // '<![CDATA['\n      break;\n    case 57:                        // '<!--'\n      shift(57);                    // '<!--'\n      break;\n    case 59:                        // '<?'\n      shift(59);                    // '<?'\n      break;\n    case 43:                        // '(#'\n      shift(43);                    // '(#'\n      break;\n    case 45:                        // '(:~'\n      shift(45);                    // '(:~'\n      break;\n    case 44:                        // '(:'\n      shift(44);                    // '(:'\n      break;\n    case 37:                        // '\"'\n      shift(37);                    // '\"'\n      break;\n    case 41:                        // \"'\"\n      shift(41);                    // \"'\"\n      break;\n    case 277:                       // '}'\n      shift(277);                   // '}'\n      break;\n    case 274:                       // '{'\n      shift(274);                   // '{'\n      break;\n    case 42:                        // '('\n      shift(42);                    // '('\n      break;\n    case 46:                        // ')'\n      shift(46);                    // ')'\n      break;\n    case 52:                        // '/'\n      shift(52);                    // '/'\n      break;\n    case 65:                        // '['\n      shift(65);                    // '['\n      break;\n    case 66:                        // ']'\n      shift(66);                    // ']'\n      break;\n    case 49:                        // ','\n      shift(49);                    // ','\n      break;\n    case 51:                        // '.'\n      shift(51);                    // '.'\n      break;\n    case 56:                        // ';'\n      shift(56);                    // ';'\n      break;\n    case 54:                        // ':'\n      shift(54);                    // ':'\n      break;\n    case 36:                        // '!'\n      shift(36);                    // '!'\n      break;\n    case 276:                       // '|'\n      shift(276);                   // '|'\n      break;\n    case 40:                        // '$$'\n      shift(40);                    // '$$'\n      break;\n    case 5:                         // Annotation\n      shift(5);                     // Annotation\n      break;\n    case 4:                         // ModuleDecl\n      shift(4);                     // ModuleDecl\n      break;\n    case 6:                         // OptionDecl\n      shift(6);                     // OptionDecl\n      break;\n    case 15:                        // AttrTest\n      shift(15);                    // AttrTest\n      break;\n    case 16:                        // Wildcard\n      shift(16);                    // Wildcard\n      break;\n    case 18:                        // IntegerLiteral\n      shift(18);                    // IntegerLiteral\n      break;\n    case 19:                        // DecimalLiteral\n      shift(19);                    // DecimalLiteral\n      break;\n    case 20:                        // DoubleLiteral\n      shift(20);                    // DoubleLiteral\n      break;\n    case 8:                         // Variable\n      shift(8);                     // Variable\n      break;\n    case 9:                         // Tag\n      shift(9);                     // Tag\n      break;\n    case 7:                         // Operator\n      shift(7);                     // Operator\n      break;\n    case 35:                        // EOF\n      shift(35);                    // EOF\n      break;\n    default:\n      parse_EQName();\n    }\n    eventHandler.endNonterminal(\"start\", e0);\n  };\n\n  this.parse_StartTag = function()\n  {\n    eventHandler.startNonterminal(\"StartTag\", e0);\n    lookahead1W(8);                 // QName | S^WS | EOF | '\"' | \"'\" | '/>' | '=' | '>'\n    switch (l1)\n    {\n    case 61:                        // '>'\n      shift(61);                    // '>'\n      break;\n    case 53:                        // '/>'\n      shift(53);                    // '/>'\n      break;\n    case 29:                        // QName\n      shift(29);                    // QName\n      break;\n    case 60:                        // '='\n      shift(60);                    // '='\n      break;\n    case 37:                        // '\"'\n      shift(37);                    // '\"'\n      break;\n    case 41:                        // \"'\"\n      shift(41);                    // \"'\"\n      break;\n    default:\n      shift(35);                    // EOF\n    }\n    eventHandler.endNonterminal(\"StartTag\", e0);\n  };\n\n  this.parse_TagContent = function()\n  {\n    eventHandler.startNonterminal(\"TagContent\", e0);\n    lookahead1(11);                 // Tag | EndTag | PredefinedEntityRef | ElementContentChar | CharRef | EOF |\n    switch (l1)\n    {\n    case 25:                        // ElementContentChar\n      shift(25);                    // ElementContentChar\n      break;\n    case 9:                         // Tag\n      shift(9);                     // Tag\n      break;\n    case 10:                        // EndTag\n      shift(10);                    // EndTag\n      break;\n    case 58:                        // '<![CDATA['\n      shift(58);                    // '<![CDATA['\n      break;\n    case 57:                        // '<!--'\n      shift(57);                    // '<!--'\n      break;\n    case 21:                        // PredefinedEntityRef\n      shift(21);                    // PredefinedEntityRef\n      break;\n    case 31:                        // CharRef\n      shift(31);                    // CharRef\n      break;\n    case 275:                       // '{{'\n      shift(275);                   // '{{'\n      break;\n    case 278:                       // '}}'\n      shift(278);                   // '}}'\n      break;\n    case 274:                       // '{'\n      shift(274);                   // '{'\n      break;\n    default:\n      shift(35);                    // EOF\n    }\n    eventHandler.endNonterminal(\"TagContent\", e0);\n  };\n\n  this.parse_AposAttr = function()\n  {\n    eventHandler.startNonterminal(\"AposAttr\", e0);\n    lookahead1(10);                 // PredefinedEntityRef | EscapeApos | AposAttrContentChar | CharRef | EOF | \"'\" |\n    switch (l1)\n    {\n    case 23:                        // EscapeApos\n      shift(23);                    // EscapeApos\n      break;\n    case 27:                        // AposAttrContentChar\n      shift(27);                    // AposAttrContentChar\n      break;\n    case 21:                        // PredefinedEntityRef\n      shift(21);                    // PredefinedEntityRef\n      break;\n    case 31:                        // CharRef\n      shift(31);                    // CharRef\n      break;\n    case 275:                       // '{{'\n      shift(275);                   // '{{'\n      break;\n    case 278:                       // '}}'\n      shift(278);                   // '}}'\n      break;\n    case 274:                       // '{'\n      shift(274);                   // '{'\n      break;\n    case 41:                        // \"'\"\n      shift(41);                    // \"'\"\n      break;\n    default:\n      shift(35);                    // EOF\n    }\n    eventHandler.endNonterminal(\"AposAttr\", e0);\n  };\n\n  this.parse_QuotAttr = function()\n  {\n    eventHandler.startNonterminal(\"QuotAttr\", e0);\n    lookahead1(9);                  // PredefinedEntityRef | EscapeQuot | QuotAttrContentChar | CharRef | EOF | '\"' |\n    switch (l1)\n    {\n    case 22:                        // EscapeQuot\n      shift(22);                    // EscapeQuot\n      break;\n    case 26:                        // QuotAttrContentChar\n      shift(26);                    // QuotAttrContentChar\n      break;\n    case 21:                        // PredefinedEntityRef\n      shift(21);                    // PredefinedEntityRef\n      break;\n    case 31:                        // CharRef\n      shift(31);                    // CharRef\n      break;\n    case 275:                       // '{{'\n      shift(275);                   // '{{'\n      break;\n    case 278:                       // '}}'\n      shift(278);                   // '}}'\n      break;\n    case 274:                       // '{'\n      shift(274);                   // '{'\n      break;\n    case 37:                        // '\"'\n      shift(37);                    // '\"'\n      break;\n    default:\n      shift(35);                    // EOF\n    }\n    eventHandler.endNonterminal(\"QuotAttr\", e0);\n  };\n\n  this.parse_CData = function()\n  {\n    eventHandler.startNonterminal(\"CData\", e0);\n    lookahead1(1);                  // CDataSectionContents | EOF | ']]>'\n    switch (l1)\n    {\n    case 14:                        // CDataSectionContents\n      shift(14);                    // CDataSectionContents\n      break;\n    case 67:                        // ']]>'\n      shift(67);                    // ']]>'\n      break;\n    default:\n      shift(35);                    // EOF\n    }\n    eventHandler.endNonterminal(\"CData\", e0);\n  };\n\n  this.parse_XMLComment = function()\n  {\n    eventHandler.startNonterminal(\"XMLComment\", e0);\n    lookahead1(0);                  // DirCommentContents | EOF | '-->'\n    switch (l1)\n    {\n    case 12:                        // DirCommentContents\n      shift(12);                    // DirCommentContents\n      break;\n    case 50:                        // '-->'\n      shift(50);                    // '-->'\n      break;\n    default:\n      shift(35);                    // EOF\n    }\n    eventHandler.endNonterminal(\"XMLComment\", e0);\n  };\n\n  this.parse_PI = function()\n  {\n    eventHandler.startNonterminal(\"PI\", e0);\n    lookahead1(3);                  // DirPIContents | EOF | '?' | '?>'\n    switch (l1)\n    {\n    case 13:                        // DirPIContents\n      shift(13);                    // DirPIContents\n      break;\n    case 62:                        // '?'\n      shift(62);                    // '?'\n      break;\n    case 63:                        // '?>'\n      shift(63);                    // '?>'\n      break;\n    default:\n      shift(35);                    // EOF\n    }\n    eventHandler.endNonterminal(\"PI\", e0);\n  };\n\n  this.parse_Pragma = function()\n  {\n    eventHandler.startNonterminal(\"Pragma\", e0);\n    lookahead1(2);                  // PragmaContents | EOF | '#' | '#)'\n    switch (l1)\n    {\n    case 11:                        // PragmaContents\n      shift(11);                    // PragmaContents\n      break;\n    case 38:                        // '#'\n      shift(38);                    // '#'\n      break;\n    case 39:                        // '#)'\n      shift(39);                    // '#)'\n      break;\n    default:\n      shift(35);                    // EOF\n    }\n    eventHandler.endNonterminal(\"Pragma\", e0);\n  };\n\n  this.parse_Comment = function()\n  {\n    eventHandler.startNonterminal(\"Comment\", e0);\n    lookahead1(4);                  // CommentContents | EOF | '(:' | ':)'\n    switch (l1)\n    {\n    case 55:                        // ':)'\n      shift(55);                    // ':)'\n      break;\n    case 44:                        // '(:'\n      shift(44);                    // '(:'\n      break;\n    case 32:                        // CommentContents\n      shift(32);                    // CommentContents\n      break;\n    default:\n      shift(35);                    // EOF\n    }\n    eventHandler.endNonterminal(\"Comment\", e0);\n  };\n\n  this.parse_CommentDoc = function()\n  {\n    eventHandler.startNonterminal(\"CommentDoc\", e0);\n    lookahead1(6);                  // DocTag | DocCommentContents | EOF | '(:' | ':)'\n    switch (l1)\n    {\n    case 33:                        // DocTag\n      shift(33);                    // DocTag\n      break;\n    case 34:                        // DocCommentContents\n      shift(34);                    // DocCommentContents\n      break;\n    case 55:                        // ':)'\n      shift(55);                    // ':)'\n      break;\n    case 44:                        // '(:'\n      shift(44);                    // '(:'\n      break;\n    default:\n      shift(35);                    // EOF\n    }\n    eventHandler.endNonterminal(\"CommentDoc\", e0);\n  };\n\n  this.parse_QuotString = function()\n  {\n    eventHandler.startNonterminal(\"QuotString\", e0);\n    lookahead1(5);                  // JSONChar | JSONCharRef | JSONPredefinedCharRef | EOF | '\"'\n    switch (l1)\n    {\n    case 3:                         // JSONPredefinedCharRef\n      shift(3);                     // JSONPredefinedCharRef\n      break;\n    case 2:                         // JSONCharRef\n      shift(2);                     // JSONCharRef\n      break;\n    case 1:                         // JSONChar\n      shift(1);                     // JSONChar\n      break;\n    case 37:                        // '\"'\n      shift(37);                    // '\"'\n      break;\n    default:\n      shift(35);                    // EOF\n    }\n    eventHandler.endNonterminal(\"QuotString\", e0);\n  };\n\n  this.parse_AposString = function()\n  {\n    eventHandler.startNonterminal(\"AposString\", e0);\n    lookahead1(7);                  // PredefinedEntityRef | EscapeApos | AposChar | CharRef | EOF | \"'\"\n    switch (l1)\n    {\n    case 21:                        // PredefinedEntityRef\n      shift(21);                    // PredefinedEntityRef\n      break;\n    case 31:                        // CharRef\n      shift(31);                    // CharRef\n      break;\n    case 23:                        // EscapeApos\n      shift(23);                    // EscapeApos\n      break;\n    case 24:                        // AposChar\n      shift(24);                    // AposChar\n      break;\n    case 41:                        // \"'\"\n      shift(41);                    // \"'\"\n      break;\n    default:\n      shift(35);                    // EOF\n    }\n    eventHandler.endNonterminal(\"AposString\", e0);\n  };\n\n  this.parse_Prefix = function()\n  {\n    eventHandler.startNonterminal(\"Prefix\", e0);\n    lookahead1W(13);                // NCName^Token | S^WS | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' |\n    whitespace();\n    parse_NCName();\n    eventHandler.endNonterminal(\"Prefix\", e0);\n  };\n\n  this.parse__EQName = function()\n  {\n    eventHandler.startNonterminal(\"_EQName\", e0);\n    lookahead1W(12);                // EQName^Token | S^WS | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' |\n    whitespace();\n    parse_EQName();\n    eventHandler.endNonterminal(\"_EQName\", e0);\n  };\n\n  function parse_EQName()\n  {\n    eventHandler.startNonterminal(\"EQName\", e0);\n    switch (l1)\n    {\n    case 80:                        // 'attribute'\n      shift(80);                    // 'attribute'\n      break;\n    case 94:                        // 'comment'\n      shift(94);                    // 'comment'\n      break;\n    case 118:                       // 'document-node'\n      shift(118);                   // 'document-node'\n      break;\n    case 119:                       // 'element'\n      shift(119);                   // 'element'\n      break;\n    case 122:                       // 'empty-sequence'\n      shift(122);                   // 'empty-sequence'\n      break;\n    case 143:                       // 'function'\n      shift(143);                   // 'function'\n      break;\n    case 150:                       // 'if'\n      shift(150);                   // 'if'\n      break;\n    case 163:                       // 'item'\n      shift(163);                   // 'item'\n      break;\n    case 183:                       // 'namespace-node'\n      shift(183);                   // 'namespace-node'\n      break;\n    case 189:                       // 'node'\n      shift(189);                   // 'node'\n      break;\n    case 214:                       // 'processing-instruction'\n      shift(214);                   // 'processing-instruction'\n      break;\n    case 224:                       // 'schema-attribute'\n      shift(224);                   // 'schema-attribute'\n      break;\n    case 225:                       // 'schema-element'\n      shift(225);                   // 'schema-element'\n      break;\n    case 241:                       // 'switch'\n      shift(241);                   // 'switch'\n      break;\n    case 242:                       // 'text'\n      shift(242);                   // 'text'\n      break;\n    case 251:                       // 'typeswitch'\n      shift(251);                   // 'typeswitch'\n      break;\n    default:\n      parse_FunctionName();\n    }\n    eventHandler.endNonterminal(\"EQName\", e0);\n  }\n\n  function parse_FunctionName()\n  {\n    eventHandler.startNonterminal(\"FunctionName\", e0);\n    switch (l1)\n    {\n    case 17:                        // EQName^Token\n      shift(17);                    // EQName^Token\n      break;\n    case 68:                        // 'after'\n      shift(68);                    // 'after'\n      break;\n    case 71:                        // 'ancestor'\n      shift(71);                    // 'ancestor'\n      break;\n    case 72:                        // 'ancestor-or-self'\n      shift(72);                    // 'ancestor-or-self'\n      break;\n    case 73:                        // 'and'\n      shift(73);                    // 'and'\n      break;\n    case 77:                        // 'as'\n      shift(77);                    // 'as'\n      break;\n    case 78:                        // 'ascending'\n      shift(78);                    // 'ascending'\n      break;\n    case 82:                        // 'before'\n      shift(82);                    // 'before'\n      break;\n    case 86:                        // 'case'\n      shift(86);                    // 'case'\n      break;\n    case 87:                        // 'cast'\n      shift(87);                    // 'cast'\n      break;\n    case 88:                        // 'castable'\n      shift(88);                    // 'castable'\n      break;\n    case 91:                        // 'child'\n      shift(91);                    // 'child'\n      break;\n    case 92:                        // 'collation'\n      shift(92);                    // 'collation'\n      break;\n    case 101:                       // 'copy'\n      shift(101);                   // 'copy'\n      break;\n    case 103:                       // 'count'\n      shift(103);                   // 'count'\n      break;\n    case 106:                       // 'declare'\n      shift(106);                   // 'declare'\n      break;\n    case 107:                       // 'default'\n      shift(107);                   // 'default'\n      break;\n    case 108:                       // 'delete'\n      shift(108);                   // 'delete'\n      break;\n    case 109:                       // 'descendant'\n      shift(109);                   // 'descendant'\n      break;\n    case 110:                       // 'descendant-or-self'\n      shift(110);                   // 'descendant-or-self'\n      break;\n    case 111:                       // 'descending'\n      shift(111);                   // 'descending'\n      break;\n    case 116:                       // 'div'\n      shift(116);                   // 'div'\n      break;\n    case 117:                       // 'document'\n      shift(117);                   // 'document'\n      break;\n    case 120:                       // 'else'\n      shift(120);                   // 'else'\n      break;\n    case 121:                       // 'empty'\n      shift(121);                   // 'empty'\n      break;\n    case 124:                       // 'end'\n      shift(124);                   // 'end'\n      break;\n    case 126:                       // 'eq'\n      shift(126);                   // 'eq'\n      break;\n    case 127:                       // 'every'\n      shift(127);                   // 'every'\n      break;\n    case 129:                       // 'except'\n      shift(129);                   // 'except'\n      break;\n    case 132:                       // 'first'\n      shift(132);                   // 'first'\n      break;\n    case 133:                       // 'following'\n      shift(133);                   // 'following'\n      break;\n    case 134:                       // 'following-sibling'\n      shift(134);                   // 'following-sibling'\n      break;\n    case 135:                       // 'for'\n      shift(135);                   // 'for'\n      break;\n    case 144:                       // 'ge'\n      shift(144);                   // 'ge'\n      break;\n    case 146:                       // 'group'\n      shift(146);                   // 'group'\n      break;\n    case 148:                       // 'gt'\n      shift(148);                   // 'gt'\n      break;\n    case 149:                       // 'idiv'\n      shift(149);                   // 'idiv'\n      break;\n    case 151:                       // 'import'\n      shift(151);                   // 'import'\n      break;\n    case 157:                       // 'insert'\n      shift(157);                   // 'insert'\n      break;\n    case 158:                       // 'instance'\n      shift(158);                   // 'instance'\n      break;\n    case 160:                       // 'intersect'\n      shift(160);                   // 'intersect'\n      break;\n    case 161:                       // 'into'\n      shift(161);                   // 'into'\n      break;\n    case 162:                       // 'is'\n      shift(162);                   // 'is'\n      break;\n    case 168:                       // 'last'\n      shift(168);                   // 'last'\n      break;\n    case 170:                       // 'le'\n      shift(170);                   // 'le'\n      break;\n    case 172:                       // 'let'\n      shift(172);                   // 'let'\n      break;\n    case 176:                       // 'lt'\n      shift(176);                   // 'lt'\n      break;\n    case 178:                       // 'mod'\n      shift(178);                   // 'mod'\n      break;\n    case 179:                       // 'modify'\n      shift(179);                   // 'modify'\n      break;\n    case 180:                       // 'module'\n      shift(180);                   // 'module'\n      break;\n    case 182:                       // 'namespace'\n      shift(182);                   // 'namespace'\n      break;\n    case 184:                       // 'ne'\n      shift(184);                   // 'ne'\n      break;\n    case 196:                       // 'only'\n      shift(196);                   // 'only'\n      break;\n    case 198:                       // 'or'\n      shift(198);                   // 'or'\n      break;\n    case 199:                       // 'order'\n      shift(199);                   // 'order'\n      break;\n    case 200:                       // 'ordered'\n      shift(200);                   // 'ordered'\n      break;\n    case 204:                       // 'parent'\n      shift(204);                   // 'parent'\n      break;\n    case 210:                       // 'preceding'\n      shift(210);                   // 'preceding'\n      break;\n    case 211:                       // 'preceding-sibling'\n      shift(211);                   // 'preceding-sibling'\n      break;\n    case 216:                       // 'rename'\n      shift(216);                   // 'rename'\n      break;\n    case 217:                       // 'replace'\n      shift(217);                   // 'replace'\n      break;\n    case 218:                       // 'return'\n      shift(218);                   // 'return'\n      break;\n    case 222:                       // 'satisfies'\n      shift(222);                   // 'satisfies'\n      break;\n    case 227:                       // 'self'\n      shift(227);                   // 'self'\n      break;\n    case 233:                       // 'some'\n      shift(233);                   // 'some'\n      break;\n    case 234:                       // 'stable'\n      shift(234);                   // 'stable'\n      break;\n    case 235:                       // 'start'\n      shift(235);                   // 'start'\n      break;\n    case 246:                       // 'to'\n      shift(246);                   // 'to'\n      break;\n    case 247:                       // 'treat'\n      shift(247);                   // 'treat'\n      break;\n    case 248:                       // 'try'\n      shift(248);                   // 'try'\n      break;\n    case 252:                       // 'union'\n      shift(252);                   // 'union'\n      break;\n    case 254:                       // 'unordered'\n      shift(254);                   // 'unordered'\n      break;\n    case 258:                       // 'validate'\n      shift(258);                   // 'validate'\n      break;\n    case 264:                       // 'where'\n      shift(264);                   // 'where'\n      break;\n    case 268:                       // 'with'\n      shift(268);                   // 'with'\n      break;\n    case 272:                       // 'xquery'\n      shift(272);                   // 'xquery'\n      break;\n    case 70:                        // 'allowing'\n      shift(70);                    // 'allowing'\n      break;\n    case 79:                        // 'at'\n      shift(79);                    // 'at'\n      break;\n    case 81:                        // 'base-uri'\n      shift(81);                    // 'base-uri'\n      break;\n    case 83:                        // 'boundary-space'\n      shift(83);                    // 'boundary-space'\n      break;\n    case 84:                        // 'break'\n      shift(84);                    // 'break'\n      break;\n    case 89:                        // 'catch'\n      shift(89);                    // 'catch'\n      break;\n    case 96:                        // 'construction'\n      shift(96);                    // 'construction'\n      break;\n    case 99:                        // 'context'\n      shift(99);                    // 'context'\n      break;\n    case 100:                       // 'continue'\n      shift(100);                   // 'continue'\n      break;\n    case 102:                       // 'copy-namespaces'\n      shift(102);                   // 'copy-namespaces'\n      break;\n    case 104:                       // 'decimal-format'\n      shift(104);                   // 'decimal-format'\n      break;\n    case 123:                       // 'encoding'\n      shift(123);                   // 'encoding'\n      break;\n    case 130:                       // 'exit'\n      shift(130);                   // 'exit'\n      break;\n    case 131:                       // 'external'\n      shift(131);                   // 'external'\n      break;\n    case 139:                       // 'ft-option'\n      shift(139);                   // 'ft-option'\n      break;\n    case 152:                       // 'in'\n      shift(152);                   // 'in'\n      break;\n    case 153:                       // 'index'\n      shift(153);                   // 'index'\n      break;\n    case 159:                       // 'integrity'\n      shift(159);                   // 'integrity'\n      break;\n    case 169:                       // 'lax'\n      shift(169);                   // 'lax'\n      break;\n    case 190:                       // 'nodes'\n      shift(190);                   // 'nodes'\n      break;\n    case 197:                       // 'option'\n      shift(197);                   // 'option'\n      break;\n    case 201:                       // 'ordering'\n      shift(201);                   // 'ordering'\n      break;\n    case 220:                       // 'revalidation'\n      shift(220);                   // 'revalidation'\n      break;\n    case 223:                       // 'schema'\n      shift(223);                   // 'schema'\n      break;\n    case 226:                       // 'score'\n      shift(226);                   // 'score'\n      break;\n    case 232:                       // 'sliding'\n      shift(232);                   // 'sliding'\n      break;\n    case 238:                       // 'strict'\n      shift(238);                   // 'strict'\n      break;\n    case 249:                       // 'tumbling'\n      shift(249);                   // 'tumbling'\n      break;\n    case 250:                       // 'type'\n      shift(250);                   // 'type'\n      break;\n    case 255:                       // 'updating'\n      shift(255);                   // 'updating'\n      break;\n    case 259:                       // 'value'\n      shift(259);                   // 'value'\n      break;\n    case 260:                       // 'variable'\n      shift(260);                   // 'variable'\n      break;\n    case 261:                       // 'version'\n      shift(261);                   // 'version'\n      break;\n    case 265:                       // 'while'\n      shift(265);                   // 'while'\n      break;\n    case 95:                        // 'constraint'\n      shift(95);                    // 'constraint'\n      break;\n    case 174:                       // 'loop'\n      shift(174);                   // 'loop'\n      break;\n    default:\n      shift(219);                   // 'returning'\n    }\n    eventHandler.endNonterminal(\"FunctionName\", e0);\n  }\n\n  function parse_NCName()\n  {\n    eventHandler.startNonterminal(\"NCName\", e0);\n    switch (l1)\n    {\n    case 28:                        // NCName^Token\n      shift(28);                    // NCName^Token\n      break;\n    case 68:                        // 'after'\n      shift(68);                    // 'after'\n      break;\n    case 73:                        // 'and'\n      shift(73);                    // 'and'\n      break;\n    case 77:                        // 'as'\n      shift(77);                    // 'as'\n      break;\n    case 78:                        // 'ascending'\n      shift(78);                    // 'ascending'\n      break;\n    case 82:                        // 'before'\n      shift(82);                    // 'before'\n      break;\n    case 86:                        // 'case'\n      shift(86);                    // 'case'\n      break;\n    case 87:                        // 'cast'\n      shift(87);                    // 'cast'\n      break;\n    case 88:                        // 'castable'\n      shift(88);                    // 'castable'\n      break;\n    case 92:                        // 'collation'\n      shift(92);                    // 'collation'\n      break;\n    case 103:                       // 'count'\n      shift(103);                   // 'count'\n      break;\n    case 107:                       // 'default'\n      shift(107);                   // 'default'\n      break;\n    case 111:                       // 'descending'\n      shift(111);                   // 'descending'\n      break;\n    case 116:                       // 'div'\n      shift(116);                   // 'div'\n      break;\n    case 120:                       // 'else'\n      shift(120);                   // 'else'\n      break;\n    case 121:                       // 'empty'\n      shift(121);                   // 'empty'\n      break;\n    case 124:                       // 'end'\n      shift(124);                   // 'end'\n      break;\n    case 126:                       // 'eq'\n      shift(126);                   // 'eq'\n      break;\n    case 129:                       // 'except'\n      shift(129);                   // 'except'\n      break;\n    case 135:                       // 'for'\n      shift(135);                   // 'for'\n      break;\n    case 144:                       // 'ge'\n      shift(144);                   // 'ge'\n      break;\n    case 146:                       // 'group'\n      shift(146);                   // 'group'\n      break;\n    case 148:                       // 'gt'\n      shift(148);                   // 'gt'\n      break;\n    case 149:                       // 'idiv'\n      shift(149);                   // 'idiv'\n      break;\n    case 158:                       // 'instance'\n      shift(158);                   // 'instance'\n      break;\n    case 160:                       // 'intersect'\n      shift(160);                   // 'intersect'\n      break;\n    case 161:                       // 'into'\n      shift(161);                   // 'into'\n      break;\n    case 162:                       // 'is'\n      shift(162);                   // 'is'\n      break;\n    case 170:                       // 'le'\n      shift(170);                   // 'le'\n      break;\n    case 172:                       // 'let'\n      shift(172);                   // 'let'\n      break;\n    case 176:                       // 'lt'\n      shift(176);                   // 'lt'\n      break;\n    case 178:                       // 'mod'\n      shift(178);                   // 'mod'\n      break;\n    case 179:                       // 'modify'\n      shift(179);                   // 'modify'\n      break;\n    case 184:                       // 'ne'\n      shift(184);                   // 'ne'\n      break;\n    case 196:                       // 'only'\n      shift(196);                   // 'only'\n      break;\n    case 198:                       // 'or'\n      shift(198);                   // 'or'\n      break;\n    case 199:                       // 'order'\n      shift(199);                   // 'order'\n      break;\n    case 218:                       // 'return'\n      shift(218);                   // 'return'\n      break;\n    case 222:                       // 'satisfies'\n      shift(222);                   // 'satisfies'\n      break;\n    case 234:                       // 'stable'\n      shift(234);                   // 'stable'\n      break;\n    case 235:                       // 'start'\n      shift(235);                   // 'start'\n      break;\n    case 246:                       // 'to'\n      shift(246);                   // 'to'\n      break;\n    case 247:                       // 'treat'\n      shift(247);                   // 'treat'\n      break;\n    case 252:                       // 'union'\n      shift(252);                   // 'union'\n      break;\n    case 264:                       // 'where'\n      shift(264);                   // 'where'\n      break;\n    case 268:                       // 'with'\n      shift(268);                   // 'with'\n      break;\n    case 71:                        // 'ancestor'\n      shift(71);                    // 'ancestor'\n      break;\n    case 72:                        // 'ancestor-or-self'\n      shift(72);                    // 'ancestor-or-self'\n      break;\n    case 80:                        // 'attribute'\n      shift(80);                    // 'attribute'\n      break;\n    case 91:                        // 'child'\n      shift(91);                    // 'child'\n      break;\n    case 94:                        // 'comment'\n      shift(94);                    // 'comment'\n      break;\n    case 101:                       // 'copy'\n      shift(101);                   // 'copy'\n      break;\n    case 106:                       // 'declare'\n      shift(106);                   // 'declare'\n      break;\n    case 108:                       // 'delete'\n      shift(108);                   // 'delete'\n      break;\n    case 109:                       // 'descendant'\n      shift(109);                   // 'descendant'\n      break;\n    case 110:                       // 'descendant-or-self'\n      shift(110);                   // 'descendant-or-self'\n      break;\n    case 117:                       // 'document'\n      shift(117);                   // 'document'\n      break;\n    case 118:                       // 'document-node'\n      shift(118);                   // 'document-node'\n      break;\n    case 119:                       // 'element'\n      shift(119);                   // 'element'\n      break;\n    case 122:                       // 'empty-sequence'\n      shift(122);                   // 'empty-sequence'\n      break;\n    case 127:                       // 'every'\n      shift(127);                   // 'every'\n      break;\n    case 132:                       // 'first'\n      shift(132);                   // 'first'\n      break;\n    case 133:                       // 'following'\n      shift(133);                   // 'following'\n      break;\n    case 134:                       // 'following-sibling'\n      shift(134);                   // 'following-sibling'\n      break;\n    case 143:                       // 'function'\n      shift(143);                   // 'function'\n      break;\n    case 150:                       // 'if'\n      shift(150);                   // 'if'\n      break;\n    case 151:                       // 'import'\n      shift(151);                   // 'import'\n      break;\n    case 157:                       // 'insert'\n      shift(157);                   // 'insert'\n      break;\n    case 163:                       // 'item'\n      shift(163);                   // 'item'\n      break;\n    case 168:                       // 'last'\n      shift(168);                   // 'last'\n      break;\n    case 180:                       // 'module'\n      shift(180);                   // 'module'\n      break;\n    case 182:                       // 'namespace'\n      shift(182);                   // 'namespace'\n      break;\n    case 183:                       // 'namespace-node'\n      shift(183);                   // 'namespace-node'\n      break;\n    case 189:                       // 'node'\n      shift(189);                   // 'node'\n      break;\n    case 200:                       // 'ordered'\n      shift(200);                   // 'ordered'\n      break;\n    case 204:                       // 'parent'\n      shift(204);                   // 'parent'\n      break;\n    case 210:                       // 'preceding'\n      shift(210);                   // 'preceding'\n      break;\n    case 211:                       // 'preceding-sibling'\n      shift(211);                   // 'preceding-sibling'\n      break;\n    case 214:                       // 'processing-instruction'\n      shift(214);                   // 'processing-instruction'\n      break;\n    case 216:                       // 'rename'\n      shift(216);                   // 'rename'\n      break;\n    case 217:                       // 'replace'\n      shift(217);                   // 'replace'\n      break;\n    case 224:                       // 'schema-attribute'\n      shift(224);                   // 'schema-attribute'\n      break;\n    case 225:                       // 'schema-element'\n      shift(225);                   // 'schema-element'\n      break;\n    case 227:                       // 'self'\n      shift(227);                   // 'self'\n      break;\n    case 233:                       // 'some'\n      shift(233);                   // 'some'\n      break;\n    case 241:                       // 'switch'\n      shift(241);                   // 'switch'\n      break;\n    case 242:                       // 'text'\n      shift(242);                   // 'text'\n      break;\n    case 248:                       // 'try'\n      shift(248);                   // 'try'\n      break;\n    case 251:                       // 'typeswitch'\n      shift(251);                   // 'typeswitch'\n      break;\n    case 254:                       // 'unordered'\n      shift(254);                   // 'unordered'\n      break;\n    case 258:                       // 'validate'\n      shift(258);                   // 'validate'\n      break;\n    case 260:                       // 'variable'\n      shift(260);                   // 'variable'\n      break;\n    case 272:                       // 'xquery'\n      shift(272);                   // 'xquery'\n      break;\n    case 70:                        // 'allowing'\n      shift(70);                    // 'allowing'\n      break;\n    case 79:                        // 'at'\n      shift(79);                    // 'at'\n      break;\n    case 81:                        // 'base-uri'\n      shift(81);                    // 'base-uri'\n      break;\n    case 83:                        // 'boundary-space'\n      shift(83);                    // 'boundary-space'\n      break;\n    case 84:                        // 'break'\n      shift(84);                    // 'break'\n      break;\n    case 89:                        // 'catch'\n      shift(89);                    // 'catch'\n      break;\n    case 96:                        // 'construction'\n      shift(96);                    // 'construction'\n      break;\n    case 99:                        // 'context'\n      shift(99);                    // 'context'\n      break;\n    case 100:                       // 'continue'\n      shift(100);                   // 'continue'\n      break;\n    case 102:                       // 'copy-namespaces'\n      shift(102);                   // 'copy-namespaces'\n      break;\n    case 104:                       // 'decimal-format'\n      shift(104);                   // 'decimal-format'\n      break;\n    case 123:                       // 'encoding'\n      shift(123);                   // 'encoding'\n      break;\n    case 130:                       // 'exit'\n      shift(130);                   // 'exit'\n      break;\n    case 131:                       // 'external'\n      shift(131);                   // 'external'\n      break;\n    case 139:                       // 'ft-option'\n      shift(139);                   // 'ft-option'\n      break;\n    case 152:                       // 'in'\n      shift(152);                   // 'in'\n      break;\n    case 153:                       // 'index'\n      shift(153);                   // 'index'\n      break;\n    case 159:                       // 'integrity'\n      shift(159);                   // 'integrity'\n      break;\n    case 169:                       // 'lax'\n      shift(169);                   // 'lax'\n      break;\n    case 190:                       // 'nodes'\n      shift(190);                   // 'nodes'\n      break;\n    case 197:                       // 'option'\n      shift(197);                   // 'option'\n      break;\n    case 201:                       // 'ordering'\n      shift(201);                   // 'ordering'\n      break;\n    case 220:                       // 'revalidation'\n      shift(220);                   // 'revalidation'\n      break;\n    case 223:                       // 'schema'\n      shift(223);                   // 'schema'\n      break;\n    case 226:                       // 'score'\n      shift(226);                   // 'score'\n      break;\n    case 232:                       // 'sliding'\n      shift(232);                   // 'sliding'\n      break;\n    case 238:                       // 'strict'\n      shift(238);                   // 'strict'\n      break;\n    case 249:                       // 'tumbling'\n      shift(249);                   // 'tumbling'\n      break;\n    case 250:                       // 'type'\n      shift(250);                   // 'type'\n      break;\n    case 255:                       // 'updating'\n      shift(255);                   // 'updating'\n      break;\n    case 259:                       // 'value'\n      shift(259);                   // 'value'\n      break;\n    case 261:                       // 'version'\n      shift(261);                   // 'version'\n      break;\n    case 265:                       // 'while'\n      shift(265);                   // 'while'\n      break;\n    case 95:                        // 'constraint'\n      shift(95);                    // 'constraint'\n      break;\n    case 174:                       // 'loop'\n      shift(174);                   // 'loop'\n      break;\n    default:\n      shift(219);                   // 'returning'\n    }\n    eventHandler.endNonterminal(\"NCName\", e0);\n  }\n\n  function shift(t)\n  {\n    if (l1 == t)\n    {\n      whitespace();\n      eventHandler.terminal(JSONiqTokenizer.TOKEN[l1], b1, e1 > size ? size : e1);\n      b0 = b1; e0 = e1; l1 = 0;\n    }\n    else\n    {\n      error(b1, e1, 0, l1, t);\n    }\n  }\n\n  function whitespace()\n  {\n    if (e0 != b1)\n    {\n      b0 = e0;\n      e0 = b1;\n      eventHandler.whitespace(b0, e0);\n    }\n  }\n\n  function matchW(set)\n  {\n    var code;\n    for (;;)\n    {\n      code = match(set);\n      if (code != 30)               // S^WS\n      {\n        break;\n      }\n    }\n    return code;\n  }\n\n  function lookahead1W(set)\n  {\n    if (l1 == 0)\n    {\n      l1 = matchW(set);\n      b1 = begin;\n      e1 = end;\n    }\n  }\n\n  function lookahead1(set)\n  {\n    if (l1 == 0)\n    {\n      l1 = match(set);\n      b1 = begin;\n      e1 = end;\n    }\n  }\n\n  function error(b, e, s, l, t)\n  {\n    throw new self.ParseException(b, e, s, l, t);\n  }\n\n  var lk, b0, e0;\n  var l1, b1, e1;\n  var eventHandler;\n\n  var input;\n  var size;\n  var begin;\n  var end;\n\n  function match(tokenSetId)\n  {\n    var nonbmp = false;\n    begin = end;\n    var current = end;\n    var result = JSONiqTokenizer.INITIAL[tokenSetId];\n    var state = 0;\n\n    for (var code = result & 4095; code != 0; )\n    {\n      var charclass;\n      var c0 = current < size ? input.charCodeAt(current) : 0;\n      ++current;\n      if (c0 < 0x80)\n      {\n        charclass = JSONiqTokenizer.MAP0[c0];\n      }\n      else if (c0 < 0xd800)\n      {\n        var c1 = c0 >> 4;\n        charclass = JSONiqTokenizer.MAP1[(c0 & 15) + JSONiqTokenizer.MAP1[(c1 & 31) + JSONiqTokenizer.MAP1[c1 >> 5]]];\n      }\n      else\n      {\n        if (c0 < 0xdc00)\n        {\n          var c1 = current < size ? input.charCodeAt(current) : 0;\n          if (c1 >= 0xdc00 && c1 < 0xe000)\n          {\n            ++current;\n            c0 = ((c0 & 0x3ff) << 10) + (c1 & 0x3ff) + 0x10000;\n            nonbmp = true;\n          }\n        }\n        var lo = 0, hi = 5;\n        for (var m = 3; ; m = (hi + lo) >> 1)\n        {\n          if (JSONiqTokenizer.MAP2[m] > c0) hi = m - 1;\n          else if (JSONiqTokenizer.MAP2[6 + m] < c0) lo = m + 1;\n          else {charclass = JSONiqTokenizer.MAP2[12 + m]; break;}\n          if (lo > hi) {charclass = 0; break;}\n        }\n      }\n\n      state = code;\n      var i0 = (charclass << 12) + code - 1;\n      code = JSONiqTokenizer.TRANSITION[(i0 & 15) + JSONiqTokenizer.TRANSITION[i0 >> 4]];\n\n      if (code > 4095)\n      {\n        result = code;\n        code &= 4095;\n        end = current;\n      }\n    }\n\n    result >>= 12;\n    if (result == 0)\n    {\n      end = current - 1;\n      var c1 = end < size ? input.charCodeAt(end) : 0;\n      if (c1 >= 0xdc00 && c1 < 0xe000) --end;\n      return error(begin, end, state, -1, -1);\n    }\n\n    if (nonbmp)\n    {\n      for (var i = result >> 9; i > 0; --i)\n      {\n        --end;\n        var c1 = end < size ? input.charCodeAt(end) : 0;\n        if (c1 >= 0xdc00 && c1 < 0xe000) --end;\n      }\n    }\n    else\n    {\n      end -= result >> 9;\n    }\n\n    return (result & 511) - 1;\n  }\n}\n\nJSONiqTokenizer.getTokenSet = function(tokenSetId)\n{\n  var set = [];\n  var s = tokenSetId < 0 ? - tokenSetId : INITIAL[tokenSetId] & 4095;\n  for (var i = 0; i < 279; i += 32)\n  {\n    var j = i;\n    var i0 = (i >> 5) * 2066 + s - 1;\n    var i1 = i0 >> 2;\n    var i2 = i1 >> 2;\n    var f = JSONiqTokenizer.EXPECTED[(i0 & 3) + JSONiqTokenizer.EXPECTED[(i1 & 3) + JSONiqTokenizer.EXPECTED[(i2 & 3) + JSONiqTokenizer.EXPECTED[i2 >> 2]]]];\n    for ( ; f != 0; f >>>= 1, ++j)\n    {\n      if ((f & 1) != 0)\n      {\n        set.push(JSONiqTokenizer.TOKEN[j]);\n      }\n    }\n  }\n  return set;\n};\n\nJSONiqTokenizer.MAP0 =\n[ 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 27, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 31, 31, 33, 31, 31, 31, 31, 31, 31, 34, 35, 36, 37, 31, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 31, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 31, 62, 63, 64, 65, 37\n];\n\nJSONiqTokenizer.MAP1 =\n[ 108, 124, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 156, 181, 181, 181, 181, 181, 214, 215, 213, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 247, 261, 277, 293, 309, 347, 363, 379, 416, 416, 416, 408, 331, 323, 331, 323, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 433, 433, 433, 433, 433, 433, 433, 316, 331, 331, 331, 331, 331, 331, 331, 331, 394, 416, 416, 417, 415, 416, 416, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 330, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 416, 67, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 27, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 37, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 31, 31, 33, 31, 31, 31, 31, 31, 31, 34, 35, 36, 37, 31, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 31, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 31, 62, 63, 64, 65, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 31, 31, 37, 37, 37, 37, 37, 37, 37, 66, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66\n];\n\nJSONiqTokenizer.MAP2 =\n[ 57344, 63744, 64976, 65008, 65536, 983040, 63743, 64975, 65007, 65533, 983039, 1114111, 37, 31, 37, 31, 31, 37\n];\n\nJSONiqTokenizer.INITIAL =\n[ 1, 2, 49155, 57348, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15\n];\n\nJSONiqTokenizer.TRANSITION =\n[ 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 17408, 19288, 17439, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 22126, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17672, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 19469, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 36919, 18234, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18419, 18432, 18304, 18448, 18485, 18523, 18553, 18583, 18599, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 18825, 18841, 18871, 18906, 18944, 18960, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19074, 36169, 17439, 36866, 17466, 36890, 36866, 22314, 19105, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 22126, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17672, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 19469, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 36919, 18234, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18419, 18432, 18304, 18448, 18485, 18523, 18553, 18583, 18599, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 18825, 18841, 18871, 18906, 18944, 18960, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22182, 19288, 19121, 36866, 17466, 18345, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19273, 19552, 19304, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19332, 17423, 19363, 36866, 17466, 17537, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 18614, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 19391, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 19427, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36154, 19288, 19457, 36866, 17466, 17740, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22780, 19288, 19457, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22375, 22197, 18469, 36866, 17466, 36890, 36866, 21991, 24018, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 21331, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 19485, 19501, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19537, 22390, 19568, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19596, 19611, 19457, 36866, 17466, 36890, 36866, 18246, 19627, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22242, 20553, 19457, 36866, 17466, 36890, 36866, 18648, 30477, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36472, 19288, 19457, 36866, 17466, 17809, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 21770, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 19643, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 19672, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 20538, 19288, 19457, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 17975, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22345, 19288, 19457, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19726, 19742, 21529, 24035, 23112, 26225, 23511, 27749, 27397, 24035, 34360, 24035, 24036, 23114, 35166, 23114, 23114, 19758, 23511, 35247, 23511, 23511, 28447, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 24254, 19821, 23511, 23511, 23511, 23511, 23512, 19441, 36539, 24035, 24035, 24035, 24035, 19846, 19869, 23114, 23114, 23114, 28618, 32187, 19892, 23511, 23511, 23511, 34585, 20402, 36647, 24035, 24035, 24036, 23114, 33757, 23114, 23114, 23029, 20271, 23511, 27070, 23511, 23511, 30562, 24035, 24035, 29274, 26576, 23114, 23114, 31118, 23036, 29695, 23511, 23511, 32431, 23634, 30821, 24035, 23110, 19913, 23114, 23467, 31261, 23261, 34299, 19932, 24035, 32609, 19965, 35389, 19984, 27689, 19830, 29391, 29337, 20041, 22643, 35619, 33728, 20062, 20121, 20166, 35100, 26145, 20211, 23008, 19876, 20208, 20227, 25670, 20132, 26578, 27685, 20141, 20243, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36094, 19288, 19457, 36866, 17466, 21724, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22735, 19552, 20287, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22750, 19288, 21529, 24035, 23112, 28056, 23511, 29483, 28756, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 20327, 23511, 23511, 23511, 23511, 31156, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 24254, 20371, 23511, 23511, 23511, 23511, 27443, 20395, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 29457, 29700, 23511, 23511, 23511, 23511, 33444, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 28350, 20421, 23511, 23511, 23511, 23511, 25645, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 20447, 20475, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 20499, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 20523, 22257, 20569, 20783, 21715, 17603, 20699, 20837, 20614, 20630, 21149, 20670, 21405, 17486, 17509, 17525, 18373, 19179, 20695, 20716, 20732, 20755, 19194, 18042, 21641, 20592, 20779, 20598, 21412, 17470, 17591, 20896, 17468, 17619, 20799, 20700, 21031, 20744, 20699, 20828, 18075, 21259, 20581, 20853, 18048, 20868, 20884, 17756, 17784, 17800, 17825, 17854, 21171, 21200, 20931, 20947, 21378, 20955, 20971, 18086, 20645, 21002, 20986, 18178, 17960, 18012, 18381, 18064, 29176, 21044, 21438, 21018, 21122, 21393, 21060, 21844, 21094, 20654, 17493, 18150, 18166, 18214, 25967, 20763, 21799, 21110, 21830, 21138, 21246, 21301, 18336, 18361, 21165, 21187, 20812, 21216, 21232, 21287, 21317, 18553, 21347, 21363, 21428, 21454, 21271, 21483, 21499, 21515, 21575, 21467, 18712, 21591, 21633, 21078, 18189, 18198, 20679, 21657, 21701, 21074, 21687, 21740, 21756, 21786, 21815, 21860, 21876, 21892, 21946, 21962, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36457, 19288, 19457, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 36813, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 21981, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 22151, 22007, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 27898, 17884, 18890, 17906, 17928, 22042, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 22070, 22112, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 22142, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36109, 19288, 18469, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22167, 19288, 19457, 36866, 17466, 17768, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22227, 36487, 22273, 36866, 17466, 36890, 36866, 19316, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18749, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 22304, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 19580, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22330, 19089, 19457, 36866, 17466, 18721, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22765, 19347, 19457, 36866, 17466, 36890, 36866, 18114, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36079, 19288, 21605, 24035, 23112, 32618, 23511, 29483, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 29116, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 22468, 23511, 23511, 23511, 23511, 27443, 22493, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 28618, 29700, 23511, 23511, 23511, 23511, 34541, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 22839, 23511, 23511, 23511, 23511, 25645, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 32683, 22516, 23511, 23511, 23511, 22540, 24035, 24035, 23110, 23114, 23114, 20499, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36079, 19288, 21605, 24035, 23112, 32618, 23511, 29483, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 29116, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 22468, 23511, 23511, 23511, 23511, 27443, 22493, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 28618, 29700, 23511, 23511, 23511, 23511, 34564, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 22839, 23511, 23511, 23511, 23511, 25645, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 32683, 22516, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 20499, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36079, 19288, 21605, 24035, 23112, 32618, 23511, 29483, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 29908, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 22468, 23511, 23511, 23511, 23511, 27443, 22493, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 28618, 29700, 23511, 23511, 23511, 23511, 34564, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 22839, 23511, 23511, 23511, 23511, 25645, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 32683, 22516, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 20499, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36079, 19288, 21605, 24035, 23112, 32618, 23511, 29483, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 29116, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 22468, 23511, 23511, 23511, 23511, 27443, 22561, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 28618, 29700, 23511, 23511, 23511, 23511, 34564, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 22839, 23511, 23511, 23511, 23511, 25645, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 32683, 22516, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 20499, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36079, 19288, 21605, 24035, 23112, 23837, 23511, 29483, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22584, 23511, 23511, 23511, 23511, 29116, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 22468, 23511, 23511, 23511, 23511, 27443, 22493, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 28618, 29700, 23511, 23511, 23511, 23511, 34564, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 22839, 23511, 23511, 23511, 23511, 25645, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 32683, 22516, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 20499, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36079, 19288, 21605, 24035, 23112, 32618, 23511, 31507, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 28306, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 22468, 23511, 23511, 23511, 23511, 23512, 24694, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 28618, 29700, 23511, 23511, 23511, 23511, 34585, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 20271, 23511, 23511, 23511, 23511, 30562, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36442, 19288, 21605, 24035, 23112, 28137, 23511, 31507, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 28306, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 22468, 23511, 23511, 23511, 23511, 23512, 24694, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 28618, 29700, 23511, 23511, 23511, 23511, 34585, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 20271, 23511, 23511, 23511, 23511, 30562, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36079, 19288, 21605, 24035, 23112, 32618, 23511, 31507, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 28306, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 22468, 23511, 23511, 23511, 23511, 23512, 24694, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 28618, 29700, 23511, 23511, 23511, 23511, 34585, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 20271, 23511, 23511, 23511, 23511, 31568, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22690, 19288, 19457, 36866, 17466, 36890, 36866, 21991, 27584, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 22659, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22360, 19552, 19457, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22675, 22811, 19457, 36866, 17466, 36890, 36866, 19133, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 22827, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36139, 19288, 19457, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36064, 19288, 22865, 22881, 32031, 22897, 22913, 22956, 29939, 24035, 24035, 24035, 23003, 23114, 23114, 23114, 23024, 22420, 23511, 23511, 23511, 23052, 29116, 23073, 29268, 24035, 25563, 26915, 23106, 23131, 23114, 23114, 23159, 23181, 23197, 23248, 23511, 23511, 23282, 23305, 22493, 32364, 24035, 33472, 30138, 26325, 31770, 33508, 27345, 33667, 23114, 23321, 23473, 23351, 35793, 36576, 23511, 23375, 22500, 24145, 24035, 29197, 20192, 24533, 23440, 23114, 19017, 23459, 22839, 23489, 23510, 23511, 33563, 23528, 32076, 25389, 24035, 26576, 23561, 23583, 23114, 32683, 22516, 23622, 23655, 23511, 23634, 35456, 37144, 23110, 23683, 34153, 20499, 32513, 25824, 23705, 24035, 24035, 23111, 23114, 19874, 27078, 33263, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 20507, 32241, 20150, 31862, 27464, 35108, 23727, 23007, 35895, 34953, 26578, 27685, 20141, 24569, 31691, 19787, 33967, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36427, 19552, 21605, 24035, 23112, 32618, 23511, 29483, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 29116, 19803, 24035, 24035, 24035, 27027, 26576, 23114, 23114, 23114, 31471, 23756, 22468, 23511, 23511, 23511, 34687, 23772, 22493, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 28618, 29700, 23511, 23511, 23511, 23511, 34564, 23788, 24035, 24035, 24035, 21559, 23828, 23114, 23114, 23114, 25086, 22839, 23853, 23511, 23511, 23511, 23876, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 32683, 22516, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 20499, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 31761, 23909, 23953, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36049, 19288, 21605, 30825, 23112, 23987, 23511, 24003, 31001, 27617, 24034, 24035, 24036, 24052, 24089, 23114, 23114, 22420, 24109, 24168, 23511, 23511, 29116, 24188, 27609, 20017, 29516, 24035, 26576, 24222, 19968, 23114, 24252, 33811, 22468, 24270, 33587, 23511, 24320, 27443, 22493, 24035, 24035, 24035, 24035, 24339, 23113, 23114, 23114, 23114, 28128, 28618, 29700, 23511, 23511, 23511, 28276, 34564, 20402, 24035, 24035, 32929, 24036, 23114, 23114, 23114, 24357, 23029, 22839, 23511, 23511, 23511, 24377, 25645, 24035, 34112, 24035, 26576, 23114, 26643, 23114, 32683, 22516, 23511, 25638, 23511, 23711, 24035, 24395, 27809, 23114, 24414, 20499, 24432, 30917, 23628, 24035, 30680, 23111, 23114, 30233, 27078, 25748, 24452, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 24475, 19829, 26577, 26597, 26154, 24519, 24556, 24596, 23007, 20046, 20132, 26578, 24634, 20141, 24569, 31691, 24679, 24727, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36412, 19288, 21605, 19943, 34861, 32618, 26027, 29483, 32016, 32050, 36233, 24776, 35574, 24801, 24819, 32671, 31289, 22420, 24868, 24886, 20087, 26849, 29116, 19803, 24035, 24035, 24035, 36228, 26576, 23114, 23114, 23114, 24981, 33811, 22468, 23511, 23511, 23511, 29028, 27443, 22493, 24923, 27965, 24035, 24035, 32797, 24946, 23443, 23114, 23114, 29636, 24997, 22849, 28252, 23511, 23511, 23511, 25042, 25110, 24035, 24035, 34085, 24036, 25133, 23114, 23114, 25152, 23029, 22839, 25169, 23511, 36764, 23511, 25645, 30403, 24035, 25186, 26576, 31806, 24093, 25212, 32683, 22516, 32713, 26245, 34293, 23634, 24035, 24035, 23110, 23114, 23114, 20499, 23511, 23261, 23628, 24035, 32406, 23111, 23114, 28676, 30944, 27689, 25234, 24035, 23112, 19872, 37063, 23266, 24036, 23114, 30243, 20379, 26100, 29218, 20211, 30105, 25257, 25284, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 24834, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36034, 19288, 21671, 25314, 25072, 25330, 25346, 25362, 29939, 29951, 35288, 29984, 23812, 27216, 25405, 25424, 30456, 22584, 26292, 25461, 25480, 31592, 29116, 25516, 34963, 25545, 27007, 25579, 33937, 25614, 25661, 25686, 34872, 25702, 25718, 25734, 25769, 25795, 25811, 25840, 22493, 26533, 25856, 24035, 25876, 30763, 27481, 25909, 23114, 28987, 25936, 25954, 29700, 25983, 23511, 31412, 26043, 26063, 22568, 29241, 29592, 26116, 31216, 35383, 26170, 34783, 26194, 26221, 22839, 26241, 26261, 22477, 26283, 26308, 27306, 31035, 24655, 26576, 29854, 33386, 26341, 32683, 22516, 32153, 30926, 26361, 19996, 26381, 35463, 26397, 26424, 34646, 26478, 35605, 31386, 26494, 35567, 31964, 22940, 23689, 25218, 30309, 32289, 19830, 33605, 23112, 32109, 27733, 27084, 24496, 35886, 35221, 26525, 36602, 26549, 26558, 26574, 26594, 26613, 26629, 26666, 26700, 26578, 27685, 23740, 24285, 31691, 26733, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36397, 19552, 18991, 25887, 28117, 32618, 26776, 29483, 29939, 26802, 24035, 24035, 24036, 28664, 23114, 23114, 23114, 22420, 30297, 23511, 23511, 23511, 29116, 19803, 24035, 24035, 24035, 25559, 26576, 23114, 23114, 23114, 30525, 33811, 22468, 23511, 23511, 23511, 28725, 27443, 22493, 24035, 24035, 27249, 24035, 24035, 23113, 23114, 23114, 26827, 23114, 28618, 29700, 23511, 23511, 26845, 23511, 34564, 20402, 24035, 24035, 26979, 24036, 23114, 23114, 23114, 24974, 23029, 22839, 23511, 23511, 23511, 26865, 25645, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 32683, 22516, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 20499, 23511, 23261, 23628, 33305, 24035, 25598, 23114, 19874, 34253, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 26886, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 26931, 24569, 26439, 26947, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36019, 19288, 26995, 24035, 23112, 32618, 23511, 31507, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 28306, 27043, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 27061, 23511, 23511, 23511, 23511, 23512, 24694, 24035, 24035, 29978, 24035, 24035, 23113, 23114, 33114, 23114, 23114, 30010, 29700, 23511, 35913, 23511, 23511, 34585, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 20271, 23511, 23511, 23511, 23511, 30562, 24035, 24035, 27155, 26576, 23114, 23114, 30447, 23036, 29695, 23511, 23511, 30935, 20099, 24152, 25529, 27100, 34461, 27121, 22625, 29156, 26009, 27137, 30422, 31903, 31655, 28870, 27171, 32439, 31731, 19830, 27232, 22612, 27265, 26786, 25494, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 20342, 27288, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36079, 19288, 21605, 27322, 27339, 28020, 27361, 27382, 29939, 24035, 24035, 32581, 24036, 23114, 23114, 23114, 27425, 22420, 23511, 23511, 23511, 27442, 28306, 19803, 24035, 24035, 24035, 24035, 26710, 23114, 23114, 23114, 23114, 32261, 22468, 23511, 23511, 23511, 23511, 35719, 24694, 29510, 24035, 24035, 24035, 24035, 26717, 23114, 23114, 23114, 23114, 28618, 32217, 23511, 23511, 23511, 23511, 34585, 20402, 24035, 24035, 24035, 27459, 23114, 23114, 23114, 36252, 23029, 20271, 23511, 23511, 23511, 28840, 30562, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 27480, 34483, 28401, 29761, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36382, 19288, 21605, 27497, 27517, 28504, 28898, 27569, 29939, 29401, 27600, 27323, 27633, 19025, 27662, 23114, 27705, 22420, 20483, 27721, 23511, 27765, 28306, 19803, 23540, 24035, 24610, 27781, 27805, 26650, 23114, 28573, 32990, 25920, 22468, 26870, 23511, 26684, 34262, 34737, 25057, 34622, 24035, 24035, 23971, 24206, 27825, 27847, 23114, 23114, 27865, 27885, 35766, 27914, 23511, 23511, 32766, 32844, 27934, 28795, 26909, 27955, 26092, 27988, 25445, 28005, 28036, 28052, 21965, 23511, 32196, 19897, 28072, 28102, 36534, 21541, 23801, 28153, 28180, 28197, 28221, 23036, 32695, 28251, 28268, 28292, 23667, 34825, 23930, 24580, 28322, 28344, 31627, 28366, 25996, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 35625, 33477, 33359, 27674, 28393, 33992, 24036, 23114, 30243, 19829, 28417, 28433, 28463, 23008, 19876, 20208, 23007, 20046, 20132, 28489, 28520, 20141, 24569, 31691, 19787, 28550, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36079, 19288, 21605, 24035, 23112, 32618, 23511, 31507, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 28306, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 22468, 23511, 23511, 23511, 23511, 23512, 24694, 28589, 24035, 24035, 24035, 24035, 28608, 23114, 23114, 23114, 23114, 28618, 20431, 23511, 23511, 23511, 23511, 34585, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 20271, 23511, 23511, 23511, 23511, 30562, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36004, 19288, 28634, 31951, 28565, 28702, 28718, 28741, 32544, 20175, 28792, 32086, 20105, 28811, 29059, 29862, 28856, 22420, 28886, 30354, 23359, 28922, 28306, 28952, 23888, 26320, 36506, 24035, 29331, 28968, 36609, 23114, 29003, 31661, 27061, 30649, 27366, 23511, 29023, 27918, 24694, 24035, 24035, 23893, 33094, 30867, 23113, 23114, 23114, 29044, 34184, 30010, 29700, 23511, 23511, 29081, 29102, 34585, 20402, 27789, 24035, 24035, 24036, 23114, 29132, 23114, 23114, 23029, 20271, 23511, 29153, 23511, 23511, 30562, 30174, 24035, 24035, 27409, 25438, 23114, 23114, 29172, 36668, 31332, 23511, 23511, 29192, 30144, 24035, 23110, 30203, 23114, 23467, 31544, 23261, 23628, 24035, 22545, 23111, 23114, 29213, 27078, 27689, 29234, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 29257, 23008, 19876, 20208, 28768, 29290, 29320, 34776, 29353, 20141, 22435, 29378, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36367, 19288, 21605, 34616, 19006, 32618, 31497, 31507, 36216, 20184, 24035, 34393, 29424, 34668, 23114, 34900, 29447, 22420, 30360, 23511, 37089, 29473, 28306, 19803, 29499, 24398, 24035, 24035, 26576, 31799, 29532, 29550, 23114, 33811, 22468, 32298, 29571, 31184, 23511, 23512, 37127, 36628, 29589, 24035, 24135, 24035, 23113, 29608, 23114, 27831, 29634, 28618, 29652, 30037, 23511, 24172, 29671, 34585, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 29555, 29690, 23511, 23511, 23511, 23511, 30562, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 23634, 29719, 24035, 23110, 29738, 23114, 23467, 34035, 29756, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 29777, 34364, 28181, 30243, 29799, 31920, 27272, 27185, 23008, 31126, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29828, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 35989, 19552, 19687, 35139, 28649, 29878, 29894, 29924, 29939, 23224, 23085, 31969, 24036, 35173, 24752, 24803, 23114, 22420, 31190, 30318, 24870, 23511, 28306, 29967, 23967, 24035, 24035, 24035, 26576, 30000, 23114, 23114, 23114, 33811, 22468, 30026, 23511, 23511, 23511, 23512, 26078, 24035, 24035, 24035, 30053, 37137, 30071, 23114, 23114, 33368, 25136, 28618, 30723, 23511, 23511, 37096, 31356, 34585, 20402, 30092, 30127, 30160, 24036, 35740, 30219, 24960, 30259, 23029, 20271, 34042, 30285, 30342, 30376, 23289, 30055, 30400, 30419, 30438, 32640, 33532, 33514, 30472, 18792, 26267, 24323, 23057, 30493, 23639, 20008, 30196, 33188, 30517, 20075, 23511, 30541, 23628, 30578, 33928, 28776, 30594, 19874, 30610, 30637, 19830, 30677, 27646, 19872, 25779, 23266, 23232, 35016, 30243, 30696, 29812, 30712, 30746, 27206, 30779, 30807, 23007, 33395, 20132, 26578, 27685, 31703, 22928, 31691, 19787, 31079, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36352, 19288, 23335, 30841, 26131, 30888, 30904, 30986, 29939, 24035, 24704, 31017, 20025, 23114, 26178, 31051, 31095, 22420, 23511, 22524, 31142, 31172, 28534, 31206, 35497, 25196, 24035, 28592, 24503, 23114, 31239, 31285, 23114, 31305, 31321, 31355, 31372, 31407, 23511, 30556, 24694, 24035, 27501, 19805, 24035, 24035, 23113, 23114, 31428, 24066, 23114, 28618, 29700, 23511, 31837, 18809, 23511, 34585, 31448, 24035, 24035, 24035, 23090, 23114, 23114, 23114, 23114, 31619, 35038, 23511, 23511, 23511, 23511, 33714, 24035, 33085, 24035, 29431, 23114, 31467, 23114, 23143, 31487, 23511, 31523, 23511, 35195, 36783, 24035, 30111, 23567, 23114, 23467, 31543, 31560, 23628, 24035, 24035, 23111, 23114, 19874, 30953, 31584, 34508, 24035, 31608, 26345, 37055, 23266, 31643, 31677, 31719, 31747, 31786, 31822, 26898, 23008, 19876, 31859, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 31878, 31936, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 35974, 19288, 21605, 27972, 35663, 31985, 29655, 32001, 36715, 24785, 25893, 23545, 31912, 19853, 19916, 25938, 24540, 22420, 31843, 29674, 29573, 32735, 28936, 19803, 24035, 24035, 32047, 24035, 26576, 23114, 23114, 27544, 23114, 33811, 22468, 23511, 23511, 32161, 23511, 23512, 32066, 24035, 33313, 24035, 24035, 24035, 23113, 27426, 32102, 23114, 23114, 28618, 32125, 23511, 32144, 23511, 23511, 33569, 20402, 24035, 27045, 24035, 24036, 23114, 23114, 28328, 23114, 30076, 32177, 23511, 23511, 30384, 23511, 30562, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23595, 32212, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 22635, 25753, 32233, 32257, 32277, 19829, 26577, 26597, 20211, 23008, 19876, 32322, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36079, 19288, 32352, 35285, 32380, 34196, 33016, 30661, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 28306, 32404, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 32422, 23511, 23511, 23511, 23511, 23512, 24694, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 30269, 29700, 23511, 23511, 23511, 23511, 34585, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 20271, 23511, 23511, 23511, 23511, 30562, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 19949, 24035, 23111, 32455, 19874, 31269, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36337, 19552, 19209, 21617, 26509, 32475, 32491, 32529, 29939, 24035, 32578, 25241, 32597, 23114, 32634, 29007, 32656, 22420, 23511, 32729, 26365, 32751, 28306, 32788, 32882, 24035, 24035, 32813, 36727, 23114, 33182, 23114, 27553, 33235, 32829, 23511, 32706, 23511, 28906, 28377, 26962, 32881, 32904, 32898, 32920, 24035, 32953, 23114, 32977, 26408, 23114, 28164, 33006, 23511, 33039, 35774, 23511, 32306, 20402, 33076, 30872, 24035, 24036, 25408, 33110, 28979, 23114, 23029, 20271, 35835, 33130, 33054, 23511, 30562, 33148, 24035, 24035, 33167, 23114, 23114, 33775, 23036, 20459, 23511, 23511, 25464, 24646, 24035, 24035, 22446, 23114, 23114, 25627, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 31391, 33204, 33220, 33251, 33287, 26577, 26597, 20211, 33329, 19876, 33345, 23007, 20046, 20132, 26578, 27685, 28473, 22599, 31691, 33411, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 35959, 19288, 21907, 27243, 29843, 32618, 33427, 31507, 29939, 33460, 34090, 24035, 24036, 33493, 24416, 33530, 23114, 22420, 33548, 24379, 33585, 23511, 28306, 19803, 33603, 24202, 24035, 24035, 25593, 33749, 28205, 23114, 23114, 32388, 22468, 33853, 33060, 23511, 23511, 31339, 33621, 24035, 24035, 34397, 24618, 30757, 33663, 23114, 23114, 33683, 35684, 28618, 26678, 23511, 23511, 32506, 33699, 34585, 20402, 24035, 32562, 26973, 24036, 23114, 23114, 33377, 33773, 23029, 20271, 23511, 23511, 30621, 23511, 23860, 24035, 33791, 21553, 26576, 36558, 23114, 33809, 23036, 32857, 26047, 23511, 33827, 23634, 24035, 24035, 23110, 23114, 23114, 31252, 23511, 33845, 23628, 24035, 24459, 23111, 23114, 33869, 27078, 30791, 29783, 24035, 24742, 19872, 33895, 23266, 26462, 19710, 33879, 33919, 26577, 26597, 24123, 24930, 21930, 20208, 30501, 33953, 25268, 20252, 33983, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36322, 19552, 23390, 33634, 35154, 34008, 34024, 34058, 35544, 34106, 34128, 26811, 33151, 34144, 34169, 34212, 23114, 34228, 34244, 34278, 34315, 23511, 34331, 34347, 34380, 34413, 24035, 24663, 26576, 34429, 34453, 34477, 29534, 33811, 22468, 34499, 34524, 34557, 25170, 34580, 35436, 23937, 34601, 24035, 24341, 26453, 23113, 34638, 34662, 23114, 24236, 28618, 34684, 34703, 34729, 23511, 35352, 34753, 34799, 24035, 34815, 32558, 34848, 34888, 35814, 34923, 23165, 29137, 23606, 30326, 30730, 34939, 33023, 30562, 36848, 34979, 24035, 24847, 34996, 23114, 23114, 35032, 29695, 35054, 23511, 23511, 35091, 33296, 35124, 24296, 28235, 24361, 36276, 32772, 35067, 35189, 27301, 30855, 24852, 22452, 35211, 35237, 35316, 25500, 35270, 23405, 24304, 35304, 29362, 24036, 23114, 35332, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 35368, 28823, 23920, 32336, 35405, 20141, 24569, 31691, 35421, 35479, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 35944, 22795, 21605, 33647, 35877, 35513, 30962, 35529, 34073, 35557, 24035, 24035, 20405, 31107, 23114, 23114, 23114, 35590, 34713, 23511, 23511, 23511, 35641, 19803, 29408, 32937, 25298, 24035, 35657, 23115, 27849, 24760, 35679, 26205, 22468, 23511, 35700, 24907, 24901, 35075, 31893, 34980, 24035, 24035, 24035, 24035, 23113, 35009, 23114, 23114, 23114, 28618, 35716, 30970, 23511, 23511, 23511, 34585, 23215, 24035, 24035, 24035, 24036, 35735, 23114, 23114, 23114, 27105, 35756, 35790, 23511, 23511, 23511, 35254, 35446, 24035, 24035, 31223, 35809, 23114, 23114, 23036, 36825, 35830, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 31031, 20355, 19872, 33903, 23266, 24036, 23114, 28686, 19829, 26577, 26597, 20211, 23008, 23424, 20208, 24711, 31065, 24486, 26578, 27685, 20141, 19773, 35851, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36307, 19288, 21605, 35494, 19702, 32618, 33437, 31507, 29939, 25117, 24035, 27939, 24036, 27869, 23114, 26829, 23114, 22420, 23494, 23511, 33132, 23511, 28306, 19803, 24035, 34832, 24035, 24035, 26576, 23114, 25153, 23114, 23114, 33811, 22468, 23511, 23511, 35911, 23511, 23512, 24694, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 28618, 29700, 23511, 23511, 23511, 23511, 34585, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 20271, 23511, 23511, 23511, 23511, 30562, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 35929, 19288, 21605, 25860, 23112, 36185, 23511, 36201, 29939, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 22420, 23511, 23511, 23511, 23511, 28306, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 22468, 23511, 23511, 23511, 23511, 23512, 26748, 24035, 24035, 24035, 24035, 24035, 36249, 23114, 23114, 23114, 23114, 28618, 28835, 23511, 23511, 23511, 23511, 34585, 20402, 24035, 27151, 24035, 26760, 23114, 27989, 23114, 23114, 36268, 20271, 23511, 24436, 23511, 29703, 30562, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36292, 19288, 21605, 36503, 21922, 32618, 34534, 31507, 36522, 24035, 33793, 24035, 35864, 23114, 23114, 36555, 23417, 22420, 23511, 23511, 36574, 26020, 28306, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 33811, 22468, 23511, 23511, 23511, 23511, 23512, 36592, 24035, 24035, 36625, 24035, 24035, 23113, 23114, 32961, 23114, 23114, 29618, 29700, 23511, 29086, 23511, 23511, 34585, 20402, 36644, 24035, 24035, 24036, 29740, 23114, 23114, 23114, 29065, 36663, 31527, 23511, 23511, 23511, 30562, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36079, 19288, 21605, 31451, 23112, 36684, 23511, 36700, 29939, 24035, 24035, 24035, 30185, 23114, 23114, 23114, 27526, 22420, 23511, 23511, 23511, 32865, 28306, 19803, 36743, 24035, 27017, 24035, 26576, 27535, 23114, 31432, 23114, 33811, 22468, 33271, 23511, 32128, 23511, 23512, 24694, 24035, 27196, 24035, 24035, 24035, 23113, 32459, 23114, 23114, 23114, 28618, 29700, 33829, 36762, 23511, 23511, 34585, 20402, 24035, 36746, 24035, 29722, 23114, 23114, 34437, 23114, 34907, 20271, 23511, 23511, 18801, 23511, 23206, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 36837, 24035, 24035, 33739, 23114, 23114, 25094, 23511, 23261, 23628, 24035, 36780, 23111, 24073, 19874, 27078, 35344, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22720, 19288, 36799, 36866, 17466, 36890, 36864, 21991, 22211, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 17631, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 36883, 36906, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 22705, 19288, 19457, 36866, 17466, 36890, 36866, 19375, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18855, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36124, 19288, 36951, 36866, 17466, 36890, 36866, 21991, 22404, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18567, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 36979, 36995, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36139, 19288, 19457, 36866, 17466, 36890, 36866, 21991, 22971, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18027, 22984, 17553, 17572, 22285, 18462, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 17619, 22083, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 36139, 19288, 21529, 24035, 23112, 23033, 23511, 31507, 25377, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 37040, 23511, 23511, 23511, 23511, 28086, 19803, 24035, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23114, 24254, 37079, 23511, 23511, 23511, 23511, 23512, 34766, 24035, 24035, 24035, 24035, 24035, 23113, 23114, 23114, 23114, 23114, 28618, 29700, 23511, 23511, 23511, 23511, 34585, 20402, 24035, 24035, 24035, 24036, 23114, 23114, 23114, 23114, 23029, 20271, 23511, 23511, 23511, 23511, 30562, 24035, 24035, 24035, 26576, 23114, 23114, 23114, 23036, 29695, 23511, 23511, 23511, 23634, 24035, 24035, 23110, 23114, 23114, 23467, 23511, 23261, 23628, 24035, 24035, 23111, 23114, 19874, 27078, 27689, 19830, 24035, 23112, 19872, 27741, 23266, 24036, 23114, 30243, 19829, 26577, 26597, 20211, 23008, 19876, 20208, 23007, 20046, 20132, 26578, 27685, 20141, 24569, 31691, 19787, 29304, 20268, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 37112, 37160, 18469, 36866, 17466, 36890, 36866, 17656, 37174, 22987, 17556, 17575, 22288, 17486, 17509, 17525, 18373, 18537, 22984, 17553, 17572, 22285, 18780, 17990, 18622, 19411, 20306, 17996, 17689, 17470, 17591, 20896, 17468, 36883, 36906, 36867, 19404, 20299, 36866, 17647, 17862, 18921, 19514, 17705, 20311, 37017, 17728, 17756, 17784, 17800, 17825, 17854, 18403, 18928, 19521, 17712, 37008, 37024, 17878, 18884, 17900, 17922, 17944, 18178, 17960, 18012, 18381, 18064, 18218, 17884, 18890, 17906, 17928, 18102, 25022, 18130, 36931, 36963, 17493, 18150, 18166, 18214, 25010, 25026, 18134, 36935, 18262, 18278, 18294, 18320, 18336, 18361, 18397, 18274, 22096, 18304, 18448, 18485, 18523, 18553, 18583, 19149, 18638, 18497, 19656, 18664, 18680, 18507, 18696, 19164, 18712, 18737, 17681, 22026, 20906, 20915, 22054, 17838, 17450, 22022, 18765, 19225, 18841, 18871, 18906, 19241, 19257, 18976, 19041, 19056, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 19058, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 127011, 110630, 114730, 106539, 127011, 127011, 127011, 53264, 18, 18, 0, 0, 57366, 0, 24, 24, 24, 0, 28, 28, 28, 28, 102432, 0, 0, 127011, 0, 2220032, 110630, 0, 0, 0, 114730, 106539, 0, 2170880, 2170880, 2170880, 2170880, 0, 0, 0, 2170880, 2170880, 2170880, 3002368, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2576384, 2215936, 2215936, 2215936, 2416640, 2424832, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2543616, 2215936, 2215936, 2215936, 2215936, 2215936, 2629632, 2215936, 2617344, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2691072, 2215936, 2707456, 2215936, 2715648, 2215936, 2723840, 2764800, 2215936, 2215936, 2797568, 2215936, 2822144, 2215936, 2215936, 2854912, 2215936, 2215936, 2215936, 2912256, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 0, 0, 0, 180224, 0, 0, 2174976, 0, 0, 2170880, 2617344, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2691072, 2170880, 2707456, 2170880, 2715648, 2170880, 2723840, 2764800, 2170880, 2170880, 2797568, 2170880, 2170880, 2797568, 2170880, 2822144, 2170880, 2170880, 2854912, 2170880, 2170880, 2170880, 2912256, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2215936, 2215936, 2215936, 2215936, 2609152, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2654208, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 0, 0, 0, 184599, 280, 0, 2174976, 0, 0, 2215936, 3117056, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 0, 544, 0, 546, 0, 0, 2179072, 0, 0, 0, 552, 0, 0, 2170880, 2170880, 2170880, 3117056, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 0, 0, 0, 2158592, 2158592, 2232320, 2232320, 0, 2240512, 2240512, 0, 0, 0, 644, 0, 0, 0, 0, 0, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3129344, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2215936, 2215936, 2215936, 2400256, 2215936, 2215936, 2215936, 2215936, 2711552, 2170880, 2170880, 2170880, 2170880, 2170880, 2760704, 2768896, 2789376, 2813952, 2170880, 2170880, 2170880, 2875392, 2904064, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2453504, 2457600, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 0, 167936, 0, 0, 0, 0, 2174976, 0, 0, 2215936, 2215936, 2514944, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2592768, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 32768, 0, 0, 0, 0, 0, 2174976, 32768, 0, 2633728, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2711552, 2215936, 2215936, 2215936, 2215936, 2215936, 2760704, 2768896, 2789376, 2813952, 2215936, 2215936, 2215936, 2875392, 2904064, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 0, 0, 0, 0, 0, 0, 2174976, 0, 65819, 2215936, 2215936, 3031040, 2215936, 3055616, 2215936, 2215936, 2215936, 2215936, 3092480, 2215936, 2215936, 3125248, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 3002368, 2215936, 2215936, 2170880, 2170880, 2494464, 2170880, 2170880, 0, 0, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 3198976, 2215936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 0, 0, 0, 2379776, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2445312, 2170880, 2465792, 2473984, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2523136, 2170880, 2170880, 2641920, 2170880, 2170880, 2170880, 2699264, 2170880, 2727936, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2879488, 2170880, 2916352, 2170880, 2170880, 2170880, 2879488, 2170880, 2916352, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3026944, 2170880, 2170880, 3063808, 2170880, 2170880, 3112960, 2170880, 2170880, 3133440, 2170880, 2170880, 3112960, 2170880, 2170880, 3133440, 2170880, 2170880, 2170880, 3162112, 2170880, 2170880, 3182592, 3186688, 2170880, 2379776, 2215936, 2523136, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2596864, 2215936, 2621440, 2215936, 2215936, 2641920, 2215936, 2215936, 0, 0, 0, 0, 0, 0, 2179072, 548, 0, 0, 0, 0, 287, 2170880, 0, 2170880, 2170880, 2170880, 2400256, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3117056, 2170880, 2170880, 2170880, 2170880, 2215936, 2215936, 2699264, 2215936, 2727936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2879488, 2215936, 2916352, 2215936, 2215936, 0, 0, 0, 0, 188416, 0, 2179072, 0, 0, 0, 0, 0, 287, 2170880, 0, 2171019, 2171019, 2171019, 2400395, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 3031179, 2171019, 3055755, 2171019, 2171019, 2215936, 3133440, 2215936, 2215936, 2215936, 3162112, 2215936, 2215936, 3182592, 3186688, 2215936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2523275, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2597003, 2171019, 2621579, 2170880, 2170880, 2170880, 3162112, 2170880, 2170880, 3182592, 3186688, 2170880, 0, 0, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 0, 53264, 0, 18, 18, 24, 24, 0, 4337664, 28, 2170880, 2170880, 2170880, 2629632, 2170880, 2170880, 2170880, 2170880, 2719744, 2744320, 2170880, 2170880, 2170880, 2834432, 2838528, 2170880, 2908160, 2170880, 2170880, 2936832, 2215936, 2215936, 2215936, 2215936, 2719744, 2744320, 2215936, 2215936, 2215936, 2834432, 2838528, 2215936, 2908160, 2215936, 2215936, 2936832, 2215936, 2215936, 2985984, 2215936, 2994176, 2215936, 2215936, 3014656, 2215936, 3059712, 3076096, 3088384, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2445312, 2215936, 2465792, 2473984, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2171166, 2171166, 2171166, 2171166, 2171166, 0, 0, 0, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171019, 2171019, 2494603, 2171019, 2171019, 2215936, 2215936, 2215936, 3215360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2379776, 2170880, 2170880, 2170880, 2170880, 2985984, 2170880, 2994176, 2170880, 2170880, 3016168, 2170880, 3059712, 3076096, 3088384, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 0, 53264, 0, 18, 18, 124, 124, 0, 128, 128, 2170880, 2170880, 2170880, 3215360, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2486272, 2170880, 2170880, 2506752, 2170880, 2170880, 2170880, 2535424, 2539520, 2170880, 2170880, 2588672, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2920448, 2170880, 2170880, 2170880, 2990080, 2170880, 2170880, 2170880, 2170880, 3051520, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3170304, 0, 2387968, 2392064, 2170880, 2170880, 2433024, 2170880, 2170880, 2170880, 3170304, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2486272, 2215936, 2215936, 2506752, 2215936, 2215936, 2215936, 2535424, 2539520, 2215936, 2215936, 2588672, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 0, 0, 0, 0, 0, 0, 2174976, 136, 0, 2215936, 2215936, 2920448, 2215936, 2215936, 2215936, 2990080, 2215936, 2215936, 2215936, 2215936, 3051520, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 3108864, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 3026944, 2215936, 2215936, 3063808, 2215936, 2215936, 3112960, 2215936, 2215936, 2215936, 3170304, 0, 0, 0, 0, 0, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2453504, 2457600, 2170880, 2170880, 2170880, 2486272, 2170880, 2170880, 2506752, 2170880, 2170880, 2170880, 2537049, 2539520, 2170880, 2170880, 2588672, 2170880, 2170880, 2170880, 1508, 2170880, 2170880, 2170880, 1512, 2170880, 2920448, 2170880, 2170880, 2170880, 2990080, 2170880, 2170880, 2170880, 2461696, 2170880, 2170880, 2170880, 2510848, 2170880, 2170880, 2170880, 2170880, 2580480, 2170880, 2605056, 2637824, 2170880, 2170880, 18, 0, 0, 0, 0, 0, 0, 0, 0, 2220032, 0, 0, 0, 0, 0, 0, 0, 2170880, 2170880, 2170880, 2170880, 2686976, 2748416, 2170880, 2170880, 2170880, 2924544, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3121152, 2170880, 2170880, 3145728, 3158016, 3166208, 2170880, 2420736, 2428928, 2170880, 2478080, 2170880, 2170880, 2170880, 2170880, 0, 0, 2170880, 2170880, 2170880, 2170880, 2646016, 2670592, 0, 0, 3145728, 3158016, 3166208, 2387968, 2392064, 2215936, 2215936, 2433024, 2215936, 2461696, 2215936, 2215936, 2215936, 2510848, 2215936, 2215936, 0, 0, 0, 0, 0, 0, 2179072, 0, 0, 0, 0, 0, 0, 2170880, 2215936, 2215936, 2580480, 2215936, 2605056, 2637824, 2215936, 2215936, 2686976, 2748416, 2215936, 2215936, 2215936, 2924544, 2215936, 2215936, 0, 0, 0, 0, 0, 0, 2179072, 0, 0, 0, 0, 0, 286, 2170880, 2215936, 2215936, 2215936, 2215936, 2215936, 3121152, 2215936, 2215936, 3145728, 3158016, 3166208, 2387968, 2392064, 2170880, 2170880, 2433024, 2170880, 2461696, 2170880, 2170880, 2170880, 2510848, 2170880, 2170880, 1625, 2170880, 2170880, 2580480, 2170880, 2605056, 2637824, 2170880, 647, 2170880, 2170880, 2170880, 2400256, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2576384, 2170880, 2170880, 2170880, 2170880, 2170880, 2609152, 2170880, 2170880, 2686976, 0, 0, 2748416, 2170880, 2170880, 0, 2170880, 2924544, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 0, 53264, 0, 18, 18, 24, 0, 0, 28, 28, 2170880, 3141632, 2215936, 2420736, 2428928, 2215936, 2478080, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2646016, 2670592, 2752512, 2756608, 2846720, 2961408, 2215936, 2998272, 2215936, 3010560, 2215936, 2215936, 2215936, 3141632, 2170880, 2420736, 2428928, 2752512, 2756608, 0, 2846720, 2961408, 2170880, 2998272, 2170880, 3010560, 2170880, 2170880, 2170880, 3141632, 2170880, 2170880, 2490368, 2215936, 2490368, 2215936, 2215936, 2215936, 2547712, 2555904, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 0, 0, 0, 0, 0, 0, 2174976, 245760, 0, 3129344, 2170880, 2170880, 2490368, 2170880, 2170880, 2170880, 0, 0, 2547712, 2555904, 2170880, 2170880, 2170880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2220032, 0, 0, 45056, 0, 2584576, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2170880, 2170880, 2170880, 2170880, 0, 0, 0, 2170880, 2170880, 2158592, 0, 0, 0, 0, 0, 0, 0, 0, 2220032, 0, 0, 0, 0, 0, 0, 0, 0, 1482, 97, 97, 97, 97, 97, 97, 97, 1354, 97, 97, 97, 97, 97, 97, 97, 97, 1148, 97, 97, 97, 97, 97, 97, 97, 2584576, 2170880, 2170880, 1512, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2441216, 2170880, 2527232, 2170880, 2600960, 2170880, 2850816, 2170880, 2170880, 2170880, 3022848, 2215936, 2441216, 2215936, 2527232, 2215936, 2600960, 2215936, 2850816, 2215936, 2215936, 0, 0, 0, 0, 0, 0, 2179072, 0, 0, 0, 0, 0, 287, 2170880, 2215936, 3022848, 2170880, 2441216, 2170880, 2527232, 0, 0, 2170880, 2600960, 2170880, 0, 2850816, 2170880, 2170880, 2170880, 2170880, 2170880, 2523136, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2596864, 2170880, 2621440, 2170880, 2170880, 2641920, 2170880, 2170880, 2170880, 3022848, 2170880, 2519040, 2170880, 2170880, 2170880, 2170880, 2170880, 2215936, 2519040, 2215936, 2215936, 2215936, 2215936, 2215936, 2170880, 2170880, 2170880, 2453504, 2457600, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2514944, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2592768, 2170880, 2170880, 2519040, 0, 2024, 2170880, 2170880, 0, 2170880, 2170880, 2170880, 2396160, 2170880, 2170880, 2170880, 2170880, 3018752, 2396160, 2215936, 2215936, 2215936, 2215936, 3018752, 2396160, 0, 2024, 2170880, 2170880, 2170880, 2170880, 3018752, 2170880, 2650112, 2965504, 2170880, 2215936, 2650112, 2965504, 2215936, 0, 0, 2170880, 2650112, 2965504, 2170880, 2551808, 2170880, 2551808, 2215936, 0, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 141, 45, 45, 67, 67, 67, 67, 67, 224, 67, 67, 238, 67, 67, 67, 67, 67, 67, 67, 1288, 67, 67, 67, 67, 67, 67, 67, 67, 67, 469, 67, 67, 67, 67, 67, 67, 0, 2551808, 2170880, 2170880, 2215936, 0, 2170880, 2170880, 2215936, 0, 2170880, 2170880, 2215936, 0, 2170880, 2977792, 2977792, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 53264, 18, 49172, 57366, 24, 8192, 29, 102432, 127011, 110630, 114730, 106539, 127011, 127011, 127011, 53264, 18, 18, 49172, 0, 0, 0, 24, 24, 24, 0, 28, 28, 28, 28, 102432, 127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 2170880, 2170880, 2170880, 2416640, 0, 0, 0, 0, 2220032, 110630, 0, 0, 0, 114730, 106539, 136, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 0, 53264, 0, 4256099, 4256099, 24, 24, 0, 28, 28, 2170880, 2461696, 2170880, 2170880, 2170880, 2510848, 2170880, 2170880, 0, 2170880, 2170880, 2580480, 2170880, 2605056, 2637824, 2170880, 2170880, 2170880, 2547712, 2555904, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3129344, 2215936, 2215936, 543, 543, 545, 545, 0, 0, 2179072, 0, 550, 551, 551, 0, 287, 2171166, 2171166, 18, 0, 0, 0, 0, 0, 0, 0, 0, 2220032, 0, 0, 645, 0, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 45, 149, 2584576, 2170880, 2170880, 0, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2441216, 2170880, 2527232, 2170880, 2600960, 2519040, 0, 0, 2170880, 2170880, 0, 2170880, 2170880, 2170880, 2396160, 2170880, 2170880, 2170880, 2170880, 3018752, 2396160, 2215936, 2215936, 2215936, 2215936, 3018752, 2396160, 0, 0, 2170880, 2170880, 2170880, 2170880, 3018752, 2170880, 2650112, 2965504, 53264, 18, 49172, 57366, 24, 155648, 28, 102432, 155648, 155687, 114730, 106539, 0, 0, 155648, 53264, 18, 18, 49172, 0, 57366, 0, 24, 24, 24, 0, 28, 28, 28, 28, 102432, 0, 0, 0, 0, 2220032, 0, 94208, 0, 0, 114730, 106539, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 0, 53264, 208896, 18, 278528, 24, 24, 0, 28, 28, 53264, 18, 159765, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 0, 53264, 18, 18, 49172, 0, 57366, 0, 24, 24, 24, 0, 28, 139394, 28, 28, 102432, 131, 0, 0, 0, 2220032, 110630, 0, 0, 0, 114730, 106539, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 32768, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 0, 546, 0, 0, 2183168, 0, 0, 552, 832, 2170880, 2170880, 2170880, 2400256, 2170880, 2170880, 2170880, 2170880, 2170880, 2609152, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2654208, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 3198976, 2215936, 0, 1084, 0, 1088, 0, 1092, 0, 0, 0, 0, 0, 41606, 0, 0, 0, 0, 45, 45, 45, 45, 45, 937, 0, 0, 0, 0, 2220032, 110630, 0, 0, 0, 114730, 106539, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3198976, 2170880, 0, 0, 644, 0, 0, 0, 2215936, 3117056, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 0, 826, 0, 828, 0, 0, 2183168, 0, 0, 830, 0, 2170880, 2170880, 2170880, 2400256, 2170880, 2170880, 2170880, 2170880, 2592768, 2170880, 2170880, 2170880, 2170880, 2633728, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2711552, 2170880, 2170880, 2170880, 2170880, 2170880, 2760704, 53264, 18, 49172, 57366, 24, 8192, 28, 172066, 172032, 110630, 172066, 106539, 0, 0, 172032, 53264, 18, 18, 49172, 0, 57366, 0, 24, 24, 24, 16384, 28, 28, 28, 28, 102432, 0, 98304, 0, 0, 2220032, 110630, 0, 0, 0, 0, 106539, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3198976, 2170880, 0, 0, 45056, 0, 0, 0, 53264, 18, 49172, 57366, 25, 8192, 30, 102432, 0, 110630, 114730, 106539, 0, 0, 176219, 53264, 18, 18, 49172, 0, 57366, 0, 124, 124, 124, 0, 128, 128, 128, 128, 102432, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 2170880, 2170880, 2170880, 2416640, 0, 546, 0, 0, 2183168, 0, 65536, 552, 0, 2170880, 2170880, 2170880, 2400256, 2170880, 2170880, 2170880, 2170880, 2646016, 2670592, 2752512, 2756608, 2846720, 2961408, 2170880, 2998272, 2170880, 3010560, 2170880, 2170880, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 3198976, 2215936, 0, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 143, 45, 45, 67, 67, 67, 67, 67, 227, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1824, 67, 1826, 67, 67, 67, 67, 17, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 32768, 120, 121, 18, 18, 49172, 0, 57366, 0, 24, 24, 24, 0, 28, 28, 28, 28, 102432, 67, 67, 37139, 37139, 24853, 24853, 0, 0, 2179072, 548, 0, 65820, 65820, 0, 287, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 45, 45, 45, 2033, 45, 67, 67, 67, 67, 0, 0, 97, 97, 97, 97, 45, 45, 67, 67, 0, 369, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 978, 0, 546, 70179, 0, 2183168, 0, 0, 552, 0, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1013, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 473, 67, 67, 67, 67, 483, 67, 67, 1025, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 1119, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1359, 97, 97, 97, 67, 67, 1584, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 497, 67, 67, 1659, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1667, 45, 45, 45, 45, 45, 169, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1668, 45, 45, 45, 45, 67, 67, 1694, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 774, 67, 67, 1713, 97, 97, 97, 97, 97, 97, 97, 0, 97, 97, 1723, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 1538, 45, 45, 45, 45, 45, 1559, 45, 45, 1561, 45, 45, 45, 45, 45, 45, 45, 687, 45, 45, 45, 45, 45, 45, 45, 45, 448, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 1771, 1772, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 0, 97, 67, 67, 67, 67, 67, 1821, 67, 67, 67, 67, 67, 67, 1827, 67, 67, 67, 0, 0, 0, 0, 0, 0, 97, 97, 1614, 97, 97, 97, 97, 97, 603, 97, 97, 605, 97, 97, 608, 97, 97, 97, 97, 0, 1532, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 450, 45, 45, 45, 45, 67, 67, 97, 97, 97, 97, 97, 97, 0, 0, 1839, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 97, 1883, 97, 1885, 97, 0, 1888, 0, 97, 97, 0, 97, 97, 1848, 97, 97, 97, 97, 1852, 45, 45, 45, 45, 45, 45, 45, 384, 391, 45, 45, 45, 45, 45, 45, 45, 385, 45, 45, 45, 45, 45, 45, 45, 45, 1237, 45, 45, 45, 45, 45, 45, 67, 0, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 1951, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 1963, 97, 2023, 0, 97, 97, 0, 97, 97, 97, 45, 45, 45, 45, 45, 45, 67, 67, 1994, 67, 1995, 67, 67, 67, 67, 67, 67, 97, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 0, 0, 0, 0, 2220032, 110630, 0, 0, 0, 114730, 106539, 137, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2793472, 2805760, 2170880, 2830336, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3031040, 2170880, 3055616, 2170880, 2170880, 67, 67, 37139, 37139, 24853, 24853, 0, 0, 281, 549, 0, 65820, 65820, 0, 287, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 45, 2031, 2032, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1769, 67, 0, 546, 70179, 549, 549, 0, 0, 552, 0, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1858, 45, 641, 0, 0, 0, 0, 41606, 926, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 456, 67, 0, 0, 0, 1313, 0, 0, 0, 1096, 1319, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 1110, 97, 97, 97, 97, 67, 67, 67, 67, 1301, 1476, 0, 0, 0, 0, 1307, 1478, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 1486, 97, 1487, 97, 1313, 1480, 0, 0, 0, 0, 1319, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 566, 97, 97, 97, 97, 97, 97, 67, 67, 67, 1476, 0, 1478, 0, 1480, 0, 97, 97, 97, 97, 97, 97, 97, 45, 1853, 45, 1855, 45, 45, 45, 45, 53264, 18, 49172, 57366, 26, 8192, 31, 102432, 0, 110630, 114730, 106539, 0, 0, 225368, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 32768, 53264, 18, 18, 49172, 163840, 57366, 0, 24, 24, 229376, 0, 28, 28, 28, 229376, 102432, 0, 0, 0, 0, 2220167, 110630, 0, 0, 0, 114730, 106539, 0, 2171019, 2171019, 2171019, 2171019, 2592907, 2171019, 2171019, 2171019, 2171019, 2633867, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2654347, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 3117195, 2171019, 2171019, 2171019, 2171019, 2240641, 0, 0, 0, 0, 0, 0, 0, 0, 368, 0, 140, 2171019, 2171019, 2171019, 2416779, 2424971, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2617483, 2171019, 2171019, 2642059, 2171019, 2171019, 2171019, 2699403, 2171019, 2728075, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 3215499, 2215936, 2215936, 2215936, 2215936, 2215936, 2437120, 2215936, 2215936, 2171019, 2822283, 2171019, 2171019, 2855051, 2171019, 2171019, 2171019, 2912395, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 3002507, 2171019, 2171019, 2215936, 2215936, 2494464, 2215936, 2215936, 2215936, 2171166, 2171166, 2416926, 2425118, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2576670, 2171166, 2617630, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2691358, 2171166, 2707742, 2171166, 2715934, 2171166, 2724126, 2765086, 2171166, 2171166, 2797854, 2171166, 2822430, 2171166, 2171166, 2855198, 2171166, 2171166, 2171166, 2912542, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2793758, 2806046, 2171166, 2830622, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 3109150, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2543902, 2171166, 2171166, 2171166, 2171166, 2171166, 2629918, 2793611, 2805899, 2171019, 2830475, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 0, 546, 0, 0, 2183168, 0, 0, 552, 0, 2171166, 2171166, 2171166, 2400542, 2171166, 2171166, 2171166, 0, 2171166, 2171166, 2171166, 0, 2171166, 2920734, 2171166, 2171166, 2171166, 2990366, 2171166, 2171166, 2171166, 2171166, 3117342, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 0, 53264, 0, 18, 18, 4329472, 2232445, 0, 2240641, 4337664, 2711691, 2171019, 2171019, 2171019, 2171019, 2171019, 2760843, 2769035, 2789515, 2814091, 2171019, 2171019, 2171019, 2875531, 2904203, 2171019, 2171019, 3092619, 2171019, 2171019, 3125387, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 3199115, 2171019, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2453504, 2457600, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2793472, 2805760, 2215936, 2830336, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2170880, 2170880, 2170880, 2170880, 2170880, 0, 0, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2494464, 2170880, 2170880, 2171166, 2171166, 2634014, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2711838, 2171166, 2171166, 2171166, 2171166, 2171166, 2760990, 2769182, 2789662, 2814238, 2171166, 2171166, 2171166, 2875678, 2904350, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 3199262, 2171166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2379915, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2445451, 2171019, 2465931, 2474123, 2171019, 2171019, 3113099, 2171019, 2171019, 3133579, 2171019, 2171019, 2171019, 3162251, 2171019, 2171019, 3182731, 3186827, 2171019, 2379776, 2879627, 2171019, 2916491, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 3027083, 2171019, 2171019, 3063947, 2699550, 2171166, 2728222, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2879774, 2171166, 2916638, 2171166, 2171166, 2171166, 2171166, 2171166, 2609438, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2654494, 2171166, 2171166, 2171166, 2171166, 2171166, 2445598, 2171166, 2466078, 2474270, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2523422, 2171019, 2437259, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2543755, 2171019, 2171019, 2171019, 2584715, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2908299, 2171019, 2171019, 2936971, 2171019, 2171019, 2986123, 2171019, 2994315, 2171019, 2171019, 3014795, 2171019, 3059851, 3076235, 3088523, 2171166, 2171166, 2986270, 2171166, 2994462, 2171166, 2171166, 3014942, 2171166, 3059998, 3076382, 3088670, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 3027230, 2171166, 2171166, 3064094, 2171166, 2171166, 3113246, 2171166, 2171166, 3133726, 2506891, 2171019, 2171019, 2171019, 2535563, 2539659, 2171019, 2171019, 2588811, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2691211, 2171019, 2707595, 2171019, 2715787, 2171019, 2723979, 2764939, 2171019, 2171019, 2797707, 2215936, 2215936, 3170304, 0, 0, 0, 0, 0, 0, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2453790, 2457886, 2171166, 2171166, 2171166, 2486558, 2171166, 2171166, 2507038, 2171166, 2171166, 2171166, 2535710, 2539806, 2171166, 2171166, 2588958, 2171166, 2171166, 2171166, 2171166, 2515230, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2593054, 2171166, 2171166, 2171166, 2171166, 3051806, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 3170590, 0, 2388107, 2392203, 2171019, 2171019, 2433163, 2171019, 2461835, 2171019, 2171019, 2171019, 2510987, 2171019, 2171019, 2171019, 2171019, 2580619, 2171019, 2605195, 2637963, 2171019, 2171019, 2171019, 2920587, 2171019, 2171019, 2171019, 2990219, 2171019, 2171019, 2171019, 2171019, 3051659, 2171019, 2171019, 2171019, 2453643, 2457739, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2515083, 2171019, 2171019, 2171019, 2171019, 2646155, 2670731, 2752651, 2756747, 2846859, 2961547, 2171019, 2998411, 2171019, 3010699, 2171019, 2171019, 2687115, 2748555, 2171019, 2171019, 2171019, 2924683, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 3121291, 2171019, 2171019, 2171019, 3170443, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2486272, 2215936, 2215936, 2506752, 3145867, 3158155, 3166347, 2387968, 2392064, 2215936, 2215936, 2433024, 2215936, 2461696, 2215936, 2215936, 2215936, 2510848, 2215936, 2215936, 0, 0, 0, 0, 0, 0, 2179072, 0, 0, 0, 0, 0, 553, 2170880, 2215936, 2215936, 2215936, 2215936, 2215936, 3121152, 2215936, 2215936, 3145728, 3158016, 3166208, 2388254, 2392350, 2171166, 2171166, 2433310, 2171166, 2461982, 2171166, 2171166, 2171166, 2511134, 2171166, 2171166, 0, 2171166, 2171166, 2580766, 2171166, 2605342, 2638110, 2171166, 2171166, 2171166, 2171166, 3031326, 2171166, 3055902, 2171166, 2171166, 2171166, 2171166, 3092766, 2171166, 2171166, 3125534, 2171166, 2171166, 2171166, 3162398, 2171166, 2171166, 3182878, 3186974, 2171166, 0, 0, 0, 2171019, 2171019, 2171019, 2171019, 3109003, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2215936, 2215936, 2215936, 2400256, 2215936, 2215936, 2215936, 2215936, 2171166, 2687262, 0, 0, 2748702, 2171166, 2171166, 0, 2171166, 2924830, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 2597150, 2171166, 2621726, 2171166, 2171166, 2642206, 2171166, 2171166, 2171166, 2171166, 3121438, 2171166, 2171166, 3146014, 3158302, 3166494, 2171019, 2420875, 2429067, 2171019, 2478219, 2171019, 2171019, 2171019, 2171019, 2547851, 2556043, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 3129483, 2215936, 2171019, 3141771, 2215936, 2420736, 2428928, 2215936, 2478080, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2646016, 2670592, 2752512, 2756608, 2846720, 2961408, 2215936, 2998272, 2215936, 3010560, 2215936, 2215936, 2215936, 3141632, 2171166, 2421022, 2429214, 2171166, 2478366, 2171166, 2171166, 2171166, 2171166, 0, 0, 2171166, 2171166, 2171166, 2171166, 2646302, 2670878, 0, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 0, 45, 45, 45, 45, 45, 1405, 1406, 45, 45, 45, 45, 1409, 45, 45, 45, 45, 45, 1415, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1238, 45, 45, 45, 45, 67, 2752798, 2756894, 0, 2847006, 2961694, 2171166, 2998558, 2171166, 3010846, 2171166, 2171166, 2171166, 3141918, 2171019, 2171019, 2490507, 3129344, 2171166, 2171166, 2490654, 2171166, 2171166, 2171166, 0, 0, 2547998, 2556190, 2171166, 2171166, 2171166, 0, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 45, 45, 167, 45, 45, 45, 45, 185, 187, 45, 45, 198, 45, 45, 0, 2171166, 2171166, 2171166, 2171166, 2171166, 2171166, 3129630, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2576523, 2171019, 2171019, 2171019, 2171019, 2171019, 2609291, 2171019, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 3002368, 2215936, 2215936, 2171166, 2171166, 2494750, 2171166, 2171166, 0, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 45, 147, 2584576, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2171166, 2171166, 2171166, 2171166, 0, 0, 0, 2171166, 2171166, 2171166, 2171166, 0, 0, 0, 2171166, 2171166, 2171166, 3002654, 2171166, 2171166, 2171019, 2171019, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 0, 0, 0, 0, 0, 0, 2175257, 0, 0, 2584862, 2171166, 2171166, 0, 0, 2171166, 2171166, 2171166, 2171166, 2171166, 2171019, 2441355, 2171019, 2527371, 2171019, 2601099, 2171019, 2850955, 2171019, 2171019, 2171019, 3022987, 2215936, 2441216, 2215936, 2527232, 2215936, 2600960, 2215936, 2850816, 2215936, 2215936, 0, 0, 0, 0, 0, 0, 2179072, 0, 0, 0, 0, 69632, 287, 2170880, 2215936, 3022848, 2171166, 2441502, 2171166, 2527518, 0, 0, 2171166, 2601246, 2171166, 0, 2851102, 2171166, 2171166, 2171166, 2171166, 2720030, 2744606, 2171166, 2171166, 2171166, 2834718, 2838814, 2171166, 2908446, 2171166, 2171166, 2937118, 3023134, 2171019, 2519179, 2171019, 2171019, 2171019, 2171019, 2171019, 2215936, 2519040, 2215936, 2215936, 2215936, 2215936, 2215936, 2171166, 2171166, 2171166, 3215646, 0, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2171019, 2486411, 2171019, 2171019, 2171019, 2629771, 2171019, 2171019, 2171019, 2171019, 2719883, 2744459, 2171019, 2171019, 2171019, 2834571, 2838667, 2171019, 2519326, 0, 0, 2171166, 2171166, 0, 2171166, 2171166, 2171166, 2396299, 2171019, 2171019, 2171019, 2171019, 3018891, 2396160, 2215936, 2215936, 2215936, 2215936, 3018752, 2396446, 0, 0, 2171166, 2171166, 2171166, 2171166, 3019038, 2171019, 2650251, 2965643, 2171019, 2215936, 2650112, 2965504, 2215936, 0, 0, 2171166, 2650398, 2965790, 2171166, 2551947, 2171019, 2551808, 2215936, 0, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 144, 45, 45, 67, 67, 67, 67, 67, 228, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1929, 97, 97, 97, 97, 0, 0, 0, 2552094, 2171166, 2171019, 2215936, 0, 2171166, 2171019, 2215936, 0, 2171166, 2171019, 2215936, 0, 2171166, 2977931, 2977792, 2978078, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 1321, 97, 131072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 0, 140, 0, 2379776, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2445312, 2170880, 2465792, 2473984, 2170880, 2170880, 2170880, 2584576, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2170880, 2170880, 2170880, 3162112, 2170880, 2170880, 3182592, 3186688, 2170880, 0, 140, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3002368, 2170880, 2170880, 2215936, 2215936, 2494464, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 3215360, 544, 0, 0, 0, 544, 0, 546, 0, 0, 0, 546, 0, 0, 2183168, 0, 0, 552, 0, 2170880, 2170880, 2170880, 2400256, 2170880, 2170880, 2170880, 0, 2170880, 2170880, 2170880, 0, 2170880, 2920448, 2170880, 2170880, 2170880, 2990080, 2170880, 2170880, 552, 0, 0, 0, 552, 0, 287, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2437120, 2170880, 2170880, 18, 0, 0, 0, 0, 0, 0, 0, 0, 2220032, 0, 0, 644, 0, 2215936, 2215936, 3170304, 544, 0, 546, 0, 552, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3198976, 2170880, 0, 0, 0, 140, 0, 0, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 249856, 110630, 114730, 106539, 0, 0, 32768, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 151640, 53264, 18, 18, 49172, 0, 57366, 0, 24, 24, 24, 0, 28, 28, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2170880, 2170880, 2170880, 2416640, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 253952, 110630, 114730, 106539, 0, 0, 32856, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 192512, 53264, 18, 18, 49172, 0, 57366, 0, 2232445, 184320, 2232445, 0, 2240641, 2240641, 184320, 2240641, 102432, 0, 0, 0, 221184, 2220032, 110630, 0, 0, 0, 114730, 106539, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3108864, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2215936, 0, 0, 0, 45056, 0, 0, 0, 0, 0, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 0, 53264, 0, 18, 18, 24, 24, 0, 127, 127, 53264, 18, 49172, 258071, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 32768, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 204800, 53264, 18, 49172, 57366, 24, 27, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 0, 53264, 18, 49172, 57366, 24, 8192, 28, 33, 0, 33, 33, 33, 0, 0, 0, 53264, 18, 18, 49172, 0, 57366, 0, 24, 24, 24, 16384, 28, 28, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139, 2170880, 2170880, 2170880, 2416640, 67, 67, 37139, 37139, 24853, 24853, 0, 70179, 0, 0, 0, 65820, 65820, 369, 287, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 2030, 45, 45, 45, 45, 67, 1573, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1699, 67, 67, 67, 67, 25403, 546, 70179, 0, 0, 66365, 66365, 552, 0, 97, 97, 97, 97, 97, 97, 97, 97, 1355, 97, 97, 97, 1358, 97, 97, 97, 641, 0, 0, 0, 925, 41606, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 1187, 45, 45, 45, 45, 45, 0, 1480, 0, 0, 0, 0, 1319, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 592, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1531, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1680, 45, 45, 45, 641, 0, 924, 0, 925, 41606, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 1186, 45, 45, 45, 45, 45, 45, 67, 67, 37139, 37139, 24853, 24853, 0, 70179, 282, 0, 0, 65820, 65820, 369, 287, 97, 0, 0, 97, 97, 0, 97, 2028, 97, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1767, 67, 67, 67, 0, 0, 0, 0, 0, 0, 1612, 97, 97, 97, 97, 97, 97, 0, 1785, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 1790, 97, 0, 0, 2170880, 2170880, 3051520, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3170304, 241664, 2387968, 2392064, 2170880, 2170880, 2433024, 53264, 19, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 274432, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 270336, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 1134711, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 1126440, 1126440, 1126440, 0, 0, 1126400, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 36, 110630, 114730, 106539, 0, 0, 217088, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 94, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 96, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 24666, 53264, 18, 18, 49172, 0, 57366, 0, 24, 24, 24, 126, 28, 28, 28, 28, 102432, 53264, 122, 123, 49172, 0, 57366, 0, 24, 24, 24, 0, 28, 28, 28, 28, 102432, 2170880, 2170880, 4256099, 0, 0, 0, 0, 0, 0, 0, 0, 2220032, 0, 0, 0, 0, 0, 0, 0, 0, 1319, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 1109, 97, 97, 97, 97, 1113, 132, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 45, 146, 150, 45, 45, 45, 45, 45, 175, 45, 180, 45, 186, 45, 189, 45, 45, 203, 67, 256, 67, 67, 270, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 97, 97, 97, 293, 297, 97, 97, 97, 97, 97, 322, 97, 327, 97, 333, 97, 0, 0, 97, 2026, 0, 2027, 97, 97, 45, 45, 45, 45, 45, 45, 67, 67, 67, 1685, 67, 67, 67, 67, 67, 67, 67, 1690, 67, 336, 97, 97, 350, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 356, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 2170880, 2170880, 2170880, 2416640, 2424832, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2617344, 2170880, 45, 439, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 525, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 622, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1524, 97, 97, 1527, 369, 648, 45, 45, 45, 45, 45, 45, 45, 45, 45, 659, 45, 45, 45, 45, 408, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1239, 45, 45, 45, 67, 729, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 762, 67, 746, 67, 67, 67, 67, 67, 67, 67, 67, 67, 759, 67, 67, 67, 67, 0, 0, 0, 1477, 0, 1086, 0, 0, 0, 1479, 0, 1090, 67, 67, 796, 67, 67, 799, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1291, 67, 67, 67, 811, 67, 67, 67, 67, 67, 816, 67, 67, 67, 67, 67, 67, 67, 37689, 544, 25403, 546, 70179, 0, 0, 66365, 66365, 552, 833, 97, 97, 97, 97, 97, 97, 97, 97, 1380, 0, 0, 0, 45, 45, 45, 45, 45, 1185, 45, 45, 45, 45, 45, 45, 45, 386, 45, 45, 45, 45, 45, 45, 45, 45, 1810, 45, 45, 45, 45, 45, 45, 67, 97, 97, 844, 97, 97, 97, 97, 97, 97, 97, 97, 97, 857, 97, 97, 97, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 97, 97, 97, 894, 97, 97, 897, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 1382, 45, 45, 45, 97, 909, 97, 97, 97, 97, 97, 914, 97, 97, 97, 97, 97, 97, 97, 923, 67, 67, 1079, 67, 67, 67, 67, 67, 37689, 1085, 25403, 1089, 66365, 1093, 0, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 45, 148, 1114, 97, 97, 97, 97, 97, 97, 1122, 97, 97, 97, 97, 97, 97, 97, 97, 97, 606, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1173, 97, 97, 97, 97, 97, 12288, 0, 925, 0, 1179, 0, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 145, 45, 45, 67, 67, 67, 67, 67, 1762, 67, 67, 67, 1766, 67, 67, 67, 67, 67, 67, 528, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 1934, 67, 67, 1255, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1035, 67, 67, 67, 67, 67, 67, 1297, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1111, 97, 97, 97, 97, 97, 97, 1327, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 33344, 97, 97, 97, 1335, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 97, 97, 1377, 97, 97, 97, 97, 97, 97, 0, 1179, 0, 45, 45, 45, 45, 670, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 430, 45, 45, 45, 45, 67, 67, 1438, 67, 67, 1442, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1592, 67, 67, 67, 1451, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1458, 67, 67, 67, 67, 0, 0, 1305, 0, 0, 0, 0, 0, 1311, 0, 0, 0, 1317, 0, 0, 0, 0, 0, 0, 0, 97, 97, 1322, 97, 97, 1491, 97, 97, 1495, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1551, 45, 1553, 45, 1504, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1513, 97, 97, 97, 97, 0, 45, 45, 45, 45, 1536, 45, 45, 45, 45, 1540, 45, 67, 67, 67, 67, 67, 1585, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1700, 67, 67, 67, 97, 1648, 97, 97, 97, 97, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1541, 0, 97, 97, 97, 97, 0, 1940, 0, 97, 97, 97, 97, 97, 97, 45, 45, 2011, 45, 45, 45, 2015, 67, 67, 2017, 67, 67, 67, 2021, 97, 67, 67, 812, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 37689, 544, 97, 97, 97, 910, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 923, 0, 0, 0, 45, 45, 45, 45, 1184, 45, 45, 45, 45, 1188, 45, 45, 45, 45, 1414, 45, 45, 45, 1417, 45, 1419, 45, 45, 45, 45, 45, 443, 45, 45, 45, 45, 45, 45, 453, 45, 45, 67, 67, 67, 67, 1244, 67, 67, 67, 67, 1248, 67, 67, 67, 67, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 282, 41098, 65820, 97, 1324, 97, 97, 97, 97, 1328, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 930, 45, 45, 45, 45, 97, 97, 97, 97, 1378, 97, 97, 97, 97, 0, 1179, 0, 45, 45, 45, 45, 671, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 975, 45, 45, 45, 45, 67, 67, 1923, 67, 1925, 67, 67, 1927, 67, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 1985, 45, 45, 45, 45, 45, 45, 1560, 45, 45, 45, 45, 45, 45, 45, 45, 45, 946, 45, 45, 950, 45, 45, 45, 0, 97, 97, 97, 1939, 0, 0, 0, 97, 1943, 97, 97, 1945, 97, 45, 45, 45, 669, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 990, 45, 45, 45, 67, 257, 67, 67, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 337, 97, 97, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 356, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, 2170880, 2170880, 2170880, 2416640, 401, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 459, 461, 67, 67, 67, 67, 67, 67, 67, 67, 475, 67, 480, 67, 67, 67, 67, 67, 67, 1054, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1698, 67, 67, 67, 67, 67, 484, 67, 67, 487, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1459, 67, 67, 97, 556, 558, 97, 97, 97, 97, 97, 97, 97, 97, 572, 97, 577, 97, 97, 0, 0, 1896, 97, 97, 97, 97, 97, 97, 1903, 45, 45, 45, 45, 983, 45, 45, 45, 45, 988, 45, 45, 45, 45, 45, 45, 1195, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1549, 45, 45, 45, 45, 45, 581, 97, 97, 584, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1153, 97, 97, 369, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 662, 45, 45, 45, 684, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1004, 45, 45, 45, 67, 67, 67, 749, 67, 67, 67, 67, 67, 67, 67, 67, 67, 761, 67, 67, 67, 67, 67, 67, 1068, 67, 67, 67, 1071, 67, 67, 67, 67, 1076, 794, 795, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 544, 97, 97, 97, 97, 847, 97, 97, 97, 97, 97, 97, 97, 97, 97, 859, 97, 0, 0, 2025, 97, 20480, 97, 97, 2029, 45, 45, 45, 45, 45, 45, 67, 67, 67, 1575, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1775, 67, 67, 67, 97, 97, 97, 97, 892, 893, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1515, 97, 993, 994, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 992, 67, 67, 67, 1284, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1607, 67, 67, 97, 1364, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 596, 97, 45, 1556, 1557, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 696, 45, 1596, 1597, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 499, 67, 97, 97, 97, 1621, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1346, 97, 97, 97, 97, 1740, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1678, 45, 45, 45, 45, 45, 67, 97, 97, 97, 97, 97, 97, 1836, 0, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 1984, 97, 45, 45, 45, 45, 45, 45, 1808, 45, 45, 45, 45, 45, 45, 45, 45, 67, 739, 67, 67, 67, 67, 67, 744, 45, 45, 1909, 45, 45, 45, 45, 45, 45, 45, 67, 1917, 67, 1918, 67, 67, 67, 67, 67, 67, 1247, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 532, 67, 67, 67, 67, 67, 67, 1922, 67, 67, 67, 67, 67, 67, 67, 97, 1930, 97, 1931, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 1576, 67, 67, 67, 67, 1580, 67, 67, 0, 97, 97, 1938, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 699, 45, 45, 45, 704, 45, 45, 45, 45, 45, 45, 45, 45, 987, 45, 45, 45, 45, 45, 45, 45, 67, 67, 97, 97, 97, 97, 0, 0, 97, 97, 97, 2006, 97, 97, 97, 97, 0, 45, 1533, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1416, 45, 45, 45, 45, 45, 45, 45, 45, 722, 723, 45, 45, 45, 45, 45, 45, 2045, 67, 67, 67, 2047, 0, 0, 97, 97, 97, 2051, 45, 45, 67, 67, 0, 0, 0, 0, 925, 41606, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 409, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1957, 45, 67, 67, 67, 67, 67, 1836, 97, 97, 45, 67, 0, 97, 45, 67, 0, 97, 45, 67, 0, 97, 45, 45, 67, 67, 67, 1761, 67, 67, 67, 1764, 67, 67, 67, 67, 67, 67, 67, 494, 67, 67, 67, 67, 67, 67, 67, 67, 67, 787, 67, 67, 67, 67, 67, 67, 45, 45, 420, 45, 45, 422, 45, 45, 425, 45, 45, 45, 45, 45, 45, 45, 387, 45, 45, 45, 45, 397, 45, 45, 45, 67, 460, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 515, 67, 485, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 498, 67, 67, 67, 67, 67, 97, 0, 2039, 97, 97, 97, 97, 97, 45, 45, 45, 45, 1426, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1689, 67, 67, 67, 97, 557, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 612, 97, 582, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 595, 97, 97, 97, 97, 97, 896, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 885, 97, 97, 97, 97, 97, 45, 939, 45, 45, 45, 45, 943, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1916, 67, 67, 67, 67, 67, 45, 67, 67, 67, 67, 67, 67, 67, 1015, 67, 67, 67, 67, 1019, 67, 67, 67, 67, 67, 67, 1271, 67, 67, 67, 67, 67, 67, 1277, 67, 67, 67, 67, 67, 67, 1287, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 804, 67, 67, 67, 67, 67, 1077, 67, 67, 67, 67, 67, 67, 67, 37689, 0, 25403, 0, 66365, 0, 0, 0, 0, 0, 0, 0, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2437120, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2543616, 2170880, 2170880, 2170880, 2170880, 2170880, 2629632, 1169, 97, 1171, 97, 97, 97, 97, 97, 97, 97, 12288, 0, 925, 0, 1179, 0, 0, 0, 0, 925, 41606, 0, 0, 0, 0, 45, 45, 45, 45, 936, 45, 45, 67, 67, 214, 67, 220, 67, 67, 233, 67, 243, 67, 248, 67, 67, 67, 67, 67, 67, 1298, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 1617, 97, 0, 0, 0, 45, 45, 45, 1183, 45, 45, 45, 45, 45, 45, 45, 45, 45, 393, 45, 45, 45, 45, 45, 45, 67, 67, 1243, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1074, 67, 67, 1281, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 776, 1323, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 907, 45, 1412, 45, 45, 45, 45, 45, 45, 45, 1418, 45, 45, 45, 45, 45, 45, 686, 45, 45, 45, 690, 45, 45, 695, 45, 45, 67, 67, 67, 67, 67, 1465, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 1712, 97, 97, 97, 97, 1741, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 426, 45, 45, 45, 45, 45, 45, 67, 67, 67, 1924, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 97, 97, 1983, 97, 97, 45, 45, 1987, 45, 1988, 45, 0, 97, 97, 97, 97, 0, 0, 0, 1942, 97, 97, 97, 97, 97, 45, 45, 45, 700, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 711, 45, 45, 153, 45, 45, 166, 45, 176, 45, 181, 45, 45, 188, 191, 196, 45, 204, 255, 258, 263, 67, 271, 67, 67, 0, 37139, 24853, 0, 0, 0, 282, 41098, 65820, 97, 97, 97, 294, 97, 300, 97, 97, 313, 97, 323, 97, 328, 97, 97, 335, 338, 343, 97, 351, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 356, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 41098, 0, 140, 45, 45, 45, 45, 1404, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1411, 67, 67, 486, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1251, 67, 67, 501, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 513, 67, 67, 67, 67, 67, 67, 1443, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1263, 67, 67, 67, 67, 67, 97, 97, 583, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1526, 97, 598, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 610, 97, 97, 0, 97, 97, 1796, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 1744, 45, 45, 45, 369, 0, 651, 45, 653, 45, 654, 45, 656, 45, 45, 45, 660, 45, 45, 45, 45, 1558, 45, 45, 45, 45, 45, 45, 45, 45, 1566, 45, 45, 681, 45, 683, 45, 45, 45, 45, 45, 45, 45, 45, 691, 692, 694, 45, 45, 45, 716, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 709, 45, 45, 712, 45, 714, 45, 45, 45, 718, 45, 45, 45, 45, 45, 45, 45, 726, 45, 45, 45, 733, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1691, 67, 67, 747, 67, 67, 67, 67, 67, 67, 67, 67, 67, 760, 67, 67, 67, 0, 0, 0, 0, 0, 0, 97, 1613, 97, 97, 97, 97, 97, 97, 1509, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 1179, 0, 45, 45, 45, 45, 67, 764, 67, 67, 67, 67, 768, 67, 770, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 0, 1977, 67, 778, 779, 781, 67, 67, 67, 67, 67, 67, 788, 789, 67, 67, 792, 793, 67, 67, 67, 813, 67, 67, 67, 67, 67, 67, 67, 67, 67, 824, 37689, 544, 25403, 546, 70179, 0, 0, 66365, 66365, 552, 0, 836, 97, 838, 97, 839, 97, 841, 97, 97, 97, 845, 97, 97, 97, 97, 97, 97, 97, 97, 97, 858, 97, 97, 0, 1728, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 45, 1802, 45, 97, 97, 862, 97, 97, 97, 97, 866, 97, 868, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 1788, 97, 97, 97, 0, 0, 97, 97, 876, 877, 879, 97, 97, 97, 97, 97, 97, 886, 887, 97, 97, 890, 891, 97, 97, 97, 97, 97, 97, 97, 899, 97, 97, 97, 903, 97, 97, 97, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 1646, 97, 97, 97, 97, 911, 97, 97, 97, 97, 97, 97, 97, 97, 97, 922, 923, 45, 955, 45, 957, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 195, 45, 45, 45, 45, 45, 981, 982, 45, 45, 45, 45, 45, 45, 989, 45, 45, 45, 45, 45, 170, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 411, 45, 45, 45, 45, 45, 67, 1023, 67, 67, 67, 67, 67, 67, 1031, 67, 1033, 67, 67, 67, 67, 67, 67, 67, 817, 819, 67, 67, 67, 67, 67, 37689, 544, 67, 1065, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 516, 67, 67, 1078, 67, 67, 1081, 1082, 67, 67, 37689, 0, 25403, 0, 66365, 0, 0, 0, 0, 0, 0, 0, 0, 2171166, 2171166, 2171166, 2171166, 2171166, 2437406, 2171166, 2171166, 97, 1115, 97, 1117, 97, 97, 97, 97, 97, 97, 1125, 97, 1127, 97, 97, 97, 0, 97, 97, 97, 0, 97, 97, 97, 97, 1644, 97, 97, 97, 0, 97, 97, 97, 0, 97, 97, 1642, 97, 97, 97, 97, 97, 97, 625, 97, 97, 97, 97, 97, 97, 97, 97, 97, 316, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1159, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1502, 97, 97, 97, 97, 97, 1172, 97, 97, 1175, 1176, 97, 97, 12288, 0, 925, 0, 1179, 0, 0, 0, 0, 925, 41606, 0, 0, 0, 0, 45, 45, 45, 935, 45, 45, 45, 1233, 45, 45, 45, 1236, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 1873, 67, 67, 45, 45, 1218, 45, 45, 45, 1223, 45, 45, 45, 45, 45, 45, 45, 1230, 45, 45, 67, 67, 215, 219, 222, 67, 230, 67, 67, 244, 246, 249, 67, 67, 67, 67, 67, 67, 1882, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 1904, 45, 1905, 45, 67, 67, 67, 67, 67, 1258, 67, 1260, 67, 67, 67, 67, 67, 67, 67, 67, 67, 495, 67, 67, 67, 67, 67, 67, 67, 67, 1283, 67, 67, 67, 67, 67, 67, 67, 1290, 67, 67, 67, 67, 67, 67, 67, 818, 67, 67, 67, 67, 67, 67, 37689, 544, 67, 67, 1295, 67, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 2174976, 0, 0, 97, 97, 97, 1326, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1514, 97, 97, 97, 97, 97, 1338, 97, 1340, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1500, 97, 97, 1503, 97, 1363, 97, 97, 97, 97, 97, 97, 97, 1370, 97, 97, 97, 97, 97, 97, 97, 563, 97, 97, 97, 97, 97, 97, 578, 97, 1375, 97, 97, 97, 97, 97, 97, 97, 97, 0, 1179, 0, 45, 45, 45, 45, 685, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1003, 45, 45, 45, 45, 67, 67, 67, 1463, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1778, 97, 97, 97, 97, 97, 1518, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 609, 97, 97, 97, 45, 1542, 45, 45, 45, 45, 45, 45, 45, 1548, 45, 45, 45, 45, 45, 1554, 45, 1570, 1571, 45, 67, 67, 67, 67, 67, 67, 1578, 67, 67, 67, 67, 67, 67, 67, 1055, 67, 67, 67, 67, 67, 1061, 67, 67, 1582, 67, 67, 67, 67, 67, 67, 67, 1588, 67, 67, 67, 67, 67, 1594, 67, 67, 67, 67, 67, 97, 2038, 0, 97, 97, 97, 97, 97, 2044, 45, 45, 45, 995, 45, 45, 45, 45, 1000, 45, 45, 45, 45, 45, 45, 45, 1809, 45, 1811, 45, 45, 45, 45, 45, 67, 1610, 1611, 67, 1476, 0, 1478, 0, 1480, 0, 97, 97, 97, 97, 97, 97, 1618, 1647, 1649, 97, 97, 97, 1652, 97, 1654, 1655, 97, 0, 45, 45, 45, 1658, 45, 45, 67, 67, 216, 67, 67, 67, 67, 234, 67, 67, 67, 67, 252, 254, 1845, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 945, 45, 947, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1881, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 1902, 45, 45, 45, 45, 45, 45, 1908, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1921, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 0, 97, 1937, 97, 97, 1940, 0, 0, 97, 97, 97, 97, 97, 97, 1947, 1948, 1949, 45, 45, 45, 1952, 45, 1954, 45, 45, 45, 45, 1959, 1960, 1961, 67, 67, 67, 67, 67, 67, 1455, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 757, 67, 67, 67, 67, 67, 67, 1964, 67, 1966, 67, 67, 67, 67, 1971, 1972, 1973, 97, 0, 0, 0, 97, 97, 1104, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 884, 97, 97, 97, 889, 97, 97, 1978, 97, 0, 0, 1981, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 736, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1018, 67, 67, 67, 45, 67, 67, 67, 67, 0, 2049, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 0, 0, 925, 41606, 0, 0, 0, 0, 45, 933, 45, 45, 45, 45, 1234, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 97, 97, 288, 97, 97, 97, 97, 97, 97, 317, 97, 97, 97, 97, 97, 97, 0, 0, 97, 1787, 97, 97, 97, 97, 0, 0, 45, 45, 378, 45, 45, 45, 45, 45, 390, 45, 45, 45, 45, 45, 45, 45, 424, 45, 45, 45, 431, 433, 45, 45, 45, 67, 1050, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 518, 67, 97, 97, 97, 1144, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 632, 97, 97, 97, 97, 97, 97, 97, 1367, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 855, 97, 97, 97, 97, 67, 97, 97, 97, 97, 97, 97, 1837, 0, 97, 97, 97, 97, 97, 0, 0, 0, 1897, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 1208, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 724, 45, 45, 45, 45, 45, 97, 2010, 45, 45, 45, 45, 45, 45, 2016, 67, 67, 67, 67, 67, 67, 2022, 45, 2046, 67, 67, 67, 0, 0, 2050, 97, 97, 97, 45, 45, 67, 67, 0, 0, 0, 0, 925, 41606, 0, 0, 0, 0, 932, 45, 45, 45, 45, 45, 1222, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1227, 45, 45, 45, 45, 45, 133, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 45, 45, 701, 702, 45, 45, 705, 706, 45, 45, 45, 45, 45, 45, 703, 45, 45, 45, 45, 45, 45, 45, 45, 45, 719, 45, 45, 45, 45, 45, 725, 45, 45, 45, 369, 649, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1216, 25403, 546, 70179, 0, 0, 66365, 66365, 552, 834, 97, 97, 97, 97, 97, 97, 97, 1342, 97, 97, 97, 97, 97, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 1799, 97, 97, 45, 45, 45, 1569, 45, 45, 45, 1572, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 1306, 0, 67, 67, 67, 1598, 67, 67, 67, 67, 67, 67, 67, 67, 1606, 67, 67, 1609, 97, 97, 97, 1650, 97, 97, 1653, 97, 97, 97, 0, 45, 45, 1657, 45, 45, 45, 1206, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1421, 45, 45, 45, 1703, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 1711, 97, 97, 0, 1895, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 958, 45, 960, 45, 45, 45, 45, 45, 45, 45, 45, 1913, 45, 45, 1915, 67, 67, 67, 67, 67, 67, 67, 466, 67, 67, 67, 67, 67, 67, 481, 67, 45, 1749, 45, 45, 45, 45, 45, 45, 45, 45, 1755, 45, 45, 45, 45, 45, 173, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 974, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1773, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 1886, 0, 0, 0, 97, 97, 67, 2035, 2036, 67, 67, 97, 0, 0, 97, 2041, 2042, 97, 97, 45, 45, 45, 45, 1662, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1397, 45, 45, 45, 45, 151, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 437, 205, 45, 67, 67, 67, 218, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1047, 67, 67, 67, 67, 97, 97, 97, 97, 298, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 870, 97, 97, 97, 97, 97, 97, 97, 97, 352, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 0, 0, 0, 0, 0, 0, 365, 0, 41098, 0, 140, 45, 45, 45, 45, 45, 1427, 45, 45, 67, 67, 67, 67, 67, 67, 67, 1435, 520, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1037, 617, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 923, 45, 1232, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 1919, 67, 1759, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1021, 45, 154, 45, 162, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 964, 45, 45, 45, 206, 45, 67, 67, 67, 67, 221, 67, 229, 67, 67, 67, 67, 67, 67, 67, 67, 530, 67, 67, 67, 67, 67, 67, 67, 67, 755, 67, 67, 67, 67, 67, 67, 67, 67, 785, 67, 67, 67, 67, 67, 67, 67, 67, 802, 67, 67, 67, 807, 67, 67, 67, 97, 97, 97, 97, 353, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 0, 0, 0, 0, 0, 0, 366, 0, 0, 0, 140, 2170880, 2170880, 2170880, 2416640, 402, 45, 45, 45, 45, 45, 45, 45, 410, 45, 45, 45, 45, 45, 45, 45, 674, 45, 45, 45, 45, 45, 45, 45, 45, 389, 45, 394, 45, 45, 398, 45, 45, 45, 45, 441, 45, 45, 45, 45, 45, 447, 45, 45, 45, 454, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1768, 67, 67, 67, 67, 67, 488, 67, 67, 67, 67, 67, 67, 67, 496, 67, 67, 67, 67, 67, 67, 67, 1774, 67, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 67, 67, 523, 67, 67, 527, 67, 67, 67, 67, 67, 533, 67, 67, 67, 540, 97, 97, 97, 585, 97, 97, 97, 97, 97, 97, 97, 593, 97, 97, 97, 97, 97, 97, 1784, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 0, 18, 18, 24, 24, 0, 28, 28, 97, 97, 620, 97, 97, 624, 97, 97, 97, 97, 97, 630, 97, 97, 97, 637, 713, 45, 45, 45, 45, 45, 45, 721, 45, 45, 45, 45, 45, 45, 45, 45, 1197, 45, 45, 45, 45, 45, 45, 45, 45, 730, 732, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1581, 67, 45, 67, 67, 67, 67, 1012, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1059, 67, 67, 67, 67, 67, 1024, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 775, 67, 67, 67, 67, 1066, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 479, 67, 67, 67, 67, 67, 67, 1080, 67, 67, 67, 67, 37689, 0, 25403, 0, 66365, 0, 0, 0, 0, 0, 0, 0, 287, 0, 0, 0, 287, 0, 2379776, 2170880, 2170880, 97, 97, 97, 1118, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 920, 97, 97, 0, 0, 0, 0, 45, 1181, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 432, 45, 45, 45, 45, 45, 45, 1219, 45, 45, 45, 45, 45, 45, 1226, 45, 45, 45, 45, 45, 45, 959, 45, 45, 45, 45, 45, 45, 45, 45, 45, 184, 45, 45, 45, 45, 202, 45, 1241, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1266, 67, 1268, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1279, 67, 67, 67, 67, 67, 272, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 67, 67, 67, 67, 67, 1286, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1293, 67, 67, 67, 1296, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 281, 94, 0, 0, 97, 97, 97, 1366, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1373, 97, 97, 18, 0, 139621, 0, 0, 0, 0, 0, 0, 364, 0, 0, 367, 0, 97, 1376, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 1384, 45, 45, 67, 208, 67, 67, 67, 67, 67, 67, 237, 67, 67, 67, 67, 67, 67, 67, 1069, 1070, 67, 67, 67, 67, 67, 67, 67, 0, 37140, 24854, 0, 0, 0, 0, 41098, 65821, 45, 1423, 45, 45, 45, 45, 45, 45, 67, 67, 1431, 67, 67, 67, 67, 67, 67, 67, 1083, 37689, 0, 25403, 0, 66365, 0, 0, 0, 1436, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1830, 67, 1452, 1453, 67, 67, 67, 67, 1456, 67, 67, 67, 67, 67, 67, 67, 67, 67, 771, 67, 67, 67, 67, 67, 67, 1461, 67, 67, 67, 1464, 67, 1466, 67, 67, 67, 67, 67, 67, 1470, 67, 67, 67, 67, 67, 67, 1587, 67, 67, 67, 67, 67, 67, 67, 67, 1595, 1489, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1129, 97, 1505, 1506, 97, 97, 97, 97, 1510, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1163, 1164, 97, 97, 97, 97, 97, 1516, 97, 97, 97, 1519, 97, 1521, 97, 97, 97, 97, 97, 97, 1525, 97, 97, 18, 0, 139621, 0, 0, 0, 0, 0, 0, 364, 0, 0, 367, 41606, 67, 67, 67, 67, 67, 1586, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1276, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1600, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1301, 0, 0, 0, 1307, 97, 97, 1620, 97, 97, 97, 97, 97, 97, 97, 1627, 97, 97, 97, 97, 97, 97, 913, 97, 97, 97, 97, 919, 97, 97, 97, 0, 97, 97, 97, 1781, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 1792, 1860, 45, 1862, 1863, 45, 1865, 45, 67, 67, 67, 67, 67, 67, 67, 67, 1875, 67, 1877, 1878, 67, 1880, 67, 97, 97, 97, 97, 97, 1887, 0, 1889, 97, 97, 18, 0, 139621, 0, 0, 0, 0, 0, 0, 364, 237568, 0, 367, 0, 97, 1893, 0, 0, 0, 97, 1898, 1899, 97, 1901, 97, 45, 45, 45, 45, 45, 2014, 45, 67, 67, 67, 67, 67, 2020, 67, 97, 1989, 45, 1990, 45, 45, 45, 67, 67, 67, 67, 67, 67, 1996, 67, 1997, 67, 67, 67, 67, 67, 273, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 67, 67, 97, 97, 97, 97, 0, 0, 97, 97, 2005, 0, 97, 2007, 97, 97, 18, 0, 139621, 0, 0, 0, 642, 0, 133, 364, 0, 0, 367, 41606, 0, 97, 97, 2056, 2057, 0, 2059, 45, 67, 0, 97, 45, 67, 0, 97, 45, 45, 67, 209, 67, 67, 67, 223, 67, 67, 67, 67, 67, 67, 67, 67, 67, 786, 67, 67, 67, 791, 67, 67, 45, 45, 940, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 727, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 1016, 67, 67, 67, 67, 67, 67, 67, 67, 37689, 0, 25403, 0, 66365, 0, 0, 0, 133, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 142, 45, 45, 67, 210, 67, 67, 67, 225, 67, 67, 239, 67, 67, 67, 250, 67, 67, 67, 67, 67, 464, 67, 67, 67, 67, 67, 476, 67, 67, 67, 67, 67, 67, 67, 1709, 67, 67, 67, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 1843, 0, 67, 259, 67, 67, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 97, 97, 289, 97, 97, 97, 303, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 901, 97, 97, 97, 97, 97, 339, 97, 97, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 0, 358, 0, 0, 0, 0, 0, 0, 41098, 0, 140, 45, 45, 45, 45, 45, 1953, 45, 1955, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 1687, 1688, 67, 67, 67, 67, 45, 45, 405, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1203, 45, 458, 67, 67, 67, 67, 67, 67, 67, 67, 67, 470, 477, 67, 67, 67, 67, 67, 67, 67, 1970, 97, 97, 97, 1974, 0, 0, 0, 97, 1103, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1372, 97, 97, 97, 97, 67, 522, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 536, 67, 67, 67, 67, 67, 67, 1696, 67, 67, 67, 67, 67, 67, 67, 1701, 67, 555, 97, 97, 97, 97, 97, 97, 97, 97, 97, 567, 574, 97, 97, 97, 97, 97, 301, 97, 309, 97, 97, 97, 97, 97, 97, 97, 97, 97, 900, 97, 97, 97, 905, 97, 97, 97, 619, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 633, 97, 97, 18, 0, 139621, 0, 0, 362, 0, 0, 0, 364, 0, 0, 367, 41606, 369, 649, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 663, 664, 67, 67, 67, 67, 750, 751, 67, 67, 67, 67, 758, 67, 67, 67, 67, 67, 67, 67, 1272, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1057, 1058, 67, 67, 67, 67, 67, 67, 67, 67, 797, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 512, 67, 67, 67, 97, 97, 97, 97, 895, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 902, 97, 97, 97, 97, 67, 67, 1051, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1062, 67, 67, 67, 67, 67, 491, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1302, 0, 0, 0, 1308, 97, 97, 97, 97, 1145, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1139, 97, 97, 97, 97, 1156, 97, 97, 97, 97, 97, 97, 1161, 97, 97, 97, 97, 97, 1166, 97, 97, 18, 640, 139621, 0, 641, 0, 0, 0, 0, 364, 0, 0, 367, 41606, 67, 67, 67, 67, 1257, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 0, 1305, 0, 0, 97, 97, 1337, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1630, 97, 67, 1474, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2380062, 2171166, 2171166, 97, 1529, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1228, 45, 45, 45, 45, 67, 67, 67, 67, 1707, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 1891, 1739, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1198, 45, 1200, 45, 45, 45, 45, 97, 97, 1894, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 672, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1420, 45, 45, 45, 45, 67, 67, 1965, 67, 1967, 67, 67, 67, 97, 97, 97, 97, 0, 1976, 0, 97, 97, 45, 67, 0, 97, 45, 67, 0, 97, 45, 67, 0, 97, 45, 97, 97, 1979, 0, 0, 97, 1982, 97, 97, 97, 1986, 45, 45, 45, 45, 45, 735, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1770, 67, 67, 2000, 97, 97, 97, 2002, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 1798, 97, 97, 97, 45, 45, 45, 2034, 67, 67, 67, 67, 97, 0, 0, 2040, 97, 97, 97, 97, 45, 45, 45, 45, 1752, 45, 45, 45, 1753, 1754, 45, 45, 45, 45, 45, 45, 383, 45, 45, 45, 45, 45, 45, 45, 45, 45, 675, 45, 45, 45, 45, 45, 45, 438, 45, 45, 45, 45, 45, 445, 45, 45, 45, 45, 45, 45, 45, 45, 67, 1430, 67, 67, 67, 67, 67, 67, 67, 67, 67, 524, 67, 67, 67, 67, 67, 531, 67, 67, 67, 67, 67, 67, 67, 67, 37689, 0, 25403, 0, 66365, 0, 0, 1096, 97, 97, 97, 621, 97, 97, 97, 97, 97, 628, 97, 97, 97, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 356, 28, 28, 665, 45, 45, 45, 45, 45, 45, 45, 45, 45, 676, 45, 45, 45, 45, 45, 942, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 707, 708, 45, 45, 45, 45, 763, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 809, 810, 67, 67, 67, 67, 783, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 1303, 0, 0, 0, 97, 861, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 613, 97, 45, 45, 956, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1215, 45, 67, 67, 67, 67, 1027, 67, 67, 67, 67, 1032, 67, 67, 67, 67, 67, 67, 67, 67, 37689, 0, 25403, 0, 66365, 0, 0, 1097, 1064, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1075, 67, 1098, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 331, 97, 97, 97, 97, 1158, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 594, 97, 97, 1309, 0, 0, 0, 1315, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1374, 97, 45, 45, 1543, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1240, 67, 67, 1583, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1252, 67, 97, 97, 97, 1635, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 1800, 97, 45, 45, 45, 97, 97, 1793, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 1743, 45, 45, 45, 1746, 45, 0, 97, 97, 97, 97, 97, 1851, 97, 45, 45, 45, 45, 1856, 45, 45, 45, 45, 1864, 45, 45, 67, 67, 1869, 67, 67, 67, 67, 1874, 67, 0, 97, 97, 45, 67, 2058, 97, 45, 67, 0, 97, 45, 67, 0, 97, 45, 45, 67, 211, 67, 67, 67, 67, 67, 67, 240, 67, 67, 67, 67, 67, 67, 67, 1444, 67, 67, 67, 67, 67, 67, 67, 67, 67, 509, 67, 67, 67, 67, 67, 67, 67, 67, 67, 268, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 97, 97, 290, 97, 97, 97, 305, 97, 97, 319, 97, 97, 97, 330, 97, 97, 18, 640, 139621, 0, 641, 0, 0, 0, 0, 364, 0, 643, 367, 41606, 97, 97, 348, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 139621, 0, 0, 0, 0, 364, 0, 367, 41098, 369, 140, 45, 45, 45, 45, 380, 45, 45, 45, 45, 45, 45, 395, 45, 45, 45, 400, 369, 0, 45, 45, 45, 45, 45, 45, 45, 45, 658, 45, 45, 45, 45, 45, 972, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 427, 45, 45, 45, 45, 45, 745, 67, 67, 67, 67, 67, 67, 67, 67, 756, 67, 67, 67, 67, 67, 67, 67, 67, 37689, 1086, 25403, 1090, 66365, 1094, 0, 0, 97, 843, 97, 97, 97, 97, 97, 97, 97, 97, 854, 97, 97, 97, 97, 97, 97, 1121, 97, 97, 97, 97, 1126, 97, 97, 97, 97, 45, 980, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1400, 45, 67, 67, 67, 1011, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 1304, 0, 0, 0, 1190, 45, 45, 1193, 1194, 45, 45, 45, 45, 45, 1199, 45, 1201, 45, 45, 45, 45, 1911, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 1579, 67, 67, 67, 67, 45, 1205, 45, 45, 45, 45, 45, 45, 45, 45, 1211, 45, 45, 45, 45, 45, 984, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1550, 45, 45, 45, 45, 45, 1217, 45, 45, 45, 45, 45, 45, 1225, 45, 45, 45, 45, 1229, 45, 45, 45, 1388, 45, 45, 45, 45, 45, 45, 1396, 45, 45, 45, 45, 45, 444, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 1574, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1590, 67, 67, 67, 67, 67, 1254, 67, 67, 67, 67, 67, 1259, 67, 1261, 67, 67, 67, 67, 1265, 67, 67, 67, 67, 67, 67, 1708, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 0, 0, 67, 67, 67, 67, 1285, 67, 67, 67, 67, 1289, 67, 67, 67, 67, 67, 67, 67, 67, 37689, 1087, 25403, 1091, 66365, 1095, 0, 0, 97, 97, 97, 97, 1339, 97, 1341, 97, 97, 97, 97, 1345, 97, 97, 97, 97, 97, 561, 97, 97, 97, 97, 97, 573, 97, 97, 97, 97, 97, 97, 1717, 97, 0, 97, 97, 97, 97, 97, 97, 97, 591, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1329, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1351, 97, 97, 97, 97, 97, 97, 1357, 97, 97, 97, 97, 97, 588, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 568, 97, 97, 97, 97, 97, 97, 97, 1365, 97, 97, 97, 97, 1369, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1356, 97, 97, 97, 97, 97, 97, 45, 45, 1403, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1399, 45, 45, 45, 1413, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1669, 45, 1422, 45, 45, 1425, 45, 45, 1428, 45, 1429, 67, 67, 67, 67, 67, 67, 67, 67, 1468, 67, 67, 67, 67, 67, 67, 67, 67, 529, 67, 67, 67, 67, 67, 67, 539, 67, 67, 1475, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 2170880, 2170880, 2170880, 2416640, 97, 97, 1530, 97, 0, 45, 45, 1534, 45, 45, 45, 45, 45, 45, 45, 45, 1956, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1599, 67, 67, 1601, 67, 67, 67, 67, 67, 67, 67, 67, 67, 803, 67, 67, 67, 67, 67, 67, 1632, 97, 1634, 0, 97, 97, 97, 1640, 97, 97, 97, 1643, 97, 97, 1645, 97, 97, 97, 97, 97, 912, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 45, 45, 45, 1660, 1661, 45, 45, 45, 45, 1665, 1666, 45, 45, 45, 45, 45, 1670, 1692, 1693, 67, 67, 67, 67, 67, 1697, 67, 67, 67, 67, 67, 67, 67, 1702, 97, 97, 1714, 1715, 97, 97, 97, 97, 0, 1721, 1722, 97, 97, 97, 97, 97, 97, 1353, 97, 97, 97, 97, 97, 97, 97, 97, 1362, 1726, 97, 0, 0, 97, 97, 97, 0, 97, 97, 97, 1734, 97, 97, 97, 97, 97, 848, 849, 97, 97, 97, 97, 856, 97, 97, 97, 97, 97, 354, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 45, 45, 1750, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1681, 45, 0, 1846, 97, 97, 97, 97, 97, 97, 45, 45, 1854, 45, 45, 45, 45, 1859, 67, 67, 67, 1879, 67, 67, 97, 97, 1884, 97, 97, 0, 0, 0, 97, 97, 97, 1105, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1344, 97, 97, 97, 1347, 97, 1892, 97, 0, 0, 0, 97, 97, 97, 1900, 97, 97, 45, 45, 45, 45, 45, 997, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1002, 45, 45, 1005, 1006, 45, 67, 67, 67, 67, 67, 1926, 67, 67, 1928, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 1737, 97, 0, 97, 97, 97, 97, 0, 0, 0, 97, 97, 1944, 97, 97, 1946, 45, 45, 45, 1544, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 190, 45, 45, 45, 152, 155, 45, 163, 45, 45, 177, 179, 182, 45, 45, 45, 193, 197, 45, 45, 45, 1672, 45, 45, 45, 45, 45, 1677, 45, 1679, 45, 45, 45, 45, 996, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1212, 45, 45, 45, 45, 67, 260, 264, 67, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 97, 97, 97, 295, 299, 302, 97, 310, 97, 97, 324, 326, 329, 97, 97, 97, 0, 97, 97, 1639, 0, 1641, 97, 97, 97, 97, 97, 97, 97, 97, 1511, 97, 97, 97, 97, 97, 97, 97, 97, 1523, 97, 97, 97, 97, 97, 97, 97, 97, 1719, 97, 97, 97, 97, 97, 97, 97, 97, 1720, 97, 97, 97, 97, 97, 97, 97, 312, 97, 97, 97, 97, 97, 97, 97, 97, 1123, 97, 97, 97, 97, 97, 97, 97, 340, 344, 97, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 139621, 0, 0, 0, 0, 364, 0, 367, 41098, 369, 140, 45, 45, 373, 375, 419, 45, 45, 45, 45, 45, 45, 45, 45, 45, 428, 45, 45, 435, 45, 45, 45, 1751, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1410, 45, 45, 45, 67, 67, 67, 505, 67, 67, 67, 67, 67, 67, 67, 67, 67, 514, 67, 67, 67, 67, 67, 67, 1969, 67, 97, 97, 97, 97, 0, 0, 0, 97, 97, 45, 67, 0, 97, 45, 67, 0, 97, 2064, 2065, 0, 2066, 45, 521, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 534, 67, 67, 67, 67, 67, 67, 465, 67, 67, 67, 474, 67, 67, 67, 67, 67, 67, 67, 1467, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 1933, 0, 97, 97, 97, 602, 97, 97, 97, 97, 97, 97, 97, 97, 97, 611, 97, 97, 18, 640, 139621, 358, 641, 0, 0, 0, 0, 364, 0, 0, 367, 0, 618, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 631, 97, 97, 97, 97, 97, 881, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 569, 97, 97, 97, 97, 97, 369, 0, 45, 652, 45, 45, 45, 45, 45, 657, 45, 45, 45, 45, 45, 45, 1235, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 1432, 67, 67, 67, 67, 67, 67, 67, 766, 67, 67, 67, 67, 67, 67, 67, 67, 773, 67, 67, 67, 0, 1305, 0, 1311, 0, 1317, 97, 97, 97, 97, 97, 97, 97, 1624, 97, 97, 97, 97, 97, 97, 97, 97, 0, 97, 97, 97, 1724, 97, 97, 97, 777, 67, 67, 782, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 535, 67, 67, 67, 67, 67, 67, 67, 814, 67, 67, 67, 67, 67, 67, 67, 67, 67, 37689, 544, 25403, 546, 70179, 0, 0, 66365, 66365, 552, 0, 97, 837, 97, 97, 97, 97, 97, 97, 1496, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 918, 97, 97, 97, 97, 0, 842, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1168, 97, 97, 97, 97, 864, 97, 97, 97, 97, 97, 97, 97, 97, 871, 97, 97, 97, 0, 1637, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1801, 45, 45, 97, 875, 97, 97, 880, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1151, 1152, 97, 97, 97, 67, 67, 67, 1040, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 790, 67, 67, 67, 1180, 0, 649, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 200, 45, 45, 67, 67, 67, 1454, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 806, 67, 67, 67, 0, 0, 0, 1481, 0, 1094, 0, 0, 97, 1483, 97, 97, 97, 97, 97, 97, 304, 97, 97, 318, 97, 97, 97, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 97, 97, 97, 1507, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1332, 97, 97, 97, 1619, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1631, 97, 1633, 97, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1381, 0, 0, 45, 45, 45, 45, 97, 97, 1727, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 626, 97, 97, 97, 97, 97, 97, 636, 45, 45, 1760, 67, 67, 67, 67, 67, 67, 67, 1765, 67, 67, 67, 67, 67, 67, 67, 1299, 67, 67, 67, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 1616, 97, 97, 1803, 45, 45, 45, 45, 1807, 45, 45, 45, 45, 45, 1813, 45, 45, 45, 67, 67, 1684, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 822, 67, 67, 37689, 544, 67, 67, 1818, 67, 67, 67, 67, 1822, 67, 67, 67, 67, 67, 1828, 67, 67, 67, 67, 67, 97, 0, 0, 97, 97, 97, 97, 97, 45, 45, 45, 2012, 2013, 45, 45, 67, 67, 67, 2018, 2019, 67, 67, 97, 67, 97, 97, 97, 1833, 97, 97, 0, 0, 97, 97, 1840, 97, 97, 0, 0, 97, 97, 97, 0, 97, 97, 1733, 97, 1735, 97, 97, 97, 0, 97, 97, 97, 1849, 97, 97, 97, 45, 45, 45, 45, 45, 1857, 45, 45, 45, 1910, 45, 1912, 45, 45, 1914, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1017, 67, 67, 1020, 67, 45, 1861, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1872, 67, 67, 67, 67, 67, 67, 752, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1446, 67, 67, 67, 67, 67, 1876, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 1890, 97, 97, 97, 97, 97, 1134, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 570, 97, 97, 97, 97, 580, 1935, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 1906, 45, 67, 67, 67, 67, 2048, 0, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 0, 0, 925, 41606, 0, 0, 0, 931, 45, 45, 45, 45, 45, 45, 1674, 45, 1676, 45, 45, 45, 45, 45, 45, 45, 446, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 1871, 67, 67, 67, 67, 0, 97, 97, 45, 67, 0, 97, 2060, 2061, 0, 2063, 45, 67, 0, 97, 45, 45, 156, 45, 45, 45, 45, 45, 45, 45, 45, 45, 192, 45, 45, 45, 45, 1673, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 429, 45, 45, 45, 45, 67, 67, 67, 269, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 97, 97, 349, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 139621, 0, 0, 0, 0, 364, 0, 367, 41098, 369, 140, 45, 45, 374, 45, 45, 67, 67, 213, 217, 67, 67, 67, 67, 67, 242, 67, 247, 67, 253, 45, 45, 698, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 399, 45, 45, 0, 0, 0, 0, 925, 41606, 0, 929, 0, 0, 45, 45, 45, 45, 45, 45, 1391, 45, 45, 1395, 45, 45, 45, 45, 45, 45, 423, 45, 45, 45, 45, 45, 45, 45, 436, 45, 67, 67, 67, 67, 1041, 67, 1043, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1776, 67, 67, 97, 97, 97, 1099, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 888, 97, 97, 97, 1131, 97, 97, 97, 97, 1135, 97, 1137, 97, 97, 97, 97, 97, 97, 97, 1497, 97, 97, 97, 97, 97, 97, 97, 97, 97, 883, 97, 97, 97, 97, 97, 97, 1310, 0, 0, 0, 1316, 0, 0, 0, 0, 1100, 0, 0, 0, 97, 97, 97, 97, 97, 1107, 97, 97, 97, 97, 97, 97, 97, 97, 1343, 97, 97, 97, 97, 97, 97, 1348, 0, 0, 1317, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1112, 97, 45, 1804, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 1868, 67, 1870, 67, 67, 67, 67, 67, 1817, 67, 67, 1819, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 823, 67, 37689, 544, 67, 97, 1832, 97, 97, 1834, 97, 0, 0, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 0, 1732, 97, 97, 97, 97, 97, 97, 97, 850, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1177, 0, 0, 925, 0, 0, 0, 0, 97, 97, 97, 97, 0, 0, 1941, 97, 97, 97, 97, 97, 97, 45, 45, 45, 1991, 1992, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1998, 134, 0, 0, 0, 37, 110630, 0, 0, 0, 114730, 106539, 41098, 45, 45, 45, 45, 941, 45, 45, 944, 45, 45, 45, 45, 45, 45, 952, 45, 45, 207, 67, 67, 67, 67, 67, 226, 67, 67, 67, 67, 67, 67, 67, 67, 67, 820, 67, 67, 67, 67, 37689, 544, 369, 650, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1682, 25403, 546, 70179, 0, 0, 66365, 66365, 552, 835, 97, 97, 97, 97, 97, 97, 97, 1522, 97, 97, 97, 97, 97, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 1725, 67, 67, 67, 1695, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1034, 67, 1036, 67, 67, 67, 265, 67, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 97, 97, 97, 296, 97, 97, 97, 97, 314, 97, 97, 97, 97, 332, 334, 97, 97, 97, 97, 97, 1146, 1147, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1626, 97, 97, 97, 97, 97, 97, 345, 97, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 139621, 0, 0, 0, 0, 364, 0, 367, 41098, 369, 140, 45, 372, 45, 45, 45, 1220, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1213, 45, 45, 45, 45, 404, 406, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 434, 45, 45, 45, 440, 45, 45, 45, 45, 45, 45, 45, 45, 451, 452, 45, 45, 45, 67, 1683, 67, 67, 67, 1686, 67, 67, 67, 67, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 67, 67, 67, 67, 490, 492, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1447, 67, 67, 1450, 67, 67, 67, 67, 67, 526, 67, 67, 67, 67, 67, 67, 67, 67, 537, 538, 67, 67, 67, 67, 67, 506, 67, 67, 508, 67, 67, 511, 67, 67, 67, 67, 0, 1476, 0, 0, 0, 0, 0, 1478, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 1484, 97, 97, 97, 97, 97, 97, 865, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1499, 97, 97, 97, 97, 97, 97, 97, 97, 97, 587, 589, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 629, 97, 97, 97, 97, 97, 97, 97, 97, 97, 623, 97, 97, 97, 97, 97, 97, 97, 97, 634, 635, 97, 97, 97, 97, 97, 1160, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1628, 97, 97, 97, 97, 369, 0, 45, 45, 45, 45, 45, 655, 45, 45, 45, 45, 45, 45, 45, 45, 999, 45, 1001, 45, 45, 45, 45, 45, 45, 45, 45, 715, 45, 45, 45, 720, 45, 45, 45, 45, 45, 45, 45, 45, 728, 25403, 546, 70179, 0, 0, 66365, 66365, 552, 0, 97, 97, 97, 97, 97, 840, 97, 97, 97, 97, 97, 1174, 97, 97, 97, 97, 0, 0, 925, 0, 0, 0, 0, 0, 0, 0, 1100, 97, 97, 97, 97, 97, 97, 97, 97, 627, 97, 97, 97, 97, 97, 97, 97, 938, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 680, 45, 968, 45, 970, 45, 973, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 962, 45, 45, 45, 45, 45, 979, 45, 45, 45, 45, 45, 985, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1224, 45, 45, 45, 45, 45, 45, 45, 45, 688, 45, 45, 45, 45, 45, 45, 45, 1007, 1008, 67, 67, 67, 67, 67, 1014, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1045, 67, 67, 67, 67, 67, 67, 67, 1038, 67, 67, 67, 67, 67, 67, 1044, 67, 1046, 67, 1049, 67, 67, 67, 67, 67, 67, 800, 67, 67, 67, 67, 67, 67, 808, 67, 67, 0, 0, 0, 1102, 97, 97, 97, 97, 97, 1108, 97, 97, 97, 97, 97, 97, 306, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1371, 97, 97, 97, 97, 97, 97, 97, 97, 1132, 97, 97, 97, 97, 97, 97, 1138, 97, 1140, 97, 1143, 97, 97, 97, 97, 97, 1352, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 869, 97, 97, 97, 97, 97, 45, 1191, 45, 45, 45, 45, 45, 1196, 45, 45, 45, 45, 45, 45, 45, 45, 1407, 45, 45, 45, 45, 45, 45, 45, 45, 986, 45, 45, 45, 45, 45, 45, 991, 45, 67, 67, 67, 1256, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1048, 67, 67, 67, 97, 1336, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 615, 97, 1386, 45, 1387, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 455, 45, 457, 45, 45, 1424, 45, 45, 45, 45, 45, 67, 67, 67, 67, 1433, 67, 1434, 67, 67, 67, 67, 67, 767, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1591, 67, 1593, 67, 67, 45, 45, 1805, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1814, 45, 45, 1816, 67, 67, 67, 67, 1820, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1829, 67, 67, 67, 67, 67, 815, 67, 67, 67, 67, 821, 67, 67, 67, 37689, 544, 67, 1831, 97, 97, 97, 97, 1835, 0, 0, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 1731, 97, 97, 97, 97, 97, 97, 97, 97, 97, 853, 97, 97, 97, 97, 97, 97, 0, 97, 97, 97, 97, 1850, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 1547, 45, 45, 45, 45, 45, 45, 45, 45, 1664, 45, 45, 45, 45, 45, 45, 45, 45, 961, 45, 45, 45, 45, 965, 45, 967, 1907, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1920, 0, 1936, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 67, 67, 67, 67, 67, 67, 1763, 67, 67, 67, 67, 67, 67, 67, 67, 1056, 67, 67, 67, 67, 67, 67, 67, 67, 1273, 67, 67, 67, 67, 67, 67, 67, 67, 1457, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 28672, 97, 45, 67, 67, 67, 67, 0, 0, 97, 97, 97, 97, 45, 45, 67, 67, 2054, 97, 97, 291, 97, 97, 97, 97, 97, 97, 320, 97, 97, 97, 97, 97, 97, 307, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 12288, 0, 925, 926, 1179, 0, 45, 377, 45, 45, 45, 381, 45, 45, 392, 45, 45, 396, 45, 45, 45, 45, 971, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1756, 45, 45, 45, 67, 67, 67, 67, 463, 67, 67, 67, 467, 67, 67, 478, 67, 67, 482, 67, 67, 67, 67, 67, 1028, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1469, 67, 67, 1472, 67, 502, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1460, 67, 97, 97, 97, 97, 560, 97, 97, 97, 564, 97, 97, 575, 97, 97, 579, 97, 97, 97, 97, 97, 1368, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 925, 0, 0, 930, 97, 599, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 872, 97, 45, 666, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1758, 0, 362, 0, 0, 925, 41606, 0, 0, 0, 0, 45, 45, 934, 45, 45, 45, 164, 168, 174, 178, 45, 45, 45, 45, 45, 194, 45, 45, 45, 165, 45, 45, 45, 45, 45, 45, 45, 45, 45, 199, 45, 45, 45, 67, 67, 1010, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1060, 67, 67, 67, 67, 67, 67, 1052, 1053, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1063, 97, 1157, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1167, 97, 97, 97, 97, 97, 1379, 97, 97, 97, 0, 0, 0, 45, 1383, 45, 45, 45, 1806, 45, 45, 45, 45, 45, 45, 1812, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1577, 67, 67, 67, 67, 67, 67, 67, 753, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1262, 67, 67, 67, 67, 67, 67, 67, 1282, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1471, 67, 45, 1402, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 417, 45, 67, 1462, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 37689, 544, 97, 1517, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1128, 97, 97, 97, 97, 1636, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 851, 97, 97, 97, 97, 97, 97, 97, 67, 67, 1705, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 1842, 0, 0, 1779, 97, 97, 97, 1782, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 1789, 97, 97, 0, 0, 0, 97, 1847, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 1675, 45, 45, 45, 45, 45, 45, 45, 45, 737, 738, 67, 740, 67, 741, 67, 743, 67, 67, 67, 67, 67, 67, 1968, 67, 67, 97, 97, 97, 97, 0, 0, 0, 97, 97, 45, 67, 0, 97, 45, 67, 2062, 97, 45, 67, 0, 97, 45, 67, 67, 97, 97, 2001, 97, 0, 0, 2004, 97, 97, 0, 97, 97, 97, 97, 1797, 97, 97, 97, 97, 97, 45, 45, 45, 67, 261, 67, 67, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 97, 97, 292, 97, 97, 97, 97, 311, 315, 321, 325, 97, 97, 97, 97, 97, 97, 1623, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1330, 97, 97, 1333, 1334, 97, 341, 97, 97, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 139621, 0, 0, 0, 363, 364, 0, 367, 41098, 369, 140, 45, 45, 45, 45, 1221, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 413, 45, 45, 416, 45, 376, 45, 45, 45, 45, 382, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1408, 45, 45, 45, 45, 45, 403, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 414, 45, 45, 45, 418, 67, 67, 67, 462, 67, 67, 67, 67, 468, 67, 67, 67, 67, 67, 67, 67, 67, 1602, 67, 1604, 67, 67, 67, 67, 67, 67, 67, 67, 489, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 500, 67, 67, 67, 67, 67, 1067, 67, 67, 67, 67, 67, 1072, 67, 67, 67, 67, 67, 67, 274, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 67, 67, 504, 67, 67, 67, 67, 67, 67, 67, 510, 67, 67, 67, 517, 519, 541, 67, 37139, 37139, 24853, 24853, 0, 70179, 0, 0, 0, 65820, 65820, 369, 287, 554, 97, 97, 97, 559, 97, 97, 97, 97, 565, 97, 97, 97, 97, 97, 97, 97, 1718, 0, 97, 97, 97, 97, 97, 97, 97, 898, 97, 97, 97, 97, 97, 97, 906, 97, 97, 97, 97, 586, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 597, 97, 97, 97, 97, 97, 1520, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 45, 1656, 45, 45, 45, 97, 97, 601, 97, 97, 97, 97, 97, 97, 97, 607, 97, 97, 97, 614, 616, 638, 97, 18, 0, 139621, 0, 0, 0, 0, 0, 0, 364, 0, 0, 367, 41606, 369, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 661, 45, 45, 45, 407, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1815, 45, 67, 45, 667, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 678, 45, 45, 45, 421, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 976, 977, 45, 45, 45, 682, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 693, 45, 45, 697, 67, 67, 748, 67, 67, 67, 67, 754, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1274, 67, 67, 67, 67, 67, 67, 67, 67, 765, 67, 67, 67, 67, 769, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1589, 67, 67, 67, 67, 67, 67, 67, 67, 780, 67, 67, 784, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1777, 67, 97, 97, 97, 97, 97, 97, 846, 97, 97, 97, 97, 852, 97, 97, 97, 97, 97, 97, 97, 1742, 45, 45, 45, 45, 45, 45, 45, 1747, 97, 97, 97, 863, 97, 97, 97, 97, 867, 97, 97, 97, 97, 97, 97, 97, 308, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 12288, 1178, 925, 0, 1179, 0, 97, 97, 97, 878, 97, 97, 882, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 12288, 0, 925, 0, 1179, 0, 908, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 925, 0, 0, 0, 954, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 963, 45, 45, 966, 45, 45, 157, 45, 45, 171, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 948, 45, 45, 45, 45, 45, 1022, 67, 67, 1026, 67, 67, 67, 1030, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1603, 1605, 67, 67, 67, 1608, 67, 67, 67, 1039, 67, 67, 1042, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 471, 67, 67, 67, 67, 67, 0, 1100, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 904, 97, 97, 97, 97, 1116, 97, 97, 1120, 97, 97, 97, 1124, 97, 97, 97, 97, 97, 97, 562, 97, 97, 97, 571, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1133, 97, 97, 1136, 97, 97, 97, 97, 97, 97, 97, 97, 915, 917, 97, 97, 97, 97, 97, 0, 97, 1170, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 925, 0, 0, 0, 0, 0, 41606, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 1993, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1275, 67, 67, 67, 1278, 67, 0, 0, 0, 45, 45, 1182, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1189, 1204, 45, 45, 45, 1207, 45, 45, 1209, 45, 1210, 45, 45, 45, 45, 45, 45, 1546, 45, 45, 45, 45, 45, 45, 45, 45, 45, 689, 45, 45, 45, 45, 45, 45, 1231, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 236, 67, 67, 67, 67, 67, 67, 67, 801, 67, 67, 67, 805, 67, 67, 67, 67, 67, 1242, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1249, 67, 67, 67, 67, 67, 67, 507, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1300, 0, 0, 0, 0, 0, 1267, 67, 67, 1269, 67, 1270, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1280, 97, 1349, 97, 1350, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1360, 97, 97, 97, 0, 1980, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 673, 45, 45, 45, 45, 677, 45, 45, 45, 45, 1401, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 953, 67, 1437, 67, 1440, 67, 67, 67, 67, 1445, 67, 67, 67, 1448, 67, 67, 67, 67, 67, 67, 1029, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1825, 67, 67, 67, 67, 67, 1473, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1320, 0, 834, 97, 97, 97, 97, 1490, 97, 1493, 97, 97, 97, 97, 1498, 97, 97, 97, 1501, 97, 97, 97, 0, 97, 1638, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 916, 97, 97, 97, 97, 97, 97, 0, 1528, 97, 97, 97, 0, 45, 45, 45, 1535, 45, 45, 45, 45, 45, 45, 45, 1867, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 1932, 0, 0, 1555, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1567, 45, 45, 158, 45, 45, 172, 45, 45, 45, 183, 45, 45, 45, 45, 201, 45, 45, 67, 212, 67, 67, 67, 67, 231, 235, 241, 245, 67, 67, 67, 67, 67, 67, 493, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 472, 67, 67, 67, 67, 67, 97, 97, 97, 97, 1651, 97, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 1539, 45, 45, 45, 67, 1704, 67, 1706, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 1841, 97, 0, 1844, 97, 97, 97, 97, 1716, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 590, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 1385, 1748, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1757, 45, 45, 159, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 415, 45, 45, 97, 97, 1780, 97, 97, 97, 0, 0, 1786, 97, 97, 97, 97, 97, 0, 0, 97, 97, 1730, 0, 97, 97, 97, 97, 97, 1736, 97, 1738, 67, 97, 97, 97, 97, 97, 97, 0, 1838, 97, 97, 97, 97, 97, 0, 0, 97, 1729, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 1162, 97, 97, 97, 1165, 97, 97, 97, 45, 1950, 45, 45, 45, 45, 45, 45, 45, 45, 1958, 67, 67, 67, 1962, 67, 67, 67, 67, 67, 1246, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 1710, 97, 97, 97, 1999, 67, 97, 97, 97, 97, 0, 2003, 97, 97, 97, 0, 97, 97, 2008, 2009, 45, 67, 67, 67, 67, 0, 0, 97, 97, 97, 97, 45, 2052, 67, 2053, 0, 0, 0, 0, 925, 41606, 0, 0, 930, 0, 45, 45, 45, 45, 45, 45, 1392, 45, 1394, 45, 45, 45, 45, 45, 45, 45, 1545, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1563, 1565, 45, 45, 45, 1568, 0, 97, 2055, 45, 67, 0, 97, 45, 67, 0, 97, 45, 67, 28672, 97, 45, 45, 160, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 679, 45, 45, 67, 67, 266, 67, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 97, 346, 97, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 139621, 0, 0, 362, 0, 364, 0, 367, 41098, 369, 140, 371, 45, 45, 45, 379, 45, 45, 45, 388, 45, 45, 45, 45, 45, 45, 45, 45, 1663, 45, 45, 45, 45, 45, 45, 45, 45, 45, 449, 45, 45, 45, 45, 45, 67, 67, 542, 37139, 37139, 24853, 24853, 0, 70179, 0, 0, 0, 65820, 65820, 369, 287, 97, 97, 97, 97, 97, 1622, 97, 97, 97, 97, 97, 97, 97, 1629, 97, 97, 0, 1794, 1795, 97, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1745, 45, 45, 97, 639, 18, 0, 139621, 0, 0, 0, 0, 0, 0, 364, 0, 0, 367, 41606, 45, 731, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 251, 67, 67, 67, 67, 67, 798, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1073, 67, 67, 67, 860, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 873, 0, 0, 1101, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 921, 97, 0, 67, 67, 67, 67, 1245, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1250, 67, 67, 1253, 0, 0, 1312, 0, 0, 0, 1318, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 1106, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1149, 97, 97, 97, 97, 97, 1155, 97, 97, 1325, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1141, 97, 97, 67, 67, 1439, 67, 1441, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1264, 67, 67, 67, 97, 97, 1492, 97, 1494, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1331, 97, 97, 97, 97, 67, 67, 67, 2037, 67, 97, 0, 0, 97, 97, 97, 2043, 97, 45, 45, 45, 442, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 232, 67, 67, 67, 67, 67, 67, 67, 67, 1823, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 1975, 0, 0, 97, 874, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1142, 97, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 65, 86, 117, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 63, 84, 115, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 61, 82, 113, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 59, 80, 111, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 57, 78, 109, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 55, 76, 107, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 53, 74, 105, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 51, 72, 103, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 49, 70, 101, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 47, 68, 99, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 45, 67, 97, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 213085, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 0, 0, 44, 0, 0, 32863, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 41, 41, 41, 0, 0, 1138688, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 0, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 89, 53264, 18, 18, 49172, 0, 57366, 0, 24, 24, 24, 0, 127, 127, 127, 127, 102432, 67, 262, 67, 67, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 342, 97, 97, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 139621, 0, 360, 0, 0, 364, 0, 367, 41098, 369, 140, 45, 45, 45, 45, 717, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 412, 45, 45, 45, 45, 45, 67, 1009, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1292, 67, 67, 1294, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 97, 97, 97, 1615, 97, 97, 97, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 66, 87, 118, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 64, 85, 116, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 62, 83, 114, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 60, 81, 112, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 58, 79, 110, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 56, 77, 108, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 54, 75, 106, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 52, 73, 104, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 50, 71, 102, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 48, 69, 100, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 37, 110630, 114730, 106539, 46, 67, 98, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 233472, 53264, 18, 49172, 57366, 24, 8192, 28, 102432, 0, 110630, 114730, 106539, 0, 0, 69724, 53264, 18, 18, 49172, 0, 57366, 262144, 24, 24, 24, 0, 28, 28, 28, 28, 102432, 45, 45, 161, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 710, 45, 45, 28, 139621, 359, 0, 0, 0, 364, 0, 367, 41098, 369, 140, 45, 45, 45, 45, 1389, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 949, 45, 45, 45, 45, 67, 503, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1449, 67, 67, 97, 600, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1154, 97, 0, 0, 0, 0, 925, 41606, 927, 0, 0, 0, 45, 45, 45, 45, 45, 45, 1866, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 772, 67, 67, 67, 67, 67, 45, 45, 969, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 951, 45, 45, 45, 45, 1192, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1202, 45, 45, 0, 0, 0, 1314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 1488, 67, 67, 267, 67, 67, 67, 67, 0, 37139, 24853, 0, 0, 0, 0, 41098, 65820, 97, 347, 97, 97, 97, 97, 0, 53264, 0, 18, 18, 24, 24, 0, 28, 28, 139621, 0, 361, 0, 0, 364, 0, 367, 41098, 369, 140, 45, 45, 45, 45, 734, 45, 45, 45, 67, 67, 67, 67, 67, 742, 67, 67, 45, 45, 668, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1214, 45, 45, 1130, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1361, 97, 45, 45, 1671, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1552, 45, 45, 0, 0, 0, 0, 2220032, 0, 0, 1130496, 0, 0, 0, 0, 2170880, 2171020, 2170880, 2170880, 18, 0, 0, 131072, 0, 0, 0, 90112, 0, 2220032, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 1485, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 1537, 45, 45, 45, 45, 45, 1390, 45, 1393, 45, 45, 45, 45, 1398, 45, 45, 45, 2170880, 2171167, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2576384, 2215936, 3117056, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 0, 0, 0, 0, 0, 0, 2174976, 0, 0, 0, 0, 0, 0, 2183168, 0, 0, 0, 0, 2170880, 2170880, 2170880, 2400256, 2170880, 2170880, 2170880, 2170880, 2721252, 2744320, 2170880, 2170880, 2170880, 2834432, 2840040, 2170880, 2908160, 2170880, 2170880, 2936832, 2170880, 2170880, 2985984, 2170880, 2994176, 2170880, 2170880, 3014656, 2170880, 3059712, 3076096, 3088384, 2170880, 2170880, 2170880, 2170880, 0, 0, 0, 0, 2220032, 0, 0, 0, 1142784, 0, 0, 0, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3215360, 2215936, 2215936, 2215936, 2215936, 2215936, 2437120, 2215936, 2215936, 2215936, 3117056, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 2215936, 0, 543, 0, 545, 0, 0, 2183168, 0, 0, 831, 0, 2170880, 2170880, 2170880, 2400256, 2170880, 2170880, 2170880, 2170880, 3031040, 2170880, 3055616, 2170880, 2170880, 2170880, 2170880, 3092480, 2170880, 2170880, 3125248, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 2170880, 3198976, 2170880, 0, 0, 0, 0, 0, 0, 67, 67, 37139, 37139, 24853, 24853, 0, 0, 0, 0, 0, 65820, 65820, 0, 287, 97, 97, 97, 97, 97, 1783, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 1791, 0, 0, 546, 70179, 0, 0, 0, 0, 552, 0, 97, 97, 97, 97, 97, 97, 97, 604, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1150, 97, 97, 97, 97, 97, 147456, 147456, 147456, 147456, 147456, 147456, 147456, 147456, 147456, 147456, 147456, 147456, 0, 0, 147456, 0, 0, 0, 0, 925, 41606, 0, 928, 0, 0, 45, 45, 45, 45, 45, 45, 998, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1562, 45, 1564, 45, 45, 45, 45, 0, 2158592, 2158592, 0, 0, 0, 0, 2232320, 2232320, 2232320, 0, 2240512, 2240512, 2240512, 2240512, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2170880, 2170880, 2170880, 2416640\n];\n\nJSONiqTokenizer.EXPECTED =\n[ 291, 300, 304, 341, 315, 309, 305, 295, 319, 323, 327, 329, 296, 333, 337, 339, 342, 346, 350, 294, 356, 360, 312, 367, 352, 371, 363, 375, 379, 383, 387, 391, 395, 726, 399, 405, 518, 684, 405, 405, 405, 405, 808, 405, 405, 405, 512, 405, 405, 405, 431, 405, 405, 406, 405, 405, 404, 405, 405, 405, 405, 405, 405, 405, 908, 631, 410, 415, 405, 414, 419, 608, 405, 429, 602, 405, 435, 443, 405, 441, 641, 478, 405, 447, 451, 450, 456, 643, 461, 460, 762, 679, 465, 469, 741, 473, 477, 482, 486, 492, 932, 931, 523, 498, 504, 720, 405, 510, 596, 405, 516, 941, 580, 522, 929, 527, 590, 589, 897, 939, 534, 538, 547, 551, 555, 559, 563, 567, 571, 969, 575, 708, 690, 689, 579, 584, 634, 405, 594, 731, 405, 600, 882, 405, 606, 895, 786, 452, 612, 405, 615, 620, 876, 624, 628, 638, 647, 651, 655, 659, 663, 667, 676, 683, 688, 695, 694, 791, 405, 699, 437, 405, 706, 714, 405, 712, 825, 870, 405, 718, 724, 769, 768, 823, 730, 735, 745, 751, 422, 755, 759, 425, 766, 902, 810, 587, 775, 888, 887, 405, 773, 992, 405, 779, 962, 405, 785, 781, 986, 790, 795, 797, 506, 500, 499, 801, 805, 814, 820, 829, 833, 837, 841, 845, 849, 853, 857, 861, 616, 865, 869, 868, 488, 405, 874, 816, 405, 880, 738, 405, 886, 892, 543, 405, 901, 906, 913, 912, 918, 494, 541, 922, 926, 936, 945, 949, 953, 957, 530, 966, 973, 960, 702, 701, 405, 979, 981, 405, 985, 747, 405, 990, 998, 914, 405, 996, 1004, 672, 975, 974, 1014, 1002, 1008, 670, 1012, 405, 405, 405, 405, 405, 401, 1018, 1022, 1026, 1106, 1071, 1111, 1111, 1111, 1082, 1145, 1030, 1101, 1034, 1038, 1106, 1106, 1106, 1106, 1046, 1206, 1052, 1106, 1072, 1111, 1111, 1042, 1134, 1065, 1111, 1112, 1056, 1160, 1207, 1062, 1204, 1208, 1069, 1106, 1106, 1106, 1076, 1111, 1207, 1161, 1122, 1205, 1064, 1094, 1106, 1106, 1107, 1111, 1111, 1111, 1078, 1086, 1207, 1092, 1098, 1046, 1058, 1106, 1106, 1110, 1111, 1111, 1116, 1120, 1161, 1126, 1202, 1104, 1106, 1145, 1146, 1129, 1138, 1088, 1151, 1048, 1157, 1153, 1132, 1141, 1165, 1107, 1111, 1172, 1179, 1109, 1183, 1175, 1143, 1147, 1187, 1108, 1191, 1195, 1144, 1199, 1168, 1212, 1216, 1220, 1224, 1228, 1232, 1236, 1557, 1247, 1241, 1241, 1038, 1434, 1241, 1241, 1241, 1241, 1254, 1275, 1617, 1241, 1280, 1287, 1241, 1241, 1241, 1287, 1241, 2114, 1291, 1241, 1243, 1241, 2049, 1824, 2094, 2095, 1520, 1309, 1241, 1241, 1302, 1241, 1321, 1311, 1241, 1241, 1313, 1778, 1325, 1336, 1241, 1241, 1325, 1330, 1353, 1241, 1241, 1695, 1354, 1241, 1241, 1241, 1294, 1686, 1331, 1241, 1696, 1368, 1241, 1338, 1370, 1241, 1392, 1399, 1364, 2017, 1406, 2016, 1405, 1716, 1406, 1407, 1422, 1417, 1421, 1241, 1241, 1241, 1349, 1426, 1241, 1774, 1756, 1241, 1773, 1241, 1241, 1345, 1964, 1812, 1432, 1241, 1241, 1345, 1993, 1459, 1241, 1241, 1241, 1395, 1848, 1767, 1465, 1241, 1241, 1394, 1847, 1242, 1477, 1241, 1241, 1428, 1241, 1445, 1492, 1241, 1241, 1438, 1241, 1499, 1241, 1241, 1241, 1455, 1241, 1818, 1448, 1241, 1250, 1241, 2026, 1623, 1449, 1241, 1612, 1616, 1241, 1614, 1241, 1257, 1241, 1241, 1985, 1292, 1586, 1512, 1241, 1517, 2050, 1526, 1674, 1519, 1524, 1647, 2051, 1532, 1537, 1551, 1544, 1550, 1555, 1561, 1571, 1578, 1584, 1590, 1591, 1653, 1595, 1602, 1606, 1610, 1634, 1628, 1640, 1633, 1645, 1241, 1241, 1241, 1469, 1241, 1970, 1651, 1241, 1270, 1241, 1241, 1819, 1449, 1241, 1293, 1664, 1241, 1241, 1481, 1485, 1574, 1672, 1241, 1241, 1513, 1317, 1487, 1684, 1241, 1241, 1533, 1299, 1694, 1241, 1241, 1295, 1241, 1241, 1241, 1546, 1700, 1241, 1241, 1707, 1241, 1713, 1241, 1849, 1715, 1241, 1720, 1241, 1276, 1267, 1241, 1241, 2107, 1657, 1864, 1241, 1881, 1241, 1326, 1292, 1241, 1685, 1358, 1724, 1338, 1241, 1363, 1362, 1342, 1340, 1361, 1339, 1833, 1372, 1360, 1833, 1833, 1342, 1343, 1835, 1341, 1731, 1738, 1344, 1241, 1745, 1241, 1379, 1241, 1241, 2092, 1241, 1388, 1761, 1754, 1241, 1386, 1241, 1400, 1760, 1241, 1241, 1241, 1598, 1734, 1241, 1241, 1241, 1635, 1645, 1241, 1780, 1766, 1241, 1241, 1332, 1771, 1241, 1241, 1629, 2079, 1241, 1242, 1784, 1241, 1241, 1680, 1639, 2063, 1790, 1241, 1241, 1741, 1241, 1241, 1800, 1241, 1241, 1762, 1473, 1241, 1806, 1241, 1241, 1786, 1240, 1709, 1241, 1241, 1241, 1668, 1811, 1241, 1940, 1241, 1401, 1974, 1241, 1408, 1413, 1382, 1241, 1816, 1241, 1241, 1802, 2086, 1811, 1241, 1817, 1945, 1823, 2095, 2095, 2047, 2094, 2046, 2080, 1241, 1409, 1312, 1376, 2096, 2048, 1241, 1241, 1807, 1241, 1241, 1241, 2035, 1241, 1241, 1828, 1241, 2057, 2061, 1241, 1241, 1843, 1241, 2059, 1241, 1241, 1241, 1690, 1847, 1241, 1241, 1241, 1703, 2102, 1848, 1241, 1241, 1853, 1292, 1848, 1241, 2016, 1857, 1241, 2002, 1868, 1241, 1436, 1241, 1241, 1271, 1305, 1241, 1874, 1241, 1241, 1884, 2037, 1892, 1241, 1890, 1241, 1461, 1241, 1241, 1795, 1241, 1241, 1891, 1241, 1878, 1241, 1888, 1241, 1888, 1905, 1896, 2087, 1912, 1903, 1241, 1911, 1906, 1916, 1905, 2027, 1863, 1925, 2088, 1859, 1861, 1922, 1927, 1931, 1935, 1494, 1241, 1241, 1918, 1907, 1939, 1917, 1944, 1949, 1241, 1241, 1451, 1955, 1241, 1241, 1241, 1796, 1727, 2061, 1241, 1241, 1899, 1241, 1660, 1968, 1241, 1241, 1951, 1678, 1978, 1241, 1241, 1241, 1839, 1241, 1241, 1984, 1982, 1241, 1488, 1241, 1241, 1624, 1450, 1989, 1241, 1241, 1241, 1870, 1995, 1292, 1241, 1241, 1958, 1261, 1241, 1996, 1241, 1241, 1241, 2039, 2008, 1241, 1241, 1750, 2000, 1241, 1256, 2001, 1960, 1241, 1564, 1241, 1504, 1241, 1241, 1442, 1241, 1241, 1564, 1528, 1263, 1241, 1508, 1241, 1241, 1468, 1498, 2006, 1540, 2015, 1539, 2014, 1748, 2013, 1539, 1831, 2014, 2012, 1500, 1567, 2022, 2021, 1241, 1580, 1241, 1241, 2033, 2037, 1791, 2045, 2031, 1241, 1621, 1241, 1641, 2044, 1241, 1241, 1241, 2093, 1241, 1241, 2055, 1241, 1241, 2067, 1241, 1283, 1241, 1241, 1241, 2101, 2071, 1241, 1241, 1241, 2073, 1848, 2040, 1241, 1241, 1241, 2077, 1241, 1241, 2106, 1241, 1241, 2084, 1241, 2111, 1241, 1241, 1381, 1380, 1241, 1241, 1241, 2100, 1241, 2129, 2118, 2122, 2126, 2197, 2133, 3010, 2825, 2145, 2698, 2156, 2226, 2160, 2161, 2165, 2174, 2293, 2194, 2630, 2201, 2203, 2152, 3019, 2226, 2263, 2209, 2213, 2218, 2269, 2292, 2269, 2269, 2184, 2226, 2238, 2148, 2151, 3017, 2245, 2214, 2269, 2269, 2185, 2226, 2292, 2269, 2291, 2269, 2269, 2269, 2292, 2205, 3019, 2226, 2226, 2160, 2160, 2160, 2261, 2160, 2160, 2160, 2262, 2276, 2160, 2160, 2277, 2216, 2283, 2216, 2269, 2269, 2268, 2269, 2267, 2269, 2269, 2269, 2271, 2568, 2292, 2269, 2293, 2269, 2182, 2190, 2269, 2186, 2226, 2226, 2226, 2226, 2227, 2160, 2160, 2160, 2160, 2263, 2160, 2275, 2277, 2282, 2215, 2217, 2269, 2269, 2291, 2269, 2269, 2293, 2291, 2269, 2220, 2269, 2295, 2294, 2269, 2269, 2305, 2233, 2262, 2278, 2218, 2269, 2234, 2226, 2226, 2228, 2160, 2160, 2160, 2289, 2220, 2294, 2294, 2269, 2269, 2304, 2269, 2160, 2160, 2287, 2269, 2269, 2305, 2269, 2269, 2312, 2269, 2269, 2225, 2226, 2160, 2287, 2289, 2219, 2304, 2295, 2314, 2234, 2226, 2314, 2269, 2226, 2226, 2160, 2288, 2219, 2222, 2304, 2296, 2269, 2224, 2160, 2160, 2269, 2302, 2294, 2314, 2224, 2226, 2288, 2220, 2294, 2269, 2290, 2269, 2269, 2293, 2269, 2269, 2269, 2269, 2270, 2221, 2313, 2225, 2227, 2160, 2300, 2269, 2225, 2261, 2309, 2234, 2229, 2223, 2318, 2318, 2318, 2328, 2336, 2340, 2344, 2350, 2637, 2712, 2358, 2362, 2372, 2135, 2378, 2398, 2135, 2135, 2135, 2135, 2136, 2417, 2241, 2135, 2378, 2135, 2135, 2980, 2984, 2135, 3006, 2135, 2135, 2135, 2945, 2931, 2425, 2400, 2135, 2135, 2135, 2954, 2135, 2481, 2433, 2135, 2135, 2988, 2824, 2135, 2135, 2482, 2434, 2135, 2135, 2440, 2445, 2452, 2135, 2135, 2998, 3002, 2961, 2441, 2446, 2453, 2463, 2974, 2135, 2135, 2135, 2140, 2642, 2709, 2459, 2470, 2465, 2135, 2135, 3005, 2135, 2135, 2987, 2823, 2458, 2469, 2464, 2975, 2135, 2135, 2135, 2353, 2488, 2447, 2324, 2974, 2135, 2409, 2459, 2448, 2135, 2961, 2487, 2446, 2476, 2323, 2973, 2135, 2135, 2135, 2354, 2476, 2974, 2135, 2135, 2135, 2957, 2135, 2135, 2960, 2135, 2135, 2135, 2363, 2409, 2459, 2474, 2465, 2487, 2571, 2973, 2135, 2135, 2168, 2973, 2135, 2135, 2135, 2959, 2135, 2135, 2135, 2506, 2135, 2957, 2488, 2170, 2135, 2135, 2135, 2960, 2135, 2818, 2493, 2135, 2135, 3033, 2135, 2135, 2135, 2934, 2819, 2494, 2135, 2135, 2135, 2976, 2780, 2499, 2135, 2135, 2135, 3000, 2968, 2135, 2935, 2135, 2135, 2135, 2364, 2507, 2135, 2135, 2934, 2135, 2135, 2780, 2492, 2507, 2135, 2135, 2506, 2780, 2135, 2135, 2782, 2780, 2135, 2782, 2135, 2783, 2374, 2514, 2135, 2135, 2135, 3007, 2530, 2974, 2135, 2135, 2135, 3008, 2135, 2135, 2134, 2135, 2526, 2531, 2975, 2135, 2135, 3042, 2581, 2575, 2956, 2135, 2135, 2135, 2394, 2135, 2508, 2535, 2840, 2844, 2495, 2135, 2135, 2136, 2684, 2537, 2842, 2846, 2135, 2136, 2561, 2581, 2551, 2536, 2841, 2845, 2975, 3043, 2582, 2843, 2555, 2135, 3040, 3044, 2538, 2844, 2975, 2135, 2135, 2253, 2644, 2672, 2542, 2554, 2135, 2135, 2346, 2873, 2551, 2555, 2135, 2135, 2135, 2381, 2559, 2565, 2538, 2553, 2135, 2560, 2914, 2576, 2590, 2135, 2135, 2135, 2408, 2136, 2596, 2624, 2135, 2135, 2135, 2409, 2135, 2618, 2597, 3008, 2135, 2135, 2380, 2956, 2601, 2135, 2135, 2135, 2410, 2620, 2624, 2135, 2136, 2383, 2135, 2135, 2783, 2623, 2135, 2135, 2393, 2888, 2136, 2621, 3008, 2135, 2618, 2618, 2622, 2135, 2135, 2405, 2414, 2619, 2384, 2624, 2135, 2136, 2950, 2135, 2138, 2135, 2139, 2135, 2604, 2623, 2135, 2140, 2878, 2665, 2957, 2622, 2135, 2135, 2428, 2762, 2606, 2612, 2135, 2135, 2501, 2586, 2604, 3038, 2135, 2604, 3036, 2387, 2958, 2386, 2135, 2141, 2135, 2421, 2387, 2385, 2135, 2385, 2384, 2384, 2135, 2386, 2628, 2384, 2135, 2135, 2501, 2596, 2591, 2135, 2135, 2135, 2400, 2135, 2634, 2135, 2135, 2559, 2580, 2575, 2648, 2135, 2135, 2135, 2429, 2649, 2135, 2135, 2135, 2435, 2654, 2658, 2135, 2135, 2135, 2436, 2649, 2178, 2659, 2135, 2135, 2595, 2601, 2669, 2677, 2135, 2135, 2616, 2957, 2879, 2665, 2691, 2135, 2363, 2367, 2900, 2878, 2664, 2690, 2975, 2877, 2643, 2670, 2974, 2671, 2975, 2135, 2135, 2619, 2608, 2669, 2673, 2135, 2135, 2653, 2177, 2672, 2135, 2135, 2135, 2486, 2168, 2251, 2255, 2695, 2974, 2709, 2135, 2135, 2135, 2487, 2169, 2399, 2716, 2975, 2135, 2363, 2770, 2776, 2640, 2717, 2135, 2135, 2729, 2135, 2135, 2641, 2718, 2135, 2135, 2135, 2505, 2135, 2640, 2257, 2974, 2135, 2727, 2975, 2135, 2365, 2332, 2895, 2957, 2135, 2959, 2135, 2365, 2749, 2754, 2959, 2958, 2958, 2135, 2380, 2793, 2799, 2135, 2735, 2738, 2135, 2381, 2135, 2135, 2940, 2974, 2135, 2744, 2135, 2135, 2739, 2519, 2976, 2745, 2135, 2135, 2135, 2509, 2755, 2135, 2135, 2135, 2510, 2772, 2778, 2135, 2135, 2740, 2520, 2135, 2771, 2777, 2135, 2135, 2759, 2750, 2792, 2798, 2135, 2135, 2781, 2392, 2779, 2135, 2135, 2135, 2521, 2135, 2679, 2248, 2135, 2135, 2681, 2480, 2135, 2135, 2786, 3000, 2135, 2679, 2683, 2135, 2135, 2416, 2135, 2135, 2135, 2525, 2135, 2730, 2135, 2135, 2135, 2560, 2581, 2135, 2805, 2135, 2135, 2804, 2962, 2832, 2974, 2135, 2382, 2135, 2135, 2958, 2135, 2135, 2960, 2135, 2829, 2833, 2975, 2961, 2965, 2969, 2973, 2968, 2972, 2135, 2135, 2135, 2641, 2135, 2515, 2966, 2970, 2851, 2478, 2135, 2135, 2808, 2135, 2809, 2135, 2135, 2135, 2722, 2852, 2479, 2135, 2135, 2815, 2135, 2135, 2766, 2853, 2480, 2135, 2857, 2479, 2135, 2388, 2723, 2135, 2364, 2331, 2894, 2858, 2480, 2135, 2135, 2850, 2478, 2135, 2135, 2135, 2806, 2864, 2135, 2399, 2256, 2974, 2865, 2135, 2135, 2862, 2135, 2135, 2135, 2685, 2807, 2865, 2135, 2135, 2807, 2863, 2135, 2135, 2135, 2686, 2884, 2807, 2135, 2809, 2807, 2135, 2135, 2807, 2806, 2705, 2810, 2808, 2700, 2869, 2702, 2702, 2702, 2704, 2883, 2135, 2135, 2135, 2730, 2884, 2135, 2135, 2135, 2731, 2321, 2546, 2135, 2135, 2876, 2255, 2889, 2322, 2547, 2135, 2401, 2135, 2135, 2135, 2949, 2367, 2893, 2544, 2973, 2906, 2973, 2135, 2135, 2877, 2663, 2368, 2901, 2907, 2974, 2366, 2899, 2905, 2972, 2920, 2974, 2135, 2135, 2911, 2900, 2920, 2363, 2913, 2918, 2465, 2941, 2975, 2135, 2135, 2924, 2928, 2974, 2945, 2931, 2135, 2135, 2135, 2765, 2136, 2955, 2135, 2135, 2939, 2931, 2380, 2135, 2135, 2380, 2135, 2135, 2135, 2780, 2507, 2137, 2135, 2137, 2135, 2139, 2135, 2806, 2810, 2135, 2135, 2135, 2992, 2135, 2135, 2962, 2966, 2970, 2974, 2135, 2135, 2787, 3014, 2135, 2521, 2993, 2135, 2135, 2135, 2803, 2135, 2135, 2135, 2618, 2607, 2997, 3001, 2135, 2135, 2963, 2967, 2971, 2975, 2135, 2135, 2791, 2797, 2135, 3009, 2999, 3003, 2787, 3001, 2135, 2135, 2964, 2968, 2785, 2999, 3003, 2135, 2135, 2135, 2804, 2785, 2999, 3004, 2135, 2135, 2135, 2807, 2135, 2135, 3023, 2135, 2135, 2135, 2811, 2135, 2135, 3027, 2135, 2135, 2135, 2837, 2968, 3028, 2135, 2135, 2135, 2875, 2135, 2784, 3029, 2135, 2408, 2457, 2446, 0, 14, 0, -2120220672, 1610612736, -2074083328, -2002780160, -2111830528, 1073872896, 1342177280, 1075807216, 4096, 16384, 2048, 8192, 0, 8192, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, -2145386496, 8388608, 1073741824, 0, 0x80000000, 0x80000000, 2097152, 2097152, 2097152, 536870912, 0, 0, 134217728, 33554432, 1536, 268435456, 268435456, 268435456, 268435456, 128, 256, 32, 0, 65536, 131072, 524288, 16777216, 268435456, 0x80000000, 1572864, 1835008, 640, 32768, 65536, 262144, 1048576, 2097152, 196608, 196800, 196608, 196608, 0, 131072, 131072, 131072, 196608, 196624, 196608, 196624, 196608, 196608, 128, 4096, 16384, 16384, 2048, 0, 4, 0, 0, 0x80000000, 2097152, 0, 1024, 32, 32, 0, 65536, 1572864, 1048576, 32768, 32768, 32768, 32768, 196608, 196608, 196608, 64, 64, 196608, 196608, 131072, 131072, 131072, 131072, 268435456, 268435456, 64, 196736, 196608, 196608, 196608, 131072, 196608, 196608, 16384, 4, 4, 4, 2, 32, 32, 65536, 1048576, 12582912, 1073741824, 0, 0, 2, 8, 16, 96, 2048, 32768, 0, 0, 131072, 268435456, 268435456, 268435456, 256, 256, 196608, 196672, 196608, 196608, 196608, 196608, 4, 0, 256, 256, 256, 256, 32, 32, 32768, 32, 32, 32, 32, 32768, 268435456, 268435456, 268435456, 196608, 196608, 196608, 196624, 196608, 196608, 196608, 16, 16, 16, 268435456, 196608, 64, 64, 64, 196608, 196608, 196608, 196672, 268435456, 64, 64, 196608, 196608, 16, 196608, 196608, 196608, 268435456, 64, 196608, 131072, 262144, 4194304, 25165824, 33554432, 134217728, 268435456, 268435456, 196608, 262152, 8, 256, 512, 3072, 16384, 200, -1073741816, 8392713, 40, 8392718, 520, 807404072, 40, 520, 100663304, 0, 0, -540651761, -540651761, 257589048, 0, 262144, 0, 0, 3, 8, 256, 0, 4, 6, 4100, 8388612, 0, 0, 0, 3, 4, 8, 256, 512, 1024, 0, 2097152, 0, 0, -537854471, -537854471, 0, 100663296, 0, 0, 1, 2, 0, 0, 0, 16384, 0, 0, 0, 96, 14336, 0, 0, 0, 7, 8, 234881024, 0, 0, 0, 8, 0, 0, 0, 0, 262144, 0, 0, 16, 64, 384, 512, 0, 1, 1, 0, 12582912, 0, 0, 0, 0, 33554432, 67108864, -606084144, -606084144, -606084138, 0, 0, 28, 32, 768, 1966080, -608174080, 0, 0, 0, 14, 35056, 16, 64, 896, 24576, 98304, 98304, 131072, 262144, 524288, 1048576, 4194304, 25165824, 1048576, 62914560, 134217728, -805306368, 0, 384, 512, 16384, 65536, 131072, 262144, 29360128, 33554432, 134217728, 268435456, 1073741824, 0x80000000, 262144, 524288, 1048576, 29360128, 33554432, 524288, 1048576, 16777216, 33554432, 134217728, 268435456, 1073741824, 0, 0, 0, 123856, 1966080, 0, 64, 384, 16384, 65536, 131072, 16384, 65536, 524288, 268435456, 0x80000000, 0, 0, 524288, 0x80000000, 0, 0, 1, 16, 0, 256, 524288, 0, 0, 0, 25, 96, 128, -537854471, 0, 0, 0, 32, 7404800, -545259520, 0, 0, 0, 60, 0, 249, 64768, 1048576, 6291456, 6291456, 25165824, 100663296, 402653184, 1073741824, 96, 128, 1280, 2048, 4096, 57344, 6291456, 57344, 6291456, 8388608, 16777216, 33554432, 201326592, 1342177280, 0x80000000, 0, 57344, 6291456, 8388608, 100663296, 134217728, 0x80000000, 0, 0, 0, 1, 8, 16, 64, 128, 64, 128, 256, 1024, 131072, 131072, 131072, 262144, 524288, 16777216, 57344, 6291456, 8388608, 67108864, 134217728, 64, 256, 1024, 2048, 4096, 57344, 64, 256, 0, 24576, 32768, 6291456, 67108864, 134217728, 0, 1, 64, 256, 24576, 32768, 4194304, 32768, 4194304, 67108864, 0, 0, 64, 256, 0, 0, 24576, 32768, 0, 16384, 4194304, 67108864, 64, 16384, 0, 0, 1, 64, 256, 16384, 4194304, 67108864, 0, 0, 0, 16384, 0, 16384, 16384, 0, -470447874, -470447874, -470447874, 0, 0, 128, 0, 0, 8, 96, 2048, 32768, 262144, 8388608, 35056, 1376256, -471859200, 0, 0, 14, 16, 224, 2048, 32768, 2097152, 4194304, 8388608, -486539264, 0, 96, 128, 2048, 32768, 262144, 2097152, 262144, 2097152, 8388608, 33554432, 536870912, 1073741824, 0x80000000, 0, 1610612736, 0x80000000, 0, 0, 1, 524288, 1048576, 12582912, 0, 0, 0, 151311, 264503296, 2097152, 8388608, 33554432, 1610612736, 0x80000000, 262144, 8388608, 33554432, 536870912, 67108864, 4194304, 0, 4194304, 0, 4194304, 4194304, 0, 0, 524288, 8388608, 536870912, 1073741824, 0x80000000, 1, 4097, 8388609, 96, 2048, 32768, 1073741824, 0x80000000, 0, 96, 2048, 0x80000000, 0, 0, 96, 2048, 0, 0, 1, 12582912, 0, 0, 0, 0, 1641895695, 1641895695, 0, 0, 0, 249, 7404800, 15, 87808, 1835008, 1639972864, 0, 768, 5120, 16384, 65536, 1835008, 1835008, 12582912, 16777216, 1610612736, 0, 3, 4, 8, 768, 4096, 65536, 0, 0, 256, 512, 786432, 8, 256, 512, 4096, 16384, 1835008, 16384, 1835008, 12582912, 1610612736, 0, 0, 0, 256, 0, 0, 0, 4, 8, 16, 32, 1, 2, 8, 256, 16384, 524288, 16384, 524288, 1048576, 12582912, 1610612736, 0, 0, 0, 8388608, 0, 0, 0, 524288, 4194304, 0, 0, 0, 8388608, -548662288, -548662288, -548662288, 0, 0, 256, 16384, 65536, 520093696, -1073741824, 0, 0, 0, 16777216, 0, 16, 32, 960, 4096, 4980736, 520093696, 1073741824, 0, 32, 896, 4096, 57344, 1048576, 6291456, 8388608, 16777216, 100663296, 134217728, 268435456, 0x80000000, 0, 512, 786432, 4194304, 33554432, 134217728, 268435456, 0, 786432, 4194304, 134217728, 268435456, 0, 524288, 4194304, 268435456, 0, 0, 0, 0, 0, 4194304, 4194304, -540651761, 0, 0, 0, 2, 4, 8, 16, 96, 128, 264503296, -805306368, 0, 0, 0, 8, 256, 512, 19456, 131072, 3072, 16384, 131072, 262144, 8388608, 16777216, 512, 1024, 2048, 16384, 131072, 262144, 131072, 262144, 8388608, 33554432, 201326592, 268435456, 0, 3, 4, 256, 1024, 2048, 57344, 16384, 131072, 8388608, 33554432, 134217728, 268435456, 0, 3, 256, 1024, 16384, 131072, 33554432, 134217728, 1073741824, 0x80000000, 0, 0, 256, 524288, 0x80000000, 0, 3, 256, 33554432, 134217728, 1073741824, 0, 1, 2, 33554432, 1, 2, 134217728, 1073741824, 0, 1, 2, 134217728, 0, 0, 0, 64, 0, 0, 0, 16, 32, 896, 4096, 786432, 4194304, 16777216, 33554432, 201326592, 268435456, 1073741824, 0x80000000, 0, 0, 0, 15, 0, 4980736, 4980736, 4980736, 70460, 70460, 3478332, 0, 0, 1008, 4984832, 520093696, 60, 4864, 65536, 0, 0, 0, 12, 16, 32, 256, 512, 4096, 65536, 0, 0, 0, 67108864, 0, 0, 0, 12, 0, 256, 512, 65536, 0, 0, 1024, 512, 131072, 131072, 4, 16, 32, 65536, 0, 4, 16, 32, 0, 0, 0, 4, 16, 0, 0, 16384, 67108864, 0, 0, 1, 24, 96, 128, 256, 1024\n];\n\nJSONiqTokenizer.TOKEN =\n[\n  \"(0)\",\n  \"JSONChar\",\n  \"JSONCharRef\",\n  \"JSONPredefinedCharRef\",\n  \"ModuleDecl\",\n  \"Annotation\",\n  \"OptionDecl\",\n  \"Operator\",\n  \"Variable\",\n  \"Tag\",\n  \"EndTag\",\n  \"PragmaContents\",\n  \"DirCommentContents\",\n  \"DirPIContents\",\n  \"CDataSectionContents\",\n  \"AttrTest\",\n  \"Wildcard\",\n  \"EQName\",\n  \"IntegerLiteral\",\n  \"DecimalLiteral\",\n  \"DoubleLiteral\",\n  \"PredefinedEntityRef\",\n  \"'\\\"\\\"'\",\n  \"EscapeApos\",\n  \"AposChar\",\n  \"ElementContentChar\",\n  \"QuotAttrContentChar\",\n  \"AposAttrContentChar\",\n  \"NCName\",\n  \"QName\",\n  \"S\",\n  \"CharRef\",\n  \"CommentContents\",\n  \"DocTag\",\n  \"DocCommentContents\",\n  \"EOF\",\n  \"'!'\",\n  \"'\\\"'\",\n  \"'#'\",\n  \"'#)'\",\n  \"'$$'\",\n  \"''''\",\n  \"'('\",\n  \"'(#'\",\n  \"'(:'\",\n  \"'(:~'\",\n  \"')'\",\n  \"'*'\",\n  \"'*'\",\n  \"','\",\n  \"'-->'\",\n  \"'.'\",\n  \"'/'\",\n  \"'/>'\",\n  \"':'\",\n  \"':)'\",\n  \"';'\",\n  \"'<!--'\",\n  \"'<![CDATA['\",\n  \"'<?'\",\n  \"'='\",\n  \"'>'\",\n  \"'?'\",\n  \"'?>'\",\n  \"'NaN'\",\n  \"'['\",\n  \"']'\",\n  \"']]>'\",\n  \"'after'\",\n  \"'all'\",\n  \"'allowing'\",\n  \"'ancestor'\",\n  \"'ancestor-or-self'\",\n  \"'and'\",\n  \"'any'\",\n  \"'append'\",\n  \"'array'\",\n  \"'as'\",\n  \"'ascending'\",\n  \"'at'\",\n  \"'attribute'\",\n  \"'base-uri'\",\n  \"'before'\",\n  \"'boundary-space'\",\n  \"'break'\",\n  \"'by'\",\n  \"'case'\",\n  \"'cast'\",\n  \"'castable'\",\n  \"'catch'\",\n  \"'check'\",\n  \"'child'\",\n  \"'collation'\",\n  \"'collection'\",\n  \"'comment'\",\n  \"'constraint'\",\n  \"'construction'\",\n  \"'contains'\",\n  \"'content'\",\n  \"'context'\",\n  \"'continue'\",\n  \"'copy'\",\n  \"'copy-namespaces'\",\n  \"'count'\",\n  \"'decimal-format'\",\n  \"'decimal-separator'\",\n  \"'declare'\",\n  \"'default'\",\n  \"'delete'\",\n  \"'descendant'\",\n  \"'descendant-or-self'\",\n  \"'descending'\",\n  \"'diacritics'\",\n  \"'different'\",\n  \"'digit'\",\n  \"'distance'\",\n  \"'div'\",\n  \"'document'\",\n  \"'document-node'\",\n  \"'element'\",\n  \"'else'\",\n  \"'empty'\",\n  \"'empty-sequence'\",\n  \"'encoding'\",\n  \"'end'\",\n  \"'entire'\",\n  \"'eq'\",\n  \"'every'\",\n  \"'exactly'\",\n  \"'except'\",\n  \"'exit'\",\n  \"'external'\",\n  \"'first'\",\n  \"'following'\",\n  \"'following-sibling'\",\n  \"'for'\",\n  \"'foreach'\",\n  \"'foreign'\",\n  \"'from'\",\n  \"'ft-option'\",\n  \"'ftand'\",\n  \"'ftnot'\",\n  \"'ftor'\",\n  \"'function'\",\n  \"'ge'\",\n  \"'greatest'\",\n  \"'group'\",\n  \"'grouping-separator'\",\n  \"'gt'\",\n  \"'idiv'\",\n  \"'if'\",\n  \"'import'\",\n  \"'in'\",\n  \"'index'\",\n  \"'infinity'\",\n  \"'inherit'\",\n  \"'insensitive'\",\n  \"'insert'\",\n  \"'instance'\",\n  \"'integrity'\",\n  \"'intersect'\",\n  \"'into'\",\n  \"'is'\",\n  \"'item'\",\n  \"'json'\",\n  \"'json-item'\",\n  \"'key'\",\n  \"'language'\",\n  \"'last'\",\n  \"'lax'\",\n  \"'le'\",\n  \"'least'\",\n  \"'let'\",\n  \"'levels'\",\n  \"'loop'\",\n  \"'lowercase'\",\n  \"'lt'\",\n  \"'minus-sign'\",\n  \"'mod'\",\n  \"'modify'\",\n  \"'module'\",\n  \"'most'\",\n  \"'namespace'\",\n  \"'namespace-node'\",\n  \"'ne'\",\n  \"'next'\",\n  \"'no'\",\n  \"'no-inherit'\",\n  \"'no-preserve'\",\n  \"'node'\",\n  \"'nodes'\",\n  \"'not'\",\n  \"'object'\",\n  \"'occurs'\",\n  \"'of'\",\n  \"'on'\",\n  \"'only'\",\n  \"'option'\",\n  \"'or'\",\n  \"'order'\",\n  \"'ordered'\",\n  \"'ordering'\",\n  \"'paragraph'\",\n  \"'paragraphs'\",\n  \"'parent'\",\n  \"'pattern-separator'\",\n  \"'per-mille'\",\n  \"'percent'\",\n  \"'phrase'\",\n  \"'position'\",\n  \"'preceding'\",\n  \"'preceding-sibling'\",\n  \"'preserve'\",\n  \"'previous'\",\n  \"'processing-instruction'\",\n  \"'relationship'\",\n  \"'rename'\",\n  \"'replace'\",\n  \"'return'\",\n  \"'returning'\",\n  \"'revalidation'\",\n  \"'same'\",\n  \"'satisfies'\",\n  \"'schema'\",\n  \"'schema-attribute'\",\n  \"'schema-element'\",\n  \"'score'\",\n  \"'self'\",\n  \"'sensitive'\",\n  \"'sentence'\",\n  \"'sentences'\",\n  \"'skip'\",\n  \"'sliding'\",\n  \"'some'\",\n  \"'stable'\",\n  \"'start'\",\n  \"'stemming'\",\n  \"'stop'\",\n  \"'strict'\",\n  \"'strip'\",\n  \"'structured-item'\",\n  \"'switch'\",\n  \"'text'\",\n  \"'then'\",\n  \"'thesaurus'\",\n  \"'times'\",\n  \"'to'\",\n  \"'treat'\",\n  \"'try'\",\n  \"'tumbling'\",\n  \"'type'\",\n  \"'typeswitch'\",\n  \"'union'\",\n  \"'unique'\",\n  \"'unordered'\",\n  \"'updating'\",\n  \"'uppercase'\",\n  \"'using'\",\n  \"'validate'\",\n  \"'value'\",\n  \"'variable'\",\n  \"'version'\",\n  \"'weight'\",\n  \"'when'\",\n  \"'where'\",\n  \"'while'\",\n  \"'wildcards'\",\n  \"'window'\",\n  \"'with'\",\n  \"'without'\",\n  \"'word'\",\n  \"'words'\",\n  \"'xquery'\",\n  \"'zero-digit'\",\n  \"'{'\",\n  \"'{{'\",\n  \"'|'\",\n  \"'}'\",\n  \"'}}'\"\n];\n\n},\n{}],\n2:[function(_dereq_,module,exports){\n'use strict';\n\nvar JSONiqTokenizer = _dereq_('./JSONiqTokenizer').JSONiqTokenizer;\nvar Lexer = _dereq_('./lexer').Lexer;\n\nvar keys = 'NaN|after|allowing|ancestor|ancestor-or-self|and|append|array|as|ascending|at|attribute|base-uri|before|boundary-space|break|by|case|cast|castable|catch|child|collation|comment|constraint|construction|contains|context|continue|copy|copy-namespaces|count|decimal-format|decimal-separator|declare|default|delete|descendant|descendant-or-self|descending|digit|div|document|document-node|element|else|empty|empty-sequence|encoding|end|eq|every|except|exit|external|false|first|following|following-sibling|for|from|ft-option|function|ge|greatest|group|grouping-separator|gt|idiv|if|import|in|index|infinity|insert|instance|integrity|intersect|into|is|item|json|json-item|jsoniq|last|lax|le|least|let|loop|lt|minus-sign|mod|modify|module|namespace|namespace-node|ne|next|node|nodes|not|null|object|of|only|option|or|order|ordered|ordering|paragraphs|parent|pattern-separator|per-mille|percent|preceding|preceding-sibling|previous|processing-instruction|rename|replace|return|returning|revalidation|satisfies|schema|schema-attribute|schema-element|score|select|self|sentences|sliding|some|stable|start|strict|switch|text|then|times|to|treat|true|try|tumbling|type|typeswitch|union|unordered|updating|validate|value|variable|version|when|where|while|window|with|words|xquery|zero-digit'.split('|');\nvar keywords = keys.map(function(val) { return { name: '\\'' + val + '\\'', token: 'keyword' }; });\nvar ncnames = keys.map(function(val) { return { name: '\\'' + val + '\\'', token: 'text', next: function(stack){ stack.pop(); } }; });\n\nvar cdata = 'constant.language';\nvar number = 'constant';\nvar xmlcomment = 'comment';\nvar pi = 'xml-pe';\nvar pragma = 'constant.buildin';\nvar n = function(name){\n    return '\\'' + name + '\\'';\n};\nvar Rules = {\n    start: [\n        { name: n('(#'), token: pragma, next: function(stack){ stack.push('Pragma'); } },\n        { name: n('(:'), token: 'comment', next: function(stack){ stack.push('Comment'); } },\n        { name: n('(:~'), token: 'comment.doc', next: function(stack){ stack.push('CommentDoc'); } },\n        { name: n('<!--'), token: xmlcomment, next: function(stack){ stack.push('XMLComment'); } },\n        { name: n('<?'), token: pi, next: function(stack) { stack.push('PI'); } },\n        { name: n('\\'\\''), token: 'string', next: function(stack){ stack.push('AposString'); } },\n        { name: n('\"'), token: 'string', next: function(stack){ stack.push('QuotString'); } },\n        { name: 'Annotation', token: 'support.function' },\n        { name: 'ModuleDecl', token: 'keyword', next: function(stack){ stack.push('Prefix'); } },\n        { name: 'OptionDecl', token: 'keyword', next: function(stack){ stack.push('_EQName'); } },\n        { name: 'AttrTest', token: 'support.type' },\n        { name: 'Variable', token: 'variable' },\n        { name: n('<![CDATA['), token: cdata, next: function(stack){ stack.push('CData'); } },\n        { name: 'IntegerLiteral', token: number },\n        { name: 'DecimalLiteral', token: number },\n        { name: 'DoubleLiteral', token: number },\n        { name: 'Operator', token: 'keyword.operator' },\n        { name: 'EQName', token: function(val) { return keys.indexOf(val) !== -1 ? 'keyword' : 'support.function'; } },\n        { name: n('('), token: 'lparen' },\n        { name: n(')'), token: 'rparen' },\n        { name: 'Tag', token: 'meta.tag', next: function(stack){ stack.push('StartTag'); } },\n        { name: n('}'), token: 'text', next: function(stack){ if(stack.length > 1) { stack.pop(); } } },\n        { name: n('{'), token: 'text', next: function(stack){ stack.push('start'); } } //, next: function(stack){ if(stack.length > 1) { stack.pop(); } } }\n    ].concat(keywords),\n    _EQName: [\n        { name: 'EQName', token: 'text', next: function(stack) { stack.pop(); } }\n    ].concat(ncnames),\n    Prefix: [\n        { name: 'NCName', token: 'text', next: function(stack) { stack.pop(); } }\n    ].concat(ncnames),\n    StartTag: [\n        { name: n('>'), token: 'meta.tag', next: function(stack){ stack.push('TagContent'); } },\n        { name: 'QName', token: 'entity.other.attribute-name' },\n        { name: n('='), token: 'text' },\n        { name: n('\\'\\''), token: 'string', next: function(stack){ stack.push('AposAttr'); } },\n        { name: n('\"'), token: 'string', next: function(stack){ stack.push('QuotAttr'); } },\n        { name: n('/>'), token: 'meta.tag.r', next: function(stack){ stack.pop(); } }\n    ],\n    TagContent: [\n        { name: 'ElementContentChar', token: 'text' },\n        { name: n('<![CDATA['), token: cdata, next: function(stack){ stack.push('CData'); } },\n        { name: n('<!--'), token: xmlcomment, next: function(stack){ stack.push('XMLComment'); } },\n        { name: 'Tag', token: 'meta.tag', next: function(stack){ stack.push('StartTag'); } },\n        { name: 'PredefinedEntityRef', token: 'constant.language.escape' },\n        { name: 'CharRef', token: 'constant.language.escape' },\n        { name: n('{{'), token: 'text' },\n        { name: n('}}'), token: 'text' },\n        { name: n('{'), token: 'text', next: function(stack){ stack.push('start'); } },\n        { name: 'EndTag', token: 'meta.tag', next: function(stack){ stack.pop(); stack.pop(); } }\n    ],\n    AposAttr: [\n        { name: n('\\'\\''), token: 'string', next: function(stack){ stack.pop(); } },\n        { name: 'EscapeApos', token: 'constant.language.escape' },\n        { name: 'AposAttrContentChar', token: 'string' },\n        { name: 'PredefinedEntityRef', token: 'constant.language.escape' },\n        { name: 'CharRef', token: 'constant.language.escape' },\n        { name: n('{{'), token: 'string' },\n        { name: n('}}'), token: 'string' },\n        { name: n('{'), token: 'text', next: function(stack){ stack.push('start'); } }\n    ],\n    QuotAttr: [\n        { name: n('\\\"'), token: 'string', next: function(stack){ stack.pop(); } },\n        { name: 'EscapeQuot', token: 'constant.language.escape' },\n        { name: 'QuotAttrContentChar', token: 'string' },\n        { name: 'PredefinedEntityRef', token: 'constant.language.escape' },\n        { name: 'CharRef', token: 'constant.language.escape' },\n        { name: n('{{'), token: 'string' },\n        { name: n('}}'), token: 'string' },\n        { name: n('{'), token: 'text', next: function(stack){ stack.push('start'); } }\n    ],\n    Pragma: [\n        { name: 'PragmaContents', token: pragma },\n        { name: n('#'), token: pragma },\n        { name: n('#)'), token: pragma, next: function(stack){ stack.pop(); } }\n    ],\n    Comment: [\n        { name: 'CommentContents', token: 'comment' },\n        { name: n('(:'), token: 'comment', next: function(stack){ stack.push('Comment'); } },\n        { name: n(':)'), token: 'comment', next: function(stack){ stack.pop(); } }\n    ],\n    CommentDoc: [\n        { name: 'DocCommentContents', token: 'comment.doc' },\n        { name: 'DocTag', token: 'comment.doc.tag' },\n        { name: n('(:'), token: 'comment.doc', next: function(stack){ stack.push('CommentDoc'); } },\n        { name: n(':)'), token: 'comment.doc', next: function(stack){ stack.pop(); } }\n    ],\n    XMLComment: [\n        { name: 'DirCommentContents', token: xmlcomment },\n        { name: n('-->'), token: xmlcomment, next: function(stack){ stack.pop(); } }\n    ],\n    CData: [\n        { name: 'CDataSectionContents', token: cdata },\n        { name: n(']]>'), token: cdata, next: function(stack){ stack.pop(); } }\n    ],\n    PI: [\n        { name: 'DirPIContents', token: pi },\n        { name: n('?'), token: pi },\n        { name: n('?>'), token: pi, next: function(stack){ stack.pop(); } }\n    ],\n    AposString: [\n        { name: n('\\'\\''), token: 'string', next: function(stack){ stack.pop(); } },\n        { name: 'PredefinedEntityRef', token: 'constant.language.escape' },\n        { name: 'CharRef', token: 'constant.language.escape' },\n        { name: 'EscapeApos', token: 'constant.language.escape' },\n        { name: 'AposChar', token: 'string' }\n    ],\n    QuotString: [\n        { name: n('\"'), token: 'string', next: function(stack){ stack.pop(); } },\n        { name: 'JSONPredefinedCharRef', token: 'constant.language.escape' },\n        { name: 'JSONCharRef', token: 'constant.language.escape' },\n        { name: 'JSONChar', token: 'string' }\n    ]\n};\n    \nexports.JSONiqLexer = function(){ return new Lexer(JSONiqTokenizer, Rules); };\n},\n{\"./JSONiqTokenizer\":1,\"./lexer\":3}],\n3:[function(_dereq_,module,exports){\n'use strict';\n\nvar TokenHandler = function(code) {\n    var input = code;\n    this.tokens = [];\n \n    this.reset = function() {\n        input = input;\n        this.tokens = [];\n    };\n    \n    this.startNonterminal = function() {};\n    this.endNonterminal = function() {};\n\n    this.terminal = function(name, begin, end) {\n        this.tokens.push({\n            name: name,\n            value: input.substring(begin, end)\n        });\n    };\n\n    this.whitespace = function(begin, end) {\n        this.tokens.push({\n            name: 'WS',\n            value: input.substring(begin, end)\n        });\n    };\n};\n\nexports.Lexer = function(Tokenizer, Rules) {\n\n    this.tokens = [];\n  \n    this.getLineTokens = function(line, state) {\n        state = (state === 'start' || !state) ? '[\"start\"]' : state;\n        var stack = JSON.parse(state);\n        var h = new TokenHandler(line);\n        var tokenizer = new Tokenizer(line, h);\n        var tokens = [];\n    \n        while(true) {\n            var currentState = stack[stack.length - 1];\n            try {\n                h.tokens = [];\n                tokenizer['parse_' + currentState]();\n                var info = null;\n        \n                if(h.tokens.length > 1 && h.tokens[0].name === 'WS') {\n                    tokens.push({\n                        type: 'text',\n                        value: h.tokens[0].value\n                    });\n                    h.tokens.splice(0, 1);\n                }\n        \n                var token = h.tokens[0];\n                var rules  = Rules[currentState];\n                for(var k = 0; k < rules.length; k++) {\n                    var rule = Rules[currentState][k];\n                    if((typeof(rule.name) === 'function' && rule.name(token)) || rule.name === token.name) {\n                        info = rule;\n                        break;\n                    }\n                }\n        \n                if(token.name === 'EOF') { break; }\n                if(token.value === '') { throw 'Encountered empty string lexical rule.'; }\n        \n                tokens.push({\n                    type: info === null ? 'text' : (typeof(info.token) === 'function' ? info.token(token.value) : info.token),\n                    value: token.value\n                });\n        \n                if(info && info.next) {\n                    info.next(stack);\n                }\n      \n            } catch(e) {\n                if(e instanceof tokenizer.ParseException) {\n                    var index = 0;\n                    for(var i=0; i < tokens.length; i++) {\n                        index += tokens[i].value.length;\n                    }\n                    tokens.push({ type: 'text', value: line.substring(index) });\n                    return {\n                        tokens: tokens,\n                        state: JSON.stringify(['start'])\n                    };\n                } else {\n                    throw e;\n                }\n            }\n        }\n\n        return {\n            tokens: tokens,\n            state: JSON.stringify(stack)\n        };\n    };\n};\n},\n{}]},{},[2])\n(2)\n\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nvar XmlBehaviour = function () {\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selected = session.doc.getTextRange(editor.getSelectionRange());\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            }\n\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (rightChar == quote && (is(token, \"attribute-value\") || is(token, \"string\"))) {\n                return {\n                    text: \"\",\n                    selection: [1, 1]\n                };\n            }\n\n            if (!token)\n                token = iterator.stepBackward();\n\n            if (!token)\n                return;\n\n            while (is(token, \"tag-whitespace\") || is(token, \"whitespace\")) {\n                token = iterator.stepBackward();\n            }\n            var rightSpace = !rightChar || rightChar.match(/\\s/);\n            if (is(token, \"attribute-equals\") && (rightSpace || rightChar == '>') || (is(token, \"decl-attribute-equals\") && (rightSpace || rightChar == '?'))) {\n                return {\n                    text: quote + quote,\n                    selection: [1, 1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken() || iterator.stepBackward();\n            if (!token || !(is(token, \"tag-name\") || is(token, \"tag-whitespace\") || is(token, \"attribute-name\") || is(token, \"attribute-equals\") || is(token, \"attribute-value\")))\n                return;\n            if (is(token, \"reference.attribute-value\"))\n                return;\n            if (is(token, \"attribute-value\")) {\n                var firstChar = token.value.charAt(0);\n                if (firstChar == '\"' || firstChar == \"'\") {\n                    var lastChar = token.value.charAt(token.value.length - 1);\n                    var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length;\n                    if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar)\n                        return;\n                }\n            }\n            while (!is(token, \"tag-name\")) {\n                token = iterator.stepBackward();\n            }\n\n            var tokenRow = iterator.getCurrentTokenRow();\n            var tokenColumn = iterator.getCurrentTokenColumn();\n            if (is(iterator.stepBackward(), \"end-tag-open\"))\n                return;\n\n            var element = token.value;\n            if (tokenRow == position.row)\n                element = element.substring(0, position.column - tokenColumn);\n\n            if (this.voidElements.hasOwnProperty(element.toLowerCase()))\n                 return;\n\n            return {\n               text: \">\" + \"</\" + element + \">\",\n               selection: [1, 1]\n            };\n        }\n    });\n\n    this.add(\"autoindent\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.getLine(cursor.row);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (token && token.type.indexOf(\"tag-close\") !== -1) {\n                while (token && token.type.indexOf(\"tag-name\") === -1) {\n                    token = iterator.stepBackward();\n                }\n\n                if (!token) {\n                    return;\n                }\n\n                var tag = token.value;\n                var row = iterator.getCurrentTokenRow();\n                token = iterator.stepBackward();\n                if (!token || token.type.indexOf(\"end-tag\") !== -1) {\n                    return;\n                }\n\n                if (this.voidElements && !this.voidElements[tag]) {\n                    var nextToken = session.getTokenAt(cursor.row, cursor.column+1);\n                    var line = session.getLine(row);\n                    var nextIndent = this.$getIndent(line);\n                    var indent = nextIndent + session.getTabString();\n\n                    if (nextToken && nextToken.value === \"</\") {\n                        return {\n                            text: \"\\n\" + indent + \"\\n\" + nextIndent,\n                            selection: [1, indent.length, 1, indent.length]\n                        };\n                    } else {\n                        return {\n                            text: \"\\n\" + indent\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n};\n\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\nace.define(\"ace/mode/behaviour/xquery\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/mode/behaviour/xml\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\n  var oop = require(\"../../lib/oop\");\n  var Behaviour = require('../behaviour').Behaviour;\n  var CstyleBehaviour = require('./cstyle').CstyleBehaviour;\n  var XmlBehaviour = require(\"../behaviour/xml\").XmlBehaviour;\n  var TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nfunction hasType(token, type) {\n    var hasType = true;\n    var typeList = token.type.split('.');\n    var needleList = type.split('.');\n    needleList.forEach(function(needle){\n        if (typeList.indexOf(needle) == -1) {\n            hasType = false;\n            return false;\n        }\n    });\n    return hasType;\n}\n \n  var XQueryBehaviour = function () {\n      \n      this.inherit(CstyleBehaviour, [\"braces\", \"parens\", \"string_dquotes\"]); // Get string behaviour\n      this.inherit(XmlBehaviour); // Get xml behaviour\n      \n      this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken();\n            var atCursor = false;\n            var state = JSON.parse(state).pop();\n            if ((token && token.value === '>') || state !== \"StartTag\") return;\n            if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){\n                do {\n                    token = iterator.stepBackward();\n                } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text')));\n            } else {\n                atCursor = true;\n            }\n            var previous = iterator.stepBackward();\n            if (!token || !hasType(token, 'meta.tag') || (previous !== null && previous.value.match('/'))) {\n                return\n            }\n            var tag = token.value.substring(1);\n            if (atCursor){\n                var tag = tag.substring(0, position.column - token.start);\n            }\n\n            return {\n               text: '>' + '</' + tag + '>',\n               selection: [1, 1]\n            }\n        }\n    });\n\n  }\n  oop.inherits(XQueryBehaviour, Behaviour);\n\n  exports.XQueryBehaviour = XQueryBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/jsoniq\",[\"require\",\"exports\",\"module\",\"ace/worker/worker_client\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/text_highlight_rules\",\"ace/mode/xquery/jsoniq_lexer\",\"ace/range\",\"ace/mode/behaviour/xquery\",\"ace/mode/folding/cstyle\",\"ace/anchor\"], function(require, exports, module) {\n\"use strict\";\n\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar JSONiqLexer = require(\"./xquery/jsoniq_lexer\").JSONiqLexer;\nvar Range = require(\"../range\").Range;\nvar XQueryBehaviour = require(\"./behaviour/xquery\").XQueryBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\nvar Anchor = require(\"../anchor\").Anchor;\n\nvar Mode = function() {\n    this.$tokenizer   = new JSONiqLexer();\n    this.$behaviour   = new XQueryBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n    this.$highlightRules = new TextHighlightRules();\n};\n\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.completer = {\n        getCompletions: function(editor, session, pos, prefix, callback) {\n            if (!session.$worker)\n                return callback();\n            session.$worker.emit(\"complete\", { data: { pos: pos, prefix: prefix } });\n            session.$worker.on(\"complete\", function(e){\n                callback(null, e.data);\n            });\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var match = line.match(/\\s*(?:then|else|return|[{\\(]|<\\w+>)\\s*$/);\n        if (match)\n            indent += tab;\n        return indent;\n    };\n    \n    this.checkOutdent = function(state, line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*[\\}\\)]/.test(input);\n    };\n    \n    this.autoOutdent = function(state, doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*[\\}\\)])/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var i, line;\n        var outdent = true;\n        var re = /^\\s*\\(:(.*):\\)/;\n\n        for (i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        var range = new Range(0, 0, 0, 0);\n        for (i=startRow; i<= endRow; i++) {\n            line = doc.getLine(i);\n            range.start.row  = i;\n            range.end.row    = i;\n            range.end.column = line.length;\n\n            doc.replace(range, outdent ? line.match(re)[1] : \"(:\" + line + \":)\");\n        }\n    };\n    this.createWorker = function(session) {\n        \n      var worker = new WorkerClient([\"ace\"], \"ace/mode/xquery_worker\", \"XQueryWorker\");\n        var that = this;\n\n        worker.attachToDocument(session.getDocument());\n        \n        worker.on(\"ok\", function(e) {\n          session.clearAnnotations();\n        });\n        \n        worker.on(\"markers\", function(e) {\n          session.clearAnnotations();\n          that.addMarkers(e.data, session);\n        });\n \n        return worker;\n    };\n \n    this.removeMarkers = function(session) {\n        var markers = session.getMarkers(false);\n        for (var id in markers) {\n            if (markers[id].clazz.indexOf('language_highlight_') === 0) {\n                session.removeMarker(id);\n            }\n        }\n        for (var i = 0; i < session.markerAnchors.length; i++) {\n            session.markerAnchors[i].detach();\n        }\n        session.markerAnchors = [];\n    };\n\n    this.addMarkers = function(annos, mySession) {\n        var _self = this;\n        \n        if (!mySession.markerAnchors) mySession.markerAnchors = [];\n        this.removeMarkers(mySession);\n        mySession.languageAnnos = [];\n        annos.forEach(function(anno) {\n            var anchor = new Anchor(mySession.getDocument(), anno.pos.sl, anno.pos.sc || 0);\n            mySession.markerAnchors.push(anchor);\n            var markerId;\n            var colDiff = anno.pos.ec - anno.pos.sc;\n            var rowDiff = anno.pos.el - anno.pos.sl;\n            var gutterAnno = {\n                guttertext: anno.message,\n                type: anno.level || \"warning\",\n                text: anno.message\n            };\n\n            function updateFloat(single) {\n                if (markerId)\n                    mySession.removeMarker(markerId);\n                gutterAnno.row = anchor.row;\n                if (anno.pos.sc !== undefined && anno.pos.ec !== undefined) {\n                    var range = new Range(anno.pos.sl, anno.pos.sc, anno.pos.el, anno.pos.ec);\n                    markerId = mySession.addMarker(range, \"language_highlight_\" + (anno.type ? anno.type : \"default\"));\n                }\n                if (single) mySession.setAnnotations(mySession.languageAnnos);\n            }\n            updateFloat();\n            anchor.on(\"change\", function() {\n                updateFloat(true);\n            });\n            if (anno.message) mySession.languageAnnos.push(gutterAnno);\n        });\n        mySession.setAnnotations(mySession.languageAnnos);\n    }; \n\n    this.$id = \"ace/mode/jsoniq\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-jsp.js",
    "content": "ace.define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\nace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"string.cdata.xml\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.xml-decl.xml\", \"keyword.xml-decl.xml\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_decl\", caseInsensitive: true\n            },\n            {\n                token : [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"processing_instruction\",\n            },\n            {token : \"comment.xml\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\", caseInsensitive: true\n            },\n            {include : \"tag\"},\n            {token : \"text.end-tag-open.xml\", regex: \"</\"},\n            {token : \"text.tag-open.xml\", regex: \"<\"},\n            {include : \"reference\"},\n            {defaultToken : \"text.xml\"}\n        ],\n\n        xml_decl : [{\n            token : \"entity.other.attribute-name.decl-attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.decl-attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"whitespace\"\n        }, {\n            include: \"string\"\n        }, {\n            token : \"punctuation.xml-decl.xml\",\n            regex : \"\\\\?>\",\n            next : \"start\"\n        }],\n\n        processing_instruction : [\n            {token : \"punctuation.instruction.xml\", regex : \"\\\\?>\", next : \"start\"},\n            {defaultToken : \"instruction.xml\"}\n        ],\n\n        doctype : [\n            {include : \"whitespace\"},\n            {include : \"string\"},\n            {token : \"xml-pe.doctype.xml\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe.xml\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.int-subset\", regex : \"\\\\[\", push : \"int_subset\"}\n        ],\n\n        int_subset : [{\n            token : \"text.xml\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.int-subset.xml\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.markup-decl.xml\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.cdata.xml\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text.xml\", regex : \"\\\\s+\"},\n            {token : \"text.xml\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment.xml\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment.xml\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape.reference.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        attr_reference : [{\n            token : \"constant.language.escape.reference.attribute-value.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n            regex : \"(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n            ]\n        }],\n\n        tag_whitespace : [\n            {token : \"text.tag-whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        whitespace : [\n            {token : \"text.whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        string: [{\n            token : \"string.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.xml\", regex: \"'\", next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }, {\n            token : \"string.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.xml\", regex: '\"', next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }],\n\n        attributes: [{\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"tag_whitespace\"\n        }, {\n            include: \"attribute_value\"\n        }],\n\n        attribute_value: [{\n            token : \"string.attribute-value.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }, {\n            token : \"string.attribute-value.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\nace.define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    option      : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.addRules({\n        attributes: [{\n            include : \"tag_whitespace\"\n        }, {\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\",\n            push : [{\n                include: \"tag_whitespace\"\n            }, {\n                token : \"string.unquoted.attribute-value.html\",\n                regex : \"[^<>='\\\"`\\\\s]+\",\n                next : \"pop\"\n            }, {\n                token : \"empty\",\n                regex : \"\",\n                next : \"pop\"\n            }]\n        }, {\n            include : \"attribute_value\"\n        }],\n        tag: [{\n            token : function(start, tag) {\n                var group = tagMap[tag];\n                return [\"meta.tag.punctuation.\" + (start == \"<\" ? \"\" : \"end-\") + \"tag-open.xml\",\n                    \"meta.tag\" + (group ? \".\" + group : \"\") + \".tag-name.xml\"];\n            },\n            regex : \"(</?)([-_a-zA-Z0-9:]+)\",\n            next: \"tag_stuff\"\n        }],\n        tag_stuff: [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n        ],\n    });\n\n    this.embedTagRules(CssHighlightRules, \"css-\", \"style\");\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    if (this.constructor === HtmlHighlightRules)\n        this.normalizeRules();\n};\n\noop.inherits(HtmlHighlightRules, XmlHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\nace.define(\"ace/mode/java_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaHighlightRules = function() {\n    var keywords = (\n    \"abstract|continue|for|new|switch|\" +\n    \"assert|default|goto|package|synchronized|\" +\n    \"boolean|do|if|private|this|\" +\n    \"break|double|implements|protected|throw|\" +\n    \"byte|else|import|public|throws|\" +\n    \"case|enum|instanceof|return|transient|\" +\n    \"catch|extends|int|short|try|\" +\n    \"char|final|interface|static|void|\" +\n    \"class|finally|long|strictfp|volatile|\" +\n    \"const|float|native|super|while\"\n    );\n\n    var buildinConstants = (\"null|Infinity|NaN|undefined\");\n\n\n    var langClasses = (\n        \"AbstractMethodError|AssertionError|ClassCircularityError|\"+\n        \"ClassFormatError|Deprecated|EnumConstantNotPresentException|\"+\n        \"ExceptionInInitializerError|IllegalAccessError|\"+\n        \"IllegalThreadStateException|InstantiationError|InternalError|\"+\n        \"NegativeArraySizeException|NoSuchFieldError|Override|Process|\"+\n        \"ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|\"+\n        \"SuppressWarnings|TypeNotPresentException|UnknownError|\"+\n        \"UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|\"+\n        \"InstantiationException|IndexOutOfBoundsException|\"+\n        \"ArrayIndexOutOfBoundsException|CloneNotSupportedException|\"+\n        \"NoSuchFieldException|IllegalArgumentException|NumberFormatException|\"+\n        \"SecurityException|Void|InheritableThreadLocal|IllegalStateException|\"+\n        \"InterruptedException|NoSuchMethodException|IllegalAccessException|\"+\n        \"UnsupportedOperationException|Enum|StrictMath|Package|Compiler|\"+\n        \"Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|\"+\n        \"NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|\"+\n        \"NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|\"+\n        \"Character|Boolean|StackTraceElement|Appendable|StringBuffer|\"+\n        \"Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|\"+\n        \"StackOverflowError|OutOfMemoryError|VirtualMachineError|\"+\n        \"ArrayStoreException|ClassCastException|LinkageError|\"+\n        \"NoClassDefFoundError|ClassNotFoundException|RuntimeException|\"+\n        \"Exception|ThreadDeath|Error|Throwable|System|ClassLoader|\"+\n        \"Cloneable|Class|CharSequence|Comparable|String|Object\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": \"this\",\n        \"keyword\": keywords,\n        \"constant.language\": buildinConstants,\n        \"support.function\": langClasses\n    }, \"identifier\");\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"\n            }, {\n                token : \"lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(JavaHighlightRules, TextHighlightRules);\n\nexports.JavaHighlightRules = JavaHighlightRules;\n});\n\nace.define(\"ace/mode/jsp_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html_highlight_rules\",\"ace/mode/java_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar JavaHighlightRules = require(\"./java_highlight_rules\").JavaHighlightRules;\n\nvar JspHighlightRules = function() {\n    HtmlHighlightRules.call(this);\n\n    var builtinVariables = 'request|response|out|session|' +\n            'application|config|pageContext|page|Exception';\n\n    var keywords = 'page|include|taglib';\n\n    var startRules = [\n        {\n            token : \"comment\",\n            regex : \"<%--\",\n            push : \"jsp-dcomment\"\n        }, {\n            token : \"meta.tag\", // jsp open tag\n            regex : \"<%@?|<%=?|<jsp:[^>]+>\",\n            push  : \"jsp-start\"\n        }\n    ];\n\n    var endRules = [\n        {\n            token : \"meta.tag\", // jsp close tag\n            regex : \"%>|<\\\\/jsp:[^>]+>\",\n            next  : \"pop\"\n        }, {\n            token: \"variable.language\",\n            regex : builtinVariables\n        }, {\n            token: \"keyword\",\n            regex : keywords\n        }\n    ];\n\n    for (var key in this.$rules)\n        this.$rules[key].unshift.apply(this.$rules[key], startRules);\n\n    this.embedRules(JavaHighlightRules, \"jsp-\", endRules, [\"start\"]);\n\n    this.addRules({\n        \"jsp-dcomment\" : [{\n            token : \"comment\",\n            regex : \".*?--%>\",\n            next : \"pop\"\n        }]\n    });\n\n    this.normalizeRules();\n};\n\noop.inherits(JspHighlightRules, HtmlHighlightRules);\n\nexports.JspHighlightRules = JspHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/jsp\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/jsp_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JspHighlightRules = require(\"./jsp_highlight_rules\").JspHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JspHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.$id = \"ace/mode/jsp\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-jsx.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/jsx_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JsxHighlightRules = function() {\n    var keywords = lang.arrayToMap(\n        (\"break|do|instanceof|typeof|case|else|new|var|catch|finally|return|void|continue|for|switch|default|while|function|this|\" +\n         \"if|throw|\" +\n         \"delete|in|try|\" +\n         \"class|extends|super|import|from|into|implements|interface|static|mixin|override|abstract|final|\" +\n         \"number|int|string|boolean|variant|\" +\n         \"log|assert\").split(\"|\")\n    );\n    \n    var buildinConstants = lang.arrayToMap(\n        (\"null|true|false|NaN|Infinity|__FILE__|__LINE__|undefined\").split(\"|\")\n    );\n    \n    var reserved = lang.arrayToMap(\n        (\"debugger|with|\" +\n         \"const|export|\" +\n         \"let|private|public|yield|protected|\" +\n         \"extern|native|as|operator|__fake__|__readonly__\").split(\"|\")\n    );\n    \n    var identifierRe = \"[a-zA-Z_][a-zA-Z0-9_]*\\\\b\";\n    \n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string.regexp\",\n                regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : [\n                    \"storage.type\",\n                    \"text\",\n                    \"entity.name.function\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")\"\n            }, {\n                token : function(value) {\n                    if (value == \"this\")\n                        return \"variable.language\";\n                    else if (value == \"function\")\n                        return \"storage.type\";\n                    else if (keywords.hasOwnProperty(value) || reserved.hasOwnProperty(value))\n                        return \"keyword\";\n                    else if (buildinConstants.hasOwnProperty(value))\n                        return \"constant.language\";\n                    else if (/^_?[A-Z][a-zA-Z0-9_]*$/.test(value))\n                        return \"language.support.class\";\n                    else\n                        return \"identifier\";\n                },\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : \"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({<]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}>]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ]\n    };\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(JsxHighlightRules, TextHighlightRules);\n\nexports.JsxHighlightRules = JsxHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/jsx\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/jsx_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JsxHighlightRules = require(\"./jsx_highlight_rules\").JsxHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nfunction Mode() {\n    this.HighlightRules = JsxHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n}\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/jsx\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-julia.js",
    "content": "ace.define(\"ace/mode/julia_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JuliaHighlightRules = function() {\n\n    this.$rules = { start: \n       [ { include: '#function_decl' },\n         { include: '#function_call' },\n         { include: '#type_decl' },\n         { include: '#keyword' },\n         { include: '#operator' },\n         { include: '#number' },\n         { include: '#string' },\n         { include: '#comment' } ],\n      '#bracket': \n       [ { token: 'keyword.bracket.julia',\n           regex: '\\\\(|\\\\)|\\\\[|\\\\]|\\\\{|\\\\}|,' } ],\n      '#comment': \n       [ { token: \n            [ 'punctuation.definition.comment.julia',\n              'comment.line.number-sign.julia' ],\n           regex: '(#)(?!\\\\{)(.*$)'} ],\n      '#function_call': \n       [ { token: [ 'support.function.julia', 'text' ],\n           regex: '([a-zA-Z0-9_]+!?)([\\\\w\\\\xff-\\\\u218e\\\\u2455-\\\\uffff]*\\\\()'} ],\n      '#function_decl': \n       [ { token: [ 'keyword.other.julia', 'meta.function.julia',\n               'entity.name.function.julia', 'meta.function.julia','text' ],\n           regex: '(function|macro)(\\\\s*)([a-zA-Z0-9_\\\\{]+!?)([\\\\w\\\\xff-\\\\u218e\\\\u2455-\\\\uffff]*)([(\\\\\\\\{])'} ],\n      '#keyword':\n       [ { token: 'keyword.other.julia',\n           regex: '\\\\b(?:function|type|immutable|macro|quote|abstract|bitstype|typealias|module|baremodule|new)\\\\b' },\n         { token: 'keyword.control.julia',\n           regex: '\\\\b(?:if|else|elseif|while|for|in|begin|let|end|do|try|catch|finally|return|break|continue)\\\\b' },\n         { token: 'storage.modifier.variable.julia',\n           regex: '\\\\b(?:global|local|const|export|import|importall|using)\\\\b' },\n         { token: 'variable.macro.julia', regex: '@[\\\\w\\\\xff-\\\\u218e\\\\u2455-\\\\uffff]+\\\\b' } ],\n      '#number': \n       [ { token: 'constant.numeric.julia',\n           regex: '\\\\b0(?:x|X)[0-9a-fA-F]*|(?:\\\\b[0-9]+\\\\.?[0-9]*|\\\\.[0-9]+)(?:(?:e|E)(?:\\\\+|-)?[0-9]*)?(?:im)?|\\\\bInf(?:32)?\\\\b|\\\\bNaN(?:32)?\\\\b|\\\\btrue\\\\b|\\\\bfalse\\\\b' } ],\n      '#operator': \n       [ { token: 'keyword.operator.update.julia',\n           regex: '=|:=|\\\\+=|-=|\\\\*=|/=|//=|\\\\.//=|\\\\.\\\\*=|\\\\\\\\=|\\\\.\\\\\\\\=|^=|\\\\.^=|%=|\\\\|=|&=|\\\\$=|<<=|>>=' },\n         { token: 'keyword.operator.ternary.julia', regex: '\\\\?|:' },\n         { token: 'keyword.operator.boolean.julia',\n           regex: '\\\\|\\\\||&&|!' },\n         { token: 'keyword.operator.arrow.julia', regex: '->|<-|-->' },\n         { token: 'keyword.operator.relation.julia',\n           regex: '>|<|>=|<=|==|!=|\\\\.>|\\\\.<|\\\\.>=|\\\\.>=|\\\\.==|\\\\.!=|\\\\.=|\\\\.!|<:|:>' },\n         { token: 'keyword.operator.range.julia', regex: ':' },\n         { token: 'keyword.operator.shift.julia', regex: '<<|>>' },\n         { token: 'keyword.operator.bitwise.julia', regex: '\\\\||\\\\&|~' },\n         { token: 'keyword.operator.arithmetic.julia',\n           regex: '\\\\+|-|\\\\*|\\\\.\\\\*|/|\\\\./|//|\\\\.//|%|\\\\.%|\\\\\\\\|\\\\.\\\\\\\\|\\\\^|\\\\.\\\\^' },\n         { token: 'keyword.operator.isa.julia', regex: '::' },\n         { token: 'keyword.operator.dots.julia',\n           regex: '\\\\.(?=[a-zA-Z])|\\\\.\\\\.+' },\n         { token: 'keyword.operator.interpolation.julia',\n           regex: '\\\\$#?(?=.)' },\n         { token: [ 'variable', 'keyword.operator.transposed-variable.julia' ],\n           regex: '([\\\\w\\\\xff-\\\\u218e\\\\u2455-\\\\uffff]+)((?:\\'|\\\\.\\')*\\\\.?\\')' },\n         { token: 'text',\n           regex: '\\\\[|\\\\('},\n         { token: [ 'text', 'keyword.operator.transposed-matrix.julia' ],\n            regex: \"([\\\\]\\\\)])((?:'|\\\\.')*\\\\.?')\"} ],\n      '#string': \n       [ { token: 'punctuation.definition.string.begin.julia',\n           regex: '\\'',\n           push: \n            [ { token: 'punctuation.definition.string.end.julia',\n                regex: '\\'',\n                next: 'pop' },\n              { include: '#string_escaped_char' },\n              { defaultToken: 'string.quoted.single.julia' } ] },\n         { token: 'punctuation.definition.string.begin.julia',\n           regex: '\"',\n           push: \n            [ { token: 'punctuation.definition.string.end.julia',\n                regex: '\"',\n                next: 'pop' },\n              { include: '#string_escaped_char' },\n              { defaultToken: 'string.quoted.double.julia' } ] },\n         { token: 'punctuation.definition.string.begin.julia',\n           regex: '\\\\b[\\\\w\\\\xff-\\\\u218e\\\\u2455-\\\\uffff]+\"',\n           push: \n            [ { token: 'punctuation.definition.string.end.julia',\n                regex: '\"[\\\\w\\\\xff-\\\\u218e\\\\u2455-\\\\uffff]*',\n                next: 'pop' },\n              { include: '#string_custom_escaped_char' },\n              { defaultToken: 'string.quoted.custom-double.julia' } ] },\n         { token: 'punctuation.definition.string.begin.julia',\n           regex: '`',\n           push: \n            [ { token: 'punctuation.definition.string.end.julia',\n                regex: '`',\n                next: 'pop' },\n              { include: '#string_escaped_char' },\n              { defaultToken: 'string.quoted.backtick.julia' } ] } ],\n      '#string_custom_escaped_char': [ { token: 'constant.character.escape.julia', regex: '\\\\\\\\\"' } ],\n      '#string_escaped_char': \n       [ { token: 'constant.character.escape.julia',\n           regex: '\\\\\\\\(?:\\\\\\\\|[0-3]\\\\d{,2}|[4-7]\\\\d?|x[a-fA-F0-9]{,2}|u[a-fA-F0-9]{,4}|U[a-fA-F0-9]{,8}|.)' } ],\n      '#type_decl': \n       [ { token: \n            [ 'keyword.control.type.julia',\n              'meta.type.julia',\n              'entity.name.type.julia',\n              'entity.other.inherited-class.julia',\n              'punctuation.separator.inheritance.julia',\n              'entity.other.inherited-class.julia' ],\n           regex: '(type|immutable)(\\\\s+)([a-zA-Z0-9_]+)(?:(\\\\s*)(<:)(\\\\s*[.a-zA-Z0-9_:]+))?' },\n         { token: [ 'other.typed-variable.julia', 'support.type.julia' ],\n           regex: '([a-zA-Z0-9_]+)(::[a-zA-Z0-9_{}]+)' } ] }\n    \n    this.normalizeRules();\n};\n\nJuliaHighlightRules.metaData = { fileTypes: [ 'jl' ],\n      firstLineMatch: '^#!.*\\\\bjulia\\\\s*$',\n      foldingStartMarker: '^\\\\s*(?:if|while|for|begin|function|macro|module|baremodule|type|immutable|let)\\\\b(?!.*\\\\bend\\\\b).*$',\n      foldingStopMarker: '^\\\\s*(?:end)\\\\b.*$',\n      name: 'Julia',\n      scopeName: 'source.julia' }\n\n\noop.inherits(JuliaHighlightRules, TextHighlightRules);\n\nexports.JuliaHighlightRules = JuliaHighlightRules;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/julia\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/julia_highlight_rules\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JuliaHighlightRules = require(\"./julia_highlight_rules\").JuliaHighlightRules;\nvar FoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JuliaHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"#\";\n    this.blockComment = \"\";\n    this.$id = \"ace/mode/julia\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-latex.js",
    "content": "ace.define(\"ace/mode/latex_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar LatexHighlightRules = function() {  \n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\",\n            regex : \"%.*$\"\n        }, {\n            token : [\"keyword\", \"lparen\", \"variable.parameter\", \"rparen\", \"lparen\", \"storage.type\", \"rparen\"],\n            regex : \"(\\\\\\\\(?:documentclass|usepackage|input))(?:(\\\\[)([^\\\\]]*)(\\\\]))?({)([^}]*)(})\"\n        }, {\n            token : [\"keyword\",\"lparen\", \"variable.parameter\", \"rparen\"],\n            regex : \"(\\\\\\\\(?:label|v?ref|cite(?:[^{]*)))(?:({)([^}]*)(}))?\"\n        }, {\n            token : [\"storage.type\", \"lparen\", \"variable.parameter\", \"rparen\"],\n            regex : \"(\\\\\\\\(?:begin|end))({)(\\\\w*)(})\"\n        }, {\n            token : \"storage.type\",\n            regex : \"\\\\\\\\[a-zA-Z]+\"\n        }, {\n            token : \"lparen\",\n            regex : \"[[({]\"\n        }, {\n            token : \"rparen\",\n            regex : \"[\\\\])}]\"\n        }, {\n            token : \"constant.character.escape\",\n            regex : \"\\\\\\\\[^a-zA-Z]?\"\n        }, {\n            token : \"string\",\n            regex : \"\\\\${1,2}\",\n            next  : \"equation\"\n        }],\n        \"equation\" : [{\n            token : \"comment\",\n            regex : \"%.*$\"\n        }, {\n            token : \"string\",\n            regex : \"\\\\${1,2}\",\n            next  : \"start\"\n        }, {\n            token : \"constant.character.escape\",\n            regex : \"\\\\\\\\(?:[^a-zA-Z]|[a-zA-Z]+)\"\n        }, {\n            token : \"error\", \n            regex : \"^\\\\s*$\", \n            next : \"start\" \n        }, {\n            defaultToken : \"string\"\n        }]\n\n    };\n};\noop.inherits(LatexHighlightRules, TextHighlightRules);\n\nexports.LatexHighlightRules = LatexHighlightRules;\n\n});\n\nace.define(\"ace/mode/folding/latex\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function() {};\n\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /^\\s*\\\\(begin)|(section|subsection|paragraph)\\b|{\\s*$/;\n    this.foldingStopMarker = /^\\s*\\\\(end)\\b|^\\s*}/;\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.doc.getLine(row);\n        var match = this.foldingStartMarker.exec(line);\n        if (match) {\n            if (match[1])\n                return this.latexBlock(session, row, match[0].length - 1);\n            if (match[2])\n                return this.latexSection(session, row, match[0].length - 1);\n\n            return this.openingBracketBlock(session, \"{\", row, match.index);\n        }\n\n        var match = this.foldingStopMarker.exec(line);\n        if (match) {\n            if (match[1])\n                return this.latexBlock(session, row, match[0].length - 1);\n\n            return this.closingBracketBlock(session, \"}\", row, match.index + match[0].length);\n        }\n    };\n\n    this.latexBlock = function(session, row, column) {\n        var keywords = {\n            \"\\\\begin\": 1,\n            \"\\\\end\": -1\n        };\n\n        var stream = new TokenIterator(session, row, column);\n        var token = stream.getCurrentToken();\n        if (!token || !(token.type == \"storage.type\" || token.type == \"constant.character.escape\"))\n            return;\n\n        var val = token.value;\n        var dir = keywords[val];\n\n        var getType = function() {\n            var token = stream.stepForward();\n            var type = token.type == \"lparen\" ?stream.stepForward().value : \"\";\n            if (dir === -1) {\n                stream.stepBackward();\n                if (type)\n                    stream.stepBackward();\n            }\n            return type;\n        };\n        var stack = [getType()];\n        var startColumn = dir === -1 ? stream.getCurrentTokenColumn() : session.getLine(row).length;\n        var startRow = row;\n\n        stream.step = dir === -1 ? stream.stepBackward : stream.stepForward;\n        while(token = stream.step()) {\n            if (!token || !(token.type == \"storage.type\" || token.type == \"constant.character.escape\"))\n                continue;\n            var level = keywords[token.value];\n            if (!level)\n                continue;\n            var type = getType();\n            if (level === dir)\n                stack.unshift(type);\n            else if (stack.shift() !== type || !stack.length)\n                break;\n        }\n\n        if (stack.length)\n            return;\n\n        var row = stream.getCurrentTokenRow();\n        if (dir === -1)\n            return new Range(row, session.getLine(row).length, startRow, startColumn);\n        stream.stepBackward();\n        return new Range(startRow, startColumn, row, stream.getCurrentTokenColumn());\n    };\n\n    this.latexSection = function(session, row, column) {\n        var keywords = [\"\\\\subsection\", \"\\\\section\", \"\\\\begin\", \"\\\\end\", \"\\\\paragraph\"];\n\n        var stream = new TokenIterator(session, row, column);\n        var token = stream.getCurrentToken();\n        if (!token || token.type != \"storage.type\")\n            return;\n\n        var startLevel = keywords.indexOf(token.value);\n        var stackDepth = 0\n        var endRow = row;\n\n        while(token = stream.stepForward()) {\n            if (token.type !== \"storage.type\")\n                continue;\n            var level = keywords.indexOf(token.value);\n\n            if (level >= 2) {\n                if (!stackDepth)\n                    endRow = stream.getCurrentTokenRow() - 1;\n                stackDepth += level == 2 ? 1 : - 1;\n                if (stackDepth < 0)\n                    break\n            } else if (level >= startLevel)\n                break;\n        }\n\n        if (!stackDepth)\n            endRow = stream.getCurrentTokenRow() - 1;\n\n        while (endRow > row && !/\\S/.test(session.getLine(endRow)))\n            endRow--;\n\n        return new Range(\n            row, session.getLine(row).length,\n            endRow, session.getLine(endRow).length\n        );\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/latex\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/latex_highlight_rules\",\"ace/mode/folding/latex\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar LatexHighlightRules = require(\"./latex_highlight_rules\").LatexHighlightRules;\nvar LatexFoldMode = require(\"./folding/latex\").FoldMode;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.HighlightRules = LatexHighlightRules;\n    this.foldingRules = new LatexFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.type = \"text\";\n    \n    this.lineCommentStart = \"%\";\n\n    this.$id = \"ace/mode/latex\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-less.js",
    "content": "ace.define(\"ace/mode/less_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar LessHighlightRules = function() {\n    \n    var properties = lang.arrayToMap( (function () {\n\n        var browserPrefix = (\"-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-\").split(\"|\");\n        \n        var prefixProperties = (\"appearance|background-clip|background-inline-policy|background-origin|\" + \n             \"background-size|binding|border-bottom-colors|border-left-colors|\" + \n             \"border-right-colors|border-top-colors|border-end|border-end-color|\" + \n             \"border-end-style|border-end-width|border-image|border-start|\" + \n             \"border-start-color|border-start-style|border-start-width|box-align|\" + \n             \"box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|\" + \n             \"box-pack|box-sizing|column-count|column-gap|column-width|column-rule|\" + \n             \"column-rule-width|column-rule-style|column-rule-color|float-edge|\" + \n             \"font-feature-settings|font-language-override|force-broken-image-icon|\" + \n             \"image-region|margin-end|margin-start|opacity|outline|outline-color|\" + \n             \"outline-offset|outline-radius|outline-radius-bottomleft|\" + \n             \"outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|\" + \n             \"outline-style|outline-width|padding-end|padding-start|stack-sizing|\" + \n             \"tab-size|text-blink|text-decoration-color|text-decoration-line|\" + \n             \"text-decoration-style|transform|transform-origin|transition|\" + \n             \"transition-delay|transition-duration|transition-property|\" + \n             \"transition-timing-function|user-focus|user-input|user-modify|user-select|\" +\n             \"window-shadow|border-radius\").split(\"|\");\n        \n        var properties = (\"azimuth|background-attachment|background-color|background-image|\" +\n            \"background-position|background-repeat|background|border-bottom-color|\" +\n            \"border-bottom-style|border-bottom-width|border-bottom|border-collapse|\" +\n            \"border-color|border-left-color|border-left-style|border-left-width|\" +\n            \"border-left|border-right-color|border-right-style|border-right-width|\" +\n            \"border-right|border-spacing|border-style|border-top-color|\" +\n            \"border-top-style|border-top-width|border-top|border-width|border|\" +\n            \"bottom|box-sizing|caption-side|clear|clip|color|content|counter-increment|\" +\n            \"counter-reset|cue-after|cue-before|cue|cursor|direction|display|\" +\n            \"elevation|empty-cells|float|font-family|font-size-adjust|font-size|\" +\n            \"font-stretch|font-style|font-variant|font-weight|font|height|left|\" +\n            \"letter-spacing|line-height|list-style-image|list-style-position|\" +\n            \"list-style-type|list-style|margin-bottom|margin-left|margin-right|\" +\n            \"margin-top|marker-offset|margin|marks|max-height|max-width|min-height|\" +\n            \"min-width|opacity|orphans|outline-color|\" +\n            \"outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|\" +\n            \"padding-left|padding-right|padding-top|padding|page-break-after|\" +\n            \"page-break-before|page-break-inside|page|pause-after|pause-before|\" +\n            \"pause|pitch-range|pitch|play-during|position|quotes|richness|right|\" +\n            \"size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|\" +\n            \"stress|table-layout|text-align|text-decoration|text-indent|\" +\n            \"text-shadow|text-transform|top|unicode-bidi|vertical-align|\" +\n            \"visibility|voice-family|volume|white-space|widows|width|word-spacing|\" +\n            \"z-index\").split(\"|\");\n        var ret = [];\n        for (var i=0, ln=browserPrefix.length; i<ln; i++) {\n            Array.prototype.push.apply(\n                ret,\n                (( browserPrefix[i] + prefixProperties.join(\"|\" + browserPrefix[i]) ).split(\"|\"))\n            );\n        }\n        Array.prototype.push.apply(ret, prefixProperties);\n        Array.prototype.push.apply(ret, properties);\n        \n        return ret;\n        \n    })() );\n    \n\n\n    var functions = lang.arrayToMap(\n        (\"hsl|hsla|rgb|rgba|url|attr|counter|counters|lighten|darken|saturate|\" +\n        \"desaturate|fadein|fadeout|fade|spin|mix|hue|saturation|lightness|\" +\n        \"alpha|round|ceil|floor|percentage|color|iscolor|isnumber|isstring|\" +\n        \"iskeyword|isurl|ispixel|ispercentage|isem\").split(\"|\")\n    );\n\n    var constants = lang.arrayToMap(\n        (\"absolute|all-scroll|always|armenian|auto|baseline|below|bidi-override|\" +\n        \"block|bold|bolder|border-box|both|bottom|break-all|break-word|capitalize|center|\" +\n        \"char|circle|cjk-ideographic|col-resize|collapse|content-box|crosshair|dashed|\" +\n        \"decimal-leading-zero|decimal|default|disabled|disc|\" +\n        \"distribute-all-lines|distribute-letter|distribute-space|\" +\n        \"distribute|dotted|double|e-resize|ellipsis|fixed|georgian|groove|\" +\n        \"hand|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|\" +\n        \"ideograph-alpha|ideograph-numeric|ideograph-parenthesis|\" +\n        \"ideograph-space|inactive|inherit|inline-block|inline|inset|inside|\" +\n        \"inter-ideograph|inter-word|italic|justify|katakana-iroha|katakana|\" +\n        \"keep-all|left|lighter|line-edge|line-through|line|list-item|loose|\" +\n        \"lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|\" +\n        \"medium|middle|move|n-resize|ne-resize|newspaper|no-drop|no-repeat|\" +\n        \"nw-resize|none|normal|not-allowed|nowrap|oblique|outset|outside|\" +\n        \"overline|pointer|progress|relative|repeat-x|repeat-y|repeat|right|\" +\n        \"ridge|row-resize|rtl|s-resize|scroll|se-resize|separate|small-caps|\" +\n        \"solid|square|static|strict|super|sw-resize|table-footer-group|\" +\n        \"table-header-group|tb-rl|text-bottom|text-top|text|thick|thin|top|\" +\n        \"transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|\" +\n        \"vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|\" +\n        \"zero\").split(\"|\")\n    );\n\n    var colors = lang.arrayToMap(\n        (\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|\" +\n        \"purple|red|silver|teal|white|yellow\").split(\"|\")\n    );\n    \n    var keywords = lang.arrayToMap(\n        (\"@mixin|@extend|@include|@import|@media|@debug|@warn|@if|@for|@each|\" +\n        \"@while|@else|@font-face|@-webkit-keyframes|if|and|!default|module|\" +\n        \"def|end|declare|when|not|and\").split(\"|\")\n    );\n    \n    var tags = lang.arrayToMap(\n        (\"a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdo|\" + \n         \"big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|\" + \n         \"command|datalist|dd|del|details|dfn|dir|div|dl|dt|em|embed|fieldset|\" + \n         \"figcaption|figure|font|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|\" + \n         \"header|hgroup|hr|html|i|iframe|img|input|ins|keygen|kbd|label|legend|li|\" + \n         \"link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|\" + \n         \"option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|\" + \n         \"small|source|span|strike|strong|style|sub|summary|sup|table|tbody|td|\" + \n         \"textarea|tfoot|th|thead|time|title|tr|tt|u|ul|var|video|wbr|xmp\").split(\"|\")\n    );\n\n    var numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"constant.numeric\",\n                regex : numRe + \"(?:em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)\"\n            }, {\n                token : \"constant.numeric\", // hex6 color\n                regex : \"#[a-f0-9]{6}\"\n            }, {\n                token : \"constant.numeric\", // hex3 color\n                regex : \"#[a-f0-9]{3}\"\n            }, {\n                token : \"constant.numeric\",\n                regex : numRe\n            }, {\n                token : function(value) {\n                    if (keywords.hasOwnProperty(value))\n                        return \"keyword\";\n                    else\n                        return \"variable\";\n                },\n                regex : \"@[a-z0-9_\\\\-@]*\\\\b\"\n            }, {\n                token : function(value) {\n                    if (properties.hasOwnProperty(value.toLowerCase()))\n                        return \"support.type\";\n                    else if (keywords.hasOwnProperty(value))\n                        return \"keyword\";\n                    else if (constants.hasOwnProperty(value))\n                        return \"constant.language\";\n                    else if (functions.hasOwnProperty(value))\n                        return \"support.function\";\n                    else if (colors.hasOwnProperty(value.toLowerCase()))\n                        return \"support.constant.color\";\n                    else if (tags.hasOwnProperty(value.toLowerCase()))\n                        return \"variable.language\";\n                    else\n                        return \"text\";\n                },\n                regex : \"\\\\-?[@a-z_][@a-z0-9_\\\\-]*\"\n            }, {\n                token: \"variable.language\",\n                regex: \"#[a-z0-9-_]+\"\n            }, {\n                token: \"variable.language\",\n                regex: \"\\\\.[a-z0-9-_]+\"\n            }, {\n                token: \"variable.language\",\n                regex: \":[a-z0-9-_]+\"\n            }, {\n                token: \"constant\",\n                regex: \"[a-z0-9-_]+\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"<|>|<=|>=|==|!=|-|%|#|\\\\+|\\\\$|\\\\+|\\\\*\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }, {\n                caseInsensitive: true\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ]\n    };\n};\n\noop.inherits(LessHighlightRules, TextHighlightRules);\n\nexports.LessHighlightRules = LessHighlightRules;\n\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar CssBehaviour = function () {\n\n    this.inherit(CstyleBehaviour);\n\n    this.add(\"colon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(cursor.row);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                if (rightChar === ':') {\n                    return {\n                       text: '',\n                       selection: [1, 1]\n                    }\n                }\n                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n                    return {\n                       text: ':;',\n                       selection: [1, 1]\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"colon\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(range.start.row);\n                var rightChar = line.substring(range.end.column, range.end.column + 1);\n                if (rightChar === ';') {\n                    range.end.column ++;\n                    return range;\n                }\n            }\n        }\n    });\n\n    this.add(\"semicolon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ';') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === ';') {\n                return {\n                   text: '',\n                   selection: [1, 1]\n                }\n            }\n        }\n    });\n\n}\noop.inherits(CssBehaviour, CstyleBehaviour);\n\nexports.CssBehaviour = CssBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/less\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/less_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar LessHighlightRules = require(\"./less_highlight_rules\").LessHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar CssBehaviour = require(\"./behaviour/css\").CssBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = LessHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CssBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n    \n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/less\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-liquid.js",
    "content": "ace.define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\nace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"string.cdata.xml\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.xml-decl.xml\", \"keyword.xml-decl.xml\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_decl\", caseInsensitive: true\n            },\n            {\n                token : [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"processing_instruction\",\n            },\n            {token : \"comment.xml\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\", caseInsensitive: true\n            },\n            {include : \"tag\"},\n            {token : \"text.end-tag-open.xml\", regex: \"</\"},\n            {token : \"text.tag-open.xml\", regex: \"<\"},\n            {include : \"reference\"},\n            {defaultToken : \"text.xml\"}\n        ],\n\n        xml_decl : [{\n            token : \"entity.other.attribute-name.decl-attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.decl-attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"whitespace\"\n        }, {\n            include: \"string\"\n        }, {\n            token : \"punctuation.xml-decl.xml\",\n            regex : \"\\\\?>\",\n            next : \"start\"\n        }],\n\n        processing_instruction : [\n            {token : \"punctuation.instruction.xml\", regex : \"\\\\?>\", next : \"start\"},\n            {defaultToken : \"instruction.xml\"}\n        ],\n\n        doctype : [\n            {include : \"whitespace\"},\n            {include : \"string\"},\n            {token : \"xml-pe.doctype.xml\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe.xml\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.int-subset\", regex : \"\\\\[\", push : \"int_subset\"}\n        ],\n\n        int_subset : [{\n            token : \"text.xml\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.int-subset.xml\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.markup-decl.xml\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.cdata.xml\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text.xml\", regex : \"\\\\s+\"},\n            {token : \"text.xml\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment.xml\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment.xml\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape.reference.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        attr_reference : [{\n            token : \"constant.language.escape.reference.attribute-value.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n            regex : \"(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n            ]\n        }],\n\n        tag_whitespace : [\n            {token : \"text.tag-whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        whitespace : [\n            {token : \"text.whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        string: [{\n            token : \"string.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.xml\", regex: \"'\", next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }, {\n            token : \"string.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.xml\", regex: '\"', next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }],\n\n        attributes: [{\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"tag_whitespace\"\n        }, {\n            include: \"attribute_value\"\n        }],\n\n        attribute_value: [{\n            token : \"string.attribute-value.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }, {\n            token : \"string.attribute-value.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\nace.define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    option      : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.addRules({\n        attributes: [{\n            include : \"tag_whitespace\"\n        }, {\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\",\n            push : [{\n                include: \"tag_whitespace\"\n            }, {\n                token : \"string.unquoted.attribute-value.html\",\n                regex : \"[^<>='\\\"`\\\\s]+\",\n                next : \"pop\"\n            }, {\n                token : \"empty\",\n                regex : \"\",\n                next : \"pop\"\n            }]\n        }, {\n            include : \"attribute_value\"\n        }],\n        tag: [{\n            token : function(start, tag) {\n                var group = tagMap[tag];\n                return [\"meta.tag.punctuation.\" + (start == \"<\" ? \"\" : \"end-\") + \"tag-open.xml\",\n                    \"meta.tag\" + (group ? \".\" + group : \"\") + \".tag-name.xml\"];\n            },\n            regex : \"(</?)([-_a-zA-Z0-9:]+)\",\n            next: \"tag_stuff\"\n        }],\n        tag_stuff: [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n        ],\n    });\n\n    this.embedTagRules(CssHighlightRules, \"css-\", \"style\");\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    if (this.constructor === HtmlHighlightRules)\n        this.normalizeRules();\n};\n\noop.inherits(HtmlHighlightRules, XmlHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\nace.define(\"ace/mode/liquid_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\",\"ace/mode/html_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\n\nvar LiquidHighlightRules = function() {\n    HtmlHighlightRules.call(this);\n    var functions = (\n        \"date|capitalize|downcase|upcase|first|last|join|sort|map|size|escape|\" +\n         \"escape_once|strip_html|strip_newlines|newline_to_br|replace|replace_first|\" +\n         \"truncate|truncatewords|prepend|append|minus|plus|times|divided_by|split\"\n    );\n\n    var keywords = (\n        \"capture|endcapture|case|endcase|when|comment|endcomment|\" +\n        \"cycle|for|endfor|in|reversed|if|endif|else|elsif|include|endinclude|unless|endunless|\" +\n        \"style|text|image|widget|plugin|marker|endmarker|tablerow|endtablerow\"\n    );\n\n    var builtinVariables = 'forloop|tablerowloop';\n\n    var definitions = (\"assign\");\n\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": builtinVariables,\n        \"keyword\": keywords,\n        \"support.function\": functions,\n        \"keyword.definition\": definitions\n    }, \"identifier\");\n    for (var rule in this.$rules) {\n        this.$rules[rule].unshift({\n            token : \"variable\",\n            regex : \"{%\",\n            push : \"liquid-start\"\n        }, {\n            token : \"variable\",\n            regex : \"{{\",\n            push : \"liquid-start\"\n        });\n    }\n\n    this.addRules({\n        \"liquid-start\" : [{\n            token: \"variable\",\n            regex: \"}}\",\n            next: \"pop\"\n        }, {\n            token: \"variable\",\n            regex: \"%}\",\n            next: \"pop\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : \"constant.numeric\", // hex\n            regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n        }, {\n            token : \"constant.language.boolean\",\n            regex : \"(?:true|false)\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\/|\\\\*|\\\\-|\\\\+|=|!=|\\\\?\\\\:\"\n        }, {\n            token : \"paren.lparen\",\n            regex : /[\\[\\({]/\n        }, {\n            token : \"paren.rparen\",\n            regex : /[\\])}]/\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }]\n    });\n\n    this.normalizeRules();\n};\noop.inherits(LiquidHighlightRules, TextHighlightRules);\n\nexports.LiquidHighlightRules = LiquidHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/liquid\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/liquid_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\"], function(require, exports, module) {\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar LiquidHighlightRules = require(\"./liquid_highlight_rules\").LiquidHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.HighlightRules = LiquidHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/liquid\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-lisp.js",
    "content": "ace.define(\"ace/mode/lisp_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar LispHighlightRules = function() {\n    var keywordControl = \"case|do|let|loop|if|else|when\";\n    var keywordOperator = \"eq|neq|and|or\";\n    var constantLanguage = \"null|nil\";\n    var supportFunctions = \"cons|car|cdr|cond|lambda|format|setq|setf|quote|eval|append|list|listp|memberp|t|load|progn\";\n\n    var keywordMapper = this.createKeywordMapper({\n        \"keyword.control\": keywordControl,\n        \"keyword.operator\": keywordOperator,\n        \"constant.language\": constantLanguage,\n        \"support.function\": supportFunctions\n    }, \"identifier\", true);\n\n    this.$rules = \n        {\n    \"start\": [\n        {\n            token : \"comment\",\n            regex : \";.*$\"\n        },\n        {\n            token: [\"storage.type.function-type.lisp\", \"text\", \"entity.name.function.lisp\"],\n            regex: \"(?:\\\\b(?:(defun|defmethod|defmacro))\\\\b)(\\\\s+)((?:\\\\w|\\\\-|\\\\!|\\\\?)*)\"\n        },\n        {\n            token: [\"punctuation.definition.constant.character.lisp\", \"constant.character.lisp\"],\n            regex: \"(#)((?:\\\\w|[\\\\\\\\+-=<>'\\\"&#])+)\"\n        },\n        {\n            token: [\"punctuation.definition.variable.lisp\", \"variable.other.global.lisp\", \"punctuation.definition.variable.lisp\"],\n            regex: \"(\\\\*)(\\\\S*)(\\\\*)\"\n        },\n        {\n            token : \"constant.numeric\", // hex\n            regex : \"0[xX][0-9a-fA-F]+(?:L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"\n        }, \n        {\n            token : \"constant.numeric\", // float\n            regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?(?:L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"\n        },\n        {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        },\n        {\n            token : \"string\",\n            regex : '\"(?=.)',\n            next  : \"qqstring\"\n        }\n    ],\n    \"qqstring\": [\n        {\n            token: \"constant.character.escape.lisp\",\n            regex: \"\\\\\\\\.\"\n        },\n        {\n            token : \"string\",\n            regex : '[^\"\\\\\\\\]+'\n        }, {\n            token : \"string\",\n            regex : \"\\\\\\\\$\",\n            next  : \"qqstring\"\n        }, {\n            token : \"string\",\n            regex : '\"|$',\n            next  : \"start\"\n        }\n    ]\n}\n\n};\n\noop.inherits(LispHighlightRules, TextHighlightRules);\n\nexports.LispHighlightRules = LispHighlightRules;\n});\n\nace.define(\"ace/mode/lisp\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/lisp_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar LispHighlightRules = require(\"./lisp_highlight_rules\").LispHighlightRules;\n\nvar Mode = function() {\n    this.HighlightRules = LispHighlightRules;\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n       \n    this.lineCommentStart = \";\";\n    \n    this.$id = \"ace/mode/lisp\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-livescript.js",
    "content": "ace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/livescript\",[\"require\",\"exports\",\"module\",\"ace/tokenizer\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/text\"], function(require, exports, module){\n  var identifier, LiveScriptMode, keywordend, stringfill;\n  identifier = '(?![\\\\d\\\\s])[$\\\\w\\\\xAA-\\\\uFFDC](?:(?!\\\\s)[$\\\\w\\\\xAA-\\\\uFFDC]|-[A-Za-z])*';\n  exports.Mode = LiveScriptMode = (function(superclass){\n    var indenter, prototype = extend$((import$(LiveScriptMode, superclass).displayName = 'LiveScriptMode', LiveScriptMode), superclass).prototype, constructor = LiveScriptMode;\n    function LiveScriptMode(){\n      var that;\n      this.$tokenizer = new (require('../tokenizer')).Tokenizer(LiveScriptMode.Rules);\n      if (that = require('../mode/matching_brace_outdent')) {\n        this.$outdent = new that.MatchingBraceOutdent;\n      }\n      this.$id = \"ace/mode/livescript\";\n    }\n    indenter = RegExp('(?:[({[=:]|[-~]>|\\\\b(?:e(?:lse|xport)|d(?:o|efault)|t(?:ry|hen)|finally|import(?:\\\\s*all)?|const|var|let|new|catch(?:\\\\s*' + identifier + ')?))\\\\s*$');\n    prototype.getNextLineIndent = function(state, line, tab){\n      var indent, tokens;\n      indent = this.$getIndent(line);\n      tokens = this.$tokenizer.getLineTokens(line, state).tokens;\n      if (!(tokens.length && tokens[tokens.length - 1].type === 'comment')) {\n        if (state === 'start' && indenter.test(line)) {\n          indent += tab;\n        }\n      }\n      return indent;\n    };\n    prototype.toggleCommentLines = function(state, doc, startRow, endRow){\n      var comment, range, i$, i, out, line;\n      comment = /^(\\s*)#/;\n      range = new (require('../range')).Range(0, 0, 0, 0);\n      for (i$ = startRow; i$ <= endRow; ++i$) {\n        i = i$;\n        if (out = comment.test(line = doc.getLine(i))) {\n          line = line.replace(comment, '$1');\n        } else {\n          line = line.replace(/^\\s*/, '$&#');\n        }\n        range.end.row = range.start.row = i;\n        range.end.column = line.length + 1;\n        doc.replace(range, line);\n      }\n      return 1 - out * 2;\n    };\n    prototype.checkOutdent = function(state, line, input){\n      var ref$;\n      return (ref$ = this.$outdent) != null ? ref$.checkOutdent(line, input) : void 8;\n    };\n    prototype.autoOutdent = function(state, doc, row){\n      var ref$;\n      return (ref$ = this.$outdent) != null ? ref$.autoOutdent(doc, row) : void 8;\n    };\n    return LiveScriptMode;\n  }(require('../mode/text').Mode));\n  keywordend = '(?![$\\\\w]|-[A-Za-z]|\\\\s*:(?![:=]))';\n  stringfill = {\n    token: 'string',\n    regex: '.+'\n  };\n  LiveScriptMode.Rules = {\n    start: [\n      {\n        token: 'keyword',\n        regex: '(?:t(?:h(?:is|row|en)|ry|ypeof!?)|c(?:on(?:tinue|st)|a(?:se|tch)|lass)|i(?:n(?:stanceof)?|mp(?:ort(?:\\\\s+all)?|lements)|[fs])|d(?:e(?:fault|lete|bugger)|o)|f(?:or(?:\\\\s+own)?|inally|unction)|s(?:uper|witch)|e(?:lse|x(?:tends|port)|val)|a(?:nd|rguments)|n(?:ew|ot)|un(?:less|til)|w(?:hile|ith)|o[fr]|return|break|let|var|loop)' + keywordend\n      }, {\n        token: 'constant.language',\n        regex: '(?:true|false|yes|no|on|off|null|void|undefined)' + keywordend\n      }, {\n        token: 'invalid.illegal',\n        regex: '(?:p(?:ackage|r(?:ivate|otected)|ublic)|i(?:mplements|nterface)|enum|static|yield)' + keywordend\n      }, {\n        token: 'language.support.class',\n        regex: '(?:R(?:e(?:gExp|ferenceError)|angeError)|S(?:tring|yntaxError)|E(?:rror|valError)|Array|Boolean|Date|Function|Number|Object|TypeError|URIError)' + keywordend\n      }, {\n        token: 'language.support.function',\n        regex: '(?:is(?:NaN|Finite)|parse(?:Int|Float)|Math|JSON|(?:en|de)codeURI(?:Component)?)' + keywordend\n      }, {\n        token: 'variable.language',\n        regex: '(?:t(?:hat|il|o)|f(?:rom|allthrough)|it|by|e)' + keywordend\n      }, {\n        token: 'identifier',\n        regex: identifier + '\\\\s*:(?![:=])'\n      }, {\n        token: 'variable',\n        regex: identifier\n      }, {\n        token: 'keyword.operator',\n        regex: '(?:\\\\.{3}|\\\\s+\\\\?)'\n      }, {\n        token: 'keyword.variable',\n        regex: '(?:@+|::|\\\\.\\\\.)',\n        next: 'key'\n      }, {\n        token: 'keyword.operator',\n        regex: '\\\\.\\\\s*',\n        next: 'key'\n      }, {\n        token: 'string',\n        regex: '\\\\\\\\\\\\S[^\\\\s,;)}\\\\]]*'\n      }, {\n        token: 'string.doc',\n        regex: '\\'\\'\\'',\n        next: 'qdoc'\n      }, {\n        token: 'string.doc',\n        regex: '\"\"\"',\n        next: 'qqdoc'\n      }, {\n        token: 'string',\n        regex: '\\'',\n        next: 'qstring'\n      }, {\n        token: 'string',\n        regex: '\"',\n        next: 'qqstring'\n      }, {\n        token: 'string',\n        regex: '`',\n        next: 'js'\n      }, {\n        token: 'string',\n        regex: '<\\\\[',\n        next: 'words'\n      }, {\n        token: 'string.regex',\n        regex: '//',\n        next: 'heregex'\n      }, {\n        token: 'comment.doc',\n        regex: '/\\\\*',\n        next: 'comment'\n      }, {\n        token: 'comment',\n        regex: '#.*'\n      }, {\n        token: 'string.regex',\n        regex: '\\\\/(?:[^[\\\\/\\\\n\\\\\\\\]*(?:(?:\\\\\\\\.|\\\\[[^\\\\]\\\\n\\\\\\\\]*(?:\\\\\\\\.[^\\\\]\\\\n\\\\\\\\]*)*\\\\])[^[\\\\/\\\\n\\\\\\\\]*)*)\\\\/[gimy$]{0,4}',\n        next: 'key'\n      }, {\n        token: 'constant.numeric',\n        regex: '(?:0x[\\\\da-fA-F][\\\\da-fA-F_]*|(?:[2-9]|[12]\\\\d|3[0-6])r[\\\\da-zA-Z][\\\\da-zA-Z_]*|(?:\\\\d[\\\\d_]*(?:\\\\.\\\\d[\\\\d_]*)?|\\\\.\\\\d[\\\\d_]*)(?:e[+-]?\\\\d[\\\\d_]*)?[\\\\w$]*)'\n      }, {\n        token: 'lparen',\n        regex: '[({[]'\n      }, {\n        token: 'rparen',\n        regex: '[)}\\\\]]',\n        next: 'key'\n      }, {\n        token: 'keyword.operator',\n        regex: '\\\\S+'\n      }, {\n        token: 'text',\n        regex: '\\\\s+'\n      }\n    ],\n    heregex: [\n      {\n        token: 'string.regex',\n        regex: '.*?//[gimy$?]{0,4}',\n        next: 'start'\n      }, {\n        token: 'string.regex',\n        regex: '\\\\s*#{'\n      }, {\n        token: 'comment.regex',\n        regex: '\\\\s+(?:#.*)?'\n      }, {\n        token: 'string.regex',\n        regex: '\\\\S+'\n      }\n    ],\n    key: [\n      {\n        token: 'keyword.operator',\n        regex: '[.?@!]+'\n      }, {\n        token: 'identifier',\n        regex: identifier,\n        next: 'start'\n      }, {\n        token: 'text',\n        regex: '.',\n        next: 'start'\n      }\n    ],\n    comment: [\n      {\n        token: 'comment.doc',\n        regex: '.*?\\\\*/',\n        next: 'start'\n      }, {\n        token: 'comment.doc',\n        regex: '.+'\n      }\n    ],\n    qdoc: [\n      {\n        token: 'string',\n        regex: \".*?'''\",\n        next: 'key'\n      }, stringfill\n    ],\n    qqdoc: [\n      {\n        token: 'string',\n        regex: '.*?\"\"\"',\n        next: 'key'\n      }, stringfill\n    ],\n    qstring: [\n      {\n        token: 'string',\n        regex: '[^\\\\\\\\\\']*(?:\\\\\\\\.[^\\\\\\\\\\']*)*\\'',\n        next: 'key'\n      }, stringfill\n    ],\n    qqstring: [\n      {\n        token: 'string',\n        regex: '[^\\\\\\\\\"]*(?:\\\\\\\\.[^\\\\\\\\\"]*)*\"',\n        next: 'key'\n      }, stringfill\n    ],\n    js: [\n      {\n        token: 'string',\n        regex: '[^\\\\\\\\`]*(?:\\\\\\\\.[^\\\\\\\\`]*)*`',\n        next: 'key'\n      }, stringfill\n    ],\n    words: [\n      {\n        token: 'string',\n        regex: '.*?\\\\]>',\n        next: 'key'\n      }, stringfill\n    ]\n  };\nfunction extend$(sub, sup){\n  function fun(){} fun.prototype = (sub.superclass = sup).prototype;\n  (sub.prototype = new fun).constructor = sub;\n  if (typeof sup.extended == 'function') sup.extended(sub);\n  return sub;\n}\nfunction import$(obj, src){\n  var own = {}.hasOwnProperty;\n  for (var key in src) if (own.call(src, key)) obj[key] = src[key];\n  return obj;\n}\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-logiql.js",
    "content": "ace.define(\"ace/mode/logiql_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar LogiQLHighlightRules = function() {\n\n    this.$rules = { start: \n       [ { token: 'comment.block',\n           regex: '/\\\\*',\n           push: \n            [ { token: 'comment.block', regex: '\\\\*/', next: 'pop' },\n              { defaultToken: 'comment.block' } ],\n            },\n         { token: 'comment.single',\n           regex: '//.*',\n            },\n         { token: 'constant.numeric',\n           regex: '\\\\d+(?:\\\\.\\\\d+)?(?:[eE][+-]?\\\\d+)?[fd]?',\n            },\n         { token: 'string',\n           regex: '\"',\n           push: \n            [ { token: 'string', regex: '\"', next: 'pop' },\n              { defaultToken: 'string' } ],\n            },\n         { token: 'constant.language',\n           regex: '\\\\b(true|false)\\\\b',\n            },\n         { token: 'entity.name.type.logicblox',\n           regex: '`[a-zA-Z_:]+(\\\\d|\\\\a)*\\\\b',\n            },\n         { token: 'keyword.start', regex: '->',  comment: 'Constraint' },\n         { token: 'keyword.start', regex: '-->', comment: 'Level 1 Constraint'},\n         { token: 'keyword.start', regex: '<-',  comment: 'Rule' },\n         { token: 'keyword.start', regex: '<--', comment: 'Level 1 Rule' },\n         { token: 'keyword.end',   regex: '\\\\.', comment: 'Terminator' },\n         { token: 'keyword.other', regex: '!',   comment: 'Negation' },\n         { token: 'keyword.other', regex: ',',   comment: 'Conjunction' },\n         { token: 'keyword.other', regex: ';',   comment: 'Disjunction' },\n         { token: 'keyword.operator', regex: '<=|>=|!=|<|>', comment: 'Equality'},\n         { token: 'keyword.other', regex: '@', comment: 'Equality' },\n         { token: 'keyword.operator', regex: '\\\\+|-|\\\\*|/', comment: 'Arithmetic operations'},\n         { token: 'keyword', regex: '::', comment: 'Colon colon' },\n         { token: 'support.function',\n           regex: '\\\\b(agg\\\\s*<<)',\n           push: \n            [ { include: '$self' },\n              { token: 'support.function',\n                regex: '>>',\n                next: 'pop' } ],\n            },\n         { token: 'storage.modifier',\n           regex: '\\\\b(lang:[\\\\w:]*)',\n            },\n         { token: [ 'storage.type', 'text' ],\n           regex: '(export|sealed|clauses|block|alias|alias_all)(\\\\s*\\\\()(?=`)',\n            },\n         { token: 'entity.name',\n           regex: '[a-zA-Z_][a-zA-Z_0-9:]*(@prev|@init|@final)?(?=(\\\\(|\\\\[))',\n            },\n         { token: 'variable.parameter',\n           regex: '([a-zA-Z][a-zA-Z_0-9]*|_)\\\\s*(?=(,|\\\\.|<-|->|\\\\)|\\\\]|=))',\n            } ] }\n    \n    this.normalizeRules();\n};\n\noop.inherits(LogiQLHighlightRules, TextHighlightRules);\n\nexports.LogiQLHighlightRules = LogiQLHighlightRules;\n});\n\nace.define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var range = this.indentationBlock(session, row);\n        if (range)\n            return range;\n\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1 || line[startLevel] != \"#\")\n            return;\n\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var level = line.search(re);\n\n            if (level == -1)\n                continue;\n\n            if (line[level] != \"#\")\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        var next = session.getLine(row + 1);\n        var prev = session.getLine(row - 1);\n        var prevIndent = prev.search(/\\S/);\n        var nextIndent = next.search(/\\S/);\n\n        if (indent == -1) {\n            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? \"start\" : \"\";\n            return \"\";\n        }\n        if (prevIndent == -1) {\n            if (indent == nextIndent && line[indent] == \"#\" && next[indent] == \"#\") {\n                session.foldWidgets[row - 1] = \"\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"start\";\n            }\n        } else if (prevIndent == indent && line[indent] == \"#\" && prev[indent] == \"#\") {\n            if (session.getLine(row - 2).search(/\\S/) == -1) {\n                session.foldWidgets[row - 1] = \"start\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"\";\n            }\n        }\n\n        if (prevIndent!= -1 && prevIndent < indent)\n            session.foldWidgets[row - 1] = \"start\";\n        else\n            session.foldWidgets[row - 1] = \"\";\n\n        if (indent < nextIndent)\n            return \"start\";\n        else\n            return \"\";\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/logiql\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/logiql_highlight_rules\",\"ace/mode/folding/coffee\",\"ace/token_iterator\",\"ace/range\",\"ace/mode/behaviour/cstyle\",\"ace/mode/matching_brace_outdent\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar LogiQLHighlightRules = require(\"./logiql_highlight_rules\").LogiQLHighlightRules;\nvar FoldMode = require(\"./folding/coffee\").FoldMode;\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\nvar Range = require(\"../range\").Range;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\n\nvar Mode = function() {\n    this.HighlightRules = LogiQLHighlightRules;\n    this.foldingRules = new FoldMode();\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n        if (/comment|string/.test(endState))  \n            return indent;\n        if (tokens.length && tokens[tokens.length - 1].type == \"comment.single\")\n            return indent;\n\n        var match = line.match();\n        if (/(-->|<--|<-|->|{)\\s*$/.test(line))\n            indent += tab;\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        if (this.$outdent.checkOutdent(line, input))\n            return true;\n\n        if (input !== \"\\n\" && input !== \"\\r\\n\")\n            return false;\n            \n        if (!/^\\s+/.test(line))\n            return false;\n\n        return true;\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        if (this.$outdent.autoOutdent(doc, row))\n            return;\n        var prevLine = doc.getLine(row);\n        var match = prevLine.match(/^\\s+/);\n        var column = prevLine.lastIndexOf(\".\") + 1;\n        if (!match || !row || !column) return 0;\n\n        var line = doc.getLine(row + 1);\n        var startRange = this.getMatching(doc, {row: row, column: column});\n        if (!startRange || startRange.start.row == row) return 0;\n\n        column = match[0].length;\n        var indent = this.$getIndent(doc.getLine(startRange.start.row));\n        doc.replace(new Range(row + 1, 0, row + 1, column), indent);\n    };\n\n    this.getMatching = function(session, row, column) {\n        if (row == undefined)\n            row = session.selection.lead\n        if (typeof row == \"object\") {\n            column = row.column;\n            row = row.row;\n        }\n\n        var startToken = session.getTokenAt(row, column);\n        var KW_START = \"keyword.start\", KW_END = \"keyword.end\";\n        var tok;\n        if (!startToken)\n            return;\n        if (startToken.type == KW_START) {\n            var it = new TokenIterator(session, row, column);\n            it.step = it.stepForward;\n        } else if (startToken.type == KW_END) {\n            var it = new TokenIterator(session, row, column);\n            it.step = it.stepBackward;\n        } else\n            return;\n\n        while (tok = it.step()) {\n            if (tok.type == KW_START || tok.type == KW_END)\n                break;\n        }\n        if (!tok || tok.type == startToken.type)\n            return;\n\n        var col = it.getCurrentTokenColumn();\n        var row = it.getCurrentTokenRow();\n        return new Range(row, col, row, col + tok.value.length);\n    };\n    this.$id = \"ace/mode/logiql\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-lsl.js",
    "content": "ace.define(\"ace/mode/lsl_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\noop.inherits(LSLHighlightRules, TextHighlightRules);\n\nfunction LSLHighlightRules() {\n    var keywordMapper = this.createKeywordMapper({\n        \"constant.language.float.lsl\" : \"DEG_TO_RAD|PI|PI_BY_TWO|RAD_TO_DEG|SQRT2|TWO_PI\",\n        \"constant.language.integer.lsl\": \"ACTIVE|AGENT|AGENT_ALWAYS_RUN|AGENT_ATTACHMENTS|AGENT_AUTOPILOT|AGENT_AWAY|AGENT_BUSY|AGENT_BY_LEGACY_NAME|AGENT_BY_USERNAME|AGENT_CROUCHING|AGENT_FLYING|AGENT_IN_AIR|AGENT_LIST_PARCEL|AGENT_LIST_PARCEL_OWNER|AGENT_LIST_REGION|AGENT_MOUSELOOK|AGENT_ON_OBJECT|AGENT_SCRIPTED|AGENT_SITTING|AGENT_TYPING|AGENT_WALKING|ALL_SIDES|ANIM_ON|ATTACH_AVATAR_CENTER|ATTACH_BACK|ATTACH_BELLY|ATTACH_CHEST|ATTACH_CHIN|ATTACH_HEAD|ATTACH_HUD_BOTTOM|ATTACH_HUD_BOTTOM_LEFT|ATTACH_HUD_BOTTOM_RIGHT|ATTACH_HUD_CENTER_1|ATTACH_HUD_CENTER_2|ATTACH_HUD_TOP_CENTER|ATTACH_HUD_TOP_LEFT|ATTACH_HUD_TOP_RIGHT|ATTACH_LEAR|ATTACH_LEFT_PEC|ATTACH_LEYE|ATTACH_LFOOT|ATTACH_LHAND|ATTACH_LHIP|ATTACH_LLARM|ATTACH_LLLEG|ATTACH_LSHOULDER|ATTACH_LUARM|ATTACH_LULEG|ATTACH_MOUTH|ATTACH_NECK|ATTACH_NOSE|ATTACH_PELVIS|ATTACH_REAR|ATTACH_REYE|ATTACH_RFOOT|ATTACH_RHAND|ATTACH_RHIP|ATTACH_RIGHT_PEC|ATTACH_RLARM|ATTACH_RLLEG|ATTACH_RSHOULDER|ATTACH_RUARM|ATTACH_RULEG|AVOID_CHARACTERS|AVOID_DYNAMIC_OBSTACLES|AVOID_NONE|CAMERA_ACTIVE|CAMERA_BEHINDNESS_ANGLE|CAMERA_BEHINDNESS_LAG|CAMERA_DISTANCE|CAMERA_FOCUS|CAMERA_FOCUS_LAG|CAMERA_FOCUS_LOCKED|CAMERA_FOCUS_OFFSET|CAMERA_FOCUS_THRESHOLD|CAMERA_PITCH|CAMERA_POSITION|CAMERA_POSITION_LAG|CAMERA_POSITION_LOCKED|CAMERA_POSITION_THRESHOLD|CHANGED_ALLOWED_DROP|CHANGED_COLOR|CHANGED_INVENTORY|CHANGED_LINK|CHANGED_MEDIA|CHANGED_OWNER|CHANGED_REGION|CHANGED_REGION_START|CHANGED_SCALE|CHANGED_SHAPE|CHANGED_TELEPORT|CHANGED_TEXTURE|CHARACTER_ACCOUNT_FOR_SKIPPED_FRAMES|CHARACTER_AVOIDANCE_MODE|CHARACTER_CMD_JUMP|CHARACTER_CMD_SMOOTH_STOP|CHARACTER_CMD_STOP|CHARACTER_DESIRED_SPEED|CHARACTER_DESIRED_TURN_SPEED|CHARACTER_LENGTH|CHARACTER_MAX_ACCEL|CHARACTER_MAX_DECEL|CHARACTER_MAX_SPEED|CHARACTER_MAX_TURN_RADIUS|CHARACTER_ORIENTATION|CHARACTER_RADIUS|CHARACTER_STAY_WITHIN_PARCEL|CHARACTER_TYPE|CHARACTER_TYPE_A|CHARACTER_TYPE_B|CHARACTER_TYPE_C|CHARACTER_TYPE_D|CHARACTER_TYPE_NONE|CLICK_ACTION_BUY|CLICK_ACTION_NONE|CLICK_ACTION_OPEN|CLICK_ACTION_OPEN_MEDIA|CLICK_ACTION_PAY|CLICK_ACTION_PLAY|CLICK_ACTION_SIT|CLICK_ACTION_TOUCH|CONTENT_TYPE_ATOM|CONTENT_TYPE_FORM|CONTENT_TYPE_HTML|CONTENT_TYPE_JSON|CONTENT_TYPE_LLSD|CONTENT_TYPE_RSS|CONTENT_TYPE_TEXT|CONTENT_TYPE_XHTML|CONTENT_TYPE_XML|CONTROL_BACK|CONTROL_DOWN|CONTROL_FWD|CONTROL_LBUTTON|CONTROL_LEFT|CONTROL_ML_LBUTTON|CONTROL_RIGHT|CONTROL_ROT_LEFT|CONTROL_ROT_RIGHT|CONTROL_UP|DATA_BORN|DATA_NAME|DATA_ONLINE|DATA_PAYINFO|DATA_SIM_POS|DATA_SIM_RATING|DATA_SIM_STATUS|DEBUG_CHANNEL|DENSITY|ERR_GENERIC|ERR_MALFORMED_PARAMS|ERR_PARCEL_PERMISSIONS|ERR_RUNTIME_PERMISSIONS|ERR_THROTTLED|ESTATE_ACCESS_ALLOWED_AGENT_ADD|ESTATE_ACCESS_ALLOWED_AGENT_REMOVE|ESTATE_ACCESS_ALLOWED_GROUP_ADD|ESTATE_ACCESS_ALLOWED_GROUP_REMOVE|ESTATE_ACCESS_BANNED_AGENT_ADD|ESTATE_ACCESS_BANNED_AGENT_REMOVE|FALSE|FORCE_DIRECT_PATH|FRICTION|GCNP_RADIUS|GCNP_STATIC|GRAVITY_MULTIPLIER|HORIZONTAL|HTTP_BODY_MAXLENGTH|HTTP_BODY_TRUNCATED|HTTP_CUSTOM_HEADER|HTTP_METHOD|HTTP_MIMETYPE|HTTP_PRAGMA_NO_CACHE|HTTP_VERBOSE_THROTTLE|HTTP_VERIFY_CERT|INVENTORY_ALL|INVENTORY_ANIMATION|INVENTORY_BODYPART|INVENTORY_CLOTHING|INVENTORY_GESTURE|INVENTORY_LANDMARK|INVENTORY_NONE|INVENTORY_NOTECARD|INVENTORY_OBJECT|INVENTORY_SCRIPT|INVENTORY_SOUND|INVENTORY_TEXTURE|JSON_APPEND|KFM_CMD_PAUSE|KFM_CMD_PLAY|KFM_CMD_SET_MODE|KFM_CMD_STOP|KFM_COMMAND|KFM_DATA|KFM_FORWARD|KFM_LOOP|KFM_MODE|KFM_PING_PONG|KFM_REVERSE|KFM_ROTATION|KFM_TRANSLATION|LAND_LEVEL|LAND_LOWER|LAND_NOISE|LAND_RAISE|LAND_REVERT|LAND_SMOOTH|LINK_ALL_CHILDREN|LINK_ALL_OTHERS|LINK_ROOT|LINK_SET|LINK_THIS|LIST_STAT_GEOMETRIC_MEAN|LIST_STAT_MAX|LIST_STAT_MEAN|LIST_STAT_MEDIAN|LIST_STAT_MIN|LIST_STAT_NUM_COUNT|LIST_STAT_RANGE|LIST_STAT_STD_DEV|LIST_STAT_SUM|LIST_STAT_SUM_SQUARES|LOOP|MASK_BASE|MASK_EVERYONE|MASK_GROUP|MASK_NEXT|MASK_OWNER|OBJECT_ATTACHED_POINT|OBJECT_CHARACTER_TIME|OBJECT_CREATOR|OBJECT_DESC|OBJECT_GROUP|OBJECT_NAME|OBJECT_OWNER|OBJECT_PATHFINDING_TYPE|OBJECT_PHANTOM|OBJECT_PHYSICS|OBJECT_PHYSICS_COST|OBJECT_POS|OBJECT_PRIM_EQUIVALENCE|OBJECT_RENDER_WEIGHT|OBJECT_RETURN_PARCEL|OBJECT_RETURN_PARCEL_OWNER|OBJECT_RETURN_REGION|OBJECT_ROOT|OBJECT_ROT|OBJECT_RUNNING_SCRIPT_COUNT|OBJECT_SCRIPT_MEMORY|OBJECT_SCRIPT_TIME|OBJECT_SERVER_COST|OBJECT_STREAMING_COST|OBJECT_TEMP_ON_REZ|OBJECT_TOTAL_SCRIPT_COUNT|OBJECT_UNKNOWN_DETAIL|OBJECT_VELOCITY|OPT_AVATAR|OPT_CHARACTER|OPT_EXCLUSION_VOLUME|OPT_LEGACY_LINKSET|OPT_MATERIAL_VOLUME|OPT_OTHER|OPT_STATIC_OBSTACLE|OPT_WALKABLE|PARCEL_COUNT_GROUP|PARCEL_COUNT_OTHER|PARCEL_COUNT_OWNER|PARCEL_COUNT_SELECTED|PARCEL_COUNT_TEMP|PARCEL_COUNT_TOTAL|PARCEL_DETAILS_AREA|PARCEL_DETAILS_DESC|PARCEL_DETAILS_GROUP|PARCEL_DETAILS_ID|PARCEL_DETAILS_NAME|PARCEL_DETAILS_OWNER|PARCEL_DETAILS_SEE_AVATARS|PARCEL_FLAG_ALLOW_ALL_OBJECT_ENTRY|PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS|PARCEL_FLAG_ALLOW_CREATE_OBJECTS|PARCEL_FLAG_ALLOW_DAMAGE|PARCEL_FLAG_ALLOW_FLY|PARCEL_FLAG_ALLOW_GROUP_OBJECT_ENTRY|PARCEL_FLAG_ALLOW_GROUP_SCRIPTS|PARCEL_FLAG_ALLOW_LANDMARK|PARCEL_FLAG_ALLOW_SCRIPTS|PARCEL_FLAG_ALLOW_TERRAFORM|PARCEL_FLAG_LOCAL_SOUND_ONLY|PARCEL_FLAG_RESTRICT_PUSHOBJECT|PARCEL_FLAG_USE_ACCESS_GROUP|PARCEL_FLAG_USE_ACCESS_LIST|PARCEL_FLAG_USE_BAN_LIST|PARCEL_FLAG_USE_LAND_PASS_LIST|PARCEL_MEDIA_COMMAND_AGENT|PARCEL_MEDIA_COMMAND_AUTO_ALIGN|PARCEL_MEDIA_COMMAND_DESC|PARCEL_MEDIA_COMMAND_LOOP|PARCEL_MEDIA_COMMAND_LOOP_SET|PARCEL_MEDIA_COMMAND_PAUSE|PARCEL_MEDIA_COMMAND_PLAY|PARCEL_MEDIA_COMMAND_SIZE|PARCEL_MEDIA_COMMAND_STOP|PARCEL_MEDIA_COMMAND_TEXTURE|PARCEL_MEDIA_COMMAND_TIME|PARCEL_MEDIA_COMMAND_TYPE|PARCEL_MEDIA_COMMAND_UNLOAD|PARCEL_MEDIA_COMMAND_URL|PASSIVE|PATROL_PAUSE_AT_WAYPOINTS|PAYMENT_INFO_ON_FILE|PAYMENT_INFO_USED|PAY_DEFAULT|PAY_HIDE|PERMISSION_ATTACH|PERMISSION_CHANGE_LINKS|PERMISSION_CONTROL_CAMERA|PERMISSION_DEBIT|PERMISSION_OVERRIDE_ANIMATIONS|PERMISSION_RETURN_OBJECTS|PERMISSION_SILENT_ESTATE_MANAGEMENT|PERMISSION_TAKE_CONTROLS|PERMISSION_TELEPORT|PERMISSION_TRACK_CAMERA|PERMISSION_TRIGGER_ANIMATION|PERM_ALL|PERM_COPY|PERM_MODIFY|PERM_MOVE|PERM_TRANSFER|PING_PONG|PRIM_ALPHA_MODE|PRIM_ALPHA_MODE_BLEND|PRIM_ALPHA_MODE_EMISSIVE|PRIM_ALPHA_MODE_MASK|PRIM_ALPHA_MODE_NONE|PRIM_BUMP_BARK|PRIM_BUMP_BLOBS|PRIM_BUMP_BRICKS|PRIM_BUMP_BRIGHT|PRIM_BUMP_CHECKER|PRIM_BUMP_CONCRETE|PRIM_BUMP_DARK|PRIM_BUMP_DISKS|PRIM_BUMP_GRAVEL|PRIM_BUMP_LARGETILE|PRIM_BUMP_NONE|PRIM_BUMP_SHINY|PRIM_BUMP_SIDING|PRIM_BUMP_STONE|PRIM_BUMP_STUCCO|PRIM_BUMP_SUCTION|PRIM_BUMP_TILE|PRIM_BUMP_WEAVE|PRIM_BUMP_WOOD|PRIM_COLOR|PRIM_DESC|PRIM_FLEXIBLE|PRIM_FULLBRIGHT|PRIM_GLOW|PRIM_HOLE_CIRCLE|PRIM_HOLE_DEFAULT|PRIM_HOLE_SQUARE|PRIM_HOLE_TRIANGLE|PRIM_LINK_TARGET|PRIM_MATERIAL|PRIM_MATERIAL_FLESH|PRIM_MATERIAL_GLASS|PRIM_MATERIAL_METAL|PRIM_MATERIAL_PLASTIC|PRIM_MATERIAL_RUBBER|PRIM_MATERIAL_STONE|PRIM_MATERIAL_WOOD|PRIM_MEDIA_ALT_IMAGE_ENABLE|PRIM_MEDIA_AUTO_LOOP|PRIM_MEDIA_AUTO_PLAY|PRIM_MEDIA_AUTO_SCALE|PRIM_MEDIA_AUTO_ZOOM|PRIM_MEDIA_CONTROLS|PRIM_MEDIA_CONTROLS_MINI|PRIM_MEDIA_CONTROLS_STANDARD|PRIM_MEDIA_CURRENT_URL|PRIM_MEDIA_FIRST_CLICK_INTERACT|PRIM_MEDIA_HEIGHT_PIXELS|PRIM_MEDIA_HOME_URL|PRIM_MEDIA_MAX_HEIGHT_PIXELS|PRIM_MEDIA_MAX_URL_LENGTH|PRIM_MEDIA_MAX_WHITELIST_COUNT|PRIM_MEDIA_MAX_WHITELIST_SIZE|PRIM_MEDIA_MAX_WIDTH_PIXELS|PRIM_MEDIA_PARAM_MAX|PRIM_MEDIA_PERMS_CONTROL|PRIM_MEDIA_PERMS_INTERACT|PRIM_MEDIA_PERM_ANYONE|PRIM_MEDIA_PERM_GROUP|PRIM_MEDIA_PERM_NONE|PRIM_MEDIA_PERM_OWNER|PRIM_MEDIA_WHITELIST|PRIM_MEDIA_WHITELIST_ENABLE|PRIM_MEDIA_WIDTH_PIXELS|PRIM_NAME|PRIM_NORMAL|PRIM_OMEGA|PRIM_PHANTOM|PRIM_PHYSICS|PRIM_PHYSICS_SHAPE_CONVEX|PRIM_PHYSICS_SHAPE_NONE|PRIM_PHYSICS_SHAPE_PRIM|PRIM_PHYSICS_SHAPE_TYPE|PRIM_POINT_LIGHT|PRIM_POSITION|PRIM_POS_LOCAL|PRIM_ROTATION|PRIM_ROT_LOCAL|PRIM_SCULPT_FLAG_INVERT|PRIM_SCULPT_FLAG_MIRROR|PRIM_SCULPT_TYPE_CYLINDER|PRIM_SCULPT_TYPE_MASK|PRIM_SCULPT_TYPE_PLANE|PRIM_SCULPT_TYPE_SPHERE|PRIM_SCULPT_TYPE_TORUS|PRIM_SHINY_HIGH|PRIM_SHINY_LOW|PRIM_SHINY_MEDIUM|PRIM_SHINY_NONE|PRIM_SIZE|PRIM_SLICE|PRIM_SPECULAR|PRIM_TEMP_ON_REZ|PRIM_TEXGEN|PRIM_TEXGEN_DEFAULT|PRIM_TEXGEN_PLANAR|PRIM_TEXT|PRIM_TEXTURE|PRIM_TYPE|PRIM_TYPE_BOX|PRIM_TYPE_CYLINDER|PRIM_TYPE_PRISM|PRIM_TYPE_RING|PRIM_TYPE_SCULPT|PRIM_TYPE_SPHERE|PRIM_TYPE_TORUS|PRIM_TYPE_TUBE|PROFILE_NONE|PROFILE_SCRIPT_MEMORY|PSYS_PART_BF_DEST_COLOR|PSYS_PART_BF_ONE|PSYS_PART_BF_ONE_MINUS_DEST_COLOR|PSYS_PART_BF_ONE_MINUS_SOURCE_ALPHA|PSYS_PART_BF_ONE_MINUS_SOURCE_COLOR|PSYS_PART_BF_SOURCE_ALPHA|PSYS_PART_BF_SOURCE_COLOR|PSYS_PART_BF_ZERO|PSYS_PART_BLEND_FUNC_DEST|PSYS_PART_BLEND_FUNC_SOURCE|PSYS_PART_BOUNCE_MASK|PSYS_PART_EMISSIVE_MASK|PSYS_PART_END_ALPHA|PSYS_PART_END_COLOR|PSYS_PART_END_GLOW|PSYS_PART_END_SCALE|PSYS_PART_FLAGS|PSYS_PART_FOLLOW_SRC_MASK|PSYS_PART_FOLLOW_VELOCITY_MASK|PSYS_PART_INTERP_COLOR_MASK|PSYS_PART_INTERP_SCALE_MASK|PSYS_PART_MAX_AGE|PSYS_PART_RIBBON_MASK|PSYS_PART_START_ALPHA|PSYS_PART_START_COLOR|PSYS_PART_START_GLOW|PSYS_PART_START_SCALE|PSYS_PART_TARGET_LINEAR_MASK|PSYS_PART_TARGET_POS_MASK|PSYS_PART_WIND_MASK|PSYS_SRC_ACCEL|PSYS_SRC_ANGLE_BEGIN|PSYS_SRC_ANGLE_END|PSYS_SRC_BURST_PART_COUNT|PSYS_SRC_BURST_RADIUS|PSYS_SRC_BURST_RATE|PSYS_SRC_BURST_SPEED_MAX|PSYS_SRC_BURST_SPEED_MIN|PSYS_SRC_MAX_AGE|PSYS_SRC_OMEGA|PSYS_SRC_PATTERN|PSYS_SRC_PATTERN_ANGLE|PSYS_SRC_PATTERN_ANGLE_CONE|PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY|PSYS_SRC_PATTERN_DROP|PSYS_SRC_PATTERN_EXPLODE|PSYS_SRC_TARGET_KEY|PSYS_SRC_TEXTURE|PUBLIC_CHANNEL|PURSUIT_FUZZ_FACTOR|PURSUIT_GOAL_TOLERANCE|PURSUIT_INTERCEPT|PURSUIT_OFFSET|PU_EVADE_HIDDEN|PU_EVADE_SPOTTED|PU_FAILURE_DYNAMIC_PATHFINDING_DISABLED|PU_FAILURE_INVALID_GOAL|PU_FAILURE_INVALID_START|PU_FAILURE_NO_NAVMESH|PU_FAILURE_NO_VALID_DESTINATION|PU_FAILURE_OTHER|PU_FAILURE_PARCEL_UNREACHABLE|PU_FAILURE_TARGET_GONE|PU_FAILURE_UNREACHABLE|PU_GOAL_REACHED|PU_SLOWDOWN_DISTANCE_REACHED|RCERR_CAST_TIME_EXCEEDED|RCERR_SIM_PERF_LOW|RCERR_UNKNOWN|RC_DATA_FLAGS|RC_DETECT_PHANTOM|RC_GET_LINK_NUM|RC_GET_NORMAL|RC_GET_ROOT_KEY|RC_MAX_HITS|RC_REJECT_AGENTS|RC_REJECT_LAND|RC_REJECT_NONPHYSICAL|RC_REJECT_PHYSICAL|RC_REJECT_TYPES|REGION_FLAG_ALLOW_DAMAGE|REGION_FLAG_ALLOW_DIRECT_TELEPORT|REGION_FLAG_BLOCK_FLY|REGION_FLAG_BLOCK_TERRAFORM|REGION_FLAG_DISABLE_COLLISIONS|REGION_FLAG_DISABLE_PHYSICS|REGION_FLAG_FIXED_SUN|REGION_FLAG_RESTRICT_PUSHOBJECT|REGION_FLAG_SANDBOX|REMOTE_DATA_CHANNEL|REMOTE_DATA_REPLY|REMOTE_DATA_REQUEST|REQUIRE_LINE_OF_SIGHT|RESTITUTION|REVERSE|ROTATE|SCALE|SCRIPTED|SIM_STAT_PCT_CHARS_STEPPED|SMOOTH|STATUS_BLOCK_GRAB|STATUS_BLOCK_GRAB_OBJECT|STATUS_BOUNDS_ERROR|STATUS_CAST_SHADOWS|STATUS_DIE_AT_EDGE|STATUS_INTERNAL_ERROR|STATUS_MALFORMED_PARAMS|STATUS_NOT_FOUND|STATUS_NOT_SUPPORTED|STATUS_OK|STATUS_PHANTOM|STATUS_PHYSICS|STATUS_RETURN_AT_EDGE|STATUS_ROTATE_X|STATUS_ROTATE_Y|STATUS_ROTATE_Z|STATUS_SANDBOX|STATUS_TYPE_MISMATCH|STATUS_WHITELIST_FAILED|STRING_TRIM|STRING_TRIM_HEAD|STRING_TRIM_TAIL|TOUCH_INVALID_FACE|TRAVERSAL_TYPE|TRAVERSAL_TYPE_FAST|TRAVERSAL_TYPE_NONE|TRAVERSAL_TYPE_SLOW|TRUE|TYPE_FLOAT|TYPE_INTEGER|TYPE_INVALID|TYPE_KEY|TYPE_ROTATION|TYPE_STRING|TYPE_VECTOR|VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY|VEHICLE_ANGULAR_DEFLECTION_TIMESCALE|VEHICLE_ANGULAR_FRICTION_TIMESCALE|VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE|VEHICLE_ANGULAR_MOTOR_DIRECTION|VEHICLE_ANGULAR_MOTOR_TIMESCALE|VEHICLE_BANKING_EFFICIENCY|VEHICLE_BANKING_MIX|VEHICLE_BANKING_TIMESCALE|VEHICLE_BUOYANCY|VEHICLE_FLAG_CAMERA_DECOUPLED|VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT|VEHICLE_FLAG_HOVER_TERRAIN_ONLY|VEHICLE_FLAG_HOVER_UP_ONLY|VEHICLE_FLAG_HOVER_WATER_ONLY|VEHICLE_FLAG_LIMIT_MOTOR_UP|VEHICLE_FLAG_LIMIT_ROLL_ONLY|VEHICLE_FLAG_MOUSELOOK_BANK|VEHICLE_FLAG_MOUSELOOK_STEER|VEHICLE_FLAG_NO_DEFLECTION_UP|VEHICLE_HOVER_EFFICIENCY|VEHICLE_HOVER_HEIGHT|VEHICLE_HOVER_TIMESCALE|VEHICLE_LINEAR_DEFLECTION_EFFICIENCY|VEHICLE_LINEAR_DEFLECTION_TIMESCALE|VEHICLE_LINEAR_FRICTION_TIMESCALE|VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE|VEHICLE_LINEAR_MOTOR_DIRECTION|VEHICLE_LINEAR_MOTOR_OFFSET|VEHICLE_LINEAR_MOTOR_TIMESCALE|VEHICLE_REFERENCE_FRAME|VEHICLE_TYPE_AIRPLANE|VEHICLE_TYPE_BALLOON|VEHICLE_TYPE_BOAT|VEHICLE_TYPE_CAR|VEHICLE_TYPE_NONE|VEHICLE_TYPE_SLED|VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY|VEHICLE_VERTICAL_ATTRACTION_TIMESCALE|VERTICAL|WANDER_PAUSE_AT_WAYPOINTS|XP_ERROR_EXPERIENCES_DISABLED|XP_ERROR_EXPERIENCE_DISABLED|XP_ERROR_EXPERIENCE_SUSPENDED|XP_ERROR_INVALID_EXPERIENCE|XP_ERROR_INVALID_PARAMETERS|XP_ERROR_KEY_NOT_FOUND|XP_ERROR_MATURITY_EXCEEDED|XP_ERROR_NONE|XP_ERROR_NOT_FOUND|XP_ERROR_NOT_PERMITTED|XP_ERROR_NO_EXPERIENCE|XP_ERROR_QUOTA_EXCEEDED|XP_ERROR_RETRY_UPDATE|XP_ERROR_STORAGE_EXCEPTION|XP_ERROR_STORE_DISABLED|XP_ERROR_THROTTLED|XP_ERROR_UNKNOWN_ERROR\",\n        \"constant.language.integer.boolean.lsl\" : \"FALSE|TRUE\",\n        \"constant.language.quaternion.lsl\" : \"ZERO_ROTATION\",\n        \"constant.language.string.lsl\" : \"EOF|JSON_ARRAY|JSON_DELETE|JSON_FALSE|JSON_INVALID|JSON_NULL|JSON_NUMBER|JSON_OBJECT|JSON_STRING|JSON_TRUE|NULL_KEY|TEXTURE_BLANK|TEXTURE_DEFAULT|TEXTURE_MEDIA|TEXTURE_PLYWOOD|TEXTURE_TRANSPARENT|URL_REQUEST_DENIED|URL_REQUEST_GRANTED\",\n        \"constant.language.vector.lsl\" : \"TOUCH_INVALID_TEXCOORD|TOUCH_INVALID_VECTOR|ZERO_VECTOR\",\n        \"invalid.broken.lsl\": \"LAND_LARGE_BRUSH|LAND_MEDIUM_BRUSH|LAND_SMALL_BRUSH\",\n        \"invalid.deprecated.lsl\" : \"ATTACH_LPEC|ATTACH_RPEC|DATA_RATING|OBJECT_ATTACHMENT_GEOMETRY_BYTES|OBJECT_ATTACHMENT_SURFACE_AREA|PRIM_CAST_SHADOWS|PRIM_MATERIAL_LIGHT|PRIM_TYPE_LEGACY|PSYS_SRC_INNERANGLE|PSYS_SRC_OUTERANGLE|VEHICLE_FLAG_NO_FLY_UP|llClearExperiencePermissions|llCloud|llGetExperienceList|llMakeExplosion|llMakeFire|llMakeFountain|llMakeSmoke|llRemoteDataSetRegion|llSound|llSoundPreload|llXorBase64Strings|llXorBase64StringsCorrect\",\n        \"invalid.illegal.lsl\": \"event\",\n        \"invalid.unimplemented.lsl\": \"CHARACTER_MAX_ANGULAR_ACCEL|CHARACTER_MAX_ANGULAR_SPEED|CHARACTER_TURN_SPEED_MULTIPLIER|PERMISSION_CHANGE_JOINTS|PERMISSION_CHANGE_PERMISSIONS|PERMISSION_RELEASE_OWNERSHIP|PERMISSION_REMAP_CONTROLS|PRIM_PHYSICS_MATERIAL|PSYS_SRC_OBJ_REL_MASK|llCollisionSprite|llPointAt|llRefreshPrimURL|llReleaseCamera|llRemoteLoadScript|llSetPrimURL|llStopPointAt|llTakeCamera\",\n        \"reserved.godmode.lsl\": \"llGodLikeRezObject|llSetInventoryPermMask|llSetObjectPermMask\",\n        \"reserved.log.lsl\" : \"print\",\n        \"keyword.control.lsl\" : \"do|else|for|if|jump|return|while\",\n        \"storage.type.lsl\" : \"float|integer|key|list|quaternion|rotation|string|vector\",\n        \"support.function.lsl\": \"llAbs|llAcos|llAddToLandBanList|llAddToLandPassList|llAdjustSoundVolume|llAgentInExperience|llAllowInventoryDrop|llAngleBetween|llApplyImpulse|llApplyRotationalImpulse|llAsin|llAtan2|llAttachToAvatar|llAttachToAvatarTemp|llAvatarOnLinkSitTarget|llAvatarOnSitTarget|llAxes2Rot|llAxisAngle2Rot|llBase64ToInteger|llBase64ToString|llBreakAllLinks|llBreakLink|llCSV2List|llCastRay|llCeil|llClearCameraParams|llClearLinkMedia|llClearPrimMedia|llCloseRemoteDataChannel|llCollisionFilter|llCollisionSound|llCos|llCreateCharacter|llCreateKeyValue|llCreateLink|llDataSizeKeyValue|llDeleteCharacter|llDeleteKeyValue|llDeleteSubList|llDeleteSubString|llDetachFromAvatar|llDetectedGrab|llDetectedGroup|llDetectedKey|llDetectedLinkNumber|llDetectedName|llDetectedOwner|llDetectedPos|llDetectedRot|llDetectedTouchBinormal|llDetectedTouchFace|llDetectedTouchNormal|llDetectedTouchPos|llDetectedTouchST|llDetectedTouchUV|llDetectedType|llDetectedVel|llDialog|llDie|llDumpList2String|llEdgeOfWorld|llEjectFromLand|llEmail|llEscapeURL|llEuler2Rot|llEvade|llExecCharacterCmd|llFabs|llFleeFrom|llFloor|llForceMouselook|llFrand|llGenerateKey|llGetAccel|llGetAgentInfo|llGetAgentLanguage|llGetAgentList|llGetAgentSize|llGetAlpha|llGetAndResetTime|llGetAnimation|llGetAnimationList|llGetAnimationOverride|llGetAttached|llGetBoundingBox|llGetCameraPos|llGetCameraRot|llGetCenterOfMass|llGetClosestNavPoint|llGetColor|llGetCreator|llGetDate|llGetDisplayName|llGetEnergy|llGetEnv|llGetExperienceDetails|llGetExperienceErrorMessage|llGetForce|llGetFreeMemory|llGetFreeURLs|llGetGMTclock|llGetGeometricCenter|llGetHTTPHeader|llGetInventoryCreator|llGetInventoryKey|llGetInventoryName|llGetInventoryNumber|llGetInventoryPermMask|llGetInventoryType|llGetKey|llGetLandOwnerAt|llGetLinkKey|llGetLinkMedia|llGetLinkName|llGetLinkNumber|llGetLinkNumberOfSides|llGetLinkPrimitiveParams|llGetListEntryType|llGetListLength|llGetLocalPos|llGetLocalRot|llGetMass|llGetMassMKS|llGetMaxScaleFactor|llGetMemoryLimit|llGetMinScaleFactor|llGetNextEmail|llGetNotecardLine|llGetNumberOfNotecardLines|llGetNumberOfPrims|llGetNumberOfSides|llGetObjectDesc|llGetObjectDetails|llGetObjectMass|llGetObjectName|llGetObjectPermMask|llGetObjectPrimCount|llGetOmega|llGetOwner|llGetOwnerKey|llGetParcelDetails|llGetParcelFlags|llGetParcelMaxPrims|llGetParcelMusicURL|llGetParcelPrimCount|llGetParcelPrimOwners|llGetPermissions|llGetPermissionsKey|llGetPhysicsMaterial|llGetPos|llGetPrimMediaParams|llGetPrimitiveParams|llGetRegionAgentCount|llGetRegionCorner|llGetRegionFPS|llGetRegionFlags|llGetRegionName|llGetRegionTimeDilation|llGetRootPosition|llGetRootRotation|llGetRot|llGetSPMaxMemory|llGetScale|llGetScriptName|llGetScriptState|llGetSimStats|llGetSimulatorHostname|llGetStartParameter|llGetStaticPath|llGetStatus|llGetSubString|llGetSunDirection|llGetTexture|llGetTextureOffset|llGetTextureRot|llGetTextureScale|llGetTime|llGetTimeOfDay|llGetTimestamp|llGetTorque|llGetUnixTime|llGetUsedMemory|llGetUsername|llGetVel|llGetWallclock|llGiveInventory|llGiveInventoryList|llGiveMoney|llGround|llGroundContour|llGroundNormal|llGroundRepel|llGroundSlope|llHTTPRequest|llHTTPResponse|llInsertString|llInstantMessage|llIntegerToBase64|llJson2List|llJsonGetValue|llJsonSetValue|llJsonValueType|llKey2Name|llKeyCountKeyValue|llKeysKeyValue|llLinkParticleSystem|llLinkSitTarget|llList2CSV|llList2Float|llList2Integer|llList2Json|llList2Key|llList2List|llList2ListStrided|llList2Rot|llList2String|llList2Vector|llListFindList|llListInsertList|llListRandomize|llListReplaceList|llListSort|llListStatistics|llListen|llListenControl|llListenRemove|llLoadURL|llLog|llLog10|llLookAt|llLoopSound|llLoopSoundMaster|llLoopSoundSlave|llMD5String|llManageEstateAccess|llMapDestination|llMessageLinked|llMinEventDelay|llModPow|llModifyLand|llMoveToTarget|llNavigateTo|llOffsetTexture|llOpenRemoteDataChannel|llOverMyLand|llOwnerSay|llParcelMediaCommandList|llParcelMediaQuery|llParseString2List|llParseStringKeepNulls|llParticleSystem|llPassCollisions|llPassTouches|llPatrolPoints|llPlaySound|llPlaySoundSlave|llPow|llPreloadSound|llPursue|llPushObject|llReadKeyValue|llRegionSay|llRegionSayTo|llReleaseControls|llReleaseURL|llRemoteDataReply|llRemoteLoadScriptPin|llRemoveFromLandBanList|llRemoveFromLandPassList|llRemoveInventory|llRemoveVehicleFlags|llRequestAgentData|llRequestDisplayName|llRequestExperiencePermissions|llRequestInventoryData|llRequestPermissions|llRequestSecureURL|llRequestSimulatorData|llRequestURL|llRequestUsername|llResetAnimationOverride|llResetLandBanList|llResetLandPassList|llResetOtherScript|llResetScript|llResetTime|llReturnObjectsByID|llReturnObjectsByOwner|llRezAtRoot|llRezObject|llRot2Angle|llRot2Axis|llRot2Euler|llRot2Fwd|llRot2Left|llRot2Up|llRotBetween|llRotLookAt|llRotTarget|llRotTargetRemove|llRotateTexture|llRound|llSHA1String|llSameGroup|llSay|llScaleByFactor|llScaleTexture|llScriptDanger|llScriptProfiler|llSendRemoteData|llSensor|llSensorRemove|llSensorRepeat|llSetAlpha|llSetAngularVelocity|llSetAnimationOverride|llSetBuoyancy|llSetCameraAtOffset|llSetCameraEyeOffset|llSetCameraParams|llSetClickAction|llSetColor|llSetContentType|llSetDamage|llSetForce|llSetForceAndTorque|llSetHoverHeight|llSetKeyframedMotion|llSetLinkAlpha|llSetLinkCamera|llSetLinkColor|llSetLinkMedia|llSetLinkPrimitiveParams|llSetLinkPrimitiveParamsFast|llSetLinkTexture|llSetLinkTextureAnim|llSetLocalRot|llSetMemoryLimit|llSetObjectDesc|llSetObjectName|llSetParcelMusicURL|llSetPayPrice|llSetPhysicsMaterial|llSetPos|llSetPrimMediaParams|llSetPrimitiveParams|llSetRegionPos|llSetRemoteScriptAccessPin|llSetRot|llSetScale|llSetScriptState|llSetSitText|llSetSoundQueueing|llSetSoundRadius|llSetStatus|llSetText|llSetTexture|llSetTextureAnim|llSetTimerEvent|llSetTorque|llSetTouchText|llSetVehicleFlags|llSetVehicleFloatParam|llSetVehicleRotationParam|llSetVehicleType|llSetVehicleVectorParam|llSetVelocity|llShout|llSin|llSitTarget|llSleep|llSqrt|llStartAnimation|llStopAnimation|llStopHover|llStopLookAt|llStopMoveToTarget|llStopSound|llStringLength|llStringToBase64|llStringTrim|llSubStringIndex|llTakeControls|llTan|llTarget|llTargetOmega|llTargetRemove|llTeleportAgent|llTeleportAgentGlobalCoords|llTeleportAgentHome|llTextBox|llToLower|llToUpper|llTransferLindenDollars|llTriggerSound|llTriggerSoundLimited|llUnSit|llUnescapeURL|llUpdateCharacter|llUpdateKeyValue|llVecDist|llVecMag|llVecNorm|llVolumeDetect|llWanderWithin|llWater|llWhisper|llWind|llXorBase64\",\n        \"support.function.event.lsl\" : \"at_rot_target|at_target|attach|changed|collision|collision_end|collision_start|control|dataserver|email|experience_permissions|experience_permissions_denied|http_request|http_response|land_collision|land_collision_end|land_collision_start|link_message|listen|money|moving_end|moving_start|no_sensor|not_at_rot_target|not_at_target|object_rez|on_rez|path_update|remote_data|run_time_permissions|sensor|state_entry|state_exit|timer|touch|touch_end|touch_start|transaction_result\"\n        }, \"identifier\");\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment.line.double-slash.lsl\",\n                regex : \"\\\\/\\\\/.*$\"\n            }, {\n                token : \"comment.block.begin.lsl\",\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string.quoted.double.lsl\",\n                start : '\"',\n                end : '\"',\n                next : [{\n                    token : \"constant.character.escape.lsl\",\n                    regex : /\\\\[tn\"\\\\]/\n                }]\n            }, {\n                token : \"constant.numeric.lsl\",\n                regex : \"(0[xX][0-9a-fA-F]+|[+-]?[0-9]+(?:(?:\\\\.[0-9]*)?(?:[eE][+-]?[0-9]+)?)?)\\\\b\"\n            }, {\n                token : \"entity.name.state.lsl\",\n                regex : \"\\\\b((state)\\\\s+[A-Za-z_]\\\\w*|default)\\\\b\"\n            }, {\n                token : keywordMapper,\n                regex : \"\\\\b[a-zA-Z_][a-zA-Z0-9_]*\\\\b\"\n            }, {\n                token : \"support.function.user-defined.lsl\",\n                regex : /\\b([a-zA-Z_]\\w*)(?=\\(.*?\\))/\n            }, {\n                token : \"keyword.operator.lsl\",\n                regex : \"\\\\+\\\\+|\\\\-\\\\-|<<|>>|&&?|\\\\|\\\\|?|\\\\^|~|[!%<>=*+\\\\-\\\\/]=?\"\n            }, {\n                token : \"invalid.illegal.keyword.operator.lsl\",\n                regex : \":=?\"\n            }, {\n                token : \"punctuation.operator.lsl\",\n                regex : \"\\\\,|\\\\;\"\n            }, {\n                token : \"paren.lparen.lsl\",\n                regex : \"[\\\\[\\\\(\\\\{]\"\n            }, {\n                token : \"paren.rparen.lsl\",\n                regex : \"[\\\\]\\\\)\\\\}]\"\n            }, {\n                token : \"text.lsl\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment.block.end.lsl\",\n                regex : \"\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment.block.lsl\",\n                regex : \".+\"\n            }\n        ]\n    };\n    this.normalizeRules();\n}\n\nexports.LSLHighlightRules = LSLHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/lsl\",[\"require\",\"exports\",\"module\",\"ace/mode/lsl_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/text\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\",\"ace/lib/oop\"], function(require, exports, module) {\n\"use strict\";\n\nvar Rules = require(\"./lsl_highlight_rules\").LSLHighlightRules;\nvar Outdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar TextMode = require(\"./text\").Mode;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\nvar oop = require(\"../lib/oop\");\n\nvar Mode = function() {\n    this.HighlightRules = Rules;\n    this.$outdent = new Outdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = [\"//\"];\n\n    this.blockComment = {\n        start: \"/*\",\n        end: \"*/\"\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type === \"comment.block.lsl\") {\n            return indent;\n        }\n\n        if (state === \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/lsl\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-lua.js",
    "content": "ace.define(\"ace/mode/lua_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar LuaHighlightRules = function() {\n\n    var keywords = (\n        \"break|do|else|elseif|end|for|function|if|in|local|repeat|\"+\n         \"return|then|until|while|or|and|not\"\n    );\n\n    var builtinConstants = (\"true|false|nil|_G|_VERSION\");\n\n    var functions = (\n        \"string|xpcall|package|tostring|print|os|unpack|require|\"+\n        \"getfenv|setmetatable|next|assert|tonumber|io|rawequal|\"+\n        \"collectgarbage|getmetatable|module|rawset|math|debug|\"+\n        \"pcall|table|newproxy|type|coroutine|_G|select|gcinfo|\"+\n        \"pairs|rawget|loadstring|ipairs|_VERSION|dofile|setfenv|\"+\n        \"load|error|loadfile|\"+\n\n        \"sub|upper|len|gfind|rep|find|match|char|dump|gmatch|\"+\n        \"reverse|byte|format|gsub|lower|preload|loadlib|loaded|\"+\n        \"loaders|cpath|config|path|seeall|exit|setlocale|date|\"+\n        \"getenv|difftime|remove|time|clock|tmpname|rename|execute|\"+\n        \"lines|write|close|flush|open|output|type|read|stderr|\"+\n        \"stdin|input|stdout|popen|tmpfile|log|max|acos|huge|\"+\n        \"ldexp|pi|cos|tanh|pow|deg|tan|cosh|sinh|random|randomseed|\"+\n        \"frexp|ceil|floor|rad|abs|sqrt|modf|asin|min|mod|fmod|log10|\"+\n        \"atan2|exp|sin|atan|getupvalue|debug|sethook|getmetatable|\"+\n        \"gethook|setmetatable|setlocal|traceback|setfenv|getinfo|\"+\n        \"setupvalue|getlocal|getregistry|getfenv|setn|insert|getn|\"+\n        \"foreachi|maxn|foreach|concat|sort|remove|resume|yield|\"+\n        \"status|wrap|create|running|\"+\n        \"__add|__sub|__mod|__unm|__concat|__lt|__index|__call|__gc|__metatable|\"+\n         \"__mul|__div|__pow|__len|__eq|__le|__newindex|__tostring|__mode|__tonumber\"\n    );\n\n    var stdLibaries = (\"string|package|os|io|math|debug|table|coroutine\");\n\n    var futureReserved = \"\";\n\n    var deprecatedIn5152 = (\"setn|foreach|foreachi|gcinfo|log10|maxn\");\n\n    var keywordMapper = this.createKeywordMapper({\n        \"keyword\": keywords,\n        \"support.function\": functions,\n        \"invalid.deprecated\": deprecatedIn5152,\n        \"constant.library\": stdLibaries,\n        \"constant.language\": builtinConstants,\n        \"invalid.illegal\": futureReserved,\n        \"variable.language\": \"self\"\n    }, \"identifier\");\n\n    var decimalInteger = \"(?:(?:[1-9]\\\\d*)|(?:0))\";\n    var hexInteger = \"(?:0[xX][\\\\dA-Fa-f]+)\";\n    var integer = \"(?:\" + decimalInteger + \"|\" + hexInteger + \")\";\n\n    var fraction = \"(?:\\\\.\\\\d+)\";\n    var intPart = \"(?:\\\\d+)\";\n    var pointFloat = \"(?:(?:\" + intPart + \"?\" + fraction + \")|(?:\" + intPart + \"\\\\.))\";\n    var floatNumber = \"(?:\" + pointFloat + \")\";\n\n    this.$rules = {\n        \"start\" : [{\n            stateName: \"bracketedComment\",\n            onMatch : function(value, currentState, stack){\n                stack.unshift(this.next, value.length - 2, currentState);\n                return \"comment\";\n            },\n            regex : /\\-\\-\\[=*\\[/,\n            next  : [\n                {\n                    onMatch : function(value, currentState, stack) {\n                        if (value.length == stack[1]) {\n                            stack.shift();\n                            stack.shift();\n                            this.next = stack.shift();\n                        } else {\n                            this.next = \"\";\n                        }\n                        return \"comment\";\n                    },\n                    regex : /\\]=*\\]/,\n                    next  : \"start\"\n                }, {\n                    defaultToken : \"comment\"\n                }\n            ]\n        },\n\n        {\n            token : \"comment\",\n            regex : \"\\\\-\\\\-.*$\"\n        },\n        {\n            stateName: \"bracketedString\",\n            onMatch : function(value, currentState, stack){\n                stack.unshift(this.next, value.length, currentState);\n                return \"comment\";\n            },\n            regex : /\\[=*\\[/,\n            next  : [\n                {\n                    onMatch : function(value, currentState, stack) {\n                        if (value.length == stack[1]) {\n                            stack.shift();\n                            stack.shift();\n                            this.next = stack.shift();\n                        } else {\n                            this.next = \"\";\n                        }\n                        return \"comment\";\n                    },\n                    \n                    regex : /\\]=*\\]/,\n                    next  : \"start\"\n                }, {\n                    defaultToken : \"comment\"\n                }\n            ]\n        },\n        {\n            token : \"string\",           // \" string\n            regex : '\"(?:[^\\\\\\\\]|\\\\\\\\.)*?\"'\n        }, {\n            token : \"string\",           // ' string\n            regex : \"'(?:[^\\\\\\\\]|\\\\\\\\.)*?'\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : floatNumber\n        }, {\n            token : \"constant.numeric\", // integer\n            regex : integer + \"\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\\\+|\\\\-|\\\\*|\\\\/|%|\\\\#|\\\\^|~|<|>|<=|=>|==|~=|=|\\\\:|\\\\.\\\\.\\\\.|\\\\.\\\\.\"\n        }, {\n            token : \"paren.lparen\",\n            regex : \"[\\\\[\\\\(\\\\{]\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\]\\\\)\\\\}]\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+|\\\\w+\"\n        } ]\n    };\n    \n    this.normalizeRules();\n}\n\noop.inherits(LuaHighlightRules, TextHighlightRules);\n\nexports.LuaHighlightRules = LuaHighlightRules;\n});\n\nace.define(\"ace/mode/folding/lua\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\n\nvar FoldMode = exports.FoldMode = function() {};\n\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /\\b(function|then|do|repeat)\\b|{\\s*$|(\\[=*\\[)/;\n    this.foldingStopMarker = /\\bend\\b|^\\s*}|\\]=*\\]/;\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var isStart = this.foldingStartMarker.test(line);\n        var isEnd = this.foldingStopMarker.test(line);\n\n        if (isStart && !isEnd) {\n            var match = line.match(this.foldingStartMarker);\n            if (match[1] == \"then\" && /\\belseif\\b/.test(line))\n                return;\n            if (match[1]) {\n                if (session.getTokenAt(row, match.index + 1).type === \"keyword\")\n                    return \"start\";\n            } else if (match[2]) {\n                var type = session.bgTokenizer.getState(row) || \"\";\n                if (type[0] == \"bracketedComment\" || type[0] == \"bracketedString\")\n                    return \"start\";\n            } else {\n                return \"start\";\n            }\n        }\n        if (foldStyle != \"markbeginend\" || !isEnd || isStart && isEnd)\n            return \"\";\n\n        var match = line.match(this.foldingStopMarker);\n        if (match[0] === \"end\") {\n            if (session.getTokenAt(row, match.index + 1).type === \"keyword\")\n                return \"end\";\n        } else if (match[0][0] === \"]\") {\n            var type = session.bgTokenizer.getState(row - 1) || \"\";\n            if (type[0] == \"bracketedComment\" || type[0] == \"bracketedString\")\n                return \"end\";\n        } else\n            return \"end\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.doc.getLine(row);\n        var match = this.foldingStartMarker.exec(line);\n        if (match) {\n            if (match[1])\n                return this.luaBlock(session, row, match.index + 1);\n\n            if (match[2])\n                return session.getCommentFoldRange(row, match.index + 1);\n\n            return this.openingBracketBlock(session, \"{\", row, match.index);\n        }\n\n        var match = this.foldingStopMarker.exec(line);\n        if (match) {\n            if (match[0] === \"end\") {\n                if (session.getTokenAt(row, match.index + 1).type === \"keyword\")\n                    return this.luaBlock(session, row, match.index + 1);\n            }\n\n            if (match[0][0] === \"]\")\n                return session.getCommentFoldRange(row, match.index + 1);\n\n            return this.closingBracketBlock(session, \"}\", row, match.index + match[0].length);\n        }\n    };\n\n    this.luaBlock = function(session, row, column) {\n        var stream = new TokenIterator(session, row, column);\n        var indentKeywords = {\n            \"function\": 1,\n            \"do\": 1,\n            \"then\": 1,\n            \"elseif\": -1,\n            \"end\": -1,\n            \"repeat\": 1,\n            \"until\": -1\n        };\n\n        var token = stream.getCurrentToken();\n        if (!token || token.type != \"keyword\")\n            return;\n\n        var val = token.value;\n        var stack = [val];\n        var dir = indentKeywords[val];\n\n        if (!dir)\n            return;\n\n        var startColumn = dir === -1 ? stream.getCurrentTokenColumn() : session.getLine(row).length;\n        var startRow = row;\n\n        stream.step = dir === -1 ? stream.stepBackward : stream.stepForward;\n        while(token = stream.step()) {\n            if (token.type !== \"keyword\")\n                continue;\n            var level = dir * indentKeywords[token.value];\n\n            if (level > 0) {\n                stack.unshift(token.value);\n            } else if (level <= 0) {\n                stack.shift();\n                if (!stack.length && token.value != \"elseif\")\n                    break;\n                if (level === 0)\n                    stack.unshift(token.value);\n            }\n        }\n\n        var row = stream.getCurrentTokenRow();\n        if (dir === -1)\n            return new Range(row, session.getLine(row).length, startRow, startColumn);\n        else\n            return new Range(startRow, startColumn, row, stream.getCurrentTokenColumn());\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/lua\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/lua_highlight_rules\",\"ace/mode/folding/lua\",\"ace/range\",\"ace/worker/worker_client\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar LuaHighlightRules = require(\"./lua_highlight_rules\").LuaHighlightRules;\nvar LuaFoldMode = require(\"./folding/lua\").FoldMode;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\n\nvar Mode = function() {\n    this.HighlightRules = LuaHighlightRules;\n    \n    this.foldingRules = new LuaFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n   \n    this.lineCommentStart = \"--\";\n    this.blockComment = {start: \"--[\", end: \"]--\"};\n    \n    var indentKeywords = {\n        \"function\": 1,\n        \"then\": 1,\n        \"do\": 1,\n        \"else\": 1,\n        \"elseif\": 1,\n        \"repeat\": 1,\n        \"end\": -1,\n        \"until\": -1\n    };\n    var outdentKeywords = [\n        \"else\",\n        \"elseif\",\n        \"end\",\n        \"until\"\n    ];\n\n    function getNetIndentLevel(tokens) {\n        var level = 0;\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (token.type == \"keyword\") {\n                if (token.value in indentKeywords) {\n                    level += indentKeywords[token.value];\n                }\n            } else if (token.type == \"paren.lparen\") {\n                level ++;\n            } else if (token.type == \"paren.rparen\") {\n                level --;\n            }\n        }\n        if (level < 0) {\n            return -1;\n        } else if (level > 0) {\n            return 1;\n        } else {\n            return 0;\n        }\n    }\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var level = 0;\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (state == \"start\") {\n            level = getNetIndentLevel(tokens);\n        }\n        if (level > 0) {\n            return indent + tab;\n        } else if (level < 0 && indent.substr(indent.length - tab.length) == tab) {\n            if (!this.checkOutdent(state, line, \"\\n\")) {\n                return indent.substr(0, indent.length - tab.length);\n            }\n        }\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        if (input != \"\\n\" && input != \"\\r\" && input != \"\\r\\n\")\n            return false;\n\n        if (line.match(/^\\s*[\\)\\}\\]]$/))\n            return true;\n\n        var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens;\n\n        if (!tokens || !tokens.length)\n            return false;\n\n        return (tokens[0].type == \"keyword\" && outdentKeywords.indexOf(tokens[0].value) != -1);\n    };\n\n    this.autoOutdent = function(state, session, row) {\n        var prevLine = session.getLine(row - 1);\n        var prevIndent = this.$getIndent(prevLine).length;\n        var prevTokens = this.getTokenizer().getLineTokens(prevLine, \"start\").tokens;\n        var tabLength = session.getTabString().length;\n        var expectedIndent = prevIndent + tabLength * getNetIndentLevel(prevTokens);\n        var curIndent = this.$getIndent(session.getLine(row)).length;\n        if (curIndent < expectedIndent) {\n            return;\n        }\n        session.outdentRows(new Range(row, 0, row + 2, 0));\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/lua_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n        \n        worker.on(\"error\", function(e) {\n            session.setAnnotations([e.data]);\n        });\n        \n        worker.on(\"ok\", function(e) {\n            session.clearAnnotations();\n        });\n        \n        return worker;\n    };\n\n    this.$id = \"ace/mode/lua\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-luapage.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\nace.define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar CssBehaviour = function () {\n\n    this.inherit(CstyleBehaviour);\n\n    this.add(\"colon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(cursor.row);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                if (rightChar === ':') {\n                    return {\n                       text: '',\n                       selection: [1, 1]\n                    }\n                }\n                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n                    return {\n                       text: ':;',\n                       selection: [1, 1]\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"colon\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(range.start.row);\n                var rightChar = line.substring(range.end.column, range.end.column + 1);\n                if (rightChar === ';') {\n                    range.end.column ++;\n                    return range;\n                }\n            }\n        }\n    });\n\n    this.add(\"semicolon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ';') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === ';') {\n                return {\n                   text: '',\n                   selection: [1, 1]\n                }\n            }\n        }\n    });\n\n}\noop.inherits(CssBehaviour, CstyleBehaviour);\n\nexports.CssBehaviour = CssBehaviour;\n});\n\nace.define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CssBehaviour = require(\"./behaviour/css\").CssBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = CssHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CssBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"csslint\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/css\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\nace.define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"string.cdata.xml\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.xml-decl.xml\", \"keyword.xml-decl.xml\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_decl\", caseInsensitive: true\n            },\n            {\n                token : [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"processing_instruction\",\n            },\n            {token : \"comment.xml\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\", caseInsensitive: true\n            },\n            {include : \"tag\"},\n            {token : \"text.end-tag-open.xml\", regex: \"</\"},\n            {token : \"text.tag-open.xml\", regex: \"<\"},\n            {include : \"reference\"},\n            {defaultToken : \"text.xml\"}\n        ],\n\n        xml_decl : [{\n            token : \"entity.other.attribute-name.decl-attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.decl-attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"whitespace\"\n        }, {\n            include: \"string\"\n        }, {\n            token : \"punctuation.xml-decl.xml\",\n            regex : \"\\\\?>\",\n            next : \"start\"\n        }],\n\n        processing_instruction : [\n            {token : \"punctuation.instruction.xml\", regex : \"\\\\?>\", next : \"start\"},\n            {defaultToken : \"instruction.xml\"}\n        ],\n\n        doctype : [\n            {include : \"whitespace\"},\n            {include : \"string\"},\n            {token : \"xml-pe.doctype.xml\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe.xml\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.int-subset\", regex : \"\\\\[\", push : \"int_subset\"}\n        ],\n\n        int_subset : [{\n            token : \"text.xml\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.int-subset.xml\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.markup-decl.xml\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.cdata.xml\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text.xml\", regex : \"\\\\s+\"},\n            {token : \"text.xml\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment.xml\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment.xml\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape.reference.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        attr_reference : [{\n            token : \"constant.language.escape.reference.attribute-value.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n            regex : \"(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n            ]\n        }],\n\n        tag_whitespace : [\n            {token : \"text.tag-whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        whitespace : [\n            {token : \"text.whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        string: [{\n            token : \"string.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.xml\", regex: \"'\", next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }, {\n            token : \"string.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.xml\", regex: '\"', next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }],\n\n        attributes: [{\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"tag_whitespace\"\n        }, {\n            include: \"attribute_value\"\n        }],\n\n        attribute_value: [{\n            token : \"string.attribute-value.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }, {\n            token : \"string.attribute-value.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\nace.define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    option      : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.addRules({\n        attributes: [{\n            include : \"tag_whitespace\"\n        }, {\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\",\n            push : [{\n                include: \"tag_whitespace\"\n            }, {\n                token : \"string.unquoted.attribute-value.html\",\n                regex : \"[^<>='\\\"`\\\\s]+\",\n                next : \"pop\"\n            }, {\n                token : \"empty\",\n                regex : \"\",\n                next : \"pop\"\n            }]\n        }, {\n            include : \"attribute_value\"\n        }],\n        tag: [{\n            token : function(start, tag) {\n                var group = tagMap[tag];\n                return [\"meta.tag.punctuation.\" + (start == \"<\" ? \"\" : \"end-\") + \"tag-open.xml\",\n                    \"meta.tag\" + (group ? \".\" + group : \"\") + \".tag-name.xml\"];\n            },\n            regex : \"(</?)([-_a-zA-Z0-9:]+)\",\n            next: \"tag_stuff\"\n        }],\n        tag_stuff: [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n        ],\n    });\n\n    this.embedTagRules(CssHighlightRules, \"css-\", \"style\");\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    if (this.constructor === HtmlHighlightRules)\n        this.normalizeRules();\n};\n\noop.inherits(HtmlHighlightRules, XmlHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nvar XmlBehaviour = function () {\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selected = session.doc.getTextRange(editor.getSelectionRange());\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            }\n\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (rightChar == quote && (is(token, \"attribute-value\") || is(token, \"string\"))) {\n                return {\n                    text: \"\",\n                    selection: [1, 1]\n                };\n            }\n\n            if (!token)\n                token = iterator.stepBackward();\n\n            if (!token)\n                return;\n\n            while (is(token, \"tag-whitespace\") || is(token, \"whitespace\")) {\n                token = iterator.stepBackward();\n            }\n            var rightSpace = !rightChar || rightChar.match(/\\s/);\n            if (is(token, \"attribute-equals\") && (rightSpace || rightChar == '>') || (is(token, \"decl-attribute-equals\") && (rightSpace || rightChar == '?'))) {\n                return {\n                    text: quote + quote,\n                    selection: [1, 1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken() || iterator.stepBackward();\n            if (!token || !(is(token, \"tag-name\") || is(token, \"tag-whitespace\") || is(token, \"attribute-name\") || is(token, \"attribute-equals\") || is(token, \"attribute-value\")))\n                return;\n            if (is(token, \"reference.attribute-value\"))\n                return;\n            if (is(token, \"attribute-value\")) {\n                var firstChar = token.value.charAt(0);\n                if (firstChar == '\"' || firstChar == \"'\") {\n                    var lastChar = token.value.charAt(token.value.length - 1);\n                    var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length;\n                    if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar)\n                        return;\n                }\n            }\n            while (!is(token, \"tag-name\")) {\n                token = iterator.stepBackward();\n            }\n\n            var tokenRow = iterator.getCurrentTokenRow();\n            var tokenColumn = iterator.getCurrentTokenColumn();\n            if (is(iterator.stepBackward(), \"end-tag-open\"))\n                return;\n\n            var element = token.value;\n            if (tokenRow == position.row)\n                element = element.substring(0, position.column - tokenColumn);\n\n            if (this.voidElements.hasOwnProperty(element.toLowerCase()))\n                 return;\n\n            return {\n               text: \">\" + \"</\" + element + \">\",\n               selection: [1, 1]\n            };\n        }\n    });\n\n    this.add(\"autoindent\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.getLine(cursor.row);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (token && token.type.indexOf(\"tag-close\") !== -1) {\n                while (token && token.type.indexOf(\"tag-name\") === -1) {\n                    token = iterator.stepBackward();\n                }\n\n                if (!token) {\n                    return;\n                }\n\n                var tag = token.value;\n                var row = iterator.getCurrentTokenRow();\n                token = iterator.stepBackward();\n                if (!token || token.type.indexOf(\"end-tag\") !== -1) {\n                    return;\n                }\n\n                if (this.voidElements && !this.voidElements[tag]) {\n                    var nextToken = session.getTokenAt(cursor.row, cursor.column+1);\n                    var line = session.getLine(row);\n                    var nextIndent = this.$getIndent(line);\n                    var indent = nextIndent + session.getTabString();\n\n                    if (nextToken && nextToken.value === \"</\") {\n                        return {\n                            text: \"\\n\" + indent + \"\\n\" + nextIndent,\n                            selection: [1, indent.length, 1, indent.length]\n                        };\n                    } else {\n                        return {\n                            text: \"\\n\" + indent\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n};\n\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\nace.define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n    this.defaultMode = defaultMode;\n    this.subModes = subModes;\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n\n    this.$getMode = function(state) {\n        if (typeof state != \"string\") \n            state = state[0];\n        for (var key in this.subModes) {\n            if (state.indexOf(key) === 0)\n                return this.subModes[key];\n        }\n        return null;\n    };\n    \n    this.$tryMode = function(state, session, foldStyle, row) {\n        var mode = this.$getMode(state);\n        return (mode ? mode.getFoldWidget(session, foldStyle, row) : \"\");\n    };\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        return (\n            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n            this.defaultMode.getFoldWidget(session, foldStyle, row)\n        );\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var mode = this.$getMode(session.getState(row-1));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.$getMode(session.getState(row));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.defaultMode;\n        \n        return mode.getFoldWidgetRange(session, foldStyle, row);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalEndTags) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n    this.optionalEndTags = oop.mixin({}, this.voidElements);\n    if (optionalEndTags)\n        oop.mixin(this.optionalEndTags, optionalEndTags);\n    \n};\noop.inherits(FoldMode, BaseFoldMode);\n\nvar Tag = function() {\n    this.tagName = \"\";\n    this.closing = false;\n    this.selfClosing = false;\n    this.start = {row: 0, column: 0};\n    this.end = {row: 0, column: 0};\n};\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (!tag)\n            return \"\";\n\n        if (tag.closing || (!tag.tagName && tag.selfClosing))\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase()))\n            return \"\";\n\n        if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column))\n            return \"\";\n\n        return \"start\";\n    };\n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var tag = new Tag();\n\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (is(token, \"tag-open\")) {\n                tag.end.column = tag.start.column + token.value.length;\n                tag.closing = is(token, \"end-tag-open\");\n                token = tokens[++i];\n                if (!token)\n                    return null;\n                tag.tagName = token.value;\n                tag.end.column += token.value.length;\n                for (i++; i < tokens.length; i++) {\n                    token = tokens[i];\n                    tag.end.column += token.value.length;\n                    if (is(token, \"tag-close\")) {\n                        tag.selfClosing = token.value == '/>';\n                        break;\n                    }\n                }\n                return tag;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == '/>';\n                return tag;\n            }\n            tag.start.column += token.value.length;\n        }\n\n        return null;\n    };\n\n    this._findEndTagInLine = function(session, row, tagName, startColumn) {\n        var tokens = session.getTokens(row);\n        var column = 0;\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            column += token.value.length;\n            if (column < startColumn)\n                continue;\n            if (is(token, \"end-tag-open\")) {\n                token = tokens[i + 1];\n                if (token && token.value == tagName)\n                    return true;\n            }\n        }\n        return false;\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n                iterator.stepForward();\n                return tag;\n            }\n        } while(token = iterator.stepForward());\n\n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n                iterator.stepBackward();\n                return tag;\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n            }\n        } while(token = iterator.stepBackward());\n\n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.optionalEndTags.hasOwnProperty(top.tagName)) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.start.column);\n            var start = {\n                row: row,\n                column: firstTag.start.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.end.column);\n            var end = {\n                row: row,\n                column: firstTag.start.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar MixedFoldMode = require(\"./mixed\").FoldMode;\nvar XmlFoldMode = require(\"./xml\").FoldMode;\nvar CStyleFoldMode = require(\"./cstyle\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalTags) {\n    MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), {\n        \"js-\": new CStyleFoldMode(),\n        \"css-\": new CStyleFoldMode()\n    });\n};\n\noop.inherits(FoldMode, MixedFoldMode);\n\n});\n\nace.define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\n\nvar commonAttributes = [\n    \"accesskey\",\n    \"class\",\n    \"contenteditable\",\n    \"contextmenu\",\n    \"dir\",\n    \"draggable\",\n    \"dropzone\",\n    \"hidden\",\n    \"id\",\n    \"inert\",\n    \"itemid\",\n    \"itemprop\",\n    \"itemref\",\n    \"itemscope\",\n    \"itemtype\",\n    \"lang\",\n    \"spellcheck\",\n    \"style\",\n    \"tabindex\",\n    \"title\",\n    \"translate\"\n];\n\nvar eventAttributes = [\n    \"onabort\",\n    \"onblur\",\n    \"oncancel\",\n    \"oncanplay\",\n    \"oncanplaythrough\",\n    \"onchange\",\n    \"onclick\",\n    \"onclose\",\n    \"oncontextmenu\",\n    \"oncuechange\",\n    \"ondblclick\",\n    \"ondrag\",\n    \"ondragend\",\n    \"ondragenter\",\n    \"ondragleave\",\n    \"ondragover\",\n    \"ondragstart\",\n    \"ondrop\",\n    \"ondurationchange\",\n    \"onemptied\",\n    \"onended\",\n    \"onerror\",\n    \"onfocus\",\n    \"oninput\",\n    \"oninvalid\",\n    \"onkeydown\",\n    \"onkeypress\",\n    \"onkeyup\",\n    \"onload\",\n    \"onloadeddata\",\n    \"onloadedmetadata\",\n    \"onloadstart\",\n    \"onmousedown\",\n    \"onmousemove\",\n    \"onmouseout\",\n    \"onmouseover\",\n    \"onmouseup\",\n    \"onmousewheel\",\n    \"onpause\",\n    \"onplay\",\n    \"onplaying\",\n    \"onprogress\",\n    \"onratechange\",\n    \"onreset\",\n    \"onscroll\",\n    \"onseeked\",\n    \"onseeking\",\n    \"onselect\",\n    \"onshow\",\n    \"onstalled\",\n    \"onsubmit\",\n    \"onsuspend\",\n    \"ontimeupdate\",\n    \"onvolumechange\",\n    \"onwaiting\"\n];\n\nvar globalAttributes = commonAttributes.concat(eventAttributes);\n\nvar attributeMap = {\n    \"html\": [\"manifest\"],\n    \"head\": [],\n    \"title\": [],\n    \"base\": [\"href\", \"target\"],\n    \"link\": [\"href\", \"hreflang\", \"rel\", \"media\", \"type\", \"sizes\"],\n    \"meta\": [\"http-equiv\", \"name\", \"content\", \"charset\"],\n    \"style\": [\"type\", \"media\", \"scoped\"],\n    \"script\": [\"charset\", \"type\", \"src\", \"defer\", \"async\"],\n    \"noscript\": [\"href\"],\n    \"body\": [\"onafterprint\", \"onbeforeprint\", \"onbeforeunload\", \"onhashchange\", \"onmessage\", \"onoffline\", \"onpopstate\", \"onredo\", \"onresize\", \"onstorage\", \"onundo\", \"onunload\"],\n    \"section\": [],\n    \"nav\": [],\n    \"article\": [\"pubdate\"],\n    \"aside\": [],\n    \"h1\": [],\n    \"h2\": [],\n    \"h3\": [],\n    \"h4\": [],\n    \"h5\": [],\n    \"h6\": [],\n    \"header\": [],\n    \"footer\": [],\n    \"address\": [],\n    \"main\": [],\n    \"p\": [],\n    \"hr\": [],\n    \"pre\": [],\n    \"blockquote\": [\"cite\"],\n    \"ol\": [\"start\", \"reversed\"],\n    \"ul\": [],\n    \"li\": [\"value\"],\n    \"dl\": [],\n    \"dt\": [],\n    \"dd\": [],\n    \"figure\": [],\n    \"figcaption\": [],\n    \"div\": [],\n    \"a\": [\"href\", \"target\", \"ping\", \"rel\", \"media\", \"hreflang\", \"type\"],\n    \"em\": [],\n    \"strong\": [],\n    \"small\": [],\n    \"s\": [],\n    \"cite\": [],\n    \"q\": [\"cite\"],\n    \"dfn\": [],\n    \"abbr\": [],\n    \"data\": [],\n    \"time\": [\"datetime\"],\n    \"code\": [],\n    \"var\": [],\n    \"samp\": [],\n    \"kbd\": [],\n    \"sub\": [],\n    \"sup\": [],\n    \"i\": [],\n    \"b\": [],\n    \"u\": [],\n    \"mark\": [],\n    \"ruby\": [],\n    \"rt\": [],\n    \"rp\": [],\n    \"bdi\": [],\n    \"bdo\": [],\n    \"span\": [],\n    \"br\": [],\n    \"wbr\": [],\n    \"ins\": [\"cite\", \"datetime\"],\n    \"del\": [\"cite\", \"datetime\"],\n    \"img\": [\"alt\", \"src\", \"height\", \"width\", \"usemap\", \"ismap\"],\n    \"iframe\": [\"name\", \"src\", \"height\", \"width\", \"sandbox\", \"seamless\"],\n    \"embed\": [\"src\", \"height\", \"width\", \"type\"],\n    \"object\": [\"param\", \"data\", \"type\", \"height\" , \"width\", \"usemap\", \"name\", \"form\", \"classid\"],\n    \"param\": [\"name\", \"value\"],\n    \"video\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\", \"width\", \"height\", \"poster\"],\n    \"audio\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\"],\n    \"source\": [\"src\", \"type\", \"media\"],\n    \"track\": [\"kind\", \"src\", \"srclang\", \"label\", \"default\"],\n    \"canvas\": [\"width\", \"height\"],\n    \"map\": [\"name\"],\n    \"area\": [\"shape\", \"coords\", \"href\", \"hreflang\", \"alt\", \"target\", \"media\", \"rel\", \"ping\", \"type\"],\n    \"svg\": [],\n    \"math\": [],\n    \"table\": [\"summary\"],\n    \"caption\": [],\n    \"colgroup\": [\"span\"],\n    \"col\": [\"span\"],\n    \"tbody\": [],\n    \"thead\": [],\n    \"tfoot\": [],\n    \"tr\": [],\n    \"td\": [\"headers\", \"rowspan\", \"colspan\"],\n    \"th\": [\"headers\", \"rowspan\", \"colspan\", \"scope\"],\n    \"form\": [\"accept-charset\", \"action\", \"autocomplete\", \"enctype\", \"method\", \"name\", \"novalidate\", \"target\"],\n    \"fieldset\": [\"disabled\", \"form\", \"name\"],\n    \"legend\": [],\n    \"label\": [\"form\", \"for\"],\n    \"input\": [\"type\", \"accept\", \"alt\", \"autocomplete\", \"checked\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"height\", \"list\", \"max\", \"maxlength\", \"min\", \"multiple\", \"pattern\", \"placeholder\", \"readonly\", \"required\", \"size\", \"src\", \"step\", \"width\", \"files\", \"value\"],\n    \"button\": [\"autofocus\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"name\", \"value\", \"type\"],\n    \"select\": [\"autofocus\", \"disabled\", \"form\", \"multiple\", \"name\", \"size\"],\n    \"datalist\": [],\n    \"optgroup\": [\"disabled\", \"label\"],\n    \"option\": [\"disabled\", \"selected\", \"label\", \"value\"],\n    \"textarea\": [\"autofocus\", \"disabled\", \"form\", \"maxlength\", \"name\", \"placeholder\", \"readonly\", \"required\", \"rows\", \"cols\", \"wrap\"],\n    \"keygen\": [\"autofocus\", \"challenge\", \"disabled\", \"form\", \"keytype\", \"name\"],\n    \"output\": [\"for\", \"form\", \"name\"],\n    \"progress\": [\"value\", \"max\"],\n    \"meter\": [\"value\", \"min\", \"max\", \"low\", \"high\", \"optimum\"],\n    \"details\": [\"open\"],\n    \"summary\": [],\n    \"command\": [\"type\", \"label\", \"icon\", \"disabled\", \"checked\", \"radiogroup\", \"command\"],\n    \"menu\": [\"type\", \"label\"],\n    \"dialog\": [\"open\"]\n};\n\nvar elements = Object.keys(attributeMap);\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nfunction findTagName(session, pos) {\n    var iterator = new TokenIterator(session, pos.row, pos.column);\n    var token = iterator.getCurrentToken();\n    while (token && !is(token, \"tag-name\")){\n        token = iterator.stepBackward();\n    }\n    if (token)\n        return token.value;\n}\n\nvar HtmlCompletions = function() {\n\n};\n\n(function() {\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        var token = session.getTokenAt(pos.row, pos.column);\n\n        if (!token)\n            return [];\n        if (is(token, \"tag-name\") || is(token, \"tag-open\") || is(token, \"end-tag-open\"))\n            return this.getTagCompletions(state, session, pos, prefix);\n        if (is(token, \"tag-whitespace\") || is(token, \"attribute-name\"))\n            return this.getAttributeCompetions(state, session, pos, prefix);\n\n        return [];\n    };\n\n    this.getTagCompletions = function(state, session, pos, prefix) {\n        return elements.map(function(element){\n            return {\n                value: element,\n                meta: \"tag\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n    this.getAttributeCompetions = function(state, session, pos, prefix) {\n        var tagName = findTagName(session, pos);\n        if (!tagName)\n            return [];\n        var attributes = globalAttributes;\n        if (tagName in attributeMap) {\n            attributes = attributes.concat(attributeMap[tagName]);\n        }\n        return attributes.map(function(attribute){\n            return {\n                caption: attribute,\n                snippet: attribute + '=\"$0\"',\n                meta: \"attribute\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n}).call(HtmlCompletions.prototype);\n\nexports.HtmlCompletions = HtmlCompletions;\n});\n\nace.define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar HtmlFoldMode = require(\"./folding/html\").FoldMode;\nvar HtmlCompletions = require(\"./html_completions\").HtmlCompletions;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar voidElements = [\"area\", \"base\", \"br\", \"col\", \"embed\", \"hr\", \"img\", \"input\", \"keygen\", \"link\", \"meta\", \"menuitem\", \"param\", \"source\", \"track\", \"wbr\"];\nvar optionalEndTags = [\"li\", \"dt\", \"dd\", \"p\", \"rt\", \"rp\", \"optgroup\", \"option\", \"colgroup\", \"td\", \"th\"];\n\nvar Mode = function(options) {\n    this.fragmentContext = options && options.fragmentContext;\n    this.HighlightRules = HtmlHighlightRules;\n    this.$behaviour = new XmlBehaviour();\n    this.$completer = new HtmlCompletions();\n    \n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"css-\": CssMode\n    });\n    \n    this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags));\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n    this.voidElements = lang.arrayToMap(voidElements);\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        return this.$completer.getCompletions(state, session, pos, prefix);\n    };\n\n    this.createWorker = function(session) {\n        if (this.constructor != Mode)\n            return;\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/html_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        if (this.fragmentContext)\n            worker.call(\"setOptions\", [{context: this.fragmentContext}]);\n\n        worker.on(\"error\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/html\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/lua_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar LuaHighlightRules = function() {\n\n    var keywords = (\n        \"break|do|else|elseif|end|for|function|if|in|local|repeat|\"+\n         \"return|then|until|while|or|and|not\"\n    );\n\n    var builtinConstants = (\"true|false|nil|_G|_VERSION\");\n\n    var functions = (\n        \"string|xpcall|package|tostring|print|os|unpack|require|\"+\n        \"getfenv|setmetatable|next|assert|tonumber|io|rawequal|\"+\n        \"collectgarbage|getmetatable|module|rawset|math|debug|\"+\n        \"pcall|table|newproxy|type|coroutine|_G|select|gcinfo|\"+\n        \"pairs|rawget|loadstring|ipairs|_VERSION|dofile|setfenv|\"+\n        \"load|error|loadfile|\"+\n\n        \"sub|upper|len|gfind|rep|find|match|char|dump|gmatch|\"+\n        \"reverse|byte|format|gsub|lower|preload|loadlib|loaded|\"+\n        \"loaders|cpath|config|path|seeall|exit|setlocale|date|\"+\n        \"getenv|difftime|remove|time|clock|tmpname|rename|execute|\"+\n        \"lines|write|close|flush|open|output|type|read|stderr|\"+\n        \"stdin|input|stdout|popen|tmpfile|log|max|acos|huge|\"+\n        \"ldexp|pi|cos|tanh|pow|deg|tan|cosh|sinh|random|randomseed|\"+\n        \"frexp|ceil|floor|rad|abs|sqrt|modf|asin|min|mod|fmod|log10|\"+\n        \"atan2|exp|sin|atan|getupvalue|debug|sethook|getmetatable|\"+\n        \"gethook|setmetatable|setlocal|traceback|setfenv|getinfo|\"+\n        \"setupvalue|getlocal|getregistry|getfenv|setn|insert|getn|\"+\n        \"foreachi|maxn|foreach|concat|sort|remove|resume|yield|\"+\n        \"status|wrap|create|running|\"+\n        \"__add|__sub|__mod|__unm|__concat|__lt|__index|__call|__gc|__metatable|\"+\n         \"__mul|__div|__pow|__len|__eq|__le|__newindex|__tostring|__mode|__tonumber\"\n    );\n\n    var stdLibaries = (\"string|package|os|io|math|debug|table|coroutine\");\n\n    var futureReserved = \"\";\n\n    var deprecatedIn5152 = (\"setn|foreach|foreachi|gcinfo|log10|maxn\");\n\n    var keywordMapper = this.createKeywordMapper({\n        \"keyword\": keywords,\n        \"support.function\": functions,\n        \"invalid.deprecated\": deprecatedIn5152,\n        \"constant.library\": stdLibaries,\n        \"constant.language\": builtinConstants,\n        \"invalid.illegal\": futureReserved,\n        \"variable.language\": \"self\"\n    }, \"identifier\");\n\n    var decimalInteger = \"(?:(?:[1-9]\\\\d*)|(?:0))\";\n    var hexInteger = \"(?:0[xX][\\\\dA-Fa-f]+)\";\n    var integer = \"(?:\" + decimalInteger + \"|\" + hexInteger + \")\";\n\n    var fraction = \"(?:\\\\.\\\\d+)\";\n    var intPart = \"(?:\\\\d+)\";\n    var pointFloat = \"(?:(?:\" + intPart + \"?\" + fraction + \")|(?:\" + intPart + \"\\\\.))\";\n    var floatNumber = \"(?:\" + pointFloat + \")\";\n\n    this.$rules = {\n        \"start\" : [{\n            stateName: \"bracketedComment\",\n            onMatch : function(value, currentState, stack){\n                stack.unshift(this.next, value.length - 2, currentState);\n                return \"comment\";\n            },\n            regex : /\\-\\-\\[=*\\[/,\n            next  : [\n                {\n                    onMatch : function(value, currentState, stack) {\n                        if (value.length == stack[1]) {\n                            stack.shift();\n                            stack.shift();\n                            this.next = stack.shift();\n                        } else {\n                            this.next = \"\";\n                        }\n                        return \"comment\";\n                    },\n                    regex : /\\]=*\\]/,\n                    next  : \"start\"\n                }, {\n                    defaultToken : \"comment\"\n                }\n            ]\n        },\n\n        {\n            token : \"comment\",\n            regex : \"\\\\-\\\\-.*$\"\n        },\n        {\n            stateName: \"bracketedString\",\n            onMatch : function(value, currentState, stack){\n                stack.unshift(this.next, value.length, currentState);\n                return \"comment\";\n            },\n            regex : /\\[=*\\[/,\n            next  : [\n                {\n                    onMatch : function(value, currentState, stack) {\n                        if (value.length == stack[1]) {\n                            stack.shift();\n                            stack.shift();\n                            this.next = stack.shift();\n                        } else {\n                            this.next = \"\";\n                        }\n                        return \"comment\";\n                    },\n                    \n                    regex : /\\]=*\\]/,\n                    next  : \"start\"\n                }, {\n                    defaultToken : \"comment\"\n                }\n            ]\n        },\n        {\n            token : \"string\",           // \" string\n            regex : '\"(?:[^\\\\\\\\]|\\\\\\\\.)*?\"'\n        }, {\n            token : \"string\",           // ' string\n            regex : \"'(?:[^\\\\\\\\]|\\\\\\\\.)*?'\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : floatNumber\n        }, {\n            token : \"constant.numeric\", // integer\n            regex : integer + \"\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\\\+|\\\\-|\\\\*|\\\\/|%|\\\\#|\\\\^|~|<|>|<=|=>|==|~=|=|\\\\:|\\\\.\\\\.\\\\.|\\\\.\\\\.\"\n        }, {\n            token : \"paren.lparen\",\n            regex : \"[\\\\[\\\\(\\\\{]\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\]\\\\)\\\\}]\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+|\\\\w+\"\n        } ]\n    };\n    \n    this.normalizeRules();\n}\n\noop.inherits(LuaHighlightRules, TextHighlightRules);\n\nexports.LuaHighlightRules = LuaHighlightRules;\n});\n\nace.define(\"ace/mode/folding/lua\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\n\nvar FoldMode = exports.FoldMode = function() {};\n\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /\\b(function|then|do|repeat)\\b|{\\s*$|(\\[=*\\[)/;\n    this.foldingStopMarker = /\\bend\\b|^\\s*}|\\]=*\\]/;\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var isStart = this.foldingStartMarker.test(line);\n        var isEnd = this.foldingStopMarker.test(line);\n\n        if (isStart && !isEnd) {\n            var match = line.match(this.foldingStartMarker);\n            if (match[1] == \"then\" && /\\belseif\\b/.test(line))\n                return;\n            if (match[1]) {\n                if (session.getTokenAt(row, match.index + 1).type === \"keyword\")\n                    return \"start\";\n            } else if (match[2]) {\n                var type = session.bgTokenizer.getState(row) || \"\";\n                if (type[0] == \"bracketedComment\" || type[0] == \"bracketedString\")\n                    return \"start\";\n            } else {\n                return \"start\";\n            }\n        }\n        if (foldStyle != \"markbeginend\" || !isEnd || isStart && isEnd)\n            return \"\";\n\n        var match = line.match(this.foldingStopMarker);\n        if (match[0] === \"end\") {\n            if (session.getTokenAt(row, match.index + 1).type === \"keyword\")\n                return \"end\";\n        } else if (match[0][0] === \"]\") {\n            var type = session.bgTokenizer.getState(row - 1) || \"\";\n            if (type[0] == \"bracketedComment\" || type[0] == \"bracketedString\")\n                return \"end\";\n        } else\n            return \"end\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.doc.getLine(row);\n        var match = this.foldingStartMarker.exec(line);\n        if (match) {\n            if (match[1])\n                return this.luaBlock(session, row, match.index + 1);\n\n            if (match[2])\n                return session.getCommentFoldRange(row, match.index + 1);\n\n            return this.openingBracketBlock(session, \"{\", row, match.index);\n        }\n\n        var match = this.foldingStopMarker.exec(line);\n        if (match) {\n            if (match[0] === \"end\") {\n                if (session.getTokenAt(row, match.index + 1).type === \"keyword\")\n                    return this.luaBlock(session, row, match.index + 1);\n            }\n\n            if (match[0][0] === \"]\")\n                return session.getCommentFoldRange(row, match.index + 1);\n\n            return this.closingBracketBlock(session, \"}\", row, match.index + match[0].length);\n        }\n    };\n\n    this.luaBlock = function(session, row, column) {\n        var stream = new TokenIterator(session, row, column);\n        var indentKeywords = {\n            \"function\": 1,\n            \"do\": 1,\n            \"then\": 1,\n            \"elseif\": -1,\n            \"end\": -1,\n            \"repeat\": 1,\n            \"until\": -1\n        };\n\n        var token = stream.getCurrentToken();\n        if (!token || token.type != \"keyword\")\n            return;\n\n        var val = token.value;\n        var stack = [val];\n        var dir = indentKeywords[val];\n\n        if (!dir)\n            return;\n\n        var startColumn = dir === -1 ? stream.getCurrentTokenColumn() : session.getLine(row).length;\n        var startRow = row;\n\n        stream.step = dir === -1 ? stream.stepBackward : stream.stepForward;\n        while(token = stream.step()) {\n            if (token.type !== \"keyword\")\n                continue;\n            var level = dir * indentKeywords[token.value];\n\n            if (level > 0) {\n                stack.unshift(token.value);\n            } else if (level <= 0) {\n                stack.shift();\n                if (!stack.length && token.value != \"elseif\")\n                    break;\n                if (level === 0)\n                    stack.unshift(token.value);\n            }\n        }\n\n        var row = stream.getCurrentTokenRow();\n        if (dir === -1)\n            return new Range(row, session.getLine(row).length, startRow, startColumn);\n        else\n            return new Range(startRow, startColumn, row, stream.getCurrentTokenColumn());\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/lua\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/lua_highlight_rules\",\"ace/mode/folding/lua\",\"ace/range\",\"ace/worker/worker_client\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar LuaHighlightRules = require(\"./lua_highlight_rules\").LuaHighlightRules;\nvar LuaFoldMode = require(\"./folding/lua\").FoldMode;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\n\nvar Mode = function() {\n    this.HighlightRules = LuaHighlightRules;\n    \n    this.foldingRules = new LuaFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n   \n    this.lineCommentStart = \"--\";\n    this.blockComment = {start: \"--[\", end: \"]--\"};\n    \n    var indentKeywords = {\n        \"function\": 1,\n        \"then\": 1,\n        \"do\": 1,\n        \"else\": 1,\n        \"elseif\": 1,\n        \"repeat\": 1,\n        \"end\": -1,\n        \"until\": -1\n    };\n    var outdentKeywords = [\n        \"else\",\n        \"elseif\",\n        \"end\",\n        \"until\"\n    ];\n\n    function getNetIndentLevel(tokens) {\n        var level = 0;\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (token.type == \"keyword\") {\n                if (token.value in indentKeywords) {\n                    level += indentKeywords[token.value];\n                }\n            } else if (token.type == \"paren.lparen\") {\n                level ++;\n            } else if (token.type == \"paren.rparen\") {\n                level --;\n            }\n        }\n        if (level < 0) {\n            return -1;\n        } else if (level > 0) {\n            return 1;\n        } else {\n            return 0;\n        }\n    }\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var level = 0;\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (state == \"start\") {\n            level = getNetIndentLevel(tokens);\n        }\n        if (level > 0) {\n            return indent + tab;\n        } else if (level < 0 && indent.substr(indent.length - tab.length) == tab) {\n            if (!this.checkOutdent(state, line, \"\\n\")) {\n                return indent.substr(0, indent.length - tab.length);\n            }\n        }\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        if (input != \"\\n\" && input != \"\\r\" && input != \"\\r\\n\")\n            return false;\n\n        if (line.match(/^\\s*[\\)\\}\\]]$/))\n            return true;\n\n        var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens;\n\n        if (!tokens || !tokens.length)\n            return false;\n\n        return (tokens[0].type == \"keyword\" && outdentKeywords.indexOf(tokens[0].value) != -1);\n    };\n\n    this.autoOutdent = function(state, session, row) {\n        var prevLine = session.getLine(row - 1);\n        var prevIndent = this.$getIndent(prevLine).length;\n        var prevTokens = this.getTokenizer().getLineTokens(prevLine, \"start\").tokens;\n        var tabLength = session.getTabString().length;\n        var expectedIndent = prevIndent + tabLength * getNetIndentLevel(prevTokens);\n        var curIndent = this.$getIndent(session.getLine(row)).length;\n        if (curIndent < expectedIndent) {\n            return;\n        }\n        session.outdentRows(new Range(row, 0, row + 2, 0));\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/lua_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n        \n        worker.on(\"error\", function(e) {\n            session.setAnnotations([e.data]);\n        });\n        \n        worker.on(\"ok\", function(e) {\n            session.clearAnnotations();\n        });\n        \n        return worker;\n    };\n\n    this.$id = \"ace/mode/lua\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/luapage_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html_highlight_rules\",\"ace/mode/lua_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar LuaHighlightRules = require(\"./lua_highlight_rules\").LuaHighlightRules;\n\nvar LuaPageHighlightRules = function() {\n    HtmlHighlightRules.call(this);\n\n    var startRules = [\n        {\n            token: \"keyword\",\n            regex: \"<\\\\%\\\\=?\",\n            push: \"lua-start\"\n        }, {\n            token: \"keyword\",\n            regex: \"<\\\\?lua\\\\=?\",\n            push: \"lua-start\"\n        }\n    ];\n\n    var endRules = [\n        {\n            token: \"keyword\",\n            regex: \"\\\\%>\",\n            next: \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"\\\\?>\",\n            next: \"pop\"\n        }\n    ];\n\n    this.embedRules(LuaHighlightRules, \"lua-\", endRules, [\"start\"]);\n\n    for (var key in this.$rules)\n        this.$rules[key].unshift.apply(this.$rules[key], startRules);\n\n    this.normalizeRules();\n};\n\noop.inherits(LuaPageHighlightRules, HtmlHighlightRules);\n\nexports.LuaPageHighlightRules = LuaPageHighlightRules;\n\n});\n\nace.define(\"ace/mode/luapage\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html\",\"ace/mode/lua\",\"ace/mode/luapage_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar HtmlMode = require(\"./html\").Mode;\nvar LuaMode = require(\"./lua\").Mode;\nvar LuaPageHighlightRules = require(\"./luapage_highlight_rules\").LuaPageHighlightRules;\n\nvar Mode = function() {\n    HtmlMode.call(this);\n    \n    this.HighlightRules = LuaPageHighlightRules;\n    this.createModeDelegates({\n        \"lua-\": LuaMode\n    });\n};\noop.inherits(Mode, HtmlMode);\n\n(function() {\n    this.$id = \"ace/mode/luapage\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-lucene.js",
    "content": "ace.define(\"ace/mode/lucene_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar LuceneHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"constant.character.negation\",\n                regex : \"[\\\\-]\"\n            }, {\n                token : \"constant.character.interro\",\n                regex : \"[\\\\?]\"\n            }, {\n                token : \"constant.character.asterisk\",\n                regex : \"[\\\\*]\"\n            }, {\n                token: 'constant.character.proximity',\n                regex: '~[0-9]+\\\\b'\n            }, {\n                token : 'keyword.operator',\n                regex: '(?:AND|OR|NOT)\\\\b'\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[\\\\(]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\)]\"\n            }, {\n                token : \"keyword\",\n                regex : \"[\\\\S]+:\"\n            }, {\n                token : \"string\",           // \" string\n                regex : '\".*?\"'\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ]\n    };\n};\n\noop.inherits(LuceneHighlightRules, TextHighlightRules);\n\nexports.LuceneHighlightRules = LuceneHighlightRules;\n});\n\nace.define(\"ace/mode/lucene\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/lucene_highlight_rules\"], function(require, exports, module) {\n'use strict';\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar LuceneHighlightRules = require(\"./lucene_highlight_rules\").LuceneHighlightRules;\n\nvar Mode = function() {\n    this.HighlightRules = LuceneHighlightRules;\n};\n\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.$id = \"ace/mode/lucene\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-makefile.js",
    "content": "ace.define(\"ace/mode/sh_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar reservedKeywords = exports.reservedKeywords = (\n        '!|{|}|case|do|done|elif|else|'+\n        'esac|fi|for|if|in|then|until|while|'+\n        '&|;|export|local|read|typeset|unset|'+\n        'elif|select|set'\n    );\n\nvar languageConstructs = exports.languageConstructs = (\n    '[|]|alias|bg|bind|break|builtin|'+\n     'cd|command|compgen|complete|continue|'+\n     'dirs|disown|echo|enable|eval|exec|'+\n     'exit|fc|fg|getopts|hash|help|history|'+\n     'jobs|kill|let|logout|popd|printf|pushd|'+\n     'pwd|return|set|shift|shopt|source|'+\n     'suspend|test|times|trap|type|ulimit|'+\n     'umask|unalias|wait'\n);\n\nvar ShHighlightRules = function() {\n    var keywordMapper = this.createKeywordMapper({\n        \"keyword\": reservedKeywords,\n        \"support.function.builtin\": languageConstructs,\n        \"invalid.deprecated\": \"debugger\"\n    }, \"identifier\");\n\n    var integer = \"(?:(?:[1-9]\\\\d*)|(?:0))\";\n\n    var fraction = \"(?:\\\\.\\\\d+)\";\n    var intPart = \"(?:\\\\d+)\";\n    var pointFloat = \"(?:(?:\" + intPart + \"?\" + fraction + \")|(?:\" + intPart + \"\\\\.))\";\n    var exponentFloat = \"(?:(?:\" + pointFloat + \"|\" +  intPart + \")\" + \")\";\n    var floatNumber = \"(?:\" + exponentFloat + \"|\" + pointFloat + \")\";\n    var fileDescriptor = \"(?:&\" + intPart + \")\";\n\n    var variableName = \"[a-zA-Z_][a-zA-Z0-9_]*\";\n    var variable = \"(?:(?:\\\\$\" + variableName + \")|(?:\" + variableName + \"=))\";\n\n    var builtinVariable = \"(?:\\\\$(?:SHLVL|\\\\$|\\\\!|\\\\?))\";\n\n    var func = \"(?:\" + variableName + \"\\\\s*\\\\(\\\\))\";\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"constant\",\n            regex : /\\\\./\n        }, {\n            token : [\"text\", \"comment\"],\n            regex : /(^|\\s)(#.*)$/\n        }, {\n            token : \"string\",\n            regex : '\"',\n            push : [{\n                token : \"constant.language.escape\",\n                regex : /\\\\(?:[$abeEfnrtv\\\\'\"]|x[a-fA-F\\d]{1,2}|u[a-fA-F\\d]{4}([a-fA-F\\d]{4})?|c.|\\d{1,3})/\n            }, {\n                token : \"constant\",\n                regex : /\\$\\w+/\n            }, {\n                token : \"string\",\n                regex : '\"',\n                next: \"pop\"\n            }, {\n                defaultToken: \"string\"\n            }]\n        }, {\n            regex : \"<<<\",\n            token : \"keyword.operator\"\n        }, {\n            stateName: \"heredoc\",\n            regex : \"(<<)(\\\\s*)(['\\\"`]?)([\\\\w\\\\-]+)(['\\\"`]?)\",\n            onMatch : function(value, currentState, stack) {\n                var next = value[2] == '-' ? \"indentedHeredoc\" : \"heredoc\";\n                var tokens = value.split(this.splitRegex);\n                stack.push(next, tokens[4]);\n                return [\n                    {type:\"constant\", value: tokens[1]},\n                    {type:\"text\", value: tokens[2]},\n                    {type:\"string\", value: tokens[3]},\n                    {type:\"support.class\", value: tokens[4]},\n                    {type:\"string\", value: tokens[5]}\n                ];\n            },\n            rules: {\n                heredoc: [{\n                    onMatch:  function(value, currentState, stack) {\n                        if (value === stack[1]) {\n                            stack.shift();\n                            stack.shift();\n                            this.next = stack[0] || \"start\";\n                            return \"support.class\";\n                        }\n                        this.next = \"\";\n                        return \"string\";\n                    },\n                    regex: \".*$\",\n                    next: \"start\"\n                }],\n                indentedHeredoc: [{\n                    token: \"string\",\n                    regex: \"^\\t+\"\n                }, {\n                    onMatch:  function(value, currentState, stack) {\n                        if (value === stack[1]) {\n                            stack.shift();\n                            stack.shift();\n                            this.next = stack[0] || \"start\";\n                            return \"support.class\";\n                        }\n                        this.next = \"\";\n                        return \"string\";\n                    },\n                    regex: \".*$\",\n                    next: \"start\"\n                }]\n            }\n        }, {\n            regex : \"$\",\n            token : \"empty\",\n            next : function(currentState, stack) {\n                if (stack[0] === \"heredoc\" || stack[0] === \"indentedHeredoc\")\n                    return stack[0];\n                return currentState;\n            }\n        }, {\n            token : \"variable.language\",\n            regex : builtinVariable\n        }, {\n            token : \"variable\",\n            regex : variable\n        }, {\n            token : \"support.function\",\n            regex : func\n        }, {\n            token : \"support.function\",\n            regex : fileDescriptor\n        }, {\n            token : \"string\",           // ' string\n            start : \"'\", end : \"'\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : floatNumber\n        }, {\n            token : \"constant.numeric\", // integer\n            regex : integer + \"\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_][a-zA-Z0-9_]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\\\+|\\\\-|\\\\*|\\\\*\\\\*|\\\\/|\\\\/\\\\/|~|<|>|<=|=>|=|!=\"\n        }, {\n            token : \"paren.lparen\",\n            regex : \"[\\\\[\\\\(\\\\{]\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\]\\\\)\\\\}]\"\n        } ]\n    };\n    \n    this.normalizeRules();\n};\n\noop.inherits(ShHighlightRules, TextHighlightRules);\n\nexports.ShHighlightRules = ShHighlightRules;\n});\n\nace.define(\"ace/mode/makefile_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\",\"ace/mode/sh_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar ShHighlightFile = require(\"./sh_highlight_rules\");\n\nvar MakefileHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"keyword\": ShHighlightFile.reservedKeywords,\n        \"support.function.builtin\": ShHighlightFile.languageConstructs,\n        \"invalid.deprecated\": \"debugger\"\n    }, \"string\");\n\n    this.$rules = \n        {\n    \"start\": [\n        {\n            token: \"string.interpolated.backtick.makefile\",\n            regex: \"`\",\n            next: \"shell-start\"\n        },\n        {\n            token: \"punctuation.definition.comment.makefile\",\n            regex: /#(?=.)/,\n            next: \"comment\"\n        },\n        {\n            token: [ \"keyword.control.makefile\"],\n            regex: \"^(?:\\\\s*\\\\b)(\\\\-??include|ifeq|ifneq|ifdef|ifndef|else|endif|vpath|export|unexport|define|endef|override)(?:\\\\b)\"\n        },\n        {// ^([^\\t ]+(\\s[^\\t ]+)*:(?!\\=))\\s*.*\n            token: [\"entity.name.function.makefile\", \"text\"],\n            regex: \"^([^\\\\t ]+(?:\\\\s[^\\\\t ]+)*:)(\\\\s*.*)\"\n        }\n    ],\n    \"comment\": [\n        {\n            token : \"punctuation.definition.comment.makefile\",\n            regex : /.+\\\\/\n        },\n        {\n            token : \"punctuation.definition.comment.makefile\",\n            regex : \".+\",\n            next  : \"start\"\n        }\n    ],\n    \"shell-start\": [\n        {\n            token: keywordMapper,\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, \n        {\n            token: \"string\",\n            regex : \"\\\\w+\"\n        }, \n        {\n            token : \"string.interpolated.backtick.makefile\",\n            regex : \"`\",\n            next  : \"start\"\n        }\n    ]\n}\n\n};\n\noop.inherits(MakefileHighlightRules, TextHighlightRules);\n\nexports.MakefileHighlightRules = MakefileHighlightRules;\n});\n\nace.define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var range = this.indentationBlock(session, row);\n        if (range)\n            return range;\n\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1 || line[startLevel] != \"#\")\n            return;\n\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var level = line.search(re);\n\n            if (level == -1)\n                continue;\n\n            if (line[level] != \"#\")\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        var next = session.getLine(row + 1);\n        var prev = session.getLine(row - 1);\n        var prevIndent = prev.search(/\\S/);\n        var nextIndent = next.search(/\\S/);\n\n        if (indent == -1) {\n            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? \"start\" : \"\";\n            return \"\";\n        }\n        if (prevIndent == -1) {\n            if (indent == nextIndent && line[indent] == \"#\" && next[indent] == \"#\") {\n                session.foldWidgets[row - 1] = \"\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"start\";\n            }\n        } else if (prevIndent == indent && line[indent] == \"#\" && prev[indent] == \"#\") {\n            if (session.getLine(row - 2).search(/\\S/) == -1) {\n                session.foldWidgets[row - 1] = \"start\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"\";\n            }\n        }\n\n        if (prevIndent!= -1 && prevIndent < indent)\n            session.foldWidgets[row - 1] = \"start\";\n        else\n            session.foldWidgets[row - 1] = \"\";\n\n        if (indent < nextIndent)\n            return \"start\";\n        else\n            return \"\";\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/makefile\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/makefile_highlight_rules\",\"ace/mode/folding/coffee\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar MakefileHighlightRules = require(\"./makefile_highlight_rules\").MakefileHighlightRules;\nvar FoldMode = require(\"./folding/coffee\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = MakefileHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n       \n    this.lineCommentStart = \"#\";    \n    this.$indentWithTabs = true;\n    \n    this.$id = \"ace/mode/makefile\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-markdown.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"string.cdata.xml\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.xml-decl.xml\", \"keyword.xml-decl.xml\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_decl\", caseInsensitive: true\n            },\n            {\n                token : [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"processing_instruction\",\n            },\n            {token : \"comment.xml\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\", caseInsensitive: true\n            },\n            {include : \"tag\"},\n            {token : \"text.end-tag-open.xml\", regex: \"</\"},\n            {token : \"text.tag-open.xml\", regex: \"<\"},\n            {include : \"reference\"},\n            {defaultToken : \"text.xml\"}\n        ],\n\n        xml_decl : [{\n            token : \"entity.other.attribute-name.decl-attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.decl-attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"whitespace\"\n        }, {\n            include: \"string\"\n        }, {\n            token : \"punctuation.xml-decl.xml\",\n            regex : \"\\\\?>\",\n            next : \"start\"\n        }],\n\n        processing_instruction : [\n            {token : \"punctuation.instruction.xml\", regex : \"\\\\?>\", next : \"start\"},\n            {defaultToken : \"instruction.xml\"}\n        ],\n\n        doctype : [\n            {include : \"whitespace\"},\n            {include : \"string\"},\n            {token : \"xml-pe.doctype.xml\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe.xml\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.int-subset\", regex : \"\\\\[\", push : \"int_subset\"}\n        ],\n\n        int_subset : [{\n            token : \"text.xml\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.int-subset.xml\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.markup-decl.xml\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.cdata.xml\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text.xml\", regex : \"\\\\s+\"},\n            {token : \"text.xml\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment.xml\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment.xml\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape.reference.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        attr_reference : [{\n            token : \"constant.language.escape.reference.attribute-value.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n            regex : \"(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n            ]\n        }],\n\n        tag_whitespace : [\n            {token : \"text.tag-whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        whitespace : [\n            {token : \"text.whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        string: [{\n            token : \"string.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.xml\", regex: \"'\", next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }, {\n            token : \"string.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.xml\", regex: '\"', next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }],\n\n        attributes: [{\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"tag_whitespace\"\n        }, {\n            include: \"attribute_value\"\n        }],\n\n        attribute_value: [{\n            token : \"string.attribute-value.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }, {\n            token : \"string.attribute-value.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nvar XmlBehaviour = function () {\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selected = session.doc.getTextRange(editor.getSelectionRange());\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            }\n\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (rightChar == quote && (is(token, \"attribute-value\") || is(token, \"string\"))) {\n                return {\n                    text: \"\",\n                    selection: [1, 1]\n                };\n            }\n\n            if (!token)\n                token = iterator.stepBackward();\n\n            if (!token)\n                return;\n\n            while (is(token, \"tag-whitespace\") || is(token, \"whitespace\")) {\n                token = iterator.stepBackward();\n            }\n            var rightSpace = !rightChar || rightChar.match(/\\s/);\n            if (is(token, \"attribute-equals\") && (rightSpace || rightChar == '>') || (is(token, \"decl-attribute-equals\") && (rightSpace || rightChar == '?'))) {\n                return {\n                    text: quote + quote,\n                    selection: [1, 1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken() || iterator.stepBackward();\n            if (!token || !(is(token, \"tag-name\") || is(token, \"tag-whitespace\") || is(token, \"attribute-name\") || is(token, \"attribute-equals\") || is(token, \"attribute-value\")))\n                return;\n            if (is(token, \"reference.attribute-value\"))\n                return;\n            if (is(token, \"attribute-value\")) {\n                var firstChar = token.value.charAt(0);\n                if (firstChar == '\"' || firstChar == \"'\") {\n                    var lastChar = token.value.charAt(token.value.length - 1);\n                    var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length;\n                    if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar)\n                        return;\n                }\n            }\n            while (!is(token, \"tag-name\")) {\n                token = iterator.stepBackward();\n            }\n\n            var tokenRow = iterator.getCurrentTokenRow();\n            var tokenColumn = iterator.getCurrentTokenColumn();\n            if (is(iterator.stepBackward(), \"end-tag-open\"))\n                return;\n\n            var element = token.value;\n            if (tokenRow == position.row)\n                element = element.substring(0, position.column - tokenColumn);\n\n            if (this.voidElements.hasOwnProperty(element.toLowerCase()))\n                 return;\n\n            return {\n               text: \">\" + \"</\" + element + \">\",\n               selection: [1, 1]\n            };\n        }\n    });\n\n    this.add(\"autoindent\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.getLine(cursor.row);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (token && token.type.indexOf(\"tag-close\") !== -1) {\n                while (token && token.type.indexOf(\"tag-name\") === -1) {\n                    token = iterator.stepBackward();\n                }\n\n                if (!token) {\n                    return;\n                }\n\n                var tag = token.value;\n                var row = iterator.getCurrentTokenRow();\n                token = iterator.stepBackward();\n                if (!token || token.type.indexOf(\"end-tag\") !== -1) {\n                    return;\n                }\n\n                if (this.voidElements && !this.voidElements[tag]) {\n                    var nextToken = session.getTokenAt(cursor.row, cursor.column+1);\n                    var line = session.getLine(row);\n                    var nextIndent = this.$getIndent(line);\n                    var indent = nextIndent + session.getTabString();\n\n                    if (nextToken && nextToken.value === \"</\") {\n                        return {\n                            text: \"\\n\" + indent + \"\\n\" + nextIndent,\n                            selection: [1, indent.length, 1, indent.length]\n                        };\n                    } else {\n                        return {\n                            text: \"\\n\" + indent\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n};\n\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\nace.define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalEndTags) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n    this.optionalEndTags = oop.mixin({}, this.voidElements);\n    if (optionalEndTags)\n        oop.mixin(this.optionalEndTags, optionalEndTags);\n    \n};\noop.inherits(FoldMode, BaseFoldMode);\n\nvar Tag = function() {\n    this.tagName = \"\";\n    this.closing = false;\n    this.selfClosing = false;\n    this.start = {row: 0, column: 0};\n    this.end = {row: 0, column: 0};\n};\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (!tag)\n            return \"\";\n\n        if (tag.closing || (!tag.tagName && tag.selfClosing))\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase()))\n            return \"\";\n\n        if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column))\n            return \"\";\n\n        return \"start\";\n    };\n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var tag = new Tag();\n\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (is(token, \"tag-open\")) {\n                tag.end.column = tag.start.column + token.value.length;\n                tag.closing = is(token, \"end-tag-open\");\n                token = tokens[++i];\n                if (!token)\n                    return null;\n                tag.tagName = token.value;\n                tag.end.column += token.value.length;\n                for (i++; i < tokens.length; i++) {\n                    token = tokens[i];\n                    tag.end.column += token.value.length;\n                    if (is(token, \"tag-close\")) {\n                        tag.selfClosing = token.value == '/>';\n                        break;\n                    }\n                }\n                return tag;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == '/>';\n                return tag;\n            }\n            tag.start.column += token.value.length;\n        }\n\n        return null;\n    };\n\n    this._findEndTagInLine = function(session, row, tagName, startColumn) {\n        var tokens = session.getTokens(row);\n        var column = 0;\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            column += token.value.length;\n            if (column < startColumn)\n                continue;\n            if (is(token, \"end-tag-open\")) {\n                token = tokens[i + 1];\n                if (token && token.value == tagName)\n                    return true;\n            }\n        }\n        return false;\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n                iterator.stepForward();\n                return tag;\n            }\n        } while(token = iterator.stepForward());\n\n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n                iterator.stepBackward();\n                return tag;\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n            }\n        } while(token = iterator.stepBackward());\n\n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.optionalEndTags.hasOwnProperty(top.tagName)) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.start.column);\n            var start = {\n                row: row,\n                column: firstTag.start.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.end.column);\n            var end = {\n                row: row,\n                column: firstTag.start.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/xml_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/xml\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextMode = require(\"./text\").Mode;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar XmlFoldMode = require(\"./folding/xml\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = XmlHighlightRules;\n    this.$behaviour = new XmlBehaviour();\n    this.foldingRules = new XmlFoldMode();\n};\n\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.voidElements = lang.arrayToMap([]);\n\n    this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n    this.$id = \"ace/mode/xml\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\nace.define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar CssBehaviour = function () {\n\n    this.inherit(CstyleBehaviour);\n\n    this.add(\"colon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(cursor.row);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                if (rightChar === ':') {\n                    return {\n                       text: '',\n                       selection: [1, 1]\n                    }\n                }\n                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n                    return {\n                       text: ':;',\n                       selection: [1, 1]\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"colon\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(range.start.row);\n                var rightChar = line.substring(range.end.column, range.end.column + 1);\n                if (rightChar === ';') {\n                    range.end.column ++;\n                    return range;\n                }\n            }\n        }\n    });\n\n    this.add(\"semicolon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ';') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === ';') {\n                return {\n                   text: '',\n                   selection: [1, 1]\n                }\n            }\n        }\n    });\n\n}\noop.inherits(CssBehaviour, CstyleBehaviour);\n\nexports.CssBehaviour = CssBehaviour;\n});\n\nace.define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CssBehaviour = require(\"./behaviour/css\").CssBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = CssHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CssBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"csslint\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/css\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\nace.define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    option      : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.addRules({\n        attributes: [{\n            include : \"tag_whitespace\"\n        }, {\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\",\n            push : [{\n                include: \"tag_whitespace\"\n            }, {\n                token : \"string.unquoted.attribute-value.html\",\n                regex : \"[^<>='\\\"`\\\\s]+\",\n                next : \"pop\"\n            }, {\n                token : \"empty\",\n                regex : \"\",\n                next : \"pop\"\n            }]\n        }, {\n            include : \"attribute_value\"\n        }],\n        tag: [{\n            token : function(start, tag) {\n                var group = tagMap[tag];\n                return [\"meta.tag.punctuation.\" + (start == \"<\" ? \"\" : \"end-\") + \"tag-open.xml\",\n                    \"meta.tag\" + (group ? \".\" + group : \"\") + \".tag-name.xml\"];\n            },\n            regex : \"(</?)([-_a-zA-Z0-9:]+)\",\n            next: \"tag_stuff\"\n        }],\n        tag_stuff: [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n        ],\n    });\n\n    this.embedTagRules(CssHighlightRules, \"css-\", \"style\");\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    if (this.constructor === HtmlHighlightRules)\n        this.normalizeRules();\n};\n\noop.inherits(HtmlHighlightRules, XmlHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\nace.define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n    this.defaultMode = defaultMode;\n    this.subModes = subModes;\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n\n    this.$getMode = function(state) {\n        if (typeof state != \"string\") \n            state = state[0];\n        for (var key in this.subModes) {\n            if (state.indexOf(key) === 0)\n                return this.subModes[key];\n        }\n        return null;\n    };\n    \n    this.$tryMode = function(state, session, foldStyle, row) {\n        var mode = this.$getMode(state);\n        return (mode ? mode.getFoldWidget(session, foldStyle, row) : \"\");\n    };\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        return (\n            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n            this.defaultMode.getFoldWidget(session, foldStyle, row)\n        );\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var mode = this.$getMode(session.getState(row-1));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.$getMode(session.getState(row));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.defaultMode;\n        \n        return mode.getFoldWidgetRange(session, foldStyle, row);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar MixedFoldMode = require(\"./mixed\").FoldMode;\nvar XmlFoldMode = require(\"./xml\").FoldMode;\nvar CStyleFoldMode = require(\"./cstyle\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalTags) {\n    MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), {\n        \"js-\": new CStyleFoldMode(),\n        \"css-\": new CStyleFoldMode()\n    });\n};\n\noop.inherits(FoldMode, MixedFoldMode);\n\n});\n\nace.define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\n\nvar commonAttributes = [\n    \"accesskey\",\n    \"class\",\n    \"contenteditable\",\n    \"contextmenu\",\n    \"dir\",\n    \"draggable\",\n    \"dropzone\",\n    \"hidden\",\n    \"id\",\n    \"inert\",\n    \"itemid\",\n    \"itemprop\",\n    \"itemref\",\n    \"itemscope\",\n    \"itemtype\",\n    \"lang\",\n    \"spellcheck\",\n    \"style\",\n    \"tabindex\",\n    \"title\",\n    \"translate\"\n];\n\nvar eventAttributes = [\n    \"onabort\",\n    \"onblur\",\n    \"oncancel\",\n    \"oncanplay\",\n    \"oncanplaythrough\",\n    \"onchange\",\n    \"onclick\",\n    \"onclose\",\n    \"oncontextmenu\",\n    \"oncuechange\",\n    \"ondblclick\",\n    \"ondrag\",\n    \"ondragend\",\n    \"ondragenter\",\n    \"ondragleave\",\n    \"ondragover\",\n    \"ondragstart\",\n    \"ondrop\",\n    \"ondurationchange\",\n    \"onemptied\",\n    \"onended\",\n    \"onerror\",\n    \"onfocus\",\n    \"oninput\",\n    \"oninvalid\",\n    \"onkeydown\",\n    \"onkeypress\",\n    \"onkeyup\",\n    \"onload\",\n    \"onloadeddata\",\n    \"onloadedmetadata\",\n    \"onloadstart\",\n    \"onmousedown\",\n    \"onmousemove\",\n    \"onmouseout\",\n    \"onmouseover\",\n    \"onmouseup\",\n    \"onmousewheel\",\n    \"onpause\",\n    \"onplay\",\n    \"onplaying\",\n    \"onprogress\",\n    \"onratechange\",\n    \"onreset\",\n    \"onscroll\",\n    \"onseeked\",\n    \"onseeking\",\n    \"onselect\",\n    \"onshow\",\n    \"onstalled\",\n    \"onsubmit\",\n    \"onsuspend\",\n    \"ontimeupdate\",\n    \"onvolumechange\",\n    \"onwaiting\"\n];\n\nvar globalAttributes = commonAttributes.concat(eventAttributes);\n\nvar attributeMap = {\n    \"html\": [\"manifest\"],\n    \"head\": [],\n    \"title\": [],\n    \"base\": [\"href\", \"target\"],\n    \"link\": [\"href\", \"hreflang\", \"rel\", \"media\", \"type\", \"sizes\"],\n    \"meta\": [\"http-equiv\", \"name\", \"content\", \"charset\"],\n    \"style\": [\"type\", \"media\", \"scoped\"],\n    \"script\": [\"charset\", \"type\", \"src\", \"defer\", \"async\"],\n    \"noscript\": [\"href\"],\n    \"body\": [\"onafterprint\", \"onbeforeprint\", \"onbeforeunload\", \"onhashchange\", \"onmessage\", \"onoffline\", \"onpopstate\", \"onredo\", \"onresize\", \"onstorage\", \"onundo\", \"onunload\"],\n    \"section\": [],\n    \"nav\": [],\n    \"article\": [\"pubdate\"],\n    \"aside\": [],\n    \"h1\": [],\n    \"h2\": [],\n    \"h3\": [],\n    \"h4\": [],\n    \"h5\": [],\n    \"h6\": [],\n    \"header\": [],\n    \"footer\": [],\n    \"address\": [],\n    \"main\": [],\n    \"p\": [],\n    \"hr\": [],\n    \"pre\": [],\n    \"blockquote\": [\"cite\"],\n    \"ol\": [\"start\", \"reversed\"],\n    \"ul\": [],\n    \"li\": [\"value\"],\n    \"dl\": [],\n    \"dt\": [],\n    \"dd\": [],\n    \"figure\": [],\n    \"figcaption\": [],\n    \"div\": [],\n    \"a\": [\"href\", \"target\", \"ping\", \"rel\", \"media\", \"hreflang\", \"type\"],\n    \"em\": [],\n    \"strong\": [],\n    \"small\": [],\n    \"s\": [],\n    \"cite\": [],\n    \"q\": [\"cite\"],\n    \"dfn\": [],\n    \"abbr\": [],\n    \"data\": [],\n    \"time\": [\"datetime\"],\n    \"code\": [],\n    \"var\": [],\n    \"samp\": [],\n    \"kbd\": [],\n    \"sub\": [],\n    \"sup\": [],\n    \"i\": [],\n    \"b\": [],\n    \"u\": [],\n    \"mark\": [],\n    \"ruby\": [],\n    \"rt\": [],\n    \"rp\": [],\n    \"bdi\": [],\n    \"bdo\": [],\n    \"span\": [],\n    \"br\": [],\n    \"wbr\": [],\n    \"ins\": [\"cite\", \"datetime\"],\n    \"del\": [\"cite\", \"datetime\"],\n    \"img\": [\"alt\", \"src\", \"height\", \"width\", \"usemap\", \"ismap\"],\n    \"iframe\": [\"name\", \"src\", \"height\", \"width\", \"sandbox\", \"seamless\"],\n    \"embed\": [\"src\", \"height\", \"width\", \"type\"],\n    \"object\": [\"param\", \"data\", \"type\", \"height\" , \"width\", \"usemap\", \"name\", \"form\", \"classid\"],\n    \"param\": [\"name\", \"value\"],\n    \"video\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\", \"width\", \"height\", \"poster\"],\n    \"audio\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\"],\n    \"source\": [\"src\", \"type\", \"media\"],\n    \"track\": [\"kind\", \"src\", \"srclang\", \"label\", \"default\"],\n    \"canvas\": [\"width\", \"height\"],\n    \"map\": [\"name\"],\n    \"area\": [\"shape\", \"coords\", \"href\", \"hreflang\", \"alt\", \"target\", \"media\", \"rel\", \"ping\", \"type\"],\n    \"svg\": [],\n    \"math\": [],\n    \"table\": [\"summary\"],\n    \"caption\": [],\n    \"colgroup\": [\"span\"],\n    \"col\": [\"span\"],\n    \"tbody\": [],\n    \"thead\": [],\n    \"tfoot\": [],\n    \"tr\": [],\n    \"td\": [\"headers\", \"rowspan\", \"colspan\"],\n    \"th\": [\"headers\", \"rowspan\", \"colspan\", \"scope\"],\n    \"form\": [\"accept-charset\", \"action\", \"autocomplete\", \"enctype\", \"method\", \"name\", \"novalidate\", \"target\"],\n    \"fieldset\": [\"disabled\", \"form\", \"name\"],\n    \"legend\": [],\n    \"label\": [\"form\", \"for\"],\n    \"input\": [\"type\", \"accept\", \"alt\", \"autocomplete\", \"checked\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"height\", \"list\", \"max\", \"maxlength\", \"min\", \"multiple\", \"pattern\", \"placeholder\", \"readonly\", \"required\", \"size\", \"src\", \"step\", \"width\", \"files\", \"value\"],\n    \"button\": [\"autofocus\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"name\", \"value\", \"type\"],\n    \"select\": [\"autofocus\", \"disabled\", \"form\", \"multiple\", \"name\", \"size\"],\n    \"datalist\": [],\n    \"optgroup\": [\"disabled\", \"label\"],\n    \"option\": [\"disabled\", \"selected\", \"label\", \"value\"],\n    \"textarea\": [\"autofocus\", \"disabled\", \"form\", \"maxlength\", \"name\", \"placeholder\", \"readonly\", \"required\", \"rows\", \"cols\", \"wrap\"],\n    \"keygen\": [\"autofocus\", \"challenge\", \"disabled\", \"form\", \"keytype\", \"name\"],\n    \"output\": [\"for\", \"form\", \"name\"],\n    \"progress\": [\"value\", \"max\"],\n    \"meter\": [\"value\", \"min\", \"max\", \"low\", \"high\", \"optimum\"],\n    \"details\": [\"open\"],\n    \"summary\": [],\n    \"command\": [\"type\", \"label\", \"icon\", \"disabled\", \"checked\", \"radiogroup\", \"command\"],\n    \"menu\": [\"type\", \"label\"],\n    \"dialog\": [\"open\"]\n};\n\nvar elements = Object.keys(attributeMap);\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nfunction findTagName(session, pos) {\n    var iterator = new TokenIterator(session, pos.row, pos.column);\n    var token = iterator.getCurrentToken();\n    while (token && !is(token, \"tag-name\")){\n        token = iterator.stepBackward();\n    }\n    if (token)\n        return token.value;\n}\n\nvar HtmlCompletions = function() {\n\n};\n\n(function() {\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        var token = session.getTokenAt(pos.row, pos.column);\n\n        if (!token)\n            return [];\n        if (is(token, \"tag-name\") || is(token, \"tag-open\") || is(token, \"end-tag-open\"))\n            return this.getTagCompletions(state, session, pos, prefix);\n        if (is(token, \"tag-whitespace\") || is(token, \"attribute-name\"))\n            return this.getAttributeCompetions(state, session, pos, prefix);\n\n        return [];\n    };\n\n    this.getTagCompletions = function(state, session, pos, prefix) {\n        return elements.map(function(element){\n            return {\n                value: element,\n                meta: \"tag\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n    this.getAttributeCompetions = function(state, session, pos, prefix) {\n        var tagName = findTagName(session, pos);\n        if (!tagName)\n            return [];\n        var attributes = globalAttributes;\n        if (tagName in attributeMap) {\n            attributes = attributes.concat(attributeMap[tagName]);\n        }\n        return attributes.map(function(attribute){\n            return {\n                caption: attribute,\n                snippet: attribute + '=\"$0\"',\n                meta: \"attribute\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n}).call(HtmlCompletions.prototype);\n\nexports.HtmlCompletions = HtmlCompletions;\n});\n\nace.define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar HtmlFoldMode = require(\"./folding/html\").FoldMode;\nvar HtmlCompletions = require(\"./html_completions\").HtmlCompletions;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar voidElements = [\"area\", \"base\", \"br\", \"col\", \"embed\", \"hr\", \"img\", \"input\", \"keygen\", \"link\", \"meta\", \"menuitem\", \"param\", \"source\", \"track\", \"wbr\"];\nvar optionalEndTags = [\"li\", \"dt\", \"dd\", \"p\", \"rt\", \"rp\", \"optgroup\", \"option\", \"colgroup\", \"td\", \"th\"];\n\nvar Mode = function(options) {\n    this.fragmentContext = options && options.fragmentContext;\n    this.HighlightRules = HtmlHighlightRules;\n    this.$behaviour = new XmlBehaviour();\n    this.$completer = new HtmlCompletions();\n    \n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"css-\": CssMode\n    });\n    \n    this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags));\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n    this.voidElements = lang.arrayToMap(voidElements);\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        return this.$completer.getCompletions(state, session, pos, prefix);\n    };\n\n    this.createWorker = function(session) {\n        if (this.constructor != Mode)\n            return;\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/html_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        if (this.fragmentContext)\n            worker.call(\"setOptions\", [{context: this.fragmentContext}]);\n\n        worker.on(\"error\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/html\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/markdown_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\",\"ace/mode/html_highlight_rules\",\"ace/mode/css_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\n\nvar escaped = function(ch) {\n    return \"(?:[^\" + lang.escapeRegExp(ch) + \"\\\\\\\\]|\\\\\\\\.)*\";\n}\n\nfunction github_embed(tag, prefix) {\n    return { // Github style block\n        token : \"support.function\",\n        regex : \"^\\\\s*```\" + tag + \"\\\\s*$\",\n        push  : prefix + \"start\"\n    };\n}\n\nvar MarkdownHighlightRules = function() {\n    HtmlHighlightRules.call(this);\n\n    this.$rules[\"start\"].unshift({\n        token : \"empty_line\",\n        regex : '^$',\n        next: \"allowBlock\"\n    }, { // h1\n        token: \"markup.heading.1\",\n        regex: \"^=+(?=\\\\s*$)\"\n    }, { // h2\n        token: \"markup.heading.2\",\n        regex: \"^\\\\-+(?=\\\\s*$)\"\n    }, {\n        token : function(value) {\n            return \"markup.heading.\" + value.length;\n        },\n        regex : /^#{1,6}(?=\\s*[^ #]|\\s+#.)/,\n        next : \"header\"\n    },\n       github_embed(\"(?:javascript|js)\", \"jscode-\"),\n       github_embed(\"xml\", \"xmlcode-\"),\n       github_embed(\"html\", \"htmlcode-\"),\n       github_embed(\"css\", \"csscode-\"),\n    { // Github style block\n        token : \"support.function\",\n        regex : \"^\\\\s*```\\\\s*\\\\S*(?:{.*?\\\\})?\\\\s*$\",\n        next  : \"githubblock\"\n    }, { // block quote\n        token : \"string.blockquote\",\n        regex : \"^\\\\s*>\\\\s*(?:[*+-]|\\\\d+\\\\.)?\\\\s+\",\n        next  : \"blockquote\"\n    }, { // HR * - _\n        token : \"constant\",\n        regex : \"^ {0,2}(?:(?: ?\\\\* ?){3,}|(?: ?\\\\- ?){3,}|(?: ?\\\\_ ?){3,})\\\\s*$\",\n        next: \"allowBlock\"\n    }, { // list\n        token : \"markup.list\",\n        regex : \"^\\\\s{0,3}(?:[*+-]|\\\\d+\\\\.)\\\\s+\",\n        next  : \"listblock-start\"\n    }, {\n        include : \"basic\"\n    });\n\n    this.addRules({\n        \"basic\" : [{\n            token : \"constant.language.escape\",\n            regex : /\\\\[\\\\`*_{}\\[\\]()#+\\-.!]/\n        }, { // code span `\n            token : \"support.function\",\n            regex : \"(`+)(.*?[^`])(\\\\1)\"\n        }, { // reference\n            token : [\"text\", \"constant\", \"text\", \"url\", \"string\", \"text\"],\n            regex : \"^([ ]{0,3}\\\\[)([^\\\\]]+)(\\\\]:\\\\s*)([^ ]+)(\\\\s*(?:[\\\"][^\\\"]+[\\\"])?(\\\\s*))$\"\n        }, { // link by reference\n            token : [\"text\", \"string\", \"text\", \"constant\", \"text\"],\n            regex : \"(\\\\[)(\" + escaped(\"]\") + \")(\\\\]\\s*\\\\[)(\"+ escaped(\"]\") + \")(\\\\])\"\n        }, { // link by url\n            token : [\"text\", \"string\", \"text\", \"markup.underline\", \"string\", \"text\"],\n            regex : \"(\\\\[)(\" +                                        // [\n                    escaped(\"]\") +                                    // link text\n                    \")(\\\\]\\\\()\"+                                      // ](\n                    '((?:[^\\\\)\\\\s\\\\\\\\]|\\\\\\\\.|\\\\s(?=[^\"]))*)' +        // href\n                    '(\\\\s*\"' +  escaped('\"') + '\"\\\\s*)?' +            // \"title\"\n                    \"(\\\\))\"                                           // )\n        }, { // strong ** __\n            token : \"string.strong\",\n            regex : \"([*]{2}|[_]{2}(?=\\\\S))(.*?\\\\S[*_]*)(\\\\1)\"\n        }, { // emphasis * _\n            token : \"string.emphasis\",\n            regex : \"([*]|[_](?=\\\\S))(.*?\\\\S[*_]*)(\\\\1)\"\n        }, { //\n            token : [\"text\", \"url\", \"text\"],\n            regex : \"(<)(\"+\n                      \"(?:https?|ftp|dict):[^'\\\">\\\\s]+\"+\n                      \"|\"+\n                      \"(?:mailto:)?[-.\\\\w]+\\\\@[-a-z0-9]+(?:\\\\.[-a-z0-9]+)*\\\\.[a-z]+\"+\n                    \")(>)\"\n        }],\n        \"allowBlock\": [\n            {token : \"support.function\", regex : \"^ {4}.+\", next : \"allowBlock\"},\n            {token : \"empty\", regex : \"\", next : \"start\"}\n        ],\n\n        \"header\" : [{\n            regex: \"$\",\n            next : \"start\"\n        }, {\n            include: \"basic\"\n        }, {\n            defaultToken : \"heading\"\n        } ],\n\n        \"listblock-start\" : [{\n            token : \"support.variable\",\n            regex : /(?:\\[[ x]\\])?/,\n            next  : \"listblock\"\n        }],\n\n        \"listblock\" : [ { // Lists only escape on completely blank lines.\n            token : \"empty_line\",\n            regex : \"^$\",\n            next  : \"start\"\n        }, { // list\n            token : \"markup.list\",\n            regex : \"^\\\\s{0,3}(?:[*+-]|\\\\d+\\\\.)\\\\s+\",\n            next  : \"listblock-start\"\n        }, {\n            include : \"basic\", noEscape: true\n        }, { // Github style block\n            token : \"support.function\",\n            regex : \"^\\\\s*```\\\\s*[a-zA-Z]*(?:{.*?\\\\})?\\\\s*$\",\n            next  : \"githubblock\"\n        }, {\n            defaultToken : \"list\" //do not use markup.list to allow stling leading `*` differntly\n        } ],\n\n        \"blockquote\" : [ { // Blockquotes only escape on blank lines.\n            token : \"empty_line\",\n            regex : \"^\\\\s*$\",\n            next  : \"start\"\n        }, { // block quote\n            token : \"string.blockquote\",\n            regex : \"^\\\\s*>\\\\s*(?:[*+-]|\\\\d+\\\\.)?\\\\s+\",\n            next  : \"blockquote\"\n        }, {\n            include : \"basic\", noEscape: true\n        }, {\n            defaultToken : \"string.blockquote\"\n        } ],\n\n        \"githubblock\" : [ {\n            token : \"support.function\",\n            regex : \"^\\\\s*```\",\n            next  : \"start\"\n        }, {\n            token : \"support.function\",\n            regex : \".+\"\n        } ]\n    });\n\n    this.embedRules(JavaScriptHighlightRules, \"jscode-\", [{\n       token : \"support.function\",\n       regex : \"^\\\\s*```\",\n       next  : \"pop\"\n    }]);\n\n    this.embedRules(HtmlHighlightRules, \"htmlcode-\", [{\n       token : \"support.function\",\n       regex : \"^\\\\s*```\",\n       next  : \"pop\"\n    }]);\n\n    this.embedRules(CssHighlightRules, \"csscode-\", [{\n       token : \"support.function\",\n       regex : \"^\\\\s*```\",\n       next  : \"pop\"\n    }]);\n\n    this.embedRules(XmlHighlightRules, \"xmlcode-\", [{\n       token : \"support.function\",\n       regex : \"^\\\\s*```\",\n       next  : \"pop\"\n    }]);\n\n    this.normalizeRules();\n};\noop.inherits(MarkdownHighlightRules, TextHighlightRules);\n\nexports.MarkdownHighlightRules = MarkdownHighlightRules;\n});\n\nace.define(\"ace/mode/folding/markdown\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    this.foldingStartMarker = /^(?:[=-]+\\s*$|#{1,6} |`{3})/;\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        if (!this.foldingStartMarker.test(line))\n            return \"\";\n\n        if (line[0] == \"`\") {\n            if (session.bgTokenizer.getState(row) == \"start\")\n                return \"end\";\n            return \"start\";\n        }\n\n        return \"start\";\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n        if (!line.match(this.foldingStartMarker))\n            return;\n\n        if (line[0] == \"`\") {\n            if (session.bgTokenizer.getState(row) !== \"start\") {\n                while (++row < maxRow) {\n                    line = session.getLine(row);\n                    if (line[0] == \"`\" & line.substring(0, 3) == \"```\")\n                        break;\n                }\n                return new Range(startRow, startColumn, row, 0);\n            } else {\n                while (row -- > 0) {\n                    line = session.getLine(row);\n                    if (line[0] == \"`\" & line.substring(0, 3) == \"```\")\n                        break;\n                }\n                return new Range(row, line.length, startRow, 0);\n            }\n        }\n\n        var token;\n        function isHeading(row) {\n            token = session.getTokens(row)[0];\n            return token && token.type.lastIndexOf(heading, 0) === 0;\n        }\n\n        var heading = \"markup.heading\";\n        function getLevel() {\n            var ch = token.value[0];\n            if (ch == \"=\") return 6;\n            if (ch == \"-\") return 5;\n            return 7 - token.value.search(/[^#]/);\n        }\n\n        if (isHeading(row)) {\n            var startHeadingLevel = getLevel();\n            while (++row < maxRow) {\n                if (!isHeading(row))\n                    continue;\n                var level = getLevel();\n                if (level >= startHeadingLevel)\n                    break;\n            }\n\n            endRow = row - (!token || [\"=\", \"-\"].indexOf(token.value[0]) == -1 ? 1 : 2);\n\n            if (endRow > startRow) {\n                while (endRow > startRow && /^\\s*$/.test(session.getLine(endRow)))\n                    endRow--;\n            }\n\n            if (endRow > startRow) {\n                var endColumn = session.getLine(endRow).length;\n                return new Range(startRow, startColumn, endRow, endColumn);\n            }\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/markdown\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/xml\",\"ace/mode/html\",\"ace/mode/markdown_highlight_rules\",\"ace/mode/folding/markdown\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar XmlMode = require(\"./xml\").Mode;\nvar HtmlMode = require(\"./html\").Mode;\nvar MarkdownHighlightRules = require(\"./markdown_highlight_rules\").MarkdownHighlightRules;\nvar MarkdownFoldMode = require(\"./folding/markdown\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = MarkdownHighlightRules;\n\n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"xml-\": XmlMode,\n        \"html-\": HtmlMode\n    });\n\n    this.foldingRules = new MarkdownFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.type = \"text\";\n    this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        if (state == \"listblock\") {\n            var match = /^(\\s*)(?:([-+*])|(\\d+)\\.)(\\s+)/.exec(line);\n            if (!match)\n                return \"\";\n            var marker = match[2];\n            if (!marker)\n                marker = parseInt(match[3], 10) + 1 + \".\";\n            return match[1] + marker + match[4];\n        } else {\n            return this.$getIndent(line);\n        }\n    };\n    this.$id = \"ace/mode/markdown\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-mask.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\nace.define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"string.cdata.xml\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.xml-decl.xml\", \"keyword.xml-decl.xml\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_decl\", caseInsensitive: true\n            },\n            {\n                token : [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"processing_instruction\",\n            },\n            {token : \"comment.xml\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\", caseInsensitive: true\n            },\n            {include : \"tag\"},\n            {token : \"text.end-tag-open.xml\", regex: \"</\"},\n            {token : \"text.tag-open.xml\", regex: \"<\"},\n            {include : \"reference\"},\n            {defaultToken : \"text.xml\"}\n        ],\n\n        xml_decl : [{\n            token : \"entity.other.attribute-name.decl-attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.decl-attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"whitespace\"\n        }, {\n            include: \"string\"\n        }, {\n            token : \"punctuation.xml-decl.xml\",\n            regex : \"\\\\?>\",\n            next : \"start\"\n        }],\n\n        processing_instruction : [\n            {token : \"punctuation.instruction.xml\", regex : \"\\\\?>\", next : \"start\"},\n            {defaultToken : \"instruction.xml\"}\n        ],\n\n        doctype : [\n            {include : \"whitespace\"},\n            {include : \"string\"},\n            {token : \"xml-pe.doctype.xml\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe.xml\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.int-subset\", regex : \"\\\\[\", push : \"int_subset\"}\n        ],\n\n        int_subset : [{\n            token : \"text.xml\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.int-subset.xml\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.markup-decl.xml\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.cdata.xml\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text.xml\", regex : \"\\\\s+\"},\n            {token : \"text.xml\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment.xml\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment.xml\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape.reference.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        attr_reference : [{\n            token : \"constant.language.escape.reference.attribute-value.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n            regex : \"(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n            ]\n        }],\n\n        tag_whitespace : [\n            {token : \"text.tag-whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        whitespace : [\n            {token : \"text.whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        string: [{\n            token : \"string.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.xml\", regex: \"'\", next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }, {\n            token : \"string.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.xml\", regex: '\"', next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }],\n\n        attributes: [{\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"tag_whitespace\"\n        }, {\n            include: \"attribute_value\"\n        }],\n\n        attribute_value: [{\n            token : \"string.attribute-value.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }, {\n            token : \"string.attribute-value.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\nace.define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    option      : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.addRules({\n        attributes: [{\n            include : \"tag_whitespace\"\n        }, {\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\",\n            push : [{\n                include: \"tag_whitespace\"\n            }, {\n                token : \"string.unquoted.attribute-value.html\",\n                regex : \"[^<>='\\\"`\\\\s]+\",\n                next : \"pop\"\n            }, {\n                token : \"empty\",\n                regex : \"\",\n                next : \"pop\"\n            }]\n        }, {\n            include : \"attribute_value\"\n        }],\n        tag: [{\n            token : function(start, tag) {\n                var group = tagMap[tag];\n                return [\"meta.tag.punctuation.\" + (start == \"<\" ? \"\" : \"end-\") + \"tag-open.xml\",\n                    \"meta.tag\" + (group ? \".\" + group : \"\") + \".tag-name.xml\"];\n            },\n            regex : \"(</?)([-_a-zA-Z0-9:]+)\",\n            next: \"tag_stuff\"\n        }],\n        tag_stuff: [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n        ],\n    });\n\n    this.embedTagRules(CssHighlightRules, \"css-\", \"style\");\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    if (this.constructor === HtmlHighlightRules)\n        this.normalizeRules();\n};\n\noop.inherits(HtmlHighlightRules, XmlHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\nace.define(\"ace/mode/markdown_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\",\"ace/mode/html_highlight_rules\",\"ace/mode/css_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\n\nvar escaped = function(ch) {\n    return \"(?:[^\" + lang.escapeRegExp(ch) + \"\\\\\\\\]|\\\\\\\\.)*\";\n}\n\nfunction github_embed(tag, prefix) {\n    return { // Github style block\n        token : \"support.function\",\n        regex : \"^\\\\s*```\" + tag + \"\\\\s*$\",\n        push  : prefix + \"start\"\n    };\n}\n\nvar MarkdownHighlightRules = function() {\n    HtmlHighlightRules.call(this);\n\n    this.$rules[\"start\"].unshift({\n        token : \"empty_line\",\n        regex : '^$',\n        next: \"allowBlock\"\n    }, { // h1\n        token: \"markup.heading.1\",\n        regex: \"^=+(?=\\\\s*$)\"\n    }, { // h2\n        token: \"markup.heading.2\",\n        regex: \"^\\\\-+(?=\\\\s*$)\"\n    }, {\n        token : function(value) {\n            return \"markup.heading.\" + value.length;\n        },\n        regex : /^#{1,6}(?=\\s*[^ #]|\\s+#.)/,\n        next : \"header\"\n    },\n       github_embed(\"(?:javascript|js)\", \"jscode-\"),\n       github_embed(\"xml\", \"xmlcode-\"),\n       github_embed(\"html\", \"htmlcode-\"),\n       github_embed(\"css\", \"csscode-\"),\n    { // Github style block\n        token : \"support.function\",\n        regex : \"^\\\\s*```\\\\s*\\\\S*(?:{.*?\\\\})?\\\\s*$\",\n        next  : \"githubblock\"\n    }, { // block quote\n        token : \"string.blockquote\",\n        regex : \"^\\\\s*>\\\\s*(?:[*+-]|\\\\d+\\\\.)?\\\\s+\",\n        next  : \"blockquote\"\n    }, { // HR * - _\n        token : \"constant\",\n        regex : \"^ {0,2}(?:(?: ?\\\\* ?){3,}|(?: ?\\\\- ?){3,}|(?: ?\\\\_ ?){3,})\\\\s*$\",\n        next: \"allowBlock\"\n    }, { // list\n        token : \"markup.list\",\n        regex : \"^\\\\s{0,3}(?:[*+-]|\\\\d+\\\\.)\\\\s+\",\n        next  : \"listblock-start\"\n    }, {\n        include : \"basic\"\n    });\n\n    this.addRules({\n        \"basic\" : [{\n            token : \"constant.language.escape\",\n            regex : /\\\\[\\\\`*_{}\\[\\]()#+\\-.!]/\n        }, { // code span `\n            token : \"support.function\",\n            regex : \"(`+)(.*?[^`])(\\\\1)\"\n        }, { // reference\n            token : [\"text\", \"constant\", \"text\", \"url\", \"string\", \"text\"],\n            regex : \"^([ ]{0,3}\\\\[)([^\\\\]]+)(\\\\]:\\\\s*)([^ ]+)(\\\\s*(?:[\\\"][^\\\"]+[\\\"])?(\\\\s*))$\"\n        }, { // link by reference\n            token : [\"text\", \"string\", \"text\", \"constant\", \"text\"],\n            regex : \"(\\\\[)(\" + escaped(\"]\") + \")(\\\\]\\s*\\\\[)(\"+ escaped(\"]\") + \")(\\\\])\"\n        }, { // link by url\n            token : [\"text\", \"string\", \"text\", \"markup.underline\", \"string\", \"text\"],\n            regex : \"(\\\\[)(\" +                                        // [\n                    escaped(\"]\") +                                    // link text\n                    \")(\\\\]\\\\()\"+                                      // ](\n                    '((?:[^\\\\)\\\\s\\\\\\\\]|\\\\\\\\.|\\\\s(?=[^\"]))*)' +        // href\n                    '(\\\\s*\"' +  escaped('\"') + '\"\\\\s*)?' +            // \"title\"\n                    \"(\\\\))\"                                           // )\n        }, { // strong ** __\n            token : \"string.strong\",\n            regex : \"([*]{2}|[_]{2}(?=\\\\S))(.*?\\\\S[*_]*)(\\\\1)\"\n        }, { // emphasis * _\n            token : \"string.emphasis\",\n            regex : \"([*]|[_](?=\\\\S))(.*?\\\\S[*_]*)(\\\\1)\"\n        }, { //\n            token : [\"text\", \"url\", \"text\"],\n            regex : \"(<)(\"+\n                      \"(?:https?|ftp|dict):[^'\\\">\\\\s]+\"+\n                      \"|\"+\n                      \"(?:mailto:)?[-.\\\\w]+\\\\@[-a-z0-9]+(?:\\\\.[-a-z0-9]+)*\\\\.[a-z]+\"+\n                    \")(>)\"\n        }],\n        \"allowBlock\": [\n            {token : \"support.function\", regex : \"^ {4}.+\", next : \"allowBlock\"},\n            {token : \"empty\", regex : \"\", next : \"start\"}\n        ],\n\n        \"header\" : [{\n            regex: \"$\",\n            next : \"start\"\n        }, {\n            include: \"basic\"\n        }, {\n            defaultToken : \"heading\"\n        } ],\n\n        \"listblock-start\" : [{\n            token : \"support.variable\",\n            regex : /(?:\\[[ x]\\])?/,\n            next  : \"listblock\"\n        }],\n\n        \"listblock\" : [ { // Lists only escape on completely blank lines.\n            token : \"empty_line\",\n            regex : \"^$\",\n            next  : \"start\"\n        }, { // list\n            token : \"markup.list\",\n            regex : \"^\\\\s{0,3}(?:[*+-]|\\\\d+\\\\.)\\\\s+\",\n            next  : \"listblock-start\"\n        }, {\n            include : \"basic\", noEscape: true\n        }, { // Github style block\n            token : \"support.function\",\n            regex : \"^\\\\s*```\\\\s*[a-zA-Z]*(?:{.*?\\\\})?\\\\s*$\",\n            next  : \"githubblock\"\n        }, {\n            defaultToken : \"list\" //do not use markup.list to allow stling leading `*` differntly\n        } ],\n\n        \"blockquote\" : [ { // Blockquotes only escape on blank lines.\n            token : \"empty_line\",\n            regex : \"^\\\\s*$\",\n            next  : \"start\"\n        }, { // block quote\n            token : \"string.blockquote\",\n            regex : \"^\\\\s*>\\\\s*(?:[*+-]|\\\\d+\\\\.)?\\\\s+\",\n            next  : \"blockquote\"\n        }, {\n            include : \"basic\", noEscape: true\n        }, {\n            defaultToken : \"string.blockquote\"\n        } ],\n\n        \"githubblock\" : [ {\n            token : \"support.function\",\n            regex : \"^\\\\s*```\",\n            next  : \"start\"\n        }, {\n            token : \"support.function\",\n            regex : \".+\"\n        } ]\n    });\n\n    this.embedRules(JavaScriptHighlightRules, \"jscode-\", [{\n       token : \"support.function\",\n       regex : \"^\\\\s*```\",\n       next  : \"pop\"\n    }]);\n\n    this.embedRules(HtmlHighlightRules, \"htmlcode-\", [{\n       token : \"support.function\",\n       regex : \"^\\\\s*```\",\n       next  : \"pop\"\n    }]);\n\n    this.embedRules(CssHighlightRules, \"csscode-\", [{\n       token : \"support.function\",\n       regex : \"^\\\\s*```\",\n       next  : \"pop\"\n    }]);\n\n    this.embedRules(XmlHighlightRules, \"xmlcode-\", [{\n       token : \"support.function\",\n       regex : \"^\\\\s*```\",\n       next  : \"pop\"\n    }]);\n\n    this.normalizeRules();\n};\noop.inherits(MarkdownHighlightRules, TextHighlightRules);\n\nexports.MarkdownHighlightRules = MarkdownHighlightRules;\n});\n\nace.define(\"ace/mode/mask_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/css_highlight_rules\",\"ace/mode/markdown_highlight_rules\",\"ace/mode/html_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nexports.MaskHighlightRules = MaskHighlightRules;\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextRules   = require(\"./text_highlight_rules\").TextHighlightRules;\nvar JSRules     = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar CssRules    = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MDRules     = require(\"./markdown_highlight_rules\").MarkdownHighlightRules;\nvar HTMLRules   = require(\"./html_highlight_rules\").HtmlHighlightRules;\n\nvar token_TAG       = \"keyword.support.constant.language\",\n    token_COMPO     = \"support.function.markup.bold\",\n    token_KEYWORD   = \"keyword\",\n    token_LANG      = \"constant.language\",\n    token_UTIL      = \"keyword.control.markup.italic\",\n    token_ATTR      = \"support.variable.class\",\n    token_PUNKT     = \"keyword.operator\",\n    token_ITALIC    = \"markup.italic\",\n    token_BOLD      = \"markup.bold\",\n    token_LPARE     = \"paren.lparen\",\n    token_RPARE     = \"paren.rparen\";\n\nvar const_FUNCTIONS,\n    const_KEYWORDS,\n    const_CONST,\n    const_TAGS;\n(function(){\n    const_FUNCTIONS = lang.arrayToMap(\n        (\"log\").split(\"|\")\n    );\n    const_CONST = lang.arrayToMap(\n        (\":dualbind|:bind|:import|slot|event|style|html|markdown|md\").split(\"|\")\n    );\n    const_KEYWORDS = lang.arrayToMap(\n        (\"debugger|define|var|if|each|for|of|else|switch|case|with|visible|+if|+each|+for|+switch|+with|+visible|include|import\").split(\"|\")\n    );\n    const_TAGS = lang.arrayToMap(\n        (\"a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdo|\" + \n         \"big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|\" + \n         \"command|datalist|dd|del|details|dfn|dir|div|dl|dt|em|embed|fieldset|\" + \n         \"figcaption|figure|font|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|\" + \n         \"header|hgroup|hr|html|i|iframe|img|input|ins|keygen|kbd|label|legend|li|\" + \n         \"link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|\" + \n         \"option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|\" + \n         \"small|source|span|strike|strong|style|sub|summary|sup|table|tbody|td|\" + \n         \"textarea|tfoot|th|thead|time|title|tr|tt|u|ul|var|video|wbr|xmp\").split(\"|\")\n    );\n}());\n\nfunction MaskHighlightRules () {\n\n    this.$rules = {\n        \"start\" : [\n            Token(\"comment\", \"\\\\/\\\\/.*$\"),\n            Token(\"comment\", \"\\\\/\\\\*\", [\n                Token(\"comment\", \".*?\\\\*\\\\/\", \"start\"),\n                Token(\"comment\", \".+\")\n            ]),\n            \n            Blocks.string(\"'''\"),\n            Blocks.string('\"\"\"'),\n            Blocks.string('\"'),\n            Blocks.string(\"'\"),\n            \n            Blocks.syntax(/(markdown|md)\\b/, \"md-multiline\", \"multiline\"),\n            Blocks.syntax(/html\\b/, \"html-multiline\", \"multiline\"),\n            Blocks.syntax(/(slot|event)\\b/, \"js-block\", \"block\"),\n            Blocks.syntax(/style\\b/, \"css-block\", \"block\"),\n            Blocks.syntax(/var\\b/, \"js-statement\", \"attr\"),\n            \n            Blocks.tag(),\n            \n            Token(token_LPARE, \"[[({>]\"),\n            Token(token_RPARE, \"[\\\\])};]\", \"start\"),\n            {\n                caseInsensitive: true\n            }\n        ]\n    };\n    var rules = this;\n    \n    addJavaScript(\"interpolation\", /\\]/, token_RPARE + \".\" + token_ITALIC);\n    addJavaScript(\"statement\", /\\)|}|;/);\n    addJavaScript(\"block\", /\\}/);\n    addCss();\n    addMarkdown();\n    addHtml();\n    \n    function addJavaScript(name, escape, closeType) {\n        var prfx  =  \"js-\" + name + \"-\",\n            rootTokens = name === \"block\" ? [\"start\"] : [\"start\", \"no_regex\"];\n        add(\n            JSRules\n            , prfx\n            , escape\n            , rootTokens\n            , closeType\n        );\n    }\n    function addCss() {\n        add(CssRules, \"css-block-\", /\\}/);\n    }\n    function addMarkdown() {\n        add(MDRules, \"md-multiline-\", /(\"\"\"|''')/, []);\n    }\n    function addHtml() {\n        add(HTMLRules, \"html-multiline-\", /(\"\"\"|''')/);\n    }\n    function add(Rules, strPrfx, rgxEnd, rootTokens, closeType) {\n        var next = \"pop\";\n        var tokens = rootTokens || [ \"start\" ];\n        if (tokens.length === 0) {\n            tokens = null;\n        }\n        if (/block|multiline/.test(strPrfx)) {\n            next = strPrfx + \"end\";\n            rules.$rules[next] = [\n                Token(\"empty\", \"\", \"start\")\n            ];\n        }\n        rules.embedRules(\n            Rules\n            , strPrfx\n            , [ Token(closeType || token_RPARE, rgxEnd, next) ]\n            , tokens\n            , tokens == null ? true : false\n        );\n    }\n\n    this.normalizeRules();\n}\noop.inherits(MaskHighlightRules, TextRules);\n\nvar Blocks = {\n    string: function(str, next){\n        var token = Token(\n            \"string.start\"\n            , str\n            , [\n                Token(token_LPARE + \".\" + token_ITALIC, /~\\[/, Blocks.interpolation()),\n                Token(\"string.end\", str, \"pop\"),\n                {\n                    defaultToken: \"string\"\n                }\n            ]\n            , next\n        );\n        if (str.length === 1){\n            var escaped = Token(\"string.escape\", \"\\\\\\\\\" + str);\n            token.push.unshift(escaped);\n        }\n        return token;\n    },\n    interpolation: function(){\n        return [\n            Token(token_UTIL, /\\s*\\w*\\s*:/),\n            \"js-interpolation-start\"\n        ];\n    },\n    tagHead: function (rgx) {\n      return Token(token_ATTR, rgx, [\n            Token(token_ATTR, /[\\w\\-_]+/),\n            Token(token_LPARE + \".\" + token_ITALIC, /~\\[/, Blocks.interpolation()),\n            Blocks.goUp()\n        ]);\n    },\n    tag: function () {\n        return {\n            token: 'tag',\n            onMatch :  function(value) {\n                if (void 0 !== const_KEYWORDS[value])\n                    return token_KEYWORD;\n                if (void 0 !== const_CONST[value])\n                    return token_LANG;\n                if (void 0 !== const_FUNCTIONS[value])\n                    return \"support.function\";\n                if (void 0 !== const_TAGS[value.toLowerCase()])\n                    return token_TAG;\n                \n                return token_COMPO;\n            },\n            regex : /([@\\w\\-_:+]+)|((^|\\s)(?=\\s*(\\.|#)))/,\n            push: [\n                Blocks.tagHead(/\\./) ,\n                Blocks.tagHead(/\\#/) ,\n                Blocks.expression(),\n                Blocks.attribute(),\n                \n                Token(token_LPARE, /[;>{]/, \"pop\")\n            ]\n        };\n    },\n    syntax: function(rgx, next, type){\n        return {\n            token: token_LANG,\n            regex : rgx,\n            push: ({\n                \"attr\": [\n                    next + \"-start\",\n                    Token(token_PUNKT, /;/, \"start\")\n                ],\n                \"multiline\": [\n                    Blocks.tagHead(/\\./) ,\n                    Blocks.tagHead(/\\#/) ,\n                    Blocks.attribute(),\n                    Blocks.expression(),\n                    Token(token_LPARE, /[>\\{]/),\n                    Token(token_PUNKT, /;/, \"start\"),\n                    Token(token_LPARE, /'''|\"\"\"/, [ next + \"-start\" ])\n                ],\n                \"block\": [\n                    Blocks.tagHead(/\\./) ,\n                    Blocks.tagHead(/\\#/) ,\n                    Blocks.attribute(),\n                    Blocks.expression(),\n                    Token(token_LPARE, /\\{/, [ next + \"-start\" ])\n                ]\n            })[type]\n        };\n    },\n    attribute: function(){\n        return Token(function(value){\n            return  /^x\\-/.test(value)\n                ? token_ATTR + \".\" + token_BOLD\n                : token_ATTR;\n        }, /[\\w_-]+/, [\n            Token(token_PUNKT, /\\s*=\\s*/, [\n                Blocks.string('\"'),\n                Blocks.string(\"'\"),\n                Blocks.word(),\n                Blocks.goUp()\n            ]),\n            Blocks.goUp()\n        ]);\n    },\n    expression: function(){\n        return Token(token_LPARE, /\\(/, [ \"js-statement-start\" ]);\n    },\n    word: function(){\n        return Token(\"string\", /[\\w-_]+/);\n    },\n    goUp: function(){\n        return Token(\"text\", \"\", \"pop\");\n    },\n    goStart: function(){\n        return Token(\"text\", \"\", \"start\");\n    }\n};\n\n\nfunction Token(token, rgx, mix) {\n    var push, next, onMatch;\n    if (arguments.length === 4) {\n        push = mix;\n        next = arguments[3];\n    }\n    else if (typeof mix === \"string\") {\n        next = mix;\n    }\n    else {\n        push = mix;\n    }\n    if (typeof token === \"function\") {\n        onMatch = token;\n        token   = \"empty\";\n    }\n    return {\n        token: token,\n        regex: rgx,\n        push: push,\n        next: next,\n        onMatch: onMatch\n    };\n}\n\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar CssBehaviour = function () {\n\n    this.inherit(CstyleBehaviour);\n\n    this.add(\"colon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(cursor.row);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                if (rightChar === ':') {\n                    return {\n                       text: '',\n                       selection: [1, 1]\n                    }\n                }\n                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n                    return {\n                       text: ':;',\n                       selection: [1, 1]\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"colon\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(range.start.row);\n                var rightChar = line.substring(range.end.column, range.end.column + 1);\n                if (rightChar === ';') {\n                    range.end.column ++;\n                    return range;\n                }\n            }\n        }\n    });\n\n    this.add(\"semicolon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ';') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === ';') {\n                return {\n                   text: '',\n                   selection: [1, 1]\n                }\n            }\n        }\n    });\n\n}\noop.inherits(CssBehaviour, CstyleBehaviour);\n\nexports.CssBehaviour = CssBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/mask\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/mask_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar MaskHighlightRules = require(\"./mask_highlight_rules\").MaskHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar CssBehaviour = require(\"./behaviour/css\").CssBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = MaskHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CssBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n   \n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/mask\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-matlab.js",
    "content": "ace.define(\"ace/mode/matlab_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar MatlabHighlightRules = function() {\n\nvar keywords = (\n        \"break|case|catch|classdef|continue|else|elseif|end|for|function|global|if|otherwise|parfor|persistent|return|spmd|switch|try|while\"\n    );\n\n    var builtinConstants = (\n        \"true|false|inf|Inf|nan|NaN|eps|pi|ans|nargin|nargout|varargin|varargout\"\n    );\n\n    var builtinFunctions = (\n        \"abs|accumarray|acos(?:d|h)?|acot(?:d|h)?|acsc(?:d|h)?|actxcontrol(?:list|select)?|actxGetRunningServer|actxserver|addlistener|addpath|addpref|addtodate|\"+\n\t\t\"airy|align|alim|all|allchild|alpha|alphamap|amd|ancestor|and|angle|annotation|any|area|arrayfun|asec(?:d|h)?|asin(?:d|h)?|assert|assignin|atan(?:2|d|h)?|\" +\n\t\t\"audiodevinfo|audioplayer|audiorecorder|aufinfo|auread|autumn|auwrite|avifile|aviinfo|aviread|axes|axis|balance|bar(?:3|3h|h)?|base2dec|beep|BeginInvoke|bench|\"+\n\t\t\"bessel(?:h|i|j|k|y)|beta|betainc|betaincinv|betaln|bicg|bicgstab|bicgstabl|bin2dec|bitand|bitcmp|bitget|bitmax|bitnot|bitor|bitset|bitshift|bitxor|blanks|blkdiag|\"+\n\t\t\"bone|box|brighten|brush|bsxfun|builddocsearchdb|builtin|bvp4c|bvp5c|bvpget|bvpinit|bvpset|bvpxtend|calendar|calllib|callSoapService|camdolly|cameratoolbar|camlight|\"+\n\t\t\"camlookat|camorbit|campan|campos|camproj|camroll|camtarget|camup|camva|camzoom|cart2pol|cart2sph|cast|cat|caxis|cd|cdf2rdf|cdfepoch|cdfinfo|cdflib(?:\\.(?:close|closeVar|\"+\n\t\t\"computeEpoch|computeEpoch16|create|createAttr|createVar|delete|deleteAttr|deleteAttrEntry|deleteAttrgEntry|deleteVar|deleteVarRecords|epoch16Breakdown|epochBreakdown|getAttrEntry|\"+\n\t\t\"getAttrgEntry|getAttrMaxEntry|getAttrMaxgEntry|getAttrName|getAttrNum|getAttrScope|getCacheSize|getChecksum|getCompression|getCompressionCacheSize|getConstantNames|\"+\n\t\t\"getConstantValue|getCopyright|getFileBackward|getFormat|getLibraryCopyright|getLibraryVersion|getMajority|getName|getNumAttrEntries|getNumAttrgEntries|getNumAttributes|\"+\n\t\t\"getNumgAttributes|getReadOnlyMode|getStageCacheSize|getValidate|getVarAllocRecords|getVarBlockingFactor|getVarCacheSize|getVarCompression|getVarData|getVarMaxAllocRecNum|\"+\n\t\t\"getVarMaxWrittenRecNum|getVarName|getVarNum|getVarNumRecsWritten|getVarPadValue|getVarRecordData|getVarReservePercent|getVarsMaxWrittenRecNum|getVarSparseRecords|getVersion|\"+\n\t\t\"hyperGetVarData|hyperPutVarData|inquire|inquireAttr|inquireAttrEntry|inquireAttrgEntry|inquireVar|open|putAttrEntry|putAttrgEntry|putVarData|putVarRecordData|renameAttr|\"+\n\t\t\"renameVar|setCacheSize|setChecksum|setCompression|setCompressionCacheSize|setFileBackward|setFormat|setMajority|setReadOnlyMode|setStageCacheSize|setValidate|\"+\n\t\t\"setVarAllocBlockRecords|setVarBlockingFactor|setVarCacheSize|setVarCompression|setVarInitialRecs|setVarPadValue|SetVarReservePercent|setVarsCacheSize|setVarSparseRecords))?|\"+\n\t\t\"cdfread|cdfwrite|ceil|cell2mat|cell2struct|celldisp|cellfun|cellplot|cellstr|cgs|checkcode|checkin|checkout|chol|cholinc|cholupdate|circshift|cla|clabel|class|clc|clear|\"+\n\t\t\"clearvars|clf|clipboard|clock|close|closereq|cmopts|cmpermute|cmunique|colamd|colon|colorbar|colordef|colormap|colormapeditor|colperm|Combine|comet|comet3|commandhistory|\"+\n\t\t\"commandwindow|compan|compass|complex|computer|cond|condeig|condest|coneplot|conj|containers\\.Map|contour(?:3|c|f|slice)?|contrast|conv|conv2|convhull|convhulln|convn|cool|\"+\n\t\t\"copper|copyfile|copyobj|corrcoef|cos(?:d|h)?|cot(?:d|h)?|cov|cplxpair|cputime|createClassFromWsdl|createSoapMessage|cross|csc(?:d|h)?|csvread|csvwrite|ctranspose|cumprod|\"+\n\t\t\"cumsum|cumtrapz|curl|customverctrl|cylinder|daqread|daspect|datacursormode|datatipinfo|date|datenum|datestr|datetick|datevec|dbclear|dbcont|dbdown|dblquad|dbmex|dbquit|\"+\n\t\t\"dbstack|dbstatus|dbstep|dbstop|dbtype|dbup|dde23|ddeget|ddesd|ddeset|deal|deblank|dec2base|dec2bin|dec2hex|decic|deconv|del2|delaunay|delaunay3|delaunayn|DelaunayTri|delete|\"+\n\t\t\"demo|depdir|depfun|det|detrend|deval|diag|dialog|diary|diff|diffuse|dir|disp|display|dither|divergence|dlmread|dlmwrite|dmperm|doc|docsearch|dos|dot|dragrect|drawnow|dsearch|\"+\n\t\t\"dsearchn|dynamicprops|echo|echodemo|edit|eig|eigs|ellipj|ellipke|ellipsoid|empty|enableNETfromNetworkDrive|enableservice|EndInvoke|enumeration|eomday|eq|erf|erfc|erfcinv|\"+\n\t\t\"erfcx|erfinv|error|errorbar|errordlg|etime|etree|etreeplot|eval|evalc|evalin|event\\.(?:EventData|listener|PropertyEvent|proplistener)|exifread|exist|exit|exp|expint|expm|\"+\n\t\t\"expm1|export2wsdlg|eye|ezcontour|ezcontourf|ezmesh|ezmeshc|ezplot|ezplot3|ezpolar|ezsurf|ezsurfc|factor|factorial|fclose|feather|feature|feof|ferror|feval|fft|fft2|fftn|\"+\n\t\t\"fftshift|fftw|fgetl|fgets|fieldnames|figure|figurepalette|fileattrib|filebrowser|filemarker|fileparts|fileread|filesep|fill|fill3|filter|filter2|find|findall|findfigs|\"+\n\t\t\"findobj|findstr|finish|fitsdisp|fitsinfo|fitsread|fitswrite|fix|flag|flipdim|fliplr|flipud|floor|flow|fminbnd|fminsearch|fopen|format|fplot|fprintf|frame2im|fread|freqspace|\"+\n\t\t\"frewind|fscanf|fseek|ftell|FTP|full|fullfile|func2str|functions|funm|fwrite|fzero|gallery|gamma|gammainc|gammaincinv|gammaln|gca|gcbf|gcbo|gcd|gcf|gco|ge|genpath|genvarname|\"+\n\t\t\"get|getappdata|getenv|getfield|getframe|getpixelposition|getpref|ginput|gmres|gplot|grabcode|gradient|gray|graymon|grid|griddata(?:3|n)?|griddedInterpolant|gsvd|gt|gtext|\"+\n\t\t\"guidata|guide|guihandles|gunzip|gzip|h5create|h5disp|h5info|h5read|h5readatt|h5write|h5writeatt|hadamard|handle|hankel|hdf|hdf5|hdf5info|hdf5read|hdf5write|hdfinfo|\"+\n\t\t\"hdfread|hdftool|help|helpbrowser|helpdesk|helpdlg|helpwin|hess|hex2dec|hex2num|hgexport|hggroup|hgload|hgsave|hgsetget|hgtransform|hidden|hilb|hist|histc|hold|home|horzcat|\"+\n\t\t\"hostid|hot|hsv|hsv2rgb|hypot|ichol|idivide|ifft|ifft2|ifftn|ifftshift|ilu|im2frame|im2java|imag|image|imagesc|imapprox|imfinfo|imformats|import|importdata|imread|imwrite|\"+\n\t\t\"ind2rgb|ind2sub|inferiorto|info|inline|inmem|inpolygon|input|inputdlg|inputname|inputParser|inspect|instrcallback|instrfind|instrfindall|int2str|integral(?:2|3)?|interp(?:1|\"+\n\t\t\"1q|2|3|ft|n)|interpstreamspeed|intersect|intmax|intmin|inv|invhilb|ipermute|isa|isappdata|iscell|iscellstr|ischar|iscolumn|isdir|isempty|isequal|isequaln|isequalwithequalnans|\"+\n\t\t\"isfield|isfinite|isfloat|isglobal|ishandle|ishghandle|ishold|isinf|isinteger|isjava|iskeyword|isletter|islogical|ismac|ismatrix|ismember|ismethod|isnan|isnumeric|isobject|\"+\n\t\t\"isocaps|isocolors|isonormals|isosurface|ispc|ispref|isprime|isprop|isreal|isrow|isscalar|issorted|isspace|issparse|isstr|isstrprop|isstruct|isstudent|isunix|isvarname|\"+\n\t\t\"isvector|javaaddpath|javaArray|javachk|javaclasspath|javacomponent|javaMethod|javaMethodEDT|javaObject|javaObjectEDT|javarmpath|jet|keyboard|kron|lasterr|lasterror|\"+\n\t\t\"lastwarn|lcm|ldivide|ldl|le|legend|legendre|length|libfunctions|libfunctionsview|libisloaded|libpointer|libstruct|license|light|lightangle|lighting|lin2mu|line|lines|\"+\n\t\t\"linkaxes|linkdata|linkprop|linsolve|linspace|listdlg|listfonts|load|loadlibrary|loadobj|log|log10|log1p|log2|loglog|logm|logspace|lookfor|lower|ls|lscov|lsqnonneg|lsqr|\"+\n\t\t\"lt|lu|luinc|magic|makehgtform|mat2cell|mat2str|material|matfile|matlab\\.io\\.MatFile|matlab\\.mixin\\.(?:Copyable|Heterogeneous(?:\\.getDefaultScalarElement)?)|matlabrc|\"+\n\t\t\"matlabroot|max|maxNumCompThreads|mean|median|membrane|memmapfile|memory|menu|mesh|meshc|meshgrid|meshz|meta\\.(?:class(?:\\.fromName)?|DynamicProperty|EnumeratedValue|event|\"+\n\t\t\"MetaData|method|package(?:\\.(?:fromName|getAllPackages))?|property)|metaclass|methods|methodsview|mex(?:\\.getCompilerConfigurations)?|MException|mexext|mfilename|min|minres|\"+\n\t\t\"minus|mislocked|mkdir|mkpp|mldivide|mlint|mlintrpt|mlock|mmfileinfo|mmreader|mod|mode|more|move|movefile|movegui|movie|movie2avi|mpower|mrdivide|msgbox|mtimes|mu2lin|\"+\n\t\t\"multibandread|multibandwrite|munlock|namelengthmax|nargchk|narginchk|nargoutchk|native2unicode|nccreate|ncdisp|nchoosek|ncinfo|ncread|ncreadatt|ncwrite|ncwriteatt|\"+\n\t\t\"ncwriteschema|ndgrid|ndims|ne|NET(?:\\.(?:addAssembly|Assembly|convertArray|createArray|createGeneric|disableAutoRelease|enableAutoRelease|GenericClass|invokeGenericMethod|\"+\n\t\t\"NetException|setStaticProperty))?|netcdf\\.(?:abort|close|copyAtt|create|defDim|defGrp|defVar|defVarChunking|defVarDeflate|defVarFill|defVarFletcher32|delAtt|endDef|getAtt|\"+\n\t\t\"getChunkCache|getConstant|getConstantNames|getVar|inq|inqAtt|inqAttID|inqAttName|inqDim|inqDimID|inqDimIDs|inqFormat|inqGrpName|inqGrpNameFull|inqGrpParent|inqGrps|\"+\n\t\t\"inqLibVers|inqNcid|inqUnlimDims|inqVar|inqVarChunking|inqVarDeflate|inqVarFill|inqVarFletcher32|inqVarID|inqVarIDs|open|putAtt|putVar|reDef|renameAtt|renameDim|renameVar|\"+\n\t\t\"setChunkCache|setDefaultFormat|setFill|sync)|newplot|nextpow2|nnz|noanimate|nonzeros|norm|normest|not|notebook|now|nthroot|null|num2cell|num2hex|num2str|numel|nzmax|\"+\n\t\t\"ode(?:113|15i|15s|23|23s|23t|23tb|45)|odeget|odeset|odextend|onCleanup|ones|open|openfig|opengl|openvar|optimget|optimset|or|ordeig|orderfields|ordqz|ordschur|orient|\"+\n\t\t\"orth|pack|padecoef|pagesetupdlg|pan|pareto|parseSoapResponse|pascal|patch|path|path2rc|pathsep|pathtool|pause|pbaspect|pcg|pchip|pcode|pcolor|pdepe|pdeval|peaks|perl|perms|\"+\n\t\t\"permute|pie|pink|pinv|planerot|playshow|plot|plot3|plotbrowser|plotedit|plotmatrix|plottools|plotyy|plus|pol2cart|polar|poly|polyarea|polyder|polyeig|polyfit|polyint|polyval|\"+\n\t\t\"polyvalm|pow2|power|ppval|prefdir|preferences|primes|print|printdlg|printopt|printpreview|prod|profile|profsave|propedit|propertyeditor|psi|publish|PutCharArray|PutFullMatrix|\"+\n\t\t\"PutWorkspaceData|pwd|qhull|qmr|qr|qrdelete|qrinsert|qrupdate|quad|quad2d|quadgk|quadl|quadv|questdlg|quit|quiver|quiver3|qz|rand|randi|randn|randperm|RandStream(?:\\.(?:create|\"+\n\t\t\"getDefaultStream|getGlobalStream|list|setDefaultStream|setGlobalStream))?|rank|rat|rats|rbbox|rcond|rdivide|readasync|real|reallog|realmax|realmin|realpow|realsqrt|record|\"+\n\t\t\"rectangle|rectint|recycle|reducepatch|reducevolume|refresh|refreshdata|regexp|regexpi|regexprep|regexptranslate|rehash|rem|Remove|RemoveAll|repmat|reset|reshape|residue|\"+\n\t\t\"restoredefaultpath|rethrow|rgb2hsv|rgb2ind|rgbplot|ribbon|rmappdata|rmdir|rmfield|rmpath|rmpref|rng|roots|rose|rosser|rot90|rotate|rotate3d|round|rref|rsf2csf|run|save|saveas|\"+\n\t\t\"saveobj|savepath|scatter|scatter3|schur|sec|secd|sech|selectmoveresize|semilogx|semilogy|sendmail|serial|set|setappdata|setdiff|setenv|setfield|setpixelposition|setpref|setstr|\"+\n\t\t\"setxor|shading|shg|shiftdim|showplottool|shrinkfaces|sign|sin(?:d|h)?|size|slice|smooth3|snapnow|sort|sortrows|sound|soundsc|spalloc|spaugment|spconvert|spdiags|specular|speye|\"+\n\t\t\"spfun|sph2cart|sphere|spinmap|spline|spones|spparms|sprand|sprandn|sprandsym|sprank|spring|sprintf|spy|sqrt|sqrtm|squeeze|ss2tf|sscanf|stairs|startup|std|stem|stem3|stopasync|\"+\n\t\t\"str2double|str2func|str2mat|str2num|strcat|strcmp|strcmpi|stream2|stream3|streamline|streamparticles|streamribbon|streamslice|streamtube|strfind|strjust|strmatch|strncmp|\"+\n\t\t\"strncmpi|strread|strrep|strtok|strtrim|struct2cell|structfun|strvcat|sub2ind|subplot|subsasgn|subsindex|subspace|subsref|substruct|subvolume|sum|summer|superclasses|superiorto|\"+\n\t\t\"support|surf|surf2patch|surface|surfc|surfl|surfnorm|svd|svds|swapbytes|symamd|symbfact|symmlq|symrcm|symvar|system|tan(?:d|h)?|tar|tempdir|tempname|tetramesh|texlabel|text|\"+\n\t\t\"textread|textscan|textwrap|tfqmr|throw|tic|Tiff(?:\\.(?:getTagNames|getVersion))?|timer|timerfind|timerfindall|times|timeseries|title|toc|todatenum|toeplitz|toolboxdir|trace|\"+\n\t\t\"transpose|trapz|treelayout|treeplot|tril|trimesh|triplequad|triplot|TriRep|TriScatteredInterp|trisurf|triu|tscollection|tsearch|tsearchn|tstool|type|typecast|uibuttongroup|\"+\n\t\t\"uicontextmenu|uicontrol|uigetdir|uigetfile|uigetpref|uiimport|uimenu|uiopen|uipanel|uipushtool|uiputfile|uiresume|uisave|uisetcolor|uisetfont|uisetpref|uistack|uitable|\"+\n\t\t\"uitoggletool|uitoolbar|uiwait|uminus|undocheckout|unicode2native|union|unique|unix|unloadlibrary|unmesh|unmkpp|untar|unwrap|unzip|uplus|upper|urlread|urlwrite|usejava|\"+\n\t\t\"userpath|validateattributes|validatestring|vander|var|vectorize|ver|verctrl|verLessThan|version|vertcat|VideoReader(?:\\.isPlatformSupported)?|VideoWriter(?:\\.getProfiles)?|\"+\n\t\t\"view|viewmtx|visdiff|volumebounds|voronoi|voronoin|wait|waitbar|waitfor|waitforbuttonpress|warndlg|warning|waterfall|wavfinfo|wavplay|wavread|wavrecord|wavwrite|web|weekday|\"+\n\t\t\"what|whatsnew|which|whitebg|who|whos|wilkinson|winopen|winqueryreg|winter|wk1finfo|wk1read|wk1write|workspace|xlabel|xlim|xlsfinfo|xlsread|xlswrite|xmlread|xmlwrite|xor|xslt|\"+\n\t\t\"ylabel|ylim|zeros|zip|zlabel|zlim|zoom|addedvarplot|andrewsplot|anova(?:1|2|n)|ansaribradley|aoctool|barttest|bbdesign|beta(?:cdf|fit|inv|like|pdf|rnd|stat)|bino(?:cdf|fit|inv|\"+\n\t\t\"pdf|rnd|stat)|biplot|bootci|bootstrp|boxplot|candexch|candgen|canoncorr|capability|capaplot|caseread|casewrite|categorical|ccdesign|cdfplot|chi2(?:cdf|gof|inv|pdf|rnd|stat)|\"+\n\t\t\"cholcov|Classification(?:BaggedEnsemble|Discriminant(?:\\.(?:fit|make|template))?|Ensemble|KNN(?:\\.(?:fit|template))?|PartitionedEnsemble|PartitionedModel|Tree(?:\\.(?:fit|\"+\n\t\t\"template))?)|classify|classregtree|cluster|clusterdata|cmdscale|combnk|Compact(?:Classification(?:Discriminant|Ensemble|Tree)|Regression(?:Ensemble|Tree)|TreeBagger)|confusionmat|\"+\n\t\t\"controlchart|controlrules|cophenet|copula(?:cdf|fit|param|pdf|rnd|stat)|cordexch|corr|corrcov|coxphfit|createns|crosstab|crossval|cvpartition|datasample|dataset|daugment|dcovary|\"+\n\t\t\"dendrogram|dfittool|disttool|dummyvar|dwtest|ecdf|ecdfhist|ev(?:cdf|fit|inv|like|pdf|rnd|stat)|ExhaustiveSearcher|exp(?:cdf|fit|inv|like|pdf|rnd|stat)|factoran|fcdf|ff2n|finv|\"+\n\t\t\"fitdist|fitensemble|fpdf|fracfact|fracfactgen|friedman|frnd|fstat|fsurfht|fullfact|gagerr|gam(?:cdf|fit|inv|like|pdf|rnd|stat)|GeneralizedLinearModel(?:\\.fit)?|geo(?:cdf|inv|mean|\"+\n\t\t\"pdf|rnd|stat)|gev(?:cdf|fit|inv|like|pdf|rnd|stat)|gline|glmfit|glmval|glyphplot|gmdistribution(?:\\.fit)?|gname|gp(?:cdf|fit|inv|like|pdf|rnd|stat)|gplotmatrix|grp2idx|grpstats|\"+\n\t\t\"gscatter|haltonset|harmmean|hist3|histfit|hmm(?:decode|estimate|generate|train|viterbi)|hougen|hyge(?:cdf|inv|pdf|rnd|stat)|icdf|inconsistent|interactionplot|invpred|iqr|iwishrnd|\"+\n\t\t\"jackknife|jbtest|johnsrnd|KDTreeSearcher|kmeans|knnsearch|kruskalwallis|ksdensity|kstest|kstest2|kurtosis|lasso|lassoglm|lassoPlot|leverage|lhsdesign|lhsnorm|lillietest|\"+\n\t\t\"LinearModel(?:\\.fit)?|linhyptest|linkage|logn(?:cdf|fit|inv|like|pdf|rnd|stat)|lsline|mad|mahal|maineffectsplot|manova1|manovacluster|mdscale|mhsample|mle|mlecov|mnpdf|\"+\n\t\t\"mnrfit|mnrnd|mnrval|moment|multcompare|multivarichart|mvn(?:cdf|pdf|rnd)|mvregress|mvregresslike|mvt(?:cdf|pdf|rnd)|NaiveBayes(?:\\.fit)?|nan(?:cov|max|mean|median|min|std|\"+\n\t\t\"sum|var)|nbin(?:cdf|fit|inv|pdf|rnd|stat)|ncf(?:cdf|inv|pdf|rnd|stat)|nct(?:cdf|inv|pdf|rnd|stat)|ncx2(?:cdf|inv|pdf|rnd|stat)|NeighborSearcher|nlinfit|nlintool|nlmefit|nlmefitsa|\"+\n\t\t\"nlparci|nlpredci|nnmf|nominal|NonLinearModel(?:\\.fit)?|norm(?:cdf|fit|inv|like|pdf|rnd|stat)|normplot|normspec|ordinal|outlierMeasure|parallelcoords|paretotails|partialcorr|\"+\n\t\t\"pcacov|pcares|pdf|pdist|pdist2|pearsrnd|perfcurve|perms|piecewisedistribution|plsregress|poiss(?:cdf|fit|inv|pdf|rnd|tat)|polyconf|polytool|prctile|princomp|ProbDist(?:Kernel|\"+\n\t\t\"Parametric|UnivKernel|UnivParam)?|probplot|procrustes|qqplot|qrandset|qrandstream|quantile|randg|random|randsample|randtool|range|rangesearch|ranksum|rayl(?:cdf|fit|inv|pdf|\"+\n\t\t\"rnd|stat)|rcoplot|refcurve|refline|regress|Regression(?:BaggedEnsemble|Ensemble|PartitionedEnsemble|PartitionedModel|Tree(?:\\.(?:fit|template))?)|regstats|relieff|ridge|\"+\n\t\t\"robustdemo|robustfit|rotatefactors|rowexch|rsmdemo|rstool|runstest|sampsizepwr|scatterhist|sequentialfs|signrank|signtest|silhouette|skewness|slicesample|sobolset|squareform|\"+\n\t\t\"statget|statset|stepwise|stepwisefit|surfht|tabulate|tblread|tblwrite|tcdf|tdfread|tiedrank|tinv|tpdf|TreeBagger|treedisp|treefit|treeprune|treetest|treeval|trimmean|trnd|tstat|\"+\n\t\t\"ttest|ttest2|unid(?:cdf|inv|pdf|rnd|stat)|unif(?:cdf|inv|it|pdf|rnd|stat)|vartest(?:2|n)?|wbl(?:cdf|fit|inv|like|pdf|rnd|stat)|wblplot|wishrnd|x2fx|xptread|zscore|ztest\"+\n\t\t\"adapthisteq|analyze75info|analyze75read|applycform|applylut|axes2pix|bestblk|blockproc|bwarea|bwareaopen|bwboundaries|bwconncomp|bwconvhull|bwdist|bwdistgeodesic|bweuler|\"+\n\t\t\"bwhitmiss|bwlabel|bwlabeln|bwmorph|bwpack|bwperim|bwselect|bwtraceboundary|bwulterode|bwunpack|checkerboard|col2im|colfilt|conndef|convmtx2|corner|cornermetric|corr2|cp2tform|\"+\n\t\t\"cpcorr|cpselect|cpstruct2pairs|dct2|dctmtx|deconvblind|deconvlucy|deconvreg|deconvwnr|decorrstretch|demosaic|dicom(?:anon|dict|info|lookup|read|uid|write)|edge|edgetaper|entropy|\"+\n\t\t\"entropyfilt|fan2para|fanbeam|findbounds|fliptform|freqz2|fsamp2|fspecial|ftrans2|fwind1|fwind2|getheight|getimage|getimagemodel|getline|getneighbors|getnhood|getpts|\"+\n\t\t\"getrangefromclass|getrect|getsequence|gray2ind|graycomatrix|graycoprops|graydist|grayslice|graythresh|hdrread|hdrwrite|histeq|hough|houghlines|houghpeaks|iccfind|iccread|\"+\n\t\t\"iccroot|iccwrite|idct2|ifanbeam|im2bw|im2col|im2double|im2int16|im2java2d|im2single|im2uint16|im2uint8|imabsdiff|imadd|imadjust|ImageAdapter|imageinfo|imagemodel|imapplymatrix|\"+\n\t\t\"imattributes|imbothat|imclearborder|imclose|imcolormaptool|imcomplement|imcontour|imcontrast|imcrop|imdilate|imdisplayrange|imdistline|imdivide|imellipse|imerode|imextendedmax|\"+\n\t\t\"imextendedmin|imfill|imfilter|imfindcircles|imfreehand|imfuse|imgca|imgcf|imgetfile|imhandles|imhist|imhmax|imhmin|imimposemin|imlincomb|imline|immagbox|immovie|immultiply|imnoise|\"+\n\t\t\"imopen|imoverview|imoverviewpanel|impixel|impixelinfo|impixelinfoval|impixelregion|impixelregionpanel|implay|impoint|impoly|impositionrect|improfile|imputfile|impyramid|\"+\n\t\t\"imreconstruct|imrect|imregconfig|imregionalmax|imregionalmin|imregister|imresize|imroi|imrotate|imsave|imscrollpanel|imshow|imshowpair|imsubtract|imtool|imtophat|imtransform|\"+\n\t\t\"imview|ind2gray|ind2rgb|interfileinfo|interfileread|intlut|ippl|iptaddcallback|iptcheckconn|iptcheckhandle|iptcheckinput|iptcheckmap|iptchecknargin|iptcheckstrs|iptdemos|iptgetapi|\"+\n\t\t\"iptGetPointerBehavior|iptgetpref|ipticondir|iptnum2ordinal|iptPointerManager|iptprefs|iptremovecallback|iptSetPointerBehavior|iptsetpref|iptwindowalign|iradon|isbw|isflat|isgray|\"+\n\t\t\"isicc|isind|isnitf|isrgb|isrset|lab2double|lab2uint16|lab2uint8|label2rgb|labelmatrix|makecform|makeConstrainToRectFcn|makehdr|makelut|makeresampler|maketform|mat2gray|mean2|\"+\n\t\t\"medfilt2|montage|nitfinfo|nitfread|nlfilter|normxcorr2|ntsc2rgb|openrset|ordfilt2|otf2psf|padarray|para2fan|phantom|poly2mask|psf2otf|qtdecomp|qtgetblk|qtsetblk|radon|rangefilt|\"+\n\t\t\"reflect|regionprops|registration\\.metric\\.(?:MattesMutualInformation|MeanSquares)|registration\\.optimizer\\.(?:OnePlusOneEvolutionary|RegularStepGradientDescent)|rgb2gray|\"+\n\t\t\"rgb2ntsc|rgb2ycbcr|roicolor|roifill|roifilt2|roipoly|rsetwrite|std2|stdfilt|strel|stretchlim|subimage|tformarray|tformfwd|tforminv|tonemap|translate|truesize|uintlut|viscircles|\"+\n\t\t\"warp|watershed|whitepoint|wiener2|xyz2double|xyz2uint16|ycbcr2rgb|bintprog|color|fgoalattain|fminbnd|fmincon|fminimax|fminsearch|fminunc|fseminf|fsolve|fzero|fzmult|gangstr|ktrlink|\"+\n\t\t\"linprog|lsqcurvefit|lsqlin|lsqnonlin|lsqnonneg|optimget|optimset|optimtool|quadprog\"\n    );\n    var storageType = (\n        \"cell|struct|char|double|single|logical|u?int(?:8|16|32|64)|sparse\"\n    );\n    var keywordMapper = this.createKeywordMapper({\n        \"storage.type\": storageType,\n        \"support.function\": builtinFunctions,\n        \"keyword\": keywords,\n        \"constant.language\": builtinConstants\n    }, \"identifier\", true);\n\n    this.$rules = {\n        start: [{ \n            token : \"string\",\n            regex : \"'\",\n            stateName : \"qstring\",\n            next  : [{\n                token : \"constant.language.escape\",\n                regex : \"''\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"start\"\n            }, {\n                defaultToken: \"string\"\n            }]\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            regex: \"\",\n            next: \"noQstring\"\n        }],        \n        noQstring : [{\n            regex: \"^\\\\s*%{\\\\s*$\",\n            token: \"comment.start\",\n            push: \"blockComment\"\n        }, {\n            token : \"comment\",\n            regex : \"%[^\\r\\n]*\"\n        }, {\n            token : \"string\",\n            regex : '\"',\n            stateName : \"qqstring\",\n            next  : [{\n                token : \"constant.language.escape\",\n                regex : /\\\\./\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"start\"\n            }, {\n                defaultToken: \"string\"\n            }]\n        }, {\n            token : \"constant.numeric\", // float\n            regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\\\+|\\\\-|\\\\/|\\\\/\\\\/|<@>|@>|<@|&|\\\\^|~|<|>|<=|=>|==|!=|<>|=\",\n            next: \"start\"\n        }, {\n            token : \"punctuation.operator\",\n            regex : \"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\",\n            next: \"start\"\n        }, {\n            token : \"paren.lparen\",\n            regex : \"[({\\\\[]\",\n            next: \"start\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\]})]\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }, {\n            token : \"text\",\n            regex : \"$\",\n            next  : \"start\"\n        }],\n        blockComment: [{\n            regex: \"^\\\\s*%{\\\\s*$\",\n            token: \"comment.start\",\n            push: \"blockComment\"\n        }, {\n            regex: \"^\\\\s*%}\\\\s*$\",\n            token: \"comment.end\",\n            next: \"pop\"\n        }, {\n            defaultToken: \"comment\"\n        }],\n    };\n    \n    this.normalizeRules();\n};\n\noop.inherits(MatlabHighlightRules, TextHighlightRules);\n\nexports.MatlabHighlightRules = MatlabHighlightRules;\n});\n\nace.define(\"ace/mode/matlab\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/matlab_highlight_rules\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar MatlabHighlightRules = require(\"./matlab_highlight_rules\").MatlabHighlightRules;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.HighlightRules = MatlabHighlightRules;\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"%\";\n    this.blockComment = {start: \"%{\", end: \"%}\"};\n\n    this.$id = \"ace/mode/matlab\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-mel.js",
    "content": "ace.define(\"ace/mode/mel_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar MELHighlightRules = function() {\n\n    this.$rules = { start: \n       [ { caseInsensitive: true,\n           token: 'storage.type.mel',\n           regex: '\\\\b(matrix|string|vector|float|int|void)\\\\b' },\n         { caseInsensitive: true,\n           token: 'support.function.mel',\n           regex: '\\\\b((s(h(ow(ManipCtx|S(hadingGroupAttrEditor|electionInTitle)|H(idden|elp)|Window)|el(f(Button|TabLayout|Layout)|lField)|ading(GeometryRelCtx|Node|Connection|LightRelCtx))|y(s(tem|File)|mbol(Button|CheckBox))|nap(shot|Mode|2to2 |TogetherCtx|Key)|c(ulpt|ene(UIReplacement|Editor)|ale(BrushBrightness |Constraint|Key(Ctx)?)?|r(ipt(Node|Ctx|Table|edPanel(Type)?|Job|EditorInfo)|oll(Field|Layout))|mh)|t(itch(Surface(Points)?|AndExplodeShell )|a(ckTrace|rt(sWith |String ))|r(cmp|i(ng(ToStringArray |Array(Remove(Duplicates | )|C(ount |atenate )|ToString |Intersector))|p )|oke))|i(n(gleProfileBirailSurface)?|ze|gn|mplify)|o(u(nd(Control)?|rce)|ft(Mod(Ctx)?)?|rt)|u(perCtx|rface(S(haderList|ampler))?|b(st(itute(Geometry|AllString )?|ring)|d(M(irror|a(tchTopology|p(SewMove|Cut)))|iv(Crease|DisplaySmoothness)?|C(ollapse|leanTopology)|T(o(Blind|Poly)|ransferUVsToCache)|DuplicateAndConnect|EditUV|ListComponentConversion|AutoProjection)))|p(h(ere|rand)|otLight(PreviewPort)?|aceLocator|r(ing|eadSheetEditor))|e(t(s|MenuMode|Sta(te |rtupMessage|mpDensity )|NodeTypeFlag|ConstraintRestPosition |ToolTo|In(putDeviceMapping|finity)|D(ynamic|efaultShadingGroup|rivenKeyframe)|UITemplate|P(ar(ticleAttr|ent)|roject )|E(scapeCtx|dit(or|Ctx))|Key(Ctx|frame|Path)|F(ocus|luidAttr)|Attr(Mapping)?)|parator|ed|l(ect(Mode|ionConnection|Context|Type|edNodes|Pr(iority|ef)|Key(Ctx)?)?|LoadSettings)|archPathArray )|kin(Cluster|Percent)|q(uareSurface|rt)|w(itchTable|atchDisplayPort)|a(ve(Menu|Shelf|ToolSettings|I(nitialState|mage)|Pref(s|Objects)|Fluid|A(ttrPreset |llShelves))|mpleImage)|rtContext|mooth(step|Curve|TangentSurface))|h(sv_to_rgb|yp(ot|er(Graph|Shade|Panel))|i(tTest|de|lite)|ot(Box|key(Check)?)|ud(Button|Slider(Button)?)|e(lp(Line)?|adsUpDisplay|rmite)|wRe(nder(Load)?|flectionMap)|ard(enPointCurve|ware(RenderPanel)?))|n(o(nLinear|ise|de(Type|IconButton|Outliner|Preset)|rmal(ize |Constraint))|urbs(Boolean|S(elect|quare)|C(opyUVSet|ube)|To(Subdiv|Poly(gonsPref)?)|Plane|ViewDirectionVector )|ew(ton|PanelItems)|ame(space(Info)?|Command|Field))|c(h(oice|dir|eck(Box(Grp)?|DefaultRenderGlobals)|a(n(nelBox|geSubdiv(Region|ComponentDisplayLevel))|racter(Map|OutlineEditor)?))|y(cleCheck|linder)|tx(Completion|Traverse|EditMode|Abort)|irc(ularFillet|le)|o(s|n(str(uctionHistory|ain(Value)?)|nect(ionInfo|Control|Dynamic|Joint|Attr)|t(extInfo|rol)|dition|e|vert(SolidTx|Tessellation|Unit|FromOldLayers |Lightmap)|firmDialog)|py(SkinWeights|Key|Flexor|Array )|l(or(Slider(Grp|ButtonGrp)|Index(SliderGrp)?|Editor|AtPoint)?|umnLayout|lision)|arsenSubdivSelectionList|m(p(onentEditor|utePolysetVolume |actHairSystem )|mand(Port|Echo|Line)))|u(tKey|r(ve(MoveEPCtx|SketchCtx|CVCtx|Intersect|OnSurface|E(ditorCtx|PCtx)|AddPtCtx)?|rent(Ctx|Time(Ctx)?|Unit)))|p(GetSolverAttr|Button|S(olver(Types)?|e(t(SolverAttr|Edit)|am))|C(o(nstraint|llision)|ache)|Tool|P(anel|roperty))|eil|l(ip(Schedule(rOutliner)?|TrimBefore |Editor(CurrentTimeCtx)?)?|ose(Surface|Curve)|uster|ear(Cache)?|amp)|a(n(CreateManip|vas)|tch(Quiet)?|pitalizeString |mera(View)?)|r(oss(Product )?|eate(RenderLayer|MotionField |SubdivRegion|N(ode|ewShelf )|D(isplayLayer|rawCtx)|Editor))|md(Shell|FileOutput))|M(R(ender(ShadowData|Callback|Data|Util|View|Line(Array)?)|ampAttribute)|G(eometryData|lobal)|M(odelMessage|essage|a(nipData|t(erial|rix)))|BoundingBox|S(yntax|ceneMessage|t(atus|ring(Array)?)|imple|pace|elect(ion(Mask|List)|Info)|watchRender(Register|Base))|H(ardwareRenderer|WShaderSwatchGenerator)|NodeMessage|C(o(nditionMessage|lor(Array)?|m(putation|mand(Result|Message)))|ursor|loth(Material|S(ystem|olverRegister)|Con(straint|trol)|Triangle|Particle|Edge|Force)|allbackIdArray)|T(ypeId|ime(r(Message)?|Array)?|oolsInfo|esselationParams|r(imBoundaryArray|ansformationMatrix))|I(ntArray|t(Geometry|Mesh(Polygon|Edge|Vertex|FaceVertex)|S(urfaceCV|electionList)|CurveCV|Instancer|eratorType|D(ependency(Graph|Nodes)|ag)|Keyframe)|k(System|HandleGroup)|mage)|3dView|Object(SetMessage|Handle|Array)?|D(G(M(odifier|essage)|Context)|ynSwept(Triangle|Line)|istance|oubleArray|evice(State|Channel)|a(ta(Block|Handle)|g(M(odifier|essage)|Path(Array)?))|raw(Request(Queue)?|Info|Data|ProcedureBase))|U(serEventMessage|i(nt(Array|64Array)|Message))|P(o(int(Array)?|lyMessage)|lug(Array)?|rogressWindow|x(G(eometry(Iterator|Data)|lBuffer)|M(idiInputDevice|odelEditorCommand|anipContainer)|S(urfaceShape(UI)?|pringNode|electionContext)|HwShaderNode|Node|Co(ntext(Command)?|m(ponentShape|mand))|T(oolCommand|ransform(ationMatrix)?)|IkSolver(Node)?|3dModelView|ObjectSet|D(eformerNode|ata|ragAndDropBehavior)|PolyT(weakUVCommand|rg)|EmitterNode|F(i(eldNode|leTranslator)|luidEmitterNode)|LocatorNode))|E(ulerRotation|vent(Message)?)|ayatomr|Vector(Array)?|Quaternion|F(n(R(otateManip|eflectShader|adialField)|G(e(nericAttribute|ometry(Data|Filter))|ravityField)|M(otionPath|es(sageAttribute|h(Data)?)|a(nip3D|trix(Data|Attribute)))|B(l(innShader|endShapeDeformer)|ase)|S(caleManip|t(ateManip|ring(Data|ArrayData))|ingleIndexedComponent|ubd(Names|Data)?|p(hereData|otLight)|et|kinCluster)|HikEffector|N(on(ExtendedLight|AmbientLight)|u(rbs(Surface(Data)?|Curve(Data)?)|meric(Data|Attribute))|ewtonField)|C(haracter|ircleSweepManip|ompo(nent(ListData)?|undAttribute)|urveSegmentManip|lip|amera)|T(ypedAttribute|oggleManip|urbulenceField|r(ipleIndexedComponent|ansform))|I(ntArrayData|k(Solver|Handle|Joint|Effector))|D(ynSweptGeometryData|i(s(cManip|tanceManip)|rection(Manip|alLight))|ouble(IndexedComponent|ArrayData)|ependencyNode|a(ta|gNode)|ragField)|U(ni(tAttribute|formField)|Int64ArrayData)|P(hong(Shader|EShader)|oint(On(SurfaceManip|CurveManip)|Light|ArrayData)|fxGeometry|lugin(Data)?|arti(cleSystem|tion))|E(numAttribute|xpression)|V(o(lume(Light|AxisField)|rtexField)|ectorArrayData)|KeyframeDelta(Move|B(lockAddRemove|reakdown)|Scale|Tangent|InfType|Weighted|AddRemove)?|F(ield|luid|reePointTriadManip)|W(ireDeformer|eightGeometryFilter)|L(ight(DataAttribute)?|a(yeredShader|ttice(D(eformer|ata))?|mbertShader))|A(ni(sotropyShader|mCurve)|ttribute|irField|r(eaLight|rayAttrsData)|mbientLight))?|ile(IO|Object)|eedbackLine|loat(Matrix|Point(Array)?|Vector(Array)?|Array))|L(i(ghtLinks|brary)|ockMessage)|A(n(im(Message|C(ontrol|urveC(hange|lipboard(Item(Array)?)?))|Util)|gle)|ttribute(Spec(Array)?|Index)|r(rayData(Builder|Handle)|g(Database|Parser|List))))|t(hreePointArcCtx|ime(Control|Port|rX)|o(ol(Button|HasOptions|Collection|Dropped|PropertyWindow)|NativePath |upper|kenize(List )?|l(ower|erance)|rus|ggle(WindowVisibility|Axis)?)|u(rbulence|mble(Ctx)?)|ex(RotateContext|M(oveContext|anipContext)|t(ScrollList|Curves|ure(HairColor |DisplacePlane |PlacementContext|Window)|ToShelf |Field(Grp|ButtonGrp)?)?|S(caleContext|electContext|mudgeUVContext)|WinToolCtx)|woPointArcCtx|a(n(gentConstraint)?|bLayout)|r(im|unc(ate(HairCache|FluidCache))?|a(ns(formLimits|lator)|c(e|k(Ctx)?))))|i(s(olateSelect|Connected|True|Dirty|ParentOf |Valid(String |ObjectName |UiName )|AnimCurve )|n(s(tance(r)?|ert(Joint(Ctx)?|K(not(Surface|Curve)|eyCtx)))|heritTransform|t(S(crollBar|lider(Grp)?)|er(sect|nalVar|ToUI )|Field(Grp)?))|conText(Radio(Button|Collection)|Button|StaticLabel|CheckBox)|temFilter(Render|Type|Attr)?|prEngine|k(S(ystem(Info)?|olver|plineHandleCtx)|Handle(Ctx|DisplayScale)?|fkDisplayMethod)|m(portComposerCurves |fPlugins|age))|o(ceanNurbsPreviewPlane |utliner(Panel|Editor)|p(tion(Menu(Grp)?|Var)|en(GLExtension|MayaPref))|verrideModifier|ffset(Surface|Curve(OnSurface)?)|r(ientConstraint|bit(Ctx)?)|b(soleteProc |j(ect(Center|Type(UI)?|Layer )|Exists)))|d(yn(RelEd(itor|Panel)|Globals|C(ontrol|ache)|P(a(intEditor|rticleCtx)|ref)|Exp(ort|ression)|amicLoad)|i(s(connect(Joint|Attr)|tanceDim(Context|ension)|pla(y(RGBColor|S(tats|urface|moothness)|C(olor|ull)|Pref|LevelOfDetail|Affected)|cementToPoly)|kCache|able)|r(name |ect(ionalLight|KeyCtx)|map)|mWhen)|o(cServer|Blur|t(Product )?|ubleProfileBirailSurface|peSheetEditor|lly(Ctx)?)|uplicate(Surface|Curve)?|e(tach(Surface|Curve|DeviceAttr)|vice(Panel|Editor)|f(ine(DataServer|VirtualDevice)|ormer|ault(Navigation|LightListCheckBox))|l(ete(Sh(elfTab |adingGroupsAndMaterials )|U(nusedBrushes |I)|Attr)?|randstr)|g_to_rad)|agPose|r(opoffLocator|ag(gerContext)?)|g(timer|dirty|Info|eval))|CBG |u(serCtx|n(t(angleUV|rim)|i(t|form)|do(Info)?|loadPlugin|assignInputDevice|group)|iTemplate|p(dateAE |Axis)|v(Snapshot|Link))|joint(C(tx|luster)|DisplayScale|Lattice)?|p(sd(ChannelOutliner|TextureFile|E(ditTextureFile|xport))|close|i(c(ture|kWalk)|xelMove)|o(se|int(MatrixMult |C(onstraint|urveConstraint)|On(Surface|Curve)|Position|Light)|p(upMenu|en)|w|l(y(Reduce|GeoSampler|M(irrorFace|ove(UV|Edge|Vertex|Facet(UV)?)|erge(UV|Edge(Ctx)?|Vertex|Facet(Ctx)?)|ap(Sew(Move)?|Cut|Del))|B(oolOp|evel|l(indData|endColor))|S(traightenUVBorder|oftEdge|u(perCtx|bdivide(Edge|Facet))|p(her(icalProjection|e)|lit(Ring|Ctx|Edge|Vertex)?)|e(tToFaceNormal|parate|wEdge|lect(Constraint(Monitor)?|EditCtx))|mooth)|Normal(izeUV|PerVertex)?|C(hipOff|ylind(er|ricalProjection)|o(ne|pyUV|l(or(BlindData|Set|PerVertex)|lapse(Edge|Facet)))|u(t(Ctx)?|be)|l(ipboard|oseBorder)|acheMonitor|rea(seEdge|teFacet(Ctx)?))|T(o(Subdiv|rus)|r(iangulate|ansfer))|In(stallAction|fo)|Options|D(uplicate(Edge|AndConnect)|el(Edge|Vertex|Facet))|U(nite|VSet)|P(yramid|oke|lan(e|arProjection)|r(ism|ojection))|E(ditUV|valuate|xtrude(Edge|Facet))|Qu(eryBlindData|ad)|F(orceUV|lip(UV|Edge))|WedgeFace|L(istComponentConversion|ayoutUV)|A(utoProjection|ppend(Vertex|FacetCtx)?|verage(Normal|Vertex)))|eVectorConstraint))|utenv|er(cent|formanceOptions)|fxstrokes|wd|l(uginInfo|a(y(b(last|ackOptions))?|n(e|arSrf)))|a(steKey|ne(l(History|Configuration)?|Layout)|thAnimation|irBlend|use|lettePort|r(ti(cle(RenderInfo|Instancer|Exists)?|tion)|ent(Constraint)?|am(Dim(Context|ension)|Locator)))|r(int|o(j(ect(ion(Manip|Context)|Curve|Tangent)|FileViewer)|pMo(dCtx|ve)|gress(Bar|Window)|mptDialog)|eloadRefEd))|e(n(codeString|d(sWith |String )|v|ableDevice)|dit(RenderLayer(Globals|Members)|or(Template)?|DisplayLayer(Globals|Members)|AttrLimits )|v(ent|al(Deferred|Echo)?)|quivalent(Tol | )|ffector|r(f|ror)|x(clusiveLightCheckBox|t(end(Surface|Curve)|rude)|ists|p(ortComposerCurves |ression(EditorListen)?)?|ec(uteForEachObject )?|actWorldBoundingBox)|mit(ter)?)|v(i(sor|ew(Set|HeadOn|2dToolCtx|C(lipPlane|amera)|Place|Fit|LookAt))|o(lumeAxis|rtex)|e(ctorize|rifyCmd )|alidateShelfName )|key(Tangent|frame(Region(MoveKeyCtx|S(caleKeyCtx|e(tKeyCtx|lectKeyCtx))|CurrentTimeCtx|TrackCtx|InsertKeyCtx|D(irectKeyCtx|ollyCtx))|Stats|Outliner)?)|qu(it|erySubdiv)|f(c(heck|lose)|i(nd(RelatedSkinCluster |MenuItem |er|Keyframe|AllIntersections )|tBspline|l(ter(StudioImport|Curve|Expand)?|e(BrowserDialog|test|Info|Dialog|Extension )?|letCurve)|rstParentOf )|o(ntDialog|pen|rmLayout)|print|eof|flush|write|l(o(or|w|at(S(crollBar|lider(Grp|ButtonGrp|2)?)|Eq |Field(Grp)?))|u(shUndo|id(CacheInfo|Emitter|VoxelInfo))|exor)|r(omNativePath |e(eFormFillet|wind|ad)|ameLayout)|get(word|line)|mod)|w(hatIs|i(ndow(Pref)?|re(Context)?)|orkspace|ebBrowser(Prefs)?|a(itCursor|rning)|ri(nkle(Context)?|teTake))|l(s(T(hroughFilter|ype )|UI)?|i(st(Relatives|MenuAnnotation |Sets|History|NodeTypes|C(onnections|ameras)|Transforms |InputDevice(s|Buttons|Axes)|erEditor|DeviceAttachments|Unselected |A(nimatable|ttr))|n(step|eIntersection )|ght(link|List(Panel|Editor)?))|o(ckNode|okThru|ft|ad(NewShelf |P(lugin|refObjects)|Fluid)|g)|a(ssoContext|y(out|er(Button|ed(ShaderPort|TexturePort)))|ttice(DeformKeyCtx)?|unch(ImageEditor)?))|a(ssign(Command|InputDevice)|n(notate|im(C(one|urveEditor)|Display|View)|gle(Between)?)|tt(ach(Surface|Curve|DeviceAttr)|r(ibute(Menu|Info|Exists|Query)|NavigationControlGrp|Co(ntrolGrp|lorSliderGrp|mpatibility)|PresetEditWin|EnumOptionMenu(Grp)?|Field(Grp|SliderGrp)))|i(r|mConstraint)|d(d(NewShelfTab|Dynamic|PP|Attr(ibuteEditorNodeHelp)?)|vanceToNextDrivenKey)|uto(Place|Keyframe)|pp(endStringArray|l(y(Take|AttrPreset)|icationName))|ffect(s|edNet)|l(i(as(Attr)?|gn(Surface|C(tx|urve))?)|lViewFit)|r(c(len|Len(DimContext|gthDimension))|t(BuildPaintMenu|Se(tPaintCtx|lectCtx)|3dPaintCtx|UserPaintCtx|PuttyCtx|FluidAttrCtx|Attr(SkinPaintCtx|Ctx|PaintVertexCtx))|rayMapper)|mbientLight|b(s|out))|r(igid(Body|Solver)|o(t(at(ionInterpolation|e))?|otOf |undConstantRadius|w(ColumnLayout|Layout)|ll(Ctx)?)|un(up|TimeCommand)|e(s(olutionNode|et(Tool|AE )|ampleFluid)|hash|n(der(GlobalsNode|Manip|ThumbnailUpdate|Info|er|Partition|QualityNode|Window(SelectContext|Editor)|LayerButton)?|ame(SelectionList |UI|Attr)?)|cord(Device|Attr)|target|order(Deformers)?|do|v(olve|erse(Surface|Curve))|quires|f(ineSubdivSelectionList|erence(Edit|Query)?|resh(AE )?)|loadImage|adTake|root|move(MultiInstance|Joint)|build(Surface|Curve))|a(n(d(state|omizeFollicles )?|geControl)|d(i(o(MenuItemCollection|Button(Grp)?|Collection)|al)|_to_deg)|mpColorPort)|gb_to_hsv)|g(o(toBindPose |al)|e(t(M(odifiers|ayaPanelTypes )|Classification|InputDeviceRange|pid|env|DefaultBrush|Pa(nel|rticleAttr)|F(ileList|luidAttr)|A(ttr|pplicationVersionAsFloat ))|ometryConstraint)|l(Render(Editor)?|obalStitch)|a(uss|mma)|r(id(Layout)?|oup(ObjectsByName )?|a(dientControl(NoAttr)?|ph(SelectContext|TrackCtx|DollyCtx)|vity|bColor))|match)|x(pmPicker|form|bmLangPathList )|m(i(n(imizeApp)?|rrorJoint)|o(del(CurrentTimeCtx|Panel|Editor)|use|v(In|e(IKtoFK |VertexAlongDirection|KeyCtx)?|Out))|u(te|ltiProfileBirailSurface)|e(ssageLine|nu(BarLayout|Item(ToShelf )?|Editor)?|mory)|a(nip(Rotate(Context|LimitsCtx)|Move(Context|LimitsCtx)|Scale(Context|LimitsCtx)|Options)|tch|ke(Roll |SingleSurface|TubeOn |Identity|Paintable|bot|Live)|rker|g|x))|b(in(Membership|d(Skin|Pose))|o(neLattice|undary|x(ZoomCtx|DollyCtx))|u(tton(Manip)?|ild(BookmarkMenu|KeyframeMenu)|fferCurve)|e(ssel|vel(Plus)?)|l(indDataType|end(Shape(Panel|Editor)?|2|TwoAttr))|a(sename(Ex | )|tchRender|ke(Results|Simulation|Clip|PartialHistory|FluidShading )))))\\\\b' },\n         { caseInsensitive: true,\n           token: 'support.constant.mel',\n           regex: '\\\\b(s(h(ellTessellate|a(d(ing(Map|Engine)|erGlow)|pe))|n(ow|apshot(Shape)?)|c(ulpt|aleConstraint|ript)|t(yleCurve|itch(Srf|AsNurbsShell)|u(cco|dioClearCoat)|encil|roke(Globals)?)|i(ngleShadingSwitch|mpleVolumeShader)|o(ftMod(Manip|Handle)?|lidFractal)|u(rface(Sha(der|pe)|Info|EdManip|VarGroup|Luminance)|b(Surface|d(M(odifier(UV|World)?|ap(SewMove|Cut|pingManip))|B(lindData|ase)|iv(ReverseFaces|SurfaceVarGroup|Co(llapse|mponentId)|To(Nurbs|Poly))?|HierBlind|CleanTopology|Tweak(UV)?|P(lanarProj|rojManip)|LayoutUV|A(ddTopology|utoProj))|Curve))|p(BirailSrf|otLight|ring)|e(tRange|lectionListOperator)|k(inCluster|etchPlane)|quareSrf|ampler(Info)?|m(ooth(Curve|TangentSrf)|ear))|h(svToRgb|yper(GraphInfo|View|Layout)|ik(Solver|Handle|Effector)|oldMatrix|eightField|w(Re(nderGlobals|flectionMap)|Shader)|a(ir(System|Constraint|TubeShader)|rd(enPoint|wareRenderGlobals)))|n(o(n(ExtendedLightShapeNode|Linear|AmbientLightShapeNode)|ise|rmalConstraint)|urbs(Surface|Curve|T(oSubdiv(Proc)?|essellate)|DimShape)|e(twork|wtonField))|c(h(o(ice|oser)|ecker|aracter(Map|Offset)?)|o(n(straint|tr(olPoint|ast)|dition)|py(ColorSet|UVSet))|urve(Range|Shape|Normalizer(Linear|Angle)?|In(tersect|fo)|VarGroup|From(Mesh(CoM|Edge)?|Su(rface(Bnd|CoS|Iso)?|bdiv(Edge|Face)?)))|l(ip(Scheduler|Library)|o(se(stPointOnSurface|Surface|Curve)|th|ud)|uster(Handle)?|amp)|amera(View)?|r(eate(BPManip|ColorSet|UVSet)|ater))|t(ime(ToUnitConversion|Function)?|oo(nLineAttributes|lDrawManip)|urbulenceField|ex(BaseDeformManip|ture(BakeSet|2d|ToGeom|3d|Env)|SmudgeUVManip|LatticeDeformManip)|weak|angentConstraint|r(i(pleShadingSwitch|m(WithBoundaries)?)|ansform(Geometry)?))|i(n(s(tancer|ertKnot(Surface|Curve))|tersectSurface)|k(RPsolver|MCsolver|S(ystem|olver|Csolver|plineSolver)|Handle|PASolver|Effector)|m(plicit(Box|Sphere|Cone)|agePlane))|o(cean(Shader)?|pticalFX|ffset(Surface|C(os|urve))|ldBlindDataBase|rient(Constraint|ationMarker)|bject(RenderFilter|MultiFilter|BinFilter|S(criptFilter|et)|NameFilter|TypeFilter|Filter|AttrFilter))|d(yn(Globals|Base)|i(s(tance(Between|DimShape)|pla(yLayer(Manager)?|cementShader)|kCache)|rect(ionalLight|edDisc)|mensionShape)|o(ubleShadingSwitch|f)|pBirailSrf|e(tach(Surface|Curve)|pendNode|f(orm(Bend|S(ine|quash)|Twist|ableShape|F(unc|lare)|Wave)|ault(RenderUtilityList|ShaderList|TextureList|LightList))|lete(Co(lorSet|mponent)|UVSet))|ag(Node|Pose)|r(opoffLocator|agField))|u(seBackground|n(trim|i(t(Conversion|ToTimeConversion)|formField)|known(Transform|Dag)?)|vChooser)|j(iggle|oint(Cluster|Ffd|Lattice)?)|p(sdFileTex|hong(E)?|o(s(tProcessList|itionMarker)|int(MatrixMult|Constraint|On(SurfaceInfo|CurveInfo)|Emitter|Light)|l(y(Reduce|M(irror|o(difier(UV|World)?|ve(UV|Edge|Vertex|Face(tUV)?))|erge(UV|Edge|Vert|Face)|ap(Sew(Move)?|Cut|Del))|B(oolOp|evel|lindData|ase)|S(traightenUVBorder|oftEdge|ubd(Edge|Face)|p(h(ere|Proj)|lit(Ring|Edge|Vert)?)|e(parate|wEdge)|mooth(Proxy|Face)?)|Normal(izeUV|PerVertex)?|C(hipOff|yl(inder|Proj)|o(ne|pyUV|l(orPerVertex|lapse(Edge|F)))|u(t(Manip(Container)?)?|be)|loseBorder|rea(seEdge|t(or|eFace)))|T(o(Subdiv|rus)|weak(UV)?|r(iangulate|ansfer))|OptUvs|D(uplicateEdge|el(Edge|Vertex|Facet))|Unite|P(yramid|oke(Manip)?|lan(e|arProj)|r(i(sm|mitive)|oj))|Extrude(Edge|Vertex|Face)|VertexNormalManip|Quad|Flip(UV|Edge)|WedgeFace|LayoutUV|A(utoProj|ppend(Vertex)?|verageVertex))|eVectorConstraint))|fx(Geometry|Hair|Toon)|l(usMinusAverage|a(n(e|arTrimSurface)|ce(2dTexture|3dTexture)))|a(ssMatrix|irBlend|r(ti(cle(SamplerInfo|C(olorMapper|loud)|TranspMapper|IncandMapper|AgeMapper)?|tion)|ent(Constraint|Tessellate)|amDimension))|r(imitive|o(ject(ion|Curve|Tangent)|xyManager)))|e(n(tity|v(Ball|ironmentFog|S(phere|ky)|C(hrome|ube)|Fog))|x(t(end(Surface|Curve)|rude)|p(lodeNurbsShell|ression)))|v(iewManip|o(lume(Shader|Noise|Fog|Light|AxisField)|rtexField)|e(ctor(RenderGlobals|Product)|rtexBakeSet))|quadShadingSwitch|f(i(tBspline|eld|l(ter(Resample|Simplify|ClosestSample|Euler)?|e|letCurve))|o(urByFourMatrix|llicle)|urPointOn(MeshInfo|Subd)|f(BlendSrf(Obsolete)?|d|FilletSrf)|l(ow|uid(S(hape|liceManip)|Texture(2D|3D)|Emitter)|exorShape)|ra(ctal|meCache))|w(tAddMatrix|ire|ood|eightGeometryFilter|ater|rap)|l(ight(Info|Fog|Li(st|nker))?|o(cator|okAt|d(Group|Thresholds)|ft)|uminance|ea(stSquaresModifier|ther)|a(yered(Shader|Texture)|ttice|mbert))|a(n(notationShape|i(sotropic|m(Blend(InOut)?|C(urve(T(T|U|L|A)|U(T|U|L|A))?|lip)))|gleBetween)|tt(ach(Surface|Curve)|rHierarchyTest)|i(rField|mConstraint)|dd(Matrix|DoubleLinear)|udio|vg(SurfacePoints|NurbsSurfacePoints|Curves)|lign(Manip|Surface|Curve)|r(cLengthDimension|tAttrPaintTest|eaLight|rayMapper)|mbientLight|bstractBase(NurbsConversion|Create))|r(igid(Body|Solver|Constraint)|o(ck|undConstantRadius)|e(s(olution|ultCurve(TimeTo(Time|Unitless|Linear|Angular))?)|nder(Rect|Globals(List)?|Box|Sphere|Cone|Quality|L(ight|ayer(Manager)?))|cord|v(olve(dPrimitive)?|erse(Surface|Curve)?)|f(erence|lect)|map(Hsv|Color|Value)|build(Surface|Curve))|a(dialField|mp(Shader)?)|gbToHsv|bfSrf)|g(uide|eo(Connect(or|able)|metry(Shape|Constraint|VarGroup|Filter))|lobal(Stitch|CacheControl)|ammaCorrect|r(id|oup(Id|Parts)|a(nite|vityField)))|Fur(Globals|Description|Feedback|Attractors)|xformManip|m(o(tionPath|untain|vie)|u(te|lt(Matrix|i(plyDivide|listerLight)|DoubleLinear))|pBirailSrf|e(sh(VarGroup)?|ntalray(Texture|IblShape))|a(terialInfo|ke(Group|Nurb(sSquare|Sphere|C(ylinder|ircle|one|ube)|Torus|Plane)|CircularArc|T(hreePointCircularArc|extCurves|woPointCircularArc))|rble))|b(irailSrf|o(neLattice|olean|undary(Base)?)|u(lge|mp(2d|3d))|evel(Plus)?|l(in(n|dDataTemplate)|end(Shape|Color(s|Sets)|TwoAttr|Device|Weighted)?)|a(se(GeometryVarGroup|ShadingSwitch|Lattice)|keSet)|r(ownian|ush)))\\\\b' },\n         { caseInsensitive: true,\n           token: 'keyword.control.mel',\n           regex: '\\\\b(if|in|else|for|while|break|continue|case|default|do|switch|return|switch|case|source|catch|alias)\\\\b' },\n         { token: 'keyword.other.mel', regex: '\\\\b(global)\\\\b' },\n         { caseInsensitive: true,\n           token: 'constant.language.mel',\n           regex: '\\\\b(null|undefined)\\\\b' },\n         { token: 'constant.numeric.mel',\n           regex: '\\\\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\\\\.?[0-9]*)|(\\\\.[0-9]+))((e|E)(\\\\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f)?\\\\b' },\n         { token: 'punctuation.definition.string.begin.mel',\n           regex: '\"',\n           push: \n            [ { token: 'constant.character.escape.mel', regex: '\\\\\\\\.' },\n              { token: 'punctuation.definition.string.end.mel',\n                regex: '\"',\n                next: 'pop' },\n              { defaultToken: 'string.quoted.double.mel' } ] },\n         \n         { token: [ 'variable.other.mel', 'punctuation.definition.variable.mel' ],\n           regex: '(\\\\$)([a-zA-Z_\\\\x7f-\\\\xff][a-zA-Z0-9_\\\\x7f-\\\\xff]*?\\\\b)' },\n           \n         { token: 'punctuation.definition.string.begin.mel',\n           regex: '\\'',\n           push: \n            [ { token: 'constant.character.escape.mel', regex: '\\\\\\\\.' },\n              { token: 'punctuation.definition.string.end.mel',\n                regex: '\\'',\n                next: 'pop' },\n              { defaultToken: 'string.quoted.single.mel' } ] },\n         \n         { token: 'constant.language.mel',\n           regex: '\\\\b(false|true|yes|no|on|off)\\\\b' },\n           \n         { token: 'punctuation.definition.comment.mel',\n           regex: '/\\\\*',\n           push: \n            [ { token: 'punctuation.definition.comment.mel',\n                regex: '\\\\*/',\n                next: 'pop' },\n              { defaultToken: 'comment.block.mel' } ] },\n         \n         { token: [ 'comment.line.double-slash.mel', 'punctuation.definition.comment.mel' ],\n           regex: '(//)(.*$\\\\n?)' },\n           \n         { caseInsensitive: true,\n           token: 'keyword.operator.mel',\n           regex: '\\\\b(instanceof)\\\\b' },\n         { token: 'keyword.operator.symbolic.mel',\n           regex: '[-\\\\!\\\\%\\\\&\\\\*\\\\+\\\\=\\\\/\\\\?\\\\:]' },\n         \n         { token: [ 'meta.preprocessor.mel', 'punctuation.definition.preprocessor.mel' ],\n           regex: '(^[ \\\\t]*)((?:#)[a-zA-Z]+)' },\n         \n         { token: [ 'meta.function.mel', 'keyword.other.mel', 'storage.type.mel', 'entity.name.function.mel', 'punctuation.section.function.mel' ],\n           regex: '((?:global\\\\s*)?proc)\\\\s*(\\\\w+\\\\s*\\\\[?\\\\]?\\\\s+|\\\\s+)([A-Za-z_][A-Za-z0-9_\\\\.]*)(\\\\s*(\\\\())',\n           push: \n            [ { include: '$self' },\n              { token: 'punctuation.section.function.mel',\n                regex: '\\\\)',\n                next: 'pop' },\n              { defaultToken: 'meta.function.mel' } ] }\n              \n              ] }\n    \n    this.normalizeRules();\n};\n\noop.inherits(MELHighlightRules, TextHighlightRules);\n\nexports.MELHighlightRules = MELHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/mel\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/mel_highlight_rules\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar MELHighlightRules = require(\"./mel_highlight_rules\").MELHighlightRules;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = MELHighlightRules;\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n    this.$id = \"ace/mode/mel\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-mushcode.js",
    "content": "ace.define(\"ace/mode/mushcode_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar MushCodeRules = function() {\n\n\n    var keywords = (\n \"@if|\"+\n \"@ifelse|\"+\n \"@switch|\"+\n \"@halt|\"+\n \"@dolist|\"+\n \"@create|\"+\n \"@scent|\"+\n \"@sound|\"+\n \"@touch|\"+\n \"@ataste|\"+\n \"@osound|\"+\n \"@ahear|\"+\n \"@aahear|\"+\n \"@amhear|\"+\n \"@otouch|\"+\n \"@otaste|\"+\n \"@drop|\"+\n \"@odrop|\"+\n \"@adrop|\"+\n \"@dropfail|\"+\n \"@odropfail|\"+\n \"@smell|\"+\n \"@oemit|\"+\n \"@emit|\"+\n \"@pemit|\"+\n \"@parent|\"+\n \"@clone|\"+\n \"@taste|\"+\n \"whisper|\"+\n \"page|\"+\n \"say|\"+\n \"pose|\"+\n \"semipose|\"+\n \"teach|\"+\n \"touch|\"+\n \"taste|\"+\n \"smell|\"+\n \"listen|\"+\n \"look|\"+\n \"move|\"+\n \"go|\"+\n \"home|\"+\n \"follow|\"+\n \"unfollow|\"+\n \"desert|\"+\n \"dismiss|\"+\n \"@tel\"\n    );\n\n    var builtinConstants = (\n        \"=#0\"\n    );\n\n    var builtinFunctions = (\n \"default|\"+\n \"edefault|\"+\n \"eval|\"+\n \"get_eval|\"+\n \"get|\"+\n \"grep|\"+\n \"grepi|\"+\n \"hasattr|\"+\n \"hasattrp|\"+\n \"hasattrval|\"+\n \"hasattrpval|\"+\n \"lattr|\"+\n \"nattr|\"+\n \"poss|\"+\n \"udefault|\"+\n \"ufun|\"+\n \"u|\"+\n \"v|\"+\n \"uldefault|\"+\n \"xget|\"+\n \"zfun|\"+\n \"band|\"+\n \"bnand|\"+\n \"bnot|\"+\n \"bor|\"+\n \"bxor|\"+\n \"shl|\"+\n \"shr|\"+\n \"and|\"+\n \"cand|\"+\n \"cor|\"+\n \"eq|\"+\n \"gt|\"+\n \"gte|\"+\n \"lt|\"+\n \"lte|\"+\n \"nand|\"+\n \"neq|\"+\n \"nor|\"+\n \"not|\"+\n \"or|\"+\n \"t|\"+\n \"xor|\"+\n \"con|\"+\n \"entrances|\"+\n \"exit|\"+\n \"followers|\"+\n \"home|\"+\n \"lcon|\"+\n \"lexits|\"+\n \"loc|\"+\n \"locate|\"+\n \"lparent|\"+\n \"lsearch|\"+\n \"next|\"+\n \"num|\"+\n \"owner|\"+\n \"parent|\"+\n \"pmatch|\"+\n \"rloc|\"+\n \"rnum|\"+\n \"room|\"+\n \"where|\"+\n \"zone|\"+\n \"worn|\"+\n \"held|\"+\n \"carried|\"+\n \"acos|\"+\n \"asin|\"+\n \"atan|\"+\n \"ceil|\"+\n \"cos|\"+\n \"e|\"+\n \"exp|\"+\n \"fdiv|\"+\n \"fmod|\"+\n \"floor|\"+\n \"log|\"+\n \"ln|\"+\n \"pi|\"+\n \"power|\"+\n \"round|\"+\n \"sin|\"+\n \"sqrt|\"+\n \"tan|\"+\n \"aposs|\"+\n \"andflags|\"+\n \"conn|\"+\n \"commandssent|\"+\n \"controls|\"+\n \"doing|\"+\n \"elock|\"+\n \"findable|\"+\n \"flags|\"+\n \"fullname|\"+\n \"hasflag|\"+\n \"haspower|\"+\n \"hastype|\"+\n \"hidden|\"+\n \"idle|\"+\n \"isbaker|\"+\n \"lock|\"+\n \"lstats|\"+\n \"money|\"+\n \"who|\"+\n \"name|\"+\n \"nearby|\"+\n \"obj|\"+\n \"objflags|\"+\n \"photo|\"+\n \"poll|\"+\n \"powers|\"+\n \"pendingtext|\"+\n \"receivedtext|\"+\n \"restarts|\"+\n \"restarttime|\"+\n \"subj|\"+\n \"shortestpath|\"+\n \"tmoney|\"+\n \"type|\"+\n \"visible|\"+\n \"cat|\"+\n \"element|\"+\n \"elements|\"+\n \"extract|\"+\n \"filter|\"+\n \"filterbool|\"+\n \"first|\"+\n \"foreach|\"+\n \"fold|\"+\n \"grab|\"+\n \"graball|\"+\n \"index|\"+\n \"insert|\"+\n \"itemize|\"+\n \"items|\"+\n \"iter|\"+\n \"last|\"+\n \"ldelete|\"+\n \"map|\"+\n \"match|\"+\n \"matchall|\"+\n \"member|\"+\n \"mix|\"+\n \"munge|\"+\n \"pick|\"+\n \"remove|\"+\n \"replace|\"+\n \"rest|\"+\n \"revwords|\"+\n \"setdiff|\"+\n \"setinter|\"+\n \"setunion|\"+\n \"shuffle|\"+\n \"sort|\"+\n \"sortby|\"+\n \"splice|\"+\n \"step|\"+\n \"wordpos|\"+\n \"words|\"+\n \"add|\"+\n \"lmath|\"+\n \"max|\"+\n \"mean|\"+\n \"median|\"+\n \"min|\"+\n \"mul|\"+\n \"percent|\"+\n \"sign|\"+\n \"stddev|\"+\n \"sub|\"+\n \"val|\"+\n \"bound|\"+\n \"abs|\"+\n \"inc|\"+\n \"dec|\"+\n \"dist2d|\"+\n \"dist3d|\"+\n \"div|\"+\n \"floordiv|\"+\n \"mod|\"+\n \"modulo|\"+\n \"remainder|\"+\n \"vadd|\"+\n \"vdim|\"+\n \"vdot|\"+\n \"vmag|\"+\n \"vmax|\"+\n \"vmin|\"+\n \"vmul|\"+\n \"vsub|\"+\n \"vunit|\"+\n \"regedit|\"+\n \"regeditall|\"+\n \"regeditalli|\"+\n \"regediti|\"+\n \"regmatch|\"+\n \"regmatchi|\"+\n \"regrab|\"+\n \"regraball|\"+\n \"regraballi|\"+\n \"regrabi|\"+\n \"regrep|\"+\n \"regrepi|\"+\n \"after|\"+\n \"alphamin|\"+\n \"alphamax|\"+\n \"art|\"+\n \"before|\"+\n \"brackets|\"+\n \"capstr|\"+\n \"case|\"+\n \"caseall|\"+\n \"center|\"+\n \"containsfansi|\"+\n \"comp|\"+\n \"decompose|\"+\n \"decrypt|\"+\n \"delete|\"+\n \"edit|\"+\n \"encrypt|\"+\n \"escape|\"+\n \"if|\"+\n \"ifelse|\"+\n \"lcstr|\"+\n \"left|\"+\n \"lit|\"+\n \"ljust|\"+\n \"merge|\"+\n \"mid|\"+\n \"ostrlen|\"+\n \"pos|\"+\n \"repeat|\"+\n \"reverse|\"+\n \"right|\"+\n \"rjust|\"+\n \"scramble|\"+\n \"secure|\"+\n \"space|\"+\n \"spellnum|\"+\n \"squish|\"+\n \"strcat|\"+\n \"strmatch|\"+\n \"strinsert|\"+\n \"stripansi|\"+\n \"stripfansi|\"+\n \"strlen|\"+\n \"switch|\"+\n \"switchall|\"+\n \"table|\"+\n \"tr|\"+\n \"trim|\"+\n \"ucstr|\"+\n \"unsafe|\"+\n \"wrap|\"+\n \"ctitle|\"+\n \"cwho|\"+\n \"channels|\"+\n \"clock|\"+\n \"cflags|\"+\n \"ilev|\"+\n \"itext|\"+\n \"inum|\"+\n \"convsecs|\"+\n \"convutcsecs|\"+\n \"convtime|\"+\n \"ctime|\"+\n \"etimefmt|\"+\n \"isdaylight|\"+\n \"mtime|\"+\n \"secs|\"+\n \"msecs|\"+\n \"starttime|\"+\n \"time|\"+\n \"timefmt|\"+\n \"timestring|\"+\n \"utctime|\"+\n \"atrlock|\"+\n \"clone|\"+\n \"create|\"+\n \"cook|\"+\n \"dig|\"+\n \"emit|\"+\n \"lemit|\"+\n \"link|\"+\n \"oemit|\"+\n \"open|\"+\n \"pemit|\"+\n \"remit|\"+\n \"set|\"+\n \"tel|\"+\n \"wipe|\"+\n \"zemit|\"+\n \"fbcreate|\"+\n \"fbdestroy|\"+\n \"fbwrite|\"+\n \"fbclear|\"+\n \"fbcopy|\"+\n \"fbcopyto|\"+\n \"fbclip|\"+\n \"fbdump|\"+\n \"fbflush|\"+\n \"fbhset|\"+\n \"fblist|\"+\n \"fbstats|\"+\n \"qentries|\"+\n \"qentry|\"+\n \"play|\"+\n \"ansi|\"+\n \"break|\"+\n \"c|\"+\n \"asc|\"+\n \"die|\"+\n \"isdbref|\"+\n \"isint|\"+\n \"isnum|\"+\n \"isletters|\"+\n \"linecoords|\"+\n \"localize|\"+\n \"lnum|\"+\n \"nameshort|\"+\n \"null|\"+\n \"objeval|\"+\n \"r|\"+\n \"rand|\"+\n \"s|\"+\n \"setq|\"+\n \"setr|\"+\n \"soundex|\"+\n \"soundslike|\"+\n \"valid|\"+\n \"vchart|\"+\n \"vchart2|\"+\n \"vlabel|\"+\n \"@@|\"+\n \"bakerdays|\"+\n \"bodybuild|\"+\n \"box|\"+\n \"capall|\"+\n \"catalog|\"+\n \"children|\"+\n \"ctrailer|\"+\n \"darttime|\"+\n \"debt|\"+\n \"detailbar|\"+\n \"exploredroom|\"+\n \"fansitoansi|\"+\n \"fansitoxansi|\"+\n \"fullbar|\"+\n \"halfbar|\"+\n \"isdarted|\"+\n \"isnewbie|\"+\n \"isword|\"+\n \"lambda|\"+\n \"lobjects|\"+\n \"lplayers|\"+\n \"lthings|\"+\n \"lvexits|\"+\n \"lvobjects|\"+\n \"lvplayers|\"+\n \"lvthings|\"+\n \"newswrap|\"+\n \"numsuffix|\"+\n \"playerson|\"+\n \"playersthisweek|\"+\n \"randomad|\"+\n \"randword|\"+\n \"realrandword|\"+\n \"replacechr|\"+\n \"second|\"+\n \"splitamount|\"+\n \"strlenall|\"+\n \"text|\"+\n \"third|\"+\n \"tofansi|\"+\n \"totalac|\"+\n \"unique|\"+\n \"getaddressroom|\"+\n \"listpropertycomm|\"+\n \"listpropertyres|\"+\n \"lotowner|\"+\n \"lotrating|\"+\n \"lotratingcount|\"+\n \"lotvalue|\"+\n \"boughtproduct|\"+\n \"companyabb|\"+\n \"companyicon|\"+\n \"companylist|\"+\n \"companyname|\"+\n \"companyowners|\"+\n \"companyvalue|\"+\n \"employees|\"+\n \"invested|\"+\n \"productlist|\"+\n \"productname|\"+\n \"productowners|\"+\n \"productrating|\"+\n \"productratingcount|\"+\n \"productsoldat|\"+\n \"producttype|\"+\n \"ratedproduct|\"+\n \"soldproduct|\"+\n \"topproducts|\"+\n \"totalspentonproduct|\"+\n \"totalstock|\"+\n \"transfermoney|\"+\n \"uniquebuyercount|\"+\n \"uniqueproductsbought|\"+\n \"validcompany|\"+\n \"deletepicture|\"+\n \"fbsave|\"+\n \"getpicturesecurity|\"+\n \"haspicture|\"+\n \"listpictures|\"+\n \"picturesize|\"+\n \"replacecolor|\"+\n \"rgbtocolor|\"+\n \"savepicture|\"+\n \"setpicturesecurity|\"+\n \"showpicture|\"+\n \"piechart|\"+\n \"piechartlabel|\"+\n \"createmaze|\"+\n \"drawmaze|\"+\n \"drawwireframe\"\n    );\n    var keywordMapper = this.createKeywordMapper({\n        \"invalid.deprecated\": \"debugger\",\n        \"support.function\": builtinFunctions,\n        \"constant.language\": builtinConstants,\n        \"keyword\": keywords\n    }, \"identifier\");\n\n    var strPre = \"(?:r|u|ur|R|U|UR|Ur|uR)?\";\n\n    var decimalInteger = \"(?:(?:[1-9]\\\\d*)|(?:0))\";\n    var octInteger = \"(?:0[oO]?[0-7]+)\";\n    var hexInteger = \"(?:0[xX][\\\\dA-Fa-f]+)\";\n    var binInteger = \"(?:0[bB][01]+)\";\n    var integer = \"(?:\" + decimalInteger + \"|\" + octInteger + \"|\" + hexInteger + \"|\" + binInteger + \")\";\n\n    var exponent = \"(?:[eE][+-]?\\\\d+)\";\n    var fraction = \"(?:\\\\.\\\\d+)\";\n    var intPart = \"(?:\\\\d+)\";\n    var pointFloat = \"(?:(?:\" + intPart + \"?\" + fraction + \")|(?:\" + intPart + \"\\\\.))\";\n    var exponentFloat = \"(?:(?:\" + pointFloat + \"|\" +  intPart + \")\" + exponent + \")\";\n    var floatNumber = \"(?:\" + exponentFloat + \"|\" + pointFloat + \")\";\n\n    this.$rules = {\n        \"start\" : [\n         {\n                token : \"variable\", // mush substitution register\n                regex : \"%[0-9]{1}\"\n         },\n         {\n                token : \"variable\", // mush substitution register\n                regex : \"%q[0-9A-Za-z]{1}\"\n         },\n         {\n                token : \"variable\", // mush special character register\n                regex : \"%[a-zA-Z]{1}\"\n         },\n         {\n                token: \"variable.language\",\n                regex: \"%[a-z0-9-_]+\"\n         },\n        {\n            token : \"constant.numeric\", // imaginary\n            regex : \"(?:\" + floatNumber + \"|\\\\d+)[jJ]\\\\b\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : floatNumber\n        }, {\n            token : \"constant.numeric\", // long integer\n            regex : integer + \"[lL]\\\\b\"\n        }, {\n            token : \"constant.numeric\", // integer\n            regex : integer + \"\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\\\+|\\\\-|\\\\*|\\\\*\\\\*|\\\\/|\\\\/\\\\/|#|%|<<|>>|\\\\||\\\\^|~|<|>|<=|=>|==|!=|<>|=\"\n        }, {\n            token : \"paren.lparen\",\n            regex : \"[\\\\[\\\\(\\\\{]\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\]\\\\)\\\\}]\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        } ]\n    };\n};\n\noop.inherits(MushCodeRules, TextHighlightRules);\n\nexports.MushCodeRules = MushCodeRules;\n});\n\nace.define(\"ace/mode/folding/pythonic\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(markers) {\n    this.foldingStartMarker = new RegExp(\"([\\\\[{])(?:\\\\s*)$|(\" + markers + \")(?:\\\\s*)(?:#.*)?$\");\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, match.index);\n            if (match[2])\n                return this.indentationBlock(session, row, match.index + match[2].length);\n            return this.indentationBlock(session, row);\n        }\n    }\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/mushcode\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/mushcode_highlight_rules\",\"ace/mode/folding/pythonic\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar MushCodeRules = require(\"./mushcode_highlight_rules\").MushCodeRules;\nvar PythonFoldMode = require(\"./folding/pythonic\").FoldMode;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.HighlightRules = MushCodeRules;\n    this.foldingRules = new PythonFoldMode(\"\\\\:\");\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"#\";\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[\\:]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n   var outdents = {\n        \"pass\": 1,\n        \"return\": 1,\n        \"raise\": 1,\n        \"break\": 1,\n        \"continue\": 1\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        if (input !== \"\\r\\n\" && input !== \"\\r\" && input !== \"\\n\")\n            return false;\n\n        var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens;\n\n        if (!tokens)\n            return false;\n        do {\n            var last = tokens.pop();\n        } while (last && (last.type == \"comment\" || (last.type == \"text\" && last.value.match(/^\\s+$/))));\n\n        if (!last)\n            return false;\n\n        return (last.type == \"keyword\" && outdents[last.value]);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n\n        row += 1;\n        var indent = this.$getIndent(doc.getLine(row));\n        var tab = doc.getTabString();\n        if (indent.slice(-tab.length) == tab)\n            doc.remove(new Range(row, indent.length-tab.length, row, indent.length));\n    };\n\n    this.$id = \"ace/mode/mushcode\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-mysql.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/mysql_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar MysqlHighlightRules = function() {\n\n    var mySqlKeywords = /*sql*/ \"alter|and|as|asc|between|count|create|delete|desc|distinct|drop|from|having|in|insert|into|is|join|like|not|on|or|order|select|set|table|union|update|values|where\" + \"|accessible|action|add|after|algorithm|all|analyze|asensitive|at|authors|auto_increment|autocommit|avg|avg_row_length|before|binary|binlog|both|btree|cache|call|cascade|cascaded|case|catalog_name|chain|change|changed|character|check|checkpoint|checksum|class_origin|client_statistics|close|coalesce|code|collate|collation|collations|column|columns|comment|commit|committed|completion|concurrent|condition|connection|consistent|constraint|contains|continue|contributors|convert|cross|current_date|current_time|current_timestamp|current_user|cursor|data|database|databases|day_hour|day_microsecond|day_minute|day_second|deallocate|dec|declare|default|delay_key_write|delayed|delimiter|des_key_file|describe|deterministic|dev_pop|dev_samp|deviance|directory|disable|discard|distinctrow|div|dual|dumpfile|each|elseif|enable|enclosed|end|ends|engine|engines|enum|errors|escape|escaped|even|event|events|every|execute|exists|exit|explain|extended|fast|fetch|field|fields|first|flush|for|force|foreign|found_rows|full|fulltext|function|general|global|grant|grants|group|groupby_concat|handler|hash|help|high_priority|hosts|hour_microsecond|hour_minute|hour_second|if|ignore|ignore_server_ids|import|index|index_statistics|infile|inner|innodb|inout|insensitive|insert_method|install|interval|invoker|isolation|iterate|key|keys|kill|language|last|leading|leave|left|level|limit|linear|lines|list|load|local|localtime|localtimestamp|lock|logs|low_priority|master|master_heartbeat_period|master_ssl_verify_server_cert|masters|match|max|max_rows|maxvalue|message_text|middleint|migrate|min|min_rows|minute_microsecond|minute_second|mod|mode|modifies|modify|mutex|mysql_errno|natural|next|no|no_write_to_binlog|offline|offset|one|online|open|optimize|option|optionally|out|outer|outfile|pack_keys|parser|partition|partitions|password|phase|plugin|plugins|prepare|preserve|prev|primary|privileges|procedure|processlist|profile|profiles|purge|query|quick|range|read|read_write|reads|real|rebuild|recover|references|regexp|relaylog|release|remove|rename|reorganize|repair|repeatable|replace|require|resignal|restrict|resume|return|returns|revoke|right|rlike|rollback|rollup|row|row_format|rtree|savepoint|schedule|schema|schema_name|schemas|second_microsecond|security|sensitive|separator|serializable|server|session|share|show|signal|slave|slow|smallint|snapshot|soname|spatial|specific|sql|sql_big_result|sql_buffer_result|sql_cache|sql_calc_found_rows|sql_no_cache|sql_small_result|sqlexception|sqlstate|sqlwarning|ssl|start|starting|starts|status|std|stddev|stddev_pop|stddev_samp|storage|straight_join|subclass_origin|sum|suspend|table_name|table_statistics|tables|tablespace|temporary|terminated|to|trailing|transaction|trigger|triggers|truncate|uncommitted|undo|uninstall|unique|unlock|upgrade|usage|use|use_frm|user|user_resources|user_statistics|using|utc_date|utc_time|utc_timestamp|value|variables|varying|view|views|warnings|when|while|with|work|write|xa|xor|year_month|zerofill|begin|do|then|else|loop|repeat\";\n    var builtins = \"by|bool|boolean|bit|blob|decimal|double|enum|float|long|longblob|longtext|medium|mediumblob|mediumint|mediumtext|time|timestamp|tinyblob|tinyint|tinytext|text|bigint|int|int1|int2|int3|int4|int8|integer|float|float4|float8|double|char|varbinary|varchar|varcharacter|precision|date|datetime|year|unsigned|signed|numeric\"\n    var variable = \"charset|clear|connect|edit|ego|exit|go|help|nopager|notee|nowarning|pager|print|prompt|quit|rehash|source|status|system|tee\"\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": builtins,\n        \"keyword\": mySqlKeywords,\n        \"constant\": \"false|true|null|unknown|date|time|timestamp|ODBCdotTable|zerolessFloat\",\n        \"variable.language\": variable\n    }, \"identifier\", true);\n\n    \n    function string(rule) {\n        var start = rule.start;\n        var escapeSeq = rule.escape;\n        return {\n            token: \"string.start\",\n            regex: start,\n            next: [\n                {token: \"constant.language.escape\", regex: escapeSeq},\n                {token: \"string.end\", next: \"start\", regex: start},\n                {defaultToken: \"string\"}\n            ]\n        };\n    }\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment\", regex : \"(?:-- |#).*$\"\n        },  \n        string({start: '\"', escape: /\\\\[0'\"bnrtZ\\\\%_]?/}),\n        string({start: \"'\", escape: /\\\\[0'\"bnrtZ\\\\%_]?/}),\n        DocCommentHighlightRules.getStartRule(\"doc-start\"),\n        {\n            token : \"comment\", // multi line comment\n            regex : /\\/\\*/,\n            next : \"comment\"\n        }, {\n            token : \"constant.numeric\", // hex\n            regex : /0[xX][0-9a-fA-F]+|[xX]'[0-9a-fA-F]+'|0[bB][01]+|[bB]'[01]+'/\n        }, {\n            token : \"constant.numeric\", // float\n            regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, {\n            token : \"constant.class\",\n            regex : \"@@?[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, {\n            token : \"constant.buildin\",\n            regex : \"`[^`]*`\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\\\+|\\\\-|\\\\/|\\\\/\\\\/|%|<@>|@>|<@|&|\\\\^|~|<|>|<=|=>|==|!=|<>|=\"\n        }, {\n            token : \"paren.lparen\",\n            regex : \"[\\\\(]\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\)]\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        } ],\n        \"comment\" : [\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\"}\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\", [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n    this.normalizeRules();\n};\n\noop.inherits(MysqlHighlightRules, TextHighlightRules);\n\nexports.MysqlHighlightRules = MysqlHighlightRules;\n});\n\nace.define(\"ace/mode/mysql\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/mysql_highlight_rules\",\"ace/range\"], function(require, exports, module) {\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"../mode/text\").Mode;\nvar MysqlHighlightRules = require(\"./mysql_highlight_rules\").MysqlHighlightRules;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.HighlightRules = MysqlHighlightRules;\n};\noop.inherits(Mode, TextMode);\n\n(function() {       \n    this.lineCommentStart = [\"--\", \"#\"]; // todo space\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.$id = \"ace/mode/mysql\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-nix.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/c_cpp_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar cFunctions = exports.cFunctions = \"\\\\b(?:hypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len))))\\\\b\"\n\nvar c_cppHighlightRules = function() {\n\n    var keywordControls = (\n        \"break|case|continue|default|do|else|for|goto|if|_Pragma|\" +\n        \"return|switch|while|catch|operator|try|throw|using\"\n    );\n    \n    var storageType = (\n        \"asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|\" +\n        \"_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|\" +\n        \"class|wchar_t|template\"\n    );\n\n    var storageModifiers = (\n        \"const|extern|register|restrict|static|volatile|inline|private|\" +\n        \"protected|public|friend|explicit|virtual|export|mutable|typename|\" +\n        \"constexpr|new|delete\"\n    );\n\n    var keywordOperators = (\n        \"and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq\" +\n        \"const_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace\"\n    );\n\n    var builtinConstants = (\n        \"NULL|true|false|TRUE|FALSE\"\n    );\n\n    var keywordMapper = this.$keywords = this.createKeywordMapper({\n        \"keyword.control\" : keywordControls,\n        \"storage.type\" : storageType,\n        \"storage.modifier\" : storageModifiers,\n        \"keyword.operator\" : keywordOperators,\n        \"variable.language\": \"this\",\n        \"constant.language\": builtinConstants\n    }, \"identifier\");\n\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    this.$rules = { \n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"//\",\n                next : \"singleLineComment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                regex : '[\"].*\\\\\\\\$',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"string\", // multi line string start\n                regex : \"['].*\\\\\\\\$\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"\n            }, {\n                token : \"keyword\", // pre-compiler directives\n                regex : \"#\\\\s*(?:include|import|pragma|line|define|undef|if|ifdef|else|elif|ifndef)\\\\b\",\n                next  : \"directive\"\n            }, {\n                token : \"keyword\", // special case pre-compiler directive\n                regex : \"(?:#\\\\s*endif)\\\\b\"\n            }, {\n                token : \"support.function.C99.c\",\n                regex : cFunctions\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)\"\n            }, {\n              token : \"punctuation.operator\",\n              regex : \"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ],\n        \"singleLineComment\" : [\n            {\n                token : \"comment\",\n                regex : /\\\\$/,\n                next : \"singleLineComment\"\n            }, {\n                token : \"comment\",\n                regex : /$/,\n                next : \"start\"\n            }, {\n                defaultToken: \"comment\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n                next : \"start\"\n            }, {\n                defaultToken : \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n                next : \"start\"\n            }, {\n                defaultToken : \"string\"\n            }\n        ],\n        \"directive\" : [\n            {\n                token : \"constant.other.multiline\",\n                regex : /\\\\/\n            },\n            {\n                token : \"constant.other.multiline\",\n                regex : /.*\\\\/\n            },\n            {\n                token : \"constant.other\",\n                regex : \"\\\\s*<.+?>\",\n                next : \"start\"\n            },\n            {\n                token : \"constant.other\", // single line\n                regex : '\\\\s*[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]',\n                next : \"start\"\n            }, \n            {\n                token : \"constant.other\", // single line\n                regex : \"\\\\s*['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\",\n                next : \"start\"\n            },\n            {\n                token : \"constant.other\",\n                regex : /[^\\\\\\/]+/,\n                next : \"start\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(c_cppHighlightRules, TextHighlightRules);\n\nexports.c_cppHighlightRules = c_cppHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/c_cpp\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/c_cpp_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar c_cppHighlightRules = require(\"./c_cpp_highlight_rules\").c_cppHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = c_cppHighlightRules;\n\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/c_cpp\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/nix_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n    \"use strict\";\n\n    var oop = require(\"../lib/oop\");\n    var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\n    var NixHighlightRules = function() {\n\n        var constantLanguage = \"true|false\";\n        var keywordControl = \"with|import|if|else|then|inherit\";\n        var keywordDeclaration = \"let|in|rec\";\n\n        var keywordMapper = this.createKeywordMapper({\n            \"constant.language.nix\": constantLanguage,\n            \"keyword.control.nix\": keywordControl,\n            \"keyword.declaration.nix\": keywordDeclaration\n        }, \"identifier\");\n\n        this.$rules = {\n            \"start\": [{\n                    token: \"comment\",\n                    regex: /#.*$/\n                }, {\n                    token: \"comment\",\n                    regex: /\\/\\*/,\n                    next: \"comment\"\n                }, {\n                    token: \"constant\",\n                    regex: \"<[^>]+>\"\n                }, {\n                    regex: \"(==|!=|<=?|>=?)\",\n                    token: [\"keyword.operator.comparison.nix\"]\n                }, {\n                    regex: \"((?:[+*/%-]|\\\\~)=)\",\n                    token: [\"keyword.operator.assignment.arithmetic.nix\"]\n                }, {\n                    regex: \"=\",\n                    token: \"keyword.operator.assignment.nix\"\n                }, {\n                    token: \"string\",\n                    regex: \"''\",\n                    next: \"qqdoc\"\n                }, {\n                    token: \"string\",\n                    regex: \"'\",\n                    next: \"qstring\"\n                }, {\n                    token: \"string\",\n                    regex: '\"',\n                    push: \"qqstring\"\n                }, {\n                    token: \"constant.numeric\", // hex\n                    regex: \"0[xX][0-9a-fA-F]+\\\\b\"\n                }, {\n                    token: \"constant.numeric\", // float\n                    regex: \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n                }, {\n                    token: keywordMapper,\n                    regex: \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n                }, {\n                    regex: \"}\",\n                    token: function(val, start, stack) {\n                        return stack[1] && stack[1].charAt(0) == \"q\" ? \"constant.language.escape\" : \"text\";\n                    },\n                    next: \"pop\"\n                }],\n            \"comment\": [{\n                token: \"comment\", // closing comment\n                regex: \".*?\\\\*\\\\/\",\n                next: \"start\"\n            }, {\n                token: \"comment\", // comment spanning whole line\n                regex: \".+\"\n            }],\n            \"qqdoc\": [\n                {\n                    token: \"constant.language.escape\",\n                    regex: /\\$\\{/,\n                    push: \"start\"\n                }, {\n                    token: \"string\",\n                    regex: \"''\",\n                    next: \"pop\"\n                }, {\n                    defaultToken: \"string\"\n                }],\n            \"qqstring\": [\n                {\n                    token: \"constant.language.escape\",\n                    regex: /\\$\\{/,\n                    push: \"start\"\n                }, {\n                    token: \"string\",\n                    regex: '\"',\n                    next: \"pop\"\n                }, {\n                    defaultToken: \"string\"\n                }],\n            \"qstring\": [\n                {\n                    token: \"constant.language.escape\",\n                    regex: /\\$\\{/,\n                    push: \"start\"\n                }, {\n                    token: \"string\",\n                    regex: \"'\",\n                    next: \"pop\"\n                }, {\n                    defaultToken: \"string\"\n                }]\n        };\n\n        this.normalizeRules();\n    };\n\n    oop.inherits(NixHighlightRules, TextHighlightRules);\n\n    exports.NixHighlightRules = NixHighlightRules;\n});\n\nace.define(\"ace/mode/nix\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/c_cpp\",\"ace/mode/nix_highlight_rules\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar CMode = require(\"./c_cpp\").Mode;\nvar NixHighlightRules = require(\"./nix_highlight_rules\").NixHighlightRules;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    CMode.call(this);\n    this.HighlightRules = NixHighlightRules;\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, CMode);\n\n(function() { \n    this.lineCommentStart = \"#\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n    this.$id = \"ace/mode/nix\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-objectivec.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/c_cpp_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar cFunctions = exports.cFunctions = \"\\\\b(?:hypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len))))\\\\b\"\n\nvar c_cppHighlightRules = function() {\n\n    var keywordControls = (\n        \"break|case|continue|default|do|else|for|goto|if|_Pragma|\" +\n        \"return|switch|while|catch|operator|try|throw|using\"\n    );\n    \n    var storageType = (\n        \"asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|\" +\n        \"_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|\" +\n        \"class|wchar_t|template\"\n    );\n\n    var storageModifiers = (\n        \"const|extern|register|restrict|static|volatile|inline|private|\" +\n        \"protected|public|friend|explicit|virtual|export|mutable|typename|\" +\n        \"constexpr|new|delete\"\n    );\n\n    var keywordOperators = (\n        \"and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq\" +\n        \"const_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace\"\n    );\n\n    var builtinConstants = (\n        \"NULL|true|false|TRUE|FALSE\"\n    );\n\n    var keywordMapper = this.$keywords = this.createKeywordMapper({\n        \"keyword.control\" : keywordControls,\n        \"storage.type\" : storageType,\n        \"storage.modifier\" : storageModifiers,\n        \"keyword.operator\" : keywordOperators,\n        \"variable.language\": \"this\",\n        \"constant.language\": builtinConstants\n    }, \"identifier\");\n\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    this.$rules = { \n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"//\",\n                next : \"singleLineComment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                regex : '[\"].*\\\\\\\\$',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"string\", // multi line string start\n                regex : \"['].*\\\\\\\\$\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"\n            }, {\n                token : \"keyword\", // pre-compiler directives\n                regex : \"#\\\\s*(?:include|import|pragma|line|define|undef|if|ifdef|else|elif|ifndef)\\\\b\",\n                next  : \"directive\"\n            }, {\n                token : \"keyword\", // special case pre-compiler directive\n                regex : \"(?:#\\\\s*endif)\\\\b\"\n            }, {\n                token : \"support.function.C99.c\",\n                regex : cFunctions\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)\"\n            }, {\n              token : \"punctuation.operator\",\n              regex : \"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ],\n        \"singleLineComment\" : [\n            {\n                token : \"comment\",\n                regex : /\\\\$/,\n                next : \"singleLineComment\"\n            }, {\n                token : \"comment\",\n                regex : /$/,\n                next : \"start\"\n            }, {\n                defaultToken: \"comment\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n                next : \"start\"\n            }, {\n                defaultToken : \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n                next : \"start\"\n            }, {\n                defaultToken : \"string\"\n            }\n        ],\n        \"directive\" : [\n            {\n                token : \"constant.other.multiline\",\n                regex : /\\\\/\n            },\n            {\n                token : \"constant.other.multiline\",\n                regex : /.*\\\\/\n            },\n            {\n                token : \"constant.other\",\n                regex : \"\\\\s*<.+?>\",\n                next : \"start\"\n            },\n            {\n                token : \"constant.other\", // single line\n                regex : '\\\\s*[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]',\n                next : \"start\"\n            }, \n            {\n                token : \"constant.other\", // single line\n                regex : \"\\\\s*['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\",\n                next : \"start\"\n            },\n            {\n                token : \"constant.other\",\n                regex : /[^\\\\\\/]+/,\n                next : \"start\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(c_cppHighlightRules, TextHighlightRules);\n\nexports.c_cppHighlightRules = c_cppHighlightRules;\n});\n\nace.define(\"ace/mode/objectivec_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/c_cpp_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar C_Highlight_File = require(\"./c_cpp_highlight_rules\");\nvar CHighlightRules = C_Highlight_File.c_cppHighlightRules;\n\nvar ObjectiveCHighlightRules = function() {\n\n    var escapedConstRe = \"\\\\\\\\(?:[abefnrtv'\\\"?\\\\\\\\]|\" + \n                         \"[0-3]\\\\d{1,2}|\" +\n                         \"[4-7]\\\\d?|\" +\n                         \"222|\" +\n                         \"x[a-zA-Z0-9]+)\";\n\n    var specialVariables = [{\n            regex: \"\\\\b_cmd\\\\b\",\n            token: \"variable.other.selector.objc\"\n        }, {\n            regex: \"\\\\b(?:self|super)\\\\b\",\n            token: \"variable.language.objc\"\n        }\n    ];\n\n    var cObj = new CHighlightRules();\n    var cRules = cObj.getRules();\n\n    this.$rules = {\n    \"start\": [ \n        {\n            token : \"comment\",\n            regex : \"\\\\/\\\\/.*$\"\n        },\n        DocCommentHighlightRules.getStartRule(\"doc-start\"),\n        {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            next : \"comment\"\n        }, \n        {\n            token: [ \"storage.type.objc\", \"punctuation.definition.storage.type.objc\", \n                       \"entity.name.type.objc\", \"text\", \"entity.other.inherited-class.objc\"\n                     ],\n            regex: \"(@)(interface|protocol)(?!.+;)(\\\\s+[A-Za-z_][A-Za-z0-9_]*)(\\\\s*:\\\\s*)([A-Za-z]+)\"\n        },\n        {\n            token: [ \"storage.type.objc\" ],\n            regex: \"(@end)\"\n        },\n        {\n            token: [ \"storage.type.objc\", \"entity.name.type.objc\", \n                        \"entity.other.inherited-class.objc\"\n                     ],\n            regex: \"(@implementation)(\\\\s+[A-Za-z_][A-Za-z0-9_]*)(\\\\s*?::\\\\s*(?:[A-Za-z][A-Za-z0-9]*))?\"\n        },\n        {\n            token: \"string.begin.objc\",\n            regex: '@\"',\n            next: \"constant_NSString\"\n        },\n        {\n            token: \"storage.type.objc\",\n            regex: \"\\\\bid\\\\s*<\",\n            next: \"protocol_list\"\n        },\n        {\n            token: \"keyword.control.macro.objc\",\n            regex: \"\\\\bNS_DURING|NS_HANDLER|NS_ENDHANDLER\\\\b\"\n        },\n        {\n            token: [\"punctuation.definition.keyword.objc\", \"keyword.control.exception.objc\"],\n            regex: \"(@)(try|catch|finally|throw)\\\\b\"\n        },\n        {\n            token: [\"punctuation.definition.keyword.objc\", \"keyword.other.objc\"],\n            regex: \"(@)(defs|encode)\\\\b\"\n        },\n        {\n            token: [\"storage.type.id.objc\", \"text\"],\n            regex: \"(\\\\bid\\\\b)(\\\\s|\\\\n)?\"\n        },\n        {\n            token: \"storage.type.objc\",\n            regex: \"\\\\bIBOutlet|IBAction|BOOL|SEL|id|unichar|IMP|Class\\\\b\"\n        },\n        {\n            token: [ \"punctuation.definition.storage.type.objc\", \"storage.type.objc\"],\n            regex: \"(@)(class|protocol)\\\\b\"\n        },\n        {\n            token: [ \"punctuation.definition.storage.type.objc\", \"punctuation\"],\n            regex: \"(@selector)(\\\\s*\\\\()\",\n            next: \"selectors\"\n        },\n        {\n            token: [ \"punctuation.definition.storage.modifier.objc\", \"storage.modifier.objc\"],\n            regex: \"(@)(synchronized|public|private|protected|package)\\\\b\"\n        },\n        {\n            token: \"constant.language.objc\",\n            regex: \"\\\\bYES|NO|Nil|nil\\\\b\"\n        },\n        {\n            token:  \"support.variable.foundation\",\n            regex: \"\\\\bNSApp\\\\b\"\n        },\n        {\n            token: [ \"support.function.cocoa.leopard\"],\n            regex: \"(?:\\\\b)(NS(?:Rect(?:ToCGRect|FromCGRect)|MakeCollectable|S(?:tringFromProtocol|ize(?:ToCGSize|FromCGSize))|Draw(?:NinePartImage|ThreePartImage)|P(?:oint(?:ToCGPoint|FromCGPoint)|rotocolFromString)|EventMaskFromType|Value))(?:\\\\b)\"\n        },\n        {\n            token: [\"support.function.cocoa\"],\n            regex: \"(?:\\\\b)(NS(?:R(?:ound(?:DownToMultipleOfPageSize|UpToMultipleOfPageSize)|un(?:CriticalAlertPanel(?:RelativeToWindow)?|InformationalAlertPanel(?:RelativeToWindow)?|AlertPanel(?:RelativeToWindow)?)|e(?:set(?:MapTable|HashTable)|c(?:ycleZone|t(?:Clip(?:List)?|F(?:ill(?:UsingOperation|List(?:UsingOperation|With(?:Grays|Colors(?:UsingOperation)?))?)?|romString))|ordAllocationEvent)|turnAddress|leaseAlertPanel|a(?:dPixel|l(?:MemoryAvailable|locateCollectable))|gisterServicesProvider)|angeFromString)|Get(?:SizeAndAlignment|CriticalAlertPanel|InformationalAlertPanel|UncaughtExceptionHandler|FileType(?:s)?|WindowServerMemory|AlertPanel)|M(?:i(?:n(?:X|Y)|d(?:X|Y))|ouseInRect|a(?:p(?:Remove|Get|Member|Insert(?:IfAbsent|KnownAbsent)?)|ke(?:R(?:ect|ange)|Size|Point)|x(?:Range|X|Y)))|B(?:itsPer(?:SampleFromDepth|PixelFromDepth)|e(?:stDepth|ep|gin(?:CriticalAlertSheet|InformationalAlertSheet|AlertSheet)))|S(?:ho(?:uldRetainWithZone|w(?:sServicesMenuItem|AnimationEffect))|tringFrom(?:R(?:ect|ange)|MapTable|S(?:ize|elector)|HashTable|Class|Point)|izeFromString|e(?:t(?:ShowsServicesMenuItem|ZoneName|UncaughtExceptionHandler|FocusRingStyle)|lectorFromString|archPathForDirectoriesInDomains)|wap(?:Big(?:ShortToHost|IntToHost|DoubleToHost|FloatToHost|Long(?:ToHost|LongToHost))|Short|Host(?:ShortTo(?:Big|Little)|IntTo(?:Big|Little)|DoubleTo(?:Big|Little)|FloatTo(?:Big|Little)|Long(?:To(?:Big|Little)|LongTo(?:Big|Little)))|Int|Double|Float|L(?:ittle(?:ShortToHost|IntToHost|DoubleToHost|FloatToHost|Long(?:ToHost|LongToHost))|ong(?:Long)?)))|H(?:ighlightRect|o(?:stByteOrder|meDirectory(?:ForUser)?)|eight|ash(?:Remove|Get|Insert(?:IfAbsent|KnownAbsent)?)|FSType(?:CodeFromFileType|OfFile))|N(?:umberOfColorComponents|ext(?:MapEnumeratorPair|HashEnumeratorItem))|C(?:o(?:n(?:tainsRect|vert(?:GlyphsToPackedGlyphs|Swapped(?:DoubleToHost|FloatToHost)|Host(?:DoubleToSwapped|FloatToSwapped)))|unt(?:MapTable|HashTable|Frames|Windows(?:ForContext)?)|py(?:M(?:emoryPages|apTableWithZone)|Bits|HashTableWithZone|Object)|lorSpaceFromDepth|mpare(?:MapTables|HashTables))|lassFromString|reate(?:MapTable(?:WithZone)?|HashTable(?:WithZone)?|Zone|File(?:namePboardType|ContentsPboardType)))|TemporaryDirectory|I(?:s(?:ControllerMarker|EmptyRect|FreedObject)|n(?:setRect|crementExtraRefCount|te(?:r(?:sect(?:sRect|ionR(?:ect|ange))|faceStyleForKey)|gralRect)))|Zone(?:Realloc|Malloc|Name|Calloc|Fr(?:omPointer|ee))|O(?:penStepRootDirectory|ffsetRect)|D(?:i(?:sableScreenUpdates|videRect)|ottedFrameRect|e(?:c(?:imal(?:Round|Multiply|S(?:tring|ubtract)|Normalize|Co(?:py|mpa(?:ct|re))|IsNotANumber|Divide|Power|Add)|rementExtraRefCountWasZero)|faultMallocZone|allocate(?:MemoryPages|Object))|raw(?:Gr(?:oove|ayBezel)|B(?:itmap|utton)|ColorTiledRects|TiledRects|DarkBezel|W(?:hiteBezel|indowBackground)|LightBezel))|U(?:serName|n(?:ionR(?:ect|ange)|registerServicesProvider)|pdateDynamicServices)|Java(?:Bundle(?:Setup|Cleanup)|Setup(?:VirtualMachine)?|Needs(?:ToLoadClasses|VirtualMachine)|ClassesF(?:orBundle|romPath)|ObjectNamedInPath|ProvidesClasses)|P(?:oint(?:InRect|FromString)|erformService|lanarFromDepth|ageSize)|E(?:n(?:d(?:MapTableEnumeration|HashTableEnumeration)|umerate(?:MapTable|HashTable)|ableScreenUpdates)|qual(?:R(?:ects|anges)|Sizes|Points)|raseRect|xtraRefCount)|F(?:ileTypeForHFSTypeCode|ullUserName|r(?:ee(?:MapTable|HashTable)|ame(?:Rect(?:WithWidth(?:UsingOperation)?)?|Address)))|Wi(?:ndowList(?:ForContext)?|dth)|Lo(?:cationInRange|g(?:v|PageSize)?)|A(?:ccessibility(?:R(?:oleDescription(?:ForUIElement)?|aiseBadArgumentException)|Unignored(?:Children(?:ForOnlyChild)?|Descendant|Ancestor)|PostNotification|ActionDescription)|pplication(?:Main|Load)|vailableWindowDepths|ll(?:MapTable(?:Values|Keys)|HashTableObjects|ocate(?:MemoryPages|Collectable|Object)))))(?:\\\\b)\"\n        },\n        {\n            token: [\"support.class.cocoa.leopard\"],\n            regex: \"(?:\\\\b)(NS(?:RuleEditor|G(?:arbageCollector|radient)|MapTable|HashTable|Co(?:ndition|llectionView(?:Item)?)|T(?:oolbarItemGroup|extInputClient|r(?:eeNode|ackingArea))|InvocationOperation|Operation(?:Queue)?|D(?:ictionaryController|ockTile)|P(?:ointer(?:Functions|Array)|athC(?:o(?:ntrol(?:Delegate)?|mponentCell)|ell(?:Delegate)?)|r(?:intPanelAccessorizing|edicateEditor(?:RowTemplate)?))|ViewController|FastEnumeration|Animat(?:ionContext|ablePropertyContainer)))(?:\\\\b)\"\n        },\n        {\n            token: [\"support.class.cocoa\"],\n            regex: \"(?:\\\\b)(NS(?:R(?:u(?:nLoop|ler(?:Marker|View))|e(?:sponder|cursiveLock|lativeSpecifier)|an(?:domSpecifier|geSpecifier))|G(?:etCommand|lyph(?:Generator|Storage|Info)|raphicsContext)|XML(?:Node|D(?:ocument|TD(?:Node)?)|Parser|Element)|M(?:iddleSpecifier|ov(?:ie(?:View)?|eCommand)|utable(?:S(?:tring|et)|C(?:haracterSet|opying)|IndexSet|D(?:ictionary|ata)|URLRequest|ParagraphStyle|A(?:ttributedString|rray))|e(?:ssagePort(?:NameServer)?|nu(?:Item(?:Cell)?|View)?|t(?:hodSignature|adata(?:Item|Query(?:ResultGroup|AttributeValueTuple)?)))|a(?:ch(?:BootstrapServer|Port)|trix))|B(?:itmapImageRep|ox|u(?:ndle|tton(?:Cell)?)|ezierPath|rowser(?:Cell)?)|S(?:hadow|c(?:anner|r(?:ipt(?:SuiteRegistry|C(?:o(?:ercionHandler|mmand(?:Description)?)|lassDescription)|ObjectSpecifier|ExecutionContext|WhoseTest)|oll(?:er|View)|een))|t(?:epper(?:Cell)?|atus(?:Bar|Item)|r(?:ing|eam))|imple(?:HorizontalTypesetter|CString)|o(?:cketPort(?:NameServer)?|und|rtDescriptor)|p(?:e(?:cifierTest|ech(?:Recognizer|Synthesizer)|ll(?:Server|Checker))|litView)|e(?:cureTextField(?:Cell)?|t(?:Command)?|archField(?:Cell)?|rializer|gmentedC(?:ontrol|ell))|lider(?:Cell)?|avePanel)|H(?:ost|TTP(?:Cookie(?:Storage)?|URLResponse)|elpManager)|N(?:ib(?:Con(?:nector|trolConnector)|OutletConnector)?|otification(?:Center|Queue)?|u(?:ll|mber(?:Formatter)?)|etService(?:Browser)?|ameSpecifier)|C(?:ha(?:ngeSpelling|racterSet)|o(?:n(?:stantString|nection|trol(?:ler)?|ditionLock)|d(?:ing|er)|unt(?:Command|edSet)|pying|lor(?:Space|P(?:ick(?:ing(?:Custom|Default)|er)|anel)|Well|List)?|m(?:p(?:oundPredicate|arisonPredicate)|boBox(?:Cell)?))|u(?:stomImageRep|rsor)|IImageRep|ell|l(?:ipView|o(?:seCommand|neCommand)|assDescription)|a(?:ched(?:ImageRep|URLResponse)|lendar(?:Date)?)|reateCommand)|T(?:hread|ypesetter|ime(?:Zone|r)|o(?:olbar(?:Item(?:Validations)?)?|kenField(?:Cell)?)|ext(?:Block|Storage|Container|Tab(?:le(?:Block)?)?|Input|View|Field(?:Cell)?|List|Attachment(?:Cell)?)?|a(?:sk|b(?:le(?:Header(?:Cell|View)|Column|View)|View(?:Item)?))|reeController)|I(?:n(?:dex(?:S(?:pecifier|et)|Path)|put(?:Manager|S(?:tream|erv(?:iceProvider|er(?:MouseTracker)?)))|vocation)|gnoreMisspelledWords|mage(?:Rep|Cell|View)?)|O(?:ut(?:putStream|lineView)|pen(?:GL(?:Context|Pixel(?:Buffer|Format)|View)|Panel)|bj(?:CTypeSerializationCallBack|ect(?:Controller)?))|D(?:i(?:st(?:antObject(?:Request)?|ributed(?:NotificationCenter|Lock))|ctionary|rectoryEnumerator)|ocument(?:Controller)?|e(?:serializer|cimalNumber(?:Behaviors|Handler)?|leteCommand)|at(?:e(?:Components|Picker(?:Cell)?|Formatter)?|a)|ra(?:wer|ggingInfo))|U(?:ser(?:InterfaceValidations|Defaults(?:Controller)?)|RL(?:Re(?:sponse|quest)|Handle(?:Client)?|C(?:onnection|ache|redential(?:Storage)?)|Download(?:Delegate)?|Prot(?:ocol(?:Client)?|ectionSpace)|AuthenticationChallenge(?:Sender)?)?|n(?:iqueIDSpecifier|doManager|archiver))|P(?:ipe|o(?:sitionalSpecifier|pUpButton(?:Cell)?|rt(?:Message|NameServer|Coder)?)|ICTImageRep|ersistentDocument|DFImageRep|a(?:steboard|nel|ragraphStyle|geLayout)|r(?:int(?:Info|er|Operation|Panel)|o(?:cessInfo|tocolChecker|perty(?:Specifier|ListSerialization)|gressIndicator|xy)|edicate))|E(?:numerator|vent|PSImageRep|rror|x(?:ception|istsCommand|pression))|V(?:iew(?:Animation)?|al(?:idated(?:ToobarItem|UserInterfaceItem)|ue(?:Transformer)?))|Keyed(?:Unarchiver|Archiver)|Qui(?:ckDrawView|tCommand)|F(?:ile(?:Manager|Handle|Wrapper)|o(?:nt(?:Manager|Descriptor|Panel)?|rm(?:Cell|atter)))|W(?:hoseSpecifier|indow(?:Controller)?|orkspace)|L(?:o(?:c(?:k(?:ing)?|ale)|gicalTest)|evelIndicator(?:Cell)?|ayoutManager)|A(?:ssertionHandler|nimation|ctionCell|ttributedString|utoreleasePool|TSTypesetter|ppl(?:ication|e(?:Script|Event(?:Manager|Descriptor)))|ffineTransform|lert|r(?:chiver|ray(?:Controller)?))))(?:\\\\b)\"\n        },\n        {\n            token: [\"support.type.cocoa.leopard\"],\n            regex: \"(?:\\\\b)(NS(?:R(?:u(?:nLoop|ler(?:Marker|View))|e(?:sponder|cursiveLock|lativeSpecifier)|an(?:domSpecifier|geSpecifier))|G(?:etCommand|lyph(?:Generator|Storage|Info)|raphicsContext)|XML(?:Node|D(?:ocument|TD(?:Node)?)|Parser|Element)|M(?:iddleSpecifier|ov(?:ie(?:View)?|eCommand)|utable(?:S(?:tring|et)|C(?:haracterSet|opying)|IndexSet|D(?:ictionary|ata)|URLRequest|ParagraphStyle|A(?:ttributedString|rray))|e(?:ssagePort(?:NameServer)?|nu(?:Item(?:Cell)?|View)?|t(?:hodSignature|adata(?:Item|Query(?:ResultGroup|AttributeValueTuple)?)))|a(?:ch(?:BootstrapServer|Port)|trix))|B(?:itmapImageRep|ox|u(?:ndle|tton(?:Cell)?)|ezierPath|rowser(?:Cell)?)|S(?:hadow|c(?:anner|r(?:ipt(?:SuiteRegistry|C(?:o(?:ercionHandler|mmand(?:Description)?)|lassDescription)|ObjectSpecifier|ExecutionContext|WhoseTest)|oll(?:er|View)|een))|t(?:epper(?:Cell)?|atus(?:Bar|Item)|r(?:ing|eam))|imple(?:HorizontalTypesetter|CString)|o(?:cketPort(?:NameServer)?|und|rtDescriptor)|p(?:e(?:cifierTest|ech(?:Recognizer|Synthesizer)|ll(?:Server|Checker))|litView)|e(?:cureTextField(?:Cell)?|t(?:Command)?|archField(?:Cell)?|rializer|gmentedC(?:ontrol|ell))|lider(?:Cell)?|avePanel)|H(?:ost|TTP(?:Cookie(?:Storage)?|URLResponse)|elpManager)|N(?:ib(?:Con(?:nector|trolConnector)|OutletConnector)?|otification(?:Center|Queue)?|u(?:ll|mber(?:Formatter)?)|etService(?:Browser)?|ameSpecifier)|C(?:ha(?:ngeSpelling|racterSet)|o(?:n(?:stantString|nection|trol(?:ler)?|ditionLock)|d(?:ing|er)|unt(?:Command|edSet)|pying|lor(?:Space|P(?:ick(?:ing(?:Custom|Default)|er)|anel)|Well|List)?|m(?:p(?:oundPredicate|arisonPredicate)|boBox(?:Cell)?))|u(?:stomImageRep|rsor)|IImageRep|ell|l(?:ipView|o(?:seCommand|neCommand)|assDescription)|a(?:ched(?:ImageRep|URLResponse)|lendar(?:Date)?)|reateCommand)|T(?:hread|ypesetter|ime(?:Zone|r)|o(?:olbar(?:Item(?:Validations)?)?|kenField(?:Cell)?)|ext(?:Block|Storage|Container|Tab(?:le(?:Block)?)?|Input|View|Field(?:Cell)?|List|Attachment(?:Cell)?)?|a(?:sk|b(?:le(?:Header(?:Cell|View)|Column|View)|View(?:Item)?))|reeController)|I(?:n(?:dex(?:S(?:pecifier|et)|Path)|put(?:Manager|S(?:tream|erv(?:iceProvider|er(?:MouseTracker)?)))|vocation)|gnoreMisspelledWords|mage(?:Rep|Cell|View)?)|O(?:ut(?:putStream|lineView)|pen(?:GL(?:Context|Pixel(?:Buffer|Format)|View)|Panel)|bj(?:CTypeSerializationCallBack|ect(?:Controller)?))|D(?:i(?:st(?:antObject(?:Request)?|ributed(?:NotificationCenter|Lock))|ctionary|rectoryEnumerator)|ocument(?:Controller)?|e(?:serializer|cimalNumber(?:Behaviors|Handler)?|leteCommand)|at(?:e(?:Components|Picker(?:Cell)?|Formatter)?|a)|ra(?:wer|ggingInfo))|U(?:ser(?:InterfaceValidations|Defaults(?:Controller)?)|RL(?:Re(?:sponse|quest)|Handle(?:Client)?|C(?:onnection|ache|redential(?:Storage)?)|Download(?:Delegate)?|Prot(?:ocol(?:Client)?|ectionSpace)|AuthenticationChallenge(?:Sender)?)?|n(?:iqueIDSpecifier|doManager|archiver))|P(?:ipe|o(?:sitionalSpecifier|pUpButton(?:Cell)?|rt(?:Message|NameServer|Coder)?)|ICTImageRep|ersistentDocument|DFImageRep|a(?:steboard|nel|ragraphStyle|geLayout)|r(?:int(?:Info|er|Operation|Panel)|o(?:cessInfo|tocolChecker|perty(?:Specifier|ListSerialization)|gressIndicator|xy)|edicate))|E(?:numerator|vent|PSImageRep|rror|x(?:ception|istsCommand|pression))|V(?:iew(?:Animation)?|al(?:idated(?:ToobarItem|UserInterfaceItem)|ue(?:Transformer)?))|Keyed(?:Unarchiver|Archiver)|Qui(?:ckDrawView|tCommand)|F(?:ile(?:Manager|Handle|Wrapper)|o(?:nt(?:Manager|Descriptor|Panel)?|rm(?:Cell|atter)))|W(?:hoseSpecifier|indow(?:Controller)?|orkspace)|L(?:o(?:c(?:k(?:ing)?|ale)|gicalTest)|evelIndicator(?:Cell)?|ayoutManager)|A(?:ssertionHandler|nimation|ctionCell|ttributedString|utoreleasePool|TSTypesetter|ppl(?:ication|e(?:Script|Event(?:Manager|Descriptor)))|ffineTransform|lert|r(?:chiver|ray(?:Controller)?))))(?:\\\\b)\"\n        },\n        {\n            token: [\"support.class.quartz\"],\n            regex: \"(?:\\\\b)(C(?:I(?:Sampler|Co(?:ntext|lor)|Image(?:Accumulator)?|PlugIn(?:Registration)?|Vector|Kernel|Filter(?:Generator|Shape)?)|A(?:Renderer|MediaTiming(?:Function)?|BasicAnimation|ScrollLayer|Constraint(?:LayoutManager)?|T(?:iledLayer|extLayer|rans(?:ition|action))|OpenGLLayer|PropertyAnimation|KeyframeAnimation|Layer|A(?:nimation(?:Group)?|ction))))(?:\\\\b)\"\n        },\n        {\n            token: [\"support.type.quartz\"],\n            regex: \"(?:\\\\b)(C(?:G(?:Float|Point|Size|Rect)|IFormat|AConstraintAttribute))(?:\\\\b)\"\n        },\n        {\n            token: [\"support.type.cocoa\"],\n            regex: \"(?:\\\\b)(NS(?:R(?:ect(?:Edge)?|ange)|G(?:lyph(?:Relation|LayoutMode)?|radientType)|M(?:odalSession|a(?:trixMode|p(?:Table|Enumerator)))|B(?:itmapImageFileType|orderType|uttonType|ezelStyle|ackingStoreType|rowserColumnResizingType)|S(?:cr(?:oll(?:er(?:Part|Arrow)|ArrowPosition)|eenAuxiliaryOpaque)|tringEncoding|ize|ocketNativeHandle|election(?:Granularity|Direction|Affinity)|wapped(?:Double|Float)|aveOperationType)|Ha(?:sh(?:Table|Enumerator)|ndler(?:2)?)|C(?:o(?:ntrol(?:Size|Tint)|mp(?:ositingOperation|arisonResult))|ell(?:State|Type|ImagePosition|Attribute))|T(?:hreadPrivate|ypesetterGlyphInfo|i(?:ckMarkPosition|tlePosition|meInterval)|o(?:ol(?:TipTag|bar(?:SizeMode|DisplayMode))|kenStyle)|IFFCompression|ext(?:TabType|Alignment)|ab(?:State|leViewDropOperation|ViewType)|rackingRectTag)|ImageInterpolation|Zone|OpenGL(?:ContextAuxiliary|PixelFormatAuxiliary)|D(?:ocumentChangeType|atePickerElementFlags|ra(?:werState|gOperation))|UsableScrollerParts|P(?:oint|r(?:intingPageOrder|ogressIndicator(?:Style|Th(?:ickness|readInfo))))|EventType|KeyValueObservingOptions|Fo(?:nt(?:SymbolicTraits|TraitMask|Action)|cusRingType)|W(?:indow(?:OrderingMode|Depth)|orkspace(?:IconCreationOptions|LaunchOptions)|ritingDirection)|L(?:ineBreakMode|ayout(?:Status|Direction))|A(?:nimation(?:Progress|Effect)|ppl(?:ication(?:TerminateReply|DelegateReply|PrintReply)|eEventManagerSuspensionID)|ffineTransformStruct|lertStyle)))(?:\\\\b)\"\n        },\n        {\n            token: [\"support.constant.cocoa\"],\n            regex: \"(?:\\\\b)(NS(?:NotFound|Ordered(?:Ascending|Descending|Same)))(?:\\\\b)\"\n        },\n        {\n            token: [\"support.constant.notification.cocoa.leopard\"],\n            regex: \"(?:\\\\b)(NS(?:MenuDidBeginTracking|ViewDidUpdateTrackingAreas)?Notification)(?:\\\\b)\"\n        },\n        {\n            token: [\"support.constant.notification.cocoa\"],\n            regex: \"(?:\\\\b)(NS(?:Menu(?:Did(?:RemoveItem|SendAction|ChangeItem|EndTracking|AddItem)|WillSendAction)|S(?:ystemColorsDidChange|plitView(?:DidResizeSubviews|WillResizeSubviews))|C(?:o(?:nt(?:extHelpModeDid(?:Deactivate|Activate)|rolT(?:intDidChange|extDid(?:BeginEditing|Change|EndEditing)))|lor(?:PanelColorDidChange|ListDidChange)|mboBox(?:Selection(?:IsChanging|DidChange)|Will(?:Dismiss|PopUp)))|lassDescriptionNeededForClass)|T(?:oolbar(?:DidRemoveItem|WillAddItem)|ext(?:Storage(?:DidProcessEditing|WillProcessEditing)|Did(?:BeginEditing|Change|EndEditing)|View(?:DidChange(?:Selection|TypingAttributes)|WillChangeNotifyingTextView))|ableView(?:Selection(?:IsChanging|DidChange)|ColumnDid(?:Resize|Move)))|ImageRepRegistryDidChange|OutlineView(?:Selection(?:IsChanging|DidChange)|ColumnDid(?:Resize|Move)|Item(?:Did(?:Collapse|Expand)|Will(?:Collapse|Expand)))|Drawer(?:Did(?:Close|Open)|Will(?:Close|Open))|PopUpButton(?:CellWillPopUp|WillPopUp)|View(?:GlobalFrameDidChange|BoundsDidChange|F(?:ocusDidChange|rameDidChange))|FontSetChanged|W(?:indow(?:Did(?:Resi(?:ze|gn(?:Main|Key))|M(?:iniaturize|ove)|Become(?:Main|Key)|ChangeScreen(?:|Profile)|Deminiaturize|Update|E(?:ndSheet|xpose))|Will(?:M(?:iniaturize|ove)|BeginSheet|Close))|orkspace(?:SessionDid(?:ResignActive|BecomeActive)|Did(?:Mount|TerminateApplication|Unmount|PerformFileOperation|Wake|LaunchApplication)|Will(?:Sleep|Unmount|PowerOff|LaunchApplication)))|A(?:ntialiasThresholdChanged|ppl(?:ication(?:Did(?:ResignActive|BecomeActive|Hide|ChangeScreenParameters|U(?:nhide|pdate)|FinishLaunching)|Will(?:ResignActive|BecomeActive|Hide|Terminate|U(?:nhide|pdate)|FinishLaunching))|eEventManagerWillProcessFirstEvent)))Notification)(?:\\\\b)\"\n        },\n        {\n            token: [\"support.constant.cocoa.leopard\"],\n            regex: \"(?:\\\\b)(NS(?:RuleEditor(?:RowType(?:Simple|Compound)|NestingMode(?:Si(?:ngle|mple)|Compound|List))|GradientDraws(?:BeforeStartingLocation|AfterEndingLocation)|M(?:inusSetExpressionType|a(?:chPortDeallocate(?:ReceiveRight|SendRight|None)|pTable(?:StrongMemory|CopyIn|ZeroingWeakMemory|ObjectPointerPersonality)))|B(?:oxCustom|undleExecutableArchitecture(?:X86|I386|PPC(?:64)?)|etweenPredicateOperatorType|ackgroundStyle(?:Raised|Dark|L(?:ight|owered)))|S(?:tring(?:DrawingTruncatesLastVisibleLine|EncodingConversion(?:ExternalRepresentation|AllowLossy))|ubqueryExpressionType|p(?:e(?:ech(?:SentenceBoundary|ImmediateBoundary|WordBoundary)|llingState(?:GrammarFlag|SpellingFlag))|litViewDividerStyleThi(?:n|ck))|e(?:rvice(?:RequestTimedOutError|M(?:iscellaneousError|alformedServiceDictionaryError)|InvalidPasteboardDataError|ErrorM(?:inimum|aximum)|Application(?:NotFoundError|LaunchFailedError))|gmentStyle(?:Round(?:Rect|ed)|SmallSquare|Capsule|Textured(?:Rounded|Square)|Automatic)))|H(?:UDWindowMask|ashTable(?:StrongMemory|CopyIn|ZeroingWeakMemory|ObjectPointerPersonality))|N(?:oModeColorPanel|etServiceNoAutoRename)|C(?:hangeRedone|o(?:ntainsPredicateOperatorType|l(?:orRenderingIntent(?:RelativeColorimetric|Saturation|Default|Perceptual|AbsoluteColorimetric)|lectorDisabledOption))|ellHit(?:None|ContentArea|TrackableArea|EditableTextArea))|T(?:imeZoneNameStyle(?:S(?:hort(?:Standard|DaylightSaving)|tandard)|DaylightSaving)|extFieldDatePickerStyle|ableViewSelectionHighlightStyle(?:Regular|SourceList)|racking(?:Mouse(?:Moved|EnteredAndExited)|CursorUpdate|InVisibleRect|EnabledDuringMouseDrag|A(?:ssumeInside|ctive(?:In(?:KeyWindow|ActiveApp)|WhenFirstResponder|Always))))|I(?:n(?:tersectSetExpressionType|dexedColorSpaceModel)|mageScale(?:None|Proportionally(?:Down|UpOrDown)|AxesIndependently))|Ope(?:nGLPFAAllowOfflineRenderers|rationQueue(?:DefaultMaxConcurrentOperationCount|Priority(?:High|Normal|Very(?:High|Low)|Low)))|D(?:iacriticInsensitiveSearch|ownloadsDirectory)|U(?:nionSetExpressionType|TF(?:16(?:BigEndianStringEncoding|StringEncoding|LittleEndianStringEncoding)|32(?:BigEndianStringEncoding|StringEncoding|LittleEndianStringEncoding)))|P(?:ointerFunctions(?:Ma(?:chVirtualMemory|llocMemory)|Str(?:ongMemory|uctPersonality)|C(?:StringPersonality|opyIn)|IntegerPersonality|ZeroingWeakMemory|O(?:paque(?:Memory|Personality)|bjectP(?:ointerPersonality|ersonality)))|at(?:hStyle(?:Standard|NavigationBar|PopUp)|ternColorSpaceModel)|rintPanelShows(?:Scaling|Copies|Orientation|P(?:a(?:perSize|ge(?:Range|SetupAccessory))|review)))|Executable(?:RuntimeMismatchError|NotLoadableError|ErrorM(?:inimum|aximum)|L(?:inkError|oadError)|ArchitectureMismatchError)|KeyValueObservingOption(?:Initial|Prior)|F(?:i(?:ndPanelSubstringMatchType(?:StartsWith|Contains|EndsWith|FullWord)|leRead(?:TooLargeError|UnknownStringEncodingError))|orcedOrderingSearch)|Wi(?:ndow(?:BackingLocation(?:MainMemory|Default|VideoMemory)|Sharing(?:Read(?:Only|Write)|None)|CollectionBehavior(?:MoveToActiveSpace|CanJoinAllSpaces|Default))|dthInsensitiveSearch)|AggregateExpressionType))(?:\\\\b)\"\n        },\n        {\n            token: [\"support.constant.cocoa\"],\n            regex: \"(?:\\\\b)(NS(?:R(?:GB(?:ModeColorPanel|ColorSpaceModel)|ight(?:Mouse(?:D(?:own(?:Mask)?|ragged(?:Mask)?)|Up(?:Mask)?)|T(?:ext(?:Movement|Alignment)|ab(?:sBezelBorder|StopType))|ArrowFunctionKey)|ound(?:RectBezelStyle|Bankers|ed(?:BezelStyle|TokenStyle|DisclosureBezelStyle)|Down|Up|Plain|Line(?:CapStyle|JoinStyle))|un(?:StoppedResponse|ContinuesResponse|AbortedResponse)|e(?:s(?:izableWindowMask|et(?:CursorRectsRunLoopOrdering|FunctionKey))|ce(?:ssedBezelStyle|iver(?:sCantHandleCommandScriptError|EvaluationScriptError))|turnTextMovement|doFunctionKey|quiredArgumentsMissingScriptError|l(?:evancyLevelIndicatorStyle|ative(?:Before|After))|gular(?:SquareBezelStyle|ControlSize)|moveTraitFontAction)|a(?:n(?:domSubelement|geDateMode)|tingLevelIndicatorStyle|dio(?:ModeMatrix|Button)))|G(?:IFFileType|lyph(?:Below|Inscribe(?:B(?:elow|ase)|Over(?:strike|Below)|Above)|Layout(?:WithPrevious|A(?:tAPoint|gainstAPoint))|A(?:ttribute(?:BidiLevel|Soft|Inscribe|Elastic)|bove))|r(?:ooveBorder|eaterThan(?:Comparison|OrEqualTo(?:Comparison|PredicateOperatorType)|PredicateOperatorType)|a(?:y(?:ModeColorPanel|ColorSpaceModel)|dient(?:None|Con(?:cave(?:Strong|Weak)|vex(?:Strong|Weak)))|phiteControlTint)))|XML(?:N(?:o(?:tationDeclarationKind|de(?:CompactEmptyElement|IsCDATA|OptionsNone|Use(?:SingleQuotes|DoubleQuotes)|Pre(?:serve(?:NamespaceOrder|C(?:haracterReferences|DATA)|DTD|Prefixes|E(?:ntities|mptyElements)|Quotes|Whitespace|A(?:ttributeOrder|ll))|ttyPrint)|ExpandEmptyElement))|amespaceKind)|CommentKind|TextKind|InvalidKind|D(?:ocument(?:X(?:MLKind|HTMLKind|Include)|HTMLKind|T(?:idy(?:XML|HTML)|extKind)|IncludeContentTypeDeclaration|Validate|Kind)|TDKind)|P(?:arser(?:GTRequiredError|XMLDeclNot(?:StartedError|FinishedError)|Mi(?:splaced(?:XMLDeclarationError|CDATAEndStringError)|xedContentDeclNot(?:StartedError|FinishedError))|S(?:t(?:andaloneValueError|ringNot(?:StartedError|ClosedError))|paceRequiredError|eparatorRequiredError)|N(?:MTOKENRequiredError|o(?:t(?:ationNot(?:StartedError|FinishedError)|WellBalancedError)|DTDError)|amespaceDeclarationError|AMERequiredError)|C(?:haracterRef(?:In(?:DTDError|PrologError|EpilogError)|AtEOFError)|o(?:nditionalSectionNot(?:StartedError|FinishedError)|mment(?:NotFinishedError|ContainsDoubleHyphenError))|DATANotFinishedError)|TagNameMismatchError|In(?:ternalError|valid(?:HexCharacterRefError|C(?:haracter(?:RefError|InEntityError|Error)|onditionalSectionError)|DecimalCharacterRefError|URIError|Encoding(?:NameError|Error)))|OutOfMemoryError|D(?:ocumentStartError|elegateAbortedParseError|OCTYPEDeclNotFinishedError)|U(?:RI(?:RequiredError|FragmentError)|n(?:declaredEntityError|parsedEntityError|knownEncodingError|finishedTagError))|P(?:CDATARequiredError|ublicIdentifierRequiredError|arsedEntityRef(?:MissingSemiError|NoNameError|In(?:Internal(?:SubsetError|Error)|PrologError|EpilogError)|AtEOFError)|r(?:ocessingInstructionNot(?:StartedError|FinishedError)|ematureDocumentEndError))|E(?:n(?:codingNotSupportedError|tity(?:Ref(?:In(?:DTDError|PrologError|EpilogError)|erence(?:MissingSemiError|WithoutNameError)|LoopError|AtEOFError)|BoundaryError|Not(?:StartedError|FinishedError)|Is(?:ParameterError|ExternalError)|ValueRequiredError))|qualExpectedError|lementContentDeclNot(?:StartedError|FinishedError)|xt(?:ernalS(?:tandaloneEntityError|ubsetNotFinishedError)|raContentError)|mptyDocumentError)|L(?:iteralNot(?:StartedError|FinishedError)|T(?:RequiredError|SlashRequiredError)|essThanSymbolInAttributeError)|Attribute(?:RedefinedError|HasNoValueError|Not(?:StartedError|FinishedError)|ListNot(?:StartedError|FinishedError)))|rocessingInstructionKind)|E(?:ntity(?:GeneralKind|DeclarationKind|UnparsedKind|P(?:ar(?:sedKind|ameterKind)|redefined))|lement(?:Declaration(?:MixedKind|UndefinedKind|E(?:lementKind|mptyKind)|Kind|AnyKind)|Kind))|Attribute(?:N(?:MToken(?:sKind|Kind)|otationKind)|CDATAKind|ID(?:Ref(?:sKind|Kind)|Kind)|DeclarationKind|En(?:tit(?:yKind|iesKind)|umerationKind)|Kind))|M(?:i(?:n(?:XEdge|iaturizableWindowMask|YEdge|uteCalendarUnit)|terLineJoinStyle|ddleSubelement|xedState)|o(?:nthCalendarUnit|deSwitchFunctionKey|use(?:Moved(?:Mask)?|E(?:ntered(?:Mask)?|ventSubtype|xited(?:Mask)?))|veToBezierPathElement|mentary(?:ChangeButton|Push(?:Button|InButton)|Light(?:Button)?))|enuFunctionKey|a(?:c(?:intoshInterfaceStyle|OSRomanStringEncoding)|tchesPredicateOperatorType|ppedRead|x(?:XEdge|YEdge))|ACHOperatingSystem)|B(?:MPFileType|o(?:ttomTabsBezelBorder|ldFontMask|rderlessWindowMask|x(?:Se(?:condary|parator)|OldStyle|Primary))|uttLineCapStyle|e(?:zelBorder|velLineJoinStyle|low(?:Bottom|Top)|gin(?:sWith(?:Comparison|PredicateOperatorType)|FunctionKey))|lueControlTint|ack(?:spaceCharacter|tabTextMovement|ingStore(?:Retained|Buffered|Nonretained)|TabCharacter|wardsSearch|groundTab)|r(?:owser(?:NoColumnResizing|UserColumnResizing|AutoColumnResizing)|eakFunctionKey))|S(?:h(?:ift(?:JISStringEncoding|KeyMask)|ow(?:ControlGlyphs|InvisibleGlyphs)|adowlessSquareBezelStyle)|y(?:s(?:ReqFunctionKey|tem(?:D(?:omainMask|efined(?:Mask)?)|FunctionKey))|mbolStringEncoding)|c(?:a(?:nnedOption|le(?:None|ToFit|Proportionally))|r(?:oll(?:er(?:NoPart|Increment(?:Page|Line|Arrow)|Decrement(?:Page|Line|Arrow)|Knob(?:Slot)?|Arrows(?:M(?:inEnd|axEnd)|None|DefaultSetting))|Wheel(?:Mask)?|LockFunctionKey)|eenChangedEventType))|t(?:opFunctionKey|r(?:ingDrawing(?:OneShot|DisableScreenFontSubstitution|Uses(?:DeviceMetrics|FontLeading|LineFragmentOrigin))|eam(?:Status(?:Reading|NotOpen|Closed|Open(?:ing)?|Error|Writing|AtEnd)|Event(?:Has(?:BytesAvailable|SpaceAvailable)|None|OpenCompleted|E(?:ndEncountered|rrorOccurred)))))|i(?:ngle(?:DateMode|UnderlineStyle)|ze(?:DownFontAction|UpFontAction))|olarisOperatingSystem|unOSOperatingSystem|pecialPageOrder|e(?:condCalendarUnit|lect(?:By(?:Character|Paragraph|Word)|i(?:ng(?:Next|Previous)|onAffinity(?:Downstream|Upstream))|edTab|FunctionKey)|gmentSwitchTracking(?:Momentary|Select(?:One|Any)))|quareLineCapStyle|witchButton|ave(?:ToOperation|Op(?:tions(?:Yes|No|Ask)|eration)|AsOperation)|mall(?:SquareBezelStyle|C(?:ontrolSize|apsFontMask)|IconButtonBezelStyle))|H(?:ighlightModeMatrix|SBModeColorPanel|o(?:ur(?:Minute(?:SecondDatePickerElementFlag|DatePickerElementFlag)|CalendarUnit)|rizontalRuler|meFunctionKey)|TTPCookieAcceptPolicy(?:Never|OnlyFromMainDocumentDomain|Always)|e(?:lp(?:ButtonBezelStyle|KeyMask|FunctionKey)|avierFontAction)|PUXOperatingSystem)|Year(?:MonthDa(?:yDatePickerElementFlag|tePickerElementFlag)|CalendarUnit)|N(?:o(?:n(?:StandardCharacterSetFontMask|ZeroWindingRule|activatingPanelMask|LossyASCIIStringEncoding)|Border|t(?:ification(?:SuspensionBehavior(?:Hold|Coalesce|D(?:eliverImmediately|rop))|NoCoalescing|CoalescingOn(?:Sender|Name)|DeliverImmediately|PostToAllSessions)|PredicateType|EqualToPredicateOperatorType)|S(?:cr(?:iptError|ollerParts)|ubelement|pecifierError)|CellMask|T(?:itle|opLevelContainersSpecifierError|abs(?:BezelBorder|NoBorder|LineBorder))|I(?:nterfaceStyle|mage)|UnderlineStyle|FontChangeAction)|u(?:ll(?:Glyph|CellType)|m(?:eric(?:Search|PadKeyMask)|berFormatter(?:Round(?:Half(?:Down|Up|Even)|Ceiling|Down|Up|Floor)|Behavior(?:10|Default)|S(?:cientificStyle|pellOutStyle)|NoStyle|CurrencyStyle|DecimalStyle|P(?:ercentStyle|ad(?:Before(?:Suffix|Prefix)|After(?:Suffix|Prefix))))))|e(?:t(?:Services(?:BadArgumentError|NotFoundError|C(?:ollisionError|ancelledError)|TimeoutError|InvalidError|UnknownError|ActivityInProgress)|workDomainMask)|wlineCharacter|xt(?:StepInterfaceStyle|FunctionKey))|EXTSTEPStringEncoding|a(?:t(?:iveShortGlyphPacking|uralTextAlignment)|rrowFontMask))|C(?:hange(?:ReadOtherContents|GrayCell(?:Mask)?|BackgroundCell(?:Mask)?|Cleared|Done|Undone|Autosaved)|MYK(?:ModeColorPanel|ColorSpaceModel)|ircular(?:BezelStyle|Slider)|o(?:n(?:stantValueExpressionType|t(?:inuousCapacityLevelIndicatorStyle|entsCellMask|ain(?:sComparison|erSpecifierError)|rol(?:Glyph|KeyMask))|densedFontMask)|lor(?:Panel(?:RGBModeMask|GrayModeMask|HSBModeMask|C(?:MYKModeMask|olorListModeMask|ustomPaletteModeMask|rayonModeMask)|WheelModeMask|AllModesMask)|ListModeColorPanel)|reServiceDirectory|m(?:p(?:osite(?:XOR|Source(?:In|O(?:ut|ver)|Atop)|Highlight|C(?:opy|lear)|Destination(?:In|O(?:ut|ver)|Atop)|Plus(?:Darker|Lighter))|ressedFontMask)|mandKeyMask))|u(?:stom(?:SelectorPredicateOperatorType|PaletteModeColorPanel)|r(?:sor(?:Update(?:Mask)?|PointingDevice)|veToBezierPathElement))|e(?:nterT(?:extAlignment|abStopType)|ll(?:State|H(?:ighlighted|as(?:Image(?:Horizontal|OnLeftOrBottom)|OverlappingImage))|ChangesContents|Is(?:Bordered|InsetButton)|Disabled|Editable|LightsBy(?:Gray|Background|Contents)|AllowsMixedState))|l(?:ipPagination|o(?:s(?:ePathBezierPathElement|ableWindowMask)|ckAndCalendarDatePickerStyle)|ear(?:ControlTint|DisplayFunctionKey|LineFunctionKey))|a(?:seInsensitive(?:Search|PredicateOption)|n(?:notCreateScriptCommandError|cel(?:Button|TextMovement))|chesDirectory|lculation(?:NoError|Overflow|DivideByZero|Underflow|LossOfPrecision)|rriageReturnCharacter)|r(?:itical(?:Request|AlertStyle)|ayonModeColorPanel))|T(?:hick(?:SquareBezelStyle|erSquareBezelStyle)|ypesetter(?:Behavior|HorizontalTabAction|ContainerBreakAction|ZeroAdvancementAction|OriginalBehavior|ParagraphBreakAction|WhitespaceAction|L(?:ineBreakAction|atestBehavior))|i(?:ckMark(?:Right|Below|Left|Above)|tledWindowMask|meZoneDatePickerElementFlag)|o(?:olbarItemVisibilityPriority(?:Standard|High|User|Low)|pTabsBezelBorder|ggleButton)|IFF(?:Compression(?:N(?:one|EXT)|CCITTFAX(?:3|4)|OldJPEG|JPEG|PackBits|LZW)|FileType)|e(?:rminate(?:Now|Cancel|Later)|xt(?:Read(?:InapplicableDocumentTypeError|WriteErrorM(?:inimum|aximum))|Block(?:M(?:i(?:nimum(?:Height|Width)|ddleAlignment)|a(?:rgin|ximum(?:Height|Width)))|B(?:o(?:ttomAlignment|rder)|aselineAlignment)|Height|TopAlignment|P(?:ercentageValueType|adding)|Width|AbsoluteValueType)|StorageEdited(?:Characters|Attributes)|CellType|ured(?:RoundedBezelStyle|BackgroundWindowMask|SquareBezelStyle)|Table(?:FixedLayoutAlgorithm|AutomaticLayoutAlgorithm)|Field(?:RoundedBezel|SquareBezel|AndStepperDatePickerStyle)|WriteInapplicableDocumentTypeError|ListPrependEnclosingMarker))|woByteGlyphPacking|ab(?:Character|TextMovement|le(?:tP(?:oint(?:Mask|EventSubtype)?|roximity(?:Mask|EventSubtype)?)|Column(?:NoResizing|UserResizingMask|AutoresizingMask)|View(?:ReverseSequentialColumnAutoresizingStyle|GridNone|S(?:olid(?:HorizontalGridLineMask|VerticalGridLineMask)|equentialColumnAutoresizingStyle)|NoColumnAutoresizing|UniformColumnAutoresizingStyle|FirstColumnOnlyAutoresizingStyle|LastColumnOnlyAutoresizingStyle)))|rackModeMatrix)|I(?:n(?:sert(?:CharFunctionKey|FunctionKey|LineFunctionKey)|t(?:Type|ernalS(?:criptError|pecifierError))|dexSubelement|validIndexSpecifierError|formational(?:Request|AlertStyle)|PredicateOperatorType)|talicFontMask|SO(?:2022JPStringEncoding|Latin(?:1StringEncoding|2StringEncoding))|dentityMappingCharacterCollection|llegalTextMovement|mage(?:R(?:ight|ep(?:MatchesDevice|LoadStatus(?:ReadingHeader|Completed|InvalidData|Un(?:expectedEOF|knownType)|WillNeedAllData)))|Below|C(?:ellType|ache(?:BySize|Never|Default|Always))|Interpolation(?:High|None|Default|Low)|O(?:nly|verlaps)|Frame(?:Gr(?:oove|ayBezel)|Button|None|Photo)|L(?:oadStatus(?:ReadError|C(?:ompleted|ancelled)|InvalidData|UnexpectedEOF)|eft)|A(?:lign(?:Right|Bottom(?:Right|Left)?|Center|Top(?:Right|Left)?|Left)|bove)))|O(?:n(?:State|eByteGlyphPacking|OffButton|lyScrollerArrows)|ther(?:Mouse(?:D(?:own(?:Mask)?|ragged(?:Mask)?)|Up(?:Mask)?)|TextMovement)|SF1OperatingSystem|pe(?:n(?:GL(?:GO(?:Re(?:setLibrary|tainRenderers)|ClearFormatCache|FormatCacheSize)|PFA(?:R(?:obust|endererID)|M(?:inimumPolicy|ulti(?:sample|Screen)|PSafe|aximumPolicy)|BackingStore|S(?:creenMask|te(?:ncilSize|reo)|ingleRenderer|upersample|ample(?:s|Buffers|Alpha))|NoRecovery|C(?:o(?:lor(?:Size|Float)|mpliant)|losestPolicy)|OffScreen|D(?:oubleBuffer|epthSize)|PixelBuffer|VirtualScreenCount|FullScreen|Window|A(?:cc(?:umSize|elerated)|ux(?:Buffers|DepthStencil)|l(?:phaSize|lRenderers))))|StepUnicodeReservedBase)|rationNotSupportedForKeyS(?:criptError|pecifierError))|ffState|KButton|rPredicateType|bjC(?:B(?:itfield|oolType)|S(?:hortType|tr(?:ingType|uctType)|electorType)|NoType|CharType|ObjectType|DoubleType|UnionType|PointerType|VoidType|FloatType|Long(?:Type|longType)|ArrayType))|D(?:i(?:s(?:c(?:losureBezelStyle|reteCapacityLevelIndicatorStyle)|playWindowRunLoopOrdering)|acriticInsensitivePredicateOption|rect(?:Selection|PredicateModifier))|o(?:c(?:ModalWindowMask|ument(?:Directory|ationDirectory))|ubleType|wn(?:TextMovement|ArrowFunctionKey))|e(?:s(?:cendingPageOrder|ktopDirectory)|cimalTabStopType|v(?:ice(?:NColorSpaceModel|IndependentModifierFlagsMask)|eloper(?:Directory|ApplicationDirectory))|fault(?:ControlTint|TokenStyle)|lete(?:Char(?:acter|FunctionKey)|FunctionKey|LineFunctionKey)|moApplicationDirectory)|a(?:yCalendarUnit|teFormatter(?:MediumStyle|Behavior(?:10|Default)|ShortStyle|NoStyle|FullStyle|LongStyle))|ra(?:wer(?:Clos(?:ingState|edState)|Open(?:ingState|State))|gOperation(?:Generic|Move|None|Copy|Delete|Private|Every|Link|All)))|U(?:ser(?:CancelledError|D(?:irectory|omainMask)|FunctionKey)|RL(?:Handle(?:NotLoaded|Load(?:Succeeded|InProgress|Failed))|CredentialPersistence(?:None|Permanent|ForSession))|n(?:scaledWindowMask|cachedRead|i(?:codeStringEncoding|talicFontMask|fiedTitleAndToolbarWindowMask)|d(?:o(?:CloseGroupingRunLoopOrdering|FunctionKey)|e(?:finedDateComponent|rline(?:Style(?:Single|None|Thick|Double)|Pattern(?:Solid|D(?:ot|ash(?:Dot(?:Dot)?)?)))))|known(?:ColorSpaceModel|P(?:ointingDevice|ageOrder)|KeyS(?:criptError|pecifierError))|boldFontMask)|tilityWindowMask|TF8StringEncoding|p(?:dateWindowsRunLoopOrdering|TextMovement|ArrowFunctionKey))|J(?:ustifiedTextAlignment|PEG(?:2000FileType|FileType)|apaneseEUC(?:GlyphPacking|StringEncoding))|P(?:o(?:s(?:t(?:Now|erFontMask|WhenIdle|ASAP)|iti(?:on(?:Replace|Be(?:fore|ginning)|End|After)|ve(?:IntType|DoubleType|FloatType)))|pUp(?:NoArrow|ArrowAt(?:Bottom|Center))|werOffEventType|rtraitOrientation)|NGFileType|ush(?:InCell(?:Mask)?|OnPushOffButton)|e(?:n(?:TipMask|UpperSideMask|PointingDevice|LowerSideMask)|riodic(?:Mask)?)|P(?:S(?:caleField|tatus(?:Title|Field)|aveButton)|N(?:ote(?:Title|Field)|ame(?:Title|Field))|CopiesField|TitleField|ImageButton|OptionsButton|P(?:a(?:perFeedButton|ge(?:Range(?:To|From)|ChoiceMatrix))|reviewButton)|LayoutButton)|lainTextTokenStyle|a(?:useFunctionKey|ragraphSeparatorCharacter|ge(?:DownFunctionKey|UpFunctionKey))|r(?:int(?:ing(?:ReplyLater|Success|Cancelled|Failure)|ScreenFunctionKey|erTable(?:NotFound|OK|Error)|FunctionKey)|o(?:p(?:ertyList(?:XMLFormat|MutableContainers(?:AndLeaves)?|BinaryFormat|Immutable|OpenStepFormat)|rietaryStringEncoding)|gressIndicator(?:BarStyle|SpinningStyle|Preferred(?:SmallThickness|Thickness|LargeThickness|AquaThickness)))|e(?:ssedTab|vFunctionKey))|L(?:HeightForm|CancelButton|TitleField|ImageButton|O(?:KButton|rientationMatrix)|UnitsButton|PaperNameButton|WidthForm))|E(?:n(?:terCharacter|d(?:sWith(?:Comparison|PredicateOperatorType)|FunctionKey))|v(?:e(?:nOddWindingRule|rySubelement)|aluatedObjectExpressionType)|qualTo(?:Comparison|PredicateOperatorType)|ra(?:serPointingDevice|CalendarUnit|DatePickerElementFlag)|x(?:clude(?:10|QuickDrawElementsIconCreationOption)|pandedFontMask|ecuteFunctionKey))|V(?:i(?:ew(?:M(?:in(?:XMargin|YMargin)|ax(?:XMargin|YMargin))|HeightSizable|NotSizable|WidthSizable)|aPanelFontAction)|erticalRuler|a(?:lidationErrorM(?:inimum|aximum)|riableExpressionType))|Key(?:SpecifierEvaluationScriptError|Down(?:Mask)?|Up(?:Mask)?|PathExpressionType|Value(?:MinusSetMutation|SetSetMutation|Change(?:Re(?:placement|moval)|Setting|Insertion)|IntersectSetMutation|ObservingOption(?:New|Old)|UnionSetMutation|ValidationError))|QTMovie(?:NormalPlayback|Looping(?:BackAndForthPlayback|Playback))|F(?:1(?:1FunctionKey|7FunctionKey|2FunctionKey|8FunctionKey|3FunctionKey|9FunctionKey|4FunctionKey|5FunctionKey|FunctionKey|0FunctionKey|6FunctionKey)|7FunctionKey|i(?:nd(?:PanelAction(?:Replace(?:A(?:ndFind|ll(?:InSelection)?))?|S(?:howFindPanel|e(?:tFindString|lectAll(?:InSelection)?))|Next|Previous)|FunctionKey)|tPagination|le(?:Read(?:No(?:SuchFileError|PermissionError)|CorruptFileError|In(?:validFileNameError|applicableStringEncodingError)|Un(?:supportedSchemeError|knownError))|HandlingPanel(?:CancelButton|OKButton)|NoSuchFileError|ErrorM(?:inimum|aximum)|Write(?:NoPermissionError|In(?:validFileNameError|applicableStringEncodingError)|OutOfSpaceError|Un(?:supportedSchemeError|knownError))|LockingError)|xedPitchFontMask)|2(?:1FunctionKey|7FunctionKey|2FunctionKey|8FunctionKey|3FunctionKey|9FunctionKey|4FunctionKey|5FunctionKey|FunctionKey|0FunctionKey|6FunctionKey)|o(?:nt(?:Mo(?:noSpaceTrait|dernSerifsClass)|BoldTrait|S(?:ymbolicClass|criptsClass|labSerifsClass|ansSerifClass)|C(?:o(?:ndensedTrait|llectionApplicationOnlyMask)|larendonSerifsClass)|TransitionalSerifsClass|I(?:ntegerAdvancementsRenderingMode|talicTrait)|O(?:ldStyleSerifsClass|rnamentalsClass)|DefaultRenderingMode|U(?:nknownClass|IOptimizedTrait)|Panel(?:S(?:hadowEffectModeMask|t(?:andardModesMask|rikethroughEffectModeMask)|izeModeMask)|CollectionModeMask|TextColorEffectModeMask|DocumentColorEffectModeMask|UnderlineEffectModeMask|FaceModeMask|All(?:ModesMask|EffectsModeMask))|ExpandedTrait|VerticalTrait|F(?:amilyClassMask|reeformSerifsClass)|Antialiased(?:RenderingMode|IntegerAdvancementsRenderingMode))|cusRing(?:Below|Type(?:None|Default|Exterior)|Only|Above)|urByteGlyphPacking|rm(?:attingError(?:M(?:inimum|aximum))?|FeedCharacter))|8FunctionKey|unction(?:ExpressionType|KeyMask)|3(?:1FunctionKey|2FunctionKey|3FunctionKey|4FunctionKey|5FunctionKey|FunctionKey|0FunctionKey)|9FunctionKey|4FunctionKey|P(?:RevertButton|S(?:ize(?:Title|Field)|etButton)|CurrentField|Preview(?:Button|Field))|l(?:oat(?:ingPointSamplesBitmapFormat|Type)|agsChanged(?:Mask)?)|axButton|5FunctionKey|6FunctionKey)|W(?:heelModeColorPanel|indow(?:s(?:NTOperatingSystem|CP125(?:1StringEncoding|2StringEncoding|3StringEncoding|4StringEncoding|0StringEncoding)|95(?:InterfaceStyle|OperatingSystem))|M(?:iniaturizeButton|ovedEventType)|Below|CloseButton|ToolbarButton|ZoomButton|Out|DocumentIconButton|ExposedEventType|Above)|orkspaceLaunch(?:NewInstance|InhibitingBackgroundOnly|Default|PreferringClassic|WithoutA(?:ctivation|ddingToRecents)|A(?:sync|nd(?:Hide(?:Others)?|Print)|llowingClassicStartup))|eek(?:day(?:CalendarUnit|OrdinalCalendarUnit)|CalendarUnit)|a(?:ntsBidiLevels|rningAlertStyle)|r(?:itingDirection(?:RightToLeft|Natural|LeftToRight)|apCalendarComponents))|L(?:i(?:stModeMatrix|ne(?:Moves(?:Right|Down|Up|Left)|B(?:order|reakBy(?:C(?:harWrapping|lipping)|Truncating(?:Middle|Head|Tail)|WordWrapping))|S(?:eparatorCharacter|weep(?:Right|Down|Up|Left))|ToBezierPathElement|DoesntMove|arSlider)|teralSearch|kePredicateOperatorType|ghterFontAction|braryDirectory)|ocalDomainMask|e(?:ssThan(?:Comparison|OrEqualTo(?:Comparison|PredicateOperatorType)|PredicateOperatorType)|ft(?:Mouse(?:D(?:own(?:Mask)?|ragged(?:Mask)?)|Up(?:Mask)?)|T(?:ext(?:Movement|Alignment)|ab(?:sBezelBorder|StopType))|ArrowFunctionKey))|a(?:yout(?:RightToLeft|NotDone|CantFit|OutOfGlyphs|Done|LeftToRight)|ndscapeOrientation)|ABColorSpaceModel)|A(?:sc(?:iiWithDoubleByteEUCGlyphPacking|endingPageOrder)|n(?:y(?:Type|PredicateModifier|EventMask)|choredSearch|imation(?:Blocking|Nonblocking(?:Threaded)?|E(?:ffect(?:DisappearingItemDefault|Poof)|ase(?:In(?:Out)?|Out))|Linear)|dPredicateType)|t(?:Bottom|tachmentCharacter|omicWrite|Top)|SCIIStringEncoding|d(?:obe(?:GB1CharacterCollection|CNS1CharacterCollection|Japan(?:1CharacterCollection|2CharacterCollection)|Korea1CharacterCollection)|dTraitFontAction|minApplicationDirectory)|uto(?:saveOperation|Pagination)|pp(?:lication(?:SupportDirectory|D(?:irectory|e(?:fined(?:Mask)?|legateReply(?:Success|Cancel|Failure)|activatedEventType))|ActivatedEventType)|KitDefined(?:Mask)?)|l(?:ternateKeyMask|pha(?:ShiftKeyMask|NonpremultipliedBitmapFormat|FirstBitmapFormat)|ert(?:SecondButtonReturn|ThirdButtonReturn|OtherReturn|DefaultReturn|ErrorReturn|FirstButtonReturn|AlternateReturn)|l(?:ScrollerParts|DomainsMask|PredicateModifier|LibrariesDirectory|ApplicationsDirectory))|rgument(?:sWrongScriptError|EvaluationScriptError)|bove(?:Bottom|Top)|WTEventType)))(?:\\\\b)\"\n        },\n        {\n        token: \"support.function.C99.c\",\n        regex: C_Highlight_File.cFunctions\n        },\n        {\n            token : cObj.getKeywords(),\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        },\n        {\n            token: \"punctuation.section.scope.begin.objc\",\n            regex: \"\\\\[\",\n            next: \"bracketed_content\"\n        },\n        {\n            token: \"meta.function.objc\",\n            regex: \"^(?:-|\\\\+)\\\\s*\"\n        }\n    ],\n    \"constant_NSString\": [\n        {\n            token: \"constant.character.escape.objc\",\n            regex: escapedConstRe\n        },\n        {\n            token: \"invalid.illegal.unknown-escape.objc\",\n            regex: \"\\\\\\\\.\"\n        },\n        {\n            token: \"string\",\n            regex: '[^\"\\\\\\\\]+'\n        },\n        {\n            token: \"punctuation.definition.string.end\",\n            regex: \"\\\"\",\n            next: \"start\"\n        }\n    ],\n    \"protocol_list\": [\n        {\n            token: \"punctuation.section.scope.end.objc\",\n            regex: \">\",\n            next: \"start\"\n        },\n        {\n            token: \"support.other.protocol.objc\",\n            regex: \"\\bNS(?:GlyphStorage|M(?:utableCopying|enuItem)|C(?:hangeSpelling|o(?:ding|pying|lorPicking(?:Custom|Default)))|T(?:oolbarItemValidations|ext(?:Input|AttachmentCell))|I(?:nputServ(?:iceProvider|erMouseTracker)|gnoreMisspelledWords)|Obj(?:CTypeSerializationCallBack|ect)|D(?:ecimalNumberBehaviors|raggingInfo)|U(?:serInterfaceValidations|RL(?:HandleClient|DownloadDelegate|ProtocolClient|AuthenticationChallengeSender))|Validated(?:ToobarItem|UserInterfaceItem)|Locking)\\b\"\n        }\n    ],\n    \"selectors\": [\n        {\n            token: \"support.function.any-method.name-of-parameter.objc\",\n            regex: \"\\\\b(?:[a-zA-Z_:][\\\\w]*)+\"\n        },\n        {\n            token: \"punctuation\",\n            regex: \"\\\\)\",\n            next: \"start\"\n        }\n    ],\n    \"bracketed_content\": [\n        {\n            token: \"punctuation.section.scope.end.objc\",\n            regex: \"\\]\",\n            next: \"start\"\n        },\n        {\n            token: [\"support.function.any-method.objc\"],\n            regex: \"(?:predicateWithFormat:| NSPredicate predicateWithFormat:)\",\n            next: \"start\"\n        },\n        {\n            token: \"support.function.any-method.objc\",\n            regex: \"\\\\w+(?::|(?=\\]))\",\n            next: \"start\"\n        }\n    ],\n    \"bracketed_strings\": [\n        {\n            token: \"punctuation.section.scope.end.objc\",\n            regex: \"\\]\",\n            next: \"start\"\n        },\n        {\n            token: \"keyword.operator.logical.predicate.cocoa\",\n            regex: \"\\\\b(?:AND|OR|NOT|IN)\\\\b\"\n        },\n        {\n            token: [\"invalid.illegal.unknown-method.objc\", \"punctuation.separator.arguments.objc\"],\n            regex: \"\\\\b(\\w+)(:)\"\n        },\n        {\n            regex: \"\\\\b(?:ALL|ANY|SOME|NONE)\\\\b\",\n            token: \"constant.language.predicate.cocoa\"\n        },\n        {\n            regex: \"\\\\b(?:NULL|NIL|SELF|TRUE|YES|FALSE|NO|FIRST|LAST|SIZE)\\\\b\",\n            token: \"constant.language.predicate.cocoa\"\n        },\n        {\n            regex: \"\\\\b(?:MATCHES|CONTAINS|BEGINSWITH|ENDSWITH|BETWEEN)\\\\b\",\n            token: \"keyword.operator.comparison.predicate.cocoa\"\n        },\n        {\n            regex: \"\\\\bC(?:ASEINSENSITIVE|I)\\\\b\",\n            token: \"keyword.other.modifier.predicate.cocoa\"\n        },\n        {\n            regex: \"\\\\b(?:ANYKEY|SUBQUERY|CAST|TRUEPREDICATE|FALSEPREDICATE)\\\\b\",\n            token: \"keyword.other.predicate.cocoa\"\n        },\n        {\n            regex: escapedConstRe,\n            token: \"constant.character.escape.objc\"\n        },\n        {\n            regex: \"\\\\\\\\.\",\n            token: \"invalid.illegal.unknown-escape.objc\"\n        },\n        {\n            token: \"string\",\n            regex: '[^\"\\\\\\\\]'\n        },\n        {\n            token: \"punctuation.definition.string.end.objc\",\n            regex: \"\\\"\",\n            next: \"predicates\"\n        }\n    ],\n    \"comment\" : [\n        {\n            token : \"comment\", // closing comment\n            regex : \".*?\\\\*\\\\/\",\n            next : \"start\"\n        }, {\n            token : \"comment\", // comment spanning whole line\n            regex : \".+\"\n        }\n    ],\n    \"methods\" : [\n        {\n            token : \"meta.function.objc\",\n            regex : \"(?=\\\\{|#)|;\",\n            next : \"start\"\n        }\n    ]\n}\n    for (var r in cRules) {\n        if (this.$rules[r]) {\n            if (this.$rules[r].push)\n                this.$rules[r].push.apply(this.$rules[r], cRules[r]);\n        } else {\n            this.$rules[r] = cRules[r];\n        }\n    }\n    \n    this.$rules.bracketed_content = this.$rules.bracketed_content.concat(\n        this.$rules.start, specialVariables\n    );\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(ObjectiveCHighlightRules, CHighlightRules);\n\nexports.ObjectiveCHighlightRules = ObjectiveCHighlightRules;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/objectivec\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/objectivec_highlight_rules\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar ObjectiveCHighlightRules = require(\"./objectivec_highlight_rules\").ObjectiveCHighlightRules;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = ObjectiveCHighlightRules;\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n    this.$id = \"ace/mode/objectivec\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-ocaml.js",
    "content": "ace.define(\"ace/mode/ocaml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar OcamlHighlightRules = function() {\n\n    var keywords = (\n        \"and|as|assert|begin|class|constraint|do|done|downto|else|end|\"  +\n        \"exception|external|for|fun|function|functor|if|in|include|\"     +\n        \"inherit|initializer|lazy|let|match|method|module|mutable|new|\"  +\n        \"object|of|open|or|private|rec|sig|struct|then|to|try|type|val|\" +\n        \"virtual|when|while|with\"\n    );\n\n    var builtinConstants = (\"true|false\");\n\n    var builtinFunctions = (\n        \"abs|abs_big_int|abs_float|abs_num|abstract_tag|accept|access|acos|add|\" +\n        \"add_available_units|add_big_int|add_buffer|add_channel|add_char|\" +\n        \"add_initializer|add_int_big_int|add_interfaces|add_num|add_string|\" +\n        \"add_substitute|add_substring|alarm|allocated_bytes|allow_only|\" +\n        \"allow_unsafe_modules|always|append|appname_get|appname_set|\" +\n        \"approx_num_exp|approx_num_fix|arg|argv|arith_status|array|\" +\n        \"array1_of_genarray|array2_of_genarray|array3_of_genarray|asin|asr|\" +\n        \"assoc|assq|at_exit|atan|atan2|auto_synchronize|background|basename|\" +\n        \"beginning_of_input|big_int_of_int|big_int_of_num|big_int_of_string|bind|\" +\n        \"bind_class|bind_tag|bits|bits_of_float|black|blit|blit_image|blue|bool|\" +\n        \"bool_of_string|bounded_full_split|bounded_split|bounded_split_delim|\" +\n        \"bprintf|break|broadcast|bscanf|button_down|c_layout|capitalize|cardinal|\" +\n        \"cardinal|catch|catch_break|ceil|ceiling_num|channel|char|char_of_int|\" +\n        \"chdir|check|check_suffix|chmod|choose|chop_extension|chop_suffix|chown|\" +\n        \"chown|chr|chroot|classify_float|clear|clear_available_units|\" +\n        \"clear_close_on_exec|clear_graph|clear_nonblock|clear_parser|\" +\n        \"close|close|closeTk|close_box|close_graph|close_in|close_in_noerr|\" +\n        \"close_out|close_out_noerr|close_process|close_process|\" +\n        \"close_process_full|close_process_in|close_process_out|close_subwindow|\" +\n        \"close_tag|close_tbox|closedir|closedir|closure_tag|code|combine|\" +\n        \"combine|combine|command|compact|compare|compare_big_int|compare_num|\" +\n        \"complex32|complex64|concat|conj|connect|contains|contains_from|contents|\" +\n        \"copy|cos|cosh|count|count|counters|create|create_alarm|create_image|\" +\n        \"create_matrix|create_matrix|create_matrix|create_object|\" +\n        \"create_object_and_run_initializers|create_object_opt|create_process|\" +\n        \"create_process|create_process_env|create_process_env|create_table|\" +\n        \"current|current_dir_name|current_point|current_x|current_y|curveto|\" +\n        \"custom_tag|cyan|data_size|decr|decr_num|default_available_units|delay|\" +\n        \"delete_alarm|descr_of_in_channel|descr_of_out_channel|destroy|diff|dim|\" +\n        \"dim1|dim2|dim3|dims|dirname|display_mode|div|div_big_int|div_num|\" +\n        \"double_array_tag|double_tag|draw_arc|draw_char|draw_circle|draw_ellipse|\" +\n        \"draw_image|draw_poly|draw_poly_line|draw_rect|draw_segments|draw_string|\" +\n        \"dummy_pos|dummy_table|dump_image|dup|dup2|elements|empty|end_of_input|\" +\n        \"environment|eprintf|epsilon_float|eq_big_int|eq_num|equal|err_formatter|\" +\n        \"error_message|escaped|establish_server|executable_name|execv|execve|execvp|\" +\n        \"execvpe|exists|exists2|exit|exp|failwith|fast_sort|fchmod|fchown|field|\" +\n        \"file|file_exists|fill|fill_arc|fill_circle|fill_ellipse|fill_poly|fill_rect|\" +\n        \"filter|final_tag|finalise|find|find_all|first_chars|firstkey|flatten|\" +\n        \"float|float32|float64|float_of_big_int|float_of_bits|float_of_int|\" +\n        \"float_of_num|float_of_string|floor|floor_num|flush|flush_all|flush_input|\" +\n        \"flush_str_formatter|fold|fold_left|fold_left2|fold_right|fold_right2|\" +\n        \"for_all|for_all2|force|force_newline|force_val|foreground|fork|\" +\n        \"format_of_string|formatter_of_buffer|formatter_of_out_channel|\" +\n        \"fortran_layout|forward_tag|fprintf|frexp|from|from_channel|from_file|\" +\n        \"from_file_bin|from_function|from_string|fscanf|fst|fstat|ftruncate|\" +\n        \"full_init|full_major|full_split|gcd_big_int|ge_big_int|ge_num|\" +\n        \"genarray_of_array1|genarray_of_array2|genarray_of_array3|get|\" +\n        \"get_all_formatter_output_functions|get_approx_printing|get_copy|\" +\n        \"get_ellipsis_text|get_error_when_null_denominator|get_floating_precision|\" +\n        \"get_formatter_output_functions|get_formatter_tag_functions|get_image|\" +\n        \"get_margin|get_mark_tags|get_max_boxes|get_max_indent|get_method|\" +\n        \"get_method_label|get_normalize_ratio|get_normalize_ratio_when_printing|\" +\n        \"get_print_tags|get_state|get_variable|getcwd|getegid|getegid|getenv|\" +\n        \"getenv|getenv|geteuid|geteuid|getgid|getgid|getgrgid|getgrgid|getgrnam|\" +\n        \"getgrnam|getgroups|gethostbyaddr|gethostbyname|gethostname|getitimer|\" +\n        \"getlogin|getpeername|getpid|getppid|getprotobyname|getprotobynumber|\" +\n        \"getpwnam|getpwuid|getservbyname|getservbyport|getsockname|getsockopt|\" +\n        \"getsockopt_float|getsockopt_int|getsockopt_optint|gettimeofday|getuid|\" +\n        \"global_replace|global_substitute|gmtime|green|grid|group_beginning|\" +\n        \"group_end|gt_big_int|gt_num|guard|handle_unix_error|hash|hash_param|\" +\n        \"hd|header_size|i|id|ignore|in_channel_length|in_channel_of_descr|incr|\" +\n        \"incr_num|index|index_from|inet_addr_any|inet_addr_of_string|infinity|\" +\n        \"infix_tag|init|init_class|input|input_binary_int|input_byte|input_char|\" +\n        \"input_line|input_value|int|int16_signed|int16_unsigned|int32|int64|\" +\n        \"int8_signed|int8_unsigned|int_of_big_int|int_of_char|int_of_float|\" +\n        \"int_of_num|int_of_string|integer_num|inter|interactive|inv|invalid_arg|\" +\n        \"is_block|is_empty|is_implicit|is_int|is_int_big_int|is_integer_num|\" +\n        \"is_relative|iter|iter2|iteri|join|junk|key_pressed|kill|kind|kprintf|\" +\n        \"kscanf|land|last_chars|layout|lazy_from_fun|lazy_from_val|lazy_is_val|\" +\n        \"lazy_tag|ldexp|le_big_int|le_num|length|lexeme|lexeme_char|lexeme_end|\" +\n        \"lexeme_end_p|lexeme_start|lexeme_start_p|lineto|link|list|listen|lnot|\" +\n        \"loadfile|loadfile_private|localtime|lock|lockf|log|log10|logand|lognot|\" +\n        \"logor|logxor|lor|lower_window|lowercase|lseek|lsl|lsr|lstat|lt_big_int|\" +\n        \"lt_num|lxor|magenta|magic|mainLoop|major|major_slice|make|make_formatter|\" +\n        \"make_image|make_lexer|make_matrix|make_self_init|map|map2|map_file|mapi|\" +\n        \"marshal|match_beginning|match_end|matched_group|matched_string|max|\" +\n        \"max_array_length|max_big_int|max_elt|max_float|max_int|max_num|\" +\n        \"max_string_length|mem|mem_assoc|mem_assq|memq|merge|min|min_big_int|\" +\n        \"min_elt|min_float|min_int|min_num|minor|minus_big_int|minus_num|\" +\n        \"minus_one|mkdir|mkfifo|mktime|mod|mod_big_int|mod_float|mod_num|modf|\" +\n        \"mouse_pos|moveto|mul|mult_big_int|mult_int_big_int|mult_num|nan|narrow|\" +\n        \"nat_of_num|nativeint|neg|neg_infinity|new_block|new_channel|new_method|\" +\n        \"new_variable|next|nextkey|nice|nice|no_scan_tag|norm|norm2|not|npeek|\" +\n        \"nth|nth_dim|num_digits_big_int|num_dims|num_of_big_int|num_of_int|\" +\n        \"num_of_nat|num_of_ratio|num_of_string|O|obj|object_tag|ocaml_version|\" +\n        \"of_array|of_channel|of_float|of_int|of_int32|of_list|of_nativeint|\" +\n        \"of_string|one|openTk|open_box|open_connection|open_graph|open_hbox|\" +\n        \"open_hovbox|open_hvbox|open_in|open_in_bin|open_in_gen|open_out|\" +\n        \"open_out_bin|open_out_gen|open_process|open_process_full|open_process_in|\" +\n        \"open_process_out|open_subwindow|open_tag|open_tbox|open_temp_file|\" +\n        \"open_vbox|opendbm|opendir|openfile|or|os_type|out_channel_length|\" +\n        \"out_channel_of_descr|output|output_binary_int|output_buffer|output_byte|\" +\n        \"output_char|output_string|output_value|over_max_boxes|pack|params|\" +\n        \"parent_dir_name|parse|parse_argv|partition|pause|peek|pipe|pixels|\" +\n        \"place|plot|plots|point_color|polar|poll|pop|pos_in|pos_out|pow|\" +\n        \"power_big_int_positive_big_int|power_big_int_positive_int|\" +\n        \"power_int_positive_big_int|power_int_positive_int|power_num|\" +\n        \"pp_close_box|pp_close_tag|pp_close_tbox|pp_force_newline|\" +\n        \"pp_get_all_formatter_output_functions|pp_get_ellipsis_text|\" +\n        \"pp_get_formatter_output_functions|pp_get_formatter_tag_functions|\" +\n        \"pp_get_margin|pp_get_mark_tags|pp_get_max_boxes|pp_get_max_indent|\" +\n        \"pp_get_print_tags|pp_open_box|pp_open_hbox|pp_open_hovbox|pp_open_hvbox|\" +\n        \"pp_open_tag|pp_open_tbox|pp_open_vbox|pp_over_max_boxes|pp_print_as|\" +\n        \"pp_print_bool|pp_print_break|pp_print_char|pp_print_cut|pp_print_float|\" +\n        \"pp_print_flush|pp_print_if_newline|pp_print_int|pp_print_newline|\" +\n        \"pp_print_space|pp_print_string|pp_print_tab|pp_print_tbreak|\" +\n        \"pp_set_all_formatter_output_functions|pp_set_ellipsis_text|\" +\n        \"pp_set_formatter_out_channel|pp_set_formatter_output_functions|\" +\n        \"pp_set_formatter_tag_functions|pp_set_margin|pp_set_mark_tags|\" +\n        \"pp_set_max_boxes|pp_set_max_indent|pp_set_print_tags|pp_set_tab|\" +\n        \"pp_set_tags|pred|pred_big_int|pred_num|prerr_char|prerr_endline|\" +\n        \"prerr_float|prerr_int|prerr_newline|prerr_string|print|print_as|\" +\n        \"print_bool|print_break|print_char|print_cut|print_endline|print_float|\" +\n        \"print_flush|print_if_newline|print_int|print_newline|print_space|\" +\n        \"print_stat|print_string|print_tab|print_tbreak|printf|prohibit|\" +\n        \"public_method_label|push|putenv|quo_num|quomod_big_int|quote|raise|\" +\n        \"raise_window|ratio_of_num|rcontains_from|read|read_float|read_int|\" +\n        \"read_key|read_line|readdir|readdir|readlink|really_input|receive|recv|\" +\n        \"recvfrom|red|ref|regexp|regexp_case_fold|regexp_string|\" +\n        \"regexp_string_case_fold|register|register_exception|rem|remember_mode|\" +\n        \"remove|remove_assoc|remove_assq|rename|replace|replace_first|\" +\n        \"replace_matched|repr|reset|reshape|reshape_1|reshape_2|reshape_3|rev|\" +\n        \"rev_append|rev_map|rev_map2|rewinddir|rgb|rhs_end|rhs_end_pos|rhs_start|\" +\n        \"rhs_start_pos|rindex|rindex_from|rlineto|rmdir|rmoveto|round_num|\" +\n        \"run_initializers|run_initializers_opt|scanf|search_backward|\" +\n        \"search_forward|seek_in|seek_out|select|self|self_init|send|sendto|set|\" +\n        \"set_all_formatter_output_functions|set_approx_printing|\" +\n        \"set_binary_mode_in|set_binary_mode_out|set_close_on_exec|\" +\n        \"set_close_on_exec|set_color|set_ellipsis_text|\" +\n        \"set_error_when_null_denominator|set_field|set_floating_precision|\" +\n        \"set_font|set_formatter_out_channel|set_formatter_output_functions|\" +\n        \"set_formatter_tag_functions|set_line_width|set_margin|set_mark_tags|\" +\n        \"set_max_boxes|set_max_indent|set_method|set_nonblock|set_nonblock|\" +\n        \"set_normalize_ratio|set_normalize_ratio_when_printing|set_print_tags|\" +\n        \"set_signal|set_state|set_tab|set_tag|set_tags|set_text_size|\" +\n        \"set_window_title|setgid|setgid|setitimer|setitimer|setsid|setsid|\" +\n        \"setsockopt|setsockopt|setsockopt_float|setsockopt_float|setsockopt_int|\" +\n        \"setsockopt_int|setsockopt_optint|setsockopt_optint|setuid|setuid|\" +\n        \"shift_left|shift_left|shift_left|shift_right|shift_right|shift_right|\" +\n        \"shift_right_logical|shift_right_logical|shift_right_logical|show_buckets|\" +\n        \"shutdown|shutdown|shutdown_connection|shutdown_connection|sigabrt|\" +\n        \"sigalrm|sigchld|sigcont|sigfpe|sighup|sigill|sigint|sigkill|sign_big_int|\" +\n        \"sign_num|signal|signal|sigpending|sigpending|sigpipe|sigprocmask|\" +\n        \"sigprocmask|sigprof|sigquit|sigsegv|sigstop|sigsuspend|sigsuspend|\" +\n        \"sigterm|sigtstp|sigttin|sigttou|sigusr1|sigusr2|sigvtalrm|sin|singleton|\" +\n        \"sinh|size|size|size_x|size_y|sleep|sleep|sleep|slice_left|slice_left|\" +\n        \"slice_left_1|slice_left_2|slice_right|slice_right|slice_right_1|\" +\n        \"slice_right_2|snd|socket|socket|socket|socketpair|socketpair|sort|sound|\" +\n        \"split|split_delim|sprintf|sprintf|sqrt|sqrt|sqrt_big_int|square_big_int|\" +\n        \"square_num|sscanf|stable_sort|stable_sort|stable_sort|stable_sort|stable_sort|\" +\n        \"stable_sort|stat|stat|stat|stat|stat|stats|stats|std_formatter|stdbuf|\" +\n        \"stderr|stderr|stderr|stdib|stdin|stdin|stdin|stdout|stdout|stdout|\" +\n        \"str_formatter|string|string_after|string_before|string_match|\" +\n        \"string_of_big_int|string_of_bool|string_of_float|string_of_format|\" +\n        \"string_of_inet_addr|string_of_inet_addr|string_of_int|string_of_num|\" +\n        \"string_partial_match|string_tag|sub|sub|sub_big_int|sub_left|sub_num|\" +\n        \"sub_right|subset|subset|substitute_first|substring|succ|succ|\" +\n        \"succ|succ|succ_big_int|succ_num|symbol_end|symbol_end_pos|symbol_start|\" +\n        \"symbol_start_pos|symlink|symlink|sync|synchronize|system|system|system|\" +\n        \"tag|take|tan|tanh|tcdrain|tcdrain|tcflow|tcflow|tcflush|tcflush|\" +\n        \"tcgetattr|tcgetattr|tcsendbreak|tcsendbreak|tcsetattr|tcsetattr|\" +\n        \"temp_file|text_size|time|time|time|timed_read|timed_write|times|times|\" +\n        \"tl|tl|tl|to_buffer|to_channel|to_float|to_hex|to_int|to_int32|to_list|\" +\n        \"to_list|to_list|to_nativeint|to_string|to_string|to_string|to_string|\" +\n        \"to_string|top|top|total_size|transfer|transp|truncate|truncate|truncate|\" +\n        \"truncate|truncate|truncate|try_lock|umask|umask|uncapitalize|uncapitalize|\" +\n        \"uncapitalize|union|union|unit_big_int|unlink|unlink|unlock|unmarshal|\" +\n        \"unsafe_blit|unsafe_fill|unsafe_get|unsafe_get|unsafe_set|unsafe_set|\" +\n        \"update|uppercase|uppercase|uppercase|uppercase|usage|utimes|utimes|wait|\" +\n        \"wait|wait|wait|wait_next_event|wait_pid|wait_read|wait_signal|\" +\n        \"wait_timed_read|wait_timed_write|wait_write|waitpid|white|\" +\n        \"widen|window_id|word_size|wrap|wrap_abort|write|yellow|yield|zero|zero_big_int|\" +\n\n        \"Arg|Arith_status|Array|Array1|Array2|Array3|ArrayLabels|Big_int|Bigarray|\" +\n        \"Buffer|Callback|CamlinternalOO|Char|Complex|Condition|Dbm|Digest|Dynlink|\" +\n        \"Event|Filename|Format|Gc|Genarray|Genlex|Graphics|GraphicsX11|Hashtbl|\" +\n        \"Int32|Int64|LargeFile|Lazy|Lexing|List|ListLabels|Make|Map|Marshal|\" +\n        \"MoreLabels|Mutex|Nativeint|Num|Obj|Oo|Parsing|Pervasives|Printexc|\" +\n        \"Printf|Queue|Random|Scanf|Scanning|Set|Sort|Stack|State|StdLabels|Str|\" +\n        \"Stream|String|StringLabels|Sys|Thread|ThreadUnix|Tk|Unix|UnixLabels|Weak\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": \"this\",\n        \"keyword\": keywords,\n        \"constant.language\": builtinConstants,\n        \"support.function\": builtinFunctions\n    }, \"identifier\");\n\n    var decimalInteger = \"(?:(?:[1-9]\\\\d*)|(?:0))\";\n    var octInteger = \"(?:0[oO]?[0-7]+)\";\n    var hexInteger = \"(?:0[xX][\\\\dA-Fa-f]+)\";\n    var binInteger = \"(?:0[bB][01]+)\";\n    var integer = \"(?:\" + decimalInteger + \"|\" + octInteger + \"|\" + hexInteger + \"|\" + binInteger + \")\";\n\n    var exponent = \"(?:[eE][+-]?\\\\d+)\";\n    var fraction = \"(?:\\\\.\\\\d+)\";\n    var intPart = \"(?:\\\\d+)\";\n    var pointFloat = \"(?:(?:\" + intPart + \"?\" + fraction + \")|(?:\" + intPart + \"\\\\.))\";\n    var exponentFloat = \"(?:(?:\" + pointFloat + \"|\" +  intPart + \")\" + exponent + \")\";\n    var floatNumber = \"(?:\" + exponentFloat + \"|\" + pointFloat + \")\";\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : '\\\\(\\\\*.*?\\\\*\\\\)\\\\s*?$'\n            },\n            {\n                token : \"comment\",\n                regex : '\\\\(\\\\*.*',\n                next : \"comment\"\n            },\n            {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            },\n            {\n                token : \"string\", // single char\n                regex : \"'.'\"\n            },\n            {\n                token : \"string\", // \" string\n                regex : '\"',\n                next  : \"qstring\"\n            },\n            {\n                token : \"constant.numeric\", // imaginary\n                regex : \"(?:\" + floatNumber + \"|\\\\d+)[jJ]\\\\b\"\n            },\n            {\n                token : \"constant.numeric\", // float\n                regex : floatNumber\n            },\n            {\n                token : \"constant.numeric\", // integer\n                regex : integer + \"\\\\b\"\n            },\n            {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            },\n            {\n                token : \"keyword.operator\",\n                regex : \"\\\\+\\\\.|\\\\-\\\\.|\\\\*\\\\.|\\\\/\\\\.|#|;;|\\\\+|\\\\-|\\\\*|\\\\*\\\\*\\\\/|\\\\/\\\\/|%|<<|>>|&|\\\\||\\\\^|~|<|>|<=|=>|==|!=|<>|<-|=\"\n            },\n            {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            },\n            {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            },\n            {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\)\",\n                next : \"start\"\n            },\n            {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ],\n\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : '\"',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '.+'\n            }\n        ]\n    };\n};\n\noop.inherits(OcamlHighlightRules, TextHighlightRules);\n\nexports.OcamlHighlightRules = OcamlHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/ocaml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/ocaml_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar OcamlHighlightRules = require(\"./ocaml_highlight_rules\").OcamlHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.HighlightRules = OcamlHighlightRules;\n    \n    this.$outdent   = new MatchingBraceOutdent();\n};\noop.inherits(Mode, TextMode);\n\nvar indenter = /(?:[({[=:]|[-=]>|\\b(?:else|try|with))\\s*$/;\n\n(function() {\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var i, line;\n        var outdent = true;\n        var re = /^\\s*\\(\\*(.*)\\*\\)/;\n\n        for (i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        var range = new Range(0, 0, 0, 0);\n        for (i=startRow; i<= endRow; i++) {\n            line = doc.getLine(i);\n            range.start.row  = i;\n            range.end.row    = i;\n            range.end.column = line.length;\n\n            doc.replace(range, outdent ? line.match(re)[1] : \"(*\" + line + \"*)\");\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n\n        if (!(tokens.length && tokens[tokens.length - 1].type === 'comment') &&\n            state === 'start' && indenter.test(line))\n            indent += tab;\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/ocaml\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-pascal.js",
    "content": "ace.define(\"ace/mode/pascal_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar PascalHighlightRules = function() {\n\n    this.$rules = { start: \n       [ { caseInsensitive: true,\n           token: 'keyword.control.pascal',\n           regex: '\\\\b(?:(absolute|abstract|all|and|and_then|array|as|asm|attribute|begin|bindable|case|class|const|constructor|destructor|div|do|do|else|end|except|export|exports|external|far|file|finalization|finally|for|forward|goto|if|implementation|import|in|inherited|initialization|interface|interrupt|is|label|library|mod|module|name|near|nil|not|object|of|only|operator|or|or_else|otherwise|packed|pow|private|program|property|protected|public|published|qualified|record|repeat|resident|restricted|segment|set|shl|shr|then|to|try|type|unit|until|uses|value|var|view|virtual|while|with|xor))\\\\b' },\n         { caseInsensitive: true,           \n           token: \n            [ 'variable.pascal', \"text\",\n              'storage.type.prototype.pascal',\n              'entity.name.function.prototype.pascal' ],\n           regex: '\\\\b(function|procedure)(\\\\s+)(\\\\w+)(\\\\.\\\\w+)?(?=(?:\\\\(.*?\\\\))?;\\\\s*(?:attribute|forward|external))' },\n         { caseInsensitive: true,\n           token: \n            [ 'variable.pascal', \"text\",\n              'storage.type.function.pascal',\n              'entity.name.function.pascal' ],\n           regex: '\\\\b(function|procedure)(\\\\s+)(\\\\w+)(\\\\.\\\\w+)?' },\n         { token: 'constant.numeric.pascal',\n           regex: '\\\\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\\\\.?[0-9]*)|(\\\\.[0-9]+))((e|E)(\\\\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b' },\n         { token: 'punctuation.definition.comment.pascal',\n           regex: '--.*$',\n           push_: \n            [ { token: 'comment.line.double-dash.pascal.one',\n                regex: '$',\n                next: 'pop' },\n              { defaultToken: 'comment.line.double-dash.pascal.one' } ] },\n         { token: 'punctuation.definition.comment.pascal',\n           regex: '//.*$',\n           push_: \n            [ { token: 'comment.line.double-slash.pascal.two',\n                regex: '$',\n                next: 'pop' },\n              { defaultToken: 'comment.line.double-slash.pascal.two' } ] },\n         { token: 'punctuation.definition.comment.pascal',\n           regex: '\\\\(\\\\*',\n           push: \n            [ { token: 'punctuation.definition.comment.pascal',\n                regex: '\\\\*\\\\)',\n                next: 'pop' },\n              { defaultToken: 'comment.block.pascal.one' } ] },\n         { token: 'punctuation.definition.comment.pascal',\n           regex: '\\\\{',\n           push: \n            [ { token: 'punctuation.definition.comment.pascal',\n                regex: '\\\\}',\n                next: 'pop' },\n              { defaultToken: 'comment.block.pascal.two' } ] },\n         { token: 'punctuation.definition.string.begin.pascal',\n           regex: '\"',\n           push: \n            [ { token: 'constant.character.escape.pascal', regex: '\\\\\\\\.' },\n              { token: 'punctuation.definition.string.end.pascal',\n                regex: '\"',\n                next: 'pop' },\n              { defaultToken: 'string.quoted.double.pascal' } ],\n            },\n         { token: 'punctuation.definition.string.begin.pascal',\n           regex: '\\'',\n           push: \n            [ { token: 'constant.character.escape.apostrophe.pascal',\n                regex: '\\'\\'' },\n              { token: 'punctuation.definition.string.end.pascal',\n                regex: '\\'',\n                next: 'pop' },\n              { defaultToken: 'string.quoted.single.pascal' } ] },\n          { token: 'keyword.operator',\n           regex: '[+\\\\-;,/*%]|:=|=' } ] }\n    \n    this.normalizeRules();\n};\n\noop.inherits(PascalHighlightRules, TextHighlightRules);\n\nexports.PascalHighlightRules = PascalHighlightRules;\n});\n\nace.define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var range = this.indentationBlock(session, row);\n        if (range)\n            return range;\n\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1 || line[startLevel] != \"#\")\n            return;\n\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var level = line.search(re);\n\n            if (level == -1)\n                continue;\n\n            if (line[level] != \"#\")\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        var next = session.getLine(row + 1);\n        var prev = session.getLine(row - 1);\n        var prevIndent = prev.search(/\\S/);\n        var nextIndent = next.search(/\\S/);\n\n        if (indent == -1) {\n            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? \"start\" : \"\";\n            return \"\";\n        }\n        if (prevIndent == -1) {\n            if (indent == nextIndent && line[indent] == \"#\" && next[indent] == \"#\") {\n                session.foldWidgets[row - 1] = \"\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"start\";\n            }\n        } else if (prevIndent == indent && line[indent] == \"#\" && prev[indent] == \"#\") {\n            if (session.getLine(row - 2).search(/\\S/) == -1) {\n                session.foldWidgets[row - 1] = \"start\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"\";\n            }\n        }\n\n        if (prevIndent!= -1 && prevIndent < indent)\n            session.foldWidgets[row - 1] = \"start\";\n        else\n            session.foldWidgets[row - 1] = \"\";\n\n        if (indent < nextIndent)\n            return \"start\";\n        else\n            return \"\";\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/pascal\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/pascal_highlight_rules\",\"ace/mode/folding/coffee\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar PascalHighlightRules = require(\"./pascal_highlight_rules\").PascalHighlightRules;\nvar FoldMode = require(\"./folding/coffee\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = PascalHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n       \n    this.lineCommentStart = [\"--\", \"//\"];\n    this.blockComment = [\n        {start: \"(*\", end: \"*)\"},\n        {start: \"{\", end: \"}\"}\n    ];\n    \n    this.$id = \"ace/mode/pascal\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-perl.js",
    "content": "ace.define(\"ace/mode/perl_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar PerlHighlightRules = function() {\n\n    var keywords = (\n        \"base|constant|continue|else|elsif|for|foreach|format|goto|if|last|local|my|next|\" +\n         \"no|package|parent|redo|require|scalar|sub|unless|until|while|use|vars\"\n    );\n\n    var buildinConstants = (\"ARGV|ENV|INC|SIG\");\n\n    var builtinFunctions = (\n        \"getprotobynumber|getprotobyname|getservbyname|gethostbyaddr|\" +\n         \"gethostbyname|getservbyport|getnetbyaddr|getnetbyname|getsockname|\" +\n         \"getpeername|setpriority|getprotoent|setprotoent|getpriority|\" +\n         \"endprotoent|getservent|setservent|endservent|sethostent|socketpair|\" +\n         \"getsockopt|gethostent|endhostent|setsockopt|setnetent|quotemeta|\" +\n         \"localtime|prototype|getnetent|endnetent|rewinddir|wantarray|getpwuid|\" +\n         \"closedir|getlogin|readlink|endgrent|getgrgid|getgrnam|shmwrite|\" +\n         \"shutdown|readline|endpwent|setgrent|readpipe|formline|truncate|\" +\n         \"dbmclose|syswrite|setpwent|getpwnam|getgrent|getpwent|ucfirst|sysread|\" +\n         \"setpgrp|shmread|sysseek|sysopen|telldir|defined|opendir|connect|\" +\n         \"lcfirst|getppid|binmode|syscall|sprintf|getpgrp|readdir|seekdir|\" +\n         \"waitpid|reverse|unshift|symlink|dbmopen|semget|msgrcv|rename|listen|\" +\n         \"chroot|msgsnd|shmctl|accept|unpack|exists|fileno|shmget|system|\" +\n         \"unlink|printf|gmtime|msgctl|semctl|values|rindex|substr|splice|\" +\n         \"length|msgget|select|socket|return|caller|delete|alarm|ioctl|index|\" +\n         \"undef|lstat|times|srand|chown|fcntl|close|write|umask|rmdir|study|\" +\n         \"sleep|chomp|untie|print|utime|mkdir|atan2|split|crypt|flock|chmod|\" +\n         \"BEGIN|bless|chdir|semop|shift|reset|link|stat|chop|grep|fork|dump|\" +\n         \"join|open|tell|pipe|exit|glob|warn|each|bind|sort|pack|eval|push|\" +\n         \"keys|getc|kill|seek|sqrt|send|wait|rand|tied|read|time|exec|recv|\" +\n         \"eof|chr|int|ord|exp|pos|pop|sin|log|abs|oct|hex|tie|cos|vec|END|ref|\" +\n         \"map|die|uc|lc|do\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"keyword\": keywords,\n        \"constant.language\": buildinConstants,\n        \"support.function\": builtinFunctions\n    }, \"identifier\");\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment.doc\",\n                regex : \"^=(?:begin|item)\\\\b\",\n                next : \"block_comment\"\n            }, {\n                token : \"string.regexp\",\n                regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                regex : '[\"].*\\\\\\\\$',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"string\", // multi line string start\n                regex : \"['].*\\\\\\\\$\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0x[0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"%#|\\\\$#|\\\\.\\\\.\\\\.|\\\\|\\\\|=|>>=|<<=|<=>|&&=|=>|!~|\\\\^=|&=|\\\\|=|\\\\.=|x=|%=|\\\\/=|\\\\*=|\\\\-=|\\\\+=|=~|\\\\*\\\\*|\\\\-\\\\-|\\\\.\\\\.|\\\\|\\\\||&&|\\\\+\\\\+|\\\\->|!=|==|>=|<=|>>|<<|,|=|\\\\?\\\\:|\\\\^|\\\\||x|%|\\\\/|\\\\*|<|&|\\\\\\\\|~|!|>|\\\\.|\\\\-|\\\\+|\\\\-C|\\\\-b|\\\\-S|\\\\-u|\\\\-t|\\\\-p|\\\\-l|\\\\-d|\\\\-f|\\\\-g|\\\\-s|\\\\-z|\\\\-k|\\\\-e|\\\\-O|\\\\-T|\\\\-B|\\\\-M|\\\\-A|\\\\-X|\\\\-W|\\\\-c|\\\\-R|\\\\-o|\\\\-x|\\\\-w|\\\\-r|\\\\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\"\n            }, {\n                token : \"comment\",\n                regex : \"#.*$\"\n            }, {\n                token : \"lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '.+'\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '.+'\n            }\n        ],\n        \"block_comment\": [\n            {\n                token: \"comment.doc\", \n                regex: \"^=cut\\\\b\",\n                next: \"start\"\n            },\n            {\n                defaultToken: \"comment.doc\"\n            }\n        ]\n    };\n};\n\noop.inherits(PerlHighlightRules, TextHighlightRules);\n\nexports.PerlHighlightRules = PerlHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/perl\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/perl_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar PerlHighlightRules = require(\"./perl_highlight_rules\").PerlHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = PerlHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.foldingRules = new CStyleFoldMode({start: \"^=(begin|item)\\\\b\", end: \"^=(cut)\\\\b\"});\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"#\";\n    this.blockComment = [\n        {start: \"=begin\", end: \"=cut\"},\n        {start: \"=item\", end: \"=cut\"}\n    ];\n\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[\\:]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/perl\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-pgsql.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/perl_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar PerlHighlightRules = function() {\n\n    var keywords = (\n        \"base|constant|continue|else|elsif|for|foreach|format|goto|if|last|local|my|next|\" +\n         \"no|package|parent|redo|require|scalar|sub|unless|until|while|use|vars\"\n    );\n\n    var buildinConstants = (\"ARGV|ENV|INC|SIG\");\n\n    var builtinFunctions = (\n        \"getprotobynumber|getprotobyname|getservbyname|gethostbyaddr|\" +\n         \"gethostbyname|getservbyport|getnetbyaddr|getnetbyname|getsockname|\" +\n         \"getpeername|setpriority|getprotoent|setprotoent|getpriority|\" +\n         \"endprotoent|getservent|setservent|endservent|sethostent|socketpair|\" +\n         \"getsockopt|gethostent|endhostent|setsockopt|setnetent|quotemeta|\" +\n         \"localtime|prototype|getnetent|endnetent|rewinddir|wantarray|getpwuid|\" +\n         \"closedir|getlogin|readlink|endgrent|getgrgid|getgrnam|shmwrite|\" +\n         \"shutdown|readline|endpwent|setgrent|readpipe|formline|truncate|\" +\n         \"dbmclose|syswrite|setpwent|getpwnam|getgrent|getpwent|ucfirst|sysread|\" +\n         \"setpgrp|shmread|sysseek|sysopen|telldir|defined|opendir|connect|\" +\n         \"lcfirst|getppid|binmode|syscall|sprintf|getpgrp|readdir|seekdir|\" +\n         \"waitpid|reverse|unshift|symlink|dbmopen|semget|msgrcv|rename|listen|\" +\n         \"chroot|msgsnd|shmctl|accept|unpack|exists|fileno|shmget|system|\" +\n         \"unlink|printf|gmtime|msgctl|semctl|values|rindex|substr|splice|\" +\n         \"length|msgget|select|socket|return|caller|delete|alarm|ioctl|index|\" +\n         \"undef|lstat|times|srand|chown|fcntl|close|write|umask|rmdir|study|\" +\n         \"sleep|chomp|untie|print|utime|mkdir|atan2|split|crypt|flock|chmod|\" +\n         \"BEGIN|bless|chdir|semop|shift|reset|link|stat|chop|grep|fork|dump|\" +\n         \"join|open|tell|pipe|exit|glob|warn|each|bind|sort|pack|eval|push|\" +\n         \"keys|getc|kill|seek|sqrt|send|wait|rand|tied|read|time|exec|recv|\" +\n         \"eof|chr|int|ord|exp|pos|pop|sin|log|abs|oct|hex|tie|cos|vec|END|ref|\" +\n         \"map|die|uc|lc|do\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"keyword\": keywords,\n        \"constant.language\": buildinConstants,\n        \"support.function\": builtinFunctions\n    }, \"identifier\");\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment.doc\",\n                regex : \"^=(?:begin|item)\\\\b\",\n                next : \"block_comment\"\n            }, {\n                token : \"string.regexp\",\n                regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                regex : '[\"].*\\\\\\\\$',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"string\", // multi line string start\n                regex : \"['].*\\\\\\\\$\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0x[0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"%#|\\\\$#|\\\\.\\\\.\\\\.|\\\\|\\\\|=|>>=|<<=|<=>|&&=|=>|!~|\\\\^=|&=|\\\\|=|\\\\.=|x=|%=|\\\\/=|\\\\*=|\\\\-=|\\\\+=|=~|\\\\*\\\\*|\\\\-\\\\-|\\\\.\\\\.|\\\\|\\\\||&&|\\\\+\\\\+|\\\\->|!=|==|>=|<=|>>|<<|,|=|\\\\?\\\\:|\\\\^|\\\\||x|%|\\\\/|\\\\*|<|&|\\\\\\\\|~|!|>|\\\\.|\\\\-|\\\\+|\\\\-C|\\\\-b|\\\\-S|\\\\-u|\\\\-t|\\\\-p|\\\\-l|\\\\-d|\\\\-f|\\\\-g|\\\\-s|\\\\-z|\\\\-k|\\\\-e|\\\\-O|\\\\-T|\\\\-B|\\\\-M|\\\\-A|\\\\-X|\\\\-W|\\\\-c|\\\\-R|\\\\-o|\\\\-x|\\\\-w|\\\\-r|\\\\b(?:and|cmp|eq|ge|gt|le|lt|ne|not|or|xor)\"\n            }, {\n                token : \"comment\",\n                regex : \"#.*$\"\n            }, {\n                token : \"lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '.+'\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '.+'\n            }\n        ],\n        \"block_comment\": [\n            {\n                token: \"comment.doc\", \n                regex: \"^=cut\\\\b\",\n                next: \"start\"\n            },\n            {\n                defaultToken: \"comment.doc\"\n            }\n        ]\n    };\n};\n\noop.inherits(PerlHighlightRules, TextHighlightRules);\n\nexports.PerlHighlightRules = PerlHighlightRules;\n});\n\nace.define(\"ace/mode/python_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar PythonHighlightRules = function() {\n\n    var keywords = (\n        \"and|as|assert|break|class|continue|def|del|elif|else|except|exec|\" +\n        \"finally|for|from|global|if|import|in|is|lambda|not|or|pass|print|\" +\n        \"raise|return|try|while|with|yield\"\n    );\n\n    var builtinConstants = (\n        \"True|False|None|NotImplemented|Ellipsis|__debug__\"\n    );\n\n    var builtinFunctions = (\n        \"abs|divmod|input|open|staticmethod|all|enumerate|int|ord|str|any|\" +\n        \"eval|isinstance|pow|sum|basestring|execfile|issubclass|print|super|\" +\n        \"binfile|iter|property|tuple|bool|filter|len|range|type|bytearray|\" +\n        \"float|list|raw_input|unichr|callable|format|locals|reduce|unicode|\" +\n        \"chr|frozenset|long|reload|vars|classmethod|getattr|map|repr|xrange|\" +\n        \"cmp|globals|max|reversed|zip|compile|hasattr|memoryview|round|\" +\n        \"__import__|complex|hash|min|set|apply|delattr|help|next|setattr|\" +\n        \"buffer|dict|hex|object|slice|coerce|dir|id|oct|sorted|intern\"\n    );\n    var keywordMapper = this.createKeywordMapper({\n        \"invalid.deprecated\": \"debugger\",\n        \"support.function\": builtinFunctions,\n        \"constant.language\": builtinConstants,\n        \"keyword\": keywords\n    }, \"identifier\");\n\n    var strPre = \"(?:r|u|ur|R|U|UR|Ur|uR)?\";\n\n    var decimalInteger = \"(?:(?:[1-9]\\\\d*)|(?:0))\";\n    var octInteger = \"(?:0[oO]?[0-7]+)\";\n    var hexInteger = \"(?:0[xX][\\\\dA-Fa-f]+)\";\n    var binInteger = \"(?:0[bB][01]+)\";\n    var integer = \"(?:\" + decimalInteger + \"|\" + octInteger + \"|\" + hexInteger + \"|\" + binInteger + \")\";\n\n    var exponent = \"(?:[eE][+-]?\\\\d+)\";\n    var fraction = \"(?:\\\\.\\\\d+)\";\n    var intPart = \"(?:\\\\d+)\";\n    var pointFloat = \"(?:(?:\" + intPart + \"?\" + fraction + \")|(?:\" + intPart + \"\\\\.))\";\n    var exponentFloat = \"(?:(?:\" + pointFloat + \"|\" +  intPart + \")\" + exponent + \")\";\n    var floatNumber = \"(?:\" + exponentFloat + \"|\" + pointFloat + \")\";\n\n    var stringEscape =  \"\\\\\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\\\\\abfnrtv'\\\"]|U[0-9A-Fa-f]{8}|u[0-9A-Fa-f]{4})\";\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment\",\n            regex : \"#.*$\"\n        }, {\n            token : \"string\",           // multi line \"\"\" string start\n            regex : strPre + '\"{3}',\n            next : \"qqstring3\"\n        }, {\n            token : \"string\",           // \" string\n            regex : strPre + '\"(?=.)',\n            next : \"qqstring\"\n        }, {\n            token : \"string\",           // multi line ''' string start\n            regex : strPre + \"'{3}\",\n            next : \"qstring3\"\n        }, {\n            token : \"string\",           // ' string\n            regex : strPre + \"'(?=.)\",\n            next : \"qstring\"\n        }, {\n            token : \"constant.numeric\", // imaginary\n            regex : \"(?:\" + floatNumber + \"|\\\\d+)[jJ]\\\\b\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : floatNumber\n        }, {\n            token : \"constant.numeric\", // long integer\n            regex : integer + \"[lL]\\\\b\"\n        }, {\n            token : \"constant.numeric\", // integer\n            regex : integer + \"\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\\\+|\\\\-|\\\\*|\\\\*\\\\*|\\\\/|\\\\/\\\\/|%|<<|>>|&|\\\\||\\\\^|~|<|>|<=|=>|==|!=|<>|=\"\n        }, {\n            token : \"paren.lparen\",\n            regex : \"[\\\\[\\\\(\\\\{]\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\]\\\\)\\\\}]\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        } ],\n        \"qqstring3\" : [ {\n            token : \"constant.language.escape\",\n            regex : stringEscape\n        }, {\n            token : \"string\", // multi line \"\"\" string end\n            regex : '\"{3}',\n            next : \"start\"\n        }, {\n            defaultToken : \"string\"\n        } ],\n        \"qstring3\" : [ {\n            token : \"constant.language.escape\",\n            regex : stringEscape\n        }, {\n            token : \"string\",  // multi line ''' string end\n            regex : \"'{3}\",\n            next : \"start\"\n        }, {\n            defaultToken : \"string\"\n        } ],\n        \"qqstring\" : [{\n            token : \"constant.language.escape\",\n            regex : stringEscape\n        }, {\n            token : \"string\",\n            regex : \"\\\\\\\\$\",\n            next  : \"qqstring\"\n        }, {\n            token : \"string\",\n            regex : '\"|$',\n            next  : \"start\"\n        }, {\n            defaultToken: \"string\"\n        }],\n        \"qstring\" : [{\n            token : \"constant.language.escape\",\n            regex : stringEscape\n        }, {\n            token : \"string\",\n            regex : \"\\\\\\\\$\",\n            next  : \"qstring\"\n        }, {\n            token : \"string\",\n            regex : \"'|$\",\n            next  : \"start\"\n        }, {\n            defaultToken: \"string\"\n        }]\n    };\n};\n\noop.inherits(PythonHighlightRules, TextHighlightRules);\n\nexports.PythonHighlightRules = PythonHighlightRules;\n});\n\nace.define(\"ace/mode/json_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JsonHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"variable\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]\\\\s*(?=:)'\n            }, {\n                token : \"string\", // single line\n                regex : '\"',\n                next  : \"string\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : \"invalid.illegal\", // single quoted strings are not allowed\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"invalid.illegal\", // comments are not allowed\n                regex : \"\\\\/\\\\/.*$\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"string\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : /\\\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|[\"\\\\\\/bfnrt])/\n            }, {\n                token : \"string\",\n                regex : '[^\"\\\\\\\\]+'\n            }, {\n                token : \"string\",\n                regex : '\"',\n                next  : \"start\"\n            }, {\n                token : \"string\",\n                regex : \"\",\n                next  : \"start\"\n            }\n        ]\n    };\n    \n};\n\noop.inherits(JsonHighlightRules, TextHighlightRules);\n\nexports.JsonHighlightRules = JsonHighlightRules;\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/pgsql_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\",\"ace/mode/perl_highlight_rules\",\"ace/mode/python_highlight_rules\",\"ace/mode/json_highlight_rules\",\"ace/mode/javascript_highlight_rules\"], function(require, exports, module) {\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar PerlHighlightRules = require(\"./perl_highlight_rules\").PerlHighlightRules;\nvar PythonHighlightRules = require(\"./python_highlight_rules\").PythonHighlightRules;\nvar JsonHighlightRules = require(\"./json_highlight_rules\").JsonHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\n\nvar PgsqlHighlightRules = function() {\n    var keywords = (\n        \"abort|absolute|abstime|access|aclitem|action|add|admin|after|aggregate|all|also|alter|always|\" +\n        \"analyse|analyze|and|any|anyarray|anyelement|anyenum|anynonarray|anyrange|array|as|asc|\" +\n        \"assertion|assignment|asymmetric|at|attribute|authorization|backward|before|begin|between|\" +\n        \"bigint|binary|bit|bool|boolean|both|box|bpchar|by|bytea|cache|called|cascade|cascaded|case|cast|\" +\n        \"catalog|chain|char|character|characteristics|check|checkpoint|cid|cidr|circle|class|close|\" +\n        \"cluster|coalesce|collate|collation|column|comment|comments|commit|committed|concurrently|\" +\n        \"configuration|connection|constraint|constraints|content|continue|conversion|copy|cost|\" +\n        \"create|cross|cstring|csv|current|current_catalog|current_date|current_role|\" +\n        \"current_schema|current_time|current_timestamp|current_user|cursor|cycle|data|database|\" +\n        \"date|daterange|day|deallocate|dec|decimal|declare|default|defaults|deferrable|deferred|\" +\n        \"definer|delete|delimiter|delimiters|desc|dictionary|disable|discard|distinct|do|document|\" +\n        \"domain|double|drop|each|else|enable|encoding|encrypted|end|enum|escape|event|event_trigger|\" +\n        \"except|exclude|excluding|exclusive|execute|exists|explain|extension|external|extract|false|\" +\n        \"family|fdw_handler|fetch|first|float|float4|float8|following|for|force|foreign|forward|\" +\n        \"freeze|from|full|function|functions|global|grant|granted|greatest|group|gtsvector|handler|\" +\n        \"having|header|hold|hour|identity|if|ilike|immediate|immutable|implicit|in|including|\" +\n        \"increment|index|indexes|inet|inherit|inherits|initially|inline|inner|inout|input|\" +\n        \"insensitive|insert|instead|int|int2|int2vector|int4|int4range|int8|int8range|integer|\" +\n        \"internal|intersect|interval|into|invoker|is|isnull|isolation|join|json|key|label|language|\" +\n        \"language_handler|large|last|lateral|lc_collate|lc_ctype|leading|leakproof|least|left|level|\" +\n        \"like|limit|line|listen|load|local|localtime|localtimestamp|location|lock|lseg|macaddr|\" +\n        \"mapping|match|materialized|maxvalue|minute|minvalue|mode|money|month|move|name|names|\" +\n        \"national|natural|nchar|next|no|none|not|nothing|notify|notnull|nowait|null|nullif|nulls|\" +\n        \"numeric|numrange|object|of|off|offset|oid|oids|oidvector|on|only|opaque|operator|option|\" +\n        \"options|or|order|out|outer|over|overlaps|overlay|owned|owner|parser|partial|partition|passing|\" +\n        \"password|path|pg_attribute|pg_auth_members|pg_authid|pg_class|pg_database|pg_node_tree|\" +\n        \"pg_proc|pg_type|placing|plans|point|polygon|position|preceding|precision|prepare|prepared|\" +\n        \"preserve|primary|prior|privileges|procedural|procedure|program|quote|range|read|real|\" +\n        \"reassign|recheck|record|recursive|ref|refcursor|references|refresh|regclass|regconfig|\" +\n        \"regdictionary|regoper|regoperator|regproc|regprocedure|regtype|reindex|relative|release|\" +\n        \"reltime|rename|repeatable|replace|replica|reset|restart|restrict|returning|returns|revoke|\" +\n        \"right|role|rollback|row|rows|rule|savepoint|schema|scroll|search|second|security|select|\" +\n        \"sequence|sequences|serializable|server|session|session_user|set|setof|share|show|similar|\" +\n        \"simple|smallint|smgr|snapshot|some|stable|standalone|start|statement|statistics|stdin|\" +\n        \"stdout|storage|strict|strip|substring|symmetric|sysid|system|table|tables|tablespace|temp|\" +\n        \"template|temporary|text|then|tid|time|timestamp|timestamptz|timetz|tinterval|to|trailing|\" +\n        \"transaction|treat|trigger|trim|true|truncate|trusted|tsquery|tsrange|tstzrange|tsvector|\" +\n        \"txid_snapshot|type|types|unbounded|uncommitted|unencrypted|union|unique|unknown|unlisten|\" +\n        \"unlogged|until|update|user|using|uuid|vacuum|valid|validate|validator|value|values|varbit|\" +\n        \"varchar|variadic|varying|verbose|version|view|void|volatile|when|where|whitespace|window|\" +\n        \"with|without|work|wrapper|write|xid|xml|xmlattributes|xmlconcat|xmlelement|xmlexists|\" +\n        \"xmlforest|xmlparse|xmlpi|xmlroot|xmlserialize|year|yes|zone\"\n    );\n\n\n    var builtinFunctions = (\n        \"RI_FKey_cascade_del|RI_FKey_cascade_upd|RI_FKey_check_ins|RI_FKey_check_upd|\" +\n        \"RI_FKey_noaction_del|RI_FKey_noaction_upd|RI_FKey_restrict_del|RI_FKey_restrict_upd|\" +\n        \"RI_FKey_setdefault_del|RI_FKey_setdefault_upd|RI_FKey_setnull_del|\" +\n        \"RI_FKey_setnull_upd|abbrev|abs|abstime|abstimeeq|abstimege|abstimegt|abstimein|abstimele|\" +\n        \"abstimelt|abstimene|abstimeout|abstimerecv|abstimesend|aclcontains|acldefault|\" +\n        \"aclexplode|aclinsert|aclitemeq|aclitemin|aclitemout|aclremove|acos|age|any_in|any_out|\" +\n        \"anyarray_in|anyarray_out|anyarray_recv|anyarray_send|anyelement_in|anyelement_out|\" +\n        \"anyenum_in|anyenum_out|anynonarray_in|anynonarray_out|anyrange_in|anyrange_out|\" +\n        \"anytextcat|area|areajoinsel|areasel|array_agg|array_agg_finalfn|array_agg_transfn|\" +\n        \"array_append|array_cat|array_dims|array_eq|array_fill|array_ge|array_gt|array_in|\" +\n        \"array_larger|array_le|array_length|array_lower|array_lt|array_ndims|array_ne|array_out|\" +\n        \"array_prepend|array_recv|array_remove|array_replace|array_send|array_smaller|\" +\n        \"array_to_json|array_to_string|array_typanalyze|array_upper|arraycontained|\" +\n        \"arraycontains|arraycontjoinsel|arraycontsel|arrayoverlap|ascii|ascii_to_mic|\" +\n        \"ascii_to_utf8|asin|atan|atan2|avg|big5_to_euc_tw|big5_to_mic|big5_to_utf8|bit_and|bit_in|\" +\n        \"bit_length|bit_or|bit_out|bit_recv|bit_send|bitand|bitcat|bitcmp|biteq|bitge|bitgt|bitle|\" +\n        \"bitlt|bitne|bitnot|bitor|bitshiftleft|bitshiftright|bittypmodin|bittypmodout|bitxor|bool|\" +\n        \"bool_and|bool_or|booland_statefunc|booleq|boolge|boolgt|boolin|boolle|boollt|boolne|\" +\n        \"boolor_statefunc|boolout|boolrecv|boolsend|box|box_above|box_above_eq|box_add|box_below|\" +\n        \"box_below_eq|box_center|box_contain|box_contain_pt|box_contained|box_distance|box_div|\" +\n        \"box_eq|box_ge|box_gt|box_in|box_intersect|box_le|box_left|box_lt|box_mul|box_out|\" +\n        \"box_overabove|box_overbelow|box_overlap|box_overleft|box_overright|box_recv|box_right|\" +\n        \"box_same|box_send|box_sub|bpchar_larger|bpchar_pattern_ge|bpchar_pattern_gt|\" +\n        \"bpchar_pattern_le|bpchar_pattern_lt|bpchar_smaller|bpcharcmp|bpchareq|bpcharge|\" +\n        \"bpchargt|bpchariclike|bpcharicnlike|bpcharicregexeq|bpcharicregexne|bpcharin|bpcharle|\" +\n        \"bpcharlike|bpcharlt|bpcharne|bpcharnlike|bpcharout|bpcharrecv|bpcharregexeq|\" +\n        \"bpcharregexne|bpcharsend|bpchartypmodin|bpchartypmodout|broadcast|btabstimecmp|\" +\n        \"btarraycmp|btbeginscan|btboolcmp|btbpchar_pattern_cmp|btbuild|btbuildempty|\" +\n        \"btbulkdelete|btcanreturn|btcharcmp|btcostestimate|btendscan|btfloat48cmp|btfloat4cmp|\" +\n        \"btfloat4sortsupport|btfloat84cmp|btfloat8cmp|btfloat8sortsupport|btgetbitmap|\" +\n        \"btgettuple|btinsert|btint24cmp|btint28cmp|btint2cmp|btint2sortsupport|btint42cmp|\" +\n        \"btint48cmp|btint4cmp|btint4sortsupport|btint82cmp|btint84cmp|btint8cmp|\" +\n        \"btint8sortsupport|btmarkpos|btnamecmp|btnamesortsupport|btoidcmp|btoidsortsupport|\" +\n        \"btoidvectorcmp|btoptions|btrecordcmp|btreltimecmp|btrescan|btrestrpos|btrim|\" +\n        \"bttext_pattern_cmp|bttextcmp|bttidcmp|bttintervalcmp|btvacuumcleanup|\" +\n        \"bytea_string_agg_finalfn|bytea_string_agg_transfn|byteacat|byteacmp|byteaeq|byteage|\" +\n        \"byteagt|byteain|byteale|bytealike|bytealt|byteane|byteanlike|byteaout|bytearecv|byteasend|\" +\n        \"cash_cmp|cash_div_cash|cash_div_flt4|cash_div_flt8|cash_div_int2|cash_div_int4|cash_eq|\" +\n        \"cash_ge|cash_gt|cash_in|cash_le|cash_lt|cash_mi|cash_mul_flt4|cash_mul_flt8|\" +\n        \"cash_mul_int2|cash_mul_int4|cash_ne|cash_out|cash_pl|cash_recv|cash_send|cash_words|\" +\n        \"cashlarger|cashsmaller|cbrt|ceil|ceiling|center|char|char_length|character_length|chareq|\" +\n        \"charge|chargt|charin|charle|charlt|charne|charout|charrecv|charsend|chr|cideq|cidin|cidout|\" +\n        \"cidr|cidr_in|cidr_out|cidr_recv|cidr_send|cidrecv|cidsend|circle|circle_above|\" +\n        \"circle_add_pt|circle_below|circle_center|circle_contain|circle_contain_pt|\" +\n        \"circle_contained|circle_distance|circle_div_pt|circle_eq|circle_ge|circle_gt|circle_in|\" +\n        \"circle_le|circle_left|circle_lt|circle_mul_pt|circle_ne|circle_out|circle_overabove|\" +\n        \"circle_overbelow|circle_overlap|circle_overleft|circle_overright|circle_recv|\" +\n        \"circle_right|circle_same|circle_send|circle_sub_pt|clock_timestamp|close_lb|close_ls|\" +\n        \"close_lseg|close_pb|close_pl|close_ps|close_sb|close_sl|col_description|concat|concat_ws|\" +\n        \"contjoinsel|contsel|convert|convert_from|convert_to|corr|cos|cot|count|covar_pop|\" +\n        \"covar_samp|cstring_in|cstring_out|cstring_recv|cstring_send|cume_dist|current_database|\" +\n        \"current_query|current_schema|current_schemas|current_setting|current_user|currtid|\" +\n        \"currtid2|currval|cursor_to_xml|cursor_to_xmlschema|database_to_xml|\" +\n        \"database_to_xml_and_xmlschema|database_to_xmlschema|date|date_cmp|date_cmp_timestamp|\" +\n        \"date_cmp_timestamptz|date_eq|date_eq_timestamp|date_eq_timestamptz|date_ge|\" +\n        \"date_ge_timestamp|date_ge_timestamptz|date_gt|date_gt_timestamp|date_gt_timestamptz|\" +\n        \"date_in|date_larger|date_le|date_le_timestamp|date_le_timestamptz|date_lt|\" +\n        \"date_lt_timestamp|date_lt_timestamptz|date_mi|date_mi_interval|date_mii|date_ne|\" +\n        \"date_ne_timestamp|date_ne_timestamptz|date_out|date_part|date_pl_interval|date_pli|\" +\n        \"date_recv|date_send|date_smaller|date_sortsupport|date_trunc|daterange|\" +\n        \"daterange_canonical|daterange_subdiff|datetime_pl|datetimetz_pl|dcbrt|decode|degrees|\" +\n        \"dense_rank|dexp|diagonal|diameter|dispell_init|dispell_lexize|dist_cpoly|dist_lb|dist_pb|\" +\n        \"dist_pc|dist_pl|dist_ppath|dist_ps|dist_sb|dist_sl|div|dlog1|dlog10|domain_in|domain_recv|\" +\n        \"dpow|dround|dsimple_init|dsimple_lexize|dsnowball_init|dsnowball_lexize|dsqrt|\" +\n        \"dsynonym_init|dsynonym_lexize|dtrunc|elem_contained_by_range|encode|enum_cmp|enum_eq|\" +\n        \"enum_first|enum_ge|enum_gt|enum_in|enum_larger|enum_last|enum_le|enum_lt|enum_ne|enum_out|\" +\n        \"enum_range|enum_recv|enum_send|enum_smaller|eqjoinsel|eqsel|euc_cn_to_mic|\" +\n        \"euc_cn_to_utf8|euc_jis_2004_to_shift_jis_2004|euc_jis_2004_to_utf8|euc_jp_to_mic|\" +\n        \"euc_jp_to_sjis|euc_jp_to_utf8|euc_kr_to_mic|euc_kr_to_utf8|euc_tw_to_big5|\" +\n        \"euc_tw_to_mic|euc_tw_to_utf8|event_trigger_in|event_trigger_out|every|exp|factorial|\" +\n        \"family|fdw_handler_in|fdw_handler_out|first_value|float4|float48div|float48eq|float48ge|\" +\n        \"float48gt|float48le|float48lt|float48mi|float48mul|float48ne|float48pl|float4_accum|\" +\n        \"float4abs|float4div|float4eq|float4ge|float4gt|float4in|float4larger|float4le|float4lt|\" +\n        \"float4mi|float4mul|float4ne|float4out|float4pl|float4recv|float4send|float4smaller|\" +\n        \"float4um|float4up|float8|float84div|float84eq|float84ge|float84gt|float84le|float84lt|\" +\n        \"float84mi|float84mul|float84ne|float84pl|float8_accum|float8_avg|float8_corr|\" +\n        \"float8_covar_pop|float8_covar_samp|float8_regr_accum|float8_regr_avgx|\" +\n        \"float8_regr_avgy|float8_regr_intercept|float8_regr_r2|float8_regr_slope|\" +\n        \"float8_regr_sxx|float8_regr_sxy|float8_regr_syy|float8_stddev_pop|float8_stddev_samp|\" +\n        \"float8_var_pop|float8_var_samp|float8abs|float8div|float8eq|float8ge|float8gt|float8in|\" +\n        \"float8larger|float8le|float8lt|float8mi|float8mul|float8ne|float8out|float8pl|float8recv|\" +\n        \"float8send|float8smaller|float8um|float8up|floor|flt4_mul_cash|flt8_mul_cash|\" +\n        \"fmgr_c_validator|fmgr_internal_validator|fmgr_sql_validator|format|format_type|\" +\n        \"gb18030_to_utf8|gbk_to_utf8|generate_series|generate_subscripts|get_bit|get_byte|\" +\n        \"get_current_ts_config|getdatabaseencoding|getpgusername|gin_cmp_prefix|\" +\n        \"gin_cmp_tslexeme|gin_extract_tsquery|gin_extract_tsvector|gin_tsquery_consistent|\" +\n        \"ginarrayconsistent|ginarrayextract|ginbeginscan|ginbuild|ginbuildempty|ginbulkdelete|\" +\n        \"gincostestimate|ginendscan|gingetbitmap|gininsert|ginmarkpos|ginoptions|\" +\n        \"ginqueryarrayextract|ginrescan|ginrestrpos|ginvacuumcleanup|gist_box_compress|\" +\n        \"gist_box_consistent|gist_box_decompress|gist_box_penalty|gist_box_picksplit|\" +\n        \"gist_box_same|gist_box_union|gist_circle_compress|gist_circle_consistent|\" +\n        \"gist_point_compress|gist_point_consistent|gist_point_distance|gist_poly_compress|\" +\n        \"gist_poly_consistent|gistbeginscan|gistbuild|gistbuildempty|gistbulkdelete|\" +\n        \"gistcostestimate|gistendscan|gistgetbitmap|gistgettuple|gistinsert|gistmarkpos|\" +\n        \"gistoptions|gistrescan|gistrestrpos|gistvacuumcleanup|gtsquery_compress|\" +\n        \"gtsquery_consistent|gtsquery_decompress|gtsquery_penalty|gtsquery_picksplit|\" +\n        \"gtsquery_same|gtsquery_union|gtsvector_compress|gtsvector_consistent|\" +\n        \"gtsvector_decompress|gtsvector_penalty|gtsvector_picksplit|gtsvector_same|\" +\n        \"gtsvector_union|gtsvectorin|gtsvectorout|has_any_column_privilege|\" +\n        \"has_column_privilege|has_database_privilege|has_foreign_data_wrapper_privilege|\" +\n        \"has_function_privilege|has_language_privilege|has_schema_privilege|\" +\n        \"has_sequence_privilege|has_server_privilege|has_table_privilege|\" +\n        \"has_tablespace_privilege|has_type_privilege|hash_aclitem|hash_array|hash_numeric|\" +\n        \"hash_range|hashbeginscan|hashbpchar|hashbuild|hashbuildempty|hashbulkdelete|hashchar|\" +\n        \"hashcostestimate|hashendscan|hashenum|hashfloat4|hashfloat8|hashgetbitmap|hashgettuple|\" +\n        \"hashinet|hashinsert|hashint2|hashint2vector|hashint4|hashint8|hashmacaddr|hashmarkpos|\" +\n        \"hashname|hashoid|hashoidvector|hashoptions|hashrescan|hashrestrpos|hashtext|\" +\n        \"hashvacuumcleanup|hashvarlena|height|host|hostmask|iclikejoinsel|iclikesel|\" +\n        \"icnlikejoinsel|icnlikesel|icregexeqjoinsel|icregexeqsel|icregexnejoinsel|icregexnesel|\" +\n        \"inet_client_addr|inet_client_port|inet_in|inet_out|inet_recv|inet_send|\" +\n        \"inet_server_addr|inet_server_port|inetand|inetmi|inetmi_int8|inetnot|inetor|inetpl|\" +\n        \"initcap|int2|int24div|int24eq|int24ge|int24gt|int24le|int24lt|int24mi|int24mul|int24ne|\" +\n        \"int24pl|int28div|int28eq|int28ge|int28gt|int28le|int28lt|int28mi|int28mul|int28ne|int28pl|\" +\n        \"int2_accum|int2_avg_accum|int2_mul_cash|int2_sum|int2abs|int2and|int2div|int2eq|int2ge|\" +\n        \"int2gt|int2in|int2larger|int2le|int2lt|int2mi|int2mod|int2mul|int2ne|int2not|int2or|int2out|\" +\n        \"int2pl|int2recv|int2send|int2shl|int2shr|int2smaller|int2um|int2up|int2vectoreq|\" +\n        \"int2vectorin|int2vectorout|int2vectorrecv|int2vectorsend|int2xor|int4|int42div|int42eq|\" +\n        \"int42ge|int42gt|int42le|int42lt|int42mi|int42mul|int42ne|int42pl|int48div|int48eq|int48ge|\" +\n        \"int48gt|int48le|int48lt|int48mi|int48mul|int48ne|int48pl|int4_accum|int4_avg_accum|\" +\n        \"int4_mul_cash|int4_sum|int4abs|int4and|int4div|int4eq|int4ge|int4gt|int4in|int4inc|\" +\n        \"int4larger|int4le|int4lt|int4mi|int4mod|int4mul|int4ne|int4not|int4or|int4out|int4pl|\" +\n        \"int4range|int4range_canonical|int4range_subdiff|int4recv|int4send|int4shl|int4shr|\" +\n        \"int4smaller|int4um|int4up|int4xor|int8|int82div|int82eq|int82ge|int82gt|int82le|int82lt|\" +\n        \"int82mi|int82mul|int82ne|int82pl|int84div|int84eq|int84ge|int84gt|int84le|int84lt|int84mi|\" +\n        \"int84mul|int84ne|int84pl|int8_accum|int8_avg|int8_avg_accum|int8_sum|int8abs|int8and|\" +\n        \"int8div|int8eq|int8ge|int8gt|int8in|int8inc|int8inc_any|int8inc_float8_float8|int8larger|\" +\n        \"int8le|int8lt|int8mi|int8mod|int8mul|int8ne|int8not|int8or|int8out|int8pl|int8pl_inet|\" +\n        \"int8range|int8range_canonical|int8range_subdiff|int8recv|int8send|int8shl|int8shr|\" +\n        \"int8smaller|int8um|int8up|int8xor|integer_pl_date|inter_lb|inter_sb|inter_sl|internal_in|\" +\n        \"internal_out|interval_accum|interval_avg|interval_cmp|interval_div|interval_eq|\" +\n        \"interval_ge|interval_gt|interval_hash|interval_in|interval_larger|interval_le|\" +\n        \"interval_lt|interval_mi|interval_mul|interval_ne|interval_out|interval_pl|\" +\n        \"interval_pl_date|interval_pl_time|interval_pl_timestamp|interval_pl_timestamptz|\" +\n        \"interval_pl_timetz|interval_recv|interval_send|interval_smaller|interval_transform|\" +\n        \"interval_um|intervaltypmodin|intervaltypmodout|intinterval|isclosed|isempty|isfinite|\" +\n        \"ishorizontal|iso8859_1_to_utf8|iso8859_to_utf8|iso_to_koi8r|iso_to_mic|iso_to_win1251|\" +\n        \"iso_to_win866|isopen|isparallel|isperp|isvertical|johab_to_utf8|json_agg|\" +\n        \"json_agg_finalfn|json_agg_transfn|json_array_element|json_array_element_text|\" +\n        \"json_array_elements|json_array_length|json_each|json_each_text|json_extract_path|\" +\n        \"json_extract_path_op|json_extract_path_text|json_extract_path_text_op|json_in|\" +\n        \"json_object_field|json_object_field_text|json_object_keys|json_out|\" +\n        \"json_populate_record|json_populate_recordset|json_recv|json_send|justify_days|\" +\n        \"justify_hours|justify_interval|koi8r_to_iso|koi8r_to_mic|koi8r_to_utf8|\" +\n        \"koi8r_to_win1251|koi8r_to_win866|koi8u_to_utf8|lag|language_handler_in|\" +\n        \"language_handler_out|last_value|lastval|latin1_to_mic|latin2_to_mic|latin2_to_win1250|\" +\n        \"latin3_to_mic|latin4_to_mic|lead|left|length|like|like_escape|likejoinsel|likesel|line|\" +\n        \"line_distance|line_eq|line_horizontal|line_in|line_interpt|line_intersect|line_out|\" +\n        \"line_parallel|line_perp|line_recv|line_send|line_vertical|ln|lo_close|lo_creat|lo_create|\" +\n        \"lo_export|lo_import|lo_lseek|lo_lseek64|lo_open|lo_tell|lo_tell64|lo_truncate|\" +\n        \"lo_truncate64|lo_unlink|log|loread|lower|lower_inc|lower_inf|lowrite|lpad|lseg|lseg_center|\" +\n        \"lseg_distance|lseg_eq|lseg_ge|lseg_gt|lseg_horizontal|lseg_in|lseg_interpt|\" +\n        \"lseg_intersect|lseg_le|lseg_length|lseg_lt|lseg_ne|lseg_out|lseg_parallel|lseg_perp|\" +\n        \"lseg_recv|lseg_send|lseg_vertical|ltrim|macaddr_and|macaddr_cmp|macaddr_eq|macaddr_ge|\" +\n        \"macaddr_gt|macaddr_in|macaddr_le|macaddr_lt|macaddr_ne|macaddr_not|macaddr_or|\" +\n        \"macaddr_out|macaddr_recv|macaddr_send|makeaclitem|masklen|max|md5|mic_to_ascii|\" +\n        \"mic_to_big5|mic_to_euc_cn|mic_to_euc_jp|mic_to_euc_kr|mic_to_euc_tw|mic_to_iso|\" +\n        \"mic_to_koi8r|mic_to_latin1|mic_to_latin2|mic_to_latin3|mic_to_latin4|mic_to_sjis|\" +\n        \"mic_to_win1250|mic_to_win1251|mic_to_win866|min|mktinterval|mod|money|mul_d_interval|\" +\n        \"name|nameeq|namege|namegt|nameiclike|nameicnlike|nameicregexeq|nameicregexne|namein|\" +\n        \"namele|namelike|namelt|namene|namenlike|nameout|namerecv|nameregexeq|nameregexne|namesend|\" +\n        \"neqjoinsel|neqsel|netmask|network|network_cmp|network_eq|network_ge|network_gt|\" +\n        \"network_le|network_lt|network_ne|network_sub|network_subeq|network_sup|network_supeq|\" +\n        \"nextval|nlikejoinsel|nlikesel|notlike|now|npoints|nth_value|ntile|numeric_abs|\" +\n        \"numeric_accum|numeric_add|numeric_avg|numeric_avg_accum|numeric_cmp|numeric_div|\" +\n        \"numeric_div_trunc|numeric_eq|numeric_exp|numeric_fac|numeric_ge|numeric_gt|numeric_in|\" +\n        \"numeric_inc|numeric_larger|numeric_le|numeric_ln|numeric_log|numeric_lt|numeric_mod|\" +\n        \"numeric_mul|numeric_ne|numeric_out|numeric_power|numeric_recv|numeric_send|\" +\n        \"numeric_smaller|numeric_sqrt|numeric_stddev_pop|numeric_stddev_samp|numeric_sub|\" +\n        \"numeric_transform|numeric_uminus|numeric_uplus|numeric_var_pop|numeric_var_samp|\" +\n        \"numerictypmodin|numerictypmodout|numnode|numrange|numrange_subdiff|obj_description|\" +\n        \"octet_length|oid|oideq|oidge|oidgt|oidin|oidlarger|oidle|oidlt|oidne|oidout|oidrecv|oidsend|\" +\n        \"oidsmaller|oidvectoreq|oidvectorge|oidvectorgt|oidvectorin|oidvectorle|oidvectorlt|\" +\n        \"oidvectorne|oidvectorout|oidvectorrecv|oidvectorsend|oidvectortypes|on_pb|on_pl|\" +\n        \"on_ppath|on_ps|on_sb|on_sl|opaque_in|opaque_out|overlaps|overlay|path|path_add|path_add_pt|\" +\n        \"path_center|path_contain_pt|path_distance|path_div_pt|path_in|path_inter|path_length|\" +\n        \"path_mul_pt|path_n_eq|path_n_ge|path_n_gt|path_n_le|path_n_lt|path_npoints|path_out|\" +\n        \"path_recv|path_send|path_sub_pt|pclose|percent_rank|pg_advisory_lock|\" +\n        \"pg_advisory_lock_shared|pg_advisory_unlock|pg_advisory_unlock_all|\" +\n        \"pg_advisory_unlock_shared|pg_advisory_xact_lock|pg_advisory_xact_lock_shared|\" +\n        \"pg_available_extension_versions|pg_available_extensions|pg_backend_pid|\" +\n        \"pg_backup_start_time|pg_cancel_backend|pg_char_to_encoding|pg_client_encoding|\" +\n        \"pg_collation_for|pg_collation_is_visible|pg_column_is_updatable|pg_column_size|\" +\n        \"pg_conf_load_time|pg_conversion_is_visible|pg_create_restore_point|\" +\n        \"pg_current_xlog_insert_location|pg_current_xlog_location|pg_cursor|pg_database_size|\" +\n        \"pg_describe_object|pg_encoding_max_length|pg_encoding_to_char|\" +\n        \"pg_event_trigger_dropped_objects|pg_export_snapshot|pg_extension_config_dump|\" +\n        \"pg_extension_update_paths|pg_function_is_visible|pg_get_constraintdef|pg_get_expr|\" +\n        \"pg_get_function_arguments|pg_get_function_identity_arguments|\" +\n        \"pg_get_function_result|pg_get_functiondef|pg_get_indexdef|pg_get_keywords|\" +\n        \"pg_get_multixact_members|pg_get_ruledef|pg_get_serial_sequence|pg_get_triggerdef|\" +\n        \"pg_get_userbyid|pg_get_viewdef|pg_has_role|pg_identify_object|pg_indexes_size|\" +\n        \"pg_is_in_backup|pg_is_in_recovery|pg_is_other_temp_schema|pg_is_xlog_replay_paused|\" +\n        \"pg_last_xact_replay_timestamp|pg_last_xlog_receive_location|\" +\n        \"pg_last_xlog_replay_location|pg_listening_channels|pg_lock_status|pg_ls_dir|\" +\n        \"pg_my_temp_schema|pg_node_tree_in|pg_node_tree_out|pg_node_tree_recv|\" +\n        \"pg_node_tree_send|pg_notify|pg_opclass_is_visible|pg_operator_is_visible|\" +\n        \"pg_opfamily_is_visible|pg_options_to_table|pg_postmaster_start_time|\" +\n        \"pg_prepared_statement|pg_prepared_xact|pg_read_binary_file|pg_read_file|\" +\n        \"pg_relation_filenode|pg_relation_filepath|pg_relation_is_updatable|pg_relation_size|\" +\n        \"pg_reload_conf|pg_rotate_logfile|pg_sequence_parameters|pg_show_all_settings|\" +\n        \"pg_size_pretty|pg_sleep|pg_start_backup|pg_stat_clear_snapshot|pg_stat_file|\" +\n        \"pg_stat_get_activity|pg_stat_get_analyze_count|pg_stat_get_autoanalyze_count|\" +\n        \"pg_stat_get_autovacuum_count|pg_stat_get_backend_activity|\" +\n        \"pg_stat_get_backend_activity_start|pg_stat_get_backend_client_addr|\" +\n        \"pg_stat_get_backend_client_port|pg_stat_get_backend_dbid|pg_stat_get_backend_idset|\" +\n        \"pg_stat_get_backend_pid|pg_stat_get_backend_start|pg_stat_get_backend_userid|\" +\n        \"pg_stat_get_backend_waiting|pg_stat_get_backend_xact_start|\" +\n        \"pg_stat_get_bgwriter_buf_written_checkpoints|\" +\n        \"pg_stat_get_bgwriter_buf_written_clean|pg_stat_get_bgwriter_maxwritten_clean|\" +\n        \"pg_stat_get_bgwriter_requested_checkpoints|pg_stat_get_bgwriter_stat_reset_time|\" +\n        \"pg_stat_get_bgwriter_timed_checkpoints|pg_stat_get_blocks_fetched|\" +\n        \"pg_stat_get_blocks_hit|pg_stat_get_buf_alloc|pg_stat_get_buf_fsync_backend|\" +\n        \"pg_stat_get_buf_written_backend|pg_stat_get_checkpoint_sync_time|\" +\n        \"pg_stat_get_checkpoint_write_time|pg_stat_get_db_blk_read_time|\" +\n        \"pg_stat_get_db_blk_write_time|pg_stat_get_db_blocks_fetched|\" +\n        \"pg_stat_get_db_blocks_hit|pg_stat_get_db_conflict_all|\" +\n        \"pg_stat_get_db_conflict_bufferpin|pg_stat_get_db_conflict_lock|\" +\n        \"pg_stat_get_db_conflict_snapshot|pg_stat_get_db_conflict_startup_deadlock|\" +\n        \"pg_stat_get_db_conflict_tablespace|pg_stat_get_db_deadlocks|\" +\n        \"pg_stat_get_db_numbackends|pg_stat_get_db_stat_reset_time|\" +\n        \"pg_stat_get_db_temp_bytes|pg_stat_get_db_temp_files|pg_stat_get_db_tuples_deleted|\" +\n        \"pg_stat_get_db_tuples_fetched|pg_stat_get_db_tuples_inserted|\" +\n        \"pg_stat_get_db_tuples_returned|pg_stat_get_db_tuples_updated|\" +\n        \"pg_stat_get_db_xact_commit|pg_stat_get_db_xact_rollback|pg_stat_get_dead_tuples|\" +\n        \"pg_stat_get_function_calls|pg_stat_get_function_self_time|\" +\n        \"pg_stat_get_function_total_time|pg_stat_get_last_analyze_time|\" +\n        \"pg_stat_get_last_autoanalyze_time|pg_stat_get_last_autovacuum_time|\" +\n        \"pg_stat_get_last_vacuum_time|pg_stat_get_live_tuples|pg_stat_get_numscans|\" +\n        \"pg_stat_get_tuples_deleted|pg_stat_get_tuples_fetched|\" +\n        \"pg_stat_get_tuples_hot_updated|pg_stat_get_tuples_inserted|\" +\n        \"pg_stat_get_tuples_returned|pg_stat_get_tuples_updated|pg_stat_get_vacuum_count|\" +\n        \"pg_stat_get_wal_senders|pg_stat_get_xact_blocks_fetched|\" +\n        \"pg_stat_get_xact_blocks_hit|pg_stat_get_xact_function_calls|\" +\n        \"pg_stat_get_xact_function_self_time|pg_stat_get_xact_function_total_time|\" +\n        \"pg_stat_get_xact_numscans|pg_stat_get_xact_tuples_deleted|\" +\n        \"pg_stat_get_xact_tuples_fetched|pg_stat_get_xact_tuples_hot_updated|\" +\n        \"pg_stat_get_xact_tuples_inserted|pg_stat_get_xact_tuples_returned|\" +\n        \"pg_stat_get_xact_tuples_updated|pg_stat_reset|pg_stat_reset_shared|\" +\n        \"pg_stat_reset_single_function_counters|pg_stat_reset_single_table_counters|\" +\n        \"pg_stop_backup|pg_switch_xlog|pg_table_is_visible|pg_table_size|\" +\n        \"pg_tablespace_databases|pg_tablespace_location|pg_tablespace_size|\" +\n        \"pg_terminate_backend|pg_timezone_abbrevs|pg_timezone_names|pg_total_relation_size|\" +\n        \"pg_trigger_depth|pg_try_advisory_lock|pg_try_advisory_lock_shared|\" +\n        \"pg_try_advisory_xact_lock|pg_try_advisory_xact_lock_shared|pg_ts_config_is_visible|\" +\n        \"pg_ts_dict_is_visible|pg_ts_parser_is_visible|pg_ts_template_is_visible|\" +\n        \"pg_type_is_visible|pg_typeof|pg_xlog_location_diff|pg_xlog_replay_pause|\" +\n        \"pg_xlog_replay_resume|pg_xlogfile_name|pg_xlogfile_name_offset|pi|plainto_tsquery|\" +\n        \"plpgsql_call_handler|plpgsql_inline_handler|plpgsql_validator|point|point_above|\" +\n        \"point_add|point_below|point_distance|point_div|point_eq|point_horiz|point_in|point_left|\" +\n        \"point_mul|point_ne|point_out|point_recv|point_right|point_send|point_sub|point_vert|\" +\n        \"poly_above|poly_below|poly_center|poly_contain|poly_contain_pt|poly_contained|\" +\n        \"poly_distance|poly_in|poly_left|poly_npoints|poly_out|poly_overabove|poly_overbelow|\" +\n        \"poly_overlap|poly_overleft|poly_overright|poly_recv|poly_right|poly_same|poly_send|\" +\n        \"polygon|popen|position|positionjoinsel|positionsel|postgresql_fdw_validator|pow|power|\" +\n        \"prsd_end|prsd_headline|prsd_lextype|prsd_nexttoken|prsd_start|pt_contained_circle|\" +\n        \"pt_contained_poly|query_to_xml|query_to_xml_and_xmlschema|query_to_xmlschema|\" +\n        \"querytree|quote_ident|quote_literal|quote_nullable|radians|radius|random|range_adjacent|\" +\n        \"range_after|range_before|range_cmp|range_contained_by|range_contains|\" +\n        \"range_contains_elem|range_eq|range_ge|range_gist_compress|range_gist_consistent|\" +\n        \"range_gist_decompress|range_gist_penalty|range_gist_picksplit|range_gist_same|\" +\n        \"range_gist_union|range_gt|range_in|range_intersect|range_le|range_lt|range_minus|\" +\n        \"range_ne|range_out|range_overlaps|range_overleft|range_overright|range_recv|range_send|\" +\n        \"range_typanalyze|range_union|rangesel|rank|record_eq|record_ge|record_gt|record_in|\" +\n        \"record_le|record_lt|record_ne|record_out|record_recv|record_send|regclass|regclassin|\" +\n        \"regclassout|regclassrecv|regclasssend|regconfigin|regconfigout|regconfigrecv|\" +\n        \"regconfigsend|regdictionaryin|regdictionaryout|regdictionaryrecv|regdictionarysend|\" +\n        \"regexeqjoinsel|regexeqsel|regexnejoinsel|regexnesel|regexp_matches|regexp_replace|\" +\n        \"regexp_split_to_array|regexp_split_to_table|regoperatorin|regoperatorout|\" +\n        \"regoperatorrecv|regoperatorsend|regoperin|regoperout|regoperrecv|regopersend|\" +\n        \"regprocedurein|regprocedureout|regprocedurerecv|regproceduresend|regprocin|regprocout|\" +\n        \"regprocrecv|regprocsend|regr_avgx|regr_avgy|regr_count|regr_intercept|regr_r2|\" +\n        \"regr_slope|regr_sxx|regr_sxy|regr_syy|regtypein|regtypeout|regtyperecv|regtypesend|\" +\n        \"reltime|reltimeeq|reltimege|reltimegt|reltimein|reltimele|reltimelt|reltimene|reltimeout|\" +\n        \"reltimerecv|reltimesend|repeat|replace|reverse|right|round|row_number|row_to_json|rpad|\" +\n        \"rtrim|scalargtjoinsel|scalargtsel|scalarltjoinsel|scalarltsel|schema_to_xml|\" +\n        \"schema_to_xml_and_xmlschema|schema_to_xmlschema|session_user|set_bit|set_byte|\" +\n        \"set_config|set_masklen|setseed|setval|setweight|shell_in|shell_out|\" +\n        \"shift_jis_2004_to_euc_jis_2004|shift_jis_2004_to_utf8|shobj_description|sign|\" +\n        \"similar_escape|sin|sjis_to_euc_jp|sjis_to_mic|sjis_to_utf8|slope|smgreq|smgrin|smgrne|\" +\n        \"smgrout|spg_kd_choose|spg_kd_config|spg_kd_inner_consistent|spg_kd_picksplit|\" +\n        \"spg_quad_choose|spg_quad_config|spg_quad_inner_consistent|spg_quad_leaf_consistent|\" +\n        \"spg_quad_picksplit|spg_range_quad_choose|spg_range_quad_config|\" +\n        \"spg_range_quad_inner_consistent|spg_range_quad_leaf_consistent|\" +\n        \"spg_range_quad_picksplit|spg_text_choose|spg_text_config|spg_text_inner_consistent|\" +\n        \"spg_text_leaf_consistent|spg_text_picksplit|spgbeginscan|spgbuild|spgbuildempty|\" +\n        \"spgbulkdelete|spgcanreturn|spgcostestimate|spgendscan|spggetbitmap|spggettuple|\" +\n        \"spginsert|spgmarkpos|spgoptions|spgrescan|spgrestrpos|spgvacuumcleanup|split_part|sqrt|\" +\n        \"statement_timestamp|stddev|stddev_pop|stddev_samp|string_agg|string_agg_finalfn|\" +\n        \"string_agg_transfn|string_to_array|strip|strpos|substr|substring|sum|\" +\n        \"suppress_redundant_updates_trigger|table_to_xml|table_to_xml_and_xmlschema|\" +\n        \"table_to_xmlschema|tan|text|text_ge|text_gt|text_larger|text_le|text_lt|text_pattern_ge|\" +\n        \"text_pattern_gt|text_pattern_le|text_pattern_lt|text_smaller|textanycat|textcat|texteq|\" +\n        \"texticlike|texticnlike|texticregexeq|texticregexne|textin|textlen|textlike|textne|\" +\n        \"textnlike|textout|textrecv|textregexeq|textregexne|textsend|thesaurus_init|\" +\n        \"thesaurus_lexize|tideq|tidge|tidgt|tidin|tidlarger|tidle|tidlt|tidne|tidout|tidrecv|tidsend|\" +\n        \"tidsmaller|time_cmp|time_eq|time_ge|time_gt|time_hash|time_in|time_larger|time_le|time_lt|\" +\n        \"time_mi_interval|time_mi_time|time_ne|time_out|time_pl_interval|time_recv|time_send|\" +\n        \"time_smaller|time_transform|timedate_pl|timemi|timenow|timeofday|timepl|timestamp_cmp|\" +\n        \"timestamp_cmp_date|timestamp_cmp_timestamptz|timestamp_eq|timestamp_eq_date|\" +\n        \"timestamp_eq_timestamptz|timestamp_ge|timestamp_ge_date|timestamp_ge_timestamptz|\" +\n        \"timestamp_gt|timestamp_gt_date|timestamp_gt_timestamptz|timestamp_hash|timestamp_in|\" +\n        \"timestamp_larger|timestamp_le|timestamp_le_date|timestamp_le_timestamptz|\" +\n        \"timestamp_lt|timestamp_lt_date|timestamp_lt_timestamptz|timestamp_mi|\" +\n        \"timestamp_mi_interval|timestamp_ne|timestamp_ne_date|timestamp_ne_timestamptz|\" +\n        \"timestamp_out|timestamp_pl_interval|timestamp_recv|timestamp_send|timestamp_smaller|\" +\n        \"timestamp_sortsupport|timestamp_transform|timestamptypmodin|timestamptypmodout|\" +\n        \"timestamptz_cmp|timestamptz_cmp_date|timestamptz_cmp_timestamp|timestamptz_eq|\" +\n        \"timestamptz_eq_date|timestamptz_eq_timestamp|timestamptz_ge|timestamptz_ge_date|\" +\n        \"timestamptz_ge_timestamp|timestamptz_gt|timestamptz_gt_date|\" +\n        \"timestamptz_gt_timestamp|timestamptz_in|timestamptz_larger|timestamptz_le|\" +\n        \"timestamptz_le_date|timestamptz_le_timestamp|timestamptz_lt|timestamptz_lt_date|\" +\n        \"timestamptz_lt_timestamp|timestamptz_mi|timestamptz_mi_interval|timestamptz_ne|\" +\n        \"timestamptz_ne_date|timestamptz_ne_timestamp|timestamptz_out|\" +\n        \"timestamptz_pl_interval|timestamptz_recv|timestamptz_send|timestamptz_smaller|\" +\n        \"timestamptztypmodin|timestamptztypmodout|timetypmodin|timetypmodout|timetz_cmp|\" +\n        \"timetz_eq|timetz_ge|timetz_gt|timetz_hash|timetz_in|timetz_larger|timetz_le|timetz_lt|\" +\n        \"timetz_mi_interval|timetz_ne|timetz_out|timetz_pl_interval|timetz_recv|timetz_send|\" +\n        \"timetz_smaller|timetzdate_pl|timetztypmodin|timetztypmodout|timezone|tinterval|\" +\n        \"tintervalct|tintervalend|tintervaleq|tintervalge|tintervalgt|tintervalin|tintervalle|\" +\n        \"tintervalleneq|tintervallenge|tintervallengt|tintervallenle|tintervallenlt|\" +\n        \"tintervallenne|tintervallt|tintervalne|tintervalout|tintervalov|tintervalrecv|\" +\n        \"tintervalrel|tintervalsame|tintervalsend|tintervalstart|to_ascii|to_char|to_date|to_hex|\" +\n        \"to_json|to_number|to_timestamp|to_tsquery|to_tsvector|transaction_timestamp|translate|\" +\n        \"trigger_in|trigger_out|trunc|ts_debug|ts_headline|ts_lexize|ts_match_qv|ts_match_tq|\" +\n        \"ts_match_tt|ts_match_vq|ts_parse|ts_rank|ts_rank_cd|ts_rewrite|ts_stat|ts_token_type|\" +\n        \"ts_typanalyze|tsmatchjoinsel|tsmatchsel|tsq_mcontained|tsq_mcontains|tsquery_and|\" +\n        \"tsquery_cmp|tsquery_eq|tsquery_ge|tsquery_gt|tsquery_le|tsquery_lt|tsquery_ne|\" +\n        \"tsquery_not|tsquery_or|tsqueryin|tsqueryout|tsqueryrecv|tsquerysend|tsrange|\" +\n        \"tsrange_subdiff|tstzrange|tstzrange_subdiff|tsvector_cmp|tsvector_concat|tsvector_eq|\" +\n        \"tsvector_ge|tsvector_gt|tsvector_le|tsvector_lt|tsvector_ne|tsvector_update_trigger|\" +\n        \"tsvector_update_trigger_column|tsvectorin|tsvectorout|tsvectorrecv|tsvectorsend|\" +\n        \"txid_current|txid_current_snapshot|txid_snapshot_in|txid_snapshot_out|\" +\n        \"txid_snapshot_recv|txid_snapshot_send|txid_snapshot_xip|txid_snapshot_xmax|\" +\n        \"txid_snapshot_xmin|txid_visible_in_snapshot|uhc_to_utf8|unique_key_recheck|unknownin|\" +\n        \"unknownout|unknownrecv|unknownsend|unnest|upper|upper_inc|upper_inf|utf8_to_ascii|\" +\n        \"utf8_to_big5|utf8_to_euc_cn|utf8_to_euc_jis_2004|utf8_to_euc_jp|utf8_to_euc_kr|\" +\n        \"utf8_to_euc_tw|utf8_to_gb18030|utf8_to_gbk|utf8_to_iso8859|utf8_to_iso8859_1|\" +\n        \"utf8_to_johab|utf8_to_koi8r|utf8_to_koi8u|utf8_to_shift_jis_2004|utf8_to_sjis|\" +\n        \"utf8_to_uhc|utf8_to_win|uuid_cmp|uuid_eq|uuid_ge|uuid_gt|uuid_hash|uuid_in|uuid_le|\" +\n        \"uuid_lt|uuid_ne|uuid_out|uuid_recv|uuid_send|var_pop|var_samp|varbit_in|varbit_out|\" +\n        \"varbit_recv|varbit_send|varbit_transform|varbitcmp|varbiteq|varbitge|varbitgt|varbitle|\" +\n        \"varbitlt|varbitne|varbittypmodin|varbittypmodout|varchar_transform|varcharin|\" +\n        \"varcharout|varcharrecv|varcharsend|varchartypmodin|varchartypmodout|variance|version|\" +\n        \"void_in|void_out|void_recv|void_send|width|width_bucket|win1250_to_latin2|\" +\n        \"win1250_to_mic|win1251_to_iso|win1251_to_koi8r|win1251_to_mic|win1251_to_win866|\" +\n        \"win866_to_iso|win866_to_koi8r|win866_to_mic|win866_to_win1251|win_to_utf8|xideq|\" +\n        \"xideqint4|xidin|xidout|xidrecv|xidsend|xml|xml_in|xml_is_well_formed|\" +\n        \"xml_is_well_formed_content|xml_is_well_formed_document|xml_out|xml_recv|xml_send|\" +\n        \"xmlagg|xmlcomment|xmlconcat2|xmlexists|xmlvalidate|xpath|xpath_exists\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": builtinFunctions,\n        \"keyword\": keywords\n    }, \"identifier\", true);\n\n\n    var sqlRules = [{\n            token : \"string\", // single line string -- assume dollar strings if multi-line for now\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : \"variable.language\", // pg identifier\n            regex : '\".*?\"'\n        }, {\n            token : \"constant.numeric\", // float\n            regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_][a-zA-Z0-9_$]*\\\\b\" // TODO - Unicode in identifiers\n        }, {\n            token : \"keyword.operator\",\n            regex : \"!|!!|!~|!~\\\\*|!~~|!~~\\\\*|#|##|#<|#<=|#<>|#=|#>|#>=|%|\\\\&|\\\\&\\\\&|\\\\&<|\\\\&<\\\\||\\\\&>|\\\\*|\\\\+|\" +\n                    \"\\\\-|/|<|<#>|<\\\\->|<<|<<=|<<\\\\||<=|<>|<\\\\?>|<@|<\\\\^|=|>|>=|>>|>>=|>\\\\^|\\\\?#|\\\\?\\\\-|\\\\?\\\\-\\\\||\" +\n                    \"\\\\?\\\\||\\\\?\\\\|\\\\||@|@\\\\-@|@>|@@|@@@|\\\\^|\\\\||\\\\|\\\\&>|\\\\|/|\\\\|>>|\\\\|\\\\||\\\\|\\\\|/|~|~\\\\*|~<=~|~<~|\" +\n                    \"~=|~>=~|~>~|~~|~~\\\\*\"\n        }, {\n            token : \"paren.lparen\",\n            regex : \"[\\\\(]\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\)]\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }\n    ];\n\n\n    this.$rules = {\n        \"start\" : [{\n                token : \"comment\",\n                regex : \"--.*$\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi-line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            },{\n                token : \"keyword.statementBegin\",\n                regex : \"^[a-zA-Z]+\", // Could enumerate starting keywords but this allows things to work when new statements are added.\n                next : \"statement\"\n            },{\n                token : \"support.buildin\", // psql directive\n                regex : \"^\\\\\\\\[\\\\S]+.*$\"\n            }\n        ],\n\n        \"statement\" : [{\n                token : \"comment\",\n                regex : \"--.*$\"\n            }, {\n                token : \"comment\", // multi-line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"commentStatement\"\n            }, {\n                token : \"statementEnd\",\n                regex : \";\",\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : \"\\\\$perl\\\\$\",\n                next : \"perl-start\"\n            }, {\n                token : \"string\",\n                regex : \"\\\\$python\\\\$\",\n                next : \"python-start\"\n            }, {\n                token : \"string\",\n                regex : \"\\\\$json\\\\$\",\n                next : \"json-start\"\n            }, {\n                token : \"string\",\n                regex : \"\\\\$(js|javascript)\\\\$\",\n                next : \"javascript-start\"\n            }, {\n                token : \"string\",\n                regex : \"\\\\$[\\\\w_0-9]*\\\\$$\", // dollar quote at the end of a line\n                next : \"dollarSql\"\n            }, {\n                token : \"string\",\n                regex : \"\\\\$[\\\\w_0-9]*\\\\$\",\n                next : \"dollarStatementString\"\n            }\n        ].concat(sqlRules),\n\n        \"dollarSql\" : [{\n                token : \"comment\",\n                regex : \"--.*$\"\n            }, {\n                token : \"comment\", // multi-line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"commentDollarSql\"\n            }, {\n                token : \"string\", // end quoting with dollar at the start of a line\n                regex : \"^\\\\$[\\\\w_0-9]*\\\\$\",\n                next : \"statement\"\n            }, {\n                token : \"string\",\n                regex : \"\\\\$[\\\\w_0-9]*\\\\$\",\n                next : \"dollarSqlString\"\n            }\n        ].concat(sqlRules),\n\n        \"comment\" : [{\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ],\n\n        \"commentStatement\" : [{\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"statement\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ],\n\n        \"commentDollarSql\" : [{\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"dollarSql\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ],\n\n        \"dollarStatementString\" : [{\n                token : \"string\", // closing dollarstring\n                regex : \".*?\\\\$[\\\\w_0-9]*\\\\$\",\n                next : \"statement\"\n            }, {\n                token : \"string\", // dollarstring spanning whole line\n                regex : \".+\"\n            }\n        ],\n\n        \"dollarSqlString\" : [{\n                token : \"string\", // closing dollarstring\n                regex : \".*?\\\\$[\\\\w_0-9]*\\\\$\",\n                next : \"dollarSql\"\n            }, {\n                token : \"string\", // dollarstring spanning whole line\n                regex : \".+\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\", [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n    this.embedRules(PerlHighlightRules, \"perl-\", [{token : \"string\", regex : \"\\\\$perl\\\\$\", next : \"statement\"}]);\n    this.embedRules(PythonHighlightRules, \"python-\", [{token : \"string\", regex : \"\\\\$python\\\\$\", next : \"statement\"}]);\n    this.embedRules(JsonHighlightRules, \"json-\", [{token : \"string\", regex : \"\\\\$json\\\\$\", next : \"statement\"}]);\n    this.embedRules(JavaScriptHighlightRules, \"javascript-\", [{token : \"string\", regex : \"\\\\$(js|javascript)\\\\$\", next : \"statement\"}]);\n};\n\noop.inherits(PgsqlHighlightRules, TextHighlightRules);\n\nexports.PgsqlHighlightRules = PgsqlHighlightRules;\n});\n\nace.define(\"ace/mode/pgsql\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/pgsql_highlight_rules\",\"ace/range\"], function(require, exports, module) {\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"../mode/text\").Mode;\nvar PgsqlHighlightRules = require(\"./pgsql_highlight_rules\").PgsqlHighlightRules;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.HighlightRules = PgsqlHighlightRules;\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"--\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) { \n        if (state == \"start\" || state == \"keyword.statementEnd\") {\n            return \"\";\n        } else {\n            return this.$getIndent(line); // Keep whatever indent the previous line has\n        }\n    }\n\n    this.$id = \"ace/mode/pgsql\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-php.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"string.cdata.xml\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.xml-decl.xml\", \"keyword.xml-decl.xml\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_decl\", caseInsensitive: true\n            },\n            {\n                token : [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"processing_instruction\",\n            },\n            {token : \"comment.xml\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\", caseInsensitive: true\n            },\n            {include : \"tag\"},\n            {token : \"text.end-tag-open.xml\", regex: \"</\"},\n            {token : \"text.tag-open.xml\", regex: \"<\"},\n            {include : \"reference\"},\n            {defaultToken : \"text.xml\"}\n        ],\n\n        xml_decl : [{\n            token : \"entity.other.attribute-name.decl-attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.decl-attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"whitespace\"\n        }, {\n            include: \"string\"\n        }, {\n            token : \"punctuation.xml-decl.xml\",\n            regex : \"\\\\?>\",\n            next : \"start\"\n        }],\n\n        processing_instruction : [\n            {token : \"punctuation.instruction.xml\", regex : \"\\\\?>\", next : \"start\"},\n            {defaultToken : \"instruction.xml\"}\n        ],\n\n        doctype : [\n            {include : \"whitespace\"},\n            {include : \"string\"},\n            {token : \"xml-pe.doctype.xml\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe.xml\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.int-subset\", regex : \"\\\\[\", push : \"int_subset\"}\n        ],\n\n        int_subset : [{\n            token : \"text.xml\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.int-subset.xml\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.markup-decl.xml\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.cdata.xml\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text.xml\", regex : \"\\\\s+\"},\n            {token : \"text.xml\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment.xml\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment.xml\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape.reference.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        attr_reference : [{\n            token : \"constant.language.escape.reference.attribute-value.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n            regex : \"(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n            ]\n        }],\n\n        tag_whitespace : [\n            {token : \"text.tag-whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        whitespace : [\n            {token : \"text.whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        string: [{\n            token : \"string.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.xml\", regex: \"'\", next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }, {\n            token : \"string.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.xml\", regex: '\"', next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }],\n\n        attributes: [{\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"tag_whitespace\"\n        }, {\n            include: \"attribute_value\"\n        }],\n\n        attribute_value: [{\n            token : \"string.attribute-value.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }, {\n            token : \"string.attribute-value.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\nace.define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    option      : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.addRules({\n        attributes: [{\n            include : \"tag_whitespace\"\n        }, {\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\",\n            push : [{\n                include: \"tag_whitespace\"\n            }, {\n                token : \"string.unquoted.attribute-value.html\",\n                regex : \"[^<>='\\\"`\\\\s]+\",\n                next : \"pop\"\n            }, {\n                token : \"empty\",\n                regex : \"\",\n                next : \"pop\"\n            }]\n        }, {\n            include : \"attribute_value\"\n        }],\n        tag: [{\n            token : function(start, tag) {\n                var group = tagMap[tag];\n                return [\"meta.tag.punctuation.\" + (start == \"<\" ? \"\" : \"end-\") + \"tag-open.xml\",\n                    \"meta.tag\" + (group ? \".\" + group : \"\") + \".tag-name.xml\"];\n            },\n            regex : \"(</?)([-_a-zA-Z0-9:]+)\",\n            next: \"tag_stuff\"\n        }],\n        tag_stuff: [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n        ],\n    });\n\n    this.embedTagRules(CssHighlightRules, \"css-\", \"style\");\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    if (this.constructor === HtmlHighlightRules)\n        this.normalizeRules();\n};\n\noop.inherits(HtmlHighlightRules, XmlHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\nace.define(\"ace/mode/php_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\",\"ace/mode/html_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\n\nvar PhpLangHighlightRules = function() {\n    var docComment = DocCommentHighlightRules;\n    var builtinFunctions = lang.arrayToMap(\n        ('abs|acos|acosh|addcslashes|addslashes|aggregate|aggregate_info|aggregate_methods|aggregate_methods_by_list|aggregate_methods_by_regexp|' +\n        'aggregate_properties|aggregate_properties_by_list|aggregate_properties_by_regexp|aggregation_info|amqpconnection|amqpexchange|amqpqueue|' +\n        'apache_child_terminate|apache_get_modules|apache_get_version|apache_getenv|apache_lookup_uri|apache_note|apache_request_headers|' +\n        'apache_reset_timeout|apache_response_headers|apache_setenv|apc_add|apc_bin_dump|apc_bin_dumpfile|apc_bin_load|apc_bin_loadfile|' +\n        'apc_cache_info|apc_cas|apc_clear_cache|apc_compile_file|apc_dec|apc_define_constants|apc_delete|apc_delete_file|apc_exists|apc_fetch|' +\n        'apc_inc|apc_load_constants|apc_sma_info|apc_store|apciterator|apd_breakpoint|apd_callstack|apd_clunk|apd_continue|apd_croak|' +\n        'apd_dump_function_table|apd_dump_persistent_resources|apd_dump_regular_resources|apd_echo|apd_get_active_symbols|apd_set_pprof_trace|' +\n        'apd_set_session|apd_set_session_trace|apd_set_session_trace_socket|appenditerator|array|array_change_key_case|array_chunk|array_combine|' +\n        'array_count_values|array_diff|array_diff_assoc|array_diff_key|array_diff_uassoc|array_diff_ukey|array_fill|array_fill_keys|array_filter|' +\n        'array_flip|array_intersect|array_intersect_assoc|array_intersect_key|array_intersect_uassoc|array_intersect_ukey|array_key_exists|' +\n        'array_keys|array_map|array_merge|array_merge_recursive|array_multisort|array_pad|array_pop|array_product|array_push|array_rand|' +\n        'array_reduce|array_replace|array_replace_recursive|array_reverse|array_search|array_shift|array_slice|array_splice|array_sum|array_udiff|' +\n        'array_udiff_assoc|array_udiff_uassoc|array_uintersect|array_uintersect_assoc|array_uintersect_uassoc|array_unique|array_unshift|' +\n        'array_values|array_walk|array_walk_recursive|arrayaccess|arrayiterator|arrayobject|arsort|asin|asinh|asort|assert|assert_options|atan|' +\n        'atan2|atanh|audioproperties|badfunctioncallexception|badmethodcallexception|base64_decode|base64_encode|base_convert|basename|' +\n        'bbcode_add_element|bbcode_add_smiley|bbcode_create|bbcode_destroy|bbcode_parse|bbcode_set_arg_parser|bbcode_set_flags|bcadd|bccomp|bcdiv|' +\n        'bcmod|bcmul|bcompiler_load|bcompiler_load_exe|bcompiler_parse_class|bcompiler_read|bcompiler_write_class|bcompiler_write_constant|' +\n        'bcompiler_write_exe_footer|bcompiler_write_file|bcompiler_write_footer|bcompiler_write_function|bcompiler_write_functions_from_file|' +\n        'bcompiler_write_header|bcompiler_write_included_filename|bcpow|bcpowmod|bcscale|bcsqrt|bcsub|bin2hex|bind_textdomain_codeset|bindec|' +\n        'bindtextdomain|bson_decode|bson_encode|bumpValue|bzclose|bzcompress|bzdecompress|bzerrno|bzerror|bzerrstr|bzflush|bzopen|bzread|bzwrite|' +\n        'cachingiterator|cairo|cairo_create|cairo_font_face_get_type|cairo_font_face_status|cairo_font_options_create|cairo_font_options_equal|' +\n        'cairo_font_options_get_antialias|cairo_font_options_get_hint_metrics|cairo_font_options_get_hint_style|' +\n        'cairo_font_options_get_subpixel_order|cairo_font_options_hash|cairo_font_options_merge|cairo_font_options_set_antialias|' +\n        'cairo_font_options_set_hint_metrics|cairo_font_options_set_hint_style|cairo_font_options_set_subpixel_order|cairo_font_options_status|' +\n        'cairo_format_stride_for_width|cairo_image_surface_create|cairo_image_surface_create_for_data|cairo_image_surface_create_from_png|' +\n        'cairo_image_surface_get_data|cairo_image_surface_get_format|cairo_image_surface_get_height|cairo_image_surface_get_stride|' +\n        'cairo_image_surface_get_width|cairo_matrix_create_scale|cairo_matrix_create_translate|cairo_matrix_invert|cairo_matrix_multiply|' +\n        'cairo_matrix_rotate|cairo_matrix_transform_distance|cairo_matrix_transform_point|cairo_matrix_translate|cairo_pattern_add_color_stop_rgb|' +\n        'cairo_pattern_add_color_stop_rgba|cairo_pattern_create_for_surface|cairo_pattern_create_linear|cairo_pattern_create_radial|' +\n        'cairo_pattern_create_rgb|cairo_pattern_create_rgba|cairo_pattern_get_color_stop_count|cairo_pattern_get_color_stop_rgba|' +\n        'cairo_pattern_get_extend|cairo_pattern_get_filter|cairo_pattern_get_linear_points|cairo_pattern_get_matrix|' +\n        'cairo_pattern_get_radial_circles|cairo_pattern_get_rgba|cairo_pattern_get_surface|cairo_pattern_get_type|cairo_pattern_set_extend|' +\n        'cairo_pattern_set_filter|cairo_pattern_set_matrix|cairo_pattern_status|cairo_pdf_surface_create|cairo_pdf_surface_set_size|' +\n        'cairo_ps_get_levels|cairo_ps_level_to_string|cairo_ps_surface_create|cairo_ps_surface_dsc_begin_page_setup|' +\n        'cairo_ps_surface_dsc_begin_setup|cairo_ps_surface_dsc_comment|cairo_ps_surface_get_eps|cairo_ps_surface_restrict_to_level|' +\n        'cairo_ps_surface_set_eps|cairo_ps_surface_set_size|cairo_scaled_font_create|cairo_scaled_font_extents|cairo_scaled_font_get_ctm|' +\n        'cairo_scaled_font_get_font_face|cairo_scaled_font_get_font_matrix|cairo_scaled_font_get_font_options|cairo_scaled_font_get_scale_matrix|' +\n        'cairo_scaled_font_get_type|cairo_scaled_font_glyph_extents|cairo_scaled_font_status|cairo_scaled_font_text_extents|' +\n        'cairo_surface_copy_page|cairo_surface_create_similar|cairo_surface_finish|cairo_surface_flush|cairo_surface_get_content|' +\n        'cairo_surface_get_device_offset|cairo_surface_get_font_options|cairo_surface_get_type|cairo_surface_mark_dirty|' +\n        'cairo_surface_mark_dirty_rectangle|cairo_surface_set_device_offset|cairo_surface_set_fallback_resolution|cairo_surface_show_page|' +\n        'cairo_surface_status|cairo_surface_write_to_png|cairo_svg_surface_create|cairo_svg_surface_restrict_to_version|' +\n        'cairo_svg_version_to_string|cairoantialias|cairocontent|cairocontext|cairoexception|cairoextend|cairofillrule|cairofilter|cairofontface|' +\n        'cairofontoptions|cairofontslant|cairofonttype|cairofontweight|cairoformat|cairogradientpattern|cairohintmetrics|cairohintstyle|' +\n        'cairoimagesurface|cairolineargradient|cairolinecap|cairolinejoin|cairomatrix|cairooperator|cairopath|cairopattern|cairopatterntype|' +\n        'cairopdfsurface|cairopslevel|cairopssurface|cairoradialgradient|cairoscaledfont|cairosolidpattern|cairostatus|cairosubpixelorder|' +\n        'cairosurface|cairosurfacepattern|cairosurfacetype|cairosvgsurface|cairosvgversion|cairotoyfontface|cal_days_in_month|cal_from_jd|cal_info|' +\n        'cal_to_jd|calcul_hmac|calculhmac|call_user_func|call_user_func_array|call_user_method|call_user_method_array|callbackfilteriterator|ceil|' +\n        'chdb|chdb_create|chdir|checkdate|checkdnsrr|chgrp|chmod|chop|chown|chr|chroot|chunk_split|class_alias|class_exists|class_implements|' +\n        'class_parents|classkit_import|classkit_method_add|classkit_method_copy|classkit_method_redefine|classkit_method_remove|' +\n        'classkit_method_rename|clearstatcache|clone|closedir|closelog|collator|com|com_addref|com_create_guid|com_event_sink|com_get|' +\n        'com_get_active_object|com_invoke|com_isenum|com_load|com_load_typelib|com_message_pump|com_print_typeinfo|com_propget|com_propput|' +\n        'com_propset|com_release|com_set|compact|connection_aborted|connection_status|connection_timeout|constant|construct|construct|construct|' +\n        'convert_cyr_string|convert_uudecode|convert_uuencode|copy|cos|cosh|count|count_chars|countable|counter_bump|counter_bump_value|' +\n        'counter_create|counter_get|counter_get_meta|counter_get_named|counter_get_value|counter_reset|counter_reset_value|crack_check|' +\n        'crack_closedict|crack_getlastmessage|crack_opendict|crc32|create_function|crypt|ctype_alnum|ctype_alpha|ctype_cntrl|ctype_digit|' +\n        'ctype_graph|ctype_lower|ctype_print|ctype_punct|ctype_space|ctype_upper|ctype_xdigit|cubrid_affected_rows|cubrid_bind|' +\n        'cubrid_client_encoding|cubrid_close|cubrid_close_prepare|cubrid_close_request|cubrid_col_get|cubrid_col_size|cubrid_column_names|' +\n        'cubrid_column_types|cubrid_commit|cubrid_connect|cubrid_connect_with_url|cubrid_current_oid|cubrid_data_seek|cubrid_db_name|' +\n        'cubrid_disconnect|cubrid_drop|cubrid_errno|cubrid_error|cubrid_error_code|cubrid_error_code_facility|cubrid_error_msg|cubrid_execute|' +\n        'cubrid_fetch|cubrid_fetch_array|cubrid_fetch_assoc|cubrid_fetch_field|cubrid_fetch_lengths|cubrid_fetch_object|cubrid_fetch_row|' +\n        'cubrid_field_flags|cubrid_field_len|cubrid_field_name|cubrid_field_seek|cubrid_field_table|cubrid_field_type|cubrid_free_result|' +\n        'cubrid_get|cubrid_get_autocommit|cubrid_get_charset|cubrid_get_class_name|cubrid_get_client_info|cubrid_get_db_parameter|' +\n        'cubrid_get_server_info|cubrid_insert_id|cubrid_is_instance|cubrid_list_dbs|cubrid_load_from_glo|cubrid_lob_close|cubrid_lob_export|' +\n        'cubrid_lob_get|cubrid_lob_send|cubrid_lob_size|cubrid_lock_read|cubrid_lock_write|cubrid_move_cursor|cubrid_new_glo|cubrid_next_result|' +\n        'cubrid_num_cols|cubrid_num_fields|cubrid_num_rows|cubrid_ping|cubrid_prepare|cubrid_put|cubrid_query|cubrid_real_escape_string|' +\n        'cubrid_result|cubrid_rollback|cubrid_save_to_glo|cubrid_schema|cubrid_send_glo|cubrid_seq_drop|cubrid_seq_insert|cubrid_seq_put|' +\n        'cubrid_set_add|cubrid_set_autocommit|cubrid_set_db_parameter|cubrid_set_drop|cubrid_unbuffered_query|cubrid_version|curl_close|' +\n        'curl_copy_handle|curl_errno|curl_error|curl_exec|curl_getinfo|curl_init|curl_multi_add_handle|curl_multi_close|curl_multi_exec|' +\n        'curl_multi_getcontent|curl_multi_info_read|curl_multi_init|curl_multi_remove_handle|curl_multi_select|curl_setopt|curl_setopt_array|' +\n        'curl_version|current|cyrus_authenticate|cyrus_bind|cyrus_close|cyrus_connect|cyrus_query|cyrus_unbind|date|date_add|date_create|' +\n        'date_create_from_format|date_date_set|date_default_timezone_get|date_default_timezone_set|date_diff|date_format|date_get_last_errors|' +\n        'date_interval_create_from_date_string|date_interval_format|date_isodate_set|date_modify|date_offset_get|date_parse|date_parse_from_format|' +\n        'date_sub|date_sun_info|date_sunrise|date_sunset|date_time_set|date_timestamp_get|date_timestamp_set|date_timezone_get|date_timezone_set|' +\n        'dateinterval|dateperiod|datetime|datetimezone|db2_autocommit|db2_bind_param|db2_client_info|db2_close|db2_column_privileges|db2_columns|' +\n        'db2_commit|db2_conn_error|db2_conn_errormsg|db2_connect|db2_cursor_type|db2_escape_string|db2_exec|db2_execute|db2_fetch_array|' +\n        'db2_fetch_assoc|db2_fetch_both|db2_fetch_object|db2_fetch_row|db2_field_display_size|db2_field_name|db2_field_num|db2_field_precision|' +\n        'db2_field_scale|db2_field_type|db2_field_width|db2_foreign_keys|db2_free_result|db2_free_stmt|db2_get_option|db2_last_insert_id|' +\n        'db2_lob_read|db2_next_result|db2_num_fields|db2_num_rows|db2_pclose|db2_pconnect|db2_prepare|db2_primary_keys|db2_procedure_columns|' +\n        'db2_procedures|db2_result|db2_rollback|db2_server_info|db2_set_option|db2_special_columns|db2_statistics|db2_stmt_error|db2_stmt_errormsg|' +\n        'db2_table_privileges|db2_tables|dba_close|dba_delete|dba_exists|dba_fetch|dba_firstkey|dba_handlers|dba_insert|dba_key_split|dba_list|' +\n        'dba_nextkey|dba_open|dba_optimize|dba_popen|dba_replace|dba_sync|dbase_add_record|dbase_close|dbase_create|dbase_delete_record|' +\n        'dbase_get_header_info|dbase_get_record|dbase_get_record_with_names|dbase_numfields|dbase_numrecords|dbase_open|dbase_pack|' +\n        'dbase_replace_record|dbplus_add|dbplus_aql|dbplus_chdir|dbplus_close|dbplus_curr|dbplus_errcode|dbplus_errno|dbplus_find|dbplus_first|' +\n        'dbplus_flush|dbplus_freealllocks|dbplus_freelock|dbplus_freerlocks|dbplus_getlock|dbplus_getunique|dbplus_info|dbplus_last|dbplus_lockrel|' +\n        'dbplus_next|dbplus_open|dbplus_prev|dbplus_rchperm|dbplus_rcreate|dbplus_rcrtexact|dbplus_rcrtlike|dbplus_resolve|dbplus_restorepos|' +\n        'dbplus_rkeys|dbplus_ropen|dbplus_rquery|dbplus_rrename|dbplus_rsecindex|dbplus_runlink|dbplus_rzap|dbplus_savepos|dbplus_setindex|' +\n        'dbplus_setindexbynumber|dbplus_sql|dbplus_tcl|dbplus_tremove|dbplus_undo|dbplus_undoprepare|dbplus_unlockrel|dbplus_unselect|' +\n        'dbplus_update|dbplus_xlockrel|dbplus_xunlockrel|dbx_close|dbx_compare|dbx_connect|dbx_error|dbx_escape_string|dbx_fetch_row|dbx_query|' +\n        'dbx_sort|dcgettext|dcngettext|deaggregate|debug_backtrace|debug_print_backtrace|debug_zval_dump|decbin|dechex|decoct|define|' +\n        'define_syslog_variables|defined|deg2rad|delete|dgettext|die|dio_close|dio_fcntl|dio_open|dio_read|dio_seek|dio_stat|dio_tcsetattr|' +\n        'dio_truncate|dio_write|dir|directoryiterator|dirname|disk_free_space|disk_total_space|diskfreespace|dl|dngettext|dns_check_record|' +\n        'dns_get_mx|dns_get_record|dom_import_simplexml|domainexception|domattr|domattribute_name|domattribute_set_value|domattribute_specified|' +\n        'domattribute_value|domcharacterdata|domcomment|domdocument|domdocument_add_root|domdocument_create_attribute|' +\n        'domdocument_create_cdata_section|domdocument_create_comment|domdocument_create_element|domdocument_create_element_ns|' +\n        'domdocument_create_entity_reference|domdocument_create_processing_instruction|domdocument_create_text_node|domdocument_doctype|' +\n        'domdocument_document_element|domdocument_dump_file|domdocument_dump_mem|domdocument_get_element_by_id|domdocument_get_elements_by_tagname|' +\n        'domdocument_html_dump_mem|domdocument_xinclude|domdocumentfragment|domdocumenttype|domdocumenttype_entities|' +\n        'domdocumenttype_internal_subset|domdocumenttype_name|domdocumenttype_notations|domdocumenttype_public_id|domdocumenttype_system_id|' +\n        'domelement|domelement_get_attribute|domelement_get_attribute_node|domelement_get_elements_by_tagname|domelement_has_attribute|' +\n        'domelement_remove_attribute|domelement_set_attribute|domelement_set_attribute_node|domelement_tagname|domentity|domentityreference|' +\n        'domexception|domimplementation|domnamednodemap|domnode|domnode_add_namespace|domnode_append_child|domnode_append_sibling|' +\n        'domnode_attributes|domnode_child_nodes|domnode_clone_node|domnode_dump_node|domnode_first_child|domnode_get_content|' +\n        'domnode_has_attributes|domnode_has_child_nodes|domnode_insert_before|domnode_is_blank_node|domnode_last_child|domnode_next_sibling|' +\n        'domnode_node_name|domnode_node_type|domnode_node_value|domnode_owner_document|domnode_parent_node|domnode_prefix|domnode_previous_sibling|' +\n        'domnode_remove_child|domnode_replace_child|domnode_replace_node|domnode_set_content|domnode_set_name|domnode_set_namespace|' +\n        'domnode_unlink_node|domnodelist|domnotation|domprocessinginstruction|domprocessinginstruction_data|domprocessinginstruction_target|' +\n        'domtext|domxml_new_doc|domxml_open_file|domxml_open_mem|domxml_version|domxml_xmltree|domxml_xslt_stylesheet|domxml_xslt_stylesheet_doc|' +\n        'domxml_xslt_stylesheet_file|domxml_xslt_version|domxpath|domxsltstylesheet_process|domxsltstylesheet_result_dump_file|' +\n        'domxsltstylesheet_result_dump_mem|dotnet|dotnet_load|doubleval|each|easter_date|easter_days|echo|empty|emptyiterator|' +\n        'enchant_broker_describe|enchant_broker_dict_exists|enchant_broker_free|enchant_broker_free_dict|enchant_broker_get_error|' +\n        'enchant_broker_init|enchant_broker_list_dicts|enchant_broker_request_dict|enchant_broker_request_pwl_dict|enchant_broker_set_ordering|' +\n        'enchant_dict_add_to_personal|enchant_dict_add_to_session|enchant_dict_check|enchant_dict_describe|enchant_dict_get_error|' +\n        'enchant_dict_is_in_session|enchant_dict_quick_check|enchant_dict_store_replacement|enchant_dict_suggest|end|ereg|ereg_replace|eregi|' +\n        'eregi_replace|error_get_last|error_log|error_reporting|errorexception|escapeshellarg|escapeshellcmd|eval|event_add|event_base_free|' +\n        'event_base_loop|event_base_loopbreak|event_base_loopexit|event_base_new|event_base_priority_init|event_base_set|event_buffer_base_set|' +\n        'event_buffer_disable|event_buffer_enable|event_buffer_fd_set|event_buffer_free|event_buffer_new|event_buffer_priority_set|' +\n        'event_buffer_read|event_buffer_set_callback|event_buffer_timeout_set|event_buffer_watermark_set|event_buffer_write|event_del|event_free|' +\n        'event_new|event_set|exception|exec|exif_imagetype|exif_read_data|exif_tagname|exif_thumbnail|exit|exp|expect_expectl|expect_popen|explode|' +\n        'expm1|export|export|extension_loaded|extract|ezmlm_hash|fam_cancel_monitor|fam_close|fam_monitor_collection|fam_monitor_directory|' +\n        'fam_monitor_file|fam_next_event|fam_open|fam_pending|fam_resume_monitor|fam_suspend_monitor|fbsql_affected_rows|fbsql_autocommit|' +\n        'fbsql_blob_size|fbsql_change_user|fbsql_clob_size|fbsql_close|fbsql_commit|fbsql_connect|fbsql_create_blob|fbsql_create_clob|' +\n        'fbsql_create_db|fbsql_data_seek|fbsql_database|fbsql_database_password|fbsql_db_query|fbsql_db_status|fbsql_drop_db|fbsql_errno|' +\n        'fbsql_error|fbsql_fetch_array|fbsql_fetch_assoc|fbsql_fetch_field|fbsql_fetch_lengths|fbsql_fetch_object|fbsql_fetch_row|' +\n        'fbsql_field_flags|fbsql_field_len|fbsql_field_name|fbsql_field_seek|fbsql_field_table|fbsql_field_type|fbsql_free_result|' +\n        'fbsql_get_autostart_info|fbsql_hostname|fbsql_insert_id|fbsql_list_dbs|fbsql_list_fields|fbsql_list_tables|fbsql_next_result|' +\n        'fbsql_num_fields|fbsql_num_rows|fbsql_password|fbsql_pconnect|fbsql_query|fbsql_read_blob|fbsql_read_clob|fbsql_result|fbsql_rollback|' +\n        'fbsql_rows_fetched|fbsql_select_db|fbsql_set_characterset|fbsql_set_lob_mode|fbsql_set_password|fbsql_set_transaction|fbsql_start_db|' +\n        'fbsql_stop_db|fbsql_table_name|fbsql_tablename|fbsql_username|fbsql_warnings|fclose|fdf_add_doc_javascript|fdf_add_template|fdf_close|' +\n        'fdf_create|fdf_enum_values|fdf_errno|fdf_error|fdf_get_ap|fdf_get_attachment|fdf_get_encoding|fdf_get_file|fdf_get_flags|fdf_get_opt|' +\n        'fdf_get_status|fdf_get_value|fdf_get_version|fdf_header|fdf_next_field_name|fdf_open|fdf_open_string|fdf_remove_item|fdf_save|' +\n        'fdf_save_string|fdf_set_ap|fdf_set_encoding|fdf_set_file|fdf_set_flags|fdf_set_javascript_action|fdf_set_on_import_javascript|fdf_set_opt|' +\n        'fdf_set_status|fdf_set_submit_form_action|fdf_set_target_frame|fdf_set_value|fdf_set_version|feof|fflush|fgetc|fgetcsv|fgets|fgetss|file|' +\n        'file_exists|file_get_contents|file_put_contents|fileatime|filectime|filegroup|fileinode|filemtime|fileowner|fileperms|filepro|' +\n        'filepro_fieldcount|filepro_fieldname|filepro_fieldtype|filepro_fieldwidth|filepro_retrieve|filepro_rowcount|filesize|filesystemiterator|' +\n        'filetype|filter_has_var|filter_id|filter_input|filter_input_array|filter_list|filter_var|filter_var_array|filteriterator|finfo_buffer|' +\n        'finfo_close|finfo_file|finfo_open|finfo_set_flags|floatval|flock|floor|flush|fmod|fnmatch|fopen|forward_static_call|' +\n        'forward_static_call_array|fpassthru|fprintf|fputcsv|fputs|fread|frenchtojd|fribidi_log2vis|fscanf|fseek|fsockopen|fstat|ftell|ftok|' +\n        'ftp_alloc|ftp_cdup|ftp_chdir|ftp_chmod|ftp_close|ftp_connect|ftp_delete|ftp_exec|ftp_fget|ftp_fput|ftp_get|ftp_get_option|ftp_login|' +\n        'ftp_mdtm|ftp_mkdir|ftp_nb_continue|ftp_nb_fget|ftp_nb_fput|ftp_nb_get|ftp_nb_put|ftp_nlist|ftp_pasv|ftp_put|ftp_pwd|ftp_quit|ftp_raw|' +\n        'ftp_rawlist|ftp_rename|ftp_rmdir|ftp_set_option|ftp_site|ftp_size|ftp_ssl_connect|ftp_systype|ftruncate|func_get_arg|func_get_args|' +\n        'func_num_args|function_exists|fwrite|gc_collect_cycles|gc_disable|gc_enable|gc_enabled|gd_info|gearmanclient|gearmanjob|gearmantask|' +\n        'gearmanworker|geoip_continent_code_by_name|geoip_country_code3_by_name|geoip_country_code_by_name|geoip_country_name_by_name|' +\n        'geoip_database_info|geoip_db_avail|geoip_db_filename|geoip_db_get_all_info|geoip_id_by_name|geoip_isp_by_name|geoip_org_by_name|' +\n        'geoip_record_by_name|geoip_region_by_name|geoip_region_name_by_code|geoip_time_zone_by_country_and_region|getMeta|getNamed|getValue|' +\n        'get_browser|get_called_class|get_cfg_var|get_class|get_class_methods|get_class_vars|get_current_user|get_declared_classes|' +\n        'get_declared_interfaces|get_defined_constants|get_defined_functions|get_defined_vars|get_extension_funcs|get_headers|' +\n        'get_html_translation_table|get_include_path|get_included_files|get_loaded_extensions|get_magic_quotes_gpc|get_magic_quotes_runtime|' +\n        'get_meta_tags|get_object_vars|get_parent_class|get_required_files|get_resource_type|getallheaders|getconstant|getconstants|getconstructor|' +\n        'getcwd|getdate|getdefaultproperties|getdoccomment|getendline|getenv|getextension|getextensionname|getfilename|gethostbyaddr|gethostbyname|' +\n        'gethostbynamel|gethostname|getimagesize|getinterfacenames|getinterfaces|getlastmod|getmethod|getmethods|getmodifiers|getmxrr|getmygid|' +\n        'getmyinode|getmypid|getmyuid|getname|getnamespacename|getopt|getparentclass|getproperties|getproperty|getprotobyname|getprotobynumber|' +\n        'getrandmax|getrusage|getservbyname|getservbyport|getshortname|getstartline|getstaticproperties|getstaticpropertyvalue|gettext|' +\n        'gettimeofday|gettype|glob|globiterator|gmagick|gmagickdraw|gmagickpixel|gmdate|gmmktime|gmp_abs|gmp_add|gmp_and|gmp_clrbit|gmp_cmp|' +\n        'gmp_com|gmp_div|gmp_div_q|gmp_div_qr|gmp_div_r|gmp_divexact|gmp_fact|gmp_gcd|gmp_gcdext|gmp_hamdist|gmp_init|gmp_intval|gmp_invert|' +\n        'gmp_jacobi|gmp_legendre|gmp_mod|gmp_mul|gmp_neg|gmp_nextprime|gmp_or|gmp_perfect_square|gmp_popcount|gmp_pow|gmp_powm|gmp_prob_prime|' +\n        'gmp_random|gmp_scan0|gmp_scan1|gmp_setbit|gmp_sign|gmp_sqrt|gmp_sqrtrem|gmp_strval|gmp_sub|gmp_testbit|gmp_xor|gmstrftime|' +\n        'gnupg_adddecryptkey|gnupg_addencryptkey|gnupg_addsignkey|gnupg_cleardecryptkeys|gnupg_clearencryptkeys|gnupg_clearsignkeys|gnupg_decrypt|' +\n        'gnupg_decryptverify|gnupg_encrypt|gnupg_encryptsign|gnupg_export|gnupg_geterror|gnupg_getprotocol|gnupg_import|gnupg_init|gnupg_keyinfo|' +\n        'gnupg_setarmor|gnupg_seterrormode|gnupg_setsignmode|gnupg_sign|gnupg_verify|gopher_parsedir|grapheme_extract|grapheme_stripos|' +\n        'grapheme_stristr|grapheme_strlen|grapheme_strpos|grapheme_strripos|grapheme_strrpos|grapheme_strstr|grapheme_substr|gregoriantojd|' +\n        'gupnp_context_get_host_ip|gupnp_context_get_port|gupnp_context_get_subscription_timeout|gupnp_context_host_path|gupnp_context_new|' +\n        'gupnp_context_set_subscription_timeout|gupnp_context_timeout_add|gupnp_context_unhost_path|gupnp_control_point_browse_start|' +\n        'gupnp_control_point_browse_stop|gupnp_control_point_callback_set|gupnp_control_point_new|gupnp_device_action_callback_set|' +\n        'gupnp_device_info_get|gupnp_device_info_get_service|gupnp_root_device_get_available|gupnp_root_device_get_relative_location|' +\n        'gupnp_root_device_new|gupnp_root_device_set_available|gupnp_root_device_start|gupnp_root_device_stop|gupnp_service_action_get|' +\n        'gupnp_service_action_return|gupnp_service_action_return_error|gupnp_service_action_set|gupnp_service_freeze_notify|gupnp_service_info_get|' +\n        'gupnp_service_info_get_introspection|gupnp_service_introspection_get_state_variable|gupnp_service_notify|gupnp_service_proxy_action_get|' +\n        'gupnp_service_proxy_action_set|gupnp_service_proxy_add_notify|gupnp_service_proxy_callback_set|gupnp_service_proxy_get_subscribed|' +\n        'gupnp_service_proxy_remove_notify|gupnp_service_proxy_set_subscribed|gupnp_service_thaw_notify|gzclose|gzcompress|gzdecode|gzdeflate|' +\n        'gzencode|gzeof|gzfile|gzgetc|gzgets|gzgetss|gzinflate|gzopen|gzpassthru|gzputs|gzread|gzrewind|gzseek|gztell|gzuncompress|gzwrite|' +\n        'halt_compiler|haruannotation|haruannotation_setborderstyle|haruannotation_sethighlightmode|haruannotation_seticon|' +\n        'haruannotation_setopened|harudestination|harudestination_setfit|harudestination_setfitb|harudestination_setfitbh|harudestination_setfitbv|' +\n        'harudestination_setfith|harudestination_setfitr|harudestination_setfitv|harudestination_setxyz|harudoc|harudoc_addpage|' +\n        'harudoc_addpagelabel|harudoc_construct|harudoc_createoutline|harudoc_getcurrentencoder|harudoc_getcurrentpage|harudoc_getencoder|' +\n        'harudoc_getfont|harudoc_getinfoattr|harudoc_getpagelayout|harudoc_getpagemode|harudoc_getstreamsize|harudoc_insertpage|harudoc_loadjpeg|' +\n        'harudoc_loadpng|harudoc_loadraw|harudoc_loadttc|harudoc_loadttf|harudoc_loadtype1|harudoc_output|harudoc_readfromstream|' +\n        'harudoc_reseterror|harudoc_resetstream|harudoc_save|harudoc_savetostream|harudoc_setcompressionmode|harudoc_setcurrentencoder|' +\n        'harudoc_setencryptionmode|harudoc_setinfoattr|harudoc_setinfodateattr|harudoc_setopenaction|harudoc_setpagelayout|harudoc_setpagemode|' +\n        'harudoc_setpagesconfiguration|harudoc_setpassword|harudoc_setpermission|harudoc_usecnsencodings|harudoc_usecnsfonts|' +\n        'harudoc_usecntencodings|harudoc_usecntfonts|harudoc_usejpencodings|harudoc_usejpfonts|harudoc_usekrencodings|harudoc_usekrfonts|' +\n        'haruencoder|haruencoder_getbytetype|haruencoder_gettype|haruencoder_getunicode|haruencoder_getwritingmode|haruexception|harufont|' +\n        'harufont_getascent|harufont_getcapheight|harufont_getdescent|harufont_getencodingname|harufont_getfontname|harufont_gettextwidth|' +\n        'harufont_getunicodewidth|harufont_getxheight|harufont_measuretext|haruimage|haruimage_getbitspercomponent|haruimage_getcolorspace|' +\n        'haruimage_getheight|haruimage_getsize|haruimage_getwidth|haruimage_setcolormask|haruimage_setmaskimage|haruoutline|' +\n        'haruoutline_setdestination|haruoutline_setopened|harupage|harupage_arc|harupage_begintext|harupage_circle|harupage_closepath|' +\n        'harupage_concat|harupage_createdestination|harupage_createlinkannotation|harupage_createtextannotation|harupage_createurlannotation|' +\n        'harupage_curveto|harupage_curveto2|harupage_curveto3|harupage_drawimage|harupage_ellipse|harupage_endpath|harupage_endtext|' +\n        'harupage_eofill|harupage_eofillstroke|harupage_fill|harupage_fillstroke|harupage_getcharspace|harupage_getcmykfill|harupage_getcmykstroke|' +\n        'harupage_getcurrentfont|harupage_getcurrentfontsize|harupage_getcurrentpos|harupage_getcurrenttextpos|harupage_getdash|' +\n        'harupage_getfillingcolorspace|harupage_getflatness|harupage_getgmode|harupage_getgrayfill|harupage_getgraystroke|harupage_getheight|' +\n        'harupage_gethorizontalscaling|harupage_getlinecap|harupage_getlinejoin|harupage_getlinewidth|harupage_getmiterlimit|harupage_getrgbfill|' +\n        'harupage_getrgbstroke|harupage_getstrokingcolorspace|harupage_gettextleading|harupage_gettextmatrix|harupage_gettextrenderingmode|' +\n        'harupage_gettextrise|harupage_gettextwidth|harupage_gettransmatrix|harupage_getwidth|harupage_getwordspace|harupage_lineto|' +\n        'harupage_measuretext|harupage_movetextpos|harupage_moveto|harupage_movetonextline|harupage_rectangle|harupage_setcharspace|' +\n        'harupage_setcmykfill|harupage_setcmykstroke|harupage_setdash|harupage_setflatness|harupage_setfontandsize|harupage_setgrayfill|' +\n        'harupage_setgraystroke|harupage_setheight|harupage_sethorizontalscaling|harupage_setlinecap|harupage_setlinejoin|harupage_setlinewidth|' +\n        'harupage_setmiterlimit|harupage_setrgbfill|harupage_setrgbstroke|harupage_setrotate|harupage_setsize|harupage_setslideshow|' +\n        'harupage_settextleading|harupage_settextmatrix|harupage_settextrenderingmode|harupage_settextrise|harupage_setwidth|harupage_setwordspace|' +\n        'harupage_showtext|harupage_showtextnextline|harupage_stroke|harupage_textout|harupage_textrect|hasconstant|hash|hash_algos|hash_copy|' +\n        'hash_file|hash_final|hash_hmac|hash_hmac_file|hash_init|hash_update|hash_update_file|hash_update_stream|hasmethod|hasproperty|header|' +\n        'header_register_callback|header_remove|headers_list|headers_sent|hebrev|hebrevc|hex2bin|hexdec|highlight_file|highlight_string|' +\n        'html_entity_decode|htmlentities|htmlspecialchars|htmlspecialchars_decode|http_build_cookie|http_build_query|http_build_str|http_build_url|' +\n        'http_cache_etag|http_cache_last_modified|http_chunked_decode|http_date|http_deflate|http_get|http_get_request_body|' +\n        'http_get_request_body_stream|http_get_request_headers|http_head|http_inflate|http_match_etag|http_match_modified|' +\n        'http_match_request_header|http_negotiate_charset|http_negotiate_content_type|http_negotiate_language|http_parse_cookie|http_parse_headers|' +\n        'http_parse_message|http_parse_params|http_persistent_handles_clean|http_persistent_handles_count|http_persistent_handles_ident|' +\n        'http_post_data|http_post_fields|http_put_data|http_put_file|http_put_stream|http_redirect|http_request|http_request_body_encode|' +\n        'http_request_method_exists|http_request_method_name|http_request_method_register|http_request_method_unregister|http_response_code|' +\n        'http_send_content_disposition|http_send_content_type|http_send_data|http_send_file|http_send_last_modified|http_send_status|' +\n        'http_send_stream|http_support|http_throttle|httpdeflatestream|httpdeflatestream_construct|httpdeflatestream_factory|' +\n        'httpdeflatestream_finish|httpdeflatestream_flush|httpdeflatestream_update|httpinflatestream|httpinflatestream_construct|' +\n        'httpinflatestream_factory|httpinflatestream_finish|httpinflatestream_flush|httpinflatestream_update|httpmessage|httpmessage_addheaders|' +\n        'httpmessage_construct|httpmessage_detach|httpmessage_factory|httpmessage_fromenv|httpmessage_fromstring|httpmessage_getbody|' +\n        'httpmessage_getheader|httpmessage_getheaders|httpmessage_gethttpversion|httpmessage_getparentmessage|httpmessage_getrequestmethod|' +\n        'httpmessage_getrequesturl|httpmessage_getresponsecode|httpmessage_getresponsestatus|httpmessage_gettype|httpmessage_guesscontenttype|' +\n        'httpmessage_prepend|httpmessage_reverse|httpmessage_send|httpmessage_setbody|httpmessage_setheaders|httpmessage_sethttpversion|' +\n        'httpmessage_setrequestmethod|httpmessage_setrequesturl|httpmessage_setresponsecode|httpmessage_setresponsestatus|httpmessage_settype|' +\n        'httpmessage_tomessagetypeobject|httpmessage_tostring|httpquerystring|httpquerystring_construct|httpquerystring_get|httpquerystring_mod|' +\n        'httpquerystring_set|httpquerystring_singleton|httpquerystring_toarray|httpquerystring_tostring|httpquerystring_xlate|httprequest|' +\n        'httprequest_addcookies|httprequest_addheaders|httprequest_addpostfields|httprequest_addpostfile|httprequest_addputdata|' +\n        'httprequest_addquerydata|httprequest_addrawpostdata|httprequest_addssloptions|httprequest_clearhistory|httprequest_construct|' +\n        'httprequest_enablecookies|httprequest_getcontenttype|httprequest_getcookies|httprequest_getheaders|httprequest_gethistory|' +\n        'httprequest_getmethod|httprequest_getoptions|httprequest_getpostfields|httprequest_getpostfiles|httprequest_getputdata|' +\n        'httprequest_getputfile|httprequest_getquerydata|httprequest_getrawpostdata|httprequest_getrawrequestmessage|' +\n        'httprequest_getrawresponsemessage|httprequest_getrequestmessage|httprequest_getresponsebody|httprequest_getresponsecode|' +\n        'httprequest_getresponsecookies|httprequest_getresponsedata|httprequest_getresponseheader|httprequest_getresponseinfo|' +\n        'httprequest_getresponsemessage|httprequest_getresponsestatus|httprequest_getssloptions|httprequest_geturl|httprequest_resetcookies|' +\n        'httprequest_send|httprequest_setcontenttype|httprequest_setcookies|httprequest_setheaders|httprequest_setmethod|httprequest_setoptions|' +\n        'httprequest_setpostfields|httprequest_setpostfiles|httprequest_setputdata|httprequest_setputfile|httprequest_setquerydata|' +\n        'httprequest_setrawpostdata|httprequest_setssloptions|httprequest_seturl|httprequestpool|httprequestpool_attach|httprequestpool_construct|' +\n        'httprequestpool_destruct|httprequestpool_detach|httprequestpool_getattachedrequests|httprequestpool_getfinishedrequests|' +\n        'httprequestpool_reset|httprequestpool_send|httprequestpool_socketperform|httprequestpool_socketselect|httpresponse|httpresponse_capture|' +\n        'httpresponse_getbuffersize|httpresponse_getcache|httpresponse_getcachecontrol|httpresponse_getcontentdisposition|' +\n        'httpresponse_getcontenttype|httpresponse_getdata|httpresponse_getetag|httpresponse_getfile|httpresponse_getgzip|httpresponse_getheader|' +\n        'httpresponse_getlastmodified|httpresponse_getrequestbody|httpresponse_getrequestbodystream|httpresponse_getrequestheaders|' +\n        'httpresponse_getstream|httpresponse_getthrottledelay|httpresponse_guesscontenttype|httpresponse_redirect|httpresponse_send|' +\n        'httpresponse_setbuffersize|httpresponse_setcache|httpresponse_setcachecontrol|httpresponse_setcontentdisposition|' +\n        'httpresponse_setcontenttype|httpresponse_setdata|httpresponse_setetag|httpresponse_setfile|httpresponse_setgzip|httpresponse_setheader|' +\n        'httpresponse_setlastmodified|httpresponse_setstream|httpresponse_setthrottledelay|httpresponse_status|hw_array2objrec|hw_changeobject|' +\n        'hw_children|hw_childrenobj|hw_close|hw_connect|hw_connection_info|hw_cp|hw_deleteobject|hw_docbyanchor|hw_docbyanchorobj|' +\n        'hw_document_attributes|hw_document_bodytag|hw_document_content|hw_document_setcontent|hw_document_size|hw_dummy|hw_edittext|hw_error|' +\n        'hw_errormsg|hw_free_document|hw_getanchors|hw_getanchorsobj|hw_getandlock|hw_getchildcoll|hw_getchildcollobj|hw_getchilddoccoll|' +\n        'hw_getchilddoccollobj|hw_getobject|hw_getobjectbyquery|hw_getobjectbyquerycoll|hw_getobjectbyquerycollobj|hw_getobjectbyqueryobj|' +\n        'hw_getparents|hw_getparentsobj|hw_getrellink|hw_getremote|hw_getremotechildren|hw_getsrcbydestobj|hw_gettext|hw_getusername|hw_identify|' +\n        'hw_incollections|hw_info|hw_inscoll|hw_insdoc|hw_insertanchors|hw_insertdocument|hw_insertobject|hw_mapid|hw_modifyobject|hw_mv|' +\n        'hw_new_document|hw_objrec2array|hw_output_document|hw_pconnect|hw_pipedocument|hw_root|hw_setlinkroot|hw_stat|hw_unlock|hw_who|' +\n        'hwapi_attribute|hwapi_attribute_key|hwapi_attribute_langdepvalue|hwapi_attribute_value|hwapi_attribute_values|hwapi_checkin|' +\n        'hwapi_checkout|hwapi_children|hwapi_content|hwapi_content_mimetype|hwapi_content_read|hwapi_copy|hwapi_dbstat|hwapi_dcstat|' +\n        'hwapi_dstanchors|hwapi_dstofsrcanchor|hwapi_error_count|hwapi_error_reason|hwapi_find|hwapi_ftstat|hwapi_hgcsp|hwapi_hwstat|' +\n        'hwapi_identify|hwapi_info|hwapi_insert|hwapi_insertanchor|hwapi_insertcollection|hwapi_insertdocument|hwapi_link|hwapi_lock|hwapi_move|' +\n        'hwapi_new_content|hwapi_object|hwapi_object_assign|hwapi_object_attreditable|hwapi_object_count|hwapi_object_insert|hwapi_object_new|' +\n        'hwapi_object_remove|hwapi_object_title|hwapi_object_value|hwapi_objectbyanchor|hwapi_parents|hwapi_reason_description|hwapi_reason_type|' +\n        'hwapi_remove|hwapi_replace|hwapi_setcommittedversion|hwapi_srcanchors|hwapi_srcsofdst|hwapi_unlock|hwapi_user|hwapi_userlist|hypot|' +\n        'ibase_add_user|ibase_affected_rows|ibase_backup|ibase_blob_add|ibase_blob_cancel|ibase_blob_close|ibase_blob_create|ibase_blob_echo|' +\n        'ibase_blob_get|ibase_blob_import|ibase_blob_info|ibase_blob_open|ibase_close|ibase_commit|ibase_commit_ret|ibase_connect|ibase_db_info|' +\n        'ibase_delete_user|ibase_drop_db|ibase_errcode|ibase_errmsg|ibase_execute|ibase_fetch_assoc|ibase_fetch_object|ibase_fetch_row|' +\n        'ibase_field_info|ibase_free_event_handler|ibase_free_query|ibase_free_result|ibase_gen_id|ibase_maintain_db|ibase_modify_user|' +\n        'ibase_name_result|ibase_num_fields|ibase_num_params|ibase_param_info|ibase_pconnect|ibase_prepare|ibase_query|ibase_restore|' +\n        'ibase_rollback|ibase_rollback_ret|ibase_server_info|ibase_service_attach|ibase_service_detach|ibase_set_event_handler|ibase_timefmt|' +\n        'ibase_trans|ibase_wait_event|iconv|iconv_get_encoding|iconv_mime_decode|iconv_mime_decode_headers|iconv_mime_encode|iconv_set_encoding|' +\n        'iconv_strlen|iconv_strpos|iconv_strrpos|iconv_substr|id3_get_frame_long_name|id3_get_frame_short_name|id3_get_genre_id|id3_get_genre_list|' +\n        'id3_get_genre_name|id3_get_tag|id3_get_version|id3_remove_tag|id3_set_tag|id3v2attachedpictureframe|id3v2frame|id3v2tag|idate|' +\n        'idn_to_ascii|idn_to_unicode|idn_to_utf8|ifx_affected_rows|ifx_blobinfile_mode|ifx_byteasvarchar|ifx_close|ifx_connect|ifx_copy_blob|' +\n        'ifx_create_blob|ifx_create_char|ifx_do|ifx_error|ifx_errormsg|ifx_fetch_row|ifx_fieldproperties|ifx_fieldtypes|ifx_free_blob|' +\n        'ifx_free_char|ifx_free_result|ifx_get_blob|ifx_get_char|ifx_getsqlca|ifx_htmltbl_result|ifx_nullformat|ifx_num_fields|ifx_num_rows|' +\n        'ifx_pconnect|ifx_prepare|ifx_query|ifx_textasvarchar|ifx_update_blob|ifx_update_char|ifxus_close_slob|ifxus_create_slob|ifxus_free_slob|' +\n        'ifxus_open_slob|ifxus_read_slob|ifxus_seek_slob|ifxus_tell_slob|ifxus_write_slob|ignore_user_abort|iis_add_server|iis_get_dir_security|' +\n        'iis_get_script_map|iis_get_server_by_comment|iis_get_server_by_path|iis_get_server_rights|iis_get_service_state|iis_remove_server|' +\n        'iis_set_app_settings|iis_set_dir_security|iis_set_script_map|iis_set_server_rights|iis_start_server|iis_start_service|iis_stop_server|' +\n        'iis_stop_service|image2wbmp|image_type_to_extension|image_type_to_mime_type|imagealphablending|imageantialias|imagearc|imagechar|' +\n        'imagecharup|imagecolorallocate|imagecolorallocatealpha|imagecolorat|imagecolorclosest|imagecolorclosestalpha|imagecolorclosesthwb|' +\n        'imagecolordeallocate|imagecolorexact|imagecolorexactalpha|imagecolormatch|imagecolorresolve|imagecolorresolvealpha|imagecolorset|' +\n        'imagecolorsforindex|imagecolorstotal|imagecolortransparent|imageconvolution|imagecopy|imagecopymerge|imagecopymergegray|' +\n        'imagecopyresampled|imagecopyresized|imagecreate|imagecreatefromgd|imagecreatefromgd2|imagecreatefromgd2part|imagecreatefromgif|' +\n        'imagecreatefromjpeg|imagecreatefrompng|imagecreatefromstring|imagecreatefromwbmp|imagecreatefromxbm|imagecreatefromxpm|' +\n        'imagecreatetruecolor|imagedashedline|imagedestroy|imageellipse|imagefill|imagefilledarc|imagefilledellipse|imagefilledpolygon|' +\n        'imagefilledrectangle|imagefilltoborder|imagefilter|imagefontheight|imagefontwidth|imageftbbox|imagefttext|imagegammacorrect|imagegd|' +\n        'imagegd2|imagegif|imagegrabscreen|imagegrabwindow|imageinterlace|imageistruecolor|imagejpeg|imagelayereffect|imageline|imageloadfont|' +\n        'imagepalettecopy|imagepng|imagepolygon|imagepsbbox|imagepsencodefont|imagepsextendfont|imagepsfreefont|imagepsloadfont|imagepsslantfont|' +\n        'imagepstext|imagerectangle|imagerotate|imagesavealpha|imagesetbrush|imagesetpixel|imagesetstyle|imagesetthickness|imagesettile|' +\n        'imagestring|imagestringup|imagesx|imagesy|imagetruecolortopalette|imagettfbbox|imagettftext|imagetypes|imagewbmp|imagexbm|imagick|' +\n        'imagick_adaptiveblurimage|imagick_adaptiveresizeimage|imagick_adaptivesharpenimage|imagick_adaptivethresholdimage|imagick_addimage|' +\n        'imagick_addnoiseimage|imagick_affinetransformimage|imagick_animateimages|imagick_annotateimage|imagick_appendimages|imagick_averageimages|' +\n        'imagick_blackthresholdimage|imagick_blurimage|imagick_borderimage|imagick_charcoalimage|imagick_chopimage|imagick_clear|imagick_clipimage|' +\n        'imagick_clippathimage|imagick_clone|imagick_clutimage|imagick_coalesceimages|imagick_colorfloodfillimage|imagick_colorizeimage|' +\n        'imagick_combineimages|imagick_commentimage|imagick_compareimagechannels|imagick_compareimagelayers|imagick_compareimages|' +\n        'imagick_compositeimage|imagick_construct|imagick_contrastimage|imagick_contraststretchimage|imagick_convolveimage|imagick_cropimage|' +\n        'imagick_cropthumbnailimage|imagick_current|imagick_cyclecolormapimage|imagick_decipherimage|imagick_deconstructimages|' +\n        'imagick_deleteimageartifact|imagick_despeckleimage|imagick_destroy|imagick_displayimage|imagick_displayimages|imagick_distortimage|' +\n        'imagick_drawimage|imagick_edgeimage|imagick_embossimage|imagick_encipherimage|imagick_enhanceimage|imagick_equalizeimage|' +\n        'imagick_evaluateimage|imagick_extentimage|imagick_flattenimages|imagick_flipimage|imagick_floodfillpaintimage|imagick_flopimage|' +\n        'imagick_frameimage|imagick_fximage|imagick_gammaimage|imagick_gaussianblurimage|imagick_getcolorspace|imagick_getcompression|' +\n        'imagick_getcompressionquality|imagick_getcopyright|imagick_getfilename|imagick_getfont|imagick_getformat|imagick_getgravity|' +\n        'imagick_gethomeurl|imagick_getimage|imagick_getimagealphachannel|imagick_getimageartifact|imagick_getimagebackgroundcolor|' +\n        'imagick_getimageblob|imagick_getimageblueprimary|imagick_getimagebordercolor|imagick_getimagechanneldepth|' +\n        'imagick_getimagechanneldistortion|imagick_getimagechanneldistortions|imagick_getimagechannelextrema|imagick_getimagechannelmean|' +\n        'imagick_getimagechannelrange|imagick_getimagechannelstatistics|imagick_getimageclipmask|imagick_getimagecolormapcolor|' +\n        'imagick_getimagecolors|imagick_getimagecolorspace|imagick_getimagecompose|imagick_getimagecompression|imagick_getimagecompressionquality|' +\n        'imagick_getimagedelay|imagick_getimagedepth|imagick_getimagedispose|imagick_getimagedistortion|imagick_getimageextrema|' +\n        'imagick_getimagefilename|imagick_getimageformat|imagick_getimagegamma|imagick_getimagegeometry|imagick_getimagegravity|' +\n        'imagick_getimagegreenprimary|imagick_getimageheight|imagick_getimagehistogram|imagick_getimageindex|imagick_getimageinterlacescheme|' +\n        'imagick_getimageinterpolatemethod|imagick_getimageiterations|imagick_getimagelength|imagick_getimagemagicklicense|imagick_getimagematte|' +\n        'imagick_getimagemattecolor|imagick_getimageorientation|imagick_getimagepage|imagick_getimagepixelcolor|imagick_getimageprofile|' +\n        'imagick_getimageprofiles|imagick_getimageproperties|imagick_getimageproperty|imagick_getimageredprimary|imagick_getimageregion|' +\n        'imagick_getimagerenderingintent|imagick_getimageresolution|imagick_getimagesblob|imagick_getimagescene|imagick_getimagesignature|' +\n        'imagick_getimagesize|imagick_getimagetickspersecond|imagick_getimagetotalinkdensity|imagick_getimagetype|imagick_getimageunits|' +\n        'imagick_getimagevirtualpixelmethod|imagick_getimagewhitepoint|imagick_getimagewidth|imagick_getinterlacescheme|imagick_getiteratorindex|' +\n        'imagick_getnumberimages|imagick_getoption|imagick_getpackagename|imagick_getpage|imagick_getpixeliterator|imagick_getpixelregioniterator|' +\n        'imagick_getpointsize|imagick_getquantumdepth|imagick_getquantumrange|imagick_getreleasedate|imagick_getresource|imagick_getresourcelimit|' +\n        'imagick_getsamplingfactors|imagick_getsize|imagick_getsizeoffset|imagick_getversion|imagick_hasnextimage|imagick_haspreviousimage|' +\n        'imagick_identifyimage|imagick_implodeimage|imagick_labelimage|imagick_levelimage|imagick_linearstretchimage|imagick_liquidrescaleimage|' +\n        'imagick_magnifyimage|imagick_mapimage|imagick_mattefloodfillimage|imagick_medianfilterimage|imagick_mergeimagelayers|imagick_minifyimage|' +\n        'imagick_modulateimage|imagick_montageimage|imagick_morphimages|imagick_mosaicimages|imagick_motionblurimage|imagick_negateimage|' +\n        'imagick_newimage|imagick_newpseudoimage|imagick_nextimage|imagick_normalizeimage|imagick_oilpaintimage|imagick_opaquepaintimage|' +\n        'imagick_optimizeimagelayers|imagick_orderedposterizeimage|imagick_paintfloodfillimage|imagick_paintopaqueimage|' +\n        'imagick_painttransparentimage|imagick_pingimage|imagick_pingimageblob|imagick_pingimagefile|imagick_polaroidimage|imagick_posterizeimage|' +\n        'imagick_previewimages|imagick_previousimage|imagick_profileimage|imagick_quantizeimage|imagick_quantizeimages|imagick_queryfontmetrics|' +\n        'imagick_queryfonts|imagick_queryformats|imagick_radialblurimage|imagick_raiseimage|imagick_randomthresholdimage|imagick_readimage|' +\n        'imagick_readimageblob|imagick_readimagefile|imagick_recolorimage|imagick_reducenoiseimage|imagick_removeimage|imagick_removeimageprofile|' +\n        'imagick_render|imagick_resampleimage|imagick_resetimagepage|imagick_resizeimage|imagick_rollimage|imagick_rotateimage|' +\n        'imagick_roundcorners|imagick_sampleimage|imagick_scaleimage|imagick_separateimagechannel|imagick_sepiatoneimage|' +\n        'imagick_setbackgroundcolor|imagick_setcolorspace|imagick_setcompression|imagick_setcompressionquality|imagick_setfilename|' +\n        'imagick_setfirstiterator|imagick_setfont|imagick_setformat|imagick_setgravity|imagick_setimage|imagick_setimagealphachannel|' +\n        'imagick_setimageartifact|imagick_setimagebackgroundcolor|imagick_setimagebias|imagick_setimageblueprimary|imagick_setimagebordercolor|' +\n        'imagick_setimagechanneldepth|imagick_setimageclipmask|imagick_setimagecolormapcolor|imagick_setimagecolorspace|imagick_setimagecompose|' +\n        'imagick_setimagecompression|imagick_setimagecompressionquality|imagick_setimagedelay|imagick_setimagedepth|imagick_setimagedispose|' +\n        'imagick_setimageextent|imagick_setimagefilename|imagick_setimageformat|imagick_setimagegamma|imagick_setimagegravity|' +\n        'imagick_setimagegreenprimary|imagick_setimageindex|imagick_setimageinterlacescheme|imagick_setimageinterpolatemethod|' +\n        'imagick_setimageiterations|imagick_setimagematte|imagick_setimagemattecolor|imagick_setimageopacity|imagick_setimageorientation|' +\n        'imagick_setimagepage|imagick_setimageprofile|imagick_setimageproperty|imagick_setimageredprimary|imagick_setimagerenderingintent|' +\n        'imagick_setimageresolution|imagick_setimagescene|imagick_setimagetickspersecond|imagick_setimagetype|imagick_setimageunits|' +\n        'imagick_setimagevirtualpixelmethod|imagick_setimagewhitepoint|imagick_setinterlacescheme|imagick_setiteratorindex|imagick_setlastiterator|' +\n        'imagick_setoption|imagick_setpage|imagick_setpointsize|imagick_setresolution|imagick_setresourcelimit|imagick_setsamplingfactors|' +\n        'imagick_setsize|imagick_setsizeoffset|imagick_settype|imagick_shadeimage|imagick_shadowimage|imagick_sharpenimage|imagick_shaveimage|' +\n        'imagick_shearimage|imagick_sigmoidalcontrastimage|imagick_sketchimage|imagick_solarizeimage|imagick_spliceimage|imagick_spreadimage|' +\n        'imagick_steganoimage|imagick_stereoimage|imagick_stripimage|imagick_swirlimage|imagick_textureimage|imagick_thresholdimage|' +\n        'imagick_thumbnailimage|imagick_tintimage|imagick_transformimage|imagick_transparentpaintimage|imagick_transposeimage|' +\n        'imagick_transverseimage|imagick_trimimage|imagick_uniqueimagecolors|imagick_unsharpmaskimage|imagick_valid|imagick_vignetteimage|' +\n        'imagick_waveimage|imagick_whitethresholdimage|imagick_writeimage|imagick_writeimagefile|imagick_writeimages|imagick_writeimagesfile|' +\n        'imagickdraw|imagickdraw_affine|imagickdraw_annotation|imagickdraw_arc|imagickdraw_bezier|imagickdraw_circle|imagickdraw_clear|' +\n        'imagickdraw_clone|imagickdraw_color|imagickdraw_comment|imagickdraw_composite|imagickdraw_construct|imagickdraw_destroy|' +\n        'imagickdraw_ellipse|imagickdraw_getclippath|imagickdraw_getcliprule|imagickdraw_getclipunits|imagickdraw_getfillcolor|' +\n        'imagickdraw_getfillopacity|imagickdraw_getfillrule|imagickdraw_getfont|imagickdraw_getfontfamily|imagickdraw_getfontsize|' +\n        'imagickdraw_getfontstyle|imagickdraw_getfontweight|imagickdraw_getgravity|imagickdraw_getstrokeantialias|imagickdraw_getstrokecolor|' +\n        'imagickdraw_getstrokedasharray|imagickdraw_getstrokedashoffset|imagickdraw_getstrokelinecap|imagickdraw_getstrokelinejoin|' +\n        'imagickdraw_getstrokemiterlimit|imagickdraw_getstrokeopacity|imagickdraw_getstrokewidth|imagickdraw_gettextalignment|' +\n        'imagickdraw_gettextantialias|imagickdraw_gettextdecoration|imagickdraw_gettextencoding|imagickdraw_gettextundercolor|' +\n        'imagickdraw_getvectorgraphics|imagickdraw_line|imagickdraw_matte|imagickdraw_pathclose|imagickdraw_pathcurvetoabsolute|' +\n        'imagickdraw_pathcurvetoquadraticbezierabsolute|imagickdraw_pathcurvetoquadraticbezierrelative|' +\n        'imagickdraw_pathcurvetoquadraticbeziersmoothabsolute|imagickdraw_pathcurvetoquadraticbeziersmoothrelative|imagickdraw_pathcurvetorelative|' +\n        'imagickdraw_pathcurvetosmoothabsolute|imagickdraw_pathcurvetosmoothrelative|imagickdraw_pathellipticarcabsolute|' +\n        'imagickdraw_pathellipticarcrelative|imagickdraw_pathfinish|imagickdraw_pathlinetoabsolute|imagickdraw_pathlinetohorizontalabsolute|' +\n        'imagickdraw_pathlinetohorizontalrelative|imagickdraw_pathlinetorelative|imagickdraw_pathlinetoverticalabsolute|' +\n        'imagickdraw_pathlinetoverticalrelative|imagickdraw_pathmovetoabsolute|imagickdraw_pathmovetorelative|imagickdraw_pathstart|' +\n        'imagickdraw_point|imagickdraw_polygon|imagickdraw_polyline|imagickdraw_pop|imagickdraw_popclippath|imagickdraw_popdefs|' +\n        'imagickdraw_poppattern|imagickdraw_push|imagickdraw_pushclippath|imagickdraw_pushdefs|imagickdraw_pushpattern|imagickdraw_rectangle|' +\n        'imagickdraw_render|imagickdraw_rotate|imagickdraw_roundrectangle|imagickdraw_scale|imagickdraw_setclippath|imagickdraw_setcliprule|' +\n        'imagickdraw_setclipunits|imagickdraw_setfillalpha|imagickdraw_setfillcolor|imagickdraw_setfillopacity|imagickdraw_setfillpatternurl|' +\n        'imagickdraw_setfillrule|imagickdraw_setfont|imagickdraw_setfontfamily|imagickdraw_setfontsize|imagickdraw_setfontstretch|' +\n        'imagickdraw_setfontstyle|imagickdraw_setfontweight|imagickdraw_setgravity|imagickdraw_setstrokealpha|imagickdraw_setstrokeantialias|' +\n        'imagickdraw_setstrokecolor|imagickdraw_setstrokedasharray|imagickdraw_setstrokedashoffset|imagickdraw_setstrokelinecap|' +\n        'imagickdraw_setstrokelinejoin|imagickdraw_setstrokemiterlimit|imagickdraw_setstrokeopacity|imagickdraw_setstrokepatternurl|' +\n        'imagickdraw_setstrokewidth|imagickdraw_settextalignment|imagickdraw_settextantialias|imagickdraw_settextdecoration|' +\n        'imagickdraw_settextencoding|imagickdraw_settextundercolor|imagickdraw_setvectorgraphics|imagickdraw_setviewbox|imagickdraw_skewx|' +\n        'imagickdraw_skewy|imagickdraw_translate|imagickpixel|imagickpixel_clear|imagickpixel_construct|imagickpixel_destroy|imagickpixel_getcolor|' +\n        'imagickpixel_getcolorasstring|imagickpixel_getcolorcount|imagickpixel_getcolorvalue|imagickpixel_gethsl|imagickpixel_issimilar|' +\n        'imagickpixel_setcolor|imagickpixel_setcolorvalue|imagickpixel_sethsl|imagickpixeliterator|imagickpixeliterator_clear|' +\n        'imagickpixeliterator_construct|imagickpixeliterator_destroy|imagickpixeliterator_getcurrentiteratorrow|' +\n        'imagickpixeliterator_getiteratorrow|imagickpixeliterator_getnextiteratorrow|imagickpixeliterator_getpreviousiteratorrow|' +\n        'imagickpixeliterator_newpixeliterator|imagickpixeliterator_newpixelregioniterator|imagickpixeliterator_resetiterator|' +\n        'imagickpixeliterator_setiteratorfirstrow|imagickpixeliterator_setiteratorlastrow|imagickpixeliterator_setiteratorrow|' +\n        'imagickpixeliterator_synciterator|imap_8bit|imap_alerts|imap_append|imap_base64|imap_binary|imap_body|imap_bodystruct|imap_check|' +\n        'imap_clearflag_full|imap_close|imap_create|imap_createmailbox|imap_delete|imap_deletemailbox|imap_errors|imap_expunge|imap_fetch_overview|' +\n        'imap_fetchbody|imap_fetchheader|imap_fetchmime|imap_fetchstructure|imap_fetchtext|imap_gc|imap_get_quota|imap_get_quotaroot|imap_getacl|' +\n        'imap_getmailboxes|imap_getsubscribed|imap_header|imap_headerinfo|imap_headers|imap_last_error|imap_list|imap_listmailbox|imap_listscan|' +\n        'imap_listsubscribed|imap_lsub|imap_mail|imap_mail_compose|imap_mail_copy|imap_mail_move|imap_mailboxmsginfo|imap_mime_header_decode|' +\n        'imap_msgno|imap_num_msg|imap_num_recent|imap_open|imap_ping|imap_qprint|imap_rename|imap_renamemailbox|imap_reopen|' +\n        'imap_rfc822_parse_adrlist|imap_rfc822_parse_headers|imap_rfc822_write_address|imap_savebody|imap_scan|imap_scanmailbox|imap_search|' +\n        'imap_set_quota|imap_setacl|imap_setflag_full|imap_sort|imap_status|imap_subscribe|imap_thread|imap_timeout|imap_uid|imap_undelete|' +\n        'imap_unsubscribe|imap_utf7_decode|imap_utf7_encode|imap_utf8|implementsinterface|implode|import_request_variables|in_array|include|' +\n        'include_once|inclued_get_data|inet_ntop|inet_pton|infiniteiterator|ingres_autocommit|ingres_autocommit_state|ingres_charset|ingres_close|' +\n        'ingres_commit|ingres_connect|ingres_cursor|ingres_errno|ingres_error|ingres_errsqlstate|ingres_escape_string|ingres_execute|' +\n        'ingres_fetch_array|ingres_fetch_assoc|ingres_fetch_object|ingres_fetch_proc_return|ingres_fetch_row|ingres_field_length|ingres_field_name|' +\n        'ingres_field_nullable|ingres_field_precision|ingres_field_scale|ingres_field_type|ingres_free_result|ingres_next_error|ingres_num_fields|' +\n        'ingres_num_rows|ingres_pconnect|ingres_prepare|ingres_query|ingres_result_seek|ingres_rollback|ingres_set_environment|' +\n        'ingres_unbuffered_query|ini_alter|ini_get|ini_get_all|ini_restore|ini_set|innamespace|inotify_add_watch|inotify_init|inotify_queue_len|' +\n        'inotify_read|inotify_rm_watch|interface_exists|intl_error_name|intl_get_error_code|intl_get_error_message|intl_is_failure|' +\n        'intldateformatter|intval|invalidargumentexception|invoke|invokeargs|ip2long|iptcembed|iptcparse|is_a|is_array|is_bool|is_callable|is_dir|' +\n        'is_double|is_executable|is_file|is_finite|is_float|is_infinite|is_int|is_integer|is_link|is_long|is_nan|is_null|is_numeric|is_object|' +\n        'is_readable|is_real|is_resource|is_scalar|is_soap_fault|is_string|is_subclass_of|is_uploaded_file|is_writable|is_writeable|isabstract|' +\n        'iscloneable|isdisabled|isfinal|isinstance|isinstantiable|isinterface|isinternal|isiterateable|isset|issubclassof|isuserdefined|iterator|' +\n        'iterator_apply|iterator_count|iterator_to_array|iteratoraggregate|iteratoriterator|java_last_exception_clear|java_last_exception_get|' +\n        'jddayofweek|jdmonthname|jdtofrench|jdtogregorian|jdtojewish|jdtojulian|jdtounix|jewishtojd|join|jpeg2wbmp|json_decode|json_encode|' +\n        'json_last_error|jsonserializable|judy|judy_type|judy_version|juliantojd|kadm5_chpass_principal|kadm5_create_principal|' +\n        'kadm5_delete_principal|kadm5_destroy|kadm5_flush|kadm5_get_policies|kadm5_get_principal|kadm5_get_principals|kadm5_init_with_password|' +\n        'kadm5_modify_principal|key|krsort|ksort|lcfirst|lcg_value|lchgrp|lchown|ldap_8859_to_t61|ldap_add|ldap_bind|ldap_close|ldap_compare|' +\n        'ldap_connect|ldap_count_entries|ldap_delete|ldap_dn2ufn|ldap_err2str|ldap_errno|ldap_error|ldap_explode_dn|ldap_first_attribute|' +\n        'ldap_first_entry|ldap_first_reference|ldap_free_result|ldap_get_attributes|ldap_get_dn|ldap_get_entries|ldap_get_option|ldap_get_values|' +\n        'ldap_get_values_len|ldap_list|ldap_mod_add|ldap_mod_del|ldap_mod_replace|ldap_modify|ldap_next_attribute|ldap_next_entry|' +\n        'ldap_next_reference|ldap_parse_reference|ldap_parse_result|ldap_read|ldap_rename|ldap_sasl_bind|ldap_search|ldap_set_option|' +\n        'ldap_set_rebind_proc|ldap_sort|ldap_start_tls|ldap_t61_to_8859|ldap_unbind|lengthexception|levenshtein|libxml_clear_errors|' +\n        'libxml_disable_entity_loader|libxml_get_errors|libxml_get_last_error|libxml_set_streams_context|libxml_use_internal_errors|libxmlerror|' +\n        'limititerator|link|linkinfo|list|locale|localeconv|localtime|log|log10|log1p|logicexception|long2ip|lstat|ltrim|lzf_compress|' +\n        'lzf_decompress|lzf_optimized_for|m_checkstatus|m_completeauthorizations|m_connect|m_connectionerror|m_deletetrans|m_destroyconn|' +\n        'm_destroyengine|m_getcell|m_getcellbynum|m_getcommadelimited|m_getheader|m_initconn|m_initengine|m_iscommadelimited|m_maxconntimeout|' +\n        'm_monitor|m_numcolumns|m_numrows|m_parsecommadelimited|m_responsekeys|m_responseparam|m_returnstatus|m_setblocking|m_setdropfile|m_setip|' +\n        'm_setssl|m_setssl_cafile|m_setssl_files|m_settimeout|m_sslcert_gen_hash|m_transactionssent|m_transinqueue|m_transkeyval|m_transnew|' +\n        'm_transsend|m_uwait|m_validateidentifier|m_verifyconnection|m_verifysslcert|magic_quotes_runtime|mail|' +\n        'mailparse_determine_best_xfer_encoding|mailparse_msg_create|mailparse_msg_extract_part|mailparse_msg_extract_part_file|' +\n        'mailparse_msg_extract_whole_part_file|mailparse_msg_free|mailparse_msg_get_part|mailparse_msg_get_part_data|mailparse_msg_get_structure|' +\n        'mailparse_msg_parse|mailparse_msg_parse_file|mailparse_rfc822_parse_addresses|mailparse_stream_encode|mailparse_uudecode_all|main|max|' +\n        'maxdb_affected_rows|maxdb_autocommit|maxdb_bind_param|maxdb_bind_result|maxdb_change_user|maxdb_character_set_name|maxdb_client_encoding|' +\n        'maxdb_close|maxdb_close_long_data|maxdb_commit|maxdb_connect|maxdb_connect_errno|maxdb_connect_error|maxdb_data_seek|maxdb_debug|' +\n        'maxdb_disable_reads_from_master|maxdb_disable_rpl_parse|maxdb_dump_debug_info|maxdb_embedded_connect|maxdb_enable_reads_from_master|' +\n        'maxdb_enable_rpl_parse|maxdb_errno|maxdb_error|maxdb_escape_string|maxdb_execute|maxdb_fetch|maxdb_fetch_array|maxdb_fetch_assoc|' +\n        'maxdb_fetch_field|maxdb_fetch_field_direct|maxdb_fetch_fields|maxdb_fetch_lengths|maxdb_fetch_object|maxdb_fetch_row|maxdb_field_count|' +\n        'maxdb_field_seek|maxdb_field_tell|maxdb_free_result|maxdb_get_client_info|maxdb_get_client_version|maxdb_get_host_info|maxdb_get_metadata|' +\n        'maxdb_get_proto_info|maxdb_get_server_info|maxdb_get_server_version|maxdb_info|maxdb_init|maxdb_insert_id|maxdb_kill|maxdb_master_query|' +\n        'maxdb_more_results|maxdb_multi_query|maxdb_next_result|maxdb_num_fields|maxdb_num_rows|maxdb_options|maxdb_param_count|maxdb_ping|' +\n        'maxdb_prepare|maxdb_query|maxdb_real_connect|maxdb_real_escape_string|maxdb_real_query|maxdb_report|maxdb_rollback|' +\n        'maxdb_rpl_parse_enabled|maxdb_rpl_probe|maxdb_rpl_query_type|maxdb_select_db|maxdb_send_long_data|maxdb_send_query|maxdb_server_end|' +\n        'maxdb_server_init|maxdb_set_opt|maxdb_sqlstate|maxdb_ssl_set|maxdb_stat|maxdb_stmt_affected_rows|maxdb_stmt_bind_param|' +\n        'maxdb_stmt_bind_result|maxdb_stmt_close|maxdb_stmt_close_long_data|maxdb_stmt_data_seek|maxdb_stmt_errno|maxdb_stmt_error|' +\n        'maxdb_stmt_execute|maxdb_stmt_fetch|maxdb_stmt_free_result|maxdb_stmt_init|maxdb_stmt_num_rows|maxdb_stmt_param_count|maxdb_stmt_prepare|' +\n        'maxdb_stmt_reset|maxdb_stmt_result_metadata|maxdb_stmt_send_long_data|maxdb_stmt_sqlstate|maxdb_stmt_store_result|maxdb_store_result|' +\n        'maxdb_thread_id|maxdb_thread_safe|maxdb_use_result|maxdb_warning_count|mb_check_encoding|mb_convert_case|mb_convert_encoding|' +\n        'mb_convert_kana|mb_convert_variables|mb_decode_mimeheader|mb_decode_numericentity|mb_detect_encoding|mb_detect_order|mb_encode_mimeheader|' +\n        'mb_encode_numericentity|mb_encoding_aliases|mb_ereg|mb_ereg_match|mb_ereg_replace|mb_ereg_search|mb_ereg_search_getpos|' +\n        'mb_ereg_search_getregs|mb_ereg_search_init|mb_ereg_search_pos|mb_ereg_search_regs|mb_ereg_search_setpos|mb_eregi|mb_eregi_replace|' +\n        'mb_get_info|mb_http_input|mb_http_output|mb_internal_encoding|mb_language|mb_list_encodings|mb_output_handler|mb_parse_str|' +\n        'mb_preferred_mime_name|mb_regex_encoding|mb_regex_set_options|mb_send_mail|mb_split|mb_strcut|mb_strimwidth|mb_stripos|mb_stristr|' +\n        'mb_strlen|mb_strpos|mb_strrchr|mb_strrichr|mb_strripos|mb_strrpos|mb_strstr|mb_strtolower|mb_strtoupper|mb_strwidth|' +\n        'mb_substitute_character|mb_substr|mb_substr_count|mcrypt_cbc|mcrypt_cfb|mcrypt_create_iv|mcrypt_decrypt|mcrypt_ecb|' +\n        'mcrypt_enc_get_algorithms_name|mcrypt_enc_get_block_size|mcrypt_enc_get_iv_size|mcrypt_enc_get_key_size|mcrypt_enc_get_modes_name|' +\n        'mcrypt_enc_get_supported_key_sizes|mcrypt_enc_is_block_algorithm|mcrypt_enc_is_block_algorithm_mode|mcrypt_enc_is_block_mode|' +\n        'mcrypt_enc_self_test|mcrypt_encrypt|mcrypt_generic|mcrypt_generic_deinit|mcrypt_generic_end|mcrypt_generic_init|mcrypt_get_block_size|' +\n        'mcrypt_get_cipher_name|mcrypt_get_iv_size|mcrypt_get_key_size|mcrypt_list_algorithms|mcrypt_list_modes|mcrypt_module_close|' +\n        'mcrypt_module_get_algo_block_size|mcrypt_module_get_algo_key_size|mcrypt_module_get_supported_key_sizes|mcrypt_module_is_block_algorithm|' +\n        'mcrypt_module_is_block_algorithm_mode|mcrypt_module_is_block_mode|mcrypt_module_open|mcrypt_module_self_test|mcrypt_ofb|md5|md5_file|' +\n        'mdecrypt_generic|memcache|memcache_debug|memcached|memory_get_peak_usage|memory_get_usage|messageformatter|metaphone|method_exists|mhash|' +\n        'mhash_count|mhash_get_block_size|mhash_get_hash_name|mhash_keygen_s2k|microtime|mime_content_type|min|ming_keypress|' +\n        'ming_setcubicthreshold|ming_setscale|ming_setswfcompression|ming_useconstants|ming_useswfversion|mkdir|mktime|money_format|mongo|' +\n        'mongobindata|mongocode|mongocollection|mongoconnectionexception|mongocursor|mongocursorexception|mongocursortimeoutexception|mongodate|' +\n        'mongodb|mongodbref|mongoexception|mongogridfs|mongogridfscursor|mongogridfsexception|mongogridfsfile|mongoid|mongoint32|mongoint64|' +\n        'mongomaxkey|mongominkey|mongoregex|mongotimestamp|move_uploaded_file|mpegfile|mqseries_back|mqseries_begin|mqseries_close|mqseries_cmit|' +\n        'mqseries_conn|mqseries_connx|mqseries_disc|mqseries_get|mqseries_inq|mqseries_open|mqseries_put|mqseries_put1|mqseries_set|' +\n        'mqseries_strerror|msession_connect|msession_count|msession_create|msession_destroy|msession_disconnect|msession_find|msession_get|' +\n        'msession_get_array|msession_get_data|msession_inc|msession_list|msession_listvar|msession_lock|msession_plugin|msession_randstr|' +\n        'msession_set|msession_set_array|msession_set_data|msession_timeout|msession_uniq|msession_unlock|msg_get_queue|msg_queue_exists|' +\n        'msg_receive|msg_remove_queue|msg_send|msg_set_queue|msg_stat_queue|msql|msql_affected_rows|msql_close|msql_connect|msql_create_db|' +\n        'msql_createdb|msql_data_seek|msql_db_query|msql_dbname|msql_drop_db|msql_error|msql_fetch_array|msql_fetch_field|msql_fetch_object|' +\n        'msql_fetch_row|msql_field_flags|msql_field_len|msql_field_name|msql_field_seek|msql_field_table|msql_field_type|msql_fieldflags|' +\n        'msql_fieldlen|msql_fieldname|msql_fieldtable|msql_fieldtype|msql_free_result|msql_list_dbs|msql_list_fields|msql_list_tables|' +\n        'msql_num_fields|msql_num_rows|msql_numfields|msql_numrows|msql_pconnect|msql_query|msql_regcase|msql_result|msql_select_db|msql_tablename|' +\n        'mssql_bind|mssql_close|mssql_connect|mssql_data_seek|mssql_execute|mssql_fetch_array|mssql_fetch_assoc|mssql_fetch_batch|' +\n        'mssql_fetch_field|mssql_fetch_object|mssql_fetch_row|mssql_field_length|mssql_field_name|mssql_field_seek|mssql_field_type|' +\n        'mssql_free_result|mssql_free_statement|mssql_get_last_message|mssql_guid_string|mssql_init|mssql_min_error_severity|' +\n        'mssql_min_message_severity|mssql_next_result|mssql_num_fields|mssql_num_rows|mssql_pconnect|mssql_query|mssql_result|mssql_rows_affected|' +\n        'mssql_select_db|mt_getrandmax|mt_rand|mt_srand|multipleiterator|mysql_affected_rows|mysql_client_encoding|mysql_close|mysql_connect|' +\n        'mysql_create_db|mysql_data_seek|mysql_db_name|mysql_db_query|mysql_drop_db|mysql_errno|mysql_error|mysql_escape_string|mysql_fetch_array|' +\n        'mysql_fetch_assoc|mysql_fetch_field|mysql_fetch_lengths|mysql_fetch_object|mysql_fetch_row|mysql_field_flags|mysql_field_len|' +\n        'mysql_field_name|mysql_field_seek|mysql_field_table|mysql_field_type|mysql_free_result|mysql_get_client_info|mysql_get_host_info|' +\n        'mysql_get_proto_info|mysql_get_server_info|mysql_info|mysql_insert_id|mysql_list_dbs|mysql_list_fields|mysql_list_processes|' +\n        'mysql_list_tables|mysql_num_fields|mysql_num_rows|mysql_pconnect|mysql_ping|mysql_query|mysql_real_escape_string|mysql_result|' +\n        'mysql_select_db|mysql_set_charset|mysql_stat|mysql_tablename|mysql_thread_id|mysql_unbuffered_query|mysqli|mysqli_bind_param|' +\n        'mysqli_bind_result|mysqli_client_encoding|mysqli_connect|mysqli_disable_reads_from_master|mysqli_disable_rpl_parse|mysqli_driver|' +\n        'mysqli_enable_reads_from_master|mysqli_enable_rpl_parse|mysqli_escape_string|mysqli_execute|mysqli_fetch|mysqli_get_metadata|' +\n        'mysqli_master_query|mysqli_param_count|mysqli_report|mysqli_result|mysqli_rpl_parse_enabled|mysqli_rpl_probe|mysqli_rpl_query_type|' +\n        'mysqli_send_long_data|mysqli_send_query|mysqli_set_opt|mysqli_slave_query|mysqli_stmt|mysqli_warning|mysqlnd_ms_get_stats|' +\n        'mysqlnd_ms_query_is_select|mysqlnd_ms_set_user_pick_server|mysqlnd_qc_change_handler|mysqlnd_qc_clear_cache|mysqlnd_qc_get_cache_info|' +\n        'mysqlnd_qc_get_core_stats|mysqlnd_qc_get_handler|mysqlnd_qc_get_query_trace_log|mysqlnd_qc_set_user_handlers|natcasesort|natsort|' +\n        'ncurses_addch|ncurses_addchnstr|ncurses_addchstr|ncurses_addnstr|ncurses_addstr|ncurses_assume_default_colors|ncurses_attroff|' +\n        'ncurses_attron|ncurses_attrset|ncurses_baudrate|ncurses_beep|ncurses_bkgd|ncurses_bkgdset|ncurses_border|ncurses_bottom_panel|' +\n        'ncurses_can_change_color|ncurses_cbreak|ncurses_clear|ncurses_clrtobot|ncurses_clrtoeol|ncurses_color_content|ncurses_color_set|' +\n        'ncurses_curs_set|ncurses_def_prog_mode|ncurses_def_shell_mode|ncurses_define_key|ncurses_del_panel|ncurses_delay_output|ncurses_delch|' +\n        'ncurses_deleteln|ncurses_delwin|ncurses_doupdate|ncurses_echo|ncurses_echochar|ncurses_end|ncurses_erase|ncurses_erasechar|ncurses_filter|' +\n        'ncurses_flash|ncurses_flushinp|ncurses_getch|ncurses_getmaxyx|ncurses_getmouse|ncurses_getyx|ncurses_halfdelay|ncurses_has_colors|' +\n        'ncurses_has_ic|ncurses_has_il|ncurses_has_key|ncurses_hide_panel|ncurses_hline|ncurses_inch|ncurses_init|ncurses_init_color|' +\n        'ncurses_init_pair|ncurses_insch|ncurses_insdelln|ncurses_insertln|ncurses_insstr|ncurses_instr|ncurses_isendwin|ncurses_keyok|' +\n        'ncurses_keypad|ncurses_killchar|ncurses_longname|ncurses_meta|ncurses_mouse_trafo|ncurses_mouseinterval|ncurses_mousemask|ncurses_move|' +\n        'ncurses_move_panel|ncurses_mvaddch|ncurses_mvaddchnstr|ncurses_mvaddchstr|ncurses_mvaddnstr|ncurses_mvaddstr|ncurses_mvcur|' +\n        'ncurses_mvdelch|ncurses_mvgetch|ncurses_mvhline|ncurses_mvinch|ncurses_mvvline|ncurses_mvwaddstr|ncurses_napms|ncurses_new_panel|' +\n        'ncurses_newpad|ncurses_newwin|ncurses_nl|ncurses_nocbreak|ncurses_noecho|ncurses_nonl|ncurses_noqiflush|ncurses_noraw|' +\n        'ncurses_pair_content|ncurses_panel_above|ncurses_panel_below|ncurses_panel_window|ncurses_pnoutrefresh|ncurses_prefresh|ncurses_putp|' +\n        'ncurses_qiflush|ncurses_raw|ncurses_refresh|ncurses_replace_panel|ncurses_reset_prog_mode|ncurses_reset_shell_mode|ncurses_resetty|' +\n        'ncurses_savetty|ncurses_scr_dump|ncurses_scr_init|ncurses_scr_restore|ncurses_scr_set|ncurses_scrl|ncurses_show_panel|ncurses_slk_attr|' +\n        'ncurses_slk_attroff|ncurses_slk_attron|ncurses_slk_attrset|ncurses_slk_clear|ncurses_slk_color|ncurses_slk_init|ncurses_slk_noutrefresh|' +\n        'ncurses_slk_refresh|ncurses_slk_restore|ncurses_slk_set|ncurses_slk_touch|ncurses_standend|ncurses_standout|ncurses_start_color|' +\n        'ncurses_termattrs|ncurses_termname|ncurses_timeout|ncurses_top_panel|ncurses_typeahead|ncurses_ungetch|ncurses_ungetmouse|' +\n        'ncurses_update_panels|ncurses_use_default_colors|ncurses_use_env|ncurses_use_extended_names|ncurses_vidattr|ncurses_vline|ncurses_waddch|' +\n        'ncurses_waddstr|ncurses_wattroff|ncurses_wattron|ncurses_wattrset|ncurses_wborder|ncurses_wclear|ncurses_wcolor_set|ncurses_werase|' +\n        'ncurses_wgetch|ncurses_whline|ncurses_wmouse_trafo|ncurses_wmove|ncurses_wnoutrefresh|ncurses_wrefresh|ncurses_wstandend|' +\n        'ncurses_wstandout|ncurses_wvline|newinstance|newinstanceargs|newt_bell|newt_button|newt_button_bar|newt_centered_window|newt_checkbox|' +\n        'newt_checkbox_get_value|newt_checkbox_set_flags|newt_checkbox_set_value|newt_checkbox_tree|newt_checkbox_tree_add_item|' +\n        'newt_checkbox_tree_find_item|newt_checkbox_tree_get_current|newt_checkbox_tree_get_entry_value|newt_checkbox_tree_get_multi_selection|' +\n        'newt_checkbox_tree_get_selection|newt_checkbox_tree_multi|newt_checkbox_tree_set_current|newt_checkbox_tree_set_entry|' +\n        'newt_checkbox_tree_set_entry_value|newt_checkbox_tree_set_width|newt_clear_key_buffer|newt_cls|newt_compact_button|' +\n        'newt_component_add_callback|newt_component_takes_focus|newt_create_grid|newt_cursor_off|newt_cursor_on|newt_delay|newt_draw_form|' +\n        'newt_draw_root_text|newt_entry|newt_entry_get_value|newt_entry_set|newt_entry_set_filter|newt_entry_set_flags|newt_finished|newt_form|' +\n        'newt_form_add_component|newt_form_add_components|newt_form_add_hot_key|newt_form_destroy|newt_form_get_current|newt_form_run|' +\n        'newt_form_set_background|newt_form_set_height|newt_form_set_size|newt_form_set_timer|newt_form_set_width|newt_form_watch_fd|' +\n        'newt_get_screen_size|newt_grid_add_components_to_form|newt_grid_basic_window|newt_grid_free|newt_grid_get_size|newt_grid_h_close_stacked|' +\n        'newt_grid_h_stacked|newt_grid_place|newt_grid_set_field|newt_grid_simple_window|newt_grid_v_close_stacked|newt_grid_v_stacked|' +\n        'newt_grid_wrapped_window|newt_grid_wrapped_window_at|newt_init|newt_label|newt_label_set_text|newt_listbox|newt_listbox_append_entry|' +\n        'newt_listbox_clear|newt_listbox_clear_selection|newt_listbox_delete_entry|newt_listbox_get_current|newt_listbox_get_selection|' +\n        'newt_listbox_insert_entry|newt_listbox_item_count|newt_listbox_select_item|newt_listbox_set_current|newt_listbox_set_current_by_key|' +\n        'newt_listbox_set_data|newt_listbox_set_entry|newt_listbox_set_width|newt_listitem|newt_listitem_get_data|newt_listitem_set|' +\n        'newt_open_window|newt_pop_help_line|newt_pop_window|newt_push_help_line|newt_radio_get_current|newt_radiobutton|newt_redraw_help_line|' +\n        'newt_reflow_text|newt_refresh|newt_resize_screen|newt_resume|newt_run_form|newt_scale|newt_scale_set|newt_scrollbar_set|' +\n        'newt_set_help_callback|newt_set_suspend_callback|newt_suspend|newt_textbox|newt_textbox_get_num_lines|newt_textbox_reflowed|' +\n        'newt_textbox_set_height|newt_textbox_set_text|newt_vertical_scrollbar|newt_wait_for_key|newt_win_choice|newt_win_entries|newt_win_menu|' +\n        'newt_win_message|newt_win_messagev|newt_win_ternary|next|ngettext|nl2br|nl_langinfo|norewinditerator|normalizer|notes_body|notes_copy_db|' +\n        'notes_create_db|notes_create_note|notes_drop_db|notes_find_note|notes_header_info|notes_list_msgs|notes_mark_read|notes_mark_unread|' +\n        'notes_nav_create|notes_search|notes_unread|notes_version|nsapi_request_headers|nsapi_response_headers|nsapi_virtual|nthmac|number_format|' +\n        'numberformatter|oauth|oauth_get_sbs|oauth_urlencode|oauthexception|oauthprovider|ob_clean|ob_deflatehandler|ob_end_clean|ob_end_flush|' +\n        'ob_etaghandler|ob_flush|ob_get_clean|ob_get_contents|ob_get_flush|ob_get_length|ob_get_level|ob_get_status|ob_gzhandler|ob_iconv_handler|' +\n        'ob_implicit_flush|ob_inflatehandler|ob_list_handlers|ob_start|ob_tidyhandler|oci_bind_array_by_name|oci_bind_by_name|oci_cancel|' +\n        'oci_client_version|oci_close|oci_collection_append|oci_collection_assign|oci_collection_element_assign|oci_collection_element_get|' +\n        'oci_collection_free|oci_collection_max|oci_collection_size|oci_collection_trim|oci_commit|oci_connect|oci_define_by_name|oci_error|' +\n        'oci_execute|oci_fetch|oci_fetch_all|oci_fetch_array|oci_fetch_assoc|oci_fetch_object|oci_fetch_row|oci_field_is_null|oci_field_name|' +\n        'oci_field_precision|oci_field_scale|oci_field_size|oci_field_type|oci_field_type_raw|oci_free_statement|oci_internal_debug|oci_lob_append|' +\n        'oci_lob_close|oci_lob_copy|oci_lob_eof|oci_lob_erase|oci_lob_export|oci_lob_flush|oci_lob_free|oci_lob_getbuffering|oci_lob_import|' +\n        'oci_lob_is_equal|oci_lob_load|oci_lob_read|oci_lob_rewind|oci_lob_save|oci_lob_savefile|oci_lob_seek|oci_lob_setbuffering|oci_lob_size|' +\n        'oci_lob_tell|oci_lob_truncate|oci_lob_write|oci_lob_writetemporary|oci_lob_writetofile|oci_new_collection|oci_new_connect|oci_new_cursor|' +\n        'oci_new_descriptor|oci_num_fields|oci_num_rows|oci_parse|oci_password_change|oci_pconnect|oci_result|oci_rollback|oci_server_version|' +\n        'oci_set_action|oci_set_client_identifier|oci_set_client_info|oci_set_edition|oci_set_module_name|oci_set_prefetch|oci_statement_type|' +\n        'ocibindbyname|ocicancel|ocicloselob|ocicollappend|ocicollassign|ocicollassignelem|ocicollgetelem|ocicollmax|ocicollsize|ocicolltrim|' +\n        'ocicolumnisnull|ocicolumnname|ocicolumnprecision|ocicolumnscale|ocicolumnsize|ocicolumntype|ocicolumntyperaw|ocicommit|ocidefinebyname|' +\n        'ocierror|ociexecute|ocifetch|ocifetchinto|ocifetchstatement|ocifreecollection|ocifreecursor|ocifreedesc|ocifreestatement|ociinternaldebug|' +\n        'ociloadlob|ocilogoff|ocilogon|ocinewcollection|ocinewcursor|ocinewdescriptor|ocinlogon|ocinumcols|ociparse|ociplogon|ociresult|' +\n        'ocirollback|ocirowcount|ocisavelob|ocisavelobfile|ociserverversion|ocisetprefetch|ocistatementtype|ociwritelobtofile|ociwritetemporarylob|' +\n        'octdec|odbc_autocommit|odbc_binmode|odbc_close|odbc_close_all|odbc_columnprivileges|odbc_columns|odbc_commit|odbc_connect|odbc_cursor|' +\n        'odbc_data_source|odbc_do|odbc_error|odbc_errormsg|odbc_exec|odbc_execute|odbc_fetch_array|odbc_fetch_into|odbc_fetch_object|' +\n        'odbc_fetch_row|odbc_field_len|odbc_field_name|odbc_field_num|odbc_field_precision|odbc_field_scale|odbc_field_type|odbc_foreignkeys|' +\n        'odbc_free_result|odbc_gettypeinfo|odbc_longreadlen|odbc_next_result|odbc_num_fields|odbc_num_rows|odbc_pconnect|odbc_prepare|' +\n        'odbc_primarykeys|odbc_procedurecolumns|odbc_procedures|odbc_result|odbc_result_all|odbc_rollback|odbc_setoption|odbc_specialcolumns|' +\n        'odbc_statistics|odbc_tableprivileges|odbc_tables|openal_buffer_create|openal_buffer_data|openal_buffer_destroy|openal_buffer_get|' +\n        'openal_buffer_loadwav|openal_context_create|openal_context_current|openal_context_destroy|openal_context_process|openal_context_suspend|' +\n        'openal_device_close|openal_device_open|openal_listener_get|openal_listener_set|openal_source_create|openal_source_destroy|' +\n        'openal_source_get|openal_source_pause|openal_source_play|openal_source_rewind|openal_source_set|openal_source_stop|openal_stream|opendir|' +\n        'openlog|openssl_cipher_iv_length|openssl_csr_export|openssl_csr_export_to_file|openssl_csr_get_public_key|openssl_csr_get_subject|' +\n        'openssl_csr_new|openssl_csr_sign|openssl_decrypt|openssl_dh_compute_key|openssl_digest|openssl_encrypt|openssl_error_string|' +\n        'openssl_free_key|openssl_get_cipher_methods|openssl_get_md_methods|openssl_get_privatekey|openssl_get_publickey|openssl_open|' +\n        'openssl_pkcs12_export|openssl_pkcs12_export_to_file|openssl_pkcs12_read|openssl_pkcs7_decrypt|openssl_pkcs7_encrypt|openssl_pkcs7_sign|' +\n        'openssl_pkcs7_verify|openssl_pkey_export|openssl_pkey_export_to_file|openssl_pkey_free|openssl_pkey_get_details|openssl_pkey_get_private|' +\n        'openssl_pkey_get_public|openssl_pkey_new|openssl_private_decrypt|openssl_private_encrypt|openssl_public_decrypt|openssl_public_encrypt|' +\n        'openssl_random_pseudo_bytes|openssl_seal|openssl_sign|openssl_verify|openssl_x509_check_private_key|openssl_x509_checkpurpose|' +\n        'openssl_x509_export|openssl_x509_export_to_file|openssl_x509_free|openssl_x509_parse|openssl_x509_read|ord|outeriterator|' +\n        'outofboundsexception|outofrangeexception|output_add_rewrite_var|output_reset_rewrite_vars|overflowexception|overload|override_function|' +\n        'ovrimos_close|ovrimos_commit|ovrimos_connect|ovrimos_cursor|ovrimos_exec|ovrimos_execute|ovrimos_fetch_into|ovrimos_fetch_row|' +\n        'ovrimos_field_len|ovrimos_field_name|ovrimos_field_num|ovrimos_field_type|ovrimos_free_result|ovrimos_longreadlen|ovrimos_num_fields|' +\n        'ovrimos_num_rows|ovrimos_prepare|ovrimos_result|ovrimos_result_all|ovrimos_rollback|pack|parentiterator|parse_ini_file|parse_ini_string|' +\n        'parse_str|parse_url|parsekit_compile_file|parsekit_compile_string|parsekit_func_arginfo|passthru|pathinfo|pclose|pcntl_alarm|pcntl_exec|' +\n        'pcntl_fork|pcntl_getpriority|pcntl_setpriority|pcntl_signal|pcntl_signal_dispatch|pcntl_sigprocmask|pcntl_sigtimedwait|pcntl_sigwaitinfo|' +\n        'pcntl_wait|pcntl_waitpid|pcntl_wexitstatus|pcntl_wifexited|pcntl_wifsignaled|pcntl_wifstopped|pcntl_wstopsig|pcntl_wtermsig|' +\n        'pdf_activate_item|pdf_add_annotation|pdf_add_bookmark|pdf_add_launchlink|pdf_add_locallink|pdf_add_nameddest|pdf_add_note|pdf_add_outline|' +\n        'pdf_add_pdflink|pdf_add_table_cell|pdf_add_textflow|pdf_add_thumbnail|pdf_add_weblink|pdf_arc|pdf_arcn|pdf_attach_file|pdf_begin_document|' +\n        'pdf_begin_font|pdf_begin_glyph|pdf_begin_item|pdf_begin_layer|pdf_begin_page|pdf_begin_page_ext|pdf_begin_pattern|pdf_begin_template|' +\n        'pdf_begin_template_ext|pdf_circle|pdf_clip|pdf_close|pdf_close_image|pdf_close_pdi|pdf_close_pdi_page|pdf_closepath|' +\n        'pdf_closepath_fill_stroke|pdf_closepath_stroke|pdf_concat|pdf_continue_text|pdf_create_3dview|pdf_create_action|pdf_create_annotation|' +\n        'pdf_create_bookmark|pdf_create_field|pdf_create_fieldgroup|pdf_create_gstate|pdf_create_pvf|pdf_create_textflow|pdf_curveto|' +\n        'pdf_define_layer|pdf_delete|pdf_delete_pvf|pdf_delete_table|pdf_delete_textflow|pdf_encoding_set_char|pdf_end_document|pdf_end_font|' +\n        'pdf_end_glyph|pdf_end_item|pdf_end_layer|pdf_end_page|pdf_end_page_ext|pdf_end_pattern|pdf_end_template|pdf_endpath|pdf_fill|' +\n        'pdf_fill_imageblock|pdf_fill_pdfblock|pdf_fill_stroke|pdf_fill_textblock|pdf_findfont|pdf_fit_image|pdf_fit_pdi_page|pdf_fit_table|' +\n        'pdf_fit_textflow|pdf_fit_textline|pdf_get_apiname|pdf_get_buffer|pdf_get_errmsg|pdf_get_errnum|pdf_get_font|pdf_get_fontname|' +\n        'pdf_get_fontsize|pdf_get_image_height|pdf_get_image_width|pdf_get_majorversion|pdf_get_minorversion|pdf_get_parameter|' +\n        'pdf_get_pdi_parameter|pdf_get_pdi_value|pdf_get_value|pdf_info_font|pdf_info_matchbox|pdf_info_table|pdf_info_textflow|pdf_info_textline|' +\n        'pdf_initgraphics|pdf_lineto|pdf_load_3ddata|pdf_load_font|pdf_load_iccprofile|pdf_load_image|pdf_makespotcolor|pdf_moveto|pdf_new|' +\n        'pdf_open_ccitt|pdf_open_file|pdf_open_gif|pdf_open_image|pdf_open_image_file|pdf_open_jpeg|pdf_open_memory_image|pdf_open_pdi|' +\n        'pdf_open_pdi_document|pdf_open_pdi_page|pdf_open_tiff|pdf_pcos_get_number|pdf_pcos_get_stream|pdf_pcos_get_string|pdf_place_image|' +\n        'pdf_place_pdi_page|pdf_process_pdi|pdf_rect|pdf_restore|pdf_resume_page|pdf_rotate|pdf_save|pdf_scale|pdf_set_border_color|' +\n        'pdf_set_border_dash|pdf_set_border_style|pdf_set_char_spacing|pdf_set_duration|pdf_set_gstate|pdf_set_horiz_scaling|pdf_set_info|' +\n        'pdf_set_info_author|pdf_set_info_creator|pdf_set_info_keywords|pdf_set_info_subject|pdf_set_info_title|pdf_set_layer_dependency|' +\n        'pdf_set_leading|pdf_set_parameter|pdf_set_text_matrix|pdf_set_text_pos|pdf_set_text_rendering|pdf_set_text_rise|pdf_set_value|' +\n        'pdf_set_word_spacing|pdf_setcolor|pdf_setdash|pdf_setdashpattern|pdf_setflat|pdf_setfont|pdf_setgray|pdf_setgray_fill|pdf_setgray_stroke|' +\n        'pdf_setlinecap|pdf_setlinejoin|pdf_setlinewidth|pdf_setmatrix|pdf_setmiterlimit|pdf_setpolydash|pdf_setrgbcolor|pdf_setrgbcolor_fill|' +\n        'pdf_setrgbcolor_stroke|pdf_shading|pdf_shading_pattern|pdf_shfill|pdf_show|pdf_show_boxed|pdf_show_xy|pdf_skew|pdf_stringwidth|pdf_stroke|' +\n        'pdf_suspend_page|pdf_translate|pdf_utf16_to_utf8|pdf_utf32_to_utf16|pdf_utf8_to_utf16|pdo|pdo_cubrid_schema|pdo_pgsqllobcreate|' +\n        'pdo_pgsqllobopen|pdo_pgsqllobunlink|pdo_sqlitecreateaggregate|pdo_sqlitecreatefunction|pdoexception|pdostatement|pfsockopen|' +\n        'pg_affected_rows|pg_cancel_query|pg_client_encoding|pg_close|pg_connect|pg_connection_busy|pg_connection_reset|pg_connection_status|' +\n        'pg_convert|pg_copy_from|pg_copy_to|pg_dbname|pg_delete|pg_end_copy|pg_escape_bytea|pg_escape_string|pg_execute|pg_fetch_all|' +\n        'pg_fetch_all_columns|pg_fetch_array|pg_fetch_assoc|pg_fetch_object|pg_fetch_result|pg_fetch_row|pg_field_is_null|pg_field_name|' +\n        'pg_field_num|pg_field_prtlen|pg_field_size|pg_field_table|pg_field_type|pg_field_type_oid|pg_free_result|pg_get_notify|pg_get_pid|' +\n        'pg_get_result|pg_host|pg_insert|pg_last_error|pg_last_notice|pg_last_oid|pg_lo_close|pg_lo_create|pg_lo_export|pg_lo_import|pg_lo_open|' +\n        'pg_lo_read|pg_lo_read_all|pg_lo_seek|pg_lo_tell|pg_lo_unlink|pg_lo_write|pg_meta_data|pg_num_fields|pg_num_rows|pg_options|' +\n        'pg_parameter_status|pg_pconnect|pg_ping|pg_port|pg_prepare|pg_put_line|pg_query|pg_query_params|pg_result_error|pg_result_error_field|' +\n        'pg_result_seek|pg_result_status|pg_select|pg_send_execute|pg_send_prepare|pg_send_query|pg_send_query_params|pg_set_client_encoding|' +\n        'pg_set_error_verbosity|pg_trace|pg_transaction_status|pg_tty|pg_unescape_bytea|pg_untrace|pg_update|pg_version|php_check_syntax|' +\n        'php_ini_loaded_file|php_ini_scanned_files|php_logo_guid|php_sapi_name|php_strip_whitespace|php_uname|phpcredits|phpinfo|phpversion|pi|' +\n        'png2wbmp|popen|pos|posix_access|posix_ctermid|posix_errno|posix_get_last_error|posix_getcwd|posix_getegid|posix_geteuid|posix_getgid|' +\n        'posix_getgrgid|posix_getgrnam|posix_getgroups|posix_getlogin|posix_getpgid|posix_getpgrp|posix_getpid|posix_getppid|posix_getpwnam|' +\n        'posix_getpwuid|posix_getrlimit|posix_getsid|posix_getuid|posix_initgroups|posix_isatty|posix_kill|posix_mkfifo|posix_mknod|posix_setegid|' +\n        'posix_seteuid|posix_setgid|posix_setpgid|posix_setsid|posix_setuid|posix_strerror|posix_times|posix_ttyname|posix_uname|pow|preg_filter|' +\n        'preg_grep|preg_last_error|preg_match|preg_match_all|preg_quote|preg_replace|preg_replace_callback|preg_split|prev|print|print_r|' +\n        'printer_abort|printer_close|printer_create_brush|printer_create_dc|printer_create_font|printer_create_pen|printer_delete_brush|' +\n        'printer_delete_dc|printer_delete_font|printer_delete_pen|printer_draw_bmp|printer_draw_chord|printer_draw_elipse|printer_draw_line|' +\n        'printer_draw_pie|printer_draw_rectangle|printer_draw_roundrect|printer_draw_text|printer_end_doc|printer_end_page|printer_get_option|' +\n        'printer_list|printer_logical_fontheight|printer_open|printer_select_brush|printer_select_font|printer_select_pen|printer_set_option|' +\n        'printer_start_doc|printer_start_page|printer_write|printf|proc_close|proc_get_status|proc_nice|proc_open|proc_terminate|property_exists|' +\n        'ps_add_bookmark|ps_add_launchlink|ps_add_locallink|ps_add_note|ps_add_pdflink|ps_add_weblink|ps_arc|ps_arcn|ps_begin_page|' +\n        'ps_begin_pattern|ps_begin_template|ps_circle|ps_clip|ps_close|ps_close_image|ps_closepath|ps_closepath_stroke|ps_continue_text|ps_curveto|' +\n        'ps_delete|ps_end_page|ps_end_pattern|ps_end_template|ps_fill|ps_fill_stroke|ps_findfont|ps_get_buffer|ps_get_parameter|ps_get_value|' +\n        'ps_hyphenate|ps_include_file|ps_lineto|ps_makespotcolor|ps_moveto|ps_new|ps_open_file|ps_open_image|ps_open_image_file|' +\n        'ps_open_memory_image|ps_place_image|ps_rect|ps_restore|ps_rotate|ps_save|ps_scale|ps_set_border_color|ps_set_border_dash|' +\n        'ps_set_border_style|ps_set_info|ps_set_parameter|ps_set_text_pos|ps_set_value|ps_setcolor|ps_setdash|ps_setflat|ps_setfont|ps_setgray|' +\n        'ps_setlinecap|ps_setlinejoin|ps_setlinewidth|ps_setmiterlimit|ps_setoverprintmode|ps_setpolydash|ps_shading|ps_shading_pattern|ps_shfill|' +\n        'ps_show|ps_show2|ps_show_boxed|ps_show_xy|ps_show_xy2|ps_string_geometry|ps_stringwidth|ps_stroke|ps_symbol|ps_symbol_name|' +\n        'ps_symbol_width|ps_translate|pspell_add_to_personal|pspell_add_to_session|pspell_check|pspell_clear_session|pspell_config_create|' +\n        'pspell_config_data_dir|pspell_config_dict_dir|pspell_config_ignore|pspell_config_mode|pspell_config_personal|pspell_config_repl|' +\n        'pspell_config_runtogether|pspell_config_save_repl|pspell_new|pspell_new_config|pspell_new_personal|pspell_save_wordlist|' +\n        'pspell_store_replacement|pspell_suggest|putenv|px_close|px_create_fp|px_date2string|px_delete|px_delete_record|px_get_field|px_get_info|' +\n        'px_get_parameter|px_get_record|px_get_schema|px_get_value|px_insert_record|px_new|px_numfields|px_numrecords|px_open_fp|px_put_record|' +\n        'px_retrieve_record|px_set_blob_file|px_set_parameter|px_set_tablename|px_set_targetencoding|px_set_value|px_timestamp2string|' +\n        'px_update_record|qdom_error|qdom_tree|quoted_printable_decode|quoted_printable_encode|quotemeta|rad2deg|radius_acct_open|' +\n        'radius_add_server|radius_auth_open|radius_close|radius_config|radius_create_request|radius_cvt_addr|radius_cvt_int|radius_cvt_string|' +\n        'radius_demangle|radius_demangle_mppe_key|radius_get_attr|radius_get_vendor_attr|radius_put_addr|radius_put_attr|radius_put_int|' +\n        'radius_put_string|radius_put_vendor_addr|radius_put_vendor_attr|radius_put_vendor_int|radius_put_vendor_string|' +\n        'radius_request_authenticator|radius_send_request|radius_server_secret|radius_strerror|rand|range|rangeexception|rar_wrapper_cache_stats|' +\n        'rararchive|rarentry|rarexception|rawurldecode|rawurlencode|read_exif_data|readdir|readfile|readgzfile|readline|readline_add_history|' +\n        'readline_callback_handler_install|readline_callback_handler_remove|readline_callback_read_char|readline_clear_history|' +\n        'readline_completion_function|readline_info|readline_list_history|readline_on_new_line|readline_read_history|readline_redisplay|' +\n        'readline_write_history|readlink|realpath|realpath_cache_get|realpath_cache_size|recode|recode_file|recode_string|recursivearrayiterator|' +\n        'recursivecachingiterator|recursivecallbackfilteriterator|recursivedirectoryiterator|recursivefilteriterator|recursiveiterator|' +\n        'recursiveiteratoriterator|recursiveregexiterator|recursivetreeiterator|reflection|reflectionclass|reflectionexception|reflectionextension|' +\n        'reflectionfunction|reflectionfunctionabstract|reflectionmethod|reflectionobject|reflectionparameter|reflectionproperty|reflector|' +\n        'regexiterator|register_shutdown_function|register_tick_function|rename|rename_function|require|require_once|reset|resetValue|' +\n        'resourcebundle|restore_error_handler|restore_exception_handler|restore_include_path|return|rewind|rewinddir|rmdir|round|rpm_close|' +\n        'rpm_get_tag|rpm_is_valid|rpm_open|rpm_version|rrd_create|rrd_error|rrd_fetch|rrd_first|rrd_graph|rrd_info|rrd_last|rrd_lastupdate|' +\n        'rrd_restore|rrd_tune|rrd_update|rrd_xport|rrdcreator|rrdgraph|rrdupdater|rsort|rtrim|runkit_class_adopt|runkit_class_emancipate|' +\n        'runkit_constant_add|runkit_constant_redefine|runkit_constant_remove|runkit_function_add|runkit_function_copy|runkit_function_redefine|' +\n        'runkit_function_remove|runkit_function_rename|runkit_import|runkit_lint|runkit_lint_file|runkit_method_add|runkit_method_copy|' +\n        'runkit_method_redefine|runkit_method_remove|runkit_method_rename|runkit_return_value_used|runkit_sandbox_output_handler|' +\n        'runkit_superglobals|runtimeexception|samconnection_commit|samconnection_connect|samconnection_constructor|samconnection_disconnect|' +\n        'samconnection_errno|samconnection_error|samconnection_isconnected|samconnection_peek|samconnection_peekall|samconnection_receive|' +\n        'samconnection_remove|samconnection_rollback|samconnection_send|samconnection_setDebug|samconnection_subscribe|samconnection_unsubscribe|' +\n        'sammessage_body|sammessage_constructor|sammessage_header|sca_createdataobject|sca_getservice|sca_localproxy_createdataobject|' +\n        'sca_soapproxy_createdataobject|scandir|sdo_das_changesummary_beginlogging|sdo_das_changesummary_endlogging|' +\n        'sdo_das_changesummary_getchangeddataobjects|sdo_das_changesummary_getchangetype|sdo_das_changesummary_getoldcontainer|' +\n        'sdo_das_changesummary_getoldvalues|sdo_das_changesummary_islogging|sdo_das_datafactory_addpropertytotype|sdo_das_datafactory_addtype|' +\n        'sdo_das_datafactory_getdatafactory|sdo_das_dataobject_getchangesummary|sdo_das_relational_applychanges|sdo_das_relational_construct|' +\n        'sdo_das_relational_createrootdataobject|sdo_das_relational_executepreparedquery|sdo_das_relational_executequery|' +\n        'sdo_das_setting_getlistindex|sdo_das_setting_getpropertyindex|sdo_das_setting_getpropertyname|sdo_das_setting_getvalue|' +\n        'sdo_das_setting_isset|sdo_das_xml_addtypes|sdo_das_xml_create|sdo_das_xml_createdataobject|sdo_das_xml_createdocument|' +\n        'sdo_das_xml_document_getrootdataobject|sdo_das_xml_document_getrootelementname|sdo_das_xml_document_getrootelementuri|' +\n        'sdo_das_xml_document_setencoding|sdo_das_xml_document_setxmldeclaration|sdo_das_xml_document_setxmlversion|sdo_das_xml_loadfile|' +\n        'sdo_das_xml_loadstring|sdo_das_xml_savefile|sdo_das_xml_savestring|sdo_datafactory_create|sdo_dataobject_clear|' +\n        'sdo_dataobject_createdataobject|sdo_dataobject_getcontainer|sdo_dataobject_getsequence|sdo_dataobject_gettypename|' +\n        'sdo_dataobject_gettypenamespaceuri|sdo_exception_getcause|sdo_list_insert|sdo_model_property_getcontainingtype|' +\n        'sdo_model_property_getdefault|sdo_model_property_getname|sdo_model_property_gettype|sdo_model_property_iscontainment|' +\n        'sdo_model_property_ismany|sdo_model_reflectiondataobject_construct|sdo_model_reflectiondataobject_export|' +\n        'sdo_model_reflectiondataobject_getcontainmentproperty|sdo_model_reflectiondataobject_getinstanceproperties|' +\n        'sdo_model_reflectiondataobject_gettype|sdo_model_type_getbasetype|sdo_model_type_getname|sdo_model_type_getnamespaceuri|' +\n        'sdo_model_type_getproperties|sdo_model_type_getproperty|sdo_model_type_isabstracttype|sdo_model_type_isdatatype|sdo_model_type_isinstance|' +\n        'sdo_model_type_isopentype|sdo_model_type_issequencedtype|sdo_sequence_getproperty|sdo_sequence_insert|sdo_sequence_move|seekableiterator|' +\n        'sem_acquire|sem_get|sem_release|sem_remove|serializable|serialize|session_cache_expire|session_cache_limiter|session_commit|' +\n        'session_decode|session_destroy|session_encode|session_get_cookie_params|session_id|session_is_registered|session_module_name|session_name|' +\n        'session_pgsql_add_error|session_pgsql_get_error|session_pgsql_get_field|session_pgsql_reset|session_pgsql_set_field|session_pgsql_status|' +\n        'session_regenerate_id|session_register|session_save_path|session_set_cookie_params|session_set_save_handler|session_start|' +\n        'session_unregister|session_unset|session_write_close|setCounterClass|set_error_handler|set_exception_handler|set_file_buffer|' +\n        'set_include_path|set_magic_quotes_runtime|set_socket_blocking|set_time_limit|setcookie|setlocale|setproctitle|setrawcookie|' +\n        'setstaticpropertyvalue|setthreadtitle|settype|sha1|sha1_file|shell_exec|shm_attach|shm_detach|shm_get_var|shm_has_var|shm_put_var|' +\n        'shm_remove|shm_remove_var|shmop_close|shmop_delete|shmop_open|shmop_read|shmop_size|shmop_write|show_source|shuffle|signeurlpaiement|' +\n        'similar_text|simplexml_import_dom|simplexml_load_file|simplexml_load_string|simplexmlelement|simplexmliterator|sin|sinh|sizeof|sleep|snmp|' +\n        'snmp2_get|snmp2_getnext|snmp2_real_walk|snmp2_set|snmp2_walk|snmp3_get|snmp3_getnext|snmp3_real_walk|snmp3_set|snmp3_walk|' +\n        'snmp_get_quick_print|snmp_get_valueretrieval|snmp_read_mib|snmp_set_enum_print|snmp_set_oid_numeric_print|snmp_set_oid_output_format|' +\n        'snmp_set_quick_print|snmp_set_valueretrieval|snmpget|snmpgetnext|snmprealwalk|snmpset|snmpwalk|snmpwalkoid|soapclient|soapfault|' +\n        'soapheader|soapparam|soapserver|soapvar|socket_accept|socket_bind|socket_clear_error|socket_close|socket_connect|socket_create|' +\n        'socket_create_listen|socket_create_pair|socket_get_option|socket_get_status|socket_getpeername|socket_getsockname|socket_last_error|' +\n        'socket_listen|socket_read|socket_recv|socket_recvfrom|socket_select|socket_send|socket_sendto|socket_set_block|socket_set_blocking|' +\n        'socket_set_nonblock|socket_set_option|socket_set_timeout|socket_shutdown|socket_strerror|socket_write|solr_get_version|solrclient|' +\n        'solrclientexception|solrdocument|solrdocumentfield|solrexception|solrgenericresponse|solrillegalargumentexception|' +\n        'solrillegaloperationexception|solrinputdocument|solrmodifiableparams|solrobject|solrparams|solrpingresponse|solrquery|solrqueryresponse|' +\n        'solrresponse|solrupdateresponse|solrutils|sort|soundex|sphinxclient|spl_autoload|spl_autoload_call|spl_autoload_extensions|' +\n        'spl_autoload_functions|spl_autoload_register|spl_autoload_unregister|spl_classes|spl_object_hash|splbool|spldoublylinkedlist|splenum|' +\n        'splfileinfo|splfileobject|splfixedarray|splfloat|splheap|splint|split|spliti|splmaxheap|splminheap|splobjectstorage|splobserver|' +\n        'splpriorityqueue|splqueue|splstack|splstring|splsubject|spltempfileobject|spoofchecker|sprintf|sql_regcase|sqlite3|sqlite3result|' +\n        'sqlite3stmt|sqlite_array_query|sqlite_busy_timeout|sqlite_changes|sqlite_close|sqlite_column|sqlite_create_aggregate|' +\n        'sqlite_create_function|sqlite_current|sqlite_error_string|sqlite_escape_string|sqlite_exec|sqlite_factory|sqlite_fetch_all|' +\n        'sqlite_fetch_array|sqlite_fetch_column_types|sqlite_fetch_object|sqlite_fetch_single|sqlite_fetch_string|sqlite_field_name|' +\n        'sqlite_has_more|sqlite_has_prev|sqlite_key|sqlite_last_error|sqlite_last_insert_rowid|sqlite_libencoding|sqlite_libversion|sqlite_next|' +\n        'sqlite_num_fields|sqlite_num_rows|sqlite_open|sqlite_popen|sqlite_prev|sqlite_query|sqlite_rewind|sqlite_seek|sqlite_single_query|' +\n        'sqlite_udf_decode_binary|sqlite_udf_encode_binary|sqlite_unbuffered_query|sqlite_valid|sqrt|srand|sscanf|ssdeep_fuzzy_compare|' +\n        'ssdeep_fuzzy_hash|ssdeep_fuzzy_hash_filename|ssh2_auth_hostbased_file|ssh2_auth_none|ssh2_auth_password|ssh2_auth_pubkey_file|' +\n        'ssh2_connect|ssh2_exec|ssh2_fetch_stream|ssh2_fingerprint|ssh2_methods_negotiated|ssh2_publickey_add|ssh2_publickey_init|' +\n        'ssh2_publickey_list|ssh2_publickey_remove|ssh2_scp_recv|ssh2_scp_send|ssh2_sftp|ssh2_sftp_lstat|ssh2_sftp_mkdir|ssh2_sftp_readlink|' +\n        'ssh2_sftp_realpath|ssh2_sftp_rename|ssh2_sftp_rmdir|ssh2_sftp_stat|ssh2_sftp_symlink|ssh2_sftp_unlink|ssh2_shell|ssh2_tunnel|stat|' +\n        'stats_absolute_deviation|stats_cdf_beta|stats_cdf_binomial|stats_cdf_cauchy|stats_cdf_chisquare|stats_cdf_exponential|stats_cdf_f|' +\n        'stats_cdf_gamma|stats_cdf_laplace|stats_cdf_logistic|stats_cdf_negative_binomial|stats_cdf_noncentral_chisquare|stats_cdf_noncentral_f|' +\n        'stats_cdf_poisson|stats_cdf_t|stats_cdf_uniform|stats_cdf_weibull|stats_covariance|stats_den_uniform|stats_dens_beta|stats_dens_cauchy|' +\n        'stats_dens_chisquare|stats_dens_exponential|stats_dens_f|stats_dens_gamma|stats_dens_laplace|stats_dens_logistic|' +\n        'stats_dens_negative_binomial|stats_dens_normal|stats_dens_pmf_binomial|stats_dens_pmf_hypergeometric|stats_dens_pmf_poisson|stats_dens_t|' +\n        'stats_dens_weibull|stats_harmonic_mean|stats_kurtosis|stats_rand_gen_beta|stats_rand_gen_chisquare|stats_rand_gen_exponential|' +\n        'stats_rand_gen_f|stats_rand_gen_funiform|stats_rand_gen_gamma|stats_rand_gen_ibinomial|stats_rand_gen_ibinomial_negative|' +\n        'stats_rand_gen_int|stats_rand_gen_ipoisson|stats_rand_gen_iuniform|stats_rand_gen_noncenral_chisquare|stats_rand_gen_noncentral_f|' +\n        'stats_rand_gen_noncentral_t|stats_rand_gen_normal|stats_rand_gen_t|stats_rand_get_seeds|stats_rand_phrase_to_seeds|stats_rand_ranf|' +\n        'stats_rand_setall|stats_skew|stats_standard_deviation|stats_stat_binomial_coef|stats_stat_correlation|stats_stat_gennch|' +\n        'stats_stat_independent_t|stats_stat_innerproduct|stats_stat_noncentral_t|stats_stat_paired_t|stats_stat_percentile|stats_stat_powersum|' +\n        'stats_variance|stomp|stomp_connect_error|stomp_version|stompexception|stompframe|str_getcsv|str_ireplace|str_pad|str_repeat|str_replace|' +\n        'str_rot13|str_shuffle|str_split|str_word_count|strcasecmp|strchr|strcmp|strcoll|strcspn|stream_bucket_append|stream_bucket_make_writeable|' +\n        'stream_bucket_new|stream_bucket_prepend|stream_context_create|stream_context_get_default|stream_context_get_options|' +\n        'stream_context_get_params|stream_context_set_default|stream_context_set_option|stream_context_set_params|stream_copy_to_stream|' +\n        'stream_encoding|stream_filter_append|stream_filter_prepend|stream_filter_register|stream_filter_remove|stream_get_contents|' +\n        'stream_get_filters|stream_get_line|stream_get_meta_data|stream_get_transports|stream_get_wrappers|stream_is_local|' +\n        'stream_notification_callback|stream_register_wrapper|stream_resolve_include_path|stream_select|stream_set_blocking|stream_set_read_buffer|' +\n        'stream_set_timeout|stream_set_write_buffer|stream_socket_accept|stream_socket_client|stream_socket_enable_crypto|stream_socket_get_name|' +\n        'stream_socket_pair|stream_socket_recvfrom|stream_socket_sendto|stream_socket_server|stream_socket_shutdown|stream_supports_lock|' +\n        'stream_wrapper_register|stream_wrapper_restore|stream_wrapper_unregister|streamwrapper|strftime|strip_tags|stripcslashes|stripos|' +\n        'stripslashes|stristr|strlen|strnatcasecmp|strnatcmp|strncasecmp|strncmp|strpbrk|strpos|strptime|strrchr|strrev|strripos|strrpos|strspn|' +\n        'strstr|strtok|strtolower|strtotime|strtoupper|strtr|strval|substr|substr_compare|substr_count|substr_replace|svm|svmmodel|svn_add|' +\n        'svn_auth_get_parameter|svn_auth_set_parameter|svn_blame|svn_cat|svn_checkout|svn_cleanup|svn_client_version|svn_commit|svn_delete|' +\n        'svn_diff|svn_export|svn_fs_abort_txn|svn_fs_apply_text|svn_fs_begin_txn2|svn_fs_change_node_prop|svn_fs_check_path|' +\n        'svn_fs_contents_changed|svn_fs_copy|svn_fs_delete|svn_fs_dir_entries|svn_fs_file_contents|svn_fs_file_length|svn_fs_is_dir|svn_fs_is_file|' +\n        'svn_fs_make_dir|svn_fs_make_file|svn_fs_node_created_rev|svn_fs_node_prop|svn_fs_props_changed|svn_fs_revision_prop|svn_fs_revision_root|' +\n        'svn_fs_txn_root|svn_fs_youngest_rev|svn_import|svn_log|svn_ls|svn_mkdir|svn_repos_create|svn_repos_fs|svn_repos_fs_begin_txn_for_commit|' +\n        'svn_repos_fs_commit_txn|svn_repos_hotcopy|svn_repos_open|svn_repos_recover|svn_revert|svn_status|svn_update|swf_actiongeturl|' +\n        'swf_actiongotoframe|swf_actiongotolabel|swf_actionnextframe|swf_actionplay|swf_actionprevframe|swf_actionsettarget|swf_actionstop|' +\n        'swf_actiontogglequality|swf_actionwaitforframe|swf_addbuttonrecord|swf_addcolor|swf_closefile|swf_definebitmap|swf_definefont|' +\n        'swf_defineline|swf_definepoly|swf_definerect|swf_definetext|swf_endbutton|swf_enddoaction|swf_endshape|swf_endsymbol|swf_fontsize|' +\n        'swf_fontslant|swf_fonttracking|swf_getbitmapinfo|swf_getfontinfo|swf_getframe|swf_labelframe|swf_lookat|swf_modifyobject|swf_mulcolor|' +\n        'swf_nextid|swf_oncondition|swf_openfile|swf_ortho|swf_ortho2|swf_perspective|swf_placeobject|swf_polarview|swf_popmatrix|swf_posround|' +\n        'swf_pushmatrix|swf_removeobject|swf_rotate|swf_scale|swf_setfont|swf_setframe|swf_shapearc|swf_shapecurveto|swf_shapecurveto3|' +\n        'swf_shapefillbitmapclip|swf_shapefillbitmaptile|swf_shapefilloff|swf_shapefillsolid|swf_shapelinesolid|swf_shapelineto|swf_shapemoveto|' +\n        'swf_showframe|swf_startbutton|swf_startdoaction|swf_startshape|swf_startsymbol|swf_textwidth|swf_translate|swf_viewport|swfaction|' +\n        'swfbitmap|swfbutton|swfdisplayitem|swffill|swffont|swffontchar|swfgradient|swfmorph|swfmovie|swfprebuiltclip|swfshape|swfsound|' +\n        'swfsoundinstance|swfsprite|swftext|swftextfield|swfvideostream|swish_construct|swish_getmetalist|swish_getpropertylist|swish_prepare|' +\n        'swish_query|swishresult_getmetalist|swishresult_stem|swishresults_getparsedwords|swishresults_getremovedstopwords|swishresults_nextresult|' +\n        'swishresults_seekresult|swishsearch_execute|swishsearch_resetlimit|swishsearch_setlimit|swishsearch_setphrasedelimiter|' +\n        'swishsearch_setsort|swishsearch_setstructure|sybase_affected_rows|sybase_close|sybase_connect|sybase_data_seek|' +\n        'sybase_deadlock_retry_count|sybase_fetch_array|sybase_fetch_assoc|sybase_fetch_field|sybase_fetch_object|sybase_fetch_row|' +\n        'sybase_field_seek|sybase_free_result|sybase_get_last_message|sybase_min_client_severity|sybase_min_error_severity|' +\n        'sybase_min_message_severity|sybase_min_server_severity|sybase_num_fields|sybase_num_rows|sybase_pconnect|sybase_query|sybase_result|' +\n        'sybase_select_db|sybase_set_message_handler|sybase_unbuffered_query|symlink|sys_get_temp_dir|sys_getloadavg|syslog|system|tag|tan|tanh|' +\n        'tcpwrap_check|tempnam|textdomain|tidy|tidy_access_count|tidy_config_count|tidy_diagnose|tidy_error_count|tidy_get_error_buffer|' +\n        'tidy_get_output|tidy_load_config|tidy_reset_config|tidy_save_config|tidy_set_encoding|tidy_setopt|tidy_warning_count|tidynode|time|' +\n        'time_nanosleep|time_sleep_until|timezone_abbreviations_list|timezone_identifiers_list|timezone_location_get|timezone_name_from_abbr|' +\n        'timezone_name_get|timezone_offset_get|timezone_open|timezone_transitions_get|timezone_version_get|tmpfile|token_get_all|token_name|' +\n        'tokyotyrant|tokyotyrantquery|tokyotyranttable|tostring|tostring|touch|transliterator|traversable|trigger_error|trim|uasort|ucfirst|' +\n        'ucwords|udm_add_search_limit|udm_alloc_agent|udm_alloc_agent_array|udm_api_version|udm_cat_list|udm_cat_path|udm_check_charset|' +\n        'udm_check_stored|udm_clear_search_limits|udm_close_stored|udm_crc32|udm_errno|udm_error|udm_find|udm_free_agent|udm_free_ispell_data|' +\n        'udm_free_res|udm_get_doc_count|udm_get_res_field|udm_get_res_param|udm_hash32|udm_load_ispell_data|udm_open_stored|udm_set_agent_param|' +\n        'uksort|umask|underflowexception|unexpectedvalueexception|uniqid|unixtojd|unlink|unpack|unregister_tick_function|unserialize|unset|' +\n        'urldecode|urlencode|use_soap_error_handler|user_error|usleep|usort|utf8_decode|utf8_encode|v8js|v8jsexception|var_dump|var_export|variant|' +\n        'variant_abs|variant_add|variant_and|variant_cast|variant_cat|variant_cmp|variant_date_from_timestamp|variant_date_to_timestamp|' +\n        'variant_div|variant_eqv|variant_fix|variant_get_type|variant_idiv|variant_imp|variant_int|variant_mod|variant_mul|variant_neg|variant_not|' +\n        'variant_or|variant_pow|variant_round|variant_set|variant_set_type|variant_sub|variant_xor|version_compare|vfprintf|virtual|' +\n        'vpopmail_add_alias_domain|vpopmail_add_alias_domain_ex|vpopmail_add_domain|vpopmail_add_domain_ex|vpopmail_add_user|vpopmail_alias_add|' +\n        'vpopmail_alias_del|vpopmail_alias_del_domain|vpopmail_alias_get|vpopmail_alias_get_all|vpopmail_auth_user|vpopmail_del_domain|' +\n        'vpopmail_del_domain_ex|vpopmail_del_user|vpopmail_error|vpopmail_passwd|vpopmail_set_user_quota|vprintf|vsprintf|w32api_deftype|' +\n        'w32api_init_dtype|w32api_invoke_function|w32api_register_function|w32api_set_call_method|wddx_add_vars|wddx_deserialize|wddx_packet_end|' +\n        'wddx_packet_start|wddx_serialize_value|wddx_serialize_vars|win32_continue_service|win32_create_service|win32_delete_service|' +\n        'win32_get_last_control_message|win32_pause_service|win32_ps_list_procs|win32_ps_stat_mem|win32_ps_stat_proc|win32_query_service_status|' +\n        'win32_set_service_status|win32_start_service|win32_start_service_ctrl_dispatcher|win32_stop_service|wincache_fcache_fileinfo|' +\n        'wincache_fcache_meminfo|wincache_lock|wincache_ocache_fileinfo|wincache_ocache_meminfo|wincache_refresh_if_changed|' +\n        'wincache_rplist_fileinfo|wincache_rplist_meminfo|wincache_scache_info|wincache_scache_meminfo|wincache_ucache_add|wincache_ucache_cas|' +\n        'wincache_ucache_clear|wincache_ucache_dec|wincache_ucache_delete|wincache_ucache_exists|wincache_ucache_get|wincache_ucache_inc|' +\n        'wincache_ucache_info|wincache_ucache_meminfo|wincache_ucache_set|wincache_unlock|wordwrap|xattr_get|xattr_list|xattr_remove|xattr_set|' +\n        'xattr_supported|xdiff_file_bdiff|xdiff_file_bdiff_size|xdiff_file_bpatch|xdiff_file_diff|xdiff_file_diff_binary|xdiff_file_merge3|' +\n        'xdiff_file_patch|xdiff_file_patch_binary|xdiff_file_rabdiff|xdiff_string_bdiff|xdiff_string_bdiff_size|xdiff_string_bpatch|' +\n        'xdiff_string_diff|xdiff_string_diff_binary|xdiff_string_merge3|xdiff_string_patch|xdiff_string_patch_binary|xdiff_string_rabdiff|' +\n        'xhprof_disable|xhprof_enable|xhprof_sample_disable|xhprof_sample_enable|xml_error_string|xml_get_current_byte_index|' +\n        'xml_get_current_column_number|xml_get_current_line_number|xml_get_error_code|xml_parse|xml_parse_into_struct|xml_parser_create|' +\n        'xml_parser_create_ns|xml_parser_free|xml_parser_get_option|xml_parser_set_option|xml_set_character_data_handler|xml_set_default_handler|' +\n        'xml_set_element_handler|xml_set_end_namespace_decl_handler|xml_set_external_entity_ref_handler|xml_set_notation_decl_handler|' +\n        'xml_set_object|xml_set_processing_instruction_handler|xml_set_start_namespace_decl_handler|xml_set_unparsed_entity_decl_handler|xmlreader|' +\n        'xmlrpc_decode|xmlrpc_decode_request|xmlrpc_encode|xmlrpc_encode_request|xmlrpc_get_type|xmlrpc_is_fault|xmlrpc_parse_method_descriptions|' +\n        'xmlrpc_server_add_introspection_data|xmlrpc_server_call_method|xmlrpc_server_create|xmlrpc_server_destroy|' +\n        'xmlrpc_server_register_introspection_callback|xmlrpc_server_register_method|xmlrpc_set_type|xmlwriter_end_attribute|xmlwriter_end_cdata|' +\n        'xmlwriter_end_comment|xmlwriter_end_document|xmlwriter_end_dtd|xmlwriter_end_dtd_attlist|xmlwriter_end_dtd_element|' +\n        'xmlwriter_end_dtd_entity|xmlwriter_end_element|xmlwriter_end_pi|xmlwriter_flush|xmlwriter_full_end_element|xmlwriter_open_memory|' +\n        'xmlwriter_open_uri|xmlwriter_output_memory|xmlwriter_set_indent|xmlwriter_set_indent_string|xmlwriter_start_attribute|' +\n        'xmlwriter_start_attribute_ns|xmlwriter_start_cdata|xmlwriter_start_comment|xmlwriter_start_document|xmlwriter_start_dtd|' +\n        'xmlwriter_start_dtd_attlist|xmlwriter_start_dtd_element|xmlwriter_start_dtd_entity|xmlwriter_start_element|xmlwriter_start_element_ns|' +\n        'xmlwriter_start_pi|xmlwriter_text|xmlwriter_write_attribute|xmlwriter_write_attribute_ns|xmlwriter_write_cdata|xmlwriter_write_comment|' +\n        'xmlwriter_write_dtd|xmlwriter_write_dtd_attlist|xmlwriter_write_dtd_element|xmlwriter_write_dtd_entity|xmlwriter_write_element|' +\n        'xmlwriter_write_element_ns|xmlwriter_write_pi|xmlwriter_write_raw|xpath_eval|xpath_eval_expression|xpath_new_context|xpath_register_ns|' +\n        'xpath_register_ns_auto|xptr_eval|xptr_new_context|xslt_backend_info|xslt_backend_name|xslt_backend_version|xslt_create|xslt_errno|' +\n        'xslt_error|xslt_free|xslt_getopt|xslt_process|xslt_set_base|xslt_set_encoding|xslt_set_error_handler|xslt_set_log|xslt_set_object|' +\n        'xslt_set_sax_handler|xslt_set_sax_handlers|xslt_set_scheme_handler|xslt_set_scheme_handlers|xslt_setopt|xsltprocessor|yaml_emit|' +\n        'yaml_emit_file|yaml_parse|yaml_parse_file|yaml_parse_url|yaz_addinfo|yaz_ccl_conf|yaz_ccl_parse|yaz_close|yaz_connect|yaz_database|' +\n        'yaz_element|yaz_errno|yaz_error|yaz_es|yaz_es_result|yaz_get_option|yaz_hits|yaz_itemorder|yaz_present|yaz_range|yaz_record|yaz_scan|' +\n        'yaz_scan_result|yaz_schema|yaz_search|yaz_set_option|yaz_sort|yaz_syntax|yaz_wait|yp_all|yp_cat|yp_err_string|yp_errno|yp_first|' +\n        'yp_get_default_domain|yp_master|yp_match|yp_next|yp_order|zend_logo_guid|zend_thread_id|zend_version|zip_close|zip_entry_close|' +\n        'zip_entry_compressedsize|zip_entry_compressionmethod|zip_entry_filesize|zip_entry_name|zip_entry_open|zip_entry_read|zip_open|zip_read|' +\n        'ziparchive|ziparchive_addemptydir|ziparchive_addfile|ziparchive_addfromstring|ziparchive_close|ziparchive_deleteindex|' +\n        'ziparchive_deletename|ziparchive_extractto|ziparchive_getarchivecomment|ziparchive_getcommentindex|ziparchive_getcommentname|' +\n        'ziparchive_getfromindex|ziparchive_getfromname|ziparchive_getnameindex|ziparchive_getstatusstring|ziparchive_getstream|' +\n        'ziparchive_locatename|ziparchive_open|ziparchive_renameindex|ziparchive_renamename|ziparchive_setCommentName|ziparchive_setarchivecomment|' +\n        'ziparchive_setcommentindex|ziparchive_statindex|ziparchive_statname|ziparchive_unchangeall|ziparchive_unchangearchive|' +\n        'ziparchive_unchangeindex|ziparchive_unchangename|zlib_get_coding_type').split('|')\n    );\n    var keywords = lang.arrayToMap(\n        ('abstract|and|array|as|break|case|catch|class|clone|const|continue|declare|default|do|else|elseif|enddeclare|endfor|endforeach|endif|' +\n        'endswitch|endwhile|extends|final|for|foreach|function|global|goto|if|implements|interface|instanceof|namespace|new|or|private|protected|' +\n        'public|static|switch|throw|try|use|var|while|xor').split('|')\n    );\n    var languageConstructs = lang.arrayToMap(\n        ('die|echo|empty|exit|eval|include|include_once|isset|list|require|require_once|return|print|unset').split('|')\n    );\n\n    var builtinConstants = lang.arrayToMap(\n        ('true|false|null|__CLASS__|__DIR__|__FILE__|__LINE__|__METHOD__|__FUNCTION__|__NAMESPACE__').split('|')\n    );\n\n    var builtinVariables = lang.arrayToMap(\n        ('$GLOBALS|$_SERVER|$_GET|$_POST|$_FILES|$_REQUEST|$_SESSION|$_ENV|$_COOKIE|$php_errormsg|$HTTP_RAW_POST_DATA|' +\n        '$http_response_header|$argc|$argv').split('|')\n    );\n    var builtinFunctionsDeprecated = lang.arrayToMap(\n        ('key_exists|cairo_matrix_create_scale|cairo_matrix_create_translate|call_user_method|call_user_method_array|com_addref|com_get|' +\n        'com_invoke|com_isenum|com_load|com_release|com_set|connection_timeout|cubrid_load_from_glo|cubrid_new_glo|cubrid_save_to_glo|' +\n        'cubrid_send_glo|define_syslog_variables|dl|ereg|ereg_replace|eregi|eregi_replace|hw_documentattributes|hw_documentbodytag|' +\n        'hw_documentsize|hw_outputdocument|imagedashedline|maxdb_bind_param|maxdb_bind_result|maxdb_client_encoding|maxdb_close_long_data|' +\n        'maxdb_execute|maxdb_fetch|maxdb_get_metadata|maxdb_param_count|maxdb_send_long_data|mcrypt_ecb|mcrypt_generic_end|mime_content_type|' +\n        'mysql_createdb|mysql_dbname|mysql_db_query|mysql_drop_db|mysql_dropdb|mysql_escape_string|mysql_fieldflags|mysql_fieldflags|' +\n        'mysql_fieldname|mysql_fieldtable|mysql_fieldtype|mysql_freeresult|mysql_listdbs|mysql_list_fields|mysql_listfields|mysql_list_tables|' +\n        'mysql_listtables|mysql_numfields|mysql_numrows|mysql_selectdb|mysql_tablename|mysqli_bind_param|mysqli_bind_result|' +\n        'mysqli_disable_reads_from_master|mysqli_disable_rpl_parse|mysqli_enable_reads_from_master|mysqli_enable_rpl_parse|mysqli_execute|' +\n        'mysqli_fetch|mysqli_get_metadata|mysqli_master_query|mysqli_param_count|mysqli_rpl_parse_enabled|mysqli_rpl_probe|mysqli_rpl_query_type|' +\n        'mysqli_send_long_data|mysqli_send_query|mysqli_slave_query|ocibindbyname|ocicancel|ocicloselob|ocicollappend|ocicollassign|' +\n        'ocicollassignelem|ocicollgetelem|ocicollmax|ocicollsize|ocicolltrim|ocicolumnisnull|ocicolumnname|ocicolumnprecision|ocicolumnscale|' +\n        'ocicolumnsize|ocicolumntype|ocicolumntyperaw|ocicommit|ocidefinebyname|ocierror|ociexecute|ocifetch|ocifetchinto|ocifetchstatement|' +\n        'ocifreecollection|ocifreecursor|ocifreedesc|ocifreestatement|ociinternaldebug|ociloadlob|ocilogoff|ocilogon|ocinewcollection|' +\n        'ocinewcursor|ocinewdescriptor|ocinlogon|ocinumcols|ociparse|ociplogon|ociresult|ocirollback|ocirowcount|ocisavelob|ocisavelobfile|' +\n        'ociserverversion|ocisetprefetch|ocistatementtype|ociwritelobtofile|ociwritetemporarylob|PDF_add_annotation|PDF_add_bookmark|' +\n        'PDF_add_launchlink|PDF_add_locallink|PDF_add_note|PDF_add_outline|PDF_add_pdflink|PDF_add_weblink|PDF_attach_file|PDF_begin_page|' +\n        'PDF_begin_template|PDF_close_pdi|PDF_close|PDF_findfont|PDF_get_font|PDF_get_fontname|PDF_get_fontsize|PDF_get_image_height|' +\n        'PDF_get_image_width|PDF_get_majorversion|PDF_get_minorversion|PDF_get_pdi_parameter|PDF_get_pdi_value|PDF_open_ccitt|PDF_open_file|' +\n        'PDF_open_gif|PDF_open_image_file|PDF_open_image|PDF_open_jpeg|PDF_open_pdi|PDF_open_tiff|PDF_place_image|PDF_place_pdi_page|' +\n        'PDF_set_border_color|PDF_set_border_dash|PDF_set_border_style|PDF_set_char_spacing|PDF_set_duration|PDF_set_horiz_scaling|' +\n        'PDF_set_info_author|PDF_set_info_creator|PDF_set_info_keywords|PDF_set_info_subject|PDF_set_info_title|PDF_set_leading|' +\n        'PDF_set_text_matrix|PDF_set_text_rendering|PDF_set_text_rise|PDF_set_word_spacing|PDF_setgray_fill|PDF_setgray_stroke|PDF_setgray|' +\n        'PDF_setpolydash|PDF_setrgbcolor_fill|PDF_setrgbcolor_stroke|PDF_setrgbcolor|PDF_show_boxed|php_check_syntax|px_set_tablename|' +\n        'px_set_targetencoding|runkit_sandbox_output_handler|session_is_registered|session_register|session_unregister' +\n        'set_magic_quotes_runtime|magic_quotes_runtime|set_socket_blocking|socket_set_blocking|set_socket_timeout|socket_set_timeout|split|spliti|' +\n        'sql_regcase').split('|')\n    );\n\n    var keywordsDeprecated = lang.arrayToMap(\n        ('cfunction|old_function').split('|')\n    );\n\n    var futureReserved = lang.arrayToMap([]);\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : /(?:#|\\/\\/)(?:[^?]|\\?[^>])*/\n            },\n            docComment.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string.regexp\",\n                regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/][gimy]*\\\\s*(?=[).,;]|$)\"\n            }, {\n                token : \"string\", // \" string start\n                regex : '\"',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // ' string start\n                regex : \"'\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language\", // constants\n                regex : \"\\\\b(?:DEFAULT_INCLUDE_PATH|E_(?:ALL|CO(?:MPILE_(?:ERROR|WARNING)|RE_(?:ERROR|WARNING))|\" +\n                        \"ERROR|NOTICE|PARSE|STRICT|USER_(?:ERROR|NOTICE|WARNING)|WARNING)|P(?:EAR_(?:EXTENSION_DIR|INSTALL_DIR)|\" +\n                        \"HP_(?:BINDIR|CONFIG_FILE_(?:PATH|SCAN_DIR)|DATADIR|E(?:OL|XTENSION_DIR)|INT_(?:MAX|SIZE)|\" +\n                        \"L(?:IBDIR|OCALSTATEDIR)|O(?:S|UTPUT_HANDLER_(?:CONT|END|START))|PREFIX|S(?:API|HLIB_SUFFIX|YSCONFDIR)|\" +\n                        \"VERSION))|__COMPILER_HALT_OFFSET__)\\\\b\"\n            }, {\n                token : [\"keyword\", \"text\", \"support.class\"],\n                regex : \"\\\\b(new)(\\\\s+)(\\\\w+)\"\n            }, {\n                token : [\"support.class\", \"keyword.operator\"],\n                regex : \"\\\\b(\\\\w+)(::)\"\n            }, {\n                token : \"constant.language\", // constants\n                regex : \"\\\\b(?:A(?:B(?:DAY_(?:1|2|3|4|5|6|7)|MON_(?:1(?:0|1|2|)|2|3|4|5|6|7|8|9))|LT_DIGITS|M_STR|\" +\n                        \"SSERT_(?:ACTIVE|BAIL|CALLBACK|QUIET_EVAL|WARNING))|C(?:ASE_(?:LOWER|UPPER)|HAR_MAX|\" +\n                        \"O(?:DESET|NNECTION_(?:ABORTED|NORMAL|TIMEOUT)|UNT_(?:NORMAL|RECURSIVE))|\" +\n                        \"R(?:EDITS_(?:ALL|DOCS|FULLPAGE|G(?:ENERAL|ROUP)|MODULES|QA|SAPI)|NCYSTR|\" +\n                        \"YPT_(?:BLOWFISH|EXT_DES|MD5|S(?:ALT_LENGTH|TD_DES)))|URRENCY_SYMBOL)|D(?:AY_(?:1|2|3|4|5|6|7)|\" +\n                        \"ECIMAL_POINT|IRECTORY_SEPARATOR|_(?:FMT|T_FMT))|E(?:NT_(?:COMPAT|NOQUOTES|QUOTES)|RA(?:_(?:D_(?:FMT|T_FMT)|\" +\n                        \"T_FMT|YEAR)|)|XTR_(?:IF_EXISTS|OVERWRITE|PREFIX_(?:ALL|I(?:F_EXISTS|NVALID)|SAME)|SKIP))|FRAC_DIGITS|GROUPING|\" +\n                        \"HTML_(?:ENTITIES|SPECIALCHARS)|IN(?:FO_(?:ALL|C(?:ONFIGURATION|REDITS)|ENVIRONMENT|GENERAL|LICENSE|MODULES|VARIABLES)|\" +\n                        \"I_(?:ALL|PERDIR|SYSTEM|USER)|T_(?:CURR_SYMBOL|FRAC_DIGITS))|L(?:C_(?:ALL|C(?:OLLATE|TYPE)|M(?:ESSAGES|ONETARY)|NUMERIC|TIME)|\" +\n                        \"O(?:CK_(?:EX|NB|SH|UN)|G_(?:A(?:LERT|UTH(?:PRIV|))|C(?:ONS|R(?:IT|ON))|D(?:AEMON|EBUG)|E(?:MERG|RR)|INFO|KERN|\" +\n                        \"L(?:OCAL(?:0|1|2|3|4|5|6|7)|PR)|MAIL|N(?:DELAY|EWS|O(?:TICE|WAIT))|ODELAY|P(?:ERROR|ID)|SYSLOG|U(?:SER|UCP)|WARNING)))|\" +\n                        \"M(?:ON_(?:1(?:0|1|2|)|2|3|4|5|6|7|8|9|DECIMAL_POINT|GROUPING|THOUSANDS_SEP)|_(?:1_PI|2_(?:PI|SQRTPI)|E|L(?:N(?:10|2)|\" +\n                        \"OG(?:10E|2E))|PI(?:_(?:2|4)|)|SQRT(?:1_2|2)))|N(?:EGATIVE_SIGN|O(?:EXPR|STR)|_(?:CS_PRECEDES|S(?:EP_BY_SPACE|IGN_POSN)))|\" +\n                        \"P(?:ATH(?:INFO_(?:BASENAME|DIRNAME|EXTENSION)|_SEPARATOR)|M_STR|OSITIVE_SIGN|_(?:CS_PRECEDES|S(?:EP_BY_SPACE|IGN_POSN)))|\" +\n                        \"RADIXCHAR|S(?:EEK_(?:CUR|END|SET)|ORT_(?:ASC|DESC|NUMERIC|REGULAR|STRING)|TR_PAD_(?:BOTH|LEFT|RIGHT))|\" +\n                        \"T(?:HOUS(?:ANDS_SEP|EP)|_FMT(?:_AMPM|))|YES(?:EXPR|STR)|STD(?:IN|OUT|ERR))\\\\b\"\n            }, {\n                token : function(value) {\n                    if (keywords.hasOwnProperty(value))\n                        return \"keyword\";\n                    else if (builtinConstants.hasOwnProperty(value))\n                        return \"constant.language\";\n                    else if (builtinVariables.hasOwnProperty(value))\n                        return \"variable.language\";\n                    else if (futureReserved.hasOwnProperty(value))\n                        return \"invalid.illegal\";\n                    else if (builtinFunctions.hasOwnProperty(value))\n                        return \"support.function\";\n                    else if (value == \"debugger\")\n                        return \"invalid.deprecated\";\n                    else\n                        if(value.match(/^(\\$[a-zA-Z_\\x7f-\\uffff][a-zA-Z0-9_\\x7f-\\uffff]*|self|parent)$/))\n                            return \"variable\";\n                        return \"identifier\";\n                },\n                regex : /[a-zA-Z_$\\x7f-\\uffff][a-zA-Z0-9_\\x7f-\\uffff]*/\n            }, {\n                onMatch : function(value, currentSate, state) {\n                    value = value.substr(3);\n                    if (value[0] == \"'\" || value[0] == '\"')\n                        value = value.slice(1, -1);\n                    state.unshift(this.next, value);\n                    return \"markup.list\";\n                },\n                regex : /<<<(?:\\w+|'\\w+'|\"\\w+\")$/,\n                next: \"heredoc\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"::|!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|!=|!==|<=|>=|=>|<<=|>>=|>>>=|<>|<|>|=|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"heredoc\" : [\n            {\n                onMatch : function(value, currentSate, stack) {\n                    if (stack[1] != value)\n                        return \"string\";\n                    stack.shift();\n                    stack.shift();\n                    return \"markup.list\";\n                },\n                regex : \"^\\\\w+(?=;?$)\",\n                next: \"start\"\n            }, {\n                token: \"string\",\n                regex : \".*\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                defaultToken : \"comment\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : '\\\\\\\\(?:[nrtvef\\\\\\\\\"$]|[0-7]{1,3}|x[0-9A-Fa-f]{1,2})'\n            }, {\n                token : \"variable\",\n                regex : /\\$[\\w]+(?:\\[[\\w\\]+]|[=\\-]>\\w+)?/\n            }, {\n                token : \"variable\",\n                regex : /\\$\\{[^\"\\}]+\\}?/           // this is wrong but ok for now\n            },\n            {token : \"string\", regex : '\"', next : \"start\"},\n            {defaultToken : \"string\"}\n        ],\n        \"qstring\" : [\n            {token : \"constant.language.escape\", regex : /\\\\['\\\\]/},\n            {token : \"string\", regex : \"'\", next : \"start\"},\n            {defaultToken : \"string\"}\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(PhpLangHighlightRules, TextHighlightRules);\n\n\nvar PhpHighlightRules = function() {\n    HtmlHighlightRules.call(this);\n\n    var startRules = [\n        {\n            token : \"support.php_tag\", // php open tag\n            regex : \"<\\\\?(?:php|=)?\",\n            push  : \"php-start\"\n        }\n    ];\n\n    var endRules = [\n        {\n            token : \"support.php_tag\", // php close tag\n            regex : \"\\\\?>\",\n            next  : \"pop\"\n        }\n    ];\n\n    for (var key in this.$rules)\n        this.$rules[key].unshift.apply(this.$rules[key], startRules);\n\n    this.embedRules(PhpLangHighlightRules, \"php-\", endRules, [\"start\"]);\n\n    this.normalizeRules();\n};\n\noop.inherits(PhpHighlightRules, HtmlHighlightRules);\n\nexports.PhpHighlightRules = PhpHighlightRules;\nexports.PhpLangHighlightRules = PhpLangHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar CssBehaviour = function () {\n\n    this.inherit(CstyleBehaviour);\n\n    this.add(\"colon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(cursor.row);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                if (rightChar === ':') {\n                    return {\n                       text: '',\n                       selection: [1, 1]\n                    }\n                }\n                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n                    return {\n                       text: ':;',\n                       selection: [1, 1]\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"colon\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(range.start.row);\n                var rightChar = line.substring(range.end.column, range.end.column + 1);\n                if (rightChar === ';') {\n                    range.end.column ++;\n                    return range;\n                }\n            }\n        }\n    });\n\n    this.add(\"semicolon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ';') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === ';') {\n                return {\n                   text: '',\n                   selection: [1, 1]\n                }\n            }\n        }\n    });\n\n}\noop.inherits(CssBehaviour, CstyleBehaviour);\n\nexports.CssBehaviour = CssBehaviour;\n});\n\nace.define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CssBehaviour = require(\"./behaviour/css\").CssBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = CssHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CssBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"csslint\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/css\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\nace.define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nvar XmlBehaviour = function () {\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selected = session.doc.getTextRange(editor.getSelectionRange());\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            }\n\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (rightChar == quote && (is(token, \"attribute-value\") || is(token, \"string\"))) {\n                return {\n                    text: \"\",\n                    selection: [1, 1]\n                };\n            }\n\n            if (!token)\n                token = iterator.stepBackward();\n\n            if (!token)\n                return;\n\n            while (is(token, \"tag-whitespace\") || is(token, \"whitespace\")) {\n                token = iterator.stepBackward();\n            }\n            var rightSpace = !rightChar || rightChar.match(/\\s/);\n            if (is(token, \"attribute-equals\") && (rightSpace || rightChar == '>') || (is(token, \"decl-attribute-equals\") && (rightSpace || rightChar == '?'))) {\n                return {\n                    text: quote + quote,\n                    selection: [1, 1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken() || iterator.stepBackward();\n            if (!token || !(is(token, \"tag-name\") || is(token, \"tag-whitespace\") || is(token, \"attribute-name\") || is(token, \"attribute-equals\") || is(token, \"attribute-value\")))\n                return;\n            if (is(token, \"reference.attribute-value\"))\n                return;\n            if (is(token, \"attribute-value\")) {\n                var firstChar = token.value.charAt(0);\n                if (firstChar == '\"' || firstChar == \"'\") {\n                    var lastChar = token.value.charAt(token.value.length - 1);\n                    var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length;\n                    if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar)\n                        return;\n                }\n            }\n            while (!is(token, \"tag-name\")) {\n                token = iterator.stepBackward();\n            }\n\n            var tokenRow = iterator.getCurrentTokenRow();\n            var tokenColumn = iterator.getCurrentTokenColumn();\n            if (is(iterator.stepBackward(), \"end-tag-open\"))\n                return;\n\n            var element = token.value;\n            if (tokenRow == position.row)\n                element = element.substring(0, position.column - tokenColumn);\n\n            if (this.voidElements.hasOwnProperty(element.toLowerCase()))\n                 return;\n\n            return {\n               text: \">\" + \"</\" + element + \">\",\n               selection: [1, 1]\n            };\n        }\n    });\n\n    this.add(\"autoindent\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.getLine(cursor.row);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (token && token.type.indexOf(\"tag-close\") !== -1) {\n                while (token && token.type.indexOf(\"tag-name\") === -1) {\n                    token = iterator.stepBackward();\n                }\n\n                if (!token) {\n                    return;\n                }\n\n                var tag = token.value;\n                var row = iterator.getCurrentTokenRow();\n                token = iterator.stepBackward();\n                if (!token || token.type.indexOf(\"end-tag\") !== -1) {\n                    return;\n                }\n\n                if (this.voidElements && !this.voidElements[tag]) {\n                    var nextToken = session.getTokenAt(cursor.row, cursor.column+1);\n                    var line = session.getLine(row);\n                    var nextIndent = this.$getIndent(line);\n                    var indent = nextIndent + session.getTabString();\n\n                    if (nextToken && nextToken.value === \"</\") {\n                        return {\n                            text: \"\\n\" + indent + \"\\n\" + nextIndent,\n                            selection: [1, indent.length, 1, indent.length]\n                        };\n                    } else {\n                        return {\n                            text: \"\\n\" + indent\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n};\n\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\nace.define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n    this.defaultMode = defaultMode;\n    this.subModes = subModes;\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n\n    this.$getMode = function(state) {\n        if (typeof state != \"string\") \n            state = state[0];\n        for (var key in this.subModes) {\n            if (state.indexOf(key) === 0)\n                return this.subModes[key];\n        }\n        return null;\n    };\n    \n    this.$tryMode = function(state, session, foldStyle, row) {\n        var mode = this.$getMode(state);\n        return (mode ? mode.getFoldWidget(session, foldStyle, row) : \"\");\n    };\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        return (\n            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n            this.defaultMode.getFoldWidget(session, foldStyle, row)\n        );\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var mode = this.$getMode(session.getState(row-1));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.$getMode(session.getState(row));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.defaultMode;\n        \n        return mode.getFoldWidgetRange(session, foldStyle, row);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalEndTags) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n    this.optionalEndTags = oop.mixin({}, this.voidElements);\n    if (optionalEndTags)\n        oop.mixin(this.optionalEndTags, optionalEndTags);\n    \n};\noop.inherits(FoldMode, BaseFoldMode);\n\nvar Tag = function() {\n    this.tagName = \"\";\n    this.closing = false;\n    this.selfClosing = false;\n    this.start = {row: 0, column: 0};\n    this.end = {row: 0, column: 0};\n};\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (!tag)\n            return \"\";\n\n        if (tag.closing || (!tag.tagName && tag.selfClosing))\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase()))\n            return \"\";\n\n        if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column))\n            return \"\";\n\n        return \"start\";\n    };\n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var tag = new Tag();\n\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (is(token, \"tag-open\")) {\n                tag.end.column = tag.start.column + token.value.length;\n                tag.closing = is(token, \"end-tag-open\");\n                token = tokens[++i];\n                if (!token)\n                    return null;\n                tag.tagName = token.value;\n                tag.end.column += token.value.length;\n                for (i++; i < tokens.length; i++) {\n                    token = tokens[i];\n                    tag.end.column += token.value.length;\n                    if (is(token, \"tag-close\")) {\n                        tag.selfClosing = token.value == '/>';\n                        break;\n                    }\n                }\n                return tag;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == '/>';\n                return tag;\n            }\n            tag.start.column += token.value.length;\n        }\n\n        return null;\n    };\n\n    this._findEndTagInLine = function(session, row, tagName, startColumn) {\n        var tokens = session.getTokens(row);\n        var column = 0;\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            column += token.value.length;\n            if (column < startColumn)\n                continue;\n            if (is(token, \"end-tag-open\")) {\n                token = tokens[i + 1];\n                if (token && token.value == tagName)\n                    return true;\n            }\n        }\n        return false;\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n                iterator.stepForward();\n                return tag;\n            }\n        } while(token = iterator.stepForward());\n\n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n                iterator.stepBackward();\n                return tag;\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n            }\n        } while(token = iterator.stepBackward());\n\n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.optionalEndTags.hasOwnProperty(top.tagName)) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.start.column);\n            var start = {\n                row: row,\n                column: firstTag.start.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.end.column);\n            var end = {\n                row: row,\n                column: firstTag.start.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar MixedFoldMode = require(\"./mixed\").FoldMode;\nvar XmlFoldMode = require(\"./xml\").FoldMode;\nvar CStyleFoldMode = require(\"./cstyle\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalTags) {\n    MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), {\n        \"js-\": new CStyleFoldMode(),\n        \"css-\": new CStyleFoldMode()\n    });\n};\n\noop.inherits(FoldMode, MixedFoldMode);\n\n});\n\nace.define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\n\nvar commonAttributes = [\n    \"accesskey\",\n    \"class\",\n    \"contenteditable\",\n    \"contextmenu\",\n    \"dir\",\n    \"draggable\",\n    \"dropzone\",\n    \"hidden\",\n    \"id\",\n    \"inert\",\n    \"itemid\",\n    \"itemprop\",\n    \"itemref\",\n    \"itemscope\",\n    \"itemtype\",\n    \"lang\",\n    \"spellcheck\",\n    \"style\",\n    \"tabindex\",\n    \"title\",\n    \"translate\"\n];\n\nvar eventAttributes = [\n    \"onabort\",\n    \"onblur\",\n    \"oncancel\",\n    \"oncanplay\",\n    \"oncanplaythrough\",\n    \"onchange\",\n    \"onclick\",\n    \"onclose\",\n    \"oncontextmenu\",\n    \"oncuechange\",\n    \"ondblclick\",\n    \"ondrag\",\n    \"ondragend\",\n    \"ondragenter\",\n    \"ondragleave\",\n    \"ondragover\",\n    \"ondragstart\",\n    \"ondrop\",\n    \"ondurationchange\",\n    \"onemptied\",\n    \"onended\",\n    \"onerror\",\n    \"onfocus\",\n    \"oninput\",\n    \"oninvalid\",\n    \"onkeydown\",\n    \"onkeypress\",\n    \"onkeyup\",\n    \"onload\",\n    \"onloadeddata\",\n    \"onloadedmetadata\",\n    \"onloadstart\",\n    \"onmousedown\",\n    \"onmousemove\",\n    \"onmouseout\",\n    \"onmouseover\",\n    \"onmouseup\",\n    \"onmousewheel\",\n    \"onpause\",\n    \"onplay\",\n    \"onplaying\",\n    \"onprogress\",\n    \"onratechange\",\n    \"onreset\",\n    \"onscroll\",\n    \"onseeked\",\n    \"onseeking\",\n    \"onselect\",\n    \"onshow\",\n    \"onstalled\",\n    \"onsubmit\",\n    \"onsuspend\",\n    \"ontimeupdate\",\n    \"onvolumechange\",\n    \"onwaiting\"\n];\n\nvar globalAttributes = commonAttributes.concat(eventAttributes);\n\nvar attributeMap = {\n    \"html\": [\"manifest\"],\n    \"head\": [],\n    \"title\": [],\n    \"base\": [\"href\", \"target\"],\n    \"link\": [\"href\", \"hreflang\", \"rel\", \"media\", \"type\", \"sizes\"],\n    \"meta\": [\"http-equiv\", \"name\", \"content\", \"charset\"],\n    \"style\": [\"type\", \"media\", \"scoped\"],\n    \"script\": [\"charset\", \"type\", \"src\", \"defer\", \"async\"],\n    \"noscript\": [\"href\"],\n    \"body\": [\"onafterprint\", \"onbeforeprint\", \"onbeforeunload\", \"onhashchange\", \"onmessage\", \"onoffline\", \"onpopstate\", \"onredo\", \"onresize\", \"onstorage\", \"onundo\", \"onunload\"],\n    \"section\": [],\n    \"nav\": [],\n    \"article\": [\"pubdate\"],\n    \"aside\": [],\n    \"h1\": [],\n    \"h2\": [],\n    \"h3\": [],\n    \"h4\": [],\n    \"h5\": [],\n    \"h6\": [],\n    \"header\": [],\n    \"footer\": [],\n    \"address\": [],\n    \"main\": [],\n    \"p\": [],\n    \"hr\": [],\n    \"pre\": [],\n    \"blockquote\": [\"cite\"],\n    \"ol\": [\"start\", \"reversed\"],\n    \"ul\": [],\n    \"li\": [\"value\"],\n    \"dl\": [],\n    \"dt\": [],\n    \"dd\": [],\n    \"figure\": [],\n    \"figcaption\": [],\n    \"div\": [],\n    \"a\": [\"href\", \"target\", \"ping\", \"rel\", \"media\", \"hreflang\", \"type\"],\n    \"em\": [],\n    \"strong\": [],\n    \"small\": [],\n    \"s\": [],\n    \"cite\": [],\n    \"q\": [\"cite\"],\n    \"dfn\": [],\n    \"abbr\": [],\n    \"data\": [],\n    \"time\": [\"datetime\"],\n    \"code\": [],\n    \"var\": [],\n    \"samp\": [],\n    \"kbd\": [],\n    \"sub\": [],\n    \"sup\": [],\n    \"i\": [],\n    \"b\": [],\n    \"u\": [],\n    \"mark\": [],\n    \"ruby\": [],\n    \"rt\": [],\n    \"rp\": [],\n    \"bdi\": [],\n    \"bdo\": [],\n    \"span\": [],\n    \"br\": [],\n    \"wbr\": [],\n    \"ins\": [\"cite\", \"datetime\"],\n    \"del\": [\"cite\", \"datetime\"],\n    \"img\": [\"alt\", \"src\", \"height\", \"width\", \"usemap\", \"ismap\"],\n    \"iframe\": [\"name\", \"src\", \"height\", \"width\", \"sandbox\", \"seamless\"],\n    \"embed\": [\"src\", \"height\", \"width\", \"type\"],\n    \"object\": [\"param\", \"data\", \"type\", \"height\" , \"width\", \"usemap\", \"name\", \"form\", \"classid\"],\n    \"param\": [\"name\", \"value\"],\n    \"video\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\", \"width\", \"height\", \"poster\"],\n    \"audio\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\"],\n    \"source\": [\"src\", \"type\", \"media\"],\n    \"track\": [\"kind\", \"src\", \"srclang\", \"label\", \"default\"],\n    \"canvas\": [\"width\", \"height\"],\n    \"map\": [\"name\"],\n    \"area\": [\"shape\", \"coords\", \"href\", \"hreflang\", \"alt\", \"target\", \"media\", \"rel\", \"ping\", \"type\"],\n    \"svg\": [],\n    \"math\": [],\n    \"table\": [\"summary\"],\n    \"caption\": [],\n    \"colgroup\": [\"span\"],\n    \"col\": [\"span\"],\n    \"tbody\": [],\n    \"thead\": [],\n    \"tfoot\": [],\n    \"tr\": [],\n    \"td\": [\"headers\", \"rowspan\", \"colspan\"],\n    \"th\": [\"headers\", \"rowspan\", \"colspan\", \"scope\"],\n    \"form\": [\"accept-charset\", \"action\", \"autocomplete\", \"enctype\", \"method\", \"name\", \"novalidate\", \"target\"],\n    \"fieldset\": [\"disabled\", \"form\", \"name\"],\n    \"legend\": [],\n    \"label\": [\"form\", \"for\"],\n    \"input\": [\"type\", \"accept\", \"alt\", \"autocomplete\", \"checked\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"height\", \"list\", \"max\", \"maxlength\", \"min\", \"multiple\", \"pattern\", \"placeholder\", \"readonly\", \"required\", \"size\", \"src\", \"step\", \"width\", \"files\", \"value\"],\n    \"button\": [\"autofocus\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"name\", \"value\", \"type\"],\n    \"select\": [\"autofocus\", \"disabled\", \"form\", \"multiple\", \"name\", \"size\"],\n    \"datalist\": [],\n    \"optgroup\": [\"disabled\", \"label\"],\n    \"option\": [\"disabled\", \"selected\", \"label\", \"value\"],\n    \"textarea\": [\"autofocus\", \"disabled\", \"form\", \"maxlength\", \"name\", \"placeholder\", \"readonly\", \"required\", \"rows\", \"cols\", \"wrap\"],\n    \"keygen\": [\"autofocus\", \"challenge\", \"disabled\", \"form\", \"keytype\", \"name\"],\n    \"output\": [\"for\", \"form\", \"name\"],\n    \"progress\": [\"value\", \"max\"],\n    \"meter\": [\"value\", \"min\", \"max\", \"low\", \"high\", \"optimum\"],\n    \"details\": [\"open\"],\n    \"summary\": [],\n    \"command\": [\"type\", \"label\", \"icon\", \"disabled\", \"checked\", \"radiogroup\", \"command\"],\n    \"menu\": [\"type\", \"label\"],\n    \"dialog\": [\"open\"]\n};\n\nvar elements = Object.keys(attributeMap);\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nfunction findTagName(session, pos) {\n    var iterator = new TokenIterator(session, pos.row, pos.column);\n    var token = iterator.getCurrentToken();\n    while (token && !is(token, \"tag-name\")){\n        token = iterator.stepBackward();\n    }\n    if (token)\n        return token.value;\n}\n\nvar HtmlCompletions = function() {\n\n};\n\n(function() {\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        var token = session.getTokenAt(pos.row, pos.column);\n\n        if (!token)\n            return [];\n        if (is(token, \"tag-name\") || is(token, \"tag-open\") || is(token, \"end-tag-open\"))\n            return this.getTagCompletions(state, session, pos, prefix);\n        if (is(token, \"tag-whitespace\") || is(token, \"attribute-name\"))\n            return this.getAttributeCompetions(state, session, pos, prefix);\n\n        return [];\n    };\n\n    this.getTagCompletions = function(state, session, pos, prefix) {\n        return elements.map(function(element){\n            return {\n                value: element,\n                meta: \"tag\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n    this.getAttributeCompetions = function(state, session, pos, prefix) {\n        var tagName = findTagName(session, pos);\n        if (!tagName)\n            return [];\n        var attributes = globalAttributes;\n        if (tagName in attributeMap) {\n            attributes = attributes.concat(attributeMap[tagName]);\n        }\n        return attributes.map(function(attribute){\n            return {\n                caption: attribute,\n                snippet: attribute + '=\"$0\"',\n                meta: \"attribute\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n}).call(HtmlCompletions.prototype);\n\nexports.HtmlCompletions = HtmlCompletions;\n});\n\nace.define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar HtmlFoldMode = require(\"./folding/html\").FoldMode;\nvar HtmlCompletions = require(\"./html_completions\").HtmlCompletions;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar voidElements = [\"area\", \"base\", \"br\", \"col\", \"embed\", \"hr\", \"img\", \"input\", \"keygen\", \"link\", \"meta\", \"menuitem\", \"param\", \"source\", \"track\", \"wbr\"];\nvar optionalEndTags = [\"li\", \"dt\", \"dd\", \"p\", \"rt\", \"rp\", \"optgroup\", \"option\", \"colgroup\", \"td\", \"th\"];\n\nvar Mode = function(options) {\n    this.fragmentContext = options && options.fragmentContext;\n    this.HighlightRules = HtmlHighlightRules;\n    this.$behaviour = new XmlBehaviour();\n    this.$completer = new HtmlCompletions();\n    \n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"css-\": CssMode\n    });\n    \n    this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags));\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n    this.voidElements = lang.arrayToMap(voidElements);\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        return this.$completer.getCompletions(state, session, pos, prefix);\n    };\n\n    this.createWorker = function(session) {\n        if (this.constructor != Mode)\n            return;\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/html_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        if (this.fragmentContext)\n            worker.call(\"setOptions\", [{context: this.fragmentContext}]);\n\n        worker.on(\"error\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/html\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/php\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/php_highlight_rules\",\"ace/mode/php_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\",\"ace/unicode\",\"ace/mode/html\",\"ace/mode/javascript\",\"ace/mode/css\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar PhpHighlightRules = require(\"./php_highlight_rules\").PhpHighlightRules;\nvar PhpLangHighlightRules = require(\"./php_highlight_rules\").PhpLangHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\nvar unicode = require(\"../unicode\");\nvar HtmlMode = require(\"./html\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\n\nvar PhpMode = function(opts) {\n    this.HighlightRules = PhpLangHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(PhpMode, TextMode);\n\n(function() {\n\n    this.tokenRe = new RegExp(\"^[\"\n        + unicode.packages.L\n        + unicode.packages.Mn + unicode.packages.Mc\n        + unicode.packages.Nd\n        + unicode.packages.Pc + \"\\_]+\", \"g\"\n    );\n\n    this.nonTokenRe = new RegExp(\"^(?:[^\"\n        + unicode.packages.L\n        + unicode.packages.Mn + unicode.packages.Mc\n        + unicode.packages.Nd\n        + unicode.packages.Pc + \"\\_]|\\s])+\", \"g\"\n    );\n\n\n    this.lineCommentStart = [\"//\", \"#\"];\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[\\:]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState != \"doc-start\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/php-inline\";\n}).call(PhpMode.prototype);\n\nvar Mode = function(opts) {\n    if (opts && opts.inline) {\n        var mode = new PhpMode();\n        mode.createWorker = this.createWorker;\n        mode.inlinePhp = true;\n        return mode;\n    }\n    HtmlMode.call(this);\n    this.HighlightRules = PhpHighlightRules;\n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"css-\": CssMode,\n        \"php-\": PhpMode\n    });\n    this.foldingRules.subModes[\"php-\"] = new CStyleFoldMode();\n};\noop.inherits(Mode, HtmlMode);\n\n(function() {\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/php_worker\", \"PhpWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        if (this.inlinePhp)\n            worker.call(\"setOptions\", [{inline: true}]);\n\n        worker.on(\"error\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"ok\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/php\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-plain_text.js",
    "content": "ace.define(\"ace/mode/plain_text\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/text_highlight_rules\",\"ace/mode/behaviour\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar Behaviour = require(\"./behaviour\").Behaviour;\n\nvar Mode = function() {\n    this.HighlightRules = TextHighlightRules;\n    this.$behaviour = new Behaviour();\n};\n\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.type = \"text\";\n    this.getNextLineIndent = function(state, line, tab) {\n        return '';\n    };\n    this.$id = \"ace/mode/plain_text\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-powershell.js",
    "content": "ace.define(\"ace/mode/powershell_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar PowershellHighlightRules = function() {\n\n    var keywords = (\n      \"function|if|else|elseif|switch|while|default|for|do|until|break|continue|\" +\n       \"foreach|return|filter|in|trap|throw|param|begin|process|end\"\n    );\n\n    var builtinFunctions = (\n      \"Get-Alias|Import-Alias|New-Alias|Set-Alias|Get-AuthenticodeSignature|Set-AuthenticodeSignature|\" +\n       \"Set-Location|Get-ChildItem|Clear-Item|Get-Command|Measure-Command|Trace-Command|\" +\n       \"Add-Computer|Checkpoint-Computer|Remove-Computer|Restart-Computer|Restore-Computer|Stop-Computer|\" +\n       \"Reset-ComputerMachinePassword|Test-ComputerSecureChannel|Add-Content|Get-Content|Set-Content|Clear-Content|\" +\n       \"Get-Command|Invoke-Command|Enable-ComputerRestore|Disable-ComputerRestore|Get-ComputerRestorePoint|Test-Connection|\" +\n       \"ConvertFrom-CSV|ConvertTo-CSV|ConvertTo-Html|ConvertTo-Xml|ConvertFrom-SecureString|ConvertTo-SecureString|\" +\n       \"Copy-Item|Export-Counter|Get-Counter|Import-Counter|Get-Credential|Get-Culture|\" +\n       \"Get-ChildItem|Get-Date|Set-Date|Remove-Item|Compare-Object|Get-Event|\" +\n       \"Get-WinEvent|New-Event|Remove-Event|Unregister-Event|Wait-Event|Clear-EventLog|\" +\n       \"Get-Eventlog|Limit-EventLog|New-Eventlog|Remove-EventLog|Show-EventLog|Write-EventLog|\" +\n       \"Get-EventSubscriber|Register-EngineEvent|Register-ObjectEvent|Register-WmiEvent|Get-ExecutionPolicy|Set-ExecutionPolicy|\" +\n       \"Export-Alias|Export-Clixml|Export-Console|Export-Csv|ForEach-Object|Format-Custom|\" +\n       \"Format-List|Format-Table|Format-Wide|Export-FormatData|Get-FormatData|Get-Item|\" +\n       \"Get-ChildItem|Get-Help|Add-History|Clear-History|Get-History|Invoke-History|\" +\n       \"Get-Host|Read-Host|Write-Host|Get-HotFix|Import-Clixml|Import-Csv|\" +\n       \"Invoke-Command|Invoke-Expression|Get-Item|Invoke-Item|New-Item|Remove-Item|\" +\n       \"Set-Item|Clear-ItemProperty|Copy-ItemProperty|Get-ItemProperty|Move-ItemProperty|New-ItemProperty|\" +\n       \"Remove-ItemProperty|Rename-ItemProperty|Set-ItemProperty|Get-Job|Receive-Job|Remove-Job|\" +\n       \"Start-Job|Stop-Job|Wait-Job|Stop-Process|Update-List|Get-Location|\" +\n       \"Pop-Location|Push-Location|Set-Location|Send-MailMessage|Add-Member|Get-Member|\" +\n       \"Move-Item|Compare-Object|Group-Object|Measure-Object|New-Object|Select-Object|\" +\n       \"Sort-Object|Where-Object|Out-Default|Out-File|Out-GridView|Out-Host|\" +\n       \"Out-Null|Out-Printer|Out-String|Convert-Path|Join-Path|Resolve-Path|\" +\n       \"Split-Path|Test-Path|Get-Pfxcertificate|Pop-Location|Push-Location|Get-Process|\" +\n       \"Start-Process|Stop-Process|Wait-Process|Enable-PSBreakpoint|Disable-PSBreakpoint|Get-PSBreakpoint|\" +\n       \"Set-PSBreakpoint|Remove-PSBreakpoint|Get-PSDrive|New-PSDrive|Remove-PSDrive|Get-PSProvider|\" +\n       \"Set-PSdebug|Enter-PSSession|Exit-PSSession|Export-PSSession|Get-PSSession|Import-PSSession|\" +\n       \"New-PSSession|Remove-PSSession|Disable-PSSessionConfiguration|Enable-PSSessionConfiguration|Get-PSSessionConfiguration|Register-PSSessionConfiguration|\" +\n       \"Set-PSSessionConfiguration|Unregister-PSSessionConfiguration|New-PSSessionOption|Add-PsSnapIn|Get-PsSnapin|Remove-PSSnapin|\" +\n       \"Get-Random|Read-Host|Remove-Item|Rename-Item|Rename-ItemProperty|Select-Object|\" +\n       \"Select-XML|Send-MailMessage|Get-Service|New-Service|Restart-Service|Resume-Service|\" +\n       \"Set-Service|Start-Service|Stop-Service|Suspend-Service|Sort-Object|Start-Sleep|\" +\n       \"ConvertFrom-StringData|Select-String|Tee-Object|New-Timespan|Trace-Command|Get-Tracesource|\" +\n       \"Set-Tracesource|Start-Transaction|Complete-Transaction|Get-Transaction|Use-Transaction|Undo-Transaction|\" +\n       \"Start-Transcript|Stop-Transcript|Add-Type|Update-TypeData|Get-Uiculture|Get-Unique|\" +\n       \"Update-Formatdata|Update-Typedata|Clear-Variable|Get-Variable|New-Variable|Remove-Variable|\" +\n       \"Set-Variable|New-WebServiceProxy|Where-Object|Write-Debug|Write-Error|Write-Host|\" +\n       \"Write-Output|Write-Progress|Write-Verbose|Write-Warning|Set-WmiInstance|Invoke-WmiMethod|\" +\n       \"Get-WmiObject|Remove-WmiObject|Connect-WSMan|Disconnect-WSMan|Test-WSMan|Invoke-WSManAction|\" +\n       \"Disable-WSManCredSSP|Enable-WSManCredSSP|Get-WSManCredSSP|New-WSManInstance|Get-WSManInstance|Set-WSManInstance|\" +\n       \"Remove-WSManInstance|Set-WSManQuickConfig|New-WSManSessionOption\"\n       );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": builtinFunctions,\n        \"keyword\": keywords\n    }, \"identifier\");\n\n    var binaryOperatorsRe = \"eq|ne|ge|gt|lt|le|like|notlike|match|notmatch|replace|contains|notcontains|\" +\n                            \"ieq|ine|ige|igt|ile|ilt|ilike|inotlike|imatch|inotmatch|ireplace|icontains|inotcontains|\" +\n                            \"is|isnot|as|\" +\n                            \"and|or|band|bor|not\";\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"#.*$\"\n            }, {\n                token : \"comment.start\",\n                regex : \"<#\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"[$](?:[Tt]rue|[Ff]alse)\\\\b\"\n            }, {\n                token : \"constant.language\",\n                regex : \"[$][Nn]ull\\\\b\"\n            }, {\n                token : \"variable.instance\",\n                regex : \"[$][a-zA-Z][a-zA-Z0-9_]*\\\\b\"\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$\\\\-]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"\\\\-(?:\" + binaryOperatorsRe + \")\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"&|\\\\*|\\\\+|\\\\-|\\\\=|\\\\+=|\\\\-=\"\n            }, {\n                token : \"lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment.end\",\n                regex : \"#>\",\n                next : \"start\"\n            }, {\n                token : \"doc.comment.tag\",\n                regex : \"^\\\\.\\\\w+\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\w+\"\n            }, {\n                token : \"comment\",\n                regex : \".\"\n            }\n        ]\n    };\n};\n\noop.inherits(PowershellHighlightRules, TextHighlightRules);\n\nexports.PowershellHighlightRules = PowershellHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/powershell\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/powershell_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar PowershellHighlightRules = require(\"./powershell_highlight_rules\").PowershellHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = PowershellHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode({start: \"^\\\\s*(<#)\", end: \"^[#\\\\s]>\\\\s*$\"});\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"#\";\n    this.blockComment = {start: \"<#\", end: \"#>\"};\n    \n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n      \n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n\n    this.createWorker = function(session) {\n        return null;\n    };\n\n    this.$id = \"ace/mode/powershell\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-praat.js",
    "content": "ace.define(\"ace/mode/praat_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar PraatHighlightRules = function() {\n\n    var keywords = (\n        \"if|then|else|elsif|elif|endif|fi|\" +\n        \"endfor|endproc|\" + // related keywords specified below\n        \"while|endwhile|\" +\n        \"repeat|until|\" +\n        \"select|plus|minus|\" +\n        \"assert\"\n    );\n\n    var predefinedVariables = (\n        \"macintosh|windows|unix|\" +\n        \"praatVersion|praatVersion\\\\$\" +\n        \"pi|undefined|\" +\n        \"newline\\\\$|tab\\\\$|\" +\n        \"shellDirectory\\\\$|homeDirectory\\\\$|preferencesDirectory\\\\$|\" +\n        \"temporaryDirectory\\\\$|defaultDirectory\\\\$\"\n    );\n    var directives = (\n        \"clearinfo|endSendPraat\"\n    );\n      \n    var functions = (\n        \"writeInfo|writeInfoLine|appendInfo|appendInfoLine|\" +\n        \"writeFile|writeFileLine|appendFile|appendFileLine|\" +\n        \"abs|round|floor|ceiling|min|max|imin|imax|\" +\n        \"sqrt|sin|cos|tan|arcsin|arccos|arctan|arctan2|sinc|sincpi|\" +\n        \"exp|ln|log10|log2|\" +\n        \"sinh|cosh|tanh|arcsinh|arccosh|actanh|\" +\n        \"sigmoid|invSigmoid|erf|erfc|\" +\n        \"randomUniform|randomInteger|randomGauss|randomPoisson|\" +\n        \"lnGamma|gaussP|gaussQ|invGaussQ|\" +\n        \"chiSquareP|chiSquareQ|invChiSquareQ|studentP|studentQ|invStudentQ|\" +\n        \"fisherP|fisherQ|invFisherQ|\" +\n        \"binomialP|binomialQ|invBinomialP|invBinomialQ|\" +\n        \"hertzToBark|barkToHerz|\" +\n        \"hertzToMel|melToHertz|\" +\n        \"hertzToSemitones|semitonesToHerz|\" +\n        \"erb|hertzToErb|erbToHertz|\" +\n        \"phonToDifferenceLimens|differenceLimensToPhon|\" +\n        \"beta|besselI|besselK|\" +\n        \"selected|selected\\\\$|numberOfSelected|variableExists|\"+\n        \"index|rindex|startsWith|endsWith|\"+\n        \"index_regex|rindex_regex|replace_regex\\\\$|\"+\n        \"length|extractWord\\\\$|extractLine\\\\$|extractNumber|\" +\n        \"left\\\\$|right\\\\$|mid\\\\$|replace\\\\$|\" +\n        \"beginPause|endPause|\" +\n        \"demoShow|demoWindowTitle|demoInput|demoWaitForInput|\" +\n        \"demoClicked|demoClickedIn|demoX|demoY|\" +\n        \"demoKeyPressed|demoKey\\\\$|\" +\n        \"demoExtraControlKeyPressed|demoShiftKeyPressed|\"+\n        \"demoCommandKeyPressed|demoOptionKeyPressed|\" +\n        \"environment\\\\$|chooseReadFile\\\\$|\" +\n        \"chooseDirectory\\\\$|createDirectory|fileReadable|deleteFile|\" +\n        \"selectObject|removeObject|plusObject|minusObject|\" +\n        \"runScript|exitScript|\" +\n        \"beginSendPraat|endSendPraat\"\n    );\n\n    var objectTypes = (\n        \"Activation|AffineTransform|AmplitudeTier|Art|Artword|Autosegment|\"  +\n        \"BarkFilter|CCA|Categories|Cepstrum|Cepstrumc|ChebyshevSeries|\"      +\n        \"ClassificationTable|Cochleagram|Collection|Configuration|\"          +\n        \"Confusion|ContingencyTable|Corpus|Correlation|Covariance|\"          +\n        \"CrossCorrelationTable|CrossCorrelationTables|DTW|Diagonalizer|\"     +\n        \"Discriminant|Dissimilarity|Distance|Distributions|DurationTier|\"    +\n        \"EEG|ERP|ERPTier|Eigen|Excitation|Excitations|ExperimentMFC|FFNet|\"  +\n        \"FeatureWeights|Formant|FormantFilter|FormantGrid|FormantPoint|\"     +\n        \"FormantTier|GaussianMixture|HMM|HMM_Observation|\"                   +\n        \"HMM_ObservationSequence|HMM_State|HMM_StateSequence|Harmonicity|\"   +\n        \"ISpline|Index|Intensity|IntensityTier|IntervalTier|KNN|KlattGrid|\"  +\n        \"KlattTable|LFCC|LPC|Label|LegendreSeries|LinearRegression|\"         +\n        \"LogisticRegression|LongSound|Ltas|MFCC|MSpline|ManPages|\"           +\n        \"Manipulation|Matrix|MelFilter|MixingMatrix|Movie|Network|\"          +\n        \"OTGrammar|OTHistory|OTMulti|PCA|PairDistribution|ParamCurve|\"       +\n        \"Pattern|Permutation|Pitch|PitchTier|PointProcess|Polygon|\"          +\n        \"Polynomial|Procrustes|RealPoint|RealTier|ResultsMFC|Roots|SPINET|\"  +\n        \"SSCP|SVD|Salience|ScalarProduct|Similarity|SimpleString|\"           +\n        \"SortedSetOfString|Sound|Speaker|Spectrogram|Spectrum|SpectrumTier|\" +\n        \"SpeechSynthesizer|SpellingChecker|Strings|StringsIndex|Table|\"      +\n        \"TableOfReal|TextGrid|TextInterval|TextPoint|TextTier|Tier|\"         +\n        \"Transition|VocalTract|Weight|WordList\"\n    );\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"string.interpolated\",\n                regex : /'((?:[a-z][a-zA-Z0-9_]*)(?:\\$|#|:[0-9]+)?)'/\n            }, {\n                token : [\"text\", \"text\", \"keyword.operator\", \"text\", \"keyword\"],\n                regex : /(^\\s*)(?:([a-z][a-zA-Z0-9_]*\\$?\\s+)(=)(\\s+))?(stopwatch)/\n            }, {\n                token : [\"text\", \"keyword\", \"text\", \"string\"],\n                regex : /(^\\s*)(print(?:line)?|echo|exit|pause|sendpraat|include|execute)(\\s+)(.*)/\n            }, {\n                token : [\"text\", \"keyword\"],\n                regex : \"(^\\\\s*)(\" + directives + \")$\"\n            }, {\n                token : [\"text\", \"keyword.operator\", \"text\"],\n                regex : /(\\s+)((?:\\+|-|\\/|\\*|<|>)=?|==?|!=|%|\\^|\\||and|or|not)(\\s+)/\n            }, {\n                token : [\"text\", \"text\", \"keyword.operator\", \"text\", \"keyword\", \"text\", \"keyword\"],\n                regex : /(^\\s*)(?:([a-z][a-zA-Z0-9_]*\\$?\\s+)(=)(\\s+))?(?:((?:no)?warn|nocheck|noprogress)(\\s+))?((?:[A-Z][^.:\"]+)(?:$|(?:\\.{3}|:)))/\n            }, {\n                token : [\"text\", \"keyword\", \"text\", \"keyword\"],\n                regex : /(^\\s*)(?:(demo)?(\\s+))((?:[A-Z][^.:\"]+)(?:$|(?:\\.{3}|:)))/\n            }, {\n                token : [\"text\", \"keyword\", \"text\", \"keyword\"],\n                regex : /^(\\s*)(?:(demo)(\\s+))?(10|12|14|16|24)$/\n            }, {\n                token : [\"text\", \"support.function\", \"text\"],\n                regex : /(\\s*)(do\\$?)(\\s*:\\s*|\\s*\\(\\s*)/\n            }, {\n                token : \"entity.name.type\",\n                regex : \"(\" + objectTypes + \")\"\n            }, {\n                token : \"variable.language\",\n                regex : \"(\" + predefinedVariables + \")\"\n            }, {\n                token : [\"support.function\", \"text\"],\n                regex : \"((?:\" + functions + \")\\\\$?)(\\\\s*(?::|\\\\())\"\n            }, {\n                token : \"keyword\",\n                regex : /(\\bfor\\b)/,\n                next : \"for\"\n            }, {\n                token : \"keyword\",\n                regex : \"(\\\\b(?:\" + keywords + \")\\\\b)\"\n            }, {\n                token : \"string\",\n                regex : /\"[^\"]*\"/\n            }, {\n                token : \"string\",\n                regex : /\"[^\"]*$/,\n                next : \"brokenstring\"\n            }, {\n                token : [\"text\", \"keyword\", \"text\", \"entity.name.section\"],\n                regex : /(^\\s*)(\\bform\\b)(\\s+)(.*)/,\n                next : \"form\"\n            }, {\n                token : \"constant.numeric\",\n                regex : /\\b[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\"keyword\", \"text\", \"entity.name.function\"],\n                regex : /(procedure)(\\s+)(\\S+)/\n            }, {\n                token : [\"entity.name.function\", \"text\"],\n                regex : /(@\\S+)(:|\\s*\\()/\n            }, {\n                token : [\"text\", \"keyword\", \"text\", \"entity.name.function\"],\n                regex : /(^\\s*)(call)(\\s+)(\\S+)/\n            }, {\n                token : \"comment\",\n                regex : /(^\\s*#|;).*$/\n            }, {\n                token : \"text\",\n                regex : /\\s+/\n            }\n        ],\n        \"form\" : [\n            {\n                token : [\"keyword\", \"text\", \"constant.numeric\"],\n                regex : /((?:optionmenu|choice)\\s+)(\\S+:\\s+)([0-9]+)/\n            }, {\n                token : [\"keyword\", \"constant.numeric\"],\n                regex : /((?:option|button)\\s+)([+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b)/\n            }, {\n                token : [\"keyword\", \"string\"],\n                regex : /((?:option|button)\\s+)(.*)/\n            }, {\n                token : [\"keyword\", \"text\", \"string\"],\n                regex : /((?:sentence|text)\\s+)(\\S+\\s*)(.*)/\n            }, {\n                token : [\"keyword\", \"text\", \"string\", \"invalid.illegal\"],\n                regex : /(word\\s+)(\\S+\\s*)(\\S+)?(\\s.*)?/\n            }, {\n                token : [\"keyword\", \"text\", \"constant.language\"],\n                regex : /(boolean\\s+)(\\S+\\s*)(0|1|\"?(?:yes|no)\"?)/\n            }, {\n                token : [\"keyword\", \"text\", \"constant.numeric\"],\n                regex : /((?:real|natural|positive|integer)\\s+)(\\S+\\s*)([+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b)/\n            }, {\n                token : [\"keyword\", \"string\"],\n                regex : /(comment\\s+)(.*)/\n            }, {\n                token : \"keyword\",\n                regex : 'endform',\n                next : \"start\"\n            }\n        ],\n        \"for\" : [\n            {\n                token : [\"keyword\", \"text\", \"constant.numeric\", \"text\"],\n                regex : /(from|to)(\\s+)([+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?)(\\s*)/\n            }, {\n                token : [\"keyword\", \"text\"],\n                regex : /(from|to)(\\s+\\S+\\s*)/\n            }, {\n                token : \"text\",\n                regex : /$/,\n                next : \"start\"\n            }\n        ],\n        \"brokenstring\" : [\n            {\n                token : [\"text\", \"string\"],\n                regex : /(\\s*\\.{3})([^\"]*)/\n            }, {\n                token : \"string\",\n                regex : /\"/,\n                next : \"start\"\n            }\n        ],\n    };\n};\n\noop.inherits(PraatHighlightRules, TextHighlightRules);\n\nexports.PraatHighlightRules = PraatHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/praat\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/praat_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar PraatHighlightRules = require(\"./praat_highlight_rules\").PraatHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = PraatHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"#\";\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[\\:]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/praat\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-prolog.js",
    "content": "ace.define(\"ace/mode/prolog_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar PrologHighlightRules = function() {\n\n    this.$rules = { start: \n       [ { include: '#comment' },\n         { include: '#basic_fact' },\n         { include: '#rule' },\n         { include: '#directive' },\n         { include: '#fact' } ],\n      '#atom': \n       [ { token: 'constant.other.atom.prolog',\n           regex: '\\\\b[a-z][a-zA-Z0-9_]*\\\\b' },\n         { token: 'constant.numeric.prolog',\n           regex: '-?\\\\d+(?:\\\\.\\\\d+)?' },\n         { include: '#string' } ],\n      '#basic_elem': \n       [ { include: '#comment' },\n         { include: '#statement' },\n         { include: '#constants' },\n         { include: '#operators' },\n         { include: '#builtins' },\n         { include: '#list' },\n         { include: '#atom' },\n         { include: '#variable' } ],\n      '#basic_fact': \n       [ { token: \n            [ 'entity.name.function.fact.basic.prolog',\n              'punctuation.end.fact.basic.prolog' ],\n           regex: '([a-z]\\\\w*)(\\\\.)' } ],\n      '#builtins': \n       [ { token: 'support.function.builtin.prolog',\n           regex: '\\\\b(?:abolish|abort|ancestors|arg|ascii|assert[az]|atom(?:ic)?|body|char|close|conc|concat|consult|define|definition|dynamic|dump|fail|file|free|free_proc|functor|getc|goal|halt|head|head|integer|length|listing|match_args|member|next_clause|nl|nonvar|nth|number|cvars|nvars|offset|op|print?|prompt|putc|quoted|ratom|read|redefine|rename|retract(?:all)?|see|seeing|seen|skip|spy|statistics|system|tab|tell|telling|term|time|told|univ|unlink_clause|unspy_predicate|var|write)\\\\b' } ],\n      '#comment': \n       [ { token: \n            [ 'punctuation.definition.comment.prolog',\n              'comment.line.percentage.prolog' ],\n           regex: '(%)(.*$)' },\n         { token: 'punctuation.definition.comment.prolog',\n           regex: '/\\\\*',\n           push: \n            [ { token: 'punctuation.definition.comment.prolog',\n                regex: '\\\\*/',\n                next: 'pop' },\n              { defaultToken: 'comment.block.prolog' } ] } ],\n      '#constants': \n       [ { token: 'constant.language.prolog',\n           regex: '\\\\b(?:true|false|yes|no)\\\\b' } ],\n      '#directive': \n       [ { token: 'keyword.operator.directive.prolog',\n           regex: ':-',\n           push: \n            [ { token: 'meta.directive.prolog', regex: '\\\\.', next: 'pop' },\n              { include: '#comment' },\n              { include: '#statement' },\n              { defaultToken: 'meta.directive.prolog' } ] } ],\n      '#expr': \n       [ { include: '#comments' },\n         { token: 'meta.expression.prolog',\n           regex: '\\\\(',\n           push: \n            [ { token: 'meta.expression.prolog', regex: '\\\\)', next: 'pop' },\n              { include: '#expr' },\n              { defaultToken: 'meta.expression.prolog' } ] },\n         { token: 'keyword.control.cutoff.prolog', regex: '!' },\n         { token: 'punctuation.control.and.prolog', regex: ',' },\n         { token: 'punctuation.control.or.prolog', regex: ';' },\n         { include: '#basic_elem' } ],\n      '#fact': \n       [ { token: \n            [ 'entity.name.function.fact.prolog',\n              'punctuation.begin.fact.parameters.prolog' ],\n           regex: '([a-z]\\\\w*)(\\\\()(?!.*:-)',\n           push: \n            [ { token: \n                 [ 'punctuation.end.fact.parameters.prolog',\n                   'punctuation.end.fact.prolog' ],\n                regex: '(\\\\))(\\\\.?)',\n                next: 'pop' },\n              { include: '#parameter' },\n              { defaultToken: 'meta.fact.prolog' } ] } ],\n      '#list': \n       [ { token: 'punctuation.begin.list.prolog',\n           regex: '\\\\[(?=.*\\\\])',\n           push: \n            [ { token: 'punctuation.end.list.prolog',\n                regex: '\\\\]',\n                next: 'pop' },\n              { include: '#comment' },\n              { token: 'punctuation.separator.list.prolog', regex: ',' },\n              { token: 'punctuation.concat.list.prolog',\n                regex: '\\\\|',\n                push: \n                 [ { token: 'meta.list.concat.prolog',\n                     regex: '(?=\\\\s*\\\\])',\n                     next: 'pop' },\n                   { include: '#basic_elem' },\n                   { defaultToken: 'meta.list.concat.prolog' } ] },\n              { include: '#basic_elem' },\n              { defaultToken: 'meta.list.prolog' } ] } ],\n      '#operators': \n       [ { token: 'keyword.operator.prolog',\n           regex: '\\\\\\\\\\\\+|\\\\bnot\\\\b|\\\\bis\\\\b|->|[><]|[><\\\\\\\\:=]?=|(?:=\\\\\\\\|\\\\\\\\=)=' } ],\n      '#parameter': \n       [ { token: 'variable.language.anonymous.prolog',\n           regex: '\\\\b_\\\\b' },\n         { token: 'variable.parameter.prolog',\n           regex: '\\\\b[A-Z_]\\\\w*\\\\b' },\n         { token: 'punctuation.separator.parameters.prolog', regex: ',' },\n         { include: '#basic_elem' },\n         { token: 'text', regex: '[^\\\\s]' } ],\n      '#rule': \n       [ { token: 'meta.rule.prolog',\n           regex: '(?=[a-z]\\\\w*.*:-)',\n           push: \n            [ { token: 'punctuation.rule.end.prolog',\n                regex: '\\\\.',\n                next: 'pop' },\n              { token: 'meta.rule.signature.prolog',\n                regex: '(?=[a-z]\\\\w*.*:-)',\n                push: \n                 [ { token: 'meta.rule.signature.prolog',\n                     regex: '(?=:-)',\n                     next: 'pop' },\n                   { token: 'entity.name.function.rule.prolog',\n                     regex: '[a-z]\\\\w*(?=\\\\(|\\\\s*:-)' },\n                   { token: 'punctuation.rule.parameters.begin.prolog',\n                     regex: '\\\\(',\n                     push: \n                      [ { token: 'punctuation.rule.parameters.end.prolog',\n                          regex: '\\\\)',\n                          next: 'pop' },\n                        { include: '#parameter' },\n                        { defaultToken: 'meta.rule.parameters.prolog' } ] },\n                   { defaultToken: 'meta.rule.signature.prolog' } ] },\n              { token: 'keyword.operator.definition.prolog',\n                regex: ':-',\n                push: \n                 [ { token: 'meta.rule.definition.prolog',\n                     regex: '(?=\\\\.)',\n                     next: 'pop' },\n                   { include: '#comment' },\n                   { include: '#expr' },\n                   { defaultToken: 'meta.rule.definition.prolog' } ] },\n              { defaultToken: 'meta.rule.prolog' } ] } ],\n      '#statement': \n       [ { token: 'meta.statement.prolog',\n           regex: '(?=[a-z]\\\\w*\\\\()',\n           push: \n            [ { token: 'punctuation.end.statement.parameters.prolog',\n                regex: '\\\\)',\n                next: 'pop' },\n              { include: '#builtins' },\n              { include: '#atom' },\n              { token: 'punctuation.begin.statement.parameters.prolog',\n                regex: '\\\\(',\n                push: \n                 [ { token: 'meta.statement.parameters.prolog',\n                     regex: '(?=\\\\))',\n                     next: 'pop' },\n                   { token: 'punctuation.separator.statement.prolog', regex: ',' },\n                   { include: '#basic_elem' },\n                   { defaultToken: 'meta.statement.parameters.prolog' } ] },\n              { defaultToken: 'meta.statement.prolog' } ] } ],\n      '#string': \n       [ { token: 'punctuation.definition.string.begin.prolog',\n           regex: '\\'',\n           push: \n            [ { token: 'punctuation.definition.string.end.prolog',\n                regex: '\\'',\n                next: 'pop' },\n              { token: 'constant.character.escape.prolog', regex: '\\\\\\\\.' },\n              { token: 'constant.character.escape.quote.prolog',\n                regex: '\\'\\'' },\n              { defaultToken: 'string.quoted.single.prolog' } ] } ],\n      '#variable': \n       [ { token: 'variable.language.anonymous.prolog',\n           regex: '\\\\b_\\\\b' },\n         { token: 'variable.other.prolog',\n           regex: '\\\\b[A-Z_][a-zA-Z0-9_]*\\\\b' } ] }\n    \n    this.normalizeRules();\n};\n\nPrologHighlightRules.metaData = { fileTypes: [ 'plg', 'prolog' ],\n      foldingStartMarker: '(%\\\\s*region \\\\w*)|([a-z]\\\\w*.*:- ?)',\n      foldingStopMarker: '(%\\\\s*end(\\\\s*region)?)|(?=\\\\.)',\n      keyEquivalent: '^~P',\n      name: 'Prolog',\n      scopeName: 'source.prolog' }\n\n\noop.inherits(PrologHighlightRules, TextHighlightRules);\n\nexports.PrologHighlightRules = PrologHighlightRules;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/prolog\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/prolog_highlight_rules\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar PrologHighlightRules = require(\"./prolog_highlight_rules\").PrologHighlightRules;\nvar FoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = PrologHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"%\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n    this.$id = \"ace/mode/prolog\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-properties.js",
    "content": "ace.define(\"ace/mode/properties_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar PropertiesHighlightRules = function() {\n\n    var escapeRe = /\\\\u[0-9a-fA-F]{4}|\\\\/;\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : /[!#].*$/\n            }, {\n                token : \"keyword\",\n                regex : /[=:]$/\n            }, {\n                token : \"keyword\",\n                regex : /[=:]/,\n                next  : \"value\"\n            }, {\n                token : \"constant.language.escape\",\n                regex : escapeRe\n            }, {\n                defaultToken: \"variable\"\n            }\n        ],\n        \"value\" : [\n            {\n                regex : /\\\\$/,\n                token : \"string\",\n                next : \"value\"\n            }, {\n                regex : /$/,\n                token : \"string\",\n                next : \"start\"\n            }, {\n                token : \"constant.language.escape\",\n                regex : escapeRe\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n\n};\n\noop.inherits(PropertiesHighlightRules, TextHighlightRules);\n\nexports.PropertiesHighlightRules = PropertiesHighlightRules;\n});\n\nace.define(\"ace/mode/properties\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/properties_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar PropertiesHighlightRules = require(\"./properties_highlight_rules\").PropertiesHighlightRules;\n\nvar Mode = function() {\n    this.HighlightRules = PropertiesHighlightRules;\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.$id = \"ace/mode/properties\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-protobuf.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/c_cpp_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar cFunctions = exports.cFunctions = \"\\\\b(?:hypot(?:f|l)?|s(?:scanf|ystem|nprintf|ca(?:nf|lb(?:n(?:f|l)?|ln(?:f|l)?))|i(?:n(?:h(?:f|l)?|f|l)?|gn(?:al|bit))|tr(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?)|error|pbrk|ftime|len|rchr|xfrm)|printf|et(?:jmp|vbuf|locale|buf)|qrt(?:f|l)?|w(?:scanf|printf)|rand)|n(?:e(?:arbyint(?:f|l)?|xt(?:toward(?:f|l)?|after(?:f|l)?))|an(?:f|l)?)|c(?:s(?:in(?:h(?:f|l)?|f|l)?|qrt(?:f|l)?)|cos(?:h(?:f)?|f|l)?|imag(?:f|l)?|t(?:ime|an(?:h(?:f|l)?|f|l)?)|o(?:s(?:h(?:f|l)?|f|l)?|nj(?:f|l)?|pysign(?:f|l)?)|p(?:ow(?:f|l)?|roj(?:f|l)?)|e(?:il(?:f|l)?|xp(?:f|l)?)|l(?:o(?:ck|g(?:f|l)?)|earerr)|a(?:sin(?:h(?:f|l)?|f|l)?|cos(?:h(?:f|l)?|f|l)?|tan(?:h(?:f|l)?|f|l)?|lloc|rg(?:f|l)?|bs(?:f|l)?)|real(?:f|l)?|brt(?:f|l)?)|t(?:ime|o(?:upper|lower)|an(?:h(?:f|l)?|f|l)?|runc(?:f|l)?|gamma(?:f|l)?|mp(?:nam|file))|i(?:s(?:space|n(?:ormal|an)|cntrl|inf|digit|u(?:nordered|pper)|p(?:unct|rint)|finite|w(?:space|c(?:ntrl|type)|digit|upper|p(?:unct|rint)|lower|al(?:num|pha)|graph|xdigit|blank)|l(?:ower|ess(?:equal|greater)?)|al(?:num|pha)|gr(?:eater(?:equal)?|aph)|xdigit|blank)|logb(?:f|l)?|max(?:div|abs))|di(?:v|fftime)|_Exit|unget(?:c|wc)|p(?:ow(?:f|l)?|ut(?:s|c(?:har)?|wc(?:har)?)|error|rintf)|e(?:rf(?:c(?:f|l)?|f|l)?|x(?:it|p(?:2(?:f|l)?|f|l|m1(?:f|l)?)?))|v(?:s(?:scanf|nprintf|canf|printf|w(?:scanf|printf))|printf|f(?:scanf|printf|w(?:scanf|printf))|w(?:scanf|printf)|a_(?:start|copy|end|arg))|qsort|f(?:s(?:canf|e(?:tpos|ek))|close|tell|open|dim(?:f|l)?|p(?:classify|ut(?:s|c|w(?:s|c))|rintf)|e(?:holdexcept|set(?:e(?:nv|xceptflag)|round)|clearexcept|testexcept|of|updateenv|r(?:aiseexcept|ror)|get(?:e(?:nv|xceptflag)|round))|flush|w(?:scanf|ide|printf|rite)|loor(?:f|l)?|abs(?:f|l)?|get(?:s|c|pos|w(?:s|c))|re(?:open|e|ad|xp(?:f|l)?)|m(?:in(?:f|l)?|od(?:f|l)?|a(?:f|l|x(?:f|l)?)?))|l(?:d(?:iv|exp(?:f|l)?)|o(?:ngjmp|cal(?:time|econv)|g(?:1(?:p(?:f|l)?|0(?:f|l)?)|2(?:f|l)?|f|l|b(?:f|l)?)?)|abs|l(?:div|abs|r(?:int(?:f|l)?|ound(?:f|l)?))|r(?:int(?:f|l)?|ound(?:f|l)?)|gamma(?:f|l)?)|w(?:scanf|c(?:s(?:s(?:tr|pn)|nc(?:py|at|mp)|c(?:spn|hr|oll|py|at|mp)|to(?:imax|d|u(?:l(?:l)?|max)|k|f|l(?:d|l)?|mbs)|pbrk|ftime|len|r(?:chr|tombs)|xfrm)|to(?:b|mb)|rtomb)|printf|mem(?:set|c(?:hr|py|mp)|move))|a(?:s(?:sert|ctime|in(?:h(?:f|l)?|f|l)?)|cos(?:h(?:f|l)?|f|l)?|t(?:o(?:i|f|l(?:l)?)|exit|an(?:h(?:f|l)?|2(?:f|l)?|f|l)?)|b(?:s|ort))|g(?:et(?:s|c(?:har)?|env|wc(?:har)?)|mtime)|r(?:int(?:f|l)?|ound(?:f|l)?|e(?:name|alloc|wind|m(?:ove|quo(?:f|l)?|ainder(?:f|l)?))|a(?:nd|ise))|b(?:search|towc)|m(?:odf(?:f|l)?|em(?:set|c(?:hr|py|mp)|move)|ktime|alloc|b(?:s(?:init|towcs|rtowcs)|towc|len|r(?:towc|len))))\\\\b\"\n\nvar c_cppHighlightRules = function() {\n\n    var keywordControls = (\n        \"break|case|continue|default|do|else|for|goto|if|_Pragma|\" +\n        \"return|switch|while|catch|operator|try|throw|using\"\n    );\n    \n    var storageType = (\n        \"asm|__asm__|auto|bool|_Bool|char|_Complex|double|enum|float|\" +\n        \"_Imaginary|int|long|short|signed|struct|typedef|union|unsigned|void|\" +\n        \"class|wchar_t|template\"\n    );\n\n    var storageModifiers = (\n        \"const|extern|register|restrict|static|volatile|inline|private|\" +\n        \"protected|public|friend|explicit|virtual|export|mutable|typename|\" +\n        \"constexpr|new|delete\"\n    );\n\n    var keywordOperators = (\n        \"and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|typeid|xor|xor_eq\" +\n        \"const_cast|dynamic_cast|reinterpret_cast|static_cast|sizeof|namespace\"\n    );\n\n    var builtinConstants = (\n        \"NULL|true|false|TRUE|FALSE\"\n    );\n\n    var keywordMapper = this.$keywords = this.createKeywordMapper({\n        \"keyword.control\" : keywordControls,\n        \"storage.type\" : storageType,\n        \"storage.modifier\" : storageModifiers,\n        \"keyword.operator\" : keywordOperators,\n        \"variable.language\": \"this\",\n        \"constant.language\": builtinConstants\n    }, \"identifier\");\n\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    this.$rules = { \n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"//\",\n                next : \"singleLineComment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                regex : '[\"].*\\\\\\\\$',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"string\", // multi line string start\n                regex : \"['].*\\\\\\\\$\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\\\\b\"\n            }, {\n                token : \"keyword\", // pre-compiler directives\n                regex : \"#\\\\s*(?:include|import|pragma|line|define|undef|if|ifdef|else|elif|ifndef)\\\\b\",\n                next  : \"directive\"\n            }, {\n                token : \"keyword\", // special case pre-compiler directive\n                regex : \"(?:#\\\\s*endif)\\\\b\"\n            }, {\n                token : \"support.function.C99.c\",\n                regex : cFunctions\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)\"\n            }, {\n              token : \"punctuation.operator\",\n              regex : \"\\\\?|\\\\:|\\\\,|\\\\;|\\\\.\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ],\n        \"singleLineComment\" : [\n            {\n                token : \"comment\",\n                regex : /\\\\$/,\n                next : \"singleLineComment\"\n            }, {\n                token : \"comment\",\n                regex : /$/,\n                next : \"start\"\n            }, {\n                defaultToken: \"comment\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n                next : \"start\"\n            }, {\n                defaultToken : \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n                next : \"start\"\n            }, {\n                defaultToken : \"string\"\n            }\n        ],\n        \"directive\" : [\n            {\n                token : \"constant.other.multiline\",\n                regex : /\\\\/\n            },\n            {\n                token : \"constant.other.multiline\",\n                regex : /.*\\\\/\n            },\n            {\n                token : \"constant.other\",\n                regex : \"\\\\s*<.+?>\",\n                next : \"start\"\n            },\n            {\n                token : \"constant.other\", // single line\n                regex : '\\\\s*[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]',\n                next : \"start\"\n            }, \n            {\n                token : \"constant.other\", // single line\n                regex : \"\\\\s*['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\",\n                next : \"start\"\n            },\n            {\n                token : \"constant.other\",\n                regex : /[^\\\\\\/]+/,\n                next : \"start\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(c_cppHighlightRules, TextHighlightRules);\n\nexports.c_cppHighlightRules = c_cppHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/c_cpp\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/c_cpp_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar c_cppHighlightRules = require(\"./c_cpp_highlight_rules\").c_cppHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = c_cppHighlightRules;\n\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/c_cpp\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/protobuf_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n    \"use strict\";\n\n    var oop = require(\"../lib/oop\");\n    var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\n    var ProtobufHighlightRules = function() {\n\n        var builtinTypes = \"double|float|int32|int64|uint32|uint64|sint32|\" +\n                           \"sint64|fixed32|fixed64|sfixed32|sfixed64|bool|\" +\n                           \"string|bytes\";\n        var keywordDeclaration = \"message|required|optional|repeated|package|\" +\n                                 \"import|option|enum\";\n\n        var keywordMapper = this.createKeywordMapper({\n            \"keyword.declaration.protobuf\": keywordDeclaration,\n            \"support.type\": builtinTypes\n        }, \"identifier\");\n\n        this.$rules = {\n            \"start\": [{\n                    token: \"comment\",\n                    regex: /\\/\\/.*$/\n                }, {\n                    token: \"comment\",\n                    regex: /\\/\\*/,\n                    next: \"comment\"\n                }, {\n                    token: \"constant\",\n                    regex: \"<[^>]+>\"\n                }, {\n                    regex: \"=\",\n                    token: \"keyword.operator.assignment.protobuf\"\n                }, {\n                    token : \"string\", // single line\n                    regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n                }, {\n                    token : \"string\", // single line\n                    regex : '[\\'](?:(?:\\\\\\\\.)|(?:[^\\'\\\\\\\\]))*?[\\']'\n                }, {\n                    token: \"constant.numeric\", // hex\n                    regex: \"0[xX][0-9a-fA-F]+\\\\b\"\n                }, {\n                    token: \"constant.numeric\", // float\n                    regex: \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n                }, {\n                    token: keywordMapper,\n                    regex: \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n                }],\n            \"comment\": [{\n                    token: \"comment\", // closing comment\n                    regex: \".*?\\\\*\\\\/\",\n                    next: \"start\"\n                }, {\n                    token: \"comment\", // comment spanning whole line\n                    regex: \".+\"\n                }]\n        };\n\n        this.normalizeRules();\n    };\n\n    oop.inherits(ProtobufHighlightRules, TextHighlightRules);\n\n    exports.ProtobufHighlightRules = ProtobufHighlightRules;\n});\n\nace.define(\"ace/mode/protobuf\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/c_cpp\",\"ace/mode/protobuf_highlight_rules\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar CMode = require(\"./c_cpp\").Mode;\nvar ProtobufHighlightRules = require(\"./protobuf_highlight_rules\").ProtobufHighlightRules;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    CMode.call(this);\n    this.foldingRules = new CStyleFoldMode();\n    this.HighlightRules = ProtobufHighlightRules;\n};\noop.inherits(Mode, CMode);\n\n(function() {\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n    this.$id = \"ace/mode/protobuf\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-python.js",
    "content": "ace.define(\"ace/mode/python_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar PythonHighlightRules = function() {\n\n    var keywords = (\n        \"and|as|assert|break|class|continue|def|del|elif|else|except|exec|\" +\n        \"finally|for|from|global|if|import|in|is|lambda|not|or|pass|print|\" +\n        \"raise|return|try|while|with|yield\"\n    );\n\n    var builtinConstants = (\n        \"True|False|None|NotImplemented|Ellipsis|__debug__\"\n    );\n\n    var builtinFunctions = (\n        \"abs|divmod|input|open|staticmethod|all|enumerate|int|ord|str|any|\" +\n        \"eval|isinstance|pow|sum|basestring|execfile|issubclass|print|super|\" +\n        \"binfile|iter|property|tuple|bool|filter|len|range|type|bytearray|\" +\n        \"float|list|raw_input|unichr|callable|format|locals|reduce|unicode|\" +\n        \"chr|frozenset|long|reload|vars|classmethod|getattr|map|repr|xrange|\" +\n        \"cmp|globals|max|reversed|zip|compile|hasattr|memoryview|round|\" +\n        \"__import__|complex|hash|min|set|apply|delattr|help|next|setattr|\" +\n        \"buffer|dict|hex|object|slice|coerce|dir|id|oct|sorted|intern\"\n    );\n    var keywordMapper = this.createKeywordMapper({\n        \"invalid.deprecated\": \"debugger\",\n        \"support.function\": builtinFunctions,\n        \"constant.language\": builtinConstants,\n        \"keyword\": keywords\n    }, \"identifier\");\n\n    var strPre = \"(?:r|u|ur|R|U|UR|Ur|uR)?\";\n\n    var decimalInteger = \"(?:(?:[1-9]\\\\d*)|(?:0))\";\n    var octInteger = \"(?:0[oO]?[0-7]+)\";\n    var hexInteger = \"(?:0[xX][\\\\dA-Fa-f]+)\";\n    var binInteger = \"(?:0[bB][01]+)\";\n    var integer = \"(?:\" + decimalInteger + \"|\" + octInteger + \"|\" + hexInteger + \"|\" + binInteger + \")\";\n\n    var exponent = \"(?:[eE][+-]?\\\\d+)\";\n    var fraction = \"(?:\\\\.\\\\d+)\";\n    var intPart = \"(?:\\\\d+)\";\n    var pointFloat = \"(?:(?:\" + intPart + \"?\" + fraction + \")|(?:\" + intPart + \"\\\\.))\";\n    var exponentFloat = \"(?:(?:\" + pointFloat + \"|\" +  intPart + \")\" + exponent + \")\";\n    var floatNumber = \"(?:\" + exponentFloat + \"|\" + pointFloat + \")\";\n\n    var stringEscape =  \"\\\\\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\\\\\abfnrtv'\\\"]|U[0-9A-Fa-f]{8}|u[0-9A-Fa-f]{4})\";\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment\",\n            regex : \"#.*$\"\n        }, {\n            token : \"string\",           // multi line \"\"\" string start\n            regex : strPre + '\"{3}',\n            next : \"qqstring3\"\n        }, {\n            token : \"string\",           // \" string\n            regex : strPre + '\"(?=.)',\n            next : \"qqstring\"\n        }, {\n            token : \"string\",           // multi line ''' string start\n            regex : strPre + \"'{3}\",\n            next : \"qstring3\"\n        }, {\n            token : \"string\",           // ' string\n            regex : strPre + \"'(?=.)\",\n            next : \"qstring\"\n        }, {\n            token : \"constant.numeric\", // imaginary\n            regex : \"(?:\" + floatNumber + \"|\\\\d+)[jJ]\\\\b\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : floatNumber\n        }, {\n            token : \"constant.numeric\", // long integer\n            regex : integer + \"[lL]\\\\b\"\n        }, {\n            token : \"constant.numeric\", // integer\n            regex : integer + \"\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\\\+|\\\\-|\\\\*|\\\\*\\\\*|\\\\/|\\\\/\\\\/|%|<<|>>|&|\\\\||\\\\^|~|<|>|<=|=>|==|!=|<>|=\"\n        }, {\n            token : \"paren.lparen\",\n            regex : \"[\\\\[\\\\(\\\\{]\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\]\\\\)\\\\}]\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        } ],\n        \"qqstring3\" : [ {\n            token : \"constant.language.escape\",\n            regex : stringEscape\n        }, {\n            token : \"string\", // multi line \"\"\" string end\n            regex : '\"{3}',\n            next : \"start\"\n        }, {\n            defaultToken : \"string\"\n        } ],\n        \"qstring3\" : [ {\n            token : \"constant.language.escape\",\n            regex : stringEscape\n        }, {\n            token : \"string\",  // multi line ''' string end\n            regex : \"'{3}\",\n            next : \"start\"\n        }, {\n            defaultToken : \"string\"\n        } ],\n        \"qqstring\" : [{\n            token : \"constant.language.escape\",\n            regex : stringEscape\n        }, {\n            token : \"string\",\n            regex : \"\\\\\\\\$\",\n            next  : \"qqstring\"\n        }, {\n            token : \"string\",\n            regex : '\"|$',\n            next  : \"start\"\n        }, {\n            defaultToken: \"string\"\n        }],\n        \"qstring\" : [{\n            token : \"constant.language.escape\",\n            regex : stringEscape\n        }, {\n            token : \"string\",\n            regex : \"\\\\\\\\$\",\n            next  : \"qstring\"\n        }, {\n            token : \"string\",\n            regex : \"'|$\",\n            next  : \"start\"\n        }, {\n            defaultToken: \"string\"\n        }]\n    };\n};\n\noop.inherits(PythonHighlightRules, TextHighlightRules);\n\nexports.PythonHighlightRules = PythonHighlightRules;\n});\n\nace.define(\"ace/mode/folding/pythonic\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(markers) {\n    this.foldingStartMarker = new RegExp(\"([\\\\[{])(?:\\\\s*)$|(\" + markers + \")(?:\\\\s*)(?:#.*)?$\");\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, match.index);\n            if (match[2])\n                return this.indentationBlock(session, row, match.index + match[2].length);\n            return this.indentationBlock(session, row);\n        }\n    }\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/python\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/python_highlight_rules\",\"ace/mode/folding/pythonic\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar PythonHighlightRules = require(\"./python_highlight_rules\").PythonHighlightRules;\nvar PythonFoldMode = require(\"./folding/pythonic\").FoldMode;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.HighlightRules = PythonHighlightRules;\n    this.foldingRules = new PythonFoldMode(\"\\\\:\");\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"#\";\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[\\:]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    var outdents = {\n        \"pass\": 1,\n        \"return\": 1,\n        \"raise\": 1,\n        \"break\": 1,\n        \"continue\": 1\n    };\n    \n    this.checkOutdent = function(state, line, input) {\n        if (input !== \"\\r\\n\" && input !== \"\\r\" && input !== \"\\n\")\n            return false;\n\n        var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens;\n        \n        if (!tokens)\n            return false;\n        do {\n            var last = tokens.pop();\n        } while (last && (last.type == \"comment\" || (last.type == \"text\" && last.value.match(/^\\s+$/))));\n        \n        if (!last)\n            return false;\n        \n        return (last.type == \"keyword\" && outdents[last.value]);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        \n        row += 1;\n        var indent = this.$getIndent(doc.getLine(row));\n        var tab = doc.getTabString();\n        if (indent.slice(-tab.length) == tab)\n            doc.remove(new Range(row, indent.length-tab.length, row, indent.length));\n    };\n\n    this.$id = \"ace/mode/python\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-r.js",
    "content": "ace.define(\"ace/mode/tex_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar TexHighlightRules = function(textClass) {\n\n    if (!textClass)\n        textClass = \"text\";\n\n    this.$rules = {\n        \"start\" : [\n\t        {\n\t            token : \"comment\",\n\t            regex : \"%.*$\"\n\t        }, {\n\t            token : textClass, // non-command\n\t            regex : \"\\\\\\\\[$&%#\\\\{\\\\}]\"\n\t        }, {\n\t            token : \"keyword\", // command\n\t            regex : \"\\\\\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\\\b\",\n               next : \"nospell\"\n\t        }, {\n\t            token : \"keyword\", // command\n\t            regex : \"\\\\\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])\"\n\t        }, {\n               token : \"paren.keyword.operator\",\n\t            regex : \"[[({]\"\n\t        }, {\n               token : \"paren.keyword.operator\",\n\t            regex : \"[\\\\])}]\"\n\t        }, {\n\t            token : textClass,\n\t            regex : \"\\\\s+\"\n\t        }\n        ],\n        \"nospell\" : [\n           {\n               token : \"comment\",\n               regex : \"%.*$\",\n               next : \"start\"\n           }, {\n               token : \"nospell.\" + textClass, // non-command\n               regex : \"\\\\\\\\[$&%#\\\\{\\\\}]\"\n           }, {\n               token : \"keyword\", // command\n               regex : \"\\\\\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\\\b\"\n           }, {\n               token : \"keyword\", // command\n               regex : \"\\\\\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])\",\n               next : \"start\"\n           }, {\n               token : \"paren.keyword.operator\",\n               regex : \"[[({]\"\n           }, {\n               token : \"paren.keyword.operator\",\n               regex : \"[\\\\])]\"\n           }, {\n               token : \"paren.keyword.operator\",\n               regex : \"}\",\n               next : \"start\"\n           }, {\n               token : \"nospell.\" + textClass,\n               regex : \"\\\\s+\"\n           }, {\n               token : \"nospell.\" + textClass,\n               regex : \"\\\\w+\"\n           }\n        ]\n    };\n};\n\noop.inherits(TexHighlightRules, TextHighlightRules);\n\nexports.TexHighlightRules = TexHighlightRules;\n});\n\nace.define(\"ace/mode/r_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\",\"ace/mode/tex_highlight_rules\"], function(require, exports, module)\n{\n\n   var oop = require(\"../lib/oop\");\n   var lang = require(\"../lib/lang\");\n   var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n   var TexHighlightRules = require(\"./tex_highlight_rules\").TexHighlightRules;\n\n   var RHighlightRules = function()\n   {\n\n      var keywords = lang.arrayToMap(\n            (\"function|if|in|break|next|repeat|else|for|return|switch|while|try|tryCatch|stop|warning|require|library|attach|detach|source|setMethod|setGeneric|setGroupGeneric|setClass\")\n                  .split(\"|\")\n            );\n\n      var buildinConstants = lang.arrayToMap(\n            (\"NULL|NA|TRUE|FALSE|T|F|Inf|NaN|NA_integer_|NA_real_|NA_character_|\" +\n             \"NA_complex_\").split(\"|\")\n            );\n\n      this.$rules = {\n         \"start\" : [\n            {\n               token : \"comment.sectionhead\",\n               regex : \"#+(?!').*(?:----|====|####)\\\\s*$\"\n            },\n            {\n               token : \"comment\",\n               regex : \"#+'\",\n               next : \"rd-start\"\n            },\n            {\n               token : \"comment\",\n               regex : \"#.*$\"\n            },\n            {\n               token : \"string\", // multi line string start\n               regex : '[\"]',\n               next : \"qqstring\"\n            },\n            {\n               token : \"string\", // multi line string start\n               regex : \"[']\",\n               next : \"qstring\"\n            },\n            {\n               token : \"constant.numeric\", // hex\n               regex : \"0[xX][0-9a-fA-F]+[Li]?\\\\b\"\n            },\n            {\n               token : \"constant.numeric\", // explicit integer\n               regex : \"\\\\d+L\\\\b\"\n            },\n            {\n               token : \"constant.numeric\", // number\n               regex : \"\\\\d+(?:\\\\.\\\\d*)?(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\"\n            },\n            {\n               token : \"constant.numeric\", // number with leading decimal\n               regex : \"\\\\.\\\\d+(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\"\n            },\n            {\n               token : \"constant.language.boolean\",\n               regex : \"(?:TRUE|FALSE|T|F)\\\\b\"\n            },\n            {\n               token : \"identifier\",\n               regex : \"`.*?`\"\n            },\n            {\n               onMatch : function(value) {\n                  if (keywords[value])\n                     return \"keyword\";\n                  else if (buildinConstants[value])\n                     return \"constant.language\";\n                  else if (value == '...' || value.match(/^\\.\\.\\d+$/))\n                     return \"variable.language\";\n                  else\n                     return \"identifier\";\n               },\n               regex : \"[a-zA-Z.][a-zA-Z0-9._]*\\\\b\"\n            },\n            {\n               token : \"keyword.operator\",\n               regex : \"%%|>=|<=|==|!=|\\\\->|<\\\\-|\\\\|\\\\||&&|=|\\\\+|\\\\-|\\\\*|/|\\\\^|>|<|!|&|\\\\||~|\\\\$|:\"\n            },\n            {\n               token : \"keyword.operator\", // infix operators\n               regex : \"%.*?%\"\n            },\n            {\n               token : \"paren.keyword.operator\",\n               regex : \"[[({]\"\n            },\n            {\n               token : \"paren.keyword.operator\",\n               regex : \"[\\\\])}]\"\n            },\n            {\n               token : \"text\",\n               regex : \"\\\\s+\"\n            }\n         ],\n         \"qqstring\" : [\n            {\n               token : \"string\",\n               regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n               next : \"start\"\n            },\n            {\n               token : \"string\",\n               regex : '.+'\n            }\n         ],\n         \"qstring\" : [\n            {\n               token : \"string\",\n               regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n               next : \"start\"\n            },\n            {\n               token : \"string\",\n               regex : '.+'\n            }\n         ]\n      };\n\n      var rdRules = new TexHighlightRules(\"comment\").getRules();\n      for (var i = 0; i < rdRules[\"start\"].length; i++) {\n         rdRules[\"start\"][i].token += \".virtual-comment\";\n      }\n\n      this.addRules(rdRules, \"rd-\");\n      this.$rules[\"rd-start\"].unshift({\n          token: \"text\",\n          regex: \"^\",\n          next: \"start\"\n      });\n      this.$rules[\"rd-start\"].unshift({\n         token : \"keyword\",\n         regex : \"@(?!@)[^ ]*\"\n      });\n      this.$rules[\"rd-start\"].unshift({\n         token : \"comment\",\n         regex : \"@@\"\n      });\n      this.$rules[\"rd-start\"].push({\n         token : \"comment\",\n         regex : \"[^%\\\\\\\\[({\\\\])}]+\"\n      });\n   };\n\n   oop.inherits(RHighlightRules, TextHighlightRules);\n\n   exports.RHighlightRules = RHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/r\",[\"require\",\"exports\",\"module\",\"ace/range\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/text_highlight_rules\",\"ace/mode/r_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/unicode\"], function(require, exports, module) {\n   \"use strict\";\n\n   var Range = require(\"../range\").Range;\n   var oop = require(\"../lib/oop\");\n   var TextMode = require(\"./text\").Mode;\n   var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n   var RHighlightRules = require(\"./r_highlight_rules\").RHighlightRules;\n   var MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\n   var unicode = require(\"../unicode\");\n\n   var Mode = function()\n   {\n      this.HighlightRules = RHighlightRules;\n      this.$outdent = new MatchingBraceOutdent();\n   };\n   oop.inherits(Mode, TextMode);\n\n   (function()\n   {\n      this.lineCommentStart = \"#\";\n       this.$id = \"ace/mode/r\";\n   }).call(Mode.prototype);\n   exports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-rdoc.js",
    "content": "ace.define(\"ace/mode/latex_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar LatexHighlightRules = function() {  \n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\",\n            regex : \"%.*$\"\n        }, {\n            token : [\"keyword\", \"lparen\", \"variable.parameter\", \"rparen\", \"lparen\", \"storage.type\", \"rparen\"],\n            regex : \"(\\\\\\\\(?:documentclass|usepackage|input))(?:(\\\\[)([^\\\\]]*)(\\\\]))?({)([^}]*)(})\"\n        }, {\n            token : [\"keyword\",\"lparen\", \"variable.parameter\", \"rparen\"],\n            regex : \"(\\\\\\\\(?:label|v?ref|cite(?:[^{]*)))(?:({)([^}]*)(}))?\"\n        }, {\n            token : [\"storage.type\", \"lparen\", \"variable.parameter\", \"rparen\"],\n            regex : \"(\\\\\\\\(?:begin|end))({)(\\\\w*)(})\"\n        }, {\n            token : \"storage.type\",\n            regex : \"\\\\\\\\[a-zA-Z]+\"\n        }, {\n            token : \"lparen\",\n            regex : \"[[({]\"\n        }, {\n            token : \"rparen\",\n            regex : \"[\\\\])}]\"\n        }, {\n            token : \"constant.character.escape\",\n            regex : \"\\\\\\\\[^a-zA-Z]?\"\n        }, {\n            token : \"string\",\n            regex : \"\\\\${1,2}\",\n            next  : \"equation\"\n        }],\n        \"equation\" : [{\n            token : \"comment\",\n            regex : \"%.*$\"\n        }, {\n            token : \"string\",\n            regex : \"\\\\${1,2}\",\n            next  : \"start\"\n        }, {\n            token : \"constant.character.escape\",\n            regex : \"\\\\\\\\(?:[^a-zA-Z]|[a-zA-Z]+)\"\n        }, {\n            token : \"error\", \n            regex : \"^\\\\s*$\", \n            next : \"start\" \n        }, {\n            defaultToken : \"string\"\n        }]\n\n    };\n};\noop.inherits(LatexHighlightRules, TextHighlightRules);\n\nexports.LatexHighlightRules = LatexHighlightRules;\n\n});\n\nace.define(\"ace/mode/rdoc_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\",\"ace/mode/latex_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar LaTeXHighlightRules = require(\"./latex_highlight_rules\");\n\nvar RDocHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [\n\t        {\n\t            token : \"comment\",\n\t            regex : \"%.*$\"\n\t        }, {\n\t            token : \"text\", // non-command\n\t            regex : \"\\\\\\\\[$&%#\\\\{\\\\}]\"\n\t        }, {\n\t            token : \"keyword\", // command\n\t            regex : \"\\\\\\\\(?:name|alias|method|S3method|S4method|item|code|preformatted|kbd|pkg|var|env|option|command|author|email|url|source|cite|acronym|href|code|preformatted|link|eqn|deqn|keyword|usage|examples|dontrun|dontshow|figure|if|ifelse|Sexpr|RdOpts|inputencoding|usepackage)\\\\b\",\n               next : \"nospell\"\n\t        }, {\n\t            token : \"keyword\", // command\n\t            regex : \"\\\\\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])\"\n\t        }, {\n               token : \"paren.keyword.operator\",\n\t            regex : \"[[({]\"\n\t        }, {\n               token : \"paren.keyword.operator\",\n\t            regex : \"[\\\\])}]\"\n\t        }, {\n\t            token : \"text\",\n\t            regex : \"\\\\s+\"\n\t        }\n        ],\n        \"nospell\" : [\n           {\n               token : \"comment\",\n               regex : \"%.*$\",\n               next : \"start\"\n           }, {\n               token : \"nospell.text\", // non-command\n               regex : \"\\\\\\\\[$&%#\\\\{\\\\}]\"\n           }, {\n               token : \"keyword\", // command\n               regex : \"\\\\\\\\(?:name|alias|method|S3method|S4method|item|code|preformatted|kbd|pkg|var|env|option|command|author|email|url|source|cite|acronym|href|code|preformatted|link|eqn|deqn|keyword|usage|examples|dontrun|dontshow|figure|if|ifelse|Sexpr|RdOpts|inputencoding|usepackage)\\\\b\"\n           }, {\n               token : \"keyword\", // command\n               regex : \"\\\\\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])\",\n               next : \"start\"\n           }, {\n               token : \"paren.keyword.operator\",\n               regex : \"[[({]\"\n           }, {\n               token : \"paren.keyword.operator\",\n               regex : \"[\\\\])]\"\n           }, {\n               token : \"paren.keyword.operator\",\n               regex : \"}\",\n               next : \"start\"\n           }, {\n               token : \"nospell.text\",\n               regex : \"\\\\s+\"\n           }, {\n               token : \"nospell.text\",\n               regex : \"\\\\w+\"\n           }\n        ]\n    };\n};\n\noop.inherits(RDocHighlightRules, TextHighlightRules);\n\nexports.RDocHighlightRules = RDocHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/rdoc\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/text_highlight_rules\",\"ace/mode/rdoc_highlight_rules\",\"ace/mode/matching_brace_outdent\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar RDocHighlightRules = require(\"./rdoc_highlight_rules\").RDocHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\n\nvar Mode = function(suppressHighlighting) {\n\tthis.HighlightRules = RDocHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n    this.$id = \"ace/mode/rdoc\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-rhtml.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\nace.define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar CssBehaviour = function () {\n\n    this.inherit(CstyleBehaviour);\n\n    this.add(\"colon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(cursor.row);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                if (rightChar === ':') {\n                    return {\n                       text: '',\n                       selection: [1, 1]\n                    }\n                }\n                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n                    return {\n                       text: ':;',\n                       selection: [1, 1]\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"colon\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(range.start.row);\n                var rightChar = line.substring(range.end.column, range.end.column + 1);\n                if (rightChar === ';') {\n                    range.end.column ++;\n                    return range;\n                }\n            }\n        }\n    });\n\n    this.add(\"semicolon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ';') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === ';') {\n                return {\n                   text: '',\n                   selection: [1, 1]\n                }\n            }\n        }\n    });\n\n}\noop.inherits(CssBehaviour, CstyleBehaviour);\n\nexports.CssBehaviour = CssBehaviour;\n});\n\nace.define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CssBehaviour = require(\"./behaviour/css\").CssBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = CssHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CssBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"csslint\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/css\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\nace.define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"string.cdata.xml\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.xml-decl.xml\", \"keyword.xml-decl.xml\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_decl\", caseInsensitive: true\n            },\n            {\n                token : [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"processing_instruction\",\n            },\n            {token : \"comment.xml\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\", caseInsensitive: true\n            },\n            {include : \"tag\"},\n            {token : \"text.end-tag-open.xml\", regex: \"</\"},\n            {token : \"text.tag-open.xml\", regex: \"<\"},\n            {include : \"reference\"},\n            {defaultToken : \"text.xml\"}\n        ],\n\n        xml_decl : [{\n            token : \"entity.other.attribute-name.decl-attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.decl-attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"whitespace\"\n        }, {\n            include: \"string\"\n        }, {\n            token : \"punctuation.xml-decl.xml\",\n            regex : \"\\\\?>\",\n            next : \"start\"\n        }],\n\n        processing_instruction : [\n            {token : \"punctuation.instruction.xml\", regex : \"\\\\?>\", next : \"start\"},\n            {defaultToken : \"instruction.xml\"}\n        ],\n\n        doctype : [\n            {include : \"whitespace\"},\n            {include : \"string\"},\n            {token : \"xml-pe.doctype.xml\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe.xml\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.int-subset\", regex : \"\\\\[\", push : \"int_subset\"}\n        ],\n\n        int_subset : [{\n            token : \"text.xml\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.int-subset.xml\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.markup-decl.xml\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.cdata.xml\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text.xml\", regex : \"\\\\s+\"},\n            {token : \"text.xml\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment.xml\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment.xml\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape.reference.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        attr_reference : [{\n            token : \"constant.language.escape.reference.attribute-value.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n            regex : \"(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n            ]\n        }],\n\n        tag_whitespace : [\n            {token : \"text.tag-whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        whitespace : [\n            {token : \"text.whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        string: [{\n            token : \"string.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.xml\", regex: \"'\", next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }, {\n            token : \"string.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.xml\", regex: '\"', next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }],\n\n        attributes: [{\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"tag_whitespace\"\n        }, {\n            include: \"attribute_value\"\n        }],\n\n        attribute_value: [{\n            token : \"string.attribute-value.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }, {\n            token : \"string.attribute-value.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\nace.define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    option      : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.addRules({\n        attributes: [{\n            include : \"tag_whitespace\"\n        }, {\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\",\n            push : [{\n                include: \"tag_whitespace\"\n            }, {\n                token : \"string.unquoted.attribute-value.html\",\n                regex : \"[^<>='\\\"`\\\\s]+\",\n                next : \"pop\"\n            }, {\n                token : \"empty\",\n                regex : \"\",\n                next : \"pop\"\n            }]\n        }, {\n            include : \"attribute_value\"\n        }],\n        tag: [{\n            token : function(start, tag) {\n                var group = tagMap[tag];\n                return [\"meta.tag.punctuation.\" + (start == \"<\" ? \"\" : \"end-\") + \"tag-open.xml\",\n                    \"meta.tag\" + (group ? \".\" + group : \"\") + \".tag-name.xml\"];\n            },\n            regex : \"(</?)([-_a-zA-Z0-9:]+)\",\n            next: \"tag_stuff\"\n        }],\n        tag_stuff: [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n        ],\n    });\n\n    this.embedTagRules(CssHighlightRules, \"css-\", \"style\");\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    if (this.constructor === HtmlHighlightRules)\n        this.normalizeRules();\n};\n\noop.inherits(HtmlHighlightRules, XmlHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nvar XmlBehaviour = function () {\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selected = session.doc.getTextRange(editor.getSelectionRange());\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            }\n\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (rightChar == quote && (is(token, \"attribute-value\") || is(token, \"string\"))) {\n                return {\n                    text: \"\",\n                    selection: [1, 1]\n                };\n            }\n\n            if (!token)\n                token = iterator.stepBackward();\n\n            if (!token)\n                return;\n\n            while (is(token, \"tag-whitespace\") || is(token, \"whitespace\")) {\n                token = iterator.stepBackward();\n            }\n            var rightSpace = !rightChar || rightChar.match(/\\s/);\n            if (is(token, \"attribute-equals\") && (rightSpace || rightChar == '>') || (is(token, \"decl-attribute-equals\") && (rightSpace || rightChar == '?'))) {\n                return {\n                    text: quote + quote,\n                    selection: [1, 1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken() || iterator.stepBackward();\n            if (!token || !(is(token, \"tag-name\") || is(token, \"tag-whitespace\") || is(token, \"attribute-name\") || is(token, \"attribute-equals\") || is(token, \"attribute-value\")))\n                return;\n            if (is(token, \"reference.attribute-value\"))\n                return;\n            if (is(token, \"attribute-value\")) {\n                var firstChar = token.value.charAt(0);\n                if (firstChar == '\"' || firstChar == \"'\") {\n                    var lastChar = token.value.charAt(token.value.length - 1);\n                    var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length;\n                    if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar)\n                        return;\n                }\n            }\n            while (!is(token, \"tag-name\")) {\n                token = iterator.stepBackward();\n            }\n\n            var tokenRow = iterator.getCurrentTokenRow();\n            var tokenColumn = iterator.getCurrentTokenColumn();\n            if (is(iterator.stepBackward(), \"end-tag-open\"))\n                return;\n\n            var element = token.value;\n            if (tokenRow == position.row)\n                element = element.substring(0, position.column - tokenColumn);\n\n            if (this.voidElements.hasOwnProperty(element.toLowerCase()))\n                 return;\n\n            return {\n               text: \">\" + \"</\" + element + \">\",\n               selection: [1, 1]\n            };\n        }\n    });\n\n    this.add(\"autoindent\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.getLine(cursor.row);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (token && token.type.indexOf(\"tag-close\") !== -1) {\n                while (token && token.type.indexOf(\"tag-name\") === -1) {\n                    token = iterator.stepBackward();\n                }\n\n                if (!token) {\n                    return;\n                }\n\n                var tag = token.value;\n                var row = iterator.getCurrentTokenRow();\n                token = iterator.stepBackward();\n                if (!token || token.type.indexOf(\"end-tag\") !== -1) {\n                    return;\n                }\n\n                if (this.voidElements && !this.voidElements[tag]) {\n                    var nextToken = session.getTokenAt(cursor.row, cursor.column+1);\n                    var line = session.getLine(row);\n                    var nextIndent = this.$getIndent(line);\n                    var indent = nextIndent + session.getTabString();\n\n                    if (nextToken && nextToken.value === \"</\") {\n                        return {\n                            text: \"\\n\" + indent + \"\\n\" + nextIndent,\n                            selection: [1, indent.length, 1, indent.length]\n                        };\n                    } else {\n                        return {\n                            text: \"\\n\" + indent\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n};\n\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\nace.define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n    this.defaultMode = defaultMode;\n    this.subModes = subModes;\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n\n    this.$getMode = function(state) {\n        if (typeof state != \"string\") \n            state = state[0];\n        for (var key in this.subModes) {\n            if (state.indexOf(key) === 0)\n                return this.subModes[key];\n        }\n        return null;\n    };\n    \n    this.$tryMode = function(state, session, foldStyle, row) {\n        var mode = this.$getMode(state);\n        return (mode ? mode.getFoldWidget(session, foldStyle, row) : \"\");\n    };\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        return (\n            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n            this.defaultMode.getFoldWidget(session, foldStyle, row)\n        );\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var mode = this.$getMode(session.getState(row-1));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.$getMode(session.getState(row));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.defaultMode;\n        \n        return mode.getFoldWidgetRange(session, foldStyle, row);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalEndTags) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n    this.optionalEndTags = oop.mixin({}, this.voidElements);\n    if (optionalEndTags)\n        oop.mixin(this.optionalEndTags, optionalEndTags);\n    \n};\noop.inherits(FoldMode, BaseFoldMode);\n\nvar Tag = function() {\n    this.tagName = \"\";\n    this.closing = false;\n    this.selfClosing = false;\n    this.start = {row: 0, column: 0};\n    this.end = {row: 0, column: 0};\n};\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (!tag)\n            return \"\";\n\n        if (tag.closing || (!tag.tagName && tag.selfClosing))\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase()))\n            return \"\";\n\n        if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column))\n            return \"\";\n\n        return \"start\";\n    };\n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var tag = new Tag();\n\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (is(token, \"tag-open\")) {\n                tag.end.column = tag.start.column + token.value.length;\n                tag.closing = is(token, \"end-tag-open\");\n                token = tokens[++i];\n                if (!token)\n                    return null;\n                tag.tagName = token.value;\n                tag.end.column += token.value.length;\n                for (i++; i < tokens.length; i++) {\n                    token = tokens[i];\n                    tag.end.column += token.value.length;\n                    if (is(token, \"tag-close\")) {\n                        tag.selfClosing = token.value == '/>';\n                        break;\n                    }\n                }\n                return tag;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == '/>';\n                return tag;\n            }\n            tag.start.column += token.value.length;\n        }\n\n        return null;\n    };\n\n    this._findEndTagInLine = function(session, row, tagName, startColumn) {\n        var tokens = session.getTokens(row);\n        var column = 0;\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            column += token.value.length;\n            if (column < startColumn)\n                continue;\n            if (is(token, \"end-tag-open\")) {\n                token = tokens[i + 1];\n                if (token && token.value == tagName)\n                    return true;\n            }\n        }\n        return false;\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n                iterator.stepForward();\n                return tag;\n            }\n        } while(token = iterator.stepForward());\n\n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n                iterator.stepBackward();\n                return tag;\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n            }\n        } while(token = iterator.stepBackward());\n\n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.optionalEndTags.hasOwnProperty(top.tagName)) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.start.column);\n            var start = {\n                row: row,\n                column: firstTag.start.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.end.column);\n            var end = {\n                row: row,\n                column: firstTag.start.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar MixedFoldMode = require(\"./mixed\").FoldMode;\nvar XmlFoldMode = require(\"./xml\").FoldMode;\nvar CStyleFoldMode = require(\"./cstyle\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalTags) {\n    MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), {\n        \"js-\": new CStyleFoldMode(),\n        \"css-\": new CStyleFoldMode()\n    });\n};\n\noop.inherits(FoldMode, MixedFoldMode);\n\n});\n\nace.define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\n\nvar commonAttributes = [\n    \"accesskey\",\n    \"class\",\n    \"contenteditable\",\n    \"contextmenu\",\n    \"dir\",\n    \"draggable\",\n    \"dropzone\",\n    \"hidden\",\n    \"id\",\n    \"inert\",\n    \"itemid\",\n    \"itemprop\",\n    \"itemref\",\n    \"itemscope\",\n    \"itemtype\",\n    \"lang\",\n    \"spellcheck\",\n    \"style\",\n    \"tabindex\",\n    \"title\",\n    \"translate\"\n];\n\nvar eventAttributes = [\n    \"onabort\",\n    \"onblur\",\n    \"oncancel\",\n    \"oncanplay\",\n    \"oncanplaythrough\",\n    \"onchange\",\n    \"onclick\",\n    \"onclose\",\n    \"oncontextmenu\",\n    \"oncuechange\",\n    \"ondblclick\",\n    \"ondrag\",\n    \"ondragend\",\n    \"ondragenter\",\n    \"ondragleave\",\n    \"ondragover\",\n    \"ondragstart\",\n    \"ondrop\",\n    \"ondurationchange\",\n    \"onemptied\",\n    \"onended\",\n    \"onerror\",\n    \"onfocus\",\n    \"oninput\",\n    \"oninvalid\",\n    \"onkeydown\",\n    \"onkeypress\",\n    \"onkeyup\",\n    \"onload\",\n    \"onloadeddata\",\n    \"onloadedmetadata\",\n    \"onloadstart\",\n    \"onmousedown\",\n    \"onmousemove\",\n    \"onmouseout\",\n    \"onmouseover\",\n    \"onmouseup\",\n    \"onmousewheel\",\n    \"onpause\",\n    \"onplay\",\n    \"onplaying\",\n    \"onprogress\",\n    \"onratechange\",\n    \"onreset\",\n    \"onscroll\",\n    \"onseeked\",\n    \"onseeking\",\n    \"onselect\",\n    \"onshow\",\n    \"onstalled\",\n    \"onsubmit\",\n    \"onsuspend\",\n    \"ontimeupdate\",\n    \"onvolumechange\",\n    \"onwaiting\"\n];\n\nvar globalAttributes = commonAttributes.concat(eventAttributes);\n\nvar attributeMap = {\n    \"html\": [\"manifest\"],\n    \"head\": [],\n    \"title\": [],\n    \"base\": [\"href\", \"target\"],\n    \"link\": [\"href\", \"hreflang\", \"rel\", \"media\", \"type\", \"sizes\"],\n    \"meta\": [\"http-equiv\", \"name\", \"content\", \"charset\"],\n    \"style\": [\"type\", \"media\", \"scoped\"],\n    \"script\": [\"charset\", \"type\", \"src\", \"defer\", \"async\"],\n    \"noscript\": [\"href\"],\n    \"body\": [\"onafterprint\", \"onbeforeprint\", \"onbeforeunload\", \"onhashchange\", \"onmessage\", \"onoffline\", \"onpopstate\", \"onredo\", \"onresize\", \"onstorage\", \"onundo\", \"onunload\"],\n    \"section\": [],\n    \"nav\": [],\n    \"article\": [\"pubdate\"],\n    \"aside\": [],\n    \"h1\": [],\n    \"h2\": [],\n    \"h3\": [],\n    \"h4\": [],\n    \"h5\": [],\n    \"h6\": [],\n    \"header\": [],\n    \"footer\": [],\n    \"address\": [],\n    \"main\": [],\n    \"p\": [],\n    \"hr\": [],\n    \"pre\": [],\n    \"blockquote\": [\"cite\"],\n    \"ol\": [\"start\", \"reversed\"],\n    \"ul\": [],\n    \"li\": [\"value\"],\n    \"dl\": [],\n    \"dt\": [],\n    \"dd\": [],\n    \"figure\": [],\n    \"figcaption\": [],\n    \"div\": [],\n    \"a\": [\"href\", \"target\", \"ping\", \"rel\", \"media\", \"hreflang\", \"type\"],\n    \"em\": [],\n    \"strong\": [],\n    \"small\": [],\n    \"s\": [],\n    \"cite\": [],\n    \"q\": [\"cite\"],\n    \"dfn\": [],\n    \"abbr\": [],\n    \"data\": [],\n    \"time\": [\"datetime\"],\n    \"code\": [],\n    \"var\": [],\n    \"samp\": [],\n    \"kbd\": [],\n    \"sub\": [],\n    \"sup\": [],\n    \"i\": [],\n    \"b\": [],\n    \"u\": [],\n    \"mark\": [],\n    \"ruby\": [],\n    \"rt\": [],\n    \"rp\": [],\n    \"bdi\": [],\n    \"bdo\": [],\n    \"span\": [],\n    \"br\": [],\n    \"wbr\": [],\n    \"ins\": [\"cite\", \"datetime\"],\n    \"del\": [\"cite\", \"datetime\"],\n    \"img\": [\"alt\", \"src\", \"height\", \"width\", \"usemap\", \"ismap\"],\n    \"iframe\": [\"name\", \"src\", \"height\", \"width\", \"sandbox\", \"seamless\"],\n    \"embed\": [\"src\", \"height\", \"width\", \"type\"],\n    \"object\": [\"param\", \"data\", \"type\", \"height\" , \"width\", \"usemap\", \"name\", \"form\", \"classid\"],\n    \"param\": [\"name\", \"value\"],\n    \"video\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\", \"width\", \"height\", \"poster\"],\n    \"audio\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\"],\n    \"source\": [\"src\", \"type\", \"media\"],\n    \"track\": [\"kind\", \"src\", \"srclang\", \"label\", \"default\"],\n    \"canvas\": [\"width\", \"height\"],\n    \"map\": [\"name\"],\n    \"area\": [\"shape\", \"coords\", \"href\", \"hreflang\", \"alt\", \"target\", \"media\", \"rel\", \"ping\", \"type\"],\n    \"svg\": [],\n    \"math\": [],\n    \"table\": [\"summary\"],\n    \"caption\": [],\n    \"colgroup\": [\"span\"],\n    \"col\": [\"span\"],\n    \"tbody\": [],\n    \"thead\": [],\n    \"tfoot\": [],\n    \"tr\": [],\n    \"td\": [\"headers\", \"rowspan\", \"colspan\"],\n    \"th\": [\"headers\", \"rowspan\", \"colspan\", \"scope\"],\n    \"form\": [\"accept-charset\", \"action\", \"autocomplete\", \"enctype\", \"method\", \"name\", \"novalidate\", \"target\"],\n    \"fieldset\": [\"disabled\", \"form\", \"name\"],\n    \"legend\": [],\n    \"label\": [\"form\", \"for\"],\n    \"input\": [\"type\", \"accept\", \"alt\", \"autocomplete\", \"checked\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"height\", \"list\", \"max\", \"maxlength\", \"min\", \"multiple\", \"pattern\", \"placeholder\", \"readonly\", \"required\", \"size\", \"src\", \"step\", \"width\", \"files\", \"value\"],\n    \"button\": [\"autofocus\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"name\", \"value\", \"type\"],\n    \"select\": [\"autofocus\", \"disabled\", \"form\", \"multiple\", \"name\", \"size\"],\n    \"datalist\": [],\n    \"optgroup\": [\"disabled\", \"label\"],\n    \"option\": [\"disabled\", \"selected\", \"label\", \"value\"],\n    \"textarea\": [\"autofocus\", \"disabled\", \"form\", \"maxlength\", \"name\", \"placeholder\", \"readonly\", \"required\", \"rows\", \"cols\", \"wrap\"],\n    \"keygen\": [\"autofocus\", \"challenge\", \"disabled\", \"form\", \"keytype\", \"name\"],\n    \"output\": [\"for\", \"form\", \"name\"],\n    \"progress\": [\"value\", \"max\"],\n    \"meter\": [\"value\", \"min\", \"max\", \"low\", \"high\", \"optimum\"],\n    \"details\": [\"open\"],\n    \"summary\": [],\n    \"command\": [\"type\", \"label\", \"icon\", \"disabled\", \"checked\", \"radiogroup\", \"command\"],\n    \"menu\": [\"type\", \"label\"],\n    \"dialog\": [\"open\"]\n};\n\nvar elements = Object.keys(attributeMap);\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nfunction findTagName(session, pos) {\n    var iterator = new TokenIterator(session, pos.row, pos.column);\n    var token = iterator.getCurrentToken();\n    while (token && !is(token, \"tag-name\")){\n        token = iterator.stepBackward();\n    }\n    if (token)\n        return token.value;\n}\n\nvar HtmlCompletions = function() {\n\n};\n\n(function() {\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        var token = session.getTokenAt(pos.row, pos.column);\n\n        if (!token)\n            return [];\n        if (is(token, \"tag-name\") || is(token, \"tag-open\") || is(token, \"end-tag-open\"))\n            return this.getTagCompletions(state, session, pos, prefix);\n        if (is(token, \"tag-whitespace\") || is(token, \"attribute-name\"))\n            return this.getAttributeCompetions(state, session, pos, prefix);\n\n        return [];\n    };\n\n    this.getTagCompletions = function(state, session, pos, prefix) {\n        return elements.map(function(element){\n            return {\n                value: element,\n                meta: \"tag\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n    this.getAttributeCompetions = function(state, session, pos, prefix) {\n        var tagName = findTagName(session, pos);\n        if (!tagName)\n            return [];\n        var attributes = globalAttributes;\n        if (tagName in attributeMap) {\n            attributes = attributes.concat(attributeMap[tagName]);\n        }\n        return attributes.map(function(attribute){\n            return {\n                caption: attribute,\n                snippet: attribute + '=\"$0\"',\n                meta: \"attribute\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n}).call(HtmlCompletions.prototype);\n\nexports.HtmlCompletions = HtmlCompletions;\n});\n\nace.define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar HtmlFoldMode = require(\"./folding/html\").FoldMode;\nvar HtmlCompletions = require(\"./html_completions\").HtmlCompletions;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar voidElements = [\"area\", \"base\", \"br\", \"col\", \"embed\", \"hr\", \"img\", \"input\", \"keygen\", \"link\", \"meta\", \"menuitem\", \"param\", \"source\", \"track\", \"wbr\"];\nvar optionalEndTags = [\"li\", \"dt\", \"dd\", \"p\", \"rt\", \"rp\", \"optgroup\", \"option\", \"colgroup\", \"td\", \"th\"];\n\nvar Mode = function(options) {\n    this.fragmentContext = options && options.fragmentContext;\n    this.HighlightRules = HtmlHighlightRules;\n    this.$behaviour = new XmlBehaviour();\n    this.$completer = new HtmlCompletions();\n    \n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"css-\": CssMode\n    });\n    \n    this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags));\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n    this.voidElements = lang.arrayToMap(voidElements);\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        return this.$completer.getCompletions(state, session, pos, prefix);\n    };\n\n    this.createWorker = function(session) {\n        if (this.constructor != Mode)\n            return;\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/html_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        if (this.fragmentContext)\n            worker.call(\"setOptions\", [{context: this.fragmentContext}]);\n\n        worker.on(\"error\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/html\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/tex_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar TexHighlightRules = function(textClass) {\n\n    if (!textClass)\n        textClass = \"text\";\n\n    this.$rules = {\n        \"start\" : [\n\t        {\n\t            token : \"comment\",\n\t            regex : \"%.*$\"\n\t        }, {\n\t            token : textClass, // non-command\n\t            regex : \"\\\\\\\\[$&%#\\\\{\\\\}]\"\n\t        }, {\n\t            token : \"keyword\", // command\n\t            regex : \"\\\\\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\\\b\",\n               next : \"nospell\"\n\t        }, {\n\t            token : \"keyword\", // command\n\t            regex : \"\\\\\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])\"\n\t        }, {\n               token : \"paren.keyword.operator\",\n\t            regex : \"[[({]\"\n\t        }, {\n               token : \"paren.keyword.operator\",\n\t            regex : \"[\\\\])}]\"\n\t        }, {\n\t            token : textClass,\n\t            regex : \"\\\\s+\"\n\t        }\n        ],\n        \"nospell\" : [\n           {\n               token : \"comment\",\n               regex : \"%.*$\",\n               next : \"start\"\n           }, {\n               token : \"nospell.\" + textClass, // non-command\n               regex : \"\\\\\\\\[$&%#\\\\{\\\\}]\"\n           }, {\n               token : \"keyword\", // command\n               regex : \"\\\\\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\\\b\"\n           }, {\n               token : \"keyword\", // command\n               regex : \"\\\\\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])\",\n               next : \"start\"\n           }, {\n               token : \"paren.keyword.operator\",\n               regex : \"[[({]\"\n           }, {\n               token : \"paren.keyword.operator\",\n               regex : \"[\\\\])]\"\n           }, {\n               token : \"paren.keyword.operator\",\n               regex : \"}\",\n               next : \"start\"\n           }, {\n               token : \"nospell.\" + textClass,\n               regex : \"\\\\s+\"\n           }, {\n               token : \"nospell.\" + textClass,\n               regex : \"\\\\w+\"\n           }\n        ]\n    };\n};\n\noop.inherits(TexHighlightRules, TextHighlightRules);\n\nexports.TexHighlightRules = TexHighlightRules;\n});\n\nace.define(\"ace/mode/r_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\",\"ace/mode/tex_highlight_rules\"], function(require, exports, module)\n{\n\n   var oop = require(\"../lib/oop\");\n   var lang = require(\"../lib/lang\");\n   var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n   var TexHighlightRules = require(\"./tex_highlight_rules\").TexHighlightRules;\n\n   var RHighlightRules = function()\n   {\n\n      var keywords = lang.arrayToMap(\n            (\"function|if|in|break|next|repeat|else|for|return|switch|while|try|tryCatch|stop|warning|require|library|attach|detach|source|setMethod|setGeneric|setGroupGeneric|setClass\")\n                  .split(\"|\")\n            );\n\n      var buildinConstants = lang.arrayToMap(\n            (\"NULL|NA|TRUE|FALSE|T|F|Inf|NaN|NA_integer_|NA_real_|NA_character_|\" +\n             \"NA_complex_\").split(\"|\")\n            );\n\n      this.$rules = {\n         \"start\" : [\n            {\n               token : \"comment.sectionhead\",\n               regex : \"#+(?!').*(?:----|====|####)\\\\s*$\"\n            },\n            {\n               token : \"comment\",\n               regex : \"#+'\",\n               next : \"rd-start\"\n            },\n            {\n               token : \"comment\",\n               regex : \"#.*$\"\n            },\n            {\n               token : \"string\", // multi line string start\n               regex : '[\"]',\n               next : \"qqstring\"\n            },\n            {\n               token : \"string\", // multi line string start\n               regex : \"[']\",\n               next : \"qstring\"\n            },\n            {\n               token : \"constant.numeric\", // hex\n               regex : \"0[xX][0-9a-fA-F]+[Li]?\\\\b\"\n            },\n            {\n               token : \"constant.numeric\", // explicit integer\n               regex : \"\\\\d+L\\\\b\"\n            },\n            {\n               token : \"constant.numeric\", // number\n               regex : \"\\\\d+(?:\\\\.\\\\d*)?(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\"\n            },\n            {\n               token : \"constant.numeric\", // number with leading decimal\n               regex : \"\\\\.\\\\d+(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\"\n            },\n            {\n               token : \"constant.language.boolean\",\n               regex : \"(?:TRUE|FALSE|T|F)\\\\b\"\n            },\n            {\n               token : \"identifier\",\n               regex : \"`.*?`\"\n            },\n            {\n               onMatch : function(value) {\n                  if (keywords[value])\n                     return \"keyword\";\n                  else if (buildinConstants[value])\n                     return \"constant.language\";\n                  else if (value == '...' || value.match(/^\\.\\.\\d+$/))\n                     return \"variable.language\";\n                  else\n                     return \"identifier\";\n               },\n               regex : \"[a-zA-Z.][a-zA-Z0-9._]*\\\\b\"\n            },\n            {\n               token : \"keyword.operator\",\n               regex : \"%%|>=|<=|==|!=|\\\\->|<\\\\-|\\\\|\\\\||&&|=|\\\\+|\\\\-|\\\\*|/|\\\\^|>|<|!|&|\\\\||~|\\\\$|:\"\n            },\n            {\n               token : \"keyword.operator\", // infix operators\n               regex : \"%.*?%\"\n            },\n            {\n               token : \"paren.keyword.operator\",\n               regex : \"[[({]\"\n            },\n            {\n               token : \"paren.keyword.operator\",\n               regex : \"[\\\\])}]\"\n            },\n            {\n               token : \"text\",\n               regex : \"\\\\s+\"\n            }\n         ],\n         \"qqstring\" : [\n            {\n               token : \"string\",\n               regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n               next : \"start\"\n            },\n            {\n               token : \"string\",\n               regex : '.+'\n            }\n         ],\n         \"qstring\" : [\n            {\n               token : \"string\",\n               regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n               next : \"start\"\n            },\n            {\n               token : \"string\",\n               regex : '.+'\n            }\n         ]\n      };\n\n      var rdRules = new TexHighlightRules(\"comment\").getRules();\n      for (var i = 0; i < rdRules[\"start\"].length; i++) {\n         rdRules[\"start\"][i].token += \".virtual-comment\";\n      }\n\n      this.addRules(rdRules, \"rd-\");\n      this.$rules[\"rd-start\"].unshift({\n          token: \"text\",\n          regex: \"^\",\n          next: \"start\"\n      });\n      this.$rules[\"rd-start\"].unshift({\n         token : \"keyword\",\n         regex : \"@(?!@)[^ ]*\"\n      });\n      this.$rules[\"rd-start\"].unshift({\n         token : \"comment\",\n         regex : \"@@\"\n      });\n      this.$rules[\"rd-start\"].push({\n         token : \"comment\",\n         regex : \"[^%\\\\\\\\[({\\\\])}]+\"\n      });\n   };\n\n   oop.inherits(RHighlightRules, TextHighlightRules);\n\n   exports.RHighlightRules = RHighlightRules;\n});\n\nace.define(\"ace/mode/rhtml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/r_highlight_rules\",\"ace/mode/html_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar RHighlightRules = require(\"./r_highlight_rules\").RHighlightRules;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar RHtmlHighlightRules = function() {\n    HtmlHighlightRules.call(this);\n\n    this.$rules[\"start\"].unshift({\n        token: \"support.function.codebegin\",\n        regex: \"^<\" + \"!--\\\\s*begin.rcode\\\\s*(?:.*)\",\n        next: \"r-start\"\n    });\n\n    this.embedRules(RHighlightRules, \"r-\", [{\n        token: \"support.function.codeend\",\n        regex: \"^\\\\s*end.rcode\\\\s*-->\",\n        next: \"start\"\n    }], [\"start\"]);\n\n    this.normalizeRules();\n};\noop.inherits(RHtmlHighlightRules, TextHighlightRules);\n\nexports.RHtmlHighlightRules = RHtmlHighlightRules;\n});\n\nace.define(\"ace/mode/rhtml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html\",\"ace/mode/rhtml_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar HtmlMode = require(\"./html\").Mode;\n\nvar RHtmlHighlightRules = require(\"./rhtml_highlight_rules\").RHtmlHighlightRules;\n\nvar Mode = function(doc, session) {\n   HtmlMode.call(this);\n   this.$session = session;\n   this.HighlightRules = RHtmlHighlightRules;\n};\noop.inherits(Mode, HtmlMode);\n\n(function() {\n   this.insertChunkInfo = {\n      value: \"<!--begin.rcode\\n\\nend.rcode-->\\n\",\n      position: {row: 0, column: 15}\n   };\n    \n   this.getLanguageMode = function(position)\n   {\n      return this.$session.getState(position.row).match(/^r-/) ? 'R' : 'HTML';\n   };\n\n    this.$id = \"ace/mode/rhtml\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-ruby.js",
    "content": "ace.define(\"ace/mode/ruby_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar constantOtherSymbol = exports.constantOtherSymbol = {\n    token : \"constant.other.symbol.ruby\", // symbol\n    regex : \"[:](?:[A-Za-z_]|[@$](?=[a-zA-Z0-9_]))[a-zA-Z0-9_]*[!=?]?\"\n};\n\nvar qString = exports.qString = {\n    token : \"string\", // single line\n    regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n};\n\nvar qqString = exports.qqString = {\n    token : \"string\", // single line\n    regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n};\n\nvar tString = exports.tString = {\n    token : \"string\", // backtick string\n    regex : \"[`](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[`]\"\n};\n\nvar constantNumericHex = exports.constantNumericHex = {\n    token : \"constant.numeric\", // hex\n    regex : \"0[xX][0-9a-fA-F](?:[0-9a-fA-F]|_(?=[0-9a-fA-F]))*\\\\b\"\n};\n\nvar constantNumericFloat = exports.constantNumericFloat = {\n    token : \"constant.numeric\", // float\n    regex : \"[+-]?\\\\d(?:\\\\d|_(?=\\\\d))*(?:(?:\\\\.\\\\d(?:\\\\d|_(?=\\\\d))*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n};\n\nvar RubyHighlightRules = function() {\n\n    var builtinFunctions = (\n        \"abort|Array|assert|assert_equal|assert_not_equal|assert_same|assert_not_same|\" +\n        \"assert_nil|assert_not_nil|assert_match|assert_no_match|assert_in_delta|assert_throws|\" +\n        \"assert_raise|assert_nothing_raised|assert_instance_of|assert_kind_of|assert_respond_to|\" +\n        \"assert_operator|assert_send|assert_difference|assert_no_difference|assert_recognizes|\" +\n        \"assert_generates|assert_response|assert_redirected_to|assert_template|assert_select|\" +\n        \"assert_select_email|assert_select_rjs|assert_select_encoded|css_select|at_exit|\" +\n        \"attr|attr_writer|attr_reader|attr_accessor|attr_accessible|autoload|binding|block_given?|callcc|\" +\n        \"caller|catch|chomp|chomp!|chop|chop!|defined?|delete_via_redirect|eval|exec|exit|\" +\n        \"exit!|fail|Float|flunk|follow_redirect!|fork|form_for|form_tag|format|gets|global_variables|gsub|\" +\n        \"gsub!|get_via_redirect|host!|https?|https!|include|Integer|lambda|link_to|\" +\n        \"link_to_unless_current|link_to_function|link_to_remote|load|local_variables|loop|open|open_session|\" +\n        \"p|print|printf|proc|putc|puts|post_via_redirect|put_via_redirect|raise|rand|\" +\n        \"raw|readline|readlines|redirect?|request_via_redirect|require|scan|select|\" +\n        \"set_trace_func|sleep|split|sprintf|srand|String|stylesheet_link_tag|syscall|system|sub|sub!|test|\" +\n        \"throw|trace_var|trap|untrace_var|atan2|cos|exp|frexp|ldexp|log|log10|sin|sqrt|tan|\" +\n        \"render|javascript_include_tag|csrf_meta_tag|label_tag|text_field_tag|submit_tag|check_box_tag|\" +\n        \"content_tag|radio_button_tag|text_area_tag|password_field_tag|hidden_field_tag|\" +\n        \"fields_for|select_tag|options_for_select|options_from_collection_for_select|collection_select|\" +\n        \"time_zone_select|select_date|select_time|select_datetime|date_select|time_select|datetime_select|\" +\n        \"select_year|select_month|select_day|select_hour|select_minute|select_second|file_field_tag|\" +\n        \"file_field|respond_to|skip_before_filter|around_filter|after_filter|verify|\" +\n        \"protect_from_forgery|rescue_from|helper_method|redirect_to|before_filter|\" +\n        \"send_data|send_file|validates_presence_of|validates_uniqueness_of|validates_length_of|\" +\n        \"validates_format_of|validates_acceptance_of|validates_associated|validates_exclusion_of|\" +\n        \"validates_inclusion_of|validates_numericality_of|validates_with|validates_each|\" +\n        \"authenticate_or_request_with_http_basic|authenticate_or_request_with_http_digest|\" +\n        \"filter_parameter_logging|match|get|post|resources|redirect|scope|assert_routing|\" +\n        \"translate|localize|extract_locale_from_tld|caches_page|expire_page|caches_action|expire_action|\" +\n        \"cache|expire_fragment|expire_cache_for|observe|cache_sweeper|\" +\n        \"has_many|has_one|belongs_to|has_and_belongs_to_many\"\n    );\n\n    var keywords = (\n        \"alias|and|BEGIN|begin|break|case|class|def|defined|do|else|elsif|END|end|ensure|\" +\n        \"__FILE__|finally|for|gem|if|in|__LINE__|module|next|not|or|private|protected|public|\" +\n        \"redo|rescue|retry|return|super|then|undef|unless|until|when|while|yield\"\n    );\n\n    var buildinConstants = (\n        \"true|TRUE|false|FALSE|nil|NIL|ARGF|ARGV|DATA|ENV|RUBY_PLATFORM|RUBY_RELEASE_DATE|\" +\n        \"RUBY_VERSION|STDERR|STDIN|STDOUT|TOPLEVEL_BINDING\"\n    );\n\n    var builtinVariables = (\n        \"\\$DEBUG|\\$defout|\\$FILENAME|\\$LOAD_PATH|\\$SAFE|\\$stdin|\\$stdout|\\$stderr|\\$VERBOSE|\" +\n        \"$!|root_url|flash|session|cookies|params|request|response|logger|self\"\n    );\n\n    var keywordMapper = this.$keywords = this.createKeywordMapper({\n        \"keyword\": keywords,\n        \"constant.language\": buildinConstants,\n        \"variable.language\": builtinVariables,\n        \"support.function\": builtinFunctions,\n        \"invalid.deprecated\": \"debugger\" // TODO is this a remnant from js mode?\n    }, \"identifier\");\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"#.*$\"\n            }, {\n                token : \"comment\", // multi line comment\n                regex : \"^=begin(?:$|\\\\s.*$)\",\n                next : \"comment\"\n            }, {\n                token : \"string.regexp\",\n                regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"\n            },\n\n            [{\n                regex: \"[{}]\", onMatch: function(val, state, stack) {\n                    this.next = val == \"{\" ? this.nextState : \"\";\n                    if (val == \"{\" && stack.length) {\n                        stack.unshift(\"start\", state);\n                        return \"paren.lparen\";\n                    }\n                    if (val == \"}\" && stack.length) {\n                        stack.shift();\n                        this.next = stack.shift();\n                        if (this.next.indexOf(\"string\") != -1)\n                            return \"paren.end\";\n                    }\n                    return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n                },\n                nextState: \"start\"\n            }, {\n                token : \"string.start\",\n                regex : /\"/,\n                push  : [{\n                    token : \"constant.language.escape\",\n                    regex : /\\\\(?:[nsrtvfbae'\"\\\\]|c.|C-.|M-.(?:\\\\C-.)?|[0-7]{3}|x[\\da-fA-F]{2}|u[\\da-fA-F]{4})/\n                }, {\n                    token : \"paren.start\",\n                    regex : /\\#{/,\n                    push  : \"start\"\n                }, {\n                    token : \"string.end\",\n                    regex : /\"/,\n                    next  : \"pop\"\n                }, {\n                    defaultToken: \"string\"\n                }]\n            }, {\n                token : \"string.start\",\n                regex : /`/,\n                push  : [{\n                    token : \"constant.language.escape\",\n                    regex : /\\\\(?:[nsrtvfbae'\"\\\\]|c.|C-.|M-.(?:\\\\C-.)?|[0-7]{3}|x[\\da-fA-F]{2}|u[\\da-fA-F]{4})/\n                }, {\n                    token : \"paren.start\",\n                    regex : /\\#{/,\n                    push  : \"start\"\n                }, {\n                    token : \"string.end\",\n                    regex : /`/,\n                    next  : \"pop\"\n                }, {\n                    defaultToken: \"string\"\n                }]\n            }, {\n                token : \"string.start\",\n                regex : /'/,\n                push  : [{\n                    token : \"constant.language.escape\",\n                    regex : /\\\\['\\\\]/\n                },  {\n                    token : \"string.end\",\n                    regex : /'/,\n                    next  : \"pop\"\n                }, {\n                    defaultToken: \"string\"\n                }]\n            }],\n\n            {\n                token : \"text\", // namespaces aren't symbols\n                regex : \"::\"\n            }, {\n                token : \"variable.instance\", // instance variable\n                regex : \"@{1,2}[a-zA-Z_\\\\d]+\"\n            }, {\n                token : \"support.class\", // class name\n                regex : \"[A-Z][a-zA-Z_\\\\d]+\"\n            },\n\n            constantOtherSymbol,\n            constantNumericHex,\n            constantNumericFloat,\n\n            {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"punctuation.separator.key-value\",\n                regex : \"=>\"\n            }, {\n                stateName: \"heredoc\",\n                onMatch : function(value, currentState, stack) {\n                    var next = value[2] == '-' ? \"indentedHeredoc\" : \"heredoc\";\n                    var tokens = value.split(this.splitRegex);\n                    stack.push(next, tokens[3]);\n                    return [\n                        {type:\"constant\", value: tokens[1]},\n                        {type:\"string\", value: tokens[2]},\n                        {type:\"support.class\", value: tokens[3]},\n                        {type:\"string\", value: tokens[4]}\n                    ];\n                },\n                regex : \"(<<-?)(['\\\"`]?)([\\\\w]+)(['\\\"`]?)\",\n                rules: {\n                    heredoc: [{\n                        onMatch:  function(value, currentState, stack) {\n                            if (value === stack[1]) {\n                                stack.shift();\n                                stack.shift();\n                                this.next = stack[0] || \"start\";\n                                return \"support.class\";\n                            }\n                            this.next = \"\";\n                            return \"string\";\n                        },\n                        regex: \".*$\",\n                        next: \"start\"\n                    }],\n                    indentedHeredoc: [{\n                        token: \"string\",\n                        regex: \"^ +\"\n                    }, {\n                        onMatch:  function(value, currentState, stack) {\n                            if (value === stack[1]) {\n                                stack.shift();\n                                stack.shift();\n                                this.next = stack[0] || \"start\";\n                                return \"support.class\";\n                            }\n                            this.next = \"\";\n                            return \"string\";\n                        },\n                        regex: \".*$\",\n                        next: \"start\"\n                    }]\n                }\n            }, {\n                regex : \"$\",\n                token : \"empty\",\n                next : function(currentState, stack) {\n                    if (stack[0] === \"heredoc\" || stack[0] === \"indentedHeredoc\")\n                        return stack[0];\n                    return currentState;\n                }\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \"^=end(?:$|\\\\s.*$)\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(RubyHighlightRules, TextHighlightRules);\n\nexports.RubyHighlightRules = RubyHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var range = this.indentationBlock(session, row);\n        if (range)\n            return range;\n\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1 || line[startLevel] != \"#\")\n            return;\n\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var level = line.search(re);\n\n            if (level == -1)\n                continue;\n\n            if (line[level] != \"#\")\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        var next = session.getLine(row + 1);\n        var prev = session.getLine(row - 1);\n        var prevIndent = prev.search(/\\S/);\n        var nextIndent = next.search(/\\S/);\n\n        if (indent == -1) {\n            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? \"start\" : \"\";\n            return \"\";\n        }\n        if (prevIndent == -1) {\n            if (indent == nextIndent && line[indent] == \"#\" && next[indent] == \"#\") {\n                session.foldWidgets[row - 1] = \"\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"start\";\n            }\n        } else if (prevIndent == indent && line[indent] == \"#\" && prev[indent] == \"#\") {\n            if (session.getLine(row - 2).search(/\\S/) == -1) {\n                session.foldWidgets[row - 1] = \"start\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"\";\n            }\n        }\n\n        if (prevIndent!= -1 && prevIndent < indent)\n            session.foldWidgets[row - 1] = \"start\";\n        else\n            session.foldWidgets[row - 1] = \"\";\n\n        if (indent < nextIndent)\n            return \"start\";\n        else\n            return \"\";\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/ruby\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/ruby_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/coffee\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar RubyHighlightRules = require(\"./ruby_highlight_rules\").RubyHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar FoldMode = require(\"./folding/coffee\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = RubyHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n\n    this.lineCommentStart = \"#\";\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            var startingClassOrMethod = line.match(/^\\s*(class|def|module)\\s.*$/);\n            var startingDoBlock = line.match(/.*do(\\s*|\\s+\\|.*\\|\\s*)$/);\n            var startingConditional = line.match(/^\\s*(if|else)\\s*/)\n            if (match || startingClassOrMethod || startingDoBlock || startingConditional) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return /^\\s+(end|else)$/.test(line + input) || this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, session, row) {\n        var line = session.getLine(row);\n        if (/}/.test(line))\n            return this.$outdent.autoOutdent(session, row);\n        var indent = this.$getIndent(line);\n        var prevLine = session.getLine(row - 1);\n        var prevIndent = this.$getIndent(prevLine);\n        var tab = session.getTabString();\n        if (prevIndent.length <= indent.length) {\n            if (indent.slice(-tab.length) == tab)\n                session.remove(new Range(row, indent.length-tab.length, row, indent.length));\n        }\n    };\n\n    this.$id = \"ace/mode/ruby\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-rust.js",
    "content": "ace.define(\"ace/mode/rust_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar RustHighlightRules = function() {\n\n    this.$rules = { start: \n       [ { token: 'variable.other.source.rust',\n           regex: '\\'[a-zA-Z_][a-zA-Z0-9_]*[^\\\\\\']' },\n         { token: 'string.quoted.single.source.rust',\n           regex: '\\'',\n           push: \n            [ { token: 'string.quoted.single.source.rust',\n                regex: '\\'',\n                next: 'pop' },\n              { include: '#rust_escaped_character' },\n              { defaultToken: 'string.quoted.single.source.rust' } ] },\n         {\n            stateName: \"bracketedComment\",\n            onMatch : function(value, currentState, stack){\n                stack.unshift(this.next, value.length - 1, currentState);\n                return \"string.quoted.raw.source.rust\";\n            },\n            regex : /r#*\"/,\n            next  : [\n                {\n                    onMatch : function(value, currentState, stack) {\n                        var token = \"string.quoted.raw.source.rust\";\n                        if (value.length >= stack[1]) {\n                            if (value.length > stack[1])\n                                token = \"invalid\";\n                            stack.shift();\n                            stack.shift();\n                            this.next = stack.shift();\n                        } else {\n                            this.next = \"\";\n                        }\n                        return token;\n                    },\n                    regex : /\"#*/,\n                    next  : \"start\"\n                }, {\n                    defaultToken : \"string.quoted.raw.source.rust\"\n                }\n            ]\n         },\n         { token: 'string.quoted.double.source.rust',\n           regex: '\"',\n           push: \n            [ { token: 'string.quoted.double.source.rust',\n                regex: '\"',\n                next: 'pop' },\n              { include: '#rust_escaped_character' },\n              { defaultToken: 'string.quoted.double.source.rust' } ] },\n         { token: [ 'keyword.source.rust', 'meta.function.source.rust',\n              'entity.name.function.source.rust', 'meta.function.source.rust' ],\n           regex: '\\\\b(fn)(\\\\s+)([a-zA-Z_][a-zA-Z0-9_][\\\\w\\\\:,+ \\\\\\'<>]*)(\\\\s*\\\\()' },\n         { token: 'support.constant', regex: '\\\\b[a-zA-Z_][\\\\w\\\\d]*::' },\n         { token: 'keyword.source.rust',\n           regex: '\\\\b(?:as|assert|break|claim|const|copy|Copy|do|drop|else|extern|fail|for|if|impl|in|let|log|loop|match|mod|module|move|mut|Owned|priv|pub|pure|ref|return|unchecked|unsafe|use|while|mod|Send|static|trait|class|struct|enum|type)\\\\b' },\n         { token: 'storage.type.source.rust',\n           regex: '\\\\b(?:Self|m32|m64|m128|f80|f16|f128|int|uint|float|char|bool|u8|u16|u32|u64|f32|f64|i8|i16|i32|i64|str|option|either|c_float|c_double|c_void|FILE|fpos_t|DIR|dirent|c_char|c_schar|c_uchar|c_short|c_ushort|c_int|c_uint|c_long|c_ulong|size_t|ptrdiff_t|clock_t|time_t|c_longlong|c_ulonglong|intptr_t|uintptr_t|off_t|dev_t|ino_t|pid_t|mode_t|ssize_t)\\\\b' },\n         { token: 'variable.language.source.rust', regex: '\\\\bself\\\\b' },\n         { token: 'keyword.operator',\n            regex: '!|\\\\$|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|-->|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|/=|%=|\\\\+=|\\\\-=|&=|\\\\^=|,|;' },\n         { token: 'constant.language.source.rust',\n           regex: '\\\\b(?:true|false|Some|None|Left|Right|Ok|Err)\\\\b' },\n         { token: 'support.constant.source.rust',\n           regex: '\\\\b(?:EXIT_FAILURE|EXIT_SUCCESS|RAND_MAX|EOF|SEEK_SET|SEEK_CUR|SEEK_END|_IOFBF|_IONBF|_IOLBF|BUFSIZ|FOPEN_MAX|FILENAME_MAX|L_tmpnam|TMP_MAX|O_RDONLY|O_WRONLY|O_RDWR|O_APPEND|O_CREAT|O_EXCL|O_TRUNC|S_IFIFO|S_IFCHR|S_IFBLK|S_IFDIR|S_IFREG|S_IFMT|S_IEXEC|S_IWRITE|S_IREAD|S_IRWXU|S_IXUSR|S_IWUSR|S_IRUSR|F_OK|R_OK|W_OK|X_OK|STDIN_FILENO|STDOUT_FILENO|STDERR_FILENO)\\\\b' },\n         { token: 'meta.preprocessor.source.rust',\n           regex: '\\\\b\\\\w\\\\(\\\\w\\\\)*!|#\\\\[[\\\\w=\\\\(\\\\)_]+\\\\]\\\\b' },\n         { token: 'constant.numeric.integer.source.rust',\n           regex: '\\\\b(?:[0-9][0-9_]*|[0-9][0-9_]*(?:u|u8|u16|u32|u64)|[0-9][0-9_]*(?:i|i8|i16|i32|i64))\\\\b' },\n         { token: 'constant.numeric.hex.source.rust',\n           regex: '\\\\b(?:0x[a-fA-F0-9_]+|0x[a-fA-F0-9_]+(?:u|u8|u16|u32|u64)|0x[a-fA-F0-9_]+(?:i|i8|i16|i32|i64))\\\\b' },\n         { token: 'constant.numeric.binary.source.rust',\n           regex: '\\\\b(?:0b[01_]+|0b[01_]+(?:u|u8|u16|u32|u64)|0b[01_]+(?:i|i8|i16|i32|i64))\\\\b' },\n         { token: 'constant.numeric.float.source.rust',\n           regex: '[0-9][0-9_]*(?:f32|f64|f)|[0-9][0-9_]*[eE][+-]=[0-9_]+|[0-9][0-9_]*[eE][+-]=[0-9_]+(?:f32|f64|f)|[0-9][0-9_]*\\\\.[0-9_]+|[0-9][0-9_]*\\\\.[0-9_]+(?:f32|f64|f)|[0-9][0-9_]*\\\\.[0-9_]+%[eE][+-]=[0-9_]+|[0-9][0-9_]*\\\\.[0-9_]+%[eE][+-]=[0-9_]+(?:f32|f64|f)' },\n         { token: 'comment.line.documentation.source.rust',\n           regex: '//!.*$',\n           push_: \n            [ { token: 'comment.line.documentation.source.rust',\n                regex: '$',\n                next: 'pop' },\n              { defaultToken: 'comment.line.documentation.source.rust' } ] },\n         { token: 'comment.line.double-dash.source.rust',\n           regex: '//.*$',\n           push_: \n            [ { token: 'comment.line.double-dash.source.rust',\n                regex: '$',\n                next: 'pop' },\n              { defaultToken: 'comment.line.double-dash.source.rust' } ] },\n         { token: 'comment.start.block.source.rust',\n           regex: '/\\\\*',\n           stateName: 'comment',\n           push: \n            [ { token: 'comment.start.block.source.rust',\n                regex: '/\\\\*',\n                push: 'comment' },\n              { token: 'comment.end.block.source.rust',\n                regex: '\\\\*/',\n                next: 'pop' },\n              { defaultToken: 'comment.block.source.rust' } ] } ],\n      '#rust_escaped_character': \n       [ { token: 'constant.character.escape.source.rust',\n           regex: '\\\\\\\\(?:x[\\\\da-fA-F]{2}|[0-2][0-7]{,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.)' } ] }\n    \n    this.normalizeRules();\n};\n\nRustHighlightRules.metaData = { fileTypes: [ 'rs', 'rc' ],\n      foldingStartMarker: '^.*\\\\bfn\\\\s*(\\\\w+\\\\s*)?\\\\([^\\\\)]*\\\\)(\\\\s*\\\\{[^\\\\}]*)?\\\\s*$',\n      foldingStopMarker: '^\\\\s*\\\\}',\n      name: 'Rust',\n      scopeName: 'source.rust' }\n\n\noop.inherits(RustHighlightRules, TextHighlightRules);\n\nexports.RustHighlightRules = RustHighlightRules;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/rust\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/rust_highlight_rules\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar RustHighlightRules = require(\"./rust_highlight_rules\").RustHighlightRules;\nvar FoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = RustHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n    this.$id = \"ace/mode/rust\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-sass.js",
    "content": "ace.define(\"ace/mode/scss_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar ScssHighlightRules = function() {\n    \n    var properties = lang.arrayToMap( (function () {\n\n        var browserPrefix = (\"-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-\").split(\"|\");\n        \n        var prefixProperties = (\"appearance|background-clip|background-inline-policy|background-origin|\" + \n             \"background-size|binding|border-bottom-colors|border-left-colors|\" + \n             \"border-right-colors|border-top-colors|border-end|border-end-color|\" + \n             \"border-end-style|border-end-width|border-image|border-start|\" + \n             \"border-start-color|border-start-style|border-start-width|box-align|\" + \n             \"box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|\" + \n             \"box-pack|box-sizing|column-count|column-gap|column-width|column-rule|\" + \n             \"column-rule-width|column-rule-style|column-rule-color|float-edge|\" + \n             \"font-feature-settings|font-language-override|force-broken-image-icon|\" + \n             \"image-region|margin-end|margin-start|opacity|outline|outline-color|\" + \n             \"outline-offset|outline-radius|outline-radius-bottomleft|\" + \n             \"outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|\" + \n             \"outline-style|outline-width|padding-end|padding-start|stack-sizing|\" + \n             \"tab-size|text-blink|text-decoration-color|text-decoration-line|\" + \n             \"text-decoration-style|transform|transform-origin|transition|\" + \n             \"transition-delay|transition-duration|transition-property|\" + \n             \"transition-timing-function|user-focus|user-input|user-modify|user-select|\" +\n             \"window-shadow|border-radius\").split(\"|\");\n        \n        var properties = (\"azimuth|background-attachment|background-color|background-image|\" +\n            \"background-position|background-repeat|background|border-bottom-color|\" +\n            \"border-bottom-style|border-bottom-width|border-bottom|border-collapse|\" +\n            \"border-color|border-left-color|border-left-style|border-left-width|\" +\n            \"border-left|border-right-color|border-right-style|border-right-width|\" +\n            \"border-right|border-spacing|border-style|border-top-color|\" +\n            \"border-top-style|border-top-width|border-top|border-width|border|bottom|\" +\n            \"box-shadow|box-sizing|caption-side|clear|clip|color|content|counter-increment|\" +\n            \"counter-reset|cue-after|cue-before|cue|cursor|direction|display|\" +\n            \"elevation|empty-cells|float|font-family|font-size-adjust|font-size|\" +\n            \"font-stretch|font-style|font-variant|font-weight|font|height|left|\" +\n            \"letter-spacing|line-height|list-style-image|list-style-position|\" +\n            \"list-style-type|list-style|margin-bottom|margin-left|margin-right|\" +\n            \"margin-top|marker-offset|margin|marks|max-height|max-width|min-height|\" +\n            \"min-width|opacity|orphans|outline-color|\" +\n            \"outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|\" +\n            \"padding-left|padding-right|padding-top|padding|page-break-after|\" +\n            \"page-break-before|page-break-inside|page|pause-after|pause-before|\" +\n            \"pause|pitch-range|pitch|play-during|position|quotes|richness|right|\" +\n            \"size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|\" +\n            \"stress|table-layout|text-align|text-decoration|text-indent|\" +\n            \"text-shadow|text-transform|top|unicode-bidi|vertical-align|\" +\n            \"visibility|voice-family|volume|white-space|widows|width|word-spacing|\" +\n            \"z-index\").split(\"|\");\n        var ret = [];\n        for (var i=0, ln=browserPrefix.length; i<ln; i++) {\n            Array.prototype.push.apply(\n                ret,\n                (( browserPrefix[i] + prefixProperties.join(\"|\" + browserPrefix[i]) ).split(\"|\"))\n            );\n        }\n        Array.prototype.push.apply(ret, prefixProperties);\n        Array.prototype.push.apply(ret, properties);\n        \n        return ret;\n        \n    })() );\n    \n\n\n    var functions = lang.arrayToMap(\n        (\"hsl|hsla|rgb|rgba|url|attr|counter|counters|abs|adjust_color|adjust_hue|\" +\n         \"alpha|join|blue|ceil|change_color|comparable|complement|darken|desaturate|\" + \n         \"floor|grayscale|green|hue|if|invert|join|length|lighten|lightness|mix|\" + \n         \"nth|opacify|opacity|percentage|quote|red|round|saturate|saturation|\" +\n         \"scale_color|transparentize|type_of|unit|unitless|unqoute\").split(\"|\")\n    );\n\n    var constants = lang.arrayToMap(\n        (\"absolute|all-scroll|always|armenian|auto|baseline|below|bidi-override|\" +\n        \"block|bold|bolder|border-box|both|bottom|break-all|break-word|capitalize|center|\" +\n        \"char|circle|cjk-ideographic|col-resize|collapse|content-box|crosshair|dashed|\" +\n        \"decimal-leading-zero|decimal|default|disabled|disc|\" +\n        \"distribute-all-lines|distribute-letter|distribute-space|\" +\n        \"distribute|dotted|double|e-resize|ellipsis|fixed|georgian|groove|\" +\n        \"hand|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|\" +\n        \"ideograph-alpha|ideograph-numeric|ideograph-parenthesis|\" +\n        \"ideograph-space|inactive|inherit|inline-block|inline|inset|inside|\" +\n        \"inter-ideograph|inter-word|italic|justify|katakana-iroha|katakana|\" +\n        \"keep-all|left|lighter|line-edge|line-through|line|list-item|loose|\" +\n        \"lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|\" +\n        \"medium|middle|move|n-resize|ne-resize|newspaper|no-drop|no-repeat|\" +\n        \"nw-resize|none|normal|not-allowed|nowrap|oblique|outset|outside|\" +\n        \"overline|pointer|progress|relative|repeat-x|repeat-y|repeat|right|\" +\n        \"ridge|row-resize|rtl|s-resize|scroll|se-resize|separate|small-caps|\" +\n        \"solid|square|static|strict|super|sw-resize|table-footer-group|\" +\n        \"table-header-group|tb-rl|text-bottom|text-top|text|thick|thin|top|\" +\n        \"transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|\" +\n        \"vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|\" +\n        \"zero\").split(\"|\")\n    );\n\n    var colors = lang.arrayToMap(\n        (\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|\" +\n        \"purple|red|silver|teal|white|yellow\").split(\"|\")\n    );\n    \n    var keywords = lang.arrayToMap(\n        (\"@mixin|@extend|@include|@import|@media|@debug|@warn|@if|@for|@each|@while|@else|@font-face|@-webkit-keyframes|if|and|!default|module|def|end|declare\").split(\"|\")\n    )\n    \n    var tags = lang.arrayToMap(\n        (\"a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdo|\" + \n         \"big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|\" + \n         \"command|datalist|dd|del|details|dfn|dir|div|dl|dt|em|embed|fieldset|\" + \n         \"figcaption|figure|font|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|\" + \n         \"header|hgroup|hr|html|i|iframe|img|input|ins|keygen|kbd|label|legend|li|\" + \n         \"link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|\" + \n         \"option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|\" + \n         \"small|source|span|strike|strong|style|sub|summary|sup|table|tbody|td|\" + \n         \"textarea|tfoot|th|thead|time|title|tr|tt|u|ul|var|video|wbr|xmp\").split(\"|\")\n    );\n\n    var numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                regex : '[\"].*\\\\\\\\$',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"string\", // multi line string start\n                regex : \"['].*\\\\\\\\$\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\",\n                regex : numRe + \"(?:em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)\"\n            }, {\n                token : \"constant.numeric\", // hex6 color\n                regex : \"#[a-f0-9]{6}\"\n            }, {\n                token : \"constant.numeric\", // hex3 color\n                regex : \"#[a-f0-9]{3}\"\n            }, {\n                token : \"constant.numeric\",\n                regex : numRe\n            }, {\n                token : [\"support.function\", \"string\", \"support.function\"],\n                regex : \"(url\\\\()(.*)(\\\\))\"\n            }, {\n                token : function(value) {\n                    if (properties.hasOwnProperty(value.toLowerCase()))\n                        return \"support.type\";\n                    if (keywords.hasOwnProperty(value))\n                        return \"keyword\";\n                    else if (constants.hasOwnProperty(value))\n                        return \"constant.language\";\n                    else if (functions.hasOwnProperty(value))\n                        return \"support.function\";\n                    else if (colors.hasOwnProperty(value.toLowerCase()))\n                        return \"support.constant.color\";\n                    else if (tags.hasOwnProperty(value.toLowerCase()))\n                        return \"variable.language\";\n                    else\n                        return \"text\";\n                },\n                regex : \"\\\\-?[@a-z_][@a-z0-9_\\\\-]*\"\n            }, {\n                token : \"variable\",\n                regex : \"[a-z_\\\\-$][a-z0-9_\\\\-$]*\\\\b\"\n            }, {\n                token: \"variable.language\",\n                regex: \"#[a-z0-9-_]+\"\n            }, {\n                token: \"variable.language\",\n                regex: \"\\\\.[a-z0-9-_]+\"\n            }, {\n                token: \"variable.language\",\n                regex: \":[a-z0-9-_]+\"\n            }, {\n                token: \"constant\",\n                regex: \"[a-z0-9-_]+\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"<|>|<=|>=|==|!=|-|%|#|\\\\+|\\\\$|\\\\+|\\\\*\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }, {\n                caseInsensitive: true\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '.+'\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '.+'\n            }\n        ]\n    };\n};\n\noop.inherits(ScssHighlightRules, TextHighlightRules);\n\nexports.ScssHighlightRules = ScssHighlightRules;\n\n});\n\nace.define(\"ace/mode/sass_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/scss_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar ScssHighlightRules = require(\"./scss_highlight_rules\").ScssHighlightRules;\n\nvar SassHighlightRules = function() {\n    ScssHighlightRules.call(this);\n    var start = this.$rules.start;\n    if (start[1].token == \"comment\") {\n        start.splice(1, 1, {\n            onMatch: function(value, currentState, stack) {\n                stack.unshift(this.next, -1, value.length - 2, currentState);\n                return \"comment\";\n            },\n            regex: /^\\s*\\/\\*/,\n            next: \"comment\"\n        }, {\n            token: \"error.invalid\",\n            regex: \"/\\\\*|[{;}]\"\n        }, {\n            token: \"support.type\",\n            regex: /^\\s*:[\\w\\-]+\\s/\n        });\n        \n        this.$rules.comment = [\n            {regex: /^\\s*/, onMatch: function(value, currentState, stack) {\n                if (stack[1] === -1)\n                    stack[1] = Math.max(stack[2], value.length - 1);\n                if (value.length <= stack[1]) {stack.shift();stack.shift();stack.shift();\n                    this.next = stack.shift();\n                    return \"text\";\n                } else {\n                    this.next = \"\";\n                    return \"comment\";\n                }\n            }, next: \"start\"},\n            {defaultToken: \"comment\"}\n        ]\n    }\n};\n\noop.inherits(SassHighlightRules, ScssHighlightRules);\n\nexports.SassHighlightRules = SassHighlightRules;\n\n});\n\nace.define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var range = this.indentationBlock(session, row);\n        if (range)\n            return range;\n\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1 || line[startLevel] != \"#\")\n            return;\n\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var level = line.search(re);\n\n            if (level == -1)\n                continue;\n\n            if (line[level] != \"#\")\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        var next = session.getLine(row + 1);\n        var prev = session.getLine(row - 1);\n        var prevIndent = prev.search(/\\S/);\n        var nextIndent = next.search(/\\S/);\n\n        if (indent == -1) {\n            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? \"start\" : \"\";\n            return \"\";\n        }\n        if (prevIndent == -1) {\n            if (indent == nextIndent && line[indent] == \"#\" && next[indent] == \"#\") {\n                session.foldWidgets[row - 1] = \"\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"start\";\n            }\n        } else if (prevIndent == indent && line[indent] == \"#\" && prev[indent] == \"#\") {\n            if (session.getLine(row - 2).search(/\\S/) == -1) {\n                session.foldWidgets[row - 1] = \"start\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"\";\n            }\n        }\n\n        if (prevIndent!= -1 && prevIndent < indent)\n            session.foldWidgets[row - 1] = \"start\";\n        else\n            session.foldWidgets[row - 1] = \"\";\n\n        if (indent < nextIndent)\n            return \"start\";\n        else\n            return \"\";\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/sass\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/sass_highlight_rules\",\"ace/mode/folding/coffee\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar SassHighlightRules = require(\"./sass_highlight_rules\").SassHighlightRules;\nvar FoldMode = require(\"./folding/coffee\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = SassHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {   \n    this.lineCommentStart = \"//\";\n    this.$id = \"ace/mode/sass\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-scad.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/scad_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar scadHighlightRules = function() {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": \"this\",\n        \"keyword\": \"module|if|else|for\",\n        \"constant.language\": \"NULL\"\n    }, \"identifier\");\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            DocCommentHighlightRules.getStartRule(\"start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                regex : '[\"].*\\\\\\\\$',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"string\", // multi line string start\n                regex : \"['].*\\\\\\\\$\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n              token : \"constant\", // <CONSTANT>\n              regex : \"<[a-zA-Z0-9.]+>\"\n            }, {\n              token : \"keyword\", // pre-compiler directivs\n              regex : \"(?:use|include)\"\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|==|=|!=|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|new|delete|typeof|void)\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '.+'\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '.+'\n            }\n        ]\n    };\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(scadHighlightRules, TextHighlightRules);\n\nexports.scadHighlightRules = scadHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/scad\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/scad_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar scadHighlightRules = require(\"./scad_highlight_rules\").scadHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = scadHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/scad\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-scala.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/scala_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar ScalaHighlightRules = function() {\n    var keywords = (\n            \"case|default|do|else|for|if|match|while|throw|return|try|catch|finally|yield|\" +\n            \"abstract|class|def|extends|final|forSome|implicit|implicits|import|lazy|new|object|\" +\n            \"override|package|private|protected|sealed|super|this|trait|type|val|var|with\"\n    );\n\n    var buildinConstants = (\"true|false\");\n\n    var langClasses = (\n        \"AbstractMethodError|AssertionError|ClassCircularityError|\"+\n        \"ClassFormatError|Deprecated|EnumConstantNotPresentException|\"+\n        \"ExceptionInInitializerError|IllegalAccessError|\"+\n        \"IllegalThreadStateException|InstantiationError|InternalError|\"+\n\n        \"NegativeArraySizeException|NoSuchFieldError|Override|Process|\"+\n        \"ProcessBuilder|SecurityManager|StringIndexOutOfBoundsException|\"+\n        \"SuppressWarnings|TypeNotPresentException|UnknownError|\"+\n        \"UnsatisfiedLinkError|UnsupportedClassVersionError|VerifyError|\"+\n        \"InstantiationException|IndexOutOfBoundsException|\"+\n        \"ArrayIndexOutOfBoundsException|CloneNotSupportedException|\"+\n        \"NoSuchFieldException|IllegalArgumentException|NumberFormatException|\"+\n        \"SecurityException|Void|InheritableThreadLocal|IllegalStateException|\"+\n        \"InterruptedException|NoSuchMethodException|IllegalAccessException|\"+\n        \"UnsupportedOperationException|Enum|StrictMath|Package|Compiler|\"+\n        \"Readable|Runtime|StringBuilder|Math|IncompatibleClassChangeError|\"+\n        \"NoSuchMethodError|ThreadLocal|RuntimePermission|ArithmeticException|\"+\n        \"NullPointerException|Long|Integer|Short|Byte|Double|Number|Float|\"+\n        \"Character|Boolean|StackTraceElement|Appendable|StringBuffer|\"+\n        \"Iterable|ThreadGroup|Runnable|Thread|IllegalMonitorStateException|\"+\n        \"StackOverflowError|OutOfMemoryError|VirtualMachineError|\"+\n        \"ArrayStoreException|ClassCastException|LinkageError|\"+\n        \"NoClassDefFoundError|ClassNotFoundException|RuntimeException|\"+\n        \"Exception|ThreadDeath|Error|Throwable|System|ClassLoader|\"+\n        \"Cloneable|Class|CharSequence|Comparable|String|Object|\" +\n        \"Unit|Any|AnyVal|AnyRef|Null|ScalaObject|Singleton|Seq|Iterable|List|\" +\n        \"Option|Array|Char|Byte|Short|Int|Long|Nothing\"\n\n\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\": \"this\",\n        \"keyword\": keywords,\n        \"support.function\": langClasses,\n        \"constant.language\": buildinConstants\n    }, \"identifier\");\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string.regexp\",\n                regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"\n            }, {\n                token : \"string\",\n                regex : '\"\"\"',\n                next : \"tstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)', // \" strings can't span multiple lines\n                next : \"string\"\n            }, {\n                token : \"symbol.constant\", // single line\n                regex : \"'[\\\\w\\\\d_]+\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false)\\\\b\"\n            }, {\n                token : keywordMapper,\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|\\\\b(?:in|instanceof|new|delete|typeof|void)\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ],\n        \"string\" : [\n            {\n                token : \"escape\",\n                regex : '\\\\\\\\\"'\n            }, {\n                token : \"string\",\n                regex : '\"',\n                next : \"start\"\n            }, {\n                token : \"string.invalid\",\n                regex : '[^\"\\\\\\\\]*$',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '[^\"\\\\\\\\]+'\n            }\n        ],\n        \"tstring\" : [\n            {\n                token : \"string\", // closing comment\n                regex : '\"{3,5}',\n                next : \"start\"\n            }, {\n                token : \"string\", // comment spanning whole line\n                regex : \".+?\"\n            }\n        ]\n    };\n\n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"start\") ]);\n};\n\noop.inherits(ScalaHighlightRules, TextHighlightRules);\n\nexports.ScalaHighlightRules = ScalaHighlightRules;\n});\n\nace.define(\"ace/mode/scala\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/javascript\",\"ace/mode/scala_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar ScalaHighlightRules = require(\"./scala_highlight_rules\").ScalaHighlightRules;\n\nvar Mode = function() {\n    JavaScriptMode.call(this);\n    \n    this.HighlightRules = ScalaHighlightRules;\n};\noop.inherits(Mode, JavaScriptMode);\n\n(function() {\n\n    this.createWorker = function(session) {\n        return null;\n    };\n\n    this.$id = \"ace/mode/scala\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-scheme.js",
    "content": "ace.define(\"ace/mode/scheme_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar SchemeHighlightRules = function() {\n    var keywordControl = \"case|do|let|loop|if|else|when\";\n    var keywordOperator = \"eq?|eqv?|equal?|and|or|not|null?\";\n    var constantLanguage = \"#t|#f\";\n    var supportFunctions = \"cons|car|cdr|cond|lambda|lambda*|syntax-rules|format|set!|quote|eval|append|list|list?|member?|load\";\n\n    var keywordMapper = this.createKeywordMapper({\n        \"keyword.control\": keywordControl,\n        \"keyword.operator\": keywordOperator,\n        \"constant.language\": constantLanguage,\n        \"support.function\": supportFunctions\n    }, \"identifier\", true);\n\n    this.$rules = \n        {\n    \"start\": [\n        {\n            token : \"comment\",\n            regex : \";.*$\"\n        },\n        {\n            \"token\": [\"storage.type.function-type.scheme\", \"text\", \"entity.name.function.scheme\"],\n            \"regex\": \"(?:\\\\b(?:(define|define-syntax|define-macro))\\\\b)(\\\\s+)((?:\\\\w|\\\\-|\\\\!|\\\\?)*)\"\n        },\n        {\n            \"token\": \"punctuation.definition.constant.character.scheme\",\n            \"regex\": \"#:\\\\S+\"\n        },\n        {\n            \"token\": [\"punctuation.definition.variable.scheme\", \"variable.other.global.scheme\", \"punctuation.definition.variable.scheme\"],\n            \"regex\": \"(\\\\*)(\\\\S*)(\\\\*)\"\n        },\n        {\n            \"token\" : \"constant.numeric\", // hex\n            \"regex\" : \"#[xXoObB][0-9a-fA-F]+\"\n        }, \n        {\n            \"token\" : \"constant.numeric\", // float\n            \"regex\" : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\"\n        },\n        {\n                \"token\" : keywordMapper,\n                \"regex\" : \"[a-zA-Z_#][a-zA-Z0-9_\\\\-\\\\?\\\\!\\\\*]*\"\n        },\n        {\n            \"token\" : \"string\",\n            \"regex\" : '\"(?=.)',\n            \"next\"  : \"qqstring\"\n        }\n    ],\n    \"qqstring\": [\n        {\n            \"token\": \"constant.character.escape.scheme\",\n            \"regex\": \"\\\\\\\\.\"\n        },\n        {\n            \"token\" : \"string\",\n            \"regex\" : '[^\"\\\\\\\\]+',\n            \"merge\" : true\n        }, {\n            \"token\" : \"string\",\n            \"regex\" : \"\\\\\\\\$\",\n            \"next\"  : \"qqstring\",\n            \"merge\" : true\n        }, {\n            \"token\" : \"string\",\n            \"regex\" : '\"|$',\n            \"next\"  : \"start\",\n            \"merge\" : true\n        }\n    ]\n}\n\n};\n\noop.inherits(SchemeHighlightRules, TextHighlightRules);\n\nexports.SchemeHighlightRules = SchemeHighlightRules;\n});\n\nace.define(\"ace/mode/scheme\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/scheme_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar SchemeHighlightRules = require(\"./scheme_highlight_rules\").SchemeHighlightRules;\n\nvar Mode = function() {\n    this.HighlightRules = SchemeHighlightRules;\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n       \n    this.lineCommentStart = \";\";\n    \n    this.$id = \"ace/mode/scheme\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-scss.js",
    "content": "ace.define(\"ace/mode/scss_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar ScssHighlightRules = function() {\n    \n    var properties = lang.arrayToMap( (function () {\n\n        var browserPrefix = (\"-webkit-|-moz-|-o-|-ms-|-svg-|-pie-|-khtml-\").split(\"|\");\n        \n        var prefixProperties = (\"appearance|background-clip|background-inline-policy|background-origin|\" + \n             \"background-size|binding|border-bottom-colors|border-left-colors|\" + \n             \"border-right-colors|border-top-colors|border-end|border-end-color|\" + \n             \"border-end-style|border-end-width|border-image|border-start|\" + \n             \"border-start-color|border-start-style|border-start-width|box-align|\" + \n             \"box-direction|box-flex|box-flexgroup|box-ordinal-group|box-orient|\" + \n             \"box-pack|box-sizing|column-count|column-gap|column-width|column-rule|\" + \n             \"column-rule-width|column-rule-style|column-rule-color|float-edge|\" + \n             \"font-feature-settings|font-language-override|force-broken-image-icon|\" + \n             \"image-region|margin-end|margin-start|opacity|outline|outline-color|\" + \n             \"outline-offset|outline-radius|outline-radius-bottomleft|\" + \n             \"outline-radius-bottomright|outline-radius-topleft|outline-radius-topright|\" + \n             \"outline-style|outline-width|padding-end|padding-start|stack-sizing|\" + \n             \"tab-size|text-blink|text-decoration-color|text-decoration-line|\" + \n             \"text-decoration-style|transform|transform-origin|transition|\" + \n             \"transition-delay|transition-duration|transition-property|\" + \n             \"transition-timing-function|user-focus|user-input|user-modify|user-select|\" +\n             \"window-shadow|border-radius\").split(\"|\");\n        \n        var properties = (\"azimuth|background-attachment|background-color|background-image|\" +\n            \"background-position|background-repeat|background|border-bottom-color|\" +\n            \"border-bottom-style|border-bottom-width|border-bottom|border-collapse|\" +\n            \"border-color|border-left-color|border-left-style|border-left-width|\" +\n            \"border-left|border-right-color|border-right-style|border-right-width|\" +\n            \"border-right|border-spacing|border-style|border-top-color|\" +\n            \"border-top-style|border-top-width|border-top|border-width|border|bottom|\" +\n            \"box-shadow|box-sizing|caption-side|clear|clip|color|content|counter-increment|\" +\n            \"counter-reset|cue-after|cue-before|cue|cursor|direction|display|\" +\n            \"elevation|empty-cells|float|font-family|font-size-adjust|font-size|\" +\n            \"font-stretch|font-style|font-variant|font-weight|font|height|left|\" +\n            \"letter-spacing|line-height|list-style-image|list-style-position|\" +\n            \"list-style-type|list-style|margin-bottom|margin-left|margin-right|\" +\n            \"margin-top|marker-offset|margin|marks|max-height|max-width|min-height|\" +\n            \"min-width|opacity|orphans|outline-color|\" +\n            \"outline-style|outline-width|outline|overflow|overflow-x|overflow-y|padding-bottom|\" +\n            \"padding-left|padding-right|padding-top|padding|page-break-after|\" +\n            \"page-break-before|page-break-inside|page|pause-after|pause-before|\" +\n            \"pause|pitch-range|pitch|play-during|position|quotes|richness|right|\" +\n            \"size|speak-header|speak-numeral|speak-punctuation|speech-rate|speak|\" +\n            \"stress|table-layout|text-align|text-decoration|text-indent|\" +\n            \"text-shadow|text-transform|top|unicode-bidi|vertical-align|\" +\n            \"visibility|voice-family|volume|white-space|widows|width|word-spacing|\" +\n            \"z-index\").split(\"|\");\n        var ret = [];\n        for (var i=0, ln=browserPrefix.length; i<ln; i++) {\n            Array.prototype.push.apply(\n                ret,\n                (( browserPrefix[i] + prefixProperties.join(\"|\" + browserPrefix[i]) ).split(\"|\"))\n            );\n        }\n        Array.prototype.push.apply(ret, prefixProperties);\n        Array.prototype.push.apply(ret, properties);\n        \n        return ret;\n        \n    })() );\n    \n\n\n    var functions = lang.arrayToMap(\n        (\"hsl|hsla|rgb|rgba|url|attr|counter|counters|abs|adjust_color|adjust_hue|\" +\n         \"alpha|join|blue|ceil|change_color|comparable|complement|darken|desaturate|\" + \n         \"floor|grayscale|green|hue|if|invert|join|length|lighten|lightness|mix|\" + \n         \"nth|opacify|opacity|percentage|quote|red|round|saturate|saturation|\" +\n         \"scale_color|transparentize|type_of|unit|unitless|unqoute\").split(\"|\")\n    );\n\n    var constants = lang.arrayToMap(\n        (\"absolute|all-scroll|always|armenian|auto|baseline|below|bidi-override|\" +\n        \"block|bold|bolder|border-box|both|bottom|break-all|break-word|capitalize|center|\" +\n        \"char|circle|cjk-ideographic|col-resize|collapse|content-box|crosshair|dashed|\" +\n        \"decimal-leading-zero|decimal|default|disabled|disc|\" +\n        \"distribute-all-lines|distribute-letter|distribute-space|\" +\n        \"distribute|dotted|double|e-resize|ellipsis|fixed|georgian|groove|\" +\n        \"hand|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|\" +\n        \"ideograph-alpha|ideograph-numeric|ideograph-parenthesis|\" +\n        \"ideograph-space|inactive|inherit|inline-block|inline|inset|inside|\" +\n        \"inter-ideograph|inter-word|italic|justify|katakana-iroha|katakana|\" +\n        \"keep-all|left|lighter|line-edge|line-through|line|list-item|loose|\" +\n        \"lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|\" +\n        \"medium|middle|move|n-resize|ne-resize|newspaper|no-drop|no-repeat|\" +\n        \"nw-resize|none|normal|not-allowed|nowrap|oblique|outset|outside|\" +\n        \"overline|pointer|progress|relative|repeat-x|repeat-y|repeat|right|\" +\n        \"ridge|row-resize|rtl|s-resize|scroll|se-resize|separate|small-caps|\" +\n        \"solid|square|static|strict|super|sw-resize|table-footer-group|\" +\n        \"table-header-group|tb-rl|text-bottom|text-top|text|thick|thin|top|\" +\n        \"transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|\" +\n        \"vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|\" +\n        \"zero\").split(\"|\")\n    );\n\n    var colors = lang.arrayToMap(\n        (\"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|\" +\n        \"purple|red|silver|teal|white|yellow\").split(\"|\")\n    );\n    \n    var keywords = lang.arrayToMap(\n        (\"@mixin|@extend|@include|@import|@media|@debug|@warn|@if|@for|@each|@while|@else|@font-face|@-webkit-keyframes|if|and|!default|module|def|end|declare\").split(\"|\")\n    )\n    \n    var tags = lang.arrayToMap(\n        (\"a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdo|\" + \n         \"big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|\" + \n         \"command|datalist|dd|del|details|dfn|dir|div|dl|dt|em|embed|fieldset|\" + \n         \"figcaption|figure|font|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|\" + \n         \"header|hgroup|hr|html|i|iframe|img|input|ins|keygen|kbd|label|legend|li|\" + \n         \"link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|\" + \n         \"option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|\" + \n         \"small|source|span|strike|strong|style|sub|summary|sup|table|tbody|td|\" + \n         \"textarea|tfoot|th|thead|time|title|tr|tt|u|ul|var|video|wbr|xmp\").split(\"|\")\n    );\n\n    var numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\n\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/.*$\"\n            },\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                regex : '[\"].*\\\\\\\\$',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single line\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"string\", // multi line string start\n                regex : \"['].*\\\\\\\\$\",\n                next : \"qstring\"\n            }, {\n                token : \"constant.numeric\",\n                regex : numRe + \"(?:em|ex|px|cm|mm|in|pt|pc|deg|rad|grad|ms|s|hz|khz|%)\"\n            }, {\n                token : \"constant.numeric\", // hex6 color\n                regex : \"#[a-f0-9]{6}\"\n            }, {\n                token : \"constant.numeric\", // hex3 color\n                regex : \"#[a-f0-9]{3}\"\n            }, {\n                token : \"constant.numeric\",\n                regex : numRe\n            }, {\n                token : [\"support.function\", \"string\", \"support.function\"],\n                regex : \"(url\\\\()(.*)(\\\\))\"\n            }, {\n                token : function(value) {\n                    if (properties.hasOwnProperty(value.toLowerCase()))\n                        return \"support.type\";\n                    if (keywords.hasOwnProperty(value))\n                        return \"keyword\";\n                    else if (constants.hasOwnProperty(value))\n                        return \"constant.language\";\n                    else if (functions.hasOwnProperty(value))\n                        return \"support.function\";\n                    else if (colors.hasOwnProperty(value.toLowerCase()))\n                        return \"support.constant.color\";\n                    else if (tags.hasOwnProperty(value.toLowerCase()))\n                        return \"variable.language\";\n                    else\n                        return \"text\";\n                },\n                regex : \"\\\\-?[@a-z_][@a-z0-9_\\\\-]*\"\n            }, {\n                token : \"variable\",\n                regex : \"[a-z_\\\\-$][a-z0-9_\\\\-$]*\\\\b\"\n            }, {\n                token: \"variable.language\",\n                regex: \"#[a-z0-9-_]+\"\n            }, {\n                token: \"variable.language\",\n                regex: \"\\\\.[a-z0-9-_]+\"\n            }, {\n                token: \"variable.language\",\n                regex: \":[a-z0-9-_]+\"\n            }, {\n                token: \"constant\",\n                regex: \"[a-z0-9-_]+\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"<|>|<=|>=|==|!=|-|%|#|\\\\+|\\\\$|\\\\+|\\\\*\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }, {\n                caseInsensitive: true\n            }\n        ],\n        \"comment\" : [\n            {\n                token : \"comment\", // closing comment\n                regex : \".*?\\\\*\\\\/\",\n                next : \"start\"\n            }, {\n                token : \"comment\", // comment spanning whole line\n                regex : \".+\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '.+'\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"string\",\n                regex : \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '.+'\n            }\n        ]\n    };\n};\n\noop.inherits(ScssHighlightRules, TextHighlightRules);\n\nexports.ScssHighlightRules = ScssHighlightRules;\n\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar CssBehaviour = function () {\n\n    this.inherit(CstyleBehaviour);\n\n    this.add(\"colon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(cursor.row);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                if (rightChar === ':') {\n                    return {\n                       text: '',\n                       selection: [1, 1]\n                    }\n                }\n                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n                    return {\n                       text: ':;',\n                       selection: [1, 1]\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"colon\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(range.start.row);\n                var rightChar = line.substring(range.end.column, range.end.column + 1);\n                if (rightChar === ';') {\n                    range.end.column ++;\n                    return range;\n                }\n            }\n        }\n    });\n\n    this.add(\"semicolon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ';') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === ';') {\n                return {\n                   text: '',\n                   selection: [1, 1]\n                }\n            }\n        }\n    });\n\n}\noop.inherits(CssBehaviour, CstyleBehaviour);\n\nexports.CssBehaviour = CssBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/scss\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/scss_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar ScssHighlightRules = require(\"./scss_highlight_rules\").ScssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar CssBehaviour = require(\"./behaviour/css\").CssBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = ScssHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CssBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n   \n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/scss\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-sh.js",
    "content": "ace.define(\"ace/mode/sh_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar reservedKeywords = exports.reservedKeywords = (\n        '!|{|}|case|do|done|elif|else|'+\n        'esac|fi|for|if|in|then|until|while|'+\n        '&|;|export|local|read|typeset|unset|'+\n        'elif|select|set'\n    );\n\nvar languageConstructs = exports.languageConstructs = (\n    '[|]|alias|bg|bind|break|builtin|'+\n     'cd|command|compgen|complete|continue|'+\n     'dirs|disown|echo|enable|eval|exec|'+\n     'exit|fc|fg|getopts|hash|help|history|'+\n     'jobs|kill|let|logout|popd|printf|pushd|'+\n     'pwd|return|set|shift|shopt|source|'+\n     'suspend|test|times|trap|type|ulimit|'+\n     'umask|unalias|wait'\n);\n\nvar ShHighlightRules = function() {\n    var keywordMapper = this.createKeywordMapper({\n        \"keyword\": reservedKeywords,\n        \"support.function.builtin\": languageConstructs,\n        \"invalid.deprecated\": \"debugger\"\n    }, \"identifier\");\n\n    var integer = \"(?:(?:[1-9]\\\\d*)|(?:0))\";\n\n    var fraction = \"(?:\\\\.\\\\d+)\";\n    var intPart = \"(?:\\\\d+)\";\n    var pointFloat = \"(?:(?:\" + intPart + \"?\" + fraction + \")|(?:\" + intPart + \"\\\\.))\";\n    var exponentFloat = \"(?:(?:\" + pointFloat + \"|\" +  intPart + \")\" + \")\";\n    var floatNumber = \"(?:\" + exponentFloat + \"|\" + pointFloat + \")\";\n    var fileDescriptor = \"(?:&\" + intPart + \")\";\n\n    var variableName = \"[a-zA-Z_][a-zA-Z0-9_]*\";\n    var variable = \"(?:(?:\\\\$\" + variableName + \")|(?:\" + variableName + \"=))\";\n\n    var builtinVariable = \"(?:\\\\$(?:SHLVL|\\\\$|\\\\!|\\\\?))\";\n\n    var func = \"(?:\" + variableName + \"\\\\s*\\\\(\\\\))\";\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"constant\",\n            regex : /\\\\./\n        }, {\n            token : [\"text\", \"comment\"],\n            regex : /(^|\\s)(#.*)$/\n        }, {\n            token : \"string\",\n            regex : '\"',\n            push : [{\n                token : \"constant.language.escape\",\n                regex : /\\\\(?:[$abeEfnrtv\\\\'\"]|x[a-fA-F\\d]{1,2}|u[a-fA-F\\d]{4}([a-fA-F\\d]{4})?|c.|\\d{1,3})/\n            }, {\n                token : \"constant\",\n                regex : /\\$\\w+/\n            }, {\n                token : \"string\",\n                regex : '\"',\n                next: \"pop\"\n            }, {\n                defaultToken: \"string\"\n            }]\n        }, {\n            regex : \"<<<\",\n            token : \"keyword.operator\"\n        }, {\n            stateName: \"heredoc\",\n            regex : \"(<<)(\\\\s*)(['\\\"`]?)([\\\\w\\\\-]+)(['\\\"`]?)\",\n            onMatch : function(value, currentState, stack) {\n                var next = value[2] == '-' ? \"indentedHeredoc\" : \"heredoc\";\n                var tokens = value.split(this.splitRegex);\n                stack.push(next, tokens[4]);\n                return [\n                    {type:\"constant\", value: tokens[1]},\n                    {type:\"text\", value: tokens[2]},\n                    {type:\"string\", value: tokens[3]},\n                    {type:\"support.class\", value: tokens[4]},\n                    {type:\"string\", value: tokens[5]}\n                ];\n            },\n            rules: {\n                heredoc: [{\n                    onMatch:  function(value, currentState, stack) {\n                        if (value === stack[1]) {\n                            stack.shift();\n                            stack.shift();\n                            this.next = stack[0] || \"start\";\n                            return \"support.class\";\n                        }\n                        this.next = \"\";\n                        return \"string\";\n                    },\n                    regex: \".*$\",\n                    next: \"start\"\n                }],\n                indentedHeredoc: [{\n                    token: \"string\",\n                    regex: \"^\\t+\"\n                }, {\n                    onMatch:  function(value, currentState, stack) {\n                        if (value === stack[1]) {\n                            stack.shift();\n                            stack.shift();\n                            this.next = stack[0] || \"start\";\n                            return \"support.class\";\n                        }\n                        this.next = \"\";\n                        return \"string\";\n                    },\n                    regex: \".*$\",\n                    next: \"start\"\n                }]\n            }\n        }, {\n            regex : \"$\",\n            token : \"empty\",\n            next : function(currentState, stack) {\n                if (stack[0] === \"heredoc\" || stack[0] === \"indentedHeredoc\")\n                    return stack[0];\n                return currentState;\n            }\n        }, {\n            token : \"variable.language\",\n            regex : builtinVariable\n        }, {\n            token : \"variable\",\n            regex : variable\n        }, {\n            token : \"support.function\",\n            regex : func\n        }, {\n            token : \"support.function\",\n            regex : fileDescriptor\n        }, {\n            token : \"string\",           // ' string\n            start : \"'\", end : \"'\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : floatNumber\n        }, {\n            token : \"constant.numeric\", // integer\n            regex : integer + \"\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_][a-zA-Z0-9_]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\\\+|\\\\-|\\\\*|\\\\*\\\\*|\\\\/|\\\\/\\\\/|~|<|>|<=|=>|=|!=\"\n        }, {\n            token : \"paren.lparen\",\n            regex : \"[\\\\[\\\\(\\\\{]\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\]\\\\)\\\\}]\"\n        } ]\n    };\n    \n    this.normalizeRules();\n};\n\noop.inherits(ShHighlightRules, TextHighlightRules);\n\nexports.ShHighlightRules = ShHighlightRules;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/sh\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/sh_highlight_rules\",\"ace/range\",\"ace/mode/folding/cstyle\",\"ace/mode/behaviour/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar ShHighlightRules = require(\"./sh_highlight_rules\").ShHighlightRules;\nvar Range = require(\"../range\").Range;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\n\nvar Mode = function() {\n    this.HighlightRules = ShHighlightRules;\n    this.foldingRules = new CStyleFoldMode();\n    this.$behaviour = new CstyleBehaviour();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n   \n    this.lineCommentStart = \"#\";\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[\\:]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    var outdents = {\n        \"pass\": 1,\n        \"return\": 1,\n        \"raise\": 1,\n        \"break\": 1,\n        \"continue\": 1\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        if (input !== \"\\r\\n\" && input !== \"\\r\" && input !== \"\\n\")\n            return false;\n\n        var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens;\n\n        if (!tokens)\n            return false;\n        do {\n            var last = tokens.pop();\n        } while (last && (last.type == \"comment\" || (last.type == \"text\" && last.value.match(/^\\s+$/))));\n\n        if (!last)\n            return false;\n\n        return (last.type == \"keyword\" && outdents[last.value]);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n\n        row += 1;\n        var indent = this.$getIndent(doc.getLine(row));\n        var tab = doc.getTabString();\n        if (indent.slice(-tab.length) == tab)\n            doc.remove(new Range(row, indent.length-tab.length, row, indent.length));\n    };\n\n    this.$id = \"ace/mode/sh\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-sjs.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/sjs_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar SJSHighlightRules = function() {\n    var parent = new JavaScriptHighlightRules({noES6: true});\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    var contextAware = function(f) {\n        f.isContextAware = true;\n        return f;\n    };\n\n    var ctxBegin = function(opts) {\n        return {\n            token: opts.token,\n            regex: opts.regex,\n            next: contextAware(function(currentState, stack) {\n                if (stack.length === 0)\n                    stack.unshift(currentState);\n                stack.unshift(opts.next);\n                return opts.next;\n            }),\n        };\n    };\n\n    var ctxEnd = function(opts) {\n        return {\n            token: opts.token,\n            regex: opts.regex,\n            next: contextAware(function(currentState, stack) {\n                stack.shift();\n                return stack[0] || \"start\";\n            }),\n        };\n    };\n\n    this.$rules = parent.$rules;\n    this.$rules.no_regex = [\n        {\n            token: \"keyword\",\n            regex: \"(waitfor|or|and|collapse|spawn|retract)\\\\b\"\n        },\n        {\n            token: \"keyword.operator\",\n            regex: \"(->|=>|\\\\.\\\\.)\"\n        },\n        {\n            token: \"variable.language\",\n            regex: \"(hold|default)\\\\b\"\n        },\n        ctxBegin({\n            token: \"string\",\n            regex: \"`\",\n            next: \"bstring\"\n        }),\n        ctxBegin({\n            token: \"string\",\n            regex: '\"',\n            next: \"qqstring\"\n        }),\n        ctxBegin({\n            token: \"string\",\n            regex: '\"',\n            next: \"qqstring\"\n        }),\n        {\n            token: [\"paren.lparen\", \"text\", \"paren.rparen\"],\n            regex: \"(\\\\{)(\\\\s*)(\\\\|)\",\n            next: \"block_arguments\",\n        }\n\n    ].concat(this.$rules.no_regex);\n\n    this.$rules.block_arguments = [\n        {\n            token: \"paren.rparen\",\n            regex: \"\\\\|\",\n            next: \"no_regex\",\n        }\n    ].concat(this.$rules.function_arguments);\n\n    this.$rules.bstring = [\n        {\n            token : \"constant.language.escape\",\n            regex : escapedRe\n        },\n        {\n            token : \"string\",\n            regex : \"\\\\\\\\$\",\n            next: \"bstring\"\n        },\n        ctxBegin({\n            token : \"paren.lparen\",\n            regex : \"\\\\$\\\\{\",\n            next: \"string_interp\"\n        }),\n        ctxBegin({\n            token : \"paren.lparen\",\n            regex : \"\\\\$\",\n            next: \"bstring_interp_single\"\n        }),\n        ctxEnd({\n            token : \"string\",\n            regex : \"`\",\n        }),\n        {\n            defaultToken: \"string\"\n        }\n    ];\n    \n    this.$rules.qqstring = [\n        {\n            token : \"constant.language.escape\",\n            regex : escapedRe\n        },\n        {\n            token : \"string\",\n            regex : \"\\\\\\\\$\",\n            next: \"qqstring\",\n        },\n        ctxBegin({\n            token : \"paren.lparen\",\n            regex : \"#\\\\{\",\n            next: \"string_interp\"\n        }),\n        ctxEnd({\n            token : \"string\",\n            regex : '\"',\n        }),\n        {\n            defaultToken: \"string\"\n        }\n    ];\n    var embeddableRules = [];\n    for (var i=0; i < this.$rules.no_regex.length; i++) {\n        var rule = this.$rules.no_regex[i];\n        var token = String(rule.token);\n        if (token.indexOf('paren') == -1 && (!rule.next || rule.next.isContextAware)) {\n            embeddableRules.push(rule);\n        }\n    };\n\n    this.$rules.string_interp = [\n        ctxEnd({\n            token: \"paren.rparen\",\n            regex: \"\\\\}\"\n        }),\n        ctxBegin({\n            token: \"paren.lparen\",\n            regex: '{',\n            next: \"string_interp\"\n        })\n    ].concat(embeddableRules);\n    this.$rules.bstring_interp_single = [\n        {\n            token: [\"identifier\", \"paren.lparen\"],\n            regex: '(\\\\w+)(\\\\()',\n            next: 'bstring_interp_single_call'\n        },\n        ctxEnd({\n            token : \"identifier\",\n            regex : \"\\\\w*\",\n        })\n    ];\n    this.$rules.bstring_interp_single_call = [\n        ctxBegin({\n            token: \"paren.lparen\",\n            regex: \"\\\\(\",\n            next: \"bstring_interp_single_call\"\n        }),\n        ctxEnd({\n            token: \"paren.rparen\",\n            regex: \"\\\\)\"\n        })\n    ].concat(embeddableRules);\n}\noop.inherits(SJSHighlightRules, TextHighlightRules);\n\nexports.SJSHighlightRules = SJSHighlightRules;\n});\n\nace.define(\"ace/mode/sjs\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/javascript\",\"ace/mode/sjs_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\nvar oop = require(\"../lib/oop\");\nvar JSMode = require(\"./javascript\").Mode;\nvar SJSHighlightRules = require(\"./sjs_highlight_rules\").SJSHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = SJSHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, JSMode);\n(function() {\n    this.createWorker = function(session) {\n        return null;\n    }\n    this.$id = \"ace/mode/sjs\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-smarty.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\nace.define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar CssBehaviour = function () {\n\n    this.inherit(CstyleBehaviour);\n\n    this.add(\"colon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(cursor.row);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                if (rightChar === ':') {\n                    return {\n                       text: '',\n                       selection: [1, 1]\n                    }\n                }\n                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n                    return {\n                       text: ':;',\n                       selection: [1, 1]\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"colon\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(range.start.row);\n                var rightChar = line.substring(range.end.column, range.end.column + 1);\n                if (rightChar === ';') {\n                    range.end.column ++;\n                    return range;\n                }\n            }\n        }\n    });\n\n    this.add(\"semicolon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ';') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === ';') {\n                return {\n                   text: '',\n                   selection: [1, 1]\n                }\n            }\n        }\n    });\n\n}\noop.inherits(CssBehaviour, CstyleBehaviour);\n\nexports.CssBehaviour = CssBehaviour;\n});\n\nace.define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CssBehaviour = require(\"./behaviour/css\").CssBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = CssHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CssBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"csslint\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/css\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\nace.define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"string.cdata.xml\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.xml-decl.xml\", \"keyword.xml-decl.xml\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_decl\", caseInsensitive: true\n            },\n            {\n                token : [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"processing_instruction\",\n            },\n            {token : \"comment.xml\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\", caseInsensitive: true\n            },\n            {include : \"tag\"},\n            {token : \"text.end-tag-open.xml\", regex: \"</\"},\n            {token : \"text.tag-open.xml\", regex: \"<\"},\n            {include : \"reference\"},\n            {defaultToken : \"text.xml\"}\n        ],\n\n        xml_decl : [{\n            token : \"entity.other.attribute-name.decl-attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.decl-attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"whitespace\"\n        }, {\n            include: \"string\"\n        }, {\n            token : \"punctuation.xml-decl.xml\",\n            regex : \"\\\\?>\",\n            next : \"start\"\n        }],\n\n        processing_instruction : [\n            {token : \"punctuation.instruction.xml\", regex : \"\\\\?>\", next : \"start\"},\n            {defaultToken : \"instruction.xml\"}\n        ],\n\n        doctype : [\n            {include : \"whitespace\"},\n            {include : \"string\"},\n            {token : \"xml-pe.doctype.xml\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe.xml\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.int-subset\", regex : \"\\\\[\", push : \"int_subset\"}\n        ],\n\n        int_subset : [{\n            token : \"text.xml\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.int-subset.xml\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.markup-decl.xml\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.cdata.xml\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text.xml\", regex : \"\\\\s+\"},\n            {token : \"text.xml\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment.xml\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment.xml\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape.reference.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        attr_reference : [{\n            token : \"constant.language.escape.reference.attribute-value.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n            regex : \"(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n            ]\n        }],\n\n        tag_whitespace : [\n            {token : \"text.tag-whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        whitespace : [\n            {token : \"text.whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        string: [{\n            token : \"string.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.xml\", regex: \"'\", next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }, {\n            token : \"string.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.xml\", regex: '\"', next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }],\n\n        attributes: [{\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"tag_whitespace\"\n        }, {\n            include: \"attribute_value\"\n        }],\n\n        attribute_value: [{\n            token : \"string.attribute-value.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }, {\n            token : \"string.attribute-value.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\nace.define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    option      : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.addRules({\n        attributes: [{\n            include : \"tag_whitespace\"\n        }, {\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\",\n            push : [{\n                include: \"tag_whitespace\"\n            }, {\n                token : \"string.unquoted.attribute-value.html\",\n                regex : \"[^<>='\\\"`\\\\s]+\",\n                next : \"pop\"\n            }, {\n                token : \"empty\",\n                regex : \"\",\n                next : \"pop\"\n            }]\n        }, {\n            include : \"attribute_value\"\n        }],\n        tag: [{\n            token : function(start, tag) {\n                var group = tagMap[tag];\n                return [\"meta.tag.punctuation.\" + (start == \"<\" ? \"\" : \"end-\") + \"tag-open.xml\",\n                    \"meta.tag\" + (group ? \".\" + group : \"\") + \".tag-name.xml\"];\n            },\n            regex : \"(</?)([-_a-zA-Z0-9:]+)\",\n            next: \"tag_stuff\"\n        }],\n        tag_stuff: [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n        ],\n    });\n\n    this.embedTagRules(CssHighlightRules, \"css-\", \"style\");\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    if (this.constructor === HtmlHighlightRules)\n        this.normalizeRules();\n};\n\noop.inherits(HtmlHighlightRules, XmlHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nvar XmlBehaviour = function () {\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selected = session.doc.getTextRange(editor.getSelectionRange());\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            }\n\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (rightChar == quote && (is(token, \"attribute-value\") || is(token, \"string\"))) {\n                return {\n                    text: \"\",\n                    selection: [1, 1]\n                };\n            }\n\n            if (!token)\n                token = iterator.stepBackward();\n\n            if (!token)\n                return;\n\n            while (is(token, \"tag-whitespace\") || is(token, \"whitespace\")) {\n                token = iterator.stepBackward();\n            }\n            var rightSpace = !rightChar || rightChar.match(/\\s/);\n            if (is(token, \"attribute-equals\") && (rightSpace || rightChar == '>') || (is(token, \"decl-attribute-equals\") && (rightSpace || rightChar == '?'))) {\n                return {\n                    text: quote + quote,\n                    selection: [1, 1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken() || iterator.stepBackward();\n            if (!token || !(is(token, \"tag-name\") || is(token, \"tag-whitespace\") || is(token, \"attribute-name\") || is(token, \"attribute-equals\") || is(token, \"attribute-value\")))\n                return;\n            if (is(token, \"reference.attribute-value\"))\n                return;\n            if (is(token, \"attribute-value\")) {\n                var firstChar = token.value.charAt(0);\n                if (firstChar == '\"' || firstChar == \"'\") {\n                    var lastChar = token.value.charAt(token.value.length - 1);\n                    var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length;\n                    if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar)\n                        return;\n                }\n            }\n            while (!is(token, \"tag-name\")) {\n                token = iterator.stepBackward();\n            }\n\n            var tokenRow = iterator.getCurrentTokenRow();\n            var tokenColumn = iterator.getCurrentTokenColumn();\n            if (is(iterator.stepBackward(), \"end-tag-open\"))\n                return;\n\n            var element = token.value;\n            if (tokenRow == position.row)\n                element = element.substring(0, position.column - tokenColumn);\n\n            if (this.voidElements.hasOwnProperty(element.toLowerCase()))\n                 return;\n\n            return {\n               text: \">\" + \"</\" + element + \">\",\n               selection: [1, 1]\n            };\n        }\n    });\n\n    this.add(\"autoindent\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.getLine(cursor.row);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (token && token.type.indexOf(\"tag-close\") !== -1) {\n                while (token && token.type.indexOf(\"tag-name\") === -1) {\n                    token = iterator.stepBackward();\n                }\n\n                if (!token) {\n                    return;\n                }\n\n                var tag = token.value;\n                var row = iterator.getCurrentTokenRow();\n                token = iterator.stepBackward();\n                if (!token || token.type.indexOf(\"end-tag\") !== -1) {\n                    return;\n                }\n\n                if (this.voidElements && !this.voidElements[tag]) {\n                    var nextToken = session.getTokenAt(cursor.row, cursor.column+1);\n                    var line = session.getLine(row);\n                    var nextIndent = this.$getIndent(line);\n                    var indent = nextIndent + session.getTabString();\n\n                    if (nextToken && nextToken.value === \"</\") {\n                        return {\n                            text: \"\\n\" + indent + \"\\n\" + nextIndent,\n                            selection: [1, indent.length, 1, indent.length]\n                        };\n                    } else {\n                        return {\n                            text: \"\\n\" + indent\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n};\n\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\nace.define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n    this.defaultMode = defaultMode;\n    this.subModes = subModes;\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n\n    this.$getMode = function(state) {\n        if (typeof state != \"string\") \n            state = state[0];\n        for (var key in this.subModes) {\n            if (state.indexOf(key) === 0)\n                return this.subModes[key];\n        }\n        return null;\n    };\n    \n    this.$tryMode = function(state, session, foldStyle, row) {\n        var mode = this.$getMode(state);\n        return (mode ? mode.getFoldWidget(session, foldStyle, row) : \"\");\n    };\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        return (\n            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n            this.defaultMode.getFoldWidget(session, foldStyle, row)\n        );\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var mode = this.$getMode(session.getState(row-1));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.$getMode(session.getState(row));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.defaultMode;\n        \n        return mode.getFoldWidgetRange(session, foldStyle, row);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalEndTags) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n    this.optionalEndTags = oop.mixin({}, this.voidElements);\n    if (optionalEndTags)\n        oop.mixin(this.optionalEndTags, optionalEndTags);\n    \n};\noop.inherits(FoldMode, BaseFoldMode);\n\nvar Tag = function() {\n    this.tagName = \"\";\n    this.closing = false;\n    this.selfClosing = false;\n    this.start = {row: 0, column: 0};\n    this.end = {row: 0, column: 0};\n};\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (!tag)\n            return \"\";\n\n        if (tag.closing || (!tag.tagName && tag.selfClosing))\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase()))\n            return \"\";\n\n        if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column))\n            return \"\";\n\n        return \"start\";\n    };\n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var tag = new Tag();\n\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (is(token, \"tag-open\")) {\n                tag.end.column = tag.start.column + token.value.length;\n                tag.closing = is(token, \"end-tag-open\");\n                token = tokens[++i];\n                if (!token)\n                    return null;\n                tag.tagName = token.value;\n                tag.end.column += token.value.length;\n                for (i++; i < tokens.length; i++) {\n                    token = tokens[i];\n                    tag.end.column += token.value.length;\n                    if (is(token, \"tag-close\")) {\n                        tag.selfClosing = token.value == '/>';\n                        break;\n                    }\n                }\n                return tag;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == '/>';\n                return tag;\n            }\n            tag.start.column += token.value.length;\n        }\n\n        return null;\n    };\n\n    this._findEndTagInLine = function(session, row, tagName, startColumn) {\n        var tokens = session.getTokens(row);\n        var column = 0;\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            column += token.value.length;\n            if (column < startColumn)\n                continue;\n            if (is(token, \"end-tag-open\")) {\n                token = tokens[i + 1];\n                if (token && token.value == tagName)\n                    return true;\n            }\n        }\n        return false;\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n                iterator.stepForward();\n                return tag;\n            }\n        } while(token = iterator.stepForward());\n\n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n                iterator.stepBackward();\n                return tag;\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n            }\n        } while(token = iterator.stepBackward());\n\n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.optionalEndTags.hasOwnProperty(top.tagName)) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.start.column);\n            var start = {\n                row: row,\n                column: firstTag.start.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.end.column);\n            var end = {\n                row: row,\n                column: firstTag.start.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar MixedFoldMode = require(\"./mixed\").FoldMode;\nvar XmlFoldMode = require(\"./xml\").FoldMode;\nvar CStyleFoldMode = require(\"./cstyle\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalTags) {\n    MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), {\n        \"js-\": new CStyleFoldMode(),\n        \"css-\": new CStyleFoldMode()\n    });\n};\n\noop.inherits(FoldMode, MixedFoldMode);\n\n});\n\nace.define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\n\nvar commonAttributes = [\n    \"accesskey\",\n    \"class\",\n    \"contenteditable\",\n    \"contextmenu\",\n    \"dir\",\n    \"draggable\",\n    \"dropzone\",\n    \"hidden\",\n    \"id\",\n    \"inert\",\n    \"itemid\",\n    \"itemprop\",\n    \"itemref\",\n    \"itemscope\",\n    \"itemtype\",\n    \"lang\",\n    \"spellcheck\",\n    \"style\",\n    \"tabindex\",\n    \"title\",\n    \"translate\"\n];\n\nvar eventAttributes = [\n    \"onabort\",\n    \"onblur\",\n    \"oncancel\",\n    \"oncanplay\",\n    \"oncanplaythrough\",\n    \"onchange\",\n    \"onclick\",\n    \"onclose\",\n    \"oncontextmenu\",\n    \"oncuechange\",\n    \"ondblclick\",\n    \"ondrag\",\n    \"ondragend\",\n    \"ondragenter\",\n    \"ondragleave\",\n    \"ondragover\",\n    \"ondragstart\",\n    \"ondrop\",\n    \"ondurationchange\",\n    \"onemptied\",\n    \"onended\",\n    \"onerror\",\n    \"onfocus\",\n    \"oninput\",\n    \"oninvalid\",\n    \"onkeydown\",\n    \"onkeypress\",\n    \"onkeyup\",\n    \"onload\",\n    \"onloadeddata\",\n    \"onloadedmetadata\",\n    \"onloadstart\",\n    \"onmousedown\",\n    \"onmousemove\",\n    \"onmouseout\",\n    \"onmouseover\",\n    \"onmouseup\",\n    \"onmousewheel\",\n    \"onpause\",\n    \"onplay\",\n    \"onplaying\",\n    \"onprogress\",\n    \"onratechange\",\n    \"onreset\",\n    \"onscroll\",\n    \"onseeked\",\n    \"onseeking\",\n    \"onselect\",\n    \"onshow\",\n    \"onstalled\",\n    \"onsubmit\",\n    \"onsuspend\",\n    \"ontimeupdate\",\n    \"onvolumechange\",\n    \"onwaiting\"\n];\n\nvar globalAttributes = commonAttributes.concat(eventAttributes);\n\nvar attributeMap = {\n    \"html\": [\"manifest\"],\n    \"head\": [],\n    \"title\": [],\n    \"base\": [\"href\", \"target\"],\n    \"link\": [\"href\", \"hreflang\", \"rel\", \"media\", \"type\", \"sizes\"],\n    \"meta\": [\"http-equiv\", \"name\", \"content\", \"charset\"],\n    \"style\": [\"type\", \"media\", \"scoped\"],\n    \"script\": [\"charset\", \"type\", \"src\", \"defer\", \"async\"],\n    \"noscript\": [\"href\"],\n    \"body\": [\"onafterprint\", \"onbeforeprint\", \"onbeforeunload\", \"onhashchange\", \"onmessage\", \"onoffline\", \"onpopstate\", \"onredo\", \"onresize\", \"onstorage\", \"onundo\", \"onunload\"],\n    \"section\": [],\n    \"nav\": [],\n    \"article\": [\"pubdate\"],\n    \"aside\": [],\n    \"h1\": [],\n    \"h2\": [],\n    \"h3\": [],\n    \"h4\": [],\n    \"h5\": [],\n    \"h6\": [],\n    \"header\": [],\n    \"footer\": [],\n    \"address\": [],\n    \"main\": [],\n    \"p\": [],\n    \"hr\": [],\n    \"pre\": [],\n    \"blockquote\": [\"cite\"],\n    \"ol\": [\"start\", \"reversed\"],\n    \"ul\": [],\n    \"li\": [\"value\"],\n    \"dl\": [],\n    \"dt\": [],\n    \"dd\": [],\n    \"figure\": [],\n    \"figcaption\": [],\n    \"div\": [],\n    \"a\": [\"href\", \"target\", \"ping\", \"rel\", \"media\", \"hreflang\", \"type\"],\n    \"em\": [],\n    \"strong\": [],\n    \"small\": [],\n    \"s\": [],\n    \"cite\": [],\n    \"q\": [\"cite\"],\n    \"dfn\": [],\n    \"abbr\": [],\n    \"data\": [],\n    \"time\": [\"datetime\"],\n    \"code\": [],\n    \"var\": [],\n    \"samp\": [],\n    \"kbd\": [],\n    \"sub\": [],\n    \"sup\": [],\n    \"i\": [],\n    \"b\": [],\n    \"u\": [],\n    \"mark\": [],\n    \"ruby\": [],\n    \"rt\": [],\n    \"rp\": [],\n    \"bdi\": [],\n    \"bdo\": [],\n    \"span\": [],\n    \"br\": [],\n    \"wbr\": [],\n    \"ins\": [\"cite\", \"datetime\"],\n    \"del\": [\"cite\", \"datetime\"],\n    \"img\": [\"alt\", \"src\", \"height\", \"width\", \"usemap\", \"ismap\"],\n    \"iframe\": [\"name\", \"src\", \"height\", \"width\", \"sandbox\", \"seamless\"],\n    \"embed\": [\"src\", \"height\", \"width\", \"type\"],\n    \"object\": [\"param\", \"data\", \"type\", \"height\" , \"width\", \"usemap\", \"name\", \"form\", \"classid\"],\n    \"param\": [\"name\", \"value\"],\n    \"video\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\", \"width\", \"height\", \"poster\"],\n    \"audio\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\"],\n    \"source\": [\"src\", \"type\", \"media\"],\n    \"track\": [\"kind\", \"src\", \"srclang\", \"label\", \"default\"],\n    \"canvas\": [\"width\", \"height\"],\n    \"map\": [\"name\"],\n    \"area\": [\"shape\", \"coords\", \"href\", \"hreflang\", \"alt\", \"target\", \"media\", \"rel\", \"ping\", \"type\"],\n    \"svg\": [],\n    \"math\": [],\n    \"table\": [\"summary\"],\n    \"caption\": [],\n    \"colgroup\": [\"span\"],\n    \"col\": [\"span\"],\n    \"tbody\": [],\n    \"thead\": [],\n    \"tfoot\": [],\n    \"tr\": [],\n    \"td\": [\"headers\", \"rowspan\", \"colspan\"],\n    \"th\": [\"headers\", \"rowspan\", \"colspan\", \"scope\"],\n    \"form\": [\"accept-charset\", \"action\", \"autocomplete\", \"enctype\", \"method\", \"name\", \"novalidate\", \"target\"],\n    \"fieldset\": [\"disabled\", \"form\", \"name\"],\n    \"legend\": [],\n    \"label\": [\"form\", \"for\"],\n    \"input\": [\"type\", \"accept\", \"alt\", \"autocomplete\", \"checked\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"height\", \"list\", \"max\", \"maxlength\", \"min\", \"multiple\", \"pattern\", \"placeholder\", \"readonly\", \"required\", \"size\", \"src\", \"step\", \"width\", \"files\", \"value\"],\n    \"button\": [\"autofocus\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"name\", \"value\", \"type\"],\n    \"select\": [\"autofocus\", \"disabled\", \"form\", \"multiple\", \"name\", \"size\"],\n    \"datalist\": [],\n    \"optgroup\": [\"disabled\", \"label\"],\n    \"option\": [\"disabled\", \"selected\", \"label\", \"value\"],\n    \"textarea\": [\"autofocus\", \"disabled\", \"form\", \"maxlength\", \"name\", \"placeholder\", \"readonly\", \"required\", \"rows\", \"cols\", \"wrap\"],\n    \"keygen\": [\"autofocus\", \"challenge\", \"disabled\", \"form\", \"keytype\", \"name\"],\n    \"output\": [\"for\", \"form\", \"name\"],\n    \"progress\": [\"value\", \"max\"],\n    \"meter\": [\"value\", \"min\", \"max\", \"low\", \"high\", \"optimum\"],\n    \"details\": [\"open\"],\n    \"summary\": [],\n    \"command\": [\"type\", \"label\", \"icon\", \"disabled\", \"checked\", \"radiogroup\", \"command\"],\n    \"menu\": [\"type\", \"label\"],\n    \"dialog\": [\"open\"]\n};\n\nvar elements = Object.keys(attributeMap);\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nfunction findTagName(session, pos) {\n    var iterator = new TokenIterator(session, pos.row, pos.column);\n    var token = iterator.getCurrentToken();\n    while (token && !is(token, \"tag-name\")){\n        token = iterator.stepBackward();\n    }\n    if (token)\n        return token.value;\n}\n\nvar HtmlCompletions = function() {\n\n};\n\n(function() {\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        var token = session.getTokenAt(pos.row, pos.column);\n\n        if (!token)\n            return [];\n        if (is(token, \"tag-name\") || is(token, \"tag-open\") || is(token, \"end-tag-open\"))\n            return this.getTagCompletions(state, session, pos, prefix);\n        if (is(token, \"tag-whitespace\") || is(token, \"attribute-name\"))\n            return this.getAttributeCompetions(state, session, pos, prefix);\n\n        return [];\n    };\n\n    this.getTagCompletions = function(state, session, pos, prefix) {\n        return elements.map(function(element){\n            return {\n                value: element,\n                meta: \"tag\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n    this.getAttributeCompetions = function(state, session, pos, prefix) {\n        var tagName = findTagName(session, pos);\n        if (!tagName)\n            return [];\n        var attributes = globalAttributes;\n        if (tagName in attributeMap) {\n            attributes = attributes.concat(attributeMap[tagName]);\n        }\n        return attributes.map(function(attribute){\n            return {\n                caption: attribute,\n                snippet: attribute + '=\"$0\"',\n                meta: \"attribute\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n}).call(HtmlCompletions.prototype);\n\nexports.HtmlCompletions = HtmlCompletions;\n});\n\nace.define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar HtmlFoldMode = require(\"./folding/html\").FoldMode;\nvar HtmlCompletions = require(\"./html_completions\").HtmlCompletions;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar voidElements = [\"area\", \"base\", \"br\", \"col\", \"embed\", \"hr\", \"img\", \"input\", \"keygen\", \"link\", \"meta\", \"menuitem\", \"param\", \"source\", \"track\", \"wbr\"];\nvar optionalEndTags = [\"li\", \"dt\", \"dd\", \"p\", \"rt\", \"rp\", \"optgroup\", \"option\", \"colgroup\", \"td\", \"th\"];\n\nvar Mode = function(options) {\n    this.fragmentContext = options && options.fragmentContext;\n    this.HighlightRules = HtmlHighlightRules;\n    this.$behaviour = new XmlBehaviour();\n    this.$completer = new HtmlCompletions();\n    \n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"css-\": CssMode\n    });\n    \n    this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags));\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n    this.voidElements = lang.arrayToMap(voidElements);\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        return this.$completer.getCompletions(state, session, pos, prefix);\n    };\n\n    this.createWorker = function(session) {\n        if (this.constructor != Mode)\n            return;\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/html_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        if (this.fragmentContext)\n            worker.call(\"setOptions\", [{context: this.fragmentContext}]);\n\n        worker.on(\"error\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/html\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/smarty_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\n\nvar SmartyHighlightRules = function() {\n    HtmlHighlightRules.call(this);\n    var smartyRules = { start: \n       [ { include: '#comments' },\n         { include: '#blocks' } ],\n      '#blocks': \n       [ { token: 'punctuation.section.embedded.begin.smarty',\n           regex: '\\\\{%?',\n           push: \n            [ { token: 'punctuation.section.embedded.end.smarty',\n                regex: '%?\\\\}',\n                next: 'pop' },\n              { include: '#strings' },\n              { include: '#variables' },\n              { include: '#lang' },\n              { defaultToken: 'source.smarty' } ] } ],\n      '#comments': \n       [ { token: \n            [ 'punctuation.definition.comment.smarty',\n              'comment.block.smarty' ],\n           regex: '(\\\\{%?)(\\\\*)',\n           push: \n            [ { token: 'comment.block.smarty', regex: '\\\\*%?\\\\}', next: 'pop' },\n              { defaultToken: 'comment.block.smarty' } ] } ],\n      '#lang': \n       [ { token: 'keyword.operator.smarty',\n           regex: '(?:!=|!|<=|>=|<|>|===|==|%|&&|\\\\|\\\\|)|\\\\b(?:and|or|eq|neq|ne|gte|gt|ge|lte|lt|le|not|mod)\\\\b' },\n         { token: 'constant.language.smarty',\n           regex: '\\\\b(?:TRUE|FALSE|true|false)\\\\b' },\n         { token: 'keyword.control.smarty',\n           regex: '\\\\b(?:if|else|elseif|foreach|foreachelse|section|switch|case|break|default)\\\\b' },\n         { token: 'variable.parameter.smarty', regex: '\\\\b[a-zA-Z]+=' },\n         { token: 'support.function.built-in.smarty',\n           regex: '\\\\b(?:capture|config_load|counter|cycle|debug|eval|fetch|include_php|include|insert|literal|math|strip|rdelim|ldelim|assign|constant|block|html_[a-z_]*)\\\\b' },\n         { token: 'support.function.variable-modifier.smarty',\n           regex: '\\\\|(?:capitalize|cat|count_characters|count_paragraphs|count_sentences|count_words|date_format|default|escape|indent|lower|nl2br|regex_replace|replace|spacify|string_format|strip_tags|strip|truncate|upper|wordwrap)' } ],\n      '#strings': \n       [ { token: 'punctuation.definition.string.begin.smarty',\n           regex: '\\'',\n           push: \n            [ { token: 'punctuation.definition.string.end.smarty',\n                regex: '\\'',\n                next: 'pop' },\n              { token: 'constant.character.escape.smarty', regex: '\\\\\\\\.' },\n              { defaultToken: 'string.quoted.single.smarty' } ] },\n         { token: 'punctuation.definition.string.begin.smarty',\n           regex: '\"',\n           push: \n            [ { token: 'punctuation.definition.string.end.smarty',\n                regex: '\"',\n                next: 'pop' },\n              { token: 'constant.character.escape.smarty', regex: '\\\\\\\\.' },\n              { defaultToken: 'string.quoted.double.smarty' } ] } ],\n      '#variables': \n       [ { token: \n            [ 'punctuation.definition.variable.smarty',\n              'variable.other.global.smarty' ],\n           regex: '\\\\b(\\\\$)(Smarty\\\\.)' },\n         { token: \n            [ 'punctuation.definition.variable.smarty',\n              'variable.other.smarty' ],\n           regex: '(\\\\$)([a-zA-Z_][a-zA-Z0-9_]*)\\\\b' },\n         { token: [ 'keyword.operator.smarty', 'variable.other.property.smarty' ],\n           regex: '(->)([a-zA-Z_][a-zA-Z0-9_]*)\\\\b' },\n         { token: \n            [ 'keyword.operator.smarty',\n              'meta.function-call.object.smarty',\n              'punctuation.definition.variable.smarty',\n              'variable.other.smarty',\n              'punctuation.definition.variable.smarty' ],\n           regex: '(->)([a-zA-Z_][a-zA-Z0-9_]*)(\\\\()(.*?)(\\\\))' } ] }\n    \n    var smartyStart = smartyRules.start;\n    \n    for (var rule in this.$rules) {\n        this.$rules[rule].unshift.apply(this.$rules[rule], smartyStart);\n    }\n    \n    Object.keys(smartyRules).forEach(function(x) {\n        if (!this.$rules[x])\n            this.$rules[x] = smartyRules[x];\n    }, this);\n    \n    this.normalizeRules();\n};\n\nSmartyHighlightRules.metaData = { fileTypes: [ 'tpl' ],\n      foldingStartMarker: '\\\\{%?',\n      foldingStopMarker: '%?\\\\}',\n      name: 'Smarty',\n      scopeName: 'text.html.smarty' }\n\n\noop.inherits(SmartyHighlightRules, HtmlHighlightRules);\n\nexports.SmartyHighlightRules = SmartyHighlightRules;\n});\n\nace.define(\"ace/mode/smarty\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html\",\"ace/mode/smarty_highlight_rules\"], function(require, exports, module) {\n  \"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar HtmlMode = require(\"./html\").Mode;\nvar SmartyHighlightRules = require(\"./smarty_highlight_rules\").SmartyHighlightRules;\n\nvar Mode = function() {\n    HtmlMode.call(this);\n    this.HighlightRules = SmartyHighlightRules;\n};\n\noop.inherits(Mode, HtmlMode);\n\n(function() {\n    \n    this.$id = \"ace/mode/smarty\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-snippets.js",
    "content": "ace.define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var range = this.indentationBlock(session, row);\n        if (range)\n            return range;\n\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1 || line[startLevel] != \"#\")\n            return;\n\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var level = line.search(re);\n\n            if (level == -1)\n                continue;\n\n            if (line[level] != \"#\")\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        var next = session.getLine(row + 1);\n        var prev = session.getLine(row - 1);\n        var prevIndent = prev.search(/\\S/);\n        var nextIndent = next.search(/\\S/);\n\n        if (indent == -1) {\n            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? \"start\" : \"\";\n            return \"\";\n        }\n        if (prevIndent == -1) {\n            if (indent == nextIndent && line[indent] == \"#\" && next[indent] == \"#\") {\n                session.foldWidgets[row - 1] = \"\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"start\";\n            }\n        } else if (prevIndent == indent && line[indent] == \"#\" && prev[indent] == \"#\") {\n            if (session.getLine(row - 2).search(/\\S/) == -1) {\n                session.foldWidgets[row - 1] = \"start\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"\";\n            }\n        }\n\n        if (prevIndent!= -1 && prevIndent < indent)\n            session.foldWidgets[row - 1] = \"start\";\n        else\n            session.foldWidgets[row - 1] = \"\";\n\n        if (indent < nextIndent)\n            return \"start\";\n        else\n            return \"\";\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/snippets\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/text_highlight_rules\",\"ace/mode/folding/coffee\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar SnippetHighlightRules = function() {\n\n    var builtins = \"SELECTION|CURRENT_WORD|SELECTED_TEXT|CURRENT_LINE|LINE_INDEX|\" +\n        \"LINE_NUMBER|SOFT_TABS|TAB_SIZE|FILENAME|FILEPATH|FULLNAME\";\n\n    this.$rules = {\n        \"start\" : [\n            {token:\"constant.language.escape\", regex: /\\\\[\\$}`\\\\]/},\n            {token:\"keyword\", regex: \"\\\\$(?:TM_)?(?:\" + builtins + \")\\\\b\"},\n            {token:\"variable\", regex: \"\\\\$\\\\w+\"},\n            {onMatch: function(value, state, stack) {\n                if (stack[1])\n                    stack[1]++;\n                else\n                    stack.unshift(state, 1);\n                return this.tokenName;\n            }, tokenName: \"markup.list\", regex: \"\\\\${\", next: \"varDecl\"},\n            {onMatch: function(value, state, stack) {\n                if (!stack[1])\n                    return \"text\";\n                stack[1]--;\n                if (!stack[1])\n                    stack.splice(0,2);\n                return this.tokenName;\n            }, tokenName: \"markup.list\", regex: \"}\"},\n            {token: \"doc.comment\", regex:/^\\${2}-{5,}$/}\n        ],\n        \"varDecl\" : [\n            {regex: /\\d+\\b/, token: \"constant.numeric\"},\n            {token:\"keyword\", regex: \"(?:TM_)?(?:\" + builtins + \")\\\\b\"},\n            {token:\"variable\", regex: \"\\\\w+\"},\n            {regex: /:/, token: \"punctuation.operator\", next: \"start\"},\n            {regex: /\\//, token: \"string.regex\", next: \"regexp\"},\n            {regex: \"\", next: \"start\"}\n        ],\n        \"regexp\" : [\n            {regex: /\\\\./, token: \"escape\"},\n            {regex: /\\[/, token: \"regex.start\", next: \"charClass\"},\n            {regex: \"/\", token: \"string.regex\", next: \"format\"},\n            {\"token\": \"string.regex\", regex:\".\"}\n        ],\n        charClass : [\n            {regex: \"\\\\.\", token: \"escape\"},\n            {regex: \"\\\\]\", token: \"regex.end\", next: \"regexp\"},\n            {\"token\": \"string.regex\", regex:\".\"}\n        ],\n        \"format\" : [\n            {regex: /\\\\[ulULE]/, token: \"keyword\"},\n            {regex: /\\$\\d+/, token: \"variable\"},\n            {regex: \"/[gim]*:?\", token: \"string.regex\", next: \"start\"},\n            {\"token\": \"string\", regex:\".\"}\n        ]\n    };\n};\noop.inherits(SnippetHighlightRules, TextHighlightRules);\n\nexports.SnippetHighlightRules = SnippetHighlightRules;\n\nvar SnippetGroupHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [\n\t\t\t{token: \"text\", regex: \"^\\\\t\", next: \"sn-start\"},\n\t\t\t{token:\"invalid\", regex: /^ \\s*/},\n            {token:\"comment\", regex: /^#.*/},\n            {token:\"constant.language.escape\", regex: \"^regex \", next: \"regex\"},\n            {token:\"constant.language.escape\", regex: \"^(trigger|endTrigger|name|snippet|guard|endGuard|tabTrigger|key)\\\\b\"}\n        ],\n\t\t\"regex\" : [\n\t\t\t{token:\"text\", regex: \"\\\\.\"},\n\t\t\t{token:\"keyword\", regex: \"/\"},\n\t\t\t{token:\"empty\", regex: \"$\", next: \"start\"}\n\t\t]\n    };\n\tthis.embedRules(SnippetHighlightRules, \"sn-\", [\n\t\t{token: \"text\", regex: \"^\\\\t\", next: \"sn-start\"},\n\t\t{onMatch: function(value, state, stack) {\n\t\t\tstack.splice(stack.length);\n\t\t\treturn this.tokenName;\n\t\t}, tokenName: \"text\", regex: \"^(?!\\t)\", next: \"start\"}\n\t])\n\t\n};\n\noop.inherits(SnippetGroupHighlightRules, TextHighlightRules);\n\nexports.SnippetGroupHighlightRules = SnippetGroupHighlightRules;\n\nvar FoldMode = require(\"./folding/coffee\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = SnippetGroupHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.$indentWithTabs = true;\n    this.lineCommentStart = \"#\";\n    this.$id = \"ace/mode/snippets\";\n}).call(Mode.prototype);\nexports.Mode = Mode;\n\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-soy_template.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\nace.define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar CssBehaviour = function () {\n\n    this.inherit(CstyleBehaviour);\n\n    this.add(\"colon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(cursor.row);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                if (rightChar === ':') {\n                    return {\n                       text: '',\n                       selection: [1, 1]\n                    }\n                }\n                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n                    return {\n                       text: ':;',\n                       selection: [1, 1]\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"colon\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(range.start.row);\n                var rightChar = line.substring(range.end.column, range.end.column + 1);\n                if (rightChar === ';') {\n                    range.end.column ++;\n                    return range;\n                }\n            }\n        }\n    });\n\n    this.add(\"semicolon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ';') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === ';') {\n                return {\n                   text: '',\n                   selection: [1, 1]\n                }\n            }\n        }\n    });\n\n}\noop.inherits(CssBehaviour, CstyleBehaviour);\n\nexports.CssBehaviour = CssBehaviour;\n});\n\nace.define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CssBehaviour = require(\"./behaviour/css\").CssBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = CssHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CssBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"csslint\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/css\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\nace.define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"string.cdata.xml\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.xml-decl.xml\", \"keyword.xml-decl.xml\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_decl\", caseInsensitive: true\n            },\n            {\n                token : [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"processing_instruction\",\n            },\n            {token : \"comment.xml\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\", caseInsensitive: true\n            },\n            {include : \"tag\"},\n            {token : \"text.end-tag-open.xml\", regex: \"</\"},\n            {token : \"text.tag-open.xml\", regex: \"<\"},\n            {include : \"reference\"},\n            {defaultToken : \"text.xml\"}\n        ],\n\n        xml_decl : [{\n            token : \"entity.other.attribute-name.decl-attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.decl-attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"whitespace\"\n        }, {\n            include: \"string\"\n        }, {\n            token : \"punctuation.xml-decl.xml\",\n            regex : \"\\\\?>\",\n            next : \"start\"\n        }],\n\n        processing_instruction : [\n            {token : \"punctuation.instruction.xml\", regex : \"\\\\?>\", next : \"start\"},\n            {defaultToken : \"instruction.xml\"}\n        ],\n\n        doctype : [\n            {include : \"whitespace\"},\n            {include : \"string\"},\n            {token : \"xml-pe.doctype.xml\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe.xml\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.int-subset\", regex : \"\\\\[\", push : \"int_subset\"}\n        ],\n\n        int_subset : [{\n            token : \"text.xml\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.int-subset.xml\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.markup-decl.xml\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.cdata.xml\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text.xml\", regex : \"\\\\s+\"},\n            {token : \"text.xml\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment.xml\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment.xml\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape.reference.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        attr_reference : [{\n            token : \"constant.language.escape.reference.attribute-value.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n            regex : \"(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n            ]\n        }],\n\n        tag_whitespace : [\n            {token : \"text.tag-whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        whitespace : [\n            {token : \"text.whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        string: [{\n            token : \"string.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.xml\", regex: \"'\", next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }, {\n            token : \"string.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.xml\", regex: '\"', next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }],\n\n        attributes: [{\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"tag_whitespace\"\n        }, {\n            include: \"attribute_value\"\n        }],\n\n        attribute_value: [{\n            token : \"string.attribute-value.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }, {\n            token : \"string.attribute-value.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\nace.define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    option      : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.addRules({\n        attributes: [{\n            include : \"tag_whitespace\"\n        }, {\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\",\n            push : [{\n                include: \"tag_whitespace\"\n            }, {\n                token : \"string.unquoted.attribute-value.html\",\n                regex : \"[^<>='\\\"`\\\\s]+\",\n                next : \"pop\"\n            }, {\n                token : \"empty\",\n                regex : \"\",\n                next : \"pop\"\n            }]\n        }, {\n            include : \"attribute_value\"\n        }],\n        tag: [{\n            token : function(start, tag) {\n                var group = tagMap[tag];\n                return [\"meta.tag.punctuation.\" + (start == \"<\" ? \"\" : \"end-\") + \"tag-open.xml\",\n                    \"meta.tag\" + (group ? \".\" + group : \"\") + \".tag-name.xml\"];\n            },\n            regex : \"(</?)([-_a-zA-Z0-9:]+)\",\n            next: \"tag_stuff\"\n        }],\n        tag_stuff: [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n        ],\n    });\n\n    this.embedTagRules(CssHighlightRules, \"css-\", \"style\");\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    if (this.constructor === HtmlHighlightRules)\n        this.normalizeRules();\n};\n\noop.inherits(HtmlHighlightRules, XmlHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nvar XmlBehaviour = function () {\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selected = session.doc.getTextRange(editor.getSelectionRange());\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            }\n\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (rightChar == quote && (is(token, \"attribute-value\") || is(token, \"string\"))) {\n                return {\n                    text: \"\",\n                    selection: [1, 1]\n                };\n            }\n\n            if (!token)\n                token = iterator.stepBackward();\n\n            if (!token)\n                return;\n\n            while (is(token, \"tag-whitespace\") || is(token, \"whitespace\")) {\n                token = iterator.stepBackward();\n            }\n            var rightSpace = !rightChar || rightChar.match(/\\s/);\n            if (is(token, \"attribute-equals\") && (rightSpace || rightChar == '>') || (is(token, \"decl-attribute-equals\") && (rightSpace || rightChar == '?'))) {\n                return {\n                    text: quote + quote,\n                    selection: [1, 1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken() || iterator.stepBackward();\n            if (!token || !(is(token, \"tag-name\") || is(token, \"tag-whitespace\") || is(token, \"attribute-name\") || is(token, \"attribute-equals\") || is(token, \"attribute-value\")))\n                return;\n            if (is(token, \"reference.attribute-value\"))\n                return;\n            if (is(token, \"attribute-value\")) {\n                var firstChar = token.value.charAt(0);\n                if (firstChar == '\"' || firstChar == \"'\") {\n                    var lastChar = token.value.charAt(token.value.length - 1);\n                    var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length;\n                    if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar)\n                        return;\n                }\n            }\n            while (!is(token, \"tag-name\")) {\n                token = iterator.stepBackward();\n            }\n\n            var tokenRow = iterator.getCurrentTokenRow();\n            var tokenColumn = iterator.getCurrentTokenColumn();\n            if (is(iterator.stepBackward(), \"end-tag-open\"))\n                return;\n\n            var element = token.value;\n            if (tokenRow == position.row)\n                element = element.substring(0, position.column - tokenColumn);\n\n            if (this.voidElements.hasOwnProperty(element.toLowerCase()))\n                 return;\n\n            return {\n               text: \">\" + \"</\" + element + \">\",\n               selection: [1, 1]\n            };\n        }\n    });\n\n    this.add(\"autoindent\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.getLine(cursor.row);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (token && token.type.indexOf(\"tag-close\") !== -1) {\n                while (token && token.type.indexOf(\"tag-name\") === -1) {\n                    token = iterator.stepBackward();\n                }\n\n                if (!token) {\n                    return;\n                }\n\n                var tag = token.value;\n                var row = iterator.getCurrentTokenRow();\n                token = iterator.stepBackward();\n                if (!token || token.type.indexOf(\"end-tag\") !== -1) {\n                    return;\n                }\n\n                if (this.voidElements && !this.voidElements[tag]) {\n                    var nextToken = session.getTokenAt(cursor.row, cursor.column+1);\n                    var line = session.getLine(row);\n                    var nextIndent = this.$getIndent(line);\n                    var indent = nextIndent + session.getTabString();\n\n                    if (nextToken && nextToken.value === \"</\") {\n                        return {\n                            text: \"\\n\" + indent + \"\\n\" + nextIndent,\n                            selection: [1, indent.length, 1, indent.length]\n                        };\n                    } else {\n                        return {\n                            text: \"\\n\" + indent\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n};\n\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\nace.define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n    this.defaultMode = defaultMode;\n    this.subModes = subModes;\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n\n    this.$getMode = function(state) {\n        if (typeof state != \"string\") \n            state = state[0];\n        for (var key in this.subModes) {\n            if (state.indexOf(key) === 0)\n                return this.subModes[key];\n        }\n        return null;\n    };\n    \n    this.$tryMode = function(state, session, foldStyle, row) {\n        var mode = this.$getMode(state);\n        return (mode ? mode.getFoldWidget(session, foldStyle, row) : \"\");\n    };\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        return (\n            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n            this.defaultMode.getFoldWidget(session, foldStyle, row)\n        );\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var mode = this.$getMode(session.getState(row-1));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.$getMode(session.getState(row));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.defaultMode;\n        \n        return mode.getFoldWidgetRange(session, foldStyle, row);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalEndTags) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n    this.optionalEndTags = oop.mixin({}, this.voidElements);\n    if (optionalEndTags)\n        oop.mixin(this.optionalEndTags, optionalEndTags);\n    \n};\noop.inherits(FoldMode, BaseFoldMode);\n\nvar Tag = function() {\n    this.tagName = \"\";\n    this.closing = false;\n    this.selfClosing = false;\n    this.start = {row: 0, column: 0};\n    this.end = {row: 0, column: 0};\n};\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (!tag)\n            return \"\";\n\n        if (tag.closing || (!tag.tagName && tag.selfClosing))\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase()))\n            return \"\";\n\n        if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column))\n            return \"\";\n\n        return \"start\";\n    };\n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var tag = new Tag();\n\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (is(token, \"tag-open\")) {\n                tag.end.column = tag.start.column + token.value.length;\n                tag.closing = is(token, \"end-tag-open\");\n                token = tokens[++i];\n                if (!token)\n                    return null;\n                tag.tagName = token.value;\n                tag.end.column += token.value.length;\n                for (i++; i < tokens.length; i++) {\n                    token = tokens[i];\n                    tag.end.column += token.value.length;\n                    if (is(token, \"tag-close\")) {\n                        tag.selfClosing = token.value == '/>';\n                        break;\n                    }\n                }\n                return tag;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == '/>';\n                return tag;\n            }\n            tag.start.column += token.value.length;\n        }\n\n        return null;\n    };\n\n    this._findEndTagInLine = function(session, row, tagName, startColumn) {\n        var tokens = session.getTokens(row);\n        var column = 0;\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            column += token.value.length;\n            if (column < startColumn)\n                continue;\n            if (is(token, \"end-tag-open\")) {\n                token = tokens[i + 1];\n                if (token && token.value == tagName)\n                    return true;\n            }\n        }\n        return false;\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n                iterator.stepForward();\n                return tag;\n            }\n        } while(token = iterator.stepForward());\n\n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n                iterator.stepBackward();\n                return tag;\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n            }\n        } while(token = iterator.stepBackward());\n\n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.optionalEndTags.hasOwnProperty(top.tagName)) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.start.column);\n            var start = {\n                row: row,\n                column: firstTag.start.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.end.column);\n            var end = {\n                row: row,\n                column: firstTag.start.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar MixedFoldMode = require(\"./mixed\").FoldMode;\nvar XmlFoldMode = require(\"./xml\").FoldMode;\nvar CStyleFoldMode = require(\"./cstyle\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalTags) {\n    MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), {\n        \"js-\": new CStyleFoldMode(),\n        \"css-\": new CStyleFoldMode()\n    });\n};\n\noop.inherits(FoldMode, MixedFoldMode);\n\n});\n\nace.define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\n\nvar commonAttributes = [\n    \"accesskey\",\n    \"class\",\n    \"contenteditable\",\n    \"contextmenu\",\n    \"dir\",\n    \"draggable\",\n    \"dropzone\",\n    \"hidden\",\n    \"id\",\n    \"inert\",\n    \"itemid\",\n    \"itemprop\",\n    \"itemref\",\n    \"itemscope\",\n    \"itemtype\",\n    \"lang\",\n    \"spellcheck\",\n    \"style\",\n    \"tabindex\",\n    \"title\",\n    \"translate\"\n];\n\nvar eventAttributes = [\n    \"onabort\",\n    \"onblur\",\n    \"oncancel\",\n    \"oncanplay\",\n    \"oncanplaythrough\",\n    \"onchange\",\n    \"onclick\",\n    \"onclose\",\n    \"oncontextmenu\",\n    \"oncuechange\",\n    \"ondblclick\",\n    \"ondrag\",\n    \"ondragend\",\n    \"ondragenter\",\n    \"ondragleave\",\n    \"ondragover\",\n    \"ondragstart\",\n    \"ondrop\",\n    \"ondurationchange\",\n    \"onemptied\",\n    \"onended\",\n    \"onerror\",\n    \"onfocus\",\n    \"oninput\",\n    \"oninvalid\",\n    \"onkeydown\",\n    \"onkeypress\",\n    \"onkeyup\",\n    \"onload\",\n    \"onloadeddata\",\n    \"onloadedmetadata\",\n    \"onloadstart\",\n    \"onmousedown\",\n    \"onmousemove\",\n    \"onmouseout\",\n    \"onmouseover\",\n    \"onmouseup\",\n    \"onmousewheel\",\n    \"onpause\",\n    \"onplay\",\n    \"onplaying\",\n    \"onprogress\",\n    \"onratechange\",\n    \"onreset\",\n    \"onscroll\",\n    \"onseeked\",\n    \"onseeking\",\n    \"onselect\",\n    \"onshow\",\n    \"onstalled\",\n    \"onsubmit\",\n    \"onsuspend\",\n    \"ontimeupdate\",\n    \"onvolumechange\",\n    \"onwaiting\"\n];\n\nvar globalAttributes = commonAttributes.concat(eventAttributes);\n\nvar attributeMap = {\n    \"html\": [\"manifest\"],\n    \"head\": [],\n    \"title\": [],\n    \"base\": [\"href\", \"target\"],\n    \"link\": [\"href\", \"hreflang\", \"rel\", \"media\", \"type\", \"sizes\"],\n    \"meta\": [\"http-equiv\", \"name\", \"content\", \"charset\"],\n    \"style\": [\"type\", \"media\", \"scoped\"],\n    \"script\": [\"charset\", \"type\", \"src\", \"defer\", \"async\"],\n    \"noscript\": [\"href\"],\n    \"body\": [\"onafterprint\", \"onbeforeprint\", \"onbeforeunload\", \"onhashchange\", \"onmessage\", \"onoffline\", \"onpopstate\", \"onredo\", \"onresize\", \"onstorage\", \"onundo\", \"onunload\"],\n    \"section\": [],\n    \"nav\": [],\n    \"article\": [\"pubdate\"],\n    \"aside\": [],\n    \"h1\": [],\n    \"h2\": [],\n    \"h3\": [],\n    \"h4\": [],\n    \"h5\": [],\n    \"h6\": [],\n    \"header\": [],\n    \"footer\": [],\n    \"address\": [],\n    \"main\": [],\n    \"p\": [],\n    \"hr\": [],\n    \"pre\": [],\n    \"blockquote\": [\"cite\"],\n    \"ol\": [\"start\", \"reversed\"],\n    \"ul\": [],\n    \"li\": [\"value\"],\n    \"dl\": [],\n    \"dt\": [],\n    \"dd\": [],\n    \"figure\": [],\n    \"figcaption\": [],\n    \"div\": [],\n    \"a\": [\"href\", \"target\", \"ping\", \"rel\", \"media\", \"hreflang\", \"type\"],\n    \"em\": [],\n    \"strong\": [],\n    \"small\": [],\n    \"s\": [],\n    \"cite\": [],\n    \"q\": [\"cite\"],\n    \"dfn\": [],\n    \"abbr\": [],\n    \"data\": [],\n    \"time\": [\"datetime\"],\n    \"code\": [],\n    \"var\": [],\n    \"samp\": [],\n    \"kbd\": [],\n    \"sub\": [],\n    \"sup\": [],\n    \"i\": [],\n    \"b\": [],\n    \"u\": [],\n    \"mark\": [],\n    \"ruby\": [],\n    \"rt\": [],\n    \"rp\": [],\n    \"bdi\": [],\n    \"bdo\": [],\n    \"span\": [],\n    \"br\": [],\n    \"wbr\": [],\n    \"ins\": [\"cite\", \"datetime\"],\n    \"del\": [\"cite\", \"datetime\"],\n    \"img\": [\"alt\", \"src\", \"height\", \"width\", \"usemap\", \"ismap\"],\n    \"iframe\": [\"name\", \"src\", \"height\", \"width\", \"sandbox\", \"seamless\"],\n    \"embed\": [\"src\", \"height\", \"width\", \"type\"],\n    \"object\": [\"param\", \"data\", \"type\", \"height\" , \"width\", \"usemap\", \"name\", \"form\", \"classid\"],\n    \"param\": [\"name\", \"value\"],\n    \"video\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\", \"width\", \"height\", \"poster\"],\n    \"audio\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\"],\n    \"source\": [\"src\", \"type\", \"media\"],\n    \"track\": [\"kind\", \"src\", \"srclang\", \"label\", \"default\"],\n    \"canvas\": [\"width\", \"height\"],\n    \"map\": [\"name\"],\n    \"area\": [\"shape\", \"coords\", \"href\", \"hreflang\", \"alt\", \"target\", \"media\", \"rel\", \"ping\", \"type\"],\n    \"svg\": [],\n    \"math\": [],\n    \"table\": [\"summary\"],\n    \"caption\": [],\n    \"colgroup\": [\"span\"],\n    \"col\": [\"span\"],\n    \"tbody\": [],\n    \"thead\": [],\n    \"tfoot\": [],\n    \"tr\": [],\n    \"td\": [\"headers\", \"rowspan\", \"colspan\"],\n    \"th\": [\"headers\", \"rowspan\", \"colspan\", \"scope\"],\n    \"form\": [\"accept-charset\", \"action\", \"autocomplete\", \"enctype\", \"method\", \"name\", \"novalidate\", \"target\"],\n    \"fieldset\": [\"disabled\", \"form\", \"name\"],\n    \"legend\": [],\n    \"label\": [\"form\", \"for\"],\n    \"input\": [\"type\", \"accept\", \"alt\", \"autocomplete\", \"checked\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"height\", \"list\", \"max\", \"maxlength\", \"min\", \"multiple\", \"pattern\", \"placeholder\", \"readonly\", \"required\", \"size\", \"src\", \"step\", \"width\", \"files\", \"value\"],\n    \"button\": [\"autofocus\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"name\", \"value\", \"type\"],\n    \"select\": [\"autofocus\", \"disabled\", \"form\", \"multiple\", \"name\", \"size\"],\n    \"datalist\": [],\n    \"optgroup\": [\"disabled\", \"label\"],\n    \"option\": [\"disabled\", \"selected\", \"label\", \"value\"],\n    \"textarea\": [\"autofocus\", \"disabled\", \"form\", \"maxlength\", \"name\", \"placeholder\", \"readonly\", \"required\", \"rows\", \"cols\", \"wrap\"],\n    \"keygen\": [\"autofocus\", \"challenge\", \"disabled\", \"form\", \"keytype\", \"name\"],\n    \"output\": [\"for\", \"form\", \"name\"],\n    \"progress\": [\"value\", \"max\"],\n    \"meter\": [\"value\", \"min\", \"max\", \"low\", \"high\", \"optimum\"],\n    \"details\": [\"open\"],\n    \"summary\": [],\n    \"command\": [\"type\", \"label\", \"icon\", \"disabled\", \"checked\", \"radiogroup\", \"command\"],\n    \"menu\": [\"type\", \"label\"],\n    \"dialog\": [\"open\"]\n};\n\nvar elements = Object.keys(attributeMap);\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nfunction findTagName(session, pos) {\n    var iterator = new TokenIterator(session, pos.row, pos.column);\n    var token = iterator.getCurrentToken();\n    while (token && !is(token, \"tag-name\")){\n        token = iterator.stepBackward();\n    }\n    if (token)\n        return token.value;\n}\n\nvar HtmlCompletions = function() {\n\n};\n\n(function() {\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        var token = session.getTokenAt(pos.row, pos.column);\n\n        if (!token)\n            return [];\n        if (is(token, \"tag-name\") || is(token, \"tag-open\") || is(token, \"end-tag-open\"))\n            return this.getTagCompletions(state, session, pos, prefix);\n        if (is(token, \"tag-whitespace\") || is(token, \"attribute-name\"))\n            return this.getAttributeCompetions(state, session, pos, prefix);\n\n        return [];\n    };\n\n    this.getTagCompletions = function(state, session, pos, prefix) {\n        return elements.map(function(element){\n            return {\n                value: element,\n                meta: \"tag\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n    this.getAttributeCompetions = function(state, session, pos, prefix) {\n        var tagName = findTagName(session, pos);\n        if (!tagName)\n            return [];\n        var attributes = globalAttributes;\n        if (tagName in attributeMap) {\n            attributes = attributes.concat(attributeMap[tagName]);\n        }\n        return attributes.map(function(attribute){\n            return {\n                caption: attribute,\n                snippet: attribute + '=\"$0\"',\n                meta: \"attribute\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n}).call(HtmlCompletions.prototype);\n\nexports.HtmlCompletions = HtmlCompletions;\n});\n\nace.define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar HtmlFoldMode = require(\"./folding/html\").FoldMode;\nvar HtmlCompletions = require(\"./html_completions\").HtmlCompletions;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar voidElements = [\"area\", \"base\", \"br\", \"col\", \"embed\", \"hr\", \"img\", \"input\", \"keygen\", \"link\", \"meta\", \"menuitem\", \"param\", \"source\", \"track\", \"wbr\"];\nvar optionalEndTags = [\"li\", \"dt\", \"dd\", \"p\", \"rt\", \"rp\", \"optgroup\", \"option\", \"colgroup\", \"td\", \"th\"];\n\nvar Mode = function(options) {\n    this.fragmentContext = options && options.fragmentContext;\n    this.HighlightRules = HtmlHighlightRules;\n    this.$behaviour = new XmlBehaviour();\n    this.$completer = new HtmlCompletions();\n    \n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"css-\": CssMode\n    });\n    \n    this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags));\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n    this.voidElements = lang.arrayToMap(voidElements);\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        return this.$completer.getCompletions(state, session, pos, prefix);\n    };\n\n    this.createWorker = function(session) {\n        if (this.constructor != Mode)\n            return;\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/html_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        if (this.fragmentContext)\n            worker.call(\"setOptions\", [{context: this.fragmentContext}]);\n\n        worker.on(\"error\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/html\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/soy_template_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\n\nvar SoyTemplateHighlightRules = function() {\n    HtmlHighlightRules.call(this);\n\n    var soyRules = { start: \n       [ { include: '#template' },\n         { include: '#if' },\n         { include: '#comment-line' },\n         { include: '#comment-block' },\n         { include: '#comment-doc' },\n         { include: '#call' },\n         { include: '#css' },\n         { include: '#param' },\n         { include: '#print' },\n         { include: '#msg' },\n         { include: '#for' },\n         { include: '#foreach' },\n         { include: '#switch' },\n         { include: '#tag' },\n         { include: 'text.html.basic' } ],\n      '#call': \n       [ { token: \n            [ 'punctuation.definition.tag.begin.soy',\n              'meta.tag.call.soy' ],\n           regex: '(\\\\{/?)(\\\\s*)(?=call|delcall)',\n           push: \n            [ { token: 'punctuation.definition.tag.end.soy',\n                regex: '\\\\}',\n                next: 'pop' },\n              { include: '#string-quoted-single' },\n              { include: '#string-quoted-double' },\n              { token: ['entity.name.tag.soy', 'variable.parameter.soy'],\n                regex: '(call|delcall)(\\\\s+[\\\\.\\\\w]+)'},\n              { token: \n                 [ 'entity.other.attribute-name.soy',\n                   'text',\n                   'keyword.operator.soy' ],\n                regex: '\\\\b(data)(\\\\s*)(=)' },\n              { defaultToken: 'meta.tag.call.soy' } ] } ],\n      '#comment-line': \n       [ { token: \n            [ 'comment.line.double-slash.soy',\n              'punctuation.definition.comment.soy',\n              'comment.line.double-slash.soy' ],\n           regex: '(\\\\s+)(//)(.*$)' } ],\n      '#comment-block': \n       [ { token: 'punctuation.definition.comment.begin.soy',\n           regex: '/\\\\*(?!\\\\*)',\n           push: \n            [ { token: 'punctuation.definition.comment.end.soy',\n                regex: '\\\\*/',\n                next: 'pop' },\n              { defaultToken: 'comment.block.soy' } ] } ],\n      '#comment-doc': \n       [ { token: 'punctuation.definition.comment.begin.soy',\n           regex: '/\\\\*\\\\*(?!/)',\n           push: \n            [ { token: 'punctuation.definition.comment.end.soy',\n                regex: '\\\\*/',\n                next: 'pop' },\n              { token: [ 'support.type.soy', 'text', 'variable.parameter.soy' ],\n                regex: '(@param|@param\\\\?)(\\\\s+)(\\\\w+)' },\n              { defaultToken: 'comment.block.documentation.soy' } ] } ],\n      '#css': \n       [ { token: \n            [ 'punctuation.definition.tag.begin.soy',\n              'meta.tag.css.soy',\n              'entity.name.tag.soy' ],\n           regex: '(\\\\{/?)(\\\\s*)(css)\\\\b',\n           push: \n            [ { token: 'punctuation.definition.tag.end.soy',\n                regex: '\\\\}',\n                next: 'pop' },\n              { token: 'support.constant.soy',\n                regex: '\\\\b(?:LITERAL|REFERENCE|BACKEND_SPECIFIC|GOOG)\\\\b' },\n              { defaultToken: 'meta.tag.css.soy' } ] } ],\n      '#for': \n       [ { token: \n            [ 'punctuation.definition.tag.begin.soy',\n              'meta.tag.for.soy',\n              'entity.name.tag.soy' ],\n           regex: '(\\\\{/?)(\\\\s*)(for)\\\\b',\n           push: \n            [ { token: 'punctuation.definition.tag.end.soy',\n                regex: '\\\\}',\n                next: 'pop' },\n              { token: 'keyword.operator.soy', regex: '\\\\bin\\\\b' },\n              { token: 'support.function.soy', regex: '\\\\brange\\\\b' },\n              { include: '#variable' },\n              { include: '#number' },\n              { include: '#primitive' },\n              { defaultToken: 'meta.tag.for.soy' } ] } ],\n      '#foreach': \n       [ { token: \n            [ 'punctuation.definition.tag.begin.soy',\n              'meta.tag.foreach.soy',\n              'entity.name.tag.soy' ],\n           regex: '(\\\\{/?)(\\\\s*)(foreach)\\\\b',\n           push: \n            [ { token: 'punctuation.definition.tag.end.soy',\n                regex: '\\\\}',\n                next: 'pop' },\n              { token: 'keyword.operator.soy', regex: '\\\\bin\\\\b' },\n              { include: '#variable' },\n              { defaultToken: 'meta.tag.foreach.soy' } ] } ],\n      '#function': \n       [ { token: 'support.function.soy',\n           regex: '\\\\b(?:isFirst|isLast|index|hasData|length|keys|round|floor|ceiling|min|max|randomInt)\\\\b' } ],\n      '#if': \n       [ { token: \n            [ 'punctuation.definition.tag.begin.soy',\n              'meta.tag.if.soy',\n              'entity.name.tag.soy' ],\n           regex: '(\\\\{/?)(\\\\s*)(if|elseif)\\\\b',\n           push: \n            [ { token: 'punctuation.definition.tag.end.soy',\n                regex: '\\\\}',\n                next: 'pop' },\n              { include: '#variable' },\n              { include: '#operator' },\n              { include: '#function' },\n              { include: '#string-quoted-single' },\n              { include: '#string-quoted-double' },\n              { defaultToken: 'meta.tag.if.soy' } ] } ],\n      '#namespace': \n       [ { token: [ 'entity.name.tag.soy', 'text', 'variable.parameter.soy' ],\n           regex: '(namespace|delpackage)(\\\\s+)([\\\\w\\\\.]+)' } ],\n      '#number': [ { token: 'constant.numeric', regex: '[\\\\d]+' } ],\n      '#operator': \n       [ { token: 'keyword.operator.soy',\n           regex: '==|!=|\\\\band\\\\b|\\\\bor\\\\b|\\\\bnot\\\\b|-|\\\\+|/|\\\\?:' } ],\n      '#param': \n       [ { token: \n            [ 'punctuation.definition.tag.begin.soy',\n              'meta.tag.param.soy',\n              'entity.name.tag.soy' ],\n           regex: '(\\\\{/?)(\\\\s*)(param)',\n           push: \n            [ { token: 'punctuation.definition.tag.end.soy',\n                regex: '\\\\}',\n                next: 'pop' },\n              { include: '#variable' },\n              { token: \n                 [ 'entity.other.attribute-name.soy',\n                   'text',\n                   'keyword.operator.soy' ],\n                regex: '\\\\b([\\\\w]+)(\\\\s*)((?::)?)' },\n              { defaultToken: 'meta.tag.param.soy' } ] } ],\n      '#primitive': \n       [ { token: 'constant.language.soy',\n           regex: '\\\\b(?:null|false|true)\\\\b' } ],\n      '#msg': \n       [ { token: \n            [ 'punctuation.definition.tag.begin.soy',\n              'meta.tag.msg.soy',\n              'entity.name.tag.soy' ],\n           regex: '(\\\\{/?)(\\\\s*)(msg)\\\\b',\n           push: \n            [ { token: 'punctuation.definition.tag.end.soy',\n                regex: '\\\\}',\n                next: 'pop' },\n              { include: '#string-quoted-single' },\n              { include: '#string-quoted-double' },\n              { token: \n                 [ 'entity.other.attribute-name.soy',\n                   'text',\n                   'keyword.operator.soy' ],\n                regex: '\\\\b(meaning|desc)(\\\\s*)(=)' },\n              { defaultToken: 'meta.tag.msg.soy' } ] } ],\n      '#print': \n       [ { token: \n            [ 'punctuation.definition.tag.begin.soy',\n              'meta.tag.print.soy',\n              'entity.name.tag.soy' ],\n           regex: '(\\\\{/?)(\\\\s*)(print)\\\\b',\n           push: \n            [ { token: 'punctuation.definition.tag.end.soy',\n                regex: '\\\\}',\n                next: 'pop' },\n              { include: '#variable' },\n              { include: '#print-parameter' },\n              { include: '#number' },\n              { include: '#primitive' },\n              { include: '#attribute-lookup' },\n              { defaultToken: 'meta.tag.print.soy' } ] } ],\n      '#print-parameter': \n       [ { token: 'keyword.operator.soy', regex: '\\\\|' },\n         { token: 'variable.parameter.soy',\n           regex: 'noAutoescape|id|escapeHtml|escapeJs|insertWorkBreaks|truncate' } ],\n      '#special-character': \n       [ { token: 'support.constant.soy',\n           regex: '\\\\bsp\\\\b|\\\\bnil\\\\b|\\\\\\\\r|\\\\\\\\n|\\\\\\\\t|\\\\blb\\\\b|\\\\brb\\\\b' } ],\n      '#string-quoted-double': [ { token: 'string.quoted.double', regex: '\"[^\"]*\"' } ],\n      '#string-quoted-single': [ { token: 'string.quoted.single', regex: '\\'[^\\']*\\'' } ],\n      '#switch': \n       [ { token: \n            [ 'punctuation.definition.tag.begin.soy',\n              'meta.tag.switch.soy',\n              'entity.name.tag.soy' ],\n           regex: '(\\\\{/?)(\\\\s*)(switch|case)\\\\b',\n           push: \n            [ { token: 'punctuation.definition.tag.end.soy',\n                regex: '\\\\}',\n                next: 'pop' },\n              { include: '#variable' },\n              { include: '#function' },\n              { include: '#number' },\n              { include: '#string-quoted-single' },\n              { include: '#string-quoted-double' },\n              { defaultToken: 'meta.tag.switch.soy' } ] } ],\n      '#attribute-lookup': \n       [ { token: 'punctuation.definition.attribute-lookup.begin.soy',\n           regex: '\\\\[',\n           push: \n            [ { token: 'punctuation.definition.attribute-lookup.end.soy',\n                regex: '\\\\]',\n                next: 'pop' },\n              { include: '#variable' },\n              { include: '#function' },\n              { include: '#operator' },\n              { include: '#number' },\n              { include: '#primitive' },\n              { include: '#string-quoted-single' },\n              { include: '#string-quoted-double' } ] } ],\n      '#tag': \n       [ { token: 'punctuation.definition.tag.begin.soy',\n           regex: '\\\\{',\n           push: \n            [ { token: 'punctuation.definition.tag.end.soy',\n                regex: '\\\\}',\n                next: 'pop' },\n              { include: '#namespace' },\n              { include: '#variable' },\n              { include: '#special-character' },\n              { include: '#tag-simple' },\n              { include: '#function' },\n              { include: '#operator' },\n              { include: '#attribute-lookup' },\n              { include: '#number' },\n              { include: '#primitive' },\n              { include: '#print-parameter' } ] } ],\n      '#tag-simple': \n       [ { token: 'entity.name.tag.soy',\n           regex: '{{\\\\s*(?:literal|else|ifempty|default)\\\\s*(?=\\\\})'} ],\n      '#template': \n       [ { token: \n            [ 'punctuation.definition.tag.begin.soy',\n              'meta.tag.template.soy' ],\n           regex: '(\\\\{/?)(\\\\s*)(?=template|deltemplate)',\n           push: \n            [ { token: 'punctuation.definition.tag.end.soy',\n                regex: '\\\\}',\n                next: 'pop' },\n              { token: ['entity.name.tag.soy', 'text', 'entity.name.function.soy' ],\n                regex: '(template|deltemplate)(\\\\s+)([\\\\.\\\\w]+)',\n                originalRegex: '(?<=template|deltemplate)\\\\s+([\\\\.\\\\w]+)' },\n              { token: \n                 [ 'entity.other.attribute-name.soy',\n                   'text',\n                   'keyword.operator.soy',\n                   'text',\n                   'string.quoted.double.soy' ],\n                regex: '\\\\b(private)(\\\\s*)(=)(\\\\s*)(\"true\"|\"false\")' },\n              { token: \n                 [ 'entity.other.attribute-name.soy',\n                   'text',\n                   'keyword.operator.soy',\n                   'text',\n                   'string.quoted.single.soy' ],\n                regex: '\\\\b(private)(\\\\s*)(=)(\\\\s*)(\\'true\\'|\\'false\\')' },\n              { token: \n                 [ 'entity.other.attribute-name.soy',\n                   'text',\n                   'keyword.operator.soy',\n                   'text',\n                   'string.quoted.double.soy' ],\n                regex: '\\\\b(autoescape)(\\\\s*)(=)(\\\\s*)(\"true\"|\"false\"|\"contextual\")' },\n              { token: \n                 [ 'entity.other.attribute-name.soy',\n                   'text',\n                   'keyword.operator.soy',\n                   'text',\n                   'string.quoted.single.soy' ],\n                regex: '\\\\b(autoescape)(\\\\s*)(=)(\\\\s*)(\\'true\\'|\\'false\\'|\\'contextual\\')' },\n              { defaultToken: 'meta.tag.template.soy' } ] } ],\n      '#variable': [ { token: 'variable.other.soy', regex: '\\\\$[\\\\w\\\\.]+' } ] }\n    \n    \n    for (var i in soyRules) {\n        if (this.$rules[i]) {\n            this.$rules[i].unshift.call(this.$rules[i], soyRules[i]);\n        } else {\n            this.$rules[i] = soyRules[i];\n        }\n    }\n    \n    this.normalizeRules();\n};\n\nSoyTemplateHighlightRules.metaData = { comment: 'SoyTemplate',\n      fileTypes: [ 'soy' ],\n      firstLineMatch: '\\\\{\\\\s*namespace\\\\b',\n      foldingStartMarker: '\\\\{\\\\s*template\\\\s+[^\\\\}]*\\\\}',\n      foldingStopMarker: '\\\\{\\\\s*/\\\\s*template\\\\s*\\\\}',\n      name: 'SoyTemplate',\n      scopeName: 'source.soy' }\n\n\noop.inherits(SoyTemplateHighlightRules, HtmlHighlightRules);\n\nexports.SoyTemplateHighlightRules = SoyTemplateHighlightRules;\n});\n\nace.define(\"ace/mode/soy_template\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html\",\"ace/mode/soy_template_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar HtmlMode = require(\"./html\").Mode;\nvar SoyTemplateHighlightRules = require(\"./soy_template_highlight_rules\").SoyTemplateHighlightRules;\n\nvar Mode = function() {\n    HtmlMode.call(this);\n    this.HighlightRules = SoyTemplateHighlightRules;\n};\noop.inherits(Mode, HtmlMode);\n\n(function() {\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n    this.$id = \"ace/mode/soy_template\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-space.js",
    "content": "ace.define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var range = this.indentationBlock(session, row);\n        if (range)\n            return range;\n\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1 || line[startLevel] != \"#\")\n            return;\n\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var level = line.search(re);\n\n            if (level == -1)\n                continue;\n\n            if (line[level] != \"#\")\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        var next = session.getLine(row + 1);\n        var prev = session.getLine(row - 1);\n        var prevIndent = prev.search(/\\S/);\n        var nextIndent = next.search(/\\S/);\n\n        if (indent == -1) {\n            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? \"start\" : \"\";\n            return \"\";\n        }\n        if (prevIndent == -1) {\n            if (indent == nextIndent && line[indent] == \"#\" && next[indent] == \"#\") {\n                session.foldWidgets[row - 1] = \"\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"start\";\n            }\n        } else if (prevIndent == indent && line[indent] == \"#\" && prev[indent] == \"#\") {\n            if (session.getLine(row - 2).search(/\\S/) == -1) {\n                session.foldWidgets[row - 1] = \"start\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"\";\n            }\n        }\n\n        if (prevIndent!= -1 && prevIndent < indent)\n            session.foldWidgets[row - 1] = \"start\";\n        else\n            session.foldWidgets[row - 1] = \"\";\n\n        if (indent < nextIndent)\n            return \"start\";\n        else\n            return \"\";\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/space_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar SpaceHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"empty_line\",\n                regex : / */,\n                next : \"key\"\n            },\n            {\n                token : \"empty_line\",\n                regex : /$/,\n                next : \"key\"\n            }\n        ],\n        \"key\" : [\n            {\n                token : \"variable\",\n                regex : /\\S+/\n            },\n            {\n                token : \"empty_line\",\n                regex : /$/,\n                next : \"start\"\n            },{\n                token : \"keyword.operator\",\n                regex : / /,\n                next  : \"value\"\n            }\n        ],\n        \"value\" : [\n            {\n                token : \"keyword.operator\",\n                regex : /$/,\n                next  : \"start\"\n            },\n            {\n                token : \"string\",\n                regex : /[^$]/\n            }\n        ]\n    };\n    \n};\n\noop.inherits(SpaceHighlightRules, TextHighlightRules);\n\nexports.SpaceHighlightRules = SpaceHighlightRules;\n});\n\nace.define(\"ace/mode/space\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/folding/coffee\",\"ace/mode/space_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar FoldMode = require(\"./folding/coffee\").FoldMode;\nvar SpaceHighlightRules = require(\"./space_highlight_rules\").SpaceHighlightRules;\nvar Mode = function() {\n    this.HighlightRules = SpaceHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n(function() {\n    \n    this.$id = \"ace/mode/space\";\n}).call(Mode.prototype);\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-sql.js",
    "content": "ace.define(\"ace/mode/sql_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar SqlHighlightRules = function() {\n\n    var keywords = (\n        \"select|insert|update|delete|from|where|and|or|group|by|order|limit|offset|having|as|case|\" +\n        \"when|else|end|type|left|right|join|on|outer|desc|asc|union\"\n    );\n\n    var builtinConstants = (\n        \"true|false|null\"\n    );\n\n    var builtinFunctions = (\n        \"count|min|max|avg|sum|rank|now|coalesce\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": builtinFunctions,\n        \"keyword\": keywords,\n        \"constant.language\": builtinConstants\n    }, \"identifier\", true);\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment\",\n            regex : \"--.*$\"\n        },  {\n            token : \"comment\",\n            start : \"/\\\\*\",\n            end : \"\\\\*/\"\n        }, {\n            token : \"string\",           // \" string\n            regex : '\".*?\"'\n        }, {\n            token : \"string\",           // ' string\n            regex : \"'.*?'\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\\\+|\\\\-|\\\\/|\\\\/\\\\/|%|<@>|@>|<@|&|\\\\^|~|<|>|<=|=>|==|!=|<>|=\"\n        }, {\n            token : \"paren.lparen\",\n            regex : \"[\\\\(]\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\)]\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        } ]\n    };\n    this.normalizeRules();\n};\n\noop.inherits(SqlHighlightRules, TextHighlightRules);\n\nexports.SqlHighlightRules = SqlHighlightRules;\n});\n\nace.define(\"ace/mode/sql\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/sql_highlight_rules\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar SqlHighlightRules = require(\"./sql_highlight_rules\").SqlHighlightRules;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.HighlightRules = SqlHighlightRules;\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"--\";\n\n    this.$id = \"ace/mode/sql\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-stylus.js",
    "content": "ace.define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\nace.define(\"ace/mode/stylus_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\",\"ace/mode/css_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar CssHighlightRules = require(\"./css_highlight_rules\");\n\nvar StylusHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.type\": CssHighlightRules.supportType,\n        \"support.function\": CssHighlightRules.supportFunction,\n        \"support.constant\": CssHighlightRules.supportConstant,\n        \"support.constant.color\": CssHighlightRules.supportConstantColor,\n        \"support.constant.fonts\": CssHighlightRules.supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n    start: [\n        {\n            token : \"comment\",\n            regex : /\\/\\/.*$/\n        },\n        {\n            token : \"comment\", // multi line comment\n            regex : /\\/\\*/,\n            next : \"comment\"\n        },\n        {\n            token: [\"entity.name.function.stylus\", \"text\"],\n            regex: \"^([-a-zA-Z_][-\\\\w]*)?(\\\\()\"\n        },\n        {\n            token: [\"entity.other.attribute-name.class.stylus\"],\n            regex: \"\\\\.-?[_a-zA-Z]+[_a-zA-Z0-9-]*\"\n        },\n        {\n            token: [\"entity.language.stylus\"],\n            regex: \"^ *&\"\n        },\n        {\n            token: [\"variable.language.stylus\"],\n            regex: \"(arguments)\"\n        },\n        {\n            token: [\"keyword.stylus\"],\n            regex: \"@[-\\\\w]+\"\n        },\n        {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : CssHighlightRules.pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : CssHighlightRules.pseudoClasses\n        }, \n        {\n            token: [\"entity.name.tag.stylus\"],\n            regex: \"(?:\\\\b)(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|datalist|dd|del|details|dfn|dialog|div|dl|dt|em|eventsource|fieldset|figure|figcaption|footer|form|frame|frameset|(?:h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|label|legend|li|link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|samp|script|section|select|small|span|strike|strong|style|sub|summary|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)(?:\\\\b)\"\n        },\n        {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, \n        {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, \n        {\n            token: [\"punctuation.definition.entity.stylus\", \"entity.other.attribute-name.id.stylus\"],\n            regex: \"(#)([a-zA-Z][a-zA-Z0-9_-]*)\"\n        },\n        {\n            token: \"meta.vendor-prefix.stylus\",\n            regex: \"-webkit-|-moz\\\\-|-ms-|-o-\"\n        },\n        {\n            token: \"keyword.control.stylus\",\n            regex: \"(?:!important|for|in|return|true|false|null|if|else|unless|return)\\\\b\"\n        },\n        {\n            token: \"keyword.operator.stylus\",\n            regex: \"!|~|\\\\+|-|(?:\\\\*)?\\\\*|\\\\/|%|(?:\\\\.)\\\\.\\\\.|<|>|(?:=|:|\\\\?|\\\\+|-|\\\\*|\\\\/|%|<|>)?=|!=\"\n        },\n        {\n            token: \"keyword.operator.stylus\",\n            regex: \"(?:in|is(?:nt)?|not)\\\\b\"\n        },\n        {\n            token : \"string\",\n            regex : \"'(?=.)\",\n            next  : \"qstring\"\n        }, {\n            token : \"string\",\n            regex : '\"(?=.)',\n            next  : \"qqstring\"\n        }, \n        {\n            token : \"constant.numeric\",\n            regex : CssHighlightRules.numRe\n        }, \n        {\n            token : \"keyword\",\n            regex : \"(?:ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\\\\b\"\n        }, \n        {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }\n    ],\n    \"comment\" : [\n        {\n            token : \"comment\", // closing comment\n            regex : \".*?\\\\*\\\\/\",\n            next : \"start\"\n        }, {\n            token : \"comment\", // comment spanning whole line\n            regex : \".+\"\n        }\n    ],\n    \"qqstring\" : [\n        {\n            token : \"string\",\n            regex : '[^\"\\\\\\\\]+'\n        }, \n        {\n            token : \"string\",\n            regex : \"\\\\\\\\$\",\n            next  : \"qqstring\"\n        }, \n        {\n            token : \"string\",\n            regex : '\"|$',\n            next  : \"start\"\n        }\n    ],\n    \"qstring\" : [\n        {\n            token : \"string\",\n            regex : \"[^'\\\\\\\\]+\"\n        }, \n        {\n            token : \"string\",\n            regex : \"\\\\\\\\$\",\n            next  : \"qstring\"\n        }, \n        {\n            token : \"string\",\n            regex : \"'|$\",\n            next  : \"start\"\n        }\n    ]\n}\n\n};\n\noop.inherits(StylusHighlightRules, TextHighlightRules);\n\nexports.StylusHighlightRules = StylusHighlightRules;\n});\n\nace.define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var range = this.indentationBlock(session, row);\n        if (range)\n            return range;\n\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1 || line[startLevel] != \"#\")\n            return;\n\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var level = line.search(re);\n\n            if (level == -1)\n                continue;\n\n            if (line[level] != \"#\")\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        var next = session.getLine(row + 1);\n        var prev = session.getLine(row - 1);\n        var prevIndent = prev.search(/\\S/);\n        var nextIndent = next.search(/\\S/);\n\n        if (indent == -1) {\n            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? \"start\" : \"\";\n            return \"\";\n        }\n        if (prevIndent == -1) {\n            if (indent == nextIndent && line[indent] == \"#\" && next[indent] == \"#\") {\n                session.foldWidgets[row - 1] = \"\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"start\";\n            }\n        } else if (prevIndent == indent && line[indent] == \"#\" && prev[indent] == \"#\") {\n            if (session.getLine(row - 2).search(/\\S/) == -1) {\n                session.foldWidgets[row - 1] = \"start\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"\";\n            }\n        }\n\n        if (prevIndent!= -1 && prevIndent < indent)\n            session.foldWidgets[row - 1] = \"start\";\n        else\n            session.foldWidgets[row - 1] = \"\";\n\n        if (indent < nextIndent)\n            return \"start\";\n        else\n            return \"\";\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/stylus\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/stylus_highlight_rules\",\"ace/mode/folding/coffee\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar StylusHighlightRules = require(\"./stylus_highlight_rules\").StylusHighlightRules;\nvar FoldMode = require(\"./folding/coffee\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = StylusHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n    \n    this.$id = \"ace/mode/stylus\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-svg.js",
    "content": "ace.define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"string.cdata.xml\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.xml-decl.xml\", \"keyword.xml-decl.xml\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_decl\", caseInsensitive: true\n            },\n            {\n                token : [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"processing_instruction\",\n            },\n            {token : \"comment.xml\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\", caseInsensitive: true\n            },\n            {include : \"tag\"},\n            {token : \"text.end-tag-open.xml\", regex: \"</\"},\n            {token : \"text.tag-open.xml\", regex: \"<\"},\n            {include : \"reference\"},\n            {defaultToken : \"text.xml\"}\n        ],\n\n        xml_decl : [{\n            token : \"entity.other.attribute-name.decl-attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.decl-attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"whitespace\"\n        }, {\n            include: \"string\"\n        }, {\n            token : \"punctuation.xml-decl.xml\",\n            regex : \"\\\\?>\",\n            next : \"start\"\n        }],\n\n        processing_instruction : [\n            {token : \"punctuation.instruction.xml\", regex : \"\\\\?>\", next : \"start\"},\n            {defaultToken : \"instruction.xml\"}\n        ],\n\n        doctype : [\n            {include : \"whitespace\"},\n            {include : \"string\"},\n            {token : \"xml-pe.doctype.xml\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe.xml\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.int-subset\", regex : \"\\\\[\", push : \"int_subset\"}\n        ],\n\n        int_subset : [{\n            token : \"text.xml\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.int-subset.xml\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.markup-decl.xml\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.cdata.xml\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text.xml\", regex : \"\\\\s+\"},\n            {token : \"text.xml\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment.xml\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment.xml\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape.reference.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        attr_reference : [{\n            token : \"constant.language.escape.reference.attribute-value.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n            regex : \"(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n            ]\n        }],\n\n        tag_whitespace : [\n            {token : \"text.tag-whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        whitespace : [\n            {token : \"text.whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        string: [{\n            token : \"string.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.xml\", regex: \"'\", next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }, {\n            token : \"string.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.xml\", regex: '\"', next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }],\n\n        attributes: [{\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"tag_whitespace\"\n        }, {\n            include: \"attribute_value\"\n        }],\n\n        attribute_value: [{\n            token : \"string.attribute-value.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }, {\n            token : \"string.attribute-value.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nvar XmlBehaviour = function () {\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selected = session.doc.getTextRange(editor.getSelectionRange());\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            }\n\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (rightChar == quote && (is(token, \"attribute-value\") || is(token, \"string\"))) {\n                return {\n                    text: \"\",\n                    selection: [1, 1]\n                };\n            }\n\n            if (!token)\n                token = iterator.stepBackward();\n\n            if (!token)\n                return;\n\n            while (is(token, \"tag-whitespace\") || is(token, \"whitespace\")) {\n                token = iterator.stepBackward();\n            }\n            var rightSpace = !rightChar || rightChar.match(/\\s/);\n            if (is(token, \"attribute-equals\") && (rightSpace || rightChar == '>') || (is(token, \"decl-attribute-equals\") && (rightSpace || rightChar == '?'))) {\n                return {\n                    text: quote + quote,\n                    selection: [1, 1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken() || iterator.stepBackward();\n            if (!token || !(is(token, \"tag-name\") || is(token, \"tag-whitespace\") || is(token, \"attribute-name\") || is(token, \"attribute-equals\") || is(token, \"attribute-value\")))\n                return;\n            if (is(token, \"reference.attribute-value\"))\n                return;\n            if (is(token, \"attribute-value\")) {\n                var firstChar = token.value.charAt(0);\n                if (firstChar == '\"' || firstChar == \"'\") {\n                    var lastChar = token.value.charAt(token.value.length - 1);\n                    var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length;\n                    if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar)\n                        return;\n                }\n            }\n            while (!is(token, \"tag-name\")) {\n                token = iterator.stepBackward();\n            }\n\n            var tokenRow = iterator.getCurrentTokenRow();\n            var tokenColumn = iterator.getCurrentTokenColumn();\n            if (is(iterator.stepBackward(), \"end-tag-open\"))\n                return;\n\n            var element = token.value;\n            if (tokenRow == position.row)\n                element = element.substring(0, position.column - tokenColumn);\n\n            if (this.voidElements.hasOwnProperty(element.toLowerCase()))\n                 return;\n\n            return {\n               text: \">\" + \"</\" + element + \">\",\n               selection: [1, 1]\n            };\n        }\n    });\n\n    this.add(\"autoindent\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.getLine(cursor.row);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (token && token.type.indexOf(\"tag-close\") !== -1) {\n                while (token && token.type.indexOf(\"tag-name\") === -1) {\n                    token = iterator.stepBackward();\n                }\n\n                if (!token) {\n                    return;\n                }\n\n                var tag = token.value;\n                var row = iterator.getCurrentTokenRow();\n                token = iterator.stepBackward();\n                if (!token || token.type.indexOf(\"end-tag\") !== -1) {\n                    return;\n                }\n\n                if (this.voidElements && !this.voidElements[tag]) {\n                    var nextToken = session.getTokenAt(cursor.row, cursor.column+1);\n                    var line = session.getLine(row);\n                    var nextIndent = this.$getIndent(line);\n                    var indent = nextIndent + session.getTabString();\n\n                    if (nextToken && nextToken.value === \"</\") {\n                        return {\n                            text: \"\\n\" + indent + \"\\n\" + nextIndent,\n                            selection: [1, indent.length, 1, indent.length]\n                        };\n                    } else {\n                        return {\n                            text: \"\\n\" + indent\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n};\n\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\nace.define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalEndTags) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n    this.optionalEndTags = oop.mixin({}, this.voidElements);\n    if (optionalEndTags)\n        oop.mixin(this.optionalEndTags, optionalEndTags);\n    \n};\noop.inherits(FoldMode, BaseFoldMode);\n\nvar Tag = function() {\n    this.tagName = \"\";\n    this.closing = false;\n    this.selfClosing = false;\n    this.start = {row: 0, column: 0};\n    this.end = {row: 0, column: 0};\n};\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (!tag)\n            return \"\";\n\n        if (tag.closing || (!tag.tagName && tag.selfClosing))\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase()))\n            return \"\";\n\n        if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column))\n            return \"\";\n\n        return \"start\";\n    };\n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var tag = new Tag();\n\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (is(token, \"tag-open\")) {\n                tag.end.column = tag.start.column + token.value.length;\n                tag.closing = is(token, \"end-tag-open\");\n                token = tokens[++i];\n                if (!token)\n                    return null;\n                tag.tagName = token.value;\n                tag.end.column += token.value.length;\n                for (i++; i < tokens.length; i++) {\n                    token = tokens[i];\n                    tag.end.column += token.value.length;\n                    if (is(token, \"tag-close\")) {\n                        tag.selfClosing = token.value == '/>';\n                        break;\n                    }\n                }\n                return tag;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == '/>';\n                return tag;\n            }\n            tag.start.column += token.value.length;\n        }\n\n        return null;\n    };\n\n    this._findEndTagInLine = function(session, row, tagName, startColumn) {\n        var tokens = session.getTokens(row);\n        var column = 0;\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            column += token.value.length;\n            if (column < startColumn)\n                continue;\n            if (is(token, \"end-tag-open\")) {\n                token = tokens[i + 1];\n                if (token && token.value == tagName)\n                    return true;\n            }\n        }\n        return false;\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n                iterator.stepForward();\n                return tag;\n            }\n        } while(token = iterator.stepForward());\n\n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n                iterator.stepBackward();\n                return tag;\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n            }\n        } while(token = iterator.stepBackward());\n\n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.optionalEndTags.hasOwnProperty(top.tagName)) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.start.column);\n            var start = {\n                row: row,\n                column: firstTag.start.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.end.column);\n            var end = {\n                row: row,\n                column: firstTag.start.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/xml_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/xml\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextMode = require(\"./text\").Mode;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar XmlFoldMode = require(\"./folding/xml\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = XmlHighlightRules;\n    this.$behaviour = new XmlBehaviour();\n    this.foldingRules = new XmlFoldMode();\n};\n\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.voidElements = lang.arrayToMap([]);\n\n    this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n    this.$id = \"ace/mode/xml\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/svg_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar SvgHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    this.normalizeRules();\n};\n\noop.inherits(SvgHighlightRules, XmlHighlightRules);\n\nexports.SvgHighlightRules = SvgHighlightRules;\n});\n\nace.define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n    this.defaultMode = defaultMode;\n    this.subModes = subModes;\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n\n    this.$getMode = function(state) {\n        if (typeof state != \"string\") \n            state = state[0];\n        for (var key in this.subModes) {\n            if (state.indexOf(key) === 0)\n                return this.subModes[key];\n        }\n        return null;\n    };\n    \n    this.$tryMode = function(state, session, foldStyle, row) {\n        var mode = this.$getMode(state);\n        return (mode ? mode.getFoldWidget(session, foldStyle, row) : \"\");\n    };\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        return (\n            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n            this.defaultMode.getFoldWidget(session, foldStyle, row)\n        );\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var mode = this.$getMode(session.getState(row-1));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.$getMode(session.getState(row));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.defaultMode;\n        \n        return mode.getFoldWidgetRange(session, foldStyle, row);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/svg\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/xml\",\"ace/mode/javascript\",\"ace/mode/svg_highlight_rules\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar XmlMode = require(\"./xml\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar SvgHighlightRules = require(\"./svg_highlight_rules\").SvgHighlightRules;\nvar MixedFoldMode = require(\"./folding/mixed\").FoldMode;\nvar XmlFoldMode = require(\"./folding/xml\").FoldMode;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    XmlMode.call(this);\n    \n    this.HighlightRules = SvgHighlightRules;\n    \n    this.createModeDelegates({\n        \"js-\": JavaScriptMode\n    });\n    \n    this.foldingRules = new MixedFoldMode(new XmlFoldMode(), {\n        \"js-\": new CStyleFoldMode()\n    });\n};\n\noop.inherits(Mode, XmlMode);\n\n(function() {\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n    \n\n    this.$id = \"ace/mode/svg\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-tcl.js",
    "content": "ace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/tcl_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar TclHighlightRules = function() {\n\n    this.$rules = {\n        \"start\" : [\n           {\n                token : \"comment\",\n                regex : \"#.*\\\\\\\\$\",\n                next  : \"commentfollow\"\n            }, {\n                token : \"comment\",\n                regex : \"#.*$\"\n            }, {\n                token : \"support.function\",\n                regex : '[\\\\\\\\]$',\n                next  : \"splitlineStart\"\n            }, {\n                token : \"text\",\n                regex : '[\\\\\\\\](?:[\"]|[{]|[}]|[[]|[]]|[$]|[\\])'\n            }, {\n                token : \"text\", // last value before command\n                regex : '^|[^{][;][^}]|[/\\r/]',\n                next  : \"commandItem\"\n            }, {\n                token : \"string\", // single line\n                regex : '[ ]*[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line \"\"\" string start\n                regex : '[ ]*[\"]',\n                next  : \"qqstring\"\n            }, {\n                token : \"variable.instance\",\n                regex : \"[$]\",\n                next  : \"variable\"\n            }, {\n                token : \"support.function\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|{\\\\*}|;|::\"\n            }, {\n                token : \"identifier\",\n                regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[{]\",\n                next  : \"commandItem\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[(]\"\n            },  {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+\"\n            }\n        ],\n        \"commandItem\" : [\n            {\n                token : \"comment\",\n                regex : \"#.*\\\\\\\\$\",\n                next  : \"commentfollow\"\n            }, {\n                token : \"comment\",\n                regex : \"#.*$\",\n                next  : \"start\"\n            }, {\n                token : \"string\", // single line\n                regex : '[ ]*[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"variable.instance\", \n                regex : \"[$]\",\n                next  : \"variable\"\n            }, {\n                token : \"support.function\",\n                regex : \"(?:[:][:])[a-zA-Z0-9_/]+(?:[:][:])\",\n                next  : \"commandItem\"\n            }, {\n                token : \"support.function\",\n                regex : \"[a-zA-Z0-9_/]+(?:[:][:])\",\n                next  : \"commandItem\"\n            }, {\n                token : \"support.function\",\n                regex : \"(?:[:][:])\",\n                next  : \"commandItem\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }, {\n                token : \"support.function\",\n                regex : \"!|\\\\$|%|&|\\\\*|\\\\-\\\\-|\\\\-|\\\\+\\\\+|\\\\+|~|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\\\|\\\\||\\\\?\\\\:|\\\\*=|%=|\\\\+=|\\\\-=|&=|\\\\^=|{\\\\*}|;|::\"\n            }, {\n                token : \"keyword\",\n                regex : \"[a-zA-Z0-9_/]+\",\n                next  : \"start\"\n            } ],\n        \"commentfollow\" : [ \n            {\n                token : \"comment\",\n                regex : \".*\\\\\\\\$\",\n                next  : \"commentfollow\"\n            }, {\n                token : \"comment\",\n                regex : '.+',\n                next  : \"start\"\n        } ],\n        \"splitlineStart\" : [ \n            {\n                token : \"text\",\n                regex : \"^.\",\n                next  : \"start\"\n            }],\n        \"variable\" : [ \n            {\n                token : \"variable.instance\", // variable tcl\n                regex : \"[a-zA-Z_\\\\d]+(?:[(][a-zA-Z_\\\\d]+[)])?\",\n                next  : \"start\"\n            }, {\n                token : \"variable.instance\", // variable tcl with braces\n                regex : \"{?[a-zA-Z_\\\\d]+}?\",\n                next  : \"start\"\n            }],  \n        \"qqstring\" : [ {\n            token : \"string\", // multi line \"\"\" string end\n            regex : '(?:[^\\\\\\\\]|\\\\\\\\.)*?[\"]',\n            next : \"start\"\n        }, {\n            token : \"string\",\n            regex : '.+'\n        } ]\n    };\n};\n\noop.inherits(TclHighlightRules, TextHighlightRules);\n\nexports.TclHighlightRules = TclHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/tcl\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/folding/cstyle\",\"ace/mode/tcl_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\nvar TclHighlightRules = require(\"./tcl_highlight_rules\").TclHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.HighlightRules = TclHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"#\";\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n        \n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.$id = \"ace/mode/tcl\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-tex.js",
    "content": "ace.define(\"ace/mode/tex_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar TexHighlightRules = function(textClass) {\n\n    if (!textClass)\n        textClass = \"text\";\n\n    this.$rules = {\n        \"start\" : [\n\t        {\n\t            token : \"comment\",\n\t            regex : \"%.*$\"\n\t        }, {\n\t            token : textClass, // non-command\n\t            regex : \"\\\\\\\\[$&%#\\\\{\\\\}]\"\n\t        }, {\n\t            token : \"keyword\", // command\n\t            regex : \"\\\\\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\\\b\",\n               next : \"nospell\"\n\t        }, {\n\t            token : \"keyword\", // command\n\t            regex : \"\\\\\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])\"\n\t        }, {\n               token : \"paren.keyword.operator\",\n\t            regex : \"[[({]\"\n\t        }, {\n               token : \"paren.keyword.operator\",\n\t            regex : \"[\\\\])}]\"\n\t        }, {\n\t            token : textClass,\n\t            regex : \"\\\\s+\"\n\t        }\n        ],\n        \"nospell\" : [\n           {\n               token : \"comment\",\n               regex : \"%.*$\",\n               next : \"start\"\n           }, {\n               token : \"nospell.\" + textClass, // non-command\n               regex : \"\\\\\\\\[$&%#\\\\{\\\\}]\"\n           }, {\n               token : \"keyword\", // command\n               regex : \"\\\\\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\\\b\"\n           }, {\n               token : \"keyword\", // command\n               regex : \"\\\\\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])\",\n               next : \"start\"\n           }, {\n               token : \"paren.keyword.operator\",\n               regex : \"[[({]\"\n           }, {\n               token : \"paren.keyword.operator\",\n               regex : \"[\\\\])]\"\n           }, {\n               token : \"paren.keyword.operator\",\n               regex : \"}\",\n               next : \"start\"\n           }, {\n               token : \"nospell.\" + textClass,\n               regex : \"\\\\s+\"\n           }, {\n               token : \"nospell.\" + textClass,\n               regex : \"\\\\w+\"\n           }\n        ]\n    };\n};\n\noop.inherits(TexHighlightRules, TextHighlightRules);\n\nexports.TexHighlightRules = TexHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/tex\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/text_highlight_rules\",\"ace/mode/tex_highlight_rules\",\"ace/mode/matching_brace_outdent\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar TexHighlightRules = require(\"./tex_highlight_rules\").TexHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\n\nvar Mode = function(suppressHighlighting) {\n\tif (suppressHighlighting)\n    \tthis.HighlightRules = TextHighlightRules;\n\telse\n    \tthis.HighlightRules = TexHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n   this.getNextLineIndent = function(state, line, tab) {\n      return this.$getIndent(line);\n   };\n\n   this.allowAutoInsert = function() {\n      return false;\n   };\n    this.$id = \"ace/mode/tex\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-text.js",
    "content": "\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-textile.js",
    "content": "ace.define(\"ace/mode/textile_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar TextileHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [\n            {\n                token : function(value) {\n                    if (value.charAt(0) == \"h\")\n                        return \"markup.heading.\" + value.charAt(1);\n                    else\n                        return \"markup.heading\";\n                },\n                regex : \"h1|h2|h3|h4|h5|h6|bq|p|bc|pre\",\n                next  : \"blocktag\"\n            },\n            {\n                token : \"keyword\",\n                regex : \"[\\\\*]+|[#]+\"\n            },\n            {\n                token : \"text\",\n                regex : \".+\"\n            }\n        ],\n        \"blocktag\" : [\n            {\n                token : \"keyword\",\n                regex : \"\\\\. \",\n                next  : \"start\"\n            },\n            {\n                token : \"keyword\",\n                regex : \"\\\\(\",\n                next  : \"blocktagproperties\"\n            }\n        ],\n        \"blocktagproperties\" : [\n            {\n                token : \"keyword\",\n                regex : \"\\\\)\",\n                next  : \"blocktag\"\n            },\n            {\n                token : \"string\",\n                regex : \"[a-zA-Z0-9\\\\-_]+\"\n            },\n            {\n                token : \"keyword\",\n                regex : \"#\"\n            }\n        ]\n    };\n};\n\noop.inherits(TextileHighlightRules, TextHighlightRules);\n\nexports.TextileHighlightRules = TextileHighlightRules;\n\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/textile\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/textile_highlight_rules\",\"ace/mode/matching_brace_outdent\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar TextileHighlightRules = require(\"./textile_highlight_rules\").TextileHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\n\nvar Mode = function() {\n    this.HighlightRules = TextileHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.type = \"text\";\n    this.getNextLineIndent = function(state, line, tab) {\n        if (state == \"intag\")\n            return tab;\n        \n        return \"\";\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n    \n    this.$id = \"ace/mode/textile\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-toml.js",
    "content": "ace.define(\"ace/mode/toml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar TomlHighlightRules = function() {\n    var keywordMapper = this.createKeywordMapper({\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    this.$rules = {\n    \"start\": [\n        {\n            token: \"comment.toml\",\n            regex: /#.*$/\n        },\n        {\n            token : \"string\",\n            regex : '\"(?=.)',\n            next  : \"qqstring\"\n        },\n        {\n            token: [\"variable.keygroup.toml\"],\n            regex: \"(?:^\\\\s*)(\\\\[([^\\\\]]+)\\\\])\"\n        },\n        {\n            token : keywordMapper,\n            regex : identifierRe\n        },\n        {\n           token : \"support.date.toml\",\n           regex: \"\\\\d{4}-\\\\d{2}-\\\\d{2}(T)\\\\d{2}:\\\\d{2}:\\\\d{2}(Z)\"\n        },\n        {\n           token: \"constant.numeric.toml\",\n           regex: \"-?\\\\d+(\\\\.?\\\\d+)?\"\n        }\n    ],\n    \"qqstring\" : [\n        {\n            token : \"string\",\n            regex : \"\\\\\\\\$\",\n            next  : \"qqstring\"\n        },\n        {\n            token : \"constant.language.escape\",\n            regex : '\\\\\\\\[0tnr\"\\\\\\\\]'\n        },\n        {\n            token : \"string\",\n            regex : '\"|$',\n            next  : \"start\"\n        },\n        {\n            defaultToken: \"string\"\n        }\n    ]\n    }\n\n};\n\noop.inherits(TomlHighlightRules, TextHighlightRules);\n\nexports.TomlHighlightRules = TomlHighlightRules;\n});\n\nace.define(\"ace/mode/folding/ini\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function() {\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.foldingStartMarker = /^\\s*\\[([^\\])]*)]\\s*(?:$|[;#])/;\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var re = this.foldingStartMarker;\n        var line = session.getLine(row);\n        \n        var m = line.match(re);\n        \n        if (!m) return;\n        \n        var startName = m[1] + \".\";\n        \n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            if (/^\\s*$/.test(line))\n                continue;\n            m = line.match(re);\n            if (m && m[1].lastIndexOf(startName, 0) !== 0)\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/toml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/toml_highlight_rules\",\"ace/mode/folding/ini\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar TomlHighlightRules = require(\"./toml_highlight_rules\").TomlHighlightRules;\nvar FoldMode = require(\"./folding/ini\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = TomlHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"#\";\n    this.$id = \"ace/mode/toml\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-twig.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\nace.define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar CssBehaviour = function () {\n\n    this.inherit(CstyleBehaviour);\n\n    this.add(\"colon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(cursor.row);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                if (rightChar === ':') {\n                    return {\n                       text: '',\n                       selection: [1, 1]\n                    }\n                }\n                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n                    return {\n                       text: ':;',\n                       selection: [1, 1]\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"colon\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(range.start.row);\n                var rightChar = line.substring(range.end.column, range.end.column + 1);\n                if (rightChar === ';') {\n                    range.end.column ++;\n                    return range;\n                }\n            }\n        }\n    });\n\n    this.add(\"semicolon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ';') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === ';') {\n                return {\n                   text: '',\n                   selection: [1, 1]\n                }\n            }\n        }\n    });\n\n}\noop.inherits(CssBehaviour, CstyleBehaviour);\n\nexports.CssBehaviour = CssBehaviour;\n});\n\nace.define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CssBehaviour = require(\"./behaviour/css\").CssBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = CssHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CssBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"csslint\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/css\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\nace.define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"string.cdata.xml\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.xml-decl.xml\", \"keyword.xml-decl.xml\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_decl\", caseInsensitive: true\n            },\n            {\n                token : [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"processing_instruction\",\n            },\n            {token : \"comment.xml\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\", caseInsensitive: true\n            },\n            {include : \"tag\"},\n            {token : \"text.end-tag-open.xml\", regex: \"</\"},\n            {token : \"text.tag-open.xml\", regex: \"<\"},\n            {include : \"reference\"},\n            {defaultToken : \"text.xml\"}\n        ],\n\n        xml_decl : [{\n            token : \"entity.other.attribute-name.decl-attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.decl-attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"whitespace\"\n        }, {\n            include: \"string\"\n        }, {\n            token : \"punctuation.xml-decl.xml\",\n            regex : \"\\\\?>\",\n            next : \"start\"\n        }],\n\n        processing_instruction : [\n            {token : \"punctuation.instruction.xml\", regex : \"\\\\?>\", next : \"start\"},\n            {defaultToken : \"instruction.xml\"}\n        ],\n\n        doctype : [\n            {include : \"whitespace\"},\n            {include : \"string\"},\n            {token : \"xml-pe.doctype.xml\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe.xml\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.int-subset\", regex : \"\\\\[\", push : \"int_subset\"}\n        ],\n\n        int_subset : [{\n            token : \"text.xml\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.int-subset.xml\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.markup-decl.xml\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.cdata.xml\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text.xml\", regex : \"\\\\s+\"},\n            {token : \"text.xml\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment.xml\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment.xml\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape.reference.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        attr_reference : [{\n            token : \"constant.language.escape.reference.attribute-value.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n            regex : \"(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n            ]\n        }],\n\n        tag_whitespace : [\n            {token : \"text.tag-whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        whitespace : [\n            {token : \"text.whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        string: [{\n            token : \"string.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.xml\", regex: \"'\", next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }, {\n            token : \"string.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.xml\", regex: '\"', next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }],\n\n        attributes: [{\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"tag_whitespace\"\n        }, {\n            include: \"attribute_value\"\n        }],\n\n        attribute_value: [{\n            token : \"string.attribute-value.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }, {\n            token : \"string.attribute-value.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\nace.define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    option      : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.addRules({\n        attributes: [{\n            include : \"tag_whitespace\"\n        }, {\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\",\n            push : [{\n                include: \"tag_whitespace\"\n            }, {\n                token : \"string.unquoted.attribute-value.html\",\n                regex : \"[^<>='\\\"`\\\\s]+\",\n                next : \"pop\"\n            }, {\n                token : \"empty\",\n                regex : \"\",\n                next : \"pop\"\n            }]\n        }, {\n            include : \"attribute_value\"\n        }],\n        tag: [{\n            token : function(start, tag) {\n                var group = tagMap[tag];\n                return [\"meta.tag.punctuation.\" + (start == \"<\" ? \"\" : \"end-\") + \"tag-open.xml\",\n                    \"meta.tag\" + (group ? \".\" + group : \"\") + \".tag-name.xml\"];\n            },\n            regex : \"(</?)([-_a-zA-Z0-9:]+)\",\n            next: \"tag_stuff\"\n        }],\n        tag_stuff: [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n        ],\n    });\n\n    this.embedTagRules(CssHighlightRules, \"css-\", \"style\");\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    if (this.constructor === HtmlHighlightRules)\n        this.normalizeRules();\n};\n\noop.inherits(HtmlHighlightRules, XmlHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nvar XmlBehaviour = function () {\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selected = session.doc.getTextRange(editor.getSelectionRange());\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            }\n\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (rightChar == quote && (is(token, \"attribute-value\") || is(token, \"string\"))) {\n                return {\n                    text: \"\",\n                    selection: [1, 1]\n                };\n            }\n\n            if (!token)\n                token = iterator.stepBackward();\n\n            if (!token)\n                return;\n\n            while (is(token, \"tag-whitespace\") || is(token, \"whitespace\")) {\n                token = iterator.stepBackward();\n            }\n            var rightSpace = !rightChar || rightChar.match(/\\s/);\n            if (is(token, \"attribute-equals\") && (rightSpace || rightChar == '>') || (is(token, \"decl-attribute-equals\") && (rightSpace || rightChar == '?'))) {\n                return {\n                    text: quote + quote,\n                    selection: [1, 1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken() || iterator.stepBackward();\n            if (!token || !(is(token, \"tag-name\") || is(token, \"tag-whitespace\") || is(token, \"attribute-name\") || is(token, \"attribute-equals\") || is(token, \"attribute-value\")))\n                return;\n            if (is(token, \"reference.attribute-value\"))\n                return;\n            if (is(token, \"attribute-value\")) {\n                var firstChar = token.value.charAt(0);\n                if (firstChar == '\"' || firstChar == \"'\") {\n                    var lastChar = token.value.charAt(token.value.length - 1);\n                    var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length;\n                    if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar)\n                        return;\n                }\n            }\n            while (!is(token, \"tag-name\")) {\n                token = iterator.stepBackward();\n            }\n\n            var tokenRow = iterator.getCurrentTokenRow();\n            var tokenColumn = iterator.getCurrentTokenColumn();\n            if (is(iterator.stepBackward(), \"end-tag-open\"))\n                return;\n\n            var element = token.value;\n            if (tokenRow == position.row)\n                element = element.substring(0, position.column - tokenColumn);\n\n            if (this.voidElements.hasOwnProperty(element.toLowerCase()))\n                 return;\n\n            return {\n               text: \">\" + \"</\" + element + \">\",\n               selection: [1, 1]\n            };\n        }\n    });\n\n    this.add(\"autoindent\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.getLine(cursor.row);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (token && token.type.indexOf(\"tag-close\") !== -1) {\n                while (token && token.type.indexOf(\"tag-name\") === -1) {\n                    token = iterator.stepBackward();\n                }\n\n                if (!token) {\n                    return;\n                }\n\n                var tag = token.value;\n                var row = iterator.getCurrentTokenRow();\n                token = iterator.stepBackward();\n                if (!token || token.type.indexOf(\"end-tag\") !== -1) {\n                    return;\n                }\n\n                if (this.voidElements && !this.voidElements[tag]) {\n                    var nextToken = session.getTokenAt(cursor.row, cursor.column+1);\n                    var line = session.getLine(row);\n                    var nextIndent = this.$getIndent(line);\n                    var indent = nextIndent + session.getTabString();\n\n                    if (nextToken && nextToken.value === \"</\") {\n                        return {\n                            text: \"\\n\" + indent + \"\\n\" + nextIndent,\n                            selection: [1, indent.length, 1, indent.length]\n                        };\n                    } else {\n                        return {\n                            text: \"\\n\" + indent\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n};\n\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\nace.define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n    this.defaultMode = defaultMode;\n    this.subModes = subModes;\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n\n    this.$getMode = function(state) {\n        if (typeof state != \"string\") \n            state = state[0];\n        for (var key in this.subModes) {\n            if (state.indexOf(key) === 0)\n                return this.subModes[key];\n        }\n        return null;\n    };\n    \n    this.$tryMode = function(state, session, foldStyle, row) {\n        var mode = this.$getMode(state);\n        return (mode ? mode.getFoldWidget(session, foldStyle, row) : \"\");\n    };\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        return (\n            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n            this.defaultMode.getFoldWidget(session, foldStyle, row)\n        );\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var mode = this.$getMode(session.getState(row-1));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.$getMode(session.getState(row));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.defaultMode;\n        \n        return mode.getFoldWidgetRange(session, foldStyle, row);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalEndTags) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n    this.optionalEndTags = oop.mixin({}, this.voidElements);\n    if (optionalEndTags)\n        oop.mixin(this.optionalEndTags, optionalEndTags);\n    \n};\noop.inherits(FoldMode, BaseFoldMode);\n\nvar Tag = function() {\n    this.tagName = \"\";\n    this.closing = false;\n    this.selfClosing = false;\n    this.start = {row: 0, column: 0};\n    this.end = {row: 0, column: 0};\n};\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (!tag)\n            return \"\";\n\n        if (tag.closing || (!tag.tagName && tag.selfClosing))\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase()))\n            return \"\";\n\n        if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column))\n            return \"\";\n\n        return \"start\";\n    };\n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var tag = new Tag();\n\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (is(token, \"tag-open\")) {\n                tag.end.column = tag.start.column + token.value.length;\n                tag.closing = is(token, \"end-tag-open\");\n                token = tokens[++i];\n                if (!token)\n                    return null;\n                tag.tagName = token.value;\n                tag.end.column += token.value.length;\n                for (i++; i < tokens.length; i++) {\n                    token = tokens[i];\n                    tag.end.column += token.value.length;\n                    if (is(token, \"tag-close\")) {\n                        tag.selfClosing = token.value == '/>';\n                        break;\n                    }\n                }\n                return tag;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == '/>';\n                return tag;\n            }\n            tag.start.column += token.value.length;\n        }\n\n        return null;\n    };\n\n    this._findEndTagInLine = function(session, row, tagName, startColumn) {\n        var tokens = session.getTokens(row);\n        var column = 0;\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            column += token.value.length;\n            if (column < startColumn)\n                continue;\n            if (is(token, \"end-tag-open\")) {\n                token = tokens[i + 1];\n                if (token && token.value == tagName)\n                    return true;\n            }\n        }\n        return false;\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n                iterator.stepForward();\n                return tag;\n            }\n        } while(token = iterator.stepForward());\n\n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n                iterator.stepBackward();\n                return tag;\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n            }\n        } while(token = iterator.stepBackward());\n\n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.optionalEndTags.hasOwnProperty(top.tagName)) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.start.column);\n            var start = {\n                row: row,\n                column: firstTag.start.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.end.column);\n            var end = {\n                row: row,\n                column: firstTag.start.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar MixedFoldMode = require(\"./mixed\").FoldMode;\nvar XmlFoldMode = require(\"./xml\").FoldMode;\nvar CStyleFoldMode = require(\"./cstyle\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalTags) {\n    MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), {\n        \"js-\": new CStyleFoldMode(),\n        \"css-\": new CStyleFoldMode()\n    });\n};\n\noop.inherits(FoldMode, MixedFoldMode);\n\n});\n\nace.define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\n\nvar commonAttributes = [\n    \"accesskey\",\n    \"class\",\n    \"contenteditable\",\n    \"contextmenu\",\n    \"dir\",\n    \"draggable\",\n    \"dropzone\",\n    \"hidden\",\n    \"id\",\n    \"inert\",\n    \"itemid\",\n    \"itemprop\",\n    \"itemref\",\n    \"itemscope\",\n    \"itemtype\",\n    \"lang\",\n    \"spellcheck\",\n    \"style\",\n    \"tabindex\",\n    \"title\",\n    \"translate\"\n];\n\nvar eventAttributes = [\n    \"onabort\",\n    \"onblur\",\n    \"oncancel\",\n    \"oncanplay\",\n    \"oncanplaythrough\",\n    \"onchange\",\n    \"onclick\",\n    \"onclose\",\n    \"oncontextmenu\",\n    \"oncuechange\",\n    \"ondblclick\",\n    \"ondrag\",\n    \"ondragend\",\n    \"ondragenter\",\n    \"ondragleave\",\n    \"ondragover\",\n    \"ondragstart\",\n    \"ondrop\",\n    \"ondurationchange\",\n    \"onemptied\",\n    \"onended\",\n    \"onerror\",\n    \"onfocus\",\n    \"oninput\",\n    \"oninvalid\",\n    \"onkeydown\",\n    \"onkeypress\",\n    \"onkeyup\",\n    \"onload\",\n    \"onloadeddata\",\n    \"onloadedmetadata\",\n    \"onloadstart\",\n    \"onmousedown\",\n    \"onmousemove\",\n    \"onmouseout\",\n    \"onmouseover\",\n    \"onmouseup\",\n    \"onmousewheel\",\n    \"onpause\",\n    \"onplay\",\n    \"onplaying\",\n    \"onprogress\",\n    \"onratechange\",\n    \"onreset\",\n    \"onscroll\",\n    \"onseeked\",\n    \"onseeking\",\n    \"onselect\",\n    \"onshow\",\n    \"onstalled\",\n    \"onsubmit\",\n    \"onsuspend\",\n    \"ontimeupdate\",\n    \"onvolumechange\",\n    \"onwaiting\"\n];\n\nvar globalAttributes = commonAttributes.concat(eventAttributes);\n\nvar attributeMap = {\n    \"html\": [\"manifest\"],\n    \"head\": [],\n    \"title\": [],\n    \"base\": [\"href\", \"target\"],\n    \"link\": [\"href\", \"hreflang\", \"rel\", \"media\", \"type\", \"sizes\"],\n    \"meta\": [\"http-equiv\", \"name\", \"content\", \"charset\"],\n    \"style\": [\"type\", \"media\", \"scoped\"],\n    \"script\": [\"charset\", \"type\", \"src\", \"defer\", \"async\"],\n    \"noscript\": [\"href\"],\n    \"body\": [\"onafterprint\", \"onbeforeprint\", \"onbeforeunload\", \"onhashchange\", \"onmessage\", \"onoffline\", \"onpopstate\", \"onredo\", \"onresize\", \"onstorage\", \"onundo\", \"onunload\"],\n    \"section\": [],\n    \"nav\": [],\n    \"article\": [\"pubdate\"],\n    \"aside\": [],\n    \"h1\": [],\n    \"h2\": [],\n    \"h3\": [],\n    \"h4\": [],\n    \"h5\": [],\n    \"h6\": [],\n    \"header\": [],\n    \"footer\": [],\n    \"address\": [],\n    \"main\": [],\n    \"p\": [],\n    \"hr\": [],\n    \"pre\": [],\n    \"blockquote\": [\"cite\"],\n    \"ol\": [\"start\", \"reversed\"],\n    \"ul\": [],\n    \"li\": [\"value\"],\n    \"dl\": [],\n    \"dt\": [],\n    \"dd\": [],\n    \"figure\": [],\n    \"figcaption\": [],\n    \"div\": [],\n    \"a\": [\"href\", \"target\", \"ping\", \"rel\", \"media\", \"hreflang\", \"type\"],\n    \"em\": [],\n    \"strong\": [],\n    \"small\": [],\n    \"s\": [],\n    \"cite\": [],\n    \"q\": [\"cite\"],\n    \"dfn\": [],\n    \"abbr\": [],\n    \"data\": [],\n    \"time\": [\"datetime\"],\n    \"code\": [],\n    \"var\": [],\n    \"samp\": [],\n    \"kbd\": [],\n    \"sub\": [],\n    \"sup\": [],\n    \"i\": [],\n    \"b\": [],\n    \"u\": [],\n    \"mark\": [],\n    \"ruby\": [],\n    \"rt\": [],\n    \"rp\": [],\n    \"bdi\": [],\n    \"bdo\": [],\n    \"span\": [],\n    \"br\": [],\n    \"wbr\": [],\n    \"ins\": [\"cite\", \"datetime\"],\n    \"del\": [\"cite\", \"datetime\"],\n    \"img\": [\"alt\", \"src\", \"height\", \"width\", \"usemap\", \"ismap\"],\n    \"iframe\": [\"name\", \"src\", \"height\", \"width\", \"sandbox\", \"seamless\"],\n    \"embed\": [\"src\", \"height\", \"width\", \"type\"],\n    \"object\": [\"param\", \"data\", \"type\", \"height\" , \"width\", \"usemap\", \"name\", \"form\", \"classid\"],\n    \"param\": [\"name\", \"value\"],\n    \"video\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\", \"width\", \"height\", \"poster\"],\n    \"audio\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\"],\n    \"source\": [\"src\", \"type\", \"media\"],\n    \"track\": [\"kind\", \"src\", \"srclang\", \"label\", \"default\"],\n    \"canvas\": [\"width\", \"height\"],\n    \"map\": [\"name\"],\n    \"area\": [\"shape\", \"coords\", \"href\", \"hreflang\", \"alt\", \"target\", \"media\", \"rel\", \"ping\", \"type\"],\n    \"svg\": [],\n    \"math\": [],\n    \"table\": [\"summary\"],\n    \"caption\": [],\n    \"colgroup\": [\"span\"],\n    \"col\": [\"span\"],\n    \"tbody\": [],\n    \"thead\": [],\n    \"tfoot\": [],\n    \"tr\": [],\n    \"td\": [\"headers\", \"rowspan\", \"colspan\"],\n    \"th\": [\"headers\", \"rowspan\", \"colspan\", \"scope\"],\n    \"form\": [\"accept-charset\", \"action\", \"autocomplete\", \"enctype\", \"method\", \"name\", \"novalidate\", \"target\"],\n    \"fieldset\": [\"disabled\", \"form\", \"name\"],\n    \"legend\": [],\n    \"label\": [\"form\", \"for\"],\n    \"input\": [\"type\", \"accept\", \"alt\", \"autocomplete\", \"checked\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"height\", \"list\", \"max\", \"maxlength\", \"min\", \"multiple\", \"pattern\", \"placeholder\", \"readonly\", \"required\", \"size\", \"src\", \"step\", \"width\", \"files\", \"value\"],\n    \"button\": [\"autofocus\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"name\", \"value\", \"type\"],\n    \"select\": [\"autofocus\", \"disabled\", \"form\", \"multiple\", \"name\", \"size\"],\n    \"datalist\": [],\n    \"optgroup\": [\"disabled\", \"label\"],\n    \"option\": [\"disabled\", \"selected\", \"label\", \"value\"],\n    \"textarea\": [\"autofocus\", \"disabled\", \"form\", \"maxlength\", \"name\", \"placeholder\", \"readonly\", \"required\", \"rows\", \"cols\", \"wrap\"],\n    \"keygen\": [\"autofocus\", \"challenge\", \"disabled\", \"form\", \"keytype\", \"name\"],\n    \"output\": [\"for\", \"form\", \"name\"],\n    \"progress\": [\"value\", \"max\"],\n    \"meter\": [\"value\", \"min\", \"max\", \"low\", \"high\", \"optimum\"],\n    \"details\": [\"open\"],\n    \"summary\": [],\n    \"command\": [\"type\", \"label\", \"icon\", \"disabled\", \"checked\", \"radiogroup\", \"command\"],\n    \"menu\": [\"type\", \"label\"],\n    \"dialog\": [\"open\"]\n};\n\nvar elements = Object.keys(attributeMap);\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nfunction findTagName(session, pos) {\n    var iterator = new TokenIterator(session, pos.row, pos.column);\n    var token = iterator.getCurrentToken();\n    while (token && !is(token, \"tag-name\")){\n        token = iterator.stepBackward();\n    }\n    if (token)\n        return token.value;\n}\n\nvar HtmlCompletions = function() {\n\n};\n\n(function() {\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        var token = session.getTokenAt(pos.row, pos.column);\n\n        if (!token)\n            return [];\n        if (is(token, \"tag-name\") || is(token, \"tag-open\") || is(token, \"end-tag-open\"))\n            return this.getTagCompletions(state, session, pos, prefix);\n        if (is(token, \"tag-whitespace\") || is(token, \"attribute-name\"))\n            return this.getAttributeCompetions(state, session, pos, prefix);\n\n        return [];\n    };\n\n    this.getTagCompletions = function(state, session, pos, prefix) {\n        return elements.map(function(element){\n            return {\n                value: element,\n                meta: \"tag\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n    this.getAttributeCompetions = function(state, session, pos, prefix) {\n        var tagName = findTagName(session, pos);\n        if (!tagName)\n            return [];\n        var attributes = globalAttributes;\n        if (tagName in attributeMap) {\n            attributes = attributes.concat(attributeMap[tagName]);\n        }\n        return attributes.map(function(attribute){\n            return {\n                caption: attribute,\n                snippet: attribute + '=\"$0\"',\n                meta: \"attribute\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n}).call(HtmlCompletions.prototype);\n\nexports.HtmlCompletions = HtmlCompletions;\n});\n\nace.define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar HtmlFoldMode = require(\"./folding/html\").FoldMode;\nvar HtmlCompletions = require(\"./html_completions\").HtmlCompletions;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar voidElements = [\"area\", \"base\", \"br\", \"col\", \"embed\", \"hr\", \"img\", \"input\", \"keygen\", \"link\", \"meta\", \"menuitem\", \"param\", \"source\", \"track\", \"wbr\"];\nvar optionalEndTags = [\"li\", \"dt\", \"dd\", \"p\", \"rt\", \"rp\", \"optgroup\", \"option\", \"colgroup\", \"td\", \"th\"];\n\nvar Mode = function(options) {\n    this.fragmentContext = options && options.fragmentContext;\n    this.HighlightRules = HtmlHighlightRules;\n    this.$behaviour = new XmlBehaviour();\n    this.$completer = new HtmlCompletions();\n    \n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"css-\": CssMode\n    });\n    \n    this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags));\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n    this.voidElements = lang.arrayToMap(voidElements);\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        return this.$completer.getCompletions(state, session, pos, prefix);\n    };\n\n    this.createWorker = function(session) {\n        if (this.constructor != Mode)\n            return;\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/html_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        if (this.fragmentContext)\n            worker.call(\"setOptions\", [{context: this.fragmentContext}]);\n\n        worker.on(\"error\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/html\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/twig_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/html_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar TwigHighlightRules = function() {\n    HtmlHighlightRules.call(this);\n\n    var tags = \"autoescape|block|do|embed|extends|filter|flush|for|from|if|import|include|macro|sandbox|set|spaceless|use|verbatim\";\n    tags = tags + \"|end\" + tags.replace(/\\|/g, \"|end\");\n    var filters = \"abs|batch|capitalize|convert_encoding|date|date_modify|default|e|escape|first|format|join|json_encode|keys|last|length|lower|merge|nl2br|number_format|raw|replace|reverse|slice|sort|split|striptags|title|trim|upper|url_encode\";\n    var functions = \"attribute|constant|cycle|date|dump|parent|random|range|template_from_string\";\n    var tests = \"constant|divisibleby|sameas|defined|empty|even|iterable|odd\";\n    var constants = \"null|none|true|false\";\n    var operators = \"b-and|b-xor|b-or|in|is|and|or|not\"\n\n    var keywordMapper = this.createKeywordMapper({\n        \"keyword.control.twig\": tags,\n        \"support.function.twig\": [filters, functions, tests].join(\"|\"),\n        \"keyword.operator.twig\":  operators,\n        \"constant.language.twig\": constants\n    }, \"identifier\");\n    for (var rule in this.$rules) {\n        this.$rules[rule].unshift({\n            token : \"variable.other.readwrite.local.twig\",\n            regex : \"\\\\{\\\\{-?\",\n            push : \"twig-start\"\n        }, {\n            token : \"meta.tag.twig\",\n            regex : \"\\\\{%-?\",\n            push : \"twig-start\"\n        }, {\n            token : \"comment.block.twig\",\n            regex : \"\\\\{#-?\",\n            push : \"twig-comment\"\n        });\n    }\n    this.$rules[\"twig-comment\"] = [{\n        token : \"comment.block.twig\",\n        regex : \".*-?#\\\\}\",\n        next : \"pop\"\n    }];\n\n    this.$rules[\"twig-start\"] = [{\n        token : \"variable.other.readwrite.local.twig\",\n        regex : \"-?\\\\}\\\\}\",\n        next : \"pop\"\n    }, {\n        token : \"meta.tag.twig\",\n        regex : \"-?%\\\\}\",\n        next : \"pop\"\n    }, {\n        token : \"string\",\n        regex : \"'\",\n        next  : \"twig-qstring\"\n    }, {\n        token : \"string\",\n        regex : '\"',\n        next  : \"twig-qqstring\"\n    }, {\n        token : \"constant.numeric\", // hex\n        regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n    }, {\n        token : \"constant.numeric\", // float\n        regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n    }, {\n        token : \"constant.language.boolean\",\n        regex : \"(?:true|false)\\\\b\"\n    }, {\n        token : keywordMapper,\n        regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n    }, {\n        token : \"keyword.operator.assignment\",\n        regex : \"=|~\"\n    }, {\n        token : \"keyword.operator.comparison\",\n        regex : \"==|!=|<|>|>=|<=|===\"\n    }, {\n        token : \"keyword.operator.arithmetic\",\n        regex : \"\\\\+|-|/|%|//|\\\\*|\\\\*\\\\*\"\n    }, {\n        token : \"keyword.operator.other\",\n        regex : \"\\\\.\\\\.|\\\\|\"\n    }, {\n        token : \"punctuation.operator\",\n        regex : /\\?|\\:|\\,|\\;|\\./\n    }, {\n        token : \"paren.lparen\",\n        regex : /[\\[\\({]/\n    }, {\n        token : \"paren.rparen\",\n        regex : /[\\])}]/\n    }, {\n        token : \"text\",\n        regex : \"\\\\s+\"\n    } ];\n\n    this.$rules[\"twig-qqstring\"] = [{\n            token : \"constant.language.escape\",\n            regex : /\\\\[\\\\\"$#ntr]|#{[^\"}]*}/\n        }, {\n            token : \"string\",\n            regex : '\"',\n            next  : \"twig-start\"\n        }, {\n            defaultToken : \"string\"\n        }\n    ];\n\n    this.$rules[\"twig-qstring\"] = [{\n            token : \"constant.language.escape\",\n            regex : /\\\\[\\\\'ntr]}/\n        }, {\n            token : \"string\",\n            regex : \"'\",\n            next  : \"twig-start\"\n        }, {\n            defaultToken : \"string\"\n        }\n    ];\n\n    this.normalizeRules();\n};\n\noop.inherits(TwigHighlightRules, TextHighlightRules);\n\nexports.TwigHighlightRules = TwigHighlightRules;\n});\n\nace.define(\"ace/mode/twig\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html\",\"ace/mode/twig_highlight_rules\",\"ace/mode/matching_brace_outdent\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar HtmlMode = require(\"./html\").Mode;\nvar TwigHighlightRules = require(\"./twig_highlight_rules\").TwigHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\n\nvar Mode = function() {\n    HtmlMode.call(this);\n    this.HighlightRules = TwigHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n};\noop.inherits(Mode, HtmlMode);\n\n(function() {\n    this.blockComment = {start: \"{#\", end: \"#}\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n    this.$id = \"ace/mode/twig\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-typescript.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/typescript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/javascript_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\n\nvar TypeScriptHighlightRules = function() {\n\n    var tsRules =  [\n        {\n            token: [\"keyword.operator.ts\", \"text\", \"variable.parameter.function.ts\", \"text\"],\n            regex: \"\\\\b(module)(\\\\s*)([a-zA-Z0-9_?.$][\\\\w?.$]*)(\\\\s*\\\\{)\"\n        }, \n        {\n            token: [\"storage.type.variable.ts\", \"text\", \"keyword.other.ts\", \"text\"],\n            regex: \"(super)(\\\\s*\\\\()([a-zA-Z0-9,_?.$\\\\s]+\\\\s*)(\\\\))\"\n        },\n        {\n            token: [\"entity.name.function.ts\",\"paren.lparen\", \"paren.rparen\"],\n            regex: \"([a-zA-Z_?.$][\\\\w?.$]*)(\\\\()(\\\\))\"\n        },\n        {\n            token: [\"variable.parameter.function.ts\", \"text\", \"variable.parameter.function.ts\"],\n            regex: \"([a-zA-Z0-9_?.$][\\\\w?.$]*)(\\\\s*:\\\\s*)([a-zA-Z0-9_?.$][\\\\w?.$]*)\"\n        },  \n        {\n            token: [\"keyword.operator.ts\"],\n            regex: \"(?:\\\\b(constructor|declare|interface|as|AS|public|private|class|extends|export|super)\\\\b)\"\n        }, \n        {\n            token: [\"storage.type.variable.ts\"],\n            regex: \"(?:\\\\b(this\\\\.|string\\\\b|bool\\\\b|number)\\\\b)\"\n        }, \n        {\n            token: [\"keyword.operator.ts\", \"storage.type.variable.ts\", \"keyword.operator.ts\", \"storage.type.variable.ts\"],\n            regex: \"(class)(\\\\s+[a-zA-Z0-9_?.$][\\\\w?.$]*\\\\s+)(extends)(\\\\s+[a-zA-Z0-9_?.$][\\\\w?.$]*\\\\s+)?\"\n        },\n        {\n            token: \"keyword\",\n            regex: \"(?:super|export|class|extends|import)\\\\b\"\n        }\n    ];\n\n    var JSRules = new JavaScriptHighlightRules().getRules();\n    \n    JSRules.start = tsRules.concat(JSRules.start);\n    this.$rules = JSRules;\n};\n\noop.inherits(TypeScriptHighlightRules, JavaScriptHighlightRules);\n\nexports.TypeScriptHighlightRules = TypeScriptHighlightRules;\n});\n\nace.define(\"ace/mode/typescript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/javascript\",\"ace/mode/typescript_highlight_rules\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\",\"ace/mode/matching_brace_outdent\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar jsMode = require(\"./javascript\").Mode;\nvar TypeScriptHighlightRules = require(\"./typescript_highlight_rules\").TypeScriptHighlightRules;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\n\nvar Mode = function() {\n    this.HighlightRules = TypeScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, jsMode);\n\n(function() {\n    this.createWorker = function(session) {\n        return null;\n    };\n    this.$id = \"ace/mode/typescript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-vala.js",
    "content": "ace.define(\"ace/mode/vala_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar ValaHighlightRules = function() {\n\n    this.$rules = { start: \n       [ { token: \n            [ 'meta.using.vala',\n              'keyword.other.using.vala',\n              'meta.using.vala',\n              'storage.modifier.using.vala',\n              'meta.using.vala',\n              'punctuation.terminator.vala' ],\n           regex: '^(\\\\s*)(using)\\\\b(?:(\\\\s*)([^ ;$]+)(\\\\s*)((?:;)?))?' },\n         { include: '#code' } ],\n      '#all-types': \n       [ { include: '#primitive-arrays' },\n         { include: '#primitive-types' },\n         { include: '#object-types' } ],\n      '#annotations': \n       [ { token: \n            [ 'storage.type.annotation.vala',\n              'punctuation.definition.annotation-arguments.begin.vala' ],\n           regex: '(@[^ (]+)(\\\\()',\n           push: \n            [ { token: 'punctuation.definition.annotation-arguments.end.vala',\n                regex: '\\\\)',\n                next: 'pop' },\n              { token: \n                 [ 'constant.other.key.vala',\n                   'text',\n                   'keyword.operator.assignment.vala' ],\n                regex: '(\\\\w*)(\\\\s*)(=)' },\n              { include: '#code' },\n              { token: 'punctuation.seperator.property.vala', regex: ',' },\n              { defaultToken: 'meta.declaration.annotation.vala' } ] },\n         { token: 'storage.type.annotation.vala', regex: '@\\\\w*' } ],\n      '#anonymous-classes-and-new': \n       [ { token: 'keyword.control.new.vala',\n           regex: '\\\\bnew\\\\b',\n           push_disabled: \n            [ { token: 'text',\n                regex: '(?<=\\\\)|\\\\])(?!\\\\s*{)|(?<=})|(?=;)',\n                TODO: 'FIXME: regexp doesn\\'t have js equivalent',\n                originalRegex: '(?<=\\\\)|\\\\])(?!\\\\s*{)|(?<=})|(?=;)',\n                next: 'pop' },\n              { token: [ 'storage.type.vala', 'text' ],\n                regex: '(\\\\w+)(\\\\s*)(?=\\\\[)',\n                push: \n                 [ { token: 'text', regex: '}|(?=;|\\\\))', next: 'pop' },\n                   { token: 'text',\n                     regex: '\\\\[',\n                     push: \n                      [ { token: 'text', regex: '\\\\]', next: 'pop' },\n                        { include: '#code' } ] },\n                   { token: 'text',\n                     regex: '{',\n                     push: \n                      [ { token: 'text', regex: '(?=})', next: 'pop' },\n                        { include: '#code' } ] } ] },\n              { token: 'text',\n                regex: '(?=\\\\w.*\\\\()',\n                push: \n                 [ { token: 'text',\n                     regex: '(?<=\\\\))',\n                     TODO: 'FIXME: regexp doesn\\'t have js equivalent',\n                     originalRegex: '(?<=\\\\))',\n                     next: 'pop' },\n                   { include: '#object-types' },\n                   { token: 'text',\n                     regex: '\\\\(',\n                     push: \n                      [ { token: 'text', regex: '\\\\)', next: 'pop' },\n                        { include: '#code' } ] } ] },\n              { token: 'meta.inner-class.vala',\n                regex: '{',\n                push: \n                 [ { token: 'meta.inner-class.vala', regex: '}', next: 'pop' },\n                   { include: '#class-body' },\n                   { defaultToken: 'meta.inner-class.vala' } ] } ] } ],\n      '#assertions': \n       [ { token: \n            [ 'keyword.control.assert.vala',\n              'meta.declaration.assertion.vala' ],\n           regex: '\\\\b(assert|requires|ensures)(\\\\s)',\n           push: \n            [ { token: 'meta.declaration.assertion.vala',\n                regex: '$',\n                next: 'pop' },\n              { token: 'keyword.operator.assert.expression-seperator.vala',\n                regex: ':' },\n              { include: '#code' },\n              { defaultToken: 'meta.declaration.assertion.vala' } ] } ],\n      '#class': \n       [ { token: 'meta.class.vala',\n           regex: '(?=\\\\w?[\\\\w\\\\s]*(?:class|(?:@)?interface|enum|struct|namespace)\\\\s+\\\\w+)',\n           push: \n            [ { token: 'paren.vala',\n                regex: '}',\n                next: 'pop' },\n              { include: '#storage-modifiers' },\n              { include: '#comments' },\n              { token: \n                 [ 'storage.modifier.vala',\n                   'meta.class.identifier.vala',\n                   'entity.name.type.class.vala' ],\n                regex: '(class|(?:@)?interface|enum|struct|namespace)(\\\\s+)([\\\\w\\\\.]+)' },\n              { token: 'storage.modifier.extends.vala',\n                regex: ':',\n                push: \n                 [ { token: 'meta.definition.class.inherited.classes.vala',\n                     regex: '(?={|,)',\n                     next: 'pop' },\n                   { include: '#object-types-inherited' },\n                   { include: '#comments' },\n                   { defaultToken: 'meta.definition.class.inherited.classes.vala' } ] },\n              { token: \n                 [ 'storage.modifier.implements.vala',\n                   'meta.definition.class.implemented.interfaces.vala' ],\n                regex: '(,)(\\\\s)',\n                push: \n                 [ { token: 'meta.definition.class.implemented.interfaces.vala',\n                     regex: '(?=\\\\{)',\n                     next: 'pop' },\n                   { include: '#object-types-inherited' },\n                   { include: '#comments' },\n                   { defaultToken: 'meta.definition.class.implemented.interfaces.vala' } ] },\n              { token: 'paren.vala',\n                regex: '{',\n                push: \n                 [ { token: 'paren.vala', regex: '(?=})', next: 'pop' },\n                   { include: '#class-body' },\n                   { defaultToken: 'meta.class.body.vala' } ] },\n              { defaultToken: 'meta.class.vala' } ],\n           comment: 'attempting to put namespace in here.' } ],\n      '#class-body': \n       [ { include: '#comments' },\n         { include: '#class' },\n         { include: '#enums' },\n         { include: '#methods' },\n         { include: '#annotations' },\n         { include: '#storage-modifiers' },\n         { include: '#code' } ],\n      '#code': \n       [ { include: '#comments' },\n         { include: '#class' },\n         { token: 'text',\n           regex: '{',\n           push: \n            [ { token: 'text', regex: '}', next: 'pop' },\n              { include: '#code' } ] },\n         { include: '#assertions' },\n         { include: '#parens' },\n         { include: '#constants-and-special-vars' },\n         { include: '#anonymous-classes-and-new' },\n         { include: '#keywords' },\n         { include: '#storage-modifiers' },\n         { include: '#strings' },\n         { include: '#all-types' } ],\n      '#comments': \n       [ { token: 'punctuation.definition.comment.vala',\n           regex: '/\\\\*\\\\*/' },\n         { include: 'text.html.javadoc' },\n         { include: '#comments-inline' } ],\n      '#comments-inline': \n       [ { token: 'punctuation.definition.comment.vala',\n           regex: '/\\\\*',\n           push: \n            [ { token: 'punctuation.definition.comment.vala',\n                regex: '\\\\*/',\n                next: 'pop' },\n              { defaultToken: 'comment.block.vala' } ] },\n         { token: \n            [ 'text',\n              'punctuation.definition.comment.vala',\n              'comment.line.double-slash.vala' ],\n           regex: '(\\\\s*)(//)(.*$)' } ],\n      '#constants-and-special-vars': \n       [ { token: 'constant.language.vala',\n           regex: '\\\\b(?:true|false|null)\\\\b' },\n         { token: 'variable.language.vala',\n           regex: '\\\\b(?:this|base)\\\\b' },\n         { token: 'constant.numeric.vala',\n           regex: '\\\\b(?:0(?:x|X)[0-9a-fA-F]*|(?:[0-9]+\\\\.?[0-9]*|\\\\.[0-9]+)(?:(?:e|E)(?:\\\\+|-)?[0-9]+)?)(?:[LlFfUuDd]|UL|ul)?\\\\b' },\n         { token: [ 'keyword.operator.dereference.vala', 'constant.other.vala' ],\n           regex: '((?:\\\\.)?)\\\\b([A-Z][A-Z0-9_]+)(?!<|\\\\.class|\\\\s*\\\\w+\\\\s*=)\\\\b' } ],\n      '#enums': \n       [ { token: 'text',\n           regex: '^(?=\\\\s*[A-Z0-9_]+\\\\s*(?:{|\\\\(|,))',\n           push: \n            [ { token: 'text', regex: '(?=;|})', next: 'pop' },\n              { token: 'constant.other.enum.vala',\n                regex: '\\\\w+',\n                push: \n                 [ { token: 'meta.enum.vala', regex: '(?=,|;|})', next: 'pop' },\n                   { include: '#parens' },\n                   { token: 'text',\n                     regex: '{',\n                     push: \n                      [ { token: 'text', regex: '}', next: 'pop' },\n                        { include: '#class-body' } ] },\n                   { defaultToken: 'meta.enum.vala' } ] } ] } ],\n      '#keywords': \n       [ { token: 'keyword.control.catch-exception.vala',\n           regex: '\\\\b(?:try|catch|finally|throw)\\\\b' },\n         { token: 'keyword.control.vala', regex: '\\\\?|:|\\\\?\\\\?' },\n         { token: 'keyword.control.vala',\n           regex: '\\\\b(?:return|break|case|continue|default|do|while|for|foreach|switch|if|else|in|yield|get|set|value)\\\\b' },\n         { token: 'keyword.operator.vala',\n           regex: '\\\\b(?:typeof|is|as)\\\\b' },\n         { token: 'keyword.operator.comparison.vala',\n           regex: '==|!=|<=|>=|<>|<|>' },\n         { token: 'keyword.operator.assignment.vala', regex: '=' },\n         { token: 'keyword.operator.increment-decrement.vala',\n           regex: '\\\\-\\\\-|\\\\+\\\\+' },\n         { token: 'keyword.operator.arithmetic.vala',\n           regex: '\\\\-|\\\\+|\\\\*|\\\\/|%' },\n         { token: 'keyword.operator.logical.vala', regex: '!|&&|\\\\|\\\\|' },\n         { token: 'keyword.operator.dereference.vala',\n           regex: '\\\\.(?=\\\\S)',\n           originalRegex: '(?<=\\\\S)\\\\.(?=\\\\S)' },\n         { token: 'punctuation.terminator.vala', regex: ';' },\n         { token: 'keyword.operator.ownership', regex: 'owned|unowned' } ],\n      '#methods': \n       [ { token: 'meta.method.vala',\n           regex: '(?!new)(?=\\\\w.*\\\\s+)(?=[^=]+\\\\()',\n           push: \n            [ { token: 'paren.vala', regex: '}|(?=;)', next: 'pop' },\n              { include: '#storage-modifiers' },\n              { token: [ 'entity.name.function.vala', 'meta.method.identifier.vala' ],\n                regex: '([\\\\~\\\\w\\\\.]+)(\\\\s*\\\\()',\n                push: \n                 [ { token: 'meta.method.identifier.vala',\n                     regex: '\\\\)',\n                     next: 'pop' },\n                   { include: '#parameters' },\n                   { defaultToken: 'meta.method.identifier.vala' } ] },\n              { token: 'meta.method.return-type.vala',\n                regex: '(?=\\\\w.*\\\\s+\\\\w+\\\\s*\\\\()',\n                push: \n                 [ { token: 'meta.method.return-type.vala',\n                     regex: '(?=\\\\w+\\\\s*\\\\()',\n                     next: 'pop' },\n                   { include: '#all-types' },\n                   { defaultToken: 'meta.method.return-type.vala' } ] },\n              { include: '#throws' },\n              { token: 'paren.vala',\n                regex: '{',\n                push: \n                 [ { token: 'paren.vala', regex: '(?=})', next: 'pop' },\n                   { include: '#code' },\n                   { defaultToken: 'meta.method.body.vala' } ] },\n              { defaultToken: 'meta.method.vala' } ] } ],\n      '#namespace': \n       [ { token: 'text',\n           regex: '^(?=\\\\s*[A-Z0-9_]+\\\\s*(?:{|\\\\(|,))',\n           push: \n            [ { token: 'text', regex: '(?=;|})', next: 'pop' },\n              { token: 'constant.other.namespace.vala',\n                regex: '\\\\w+',\n                push: \n                 [ { token: 'meta.namespace.vala', regex: '(?=,|;|})', next: 'pop' },\n                   { include: '#parens' },\n                   { token: 'text',\n                     regex: '{',\n                     push: \n                      [ { token: 'text', regex: '}', next: 'pop' },\n                        { include: '#code' } ] },\n                   { defaultToken: 'meta.namespace.vala' } ] } ],\n           comment: 'This is not quite right. See the class grammar right now' } ],\n      '#object-types': \n       [ { token: 'storage.type.generic.vala',\n           regex: '\\\\b(?:[a-z]\\\\w*\\\\.)*[A-Z]+\\\\w*<',\n           push: \n            [ { token: 'storage.type.generic.vala',\n                regex: '>|[^\\\\w\\\\s,\\\\?<\\\\[()\\\\]]',\n                TODO: 'FIXME: regexp doesn\\'t have js equivalent',\n                originalRegex: '>|[^\\\\w\\\\s,\\\\?<\\\\[(?:[,]+)\\\\]]',\n                next: 'pop' },\n              { include: '#object-types' },\n              { token: 'storage.type.generic.vala',\n                regex: '<',\n                push: \n                 [ { token: 'storage.type.generic.vala',\n                     regex: '>|[^\\\\w\\\\s,\\\\[\\\\]<]',\n                     next: 'pop' },\n                   { defaultToken: 'storage.type.generic.vala' } ],\n                comment: 'This is just to support <>\\'s with no actual type prefix' },\n              { defaultToken: 'storage.type.generic.vala' } ] },\n         { token: 'storage.type.object.array.vala',\n           regex: '\\\\b(?:[a-z]\\\\w*\\\\.)*[A-Z]+\\\\w*(?=\\\\[)',\n           push: \n            [ { token: 'storage.type.object.array.vala',\n                regex: '(?=[^\\\\]\\\\s])',\n                next: 'pop' },\n              { token: 'text',\n                regex: '\\\\[',\n                push: \n                 [ { token: 'text', regex: '\\\\]', next: 'pop' },\n                   { include: '#code' } ] },\n              { defaultToken: 'storage.type.object.array.vala' } ] },\n         { token: \n            [ 'storage.type.vala',\n              'keyword.operator.dereference.vala',\n              'storage.type.vala' ],\n           regex: '\\\\b(?:([a-z]\\\\w*)(\\\\.))*([A-Z]+\\\\w*\\\\b)' } ],\n      '#object-types-inherited': \n       [ { token: 'entity.other.inherited-class.vala',\n           regex: '\\\\b(?:[a-z]\\\\w*\\\\.)*[A-Z]+\\\\w*<',\n           push: \n            [ { token: 'entity.other.inherited-class.vala',\n                regex: '>|[^\\\\w\\\\s,<]',\n                next: 'pop' },\n              { include: '#object-types' },\n              { token: 'storage.type.generic.vala',\n                regex: '<',\n                push: \n                 [ { token: 'storage.type.generic.vala',\n                     regex: '>|[^\\\\w\\\\s,<]',\n                     next: 'pop' },\n                   { defaultToken: 'storage.type.generic.vala' } ],\n                comment: 'This is just to support <>\\'s with no actual type prefix' },\n              { defaultToken: 'entity.other.inherited-class.vala' } ] },\n         { token: \n            [ 'entity.other.inherited-class.vala',\n              'keyword.operator.dereference.vala',\n              'entity.other.inherited-class.vala' ],\n           regex: '\\\\b(?:([a-z]\\\\w*)(\\\\.))*([A-Z]+\\\\w*)' } ],\n      '#parameters': \n       [ { token: 'storage.modifier.vala', regex: 'final' },\n         { include: '#primitive-arrays' },\n         { include: '#primitive-types' },\n         { include: '#object-types' },\n         { token: 'variable.parameter.vala', regex: '\\\\w+' } ],\n      '#parens': \n       [ { token: 'text',\n           regex: '\\\\(',\n           push: \n            [ { token: 'text', regex: '\\\\)', next: 'pop' },\n              { include: '#code' } ] } ],\n      '#primitive-arrays': \n       [ { token: 'storage.type.primitive.array.vala',\n           regex: '\\\\b(?:bool|byte|sbyte|char|decimal|double|float|int|uint|long|ulong|object|short|ushort|string|void|int8|int16|int32|int64|uint8|uint16|uint32|uint64)(?:\\\\[\\\\])*\\\\b' } ],\n      '#primitive-types': \n       [ { token: 'storage.type.primitive.vala',\n           regex: '\\\\b(?:var|bool|byte|sbyte|char|decimal|double|float|int|uint|long|ulong|object|short|ushort|string|void|signal|int8|int16|int32|int64|uint8|uint16|uint32|uint64)\\\\b',\n           comment: 'var is not really a primitive, but acts like one in most cases' } ],\n      '#storage-modifiers': \n       [ { token: 'storage.modifier.vala',\n           regex: '\\\\b(?:public|private|protected|internal|static|final|sealed|virtual|override|abstract|readonly|volatile|dynamic|async|unsafe|out|ref|weak|owned|unowned|const)\\\\b',\n           comment: 'Not sure about unsafe and readonly' } ],\n      '#strings': \n       [ { token: 'punctuation.definition.string.begin.vala',\n           regex: '@\"',\n           push: \n            [ { token: 'punctuation.definition.string.end.vala',\n                regex: '\"',\n                next: 'pop' },\n              { token: 'constant.character.escape.vala',\n                regex: '\\\\\\\\.|%[\\\\w\\\\.\\\\-]+|\\\\$(?:\\\\w+|\\\\([\\\\w\\\\s\\\\+\\\\-\\\\*\\\\/]+\\\\))' },\n              { defaultToken: 'string.quoted.interpolated.vala' } ] },\n         { token: 'punctuation.definition.string.begin.vala',\n           regex: '\"',\n           push: \n            [ { token: 'punctuation.definition.string.end.vala',\n                regex: '\"',\n                next: 'pop' },\n              { token: 'constant.character.escape.vala', regex: '\\\\\\\\.' },\n              { token: 'constant.character.escape.vala',\n                regex: '%[\\\\w\\\\.\\\\-]+' },\n              { defaultToken: 'string.quoted.double.vala' } ] },\n         { token: 'punctuation.definition.string.begin.vala',\n           regex: '\\'',\n           push: \n            [ { token: 'punctuation.definition.string.end.vala',\n                regex: '\\'',\n                next: 'pop' },\n              { token: 'constant.character.escape.vala', regex: '\\\\\\\\.' },\n              { defaultToken: 'string.quoted.single.vala' } ] },\n         { token: 'punctuation.definition.string.begin.vala',\n           regex: '\"\"\"',\n           push: \n            [ { token: 'punctuation.definition.string.end.vala',\n                regex: '\"\"\"',\n                next: 'pop' },\n              { token: 'constant.character.escape.vala',\n                regex: '%[\\\\w\\\\.\\\\-]+' },\n              { defaultToken: 'string.quoted.triple.vala' } ] } ],\n      '#throws': \n       [ { token: 'storage.modifier.vala',\n           regex: 'throws',\n           push: \n            [ { token: 'meta.throwables.vala', regex: '(?={|;)', next: 'pop' },\n              { include: '#object-types' },\n              { defaultToken: 'meta.throwables.vala' } ] } ],\n      '#values': \n       [ { include: '#strings' },\n         { include: '#object-types' },\n         { include: '#constants-and-special-vars' } ] }\n    \n    this.normalizeRules();\n};\n\nValaHighlightRules.metaData = { \n    comment: 'Based heavily on the Java bundle\\'s language syntax. TODO:\\n* Closures\\n* Delegates\\n* Properties: Better support for properties.\\n* Annotations\\n* Error domains\\n* Named arguments\\n* Array slicing, negative indexes, multidimensional\\n* construct blocks\\n* lock blocks?\\n* regex literals\\n* DocBlock syntax highlighting. (Currently importing javadoc)\\n* Folding rule for comments.\\n',\n      fileTypes: [ 'vala' ],\n      foldingStartMarker: '(\\\\{\\\\s*(//.*)?$|^\\\\s*// \\\\{\\\\{\\\\{)',\n      foldingStopMarker: '^\\\\s*(\\\\}|// \\\\}\\\\}\\\\}$)',\n      name: 'Vala',\n      scopeName: 'source.vala' }\n\n\noop.inherits(ValaHighlightRules, TextHighlightRules);\n\nexports.ValaHighlightRules = ValaHighlightRules;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/vala\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/tokenizer\",\"ace/mode/vala_highlight_rules\",\"ace/mode/folding/cstyle\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\",\"ace/mode/matching_brace_outdent\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar Tokenizer = require(\"../tokenizer\").Tokenizer;\nvar ValaHighlightRules = require(\"./vala_highlight_rules\").ValaHighlightRules;\nvar FoldMode = require(\"./folding/cstyle\").FoldMode;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\n\nvar Mode = function() {\n    this.HighlightRules = ValaHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n    this.$id = \"ace/mode/vala\"\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-vbscript.js",
    "content": "ace.define(\"ace/mode/vbscript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar VBScriptHighlightRules = function() {\n\n    this.$rules = {\n    \"start\": [\n        {\n            token: [\n                \"meta.ending-space\"\n            ],\n            regex: \"$\"\n        },\n        {\n            token: [\n                null\n            ],\n            regex: \"^(?=\\\\t)\",\n            next: \"state_3\"\n        },\n        {\n            token: [null],\n            regex: \"^(?= )\",\n            next: \"state_4\"\n        },\n        {\n            token: [\n                \"text\",\n                \"storage.type.function.asp\",\n                \"text\",\n                \"entity.name.function.asp\",\n                \"text\",\n                \"punctuation.definition.parameters.asp\",\n                \"variable.parameter.function.asp\",\n                \"punctuation.definition.parameters.asp\"\n            ],\n            regex: \"^(\\\\s*)(Function|Sub)(\\\\s*)([a-zA-Z_]\\\\w*)(\\\\s*)(\\\\()([^)]*)(\\\\))\"\n        },\n        {\n            token: \"punctuation.definition.comment.asp\",\n            regex: \"'|REM\",\n            next: \"comment\"\n        },\n        {\n            token: [\n                \"keyword.control.asp\"\n            ],\n            regex: \"\\\\b(?:If|Then|Else|ElseIf|Else If|End If|While|Wend|For|To|Each|Case|Select|End Select|Return|Continue|Do|Until|Loop|Next|With|Exit Do|Exit For|Exit Function|Exit Property|Exit Sub|IIf)\\\\b\"\n        },\n        {\n            token: \"keyword.operator.asp\",\n            regex: \"\\\\b(?:Mod|And|Not|Or|Xor|as)\\\\b\"\n        },\n        {\n            token: \"storage.type.asp\",\n            regex: \"Dim|Call|Class|Const|Dim|Redim|Function|Sub|Private Sub|Public Sub|End sub|End Function|Set|Let|Get|New|Randomize|Option Explicit|On Error Resume Next|On Error GoTo\"\n        },\n        {\n            token: \"storage.modifier.asp\",\n            regex: \"\\\\b(?:Private|Public|Default)\\\\b\"\n        },\n        {\n            token: \"constant.language.asp\",\n            regex: \"\\\\b(?:Empty|False|Nothing|Null|True)\\\\b\"\n        },\n        {\n            token: \"punctuation.definition.string.begin.asp\",\n            regex: '\"',\n            next: \"string\"\n        },\n        {\n            token: [\n                \"punctuation.definition.variable.asp\"\n            ],\n            regex: \"(\\\\$)[a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*?\\\\b\\\\s*\"\n        },\n        {\n            token: \"support.class.asp\",\n            regex: \"\\\\b(?:Application|ObjectContext|Request|Response|Server|Session)\\\\b\"\n        },\n        {\n            token: \"support.class.collection.asp\",\n            regex: \"\\\\b(?:Contents|StaticObjects|ClientCertificate|Cookies|Form|QueryString|ServerVariables)\\\\b\"\n        },\n        {\n            token: \"support.constant.asp\",\n            regex: \"\\\\b(?:TotalBytes|Buffer|CacheControl|Charset|ContentType|Expires|ExpiresAbsolute|IsClientConnected|PICS|Status|ScriptTimeout|CodePage|LCID|SessionID|Timeout)\\\\b\"\n        },\n        {\n            token: \"support.function.asp\",\n            regex: \"\\\\b(?:Lock|Unlock|SetAbort|SetComplete|BinaryRead|AddHeader|AppendToLog|BinaryWrite|Clear|End|Flush|Redirect|Write|CreateObject|HTMLEncode|MapPath|URLEncode|Abandon|Convert|Regex)\\\\b\"\n        },\n        {\n            token: \"support.function.event.asp\",\n            regex: \"\\\\b(?:Application_OnEnd|Application_OnStart|OnTransactionAbort|OnTransactionCommit|Session_OnEnd|Session_OnStart)\\\\b\"\n        },\n        {\n            token: \"support.function.vb.asp\",\n            regex: \"\\\\b(?:Array|Add|Asc|Atn|CBool|CByte|CCur|CDate|CDbl|Chr|CInt|CLng|Conversions|Cos|CreateObject|CSng|CStr|Date|DateAdd|DateDiff|DatePart|DateSerial|DateValue|Day|Derived|Math|Escape|Eval|Exists|Exp|Filter|FormatCurrency|FormatDateTime|FormatNumber|FormatPercent|GetLocale|GetObject|GetRef|Hex|Hour|InputBox|InStr|InStrRev|Int|Fix|IsArray|IsDate|IsEmpty|IsNull|IsNumeric|IsObject|Item|Items|Join|Keys|LBound|LCase|Left|Len|LoadPicture|Log|LTrim|RTrim|Trim|Maths|Mid|Minute|Month|MonthName|MsgBox|Now|Oct|Remove|RemoveAll|Replace|RGB|Right|Rnd|Round|ScriptEngine|ScriptEngineBuildVersion|ScriptEngineMajorVersion|ScriptEngineMinorVersion|Second|SetLocale|Sgn|Sin|Space|Split|Sqr|StrComp|String|StrReverse|Tan|Time|Timer|TimeSerial|TimeValue|TypeName|UBound|UCase|Unescape|VarType|Weekday|WeekdayName|Year)\\\\b\"\n        },\n        {\n            token: [\n                \"constant.numeric.asp\"\n            ],\n            regex: \"-?\\\\b(?:(?:0(?:x|X)[0-9a-fA-F]*)|(?:(?:[0-9]+\\\\.?[0-9]*)|(?:\\\\.[0-9]+))(?:(?:e|E)(?:\\\\+|-)?[0-9]+)?)(?:L|l|UL|ul|u|U|F|f)?\\\\b\"\n        },\n        {\n            token: \"support.type.vb.asp\",\n            regex: \"\\\\b(?:vbtrue|vbfalse|vbcr|vbcrlf|vbformfeed|vblf|vbnewline|vbnullchar|vbnullstring|int32|vbtab|vbverticaltab|vbbinarycompare|vbtextcomparevbsunday|vbmonday|vbtuesday|vbwednesday|vbthursday|vbfriday|vbsaturday|vbusesystemdayofweek|vbfirstjan1|vbfirstfourdays|vbfirstfullweek|vbgeneraldate|vblongdate|vbshortdate|vblongtime|vbshorttime|vbobjecterror|vbEmpty|vbNull|vbInteger|vbLong|vbSingle|vbDouble|vbCurrency|vbDate|vbString|vbObject|vbError|vbBoolean|vbVariant|vbDataObject|vbDecimal|vbByte|vbArray)\\\\b\"\n        },\n        {\n            token: [\n                \"entity.name.function.asp\"\n            ],\n            regex: \"(?:(\\\\b[a-zA-Z_x7f-xff][a-zA-Z0-9_x7f-xff]*?\\\\b)(?=\\\\(\\\\)?))\"\n        },\n        {\n            token: [\n                \"keyword.operator.asp\"\n            ],\n            regex: \"\\\\-|\\\\+|\\\\*\\\\\\/|\\\\>|\\\\<|\\\\=|\\\\&\"\n        }\n    ],\n    \"state_3\": [\n        {\n            token: [\n                \"meta.odd-tab.tabs\",\n                \"meta.even-tab.tabs\"\n            ],\n            regex: \"(\\\\t)(\\\\t)?\"\n        },\n        {\n            token: \"meta.leading-space\",\n            regex: \"(?=[^\\\\t])\",\n            next: \"start\"\n        },\n        {\n            token: \"meta.leading-space\",\n            regex: \".\",\n            next: \"state_3\"\n        }\n    ],\n    \"state_4\": [\n        {\n            token: [\"meta.odd-tab.spaces\", \"meta.even-tab.spaces\"],\n            regex: \"(  )(  )?\"\n        },\n        {\n            token: \"meta.leading-space\",\n            regex: \"(?=[^ ])\",\n            next: \"start\"\n        },\n        {\n            defaultToken: \"meta.leading-space\"\n        }\n    ],\n    \"comment\": [\n        {\n            token: \"comment.line.apostrophe.asp\",\n            regex: \"$|(?=(?:%>))\",\n            next: \"start\"\n        },\n        {\n            defaultToken: \"comment.line.apostrophe.asp\"\n        }\n    ],\n    \"string\": [\n        {\n            token: \"constant.character.escape.apostrophe.asp\",\n            regex: '\"\"'\n        },\n        {\n            token: \"string.quoted.double.asp\",\n            regex: '\"',\n            next: \"start\"\n        },\n        {\n            defaultToken: \"string.quoted.double.asp\"\n        }\n    ]\n}\n\n};\n\noop.inherits(VBScriptHighlightRules, TextHighlightRules);\n\nexports.VBScriptHighlightRules = VBScriptHighlightRules;\n});\n\nace.define(\"ace/mode/vbscript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/vbscript_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar VBScriptHighlightRules = require(\"./vbscript_highlight_rules\").VBScriptHighlightRules;\n\nvar Mode = function() {\n    this.HighlightRules = VBScriptHighlightRules;\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n       \n    this.lineCommentStart = [\"'\", \"REM\"];\n    \n    this.$id = \"ace/mode/vbscript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-velocity.js",
    "content": "ace.define(\"ace/mode/doc_comment_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar DocCommentHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment.doc.tag\",\n            regex : \"@[\\\\w\\\\d_]+\" // TODO: fix email addresses\n        }, \n        DocCommentHighlightRules.getTagRule(),\n        {\n            defaultToken : \"comment.doc\",\n            caseInsensitive: true\n        }]\n    };\n};\n\noop.inherits(DocCommentHighlightRules, TextHighlightRules);\n\nDocCommentHighlightRules.getTagRule = function(start) {\n    return {\n        token : \"comment.doc.tag.storage.type\",\n        regex : \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\"\n    };\n}\n\nDocCommentHighlightRules.getStartRule = function(start) {\n    return {\n        token : \"comment.doc\", // doc comment\n        regex : \"\\\\/\\\\*(?=\\\\*)\",\n        next  : start\n    };\n};\n\nDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n        token : \"comment.doc\", // closing comment\n        regex : \"\\\\*\\\\/\",\n        next  : start\n    };\n};\n\n\nexports.DocCommentHighlightRules = DocCommentHighlightRules;\n\n});\n\nace.define(\"ace/mode/javascript_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/doc_comment_highlight_rules\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar DocCommentHighlightRules = require(\"./doc_comment_highlight_rules\").DocCommentHighlightRules;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar JavaScriptHighlightRules = function(options) {\n    var keywordMapper = this.createKeywordMapper({\n        \"variable.language\":\n            \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|\"  + // Constructors\n            \"Namespace|QName|XML|XMLList|\"                                             + // E4X\n            \"ArrayBuffer|Float32Array|Float64Array|Int16Array|Int32Array|Int8Array|\"   +\n            \"Uint16Array|Uint32Array|Uint8Array|Uint8ClampedArray|\"                    +\n            \"Error|EvalError|InternalError|RangeError|ReferenceError|StopIteration|\"   + // Errors\n            \"SyntaxError|TypeError|URIError|\"                                          +\n            \"decodeURI|decodeURIComponent|encodeURI|encodeURIComponent|eval|isFinite|\" + // Non-constructor functions\n            \"isNaN|parseFloat|parseInt|\"                                               +\n            \"JSON|Math|\"                                                               + // Other\n            \"this|arguments|prototype|window|document\"                                 , // Pseudo\n        \"keyword\":\n            \"const|yield|import|get|set|\" +\n            \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n            \"if|in|instanceof|new|return|switch|throw|try|typeof|let|var|while|with|debugger|\" +\n            \"__parent__|__count__|escape|unescape|with|__proto__|\" +\n            \"class|enum|extends|super|export|implements|private|public|interface|package|protected|static\",\n        \"storage.type\":\n            \"const|let|var|function\",\n        \"constant.language\":\n            \"null|Infinity|NaN|undefined\",\n        \"support.function\":\n            \"alert\",\n        \"constant.language.boolean\": \"true|false\"\n    }, \"identifier\");\n    var kwBeforeRe = \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\\\\b\";\n\n    var escapedRe = \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n        \"u[0-9a-fA-F]{4}|\" + // unicode\n        \"[0-2][0-7]{0,2}|\" + // oct\n        \"3[0-6][0-7]?|\" + // oct\n        \"37[0-7]?|\" + // oct\n        \"[4-7][0-7]?|\" + //oct\n        \".)\";\n\n    this.$rules = {\n        \"no_regex\" : [\n            {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment\"\n            },\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : /\\/\\*/,\n                next : \"comment\"\n            }, {\n                token : \"string\",\n                regex : \"'(?=.)\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : '\"(?=.)',\n                next  : \"qqstring\"\n            }, {\n                token : \"constant.numeric\", // hex\n                regex : /0[xX][0-9a-fA-F]+\\b/\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b/\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"support.function\",\n                    \"punctuation.operator\", \"entity.name.function\", \"text\",\"keyword.operator\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(prototype)(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"keyword.operator\", \"text\", \"storage.type\",\n                    \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"punctuation.operator\", \"entity.name.function\", \"text\",\n                    \"keyword.operator\", \"text\",\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\.)(\" + identifierRe +\")(\\\\s*)(=)(\\\\s*)(function)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"storage.type\", \"text\", \"entity.name.function\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(function)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"entity.name.function\", \"text\", \"punctuation.operator\",\n                    \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : [\n                    \"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"\n                ],\n                regex : \"(:)(\\\\s*)(function)(\\\\s*)(\\\\()\",\n                next: \"function_arguments\"\n            }, {\n                token : \"keyword\",\n                regex : \"(?:\" + kwBeforeRe + \")\\\\b\",\n                next : \"start\"\n            }, {\n                token : [\"punctuation.operator\", \"support.function\"],\n                regex : /(\\.)(s(?:h(?:ift|ow(?:Mod(?:elessDialog|alDialog)|Help))|croll(?:X|By(?:Pages|Lines)?|Y|To)?|t(?:op|rike)|i(?:n|zeToContent|debar|gnText)|ort|u(?:p|b(?:str(?:ing)?)?)|pli(?:ce|t)|e(?:nd|t(?:Re(?:sizable|questHeader)|M(?:i(?:nutes|lliseconds)|onth)|Seconds|Ho(?:tKeys|urs)|Year|Cursor|Time(?:out)?|Interval|ZOptions|Date|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Date|FullYear)|FullYear|Active)|arch)|qrt|lice|avePreferences|mall)|h(?:ome|andleEvent)|navigate|c(?:har(?:CodeAt|At)|o(?:s|n(?:cat|textual|firm)|mpile)|eil|lear(?:Timeout|Interval)?|a(?:ptureEvents|ll)|reate(?:StyleSheet|Popup|EventObject))|t(?:o(?:GMTString|S(?:tring|ource)|U(?:TCString|pperCase)|Lo(?:caleString|werCase))|est|a(?:n|int(?:Enabled)?))|i(?:s(?:NaN|Finite)|ndexOf|talics)|d(?:isableExternalCapture|ump|etachEvent)|u(?:n(?:shift|taint|escape|watch)|pdateCommands)|j(?:oin|avaEnabled)|p(?:o(?:p|w)|ush|lugins.refresh|a(?:ddings|rse(?:Int|Float)?)|r(?:int|ompt|eference))|e(?:scape|nableExternalCapture|val|lementFromPoint|x(?:p|ec(?:Script|Command)?))|valueOf|UTC|queryCommand(?:State|Indeterm|Enabled|Value)|f(?:i(?:nd|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward)|loor|romCharCode)|watch|l(?:ink|o(?:ad|g)|astIndexOf)|a(?:sin|nchor|cos|t(?:tachEvent|ob|an(?:2)?)|pply|lert|b(?:s|ort))|r(?:ou(?:nd|teEvents)|e(?:size(?:By|To)|calc|turnValue|place|verse|l(?:oad|ease(?:Capture|Events)))|andom)|g(?:o|et(?:ResponseHeader|M(?:i(?:nutes|lliseconds)|onth)|Se(?:conds|lection)|Hours|Year|Time(?:zoneOffset)?|Da(?:y|te)|UTC(?:M(?:i(?:nutes|lliseconds)|onth)|Seconds|Hours|Da(?:y|te)|FullYear)|FullYear|A(?:ttention|llResponseHeaders)))|m(?:in|ove(?:B(?:y|elow)|To(?:Absolute)?|Above)|ergeAttributes|a(?:tch|rgins|x))|b(?:toa|ig|o(?:ld|rderWidths)|link|ack))\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.function.dom\"],\n                regex : /(\\.)(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/\n            }, {\n                token : [\"punctuation.operator\", \"support.constant\"],\n                regex : /(\\.)(s(?:ystemLanguage|cr(?:ipts|ollbars|een(?:X|Y|Top|Left))|t(?:yle(?:Sheets)?|atus(?:Text|bar)?)|ibling(?:Below|Above)|ource|uffixes|e(?:curity(?:Policy)?|l(?:ection|f)))|h(?:istory|ost(?:name)?|as(?:h|Focus))|y|X(?:MLDocument|SLDocument)|n(?:ext|ame(?:space(?:s|URI)|Prop))|M(?:IN_VALUE|AX_VALUE)|c(?:haracterSet|o(?:n(?:structor|trollers)|okieEnabled|lorDepth|mp(?:onents|lete))|urrent|puClass|l(?:i(?:p(?:boardData)?|entInformation)|osed|asses)|alle(?:e|r)|rypto)|t(?:o(?:olbar|p)|ext(?:Transform|Indent|Decoration|Align)|ags)|SQRT(?:1_2|2)|i(?:n(?:ner(?:Height|Width)|put)|ds|gnoreCase)|zIndex|o(?:scpu|n(?:readystatechange|Line)|uter(?:Height|Width)|p(?:sProfile|ener)|ffscreenBuffering)|NEGATIVE_INFINITY|d(?:i(?:splay|alog(?:Height|Top|Width|Left|Arguments)|rectories)|e(?:scription|fault(?:Status|Ch(?:ecked|arset)|View)))|u(?:ser(?:Profile|Language|Agent)|n(?:iqueID|defined)|pdateInterval)|_content|p(?:ixelDepth|ort|ersonalbar|kcs11|l(?:ugins|atform)|a(?:thname|dding(?:Right|Bottom|Top|Left)|rent(?:Window|Layer)?|ge(?:X(?:Offset)?|Y(?:Offset)?))|r(?:o(?:to(?:col|type)|duct(?:Sub)?|mpter)|e(?:vious|fix)))|e(?:n(?:coding|abledPlugin)|x(?:ternal|pando)|mbeds)|v(?:isibility|endor(?:Sub)?|Linkcolor)|URLUnencoded|P(?:I|OSITIVE_INFINITY)|f(?:ilename|o(?:nt(?:Size|Family|Weight)|rmName)|rame(?:s|Element)|gColor)|E|whiteSpace|l(?:i(?:stStyleType|n(?:eHeight|kColor))|o(?:ca(?:tion(?:bar)?|lName)|wsrc)|e(?:ngth|ft(?:Context)?)|a(?:st(?:M(?:odified|atch)|Index|Paren)|yer(?:s|X)|nguage))|a(?:pp(?:MinorVersion|Name|Co(?:deName|re)|Version)|vail(?:Height|Top|Width|Left)|ll|r(?:ity|guments)|Linkcolor|bove)|r(?:ight(?:Context)?|e(?:sponse(?:XML|Text)|adyState))|global|x|m(?:imeTypes|ultiline|enubar|argin(?:Right|Bottom|Top|Left))|L(?:N(?:10|2)|OG(?:10E|2E))|b(?:o(?:ttom|rder(?:Width|RightWidth|BottomWidth|Style|Color|TopWidth|LeftWidth))|ufferDepth|elow|ackground(?:Color|Image)))\\b/\n            }, {\n                token : [\"support.constant\"],\n                regex : /that\\b/\n            }, {\n                token : [\"storage.type\", \"punctuation.operator\", \"support.function.firebug\"],\n                regex : /(console)(\\.)(warn|info|log|error|time|trace|timeEnd|assert)\\b/\n            }, {\n                token : keywordMapper,\n                regex : identifierRe\n            }, {\n                token : \"keyword.operator\",\n                regex : /--|\\+\\+|===|==|=|!=|!==|<=|>=|<<=|>>=|>>>=|<>|<|>|!|&&|\\|\\||\\?\\:|[!$%&*+\\-~\\/^]=?/,\n                next  : \"start\"\n            }, {\n                token : \"punctuation.operator\",\n                regex : /[?:,;.]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.lparen\",\n                regex : /[\\[({]/,\n                next  : \"start\"\n            }, {\n                token : \"paren.rparen\",\n                regex : /[\\])}]/\n            }, {\n                token: \"comment\",\n                regex: /^#!.*$/\n            }\n        ],\n        \"start\": [\n            DocCommentHighlightRules.getStartRule(\"doc-start\"),\n            {\n                token : \"comment\", // multi line comment\n                regex : \"\\\\/\\\\*\",\n                next : \"comment_regex_allowed\"\n            }, {\n                token : \"comment\",\n                regex : \"\\\\/\\\\/\",\n                next : \"line_comment_regex_allowed\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"\\\\/\",\n                next: \"regex\"\n            }, {\n                token : \"text\",\n                regex : \"\\\\s+|^$\",\n                next : \"start\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"regex\": [\n            {\n                token: \"regexp.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"string.regexp\",\n                regex: \"/[sxngimy]*\",\n                next: \"no_regex\"\n            }, {\n                token : \"invalid\",\n                regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/\n            }, {\n                token : \"constant.language.escape\",\n                regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/\n            }, {\n                token : \"constant.language.delimiter\",\n                regex: /\\|/\n            }, {\n                token: \"constant.language.escape\",\n                regex: /\\[\\^?/,\n                next: \"regex_character_class\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp\"\n            }\n        ],\n        \"regex_character_class\": [\n            {\n                token: \"regexp.charclass.keyword.operator\",\n                regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"]\",\n                next: \"regex\"\n            }, {\n                token: \"constant.language.escape\",\n                regex: \"-\"\n            }, {\n                token: \"empty\",\n                regex: \"$\",\n                next: \"no_regex\"\n            }, {\n                defaultToken: \"string.regexp.charachterclass\"\n            }\n        ],\n        \"function_arguments\": [\n            {\n                token: \"variable.parameter\",\n                regex: identifierRe\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"[, ]+\"\n            }, {\n                token: \"punctuation.operator\",\n                regex: \"$\"\n            }, {\n                token: \"empty\",\n                regex: \"\",\n                next: \"no_regex\"\n            }\n        ],\n        \"comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"\\\\*\\\\/\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment_regex_allowed\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"start\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"line_comment\" : [\n            DocCommentHighlightRules.getTagRule(),\n            {token : \"comment\", regex : \"$|^\", next : \"no_regex\"},\n            {defaultToken : \"comment\", caseInsensitive: true}\n        ],\n        \"qqstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qqstring\"\n            }, {\n                token : \"string\",\n                regex : '\"|$',\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ],\n        \"qstring\" : [\n            {\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"string\",\n                regex : \"\\\\\\\\$\",\n                next  : \"qstring\"\n            }, {\n                token : \"string\",\n                regex : \"'|$\",\n                next  : \"no_regex\"\n            }, {\n                defaultToken: \"string\"\n            }\n        ]\n    };\n    \n    \n    if (!options || !options.noES6) {\n        this.$rules.no_regex.unshift({\n            regex: \"[{}]\", onMatch: function(val, state, stack) {\n                this.next = val == \"{\" ? this.nextState : \"\";\n                if (val == \"{\" && stack.length) {\n                    stack.unshift(\"start\", state);\n                    return \"paren\";\n                }\n                if (val == \"}\" && stack.length) {\n                    stack.shift();\n                    this.next = stack.shift();\n                    if (this.next.indexOf(\"string\") != -1)\n                        return \"paren.quasi.end\";\n                }\n                return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n            },\n            nextState: \"start\"\n        }, {\n            token : \"string.quasi.start\",\n            regex : /`/,\n            push  : [{\n                token : \"constant.language.escape\",\n                regex : escapedRe\n            }, {\n                token : \"paren.quasi.start\",\n                regex : /\\${/,\n                push  : \"start\"\n            }, {\n                token : \"string.quasi.end\",\n                regex : /`/,\n                next  : \"pop\"\n            }, {\n                defaultToken: \"string.quasi\"\n            }]\n        });\n    }\n    \n    this.embedRules(DocCommentHighlightRules, \"doc-\",\n        [ DocCommentHighlightRules.getEndRule(\"no_regex\") ]);\n    \n    this.normalizeRules();\n};\n\noop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n\nexports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/javascript\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/range\",\"ace/worker/worker_client\",\"ace/mode/behaviour/cstyle\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar Range = require(\"../range\").Range;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = JavaScriptHighlightRules;\n    \n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n        var tokens = tokenizedLine.tokens;\n        var endState = tokenizedLine.state;\n\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        if (state == \"start\" || state == \"no_regex\") {\n            var match = line.match(/^.*(?:\\bcase\\b.*\\:|[\\{\\(\\[])\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        } else if (state == \"doc-start\") {\n            if (endState == \"start\" || endState == \"no_regex\") {\n                return \"\";\n            }\n            var match = line.match(/^\\s*(\\/?)\\*/);\n            if (match) {\n                if (match[1]) {\n                    indent += \" \";\n                }\n                indent += \"* \";\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/javascript_worker\", \"JavaScriptWorker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"jslint\", function(results) {\n            session.setAnnotations(results.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/javascript\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/css_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar supportType = exports.supportType = \"animation-fill-mode|alignment-adjust|alignment-baseline|animation-delay|animation-direction|animation-duration|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|animation|appearance|azimuth|backface-visibility|background-attachment|background-break|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|background|baseline-shift|binding|bleed|bookmark-label|bookmark-level|bookmark-state|bookmark-target|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|border|bottom|box-align|box-decoration-break|box-direction|box-flex-group|box-flex|box-lines|box-ordinal-group|box-orient|box-pack|box-shadow|box-sizing|break-after|break-before|break-inside|caption-side|clear|clip|color-profile|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|crop|cue-after|cue-before|cue|cursor|direction|display|dominant-baseline|drop-initial-after-adjust|drop-initial-after-align|drop-initial-before-adjust|drop-initial-before-align|drop-initial-size|drop-initial-value|elevation|empty-cells|fit|fit-position|float-offset|float|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|font|grid-columns|grid-rows|hanging-punctuation|height|hyphenate-after|hyphenate-before|hyphenate-character|hyphenate-lines|hyphenate-resource|hyphens|icon|image-orientation|image-rendering|image-resolution|inline-box-align|left|letter-spacing|line-height|line-stacking-ruby|line-stacking-shift|line-stacking-strategy|line-stacking|list-style-image|list-style-position|list-style-type|list-style|margin-bottom|margin-left|margin-right|margin-top|margin|mark-after|mark-before|mark|marks|marquee-direction|marquee-play-count|marquee-speed|marquee-style|max-height|max-width|min-height|min-width|move-to|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|orphans|outline-color|outline-offset|outline-style|outline-width|outline|overflow-style|overflow-x|overflow-y|overflow|padding-bottom|padding-left|padding-right|padding-top|padding|page-break-after|page-break-before|page-break-inside|page-policy|page|pause-after|pause-before|pause|perspective-origin|perspective|phonemes|pitch-range|pitch|play-during|pointer-events|position|presentation-level|punctuation-trim|quotes|rendering-intent|resize|rest-after|rest-before|rest|richness|right|rotation-point|rotation|ruby-align|ruby-overhang|ruby-position|ruby-span|size|speak-header|speak-numeral|speak-punctuation|speak|speech-rate|stress|string-set|table-layout|target-name|target-new|target-position|target|text-align-last|text-align|text-decoration|text-emphasis|text-height|text-indent|text-justify|text-outline|text-shadow|text-transform|text-wrap|top|transform-origin|transform-style|transform|transition-delay|transition-duration|transition-property|transition-timing-function|transition|unicode-bidi|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch-range|voice-pitch|voice-rate|voice-stress|voice-volume|volume|white-space-collapse|white-space|widows|width|word-break|word-spacing|word-wrap|z-index\";\nvar supportFunction = exports.supportFunction = \"rgb|rgba|url|attr|counter|counters\";\nvar supportConstant = exports.supportConstant = \"absolute|after-edge|after|all-scroll|all|alphabetic|always|antialiased|armenian|auto|avoid-column|avoid-page|avoid|balance|baseline|before-edge|before|below|bidi-override|block-line-height|block|bold|bolder|border-box|both|bottom|box|break-all|break-word|capitalize|caps-height|caption|center|central|char|circle|cjk-ideographic|clone|close-quote|col-resize|collapse|column|consider-shifts|contain|content-box|cover|crosshair|cubic-bezier|dashed|decimal-leading-zero|decimal|default|disabled|disc|disregard-shifts|distribute-all-lines|distribute-letter|distribute-space|distribute|dotted|double|e-resize|ease-in|ease-in-out|ease-out|ease|ellipsis|end|exclude-ruby|fill|fixed|georgian|glyphs|grid-height|groove|hand|hanging|hebrew|help|hidden|hiragana-iroha|hiragana|horizontal|icon|ideograph-alpha|ideograph-numeric|ideograph-parenthesis|ideograph-space|ideographic|inactive|include-ruby|inherit|initial|inline-block|inline-box|inline-line-height|inline-table|inline|inset|inside|inter-ideograph|inter-word|invert|italic|justify|katakana-iroha|katakana|keep-all|last|left|lighter|line-edge|line-through|line|linear|list-item|local|loose|lower-alpha|lower-greek|lower-latin|lower-roman|lowercase|lr-tb|ltr|mathematical|max-height|max-size|medium|menu|message-box|middle|move|n-resize|ne-resize|newspaper|no-change|no-close-quote|no-drop|no-open-quote|no-repeat|none|normal|not-allowed|nowrap|nw-resize|oblique|open-quote|outset|outside|overline|padding-box|page|pointer|pre-line|pre-wrap|pre|preserve-3d|progress|relative|repeat-x|repeat-y|repeat|replaced|reset-size|ridge|right|round|row-resize|rtl|s-resize|scroll|se-resize|separate|slice|small-caps|small-caption|solid|space|square|start|static|status-bar|step-end|step-start|steps|stretch|strict|sub|super|sw-resize|table-caption|table-cell|table-column-group|table-column|table-footer-group|table-header-group|table-row-group|table-row|table|tb-rl|text-after-edge|text-before-edge|text-bottom|text-size|text-top|text|thick|thin|transparent|underline|upper-alpha|upper-latin|upper-roman|uppercase|use-script|vertical-ideographic|vertical-text|visible|w-resize|wait|whitespace|z-index|zero\";\nvar supportConstantColor = exports.supportConstantColor = \"aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow\";\nvar supportConstantFonts = exports.supportConstantFonts = \"arial|century|comic|courier|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\";\n\nvar numRe = exports.numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\nvar pseudoElements = exports.pseudoElements = \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\";\nvar pseudoClasses  = exports.pseudoClasses =  \"(:)\\\\b(active|checked|disabled|empty|enabled|first-child|first-of-type|focus|hover|indeterminate|invalid|last-child|last-of-type|link|not|nth-child|nth-last-child|nth-last-of-type|nth-of-type|only-child|only-of-type|required|root|target|valid|visited)\\\\b\";\n\nvar CssHighlightRules = function() {\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts\n    }, \"text\", true);\n\n    this.$rules = {\n        \"start\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"@.*?{\",\n            push:  \"media\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"media\" : [{\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token: \"paren.lparen\",\n            regex: \"\\\\{\",\n            push:  \"ruleset\"\n        }, {\n            token: \"string\",\n            regex: \"\\\\}\",\n            next:  \"pop\"\n        }, {\n            token: \"keyword\",\n            regex: \"#[a-z0-9-_]+\"\n        }, {\n            token: \"variable\",\n            regex: \"\\\\.[a-z0-9-_]+\"\n        }, {\n            token: \"string\",\n            regex: \":[a-z0-9-_]+\"\n        }, {\n            token: \"constant\",\n            regex: \"[a-z0-9-_]+\"\n        }, {\n            caseInsensitive: true\n        }],\n\n        \"comment\" : [{\n            token : \"comment\",\n            regex : \"\\\\*\\\\/\",\n            next : \"pop\"\n        }, {\n            defaultToken : \"comment\"\n        }],\n\n        \"ruleset\" : [\n        {\n            token : \"paren.rparen\",\n            regex : \"\\\\}\",\n            next:   \"pop\"\n        }, {\n            token : \"comment\", // multi line comment\n            regex : \"\\\\/\\\\*\",\n            push : \"comment\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : [\"constant.numeric\", \"keyword\"],\n            regex : \"(\" + numRe + \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vm|vw|%)\"\n        }, {\n            token : \"constant.numeric\",\n            regex : numRe\n        }, {\n            token : \"constant.numeric\",  // hex6 color\n            regex : \"#[a-f0-9]{6}\"\n        }, {\n            token : \"constant.numeric\", // hex3 color\n            regex : \"#[a-f0-9]{3}\"\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-element.css\"],\n            regex : pseudoElements\n        }, {\n            token : [\"punctuation\", \"entity.other.attribute-name.pseudo-class.css\"],\n            regex : pseudoClasses\n        }, {\n            token : [\"support.function\", \"string\", \"support.function\"],\n            regex : \"(url\\\\()(.*)(\\\\))\"\n        }, {\n            token : keywordMapper,\n            regex : \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\"\n        }, {\n            caseInsensitive: true\n        }]\n    };\n\n    this.normalizeRules();\n};\n\noop.inherits(CssHighlightRules, TextHighlightRules);\n\nexports.CssHighlightRules = CssHighlightRules;\n\n});\n\nace.define(\"ace/mode/behaviour/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar CstyleBehaviour = require(\"./cstyle\").CstyleBehaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar CssBehaviour = function () {\n\n    this.inherit(CstyleBehaviour);\n\n    this.add(\"colon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(cursor.row);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                if (rightChar === ':') {\n                    return {\n                       text: '',\n                       selection: [1, 1]\n                    }\n                }\n                if (!line.substring(cursor.column).match(/^\\s*;/)) {\n                    return {\n                       text: ':;',\n                       selection: [1, 1]\n                    }\n                }\n            }\n        }\n    });\n\n    this.add(\"colon\", \"deletion\", function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected === ':') {\n            var cursor = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n            if (token && token.value.match(/\\s+/)) {\n                token = iterator.stepBackward();\n            }\n            if (token && token.type === 'support.type') {\n                var line = session.doc.getLine(range.start.row);\n                var rightChar = line.substring(range.end.column, range.end.column + 1);\n                if (rightChar === ';') {\n                    range.end.column ++;\n                    return range;\n                }\n            }\n        }\n    });\n\n    this.add(\"semicolon\", \"insertion\", function (state, action, editor, session, text) {\n        if (text === ';') {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === ';') {\n                return {\n                   text: '',\n                   selection: [1, 1]\n                }\n            }\n        }\n    });\n\n}\noop.inherits(CssBehaviour, CstyleBehaviour);\n\nexports.CssBehaviour = CssBehaviour;\n});\n\nace.define(\"ace/mode/css\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/css_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/worker/worker_client\",\"ace/mode/behaviour/css\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar CssBehaviour = require(\"./behaviour/css\").CssBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = CssHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CssBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.foldingRules = \"cStyle\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var tokens = this.getTokenizer().getLineTokens(line, state).tokens;\n        if (tokens.length && tokens[tokens.length-1].type == \"comment\") {\n            return indent;\n        }\n\n        var match = line.match(/^.*\\{\\s*$/);\n        if (match) {\n            indent += tab;\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n    this.createWorker = function(session) {\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/css_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        worker.on(\"csslint\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/css\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n\nace.define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"string.cdata.xml\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.xml-decl.xml\", \"keyword.xml-decl.xml\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_decl\", caseInsensitive: true\n            },\n            {\n                token : [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"processing_instruction\",\n            },\n            {token : \"comment.xml\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\", caseInsensitive: true\n            },\n            {include : \"tag\"},\n            {token : \"text.end-tag-open.xml\", regex: \"</\"},\n            {token : \"text.tag-open.xml\", regex: \"<\"},\n            {include : \"reference\"},\n            {defaultToken : \"text.xml\"}\n        ],\n\n        xml_decl : [{\n            token : \"entity.other.attribute-name.decl-attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.decl-attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"whitespace\"\n        }, {\n            include: \"string\"\n        }, {\n            token : \"punctuation.xml-decl.xml\",\n            regex : \"\\\\?>\",\n            next : \"start\"\n        }],\n\n        processing_instruction : [\n            {token : \"punctuation.instruction.xml\", regex : \"\\\\?>\", next : \"start\"},\n            {defaultToken : \"instruction.xml\"}\n        ],\n\n        doctype : [\n            {include : \"whitespace\"},\n            {include : \"string\"},\n            {token : \"xml-pe.doctype.xml\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe.xml\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.int-subset\", regex : \"\\\\[\", push : \"int_subset\"}\n        ],\n\n        int_subset : [{\n            token : \"text.xml\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.int-subset.xml\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.markup-decl.xml\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.cdata.xml\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text.xml\", regex : \"\\\\s+\"},\n            {token : \"text.xml\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment.xml\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment.xml\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape.reference.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        attr_reference : [{\n            token : \"constant.language.escape.reference.attribute-value.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n            regex : \"(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n            ]\n        }],\n\n        tag_whitespace : [\n            {token : \"text.tag-whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        whitespace : [\n            {token : \"text.whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        string: [{\n            token : \"string.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.xml\", regex: \"'\", next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }, {\n            token : \"string.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.xml\", regex: '\"', next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }],\n\n        attributes: [{\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"tag_whitespace\"\n        }, {\n            include: \"attribute_value\"\n        }],\n\n        attribute_value: [{\n            token : \"string.attribute-value.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }, {\n            token : \"string.attribute-value.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\nace.define(\"ace/mode/html_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/css_highlight_rules\",\"ace/mode/javascript_highlight_rules\",\"ace/mode/xml_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar CssHighlightRules = require(\"./css_highlight_rules\").CssHighlightRules;\nvar JavaScriptHighlightRules = require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\nvar tagMap = lang.createMap({\n    a           : 'anchor',\n    button \t    : 'form',\n    form        : 'form',\n    img         : 'image',\n    input       : 'form',\n    label       : 'form',\n    option      : 'form',\n    script      : 'script',\n    select      : 'form',\n    textarea    : 'form',\n    style       : 'style',\n    table       : 'table',\n    tbody       : 'table',\n    td          : 'table',\n    tfoot       : 'table',\n    th          : 'table',\n    tr          : 'table'\n});\n\nvar HtmlHighlightRules = function() {\n    XmlHighlightRules.call(this);\n\n    this.addRules({\n        attributes: [{\n            include : \"tag_whitespace\"\n        }, {\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"[-_a-zA-Z0-9:]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\",\n            push : [{\n                include: \"tag_whitespace\"\n            }, {\n                token : \"string.unquoted.attribute-value.html\",\n                regex : \"[^<>='\\\"`\\\\s]+\",\n                next : \"pop\"\n            }, {\n                token : \"empty\",\n                regex : \"\",\n                next : \"pop\"\n            }]\n        }, {\n            include : \"attribute_value\"\n        }],\n        tag: [{\n            token : function(start, tag) {\n                var group = tagMap[tag];\n                return [\"meta.tag.punctuation.\" + (start == \"<\" ? \"\" : \"end-\") + \"tag-open.xml\",\n                    \"meta.tag\" + (group ? \".\" + group : \"\") + \".tag-name.xml\"];\n            },\n            regex : \"(</?)([-_a-zA-Z0-9:]+)\",\n            next: \"tag_stuff\"\n        }],\n        tag_stuff: [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n        ],\n    });\n\n    this.embedTagRules(CssHighlightRules, \"css-\", \"style\");\n    this.embedTagRules(JavaScriptHighlightRules, \"js-\", \"script\");\n\n    if (this.constructor === HtmlHighlightRules)\n        this.normalizeRules();\n};\n\noop.inherits(HtmlHighlightRules, XmlHighlightRules);\n\nexports.HtmlHighlightRules = HtmlHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nvar XmlBehaviour = function () {\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selected = session.doc.getTextRange(editor.getSelectionRange());\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            }\n\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (rightChar == quote && (is(token, \"attribute-value\") || is(token, \"string\"))) {\n                return {\n                    text: \"\",\n                    selection: [1, 1]\n                };\n            }\n\n            if (!token)\n                token = iterator.stepBackward();\n\n            if (!token)\n                return;\n\n            while (is(token, \"tag-whitespace\") || is(token, \"whitespace\")) {\n                token = iterator.stepBackward();\n            }\n            var rightSpace = !rightChar || rightChar.match(/\\s/);\n            if (is(token, \"attribute-equals\") && (rightSpace || rightChar == '>') || (is(token, \"decl-attribute-equals\") && (rightSpace || rightChar == '?'))) {\n                return {\n                    text: quote + quote,\n                    selection: [1, 1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken() || iterator.stepBackward();\n            if (!token || !(is(token, \"tag-name\") || is(token, \"tag-whitespace\") || is(token, \"attribute-name\") || is(token, \"attribute-equals\") || is(token, \"attribute-value\")))\n                return;\n            if (is(token, \"reference.attribute-value\"))\n                return;\n            if (is(token, \"attribute-value\")) {\n                var firstChar = token.value.charAt(0);\n                if (firstChar == '\"' || firstChar == \"'\") {\n                    var lastChar = token.value.charAt(token.value.length - 1);\n                    var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length;\n                    if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar)\n                        return;\n                }\n            }\n            while (!is(token, \"tag-name\")) {\n                token = iterator.stepBackward();\n            }\n\n            var tokenRow = iterator.getCurrentTokenRow();\n            var tokenColumn = iterator.getCurrentTokenColumn();\n            if (is(iterator.stepBackward(), \"end-tag-open\"))\n                return;\n\n            var element = token.value;\n            if (tokenRow == position.row)\n                element = element.substring(0, position.column - tokenColumn);\n\n            if (this.voidElements.hasOwnProperty(element.toLowerCase()))\n                 return;\n\n            return {\n               text: \">\" + \"</\" + element + \">\",\n               selection: [1, 1]\n            };\n        }\n    });\n\n    this.add(\"autoindent\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.getLine(cursor.row);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (token && token.type.indexOf(\"tag-close\") !== -1) {\n                while (token && token.type.indexOf(\"tag-name\") === -1) {\n                    token = iterator.stepBackward();\n                }\n\n                if (!token) {\n                    return;\n                }\n\n                var tag = token.value;\n                var row = iterator.getCurrentTokenRow();\n                token = iterator.stepBackward();\n                if (!token || token.type.indexOf(\"end-tag\") !== -1) {\n                    return;\n                }\n\n                if (this.voidElements && !this.voidElements[tag]) {\n                    var nextToken = session.getTokenAt(cursor.row, cursor.column+1);\n                    var line = session.getLine(row);\n                    var nextIndent = this.$getIndent(line);\n                    var indent = nextIndent + session.getTabString();\n\n                    if (nextToken && nextToken.value === \"</\") {\n                        return {\n                            text: \"\\n\" + indent + \"\\n\" + nextIndent,\n                            selection: [1, indent.length, 1, indent.length]\n                        };\n                    } else {\n                        return {\n                            text: \"\\n\" + indent\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n};\n\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\nace.define(\"ace/mode/folding/mixed\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(defaultMode, subModes) {\n    this.defaultMode = defaultMode;\n    this.subModes = subModes;\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n\n    this.$getMode = function(state) {\n        if (typeof state != \"string\") \n            state = state[0];\n        for (var key in this.subModes) {\n            if (state.indexOf(key) === 0)\n                return this.subModes[key];\n        }\n        return null;\n    };\n    \n    this.$tryMode = function(state, session, foldStyle, row) {\n        var mode = this.$getMode(state);\n        return (mode ? mode.getFoldWidget(session, foldStyle, row) : \"\");\n    };\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        return (\n            this.$tryMode(session.getState(row-1), session, foldStyle, row) ||\n            this.$tryMode(session.getState(row), session, foldStyle, row) ||\n            this.defaultMode.getFoldWidget(session, foldStyle, row)\n        );\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var mode = this.$getMode(session.getState(row-1));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.$getMode(session.getState(row));\n        \n        if (!mode || !mode.getFoldWidget(session, foldStyle, row))\n            mode = this.defaultMode;\n        \n        return mode.getFoldWidgetRange(session, foldStyle, row);\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalEndTags) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n    this.optionalEndTags = oop.mixin({}, this.voidElements);\n    if (optionalEndTags)\n        oop.mixin(this.optionalEndTags, optionalEndTags);\n    \n};\noop.inherits(FoldMode, BaseFoldMode);\n\nvar Tag = function() {\n    this.tagName = \"\";\n    this.closing = false;\n    this.selfClosing = false;\n    this.start = {row: 0, column: 0};\n    this.end = {row: 0, column: 0};\n};\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (!tag)\n            return \"\";\n\n        if (tag.closing || (!tag.tagName && tag.selfClosing))\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase()))\n            return \"\";\n\n        if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column))\n            return \"\";\n\n        return \"start\";\n    };\n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var tag = new Tag();\n\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (is(token, \"tag-open\")) {\n                tag.end.column = tag.start.column + token.value.length;\n                tag.closing = is(token, \"end-tag-open\");\n                token = tokens[++i];\n                if (!token)\n                    return null;\n                tag.tagName = token.value;\n                tag.end.column += token.value.length;\n                for (i++; i < tokens.length; i++) {\n                    token = tokens[i];\n                    tag.end.column += token.value.length;\n                    if (is(token, \"tag-close\")) {\n                        tag.selfClosing = token.value == '/>';\n                        break;\n                    }\n                }\n                return tag;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == '/>';\n                return tag;\n            }\n            tag.start.column += token.value.length;\n        }\n\n        return null;\n    };\n\n    this._findEndTagInLine = function(session, row, tagName, startColumn) {\n        var tokens = session.getTokens(row);\n        var column = 0;\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            column += token.value.length;\n            if (column < startColumn)\n                continue;\n            if (is(token, \"end-tag-open\")) {\n                token = tokens[i + 1];\n                if (token && token.value == tagName)\n                    return true;\n            }\n        }\n        return false;\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n                iterator.stepForward();\n                return tag;\n            }\n        } while(token = iterator.stepForward());\n\n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n                iterator.stepBackward();\n                return tag;\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n            }\n        } while(token = iterator.stepBackward());\n\n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.optionalEndTags.hasOwnProperty(top.tagName)) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.start.column);\n            var start = {\n                row: row,\n                column: firstTag.start.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.end.column);\n            var end = {\n                row: row,\n                column: firstTag.start.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/folding/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/mixed\",\"ace/mode/folding/xml\",\"ace/mode/folding/cstyle\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar MixedFoldMode = require(\"./mixed\").FoldMode;\nvar XmlFoldMode = require(\"./xml\").FoldMode;\nvar CStyleFoldMode = require(\"./cstyle\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalTags) {\n    MixedFoldMode.call(this, new XmlFoldMode(voidElements, optionalTags), {\n        \"js-\": new CStyleFoldMode(),\n        \"css-\": new CStyleFoldMode()\n    });\n};\n\noop.inherits(FoldMode, MixedFoldMode);\n\n});\n\nace.define(\"ace/mode/html_completions\",[\"require\",\"exports\",\"module\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar TokenIterator = require(\"../token_iterator\").TokenIterator;\n\nvar commonAttributes = [\n    \"accesskey\",\n    \"class\",\n    \"contenteditable\",\n    \"contextmenu\",\n    \"dir\",\n    \"draggable\",\n    \"dropzone\",\n    \"hidden\",\n    \"id\",\n    \"inert\",\n    \"itemid\",\n    \"itemprop\",\n    \"itemref\",\n    \"itemscope\",\n    \"itemtype\",\n    \"lang\",\n    \"spellcheck\",\n    \"style\",\n    \"tabindex\",\n    \"title\",\n    \"translate\"\n];\n\nvar eventAttributes = [\n    \"onabort\",\n    \"onblur\",\n    \"oncancel\",\n    \"oncanplay\",\n    \"oncanplaythrough\",\n    \"onchange\",\n    \"onclick\",\n    \"onclose\",\n    \"oncontextmenu\",\n    \"oncuechange\",\n    \"ondblclick\",\n    \"ondrag\",\n    \"ondragend\",\n    \"ondragenter\",\n    \"ondragleave\",\n    \"ondragover\",\n    \"ondragstart\",\n    \"ondrop\",\n    \"ondurationchange\",\n    \"onemptied\",\n    \"onended\",\n    \"onerror\",\n    \"onfocus\",\n    \"oninput\",\n    \"oninvalid\",\n    \"onkeydown\",\n    \"onkeypress\",\n    \"onkeyup\",\n    \"onload\",\n    \"onloadeddata\",\n    \"onloadedmetadata\",\n    \"onloadstart\",\n    \"onmousedown\",\n    \"onmousemove\",\n    \"onmouseout\",\n    \"onmouseover\",\n    \"onmouseup\",\n    \"onmousewheel\",\n    \"onpause\",\n    \"onplay\",\n    \"onplaying\",\n    \"onprogress\",\n    \"onratechange\",\n    \"onreset\",\n    \"onscroll\",\n    \"onseeked\",\n    \"onseeking\",\n    \"onselect\",\n    \"onshow\",\n    \"onstalled\",\n    \"onsubmit\",\n    \"onsuspend\",\n    \"ontimeupdate\",\n    \"onvolumechange\",\n    \"onwaiting\"\n];\n\nvar globalAttributes = commonAttributes.concat(eventAttributes);\n\nvar attributeMap = {\n    \"html\": [\"manifest\"],\n    \"head\": [],\n    \"title\": [],\n    \"base\": [\"href\", \"target\"],\n    \"link\": [\"href\", \"hreflang\", \"rel\", \"media\", \"type\", \"sizes\"],\n    \"meta\": [\"http-equiv\", \"name\", \"content\", \"charset\"],\n    \"style\": [\"type\", \"media\", \"scoped\"],\n    \"script\": [\"charset\", \"type\", \"src\", \"defer\", \"async\"],\n    \"noscript\": [\"href\"],\n    \"body\": [\"onafterprint\", \"onbeforeprint\", \"onbeforeunload\", \"onhashchange\", \"onmessage\", \"onoffline\", \"onpopstate\", \"onredo\", \"onresize\", \"onstorage\", \"onundo\", \"onunload\"],\n    \"section\": [],\n    \"nav\": [],\n    \"article\": [\"pubdate\"],\n    \"aside\": [],\n    \"h1\": [],\n    \"h2\": [],\n    \"h3\": [],\n    \"h4\": [],\n    \"h5\": [],\n    \"h6\": [],\n    \"header\": [],\n    \"footer\": [],\n    \"address\": [],\n    \"main\": [],\n    \"p\": [],\n    \"hr\": [],\n    \"pre\": [],\n    \"blockquote\": [\"cite\"],\n    \"ol\": [\"start\", \"reversed\"],\n    \"ul\": [],\n    \"li\": [\"value\"],\n    \"dl\": [],\n    \"dt\": [],\n    \"dd\": [],\n    \"figure\": [],\n    \"figcaption\": [],\n    \"div\": [],\n    \"a\": [\"href\", \"target\", \"ping\", \"rel\", \"media\", \"hreflang\", \"type\"],\n    \"em\": [],\n    \"strong\": [],\n    \"small\": [],\n    \"s\": [],\n    \"cite\": [],\n    \"q\": [\"cite\"],\n    \"dfn\": [],\n    \"abbr\": [],\n    \"data\": [],\n    \"time\": [\"datetime\"],\n    \"code\": [],\n    \"var\": [],\n    \"samp\": [],\n    \"kbd\": [],\n    \"sub\": [],\n    \"sup\": [],\n    \"i\": [],\n    \"b\": [],\n    \"u\": [],\n    \"mark\": [],\n    \"ruby\": [],\n    \"rt\": [],\n    \"rp\": [],\n    \"bdi\": [],\n    \"bdo\": [],\n    \"span\": [],\n    \"br\": [],\n    \"wbr\": [],\n    \"ins\": [\"cite\", \"datetime\"],\n    \"del\": [\"cite\", \"datetime\"],\n    \"img\": [\"alt\", \"src\", \"height\", \"width\", \"usemap\", \"ismap\"],\n    \"iframe\": [\"name\", \"src\", \"height\", \"width\", \"sandbox\", \"seamless\"],\n    \"embed\": [\"src\", \"height\", \"width\", \"type\"],\n    \"object\": [\"param\", \"data\", \"type\", \"height\" , \"width\", \"usemap\", \"name\", \"form\", \"classid\"],\n    \"param\": [\"name\", \"value\"],\n    \"video\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\", \"width\", \"height\", \"poster\"],\n    \"audio\": [\"src\", \"autobuffer\", \"autoplay\", \"loop\", \"controls\"],\n    \"source\": [\"src\", \"type\", \"media\"],\n    \"track\": [\"kind\", \"src\", \"srclang\", \"label\", \"default\"],\n    \"canvas\": [\"width\", \"height\"],\n    \"map\": [\"name\"],\n    \"area\": [\"shape\", \"coords\", \"href\", \"hreflang\", \"alt\", \"target\", \"media\", \"rel\", \"ping\", \"type\"],\n    \"svg\": [],\n    \"math\": [],\n    \"table\": [\"summary\"],\n    \"caption\": [],\n    \"colgroup\": [\"span\"],\n    \"col\": [\"span\"],\n    \"tbody\": [],\n    \"thead\": [],\n    \"tfoot\": [],\n    \"tr\": [],\n    \"td\": [\"headers\", \"rowspan\", \"colspan\"],\n    \"th\": [\"headers\", \"rowspan\", \"colspan\", \"scope\"],\n    \"form\": [\"accept-charset\", \"action\", \"autocomplete\", \"enctype\", \"method\", \"name\", \"novalidate\", \"target\"],\n    \"fieldset\": [\"disabled\", \"form\", \"name\"],\n    \"legend\": [],\n    \"label\": [\"form\", \"for\"],\n    \"input\": [\"type\", \"accept\", \"alt\", \"autocomplete\", \"checked\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"height\", \"list\", \"max\", \"maxlength\", \"min\", \"multiple\", \"pattern\", \"placeholder\", \"readonly\", \"required\", \"size\", \"src\", \"step\", \"width\", \"files\", \"value\"],\n    \"button\": [\"autofocus\", \"disabled\", \"form\", \"formaction\", \"formenctype\", \"formmethod\", \"formnovalidate\", \"formtarget\", \"name\", \"value\", \"type\"],\n    \"select\": [\"autofocus\", \"disabled\", \"form\", \"multiple\", \"name\", \"size\"],\n    \"datalist\": [],\n    \"optgroup\": [\"disabled\", \"label\"],\n    \"option\": [\"disabled\", \"selected\", \"label\", \"value\"],\n    \"textarea\": [\"autofocus\", \"disabled\", \"form\", \"maxlength\", \"name\", \"placeholder\", \"readonly\", \"required\", \"rows\", \"cols\", \"wrap\"],\n    \"keygen\": [\"autofocus\", \"challenge\", \"disabled\", \"form\", \"keytype\", \"name\"],\n    \"output\": [\"for\", \"form\", \"name\"],\n    \"progress\": [\"value\", \"max\"],\n    \"meter\": [\"value\", \"min\", \"max\", \"low\", \"high\", \"optimum\"],\n    \"details\": [\"open\"],\n    \"summary\": [],\n    \"command\": [\"type\", \"label\", \"icon\", \"disabled\", \"checked\", \"radiogroup\", \"command\"],\n    \"menu\": [\"type\", \"label\"],\n    \"dialog\": [\"open\"]\n};\n\nvar elements = Object.keys(attributeMap);\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nfunction findTagName(session, pos) {\n    var iterator = new TokenIterator(session, pos.row, pos.column);\n    var token = iterator.getCurrentToken();\n    while (token && !is(token, \"tag-name\")){\n        token = iterator.stepBackward();\n    }\n    if (token)\n        return token.value;\n}\n\nvar HtmlCompletions = function() {\n\n};\n\n(function() {\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        var token = session.getTokenAt(pos.row, pos.column);\n\n        if (!token)\n            return [];\n        if (is(token, \"tag-name\") || is(token, \"tag-open\") || is(token, \"end-tag-open\"))\n            return this.getTagCompletions(state, session, pos, prefix);\n        if (is(token, \"tag-whitespace\") || is(token, \"attribute-name\"))\n            return this.getAttributeCompetions(state, session, pos, prefix);\n\n        return [];\n    };\n\n    this.getTagCompletions = function(state, session, pos, prefix) {\n        return elements.map(function(element){\n            return {\n                value: element,\n                meta: \"tag\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n    this.getAttributeCompetions = function(state, session, pos, prefix) {\n        var tagName = findTagName(session, pos);\n        if (!tagName)\n            return [];\n        var attributes = globalAttributes;\n        if (tagName in attributeMap) {\n            attributes = attributes.concat(attributeMap[tagName]);\n        }\n        return attributes.map(function(attribute){\n            return {\n                caption: attribute,\n                snippet: attribute + '=\"$0\"',\n                meta: \"attribute\",\n                score: Number.MAX_VALUE\n            };\n        });\n    };\n\n}).call(HtmlCompletions.prototype);\n\nexports.HtmlCompletions = HtmlCompletions;\n});\n\nace.define(\"ace/mode/html\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/javascript\",\"ace/mode/css\",\"ace/mode/html_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/html\",\"ace/mode/html_completions\",\"ace/worker/worker_client\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextMode = require(\"./text\").Mode;\nvar JavaScriptMode = require(\"./javascript\").Mode;\nvar CssMode = require(\"./css\").Mode;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar HtmlFoldMode = require(\"./folding/html\").FoldMode;\nvar HtmlCompletions = require(\"./html_completions\").HtmlCompletions;\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar voidElements = [\"area\", \"base\", \"br\", \"col\", \"embed\", \"hr\", \"img\", \"input\", \"keygen\", \"link\", \"meta\", \"menuitem\", \"param\", \"source\", \"track\", \"wbr\"];\nvar optionalEndTags = [\"li\", \"dt\", \"dd\", \"p\", \"rt\", \"rp\", \"optgroup\", \"option\", \"colgroup\", \"td\", \"th\"];\n\nvar Mode = function(options) {\n    this.fragmentContext = options && options.fragmentContext;\n    this.HighlightRules = HtmlHighlightRules;\n    this.$behaviour = new XmlBehaviour();\n    this.$completer = new HtmlCompletions();\n    \n    this.createModeDelegates({\n        \"js-\": JavaScriptMode,\n        \"css-\": CssMode\n    });\n    \n    this.foldingRules = new HtmlFoldMode(this.voidElements, lang.arrayToMap(optionalEndTags));\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n    this.voidElements = lang.arrayToMap(voidElements);\n\n    this.getNextLineIndent = function(state, line, tab) {\n        return this.$getIndent(line);\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return false;\n    };\n\n    this.getCompletions = function(state, session, pos, prefix) {\n        return this.$completer.getCompletions(state, session, pos, prefix);\n    };\n\n    this.createWorker = function(session) {\n        if (this.constructor != Mode)\n            return;\n        var worker = new WorkerClient([\"ace\"], \"ace/mode/html_worker\", \"Worker\");\n        worker.attachToDocument(session.getDocument());\n\n        if (this.fragmentContext)\n            worker.call(\"setOptions\", [{context: this.fragmentContext}]);\n\n        worker.on(\"error\", function(e) {\n            session.setAnnotations(e.data);\n        });\n\n        worker.on(\"terminate\", function() {\n            session.clearAnnotations();\n        });\n\n        return worker;\n    };\n\n    this.$id = \"ace/mode/html\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n\nace.define(\"ace/mode/velocity_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text_highlight_rules\",\"ace/mode/html_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar HtmlHighlightRules = require(\"./html_highlight_rules\").HtmlHighlightRules;\n\nvar VelocityHighlightRules = function() {\n    HtmlHighlightRules.call(this);\n\n    var builtinConstants = lang.arrayToMap(\n        ('true|false|null').split('|')\n    );\n\n    var builtinFunctions = lang.arrayToMap(\n        (\"_DateTool|_DisplayTool|_EscapeTool|_FieldTool|_MathTool|_NumberTool|_SerializerTool|_SortTool|_StringTool|_XPathTool\").split('|')\n    );\n\n    var builtinVariables = lang.arrayToMap(\n        ('$contentRoot|$foreach').split('|')\n    );\n\n    var keywords = lang.arrayToMap(\n        (\"#set|#macro|#include|#parse|\" +\n        \"#if|#elseif|#else|#foreach|\" +\n        \"#break|#end|#stop\"\n        ).split('|')\n    );\n\n    this.$rules.start.push(\n        {\n            token : \"comment\",\n            regex : \"##.*$\"\n        },{\n            token : \"comment.block\", // multi line comment\n            regex : \"#\\\\*\",\n            next : \"vm_comment\"\n        }, {\n            token : \"string.regexp\",\n            regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : \"constant.numeric\", // hex\n            regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n        }, {\n            token : \"constant.language.boolean\",\n            regex : \"(?:true|false)\\\\b\"\n        }, {\n            token : function(value) {\n                if (keywords.hasOwnProperty(value))\n                    return \"keyword\";\n                else if (builtinConstants.hasOwnProperty(value))\n                    return \"constant.language\";\n                else if (builtinVariables.hasOwnProperty(value))\n                    return \"variable.language\";\n                else if (builtinFunctions.hasOwnProperty(value) || builtinFunctions.hasOwnProperty(value.substring(1)))\n                    return \"support.function\";\n                else if (value == \"debugger\")\n                    return \"invalid.deprecated\";\n                else\n                    if(value.match(/^(\\$[a-zA-Z_][a-zA-Z0-9_]*)$/))\n                        return \"variable\";\n                    return \"identifier\";\n            },\n            regex : \"[a-zA-Z$#][a-zA-Z0-9_]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"!|&|\\\\*|\\\\-|\\\\+|=|!=|<=|>=|<|>|&&|\\\\|\\\\|\"\n        }, {\n            token : \"lparen\",\n            regex : \"[[({]\"\n        }, {\n            token : \"rparen\",\n            regex : \"[\\\\])}]\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }\n    );\n\n    this.$rules[\"vm_comment\"] = [\n        {\n            token : \"comment\", // closing comment\n            regex : \"\\\\*#|-->\",\n            next : \"start\"\n        }, {\n            defaultToken: \"comment\"\n        }\n    ];\n\n    this.$rules[\"vm_start\"] = [\n        {\n            token: \"variable\",\n            regex: \"}\",\n            next: \"pop\"\n        }, {\n            token : \"string.regexp\",\n            regex : \"[/](?:(?:\\\\[(?:\\\\\\\\]|[^\\\\]])+\\\\])|(?:\\\\\\\\/|[^\\\\]/]))*[/]\\\\w*\\\\s*(?=[).,;]|$)\"\n        }, {\n            token : \"string\", // single line\n            regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n        }, {\n            token : \"string\", // single line\n            regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n        }, {\n            token : \"constant.numeric\", // hex\n            regex : \"0[xX][0-9a-fA-F]+\\\\b\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n        }, {\n            token : \"constant.language.boolean\",\n            regex : \"(?:true|false)\\\\b\"\n        }, {\n            token : function(value) {\n                if (keywords.hasOwnProperty(value))\n                    return \"keyword\";\n                else if (builtinConstants.hasOwnProperty(value))\n                    return \"constant.language\";\n                else if (builtinVariables.hasOwnProperty(value))\n                    return \"variable.language\";\n                else if (builtinFunctions.hasOwnProperty(value) || builtinFunctions.hasOwnProperty(value.substring(1)))\n                    return \"support.function\";\n                else if (value == \"debugger\")\n                    return \"invalid.deprecated\";\n                else\n                    if(value.match(/^(\\$[a-zA-Z_$][a-zA-Z0-9_]*)$/))\n                        return \"variable\";\n                    return \"identifier\";\n            },\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"!|&|\\\\*|\\\\-|\\\\+|=|!=|<=|>=|<|>|&&|\\\\|\\\\|\"\n        }, {\n            token : \"lparen\",\n            regex : \"[[({]\"\n        }, {\n            token : \"rparen\",\n            regex : \"[\\\\])}]\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        }\n    ];\n\n    for (var i in this.$rules) {\n        this.$rules[i].unshift({\n            token: \"variable\",\n            regex: \"\\\\${\",\n            push: \"vm_start\"\n        });\n    }\n\n    this.normalizeRules();\n};\n\noop.inherits(VelocityHighlightRules, TextHighlightRules);\n\nexports.VelocityHighlightRules = VelocityHighlightRules;\n});\n\nace.define(\"ace/mode/folding/velocity\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var range = this.indentationBlock(session, row);\n        if (range)\n            return range;\n\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1 || line[startLevel] != \"##\")\n            return;\n\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var level = line.search(re);\n\n            if (level == -1)\n                continue;\n\n            if (line[level] != \"##\")\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        var next = session.getLine(row + 1);\n        var prev = session.getLine(row - 1);\n        var prevIndent = prev.search(/\\S/);\n        var nextIndent = next.search(/\\S/);\n\n        if (indent == -1) {\n            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? \"start\" : \"\";\n            return \"\";\n        }\n        if (prevIndent == -1) {\n            if (indent == nextIndent && line[indent] == \"##\" && next[indent] == \"##\") {\n                session.foldWidgets[row - 1] = \"\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"start\";\n            }\n        } else if (prevIndent == indent && line[indent] == \"##\" && prev[indent] == \"##\") {\n            if (session.getLine(row - 2).search(/\\S/) == -1) {\n                session.foldWidgets[row - 1] = \"start\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"\";\n            }\n        }\n\n        if (prevIndent!= -1 && prevIndent < indent)\n            session.foldWidgets[row - 1] = \"start\";\n        else\n            session.foldWidgets[row - 1] = \"\";\n\n        if (indent < nextIndent)\n            return \"start\";\n        else\n            return \"\";\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/velocity\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/html\",\"ace/mode/velocity_highlight_rules\",\"ace/mode/folding/velocity\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar HtmlMode = require(\"./html\").Mode;\nvar VelocityHighlightRules = require(\"./velocity_highlight_rules\").VelocityHighlightRules;\nvar FoldMode = require(\"./folding/velocity\").FoldMode;\n\nvar Mode = function() {\n    HtmlMode.call(this);\n    this.HighlightRules = VelocityHighlightRules;\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, HtmlMode);\n\n(function() {\n    this.lineCommentStart = \"##\";\n    this.blockComment = {start: \"#*\", end: \"*#\"};\n    this.$id = \"ace/mode/velocity\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-verilog.js",
    "content": "ace.define(\"ace/mode/verilog_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar VerilogHighlightRules = function() {\nvar keywords = \"always|and|assign|automatic|begin|buf|bufif0|bufif1|case|casex|casez|cell|cmos|config|\" +\n    \"deassign|default|defparam|design|disable|edge|else|end|endcase|endconfig|endfunction|endgenerate|endmodule|\" +\n    \"endprimitive|endspecify|endtable|endtask|event|for|force|forever|fork|function|generate|genvar|highz0|\" +\n    \"highz1|if|ifnone|incdir|include|initial|inout|input|instance|integer|join|large|liblist|library|localparam|\" +\n    \"macromodule|medium|module|nand|negedge|nmos|nor|noshowcancelled|not|notif0|notif1|or|output|parameter|pmos|\" +\n    \"posedge|primitive|pull0|pull1|pulldown|pullup|pulsestyle_onevent|pulsestyle_ondetect|rcmos|real|realtime|\" +\n    \"reg|release|repeat|rnmos|rpmos|rtran|rtranif0|rtranif1|scalared|showcancelled|signed|small|specify|specparam|\" +\n    \"strong0|strong1|supply0|supply1|table|task|time|tran|tranif0|tranif1|tri|tri0|tri1|triand|trior|trireg|\" +\n    \"unsigned|use|vectored|wait|wand|weak0|weak1|while|wire|wor|xnor|xor\" +\n    \"begin|bufif0|bufif1|case|casex|casez|config|else|end|endcase|endconfig|endfunction|\" +\n    \"endgenerate|endmodule|endprimitive|endspecify|endtable|endtask|for|forever|function|generate|if|ifnone|\" +\n    \"macromodule|module|primitive|repeat|specify|table|task|while\";\n\n    var builtinConstants = (\n        \"true|false|null\"\n    );\n\n    var builtinFunctions = (\n        \"count|min|max|avg|sum|rank|now|coalesce|main\"\n    );\n\n    var keywordMapper = this.createKeywordMapper({\n        \"support.function\": builtinFunctions,\n        \"keyword\": keywords,\n        \"constant.language\": builtinConstants\n    }, \"identifier\", true);\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment\",\n            regex : \"//.*$\"\n        }, {\n            token : \"string\",           // \" string\n            regex : '\".*?\"'\n        }, {\n            token : \"string\",           // ' string\n            regex : \"'.*?'\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"\\\\+|\\\\-|\\\\/|\\\\/\\\\/|%|<@>|@>|<@|&|\\\\^|~|<|>|<=|=>|==|!=|<>|=\"\n        }, {\n            token : \"paren.lparen\",\n            regex : \"[\\\\(]\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\)]\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        } ]\n    };\n};\n\noop.inherits(VerilogHighlightRules, TextHighlightRules);\n\nexports.VerilogHighlightRules = VerilogHighlightRules;\n});\n\nace.define(\"ace/mode/verilog\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/verilog_highlight_rules\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar VerilogHighlightRules = require(\"./verilog_highlight_rules\").VerilogHighlightRules;\nvar Range = require(\"../range\").Range;\n\nvar Mode = function() {\n    this.HighlightRules = VerilogHighlightRules;\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"//\";\n    this.blockComment = {start: \"/*\", end: \"*/\"};\n\n    this.$id = \"ace/mode/verilog\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-vhdl.js",
    "content": "ace.define(\"ace/mode/vhdl_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar VHDLHighlightRules = function() {\n\n\n    \n    var keywords = \"access|after|ailas|all|architecture|assert|attribute|\"+\n                   \"begin|block|buffer|bus|case|component|configuration|\"+\n                   \"disconnect|downto|else|elsif|end|entity|file|for|function|\"+\n                   \"generate|generic|guarded|if|impure|in|inertial|inout|is|\"+\n                   \"label|linkage|literal|loop|mapnew|next|of|on|open|\"+\n                   \"others|out|port|process|pure|range|record|reject|\"+\n                   \"report|return|select|shared|subtype|then|to|transport|\"+\n                   \"type|unaffected|united|until|wait|when|while|with\";\n    \n    var storageType = \"bit|bit_vector|boolean|character|integer|line|natural|\"+\n                      \"positive|real|register|severity|signal|signed|\"+\n                      \"std_logic|std_logic_vector|string||text|time|unsigned|\"+\n                      \"variable\";\n    \n    var storageModifiers = \"array|constant\";\n    \n    var keywordOperators = \"abs|and|mod|nand|nor|not|rem|rol|ror|sla|sll|sra\"+\n                           \"srl|xnor|xor\";\n    \n    var builtinConstants = (\n        \"true|false|null\"\n    );\n\n\n    var keywordMapper = this.createKeywordMapper({\n        \"keyword.operator\": keywordOperators,\n        \"keyword\": keywords,\n        \"constant.language\": builtinConstants,\n        \"storage.modifier\": storageModifiers,\n        \"storage.type\": storageType\n    }, \"identifier\", true);\n\n    this.$rules = {\n        \"start\" : [ {\n            token : \"comment\",\n            regex : \"--.*$\"\n        }, {\n            token : \"string\",           // \" string\n            regex : '\".*?\"'\n        }, {\n            token : \"string\",           // ' string\n            regex : \"'.*?'\"\n        }, {\n            token : \"constant.numeric\", // float\n            regex : \"[+-]?\\\\d+(?:(?:\\\\.\\\\d*)?(?:[eE][+-]?\\\\d+)?)?\\\\b\"\n        }, {\n            token : \"keyword\", // pre-compiler directives\n            regex : \"\\\\s*(?:library|package|use)\\\\b\",\n        }, {\n            token : keywordMapper,\n            regex : \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\"\n        }, {\n            token : \"keyword.operator\",\n            regex : \"&|\\\\*|\\\\+|\\\\-|\\\\/|<|=|>|\\\\||=>|\\\\*\\\\*|:=|\\\\/=|>=|<=|<>\" \n        }, {\n              token : \"punctuation.operator\",\n              regex : \"\\\\'|\\\\:|\\\\,|\\\\;|\\\\.\"\n        },{\n            token : \"paren.lparen\",\n            regex : \"[[(]\"\n        }, {\n            token : \"paren.rparen\",\n            regex : \"[\\\\])]\"\n        }, {\n            token : \"text\",\n            regex : \"\\\\s+\"\n        } ],\n\n       \n    };\n};\n\noop.inherits(VHDLHighlightRules, TextHighlightRules);\n\nexports.VHDLHighlightRules = VHDLHighlightRules;\n});\n\nace.define(\"ace/mode/vhdl\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/vhdl_highlight_rules\",\"ace/range\"], function(require, exports, module) {\r\n\"use strict\";\r\n\r\nvar oop = require(\"../lib/oop\");\r\nvar TextMode = require(\"./text\").Mode;\r\nvar VHDLHighlightRules = require(\"./vhdl_highlight_rules\").VHDLHighlightRules;\r\nvar Range = require(\"../range\").Range;\r\n\r\nvar Mode = function() {\r\n    this.HighlightRules = VHDLHighlightRules;\r\n};\r\noop.inherits(Mode, TextMode);\r\n\r\n(function() {\r\n\r\n    this.lineCommentStart = \"--\";\r\n\r\n    this.$id = \"ace/mode/vhdl\";\n}).call(Mode.prototype);\r\n\r\nexports.Mode = Mode;\r\n\r\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-xml.js",
    "content": "ace.define(\"ace/mode/xml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar XmlHighlightRules = function(normalize) {\n    this.$rules = {\n        start : [\n            {token : \"string.cdata.xml\", regex : \"<\\\\!\\\\[CDATA\\\\[\", next : \"cdata\"},\n            {\n                token : [\"punctuation.xml-decl.xml\", \"keyword.xml-decl.xml\"],\n                regex : \"(<\\\\?)(xml)(?=[\\\\s])\", next : \"xml_decl\", caseInsensitive: true\n            },\n            {\n                token : [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n                regex : \"(<\\\\?)([-_a-zA-Z0-9]+)\", next : \"processing_instruction\",\n            },\n            {token : \"comment.xml\", regex : \"<\\\\!--\", next : \"comment\"},\n            {\n                token : [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n                regex : \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\", next : \"doctype\", caseInsensitive: true\n            },\n            {include : \"tag\"},\n            {token : \"text.end-tag-open.xml\", regex: \"</\"},\n            {token : \"text.tag-open.xml\", regex: \"<\"},\n            {include : \"reference\"},\n            {defaultToken : \"text.xml\"}\n        ],\n\n        xml_decl : [{\n            token : \"entity.other.attribute-name.decl-attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.decl-attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"whitespace\"\n        }, {\n            include: \"string\"\n        }, {\n            token : \"punctuation.xml-decl.xml\",\n            regex : \"\\\\?>\",\n            next : \"start\"\n        }],\n\n        processing_instruction : [\n            {token : \"punctuation.instruction.xml\", regex : \"\\\\?>\", next : \"start\"},\n            {defaultToken : \"instruction.xml\"}\n        ],\n\n        doctype : [\n            {include : \"whitespace\"},\n            {include : \"string\"},\n            {token : \"xml-pe.doctype.xml\", regex : \">\", next : \"start\"},\n            {token : \"xml-pe.xml\", regex : \"[-_a-zA-Z0-9:]+\"},\n            {token : \"punctuation.int-subset\", regex : \"\\\\[\", push : \"int_subset\"}\n        ],\n\n        int_subset : [{\n            token : \"text.xml\",\n            regex : \"\\\\s+\"\n        }, {\n            token: \"punctuation.int-subset.xml\",\n            regex: \"]\",\n            next: \"pop\"\n        }, {\n            token : [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n            regex : \"(<\\\\!)([-_a-zA-Z0-9]+)\",\n            push : [{\n                token : \"text\",\n                regex : \"\\\\s+\"\n            },\n            {\n                token : \"punctuation.markup-decl.xml\",\n                regex : \">\",\n                next : \"pop\"\n            },\n            {include : \"string\"}]\n        }],\n\n        cdata : [\n            {token : \"string.cdata.xml\", regex : \"\\\\]\\\\]>\", next : \"start\"},\n            {token : \"text.xml\", regex : \"\\\\s+\"},\n            {token : \"text.xml\", regex : \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\"}\n        ],\n\n        comment : [\n            {token : \"comment.xml\", regex : \"-->\", next : \"start\"},\n            {defaultToken : \"comment.xml\"}\n        ],\n\n        reference : [{\n            token : \"constant.language.escape.reference.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        attr_reference : [{\n            token : \"constant.language.escape.reference.attribute-value.xml\",\n            regex : \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\"\n        }],\n\n        tag : [{\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n            regex : \"(?:(<)|(</))((?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+)\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : \"start\"}\n            ]\n        }],\n\n        tag_whitespace : [\n            {token : \"text.tag-whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        whitespace : [\n            {token : \"text.whitespace.xml\", regex : \"\\\\s+\"}\n        ],\n        string: [{\n            token : \"string.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.xml\", regex: \"'\", next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }, {\n            token : \"string.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.xml\", regex: '\"', next: \"pop\"},\n                {defaultToken : \"string.xml\"}\n            ]\n        }],\n\n        attributes: [{\n            token : \"entity.other.attribute-name.xml\",\n            regex : \"(?:[-_a-zA-Z0-9]+:)?[-_a-zA-Z0-9]+\"\n        }, {\n            token : \"keyword.operator.attribute-equals.xml\",\n            regex : \"=\"\n        }, {\n            include: \"tag_whitespace\"\n        }, {\n            include: \"attribute_value\"\n        }],\n\n        attribute_value: [{\n            token : \"string.attribute-value.xml\",\n            regex : \"'\",\n            push : [\n                {token : \"string.attribute-value.xml\", regex: \"'\", next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }, {\n            token : \"string.attribute-value.xml\",\n            regex : '\"',\n            push : [\n                {token : \"string.attribute-value.xml\", regex: '\"', next: \"pop\"},\n                {include : \"attr_reference\"},\n                {defaultToken : \"string.attribute-value.xml\"}\n            ]\n        }]\n    };\n\n    if (this.constructor === XmlHighlightRules)\n        this.normalizeRules();\n};\n\n\n(function() {\n\n    this.embedTagRules = function(HighlightRules, prefix, tag){\n        this.$rules.tag.unshift({\n            token : [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: [\n                {include : \"attributes\"},\n                {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\", next : prefix + \"start\"}\n            ]\n        });\n\n        this.$rules[tag + \"-end\"] = [\n            {include : \"attributes\"},\n            {token : \"meta.tag.punctuation.tag-close.xml\", regex : \"/?>\",  next: \"start\",\n                onMatch : function(value, currentState, stack) {\n                    stack.splice(0);\n                    return this.token;\n            }}\n        ]\n\n        this.embedRules(HighlightRules, prefix, [{\n            token: [\"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.\" + tag + \".tag-name.xml\"],\n            regex : \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n            next: tag + \"-end\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"<\\\\!\\\\[CDATA\\\\[\"\n        }, {\n            token: \"string.cdata.xml\",\n            regex : \"\\\\]\\\\]>\"\n        }]);\n    };\n\n}).call(TextHighlightRules.prototype);\n\noop.inherits(XmlHighlightRules, TextHighlightRules);\n\nexports.XmlHighlightRules = XmlHighlightRules;\n});\n\nace.define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nvar XmlBehaviour = function () {\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selected = session.doc.getTextRange(editor.getSelectionRange());\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            }\n\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (rightChar == quote && (is(token, \"attribute-value\") || is(token, \"string\"))) {\n                return {\n                    text: \"\",\n                    selection: [1, 1]\n                };\n            }\n\n            if (!token)\n                token = iterator.stepBackward();\n\n            if (!token)\n                return;\n\n            while (is(token, \"tag-whitespace\") || is(token, \"whitespace\")) {\n                token = iterator.stepBackward();\n            }\n            var rightSpace = !rightChar || rightChar.match(/\\s/);\n            if (is(token, \"attribute-equals\") && (rightSpace || rightChar == '>') || (is(token, \"decl-attribute-equals\") && (rightSpace || rightChar == '?'))) {\n                return {\n                    text: quote + quote,\n                    selection: [1, 1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken() || iterator.stepBackward();\n            if (!token || !(is(token, \"tag-name\") || is(token, \"tag-whitespace\") || is(token, \"attribute-name\") || is(token, \"attribute-equals\") || is(token, \"attribute-value\")))\n                return;\n            if (is(token, \"reference.attribute-value\"))\n                return;\n            if (is(token, \"attribute-value\")) {\n                var firstChar = token.value.charAt(0);\n                if (firstChar == '\"' || firstChar == \"'\") {\n                    var lastChar = token.value.charAt(token.value.length - 1);\n                    var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length;\n                    if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar)\n                        return;\n                }\n            }\n            while (!is(token, \"tag-name\")) {\n                token = iterator.stepBackward();\n            }\n\n            var tokenRow = iterator.getCurrentTokenRow();\n            var tokenColumn = iterator.getCurrentTokenColumn();\n            if (is(iterator.stepBackward(), \"end-tag-open\"))\n                return;\n\n            var element = token.value;\n            if (tokenRow == position.row)\n                element = element.substring(0, position.column - tokenColumn);\n\n            if (this.voidElements.hasOwnProperty(element.toLowerCase()))\n                 return;\n\n            return {\n               text: \">\" + \"</\" + element + \">\",\n               selection: [1, 1]\n            };\n        }\n    });\n\n    this.add(\"autoindent\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.getLine(cursor.row);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (token && token.type.indexOf(\"tag-close\") !== -1) {\n                while (token && token.type.indexOf(\"tag-name\") === -1) {\n                    token = iterator.stepBackward();\n                }\n\n                if (!token) {\n                    return;\n                }\n\n                var tag = token.value;\n                var row = iterator.getCurrentTokenRow();\n                token = iterator.stepBackward();\n                if (!token || token.type.indexOf(\"end-tag\") !== -1) {\n                    return;\n                }\n\n                if (this.voidElements && !this.voidElements[tag]) {\n                    var nextToken = session.getTokenAt(cursor.row, cursor.column+1);\n                    var line = session.getLine(row);\n                    var nextIndent = this.$getIndent(line);\n                    var indent = nextIndent + session.getTabString();\n\n                    if (nextToken && nextToken.value === \"</\") {\n                        return {\n                            text: \"\\n\" + indent + \"\\n\" + nextIndent,\n                            selection: [1, indent.length, 1, indent.length]\n                        };\n                    } else {\n                        return {\n                            text: \"\\n\" + indent\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n};\n\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\nace.define(\"ace/mode/folding/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/range\",\"ace/mode/folding/fold_mode\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar lang = require(\"../../lib/lang\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nvar FoldMode = exports.FoldMode = function(voidElements, optionalEndTags) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n    this.optionalEndTags = oop.mixin({}, this.voidElements);\n    if (optionalEndTags)\n        oop.mixin(this.optionalEndTags, optionalEndTags);\n    \n};\noop.inherits(FoldMode, BaseFoldMode);\n\nvar Tag = function() {\n    this.tagName = \"\";\n    this.closing = false;\n    this.selfClosing = false;\n    this.start = {row: 0, column: 0};\n    this.end = {row: 0, column: 0};\n};\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\n(function() {\n\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var tag = this._getFirstTagInLine(session, row);\n\n        if (!tag)\n            return \"\";\n\n        if (tag.closing || (!tag.tagName && tag.selfClosing))\n            return foldStyle == \"markbeginend\" ? \"end\" : \"\";\n\n        if (!tag.tagName || tag.selfClosing || this.voidElements.hasOwnProperty(tag.tagName.toLowerCase()))\n            return \"\";\n\n        if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column))\n            return \"\";\n\n        return \"start\";\n    };\n    this._getFirstTagInLine = function(session, row) {\n        var tokens = session.getTokens(row);\n        var tag = new Tag();\n\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (is(token, \"tag-open\")) {\n                tag.end.column = tag.start.column + token.value.length;\n                tag.closing = is(token, \"end-tag-open\");\n                token = tokens[++i];\n                if (!token)\n                    return null;\n                tag.tagName = token.value;\n                tag.end.column += token.value.length;\n                for (i++; i < tokens.length; i++) {\n                    token = tokens[i];\n                    tag.end.column += token.value.length;\n                    if (is(token, \"tag-close\")) {\n                        tag.selfClosing = token.value == '/>';\n                        break;\n                    }\n                }\n                return tag;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == '/>';\n                return tag;\n            }\n            tag.start.column += token.value.length;\n        }\n\n        return null;\n    };\n\n    this._findEndTagInLine = function(session, row, tagName, startColumn) {\n        var tokens = session.getTokens(row);\n        var column = 0;\n        for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            column += token.value.length;\n            if (column < startColumn)\n                continue;\n            if (is(token, \"end-tag-open\")) {\n                token = tokens[i + 1];\n                if (token && token.value == tagName)\n                    return true;\n            }\n        }\n        return false;\n    };\n    this._readTagForward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n                iterator.stepForward();\n                return tag;\n            }\n        } while(token = iterator.stepForward());\n\n        return null;\n    };\n    \n    this._readTagBackward = function(iterator) {\n        var token = iterator.getCurrentToken();\n        if (!token)\n            return null;\n\n        var tag = new Tag();\n        do {\n            if (is(token, \"tag-open\")) {\n                tag.closing = is(token, \"end-tag-open\");\n                tag.start.row = iterator.getCurrentTokenRow();\n                tag.start.column = iterator.getCurrentTokenColumn();\n                iterator.stepBackward();\n                return tag;\n            } else if (is(token, \"tag-name\")) {\n                tag.tagName = token.value;\n            } else if (is(token, \"tag-close\")) {\n                tag.selfClosing = token.value == \"/>\";\n                tag.end.row = iterator.getCurrentTokenRow();\n                tag.end.column = iterator.getCurrentTokenColumn() + token.value.length;\n            }\n        } while(token = iterator.stepBackward());\n\n        return null;\n    };\n    \n    this._pop = function(stack, tag) {\n        while (stack.length) {\n            \n            var top = stack[stack.length-1];\n            if (!tag || top.tagName == tag.tagName) {\n                return stack.pop();\n            }\n            else if (this.optionalEndTags.hasOwnProperty(top.tagName)) {\n                stack.pop();\n                continue;\n            } else {\n                return null;\n            }\n        }\n    };\n    \n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var firstTag = this._getFirstTagInLine(session, row);\n        \n        if (!firstTag)\n            return null;\n        \n        var isBackward = firstTag.closing || firstTag.selfClosing;\n        var stack = [];\n        var tag;\n        \n        if (!isBackward) {\n            var iterator = new TokenIterator(session, row, firstTag.start.column);\n            var start = {\n                row: row,\n                column: firstTag.start.column + firstTag.tagName.length + 2\n            };\n            while (tag = this._readTagForward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0)\n                        return Range.fromPoints(start, tag.start);\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        else {\n            var iterator = new TokenIterator(session, row, firstTag.end.column);\n            var end = {\n                row: row,\n                column: firstTag.start.column\n            };\n            \n            while (tag = this._readTagBackward(iterator)) {\n                if (tag.selfClosing) {\n                    if (!stack.length) {\n                        tag.start.column += tag.tagName.length + 2;\n                        tag.end.column -= 2;\n                        return Range.fromPoints(tag.start, tag.end);\n                    } else\n                        continue;\n                }\n                \n                if (!tag.closing) {\n                    this._pop(stack, tag);\n                    if (stack.length == 0) {\n                        tag.start.column += tag.tagName.length + 2;\n                        return Range.fromPoints(tag.start, end);\n                    }\n                }\n                else {\n                    stack.push(tag);\n                }\n            }\n        }\n        \n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/xml_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/xml\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar TextMode = require(\"./text\").Mode;\nvar XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\nvar XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\nvar XmlFoldMode = require(\"./folding/xml\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = XmlHighlightRules;\n    this.$behaviour = new XmlBehaviour();\n    this.foldingRules = new XmlFoldMode();\n};\n\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.voidElements = lang.arrayToMap([]);\n\n    this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n    this.$id = \"ace/mode/xml\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-xquery.js",
    "content": "ace.define(\"ace/mode/xquery/xquery_lexer\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\nmodule.exports = (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);throw new Error(\"Cannot find module '\"+o+\"'\")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.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})({\n1:[function(_dereq_,module,exports){\n                                                            var XQueryTokenizer = exports.XQueryTokenizer = function XQueryTokenizer(string, parsingEventHandler)\n                                                            {\n                                                              init(string, parsingEventHandler);\n  var self = this;\n\n  this.ParseException = function(b, e, s, o, x)\n  {\n    var\n      begin = b,\n      end = e,\n      state = s,\n      offending = o,\n      expected = x;\n\n    this.getBegin = function() {return begin;};\n    this.getEnd = function() {return end;};\n    this.getState = function() {return state;};\n    this.getExpected = function() {return expected;};\n    this.getOffending = function() {return offending;};\n\n    this.getMessage = function()\n    {\n      return offending < 0 ? \"lexical analysis failed\" : \"syntax error\";\n    };\n  };\n\n  function init(string, parsingEventHandler)\n  {\n    eventHandler = parsingEventHandler;\n    input = string;\n    size = string.length;\n    reset(0, 0, 0);\n  }\n\n  this.getInput = function()\n  {\n    return input;\n  };\n\n  function reset(l, b, e)\n  {\n            b0 = b; e0 = b;\n    l1 = l; b1 = b; e1 = e;\n    end = e;\n    eventHandler.reset(input);\n  }\n\n  this.getOffendingToken = function(e)\n  {\n    var o = e.getOffending();\n    return o >= 0 ? XQueryTokenizer.TOKEN[o] : null;\n  };\n\n  this.getExpectedTokenSet = function(e)\n  {\n    var expected;\n    if (e.getExpected() < 0)\n    {\n      expected = XQueryTokenizer.getTokenSet(- e.getState());\n    }\n    else\n    {\n      expected = [XQueryTokenizer.TOKEN[e.getExpected()]];\n    }\n    return expected;\n  };\n\n  this.getErrorMessage = function(e)\n  {\n    var tokenSet = this.getExpectedTokenSet(e);\n    var found = this.getOffendingToken(e);\n    var prefix = input.substring(0, e.getBegin());\n    var lines = prefix.split(\"\\n\");\n    var line = lines.length;\n    var column = lines[line - 1].length + 1;\n    var size = e.getEnd() - e.getBegin();\n    return e.getMessage()\n         + (found == null ? \"\" : \", found \" + found)\n         + \"\\nwhile expecting \"\n         + (tokenSet.length == 1 ? tokenSet[0] : (\"[\" + tokenSet.join(\", \") + \"]\"))\n         + \"\\n\"\n         + (size == 0 || found != null ? \"\" : \"after successfully scanning \" + size + \" characters beginning \")\n         + \"at line \" + line + \", column \" + column + \":\\n...\"\n         + input.substring(e.getBegin(), Math.min(input.length, e.getBegin() + 64))\n         + \"...\";\n  };\n\n  this.parse_start = function()\n  {\n    eventHandler.startNonterminal(\"start\", e0);\n    lookahead1W(14);                // ModuleDecl | Annotation | OptionDecl | Operator | Variable | Tag | AttrTest |\n    switch (l1)\n    {\n    case 55:                        // '<![CDATA['\n      shift(55);                    // '<![CDATA['\n      break;\n    case 54:                        // '<!--'\n      shift(54);                    // '<!--'\n      break;\n    case 56:                        // '<?'\n      shift(56);                    // '<?'\n      break;\n    case 40:                        // '(#'\n      shift(40);                    // '(#'\n      break;\n    case 42:                        // '(:~'\n      shift(42);                    // '(:~'\n      break;\n    case 41:                        // '(:'\n      shift(41);                    // '(:'\n      break;\n    case 35:                        // '\"'\n      shift(35);                    // '\"'\n      break;\n    case 38:                        // \"'\"\n      shift(38);                    // \"'\"\n      break;\n    case 274:                       // '}'\n      shift(274);                   // '}'\n      break;\n    case 271:                       // '{'\n      shift(271);                   // '{'\n      break;\n    case 39:                        // '('\n      shift(39);                    // '('\n      break;\n    case 43:                        // ')'\n      shift(43);                    // ')'\n      break;\n    case 49:                        // '/'\n      shift(49);                    // '/'\n      break;\n    case 62:                        // '['\n      shift(62);                    // '['\n      break;\n    case 63:                        // ']'\n      shift(63);                    // ']'\n      break;\n    case 46:                        // ','\n      shift(46);                    // ','\n      break;\n    case 48:                        // '.'\n      shift(48);                    // '.'\n      break;\n    case 53:                        // ';'\n      shift(53);                    // ';'\n      break;\n    case 51:                        // ':'\n      shift(51);                    // ':'\n      break;\n    case 34:                        // '!'\n      shift(34);                    // '!'\n      break;\n    case 273:                       // '|'\n      shift(273);                   // '|'\n      break;\n    case 2:                         // Annotation\n      shift(2);                     // Annotation\n      break;\n    case 1:                         // ModuleDecl\n      shift(1);                     // ModuleDecl\n      break;\n    case 3:                         // OptionDecl\n      shift(3);                     // OptionDecl\n      break;\n    case 12:                        // AttrTest\n      shift(12);                    // AttrTest\n      break;\n    case 13:                        // Wildcard\n      shift(13);                    // Wildcard\n      break;\n    case 15:                        // IntegerLiteral\n      shift(15);                    // IntegerLiteral\n      break;\n    case 16:                        // DecimalLiteral\n      shift(16);                    // DecimalLiteral\n      break;\n    case 17:                        // DoubleLiteral\n      shift(17);                    // DoubleLiteral\n      break;\n    case 5:                         // Variable\n      shift(5);                     // Variable\n      break;\n    case 6:                         // Tag\n      shift(6);                     // Tag\n      break;\n    case 4:                         // Operator\n      shift(4);                     // Operator\n      break;\n    case 33:                        // EOF\n      shift(33);                    // EOF\n      break;\n    default:\n      parse_EQName();\n    }\n    eventHandler.endNonterminal(\"start\", e0);\n  };\n\n  this.parse_StartTag = function()\n  {\n    eventHandler.startNonterminal(\"StartTag\", e0);\n    lookahead1W(8);                 // QName | S^WS | EOF | '\"' | \"'\" | '/>' | '=' | '>'\n    switch (l1)\n    {\n    case 58:                        // '>'\n      shift(58);                    // '>'\n      break;\n    case 50:                        // '/>'\n      shift(50);                    // '/>'\n      break;\n    case 27:                        // QName\n      shift(27);                    // QName\n      break;\n    case 57:                        // '='\n      shift(57);                    // '='\n      break;\n    case 35:                        // '\"'\n      shift(35);                    // '\"'\n      break;\n    case 38:                        // \"'\"\n      shift(38);                    // \"'\"\n      break;\n    default:\n      shift(33);                    // EOF\n    }\n    eventHandler.endNonterminal(\"StartTag\", e0);\n  };\n\n  this.parse_TagContent = function()\n  {\n    eventHandler.startNonterminal(\"TagContent\", e0);\n    lookahead1(11);                 // Tag | EndTag | PredefinedEntityRef | ElementContentChar | CharRef | EOF |\n    switch (l1)\n    {\n    case 23:                        // ElementContentChar\n      shift(23);                    // ElementContentChar\n      break;\n    case 6:                         // Tag\n      shift(6);                     // Tag\n      break;\n    case 7:                         // EndTag\n      shift(7);                     // EndTag\n      break;\n    case 55:                        // '<![CDATA['\n      shift(55);                    // '<![CDATA['\n      break;\n    case 54:                        // '<!--'\n      shift(54);                    // '<!--'\n      break;\n    case 18:                        // PredefinedEntityRef\n      shift(18);                    // PredefinedEntityRef\n      break;\n    case 29:                        // CharRef\n      shift(29);                    // CharRef\n      break;\n    case 272:                       // '{{'\n      shift(272);                   // '{{'\n      break;\n    case 275:                       // '}}'\n      shift(275);                   // '}}'\n      break;\n    case 271:                       // '{'\n      shift(271);                   // '{'\n      break;\n    default:\n      shift(33);                    // EOF\n    }\n    eventHandler.endNonterminal(\"TagContent\", e0);\n  };\n\n  this.parse_AposAttr = function()\n  {\n    eventHandler.startNonterminal(\"AposAttr\", e0);\n    lookahead1(10);                 // PredefinedEntityRef | EscapeApos | AposAttrContentChar | CharRef | EOF | \"'\" |\n    switch (l1)\n    {\n    case 20:                        // EscapeApos\n      shift(20);                    // EscapeApos\n      break;\n    case 25:                        // AposAttrContentChar\n      shift(25);                    // AposAttrContentChar\n      break;\n    case 18:                        // PredefinedEntityRef\n      shift(18);                    // PredefinedEntityRef\n      break;\n    case 29:                        // CharRef\n      shift(29);                    // CharRef\n      break;\n    case 272:                       // '{{'\n      shift(272);                   // '{{'\n      break;\n    case 275:                       // '}}'\n      shift(275);                   // '}}'\n      break;\n    case 271:                       // '{'\n      shift(271);                   // '{'\n      break;\n    case 38:                        // \"'\"\n      shift(38);                    // \"'\"\n      break;\n    default:\n      shift(33);                    // EOF\n    }\n    eventHandler.endNonterminal(\"AposAttr\", e0);\n  };\n\n  this.parse_QuotAttr = function()\n  {\n    eventHandler.startNonterminal(\"QuotAttr\", e0);\n    lookahead1(9);                  // PredefinedEntityRef | EscapeQuot | QuotAttrContentChar | CharRef | EOF | '\"' |\n    switch (l1)\n    {\n    case 19:                        // EscapeQuot\n      shift(19);                    // EscapeQuot\n      break;\n    case 24:                        // QuotAttrContentChar\n      shift(24);                    // QuotAttrContentChar\n      break;\n    case 18:                        // PredefinedEntityRef\n      shift(18);                    // PredefinedEntityRef\n      break;\n    case 29:                        // CharRef\n      shift(29);                    // CharRef\n      break;\n    case 272:                       // '{{'\n      shift(272);                   // '{{'\n      break;\n    case 275:                       // '}}'\n      shift(275);                   // '}}'\n      break;\n    case 271:                       // '{'\n      shift(271);                   // '{'\n      break;\n    case 35:                        // '\"'\n      shift(35);                    // '\"'\n      break;\n    default:\n      shift(33);                    // EOF\n    }\n    eventHandler.endNonterminal(\"QuotAttr\", e0);\n  };\n\n  this.parse_CData = function()\n  {\n    eventHandler.startNonterminal(\"CData\", e0);\n    lookahead1(1);                  // CDataSectionContents | EOF | ']]>'\n    switch (l1)\n    {\n    case 11:                        // CDataSectionContents\n      shift(11);                    // CDataSectionContents\n      break;\n    case 64:                        // ']]>'\n      shift(64);                    // ']]>'\n      break;\n    default:\n      shift(33);                    // EOF\n    }\n    eventHandler.endNonterminal(\"CData\", e0);\n  };\n\n  this.parse_XMLComment = function()\n  {\n    eventHandler.startNonterminal(\"XMLComment\", e0);\n    lookahead1(0);                  // DirCommentContents | EOF | '-->'\n    switch (l1)\n    {\n    case 9:                         // DirCommentContents\n      shift(9);                     // DirCommentContents\n      break;\n    case 47:                        // '-->'\n      shift(47);                    // '-->'\n      break;\n    default:\n      shift(33);                    // EOF\n    }\n    eventHandler.endNonterminal(\"XMLComment\", e0);\n  };\n\n  this.parse_PI = function()\n  {\n    eventHandler.startNonterminal(\"PI\", e0);\n    lookahead1(3);                  // DirPIContents | EOF | '?' | '?>'\n    switch (l1)\n    {\n    case 10:                        // DirPIContents\n      shift(10);                    // DirPIContents\n      break;\n    case 59:                        // '?'\n      shift(59);                    // '?'\n      break;\n    case 60:                        // '?>'\n      shift(60);                    // '?>'\n      break;\n    default:\n      shift(33);                    // EOF\n    }\n    eventHandler.endNonterminal(\"PI\", e0);\n  };\n\n  this.parse_Pragma = function()\n  {\n    eventHandler.startNonterminal(\"Pragma\", e0);\n    lookahead1(2);                  // PragmaContents | EOF | '#' | '#)'\n    switch (l1)\n    {\n    case 8:                         // PragmaContents\n      shift(8);                     // PragmaContents\n      break;\n    case 36:                        // '#'\n      shift(36);                    // '#'\n      break;\n    case 37:                        // '#)'\n      shift(37);                    // '#)'\n      break;\n    default:\n      shift(33);                    // EOF\n    }\n    eventHandler.endNonterminal(\"Pragma\", e0);\n  };\n\n  this.parse_Comment = function()\n  {\n    eventHandler.startNonterminal(\"Comment\", e0);\n    lookahead1(4);                  // CommentContents | EOF | '(:' | ':)'\n    switch (l1)\n    {\n    case 52:                        // ':)'\n      shift(52);                    // ':)'\n      break;\n    case 41:                        // '(:'\n      shift(41);                    // '(:'\n      break;\n    case 30:                        // CommentContents\n      shift(30);                    // CommentContents\n      break;\n    default:\n      shift(33);                    // EOF\n    }\n    eventHandler.endNonterminal(\"Comment\", e0);\n  };\n\n  this.parse_CommentDoc = function()\n  {\n    eventHandler.startNonterminal(\"CommentDoc\", e0);\n    lookahead1(5);                  // DocTag | DocCommentContents | EOF | '(:' | ':)'\n    switch (l1)\n    {\n    case 31:                        // DocTag\n      shift(31);                    // DocTag\n      break;\n    case 32:                        // DocCommentContents\n      shift(32);                    // DocCommentContents\n      break;\n    case 52:                        // ':)'\n      shift(52);                    // ':)'\n      break;\n    case 41:                        // '(:'\n      shift(41);                    // '(:'\n      break;\n    default:\n      shift(33);                    // EOF\n    }\n    eventHandler.endNonterminal(\"CommentDoc\", e0);\n  };\n\n  this.parse_QuotString = function()\n  {\n    eventHandler.startNonterminal(\"QuotString\", e0);\n    lookahead1(6);                  // PredefinedEntityRef | EscapeQuot | QuotChar | CharRef | EOF | '\"'\n    switch (l1)\n    {\n    case 18:                        // PredefinedEntityRef\n      shift(18);                    // PredefinedEntityRef\n      break;\n    case 29:                        // CharRef\n      shift(29);                    // CharRef\n      break;\n    case 19:                        // EscapeQuot\n      shift(19);                    // EscapeQuot\n      break;\n    case 21:                        // QuotChar\n      shift(21);                    // QuotChar\n      break;\n    case 35:                        // '\"'\n      shift(35);                    // '\"'\n      break;\n    default:\n      shift(33);                    // EOF\n    }\n    eventHandler.endNonterminal(\"QuotString\", e0);\n  };\n\n  this.parse_AposString = function()\n  {\n    eventHandler.startNonterminal(\"AposString\", e0);\n    lookahead1(7);                  // PredefinedEntityRef | EscapeApos | AposChar | CharRef | EOF | \"'\"\n    switch (l1)\n    {\n    case 18:                        // PredefinedEntityRef\n      shift(18);                    // PredefinedEntityRef\n      break;\n    case 29:                        // CharRef\n      shift(29);                    // CharRef\n      break;\n    case 20:                        // EscapeApos\n      shift(20);                    // EscapeApos\n      break;\n    case 22:                        // AposChar\n      shift(22);                    // AposChar\n      break;\n    case 38:                        // \"'\"\n      shift(38);                    // \"'\"\n      break;\n    default:\n      shift(33);                    // EOF\n    }\n    eventHandler.endNonterminal(\"AposString\", e0);\n  };\n\n  this.parse_Prefix = function()\n  {\n    eventHandler.startNonterminal(\"Prefix\", e0);\n    lookahead1W(13);                // NCName^Token | S^WS | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' |\n    whitespace();\n    parse_NCName();\n    eventHandler.endNonterminal(\"Prefix\", e0);\n  };\n\n  this.parse__EQName = function()\n  {\n    eventHandler.startNonterminal(\"_EQName\", e0);\n    lookahead1W(12);                // EQName^Token | S^WS | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' |\n    whitespace();\n    parse_EQName();\n    eventHandler.endNonterminal(\"_EQName\", e0);\n  };\n\n  function parse_EQName()\n  {\n    eventHandler.startNonterminal(\"EQName\", e0);\n    switch (l1)\n    {\n    case 77:                        // 'attribute'\n      shift(77);                    // 'attribute'\n      break;\n    case 91:                        // 'comment'\n      shift(91);                    // 'comment'\n      break;\n    case 115:                       // 'document-node'\n      shift(115);                   // 'document-node'\n      break;\n    case 116:                       // 'element'\n      shift(116);                   // 'element'\n      break;\n    case 119:                       // 'empty-sequence'\n      shift(119);                   // 'empty-sequence'\n      break;\n    case 140:                       // 'function'\n      shift(140);                   // 'function'\n      break;\n    case 147:                       // 'if'\n      shift(147);                   // 'if'\n      break;\n    case 160:                       // 'item'\n      shift(160);                   // 'item'\n      break;\n    case 180:                       // 'namespace-node'\n      shift(180);                   // 'namespace-node'\n      break;\n    case 186:                       // 'node'\n      shift(186);                   // 'node'\n      break;\n    case 211:                       // 'processing-instruction'\n      shift(211);                   // 'processing-instruction'\n      break;\n    case 221:                       // 'schema-attribute'\n      shift(221);                   // 'schema-attribute'\n      break;\n    case 222:                       // 'schema-element'\n      shift(222);                   // 'schema-element'\n      break;\n    case 238:                       // 'switch'\n      shift(238);                   // 'switch'\n      break;\n    case 239:                       // 'text'\n      shift(239);                   // 'text'\n      break;\n    case 248:                       // 'typeswitch'\n      shift(248);                   // 'typeswitch'\n      break;\n    default:\n      parse_FunctionName();\n    }\n    eventHandler.endNonterminal(\"EQName\", e0);\n  }\n\n  function parse_FunctionName()\n  {\n    eventHandler.startNonterminal(\"FunctionName\", e0);\n    switch (l1)\n    {\n    case 14:                        // EQName^Token\n      shift(14);                    // EQName^Token\n      break;\n    case 65:                        // 'after'\n      shift(65);                    // 'after'\n      break;\n    case 68:                        // 'ancestor'\n      shift(68);                    // 'ancestor'\n      break;\n    case 69:                        // 'ancestor-or-self'\n      shift(69);                    // 'ancestor-or-self'\n      break;\n    case 70:                        // 'and'\n      shift(70);                    // 'and'\n      break;\n    case 74:                        // 'as'\n      shift(74);                    // 'as'\n      break;\n    case 75:                        // 'ascending'\n      shift(75);                    // 'ascending'\n      break;\n    case 79:                        // 'before'\n      shift(79);                    // 'before'\n      break;\n    case 83:                        // 'case'\n      shift(83);                    // 'case'\n      break;\n    case 84:                        // 'cast'\n      shift(84);                    // 'cast'\n      break;\n    case 85:                        // 'castable'\n      shift(85);                    // 'castable'\n      break;\n    case 88:                        // 'child'\n      shift(88);                    // 'child'\n      break;\n    case 89:                        // 'collation'\n      shift(89);                    // 'collation'\n      break;\n    case 98:                        // 'copy'\n      shift(98);                    // 'copy'\n      break;\n    case 100:                       // 'count'\n      shift(100);                   // 'count'\n      break;\n    case 103:                       // 'declare'\n      shift(103);                   // 'declare'\n      break;\n    case 104:                       // 'default'\n      shift(104);                   // 'default'\n      break;\n    case 105:                       // 'delete'\n      shift(105);                   // 'delete'\n      break;\n    case 106:                       // 'descendant'\n      shift(106);                   // 'descendant'\n      break;\n    case 107:                       // 'descendant-or-self'\n      shift(107);                   // 'descendant-or-self'\n      break;\n    case 108:                       // 'descending'\n      shift(108);                   // 'descending'\n      break;\n    case 113:                       // 'div'\n      shift(113);                   // 'div'\n      break;\n    case 114:                       // 'document'\n      shift(114);                   // 'document'\n      break;\n    case 117:                       // 'else'\n      shift(117);                   // 'else'\n      break;\n    case 118:                       // 'empty'\n      shift(118);                   // 'empty'\n      break;\n    case 121:                       // 'end'\n      shift(121);                   // 'end'\n      break;\n    case 123:                       // 'eq'\n      shift(123);                   // 'eq'\n      break;\n    case 124:                       // 'every'\n      shift(124);                   // 'every'\n      break;\n    case 126:                       // 'except'\n      shift(126);                   // 'except'\n      break;\n    case 129:                       // 'first'\n      shift(129);                   // 'first'\n      break;\n    case 130:                       // 'following'\n      shift(130);                   // 'following'\n      break;\n    case 131:                       // 'following-sibling'\n      shift(131);                   // 'following-sibling'\n      break;\n    case 132:                       // 'for'\n      shift(132);                   // 'for'\n      break;\n    case 141:                       // 'ge'\n      shift(141);                   // 'ge'\n      break;\n    case 143:                       // 'group'\n      shift(143);                   // 'group'\n      break;\n    case 145:                       // 'gt'\n      shift(145);                   // 'gt'\n      break;\n    case 146:                       // 'idiv'\n      shift(146);                   // 'idiv'\n      break;\n    case 148:                       // 'import'\n      shift(148);                   // 'import'\n      break;\n    case 154:                       // 'insert'\n      shift(154);                   // 'insert'\n      break;\n    case 155:                       // 'instance'\n      shift(155);                   // 'instance'\n      break;\n    case 157:                       // 'intersect'\n      shift(157);                   // 'intersect'\n      break;\n    case 158:                       // 'into'\n      shift(158);                   // 'into'\n      break;\n    case 159:                       // 'is'\n      shift(159);                   // 'is'\n      break;\n    case 165:                       // 'last'\n      shift(165);                   // 'last'\n      break;\n    case 167:                       // 'le'\n      shift(167);                   // 'le'\n      break;\n    case 169:                       // 'let'\n      shift(169);                   // 'let'\n      break;\n    case 173:                       // 'lt'\n      shift(173);                   // 'lt'\n      break;\n    case 175:                       // 'mod'\n      shift(175);                   // 'mod'\n      break;\n    case 176:                       // 'modify'\n      shift(176);                   // 'modify'\n      break;\n    case 177:                       // 'module'\n      shift(177);                   // 'module'\n      break;\n    case 179:                       // 'namespace'\n      shift(179);                   // 'namespace'\n      break;\n    case 181:                       // 'ne'\n      shift(181);                   // 'ne'\n      break;\n    case 193:                       // 'only'\n      shift(193);                   // 'only'\n      break;\n    case 195:                       // 'or'\n      shift(195);                   // 'or'\n      break;\n    case 196:                       // 'order'\n      shift(196);                   // 'order'\n      break;\n    case 197:                       // 'ordered'\n      shift(197);                   // 'ordered'\n      break;\n    case 201:                       // 'parent'\n      shift(201);                   // 'parent'\n      break;\n    case 207:                       // 'preceding'\n      shift(207);                   // 'preceding'\n      break;\n    case 208:                       // 'preceding-sibling'\n      shift(208);                   // 'preceding-sibling'\n      break;\n    case 213:                       // 'rename'\n      shift(213);                   // 'rename'\n      break;\n    case 214:                       // 'replace'\n      shift(214);                   // 'replace'\n      break;\n    case 215:                       // 'return'\n      shift(215);                   // 'return'\n      break;\n    case 219:                       // 'satisfies'\n      shift(219);                   // 'satisfies'\n      break;\n    case 224:                       // 'self'\n      shift(224);                   // 'self'\n      break;\n    case 230:                       // 'some'\n      shift(230);                   // 'some'\n      break;\n    case 231:                       // 'stable'\n      shift(231);                   // 'stable'\n      break;\n    case 232:                       // 'start'\n      shift(232);                   // 'start'\n      break;\n    case 243:                       // 'to'\n      shift(243);                   // 'to'\n      break;\n    case 244:                       // 'treat'\n      shift(244);                   // 'treat'\n      break;\n    case 245:                       // 'try'\n      shift(245);                   // 'try'\n      break;\n    case 249:                       // 'union'\n      shift(249);                   // 'union'\n      break;\n    case 251:                       // 'unordered'\n      shift(251);                   // 'unordered'\n      break;\n    case 255:                       // 'validate'\n      shift(255);                   // 'validate'\n      break;\n    case 261:                       // 'where'\n      shift(261);                   // 'where'\n      break;\n    case 265:                       // 'with'\n      shift(265);                   // 'with'\n      break;\n    case 269:                       // 'xquery'\n      shift(269);                   // 'xquery'\n      break;\n    case 67:                        // 'allowing'\n      shift(67);                    // 'allowing'\n      break;\n    case 76:                        // 'at'\n      shift(76);                    // 'at'\n      break;\n    case 78:                        // 'base-uri'\n      shift(78);                    // 'base-uri'\n      break;\n    case 80:                        // 'boundary-space'\n      shift(80);                    // 'boundary-space'\n      break;\n    case 81:                        // 'break'\n      shift(81);                    // 'break'\n      break;\n    case 86:                        // 'catch'\n      shift(86);                    // 'catch'\n      break;\n    case 93:                        // 'construction'\n      shift(93);                    // 'construction'\n      break;\n    case 96:                        // 'context'\n      shift(96);                    // 'context'\n      break;\n    case 97:                        // 'continue'\n      shift(97);                    // 'continue'\n      break;\n    case 99:                        // 'copy-namespaces'\n      shift(99);                    // 'copy-namespaces'\n      break;\n    case 101:                       // 'decimal-format'\n      shift(101);                   // 'decimal-format'\n      break;\n    case 120:                       // 'encoding'\n      shift(120);                   // 'encoding'\n      break;\n    case 127:                       // 'exit'\n      shift(127);                   // 'exit'\n      break;\n    case 128:                       // 'external'\n      shift(128);                   // 'external'\n      break;\n    case 136:                       // 'ft-option'\n      shift(136);                   // 'ft-option'\n      break;\n    case 149:                       // 'in'\n      shift(149);                   // 'in'\n      break;\n    case 150:                       // 'index'\n      shift(150);                   // 'index'\n      break;\n    case 156:                       // 'integrity'\n      shift(156);                   // 'integrity'\n      break;\n    case 166:                       // 'lax'\n      shift(166);                   // 'lax'\n      break;\n    case 187:                       // 'nodes'\n      shift(187);                   // 'nodes'\n      break;\n    case 194:                       // 'option'\n      shift(194);                   // 'option'\n      break;\n    case 198:                       // 'ordering'\n      shift(198);                   // 'ordering'\n      break;\n    case 217:                       // 'revalidation'\n      shift(217);                   // 'revalidation'\n      break;\n    case 220:                       // 'schema'\n      shift(220);                   // 'schema'\n      break;\n    case 223:                       // 'score'\n      shift(223);                   // 'score'\n      break;\n    case 229:                       // 'sliding'\n      shift(229);                   // 'sliding'\n      break;\n    case 235:                       // 'strict'\n      shift(235);                   // 'strict'\n      break;\n    case 246:                       // 'tumbling'\n      shift(246);                   // 'tumbling'\n      break;\n    case 247:                       // 'type'\n      shift(247);                   // 'type'\n      break;\n    case 252:                       // 'updating'\n      shift(252);                   // 'updating'\n      break;\n    case 256:                       // 'value'\n      shift(256);                   // 'value'\n      break;\n    case 257:                       // 'variable'\n      shift(257);                   // 'variable'\n      break;\n    case 258:                       // 'version'\n      shift(258);                   // 'version'\n      break;\n    case 262:                       // 'while'\n      shift(262);                   // 'while'\n      break;\n    case 92:                        // 'constraint'\n      shift(92);                    // 'constraint'\n      break;\n    case 171:                       // 'loop'\n      shift(171);                   // 'loop'\n      break;\n    default:\n      shift(216);                   // 'returning'\n    }\n    eventHandler.endNonterminal(\"FunctionName\", e0);\n  }\n\n  function parse_NCName()\n  {\n    eventHandler.startNonterminal(\"NCName\", e0);\n    switch (l1)\n    {\n    case 26:                        // NCName^Token\n      shift(26);                    // NCName^Token\n      break;\n    case 65:                        // 'after'\n      shift(65);                    // 'after'\n      break;\n    case 70:                        // 'and'\n      shift(70);                    // 'and'\n      break;\n    case 74:                        // 'as'\n      shift(74);                    // 'as'\n      break;\n    case 75:                        // 'ascending'\n      shift(75);                    // 'ascending'\n      break;\n    case 79:                        // 'before'\n      shift(79);                    // 'before'\n      break;\n    case 83:                        // 'case'\n      shift(83);                    // 'case'\n      break;\n    case 84:                        // 'cast'\n      shift(84);                    // 'cast'\n      break;\n    case 85:                        // 'castable'\n      shift(85);                    // 'castable'\n      break;\n    case 89:                        // 'collation'\n      shift(89);                    // 'collation'\n      break;\n    case 100:                       // 'count'\n      shift(100);                   // 'count'\n      break;\n    case 104:                       // 'default'\n      shift(104);                   // 'default'\n      break;\n    case 108:                       // 'descending'\n      shift(108);                   // 'descending'\n      break;\n    case 113:                       // 'div'\n      shift(113);                   // 'div'\n      break;\n    case 117:                       // 'else'\n      shift(117);                   // 'else'\n      break;\n    case 118:                       // 'empty'\n      shift(118);                   // 'empty'\n      break;\n    case 121:                       // 'end'\n      shift(121);                   // 'end'\n      break;\n    case 123:                       // 'eq'\n      shift(123);                   // 'eq'\n      break;\n    case 126:                       // 'except'\n      shift(126);                   // 'except'\n      break;\n    case 132:                       // 'for'\n      shift(132);                   // 'for'\n      break;\n    case 141:                       // 'ge'\n      shift(141);                   // 'ge'\n      break;\n    case 143:                       // 'group'\n      shift(143);                   // 'group'\n      break;\n    case 145:                       // 'gt'\n      shift(145);                   // 'gt'\n      break;\n    case 146:                       // 'idiv'\n      shift(146);                   // 'idiv'\n      break;\n    case 155:                       // 'instance'\n      shift(155);                   // 'instance'\n      break;\n    case 157:                       // 'intersect'\n      shift(157);                   // 'intersect'\n      break;\n    case 158:                       // 'into'\n      shift(158);                   // 'into'\n      break;\n    case 159:                       // 'is'\n      shift(159);                   // 'is'\n      break;\n    case 167:                       // 'le'\n      shift(167);                   // 'le'\n      break;\n    case 169:                       // 'let'\n      shift(169);                   // 'let'\n      break;\n    case 173:                       // 'lt'\n      shift(173);                   // 'lt'\n      break;\n    case 175:                       // 'mod'\n      shift(175);                   // 'mod'\n      break;\n    case 176:                       // 'modify'\n      shift(176);                   // 'modify'\n      break;\n    case 181:                       // 'ne'\n      shift(181);                   // 'ne'\n      break;\n    case 193:                       // 'only'\n      shift(193);                   // 'only'\n      break;\n    case 195:                       // 'or'\n      shift(195);                   // 'or'\n      break;\n    case 196:                       // 'order'\n      shift(196);                   // 'order'\n      break;\n    case 215:                       // 'return'\n      shift(215);                   // 'return'\n      break;\n    case 219:                       // 'satisfies'\n      shift(219);                   // 'satisfies'\n      break;\n    case 231:                       // 'stable'\n      shift(231);                   // 'stable'\n      break;\n    case 232:                       // 'start'\n      shift(232);                   // 'start'\n      break;\n    case 243:                       // 'to'\n      shift(243);                   // 'to'\n      break;\n    case 244:                       // 'treat'\n      shift(244);                   // 'treat'\n      break;\n    case 249:                       // 'union'\n      shift(249);                   // 'union'\n      break;\n    case 261:                       // 'where'\n      shift(261);                   // 'where'\n      break;\n    case 265:                       // 'with'\n      shift(265);                   // 'with'\n      break;\n    case 68:                        // 'ancestor'\n      shift(68);                    // 'ancestor'\n      break;\n    case 69:                        // 'ancestor-or-self'\n      shift(69);                    // 'ancestor-or-self'\n      break;\n    case 77:                        // 'attribute'\n      shift(77);                    // 'attribute'\n      break;\n    case 88:                        // 'child'\n      shift(88);                    // 'child'\n      break;\n    case 91:                        // 'comment'\n      shift(91);                    // 'comment'\n      break;\n    case 98:                        // 'copy'\n      shift(98);                    // 'copy'\n      break;\n    case 103:                       // 'declare'\n      shift(103);                   // 'declare'\n      break;\n    case 105:                       // 'delete'\n      shift(105);                   // 'delete'\n      break;\n    case 106:                       // 'descendant'\n      shift(106);                   // 'descendant'\n      break;\n    case 107:                       // 'descendant-or-self'\n      shift(107);                   // 'descendant-or-self'\n      break;\n    case 114:                       // 'document'\n      shift(114);                   // 'document'\n      break;\n    case 115:                       // 'document-node'\n      shift(115);                   // 'document-node'\n      break;\n    case 116:                       // 'element'\n      shift(116);                   // 'element'\n      break;\n    case 119:                       // 'empty-sequence'\n      shift(119);                   // 'empty-sequence'\n      break;\n    case 124:                       // 'every'\n      shift(124);                   // 'every'\n      break;\n    case 129:                       // 'first'\n      shift(129);                   // 'first'\n      break;\n    case 130:                       // 'following'\n      shift(130);                   // 'following'\n      break;\n    case 131:                       // 'following-sibling'\n      shift(131);                   // 'following-sibling'\n      break;\n    case 140:                       // 'function'\n      shift(140);                   // 'function'\n      break;\n    case 147:                       // 'if'\n      shift(147);                   // 'if'\n      break;\n    case 148:                       // 'import'\n      shift(148);                   // 'import'\n      break;\n    case 154:                       // 'insert'\n      shift(154);                   // 'insert'\n      break;\n    case 160:                       // 'item'\n      shift(160);                   // 'item'\n      break;\n    case 165:                       // 'last'\n      shift(165);                   // 'last'\n      break;\n    case 177:                       // 'module'\n      shift(177);                   // 'module'\n      break;\n    case 179:                       // 'namespace'\n      shift(179);                   // 'namespace'\n      break;\n    case 180:                       // 'namespace-node'\n      shift(180);                   // 'namespace-node'\n      break;\n    case 186:                       // 'node'\n      shift(186);                   // 'node'\n      break;\n    case 197:                       // 'ordered'\n      shift(197);                   // 'ordered'\n      break;\n    case 201:                       // 'parent'\n      shift(201);                   // 'parent'\n      break;\n    case 207:                       // 'preceding'\n      shift(207);                   // 'preceding'\n      break;\n    case 208:                       // 'preceding-sibling'\n      shift(208);                   // 'preceding-sibling'\n      break;\n    case 211:                       // 'processing-instruction'\n      shift(211);                   // 'processing-instruction'\n      break;\n    case 213:                       // 'rename'\n      shift(213);                   // 'rename'\n      break;\n    case 214:                       // 'replace'\n      shift(214);                   // 'replace'\n      break;\n    case 221:                       // 'schema-attribute'\n      shift(221);                   // 'schema-attribute'\n      break;\n    case 222:                       // 'schema-element'\n      shift(222);                   // 'schema-element'\n      break;\n    case 224:                       // 'self'\n      shift(224);                   // 'self'\n      break;\n    case 230:                       // 'some'\n      shift(230);                   // 'some'\n      break;\n    case 238:                       // 'switch'\n      shift(238);                   // 'switch'\n      break;\n    case 239:                       // 'text'\n      shift(239);                   // 'text'\n      break;\n    case 245:                       // 'try'\n      shift(245);                   // 'try'\n      break;\n    case 248:                       // 'typeswitch'\n      shift(248);                   // 'typeswitch'\n      break;\n    case 251:                       // 'unordered'\n      shift(251);                   // 'unordered'\n      break;\n    case 255:                       // 'validate'\n      shift(255);                   // 'validate'\n      break;\n    case 257:                       // 'variable'\n      shift(257);                   // 'variable'\n      break;\n    case 269:                       // 'xquery'\n      shift(269);                   // 'xquery'\n      break;\n    case 67:                        // 'allowing'\n      shift(67);                    // 'allowing'\n      break;\n    case 76:                        // 'at'\n      shift(76);                    // 'at'\n      break;\n    case 78:                        // 'base-uri'\n      shift(78);                    // 'base-uri'\n      break;\n    case 80:                        // 'boundary-space'\n      shift(80);                    // 'boundary-space'\n      break;\n    case 81:                        // 'break'\n      shift(81);                    // 'break'\n      break;\n    case 86:                        // 'catch'\n      shift(86);                    // 'catch'\n      break;\n    case 93:                        // 'construction'\n      shift(93);                    // 'construction'\n      break;\n    case 96:                        // 'context'\n      shift(96);                    // 'context'\n      break;\n    case 97:                        // 'continue'\n      shift(97);                    // 'continue'\n      break;\n    case 99:                        // 'copy-namespaces'\n      shift(99);                    // 'copy-namespaces'\n      break;\n    case 101:                       // 'decimal-format'\n      shift(101);                   // 'decimal-format'\n      break;\n    case 120:                       // 'encoding'\n      shift(120);                   // 'encoding'\n      break;\n    case 127:                       // 'exit'\n      shift(127);                   // 'exit'\n      break;\n    case 128:                       // 'external'\n      shift(128);                   // 'external'\n      break;\n    case 136:                       // 'ft-option'\n      shift(136);                   // 'ft-option'\n      break;\n    case 149:                       // 'in'\n      shift(149);                   // 'in'\n      break;\n    case 150:                       // 'index'\n      shift(150);                   // 'index'\n      break;\n    case 156:                       // 'integrity'\n      shift(156);                   // 'integrity'\n      break;\n    case 166:                       // 'lax'\n      shift(166);                   // 'lax'\n      break;\n    case 187:                       // 'nodes'\n      shift(187);                   // 'nodes'\n      break;\n    case 194:                       // 'option'\n      shift(194);                   // 'option'\n      break;\n    case 198:                       // 'ordering'\n      shift(198);                   // 'ordering'\n      break;\n    case 217:                       // 'revalidation'\n      shift(217);                   // 'revalidation'\n      break;\n    case 220:                       // 'schema'\n      shift(220);                   // 'schema'\n      break;\n    case 223:                       // 'score'\n      shift(223);                   // 'score'\n      break;\n    case 229:                       // 'sliding'\n      shift(229);                   // 'sliding'\n      break;\n    case 235:                       // 'strict'\n      shift(235);                   // 'strict'\n      break;\n    case 246:                       // 'tumbling'\n      shift(246);                   // 'tumbling'\n      break;\n    case 247:                       // 'type'\n      shift(247);                   // 'type'\n      break;\n    case 252:                       // 'updating'\n      shift(252);                   // 'updating'\n      break;\n    case 256:                       // 'value'\n      shift(256);                   // 'value'\n      break;\n    case 258:                       // 'version'\n      shift(258);                   // 'version'\n      break;\n    case 262:                       // 'while'\n      shift(262);                   // 'while'\n      break;\n    case 92:                        // 'constraint'\n      shift(92);                    // 'constraint'\n      break;\n    case 171:                       // 'loop'\n      shift(171);                   // 'loop'\n      break;\n    default:\n      shift(216);                   // 'returning'\n    }\n    eventHandler.endNonterminal(\"NCName\", e0);\n  }\n\n  function shift(t)\n  {\n    if (l1 == t)\n    {\n      whitespace();\n      eventHandler.terminal(XQueryTokenizer.TOKEN[l1], b1, e1 > size ? size : e1);\n      b0 = b1; e0 = e1; l1 = 0;\n    }\n    else\n    {\n      error(b1, e1, 0, l1, t);\n    }\n  }\n\n  function whitespace()\n  {\n    if (e0 != b1)\n    {\n      b0 = e0;\n      e0 = b1;\n      eventHandler.whitespace(b0, e0);\n    }\n  }\n\n  function matchW(set)\n  {\n    var code;\n    for (;;)\n    {\n      code = match(set);\n      if (code != 28)               // S^WS\n      {\n        break;\n      }\n    }\n    return code;\n  }\n\n  function lookahead1W(set)\n  {\n    if (l1 == 0)\n    {\n      l1 = matchW(set);\n      b1 = begin;\n      e1 = end;\n    }\n  }\n\n  function lookahead1(set)\n  {\n    if (l1 == 0)\n    {\n      l1 = match(set);\n      b1 = begin;\n      e1 = end;\n    }\n  }\n\n  function error(b, e, s, l, t)\n  {\n    throw new self.ParseException(b, e, s, l, t);\n  }\n\n  var lk, b0, e0;\n  var l1, b1, e1;\n  var eventHandler;\n\n  var input;\n  var size;\n  var begin;\n  var end;\n\n  function match(tokenSetId)\n  {\n    var nonbmp = false;\n    begin = end;\n    var current = end;\n    var result = XQueryTokenizer.INITIAL[tokenSetId];\n    var state = 0;\n\n    for (var code = result & 4095; code != 0; )\n    {\n      var charclass;\n      var c0 = current < size ? input.charCodeAt(current) : 0;\n      ++current;\n      if (c0 < 0x80)\n      {\n        charclass = XQueryTokenizer.MAP0[c0];\n      }\n      else if (c0 < 0xd800)\n      {\n        var c1 = c0 >> 4;\n        charclass = XQueryTokenizer.MAP1[(c0 & 15) + XQueryTokenizer.MAP1[(c1 & 31) + XQueryTokenizer.MAP1[c1 >> 5]]];\n      }\n      else\n      {\n        if (c0 < 0xdc00)\n        {\n          var c1 = current < size ? input.charCodeAt(current) : 0;\n          if (c1 >= 0xdc00 && c1 < 0xe000)\n          {\n            ++current;\n            c0 = ((c0 & 0x3ff) << 10) + (c1 & 0x3ff) + 0x10000;\n            nonbmp = true;\n          }\n        }\n        var lo = 0, hi = 5;\n        for (var m = 3; ; m = (hi + lo) >> 1)\n        {\n          if (XQueryTokenizer.MAP2[m] > c0) hi = m - 1;\n          else if (XQueryTokenizer.MAP2[6 + m] < c0) lo = m + 1;\n          else {charclass = XQueryTokenizer.MAP2[12 + m]; break;}\n          if (lo > hi) {charclass = 0; break;}\n        }\n      }\n\n      state = code;\n      var i0 = (charclass << 12) + code - 1;\n      code = XQueryTokenizer.TRANSITION[(i0 & 15) + XQueryTokenizer.TRANSITION[i0 >> 4]];\n\n      if (code > 4095)\n      {\n        result = code;\n        code &= 4095;\n        end = current;\n      }\n    }\n\n    result >>= 12;\n    if (result == 0)\n    {\n      end = current - 1;\n      var c1 = end < size ? input.charCodeAt(end) : 0;\n      if (c1 >= 0xdc00 && c1 < 0xe000) --end;\n      return error(begin, end, state, -1, -1);\n    }\n\n    if (nonbmp)\n    {\n      for (var i = result >> 9; i > 0; --i)\n      {\n        --end;\n        var c1 = end < size ? input.charCodeAt(end) : 0;\n        if (c1 >= 0xdc00 && c1 < 0xe000) --end;\n      }\n    }\n    else\n    {\n      end -= result >> 9;\n    }\n\n    return (result & 511) - 1;\n  }\n}\n\nXQueryTokenizer.getTokenSet = function(tokenSetId)\n{\n  var set = [];\n  var s = tokenSetId < 0 ? - tokenSetId : INITIAL[tokenSetId] & 4095;\n  for (var i = 0; i < 276; i += 32)\n  {\n    var j = i;\n    var i0 = (i >> 5) * 2062 + s - 1;\n    var i1 = i0 >> 2;\n    var i2 = i1 >> 2;\n    var f = XQueryTokenizer.EXPECTED[(i0 & 3) + XQueryTokenizer.EXPECTED[(i1 & 3) + XQueryTokenizer.EXPECTED[(i2 & 3) + XQueryTokenizer.EXPECTED[i2 >> 2]]]];\n    for ( ; f != 0; f >>>= 1, ++j)\n    {\n      if ((f & 1) != 0)\n      {\n        set.push(XQueryTokenizer.TOKEN[j]);\n      }\n    }\n  }\n  return set;\n};\n\nXQueryTokenizer.MAP0 =\n[ 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 27, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 31, 31, 33, 31, 31, 31, 31, 31, 31, 34, 35, 36, 35, 31, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 31, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 31, 61, 62, 63, 64, 35\n];\n\nXQueryTokenizer.MAP1 =\n[ 108, 124, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 156, 181, 181, 181, 181, 181, 214, 215, 213, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 247, 261, 277, 293, 309, 347, 363, 379, 416, 416, 416, 408, 331, 323, 331, 323, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 433, 433, 433, 433, 433, 433, 433, 316, 331, 331, 331, 331, 331, 331, 331, 331, 394, 416, 416, 417, 415, 416, 416, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 416, 330, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 331, 416, 66, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 27, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 35, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 32, 31, 31, 33, 31, 31, 31, 31, 31, 31, 34, 35, 36, 35, 31, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 31, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 31, 61, 62, 63, 64, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 31, 31, 35, 35, 35, 35, 35, 35, 35, 65, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65\n];\n\nXQueryTokenizer.MAP2 =\n[ 57344, 63744, 64976, 65008, 65536, 983040, 63743, 64975, 65007, 65533, 983039, 1114111, 35, 31, 35, 31, 31, 35\n];\n\nXQueryTokenizer.INITIAL =\n[ 1, 2, 36867, 45060, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15\n];\n\nXQueryTokenizer.TRANSITION =\n[ 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22908, 18836, 17152, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 17365, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 17470, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 18157, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 17848, 17880, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18023, 36545, 18621, 18039, 18056, 18072, 18117, 18143, 18173, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17687, 18805, 18421, 18437, 18101, 17393, 18489, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 18579, 21711, 17152, 19008, 19233, 20367, 19008, 28684, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 17365, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 17470, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 18157, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 17848, 17880, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18023, 36545, 18621, 18039, 18056, 18072, 18117, 18143, 18173, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17687, 18805, 18421, 18437, 18101, 17393, 18489, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 20116, 18836, 18637, 19008, 19233, 21267, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 18763, 18778, 18794, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 18821, 22923, 18906, 19008, 19233, 17431, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18937, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 19054, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 18953, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21843, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21696, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22429, 20131, 18720, 19008, 19233, 20367, 19008, 17173, 23559, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 18087, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 21242, 19111, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 19024, 18836, 18609, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 19081, 22444, 18987, 19008, 19233, 20367, 19008, 19065, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21992, 22007, 18987, 19008, 19233, 20367, 19008, 18690, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22414, 18836, 18987, 19008, 19233, 30651, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 19138, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 19280, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 19172, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21783, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 19218, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21651, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 19249, 19265, 19307, 18888, 27857, 30536, 24401, 31444, 23357, 18888, 19351, 18888, 18890, 27211, 19370, 27211, 27211, 19392, 24401, 31911, 24401, 24401, 25467, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 28537, 19440, 24401, 24401, 24401, 24401, 24036, 17994, 24060, 18888, 18888, 18888, 18890, 19468, 27211, 27211, 27211, 27211, 19484, 35367, 19520, 24401, 24401, 24401, 19628, 18888, 29855, 18888, 18888, 23086, 27211, 19538, 27211, 27211, 30756, 24012, 24401, 19560, 24401, 24401, 26750, 18888, 18888, 19327, 27855, 27211, 27211, 19580, 17590, 24017, 24401, 24401, 19600, 25665, 18888, 18888, 28518, 27211, 27212, 24016, 19620, 19868, 28435, 25722, 18889, 19644, 27211, 32888, 35852, 19868, 31018, 19694, 19376, 19717, 22215, 19735, 22098, 19751, 35203, 19776, 19797, 19817, 19840, 25783, 31738, 24135, 19701, 19856, 31015, 23516, 31008, 28311, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21768, 18836, 19307, 18888, 27857, 27904, 24401, 29183, 28015, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 19888, 24401, 24401, 24401, 24401, 22953, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 28537, 19440, 24401, 24401, 24401, 24401, 24036, 18881, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22399, 18836, 19918, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21666, 18836, 19307, 18888, 27857, 27525, 24401, 29183, 21467, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 19946, 24401, 24401, 24401, 24401, 32382, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 28537, 19998, 24401, 24401, 24401, 24401, 31500, 18467, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 20021, 24401, 24401, 24401, 24401, 24401, 34271, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 32926, 29908, 24401, 24401, 24401, 24401, 26095, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 20050, 22968, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 20101, 19039, 20191, 20412, 20903, 17569, 20309, 20872, 25633, 20623, 20505, 20218, 20242, 17189, 17208, 17281, 20355, 20265, 20306, 20328, 20383, 22490, 20796, 20619, 21354, 20654, 20410, 20956, 21232, 20765, 17421, 20535, 17192, 18127, 22459, 20312, 25531, 22470, 20309, 20428, 18964, 20466, 20491, 21342, 21070, 20521, 20682, 17714, 18326, 17543, 17559, 17585, 22497, 20559, 19504, 20279, 20575, 20290, 20475, 20604, 20639, 20226, 20670, 17661, 21190, 17703, 21176, 17730, 19494, 20698, 20711, 22480, 21046, 21116, 18971, 21130, 20727, 20755, 17675, 17753, 17832, 17590, 25518, 20394, 20781, 20831, 20202, 20847, 21401, 17292, 17934, 17979, 18549, 20863, 20588, 25542, 20888, 20919, 18072, 18117, 20935, 20972, 21032, 21062, 21086, 18239, 21102, 18563, 21146, 21162, 21206, 18351, 20949, 20902, 18340, 21222, 21258, 21283, 18360, 20249, 17405, 21295, 21311, 21327, 20739, 20343, 21370, 21386, 21417, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21977, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 21452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 21504, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 36501, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 28674, 21946, 17617, 36473, 18223, 17237, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 21575, 21534, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 21560, 30628, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21798, 18836, 21612, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21636, 18836, 18987, 19008, 19233, 17902, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21753, 19096, 21903, 19008, 19233, 20367, 19008, 19291, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 17379, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 21931, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 18280, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21962, 18594, 18987, 19008, 19233, 22043, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21681, 21858, 18987, 19008, 19233, 20367, 19008, 21544, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 30613, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 31500, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 32319, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 21431, 24401, 24401, 24401, 24401, 26095, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 22187, 22968, 24401, 24401, 24401, 22231, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 30613, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 31500, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 31181, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 21431, 24401, 24401, 24401, 24401, 26095, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 22187, 22968, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 31678, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 31500, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 31181, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 21431, 24401, 24401, 24401, 24401, 26095, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 22187, 22968, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 30613, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 33588, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 31181, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 21431, 24401, 24401, 24401, 24401, 26095, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 22187, 22968, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 35019, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22248, 24401, 24401, 24401, 24401, 30613, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 31500, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 31181, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 21431, 24401, 24401, 24401, 24401, 26095, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 22187, 22968, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 18866, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 24036, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22324, 18836, 22059, 18888, 27857, 30501, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 18866, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 24036, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 18866, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 24036, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 34365, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22354, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 27086, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 19930, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21828, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22309, 22513, 18987, 19008, 19233, 20367, 19008, 19122, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 22544, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22608, 18836, 22988, 23004, 27585, 23020, 23036, 23067, 22087, 18888, 18888, 18888, 23083, 27211, 27211, 27211, 23102, 22121, 24401, 24401, 24401, 23122, 31386, 26154, 19674, 18888, 28119, 28232, 19424, 23705, 27211, 27211, 23142, 23173, 23189, 23212, 24401, 24401, 23246, 34427, 31693, 23262, 18888, 23290, 23308, 27783, 27620, 23327, 35263, 35107, 33383, 23346, 18193, 23393, 32748, 23968, 24401, 23414, 35153, 23463, 18888, 33913, 23442, 23482, 27211, 27211, 23532, 23552, 21431, 23575, 24401, 24401, 23604, 26095, 23635, 23657, 18888, 33482, 23685, 33251, 27211, 22187, 18851, 23721, 35536, 24401, 18887, 23750, 32641, 27211, 23769, 23787, 20080, 33012, 24384, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 23803, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 28224, 31826, 23823, 26917, 34978, 23850, 26493, 25782, 23878, 23914, 23516, 31008, 22105, 19419, 27963, 19659, 29781, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22623, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 30613, 18888, 18888, 18888, 18888, 28909, 25783, 27211, 27211, 27211, 34048, 23933, 22164, 24401, 24401, 24401, 28409, 23949, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 31181, 26583, 18888, 18888, 18888, 35585, 23984, 27211, 27211, 27211, 24005, 22201, 24033, 24401, 24401, 24401, 24052, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 22187, 22968, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 26496, 24076, 24126, 24151, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22638, 18836, 22059, 19678, 27857, 24185, 24401, 24201, 24217, 26592, 18888, 18888, 18890, 24252, 24268, 27211, 27211, 22121, 24287, 24303, 24401, 24401, 30613, 19781, 35432, 36007, 32649, 18888, 25783, 24322, 28966, 23771, 27211, 35072, 22164, 24358, 32106, 26829, 24400, 31500, 31693, 18888, 18888, 18888, 24801, 18890, 27211, 27211, 27211, 27211, 24418, 19484, 24401, 24401, 24401, 24401, 20167, 31181, 18888, 18888, 18888, 27833, 23086, 27211, 27211, 33540, 27211, 30756, 21431, 24401, 24401, 22972, 24401, 26095, 18888, 36131, 18888, 27855, 27211, 24440, 27211, 22187, 22968, 24401, 24459, 24401, 31699, 28454, 18888, 34528, 34570, 35779, 24478, 24402, 24494, 25659, 18888, 36228, 27211, 27211, 24515, 30981, 23734, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 24538, 31017, 27856, 31741, 30059, 23377, 24563, 19837, 25782, 19760, 31015, 23516, 25374, 22105, 19419, 29793, 24579, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22653, 18836, 22059, 25756, 19982, 34097, 23196, 29183, 24614, 24110, 23641, 24673, 26103, 24697, 24443, 24713, 28558, 22121, 24748, 24462, 24764, 23398, 30613, 18888, 18888, 18888, 18888, 24798, 25783, 27211, 27211, 27211, 34232, 35072, 22164, 24401, 24401, 24401, 33302, 31500, 22559, 24106, 24232, 18888, 18888, 34970, 24817, 30411, 27211, 27211, 32484, 19484, 29750, 35127, 24401, 24401, 19872, 31181, 24852, 18888, 18888, 24871, 29221, 27211, 27211, 32072, 27211, 30756, 34441, 24401, 24401, 31571, 24401, 26095, 33141, 27802, 27011, 27855, 25295, 25607, 24888, 22187, 22968, 19195, 34593, 24906, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 18888, 33663, 27211, 27211, 24924, 24947, 23588, 31018, 18890, 27211, 31833, 22135, 19447, 23086, 23330, 19828, 30904, 31042, 24972, 19840, 25000, 31738, 30898, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 25016, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22668, 18836, 25041, 25057, 31320, 25073, 25089, 25105, 22087, 34796, 24236, 36138, 34870, 34125, 25121, 23106, 35497, 22248, 36613, 25137, 30671, 27365, 30613, 25153, 26447, 25199, 25233, 22574, 23274, 25249, 25265, 25281, 25318, 25344, 25360, 25400, 25428, 25452, 26731, 25504, 31693, 23669, 25558, 27407, 25575, 28599, 25934, 25599, 27211, 28180, 27304, 25623, 25839, 25649, 24401, 34820, 25681, 25698, 22586, 27775, 30190, 25745, 25778, 25799, 25817, 28995, 33569, 30756, 21518, 33443, 25837, 25855, 25893, 26095, 31254, 26677, 30136, 27855, 25930, 25950, 27211, 22187, 22968, 25966, 25986, 24401, 23428, 27763, 36330, 26959, 26002, 26029, 26045, 26085, 26119, 26170, 26203, 26222, 26239, 30527, 26372, 26274, 28404, 31018, 33757, 27211, 34262, 26316, 36729, 26345, 26366, 35337, 31017, 26388, 26407, 30954, 26350, 33861, 26434, 26463, 26479, 26512, 23516, 33189, 26531, 26547, 27963, 31293, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22683, 18836, 26568, 26181, 26608, 34097, 26643, 29183, 22087, 26669, 18888, 18888, 18890, 26693, 27211, 27211, 27211, 22121, 26720, 24401, 24401, 24401, 30613, 18888, 18888, 18888, 18888, 26774, 25783, 27211, 27211, 27211, 26619, 35072, 22164, 24401, 24401, 24401, 21596, 31500, 31693, 18888, 18888, 33978, 18888, 18890, 27211, 27211, 25801, 27211, 27211, 19484, 24401, 24401, 24401, 26792, 24401, 31181, 18888, 18888, 18888, 35464, 23086, 27211, 27211, 27211, 26809, 30756, 21431, 24401, 24401, 24401, 26828, 26095, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 22187, 22968, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 35779, 20080, 24402, 19868, 25659, 31948, 18889, 35707, 27211, 19719, 26845, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 26905, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 24984, 31088, 19419, 26945, 27651, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22698, 18836, 26999, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 23051, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 27033, 24401, 24401, 24401, 24401, 24036, 31693, 18888, 18888, 27056, 18888, 18890, 27211, 27211, 30320, 27211, 27211, 27075, 24401, 24401, 29032, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 33986, 27855, 27211, 27211, 27102, 17590, 24017, 24401, 24401, 27123, 27144, 36254, 27162, 27210, 27228, 28500, 18187, 34842, 33426, 27244, 35980, 27277, 27302, 27320, 36048, 34013, 20999, 31882, 21478, 27895, 27356, 30287, 27381, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 26329, 30087, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 27406, 27423, 27445, 35294, 27461, 22087, 18888, 18888, 30140, 18890, 27211, 27211, 27989, 27211, 22121, 24401, 24401, 25682, 24401, 18866, 18888, 18888, 18888, 18888, 18888, 34042, 27211, 27211, 27211, 27211, 29700, 22164, 24401, 24401, 24401, 24401, 27128, 31693, 27477, 18888, 18888, 18888, 18890, 27194, 27211, 27211, 27211, 27211, 19484, 35299, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 27059, 23086, 27211, 27211, 27211, 33366, 30756, 24012, 24401, 24401, 24401, 35044, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 20815, 27211, 30818, 19960, 33969, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22713, 18836, 22059, 27496, 27516, 27541, 35231, 27557, 22087, 29662, 26292, 23292, 27573, 24836, 27601, 27211, 27636, 22121, 35544, 27686, 24401, 27721, 18866, 18888, 27799, 18888, 27818, 22071, 27853, 32260, 27211, 26013, 27873, 27920, 22164, 29419, 24401, 29946, 33413, 26742, 27751, 26881, 18888, 18888, 27261, 36776, 27936, 27211, 27211, 27211, 27988, 28005, 28031, 28052, 24401, 24401, 28069, 28088, 28135, 25488, 28152, 26069, 28167, 27211, 28340, 24657, 28196, 30756, 31523, 24401, 28212, 34176, 36174, 24956, 28248, 28266, 28290, 21488, 33077, 28327, 28356, 17590, 20986, 23126, 28391, 28425, 28102, 28451, 28470, 28490, 28516, 28534, 20034, 33728, 25868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 30241, 28274, 28553, 28574, 19406, 28590, 23086, 23330, 19828, 19452, 28615, 28660, 26147, 25783, 31738, 19837, 25782, 19760, 29613, 35958, 29276, 22105, 19419, 27963, 23157, 28700, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 18888, 27857, 34097, 24401, 29183, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 18866, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 24036, 22528, 18888, 18888, 18888, 18888, 18890, 27333, 27211, 27211, 27211, 27211, 19484, 30853, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22728, 18836, 28747, 28782, 28817, 28841, 28857, 28880, 28896, 24161, 28943, 32011, 36261, 27340, 28961, 29492, 28982, 29011, 24522, 29027, 25436, 29048, 23051, 27500, 29090, 29110, 30713, 18888, 23512, 29130, 25183, 27211, 29155, 28927, 27033, 29173, 23230, 24401, 29199, 35373, 31693, 18888, 18888, 25583, 32629, 29218, 27211, 27211, 31461, 30692, 29237, 27075, 24401, 24401, 24401, 29262, 29302, 19628, 18888, 34329, 18888, 18888, 23086, 27211, 29329, 27211, 27211, 30756, 24012, 35933, 24401, 24401, 24401, 27705, 31612, 18888, 18888, 29346, 29374, 27211, 35650, 17590, 21436, 29393, 24401, 25970, 18887, 33895, 18888, 27211, 32528, 27212, 24016, 32769, 19868, 25659, 18888, 26889, 27211, 27211, 29412, 23889, 24371, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31768, 19840, 25783, 31738, 19837, 29435, 29508, 31102, 29550, 29606, 22105, 30300, 29462, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22743, 18836, 22059, 29629, 29473, 34097, 33285, 29183, 29651, 27254, 18888, 29678, 33329, 32535, 27211, 29694, 29716, 22121, 19202, 24401, 32742, 29741, 18866, 26776, 33921, 28474, 18888, 18888, 25783, 29766, 27211, 29809, 27211, 35072, 22164, 35825, 24401, 29828, 24401, 24036, 36769, 25217, 18888, 18888, 29848, 18890, 27211, 29871, 27211, 26258, 27211, 29894, 24401, 29929, 24401, 36587, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 29725, 29962, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18473, 18888, 18888, 19584, 27211, 27212, 24016, 29982, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19902, 19447, 32052, 19544, 19828, 29998, 30097, 30031, 19840, 25783, 30047, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 30075, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22758, 18836, 30121, 30156, 30206, 30257, 30273, 30336, 22087, 35624, 32837, 25762, 18890, 29878, 34934, 26812, 27211, 22121, 24931, 23223, 29202, 24401, 18866, 34373, 30352, 18888, 18888, 18888, 23447, 24828, 27211, 27211, 27211, 35072, 30370, 35052, 24401, 24401, 24401, 24036, 29523, 18888, 18888, 27146, 18888, 31308, 30386, 27211, 27211, 30405, 30558, 19484, 30427, 24401, 24401, 29938, 35686, 19628, 28766, 30447, 34506, 35614, 23086, 28731, 30482, 30517, 30552, 30756, 24012, 20156, 30574, 30598, 30667, 26283, 33464, 28945, 27670, 30687, 32915, 33504, 25328, 17590, 23963, 20450, 33837, 21016, 32397, 26300, 30708, 30729, 27885, 30748, 21588, 36373, 30779, 26653, 24628, 33220, 32514, 30806, 31835, 25412, 25906, 26515, 18890, 28825, 31833, 26133, 19447, 28304, 31730, 23834, 26057, 30869, 30885, 32181, 30920, 30942, 32797, 25782, 30970, 31015, 23516, 31008, 30997, 31034, 27963, 19659, 29450, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22773, 18836, 31058, 31074, 32463, 31125, 31141, 31197, 22087, 18888, 29534, 35471, 36738, 27211, 24342, 31213, 24424, 22121, 24401, 20175, 31229, 31917, 27736, 31245, 34334, 27175, 18888, 29094, 27286, 27211, 31278, 31336, 27211, 31355, 31371, 24401, 31402, 31418, 24401, 31437, 31693, 18888, 31619, 32841, 18888, 18890, 27211, 27211, 31460, 31477, 27211, 19484, 24401, 24401, 31497, 36581, 24401, 33020, 18888, 18888, 18888, 18888, 30007, 27211, 27211, 27211, 27211, 31516, 32310, 24401, 24401, 24401, 24401, 31539, 18888, 28762, 18888, 24651, 35740, 27211, 27211, 28644, 31565, 35796, 24401, 24401, 19318, 32188, 18888, 24334, 28366, 27212, 29966, 29832, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 31587, 19868, 31635, 32435, 33693, 30105, 31663, 20005, 31715, 31757, 31784, 31812, 30015, 31851, 31878, 25783, 31898, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 31933, 30221, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22788, 18836, 22059, 25729, 30466, 31968, 24306, 31984, 32000, 32807, 35160, 27017, 29590, 34941, 19801, 29377, 33700, 22121, 27040, 30431, 29396, 28864, 29565, 18888, 18888, 18888, 32027, 18888, 25783, 27211, 27211, 23698, 27211, 35072, 22164, 24401, 24401, 30845, 24401, 24036, 32045, 18888, 26929, 18888, 18888, 18890, 27211, 31481, 32068, 27211, 27211, 32088, 24401, 33058, 32122, 24401, 24401, 33736, 18888, 18888, 33162, 18888, 23086, 27211, 27211, 29484, 27211, 28375, 32144, 24401, 24401, 33831, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 36704, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 33107, 22171, 33224, 24271, 32169, 31017, 27856, 31741, 19840, 25783, 31738, 30234, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 32204, 32232, 32252, 32677, 33295, 29074, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 23619, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 32276, 24401, 24401, 24401, 24401, 24036, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 32299, 24401, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 33886, 18889, 36065, 27211, 19719, 35326, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22803, 18836, 32335, 31647, 34666, 32351, 32367, 32417, 22087, 18888, 32433, 19335, 32451, 27211, 32479, 27107, 32500, 22121, 24401, 32551, 20085, 32572, 18866, 22287, 23753, 18888, 18888, 32602, 32665, 27211, 32693, 27211, 26972, 32713, 32729, 24401, 32764, 24401, 25877, 32785, 34768, 18888, 27390, 32823, 24594, 24855, 32857, 24890, 32878, 32904, 27211, 32942, 32977, 24401, 33000, 29313, 24401, 30790, 26206, 27666, 33904, 18888, 23086, 36353, 27211, 33036, 27211, 30756, 24012, 32153, 24401, 33056, 24401, 35861, 18888, 18888, 30354, 27972, 27211, 27211, 33800, 17590, 20145, 24401, 24401, 34638, 20811, 18888, 18888, 33074, 27211, 27212, 36167, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 34616, 24169, 33093, 33123, 33157, 27856, 31741, 23862, 26552, 34302, 19837, 25782, 19760, 31015, 23516, 31008, 33178, 19973, 27963, 23497, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22818, 18836, 33205, 28113, 33240, 34097, 33275, 29183, 22087, 33318, 35438, 18888, 18890, 33345, 26391, 33382, 27211, 22121, 33399, 28072, 33442, 24401, 18866, 22232, 18888, 33459, 18888, 18888, 33480, 33498, 25175, 27211, 27211, 26704, 22164, 24775, 35239, 24401, 24401, 25914, 29580, 18888, 18888, 31109, 25211, 33520, 33539, 27211, 27211, 33556, 36284, 19484, 33585, 24401, 24401, 33604, 32556, 19628, 18888, 18888, 31262, 33658, 23086, 27211, 27211, 33679, 27211, 30756, 24012, 24401, 24401, 33716, 24401, 26854, 27480, 18888, 33752, 27855, 33259, 34701, 27211, 17590, 32102, 24782, 23807, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 33773, 36105, 19868, 25659, 18888, 23368, 27211, 29157, 19719, 23889, 34454, 29286, 18890, 33794, 25302, 33816, 19447, 34079, 33853, 31862, 31017, 27856, 31741, 33877, 28920, 33937, 19837, 30461, 34002, 22276, 36041, 34029, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22833, 18836, 34064, 32616, 34113, 34141, 34157, 34192, 34208, 32216, 36013, 31549, 31952, 34224, 34248, 34287, 29330, 34350, 34389, 34413, 34481, 26793, 18866, 26187, 29635, 22293, 18888, 36654, 25783, 34522, 34544, 34566, 25821, 35072, 22164, 34586, 34609, 34632, 19604, 24036, 36644, 36674, 24681, 18888, 32401, 34654, 31339, 34682, 34698, 27211, 34717, 34753, 28053, 34812, 34836, 24401, 33619, 19628, 34858, 32236, 34906, 24598, 33523, 27612, 34890, 34922, 24732, 29246, 36717, 33634, 34465, 32984, 34168, 26750, 34957, 18888, 18888, 34994, 35010, 27211, 33040, 17590, 29913, 35035, 24401, 36304, 25482, 30171, 35883, 35068, 35088, 26627, 20441, 31173, 35123, 35143, 35176, 24640, 30492, 29358, 19719, 35192, 35219, 25384, 28801, 35255, 35279, 32586, 34496, 23086, 23330, 29061, 31017, 27856, 31741, 19840, 25783, 31738, 24547, 25164, 35315, 31796, 35353, 34316, 22105, 19419, 27963, 24091, 28630, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22848, 18836, 22059, 34782, 34088, 35389, 21008, 35405, 35421, 35454, 18888, 18888, 23466, 35487, 27211, 27211, 27211, 35513, 31154, 24401, 24401, 24401, 35560, 18888, 26863, 36664, 35601, 24872, 25783, 30389, 23536, 26250, 35647, 35666, 22164, 19522, 19564, 30582, 35682, 27697, 35575, 29114, 18888, 18888, 18888, 18890, 27211, 35702, 27211, 27211, 27211, 35723, 24401, 35527, 24401, 24401, 24401, 19628, 30184, 18888, 18888, 18888, 23086, 35739, 27211, 27211, 27211, 29139, 22938, 24401, 24401, 24401, 24401, 23898, 35756, 18888, 18888, 25025, 35778, 27211, 27211, 17590, 20064, 35795, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 23917, 18890, 34550, 31833, 22262, 19447, 23086, 23330, 26418, 31017, 27856, 31741, 19840, 25783, 35812, 19837, 27187, 35841, 33135, 23516, 31008, 22105, 22148, 28712, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22863, 18836, 22059, 35877, 28723, 34097, 31164, 29183, 22087, 26758, 18888, 22592, 18890, 23989, 27211, 29812, 27211, 22121, 33778, 24401, 31421, 24401, 18866, 18888, 18888, 26872, 18888, 18888, 25783, 27211, 30732, 27211, 27211, 35072, 22164, 24401, 24908, 24401, 24401, 24036, 31693, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22878, 18836, 22059, 27837, 27857, 35899, 24401, 35915, 22087, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 22121, 24401, 24401, 24401, 24401, 18866, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 24036, 31602, 18888, 18888, 18888, 18888, 26223, 27211, 27211, 27211, 27211, 27211, 19484, 35931, 24401, 24401, 24401, 24401, 19628, 18888, 28136, 18888, 18888, 35949, 27211, 32862, 27211, 32697, 30756, 24012, 24401, 32283, 24401, 32128, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22893, 18836, 22059, 35974, 34882, 34097, 33960, 29183, 35996, 18888, 23311, 18888, 36029, 27211, 27211, 36064, 36081, 22121, 24401, 24401, 36104, 33950, 18866, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 35072, 22164, 24401, 24401, 24401, 24401, 24036, 36121, 18888, 25559, 18888, 18888, 18890, 27211, 27211, 30313, 27211, 27211, 36154, 24401, 24401, 34397, 24401, 24401, 19628, 28250, 18888, 18888, 18888, 23086, 30926, 27211, 27211, 27211, 26983, 24012, 33642, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22339, 18836, 22059, 19354, 27857, 36190, 24401, 36206, 22087, 18888, 18888, 18888, 18007, 27211, 27211, 27211, 24724, 22121, 24401, 24401, 24401, 30827, 18866, 18888, 36222, 18888, 28795, 18888, 25783, 35100, 27211, 27429, 27211, 35072, 22164, 30836, 24401, 24499, 24401, 24036, 31693, 18888, 36244, 18888, 18888, 18890, 27211, 36088, 27211, 27211, 27211, 19484, 24401, 28036, 24401, 24401, 24401, 19628, 18888, 18888, 35631, 18888, 35762, 27211, 27211, 36277, 27211, 34730, 24012, 24401, 24401, 36300, 24401, 36320, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 25712, 18888, 18888, 36346, 27211, 27212, 19184, 24402, 19868, 25659, 32029, 18889, 27211, 33359, 19719, 23889, 36369, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22384, 18836, 36389, 19008, 19233, 20367, 36434, 17173, 17595, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 36453, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 20362, 21726, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 22369, 18836, 18987, 19008, 19233, 20367, 19008, 21737, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17949, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21813, 18836, 36489, 19008, 19233, 20367, 19008, 17173, 17737, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17768, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 20543, 22022, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21828, 18836, 18987, 19008, 19233, 20367, 19008, 17173, 30763, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 36517, 17308, 17327, 17346, 18918, 18452, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 18127, 21873, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 21828, 18836, 19307, 18888, 27857, 30756, 24401, 29183, 28015, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 36567, 24401, 24401, 24401, 24401, 22953, 18888, 18888, 18888, 18888, 18888, 25783, 27211, 27211, 27211, 27211, 28537, 36603, 24401, 24401, 24401, 24401, 24036, 18881, 18888, 18888, 18888, 18888, 18890, 27211, 27211, 27211, 27211, 27211, 19484, 24401, 24401, 24401, 24401, 24401, 19628, 18888, 18888, 18888, 18888, 23086, 27211, 27211, 27211, 27211, 30756, 24012, 24401, 24401, 24401, 24401, 26750, 18888, 18888, 18888, 27855, 27211, 27211, 27211, 17590, 24017, 24401, 24401, 24401, 18887, 18888, 18888, 27211, 27211, 27212, 24016, 24402, 19868, 25659, 18888, 18889, 27211, 27211, 19719, 23889, 19868, 31018, 18890, 27211, 31833, 19406, 19447, 23086, 23330, 19828, 31017, 27856, 31741, 19840, 25783, 31738, 19837, 25782, 19760, 31015, 23516, 31008, 22105, 19419, 27963, 19659, 27951, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 36629, 36690, 18720, 19008, 19233, 20367, 19008, 17454, 17595, 36437, 17330, 17349, 18921, 17189, 17208, 17281, 20355, 17223, 17308, 17327, 17346, 18918, 36754, 21880, 18649, 18665, 19006, 17265, 22033, 20765, 17421, 20535, 17192, 20362, 21726, 17311, 18658, 18999, 19008, 17447, 32952, 17497, 17520, 17251, 36411, 17782, 20682, 17714, 18326, 17543, 17559, 17585, 21887, 17504, 17527, 17258, 36418, 21915, 21940, 17611, 36467, 18217, 17633, 17661, 21190, 17703, 21176, 17730, 34737, 21946, 17617, 36473, 18223, 36531, 17477, 19152, 17860, 17892, 17675, 17753, 17832, 17590, 21620, 17481, 19156, 17864, 18731, 17918, 36551, 17292, 17934, 17979, 18727, 18681, 18405, 18621, 18039, 18056, 18072, 18117, 18143, 18706, 18052, 18209, 18250, 18239, 18266, 17963, 18296, 18312, 18376, 17807, 36403, 19232, 17796, 17163, 30642, 18392, 17816, 32961, 17645, 18805, 18421, 18437, 18519, 17393, 18747, 18505, 18535, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 17590, 0, 94242, 0, 118820, 0, 2211840, 102439, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2482176, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 2207744, 2404352, 2412544, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3104768, 2605056, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2678784, 2207744, 2695168, 2207744, 2703360, 2207744, 2711552, 2752512, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 3170304, 3174400, 2158592, 0, 139, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2424832, 2158592, 2158592, 2158592, 2748416, 2756608, 2777088, 2801664, 2158592, 2158592, 2158592, 2863104, 2891776, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3104768, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2207744, 2785280, 2207744, 2809856, 2207744, 2207744, 2842624, 2207744, 2207744, 2207744, 2899968, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2473984, 2207744, 2207744, 2494464, 2207744, 2207744, 2207744, 2523136, 2158592, 2404352, 2412544, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2564096, 2158592, 2158592, 2605056, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2678784, 2158592, 2695168, 2158592, 2703360, 2158592, 2711552, 2752512, 2158592, 2158592, 2785280, 2158592, 2158592, 2785280, 2158592, 2809856, 2158592, 2158592, 2842624, 2158592, 2158592, 2158592, 2899968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 18, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 641, 0, 2158592, 0, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 32768, 0, 2158592, 0, 2158592, 2158592, 2158592, 2383872, 2158592, 2158592, 2158592, 2158592, 3006464, 2383872, 2207744, 2207744, 2207744, 2207744, 2158877, 2158877, 2158877, 2158877, 0, 0, 0, 2158877, 2572573, 2158877, 2158877, 0, 2207744, 2207744, 2596864, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2641920, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 167936, 0, 0, 2162688, 0, 0, 3104768, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 0, 0, 2146304, 2146304, 2224128, 2224128, 2232320, 2232320, 2232320, 641, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2531328, 2158592, 2158592, 2158592, 2158592, 2158592, 2617344, 2158592, 2158592, 2158592, 2158592, 2441216, 2445312, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2502656, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2580480, 2158592, 2158592, 2158592, 2158592, 2621440, 2158592, 2580480, 2158592, 2158592, 2158592, 2158592, 2621440, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2699264, 2158592, 2158592, 2158592, 2158592, 2158592, 2748416, 2756608, 2777088, 2801664, 2207744, 2863104, 2891776, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3018752, 2207744, 3043328, 2207744, 2207744, 2207744, 2207744, 3080192, 2207744, 2207744, 3112960, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 172310, 279, 0, 2162688, 0, 0, 2207744, 2207744, 2207744, 3186688, 2207744, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2404352, 2412544, 2158592, 2510848, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2584576, 2158592, 2609152, 2158592, 2158592, 2629632, 2158592, 2158592, 2158592, 2686976, 2158592, 2715648, 2158592, 2158592, 3121152, 2158592, 2158592, 2158592, 3149824, 2158592, 2158592, 3170304, 3174400, 2158592, 2367488, 2207744, 2207744, 2207744, 2207744, 2158592, 2158592, 2158592, 2158592, 0, 0, 0, 2158592, 2572288, 2158592, 2158592, 0, 2207744, 2207744, 2207744, 2433024, 2207744, 2453504, 2461696, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2510848, 2207744, 2207744, 2207744, 2207744, 2207744, 2531328, 2207744, 2207744, 2207744, 2207744, 2207744, 2617344, 2207744, 2207744, 2207744, 2207744, 2158592, 2158592, 2158592, 2158592, 0, 0, 0, 2158592, 2572288, 2158592, 2158592, 1508, 2715648, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2867200, 2207744, 2904064, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2580480, 2207744, 2207744, 2207744, 2207744, 2621440, 2207744, 2207744, 2207744, 3149824, 2207744, 2207744, 3170304, 3174400, 2207744, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 2158592, 2158592, 2158592, 2404352, 2412544, 2707456, 2732032, 2207744, 2207744, 2207744, 2822144, 2826240, 2207744, 2895872, 2207744, 2207744, 2924544, 2207744, 2207744, 2973696, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 0, 285, 2158592, 2158592, 3112960, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 2207744, 2207744, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 0, 0, 2535424, 2543616, 2158592, 2158592, 2158592, 0, 0, 0, 2158592, 2158592, 2158592, 2990080, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2572288, 2981888, 2207744, 2207744, 3002368, 2207744, 3047424, 3063808, 3076096, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3203072, 2708960, 2732032, 2158592, 2158592, 2158592, 2822144, 2827748, 2158592, 2895872, 2158592, 2158592, 2924544, 2158592, 2158592, 2973696, 2158592, 2981888, 2158592, 2158592, 3002368, 2158592, 3047424, 3063808, 3076096, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3203072, 2981888, 2158592, 2158592, 3003876, 2158592, 3047424, 3063808, 3076096, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3203072, 2207744, 2207744, 2207744, 2207744, 2207744, 2424832, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 20480, 0, 0, 0, 0, 0, 2162688, 20480, 0, 2523136, 2527232, 2158592, 2158592, 2576384, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2908160, 2527232, 2207744, 2207744, 2576384, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2908160, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 0, 286, 2158592, 2158592, 0, 0, 2158592, 2158592, 2158592, 2158592, 2633728, 2658304, 0, 0, 2740224, 2744320, 0, 2834432, 2207744, 2207744, 2977792, 2207744, 2207744, 2207744, 2207744, 3039232, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3158016, 0, 0, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 933, 45, 45, 45, 45, 442, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 2494464, 2158592, 2158592, 2158592, 2524757, 2527232, 2158592, 2158592, 2576384, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 1504, 2158592, 2498560, 2158592, 2158592, 2158592, 2158592, 2568192, 2158592, 2592768, 2625536, 2158592, 2158592, 2674688, 2736128, 2158592, 2158592, 0, 2158592, 2912256, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3108864, 2158592, 2158592, 3133440, 3145728, 3153920, 2375680, 2379776, 2207744, 2207744, 2420736, 2207744, 2449408, 2207744, 2207744, 2207744, 2498560, 2207744, 2207744, 2207744, 2207744, 2568192, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 0, 551, 2158592, 2158592, 2158592, 2158592, 2207744, 2506752, 2207744, 2207744, 2207744, 2207744, 2207744, 2158592, 2506752, 0, 2020, 2158592, 2592768, 2625536, 2207744, 2207744, 2674688, 2736128, 2207744, 2207744, 2207744, 2912256, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 542, 0, 544, 2207744, 3108864, 2207744, 2207744, 3133440, 3145728, 3153920, 2375680, 2379776, 2158592, 2158592, 2420736, 2158592, 2449408, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 0, 641, 0, 0, 0, 0, 0, 0, 2367488, 2158592, 2498560, 2158592, 2158592, 1621, 2158592, 2158592, 2568192, 2158592, 2592768, 2625536, 2158592, 2158592, 2674688, 0, 0, 0, 0, 0, 1608, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1107, 97, 97, 1110, 97, 97, 3133440, 3145728, 3153920, 2158592, 2408448, 2416640, 2158592, 2465792, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3014656, 2158592, 2158592, 3051520, 2158592, 2158592, 3100672, 2158592, 2158592, 3121152, 2158592, 2158592, 2158592, 3149824, 2416640, 2207744, 2465792, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2633728, 2658304, 2740224, 2744320, 2834432, 2949120, 2158592, 2985984, 2158592, 2998272, 2158592, 2158592, 2158592, 3129344, 2207744, 2408448, 2949120, 2207744, 2985984, 2207744, 2998272, 2207744, 2207744, 2207744, 3129344, 2158592, 2408448, 2416640, 2158592, 2465792, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 0, 32768, 0, 0, 0, 0, 0, 0, 2367488, 2949120, 2158592, 2985984, 2158592, 2998272, 2158592, 2158592, 2158592, 3129344, 2158592, 2158592, 2478080, 2158592, 2158592, 2158592, 2535424, 2543616, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3117056, 2207744, 2207744, 2478080, 2207744, 2207744, 2207744, 2207744, 2699264, 2207744, 2207744, 2207744, 2207744, 2207744, 2748416, 2756608, 2777088, 2801664, 2207744, 2207744, 2158877, 2158877, 2158877, 2158877, 2158877, 0, 0, 0, 2158877, 2158877, 2158877, 2158877, 0, 0, 2535709, 2543901, 2158877, 2158877, 2158877, 0, 0, 0, 2158877, 2158877, 2158877, 2990365, 2158877, 2158877, 2158730, 2158730, 2158730, 2158730, 2158730, 2572426, 2207744, 2535424, 2543616, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3117056, 2158592, 2158592, 2478080, 2207744, 2207744, 2990080, 2207744, 2207744, 2158592, 2158592, 2482176, 2158592, 2158592, 0, 0, 0, 2158592, 2158592, 2158592, 0, 2158592, 2908160, 2158592, 2158592, 2158592, 2977792, 2158592, 2158592, 2158592, 2158592, 3039232, 2158592, 2158592, 3010560, 2207744, 2428928, 2207744, 2514944, 2207744, 2588672, 2207744, 2838528, 2207744, 2207744, 2207744, 3010560, 2158592, 2428928, 2158592, 2514944, 0, 0, 2158592, 2588672, 2158592, 0, 2838528, 2158592, 2158592, 2158592, 3010560, 2158592, 2506752, 2158592, 18, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 2158592, 0, 0, 29315, 922, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1539, 45, 3006464, 2383872, 0, 2020, 2158592, 2158592, 2158592, 2158592, 3006464, 2158592, 2637824, 2953216, 2158592, 2207744, 2637824, 2953216, 2207744, 0, 0, 2158592, 2637824, 2953216, 2158592, 2539520, 2158592, 2539520, 2207744, 0, 0, 2539520, 2158592, 2158592, 2158592, 2158592, 2207744, 2506752, 2207744, 2207744, 2207744, 2207744, 2207744, 2158592, 2506752, 0, 0, 2158592, 2207744, 0, 2158592, 2158592, 2207744, 0, 2158592, 2158592, 2207744, 0, 2158592, 2965504, 2965504, 2965504, 0, 0, 0, 0, 0, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2474269, 2158877, 2158877, 0, 0, 2158877, 2158877, 2158877, 2158877, 2634013, 2658589, 0, 0, 2740509, 2744605, 0, 2834717, 40976, 18, 36884, 45078, 24, 28, 90143, 94242, 118820, 102439, 106538, 98347, 118820, 118820, 118820, 40976, 18, 18, 36884, 0, 0, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 86016, 0, 0, 2211840, 102439, 0, 0, 0, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 3158016, 0, 2375680, 2379776, 2158592, 2158592, 2420736, 2158592, 2449408, 2158592, 2158592, 0, 94242, 0, 0, 0, 2211840, 102439, 0, 0, 106538, 98347, 135, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2564096, 2158592, 2158592, 2158592, 2158592, 2158592, 2596864, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2641920, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2781184, 2793472, 2494464, 2158592, 2158592, 2158592, 2523136, 2527232, 2158592, 2158592, 2576384, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 24, 0, 27, 27, 0, 2158592, 2498560, 2158592, 2158592, 0, 2158592, 2158592, 2568192, 2158592, 2592768, 2625536, 2158592, 2158592, 2674688, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2473984, 2158592, 2158592, 2494464, 2158592, 2158592, 2158592, 3006464, 2383872, 0, 0, 2158592, 2158592, 2158592, 2158592, 3006464, 2158592, 2637824, 2953216, 2158592, 2207744, 2637824, 2953216, 40976, 18, 36884, 45078, 24, 27, 147488, 94242, 147456, 147488, 106538, 98347, 0, 0, 147456, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 0, 81920, 0, 94242, 0, 0, 0, 2211840, 0, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2428928, 2158592, 2514944, 2158592, 2588672, 2158592, 2838528, 2158592, 2158592, 40976, 18, 151573, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 0, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 1315, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1487, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 0, 0, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 130, 94242, 0, 0, 0, 2211840, 102439, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3096576, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2207744, 2207744, 2158592, 18, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 2158592, 644, 2207744, 2207744, 2207744, 3186688, 2207744, 0, 1080, 0, 1084, 0, 1088, 0, 0, 0, 0, 0, 0, 0, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2531466, 2158730, 2158730, 2158730, 2158730, 2158730, 2617482, 0, 94242, 0, 0, 0, 2211840, 102439, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2781184, 2793472, 2158592, 2818048, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 40976, 18, 36884, 45078, 24, 27, 90143, 159779, 159744, 102439, 159779, 98347, 0, 0, 159744, 40976, 18, 18, 36884, 0, 45078, 0, 2224253, 172032, 2224253, 2232448, 2232448, 172032, 2232448, 90143, 0, 0, 2170880, 0, 0, 550, 829, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 124, 124, 127, 127, 127, 40976, 18, 36884, 45078, 25, 29, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 163931, 40976, 18, 18, 36884, 0, 45078, 249856, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 2170880, 0, 0, 827, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 4243810, 4243810, 24, 24, 27, 27, 27, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 0, 0, 0, 0, 57344, 286, 2158592, 2158592, 2158592, 2158592, 2707456, 2732032, 2158592, 2158592, 2158592, 2822144, 2826240, 2158592, 2895872, 2158592, 2158592, 2924544, 2158592, 2158592, 2973696, 2158592, 2207744, 2207744, 2207744, 3186688, 2207744, 0, 0, 0, 0, 0, 0, 53248, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 1613, 97, 97, 97, 97, 97, 97, 1495, 97, 97, 97, 97, 97, 97, 97, 97, 97, 566, 97, 97, 97, 97, 97, 97, 2207744, 0, 0, 0, 0, 0, 0, 2166784, 546, 0, 0, 0, 0, 286, 2158592, 2158592, 2158592, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 17, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 20480, 120, 121, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 2170880, 0, 53248, 550, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 196608, 18, 266240, 24, 24, 27, 27, 27, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 0, 45, 45, 45, 45, 45, 45, 45, 1535, 45, 45, 45, 45, 45, 45, 45, 1416, 45, 45, 45, 45, 45, 45, 45, 45, 424, 45, 45, 45, 45, 45, 45, 45, 45, 45, 405, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 199, 45, 45, 67, 67, 67, 67, 67, 491, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1766, 67, 67, 67, 1767, 67, 24850, 24850, 12564, 12564, 0, 0, 2166784, 546, 0, 53531, 53531, 0, 286, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 743, 57889, 0, 2170880, 0, 0, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 1856, 45, 1858, 1859, 67, 67, 67, 1009, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1021, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2367773, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2699549, 2158877, 2158877, 2158877, 2158877, 2158877, 2748701, 2756893, 2777373, 2801949, 97, 1115, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 857, 97, 67, 67, 67, 67, 67, 1258, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1826, 67, 97, 97, 97, 97, 97, 97, 1338, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 870, 97, 97, 67, 67, 67, 1463, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1579, 67, 67, 97, 97, 97, 1518, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 904, 905, 97, 97, 97, 97, 1620, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 921, 0, 0, 0, 0, 0, 0, 45, 1679, 67, 67, 67, 1682, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1690, 67, 0, 0, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 45, 45, 45, 669, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 189, 45, 45, 45, 1748, 45, 45, 45, 1749, 1750, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 1959, 67, 67, 67, 67, 1768, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1791, 97, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1802, 67, 1817, 67, 67, 67, 67, 67, 67, 1823, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 97, 97, 97, 97, 1848, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 659, 45, 45, 45, 45, 45, 45, 45, 1863, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 495, 67, 67, 67, 67, 67, 1878, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 0, 1973, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1165, 97, 1167, 67, 24850, 24850, 12564, 12564, 0, 0, 2166784, 0, 0, 53531, 53531, 0, 286, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 1789, 97, 0, 94242, 0, 0, 0, 2211840, 102439, 0, 0, 106538, 98347, 136, 2158592, 2158592, 2158592, 2158592, 2158592, 3158016, 229376, 2375680, 2379776, 2158592, 2158592, 2420736, 2158592, 2449408, 2158592, 2158592, 67, 24850, 24850, 12564, 12564, 0, 0, 280, 547, 0, 53531, 53531, 0, 286, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 1788, 97, 97, 0, 97, 2024, 97, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 235, 67, 67, 67, 67, 67, 57889, 547, 547, 0, 0, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 1799, 45, 45, 45, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 1092, 0, 0, 0, 0, 0, 97, 97, 97, 97, 1612, 97, 97, 97, 97, 1616, 97, 1297, 1472, 0, 0, 0, 0, 1303, 1474, 0, 0, 0, 0, 1309, 1476, 0, 0, 0, 0, 97, 97, 97, 1481, 97, 97, 97, 97, 97, 97, 1488, 97, 0, 1474, 0, 1476, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 607, 97, 97, 97, 97, 40976, 18, 36884, 45078, 26, 30, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 213080, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 143448, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 0, 0, 0, 0, 97, 97, 97, 97, 1482, 97, 1483, 97, 97, 97, 97, 97, 97, 1326, 97, 97, 1329, 1330, 97, 97, 97, 97, 97, 97, 1159, 1160, 97, 97, 97, 97, 97, 97, 97, 97, 590, 97, 97, 97, 97, 97, 97, 97, 0, 94242, 0, 0, 0, 2211974, 102439, 0, 0, 106538, 98347, 0, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2474122, 2158730, 2158730, 2494602, 2158730, 2158730, 2158730, 2809994, 2158730, 2158730, 2842762, 2158730, 2158730, 2158730, 2900106, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3014794, 2158730, 2158730, 3051658, 2158730, 2158730, 3100810, 2158730, 2158730, 2158730, 2158730, 3096714, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2207744, 2207744, 2207744, 2207744, 2207744, 2572288, 2207744, 2207744, 2207744, 2207744, 541, 541, 543, 543, 0, 0, 2166784, 0, 548, 549, 549, 0, 286, 2158877, 2158877, 2158877, 2863389, 2892061, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 3186973, 2158877, 0, 0, 0, 0, 0, 0, 0, 0, 2367626, 2158877, 2404637, 2412829, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2564381, 2158877, 2158877, 2605341, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2679069, 2158877, 2695453, 2158877, 2703645, 2158877, 2711837, 2752797, 2158877, 0, 2158877, 2158877, 2158877, 2384010, 2158730, 2158730, 2158730, 2158730, 3006602, 2383872, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3096576, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162688, 0, 0, 2158877, 2785565, 2158877, 2810141, 2158877, 2158877, 2842909, 2158877, 2158877, 2158877, 2900253, 2158877, 2158877, 2158877, 2158877, 2158877, 2531613, 2158877, 2158877, 2158877, 2158877, 2158877, 2617629, 2158877, 2158877, 2158877, 2158877, 2158730, 2818186, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3105053, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 0, 0, 0, 0, 0, 97, 97, 97, 1611, 97, 97, 97, 97, 97, 97, 97, 1496, 97, 97, 1499, 97, 97, 97, 97, 97, 2441354, 2445450, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2502794, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2433162, 2158730, 2453642, 2461834, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2580618, 2158730, 2158730, 2158730, 2158730, 2621578, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2699402, 2158730, 2158730, 2158730, 2158730, 2678922, 2158730, 2695306, 2158730, 2703498, 2158730, 2711690, 2752650, 2158730, 2158730, 2785418, 2158730, 2158730, 2158730, 3113098, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3186826, 2158730, 2207744, 2207744, 2207744, 2207744, 2781184, 2793472, 2207744, 2818048, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 541, 0, 543, 2158877, 2502941, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2580765, 2158877, 2158877, 2158877, 2158877, 2621725, 2158877, 3019037, 2158877, 3043613, 2158877, 2158877, 2158877, 2158877, 3080477, 2158877, 2158877, 3113245, 2158877, 2158877, 2158877, 2158877, 0, 2158877, 2908445, 2158877, 2158877, 2158877, 2978077, 2158877, 2158877, 2158877, 2158877, 3039517, 2158877, 2158730, 2510986, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2584714, 2158730, 2609290, 2158730, 2158730, 2629770, 2158730, 2158730, 2158730, 2388106, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2605194, 2158730, 2158730, 2158730, 2158730, 2687114, 2158730, 2715786, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2867338, 2158730, 2904202, 2158730, 2158730, 2158730, 2642058, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2781322, 2793610, 2158730, 3121290, 2158730, 2158730, 2158730, 3149962, 2158730, 2158730, 3170442, 3174538, 2158730, 2367488, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2441216, 2445312, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2502656, 2158877, 2433309, 2158877, 2453789, 2461981, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2511133, 2158877, 2158877, 2158877, 2158877, 2584861, 2158877, 2609437, 2158877, 2158877, 2629917, 2158877, 2158877, 2158877, 2687261, 2158877, 2715933, 2158877, 2158730, 2158730, 2973834, 2158730, 2982026, 2158730, 2158730, 3002506, 2158730, 3047562, 3063946, 3076234, 2158730, 2158730, 2158730, 2158730, 2207744, 2506752, 2207744, 2207744, 2207744, 2207744, 2207744, 2158877, 2507037, 0, 0, 2158877, 2158730, 2158730, 2158730, 3203210, 2207744, 2207744, 2207744, 2207744, 2207744, 2424832, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2564096, 2207744, 2207744, 2207744, 2707741, 2732317, 2158877, 2158877, 2158877, 2822429, 2826525, 2158877, 2896157, 2158877, 2158877, 2924829, 2158877, 2158877, 2973981, 2158877, 18, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 642, 0, 2158592, 0, 45, 1529, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1755, 45, 67, 67, 2982173, 2158877, 2158877, 3002653, 2158877, 3047709, 3064093, 3076381, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 3203357, 2523274, 2527370, 2158730, 2158730, 2576522, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2908298, 2494749, 2158877, 2158877, 2158877, 2523421, 2527517, 2158877, 2158877, 2576669, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 0, 40976, 0, 18, 18, 4321280, 2224253, 2232448, 4329472, 2232448, 2158730, 2498698, 2158730, 2158730, 2158730, 2158730, 2568330, 2158730, 2592906, 2625674, 2158730, 2158730, 2674826, 2736266, 2158730, 2158730, 2158730, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2158730, 2912394, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3109002, 2158730, 2158730, 3133578, 3145866, 3154058, 2375680, 2207744, 3108864, 2207744, 2207744, 3133440, 3145728, 3153920, 2375965, 2380061, 2158877, 2158877, 2421021, 2158877, 2449693, 2158877, 2158877, 2158877, 3117341, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3104906, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158877, 2498845, 2158877, 2158877, 0, 2158877, 2158877, 2568477, 2158877, 2593053, 2625821, 2158877, 2158877, 2674973, 0, 0, 0, 0, 97, 97, 1480, 97, 97, 97, 97, 97, 1485, 97, 97, 97, 0, 97, 97, 1729, 97, 1731, 97, 97, 97, 97, 97, 97, 97, 311, 97, 97, 97, 97, 97, 97, 97, 97, 1520, 97, 97, 1523, 97, 97, 1526, 97, 2736413, 2158877, 2158877, 0, 2158877, 2912541, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 3109149, 2158877, 2158877, 3014941, 2158877, 2158877, 3051805, 2158877, 2158877, 3100957, 2158877, 2158877, 3121437, 2158877, 2158877, 2158877, 3150109, 3133725, 3146013, 3154205, 2158730, 2408586, 2416778, 2158730, 2465930, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3018890, 2158730, 3043466, 2158730, 2158730, 2158730, 2158730, 3080330, 2633866, 2658442, 2740362, 2744458, 2834570, 2949258, 2158730, 2986122, 2158730, 2998410, 2158730, 2158730, 2158730, 3129482, 2207744, 2408448, 2949120, 2207744, 2985984, 2207744, 2998272, 2207744, 2207744, 2207744, 3129344, 2158877, 2408733, 2416925, 2158877, 2466077, 2158877, 2158877, 3170589, 3174685, 2158877, 0, 0, 0, 2158730, 2158730, 2158730, 2158730, 2158730, 2424970, 2158730, 2158730, 2158730, 2158730, 2707594, 2732170, 2158730, 2158730, 2158730, 2822282, 2826378, 2158730, 2896010, 2158730, 2158730, 2924682, 2949405, 2158877, 2986269, 2158877, 2998557, 2158877, 2158877, 2158877, 3129629, 2158730, 2158730, 2478218, 2158730, 2158730, 2158730, 2535562, 2543754, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3117194, 2207744, 2207744, 2478080, 2207744, 2207744, 2207744, 2207744, 3014656, 2207744, 2207744, 3051520, 2207744, 2207744, 3100672, 2207744, 2207744, 3121152, 2207744, 2207744, 2207744, 2207744, 2207744, 2584576, 2207744, 2609152, 2207744, 2207744, 2629632, 2207744, 2207744, 2207744, 2686976, 2207744, 2207744, 2535424, 2543616, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3117056, 2158877, 2158877, 2478365, 0, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158730, 2158730, 2482314, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2207744, 2207744, 2207744, 2387968, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 823, 0, 825, 2158730, 2158730, 2158730, 2990218, 2158730, 2158730, 2207744, 2207744, 2482176, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162688, 135, 0, 2207744, 2207744, 2990080, 2207744, 2207744, 2158877, 2158877, 2482461, 2158877, 2158877, 0, 0, 0, 2158877, 2158877, 2158877, 2158877, 2158877, 2158730, 2429066, 2158730, 2515082, 2158730, 2588810, 2158730, 2838666, 2158730, 2158730, 2158730, 3010698, 2207744, 2428928, 2207744, 2514944, 2207744, 2588672, 2207744, 2838528, 2207744, 2207744, 2207744, 3010560, 2158877, 2429213, 2158877, 2515229, 0, 0, 2158877, 2588957, 2158877, 0, 2838813, 2158877, 2158877, 2158877, 3010845, 2158730, 2506890, 2158730, 2158730, 2158730, 2748554, 2756746, 2777226, 2801802, 2158730, 2158730, 2158730, 2863242, 2891914, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 2564234, 2158730, 2158730, 2158730, 2158730, 2158730, 2597002, 2158730, 2158730, 2158730, 3006464, 2384157, 0, 0, 2158877, 2158877, 2158877, 2158877, 3006749, 2158730, 2637962, 2953354, 2158730, 2207744, 2637824, 2953216, 2207744, 0, 0, 2158877, 2638109, 2953501, 2158877, 2539658, 2158730, 2539520, 2207744, 0, 0, 2539805, 2158877, 2158730, 2158730, 2158730, 2977930, 2158730, 2158730, 2158730, 2158730, 3039370, 2158730, 2158730, 2158730, 2158730, 2158730, 2158730, 3158154, 2207744, 0, 2158877, 2158730, 2207744, 0, 2158877, 2158730, 2207744, 0, 2158877, 2965642, 2965504, 2965789, 0, 0, 0, 0, 1315, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 1484, 97, 97, 97, 97, 2158592, 18, 0, 122880, 0, 0, 0, 77824, 0, 2211840, 0, 0, 0, 0, 2158592, 0, 356, 0, 0, 0, 0, 0, 0, 28809, 0, 139, 45, 45, 45, 45, 45, 45, 1751, 45, 45, 45, 45, 45, 45, 45, 67, 67, 1427, 67, 67, 67, 67, 67, 1432, 67, 67, 67, 3104768, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 122880, 0, 0, 0, 0, 1315, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 1322, 550, 0, 286, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2424832, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 24, 24, 4329472, 27, 27, 2207744, 2207744, 2977792, 2207744, 2207744, 2207744, 2207744, 3039232, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 3158016, 542, 0, 0, 0, 542, 0, 544, 0, 0, 0, 544, 0, 550, 0, 0, 0, 0, 0, 97, 97, 1610, 97, 97, 97, 97, 97, 97, 97, 97, 898, 97, 97, 97, 97, 97, 97, 97, 0, 94242, 0, 0, 0, 2211840, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2424832, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 237568, 102439, 106538, 98347, 0, 0, 20480, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 192512, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 94, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 96, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 12378, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 126, 126, 126, 126, 90143, 0, 0, 2170880, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 20480, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 241664, 102439, 106538, 98347, 0, 0, 20568, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 200797, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 20480, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 0, 0, 44, 0, 0, 20575, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 41, 41, 41, 0, 0, 1126400, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 0, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 89, 40976, 18, 18, 36884, 0, 45078, 0, 24, 24, 24, 27, 131201, 27, 27, 90143, 0, 0, 2170880, 0, 0, 550, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2441216, 2445312, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 94242, 0, 0, 208896, 2211840, 102439, 0, 0, 106538, 98347, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 0, 0, 0, 0, 0, 0, 0, 0, 2367488, 32768, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2433024, 2158592, 2453504, 2461696, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2510848, 2158592, 2158592, 2158592, 2158592, 40976, 18, 36884, 245783, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 20480, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 221184, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 180224, 40976, 18, 18, 36884, 155648, 45078, 0, 24, 24, 217088, 27, 27, 27, 217088, 90143, 0, 0, 2170880, 0, 0, 828, 0, 2158592, 2158592, 2158592, 2387968, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2207744, 2207744, 2207744, 2387968, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162688, 233472, 0, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 45, 45, 718, 45, 45, 45, 45, 45, 45, 45, 45, 45, 727, 131427, 0, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 45, 1808, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 97, 97, 0, 0, 97, 67, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 97, 97, 0, 0, 97, 97, 97, 97, 97, 97, 1787, 0, 97, 97, 0, 97, 97, 97, 45, 45, 45, 45, 2029, 45, 67, 67, 67, 67, 2033, 57889, 0, 0, 54074, 54074, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 45, 1798, 45, 45, 1800, 45, 45, 0, 1472, 0, 0, 0, 0, 0, 1474, 0, 0, 0, 0, 0, 1476, 0, 0, 0, 0, 1315, 0, 0, 0, 0, 97, 97, 97, 97, 1320, 97, 97, 0, 0, 97, 97, 97, 97, 1786, 97, 0, 0, 97, 97, 0, 1790, 1527, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 663, 67, 24850, 24850, 12564, 12564, 0, 57889, 281, 0, 0, 53531, 53531, 367, 286, 97, 97, 0, 0, 97, 97, 97, 1785, 97, 97, 0, 0, 97, 97, 0, 97, 97, 1979, 97, 97, 45, 45, 1983, 45, 1984, 45, 45, 45, 45, 45, 652, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 690, 45, 45, 694, 45, 45, 40976, 19, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 262144, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 46, 67, 98, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 45, 67, 97, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 258048, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 1122423, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 1114152, 1114152, 1114152, 0, 0, 1114112, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 37, 102439, 106538, 98347, 0, 0, 204800, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 0, 102439, 106538, 98347, 0, 0, 57436, 40976, 18, 36884, 45078, 24, 27, 33, 33, 0, 33, 33, 33, 0, 0, 0, 40976, 18, 18, 36884, 0, 45078, 0, 124, 124, 124, 127, 127, 127, 127, 90143, 0, 0, 2170880, 0, 0, 550, 0, 2158877, 2158877, 2158877, 2388253, 2158877, 2158877, 2158877, 2158877, 2158877, 2781469, 2793757, 2158877, 2818333, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2867485, 2158877, 2904349, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 3096861, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2441501, 2445597, 2158877, 2158877, 2158877, 2158877, 2158877, 40976, 122, 123, 36884, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 936, 2158592, 4243810, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 2158592, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 935, 45, 45, 45, 715, 45, 45, 45, 45, 45, 45, 45, 723, 45, 45, 45, 45, 45, 1182, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 430, 45, 45, 45, 45, 45, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 47, 68, 99, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 48, 69, 100, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 49, 70, 101, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 50, 71, 102, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 51, 72, 103, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 52, 73, 104, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 53, 74, 105, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 54, 75, 106, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 55, 76, 107, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 56, 77, 108, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 57, 78, 109, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 58, 79, 110, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 59, 80, 111, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 60, 81, 112, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 61, 82, 113, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 62, 83, 114, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 63, 84, 115, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 64, 85, 116, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 65, 86, 117, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 38, 102439, 106538, 98347, 66, 87, 118, 40976, 18, 36884, 45078, 24, 27, 90143, 94242, 118820, 102439, 106538, 98347, 118820, 118820, 118820, 40976, 18, 18, 0, 0, 45078, 0, 24, 24, 24, 27, 27, 27, 27, 90143, 0, 0, 1314, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 1321, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 0, 367, 0, 0, 1315, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1360, 97, 97, 131, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 145, 149, 45, 45, 45, 45, 45, 174, 45, 179, 45, 185, 45, 188, 45, 45, 202, 67, 255, 67, 67, 269, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 292, 296, 97, 97, 97, 97, 97, 321, 97, 326, 97, 332, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 646, 335, 97, 97, 349, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 437, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 523, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 511, 67, 67, 67, 97, 97, 97, 620, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1501, 1502, 97, 793, 67, 67, 796, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 808, 67, 0, 0, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 2052, 67, 67, 67, 67, 813, 67, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 57889, 0, 0, 54074, 54074, 550, 830, 97, 97, 97, 97, 97, 97, 97, 97, 97, 315, 97, 97, 97, 97, 97, 97, 841, 97, 97, 97, 97, 97, 97, 97, 97, 97, 854, 97, 97, 97, 97, 97, 97, 589, 97, 97, 97, 97, 97, 97, 97, 97, 97, 867, 97, 97, 97, 97, 97, 97, 97, 891, 97, 97, 894, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 906, 45, 937, 45, 45, 940, 45, 45, 45, 45, 45, 45, 948, 45, 45, 45, 45, 45, 734, 735, 67, 737, 67, 738, 67, 740, 67, 67, 67, 45, 967, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 435, 45, 45, 45, 980, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 415, 45, 45, 67, 67, 1024, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 67, 67, 67, 67, 67, 25398, 1081, 13112, 1085, 54074, 1089, 0, 0, 0, 0, 0, 0, 363, 0, 28809, 0, 139, 45, 45, 45, 45, 45, 45, 1674, 45, 45, 45, 45, 45, 45, 45, 45, 67, 1913, 67, 1914, 67, 67, 67, 1918, 67, 67, 97, 97, 97, 97, 1118, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 630, 97, 97, 97, 97, 97, 1169, 97, 97, 97, 97, 97, 0, 921, 0, 1175, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 1534, 45, 45, 45, 45, 45, 1538, 45, 45, 45, 45, 1233, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 742, 67, 45, 45, 1191, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 454, 67, 67, 67, 67, 1243, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1251, 67, 0, 0, 97, 97, 97, 97, 45, 45, 67, 67, 2050, 0, 97, 97, 45, 45, 45, 732, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 67, 67, 67, 1284, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 772, 67, 67, 67, 1293, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 2158592, 2158592, 2158592, 2404352, 2412544, 1323, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1331, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1737, 97, 1364, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1373, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 647, 45, 45, 1387, 45, 45, 1391, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 410, 45, 45, 45, 45, 45, 1400, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1407, 45, 45, 45, 45, 45, 941, 45, 943, 45, 45, 45, 45, 45, 45, 951, 45, 67, 1438, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1447, 67, 67, 67, 67, 67, 67, 782, 67, 67, 67, 67, 67, 67, 67, 67, 67, 756, 67, 67, 67, 67, 67, 67, 97, 1491, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1500, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1736, 97, 45, 45, 1541, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 677, 45, 45, 67, 1581, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 791, 792, 67, 67, 67, 67, 1598, 67, 1600, 67, 67, 67, 67, 67, 67, 67, 67, 1472, 97, 97, 97, 1727, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1513, 97, 97, 67, 67, 97, 1879, 97, 1881, 97, 0, 1884, 0, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 0, 0, 0, 1842, 97, 97, 67, 67, 67, 67, 67, 97, 97, 97, 97, 1928, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 1903, 45, 45, 45, 67, 67, 67, 67, 97, 97, 97, 97, 1971, 0, 0, 97, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 1381, 45, 45, 45, 45, 1976, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1747, 809, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 97, 907, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 638, 0, 0, 0, 0, 1478, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1150, 97, 97, 97, 97, 67, 67, 67, 67, 1244, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 477, 67, 67, 67, 67, 67, 67, 1294, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1324, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 1374, 97, 97, 97, 97, 0, 1175, 0, 45, 45, 45, 45, 45, 45, 45, 45, 945, 45, 45, 45, 45, 45, 45, 45, 45, 1908, 45, 45, 1910, 45, 67, 67, 67, 67, 67, 67, 67, 67, 1919, 67, 0, 0, 97, 97, 97, 97, 45, 2048, 67, 2049, 0, 0, 97, 2051, 45, 45, 45, 939, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 397, 45, 45, 45, 1921, 67, 67, 1923, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 1947, 45, 1935, 0, 0, 0, 97, 1939, 97, 97, 1941, 97, 45, 45, 45, 45, 45, 45, 382, 389, 45, 45, 45, 45, 45, 45, 45, 45, 1810, 45, 45, 1812, 67, 67, 67, 67, 67, 256, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 336, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 371, 373, 45, 45, 45, 955, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 413, 45, 45, 45, 457, 459, 67, 67, 67, 67, 67, 67, 67, 67, 473, 67, 478, 67, 67, 482, 67, 67, 485, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 1828, 97, 554, 556, 97, 97, 97, 97, 97, 97, 97, 97, 570, 97, 575, 97, 97, 579, 97, 97, 582, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 330, 97, 97, 67, 746, 67, 67, 67, 67, 67, 67, 67, 67, 67, 758, 67, 67, 67, 67, 67, 67, 67, 1575, 67, 67, 67, 67, 67, 67, 67, 67, 493, 67, 67, 67, 67, 67, 67, 67, 97, 97, 844, 97, 97, 97, 97, 97, 97, 97, 97, 97, 856, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 1735, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 1642, 97, 1644, 97, 97, 890, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 67, 67, 67, 67, 1065, 1066, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 532, 67, 67, 67, 67, 67, 67, 67, 1451, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 496, 67, 67, 97, 97, 1505, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 593, 97, 97, 0, 1474, 0, 1476, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1617, 97, 97, 1635, 0, 1637, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 885, 97, 97, 97, 97, 67, 67, 1704, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 97, 97, 565, 572, 97, 97, 97, 97, 97, 97, 97, 97, 1832, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 1946, 45, 45, 67, 67, 67, 67, 67, 97, 1926, 97, 1927, 97, 0, 0, 0, 97, 97, 1934, 2043, 0, 0, 97, 97, 97, 2047, 45, 45, 67, 67, 0, 1832, 97, 97, 45, 45, 45, 981, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1227, 45, 45, 45, 131427, 0, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 372, 45, 45, 45, 45, 1661, 1662, 45, 45, 45, 45, 45, 1666, 45, 45, 45, 45, 45, 1673, 45, 1675, 45, 45, 45, 45, 45, 45, 45, 67, 1426, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1275, 67, 67, 67, 67, 67, 45, 418, 45, 45, 420, 45, 45, 423, 45, 45, 45, 45, 45, 45, 45, 45, 959, 45, 45, 962, 45, 45, 45, 45, 458, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 483, 67, 67, 67, 67, 504, 67, 67, 506, 67, 67, 509, 67, 67, 67, 67, 67, 67, 67, 528, 67, 67, 67, 67, 67, 67, 67, 67, 1287, 67, 67, 67, 67, 67, 67, 67, 555, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 580, 97, 97, 97, 97, 601, 97, 97, 603, 97, 97, 606, 97, 97, 97, 97, 97, 97, 848, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1498, 97, 97, 97, 97, 97, 97, 45, 45, 714, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 989, 990, 45, 67, 67, 67, 67, 67, 1011, 67, 67, 67, 67, 1015, 67, 67, 67, 67, 67, 67, 67, 753, 67, 67, 67, 67, 67, 67, 67, 67, 467, 67, 67, 67, 67, 67, 67, 67, 45, 45, 1179, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1003, 1004, 67, 1217, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 728, 67, 1461, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1034, 67, 97, 1516, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 871, 97, 67, 67, 67, 1705, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 97, 97, 567, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1715, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 1380, 45, 45, 45, 45, 45, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 1887, 97, 97, 0, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 2006, 45, 45, 1907, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1920, 67, 97, 0, 2035, 97, 97, 97, 97, 97, 45, 45, 45, 45, 67, 67, 67, 1428, 67, 67, 67, 67, 67, 67, 1435, 67, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 146, 45, 152, 45, 45, 165, 45, 175, 45, 180, 45, 45, 187, 190, 195, 45, 203, 254, 257, 262, 67, 270, 67, 67, 0, 24850, 12564, 0, 0, 0, 281, 28809, 53531, 97, 97, 97, 293, 97, 299, 97, 97, 312, 97, 322, 97, 327, 97, 97, 334, 337, 342, 97, 350, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 67, 484, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 499, 97, 581, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 596, 648, 45, 650, 45, 651, 45, 653, 45, 45, 45, 657, 45, 45, 45, 45, 45, 45, 1954, 67, 67, 67, 1958, 67, 67, 67, 67, 67, 67, 67, 768, 67, 67, 67, 67, 67, 67, 67, 67, 769, 67, 67, 67, 67, 67, 67, 67, 680, 45, 45, 45, 45, 45, 45, 45, 45, 688, 689, 691, 45, 45, 45, 45, 45, 983, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 947, 45, 45, 45, 45, 952, 45, 45, 698, 699, 45, 45, 702, 703, 45, 45, 45, 45, 45, 45, 45, 711, 744, 67, 67, 67, 67, 67, 67, 67, 67, 67, 757, 67, 67, 67, 67, 761, 67, 67, 67, 67, 765, 67, 767, 67, 67, 67, 67, 67, 67, 67, 67, 775, 776, 778, 67, 67, 67, 67, 67, 67, 785, 786, 67, 67, 789, 790, 67, 67, 67, 67, 67, 67, 1442, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 1775, 97, 97, 97, 67, 67, 67, 67, 67, 798, 67, 67, 67, 802, 67, 67, 67, 67, 67, 67, 67, 67, 1465, 67, 67, 1468, 67, 67, 1471, 67, 67, 810, 67, 67, 67, 67, 67, 67, 67, 67, 67, 821, 25398, 542, 13112, 544, 57889, 0, 0, 54074, 54074, 550, 0, 833, 97, 835, 97, 836, 97, 838, 97, 97, 0, 0, 97, 97, 97, 2002, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 1740, 45, 45, 45, 1744, 45, 45, 45, 97, 842, 97, 97, 97, 97, 97, 97, 97, 97, 97, 855, 97, 97, 97, 97, 0, 1717, 1718, 97, 97, 97, 97, 97, 1722, 97, 0, 0, 859, 97, 97, 97, 97, 863, 97, 865, 97, 97, 97, 97, 97, 97, 97, 97, 604, 97, 97, 97, 97, 97, 97, 97, 873, 874, 876, 97, 97, 97, 97, 97, 97, 883, 884, 97, 97, 887, 888, 97, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 225280, 0, 365, 0, 367, 0, 45, 45, 45, 1531, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1199, 45, 45, 45, 45, 45, 97, 97, 908, 97, 97, 97, 97, 97, 97, 97, 97, 97, 919, 638, 0, 0, 0, 0, 2158877, 2158877, 2158877, 2158877, 2158877, 2425117, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2597149, 2158877, 2158877, 2158877, 2158877, 2158877, 2158877, 2642205, 2158877, 2158877, 2158877, 2158877, 2158877, 3158301, 0, 2375818, 2379914, 2158730, 2158730, 2420874, 2158730, 2449546, 2158730, 2158730, 953, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 965, 978, 45, 45, 45, 45, 45, 45, 985, 45, 45, 45, 45, 45, 45, 45, 45, 971, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1027, 67, 1029, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1455, 67, 67, 67, 67, 67, 67, 67, 1077, 1078, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 0, 0, 0, 366, 0, 139, 2158730, 2158730, 2158730, 2404490, 2412682, 1113, 97, 97, 97, 97, 97, 97, 1121, 97, 1123, 97, 97, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1540, 1155, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 615, 1168, 97, 97, 1171, 1172, 97, 97, 0, 921, 0, 1175, 0, 0, 0, 0, 45, 45, 45, 45, 45, 1533, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1663, 45, 45, 45, 45, 45, 45, 45, 45, 45, 183, 45, 45, 45, 45, 201, 45, 45, 45, 1219, 45, 45, 45, 45, 45, 45, 45, 1226, 45, 45, 45, 45, 45, 168, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 427, 45, 45, 45, 45, 45, 45, 45, 1231, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1242, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1046, 67, 67, 1254, 67, 1256, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 806, 807, 67, 67, 97, 1336, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1111, 97, 97, 97, 97, 97, 1351, 97, 97, 97, 1354, 97, 97, 97, 1359, 97, 97, 97, 0, 97, 97, 97, 97, 1640, 97, 97, 97, 97, 97, 97, 97, 897, 97, 97, 97, 902, 97, 97, 97, 97, 97, 97, 97, 97, 1366, 97, 97, 97, 97, 97, 97, 97, 1371, 97, 97, 97, 0, 97, 97, 97, 1730, 97, 97, 97, 97, 97, 97, 97, 97, 915, 97, 97, 97, 97, 0, 360, 0, 67, 67, 67, 1440, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1017, 67, 1019, 67, 67, 67, 67, 67, 1453, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1459, 97, 97, 97, 1493, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1525, 97, 97, 97, 97, 97, 97, 1507, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1514, 67, 67, 67, 67, 1584, 67, 67, 67, 67, 67, 1590, 67, 67, 67, 67, 67, 67, 67, 783, 67, 67, 67, 788, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1599, 1601, 67, 67, 67, 1604, 67, 1606, 1607, 67, 1472, 0, 1474, 0, 1476, 0, 97, 97, 97, 97, 97, 97, 1614, 97, 97, 97, 97, 45, 45, 1850, 45, 45, 45, 45, 1855, 45, 45, 45, 45, 45, 1222, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1229, 97, 1618, 97, 97, 97, 97, 97, 97, 97, 1625, 97, 97, 97, 97, 97, 0, 1175, 0, 45, 45, 45, 45, 45, 45, 45, 45, 447, 45, 45, 45, 45, 45, 67, 67, 1633, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 1643, 1645, 97, 97, 0, 0, 97, 97, 1784, 97, 97, 97, 0, 0, 97, 97, 0, 97, 1894, 1895, 97, 1897, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 656, 45, 45, 45, 45, 45, 45, 97, 1648, 97, 1650, 1651, 97, 0, 45, 45, 45, 1654, 45, 45, 45, 45, 45, 169, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 658, 45, 45, 45, 45, 664, 45, 45, 1659, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1187, 45, 45, 1669, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 1005, 67, 67, 1681, 67, 67, 67, 67, 67, 67, 67, 1686, 67, 67, 67, 67, 67, 67, 67, 784, 67, 67, 67, 67, 67, 67, 67, 67, 1055, 67, 67, 67, 67, 1060, 67, 67, 97, 97, 1713, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 1378, 45, 45, 45, 45, 45, 45, 45, 408, 45, 45, 45, 45, 45, 45, 45, 45, 1547, 45, 1549, 45, 45, 45, 45, 45, 97, 97, 1780, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 45, 2027, 2028, 45, 45, 67, 67, 2031, 2032, 67, 45, 45, 1804, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 1917, 67, 67, 67, 67, 67, 67, 67, 1819, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 1708, 97, 97, 97, 97, 97, 45, 45, 1862, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 497, 67, 67, 67, 1877, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 0, 97, 97, 97, 97, 97, 1839, 0, 0, 97, 97, 97, 97, 1936, 0, 0, 97, 97, 97, 97, 97, 97, 1943, 1944, 1945, 45, 45, 45, 45, 670, 45, 45, 45, 45, 674, 45, 45, 45, 45, 678, 45, 1948, 45, 1950, 45, 45, 45, 45, 1955, 1956, 1957, 67, 67, 67, 1960, 67, 1962, 67, 67, 67, 67, 1967, 1968, 1969, 97, 0, 0, 0, 97, 97, 1974, 97, 0, 1936, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 1906, 0, 1977, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1746, 45, 45, 45, 45, 2011, 67, 67, 2013, 67, 67, 67, 2017, 97, 97, 0, 0, 2021, 97, 8192, 97, 97, 2025, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1916, 67, 67, 67, 67, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 140, 45, 45, 45, 1180, 45, 45, 45, 45, 1184, 45, 45, 45, 45, 45, 45, 45, 387, 45, 392, 45, 45, 396, 45, 45, 399, 45, 45, 67, 207, 67, 67, 67, 67, 67, 67, 236, 67, 67, 67, 67, 67, 67, 67, 800, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1603, 67, 67, 67, 67, 67, 0, 97, 97, 287, 97, 97, 97, 97, 97, 97, 316, 97, 97, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 1656, 1657, 45, 376, 45, 45, 45, 45, 45, 388, 45, 45, 45, 45, 45, 45, 45, 45, 1406, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 462, 67, 67, 67, 67, 67, 474, 67, 67, 67, 67, 67, 67, 67, 817, 67, 67, 67, 67, 25398, 542, 13112, 544, 97, 97, 97, 97, 559, 97, 97, 97, 97, 97, 571, 97, 97, 97, 97, 97, 97, 896, 97, 97, 97, 900, 97, 97, 97, 97, 97, 97, 912, 914, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 391, 45, 45, 45, 45, 45, 45, 45, 45, 713, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 662, 45, 1140, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 636, 67, 67, 1283, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 513, 67, 67, 1363, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 889, 97, 97, 97, 1714, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 926, 45, 45, 45, 45, 45, 45, 45, 45, 672, 45, 45, 45, 45, 45, 45, 45, 45, 686, 45, 45, 45, 45, 45, 45, 45, 45, 944, 45, 45, 45, 45, 45, 45, 45, 45, 1676, 45, 45, 45, 45, 45, 45, 67, 97, 97, 97, 1833, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 1902, 45, 45, 45, 45, 45, 957, 45, 45, 45, 45, 961, 45, 963, 45, 45, 45, 67, 97, 2034, 0, 97, 97, 97, 97, 97, 2040, 45, 45, 45, 2042, 67, 67, 67, 67, 67, 67, 1574, 67, 67, 67, 67, 67, 1578, 67, 67, 67, 67, 67, 67, 799, 67, 67, 67, 804, 67, 67, 67, 67, 67, 67, 67, 1298, 0, 0, 0, 1304, 0, 0, 0, 1310, 132, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 45, 45, 1414, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 428, 45, 45, 45, 45, 45, 57889, 0, 0, 54074, 54074, 550, 831, 97, 97, 97, 97, 97, 97, 97, 97, 97, 568, 97, 97, 97, 97, 578, 97, 45, 45, 968, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1228, 45, 45, 67, 67, 67, 67, 67, 25398, 1082, 13112, 1086, 54074, 1090, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 139, 2158592, 2158592, 2158592, 2404352, 2412544, 67, 67, 67, 67, 1464, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 510, 67, 67, 67, 67, 97, 97, 97, 97, 1519, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 918, 97, 0, 0, 0, 0, 1528, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 976, 45, 1554, 45, 45, 45, 45, 45, 45, 45, 45, 1562, 45, 45, 1565, 45, 45, 45, 45, 683, 45, 45, 45, 687, 45, 45, 692, 45, 45, 45, 45, 45, 1953, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1014, 67, 67, 67, 67, 67, 67, 1568, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 67, 67, 67, 67, 67, 1585, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1594, 97, 97, 1649, 97, 97, 97, 0, 45, 45, 1653, 45, 45, 45, 45, 45, 45, 383, 45, 45, 45, 45, 45, 45, 45, 45, 45, 986, 45, 45, 45, 45, 45, 45, 45, 45, 1670, 45, 1672, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 736, 67, 67, 67, 67, 67, 741, 67, 67, 67, 1680, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1074, 67, 67, 67, 1692, 67, 67, 67, 67, 67, 67, 67, 1697, 67, 1699, 67, 67, 67, 67, 67, 67, 1012, 67, 67, 67, 67, 67, 67, 67, 67, 67, 468, 475, 67, 67, 67, 67, 67, 67, 1769, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 624, 97, 97, 97, 97, 97, 97, 634, 97, 97, 1792, 97, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 958, 45, 45, 45, 45, 45, 45, 964, 45, 150, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 977, 204, 45, 67, 67, 67, 217, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 787, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 271, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 97, 351, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 45, 45, 938, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1398, 45, 45, 45, 153, 45, 161, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 660, 661, 45, 45, 205, 45, 67, 67, 67, 67, 220, 67, 228, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 280, 94, 0, 0, 67, 67, 67, 67, 67, 272, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 97, 352, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 45, 439, 45, 45, 45, 45, 45, 445, 45, 45, 45, 452, 45, 45, 67, 67, 212, 216, 67, 67, 67, 67, 67, 241, 67, 246, 67, 252, 67, 67, 486, 67, 67, 67, 67, 67, 67, 67, 494, 67, 67, 67, 67, 67, 67, 67, 1245, 67, 67, 67, 67, 67, 67, 67, 67, 1013, 67, 67, 1016, 67, 67, 67, 67, 67, 521, 67, 67, 525, 67, 67, 67, 67, 67, 531, 67, 67, 67, 538, 67, 0, 0, 2046, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 45, 45, 45, 1192, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1418, 45, 45, 1421, 97, 97, 583, 97, 97, 97, 97, 97, 97, 97, 591, 97, 97, 97, 97, 97, 97, 913, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 1384, 97, 618, 97, 97, 622, 97, 97, 97, 97, 97, 628, 97, 97, 97, 635, 97, 18, 131427, 0, 0, 0, 639, 0, 132, 362, 0, 0, 365, 29315, 367, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 932, 45, 45, 45, 45, 45, 1544, 45, 45, 45, 45, 45, 1550, 45, 45, 45, 45, 45, 1194, 45, 1196, 45, 45, 45, 45, 45, 45, 45, 45, 999, 45, 45, 45, 45, 45, 67, 67, 45, 45, 667, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1408, 45, 45, 45, 696, 45, 45, 45, 701, 45, 45, 45, 45, 45, 45, 45, 45, 710, 45, 45, 45, 1220, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 194, 45, 45, 45, 729, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 797, 67, 67, 67, 67, 67, 67, 805, 67, 67, 67, 67, 67, 67, 67, 1587, 67, 1589, 67, 67, 67, 67, 67, 67, 67, 67, 1763, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 2162968, 0, 0, 67, 67, 67, 67, 67, 814, 816, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 67, 67, 1008, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1020, 67, 0, 97, 45, 67, 0, 97, 45, 67, 0, 97, 45, 67, 97, 0, 0, 97, 97, 97, 97, 97, 45, 45, 45, 45, 67, 67, 67, 67, 1429, 67, 1430, 67, 67, 67, 67, 67, 1062, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 518, 1076, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 0, 0, 0, 28809, 0, 139, 45, 45, 45, 45, 45, 97, 97, 97, 97, 1102, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1124, 97, 1126, 97, 97, 1114, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1112, 97, 97, 1156, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 594, 97, 97, 97, 97, 1170, 97, 97, 97, 97, 0, 921, 0, 0, 0, 0, 0, 0, 45, 45, 45, 45, 1532, 45, 45, 45, 45, 1536, 45, 45, 45, 45, 45, 172, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 706, 45, 45, 709, 45, 45, 1177, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1202, 45, 1204, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1215, 45, 45, 45, 1232, 45, 45, 45, 45, 45, 45, 45, 67, 1237, 67, 67, 67, 67, 67, 67, 1053, 1054, 67, 67, 67, 67, 67, 67, 1061, 67, 67, 1282, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1289, 67, 67, 67, 1292, 97, 97, 97, 97, 1339, 97, 97, 97, 97, 97, 97, 1344, 97, 97, 97, 97, 45, 1849, 45, 1851, 45, 45, 45, 45, 45, 45, 45, 45, 721, 45, 45, 45, 45, 45, 726, 45, 1385, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1188, 45, 45, 1401, 1402, 45, 45, 45, 45, 1405, 45, 45, 45, 45, 45, 45, 45, 45, 1752, 45, 45, 45, 45, 45, 67, 67, 1410, 45, 45, 45, 1413, 45, 1415, 45, 45, 45, 45, 45, 45, 1419, 45, 45, 45, 45, 1806, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 97, 97, 2019, 0, 97, 67, 67, 67, 1452, 67, 67, 67, 67, 67, 67, 67, 67, 1457, 67, 67, 67, 67, 67, 67, 1259, 67, 67, 67, 67, 67, 67, 1264, 67, 67, 1460, 67, 1462, 67, 67, 67, 67, 67, 67, 1466, 67, 67, 67, 67, 67, 67, 67, 67, 1588, 67, 67, 67, 67, 67, 67, 67, 0, 1300, 0, 0, 0, 1306, 0, 0, 0, 97, 97, 97, 1506, 97, 97, 97, 97, 97, 97, 97, 97, 1512, 97, 97, 97, 0, 1728, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 901, 97, 97, 97, 97, 1515, 97, 1517, 97, 97, 97, 97, 97, 97, 1521, 97, 97, 97, 97, 97, 97, 0, 45, 1652, 45, 45, 45, 1655, 45, 45, 45, 45, 45, 1542, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1552, 1553, 45, 45, 45, 1556, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 693, 45, 45, 45, 67, 67, 67, 67, 1572, 67, 67, 67, 67, 1576, 67, 67, 67, 67, 67, 67, 67, 67, 1602, 67, 67, 1605, 67, 67, 67, 0, 67, 1582, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1580, 67, 67, 1596, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 542, 0, 544, 67, 67, 67, 67, 1759, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 533, 67, 67, 67, 67, 67, 67, 67, 1770, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 1777, 97, 97, 97, 1793, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 998, 45, 45, 1001, 1002, 45, 45, 67, 67, 45, 1861, 45, 67, 67, 67, 67, 67, 67, 67, 67, 1871, 67, 1873, 1874, 67, 0, 97, 45, 67, 0, 97, 45, 67, 16384, 97, 45, 67, 97, 0, 0, 0, 1473, 0, 1082, 0, 0, 0, 1475, 0, 1086, 0, 0, 0, 1477, 1876, 67, 97, 97, 97, 97, 97, 1883, 0, 1885, 97, 97, 97, 1889, 0, 0, 0, 286, 0, 0, 0, 286, 0, 2367488, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 40976, 0, 18, 18, 24, 24, 126, 126, 126, 2053, 0, 2055, 45, 67, 0, 97, 45, 67, 0, 97, 45, 67, 97, 0, 0, 97, 97, 97, 2039, 97, 45, 45, 45, 45, 67, 67, 67, 67, 67, 226, 67, 67, 67, 67, 67, 67, 67, 67, 1246, 67, 67, 1249, 1250, 67, 67, 67, 132, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 141, 45, 45, 45, 1403, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1186, 45, 45, 1189, 45, 45, 155, 45, 45, 45, 45, 45, 45, 45, 45, 45, 191, 45, 45, 45, 45, 700, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1753, 45, 45, 45, 67, 67, 45, 45, 67, 208, 67, 67, 67, 222, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1764, 67, 67, 67, 67, 67, 67, 67, 258, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 288, 97, 97, 97, 302, 97, 97, 97, 97, 97, 97, 97, 97, 97, 627, 97, 97, 97, 97, 97, 97, 338, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 370, 45, 45, 45, 45, 716, 45, 45, 45, 45, 45, 722, 45, 45, 45, 45, 45, 45, 1912, 67, 67, 67, 67, 67, 67, 67, 67, 67, 819, 67, 67, 25398, 542, 13112, 544, 45, 403, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1409, 45, 67, 67, 67, 67, 489, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 771, 67, 67, 67, 67, 520, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 534, 67, 67, 67, 67, 67, 67, 1271, 67, 67, 67, 1274, 67, 67, 67, 1279, 67, 67, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 97, 553, 97, 97, 97, 97, 586, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1138, 97, 97, 97, 97, 617, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 631, 97, 97, 97, 0, 1834, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 353, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 45, 45, 668, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 724, 45, 45, 45, 45, 45, 682, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 949, 45, 45, 45, 67, 67, 747, 748, 67, 67, 67, 67, 755, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 1302, 0, 0, 0, 1308, 0, 67, 794, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1701, 67, 97, 97, 97, 845, 846, 97, 97, 97, 97, 853, 97, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 97, 97, 892, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 610, 97, 97, 45, 992, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 1239, 67, 67, 67, 1063, 67, 67, 67, 67, 67, 1068, 67, 67, 67, 67, 67, 67, 67, 0, 0, 1301, 0, 0, 0, 1307, 0, 0, 97, 1141, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1152, 97, 97, 0, 0, 97, 97, 2001, 0, 97, 2003, 97, 97, 97, 45, 45, 45, 1739, 45, 45, 45, 1742, 45, 45, 45, 45, 45, 97, 97, 97, 97, 1157, 97, 97, 97, 97, 97, 1162, 97, 97, 97, 97, 97, 97, 1145, 97, 97, 97, 97, 97, 1151, 97, 97, 97, 1253, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 539, 45, 1423, 45, 45, 67, 67, 67, 67, 67, 67, 67, 1431, 67, 67, 67, 67, 67, 67, 67, 1695, 67, 67, 67, 67, 67, 1700, 67, 1702, 67, 67, 1439, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 514, 67, 67, 97, 97, 1492, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 611, 97, 97, 1703, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 97, 97, 852, 97, 97, 97, 97, 97, 97, 45, 1949, 45, 1951, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 1961, 67, 0, 97, 45, 67, 0, 97, 2060, 2061, 0, 2062, 45, 67, 97, 0, 0, 2036, 97, 97, 97, 97, 45, 45, 45, 45, 67, 67, 67, 67, 67, 223, 67, 67, 237, 67, 67, 67, 67, 67, 67, 67, 1272, 67, 67, 67, 67, 67, 67, 67, 67, 507, 67, 67, 67, 67, 67, 67, 67, 1963, 67, 67, 67, 97, 97, 97, 97, 0, 1972, 0, 97, 97, 97, 1975, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 931, 45, 45, 45, 45, 45, 407, 45, 45, 45, 45, 45, 45, 45, 45, 45, 417, 45, 45, 1989, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1996, 97, 18, 131427, 0, 0, 360, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 930, 45, 45, 45, 45, 45, 45, 444, 45, 45, 45, 45, 45, 45, 45, 67, 67, 97, 97, 1998, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1985, 45, 1986, 45, 45, 45, 156, 45, 45, 170, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 675, 45, 45, 45, 45, 679, 131427, 0, 358, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 381, 45, 45, 45, 45, 45, 45, 45, 45, 45, 400, 45, 45, 419, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 436, 67, 67, 67, 67, 67, 505, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 820, 67, 25398, 542, 13112, 544, 67, 67, 522, 67, 67, 67, 67, 67, 529, 67, 67, 67, 67, 67, 67, 67, 0, 1299, 0, 0, 0, 1305, 0, 0, 0, 97, 97, 619, 97, 97, 97, 97, 97, 626, 97, 97, 97, 97, 97, 97, 97, 1105, 97, 97, 97, 97, 1109, 97, 97, 97, 67, 67, 67, 67, 749, 67, 67, 67, 67, 67, 67, 67, 67, 67, 760, 67, 0, 97, 45, 67, 2058, 97, 45, 67, 0, 97, 45, 67, 97, 0, 0, 97, 97, 97, 97, 97, 45, 45, 45, 2041, 67, 67, 67, 67, 67, 780, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 516, 67, 67, 97, 97, 97, 878, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1629, 97, 0, 45, 979, 45, 45, 45, 45, 984, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1198, 45, 45, 45, 45, 45, 45, 67, 1023, 67, 67, 67, 67, 1028, 67, 67, 67, 67, 67, 67, 67, 67, 67, 470, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 1094, 0, 0, 0, 1092, 1315, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1486, 97, 1489, 97, 97, 97, 1117, 97, 97, 97, 97, 1122, 97, 97, 97, 97, 97, 97, 97, 1146, 97, 97, 97, 97, 97, 97, 97, 97, 881, 97, 97, 97, 886, 97, 97, 97, 1311, 0, 0, 0, 0, 0, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 1615, 97, 97, 97, 97, 97, 1619, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1631, 97, 97, 1847, 97, 45, 45, 45, 45, 1852, 45, 45, 45, 45, 45, 45, 45, 1235, 45, 45, 45, 67, 67, 67, 67, 67, 1868, 67, 67, 67, 1872, 67, 67, 67, 67, 67, 97, 97, 97, 97, 1882, 0, 0, 0, 97, 97, 97, 97, 0, 1891, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 1929, 0, 0, 97, 97, 97, 97, 97, 97, 45, 1900, 45, 1901, 45, 45, 45, 1905, 45, 67, 2054, 97, 45, 67, 0, 97, 45, 67, 0, 97, 45, 67, 97, 0, 0, 97, 2037, 2038, 97, 97, 45, 45, 45, 45, 67, 67, 67, 67, 1867, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1774, 97, 97, 97, 97, 97, 97, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 142, 45, 45, 45, 1412, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 432, 45, 45, 45, 45, 45, 157, 45, 45, 171, 45, 45, 45, 182, 45, 45, 45, 45, 200, 45, 45, 45, 1543, 45, 45, 45, 45, 45, 45, 45, 45, 1551, 45, 45, 45, 45, 1181, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1211, 45, 45, 45, 1214, 45, 45, 45, 67, 209, 67, 67, 67, 224, 67, 67, 238, 67, 67, 67, 249, 67, 0, 97, 2056, 2057, 0, 2059, 45, 67, 0, 97, 45, 67, 97, 0, 0, 1937, 97, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1741, 45, 45, 45, 45, 45, 45, 67, 67, 67, 267, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 289, 97, 97, 97, 304, 97, 97, 318, 97, 97, 97, 329, 97, 97, 0, 0, 97, 1783, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 45, 2026, 45, 45, 45, 45, 67, 2030, 67, 67, 67, 67, 67, 67, 1041, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1044, 67, 67, 67, 67, 67, 67, 97, 97, 347, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 45, 666, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1420, 45, 57889, 0, 0, 54074, 54074, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 840, 67, 1007, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 759, 67, 67, 67, 67, 67, 67, 67, 1052, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1031, 67, 67, 67, 67, 67, 97, 97, 97, 1101, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 592, 97, 97, 97, 1190, 45, 45, 45, 45, 45, 1195, 45, 1197, 45, 45, 45, 45, 1201, 45, 45, 45, 45, 1952, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 250, 67, 67, 67, 1255, 67, 1257, 67, 67, 67, 67, 1261, 67, 67, 67, 67, 67, 67, 67, 67, 1685, 67, 67, 67, 67, 67, 67, 67, 0, 24851, 12565, 0, 0, 0, 0, 28809, 53532, 67, 67, 1267, 67, 67, 67, 67, 67, 67, 1273, 67, 67, 67, 67, 67, 67, 67, 67, 1696, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 2162688, 0, 0, 1281, 67, 67, 67, 67, 1285, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1070, 67, 67, 67, 67, 67, 1335, 97, 1337, 97, 97, 97, 97, 1341, 97, 97, 97, 97, 97, 97, 97, 97, 882, 97, 97, 97, 97, 97, 97, 97, 1347, 97, 97, 97, 97, 97, 97, 1353, 97, 97, 97, 97, 97, 97, 1361, 97, 18, 131427, 0, 638, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 0, 544, 0, 550, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2473984, 2158592, 2158592, 2158592, 2990080, 2158592, 2158592, 2207744, 2207744, 2482176, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 2207744, 0, 0, 0, 0, 0, 0, 2162688, 0, 53530, 97, 97, 97, 1365, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 608, 97, 97, 97, 45, 45, 1424, 45, 1425, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1058, 67, 67, 67, 67, 45, 1555, 45, 45, 1557, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 707, 45, 45, 45, 45, 67, 67, 1570, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 773, 67, 67, 1595, 67, 67, 1597, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139, 2158592, 2158592, 2158592, 2404352, 2412544, 97, 97, 97, 1636, 97, 97, 97, 1639, 97, 97, 1641, 97, 97, 97, 97, 97, 97, 1173, 0, 921, 0, 0, 0, 0, 0, 0, 45, 67, 67, 67, 1693, 67, 67, 67, 67, 67, 67, 67, 1698, 67, 67, 67, 67, 67, 67, 67, 1773, 67, 97, 97, 97, 97, 97, 97, 97, 625, 97, 97, 97, 97, 97, 97, 97, 97, 850, 97, 97, 97, 97, 97, 97, 97, 97, 880, 97, 97, 97, 97, 97, 97, 97, 97, 1106, 97, 97, 97, 97, 97, 97, 97, 1860, 45, 45, 67, 67, 1865, 67, 67, 67, 67, 1870, 67, 67, 67, 67, 1875, 67, 67, 97, 97, 1880, 97, 97, 0, 0, 0, 97, 97, 1888, 97, 0, 0, 0, 1938, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 1854, 45, 45, 45, 45, 45, 45, 45, 1909, 45, 45, 1911, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1248, 67, 67, 67, 67, 67, 67, 1922, 67, 67, 1924, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 1898, 45, 45, 45, 45, 45, 45, 1904, 45, 45, 67, 67, 67, 67, 97, 97, 97, 97, 0, 0, 16384, 97, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 1724, 2008, 2009, 45, 45, 67, 67, 67, 2014, 2015, 67, 67, 97, 97, 0, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 2022, 0, 2023, 97, 97, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 1869, 67, 67, 67, 67, 67, 67, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 147, 151, 154, 45, 162, 45, 45, 176, 178, 181, 45, 45, 45, 192, 196, 45, 45, 45, 45, 2012, 67, 67, 67, 67, 67, 67, 2018, 97, 0, 0, 97, 1978, 97, 97, 97, 1982, 45, 45, 45, 45, 45, 45, 45, 45, 45, 972, 973, 45, 45, 45, 45, 45, 67, 259, 263, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 294, 298, 301, 97, 309, 97, 97, 323, 325, 328, 97, 97, 97, 97, 97, 560, 97, 97, 97, 569, 97, 97, 97, 97, 97, 97, 306, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1624, 97, 97, 97, 97, 97, 97, 97, 0, 921, 0, 1175, 0, 0, 0, 0, 45, 339, 343, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 67, 67, 503, 67, 67, 67, 67, 67, 67, 67, 67, 67, 512, 67, 67, 519, 97, 97, 600, 97, 97, 97, 97, 97, 97, 97, 97, 97, 609, 97, 97, 616, 45, 649, 45, 45, 45, 45, 45, 654, 45, 45, 45, 45, 45, 45, 45, 45, 1393, 45, 45, 45, 45, 45, 45, 45, 45, 1209, 45, 45, 45, 45, 45, 45, 45, 67, 763, 67, 67, 67, 67, 67, 67, 67, 67, 770, 67, 67, 67, 774, 67, 0, 2045, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 45, 45, 45, 994, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 213, 67, 219, 67, 67, 232, 67, 242, 67, 247, 67, 67, 67, 779, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1018, 67, 67, 67, 67, 811, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 57889, 0, 0, 54074, 54074, 550, 0, 97, 834, 97, 97, 97, 97, 97, 839, 97, 18, 131427, 0, 638, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 645, 97, 97, 861, 97, 97, 97, 97, 97, 97, 97, 97, 868, 97, 97, 97, 872, 97, 97, 877, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 613, 97, 97, 97, 97, 97, 909, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 0, 18, 18, 24, 24, 27, 27, 27, 1036, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1047, 67, 67, 67, 1050, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1033, 67, 67, 67, 97, 97, 1130, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 638, 0, 0, 67, 67, 67, 1295, 67, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97, 1317, 97, 97, 97, 97, 97, 97, 1375, 97, 97, 97, 0, 0, 0, 45, 1379, 45, 45, 45, 45, 45, 45, 422, 45, 45, 45, 429, 431, 45, 45, 45, 45, 0, 1090, 0, 0, 97, 1479, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1357, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1716, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1723, 0, 921, 29315, 0, 0, 0, 0, 45, 929, 45, 45, 45, 45, 45, 45, 45, 1392, 45, 45, 45, 45, 45, 45, 45, 45, 45, 960, 45, 45, 45, 45, 45, 45, 97, 97, 97, 1738, 45, 45, 45, 45, 45, 45, 45, 1743, 45, 45, 45, 45, 166, 45, 45, 45, 45, 184, 186, 45, 45, 197, 45, 45, 97, 1779, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 18, 131427, 0, 638, 0, 0, 0, 0, 362, 0, 640, 365, 29315, 367, 0, 921, 29315, 0, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1537, 45, 45, 45, 45, 45, 1803, 45, 45, 45, 45, 45, 1809, 45, 45, 45, 67, 67, 67, 1814, 67, 67, 67, 67, 67, 67, 1821, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 0, 67, 67, 67, 1818, 67, 67, 67, 67, 67, 1824, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 1890, 0, 1829, 97, 97, 0, 0, 97, 97, 1836, 97, 97, 0, 0, 0, 97, 97, 97, 97, 1981, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1987, 1845, 97, 97, 97, 45, 45, 45, 45, 45, 1853, 45, 45, 45, 1857, 45, 45, 45, 67, 1864, 67, 1866, 67, 67, 67, 67, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 97, 97, 1710, 1711, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 1886, 97, 97, 97, 0, 0, 97, 97, 97, 97, 1838, 0, 0, 0, 97, 1843, 97, 0, 1893, 97, 97, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1745, 45, 45, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 1931, 97, 97, 97, 97, 97, 588, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 629, 97, 97, 97, 97, 97, 67, 2044, 0, 97, 97, 97, 97, 45, 45, 67, 67, 0, 0, 97, 97, 45, 45, 45, 1660, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 453, 45, 455, 67, 67, 67, 67, 268, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 348, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 359, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 421, 45, 45, 45, 45, 45, 45, 45, 434, 45, 45, 695, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1667, 45, 0, 921, 29315, 0, 925, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1811, 45, 67, 67, 67, 67, 67, 67, 1037, 67, 1039, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1277, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 1095, 0, 0, 0, 1096, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 869, 97, 97, 97, 97, 97, 97, 1131, 97, 1133, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1370, 97, 97, 97, 97, 97, 1312, 0, 0, 0, 0, 1096, 0, 0, 0, 97, 97, 97, 97, 97, 97, 97, 1327, 97, 97, 97, 97, 97, 1332, 97, 97, 97, 1830, 97, 0, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 1896, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1548, 45, 45, 45, 45, 45, 45, 133, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 45, 380, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 401, 45, 45, 158, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1200, 45, 45, 45, 45, 206, 67, 67, 67, 67, 67, 225, 67, 67, 67, 67, 67, 67, 67, 67, 754, 67, 67, 67, 67, 67, 67, 67, 57889, 0, 0, 54074, 54074, 550, 832, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1342, 97, 97, 97, 97, 97, 97, 67, 67, 67, 67, 67, 25398, 1083, 13112, 1087, 54074, 1091, 0, 0, 0, 0, 0, 0, 1316, 0, 831, 97, 97, 97, 97, 97, 97, 97, 1174, 921, 0, 1175, 0, 0, 0, 0, 45, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 45, 148, 67, 67, 264, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 97, 295, 97, 97, 97, 97, 313, 97, 97, 97, 97, 331, 333, 97, 18, 131427, 356, 638, 0, 0, 0, 0, 362, 0, 0, 365, 0, 367, 0, 45, 45, 1530, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 988, 45, 45, 45, 97, 344, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 402, 404, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1756, 67, 438, 45, 45, 45, 45, 45, 45, 45, 45, 449, 450, 45, 45, 45, 67, 67, 214, 218, 221, 67, 229, 67, 67, 243, 245, 248, 67, 67, 67, 67, 67, 488, 490, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1071, 67, 1073, 67, 67, 67, 67, 67, 524, 67, 67, 67, 67, 67, 67, 67, 67, 535, 536, 67, 67, 67, 67, 67, 67, 1683, 1684, 67, 67, 67, 67, 1688, 1689, 67, 67, 67, 67, 67, 67, 1586, 67, 67, 67, 67, 67, 67, 67, 67, 67, 469, 67, 67, 67, 67, 67, 67, 97, 97, 97, 585, 587, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1163, 97, 97, 97, 97, 97, 97, 97, 621, 97, 97, 97, 97, 97, 97, 97, 97, 632, 633, 97, 97, 0, 0, 1782, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 712, 45, 45, 45, 717, 45, 45, 45, 45, 45, 45, 45, 45, 725, 45, 45, 45, 163, 167, 173, 177, 45, 45, 45, 45, 45, 193, 45, 45, 45, 45, 982, 45, 45, 45, 45, 45, 45, 987, 45, 45, 45, 45, 45, 1558, 45, 1560, 45, 45, 45, 45, 45, 45, 45, 45, 704, 705, 45, 45, 45, 45, 45, 45, 45, 45, 731, 45, 45, 45, 67, 67, 67, 67, 67, 739, 67, 67, 67, 67, 67, 67, 273, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 67, 67, 67, 764, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1290, 67, 67, 67, 67, 67, 67, 812, 67, 67, 67, 67, 818, 67, 67, 67, 25398, 542, 13112, 544, 57889, 0, 0, 54074, 54074, 550, 0, 97, 97, 97, 97, 97, 837, 97, 97, 97, 97, 97, 602, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1137, 97, 97, 97, 97, 97, 97, 97, 97, 97, 862, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1627, 97, 97, 97, 0, 97, 97, 97, 97, 910, 97, 97, 97, 97, 916, 97, 97, 97, 0, 0, 0, 97, 97, 1940, 97, 97, 1942, 45, 45, 45, 45, 45, 45, 385, 45, 45, 45, 45, 395, 45, 45, 45, 45, 966, 45, 969, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 975, 45, 45, 45, 406, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 974, 45, 45, 45, 67, 67, 67, 67, 1010, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1262, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1040, 67, 1042, 67, 1045, 67, 67, 67, 67, 67, 67, 67, 97, 1706, 97, 97, 97, 1709, 97, 97, 97, 67, 67, 67, 67, 1051, 67, 67, 67, 67, 67, 1057, 67, 67, 67, 67, 67, 67, 67, 1443, 67, 67, 1446, 67, 67, 67, 67, 67, 67, 67, 1297, 0, 0, 0, 1303, 0, 0, 0, 1309, 67, 67, 67, 67, 1079, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2207744, 2207744, 2207744, 2207744, 2207744, 2572288, 2207744, 2207744, 2207744, 1098, 97, 97, 97, 97, 97, 1104, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1356, 97, 97, 97, 97, 97, 97, 1128, 97, 97, 97, 97, 97, 97, 1134, 97, 1136, 97, 1139, 97, 97, 97, 97, 97, 97, 1622, 97, 97, 97, 97, 97, 97, 97, 97, 0, 921, 0, 0, 0, 1176, 0, 646, 45, 67, 67, 67, 1268, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1469, 67, 67, 67, 97, 1348, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1127, 97, 67, 1569, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1448, 1449, 67, 1816, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1825, 67, 67, 1827, 97, 97, 0, 1781, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 1831, 0, 0, 97, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 1980, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1395, 45, 45, 45, 45, 45, 97, 1846, 97, 97, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1212, 45, 45, 45, 45, 45, 45, 2010, 45, 67, 67, 67, 67, 67, 2016, 67, 97, 97, 0, 0, 97, 97, 97, 0, 97, 97, 97, 97, 97, 45, 45, 2007, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 143, 45, 45, 45, 1671, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 1813, 67, 67, 1815, 45, 45, 67, 210, 67, 67, 67, 67, 67, 67, 239, 67, 67, 67, 67, 67, 67, 67, 1454, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1445, 67, 67, 67, 67, 67, 67, 97, 97, 290, 97, 97, 97, 97, 97, 97, 319, 97, 97, 97, 97, 97, 97, 303, 97, 97, 317, 97, 97, 97, 97, 97, 97, 305, 97, 97, 97, 97, 97, 97, 97, 97, 97, 899, 97, 97, 97, 97, 97, 97, 375, 45, 45, 45, 379, 45, 45, 390, 45, 45, 394, 45, 45, 45, 45, 45, 443, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 461, 67, 67, 67, 465, 67, 67, 476, 67, 67, 480, 67, 67, 67, 67, 67, 67, 1694, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1288, 67, 67, 67, 67, 67, 67, 500, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1075, 97, 97, 97, 558, 97, 97, 97, 562, 97, 97, 573, 97, 97, 577, 97, 97, 97, 97, 97, 895, 97, 97, 97, 97, 97, 97, 903, 97, 97, 97, 0, 97, 97, 1638, 97, 97, 97, 97, 97, 97, 97, 97, 1646, 597, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1334, 45, 681, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1396, 45, 45, 1399, 45, 45, 730, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1434, 67, 67, 67, 67, 67, 67, 750, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1456, 67, 67, 67, 67, 67, 45, 45, 993, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 1238, 67, 67, 1006, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1280, 1048, 1049, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1059, 67, 67, 67, 67, 67, 67, 1286, 67, 67, 67, 67, 67, 67, 67, 1291, 67, 97, 97, 1100, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 638, 0, 920, 97, 97, 1142, 1143, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1153, 97, 97, 97, 97, 97, 1158, 97, 97, 97, 1161, 97, 97, 97, 97, 1166, 97, 97, 97, 97, 97, 1325, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1328, 97, 97, 97, 97, 97, 97, 97, 45, 1218, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1678, 45, 45, 45, 67, 67, 67, 67, 67, 1269, 67, 67, 67, 67, 67, 67, 67, 67, 1278, 67, 67, 67, 67, 67, 67, 1761, 67, 67, 67, 67, 67, 67, 67, 67, 67, 530, 67, 67, 67, 67, 67, 67, 97, 97, 1349, 97, 97, 97, 97, 97, 97, 97, 97, 1358, 97, 97, 97, 97, 97, 97, 1623, 97, 97, 97, 97, 97, 97, 97, 97, 0, 921, 0, 0, 926, 0, 0, 0, 45, 45, 1411, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1754, 45, 45, 67, 67, 1301, 0, 1307, 0, 1313, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 21054, 97, 97, 97, 97, 67, 1757, 67, 67, 67, 1760, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1467, 67, 67, 67, 67, 67, 1778, 97, 0, 0, 97, 97, 97, 97, 97, 97, 0, 0, 97, 97, 0, 97, 97, 97, 97, 97, 1352, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1511, 97, 97, 97, 97, 97, 67, 67, 67, 67, 67, 1820, 67, 1822, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 97, 1933, 97, 1892, 97, 97, 97, 97, 97, 97, 1899, 45, 45, 45, 45, 45, 45, 45, 45, 1664, 45, 45, 45, 45, 45, 45, 45, 45, 1546, 45, 45, 45, 45, 45, 45, 45, 45, 1208, 45, 45, 45, 45, 45, 45, 45, 45, 1224, 45, 45, 45, 45, 45, 45, 45, 45, 673, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 1925, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 97, 623, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 307, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1796, 97, 45, 45, 45, 45, 45, 45, 45, 970, 45, 45, 45, 45, 45, 45, 45, 45, 1417, 45, 45, 45, 45, 45, 45, 45, 67, 1964, 67, 67, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 1721, 97, 97, 0, 0, 1997, 97, 0, 0, 2000, 97, 97, 0, 97, 97, 97, 97, 97, 45, 45, 45, 45, 733, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 803, 67, 67, 67, 67, 67, 0, 94242, 0, 0, 0, 38, 102439, 0, 0, 106538, 98347, 28809, 45, 45, 144, 45, 45, 45, 1805, 45, 1807, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 231, 67, 67, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 45, 45, 67, 211, 67, 67, 67, 67, 230, 234, 240, 244, 67, 67, 67, 67, 67, 67, 464, 67, 67, 67, 67, 67, 67, 479, 67, 67, 67, 260, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 97, 291, 97, 97, 97, 97, 310, 314, 320, 324, 97, 97, 97, 97, 97, 97, 1367, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1355, 97, 97, 97, 97, 97, 97, 1362, 340, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 0, 360, 0, 362, 0, 365, 28809, 367, 139, 369, 45, 45, 45, 374, 67, 67, 460, 67, 67, 67, 67, 466, 67, 67, 67, 67, 67, 67, 67, 67, 801, 67, 67, 67, 67, 67, 67, 67, 67, 67, 487, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 498, 67, 67, 67, 67, 67, 67, 1772, 67, 67, 97, 97, 97, 97, 97, 97, 97, 0, 921, 922, 1175, 0, 0, 0, 0, 45, 67, 502, 67, 67, 67, 67, 67, 67, 67, 508, 67, 67, 67, 515, 517, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 0, 0, 1932, 97, 97, 0, 1999, 97, 97, 97, 0, 97, 97, 2004, 2005, 97, 45, 45, 45, 45, 1193, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 676, 45, 45, 45, 45, 67, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 552, 97, 97, 97, 97, 97, 1377, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 655, 45, 45, 45, 45, 45, 45, 45, 97, 97, 557, 97, 97, 97, 97, 563, 97, 97, 97, 97, 97, 97, 97, 97, 1135, 97, 97, 97, 97, 97, 97, 97, 97, 97, 584, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 595, 97, 97, 97, 97, 97, 911, 97, 97, 97, 97, 97, 97, 97, 638, 0, 0, 0, 0, 1315, 0, 0, 0, 0, 97, 97, 97, 1319, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 1733, 97, 97, 97, 97, 97, 97, 1340, 97, 97, 97, 1343, 97, 97, 1345, 97, 1346, 97, 599, 97, 97, 97, 97, 97, 97, 97, 605, 97, 97, 97, 612, 614, 97, 97, 97, 97, 97, 1794, 97, 97, 97, 45, 45, 45, 45, 45, 45, 45, 1207, 45, 45, 45, 45, 45, 45, 1213, 45, 45, 745, 67, 67, 67, 67, 751, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1577, 67, 67, 67, 67, 67, 762, 67, 67, 67, 67, 766, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1765, 67, 67, 67, 67, 67, 777, 67, 67, 781, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1592, 1593, 67, 67, 97, 843, 97, 97, 97, 97, 849, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1510, 97, 97, 97, 97, 97, 97, 97, 860, 97, 97, 97, 97, 864, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1797, 45, 45, 45, 45, 1801, 45, 97, 875, 97, 97, 879, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1522, 97, 97, 97, 97, 97, 991, 45, 45, 45, 45, 996, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 215, 67, 67, 67, 67, 233, 67, 67, 67, 67, 251, 253, 1022, 67, 67, 67, 1026, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1035, 67, 67, 1038, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1458, 67, 67, 67, 67, 67, 1064, 67, 67, 67, 1067, 67, 67, 67, 67, 1072, 67, 67, 67, 67, 67, 67, 1296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2367488, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 1096, 0, 921, 29315, 0, 0, 0, 0, 928, 45, 45, 45, 45, 45, 934, 45, 45, 45, 164, 45, 45, 45, 45, 45, 45, 45, 45, 45, 198, 45, 45, 45, 378, 45, 45, 45, 45, 45, 45, 393, 45, 45, 45, 398, 45, 97, 97, 1116, 97, 97, 97, 1120, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1147, 1148, 97, 97, 97, 97, 97, 97, 97, 1129, 97, 97, 1132, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1626, 97, 97, 97, 97, 0, 45, 1178, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1185, 45, 45, 45, 45, 441, 45, 45, 45, 45, 45, 45, 451, 45, 45, 67, 67, 67, 67, 67, 227, 67, 67, 67, 67, 67, 67, 67, 67, 1260, 67, 67, 67, 1263, 67, 67, 1265, 1203, 45, 45, 1205, 45, 1206, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1216, 67, 1266, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1276, 67, 67, 67, 67, 67, 67, 492, 67, 67, 67, 67, 67, 67, 67, 67, 67, 471, 67, 67, 67, 67, 481, 67, 45, 1386, 45, 1389, 45, 45, 45, 45, 1394, 45, 45, 45, 1397, 45, 45, 45, 45, 995, 45, 997, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 1915, 67, 67, 67, 67, 67, 1422, 45, 45, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1433, 67, 1436, 67, 67, 67, 67, 1441, 67, 67, 67, 1444, 67, 67, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 281, 28809, 53531, 97, 97, 97, 97, 1494, 97, 97, 97, 1497, 97, 97, 97, 97, 97, 97, 97, 1368, 97, 97, 97, 97, 97, 97, 97, 97, 851, 97, 97, 97, 97, 97, 97, 97, 67, 67, 67, 1571, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 67, 67, 1583, 67, 67, 67, 67, 67, 67, 67, 67, 1591, 67, 67, 67, 67, 67, 67, 752, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1056, 67, 67, 67, 67, 67, 67, 97, 1634, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1125, 97, 97, 97, 1647, 97, 97, 97, 97, 97, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1183, 45, 45, 45, 45, 45, 45, 45, 45, 45, 409, 45, 45, 45, 45, 45, 45, 1658, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1668, 1712, 97, 97, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 0, 0, 1835, 97, 97, 97, 97, 0, 0, 0, 97, 97, 1844, 97, 97, 1726, 0, 97, 97, 97, 97, 97, 1732, 97, 1734, 97, 97, 97, 97, 97, 300, 97, 308, 97, 97, 97, 97, 97, 97, 97, 97, 866, 97, 97, 97, 97, 97, 97, 97, 67, 67, 67, 1758, 67, 67, 67, 1762, 67, 67, 67, 67, 67, 67, 67, 67, 1043, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1771, 67, 67, 67, 97, 97, 97, 97, 97, 1776, 97, 97, 97, 97, 297, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1108, 97, 97, 97, 97, 67, 67, 67, 1966, 97, 97, 97, 1970, 0, 0, 0, 97, 97, 97, 97, 0, 97, 97, 97, 1720, 97, 97, 97, 97, 97, 0, 0, 97, 97, 97, 1837, 97, 0, 1840, 1841, 97, 97, 97, 1988, 45, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1994, 1995, 67, 97, 97, 97, 97, 97, 1103, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 917, 97, 97, 0, 0, 0, 67, 67, 265, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 345, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 131427, 0, 0, 0, 361, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 671, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 411, 45, 45, 414, 45, 45, 45, 45, 377, 45, 45, 45, 386, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1223, 45, 45, 45, 45, 45, 45, 45, 45, 45, 426, 45, 45, 433, 45, 45, 45, 67, 67, 67, 67, 67, 463, 67, 67, 67, 472, 67, 67, 67, 67, 67, 67, 67, 527, 67, 67, 67, 67, 67, 67, 537, 67, 540, 24850, 24850, 12564, 12564, 0, 57889, 0, 0, 0, 53531, 53531, 367, 286, 97, 97, 97, 97, 97, 1119, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1509, 97, 97, 97, 97, 97, 97, 97, 97, 564, 97, 97, 97, 97, 97, 97, 97, 637, 18, 131427, 0, 0, 0, 0, 0, 0, 362, 0, 0, 365, 29315, 367, 0, 921, 29315, 0, 0, 0, 927, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1234, 45, 45, 45, 45, 67, 67, 67, 67, 1240, 45, 697, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 708, 45, 45, 45, 45, 1221, 45, 45, 45, 45, 1225, 45, 45, 45, 45, 45, 45, 384, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1210, 45, 45, 45, 45, 45, 45, 67, 67, 795, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1470, 67, 67, 67, 67, 67, 67, 67, 815, 67, 67, 67, 67, 67, 67, 25398, 542, 13112, 544, 97, 97, 97, 893, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1164, 97, 97, 97, 67, 67, 67, 1025, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1687, 67, 67, 67, 67, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 0, 0, 0, 1097, 1241, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1450, 45, 45, 1388, 45, 1390, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1236, 67, 67, 67, 67, 67, 1437, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1472, 1490, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1503, 67, 67, 67, 67, 67, 97, 97, 97, 97, 97, 0, 1930, 0, 97, 97, 97, 97, 97, 847, 97, 97, 97, 97, 97, 97, 97, 97, 97, 858, 67, 67, 1965, 67, 97, 97, 97, 97, 0, 0, 0, 97, 97, 97, 97, 0, 97, 97, 1719, 97, 97, 97, 97, 97, 97, 0, 0, 0, 45, 45, 45, 45, 1382, 45, 1383, 45, 45, 45, 159, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1563, 45, 45, 45, 45, 45, 67, 261, 67, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 341, 97, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 97, 1099, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1333, 97, 1230, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 67, 1992, 67, 1993, 67, 67, 67, 97, 97, 45, 45, 160, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1665, 45, 45, 45, 45, 45, 131427, 357, 0, 0, 0, 362, 0, 365, 28809, 367, 139, 45, 45, 45, 45, 45, 684, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 412, 45, 45, 45, 416, 45, 45, 45, 440, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 67, 67, 1990, 67, 1991, 67, 67, 67, 67, 67, 67, 67, 97, 97, 1707, 97, 97, 97, 97, 97, 97, 501, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1691, 67, 67, 67, 67, 67, 526, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1030, 67, 1032, 67, 67, 67, 67, 598, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1632, 0, 921, 29315, 923, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1404, 45, 45, 45, 45, 45, 45, 45, 45, 45, 425, 45, 45, 45, 45, 45, 45, 67, 67, 67, 67, 67, 25398, 0, 13112, 0, 54074, 0, 0, 1093, 0, 0, 0, 0, 0, 97, 1609, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1369, 97, 97, 97, 1372, 97, 97, 67, 67, 266, 67, 67, 67, 67, 0, 24850, 12564, 0, 0, 0, 0, 28809, 53531, 97, 346, 97, 97, 97, 97, 0, 40976, 0, 18, 18, 24, 24, 27, 27, 27, 665, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1677, 45, 45, 45, 45, 67, 45, 45, 954, 45, 956, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1545, 45, 45, 45, 45, 45, 45, 45, 45, 45, 448, 45, 45, 45, 45, 67, 456, 67, 67, 67, 67, 67, 1270, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1069, 67, 67, 67, 67, 67, 67, 97, 97, 97, 1350, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1524, 97, 97, 97, 97, 97, 97, 97, 1376, 0, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 1559, 1561, 45, 45, 45, 1564, 45, 1566, 1567, 45, 67, 67, 67, 67, 67, 1573, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 1247, 67, 67, 67, 67, 67, 1252, 97, 1725, 97, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1628, 97, 1630, 0, 0, 94242, 0, 0, 0, 2211840, 0, 1118208, 0, 0, 0, 0, 2158592, 2158731, 2158592, 2158592, 2158592, 3117056, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3018752, 2158592, 3043328, 2158592, 2158592, 2158592, 2158592, 3080192, 2158592, 2158592, 3112960, 2158592, 2158592, 2158592, 2158592, 2158592, 2158878, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2605056, 2158592, 2158592, 2207744, 0, 542, 0, 544, 0, 0, 2166784, 0, 0, 0, 550, 0, 0, 2158592, 2158592, 2686976, 2158592, 2715648, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2867200, 2158592, 2904064, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 0, 94242, 0, 0, 0, 2211840, 0, 0, 1130496, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 3186688, 2158592, 0, 0, 139, 0, 0, 0, 139, 0, 2367488, 2207744, 0, 0, 0, 0, 176128, 0, 2166784, 0, 0, 0, 0, 0, 286, 2158592, 2158592, 3170304, 3174400, 2158592, 0, 0, 0, 2158592, 2158592, 2158592, 2158592, 2158592, 2424832, 2158592, 2158592, 2158592, 1508, 2158592, 2908160, 2158592, 2158592, 2158592, 2977792, 2158592, 2158592, 2158592, 2158592, 3039232, 2158592, 2158592, 2158592, 2158592, 2158592, 2158592, 3158016, 67, 24850, 24850, 12564, 12564, 0, 0, 0, 0, 0, 53531, 53531, 0, 286, 97, 97, 97, 97, 97, 1144, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 1149, 97, 97, 97, 97, 1154, 57889, 0, 0, 0, 0, 550, 0, 97, 97, 97, 97, 97, 97, 97, 97, 97, 561, 97, 97, 97, 97, 97, 97, 576, 97, 97, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 139264, 0, 0, 139264, 0, 921, 29315, 0, 0, 926, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 719, 720, 45, 45, 45, 45, 45, 45, 45, 45, 685, 45, 45, 45, 45, 45, 45, 45, 45, 45, 942, 45, 45, 946, 45, 45, 45, 950, 45, 45, 0, 2146304, 2146304, 0, 0, 0, 0, 2224128, 2224128, 2224128, 2232320, 2232320, 2232320, 2232320, 0, 0, 1301, 0, 0, 0, 0, 0, 1307, 0, 0, 0, 0, 0, 1313, 0, 0, 0, 0, 0, 0, 0, 97, 97, 1318, 97, 97, 97, 97, 97, 97, 1795, 97, 97, 45, 45, 45, 45, 45, 45, 45, 446, 45, 45, 45, 45, 45, 45, 67, 67, 2158592, 2146304, 0, 0, 0, 0, 0, 0, 0, 2211840, 0, 0, 0, 0, 2158592, 0, 921, 29315, 0, 924, 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, 1000, 45, 45, 45, 45, 67, 67\n];\n\nXQueryTokenizer.EXPECTED =\n[ 290, 300, 304, 353, 296, 309, 305, 319, 315, 324, 328, 352, 354, 334, 338, 330, 320, 345, 349, 293, 358, 362, 341, 366, 312, 370, 374, 378, 382, 386, 390, 394, 398, 737, 402, 634, 439, 604, 634, 634, 634, 634, 408, 634, 634, 634, 404, 634, 634, 634, 457, 634, 634, 963, 634, 634, 413, 634, 634, 634, 634, 634, 634, 634, 663, 418, 422, 903, 902, 426, 431, 548, 634, 437, 521, 919, 443, 615, 409, 449, 455, 624, 731, 751, 634, 461, 465, 672, 470, 469, 474, 481, 485, 477, 489, 493, 629, 542, 497, 505, 603, 602, 991, 648, 510, 804, 634, 515, 958, 526, 525, 530, 768, 634, 546, 552, 711, 710, 593, 558, 562, 618, 566, 570, 574, 578, 582, 586, 590, 608, 612, 660, 822, 821, 634, 622, 596, 444, 628, 533, 724, 633, 640, 653, 647, 652, 536, 1008, 451, 450, 445, 657, 670, 676, 685, 689, 693, 697, 701, 704, 707, 715, 719, 798, 815, 634, 723, 762, 996, 634, 728, 969, 730, 735, 908, 634, 741, 679, 889, 511, 747, 634, 750, 755, 499, 666, 499, 501, 759, 772, 776, 780, 634, 787, 784, 797, 802, 809, 808, 427, 814, 1006, 517, 634, 519, 853, 634, 813, 850, 793, 634, 819, 826, 833, 832, 837, 843, 847, 857, 861, 863, 867, 871, 875, 879, 883, 643, 887, 539, 980, 979, 634, 893, 944, 634, 900, 896, 634, 907, 933, 506, 912, 917, 828, 433, 636, 635, 554, 961, 923, 930, 927, 937, 941, 634, 634, 634, 974, 948, 952, 985, 913, 968, 967, 743, 634, 973, 839, 634, 978, 599, 634, 984, 989, 765, 444, 995, 1000, 634, 1003, 790, 955, 1012, 681, 634, 634, 634, 634, 634, 414, 1016, 1020, 1024, 1085, 1027, 1090, 1090, 1046, 1080, 1137, 1108, 1215, 1049, 1032, 1039, 1085, 1085, 1085, 1085, 1058, 1062, 1068, 1085, 1086, 1090, 1090, 1091, 1072, 1064, 1107, 1090, 1090, 1090, 1118, 1123, 1138, 1078, 1074, 1084, 1085, 1085, 1085, 1087, 1090, 1062, 1052, 1060, 1114, 1062, 1104, 1085, 1085, 1090, 1090, 1028, 1122, 1063, 1128, 1139, 1127, 1158, 1085, 1085, 1151, 1090, 1090, 1090, 1095, 1090, 1132, 1073, 1136, 1143, 1061, 1150, 1085, 1155, 1098, 1101, 1146, 1162, 1169, 1101, 1185, 1151, 1090, 1110, 1173, 1054, 1087, 1109, 1177, 1165, 1089, 1204, 1184, 1107, 1189, 1193, 1088, 1197, 1180, 1201, 1208, 1042, 1212, 1219, 1223, 1227, 1231, 1235, 1245, 1777, 1527, 1686, 1686, 1238, 1686, 1254, 1686, 1686, 1686, 1294, 1669, 1686, 1686, 1686, 1322, 1625, 1534, 1268, 1624, 1275, 1281, 1443, 1292, 1300, 1686, 1686, 1686, 1350, 1826, 1306, 1686, 1686, 1240, 2032, 1317, 1321, 1686, 1686, 1253, 1686, 1326, 1686, 1686, 1686, 1418, 1709, 1446, 1686, 1686, 1686, 1492, 1686, 1295, 1447, 1686, 1686, 1258, 1686, 1736, 1686, 1686, 1520, 1355, 1686, 1288, 1348, 1361, 1686, 1359, 1686, 1364, 1498, 1368, 1302, 1362, 1381, 1389, 1395, 1486, 1686, 1371, 1377, 1370, 1686, 1375, 1382, 1384, 1402, 1408, 1385, 1383, 1619, 1413, 1423, 1428, 1433, 1686, 1686, 1270, 1686, 1338, 1686, 1440, 1686, 1686, 1686, 1499, 1465, 1686, 1686, 1686, 1639, 1473, 1884, 1686, 1686, 1293, 1864, 1686, 1686, 1296, 1321, 1483, 1686, 1686, 1686, 1646, 1686, 1748, 1496, 1686, 1418, 1675, 1686, 1418, 1702, 1686, 1418, 1981, 1686, 1429, 1409, 1427, 1504, 1692, 1686, 1686, 1313, 1448, 1651, 1508, 1686, 1686, 1340, 1686, 1903, 1686, 1686, 1435, 1513, 1686, 1283, 1287, 1519, 1686, 1524, 1363, 1568, 1938, 1539, 1566, 1579, 1479, 1533, 1538, 1553, 1544, 1552, 1557, 1563, 1574, 1557, 1583, 1589, 1590, 1759, 1594, 1603, 1607, 1611, 1686, 1436, 1514, 1686, 1434, 1656, 1686, 1434, 1680, 1686, 1453, 1686, 1686, 1686, 1559, 1617, 1686, 1770, 1418, 1623, 1769, 1629, 1686, 1515, 1335, 1686, 1285, 1686, 1671, 1921, 1650, 1686, 1686, 1344, 1308, 1666, 1686, 1686, 1686, 1659, 1685, 1686, 1686, 1686, 1686, 1241, 1686, 1686, 1844, 1691, 1686, 1630, 1977, 1970, 1362, 1686, 1686, 1686, 1693, 1698, 1686, 1686, 1686, 1697, 1686, 1764, 1715, 1686, 1634, 1638, 1686, 1599, 1585, 1686, 1271, 1686, 1269, 1686, 1721, 1686, 1686, 1354, 1686, 1801, 1686, 1799, 1686, 1640, 1686, 1686, 1461, 1686, 1686, 1732, 1686, 1944, 1686, 1740, 1686, 1746, 1415, 1396, 1686, 1598, 1547, 1417, 1597, 1416, 1577, 1546, 1397, 1577, 1547, 1548, 1570, 1398, 1753, 1686, 1652, 1509, 1686, 1686, 1686, 1757, 1686, 1419, 1686, 1763, 1418, 1768, 1781, 1686, 1686, 1686, 1705, 1686, 2048, 1792, 1686, 1686, 1686, 1735, 1686, 1797, 1686, 1686, 1404, 1686, 1639, 1815, 1686, 1686, 1418, 2017, 1820, 1686, 1686, 1803, 1686, 1686, 1686, 1736, 1489, 1686, 1686, 1825, 1338, 1260, 1263, 1686, 1686, 1785, 1686, 1686, 1728, 1686, 1686, 1749, 1497, 1830, 1830, 1262, 1248, 1261, 1329, 1260, 1264, 1329, 1248, 1249, 1259, 1540, 1849, 1842, 1686, 1686, 1835, 1686, 1686, 1816, 1686, 1686, 1831, 1882, 1848, 1686, 1686, 1686, 1774, 2071, 1854, 1686, 1686, 1469, 1884, 1686, 1821, 1859, 1686, 1686, 1350, 1883, 1686, 1686, 1686, 1781, 1391, 1875, 1686, 1686, 1613, 1644, 1686, 1686, 1889, 1686, 1686, 1662, 1884, 1686, 1885, 1890, 1686, 1686, 1686, 1894, 1686, 1686, 1678, 1686, 1907, 1686, 1686, 1529, 1914, 1686, 1838, 1686, 1686, 1881, 1686, 1686, 1872, 1876, 1836, 1919, 1686, 1837, 1692, 1910, 1686, 1925, 1928, 1742, 1686, 1811, 1811, 1930, 1810, 1929, 1935, 1928, 1900, 1942, 1867, 1868, 1931, 1035, 1788, 1948, 1952, 1956, 1960, 1964, 1686, 1976, 1686, 1686, 1686, 2065, 1686, 1992, 2037, 1686, 1686, 1998, 2009, 1972, 2002, 1686, 1686, 1686, 2077, 1300, 2023, 1686, 1686, 1686, 1807, 2031, 1686, 1686, 1686, 1860, 1500, 2032, 1686, 1686, 1686, 2083, 1686, 2036, 1686, 1277, 1276, 2042, 1877, 1686, 1686, 2041, 1686, 1686, 2027, 2037, 2012, 1686, 2012, 1855, 1850, 1686, 2046, 1686, 1686, 2054, 1996, 1686, 1897, 1309, 2059, 2052, 1686, 2058, 1686, 1686, 2081, 1686, 1717, 1477, 1686, 1331, 1686, 1686, 1687, 1686, 1860, 1681, 1686, 1686, 1686, 1966, 1724, 1686, 1686, 1686, 1984, 2015, 1686, 1686, 1686, 1988, 1686, 2063, 1686, 1686, 1686, 2005, 1686, 1727, 1686, 1686, 1711, 1457, 2069, 1686, 1686, 1686, 2019, 2075, 1686, 1686, 1915, 1686, 1686, 1793, 1874, 1686, 1686, 1491, 1362, 1449, 1686, 1686, 1460, 2098, 2087, 2091, 2095, 2184, 2102, 2113, 2780, 2117, 2134, 2142, 2281, 2146, 2146, 2146, 2304, 2296, 2181, 2639, 2591, 2872, 2592, 2873, 2313, 2195, 2200, 2281, 2146, 2273, 2226, 2204, 2152, 2219, 2276, 2167, 2177, 2276, 2235, 2276, 2276, 2230, 2281, 2276, 2296, 2276, 2293, 2276, 2276, 2276, 2276, 2234, 2276, 2311, 2314, 2210, 2199, 2217, 2222, 2276, 2276, 2276, 2240, 2276, 2294, 2276, 2276, 2173, 2276, 2198, 2281, 2281, 2281, 2281, 2282, 2146, 2146, 2146, 2146, 2205, 2146, 2204, 2248, 2276, 2235, 2276, 2297, 2276, 2276, 2276, 2277, 2256, 2281, 2283, 2146, 2146, 2146, 2275, 2276, 2295, 2276, 2276, 2293, 2146, 2304, 2264, 2269, 2221, 2276, 2276, 2276, 2293, 2295, 2276, 2276, 2276, 2295, 2263, 2205, 2268, 2220, 2172, 2276, 2276, 2276, 2296, 2276, 2276, 2296, 2294, 2276, 2276, 2278, 2281, 2281, 2280, 2281, 2281, 2281, 2283, 2206, 2223, 2276, 2276, 2279, 2281, 2281, 2146, 2273, 2276, 2276, 2281, 2281, 2281, 2276, 2292, 2276, 2298, 2225, 2276, 2298, 2169, 2224, 2292, 2298, 2171, 2229, 2281, 2281, 2171, 2236, 2281, 2281, 2281, 2146, 2275, 2225, 2292, 2299, 2276, 2229, 2281, 2146, 2276, 2290, 2297, 2283, 2146, 2146, 2274, 2224, 2227, 2298, 2225, 2297, 2276, 2230, 2170, 2230, 2282, 2146, 2147, 2151, 2156, 2288, 2276, 2230, 2303, 2308, 2236, 2284, 2228, 2318, 2318, 2318, 2326, 2335, 2339, 2343, 2349, 2416, 2693, 2357, 2592, 2109, 2592, 2592, 2162, 2943, 2823, 2646, 2592, 2361, 2592, 2122, 2592, 2592, 2122, 2470, 2592, 2592, 2592, 2109, 2107, 2592, 2592, 2592, 2123, 2592, 2592, 2592, 2125, 2592, 2413, 2592, 2592, 2592, 2127, 2592, 2592, 2414, 2592, 2592, 2592, 2130, 2952, 2592, 2594, 2592, 2592, 2212, 2609, 2252, 2592, 2592, 2592, 2446, 2434, 2592, 2592, 2592, 2212, 2446, 2450, 2456, 2431, 2435, 2592, 2592, 2243, 2478, 2448, 2439, 2946, 2592, 2592, 2592, 2368, 2809, 2813, 2450, 2441, 2212, 2812, 2449, 2440, 2947, 2592, 2592, 2592, 2345, 2451, 2457, 2948, 2592, 2124, 2592, 2592, 2650, 2823, 2449, 2455, 2946, 2592, 2128, 2592, 2592, 2649, 2952, 2592, 2810, 2448, 2461, 2991, 2467, 2592, 2592, 2329, 2817, 2474, 2990, 2466, 2592, 2592, 2373, 2447, 2992, 2469, 2592, 2592, 2592, 2373, 2447, 2477, 2468, 2592, 2592, 2353, 2469, 2592, 2495, 2592, 2592, 2415, 2483, 2592, 2415, 2496, 2592, 2592, 2352, 2592, 2592, 2352, 2352, 2469, 2592, 2592, 2363, 2331, 2494, 2592, 2592, 2592, 2375, 2592, 2375, 2415, 2504, 2592, 2592, 2367, 2372, 2503, 2592, 2592, 2592, 2389, 2418, 2415, 2592, 2592, 2373, 2592, 2592, 2592, 2593, 2732, 2417, 2415, 2592, 2417, 2520, 2592, 2592, 2592, 2390, 2521, 2521, 2592, 2592, 2592, 2401, 2599, 2585, 2526, 2531, 2120, 2592, 2212, 2426, 2450, 2463, 2948, 2592, 2592, 2592, 2213, 2389, 2527, 2532, 2121, 2542, 2551, 2105, 2592, 2213, 2592, 2592, 2592, 2558, 2538, 2544, 2553, 2557, 2537, 2543, 2552, 2421, 2572, 2576, 2546, 2543, 2547, 2592, 2592, 2373, 2615, 2575, 2545, 2105, 2592, 2244, 2479, 2592, 2129, 2592, 2592, 2628, 2690, 2469, 2562, 2566, 2592, 2592, 2592, 2415, 2928, 2934, 2401, 2570, 2574, 2564, 2572, 2585, 2590, 2592, 2592, 2585, 2965, 2592, 2592, 2592, 2445, 2251, 2592, 2592, 2592, 2474, 2592, 2609, 2892, 2592, 2362, 2592, 2592, 2138, 2851, 2159, 2592, 2592, 2592, 2509, 2888, 2892, 2592, 2592, 2592, 2490, 2418, 2891, 2592, 2592, 2376, 2592, 2592, 2374, 2592, 2889, 2388, 2592, 2373, 2373, 2890, 2592, 2592, 2387, 2592, 2887, 2505, 2892, 2592, 2373, 2610, 2388, 2592, 2592, 2376, 2373, 2592, 2887, 2891, 2592, 2374, 2592, 2592, 2608, 2159, 2614, 2620, 2592, 2592, 2394, 2594, 2887, 2399, 2592, 2887, 2397, 2508, 2374, 2507, 2592, 2375, 2592, 2592, 2592, 2595, 2508, 2506, 2592, 2506, 2505, 2505, 2592, 2507, 2637, 2505, 2592, 2592, 2401, 2661, 2592, 2643, 2592, 2592, 2417, 2592, 2655, 2592, 2592, 2592, 2510, 2414, 2656, 2592, 2592, 2592, 2516, 2592, 2593, 2660, 2665, 2880, 2592, 2592, 2592, 2522, 2767, 2666, 2881, 2592, 2592, 2420, 2571, 2696, 2592, 2592, 2592, 2580, 2572, 2686, 2632, 2698, 2592, 2383, 2514, 2592, 2163, 2932, 2465, 2685, 2631, 2697, 2592, 2388, 2592, 2592, 2212, 2604, 2671, 2632, 2678, 2592, 2401, 2405, 2409, 2592, 2592, 2592, 2679, 2592, 2592, 2592, 2592, 2108, 2677, 2591, 2592, 2592, 2592, 2419, 2592, 2683, 2187, 2191, 2469, 2671, 2189, 2467, 2592, 2401, 2629, 2633, 2702, 2468, 2592, 2592, 2421, 2536, 2703, 2469, 2592, 2592, 2422, 2573, 2593, 2672, 2467, 2592, 2402, 2406, 2592, 2402, 2979, 2592, 2592, 2626, 2673, 2467, 2592, 2446, 2259, 2947, 2592, 2377, 2709, 2592, 2592, 2522, 2862, 2713, 2468, 2592, 2592, 2581, 2572, 2562, 2374, 2374, 2592, 2376, 2721, 2724, 2592, 2592, 2624, 2373, 2731, 2592, 2592, 2592, 2626, 2732, 2592, 2592, 2592, 2755, 2656, 2726, 2736, 2741, 2592, 2486, 2593, 2381, 2592, 2727, 2737, 2742, 2715, 2747, 2753, 2592, 2498, 2469, 2873, 2743, 2592, 2592, 2592, 2791, 2759, 2763, 2592, 2592, 2627, 2704, 2592, 2592, 2522, 2789, 2593, 2761, 2753, 2592, 2498, 2863, 2592, 2592, 2767, 2592, 2592, 2592, 2792, 2789, 2592, 2592, 2592, 2803, 2126, 2592, 2592, 2592, 2811, 2122, 2592, 2592, 2592, 2834, 2777, 2592, 2592, 2592, 2848, 2936, 2591, 2489, 2797, 2592, 2592, 2670, 2631, 2490, 2798, 2592, 2592, 2592, 2963, 2807, 2592, 2592, 2592, 2965, 2838, 2592, 2592, 2592, 2975, 2330, 2818, 2829, 2592, 2498, 2939, 2592, 2498, 2592, 2791, 2331, 2819, 2830, 2592, 2592, 2592, 2982, 2834, 2817, 2828, 2106, 2592, 2592, 2592, 2405, 2405, 2817, 2828, 2592, 2592, 2415, 2849, 2842, 2592, 2522, 2773, 2592, 2522, 2868, 2592, 2580, 2600, 2586, 2137, 2850, 2843, 2592, 2592, 2855, 2937, 2844, 2592, 2592, 2592, 2987, 2936, 2591, 2592, 2592, 2684, 2630, 2592, 2856, 2938, 2592, 2592, 2860, 2939, 2592, 2592, 2872, 2592, 2861, 2591, 2592, 2592, 2887, 2616, 2592, 2867, 2592, 2592, 2708, 2592, 2498, 2469, 2498, 2497, 2785, 2773, 2499, 2783, 2770, 2877, 2877, 2877, 2772, 2592, 2592, 2345, 2885, 2592, 2592, 2592, 2715, 2762, 2515, 2896, 2592, 2592, 2715, 2917, 2516, 2897, 2592, 2592, 2592, 2901, 2906, 2911, 2592, 2592, 2956, 2960, 2715, 2902, 2907, 2912, 2593, 2916, 2920, 2820, 2922, 2822, 2592, 2592, 2715, 2927, 2921, 2821, 2106, 2592, 2592, 2974, 2408, 2321, 2821, 2106, 2592, 2592, 2983, 2592, 2593, 2404, 2408, 2592, 2592, 2717, 2749, 2716, 2928, 2322, 2822, 2593, 2926, 2919, 2820, 2934, 2823, 2592, 2592, 2592, 2651, 2824, 2592, 2592, 2592, 2130, 2952, 2592, 2592, 2592, 2592, 2964, 2592, 2592, 2716, 2748, 2592, 2969, 2592, 2592, 2716, 2918, 2368, 2970, 2592, 2592, 2592, 2403, 2407, 2592, 2592, 2787, 2211, 2404, 2409, 2592, 2592, 2802, 2837, 2987, 2592, 2592, 2592, 2809, 2427, 2592, 2793, 2592, 2592, 2809, 2447, 1073741824, 0x80000000, 539754496, 542375936, 402653184, 554434560, 571736064, 545521856, 268451840, 335544320, 268693630, 512, 2048, 256, 1024, 0, 1024, 0, 1073741824, 0x80000000, 0, 0, 0, 8388608, 0, 0, 1073741824, 1073741824, 0, 0x80000000, 537133056, 4194304, 1048576, 268435456, -1073741824, 0, 0, 0, 1048576, 0, 0, 0, 1572864, 0, 0, 0, 4194304, 0, 134217728, 16777216, 0, 0, 32, 64, 98304, 0, 33554432, 8388608, 192, 67108864, 67108864, 67108864, 67108864, 16, 32, 4, 0, 8192, 196608, 196608, 229376, 80, 4096, 524288, 8388608, 0, 0, 32, 128, 256, 24576, 24600, 24576, 24576, 2, 24576, 24576, 24576, 24584, 24592, 24576, 24578, 24576, 24578, 24576, 24576, 16, 512, 2048, 2048, 256, 4096, 32768, 1048576, 4194304, 67108864, 134217728, 268435456, 262144, 134217728, 0, 128, 128, 64, 16384, 16384, 16384, 67108864, 32, 32, 4, 4, 4096, 262144, 134217728, 0, 0, 0, 2, 0, 8192, 131072, 131072, 4096, 4096, 4096, 4096, 24576, 24576, 24576, 8, 8, 24576, 24576, 16384, 16384, 16384, 24576, 24584, 24576, 24576, 24576, 16384, 24576, 536870912, 262144, 0, 0, 32, 2048, 8192, 4, 4096, 4096, 4096, 786432, 8388608, 16777216, 0, 128, 16384, 16384, 16384, 32768, 65536, 2097152, 32, 32, 32, 32, 4, 4, 4, 4, 4, 4096, 67108864, 67108864, 67108864, 24576, 24576, 24576, 24576, 0, 16384, 16384, 16384, 16384, 67108864, 67108864, 8, 67108864, 24576, 8, 8, 8, 24576, 24576, 24576, 24578, 24576, 24576, 24576, 2, 2, 2, 16384, 67108864, 67108864, 67108864, 32, 67108864, 8, 8, 24576, 2048, 0x80000000, 536870912, 262144, 262144, 262144, 67108864, 8, 24576, 16384, 32768, 1048576, 4194304, 25165824, 67108864, 24576, 32770, 2, 4, 112, 512, 98304, 524288, 50, 402653186, 1049090, 1049091, 10, 66, 100925514, 10, 66, 12582914, 0, 0, -1678194207, -1678194207, -1041543218, 0, 32768, 0, 0, 32, 65536, 268435456, 1, 1, 513, 1048577, 0, 12582912, 0, 0, 0, 4, 1792, 0, 0, 0, 7, 29360128, 0, 0, 0, 8, 0, 0, 0, 12, 1, 1, 0, 0, -604102721, -604102721, 4194304, 8388608, 0, 0, 0, 31, 925600, 997981306, 997981306, 997981306, 0, 0, 2048, 8388608, 0, 0, 1, 2, 4, 32, 64, 512, 8192, 0, 0, 0, 245760, 997720064, 0, 0, 0, 32, 0, 0, 0, 3, 12, 16, 32, 8, 112, 3072, 12288, 16384, 32768, 65536, 131072, 7864320, 16777216, 973078528, 0, 0, 65536, 131072, 3670016, 4194304, 16777216, 33554432, 2, 8, 48, 2048, 8192, 16384, 32768, 65536, 131072, 524288, 131072, 524288, 3145728, 4194304, 16777216, 33554432, 65536, 131072, 2097152, 4194304, 16777216, 33554432, 134217728, 268435456, 536870912, 0, 0, 0, 1024, 0, 8, 48, 2048, 8192, 65536, 33554432, 268435456, 536870912, 65536, 268435456, 536870912, 0, 0, 32768, 0, 0, 126, 623104, 65011712, 0, 32, 65536, 536870912, 0, 0, 65536, 524288, 0, 32, 65536, 0, 0, 0, 2048, 0, 0, 0, 15482, 245760, -604102721, 0, 0, 0, 18913, 33062912, 925600, -605028352, 0, 0, 0, 65536, 31, 8096, 131072, 786432, 3145728, 3145728, 12582912, 50331648, 134217728, 268435456, 160, 256, 512, 7168, 131072, 786432, 131072, 786432, 1048576, 2097152, 12582912, 16777216, 268435456, 1073741824, 0x80000000, 12582912, 16777216, 33554432, 268435456, 1073741824, 0x80000000, 3, 12, 16, 160, 256, 7168, 786432, 1048576, 12582912, 16777216, 268435456, 1073741824, 0, 8, 16, 32, 128, 256, 512, 7168, 786432, 1048576, 2097152, 0, 1, 2, 8, 16, 7168, 786432, 1048576, 8388608, 16777216, 16777216, 1073741824, 0, 0, 0, 0, 1, 0, 0, 8, 32, 128, 256, 7168, 8, 32, 0, 3072, 0, 8, 32, 3072, 4096, 524288, 8, 32, 0, 0, 3072, 4096, 0, 2048, 524288, 8388608, 8, 2048, 0, 0, 1, 12, 256, 4096, 32768, 262144, 1048576, 4194304, 67108864, 0, 2048, 0, 2048, 2048, 1073741824, -58805985, -58805985, -58805985, 0, 0, 262144, 0, 0, 32, 4194304, 16777216, 134217728, 4382, 172032, -58982400, 0, 0, 2, 28, 256, 4096, 8192, 8192, 32768, 131072, 262144, 524288, 1, 2, 12, 256, 4096, 0, 0, 4194304, 67108864, 134217728, 805306368, 1073741824, 0, 0, 1, 2, 12, 16, 256, 4096, 1048576, 67108864, 134217728, 268435456, 0, 512, 1048576, 4194304, 201326592, 1879048192, 0, 0, 12, 256, 4096, 134217728, 268435456, 536870912, 12, 256, 268435456, 536870912, 0, 12, 256, 0, 0, 1, 32, 64, 512, 0, 0, 205236961, 205236961, 0, 0, 0, 1, 96, 640, 1, 10976, 229376, 204996608, 0, 640, 2048, 8192, 229376, 1572864, 1572864, 2097152, 201326592, 0, 0, 0, 64, 512, 2048, 229376, 1572864, 201326592, 1572864, 201326592, 0, 0, 1, 4382, 0, 1, 32, 2048, 65536, 131072, 1572864, 201326592, 131072, 1572864, 134217728, 0, 0, 524288, 524288, 0, 0, 0, -68582786, -68582786, -68582786, 0, 0, 2097152, 524288, 0, 524288, 0, 0, 65536, 131072, 1572864, 0, 0, 2, 4, 0, 0, 65011712, -134217728, 0, 0, 0, 0, 2, 4, 120, 512, -268435456, 0, 0, 0, 2, 8, 48, 64, 2048, 8192, 98304, 524288, 2097152, 4194304, 25165824, 33554432, 134217728, 268435456, 0x80000000, 0, 0, 25165824, 33554432, 134217728, 1879048192, 0x80000000, 0, 0, 4, 112, 512, 622592, 65011712, 134217728, -268435456, 16777216, 33554432, 134217728, 1610612736, 0, 0, 0, 64, 98304, 524288, 4194304, 16777216, 33554432, 0, 98304, 524288, 16777216, 33554432, 0, 65536, 524288, 33554432, 536870912, 1073741824, 0, 65536, 524288, 536870912, 1073741824, 0, 0, 65536, 524288, 536870912, 0, 524288, 0, 524288, 524288, 1048576, 2086666240, 0x80000000, 0, -1678194207, 0, 0, 0, 8, 32, 2048, 524288, 8388608, 0, 0, 33062912, 436207616, 0x80000000, 0, 0, 32, 64, 2432, 16384, 32768, 32768, 524288, 3145728, 4194304, 25165824, 25165824, 167772160, 268435456, 0x80000000, 0, 32, 64, 384, 2048, 16384, 32768, 1048576, 2097152, 4194304, 25165824, 32, 64, 128, 256, 2048, 16384, 2048, 16384, 1048576, 4194304, 16777216, 33554432, 134217728, 536870912, 1073741824, 0, 0, 2048, 16384, 4194304, 16777216, 33554432, 134217728, 805306368, 0, 0, 16777216, 134217728, 268435456, 0x80000000, 0, 622592, 622592, 622592, 8807, 8807, 434791, 0, 0, 16777216, 0, 0, 0, 7, 608, 8192, 0, 0, 0, 3, 4, 96, 512, 32, 64, 8192, 0, 0, 16777216, 134217728, 0, 0, 2, 4, 8192, 16384, 65536, 2097152, 33554432, 268435456\n];\n\nXQueryTokenizer.TOKEN =\n[\n  \"(0)\",\n  \"ModuleDecl\",\n  \"Annotation\",\n  \"OptionDecl\",\n  \"Operator\",\n  \"Variable\",\n  \"Tag\",\n  \"EndTag\",\n  \"PragmaContents\",\n  \"DirCommentContents\",\n  \"DirPIContents\",\n  \"CDataSectionContents\",\n  \"AttrTest\",\n  \"Wildcard\",\n  \"EQName\",\n  \"IntegerLiteral\",\n  \"DecimalLiteral\",\n  \"DoubleLiteral\",\n  \"PredefinedEntityRef\",\n  \"'\\\"\\\"'\",\n  \"EscapeApos\",\n  \"QuotChar\",\n  \"AposChar\",\n  \"ElementContentChar\",\n  \"QuotAttrContentChar\",\n  \"AposAttrContentChar\",\n  \"NCName\",\n  \"QName\",\n  \"S\",\n  \"CharRef\",\n  \"CommentContents\",\n  \"DocTag\",\n  \"DocCommentContents\",\n  \"EOF\",\n  \"'!'\",\n  \"'\\\"'\",\n  \"'#'\",\n  \"'#)'\",\n  \"''''\",\n  \"'('\",\n  \"'(#'\",\n  \"'(:'\",\n  \"'(:~'\",\n  \"')'\",\n  \"'*'\",\n  \"'*'\",\n  \"','\",\n  \"'-->'\",\n  \"'.'\",\n  \"'/'\",\n  \"'/>'\",\n  \"':'\",\n  \"':)'\",\n  \"';'\",\n  \"'<!--'\",\n  \"'<![CDATA['\",\n  \"'<?'\",\n  \"'='\",\n  \"'>'\",\n  \"'?'\",\n  \"'?>'\",\n  \"'NaN'\",\n  \"'['\",\n  \"']'\",\n  \"']]>'\",\n  \"'after'\",\n  \"'all'\",\n  \"'allowing'\",\n  \"'ancestor'\",\n  \"'ancestor-or-self'\",\n  \"'and'\",\n  \"'any'\",\n  \"'append'\",\n  \"'array'\",\n  \"'as'\",\n  \"'ascending'\",\n  \"'at'\",\n  \"'attribute'\",\n  \"'base-uri'\",\n  \"'before'\",\n  \"'boundary-space'\",\n  \"'break'\",\n  \"'by'\",\n  \"'case'\",\n  \"'cast'\",\n  \"'castable'\",\n  \"'catch'\",\n  \"'check'\",\n  \"'child'\",\n  \"'collation'\",\n  \"'collection'\",\n  \"'comment'\",\n  \"'constraint'\",\n  \"'construction'\",\n  \"'contains'\",\n  \"'content'\",\n  \"'context'\",\n  \"'continue'\",\n  \"'copy'\",\n  \"'copy-namespaces'\",\n  \"'count'\",\n  \"'decimal-format'\",\n  \"'decimal-separator'\",\n  \"'declare'\",\n  \"'default'\",\n  \"'delete'\",\n  \"'descendant'\",\n  \"'descendant-or-self'\",\n  \"'descending'\",\n  \"'diacritics'\",\n  \"'different'\",\n  \"'digit'\",\n  \"'distance'\",\n  \"'div'\",\n  \"'document'\",\n  \"'document-node'\",\n  \"'element'\",\n  \"'else'\",\n  \"'empty'\",\n  \"'empty-sequence'\",\n  \"'encoding'\",\n  \"'end'\",\n  \"'entire'\",\n  \"'eq'\",\n  \"'every'\",\n  \"'exactly'\",\n  \"'except'\",\n  \"'exit'\",\n  \"'external'\",\n  \"'first'\",\n  \"'following'\",\n  \"'following-sibling'\",\n  \"'for'\",\n  \"'foreach'\",\n  \"'foreign'\",\n  \"'from'\",\n  \"'ft-option'\",\n  \"'ftand'\",\n  \"'ftnot'\",\n  \"'ftor'\",\n  \"'function'\",\n  \"'ge'\",\n  \"'greatest'\",\n  \"'group'\",\n  \"'grouping-separator'\",\n  \"'gt'\",\n  \"'idiv'\",\n  \"'if'\",\n  \"'import'\",\n  \"'in'\",\n  \"'index'\",\n  \"'infinity'\",\n  \"'inherit'\",\n  \"'insensitive'\",\n  \"'insert'\",\n  \"'instance'\",\n  \"'integrity'\",\n  \"'intersect'\",\n  \"'into'\",\n  \"'is'\",\n  \"'item'\",\n  \"'json'\",\n  \"'json-item'\",\n  \"'key'\",\n  \"'language'\",\n  \"'last'\",\n  \"'lax'\",\n  \"'le'\",\n  \"'least'\",\n  \"'let'\",\n  \"'levels'\",\n  \"'loop'\",\n  \"'lowercase'\",\n  \"'lt'\",\n  \"'minus-sign'\",\n  \"'mod'\",\n  \"'modify'\",\n  \"'module'\",\n  \"'most'\",\n  \"'namespace'\",\n  \"'namespace-node'\",\n  \"'ne'\",\n  \"'next'\",\n  \"'no'\",\n  \"'no-inherit'\",\n  \"'no-preserve'\",\n  \"'node'\",\n  \"'nodes'\",\n  \"'not'\",\n  \"'object'\",\n  \"'occurs'\",\n  \"'of'\",\n  \"'on'\",\n  \"'only'\",\n  \"'option'\",\n  \"'or'\",\n  \"'order'\",\n  \"'ordered'\",\n  \"'ordering'\",\n  \"'paragraph'\",\n  \"'paragraphs'\",\n  \"'parent'\",\n  \"'pattern-separator'\",\n  \"'per-mille'\",\n  \"'percent'\",\n  \"'phrase'\",\n  \"'position'\",\n  \"'preceding'\",\n  \"'preceding-sibling'\",\n  \"'preserve'\",\n  \"'previous'\",\n  \"'processing-instruction'\",\n  \"'relationship'\",\n  \"'rename'\",\n  \"'replace'\",\n  \"'return'\",\n  \"'returning'\",\n  \"'revalidation'\",\n  \"'same'\",\n  \"'satisfies'\",\n  \"'schema'\",\n  \"'schema-attribute'\",\n  \"'schema-element'\",\n  \"'score'\",\n  \"'self'\",\n  \"'sensitive'\",\n  \"'sentence'\",\n  \"'sentences'\",\n  \"'skip'\",\n  \"'sliding'\",\n  \"'some'\",\n  \"'stable'\",\n  \"'start'\",\n  \"'stemming'\",\n  \"'stop'\",\n  \"'strict'\",\n  \"'strip'\",\n  \"'structured-item'\",\n  \"'switch'\",\n  \"'text'\",\n  \"'then'\",\n  \"'thesaurus'\",\n  \"'times'\",\n  \"'to'\",\n  \"'treat'\",\n  \"'try'\",\n  \"'tumbling'\",\n  \"'type'\",\n  \"'typeswitch'\",\n  \"'union'\",\n  \"'unique'\",\n  \"'unordered'\",\n  \"'updating'\",\n  \"'uppercase'\",\n  \"'using'\",\n  \"'validate'\",\n  \"'value'\",\n  \"'variable'\",\n  \"'version'\",\n  \"'weight'\",\n  \"'when'\",\n  \"'where'\",\n  \"'while'\",\n  \"'wildcards'\",\n  \"'window'\",\n  \"'with'\",\n  \"'without'\",\n  \"'word'\",\n  \"'words'\",\n  \"'xquery'\",\n  \"'zero-digit'\",\n  \"'{'\",\n  \"'{{'\",\n  \"'|'\",\n  \"'}'\",\n  \"'}}'\"\n];\n\n},\n{}],\n2:[function(_dereq_,module,exports){\n'use strict';\n\nvar TokenHandler = function(code) {\n    var input = code;\n    this.tokens = [];\n \n    this.reset = function() {\n        input = input;\n        this.tokens = [];\n    };\n    \n    this.startNonterminal = function() {};\n    this.endNonterminal = function() {};\n\n    this.terminal = function(name, begin, end) {\n        this.tokens.push({\n            name: name,\n            value: input.substring(begin, end)\n        });\n    };\n\n    this.whitespace = function(begin, end) {\n        this.tokens.push({\n            name: 'WS',\n            value: input.substring(begin, end)\n        });\n    };\n};\n\nexports.Lexer = function(Tokenizer, Rules) {\n\n    this.tokens = [];\n  \n    this.getLineTokens = function(line, state) {\n        state = (state === 'start' || !state) ? '[\"start\"]' : state;\n        var stack = JSON.parse(state);\n        var h = new TokenHandler(line);\n        var tokenizer = new Tokenizer(line, h);\n        var tokens = [];\n    \n        while(true) {\n            var currentState = stack[stack.length - 1];\n            try {\n                h.tokens = [];\n                tokenizer['parse_' + currentState]();\n                var info = null;\n        \n                if(h.tokens.length > 1 && h.tokens[0].name === 'WS') {\n                    tokens.push({\n                        type: 'text',\n                        value: h.tokens[0].value\n                    });\n                    h.tokens.splice(0, 1);\n                }\n        \n                var token = h.tokens[0];\n                var rules  = Rules[currentState];\n                for(var k = 0; k < rules.length; k++) {\n                    var rule = Rules[currentState][k];\n                    if((typeof(rule.name) === 'function' && rule.name(token)) || rule.name === token.name) {\n                        info = rule;\n                        break;\n                    }\n                }\n        \n                if(token.name === 'EOF') { break; }\n                if(token.value === '') { throw 'Encountered empty string lexical rule.'; }\n        \n                tokens.push({\n                    type: info === null ? 'text' : (typeof(info.token) === 'function' ? info.token(token.value) : info.token),\n                    value: token.value\n                });\n        \n                if(info && info.next) {\n                    info.next(stack);\n                }\n      \n            } catch(e) {\n                if(e instanceof tokenizer.ParseException) {\n                    var index = 0;\n                    for(var i=0; i < tokens.length; i++) {\n                        index += tokens[i].value.length;\n                    }\n                    tokens.push({ type: 'text', value: line.substring(index) });\n                    return {\n                        tokens: tokens,\n                        state: JSON.stringify(['start'])\n                    };\n                } else {\n                    throw e;\n                }\n            }\n        }\n\n        return {\n            tokens: tokens,\n            state: JSON.stringify(stack)\n        };\n    };\n};\n},\n{}],\n3:[function(_dereq_,module,exports){\n'use strict';\n\nvar XQueryTokenizer = _dereq_('./XQueryTokenizer').XQueryTokenizer;\nvar Lexer = _dereq_('./lexer').Lexer;\n\nvar keys = 'after|ancestor|ancestor-or-self|and|as|ascending|attribute|before|case|cast|castable|child|collation|comment|copy|count|declare|default|delete|descendant|descendant-or-self|descending|div|document|document-node|element|else|empty|empty-sequence|end|eq|every|except|first|following|following-sibling|for|function|ge|group|gt|idiv|if|import|insert|instance|intersect|into|is|item|last|le|let|lt|mod|modify|module|namespace|namespace-node|ne|node|only|or|order|ordered|parent|preceding|preceding-sibling|processing-instruction|rename|replace|return|satisfies|schema-attribute|schema-element|self|some|stable|start|switch|text|to|treat|try|typeswitch|union|unordered|validate|where|with|xquery|contains|paragraphs|sentences|times|words|by|collectionreturn|variable|version|option|when|encoding|toswitch|catch|tumbling|sliding|window|at|using|stemming|collection|schema|while|on|nodes|index|external|then|in|updating|value|of|containsbreak|loop|continue|exit|returning|append|json|position|strict'.split('|');\n\nvar keywords = keys.map(function(val) { return { name: '\\'' + val + '\\'', token: 'keyword' }; });\nvar ncnames = keys.map(function(val) { return { name: '\\'' + val + '\\'', token: 'text', next: function(stack){ stack.pop(); } }; });\n\nvar cdata = 'constant.language';\nvar number = 'constant';\nvar xmlcomment = 'comment';\nvar pi = 'xml-pe';\nvar pragma = 'constant.buildin';\nvar n = function(name){\n    return '\\'' + name + '\\'';\n};\nvar Rules = {\n    start: [\n        { name: n('(#'), token: pragma, next: function(stack){ stack.push('Pragma'); } },\n        { name: n('(:'), token: 'comment', next: function(stack){ stack.push('Comment'); } },\n        { name: n('(:~'), token: 'comment.doc', next: function(stack){ stack.push('CommentDoc'); } },\n        { name: n('<!--'), token: xmlcomment, next: function(stack){ stack.push('XMLComment'); } },\n        { name: n('<?'), token: pi, next: function(stack) { stack.push('PI'); } },\n        { name: n('\\'\\''), token: 'string', next: function(stack){ stack.push('AposString'); } },\n        { name: n('\"'), token: 'string', next: function(stack){ stack.push('QuotString'); } },\n        { name: 'Annotation', token: 'support.function' },\n        { name: 'ModuleDecl', token: 'keyword', next: function(stack){ stack.push('Prefix'); } },\n        { name: 'OptionDecl', token: 'keyword', next: function(stack){ stack.push('_EQName'); } },\n        { name: 'AttrTest', token: 'support.type' },\n        { name: 'Variable', token: 'variable' },\n        { name: n('<![CDATA['), token: cdata, next: function(stack){ stack.push('CData'); } },\n        { name: 'IntegerLiteral', token: number },\n        { name: 'DecimalLiteral', token: number },\n        { name: 'DoubleLiteral', token: number },\n        { name: 'Operator', token: 'keyword.operator' },\n        { name: 'EQName', token: function(val) { return keys.indexOf(val) !== -1 ? 'keyword' : 'support.function'; } },\n        { name: n('('), token: 'lparen' },\n        { name: n(')'), token: 'rparen' },\n        { name: 'Tag', token: 'meta.tag', next: function(stack){ stack.push('StartTag'); } },\n        { name: n('}'), token: 'text', next: function(stack){ if(stack.length > 1) { stack.pop(); } } },\n        { name: n('{'), token: 'text', next: function(stack){ stack.push('start'); } } //, next: function(stack){ if(stack.length > 1) { stack.pop(); } } }\n    ].concat(keywords),\n    _EQName: [\n        { name: 'EQName', token: 'text', next: function(stack) { stack.pop(); } }\n    ].concat(ncnames),\n    Prefix: [\n        { name: 'NCName', token: 'text', next: function(stack) { stack.pop(); } }\n    ].concat(ncnames),\n    StartTag: [\n        { name: n('>'), token: 'meta.tag', next: function(stack){ stack.push('TagContent'); } },\n        { name: 'QName', token: 'entity.other.attribute-name' },\n        { name: n('='), token: 'text' },\n        { name: n('\\'\\''), token: 'string', next: function(stack){ stack.push('AposAttr'); } },\n        { name: n('\"'), token: 'string', next: function(stack){ stack.push('QuotAttr'); } },\n        { name: n('/>'), token: 'meta.tag.r', next: function(stack){ stack.pop(); } }\n    ],\n    TagContent: [\n        { name: 'ElementContentChar', token: 'text' },\n        { name: n('<![CDATA['), token: cdata, next: function(stack){ stack.push('CData'); } },\n        { name: n('<!--'), token: xmlcomment, next: function(stack){ stack.push('XMLComment'); } },\n        { name: 'Tag', token: 'meta.tag', next: function(stack){ stack.push('StartTag'); } },\n        { name: 'PredefinedEntityRef', token: 'constant.language.escape' },\n        { name: 'CharRef', token: 'constant.language.escape' },\n        { name: n('{{'), token: 'text' },\n        { name: n('}}'), token: 'text' },\n        { name: n('{'), token: 'text', next: function(stack){ stack.push('start'); } },\n        { name: 'EndTag', token: 'meta.tag', next: function(stack){ stack.pop(); stack.pop(); } }\n    ],\n    AposAttr: [\n        { name: n('\\'\\''), token: 'string', next: function(stack){ stack.pop(); } },\n        { name: 'EscapeApos', token: 'constant.language.escape' },\n        { name: 'AposAttrContentChar', token: 'string' },\n        { name: 'PredefinedEntityRef', token: 'constant.language.escape' },\n        { name: 'CharRef', token: 'constant.language.escape' },\n        { name: n('{{'), token: 'string' },\n        { name: n('}}'), token: 'string' },\n        { name: n('{'), token: 'text', next: function(stack){ stack.push('start'); } }\n    ],\n    QuotAttr: [\n        { name: n('\\\"'), token: 'string', next: function(stack){ stack.pop(); } },\n        { name: 'EscapeQuot', token: 'constant.language.escape' },\n        { name: 'QuotAttrContentChar', token: 'string' },\n        { name: 'PredefinedEntityRef', token: 'constant.language.escape' },\n        { name: 'CharRef', token: 'constant.language.escape' },\n        { name: n('{{'), token: 'string' },\n        { name: n('}}'), token: 'string' },\n        { name: n('{'), token: 'text', next: function(stack){ stack.push('start'); } }\n    ],\n    Pragma: [\n        { name: 'PragmaContents', token: pragma },\n        { name: n('#'), token: pragma },\n        { name: n('#)'), token: pragma, next: function(stack){ stack.pop(); } }\n    ],\n    Comment: [\n        { name: 'CommentContents', token: 'comment' },\n        { name: n('(:'), token: 'comment', next: function(stack){ stack.push('Comment'); } },\n        { name: n(':)'), token: 'comment', next: function(stack){ stack.pop(); } }\n    ],\n    CommentDoc: [\n        { name: 'DocCommentContents', token: 'comment.doc' },\n        { name: 'DocTag', token: 'comment.doc.tag' },\n        { name: n('(:'), token: 'comment.doc', next: function(stack){ stack.push('CommentDoc'); } },\n        { name: n(':)'), token: 'comment.doc', next: function(stack){ stack.pop(); } }\n    ],\n    XMLComment: [\n        { name: 'DirCommentContents', token: xmlcomment },\n        { name: n('-->'), token: xmlcomment, next: function(stack){ stack.pop(); } }\n    ],\n    CData: [\n        { name: 'CDataSectionContents', token: cdata },\n        { name: n(']]>'), token: cdata, next: function(stack){ stack.pop(); } }\n    ],\n    PI: [\n        { name: 'DirPIContents', token: pi },\n        { name: n('?'), token: pi },\n        { name: n('?>'), token: pi, next: function(stack){ stack.pop(); } }\n    ],\n    AposString: [\n        { name: n('\\'\\''), token: 'string', next: function(stack){ stack.pop(); } },\n        { name: 'PredefinedEntityRef', token: 'constant.language.escape' },\n        { name: 'CharRef', token: 'constant.language.escape' },\n        { name: 'EscapeApos', token: 'constant.language.escape' },\n        { name: 'AposChar', token: 'string' }\n    ],\n    QuotString: [\n        { name: n('\"'), token: 'string', next: function(stack){ stack.pop(); } },\n        { name: 'PredefinedEntityRef', token: 'constant.language.escape' },\n        { name: 'CharRef', token: 'constant.language.escape' },\n        { name: 'EscapeQuot', token: 'constant.language.escape' },\n        { name: 'QuotChar', token: 'string' }\n    ]\n};\n    \nexports.XQueryLexer = function(){ return new Lexer(XQueryTokenizer, Rules); };\n},\n{\"./XQueryTokenizer\":1,\"./lexer\":2}]},{},[3])\n(3)\n\n});\n\nace.define(\"ace/mode/behaviour/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nvar SAFE_INSERT_IN_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\"];\nvar SAFE_INSERT_BEFORE_TOKENS =\n    [\"text\", \"paren.rparen\", \"punctuation.operator\", \"comment\"];\n\nvar context;\nvar contextCache = {};\nvar initContext = function(editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n        id = editor.selection.index;\n        if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n            contextCache = {rangeCount: editor.multiSelect.rangeCount};\n    }\n    if (contextCache[id])\n        return context = contextCache[id];\n    context = contextCache[id] = {\n        autoInsertedBrackets: 0,\n        autoInsertedRow: -1,\n        autoInsertedLineEnd: \"\",\n        maybeInsertedBrackets: 0,\n        maybeInsertedRow: -1,\n        maybeInsertedLineStart: \"\",\n        maybeInsertedLineEnd: \"\"\n    };\n};\n\nvar CstyleBehaviour = function() {\n    this.add(\"braces\", \"insertion\", function(state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == '{') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"{\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '{' + selected + '}',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                if (/[\\]\\}\\)]/.test(line[cursor.column]) || editor.inMultiSelectMode) {\n                    CstyleBehaviour.recordAutoInsert(editor, session, \"}\");\n                    return {\n                        text: '{}',\n                        selection: [1, 1]\n                    };\n                } else {\n                    CstyleBehaviour.recordMaybeInsert(editor, session, \"{\");\n                    return {\n                        text: '{',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == '}') {\n            initContext(editor);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == '}') {\n                var matching = session.$findOpeningBracket('}', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n            initContext(editor);\n            var closing = \"\";\n            if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n                closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n                CstyleBehaviour.clearMaybeInsertedClosing();\n            }\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar === '}') {\n                var openBracePos = session.findMatchingBracket({row: cursor.row, column: cursor.column+1}, '}');\n                if (!openBracePos)\n                     return null;\n                var next_indent = this.$getIndent(session.getLine(openBracePos.row));\n            } else if (closing) {\n                var next_indent = this.$getIndent(line);\n            } else {\n                CstyleBehaviour.clearMaybeInsertedClosing();\n                return;\n            }\n            var indent = next_indent + session.getTabString();\n\n            return {\n                text: '\\n' + indent + '\\n' + next_indent + closing,\n                selection: [1, indent.length, 1, indent.length]\n            };\n        } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n    });\n\n    this.add(\"braces\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '{') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.end.column, range.end.column + 1);\n            if (rightChar == '}') {\n                range.end.column++;\n                return range;\n            } else {\n                context.maybeInsertedBrackets--;\n            }\n        }\n    });\n\n    this.add(\"parens\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '(') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '(' + selected + ')',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \")\");\n                return {\n                    text: '()',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ')') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ')') {\n                var matching = session.$findOpeningBracket(')', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"parens\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '(') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ')') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '[') {\n            initContext(editor);\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: '[' + selected + ']',\n                    selection: false\n                };\n            } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n                CstyleBehaviour.recordAutoInsert(editor, session, \"]\");\n                return {\n                    text: '[]',\n                    selection: [1, 1]\n                };\n            }\n        } else if (text == ']') {\n            initContext(editor);\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            if (rightChar == ']') {\n                var matching = session.$findOpeningBracket(']', {column: cursor.column + 1, row: cursor.row});\n                if (matching !== null && CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)) {\n                    CstyleBehaviour.popAutoInsertedClosing();\n                    return {\n                        text: '',\n                        selection: [1, 1]\n                    };\n                }\n            }\n        }\n    });\n\n    this.add(\"brackets\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == '[') {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == ']') {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"insertion\", function(state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            initContext(editor);\n            var quote = text;\n            var selection = editor.getSelectionRange();\n            var selected = session.doc.getTextRange(selection);\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            } else {\n                var cursor = editor.getCursorPosition();\n                var line = session.doc.getLine(cursor.row);\n                var leftChar = line.substring(cursor.column-1, cursor.column);\n                var rightChar = line.substring(cursor.column, cursor.column + 1);\n                \n                var token = session.getTokenAt(cursor.row, cursor.column);\n                var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n                if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n                    return null;\n                \n                var stringBefore = token && /string/.test(token.type);\n                var stringAfter = !rightToken || /string/.test(rightToken.type);\n                \n                var pair;\n                if (rightChar == quote) {\n                    pair = stringBefore !== stringAfter;\n                } else {\n                    if (stringBefore && !stringAfter)\n                        return null; // wrap string with different quote\n                    if (stringBefore && stringAfter)\n                        return null; // do not pair quotes inside strings \n                    var wordRe = session.$mode.tokenRe;\n                    wordRe.lastIndex = 0;\n                    var isWordBefore = wordRe.test(leftChar);\n                    wordRe.lastIndex = 0;\n                    var isWordAfter = wordRe.test(leftChar);\n                    if (isWordBefore || isWordAfter)\n                        return null; // before or after alphanumeric\n                    if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar))\n                        return null; // there is rightChar and it isn't closing\n                    pair = true;\n                }\n                return {\n                    text: pair ? quote + quote : \"\",\n                    selection: [1,1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            initContext(editor);\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n};\n\n    \nCstyleBehaviour.isSaneInsertion = function(editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (!this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS)) {\n        var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n        if (!this.$matchTokenType(iterator2.getCurrentToken() || \"text\", SAFE_INSERT_IN_TOKENS))\n            return false;\n    }\n    iterator.stepForward();\n    return iterator.getCurrentTokenRow() !== cursor.row ||\n        this.$matchTokenType(iterator.getCurrentToken() || \"text\", SAFE_INSERT_BEFORE_TOKENS);\n};\n\nCstyleBehaviour.$matchTokenType = function(token, types) {\n    return types.indexOf(token.type || token) > -1;\n};\n\nCstyleBehaviour.recordAutoInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isAutoInsertedClosing(cursor, line, context.autoInsertedLineEnd[0]))\n        context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\n};\n\nCstyleBehaviour.recordMaybeInsert = function(editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (!this.isMaybeInsertedClosing(cursor, line))\n        context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n};\n\nCstyleBehaviour.isAutoInsertedClosing = function(cursor, line, bracket) {\n    return context.autoInsertedBrackets > 0 &&\n        cursor.row === context.autoInsertedRow &&\n        bracket === context.autoInsertedLineEnd[0] &&\n        line.substr(cursor.column) === context.autoInsertedLineEnd;\n};\n\nCstyleBehaviour.isMaybeInsertedClosing = function(cursor, line) {\n    return context.maybeInsertedBrackets > 0 &&\n        cursor.row === context.maybeInsertedRow &&\n        line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n        line.substr(0, cursor.column) == context.maybeInsertedLineStart;\n};\n\nCstyleBehaviour.popAutoInsertedClosing = function() {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n};\n\nCstyleBehaviour.clearMaybeInsertedClosing = function() {\n    if (context) {\n        context.maybeInsertedBrackets = 0;\n        context.maybeInsertedRow = -1;\n    }\n};\n\n\n\noop.inherits(CstyleBehaviour, Behaviour);\n\nexports.CstyleBehaviour = CstyleBehaviour;\n});\n\nace.define(\"ace/mode/behaviour/xml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/token_iterator\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Behaviour = require(\"../behaviour\").Behaviour;\nvar TokenIterator = require(\"../../token_iterator\").TokenIterator;\nvar lang = require(\"../../lib/lang\");\n\nfunction is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n}\n\nvar XmlBehaviour = function () {\n\n    this.add(\"string_dquotes\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n            var quote = text;\n            var selected = session.doc.getTextRange(editor.getSelectionRange());\n            if (selected !== \"\" && selected !== \"'\" && selected != '\"' && editor.getWrapBehavioursEnabled()) {\n                return {\n                    text: quote + selected + quote,\n                    selection: false\n                };\n            }\n\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (rightChar == quote && (is(token, \"attribute-value\") || is(token, \"string\"))) {\n                return {\n                    text: \"\",\n                    selection: [1, 1]\n                };\n            }\n\n            if (!token)\n                token = iterator.stepBackward();\n\n            if (!token)\n                return;\n\n            while (is(token, \"tag-whitespace\") || is(token, \"whitespace\")) {\n                token = iterator.stepBackward();\n            }\n            var rightSpace = !rightChar || rightChar.match(/\\s/);\n            if (is(token, \"attribute-equals\") && (rightSpace || rightChar == '>') || (is(token, \"decl-attribute-equals\") && (rightSpace || rightChar == '?'))) {\n                return {\n                    text: quote + quote,\n                    selection: [1, 1]\n                };\n            }\n        }\n    });\n\n    this.add(\"string_dquotes\", \"deletion\", function(state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && (selected == '\"' || selected == \"'\")) {\n            var line = session.doc.getLine(range.start.row);\n            var rightChar = line.substring(range.start.column + 1, range.start.column + 2);\n            if (rightChar == selected) {\n                range.end.column++;\n                return range;\n            }\n        }\n    });\n\n    this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken() || iterator.stepBackward();\n            if (!token || !(is(token, \"tag-name\") || is(token, \"tag-whitespace\") || is(token, \"attribute-name\") || is(token, \"attribute-equals\") || is(token, \"attribute-value\")))\n                return;\n            if (is(token, \"reference.attribute-value\"))\n                return;\n            if (is(token, \"attribute-value\")) {\n                var firstChar = token.value.charAt(0);\n                if (firstChar == '\"' || firstChar == \"'\") {\n                    var lastChar = token.value.charAt(token.value.length - 1);\n                    var tokenEnd = iterator.getCurrentTokenColumn() + token.value.length;\n                    if (tokenEnd > position.column || tokenEnd == position.column && firstChar != lastChar)\n                        return;\n                }\n            }\n            while (!is(token, \"tag-name\")) {\n                token = iterator.stepBackward();\n            }\n\n            var tokenRow = iterator.getCurrentTokenRow();\n            var tokenColumn = iterator.getCurrentTokenColumn();\n            if (is(iterator.stepBackward(), \"end-tag-open\"))\n                return;\n\n            var element = token.value;\n            if (tokenRow == position.row)\n                element = element.substring(0, position.column - tokenColumn);\n\n            if (this.voidElements.hasOwnProperty(element.toLowerCase()))\n                 return;\n\n            return {\n               text: \">\" + \"</\" + element + \">\",\n               selection: [1, 1]\n            };\n        }\n    });\n\n    this.add(\"autoindent\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n            var cursor = editor.getCursorPosition();\n            var line = session.getLine(cursor.row);\n            var iterator = new TokenIterator(session, cursor.row, cursor.column);\n            var token = iterator.getCurrentToken();\n\n            if (token && token.type.indexOf(\"tag-close\") !== -1) {\n                while (token && token.type.indexOf(\"tag-name\") === -1) {\n                    token = iterator.stepBackward();\n                }\n\n                if (!token) {\n                    return;\n                }\n\n                var tag = token.value;\n                var row = iterator.getCurrentTokenRow();\n                token = iterator.stepBackward();\n                if (!token || token.type.indexOf(\"end-tag\") !== -1) {\n                    return;\n                }\n\n                if (this.voidElements && !this.voidElements[tag]) {\n                    var nextToken = session.getTokenAt(cursor.row, cursor.column+1);\n                    var line = session.getLine(row);\n                    var nextIndent = this.$getIndent(line);\n                    var indent = nextIndent + session.getTabString();\n\n                    if (nextToken && nextToken.value === \"</\") {\n                        return {\n                            text: \"\\n\" + indent + \"\\n\" + nextIndent,\n                            selection: [1, indent.length, 1, indent.length]\n                        };\n                    } else {\n                        return {\n                            text: \"\\n\" + indent\n                        };\n                    }\n                }\n            }\n        }\n    });\n\n};\n\noop.inherits(XmlBehaviour, Behaviour);\n\nexports.XmlBehaviour = XmlBehaviour;\n});\n\nace.define(\"ace/mode/behaviour/xquery\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/behaviour\",\"ace/mode/behaviour/cstyle\",\"ace/mode/behaviour/xml\",\"ace/token_iterator\"], function(require, exports, module) {\n\"use strict\";\n\n  var oop = require(\"../../lib/oop\");\n  var Behaviour = require('../behaviour').Behaviour;\n  var CstyleBehaviour = require('./cstyle').CstyleBehaviour;\n  var XmlBehaviour = require(\"../behaviour/xml\").XmlBehaviour;\n  var TokenIterator = require(\"../../token_iterator\").TokenIterator;\n\nfunction hasType(token, type) {\n    var hasType = true;\n    var typeList = token.type.split('.');\n    var needleList = type.split('.');\n    needleList.forEach(function(needle){\n        if (typeList.indexOf(needle) == -1) {\n            hasType = false;\n            return false;\n        }\n    });\n    return hasType;\n}\n \n  var XQueryBehaviour = function () {\n      \n      this.inherit(CstyleBehaviour, [\"braces\", \"parens\", \"string_dquotes\"]); // Get string behaviour\n      this.inherit(XmlBehaviour); // Get xml behaviour\n      \n      this.add(\"autoclosing\", \"insertion\", function (state, action, editor, session, text) {\n        if (text == '>') {\n            var position = editor.getCursorPosition();\n            var iterator = new TokenIterator(session, position.row, position.column);\n            var token = iterator.getCurrentToken();\n            var atCursor = false;\n            var state = JSON.parse(state).pop();\n            if ((token && token.value === '>') || state !== \"StartTag\") return;\n            if (!token || !hasType(token, 'meta.tag') && !(hasType(token, 'text') && token.value.match('/'))){\n                do {\n                    token = iterator.stepBackward();\n                } while (token && (hasType(token, 'string') || hasType(token, 'keyword.operator') || hasType(token, 'entity.attribute-name') || hasType(token, 'text')));\n            } else {\n                atCursor = true;\n            }\n            var previous = iterator.stepBackward();\n            if (!token || !hasType(token, 'meta.tag') || (previous !== null && previous.value.match('/'))) {\n                return\n            }\n            var tag = token.value.substring(1);\n            if (atCursor){\n                var tag = tag.substring(0, position.column - token.start);\n            }\n\n            return {\n               text: '>' + '</' + tag + '>',\n               selection: [1, 1]\n            }\n        }\n    });\n\n  }\n  oop.inherits(XQueryBehaviour, Behaviour);\n\n  exports.XQueryBehaviour = XQueryBehaviour;\n});\n\nace.define(\"ace/mode/folding/cstyle\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/range\",\"ace/mode/folding/fold_mode\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar Range = require(\"../../range\").Range;\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\n\nvar FoldMode = exports.FoldMode = function(commentRegex) {\n    if (commentRegex) {\n        this.foldingStartMarker = new RegExp(\n            this.foldingStartMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.start)\n        );\n        this.foldingStopMarker = new RegExp(\n            this.foldingStopMarker.source.replace(/\\|[^|]*?$/, \"|\" + commentRegex.end)\n        );\n    }\n};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n    \n    this.foldingStartMarker = /(\\{|\\[)[^\\}\\]]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{]*(\\}|\\])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe= /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n    \n        if (this.singleLineBlockCommentRe.test(line)) {\n            if (!this.startRegionRe.test(line) && !this.tripleStarBlockCommentRe.test(line))\n                return \"\";\n        }\n    \n        var fw = this._getFoldWidgetBase(session, foldStyle, row);\n    \n        if (!fw && this.startRegionRe.test(line))\n            return \"start\"; // lineCommentRegionStart\n    \n        return fw;\n    };\n\n    this.getFoldWidgetRange = function(session, foldStyle, row, forceMultiline) {\n        var line = session.getLine(row);\n        \n        if (this.startRegionRe.test(line))\n            return this.getCommentRegionBlock(session, line, row);\n        \n        var match = line.match(this.foldingStartMarker);\n        if (match) {\n            var i = match.index;\n\n            if (match[1])\n                return this.openingBracketBlock(session, match[1], row, i);\n                \n            var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n            \n            if (range && !range.isMultiLine()) {\n                if (forceMultiline) {\n                    range = this.getSectionRange(session, row);\n                } else if (foldStyle != \"all\")\n                    range = null;\n            }\n            \n            return range;\n        }\n\n        if (foldStyle === \"markbegin\")\n            return;\n\n        var match = line.match(this.foldingStopMarker);\n        if (match) {\n            var i = match.index + match[0].length;\n\n            if (match[1])\n                return this.closingBracketBlock(session, match[1], row, i);\n\n            return session.getCommentFoldRange(row, i, -1);\n        }\n    };\n    \n    this.getSectionRange = function(session, row) {\n        var line = session.getLine(row);\n        var startIndent = line.search(/\\S/);\n        var startRow = row;\n        var startColumn = line.length;\n        row = row + 1;\n        var endRow = row;\n        var maxRow = session.getLength();\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var indent = line.search(/\\S/);\n            if (indent === -1)\n                continue;\n            if  (startIndent > indent)\n                break;\n            var subRange = this.getFoldWidgetRange(session, \"all\", row);\n            \n            if (subRange) {\n                if (subRange.start.row <= startRow) {\n                    break;\n                } else if (subRange.isMultiLine()) {\n                    row = subRange.end.row;\n                } else if (startIndent == indent) {\n                    break;\n                }\n            }\n            endRow = row;\n        }\n        \n        return new Range(startRow, startColumn, endRow, session.getLine(endRow).length);\n    };\n    \n    this.getCommentRegionBlock = function(session, line, row) {\n        var startColumn = line.search(/\\s*$/);\n        var maxRow = session.getLength();\n        var startRow = row;\n        \n        var re = /^\\s*(?:\\/\\*|\\/\\/)#(end)?region\\b/;\n        var depth = 1;\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var m = re.exec(line);\n            if (!m) continue;\n            if (m[1]) depth--;\n            else depth++;\n\n            if (!depth) break;\n        }\n\n        var endRow = row;\n        if (endRow > startRow) {\n            return new Range(startRow, startColumn, endRow, line.length);\n        }\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/xquery\",[\"require\",\"exports\",\"module\",\"ace/worker/worker_client\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/text_highlight_rules\",\"ace/mode/xquery/xquery_lexer\",\"ace/range\",\"ace/mode/behaviour/xquery\",\"ace/mode/folding/cstyle\",\"ace/anchor\"], function(require, exports, module) {\n\"use strict\";\n\nvar WorkerClient = require(\"../worker/worker_client\").WorkerClient;\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\nvar XQueryLexer = require(\"./xquery/xquery_lexer\").XQueryLexer;\nvar Range = require(\"../range\").Range;\nvar XQueryBehaviour = require(\"./behaviour/xquery\").XQueryBehaviour;\nvar CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\nvar Anchor = require(\"../anchor\").Anchor;\n\nvar Mode = function() {\n    this.$tokenizer   = new XQueryLexer();\n    this.$behaviour   = new XQueryBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n    this.$highlightRules = new TextHighlightRules();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n    \n    this.completer = {\n        getCompletions: function(editor, session, pos, prefix, callback) {\n            if (!session.$worker)\n                return callback();\n            session.$worker.emit(\"complete\", { data: { pos: pos, prefix: prefix } });\n            session.$worker.on(\"complete\", function(e){\n                callback(null, e.data);\n            });\n        }\n    };\n\n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n        var match = line.match(/\\s*(?:then|else|return|[{\\(]|<\\w+>)\\s*$/);\n        if (match)\n            indent += tab;\n        return indent;\n    };\n    \n    this.checkOutdent = function(state, line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return (/^\\s*[\\}\\)]/).test(input);\n    };\n    \n    this.autoOutdent = function(state, doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*[\\}\\)])/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.toggleCommentLines = function(state, doc, startRow, endRow) {\n        var i, line;\n        var outdent = true;\n        var re = /^\\s*\\(:(.*):\\)/;\n\n        for (i=startRow; i<= endRow; i++) {\n            if (!re.test(doc.getLine(i))) {\n                outdent = false;\n                break;\n            }\n        }\n\n        var range = new Range(0, 0, 0, 0);\n        for (i=startRow; i<= endRow; i++) {\n            line = doc.getLine(i);\n            range.start.row  = i;\n            range.end.row    = i;\n            range.end.column = line.length;\n\n            doc.replace(range, outdent ? line.match(re)[1] : \"(:\" + line + \":)\");\n        }\n    };\n    \n    this.createWorker = function(session) {\n        \n      var worker = new WorkerClient([\"ace\"], \"ace/mode/xquery_worker\", \"XQueryWorker\");\n        var that = this;\n\n        worker.attachToDocument(session.getDocument());\n        \n        worker.on(\"ok\", function(e) {\n          session.clearAnnotations();\n        });\n        \n        worker.on(\"markers\", function(e) {\n          session.clearAnnotations();\n          that.addMarkers(e.data, session);\n        });\n \n        worker.on(\"highlight\", function(tokens) {\n          that.$tokenizer.tokens = tokens.data.tokens;\n          that.$tokenizer.lines  = session.getDocument().getAllLines();\n          \n          var rows = Object.keys(that.$tokenizer.tokens);\n          for(var i=0; i < rows.length; i++) {\n            var row = parseInt(rows[i]);\n            delete session.bgTokenizer.lines[row];\n            delete session.bgTokenizer.states[row];\n            session.bgTokenizer.fireUpdateEvent(row, row);\n          }\n        });\n        \n        return worker;\n    };\n\n    this.removeMarkers = function(session) {\n        var markers = session.getMarkers(false);\n        for (var id in markers) {\n            if (markers[id].clazz.indexOf('language_highlight_') === 0) {\n                session.removeMarker(id);\n            }\n        }\n        for (var i = 0; i < session.markerAnchors.length; i++) {\n            session.markerAnchors[i].detach();\n        }\n        session.markerAnchors = [];\n    };\n\n    this.addMarkers = function(annos, mySession) {\n        var _self = this;\n        \n        if (!mySession.markerAnchors) mySession.markerAnchors = [];\n        this.removeMarkers(mySession);\n        mySession.languageAnnos = [];\n        annos.forEach(function(anno) {\n            var anchor = new Anchor(mySession.getDocument(), anno.pos.sl, anno.pos.sc || 0);\n            mySession.markerAnchors.push(anchor);\n            var markerId;\n            var colDiff = anno.pos.ec - anno.pos.sc;\n            var rowDiff = anno.pos.el - anno.pos.sl;\n            var gutterAnno = {\n                guttertext: anno.message,\n                type: anno.level || \"warning\",\n                text: anno.message\n            };\n\n            function updateFloat(single) {\n                if (markerId)\n                    mySession.removeMarker(markerId);\n                gutterAnno.row = anchor.row;\n                if (anno.pos.sc !== undefined && anno.pos.ec !== undefined) {\n                    var range = new Range(anno.pos.sl, anno.pos.sc, anno.pos.el, anno.pos.ec);\n                    markerId = mySession.addMarker(range, \"language_highlight_\" + (anno.type ? anno.type : \"default\"));\n                }\n                if (single) mySession.setAnnotations(mySession.languageAnnos);\n            }\n            updateFloat();\n            anchor.on(\"change\", function() {\n                updateFloat(true);\n            });\n            if (anno.message) mySession.languageAnnos.push(gutterAnno);\n        });\n        mySession.setAnnotations(mySession.languageAnnos);\n    };    \n        \n    this.$id = \"ace/mode/xquery\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/mode-yaml.js",
    "content": "ace.define(\"ace/mode/yaml_highlight_rules\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text_highlight_rules\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n\nvar YamlHighlightRules = function() {\n    this.$rules = {\n        \"start\" : [\n            {\n                token : \"comment\",\n                regex : \"#.*$\"\n            }, {\n                token : \"list.markup\",\n                regex : /^(?:-{3}|\\.{3})\\s*(?=#|$)/     \n            },  {\n                token : \"list.markup\",\n                regex : /^\\s*[\\-?](?:$|\\s)/     \n            }, {\n                token: \"constant\",\n                regex: \"!![\\\\w//]+\"\n            }, {\n                token: \"constant.language\",\n                regex: \"[&\\\\*][a-zA-Z0-9-_]+\"\n            }, {\n                token: [\"meta.tag\", \"keyword\"],\n                regex: /^(\\s*\\w.*?)(\\:(?:\\s+|$))/\n            },{\n                token: [\"meta.tag\", \"keyword\"],\n                regex: /(\\w+?)(\\s*\\:(?:\\s+|$))/\n            }, {\n                token : \"keyword.operator\",\n                regex : \"<<\\\\w*:\\\\w*\"\n            }, {\n                token : \"keyword.operator\",\n                regex : \"-\\\\s*(?=[{])\"\n            }, {\n                token : \"string\", // single line\n                regex : '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]'\n            }, {\n                token : \"string\", // multi line string start\n                regex : '[|>][-+\\\\d\\\\s]*$',\n                next : \"qqstring\"\n            }, {\n                token : \"string\", // single quoted string\n                regex : \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\"\n            }, {\n                token : \"constant.numeric\", // float\n                regex : /(\\b|[+\\-\\.])[\\d_]+(?:(?:\\.[\\d_]*)?(?:[eE][+\\-]?[\\d_]+)?)/\n            }, {\n                token : \"constant.numeric\", // other number\n                regex : /[+\\-]?\\.inf\\b|NaN\\b|0x[\\dA-Fa-f_]+|0b[10_]+/\n            }, {\n                token : \"constant.language.boolean\",\n                regex : \"(?:true|false|TRUE|FALSE|True|False|yes|no)\\\\b\"\n            }, {\n                token : \"paren.lparen\",\n                regex : \"[[({]\"\n            }, {\n                token : \"paren.rparen\",\n                regex : \"[\\\\])}]\"\n            }\n        ],\n        \"qqstring\" : [\n            {\n                token : \"string\",\n                regex : '(?=(?:(?:\\\\\\\\.)|(?:[^:]))*?:)',\n                next : \"start\"\n            }, {\n                token : \"string\",\n                regex : '.+'\n            }\n        ]};\n\n};\n\noop.inherits(YamlHighlightRules, TextHighlightRules);\n\nexports.YamlHighlightRules = YamlHighlightRules;\n});\n\nace.define(\"ace/mode/matching_brace_outdent\",[\"require\",\"exports\",\"module\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar Range = require(\"../range\").Range;\n\nvar MatchingBraceOutdent = function() {};\n\n(function() {\n\n    this.checkOutdent = function(line, input) {\n        if (! /^\\s+$/.test(line))\n            return false;\n\n        return /^\\s*\\}/.test(input);\n    };\n\n    this.autoOutdent = function(doc, row) {\n        var line = doc.getLine(row);\n        var match = line.match(/^(\\s*\\})/);\n\n        if (!match) return 0;\n\n        var column = match[1].length;\n        var openBracePos = doc.findMatchingBracket({row: row, column: column});\n\n        if (!openBracePos || openBracePos.row == row) return 0;\n\n        var indent = this.$getIndent(doc.getLine(openBracePos.row));\n        doc.replace(new Range(row, 0, row, column-1), indent);\n    };\n\n    this.$getIndent = function(line) {\n        return line.match(/^\\s*/)[0];\n    };\n\n}).call(MatchingBraceOutdent.prototype);\n\nexports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\nace.define(\"ace/mode/folding/coffee\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/folding/fold_mode\",\"ace/range\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../../lib/oop\");\nvar BaseFoldMode = require(\"./fold_mode\").FoldMode;\nvar Range = require(\"../../range\").Range;\n\nvar FoldMode = exports.FoldMode = function() {};\noop.inherits(FoldMode, BaseFoldMode);\n\n(function() {\n\n    this.getFoldWidgetRange = function(session, foldStyle, row) {\n        var range = this.indentationBlock(session, row);\n        if (range)\n            return range;\n\n        var re = /\\S/;\n        var line = session.getLine(row);\n        var startLevel = line.search(re);\n        if (startLevel == -1 || line[startLevel] != \"#\")\n            return;\n\n        var startColumn = line.length;\n        var maxRow = session.getLength();\n        var startRow = row;\n        var endRow = row;\n\n        while (++row < maxRow) {\n            line = session.getLine(row);\n            var level = line.search(re);\n\n            if (level == -1)\n                continue;\n\n            if (line[level] != \"#\")\n                break;\n\n            endRow = row;\n        }\n\n        if (endRow > startRow) {\n            var endColumn = session.getLine(endRow).length;\n            return new Range(startRow, startColumn, endRow, endColumn);\n        }\n    };\n    this.getFoldWidget = function(session, foldStyle, row) {\n        var line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        var next = session.getLine(row + 1);\n        var prev = session.getLine(row - 1);\n        var prevIndent = prev.search(/\\S/);\n        var nextIndent = next.search(/\\S/);\n\n        if (indent == -1) {\n            session.foldWidgets[row - 1] = prevIndent!= -1 && prevIndent < nextIndent ? \"start\" : \"\";\n            return \"\";\n        }\n        if (prevIndent == -1) {\n            if (indent == nextIndent && line[indent] == \"#\" && next[indent] == \"#\") {\n                session.foldWidgets[row - 1] = \"\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"start\";\n            }\n        } else if (prevIndent == indent && line[indent] == \"#\" && prev[indent] == \"#\") {\n            if (session.getLine(row - 2).search(/\\S/) == -1) {\n                session.foldWidgets[row - 1] = \"start\";\n                session.foldWidgets[row + 1] = \"\";\n                return \"\";\n            }\n        }\n\n        if (prevIndent!= -1 && prevIndent < indent)\n            session.foldWidgets[row - 1] = \"start\";\n        else\n            session.foldWidgets[row - 1] = \"\";\n\n        if (indent < nextIndent)\n            return \"start\";\n        else\n            return \"\";\n    };\n\n}).call(FoldMode.prototype);\n\n});\n\nace.define(\"ace/mode/yaml\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/mode/text\",\"ace/mode/yaml_highlight_rules\",\"ace/mode/matching_brace_outdent\",\"ace/mode/folding/coffee\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar TextMode = require(\"./text\").Mode;\nvar YamlHighlightRules = require(\"./yaml_highlight_rules\").YamlHighlightRules;\nvar MatchingBraceOutdent = require(\"./matching_brace_outdent\").MatchingBraceOutdent;\nvar FoldMode = require(\"./folding/coffee\").FoldMode;\n\nvar Mode = function() {\n    this.HighlightRules = YamlHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.foldingRules = new FoldMode();\n};\noop.inherits(Mode, TextMode);\n\n(function() {\n\n    this.lineCommentStart = \"#\";\n    \n    this.getNextLineIndent = function(state, line, tab) {\n        var indent = this.$getIndent(line);\n\n        if (state == \"start\") {\n            var match = line.match(/^.*[\\{\\(\\[]\\s*$/);\n            if (match) {\n                indent += tab;\n            }\n        }\n\n        return indent;\n    };\n\n    this.checkOutdent = function(state, line, input) {\n        return this.$outdent.checkOutdent(line, input);\n    };\n\n    this.autoOutdent = function(state, doc, row) {\n        this.$outdent.autoOutdent(doc, row);\n    };\n\n\n    this.$id = \"ace/mode/yaml\";\n}).call(Mode.prototype);\n\nexports.Mode = Mode;\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/abap.js",
    "content": "ace.define(\"ace/snippets/abap\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"abap\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/actionscript.js",
    "content": "ace.define(\"ace/snippets/actionscript\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"snippet main\\n\\\n\tpackage {\\n\\\n\t\timport flash.display.*;\\n\\\n\t\timport flash.Events.*;\\n\\\n\t\\n\\\n\t\tpublic class Main extends Sprite {\\n\\\n\t\t\tpublic function Main (\t) {\\n\\\n\t\t\t\ttrace(\\\"start\\\");\\n\\\n\t\t\t\tstage.scaleMode = StageScaleMode.NO_SCALE;\\n\\\n\t\t\t\tstage.addEventListener(Event.RESIZE, resizeListener);\\n\\\n\t\t\t}\\n\\\n\t\\n\\\n\t\t\tprivate function resizeListener (e:Event):void {\\n\\\n\t\t\t\ttrace(\\\"The application window changed size!\\\");\\n\\\n\t\t\t\ttrace(\\\"New width:  \\\" + stage.stageWidth);\\n\\\n\t\t\t\ttrace(\\\"New height: \\\" + stage.stageHeight);\\n\\\n\t\t\t}\\n\\\n\t\\n\\\n\t\t}\\n\\\n\t\\n\\\n\t}\\n\\\nsnippet class\\n\\\n\t${1:public|internal} class ${2:name} ${3:extends } {\\n\\\n\t\tpublic function $2 (\t) {\\n\\\n\t\t\t(\\\"start\\\");\\n\\\n\t\t}\\n\\\n\t}\\n\\\nsnippet all\\n\\\n\tpackage name {\\n\\\n\\n\\\n\t\t${1:public|internal|final} class ${2:name} ${3:extends } {\\n\\\n\t\t\tprivate|public| static const FOO = \\\"abc\\\";\\n\\\n\t\t\tprivate|public| static var BAR = \\\"abc\\\";\\n\\\n\t\t\tif Cababilities.os == \\\"Linux|MacOS\\\" {\\n\\\n\t\t\t\tFOO = \\\"other\\\";\\n\\\n\t\t\t}\\n\\\n\t\t\tpublic function $2 (\t){\\n\\\n\t\t\t\tsuper2();\\n\\\n\t\t\t\ttrace(\\\"start\\\");\\n\\\n\t\t\t}\\n\\\n\t\t\tpublic function name (a, b...){\\n\\\n\t\t\t\tsuper.name(..);\\n\\\n\t\t\t\tlable:break\\n\\\n\t\t\t}\\n\\\n\t\t}\\n\\\n\t}\\n\\\n\\n\\\n\tfunction A(){\\n\\\n\t}\\n\\\nsnippet switch\\n\\\n\tswitch(${1}){\\n\\\n\t\tcase ${2}:\\n\\\n\t\t\t${3}\\n\\\n\t\tbreak;\\n\\\n\t\tdefault:\\n\\\n\t}\\n\\\nsnippet case\\n\\\n\t\tcase ${1}:\\n\\\n\t\t\t${2}\\n\\\n\t\tbreak;\\n\\\nsnippet package\\n\\\n\tpackage ${1:package}{\\n\\\n\t\t${2}\\n\\\n\t}\\n\\\nsnippet wh\\n\\\n\twhile ${1:cond}{\\n\\\n\t\t${2}\\n\\\n\t}\\n\\\nsnippet do\\n\\\n\tdo {\\n\\\n\t\t${2}\\n\\\n\t} while (${1:cond})\\n\\\nsnippet while\\n\\\n\twhile ${1:cond}{\\n\\\n\t\t${2}\\n\\\n\t}\\n\\\nsnippet for enumerate names\\n\\\n\tfor (${1:var} in ${2:object}){\\n\\\n\t\t${3}\\n\\\n\t}\\n\\\nsnippet for enumerate values\\n\\\n\tfor each (${1:var} in ${2:object}){\\n\\\n\t\t${3}\\n\\\n\t}\\n\\\nsnippet get_set\\n\\\n\tfunction get ${1:name} {\\n\\\n\t\treturn ${2}\\n\\\n\t}\\n\\\n\tfunction set $1 (newValue) {\\n\\\n\t\t${3}\\n\\\n\t}\\n\\\nsnippet interface\\n\\\n\tinterface name {\\n\\\n\t\tfunction method(${1}):${2:returntype};\\n\\\n\t}\\n\\\nsnippet try\\n\\\n\ttry {\\n\\\n\t\t${1}\\n\\\n\t} catch (error:ErrorType) {\\n\\\n\t\t${2}\\n\\\n\t} finally {\\n\\\n\t\t${3}\\n\\\n\t}\\n\\\n# For Loop (same as c.snippet)\\n\\\nsnippet for for (..) {..}\\n\\\n\tfor (${2:i} = 0; $2 < ${1:count}; $2${3:++}) {\\n\\\n\t\t${4:/* code */}\\n\\\n\t}\\n\\\n# Custom For Loop\\n\\\nsnippet forr\\n\\\n\tfor (${1:i} = ${2:0}; ${3:$1 < 10}; $1${4:++}) {\\n\\\n\t\t${5:/* code */}\\n\\\n\t}\\n\\\n# If Condition\\n\\\nsnippet if\\n\\\n\tif (${1:/* condition */}) {\\n\\\n\t\t${2:/* code */}\\n\\\n\t}\\n\\\nsnippet el\\n\\\n\telse {\\n\\\n\t\t${1}\\n\\\n\t}\\n\\\n# Ternary conditional\\n\\\nsnippet t\\n\\\n\t${1:/* condition */} ? ${2:a} : ${3:b}\\n\\\nsnippet fun\\n\\\n\tfunction ${1:function_name}(${2})${3}\\n\\\n\t{\\n\\\n\t\t${4:/* code */}\\n\\\n\t}\\n\\\n# FlxSprite (usefull when using the flixel library)\\n\\\nsnippet FlxSprite\\n\\\n\tpackage\\n\\\n\t{\\n\\\n\t\timport org.flixel.*\\n\\\n\\n\\\n\t\tpublic class ${1:ClassName} extends ${2:FlxSprite}\\n\\\n\t\t{\\n\\\n\t\t\tpublic function $1(${3: X:Number, Y:Number}):void\\n\\\n\t\t\t{\\n\\\n\t\t\t\tsuper(X,Y);\\n\\\n\t\t\t\t${4: //code...}\\n\\\n\t\t\t}\\n\\\n\\n\\\n\t\t\toverride public function update():void\\n\\\n\t\t\t{\\n\\\n\t\t\t\tsuper.update();\\n\\\n\t\t\t\t${5: //code...}\\n\\\n\t\t\t}\\n\\\n\t\t}\\n\\\n\t}\\n\\\n\\n\\\n\";\nexports.scope = \"actionscript\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/ada.js",
    "content": "ace.define(\"ace/snippets/ada\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"ada\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/apache_conf.js",
    "content": "ace.define(\"ace/snippets/apache_conf\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"apache_conf\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/applescript.js",
    "content": "ace.define(\"ace/snippets/applescript\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"applescript\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/asciidoc.js",
    "content": "ace.define(\"ace/snippets/asciidoc\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"asciidoc\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/assembly_x86.js",
    "content": "ace.define(\"ace/snippets/assembly_x86\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"assembly_x86\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/autohotkey.js",
    "content": "ace.define(\"ace/snippets/autohotkey\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"autohotkey\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/batchfile.js",
    "content": "ace.define(\"ace/snippets/batchfile\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"batchfile\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/c9search.js",
    "content": "ace.define(\"ace/snippets/c9search\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"c9search\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/c_cpp.js",
    "content": "ace.define(\"ace/snippets/c_cpp\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"## STL Collections\\n\\\n# std::array\\n\\\nsnippet array\\n\\\n\tstd::array<${1:T}, ${2:N}> ${3};${4}\\n\\\n# std::vector\\n\\\nsnippet vector\\n\\\n\tstd::vector<${1:T}> ${2};${3}\\n\\\n# std::deque\\n\\\nsnippet deque\\n\\\n\tstd::deque<${1:T}> ${2};${3}\\n\\\n# std::forward_list\\n\\\nsnippet flist\\n\\\n\tstd::forward_list<${1:T}> ${2};${3}\\n\\\n# std::list\\n\\\nsnippet list\\n\\\n\tstd::list<${1:T}> ${2};${3}\\n\\\n# std::set\\n\\\nsnippet set\\n\\\n\tstd::set<${1:T}> ${2};${3}\\n\\\n# std::map\\n\\\nsnippet map\\n\\\n\tstd::map<${1:Key}, ${2:T}> ${3};${4}\\n\\\n# std::multiset\\n\\\nsnippet mset\\n\\\n\tstd::multiset<${1:T}> ${2};${3}\\n\\\n# std::multimap\\n\\\nsnippet mmap\\n\\\n\tstd::multimap<${1:Key}, ${2:T}> ${3};${4}\\n\\\n# std::unordered_set\\n\\\nsnippet uset\\n\\\n\tstd::unordered_set<${1:T}> ${2};${3}\\n\\\n# std::unordered_map\\n\\\nsnippet umap\\n\\\n\tstd::unordered_map<${1:Key}, ${2:T}> ${3};${4}\\n\\\n# std::unordered_multiset\\n\\\nsnippet umset\\n\\\n\tstd::unordered_multiset<${1:T}> ${2};${3}\\n\\\n# std::unordered_multimap\\n\\\nsnippet ummap\\n\\\n\tstd::unordered_multimap<${1:Key}, ${2:T}> ${3};${4}\\n\\\n# std::stack\\n\\\nsnippet stack\\n\\\n\tstd::stack<${1:T}> ${2};${3}\\n\\\n# std::queue\\n\\\nsnippet queue\\n\\\n\tstd::queue<${1:T}> ${2};${3}\\n\\\n# std::priority_queue\\n\\\nsnippet pqueue\\n\\\n\tstd::priority_queue<${1:T}> ${2};${3}\\n\\\n##\\n\\\n## Access Modifiers\\n\\\n# private\\n\\\nsnippet pri\\n\\\n\tprivate\\n\\\n# protected\\n\\\nsnippet pro\\n\\\n\tprotected\\n\\\n# public\\n\\\nsnippet pub\\n\\\n\tpublic\\n\\\n# friend\\n\\\nsnippet fr\\n\\\n\tfriend\\n\\\n# mutable\\n\\\nsnippet mu\\n\\\n\tmutable\\n\\\n## \\n\\\n## Class\\n\\\n# class\\n\\\nsnippet cl\\n\\\n\tclass ${1:`Filename('$1', 'name')`} \\n\\\n\t{\\n\\\n\tpublic:\\n\\\n\t\t$1(${2});\\n\\\n\t\t~$1();\\n\\\n\\n\\\n\tprivate:\\n\\\n\t\t${3:/* data */}\\n\\\n\t};\\n\\\n# member function implementation\\n\\\nsnippet mfun\\n\\\n\t${4:void} ${1:`Filename('$1', 'ClassName')`}::${2:memberFunction}(${3}) {\\n\\\n\t\t${5:/* code */}\\n\\\n\t}\\n\\\n# namespace\\n\\\nsnippet ns\\n\\\n\tnamespace ${1:`Filename('', 'my')`} {\\n\\\n\t\t${2}\\n\\\n\t} /* namespace $1 */\\n\\\n##\\n\\\n## Input/Output\\n\\\n# std::cout\\n\\\nsnippet cout\\n\\\n\tstd::cout << ${1} << std::endl;${2}\\n\\\n# std::cin\\n\\\nsnippet cin\\n\\\n\tstd::cin >> ${1};${2}\\n\\\n##\\n\\\n## Iteration\\n\\\n# for i \\n\\\nsnippet fori\\n\\\n\tfor (int ${2:i} = 0; $2 < ${1:count}; $2${3:++}) {\\n\\\n\t\t${4:/* code */}\\n\\\n\t}${5}\\n\\\n\\n\\\n# foreach\\n\\\nsnippet fore\\n\\\n\tfor (${1:auto} ${2:i} : ${3:container}) {\\n\\\n\t\t${4:/* code */}\\n\\\n\t}${5}\\n\\\n# iterator\\n\\\nsnippet iter\\n\\\n\tfor (${1:std::vector}<${2:type}>::${3:const_iterator} ${4:i} = ${5:container}.begin(); $4 != $5.end(); ++$4) {\\n\\\n\t\t${6}\\n\\\n\t}${7}\\n\\\n\\n\\\n# auto iterator\\n\\\nsnippet itera\\n\\\n\tfor (auto ${1:i} = $1.begin(); $1 != $1.end(); ++$1) {\\n\\\n\t\t${2:std::cout << *$1 << std::endl;}\\n\\\n\t}${3}\\n\\\n##\\n\\\n## Lambdas\\n\\\n# lamda (one line)\\n\\\nsnippet ld\\n\\\n\t[${1}](${2}){${3:/* code */}}${4}\\n\\\n# lambda (multi-line)\\n\\\nsnippet lld\\n\\\n\t[${1}](${2}){\\n\\\n\t\t${3:/* code */}\\n\\\n\t}${4}\\n\\\n\";\nexports.scope = \"c_cpp\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/cirru.js",
    "content": "ace.define(\"ace/snippets/cirru\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"cirru\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/clojure.js",
    "content": "ace.define(\"ace/snippets/clojure\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"snippet comm\\n\\\n\t(comment\\n\\\n\t  ${1}\\n\\\n\t  )\\n\\\nsnippet condp\\n\\\n\t(condp ${1:pred} ${2:expr}\\n\\\n\t  ${3})\\n\\\nsnippet def\\n\\\n\t(def ${1})\\n\\\nsnippet defm\\n\\\n\t(defmethod ${1:multifn} \\\"${2:doc-string}\\\" ${3:dispatch-val} [${4:args}]\\n\\\n\t  ${5})\\n\\\nsnippet defmm\\n\\\n\t(defmulti ${1:name} \\\"${2:doc-string}\\\" ${3:dispatch-fn})\\n\\\nsnippet defma\\n\\\n\t(defmacro ${1:name} \\\"${2:doc-string}\\\" ${3:dispatch-fn})\\n\\\nsnippet defn\\n\\\n\t(defn ${1:name} \\\"${2:doc-string}\\\" [${3:arg-list}]\\n\\\n\t  ${4})\\n\\\nsnippet defp\\n\\\n\t(defprotocol ${1:name}\\n\\\n\t  ${2})\\n\\\nsnippet defr\\n\\\n\t(defrecord ${1:name} [${2:fields}]\\n\\\n\t  ${3:protocol}\\n\\\n\t  ${4})\\n\\\nsnippet deft\\n\\\n\t(deftest ${1:name}\\n\\\n\t    (is (= ${2:assertion})))\\n\\\n\t  ${3})\\n\\\nsnippet is\\n\\\n\t(is (= ${1} ${2}))\\n\\\nsnippet defty\\n\\\n\t(deftype ${1:Name} [${2:fields}]\\n\\\n\t  ${3:Protocol}\\n\\\n\t  ${4})\\n\\\nsnippet doseq\\n\\\n\t(doseq [${1:elem} ${2:coll}]\\n\\\n\t  ${3})\\n\\\nsnippet fn\\n\\\n\t(fn [${1:arg-list}] ${2})\\n\\\nsnippet if\\n\\\n\t(if ${1:test-expr}\\n\\\n\t  ${2:then-expr}\\n\\\n\t  ${3:else-expr})\\n\\\nsnippet if-let \\n\\\n\t(if-let [${1:result} ${2:test-expr}]\\n\\\n\t\t(${3:then-expr} $1)\\n\\\n\t\t(${4:else-expr}))\\n\\\nsnippet imp\\n\\\n\t(:import [${1:package}])\\n\\\n\t& {:keys [${1:keys}] :or {${2:defaults}}}\\n\\\nsnippet let\\n\\\n\t(let [${1:name} ${2:expr}]\\n\\\n\t\t${3})\\n\\\nsnippet letfn\\n\\\n\t(letfn [(${1:name) [${2:args}]\\n\\\n\t          ${3})])\\n\\\nsnippet map\\n\\\n\t(map ${1:func} ${2:coll})\\n\\\nsnippet mapl\\n\\\n\t(map #(${1:lambda}) ${2:coll})\\n\\\nsnippet met\\n\\\n\t(${1:name} [${2:this} ${3:args}]\\n\\\n\t  ${4})\\n\\\nsnippet ns\\n\\\n\t(ns ${1:name}\\n\\\n\t  ${2})\\n\\\nsnippet dotimes\\n\\\n\t(dotimes [_ 10]\\n\\\n\t  (time\\n\\\n\t    (dotimes [_ ${1:times}]\\n\\\n\t      ${2})))\\n\\\nsnippet pmethod\\n\\\n\t(${1:name} [${2:this} ${3:args}])\\n\\\nsnippet refer\\n\\\n\t(:refer-clojure :exclude [${1}])\\n\\\nsnippet require\\n\\\n\t(:require [${1:namespace} :as [${2}]])\\n\\\nsnippet use\\n\\\n\t(:use [${1:namespace} :only [${2}]])\\n\\\nsnippet print\\n\\\n\t(println ${1})\\n\\\nsnippet reduce\\n\\\n\t(reduce ${1:(fn [p n] ${3})} ${2})\\n\\\nsnippet when\\n\\\n\t(when ${1:test} ${2:body})\\n\\\nsnippet when-let\\n\\\n\t(when-let [${1:result} ${2:test}]\\n\\\n\t\t${3:body})\\n\\\n\";\nexports.scope = \"clojure\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/cobol.js",
    "content": "ace.define(\"ace/snippets/cobol\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"cobol\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/coffee.js",
    "content": "ace.define(\"ace/snippets/coffee\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"# Closure loop\\n\\\nsnippet forindo\\n\\\n\tfor ${1:name} in ${2:array}\\n\\\n\t\tdo ($1) ->\\n\\\n\t\t\t${3:// body}\\n\\\n# Array comprehension\\n\\\nsnippet fora\\n\\\n\tfor ${1:name} in ${2:array}\\n\\\n\t\t${3:// body...}\\n\\\n# Object comprehension\\n\\\nsnippet foro\\n\\\n\tfor ${1:key}, ${2:value} of ${3:object}\\n\\\n\t\t${4:// body...}\\n\\\n# Range comprehension (inclusive)\\n\\\nsnippet forr\\n\\\n\tfor ${1:name} in [${2:start}..${3:finish}]\\n\\\n\t\t${4:// body...}\\n\\\nsnippet forrb\\n\\\n\tfor ${1:name} in [${2:start}..${3:finish}] by ${4:step}\\n\\\n\t\t${5:// body...}\\n\\\n# Range comprehension (exclusive)\\n\\\nsnippet forrex\\n\\\n\tfor ${1:name} in [${2:start}...${3:finish}]\\n\\\n\t\t${4:// body...}\\n\\\nsnippet forrexb\\n\\\n\tfor ${1:name} in [${2:start}...${3:finish}] by ${4:step}\\n\\\n\t\t${5:// body...}\\n\\\n# Function\\n\\\nsnippet fun\\n\\\n\t(${1:args}) ->\\n\\\n\t\t${2:// body...}\\n\\\n# Function (bound)\\n\\\nsnippet bfun\\n\\\n\t(${1:args}) =>\\n\\\n\t\t${2:// body...}\\n\\\n# Class\\n\\\nsnippet cla class ..\\n\\\n\tclass ${1:`substitute(Filename(), '\\\\(_\\\\|^\\\\)\\\\(.\\\\)', '\\\\u\\\\2', 'g')`}\\n\\\n\t\t${2}\\n\\\nsnippet cla class .. constructor: ..\\n\\\n\tclass ${1:`substitute(Filename(), '\\\\(_\\\\|^\\\\)\\\\(.\\\\)', '\\\\u\\\\2', 'g')`}\\n\\\n\t\tconstructor: (${2:args}) ->\\n\\\n\t\t\t${3}\\n\\\n\\n\\\n\t\t${4}\\n\\\nsnippet cla class .. extends ..\\n\\\n\tclass ${1:`substitute(Filename(), '\\\\(_\\\\|^\\\\)\\\\(.\\\\)', '\\\\u\\\\2', 'g')`} extends ${2:ParentClass}\\n\\\n\t\t${3}\\n\\\nsnippet cla class .. extends .. constructor: ..\\n\\\n\tclass ${1:`substitute(Filename(), '\\\\(_\\\\|^\\\\)\\\\(.\\\\)', '\\\\u\\\\2', 'g')`} extends ${2:ParentClass}\\n\\\n\t\tconstructor: (${3:args}) ->\\n\\\n\t\t\t${4}\\n\\\n\\n\\\n\t\t${5}\\n\\\n# If\\n\\\nsnippet if\\n\\\n\tif ${1:condition}\\n\\\n\t\t${2:// body...}\\n\\\n# If __ Else\\n\\\nsnippet ife\\n\\\n\tif ${1:condition}\\n\\\n\t\t${2:// body...}\\n\\\n\telse\\n\\\n\t\t${3:// body...}\\n\\\n# Else if\\n\\\nsnippet elif\\n\\\n\telse if ${1:condition}\\n\\\n\t\t${2:// body...}\\n\\\n# Ternary If\\n\\\nsnippet ifte\\n\\\n\tif ${1:condition} then ${2:value} else ${3:other}\\n\\\n# Unless\\n\\\nsnippet unl\\n\\\n\t${1:action} unless ${2:condition}\\n\\\n# Switch\\n\\\nsnippet swi\\n\\\n\tswitch ${1:object}\\n\\\n\t\twhen ${2:value}\\n\\\n\t\t\t${3:// body...}\\n\\\n\\n\\\n# Log\\n\\\nsnippet log\\n\\\n\tconsole.log ${1}\\n\\\n# Try __ Catch\\n\\\nsnippet try\\n\\\n\ttry\\n\\\n\t\t${1}\\n\\\n\tcatch ${2:error}\\n\\\n\t\t${3}\\n\\\n# Require\\n\\\nsnippet req\\n\\\n\t${2:$1} = require '${1:sys}'${3}\\n\\\n# Export\\n\\\nsnippet exp\\n\\\n\t${1:root} = exports ? this\\n\\\n\";\nexports.scope = \"coffee\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/coldfusion.js",
    "content": "ace.define(\"ace/snippets/coldfusion\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"coldfusion\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/csharp.js",
    "content": "ace.define(\"ace/snippets/csharp\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"csharp\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/css.js",
    "content": "ace.define(\"ace/snippets/css\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"snippet .\\n\\\n\t${1} {\\n\\\n\t\t${2}\\n\\\n\t}\\n\\\nsnippet !\\n\\\n\t !important\\n\\\nsnippet bdi:m+\\n\\\n\t-moz-border-image: url(${1}) ${2:0} ${3:0} ${4:0} ${5:0} ${6:stretch} ${7:stretch};\\n\\\nsnippet bdi:m\\n\\\n\t-moz-border-image: ${1};\\n\\\nsnippet bdrz:m\\n\\\n\t-moz-border-radius: ${1};\\n\\\nsnippet bxsh:m+\\n\\\n\t-moz-box-shadow: ${1:0} ${2:0} ${3:0} #${4:000};\\n\\\nsnippet bxsh:m\\n\\\n\t-moz-box-shadow: ${1};\\n\\\nsnippet bdi:w+\\n\\\n\t-webkit-border-image: url(${1}) ${2:0} ${3:0} ${4:0} ${5:0} ${6:stretch} ${7:stretch};\\n\\\nsnippet bdi:w\\n\\\n\t-webkit-border-image: ${1};\\n\\\nsnippet bdrz:w\\n\\\n\t-webkit-border-radius: ${1};\\n\\\nsnippet bxsh:w+\\n\\\n\t-webkit-box-shadow: ${1:0} ${2:0} ${3:0} #${4:000};\\n\\\nsnippet bxsh:w\\n\\\n\t-webkit-box-shadow: ${1};\\n\\\nsnippet @f\\n\\\n\t@font-face {\\n\\\n\t\tfont-family: ${1};\\n\\\n\t\tsrc: url(${2});\\n\\\n\t}\\n\\\nsnippet @i\\n\\\n\t@import url(${1});\\n\\\nsnippet @m\\n\\\n\t@media ${1:print} {\\n\\\n\t\t${2}\\n\\\n\t}\\n\\\nsnippet bg+\\n\\\n\tbackground: #${1:FFF} url(${2}) ${3:0} ${4:0} ${5:no-repeat};\\n\\\nsnippet bga\\n\\\n\tbackground-attachment: ${1};\\n\\\nsnippet bga:f\\n\\\n\tbackground-attachment: fixed;\\n\\\nsnippet bga:s\\n\\\n\tbackground-attachment: scroll;\\n\\\nsnippet bgbk\\n\\\n\tbackground-break: ${1};\\n\\\nsnippet bgbk:bb\\n\\\n\tbackground-break: bounding-box;\\n\\\nsnippet bgbk:c\\n\\\n\tbackground-break: continuous;\\n\\\nsnippet bgbk:eb\\n\\\n\tbackground-break: each-box;\\n\\\nsnippet bgcp\\n\\\n\tbackground-clip: ${1};\\n\\\nsnippet bgcp:bb\\n\\\n\tbackground-clip: border-box;\\n\\\nsnippet bgcp:cb\\n\\\n\tbackground-clip: content-box;\\n\\\nsnippet bgcp:nc\\n\\\n\tbackground-clip: no-clip;\\n\\\nsnippet bgcp:pb\\n\\\n\tbackground-clip: padding-box;\\n\\\nsnippet bgc\\n\\\n\tbackground-color: #${1:FFF};\\n\\\nsnippet bgc:t\\n\\\n\tbackground-color: transparent;\\n\\\nsnippet bgi\\n\\\n\tbackground-image: url(${1});\\n\\\nsnippet bgi:n\\n\\\n\tbackground-image: none;\\n\\\nsnippet bgo\\n\\\n\tbackground-origin: ${1};\\n\\\nsnippet bgo:bb\\n\\\n\tbackground-origin: border-box;\\n\\\nsnippet bgo:cb\\n\\\n\tbackground-origin: content-box;\\n\\\nsnippet bgo:pb\\n\\\n\tbackground-origin: padding-box;\\n\\\nsnippet bgpx\\n\\\n\tbackground-position-x: ${1};\\n\\\nsnippet bgpy\\n\\\n\tbackground-position-y: ${1};\\n\\\nsnippet bgp\\n\\\n\tbackground-position: ${1:0} ${2:0};\\n\\\nsnippet bgr\\n\\\n\tbackground-repeat: ${1};\\n\\\nsnippet bgr:n\\n\\\n\tbackground-repeat: no-repeat;\\n\\\nsnippet bgr:x\\n\\\n\tbackground-repeat: repeat-x;\\n\\\nsnippet bgr:y\\n\\\n\tbackground-repeat: repeat-y;\\n\\\nsnippet bgr:r\\n\\\n\tbackground-repeat: repeat;\\n\\\nsnippet bgz\\n\\\n\tbackground-size: ${1};\\n\\\nsnippet bgz:a\\n\\\n\tbackground-size: auto;\\n\\\nsnippet bgz:ct\\n\\\n\tbackground-size: contain;\\n\\\nsnippet bgz:cv\\n\\\n\tbackground-size: cover;\\n\\\nsnippet bg\\n\\\n\tbackground: ${1};\\n\\\nsnippet bg:ie\\n\\\n\tfilter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='${1}',sizingMethod='${2:crop}');\\n\\\nsnippet bg:n\\n\\\n\tbackground: none;\\n\\\nsnippet bd+\\n\\\n\tborder: ${1:1px} ${2:solid} #${3:000};\\n\\\nsnippet bdb+\\n\\\n\tborder-bottom: ${1:1px} ${2:solid} #${3:000};\\n\\\nsnippet bdbc\\n\\\n\tborder-bottom-color: #${1:000};\\n\\\nsnippet bdbi\\n\\\n\tborder-bottom-image: url(${1});\\n\\\nsnippet bdbi:n\\n\\\n\tborder-bottom-image: none;\\n\\\nsnippet bdbli\\n\\\n\tborder-bottom-left-image: url(${1});\\n\\\nsnippet bdbli:c\\n\\\n\tborder-bottom-left-image: continue;\\n\\\nsnippet bdbli:n\\n\\\n\tborder-bottom-left-image: none;\\n\\\nsnippet bdblrz\\n\\\n\tborder-bottom-left-radius: ${1};\\n\\\nsnippet bdbri\\n\\\n\tborder-bottom-right-image: url(${1});\\n\\\nsnippet bdbri:c\\n\\\n\tborder-bottom-right-image: continue;\\n\\\nsnippet bdbri:n\\n\\\n\tborder-bottom-right-image: none;\\n\\\nsnippet bdbrrz\\n\\\n\tborder-bottom-right-radius: ${1};\\n\\\nsnippet bdbs\\n\\\n\tborder-bottom-style: ${1};\\n\\\nsnippet bdbs:n\\n\\\n\tborder-bottom-style: none;\\n\\\nsnippet bdbw\\n\\\n\tborder-bottom-width: ${1};\\n\\\nsnippet bdb\\n\\\n\tborder-bottom: ${1};\\n\\\nsnippet bdb:n\\n\\\n\tborder-bottom: none;\\n\\\nsnippet bdbk\\n\\\n\tborder-break: ${1};\\n\\\nsnippet bdbk:c\\n\\\n\tborder-break: close;\\n\\\nsnippet bdcl\\n\\\n\tborder-collapse: ${1};\\n\\\nsnippet bdcl:c\\n\\\n\tborder-collapse: collapse;\\n\\\nsnippet bdcl:s\\n\\\n\tborder-collapse: separate;\\n\\\nsnippet bdc\\n\\\n\tborder-color: #${1:000};\\n\\\nsnippet bdci\\n\\\n\tborder-corner-image: url(${1});\\n\\\nsnippet bdci:c\\n\\\n\tborder-corner-image: continue;\\n\\\nsnippet bdci:n\\n\\\n\tborder-corner-image: none;\\n\\\nsnippet bdf\\n\\\n\tborder-fit: ${1};\\n\\\nsnippet bdf:c\\n\\\n\tborder-fit: clip;\\n\\\nsnippet bdf:of\\n\\\n\tborder-fit: overwrite;\\n\\\nsnippet bdf:ow\\n\\\n\tborder-fit: overwrite;\\n\\\nsnippet bdf:r\\n\\\n\tborder-fit: repeat;\\n\\\nsnippet bdf:sc\\n\\\n\tborder-fit: scale;\\n\\\nsnippet bdf:sp\\n\\\n\tborder-fit: space;\\n\\\nsnippet bdf:st\\n\\\n\tborder-fit: stretch;\\n\\\nsnippet bdi\\n\\\n\tborder-image: url(${1}) ${2:0} ${3:0} ${4:0} ${5:0} ${6:stretch} ${7:stretch};\\n\\\nsnippet bdi:n\\n\\\n\tborder-image: none;\\n\\\nsnippet bdl+\\n\\\n\tborder-left: ${1:1px} ${2:solid} #${3:000};\\n\\\nsnippet bdlc\\n\\\n\tborder-left-color: #${1:000};\\n\\\nsnippet bdli\\n\\\n\tborder-left-image: url(${1});\\n\\\nsnippet bdli:n\\n\\\n\tborder-left-image: none;\\n\\\nsnippet bdls\\n\\\n\tborder-left-style: ${1};\\n\\\nsnippet bdls:n\\n\\\n\tborder-left-style: none;\\n\\\nsnippet bdlw\\n\\\n\tborder-left-width: ${1};\\n\\\nsnippet bdl\\n\\\n\tborder-left: ${1};\\n\\\nsnippet bdl:n\\n\\\n\tborder-left: none;\\n\\\nsnippet bdlt\\n\\\n\tborder-length: ${1};\\n\\\nsnippet bdlt:a\\n\\\n\tborder-length: auto;\\n\\\nsnippet bdrz\\n\\\n\tborder-radius: ${1};\\n\\\nsnippet bdr+\\n\\\n\tborder-right: ${1:1px} ${2:solid} #${3:000};\\n\\\nsnippet bdrc\\n\\\n\tborder-right-color: #${1:000};\\n\\\nsnippet bdri\\n\\\n\tborder-right-image: url(${1});\\n\\\nsnippet bdri:n\\n\\\n\tborder-right-image: none;\\n\\\nsnippet bdrs\\n\\\n\tborder-right-style: ${1};\\n\\\nsnippet bdrs:n\\n\\\n\tborder-right-style: none;\\n\\\nsnippet bdrw\\n\\\n\tborder-right-width: ${1};\\n\\\nsnippet bdr\\n\\\n\tborder-right: ${1};\\n\\\nsnippet bdr:n\\n\\\n\tborder-right: none;\\n\\\nsnippet bdsp\\n\\\n\tborder-spacing: ${1};\\n\\\nsnippet bds\\n\\\n\tborder-style: ${1};\\n\\\nsnippet bds:ds\\n\\\n\tborder-style: dashed;\\n\\\nsnippet bds:dtds\\n\\\n\tborder-style: dot-dash;\\n\\\nsnippet bds:dtdtds\\n\\\n\tborder-style: dot-dot-dash;\\n\\\nsnippet bds:dt\\n\\\n\tborder-style: dotted;\\n\\\nsnippet bds:db\\n\\\n\tborder-style: double;\\n\\\nsnippet bds:g\\n\\\n\tborder-style: groove;\\n\\\nsnippet bds:h\\n\\\n\tborder-style: hidden;\\n\\\nsnippet bds:i\\n\\\n\tborder-style: inset;\\n\\\nsnippet bds:n\\n\\\n\tborder-style: none;\\n\\\nsnippet bds:o\\n\\\n\tborder-style: outset;\\n\\\nsnippet bds:r\\n\\\n\tborder-style: ridge;\\n\\\nsnippet bds:s\\n\\\n\tborder-style: solid;\\n\\\nsnippet bds:w\\n\\\n\tborder-style: wave;\\n\\\nsnippet bdt+\\n\\\n\tborder-top: ${1:1px} ${2:solid} #${3:000};\\n\\\nsnippet bdtc\\n\\\n\tborder-top-color: #${1:000};\\n\\\nsnippet bdti\\n\\\n\tborder-top-image: url(${1});\\n\\\nsnippet bdti:n\\n\\\n\tborder-top-image: none;\\n\\\nsnippet bdtli\\n\\\n\tborder-top-left-image: url(${1});\\n\\\nsnippet bdtli:c\\n\\\n\tborder-corner-image: continue;\\n\\\nsnippet bdtli:n\\n\\\n\tborder-corner-image: none;\\n\\\nsnippet bdtlrz\\n\\\n\tborder-top-left-radius: ${1};\\n\\\nsnippet bdtri\\n\\\n\tborder-top-right-image: url(${1});\\n\\\nsnippet bdtri:c\\n\\\n\tborder-top-right-image: continue;\\n\\\nsnippet bdtri:n\\n\\\n\tborder-top-right-image: none;\\n\\\nsnippet bdtrrz\\n\\\n\tborder-top-right-radius: ${1};\\n\\\nsnippet bdts\\n\\\n\tborder-top-style: ${1};\\n\\\nsnippet bdts:n\\n\\\n\tborder-top-style: none;\\n\\\nsnippet bdtw\\n\\\n\tborder-top-width: ${1};\\n\\\nsnippet bdt\\n\\\n\tborder-top: ${1};\\n\\\nsnippet bdt:n\\n\\\n\tborder-top: none;\\n\\\nsnippet bdw\\n\\\n\tborder-width: ${1};\\n\\\nsnippet bd\\n\\\n\tborder: ${1};\\n\\\nsnippet bd:n\\n\\\n\tborder: none;\\n\\\nsnippet b\\n\\\n\tbottom: ${1};\\n\\\nsnippet b:a\\n\\\n\tbottom: auto;\\n\\\nsnippet bxsh+\\n\\\n\tbox-shadow: ${1:0} ${2:0} ${3:0} #${4:000};\\n\\\nsnippet bxsh\\n\\\n\tbox-shadow: ${1};\\n\\\nsnippet bxsh:n\\n\\\n\tbox-shadow: none;\\n\\\nsnippet bxz\\n\\\n\tbox-sizing: ${1};\\n\\\nsnippet bxz:bb\\n\\\n\tbox-sizing: border-box;\\n\\\nsnippet bxz:cb\\n\\\n\tbox-sizing: content-box;\\n\\\nsnippet cps\\n\\\n\tcaption-side: ${1};\\n\\\nsnippet cps:b\\n\\\n\tcaption-side: bottom;\\n\\\nsnippet cps:t\\n\\\n\tcaption-side: top;\\n\\\nsnippet cl\\n\\\n\tclear: ${1};\\n\\\nsnippet cl:b\\n\\\n\tclear: both;\\n\\\nsnippet cl:l\\n\\\n\tclear: left;\\n\\\nsnippet cl:n\\n\\\n\tclear: none;\\n\\\nsnippet cl:r\\n\\\n\tclear: right;\\n\\\nsnippet cp\\n\\\n\tclip: ${1};\\n\\\nsnippet cp:a\\n\\\n\tclip: auto;\\n\\\nsnippet cp:r\\n\\\n\tclip: rect(${1:0} ${2:0} ${3:0} ${4:0});\\n\\\nsnippet c\\n\\\n\tcolor: #${1:000};\\n\\\nsnippet ct\\n\\\n\tcontent: ${1};\\n\\\nsnippet ct:a\\n\\\n\tcontent: attr(${1});\\n\\\nsnippet ct:cq\\n\\\n\tcontent: close-quote;\\n\\\nsnippet ct:c\\n\\\n\tcontent: counter(${1});\\n\\\nsnippet ct:cs\\n\\\n\tcontent: counters(${1});\\n\\\nsnippet ct:ncq\\n\\\n\tcontent: no-close-quote;\\n\\\nsnippet ct:noq\\n\\\n\tcontent: no-open-quote;\\n\\\nsnippet ct:n\\n\\\n\tcontent: normal;\\n\\\nsnippet ct:oq\\n\\\n\tcontent: open-quote;\\n\\\nsnippet coi\\n\\\n\tcounter-increment: ${1};\\n\\\nsnippet cor\\n\\\n\tcounter-reset: ${1};\\n\\\nsnippet cur\\n\\\n\tcursor: ${1};\\n\\\nsnippet cur:a\\n\\\n\tcursor: auto;\\n\\\nsnippet cur:c\\n\\\n\tcursor: crosshair;\\n\\\nsnippet cur:d\\n\\\n\tcursor: default;\\n\\\nsnippet cur:ha\\n\\\n\tcursor: hand;\\n\\\nsnippet cur:he\\n\\\n\tcursor: help;\\n\\\nsnippet cur:m\\n\\\n\tcursor: move;\\n\\\nsnippet cur:p\\n\\\n\tcursor: pointer;\\n\\\nsnippet cur:t\\n\\\n\tcursor: text;\\n\\\nsnippet d\\n\\\n\tdisplay: ${1};\\n\\\nsnippet d:mib\\n\\\n\tdisplay: -moz-inline-box;\\n\\\nsnippet d:mis\\n\\\n\tdisplay: -moz-inline-stack;\\n\\\nsnippet d:b\\n\\\n\tdisplay: block;\\n\\\nsnippet d:cp\\n\\\n\tdisplay: compact;\\n\\\nsnippet d:ib\\n\\\n\tdisplay: inline-block;\\n\\\nsnippet d:itb\\n\\\n\tdisplay: inline-table;\\n\\\nsnippet d:i\\n\\\n\tdisplay: inline;\\n\\\nsnippet d:li\\n\\\n\tdisplay: list-item;\\n\\\nsnippet d:n\\n\\\n\tdisplay: none;\\n\\\nsnippet d:ri\\n\\\n\tdisplay: run-in;\\n\\\nsnippet d:tbcp\\n\\\n\tdisplay: table-caption;\\n\\\nsnippet d:tbc\\n\\\n\tdisplay: table-cell;\\n\\\nsnippet d:tbclg\\n\\\n\tdisplay: table-column-group;\\n\\\nsnippet d:tbcl\\n\\\n\tdisplay: table-column;\\n\\\nsnippet d:tbfg\\n\\\n\tdisplay: table-footer-group;\\n\\\nsnippet d:tbhg\\n\\\n\tdisplay: table-header-group;\\n\\\nsnippet d:tbrg\\n\\\n\tdisplay: table-row-group;\\n\\\nsnippet d:tbr\\n\\\n\tdisplay: table-row;\\n\\\nsnippet d:tb\\n\\\n\tdisplay: table;\\n\\\nsnippet ec\\n\\\n\tempty-cells: ${1};\\n\\\nsnippet ec:h\\n\\\n\tempty-cells: hide;\\n\\\nsnippet ec:s\\n\\\n\tempty-cells: show;\\n\\\nsnippet exp\\n\\\n\texpression()\\n\\\nsnippet fl\\n\\\n\tfloat: ${1};\\n\\\nsnippet fl:l\\n\\\n\tfloat: left;\\n\\\nsnippet fl:n\\n\\\n\tfloat: none;\\n\\\nsnippet fl:r\\n\\\n\tfloat: right;\\n\\\nsnippet f+\\n\\\n\tfont: ${1:1em} ${2:Arial},${3:sans-serif};\\n\\\nsnippet fef\\n\\\n\tfont-effect: ${1};\\n\\\nsnippet fef:eb\\n\\\n\tfont-effect: emboss;\\n\\\nsnippet fef:eg\\n\\\n\tfont-effect: engrave;\\n\\\nsnippet fef:n\\n\\\n\tfont-effect: none;\\n\\\nsnippet fef:o\\n\\\n\tfont-effect: outline;\\n\\\nsnippet femp\\n\\\n\tfont-emphasize-position: ${1};\\n\\\nsnippet femp:a\\n\\\n\tfont-emphasize-position: after;\\n\\\nsnippet femp:b\\n\\\n\tfont-emphasize-position: before;\\n\\\nsnippet fems\\n\\\n\tfont-emphasize-style: ${1};\\n\\\nsnippet fems:ac\\n\\\n\tfont-emphasize-style: accent;\\n\\\nsnippet fems:c\\n\\\n\tfont-emphasize-style: circle;\\n\\\nsnippet fems:ds\\n\\\n\tfont-emphasize-style: disc;\\n\\\nsnippet fems:dt\\n\\\n\tfont-emphasize-style: dot;\\n\\\nsnippet fems:n\\n\\\n\tfont-emphasize-style: none;\\n\\\nsnippet fem\\n\\\n\tfont-emphasize: ${1};\\n\\\nsnippet ff\\n\\\n\tfont-family: ${1};\\n\\\nsnippet ff:c\\n\\\n\tfont-family: ${1:'Monotype Corsiva','Comic Sans MS'},cursive;\\n\\\nsnippet ff:f\\n\\\n\tfont-family: ${1:Capitals,Impact},fantasy;\\n\\\nsnippet ff:m\\n\\\n\tfont-family: ${1:Monaco,'Courier New'},monospace;\\n\\\nsnippet ff:ss\\n\\\n\tfont-family: ${1:Helvetica,Arial},sans-serif;\\n\\\nsnippet ff:s\\n\\\n\tfont-family: ${1:Georgia,'Times New Roman'},serif;\\n\\\nsnippet fza\\n\\\n\tfont-size-adjust: ${1};\\n\\\nsnippet fza:n\\n\\\n\tfont-size-adjust: none;\\n\\\nsnippet fz\\n\\\n\tfont-size: ${1};\\n\\\nsnippet fsm\\n\\\n\tfont-smooth: ${1};\\n\\\nsnippet fsm:aw\\n\\\n\tfont-smooth: always;\\n\\\nsnippet fsm:a\\n\\\n\tfont-smooth: auto;\\n\\\nsnippet fsm:n\\n\\\n\tfont-smooth: never;\\n\\\nsnippet fst\\n\\\n\tfont-stretch: ${1};\\n\\\nsnippet fst:c\\n\\\n\tfont-stretch: condensed;\\n\\\nsnippet fst:e\\n\\\n\tfont-stretch: expanded;\\n\\\nsnippet fst:ec\\n\\\n\tfont-stretch: extra-condensed;\\n\\\nsnippet fst:ee\\n\\\n\tfont-stretch: extra-expanded;\\n\\\nsnippet fst:n\\n\\\n\tfont-stretch: normal;\\n\\\nsnippet fst:sc\\n\\\n\tfont-stretch: semi-condensed;\\n\\\nsnippet fst:se\\n\\\n\tfont-stretch: semi-expanded;\\n\\\nsnippet fst:uc\\n\\\n\tfont-stretch: ultra-condensed;\\n\\\nsnippet fst:ue\\n\\\n\tfont-stretch: ultra-expanded;\\n\\\nsnippet fs\\n\\\n\tfont-style: ${1};\\n\\\nsnippet fs:i\\n\\\n\tfont-style: italic;\\n\\\nsnippet fs:n\\n\\\n\tfont-style: normal;\\n\\\nsnippet fs:o\\n\\\n\tfont-style: oblique;\\n\\\nsnippet fv\\n\\\n\tfont-variant: ${1};\\n\\\nsnippet fv:n\\n\\\n\tfont-variant: normal;\\n\\\nsnippet fv:sc\\n\\\n\tfont-variant: small-caps;\\n\\\nsnippet fw\\n\\\n\tfont-weight: ${1};\\n\\\nsnippet fw:b\\n\\\n\tfont-weight: bold;\\n\\\nsnippet fw:br\\n\\\n\tfont-weight: bolder;\\n\\\nsnippet fw:lr\\n\\\n\tfont-weight: lighter;\\n\\\nsnippet fw:n\\n\\\n\tfont-weight: normal;\\n\\\nsnippet f\\n\\\n\tfont: ${1};\\n\\\nsnippet h\\n\\\n\theight: ${1};\\n\\\nsnippet h:a\\n\\\n\theight: auto;\\n\\\nsnippet l\\n\\\n\tleft: ${1};\\n\\\nsnippet l:a\\n\\\n\tleft: auto;\\n\\\nsnippet lts\\n\\\n\tletter-spacing: ${1};\\n\\\nsnippet lh\\n\\\n\tline-height: ${1};\\n\\\nsnippet lisi\\n\\\n\tlist-style-image: url(${1});\\n\\\nsnippet lisi:n\\n\\\n\tlist-style-image: none;\\n\\\nsnippet lisp\\n\\\n\tlist-style-position: ${1};\\n\\\nsnippet lisp:i\\n\\\n\tlist-style-position: inside;\\n\\\nsnippet lisp:o\\n\\\n\tlist-style-position: outside;\\n\\\nsnippet list\\n\\\n\tlist-style-type: ${1};\\n\\\nsnippet list:c\\n\\\n\tlist-style-type: circle;\\n\\\nsnippet list:dclz\\n\\\n\tlist-style-type: decimal-leading-zero;\\n\\\nsnippet list:dc\\n\\\n\tlist-style-type: decimal;\\n\\\nsnippet list:d\\n\\\n\tlist-style-type: disc;\\n\\\nsnippet list:lr\\n\\\n\tlist-style-type: lower-roman;\\n\\\nsnippet list:n\\n\\\n\tlist-style-type: none;\\n\\\nsnippet list:s\\n\\\n\tlist-style-type: square;\\n\\\nsnippet list:ur\\n\\\n\tlist-style-type: upper-roman;\\n\\\nsnippet lis\\n\\\n\tlist-style: ${1};\\n\\\nsnippet lis:n\\n\\\n\tlist-style: none;\\n\\\nsnippet mb\\n\\\n\tmargin-bottom: ${1};\\n\\\nsnippet mb:a\\n\\\n\tmargin-bottom: auto;\\n\\\nsnippet ml\\n\\\n\tmargin-left: ${1};\\n\\\nsnippet ml:a\\n\\\n\tmargin-left: auto;\\n\\\nsnippet mr\\n\\\n\tmargin-right: ${1};\\n\\\nsnippet mr:a\\n\\\n\tmargin-right: auto;\\n\\\nsnippet mt\\n\\\n\tmargin-top: ${1};\\n\\\nsnippet mt:a\\n\\\n\tmargin-top: auto;\\n\\\nsnippet m\\n\\\n\tmargin: ${1};\\n\\\nsnippet m:4\\n\\\n\tmargin: ${1:0} ${2:0} ${3:0} ${4:0};\\n\\\nsnippet m:3\\n\\\n\tmargin: ${1:0} ${2:0} ${3:0};\\n\\\nsnippet m:2\\n\\\n\tmargin: ${1:0} ${2:0};\\n\\\nsnippet m:0\\n\\\n\tmargin: 0;\\n\\\nsnippet m:a\\n\\\n\tmargin: auto;\\n\\\nsnippet mah\\n\\\n\tmax-height: ${1};\\n\\\nsnippet mah:n\\n\\\n\tmax-height: none;\\n\\\nsnippet maw\\n\\\n\tmax-width: ${1};\\n\\\nsnippet maw:n\\n\\\n\tmax-width: none;\\n\\\nsnippet mih\\n\\\n\tmin-height: ${1};\\n\\\nsnippet miw\\n\\\n\tmin-width: ${1};\\n\\\nsnippet op\\n\\\n\topacity: ${1};\\n\\\nsnippet op:ie\\n\\\n\tfilter: progid:DXImageTransform.Microsoft.Alpha(Opacity=${1:100});\\n\\\nsnippet op:ms\\n\\\n\t-ms-filter: 'progid:DXImageTransform.Microsoft.Alpha(Opacity=${1:100})';\\n\\\nsnippet orp\\n\\\n\torphans: ${1};\\n\\\nsnippet o+\\n\\\n\toutline: ${1:1px} ${2:solid} #${3:000};\\n\\\nsnippet oc\\n\\\n\toutline-color: ${1:#000};\\n\\\nsnippet oc:i\\n\\\n\toutline-color: invert;\\n\\\nsnippet oo\\n\\\n\toutline-offset: ${1};\\n\\\nsnippet os\\n\\\n\toutline-style: ${1};\\n\\\nsnippet ow\\n\\\n\toutline-width: ${1};\\n\\\nsnippet o\\n\\\n\toutline: ${1};\\n\\\nsnippet o:n\\n\\\n\toutline: none;\\n\\\nsnippet ovs\\n\\\n\toverflow-style: ${1};\\n\\\nsnippet ovs:a\\n\\\n\toverflow-style: auto;\\n\\\nsnippet ovs:mq\\n\\\n\toverflow-style: marquee;\\n\\\nsnippet ovs:mv\\n\\\n\toverflow-style: move;\\n\\\nsnippet ovs:p\\n\\\n\toverflow-style: panner;\\n\\\nsnippet ovs:s\\n\\\n\toverflow-style: scrollbar;\\n\\\nsnippet ovx\\n\\\n\toverflow-x: ${1};\\n\\\nsnippet ovx:a\\n\\\n\toverflow-x: auto;\\n\\\nsnippet ovx:h\\n\\\n\toverflow-x: hidden;\\n\\\nsnippet ovx:s\\n\\\n\toverflow-x: scroll;\\n\\\nsnippet ovx:v\\n\\\n\toverflow-x: visible;\\n\\\nsnippet ovy\\n\\\n\toverflow-y: ${1};\\n\\\nsnippet ovy:a\\n\\\n\toverflow-y: auto;\\n\\\nsnippet ovy:h\\n\\\n\toverflow-y: hidden;\\n\\\nsnippet ovy:s\\n\\\n\toverflow-y: scroll;\\n\\\nsnippet ovy:v\\n\\\n\toverflow-y: visible;\\n\\\nsnippet ov\\n\\\n\toverflow: ${1};\\n\\\nsnippet ov:a\\n\\\n\toverflow: auto;\\n\\\nsnippet ov:h\\n\\\n\toverflow: hidden;\\n\\\nsnippet ov:s\\n\\\n\toverflow: scroll;\\n\\\nsnippet ov:v\\n\\\n\toverflow: visible;\\n\\\nsnippet pb\\n\\\n\tpadding-bottom: ${1};\\n\\\nsnippet pl\\n\\\n\tpadding-left: ${1};\\n\\\nsnippet pr\\n\\\n\tpadding-right: ${1};\\n\\\nsnippet pt\\n\\\n\tpadding-top: ${1};\\n\\\nsnippet p\\n\\\n\tpadding: ${1};\\n\\\nsnippet p:4\\n\\\n\tpadding: ${1:0} ${2:0} ${3:0} ${4:0};\\n\\\nsnippet p:3\\n\\\n\tpadding: ${1:0} ${2:0} ${3:0};\\n\\\nsnippet p:2\\n\\\n\tpadding: ${1:0} ${2:0};\\n\\\nsnippet p:0\\n\\\n\tpadding: 0;\\n\\\nsnippet pgba\\n\\\n\tpage-break-after: ${1};\\n\\\nsnippet pgba:aw\\n\\\n\tpage-break-after: always;\\n\\\nsnippet pgba:a\\n\\\n\tpage-break-after: auto;\\n\\\nsnippet pgba:l\\n\\\n\tpage-break-after: left;\\n\\\nsnippet pgba:r\\n\\\n\tpage-break-after: right;\\n\\\nsnippet pgbb\\n\\\n\tpage-break-before: ${1};\\n\\\nsnippet pgbb:aw\\n\\\n\tpage-break-before: always;\\n\\\nsnippet pgbb:a\\n\\\n\tpage-break-before: auto;\\n\\\nsnippet pgbb:l\\n\\\n\tpage-break-before: left;\\n\\\nsnippet pgbb:r\\n\\\n\tpage-break-before: right;\\n\\\nsnippet pgbi\\n\\\n\tpage-break-inside: ${1};\\n\\\nsnippet pgbi:a\\n\\\n\tpage-break-inside: auto;\\n\\\nsnippet pgbi:av\\n\\\n\tpage-break-inside: avoid;\\n\\\nsnippet pos\\n\\\n\tposition: ${1};\\n\\\nsnippet pos:a\\n\\\n\tposition: absolute;\\n\\\nsnippet pos:f\\n\\\n\tposition: fixed;\\n\\\nsnippet pos:r\\n\\\n\tposition: relative;\\n\\\nsnippet pos:s\\n\\\n\tposition: static;\\n\\\nsnippet q\\n\\\n\tquotes: ${1};\\n\\\nsnippet q:en\\n\\\n\tquotes: '\\\\201C' '\\\\201D' '\\\\2018' '\\\\2019';\\n\\\nsnippet q:n\\n\\\n\tquotes: none;\\n\\\nsnippet q:ru\\n\\\n\tquotes: '\\\\00AB' '\\\\00BB' '\\\\201E' '\\\\201C';\\n\\\nsnippet rz\\n\\\n\tresize: ${1};\\n\\\nsnippet rz:b\\n\\\n\tresize: both;\\n\\\nsnippet rz:h\\n\\\n\tresize: horizontal;\\n\\\nsnippet rz:n\\n\\\n\tresize: none;\\n\\\nsnippet rz:v\\n\\\n\tresize: vertical;\\n\\\nsnippet r\\n\\\n\tright: ${1};\\n\\\nsnippet r:a\\n\\\n\tright: auto;\\n\\\nsnippet tbl\\n\\\n\ttable-layout: ${1};\\n\\\nsnippet tbl:a\\n\\\n\ttable-layout: auto;\\n\\\nsnippet tbl:f\\n\\\n\ttable-layout: fixed;\\n\\\nsnippet tal\\n\\\n\ttext-align-last: ${1};\\n\\\nsnippet tal:a\\n\\\n\ttext-align-last: auto;\\n\\\nsnippet tal:c\\n\\\n\ttext-align-last: center;\\n\\\nsnippet tal:l\\n\\\n\ttext-align-last: left;\\n\\\nsnippet tal:r\\n\\\n\ttext-align-last: right;\\n\\\nsnippet ta\\n\\\n\ttext-align: ${1};\\n\\\nsnippet ta:c\\n\\\n\ttext-align: center;\\n\\\nsnippet ta:l\\n\\\n\ttext-align: left;\\n\\\nsnippet ta:r\\n\\\n\ttext-align: right;\\n\\\nsnippet td\\n\\\n\ttext-decoration: ${1};\\n\\\nsnippet td:l\\n\\\n\ttext-decoration: line-through;\\n\\\nsnippet td:n\\n\\\n\ttext-decoration: none;\\n\\\nsnippet td:o\\n\\\n\ttext-decoration: overline;\\n\\\nsnippet td:u\\n\\\n\ttext-decoration: underline;\\n\\\nsnippet te\\n\\\n\ttext-emphasis: ${1};\\n\\\nsnippet te:ac\\n\\\n\ttext-emphasis: accent;\\n\\\nsnippet te:a\\n\\\n\ttext-emphasis: after;\\n\\\nsnippet te:b\\n\\\n\ttext-emphasis: before;\\n\\\nsnippet te:c\\n\\\n\ttext-emphasis: circle;\\n\\\nsnippet te:ds\\n\\\n\ttext-emphasis: disc;\\n\\\nsnippet te:dt\\n\\\n\ttext-emphasis: dot;\\n\\\nsnippet te:n\\n\\\n\ttext-emphasis: none;\\n\\\nsnippet th\\n\\\n\ttext-height: ${1};\\n\\\nsnippet th:a\\n\\\n\ttext-height: auto;\\n\\\nsnippet th:f\\n\\\n\ttext-height: font-size;\\n\\\nsnippet th:m\\n\\\n\ttext-height: max-size;\\n\\\nsnippet th:t\\n\\\n\ttext-height: text-size;\\n\\\nsnippet ti\\n\\\n\ttext-indent: ${1};\\n\\\nsnippet ti:-\\n\\\n\ttext-indent: -9999px;\\n\\\nsnippet tj\\n\\\n\ttext-justify: ${1};\\n\\\nsnippet tj:a\\n\\\n\ttext-justify: auto;\\n\\\nsnippet tj:d\\n\\\n\ttext-justify: distribute;\\n\\\nsnippet tj:ic\\n\\\n\ttext-justify: inter-cluster;\\n\\\nsnippet tj:ii\\n\\\n\ttext-justify: inter-ideograph;\\n\\\nsnippet tj:iw\\n\\\n\ttext-justify: inter-word;\\n\\\nsnippet tj:k\\n\\\n\ttext-justify: kashida;\\n\\\nsnippet tj:t\\n\\\n\ttext-justify: tibetan;\\n\\\nsnippet to+\\n\\\n\ttext-outline: ${1:0} ${2:0} #${3:000};\\n\\\nsnippet to\\n\\\n\ttext-outline: ${1};\\n\\\nsnippet to:n\\n\\\n\ttext-outline: none;\\n\\\nsnippet tr\\n\\\n\ttext-replace: ${1};\\n\\\nsnippet tr:n\\n\\\n\ttext-replace: none;\\n\\\nsnippet tsh+\\n\\\n\ttext-shadow: ${1:0} ${2:0} ${3:0} #${4:000};\\n\\\nsnippet tsh\\n\\\n\ttext-shadow: ${1};\\n\\\nsnippet tsh:n\\n\\\n\ttext-shadow: none;\\n\\\nsnippet tt\\n\\\n\ttext-transform: ${1};\\n\\\nsnippet tt:c\\n\\\n\ttext-transform: capitalize;\\n\\\nsnippet tt:l\\n\\\n\ttext-transform: lowercase;\\n\\\nsnippet tt:n\\n\\\n\ttext-transform: none;\\n\\\nsnippet tt:u\\n\\\n\ttext-transform: uppercase;\\n\\\nsnippet tw\\n\\\n\ttext-wrap: ${1};\\n\\\nsnippet tw:no\\n\\\n\ttext-wrap: none;\\n\\\nsnippet tw:n\\n\\\n\ttext-wrap: normal;\\n\\\nsnippet tw:s\\n\\\n\ttext-wrap: suppress;\\n\\\nsnippet tw:u\\n\\\n\ttext-wrap: unrestricted;\\n\\\nsnippet t\\n\\\n\ttop: ${1};\\n\\\nsnippet t:a\\n\\\n\ttop: auto;\\n\\\nsnippet va\\n\\\n\tvertical-align: ${1};\\n\\\nsnippet va:bl\\n\\\n\tvertical-align: baseline;\\n\\\nsnippet va:b\\n\\\n\tvertical-align: bottom;\\n\\\nsnippet va:m\\n\\\n\tvertical-align: middle;\\n\\\nsnippet va:sub\\n\\\n\tvertical-align: sub;\\n\\\nsnippet va:sup\\n\\\n\tvertical-align: super;\\n\\\nsnippet va:tb\\n\\\n\tvertical-align: text-bottom;\\n\\\nsnippet va:tt\\n\\\n\tvertical-align: text-top;\\n\\\nsnippet va:t\\n\\\n\tvertical-align: top;\\n\\\nsnippet v\\n\\\n\tvisibility: ${1};\\n\\\nsnippet v:c\\n\\\n\tvisibility: collapse;\\n\\\nsnippet v:h\\n\\\n\tvisibility: hidden;\\n\\\nsnippet v:v\\n\\\n\tvisibility: visible;\\n\\\nsnippet whsc\\n\\\n\twhite-space-collapse: ${1};\\n\\\nsnippet whsc:ba\\n\\\n\twhite-space-collapse: break-all;\\n\\\nsnippet whsc:bs\\n\\\n\twhite-space-collapse: break-strict;\\n\\\nsnippet whsc:k\\n\\\n\twhite-space-collapse: keep-all;\\n\\\nsnippet whsc:l\\n\\\n\twhite-space-collapse: loose;\\n\\\nsnippet whsc:n\\n\\\n\twhite-space-collapse: normal;\\n\\\nsnippet whs\\n\\\n\twhite-space: ${1};\\n\\\nsnippet whs:n\\n\\\n\twhite-space: normal;\\n\\\nsnippet whs:nw\\n\\\n\twhite-space: nowrap;\\n\\\nsnippet whs:pl\\n\\\n\twhite-space: pre-line;\\n\\\nsnippet whs:pw\\n\\\n\twhite-space: pre-wrap;\\n\\\nsnippet whs:p\\n\\\n\twhite-space: pre;\\n\\\nsnippet wid\\n\\\n\twidows: ${1};\\n\\\nsnippet w\\n\\\n\twidth: ${1};\\n\\\nsnippet w:a\\n\\\n\twidth: auto;\\n\\\nsnippet wob\\n\\\n\tword-break: ${1};\\n\\\nsnippet wob:ba\\n\\\n\tword-break: break-all;\\n\\\nsnippet wob:bs\\n\\\n\tword-break: break-strict;\\n\\\nsnippet wob:k\\n\\\n\tword-break: keep-all;\\n\\\nsnippet wob:l\\n\\\n\tword-break: loose;\\n\\\nsnippet wob:n\\n\\\n\tword-break: normal;\\n\\\nsnippet wos\\n\\\n\tword-spacing: ${1};\\n\\\nsnippet wow\\n\\\n\tword-wrap: ${1};\\n\\\nsnippet wow:no\\n\\\n\tword-wrap: none;\\n\\\nsnippet wow:n\\n\\\n\tword-wrap: normal;\\n\\\nsnippet wow:s\\n\\\n\tword-wrap: suppress;\\n\\\nsnippet wow:u\\n\\\n\tword-wrap: unrestricted;\\n\\\nsnippet z\\n\\\n\tz-index: ${1};\\n\\\nsnippet z:a\\n\\\n\tz-index: auto;\\n\\\nsnippet zoo\\n\\\n\tzoom: 1;\\n\\\n\";\nexports.scope = \"css\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/curly.js",
    "content": "ace.define(\"ace/snippets/curly\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"curly\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/d.js",
    "content": "ace.define(\"ace/snippets/d\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"d\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/dart.js",
    "content": "ace.define(\"ace/snippets/dart\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"snippet lib\\n\\\n\tlibrary ${1};\\n\\\n\t${2}\\n\\\nsnippet im\\n\\\n\timport '${1}';\\n\\\n\t${2}\\n\\\nsnippet pa\\n\\\n\tpart '${1}';\\n\\\n\t${2}\\n\\\nsnippet pao\\n\\\n\tpart of ${1};\\n\\\n\t${2}\\n\\\nsnippet main\\n\\\n\tvoid main() {\\n\\\n\t  ${1:/* code */}\\n\\\n\t}\\n\\\nsnippet st\\n\\\n\tstatic ${1}\\n\\\nsnippet fi\\n\\\n\tfinal ${1}\\n\\\nsnippet re\\n\\\n\treturn ${1}\\n\\\nsnippet br\\n\\\n\tbreak;\\n\\\nsnippet th\\n\\\n\tthrow ${1}\\n\\\nsnippet cl\\n\\\n\tclass ${1:`Filename(\\\"\\\", \\\"untitled\\\")`} ${2}\\n\\\nsnippet imp\\n\\\n\timplements ${1}\\n\\\nsnippet ext\\n\\\n\textends ${1}\\n\\\nsnippet if\\n\\\n\tif (${1:true}) {\\n\\\n\t  ${2}\\n\\\n\t}\\n\\\nsnippet ife\\n\\\n\tif (${1:true}) {\\n\\\n\t  ${2}\\n\\\n\t} else {\\n\\\n\t  ${3}\\n\\\n\t}\\n\\\nsnippet el\\n\\\n\telse\\n\\\nsnippet sw\\n\\\n\tswitch (${1}) {\\n\\\n\t  ${2}\\n\\\n\t}\\n\\\nsnippet cs\\n\\\n\tcase ${1}:\\n\\\n\t  ${2}\\n\\\nsnippet de\\n\\\n\tdefault:\\n\\\n\t  ${1}\\n\\\nsnippet for\\n\\\n\tfor (var ${2:i} = 0, len = ${1:things}.length; $2 < len; ${3:++}$2) {\\n\\\n\t  ${4:$1[$2]}\\n\\\n\t}\\n\\\nsnippet fore\\n\\\n\tfor (final ${2:item} in ${1:itemList}) {\\n\\\n\t  ${3:/* code */}\\n\\\n\t}\\n\\\nsnippet wh\\n\\\n\twhile (${1:/* condition */}) {\\n\\\n\t  ${2:/* code */}\\n\\\n\t}\\n\\\nsnippet dowh\\n\\\n\tdo {\\n\\\n\t  ${2:/* code */}\\n\\\n\t} while (${1:/* condition */});\\n\\\nsnippet as\\n\\\n\tassert(${1:/* condition */});\\n\\\nsnippet try\\n\\\n\ttry {\\n\\\n\t  ${2}\\n\\\n\t} catch (${1:Exception e}) {\\n\\\n\t}\\n\\\nsnippet tryf\\n\\\n\ttry {\\n\\\n\t  ${2}\\n\\\n\t} catch (${1:Exception e}) {\\n\\\n\t} finally {\\n\\\n\t}\\n\\\n\";\nexports.scope = \"dart\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/diff.js",
    "content": "ace.define(\"ace/snippets/diff\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"# DEP-3 (http://dep.debian.net/deps/dep3/) style patch header\\n\\\nsnippet header DEP-3 style header\\n\\\n\tDescription: ${1}\\n\\\n\tOrigin: ${2:vendor|upstream|other}, ${3:url of the original patch}\\n\\\n\tBug: ${4:url in upstream bugtracker}\\n\\\n\tForwarded: ${5:no|not-needed|url}\\n\\\n\tAuthor: ${6:`g:snips_author`}\\n\\\n\tReviewed-by: ${7:name and email}\\n\\\n\tLast-Update: ${8:`strftime(\\\"%Y-%m-%d\\\")`}\\n\\\n\tApplied-Upstream: ${9:upstream version|url|commit}\\n\\\n\\n\\\n\";\nexports.scope = \"diff\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/django.js",
    "content": "ace.define(\"ace/snippets/django\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"# Model Fields\\n\\\n\\n\\\n# Note: Optional arguments are using defaults that match what Django will use\\n\\\n# as a default, e.g. with max_length fields.  Doing this as a form of self\\n\\\n# documentation and to make it easy to know whether you should override the\\n\\\n# default or not.\\n\\\n\\n\\\n# Note: Optional arguments that are booleans will use the opposite since you\\n\\\n# can either not specify them, or override them, e.g. auto_now_add=False.\\n\\\n\\n\\\nsnippet auto\\n\\\n\t${1:FIELDNAME} = models.AutoField(${2})\\n\\\nsnippet bool\\n\\\n\t${1:FIELDNAME} = models.BooleanField(${2:default=True})\\n\\\nsnippet char\\n\\\n\t${1:FIELDNAME} = models.CharField(max_length=${2}${3:, blank=True})\\n\\\nsnippet comma\\n\\\n\t${1:FIELDNAME} = models.CommaSeparatedIntegerField(max_length=${2}${3:, blank=True})\\n\\\nsnippet date\\n\\\n\t${1:FIELDNAME} = models.DateField(${2:auto_now_add=True, auto_now=True}${3:, blank=True, null=True})\\n\\\nsnippet datetime\\n\\\n\t${1:FIELDNAME} = models.DateTimeField(${2:auto_now_add=True, auto_now=True}${3:, blank=True, null=True})\\n\\\nsnippet decimal\\n\\\n\t${1:FIELDNAME} = models.DecimalField(max_digits=${2}, decimal_places=${3})\\n\\\nsnippet email\\n\\\n\t${1:FIELDNAME} = models.EmailField(max_length=${2:75}${3:, blank=True})\\n\\\nsnippet file\\n\\\n\t${1:FIELDNAME} = models.FileField(upload_to=${2:path/for/upload}${3:, max_length=100})\\n\\\nsnippet filepath\\n\\\n\t${1:FIELDNAME} = models.FilePathField(path=${2:\\\"/abs/path/to/dir\\\"}${3:, max_length=100}${4:, match=\\\"*.ext\\\"}${5:, recursive=True}${6:, blank=True, })\\n\\\nsnippet float\\n\\\n\t${1:FIELDNAME} = models.FloatField(${2})\\n\\\nsnippet image\\n\\\n\t${1:FIELDNAME} = models.ImageField(upload_to=${2:path/for/upload}${3:, height_field=height, width_field=width}${4:, max_length=100})\\n\\\nsnippet int\\n\\\n\t${1:FIELDNAME} = models.IntegerField(${2})\\n\\\nsnippet ip\\n\\\n\t${1:FIELDNAME} = models.IPAddressField(${2})\\n\\\nsnippet nullbool\\n\\\n\t${1:FIELDNAME} = models.NullBooleanField(${2})\\n\\\nsnippet posint\\n\\\n\t${1:FIELDNAME} = models.PositiveIntegerField(${2})\\n\\\nsnippet possmallint\\n\\\n\t${1:FIELDNAME} = models.PositiveSmallIntegerField(${2})\\n\\\nsnippet slug\\n\\\n\t${1:FIELDNAME} = models.SlugField(max_length=${2:50}${3:, blank=True})\\n\\\nsnippet smallint\\n\\\n\t${1:FIELDNAME} = models.SmallIntegerField(${2})\\n\\\nsnippet text\\n\\\n\t${1:FIELDNAME} = models.TextField(${2:blank=True})\\n\\\nsnippet time\\n\\\n\t${1:FIELDNAME} = models.TimeField(${2:auto_now_add=True, auto_now=True}${3:, blank=True, null=True})\\n\\\nsnippet url\\n\\\n\t${1:FIELDNAME} = models.URLField(${2:verify_exists=False}${3:, max_length=200}${4:, blank=True})\\n\\\nsnippet xml\\n\\\n\t${1:FIELDNAME} = models.XMLField(schema_path=${2:None}${3:, blank=True})\\n\\\n# Relational Fields\\n\\\nsnippet fk\\n\\\n\t${1:FIELDNAME} = models.ForeignKey(${2:OtherModel}${3:, related_name=''}${4:, limit_choices_to=}${5:, to_field=''})\\n\\\nsnippet m2m\\n\\\n\t${1:FIELDNAME} = models.ManyToManyField(${2:OtherModel}${3:, related_name=''}${4:, limit_choices_to=}${5:, symmetrical=False}${6:, through=''}${7:, db_table=''})\\n\\\nsnippet o2o\\n\\\n\t${1:FIELDNAME} = models.OneToOneField(${2:OtherModel}${3:, parent_link=True}${4:, related_name=''}${5:, limit_choices_to=}${6:, to_field=''})\\n\\\n\\n\\\n# Code Skeletons\\n\\\n\\n\\\nsnippet form\\n\\\n\tclass ${1:FormName}(forms.Form):\\n\\\n\t\t\\\"\\\"\\\"${2:docstring}\\\"\\\"\\\"\\n\\\n\t\t${3}\\n\\\n\\n\\\nsnippet model\\n\\\n\tclass ${1:ModelName}(models.Model):\\n\\\n\t\t\\\"\\\"\\\"${2:docstring}\\\"\\\"\\\"\\n\\\n\t\t${3}\\n\\\n\t\t\\n\\\n\t\tclass Meta:\\n\\\n\t\t\t${4}\\n\\\n\t\t\\n\\\n\t\tdef __unicode__(self):\\n\\\n\t\t\t${5}\\n\\\n\t\t\\n\\\n\t\tdef save(self, force_insert=False, force_update=False):\\n\\\n\t\t\t${6}\\n\\\n\t\t\\n\\\n\t\t@models.permalink\\n\\\n\t\tdef get_absolute_url(self):\\n\\\n\t\t\treturn ('${7:view_or_url_name}' ${8})\\n\\\n\\n\\\nsnippet modeladmin\\n\\\n\tclass ${1:ModelName}Admin(admin.ModelAdmin):\\n\\\n\t\t${2}\\n\\\n\t\\n\\\n\tadmin.site.register($1, $1Admin)\\n\\\n\t\\n\\\nsnippet tabularinline\\n\\\n\tclass ${1:ModelName}Inline(admin.TabularInline):\\n\\\n\t\tmodel = $1\\n\\\n\\n\\\nsnippet stackedinline\\n\\\n\tclass ${1:ModelName}Inline(admin.StackedInline):\\n\\\n\t\tmodel = $1\\n\\\n\\n\\\nsnippet r2r\\n\\\n\treturn render_to_response('${1:template.html}', {\\n\\\n\t\t\t${2}\\n\\\n\t\t}${3:, context_instance=RequestContext(request)}\\n\\\n\t)\\n\\\n\";\nexports.scope = \"django\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/dockerfile.js",
    "content": "ace.define(\"ace/snippets/dockerfile\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"dockerfile\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/dot.js",
    "content": "ace.define(\"ace/snippets/dot\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"dot\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/eiffel.js",
    "content": "ace.define(\"ace/snippets/eiffel\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"eiffel\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/ejs.js",
    "content": "ace.define(\"ace/snippets/ejs\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"ejs\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/elixir.js",
    "content": "ace.define(\"ace/snippets/elixir\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/elm.js",
    "content": "ace.define(\"ace/snippets/elm\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"elm\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/erlang.js",
    "content": "ace.define(\"ace/snippets/erlang\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"# module and export all\\n\\\nsnippet mod\\n\\\n\t-module(${1:`Filename('', 'my')`}).\\n\\\n\t\\n\\\n\t-compile([export_all]).\\n\\\n\t\\n\\\n\tstart() ->\\n\\\n\t    ${2}\\n\\\n\t\\n\\\n\tstop() ->\\n\\\n\t    ok.\\n\\\n# define directive\\n\\\nsnippet def\\n\\\n\t-ace.define(${1:macro}, ${2:body}).${3}\\n\\\n# export directive\\n\\\nsnippet exp\\n\\\n\t-export([${1:function}/${2:arity}]).\\n\\\n# include directive\\n\\\nsnippet inc\\n\\\n\t-include(\\\"${1:file}\\\").${2}\\n\\\n# behavior directive\\n\\\nsnippet beh\\n\\\n\t-behaviour(${1:behaviour}).${2}\\n\\\n# if expression\\n\\\nsnippet if\\n\\\n\tif\\n\\\n\t    ${1:guard} ->\\n\\\n\t        ${2:body}\\n\\\n\tend\\n\\\n# case expression\\n\\\nsnippet case\\n\\\n\tcase ${1:expression} of\\n\\\n\t    ${2:pattern} ->\\n\\\n\t        ${3:body};\\n\\\n\tend\\n\\\n# anonymous function\\n\\\nsnippet fun\\n\\\n\tfun (${1:Parameters}) -> ${2:body} end${3}\\n\\\n# try...catch\\n\\\nsnippet try\\n\\\n\ttry\\n\\\n\t    ${1}\\n\\\n\tcatch\\n\\\n\t    ${2:_:_} -> ${3:got_some_exception}\\n\\\n\tend\\n\\\n# record directive\\n\\\nsnippet rec\\n\\\n\t-record(${1:record}, {\\n\\\n\t    ${2:field}=${3:value}}).${4}\\n\\\n# todo comment\\n\\\nsnippet todo\\n\\\n\t%% TODO: ${1}\\n\\\n## Snippets below (starting with '%') are in EDoc format.\\n\\\n## See http://www.erlang.org/doc/apps/edoc/chapter.html#id56887 for more details\\n\\\n# doc comment\\n\\\nsnippet %d\\n\\\n\t%% @doc ${1}\\n\\\n# end of doc comment\\n\\\nsnippet %e\\n\\\n\t%% @end\\n\\\n# specification comment\\n\\\nsnippet %s\\n\\\n\t%% @spec ${1}\\n\\\n# private function marker\\n\\\nsnippet %p\\n\\\n\t%% @private\\n\\\n# OTP application\\n\\\nsnippet application\\n\\\n\t-module(${1:`Filename('', 'my')`}).\\n\\\n\\n\\\n\t-behaviour(application).\\n\\\n\\n\\\n\t-export([start/2, stop/1]).\\n\\\n\\n\\\n\tstart(_Type, _StartArgs) ->\\n\\\n\t    case ${2:root_supervisor}:start_link() of\\n\\\n\t        {ok, Pid} ->\\n\\\n\t            {ok, Pid};\\n\\\n\t        Other ->\\n\\\n\t\t          {error, Other}\\n\\\n\t    end.\\n\\\n\\n\\\n\tstop(_State) ->\\n\\\n\t    ok.\t\\n\\\n# OTP supervisor\\n\\\nsnippet supervisor\\n\\\n\t-module(${1:`Filename('', 'my')`}).\\n\\\n\\n\\\n\t-behaviour(supervisor).\\n\\\n\\n\\\n\t%% API\\n\\\n\t-export([start_link/0]).\\n\\\n\\n\\\n\t%% Supervisor callbacks\\n\\\n\t-export([init/1]).\\n\\\n\\n\\\n\t-ace.define(SERVER, ?MODULE).\\n\\\n\\n\\\n\tstart_link() ->\\n\\\n\t    supervisor:start_link({local, ?SERVER}, ?MODULE, []).\\n\\\n\\n\\\n\tinit([]) ->\\n\\\n\t    Server = {${2:my_server}, {$2, start_link, []},\\n\\\n\t      permanent, 2000, worker, [$2]},\\n\\\n\t    Children = [Server],\\n\\\n\t    RestartStrategy = {one_for_one, 0, 1},\\n\\\n\t    {ok, {RestartStrategy, Children}}.\\n\\\n# OTP gen_server\\n\\\nsnippet gen_server\\n\\\n\t-module(${1:`Filename('', 'my')`}).\\n\\\n\\n\\\n\t-behaviour(gen_server).\\n\\\n\\n\\\n\t%% API\\n\\\n\t-export([\\n\\\n\t         start_link/0\\n\\\n\t        ]).\\n\\\n\\n\\\n\t%% gen_server callbacks\\n\\\n\t-export([init/1, handle_call/3, handle_cast/2, handle_info/2,\\n\\\n\t         terminate/2, code_change/3]).\\n\\\n\\n\\\n\t-ace.define(SERVER, ?MODULE).\\n\\\n\\n\\\n\t-record(state, {}).\\n\\\n\\n\\\n\t%%%===================================================================\\n\\\n\t%%% API\\n\\\n\t%%%===================================================================\\n\\\n\\n\\\n\tstart_link() ->\\n\\\n\t    gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).\\n\\\n\\n\\\n\t%%%===================================================================\\n\\\n\t%%% gen_server callbacks\\n\\\n\t%%%===================================================================\\n\\\n\\n\\\n\tinit([]) ->\\n\\\n\t    {ok, #state{}}.\\n\\\n\\n\\\n\thandle_call(_Request, _From, State) ->\\n\\\n\t    Reply = ok,\\n\\\n\t    {reply, Reply, State}.\\n\\\n\\n\\\n\thandle_cast(_Msg, State) ->\\n\\\n\t    {noreply, State}.\\n\\\n\\n\\\n\thandle_info(_Info, State) ->\\n\\\n\t    {noreply, State}.\\n\\\n\\n\\\n\tterminate(_Reason, _State) ->\\n\\\n\t    ok.\\n\\\n\\n\\\n\tcode_change(_OldVsn, State, _Extra) ->\\n\\\n\t    {ok, State}.\\n\\\n\\n\\\n\t%%%===================================================================\\n\\\n\t%%% Internal functions\\n\\\n\t%%%===================================================================\\n\\\n\\n\\\n\";\nexports.scope = \"erlang\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/forth.js",
    "content": "ace.define(\"ace/snippets/forth\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"forth\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/ftl.js",
    "content": "ace.define(\"ace/snippets/ftl\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"ftl\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/gcode.js",
    "content": "ace.define(\"ace/snippets/gcode\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"gcode\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/gherkin.js",
    "content": "ace.define(\"ace/snippets/gherkin\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"gherkin\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/gitignore.js",
    "content": "ace.define(\"ace/snippets/gitignore\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"gitignore\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/glsl.js",
    "content": "ace.define(\"ace/snippets/glsl\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"glsl\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/golang.js",
    "content": "ace.define(\"ace/snippets/golang\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"golang\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/groovy.js",
    "content": "ace.define(\"ace/snippets/groovy\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"groovy\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/haml.js",
    "content": "ace.define(\"ace/snippets/haml\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"snippet t\\n\\\n\t%table\\n\\\n\t\t%tr\\n\\\n\t\t\t%th\\n\\\n\t\t\t\t${1:headers}\\n\\\n\t\t%tr\\n\\\n\t\t\t%td\\n\\\n\t\t\t\t${2:headers}\\n\\\nsnippet ul\\n\\\n\t%ul\\n\\\n\t\t%li\\n\\\n\t\t\t${1:item}\\n\\\n\t\t%li\\n\\\nsnippet =rp\\n\\\n\t= render :partial => '${1:partial}'\\n\\\nsnippet =rpl\\n\\\n\t= render :partial => '${1:partial}', :locals => {}\\n\\\nsnippet =rpc\\n\\\n\t= render :partial => '${1:partial}', :collection => @$1\\n\\\n\\n\\\n\";\nexports.scope = \"haml\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/handlebars.js",
    "content": "ace.define(\"ace/snippets/handlebars\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"handlebars\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/haskell.js",
    "content": "ace.define(\"ace/snippets/haskell\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"snippet lang\\n\\\n\t{-# LANGUAGE ${1:OverloadedStrings} #-}\\n\\\nsnippet info\\n\\\n\t-- |\\n\\\n\t-- Module      :  ${1:Module.Namespace}\\n\\\n\t-- Copyright   :  ${2:Author} ${3:2011-2012}\\n\\\n\t-- License     :  ${4:BSD3}\\n\\\n\t--\\n\\\n\t-- Maintainer  :  ${5:email@something.com}\\n\\\n\t-- Stability   :  ${6:experimental}\\n\\\n\t-- Portability :  ${7:unknown}\\n\\\n\t--\\n\\\n\t-- ${8:Description}\\n\\\n\t--\\n\\\nsnippet import\\n\\\n\timport           ${1:Data.Text}\\n\\\nsnippet import2\\n\\\n\timport           ${1:Data.Text} (${2:head})\\n\\\nsnippet importq\\n\\\n\timport qualified ${1:Data.Text} as ${2:T}\\n\\\nsnippet inst\\n\\\n\tinstance ${1:Monoid} ${2:Type} where\\n\\\n\t\t${3}\\n\\\nsnippet type\\n\\\n\ttype ${1:Type} = ${2:Type}\\n\\\nsnippet data\\n\\\n\tdata ${1:Type} = ${2:$1} ${3:Int}\\n\\\nsnippet newtype\\n\\\n\tnewtype ${1:Type} = ${2:$1} ${3:Int}\\n\\\nsnippet class\\n\\\n\tclass ${1:Class} a where\\n\\\n\t\t${2}\\n\\\nsnippet module\\n\\\n\tmodule `substitute(substitute(expand('%:r'), '[/\\\\\\\\]','.','g'),'^\\\\%(\\\\l*\\\\.\\\\)\\\\?','','')` (\\n\\\n\t)\twhere\\n\\\n\t`expand('%') =~ 'Main' ? \\\"\\\\n\\\\nmain = do\\\\n  print \\\\\\\"hello world\\\\\\\"\\\" : \\\"\\\"`\\n\\\n\\n\\\nsnippet const\\n\\\n\t${1:name} :: ${2:a}\\n\\\n\t$1 = ${3:undefined}\\n\\\nsnippet fn\\n\\\n\t${1:fn} :: ${2:a} -> ${3:a}\\n\\\n\t$1 ${4} = ${5:undefined}\\n\\\nsnippet fn2\\n\\\n\t${1:fn} :: ${2:a} -> ${3:a} -> ${4:a}\\n\\\n\t$1 ${5} = ${6:undefined}\\n\\\nsnippet ap\\n\\\n\t${1:map} ${2:fn} ${3:list}\\n\\\nsnippet do\\n\\\n\tdo\\n\\\n\t\t\\n\\\nsnippet λ\\n\\\n\t\\\\${1:x} -> ${2}\\n\\\nsnippet \\\\\\n\\\n\t\\\\${1:x} -> ${2}\\n\\\nsnippet <-\\n\\\n\t${1:a} <- ${2:m a}\\n\\\nsnippet ←\\n\\\n\t${1:a} <- ${2:m a}\\n\\\nsnippet ->\\n\\\n\t${1:m a} -> ${2:a}\\n\\\nsnippet →\\n\\\n\t${1:m a} -> ${2:a}\\n\\\nsnippet tup\\n\\\n\t(${1:a}, ${2:b})\\n\\\nsnippet tup2\\n\\\n\t(${1:a}, ${2:b}, ${3:c})\\n\\\nsnippet tup3\\n\\\n\t(${1:a}, ${2:b}, ${3:c}, ${4:d})\\n\\\nsnippet rec\\n\\\n\t${1:Record} { ${2:recFieldA} = ${3:undefined}\\n\\\n\t\t\t\t, ${4:recFieldB} = ${5:undefined}\\n\\\n\t\t\t\t}\\n\\\nsnippet case\\n\\\n\tcase ${1:something} of\\n\\\n\t\t${2} -> ${3}\\n\\\nsnippet let\\n\\\n\tlet ${1} = ${2}\\n\\\n\tin ${3}\\n\\\nsnippet where\\n\\\n\twhere\\n\\\n\t\t${1:fn} = ${2:undefined}\\n\\\n\";\nexports.scope = \"haskell\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/haxe.js",
    "content": "ace.define(\"ace/snippets/haxe\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"haxe\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/html.js",
    "content": "ace.define(\"ace/snippets/html\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"# Some useful Unicode entities\\n\\\n# Non-Breaking Space\\n\\\nsnippet nbs\\n\\\n\t&nbsp;\\n\\\n# ←\\n\\\nsnippet left\\n\\\n\t&#x2190;\\n\\\n# →\\n\\\nsnippet right\\n\\\n\t&#x2192;\\n\\\n# ↑\\n\\\nsnippet up\\n\\\n\t&#x2191;\\n\\\n# ↓\\n\\\nsnippet down\\n\\\n\t&#x2193;\\n\\\n# ↩\\n\\\nsnippet return\\n\\\n\t&#x21A9;\\n\\\n# ⇤\\n\\\nsnippet backtab\\n\\\n\t&#x21E4;\\n\\\n# ⇥\\n\\\nsnippet tab\\n\\\n\t&#x21E5;\\n\\\n# ⇧\\n\\\nsnippet shift\\n\\\n\t&#x21E7;\\n\\\n# ⌃\\n\\\nsnippet ctrl\\n\\\n\t&#x2303;\\n\\\n# ⌅\\n\\\nsnippet enter\\n\\\n\t&#x2305;\\n\\\n# ⌘\\n\\\nsnippet cmd\\n\\\n\t&#x2318;\\n\\\n# ⌥\\n\\\nsnippet option\\n\\\n\t&#x2325;\\n\\\n# ⌦\\n\\\nsnippet delete\\n\\\n\t&#x2326;\\n\\\n# ⌫\\n\\\nsnippet backspace\\n\\\n\t&#x232B;\\n\\\n# ⎋\\n\\\nsnippet esc\\n\\\n\t&#x238B;\\n\\\n# Generic Doctype\\n\\\nsnippet doctype HTML 4.01 Strict\\n\\\n\t<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\"\\n\\\n\t\\\"http://www.w3.org/TR/html4/strict.dtd\\\">\\n\\\nsnippet doctype HTML 4.01 Transitional\\n\\\n\t<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01 Transitional//EN\\\"\\n\\\n\t\\\"http://www.w3.org/TR/html4/loose.dtd\\\">\\n\\\nsnippet doctype HTML 5\\n\\\n\t<!DOCTYPE HTML>\\n\\\nsnippet doctype XHTML 1.0 Frameset\\n\\\n\t<!DOCTYPE html PUBLIC \\\"-//W3C//DTD XHTML 1.0 Strict//EN\\\"\\n\\\n\t\\\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\\\">\\n\\\nsnippet doctype XHTML 1.0 Strict\\n\\\n\t<!DOCTYPE html PUBLIC \\\"-//W3C//DTD XHTML 1.0 Strict//EN\\\"\\n\\\n\t\\\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\\\">\\n\\\nsnippet doctype XHTML 1.0 Transitional\\n\\\n\t<!DOCTYPE html PUBLIC \\\"-//W3C//DTD XHTML 1.0 Transitional//EN\\\"\\n\\\n\t\\\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\\\">\\n\\\nsnippet doctype XHTML 1.1\\n\\\n\t<!DOCTYPE html PUBLIC \\\"-//W3C//DTD XHTML 1.1//EN\\\"\\n\\\n\t\\\"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\\\">\\n\\\n# HTML Doctype 4.01 Strict\\n\\\nsnippet docts\\n\\\n\t<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01//EN\\\"\\n\\\n\t\\\"http://www.w3.org/TR/html4/strict.dtd\\\">\\n\\\n# HTML Doctype 4.01 Transitional\\n\\\nsnippet doct\\n\\\n\t<!DOCTYPE HTML PUBLIC \\\"-//W3C//DTD HTML 4.01 Transitional//EN\\\"\\n\\\n\t\\\"http://www.w3.org/TR/html4/loose.dtd\\\">\\n\\\n# HTML Doctype 5\\n\\\nsnippet doct5\\n\\\n\t<!DOCTYPE HTML>\\n\\\n# XHTML Doctype 1.0 Frameset\\n\\\nsnippet docxf\\n\\\n\t<!DOCTYPE html PUBLIC \\\"-//W3C//DTD XHTML 1.0 Frameset//EN\\\"\\n\\\n\t\\\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\\\">\\n\\\n# XHTML Doctype 1.0 Strict\\n\\\nsnippet docxs\\n\\\n\t<!DOCTYPE html PUBLIC \\\"-//W3C//DTD XHTML 1.0 Strict//EN\\\"\\n\\\n\t\\\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\\\">\\n\\\n# XHTML Doctype 1.0 Transitional\\n\\\nsnippet docxt\\n\\\n\t<!DOCTYPE html PUBLIC \\\"-//W3C//DTD XHTML 1.0 Transitional//EN\\\"\\n\\\n\t\\\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\\\">\\n\\\n# XHTML Doctype 1.1\\n\\\nsnippet docx\\n\\\n\t<!DOCTYPE html PUBLIC \\\"-//W3C//DTD XHTML 1.1//EN\\\"\\n\\\n\t\\\"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\\\">\\n\\\n# Attributes\\n\\\nsnippet attr\\n\\\n\t${1:attribute}=\\\"${2:property}\\\"\\n\\\nsnippet attr+\\n\\\n\t${1:attribute}=\\\"${2:property}\\\" attr+${3}\\n\\\nsnippet .\\n\\\n\tclass=\\\"${1}\\\"${2}\\n\\\nsnippet #\\n\\\n\tid=\\\"${1}\\\"${2}\\n\\\nsnippet alt\\n\\\n\talt=\\\"${1}\\\"${2}\\n\\\nsnippet charset\\n\\\n\tcharset=\\\"${1:utf-8}\\\"${2}\\n\\\nsnippet data\\n\\\n\tdata-${1}=\\\"${2:$1}\\\"${3}\\n\\\nsnippet for\\n\\\n\tfor=\\\"${1}\\\"${2}\\n\\\nsnippet height\\n\\\n\theight=\\\"${1}\\\"${2}\\n\\\nsnippet href\\n\\\n\thref=\\\"${1:#}\\\"${2}\\n\\\nsnippet lang\\n\\\n\tlang=\\\"${1:en}\\\"${2}\\n\\\nsnippet media\\n\\\n\tmedia=\\\"${1}\\\"${2}\\n\\\nsnippet name\\n\\\n\tname=\\\"${1}\\\"${2}\\n\\\nsnippet rel\\n\\\n\trel=\\\"${1}\\\"${2}\\n\\\nsnippet scope\\n\\\n\tscope=\\\"${1:row}\\\"${2}\\n\\\nsnippet src\\n\\\n\tsrc=\\\"${1}\\\"${2}\\n\\\nsnippet title=\\n\\\n\ttitle=\\\"${1}\\\"${2}\\n\\\nsnippet type\\n\\\n\ttype=\\\"${1}\\\"${2}\\n\\\nsnippet value\\n\\\n\tvalue=\\\"${1}\\\"${2}\\n\\\nsnippet width\\n\\\n\twidth=\\\"${1}\\\"${2}\\n\\\n# Elements\\n\\\nsnippet a\\n\\\n\t<a href=\\\"${1:#}\\\">${2:$1}</a>\\n\\\nsnippet a.\\n\\\n\t<a class=\\\"${1}\\\" href=\\\"${2:#}\\\">${3:$1}</a>\\n\\\nsnippet a#\\n\\\n\t<a id=\\\"${1}\\\" href=\\\"${2:#}\\\">${3:$1}</a>\\n\\\nsnippet a:ext\\n\\\n\t<a href=\\\"http://${1:example.com}\\\">${2:$1}</a>\\n\\\nsnippet a:mail\\n\\\n\t<a href=\\\"mailto:${1:joe@example.com}?subject=${2:feedback}\\\">${3:email me}</a>\\n\\\nsnippet abbr\\n\\\n\t<abbr title=\\\"${1}\\\">${2}</abbr>\\n\\\nsnippet address\\n\\\n\t<address>\\n\\\n\t\t${1}\\n\\\n\t</address>\\n\\\nsnippet area\\n\\\n\t<area shape=\\\"${1:rect}\\\" coords=\\\"${2}\\\" href=\\\"${3}\\\" alt=\\\"${4}\\\" />\\n\\\nsnippet area+\\n\\\n\t<area shape=\\\"${1:rect}\\\" coords=\\\"${2}\\\" href=\\\"${3}\\\" alt=\\\"${4}\\\" />\\n\\\n\tarea+${5}\\n\\\nsnippet area:c\\n\\\n\t<area shape=\\\"circle\\\" coords=\\\"${1}\\\" href=\\\"${2}\\\" alt=\\\"${3}\\\" />\\n\\\nsnippet area:d\\n\\\n\t<area shape=\\\"default\\\" coords=\\\"${1}\\\" href=\\\"${2}\\\" alt=\\\"${3}\\\" />\\n\\\nsnippet area:p\\n\\\n\t<area shape=\\\"poly\\\" coords=\\\"${1}\\\" href=\\\"${2}\\\" alt=\\\"${3}\\\" />\\n\\\nsnippet area:r\\n\\\n\t<area shape=\\\"rect\\\" coords=\\\"${1}\\\" href=\\\"${2}\\\" alt=\\\"${3}\\\" />\\n\\\nsnippet article\\n\\\n\t<article>\\n\\\n\t\t${1}\\n\\\n\t</article>\\n\\\nsnippet article.\\n\\\n\t<article class=\\\"${1}\\\">\\n\\\n\t\t${2}\\n\\\n\t</article>\\n\\\nsnippet article#\\n\\\n\t<article id=\\\"${1}\\\">\\n\\\n\t\t${2}\\n\\\n\t</article>\\n\\\nsnippet aside\\n\\\n\t<aside>\\n\\\n\t\t${1}\\n\\\n\t</aside>\\n\\\nsnippet aside.\\n\\\n\t<aside class=\\\"${1}\\\">\\n\\\n\t\t${2}\\n\\\n\t</aside>\\n\\\nsnippet aside#\\n\\\n\t<aside id=\\\"${1}\\\">\\n\\\n\t\t${2}\\n\\\n\t</aside>\\n\\\nsnippet audio\\n\\\n\t<audio src=\\\"${1}>${2}</audio>\\n\\\nsnippet b\\n\\\n\t<b>${1}</b>\\n\\\nsnippet base\\n\\\n\t<base href=\\\"${1}\\\" target=\\\"${2}\\\" />\\n\\\nsnippet bdi\\n\\\n\t<bdi>${1}</bdo>\\n\\\nsnippet bdo\\n\\\n\t<bdo dir=\\\"${1}\\\">${2}</bdo>\\n\\\nsnippet bdo:l\\n\\\n\t<bdo dir=\\\"ltr\\\">${1}</bdo>\\n\\\nsnippet bdo:r\\n\\\n\t<bdo dir=\\\"rtl\\\">${1}</bdo>\\n\\\nsnippet blockquote\\n\\\n\t<blockquote>\\n\\\n\t\t${1}\\n\\\n\t</blockquote>\\n\\\nsnippet body\\n\\\n\t<body>\\n\\\n\t\t${1}\\n\\\n\t</body>\\n\\\nsnippet br\\n\\\n\t<br />${1}\\n\\\nsnippet button\\n\\\n\t<button type=\\\"${1:submit}\\\">${2}</button>\\n\\\nsnippet button.\\n\\\n\t<button class=\\\"${1:button}\\\" type=\\\"${2:submit}\\\">${3}</button>\\n\\\nsnippet button#\\n\\\n\t<button id=\\\"${1}\\\" type=\\\"${2:submit}\\\">${3}</button>\\n\\\nsnippet button:s\\n\\\n\t<button type=\\\"submit\\\">${1}</button>\\n\\\nsnippet button:r\\n\\\n\t<button type=\\\"reset\\\">${1}</button>\\n\\\nsnippet canvas\\n\\\n\t<canvas>\\n\\\n\t\t${1}\\n\\\n\t</canvas>\\n\\\nsnippet caption\\n\\\n\t<caption>${1}</caption>\\n\\\nsnippet cite\\n\\\n\t<cite>${1}</cite>\\n\\\nsnippet code\\n\\\n\t<code>${1}</code>\\n\\\nsnippet col\\n\\\n\t<col />${1}\\n\\\nsnippet col+\\n\\\n\t<col />\\n\\\n\tcol+${1}\\n\\\nsnippet colgroup\\n\\\n\t<colgroup>\\n\\\n\t\t${1}\\n\\\n\t</colgroup>\\n\\\nsnippet colgroup+\\n\\\n\t<colgroup>\\n\\\n\t\t<col />\\n\\\n\t\tcol+${1}\\n\\\n\t</colgroup>\\n\\\nsnippet command\\n\\\n\t<command type=\\\"command\\\" label=\\\"${1}\\\" icon=\\\"${2}\\\" />\\n\\\nsnippet command:c\\n\\\n\t<command type=\\\"checkbox\\\" label=\\\"${1}\\\" icon=\\\"${2}\\\" />\\n\\\nsnippet command:r\\n\\\n\t<command type=\\\"radio\\\" radiogroup=\\\"${1}\\\" label=\\\"${2}\\\" icon=\\\"${3}\\\" />\\n\\\nsnippet datagrid\\n\\\n\t<datagrid>\\n\\\n\t\t${1}\\n\\\n\t</datagrid>\\n\\\nsnippet datalist\\n\\\n\t<datalist>\\n\\\n\t\t${1}\\n\\\n\t</datalist>\\n\\\nsnippet datatemplate\\n\\\n\t<datatemplate>\\n\\\n\t\t${1}\\n\\\n\t</datatemplate>\\n\\\nsnippet dd\\n\\\n\t<dd>${1}</dd>\\n\\\nsnippet dd.\\n\\\n\t<dd class=\\\"${1}\\\">${2}</dd>\\n\\\nsnippet dd#\\n\\\n\t<dd id=\\\"${1}\\\">${2}</dd>\\n\\\nsnippet del\\n\\\n\t<del>${1}</del>\\n\\\nsnippet details\\n\\\n\t<details>${1}</details>\\n\\\nsnippet dfn\\n\\\n\t<dfn>${1}</dfn>\\n\\\nsnippet dialog\\n\\\n\t<dialog>\\n\\\n\t\t${1}\\n\\\n\t</dialog>\\n\\\nsnippet div\\n\\\n\t<div>\\n\\\n\t\t${1}\\n\\\n\t</div>\\n\\\nsnippet div.\\n\\\n\t<div class=\\\"${1}\\\">\\n\\\n\t\t${2}\\n\\\n\t</div>\\n\\\nsnippet div#\\n\\\n\t<div id=\\\"${1}\\\">\\n\\\n\t\t${2}\\n\\\n\t</div>\\n\\\nsnippet dl\\n\\\n\t<dl>\\n\\\n\t\t${1}\\n\\\n\t</dl>\\n\\\nsnippet dl.\\n\\\n\t<dl class=\\\"${1}\\\">\\n\\\n\t\t${2}\\n\\\n\t</dl>\\n\\\nsnippet dl#\\n\\\n\t<dl id=\\\"${1}\\\">\\n\\\n\t\t${2}\\n\\\n\t</dl>\\n\\\nsnippet dl+\\n\\\n\t<dl>\\n\\\n\t\t<dt>${1}</dt>\\n\\\n\t\t<dd>${2}</dd>\\n\\\n\t\tdt+${3}\\n\\\n\t</dl>\\n\\\nsnippet dt\\n\\\n\t<dt>${1}</dt>\\n\\\nsnippet dt.\\n\\\n\t<dt class=\\\"${1}\\\">${2}</dt>\\n\\\nsnippet dt#\\n\\\n\t<dt id=\\\"${1}\\\">${2}</dt>\\n\\\nsnippet dt+\\n\\\n\t<dt>${1}</dt>\\n\\\n\t<dd>${2}</dd>\\n\\\n\tdt+${3}\\n\\\nsnippet em\\n\\\n\t<em>${1}</em>\\n\\\nsnippet embed\\n\\\n\t<embed src=${1} type=\\\"${2} />\\n\\\nsnippet fieldset\\n\\\n\t<fieldset>\\n\\\n\t\t${1}\\n\\\n\t</fieldset>\\n\\\nsnippet fieldset.\\n\\\n\t<fieldset class=\\\"${1}\\\">\\n\\\n\t\t${2}\\n\\\n\t</fieldset>\\n\\\nsnippet fieldset#\\n\\\n\t<fieldset id=\\\"${1}\\\">\\n\\\n\t\t${2}\\n\\\n\t</fieldset>\\n\\\nsnippet fieldset+\\n\\\n\t<fieldset>\\n\\\n\t\t<legend><span>${1}</span></legend>\\n\\\n\t\t${2}\\n\\\n\t</fieldset>\\n\\\n\tfieldset+${3}\\n\\\nsnippet figcaption\\n\\\n\t<figcaption>${1}</figcaption>\\n\\\nsnippet figure\\n\\\n\t<figure>${1}</figure>\\n\\\nsnippet footer\\n\\\n\t<footer>\\n\\\n\t\t${1}\\n\\\n\t</footer>\\n\\\nsnippet footer.\\n\\\n\t<footer class=\\\"${1}\\\">\\n\\\n\t\t${2}\\n\\\n\t</footer>\\n\\\nsnippet footer#\\n\\\n\t<footer id=\\\"${1}\\\">\\n\\\n\t\t${2}\\n\\\n\t</footer>\\n\\\nsnippet form\\n\\\n\t<form action=\\\"${1}\\\" method=\\\"${2:get}\\\" accept-charset=\\\"utf-8\\\">\\n\\\n\t\t${3}\\n\\\n\t</form>\\n\\\nsnippet form.\\n\\\n\t<form class=\\\"${1}\\\" action=\\\"${2}\\\" method=\\\"${3:get}\\\" accept-charset=\\\"utf-8\\\">\\n\\\n\t\t${4}\\n\\\n\t</form>\\n\\\nsnippet form#\\n\\\n\t<form id=\\\"${1}\\\" action=\\\"${2}\\\" method=\\\"${3:get}\\\" accept-charset=\\\"utf-8\\\">\\n\\\n\t\t${4}\\n\\\n\t</form>\\n\\\nsnippet h1\\n\\\n\t<h1>${1}</h1>\\n\\\nsnippet h1.\\n\\\n\t<h1 class=\\\"${1}\\\">${2}</h1>\\n\\\nsnippet h1#\\n\\\n\t<h1 id=\\\"${1}\\\">${2}</h1>\\n\\\nsnippet h2\\n\\\n\t<h2>${1}</h2>\\n\\\nsnippet h2.\\n\\\n\t<h2 class=\\\"${1}\\\">${2}</h2>\\n\\\nsnippet h2#\\n\\\n\t<h2 id=\\\"${1}\\\">${2}</h2>\\n\\\nsnippet h3\\n\\\n\t<h3>${1}</h3>\\n\\\nsnippet h3.\\n\\\n\t<h3 class=\\\"${1}\\\">${2}</h3>\\n\\\nsnippet h3#\\n\\\n\t<h3 id=\\\"${1}\\\">${2}</h3>\\n\\\nsnippet h4\\n\\\n\t<h4>${1}</h4>\\n\\\nsnippet h4.\\n\\\n\t<h4 class=\\\"${1}\\\">${2}</h4>\\n\\\nsnippet h4#\\n\\\n\t<h4 id=\\\"${1}\\\">${2}</h4>\\n\\\nsnippet h5\\n\\\n\t<h5>${1}</h5>\\n\\\nsnippet h5.\\n\\\n\t<h5 class=\\\"${1}\\\">${2}</h5>\\n\\\nsnippet h5#\\n\\\n\t<h5 id=\\\"${1}\\\">${2}</h5>\\n\\\nsnippet h6\\n\\\n\t<h6>${1}</h6>\\n\\\nsnippet h6.\\n\\\n\t<h6 class=\\\"${1}\\\">${2}</h6>\\n\\\nsnippet h6#\\n\\\n\t<h6 id=\\\"${1}\\\">${2}</h6>\\n\\\nsnippet head\\n\\\n\t<head>\\n\\\n\t\t<meta http-equiv=\\\"content-type\\\" content=\\\"text/html; charset=utf-8\\\" />\\n\\\n\\n\\\n\t\t<title>${1:`substitute(Filename('', 'Page Title'), '^.', '\\\\u&', '')`}</title>\\n\\\n\t\t${2}\\n\\\n\t</head>\\n\\\nsnippet header\\n\\\n\t<header>\\n\\\n\t\t${1}\\n\\\n\t</header>\\n\\\nsnippet header.\\n\\\n\t<header class=\\\"${1}\\\">\\n\\\n\t\t${2}\\n\\\n\t</header>\\n\\\nsnippet header#\\n\\\n\t<header id=\\\"${1}\\\">\\n\\\n\t\t${2}\\n\\\n\t</header>\\n\\\nsnippet hgroup\\n\\\n\t<hgroup>\\n\\\n\t\t${1}\\n\\\n\t</hgroup>\\n\\\nsnippet hgroup.\\n\\\n\t<hgroup class=\\\"${1}>\\n\\\n\t\t${2}\\n\\\n\t</hgroup>\\n\\\nsnippet hr\\n\\\n\t<hr />${1}\\n\\\nsnippet html\\n\\\n\t<html>\\n\\\n\t${1}\\n\\\n\t</html>\\n\\\nsnippet xhtml\\n\\\n\t<html xmlns=\\\"http://www.w3.org/1999/xhtml\\\">\\n\\\n\t${1}\\n\\\n\t</html>\\n\\\nsnippet html5\\n\\\n\t<!DOCTYPE html>\\n\\\n\t<html>\\n\\\n\t\t<head>\\n\\\n\t\t\t<meta http-equiv=\\\"content-type\\\" content=\\\"text/html; charset=utf-8\\\" />\\n\\\n\t\t\t<title>${1:`substitute(Filename('', 'Page Title'), '^.', '\\\\u&', '')`}</title>\\n\\\n\t\t\t${2:meta}\\n\\\n\t\t</head>\\n\\\n\t\t<body>\\n\\\n\t\t\t${3:body}\\n\\\n\t\t</body>\\n\\\n\t</html>\\n\\\nsnippet i\\n\\\n\t<i>${1}</i>\\n\\\nsnippet iframe\\n\\\n\t<iframe src=\\\"${1}\\\" frameborder=\\\"0\\\"></iframe>${2}\\n\\\nsnippet iframe.\\n\\\n\t<iframe class=\\\"${1}\\\" src=\\\"${2}\\\" frameborder=\\\"0\\\"></iframe>${3}\\n\\\nsnippet iframe#\\n\\\n\t<iframe id=\\\"${1}\\\" src=\\\"${2}\\\" frameborder=\\\"0\\\"></iframe>${3}\\n\\\nsnippet img\\n\\\n\t<img src=\\\"${1}\\\" alt=\\\"${2}\\\" />${3}\\n\\\nsnippet img.\\n\\\n\t<img class=\\\"${1}\\\" src=\\\"${2}\\\" alt=\\\"${3}\\\" />${4}\\n\\\nsnippet img#\\n\\\n\t<img id=\\\"${1}\\\" src=\\\"${2}\\\" alt=\\\"${3}\\\" />${4}\\n\\\nsnippet input\\n\\\n\t<input type=\\\"${1:text/submit/hidden/button/image}\\\" name=\\\"${2}\\\" id=\\\"${3:$2}\\\" value=\\\"${4}\\\" />${5}\\n\\\nsnippet input.\\n\\\n\t<input class=\\\"${1}\\\" type=\\\"${2:text/submit/hidden/button/image}\\\" name=\\\"${3}\\\" id=\\\"${4:$3}\\\" value=\\\"${5}\\\" />${6}\\n\\\nsnippet input:text\\n\\\n\t<input type=\\\"text\\\" name=\\\"${1}\\\" id=\\\"${2:$1}\\\" value=\\\"${3}\\\" />${4}\\n\\\nsnippet input:submit\\n\\\n\t<input type=\\\"submit\\\" name=\\\"${1}\\\" id=\\\"${2:$1}\\\" value=\\\"${3}\\\" />${4}\\n\\\nsnippet input:hidden\\n\\\n\t<input type=\\\"hidden\\\" name=\\\"${1}\\\" id=\\\"${2:$1}\\\" value=\\\"${3}\\\" />${4}\\n\\\nsnippet input:button\\n\\\n\t<input type=\\\"button\\\" name=\\\"${1}\\\" id=\\\"${2:$1}\\\" value=\\\"${3}\\\" />${4}\\n\\\nsnippet input:image\\n\\\n\t<input type=\\\"image\\\" name=\\\"${1}\\\" id=\\\"${2:$1}\\\" src=\\\"${3}\\\" alt=\\\"${4}\\\" />${5}\\n\\\nsnippet input:checkbox\\n\\\n\t<input type=\\\"checkbox\\\" name=\\\"${1}\\\" id=\\\"${2:$1}\\\" />${3}\\n\\\nsnippet input:radio\\n\\\n\t<input type=\\\"radio\\\" name=\\\"${1}\\\" id=\\\"${2:$1}\\\" />${3}\\n\\\nsnippet input:color\\n\\\n\t<input type=\\\"color\\\" name=\\\"${1}\\\" id=\\\"${2:$1}\\\" value=\\\"${3}\\\" />${4}\\n\\\nsnippet input:date\\n\\\n\t<input type=\\\"date\\\" name=\\\"${1}\\\" id=\\\"${2:$1}\\\" value=\\\"${3}\\\" />${4}\\n\\\nsnippet input:datetime\\n\\\n\t<input type=\\\"datetime\\\" name=\\\"${1}\\\" id=\\\"${2:$1}\\\" value=\\\"${3}\\\" />${4}\\n\\\nsnippet input:datetime-local\\n\\\n\t<input type=\\\"datetime-local\\\" name=\\\"${1}\\\" id=\\\"${2:$1}\\\" value=\\\"${3}\\\" />${4}\\n\\\nsnippet input:email\\n\\\n\t<input type=\\\"email\\\" name=\\\"${1}\\\" id=\\\"${2:$1}\\\" value=\\\"${3}\\\" />${4}\\n\\\nsnippet input:file\\n\\\n\t<input type=\\\"file\\\" name=\\\"${1}\\\" id=\\\"${2:$1}\\\" value=\\\"${3}\\\" />${4}\\n\\\nsnippet input:month\\n\\\n\t<input type=\\\"month\\\" name=\\\"${1}\\\" id=\\\"${2:$1}\\\" value=\\\"${3}\\\" />${4}\\n\\\nsnippet input:number\\n\\\n\t<input type=\\\"number\\\" name=\\\"${1}\\\" id=\\\"${2:$1}\\\" value=\\\"${3}\\\" />${4}\\n\\\nsnippet input:password\\n\\\n\t<input type=\\\"password\\\" name=\\\"${1}\\\" id=\\\"${2:$1}\\\" value=\\\"${3}\\\" />${4}\\n\\\nsnippet input:range\\n\\\n\t<input type=\\\"range\\\" name=\\\"${1}\\\" id=\\\"${2:$1}\\\" value=\\\"${3}\\\" />${4}\\n\\\nsnippet input:reset\\n\\\n\t<input type=\\\"reset\\\" name=\\\"${1}\\\" id=\\\"${2:$1}\\\" value=\\\"${3}\\\" />${4}\\n\\\nsnippet input:search\\n\\\n\t<input type=\\\"search\\\" name=\\\"${1}\\\" id=\\\"${2:$1}\\\" value=\\\"${3}\\\" />${4}\\n\\\nsnippet input:time\\n\\\n\t<input type=\\\"time\\\" name=\\\"${1}\\\" id=\\\"${2:$1}\\\" value=\\\"${3}\\\" />${4}\\n\\\nsnippet input:url\\n\\\n\t<input type=\\\"url\\\" name=\\\"${1}\\\" id=\\\"${2:$1}\\\" value=\\\"${3}\\\" />${4}\\n\\\nsnippet input:week\\n\\\n\t<input type=\\\"week\\\" name=\\\"${1}\\\" id=\\\"${2:$1}\\\" value=\\\"${3}\\\" />${4}\\n\\\nsnippet ins\\n\\\n\t<ins>${1}</ins>\\n\\\nsnippet kbd\\n\\\n\t<kbd>${1}</kbd>\\n\\\nsnippet keygen\\n\\\n\t<keygen>${1}</keygen>\\n\\\nsnippet label\\n\\\n\t<label for=\\\"${2:$1}\\\">${1}</label>\\n\\\nsnippet label:i\\n\\\n\t<label for=\\\"${2:$1}\\\">${1}</label>\\n\\\n\t<input type=\\\"${3:text/submit/hidden/button}\\\" name=\\\"${4:$2}\\\" id=\\\"${5:$2}\\\" value=\\\"${6}\\\" />${7}\\n\\\nsnippet label:s\\n\\\n\t<label for=\\\"${2:$1}\\\">${1}</label>\\n\\\n\t<select name=\\\"${3:$2}\\\" id=\\\"${4:$2}\\\">\\n\\\n\t\t<option value=\\\"${5}\\\">${6:$5}</option>\\n\\\n\t</select>\\n\\\nsnippet legend\\n\\\n\t<legend>${1}</legend>\\n\\\nsnippet legend+\\n\\\n\t<legend><span>${1}</span></legend>\\n\\\nsnippet li\\n\\\n\t<li>${1}</li>\\n\\\nsnippet li.\\n\\\n\t<li class=\\\"${1}\\\">${2}</li>\\n\\\nsnippet li+\\n\\\n\t<li>${1}</li>\\n\\\n\tli+${2}\\n\\\nsnippet lia\\n\\\n\t<li><a href=\\\"${2:#}\\\">${1}</a></li>\\n\\\nsnippet lia+\\n\\\n\t<li><a href=\\\"${2:#}\\\">${1}</a></li>\\n\\\n\tlia+${3}\\n\\\nsnippet link\\n\\\n\t<link rel=\\\"${1}\\\" href=\\\"${2}\\\" title=\\\"${3}\\\" type=\\\"${4}\\\" />${5}\\n\\\nsnippet link:atom\\n\\\n\t<link rel=\\\"alternate\\\" href=\\\"${1:atom.xml}\\\" title=\\\"Atom\\\" type=\\\"application/atom+xml\\\" />${2}\\n\\\nsnippet link:css\\n\\\n\t<link rel=\\\"stylesheet\\\" href=\\\"${2:style.css}\\\" type=\\\"text/css\\\" media=\\\"${3:all}\\\" />${4}\\n\\\nsnippet link:favicon\\n\\\n\t<link rel=\\\"shortcut icon\\\" href=\\\"${1:favicon.ico}\\\" type=\\\"image/x-icon\\\" />${2}\\n\\\nsnippet link:rss\\n\\\n\t<link rel=\\\"alternate\\\" href=\\\"${1:rss.xml}\\\" title=\\\"RSS\\\" type=\\\"application/atom+xml\\\" />${2}\\n\\\nsnippet link:touch\\n\\\n\t<link rel=\\\"apple-touch-icon\\\" href=\\\"${1:favicon.png}\\\" />${2}\\n\\\nsnippet map\\n\\\n\t<map name=\\\"${1}\\\">\\n\\\n\t\t${2}\\n\\\n\t</map>\\n\\\nsnippet map.\\n\\\n\t<map class=\\\"${1}\\\" name=\\\"${2}\\\">\\n\\\n\t\t${3}\\n\\\n\t</map>\\n\\\nsnippet map#\\n\\\n\t<map name=\\\"${1}\\\" id=\\\"${2:$1}>\\n\\\n\t\t${3}\\n\\\n\t</map>\\n\\\nsnippet map+\\n\\\n\t<map name=\\\"${1}\\\">\\n\\\n\t\t<area shape=\\\"${2}\\\" coords=\\\"${3}\\\" href=\\\"${4}\\\" alt=\\\"${5}\\\" />${6}\\n\\\n\t</map>${7}\\n\\\nsnippet mark\\n\\\n\t<mark>${1}</mark>\\n\\\nsnippet menu\\n\\\n\t<menu>\\n\\\n\t\t${1}\\n\\\n\t</menu>\\n\\\nsnippet menu:c\\n\\\n\t<menu type=\\\"context\\\">\\n\\\n\t\t${1}\\n\\\n\t</menu>\\n\\\nsnippet menu:t\\n\\\n\t<menu type=\\\"toolbar\\\">\\n\\\n\t\t${1}\\n\\\n\t</menu>\\n\\\nsnippet meta\\n\\\n\t<meta http-equiv=\\\"${1}\\\" content=\\\"${2}\\\" />${3}\\n\\\nsnippet meta:compat\\n\\\n\t<meta http-equiv=\\\"X-UA-Compatible\\\" content=\\\"IE=${1:7,8,edge}\\\" />${3}\\n\\\nsnippet meta:refresh\\n\\\n\t<meta http-equiv=\\\"refresh\\\" content=\\\"text/html;charset=UTF-8\\\" />${3}\\n\\\nsnippet meta:utf\\n\\\n\t<meta http-equiv=\\\"content-type\\\" content=\\\"text/html;charset=UTF-8\\\" />${3}\\n\\\nsnippet meter\\n\\\n\t<meter>${1}</meter>\\n\\\nsnippet nav\\n\\\n\t<nav>\\n\\\n\t\t${1}\\n\\\n\t</nav>\\n\\\nsnippet nav.\\n\\\n\t<nav class=\\\"${1}\\\">\\n\\\n\t\t${2}\\n\\\n\t</nav>\\n\\\nsnippet nav#\\n\\\n\t<nav id=\\\"${1}\\\">\\n\\\n\t\t${2}\\n\\\n\t</nav>\\n\\\nsnippet noscript\\n\\\n\t<noscript>\\n\\\n\t\t${1}\\n\\\n\t</noscript>\\n\\\nsnippet object\\n\\\n\t<object data=\\\"${1}\\\" type=\\\"${2}\\\">\\n\\\n\t\t${3}\\n\\\n\t</object>${4}\\n\\\n# Embed QT Movie\\n\\\nsnippet movie\\n\\\n\t<object width=\\\"$2\\\" height=\\\"$3\\\" classid=\\\"clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B\\\"\\n\\\n\t codebase=\\\"http://www.apple.com/qtactivex/qtplugin.cab\\\">\\n\\\n\t\t<param name=\\\"src\\\" value=\\\"$1\\\" />\\n\\\n\t\t<param name=\\\"controller\\\" value=\\\"$4\\\" />\\n\\\n\t\t<param name=\\\"autoplay\\\" value=\\\"$5\\\" />\\n\\\n\t\t<embed src=\\\"${1:movie.mov}\\\"\\n\\\n\t\t\twidth=\\\"${2:320}\\\" height=\\\"${3:240}\\\"\\n\\\n\t\t\tcontroller=\\\"${4:true}\\\" autoplay=\\\"${5:true}\\\"\\n\\\n\t\t\tscale=\\\"tofit\\\" cache=\\\"true\\\"\\n\\\n\t\t\tpluginspage=\\\"http://www.apple.com/quicktime/download/\\\" />\\n\\\n\t</object>${6}\\n\\\nsnippet ol\\n\\\n\t<ol>\\n\\\n\t\t${1}\\n\\\n\t</ol>\\n\\\nsnippet ol.\\n\\\n\t<ol class=\\\"${1}>\\n\\\n\t\t${2}\\n\\\n\t</ol>\\n\\\nsnippet ol#\\n\\\n\t<ol id=\\\"${1}>\\n\\\n\t\t${2}\\n\\\n\t</ol>\\n\\\nsnippet ol+\\n\\\n\t<ol>\\n\\\n\t\t<li>${1}</li>\\n\\\n\t\tli+${2}\\n\\\n\t</ol>\\n\\\nsnippet opt\\n\\\n\t<option value=\\\"${1}\\\">${2:$1}</option>\\n\\\nsnippet opt+\\n\\\n\t<option value=\\\"${1}\\\">${2:$1}</option>\\n\\\n\topt+${3}\\n\\\nsnippet optt\\n\\\n\t<option>${1}</option>\\n\\\nsnippet optgroup\\n\\\n\t<optgroup>\\n\\\n\t\t<option value=\\\"${1}\\\">${2:$1}</option>\\n\\\n\t\topt+${3}\\n\\\n\t</optgroup>\\n\\\nsnippet output\\n\\\n\t<output>${1}</output>\\n\\\nsnippet p\\n\\\n\t<p>${1}</p>\\n\\\nsnippet param\\n\\\n\t<param name=\\\"${1}\\\" value=\\\"${2}\\\" />${3}\\n\\\nsnippet pre\\n\\\n\t<pre>\\n\\\n\t\t${1}\\n\\\n\t</pre>\\n\\\nsnippet progress\\n\\\n\t<progress>${1}</progress>\\n\\\nsnippet q\\n\\\n\t<q>${1}</q>\\n\\\nsnippet rp\\n\\\n\t<rp>${1}</rp>\\n\\\nsnippet rt\\n\\\n\t<rt>${1}</rt>\\n\\\nsnippet ruby\\n\\\n\t<ruby>\\n\\\n\t\t<rp><rt>${1}</rt></rp>\\n\\\n\t</ruby>\\n\\\nsnippet s\\n\\\n\t<s>${1}</s>\\n\\\nsnippet samp\\n\\\n\t<samp>\\n\\\n\t\t${1}\\n\\\n\t</samp>\\n\\\nsnippet script\\n\\\n\t<script type=\\\"text/javascript\\\" charset=\\\"utf-8\\\">\\n\\\n\t\t${1}\\n\\\n\t</script>\\n\\\nsnippet scriptsrc\\n\\\n\t<script src=\\\"${1}.js\\\" type=\\\"text/javascript\\\" charset=\\\"utf-8\\\"></script>\\n\\\nsnippet section\\n\\\n\t<section>\\n\\\n\t\t${1}\\n\\\n\t</section>\\n\\\nsnippet section.\\n\\\n\t<section class=\\\"${1}\\\">\\n\\\n\t\t${2}\\n\\\n\t</section>\\n\\\nsnippet section#\\n\\\n\t<section id=\\\"${1}\\\">\\n\\\n\t\t${2}\\n\\\n\t</section>\\n\\\nsnippet select\\n\\\n\t<select name=\\\"${1}\\\" id=\\\"${2:$1}\\\">\\n\\\n\t\t${3}\\n\\\n\t</select>\\n\\\nsnippet select.\\n\\\n\t<select name=\\\"${1}\\\" id=\\\"${2:$1}\\\" class=\\\"${3}>\\n\\\n\t\t${4}\\n\\\n\t</select>\\n\\\nsnippet select+\\n\\\n\t<select name=\\\"${1}\\\" id=\\\"${2:$1}\\\">\\n\\\n\t\t<option value=\\\"${3}\\\">${4:$3}</option>\\n\\\n\t\topt+${5}\\n\\\n\t</select>\\n\\\nsnippet small\\n\\\n\t<small>${1}</small>\\n\\\nsnippet source\\n\\\n\t<source src=\\\"${1}\\\" type=\\\"${2}\\\" media=\\\"${3}\\\" />\\n\\\nsnippet span\\n\\\n\t<span>${1}</span>\\n\\\nsnippet strong\\n\\\n\t<strong>${1}</strong>\\n\\\nsnippet style\\n\\\n\t<style type=\\\"text/css\\\" media=\\\"${1:all}\\\">\\n\\\n\t\t${2}\\n\\\n\t</style>\\n\\\nsnippet sub\\n\\\n\t<sub>${1}</sub>\\n\\\nsnippet summary\\n\\\n\t<summary>\\n\\\n\t\t${1}\\n\\\n\t</summary>\\n\\\nsnippet sup\\n\\\n\t<sup>${1}</sup>\\n\\\nsnippet table\\n\\\n\t<table border=\\\"${1:0}\\\">\\n\\\n\t\t${2}\\n\\\n\t</table>\\n\\\nsnippet table.\\n\\\n\t<table class=\\\"${1}\\\" border=\\\"${2:0}\\\">\\n\\\n\t\t${3}\\n\\\n\t</table>\\n\\\nsnippet table#\\n\\\n\t<table id=\\\"${1}\\\" border=\\\"${2:0}\\\">\\n\\\n\t\t${3}\\n\\\n\t</table>\\n\\\nsnippet tbody\\n\\\n\t<tbody>\\n\\\n\t\t${1}\\n\\\n\t</tbody>\\n\\\nsnippet td\\n\\\n\t<td>${1}</td>\\n\\\nsnippet td.\\n\\\n\t<td class=\\\"${1}\\\">${2}</td>\\n\\\nsnippet td#\\n\\\n\t<td id=\\\"${1}\\\">${2}</td>\\n\\\nsnippet td+\\n\\\n\t<td>${1}</td>\\n\\\n\ttd+${2}\\n\\\nsnippet textarea\\n\\\n\t<textarea name=\\\"${1}\\\" id=${2:$1} rows=\\\"${3:8}\\\" cols=\\\"${4:40}\\\">${5}</textarea>${6}\\n\\\nsnippet tfoot\\n\\\n\t<tfoot>\\n\\\n\t\t${1}\\n\\\n\t</tfoot>\\n\\\nsnippet th\\n\\\n\t<th>${1}</th>\\n\\\nsnippet th.\\n\\\n\t<th class=\\\"${1}\\\">${2}</th>\\n\\\nsnippet th#\\n\\\n\t<th id=\\\"${1}\\\">${2}</th>\\n\\\nsnippet th+\\n\\\n\t<th>${1}</th>\\n\\\n\tth+${2}\\n\\\nsnippet thead\\n\\\n\t<thead>\\n\\\n\t\t${1}\\n\\\n\t</thead>\\n\\\nsnippet time\\n\\\n\t<time datetime=\\\"${1}\\\" pubdate=\\\"${2:$1}>${3:$1}</time>\\n\\\nsnippet title\\n\\\n\t<title>${1:`substitute(Filename('', 'Page Title'), '^.', '\\\\u&', '')`}</title>\\n\\\nsnippet tr\\n\\\n\t<tr>\\n\\\n\t\t${1}\\n\\\n\t</tr>\\n\\\nsnippet tr+\\n\\\n\t<tr>\\n\\\n\t\t<td>${1}</td>\\n\\\n\t\ttd+${2}\\n\\\n\t</tr>\\n\\\nsnippet track\\n\\\n\t<track src=\\\"${1}\\\" srclang=\\\"${2}\\\" label=\\\"${3}\\\" default=\\\"${4:default}>${5}</track>${6}\\n\\\nsnippet ul\\n\\\n\t<ul>\\n\\\n\t\t${1}\\n\\\n\t</ul>\\n\\\nsnippet ul.\\n\\\n\t<ul class=\\\"${1}\\\">\\n\\\n\t\t${2}\\n\\\n\t</ul>\\n\\\nsnippet ul#\\n\\\n\t<ul id=\\\"${1}\\\">\\n\\\n\t\t${2}\\n\\\n\t</ul>\\n\\\nsnippet ul+\\n\\\n\t<ul>\\n\\\n\t\t<li>${1}</li>\\n\\\n\t\tli+${2}\\n\\\n\t</ul>\\n\\\nsnippet var\\n\\\n\t<var>${1}</var>\\n\\\nsnippet video\\n\\\n\t<video src=\\\"${1} height=\\\"${2}\\\" width=\\\"${3}\\\" preload=\\\"${5:none}\\\" autoplay=\\\"${6:autoplay}>${7}</video>${8}\\n\\\nsnippet wbr\\n\\\n\t<wbr />${1}\\n\\\n\";\nexports.scope = \"html\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/html_ruby.js",
    "content": "ace.define(\"ace/snippets/html_ruby\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"html_ruby\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/ini.js",
    "content": "ace.define(\"ace/snippets/ini\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"ini\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/io.js",
    "content": "ace.define(\"ace/snippets/io\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippets = [\n    {\n        \"content\": \"assertEquals(${1:expected}, ${2:expr})\",\n        \"name\": \"assertEquals\",\n        \"scope\": \"io\",\n        \"tabTrigger\": \"ae\"\n    },\n    {\n        \"content\": \"${1:${2:newValue} := ${3:Object} }clone do(\\n\\t$0\\n)\",\n        \"name\": \"clone do\",\n        \"scope\": \"io\",\n        \"tabTrigger\": \"cdo\"\n    },\n    {\n        \"content\": \"docSlot(\\\"${1:slotName}\\\", \\\"${2:documentation}\\\")\",\n        \"name\": \"docSlot\",\n        \"scope\": \"io\",\n        \"tabTrigger\": \"ds\"\n    },\n    {\n        \"content\": \"(${1:header,}\\n\\t${2:body}\\n)$0\",\n        \"keyEquivalent\": \"@(\",\n        \"name\": \"Indented Bracketed Line\",\n        \"scope\": \"io\",\n        \"tabTrigger\": \"(\"\n    },\n    {\n        \"content\": \"\\n\\t$0\\n\",\n        \"keyEquivalent\": \"\\r\",\n        \"name\": \"Special: Return Inside Empty Parenthesis\",\n        \"scope\": \"io meta.empty-parenthesis.io, io meta.comma-parenthesis.io\"\n    },\n    {\n        \"content\": \"${1:methodName} := method(${2:args,}\\n\\t$0\\n)\",\n        \"name\": \"method\",\n        \"scope\": \"io\",\n        \"tabTrigger\": \"m\"\n    },\n    {\n        \"content\": \"newSlot(\\\"${1:slotName}\\\", ${2:defaultValue}, \\\"${3:docString}\\\")$0\",\n        \"name\": \"newSlot\",\n        \"scope\": \"io\",\n        \"tabTrigger\": \"ns\"\n    },\n    {\n        \"content\": \"${1:name} := Object clone do(\\n\\t$0\\n)\",\n        \"name\": \"Object clone do\",\n        \"scope\": \"io\",\n        \"tabTrigger\": \"ocdo\"\n    },\n    {\n        \"content\": \"test${1:SomeFeature} := method(\\n\\t$0\\n)\",\n        \"name\": \"testMethod\",\n        \"scope\": \"io\",\n        \"tabTrigger\": \"ts\"\n    },\n    {\n        \"content\": \"${1:Something}Test := ${2:UnitTest} clone do(\\n\\t$0\\n)\",\n        \"name\": \"UnitTest\",\n        \"scope\": \"io\",\n        \"tabTrigger\": \"ut\"\n    }\n];\nexports.scope = \"io\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/jack.js",
    "content": "ace.define(\"ace/snippets/jack\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"jack\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/jade.js",
    "content": "ace.define(\"ace/snippets/jade\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"jade\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/java.js",
    "content": "ace.define(\"ace/snippets/java\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"## Access Modifiers\\n\\\nsnippet po\\n\\\n\tprotected\\n\\\nsnippet pu\\n\\\n\tpublic\\n\\\nsnippet pr\\n\\\n\tprivate\\n\\\n##\\n\\\n## Annotations\\n\\\nsnippet before\\n\\\n\t@Before\\n\\\n\tstatic void ${1:intercept}(${2:args}) { ${3} }\\n\\\nsnippet mm\\n\\\n\t@ManyToMany\\n\\\n\t${1}\\n\\\nsnippet mo\\n\\\n\t@ManyToOne\\n\\\n\t${1}\\n\\\nsnippet om\\n\\\n\t@OneToMany${1:(cascade=CascadeType.ALL)}\\n\\\n\t${2}\\n\\\nsnippet oo\\n\\\n\t@OneToOne\\n\\\n\t${1}\\n\\\n##\\n\\\n## Basic Java packages and import\\n\\\nsnippet im\\n\\\n\timport\\n\\\nsnippet j.b\\n\\\n\tjava.beans.\\n\\\nsnippet j.i\\n\\\n\tjava.io.\\n\\\nsnippet j.m\\n\\\n\tjava.math.\\n\\\nsnippet j.n\\n\\\n\tjava.net.\\n\\\nsnippet j.u\\n\\\n\tjava.util.\\n\\\n##\\n\\\n## Class\\n\\\nsnippet cl\\n\\\n\tclass ${1:`Filename(\\\"\\\", \\\"untitled\\\")`} ${2}\\n\\\nsnippet in\\n\\\n\tinterface ${1:`Filename(\\\"\\\", \\\"untitled\\\")`} ${2:extends Parent}${3}\\n\\\nsnippet tc\\n\\\n\tpublic class ${1:`Filename()`} extends ${2:TestCase}\\n\\\n##\\n\\\n## Class Enhancements\\n\\\nsnippet ext\\n\\\n\textends \\n\\\nsnippet imp\\n\\\n\timplements\\n\\\n##\\n\\\n## Comments\\n\\\nsnippet /*\\n\\\n##\\n\\\n## Constants\\n\\\nsnippet co\\n\\\n\tstatic public final ${1:String} ${2:var} = ${3};${4}\\n\\\nsnippet cos\\n\\\n\tstatic public final String ${1:var} = \\\"${2}\\\";${3}\\n\\\n##\\n\\\n## Control Statements\\n\\\nsnippet case\\n\\\n\tcase ${1}:\\n\\\n\t\t${2}\\n\\\nsnippet def\\n\\\n\tdefault:\\n\\\n\t\t${2}\\n\\\nsnippet el\\n\\\n\telse\\n\\\nsnippet elif\\n\\\n\telse if (${1}) ${2}\\n\\\nsnippet if\\n\\\n\tif (${1}) ${2}\\n\\\nsnippet sw\\n\\\n\tswitch (${1}) {\\n\\\n\t\t${2}\\n\\\n\t}\\n\\\n##\\n\\\n## Create a Method\\n\\\nsnippet m\\n\\\n\t${1:void} ${2:method}(${3}) ${4:throws }${5}\\n\\\n##\\n\\\n## Create a Variable\\n\\\nsnippet v\\n\\\n\t${1:String} ${2:var}${3: = null}${4};${5}\\n\\\n##\\n\\\n## Enhancements to Methods, variables, classes, etc.\\n\\\nsnippet ab\\n\\\n\tabstract\\n\\\nsnippet fi\\n\\\n\tfinal\\n\\\nsnippet st\\n\\\n\tstatic\\n\\\nsnippet sy\\n\\\n\tsynchronized\\n\\\n##\\n\\\n## Error Methods\\n\\\nsnippet err\\n\\\n\tSystem.err.print(\\\"${1:Message}\\\");\\n\\\nsnippet errf\\n\\\n\tSystem.err.printf(\\\"${1:Message}\\\", ${2:exception});\\n\\\nsnippet errln\\n\\\n\tSystem.err.println(\\\"${1:Message}\\\");\\n\\\n##\\n\\\n## Exception Handling\\n\\\nsnippet as\\n\\\n\tassert ${1:test} : \\\"${2:Failure message}\\\";${3}\\n\\\nsnippet ca\\n\\\n\tcatch(${1:Exception} ${2:e}) ${3}\\n\\\nsnippet thr\\n\\\n\tthrow\\n\\\nsnippet ths\\n\\\n\tthrows\\n\\\nsnippet try\\n\\\n\ttry {\\n\\\n\t\t${3}\\n\\\n\t} catch(${1:Exception} ${2:e}) {\\n\\\n\t}\\n\\\nsnippet tryf\\n\\\n\ttry {\\n\\\n\t\t${3}\\n\\\n\t} catch(${1:Exception} ${2:e}) {\\n\\\n\t} finally {\\n\\\n\t}\\n\\\n##\\n\\\n## Find Methods\\n\\\nsnippet findall\\n\\\n\tList<${1:listName}> ${2:items} = ${1}.findAll();${3}\\n\\\nsnippet findbyid\\n\\\n\t${1:var} ${2:item} = ${1}.findById(${3});${4}\\n\\\n##\\n\\\n## Javadocs\\n\\\nsnippet /**\\n\\\nsnippet @au\\n\\\n\t@author `system(\\\"grep \\\\`id -un\\\\` /etc/passwd | cut -d \\\\\\\":\\\\\\\" -f5 | cut -d \\\\\\\",\\\\\\\" -f1\\\")`\\n\\\nsnippet @br\\n\\\n\t@brief ${1:Description}\\n\\\nsnippet @fi\\n\\\n\t@file ${1:`Filename()`}.java\\n\\\nsnippet @pa\\n\\\n\t@param ${1:param}\\n\\\nsnippet @re\\n\\\n\t@return ${1:param}\\n\\\n##\\n\\\n## Logger Methods\\n\\\nsnippet debug\\n\\\n\tLogger.debug(${1:param});${2}\\n\\\nsnippet error\\n\\\n\tLogger.error(${1:param});${2}\\n\\\nsnippet info\\n\\\n\tLogger.info(${1:param});${2}\\n\\\nsnippet warn\\n\\\n\tLogger.warn(${1:param});${2}\\n\\\n##\\n\\\n## Loops\\n\\\nsnippet enfor\\n\\\n\tfor (${1} : ${2}) ${3}\\n\\\nsnippet for\\n\\\n\tfor (${1}; ${2}; ${3}) ${4}\\n\\\nsnippet wh\\n\\\n\twhile (${1}) ${2}\\n\\\n##\\n\\\n## Main method\\n\\\nsnippet main\\n\\\n\tpublic static void main (String[] args) {\\n\\\n\t\t${1:/* code */}\\n\\\n\t}\\n\\\n##\\n\\\n## Print Methods\\n\\\nsnippet print\\n\\\n\tSystem.out.print(\\\"${1:Message}\\\");\\n\\\nsnippet printf\\n\\\n\tSystem.out.printf(\\\"${1:Message}\\\", ${2:args});\\n\\\nsnippet println\\n\\\n\tSystem.out.println(${1});\\n\\\n##\\n\\\n## Render Methods\\n\\\nsnippet ren\\n\\\n\trender(${1:param});${2}\\n\\\nsnippet rena\\n\\\n\trenderArgs.put(\\\"${1}\\\", ${2});${3}\\n\\\nsnippet renb\\n\\\n\trenderBinary(${1:param});${2}\\n\\\nsnippet renj\\n\\\n\trenderJSON(${1:param});${2}\\n\\\nsnippet renx\\n\\\n\trenderXml(${1:param});${2}\\n\\\n##\\n\\\n## Setter and Getter Methods\\n\\\nsnippet set\\n\\\n\t${1:public} void set${3:}(${2:String} ${4:}){\\n\\\n\t\tthis.$4 = $4;\\n\\\n\t}\\n\\\nsnippet get\\n\\\n\t${1:public} ${2:String} get${3:}(){\\n\\\n\t\treturn this.${4:};\\n\\\n\t}\\n\\\n##\\n\\\n## Terminate Methods or Loops\\n\\\nsnippet re\\n\\\n\treturn\\n\\\nsnippet br\\n\\\n\tbreak;\\n\\\n##\\n\\\n## Test Methods\\n\\\nsnippet t\\n\\\n\tpublic void test${1:Name}() throws Exception {\\n\\\n\t\t${2}\\n\\\n\t}\\n\\\nsnippet test\\n\\\n\t@Test\\n\\\n\tpublic void test${1:Name}() throws Exception {\\n\\\n\t\t${2}\\n\\\n\t}\\n\\\n##\\n\\\n## Utils\\n\\\nsnippet Sc\\n\\\n\tScanner\\n\\\n##\\n\\\n## Miscellaneous\\n\\\nsnippet action\\n\\\n\tpublic static void ${1:index}(${2:args}) { ${3} }\\n\\\nsnippet rnf\\n\\\n\tnotFound(${1:param});${2}\\n\\\nsnippet rnfin\\n\\\n\tnotFoundIfNull(${1:param});${2}\\n\\\nsnippet rr\\n\\\n\tredirect(${1:param});${2}\\n\\\nsnippet ru\\n\\\n\tunauthorized(${1:param});${2}\\n\\\nsnippet unless\\n\\\n\t(unless=${1:param});${2}\\n\\\n\";\nexports.scope = \"java\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/javascript.js",
    "content": "ace.define(\"ace/snippets/javascript\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"# Prototype\\n\\\nsnippet proto\\n\\\n\t${1:class_name}.prototype.${2:method_name} = function(${3:first_argument}) {\\n\\\n\t\t${4:// body...}\\n\\\n\t};\\n\\\n# Function\\n\\\nsnippet fun\\n\\\n\tfunction ${1?:function_name}(${2:argument}) {\\n\\\n\t\t${3:// body...}\\n\\\n\t}\\n\\\n# Anonymous Function\\n\\\nregex /((=)\\\\s*|(:)\\\\s*|(\\\\()|\\\\b)/f/(\\\\))?/\\n\\\nsnippet f\\n\\\n\tfunction${M1?: ${1:functionName}}($2) {\\n\\\n\t\t${0:$TM_SELECTED_TEXT}\\n\\\n\t}${M2?;}${M3?,}${M4?)}\\n\\\n# Immediate function\\n\\\ntrigger \\\\(?f\\\\(\\n\\\nendTrigger \\\\)?\\n\\\nsnippet f(\\n\\\n\t(function(${1}) {\\n\\\n\t\t${0:${TM_SELECTED_TEXT:/* code */}}\\n\\\n\t}(${1}));\\n\\\n# if\\n\\\nsnippet if\\n\\\n\tif (${1:true}) {\\n\\\n\t\t${0}\\n\\\n\t}\\n\\\n# if ... else\\n\\\nsnippet ife\\n\\\n\tif (${1:true}) {\\n\\\n\t\t${2}\\n\\\n\t} else {\\n\\\n\t\t${0}\\n\\\n\t}\\n\\\n# tertiary conditional\\n\\\nsnippet ter\\n\\\n\t${1:/* condition */} ? ${2:a} : ${3:b}\\n\\\n# switch\\n\\\nsnippet switch\\n\\\n\tswitch (${1:expression}) {\\n\\\n\t\tcase '${3:case}':\\n\\\n\t\t\t${4:// code}\\n\\\n\t\t\tbreak;\\n\\\n\t\t${5}\\n\\\n\t\tdefault:\\n\\\n\t\t\t${2:// code}\\n\\\n\t}\\n\\\n# case\\n\\\nsnippet case\\n\\\n\tcase '${1:case}':\\n\\\n\t\t${2:// code}\\n\\\n\t\tbreak;\\n\\\n\t${3}\\n\\\n\\n\\\n# while (...) {...}\\n\\\nsnippet wh\\n\\\n\twhile (${1:/* condition */}) {\\n\\\n\t\t${0:/* code */}\\n\\\n\t}\\n\\\n# try\\n\\\nsnippet try\\n\\\n\ttry {\\n\\\n\t\t${0:/* code */}\\n\\\n\t} catch (e) {}\\n\\\n# do...while\\n\\\nsnippet do\\n\\\n\tdo {\\n\\\n\t\t${2:/* code */}\\n\\\n\t} while (${1:/* condition */});\\n\\\n# Object Method\\n\\\nsnippet :f\\n\\\nregex /([,{[])|^\\\\s*/:f/\\n\\\n\t${1:method_name}: function(${2:attribute}) {\\n\\\n\t\t${0}\\n\\\n\t}${3:,}\\n\\\n# setTimeout function\\n\\\nsnippet setTimeout\\n\\\nregex /\\\\b/st|timeout|setTimeo?u?t?/\\n\\\n\tsetTimeout(function() {${3:$TM_SELECTED_TEXT}}, ${1:10});\\n\\\n# Get Elements\\n\\\nsnippet gett\\n\\\n\tgetElementsBy${1:TagName}('${2}')${3}\\n\\\n# Get Element\\n\\\nsnippet get\\n\\\n\tgetElementBy${1:Id}('${2}')${3}\\n\\\n# console.log (Firebug)\\n\\\nsnippet cl\\n\\\n\tconsole.log(${1});\\n\\\n# return\\n\\\nsnippet ret\\n\\\n\treturn ${1:result}\\n\\\n# for (property in object ) { ... }\\n\\\nsnippet fori\\n\\\n\tfor (var ${1:prop} in ${2:Things}) {\\n\\\n\t\t${0:$2[$1]}\\n\\\n\t}\\n\\\n# hasOwnProperty\\n\\\nsnippet has\\n\\\n\thasOwnProperty(${1})\\n\\\n# docstring\\n\\\nsnippet /**\\n\\\nsnippet @par\\n\\\nregex /^\\\\s*\\\\*\\\\s*/@(para?m?)?/\\n\\\n\t@param {${1:type}} ${2:name} ${3:description}\\n\\\nsnippet @ret\\n\\\n\t@return {${1:type}} ${2:description}\\n\\\n# JSON.parse\\n\\\nsnippet jsonp\\n\\\n\tJSON.parse(${1:jstr});\\n\\\n# JSON.stringify\\n\\\nsnippet jsons\\n\\\n\tJSON.stringify(${1:object});\\n\\\n# self-defining function\\n\\\nsnippet sdf\\n\\\n\tvar ${1:function_name} = function(${2:argument}) {\\n\\\n\t\t${3:// initial code ...}\\n\\\n\\n\\\n\t\t$1 = function($2) {\\n\\\n\t\t\t${4:// main code}\\n\\\n\t\t};\\n\\\n\t}\\n\\\n# singleton\\n\\\nsnippet sing\\n\\\n\tfunction ${1:Singleton} (${2:argument}) {\\n\\\n\t\tvar instance;\\n\\\n\t\t$1 = function $1($2) {\\n\\\n\t\t\treturn instance;\\n\\\n\t\t};\\n\\\n\t\t$1.prototype = this;\\n\\\n\t\tinstance = new $1();\\n\\\n\t\tinstance.constructor = $1;\\n\\\n\\n\\\n\t\t${3:// code ...}\\n\\\n\\n\\\n\t\treturn instance;\\n\\\n\t}\\n\\\n# class\\n\\\nsnippet class\\n\\\nregex /^\\\\s*/clas{0,2}/\\n\\\n\tvar ${1:class} = function(${20}) {\\n\\\n\t\t$40$0\\n\\\n\t};\\n\\\n\t\\n\\\n\t(function() {\\n\\\n\t\t${60:this.prop = \\\"\\\"}\\n\\\n\t}).call(${1:class}.prototype);\\n\\\n\t\\n\\\n\texports.${1:class} = ${1:class};\\n\\\n# \\n\\\nsnippet for-\\n\\\n\tfor (var ${1:i} = ${2:Things}.length; ${1:i}--; ) {\\n\\\n\t\t${0:${2:Things}[${1:i}];}\\n\\\n\t}\\n\\\n# for (...) {...}\\n\\\nsnippet for\\n\\\n\tfor (var ${1:i} = 0; $1 < ${2:Things}.length; $1++) {\\n\\\n\t\t${3:$2[$1]}$0\\n\\\n\t}\\n\\\n# for (...) {...} (Improved Native For-Loop)\\n\\\nsnippet forr\\n\\\n\tfor (var ${1:i} = ${2:Things}.length - 1; $1 >= 0; $1--) {\\n\\\n\t\t${3:$2[$1]}$0\\n\\\n\t}\\n\\\n\\n\\\n\\n\\\n#modules\\n\\\nsnippet def\\n\\\n\tace.define(function(require, exports, module) {\\n\\\n\t\\\"use strict\\\";\\n\\\n\tvar ${1/.*\\\\///} = require(\\\"${1}\\\");\\n\\\n\t\\n\\\n\t$TM_SELECTED_TEXT\\n\\\n\t});\\n\\\nsnippet req\\n\\\nguard ^\\\\s*\\n\\\n\tvar ${1/.*\\\\///} = require(\\\"${1}\\\");\\n\\\n\t$0\\n\\\nsnippet requ\\n\\\nguard ^\\\\s*\\n\\\n\tvar ${1/.*\\\\/(.)/\\\\u$1/} = require(\\\"${1}\\\").${1/.*\\\\/(.)/\\\\u$1/};\\n\\\n\t$0\\n\\\n\";\nexports.scope = \"javascript\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/json.js",
    "content": "ace.define(\"ace/snippets/json\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"json\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/jsoniq.js",
    "content": "ace.define(\"ace/snippets/jsoniq\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"snippet for\\n\\\n\tfor $${1:item} in ${2:expr}\\n\\\nsnippet return\\n\\\n\treturn ${1:expr}\\n\\\nsnippet import\\n\\\n\timport module namespace ${1:ns} = \\\"${2:http://www.example.com/}\\\";\\n\\\nsnippet some\\n\\\n\tsome $${1:varname} in ${2:expr} satisfies ${3:expr}\\n\\\nsnippet every\\n\\\n\tevery $${1:varname} in ${2:expr} satisfies ${3:expr}\\n\\\nsnippet if\\n\\\n\tif(${1:true}) then ${2:expr} else ${3:true}\\n\\\nsnippet switch\\n\\\n\tswitch(${1:\\\"foo\\\"})\\n\\\n\tcase ${2:\\\"foo\\\"}\\n\\\n\treturn ${3:true}\\n\\\n\tdefault return ${4:false}\\n\\\nsnippet try\\n\\\n\ttry { ${1:expr} } catch ${2:*} { ${3:expr} }\\n\\\nsnippet tumbling\\n\\\n\tfor tumbling window $${1:varname} in ${2:expr}\\n\\\n\tstart at $${3:start} when ${4:expr}\\n\\\n\tend at $${5:end} when ${6:expr}\\n\\\n\treturn ${7:expr}\\n\\\nsnippet sliding\\n\\\n\tfor sliding window $${1:varname} in ${2:expr}\\n\\\n\tstart at $${3:start} when ${4:expr}\\n\\\n\tend at $${5:end} when ${6:expr}\\n\\\n\treturn ${7:expr}\\n\\\nsnippet let\\n\\\n\tlet $${1:varname} := ${2:expr}\\n\\\nsnippet group\\n\\\n\tgroup by $${1:varname} := ${2:expr}\\n\\\nsnippet order\\n\\\n\torder by ${1:expr} ${2:descending}\\n\\\nsnippet stable\\n\\\n\tstable order by ${1:expr}\\n\\\nsnippet count\\n\\\n\tcount $${1:varname}\\n\\\nsnippet ordered\\n\\\n\tordered { ${1:expr} }\\n\\\nsnippet unordered\\n\\\n\tunordered { ${1:expr} }\\n\\\nsnippet treat \\n\\\n\ttreat as ${1:expr}\\n\\\nsnippet castable\\n\\\n\tcastable as ${1:atomicType}\\n\\\nsnippet cast\\n\\\n\tcast as ${1:atomicType}\\n\\\nsnippet typeswitch\\n\\\n\ttypeswitch(${1:expr})\\n\\\n\tcase ${2:type}  return ${3:expr}\\n\\\n\tdefault return ${4:expr}\\n\\\nsnippet var\\n\\\n\tdeclare variable $${1:varname} := ${2:expr};\\n\\\nsnippet fn\\n\\\n\tdeclare function ${1:ns}:${2:name}(){\\n\\\n\t${3:expr}\\n\\\n\t};\\n\\\nsnippet module\\n\\\n\tmodule namespace ${1:ns} = \\\"${2:http://www.example.com}\\\";\\n\\\n\";\nexports.scope = \"jsoniq\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/jsp.js",
    "content": "ace.define(\"ace/snippets/jsp\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"snippet @page\\n\\\n\t<%@page contentType=\\\"text/html\\\" pageEncoding=\\\"UTF-8\\\"%>\\n\\\nsnippet jstl\\n\\\n\t<%@ taglib uri=\\\"http://java.sun.com/jsp/jstl/core\\\" prefix=\\\"c\\\" %>\\n\\\n\t<%@ taglib uri=\\\"http://java.sun.com/jsp/jstl/functions\\\" prefix=\\\"fn\\\" %>\\n\\\nsnippet jstl:c\\n\\\n\t<%@ taglib uri=\\\"http://java.sun.com/jsp/jstl/core\\\" prefix=\\\"c\\\" %>\\n\\\nsnippet jstl:fn\\n\\\n\t<%@ taglib uri=\\\"http://java.sun.com/jsp/jstl/functions\\\" prefix=\\\"fn\\\" %>\\n\\\nsnippet cpath\\n\\\n\t${pageContext.request.contextPath}\\n\\\nsnippet cout\\n\\\n\t<c:out value=\\\"${1}\\\" default=\\\"${2}\\\" />\\n\\\nsnippet cset\\n\\\n\t<c:set var=\\\"${1}\\\" value=\\\"${2}\\\" />\\n\\\nsnippet cremove\\n\\\n\t<c:remove var=\\\"${1}\\\" scope=\\\"${2:page}\\\" />\\n\\\nsnippet ccatch\\n\\\n\t<c:catch var=\\\"${1}\\\" />\\n\\\nsnippet cif\\n\\\n\t<c:if test=\\\"${${1}}\\\">\\n\\\n\t\t${2}\\n\\\n\t</c:if>\\n\\\nsnippet cchoose\\n\\\n\t<c:choose>\\n\\\n\t\t${1}\\n\\\n\t</c:choose>\\n\\\nsnippet cwhen\\n\\\n\t<c:when test=\\\"${${1}}\\\">\\n\\\n\t\t${2}\\n\\\n\t</c:when>\\n\\\nsnippet cother\\n\\\n\t<c:otherwise>\\n\\\n\t\t${1}\\n\\\n\t</c:otherwise>\\n\\\nsnippet cfore\\n\\\n\t<c:forEach items=\\\"${${1}}\\\" var=\\\"${2}\\\" varStatus=\\\"${3}\\\">\\n\\\n\t\t${4:<c:out value=\\\"$2\\\" />}\\n\\\n\t</c:forEach>\\n\\\nsnippet cfort\\n\\\n\t<c:set var=\\\"${1}\\\">${2:item1,item2,item3}</c:set>\\n\\\n\t<c:forTokens var=\\\"${3}\\\" items=\\\"${$1}\\\" delims=\\\"${4:,}\\\">\\n\\\n\t\t${5:<c:out value=\\\"$3\\\" />}\\n\\\n\t</c:forTokens>\\n\\\nsnippet cparam\\n\\\n\t<c:param name=\\\"${1}\\\" value=\\\"${2}\\\" />\\n\\\nsnippet cparam+\\n\\\n\t<c:param name=\\\"${1}\\\" value=\\\"${2}\\\" />\\n\\\n\tcparam+${3}\\n\\\nsnippet cimport\\n\\\n\t<c:import url=\\\"${1}\\\" />\\n\\\nsnippet cimport+\\n\\\n\t<c:import url=\\\"${1}\\\">\\n\\\n\t\t<c:param name=\\\"${2}\\\" value=\\\"${3}\\\" />\\n\\\n\t\tcparam+${4}\\n\\\n\t</c:import>\\n\\\nsnippet curl\\n\\\n\t<c:url value=\\\"${1}\\\" var=\\\"${2}\\\" />\\n\\\n\t<a href=\\\"${$2}\\\">${3}</a>\\n\\\nsnippet curl+\\n\\\n\t<c:url value=\\\"${1}\\\" var=\\\"${2}\\\">\\n\\\n\t\t<c:param name=\\\"${4}\\\" value=\\\"${5}\\\" />\\n\\\n\t\tcparam+${6}\\n\\\n\t</c:url>\\n\\\n\t<a href=\\\"${$2}\\\">${3}</a>\\n\\\nsnippet credirect\\n\\\n\t<c:redirect url=\\\"${1}\\\" />\\n\\\nsnippet contains\\n\\\n\t${fn:contains(${1:string}, ${2:substr})}\\n\\\nsnippet contains:i\\n\\\n\t${fn:containsIgnoreCase(${1:string}, ${2:substr})}\\n\\\nsnippet endswith\\n\\\n\t${fn:endsWith(${1:string}, ${2:suffix})}\\n\\\nsnippet escape\\n\\\n\t${fn:escapeXml(${1:string})}\\n\\\nsnippet indexof\\n\\\n\t${fn:indexOf(${1:string}, ${2:substr})}\\n\\\nsnippet join\\n\\\n\t${fn:join(${1:collection}, ${2:delims})}\\n\\\nsnippet length\\n\\\n\t${fn:length(${1:collection_or_string})}\\n\\\nsnippet replace\\n\\\n\t${fn:replace(${1:string}, ${2:substr}, ${3:replace})}\\n\\\nsnippet split\\n\\\n\t${fn:split(${1:string}, ${2:delims})}\\n\\\nsnippet startswith\\n\\\n\t${fn:startsWith(${1:string}, ${2:prefix})}\\n\\\nsnippet substr\\n\\\n\t${fn:substring(${1:string}, ${2:begin}, ${3:end})}\\n\\\nsnippet substr:a\\n\\\n\t${fn:substringAfter(${1:string}, ${2:substr})}\\n\\\nsnippet substr:b\\n\\\n\t${fn:substringBefore(${1:string}, ${2:substr})}\\n\\\nsnippet lc\\n\\\n\t${fn:toLowerCase(${1:string})}\\n\\\nsnippet uc\\n\\\n\t${fn:toUpperCase(${1:string})}\\n\\\nsnippet trim\\n\\\n\t${fn:trim(${1:string})}\\n\\\n\";\nexports.scope = \"jsp\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/jsx.js",
    "content": "ace.define(\"ace/snippets/jsx\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"jsx\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/julia.js",
    "content": "ace.define(\"ace/snippets/julia\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"julia\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/latex.js",
    "content": "ace.define(\"ace/snippets/latex\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"latex\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/less.js",
    "content": "ace.define(\"ace/snippets/less\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"less\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/liquid.js",
    "content": "ace.define(\"ace/snippets/liquid\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"liquid\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/lisp.js",
    "content": "ace.define(\"ace/snippets/lisp\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"lisp\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/livescript.js",
    "content": "ace.define(\"ace/snippets/livescript\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"livescript\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/logiql.js",
    "content": "ace.define(\"ace/snippets/logiql\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"logiql\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/lsl.js",
    "content": "ace.define(\"ace/snippets/lsl\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"snippet @\\n\\\n\t@${1:label};\\n\\\nsnippet CAMERA_ACTIVE\\n\\\n\tCAMERA_ACTIVE, ${1:integer isActive}, $0\\n\\\nsnippet CAMERA_BEHINDNESS_ANGLE\\n\\\n\tCAMERA_BEHINDNESS_ANGLE, ${1:float degrees}, $0\\n\\\nsnippet CAMERA_BEHINDNESS_LAG\\n\\\n\tCAMERA_BEHINDNESS_LAG, ${1:float seconds}, $0\\n\\\nsnippet CAMERA_DISTANCE\\n\\\n\tCAMERA_DISTANCE, ${1:float meters}, $0\\n\\\nsnippet CAMERA_FOCUS\\n\\\n\tCAMERA_FOCUS, ${1:vector position}, $0\\n\\\nsnippet CAMERA_FOCUS_LAG\\n\\\n\tCAMERA_FOCUS_LAG, ${1:float seconds}, $0\\n\\\nsnippet CAMERA_FOCUS_LOCKED\\n\\\n\tCAMERA_FOCUS_LOCKED, ${1:integer isLocked}, $0\\n\\\nsnippet CAMERA_FOCUS_OFFSET\\n\\\n\tCAMERA_FOCUS_OFFSET, ${1:vector meters}, $0\\n\\\nsnippet CAMERA_FOCUS_THRESHOLD\\n\\\n\tCAMERA_FOCUS_THRESHOLD, ${1:float meters}, $0\\n\\\nsnippet CAMERA_PITCH\\n\\\n\tCAMERA_PITCH, ${1:float degrees}, $0\\n\\\nsnippet CAMERA_POSITION\\n\\\n\tCAMERA_POSITION, ${1:vector position}, $0\\n\\\nsnippet CAMERA_POSITION_LAG\\n\\\n\tCAMERA_POSITION_LAG, ${1:float seconds}, $0\\n\\\nsnippet CAMERA_POSITION_LOCKED\\n\\\n\tCAMERA_POSITION_LOCKED, ${1:integer isLocked}, $0\\n\\\nsnippet CAMERA_POSITION_THRESHOLD\\n\\\n\tCAMERA_POSITION_THRESHOLD, ${1:float meters}, $0\\n\\\nsnippet CHARACTER_AVOIDANCE_MODE\\n\\\n\tCHARACTER_AVOIDANCE_MODE, ${1:integer flags}, $0\\n\\\nsnippet CHARACTER_DESIRED_SPEED\\n\\\n\tCHARACTER_DESIRED_SPEED, ${1:float speed}, $0\\n\\\nsnippet CHARACTER_DESIRED_TURN_SPEED\\n\\\n\tCHARACTER_DESIRED_TURN_SPEED, ${1:float speed}, $0\\n\\\nsnippet CHARACTER_LENGTH\\n\\\n\tCHARACTER_LENGTH, ${1:float length}, $0\\n\\\nsnippet CHARACTER_MAX_TURN_RADIUS\\n\\\n\tCHARACTER_MAX_TURN_RADIUS, ${1:float radius}, $0\\n\\\nsnippet CHARACTER_ORIENTATION\\n\\\n\tCHARACTER_ORIENTATION, ${1:integer orientation}, $0\\n\\\nsnippet CHARACTER_RADIUS\\n\\\n\tCHARACTER_RADIUS, ${1:float radius}, $0\\n\\\nsnippet CHARACTER_STAY_WITHIN_PARCEL\\n\\\n\tCHARACTER_STAY_WITHIN_PARCEL, ${1:boolean stay}, $0\\n\\\nsnippet CHARACTER_TYPE\\n\\\n\tCHARACTER_TYPE, ${1:integer type}, $0\\n\\\nsnippet HTTP_BODY_MAXLENGTH\\n\\\n\tHTTP_BODY_MAXLENGTH, ${1:integer length}, $0\\n\\\nsnippet HTTP_CUSTOM_HEADER\\n\\\n\tHTTP_CUSTOM_HEADER, ${1:string name}, ${2:string value}, $0\\n\\\nsnippet HTTP_METHOD\\n\\\n\tHTTP_METHOD, ${1:string method}, $0\\n\\\nsnippet HTTP_MIMETYPE\\n\\\n\tHTTP_MIMETYPE, ${1:string mimeType}, $0\\n\\\nsnippet HTTP_PRAGMA_NO_CACHE\\n\\\n\tHTTP_PRAGMA_NO_CACHE, ${1:integer send_header}, $0\\n\\\nsnippet HTTP_VERBOSE_THROTTLE\\n\\\n\tHTTP_VERBOSE_THROTTLE, ${1:integer noisy}, $0\\n\\\nsnippet HTTP_VERIFY_CERT\\n\\\n\tHTTP_VERIFY_CERT, ${1:integer verify}, $0\\n\\\nsnippet RC_DATA_FLAGS\\n\\\n\tRC_DATA_FLAGS, ${1:integer flags}, $0\\n\\\nsnippet RC_DETECT_PHANTOM\\n\\\n\tRC_DETECT_PHANTOM, ${1:integer dectedPhantom}, $0\\n\\\nsnippet RC_MAX_HITS\\n\\\n\tRC_MAX_HITS, ${1:integer maxHits}, $0\\n\\\nsnippet RC_REJECT_TYPES\\n\\\n\tRC_REJECT_TYPES, ${1:integer filterMask}, $0\\n\\\nsnippet at_rot_target\\n\\\n\tat_rot_target(${1:integer handle}, ${2:rotation targetrot}, ${3:rotation ourrot})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet at_target\\n\\\n\tat_target(${1:integer tnum}, ${2:vector targetpos}, ${3:vector ourpos})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet attach\\n\\\n\tattach(${1:key id})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet changed\\n\\\n\tchanged(${1:integer change})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet collision\\n\\\n\tcollision(${1:integer index})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet collision_end\\n\\\n\tcollision_end(${1:integer index})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet collision_start\\n\\\n\tcollision_start(${1:integer index})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet control\\n\\\n\tcontrol(${1:key id}, ${2:integer level}, ${3:integer edge})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet dataserver\\n\\\n\tdataserver(${1:key query_id}, ${2:string data})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet do\\n\\\n\tdo\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\n\twhile (${1:condition});\\n\\\nsnippet else\\n\\\n\telse\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet email\\n\\\n\temail(${1:string time}, ${2:string address}, ${3:string subject}, ${4:string message}, ${5:integer num_left})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet experience_permissions\\n\\\n\texperience_permissions(${1:key agent_id})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet experience_permissions_denied\\n\\\n\texperience_permissions_denied(${1:key agent_id}, ${2:integer reason})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet for\\n\\\n\tfor (${1:start}; ${3:condition}; ${3:step})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet http_request\\n\\\n\thttp_request(${1:key request_id}, ${2:string method}, ${3:string body})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet http_response\\n\\\n\thttp_response(${1:key request_id}, ${2:integer status}, ${3:list metadata}, ${4:string body})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet if\\n\\\n\tif (${1:condition})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet jump\\n\\\n\tjump ${1:label};\\n\\\nsnippet land_collision\\n\\\n\tland_collision(${1:vector pos})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet land_collision_end\\n\\\n\tland_collision_end(${1:vector pos})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet land_collision_start\\n\\\n\tland_collision_start(${1:vector pos})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet link_message\\n\\\n\tlink_message(${1:integer sender_num}, ${2:integer num}, ${3:string str}, ${4:key id})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet listen\\n\\\n\tlisten(${1:integer channel}, ${2:string name}, ${3:key id}, ${4:string message})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet llAbs\\n\\\n\tllAbs(${1:integer val})\\n\\\nsnippet llAcos\\n\\\n\tllAcos(${1:float val})\\n\\\nsnippet llAddToLandBanList\\n\\\n\tllAddToLandBanList(${1:key agent}, ${2:float hours});\\n\\\nsnippet llAddToLandPassList\\n\\\n\tllAddToLandPassList(${1:key agent}, ${2:float hours});\\n\\\nsnippet llAdjustSoundVolume\\n\\\n\tllAdjustSoundVolume(${1:float volume});\\n\\\nsnippet llAgentInExperience\\n\\\n\tllAgentInExperience(${1:key agent})\\n\\\nsnippet llAllowInventoryDrop\\n\\\n\tllAllowInventoryDrop(${1:integer add});\\n\\\nsnippet llAngleBetween\\n\\\n\tllAngleBetween(${1:rotation a}, ${2:rotation b})\\n\\\nsnippet llApplyImpulse\\n\\\n\tllApplyImpulse(${1:vector force}, ${2:integer local});\\n\\\nsnippet llApplyRotationalImpulse\\n\\\n\tllApplyRotationalImpulse(${1:vector force}, ${2:integer local});\\n\\\nsnippet llAsin\\n\\\n\tllAsin(${1:float val})\\n\\\nsnippet llAtan2\\n\\\n\tllAtan2(${1:float y}, ${2:float x})\\n\\\nsnippet llAttachToAvatar\\n\\\n\tllAttachToAvatar(${1:integer attach_point});\\n\\\nsnippet llAttachToAvatarTemp\\n\\\n\tllAttachToAvatarTemp(${1:integer attach_point});\\n\\\nsnippet llAvatarOnLinkSitTarget\\n\\\n\tllAvatarOnLinkSitTarget(${1:integer link})\\n\\\nsnippet llAvatarOnSitTarget\\n\\\n\tllAvatarOnSitTarget()\\n\\\nsnippet llAxes2Rot\\n\\\n\tllAxes2Rot(${1:vector fwd}, ${2:vector left}, ${3:vector up})\\n\\\nsnippet llAxisAngle2Rot\\n\\\n\tllAxisAngle2Rot(${1:vector axis}, ${2:float angle})\\n\\\nsnippet llBase64ToInteger\\n\\\n\tllBase64ToInteger(${1:string str})\\n\\\nsnippet llBase64ToString\\n\\\n\tllBase64ToString(${1:string str})\\n\\\nsnippet llBreakAllLinks\\n\\\n\tllBreakAllLinks();\\n\\\nsnippet llBreakLink\\n\\\n\tllBreakLink(${1:integer link});\\n\\\nsnippet llCastRay\\n\\\n\tllCastRay(${1:vector start}, ${2:vector end}, ${3:list options});\\n\\\nsnippet llCeil\\n\\\n\tllCeil(${1:float val})\\n\\\nsnippet llClearCameraParams\\n\\\n\tllClearCameraParams();\\n\\\nsnippet llClearLinkMedia\\n\\\n\tllClearLinkMedia(${1:integer link}, ${2:integer face});\\n\\\nsnippet llClearPrimMedia\\n\\\n\tllClearPrimMedia(${1:integer face});\\n\\\nsnippet llCloseRemoteDataChannel\\n\\\n\tllCloseRemoteDataChannel(${1:key channel});\\n\\\nsnippet llCollisionFilter\\n\\\n\tllCollisionFilter(${1:string name}, ${2:key id}, ${3:integer accept});\\n\\\nsnippet llCollisionSound\\n\\\n\tllCollisionSound(${1:string impact_sound}, ${2:float impact_volume});\\n\\\nsnippet llCos\\n\\\n\tllCos(${1:float theta})\\n\\\nsnippet llCreateCharacter\\n\\\n\tllCreateCharacter(${1:list options});\\n\\\nsnippet llCreateKeyValue\\n\\\n\tllCreateKeyValue(${1:string k})\\n\\\nsnippet llCreateLink\\n\\\n\tllCreateLink(${1:key target}, ${2:integer parent});\\n\\\nsnippet llCSV2List\\n\\\n\tllCSV2List(${1:string src})\\n\\\nsnippet llDataSizeKeyValue\\n\\\n\tllDataSizeKeyValue()\\n\\\nsnippet llDeleteCharacter\\n\\\n\tllDeleteCharacter();\\n\\\nsnippet llDeleteKeyValue\\n\\\n\tllDeleteKeyValue(${1:string k})\\n\\\nsnippet llDeleteSubList\\n\\\n\tllDeleteSubList(${1:list src}, ${2:integer start}, ${3:integer end})\\n\\\nsnippet llDeleteSubString\\n\\\n\tllDeleteSubString(${1:string src}, ${2:integer start}, ${3:integer end})\\n\\\nsnippet llDetachFromAvatar\\n\\\n\tllDetachFromAvatar();\\n\\\nsnippet llDetectedGrab\\n\\\n\tllDetectedGrab(${1:integer number})\\n\\\nsnippet llDetectedGroup\\n\\\n\tllDetectedGroup(${1:integer number})\\n\\\nsnippet llDetectedKey\\n\\\n\tllDetectedKey(${1:integer number})\\n\\\nsnippet llDetectedLinkNumber\\n\\\n\tllDetectedLinkNumber(${1:integer number})\\n\\\nsnippet llDetectedName\\n\\\n\tllDetectedName(${1:integer number})\\n\\\nsnippet llDetectedOwner\\n\\\n\tllDetectedOwner(${1:integer number})\\n\\\nsnippet llDetectedPos\\n\\\n\tllDetectedPosl(${1:integer number})\\n\\\nsnippet llDetectedRot\\n\\\n\tllDetectedRot(${1:integer number})\\n\\\nsnippet llDetectedTouchBinormal\\n\\\n\tllDetectedTouchBinormal(${1:integer number})\\n\\\nsnippet llDetectedTouchFace\\n\\\n\tllDetectedTouchFace(${1:integer number})\\n\\\nsnippet llDetectedTouchNormal\\n\\\n\tllDetectedTouchNormal(${1:integer number})\\n\\\nsnippet llDetectedTouchPos\\n\\\n\tllDetectedTouchPos(${1:integer number})\\n\\\nsnippet llDetectedTouchST\\n\\\n\tllDetectedTouchST(${1:integer number})\\n\\\nsnippet llDetectedTouchUV\\n\\\n\tllDetectedTouchUV(${1:integer number})\\n\\\nsnippet llDetectedType\\n\\\n\tllDetectedType(${1:integer number})\\n\\\nsnippet llDetectedVel\\n\\\n\tllDetectedVel(${1:integer number})\\n\\\nsnippet llDialog\\n\\\n\tllDialog(${1:key agent}, ${2:string message}, ${3:list buttons}, ${4:integer channel});\\n\\\nsnippet llDie\\n\\\n\tllDie();\\n\\\nsnippet llDumpList2String\\n\\\n\tllDumpList2String(${1:list src}, ${2:string separator})\\n\\\nsnippet llEdgeOfWorld\\n\\\n\tllEdgeOfWorld(${1:vector pos}, ${2:vector dir})\\n\\\nsnippet llEjectFromLand\\n\\\n\tllEjectFromLand(${1:key agent});\\n\\\nsnippet llEmail\\n\\\n\tllEmail(${1:string address}, ${2:string subject}, ${3:string message});\\n\\\nsnippet llEscapeURL\\n\\\n\tllEscapeURL(${1:string url})\\n\\\nsnippet llEuler2Rot\\n\\\n\tllEuler2Rot(${1:vector v})\\n\\\nsnippet llExecCharacterCmd\\n\\\n\tllExecCharacterCmd(${1:integer command}, ${2:list options});\\n\\\nsnippet llEvade\\n\\\n\tllEvade(${1:key target}, ${2:list options});\\n\\\nsnippet llFabs\\n\\\n\tllFabs(${1:float val})\\n\\\nsnippet llFleeFrom\\n\\\n\tllFleeFrom(${1:vector position}, ${2:float distance}, ${3:list options});\\n\\\nsnippet llFloor\\n\\\n\tllFloor(${1:float val})\\n\\\nsnippet llForceMouselook\\n\\\n\tllForceMouselook(${1:integer mouselook});\\n\\\nsnippet llFrand\\n\\\n\tllFrand(${1:float mag})\\n\\\nsnippet llGenerateKey\\n\\\n\tllGenerateKey()\\n\\\nsnippet llGetAccel\\n\\\n\tllGetAccel()\\n\\\nsnippet llGetAgentInfo\\n\\\n\tllGetAgentInfo(${1:key id})\\n\\\nsnippet llGetAgentLanguage\\n\\\n\tllGetAgentLanguage(${1:key agent})\\n\\\nsnippet llGetAgentList\\n\\\n\tllGetAgentList(${1:integer scope}, ${2:list options})\\n\\\nsnippet llGetAgentSize\\n\\\n\tllGetAgentSize(${1:key agent})\\n\\\nsnippet llGetAlpha\\n\\\n\tllGetAlpha(${1:integer face})\\n\\\nsnippet llGetAndResetTime\\n\\\n\tllGetAndResetTime()\\n\\\nsnippet llGetAnimation\\n\\\n\tllGetAnimation(${1:key id})\\n\\\nsnippet llGetAnimationList\\n\\\n\tllGetAnimationList(${1:key agent})\\n\\\nsnippet llGetAnimationOverride\\n\\\n\tllGetAnimationOverride(${1:string anim_state})\\n\\\nsnippet llGetAttached\\n\\\n\tllGetAttached()\\n\\\nsnippet llGetBoundingBox\\n\\\n\tllGetBoundingBox(${1:key object})\\n\\\nsnippet llGetCameraPos\\n\\\n\tllGetCameraPos()\\n\\\nsnippet llGetCameraRot\\n\\\n\tllGetCameraRot()\\n\\\nsnippet llGetCenterOfMass\\n\\\n\tllGetCenterOfMass()\\n\\\nsnippet llGetClosestNavPoint\\n\\\n\tllGetClosestNavPoint(${1:vector point}, ${2:list options})\\n\\\nsnippet llGetColor\\n\\\n\tllGetColor(${1:integer face})\\n\\\nsnippet llGetCreator\\n\\\n\tllGetCreator()\\n\\\nsnippet llGetDate\\n\\\n\tllGetDate()\\n\\\nsnippet llGetDisplayName\\n\\\n\tllGetDisplayName(${1:key id})\\n\\\nsnippet llGetEnergy\\n\\\n\tllGetEnergy()\\n\\\nsnippet llGetEnv\\n\\\n\tllGetEnv(${1:string name})\\n\\\nsnippet llGetExperienceDetails\\n\\\n\tllGetExperienceDetails(${1:key experience_id})\\n\\\nsnippet llGetExperienceErrorMessage\\n\\\n\tllGetExperienceErrorMessage(${1:integer error})\\n\\\nsnippet llGetForce\\n\\\n\tllGetForce()\\n\\\nsnippet llGetFreeMemory\\n\\\n\tllGetFreeMemory()\\n\\\nsnippet llGetFreeURLs\\n\\\n\tllGetFreeURLs()\\n\\\nsnippet llGetGeometricCenter\\n\\\n\tllGetGeometricCenter()\\n\\\nsnippet llGetGMTclock\\n\\\n\tllGetGMTclock()\\n\\\nsnippet llGetHTTPHeader\\n\\\n\tllGetHTTPHeader(${1:key request_id}, ${2:string header})\\n\\\nsnippet llGetInventoryCreator\\n\\\n\tllGetInventoryCreator(${1:string item})\\n\\\nsnippet llGetInventoryKey\\n\\\n\tllGetInventoryKey(${1:string name})\\n\\\nsnippet llGetInventoryName\\n\\\n\tllGetInventoryName(${1:integer type}, ${2:integer number})\\n\\\nsnippet llGetInventoryNumber\\n\\\n\tllGetInventoryNumber(${1:integer type})\\n\\\nsnippet llGetInventoryPermMask\\n\\\n\tllGetInventoryPermMask(${1:string item}, ${2:integer mask})\\n\\\nsnippet llGetInventoryType\\n\\\n\tllGetInventoryType(${1:string name})\\n\\\nsnippet llGetKey\\n\\\n\tllGetKey()\\n\\\nsnippet llGetLandOwnerAt\\n\\\n\tllGetLandOwnerAt(${1:vector pos})\\n\\\nsnippet llGetLinkKey\\n\\\n\tllGetLinkKey(${1:integer link})\\n\\\nsnippet llGetLinkMedia\\n\\\n\tllGetLinkMedia(${1:integer link}, ${2:integer face}, ${3:list params})\\n\\\nsnippet llGetLinkName\\n\\\n\tllGetLinkName(${1:integer link})\\n\\\nsnippet llGetLinkNumber\\n\\\n\tllGetLinkNumber()\\n\\\nsnippet llGetLinkNumberOfSides\\n\\\n\tllGetLinkNumberOfSides(${1:integer link})\\n\\\nsnippet llGetLinkPrimitiveParams\\n\\\n\tllGetLinkPrimitiveParams(${1:integer link}, ${2:list params})\\n\\\nsnippet llGetListEntryType\\n\\\n\tllGetListEntryType(${1:list src}, ${2:integer index})\\n\\\nsnippet llGetListLength\\n\\\n\tllGetListLength(${1:list src})\\n\\\nsnippet llGetLocalPos\\n\\\n\tllGetLocalPos()\\n\\\nsnippet llGetLocalRot\\n\\\n\tllGetLocalRot()\\n\\\nsnippet llGetMass\\n\\\n\tllGetMass()\\n\\\nsnippet llGetMassMKS\\n\\\n\tllGetMassMKS()\\n\\\nsnippet llGetMaxScaleFactor\\n\\\n\tllGetMaxScaleFactor()\\n\\\nsnippet llGetMemoryLimit\\n\\\n\tllGetMemoryLimit()\\n\\\nsnippet llGetMinScaleFactor\\n\\\n\tllGetMinScaleFactor()\\n\\\nsnippet llGetNextEmail\\n\\\n\tllGetNextEmail(${1:string address}, ${2:string subject});\\n\\\nsnippet llGetNotecardLine\\n\\\n\tllGetNotecardLine(${1:string name}, ${2:integer line})\\n\\\nsnippet llGetNumberOfNotecardLines\\n\\\n\tllGetNumberOfNotecardLines(${1:string name})\\n\\\nsnippet llGetNumberOfPrims\\n\\\n\tllGetNumberOfPrims()\\n\\\nsnippet llGetNumberOfSides\\n\\\n\tllGetNumberOfSides()\\n\\\nsnippet llGetObjectDesc\\n\\\n\tllGetObjectDesc()\\n\\\nsnippet llGetObjectDetails\\n\\\n\tllGetObjectDetails(${1:key id}, ${2:list params})\\n\\\nsnippet llGetObjectMass\\n\\\n\tllGetObjectMass(${1:key id})\\n\\\nsnippet llGetObjectName\\n\\\n\tllGetObjectName()\\n\\\nsnippet llGetObjectPermMask\\n\\\n\tllGetObjectPermMask(${1:integer mask})\\n\\\nsnippet llGetObjectPrimCount\\n\\\n\tllGetObjectPrimCount(${1:key prim})\\n\\\nsnippet llGetOmega\\n\\\n\tllGetOmega()\\n\\\nsnippet llGetOwner\\n\\\n\tllGetOwner()\\n\\\nsnippet llGetOwnerKey\\n\\\n\tllGetOwnerKey(${1:key id})\\n\\\nsnippet llGetParcelDetails\\n\\\n\tllGetParcelDetails(${1:vector pos}, ${2:list params})\\n\\\nsnippet llGetParcelFlags\\n\\\n\tllGetParcelFlags(${1:vector pos})\\n\\\nsnippet llGetParcelMaxPrims\\n\\\n\tllGetParcelMaxPrims(${1:vector pos}, ${2:integer sim_wide})\\n\\\nsnippet llGetParcelMusicURL\\n\\\n\tllGetParcelMusicURL()\\n\\\nsnippet llGetParcelPrimCount\\n\\\n\tllGetParcelPrimCount(${1:vector pos}, ${2:integer category}, ${3:integer sim_wide})\\n\\\nsnippet llGetParcelPrimOwners\\n\\\n\tllGetParcelPrimOwners(${1:vector pos})\\n\\\nsnippet llGetPermissions\\n\\\n\tllGetPermissions()\\n\\\nsnippet llGetPermissionsKey\\n\\\n\tllGetPermissionsKey()\\n\\\nsnippet llGetPhysicsMaterial\\n\\\n\tllGetPhysicsMaterial()\\n\\\nsnippet llGetPos\\n\\\n\tllGetPos()\\n\\\nsnippet llGetPrimitiveParams\\n\\\n\tllGetPrimitiveParams(${1:list params})\\n\\\nsnippet llGetPrimMediaParams\\n\\\n\tllGetPrimMediaParams(${1:integer face}, ${2:list params})\\n\\\nsnippet llGetRegionAgentCount\\n\\\n\tllGetRegionAgentCount()\\n\\\nsnippet llGetRegionCorner\\n\\\n\tllGetRegionCorner()\\n\\\nsnippet llGetRegionFlags\\n\\\n\tllGetRegionFlags()\\n\\\nsnippet llGetRegionFPS\\n\\\n\tllGetRegionFPS()\\n\\\nsnippet llGetRegionName\\n\\\n\tllGetRegionName()\\n\\\nsnippet llGetRegionTimeDilation\\n\\\n\tllGetRegionTimeDilation()\\n\\\nsnippet llGetRootPosition\\n\\\n\tllGetRootPosition()\\n\\\nsnippet llGetRootRotation\\n\\\n\tllGetRootRotation()\\n\\\nsnippet llGetRot\\n\\\n\tllGetRot()\\n\\\nsnippet llGetScale\\n\\\n\tllGetScale()\\n\\\nsnippet llGetScriptName\\n\\\n\tllGetScriptName()\\n\\\nsnippet llGetScriptState\\n\\\n\tllGetScriptState(${1:string script})\\n\\\nsnippet llGetSimStats\\n\\\n\tllGetSimStats(${1:integer stat_type})\\n\\\nsnippet llGetSimulatorHostname\\n\\\n\tllGetSimulatorHostname()\\n\\\nsnippet llGetSPMaxMemory\\n\\\n\tllGetSPMaxMemory()\\n\\\nsnippet llGetStartParameter\\n\\\n\tllGetStartParameter()\\n\\\nsnippet llGetStaticPath\\n\\\n\tllGetStaticPath(${1:vector start}, ${2:vector end}, ${3:float radius}, ${4:list params})\\n\\\nsnippet llGetStatus\\n\\\n\tllGetStatus(${1:integer status})\\n\\\nsnippet llGetSubString\\n\\\n\tllGetSubString(${1:string src}, ${2:integer start}, ${3:integer end})\\n\\\nsnippet llGetSunDirection\\n\\\n\tllGetSunDirection()\\n\\\nsnippet llGetTexture\\n\\\n\tllGetTexture(${1:integer face})\\n\\\nsnippet llGetTextureOffset\\n\\\n\tllGetTextureOffset(${1:integer face})\\n\\\nsnippet llGetTextureRot\\n\\\n\tllGetTextureRot(${1:integer face})\\n\\\nsnippet llGetTextureScale\\n\\\n\tllGetTextureScale(${1:integer face})\\n\\\nsnippet llGetTime\\n\\\n\tllGetTime()\\n\\\nsnippet llGetTimeOfDay\\n\\\n\tllGetTimeOfDay()\\n\\\nsnippet llGetTimestamp\\n\\\n\tllGetTimestamp()\\n\\\nsnippet llGetTorque\\n\\\n\tllGetTorque()\\n\\\nsnippet llGetUnixTime\\n\\\n\tllGetUnixTime()\\n\\\nsnippet llGetUsedMemory\\n\\\n\tllGetUsedMemory()\\n\\\nsnippet llGetUsername\\n\\\n\tllGetUsername(${1:key id})\\n\\\nsnippet llGetVel\\n\\\n\tllGetVel()\\n\\\nsnippet llGetWallclock\\n\\\n\tllGetWallclock()\\n\\\nsnippet llGiveInventory\\n\\\n\tllGiveInventory(${1:key destination}, ${2:string inventory});\\n\\\nsnippet llGiveInventoryList\\n\\\n\tllGiveInventoryList(${1:key target}, ${2:string folder}, ${3:list inventory});\\n\\\nsnippet llGiveMoney\\n\\\n\tllGiveMoney(${1:key destination}, ${2:integer amount})\\n\\\nsnippet llGround\\n\\\n\tllGround(${1:vector offset})\\n\\\nsnippet llGroundContour\\n\\\n\tllGroundContour(${1:vector offset})\\n\\\nsnippet llGroundNormal\\n\\\n\tllGroundNormal(${1:vector offset})\\n\\\nsnippet llGroundRepel\\n\\\n\tllGroundRepel(${1:float height}, ${2:integer water}, ${3:float tau});\\n\\\nsnippet llGroundSlope\\n\\\n\tllGroundSlope(${1:vector offset})\\n\\\nsnippet llHTTPRequest\\n\\\n\tllHTTPRequest(${1:string url}, ${2:list parameters}, ${3:string body})\\n\\\nsnippet llHTTPResponse\\n\\\n\tllHTTPResponse(${1:key request_id}, ${2:integer status}, ${3:string body});\\n\\\nsnippet llInsertString\\n\\\n\tllInsertString(${1:string dst}, ${2:integer pos}, ${3:string src})\\n\\\nsnippet llInstantMessage\\n\\\n\tllInstantMessage(${1:key user}, ${2:string message});\\n\\\nsnippet llIntegerToBase64\\n\\\n\tllIntegerToBase64(${1:integer number})\\n\\\nsnippet llJson2List\\n\\\n\tllJson2List(${1:string json})\\n\\\nsnippet llJsonGetValue\\n\\\n\tllJsonGetValue(${1:string json}, ${2:list specifiers})\\n\\\nsnippet llJsonSetValue\\n\\\n\tllJsonSetValue(${1:string json}, ${2:list specifiers}, ${3:string newValue})\\n\\\nsnippet llJsonValueType\\n\\\n\tllJsonValueType(${1:string json}, ${2:list specifiers})\\n\\\nsnippet llKey2Name\\n\\\n\tllKey2Name(${1:key id})\\n\\\nsnippet llKeyCountKeyValue\\n\\\n\tllKeyCountKeyValue()\\n\\\nsnippet llKeysKeyValue\\n\\\n\tllKeysKeyValue(${1:integer first}, ${2:integer count})\\n\\\nsnippet llLinkParticleSystem\\n\\\n\tllLinkParticleSystem(${1:integer link}, ${2:list rules});\\n\\\nsnippet llLinkSitTarget\\n\\\n\tllLinkSitTarget(${1:integer link}, ${2:vector offset}, ${3:rotation rot});\\n\\\nsnippet llList2CSV\\n\\\n\tllList2CSV(${1:list src})\\n\\\nsnippet llList2Float\\n\\\n\tllList2Float(${1:list src}, ${2:integer index})\\n\\\nsnippet llList2Integer\\n\\\n\tllList2Integer(${1:list src}, ${2:integer index})\\n\\\nsnippet llList2Json\\n\\\n\tllList2Json(${1:string type}, ${2:list values})\\n\\\nsnippet llList2Key\\n\\\n\tllList2Key(${1:list src}, ${2:integer index})\\n\\\nsnippet llList2List\\n\\\n\tllList2List(${1:list src}, ${2:integer start}, ${3:integer end})\\n\\\nsnippet llList2ListStrided\\n\\\n\tllList2ListStrided(${1:list src}, ${2:integer start}, ${3:integer end}, ${4:integer stride})\\n\\\nsnippet llList2Rot\\n\\\n\tllList2Rot(${1:list src}, ${2:integer index})\\n\\\nsnippet llList2String\\n\\\n\tllList2String(${1:list src}, ${2:integer index})\\n\\\nsnippet llList2Vector\\n\\\n\tllList2Vector(${1:list src}, ${2:integer index})\\n\\\nsnippet llListen\\n\\\n\tllListen(${1:integer channel}, ${2:string name}, ${3:key id}, ${4:string msg})\\n\\\nsnippet llListenControl\\n\\\n\tllListenControl(${1:integer handle}, ${2:integer active});\\n\\\nsnippet llListenRemove\\n\\\n\tllListenRemove(${1:integer handle});\\n\\\nsnippet llListFindList\\n\\\n\tllListFindList(${1:list src}, ${2:list test})\\n\\\nsnippet llListInsertList\\n\\\n\tllListInsertList(${1:list dest}, ${2:list src}, ${3:integer start})\\n\\\nsnippet llListRandomize\\n\\\n\tllListRandomize(${1:list src}, ${2:integer stride})\\n\\\nsnippet llListReplaceList\\n\\\n\tllListReplaceList(${1:list dest}, ${2:list src}, ${3:integer start}, ${4:integer end})\\n\\\nsnippet llListSort\\n\\\n\tllListSort(${1:list src}, ${2:integer stride}, ${3:integer ascending})\\n\\\nsnippet llListStatistics\\n\\\n\tllListStatistics(${1:integer operation}, ${2:list src})\\n\\\nsnippet llLoadURL\\n\\\n\tllLoadURL(${1:key agent}, ${2:string message}, ${3:string url});\\n\\\nsnippet llLog\\n\\\n\tllLog(${1:float val})\\n\\\nsnippet llLog10\\n\\\n\tllLog10(${1:float val})\\n\\\nsnippet llLookAt\\n\\\n\tllLookAt(${1:vector target}, ${2:float strength}, ${3:float damping});\\n\\\nsnippet llLoopSound\\n\\\n\tllLoopSound(${1:string sound}, ${2:float volume});\\n\\\nsnippet llLoopSoundMaster\\n\\\n\tllLoopSoundMaster(${1:string sound}, ${2:float volume});\\n\\\nsnippet llLoopSoundSlave\\n\\\n\tllLoopSoundSlave(${1:string sound}, ${2:float volume});\\n\\\nsnippet llManageEstateAccess\\n\\\n\tllManageEstateAccess(${1:integer action}, ${2:key agent})\\n\\\nsnippet llMapDestination\\n\\\n\tllMapDestination(${1:string simname}, ${2:vector pos}, ${3:vector look_at});\\n\\\nsnippet llMD5String\\n\\\n\tllMD5String(${1:string src}, ${2:integer nonce})\\n\\\nsnippet llMessageLinked\\n\\\n\tllMessageLinked(${1:integer link}, ${2:integer num}, ${3:string str}, ${4:key id});\\n\\\nsnippet llMinEventDelay\\n\\\n\tllMinEventDelay(${1:float delay});\\n\\\nsnippet llModifyLand\\n\\\n\tllModifyLand(${1:integer action}, ${2:integer brush});\\n\\\nsnippet llModPow\\n\\\n\tllModPow(${1:integer a}, ${2:integer b}, ${3:integer c})\\n\\\nsnippet llMoveToTarget\\n\\\n\tllMoveToTarget(${1:vector target}, ${2:float tau});\\n\\\nsnippet llNavigateTo\\n\\\n\tllNavigateTo(${1:vector pos}, ${2:list options});\\n\\\nsnippet llOffsetTexture\\n\\\n\tllOffsetTexture(${1:float u}, ${2:float v}, ${3:integer face});\\n\\\nsnippet llOpenRemoteDataChannel\\n\\\n\tllOpenRemoteDataChannel();\\n\\\nsnippet llOverMyLand\\n\\\n\tllOverMyLand(${1:key id})\\n\\\nsnippet llOwnerSay\\n\\\n\tllOwnerSay(${1:string msg});\\n\\\nsnippet llParcelMediaCommandList\\n\\\n\tllParcelMediaCommandList(${1:list commandList});\\n\\\nsnippet llParcelMediaQuery\\n\\\n\tllParcelMediaQuery(${1:list query})\\n\\\nsnippet llParseString2List\\n\\\n\tllParseString2List(${1:string src}, ${2:list separators}, ${3:list spacers})\\n\\\nsnippet llParseStringKeepNulls\\n\\\n\tllParseStringKeepNulls(${1:string src}, ${2:list separators}, ${3:list spacers})\\n\\\nsnippet llParticleSystem\\n\\\n\tllParticleSystem(${1:list rules});\\n\\\nsnippet llPassCollisions\\n\\\n\tllPassCollisions(${1:integer pass});\\n\\\nsnippet llPassTouches\\n\\\n\tllPassTouches(${1:integer pass});\\n\\\nsnippet llPatrolPoints\\n\\\n\tllPatrolPoints(${1:list patrolPoints}, ${2:list options});\\n\\\nsnippet llPlaySound\\n\\\n\tllPlaySound(${1:string sound}, ${2:float volume});\\n\\\nsnippet llPlaySoundSlave\\n\\\n\tllPlaySoundSlave(${1:string sound}, ${2:float volume});\\n\\\nsnippet llPow\\n\\\n\tllPow(${1:float base}, ${2:float exponent})\\n\\\nsnippet llPreloadSound\\n\\\n\tllPreloadSound(${1:string sound});\\n\\\nsnippet llPursue\\n\\\n\tllPursue(${1:key target}, ${2:list options});\\n\\\nsnippet llPushObject\\n\\\n\tllPushObject(${1:key target}, ${2:vector impulse}, ${3:vector ang_impulse}, ${4:integer local});\\n\\\nsnippet llReadKeyValue\\n\\\n\tllReadKeyValue(${1:string k})\\n\\\nsnippet llRegionSay\\n\\\n\tllRegionSay(${1:integer channel}, ${2:string msg});\\n\\\nsnippet llRegionSayTo\\n\\\n\tllRegionSayTo(${1:key target}, ${2:integer channel}, ${3:string msg});\\n\\\nsnippet llReleaseControls\\n\\\n\tllReleaseControls();\\n\\\nsnippet llReleaseURL\\n\\\n\tllReleaseURL(${1:string url});\\n\\\nsnippet llRemoteDataReply\\n\\\n\tllRemoteDataReply(${1:key channel}, ${2:key message_id}, ${3:string sdata}, ${4:integer idata});\\n\\\nsnippet llRemoteLoadScriptPin\\n\\\n\tllRemoteLoadScriptPin(${1:key target}, ${2:string name}, ${3:integer pin}, ${4:integer running}, ${5:integer start_param});\\n\\\nsnippet llRemoveFromLandBanList\\n\\\n\tllRemoveFromLandBanList(${1:key agent});\\n\\\nsnippet llRemoveFromLandPassList\\n\\\n\tllRemoveFromLandPassList(${1:key agent});\\n\\\nsnippet llRemoveInventory\\n\\\n\tllRemoveInventory(${1:string item});\\n\\\nsnippet llRemoveVehicleFlags\\n\\\n\tllRemoveVehicleFlags(${1:integer flags});\\n\\\nsnippet llRequestAgentData\\n\\\n\tllRequestAgentData(${1:key id}, ${2:integer data})\\n\\\nsnippet llRequestDisplayName\\n\\\n\tllRequestDisplayName(${1:key id})\\n\\\nsnippet llRequestExperiencePermissions\\n\\\n\tllRequestExperiencePermissions(${1:key agent}, ${2:string name})\\n\\\nsnippet llRequestInventoryData\\n\\\n\tllRequestInventoryData(${1:string name})\\n\\\nsnippet llRequestPermissions\\n\\\n\tllRequestPermissions(${1:key agent}, ${2:integer permissions})\\n\\\nsnippet llRequestSecureURL\\n\\\n\tllRequestSecureURL()\\n\\\nsnippet llRequestSimulatorData\\n\\\n\tllRequestSimulatorData(${1:string region}, ${2:integer data})\\n\\\nsnippet llRequestURL\\n\\\n\tllRequestURL()\\n\\\nsnippet llRequestUsername\\n\\\n\tllRequestUsername(${1:key id})\\n\\\nsnippet llResetAnimationOverride\\n\\\n\tllResetAnimationOverride(${1:string anim_state});\\n\\\nsnippet llResetLandBanList\\n\\\n\tllResetLandBanList();\\n\\\nsnippet llResetLandPassList\\n\\\n\tllResetLandPassList();\\n\\\nsnippet llResetOtherScript\\n\\\n\tllResetOtherScript(${1:string name});\\n\\\nsnippet llResetScript\\n\\\n\tllResetScript();\\n\\\nsnippet llResetTime\\n\\\n\tllResetTime();\\n\\\nsnippet llReturnObjectsByID\\n\\\n\tllReturnObjectsByID(${1:list objects})\\n\\\nsnippet llReturnObjectsByOwner\\n\\\n\tllReturnObjectsByOwner(${1:key owner}, ${2:integer scope})\\n\\\nsnippet llRezAtRoot\\n\\\n\tllRezAtRoot(${1:string inventory}, ${2:vector position}, ${3:vector velocity}, ${4:rotation rot}, ${5:integer param});\\n\\\nsnippet llRezObject\\n\\\n\tllRezObject(${1:string inventory}, ${2:vector pos}, ${3:vector vel}, ${4:rotation rot}, ${5:integer param});\\n\\\nsnippet llRot2Angle\\n\\\n\tllRot2Angle(${1:rotation rot})\\n\\\nsnippet llRot2Axis\\n\\\n\tllRot2Axis(${1:rotation rot})\\n\\\nsnippet llRot2Euler\\n\\\n\tllRot2Euler(${1:rotation quat})\\n\\\nsnippet llRot2Fwd\\n\\\n\tllRot2Fwd(${1:rotation q})\\n\\\nsnippet llRot2Left\\n\\\n\tllRot2Left(${1:rotation q})\\n\\\nsnippet llRot2Up\\n\\\n\tllRot2Up(${1:rotation q})\\n\\\nsnippet llRotateTexture\\n\\\n\tllRotateTexture(${1:float angle}, ${2:integer face});\\n\\\nsnippet llRotBetween\\n\\\n\tllRotBetween(${1:vector start}, ${2:vector end})\\n\\\nsnippet llRotLookAt\\n\\\n\tllRotLookAt(${1:rotation target_direction}, ${2:float strength}, ${3:float damping});\\n\\\nsnippet llRotTarget\\n\\\n\tllRotTarget(${1:rotation rot}, ${2:float error})\\n\\\nsnippet llRotTargetRemove\\n\\\n\tllRotTargetRemove(${1:integer handle});\\n\\\nsnippet llRound\\n\\\n\tllRound(${1:float val})\\n\\\nsnippet llSameGroup\\n\\\n\tllSameGroup(${1:key group})\\n\\\nsnippet llSay\\n\\\n\tllSay(${1:integer channel}, ${2:string msg});\\n\\\nsnippet llScaleByFactor\\n\\\n\tllScaleByFactor(${1:float scaling_factor})\\n\\\nsnippet llScaleTexture\\n\\\n\tllScaleTexture(${1:float u}, ${2:float v}, ${3:integer face});\\n\\\nsnippet llScriptDanger\\n\\\n\tllScriptDanger(${1:vector pos})\\n\\\nsnippet llScriptProfiler\\n\\\n\tllScriptProfiler(${1:integer flags});\\n\\\nsnippet llSendRemoteData\\n\\\n\tllSendRemoteData(${1:key channel}, ${2:string dest}, ${3:integer idata}, ${4:string sdata})\\n\\\nsnippet llSensor\\n\\\n\tllSensor(${1:string name}, ${2:key id}, ${3:integer type}, ${4:float range}, ${5:float arc});\\n\\\nsnippet llSensorRepeat\\n\\\n\tllSensorRepeat(${1:string name}, ${2:key id}, ${3:integer type}, ${4:float range}, ${5:float arc}, ${6:float rate});\\n\\\nsnippet llSetAlpha\\n\\\n\tllSetAlpha(${1:float alpha}, ${2:integer face});\\n\\\nsnippet llSetAngularVelocity\\n\\\n\tllSetAngularVelocity(${1:vector force}, ${2:integer local});\\n\\\nsnippet llSetAnimationOverride\\n\\\n\tllSetAnimationOverride(${1:string anim_state}, ${2:string anim})\\n\\\nsnippet llSetBuoyancy\\n\\\n\tllSetBuoyancy(${1:float buoyancy});\\n\\\nsnippet llSetCameraAtOffset\\n\\\n\tllSetCameraAtOffset(${1:vector offset});\\n\\\nsnippet llSetCameraEyeOffset\\n\\\n\tllSetCameraEyeOffset(${1:vector offset});\\n\\\nsnippet llSetCameraParams\\n\\\n\tllSetCameraParams(${1:list rules});\\n\\\nsnippet llSetClickAction\\n\\\n\tllSetClickAction(${1:integer action});\\n\\\nsnippet llSetColor\\n\\\n\tllSetColor(${1:vector color}, ${2:integer face});\\n\\\nsnippet llSetContentType\\n\\\n\tllSetContentType(${1:key request_id}, ${2:integer content_type});\\n\\\nsnippet llSetDamage\\n\\\n\tllSetDamage(${1:float damage});\\n\\\nsnippet llSetForce\\n\\\n\tllSetForce(${1:vector force}, ${2:integer local});\\n\\\nsnippet llSetForceAndTorque\\n\\\n\tllSetForceAndTorque(${1:vector force}, ${2:vector torque}, ${3:integer local});\\n\\\nsnippet llSetHoverHeight\\n\\\n\tllSetHoverHeight(${1:float height}, ${2:integer water}, ${3:float tau});\\n\\\nsnippet llSetKeyframedMotion\\n\\\n\tllSetKeyframedMotion(${1:list keyframes}, ${2:list options});\\n\\\nsnippet llSetLinkAlpha\\n\\\n\tllSetLinkAlpha(${1:integer link}, ${2:float alpha}, ${3:integer face});\\n\\\nsnippet llSetLinkCamera\\n\\\n\tllSetLinkCamera(${1:integer link}, ${2:vector eye}, ${3:vector at});\\n\\\nsnippet llSetLinkColor\\n\\\n\tllSetLinkColor(${1:integer link}, ${2:vector color}, ${3:integer face});\\n\\\nsnippet llSetLinkMedia\\n\\\n\tllSetLinkMedia(${1:integer link}, ${2:integer face}, ${3:list params});\\n\\\nsnippet llSetLinkPrimitiveParams\\n\\\n\tllSetLinkPrimitiveParams(${1:integer link}, ${2:list rules});\\n\\\nsnippet llSetLinkPrimitiveParamsFast\\n\\\n\tllSetLinkPrimitiveParamsFast(${1:integer link}, ${2:list rules});\\n\\\nsnippet llSetLinkTexture\\n\\\n\tllSetLinkTexture(${1:integer link}, ${2:string texture}, ${3:integer face});\\n\\\nsnippet llSetLinkTextureAnim\\n\\\n\tllSetLinkTextureAnim(${1:integer link}, ${2:integer mode}, ${3:integer face}, ${4:integer sizex}, ${5:integer sizey}, ${6:float start}, ${7:float length}, ${8:float rate});\\n\\\nsnippet llSetLocalRot\\n\\\n\tllSetLocalRot(${1:rotation rot});\\n\\\nsnippet llSetMemoryLimit\\n\\\n\tllSetMemoryLimit(${1:integer limit})\\n\\\nsnippet llSetObjectDesc\\n\\\n\tllSetObjectDesc(${1:string description});\\n\\\nsnippet llSetObjectName\\n\\\n\tllSetObjectName(${1:string name});\\n\\\nsnippet llSetParcelMusicURL\\n\\\n\tllSetParcelMusicURL(${1:string url});\\n\\\nsnippet llSetPayPrice\\n\\\n\tllSetPayPrice(${1:integer price}, [${2:integer price_button_a}, ${3:integer price_button_b}, ${4:integer price_button_c}, ${5:integer price_button_d}]);\\n\\\nsnippet llSetPhysicsMaterial\\n\\\n\tllSetPhysicsMaterial(${1:integer mask}, ${2:float gravity_multiplier}, ${3:float restitution}, ${4:float friction}, ${5:float density});\\n\\\nsnippet llSetPos\\n\\\n\tllSetPos(${1:vector pos});\\n\\\nsnippet llSetPrimitiveParams\\n\\\n\tllSetPrimitiveParams(${1:list rules});\\n\\\nsnippet llSetPrimMediaParams\\n\\\n\tllSetPrimMediaParams(${1:integer face}, ${2:list params});\\n\\\nsnippet llSetRegionPos\\n\\\n\tllSetRegionPos(${1:vector position})\\n\\\nsnippet llSetRemoteScriptAccessPin\\n\\\n\tllSetRemoteScriptAccessPin(${1:integer pin});\\n\\\nsnippet llSetRot\\n\\\n\tllSetRot(${1:rotation rot});\\n\\\nsnippet llSetScale\\n\\\n\tllSetScale(${1:vector size});\\n\\\nsnippet llSetScriptState\\n\\\n\tllSetScriptState(${1:string name}, ${2:integer run});\\n\\\nsnippet llSetSitText\\n\\\n\tllSetSitText(${1:string text});\\n\\\nsnippet llSetSoundQueueing\\n\\\n\tllSetSoundQueueing(${1:integer queue});\\n\\\nsnippet llSetSoundRadius\\n\\\n\tllSetSoundRadius(${1:float radius});\\n\\\nsnippet llSetStatus\\n\\\n\tllSetStatus(${1:integer status}, ${2:integer value});\\n\\\nsnippet llSetText\\n\\\n\tllSetText(${1:string text}, ${2:vector color}, ${3:float alpha});\\n\\\nsnippet llSetTexture\\n\\\n\tllSetTexture(${1:string texture}, ${2:integer face});\\n\\\nsnippet llSetTextureAnim\\n\\\n\tllSetTextureAnim(${1:integer mode}, ${2:integer face}, ${3:integer sizex}, ${4:integer sizey}, ${5:float start}, ${6:float length}, ${7:float rate});\\n\\\nsnippet llSetTimerEvent\\n\\\n\tllSetTimerEvent(${1:float sec});\\n\\\nsnippet llSetTorque\\n\\\n\tllSetTorque(${1:vector torque}, ${2:integer local});\\n\\\nsnippet llSetTouchText\\n\\\n\tllSetTouchText(${1:string text});\\n\\\nsnippet llSetVehicleFlags\\n\\\n\tllSetVehicleFlags(${1:integer flags});\\n\\\nsnippet llSetVehicleFloatParam\\n\\\n\tllSetVehicleFloatParam(${1:integer param}, ${2:float value});\\n\\\nsnippet llSetVehicleRotationParam\\n\\\n\tllSetVehicleRotationParam(${1:integer param}, ${2:rotation rot});\\n\\\nsnippet llSetVehicleType\\n\\\n\tllSetVehicleType(${1:integer type});\\n\\\nsnippet llSetVehicleVectorParam\\n\\\n\tllSetVehicleVectorParam(${1:integer param}, ${2:vector vec});\\n\\\nsnippet llSetVelocity\\n\\\n\tllSetVelocity(${1:vector force}, ${2:integer local});\\n\\\nsnippet llSHA1String\\n\\\n\tllSHA1String(${1:string src})\\n\\\nsnippet llShout\\n\\\n\tllShout(${1:integer channel}, ${2:string msg});\\n\\\nsnippet llSin\\n\\\n\tllSin(${1:float theta})\\n\\\nsnippet llSitTarget\\n\\\n\tllSitTarget(${1:vector offset}, ${2:rotation rot});\\n\\\nsnippet llSleep\\n\\\n\tllSleep(${1:float sec});\\n\\\nsnippet llSqrt\\n\\\n\tllSqrt(${1:float val})\\n\\\nsnippet llStartAnimation\\n\\\n\tllStartAnimation(${1:string anim});\\n\\\nsnippet llStopAnimation\\n\\\n\tllStopAnimation(${1:string anim});\\n\\\nsnippet llStopHover\\n\\\n\tllStopHover();\\n\\\nsnippet llStopLookAt\\n\\\n\tllStopLookAt();\\n\\\nsnippet llStopMoveToTarget\\n\\\n\tllStopMoveToTarget();\\n\\\nsnippet llStopSound\\n\\\n\tllStopSound();\\n\\\nsnippet llStringLength\\n\\\n\tllStringLength(${1:string str})\\n\\\nsnippet llStringToBase64\\n\\\n\tllStringToBase64(${1:string str})\\n\\\nsnippet llStringTrim\\n\\\n\tllStringTrim(${1:string src}, ${2:integer type})\\n\\\nsnippet llSubStringIndex\\n\\\n\tllSubStringIndex(${1:string source}, ${2:string pattern})\\n\\\nsnippet llTakeControls\\n\\\n\tllTakeControls(${1:integer controls}, ${2:integer accept}, ${3:integer pass_on});\\n\\\nsnippet llTan\\n\\\n\tllTan(${1:float theta})\\n\\\nsnippet llTarget\\n\\\n\tllTarget(${1:vector position}, ${2:float range})\\n\\\nsnippet llTargetOmega\\n\\\n\tllTargetOmega(${1:vector axis}, ${2:float spinrate}, ${3:float gain});\\n\\\nsnippet llTargetRemove\\n\\\n\tllTargetRemove(${1:integer handle});\\n\\\nsnippet llTeleportAgent\\n\\\n\tllTeleportAgent(${1:key agent}, ${2:string landmark}, ${3:vector position}, ${4:vector look_at});\\n\\\nsnippet llTeleportAgentGlobalCoords\\n\\\n\tllTeleportAgentGlobalCoords(${1:key agent}, ${2:vector global_coordinates}, ${3:vector region_coordinates}, ${4:vector look_at});\\n\\\nsnippet llTeleportAgentHome\\n\\\n\tllTeleportAgentHome(${1:key agent});\\n\\\nsnippet llTextBox\\n\\\n\tllTextBox(${1:key agent}, ${2:string message}, ${3:integer channel});\\n\\\nsnippet llToLower\\n\\\n\tllToLower(${1:string src})\\n\\\nsnippet llToUpper\\n\\\n\tllToUpper(${1:string src})\\n\\\nsnippet llTransferLindenDollars\\n\\\n\tllTransferLindenDollars(${1:key destination}, ${2:integer amount})\\n\\\nsnippet llTriggerSound\\n\\\n\tllTriggerSound(${1:string sound}, ${2:float volume});\\n\\\nsnippet llTriggerSoundLimited\\n\\\n\tllTriggerSoundLimited(${1:string sound}, ${2:float volume}, ${3:vector top_north_east}, ${4:vector bottom_south_west});\\n\\\nsnippet llUnescapeURL\\n\\\n\tllUnescapeURL(${1:string url})\\n\\\nsnippet llUnSit\\n\\\n\tllUnSit(${1:key id});\\n\\\nsnippet llUpdateCharacter\\n\\\n\tllUpdateCharacter(${1:list options})\\n\\\nsnippet llUpdateKeyValue\\n\\\n\tllUpdateKeyValue(${1:string k}, ${2:string v}, ${3:integer checked}, ${4:string ov})\\n\\\nsnippet llVecDist\\n\\\n\tllVecDist(${1:vector vec_a}, ${2:vector vec_b})\\n\\\nsnippet llVecMag\\n\\\n\tllVecMag(${1:vector vec})\\n\\\nsnippet llVecNorm\\n\\\n\tllVecNorm(${1:vector vec})\\n\\\nsnippet llVolumeDetect\\n\\\n\tllVolumeDetect(${1:integer detect});\\n\\\nsnippet llWanderWithin\\n\\\n\tllWanderWithin(${1:vector origin}, ${2:vector dist}, ${3:list options});\\n\\\nsnippet llWater\\n\\\n\tllWater(${1:vector offset});\\n\\\nsnippet llWhisper\\n\\\n\tllWhisper(${1:integer channel}, ${2:string msg});\\n\\\nsnippet llWind\\n\\\n\tllWind(${1:vector offset});\\n\\\nsnippet llXorBase64\\n\\\n\tllXorBase64(${1:string str1}, ${2:string str2})\\n\\\nsnippet money\\n\\\n\tmoney(${1:key id}, ${2:integer amount})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet object_rez\\n\\\n\tobject_rez(${1:key id})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet on_rez\\n\\\n\ton_rez(${1:integer start_param})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet path_update\\n\\\n\tpath_update(${1:integer type}, ${2:list reserved})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet remote_data\\n\\\n\tremote_data(${1:integer event_type}, ${2:key channel}, ${3:key message_id}, ${4:string sender}, ${5:integer idata}, ${6:string sdata})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet run_time_permissions\\n\\\n\trun_time_permissions(${1:integer perm})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet sensor\\n\\\n\tsensor(${1:integer index})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet state\\n\\\n\tstate ${1:name}\\n\\\nsnippet touch\\n\\\n\ttouch(${1:integer index})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet touch_end\\n\\\n\ttouch_end(${1:integer index})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet touch_start\\n\\\n\ttouch_start(${1:integer index})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet transaction_result\\n\\\n\ttransaction_result(${1:key id}, ${2:integer success}, ${3:string data})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\nsnippet while\\n\\\n\twhile (${1:condition})\\n\\\n\t{\\n\\\n\t\t$0\\n\\\n\t}\\n\\\n\";\nexports.scope = \"lsl\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/lua.js",
    "content": "ace.define(\"ace/snippets/lua\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"snippet #!\\n\\\n\t#!/usr/bin/env lua\\n\\\n\t$1\\n\\\nsnippet local\\n\\\n\tlocal ${1:x} = ${2:1}\\n\\\nsnippet fun\\n\\\n\tfunction ${1:fname}(${2:...})\\n\\\n\t\t${3:-- body}\\n\\\n\tend\\n\\\nsnippet for\\n\\\n\tfor ${1:i}=${2:1},${3:10} do\\n\\\n\t\t${4:print(i)}\\n\\\n\tend\\n\\\nsnippet forp\\n\\\n\tfor ${1:i},${2:v} in pairs(${3:table_name}) do\\n\\\n\t   ${4:-- body}\\n\\\n\tend\\n\\\nsnippet fori\\n\\\n\tfor ${1:i},${2:v} in ipairs(${3:table_name}) do\\n\\\n\t   ${4:-- body}\\n\\\n\tend\\n\\\n\";\nexports.scope = \"lua\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/luapage.js",
    "content": "ace.define(\"ace/snippets/luapage\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"luapage\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/lucene.js",
    "content": "ace.define(\"ace/snippets/lucene\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"lucene\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/makefile.js",
    "content": "ace.define(\"ace/snippets/makefile\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"snippet ifeq\\n\\\n\tifeq (${1:cond0},${2:cond1})\\n\\\n\t\t${3:code}\\n\\\n\tendif\\n\\\n\";\nexports.scope = \"makefile\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/markdown.js",
    "content": "ace.define(\"ace/snippets/markdown\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"# Markdown\\n\\\n\\n\\\n# Includes octopress (http://octopress.org/) snippets\\n\\\n\\n\\\nsnippet [\\n\\\n\t[${1:text}](http://${2:address} \\\"${3:title}\\\")\\n\\\nsnippet [*\\n\\\n\t[${1:link}](${2:`@*`} \\\"${3:title}\\\")${4}\\n\\\n\\n\\\nsnippet [:\\n\\\n\t[${1:id}]: http://${2:url} \\\"${3:title}\\\"\\n\\\nsnippet [:*\\n\\\n\t[${1:id}]: ${2:`@*`} \\\"${3:title}\\\"\\n\\\n\\n\\\nsnippet ![\\n\\\n\t![${1:alttext}](${2:/images/image.jpg} \\\"${3:title}\\\")\\n\\\nsnippet ![*\\n\\\n\t![${1:alt}](${2:`@*`} \\\"${3:title}\\\")${4}\\n\\\n\\n\\\nsnippet ![:\\n\\\n\t![${1:id}]: ${2:url} \\\"${3:title}\\\"\\n\\\nsnippet ![:*\\n\\\n\t![${1:id}]: ${2:`@*`} \\\"${3:title}\\\"\\n\\\n\\n\\\nsnippet ===\\n\\\nregex /^/=+/=*//\\n\\\n\t${PREV_LINE/./=/g}\\n\\\n\t\\n\\\n\t${0}\\n\\\nsnippet ---\\n\\\nregex /^/-+/-*//\\n\\\n\t${PREV_LINE/./-/g}\\n\\\n\t\\n\\\n\t${0}\\n\\\nsnippet blockquote\\n\\\n\t{% blockquote %}\\n\\\n\t${1:quote}\\n\\\n\t{% endblockquote %}\\n\\\n\\n\\\nsnippet blockquote-author\\n\\\n\t{% blockquote ${1:author}, ${2:title} %}\\n\\\n\t${3:quote}\\n\\\n\t{% endblockquote %}\\n\\\n\\n\\\nsnippet blockquote-link\\n\\\n\t{% blockquote ${1:author} ${2:URL} ${3:link_text} %}\\n\\\n\t${4:quote}\\n\\\n\t{% endblockquote %}\\n\\\n\\n\\\nsnippet bt-codeblock-short\\n\\\n\t```\\n\\\n\t${1:code_snippet}\\n\\\n\t```\\n\\\n\\n\\\nsnippet bt-codeblock-full\\n\\\n\t``` ${1:language} ${2:title} ${3:URL} ${4:link_text}\\n\\\n\t${5:code_snippet}\\n\\\n\t```\\n\\\n\\n\\\nsnippet codeblock-short\\n\\\n\t{% codeblock %}\\n\\\n\t${1:code_snippet}\\n\\\n\t{% endcodeblock %}\\n\\\n\\n\\\nsnippet codeblock-full\\n\\\n\t{% codeblock ${1:title} lang:${2:language} ${3:URL} ${4:link_text} %}\\n\\\n\t${5:code_snippet}\\n\\\n\t{% endcodeblock %}\\n\\\n\\n\\\nsnippet gist-full\\n\\\n\t{% gist ${1:gist_id} ${2:filename} %}\\n\\\n\\n\\\nsnippet gist-short\\n\\\n\t{% gist ${1:gist_id} %}\\n\\\n\\n\\\nsnippet img\\n\\\n\t{% img ${1:class} ${2:URL} ${3:width} ${4:height} ${5:title_text} ${6:alt_text} %}\\n\\\n\\n\\\nsnippet youtube\\n\\\n\t{% youtube ${1:video_id} %}\\n\\\n\\n\\\n# The quote should appear only once in the text. It is inherently part of it.\\n\\\n# See http://octopress.org/docs/plugins/pullquote/ for more info.\\n\\\n\\n\\\nsnippet pullquote\\n\\\n\t{% pullquote %}\\n\\\n\t${1:text} {\\\" ${2:quote} \\\"} ${3:text}\\n\\\n\t{% endpullquote %}\\n\\\n\";\nexports.scope = \"markdown\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/mask.js",
    "content": "ace.define(\"ace/snippets/mask\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"mask\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/matlab.js",
    "content": "ace.define(\"ace/snippets/matlab\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"matlab\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/mel.js",
    "content": "ace.define(\"ace/snippets/mel\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"mel\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/mushcode.js",
    "content": "ace.define(\"ace/snippets/mushcode\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"mushcode\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/mysql.js",
    "content": "ace.define(\"ace/snippets/mysql\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"mysql\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/nix.js",
    "content": "ace.define(\"ace/snippets/nix\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"nix\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/objectivec.js",
    "content": "ace.define(\"ace/snippets/objectivec\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"objectivec\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/ocaml.js",
    "content": "ace.define(\"ace/snippets/ocaml\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"ocaml\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/pascal.js",
    "content": "ace.define(\"ace/snippets/pascal\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"pascal\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/perl.js",
    "content": "ace.define(\"ace/snippets/perl\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"# #!/usr/bin/perl\\n\\\nsnippet #!\\n\\\n\t#!/usr/bin/env perl\\n\\\n\\n\\\n# Hash Pointer\\n\\\nsnippet .\\n\\\n\t =>\\n\\\n# Function\\n\\\nsnippet sub\\n\\\n\tsub ${1:function_name} {\\n\\\n\t\t${2:#body ...}\\n\\\n\t}\\n\\\n# Conditional\\n\\\nsnippet if\\n\\\n\tif (${1}) {\\n\\\n\t\t${2:# body...}\\n\\\n\t}\\n\\\n# Conditional if..else\\n\\\nsnippet ife\\n\\\n\tif (${1}) {\\n\\\n\t\t${2:# body...}\\n\\\n\t}\\n\\\n\telse {\\n\\\n\t\t${3:# else...}\\n\\\n\t}\\n\\\n# Conditional if..elsif..else\\n\\\nsnippet ifee\\n\\\n\tif (${1}) {\\n\\\n\t\t${2:# body...}\\n\\\n\t}\\n\\\n\telsif (${3}) {\\n\\\n\t\t${4:# elsif...}\\n\\\n\t}\\n\\\n\telse {\\n\\\n\t\t${5:# else...}\\n\\\n\t}\\n\\\n# Conditional One-line\\n\\\nsnippet xif\\n\\\n\t${1:expression} if ${2:condition};${3}\\n\\\n# Unless conditional\\n\\\nsnippet unless\\n\\\n\tunless (${1}) {\\n\\\n\t\t${2:# body...}\\n\\\n\t}\\n\\\n# Unless conditional One-line\\n\\\nsnippet xunless\\n\\\n\t${1:expression} unless ${2:condition};${3}\\n\\\n# Try/Except\\n\\\nsnippet eval\\n\\\n\tlocal $@;\\n\\\n\teval {\\n\\\n\t\t${1:# do something risky...}\\n\\\n\t};\\n\\\n\tif (my $e = $@) {\\n\\\n\t\t${2:# handle failure...}\\n\\\n\t}\\n\\\n# While Loop\\n\\\nsnippet wh\\n\\\n\twhile (${1}) {\\n\\\n\t\t${2:# body...}\\n\\\n\t}\\n\\\n# While Loop One-line\\n\\\nsnippet xwh\\n\\\n\t${1:expression} while ${2:condition};${3}\\n\\\n# C-style For Loop\\n\\\nsnippet cfor\\n\\\n\tfor (my $${2:var} = 0; $$2 < ${1:count}; $$2${3:++}) {\\n\\\n\t\t${4:# body...}\\n\\\n\t}\\n\\\n# For loop one-line\\n\\\nsnippet xfor\\n\\\n\t${1:expression} for @${2:array};${3}\\n\\\n# Foreach Loop\\n\\\nsnippet for\\n\\\n\tforeach my $${1:x} (@${2:array}) {\\n\\\n\t\t${3:# body...}\\n\\\n\t}\\n\\\n# Foreach Loop One-line\\n\\\nsnippet fore\\n\\\n\t${1:expression} foreach @${2:array};${3}\\n\\\n# Package\\n\\\nsnippet package\\n\\\n\tpackage ${1:`substitute(Filename('', 'Page Title'), '^.', '\\\\u&', '')`};\\n\\\n\\n\\\n\t${2}\\n\\\n\\n\\\n\t1;\\n\\\n\\n\\\n\t__END__\\n\\\n# Package syntax perl >= 5.14\\n\\\nsnippet packagev514\\n\\\n\tpackage ${1:`substitute(Filename('', 'Page Title'), '^.', '\\\\u&', '')`} ${2:0.99};\\n\\\n\\n\\\n\t${3}\\n\\\n\\n\\\n\t1;\\n\\\n\\n\\\n\t__END__\\n\\\n#moose\\n\\\nsnippet moose\\n\\\n\tuse Moose;\\n\\\n\tuse namespace::autoclean;\\n\\\n\t${1:#}BEGIN {extends '${2:ParentClass}'};\\n\\\n\\n\\\n\t${3}\\n\\\n# parent\\n\\\nsnippet parent\\n\\\n\tuse parent qw(${1:Parent Class});\\n\\\n# Read File\\n\\\nsnippet slurp\\n\\\n\tmy $${1:var} = do { local $/; open my $file, '<', \\\"${2:file}\\\"; <$file> };\\n\\\n\t${3}\\n\\\n# strict warnings\\n\\\nsnippet strwar\\n\\\n\tuse strict;\\n\\\n\tuse warnings;\\n\\\n# older versioning with perlcritic bypass\\n\\\nsnippet vers\\n\\\n\t## no critic\\n\\\n\tour $VERSION = '${1:version}';\\n\\\n\teval $VERSION;\\n\\\n\t## use critic\\n\\\n# new 'switch' like feature\\n\\\nsnippet switch\\n\\\n\tuse feature 'switch';\\n\\\n\\n\\\n# Anonymous subroutine\\n\\\nsnippet asub\\n\\\n\tsub {\\n\\\n\t \t${1:# body }\\n\\\n\t}\\n\\\n\\n\\\n\\n\\\n\\n\\\n# Begin block\\n\\\nsnippet begin\\n\\\n\tBEGIN {\\n\\\n\t\t${1:# begin body}\\n\\\n\t}\\n\\\n\\n\\\n# call package function with some parameter\\n\\\nsnippet pkgmv\\n\\\n\t__PACKAGE__->${1:package_method}(${2:var})\\n\\\n\\n\\\n# call package function without a parameter\\n\\\nsnippet pkgm\\n\\\n\t__PACKAGE__->${1:package_method}()\\n\\\n\\n\\\n# call package \\\"get_\\\" function without a parameter\\n\\\nsnippet pkget\\n\\\n\t__PACKAGE__->get_${1:package_method}()\\n\\\n\\n\\\n# call package function with a parameter\\n\\\nsnippet pkgetv\\n\\\n\t__PACKAGE__->get_${1:package_method}(${2:var})\\n\\\n\\n\\\n# complex regex\\n\\\nsnippet qrx\\n\\\n\tqr/\\n\\\n\t     ${1:regex}\\n\\\n\t/xms\\n\\\n\\n\\\n#simpler regex\\n\\\nsnippet qr/\\n\\\n\tqr/${1:regex}/x\\n\\\n\\n\\\n#given\\n\\\nsnippet given\\n\\\n\tgiven ($${1:var}) {\\n\\\n\t\t${2:# cases}\\n\\\n\t\t${3:# default}\\n\\\n\t}\\n\\\n\\n\\\n# switch-like case\\n\\\nsnippet when\\n\\\n\twhen (${1:case}) {\\n\\\n\t\t${2:# body}\\n\\\n\t}\\n\\\n\\n\\\n# hash slice\\n\\\nsnippet hslice\\n\\\n\t@{ ${1:hash}  }{ ${2:array} }\\n\\\n\\n\\\n\\n\\\n# map\\n\\\nsnippet map\\n\\\n\tmap {  ${2: body }    }  ${1: @array } ;\\n\\\n\\n\\\n\\n\\\n\\n\\\n# Pod stub\\n\\\nsnippet ppod\\n\\\n\t=head1 NAME\\n\\\n\\n\\\n\t${1:ClassName} - ${2:ShortDesc}\\n\\\n\\n\\\n\t=head1 SYNOPSIS\\n\\\n\\n\\\n\t  use $1;\\n\\\n\\n\\\n\t  ${3:# synopsis...}\\n\\\n\\n\\\n\t=head1 DESCRIPTION\\n\\\n\\n\\\n\t${4:# longer description...}\\n\\\n\\n\\\n\\n\\\n\t=head1 INTERFACE\\n\\\n\\n\\\n\\n\\\n\t=head1 DEPENDENCIES\\n\\\n\\n\\\n\\n\\\n\t=head1 SEE ALSO\\n\\\n\\n\\\n\\n\\\n# Heading for a subroutine stub\\n\\\nsnippet psub\\n\\\n\t=head2 ${1:MethodName}\\n\\\n\\n\\\n\t${2:Summary....}\\n\\\n\\n\\\n# Heading for inline subroutine pod\\n\\\nsnippet psubi\\n\\\n\t=head2 ${1:MethodName}\\n\\\n\\n\\\n\t${2:Summary...}\\n\\\n\\n\\\n\\n\\\n\t=cut\\n\\\n# inline documented subroutine\\n\\\nsnippet subpod\\n\\\n\t=head2 $1\\n\\\n\\n\\\n\tSummary of $1\\n\\\n\\n\\\n\t=cut\\n\\\n\\n\\\n\tsub ${1:subroutine_name} {\\n\\\n\t\t${2:# body...}\\n\\\n\t}\\n\\\n# Subroutine signature\\n\\\nsnippet parg\\n\\\n\t=over 2\\n\\\n\\n\\\n\t=item\\n\\\n\tArguments\\n\\\n\\n\\\n\\n\\\n\t=over 3\\n\\\n\\n\\\n\t=item\\n\\\n\tC<${1:DataStructure}>\\n\\\n\\n\\\n\t  ${2:Sample}\\n\\\n\\n\\\n\\n\\\n\t=back\\n\\\n\\n\\\n\\n\\\n\t=item\\n\\\n\tReturn\\n\\\n\\n\\\n\t=over 3\\n\\\n\\n\\\n\\n\\\n\t=item\\n\\\n\tC<${3:...return data}>\\n\\\n\\n\\\n\\n\\\n\t=back\\n\\\n\\n\\\n\\n\\\n\t=back\\n\\\n\\n\\\n\\n\\\n\\n\\\n# Moose has\\n\\\nsnippet has\\n\\\n\thas ${1:attribute} => (\\n\\\n\t\tis\t    => '${2:ro|rw}',\\n\\\n\t\tisa \t=> '${3:Str|Int|HashRef|ArrayRef|etc}',\\n\\\n\t\tdefault => sub {\\n\\\n\t\t\t${4:defaultvalue}\\n\\\n\t\t},\\n\\\n\t\t${5:# other attributes}\\n\\\n\t);\\n\\\n\\n\\\n\\n\\\n# override\\n\\\nsnippet override\\n\\\n\toverride ${1:attribute} => sub {\\n\\\n\t\t${2:# my $self = shift;};\\n\\\n\t\t${3:# my ($self, $args) = @_;};\\n\\\n\t};\\n\\\n\\n\\\n\\n\\\n# use test classes\\n\\\nsnippet tuse\\n\\\n\tuse Test::More;\\n\\\n\tuse Test::Deep; # (); # uncomment to stop prototype errors\\n\\\n\tuse Test::Exception;\\n\\\n\\n\\\n# local test lib\\n\\\nsnippet tlib\\n\\\n\tuse lib qw{ ./t/lib };\\n\\\n\\n\\\n#test methods\\n\\\nsnippet tmeths\\n\\\n\t$ENV{TEST_METHOD} = '${1:regex}';\\n\\\n\\n\\\n# runtestclass\\n\\\nsnippet trunner\\n\\\n\tuse ${1:test_class};\\n\\\n\t$1->runtests();\\n\\\n\\n\\\n# Test::Class-style test\\n\\\nsnippet tsub\\n\\\n\tsub t${1:number}_${2:test_case} :Test(${3:num_of_tests}) {\\n\\\n\t\tmy $self = shift;\\n\\\n\t\t${4:#  body}\\n\\\n\\n\\\n\t}\\n\\\n\\n\\\n# Test::Routine-style test\\n\\\nsnippet trsub\\n\\\n\ttest ${1:test_name} => { description => '${2:Description of test.}'} => sub {\\n\\\n\t\tmy ($self) = @_;\\n\\\n\t\t${3:# test code}\\n\\\n\t};\\n\\\n\\n\\\n#prep test method\\n\\\nsnippet tprep\\n\\\n\tsub prep${1:number}_${2:test_case} :Test(startup) {\\n\\\n\t\tmy $self = shift;\\n\\\n\t\t${4:#  body}\\n\\\n\t}\\n\\\n\\n\\\n# cause failures to print stack trace\\n\\\nsnippet debug_trace\\n\\\n\tuse Carp; # 'verbose';\\n\\\n\t# cloak \\\"die\\\"\\n\\\n\t# warn \\\"warning\\\"\\n\\\n\t$SIG{'__DIE__'} = sub {\\n\\\n\t\trequire Carp; Carp::confess\\n\\\n\t};\\n\\\n\\n\\\n\";\nexports.scope = \"perl\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/pgsql.js",
    "content": "ace.define(\"ace/snippets/pgsql\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"pgsql\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/php.js",
    "content": "ace.define(\"ace/snippets/php\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"snippet <?\\n\\\n\t<?php\\n\\\n\\n\\\n\t${1}\\n\\\nsnippet ec\\n\\\n\techo ${1};\\n\\\nsnippet <?e\\n\\\n\t<?php echo ${1} ?>\\n\\\n# this one is for php5.4\\n\\\nsnippet <?=\\n\\\n\t<?=${1}?>\\n\\\nsnippet ns\\n\\\n\tnamespace ${1:Foo\\\\Bar\\\\Baz};\\n\\\n\t${2}\\n\\\nsnippet use\\n\\\n\tuse ${1:Foo\\\\Bar\\\\Baz};\\n\\\n\t${2}\\n\\\nsnippet c\\n\\\n\t${1:abstract }class ${2:$FILENAME}\\n\\\n\t{\\n\\\n\t\t${3}\\n\\\n\t}\\n\\\nsnippet i\\n\\\n\tinterface ${1:$FILENAME}\\n\\\n\t{\\n\\\n\t\t${2}\\n\\\n\t}\\n\\\nsnippet t.\\n\\\n\t$this->${1}\\n\\\nsnippet f\\n\\\n\tfunction ${1:foo}(${2:array }${3:$bar})\\n\\\n\t{\\n\\\n\t\t${4}\\n\\\n\t}\\n\\\n# method\\n\\\nsnippet m\\n\\\n\t${1:abstract }${2:protected}${3: static} function ${4:foo}(${5:array }${6:$bar})\\n\\\n\t{\\n\\\n\t\t${7}\\n\\\n\t}\\n\\\n# setter method\\n\\\nsnippet sm \\n\\\n\t${5:public} function set${6:$2}(${7:$2 }$$1)\\n\\\n\t{\\n\\\n\t\t$this->${8:$1} = $$1;\\n\\\n\t\treturn $this;\\n\\\n\t}${9}\\n\\\n# getter method\\n\\\nsnippet gm\\n\\\n\t${3:public} function get${4:$2}()\\n\\\n\t{\\n\\\n\t\treturn $this->${5:$1};\\n\\\n\t}${6}\\n\\\n#setter\\n\\\nsnippet $s\\n\\\n\t${1:$foo}->set${2:Bar}(${3});\\n\\\n#getter\\n\\\nsnippet $g\\n\\\n\t${1:$foo}->get${2:Bar}();\\n\\\n\\n\\\n# Tertiary conditional\\n\\\nsnippet =?:\\n\\\n\t$${1:foo} = ${2:true} ? ${3:a} : ${4};\\n\\\nsnippet ?:\\n\\\n\t${1:true} ? ${2:a} : ${3}\\n\\\n\\n\\\nsnippet C\\n\\\n\t$_COOKIE['${1:variable}']${2}\\n\\\nsnippet E\\n\\\n\t$_ENV['${1:variable}']${2}\\n\\\nsnippet F\\n\\\n\t$_FILES['${1:variable}']${2}\\n\\\nsnippet G\\n\\\n\t$_GET['${1:variable}']${2}\\n\\\nsnippet P\\n\\\n\t$_POST['${1:variable}']${2}\\n\\\nsnippet R\\n\\\n\t$_REQUEST['${1:variable}']${2}\\n\\\nsnippet S\\n\\\n\t$_SERVER['${1:variable}']${2}\\n\\\nsnippet SS\\n\\\n\t$_SESSION['${1:variable}']${2}\\n\\\n\t\\n\\\n# the following are old ones\\n\\\nsnippet inc\\n\\\n\tinclude '${1:file}';${2}\\n\\\nsnippet inc1\\n\\\n\tinclude_once '${1:file}';${2}\\n\\\nsnippet req\\n\\\n\trequire '${1:file}';${2}\\n\\\nsnippet req1\\n\\\n\trequire_once '${1:file}';${2}\\n\\\n# Start Docblock\\n\\\nsnippet /*\\n\\\n# Class - post doc\\n\\\nsnippet doc_cp${5}\\n\\\n# Class Variable - post doc\\n\\\nsnippet doc_vp${3}\\n\\\n# Class Variable\\n\\\nsnippet doc_v\\n\\\n\t${1:var} $${2};${5}\\n\\\n# Class\\n\\\nsnippet doc_c\\n\\\n\t${1:}class ${2:}\\n\\\n\t{\\n\\\n\t\t${7}\\n\\\n\t} // END $1class $2\\n\\\n# Constant Definition - post doc\\n\\\nsnippet doc_dp${2}\\n\\\n# Constant Definition\\n\\\nsnippet doc_d\\n\\\n\tace.define(${1}, ${2});${4}\\n\\\n# Function - post doc\\n\\\nsnippet doc_fp${4}\\n\\\n# Function signature\\n\\\nsnippet doc_s\\n\\\n\t${1}function ${2}(${3});${7}\\n\\\n# Function\\n\\\nsnippet doc_f\\n\\\n\t${1}function ${2}(${3})\\n\\\n\t{${7}\\n\\\n\t}\\n\\\n# Header\\n\\\nsnippet doc_h\\n\\\n\t\\n\\\n# Interface\\n\\\nsnippet interface\\n\\\n\tinterface ${1:$FILENAME}\\n\\\n\t{\\n\\\n\t\t${5}\\n\\\n\t}\\n\\\n# class ...\\n\\\nsnippet class\\n\\\n\tclass ${2:$FILENAME}\\n\\\n\t{\\n\\\n\t\t${3}\\n\\\n\t\t${5:public} function ${6:__construct}(${7:argument})\\n\\\n\t\t{\\n\\\n\t\t\t${8:// code...}\\n\\\n\t\t}\\n\\\n\t}\\n\\\n# ace.define(...)\\n\\\nsnippet def\\n\\\n\tace.define('${1}'${2});${3}\\n\\\n# defined(...)\\n\\\nsnippet def?\\n\\\n\t${1}defined('${2}')${3}\\n\\\nsnippet wh\\n\\\n\twhile (${1:/* condition */}) {\\n\\\n\t\t${2:// code...}\\n\\\n\t}\\n\\\n# do ... while\\n\\\nsnippet do\\n\\\n\tdo {\\n\\\n\t\t${2:// code... }\\n\\\n\t} while (${1:/* condition */});\\n\\\nsnippet if\\n\\\n\tif (${1:/* condition */}) {\\n\\\n\t\t${2:// code...}\\n\\\n\t}\\n\\\nsnippet ifil\\n\\\n\t<?php if (${1:/* condition */}): ?>\\n\\\n\t\t${2:<!-- code... -->}\\n\\\n\t<?php endif; ?>\\n\\\nsnippet ife\\n\\\n\tif (${1:/* condition */}) {\\n\\\n\t\t${2:// code...}\\n\\\n\t} else {\\n\\\n\t\t${3:// code...}\\n\\\n\t}\\n\\\n\t${4}\\n\\\nsnippet ifeil\\n\\\n\t<?php if (${1:/* condition */}): ?>\\n\\\n\t\t${2:<!-- html... -->}\\n\\\n\t<?php else: ?>\\n\\\n\t\t${3:<!-- html... -->}\\n\\\n\t<?php endif; ?>\\n\\\n\t${4}\\n\\\nsnippet else\\n\\\n\telse {\\n\\\n\t\t${1:// code...}\\n\\\n\t}\\n\\\nsnippet elseif\\n\\\n\telseif (${1:/* condition */}) {\\n\\\n\t\t${2:// code...}\\n\\\n\t}\\n\\\nsnippet switch\\n\\\n\tswitch ($${1:variable}) {\\n\\\n\t\tcase '${2:value}':\\n\\\n\t\t\t${3:// code...}\\n\\\n\t\t\tbreak;\\n\\\n\t\t${5}\\n\\\n\t\tdefault:\\n\\\n\t\t\t${4:// code...}\\n\\\n\t\t\tbreak;\\n\\\n\t}\\n\\\nsnippet case\\n\\\n\tcase '${1:value}':\\n\\\n\t\t${2:// code...}\\n\\\n\t\tbreak;${3}\\n\\\nsnippet for\\n\\\n\tfor ($${2:i} = 0; $$2 < ${1:count}; $$2${3:++}) {\\n\\\n\t\t${4: // code...}\\n\\\n\t}\\n\\\nsnippet foreach\\n\\\n\tforeach ($${1:variable} as $${2:value}) {\\n\\\n\t\t${3:// code...}\\n\\\n\t}\\n\\\nsnippet foreachil\\n\\\n\t<?php foreach ($${1:variable} as $${2:value}): ?>\\n\\\n\t\t${3:<!-- html... -->}\\n\\\n\t<?php endforeach; ?>\\n\\\nsnippet foreachk\\n\\\n\tforeach ($${1:variable} as $${2:key} => $${3:value}) {\\n\\\n\t\t${4:// code...}\\n\\\n\t}\\n\\\nsnippet foreachkil\\n\\\n\t<?php foreach ($${1:variable} as $${2:key} => $${3:value}): ?>\\n\\\n\t\t${4:<!-- html... -->}\\n\\\n\t<?php endforeach; ?>\\n\\\n# $... = array (...)\\n\\\nsnippet array\\n\\\n\t$${1:arrayName} = array('${2}' => ${3});${4}\\n\\\nsnippet try\\n\\\n\ttry {\\n\\\n\t\t${2}\\n\\\n\t} catch (${1:Exception} $e) {\\n\\\n\t}\\n\\\n# lambda with closure\\n\\\nsnippet lambda\\n\\\n\t${1:static }function (${2:args}) use (${3:&$x, $y /*put vars in scope (closure) */}) {\\n\\\n\t\t${4}\\n\\\n\t};\\n\\\n# pre_dump();\\n\\\nsnippet pd\\n\\\n\techo '<pre>'; var_dump(${1}); echo '</pre>';\\n\\\n# pre_dump(); die();\\n\\\nsnippet pdd\\n\\\n\techo '<pre>'; var_dump(${1}); echo '</pre>'; die(${2:});\\n\\\nsnippet vd\\n\\\n\tvar_dump(${1});\\n\\\nsnippet vdd\\n\\\n\tvar_dump(${1}); die(${2:});\\n\\\nsnippet http_redirect\\n\\\n\theader (\\\"HTTP/1.1 301 Moved Permanently\\\"); \\n\\\n\theader (\\\"Location: \\\".URL); \\n\\\n\texit();\\n\\\n# Getters & Setters\\n\\\nsnippet gs\\n\\\n\tpublic function get${3:$2}()\\n\\\n\t{\\n\\\n\t\treturn $this->${4:$1};\\n\\\n\t}\\n\\\n\tpublic function set$3(${7:$2 }$$1)\\n\\\n\t{\\n\\\n\t\t$this->$4 = $$1;\\n\\\n\t\treturn $this;\\n\\\n\t}${8}\\n\\\n# anotation, get, and set, useful for doctrine\\n\\\nsnippet ags\\n\\\n\t${2:protected} $${3:foo};\\n\\\n\\n\\\n\tpublic function get${4:$3}()\\n\\\n\t{\\n\\\n\t\treturn $this->$3;\\n\\\n\t}\\n\\\n\\n\\\n\tpublic function set$4(${5:$4 }$${6:$3})\\n\\\n\t{\\n\\\n\t\t$this->$3 = $$6;\\n\\\n\t\treturn $this;\\n\\\n\t}\\n\\\nsnippet rett\\n\\\n\treturn true;\\n\\\nsnippet retf\\n\\\n\treturn false;\\n\\\n\";\nexports.scope = \"php\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/plain_text.js",
    "content": "ace.define(\"ace/snippets/plain_text\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"plain_text\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/powershell.js",
    "content": "ace.define(\"ace/snippets/powershell\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"powershell\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/praat.js",
    "content": "ace.define(\"ace/snippets/praat\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"praat\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/prolog.js",
    "content": "ace.define(\"ace/snippets/prolog\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"prolog\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/properties.js",
    "content": "ace.define(\"ace/snippets/properties\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"properties\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/protobuf.js",
    "content": "ace.define(\"ace/snippets/protobuf\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"\";\nexports.scope = \"protobuf\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/python.js",
    "content": "ace.define(\"ace/snippets/python\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"snippet #!\\n\\\n\t#!/usr/bin/env python\\n\\\nsnippet imp\\n\\\n\timport ${1:module}\\n\\\nsnippet from\\n\\\n\tfrom ${1:package} import ${2:module}\\n\\\n# Module Docstring\\n\\\nsnippet docs\\n\\\n\t'''\\n\\\n\tFile: ${1:FILENAME:file_name}\\n\\\n\tAuthor: ${2:author}\\n\\\n\tDescription: ${3}\\n\\\n\t'''\\n\\\nsnippet wh\\n\\\n\twhile ${1:condition}:\\n\\\n\t\t${2:# TODO: write code...}\\n\\\n# dowh - does the same as do...while in other languages\\n\\\nsnippet dowh\\n\\\n\twhile True:\\n\\\n\t\t${1:# TODO: write code...}\\n\\\n\t\tif ${2:condition}:\\n\\\n\t\t\tbreak\\n\\\nsnippet with\\n\\\n\twith ${1:expr} as ${2:var}:\\n\\\n\t\t${3:# TODO: write code...}\\n\\\n# New Class\\n\\\nsnippet cl\\n\\\n\tclass ${1:ClassName}(${2:object}):\\n\\\n\t\t\\\"\\\"\\\"${3:docstring for $1}\\\"\\\"\\\"\\n\\\n\t\tdef __init__(self, ${4:arg}):\\n\\\n\t\t\t${5:super($1, self).__init__()}\\n\\\n\t\t\tself.$4 = $4\\n\\\n\t\t\t${6}\\n\\\n# New Function\\n\\\nsnippet def\\n\\\n\tdef ${1:fname}(${2:`indent('.') ? 'self' : ''`}):\\n\\\n\t\t\\\"\\\"\\\"${3:docstring for $1}\\\"\\\"\\\"\\n\\\n\t\t${4:# TODO: write code...}\\n\\\nsnippet deff\\n\\\n\tdef ${1:fname}(${2:`indent('.') ? 'self' : ''`}):\\n\\\n\t\t${3:# TODO: write code...}\\n\\\n# New Method\\n\\\nsnippet defs\\n\\\n\tdef ${1:mname}(self, ${2:arg}):\\n\\\n\t\t${3:# TODO: write code...}\\n\\\n# New Property\\n\\\nsnippet property\\n\\\n\tdef ${1:foo}():\\n\\\n\t\tdoc = \\\"${2:The $1 property.}\\\"\\n\\\n\t\tdef fget(self):\\n\\\n\t\t\t${3:return self._$1}\\n\\\n\t\tdef fset(self, value):\\n\\\n\t\t\t${4:self._$1 = value}\\n\\\n# Ifs\\n\\\nsnippet if\\n\\\n\tif ${1:condition}:\\n\\\n\t\t${2:# TODO: write code...}\\n\\\nsnippet el\\n\\\n\telse:\\n\\\n\t\t${1:# TODO: write code...}\\n\\\nsnippet ei\\n\\\n\telif ${1:condition}:\\n\\\n\t\t${2:# TODO: write code...}\\n\\\n# For\\n\\\nsnippet for\\n\\\n\tfor ${1:item} in ${2:items}:\\n\\\n\t\t${3:# TODO: write code...}\\n\\\n# Encodes\\n\\\nsnippet cutf8\\n\\\n\t# -*- coding: utf-8 -*-\\n\\\nsnippet clatin1\\n\\\n\t# -*- coding: latin-1 -*-\\n\\\nsnippet cascii\\n\\\n\t# -*- coding: ascii -*-\\n\\\n# Lambda\\n\\\nsnippet ld\\n\\\n\t${1:var} = lambda ${2:vars} : ${3:action}\\n\\\nsnippet .\\n\\\n\tself.\\n\\\nsnippet try Try/Except\\n\\\n\ttry:\\n\\\n\t\t${1:# TODO: write code...}\\n\\\n\texcept ${2:Exception}, ${3:e}:\\n\\\n\t\t${4:raise $3}\\n\\\nsnippet try Try/Except/Else\\n\\\n\ttry:\\n\\\n\t\t${1:# TODO: write code...}\\n\\\n\texcept ${2:Exception}, ${3:e}:\\n\\\n\t\t${4:raise $3}\\n\\\n\telse:\\n\\\n\t\t${5:# TODO: write code...}\\n\\\nsnippet try Try/Except/Finally\\n\\\n\ttry:\\n\\\n\t\t${1:# TODO: write code...}\\n\\\n\texcept ${2:Exception}, ${3:e}:\\n\\\n\t\t${4:raise $3}\\n\\\n\tfinally:\\n\\\n\t\t${5:# TODO: write code...}\\n\\\nsnippet try Try/Except/Else/Finally\\n\\\n\ttry:\\n\\\n\t\t${1:# TODO: write code...}\\n\\\n\texcept ${2:Exception}, ${3:e}:\\n\\\n\t\t${4:raise $3}\\n\\\n\telse:\\n\\\n\t\t${5:# TODO: write code...}\\n\\\n\tfinally:\\n\\\n\t\t${6:# TODO: write code...}\\n\\\n# if __name__ == '__main__':\\n\\\nsnippet ifmain\\n\\\n\tif __name__ == '__main__':\\n\\\n\t\t${1:main()}\\n\\\n# __magic__\\n\\\nsnippet _\\n\\\n\t__${1:init}__${2}\\n\\\n# python debugger (pdb)\\n\\\nsnippet pdb\\n\\\n\timport pdb; pdb.set_trace()\\n\\\n# ipython debugger (ipdb)\\n\\\nsnippet ipdb\\n\\\n\timport ipdb; ipdb.set_trace()\\n\\\n# ipython debugger (pdbbb)\\n\\\nsnippet pdbbb\\n\\\n\timport pdbpp; pdbpp.set_trace()\\n\\\nsnippet pprint\\n\\\n\timport pprint; pprint.pprint(${1})${2}\\n\\\nsnippet \\\"\\n\\\n\t\\\"\\\"\\\"\\n\\\n\t${1:doc}\\n\\\n\t\\\"\\\"\\\"\\n\\\n# test function/method\\n\\\nsnippet test\\n\\\n\tdef test_${1:description}(${2:self}):\\n\\\n\t\t${3:# TODO: write code...}\\n\\\n# test case\\n\\\nsnippet testcase\\n\\\n\tclass ${1:ExampleCase}(unittest.TestCase):\\n\\\n\t\t\\n\\\n\t\tdef test_${2:description}(self):\\n\\\n\t\t\t${3:# TODO: write code...}\\n\\\nsnippet fut\\n\\\n\tfrom __future__ import ${1}\\n\\\n#getopt\\n\\\nsnippet getopt\\n\\\n\ttry:\\n\\\n\t\t# Short option syntax: \\\"hv:\\\"\\n\\\n\t\t# Long option syntax: \\\"help\\\" or \\\"verbose=\\\"\\n\\\n\t\topts, args = getopt.getopt(sys.argv[1:], \\\"${1:short_options}\\\", [${2:long_options}])\\n\\\n\t\\n\\\n\texcept getopt.GetoptError, err:\\n\\\n\t\t# Print debug info\\n\\\n\t\tprint str(err)\\n\\\n\t\t${3:error_action}\\n\\\n\\n\\\n\tfor option, argument in opts:\\n\\\n\t\tif option in (\\\"-h\\\", \\\"--help\\\"):\\n\\\n\t\t\t${4}\\n\\\n\t\telif option in (\\\"-v\\\", \\\"--verbose\\\"):\\n\\\n\t\t\tverbose = argument\\n\\\n\";\nexports.scope = \"python\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/r.js",
    "content": "ace.define(\"ace/snippets/r\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"snippet #!\\n\\\n\t#!/usr/bin/env Rscript\\n\\\n\\n\\\n# includes\\n\\\nsnippet lib\\n\\\n\tlibrary(${1:package})\\n\\\nsnippet req\\n\\\n\trequire(${1:package})\\n\\\nsnippet source\\n\\\n\tsource('${1:file}')\\n\\\n\\n\\\n# conditionals\\n\\\nsnippet if\\n\\\n\tif (${1:condition}) {\\n\\\n\t\t${2:code}\\n\\\n\t}\\n\\\nsnippet el\\n\\\n\telse {\\n\\\n\t\t${1:code}\\n\\\n\t}\\n\\\nsnippet ei\\n\\\n\telse if (${1:condition}) {\\n\\\n\t\t${2:code}\\n\\\n\t}\\n\\\n\\n\\\n# functions\\n\\\nsnippet fun\\n\\\n\t${1:name} = function (${2:variables}) {\\n\\\n\t\t${3:code}\\n\\\n\t}\\n\\\nsnippet ret\\n\\\n\treturn(${1:code})\\n\\\n\\n\\\n# dataframes, lists, etc\\n\\\nsnippet df\\n\\\n\t${1:name}[${2:rows}, ${3:cols}]\\n\\\nsnippet c\\n\\\n\tc(${1:items})\\n\\\nsnippet li\\n\\\n\tlist(${1:items})\\n\\\nsnippet mat\\n\\\n\tmatrix(${1:data}, nrow=${2:rows}, ncol=${3:cols})\\n\\\n\\n\\\n# apply functions\\n\\\nsnippet apply\\n\\\n\tapply(${1:array}, ${2:margin}, ${3:function})\\n\\\nsnippet lapply\\n\\\n\tlapply(${1:list}, ${2:function})\\n\\\nsnippet sapply\\n\\\n\tlapply(${1:list}, ${2:function})\\n\\\nsnippet vapply\\n\\\n\tvapply(${1:list}, ${2:function}, ${3:type})\\n\\\nsnippet mapply\\n\\\n\tmapply(${1:function}, ${2:...})\\n\\\nsnippet tapply\\n\\\n\ttapply(${1:vector}, ${2:index}, ${3:function})\\n\\\nsnippet rapply\\n\\\n\trapply(${1:list}, ${2:function})\\n\\\n\\n\\\n# plyr functions\\n\\\nsnippet dd\\n\\\n\tddply(${1:frame}, ${2:variables}, ${3:function})\\n\\\nsnippet dl\\n\\\n\tdlply(${1:frame}, ${2:variables}, ${3:function})\\n\\\nsnippet da\\n\\\n\tdaply(${1:frame}, ${2:variables}, ${3:function})\\n\\\nsnippet d_\\n\\\n\td_ply(${1:frame}, ${2:variables}, ${3:function})\\n\\\n\\n\\\nsnippet ad\\n\\\n\tadply(${1:array}, ${2:margin}, ${3:function})\\n\\\nsnippet al\\n\\\n\talply(${1:array}, ${2:margin}, ${3:function})\\n\\\nsnippet aa\\n\\\n\taaply(${1:array}, ${2:margin}, ${3:function})\\n\\\nsnippet a_\\n\\\n\ta_ply(${1:array}, ${2:margin}, ${3:function})\\n\\\n\\n\\\nsnippet ld\\n\\\n\tldply(${1:list}, ${2:function})\\n\\\nsnippet ll\\n\\\n\tllply(${1:list}, ${2:function})\\n\\\nsnippet la\\n\\\n\tlaply(${1:list}, ${2:function})\\n\\\nsnippet l_\\n\\\n\tl_ply(${1:list}, ${2:function})\\n\\\n\\n\\\nsnippet md\\n\\\n\tmdply(${1:matrix}, ${2:function})\\n\\\nsnippet ml\\n\\\n\tmlply(${1:matrix}, ${2:function})\\n\\\nsnippet ma\\n\\\n\tmaply(${1:matrix}, ${2:function})\\n\\\nsnippet m_\\n\\\n\tm_ply(${1:matrix}, ${2:function})\\n\\\n\\n\\\n# plot functions\\n\\\nsnippet pl\\n\\\n\tplot(${1:x}, ${2:y})\\n\\\nsnippet ggp\\n\\\n\tggplot(${1:data}, aes(${2:aesthetics}))\\n\\\nsnippet img\\n\\\n\t${1:(jpeg,bmp,png,tiff)}(filename=\\\"${2:filename}\\\", width=${3}, height=${4}, unit=\\\"${5}\\\")\\n\\\n\t${6:plot}\\n\\\n\tdev.off()\\n\\\n\\n\\\n# statistical test functions\\n\\\nsnippet fis\\n\\\n\tfisher.test(${1:x}, ${2:y})\\n\\\nsnippet chi\\n\\\n\tchisq.test(${1:x}, ${2:y})\\n\\\nsnippet tt\\n\\\n\tt.test(${1:x}, ${2:y})\\n\\\nsnippet wil\\n\\\n\twilcox.test(${1:x}, ${2:y})\\n\\\nsnippet cor\\n\\\n\tcor.test(${1:x}, ${2:y})\\n\\\nsnippet fte\\n\\\n\tvar.test(${1:x}, ${2:y})\\n\\\nsnippet kvt \\n\\\n\tkv.test(${1:x}, ${2:y})\\n\\\n\";\nexports.scope = \"r\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/rdoc.js",
    "content": "ace.define(\"ace/snippets/rdoc\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"rdoc\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/rhtml.js",
    "content": "ace.define(\"ace/snippets/rhtml\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"rhtml\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/ruby.js",
    "content": "ace.define(\"ace/snippets/ruby\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"########################################\\n\\\n# Ruby snippets - for Rails, see below #\\n\\\n########################################\\n\\\n\\n\\\n# encoding for Ruby 1.9\\n\\\nsnippet enc\\n\\\n\t# encoding: utf-8\\n\\\n\\n\\\n# #!/usr/bin/env ruby\\n\\\nsnippet #!\\n\\\n\t#!/usr/bin/env ruby\\n\\\n\t# encoding: utf-8\\n\\\n\\n\\\n# New Block\\n\\\nsnippet =b\\n\\\n\t=begin rdoc\\n\\\n\t\t${1}\\n\\\n\t=end\\n\\\nsnippet y\\n\\\n\t:yields: ${1:arguments}\\n\\\nsnippet rb\\n\\\n\t#!/usr/bin/env ruby -wKU\\n\\\nsnippet beg\\n\\\n\tbegin\\n\\\n\t\t${3}\\n\\\n\trescue ${1:Exception} => ${2:e}\\n\\\n\tend\\n\\\n\\n\\\nsnippet req require\\n\\\n\trequire \\\"${1}\\\"${2}\\n\\\nsnippet #\\n\\\n\t# =>\\n\\\nsnippet end\\n\\\n\t__END__\\n\\\nsnippet case\\n\\\n\tcase ${1:object}\\n\\\n\twhen ${2:condition}\\n\\\n\t\t${3}\\n\\\n\tend\\n\\\nsnippet when\\n\\\n\twhen ${1:condition}\\n\\\n\t\t${2}\\n\\\nsnippet def\\n\\\n\tdef ${1:method_name}\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet deft\\n\\\n\tdef test_${1:case_name}\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet if\\n\\\n\tif ${1:condition}\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet ife\\n\\\n\tif ${1:condition}\\n\\\n\t\t${2}\\n\\\n\telse\\n\\\n\t\t${3}\\n\\\n\tend\\n\\\nsnippet elsif\\n\\\n\telsif ${1:condition}\\n\\\n\t\t${2}\\n\\\nsnippet unless\\n\\\n\tunless ${1:condition}\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet while\\n\\\n\twhile ${1:condition}\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet for\\n\\\n\tfor ${1:e} in ${2:c}\\n\\\n\t\t${3}\\n\\\n\tend\\n\\\nsnippet until\\n\\\n\tuntil ${1:condition}\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet cla class .. end\\n\\\n\tclass ${1:`substitute(Filename(), '\\\\(_\\\\|^\\\\)\\\\(.\\\\)', '\\\\u\\\\2', 'g')`}\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet cla class .. initialize .. end\\n\\\n\tclass ${1:`substitute(Filename(), '\\\\(_\\\\|^\\\\)\\\\(.\\\\)', '\\\\u\\\\2', 'g')`}\\n\\\n\t\tdef initialize(${2:args})\\n\\\n\t\t\t${3}\\n\\\n\t\tend\\n\\\n\tend\\n\\\nsnippet cla class .. < ParentClass .. initialize .. end\\n\\\n\tclass ${1:`substitute(Filename(), '\\\\(_\\\\|^\\\\)\\\\(.\\\\)', '\\\\u\\\\2', 'g')`} < ${2:ParentClass}\\n\\\n\t\tdef initialize(${3:args})\\n\\\n\t\t\t${4}\\n\\\n\t\tend\\n\\\n\tend\\n\\\nsnippet cla ClassName = Struct .. do .. end\\n\\\n\t${1:`substitute(Filename(), '\\\\(_\\\\|^\\\\)\\\\(.\\\\)', '\\\\u\\\\2', 'g')`} = Struct.new(:${2:attr_names}) do\\n\\\n\t\tdef ${3:method_name}\\n\\\n\t\t\t${4}\\n\\\n\t\tend\\n\\\n\tend\\n\\\nsnippet cla class BlankSlate .. initialize .. end\\n\\\n\tclass ${1:BlankSlate}\\n\\\n\t\tinstance_methods.each { |meth| undef_method(meth) unless meth =~ /\\\\A__/ }\\n\\\n\tend\\n\\\nsnippet cla class << self .. end\\n\\\n\tclass << ${1:self}\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\n# class .. < DelegateClass .. initialize .. end\\n\\\nsnippet cla-\\n\\\n\tclass ${1:`substitute(Filename(), '\\\\(_\\\\|^\\\\)\\\\(.\\\\)', '\\\\u\\\\2', 'g')`} < DelegateClass(${2:ParentClass})\\n\\\n\t\tdef initialize(${3:args})\\n\\\n\t\t\tsuper(${4:del_obj})\\n\\\n\\n\\\n\t\t\t${5}\\n\\\n\t\tend\\n\\\n\tend\\n\\\nsnippet mod module .. end\\n\\\n\tmodule ${1:`substitute(Filename(), '\\\\(_\\\\|^\\\\)\\\\(.\\\\)', '\\\\u\\\\2', 'g')`}\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet mod module .. module_function .. end\\n\\\n\tmodule ${1:`substitute(Filename(), '\\\\(_\\\\|^\\\\)\\\\(.\\\\)', '\\\\u\\\\2', 'g')`}\\n\\\n\t\tmodule_function\\n\\\n\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet mod module .. ClassMethods .. end\\n\\\n\tmodule ${1:`substitute(Filename(), '\\\\(_\\\\|^\\\\)\\\\(.\\\\)', '\\\\u\\\\2', 'g')`}\\n\\\n\t\tmodule ClassMethods\\n\\\n\t\t\t${2}\\n\\\n\t\tend\\n\\\n\\n\\\n\t\tmodule InstanceMethods\\n\\\n\\n\\\n\t\tend\\n\\\n\\n\\\n\t\tdef self.included(receiver)\\n\\\n\t\t\treceiver.extend         ClassMethods\\n\\\n\t\t\treceiver.send :include, InstanceMethods\\n\\\n\t\tend\\n\\\n\tend\\n\\\n# attr_reader\\n\\\nsnippet r\\n\\\n\tattr_reader :${1:attr_names}\\n\\\n# attr_writer\\n\\\nsnippet w\\n\\\n\tattr_writer :${1:attr_names}\\n\\\n# attr_accessor\\n\\\nsnippet rw\\n\\\n\tattr_accessor :${1:attr_names}\\n\\\nsnippet atp\\n\\\n\tattr_protected :${1:attr_names}\\n\\\nsnippet ata\\n\\\n\tattr_accessible :${1:attr_names}\\n\\\n# include Enumerable\\n\\\nsnippet Enum\\n\\\n\tinclude Enumerable\\n\\\n\\n\\\n\tdef each(&block)\\n\\\n\t\t${1}\\n\\\n\tend\\n\\\n# include Comparable\\n\\\nsnippet Comp\\n\\\n\tinclude Comparable\\n\\\n\\n\\\n\tdef <=>(other)\\n\\\n\t\t${1}\\n\\\n\tend\\n\\\n# extend Forwardable\\n\\\nsnippet Forw-\\n\\\n\textend Forwardable\\n\\\n# def self\\n\\\nsnippet defs\\n\\\n\tdef self.${1:class_method_name}\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\n# def method_missing\\n\\\nsnippet defmm\\n\\\n\tdef method_missing(meth, *args, &blk)\\n\\\n\t\t${1}\\n\\\n\tend\\n\\\nsnippet defd\\n\\\n\tdef_delegator :${1:@del_obj}, :${2:del_meth}, :${3:new_name}\\n\\\nsnippet defds\\n\\\n\tdef_delegators :${1:@del_obj}, :${2:del_methods}\\n\\\nsnippet am\\n\\\n\talias_method :${1:new_name}, :${2:old_name}\\n\\\nsnippet app\\n\\\n\tif __FILE__ == $PROGRAM_NAME\\n\\\n\t\t${1}\\n\\\n\tend\\n\\\n# usage_if()\\n\\\nsnippet usai\\n\\\n\tif ARGV.${1}\\n\\\n\t\tabort \\\"Usage: #{$PROGRAM_NAME} ${2:ARGS_GO_HERE}\\\"${3}\\n\\\n\tend\\n\\\n# usage_unless()\\n\\\nsnippet usau\\n\\\n\tunless ARGV.${1}\\n\\\n\t\tabort \\\"Usage: #{$PROGRAM_NAME} ${2:ARGS_GO_HERE}\\\"${3}\\n\\\n\tend\\n\\\nsnippet array\\n\\\n\tArray.new(${1:10}) { |${2:i}| ${3} }\\n\\\nsnippet hash\\n\\\n\tHash.new { |${1:hash}, ${2:key}| $1[$2] = ${3} }\\n\\\nsnippet file File.foreach() { |line| .. }\\n\\\n\tFile.foreach(${1:\\\"path/to/file\\\"}) { |${2:line}| ${3} }\\n\\\nsnippet file File.read()\\n\\\n\tFile.read(${1:\\\"path/to/file\\\"})${2}\\n\\\nsnippet Dir Dir.global() { |file| .. }\\n\\\n\tDir.glob(${1:\\\"dir/glob/*\\\"}) { |${2:file}| ${3} }\\n\\\nsnippet Dir Dir[\\\"..\\\"]\\n\\\n\tDir[${1:\\\"glob/**/*.rb\\\"}]${2}\\n\\\nsnippet dir\\n\\\n\tFilename.dirname(__FILE__)\\n\\\nsnippet deli\\n\\\n\tdelete_if { |${1:e}| ${2} }\\n\\\nsnippet fil\\n\\\n\tfill(${1:range}) { |${2:i}| ${3} }\\n\\\n# flatten_once()\\n\\\nsnippet flao\\n\\\n\tinject(Array.new) { |${1:arr}, ${2:a}| $1.push(*$2)}${3}\\n\\\nsnippet zip\\n\\\n\tzip(${1:enums}) { |${2:row}| ${3} }\\n\\\n# downto(0) { |n| .. }\\n\\\nsnippet dow\\n\\\n\tdownto(${1:0}) { |${2:n}| ${3} }\\n\\\nsnippet ste\\n\\\n\tstep(${1:2}) { |${2:n}| ${3} }\\n\\\nsnippet tim\\n\\\n\ttimes { |${1:n}| ${2} }\\n\\\nsnippet upt\\n\\\n\tupto(${1:1.0/0.0}) { |${2:n}| ${3} }\\n\\\nsnippet loo\\n\\\n\tloop { ${1} }\\n\\\nsnippet ea\\n\\\n\teach { |${1:e}| ${2} }\\n\\\nsnippet ead\\n\\\n\teach do |${1:e}|\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet eab\\n\\\n\teach_byte { |${1:byte}| ${2} }\\n\\\nsnippet eac- each_char { |chr| .. }\\n\\\n\teach_char { |${1:chr}| ${2} }\\n\\\nsnippet eac- each_cons(..) { |group| .. }\\n\\\n\teach_cons(${1:2}) { |${2:group}| ${3} }\\n\\\nsnippet eai\\n\\\n\teach_index { |${1:i}| ${2} }\\n\\\nsnippet eaid\\n\\\n\teach_index do |${1:i}|\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet eak\\n\\\n\teach_key { |${1:key}| ${2} }\\n\\\nsnippet eakd\\n\\\n\teach_key do |${1:key}|\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet eal\\n\\\n\teach_line { |${1:line}| ${2} }\\n\\\nsnippet eald\\n\\\n\teach_line do |${1:line}|\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet eap\\n\\\n\teach_pair { |${1:name}, ${2:val}| ${3} }\\n\\\nsnippet eapd\\n\\\n\teach_pair do |${1:name}, ${2:val}|\\n\\\n\t\t${3}\\n\\\n\tend\\n\\\nsnippet eas-\\n\\\n\teach_slice(${1:2}) { |${2:group}| ${3} }\\n\\\nsnippet easd-\\n\\\n\teach_slice(${1:2}) do |${2:group}|\\n\\\n\t\t${3}\\n\\\n\tend\\n\\\nsnippet eav\\n\\\n\teach_value { |${1:val}| ${2} }\\n\\\nsnippet eavd\\n\\\n\teach_value do |${1:val}|\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet eawi\\n\\\n\teach_with_index { |${1:e}, ${2:i}| ${3} }\\n\\\nsnippet eawid\\n\\\n\teach_with_index do |${1:e},${2:i}|\\n\\\n\t\t${3}\\n\\\n\tend\\n\\\nsnippet reve\\n\\\n\treverse_each { |${1:e}| ${2} }\\n\\\nsnippet reved\\n\\\n\treverse_each do |${1:e}|\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet inj\\n\\\n\tinject(${1:init}) { |${2:mem}, ${3:var}| ${4} }\\n\\\nsnippet injd\\n\\\n\tinject(${1:init}) do |${2:mem}, ${3:var}|\\n\\\n\t\t${4}\\n\\\n\tend\\n\\\nsnippet map\\n\\\n\tmap { |${1:e}| ${2} }\\n\\\nsnippet mapd\\n\\\n\tmap do |${1:e}|\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet mapwi-\\n\\\n\tenum_with_index.map { |${1:e}, ${2:i}| ${3} }\\n\\\nsnippet sor\\n\\\n\tsort { |a, b| ${1} }\\n\\\nsnippet sorb\\n\\\n\tsort_by { |${1:e}| ${2} }\\n\\\nsnippet ran\\n\\\n\tsort_by { rand }\\n\\\nsnippet all\\n\\\n\tall? { |${1:e}| ${2} }\\n\\\nsnippet any\\n\\\n\tany? { |${1:e}| ${2} }\\n\\\nsnippet cl\\n\\\n\tclassify { |${1:e}| ${2} }\\n\\\nsnippet col\\n\\\n\tcollect { |${1:e}| ${2} }\\n\\\nsnippet cold\\n\\\n\tcollect do |${1:e}|\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet det\\n\\\n\tdetect { |${1:e}| ${2} }\\n\\\nsnippet detd\\n\\\n\tdetect do |${1:e}|\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet fet\\n\\\n\tfetch(${1:name}) { |${2:key}| ${3} }\\n\\\nsnippet fin\\n\\\n\tfind { |${1:e}| ${2} }\\n\\\nsnippet find\\n\\\n\tfind do |${1:e}|\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet fina\\n\\\n\tfind_all { |${1:e}| ${2} }\\n\\\nsnippet finad\\n\\\n\tfind_all do |${1:e}|\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet gre\\n\\\n\tgrep(${1:/pattern/}) { |${2:match}| ${3} }\\n\\\nsnippet sub\\n\\\n\t${1:g}sub(${2:/pattern/}) { |${3:match}| ${4} }\\n\\\nsnippet sca\\n\\\n\tscan(${1:/pattern/}) { |${2:match}| ${3} }\\n\\\nsnippet scad\\n\\\n\tscan(${1:/pattern/}) do |${2:match}|\\n\\\n\t\t${3}\\n\\\n\tend\\n\\\nsnippet max\\n\\\n\tmax { |a, b| ${1} }\\n\\\nsnippet min\\n\\\n\tmin { |a, b| ${1} }\\n\\\nsnippet par\\n\\\n\tpartition { |${1:e}| ${2} }\\n\\\nsnippet pard\\n\\\n\tpartition do |${1:e}|\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet rej\\n\\\n\treject { |${1:e}| ${2} }\\n\\\nsnippet rejd\\n\\\n\treject do |${1:e}|\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet sel\\n\\\n\tselect { |${1:e}| ${2} }\\n\\\nsnippet seld\\n\\\n\tselect do |${1:e}|\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet lam\\n\\\n\tlambda { |${1:args}| ${2} }\\n\\\nsnippet doo\\n\\\n\tdo\\n\\\n\t\t${1}\\n\\\n\tend\\n\\\nsnippet dov\\n\\\n\tdo |${1:variable}|\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet :\\n\\\n\t:${1:key} => ${2:\\\"value\\\"}${3}\\n\\\nsnippet ope\\n\\\n\topen(${1:\\\"path/or/url/or/pipe\\\"}, \\\"${2:w}\\\") { |${3:io}| ${4} }\\n\\\n# path_from_here()\\n\\\nsnippet fpath\\n\\\n\tFile.join(File.dirname(__FILE__), *%2[${1:rel path here}])${2}\\n\\\n# unix_filter {}\\n\\\nsnippet unif\\n\\\n\tARGF.each_line${1} do |${2:line}|\\n\\\n\t\t${3}\\n\\\n\tend\\n\\\n# option_parse {}\\n\\\nsnippet optp\\n\\\n\trequire \\\"optparse\\\"\\n\\\n\\n\\\n\toptions = {${1:default => \\\"args\\\"}}\\n\\\n\\n\\\n\tARGV.options do |opts|\\n\\\n\t\topts.banner = \\\"Usage: #{File.basename($PROGRAM_NAME)}\\n\\\nsnippet opt\\n\\\n\topts.on( \\\"-${1:o}\\\", \\\"--${2:long-option-name}\\\", ${3:String},\\n\\\n\t         \\\"${4:Option description.}\\\") do |${5:opt}|\\n\\\n\t\t${6}\\n\\\n\tend\\n\\\nsnippet tc\\n\\\n\trequire \\\"test/unit\\\"\\n\\\n\\n\\\n\trequire \\\"${1:library_file_name}\\\"\\n\\\n\\n\\\n\tclass Test${2:$1} < Test::Unit::TestCase\\n\\\n\t\tdef test_${3:case_name}\\n\\\n\t\t\t${4}\\n\\\n\t\tend\\n\\\n\tend\\n\\\nsnippet ts\\n\\\n\trequire \\\"test/unit\\\"\\n\\\n\\n\\\n\trequire \\\"tc_${1:test_case_file}\\\"\\n\\\n\trequire \\\"tc_${2:test_case_file}\\\"${3}\\n\\\nsnippet as\\n\\\n\tassert ${1:test}, \\\"${2:Failure message.}\\\"${3}\\n\\\nsnippet ase\\n\\\n\tassert_equal ${1:expected}, ${2:actual}${3}\\n\\\nsnippet asne\\n\\\n\tassert_not_equal ${1:unexpected}, ${2:actual}${3}\\n\\\nsnippet asid\\n\\\n\tassert_in_delta ${1:expected_float}, ${2:actual_float}, ${3:2 ** -20}${4}\\n\\\nsnippet asio\\n\\\n\tassert_instance_of ${1:ExpectedClass}, ${2:actual_instance}${3}\\n\\\nsnippet asko\\n\\\n\tassert_kind_of ${1:ExpectedKind}, ${2:actual_instance}${3}\\n\\\nsnippet asn\\n\\\n\tassert_nil ${1:instance}${2}\\n\\\nsnippet asnn\\n\\\n\tassert_not_nil ${1:instance}${2}\\n\\\nsnippet asm\\n\\\n\tassert_match /${1:expected_pattern}/, ${2:actual_string}${3}\\n\\\nsnippet asnm\\n\\\n\tassert_no_match /${1:unexpected_pattern}/, ${2:actual_string}${3}\\n\\\nsnippet aso\\n\\\n\tassert_operator ${1:left}, :${2:operator}, ${3:right}${4}\\n\\\nsnippet asr\\n\\\n\tassert_raise ${1:Exception} { ${2} }\\n\\\nsnippet asrd\\n\\\n\tassert_raise ${1:Exception} do\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet asnr\\n\\\n\tassert_nothing_raised ${1:Exception} { ${2} }\\n\\\nsnippet asnrd\\n\\\n\tassert_nothing_raised ${1:Exception} do\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet asrt\\n\\\n\tassert_respond_to ${1:object}, :${2:method}${3}\\n\\\nsnippet ass assert_same(..)\\n\\\n\tassert_same ${1:expected}, ${2:actual}${3}\\n\\\nsnippet ass assert_send(..)\\n\\\n\tassert_send [${1:object}, :${2:message}, ${3:args}]${4}\\n\\\nsnippet asns\\n\\\n\tassert_not_same ${1:unexpected}, ${2:actual}${3}\\n\\\nsnippet ast\\n\\\n\tassert_throws :${1:expected} { ${2} }\\n\\\nsnippet astd\\n\\\n\tassert_throws :${1:expected} do\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet asnt\\n\\\n\tassert_nothing_thrown { ${1} }\\n\\\nsnippet asntd\\n\\\n\tassert_nothing_thrown do\\n\\\n\t\t${1}\\n\\\n\tend\\n\\\nsnippet fl\\n\\\n\tflunk \\\"${1:Failure message.}\\\"${2}\\n\\\n# Benchmark.bmbm do .. end\\n\\\nsnippet bm-\\n\\\n\tTESTS = ${1:10_000}\\n\\\n\tBenchmark.bmbm do |results|\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet rep\\n\\\n\tresults.report(\\\"${1:name}:\\\") { TESTS.times { ${2} }}\\n\\\n# Marshal.dump(.., file)\\n\\\nsnippet Md\\n\\\n\tFile.open(${1:\\\"path/to/file.dump\\\"}, \\\"wb\\\") { |${2:file}| Marshal.dump(${3:obj}, $2) }${4}\\n\\\n# Mashal.load(obj)\\n\\\nsnippet Ml\\n\\\n\tFile.open(${1:\\\"path/to/file.dump\\\"}, \\\"rb\\\") { |${2:file}| Marshal.load($2) }${3}\\n\\\n# deep_copy(..)\\n\\\nsnippet deec\\n\\\n\tMarshal.load(Marshal.dump(${1:obj_to_copy}))${2}\\n\\\nsnippet Pn-\\n\\\n\tPStore.new(${1:\\\"file_name.pstore\\\"})${2}\\n\\\nsnippet tra\\n\\\n\ttransaction(${1:true}) { ${2} }\\n\\\n# xmlread(..)\\n\\\nsnippet xml-\\n\\\n\tREXML::Document.new(File.read(${1:\\\"path/to/file\\\"}))${2}\\n\\\n# xpath(..) { .. }\\n\\\nsnippet xpa\\n\\\n\telements.each(${1:\\\"//Xpath\\\"}) do |${2:node}|\\n\\\n\t\t${3}\\n\\\n\tend\\n\\\n# class_from_name()\\n\\\nsnippet clafn\\n\\\n\tsplit(\\\"::\\\").inject(Object) { |par, const| par.const_get(const) }\\n\\\n# singleton_class()\\n\\\nsnippet sinc\\n\\\n\tclass << self; self end\\n\\\nsnippet nam\\n\\\n\tnamespace :${1:`Filename()`} do\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet tas\\n\\\n\tdesc \\\"${1:Task description}\\\"\\n\\\n\ttask :${2:task_name => [:dependent, :tasks]} do\\n\\\n\t\t${3}\\n\\\n\tend\\n\\\n# block\\n\\\nsnippet b\\n\\\n\t{ |${1:var}| ${2} }\\n\\\nsnippet begin\\n\\\n\tbegin\\n\\\n\t\traise 'A test exception.'\\n\\\n\trescue Exception => e\\n\\\n\t\tputs e.message\\n\\\n\t\tputs e.backtrace.inspect\\n\\\n\telse\\n\\\n\t\t# other exception\\n\\\n\tensure\\n\\\n\t\t# always executed\\n\\\n\tend\\n\\\n\\n\\\n#debugging\\n\\\nsnippet debug\\n\\\n\trequire 'ruby-debug'; debugger; true;\\n\\\nsnippet pry\\n\\\n\trequire 'pry'; binding.pry\\n\\\n\\n\\\n#############################################\\n\\\n# Rails snippets - for pure Ruby, see above #\\n\\\n#############################################\\n\\\nsnippet art\\n\\\n\tassert_redirected_to ${1::action => \\\"${2:index}\\\"}\\n\\\nsnippet artnp\\n\\\n\tassert_redirected_to ${1:parent}_${2:child}_path(${3:@$1}, ${4:@$2})\\n\\\nsnippet artnpp\\n\\\n\tassert_redirected_to ${1:parent}_${2:child}_path(${3:@$1})\\n\\\nsnippet artp\\n\\\n\tassert_redirected_to ${1:model}_path(${2:@$1})\\n\\\nsnippet artpp\\n\\\n\tassert_redirected_to ${1:model}s_path\\n\\\nsnippet asd\\n\\\n\tassert_difference \\\"${1:Model}.${2:count}\\\", $1 do\\n\\\n\t\t${3}\\n\\\n\tend\\n\\\nsnippet asnd\\n\\\n\tassert_no_difference \\\"${1:Model}.${2:count}\\\" do\\n\\\n\t\t${3}\\n\\\n\tend\\n\\\nsnippet asre\\n\\\n\tassert_response :${1:success}, @response.body${2}\\n\\\nsnippet asrj\\n\\\n\tassert_rjs :${1:replace}, \\\"${2:dom id}\\\"\\n\\\nsnippet ass assert_select(..)\\n\\\n\tassert_select '${1:path}', :${2:text} => '${3:inner_html' ${4:do}\\n\\\nsnippet bf\\n\\\n\tbefore_filter :${1:method}\\n\\\nsnippet bt\\n\\\n\tbelongs_to :${1:association}\\n\\\nsnippet crw\\n\\\n\tcattr_accessor :${1:attr_names}\\n\\\nsnippet defcreate\\n\\\n\tdef create\\n\\\n\t\t@${1:model_class_name} = ${2:ModelClassName}.new(params[:$1])\\n\\\n\\n\\\n\t\trespond_to do |wants|\\n\\\n\t\t\tif @$1.save\\n\\\n\t\t\t\tflash[:notice] = '$2 was successfully created.'\\n\\\n\t\t\t\twants.html { redirect_to(@$1) }\\n\\\n\t\t\t\twants.xml  { render :xml => @$1, :status => :created, :location => @$1 }\\n\\\n\t\t\telse\\n\\\n\t\t\t\twants.html { render :action => \\\"new\\\" }\\n\\\n\t\t\t\twants.xml  { render :xml => @$1.errors, :status => :unprocessable_entity }\\n\\\n\t\t\tend\\n\\\n\t\tend\\n\\\n\tend${3}\\n\\\nsnippet defdestroy\\n\\\n\tdef destroy\\n\\\n\t\t@${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\\n\\\n\t\t@$1.destroy\\n\\\n\\n\\\n\t\trespond_to do |wants|\\n\\\n\t\t\twants.html { redirect_to($1s_url) }\\n\\\n\t\t\twants.xml  { head :ok }\\n\\\n\t\tend\\n\\\n\tend${3}\\n\\\nsnippet defedit\\n\\\n\tdef edit\\n\\\n\t\t@${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\\n\\\n\tend\\n\\\nsnippet defindex\\n\\\n\tdef index\\n\\\n\t\t@${1:model_class_name} = ${2:ModelClassName}.all\\n\\\n\\n\\\n\t\trespond_to do |wants|\\n\\\n\t\t\twants.html # index.html.erb\\n\\\n\t\t\twants.xml  { render :xml => @$1s }\\n\\\n\t\tend\\n\\\n\tend${3}\\n\\\nsnippet defnew\\n\\\n\tdef new\\n\\\n\t\t@${1:model_class_name} = ${2:ModelClassName}.new\\n\\\n\\n\\\n\t\trespond_to do |wants|\\n\\\n\t\t\twants.html # new.html.erb\\n\\\n\t\t\twants.xml  { render :xml => @$1 }\\n\\\n\t\tend\\n\\\n\tend${3}\\n\\\nsnippet defshow\\n\\\n\tdef show\\n\\\n\t\t@${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\\n\\\n\\n\\\n\t\trespond_to do |wants|\\n\\\n\t\t\twants.html # show.html.erb\\n\\\n\t\t\twants.xml  { render :xml => @$1 }\\n\\\n\t\tend\\n\\\n\tend${3}\\n\\\nsnippet defupdate\\n\\\n\tdef update\\n\\\n\t\t@${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\\n\\\n\\n\\\n\t\trespond_to do |wants|\\n\\\n\t\t\tif @$1.update_attributes(params[:$1])\\n\\\n\t\t\t\tflash[:notice] = '$2 was successfully updated.'\\n\\\n\t\t\t\twants.html { redirect_to(@$1) }\\n\\\n\t\t\t\twants.xml  { head :ok }\\n\\\n\t\t\telse\\n\\\n\t\t\t\twants.html { render :action => \\\"edit\\\" }\\n\\\n\t\t\t\twants.xml  { render :xml => @$1.errors, :status => :unprocessable_entity }\\n\\\n\t\t\tend\\n\\\n\t\tend\\n\\\n\tend${3}\\n\\\nsnippet flash\\n\\\n\tflash[:${1:notice}] = \\\"${2}\\\"\\n\\\nsnippet habtm\\n\\\n\thas_and_belongs_to_many :${1:object}, :join_table => \\\"${2:table_name}\\\", :foreign_key => \\\"${3}_id\\\"${4}\\n\\\nsnippet hm\\n\\\n\thas_many :${1:object}\\n\\\nsnippet hmd\\n\\\n\thas_many :${1:other}s, :class_name => \\\"${2:$1}\\\", :foreign_key => \\\"${3:$1}_id\\\", :dependent => :destroy${4}\\n\\\nsnippet hmt\\n\\\n\thas_many :${1:object}, :through => :${2:object}\\n\\\nsnippet ho\\n\\\n\thas_one :${1:object}\\n\\\nsnippet i18\\n\\\n\tI18n.t('${1:type.key}')${2}\\n\\\nsnippet ist\\n\\\n\t<%= image_submit_tag(\\\"${1:agree.png}\\\", :id => \\\"${2:id}\\\"${3} %>\\n\\\nsnippet log\\n\\\n\tRails.logger.${1:debug} ${2}\\n\\\nsnippet log2\\n\\\n\tRAILS_DEFAULT_LOGGER.${1:debug} ${2}\\n\\\nsnippet logd\\n\\\n\tlogger.debug { \\\"${1:message}\\\" }${2}\\n\\\nsnippet loge\\n\\\n\tlogger.error { \\\"${1:message}\\\" }${2}\\n\\\nsnippet logf\\n\\\n\tlogger.fatal { \\\"${1:message}\\\" }${2}\\n\\\nsnippet logi\\n\\\n\tlogger.info { \\\"${1:message}\\\" }${2}\\n\\\nsnippet logw\\n\\\n\tlogger.warn { \\\"${1:message}\\\" }${2}\\n\\\nsnippet mapc\\n\\\n\t${1:map}.${2:connect} '${3:controller/:action/:id}'\\n\\\nsnippet mapca\\n\\\n\t${1:map}.catch_all \\\"*${2:anything}\\\", :controller => \\\"${3:default}\\\", :action => \\\"${4:error}\\\"${5}\\n\\\nsnippet mapr\\n\\\n\t${1:map}.resource :${2:resource}\\n\\\nsnippet maprs\\n\\\n\t${1:map}.resources :${2:resource}\\n\\\nsnippet mapwo\\n\\\n\t${1:map}.with_options :${2:controller} => '${3:thing}' do |$3|\\n\\\n\t\t${4}\\n\\\n\tend\\n\\\nsnippet mbs\\n\\\n\tbefore_save :${1:method}\\n\\\nsnippet mcht\\n\\\n\tchange_table :${1:table_name} do |t|\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet mp\\n\\\n\tmap(&:${1:id})\\n\\\nsnippet mrw\\n\\\n\tmattr_accessor :${1:attr_names}\\n\\\nsnippet oa\\n\\\n\torder(\\\"${1:field}\\\")\\n\\\nsnippet od\\n\\\n\torder(\\\"${1:field} DESC\\\")\\n\\\nsnippet pa\\n\\\n\tparams[:${1:id}]${2}\\n\\\nsnippet ra\\n\\\n\trender :action => \\\"${1:action}\\\"\\n\\\nsnippet ral\\n\\\n\trender :action => \\\"${1:action}\\\", :layout => \\\"${2:layoutname}\\\"\\n\\\nsnippet rest\\n\\\n\trespond_to do |wants|\\n\\\n\t\twants.${1:html} { ${2} }\\n\\\n\tend\\n\\\nsnippet rf\\n\\\n\trender :file => \\\"${1:filepath}\\\"\\n\\\nsnippet rfu\\n\\\n\trender :file => \\\"${1:filepath}\\\", :use_full_path => ${2:false}\\n\\\nsnippet ri\\n\\\n\trender :inline => \\\"${1:<%= 'hello' %>}\\\"\\n\\\nsnippet ril\\n\\\n\trender :inline => \\\"${1:<%= 'hello' %>}\\\", :locals => { ${2::name} => \\\"${3:value}\\\"${4} }\\n\\\nsnippet rit\\n\\\n\trender :inline => \\\"${1:<%= 'hello' %>}\\\", :type => ${2::rxml}\\n\\\nsnippet rjson\\n\\\n\trender :json => ${1:text to render}\\n\\\nsnippet rl\\n\\\n\trender :layout => \\\"${1:layoutname}\\\"\\n\\\nsnippet rn\\n\\\n\trender :nothing => ${1:true}\\n\\\nsnippet rns\\n\\\n\trender :nothing => ${1:true}, :status => ${2:401}\\n\\\nsnippet rp\\n\\\n\trender :partial => \\\"${1:item}\\\"\\n\\\nsnippet rpc\\n\\\n\trender :partial => \\\"${1:item}\\\", :collection => ${2:@$1s}\\n\\\nsnippet rpl\\n\\\n\trender :partial => \\\"${1:item}\\\", :locals => { :${2:$1} => ${3:@$1}\\n\\\nsnippet rpo\\n\\\n\trender :partial => \\\"${1:item}\\\", :object => ${2:@$1}\\n\\\nsnippet rps\\n\\\n\trender :partial => \\\"${1:item}\\\", :status => ${2:500}\\n\\\nsnippet rt\\n\\\n\trender :text => \\\"${1:text to render}\\\"\\n\\\nsnippet rtl\\n\\\n\trender :text => \\\"${1:text to render}\\\", :layout => \\\"${2:layoutname}\\\"\\n\\\nsnippet rtlt\\n\\\n\trender :text => \\\"${1:text to render}\\\", :layout => ${2:true}\\n\\\nsnippet rts\\n\\\n\trender :text => \\\"${1:text to render}\\\", :status => ${2:401}\\n\\\nsnippet ru\\n\\\n\trender :update do |${1:page}|\\n\\\n\t\t$1.${2}\\n\\\n\tend\\n\\\nsnippet rxml\\n\\\n\trender :xml => ${1:text to render}\\n\\\nsnippet sc\\n\\\n\tscope :${1:name}, :where(:@${2:field} => ${3:value})\\n\\\nsnippet sl\\n\\\n\tscope :${1:name}, lambda do |${2:value}|\\n\\\n\t\twhere(\\\"${3:field = ?}\\\", ${4:bind var})\\n\\\n\tend\\n\\\nsnippet sha1\\n\\\n\tDigest::SHA1.hexdigest(${1:string})\\n\\\nsnippet sweeper\\n\\\n\tclass ${1:ModelClassName}Sweeper < ActionController::Caching::Sweeper\\n\\\n\t\tobserve $1\\n\\\n\\n\\\n\t\tdef after_save(${2:model_class_name})\\n\\\n\t\t\texpire_cache($2)\\n\\\n\t\tend\\n\\\n\\n\\\n\t\tdef after_destroy($2)\\n\\\n\t\t\texpire_cache($2)\\n\\\n\t\tend\\n\\\n\\n\\\n\t\tdef expire_cache($2)\\n\\\n\t\t\texpire_page\\n\\\n\t\tend\\n\\\n\tend\\n\\\nsnippet tcb\\n\\\n\tt.boolean :${1:title}\\n\\\n\t${2}\\n\\\nsnippet tcbi\\n\\\n\tt.binary :${1:title}, :limit => ${2:2}.megabytes\\n\\\n\t${3}\\n\\\nsnippet tcd\\n\\\n\tt.decimal :${1:title}, :precision => ${2:10}, :scale => ${3:2}\\n\\\n\t${4}\\n\\\nsnippet tcda\\n\\\n\tt.date :${1:title}\\n\\\n\t${2}\\n\\\nsnippet tcdt\\n\\\n\tt.datetime :${1:title}\\n\\\n\t${2}\\n\\\nsnippet tcf\\n\\\n\tt.float :${1:title}\\n\\\n\t${2}\\n\\\nsnippet tch\\n\\\n\tt.change :${1:name}, :${2:string}, :${3:limit} => ${4:80}\\n\\\n\t${5}\\n\\\nsnippet tci\\n\\\n\tt.integer :${1:title}\\n\\\n\t${2}\\n\\\nsnippet tcl\\n\\\n\tt.integer :lock_version, :null => false, :default => 0\\n\\\n\t${1}\\n\\\nsnippet tcr\\n\\\n\tt.references :${1:taggable}, :polymorphic => { :default => '${2:Photo}' }\\n\\\n\t${3}\\n\\\nsnippet tcs\\n\\\n\tt.string :${1:title}\\n\\\n\t${2}\\n\\\nsnippet tct\\n\\\n\tt.text :${1:title}\\n\\\n\t${2}\\n\\\nsnippet tcti\\n\\\n\tt.time :${1:title}\\n\\\n\t${2}\\n\\\nsnippet tcts\\n\\\n\tt.timestamp :${1:title}\\n\\\n\t${2}\\n\\\nsnippet tctss\\n\\\n\tt.timestamps\\n\\\n\t${1}\\n\\\nsnippet va\\n\\\n\tvalidates_associated :${1:attribute}\\n\\\nsnippet vao\\n\\\n\tvalidates_acceptance_of :${1:terms}\\n\\\nsnippet vc\\n\\\n\tvalidates_confirmation_of :${1:attribute}\\n\\\nsnippet ve\\n\\\n\tvalidates_exclusion_of :${1:attribute}, :in => ${2:%w( mov avi )}\\n\\\nsnippet vf\\n\\\n\tvalidates_format_of :${1:attribute}, :with => /${2:regex}/\\n\\\nsnippet vi\\n\\\n\tvalidates_inclusion_of :${1:attribute}, :in => %w(${2: mov avi })\\n\\\nsnippet vl\\n\\\n\tvalidates_length_of :${1:attribute}, :within => ${2:3}..${3:20}\\n\\\nsnippet vn\\n\\\n\tvalidates_numericality_of :${1:attribute}\\n\\\nsnippet vpo\\n\\\n\tvalidates_presence_of :${1:attribute}\\n\\\nsnippet vu\\n\\\n\tvalidates_uniqueness_of :${1:attribute}\\n\\\nsnippet wants\\n\\\n\twants.${1:js|xml|html} { ${2} }\\n\\\nsnippet wc\\n\\\n\twhere(${1:\\\"conditions\\\"}${2:, bind_var})\\n\\\nsnippet wh\\n\\\n\twhere(${1:field} => ${2:value})\\n\\\nsnippet xdelete\\n\\\n\txhr :delete, :${1:destroy}, :id => ${2:1}${3}\\n\\\nsnippet xget\\n\\\n\txhr :get, :${1:show}, :id => ${2:1}${3}\\n\\\nsnippet xpost\\n\\\n\txhr :post, :${1:create}, :${2:object} => { ${3} }\\n\\\nsnippet xput\\n\\\n\txhr :put, :${1:update}, :id => ${2:1}, :${3:object} => { ${4} }${5}\\n\\\nsnippet test\\n\\\n\ttest \\\"should ${1:do something}\\\" do\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\n#migrations\\n\\\nsnippet mac\\n\\\n\tadd_column :${1:table_name}, :${2:column_name}, :${3:data_type}\\n\\\nsnippet mrc\\n\\\n\tremove_column :${1:table_name}, :${2:column_name}\\n\\\nsnippet mrnc\\n\\\n\trename_column :${1:table_name}, :${2:old_column_name}, :${3:new_column_name}\\n\\\nsnippet mcc\\n\\\n\tchange_column :${1:table}, :${2:column}, :${3:type}\\n\\\nsnippet mccc\\n\\\n\tt.column :${1:title}, :${2:string}\\n\\\nsnippet mct\\n\\\n\tcreate_table :${1:table_name} do |t|\\n\\\n\t\tt.column :${2:name}, :${3:type}\\n\\\n\tend\\n\\\nsnippet migration\\n\\\n\tclass ${1:class_name} < ActiveRecord::Migration\\n\\\n\t\tdef self.up\\n\\\n\t\t\t${2}\\n\\\n\t\tend\\n\\\n\\n\\\n\t\tdef self.down\\n\\\n\t\tend\\n\\\n\tend\\n\\\n\\n\\\nsnippet trc\\n\\\n\tt.remove :${1:column}\\n\\\nsnippet tre\\n\\\n\tt.rename :${1:old_column_name}, :${2:new_column_name}\\n\\\n\t${3}\\n\\\nsnippet tref\\n\\\n\tt.references :${1:model}\\n\\\n\\n\\\n#rspec\\n\\\nsnippet it\\n\\\n\tit \\\"${1:spec_name}\\\" do\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet itp\\n\\\n\tit \\\"${1:spec_name}\\\"\\n\\\n\t${2}\\n\\\nsnippet desc\\n\\\n\tdescribe ${1:class_name} do\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet cont\\n\\\n\tcontext \\\"${1:message}\\\" do\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet bef\\n\\\n\tbefore :${1:each} do\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\nsnippet aft\\n\\\n\tafter :${1:each} do\\n\\\n\t\t${2}\\n\\\n\tend\\n\\\n\";\nexports.scope = \"ruby\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/rust.js",
    "content": "ace.define(\"ace/snippets/rust\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"rust\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/sass.js",
    "content": "ace.define(\"ace/snippets/sass\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"sass\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/scad.js",
    "content": "ace.define(\"ace/snippets/scad\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"scad\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/scala.js",
    "content": "ace.define(\"ace/snippets/scala\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"scala\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/scheme.js",
    "content": "ace.define(\"ace/snippets/scheme\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"scheme\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/scss.js",
    "content": "ace.define(\"ace/snippets/scss\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"scss\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/sh.js",
    "content": "ace.define(\"ace/snippets/sh\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"# Shebang. Executing bash via /usr/bin/env makes scripts more portable.\\n\\\nsnippet #!\\n\\\n\t#!/usr/bin/env bash\\n\\\n\t\\n\\\nsnippet if\\n\\\n\tif [[ ${1:condition} ]]; then\\n\\\n\t\t${2:#statements}\\n\\\n\tfi\\n\\\nsnippet elif\\n\\\n\telif [[ ${1:condition} ]]; then\\n\\\n\t\t${2:#statements}\\n\\\nsnippet for\\n\\\n\tfor (( ${2:i} = 0; $2 < ${1:count}; $2++ )); do\\n\\\n\t\t${3:#statements}\\n\\\n\tdone\\n\\\nsnippet fori\\n\\\n\tfor ${1:needle} in ${2:haystack} ; do\\n\\\n\t\t${3:#statements}\\n\\\n\tdone\\n\\\nsnippet wh\\n\\\n\twhile [[ ${1:condition} ]]; do\\n\\\n\t\t${2:#statements}\\n\\\n\tdone\\n\\\nsnippet until\\n\\\n\tuntil [[ ${1:condition} ]]; do\\n\\\n\t\t${2:#statements}\\n\\\n\tdone\\n\\\nsnippet case\\n\\\n\tcase ${1:word} in\\n\\\n\t\t${2:pattern})\\n\\\n\t\t\t${3};;\\n\\\n\tesac\\n\\\nsnippet go \\n\\\n\twhile getopts '${1:o}' ${2:opts} \\n\\\n\tdo \\n\\\n\t\tcase $$2 in\\n\\\n\t\t${3:o0})\\n\\\n\t\t\t${4:#staments};;\\n\\\n\t\tesac\\n\\\n\tdone\\n\\\n# Set SCRIPT_DIR variable to directory script is located.\\n\\\nsnippet sdir\\n\\\n\tSCRIPT_DIR=\\\"$( cd \\\"$( dirname \\\"${BASH_SOURCE[0]}\\\" )\\\" && pwd )\\\"\\n\\\n# getopt\\n\\\nsnippet getopt\\n\\\n\t__ScriptVersion=\\\"${1:version}\\\"\\n\\\n\\n\\\n\t#===  FUNCTION  ================================================================\\n\\\n\t#         NAME:  usage\\n\\\n\t#  DESCRIPTION:  Display usage information.\\n\\\n\t#===============================================================================\\n\\\n\tfunction usage ()\\n\\\n\t{\\n\\\n\t\t\tcat <<- EOT\\n\\\n\\n\\\n\t  Usage :  $${0:0} [options] [--] \\n\\\n\\n\\\n\t  Options: \\n\\\n\t  -h|help       Display this message\\n\\\n\t  -v|version    Display script version\\n\\\n\\n\\\n\t\t\tEOT\\n\\\n\t}    # ----------  end of function usage  ----------\\n\\\n\\n\\\n\t#-----------------------------------------------------------------------\\n\\\n\t#  Handle command line arguments\\n\\\n\t#-----------------------------------------------------------------------\\n\\\n\\n\\\n\twhile getopts \\\":hv\\\" opt\\n\\\n\tdo\\n\\\n\t  case $opt in\\n\\\n\\n\\\n\t\th|help     )  usage; exit 0   ;;\\n\\\n\\n\\\n\t\tv|version  )  echo \\\"$${0:0} -- Version $__ScriptVersion\\\"; exit 0   ;;\\n\\\n\\n\\\n\t\t\\\\? )  echo -e \\\"\\\\n  Option does not exist : $OPTARG\\\\n\\\"\\n\\\n\t\t\t  usage; exit 1   ;;\\n\\\n\\n\\\n\t  esac    # --- end of case ---\\n\\\n\tdone\\n\\\n\tshift $(($OPTIND-1))\\n\\\n\\n\\\n\";\nexports.scope = \"sh\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/sjs.js",
    "content": "ace.define(\"ace/snippets/sjs\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"sjs\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/smarty.js",
    "content": "ace.define(\"ace/snippets/smarty\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"smarty\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/snippets.js",
    "content": "ace.define(\"ace/snippets/snippets\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"# snippets for making snippets :)\\n\\\nsnippet snip\\n\\\n\tsnippet ${1:trigger}\\n\\\n\t\t${2}\\n\\\nsnippet msnip\\n\\\n\tsnippet ${1:trigger} ${2:description}\\n\\\n\t\t${3}\\n\\\nsnippet v\\n\\\n\t{VISUAL}\\n\\\n\";\nexports.scope = \"snippets\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/soy_template.js",
    "content": "ace.define(\"ace/snippets/soy_template\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"soy_template\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/space.js",
    "content": "ace.define(\"ace/snippets/space\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"space\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/sql.js",
    "content": "ace.define(\"ace/snippets/sql\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"snippet tbl\\n\\\n\tcreate table ${1:table} (\\n\\\n\t\t${2:columns}\\n\\\n\t);\\n\\\nsnippet col\\n\\\n\t${1:name}\t${2:type}\t${3:default ''}\t${4:not null}\\n\\\nsnippet ccol\\n\\\n\t${1:name}\tvarchar2(${2:size})\t${3:default ''}\t${4:not null}\\n\\\nsnippet ncol\\n\\\n\t${1:name}\tnumber\t${3:default 0}\t${4:not null}\\n\\\nsnippet dcol\\n\\\n\t${1:name}\tdate\t${3:default sysdate}\t${4:not null}\\n\\\nsnippet ind\\n\\\n\tcreate index ${3:$1_$2} on ${1:table}(${2:column});\\n\\\nsnippet uind\\n\\\n\tcreate unique index ${1:name} on ${2:table}(${3:column});\\n\\\nsnippet tblcom\\n\\\n\tcomment on table ${1:table} is '${2:comment}';\\n\\\nsnippet colcom\\n\\\n\tcomment on column ${1:table}.${2:column} is '${3:comment}';\\n\\\nsnippet addcol\\n\\\n\talter table ${1:table} add (${2:column} ${3:type});\\n\\\nsnippet seq\\n\\\n\tcreate sequence ${1:name} start with ${2:1} increment by ${3:1} minvalue ${4:1};\\n\\\nsnippet s*\\n\\\n\tselect * from ${1:table}\\n\\\n\";\nexports.scope = \"sql\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/stylus.js",
    "content": "ace.define(\"ace/snippets/stylus\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"stylus\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/svg.js",
    "content": "ace.define(\"ace/snippets/svg\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"svg\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/tcl.js",
    "content": "ace.define(\"ace/snippets/tcl\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"# #!/usr/bin/env tclsh\\n\\\nsnippet #!\\n\\\n\t#!/usr/bin/env tclsh\\n\\\n\t\\n\\\n# Process\\n\\\nsnippet pro\\n\\\n\tproc ${1:function_name} {${2:args}} {\\n\\\n\t\t${3:#body ...}\\n\\\n\t}\\n\\\n#xif\\n\\\nsnippet xif\\n\\\n\t${1:expr}? ${2:true} : ${3:false}\\n\\\n# Conditional\\n\\\nsnippet if\\n\\\n\tif {${1}} {\\n\\\n\t\t${2:# body...}\\n\\\n\t}\\n\\\n# Conditional if..else\\n\\\nsnippet ife\\n\\\n\tif {${1}} {\\n\\\n\t\t${2:# body...}\\n\\\n\t} else {\\n\\\n\t\t${3:# else...}\\n\\\n\t}\\n\\\n# Conditional if..elsif..else\\n\\\nsnippet ifee\\n\\\n\tif {${1}} {\\n\\\n\t\t${2:# body...}\\n\\\n\t} elseif {${3}} {\\n\\\n\t\t${4:# elsif...}\\n\\\n\t} else {\\n\\\n\t\t${5:# else...}\\n\\\n\t}\\n\\\n# If catch then\\n\\\nsnippet ifc\\n\\\n\tif { [catch {${1:#do something...}} ${2:err}] } {\\n\\\n\t\t${3:# handle failure...}\\n\\\n\t}\\n\\\n# Catch\\n\\\nsnippet catch\\n\\\n\tcatch {${1}} ${2:err} ${3:options}\\n\\\n# While Loop\\n\\\nsnippet wh\\n\\\n\twhile {${1}} {\\n\\\n\t\t${2:# body...}\\n\\\n\t}\\n\\\n# For Loop\\n\\\nsnippet for\\n\\\n\tfor {set ${2:var} 0} {$$2 < ${1:count}} {${3:incr} $2} {\\n\\\n\t\t${4:# body...}\\n\\\n\t}\\n\\\n# Foreach Loop\\n\\\nsnippet fore\\n\\\n\tforeach ${1:x} {${2:#list}} {\\n\\\n\t\t${3:# body...}\\n\\\n\t}\\n\\\n# after ms script...\\n\\\nsnippet af\\n\\\n\tafter ${1:ms} ${2:#do something}\\n\\\n# after cancel id\\n\\\nsnippet afc\\n\\\n\tafter cancel ${1:id or script}\\n\\\n# after idle\\n\\\nsnippet afi\\n\\\n\tafter idle ${1:script}\\n\\\n# after info id\\n\\\nsnippet afin\\n\\\n\tafter info ${1:id}\\n\\\n# Expr\\n\\\nsnippet exp\\n\\\n\texpr {${1:#expression here}}\\n\\\n# Switch\\n\\\nsnippet sw\\n\\\n\tswitch ${1:var} {\\n\\\n\t\t${3:pattern 1} {\\n\\\n\t\t\t${4:#do something}\\n\\\n\t\t}\\n\\\n\t\tdefault {\\n\\\n\t\t\t${2:#do something}\\n\\\n\t\t}\\n\\\n\t}\\n\\\n# Case\\n\\\nsnippet ca\\n\\\n\t${1:pattern} {\\n\\\n\t\t${2:#do something}\\n\\\n\t}${3}\\n\\\n# Namespace eval\\n\\\nsnippet ns\\n\\\n\tnamespace eval ${1:path} {${2:#script...}}\\n\\\n# Namespace current\\n\\\nsnippet nsc\\n\\\n\tnamespace current\\n\\\n\";\nexports.scope = \"tcl\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/tex.js",
    "content": "ace.define(\"ace/snippets/tex\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"#PREAMBLE\\n\\\n#newcommand\\n\\\nsnippet nc\\n\\\n\t\\\\newcommand{\\\\${1:cmd}}[${2:opt}]{${3:realcmd}}${4}\\n\\\n#usepackage\\n\\\nsnippet up\\n\\\n\t\\\\usepackage[${1:[options}]{${2:package}}\\n\\\n#newunicodechar\\n\\\nsnippet nuc\\n\\\n\t\\\\newunicodechar{${1}}{${2:\\\\ensuremath}${3:tex-substitute}}}\\n\\\n#DeclareMathOperator\\n\\\nsnippet dmo\\n\\\n\t\\\\DeclareMathOperator{${1}}{${2}}\\n\\\n\\n\\\n#DOCUMENT\\n\\\n# \\\\begin{}...\\\\end{}\\n\\\nsnippet begin\\n\\\n\t\\\\begin{${1:env}}\\n\\\n\t\t${2}\\n\\\n\t\\\\end{$1}\\n\\\n# Tabular\\n\\\nsnippet tab\\n\\\n\t\\\\begin{${1:tabular}}{${2:c}}\\n\\\n\t${3}\\n\\\n\t\\\\end{$1}\\n\\\nsnippet thm\\n\\\n\t\\\\begin[${1:author}]{${2:thm}}\\n\\\n\t${3}\\n\\\n\t\\\\end{$1}\\n\\\nsnippet center\\n\\\n\t\\\\begin{center}\\n\\\n\t\t${1}\\n\\\n\t\\\\end{center}\\n\\\n# Align(ed)\\n\\\nsnippet ali\\n\\\n\t\\\\begin{align${1:ed}}\\n\\\n\t\t${2}\\n\\\n\t\\\\end{align$1}\\n\\\n# Gather(ed)\\n\\\nsnippet gat\\n\\\n\t\\\\begin{gather${1:ed}}\\n\\\n\t\t${2}\\n\\\n\t\\\\end{gather$1}\\n\\\n# Equation\\n\\\nsnippet eq\\n\\\n\t\\\\begin{equation}\\n\\\n\t\t${1}\\n\\\n\t\\\\end{equation}\\n\\\n# Equation\\n\\\nsnippet eq*\\n\\\n\t\\\\begin{equation*}\\n\\\n\t\t${1}\\n\\\n\t\\\\end{equation*}\\n\\\n# Unnumbered Equation\\n\\\nsnippet \\\\\\n\\\n\t\\\\[\\n\\\n\t\t${1}\\n\\\n\t\\\\]\\n\\\n# Enumerate\\n\\\nsnippet enum\\n\\\n\t\\\\begin{enumerate}\\n\\\n\t\t\\\\item ${1}\\n\\\n\t\\\\end{enumerate}\\n\\\n# Itemize\\n\\\nsnippet itemize\\n\\\n\t\\\\begin{itemize}\\n\\\n\t\t\\\\item ${1}\\n\\\n\t\\\\end{itemize}\\n\\\n# Description\\n\\\nsnippet desc\\n\\\n\t\\\\begin{description}\\n\\\n\t\t\\\\item[${1}] ${2}\\n\\\n\t\\\\end{description}\\n\\\n# Matrix\\n\\\nsnippet mat\\n\\\n\t\\\\begin{${1:p/b/v/V/B/small}matrix}\\n\\\n\t\t${2}\\n\\\n\t\\\\end{$1matrix}\\n\\\n# Cases\\n\\\nsnippet cas\\n\\\n\t\\\\begin{cases}\\n\\\n\t\t${1:equation}, &\\\\text{ if }${2:case}\\\\\\\\\\n\\\n\t\t${3}\\n\\\n\t\\\\end{cases}\\n\\\n# Split\\n\\\nsnippet spl\\n\\\n\t\\\\begin{split}\\n\\\n\t\t${1}\\n\\\n\t\\\\end{split}\\n\\\n# Part\\n\\\nsnippet part\\n\\\n\t\\\\part{${1:part name}} % (fold)\\n\\\n\t\\\\label{prt:${2:$1}}\\n\\\n\t${3}\\n\\\n\t% part $2 (end)\\n\\\n# Chapter\\n\\\nsnippet cha\\n\\\n\t\\\\chapter{${1:chapter name}}\\n\\\n\t\\\\label{cha:${2:$1}}\\n\\\n\t${3}\\n\\\n# Section\\n\\\nsnippet sec\\n\\\n\t\\\\section{${1:section name}}\\n\\\n\t\\\\label{sec:${2:$1}}\\n\\\n\t${3}\\n\\\n# Sub Section\\n\\\nsnippet sub\\n\\\n\t\\\\subsection{${1:subsection name}}\\n\\\n\t\\\\label{sub:${2:$1}}\\n\\\n\t${3}\\n\\\n# Sub Sub Section\\n\\\nsnippet subs\\n\\\n\t\\\\subsubsection{${1:subsubsection name}}\\n\\\n\t\\\\label{ssub:${2:$1}}\\n\\\n\t${3}\\n\\\n# Paragraph\\n\\\nsnippet par\\n\\\n\t\\\\paragraph{${1:paragraph name}}\\n\\\n\t\\\\label{par:${2:$1}}\\n\\\n\t${3}\\n\\\n# Sub Paragraph\\n\\\nsnippet subp\\n\\\n\t\\\\subparagraph{${1:subparagraph name}}\\n\\\n\t\\\\label{subp:${2:$1}}\\n\\\n\t${3}\\n\\\n#References\\n\\\nsnippet itd\\n\\\n\t\\\\item[${1:description}] ${2:item}\\n\\\nsnippet figure\\n\\\n\t${1:Figure}~\\\\ref{${2:fig:}}${3}\\n\\\nsnippet table\\n\\\n\t${1:Table}~\\\\ref{${2:tab:}}${3}\\n\\\nsnippet listing\\n\\\n\t${1:Listing}~\\\\ref{${2:list}}${3}\\n\\\nsnippet section\\n\\\n\t${1:Section}~\\\\ref{${2:sec:}}${3}\\n\\\nsnippet page\\n\\\n\t${1:page}~\\\\pageref{${2}}${3}\\n\\\nsnippet index\\n\\\n\t\\\\index{${1:index}}${2}\\n\\\n#Citations\\n\\\nsnippet cite\\n\\\n\t\\\\cite[${1}]{${2}}${3}\\n\\\nsnippet fcite\\n\\\n\t\\\\footcite[${1}]{${2}}${3}\\n\\\n#Formating text: italic, bold, underline, small capital, emphase ..\\n\\\nsnippet it\\n\\\n\t\\\\textit{${1:text}}\\n\\\nsnippet bf\\n\\\n\t\\\\textbf{${1:text}}\\n\\\nsnippet under\\n\\\n\t\\\\underline{${1:text}}\\n\\\nsnippet emp\\n\\\n\t\\\\emph{${1:text}}\\n\\\nsnippet sc\\n\\\n\t\\\\textsc{${1:text}}\\n\\\n#Choosing font\\n\\\nsnippet sf\\n\\\n\t\\\\textsf{${1:text}}\\n\\\nsnippet rm\\n\\\n\t\\\\textrm{${1:text}}\\n\\\nsnippet tt\\n\\\n\t\\\\texttt{${1:text}}\\n\\\n#misc\\n\\\nsnippet ft\\n\\\n\t\\\\footnote{${1:text}}\\n\\\nsnippet fig\\n\\\n\t\\\\begin{figure}\\n\\\n\t\\\\begin{center}\\n\\\n\t    \\\\includegraphics[scale=${1}]{Figures/${2}}\\n\\\n\t\\\\end{center}\\n\\\n\t\\\\caption{${3}}\\n\\\n\t\\\\label{fig:${4}}\\n\\\n\t\\\\end{figure}\\n\\\nsnippet tikz\\n\\\n\t\\\\begin{figure}\\n\\\n\t\\\\begin{center}\\n\\\n\t\\\\begin{tikzpicture}[scale=${1:1}]\\n\\\n\t\t${2}\\n\\\n\t\\\\end{tikzpicture}\\n\\\n\t\\\\end{center}\\n\\\n\t\\\\caption{${3}}\\n\\\n\t\\\\label{fig:${4}}\\n\\\n\t\\\\end{figure}\\n\\\n#math\\n\\\nsnippet stackrel\\n\\\n\t\\\\stackrel{${1:above}}{${2:below}} ${3}\\n\\\nsnippet frac\\n\\\n\t\\\\frac{${1:num}}{${2:denom}}\\n\\\nsnippet sum\\n\\\n\t\\\\sum^{${1:n}}_{${2:i=1}}{${3}}\";\nexports.scope = \"tex\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/text.js",
    "content": "ace.define(\"ace/snippets/text\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"text\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/textile.js",
    "content": "ace.define(\"ace/snippets/textile\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"# Jekyll post header\\n\\\nsnippet header\\n\\\n\t---\\n\\\n\ttitle: ${1:title}\\n\\\n\tlayout: post\\n\\\n\tdate: ${2:date} ${3:hour:minute:second} -05:00\\n\\\n\t---\\n\\\n\\n\\\n# Image\\n\\\nsnippet img\\n\\\n\t!${1:url}(${2:title}):${3:link}!\\n\\\n\\n\\\n# Table\\n\\\nsnippet |\\n\\\n\t|${1}|${2}\\n\\\n\\n\\\n# Link\\n\\\nsnippet link\\n\\\n\t\\\"${1:link text}\\\":${2:url}\\n\\\n\\n\\\n# Acronym\\n\\\nsnippet (\\n\\\n\t(${1:Expand acronym})${2}\\n\\\n\\n\\\n# Footnote\\n\\\nsnippet fn\\n\\\n\t[${1:ref number}] ${3}\\n\\\n\\n\\\n\tfn$1. ${2:footnote}\\n\\\n\t\\n\\\n\";\nexports.scope = \"textile\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/toml.js",
    "content": "ace.define(\"ace/snippets/toml\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"toml\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/twig.js",
    "content": "ace.define(\"ace/snippets/twig\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"twig\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/typescript.js",
    "content": "ace.define(\"ace/snippets/typescript\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"typescript\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/vala.js",
    "content": "ace.define(\"ace/snippets/vala\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nexports.snippets = [\n    {\n        \"content\": \"case ${1:condition}:\\n\\t$0\\n\\tbreak;\\n\",\n        \"name\": \"case\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"case\"\n    },\n    {\n        \"content\": \"/**\\n * ${6}\\n */\\n${1:public} class ${2:MethodName}${3: : GLib.Object} {\\n\\n\\t/**\\n\\t * ${7}\\n\\t */\\n\\tpublic ${2}(${4}) {\\n\\t\\t${5}\\n\\t}\\n\\n\\t$0\\n}\",\n        \"name\": \"class\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"class\"\n    },\n    {\n        \"content\": \"(${1}) => {\\n\\t${0}\\n}\\n\",\n        \"name\": \"closure\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"=>\"\n    },\n    {\n        \"content\": \"/*\\n * $0\\n */\",\n        \"name\": \"Comment (multiline)\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"/*\"\n    },\n    {\n        \"content\": \"Console.WriteLine($1);\\n$0\",\n        \"name\": \"Console.WriteLine (writeline)\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"writeline\"\n    },\n    {\n        \"content\": \"[DBus(name = \\\"$0\\\")]\",\n        \"name\": \"DBus annotation\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"[DBus\"\n    },\n    {\n        \"content\": \"delegate ${1:void} ${2:DelegateName}($0);\",\n        \"name\": \"delegate\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"delegate\"\n    },\n    {\n        \"content\": \"do {\\n\\t$0\\n} while ($1);\\n\",\n        \"name\": \"do while\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"dowhile\"\n    },\n    {\n        \"content\": \"/**\\n * $0\\n */\",\n        \"name\": \"DocBlock\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"/**\"\n    },\n    {\n        \"content\": \"else if ($1) {\\n\\t$0\\n}\\n\",\n        \"name\": \"else if (elseif)\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"elseif\"\n    },\n    {\n        \"content\": \"else {\\n\\t$0\\n}\",\n        \"name\": \"else\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"else\"\n    },\n    {\n        \"content\": \"enum {$1:EnumName} {\\n\\t$0\\n}\",\n        \"name\": \"enum\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"enum\"\n    },\n    {\n        \"content\": \"public errordomain ${1:Error} {\\n\\t$0\\n}\",\n        \"name\": \"error domain\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"errordomain\"\n    },\n    {\n        \"content\": \"for ($1;$2;$3) {\\n\\t$0\\n}\",\n        \"name\": \"for\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"for\"\n    },\n    {\n        \"content\": \"foreach ($1 in $2) {\\n\\t$0\\n}\",\n        \"name\": \"foreach\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"foreach\"\n    },\n    {\n        \"content\": \"Gee.ArrayList<${1:G}>($0);\",\n        \"name\": \"Gee.ArrayList\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"ArrayList\"\n    },\n    {\n        \"content\": \"Gee.HashMap<${1:K},${2:V}>($0);\",\n        \"name\": \"Gee.HashMap\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"HashMap\"\n    },\n    {\n        \"content\": \"Gee.HashSet<${1:G}>($0);\",\n        \"name\": \"Gee.HashSet\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"HashSet\"\n    },\n    {\n        \"content\": \"if ($1) {\\n\\t$0\\n}\",\n        \"name\": \"if\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"if\"\n    },\n    {\n        \"content\": \"interface ${1:InterfaceName}{$2: : SuperInterface} {\\n\\t$0\\n}\",\n        \"name\": \"interface\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"interface\"\n    },\n    {\n        \"content\": \"public static int main(string [] argv) {\\n\\t${0}\\n\\treturn 0;\\n}\",\n        \"name\": \"Main function\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"main\"\n    },\n    {\n        \"content\": \"namespace $1 {\\n\\t$0\\n}\\n\",\n        \"name\": \"namespace (ns)\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"ns\"\n    },\n    {\n        \"content\": \"stdout.printf($0);\",\n        \"name\": \"printf\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"printf\"\n    },\n    {\n        \"content\": \"${1:public} ${2:Type} ${3:Name} {\\n\\tset {\\n\\t\\t$0\\n\\t}\\n\\tget {\\n\\n\\t}\\n}\",\n        \"name\": \"property (prop)\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"prop\"\n    },\n    {\n        \"content\": \"${1:public} ${2:Type} ${3:Name} {\\n\\tget {\\n\\t\\t$0\\n\\t}\\n}\",\n        \"name\": \"read-only property (roprop)\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"roprop\"\n    },\n    {\n        \"content\": \"@\\\"${1:\\\\$var}\\\"\",\n        \"name\": \"String template (@)\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"@\"\n    },\n    {\n        \"content\": \"struct ${1:StructName} {\\n\\t$0\\n}\",\n        \"name\": \"struct\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"struct\"\n    },\n    {\n        \"content\": \"switch ($1) {\\n\\t$0\\n}\",\n        \"name\": \"switch\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"switch\"\n    },\n    {\n        \"content\": \"try {\\n\\t$2\\n} catch (${1:Error} e) {\\n\\t$0\\n}\",\n        \"name\": \"try/catch\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"try\"\n    },\n    {\n        \"content\": \"\\\"\\\"\\\"$0\\\"\\\"\\\";\",\n        \"name\": \"Verbatim string (\\\"\\\"\\\")\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"verbatim\"\n    },\n    {\n        \"content\": \"while ($1) {\\n\\t$0\\n}\",\n        \"name\": \"while\",\n        \"scope\": \"vala\",\n        \"tabTrigger\": \"while\"\n    }\n];\nexports.scope = \"\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/vbscript.js",
    "content": "ace.define(\"ace/snippets/vbscript\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"vbscript\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/velocity.js",
    "content": "ace.define(\"ace/snippets/velocity\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"# macro\\n\\\nsnippet #macro\\n\\\n\t#macro ( ${1:macroName} ${2:\\\\$var1, [\\\\$var2, ...]} )\\n\\\n\t\t${3:## macro code}\\n\\\n\t#end\\n\\\n# foreach\\n\\\nsnippet #foreach\\n\\\n\t#foreach ( ${1:\\\\$item} in ${2:\\\\$collection} )\\n\\\n\t\t${3:## foreach code}\\n\\\n\t#end\\n\\\n# if\\n\\\nsnippet #if\\n\\\n\t#if ( ${1:true} )\\n\\\n\t\t${0}\\n\\\n\t#end\\n\\\n# if ... else\\n\\\nsnippet #ife\\n\\\n\t#if ( ${1:true} )\\n\\\n\t\t${2}\\n\\\n\t#else\\n\\\n\t\t${0}\\n\\\n\t#end\\n\\\n#import\\n\\\nsnippet #import\\n\\\n\t#import ( \\\"${1:path/to/velocity/format}\\\" )\\n\\\n# set\\n\\\nsnippet #set\\n\\\n\t#set ( $${1:var} = ${0} )\\n\\\n\";\nexports.scope = \"velocity\";\nexports.includeScopes = [\"html\", \"javascript\", \"css\"];\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/verilog.js",
    "content": "ace.define(\"ace/snippets/verilog\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"verilog\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/vhdl.js",
    "content": "ace.define(\"ace/snippets/vhdl\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"vhdl\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/xml.js",
    "content": "ace.define(\"ace/snippets/xml\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"xml\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/xquery.js",
    "content": "ace.define(\"ace/snippets/xquery\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText = \"snippet for\\n\\\n\tfor $${1:item} in ${2:expr}\\n\\\nsnippet return\\n\\\n\treturn ${1:expr}\\n\\\nsnippet import\\n\\\n\timport module namespace ${1:ns} = \\\"${2:http://www.example.com/}\\\";\\n\\\nsnippet some\\n\\\n\tsome $${1:varname} in ${2:expr} satisfies ${3:expr}\\n\\\nsnippet every\\n\\\n\tevery $${1:varname} in ${2:expr} satisfies ${3:expr}\\n\\\nsnippet if\\n\\\n\tif(${1:true}) then ${2:expr} else ${3:true}\\n\\\nsnippet switch\\n\\\n\tswitch(${1:\\\"foo\\\"})\\n\\\n\tcase ${2:\\\"foo\\\"}\\n\\\n\treturn ${3:true}\\n\\\n\tdefault return ${4:false}\\n\\\nsnippet try\\n\\\n\ttry { ${1:expr} } catch ${2:*} { ${3:expr} }\\n\\\nsnippet tumbling\\n\\\n\tfor tumbling window $${1:varname} in ${2:expr}\\n\\\n\tstart at $${3:start} when ${4:expr}\\n\\\n\tend at $${5:end} when ${6:expr}\\n\\\n\treturn ${7:expr}\\n\\\nsnippet sliding\\n\\\n\tfor sliding window $${1:varname} in ${2:expr}\\n\\\n\tstart at $${3:start} when ${4:expr}\\n\\\n\tend at $${5:end} when ${6:expr}\\n\\\n\treturn ${7:expr}\\n\\\nsnippet let\\n\\\n\tlet $${1:varname} := ${2:expr}\\n\\\nsnippet group\\n\\\n\tgroup by $${1:varname} := ${2:expr}\\n\\\nsnippet order\\n\\\n\torder by ${1:expr} ${2:descending}\\n\\\nsnippet stable\\n\\\n\tstable order by ${1:expr}\\n\\\nsnippet count\\n\\\n\tcount $${1:varname}\\n\\\nsnippet ordered\\n\\\n\tordered { ${1:expr} }\\n\\\nsnippet unordered\\n\\\n\tunordered { ${1:expr} }\\n\\\nsnippet treat \\n\\\n\ttreat as ${1:expr}\\n\\\nsnippet castable\\n\\\n\tcastable as ${1:atomicType}\\n\\\nsnippet cast\\n\\\n\tcast as ${1:atomicType}\\n\\\nsnippet typeswitch\\n\\\n\ttypeswitch(${1:expr})\\n\\\n\tcase ${2:type}  return ${3:expr}\\n\\\n\tdefault return ${4:expr}\\n\\\nsnippet var\\n\\\n\tdeclare variable $${1:varname} := ${2:expr};\\n\\\nsnippet fn\\n\\\n\tdeclare function ${1:ns}:${2:name}(){\\n\\\n\t${3:expr}\\n\\\n\t};\\n\\\nsnippet module\\n\\\n\tmodule namespace ${1:ns} = \\\"${2:http://www.example.com}\\\";\\n\\\n\";\nexports.scope = \"xquery\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/snippets/yaml.js",
    "content": "ace.define(\"ace/snippets/yaml\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.snippetText =undefined;\nexports.scope = \"yaml\";\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-ambiance.js",
    "content": "ace.define(\"ace/theme/ambiance\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-ambiance\";\nexports.cssText = \".ace-ambiance .ace_gutter {\\\nbackground-color: #3d3d3d;\\\nbackground-image: -moz-linear-gradient(left, #3D3D3D, #333);\\\nbackground-image: -ms-linear-gradient(left, #3D3D3D, #333);\\\nbackground-image: -webkit-gradient(linear, 0 0, 0 100%, from(#3D3D3D), to(#333));\\\nbackground-image: -webkit-linear-gradient(left, #3D3D3D, #333);\\\nbackground-image: -o-linear-gradient(left, #3D3D3D, #333);\\\nbackground-image: linear-gradient(left, #3D3D3D, #333);\\\nbackground-repeat: repeat-x;\\\nborder-right: 1px solid #4d4d4d;\\\ntext-shadow: 0px 1px 1px #4d4d4d;\\\ncolor: #222;\\\n}\\\n.ace-ambiance .ace_gutter-layer {\\\nbackground: repeat left top;\\\n}\\\n.ace-ambiance .ace_gutter-active-line {\\\nbackground-color: #3F3F3F;\\\n}\\\n.ace-ambiance .ace_fold-widget {\\\ntext-align: center;\\\n}\\\n.ace-ambiance .ace_fold-widget:hover {\\\ncolor: #777;\\\n}\\\n.ace-ambiance .ace_fold-widget.ace_start,\\\n.ace-ambiance .ace_fold-widget.ace_end,\\\n.ace-ambiance .ace_fold-widget.ace_closed{\\\nbackground: none;\\\nborder: none;\\\nbox-shadow: none;\\\n}\\\n.ace-ambiance .ace_fold-widget.ace_start:after {\\\ncontent: '▾'\\\n}\\\n.ace-ambiance .ace_fold-widget.ace_end:after {\\\ncontent: '▴'\\\n}\\\n.ace-ambiance .ace_fold-widget.ace_closed:after {\\\ncontent: '‣'\\\n}\\\n.ace-ambiance .ace_print-margin {\\\nborder-left: 1px dotted #2D2D2D;\\\nright: 0;\\\nbackground: #262626;\\\n}\\\n.ace-ambiance .ace_scroller {\\\n-webkit-box-shadow: inset 0 0 10px black;\\\n-moz-box-shadow: inset 0 0 10px black;\\\n-o-box-shadow: inset 0 0 10px black;\\\nbox-shadow: inset 0 0 10px black;\\\n}\\\n.ace-ambiance {\\\ncolor: #E6E1DC;\\\nbackground-color: #202020;\\\n}\\\n.ace-ambiance .ace_cursor {\\\nborder-left: 1px solid #7991E8;\\\n}\\\n.ace-ambiance .ace_overwrite-cursors .ace_cursor {\\\nborder: 1px solid #FFE300;\\\nbackground: #766B13;\\\n}\\\n.ace-ambiance.normal-mode .ace_cursor-layer {\\\nz-index: 0;\\\n}\\\n.ace-ambiance .ace_marker-layer .ace_selection {\\\nbackground: rgba(221, 240, 255, 0.20);\\\n}\\\n.ace-ambiance .ace_marker-layer .ace_selected-word {\\\nborder-radius: 4px;\\\nborder: 8px solid #3f475d;\\\nbox-shadow: 0 0 4px black;\\\n}\\\n.ace-ambiance .ace_marker-layer .ace_step {\\\nbackground: rgb(198, 219, 174);\\\n}\\\n.ace-ambiance .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgba(255, 255, 255, 0.25);\\\n}\\\n.ace-ambiance .ace_marker-layer .ace_active-line {\\\nbackground: rgba(255, 255, 255, 0.031);\\\n}\\\n.ace-ambiance .ace_invisible {\\\ncolor: #333;\\\n}\\\n.ace-ambiance .ace_paren {\\\ncolor: #24C2C7;\\\n}\\\n.ace-ambiance .ace_keyword {\\\ncolor: #cda869;\\\n}\\\n.ace-ambiance .ace_keyword.ace_operator {\\\ncolor: #fa8d6a;\\\n}\\\n.ace-ambiance .ace_punctuation.ace_operator {\\\ncolor: #fa8d6a;\\\n}\\\n.ace-ambiance .ace_identifier {\\\n}\\\n.ace-ambiance .ace-statement {\\\ncolor: #cda869;\\\n}\\\n.ace-ambiance .ace_constant {\\\ncolor: #CF7EA9;\\\n}\\\n.ace-ambiance .ace_constant.ace_language {\\\ncolor: #CF7EA9;\\\n}\\\n.ace-ambiance .ace_constant.ace_library {\\\n}\\\n.ace-ambiance .ace_constant.ace_numeric {\\\ncolor: #78CF8A;\\\n}\\\n.ace-ambiance .ace_invalid {\\\ntext-decoration: underline;\\\n}\\\n.ace-ambiance .ace_invalid.ace_illegal {\\\ncolor:#F8F8F8;\\\nbackground-color: rgba(86, 45, 86, 0.75);\\\n}\\\n.ace-ambiance .ace_invalid,\\\n.ace-ambiance .ace_deprecated {\\\ntext-decoration: underline;\\\nfont-style: italic;\\\ncolor: #D2A8A1;\\\n}\\\n.ace-ambiance .ace_support {\\\ncolor: #9B859D;\\\n}\\\n.ace-ambiance .ace_support.ace_function {\\\ncolor: #DAD085;\\\n}\\\n.ace-ambiance .ace_function.ace_buildin {\\\ncolor: #9b859d;\\\n}\\\n.ace-ambiance .ace_string {\\\ncolor: #8f9d6a;\\\n}\\\n.ace-ambiance .ace_string.ace_regexp {\\\ncolor: #DAD085;\\\n}\\\n.ace-ambiance .ace_comment {\\\nfont-style: italic;\\\ncolor: #555;\\\n}\\\n.ace-ambiance .ace_comment.ace_doc {\\\n}\\\n.ace-ambiance .ace_comment.ace_doc.ace_tag {\\\ncolor: #666;\\\nfont-style: normal;\\\n}\\\n.ace-ambiance .ace_definition,\\\n.ace-ambiance .ace_type {\\\ncolor: #aac6e3;\\\n}\\\n.ace-ambiance .ace_variable {\\\ncolor: #9999cc;\\\n}\\\n.ace-ambiance .ace_variable.ace_language {\\\ncolor: #9b859d;\\\n}\\\n.ace-ambiance .ace_xml-pe {\\\ncolor: #494949;\\\n}\\\n.ace-ambiance .ace_gutter-layer,\\\n.ace-ambiance .ace_text-layer {\\\nbackground-image: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAQAAAAHUWYVAABFFUlEQVQYGbzBCeDVU/74/6fj9HIcx/FRHx9JCFmzMyGRURhLZIkUsoeRfUjS2FNDtr6WkMhO9sm+S8maJfu+Jcsg+/o/c+Z4z/t97/vezy3z+z8ekGlnYICG/o7gdk+wmSHZ1z4pJItqapjoKXWahm8NmV6eOTbWUOp6/6a/XIg6GQqmenJ2lDHyvCFZ2cBDbmtHA043VFhHwXxClWmeYAdLhV00Bd85go8VmaFCkbVkzlQENzfBDZ5gtN7HwF0KDrTwJ0dypSOzpaKCMwQHKTIreYIxlmhXTzTWkVm+LTynZhiSBT3RZQ7aGfjGEd3qyXQ1FDymqbKxpspERQN2MiRjNZlFFQXfCNFm9nM1zpAsoYjmtRTc5ajwuaXc5xrWskT97RaKzAGe5ARHhVUsDbjKklziiX5WROcJwSNCNI+9w1Jwv4Zb2r7lCMZ4oq5C0EdTx+2GzNuKpJ+iFf38JEWkHJn9DNF7mmBDITrWEg0VWL3pHU20tSZnuqWu+R3BtYa8XxV1HO7GyD32UkOpL/yDloINFTmvtId+nmAjxRw40VMwVKiwrKLE4bK5UOVntYwhOcSSXKrJHKPJedocpGjVz/ZMIbnYUPB10/eKCrs5apqpgVmWzBYWpmtKHecJPjaUuEgRDDaU0oZghCJ6zNMQ5ZhDYx05r5v2muQdM0EILtXUsaKiQX9WMEUotagQzFbUNN6NUPC2nm5pxEWGCjMc3GdJHjSU2kORLK/JGSrkfGEIjncU/CYUnOipoYemwj8tST9NsJmB7TUVXtbUtXATJVZXBMvYeTXJfobgJUPmGMP/yFaWonaa6BcFO3nqcIqCozSZoZoSr1g4zJOzuyGnxTEX3lUEJ7WcZgme8ddaWvWJo2AJR9DZU3CUIbhCSG6ybSwN6qtJVnCU2svDTP2ZInOw2cBTrqtQahtNZn9NcJ4l2NaSmSkkP1noZWnVwkLmdUPOwLZEwy2Z3S3R+4rIG9hcbpPXHFVWcQdZkn2FOta3cKWQnNRC5g1LsJah4GCzSVsKnCOY5OAFRTBekyyryeyilhFKva75r4Mc0aWanGEaThcy31s439KKxTzJYY5WTHPU1FtIHjQU3Oip4xlNzj/lBw23dYZVliQa7WAXf4shetcQfatI+jWRDBPmyNeW6A1P5kdDgyYJlba0BIM8BZu1JfrFwItyjcAMR3K0BWOIrtMEXyhyrlVEx3ui5dUBjmB/Q3CXW85R4mBD0s7B+4q5tKUjOlb9qqmhi5AZ6GFIC5HXtOobdYGlVdMVbNJ8toNTFcHxnoL+muBagcctjWnbNMuR00uI7nQESwg5q2qqrKWIfrNUmeQocY6HuyxJV02wj36w00yhpmUFenv4p6fUkZYqLyuinx2RGOjhCXYyJF84oiU00YMOOhhquNdfbOB7gU88pY4xJO8LVdp6/q2voeB4R04vIdhSE40xZObx1HGGJ/ja0LBthFInKaLPPFzuCaYaoj8JjPME8yoyxo6zlBqkiUZYgq00OYMswbWO5NGmq+xhipxHLRW29ARjNKXO0wRnear8XSg4XFPLKEPUS1GqvyLwiuBUoa7zpZ0l5xxFwWmWZC1H5h5FwU8eQ7K+g8UcVY6TMQreVQT/8uQ8Z+ALIXnSEa2pYZQneE9RZbSBNYXfWYJzW/h/4j4Dp1tYVcFIC5019Vyi4ThPqSFCzjGWaHQTBU8q6vrVwgxP9Lkm840imWKpcLCjYTtrKuwvsKSnrvHCXGkSMk9p6lhckfRpIeis+N2PiszT+mFLspyGleUhDwcLrZqmyeylxwjBcKHEapqkmyangyLZRVOijwOtCY5SsG5zL0OwlCJ4y5KznF3EUNDDrinwiyLZRzOXtlBbK5ITHFGLp8Q0R6ab6mS7enI2cFrxOyHvOCFaT1HThS1krjCwqWeurCkk+willhCC+RSZnRXBiZaC5RXRIZYKp2lyfrHwiKPKR0JDzrdU2EFgpidawlFDR6FgXUMNa+g1FY3bUQh2cLCwosRdnuQTS/S+JVrGLeWIvtQUvONJxlqSQYYKpwoN2kaocLjdVsis4Mk80ESF2YpSkzwldjHkjFCUutI/r+EHDU8oCs6yzL3PhWiEooZdFMkymlas4AcI3KmoMMNSQ3tHzjGWCrcJJdYyZC7QFGwjRL9p+MrRkAGWzIaWCn9W0F3TsK01c2ZvQw0byvxuQU0r1lM0qJO7wW0kRIMdDTtXEdzi4VIh+EoIHm0mWtAtpCixlabgn83fKTI7anJe9ST7WIK1DMGpQmYeA58ImV6ezOGOzK2Kgq01pd60cKWiUi9Lievb/0vIDPHQ05Kzt4ddPckQBQtoaurjyHnek/nKzpQLrVgKPjIkh2v4uyezpv+Xoo7fPFXaGFp1vaLKxQ4uUpQQS5VuQs7BCq4xRJv7fwpVvvFEB3j+620haOuocqMhWd6TTPAEx+mdFNGHdranFe95WrWmIvlY4F1Dle2ECgc6cto7SryuqGGGha0tFQ5V53migUKmg6XKAo4qS3mik+0OZpAhOLeZKicacgaYcyx5hypYQE02ZA4xi/pNhOQxR4klNKyqacj+mpxnLTnnGSo85++3ZCZq6lrZkXlGEX3o+C9FieccJbZWVFjC0Yo1FZnJhoYMFoI1hEZ9r6hwg75HwzBNhbZCdJEfJwTPGzJvaKImw1yYX1HDAmpXR+ZJQ/SmgqMNVQb5vgamGwLtt7VwvP7Qk1xpiM5x5Cyv93E06MZmgs0Nya2azIKOYKCGBQQW97RmhKNKF02JZqHEJ4o58qp7X5EcZmc56trXEqzjCBZ1MFGR87Ql2tSTs6CGxS05PTzRQorkbw7aKoKXFDXsYW42VJih/q+FP2BdTzDTwVqOYB13liM50vG7wy28qagyuIXMeQI/Oqq8bcn5wJI50xH00CRntyfpL1T4hydYpoXgNiFzoIUTDZnLNRzh4TBHwbYGDvZkxmlyJloyr6tRihpeUG94GnKtIznREF0tzJG/OOr73JBcrSh1k6WuTprgLU+mnSGnv6Zge0NNz+kTDdH8nuAuTdJDCNb21LCiIuqlYbqGzT3RAoZofQfjFazkqeNWdYaGvYTM001EW2oKPvVk1ldUGSgUtHFwjKM1h9jnFcmy5lChoLNaQMGGDsYbKixlaMBmmsx1QjCfflwTfO/gckW0ruZ3jugKR3R5W9hGUWqCgxuFgsuaCHorotGKzGaeZB9DMsaTnKCpMtwTvOzhYk0rdrArKCqcaWmVk1+F372ur1YkKxgatI8Qfe1gIX9wE9FgS8ESmuABIXnRUbCapcKe+nO7slClSZFzpV/LkLncEb1qiO42fS3R855Su2mCLh62t1SYZZYVmKwIHjREF2uihTzB20JOkz7dkxzYQnK0UOU494wh+VWRc6Un2kpTaVgLDFEkJ/uhzRcI0YKGgpGWOlocBU/a4fKoJ/pEaNV6jip3+Es9VXY078rGnmAdf7t9ylPXS34RBSuYPs1UecZTU78WanhBCHpZ5sAoTz0LGZKjPf9TRypqWEiTvOFglL1fCEY3wY/++rbk7C8bWebA6p6om6PgOL2kp44TFJlVNBXae2rqqdZztOJpT87GQsE9jqCPIe9VReZuQ/CIgacsyZdCpIScSYqcZk8r+nsyCzhyfhOqHGOIvrLknC8wTpFcaYiGC/RU1NRbUeUpocQOnkRpGOrIOcNRx+1uA0UrzhSSt+VyS3SJpnFWkzNDqOFGIWcfR86DnmARTQ1HKIL33ExPiemeOhYSSjzlSUZZuE4TveoJLnBUOFof6KiysCbnAEcZgcUNTDOwkqWu3RWtmGpZwlHhJENdZ3miGz0lJlsKnjbwqSHQjpxnFDlTLLwqJPMZMjd7KrzkSG7VsxXBZE+F8YZkb01Oe00yyRK9psh5SYh29ySPKBo2ylNht7ZkZnsKenjKNJu9PNEyZpaCHv4Kt6RQsLvAVp7M9kIimmCUwGeWqLMmGuIotYMmWNpSahkhZw9FqZsVnKJhsjAHvtHMsTM9fCI06Dx/u3vfUXCqfsKRc4oFY2jMsoo/7DJDwZ1CsIKnJu+J9ldkpmiCxQx1rWjI+T9FwcWWzOuaYH0Hj7klNRVWEQpmaqosakiGNTFHdjS/qnUdmf0NJW5xsL0HhimCCZZSRzmSPTXJQ4aaztAwtZnoabebJ+htCaZ7Cm535ByoqXKbX1WRc4Eh2MkRXWzImVc96Cj4VdOKVxR84VdQsIUM8Psoou2byVHyZFuq7O8otbSQ2UAoeEWTudATLGSpZzVLlXVkPU2Jc+27lsw2jmg5T5VhbeE3BT083K9WsTTkFU/Osi0rC5lRlpwRHUiesNS0sOvmqGML1aRbPAxTJD9ZKtxuob+hhl8cwYGWpJ8nub7t5p6coYbMovZ1BTdaKn1jYD6h4GFDNFyT/Kqe1XCXphXHOKLZmuRSRdBPEfVUXQzJm5YGPGGJdvAEr7hHNdGZnuBvrpciGmopOLf5N0uVMy0FfYToJk90uUCbJupaVpO53UJXR2bVpoU00V2KOo4zMFrBd0Jtz2pa0clT5Q5L8IpQ177mWQejPMEJhuQjS10ref6HHjdEhy1P1EYR7GtO0uSsKJQYLiTnG1rVScj5lyazpqWGl5uBbRWl7m6ixGOOnEsMJR7z8J0n6KMnCdxhiNYQCoZ6CmYLnO8omC3MkW3bktlPmEt/VQQHejL3+dOE5FlPdK/Mq8hZxxJtLyRrepLThYKbLZxkSb5W52vYxNOaOxUF0yxMUPwBTYqCzy01XayYK0sJyWBLqX0MwU5CzoymRzV0EjjeUeLgDpTo6ij42ZAzvD01dHUUTPLU96MdLbBME8nFBn7zJCMtJcZokn8YoqU0FS5WFKyniHobguMcmW8N0XkWZjkyN3hqOMtS08r+/xTBwpZSZ3qiVRX8SzMHHjfUNFjgHEPmY9PL3ykEzxkSre/1ZD6z/NuznuB0RcE1TWTm9zRgfUWVJiG6yrzgmWPXC8EAR4Wxhlad0ZbgQyEz3pG5RVEwwDJH2mgKpjcTiCOzn1lfUWANFbZ2BA8balnEweJC9J0iuaeZoI+ippFCztEKVvckR2iice1JvhVytrQwUAZpgsubCPaU7xUe9vWnaOpaSBEspalykhC9bUlOMpT42ZHca6hyrqKmw/wMR8H5ZmdFoBVJb03O4UL0tSNnvIeRmkrLWqrs78gcrEn2tpcboh0UPOW3UUR9PMk4T4nnNKWmCjlrefhCwxRNztfmIQVdDElvS4m1/WuOujoZCs5XVOjtKPGokJzsYCtFYoWonSPT21DheU/wWhM19FcElwqNGOsp9Q8N/cwXaiND1MmeL1Q5XROtYYgGeFq1aTMsoMmcrKjQrOFQTQ1fmBYhmW6o8Jkjc7iDJRTBIo5kgJD5yMEYA3srCg7VFKwiVJkmRCc5ohGOKhsYMn/XBLdo5taZjlb9YAlGWRimqbCsoY7HFAXLa5I1HPRxMMsQDHFkWtRNniqT9UEeNjcE7RUlrCJ4R2CSJuqlKHWvJXjAUNcITYkenuBRB84TbeepcqTj3zZyFJzgYQdHnqfgI0ddUwS6GqWpsKWhjq9cV0vBAEMN2znq+EBfIWT+pClYw5xsTlJU6GeIBsjGmmANTzJZiIYpgrM0Oa8ZMjd7NP87jxhqGOhJlnQtjuQpB+8aEE00wZFznSJPyHxgH3HkPOsJFvYk8zqCHzTs1BYOa4J3PFU+UVRZxlHDM4YavlNUuMoRveiZA2d7grMNc2g+RbSCEKzmgYsUmWmazFJyoiOZ4KnyhKOGRzWJa0+moyV4TVHDzn51Awtqaphfk/lRQ08FX1iiqxTB/kLwd0VynKfEvI6cd4XMV5bMhZ7gZUWVzYQ6Nm2BYzxJbw3bGthEUUMfgbGeorae6DxHtJoZ6alhZ0+ytiVoK1R4z5PTrOECT/SugseEOlb1MMNR4VRNcJy+V1Hg9ONClSZFZjdHlc6W6FBLdJja2MC5hhpu0DBYEY1TFGwiFAxRRCsYkiM9JRb0JNMVkW6CZYT/2EiTGWmo8k+h4FhDNE7BvppoTSFnmCV5xZKzvcCdDo7VVPnIU+I+Rc68juApC90MwcFCsJ5hDqxgScYKreruyQwTqrzoqDCmhWi4IbhB0Yrt3RGa6GfDv52rKXWhh28dyZaWUvcZeMTBaZoSGyiCtRU5J8iviioHaErs7Jkj61syVzTTgOcUOQ8buFBTYWdL5g3T4qlpe0+wvD63heAXRfCCIed9RbCsp2CiI7raUOYOTU13N8PNHvpaGvayo4a3LLT1lDrVEPT2zLUlheB1R+ZTRfKWJ+dcocLJfi11vyJ51lLqJ0WD7tRwryezjiV5W28uJO9qykzX8JDe2lHl/9oyBwa2UMfOngpXCixvKdXTk3wrsKmiVYdZIqsoWEERjbcUNDuiaQomGoIbFdEHmsyWnuR+IeriKDVLnlawlyNHKwKlSU631PKep8J4Q+ayjkSLKYLhalNHlYvttb6fHm0p6OApsZ4l2VfdqZkjuysy6ysKLlckf1KUutCTs39bmCgEyyoasIWlVaMF7mgmWtBT8Kol5xpH9IGllo8cJdopcvZ2sImlDmMIbtDk3KIpeNiS08lQw11NFPTwVFlPP6pJ2gvRfI7gQUfmNAtf6Gs0wQxDsKGlVBdF8rCa3jzdwMaGHOsItrZk7hAyOzpK9VS06j5F49b0VNGOOfKs3lDToMsMBe9ZWtHFEgxTJLs7qrygKZjUnmCYoeAqeU6jqWuLJup4WghOdvCYJnrSkSzoyRkm5M2StQwVltPkfCAk58tET/CSg+8MUecmotMEnhBKfWBIZsg2ihruMJQaoIm+tkTLKEqspMh00w95gvFCQRtDwTT1gVDDSEVdlwqZfxoQRbK0g+tbiBZxzKlpnpypejdDwTaeOvorMk/IJE10h9CqRe28hhLbe0pMsdSwv4ZbhKivo2BjDWfL8UKJgeavwlwb5KlwhyE4u4XkGE2ytZCznKLCDZZq42VzT8HLCrpruFbIfOIINmh/qCdZ1ZBc65kLHR1Bkyf5zn6pN3SvGKIlFNGplhrO9QSXanLOMQTLCa0YJCRrCZm/CZmrLTm7WzCK4GJDiWUdFeYx1LCFg3NMd0XmCuF3Y5rITLDUsYS9zoHVzwnJoYpSTQoObyEzr4cFBNqYTopoaU/wkyLZ2lPhX/5Y95ulxGTV7KjhWrOZgl8MyUUafjYraNjNU1N3IWcjT5WzWqjwtoarHSUObGYO3GCJZpsBlnJGPd6ZYLyl1GdCA2625IwwJDP8GUKymbzuyPlZlvTUsaUh5zFDhRWFzPKKZLAlWdcQbObgF9tOqOsmB1dqcqYJmWstFbZRRI9poolmqiLnU0POvxScpah2iSL5UJNzgScY5+AuIbpO0YD3NCW+dLMszFSdFCWGqG6eVq2uYVNDdICGD6W7EPRWZEY5gpsE9rUkS3mijzzJnm6UpUFXG1hCUeVoS5WfNcFpblELL2qqrCvMvRfd45oalvKU2tiQ6ePJOVMRXase9iTtLJztPxJKLWpo2CRDcJwn2sWSLKIO1WQWNTCvpVUvOZhgSC40JD0dOctaSqzkCRbXsKlb11Oip6PCJ0IwSJM31j3akRxlP7Rwn6aGaUL0qiLnJkvB3xWZ2+Q1TfCwpQH3G0o92UzmX4o/oJNQMMSQc547wVHhdk+VCw01DFYEnTxzZKAm74QmeNNR1w6WzEhNK15VJzuCdxQ53dRUDws5KvwgBMOEgpcVNe0hZI6RXT1Jd0cyj5nsaEAHgVmGaJIlWdsc5Ui2ElrRR6jrRAttNMEAIWrTDFubkZaok7/AkzfIwfuWVq0jHzuCK4QabtLUMVPB3kJ0oyHTSVFlqMALilJf2Rf8k5aaHtMfayocLBS8L89oKoxpJvnAkDPa0qp5DAUTHKWmCcnthlou8iCKaFFLHWcINd1nyIwXqrSxMNmSs6KmoL2QrKuWtlQ5V0120xQ5vRyZS1rgFkWwhiOwiuQbR0OOVhQM9iS3tiXp4RawRPMp5tDletOOBL95MpM01dZTBM9pkn5qF010rIeHFcFZhmSGpYpTsI6nwhqe5C9ynhlpp5ophuRb6WcJFldkVnVEwwxVfrVkvnWUuNLCg5bgboFHPDlDPDmnK7hUrWiIbjadDclujlZcaokOFup4Ri1kacV6jmrrK1hN9bGwpKEBQ4Q6DvIUXOmo6U5LqQM6EPyiKNjVkPnJkDPNEaxhiFay5ExW1NXVUGqcpYYdPcGiCq7z/TSlbhL4pplWXKd7NZO5QQFrefhRQW/NHOsqcIglc4UhWklR8K0QzbAw08CBDnpbgqXdeD/QUsM4RZXDFBW6WJKe/mFPdH0LtBgiq57wFLzlyQzz82qYx5D5WJP5yVJDW01BfyHnS6HKO/reZqId1WGa4Hkh2kWodJ8i6KoIPlAj2hPt76CzXsVR6koPRzWTfKqIentatYpQw2me4AA3y1Kind3SwoOKZDcFXTwl9tWU6mfgRk9d71sKtlNwrjnYw5tC5n5LdKiGry3JKNlHEd3oaMCFHrazBPMp/uNJ+V7IudcSbeOIdjUEdwl0VHCOZo5t6YluEuaC9mQeMgSfOyKnYGFHcIeQ84yQWbuJYJpZw5CzglDH7gKnWqqM9ZTaXcN0TeYhR84eQtJT76JJ1lREe7WnnvsMmRc9FQ7SBBM9mV3lCUdmHk/S2RAMt0QjFNFqQpWjDPQ01DXWUdDBkXziKPjGEP3VP+zIWU2t7im41FOloyWzn/L6dkUy3VLDaZ6appgDLHPjJEsyvJngWEPUyVBiAaHCTEXwrLvSEbV1e1gKJniicWorC1MUrVjB3uDhJE/wgSOzk1DXpk0k73qCM8xw2UvD5kJmDUfOomqMpWCkJRlvKXGmoeBm18USjVIk04SClxTB6YrgLAPLWYK9HLUt5cmc0vYES8GnTeRc6skZbQkWdxRsIcyBRzx1DbTk9FbU0caTPOgJHhJKnOGIVhQqvKmo0llRw9sabrZkDtdg3PqaKi9oatjY8B+G371paMg6+mZFNNtQ04mWBq3rYLOmtWWQp8KJnpy9DdFensyjdqZ+yY40VJlH8wcdLzC8PZnvHMFUTZUrDTkLyQaGus5X5LzpYAf3i+e/ZlhqGqWhh6Ou6xTR9Z6oi5AZZtp7Mj2EEm8oSpxiYZCHU/1fbGdNNNRRoZMhmilEb2gqHOEJDtXkHK/JnG6IrvbPCwV3NhONVdS1thBMs1T4QOBcTWa2IzhMk2nW5Kyn9tXUtpv9RsG2msxk+ZsQzRQacJncpgke0+T8y5Fzj8BiGo7XlJjaTIlpQs7KFjpqGnKuoyEPeIKnFMkZHvopgh81ySxNFWvJWcKRs70j2FOT012IllEEO1n4pD1513Yg2ssQPOThOkvyrqHUdEXOSEsihmBbTbKX1kLBPWqWkLOqJbjB3GBIZmoa8qWl4CG/iZ7oiA72ZL7TJNeZUY7kFQftDcHHluBzRbCegzMtrRjVQpX2lgoPKKLJAkcbMl01XK2p7yhL8pCBbQ3BN2avJgKvttcrWDK3CiUOVxQ8ZP+pqXKyIxnmBymCg5vJjNfkPK4+c8cIfK8ocVt7kmfd/I5SR1hKvCzUtb+lhgc00ZaO6CyhIQP1Uv4yIZjload72PXX0OIJvnFU+0Zf6MhsJwTfW0r0UwQfW4LNLZl5HK261JCZ4qnBaAreVAS3WrjV0LBnNDUNNDToCEeFfwgcb4gOEqLRhirWkexrCEYKVV711DLYEE1XBEsp5tpTGjorkomKYF9FDXv7fR3BGwbettSxnyL53MBPjsxDZjMh+VUW9NRxq1DhVk+FSxQcaGjV9Pawv6eGByw5qzoy7xk4RsOShqjJwWKe/1pEEfzkobeD/dQJmpqedcyBTy2sr4nGNRH0c0SPWTLrqAc0OQcb/gemKgqucQT7ySWKCn2EUotoCvpZct7RO2sy/QW0IWcXd7pQRQyZVwT2USRO87uhjioTLKV2brpMUcMQRbKH/N2T+UlTpaMls6cmc6CCNy3JdYYSUzzJQ4oSD3oKLncULOiJvjBEC2oqnCJkJluCYy2ZQ5so9YYlZ1VLlQU1mXEW1jZERwj/MUSRc24TdexlqLKfQBtDTScJUV8FszXBEY5ktpD5Ur9hYB4Nb1iikw3JoYpkKX+RodRKFt53MMuRnKSpY31PwYaGaILh3wxJGz9TkTPEETxoCWZrgvOlmyMzxFEwVJE5xZKzvyJ4WxEc16Gd4Xe3Weq4XH2jKRikqOkGQ87hQnC7wBmGYLAnesX3M+S87eFATauuN+Qcrh7xIxXJbUIdMw3JGE3ylCWzrieaqCn4zhGM19TQ3z1oH1AX+pWEqIc7wNGAkULBo/ZxRaV9NNyh4Br3rCHZzbzmSfawBL0dNRwpW1kK9mxPXR9povcdrGSZK9c2k0xwFGzjuniCtRSZCZ6ccZ7gaktmgAOtKbG/JnOkJrjcQTdFMsxRQ2cLY3WTIrlCw1eWKn8R6pvt4GFDso3QoL4a3nLk3G6JrtME3dSenpx7PNFTmga0EaJTLQ061sEeQoWXhSo9LTXsaSjoJQRXeZLtDclbCrYzfzHHeaKjHCVOUkQHO3JeEepr56mhiyaYYKjjNU+Fed1wS5VlhWSqI/hYUdDOkaxiKehoyOnrCV5yBHtbWFqTHCCwtpDcYolesVR5yUzTZBb3RNMd0d6WP+SvhuBmRcGxnuQzT95IC285cr41cLGQ6aJJhmi4TMGempxeimBRQw1tFKV+8jd6KuzoSTqqDxzRtpZkurvKEHxlqXKRIjjfUNNXQsNOsRScoWFLT+YeRZVD3GRN0MdQcKqQjHDMrdGGVu3iYJpQx3WGUvfbmxwFfR20WBq0oYY7LMFhhgYtr8jpaEnaOzjawWWaTP8mMr0t/EPDPoqcnxTBI5o58L7uoWnMrpoqPwgVrlAUWE+V+TQl9rawoyP6QGAlQw2TPRX+YSkxyBC8Z6jhHkXBgQL7WII3DVFnRfCrBfxewv9D6xsyjys4VkhWb9pUU627JllV0YDNHMku/ldNMMXDEo4aFnAkk4U6frNEU4XgZUPmEKHUl44KrzmYamjAbh0JFvGnaTLPu1s9jPCwjFpYiN7z1DTOk/nc07CfDFzmCf7i+bfNHXhDtLeBXzTBT5rkMvWOIxpl4EMh2LGJBu2syDnAEx2naEhHDWMMzPZEhygyS1mS5RTJr5ZkoKbEUoYqr2kqdDUE8ztK7OaIntJkFrIECwv8LJTaVx5XJE86go8dFeZ3FN3rjabCAYpoYEeC9zzJVULBbmZhDyd7ko09ydpNZ3nm2Kee4FPPXHnYEF1nqOFEC08LUVcDvYXkJHW8gTaKCk9YGOeIJhqiE4ToPEepdp7IWFjdwnWaufGMwJJCMtUTTBBK9BGCOy2tGGrJTHIwyEOzp6aPzNMOtlZkDvcEWpP5SVNhfkvDxhmSazTJXYrM9U1E0xwFVwqZQwzJxw6+kGGGUj2FglGGmnb1/G51udRSMNlTw6GGnCcUwVcOpmsqTHa06o72sw1RL02p9z0VbnMLOaIX3QKaYKSCFQzBKEUNHTSc48k53RH9wxGMtpQa5KjjW0W0n6XCCCG4yxNNdhQ4R4l1Ff+2sSd6UFHiIEOyqqFgT01mEUMD+joy75jPhOA+oVVLm309FR4yVOlp4RhLiScNmSmaYF5Pw0STrOIoWMSR2UkRXOMp+M4SHW8o8Zoi6OZgjKOaFar8zZDzkWzvKOjkKBjmCXby8JahhjXULY4KlzgKLvAwxVGhvyd4zxB1d9T0piazmKLCVZY5sKiD0y2ZSYrkUEPUbIk+dlQ4SJHTR50k1DPaUWIdTZW9NJwnJMOECgd7ou/MnppMJ02O1VT4Wsh85MnZzcFTngpXGKo84qmwgKbCL/orR/SzJ2crA+t6Mp94KvxJUeIbT3CQu1uIdlQEOzlKfS3UMcrTiFmOuroocrZrT2AcmamOKg8YomeEKm/rlT2sociMaybaUlFhuqHCM2qIJ+rg4EcDFymiDSxzaHdPcpE62pD5kyM5SBMoA1PaUtfIthS85ig1VPiPPYXgYEMNk4Qq7TXBgo7oT57gPUdwgCHzhIVFPFU6OYJzHAX9m5oNrVjeE61miDrqQ4VSa1oiURTsKHC0IfjNwU2WzK6eqK8jWln4g15TVBnqmDteCJ501PGAocJhhqjZdtBEB6lnhLreFJKxmlKbeGrqLiSThVIbCdGzloasa6lpMQXHCME2boLpJgT7yWaemu6wBONbqGNVRS0PKIL7LckbjmQtR7K8I5qtqel+T/ChJTNIKLjdUMNIRyvOEko9YYl2cwQveBikCNawJKcLBbc7+JM92mysNvd/Fqp8a0k6CNEe7cnZrxlW0wQXaXjaktnRwNOGZKYiONwS7a1JVheq3WgJHlQUGKHKmp4KAxXR/ULURcNgoa4zhKSLpZR3kxRRb0NmD0OFn+UCS7CzI1nbP6+o4x47QZE5xRCt3ZagnYcvmpYQktXdk5YKXTzBC57kKEe0VVuiSYqapssMS3C9p2CKkHOg8B8Pa8p5atrIw3qezIWanMGa5HRDNF6RM9wcacl0N+Q8Z8hsIkSnaIIdHRUOEebAPy1zbCkhM062FCJtif7PU+UtoVXzWKqM1PxXO8cfdruhFQ/a6x3JKYagvVDhQEtNiyiiSQ7OsuRsZUku0CRNDs4Sog6KKjsZgk2bYJqijgsEenoKeniinRXBn/U3lgpPdyDZynQx8IiioMnCep5Ky8mjGs6Wty0l1hUQTcNWswS3WRp2kCNZwJG8omG8JphPUaFbC8lEfabwP7VtM9yoaNCAjpR41VNhrD9LkbN722v0CoZMByFzhaW+MyzRYEWFDQwN2M4/JiT76PuljT3VU/A36eaIThb+R9oZGOAJ9tewkgGvqOMNRWYjT/Cwu99Q8LqDE4TgbLWxJ1jaDDAERsFOFrobgjUsBScaguXU8kKm2RL19tRypSHnHNlHiIZqgufs4opgQdVdwxBNNFBR6kVFqb8ogimOzB6a6HTzrlDHEpYaxjiiA4TMQobkDg2vejjfwJGWmnbVFAw3H3hq2NyQfG7hz4aC+w3BbwbesG0swYayvpAs6++Ri1Vfzx93mFChvyN5xVHTS+0p9aqCAxyZ6ZacZyw5+7uuQkFPR9DDk9NOiE7X1PCYJVjVUqq7JlrHwWALF5nfHNGjApdpqgzx5OwilDhCiDYTgnc9waGW4BdLNNUQvOtpzDOWHDH8D7TR/A/85KljEQu3NREc4Pl/6B1Hhc8Umb5CsKMmGC9EPcxoT2amwHNCmeOEnOPbklnMkbOgIvO5UMOpQrS9UGVdt6iH/fURjhI/WOpaW9OKLYRod6HCUEdOX000wpDZQ6hwg6LgZfOqo1RfT/CrJzjekXOGhpc1VW71ZLbXyyp+93ILbC1kPtIEYx0FIx1VDrLoVzXRKRYWk809yYlC9ImcrinxtabKnzRJk3lAU1OLEN1j2zrYzr2myHRXJFf4h4QKT1qSTzTB5+ZNTzTRkAxX8FcLV2uS8eoQQ2aAkFzvCM72sJIcJET3WPjRk5wi32uSS9rfZajpWEvj9hW42F4o5NytSXYy8IKHay10VYdrcl4SkqscrXpMwyGOgtkajheSxdQqmpxP1L3t4R5PqasFnrQEjytq6qgp9Y09Qx9o4S1FzhUCn1kyHSzBWLemoSGvOqLNhZyBjmCaAUYpMgt4Ck7wBBMMwWKWgjsUwTaGVsxWC1mYoKiyqqeGKYqonSIRQ3KIkHO0pmAxTdBHkbOvfllfr+AA+7gnc50huVKYK393FOyg7rbPO/izI7hE4CnHHHnJ0ogNPRUGeUpsrZZTBJcrovUcJe51BPsr6GkJdhCCsZ6aTtMEb2pqWkqeVtDXE/QVggsU/Nl86d9RMF3DxvZTA58agu810RWawCiSzzXBeU3MMW9oyJUedvNEvQyNu1f10BSMddR1vaLCYpYa/mGocLSiYDcLbQz8aMn5iyF4xBNMs1P0QEOV7o5gaWGuzSeLue4tt3ro7y4Tgm4G/mopdZgl6q0o6KzJWE3mMksNr3r+a6CbT8g5wZNzT9O7fi/zpaOmnz3BRoqos+tv9zMbdpxsqDBOEewtJLt7cg5wtKKbvldpSzRRCD43VFheCI7yZLppggMVBS/KMAdHODJvOwq2NQSbKKKPLdFWQs7Fqo+mpl01JXYRgq8dnGLhTiFzqmWsUMdpllZdbKlyvSdYxhI9YghOtxR8LgSLWHK62mGGVoxzBE8LNWzqH9CUesQzFy5RQzTc56mhi6fgXEWwpKfE5Z7M05ZgZUPmo6auiv8YKzDYwWBLMErIbKHJvOwIrvEdhOBcQ9JdU1NHQ7CXn2XIDFBKU2WAgcX9UAUzDXWd5alwuyJ41Z9rjKLCL4aCp4WarhPm2rH+SaHUYE001JDZ2ZAzXPjdMpZWvC9wmqIB2lLhQ01D5jO06hghWMndbM7yRJMsoCj1vYbnFQVrW9jak3OlEJ3s/96+p33dEPRV5GxiqaGjIthUU6FFEZyqCa5qJrpBdzSw95IUnOPIrCUUjRZQFrbw5PR0R1qiYx3cb6nrWUMrBmmiBQxVHtTew5ICP/ip6g4hed/Akob/32wvBHsIOX83cI8hGeNeNPCIkPmXe8fPKx84OMSRM1MTdXSwjCZ4S30jVGhvqTRak/OVhgGazHuOCud5onEO1lJr6ecVyaOK6H7zqlBlIaHE0oroCgfvGJIdPcmfLNGLjpz7hZwZQpUbFME0A1cIJa7VNORkgfsMBatbKgwwJM9bSvQXeNOvbIjelg6WWvo5kvbKaJJNHexkKNHL9xRyFlH8Ti2riB5wVPhUk7nGkJnoCe428LR/wRGdYIlmWebCyxou1rCk4g/ShugBDX0V0ZQWkh0dOVsagkM0yV6OoLd5ye+pRlsCr0n+KiQrGuq5yJDzrTAXHtLUMduTDBVKrSm3eHL+6ijxhFDX9Z5gVU/wliHYTMiMFpKLNMEywu80wd3meoFmt6VbRMPenhrOc6DVe4pgXU8DnnHakLOIIrlF4FZPIw6R+zxBP0dyq6OOZ4Q5sLKCcz084ok+VsMMyQhNZmmBgX5xIXOEJTmi7VsGTvMTNdHHhpzdbE8Du2oKxgvBqQKdDDnTFOylCFaxR1syz2iqrOI/FEpNc3C6f11/7+ASS6l2inq2ciTrCCzgyemrCL5SVPjQkdPZUmGy2c9Sw9FtR1sS30RmsKPCS4rkIC/2U0MduwucYolGaPjKEyhzmiPYXagyWbYz8LWBDdzRimAXzxx4z8K9hpzlhLq+NiQ97HuKorMUfK/OVvC2JfiHUPCQI/q7J2gjK+tTDNxkCc4TMssqCs4TGtLVwQihyoAWgj9bosU80XGW6Ac9TJGziaUh5+hnFcHOnlaM1iRn29NaqGENTTTSUHCH2tWTeV0osUhH6psuVLjRUmGWhm6OZEshGeNowABHcJ2Bpy2ZszRcKkRXd2QuKVEeXnbfaEq825FguqfgfE2whlChSRMdron+LATTPQ2Z369t4B9C5gs/ylzv+CMmepIDPclFQl13W0rspPd1JOcbghGOEutqCv5qacURQl3dDKyvyJlqKXGPgcM9FfawJAMVmdcspcYKOZc4GjDYkFlK05olNMHyHn4zFNykyOxt99RkHlfwmiHo60l2EKI+mhreEKp080Tbug08BVPcgoqC5zWt+NLDTZ7oNSF51N1qie7Va3uCCwyZbkINf/NED6jzOsBdZjFN8oqG3wxVunqCSYYKf3EdhJyf9YWGf7tRU2oH3VHgPr1fe5J9hOgHd7xQ0y7qBwXr23aGErP0cm64JVjZwsOGqL+mhNgZmhJLW2oY4UhedsyBgzrCKrq7BmcpNVhR6jBPq64Vgi+kn6XE68pp8J5/+0wRHGOpsKenQn9DZntPzjRLZpDAdD2fnSgkG9tmIXnUwQ6WVighs7Yi2MxQ0N3CqYaCXkJ0oyOztMDJjmSSpcpvlrk0RMMOjmArQ04PRV1DO1FwhCVaUVPpKUM03JK5SxPsIWRu8/CGHi8UHChiqGFDTbSRJWeYUDDcH6vJWUxR4k1FXbMUwV6e4AJFXS8oMqsZKqzvYQ9DDQdZckY4aGsIhtlubbd2r3j4QBMoTamdPZk7O/Bf62lacZwneNjQoGcdVU7zJOd7ghsUHOkosagic6cnWc8+4gg285R6zZP5s1/LUbCKIznTwK36PkdwlOrl4U1LwfdCCa+IrvFkmgw1PCAUXKWo0sURXWcI2muKJlgyFzhynCY4RBOsqCjoI1R5zREco0n2Vt09BQtYSizgKNHfUmUrQ5UOCh51BFcLmY7umhYqXKQomOop8bUnWNNQcIiBcYaC6xzMNOS8JQQfeqKBmmglB+97ok/lfk3ygaHSyZaCRTzRxQo6GzLfa2jWBPepw+UmT7SQEJyiyRkhBLMVOfcoMjcK0eZChfUNzFAUzCsEN5vP/X1uP/n/aoMX+K+nw/Hjr/9xOo7j7Pju61tLcgvJpTWXNbfN5jLpi6VfCOviTktKlFusQixdEKWmEBUKNaIpjZRSSOXSgzaaKLdabrm1/9nZ+/f+vd/vz/v9+Xy+zZ7PRorYoZqyLrCwQdEAixxVOEXNNnjX2nUSRlkqGmWowk8lxR50JPy9Bo6qJXaXwNvREBvnThPEPrewryLhcAnj5WE15Fqi8W7R1sAuEu86S4ENikItFN4xkv9Af4nXSnUVcLiA9xzesFpivRRVeFKtsMRaKBhuSbjOELnAUtlSQUpXgdfB4Z1oSbnFEetbQ0IrAe+Y+pqnDcEJFj6S8LDZzZHwY4e3XONNlARraomNEt2bkvGsosA3ioyHm+6jCMbI59wqt4eeara28IzEmyPgoRaUOEDhTVdEJhmCoTWfC0p8aNkCp0oYqih2iqGi4yXeMkOsn4LdLLnmKfh/YogjNsPebeFGR4m9BJHLzB61XQ3BtpISfS2FugsK9FAtLWX1dCRcrCnUp44CNzuCowUZmxSRgYaE6Za0W2u/E7CVXCiI/UOR8aAm1+OSyE3mOUcwyc1zBBeoX1kiKy0Zfxck1Gsyulti11i83QTBF5Kg3pDQThFMVHiPSlK+0cSedng/VaS8bOZbtsBcTcZAR8JP5KeqQ1OYKAi20njdNNRpgnsU//K+JnaXJaGTomr7aYIphoRn9aeShJWKEq9LcozSF7QleEfDI5LYm5bgVkFkRwVDBCVu0DDIkGupo8TZBq+/pMQURYErJQmPKGKjNDkWOLx7Jd5QizdUweIaKrlP7SwJDhZvONjLkOsBBX9UpGxnydhXkfBLQ8IxgojQbLFnJf81JytSljclYYyEFyx0kVBvKWOFJmONpshGAcsduQY5giVNCV51eOdJYo/pLhbvM0uDHSevNKRcrKZIqnCtJeEsO95RoqcgGK4ocZcho1tTYtcZvH41pNQ7vA0WrhIfOSraIIntIAi+NXWCErdbkvrWwjRLrt0NKUdL6KSOscTOdMSOUtBHwL6OLA0vNSdynaWQEnCpIvKaIrJJEbvHkmuNhn6OjM8VkSGSqn1uYJCGHnq9I3aLhNME3t6GjIkO7xrNFumpyTNX/NrwX7CrIRiqqWijI9JO4d1iieykyfiposQIQ8YjjsjlBh6oHWbwRjgYJQn2NgSnNycmJAk3NiXhx44Sxykihxm8ybUwT1OVKySc7vi3OXVkdBJ4AyXBeksDXG0IhgtYY0lY5ahCD0ehborIk5aUWRJviMA7Xt5kyRjonrXENkm8yYqgs8VzgrJmClK20uMM3jRJ0FiQICQF9hdETlLQWRIb5ki6WDfWRPobvO6a4GP5mcOrNzDFELtTkONLh9dXE8xypEg7z8A9jkhrQ6Fhjlg/QVktJXxt4WXzT/03Q8IaQWSqIuEvloQ2mqC9Jfi7wRul4RX3pSPlzpoVlmCtI2jvKHCFhjcM3sN6lqF6HxnKelLjXWbwrpR4xzuCrTUZx2qq9oAh8p6ixCUGr78g8oyjRAtB5CZFwi80VerVpI0h+IeBxa6Zg6kWvpDHaioYYuEsRbDC3eOmC2JvGYLeioxGknL2UATNJN6hmtj1DlpLvDVmocYbrGCVJKOrg4X6DgddLA203BKMFngdJJFtFd7vJLm6KEpc5yjQrkk7M80SGe34X24nSex1Ra5Omgb71JKyg8SrU3i/kARKwWpH0kOGhKkObyfd0ZGjvyXlAkVZ4xRbYJ2irFMkFY1SwyWxr2oo4zlNiV+7zmaweFpT4kR3kaDAFW6xpSqzJay05FtYR4HmZhc9UxKbbfF2V8RG1MBmSaE+kmC6JnaRXK9gsiXhJHl/U0qM0WTcbyhwkYIvFGwjSbjfwhiJt8ZSQU+Bd5+marPMOkVkD0muxYLIfEuhh60x/J92itguihJSEMySVPQnTewnEm+620rTQEMsOfo4/kP/0ARvWjitlpSX7GxBgcMEsd3EEeYWvdytd+Saawi6aCIj1CkGb6Aj9rwhx16Cf3vAwFy5pyLhVonXzy51FDpdEblbkdJbUcEPDEFzQ8qNmhzzLTmmKWKbFCXeEuRabp6rxbvAtLF442QjQ+wEA9eL1xSR7Q0JXzlSHjJ4exq89yR0laScJ/FW6z4a73pFMEfDiRZvuvijIt86RaSFOl01riV2mD1UEvxGk/Geg5aWwGki1zgKPG9J2U8PEg8qYvMsZeytiTRXBMslCU8JSlxi8EabjwUldlDNLfzTUmCgxWsjqWCOHavYAqsknKFIO0yQ61VL5AVFxk6WhEaCAkdJgt9aSkzXlKNX2jEa79waYuc7gq0N3GDJGCBhoiTXUEPsdknCUE1CK0fwsiaylSF2uiDyO4XX3pFhNd7R4itFGc0k/ElBZwWvq+GC6szVeEoS/MZ+qylwpKNKv9Z469UOjqCjwlusicyTxG6VpNxcQ8IncoR4RhLbR+NdpGGmJWOcIzJGUuKPGpQg8rrG21dOMqQssJQ4RxH5jaUqnZuQ0F4Q+cjxLwPtpZbIAk3QTJHQWBE5S1BokoVtDd6lhqr9UpHSUxMcIYl9pojsb8h4SBOsMQcqvOWC2E8EVehqiJ1hrrAEbQxeK0NGZ0Gkq+guSRgniM23bIHVkqwx4hiHd7smaOyglyIyQuM978j4VS08J/A2G1KeMBRo4fBaSNhKUEZfQewVQ/C1I+MgfbEleEzCUw7mKXI0M3hd1EESVji8x5uQ41nxs1q4RMJCCXs7Iq9acpxn22oSDnQ/sJTxsCbHIYZiLyhY05TY0ZLIOQrGaSJDDN4t8pVaIrsqqFdEegtizc1iTew5Q4ayBDMUsQMkXocaYkc0hZua412siZ1rSXlR460zRJ5SlHGe5j801RLMlJTxtaOM3Q1pvxJ45zUlWFD7rsAbpfEm1JHxG0eh8w2R7QQVzBUw28FhFp5QZzq8t2rx2joqulYTWSuJdTYfWwqMFMcovFmSyJPNyLhE4E10pHzYjOC3huArRa571ZsGajQpQx38SBP5pyZB6lMU3khDnp0MBV51BE9o2E+TY5Ml2E8S7C0o6w1xvCZjf0HkVEHCzFoyNmqC+9wdcqN+Tp7jSDheE9ws8Y5V0NJCn2bk2tqSY4okdrEhx1iDN8cSudwepWmAGXKcJXK65H9to8jYQRH7SBF01ESUJdd0TayVInaWhLkOjlXE5irKGOnI6GSWGCJa482zBI9rCr0jyTVcEuzriC1vcr6mwFGSiqy5zMwxBH/TJHwjSPhL8+01kaaSUuMFKTcLEvaUePcrSmwn8DZrgikWb7CGPxkSjhQwrRk57tctmxLsb9sZvL9LSlyuSLlWkqOjwduo8b6Uv1DkmudIeFF2dHCgxVtk8dpIvHpBxhEOdhKk7OLIUSdJ+cSRY57B+0DgGUUlNfpthTfGkauzxrvTsUUaCVhlKeteTXCoJDCa2NOKhOmC4G1H8JBd4OBZReSRGkqcb/CO1PyLJTLB4j1q8JYaIutEjSLX8YKM+a6phdMsdLFUoV5RTm9JSkuDN8WcIon0NZMNZWh1q8C7SJEwV5HxrmnnTrf3KoJBlmCYI2ilSLlfEvlE4011NNgjgthzEua0oKK7JLE7HZHlEl60BLMVFewg4EWNt0ThrVNEVkkiTwpKXSWJzdRENgvKGq4IhjsiezgSFtsfCUq8qki5S1LRQeYQQ4nemmCkImWMw3tFUoUBZk4NOeZYEp4XRKTGa6wJjrWNHBVJR4m3FCnbuD6aak2WsMTh3SZImGCIPKNgsDpVwnsa70K31lCFJZYcwwSMFcQulGTsZuEaSdBXkPGZhu0FsdUO73RHjq8MPGGIfaGIbVTk6iuI3GFgucHrIQkmWSJdBd7BBu+uOryWAhY7+Lki9rK5wtEQzWwvtbqGhIMFwWRJsElsY4m9IIg9L6lCX0VklaPAYkfkZEGDnOWowlBJjtMUkcGK4Lg6EtoZInMUBVYLgn0UsdmCyCz7gIGHFfk+k1QwTh5We7A9x+IdJ6CvIkEagms0hR50eH9UnTQJ+2oiKyVlLFUE+8gBGu8MQ3CppUHesnjTHN4QB/UGPhCTHLFPHMFrCqa73gqObUJGa03wgbhHkrCfpEpzNLE7JDS25FMKhlhKKWKfCgqstLCPu1zBXy0J2ztwjtixBu8UTRn9LVtkmCN2iyFhtME70JHRQ1KVZXqKI/KNIKYMCYs1GUMEKbM1bKOI9LDXC7zbHS+bt+1MTWS9odA9DtrYtpbImQJ2VHh/lisEwaHqUk1kjKTAKknkBEXkbkdMGwq0dnhzLJF3NJH3JVwrqOB4Sca2hti75nmJN0WzxS6UxDYoEpxpa4htVlRjkYE7DZGzJVU72uC9IyhQL4i8YfGWSYLLNcHXloyz7QhNifmKSE9JgfGmuyLhc403Xm9vqcp6gXe3xuuv8F6VJNxkyTHEkHG2g0aKXL0MsXc1bGfgas2//dCONXiNLCX+5mB7eZIl1kHh7ajwpikyzlUUWOVOsjSQlsS+M0R+pPje/dzBXRZGO0rMtgQrLLG9VSu9n6CMXS3BhwYmSoIBhsjNBmZbgusE9BCPCP5triU4VhNbJfE+swSP27aayE8tuTpYYjtrYjMVGZdp2NpS1s6aBnKSHDsbKuplKbHM4a0wMFd/5/DmGyKrJSUaW4IBrqUhx0vyfzTBBLPIUcnZdrAkNsKR0sWRspumSns6Ch0v/qqIbBYUWKvPU/CFoyrDJGwSNFhbA/MlzKqjrO80hRbpKx0Jewsi/STftwGSlKc1JZyAzx05dhLEdnfQvhZOqiHWWEAHC7+30FuRcZUgaO5gpaIK+xsiHRUsqaPElTV40xQZQ107Q9BZE1nryDVGU9ZSQ47bmhBpLcYpUt7S+xuK/FiT8qKjwXYw5ypS2iuCv7q1gtgjhuBuB8LCFY5cUuCNtsQOFcT+4Ih9JX+k8Ea6v0iCIRZOtCT0Et00JW5UeC85Cg0ScK0k411HcG1zKtre3SeITBRk7WfwDhEvaYLTHP9le0m8By0JDwn4TlLW/aJOvGHxdjYUes+ScZigCkYQdNdEOhkiezgShqkx8ueKjI8lDfK2oNiOFvrZH1hS+tk7NV7nOmLHicGWEgubkXKdwdtZknCLJXaCpkrjZBtLZFsDP9CdxWsSr05Sxl6CMmoFbCOgryX40uDtamB7SVmXW4Ihlgpmq+00tBKUUa83WbjLUNkzDmY7cow1JDygyPGlhgGKYKz4vcV7QBNbJIgM11TUqZaMdwTeSguH6rOaw1JRKzaaGyxVm2EJ/uCIrVWUcZUkcp2grMsEjK+DMwS59jQk3Kd6SEq1d0S6uVmO4Bc1lDXTUcHjluCXEq+1OlBDj1pi9zgiXxnKuE0SqTXwhqbETW6RggMEnGl/q49UT2iCzgJvRwVXS2K/d6+ZkyUl7jawSVLit46EwxVljDZwoSQ20sDBihztHfk2yA8NVZghiXwrYHQdfKAOtzsayjhY9bY0yE2CWEeJ9xfzO423xhL5syS2TFJofO2pboHob0nY4GiAgRrvGQEDa/FWSsoaaYl0syRsEt3kWoH3B01shCXhTUWe9w3Bt44SC9QCh3eShQctwbaK2ApLroGCMlZrYqvlY3qYhM0aXpFkPOuoqJ3Dm6fxXrGwVF9gCWZagjPqznfkuMKQ8DPTQRO8ZqG1hPGKEm9IgpGW4DZDgTNriTxvFiq+Lz+0cKfp4wj6OCK9JSnzNSn9LFU7UhKZZMnYwcJ8s8yRsECScK4j5UOB95HFO0CzhY4xJxuCix0lDlEUeMdS6EZBkTsUkZ4K74dugyTXS7aNgL8aqjDfkCE0ZbwkCXpaWCKhl8P7VD5jxykivSyxyZrYERbe168LYu9ZYh86IkscgVLE7tWPKmJv11CgoyJltMEbrohtVAQfO4ImltiHEroYEs7RxAarVpY8AwXMcMReFOTYWe5iiLRQxJ5Q8DtJ8LQhWOhIeFESPGsILhbNDRljNbHzNRlTFbk2S3L0NOS6V1KFJYKUbSTcIIhM0wQ/s2TM0SRMNcQmSap3jCH4yhJZKSkwyRHpYYgsFeQ4U7xoCB7VVOExhXepo9ABBsYbvGWKXPME3lyH95YioZ0gssQRWWbI+FaSMkXijZXwgiTlYdPdkNLaETxlyDVIwqeaEus0aTcYcg0RVOkpR3CSJqIddK+90JCxzsDVloyrFd5ZAr4TBKfaWa6boEA7C7s6EpYaeFPjveooY72mjIccLHJ9HUwVlDhKkmutJDJBwnp1rvulJZggKDRfbXAkvC/4l3ozQOG9a8lxjx0i7nV4jSXc7vhe3OwIxjgSHjdEhhsif9YkPGlus3iLFDnWOFhtCZbJg0UbQcIaR67JjthoCyMEZRwhiXWyxO5QxI6w5NhT4U1WsJvDO60J34fW9hwzwlKij6ZAW9ne4L0s8C6XeBMEkd/LQy1VucBRot6QMlbivaBhoBgjqGiCJNhsqVp/S2SsG6DIONCR0dXhvWbJ+MRRZJkkuEjgDXJjFQW6SSL7GXK8Z2CZg7cVsbWGoKmEpzQ5elpiy8Ryg7dMkLLUEauzeO86CuwlSOlgYLojZWeJ9xM3S1PWfEfKl5ISLQ0MEKR8YOB2QfCxJBjrKPCN4f9MkaSsqoVXJBmP7EpFZ9UQfOoOFwSzBN4MQ8LsGrymlipcJQhmy0GaQjPqCHaXRwuCZwRbqK2Fg9wlClZqYicrIgMdZfxTQ0c7TBIbrChxmuzoKG8XRaSrIhhiyNFJkrC7oIAWMEOQa5aBekPCRknCo4IKPrYkvCDI8aYmY7WFtprgekcJZ3oLIqssCSMtFbQTJKwXYy3BY5oCh2iKPCpJOE+zRdpYgi6O2KmOAgvVCYaU4ySRek1sgyFhJ403QFHiVEmJHwtybO1gs8Hr5+BETQX3War0qZngYGgtVZtoqd6vFSk/UwdZElYqyjrF4HXUeFspIi9IGKf4j92pKGAdCYMVsbcV3kRF0N+R8LUd5PCsIGWoxDtBkCI0nKofdJQxT+LtZflvuc8Q3CjwWkq8KwUpHzkK/NmSsclCL0nseQdj5FRH5CNHSgtLiW80Of5HU9Hhlsga9bnBq3fEVltKfO5IaSTmGjjc4J0otcP7QsJUSQM8pEj5/wCuUuC2DWz8AAAAAElFTkSuQmCC\\\");\\\n}\\\n.ace-ambiance .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC\\\") right repeat-y;\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-chaos.js",
    "content": "ace.define(\"ace/theme/chaos\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-chaos\";\nexports.cssText = \".ace-chaos .ace_gutter {\\\nbackground: #141414;\\\ncolor: #595959;\\\nborder-right: 1px solid #282828;\\\n}\\\n.ace-chaos .ace_gutter-cell.ace_warning {\\\nbackground-image: none;\\\nbackground: #FC0;\\\nborder-left: none;\\\npadding-left: 0;\\\ncolor: #000;\\\n}\\\n.ace-chaos .ace_gutter-cell.ace_error {\\\nbackground-position: -6px center;\\\nbackground-image: none;\\\nbackground: #F10;\\\nborder-left: none;\\\npadding-left: 0;\\\ncolor: #000;\\\n}\\\n.ace-chaos .ace_print-margin {\\\nborder-left: 1px solid #555;\\\nright: 0;\\\nbackground: #1D1D1D;\\\n}\\\n.ace-chaos {\\\nbackground-color: #161616;\\\ncolor: #E6E1DC;\\\n}\\\n.ace-chaos .ace_cursor {\\\nborder-left: 2px solid #FFFFFF;\\\n}\\\n.ace-chaos .ace_cursor.ace_overwrite {\\\nborder-left: 0px;\\\nborder-bottom: 1px solid #FFFFFF;\\\n}\\\n.ace-chaos .ace_marker-layer .ace_selection {\\\nbackground: #494836;\\\n}\\\n.ace-chaos .ace_marker-layer .ace_step {\\\nbackground: rgb(198, 219, 174);\\\n}\\\n.ace-chaos .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid #FCE94F;\\\n}\\\n.ace-chaos .ace_marker-layer .ace_active-line {\\\nbackground: #333;\\\n}\\\n.ace-chaos .ace_gutter-active-line {\\\nbackground-color: #222;\\\n}\\\n.ace-chaos .ace_invisible {\\\ncolor: #404040;\\\n}\\\n.ace-chaos .ace_keyword {\\\ncolor:#00698F;\\\n}\\\n.ace-chaos .ace_keyword.ace_operator {\\\ncolor:#FF308F;\\\n}\\\n.ace-chaos .ace_constant {\\\ncolor:#1EDAFB;\\\n}\\\n.ace-chaos .ace_constant.ace_language {\\\ncolor:#FDC251;\\\n}\\\n.ace-chaos .ace_constant.ace_library {\\\ncolor:#8DFF0A;\\\n}\\\n.ace-chaos .ace_constant.ace_numeric {\\\ncolor:#58C554;\\\n}\\\n.ace-chaos .ace_invalid {\\\ncolor:#FFFFFF;\\\nbackground-color:#990000;\\\n}\\\n.ace-chaos .ace_invalid.ace_deprecated {\\\ncolor:#FFFFFF;\\\nbackground-color:#990000;\\\n}\\\n.ace-chaos .ace_support {\\\ncolor: #999;\\\n}\\\n.ace-chaos .ace_support.ace_function {\\\ncolor:#00AEEF;\\\n}\\\n.ace-chaos .ace_function {\\\ncolor:#00AEEF;\\\n}\\\n.ace-chaos .ace_string {\\\ncolor:#58C554;\\\n}\\\n.ace-chaos .ace_comment {\\\ncolor:#555;\\\nfont-style:italic;\\\npadding-bottom: 0px;\\\n}\\\n.ace-chaos .ace_variable {\\\ncolor:#997744;\\\n}\\\n.ace-chaos .ace_meta.ace_tag {\\\ncolor:#BE53E6;\\\n}\\\n.ace-chaos .ace_entity.ace_other.ace_attribute-name {\\\ncolor:#FFFF89;\\\n}\\\n.ace-chaos .ace_markup.ace_underline {\\\ntext-decoration: underline;\\\n}\\\n.ace-chaos .ace_fold-widget {\\\ntext-align: center;\\\n}\\\n.ace-chaos .ace_fold-widget:hover {\\\ncolor: #777;\\\n}\\\n.ace-chaos .ace_fold-widget.ace_start,\\\n.ace-chaos .ace_fold-widget.ace_end,\\\n.ace-chaos .ace_fold-widget.ace_closed{\\\nbackground: none;\\\nborder: none;\\\nbox-shadow: none;\\\n}\\\n.ace-chaos .ace_fold-widget.ace_start:after {\\\ncontent: '▾'\\\n}\\\n.ace-chaos .ace_fold-widget.ace_end:after {\\\ncontent: '▴'\\\n}\\\n.ace-chaos .ace_fold-widget.ace_closed:after {\\\ncontent: '‣'\\\n}\\\n.ace-chaos .ace_indent-guide {\\\nborder-right:1px dotted #333;\\\nmargin-right:-1px;\\\n}\\\n.ace-chaos .ace_fold { \\\nbackground: #222; \\\nborder-radius: 3px; \\\ncolor: #7AF; \\\nborder: none; \\\n}\\\n.ace-chaos .ace_fold:hover {\\\nbackground: #CCC; \\\ncolor: #000;\\\n}\\\n\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-chrome.js",
    "content": "ace.define(\"ace/theme/chrome\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = false;\nexports.cssClass = \"ace-chrome\";\nexports.cssText = \".ace-chrome .ace_gutter {\\\nbackground: #ebebeb;\\\ncolor: #333;\\\noverflow : hidden;\\\n}\\\n.ace-chrome .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8;\\\n}\\\n.ace-chrome {\\\nbackground-color: #FFFFFF;\\\ncolor: black;\\\n}\\\n.ace-chrome .ace_cursor {\\\ncolor: black;\\\n}\\\n.ace-chrome .ace_invisible {\\\ncolor: rgb(191, 191, 191);\\\n}\\\n.ace-chrome .ace_constant.ace_buildin {\\\ncolor: rgb(88, 72, 246);\\\n}\\\n.ace-chrome .ace_constant.ace_language {\\\ncolor: rgb(88, 92, 246);\\\n}\\\n.ace-chrome .ace_constant.ace_library {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-chrome .ace_invalid {\\\nbackground-color: rgb(153, 0, 0);\\\ncolor: white;\\\n}\\\n.ace-chrome .ace_fold {\\\n}\\\n.ace-chrome .ace_support.ace_function {\\\ncolor: rgb(60, 76, 114);\\\n}\\\n.ace-chrome .ace_support.ace_constant {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-chrome .ace_support.ace_type,\\\n.ace-chrome .ace_support.ace_class\\\n.ace-chrome .ace_support.ace_other {\\\ncolor: rgb(109, 121, 222);\\\n}\\\n.ace-chrome .ace_variable.ace_parameter {\\\nfont-style:italic;\\\ncolor:#FD971F;\\\n}\\\n.ace-chrome .ace_keyword.ace_operator {\\\ncolor: rgb(104, 118, 135);\\\n}\\\n.ace-chrome .ace_comment {\\\ncolor: #236e24;\\\n}\\\n.ace-chrome .ace_comment.ace_doc {\\\ncolor: #236e24;\\\n}\\\n.ace-chrome .ace_comment.ace_doc.ace_tag {\\\ncolor: #236e24;\\\n}\\\n.ace-chrome .ace_constant.ace_numeric {\\\ncolor: rgb(0, 0, 205);\\\n}\\\n.ace-chrome .ace_variable {\\\ncolor: rgb(49, 132, 149);\\\n}\\\n.ace-chrome .ace_xml-pe {\\\ncolor: rgb(104, 104, 91);\\\n}\\\n.ace-chrome .ace_entity.ace_name.ace_function {\\\ncolor: #0000A2;\\\n}\\\n.ace-chrome .ace_heading {\\\ncolor: rgb(12, 7, 255);\\\n}\\\n.ace-chrome .ace_list {\\\ncolor:rgb(185, 6, 144);\\\n}\\\n.ace-chrome .ace_marker-layer .ace_selection {\\\nbackground: rgb(181, 213, 255);\\\n}\\\n.ace-chrome .ace_marker-layer .ace_step {\\\nbackground: rgb(252, 255, 0);\\\n}\\\n.ace-chrome .ace_marker-layer .ace_stack {\\\nbackground: rgb(164, 229, 101);\\\n}\\\n.ace-chrome .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgb(192, 192, 192);\\\n}\\\n.ace-chrome .ace_marker-layer .ace_active-line {\\\nbackground: rgba(0, 0, 0, 0.07);\\\n}\\\n.ace-chrome .ace_gutter-active-line {\\\nbackground-color : #dcdcdc;\\\n}\\\n.ace-chrome .ace_marker-layer .ace_selected-word {\\\nbackground: rgb(250, 250, 255);\\\nborder: 1px solid rgb(200, 200, 250);\\\n}\\\n.ace-chrome .ace_storage,\\\n.ace-chrome .ace_keyword,\\\n.ace-chrome .ace_meta.ace_tag {\\\ncolor: rgb(147, 15, 128);\\\n}\\\n.ace-chrome .ace_string.ace_regex {\\\ncolor: rgb(255, 0, 0)\\\n}\\\n.ace-chrome .ace_string {\\\ncolor: #1A1AA6;\\\n}\\\n.ace-chrome .ace_entity.ace_other.ace_attribute-name {\\\ncolor: #994409;\\\n}\\\n.ace-chrome .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\\\n\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-clouds.js",
    "content": "ace.define(\"ace/theme/clouds\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = false;\nexports.cssClass = \"ace-clouds\";\nexports.cssText = \".ace-clouds .ace_gutter {\\\nbackground: #ebebeb;\\\ncolor: #333\\\n}\\\n.ace-clouds .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8\\\n}\\\n.ace-clouds {\\\nbackground-color: #FFFFFF;\\\ncolor: #000000\\\n}\\\n.ace-clouds .ace_cursor {\\\ncolor: #000000\\\n}\\\n.ace-clouds .ace_marker-layer .ace_selection {\\\nbackground: #BDD5FC\\\n}\\\n.ace-clouds.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #FFFFFF;\\\nborder-radius: 2px\\\n}\\\n.ace-clouds .ace_marker-layer .ace_step {\\\nbackground: rgb(255, 255, 0)\\\n}\\\n.ace-clouds .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid #BFBFBF\\\n}\\\n.ace-clouds .ace_marker-layer .ace_active-line {\\\nbackground: #FFFBD1\\\n}\\\n.ace-clouds .ace_gutter-active-line {\\\nbackground-color : #dcdcdc\\\n}\\\n.ace-clouds .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid #BDD5FC\\\n}\\\n.ace-clouds .ace_invisible {\\\ncolor: #BFBFBF\\\n}\\\n.ace-clouds .ace_keyword,\\\n.ace-clouds .ace_meta,\\\n.ace-clouds .ace_support.ace_constant.ace_property-value {\\\ncolor: #AF956F\\\n}\\\n.ace-clouds .ace_keyword.ace_operator {\\\ncolor: #484848\\\n}\\\n.ace-clouds .ace_keyword.ace_other.ace_unit {\\\ncolor: #96DC5F\\\n}\\\n.ace-clouds .ace_constant.ace_language {\\\ncolor: #39946A\\\n}\\\n.ace-clouds .ace_constant.ace_numeric {\\\ncolor: #46A609\\\n}\\\n.ace-clouds .ace_constant.ace_character.ace_entity {\\\ncolor: #BF78CC\\\n}\\\n.ace-clouds .ace_invalid {\\\nbackground-color: #FF002A\\\n}\\\n.ace-clouds .ace_fold {\\\nbackground-color: #AF956F;\\\nborder-color: #000000\\\n}\\\n.ace-clouds .ace_storage,\\\n.ace-clouds .ace_support.ace_class,\\\n.ace-clouds .ace_support.ace_function,\\\n.ace-clouds .ace_support.ace_other,\\\n.ace-clouds .ace_support.ace_type {\\\ncolor: #C52727\\\n}\\\n.ace-clouds .ace_string {\\\ncolor: #5D90CD\\\n}\\\n.ace-clouds .ace_comment {\\\ncolor: #BCC8BA\\\n}\\\n.ace-clouds .ace_entity.ace_name.ace_tag,\\\n.ace-clouds .ace_entity.ace_other.ace_attribute-name {\\\ncolor: #606060\\\n}\\\n.ace-clouds .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-clouds_midnight.js",
    "content": "ace.define(\"ace/theme/clouds_midnight\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-clouds-midnight\";\nexports.cssText = \".ace-clouds-midnight .ace_gutter {\\\nbackground: #232323;\\\ncolor: #929292\\\n}\\\n.ace-clouds-midnight .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #232323\\\n}\\\n.ace-clouds-midnight {\\\nbackground-color: #191919;\\\ncolor: #929292\\\n}\\\n.ace-clouds-midnight .ace_cursor {\\\ncolor: #7DA5DC\\\n}\\\n.ace-clouds-midnight .ace_marker-layer .ace_selection {\\\nbackground: #000000\\\n}\\\n.ace-clouds-midnight.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #191919;\\\nborder-radius: 2px\\\n}\\\n.ace-clouds-midnight .ace_marker-layer .ace_step {\\\nbackground: rgb(102, 82, 0)\\\n}\\\n.ace-clouds-midnight .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid #BFBFBF\\\n}\\\n.ace-clouds-midnight .ace_marker-layer .ace_active-line {\\\nbackground: rgba(215, 215, 215, 0.031)\\\n}\\\n.ace-clouds-midnight .ace_gutter-active-line {\\\nbackground-color: rgba(215, 215, 215, 0.031)\\\n}\\\n.ace-clouds-midnight .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid #000000\\\n}\\\n.ace-clouds-midnight .ace_invisible {\\\ncolor: #BFBFBF\\\n}\\\n.ace-clouds-midnight .ace_keyword,\\\n.ace-clouds-midnight .ace_meta,\\\n.ace-clouds-midnight .ace_support.ace_constant.ace_property-value {\\\ncolor: #927C5D\\\n}\\\n.ace-clouds-midnight .ace_keyword.ace_operator {\\\ncolor: #4B4B4B\\\n}\\\n.ace-clouds-midnight .ace_keyword.ace_other.ace_unit {\\\ncolor: #366F1A\\\n}\\\n.ace-clouds-midnight .ace_constant.ace_language {\\\ncolor: #39946A\\\n}\\\n.ace-clouds-midnight .ace_constant.ace_numeric {\\\ncolor: #46A609\\\n}\\\n.ace-clouds-midnight .ace_constant.ace_character.ace_entity {\\\ncolor: #A165AC\\\n}\\\n.ace-clouds-midnight .ace_invalid {\\\ncolor: #FFFFFF;\\\nbackground-color: #E92E2E\\\n}\\\n.ace-clouds-midnight .ace_fold {\\\nbackground-color: #927C5D;\\\nborder-color: #929292\\\n}\\\n.ace-clouds-midnight .ace_storage,\\\n.ace-clouds-midnight .ace_support.ace_class,\\\n.ace-clouds-midnight .ace_support.ace_function,\\\n.ace-clouds-midnight .ace_support.ace_other,\\\n.ace-clouds-midnight .ace_support.ace_type {\\\ncolor: #E92E2E\\\n}\\\n.ace-clouds-midnight .ace_string {\\\ncolor: #5D90CD\\\n}\\\n.ace-clouds-midnight .ace_comment {\\\ncolor: #3C403B\\\n}\\\n.ace-clouds-midnight .ace_entity.ace_name.ace_tag,\\\n.ace-clouds-midnight .ace_entity.ace_other.ace_attribute-name {\\\ncolor: #606060\\\n}\\\n.ace-clouds-midnight .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-cobalt.js",
    "content": "ace.define(\"ace/theme/cobalt\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-cobalt\";\nexports.cssText = \".ace-cobalt .ace_gutter {\\\nbackground: #011e3a;\\\ncolor: rgb(128,145,160)\\\n}\\\n.ace-cobalt .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #011e3a\\\n}\\\n.ace-cobalt {\\\nbackground-color: #002240;\\\ncolor: #FFFFFF\\\n}\\\n.ace-cobalt .ace_cursor {\\\ncolor: #FFFFFF\\\n}\\\n.ace-cobalt .ace_marker-layer .ace_selection {\\\nbackground: rgba(179, 101, 57, 0.75)\\\n}\\\n.ace-cobalt.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #002240;\\\nborder-radius: 2px\\\n}\\\n.ace-cobalt .ace_marker-layer .ace_step {\\\nbackground: rgb(127, 111, 19)\\\n}\\\n.ace-cobalt .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgba(255, 255, 255, 0.15)\\\n}\\\n.ace-cobalt .ace_marker-layer .ace_active-line {\\\nbackground: rgba(0, 0, 0, 0.35)\\\n}\\\n.ace-cobalt .ace_gutter-active-line {\\\nbackground-color: rgba(0, 0, 0, 0.35)\\\n}\\\n.ace-cobalt .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid rgba(179, 101, 57, 0.75)\\\n}\\\n.ace-cobalt .ace_invisible {\\\ncolor: rgba(255, 255, 255, 0.15)\\\n}\\\n.ace-cobalt .ace_keyword,\\\n.ace-cobalt .ace_meta {\\\ncolor: #FF9D00\\\n}\\\n.ace-cobalt .ace_constant,\\\n.ace-cobalt .ace_constant.ace_character,\\\n.ace-cobalt .ace_constant.ace_character.ace_escape,\\\n.ace-cobalt .ace_constant.ace_other {\\\ncolor: #FF628C\\\n}\\\n.ace-cobalt .ace_invalid {\\\ncolor: #F8F8F8;\\\nbackground-color: #800F00\\\n}\\\n.ace-cobalt .ace_support {\\\ncolor: #80FFBB\\\n}\\\n.ace-cobalt .ace_support.ace_constant {\\\ncolor: #EB939A\\\n}\\\n.ace-cobalt .ace_fold {\\\nbackground-color: #FF9D00;\\\nborder-color: #FFFFFF\\\n}\\\n.ace-cobalt .ace_support.ace_function {\\\ncolor: #FFB054\\\n}\\\n.ace-cobalt .ace_storage {\\\ncolor: #FFEE80\\\n}\\\n.ace-cobalt .ace_entity {\\\ncolor: #FFDD00\\\n}\\\n.ace-cobalt .ace_string {\\\ncolor: #3AD900\\\n}\\\n.ace-cobalt .ace_string.ace_regexp {\\\ncolor: #80FFC2\\\n}\\\n.ace-cobalt .ace_comment {\\\nfont-style: italic;\\\ncolor: #0088FF\\\n}\\\n.ace-cobalt .ace_heading,\\\n.ace-cobalt .ace_markup.ace_heading {\\\ncolor: #C8E4FD;\\\nbackground-color: #001221\\\n}\\\n.ace-cobalt .ace_list,\\\n.ace-cobalt .ace_markup.ace_list {\\\nbackground-color: #130D26\\\n}\\\n.ace-cobalt .ace_variable {\\\ncolor: #CCCCCC\\\n}\\\n.ace-cobalt .ace_variable.ace_language {\\\ncolor: #FF80E1\\\n}\\\n.ace-cobalt .ace_meta.ace_tag {\\\ncolor: #9EFFFF\\\n}\\\n.ace-cobalt .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHCLSvkPAAP3AgSDTRd4AAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-crimson_editor.js",
    "content": "ace.define(\"ace/theme/crimson_editor\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\nexports.isDark = false;\nexports.cssText = \".ace-crimson-editor .ace_gutter {\\\nbackground: #ebebeb;\\\ncolor: #333;\\\noverflow : hidden;\\\n}\\\n.ace-crimson-editor .ace_gutter-layer {\\\nwidth: 100%;\\\ntext-align: right;\\\n}\\\n.ace-crimson-editor .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8;\\\n}\\\n.ace-crimson-editor {\\\nbackground-color: #FFFFFF;\\\ncolor: rgb(64, 64, 64);\\\n}\\\n.ace-crimson-editor .ace_cursor {\\\ncolor: black;\\\n}\\\n.ace-crimson-editor .ace_invisible {\\\ncolor: rgb(191, 191, 191);\\\n}\\\n.ace-crimson-editor .ace_identifier {\\\ncolor: black;\\\n}\\\n.ace-crimson-editor .ace_keyword {\\\ncolor: blue;\\\n}\\\n.ace-crimson-editor .ace_constant.ace_buildin {\\\ncolor: rgb(88, 72, 246);\\\n}\\\n.ace-crimson-editor .ace_constant.ace_language {\\\ncolor: rgb(255, 156, 0);\\\n}\\\n.ace-crimson-editor .ace_constant.ace_library {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-crimson-editor .ace_invalid {\\\ntext-decoration: line-through;\\\ncolor: rgb(224, 0, 0);\\\n}\\\n.ace-crimson-editor .ace_fold {\\\n}\\\n.ace-crimson-editor .ace_support.ace_function {\\\ncolor: rgb(192, 0, 0);\\\n}\\\n.ace-crimson-editor .ace_support.ace_constant {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-crimson-editor .ace_support.ace_type,\\\n.ace-crimson-editor .ace_support.ace_class {\\\ncolor: rgb(109, 121, 222);\\\n}\\\n.ace-crimson-editor .ace_keyword.ace_operator {\\\ncolor: rgb(49, 132, 149);\\\n}\\\n.ace-crimson-editor .ace_string {\\\ncolor: rgb(128, 0, 128);\\\n}\\\n.ace-crimson-editor .ace_comment {\\\ncolor: rgb(76, 136, 107);\\\n}\\\n.ace-crimson-editor .ace_comment.ace_doc {\\\ncolor: rgb(0, 102, 255);\\\n}\\\n.ace-crimson-editor .ace_comment.ace_doc.ace_tag {\\\ncolor: rgb(128, 159, 191);\\\n}\\\n.ace-crimson-editor .ace_constant.ace_numeric {\\\ncolor: rgb(0, 0, 64);\\\n}\\\n.ace-crimson-editor .ace_variable {\\\ncolor: rgb(0, 64, 128);\\\n}\\\n.ace-crimson-editor .ace_xml-pe {\\\ncolor: rgb(104, 104, 91);\\\n}\\\n.ace-crimson-editor .ace_marker-layer .ace_selection {\\\nbackground: rgb(181, 213, 255);\\\n}\\\n.ace-crimson-editor .ace_marker-layer .ace_step {\\\nbackground: rgb(252, 255, 0);\\\n}\\\n.ace-crimson-editor .ace_marker-layer .ace_stack {\\\nbackground: rgb(164, 229, 101);\\\n}\\\n.ace-crimson-editor .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgb(192, 192, 192);\\\n}\\\n.ace-crimson-editor .ace_marker-layer .ace_active-line {\\\nbackground: rgb(232, 242, 254);\\\n}\\\n.ace-crimson-editor .ace_gutter-active-line {\\\nbackground-color : #dcdcdc;\\\n}\\\n.ace-crimson-editor .ace_meta.ace_tag {\\\ncolor:rgb(28, 2, 255);\\\n}\\\n.ace-crimson-editor .ace_marker-layer .ace_selected-word {\\\nbackground: rgb(250, 250, 255);\\\nborder: 1px solid rgb(200, 200, 250);\\\n}\\\n.ace-crimson-editor .ace_string.ace_regex {\\\ncolor: rgb(192, 0, 192);\\\n}\\\n.ace-crimson-editor .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\";\n\nexports.cssClass = \"ace-crimson-editor\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-dawn.js",
    "content": "ace.define(\"ace/theme/dawn\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = false;\nexports.cssClass = \"ace-dawn\";\nexports.cssText = \".ace-dawn .ace_gutter {\\\nbackground: #ebebeb;\\\ncolor: #333\\\n}\\\n.ace-dawn .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8\\\n}\\\n.ace-dawn {\\\nbackground-color: #F9F9F9;\\\ncolor: #080808\\\n}\\\n.ace-dawn .ace_cursor {\\\ncolor: #000000\\\n}\\\n.ace-dawn .ace_marker-layer .ace_selection {\\\nbackground: rgba(39, 95, 255, 0.30)\\\n}\\\n.ace-dawn.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #F9F9F9;\\\nborder-radius: 2px\\\n}\\\n.ace-dawn .ace_marker-layer .ace_step {\\\nbackground: rgb(255, 255, 0)\\\n}\\\n.ace-dawn .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgba(75, 75, 126, 0.50)\\\n}\\\n.ace-dawn .ace_marker-layer .ace_active-line {\\\nbackground: rgba(36, 99, 180, 0.12)\\\n}\\\n.ace-dawn .ace_gutter-active-line {\\\nbackground-color : #dcdcdc\\\n}\\\n.ace-dawn .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid rgba(39, 95, 255, 0.30)\\\n}\\\n.ace-dawn .ace_invisible {\\\ncolor: rgba(75, 75, 126, 0.50)\\\n}\\\n.ace-dawn .ace_keyword,\\\n.ace-dawn .ace_meta {\\\ncolor: #794938\\\n}\\\n.ace-dawn .ace_constant,\\\n.ace-dawn .ace_constant.ace_character,\\\n.ace-dawn .ace_constant.ace_character.ace_escape,\\\n.ace-dawn .ace_constant.ace_other {\\\ncolor: #811F24\\\n}\\\n.ace-dawn .ace_invalid.ace_illegal {\\\ntext-decoration: underline;\\\nfont-style: italic;\\\ncolor: #F8F8F8;\\\nbackground-color: #B52A1D\\\n}\\\n.ace-dawn .ace_invalid.ace_deprecated {\\\ntext-decoration: underline;\\\nfont-style: italic;\\\ncolor: #B52A1D\\\n}\\\n.ace-dawn .ace_support {\\\ncolor: #691C97\\\n}\\\n.ace-dawn .ace_support.ace_constant {\\\ncolor: #B4371F\\\n}\\\n.ace-dawn .ace_fold {\\\nbackground-color: #794938;\\\nborder-color: #080808\\\n}\\\n.ace-dawn .ace_list,\\\n.ace-dawn .ace_markup.ace_list,\\\n.ace-dawn .ace_support.ace_function {\\\ncolor: #693A17\\\n}\\\n.ace-dawn .ace_storage {\\\nfont-style: italic;\\\ncolor: #A71D5D\\\n}\\\n.ace-dawn .ace_string {\\\ncolor: #0B6125\\\n}\\\n.ace-dawn .ace_string.ace_regexp {\\\ncolor: #CF5628\\\n}\\\n.ace-dawn .ace_comment {\\\nfont-style: italic;\\\ncolor: #5A525F\\\n}\\\n.ace-dawn .ace_heading,\\\n.ace-dawn .ace_markup.ace_heading {\\\ncolor: #19356D\\\n}\\\n.ace-dawn .ace_variable {\\\ncolor: #234A97\\\n}\\\n.ace-dawn .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLh/5+x/AAizA4hxNNsZAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-dreamweaver.js",
    "content": "ace.define(\"ace/theme/dreamweaver\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\nexports.isDark = false;\nexports.cssClass = \"ace-dreamweaver\";\nexports.cssText = \".ace-dreamweaver .ace_gutter {\\\nbackground: #e8e8e8;\\\ncolor: #333;\\\n}\\\n.ace-dreamweaver .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8;\\\n}\\\n.ace-dreamweaver {\\\nbackground-color: #FFFFFF;\\\ncolor: black;\\\n}\\\n.ace-dreamweaver .ace_fold {\\\nbackground-color: #757AD8;\\\n}\\\n.ace-dreamweaver .ace_cursor {\\\ncolor: black;\\\n}\\\n.ace-dreamweaver .ace_invisible {\\\ncolor: rgb(191, 191, 191);\\\n}\\\n.ace-dreamweaver .ace_storage,\\\n.ace-dreamweaver .ace_keyword {\\\ncolor: blue;\\\n}\\\n.ace-dreamweaver .ace_constant.ace_buildin {\\\ncolor: rgb(88, 72, 246);\\\n}\\\n.ace-dreamweaver .ace_constant.ace_language {\\\ncolor: rgb(88, 92, 246);\\\n}\\\n.ace-dreamweaver .ace_constant.ace_library {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-dreamweaver .ace_invalid {\\\nbackground-color: rgb(153, 0, 0);\\\ncolor: white;\\\n}\\\n.ace-dreamweaver .ace_support.ace_function {\\\ncolor: rgb(60, 76, 114);\\\n}\\\n.ace-dreamweaver .ace_support.ace_constant {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-dreamweaver .ace_support.ace_type,\\\n.ace-dreamweaver .ace_support.ace_class {\\\ncolor: #009;\\\n}\\\n.ace-dreamweaver .ace_support.ace_php_tag {\\\ncolor: #f00;\\\n}\\\n.ace-dreamweaver .ace_keyword.ace_operator {\\\ncolor: rgb(104, 118, 135);\\\n}\\\n.ace-dreamweaver .ace_string {\\\ncolor: #00F;\\\n}\\\n.ace-dreamweaver .ace_comment {\\\ncolor: rgb(76, 136, 107);\\\n}\\\n.ace-dreamweaver .ace_comment.ace_doc {\\\ncolor: rgb(0, 102, 255);\\\n}\\\n.ace-dreamweaver .ace_comment.ace_doc.ace_tag {\\\ncolor: rgb(128, 159, 191);\\\n}\\\n.ace-dreamweaver .ace_constant.ace_numeric {\\\ncolor: rgb(0, 0, 205);\\\n}\\\n.ace-dreamweaver .ace_variable {\\\ncolor: #06F\\\n}\\\n.ace-dreamweaver .ace_xml-pe {\\\ncolor: rgb(104, 104, 91);\\\n}\\\n.ace-dreamweaver .ace_entity.ace_name.ace_function {\\\ncolor: #00F;\\\n}\\\n.ace-dreamweaver .ace_heading {\\\ncolor: rgb(12, 7, 255);\\\n}\\\n.ace-dreamweaver .ace_list {\\\ncolor:rgb(185, 6, 144);\\\n}\\\n.ace-dreamweaver .ace_marker-layer .ace_selection {\\\nbackground: rgb(181, 213, 255);\\\n}\\\n.ace-dreamweaver .ace_marker-layer .ace_step {\\\nbackground: rgb(252, 255, 0);\\\n}\\\n.ace-dreamweaver .ace_marker-layer .ace_stack {\\\nbackground: rgb(164, 229, 101);\\\n}\\\n.ace-dreamweaver .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgb(192, 192, 192);\\\n}\\\n.ace-dreamweaver .ace_marker-layer .ace_active-line {\\\nbackground: rgba(0, 0, 0, 0.07);\\\n}\\\n.ace-dreamweaver .ace_gutter-active-line {\\\nbackground-color : #DCDCDC;\\\n}\\\n.ace-dreamweaver .ace_marker-layer .ace_selected-word {\\\nbackground: rgb(250, 250, 255);\\\nborder: 1px solid rgb(200, 200, 250);\\\n}\\\n.ace-dreamweaver .ace_meta.ace_tag {\\\ncolor:#009;\\\n}\\\n.ace-dreamweaver .ace_meta.ace_tag.ace_anchor {\\\ncolor:#060;\\\n}\\\n.ace-dreamweaver .ace_meta.ace_tag.ace_form {\\\ncolor:#F90;\\\n}\\\n.ace-dreamweaver .ace_meta.ace_tag.ace_image {\\\ncolor:#909;\\\n}\\\n.ace-dreamweaver .ace_meta.ace_tag.ace_script {\\\ncolor:#900;\\\n}\\\n.ace-dreamweaver .ace_meta.ace_tag.ace_style {\\\ncolor:#909;\\\n}\\\n.ace-dreamweaver .ace_meta.ace_tag.ace_table {\\\ncolor:#099;\\\n}\\\n.ace-dreamweaver .ace_string.ace_regex {\\\ncolor: rgb(255, 0, 0)\\\n}\\\n.ace-dreamweaver .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-eclipse.js",
    "content": "ace.define(\"ace/theme/eclipse\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nexports.isDark = false;\nexports.cssText = \".ace-eclipse .ace_gutter {\\\nbackground: #ebebeb;\\\nborder-right: 1px solid rgb(159, 159, 159);\\\ncolor: rgb(136, 136, 136);\\\n}\\\n.ace-eclipse .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #ebebeb;\\\n}\\\n.ace-eclipse {\\\nbackground-color: #FFFFFF;\\\ncolor: black;\\\n}\\\n.ace-eclipse .ace_fold {\\\nbackground-color: rgb(60, 76, 114);\\\n}\\\n.ace-eclipse .ace_cursor {\\\ncolor: black;\\\n}\\\n.ace-eclipse .ace_storage,\\\n.ace-eclipse .ace_keyword,\\\n.ace-eclipse .ace_variable {\\\ncolor: rgb(127, 0, 85);\\\n}\\\n.ace-eclipse .ace_constant.ace_buildin {\\\ncolor: rgb(88, 72, 246);\\\n}\\\n.ace-eclipse .ace_constant.ace_library {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-eclipse .ace_function {\\\ncolor: rgb(60, 76, 114);\\\n}\\\n.ace-eclipse .ace_string {\\\ncolor: rgb(42, 0, 255);\\\n}\\\n.ace-eclipse .ace_comment {\\\ncolor: rgb(113, 150, 130);\\\n}\\\n.ace-eclipse .ace_comment.ace_doc {\\\ncolor: rgb(63, 95, 191);\\\n}\\\n.ace-eclipse .ace_comment.ace_doc.ace_tag {\\\ncolor: rgb(127, 159, 191);\\\n}\\\n.ace-eclipse .ace_constant.ace_numeric {\\\ncolor: darkblue;\\\n}\\\n.ace-eclipse .ace_tag {\\\ncolor: rgb(25, 118, 116);\\\n}\\\n.ace-eclipse .ace_type {\\\ncolor: rgb(127, 0, 127);\\\n}\\\n.ace-eclipse .ace_xml-pe {\\\ncolor: rgb(104, 104, 91);\\\n}\\\n.ace-eclipse .ace_marker-layer .ace_selection {\\\nbackground: rgb(181, 213, 255);\\\n}\\\n.ace-eclipse .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgb(192, 192, 192);\\\n}\\\n.ace-eclipse .ace_meta.ace_tag {\\\ncolor:rgb(25, 118, 116);\\\n}\\\n.ace-eclipse .ace_invisible {\\\ncolor: #ddd;\\\n}\\\n.ace-eclipse .ace_entity.ace_other.ace_attribute-name {\\\ncolor:rgb(127, 0, 127);\\\n}\\\n.ace-eclipse .ace_marker-layer .ace_step {\\\nbackground: rgb(255, 255, 0);\\\n}\\\n.ace-eclipse .ace_active-line {\\\nbackground: rgb(232, 242, 254);\\\n}\\\n.ace-eclipse .ace_gutter-active-line {\\\nbackground-color : #DADADA;\\\n}\\\n.ace-eclipse .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid rgb(181, 213, 255);\\\n}\\\n.ace-eclipse .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\";\n\nexports.cssClass = \"ace-eclipse\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-github.js",
    "content": "ace.define(\"ace/theme/github\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = false;\nexports.cssClass = \"ace-github\";\nexports.cssText = \"\\\n.ace-github .ace_gutter {\\\nbackground: #e8e8e8;\\\ncolor: #AAA;\\\n}\\\n.ace-github  {\\\nbackground: #fff;\\\ncolor: #000;\\\n}\\\n.ace-github .ace_keyword {\\\nfont-weight: bold;\\\n}\\\n.ace-github .ace_string {\\\ncolor: #D14;\\\n}\\\n.ace-github .ace_variable.ace_class {\\\ncolor: teal;\\\n}\\\n.ace-github .ace_constant.ace_numeric {\\\ncolor: #099;\\\n}\\\n.ace-github .ace_constant.ace_buildin {\\\ncolor: #0086B3;\\\n}\\\n.ace-github .ace_support.ace_function {\\\ncolor: #0086B3;\\\n}\\\n.ace-github .ace_comment {\\\ncolor: #998;\\\nfont-style: italic;\\\n}\\\n.ace-github .ace_variable.ace_language  {\\\ncolor: #0086B3;\\\n}\\\n.ace-github .ace_paren {\\\nfont-weight: bold;\\\n}\\\n.ace-github .ace_boolean {\\\nfont-weight: bold;\\\n}\\\n.ace-github .ace_string.ace_regexp {\\\ncolor: #009926;\\\nfont-weight: normal;\\\n}\\\n.ace-github .ace_variable.ace_instance {\\\ncolor: teal;\\\n}\\\n.ace-github .ace_constant.ace_language {\\\nfont-weight: bold;\\\n}\\\n.ace-github .ace_cursor {\\\ncolor: black;\\\n}\\\n.ace-github .ace_marker-layer .ace_active-line {\\\nbackground: rgb(255, 255, 204);\\\n}\\\n.ace-github .ace_marker-layer .ace_selection {\\\nbackground: rgb(181, 213, 255);\\\n}\\\n.ace-github.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px white;\\\nborder-radius: 2px;\\\n}\\\n.ace-github.ace_nobold .ace_line > span {\\\nfont-weight: normal !important;\\\n}\\\n.ace-github .ace_marker-layer .ace_step {\\\nbackground: rgb(252, 255, 0);\\\n}\\\n.ace-github .ace_marker-layer .ace_stack {\\\nbackground: rgb(164, 229, 101);\\\n}\\\n.ace-github .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgb(192, 192, 192);\\\n}\\\n.ace-github .ace_gutter-active-line {\\\nbackground-color : rgba(0, 0, 0, 0.07);\\\n}\\\n.ace-github .ace_marker-layer .ace_selected-word {\\\nbackground: rgb(250, 250, 255);\\\nborder: 1px solid rgb(200, 200, 250);\\\n}\\\n.ace-github .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8;\\\n}\\\n.ace-github .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\";\n\n    var dom = require(\"../lib/dom\");\n    dom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-idle_fingers.js",
    "content": "ace.define(\"ace/theme/idle_fingers\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-idle-fingers\";\nexports.cssText = \".ace-idle-fingers .ace_gutter {\\\nbackground: #3b3b3b;\\\ncolor: rgb(153,153,153)\\\n}\\\n.ace-idle-fingers .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #3b3b3b\\\n}\\\n.ace-idle-fingers {\\\nbackground-color: #323232;\\\ncolor: #FFFFFF\\\n}\\\n.ace-idle-fingers .ace_cursor {\\\ncolor: #91FF00\\\n}\\\n.ace-idle-fingers .ace_marker-layer .ace_selection {\\\nbackground: rgba(90, 100, 126, 0.88)\\\n}\\\n.ace-idle-fingers.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #323232;\\\nborder-radius: 2px\\\n}\\\n.ace-idle-fingers .ace_marker-layer .ace_step {\\\nbackground: rgb(102, 82, 0)\\\n}\\\n.ace-idle-fingers .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid #404040\\\n}\\\n.ace-idle-fingers .ace_marker-layer .ace_active-line {\\\nbackground: #353637\\\n}\\\n.ace-idle-fingers .ace_gutter-active-line {\\\nbackground-color: #353637\\\n}\\\n.ace-idle-fingers .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid rgba(90, 100, 126, 0.88)\\\n}\\\n.ace-idle-fingers .ace_invisible {\\\ncolor: #404040\\\n}\\\n.ace-idle-fingers .ace_keyword,\\\n.ace-idle-fingers .ace_meta {\\\ncolor: #CC7833\\\n}\\\n.ace-idle-fingers .ace_constant,\\\n.ace-idle-fingers .ace_constant.ace_character,\\\n.ace-idle-fingers .ace_constant.ace_character.ace_escape,\\\n.ace-idle-fingers .ace_constant.ace_other,\\\n.ace-idle-fingers .ace_support.ace_constant {\\\ncolor: #6C99BB\\\n}\\\n.ace-idle-fingers .ace_invalid {\\\ncolor: #FFFFFF;\\\nbackground-color: #FF0000\\\n}\\\n.ace-idle-fingers .ace_fold {\\\nbackground-color: #CC7833;\\\nborder-color: #FFFFFF\\\n}\\\n.ace-idle-fingers .ace_support.ace_function {\\\ncolor: #B83426\\\n}\\\n.ace-idle-fingers .ace_variable.ace_parameter {\\\nfont-style: italic\\\n}\\\n.ace-idle-fingers .ace_string {\\\ncolor: #A5C261\\\n}\\\n.ace-idle-fingers .ace_string.ace_regexp {\\\ncolor: #CCCC33\\\n}\\\n.ace-idle-fingers .ace_comment {\\\nfont-style: italic;\\\ncolor: #BC9458\\\n}\\\n.ace-idle-fingers .ace_meta.ace_tag {\\\ncolor: #FFE5BB\\\n}\\\n.ace-idle-fingers .ace_entity.ace_name {\\\ncolor: #FFC66D\\\n}\\\n.ace-idle-fingers .ace_collab.ace_user1 {\\\ncolor: #323232;\\\nbackground-color: #FFF980\\\n}\\\n.ace-idle-fingers .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMwMjLyZYiPj/8PAAreAwAI1+g0AAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-katzenmilch.js",
    "content": "ace.define(\"ace/theme/katzenmilch\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = false;\nexports.cssClass = \"ace-katzenmilch\";\nexports.cssText = \".ace-katzenmilch .ace_gutter,\\\n.ace-katzenmilch .ace_gutter {\\\nbackground: #e8e8e8;\\\ncolor: #333\\\n}\\\n.ace-katzenmilch .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8\\\n}\\\n.ace-katzenmilch {\\\nbackground-color: #f3f2f3;\\\ncolor: rgba(15, 0, 9, 1.0)\\\n}\\\n.ace-katzenmilch .ace_cursor {\\\nborder-left: 2px solid #100011\\\n}\\\n.ace-katzenmilch .ace_overwrite-cursors .ace_cursor {\\\nborder-left: 0px;\\\nborder-bottom: 1px solid #100011\\\n}\\\n.ace-katzenmilch .ace_marker-layer .ace_selection {\\\nbackground: rgba(100, 5, 208, 0.27)\\\n}\\\n.ace-katzenmilch.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #f3f2f3;\\\nborder-radius: 2px\\\n}\\\n.ace-katzenmilch .ace_marker-layer .ace_step {\\\nbackground: rgb(198, 219, 174)\\\n}\\\n.ace-katzenmilch .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid #000000\\\n}\\\n.ace-katzenmilch .ace_marker-layer .ace_active-line {\\\nbackground: rgb(232, 242, 254)\\\n}\\\n.ace-katzenmilch .ace_gutter-active-line {\\\nbackground-color: rgb(232, 242, 254)\\\n}\\\n.ace-katzenmilch .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid rgba(100, 5, 208, 0.27)\\\n}\\\n.ace-katzenmilch .ace_fold {\\\nbackground-color: rgba(2, 95, 73, 0.97);\\\nborder-color: rgba(15, 0, 9, 1.0)\\\n}\\\n.ace-katzenmilch .ace_keyword {\\\ncolor: #674Aa8;\\\nrbackground-color: rgba(163, 170, 216, 0.055)\\\n}\\\n.ace-katzenmilch .ace_constant.ace_language {\\\ncolor: #7D7e52;\\\nrbackground-color: rgba(189, 190, 130, 0.059)\\\n}\\\n.ace-katzenmilch .ace_constant.ace_numeric {\\\ncolor: rgba(79, 130, 123, 0.93);\\\nrbackground-color: rgba(119, 194, 187, 0.059)\\\n}\\\n.ace-katzenmilch .ace_constant.ace_character,\\\n.ace-katzenmilch .ace_constant.ace_other {\\\ncolor: rgba(2, 95, 105, 1.0);\\\nrbackground-color: rgba(127, 34, 153, 0.063)\\\n}\\\n.ace-katzenmilch .ace_support.ace_function {\\\ncolor: #9D7e62;\\\nrbackground-color: rgba(189, 190, 130, 0.039)\\\n}\\\n.ace-katzenmilch .ace_support.ace_class {\\\ncolor: rgba(239, 106, 167, 1.0);\\\nrbackground-color: rgba(239, 106, 167, 0.063)\\\n}\\\n.ace-katzenmilch .ace_storage {\\\ncolor: rgba(123, 92, 191, 1.0);\\\nrbackground-color: rgba(139, 93, 223, 0.051)\\\n}\\\n.ace-katzenmilch .ace_invalid {\\\ncolor: #DFDFD5;\\\nrbackground-color: #CC1B27\\\n}\\\n.ace-katzenmilch .ace_string {\\\ncolor: #5a5f9b;\\\nrbackground-color: rgba(170, 175, 219, 0.035)\\\n}\\\n.ace-katzenmilch .ace_comment {\\\nfont-style: italic;\\\ncolor: rgba(64, 79, 80, 0.67);\\\nrbackground-color: rgba(95, 15, 255, 0.0078)\\\n}\\\n.ace-katzenmilch .ace_entity.ace_name.ace_function,\\\n.ace-katzenmilch .ace_variable {\\\ncolor: rgba(2, 95, 73, 0.97);\\\nrbackground-color: rgba(34, 255, 73, 0.12)\\\n}\\\n.ace-katzenmilch .ace_variable.ace_language {\\\ncolor: #316fcf;\\\nrbackground-color: rgba(58, 175, 255, 0.039)\\\n}\\\n.ace-katzenmilch .ace_variable.ace_parameter {\\\nfont-style: italic;\\\ncolor: rgba(51, 150, 159, 0.87);\\\nrbackground-color: rgba(5, 214, 249, 0.043)\\\n}\\\n.ace-katzenmilch .ace_entity.ace_other.ace_attribute-name {\\\ncolor: rgba(73, 70, 194, 0.93);\\\nrbackground-color: rgba(73, 134, 194, 0.035)\\\n}\\\n.ace-katzenmilch .ace_entity.ace_name.ace_tag {\\\ncolor: #3976a2;\\\nrbackground-color: rgba(73, 166, 210, 0.039)\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-kr_theme.js",
    "content": "ace.define(\"ace/theme/kr_theme\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-kr-theme\";\nexports.cssText = \".ace-kr-theme .ace_gutter {\\\nbackground: #1c1917;\\\ncolor: #FCFFE0\\\n}\\\n.ace-kr-theme .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #1c1917\\\n}\\\n.ace-kr-theme {\\\nbackground-color: #0B0A09;\\\ncolor: #FCFFE0\\\n}\\\n.ace-kr-theme .ace_cursor {\\\ncolor: #FF9900\\\n}\\\n.ace-kr-theme .ace_marker-layer .ace_selection {\\\nbackground: rgba(170, 0, 255, 0.45)\\\n}\\\n.ace-kr-theme.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #0B0A09;\\\nborder-radius: 2px\\\n}\\\n.ace-kr-theme .ace_marker-layer .ace_step {\\\nbackground: rgb(102, 82, 0)\\\n}\\\n.ace-kr-theme .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgba(255, 177, 111, 0.32)\\\n}\\\n.ace-kr-theme .ace_marker-layer .ace_active-line {\\\nbackground: #38403D\\\n}\\\n.ace-kr-theme .ace_gutter-active-line {\\\nbackground-color : #38403D\\\n}\\\n.ace-kr-theme .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid rgba(170, 0, 255, 0.45)\\\n}\\\n.ace-kr-theme .ace_invisible {\\\ncolor: rgba(255, 177, 111, 0.32)\\\n}\\\n.ace-kr-theme .ace_keyword,\\\n.ace-kr-theme .ace_meta {\\\ncolor: #949C8B\\\n}\\\n.ace-kr-theme .ace_constant,\\\n.ace-kr-theme .ace_constant.ace_character,\\\n.ace-kr-theme .ace_constant.ace_character.ace_escape,\\\n.ace-kr-theme .ace_constant.ace_other {\\\ncolor: rgba(210, 117, 24, 0.76)\\\n}\\\n.ace-kr-theme .ace_invalid {\\\ncolor: #F8F8F8;\\\nbackground-color: #A41300\\\n}\\\n.ace-kr-theme .ace_support {\\\ncolor: #9FC28A\\\n}\\\n.ace-kr-theme .ace_support.ace_constant {\\\ncolor: #C27E66\\\n}\\\n.ace-kr-theme .ace_fold {\\\nbackground-color: #949C8B;\\\nborder-color: #FCFFE0\\\n}\\\n.ace-kr-theme .ace_support.ace_function {\\\ncolor: #85873A\\\n}\\\n.ace-kr-theme .ace_storage {\\\ncolor: #FFEE80\\\n}\\\n.ace-kr-theme .ace_string {\\\ncolor: rgba(164, 161, 181, 0.8)\\\n}\\\n.ace-kr-theme .ace_string.ace_regexp {\\\ncolor: rgba(125, 255, 192, 0.65)\\\n}\\\n.ace-kr-theme .ace_comment {\\\nfont-style: italic;\\\ncolor: #706D5B\\\n}\\\n.ace-kr-theme .ace_variable {\\\ncolor: #D1A796\\\n}\\\n.ace-kr-theme .ace_list,\\\n.ace-kr-theme .ace_markup.ace_list {\\\nbackground-color: #0F0040\\\n}\\\n.ace-kr-theme .ace_variable.ace_language {\\\ncolor: #FF80E1\\\n}\\\n.ace-kr-theme .ace_meta.ace_tag {\\\ncolor: #BABD9C\\\n}\\\n.ace-kr-theme .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-kuroir.js",
    "content": "ace.define(\"ace/theme/kuroir\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = false;\nexports.cssClass = \"ace-kuroir\";\nexports.cssText = \"\\\n.ace-kuroir .ace_gutter {\\\nbackground: #e8e8e8;\\\ncolor: #333;\\\n}\\\n.ace-kuroir .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8;\\\n}\\\n.ace-kuroir {\\\nbackground-color: #E8E9E8;\\\ncolor: #363636;\\\n}\\\n.ace-kuroir .ace_cursor {\\\ncolor: #202020;\\\n}\\\n.ace-kuroir .ace_marker-layer .ace_selection {\\\nbackground: rgba(245, 170, 0, 0.57);\\\n}\\\n.ace-kuroir.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #E8E9E8;\\\nborder-radius: 2px;\\\n}\\\n.ace-kuroir .ace_marker-layer .ace_step {\\\nbackground: rgb(198, 219, 174);\\\n}\\\n.ace-kuroir .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgba(0, 0, 0, 0.29);\\\n}\\\n.ace-kuroir .ace_marker-layer .ace_active-line {\\\nbackground: rgba(203, 220, 47, 0.22);\\\n}\\\n.ace-kuroir .ace_gutter-active-line {\\\nbackground-color: rgba(203, 220, 47, 0.22);\\\n}\\\n.ace-kuroir .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid rgba(245, 170, 0, 0.57);\\\n}\\\n.ace-kuroir .ace_fold {\\\nborder-color: #363636;\\\n}\\\n.ace-kuroir .ace_constant{color:#CD6839;}.ace-kuroir .ace_constant.ace_numeric{color:#9A5925;}.ace-kuroir .ace_support{color:#104E8B;}.ace-kuroir .ace_support.ace_function{color:#005273;}.ace-kuroir .ace_support.ace_constant{color:#CF6A4C;}.ace-kuroir .ace_storage{color:#A52A2A;}.ace-kuroir .ace_invalid.ace_illegal{color:#FD1224;\\\nbackground-color:rgba(255, 6, 0, 0.15);}.ace-kuroir .ace_invalid.ace_deprecated{text-decoration:underline;\\\nfont-style:italic;\\\ncolor:#FD1732;\\\nbackground-color:#E8E9E8;}.ace-kuroir .ace_string{color:#639300;}.ace-kuroir .ace_string.ace_regexp{color:#417E00;\\\nbackground-color:#C9D4BE;}.ace-kuroir .ace_comment{color:rgba(148, 148, 148, 0.91);\\\nbackground-color:rgba(220, 220, 220, 0.56);}.ace-kuroir .ace_variable{color:#009ACD;}.ace-kuroir .ace_meta.ace_tag{color:#005273;}.ace-kuroir .ace_markup.ace_heading{color:#B8012D;\\\nbackground-color:rgba(191, 97, 51, 0.051);}.ace-kuroir .ace_markup.ace_list{color:#8F5B26;}\\\n\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-merbivore.js",
    "content": "ace.define(\"ace/theme/merbivore\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-merbivore\";\nexports.cssText = \".ace-merbivore .ace_gutter {\\\nbackground: #202020;\\\ncolor: #E6E1DC\\\n}\\\n.ace-merbivore .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #555651\\\n}\\\n.ace-merbivore {\\\nbackground-color: #161616;\\\ncolor: #E6E1DC\\\n}\\\n.ace-merbivore .ace_cursor {\\\ncolor: #FFFFFF\\\n}\\\n.ace-merbivore .ace_marker-layer .ace_selection {\\\nbackground: #454545\\\n}\\\n.ace-merbivore.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #161616;\\\nborder-radius: 2px\\\n}\\\n.ace-merbivore .ace_marker-layer .ace_step {\\\nbackground: rgb(102, 82, 0)\\\n}\\\n.ace-merbivore .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid #404040\\\n}\\\n.ace-merbivore .ace_marker-layer .ace_active-line {\\\nbackground: #333435\\\n}\\\n.ace-merbivore .ace_gutter-active-line {\\\nbackground-color: #333435\\\n}\\\n.ace-merbivore .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid #454545\\\n}\\\n.ace-merbivore .ace_invisible {\\\ncolor: #404040\\\n}\\\n.ace-merbivore .ace_entity.ace_name.ace_tag,\\\n.ace-merbivore .ace_keyword,\\\n.ace-merbivore .ace_meta,\\\n.ace-merbivore .ace_meta.ace_tag,\\\n.ace-merbivore .ace_storage,\\\n.ace-merbivore .ace_support.ace_function {\\\ncolor: #FC6F09\\\n}\\\n.ace-merbivore .ace_constant,\\\n.ace-merbivore .ace_constant.ace_character,\\\n.ace-merbivore .ace_constant.ace_character.ace_escape,\\\n.ace-merbivore .ace_constant.ace_other,\\\n.ace-merbivore .ace_support.ace_type {\\\ncolor: #1EDAFB\\\n}\\\n.ace-merbivore .ace_constant.ace_character.ace_escape {\\\ncolor: #519F50\\\n}\\\n.ace-merbivore .ace_constant.ace_language {\\\ncolor: #FDC251\\\n}\\\n.ace-merbivore .ace_constant.ace_library,\\\n.ace-merbivore .ace_string,\\\n.ace-merbivore .ace_support.ace_constant {\\\ncolor: #8DFF0A\\\n}\\\n.ace-merbivore .ace_constant.ace_numeric {\\\ncolor: #58C554\\\n}\\\n.ace-merbivore .ace_invalid {\\\ncolor: #FFFFFF;\\\nbackground-color: #990000\\\n}\\\n.ace-merbivore .ace_fold {\\\nbackground-color: #FC6F09;\\\nborder-color: #E6E1DC\\\n}\\\n.ace-merbivore .ace_comment {\\\nfont-style: italic;\\\ncolor: #AD2EA4\\\n}\\\n.ace-merbivore .ace_entity.ace_other.ace_attribute-name {\\\ncolor: #FFFF89\\\n}\\\n.ace-merbivore .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQFxf3ZXB1df0PAAdsAmERTkEHAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-merbivore_soft.js",
    "content": "ace.define(\"ace/theme/merbivore_soft\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-merbivore-soft\";\nexports.cssText = \".ace-merbivore-soft .ace_gutter {\\\nbackground: #262424;\\\ncolor: #E6E1DC\\\n}\\\n.ace-merbivore-soft .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #262424\\\n}\\\n.ace-merbivore-soft {\\\nbackground-color: #1C1C1C;\\\ncolor: #E6E1DC\\\n}\\\n.ace-merbivore-soft .ace_cursor {\\\ncolor: #FFFFFF\\\n}\\\n.ace-merbivore-soft .ace_marker-layer .ace_selection {\\\nbackground: #494949\\\n}\\\n.ace-merbivore-soft.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #1C1C1C;\\\nborder-radius: 2px\\\n}\\\n.ace-merbivore-soft .ace_marker-layer .ace_step {\\\nbackground: rgb(102, 82, 0)\\\n}\\\n.ace-merbivore-soft .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid #404040\\\n}\\\n.ace-merbivore-soft .ace_marker-layer .ace_active-line {\\\nbackground: #333435\\\n}\\\n.ace-merbivore-soft .ace_gutter-active-line {\\\nbackground-color: #333435\\\n}\\\n.ace-merbivore-soft .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid #494949\\\n}\\\n.ace-merbivore-soft .ace_invisible {\\\ncolor: #404040\\\n}\\\n.ace-merbivore-soft .ace_entity.ace_name.ace_tag,\\\n.ace-merbivore-soft .ace_keyword,\\\n.ace-merbivore-soft .ace_meta,\\\n.ace-merbivore-soft .ace_meta.ace_tag,\\\n.ace-merbivore-soft .ace_storage {\\\ncolor: #FC803A\\\n}\\\n.ace-merbivore-soft .ace_constant,\\\n.ace-merbivore-soft .ace_constant.ace_character,\\\n.ace-merbivore-soft .ace_constant.ace_character.ace_escape,\\\n.ace-merbivore-soft .ace_constant.ace_other,\\\n.ace-merbivore-soft .ace_support.ace_type {\\\ncolor: #68C1D8\\\n}\\\n.ace-merbivore-soft .ace_constant.ace_character.ace_escape {\\\ncolor: #B3E5B4\\\n}\\\n.ace-merbivore-soft .ace_constant.ace_language {\\\ncolor: #E1C582\\\n}\\\n.ace-merbivore-soft .ace_constant.ace_library,\\\n.ace-merbivore-soft .ace_string,\\\n.ace-merbivore-soft .ace_support.ace_constant {\\\ncolor: #8EC65F\\\n}\\\n.ace-merbivore-soft .ace_constant.ace_numeric {\\\ncolor: #7FC578\\\n}\\\n.ace-merbivore-soft .ace_invalid,\\\n.ace-merbivore-soft .ace_invalid.ace_deprecated {\\\ncolor: #FFFFFF;\\\nbackground-color: #FE3838\\\n}\\\n.ace-merbivore-soft .ace_fold {\\\nbackground-color: #FC803A;\\\nborder-color: #E6E1DC\\\n}\\\n.ace-merbivore-soft .ace_comment,\\\n.ace-merbivore-soft .ace_meta {\\\nfont-style: italic;\\\ncolor: #AC4BB8\\\n}\\\n.ace-merbivore-soft .ace_entity.ace_other.ace_attribute-name {\\\ncolor: #EAF1A3\\\n}\\\n.ace-merbivore-soft .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWOQkpLyZfD09PwPAAfYAnaStpHRAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-mono_industrial.js",
    "content": "ace.define(\"ace/theme/mono_industrial\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-mono-industrial\";\nexports.cssText = \".ace-mono-industrial .ace_gutter {\\\nbackground: #1d2521;\\\ncolor: #C5C9C9\\\n}\\\n.ace-mono-industrial .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #555651\\\n}\\\n.ace-mono-industrial {\\\nbackground-color: #222C28;\\\ncolor: #FFFFFF\\\n}\\\n.ace-mono-industrial .ace_cursor {\\\ncolor: #FFFFFF\\\n}\\\n.ace-mono-industrial .ace_marker-layer .ace_selection {\\\nbackground: rgba(145, 153, 148, 0.40)\\\n}\\\n.ace-mono-industrial.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #222C28;\\\nborder-radius: 2px\\\n}\\\n.ace-mono-industrial .ace_marker-layer .ace_step {\\\nbackground: rgb(102, 82, 0)\\\n}\\\n.ace-mono-industrial .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgba(102, 108, 104, 0.50)\\\n}\\\n.ace-mono-industrial .ace_marker-layer .ace_active-line {\\\nbackground: rgba(12, 13, 12, 0.25)\\\n}\\\n.ace-mono-industrial .ace_gutter-active-line {\\\nbackground-color: rgba(12, 13, 12, 0.25)\\\n}\\\n.ace-mono-industrial .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid rgba(145, 153, 148, 0.40)\\\n}\\\n.ace-mono-industrial .ace_invisible {\\\ncolor: rgba(102, 108, 104, 0.50)\\\n}\\\n.ace-mono-industrial .ace_string {\\\nbackground-color: #151C19;\\\ncolor: #FFFFFF\\\n}\\\n.ace-mono-industrial .ace_keyword,\\\n.ace-mono-industrial .ace_meta {\\\ncolor: #A39E64\\\n}\\\n.ace-mono-industrial .ace_constant,\\\n.ace-mono-industrial .ace_constant.ace_character,\\\n.ace-mono-industrial .ace_constant.ace_character.ace_escape,\\\n.ace-mono-industrial .ace_constant.ace_numeric,\\\n.ace-mono-industrial .ace_constant.ace_other {\\\ncolor: #E98800\\\n}\\\n.ace-mono-industrial .ace_entity.ace_name.ace_function,\\\n.ace-mono-industrial .ace_keyword.ace_operator,\\\n.ace-mono-industrial .ace_variable {\\\ncolor: #A8B3AB\\\n}\\\n.ace-mono-industrial .ace_invalid {\\\ncolor: #FFFFFF;\\\nbackground-color: rgba(153, 0, 0, 0.68)\\\n}\\\n.ace-mono-industrial .ace_support.ace_constant {\\\ncolor: #C87500\\\n}\\\n.ace-mono-industrial .ace_fold {\\\nbackground-color: #A8B3AB;\\\nborder-color: #FFFFFF\\\n}\\\n.ace-mono-industrial .ace_support.ace_function {\\\ncolor: #588E60\\\n}\\\n.ace-mono-industrial .ace_entity.ace_name,\\\n.ace-mono-industrial .ace_support.ace_class,\\\n.ace-mono-industrial .ace_support.ace_type {\\\ncolor: #5778B6\\\n}\\\n.ace-mono-industrial .ace_storage {\\\ncolor: #C23B00\\\n}\\\n.ace-mono-industrial .ace_variable.ace_language,\\\n.ace-mono-industrial .ace_variable.ace_parameter {\\\ncolor: #648BD2\\\n}\\\n.ace-mono-industrial .ace_comment {\\\ncolor: #666C68;\\\nbackground-color: #151C19\\\n}\\\n.ace-mono-industrial .ace_entity.ace_other.ace_attribute-name {\\\ncolor: #909993\\\n}\\\n.ace-mono-industrial .ace_entity.ace_name.ace_tag {\\\ncolor: #A65EFF\\\n}\\\n.ace-mono-industrial .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQ1NbwZfALD/4PAAlTArlEC4r/AAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-monokai.js",
    "content": "ace.define(\"ace/theme/monokai\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-monokai\";\nexports.cssText = \".ace-monokai .ace_gutter {\\\nbackground: #2F3129;\\\ncolor: #8F908A\\\n}\\\n.ace-monokai .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #555651\\\n}\\\n.ace-monokai {\\\nbackground-color: #272822;\\\ncolor: #F8F8F2\\\n}\\\n.ace-monokai .ace_cursor {\\\ncolor: #F8F8F0\\\n}\\\n.ace-monokai .ace_marker-layer .ace_selection {\\\nbackground: #49483E\\\n}\\\n.ace-monokai.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #272822;\\\nborder-radius: 2px\\\n}\\\n.ace-monokai .ace_marker-layer .ace_step {\\\nbackground: rgb(102, 82, 0)\\\n}\\\n.ace-monokai .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid #49483E\\\n}\\\n.ace-monokai .ace_marker-layer .ace_active-line {\\\nbackground: #202020\\\n}\\\n.ace-monokai .ace_gutter-active-line {\\\nbackground-color: #272727\\\n}\\\n.ace-monokai .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid #49483E\\\n}\\\n.ace-monokai .ace_invisible {\\\ncolor: #52524d\\\n}\\\n.ace-monokai .ace_entity.ace_name.ace_tag,\\\n.ace-monokai .ace_keyword,\\\n.ace-monokai .ace_meta.ace_tag,\\\n.ace-monokai .ace_storage {\\\ncolor: #F92672\\\n}\\\n.ace-monokai .ace_punctuation,\\\n.ace-monokai .ace_punctuation.ace_tag {\\\ncolor: #fff\\\n}\\\n.ace-monokai .ace_constant.ace_character,\\\n.ace-monokai .ace_constant.ace_language,\\\n.ace-monokai .ace_constant.ace_numeric,\\\n.ace-monokai .ace_constant.ace_other {\\\ncolor: #AE81FF\\\n}\\\n.ace-monokai .ace_invalid {\\\ncolor: #F8F8F0;\\\nbackground-color: #F92672\\\n}\\\n.ace-monokai .ace_invalid.ace_deprecated {\\\ncolor: #F8F8F0;\\\nbackground-color: #AE81FF\\\n}\\\n.ace-monokai .ace_support.ace_constant,\\\n.ace-monokai .ace_support.ace_function {\\\ncolor: #66D9EF\\\n}\\\n.ace-monokai .ace_fold {\\\nbackground-color: #A6E22E;\\\nborder-color: #F8F8F2\\\n}\\\n.ace-monokai .ace_storage.ace_type,\\\n.ace-monokai .ace_support.ace_class,\\\n.ace-monokai .ace_support.ace_type {\\\nfont-style: italic;\\\ncolor: #66D9EF\\\n}\\\n.ace-monokai .ace_entity.ace_name.ace_function,\\\n.ace-monokai .ace_entity.ace_other,\\\n.ace-monokai .ace_entity.ace_other.ace_attribute-name,\\\n.ace-monokai .ace_variable {\\\ncolor: #A6E22E\\\n}\\\n.ace-monokai .ace_variable.ace_parameter {\\\nfont-style: italic;\\\ncolor: #FD971F\\\n}\\\n.ace-monokai .ace_string {\\\ncolor: #E6DB74\\\n}\\\n.ace-monokai .ace_comment {\\\ncolor: #75715E\\\n}\\\n.ace-monokai .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-pastel_on_dark.js",
    "content": "ace.define(\"ace/theme/pastel_on_dark\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-pastel-on-dark\";\nexports.cssText = \".ace-pastel-on-dark .ace_gutter {\\\nbackground: #353030;\\\ncolor: #8F938F\\\n}\\\n.ace-pastel-on-dark .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #353030\\\n}\\\n.ace-pastel-on-dark {\\\nbackground-color: #2C2828;\\\ncolor: #8F938F\\\n}\\\n.ace-pastel-on-dark .ace_cursor {\\\ncolor: #A7A7A7\\\n}\\\n.ace-pastel-on-dark .ace_marker-layer .ace_selection {\\\nbackground: rgba(221, 240, 255, 0.20)\\\n}\\\n.ace-pastel-on-dark.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #2C2828;\\\nborder-radius: 2px\\\n}\\\n.ace-pastel-on-dark .ace_marker-layer .ace_step {\\\nbackground: rgb(102, 82, 0)\\\n}\\\n.ace-pastel-on-dark .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgba(255, 255, 255, 0.25)\\\n}\\\n.ace-pastel-on-dark .ace_marker-layer .ace_active-line {\\\nbackground: rgba(255, 255, 255, 0.031)\\\n}\\\n.ace-pastel-on-dark .ace_gutter-active-line {\\\nbackground-color: rgba(255, 255, 255, 0.031)\\\n}\\\n.ace-pastel-on-dark .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid rgba(221, 240, 255, 0.20)\\\n}\\\n.ace-pastel-on-dark .ace_invisible {\\\ncolor: rgba(255, 255, 255, 0.25)\\\n}\\\n.ace-pastel-on-dark .ace_keyword,\\\n.ace-pastel-on-dark .ace_meta {\\\ncolor: #757aD8\\\n}\\\n.ace-pastel-on-dark .ace_constant,\\\n.ace-pastel-on-dark .ace_constant.ace_character,\\\n.ace-pastel-on-dark .ace_constant.ace_character.ace_escape,\\\n.ace-pastel-on-dark .ace_constant.ace_other {\\\ncolor: #4FB7C5\\\n}\\\n.ace-pastel-on-dark .ace_keyword.ace_operator {\\\ncolor: #797878\\\n}\\\n.ace-pastel-on-dark .ace_constant.ace_character {\\\ncolor: #AFA472\\\n}\\\n.ace-pastel-on-dark .ace_constant.ace_language {\\\ncolor: #DE8E30\\\n}\\\n.ace-pastel-on-dark .ace_constant.ace_numeric {\\\ncolor: #CCCCCC\\\n}\\\n.ace-pastel-on-dark .ace_invalid,\\\n.ace-pastel-on-dark .ace_invalid.ace_illegal {\\\ncolor: #F8F8F8;\\\nbackground-color: rgba(86, 45, 86, 0.75)\\\n}\\\n.ace-pastel-on-dark .ace_invalid.ace_deprecated {\\\ntext-decoration: underline;\\\nfont-style: italic;\\\ncolor: #D2A8A1\\\n}\\\n.ace-pastel-on-dark .ace_fold {\\\nbackground-color: #757aD8;\\\nborder-color: #8F938F\\\n}\\\n.ace-pastel-on-dark .ace_support.ace_function {\\\ncolor: #AEB2F8\\\n}\\\n.ace-pastel-on-dark .ace_string {\\\ncolor: #66A968\\\n}\\\n.ace-pastel-on-dark .ace_string.ace_regexp {\\\ncolor: #E9C062\\\n}\\\n.ace-pastel-on-dark .ace_comment {\\\ncolor: #A6C6FF\\\n}\\\n.ace-pastel-on-dark .ace_variable {\\\ncolor: #BEBF55\\\n}\\\n.ace-pastel-on-dark .ace_variable.ace_language {\\\ncolor: #C1C144\\\n}\\\n.ace-pastel-on-dark .ace_xml-pe {\\\ncolor: #494949\\\n}\\\n.ace-pastel-on-dark .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYIiPj/8PAARgAh2NTMh8AAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-solarized_dark.js",
    "content": "ace.define(\"ace/theme/solarized_dark\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-solarized-dark\";\nexports.cssText = \".ace-solarized-dark .ace_gutter {\\\nbackground: #01313f;\\\ncolor: #d0edf7\\\n}\\\n.ace-solarized-dark .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #33555E\\\n}\\\n.ace-solarized-dark {\\\nbackground-color: #002B36;\\\ncolor: #93A1A1\\\n}\\\n.ace-solarized-dark .ace_entity.ace_other.ace_attribute-name,\\\n.ace-solarized-dark .ace_storage {\\\ncolor: #93A1A1\\\n}\\\n.ace-solarized-dark .ace_cursor,\\\n.ace-solarized-dark .ace_string.ace_regexp {\\\ncolor: #D30102\\\n}\\\n.ace-solarized-dark .ace_marker-layer .ace_active-line,\\\n.ace-solarized-dark .ace_marker-layer .ace_selection {\\\nbackground: rgba(255, 255, 255, 0.1)\\\n}\\\n.ace-solarized-dark.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #002B36;\\\nborder-radius: 2px\\\n}\\\n.ace-solarized-dark .ace_marker-layer .ace_step {\\\nbackground: rgb(102, 82, 0)\\\n}\\\n.ace-solarized-dark .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgba(147, 161, 161, 0.50)\\\n}\\\n.ace-solarized-dark .ace_gutter-active-line {\\\nbackground-color: #0d3440\\\n}\\\n.ace-solarized-dark .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid #073642\\\n}\\\n.ace-solarized-dark .ace_invisible {\\\ncolor: rgba(147, 161, 161, 0.50)\\\n}\\\n.ace-solarized-dark .ace_keyword,\\\n.ace-solarized-dark .ace_meta,\\\n.ace-solarized-dark .ace_support.ace_class,\\\n.ace-solarized-dark .ace_support.ace_type {\\\ncolor: #859900\\\n}\\\n.ace-solarized-dark .ace_constant.ace_character,\\\n.ace-solarized-dark .ace_constant.ace_other {\\\ncolor: #CB4B16\\\n}\\\n.ace-solarized-dark .ace_constant.ace_language {\\\ncolor: #B58900\\\n}\\\n.ace-solarized-dark .ace_constant.ace_numeric {\\\ncolor: #D33682\\\n}\\\n.ace-solarized-dark .ace_fold {\\\nbackground-color: #268BD2;\\\nborder-color: #93A1A1\\\n}\\\n.ace-solarized-dark .ace_entity.ace_name.ace_function,\\\n.ace-solarized-dark .ace_entity.ace_name.ace_tag,\\\n.ace-solarized-dark .ace_support.ace_function,\\\n.ace-solarized-dark .ace_variable,\\\n.ace-solarized-dark .ace_variable.ace_language {\\\ncolor: #268BD2\\\n}\\\n.ace-solarized-dark .ace_string {\\\ncolor: #2AA198\\\n}\\\n.ace-solarized-dark .ace_comment {\\\nfont-style: italic;\\\ncolor: #657B83\\\n}\\\n.ace-solarized-dark .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNg0Db1ZVCxc/sPAAd4AlUHlLenAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-solarized_light.js",
    "content": "ace.define(\"ace/theme/solarized_light\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = false;\nexports.cssClass = \"ace-solarized-light\";\nexports.cssText = \".ace-solarized-light .ace_gutter {\\\nbackground: #fbf1d3;\\\ncolor: #333\\\n}\\\n.ace-solarized-light .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8\\\n}\\\n.ace-solarized-light {\\\nbackground-color: #FDF6E3;\\\ncolor: #586E75\\\n}\\\n.ace-solarized-light .ace_cursor {\\\ncolor: #000000\\\n}\\\n.ace-solarized-light .ace_marker-layer .ace_selection {\\\nbackground: rgba(7, 54, 67, 0.09)\\\n}\\\n.ace-solarized-light.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #FDF6E3;\\\nborder-radius: 2px\\\n}\\\n.ace-solarized-light .ace_marker-layer .ace_step {\\\nbackground: rgb(255, 255, 0)\\\n}\\\n.ace-solarized-light .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgba(147, 161, 161, 0.50)\\\n}\\\n.ace-solarized-light .ace_marker-layer .ace_active-line {\\\nbackground: #EEE8D5\\\n}\\\n.ace-solarized-light .ace_gutter-active-line {\\\nbackground-color : #EDE5C1\\\n}\\\n.ace-solarized-light .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid #073642\\\n}\\\n.ace-solarized-light .ace_invisible {\\\ncolor: rgba(147, 161, 161, 0.50)\\\n}\\\n.ace-solarized-light .ace_keyword,\\\n.ace-solarized-light .ace_meta,\\\n.ace-solarized-light .ace_support.ace_class,\\\n.ace-solarized-light .ace_support.ace_type {\\\ncolor: #859900\\\n}\\\n.ace-solarized-light .ace_constant.ace_character,\\\n.ace-solarized-light .ace_constant.ace_other {\\\ncolor: #CB4B16\\\n}\\\n.ace-solarized-light .ace_constant.ace_language {\\\ncolor: #B58900\\\n}\\\n.ace-solarized-light .ace_constant.ace_numeric {\\\ncolor: #D33682\\\n}\\\n.ace-solarized-light .ace_fold {\\\nbackground-color: #268BD2;\\\nborder-color: #586E75\\\n}\\\n.ace-solarized-light .ace_entity.ace_name.ace_function,\\\n.ace-solarized-light .ace_entity.ace_name.ace_tag,\\\n.ace-solarized-light .ace_support.ace_function,\\\n.ace-solarized-light .ace_variable,\\\n.ace-solarized-light .ace_variable.ace_language {\\\ncolor: #268BD2\\\n}\\\n.ace-solarized-light .ace_storage {\\\ncolor: #073642\\\n}\\\n.ace-solarized-light .ace_string {\\\ncolor: #2AA198\\\n}\\\n.ace-solarized-light .ace_string.ace_regexp {\\\ncolor: #D30102\\\n}\\\n.ace-solarized-light .ace_comment,\\\n.ace-solarized-light .ace_entity.ace_other.ace_attribute-name {\\\ncolor: #93A1A1\\\n}\\\n.ace-solarized-light .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHjy8NJ/AAjgA5fzQUmBAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-terminal.js",
    "content": "ace.define(\"ace/theme/terminal\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-terminal-theme\";\nexports.cssText = \".ace-terminal-theme .ace_gutter {\\\nbackground: #1a0005;\\\ncolor: steelblue\\\n}\\\n.ace-terminal-theme .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #1a1a1a\\\n}\\\n.ace-terminal-theme {\\\nbackground-color: black;\\\ncolor: #DEDEDE\\\n}\\\n.ace-terminal-theme .ace_cursor {\\\ncolor: #9F9F9F\\\n}\\\n.ace-terminal-theme .ace_marker-layer .ace_selection {\\\nbackground: #424242\\\n}\\\n.ace-terminal-theme.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px black;\\\nborder-radius: 2px\\\n}\\\n.ace-terminal-theme .ace_marker-layer .ace_step {\\\nbackground: rgb(0, 0, 0)\\\n}\\\n.ace-terminal-theme .ace_marker-layer .ace_bracket {\\\nbackground: #090;\\\n}\\\n.ace-terminal-theme .ace_marker-layer .ace_bracket-start {\\\nbackground: #090;\\\n}\\\n.ace-terminal-theme .ace_marker-layer .ace_bracket-unmatched {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid #900\\\n}\\\n.ace-terminal-theme .ace_marker-layer .ace_active-line {\\\nbackground: #2A2A2A\\\n}\\\n.ace-terminal-theme .ace_gutter-active-line {\\\nbackground-color: #2A112A\\\n}\\\n.ace-terminal-theme .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid #424242\\\n}\\\n.ace-terminal-theme .ace_invisible {\\\ncolor: #343434\\\n}\\\n.ace-terminal-theme .ace_keyword,\\\n.ace-terminal-theme .ace_meta,\\\n.ace-terminal-theme .ace_storage,\\\n.ace-terminal-theme .ace_storage.ace_type,\\\n.ace-terminal-theme .ace_support.ace_type {\\\ncolor: tomato\\\n}\\\n.ace-terminal-theme .ace_keyword.ace_operator {\\\ncolor: deeppink\\\n}\\\n.ace-terminal-theme .ace_constant.ace_character,\\\n.ace-terminal-theme .ace_constant.ace_language,\\\n.ace-terminal-theme .ace_constant.ace_numeric,\\\n.ace-terminal-theme .ace_keyword.ace_other.ace_unit,\\\n.ace-terminal-theme .ace_support.ace_constant,\\\n.ace-terminal-theme .ace_variable.ace_parameter {\\\ncolor: #E78C45\\\n}\\\n.ace-terminal-theme .ace_constant.ace_other {\\\ncolor: gold\\\n}\\\n.ace-terminal-theme .ace_invalid {\\\ncolor: yellow;\\\nbackground-color: red\\\n}\\\n.ace-terminal-theme .ace_invalid.ace_deprecated {\\\ncolor: #CED2CF;\\\nbackground-color: #B798BF\\\n}\\\n.ace-terminal-theme .ace_fold {\\\nbackground-color: #7AA6DA;\\\nborder-color: #DEDEDE\\\n}\\\n.ace-terminal-theme .ace_entity.ace_name.ace_function,\\\n.ace-terminal-theme .ace_support.ace_function,\\\n.ace-terminal-theme .ace_variable {\\\ncolor: #7AA6DA\\\n}\\\n.ace-terminal-theme .ace_support.ace_class,\\\n.ace-terminal-theme .ace_support.ace_type {\\\ncolor: #E7C547\\\n}\\\n.ace-terminal-theme .ace_heading,\\\n.ace-terminal-theme .ace_string {\\\ncolor: #B9CA4A\\\n}\\\n.ace-terminal-theme .ace_entity.ace_name.ace_tag,\\\n.ace-terminal-theme .ace_entity.ace_other.ace_attribute-name,\\\n.ace-terminal-theme .ace_meta.ace_tag,\\\n.ace-terminal-theme .ace_string.ace_regexp,\\\n.ace-terminal-theme .ace_variable {\\\ncolor: #D54E53\\\n}\\\n.ace-terminal-theme .ace_comment {\\\ncolor: orangered\\\n}\\\n.ace-terminal-theme .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLBWV/8PAAK4AYnhiq+xAAAAAElFTkSuQmCC) right repeat-y;\\\n}\\\n\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-textmate.js",
    "content": "ace.define(\"ace/theme/textmate\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\"use strict\";\n\nexports.isDark = false;\nexports.cssClass = \"ace-tm\";\nexports.cssText = \".ace-tm .ace_gutter {\\\nbackground: #f0f0f0;\\\ncolor: #333;\\\n}\\\n.ace-tm .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8;\\\n}\\\n.ace-tm .ace_fold {\\\nbackground-color: #6B72E6;\\\n}\\\n.ace-tm {\\\nbackground-color: #FFFFFF;\\\ncolor: black;\\\n}\\\n.ace-tm .ace_cursor {\\\ncolor: black;\\\n}\\\n.ace-tm .ace_invisible {\\\ncolor: rgb(191, 191, 191);\\\n}\\\n.ace-tm .ace_storage,\\\n.ace-tm .ace_keyword {\\\ncolor: blue;\\\n}\\\n.ace-tm .ace_constant {\\\ncolor: rgb(197, 6, 11);\\\n}\\\n.ace-tm .ace_constant.ace_buildin {\\\ncolor: rgb(88, 72, 246);\\\n}\\\n.ace-tm .ace_constant.ace_language {\\\ncolor: rgb(88, 92, 246);\\\n}\\\n.ace-tm .ace_constant.ace_library {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_invalid {\\\nbackground-color: rgba(255, 0, 0, 0.1);\\\ncolor: red;\\\n}\\\n.ace-tm .ace_support.ace_function {\\\ncolor: rgb(60, 76, 114);\\\n}\\\n.ace-tm .ace_support.ace_constant {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-tm .ace_support.ace_type,\\\n.ace-tm .ace_support.ace_class {\\\ncolor: rgb(109, 121, 222);\\\n}\\\n.ace-tm .ace_keyword.ace_operator {\\\ncolor: rgb(104, 118, 135);\\\n}\\\n.ace-tm .ace_string {\\\ncolor: rgb(3, 106, 7);\\\n}\\\n.ace-tm .ace_comment {\\\ncolor: rgb(76, 136, 107);\\\n}\\\n.ace-tm .ace_comment.ace_doc {\\\ncolor: rgb(0, 102, 255);\\\n}\\\n.ace-tm .ace_comment.ace_doc.ace_tag {\\\ncolor: rgb(128, 159, 191);\\\n}\\\n.ace-tm .ace_constant.ace_numeric {\\\ncolor: rgb(0, 0, 205);\\\n}\\\n.ace-tm .ace_variable {\\\ncolor: rgb(49, 132, 149);\\\n}\\\n.ace-tm .ace_xml-pe {\\\ncolor: rgb(104, 104, 91);\\\n}\\\n.ace-tm .ace_entity.ace_name.ace_function {\\\ncolor: #0000A2;\\\n}\\\n.ace-tm .ace_heading {\\\ncolor: rgb(12, 7, 255);\\\n}\\\n.ace-tm .ace_list {\\\ncolor:rgb(185, 6, 144);\\\n}\\\n.ace-tm .ace_meta.ace_tag {\\\ncolor:rgb(0, 22, 142);\\\n}\\\n.ace-tm .ace_string.ace_regex {\\\ncolor: rgb(255, 0, 0)\\\n}\\\n.ace-tm .ace_marker-layer .ace_selection {\\\nbackground: rgb(181, 213, 255);\\\n}\\\n.ace-tm.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px white;\\\nborder-radius: 2px;\\\n}\\\n.ace-tm .ace_marker-layer .ace_step {\\\nbackground: rgb(252, 255, 0);\\\n}\\\n.ace-tm .ace_marker-layer .ace_stack {\\\nbackground: rgb(164, 229, 101);\\\n}\\\n.ace-tm .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgb(192, 192, 192);\\\n}\\\n.ace-tm .ace_marker-layer .ace_active-line {\\\nbackground: rgba(0, 0, 0, 0.07);\\\n}\\\n.ace-tm .ace_gutter-active-line {\\\nbackground-color : #dcdcdc;\\\n}\\\n.ace-tm .ace_marker-layer .ace_selected-word {\\\nbackground: rgb(250, 250, 255);\\\nborder: 1px solid rgb(200, 200, 250);\\\n}\\\n.ace-tm .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\\\n\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-tomorrow.js",
    "content": "ace.define(\"ace/theme/tomorrow\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = false;\nexports.cssClass = \"ace-tomorrow\";\nexports.cssText = \".ace-tomorrow .ace_gutter {\\\nbackground: #f6f6f6;\\\ncolor: #4D4D4C\\\n}\\\n.ace-tomorrow .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #f6f6f6\\\n}\\\n.ace-tomorrow {\\\nbackground-color: #FFFFFF;\\\ncolor: #4D4D4C\\\n}\\\n.ace-tomorrow .ace_cursor {\\\ncolor: #AEAFAD\\\n}\\\n.ace-tomorrow .ace_marker-layer .ace_selection {\\\nbackground: #D6D6D6\\\n}\\\n.ace-tomorrow.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #FFFFFF;\\\nborder-radius: 2px\\\n}\\\n.ace-tomorrow .ace_marker-layer .ace_step {\\\nbackground: rgb(255, 255, 0)\\\n}\\\n.ace-tomorrow .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid #D1D1D1\\\n}\\\n.ace-tomorrow .ace_marker-layer .ace_active-line {\\\nbackground: #EFEFEF\\\n}\\\n.ace-tomorrow .ace_gutter-active-line {\\\nbackground-color : #dcdcdc\\\n}\\\n.ace-tomorrow .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid #D6D6D6\\\n}\\\n.ace-tomorrow .ace_invisible {\\\ncolor: #D1D1D1\\\n}\\\n.ace-tomorrow .ace_keyword,\\\n.ace-tomorrow .ace_meta,\\\n.ace-tomorrow .ace_storage,\\\n.ace-tomorrow .ace_storage.ace_type,\\\n.ace-tomorrow .ace_support.ace_type {\\\ncolor: #8959A8\\\n}\\\n.ace-tomorrow .ace_keyword.ace_operator {\\\ncolor: #3E999F\\\n}\\\n.ace-tomorrow .ace_constant.ace_character,\\\n.ace-tomorrow .ace_constant.ace_language,\\\n.ace-tomorrow .ace_constant.ace_numeric,\\\n.ace-tomorrow .ace_keyword.ace_other.ace_unit,\\\n.ace-tomorrow .ace_support.ace_constant,\\\n.ace-tomorrow .ace_variable.ace_parameter {\\\ncolor: #F5871F\\\n}\\\n.ace-tomorrow .ace_constant.ace_other {\\\ncolor: #666969\\\n}\\\n.ace-tomorrow .ace_invalid {\\\ncolor: #FFFFFF;\\\nbackground-color: #C82829\\\n}\\\n.ace-tomorrow .ace_invalid.ace_deprecated {\\\ncolor: #FFFFFF;\\\nbackground-color: #8959A8\\\n}\\\n.ace-tomorrow .ace_fold {\\\nbackground-color: #4271AE;\\\nborder-color: #4D4D4C\\\n}\\\n.ace-tomorrow .ace_entity.ace_name.ace_function,\\\n.ace-tomorrow .ace_support.ace_function,\\\n.ace-tomorrow .ace_variable {\\\ncolor: #4271AE\\\n}\\\n.ace-tomorrow .ace_support.ace_class,\\\n.ace-tomorrow .ace_support.ace_type {\\\ncolor: #C99E00\\\n}\\\n.ace-tomorrow .ace_heading,\\\n.ace-tomorrow .ace_markup.ace_heading,\\\n.ace-tomorrow .ace_string {\\\ncolor: #718C00\\\n}\\\n.ace-tomorrow .ace_entity.ace_name.ace_tag,\\\n.ace-tomorrow .ace_entity.ace_other.ace_attribute-name,\\\n.ace-tomorrow .ace_meta.ace_tag,\\\n.ace-tomorrow .ace_string.ace_regexp,\\\n.ace-tomorrow .ace_variable {\\\ncolor: #C82829\\\n}\\\n.ace-tomorrow .ace_comment {\\\ncolor: #8E908C\\\n}\\\n.ace-tomorrow .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-tomorrow_night.js",
    "content": "ace.define(\"ace/theme/tomorrow_night\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-tomorrow-night\";\nexports.cssText = \".ace-tomorrow-night .ace_gutter {\\\nbackground: #25282c;\\\ncolor: #C5C8C6\\\n}\\\n.ace-tomorrow-night .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #25282c\\\n}\\\n.ace-tomorrow-night {\\\nbackground-color: #1D1F21;\\\ncolor: #C5C8C6\\\n}\\\n.ace-tomorrow-night .ace_cursor {\\\ncolor: #AEAFAD\\\n}\\\n.ace-tomorrow-night .ace_marker-layer .ace_selection {\\\nbackground: #373B41\\\n}\\\n.ace-tomorrow-night.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #1D1F21;\\\nborder-radius: 2px\\\n}\\\n.ace-tomorrow-night .ace_marker-layer .ace_step {\\\nbackground: rgb(102, 82, 0)\\\n}\\\n.ace-tomorrow-night .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid #4B4E55\\\n}\\\n.ace-tomorrow-night .ace_marker-layer .ace_active-line {\\\nbackground: #282A2E\\\n}\\\n.ace-tomorrow-night .ace_gutter-active-line {\\\nbackground-color: #282A2E\\\n}\\\n.ace-tomorrow-night .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid #373B41\\\n}\\\n.ace-tomorrow-night .ace_invisible {\\\ncolor: #4B4E55\\\n}\\\n.ace-tomorrow-night .ace_keyword,\\\n.ace-tomorrow-night .ace_meta,\\\n.ace-tomorrow-night .ace_storage,\\\n.ace-tomorrow-night .ace_storage.ace_type,\\\n.ace-tomorrow-night .ace_support.ace_type {\\\ncolor: #B294BB\\\n}\\\n.ace-tomorrow-night .ace_keyword.ace_operator {\\\ncolor: #8ABEB7\\\n}\\\n.ace-tomorrow-night .ace_constant.ace_character,\\\n.ace-tomorrow-night .ace_constant.ace_language,\\\n.ace-tomorrow-night .ace_constant.ace_numeric,\\\n.ace-tomorrow-night .ace_keyword.ace_other.ace_unit,\\\n.ace-tomorrow-night .ace_support.ace_constant,\\\n.ace-tomorrow-night .ace_variable.ace_parameter {\\\ncolor: #DE935F\\\n}\\\n.ace-tomorrow-night .ace_constant.ace_other {\\\ncolor: #CED1CF\\\n}\\\n.ace-tomorrow-night .ace_invalid {\\\ncolor: #CED2CF;\\\nbackground-color: #DF5F5F\\\n}\\\n.ace-tomorrow-night .ace_invalid.ace_deprecated {\\\ncolor: #CED2CF;\\\nbackground-color: #B798BF\\\n}\\\n.ace-tomorrow-night .ace_fold {\\\nbackground-color: #81A2BE;\\\nborder-color: #C5C8C6\\\n}\\\n.ace-tomorrow-night .ace_entity.ace_name.ace_function,\\\n.ace-tomorrow-night .ace_support.ace_function,\\\n.ace-tomorrow-night .ace_variable {\\\ncolor: #81A2BE\\\n}\\\n.ace-tomorrow-night .ace_support.ace_class,\\\n.ace-tomorrow-night .ace_support.ace_type {\\\ncolor: #F0C674\\\n}\\\n.ace-tomorrow-night .ace_heading,\\\n.ace-tomorrow-night .ace_markup.ace_heading,\\\n.ace-tomorrow-night .ace_string {\\\ncolor: #B5BD68\\\n}\\\n.ace-tomorrow-night .ace_entity.ace_name.ace_tag,\\\n.ace-tomorrow-night .ace_entity.ace_other.ace_attribute-name,\\\n.ace-tomorrow-night .ace_meta.ace_tag,\\\n.ace-tomorrow-night .ace_string.ace_regexp,\\\n.ace-tomorrow-night .ace_variable {\\\ncolor: #CC6666\\\n}\\\n.ace-tomorrow-night .ace_comment {\\\ncolor: #969896\\\n}\\\n.ace-tomorrow-night .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-tomorrow_night_blue.js",
    "content": "ace.define(\"ace/theme/tomorrow_night_blue\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-tomorrow-night-blue\";\nexports.cssText = \".ace-tomorrow-night-blue .ace_gutter {\\\nbackground: #00204b;\\\ncolor: #7388b5\\\n}\\\n.ace-tomorrow-night-blue .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #00204b\\\n}\\\n.ace-tomorrow-night-blue {\\\nbackground-color: #002451;\\\ncolor: #FFFFFF\\\n}\\\n.ace-tomorrow-night-blue .ace_constant.ace_other,\\\n.ace-tomorrow-night-blue .ace_cursor {\\\ncolor: #FFFFFF\\\n}\\\n.ace-tomorrow-night-blue .ace_marker-layer .ace_selection {\\\nbackground: #003F8E\\\n}\\\n.ace-tomorrow-night-blue.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #002451;\\\nborder-radius: 2px\\\n}\\\n.ace-tomorrow-night-blue .ace_marker-layer .ace_step {\\\nbackground: rgb(127, 111, 19)\\\n}\\\n.ace-tomorrow-night-blue .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid #404F7D\\\n}\\\n.ace-tomorrow-night-blue .ace_marker-layer .ace_active-line {\\\nbackground: #00346E\\\n}\\\n.ace-tomorrow-night-blue .ace_gutter-active-line {\\\nbackground-color: #022040\\\n}\\\n.ace-tomorrow-night-blue .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid #003F8E\\\n}\\\n.ace-tomorrow-night-blue .ace_invisible {\\\ncolor: #404F7D\\\n}\\\n.ace-tomorrow-night-blue .ace_keyword,\\\n.ace-tomorrow-night-blue .ace_meta,\\\n.ace-tomorrow-night-blue .ace_storage,\\\n.ace-tomorrow-night-blue .ace_storage.ace_type,\\\n.ace-tomorrow-night-blue .ace_support.ace_type {\\\ncolor: #EBBBFF\\\n}\\\n.ace-tomorrow-night-blue .ace_keyword.ace_operator {\\\ncolor: #99FFFF\\\n}\\\n.ace-tomorrow-night-blue .ace_constant.ace_character,\\\n.ace-tomorrow-night-blue .ace_constant.ace_language,\\\n.ace-tomorrow-night-blue .ace_constant.ace_numeric,\\\n.ace-tomorrow-night-blue .ace_keyword.ace_other.ace_unit,\\\n.ace-tomorrow-night-blue .ace_support.ace_constant,\\\n.ace-tomorrow-night-blue .ace_variable.ace_parameter {\\\ncolor: #FFC58F\\\n}\\\n.ace-tomorrow-night-blue .ace_invalid {\\\ncolor: #FFFFFF;\\\nbackground-color: #F99DA5\\\n}\\\n.ace-tomorrow-night-blue .ace_invalid.ace_deprecated {\\\ncolor: #FFFFFF;\\\nbackground-color: #EBBBFF\\\n}\\\n.ace-tomorrow-night-blue .ace_fold {\\\nbackground-color: #BBDAFF;\\\nborder-color: #FFFFFF\\\n}\\\n.ace-tomorrow-night-blue .ace_entity.ace_name.ace_function,\\\n.ace-tomorrow-night-blue .ace_support.ace_function,\\\n.ace-tomorrow-night-blue .ace_variable {\\\ncolor: #BBDAFF\\\n}\\\n.ace-tomorrow-night-blue .ace_support.ace_class,\\\n.ace-tomorrow-night-blue .ace_support.ace_type {\\\ncolor: #FFEEAD\\\n}\\\n.ace-tomorrow-night-blue .ace_heading,\\\n.ace-tomorrow-night-blue .ace_markup.ace_heading,\\\n.ace-tomorrow-night-blue .ace_string {\\\ncolor: #D1F1A9\\\n}\\\n.ace-tomorrow-night-blue .ace_entity.ace_name.ace_tag,\\\n.ace-tomorrow-night-blue .ace_entity.ace_other.ace_attribute-name,\\\n.ace-tomorrow-night-blue .ace_meta.ace_tag,\\\n.ace-tomorrow-night-blue .ace_string.ace_regexp,\\\n.ace-tomorrow-night-blue .ace_variable {\\\ncolor: #FF9DA4\\\n}\\\n.ace-tomorrow-night-blue .ace_comment {\\\ncolor: #7285B7\\\n}\\\n.ace-tomorrow-night-blue .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYJDzqfwPAANXAeNsiA+ZAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-tomorrow_night_bright.js",
    "content": "ace.define(\"ace/theme/tomorrow_night_bright\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-tomorrow-night-bright\";\nexports.cssText = \".ace-tomorrow-night-bright .ace_gutter {\\\nbackground: #1a1a1a;\\\ncolor: #DEDEDE\\\n}\\\n.ace-tomorrow-night-bright .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #1a1a1a\\\n}\\\n.ace-tomorrow-night-bright {\\\nbackground-color: #000000;\\\ncolor: #DEDEDE\\\n}\\\n.ace-tomorrow-night-bright .ace_cursor {\\\ncolor: #9F9F9F\\\n}\\\n.ace-tomorrow-night-bright .ace_marker-layer .ace_selection {\\\nbackground: #424242\\\n}\\\n.ace-tomorrow-night-bright.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #000000;\\\nborder-radius: 2px\\\n}\\\n.ace-tomorrow-night-bright .ace_marker-layer .ace_step {\\\nbackground: rgb(102, 82, 0)\\\n}\\\n.ace-tomorrow-night-bright .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid #888888\\\n}\\\n.ace-tomorrow-night-bright .ace_marker-layer .ace_highlight {\\\nborder: 1px solid rgb(110, 119, 0);\\\nborder-bottom: 0;\\\nbox-shadow: inset 0 -1px rgb(110, 119, 0);\\\nmargin: -1px 0 0 -1px;\\\nbackground: rgba(255, 235, 0, 0.1)\\\n}\\\n.ace-tomorrow-night-bright .ace_marker-layer .ace_active-line {\\\nbackground: #2A2A2A\\\n}\\\n.ace-tomorrow-night-bright .ace_gutter-active-line {\\\nbackground-color: #2A2A2A\\\n}\\\n.ace-tomorrow-night-bright .ace_stack {\\\nbackground-color: rgb(66, 90, 44)\\\n}\\\n.ace-tomorrow-night-bright .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid #888888\\\n}\\\n.ace-tomorrow-night-bright .ace_invisible {\\\ncolor: #343434\\\n}\\\n.ace-tomorrow-night-bright .ace_keyword,\\\n.ace-tomorrow-night-bright .ace_meta,\\\n.ace-tomorrow-night-bright .ace_storage,\\\n.ace-tomorrow-night-bright .ace_storage.ace_type,\\\n.ace-tomorrow-night-bright .ace_support.ace_type {\\\ncolor: #C397D8\\\n}\\\n.ace-tomorrow-night-bright .ace_keyword.ace_operator {\\\ncolor: #70C0B1\\\n}\\\n.ace-tomorrow-night-bright .ace_constant.ace_character,\\\n.ace-tomorrow-night-bright .ace_constant.ace_language,\\\n.ace-tomorrow-night-bright .ace_constant.ace_numeric,\\\n.ace-tomorrow-night-bright .ace_keyword.ace_other.ace_unit,\\\n.ace-tomorrow-night-bright .ace_support.ace_constant,\\\n.ace-tomorrow-night-bright .ace_variable.ace_parameter {\\\ncolor: #E78C45\\\n}\\\n.ace-tomorrow-night-bright .ace_constant.ace_other {\\\ncolor: #EEEEEE\\\n}\\\n.ace-tomorrow-night-bright .ace_invalid {\\\ncolor: #CED2CF;\\\nbackground-color: #DF5F5F\\\n}\\\n.ace-tomorrow-night-bright .ace_invalid.ace_deprecated {\\\ncolor: #CED2CF;\\\nbackground-color: #B798BF\\\n}\\\n.ace-tomorrow-night-bright .ace_fold {\\\nbackground-color: #7AA6DA;\\\nborder-color: #DEDEDE\\\n}\\\n.ace-tomorrow-night-bright .ace_entity.ace_name.ace_function,\\\n.ace-tomorrow-night-bright .ace_support.ace_function,\\\n.ace-tomorrow-night-bright .ace_variable {\\\ncolor: #7AA6DA\\\n}\\\n.ace-tomorrow-night-bright .ace_support.ace_class,\\\n.ace-tomorrow-night-bright .ace_support.ace_type {\\\ncolor: #E7C547\\\n}\\\n.ace-tomorrow-night-bright .ace_heading,\\\n.ace-tomorrow-night-bright .ace_markup.ace_heading,\\\n.ace-tomorrow-night-bright .ace_string {\\\ncolor: #B9CA4A\\\n}\\\n.ace-tomorrow-night-bright .ace_entity.ace_name.ace_tag,\\\n.ace-tomorrow-night-bright .ace_entity.ace_other.ace_attribute-name,\\\n.ace-tomorrow-night-bright .ace_meta.ace_tag,\\\n.ace-tomorrow-night-bright .ace_string.ace_regexp,\\\n.ace-tomorrow-night-bright .ace_variable {\\\ncolor: #D54E53\\\n}\\\n.ace-tomorrow-night-bright .ace_comment {\\\ncolor: #969896\\\n}\\\n.ace-tomorrow-night-bright .ace_c9searchresults.ace_keyword {\\\ncolor: #C2C280\\\n}\\\n.ace-tomorrow-night-bright .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-tomorrow_night_eighties.js",
    "content": "ace.define(\"ace/theme/tomorrow_night_eighties\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-tomorrow-night-eighties\";\nexports.cssText = \".ace-tomorrow-night-eighties .ace_gutter {\\\nbackground: #272727;\\\ncolor: #CCC\\\n}\\\n.ace-tomorrow-night-eighties .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #272727\\\n}\\\n.ace-tomorrow-night-eighties {\\\nbackground-color: #2D2D2D;\\\ncolor: #CCCCCC\\\n}\\\n.ace-tomorrow-night-eighties .ace_constant.ace_other,\\\n.ace-tomorrow-night-eighties .ace_cursor {\\\ncolor: #CCCCCC\\\n}\\\n.ace-tomorrow-night-eighties .ace_marker-layer .ace_selection {\\\nbackground: #515151\\\n}\\\n.ace-tomorrow-night-eighties.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #2D2D2D;\\\nborder-radius: 2px\\\n}\\\n.ace-tomorrow-night-eighties .ace_marker-layer .ace_step {\\\nbackground: rgb(102, 82, 0)\\\n}\\\n.ace-tomorrow-night-eighties .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid #6A6A6A\\\n}\\\n.ace-tomorrow-night-bright .ace_stack {\\\nbackground: rgb(66, 90, 44)\\\n}\\\n.ace-tomorrow-night-eighties .ace_marker-layer .ace_active-line {\\\nbackground: #393939\\\n}\\\n.ace-tomorrow-night-eighties .ace_gutter-active-line {\\\nbackground-color: #393939\\\n}\\\n.ace-tomorrow-night-eighties .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid #515151\\\n}\\\n.ace-tomorrow-night-eighties .ace_invisible {\\\ncolor: #6A6A6A\\\n}\\\n.ace-tomorrow-night-eighties .ace_keyword,\\\n.ace-tomorrow-night-eighties .ace_meta,\\\n.ace-tomorrow-night-eighties .ace_storage,\\\n.ace-tomorrow-night-eighties .ace_storage.ace_type,\\\n.ace-tomorrow-night-eighties .ace_support.ace_type {\\\ncolor: #CC99CC\\\n}\\\n.ace-tomorrow-night-eighties .ace_keyword.ace_operator {\\\ncolor: #66CCCC\\\n}\\\n.ace-tomorrow-night-eighties .ace_constant.ace_character,\\\n.ace-tomorrow-night-eighties .ace_constant.ace_language,\\\n.ace-tomorrow-night-eighties .ace_constant.ace_numeric,\\\n.ace-tomorrow-night-eighties .ace_keyword.ace_other.ace_unit,\\\n.ace-tomorrow-night-eighties .ace_support.ace_constant,\\\n.ace-tomorrow-night-eighties .ace_variable.ace_parameter {\\\ncolor: #F99157\\\n}\\\n.ace-tomorrow-night-eighties .ace_invalid {\\\ncolor: #CDCDCD;\\\nbackground-color: #F2777A\\\n}\\\n.ace-tomorrow-night-eighties .ace_invalid.ace_deprecated {\\\ncolor: #CDCDCD;\\\nbackground-color: #CC99CC\\\n}\\\n.ace-tomorrow-night-eighties .ace_fold {\\\nbackground-color: #6699CC;\\\nborder-color: #CCCCCC\\\n}\\\n.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_function,\\\n.ace-tomorrow-night-eighties .ace_support.ace_function,\\\n.ace-tomorrow-night-eighties .ace_variable {\\\ncolor: #6699CC\\\n}\\\n.ace-tomorrow-night-eighties .ace_support.ace_class,\\\n.ace-tomorrow-night-eighties .ace_support.ace_type {\\\ncolor: #FFCC66\\\n}\\\n.ace-tomorrow-night-eighties .ace_heading,\\\n.ace-tomorrow-night-eighties .ace_markup.ace_heading,\\\n.ace-tomorrow-night-eighties .ace_string {\\\ncolor: #99CC99\\\n}\\\n.ace-tomorrow-night-eighties .ace_comment {\\\ncolor: #999999\\\n}\\\n.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_tag,\\\n.ace-tomorrow-night-eighties .ace_entity.ace_other.ace_attribute-name,\\\n.ace-tomorrow-night-eighties .ace_meta.ace_tag,\\\n.ace-tomorrow-night-eighties .ace_variable {\\\ncolor: #F2777A\\\n}\\\n.ace-tomorrow-night-eighties .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ09NrYAgMjP4PAAtGAwchHMyAAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-twilight.js",
    "content": "ace.define(\"ace/theme/twilight\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-twilight\";\nexports.cssText = \".ace-twilight .ace_gutter {\\\nbackground: #232323;\\\ncolor: #E2E2E2\\\n}\\\n.ace-twilight .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #232323\\\n}\\\n.ace-twilight {\\\nbackground-color: #141414;\\\ncolor: #F8F8F8\\\n}\\\n.ace-twilight .ace_cursor {\\\ncolor: #A7A7A7\\\n}\\\n.ace-twilight .ace_marker-layer .ace_selection {\\\nbackground: rgba(221, 240, 255, 0.20)\\\n}\\\n.ace-twilight.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #141414;\\\nborder-radius: 2px\\\n}\\\n.ace-twilight .ace_marker-layer .ace_step {\\\nbackground: rgb(102, 82, 0)\\\n}\\\n.ace-twilight .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgba(255, 255, 255, 0.25)\\\n}\\\n.ace-twilight .ace_marker-layer .ace_active-line {\\\nbackground: rgba(255, 255, 255, 0.031)\\\n}\\\n.ace-twilight .ace_gutter-active-line {\\\nbackground-color: rgba(255, 255, 255, 0.031)\\\n}\\\n.ace-twilight .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid rgba(221, 240, 255, 0.20)\\\n}\\\n.ace-twilight .ace_invisible {\\\ncolor: rgba(255, 255, 255, 0.25)\\\n}\\\n.ace-twilight .ace_keyword,\\\n.ace-twilight .ace_meta {\\\ncolor: #CDA869\\\n}\\\n.ace-twilight .ace_constant,\\\n.ace-twilight .ace_constant.ace_character,\\\n.ace-twilight .ace_constant.ace_character.ace_escape,\\\n.ace-twilight .ace_constant.ace_other,\\\n.ace-twilight .ace_heading,\\\n.ace-twilight .ace_markup.ace_heading,\\\n.ace-twilight .ace_support.ace_constant {\\\ncolor: #CF6A4C\\\n}\\\n.ace-twilight .ace_invalid.ace_illegal {\\\ncolor: #F8F8F8;\\\nbackground-color: rgba(86, 45, 86, 0.75)\\\n}\\\n.ace-twilight .ace_invalid.ace_deprecated {\\\ntext-decoration: underline;\\\nfont-style: italic;\\\ncolor: #D2A8A1\\\n}\\\n.ace-twilight .ace_support {\\\ncolor: #9B859D\\\n}\\\n.ace-twilight .ace_fold {\\\nbackground-color: #AC885B;\\\nborder-color: #F8F8F8\\\n}\\\n.ace-twilight .ace_support.ace_function {\\\ncolor: #DAD085\\\n}\\\n.ace-twilight .ace_list,\\\n.ace-twilight .ace_markup.ace_list,\\\n.ace-twilight .ace_storage {\\\ncolor: #F9EE98\\\n}\\\n.ace-twilight .ace_entity.ace_name.ace_function,\\\n.ace-twilight .ace_meta.ace_tag,\\\n.ace-twilight .ace_variable {\\\ncolor: #AC885B\\\n}\\\n.ace-twilight .ace_string {\\\ncolor: #8F9D6A\\\n}\\\n.ace-twilight .ace_string.ace_regexp {\\\ncolor: #E9C062\\\n}\\\n.ace-twilight .ace_comment {\\\nfont-style: italic;\\\ncolor: #5F5A60\\\n}\\\n.ace-twilight .ace_variable {\\\ncolor: #7587A6\\\n}\\\n.ace-twilight .ace_xml-pe {\\\ncolor: #494949\\\n}\\\n.ace-twilight .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-vibrant_ink.js",
    "content": "ace.define(\"ace/theme/vibrant_ink\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = true;\nexports.cssClass = \"ace-vibrant-ink\";\nexports.cssText = \".ace-vibrant-ink .ace_gutter {\\\nbackground: #1a1a1a;\\\ncolor: #BEBEBE\\\n}\\\n.ace-vibrant-ink .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #1a1a1a\\\n}\\\n.ace-vibrant-ink {\\\nbackground-color: #0F0F0F;\\\ncolor: #FFFFFF\\\n}\\\n.ace-vibrant-ink .ace_cursor {\\\ncolor: #FFFFFF\\\n}\\\n.ace-vibrant-ink .ace_marker-layer .ace_selection {\\\nbackground: #6699CC\\\n}\\\n.ace-vibrant-ink.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #0F0F0F;\\\nborder-radius: 2px\\\n}\\\n.ace-vibrant-ink .ace_marker-layer .ace_step {\\\nbackground: rgb(102, 82, 0)\\\n}\\\n.ace-vibrant-ink .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid #404040\\\n}\\\n.ace-vibrant-ink .ace_marker-layer .ace_active-line {\\\nbackground: #333333\\\n}\\\n.ace-vibrant-ink .ace_gutter-active-line {\\\nbackground-color: #333333\\\n}\\\n.ace-vibrant-ink .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid #6699CC\\\n}\\\n.ace-vibrant-ink .ace_invisible {\\\ncolor: #404040\\\n}\\\n.ace-vibrant-ink .ace_keyword,\\\n.ace-vibrant-ink .ace_meta {\\\ncolor: #FF6600\\\n}\\\n.ace-vibrant-ink .ace_constant,\\\n.ace-vibrant-ink .ace_constant.ace_character,\\\n.ace-vibrant-ink .ace_constant.ace_character.ace_escape,\\\n.ace-vibrant-ink .ace_constant.ace_other {\\\ncolor: #339999\\\n}\\\n.ace-vibrant-ink .ace_constant.ace_numeric {\\\ncolor: #99CC99\\\n}\\\n.ace-vibrant-ink .ace_invalid,\\\n.ace-vibrant-ink .ace_invalid.ace_deprecated {\\\ncolor: #CCFF33;\\\nbackground-color: #000000\\\n}\\\n.ace-vibrant-ink .ace_fold {\\\nbackground-color: #FFCC00;\\\nborder-color: #FFFFFF\\\n}\\\n.ace-vibrant-ink .ace_entity.ace_name.ace_function,\\\n.ace-vibrant-ink .ace_support.ace_function,\\\n.ace-vibrant-ink .ace_variable {\\\ncolor: #FFCC00\\\n}\\\n.ace-vibrant-ink .ace_variable.ace_parameter {\\\nfont-style: italic\\\n}\\\n.ace-vibrant-ink .ace_string {\\\ncolor: #66FF00\\\n}\\\n.ace-vibrant-ink .ace_string.ace_regexp {\\\ncolor: #44B4CC\\\n}\\\n.ace-vibrant-ink .ace_comment {\\\ncolor: #9933CC\\\n}\\\n.ace-vibrant-ink .ace_entity.ace_other.ace_attribute-name {\\\nfont-style: italic;\\\ncolor: #99CC99\\\n}\\\n.ace-vibrant-ink .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYNDTc/oPAALPAZ7hxlbYAAAAAElFTkSuQmCC) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/theme-xcode.js",
    "content": "ace.define(\"ace/theme/xcode\",[\"require\",\"exports\",\"module\",\"ace/lib/dom\"], function(require, exports, module) {\n\nexports.isDark = false;\nexports.cssClass = \"ace-xcode\";\nexports.cssText = \"\\\n.ace-xcode .ace_gutter {\\\nbackground: #e8e8e8;\\\ncolor: #333\\\n}\\\n.ace-xcode .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8\\\n}\\\n.ace-xcode {\\\nbackground-color: #FFFFFF;\\\ncolor: #000000\\\n}\\\n.ace-xcode .ace_cursor {\\\ncolor: #000000\\\n}\\\n.ace-xcode .ace_marker-layer .ace_selection {\\\nbackground: #B5D5FF\\\n}\\\n.ace-xcode.ace_multiselect .ace_selection.ace_start {\\\nbox-shadow: 0 0 3px 0px #FFFFFF;\\\nborder-radius: 2px\\\n}\\\n.ace-xcode .ace_marker-layer .ace_step {\\\nbackground: rgb(198, 219, 174)\\\n}\\\n.ace-xcode .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid #BFBFBF\\\n}\\\n.ace-xcode .ace_marker-layer .ace_active-line {\\\nbackground: rgba(0, 0, 0, 0.071)\\\n}\\\n.ace-xcode .ace_gutter-active-line {\\\nbackground-color: rgba(0, 0, 0, 0.071)\\\n}\\\n.ace-xcode .ace_marker-layer .ace_selected-word {\\\nborder: 1px solid #B5D5FF\\\n}\\\n.ace-xcode .ace_constant.ace_language,\\\n.ace-xcode .ace_keyword,\\\n.ace-xcode .ace_meta,\\\n.ace-xcode .ace_variable.ace_language {\\\ncolor: #C800A4\\\n}\\\n.ace-xcode .ace_invisible {\\\ncolor: #BFBFBF\\\n}\\\n.ace-xcode .ace_constant.ace_character,\\\n.ace-xcode .ace_constant.ace_other {\\\ncolor: #275A5E\\\n}\\\n.ace-xcode .ace_constant.ace_numeric {\\\ncolor: #3A00DC\\\n}\\\n.ace-xcode .ace_entity.ace_other.ace_attribute-name,\\\n.ace-xcode .ace_support.ace_constant,\\\n.ace-xcode .ace_support.ace_function {\\\ncolor: #450084\\\n}\\\n.ace-xcode .ace_fold {\\\nbackground-color: #C800A4;\\\nborder-color: #000000\\\n}\\\n.ace-xcode .ace_entity.ace_name.ace_tag,\\\n.ace-xcode .ace_support.ace_class,\\\n.ace-xcode .ace_support.ace_type {\\\ncolor: #790EAD\\\n}\\\n.ace-xcode .ace_storage {\\\ncolor: #C900A4\\\n}\\\n.ace-xcode .ace_string {\\\ncolor: #DF0002\\\n}\\\n.ace-xcode .ace_comment {\\\ncolor: #008E00\\\n}\\\n.ace-xcode .ace_indent-guide {\\\nbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==) right repeat-y\\\n}\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/worker-coffee.js",
    "content": "\"no use strict\";\n;(function(window) {\nif (typeof window.window != \"undefined\" && window.document) {\n    return;\n}\n\nwindow.console = function() {\n    var msgs = Array.prototype.slice.call(arguments, 0);\n    postMessage({type: \"log\", data: msgs});\n};\nwindow.console.error =\nwindow.console.warn = \nwindow.console.log =\nwindow.console.trace = window.console;\n\nwindow.window = window;\nwindow.ace = window;\n\nwindow.onerror = function(message, file, line, col, err) {\n    postMessage({type: \"error\", data: {\n        message: message,\n        file: file,\n        line: line, \n        col: col,\n        stack: err.stack\n    }});\n};\n\nwindow.normalizeModule = function(parentId, moduleName) {\n    // normalize plugin requires\n    if (moduleName.indexOf(\"!\") !== -1) {\n        var chunks = moduleName.split(\"!\");\n        return window.normalizeModule(parentId, chunks[0]) + \"!\" + window.normalizeModule(parentId, chunks[1]);\n    }\n    // normalize relative requires\n    if (moduleName.charAt(0) == \".\") {\n        var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n        moduleName = (base ? base + \"/\" : \"\") + moduleName;\n        \n        while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n            var previous = moduleName;\n            moduleName = moduleName.replace(/^\\.\\//, \"\").replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n        }\n    }\n    \n    return moduleName;\n};\n\nwindow.require = function(parentId, id) {\n    if (!id) {\n        id = parentId;\n        parentId = null;\n    }\n    if (!id.charAt)\n        throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");\n\n    id = window.normalizeModule(parentId, id);\n\n    var module = window.require.modules[id];\n    if (module) {\n        if (!module.initialized) {\n            module.initialized = true;\n            module.exports = module.factory().exports;\n        }\n        return module.exports;\n    }\n    \n    var chunks = id.split(\"/\");\n    if (!window.require.tlns)\n        return console.log(\"unable to load \" + id);\n    chunks[0] = window.require.tlns[chunks[0]] || chunks[0];\n    var path = chunks.join(\"/\") + \".js\";\n    \n    window.require.id = id;\n    importScripts(path);\n    return window.require(parentId, id);\n};\nwindow.require.modules = {};\nwindow.require.tlns = {};\n\nwindow.define = function(id, deps, factory) {\n    if (arguments.length == 2) {\n        factory = deps;\n        if (typeof id != \"string\") {\n            deps = id;\n            id = window.require.id;\n        }\n    } else if (arguments.length == 1) {\n        factory = id;\n        deps = [];\n        id = window.require.id;\n    }\n    \n    if (typeof factory != \"function\") {\n        window.require.modules[id] = {\n            exports: factory,\n            initialized: true\n        };\n        return;\n    }\n\n    if (!deps.length)\n        // If there is no dependencies, we inject 'require', 'exports' and\n        // 'module' as dependencies, to provide CommonJS compatibility.\n        deps = ['require', 'exports', 'module'];\n\n    var req = function(childId) {\n        return window.require(id, childId);\n    };\n\n    window.require.modules[id] = {\n        exports: {},\n        factory: function() {\n            var module = this;\n            var returnExports = factory.apply(this, deps.map(function(dep) {\n              switch(dep) {\n                  // Because 'require', 'exports' and 'module' aren't actual\n                  // dependencies, we must handle them seperately.\n                  case 'require': return req;\n                  case 'exports': return module.exports;\n                  case 'module':  return module;\n                  // But for all other dependencies, we can just go ahead and\n                  // require them.\n                  default:        return req(dep);\n              }\n            }));\n            if (returnExports)\n                module.exports = returnExports;\n            return module;\n        }\n    };\n};\nwindow.define.amd = {};\n\nwindow.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n    require.tlns = topLevelNamespaces;\n};\n\nwindow.initSender = function initSender() {\n\n    var EventEmitter = window.require(\"ace/lib/event_emitter\").EventEmitter;\n    var oop = window.require(\"ace/lib/oop\");\n    \n    var Sender = function() {};\n    \n    (function() {\n        \n        oop.implement(this, EventEmitter);\n                \n        this.callback = function(data, callbackId) {\n            postMessage({\n                type: \"call\",\n                id: callbackId,\n                data: data\n            });\n        };\n    \n        this.emit = function(name, data) {\n            postMessage({\n                type: \"event\",\n                name: name,\n                data: data\n            });\n        };\n        \n    }).call(Sender.prototype);\n    \n    return new Sender();\n};\n\nvar main = window.main = null;\nvar sender = window.sender = null;\n\nwindow.onmessage = function(e) {\n    var msg = e.data;\n    if (msg.command) {\n        if (main[msg.command])\n            main[msg.command].apply(main, msg.args);\n        else\n            throw new Error(\"Unknown command:\" + msg.command);\n    }\n    else if (msg.init) {        \n        initBaseUrls(msg.tlns);\n        require(\"ace/lib/es5-shim\");\n        sender = window.sender = initSender();\n        var clazz = require(msg.module)[msg.classname];\n        main = window.main = new clazz(sender);\n    } \n    else if (msg.event && sender) {\n        sender._signal(msg.event, msg.data);\n    }\n};\n})(this);\n\nace.define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.inherits = function(ctor, 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\nexports.mixin = function(obj, mixin) {\n    for (var key in mixin) {\n        obj[key] = mixin[key];\n    }\n    return obj;\n};\n\nexports.implement = function(proto, mixin) {\n    exports.mixin(proto, mixin);\n};\n\n});\n\nace.define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nvar EventEmitter = {};\nvar stopPropagation = function() { this.propagationStopped = true; };\nvar preventDefault = function() { this.defaultPrevented = true; };\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n    this._eventRegistry || (this._eventRegistry = {});\n    this._defaultHandlers || (this._defaultHandlers = {});\n\n    var listeners = this._eventRegistry[eventName] || [];\n    var defaultHandler = this._defaultHandlers[eventName];\n    if (!listeners.length && !defaultHandler)\n        return;\n\n    if (typeof e != \"object\" || !e)\n        e = {};\n\n    if (!e.type)\n        e.type = eventName;\n    if (!e.stopPropagation)\n        e.stopPropagation = stopPropagation;\n    if (!e.preventDefault)\n        e.preventDefault = preventDefault;\n\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++) {\n        listeners[i](e, this);\n        if (e.propagationStopped)\n            break;\n    }\n    \n    if (defaultHandler && !e.defaultPrevented)\n        return defaultHandler(e, this);\n};\n\n\nEventEmitter._signal = function(eventName, e) {\n    var listeners = (this._eventRegistry || {})[eventName];\n    if (!listeners)\n        return;\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++)\n        listeners[i](e, this);\n};\n\nEventEmitter.once = function(eventName, callback) {\n    var _self = this;\n    callback && this.addEventListener(eventName, function newCallback() {\n        _self.removeEventListener(eventName, newCallback);\n        callback.apply(null, arguments);\n    });\n};\n\n\nEventEmitter.setDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        handlers = this._defaultHandlers = {_disabled_: {}};\n    \n    if (handlers[eventName]) {\n        var old = handlers[eventName];\n        var disabled = handlers._disabled_[eventName];\n        if (!disabled)\n            handlers._disabled_[eventName] = disabled = [];\n        disabled.push(old);\n        var i = disabled.indexOf(callback);\n        if (i != -1) \n            disabled.splice(i, 1);\n    }\n    handlers[eventName] = callback;\n};\nEventEmitter.removeDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        return;\n    var disabled = handlers._disabled_[eventName];\n    \n    if (handlers[eventName] == callback) {\n        var old = handlers[eventName];\n        if (disabled)\n            this.setDefaultHandler(eventName, disabled.pop());\n    } else if (disabled) {\n        var i = disabled.indexOf(callback);\n        if (i != -1)\n            disabled.splice(i, 1);\n    }\n};\n\nEventEmitter.on =\nEventEmitter.addEventListener = function(eventName, callback, capturing) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        listeners = this._eventRegistry[eventName] = [];\n\n    if (listeners.indexOf(callback) == -1)\n        listeners[capturing ? \"unshift\" : \"push\"](callback);\n    return callback;\n};\n\nEventEmitter.off =\nEventEmitter.removeListener =\nEventEmitter.removeEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        return;\n\n    var index = listeners.indexOf(callback);\n    if (index !== -1)\n        listeners.splice(index, 1);\n};\n\nEventEmitter.removeAllListeners = function(eventName) {\n    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n};\n\nexports.EventEmitter = EventEmitter;\n\n});\n\nace.define(\"ace/range\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nvar comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n    this.start = {\n        row: startRow,\n        column: startColumn\n    };\n\n    this.end = {\n        row: endRow,\n        column: endColumn\n    };\n};\n\n(function() {\n    this.isEqual = function(range) {\n        return this.start.row === range.start.row &&\n            this.end.row === range.end.row &&\n            this.start.column === range.start.column &&\n            this.end.column === range.end.column;\n    };\n    this.toString = function() {\n        return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n            \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n    };\n\n    this.contains = function(row, column) {\n        return this.compare(row, column) == 0;\n    };\n    this.compareRange = function(range) {\n        var cmp,\n            end = range.end,\n            start = range.start;\n\n        cmp = this.compare(end.row, end.column);\n        if (cmp == 1) {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == 1) {\n                return 2;\n            } else if (cmp == 0) {\n                return 1;\n            } else {\n                return 0;\n            }\n        } else if (cmp == -1) {\n            return -2;\n        } else {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == -1) {\n                return -1;\n            } else if (cmp == 1) {\n                return 42;\n            } else {\n                return 0;\n            }\n        }\n    };\n    this.comparePoint = function(p) {\n        return this.compare(p.row, p.column);\n    };\n    this.containsRange = function(range) {\n        return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n    };\n    this.intersects = function(range) {\n        var cmp = this.compareRange(range);\n        return (cmp == -1 || cmp == 0 || cmp == 1);\n    };\n    this.isEnd = function(row, column) {\n        return this.end.row == row && this.end.column == column;\n    };\n    this.isStart = function(row, column) {\n        return this.start.row == row && this.start.column == column;\n    };\n    this.setStart = function(row, column) {\n        if (typeof row == \"object\") {\n            this.start.column = row.column;\n            this.start.row = row.row;\n        } else {\n            this.start.row = row;\n            this.start.column = column;\n        }\n    };\n    this.setEnd = function(row, column) {\n        if (typeof row == \"object\") {\n            this.end.column = row.column;\n            this.end.row = row.row;\n        } else {\n            this.end.row = row;\n            this.end.column = column;\n        }\n    };\n    this.inside = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column) || this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideStart = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideEnd = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.compare = function(row, column) {\n        if (!this.isMultiLine()) {\n            if (row === this.start.row) {\n                return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n            };\n        }\n\n        if (row < this.start.row)\n            return -1;\n\n        if (row > this.end.row)\n            return 1;\n\n        if (this.start.row === row)\n            return column >= this.start.column ? 0 : -1;\n\n        if (this.end.row === row)\n            return column <= this.end.column ? 0 : 1;\n\n        return 0;\n    };\n    this.compareStart = function(row, column) {\n        if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareEnd = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareInside = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.clipRows = function(firstRow, lastRow) {\n        if (this.end.row > lastRow)\n            var end = {row: lastRow + 1, column: 0};\n        else if (this.end.row < firstRow)\n            var end = {row: firstRow, column: 0};\n\n        if (this.start.row > lastRow)\n            var start = {row: lastRow + 1, column: 0};\n        else if (this.start.row < firstRow)\n            var start = {row: firstRow, column: 0};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n    this.extend = function(row, column) {\n        var cmp = this.compare(row, column);\n\n        if (cmp == 0)\n            return this;\n        else if (cmp == -1)\n            var start = {row: row, column: column};\n        else\n            var end = {row: row, column: column};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n\n    this.isEmpty = function() {\n        return (this.start.row === this.end.row && this.start.column === this.end.column);\n    };\n    this.isMultiLine = function() {\n        return (this.start.row !== this.end.row);\n    };\n    this.clone = function() {\n        return Range.fromPoints(this.start, this.end);\n    };\n    this.collapseRows = function() {\n        if (this.end.column == 0)\n            return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)\n        else\n            return new Range(this.start.row, 0, this.end.row, 0)\n    };\n    this.toScreenRange = function(session) {\n        var screenPosStart = session.documentToScreenPosition(this.start);\n        var screenPosEnd = session.documentToScreenPosition(this.end);\n\n        return new Range(\n            screenPosStart.row, screenPosStart.column,\n            screenPosEnd.row, screenPosEnd.column\n        );\n    };\n    this.moveBy = function(row, column) {\n        this.start.row += row;\n        this.start.column += column;\n        this.end.row += row;\n        this.end.column += column;\n    };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n    return new Range(start.row, start.column, end.row, end.column);\n};\nRange.comparePoints = comparePoints;\n\nRange.comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\n\n\nexports.Range = Range;\n});\n\nace.define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n    this.$onChange = this.onChange.bind(this);\n    this.attach(doc);\n    \n    if (typeof column == \"undefined\")\n        this.setPosition(row.row, row.column);\n    else\n        this.setPosition(row, column);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.getPosition = function() {\n        return this.$clipPositionToDocument(this.row, this.column);\n    };\n    this.getDocument = function() {\n        return this.document;\n    };\n    this.$insertRight = false;\n    this.onChange = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n\n        if (range.start.row == range.end.row && range.start.row != this.row)\n            return;\n\n        if (range.start.row > this.row)\n            return;\n\n        if (range.start.row == this.row && range.start.column > this.column)\n            return;\n\n        var row = this.row;\n        var column = this.column;\n        var start = range.start;\n        var end = range.end;\n\n        if (delta.action === \"insertText\") {\n            if (start.row === row && start.column <= column) {\n                if (start.column === column && this.$insertRight) {\n                } else if (start.row === end.row) {\n                    column += end.column - start.column;\n                } else {\n                    column -= start.column;\n                    row += end.row - start.row;\n                }\n            } else if (start.row !== end.row && start.row < row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"insertLines\") {\n            if (start.row === row && column === 0 && this.$insertRight) {\n            }\n            else if (start.row <= row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"removeText\") {\n            if (start.row === row && start.column < column) {\n                if (end.column >= column)\n                    column = start.column;\n                else\n                    column = Math.max(0, column - (end.column - start.column));\n\n            } else if (start.row !== end.row && start.row < row) {\n                if (end.row === row)\n                    column = Math.max(0, column - end.column) + start.column;\n                row -= (end.row - start.row);\n            } else if (end.row === row) {\n                row -= end.row - start.row;\n                column = Math.max(0, column - end.column) + start.column;\n            }\n        } else if (delta.action == \"removeLines\") {\n            if (start.row <= row) {\n                if (end.row <= row)\n                    row -= end.row - start.row;\n                else {\n                    row = start.row;\n                    column = 0;\n                }\n            }\n        }\n\n        this.setPosition(row, column, true);\n    };\n    this.setPosition = function(row, column, noClip) {\n        var pos;\n        if (noClip) {\n            pos = {\n                row: row,\n                column: column\n            };\n        } else {\n            pos = this.$clipPositionToDocument(row, column);\n        }\n\n        if (this.row == pos.row && this.column == pos.column)\n            return;\n\n        var old = {\n            row: this.row,\n            column: this.column\n        };\n\n        this.row = pos.row;\n        this.column = pos.column;\n        this._signal(\"change\", {\n            old: old,\n            value: pos\n        });\n    };\n    this.detach = function() {\n        this.document.removeEventListener(\"change\", this.$onChange);\n    };\n    this.attach = function(doc) {\n        this.document = doc || this.document;\n        this.document.on(\"change\", this.$onChange);\n    };\n    this.$clipPositionToDocument = function(row, column) {\n        var pos = {};\n\n        if (row >= this.document.getLength()) {\n            pos.row = Math.max(0, this.document.getLength() - 1);\n            pos.column = this.document.getLine(pos.row).length;\n        }\n        else if (row < 0) {\n            pos.row = 0;\n            pos.column = 0;\n        }\n        else {\n            pos.row = row;\n            pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n        }\n\n        if (column < 0)\n            pos.column = 0;\n\n        return pos;\n    };\n\n}).call(Anchor.prototype);\n\n});\n\nace.define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\nvar Document = function(text) {\n    this.$lines = [];\n    if (text.length === 0) {\n        this.$lines = [\"\"];\n    } else if (Array.isArray(text)) {\n        this._insertLines(0, text);\n    } else {\n        this.insert({row: 0, column:0}, text);\n    }\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setValue = function(text) {\n        var len = this.getLength();\n        this.remove(new Range(0, 0, len, this.getLine(len-1).length));\n        this.insert({row: 0, column:0}, text);\n    };\n    this.getValue = function() {\n        return this.getAllLines().join(this.getNewLineCharacter());\n    };\n    this.createAnchor = function(row, column) {\n        return new Anchor(this, row, column);\n    };\n    if (\"aaa\".split(/a/).length === 0)\n        this.$split = function(text) {\n            return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n        };\n    else\n        this.$split = function(text) {\n            return text.split(/\\r\\n|\\r|\\n/);\n        };\n\n\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n        this.$autoNewLine = match ? match[1] : \"\\n\";\n        this._signal(\"changeNewLineMode\");\n    };\n    this.getNewLineCharacter = function() {\n        switch (this.$newLineMode) {\n          case \"windows\":\n            return \"\\r\\n\";\n          case \"unix\":\n            return \"\\n\";\n          default:\n            return this.$autoNewLine || \"\\n\";\n        }\n    };\n\n    this.$autoNewLine = \"\";\n    this.$newLineMode = \"auto\";\n    this.setNewLineMode = function(newLineMode) {\n        if (this.$newLineMode === newLineMode)\n            return;\n\n        this.$newLineMode = newLineMode;\n        this._signal(\"changeNewLineMode\");\n    };\n    this.getNewLineMode = function() {\n        return this.$newLineMode;\n    };\n    this.isNewLine = function(text) {\n        return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n    };\n    this.getLine = function(row) {\n        return this.$lines[row] || \"\";\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.$lines.slice(firstRow, lastRow + 1);\n    };\n    this.getAllLines = function() {\n        return this.getLines(0, this.getLength());\n    };\n    this.getLength = function() {\n        return this.$lines.length;\n    };\n    this.getTextRange = function(range) {\n        if (range.start.row == range.end.row) {\n            return this.getLine(range.start.row)\n                .substring(range.start.column, range.end.column);\n        }\n        var lines = this.getLines(range.start.row, range.end.row);\n        lines[0] = (lines[0] || \"\").substring(range.start.column);\n        var l = lines.length - 1;\n        if (range.end.row - range.start.row == l)\n            lines[l] = lines[l].substring(0, range.end.column);\n        return lines.join(this.getNewLineCharacter());\n    };\n\n    this.$clipPosition = function(position) {\n        var length = this.getLength();\n        if (position.row >= length) {\n            position.row = Math.max(0, length - 1);\n            position.column = this.getLine(length-1).length;\n        } else if (position.row < 0)\n            position.row = 0;\n        return position;\n    };\n    this.insert = function(position, text) {\n        if (!text || text.length === 0)\n            return position;\n\n        position = this.$clipPosition(position);\n        if (this.getLength() <= 1)\n            this.$detectNewLine(text);\n\n        var lines = this.$split(text);\n        var firstLine = lines.splice(0, 1)[0];\n        var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];\n\n        position = this.insertInLine(position, firstLine);\n        if (lastLine !== null) {\n            position = this.insertNewLine(position); // terminate first line\n            position = this._insertLines(position.row, lines);\n            position = this.insertInLine(position, lastLine || \"\");\n        }\n        return position;\n    };\n    this.insertLines = function(row, lines) {\n        if (row >= this.getLength())\n            return this.insert({row: row, column: 0}, \"\\n\" + lines.join(\"\\n\"));\n        return this._insertLines(Math.max(row, 0), lines);\n    };\n    this._insertLines = function(row, lines) {\n        if (lines.length == 0)\n            return {row: row, column: 0};\n        while (lines.length > 0xF000) {\n            var end = this._insertLines(row, lines.slice(0, 0xF000));\n            lines = lines.slice(0xF000);\n            row = end.row;\n        }\n\n        var args = [row, 0];\n        args.push.apply(args, lines);\n        this.$lines.splice.apply(this.$lines, args);\n\n        var range = new Range(row, 0, row + lines.length, 0);\n        var delta = {\n            action: \"insertLines\",\n            range: range,\n            lines: lines\n        };\n        this._signal(\"change\", { data: delta });\n        return range.end;\n    };\n    this.insertNewLine = function(position) {\n        position = this.$clipPosition(position);\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column);\n        this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));\n\n        var end = {\n            row : position.row + 1,\n            column : 0\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: this.getNewLineCharacter()\n        };\n        this._signal(\"change\", { data: delta });\n\n        return end;\n    };\n    this.insertInLine = function(position, text) {\n        if (text.length == 0)\n            return position;\n\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column) + text\n                + line.substring(position.column);\n\n        var end = {\n            row : position.row,\n            column : position.column + text.length\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: text\n        };\n        this._signal(\"change\", { data: delta });\n\n        return end;\n    };\n    this.remove = function(range) {\n        if (!(range instanceof Range))\n            range = Range.fromPoints(range.start, range.end);\n        range.start = this.$clipPosition(range.start);\n        range.end = this.$clipPosition(range.end);\n\n        if (range.isEmpty())\n            return range.start;\n\n        var firstRow = range.start.row;\n        var lastRow = range.end.row;\n\n        if (range.isMultiLine()) {\n            var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;\n            var lastFullRow = lastRow - 1;\n\n            if (range.end.column > 0)\n                this.removeInLine(lastRow, 0, range.end.column);\n\n            if (lastFullRow >= firstFullRow)\n                this._removeLines(firstFullRow, lastFullRow);\n\n            if (firstFullRow != firstRow) {\n                this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);\n                this.removeNewLine(range.start.row);\n            }\n        }\n        else {\n            this.removeInLine(firstRow, range.start.column, range.end.column);\n        }\n        return range.start;\n    };\n    this.removeInLine = function(row, startColumn, endColumn) {\n        if (startColumn == endColumn)\n            return;\n\n        var range = new Range(row, startColumn, row, endColumn);\n        var line = this.getLine(row);\n        var removed = line.substring(startColumn, endColumn);\n        var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);\n        this.$lines.splice(row, 1, newLine);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: removed\n        };\n        this._signal(\"change\", { data: delta });\n        return range.start;\n    };\n    this.removeLines = function(firstRow, lastRow) {\n        if (firstRow < 0 || lastRow >= this.getLength())\n            return this.remove(new Range(firstRow, 0, lastRow + 1, 0));\n        return this._removeLines(firstRow, lastRow);\n    };\n\n    this._removeLines = function(firstRow, lastRow) {\n        var range = new Range(firstRow, 0, lastRow + 1, 0);\n        var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);\n\n        var delta = {\n            action: \"removeLines\",\n            range: range,\n            nl: this.getNewLineCharacter(),\n            lines: removed\n        };\n        this._signal(\"change\", { data: delta });\n        return removed;\n    };\n    this.removeNewLine = function(row) {\n        var firstLine = this.getLine(row);\n        var secondLine = this.getLine(row+1);\n\n        var range = new Range(row, firstLine.length, row+1, 0);\n        var line = firstLine + secondLine;\n\n        this.$lines.splice(row, 2, line);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: this.getNewLineCharacter()\n        };\n        this._signal(\"change\", { data: delta });\n    };\n    this.replace = function(range, text) {\n        if (!(range instanceof Range))\n            range = Range.fromPoints(range.start, range.end);\n        if (text.length == 0 && range.isEmpty())\n            return range.start;\n        if (text == this.getTextRange(range))\n            return range.end;\n\n        this.remove(range);\n        if (text) {\n            var end = this.insert(range.start, text);\n        }\n        else {\n            end = range.start;\n        }\n\n        return end;\n    };\n    this.applyDeltas = function(deltas) {\n        for (var i=0; i<deltas.length; i++) {\n            var delta = deltas[i];\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"insertText\")\n                this.insert(range.start, delta.text);\n            else if (delta.action == \"removeLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"removeText\")\n                this.remove(range);\n        }\n    };\n    this.revertDeltas = function(deltas) {\n        for (var i=deltas.length-1; i>=0; i--) {\n            var delta = deltas[i];\n\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"insertText\")\n                this.remove(range);\n            else if (delta.action == \"removeLines\")\n                this._insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"removeText\")\n                this.insert(range.start, delta.text);\n        }\n    };\n    this.indexToPosition = function(index, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        for (var i = startRow || 0, l = lines.length; i < l; i++) {\n            index -= lines[i].length + newlineLength;\n            if (index < 0)\n                return {row: i, column: index + lines[i].length + newlineLength};\n        }\n        return {row: l-1, column: lines[l-1].length};\n    };\n    this.positionToIndex = function(pos, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        var index = 0;\n        var row = Math.min(pos.row, lines.length);\n        for (var i = startRow || 0; i < row; ++i)\n            index += lines[i].length + newlineLength;\n\n        return index + pos.column;\n    };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\nace.define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.last = function(a) {\n    return a[a.length - 1];\n};\n\nexports.stringReverse = function(string) {\n    return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n    var result = '';\n    while (count > 0) {\n        if (count & 1)\n            result += string;\n\n        if (count >>= 1)\n            string += string;\n    }\n    return result;\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n    return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n    return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n    var copy = {};\n    for (var key in obj) {\n        copy[key] = obj[key];\n    }\n    return copy;\n};\n\nexports.copyArray = function(array){\n    var copy = [];\n    for (var i=0, l=array.length; i<l; i++) {\n        if (array[i] && typeof array[i] == \"object\")\n            copy[i] = this.copyObject( array[i] );\n        else \n            copy[i] = array[i];\n    }\n    return copy;\n};\n\nexports.deepCopy = function (obj) {\n    if (typeof obj !== \"object\" || !obj)\n        return obj;\n    var cons = obj.constructor;\n    if (cons === RegExp)\n        return obj;\n    \n    var copy = cons();\n    for (var key in obj) {\n        if (typeof obj[key] === \"object\") {\n            copy[key] = exports.deepCopy(obj[key]);\n        } else {\n            copy[key] = obj[key];\n        }\n    }\n    return copy;\n};\n\nexports.arrayToMap = function(arr) {\n    var map = {};\n    for (var i=0; i<arr.length; i++) {\n        map[arr[i]] = 1;\n    }\n    return map;\n\n};\n\nexports.createMap = function(props) {\n    var map = Object.create(null);\n    for (var i in props) {\n        map[i] = props[i];\n    }\n    return map;\n};\nexports.arrayRemove = function(array, value) {\n  for (var i = 0; i <= array.length; i++) {\n    if (value === array[i]) {\n      array.splice(i, 1);\n    }\n  }\n};\n\nexports.escapeRegExp = function(str) {\n    return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n};\n\nexports.escapeHTML = function(str) {\n    return str.replace(/&/g, \"&#38;\").replace(/\"/g, \"&#34;\").replace(/'/g, \"&#39;\").replace(/</g, \"&#60;\");\n};\n\nexports.getMatchOffsets = function(string, regExp) {\n    var matches = [];\n\n    string.replace(regExp, function(str) {\n        matches.push({\n            offset: arguments[arguments.length-2],\n            length: str.length\n        });\n    });\n\n    return matches;\n};\nexports.deferredCall = function(fcn) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var deferred = function(timeout) {\n        deferred.cancel();\n        timer = setTimeout(callback, timeout || 0);\n        return deferred;\n    };\n\n    deferred.schedule = deferred;\n\n    deferred.call = function() {\n        this.cancel();\n        fcn();\n        return deferred;\n    };\n\n    deferred.cancel = function() {\n        clearTimeout(timer);\n        timer = null;\n        return deferred;\n    };\n    \n    deferred.isPending = function() {\n        return timer;\n    };\n\n    return deferred;\n};\n\n\nexports.delayedCall = function(fcn, defaultTimeout) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var _self = function(timeout) {\n        if (timer == null)\n            timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n\n    _self.delay = function(timeout) {\n        timer && clearTimeout(timer);\n        timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n    _self.schedule = _self;\n\n    _self.call = function() {\n        this.cancel();\n        fcn();\n    };\n\n    _self.cancel = function() {\n        timer && clearTimeout(timer);\n        timer = null;\n    };\n\n    _self.isPending = function() {\n        return timer;\n    };\n\n    return _self;\n};\n});\n\nace.define(\"ace/worker/mirror\",[\"require\",\"exports\",\"module\",\"ace/document\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar Document = require(\"../document\").Document;\nvar lang = require(\"../lib/lang\");\n    \nvar Mirror = exports.Mirror = function(sender) {\n    this.sender = sender;\n    var doc = this.doc = new Document(\"\");\n    \n    var deferredUpdate = this.deferredUpdate = lang.delayedCall(this.onUpdate.bind(this));\n    \n    var _self = this;\n    sender.on(\"change\", function(e) {\n        doc.applyDeltas(e.data);\n        if (_self.$timeout)\n            return deferredUpdate.schedule(_self.$timeout);\n        _self.onUpdate();\n    });\n};\n\n(function() {\n    \n    this.$timeout = 500;\n    \n    this.setTimeout = function(timeout) {\n        this.$timeout = timeout;\n    };\n    \n    this.setValue = function(value) {\n        this.doc.setValue(value);\n        this.deferredUpdate.schedule(this.$timeout);\n    };\n    \n    this.getValue = function(callbackId) {\n        this.sender.callback(this.doc.getValue(), callbackId);\n    };\n    \n    this.onUpdate = function() {\n    };\n    \n    this.isPending = function() {\n        return this.deferredUpdate.isPending();\n    };\n    \n}).call(Mirror.prototype);\n\n});\n\nace.define(\"ace/mode/coffee/rewriter\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\n  var BALANCED_PAIRS, CALL_CLOSERS, EXPRESSION_CLOSE, EXPRESSION_END, EXPRESSION_START, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, IMPLICIT_UNSPACED_CALL, INVERSES, LINEBREAKS, SINGLE_CLOSERS, SINGLE_LINERS, generate, left, rite, _i, _len, _ref,\n    __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; },\n    __slice = [].slice;\n\n  generate = function(tag, value) {\n    var tok;\n    tok = [tag, value];\n    tok.generated = true;\n    return tok;\n  };\n\n  exports.Rewriter = (function() {\n    function Rewriter() {}\n\n    Rewriter.prototype.rewrite = function(tokens) {\n      this.tokens = tokens;\n      this.removeLeadingNewlines();\n      this.closeOpenCalls();\n      this.closeOpenIndexes();\n      this.normalizeLines();\n      this.tagPostfixConditionals();\n      this.addImplicitBracesAndParens();\n      this.addLocationDataToGeneratedTokens();\n      return this.tokens;\n    };\n\n    Rewriter.prototype.scanTokens = function(block) {\n      var i, token, tokens;\n      tokens = this.tokens;\n      i = 0;\n      while (token = tokens[i]) {\n        i += block.call(this, token, i, tokens);\n      }\n      return true;\n    };\n\n    Rewriter.prototype.detectEnd = function(i, condition, action) {\n      var levels, token, tokens, _ref, _ref1;\n      tokens = this.tokens;\n      levels = 0;\n      while (token = tokens[i]) {\n        if (levels === 0 && condition.call(this, token, i)) {\n          return action.call(this, token, i);\n        }\n        if (!token || levels < 0) {\n          return action.call(this, token, i - 1);\n        }\n        if (_ref = token[0], __indexOf.call(EXPRESSION_START, _ref) >= 0) {\n          levels += 1;\n        } else if (_ref1 = token[0], __indexOf.call(EXPRESSION_END, _ref1) >= 0) {\n          levels -= 1;\n        }\n        i += 1;\n      }\n      return i - 1;\n    };\n\n    Rewriter.prototype.removeLeadingNewlines = function() {\n      var i, tag, _i, _len, _ref;\n      _ref = this.tokens;\n      for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {\n        tag = _ref[i][0];\n        if (tag !== 'TERMINATOR') {\n          break;\n        }\n      }\n      if (i) {\n        return this.tokens.splice(0, i);\n      }\n    };\n\n    Rewriter.prototype.closeOpenCalls = function() {\n      var action, condition;\n      condition = function(token, i) {\n        var _ref;\n        return ((_ref = token[0]) === ')' || _ref === 'CALL_END') || token[0] === 'OUTDENT' && this.tag(i - 1) === ')';\n      };\n      action = function(token, i) {\n        return this.tokens[token[0] === 'OUTDENT' ? i - 1 : i][0] = 'CALL_END';\n      };\n      return this.scanTokens(function(token, i) {\n        if (token[0] === 'CALL_START') {\n          this.detectEnd(i + 1, condition, action);\n        }\n        return 1;\n      });\n    };\n\n    Rewriter.prototype.closeOpenIndexes = function() {\n      var action, condition;\n      condition = function(token, i) {\n        var _ref;\n        return (_ref = token[0]) === ']' || _ref === 'INDEX_END';\n      };\n      action = function(token, i) {\n        return token[0] = 'INDEX_END';\n      };\n      return this.scanTokens(function(token, i) {\n        if (token[0] === 'INDEX_START') {\n          this.detectEnd(i + 1, condition, action);\n        }\n        return 1;\n      });\n    };\n\n    Rewriter.prototype.matchTags = function() {\n      var fuzz, i, j, pattern, _i, _ref, _ref1;\n      i = arguments[0], pattern = 2 <= arguments.length ? __slice.call(arguments, 1) : [];\n      fuzz = 0;\n      for (j = _i = 0, _ref = pattern.length; 0 <= _ref ? _i < _ref : _i > _ref; j = 0 <= _ref ? ++_i : --_i) {\n        while (this.tag(i + j + fuzz) === 'HERECOMMENT') {\n          fuzz += 2;\n        }\n        if (pattern[j] == null) {\n          continue;\n        }\n        if (typeof pattern[j] === 'string') {\n          pattern[j] = [pattern[j]];\n        }\n        if (_ref1 = this.tag(i + j + fuzz), __indexOf.call(pattern[j], _ref1) < 0) {\n          return false;\n        }\n      }\n      return true;\n    };\n\n    Rewriter.prototype.looksObjectish = function(j) {\n      return this.matchTags(j, '@', null, ':') || this.matchTags(j, null, ':');\n    };\n\n    Rewriter.prototype.findTagsBackwards = function(i, tags) {\n      var backStack, _ref, _ref1, _ref2, _ref3, _ref4, _ref5;\n      backStack = [];\n      while (i >= 0 && (backStack.length || (_ref2 = this.tag(i), __indexOf.call(tags, _ref2) < 0) && ((_ref3 = this.tag(i), __indexOf.call(EXPRESSION_START, _ref3) < 0) || this.tokens[i].generated) && (_ref4 = this.tag(i), __indexOf.call(LINEBREAKS, _ref4) < 0))) {\n        if (_ref = this.tag(i), __indexOf.call(EXPRESSION_END, _ref) >= 0) {\n          backStack.push(this.tag(i));\n        }\n        if ((_ref1 = this.tag(i), __indexOf.call(EXPRESSION_START, _ref1) >= 0) && backStack.length) {\n          backStack.pop();\n        }\n        i -= 1;\n      }\n      return _ref5 = this.tag(i), __indexOf.call(tags, _ref5) >= 0;\n    };\n\n    Rewriter.prototype.addImplicitBracesAndParens = function() {\n      var stack;\n      stack = [];\n      return this.scanTokens(function(token, i, tokens) {\n        var endAllImplicitCalls, endImplicitCall, endImplicitObject, forward, inImplicit, inImplicitCall, inImplicitControl, inImplicitObject, nextTag, offset, prevTag, prevToken, s, sameLine, stackIdx, stackTag, stackTop, startIdx, startImplicitCall, startImplicitObject, startsLine, tag, _ref, _ref1, _ref2, _ref3, _ref4, _ref5;\n        tag = token[0];\n        prevTag = (prevToken = i > 0 ? tokens[i - 1] : [])[0];\n        nextTag = (i < tokens.length - 1 ? tokens[i + 1] : [])[0];\n        stackTop = function() {\n          return stack[stack.length - 1];\n        };\n        startIdx = i;\n        forward = function(n) {\n          return i - startIdx + n;\n        };\n        inImplicit = function() {\n          var _ref, _ref1;\n          return (_ref = stackTop()) != null ? (_ref1 = _ref[2]) != null ? _ref1.ours : void 0 : void 0;\n        };\n        inImplicitCall = function() {\n          var _ref;\n          return inImplicit() && ((_ref = stackTop()) != null ? _ref[0] : void 0) === '(';\n        };\n        inImplicitObject = function() {\n          var _ref;\n          return inImplicit() && ((_ref = stackTop()) != null ? _ref[0] : void 0) === '{';\n        };\n        inImplicitControl = function() {\n          var _ref;\n          return inImplicit && ((_ref = stackTop()) != null ? _ref[0] : void 0) === 'CONTROL';\n        };\n        startImplicitCall = function(j) {\n          var idx;\n          idx = j != null ? j : i;\n          stack.push([\n            '(', idx, {\n              ours: true\n            }\n          ]);\n          tokens.splice(idx, 0, generate('CALL_START', '('));\n          if (j == null) {\n            return i += 1;\n          }\n        };\n        endImplicitCall = function() {\n          stack.pop();\n          tokens.splice(i, 0, generate('CALL_END', ')'));\n          return i += 1;\n        };\n        endAllImplicitCalls = function() {\n          while (inImplicitCall()) {\n            endImplicitCall();\n          }\n        };\n        startImplicitObject = function(j, startsLine) {\n          var idx;\n          if (startsLine == null) {\n            startsLine = true;\n          }\n          idx = j != null ? j : i;\n          stack.push([\n            '{', idx, {\n              sameLine: true,\n              startsLine: startsLine,\n              ours: true\n            }\n          ]);\n          tokens.splice(idx, 0, generate('{', generate(new String('{'))));\n          if (j == null) {\n            return i += 1;\n          }\n        };\n        endImplicitObject = function(j) {\n          j = j != null ? j : i;\n          stack.pop();\n          tokens.splice(j, 0, generate('}', '}'));\n          return i += 1;\n        };\n        if (inImplicitCall() && (tag === 'IF' || tag === 'TRY' || tag === 'FINALLY' || tag === 'CATCH' || tag === 'CLASS' || tag === 'SWITCH')) {\n          stack.push([\n            'CONTROL', i, {\n              ours: true\n            }\n          ]);\n          return forward(1);\n        }\n        if (tag === 'INDENT' && inImplicit()) {\n          if (prevTag !== '=>' && prevTag !== '->' && prevTag !== '[' && prevTag !== '(' && prevTag !== ',' && prevTag !== '{' && prevTag !== 'TRY' && prevTag !== 'ELSE' && prevTag !== '=') {\n            while (inImplicitCall()) {\n              endImplicitCall();\n            }\n          }\n          if (inImplicitControl()) {\n            stack.pop();\n          }\n          stack.push([tag, i]);\n          return forward(1);\n        }\n        if (__indexOf.call(EXPRESSION_START, tag) >= 0) {\n          stack.push([tag, i]);\n          return forward(1);\n        }\n        if (__indexOf.call(EXPRESSION_END, tag) >= 0) {\n          while (inImplicit()) {\n            if (inImplicitCall()) {\n              endImplicitCall();\n            } else if (inImplicitObject()) {\n              endImplicitObject();\n            } else {\n              stack.pop();\n            }\n          }\n          stack.pop();\n        }\n        if ((__indexOf.call(IMPLICIT_FUNC, tag) >= 0 && token.spaced && !token.stringEnd || tag === '?' && i > 0 && !tokens[i - 1].spaced) && (__indexOf.call(IMPLICIT_CALL, nextTag) >= 0 || __indexOf.call(IMPLICIT_UNSPACED_CALL, nextTag) >= 0 && !((_ref = tokens[i + 1]) != null ? _ref.spaced : void 0) && !((_ref1 = tokens[i + 1]) != null ? _ref1.newLine : void 0))) {\n          if (tag === '?') {\n            tag = token[0] = 'FUNC_EXIST';\n          }\n          startImplicitCall(i + 1);\n          return forward(2);\n        }\n        if (__indexOf.call(IMPLICIT_FUNC, tag) >= 0 && this.matchTags(i + 1, 'INDENT', null, ':') && !this.findTagsBackwards(i, ['CLASS', 'EXTENDS', 'IF', 'CATCH', 'SWITCH', 'LEADING_WHEN', 'FOR', 'WHILE', 'UNTIL'])) {\n          startImplicitCall(i + 1);\n          stack.push(['INDENT', i + 2]);\n          return forward(3);\n        }\n        if (tag === ':') {\n          if (this.tag(i - 2) === '@') {\n            s = i - 2;\n          } else {\n            s = i - 1;\n          }\n          while (this.tag(s - 2) === 'HERECOMMENT') {\n            s -= 2;\n          }\n          startsLine = s === 0 || (_ref2 = this.tag(s - 1), __indexOf.call(LINEBREAKS, _ref2) >= 0) || tokens[s - 1].newLine;\n          if (stackTop()) {\n            _ref3 = stackTop(), stackTag = _ref3[0], stackIdx = _ref3[1];\n            if ((stackTag === '{' || stackTag === 'INDENT' && this.tag(stackIdx - 1) === '{') && (startsLine || this.tag(s - 1) === ',' || this.tag(s - 1) === '{')) {\n              return forward(1);\n            }\n          }\n          startImplicitObject(s, !!startsLine);\n          return forward(2);\n        }\n        if (inImplicitCall() && __indexOf.call(CALL_CLOSERS, tag) >= 0) {\n          if (prevTag === 'OUTDENT') {\n            endImplicitCall();\n            return forward(1);\n          }\n          if (prevToken.newLine) {\n            endAllImplicitCalls();\n            return forward(1);\n          }\n        }\n        if (inImplicitObject() && __indexOf.call(LINEBREAKS, tag) >= 0) {\n          stackTop()[2].sameLine = false;\n        }\n        if (__indexOf.call(IMPLICIT_END, tag) >= 0) {\n          while (inImplicit()) {\n            _ref4 = stackTop(), stackTag = _ref4[0], stackIdx = _ref4[1], (_ref5 = _ref4[2], sameLine = _ref5.sameLine, startsLine = _ref5.startsLine);\n            if (inImplicitCall() && prevTag !== ',') {\n              endImplicitCall();\n            } else if (inImplicitObject() && sameLine && !startsLine) {\n              endImplicitObject();\n            } else if (inImplicitObject() && tag === 'TERMINATOR' && prevTag !== ',' && !(startsLine && this.looksObjectish(i + 1))) {\n              endImplicitObject();\n            } else {\n              break;\n            }\n          }\n        }\n        if (tag === ',' && !this.looksObjectish(i + 1) && inImplicitObject() && (nextTag !== 'TERMINATOR' || !this.looksObjectish(i + 2))) {\n          offset = nextTag === 'OUTDENT' ? 1 : 0;\n          while (inImplicitObject()) {\n            endImplicitObject(i + offset);\n          }\n        }\n        return forward(1);\n      });\n    };\n\n    Rewriter.prototype.addLocationDataToGeneratedTokens = function() {\n      return this.scanTokens(function(token, i, tokens) {\n        var column, line, nextLocation, prevLocation, _ref, _ref1;\n        if (token[2]) {\n          return 1;\n        }\n        if (!(token.generated || token.explicit)) {\n          return 1;\n        }\n        if (token[0] === '{' && (nextLocation = (_ref = tokens[i + 1]) != null ? _ref[2] : void 0)) {\n          line = nextLocation.first_line, column = nextLocation.first_column;\n        } else if (prevLocation = (_ref1 = tokens[i - 1]) != null ? _ref1[2] : void 0) {\n          line = prevLocation.last_line, column = prevLocation.last_column;\n        } else {\n          line = column = 0;\n        }\n        token[2] = {\n          first_line: line,\n          first_column: column,\n          last_line: line,\n          last_column: column\n        };\n        return 1;\n      });\n    };\n\n    Rewriter.prototype.normalizeLines = function() {\n      var action, condition, indent, outdent, starter;\n      starter = indent = outdent = null;\n      condition = function(token, i) {\n        var _ref, _ref1, _ref2, _ref3;\n        return token[1] !== ';' && (_ref = token[0], __indexOf.call(SINGLE_CLOSERS, _ref) >= 0) && !(token[0] === 'TERMINATOR' && (_ref1 = this.tag(i + 1), __indexOf.call(EXPRESSION_CLOSE, _ref1) >= 0)) && !(token[0] === 'ELSE' && starter !== 'THEN') && !(((_ref2 = token[0]) === 'CATCH' || _ref2 === 'FINALLY') && (starter === '->' || starter === '=>')) || (_ref3 = token[0], __indexOf.call(CALL_CLOSERS, _ref3) >= 0) && this.tokens[i - 1].newLine;\n      };\n      action = function(token, i) {\n        return this.tokens.splice((this.tag(i - 1) === ',' ? i - 1 : i), 0, outdent);\n      };\n      return this.scanTokens(function(token, i, tokens) {\n        var j, tag, _i, _ref, _ref1, _ref2;\n        tag = token[0];\n        if (tag === 'TERMINATOR') {\n          if (this.tag(i + 1) === 'ELSE' && this.tag(i - 1) !== 'OUTDENT') {\n            tokens.splice.apply(tokens, [i, 1].concat(__slice.call(this.indentation())));\n            return 1;\n          }\n          if (_ref = this.tag(i + 1), __indexOf.call(EXPRESSION_CLOSE, _ref) >= 0) {\n            tokens.splice(i, 1);\n            return 0;\n          }\n        }\n        if (tag === 'CATCH') {\n          for (j = _i = 1; _i <= 2; j = ++_i) {\n            if (!((_ref1 = this.tag(i + j)) === 'OUTDENT' || _ref1 === 'TERMINATOR' || _ref1 === 'FINALLY')) {\n              continue;\n            }\n            tokens.splice.apply(tokens, [i + j, 0].concat(__slice.call(this.indentation())));\n            return 2 + j;\n          }\n        }\n        if (__indexOf.call(SINGLE_LINERS, tag) >= 0 && this.tag(i + 1) !== 'INDENT' && !(tag === 'ELSE' && this.tag(i + 1) === 'IF')) {\n          starter = tag;\n          _ref2 = this.indentation(true), indent = _ref2[0], outdent = _ref2[1];\n          if (starter === 'THEN') {\n            indent.fromThen = true;\n          }\n          tokens.splice(i + 1, 0, indent);\n          this.detectEnd(i + 2, condition, action);\n          if (tag === 'THEN') {\n            tokens.splice(i, 1);\n          }\n          return 1;\n        }\n        return 1;\n      });\n    };\n\n    Rewriter.prototype.tagPostfixConditionals = function() {\n      var action, condition, original;\n      original = null;\n      condition = function(token, i) {\n        var prevTag, tag;\n        tag = token[0];\n        prevTag = this.tokens[i - 1][0];\n        return tag === 'TERMINATOR' || (tag === 'INDENT' && __indexOf.call(SINGLE_LINERS, prevTag) < 0);\n      };\n      action = function(token, i) {\n        if (token[0] !== 'INDENT' || (token.generated && !token.fromThen)) {\n          return original[0] = 'POST_' + original[0];\n        }\n      };\n      return this.scanTokens(function(token, i) {\n        if (token[0] !== 'IF') {\n          return 1;\n        }\n        original = token;\n        this.detectEnd(i + 1, condition, action);\n        return 1;\n      });\n    };\n\n    Rewriter.prototype.indentation = function(implicit) {\n      var indent, outdent;\n      if (implicit == null) {\n        implicit = false;\n      }\n      indent = ['INDENT', 2];\n      outdent = ['OUTDENT', 2];\n      if (implicit) {\n        indent.generated = outdent.generated = true;\n      }\n      if (!implicit) {\n        indent.explicit = outdent.explicit = true;\n      }\n      return [indent, outdent];\n    };\n\n    Rewriter.prototype.generate = generate;\n\n    Rewriter.prototype.tag = function(i) {\n      var _ref;\n      return (_ref = this.tokens[i]) != null ? _ref[0] : void 0;\n    };\n\n    return Rewriter;\n\n  })();\n\n  BALANCED_PAIRS = [['(', ')'], ['[', ']'], ['{', '}'], ['INDENT', 'OUTDENT'], ['CALL_START', 'CALL_END'], ['PARAM_START', 'PARAM_END'], ['INDEX_START', 'INDEX_END']];\n\n  exports.INVERSES = INVERSES = {};\n\n  EXPRESSION_START = [];\n\n  EXPRESSION_END = [];\n\n  for (_i = 0, _len = BALANCED_PAIRS.length; _i < _len; _i++) {\n    _ref = BALANCED_PAIRS[_i], left = _ref[0], rite = _ref[1];\n    EXPRESSION_START.push(INVERSES[rite] = left);\n    EXPRESSION_END.push(INVERSES[left] = rite);\n  }\n\n  EXPRESSION_CLOSE = ['CATCH', 'THEN', 'ELSE', 'FINALLY'].concat(EXPRESSION_END);\n\n  IMPLICIT_FUNC = ['IDENTIFIER', 'SUPER', ')', 'CALL_END', ']', 'INDEX_END', '@', 'THIS'];\n\n  IMPLICIT_CALL = ['IDENTIFIER', 'NUMBER', 'STRING', 'JS', 'REGEX', 'NEW', 'PARAM_START', 'CLASS', 'IF', 'TRY', 'SWITCH', 'THIS', 'BOOL', 'NULL', 'UNDEFINED', 'UNARY', 'SUPER', 'THROW', '@', '->', '=>', '[', '(', '{', '--', '++'];\n\n  IMPLICIT_UNSPACED_CALL = ['+', '-'];\n\n  IMPLICIT_END = ['POST_IF', 'FOR', 'WHILE', 'UNTIL', 'WHEN', 'BY', 'LOOP', 'TERMINATOR'];\n\n  SINGLE_LINERS = ['ELSE', '->', '=>', 'TRY', 'FINALLY', 'THEN'];\n\n  SINGLE_CLOSERS = ['TERMINATOR', 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN'];\n\n  LINEBREAKS = ['TERMINATOR', 'INDENT', 'OUTDENT'];\n\n  CALL_CLOSERS = ['.', '?.', '::', '?::'];\n\n\n});\n\nace.define(\"ace/mode/coffee/helpers\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\n  var buildLocationData, extend, flatten, last, repeat, syntaxErrorToString, _ref;\n\n  exports.starts = function(string, literal, start) {\n    return literal === string.substr(start, literal.length);\n  };\n\n  exports.ends = function(string, literal, back) {\n    var len;\n    len = literal.length;\n    return literal === string.substr(string.length - len - (back || 0), len);\n  };\n\n  exports.repeat = repeat = function(str, n) {\n    var res;\n    res = '';\n    while (n > 0) {\n      if (n & 1) {\n        res += str;\n      }\n      n >>>= 1;\n      str += str;\n    }\n    return res;\n  };\n\n  exports.compact = function(array) {\n    var item, _i, _len, _results;\n    _results = [];\n    for (_i = 0, _len = array.length; _i < _len; _i++) {\n      item = array[_i];\n      if (item) {\n        _results.push(item);\n      }\n    }\n    return _results;\n  };\n\n  exports.count = function(string, substr) {\n    var num, pos;\n    num = pos = 0;\n    if (!substr.length) {\n      return 1 / 0;\n    }\n    while (pos = 1 + string.indexOf(substr, pos)) {\n      num++;\n    }\n    return num;\n  };\n\n  exports.merge = function(options, overrides) {\n    return extend(extend({}, options), overrides);\n  };\n\n  extend = exports.extend = function(object, properties) {\n    var key, val;\n    for (key in properties) {\n      val = properties[key];\n      object[key] = val;\n    }\n    return object;\n  };\n\n  exports.flatten = flatten = function(array) {\n    var element, flattened, _i, _len;\n    flattened = [];\n    for (_i = 0, _len = array.length; _i < _len; _i++) {\n      element = array[_i];\n      if (element instanceof Array) {\n        flattened = flattened.concat(flatten(element));\n      } else {\n        flattened.push(element);\n      }\n    }\n    return flattened;\n  };\n\n  exports.del = function(obj, key) {\n    var val;\n    val = obj[key];\n    delete obj[key];\n    return val;\n  };\n\n  exports.last = last = function(array, back) {\n    return array[array.length - (back || 0) - 1];\n  };\n\n  exports.some = (_ref = Array.prototype.some) != null ? _ref : function(fn) {\n    var e, _i, _len;\n    for (_i = 0, _len = this.length; _i < _len; _i++) {\n      e = this[_i];\n      if (fn(e)) {\n        return true;\n      }\n    }\n    return false;\n  };\n\n  exports.invertLiterate = function(code) {\n    var line, lines, maybe_code;\n    maybe_code = true;\n    lines = (function() {\n      var _i, _len, _ref1, _results;\n      _ref1 = code.split('\\n');\n      _results = [];\n      for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n        line = _ref1[_i];\n        if (maybe_code && /^([ ]{4}|[ ]{0,3}\\t)/.test(line)) {\n          _results.push(line);\n        } else if (maybe_code = /^\\s*$/.test(line)) {\n          _results.push(line);\n        } else {\n          _results.push('# ' + line);\n        }\n      }\n      return _results;\n    })();\n    return lines.join('\\n');\n  };\n\n  buildLocationData = function(first, last) {\n    if (!last) {\n      return first;\n    } else {\n      return {\n        first_line: first.first_line,\n        first_column: first.first_column,\n        last_line: last.last_line,\n        last_column: last.last_column\n      };\n    }\n  };\n\n  exports.addLocationDataFn = function(first, last) {\n    return function(obj) {\n      if (((typeof obj) === 'object') && (!!obj['updateLocationDataIfMissing'])) {\n        obj.updateLocationDataIfMissing(buildLocationData(first, last));\n      }\n      return obj;\n    };\n  };\n\n  exports.locationDataToString = function(obj) {\n    var locationData;\n    if ((\"2\" in obj) && (\"first_line\" in obj[2])) {\n      locationData = obj[2];\n    } else if (\"first_line\" in obj) {\n      locationData = obj;\n    }\n    if (locationData) {\n      return (\"\" + (locationData.first_line + 1) + \":\" + (locationData.first_column + 1) + \"-\") + (\"\" + (locationData.last_line + 1) + \":\" + (locationData.last_column + 1));\n    } else {\n      return \"No location data\";\n    }\n  };\n\n  exports.baseFileName = function(file, stripExt, useWinPathSep) {\n    var parts, pathSep;\n    if (stripExt == null) {\n      stripExt = false;\n    }\n    if (useWinPathSep == null) {\n      useWinPathSep = false;\n    }\n    pathSep = useWinPathSep ? /\\\\|\\// : /\\//;\n    parts = file.split(pathSep);\n    file = parts[parts.length - 1];\n    if (!(stripExt && file.indexOf('.') >= 0)) {\n      return file;\n    }\n    parts = file.split('.');\n    parts.pop();\n    if (parts[parts.length - 1] === 'coffee' && parts.length > 1) {\n      parts.pop();\n    }\n    return parts.join('.');\n  };\n\n  exports.isCoffee = function(file) {\n    return /\\.((lit)?coffee|coffee\\.md)$/.test(file);\n  };\n\n  exports.isLiterate = function(file) {\n    return /\\.(litcoffee|coffee\\.md)$/.test(file);\n  };\n\n  exports.throwSyntaxError = function(message, location) {\n    var error;\n    if (location.last_line == null) {\n      location.last_line = location.first_line;\n    }\n    if (location.last_column == null) {\n      location.last_column = location.first_column;\n    }\n    error = new SyntaxError(message);\n    error.location = location;\n    error.toString = syntaxErrorToString;\n    error.stack = error.toString();\n    throw error;\n  };\n\n  exports.updateSyntaxError = function(error, code, filename) {\n    if (error.toString === syntaxErrorToString) {\n      error.code || (error.code = code);\n      error.filename || (error.filename = filename);\n      error.stack = error.toString();\n    }\n    return error;\n  };\n\n  syntaxErrorToString = function() {\n    var codeLine, colorize, colorsEnabled, end, filename, first_column, first_line, last_column, last_line, marker, start, _ref1, _ref2;\n    if (!(this.code && this.location)) {\n      return Error.prototype.toString.call(this);\n    }\n    _ref1 = this.location, first_line = _ref1.first_line, first_column = _ref1.first_column, last_line = _ref1.last_line, last_column = _ref1.last_column;\n    if (last_line == null) {\n      last_line = first_line;\n    }\n    if (last_column == null) {\n      last_column = first_column;\n    }\n    filename = this.filename || '[stdin]';\n    codeLine = this.code.split('\\n')[first_line];\n    start = first_column;\n    end = first_line === last_line ? last_column + 1 : codeLine.length;\n    marker = repeat(' ', start) + repeat('^', end - start);\n    if (typeof process !== \"undefined\" && process !== null) {\n      colorsEnabled = process.stdout.isTTY && !process.env.NODE_DISABLE_COLORS;\n    }\n    if ((_ref2 = this.colorful) != null ? _ref2 : colorsEnabled) {\n      colorize = function(str) {\n        return \"\\x1B[1;31m\" + str + \"\\x1B[0m\";\n      };\n      codeLine = codeLine.slice(0, start) + colorize(codeLine.slice(start, end)) + codeLine.slice(end);\n      marker = colorize(marker);\n    }\n    return \"\" + filename + \":\" + (first_line + 1) + \":\" + (first_column + 1) + \": error: \" + this.message + \"\\n\" + codeLine + \"\\n\" + marker;\n  };\n\n\n});\n\nace.define(\"ace/mode/coffee/lexer\",[\"require\",\"exports\",\"module\",\"ace/mode/coffee/rewriter\",\"ace/mode/coffee/helpers\"], function(require, exports, module) {\n\n  var BOM, BOOL, CALLABLE, CODE, COFFEE_ALIASES, COFFEE_ALIAS_MAP, COFFEE_KEYWORDS, COMMENT, COMPARE, COMPOUND_ASSIGN, HEREDOC, HEREDOC_ILLEGAL, HEREDOC_INDENT, HEREGEX, HEREGEX_OMIT, IDENTIFIER, INDEXABLE, INVERSES, JSTOKEN, JS_FORBIDDEN, JS_KEYWORDS, LINE_BREAK, LINE_CONTINUER, LOGIC, Lexer, MATH, MULTILINER, MULTI_DENT, NOT_REGEX, NOT_SPACED_REGEX, NUMBER, OPERATOR, REGEX, RELATION, RESERVED, Rewriter, SHIFT, SIMPLESTR, STRICT_PROSCRIBED, TRAILING_SPACES, UNARY, WHITESPACE, compact, count, invertLiterate, key, last, locationDataToString, repeat, starts, throwSyntaxError, _ref, _ref1,\n    __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; };\n\n  _ref = require('./rewriter'), Rewriter = _ref.Rewriter, INVERSES = _ref.INVERSES;\n\n  _ref1 = require('./helpers'), count = _ref1.count, starts = _ref1.starts, compact = _ref1.compact, last = _ref1.last, repeat = _ref1.repeat, invertLiterate = _ref1.invertLiterate, locationDataToString = _ref1.locationDataToString, throwSyntaxError = _ref1.throwSyntaxError;\n\n  exports.Lexer = Lexer = (function() {\n    function Lexer() {}\n\n    Lexer.prototype.tokenize = function(code, opts) {\n      var consumed, i, tag, _ref2;\n      if (opts == null) {\n        opts = {};\n      }\n      this.literate = opts.literate;\n      this.indent = 0;\n      this.baseIndent = 0;\n      this.indebt = 0;\n      this.outdebt = 0;\n      this.indents = [];\n      this.ends = [];\n      this.tokens = [];\n      this.chunkLine = opts.line || 0;\n      this.chunkColumn = opts.column || 0;\n      code = this.clean(code);\n      i = 0;\n      while (this.chunk = code.slice(i)) {\n        consumed = this.identifierToken() || this.commentToken() || this.whitespaceToken() || this.lineToken() || this.heredocToken() || this.stringToken() || this.numberToken() || this.regexToken() || this.jsToken() || this.literalToken();\n        _ref2 = this.getLineAndColumnFromChunk(consumed), this.chunkLine = _ref2[0], this.chunkColumn = _ref2[1];\n        i += consumed;\n      }\n      this.closeIndentation();\n      if (tag = this.ends.pop()) {\n        this.error(\"missing \" + tag);\n      }\n      if (opts.rewrite === false) {\n        return this.tokens;\n      }\n      return (new Rewriter).rewrite(this.tokens);\n    };\n\n    Lexer.prototype.clean = function(code) {\n      if (code.charCodeAt(0) === BOM) {\n        code = code.slice(1);\n      }\n      code = code.replace(/\\r/g, '').replace(TRAILING_SPACES, '');\n      if (WHITESPACE.test(code)) {\n        code = \"\\n\" + code;\n        this.chunkLine--;\n      }\n      if (this.literate) {\n        code = invertLiterate(code);\n      }\n      return code;\n    };\n\n    Lexer.prototype.identifierToken = function() {\n      var colon, colonOffset, forcedIdentifier, id, idLength, input, match, poppedToken, prev, tag, tagToken, _ref2, _ref3, _ref4;\n      if (!(match = IDENTIFIER.exec(this.chunk))) {\n        return 0;\n      }\n      input = match[0], id = match[1], colon = match[2];\n      idLength = id.length;\n      poppedToken = void 0;\n      if (id === 'own' && this.tag() === 'FOR') {\n        this.token('OWN', id);\n        return id.length;\n      }\n      forcedIdentifier = colon || (prev = last(this.tokens)) && (((_ref2 = prev[0]) === '.' || _ref2 === '?.' || _ref2 === '::' || _ref2 === '?::') || !prev.spaced && prev[0] === '@');\n      tag = 'IDENTIFIER';\n      if (!forcedIdentifier && (__indexOf.call(JS_KEYWORDS, id) >= 0 || __indexOf.call(COFFEE_KEYWORDS, id) >= 0)) {\n        tag = id.toUpperCase();\n        if (tag === 'WHEN' && (_ref3 = this.tag(), __indexOf.call(LINE_BREAK, _ref3) >= 0)) {\n          tag = 'LEADING_WHEN';\n        } else if (tag === 'FOR') {\n          this.seenFor = true;\n        } else if (tag === 'UNLESS') {\n          tag = 'IF';\n        } else if (__indexOf.call(UNARY, tag) >= 0) {\n          tag = 'UNARY';\n        } else if (__indexOf.call(RELATION, tag) >= 0) {\n          if (tag !== 'INSTANCEOF' && this.seenFor) {\n            tag = 'FOR' + tag;\n            this.seenFor = false;\n          } else {\n            tag = 'RELATION';\n            if (this.value() === '!') {\n              poppedToken = this.tokens.pop();\n              id = '!' + id;\n            }\n          }\n        }\n      }\n      if (__indexOf.call(JS_FORBIDDEN, id) >= 0) {\n        if (forcedIdentifier) {\n          tag = 'IDENTIFIER';\n          id = new String(id);\n          id.reserved = true;\n        } else if (__indexOf.call(RESERVED, id) >= 0) {\n          this.error(\"reserved word \\\"\" + id + \"\\\"\");\n        }\n      }\n      if (!forcedIdentifier) {\n        if (__indexOf.call(COFFEE_ALIASES, id) >= 0) {\n          id = COFFEE_ALIAS_MAP[id];\n        }\n        tag = (function() {\n          switch (id) {\n            case '!':\n              return 'UNARY';\n            case '==':\n            case '!=':\n              return 'COMPARE';\n            case '&&':\n            case '||':\n              return 'LOGIC';\n            case 'true':\n            case 'false':\n              return 'BOOL';\n            case 'break':\n            case 'continue':\n              return 'STATEMENT';\n            default:\n              return tag;\n          }\n        })();\n      }\n      tagToken = this.token(tag, id, 0, idLength);\n      if (poppedToken) {\n        _ref4 = [poppedToken[2].first_line, poppedToken[2].first_column], tagToken[2].first_line = _ref4[0], tagToken[2].first_column = _ref4[1];\n      }\n      if (colon) {\n        colonOffset = input.lastIndexOf(':');\n        this.token(':', ':', colonOffset, colon.length);\n      }\n      return input.length;\n    };\n\n    Lexer.prototype.numberToken = function() {\n      var binaryLiteral, lexedLength, match, number, octalLiteral;\n      if (!(match = NUMBER.exec(this.chunk))) {\n        return 0;\n      }\n      number = match[0];\n      if (/^0[BOX]/.test(number)) {\n        this.error(\"radix prefix '\" + number + \"' must be lowercase\");\n      } else if (/E/.test(number) && !/^0x/.test(number)) {\n        this.error(\"exponential notation '\" + number + \"' must be indicated with a lowercase 'e'\");\n      } else if (/^0\\d*[89]/.test(number)) {\n        this.error(\"decimal literal '\" + number + \"' must not be prefixed with '0'\");\n      } else if (/^0\\d+/.test(number)) {\n        this.error(\"octal literal '\" + number + \"' must be prefixed with '0o'\");\n      }\n      lexedLength = number.length;\n      if (octalLiteral = /^0o([0-7]+)/.exec(number)) {\n        number = '0x' + parseInt(octalLiteral[1], 8).toString(16);\n      }\n      if (binaryLiteral = /^0b([01]+)/.exec(number)) {\n        number = '0x' + parseInt(binaryLiteral[1], 2).toString(16);\n      }\n      this.token('NUMBER', number, 0, lexedLength);\n      return lexedLength;\n    };\n\n    Lexer.prototype.stringToken = function() {\n      var octalEsc, quote, string, trimmed;\n      switch (quote = this.chunk.charAt(0)) {\n        case \"'\":\n          string = SIMPLESTR.exec(this.chunk)[0];\n          break;\n        case '\"':\n          string = this.balancedString(this.chunk, '\"');\n      }\n      if (!string) {\n        return 0;\n      }\n      trimmed = this.removeNewlines(string.slice(1, -1));\n      if (quote === '\"' && 0 < string.indexOf('#{', 1)) {\n        this.interpolateString(trimmed, {\n          strOffset: 1,\n          lexedLength: string.length\n        });\n      } else {\n        this.token('STRING', quote + this.escapeLines(trimmed) + quote, 0, string.length);\n      }\n      if (octalEsc = /^(?:\\\\.|[^\\\\])*\\\\(?:0[0-7]|[1-7])/.test(string)) {\n        this.error(\"octal escape sequences \" + string + \" are not allowed\");\n      }\n      return string.length;\n    };\n\n    Lexer.prototype.heredocToken = function() {\n      var doc, heredoc, match, quote;\n      if (!(match = HEREDOC.exec(this.chunk))) {\n        return 0;\n      }\n      heredoc = match[0];\n      quote = heredoc.charAt(0);\n      doc = this.sanitizeHeredoc(match[2], {\n        quote: quote,\n        indent: null\n      });\n      if (quote === '\"' && 0 <= doc.indexOf('#{')) {\n        this.interpolateString(doc, {\n          heredoc: true,\n          strOffset: 3,\n          lexedLength: heredoc.length\n        });\n      } else {\n        this.token('STRING', this.makeString(doc, quote, true), 0, heredoc.length);\n      }\n      return heredoc.length;\n    };\n\n    Lexer.prototype.commentToken = function() {\n      var comment, here, match;\n      if (!(match = this.chunk.match(COMMENT))) {\n        return 0;\n      }\n      comment = match[0], here = match[1];\n      if (here) {\n        this.token('HERECOMMENT', this.sanitizeHeredoc(here, {\n          herecomment: true,\n          indent: repeat(' ', this.indent)\n        }), 0, comment.length);\n      }\n      return comment.length;\n    };\n\n    Lexer.prototype.jsToken = function() {\n      var match, script;\n      if (!(this.chunk.charAt(0) === '`' && (match = JSTOKEN.exec(this.chunk)))) {\n        return 0;\n      }\n      this.token('JS', (script = match[0]).slice(1, -1), 0, script.length);\n      return script.length;\n    };\n\n    Lexer.prototype.regexToken = function() {\n      var flags, length, match, prev, regex, _ref2, _ref3;\n      if (this.chunk.charAt(0) !== '/') {\n        return 0;\n      }\n      if (match = HEREGEX.exec(this.chunk)) {\n        length = this.heregexToken(match);\n        return length;\n      }\n      prev = last(this.tokens);\n      if (prev && (_ref2 = prev[0], __indexOf.call((prev.spaced ? NOT_REGEX : NOT_SPACED_REGEX), _ref2) >= 0)) {\n        return 0;\n      }\n      if (!(match = REGEX.exec(this.chunk))) {\n        return 0;\n      }\n      _ref3 = match, match = _ref3[0], regex = _ref3[1], flags = _ref3[2];\n      if (regex.slice(0, 2) === '/*') {\n        this.error('regular expressions cannot begin with `*`');\n      }\n      if (regex === '//') {\n        regex = '/(?:)/';\n      }\n      this.token('REGEX', \"\" + regex + flags, 0, match.length);\n      return match.length;\n    };\n\n    Lexer.prototype.heregexToken = function(match) {\n      var body, flags, flagsOffset, heregex, plusToken, prev, re, tag, token, tokens, value, _i, _len, _ref2, _ref3, _ref4;\n      heregex = match[0], body = match[1], flags = match[2];\n      if (0 > body.indexOf('#{')) {\n        re = this.escapeLines(body.replace(HEREGEX_OMIT, '$1$2').replace(/\\//g, '\\\\/'), true);\n        if (re.match(/^\\*/)) {\n          this.error('regular expressions cannot begin with `*`');\n        }\n        this.token('REGEX', \"/\" + (re || '(?:)') + \"/\" + flags, 0, heregex.length);\n        return heregex.length;\n      }\n      this.token('IDENTIFIER', 'RegExp', 0, 0);\n      this.token('CALL_START', '(', 0, 0);\n      tokens = [];\n      _ref2 = this.interpolateString(body, {\n        regex: true\n      });\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        token = _ref2[_i];\n        tag = token[0], value = token[1];\n        if (tag === 'TOKENS') {\n          tokens.push.apply(tokens, value);\n        } else if (tag === 'NEOSTRING') {\n          if (!(value = value.replace(HEREGEX_OMIT, '$1$2'))) {\n            continue;\n          }\n          value = value.replace(/\\\\/g, '\\\\\\\\');\n          token[0] = 'STRING';\n          token[1] = this.makeString(value, '\"', true);\n          tokens.push(token);\n        } else {\n          this.error(\"Unexpected \" + tag);\n        }\n        prev = last(this.tokens);\n        plusToken = ['+', '+'];\n        plusToken[2] = prev[2];\n        tokens.push(plusToken);\n      }\n      tokens.pop();\n      if (((_ref3 = tokens[0]) != null ? _ref3[0] : void 0) !== 'STRING') {\n        this.token('STRING', '\"\"', 0, 0);\n        this.token('+', '+', 0, 0);\n      }\n      (_ref4 = this.tokens).push.apply(_ref4, tokens);\n      if (flags) {\n        flagsOffset = heregex.lastIndexOf(flags);\n        this.token(',', ',', flagsOffset, 0);\n        this.token('STRING', '\"' + flags + '\"', flagsOffset, flags.length);\n      }\n      this.token(')', ')', heregex.length - 1, 0);\n      return heregex.length;\n    };\n\n    Lexer.prototype.lineToken = function() {\n      var diff, indent, match, noNewlines, size;\n      if (!(match = MULTI_DENT.exec(this.chunk))) {\n        return 0;\n      }\n      indent = match[0];\n      this.seenFor = false;\n      size = indent.length - 1 - indent.lastIndexOf('\\n');\n      noNewlines = this.unfinished();\n      if (size - this.indebt === this.indent) {\n        if (noNewlines) {\n          this.suppressNewlines();\n        } else {\n          this.newlineToken(0);\n        }\n        return indent.length;\n      }\n      if (size > this.indent) {\n        if (noNewlines) {\n          this.indebt = size - this.indent;\n          this.suppressNewlines();\n          return indent.length;\n        }\n        if (!this.tokens.length) {\n          this.baseIndent = this.indent = size;\n          return indent.length;\n        }\n        diff = size - this.indent + this.outdebt;\n        this.token('INDENT', diff, indent.length - size, size);\n        this.indents.push(diff);\n        this.ends.push('OUTDENT');\n        this.outdebt = this.indebt = 0;\n      } else if (size < this.baseIndent) {\n        this.error('missing indentation', indent.length);\n      } else {\n        this.indebt = 0;\n        this.outdentToken(this.indent - size, noNewlines, indent.length);\n      }\n      this.indent = size;\n      return indent.length;\n    };\n\n    Lexer.prototype.outdentToken = function(moveOut, noNewlines, outdentLength) {\n      var dent, len;\n      while (moveOut > 0) {\n        len = this.indents.length - 1;\n        if (this.indents[len] === void 0) {\n          moveOut = 0;\n        } else if (this.indents[len] === this.outdebt) {\n          moveOut -= this.outdebt;\n          this.outdebt = 0;\n        } else if (this.indents[len] < this.outdebt) {\n          this.outdebt -= this.indents[len];\n          moveOut -= this.indents[len];\n        } else {\n          dent = this.indents.pop() + this.outdebt;\n          moveOut -= dent;\n          this.outdebt = 0;\n          this.pair('OUTDENT');\n          this.token('OUTDENT', dent, 0, outdentLength);\n        }\n      }\n      if (dent) {\n        this.outdebt -= moveOut;\n      }\n      while (this.value() === ';') {\n        this.tokens.pop();\n      }\n      if (!(this.tag() === 'TERMINATOR' || noNewlines)) {\n        this.token('TERMINATOR', '\\n', outdentLength, 0);\n      }\n      return this;\n    };\n\n    Lexer.prototype.whitespaceToken = function() {\n      var match, nline, prev;\n      if (!((match = WHITESPACE.exec(this.chunk)) || (nline = this.chunk.charAt(0) === '\\n'))) {\n        return 0;\n      }\n      prev = last(this.tokens);\n      if (prev) {\n        prev[match ? 'spaced' : 'newLine'] = true;\n      }\n      if (match) {\n        return match[0].length;\n      } else {\n        return 0;\n      }\n    };\n\n    Lexer.prototype.newlineToken = function(offset) {\n      while (this.value() === ';') {\n        this.tokens.pop();\n      }\n      if (this.tag() !== 'TERMINATOR') {\n        this.token('TERMINATOR', '\\n', offset, 0);\n      }\n      return this;\n    };\n\n    Lexer.prototype.suppressNewlines = function() {\n      if (this.value() === '\\\\') {\n        this.tokens.pop();\n      }\n      return this;\n    };\n\n    Lexer.prototype.literalToken = function() {\n      var match, prev, tag, value, _ref2, _ref3, _ref4, _ref5;\n      if (match = OPERATOR.exec(this.chunk)) {\n        value = match[0];\n        if (CODE.test(value)) {\n          this.tagParameters();\n        }\n      } else {\n        value = this.chunk.charAt(0);\n      }\n      tag = value;\n      prev = last(this.tokens);\n      if (value === '=' && prev) {\n        if (!prev[1].reserved && (_ref2 = prev[1], __indexOf.call(JS_FORBIDDEN, _ref2) >= 0)) {\n          this.error(\"reserved word \\\"\" + (this.value()) + \"\\\" can't be assigned\");\n        }\n        if ((_ref3 = prev[1]) === '||' || _ref3 === '&&') {\n          prev[0] = 'COMPOUND_ASSIGN';\n          prev[1] += '=';\n          return value.length;\n        }\n      }\n      if (value === ';') {\n        this.seenFor = false;\n        tag = 'TERMINATOR';\n      } else if (__indexOf.call(MATH, value) >= 0) {\n        tag = 'MATH';\n      } else if (__indexOf.call(COMPARE, value) >= 0) {\n        tag = 'COMPARE';\n      } else if (__indexOf.call(COMPOUND_ASSIGN, value) >= 0) {\n        tag = 'COMPOUND_ASSIGN';\n      } else if (__indexOf.call(UNARY, value) >= 0) {\n        tag = 'UNARY';\n      } else if (__indexOf.call(SHIFT, value) >= 0) {\n        tag = 'SHIFT';\n      } else if (__indexOf.call(LOGIC, value) >= 0 || value === '?' && (prev != null ? prev.spaced : void 0)) {\n        tag = 'LOGIC';\n      } else if (prev && !prev.spaced) {\n        if (value === '(' && (_ref4 = prev[0], __indexOf.call(CALLABLE, _ref4) >= 0)) {\n          if (prev[0] === '?') {\n            prev[0] = 'FUNC_EXIST';\n          }\n          tag = 'CALL_START';\n        } else if (value === '[' && (_ref5 = prev[0], __indexOf.call(INDEXABLE, _ref5) >= 0)) {\n          tag = 'INDEX_START';\n          switch (prev[0]) {\n            case '?':\n              prev[0] = 'INDEX_SOAK';\n          }\n        }\n      }\n      switch (value) {\n        case '(':\n        case '{':\n        case '[':\n          this.ends.push(INVERSES[value]);\n          break;\n        case ')':\n        case '}':\n        case ']':\n          this.pair(value);\n      }\n      this.token(tag, value);\n      return value.length;\n    };\n\n    Lexer.prototype.sanitizeHeredoc = function(doc, options) {\n      var attempt, herecomment, indent, match, _ref2;\n      indent = options.indent, herecomment = options.herecomment;\n      if (herecomment) {\n        if (HEREDOC_ILLEGAL.test(doc)) {\n          this.error(\"block comment cannot contain \\\"*/\\\", starting\");\n        }\n        if (doc.indexOf('\\n') < 0) {\n          return doc;\n        }\n      } else {\n        while (match = HEREDOC_INDENT.exec(doc)) {\n          attempt = match[1];\n          if (indent === null || (0 < (_ref2 = attempt.length) && _ref2 < indent.length)) {\n            indent = attempt;\n          }\n        }\n      }\n      if (indent) {\n        doc = doc.replace(RegExp(\"\\\\n\" + indent, \"g\"), '\\n');\n      }\n      if (!herecomment) {\n        doc = doc.replace(/^\\n/, '');\n      }\n      return doc;\n    };\n\n    Lexer.prototype.tagParameters = function() {\n      var i, stack, tok, tokens;\n      if (this.tag() !== ')') {\n        return this;\n      }\n      stack = [];\n      tokens = this.tokens;\n      i = tokens.length;\n      tokens[--i][0] = 'PARAM_END';\n      while (tok = tokens[--i]) {\n        switch (tok[0]) {\n          case ')':\n            stack.push(tok);\n            break;\n          case '(':\n          case 'CALL_START':\n            if (stack.length) {\n              stack.pop();\n            } else if (tok[0] === '(') {\n              tok[0] = 'PARAM_START';\n              return this;\n            } else {\n              return this;\n            }\n        }\n      }\n      return this;\n    };\n\n    Lexer.prototype.closeIndentation = function() {\n      return this.outdentToken(this.indent);\n    };\n\n    Lexer.prototype.balancedString = function(str, end) {\n      var continueCount, i, letter, match, prev, stack, _i, _ref2;\n      continueCount = 0;\n      stack = [end];\n      for (i = _i = 1, _ref2 = str.length; 1 <= _ref2 ? _i < _ref2 : _i > _ref2; i = 1 <= _ref2 ? ++_i : --_i) {\n        if (continueCount) {\n          --continueCount;\n          continue;\n        }\n        switch (letter = str.charAt(i)) {\n          case '\\\\':\n            ++continueCount;\n            continue;\n          case end:\n            stack.pop();\n            if (!stack.length) {\n              return str.slice(0, +i + 1 || 9e9);\n            }\n            end = stack[stack.length - 1];\n            continue;\n        }\n        if (end === '}' && (letter === '\"' || letter === \"'\")) {\n          stack.push(end = letter);\n        } else if (end === '}' && letter === '/' && (match = HEREGEX.exec(str.slice(i)) || REGEX.exec(str.slice(i)))) {\n          continueCount += match[0].length - 1;\n        } else if (end === '}' && letter === '{') {\n          stack.push(end = '}');\n        } else if (end === '\"' && prev === '#' && letter === '{') {\n          stack.push(end = '}');\n        }\n        prev = letter;\n      }\n      return this.error(\"missing \" + (stack.pop()) + \", starting\");\n    };\n\n    Lexer.prototype.interpolateString = function(str, options) {\n      var column, expr, heredoc, i, inner, interpolated, len, letter, lexedLength, line, locationToken, nested, offsetInChunk, pi, plusToken, popped, regex, rparen, strOffset, tag, token, tokens, value, _i, _len, _ref2, _ref3, _ref4;\n      if (options == null) {\n        options = {};\n      }\n      heredoc = options.heredoc, regex = options.regex, offsetInChunk = options.offsetInChunk, strOffset = options.strOffset, lexedLength = options.lexedLength;\n      offsetInChunk = offsetInChunk || 0;\n      strOffset = strOffset || 0;\n      lexedLength = lexedLength || str.length;\n      tokens = [];\n      pi = 0;\n      i = -1;\n      while (letter = str.charAt(i += 1)) {\n        if (letter === '\\\\') {\n          i += 1;\n          continue;\n        }\n        if (!(letter === '#' && str.charAt(i + 1) === '{' && (expr = this.balancedString(str.slice(i + 1), '}')))) {\n          continue;\n        }\n        if (pi < i) {\n          tokens.push(this.makeToken('NEOSTRING', str.slice(pi, i), strOffset + pi));\n        }\n        inner = expr.slice(1, -1);\n        if (inner.length) {\n          _ref2 = this.getLineAndColumnFromChunk(strOffset + i + 1), line = _ref2[0], column = _ref2[1];\n          nested = new Lexer().tokenize(inner, {\n            line: line,\n            column: column,\n            rewrite: false\n          });\n          popped = nested.pop();\n          if (((_ref3 = nested[0]) != null ? _ref3[0] : void 0) === 'TERMINATOR') {\n            popped = nested.shift();\n          }\n          if (len = nested.length) {\n            if (len > 1) {\n              nested.unshift(this.makeToken('(', '(', strOffset + i + 1, 0));\n              nested.push(this.makeToken(')', ')', strOffset + i + 1 + inner.length, 0));\n            }\n            tokens.push(['TOKENS', nested]);\n          }\n        }\n        i += expr.length;\n        pi = i + 1;\n      }\n      if ((i > pi && pi < str.length)) {\n        tokens.push(this.makeToken('NEOSTRING', str.slice(pi), strOffset + pi));\n      }\n      if (regex) {\n        return tokens;\n      }\n      if (!tokens.length) {\n        return this.token('STRING', '\"\"', offsetInChunk, lexedLength);\n      }\n      if (tokens[0][0] !== 'NEOSTRING') {\n        tokens.unshift(this.makeToken('NEOSTRING', '', offsetInChunk));\n      }\n      if (interpolated = tokens.length > 1) {\n        this.token('(', '(', offsetInChunk, 0);\n      }\n      for (i = _i = 0, _len = tokens.length; _i < _len; i = ++_i) {\n        token = tokens[i];\n        tag = token[0], value = token[1];\n        if (i) {\n          if (i) {\n            plusToken = this.token('+', '+');\n          }\n          locationToken = tag === 'TOKENS' ? value[0] : token;\n          plusToken[2] = {\n            first_line: locationToken[2].first_line,\n            first_column: locationToken[2].first_column,\n            last_line: locationToken[2].first_line,\n            last_column: locationToken[2].first_column\n          };\n        }\n        if (tag === 'TOKENS') {\n          (_ref4 = this.tokens).push.apply(_ref4, value);\n        } else if (tag === 'NEOSTRING') {\n          token[0] = 'STRING';\n          token[1] = this.makeString(value, '\"', heredoc);\n          this.tokens.push(token);\n        } else {\n          this.error(\"Unexpected \" + tag);\n        }\n      }\n      if (interpolated) {\n        rparen = this.makeToken(')', ')', offsetInChunk + lexedLength, 0);\n        rparen.stringEnd = true;\n        this.tokens.push(rparen);\n      }\n      return tokens;\n    };\n\n    Lexer.prototype.pair = function(tag) {\n      var size, wanted;\n      if (tag !== (wanted = last(this.ends))) {\n        if ('OUTDENT' !== wanted) {\n          this.error(\"unmatched \" + tag);\n        }\n        this.indent -= size = last(this.indents);\n        this.outdentToken(size, true);\n        return this.pair(tag);\n      }\n      return this.ends.pop();\n    };\n\n    Lexer.prototype.getLineAndColumnFromChunk = function(offset) {\n      var column, lineCount, lines, string;\n      if (offset === 0) {\n        return [this.chunkLine, this.chunkColumn];\n      }\n      if (offset >= this.chunk.length) {\n        string = this.chunk;\n      } else {\n        string = this.chunk.slice(0, +(offset - 1) + 1 || 9e9);\n      }\n      lineCount = count(string, '\\n');\n      column = this.chunkColumn;\n      if (lineCount > 0) {\n        lines = string.split('\\n');\n        column = last(lines).length;\n      } else {\n        column += string.length;\n      }\n      return [this.chunkLine + lineCount, column];\n    };\n\n    Lexer.prototype.makeToken = function(tag, value, offsetInChunk, length) {\n      var lastCharacter, locationData, token, _ref2, _ref3;\n      if (offsetInChunk == null) {\n        offsetInChunk = 0;\n      }\n      if (length == null) {\n        length = value.length;\n      }\n      locationData = {};\n      _ref2 = this.getLineAndColumnFromChunk(offsetInChunk), locationData.first_line = _ref2[0], locationData.first_column = _ref2[1];\n      lastCharacter = Math.max(0, length - 1);\n      _ref3 = this.getLineAndColumnFromChunk(offsetInChunk + lastCharacter), locationData.last_line = _ref3[0], locationData.last_column = _ref3[1];\n      token = [tag, value, locationData];\n      return token;\n    };\n\n    Lexer.prototype.token = function(tag, value, offsetInChunk, length) {\n      var token;\n      token = this.makeToken(tag, value, offsetInChunk, length);\n      this.tokens.push(token);\n      return token;\n    };\n\n    Lexer.prototype.tag = function(index, tag) {\n      var tok;\n      return (tok = last(this.tokens, index)) && (tag ? tok[0] = tag : tok[0]);\n    };\n\n    Lexer.prototype.value = function(index, val) {\n      var tok;\n      return (tok = last(this.tokens, index)) && (val ? tok[1] = val : tok[1]);\n    };\n\n    Lexer.prototype.unfinished = function() {\n      var _ref2;\n      return LINE_CONTINUER.test(this.chunk) || ((_ref2 = this.tag()) === '\\\\' || _ref2 === '.' || _ref2 === '?.' || _ref2 === '?::' || _ref2 === 'UNARY' || _ref2 === 'MATH' || _ref2 === '+' || _ref2 === '-' || _ref2 === 'SHIFT' || _ref2 === 'RELATION' || _ref2 === 'COMPARE' || _ref2 === 'LOGIC' || _ref2 === 'THROW' || _ref2 === 'EXTENDS');\n    };\n\n    Lexer.prototype.removeNewlines = function(str) {\n      return str.replace(/^\\s*\\n\\s*/, '').replace(/([^\\\\]|\\\\\\\\)\\s*\\n\\s*$/, '$1');\n    };\n\n    Lexer.prototype.escapeLines = function(str, heredoc) {\n      str = str.replace(/\\\\[^\\S\\n]*(\\n|\\\\)\\s*/g, function(escaped, character) {\n        if (character === '\\n') {\n          return '';\n        } else {\n          return escaped;\n        }\n      });\n      if (heredoc) {\n        return str.replace(MULTILINER, '\\\\n');\n      } else {\n        return str.replace(/\\s*\\n\\s*/g, ' ');\n      }\n    };\n\n    Lexer.prototype.makeString = function(body, quote, heredoc) {\n      if (!body) {\n        return quote + quote;\n      }\n      body = body.replace(RegExp(\"\\\\\\\\(\" + quote + \"|\\\\\\\\)\", \"g\"), function(match, contents) {\n        if (contents === quote) {\n          return contents;\n        } else {\n          return match;\n        }\n      });\n      body = body.replace(RegExp(\"\" + quote, \"g\"), '\\\\$&');\n      return quote + this.escapeLines(body, heredoc) + quote;\n    };\n\n    Lexer.prototype.error = function(message, offset) {\n      var first_column, first_line, _ref2;\n      if (offset == null) {\n        offset = 0;\n      }\n      _ref2 = this.getLineAndColumnFromChunk(offset), first_line = _ref2[0], first_column = _ref2[1];\n      return throwSyntaxError(message, {\n        first_line: first_line,\n        first_column: first_column\n      });\n    };\n\n    return Lexer;\n\n  })();\n\n  JS_KEYWORDS = ['true', 'false', 'null', 'this', 'new', 'delete', 'typeof', 'in', 'instanceof', 'return', 'throw', 'break', 'continue', 'debugger', 'if', 'else', 'switch', 'for', 'while', 'do', 'try', 'catch', 'finally', 'class', 'extends', 'super'];\n\n  COFFEE_KEYWORDS = ['undefined', 'then', 'unless', 'until', 'loop', 'of', 'by', 'when'];\n\n  COFFEE_ALIAS_MAP = {\n    and: '&&',\n    or: '||',\n    is: '==',\n    isnt: '!=',\n    not: '!',\n    yes: 'true',\n    no: 'false',\n    on: 'true',\n    off: 'false'\n  };\n\n  COFFEE_ALIASES = (function() {\n    var _results;\n    _results = [];\n    for (key in COFFEE_ALIAS_MAP) {\n      _results.push(key);\n    }\n    return _results;\n  })();\n\n  COFFEE_KEYWORDS = COFFEE_KEYWORDS.concat(COFFEE_ALIASES);\n\n  RESERVED = ['case', 'default', 'function', 'var', 'void', 'with', 'const', 'let', 'enum', 'export', 'import', 'native', '__hasProp', '__extends', '__slice', '__bind', '__indexOf', 'implements', 'interface', 'package', 'private', 'protected', 'public', 'static', 'yield'];\n\n  STRICT_PROSCRIBED = ['arguments', 'eval'];\n\n  JS_FORBIDDEN = JS_KEYWORDS.concat(RESERVED).concat(STRICT_PROSCRIBED);\n\n  exports.RESERVED = RESERVED.concat(JS_KEYWORDS).concat(COFFEE_KEYWORDS).concat(STRICT_PROSCRIBED);\n\n  exports.STRICT_PROSCRIBED = STRICT_PROSCRIBED;\n\n  BOM = 65279;\n\n  IDENTIFIER = /^([$A-Za-z_\\x7f-\\uffff][$\\w\\x7f-\\uffff]*)([^\\n\\S]*:(?!:))?/;\n\n  NUMBER = /^0b[01]+|^0o[0-7]+|^0x[\\da-f]+|^\\d*\\.?\\d+(?:e[+-]?\\d+)?/i;\n\n  HEREDOC = /^(\"\"\"|''')((?:\\\\[\\s\\S]|[^\\\\])*?)(?:\\n[^\\n\\S]*)?\\1/;\n\n  OPERATOR = /^(?:[-=]>|[-+*\\/%<>&|^!?=]=|>>>=?|([-+:])\\1|([&|<>])\\2=?|\\?(\\.|::)|\\.{2,3})/;\n\n  WHITESPACE = /^[^\\n\\S]+/;\n\n  COMMENT = /^###([^#][\\s\\S]*?)(?:###[^\\n\\S]*|###$)|^(?:\\s*#(?!##[^#]).*)+/;\n\n  CODE = /^[-=]>/;\n\n  MULTI_DENT = /^(?:\\n[^\\n\\S]*)+/;\n\n  SIMPLESTR = /^'[^\\\\']*(?:\\\\[\\s\\S][^\\\\']*)*'/;\n\n  JSTOKEN = /^`[^\\\\`]*(?:\\\\.[^\\\\`]*)*`/;\n\n  REGEX = /^(\\/(?![\\s=])[^[\\/\\n\\\\]*(?:(?:\\\\[\\s\\S]|\\[[^\\]\\n\\\\]*(?:\\\\[\\s\\S][^\\]\\n\\\\]*)*])[^[\\/\\n\\\\]*)*\\/)([imgy]{0,4})(?!\\w)/;\n\n  HEREGEX = /^\\/{3}((?:\\\\?[\\s\\S])+?)\\/{3}([imgy]{0,4})(?!\\w)/;\n\n  HEREGEX_OMIT = /((?:\\\\\\\\)+)|\\\\(\\s|\\/)|\\s+(?:#.*)?/g;\n\n  MULTILINER = /\\n/g;\n\n  HEREDOC_INDENT = /\\n+([^\\n\\S]*)/g;\n\n  HEREDOC_ILLEGAL = /\\*\\//;\n\n  LINE_CONTINUER = /^\\s*(?:,|\\??\\.(?![.\\d])|::)/;\n\n  TRAILING_SPACES = /\\s+$/;\n\n  COMPOUND_ASSIGN = ['-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>=', '&=', '^=', '|='];\n\n  UNARY = ['!', '~', 'NEW', 'TYPEOF', 'DELETE', 'DO'];\n\n  LOGIC = ['&&', '||', '&', '|', '^'];\n\n  SHIFT = ['<<', '>>', '>>>'];\n\n  COMPARE = ['==', '!=', '<', '>', '<=', '>='];\n\n  MATH = ['*', '/', '%'];\n\n  RELATION = ['IN', 'OF', 'INSTANCEOF'];\n\n  BOOL = ['TRUE', 'FALSE'];\n\n  NOT_REGEX = ['NUMBER', 'REGEX', 'BOOL', 'NULL', 'UNDEFINED', '++', '--'];\n\n  NOT_SPACED_REGEX = NOT_REGEX.concat(')', '}', 'THIS', 'IDENTIFIER', 'STRING', ']');\n\n  CALLABLE = ['IDENTIFIER', 'STRING', 'REGEX', ')', ']', '}', '?', '::', '@', 'THIS', 'SUPER'];\n\n  INDEXABLE = CALLABLE.concat('NUMBER', 'BOOL', 'NULL', 'UNDEFINED');\n\n  LINE_BREAK = ['INDENT', 'OUTDENT', 'TERMINATOR'];\n\n\n});\n\nace.define(\"ace/mode/coffee/parser\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\nvar parser = {trace: function trace() { },\nyy: {},\nsymbols_: {\"error\":2,\"Root\":3,\"Body\":4,\"Line\":5,\"TERMINATOR\":6,\"Expression\":7,\"Statement\":8,\"Return\":9,\"Comment\":10,\"STATEMENT\":11,\"Value\":12,\"Invocation\":13,\"Code\":14,\"Operation\":15,\"Assign\":16,\"If\":17,\"Try\":18,\"While\":19,\"For\":20,\"Switch\":21,\"Class\":22,\"Throw\":23,\"Block\":24,\"INDENT\":25,\"OUTDENT\":26,\"Identifier\":27,\"IDENTIFIER\":28,\"AlphaNumeric\":29,\"NUMBER\":30,\"STRING\":31,\"Literal\":32,\"JS\":33,\"REGEX\":34,\"DEBUGGER\":35,\"UNDEFINED\":36,\"NULL\":37,\"BOOL\":38,\"Assignable\":39,\"=\":40,\"AssignObj\":41,\"ObjAssignable\":42,\":\":43,\"ThisProperty\":44,\"RETURN\":45,\"HERECOMMENT\":46,\"PARAM_START\":47,\"ParamList\":48,\"PARAM_END\":49,\"FuncGlyph\":50,\"->\":51,\"=>\":52,\"OptComma\":53,\",\":54,\"Param\":55,\"ParamVar\":56,\"...\":57,\"Array\":58,\"Object\":59,\"Splat\":60,\"SimpleAssignable\":61,\"Accessor\":62,\"Parenthetical\":63,\"Range\":64,\"This\":65,\".\":66,\"?.\":67,\"::\":68,\"?::\":69,\"Index\":70,\"INDEX_START\":71,\"IndexValue\":72,\"INDEX_END\":73,\"INDEX_SOAK\":74,\"Slice\":75,\"{\":76,\"AssignList\":77,\"}\":78,\"CLASS\":79,\"EXTENDS\":80,\"OptFuncExist\":81,\"Arguments\":82,\"SUPER\":83,\"FUNC_EXIST\":84,\"CALL_START\":85,\"CALL_END\":86,\"ArgList\":87,\"THIS\":88,\"@\":89,\"[\":90,\"]\":91,\"RangeDots\":92,\"..\":93,\"Arg\":94,\"SimpleArgs\":95,\"TRY\":96,\"Catch\":97,\"FINALLY\":98,\"CATCH\":99,\"THROW\":100,\"(\":101,\")\":102,\"WhileSource\":103,\"WHILE\":104,\"WHEN\":105,\"UNTIL\":106,\"Loop\":107,\"LOOP\":108,\"ForBody\":109,\"FOR\":110,\"ForStart\":111,\"ForSource\":112,\"ForVariables\":113,\"OWN\":114,\"ForValue\":115,\"FORIN\":116,\"FOROF\":117,\"BY\":118,\"SWITCH\":119,\"Whens\":120,\"ELSE\":121,\"When\":122,\"LEADING_WHEN\":123,\"IfBlock\":124,\"IF\":125,\"POST_IF\":126,\"UNARY\":127,\"-\":128,\"+\":129,\"--\":130,\"++\":131,\"?\":132,\"MATH\":133,\"SHIFT\":134,\"COMPARE\":135,\"LOGIC\":136,\"RELATION\":137,\"COMPOUND_ASSIGN\":138,\"$accept\":0,\"$end\":1},\nterminals_: {2:\"error\",6:\"TERMINATOR\",11:\"STATEMENT\",25:\"INDENT\",26:\"OUTDENT\",28:\"IDENTIFIER\",30:\"NUMBER\",31:\"STRING\",33:\"JS\",34:\"REGEX\",35:\"DEBUGGER\",36:\"UNDEFINED\",37:\"NULL\",38:\"BOOL\",40:\"=\",43:\":\",45:\"RETURN\",46:\"HERECOMMENT\",47:\"PARAM_START\",49:\"PARAM_END\",51:\"->\",52:\"=>\",54:\",\",57:\"...\",66:\".\",67:\"?.\",68:\"::\",69:\"?::\",71:\"INDEX_START\",73:\"INDEX_END\",74:\"INDEX_SOAK\",76:\"{\",78:\"}\",79:\"CLASS\",80:\"EXTENDS\",83:\"SUPER\",84:\"FUNC_EXIST\",85:\"CALL_START\",86:\"CALL_END\",88:\"THIS\",89:\"@\",90:\"[\",91:\"]\",93:\"..\",96:\"TRY\",98:\"FINALLY\",99:\"CATCH\",100:\"THROW\",101:\"(\",102:\")\",104:\"WHILE\",105:\"WHEN\",106:\"UNTIL\",108:\"LOOP\",110:\"FOR\",114:\"OWN\",116:\"FORIN\",117:\"FOROF\",118:\"BY\",119:\"SWITCH\",121:\"ELSE\",123:\"LEADING_WHEN\",125:\"IF\",126:\"POST_IF\",127:\"UNARY\",128:\"-\",129:\"+\",130:\"--\",131:\"++\",132:\"?\",133:\"MATH\",134:\"SHIFT\",135:\"COMPARE\",136:\"LOGIC\",137:\"RELATION\",138:\"COMPOUND_ASSIGN\"},\nproductions_: [0,[3,0],[3,1],[4,1],[4,3],[4,2],[5,1],[5,1],[8,1],[8,1],[8,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[7,1],[24,2],[24,3],[27,1],[29,1],[29,1],[32,1],[32,1],[32,1],[32,1],[32,1],[32,1],[32,1],[16,3],[16,4],[16,5],[41,1],[41,3],[41,5],[41,1],[42,1],[42,1],[42,1],[9,2],[9,1],[10,1],[14,5],[14,2],[50,1],[50,1],[53,0],[53,1],[48,0],[48,1],[48,3],[48,4],[48,6],[55,1],[55,2],[55,3],[56,1],[56,1],[56,1],[56,1],[60,2],[61,1],[61,2],[61,2],[61,1],[39,1],[39,1],[39,1],[12,1],[12,1],[12,1],[12,1],[12,1],[62,2],[62,2],[62,2],[62,2],[62,1],[62,1],[70,3],[70,2],[72,1],[72,1],[59,4],[77,0],[77,1],[77,3],[77,4],[77,6],[22,1],[22,2],[22,3],[22,4],[22,2],[22,3],[22,4],[22,5],[13,3],[13,3],[13,1],[13,2],[81,0],[81,1],[82,2],[82,4],[65,1],[65,1],[44,2],[58,2],[58,4],[92,1],[92,1],[64,5],[75,3],[75,2],[75,2],[75,1],[87,1],[87,3],[87,4],[87,4],[87,6],[94,1],[94,1],[95,1],[95,3],[18,2],[18,3],[18,4],[18,5],[97,3],[97,3],[97,2],[23,2],[63,3],[63,5],[103,2],[103,4],[103,2],[103,4],[19,2],[19,2],[19,2],[19,1],[107,2],[107,2],[20,2],[20,2],[20,2],[109,2],[109,2],[111,2],[111,3],[115,1],[115,1],[115,1],[115,1],[113,1],[113,3],[112,2],[112,2],[112,4],[112,4],[112,4],[112,6],[112,6],[21,5],[21,7],[21,4],[21,6],[120,1],[120,2],[122,3],[122,4],[124,3],[124,5],[17,1],[17,3],[17,3],[17,3],[15,2],[15,2],[15,2],[15,2],[15,2],[15,2],[15,2],[15,2],[15,3],[15,3],[15,3],[15,3],[15,3],[15,3],[15,3],[15,3],[15,5],[15,4],[15,3]],\nperformAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {\n\nvar $0 = $$.length - 1;\nswitch (yystate) {\ncase 1:return this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Block);\nbreak;\ncase 2:return this.$ = $$[$0];\nbreak;\ncase 3:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(yy.Block.wrap([$$[$0]]));\nbreak;\ncase 4:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].push($$[$0]));\nbreak;\ncase 5:this.$ = $$[$0-1];\nbreak;\ncase 6:this.$ = $$[$0];\nbreak;\ncase 7:this.$ = $$[$0];\nbreak;\ncase 8:this.$ = $$[$0];\nbreak;\ncase 9:this.$ = $$[$0];\nbreak;\ncase 10:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Literal($$[$0]));\nbreak;\ncase 11:this.$ = $$[$0];\nbreak;\ncase 12:this.$ = $$[$0];\nbreak;\ncase 13:this.$ = $$[$0];\nbreak;\ncase 14:this.$ = $$[$0];\nbreak;\ncase 15:this.$ = $$[$0];\nbreak;\ncase 16:this.$ = $$[$0];\nbreak;\ncase 17:this.$ = $$[$0];\nbreak;\ncase 18:this.$ = $$[$0];\nbreak;\ncase 19:this.$ = $$[$0];\nbreak;\ncase 20:this.$ = $$[$0];\nbreak;\ncase 21:this.$ = $$[$0];\nbreak;\ncase 22:this.$ = $$[$0];\nbreak;\ncase 23:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Block);\nbreak;\ncase 24:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-1]);\nbreak;\ncase 25:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Literal($$[$0]));\nbreak;\ncase 26:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Literal($$[$0]));\nbreak;\ncase 27:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Literal($$[$0]));\nbreak;\ncase 28:this.$ = $$[$0];\nbreak;\ncase 29:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Literal($$[$0]));\nbreak;\ncase 30:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Literal($$[$0]));\nbreak;\ncase 31:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Literal($$[$0]));\nbreak;\ncase 32:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Undefined);\nbreak;\ncase 33:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Null);\nbreak;\ncase 34:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Bool($$[$0]));\nbreak;\ncase 35:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign($$[$0-2], $$[$0]));\nbreak;\ncase 36:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Assign($$[$0-3], $$[$0]));\nbreak;\ncase 37:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign($$[$0-4], $$[$0-1]));\nbreak;\ncase 38:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\nbreak;\ncase 39:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign(yy.addLocationDataFn(_$[$0-2])(new yy.Value($$[$0-2])), $$[$0], 'object'));\nbreak;\ncase 40:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign(yy.addLocationDataFn(_$[$0-4])(new yy.Value($$[$0-4])), $$[$0-1], 'object'));\nbreak;\ncase 41:this.$ = $$[$0];\nbreak;\ncase 42:this.$ = $$[$0];\nbreak;\ncase 43:this.$ = $$[$0];\nbreak;\ncase 44:this.$ = $$[$0];\nbreak;\ncase 45:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Return($$[$0]));\nbreak;\ncase 46:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Return);\nbreak;\ncase 47:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Comment($$[$0]));\nbreak;\ncase 48:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Code($$[$0-3], $$[$0], $$[$0-1]));\nbreak;\ncase 49:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Code([], $$[$0], $$[$0-1]));\nbreak;\ncase 50:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])('func');\nbreak;\ncase 51:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])('boundfunc');\nbreak;\ncase 52:this.$ = $$[$0];\nbreak;\ncase 53:this.$ = $$[$0];\nbreak;\ncase 54:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([]);\nbreak;\ncase 55:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([$$[$0]]);\nbreak;\ncase 56:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].concat($$[$0]));\nbreak;\ncase 57:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])($$[$0-3].concat($$[$0]));\nbreak;\ncase 58:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])($$[$0-5].concat($$[$0-2]));\nbreak;\ncase 59:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Param($$[$0]));\nbreak;\ncase 60:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Param($$[$0-1], null, true));\nbreak;\ncase 61:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Param($$[$0-2], $$[$0]));\nbreak;\ncase 62:this.$ = $$[$0];\nbreak;\ncase 63:this.$ = $$[$0];\nbreak;\ncase 64:this.$ = $$[$0];\nbreak;\ncase 65:this.$ = $$[$0];\nbreak;\ncase 66:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Splat($$[$0-1]));\nbreak;\ncase 67:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\nbreak;\ncase 68:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0-1].add($$[$0]));\nbreak;\ncase 69:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Value($$[$0-1], [].concat($$[$0])));\nbreak;\ncase 70:this.$ = $$[$0];\nbreak;\ncase 71:this.$ = $$[$0];\nbreak;\ncase 72:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\nbreak;\ncase 73:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\nbreak;\ncase 74:this.$ = $$[$0];\nbreak;\ncase 75:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\nbreak;\ncase 76:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\nbreak;\ncase 77:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\nbreak;\ncase 78:this.$ = $$[$0];\nbreak;\ncase 79:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Access($$[$0]));\nbreak;\ncase 80:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Access($$[$0], 'soak'));\nbreak;\ncase 81:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([yy.addLocationDataFn(_$[$0-1])(new yy.Access(new yy.Literal('prototype'))), yy.addLocationDataFn(_$[$0])(new yy.Access($$[$0]))]);\nbreak;\ncase 82:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([yy.addLocationDataFn(_$[$0-1])(new yy.Access(new yy.Literal('prototype'), 'soak')), yy.addLocationDataFn(_$[$0])(new yy.Access($$[$0]))]);\nbreak;\ncase 83:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Access(new yy.Literal('prototype')));\nbreak;\ncase 84:this.$ = $$[$0];\nbreak;\ncase 85:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-1]);\nbreak;\ncase 86:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(yy.extend($$[$0], {\n          soak: true\n        }));\nbreak;\ncase 87:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Index($$[$0]));\nbreak;\ncase 88:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Slice($$[$0]));\nbreak;\ncase 89:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Obj($$[$0-2], $$[$0-3].generated));\nbreak;\ncase 90:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([]);\nbreak;\ncase 91:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([$$[$0]]);\nbreak;\ncase 92:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].concat($$[$0]));\nbreak;\ncase 93:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])($$[$0-3].concat($$[$0]));\nbreak;\ncase 94:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])($$[$0-5].concat($$[$0-2]));\nbreak;\ncase 95:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Class);\nbreak;\ncase 96:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Class(null, null, $$[$0]));\nbreak;\ncase 97:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Class(null, $$[$0]));\nbreak;\ncase 98:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Class(null, $$[$0-1], $$[$0]));\nbreak;\ncase 99:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Class($$[$0]));\nbreak;\ncase 100:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Class($$[$0-1], null, $$[$0]));\nbreak;\ncase 101:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Class($$[$0-2], $$[$0]));\nbreak;\ncase 102:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Class($$[$0-3], $$[$0-1], $$[$0]));\nbreak;\ncase 103:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Call($$[$0-2], $$[$0], $$[$0-1]));\nbreak;\ncase 104:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Call($$[$0-2], $$[$0], $$[$0-1]));\nbreak;\ncase 105:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Call('super', [new yy.Splat(new yy.Literal('arguments'))]));\nbreak;\ncase 106:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Call('super', $$[$0]));\nbreak;\ncase 107:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(false);\nbreak;\ncase 108:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(true);\nbreak;\ncase 109:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([]);\nbreak;\ncase 110:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])($$[$0-2]);\nbreak;\ncase 111:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value(new yy.Literal('this')));\nbreak;\ncase 112:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value(new yy.Literal('this')));\nbreak;\ncase 113:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Value(yy.addLocationDataFn(_$[$0-1])(new yy.Literal('this')), [yy.addLocationDataFn(_$[$0])(new yy.Access($$[$0]))], 'this'));\nbreak;\ncase 114:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Arr([]));\nbreak;\ncase 115:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Arr($$[$0-2]));\nbreak;\ncase 116:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])('inclusive');\nbreak;\ncase 117:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])('exclusive');\nbreak;\ncase 118:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Range($$[$0-3], $$[$0-1], $$[$0-2]));\nbreak;\ncase 119:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Range($$[$0-2], $$[$0], $$[$0-1]));\nbreak;\ncase 120:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Range($$[$0-1], null, $$[$0]));\nbreak;\ncase 121:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Range(null, $$[$0], $$[$0-1]));\nbreak;\ncase 122:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Range(null, null, $$[$0]));\nbreak;\ncase 123:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([$$[$0]]);\nbreak;\ncase 124:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].concat($$[$0]));\nbreak;\ncase 125:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])($$[$0-3].concat($$[$0]));\nbreak;\ncase 126:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])($$[$0-2]);\nbreak;\ncase 127:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])($$[$0-5].concat($$[$0-2]));\nbreak;\ncase 128:this.$ = $$[$0];\nbreak;\ncase 129:this.$ = $$[$0];\nbreak;\ncase 130:this.$ = $$[$0];\nbreak;\ncase 131:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([].concat($$[$0-2], $$[$0]));\nbreak;\ncase 132:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Try($$[$0]));\nbreak;\ncase 133:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Try($$[$0-1], $$[$0][0], $$[$0][1]));\nbreak;\ncase 134:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Try($$[$0-2], null, null, $$[$0]));\nbreak;\ncase 135:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Try($$[$0-3], $$[$0-2][0], $$[$0-2][1], $$[$0]));\nbreak;\ncase 136:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([$$[$0-1], $$[$0]]);\nbreak;\ncase 137:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([yy.addLocationDataFn(_$[$0-1])(new yy.Value($$[$0-1])), $$[$0]]);\nbreak;\ncase 138:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])([null, $$[$0]]);\nbreak;\ncase 139:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Throw($$[$0]));\nbreak;\ncase 140:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Parens($$[$0-1]));\nbreak;\ncase 141:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Parens($$[$0-2]));\nbreak;\ncase 142:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While($$[$0]));\nbreak;\ncase 143:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.While($$[$0-2], {\n          guard: $$[$0]\n        }));\nbreak;\ncase 144:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While($$[$0], {\n          invert: true\n        }));\nbreak;\ncase 145:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.While($$[$0-2], {\n          invert: true,\n          guard: $$[$0]\n        }));\nbreak;\ncase 146:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0-1].addBody($$[$0]));\nbreak;\ncase 147:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0].addBody(yy.addLocationDataFn(_$[$0-1])(yy.Block.wrap([$$[$0-1]]))));\nbreak;\ncase 148:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0].addBody(yy.addLocationDataFn(_$[$0-1])(yy.Block.wrap([$$[$0-1]]))));\nbreak;\ncase 149:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])($$[$0]);\nbreak;\ncase 150:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While(yy.addLocationDataFn(_$[$0-1])(new yy.Literal('true'))).addBody($$[$0]));\nbreak;\ncase 151:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.While(yy.addLocationDataFn(_$[$0-1])(new yy.Literal('true'))).addBody(yy.addLocationDataFn(_$[$0])(yy.Block.wrap([$$[$0]]))));\nbreak;\ncase 152:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.For($$[$0-1], $$[$0]));\nbreak;\ncase 153:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.For($$[$0-1], $$[$0]));\nbreak;\ncase 154:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.For($$[$0], $$[$0-1]));\nbreak;\ncase 155:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({\n          source: yy.addLocationDataFn(_$[$0])(new yy.Value($$[$0]))\n        });\nbreak;\ncase 156:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])((function () {\n        $$[$0].own = $$[$0-1].own;\n        $$[$0].name = $$[$0-1][0];\n        $$[$0].index = $$[$0-1][1];\n        return $$[$0];\n      }()));\nbreak;\ncase 157:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0]);\nbreak;\ncase 158:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])((function () {\n        $$[$0].own = true;\n        return $$[$0];\n      }()));\nbreak;\ncase 159:this.$ = $$[$0];\nbreak;\ncase 160:this.$ = $$[$0];\nbreak;\ncase 161:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\nbreak;\ncase 162:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])(new yy.Value($$[$0]));\nbreak;\ncase 163:this.$ = yy.addLocationDataFn(_$[$0], _$[$0])([$$[$0]]);\nbreak;\ncase 164:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([$$[$0-2], $$[$0]]);\nbreak;\ncase 165:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({\n          source: $$[$0]\n        });\nbreak;\ncase 166:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])({\n          source: $$[$0],\n          object: true\n        });\nbreak;\ncase 167:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({\n          source: $$[$0-2],\n          guard: $$[$0]\n        });\nbreak;\ncase 168:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({\n          source: $$[$0-2],\n          guard: $$[$0],\n          object: true\n        });\nbreak;\ncase 169:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])({\n          source: $$[$0-2],\n          step: $$[$0]\n        });\nbreak;\ncase 170:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])({\n          source: $$[$0-4],\n          guard: $$[$0-2],\n          step: $$[$0]\n        });\nbreak;\ncase 171:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])({\n          source: $$[$0-4],\n          step: $$[$0-2],\n          guard: $$[$0]\n        });\nbreak;\ncase 172:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Switch($$[$0-3], $$[$0-1]));\nbreak;\ncase 173:this.$ = yy.addLocationDataFn(_$[$0-6], _$[$0])(new yy.Switch($$[$0-5], $$[$0-3], $$[$0-1]));\nbreak;\ncase 174:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Switch(null, $$[$0-1]));\nbreak;\ncase 175:this.$ = yy.addLocationDataFn(_$[$0-5], _$[$0])(new yy.Switch(null, $$[$0-3], $$[$0-1]));\nbreak;\ncase 176:this.$ = $$[$0];\nbreak;\ncase 177:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])($$[$0-1].concat($$[$0]));\nbreak;\ncase 178:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])([[$$[$0-1], $$[$0]]]);\nbreak;\ncase 179:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])([[$$[$0-2], $$[$0-1]]]);\nbreak;\ncase 180:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0-1], $$[$0], {\n          type: $$[$0-2]\n        }));\nbreak;\ncase 181:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])($$[$0-4].addElse(yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0-1], $$[$0], {\n          type: $$[$0-2]\n        }))));\nbreak;\ncase 182:this.$ = $$[$0];\nbreak;\ncase 183:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])($$[$0-2].addElse($$[$0]));\nbreak;\ncase 184:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0], yy.addLocationDataFn(_$[$0-2])(yy.Block.wrap([$$[$0-2]])), {\n          type: $$[$0-1],\n          statement: true\n        }));\nbreak;\ncase 185:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.If($$[$0], yy.addLocationDataFn(_$[$0-2])(yy.Block.wrap([$$[$0-2]])), {\n          type: $$[$0-1],\n          statement: true\n        }));\nbreak;\ncase 186:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op($$[$0-1], $$[$0]));\nbreak;\ncase 187:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('-', $$[$0]));\nbreak;\ncase 188:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('+', $$[$0]));\nbreak;\ncase 189:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('--', $$[$0]));\nbreak;\ncase 190:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('++', $$[$0]));\nbreak;\ncase 191:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('--', $$[$0-1], null, true));\nbreak;\ncase 192:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Op('++', $$[$0-1], null, true));\nbreak;\ncase 193:this.$ = yy.addLocationDataFn(_$[$0-1], _$[$0])(new yy.Existence($$[$0-1]));\nbreak;\ncase 194:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op('+', $$[$0-2], $$[$0]));\nbreak;\ncase 195:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op('-', $$[$0-2], $$[$0]));\nbreak;\ncase 196:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op($$[$0-1], $$[$0-2], $$[$0]));\nbreak;\ncase 197:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op($$[$0-1], $$[$0-2], $$[$0]));\nbreak;\ncase 198:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op($$[$0-1], $$[$0-2], $$[$0]));\nbreak;\ncase 199:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Op($$[$0-1], $$[$0-2], $$[$0]));\nbreak;\ncase 200:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])((function () {\n        if ($$[$0-1].charAt(0) === '!') {\n          return new yy.Op($$[$0-1].slice(1), $$[$0-2], $$[$0]).invert();\n        } else {\n          return new yy.Op($$[$0-1], $$[$0-2], $$[$0]);\n        }\n      }()));\nbreak;\ncase 201:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Assign($$[$0-2], $$[$0], $$[$0-1]));\nbreak;\ncase 202:this.$ = yy.addLocationDataFn(_$[$0-4], _$[$0])(new yy.Assign($$[$0-4], $$[$0-1], $$[$0-3]));\nbreak;\ncase 203:this.$ = yy.addLocationDataFn(_$[$0-3], _$[$0])(new yy.Assign($$[$0-3], $$[$0], $$[$0-2]));\nbreak;\ncase 204:this.$ = yy.addLocationDataFn(_$[$0-2], _$[$0])(new yy.Extends($$[$0-2], $$[$0]));\nbreak;\n}\n},\ntable: [{1:[2,1],3:1,4:2,5:3,7:4,8:5,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[3]},{1:[2,2],6:[1,72]},{1:[2,3],6:[2,3],26:[2,3],102:[2,3]},{1:[2,6],6:[2,6],26:[2,6],102:[2,6],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,7],6:[2,7],26:[2,7],102:[2,7],103:85,104:[1,63],106:[1,64],109:86,110:[1,66],111:67,126:[1,84]},{1:[2,11],6:[2,11],25:[2,11],26:[2,11],49:[2,11],54:[2,11],57:[2,11],62:88,66:[1,90],67:[1,91],68:[1,92],69:[1,93],70:94,71:[1,95],73:[2,11],74:[1,96],78:[2,11],81:87,84:[1,89],85:[2,107],86:[2,11],91:[2,11],93:[2,11],102:[2,11],104:[2,11],105:[2,11],106:[2,11],110:[2,11],118:[2,11],126:[2,11],128:[2,11],129:[2,11],132:[2,11],133:[2,11],134:[2,11],135:[2,11],136:[2,11],137:[2,11]},{1:[2,12],6:[2,12],25:[2,12],26:[2,12],49:[2,12],54:[2,12],57:[2,12],62:98,66:[1,90],67:[1,91],68:[1,92],69:[1,93],70:94,71:[1,95],73:[2,12],74:[1,96],78:[2,12],81:97,84:[1,89],85:[2,107],86:[2,12],91:[2,12],93:[2,12],102:[2,12],104:[2,12],105:[2,12],106:[2,12],110:[2,12],118:[2,12],126:[2,12],128:[2,12],129:[2,12],132:[2,12],133:[2,12],134:[2,12],135:[2,12],136:[2,12],137:[2,12]},{1:[2,13],6:[2,13],25:[2,13],26:[2,13],49:[2,13],54:[2,13],57:[2,13],73:[2,13],78:[2,13],86:[2,13],91:[2,13],93:[2,13],102:[2,13],104:[2,13],105:[2,13],106:[2,13],110:[2,13],118:[2,13],126:[2,13],128:[2,13],129:[2,13],132:[2,13],133:[2,13],134:[2,13],135:[2,13],136:[2,13],137:[2,13]},{1:[2,14],6:[2,14],25:[2,14],26:[2,14],49:[2,14],54:[2,14],57:[2,14],73:[2,14],78:[2,14],86:[2,14],91:[2,14],93:[2,14],102:[2,14],104:[2,14],105:[2,14],106:[2,14],110:[2,14],118:[2,14],126:[2,14],128:[2,14],129:[2,14],132:[2,14],133:[2,14],134:[2,14],135:[2,14],136:[2,14],137:[2,14]},{1:[2,15],6:[2,15],25:[2,15],26:[2,15],49:[2,15],54:[2,15],57:[2,15],73:[2,15],78:[2,15],86:[2,15],91:[2,15],93:[2,15],102:[2,15],104:[2,15],105:[2,15],106:[2,15],110:[2,15],118:[2,15],126:[2,15],128:[2,15],129:[2,15],132:[2,15],133:[2,15],134:[2,15],135:[2,15],136:[2,15],137:[2,15]},{1:[2,16],6:[2,16],25:[2,16],26:[2,16],49:[2,16],54:[2,16],57:[2,16],73:[2,16],78:[2,16],86:[2,16],91:[2,16],93:[2,16],102:[2,16],104:[2,16],105:[2,16],106:[2,16],110:[2,16],118:[2,16],126:[2,16],128:[2,16],129:[2,16],132:[2,16],133:[2,16],134:[2,16],135:[2,16],136:[2,16],137:[2,16]},{1:[2,17],6:[2,17],25:[2,17],26:[2,17],49:[2,17],54:[2,17],57:[2,17],73:[2,17],78:[2,17],86:[2,17],91:[2,17],93:[2,17],102:[2,17],104:[2,17],105:[2,17],106:[2,17],110:[2,17],118:[2,17],126:[2,17],128:[2,17],129:[2,17],132:[2,17],133:[2,17],134:[2,17],135:[2,17],136:[2,17],137:[2,17]},{1:[2,18],6:[2,18],25:[2,18],26:[2,18],49:[2,18],54:[2,18],57:[2,18],73:[2,18],78:[2,18],86:[2,18],91:[2,18],93:[2,18],102:[2,18],104:[2,18],105:[2,18],106:[2,18],110:[2,18],118:[2,18],126:[2,18],128:[2,18],129:[2,18],132:[2,18],133:[2,18],134:[2,18],135:[2,18],136:[2,18],137:[2,18]},{1:[2,19],6:[2,19],25:[2,19],26:[2,19],49:[2,19],54:[2,19],57:[2,19],73:[2,19],78:[2,19],86:[2,19],91:[2,19],93:[2,19],102:[2,19],104:[2,19],105:[2,19],106:[2,19],110:[2,19],118:[2,19],126:[2,19],128:[2,19],129:[2,19],132:[2,19],133:[2,19],134:[2,19],135:[2,19],136:[2,19],137:[2,19]},{1:[2,20],6:[2,20],25:[2,20],26:[2,20],49:[2,20],54:[2,20],57:[2,20],73:[2,20],78:[2,20],86:[2,20],91:[2,20],93:[2,20],102:[2,20],104:[2,20],105:[2,20],106:[2,20],110:[2,20],118:[2,20],126:[2,20],128:[2,20],129:[2,20],132:[2,20],133:[2,20],134:[2,20],135:[2,20],136:[2,20],137:[2,20]},{1:[2,21],6:[2,21],25:[2,21],26:[2,21],49:[2,21],54:[2,21],57:[2,21],73:[2,21],78:[2,21],86:[2,21],91:[2,21],93:[2,21],102:[2,21],104:[2,21],105:[2,21],106:[2,21],110:[2,21],118:[2,21],126:[2,21],128:[2,21],129:[2,21],132:[2,21],133:[2,21],134:[2,21],135:[2,21],136:[2,21],137:[2,21]},{1:[2,22],6:[2,22],25:[2,22],26:[2,22],49:[2,22],54:[2,22],57:[2,22],73:[2,22],78:[2,22],86:[2,22],91:[2,22],93:[2,22],102:[2,22],104:[2,22],105:[2,22],106:[2,22],110:[2,22],118:[2,22],126:[2,22],128:[2,22],129:[2,22],132:[2,22],133:[2,22],134:[2,22],135:[2,22],136:[2,22],137:[2,22]},{1:[2,8],6:[2,8],26:[2,8],102:[2,8],104:[2,8],106:[2,8],110:[2,8],126:[2,8]},{1:[2,9],6:[2,9],26:[2,9],102:[2,9],104:[2,9],106:[2,9],110:[2,9],126:[2,9]},{1:[2,10],6:[2,10],26:[2,10],102:[2,10],104:[2,10],106:[2,10],110:[2,10],126:[2,10]},{1:[2,74],6:[2,74],25:[2,74],26:[2,74],40:[1,99],49:[2,74],54:[2,74],57:[2,74],66:[2,74],67:[2,74],68:[2,74],69:[2,74],71:[2,74],73:[2,74],74:[2,74],78:[2,74],84:[2,74],85:[2,74],86:[2,74],91:[2,74],93:[2,74],102:[2,74],104:[2,74],105:[2,74],106:[2,74],110:[2,74],118:[2,74],126:[2,74],128:[2,74],129:[2,74],132:[2,74],133:[2,74],134:[2,74],135:[2,74],136:[2,74],137:[2,74]},{1:[2,75],6:[2,75],25:[2,75],26:[2,75],49:[2,75],54:[2,75],57:[2,75],66:[2,75],67:[2,75],68:[2,75],69:[2,75],71:[2,75],73:[2,75],74:[2,75],78:[2,75],84:[2,75],85:[2,75],86:[2,75],91:[2,75],93:[2,75],102:[2,75],104:[2,75],105:[2,75],106:[2,75],110:[2,75],118:[2,75],126:[2,75],128:[2,75],129:[2,75],132:[2,75],133:[2,75],134:[2,75],135:[2,75],136:[2,75],137:[2,75]},{1:[2,76],6:[2,76],25:[2,76],26:[2,76],49:[2,76],54:[2,76],57:[2,76],66:[2,76],67:[2,76],68:[2,76],69:[2,76],71:[2,76],73:[2,76],74:[2,76],78:[2,76],84:[2,76],85:[2,76],86:[2,76],91:[2,76],93:[2,76],102:[2,76],104:[2,76],105:[2,76],106:[2,76],110:[2,76],118:[2,76],126:[2,76],128:[2,76],129:[2,76],132:[2,76],133:[2,76],134:[2,76],135:[2,76],136:[2,76],137:[2,76]},{1:[2,77],6:[2,77],25:[2,77],26:[2,77],49:[2,77],54:[2,77],57:[2,77],66:[2,77],67:[2,77],68:[2,77],69:[2,77],71:[2,77],73:[2,77],74:[2,77],78:[2,77],84:[2,77],85:[2,77],86:[2,77],91:[2,77],93:[2,77],102:[2,77],104:[2,77],105:[2,77],106:[2,77],110:[2,77],118:[2,77],126:[2,77],128:[2,77],129:[2,77],132:[2,77],133:[2,77],134:[2,77],135:[2,77],136:[2,77],137:[2,77]},{1:[2,78],6:[2,78],25:[2,78],26:[2,78],49:[2,78],54:[2,78],57:[2,78],66:[2,78],67:[2,78],68:[2,78],69:[2,78],71:[2,78],73:[2,78],74:[2,78],78:[2,78],84:[2,78],85:[2,78],86:[2,78],91:[2,78],93:[2,78],102:[2,78],104:[2,78],105:[2,78],106:[2,78],110:[2,78],118:[2,78],126:[2,78],128:[2,78],129:[2,78],132:[2,78],133:[2,78],134:[2,78],135:[2,78],136:[2,78],137:[2,78]},{1:[2,105],6:[2,105],25:[2,105],26:[2,105],49:[2,105],54:[2,105],57:[2,105],66:[2,105],67:[2,105],68:[2,105],69:[2,105],71:[2,105],73:[2,105],74:[2,105],78:[2,105],82:100,84:[2,105],85:[1,101],86:[2,105],91:[2,105],93:[2,105],102:[2,105],104:[2,105],105:[2,105],106:[2,105],110:[2,105],118:[2,105],126:[2,105],128:[2,105],129:[2,105],132:[2,105],133:[2,105],134:[2,105],135:[2,105],136:[2,105],137:[2,105]},{6:[2,54],25:[2,54],27:105,28:[1,71],44:106,48:102,49:[2,54],54:[2,54],55:103,56:104,58:107,59:108,76:[1,68],89:[1,109],90:[1,110]},{24:111,25:[1,112]},{7:113,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:115,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:116,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{12:118,13:119,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:120,44:61,58:45,59:46,61:117,63:23,64:24,65:25,76:[1,68],83:[1,26],88:[1,56],89:[1,57],90:[1,55],101:[1,54]},{12:118,13:119,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:120,44:61,58:45,59:46,61:121,63:23,64:24,65:25,76:[1,68],83:[1,26],88:[1,56],89:[1,57],90:[1,55],101:[1,54]},{1:[2,71],6:[2,71],25:[2,71],26:[2,71],40:[2,71],49:[2,71],54:[2,71],57:[2,71],66:[2,71],67:[2,71],68:[2,71],69:[2,71],71:[2,71],73:[2,71],74:[2,71],78:[2,71],80:[1,125],84:[2,71],85:[2,71],86:[2,71],91:[2,71],93:[2,71],102:[2,71],104:[2,71],105:[2,71],106:[2,71],110:[2,71],118:[2,71],126:[2,71],128:[2,71],129:[2,71],130:[1,122],131:[1,123],132:[2,71],133:[2,71],134:[2,71],135:[2,71],136:[2,71],137:[2,71],138:[1,124]},{1:[2,182],6:[2,182],25:[2,182],26:[2,182],49:[2,182],54:[2,182],57:[2,182],73:[2,182],78:[2,182],86:[2,182],91:[2,182],93:[2,182],102:[2,182],104:[2,182],105:[2,182],106:[2,182],110:[2,182],118:[2,182],121:[1,126],126:[2,182],128:[2,182],129:[2,182],132:[2,182],133:[2,182],134:[2,182],135:[2,182],136:[2,182],137:[2,182]},{24:127,25:[1,112]},{24:128,25:[1,112]},{1:[2,149],6:[2,149],25:[2,149],26:[2,149],49:[2,149],54:[2,149],57:[2,149],73:[2,149],78:[2,149],86:[2,149],91:[2,149],93:[2,149],102:[2,149],104:[2,149],105:[2,149],106:[2,149],110:[2,149],118:[2,149],126:[2,149],128:[2,149],129:[2,149],132:[2,149],133:[2,149],134:[2,149],135:[2,149],136:[2,149],137:[2,149]},{24:129,25:[1,112]},{7:130,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:[1,131],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,95],6:[2,95],12:118,13:119,24:132,25:[1,112],26:[2,95],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:120,44:61,49:[2,95],54:[2,95],57:[2,95],58:45,59:46,61:134,63:23,64:24,65:25,73:[2,95],76:[1,68],78:[2,95],80:[1,133],83:[1,26],86:[2,95],88:[1,56],89:[1,57],90:[1,55],91:[2,95],93:[2,95],101:[1,54],102:[2,95],104:[2,95],105:[2,95],106:[2,95],110:[2,95],118:[2,95],126:[2,95],128:[2,95],129:[2,95],132:[2,95],133:[2,95],134:[2,95],135:[2,95],136:[2,95],137:[2,95]},{7:135,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,46],6:[2,46],7:136,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,26:[2,46],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],102:[2,46],103:37,104:[2,46],106:[2,46],107:38,108:[1,65],109:39,110:[2,46],111:67,119:[1,40],124:35,125:[1,62],126:[2,46],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,47],6:[2,47],25:[2,47],26:[2,47],54:[2,47],78:[2,47],102:[2,47],104:[2,47],106:[2,47],110:[2,47],126:[2,47]},{1:[2,72],6:[2,72],25:[2,72],26:[2,72],40:[2,72],49:[2,72],54:[2,72],57:[2,72],66:[2,72],67:[2,72],68:[2,72],69:[2,72],71:[2,72],73:[2,72],74:[2,72],78:[2,72],84:[2,72],85:[2,72],86:[2,72],91:[2,72],93:[2,72],102:[2,72],104:[2,72],105:[2,72],106:[2,72],110:[2,72],118:[2,72],126:[2,72],128:[2,72],129:[2,72],132:[2,72],133:[2,72],134:[2,72],135:[2,72],136:[2,72],137:[2,72]},{1:[2,73],6:[2,73],25:[2,73],26:[2,73],40:[2,73],49:[2,73],54:[2,73],57:[2,73],66:[2,73],67:[2,73],68:[2,73],69:[2,73],71:[2,73],73:[2,73],74:[2,73],78:[2,73],84:[2,73],85:[2,73],86:[2,73],91:[2,73],93:[2,73],102:[2,73],104:[2,73],105:[2,73],106:[2,73],110:[2,73],118:[2,73],126:[2,73],128:[2,73],129:[2,73],132:[2,73],133:[2,73],134:[2,73],135:[2,73],136:[2,73],137:[2,73]},{1:[2,28],6:[2,28],25:[2,28],26:[2,28],49:[2,28],54:[2,28],57:[2,28],66:[2,28],67:[2,28],68:[2,28],69:[2,28],71:[2,28],73:[2,28],74:[2,28],78:[2,28],84:[2,28],85:[2,28],86:[2,28],91:[2,28],93:[2,28],102:[2,28],104:[2,28],105:[2,28],106:[2,28],110:[2,28],118:[2,28],126:[2,28],128:[2,28],129:[2,28],132:[2,28],133:[2,28],134:[2,28],135:[2,28],136:[2,28],137:[2,28]},{1:[2,29],6:[2,29],25:[2,29],26:[2,29],49:[2,29],54:[2,29],57:[2,29],66:[2,29],67:[2,29],68:[2,29],69:[2,29],71:[2,29],73:[2,29],74:[2,29],78:[2,29],84:[2,29],85:[2,29],86:[2,29],91:[2,29],93:[2,29],102:[2,29],104:[2,29],105:[2,29],106:[2,29],110:[2,29],118:[2,29],126:[2,29],128:[2,29],129:[2,29],132:[2,29],133:[2,29],134:[2,29],135:[2,29],136:[2,29],137:[2,29]},{1:[2,30],6:[2,30],25:[2,30],26:[2,30],49:[2,30],54:[2,30],57:[2,30],66:[2,30],67:[2,30],68:[2,30],69:[2,30],71:[2,30],73:[2,30],74:[2,30],78:[2,30],84:[2,30],85:[2,30],86:[2,30],91:[2,30],93:[2,30],102:[2,30],104:[2,30],105:[2,30],106:[2,30],110:[2,30],118:[2,30],126:[2,30],128:[2,30],129:[2,30],132:[2,30],133:[2,30],134:[2,30],135:[2,30],136:[2,30],137:[2,30]},{1:[2,31],6:[2,31],25:[2,31],26:[2,31],49:[2,31],54:[2,31],57:[2,31],66:[2,31],67:[2,31],68:[2,31],69:[2,31],71:[2,31],73:[2,31],74:[2,31],78:[2,31],84:[2,31],85:[2,31],86:[2,31],91:[2,31],93:[2,31],102:[2,31],104:[2,31],105:[2,31],106:[2,31],110:[2,31],118:[2,31],126:[2,31],128:[2,31],129:[2,31],132:[2,31],133:[2,31],134:[2,31],135:[2,31],136:[2,31],137:[2,31]},{1:[2,32],6:[2,32],25:[2,32],26:[2,32],49:[2,32],54:[2,32],57:[2,32],66:[2,32],67:[2,32],68:[2,32],69:[2,32],71:[2,32],73:[2,32],74:[2,32],78:[2,32],84:[2,32],85:[2,32],86:[2,32],91:[2,32],93:[2,32],102:[2,32],104:[2,32],105:[2,32],106:[2,32],110:[2,32],118:[2,32],126:[2,32],128:[2,32],129:[2,32],132:[2,32],133:[2,32],134:[2,32],135:[2,32],136:[2,32],137:[2,32]},{1:[2,33],6:[2,33],25:[2,33],26:[2,33],49:[2,33],54:[2,33],57:[2,33],66:[2,33],67:[2,33],68:[2,33],69:[2,33],71:[2,33],73:[2,33],74:[2,33],78:[2,33],84:[2,33],85:[2,33],86:[2,33],91:[2,33],93:[2,33],102:[2,33],104:[2,33],105:[2,33],106:[2,33],110:[2,33],118:[2,33],126:[2,33],128:[2,33],129:[2,33],132:[2,33],133:[2,33],134:[2,33],135:[2,33],136:[2,33],137:[2,33]},{1:[2,34],6:[2,34],25:[2,34],26:[2,34],49:[2,34],54:[2,34],57:[2,34],66:[2,34],67:[2,34],68:[2,34],69:[2,34],71:[2,34],73:[2,34],74:[2,34],78:[2,34],84:[2,34],85:[2,34],86:[2,34],91:[2,34],93:[2,34],102:[2,34],104:[2,34],105:[2,34],106:[2,34],110:[2,34],118:[2,34],126:[2,34],128:[2,34],129:[2,34],132:[2,34],133:[2,34],134:[2,34],135:[2,34],136:[2,34],137:[2,34]},{4:137,5:3,7:4,8:5,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:[1,138],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:139,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:[1,143],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,60:144,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],87:141,88:[1,56],89:[1,57],90:[1,55],91:[1,140],94:142,96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,111],6:[2,111],25:[2,111],26:[2,111],49:[2,111],54:[2,111],57:[2,111],66:[2,111],67:[2,111],68:[2,111],69:[2,111],71:[2,111],73:[2,111],74:[2,111],78:[2,111],84:[2,111],85:[2,111],86:[2,111],91:[2,111],93:[2,111],102:[2,111],104:[2,111],105:[2,111],106:[2,111],110:[2,111],118:[2,111],126:[2,111],128:[2,111],129:[2,111],132:[2,111],133:[2,111],134:[2,111],135:[2,111],136:[2,111],137:[2,111]},{1:[2,112],6:[2,112],25:[2,112],26:[2,112],27:145,28:[1,71],49:[2,112],54:[2,112],57:[2,112],66:[2,112],67:[2,112],68:[2,112],69:[2,112],71:[2,112],73:[2,112],74:[2,112],78:[2,112],84:[2,112],85:[2,112],86:[2,112],91:[2,112],93:[2,112],102:[2,112],104:[2,112],105:[2,112],106:[2,112],110:[2,112],118:[2,112],126:[2,112],128:[2,112],129:[2,112],132:[2,112],133:[2,112],134:[2,112],135:[2,112],136:[2,112],137:[2,112]},{25:[2,50]},{25:[2,51]},{1:[2,67],6:[2,67],25:[2,67],26:[2,67],40:[2,67],49:[2,67],54:[2,67],57:[2,67],66:[2,67],67:[2,67],68:[2,67],69:[2,67],71:[2,67],73:[2,67],74:[2,67],78:[2,67],80:[2,67],84:[2,67],85:[2,67],86:[2,67],91:[2,67],93:[2,67],102:[2,67],104:[2,67],105:[2,67],106:[2,67],110:[2,67],118:[2,67],126:[2,67],128:[2,67],129:[2,67],130:[2,67],131:[2,67],132:[2,67],133:[2,67],134:[2,67],135:[2,67],136:[2,67],137:[2,67],138:[2,67]},{1:[2,70],6:[2,70],25:[2,70],26:[2,70],40:[2,70],49:[2,70],54:[2,70],57:[2,70],66:[2,70],67:[2,70],68:[2,70],69:[2,70],71:[2,70],73:[2,70],74:[2,70],78:[2,70],80:[2,70],84:[2,70],85:[2,70],86:[2,70],91:[2,70],93:[2,70],102:[2,70],104:[2,70],105:[2,70],106:[2,70],110:[2,70],118:[2,70],126:[2,70],128:[2,70],129:[2,70],130:[2,70],131:[2,70],132:[2,70],133:[2,70],134:[2,70],135:[2,70],136:[2,70],137:[2,70],138:[2,70]},{7:146,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:147,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:148,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:150,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,24:149,25:[1,112],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{27:155,28:[1,71],44:156,58:157,59:158,64:151,76:[1,68],89:[1,109],90:[1,55],113:152,114:[1,153],115:154},{112:159,116:[1,160],117:[1,161]},{6:[2,90],10:165,25:[2,90],27:166,28:[1,71],29:167,30:[1,69],31:[1,70],41:163,42:164,44:168,46:[1,44],54:[2,90],77:162,78:[2,90],89:[1,109]},{1:[2,26],6:[2,26],25:[2,26],26:[2,26],43:[2,26],49:[2,26],54:[2,26],57:[2,26],66:[2,26],67:[2,26],68:[2,26],69:[2,26],71:[2,26],73:[2,26],74:[2,26],78:[2,26],84:[2,26],85:[2,26],86:[2,26],91:[2,26],93:[2,26],102:[2,26],104:[2,26],105:[2,26],106:[2,26],110:[2,26],118:[2,26],126:[2,26],128:[2,26],129:[2,26],132:[2,26],133:[2,26],134:[2,26],135:[2,26],136:[2,26],137:[2,26]},{1:[2,27],6:[2,27],25:[2,27],26:[2,27],43:[2,27],49:[2,27],54:[2,27],57:[2,27],66:[2,27],67:[2,27],68:[2,27],69:[2,27],71:[2,27],73:[2,27],74:[2,27],78:[2,27],84:[2,27],85:[2,27],86:[2,27],91:[2,27],93:[2,27],102:[2,27],104:[2,27],105:[2,27],106:[2,27],110:[2,27],118:[2,27],126:[2,27],128:[2,27],129:[2,27],132:[2,27],133:[2,27],134:[2,27],135:[2,27],136:[2,27],137:[2,27]},{1:[2,25],6:[2,25],25:[2,25],26:[2,25],40:[2,25],43:[2,25],49:[2,25],54:[2,25],57:[2,25],66:[2,25],67:[2,25],68:[2,25],69:[2,25],71:[2,25],73:[2,25],74:[2,25],78:[2,25],80:[2,25],84:[2,25],85:[2,25],86:[2,25],91:[2,25],93:[2,25],102:[2,25],104:[2,25],105:[2,25],106:[2,25],110:[2,25],116:[2,25],117:[2,25],118:[2,25],126:[2,25],128:[2,25],129:[2,25],130:[2,25],131:[2,25],132:[2,25],133:[2,25],134:[2,25],135:[2,25],136:[2,25],137:[2,25],138:[2,25]},{1:[2,5],5:169,6:[2,5],7:4,8:5,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,26:[2,5],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],102:[2,5],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,193],6:[2,193],25:[2,193],26:[2,193],49:[2,193],54:[2,193],57:[2,193],73:[2,193],78:[2,193],86:[2,193],91:[2,193],93:[2,193],102:[2,193],104:[2,193],105:[2,193],106:[2,193],110:[2,193],118:[2,193],126:[2,193],128:[2,193],129:[2,193],132:[2,193],133:[2,193],134:[2,193],135:[2,193],136:[2,193],137:[2,193]},{7:170,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:171,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:172,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:173,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:174,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:175,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:176,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:177,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,148],6:[2,148],25:[2,148],26:[2,148],49:[2,148],54:[2,148],57:[2,148],73:[2,148],78:[2,148],86:[2,148],91:[2,148],93:[2,148],102:[2,148],104:[2,148],105:[2,148],106:[2,148],110:[2,148],118:[2,148],126:[2,148],128:[2,148],129:[2,148],132:[2,148],133:[2,148],134:[2,148],135:[2,148],136:[2,148],137:[2,148]},{1:[2,153],6:[2,153],25:[2,153],26:[2,153],49:[2,153],54:[2,153],57:[2,153],73:[2,153],78:[2,153],86:[2,153],91:[2,153],93:[2,153],102:[2,153],104:[2,153],105:[2,153],106:[2,153],110:[2,153],118:[2,153],126:[2,153],128:[2,153],129:[2,153],132:[2,153],133:[2,153],134:[2,153],135:[2,153],136:[2,153],137:[2,153]},{7:178,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,147],6:[2,147],25:[2,147],26:[2,147],49:[2,147],54:[2,147],57:[2,147],73:[2,147],78:[2,147],86:[2,147],91:[2,147],93:[2,147],102:[2,147],104:[2,147],105:[2,147],106:[2,147],110:[2,147],118:[2,147],126:[2,147],128:[2,147],129:[2,147],132:[2,147],133:[2,147],134:[2,147],135:[2,147],136:[2,147],137:[2,147]},{1:[2,152],6:[2,152],25:[2,152],26:[2,152],49:[2,152],54:[2,152],57:[2,152],73:[2,152],78:[2,152],86:[2,152],91:[2,152],93:[2,152],102:[2,152],104:[2,152],105:[2,152],106:[2,152],110:[2,152],118:[2,152],126:[2,152],128:[2,152],129:[2,152],132:[2,152],133:[2,152],134:[2,152],135:[2,152],136:[2,152],137:[2,152]},{82:179,85:[1,101]},{1:[2,68],6:[2,68],25:[2,68],26:[2,68],40:[2,68],49:[2,68],54:[2,68],57:[2,68],66:[2,68],67:[2,68],68:[2,68],69:[2,68],71:[2,68],73:[2,68],74:[2,68],78:[2,68],80:[2,68],84:[2,68],85:[2,68],86:[2,68],91:[2,68],93:[2,68],102:[2,68],104:[2,68],105:[2,68],106:[2,68],110:[2,68],118:[2,68],126:[2,68],128:[2,68],129:[2,68],130:[2,68],131:[2,68],132:[2,68],133:[2,68],134:[2,68],135:[2,68],136:[2,68],137:[2,68],138:[2,68]},{85:[2,108]},{27:180,28:[1,71]},{27:181,28:[1,71]},{1:[2,83],6:[2,83],25:[2,83],26:[2,83],27:182,28:[1,71],40:[2,83],49:[2,83],54:[2,83],57:[2,83],66:[2,83],67:[2,83],68:[2,83],69:[2,83],71:[2,83],73:[2,83],74:[2,83],78:[2,83],80:[2,83],84:[2,83],85:[2,83],86:[2,83],91:[2,83],93:[2,83],102:[2,83],104:[2,83],105:[2,83],106:[2,83],110:[2,83],118:[2,83],126:[2,83],128:[2,83],129:[2,83],130:[2,83],131:[2,83],132:[2,83],133:[2,83],134:[2,83],135:[2,83],136:[2,83],137:[2,83],138:[2,83]},{27:183,28:[1,71]},{1:[2,84],6:[2,84],25:[2,84],26:[2,84],40:[2,84],49:[2,84],54:[2,84],57:[2,84],66:[2,84],67:[2,84],68:[2,84],69:[2,84],71:[2,84],73:[2,84],74:[2,84],78:[2,84],80:[2,84],84:[2,84],85:[2,84],86:[2,84],91:[2,84],93:[2,84],102:[2,84],104:[2,84],105:[2,84],106:[2,84],110:[2,84],118:[2,84],126:[2,84],128:[2,84],129:[2,84],130:[2,84],131:[2,84],132:[2,84],133:[2,84],134:[2,84],135:[2,84],136:[2,84],137:[2,84],138:[2,84]},{7:185,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],57:[1,189],58:45,59:46,61:34,63:23,64:24,65:25,72:184,75:186,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],92:187,93:[1,188],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{70:190,71:[1,95],74:[1,96]},{82:191,85:[1,101]},{1:[2,69],6:[2,69],25:[2,69],26:[2,69],40:[2,69],49:[2,69],54:[2,69],57:[2,69],66:[2,69],67:[2,69],68:[2,69],69:[2,69],71:[2,69],73:[2,69],74:[2,69],78:[2,69],80:[2,69],84:[2,69],85:[2,69],86:[2,69],91:[2,69],93:[2,69],102:[2,69],104:[2,69],105:[2,69],106:[2,69],110:[2,69],118:[2,69],126:[2,69],128:[2,69],129:[2,69],130:[2,69],131:[2,69],132:[2,69],133:[2,69],134:[2,69],135:[2,69],136:[2,69],137:[2,69],138:[2,69]},{6:[1,193],7:192,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:[1,194],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,106],6:[2,106],25:[2,106],26:[2,106],49:[2,106],54:[2,106],57:[2,106],66:[2,106],67:[2,106],68:[2,106],69:[2,106],71:[2,106],73:[2,106],74:[2,106],78:[2,106],84:[2,106],85:[2,106],86:[2,106],91:[2,106],93:[2,106],102:[2,106],104:[2,106],105:[2,106],106:[2,106],110:[2,106],118:[2,106],126:[2,106],128:[2,106],129:[2,106],132:[2,106],133:[2,106],134:[2,106],135:[2,106],136:[2,106],137:[2,106]},{7:197,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:[1,143],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,60:144,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],86:[1,195],87:196,88:[1,56],89:[1,57],90:[1,55],94:142,96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{6:[2,52],25:[2,52],49:[1,198],53:200,54:[1,199]},{6:[2,55],25:[2,55],26:[2,55],49:[2,55],54:[2,55]},{6:[2,59],25:[2,59],26:[2,59],40:[1,202],49:[2,59],54:[2,59],57:[1,201]},{6:[2,62],25:[2,62],26:[2,62],40:[2,62],49:[2,62],54:[2,62],57:[2,62]},{6:[2,63],25:[2,63],26:[2,63],40:[2,63],49:[2,63],54:[2,63],57:[2,63]},{6:[2,64],25:[2,64],26:[2,64],40:[2,64],49:[2,64],54:[2,64],57:[2,64]},{6:[2,65],25:[2,65],26:[2,65],40:[2,65],49:[2,65],54:[2,65],57:[2,65]},{27:145,28:[1,71]},{7:197,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:[1,143],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,60:144,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],87:141,88:[1,56],89:[1,57],90:[1,55],91:[1,140],94:142,96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,49],6:[2,49],25:[2,49],26:[2,49],49:[2,49],54:[2,49],57:[2,49],73:[2,49],78:[2,49],86:[2,49],91:[2,49],93:[2,49],102:[2,49],104:[2,49],105:[2,49],106:[2,49],110:[2,49],118:[2,49],126:[2,49],128:[2,49],129:[2,49],132:[2,49],133:[2,49],134:[2,49],135:[2,49],136:[2,49],137:[2,49]},{4:204,5:3,7:4,8:5,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,26:[1,203],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,186],6:[2,186],25:[2,186],26:[2,186],49:[2,186],54:[2,186],57:[2,186],73:[2,186],78:[2,186],86:[2,186],91:[2,186],93:[2,186],102:[2,186],103:82,104:[2,186],105:[2,186],106:[2,186],109:83,110:[2,186],111:67,118:[2,186],126:[2,186],128:[2,186],129:[2,186],132:[1,73],133:[2,186],134:[2,186],135:[2,186],136:[2,186],137:[2,186]},{103:85,104:[1,63],106:[1,64],109:86,110:[1,66],111:67,126:[1,84]},{1:[2,187],6:[2,187],25:[2,187],26:[2,187],49:[2,187],54:[2,187],57:[2,187],73:[2,187],78:[2,187],86:[2,187],91:[2,187],93:[2,187],102:[2,187],103:82,104:[2,187],105:[2,187],106:[2,187],109:83,110:[2,187],111:67,118:[2,187],126:[2,187],128:[2,187],129:[2,187],132:[1,73],133:[2,187],134:[2,187],135:[2,187],136:[2,187],137:[2,187]},{1:[2,188],6:[2,188],25:[2,188],26:[2,188],49:[2,188],54:[2,188],57:[2,188],73:[2,188],78:[2,188],86:[2,188],91:[2,188],93:[2,188],102:[2,188],103:82,104:[2,188],105:[2,188],106:[2,188],109:83,110:[2,188],111:67,118:[2,188],126:[2,188],128:[2,188],129:[2,188],132:[1,73],133:[2,188],134:[2,188],135:[2,188],136:[2,188],137:[2,188]},{1:[2,189],6:[2,189],25:[2,189],26:[2,189],49:[2,189],54:[2,189],57:[2,189],66:[2,71],67:[2,71],68:[2,71],69:[2,71],71:[2,71],73:[2,189],74:[2,71],78:[2,189],84:[2,71],85:[2,71],86:[2,189],91:[2,189],93:[2,189],102:[2,189],104:[2,189],105:[2,189],106:[2,189],110:[2,189],118:[2,189],126:[2,189],128:[2,189],129:[2,189],132:[2,189],133:[2,189],134:[2,189],135:[2,189],136:[2,189],137:[2,189]},{62:88,66:[1,90],67:[1,91],68:[1,92],69:[1,93],70:94,71:[1,95],74:[1,96],81:87,84:[1,89],85:[2,107]},{62:98,66:[1,90],67:[1,91],68:[1,92],69:[1,93],70:94,71:[1,95],74:[1,96],81:97,84:[1,89],85:[2,107]},{66:[2,74],67:[2,74],68:[2,74],69:[2,74],71:[2,74],74:[2,74],84:[2,74],85:[2,74]},{1:[2,190],6:[2,190],25:[2,190],26:[2,190],49:[2,190],54:[2,190],57:[2,190],66:[2,71],67:[2,71],68:[2,71],69:[2,71],71:[2,71],73:[2,190],74:[2,71],78:[2,190],84:[2,71],85:[2,71],86:[2,190],91:[2,190],93:[2,190],102:[2,190],104:[2,190],105:[2,190],106:[2,190],110:[2,190],118:[2,190],126:[2,190],128:[2,190],129:[2,190],132:[2,190],133:[2,190],134:[2,190],135:[2,190],136:[2,190],137:[2,190]},{1:[2,191],6:[2,191],25:[2,191],26:[2,191],49:[2,191],54:[2,191],57:[2,191],73:[2,191],78:[2,191],86:[2,191],91:[2,191],93:[2,191],102:[2,191],104:[2,191],105:[2,191],106:[2,191],110:[2,191],118:[2,191],126:[2,191],128:[2,191],129:[2,191],132:[2,191],133:[2,191],134:[2,191],135:[2,191],136:[2,191],137:[2,191]},{1:[2,192],6:[2,192],25:[2,192],26:[2,192],49:[2,192],54:[2,192],57:[2,192],73:[2,192],78:[2,192],86:[2,192],91:[2,192],93:[2,192],102:[2,192],104:[2,192],105:[2,192],106:[2,192],110:[2,192],118:[2,192],126:[2,192],128:[2,192],129:[2,192],132:[2,192],133:[2,192],134:[2,192],135:[2,192],136:[2,192],137:[2,192]},{6:[1,207],7:205,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:[1,206],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:208,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{24:209,25:[1,112],125:[1,210]},{1:[2,132],6:[2,132],25:[2,132],26:[2,132],49:[2,132],54:[2,132],57:[2,132],73:[2,132],78:[2,132],86:[2,132],91:[2,132],93:[2,132],97:211,98:[1,212],99:[1,213],102:[2,132],104:[2,132],105:[2,132],106:[2,132],110:[2,132],118:[2,132],126:[2,132],128:[2,132],129:[2,132],132:[2,132],133:[2,132],134:[2,132],135:[2,132],136:[2,132],137:[2,132]},{1:[2,146],6:[2,146],25:[2,146],26:[2,146],49:[2,146],54:[2,146],57:[2,146],73:[2,146],78:[2,146],86:[2,146],91:[2,146],93:[2,146],102:[2,146],104:[2,146],105:[2,146],106:[2,146],110:[2,146],118:[2,146],126:[2,146],128:[2,146],129:[2,146],132:[2,146],133:[2,146],134:[2,146],135:[2,146],136:[2,146],137:[2,146]},{1:[2,154],6:[2,154],25:[2,154],26:[2,154],49:[2,154],54:[2,154],57:[2,154],73:[2,154],78:[2,154],86:[2,154],91:[2,154],93:[2,154],102:[2,154],104:[2,154],105:[2,154],106:[2,154],110:[2,154],118:[2,154],126:[2,154],128:[2,154],129:[2,154],132:[2,154],133:[2,154],134:[2,154],135:[2,154],136:[2,154],137:[2,154]},{25:[1,214],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{120:215,122:216,123:[1,217]},{1:[2,96],6:[2,96],25:[2,96],26:[2,96],49:[2,96],54:[2,96],57:[2,96],73:[2,96],78:[2,96],86:[2,96],91:[2,96],93:[2,96],102:[2,96],104:[2,96],105:[2,96],106:[2,96],110:[2,96],118:[2,96],126:[2,96],128:[2,96],129:[2,96],132:[2,96],133:[2,96],134:[2,96],135:[2,96],136:[2,96],137:[2,96]},{7:218,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,99],6:[2,99],24:219,25:[1,112],26:[2,99],49:[2,99],54:[2,99],57:[2,99],66:[2,71],67:[2,71],68:[2,71],69:[2,71],71:[2,71],73:[2,99],74:[2,71],78:[2,99],80:[1,220],84:[2,71],85:[2,71],86:[2,99],91:[2,99],93:[2,99],102:[2,99],104:[2,99],105:[2,99],106:[2,99],110:[2,99],118:[2,99],126:[2,99],128:[2,99],129:[2,99],132:[2,99],133:[2,99],134:[2,99],135:[2,99],136:[2,99],137:[2,99]},{1:[2,139],6:[2,139],25:[2,139],26:[2,139],49:[2,139],54:[2,139],57:[2,139],73:[2,139],78:[2,139],86:[2,139],91:[2,139],93:[2,139],102:[2,139],103:82,104:[2,139],105:[2,139],106:[2,139],109:83,110:[2,139],111:67,118:[2,139],126:[2,139],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,45],6:[2,45],26:[2,45],102:[2,45],103:82,104:[2,45],106:[2,45],109:83,110:[2,45],111:67,126:[2,45],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{6:[1,72],102:[1,221]},{4:222,5:3,7:4,8:5,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{6:[2,128],25:[2,128],54:[2,128],57:[1,224],91:[2,128],92:223,93:[1,188],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,114],6:[2,114],25:[2,114],26:[2,114],40:[2,114],49:[2,114],54:[2,114],57:[2,114],66:[2,114],67:[2,114],68:[2,114],69:[2,114],71:[2,114],73:[2,114],74:[2,114],78:[2,114],84:[2,114],85:[2,114],86:[2,114],91:[2,114],93:[2,114],102:[2,114],104:[2,114],105:[2,114],106:[2,114],110:[2,114],116:[2,114],117:[2,114],118:[2,114],126:[2,114],128:[2,114],129:[2,114],132:[2,114],133:[2,114],134:[2,114],135:[2,114],136:[2,114],137:[2,114]},{6:[2,52],25:[2,52],53:225,54:[1,226],91:[2,52]},{6:[2,123],25:[2,123],26:[2,123],54:[2,123],86:[2,123],91:[2,123]},{7:197,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:[1,143],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,60:144,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],87:227,88:[1,56],89:[1,57],90:[1,55],94:142,96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{6:[2,129],25:[2,129],26:[2,129],54:[2,129],86:[2,129],91:[2,129]},{1:[2,113],6:[2,113],25:[2,113],26:[2,113],40:[2,113],43:[2,113],49:[2,113],54:[2,113],57:[2,113],66:[2,113],67:[2,113],68:[2,113],69:[2,113],71:[2,113],73:[2,113],74:[2,113],78:[2,113],80:[2,113],84:[2,113],85:[2,113],86:[2,113],91:[2,113],93:[2,113],102:[2,113],104:[2,113],105:[2,113],106:[2,113],110:[2,113],116:[2,113],117:[2,113],118:[2,113],126:[2,113],128:[2,113],129:[2,113],130:[2,113],131:[2,113],132:[2,113],133:[2,113],134:[2,113],135:[2,113],136:[2,113],137:[2,113],138:[2,113]},{24:228,25:[1,112],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,142],6:[2,142],25:[2,142],26:[2,142],49:[2,142],54:[2,142],57:[2,142],73:[2,142],78:[2,142],86:[2,142],91:[2,142],93:[2,142],102:[2,142],103:82,104:[1,63],105:[1,229],106:[1,64],109:83,110:[1,66],111:67,118:[2,142],126:[2,142],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,144],6:[2,144],25:[2,144],26:[2,144],49:[2,144],54:[2,144],57:[2,144],73:[2,144],78:[2,144],86:[2,144],91:[2,144],93:[2,144],102:[2,144],103:82,104:[1,63],105:[1,230],106:[1,64],109:83,110:[1,66],111:67,118:[2,144],126:[2,144],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,150],6:[2,150],25:[2,150],26:[2,150],49:[2,150],54:[2,150],57:[2,150],73:[2,150],78:[2,150],86:[2,150],91:[2,150],93:[2,150],102:[2,150],104:[2,150],105:[2,150],106:[2,150],110:[2,150],118:[2,150],126:[2,150],128:[2,150],129:[2,150],132:[2,150],133:[2,150],134:[2,150],135:[2,150],136:[2,150],137:[2,150]},{1:[2,151],6:[2,151],25:[2,151],26:[2,151],49:[2,151],54:[2,151],57:[2,151],73:[2,151],78:[2,151],86:[2,151],91:[2,151],93:[2,151],102:[2,151],103:82,104:[1,63],105:[2,151],106:[1,64],109:83,110:[1,66],111:67,118:[2,151],126:[2,151],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,155],6:[2,155],25:[2,155],26:[2,155],49:[2,155],54:[2,155],57:[2,155],73:[2,155],78:[2,155],86:[2,155],91:[2,155],93:[2,155],102:[2,155],104:[2,155],105:[2,155],106:[2,155],110:[2,155],118:[2,155],126:[2,155],128:[2,155],129:[2,155],132:[2,155],133:[2,155],134:[2,155],135:[2,155],136:[2,155],137:[2,155]},{116:[2,157],117:[2,157]},{27:155,28:[1,71],44:156,58:157,59:158,76:[1,68],89:[1,109],90:[1,110],113:231,115:154},{54:[1,232],116:[2,163],117:[2,163]},{54:[2,159],116:[2,159],117:[2,159]},{54:[2,160],116:[2,160],117:[2,160]},{54:[2,161],116:[2,161],117:[2,161]},{54:[2,162],116:[2,162],117:[2,162]},{1:[2,156],6:[2,156],25:[2,156],26:[2,156],49:[2,156],54:[2,156],57:[2,156],73:[2,156],78:[2,156],86:[2,156],91:[2,156],93:[2,156],102:[2,156],104:[2,156],105:[2,156],106:[2,156],110:[2,156],118:[2,156],126:[2,156],128:[2,156],129:[2,156],132:[2,156],133:[2,156],134:[2,156],135:[2,156],136:[2,156],137:[2,156]},{7:233,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:234,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{6:[2,52],25:[2,52],53:235,54:[1,236],78:[2,52]},{6:[2,91],25:[2,91],26:[2,91],54:[2,91],78:[2,91]},{6:[2,38],25:[2,38],26:[2,38],43:[1,237],54:[2,38],78:[2,38]},{6:[2,41],25:[2,41],26:[2,41],54:[2,41],78:[2,41]},{6:[2,42],25:[2,42],26:[2,42],43:[2,42],54:[2,42],78:[2,42]},{6:[2,43],25:[2,43],26:[2,43],43:[2,43],54:[2,43],78:[2,43]},{6:[2,44],25:[2,44],26:[2,44],43:[2,44],54:[2,44],78:[2,44]},{1:[2,4],6:[2,4],26:[2,4],102:[2,4]},{1:[2,194],6:[2,194],25:[2,194],26:[2,194],49:[2,194],54:[2,194],57:[2,194],73:[2,194],78:[2,194],86:[2,194],91:[2,194],93:[2,194],102:[2,194],103:82,104:[2,194],105:[2,194],106:[2,194],109:83,110:[2,194],111:67,118:[2,194],126:[2,194],128:[2,194],129:[2,194],132:[1,73],133:[1,76],134:[2,194],135:[2,194],136:[2,194],137:[2,194]},{1:[2,195],6:[2,195],25:[2,195],26:[2,195],49:[2,195],54:[2,195],57:[2,195],73:[2,195],78:[2,195],86:[2,195],91:[2,195],93:[2,195],102:[2,195],103:82,104:[2,195],105:[2,195],106:[2,195],109:83,110:[2,195],111:67,118:[2,195],126:[2,195],128:[2,195],129:[2,195],132:[1,73],133:[1,76],134:[2,195],135:[2,195],136:[2,195],137:[2,195]},{1:[2,196],6:[2,196],25:[2,196],26:[2,196],49:[2,196],54:[2,196],57:[2,196],73:[2,196],78:[2,196],86:[2,196],91:[2,196],93:[2,196],102:[2,196],103:82,104:[2,196],105:[2,196],106:[2,196],109:83,110:[2,196],111:67,118:[2,196],126:[2,196],128:[2,196],129:[2,196],132:[1,73],133:[2,196],134:[2,196],135:[2,196],136:[2,196],137:[2,196]},{1:[2,197],6:[2,197],25:[2,197],26:[2,197],49:[2,197],54:[2,197],57:[2,197],73:[2,197],78:[2,197],86:[2,197],91:[2,197],93:[2,197],102:[2,197],103:82,104:[2,197],105:[2,197],106:[2,197],109:83,110:[2,197],111:67,118:[2,197],126:[2,197],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[2,197],135:[2,197],136:[2,197],137:[2,197]},{1:[2,198],6:[2,198],25:[2,198],26:[2,198],49:[2,198],54:[2,198],57:[2,198],73:[2,198],78:[2,198],86:[2,198],91:[2,198],93:[2,198],102:[2,198],103:82,104:[2,198],105:[2,198],106:[2,198],109:83,110:[2,198],111:67,118:[2,198],126:[2,198],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[2,198],136:[2,198],137:[1,80]},{1:[2,199],6:[2,199],25:[2,199],26:[2,199],49:[2,199],54:[2,199],57:[2,199],73:[2,199],78:[2,199],86:[2,199],91:[2,199],93:[2,199],102:[2,199],103:82,104:[2,199],105:[2,199],106:[2,199],109:83,110:[2,199],111:67,118:[2,199],126:[2,199],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[2,199],137:[1,80]},{1:[2,200],6:[2,200],25:[2,200],26:[2,200],49:[2,200],54:[2,200],57:[2,200],73:[2,200],78:[2,200],86:[2,200],91:[2,200],93:[2,200],102:[2,200],103:82,104:[2,200],105:[2,200],106:[2,200],109:83,110:[2,200],111:67,118:[2,200],126:[2,200],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[2,200],136:[2,200],137:[2,200]},{1:[2,185],6:[2,185],25:[2,185],26:[2,185],49:[2,185],54:[2,185],57:[2,185],73:[2,185],78:[2,185],86:[2,185],91:[2,185],93:[2,185],102:[2,185],103:82,104:[1,63],105:[2,185],106:[1,64],109:83,110:[1,66],111:67,118:[2,185],126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,184],6:[2,184],25:[2,184],26:[2,184],49:[2,184],54:[2,184],57:[2,184],73:[2,184],78:[2,184],86:[2,184],91:[2,184],93:[2,184],102:[2,184],103:82,104:[1,63],105:[2,184],106:[1,64],109:83,110:[1,66],111:67,118:[2,184],126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,103],6:[2,103],25:[2,103],26:[2,103],49:[2,103],54:[2,103],57:[2,103],66:[2,103],67:[2,103],68:[2,103],69:[2,103],71:[2,103],73:[2,103],74:[2,103],78:[2,103],84:[2,103],85:[2,103],86:[2,103],91:[2,103],93:[2,103],102:[2,103],104:[2,103],105:[2,103],106:[2,103],110:[2,103],118:[2,103],126:[2,103],128:[2,103],129:[2,103],132:[2,103],133:[2,103],134:[2,103],135:[2,103],136:[2,103],137:[2,103]},{1:[2,79],6:[2,79],25:[2,79],26:[2,79],40:[2,79],49:[2,79],54:[2,79],57:[2,79],66:[2,79],67:[2,79],68:[2,79],69:[2,79],71:[2,79],73:[2,79],74:[2,79],78:[2,79],80:[2,79],84:[2,79],85:[2,79],86:[2,79],91:[2,79],93:[2,79],102:[2,79],104:[2,79],105:[2,79],106:[2,79],110:[2,79],118:[2,79],126:[2,79],128:[2,79],129:[2,79],130:[2,79],131:[2,79],132:[2,79],133:[2,79],134:[2,79],135:[2,79],136:[2,79],137:[2,79],138:[2,79]},{1:[2,80],6:[2,80],25:[2,80],26:[2,80],40:[2,80],49:[2,80],54:[2,80],57:[2,80],66:[2,80],67:[2,80],68:[2,80],69:[2,80],71:[2,80],73:[2,80],74:[2,80],78:[2,80],80:[2,80],84:[2,80],85:[2,80],86:[2,80],91:[2,80],93:[2,80],102:[2,80],104:[2,80],105:[2,80],106:[2,80],110:[2,80],118:[2,80],126:[2,80],128:[2,80],129:[2,80],130:[2,80],131:[2,80],132:[2,80],133:[2,80],134:[2,80],135:[2,80],136:[2,80],137:[2,80],138:[2,80]},{1:[2,81],6:[2,81],25:[2,81],26:[2,81],40:[2,81],49:[2,81],54:[2,81],57:[2,81],66:[2,81],67:[2,81],68:[2,81],69:[2,81],71:[2,81],73:[2,81],74:[2,81],78:[2,81],80:[2,81],84:[2,81],85:[2,81],86:[2,81],91:[2,81],93:[2,81],102:[2,81],104:[2,81],105:[2,81],106:[2,81],110:[2,81],118:[2,81],126:[2,81],128:[2,81],129:[2,81],130:[2,81],131:[2,81],132:[2,81],133:[2,81],134:[2,81],135:[2,81],136:[2,81],137:[2,81],138:[2,81]},{1:[2,82],6:[2,82],25:[2,82],26:[2,82],40:[2,82],49:[2,82],54:[2,82],57:[2,82],66:[2,82],67:[2,82],68:[2,82],69:[2,82],71:[2,82],73:[2,82],74:[2,82],78:[2,82],80:[2,82],84:[2,82],85:[2,82],86:[2,82],91:[2,82],93:[2,82],102:[2,82],104:[2,82],105:[2,82],106:[2,82],110:[2,82],118:[2,82],126:[2,82],128:[2,82],129:[2,82],130:[2,82],131:[2,82],132:[2,82],133:[2,82],134:[2,82],135:[2,82],136:[2,82],137:[2,82],138:[2,82]},{73:[1,238]},{57:[1,189],73:[2,87],92:239,93:[1,188],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{73:[2,88]},{7:240,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,73:[2,122],76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{11:[2,116],28:[2,116],30:[2,116],31:[2,116],33:[2,116],34:[2,116],35:[2,116],36:[2,116],37:[2,116],38:[2,116],45:[2,116],46:[2,116],47:[2,116],51:[2,116],52:[2,116],73:[2,116],76:[2,116],79:[2,116],83:[2,116],88:[2,116],89:[2,116],90:[2,116],96:[2,116],100:[2,116],101:[2,116],104:[2,116],106:[2,116],108:[2,116],110:[2,116],119:[2,116],125:[2,116],127:[2,116],128:[2,116],129:[2,116],130:[2,116],131:[2,116]},{11:[2,117],28:[2,117],30:[2,117],31:[2,117],33:[2,117],34:[2,117],35:[2,117],36:[2,117],37:[2,117],38:[2,117],45:[2,117],46:[2,117],47:[2,117],51:[2,117],52:[2,117],73:[2,117],76:[2,117],79:[2,117],83:[2,117],88:[2,117],89:[2,117],90:[2,117],96:[2,117],100:[2,117],101:[2,117],104:[2,117],106:[2,117],108:[2,117],110:[2,117],119:[2,117],125:[2,117],127:[2,117],128:[2,117],129:[2,117],130:[2,117],131:[2,117]},{1:[2,86],6:[2,86],25:[2,86],26:[2,86],40:[2,86],49:[2,86],54:[2,86],57:[2,86],66:[2,86],67:[2,86],68:[2,86],69:[2,86],71:[2,86],73:[2,86],74:[2,86],78:[2,86],80:[2,86],84:[2,86],85:[2,86],86:[2,86],91:[2,86],93:[2,86],102:[2,86],104:[2,86],105:[2,86],106:[2,86],110:[2,86],118:[2,86],126:[2,86],128:[2,86],129:[2,86],130:[2,86],131:[2,86],132:[2,86],133:[2,86],134:[2,86],135:[2,86],136:[2,86],137:[2,86],138:[2,86]},{1:[2,104],6:[2,104],25:[2,104],26:[2,104],49:[2,104],54:[2,104],57:[2,104],66:[2,104],67:[2,104],68:[2,104],69:[2,104],71:[2,104],73:[2,104],74:[2,104],78:[2,104],84:[2,104],85:[2,104],86:[2,104],91:[2,104],93:[2,104],102:[2,104],104:[2,104],105:[2,104],106:[2,104],110:[2,104],118:[2,104],126:[2,104],128:[2,104],129:[2,104],132:[2,104],133:[2,104],134:[2,104],135:[2,104],136:[2,104],137:[2,104]},{1:[2,35],6:[2,35],25:[2,35],26:[2,35],49:[2,35],54:[2,35],57:[2,35],73:[2,35],78:[2,35],86:[2,35],91:[2,35],93:[2,35],102:[2,35],103:82,104:[2,35],105:[2,35],106:[2,35],109:83,110:[2,35],111:67,118:[2,35],126:[2,35],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{7:241,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:242,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,109],6:[2,109],25:[2,109],26:[2,109],49:[2,109],54:[2,109],57:[2,109],66:[2,109],67:[2,109],68:[2,109],69:[2,109],71:[2,109],73:[2,109],74:[2,109],78:[2,109],84:[2,109],85:[2,109],86:[2,109],91:[2,109],93:[2,109],102:[2,109],104:[2,109],105:[2,109],106:[2,109],110:[2,109],118:[2,109],126:[2,109],128:[2,109],129:[2,109],132:[2,109],133:[2,109],134:[2,109],135:[2,109],136:[2,109],137:[2,109]},{6:[2,52],25:[2,52],53:243,54:[1,226],86:[2,52]},{6:[2,128],25:[2,128],26:[2,128],54:[2,128],57:[1,244],86:[2,128],91:[2,128],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{50:245,51:[1,58],52:[1,59]},{6:[2,53],25:[2,53],26:[2,53],27:105,28:[1,71],44:106,55:246,56:104,58:107,59:108,76:[1,68],89:[1,109],90:[1,110]},{6:[1,247],25:[1,248]},{6:[2,60],25:[2,60],26:[2,60],49:[2,60],54:[2,60]},{7:249,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,23],6:[2,23],25:[2,23],26:[2,23],49:[2,23],54:[2,23],57:[2,23],73:[2,23],78:[2,23],86:[2,23],91:[2,23],93:[2,23],98:[2,23],99:[2,23],102:[2,23],104:[2,23],105:[2,23],106:[2,23],110:[2,23],118:[2,23],121:[2,23],123:[2,23],126:[2,23],128:[2,23],129:[2,23],132:[2,23],133:[2,23],134:[2,23],135:[2,23],136:[2,23],137:[2,23]},{6:[1,72],26:[1,250]},{1:[2,201],6:[2,201],25:[2,201],26:[2,201],49:[2,201],54:[2,201],57:[2,201],73:[2,201],78:[2,201],86:[2,201],91:[2,201],93:[2,201],102:[2,201],103:82,104:[2,201],105:[2,201],106:[2,201],109:83,110:[2,201],111:67,118:[2,201],126:[2,201],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{7:251,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:252,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,204],6:[2,204],25:[2,204],26:[2,204],49:[2,204],54:[2,204],57:[2,204],73:[2,204],78:[2,204],86:[2,204],91:[2,204],93:[2,204],102:[2,204],103:82,104:[2,204],105:[2,204],106:[2,204],109:83,110:[2,204],111:67,118:[2,204],126:[2,204],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,183],6:[2,183],25:[2,183],26:[2,183],49:[2,183],54:[2,183],57:[2,183],73:[2,183],78:[2,183],86:[2,183],91:[2,183],93:[2,183],102:[2,183],104:[2,183],105:[2,183],106:[2,183],110:[2,183],118:[2,183],126:[2,183],128:[2,183],129:[2,183],132:[2,183],133:[2,183],134:[2,183],135:[2,183],136:[2,183],137:[2,183]},{7:253,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,133],6:[2,133],25:[2,133],26:[2,133],49:[2,133],54:[2,133],57:[2,133],73:[2,133],78:[2,133],86:[2,133],91:[2,133],93:[2,133],98:[1,254],102:[2,133],104:[2,133],105:[2,133],106:[2,133],110:[2,133],118:[2,133],126:[2,133],128:[2,133],129:[2,133],132:[2,133],133:[2,133],134:[2,133],135:[2,133],136:[2,133],137:[2,133]},{24:255,25:[1,112]},{24:258,25:[1,112],27:256,28:[1,71],59:257,76:[1,68]},{120:259,122:216,123:[1,217]},{26:[1,260],121:[1,261],122:262,123:[1,217]},{26:[2,176],121:[2,176],123:[2,176]},{7:264,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],95:263,96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,97],6:[2,97],24:265,25:[1,112],26:[2,97],49:[2,97],54:[2,97],57:[2,97],73:[2,97],78:[2,97],86:[2,97],91:[2,97],93:[2,97],102:[2,97],103:82,104:[1,63],105:[2,97],106:[1,64],109:83,110:[1,66],111:67,118:[2,97],126:[2,97],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,100],6:[2,100],25:[2,100],26:[2,100],49:[2,100],54:[2,100],57:[2,100],73:[2,100],78:[2,100],86:[2,100],91:[2,100],93:[2,100],102:[2,100],104:[2,100],105:[2,100],106:[2,100],110:[2,100],118:[2,100],126:[2,100],128:[2,100],129:[2,100],132:[2,100],133:[2,100],134:[2,100],135:[2,100],136:[2,100],137:[2,100]},{7:266,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,140],6:[2,140],25:[2,140],26:[2,140],49:[2,140],54:[2,140],57:[2,140],66:[2,140],67:[2,140],68:[2,140],69:[2,140],71:[2,140],73:[2,140],74:[2,140],78:[2,140],84:[2,140],85:[2,140],86:[2,140],91:[2,140],93:[2,140],102:[2,140],104:[2,140],105:[2,140],106:[2,140],110:[2,140],118:[2,140],126:[2,140],128:[2,140],129:[2,140],132:[2,140],133:[2,140],134:[2,140],135:[2,140],136:[2,140],137:[2,140]},{6:[1,72],26:[1,267]},{7:268,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{6:[2,66],11:[2,117],25:[2,66],28:[2,117],30:[2,117],31:[2,117],33:[2,117],34:[2,117],35:[2,117],36:[2,117],37:[2,117],38:[2,117],45:[2,117],46:[2,117],47:[2,117],51:[2,117],52:[2,117],54:[2,66],76:[2,117],79:[2,117],83:[2,117],88:[2,117],89:[2,117],90:[2,117],91:[2,66],96:[2,117],100:[2,117],101:[2,117],104:[2,117],106:[2,117],108:[2,117],110:[2,117],119:[2,117],125:[2,117],127:[2,117],128:[2,117],129:[2,117],130:[2,117],131:[2,117]},{6:[1,270],25:[1,271],91:[1,269]},{6:[2,53],7:197,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:[2,53],26:[2,53],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,60:144,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],86:[2,53],88:[1,56],89:[1,57],90:[1,55],91:[2,53],94:272,96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{6:[2,52],25:[2,52],26:[2,52],53:273,54:[1,226]},{1:[2,180],6:[2,180],25:[2,180],26:[2,180],49:[2,180],54:[2,180],57:[2,180],73:[2,180],78:[2,180],86:[2,180],91:[2,180],93:[2,180],102:[2,180],104:[2,180],105:[2,180],106:[2,180],110:[2,180],118:[2,180],121:[2,180],126:[2,180],128:[2,180],129:[2,180],132:[2,180],133:[2,180],134:[2,180],135:[2,180],136:[2,180],137:[2,180]},{7:274,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:275,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{116:[2,158],117:[2,158]},{27:155,28:[1,71],44:156,58:157,59:158,76:[1,68],89:[1,109],90:[1,110],115:276},{1:[2,165],6:[2,165],25:[2,165],26:[2,165],49:[2,165],54:[2,165],57:[2,165],73:[2,165],78:[2,165],86:[2,165],91:[2,165],93:[2,165],102:[2,165],103:82,104:[2,165],105:[1,277],106:[2,165],109:83,110:[2,165],111:67,118:[1,278],126:[2,165],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,166],6:[2,166],25:[2,166],26:[2,166],49:[2,166],54:[2,166],57:[2,166],73:[2,166],78:[2,166],86:[2,166],91:[2,166],93:[2,166],102:[2,166],103:82,104:[2,166],105:[1,279],106:[2,166],109:83,110:[2,166],111:67,118:[2,166],126:[2,166],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{6:[1,281],25:[1,282],78:[1,280]},{6:[2,53],10:165,25:[2,53],26:[2,53],27:166,28:[1,71],29:167,30:[1,69],31:[1,70],41:283,42:164,44:168,46:[1,44],78:[2,53],89:[1,109]},{7:284,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:[1,285],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,85],6:[2,85],25:[2,85],26:[2,85],40:[2,85],49:[2,85],54:[2,85],57:[2,85],66:[2,85],67:[2,85],68:[2,85],69:[2,85],71:[2,85],73:[2,85],74:[2,85],78:[2,85],80:[2,85],84:[2,85],85:[2,85],86:[2,85],91:[2,85],93:[2,85],102:[2,85],104:[2,85],105:[2,85],106:[2,85],110:[2,85],118:[2,85],126:[2,85],128:[2,85],129:[2,85],130:[2,85],131:[2,85],132:[2,85],133:[2,85],134:[2,85],135:[2,85],136:[2,85],137:[2,85],138:[2,85]},{7:286,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,73:[2,120],76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{73:[2,121],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,36],6:[2,36],25:[2,36],26:[2,36],49:[2,36],54:[2,36],57:[2,36],73:[2,36],78:[2,36],86:[2,36],91:[2,36],93:[2,36],102:[2,36],103:82,104:[2,36],105:[2,36],106:[2,36],109:83,110:[2,36],111:67,118:[2,36],126:[2,36],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{26:[1,287],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{6:[1,270],25:[1,271],86:[1,288]},{6:[2,66],25:[2,66],26:[2,66],54:[2,66],86:[2,66],91:[2,66]},{24:289,25:[1,112]},{6:[2,56],25:[2,56],26:[2,56],49:[2,56],54:[2,56]},{27:105,28:[1,71],44:106,55:290,56:104,58:107,59:108,76:[1,68],89:[1,109],90:[1,110]},{6:[2,54],25:[2,54],26:[2,54],27:105,28:[1,71],44:106,48:291,54:[2,54],55:103,56:104,58:107,59:108,76:[1,68],89:[1,109],90:[1,110]},{6:[2,61],25:[2,61],26:[2,61],49:[2,61],54:[2,61],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,24],6:[2,24],25:[2,24],26:[2,24],49:[2,24],54:[2,24],57:[2,24],73:[2,24],78:[2,24],86:[2,24],91:[2,24],93:[2,24],98:[2,24],99:[2,24],102:[2,24],104:[2,24],105:[2,24],106:[2,24],110:[2,24],118:[2,24],121:[2,24],123:[2,24],126:[2,24],128:[2,24],129:[2,24],132:[2,24],133:[2,24],134:[2,24],135:[2,24],136:[2,24],137:[2,24]},{26:[1,292],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,203],6:[2,203],25:[2,203],26:[2,203],49:[2,203],54:[2,203],57:[2,203],73:[2,203],78:[2,203],86:[2,203],91:[2,203],93:[2,203],102:[2,203],103:82,104:[2,203],105:[2,203],106:[2,203],109:83,110:[2,203],111:67,118:[2,203],126:[2,203],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{24:293,25:[1,112],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{24:294,25:[1,112]},{1:[2,134],6:[2,134],25:[2,134],26:[2,134],49:[2,134],54:[2,134],57:[2,134],73:[2,134],78:[2,134],86:[2,134],91:[2,134],93:[2,134],102:[2,134],104:[2,134],105:[2,134],106:[2,134],110:[2,134],118:[2,134],126:[2,134],128:[2,134],129:[2,134],132:[2,134],133:[2,134],134:[2,134],135:[2,134],136:[2,134],137:[2,134]},{24:295,25:[1,112]},{24:296,25:[1,112]},{1:[2,138],6:[2,138],25:[2,138],26:[2,138],49:[2,138],54:[2,138],57:[2,138],73:[2,138],78:[2,138],86:[2,138],91:[2,138],93:[2,138],98:[2,138],102:[2,138],104:[2,138],105:[2,138],106:[2,138],110:[2,138],118:[2,138],126:[2,138],128:[2,138],129:[2,138],132:[2,138],133:[2,138],134:[2,138],135:[2,138],136:[2,138],137:[2,138]},{26:[1,297],121:[1,298],122:262,123:[1,217]},{1:[2,174],6:[2,174],25:[2,174],26:[2,174],49:[2,174],54:[2,174],57:[2,174],73:[2,174],78:[2,174],86:[2,174],91:[2,174],93:[2,174],102:[2,174],104:[2,174],105:[2,174],106:[2,174],110:[2,174],118:[2,174],126:[2,174],128:[2,174],129:[2,174],132:[2,174],133:[2,174],134:[2,174],135:[2,174],136:[2,174],137:[2,174]},{24:299,25:[1,112]},{26:[2,177],121:[2,177],123:[2,177]},{24:300,25:[1,112],54:[1,301]},{25:[2,130],54:[2,130],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,98],6:[2,98],25:[2,98],26:[2,98],49:[2,98],54:[2,98],57:[2,98],73:[2,98],78:[2,98],86:[2,98],91:[2,98],93:[2,98],102:[2,98],104:[2,98],105:[2,98],106:[2,98],110:[2,98],118:[2,98],126:[2,98],128:[2,98],129:[2,98],132:[2,98],133:[2,98],134:[2,98],135:[2,98],136:[2,98],137:[2,98]},{1:[2,101],6:[2,101],24:302,25:[1,112],26:[2,101],49:[2,101],54:[2,101],57:[2,101],73:[2,101],78:[2,101],86:[2,101],91:[2,101],93:[2,101],102:[2,101],103:82,104:[1,63],105:[2,101],106:[1,64],109:83,110:[1,66],111:67,118:[2,101],126:[2,101],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{102:[1,303]},{91:[1,304],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,115],6:[2,115],25:[2,115],26:[2,115],40:[2,115],49:[2,115],54:[2,115],57:[2,115],66:[2,115],67:[2,115],68:[2,115],69:[2,115],71:[2,115],73:[2,115],74:[2,115],78:[2,115],84:[2,115],85:[2,115],86:[2,115],91:[2,115],93:[2,115],102:[2,115],104:[2,115],105:[2,115],106:[2,115],110:[2,115],116:[2,115],117:[2,115],118:[2,115],126:[2,115],128:[2,115],129:[2,115],132:[2,115],133:[2,115],134:[2,115],135:[2,115],136:[2,115],137:[2,115]},{7:197,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,60:144,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],94:305,96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:197,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,25:[1,143],27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,60:144,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],87:306,88:[1,56],89:[1,57],90:[1,55],94:142,96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{6:[2,124],25:[2,124],26:[2,124],54:[2,124],86:[2,124],91:[2,124]},{6:[1,270],25:[1,271],26:[1,307]},{1:[2,143],6:[2,143],25:[2,143],26:[2,143],49:[2,143],54:[2,143],57:[2,143],73:[2,143],78:[2,143],86:[2,143],91:[2,143],93:[2,143],102:[2,143],103:82,104:[1,63],105:[2,143],106:[1,64],109:83,110:[1,66],111:67,118:[2,143],126:[2,143],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,145],6:[2,145],25:[2,145],26:[2,145],49:[2,145],54:[2,145],57:[2,145],73:[2,145],78:[2,145],86:[2,145],91:[2,145],93:[2,145],102:[2,145],103:82,104:[1,63],105:[2,145],106:[1,64],109:83,110:[1,66],111:67,118:[2,145],126:[2,145],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{116:[2,164],117:[2,164]},{7:308,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:309,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:310,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,89],6:[2,89],25:[2,89],26:[2,89],40:[2,89],49:[2,89],54:[2,89],57:[2,89],66:[2,89],67:[2,89],68:[2,89],69:[2,89],71:[2,89],73:[2,89],74:[2,89],78:[2,89],84:[2,89],85:[2,89],86:[2,89],91:[2,89],93:[2,89],102:[2,89],104:[2,89],105:[2,89],106:[2,89],110:[2,89],116:[2,89],117:[2,89],118:[2,89],126:[2,89],128:[2,89],129:[2,89],132:[2,89],133:[2,89],134:[2,89],135:[2,89],136:[2,89],137:[2,89]},{10:165,27:166,28:[1,71],29:167,30:[1,69],31:[1,70],41:311,42:164,44:168,46:[1,44],89:[1,109]},{6:[2,90],10:165,25:[2,90],26:[2,90],27:166,28:[1,71],29:167,30:[1,69],31:[1,70],41:163,42:164,44:168,46:[1,44],54:[2,90],77:312,89:[1,109]},{6:[2,92],25:[2,92],26:[2,92],54:[2,92],78:[2,92]},{6:[2,39],25:[2,39],26:[2,39],54:[2,39],78:[2,39],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{7:313,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{73:[2,119],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,37],6:[2,37],25:[2,37],26:[2,37],49:[2,37],54:[2,37],57:[2,37],73:[2,37],78:[2,37],86:[2,37],91:[2,37],93:[2,37],102:[2,37],104:[2,37],105:[2,37],106:[2,37],110:[2,37],118:[2,37],126:[2,37],128:[2,37],129:[2,37],132:[2,37],133:[2,37],134:[2,37],135:[2,37],136:[2,37],137:[2,37]},{1:[2,110],6:[2,110],25:[2,110],26:[2,110],49:[2,110],54:[2,110],57:[2,110],66:[2,110],67:[2,110],68:[2,110],69:[2,110],71:[2,110],73:[2,110],74:[2,110],78:[2,110],84:[2,110],85:[2,110],86:[2,110],91:[2,110],93:[2,110],102:[2,110],104:[2,110],105:[2,110],106:[2,110],110:[2,110],118:[2,110],126:[2,110],128:[2,110],129:[2,110],132:[2,110],133:[2,110],134:[2,110],135:[2,110],136:[2,110],137:[2,110]},{1:[2,48],6:[2,48],25:[2,48],26:[2,48],49:[2,48],54:[2,48],57:[2,48],73:[2,48],78:[2,48],86:[2,48],91:[2,48],93:[2,48],102:[2,48],104:[2,48],105:[2,48],106:[2,48],110:[2,48],118:[2,48],126:[2,48],128:[2,48],129:[2,48],132:[2,48],133:[2,48],134:[2,48],135:[2,48],136:[2,48],137:[2,48]},{6:[2,57],25:[2,57],26:[2,57],49:[2,57],54:[2,57]},{6:[2,52],25:[2,52],26:[2,52],53:314,54:[1,199]},{1:[2,202],6:[2,202],25:[2,202],26:[2,202],49:[2,202],54:[2,202],57:[2,202],73:[2,202],78:[2,202],86:[2,202],91:[2,202],93:[2,202],102:[2,202],104:[2,202],105:[2,202],106:[2,202],110:[2,202],118:[2,202],126:[2,202],128:[2,202],129:[2,202],132:[2,202],133:[2,202],134:[2,202],135:[2,202],136:[2,202],137:[2,202]},{1:[2,181],6:[2,181],25:[2,181],26:[2,181],49:[2,181],54:[2,181],57:[2,181],73:[2,181],78:[2,181],86:[2,181],91:[2,181],93:[2,181],102:[2,181],104:[2,181],105:[2,181],106:[2,181],110:[2,181],118:[2,181],121:[2,181],126:[2,181],128:[2,181],129:[2,181],132:[2,181],133:[2,181],134:[2,181],135:[2,181],136:[2,181],137:[2,181]},{1:[2,135],6:[2,135],25:[2,135],26:[2,135],49:[2,135],54:[2,135],57:[2,135],73:[2,135],78:[2,135],86:[2,135],91:[2,135],93:[2,135],102:[2,135],104:[2,135],105:[2,135],106:[2,135],110:[2,135],118:[2,135],126:[2,135],128:[2,135],129:[2,135],132:[2,135],133:[2,135],134:[2,135],135:[2,135],136:[2,135],137:[2,135]},{1:[2,136],6:[2,136],25:[2,136],26:[2,136],49:[2,136],54:[2,136],57:[2,136],73:[2,136],78:[2,136],86:[2,136],91:[2,136],93:[2,136],98:[2,136],102:[2,136],104:[2,136],105:[2,136],106:[2,136],110:[2,136],118:[2,136],126:[2,136],128:[2,136],129:[2,136],132:[2,136],133:[2,136],134:[2,136],135:[2,136],136:[2,136],137:[2,136]},{1:[2,137],6:[2,137],25:[2,137],26:[2,137],49:[2,137],54:[2,137],57:[2,137],73:[2,137],78:[2,137],86:[2,137],91:[2,137],93:[2,137],98:[2,137],102:[2,137],104:[2,137],105:[2,137],106:[2,137],110:[2,137],118:[2,137],126:[2,137],128:[2,137],129:[2,137],132:[2,137],133:[2,137],134:[2,137],135:[2,137],136:[2,137],137:[2,137]},{1:[2,172],6:[2,172],25:[2,172],26:[2,172],49:[2,172],54:[2,172],57:[2,172],73:[2,172],78:[2,172],86:[2,172],91:[2,172],93:[2,172],102:[2,172],104:[2,172],105:[2,172],106:[2,172],110:[2,172],118:[2,172],126:[2,172],128:[2,172],129:[2,172],132:[2,172],133:[2,172],134:[2,172],135:[2,172],136:[2,172],137:[2,172]},{24:315,25:[1,112]},{26:[1,316]},{6:[1,317],26:[2,178],121:[2,178],123:[2,178]},{7:318,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{1:[2,102],6:[2,102],25:[2,102],26:[2,102],49:[2,102],54:[2,102],57:[2,102],73:[2,102],78:[2,102],86:[2,102],91:[2,102],93:[2,102],102:[2,102],104:[2,102],105:[2,102],106:[2,102],110:[2,102],118:[2,102],126:[2,102],128:[2,102],129:[2,102],132:[2,102],133:[2,102],134:[2,102],135:[2,102],136:[2,102],137:[2,102]},{1:[2,141],6:[2,141],25:[2,141],26:[2,141],49:[2,141],54:[2,141],57:[2,141],66:[2,141],67:[2,141],68:[2,141],69:[2,141],71:[2,141],73:[2,141],74:[2,141],78:[2,141],84:[2,141],85:[2,141],86:[2,141],91:[2,141],93:[2,141],102:[2,141],104:[2,141],105:[2,141],106:[2,141],110:[2,141],118:[2,141],126:[2,141],128:[2,141],129:[2,141],132:[2,141],133:[2,141],134:[2,141],135:[2,141],136:[2,141],137:[2,141]},{1:[2,118],6:[2,118],25:[2,118],26:[2,118],49:[2,118],54:[2,118],57:[2,118],66:[2,118],67:[2,118],68:[2,118],69:[2,118],71:[2,118],73:[2,118],74:[2,118],78:[2,118],84:[2,118],85:[2,118],86:[2,118],91:[2,118],93:[2,118],102:[2,118],104:[2,118],105:[2,118],106:[2,118],110:[2,118],118:[2,118],126:[2,118],128:[2,118],129:[2,118],132:[2,118],133:[2,118],134:[2,118],135:[2,118],136:[2,118],137:[2,118]},{6:[2,125],25:[2,125],26:[2,125],54:[2,125],86:[2,125],91:[2,125]},{6:[2,52],25:[2,52],26:[2,52],53:319,54:[1,226]},{6:[2,126],25:[2,126],26:[2,126],54:[2,126],86:[2,126],91:[2,126]},{1:[2,167],6:[2,167],25:[2,167],26:[2,167],49:[2,167],54:[2,167],57:[2,167],73:[2,167],78:[2,167],86:[2,167],91:[2,167],93:[2,167],102:[2,167],103:82,104:[2,167],105:[2,167],106:[2,167],109:83,110:[2,167],111:67,118:[1,320],126:[2,167],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,169],6:[2,169],25:[2,169],26:[2,169],49:[2,169],54:[2,169],57:[2,169],73:[2,169],78:[2,169],86:[2,169],91:[2,169],93:[2,169],102:[2,169],103:82,104:[2,169],105:[1,321],106:[2,169],109:83,110:[2,169],111:67,118:[2,169],126:[2,169],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,168],6:[2,168],25:[2,168],26:[2,168],49:[2,168],54:[2,168],57:[2,168],73:[2,168],78:[2,168],86:[2,168],91:[2,168],93:[2,168],102:[2,168],103:82,104:[2,168],105:[2,168],106:[2,168],109:83,110:[2,168],111:67,118:[2,168],126:[2,168],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{6:[2,93],25:[2,93],26:[2,93],54:[2,93],78:[2,93]},{6:[2,52],25:[2,52],26:[2,52],53:322,54:[1,236]},{26:[1,323],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{6:[1,247],25:[1,248],26:[1,324]},{26:[1,325]},{1:[2,175],6:[2,175],25:[2,175],26:[2,175],49:[2,175],54:[2,175],57:[2,175],73:[2,175],78:[2,175],86:[2,175],91:[2,175],93:[2,175],102:[2,175],104:[2,175],105:[2,175],106:[2,175],110:[2,175],118:[2,175],126:[2,175],128:[2,175],129:[2,175],132:[2,175],133:[2,175],134:[2,175],135:[2,175],136:[2,175],137:[2,175]},{26:[2,179],121:[2,179],123:[2,179]},{25:[2,131],54:[2,131],103:82,104:[1,63],106:[1,64],109:83,110:[1,66],111:67,126:[1,81],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{6:[1,270],25:[1,271],26:[1,326]},{7:327,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{7:328,8:114,9:18,10:19,11:[1,20],12:6,13:7,14:8,15:9,16:10,17:11,18:12,19:13,20:14,21:15,22:16,23:17,27:60,28:[1,71],29:47,30:[1,69],31:[1,70],32:22,33:[1,48],34:[1,49],35:[1,50],36:[1,51],37:[1,52],38:[1,53],39:21,44:61,45:[1,43],46:[1,44],47:[1,27],50:28,51:[1,58],52:[1,59],58:45,59:46,61:34,63:23,64:24,65:25,76:[1,68],79:[1,41],83:[1,26],88:[1,56],89:[1,57],90:[1,55],96:[1,36],100:[1,42],101:[1,54],103:37,104:[1,63],106:[1,64],107:38,108:[1,65],109:39,110:[1,66],111:67,119:[1,40],124:35,125:[1,62],127:[1,29],128:[1,30],129:[1,31],130:[1,32],131:[1,33]},{6:[1,281],25:[1,282],26:[1,329]},{6:[2,40],25:[2,40],26:[2,40],54:[2,40],78:[2,40]},{6:[2,58],25:[2,58],26:[2,58],49:[2,58],54:[2,58]},{1:[2,173],6:[2,173],25:[2,173],26:[2,173],49:[2,173],54:[2,173],57:[2,173],73:[2,173],78:[2,173],86:[2,173],91:[2,173],93:[2,173],102:[2,173],104:[2,173],105:[2,173],106:[2,173],110:[2,173],118:[2,173],126:[2,173],128:[2,173],129:[2,173],132:[2,173],133:[2,173],134:[2,173],135:[2,173],136:[2,173],137:[2,173]},{6:[2,127],25:[2,127],26:[2,127],54:[2,127],86:[2,127],91:[2,127]},{1:[2,170],6:[2,170],25:[2,170],26:[2,170],49:[2,170],54:[2,170],57:[2,170],73:[2,170],78:[2,170],86:[2,170],91:[2,170],93:[2,170],102:[2,170],103:82,104:[2,170],105:[2,170],106:[2,170],109:83,110:[2,170],111:67,118:[2,170],126:[2,170],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{1:[2,171],6:[2,171],25:[2,171],26:[2,171],49:[2,171],54:[2,171],57:[2,171],73:[2,171],78:[2,171],86:[2,171],91:[2,171],93:[2,171],102:[2,171],103:82,104:[2,171],105:[2,171],106:[2,171],109:83,110:[2,171],111:67,118:[2,171],126:[2,171],128:[1,75],129:[1,74],132:[1,73],133:[1,76],134:[1,77],135:[1,78],136:[1,79],137:[1,80]},{6:[2,94],25:[2,94],26:[2,94],54:[2,94],78:[2,94]}],\ndefaultActions: {58:[2,50],59:[2,51],89:[2,108],186:[2,88]},\nparseError: function parseError(str, hash) {\n    if (hash.recoverable) {\n        this.trace(str);\n    } else {\n        var e = new Error(str)\n        e.location = hash.loc\n        throw e;\n    }\n},\nparse: function parse(input) {\n    var self = this, stack = [0], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1;\n    this.lexer.setInput(input);\n    this.lexer.yy = this.yy;\n    this.yy.lexer = this.lexer;\n    this.yy.parser = this;\n    if (typeof this.lexer.yylloc == 'undefined') {\n        this.lexer.yylloc = {};\n    }\n    var yyloc = this.lexer.yylloc;\n    lstack.push(yyloc);\n    var ranges = this.lexer.options && this.lexer.options.ranges;\n    if (typeof this.yy.parseError === 'function') {\n        this.parseError = this.yy.parseError;\n    } else {\n        this.parseError = Object.getPrototypeOf(this).parseError;\n    }\n    function popStack(n) {\n        stack.length = stack.length - 2 * n;\n        vstack.length = vstack.length - n;\n        lstack.length = lstack.length - n;\n    }\n    function lex() {\n        var token;\n        token = self.lexer.lex() || EOF;\n        if (typeof token !== 'number') {\n            token = self.symbols_[token] || token;\n        }\n        return token;\n    }\n    var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected;\n    while (true) {\n        state = stack[stack.length - 1];\n        if (this.defaultActions[state]) {\n            action = this.defaultActions[state];\n        } else {\n            if (symbol === null || typeof symbol == 'undefined') {\n                symbol = lex();\n            }\n            action = table[state] && table[state][symbol];\n        }\n                    if (typeof action === 'undefined' || !action.length || !action[0]) {\n                var errStr = '';\n                expected = [];\n                for (p in table[state]) {\n                    if (this.terminals_[p] && p > TERROR) {\n                        expected.push('\\'' + this.terminals_[p] + '\\'');\n                    }\n                }\n                if (this.lexer.showPosition) {\n                    errStr = 'Expecting ' + expected.join(', ') + ', got \\'' + (this.terminals_[symbol] || symbol) + '\\'';\n                } else {\n                    errStr = 'Unexpected ' + (symbol == EOF ? 'end of input' : '\\'' + (this.terminals_[symbol] || symbol) + '\\'');\n                }\n                if (this.lexer.yylloc.first_line !== yyloc.first_line) yyloc = this.lexer.yylloc;\n                this.parseError(errStr, {\n                    text: this.lexer.match,\n                    token: this.terminals_[symbol] || symbol,\n                    line: this.lexer.yylineno,\n                    loc: yyloc,\n                    expected: expected\n                });\n            }\n        if (action[0] instanceof Array && action.length > 1) {\n            throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol);\n        }\n        switch (action[0]) {\n        case 1:\n            stack.push(symbol);\n            vstack.push(this.lexer.yytext);\n            lstack.push(this.lexer.yylloc);\n            stack.push(action[1]);\n            symbol = null;\n            if (!preErrorSymbol) {\n                yyleng = this.lexer.yyleng;\n                yytext = this.lexer.yytext;\n                yylineno = this.lexer.yylineno;\n                yyloc = this.lexer.yylloc;\n                if (recovering > 0) {\n                    recovering--;\n                }\n            } else {\n                symbol = preErrorSymbol;\n                preErrorSymbol = null;\n            }\n            break;\n        case 2:\n            len = this.productions_[action[1]][1];\n            yyval.$ = vstack[vstack.length - len];\n            yyval._$ = {\n                first_line: lstack[lstack.length - (len || 1)].first_line,\n                last_line: lstack[lstack.length - 1].last_line,\n                first_column: lstack[lstack.length - (len || 1)].first_column,\n                last_column: lstack[lstack.length - 1].last_column\n            };\n            if (ranges) {\n                yyval._$.range = [\n                    lstack[lstack.length - (len || 1)].range[0],\n                    lstack[lstack.length - 1].range[1]\n                ];\n            }\n            r = this.performAction.call(yyval, yytext, yyleng, yylineno, this.yy, action[1], vstack, lstack);\n            if (typeof r !== 'undefined') {\n                return r;\n            }\n            if (len) {\n                stack = stack.slice(0, -1 * len * 2);\n                vstack = vstack.slice(0, -1 * len);\n                lstack = lstack.slice(0, -1 * len);\n            }\n            stack.push(this.productions_[action[1]][0]);\n            vstack.push(yyval.$);\n            lstack.push(yyval._$);\n            newState = table[stack[stack.length - 2]][stack[stack.length - 1]];\n            stack.push(newState);\n            break;\n        case 3:\n            return true;\n        }\n    }\n    return true;\n}};\nundefined\nfunction Parser () {\n  this.yy = {};\n}\nParser.prototype = parser;parser.Parser = Parser;\n\nmodule.exports = new Parser;\n\n\n});\n\nace.define(\"ace/mode/coffee/scope\",[\"require\",\"exports\",\"module\",\"ace/mode/coffee/helpers\"], function(require, exports, module) {\n\n  var Scope, extend, last, _ref;\n\n  _ref = require('./helpers'), extend = _ref.extend, last = _ref.last;\n\n  exports.Scope = Scope = (function() {\n    Scope.root = null;\n\n    function Scope(parent, expressions, method) {\n      this.parent = parent;\n      this.expressions = expressions;\n      this.method = method;\n      this.variables = [\n        {\n          name: 'arguments',\n          type: 'arguments'\n        }\n      ];\n      this.positions = {};\n      if (!this.parent) {\n        Scope.root = this;\n      }\n    }\n\n    Scope.prototype.add = function(name, type, immediate) {\n      if (this.shared && !immediate) {\n        return this.parent.add(name, type, immediate);\n      }\n      if (Object.prototype.hasOwnProperty.call(this.positions, name)) {\n        return this.variables[this.positions[name]].type = type;\n      } else {\n        return this.positions[name] = this.variables.push({\n          name: name,\n          type: type\n        }) - 1;\n      }\n    };\n\n    Scope.prototype.namedMethod = function() {\n      var _ref1;\n      if (((_ref1 = this.method) != null ? _ref1.name : void 0) || !this.parent) {\n        return this.method;\n      }\n      return this.parent.namedMethod();\n    };\n\n    Scope.prototype.find = function(name) {\n      if (this.check(name)) {\n        return true;\n      }\n      this.add(name, 'var');\n      return false;\n    };\n\n    Scope.prototype.parameter = function(name) {\n      if (this.shared && this.parent.check(name, true)) {\n        return;\n      }\n      return this.add(name, 'param');\n    };\n\n    Scope.prototype.check = function(name) {\n      var _ref1;\n      return !!(this.type(name) || ((_ref1 = this.parent) != null ? _ref1.check(name) : void 0));\n    };\n\n    Scope.prototype.temporary = function(name, index) {\n      if (name.length > 1) {\n        return '_' + name + (index > 1 ? index - 1 : '');\n      } else {\n        return '_' + (index + parseInt(name, 36)).toString(36).replace(/\\d/g, 'a');\n      }\n    };\n\n    Scope.prototype.type = function(name) {\n      var v, _i, _len, _ref1;\n      _ref1 = this.variables;\n      for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n        v = _ref1[_i];\n        if (v.name === name) {\n          return v.type;\n        }\n      }\n      return null;\n    };\n\n    Scope.prototype.freeVariable = function(name, reserve) {\n      var index, temp;\n      if (reserve == null) {\n        reserve = true;\n      }\n      index = 0;\n      while (this.check((temp = this.temporary(name, index)))) {\n        index++;\n      }\n      if (reserve) {\n        this.add(temp, 'var', true);\n      }\n      return temp;\n    };\n\n    Scope.prototype.assign = function(name, value) {\n      this.add(name, {\n        value: value,\n        assigned: true\n      }, true);\n      return this.hasAssignments = true;\n    };\n\n    Scope.prototype.hasDeclarations = function() {\n      return !!this.declaredVariables().length;\n    };\n\n    Scope.prototype.declaredVariables = function() {\n      var realVars, tempVars, v, _i, _len, _ref1;\n      realVars = [];\n      tempVars = [];\n      _ref1 = this.variables;\n      for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n        v = _ref1[_i];\n        if (v.type === 'var') {\n          (v.name.charAt(0) === '_' ? tempVars : realVars).push(v.name);\n        }\n      }\n      return realVars.sort().concat(tempVars.sort());\n    };\n\n    Scope.prototype.assignedVariables = function() {\n      var v, _i, _len, _ref1, _results;\n      _ref1 = this.variables;\n      _results = [];\n      for (_i = 0, _len = _ref1.length; _i < _len; _i++) {\n        v = _ref1[_i];\n        if (v.type.assigned) {\n          _results.push(\"\" + v.name + \" = \" + v.type.value);\n        }\n      }\n      return _results;\n    };\n\n    return Scope;\n\n  })();\n\n\n});\n\nace.define(\"ace/mode/coffee/nodes\",[\"require\",\"exports\",\"module\",\"ace/mode/coffee/scope\",\"ace/mode/coffee/lexer\",\"ace/mode/coffee/helpers\"], function(require, exports, module) {\n\n  var Access, Arr, Assign, Base, Block, Call, Class, Code, CodeFragment, Comment, Existence, Extends, For, HEXNUM, IDENTIFIER, IDENTIFIER_STR, IS_REGEX, IS_STRING, If, In, Index, LEVEL_ACCESS, LEVEL_COND, LEVEL_LIST, LEVEL_OP, LEVEL_PAREN, LEVEL_TOP, Literal, METHOD_DEF, NEGATE, NO, NUMBER, Obj, Op, Param, Parens, RESERVED, Range, Return, SIMPLENUM, STRICT_PROSCRIBED, Scope, Slice, Splat, Switch, TAB, THIS, Throw, Try, UTILITIES, Value, While, YES, addLocationDataFn, compact, del, ends, extend, flatten, fragmentsToText, isLiteralArguments, isLiteralThis, last, locationDataToString, merge, multident, parseNum, some, starts, throwSyntaxError, unfoldSoak, utility, _ref, _ref1,\n    __hasProp = {}.hasOwnProperty,\n    __extends = 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; },\n    __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; },\n    __slice = [].slice;\n\n  Error.stackTraceLimit = Infinity;\n\n  Scope = require('./scope').Scope;\n\n  _ref = require('./lexer'), RESERVED = _ref.RESERVED, STRICT_PROSCRIBED = _ref.STRICT_PROSCRIBED;\n\n  _ref1 = require('./helpers'), compact = _ref1.compact, flatten = _ref1.flatten, extend = _ref1.extend, merge = _ref1.merge, del = _ref1.del, starts = _ref1.starts, ends = _ref1.ends, last = _ref1.last, some = _ref1.some, addLocationDataFn = _ref1.addLocationDataFn, locationDataToString = _ref1.locationDataToString, throwSyntaxError = _ref1.throwSyntaxError;\n\n  exports.extend = extend;\n\n  exports.addLocationDataFn = addLocationDataFn;\n\n  YES = function() {\n    return true;\n  };\n\n  NO = function() {\n    return false;\n  };\n\n  THIS = function() {\n    return this;\n  };\n\n  NEGATE = function() {\n    this.negated = !this.negated;\n    return this;\n  };\n\n  exports.CodeFragment = CodeFragment = (function() {\n    function CodeFragment(parent, code) {\n      var _ref2;\n      this.code = \"\" + code;\n      this.locationData = parent != null ? parent.locationData : void 0;\n      this.type = (parent != null ? (_ref2 = parent.constructor) != null ? _ref2.name : void 0 : void 0) || 'unknown';\n    }\n\n    CodeFragment.prototype.toString = function() {\n      return \"\" + this.code + (this.locationData ? \": \" + locationDataToString(this.locationData) : '');\n    };\n\n    return CodeFragment;\n\n  })();\n\n  fragmentsToText = function(fragments) {\n    var fragment;\n    return ((function() {\n      var _i, _len, _results;\n      _results = [];\n      for (_i = 0, _len = fragments.length; _i < _len; _i++) {\n        fragment = fragments[_i];\n        _results.push(fragment.code);\n      }\n      return _results;\n    })()).join('');\n  };\n\n  exports.Base = Base = (function() {\n    function Base() {}\n\n    Base.prototype.compile = function(o, lvl) {\n      return fragmentsToText(this.compileToFragments(o, lvl));\n    };\n\n    Base.prototype.compileToFragments = function(o, lvl) {\n      var node;\n      o = extend({}, o);\n      if (lvl) {\n        o.level = lvl;\n      }\n      node = this.unfoldSoak(o) || this;\n      node.tab = o.indent;\n      if (o.level === LEVEL_TOP || !node.isStatement(o)) {\n        return node.compileNode(o);\n      } else {\n        return node.compileClosure(o);\n      }\n    };\n\n    Base.prototype.compileClosure = function(o) {\n      var args, argumentsNode, func, jumpNode, meth;\n      if (jumpNode = this.jumps()) {\n        jumpNode.error('cannot use a pure statement in an expression');\n      }\n      o.sharedScope = true;\n      func = new Code([], Block.wrap([this]));\n      args = [];\n      if ((argumentsNode = this.contains(isLiteralArguments)) || this.contains(isLiteralThis)) {\n        args = [new Literal('this')];\n        if (argumentsNode) {\n          meth = 'apply';\n          args.push(new Literal('arguments'));\n        } else {\n          meth = 'call';\n        }\n        func = new Value(func, [new Access(new Literal(meth))]);\n      }\n      return (new Call(func, args)).compileNode(o);\n    };\n\n    Base.prototype.cache = function(o, level, reused) {\n      var ref, sub;\n      if (!this.isComplex()) {\n        ref = level ? this.compileToFragments(o, level) : this;\n        return [ref, ref];\n      } else {\n        ref = new Literal(reused || o.scope.freeVariable('ref'));\n        sub = new Assign(ref, this);\n        if (level) {\n          return [sub.compileToFragments(o, level), [this.makeCode(ref.value)]];\n        } else {\n          return [sub, ref];\n        }\n      }\n    };\n\n    Base.prototype.cacheToCodeFragments = function(cacheValues) {\n      return [fragmentsToText(cacheValues[0]), fragmentsToText(cacheValues[1])];\n    };\n\n    Base.prototype.makeReturn = function(res) {\n      var me;\n      me = this.unwrapAll();\n      if (res) {\n        return new Call(new Literal(\"\" + res + \".push\"), [me]);\n      } else {\n        return new Return(me);\n      }\n    };\n\n    Base.prototype.contains = function(pred) {\n      var node;\n      node = void 0;\n      this.traverseChildren(false, function(n) {\n        if (pred(n)) {\n          node = n;\n          return false;\n        }\n      });\n      return node;\n    };\n\n    Base.prototype.lastNonComment = function(list) {\n      var i;\n      i = list.length;\n      while (i--) {\n        if (!(list[i] instanceof Comment)) {\n          return list[i];\n        }\n      }\n      return null;\n    };\n\n    Base.prototype.toString = function(idt, name) {\n      var tree;\n      if (idt == null) {\n        idt = '';\n      }\n      if (name == null) {\n        name = this.constructor.name;\n      }\n      tree = '\\n' + idt + name;\n      if (this.soak) {\n        tree += '?';\n      }\n      this.eachChild(function(node) {\n        return tree += node.toString(idt + TAB);\n      });\n      return tree;\n    };\n\n    Base.prototype.eachChild = function(func) {\n      var attr, child, _i, _j, _len, _len1, _ref2, _ref3;\n      if (!this.children) {\n        return this;\n      }\n      _ref2 = this.children;\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        attr = _ref2[_i];\n        if (this[attr]) {\n          _ref3 = flatten([this[attr]]);\n          for (_j = 0, _len1 = _ref3.length; _j < _len1; _j++) {\n            child = _ref3[_j];\n            if (func(child) === false) {\n              return this;\n            }\n          }\n        }\n      }\n      return this;\n    };\n\n    Base.prototype.traverseChildren = function(crossScope, func) {\n      return this.eachChild(function(child) {\n        var recur;\n        recur = func(child);\n        if (recur !== false) {\n          return child.traverseChildren(crossScope, func);\n        }\n      });\n    };\n\n    Base.prototype.invert = function() {\n      return new Op('!', this);\n    };\n\n    Base.prototype.unwrapAll = function() {\n      var node;\n      node = this;\n      while (node !== (node = node.unwrap())) {\n        continue;\n      }\n      return node;\n    };\n\n    Base.prototype.children = [];\n\n    Base.prototype.isStatement = NO;\n\n    Base.prototype.jumps = NO;\n\n    Base.prototype.isComplex = YES;\n\n    Base.prototype.isChainable = NO;\n\n    Base.prototype.isAssignable = NO;\n\n    Base.prototype.unwrap = THIS;\n\n    Base.prototype.unfoldSoak = NO;\n\n    Base.prototype.assigns = NO;\n\n    Base.prototype.updateLocationDataIfMissing = function(locationData) {\n      if (this.locationData) {\n        return this;\n      }\n      this.locationData = locationData;\n      return this.eachChild(function(child) {\n        return child.updateLocationDataIfMissing(locationData);\n      });\n    };\n\n    Base.prototype.error = function(message) {\n      return throwSyntaxError(message, this.locationData);\n    };\n\n    Base.prototype.makeCode = function(code) {\n      return new CodeFragment(this, code);\n    };\n\n    Base.prototype.wrapInBraces = function(fragments) {\n      return [].concat(this.makeCode('('), fragments, this.makeCode(')'));\n    };\n\n    Base.prototype.joinFragmentArrays = function(fragmentsList, joinStr) {\n      var answer, fragments, i, _i, _len;\n      answer = [];\n      for (i = _i = 0, _len = fragmentsList.length; _i < _len; i = ++_i) {\n        fragments = fragmentsList[i];\n        if (i) {\n          answer.push(this.makeCode(joinStr));\n        }\n        answer = answer.concat(fragments);\n      }\n      return answer;\n    };\n\n    return Base;\n\n  })();\n\n  exports.Block = Block = (function(_super) {\n    __extends(Block, _super);\n\n    function Block(nodes) {\n      this.expressions = compact(flatten(nodes || []));\n    }\n\n    Block.prototype.children = ['expressions'];\n\n    Block.prototype.push = function(node) {\n      this.expressions.push(node);\n      return this;\n    };\n\n    Block.prototype.pop = function() {\n      return this.expressions.pop();\n    };\n\n    Block.prototype.unshift = function(node) {\n      this.expressions.unshift(node);\n      return this;\n    };\n\n    Block.prototype.unwrap = function() {\n      if (this.expressions.length === 1) {\n        return this.expressions[0];\n      } else {\n        return this;\n      }\n    };\n\n    Block.prototype.isEmpty = function() {\n      return !this.expressions.length;\n    };\n\n    Block.prototype.isStatement = function(o) {\n      var exp, _i, _len, _ref2;\n      _ref2 = this.expressions;\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        exp = _ref2[_i];\n        if (exp.isStatement(o)) {\n          return true;\n        }\n      }\n      return false;\n    };\n\n    Block.prototype.jumps = function(o) {\n      var exp, jumpNode, _i, _len, _ref2;\n      _ref2 = this.expressions;\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        exp = _ref2[_i];\n        if (jumpNode = exp.jumps(o)) {\n          return jumpNode;\n        }\n      }\n    };\n\n    Block.prototype.makeReturn = function(res) {\n      var expr, len;\n      len = this.expressions.length;\n      while (len--) {\n        expr = this.expressions[len];\n        if (!(expr instanceof Comment)) {\n          this.expressions[len] = expr.makeReturn(res);\n          if (expr instanceof Return && !expr.expression) {\n            this.expressions.splice(len, 1);\n          }\n          break;\n        }\n      }\n      return this;\n    };\n\n    Block.prototype.compileToFragments = function(o, level) {\n      if (o == null) {\n        o = {};\n      }\n      if (o.scope) {\n        return Block.__super__.compileToFragments.call(this, o, level);\n      } else {\n        return this.compileRoot(o);\n      }\n    };\n\n    Block.prototype.compileNode = function(o) {\n      var answer, compiledNodes, fragments, index, node, top, _i, _len, _ref2;\n      this.tab = o.indent;\n      top = o.level === LEVEL_TOP;\n      compiledNodes = [];\n      _ref2 = this.expressions;\n      for (index = _i = 0, _len = _ref2.length; _i < _len; index = ++_i) {\n        node = _ref2[index];\n        node = node.unwrapAll();\n        node = node.unfoldSoak(o) || node;\n        if (node instanceof Block) {\n          compiledNodes.push(node.compileNode(o));\n        } else if (top) {\n          node.front = true;\n          fragments = node.compileToFragments(o);\n          if (!node.isStatement(o)) {\n            fragments.unshift(this.makeCode(\"\" + this.tab));\n            fragments.push(this.makeCode(\";\"));\n          }\n          compiledNodes.push(fragments);\n        } else {\n          compiledNodes.push(node.compileToFragments(o, LEVEL_LIST));\n        }\n      }\n      if (top) {\n        if (this.spaced) {\n          return [].concat(this.joinFragmentArrays(compiledNodes, '\\n\\n'), this.makeCode(\"\\n\"));\n        } else {\n          return this.joinFragmentArrays(compiledNodes, '\\n');\n        }\n      }\n      if (compiledNodes.length) {\n        answer = this.joinFragmentArrays(compiledNodes, ', ');\n      } else {\n        answer = [this.makeCode(\"void 0\")];\n      }\n      if (compiledNodes.length > 1 && o.level >= LEVEL_LIST) {\n        return this.wrapInBraces(answer);\n      } else {\n        return answer;\n      }\n    };\n\n    Block.prototype.compileRoot = function(o) {\n      var exp, fragments, i, name, prelude, preludeExps, rest, _i, _len, _ref2;\n      o.indent = o.bare ? '' : TAB;\n      o.level = LEVEL_TOP;\n      this.spaced = true;\n      o.scope = new Scope(null, this, null);\n      _ref2 = o.locals || [];\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        name = _ref2[_i];\n        o.scope.parameter(name);\n      }\n      prelude = [];\n      if (!o.bare) {\n        preludeExps = (function() {\n          var _j, _len1, _ref3, _results;\n          _ref3 = this.expressions;\n          _results = [];\n          for (i = _j = 0, _len1 = _ref3.length; _j < _len1; i = ++_j) {\n            exp = _ref3[i];\n            if (!(exp.unwrap() instanceof Comment)) {\n              break;\n            }\n            _results.push(exp);\n          }\n          return _results;\n        }).call(this);\n        rest = this.expressions.slice(preludeExps.length);\n        this.expressions = preludeExps;\n        if (preludeExps.length) {\n          prelude = this.compileNode(merge(o, {\n            indent: ''\n          }));\n          prelude.push(this.makeCode(\"\\n\"));\n        }\n        this.expressions = rest;\n      }\n      fragments = this.compileWithDeclarations(o);\n      if (o.bare) {\n        return fragments;\n      }\n      return [].concat(prelude, this.makeCode(\"(function() {\\n\"), fragments, this.makeCode(\"\\n}).call(this);\\n\"));\n    };\n\n    Block.prototype.compileWithDeclarations = function(o) {\n      var assigns, declars, exp, fragments, i, post, rest, scope, spaced, _i, _len, _ref2, _ref3, _ref4;\n      fragments = [];\n      post = [];\n      _ref2 = this.expressions;\n      for (i = _i = 0, _len = _ref2.length; _i < _len; i = ++_i) {\n        exp = _ref2[i];\n        exp = exp.unwrap();\n        if (!(exp instanceof Comment || exp instanceof Literal)) {\n          break;\n        }\n      }\n      o = merge(o, {\n        level: LEVEL_TOP\n      });\n      if (i) {\n        rest = this.expressions.splice(i, 9e9);\n        _ref3 = [this.spaced, false], spaced = _ref3[0], this.spaced = _ref3[1];\n        _ref4 = [this.compileNode(o), spaced], fragments = _ref4[0], this.spaced = _ref4[1];\n        this.expressions = rest;\n      }\n      post = this.compileNode(o);\n      scope = o.scope;\n      if (scope.expressions === this) {\n        declars = o.scope.hasDeclarations();\n        assigns = scope.hasAssignments;\n        if (declars || assigns) {\n          if (i) {\n            fragments.push(this.makeCode('\\n'));\n          }\n          fragments.push(this.makeCode(\"\" + this.tab + \"var \"));\n          if (declars) {\n            fragments.push(this.makeCode(scope.declaredVariables().join(', ')));\n          }\n          if (assigns) {\n            if (declars) {\n              fragments.push(this.makeCode(\",\\n\" + (this.tab + TAB)));\n            }\n            fragments.push(this.makeCode(scope.assignedVariables().join(\",\\n\" + (this.tab + TAB))));\n          }\n          fragments.push(this.makeCode(\";\\n\" + (this.spaced ? '\\n' : '')));\n        } else if (fragments.length && post.length) {\n          fragments.push(this.makeCode(\"\\n\"));\n        }\n      }\n      return fragments.concat(post);\n    };\n\n    Block.wrap = function(nodes) {\n      if (nodes.length === 1 && nodes[0] instanceof Block) {\n        return nodes[0];\n      }\n      return new Block(nodes);\n    };\n\n    return Block;\n\n  })(Base);\n\n  exports.Literal = Literal = (function(_super) {\n    __extends(Literal, _super);\n\n    function Literal(value) {\n      this.value = value;\n    }\n\n    Literal.prototype.makeReturn = function() {\n      if (this.isStatement()) {\n        return this;\n      } else {\n        return Literal.__super__.makeReturn.apply(this, arguments);\n      }\n    };\n\n    Literal.prototype.isAssignable = function() {\n      return IDENTIFIER.test(this.value);\n    };\n\n    Literal.prototype.isStatement = function() {\n      var _ref2;\n      return (_ref2 = this.value) === 'break' || _ref2 === 'continue' || _ref2 === 'debugger';\n    };\n\n    Literal.prototype.isComplex = NO;\n\n    Literal.prototype.assigns = function(name) {\n      return name === this.value;\n    };\n\n    Literal.prototype.jumps = function(o) {\n      if (this.value === 'break' && !((o != null ? o.loop : void 0) || (o != null ? o.block : void 0))) {\n        return this;\n      }\n      if (this.value === 'continue' && !(o != null ? o.loop : void 0)) {\n        return this;\n      }\n    };\n\n    Literal.prototype.compileNode = function(o) {\n      var answer, code, _ref2;\n      code = this.value === 'this' ? ((_ref2 = o.scope.method) != null ? _ref2.bound : void 0) ? o.scope.method.context : this.value : this.value.reserved ? \"\\\"\" + this.value + \"\\\"\" : this.value;\n      answer = this.isStatement() ? \"\" + this.tab + code + \";\" : code;\n      return [this.makeCode(answer)];\n    };\n\n    Literal.prototype.toString = function() {\n      return ' \"' + this.value + '\"';\n    };\n\n    return Literal;\n\n  })(Base);\n\n  exports.Undefined = (function(_super) {\n    __extends(Undefined, _super);\n\n    function Undefined() {\n      return Undefined.__super__.constructor.apply(this, arguments);\n    }\n\n    Undefined.prototype.isAssignable = NO;\n\n    Undefined.prototype.isComplex = NO;\n\n    Undefined.prototype.compileNode = function(o) {\n      return [this.makeCode(o.level >= LEVEL_ACCESS ? '(void 0)' : 'void 0')];\n    };\n\n    return Undefined;\n\n  })(Base);\n\n  exports.Null = (function(_super) {\n    __extends(Null, _super);\n\n    function Null() {\n      return Null.__super__.constructor.apply(this, arguments);\n    }\n\n    Null.prototype.isAssignable = NO;\n\n    Null.prototype.isComplex = NO;\n\n    Null.prototype.compileNode = function() {\n      return [this.makeCode(\"null\")];\n    };\n\n    return Null;\n\n  })(Base);\n\n  exports.Bool = (function(_super) {\n    __extends(Bool, _super);\n\n    Bool.prototype.isAssignable = NO;\n\n    Bool.prototype.isComplex = NO;\n\n    Bool.prototype.compileNode = function() {\n      return [this.makeCode(this.val)];\n    };\n\n    function Bool(val) {\n      this.val = val;\n    }\n\n    return Bool;\n\n  })(Base);\n\n  exports.Return = Return = (function(_super) {\n    __extends(Return, _super);\n\n    function Return(expr) {\n      if (expr && !expr.unwrap().isUndefined) {\n        this.expression = expr;\n      }\n    }\n\n    Return.prototype.children = ['expression'];\n\n    Return.prototype.isStatement = YES;\n\n    Return.prototype.makeReturn = THIS;\n\n    Return.prototype.jumps = THIS;\n\n    Return.prototype.compileToFragments = function(o, level) {\n      var expr, _ref2;\n      expr = (_ref2 = this.expression) != null ? _ref2.makeReturn() : void 0;\n      if (expr && !(expr instanceof Return)) {\n        return expr.compileToFragments(o, level);\n      } else {\n        return Return.__super__.compileToFragments.call(this, o, level);\n      }\n    };\n\n    Return.prototype.compileNode = function(o) {\n      var answer;\n      answer = [];\n      answer.push(this.makeCode(this.tab + (\"return\" + (this.expression ? \" \" : \"\"))));\n      if (this.expression) {\n        answer = answer.concat(this.expression.compileToFragments(o, LEVEL_PAREN));\n      }\n      answer.push(this.makeCode(\";\"));\n      return answer;\n    };\n\n    return Return;\n\n  })(Base);\n\n  exports.Value = Value = (function(_super) {\n    __extends(Value, _super);\n\n    function Value(base, props, tag) {\n      if (!props && base instanceof Value) {\n        return base;\n      }\n      this.base = base;\n      this.properties = props || [];\n      if (tag) {\n        this[tag] = true;\n      }\n      return this;\n    }\n\n    Value.prototype.children = ['base', 'properties'];\n\n    Value.prototype.add = function(props) {\n      this.properties = this.properties.concat(props);\n      return this;\n    };\n\n    Value.prototype.hasProperties = function() {\n      return !!this.properties.length;\n    };\n\n    Value.prototype.bareLiteral = function(type) {\n      return !this.properties.length && this.base instanceof type;\n    };\n\n    Value.prototype.isArray = function() {\n      return this.bareLiteral(Arr);\n    };\n\n    Value.prototype.isRange = function() {\n      return this.bareLiteral(Range);\n    };\n\n    Value.prototype.isComplex = function() {\n      return this.hasProperties() || this.base.isComplex();\n    };\n\n    Value.prototype.isAssignable = function() {\n      return this.hasProperties() || this.base.isAssignable();\n    };\n\n    Value.prototype.isSimpleNumber = function() {\n      return this.bareLiteral(Literal) && SIMPLENUM.test(this.base.value);\n    };\n\n    Value.prototype.isString = function() {\n      return this.bareLiteral(Literal) && IS_STRING.test(this.base.value);\n    };\n\n    Value.prototype.isRegex = function() {\n      return this.bareLiteral(Literal) && IS_REGEX.test(this.base.value);\n    };\n\n    Value.prototype.isAtomic = function() {\n      var node, _i, _len, _ref2;\n      _ref2 = this.properties.concat(this.base);\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        node = _ref2[_i];\n        if (node.soak || node instanceof Call) {\n          return false;\n        }\n      }\n      return true;\n    };\n\n    Value.prototype.isNotCallable = function() {\n      return this.isSimpleNumber() || this.isString() || this.isRegex() || this.isArray() || this.isRange() || this.isSplice() || this.isObject();\n    };\n\n    Value.prototype.isStatement = function(o) {\n      return !this.properties.length && this.base.isStatement(o);\n    };\n\n    Value.prototype.assigns = function(name) {\n      return !this.properties.length && this.base.assigns(name);\n    };\n\n    Value.prototype.jumps = function(o) {\n      return !this.properties.length && this.base.jumps(o);\n    };\n\n    Value.prototype.isObject = function(onlyGenerated) {\n      if (this.properties.length) {\n        return false;\n      }\n      return (this.base instanceof Obj) && (!onlyGenerated || this.base.generated);\n    };\n\n    Value.prototype.isSplice = function() {\n      return last(this.properties) instanceof Slice;\n    };\n\n    Value.prototype.looksStatic = function(className) {\n      var _ref2;\n      return this.base.value === className && this.properties.length && ((_ref2 = this.properties[0].name) != null ? _ref2.value : void 0) !== 'prototype';\n    };\n\n    Value.prototype.unwrap = function() {\n      if (this.properties.length) {\n        return this;\n      } else {\n        return this.base;\n      }\n    };\n\n    Value.prototype.cacheReference = function(o) {\n      var base, bref, name, nref;\n      name = last(this.properties);\n      if (this.properties.length < 2 && !this.base.isComplex() && !(name != null ? name.isComplex() : void 0)) {\n        return [this, this];\n      }\n      base = new Value(this.base, this.properties.slice(0, -1));\n      if (base.isComplex()) {\n        bref = new Literal(o.scope.freeVariable('base'));\n        base = new Value(new Parens(new Assign(bref, base)));\n      }\n      if (!name) {\n        return [base, bref];\n      }\n      if (name.isComplex()) {\n        nref = new Literal(o.scope.freeVariable('name'));\n        name = new Index(new Assign(nref, name.index));\n        nref = new Index(nref);\n      }\n      return [base.add(name), new Value(bref || base.base, [nref || name])];\n    };\n\n    Value.prototype.compileNode = function(o) {\n      var fragments, prop, props, _i, _len;\n      this.base.front = this.front;\n      props = this.properties;\n      fragments = this.base.compileToFragments(o, (props.length ? LEVEL_ACCESS : null));\n      if ((this.base instanceof Parens || props.length) && SIMPLENUM.test(fragmentsToText(fragments))) {\n        fragments.push(this.makeCode('.'));\n      }\n      for (_i = 0, _len = props.length; _i < _len; _i++) {\n        prop = props[_i];\n        fragments.push.apply(fragments, prop.compileToFragments(o));\n      }\n      return fragments;\n    };\n\n    Value.prototype.unfoldSoak = function(o) {\n      return this.unfoldedSoak != null ? this.unfoldedSoak : this.unfoldedSoak = (function(_this) {\n        return function() {\n          var fst, i, ifn, prop, ref, snd, _i, _len, _ref2, _ref3;\n          if (ifn = _this.base.unfoldSoak(o)) {\n            (_ref2 = ifn.body.properties).push.apply(_ref2, _this.properties);\n            return ifn;\n          }\n          _ref3 = _this.properties;\n          for (i = _i = 0, _len = _ref3.length; _i < _len; i = ++_i) {\n            prop = _ref3[i];\n            if (!prop.soak) {\n              continue;\n            }\n            prop.soak = false;\n            fst = new Value(_this.base, _this.properties.slice(0, i));\n            snd = new Value(_this.base, _this.properties.slice(i));\n            if (fst.isComplex()) {\n              ref = new Literal(o.scope.freeVariable('ref'));\n              fst = new Parens(new Assign(ref, fst));\n              snd.base = ref;\n            }\n            return new If(new Existence(fst), snd, {\n              soak: true\n            });\n          }\n          return false;\n        };\n      })(this)();\n    };\n\n    return Value;\n\n  })(Base);\n\n  exports.Comment = Comment = (function(_super) {\n    __extends(Comment, _super);\n\n    function Comment(comment) {\n      this.comment = comment;\n    }\n\n    Comment.prototype.isStatement = YES;\n\n    Comment.prototype.makeReturn = THIS;\n\n    Comment.prototype.compileNode = function(o, level) {\n      var code, comment;\n      comment = this.comment.replace(/^(\\s*)#/gm, \"$1 *\");\n      code = \"/*\" + (multident(comment, this.tab)) + (__indexOf.call(comment, '\\n') >= 0 ? \"\\n\" + this.tab : '') + \" */\";\n      if ((level || o.level) === LEVEL_TOP) {\n        code = o.indent + code;\n      }\n      return [this.makeCode(\"\\n\"), this.makeCode(code)];\n    };\n\n    return Comment;\n\n  })(Base);\n\n  exports.Call = Call = (function(_super) {\n    __extends(Call, _super);\n\n    function Call(variable, args, soak) {\n      this.args = args != null ? args : [];\n      this.soak = soak;\n      this.isNew = false;\n      this.isSuper = variable === 'super';\n      this.variable = this.isSuper ? null : variable;\n      if (variable instanceof Value && variable.isNotCallable()) {\n        variable.error(\"literal is not a function\");\n      }\n    }\n\n    Call.prototype.children = ['variable', 'args'];\n\n    Call.prototype.newInstance = function() {\n      var base, _ref2;\n      base = ((_ref2 = this.variable) != null ? _ref2.base : void 0) || this.variable;\n      if (base instanceof Call && !base.isNew) {\n        base.newInstance();\n      } else {\n        this.isNew = true;\n      }\n      return this;\n    };\n\n    Call.prototype.superReference = function(o) {\n      var accesses, method;\n      method = o.scope.namedMethod();\n      if (method != null ? method.klass : void 0) {\n        accesses = [new Access(new Literal('__super__'))];\n        if (method[\"static\"]) {\n          accesses.push(new Access(new Literal('constructor')));\n        }\n        accesses.push(new Access(new Literal(method.name)));\n        return (new Value(new Literal(method.klass), accesses)).compile(o);\n      } else if (method != null ? method.ctor : void 0) {\n        return \"\" + method.name + \".__super__.constructor\";\n      } else {\n        return this.error('cannot call super outside of an instance method.');\n      }\n    };\n\n    Call.prototype.superThis = function(o) {\n      var method;\n      method = o.scope.method;\n      return (method && !method.klass && method.context) || \"this\";\n    };\n\n    Call.prototype.unfoldSoak = function(o) {\n      var call, ifn, left, list, rite, _i, _len, _ref2, _ref3;\n      if (this.soak) {\n        if (this.variable) {\n          if (ifn = unfoldSoak(o, this, 'variable')) {\n            return ifn;\n          }\n          _ref2 = new Value(this.variable).cacheReference(o), left = _ref2[0], rite = _ref2[1];\n        } else {\n          left = new Literal(this.superReference(o));\n          rite = new Value(left);\n        }\n        rite = new Call(rite, this.args);\n        rite.isNew = this.isNew;\n        left = new Literal(\"typeof \" + (left.compile(o)) + \" === \\\"function\\\"\");\n        return new If(left, new Value(rite), {\n          soak: true\n        });\n      }\n      call = this;\n      list = [];\n      while (true) {\n        if (call.variable instanceof Call) {\n          list.push(call);\n          call = call.variable;\n          continue;\n        }\n        if (!(call.variable instanceof Value)) {\n          break;\n        }\n        list.push(call);\n        if (!((call = call.variable.base) instanceof Call)) {\n          break;\n        }\n      }\n      _ref3 = list.reverse();\n      for (_i = 0, _len = _ref3.length; _i < _len; _i++) {\n        call = _ref3[_i];\n        if (ifn) {\n          if (call.variable instanceof Call) {\n            call.variable = ifn;\n          } else {\n            call.variable.base = ifn;\n          }\n        }\n        ifn = unfoldSoak(o, call, 'variable');\n      }\n      return ifn;\n    };\n\n    Call.prototype.compileNode = function(o) {\n      var arg, argIndex, compiledArgs, compiledArray, fragments, preface, _i, _len, _ref2, _ref3;\n      if ((_ref2 = this.variable) != null) {\n        _ref2.front = this.front;\n      }\n      compiledArray = Splat.compileSplattedArray(o, this.args, true);\n      if (compiledArray.length) {\n        return this.compileSplat(o, compiledArray);\n      }\n      compiledArgs = [];\n      _ref3 = this.args;\n      for (argIndex = _i = 0, _len = _ref3.length; _i < _len; argIndex = ++_i) {\n        arg = _ref3[argIndex];\n        if (argIndex) {\n          compiledArgs.push(this.makeCode(\", \"));\n        }\n        compiledArgs.push.apply(compiledArgs, arg.compileToFragments(o, LEVEL_LIST));\n      }\n      fragments = [];\n      if (this.isSuper) {\n        preface = this.superReference(o) + (\".call(\" + (this.superThis(o)));\n        if (compiledArgs.length) {\n          preface += \", \";\n        }\n        fragments.push(this.makeCode(preface));\n      } else {\n        if (this.isNew) {\n          fragments.push(this.makeCode('new '));\n        }\n        fragments.push.apply(fragments, this.variable.compileToFragments(o, LEVEL_ACCESS));\n        fragments.push(this.makeCode(\"(\"));\n      }\n      fragments.push.apply(fragments, compiledArgs);\n      fragments.push(this.makeCode(\")\"));\n      return fragments;\n    };\n\n    Call.prototype.compileSplat = function(o, splatArgs) {\n      var answer, base, fun, idt, name, ref;\n      if (this.isSuper) {\n        return [].concat(this.makeCode(\"\" + (this.superReference(o)) + \".apply(\" + (this.superThis(o)) + \", \"), splatArgs, this.makeCode(\")\"));\n      }\n      if (this.isNew) {\n        idt = this.tab + TAB;\n        return [].concat(this.makeCode(\"(function(func, args, ctor) {\\n\" + idt + \"ctor.prototype = func.prototype;\\n\" + idt + \"var child = new ctor, result = func.apply(child, args);\\n\" + idt + \"return Object(result) === result ? result : child;\\n\" + this.tab + \"})(\"), this.variable.compileToFragments(o, LEVEL_LIST), this.makeCode(\", \"), splatArgs, this.makeCode(\", function(){})\"));\n      }\n      answer = [];\n      base = new Value(this.variable);\n      if ((name = base.properties.pop()) && base.isComplex()) {\n        ref = o.scope.freeVariable('ref');\n        answer = answer.concat(this.makeCode(\"(\" + ref + \" = \"), base.compileToFragments(o, LEVEL_LIST), this.makeCode(\")\"), name.compileToFragments(o));\n      } else {\n        fun = base.compileToFragments(o, LEVEL_ACCESS);\n        if (SIMPLENUM.test(fragmentsToText(fun))) {\n          fun = this.wrapInBraces(fun);\n        }\n        if (name) {\n          ref = fragmentsToText(fun);\n          fun.push.apply(fun, name.compileToFragments(o));\n        } else {\n          ref = 'null';\n        }\n        answer = answer.concat(fun);\n      }\n      return answer = answer.concat(this.makeCode(\".apply(\" + ref + \", \"), splatArgs, this.makeCode(\")\"));\n    };\n\n    return Call;\n\n  })(Base);\n\n  exports.Extends = Extends = (function(_super) {\n    __extends(Extends, _super);\n\n    function Extends(child, parent) {\n      this.child = child;\n      this.parent = parent;\n    }\n\n    Extends.prototype.children = ['child', 'parent'];\n\n    Extends.prototype.compileToFragments = function(o) {\n      return new Call(new Value(new Literal(utility('extends'))), [this.child, this.parent]).compileToFragments(o);\n    };\n\n    return Extends;\n\n  })(Base);\n\n  exports.Access = Access = (function(_super) {\n    __extends(Access, _super);\n\n    function Access(name, tag) {\n      this.name = name;\n      this.name.asKey = true;\n      this.soak = tag === 'soak';\n    }\n\n    Access.prototype.children = ['name'];\n\n    Access.prototype.compileToFragments = function(o) {\n      var name;\n      name = this.name.compileToFragments(o);\n      if (IDENTIFIER.test(fragmentsToText(name))) {\n        name.unshift(this.makeCode(\".\"));\n      } else {\n        name.unshift(this.makeCode(\"[\"));\n        name.push(this.makeCode(\"]\"));\n      }\n      return name;\n    };\n\n    Access.prototype.isComplex = NO;\n\n    return Access;\n\n  })(Base);\n\n  exports.Index = Index = (function(_super) {\n    __extends(Index, _super);\n\n    function Index(index) {\n      this.index = index;\n    }\n\n    Index.prototype.children = ['index'];\n\n    Index.prototype.compileToFragments = function(o) {\n      return [].concat(this.makeCode(\"[\"), this.index.compileToFragments(o, LEVEL_PAREN), this.makeCode(\"]\"));\n    };\n\n    Index.prototype.isComplex = function() {\n      return this.index.isComplex();\n    };\n\n    return Index;\n\n  })(Base);\n\n  exports.Range = Range = (function(_super) {\n    __extends(Range, _super);\n\n    Range.prototype.children = ['from', 'to'];\n\n    function Range(from, to, tag) {\n      this.from = from;\n      this.to = to;\n      this.exclusive = tag === 'exclusive';\n      this.equals = this.exclusive ? '' : '=';\n    }\n\n    Range.prototype.compileVariables = function(o) {\n      var step, _ref2, _ref3, _ref4, _ref5;\n      o = merge(o, {\n        top: true\n      });\n      _ref2 = this.cacheToCodeFragments(this.from.cache(o, LEVEL_LIST)), this.fromC = _ref2[0], this.fromVar = _ref2[1];\n      _ref3 = this.cacheToCodeFragments(this.to.cache(o, LEVEL_LIST)), this.toC = _ref3[0], this.toVar = _ref3[1];\n      if (step = del(o, 'step')) {\n        _ref4 = this.cacheToCodeFragments(step.cache(o, LEVEL_LIST)), this.step = _ref4[0], this.stepVar = _ref4[1];\n      }\n      _ref5 = [this.fromVar.match(NUMBER), this.toVar.match(NUMBER)], this.fromNum = _ref5[0], this.toNum = _ref5[1];\n      if (this.stepVar) {\n        return this.stepNum = this.stepVar.match(NUMBER);\n      }\n    };\n\n    Range.prototype.compileNode = function(o) {\n      var cond, condPart, from, gt, idx, idxName, known, lt, namedIndex, stepPart, to, varPart, _ref2, _ref3;\n      if (!this.fromVar) {\n        this.compileVariables(o);\n      }\n      if (!o.index) {\n        return this.compileArray(o);\n      }\n      known = this.fromNum && this.toNum;\n      idx = del(o, 'index');\n      idxName = del(o, 'name');\n      namedIndex = idxName && idxName !== idx;\n      varPart = \"\" + idx + \" = \" + this.fromC;\n      if (this.toC !== this.toVar) {\n        varPart += \", \" + this.toC;\n      }\n      if (this.step !== this.stepVar) {\n        varPart += \", \" + this.step;\n      }\n      _ref2 = [\"\" + idx + \" <\" + this.equals, \"\" + idx + \" >\" + this.equals], lt = _ref2[0], gt = _ref2[1];\n      condPart = this.stepNum ? parseNum(this.stepNum[0]) > 0 ? \"\" + lt + \" \" + this.toVar : \"\" + gt + \" \" + this.toVar : known ? ((_ref3 = [parseNum(this.fromNum[0]), parseNum(this.toNum[0])], from = _ref3[0], to = _ref3[1], _ref3), from <= to ? \"\" + lt + \" \" + to : \"\" + gt + \" \" + to) : (cond = this.stepVar ? \"\" + this.stepVar + \" > 0\" : \"\" + this.fromVar + \" <= \" + this.toVar, \"\" + cond + \" ? \" + lt + \" \" + this.toVar + \" : \" + gt + \" \" + this.toVar);\n      stepPart = this.stepVar ? \"\" + idx + \" += \" + this.stepVar : known ? namedIndex ? from <= to ? \"++\" + idx : \"--\" + idx : from <= to ? \"\" + idx + \"++\" : \"\" + idx + \"--\" : namedIndex ? \"\" + cond + \" ? ++\" + idx + \" : --\" + idx : \"\" + cond + \" ? \" + idx + \"++ : \" + idx + \"--\";\n      if (namedIndex) {\n        varPart = \"\" + idxName + \" = \" + varPart;\n      }\n      if (namedIndex) {\n        stepPart = \"\" + idxName + \" = \" + stepPart;\n      }\n      return [this.makeCode(\"\" + varPart + \"; \" + condPart + \"; \" + stepPart)];\n    };\n\n    Range.prototype.compileArray = function(o) {\n      var args, body, cond, hasArgs, i, idt, post, pre, range, result, vars, _i, _ref2, _ref3, _results;\n      if (this.fromNum && this.toNum && Math.abs(this.fromNum - this.toNum) <= 20) {\n        range = (function() {\n          _results = [];\n          for (var _i = _ref2 = +this.fromNum, _ref3 = +this.toNum; _ref2 <= _ref3 ? _i <= _ref3 : _i >= _ref3; _ref2 <= _ref3 ? _i++ : _i--){ _results.push(_i); }\n          return _results;\n        }).apply(this);\n        if (this.exclusive) {\n          range.pop();\n        }\n        return [this.makeCode(\"[\" + (range.join(', ')) + \"]\")];\n      }\n      idt = this.tab + TAB;\n      i = o.scope.freeVariable('i');\n      result = o.scope.freeVariable('results');\n      pre = \"\\n\" + idt + result + \" = [];\";\n      if (this.fromNum && this.toNum) {\n        o.index = i;\n        body = fragmentsToText(this.compileNode(o));\n      } else {\n        vars = (\"\" + i + \" = \" + this.fromC) + (this.toC !== this.toVar ? \", \" + this.toC : '');\n        cond = \"\" + this.fromVar + \" <= \" + this.toVar;\n        body = \"var \" + vars + \"; \" + cond + \" ? \" + i + \" <\" + this.equals + \" \" + this.toVar + \" : \" + i + \" >\" + this.equals + \" \" + this.toVar + \"; \" + cond + \" ? \" + i + \"++ : \" + i + \"--\";\n      }\n      post = \"{ \" + result + \".push(\" + i + \"); }\\n\" + idt + \"return \" + result + \";\\n\" + o.indent;\n      hasArgs = function(node) {\n        return node != null ? node.contains(isLiteralArguments) : void 0;\n      };\n      if (hasArgs(this.from) || hasArgs(this.to)) {\n        args = ', arguments';\n      }\n      return [this.makeCode(\"(function() {\" + pre + \"\\n\" + idt + \"for (\" + body + \")\" + post + \"}).apply(this\" + (args != null ? args : '') + \")\")];\n    };\n\n    return Range;\n\n  })(Base);\n\n  exports.Slice = Slice = (function(_super) {\n    __extends(Slice, _super);\n\n    Slice.prototype.children = ['range'];\n\n    function Slice(range) {\n      this.range = range;\n      Slice.__super__.constructor.call(this);\n    }\n\n    Slice.prototype.compileNode = function(o) {\n      var compiled, compiledText, from, fromCompiled, to, toStr, _ref2;\n      _ref2 = this.range, to = _ref2.to, from = _ref2.from;\n      fromCompiled = from && from.compileToFragments(o, LEVEL_PAREN) || [this.makeCode('0')];\n      if (to) {\n        compiled = to.compileToFragments(o, LEVEL_PAREN);\n        compiledText = fragmentsToText(compiled);\n        if (!(!this.range.exclusive && +compiledText === -1)) {\n          toStr = ', ' + (this.range.exclusive ? compiledText : SIMPLENUM.test(compiledText) ? \"\" + (+compiledText + 1) : (compiled = to.compileToFragments(o, LEVEL_ACCESS), \"+\" + (fragmentsToText(compiled)) + \" + 1 || 9e9\"));\n        }\n      }\n      return [this.makeCode(\".slice(\" + (fragmentsToText(fromCompiled)) + (toStr || '') + \")\")];\n    };\n\n    return Slice;\n\n  })(Base);\n\n  exports.Obj = Obj = (function(_super) {\n    __extends(Obj, _super);\n\n    function Obj(props, generated) {\n      this.generated = generated != null ? generated : false;\n      this.objects = this.properties = props || [];\n    }\n\n    Obj.prototype.children = ['properties'];\n\n    Obj.prototype.compileNode = function(o) {\n      var answer, i, idt, indent, join, lastNoncom, node, prop, props, _i, _j, _len, _len1;\n      props = this.properties;\n      if (!props.length) {\n        return [this.makeCode(this.front ? '({})' : '{}')];\n      }\n      if (this.generated) {\n        for (_i = 0, _len = props.length; _i < _len; _i++) {\n          node = props[_i];\n          if (node instanceof Value) {\n            node.error('cannot have an implicit value in an implicit object');\n          }\n        }\n      }\n      idt = o.indent += TAB;\n      lastNoncom = this.lastNonComment(this.properties);\n      answer = [];\n      for (i = _j = 0, _len1 = props.length; _j < _len1; i = ++_j) {\n        prop = props[i];\n        join = i === props.length - 1 ? '' : prop === lastNoncom || prop instanceof Comment ? '\\n' : ',\\n';\n        indent = prop instanceof Comment ? '' : idt;\n        if (prop instanceof Assign && prop.variable instanceof Value && prop.variable.hasProperties()) {\n          prop.variable.error('Invalid object key');\n        }\n        if (prop instanceof Value && prop[\"this\"]) {\n          prop = new Assign(prop.properties[0].name, prop, 'object');\n        }\n        if (!(prop instanceof Comment)) {\n          if (!(prop instanceof Assign)) {\n            prop = new Assign(prop, prop, 'object');\n          }\n          (prop.variable.base || prop.variable).asKey = true;\n        }\n        if (indent) {\n          answer.push(this.makeCode(indent));\n        }\n        answer.push.apply(answer, prop.compileToFragments(o, LEVEL_TOP));\n        if (join) {\n          answer.push(this.makeCode(join));\n        }\n      }\n      answer.unshift(this.makeCode(\"{\" + (props.length && '\\n')));\n      answer.push(this.makeCode(\"\" + (props.length && '\\n' + this.tab) + \"}\"));\n      if (this.front) {\n        return this.wrapInBraces(answer);\n      } else {\n        return answer;\n      }\n    };\n\n    Obj.prototype.assigns = function(name) {\n      var prop, _i, _len, _ref2;\n      _ref2 = this.properties;\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        prop = _ref2[_i];\n        if (prop.assigns(name)) {\n          return true;\n        }\n      }\n      return false;\n    };\n\n    return Obj;\n\n  })(Base);\n\n  exports.Arr = Arr = (function(_super) {\n    __extends(Arr, _super);\n\n    function Arr(objs) {\n      this.objects = objs || [];\n    }\n\n    Arr.prototype.children = ['objects'];\n\n    Arr.prototype.compileNode = function(o) {\n      var answer, compiledObjs, fragments, index, obj, _i, _len;\n      if (!this.objects.length) {\n        return [this.makeCode('[]')];\n      }\n      o.indent += TAB;\n      answer = Splat.compileSplattedArray(o, this.objects);\n      if (answer.length) {\n        return answer;\n      }\n      answer = [];\n      compiledObjs = (function() {\n        var _i, _len, _ref2, _results;\n        _ref2 = this.objects;\n        _results = [];\n        for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n          obj = _ref2[_i];\n          _results.push(obj.compileToFragments(o, LEVEL_LIST));\n        }\n        return _results;\n      }).call(this);\n      for (index = _i = 0, _len = compiledObjs.length; _i < _len; index = ++_i) {\n        fragments = compiledObjs[index];\n        if (index) {\n          answer.push(this.makeCode(\", \"));\n        }\n        answer.push.apply(answer, fragments);\n      }\n      if (fragmentsToText(answer).indexOf('\\n') >= 0) {\n        answer.unshift(this.makeCode(\"[\\n\" + o.indent));\n        answer.push(this.makeCode(\"\\n\" + this.tab + \"]\"));\n      } else {\n        answer.unshift(this.makeCode(\"[\"));\n        answer.push(this.makeCode(\"]\"));\n      }\n      return answer;\n    };\n\n    Arr.prototype.assigns = function(name) {\n      var obj, _i, _len, _ref2;\n      _ref2 = this.objects;\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        obj = _ref2[_i];\n        if (obj.assigns(name)) {\n          return true;\n        }\n      }\n      return false;\n    };\n\n    return Arr;\n\n  })(Base);\n\n  exports.Class = Class = (function(_super) {\n    __extends(Class, _super);\n\n    function Class(variable, parent, body) {\n      this.variable = variable;\n      this.parent = parent;\n      this.body = body != null ? body : new Block;\n      this.boundFuncs = [];\n      this.body.classBody = true;\n    }\n\n    Class.prototype.children = ['variable', 'parent', 'body'];\n\n    Class.prototype.determineName = function() {\n      var decl, tail;\n      if (!this.variable) {\n        return null;\n      }\n      decl = (tail = last(this.variable.properties)) ? tail instanceof Access && tail.name.value : this.variable.base.value;\n      if (__indexOf.call(STRICT_PROSCRIBED, decl) >= 0) {\n        this.variable.error(\"class variable name may not be \" + decl);\n      }\n      return decl && (decl = IDENTIFIER.test(decl) && decl);\n    };\n\n    Class.prototype.setContext = function(name) {\n      return this.body.traverseChildren(false, function(node) {\n        if (node.classBody) {\n          return false;\n        }\n        if (node instanceof Literal && node.value === 'this') {\n          return node.value = name;\n        } else if (node instanceof Code) {\n          node.klass = name;\n          if (node.bound) {\n            return node.context = name;\n          }\n        }\n      });\n    };\n\n    Class.prototype.addBoundFunctions = function(o) {\n      var bvar, lhs, _i, _len, _ref2;\n      _ref2 = this.boundFuncs;\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        bvar = _ref2[_i];\n        lhs = (new Value(new Literal(\"this\"), [new Access(bvar)])).compile(o);\n        this.ctor.body.unshift(new Literal(\"\" + lhs + \" = \" + (utility('bind')) + \"(\" + lhs + \", this)\"));\n      }\n    };\n\n    Class.prototype.addProperties = function(node, name, o) {\n      var assign, base, exprs, func, props;\n      props = node.base.properties.slice(0);\n      exprs = (function() {\n        var _results;\n        _results = [];\n        while (assign = props.shift()) {\n          if (assign instanceof Assign) {\n            base = assign.variable.base;\n            delete assign.context;\n            func = assign.value;\n            if (base.value === 'constructor') {\n              if (this.ctor) {\n                assign.error('cannot define more than one constructor in a class');\n              }\n              if (func.bound) {\n                assign.error('cannot define a constructor as a bound function');\n              }\n              if (func instanceof Code) {\n                assign = this.ctor = func;\n              } else {\n                this.externalCtor = o.classScope.freeVariable('class');\n                assign = new Assign(new Literal(this.externalCtor), func);\n              }\n            } else {\n              if (assign.variable[\"this\"]) {\n                func[\"static\"] = true;\n              } else {\n                assign.variable = new Value(new Literal(name), [new Access(new Literal('prototype')), new Access(base)]);\n                if (func instanceof Code && func.bound) {\n                  this.boundFuncs.push(base);\n                  func.bound = false;\n                }\n              }\n            }\n          }\n          _results.push(assign);\n        }\n        return _results;\n      }).call(this);\n      return compact(exprs);\n    };\n\n    Class.prototype.walkBody = function(name, o) {\n      return this.traverseChildren(false, (function(_this) {\n        return function(child) {\n          var cont, exps, i, node, _i, _len, _ref2;\n          cont = true;\n          if (child instanceof Class) {\n            return false;\n          }\n          if (child instanceof Block) {\n            _ref2 = exps = child.expressions;\n            for (i = _i = 0, _len = _ref2.length; _i < _len; i = ++_i) {\n              node = _ref2[i];\n              if (node instanceof Assign && node.variable.looksStatic(name)) {\n                node.value[\"static\"] = true;\n              } else if (node instanceof Value && node.isObject(true)) {\n                cont = false;\n                exps[i] = _this.addProperties(node, name, o);\n              }\n            }\n            child.expressions = exps = flatten(exps);\n          }\n          return cont && !(child instanceof Class);\n        };\n      })(this));\n    };\n\n    Class.prototype.hoistDirectivePrologue = function() {\n      var expressions, index, node;\n      index = 0;\n      expressions = this.body.expressions;\n      while ((node = expressions[index]) && node instanceof Comment || node instanceof Value && node.isString()) {\n        ++index;\n      }\n      return this.directives = expressions.splice(0, index);\n    };\n\n    Class.prototype.ensureConstructor = function(name) {\n      if (!this.ctor) {\n        this.ctor = new Code;\n        if (this.externalCtor) {\n          this.ctor.body.push(new Literal(\"\" + this.externalCtor + \".apply(this, arguments)\"));\n        } else if (this.parent) {\n          this.ctor.body.push(new Literal(\"\" + name + \".__super__.constructor.apply(this, arguments)\"));\n        }\n        this.ctor.body.makeReturn();\n        this.body.expressions.unshift(this.ctor);\n      }\n      this.ctor.ctor = this.ctor.name = name;\n      this.ctor.klass = null;\n      return this.ctor.noReturn = true;\n    };\n\n    Class.prototype.compileNode = function(o) {\n      var args, argumentsNode, func, jumpNode, klass, lname, name, superClass, _ref2;\n      if (jumpNode = this.body.jumps()) {\n        jumpNode.error('Class bodies cannot contain pure statements');\n      }\n      if (argumentsNode = this.body.contains(isLiteralArguments)) {\n        argumentsNode.error(\"Class bodies shouldn't reference arguments\");\n      }\n      name = this.determineName() || '_Class';\n      if (name.reserved) {\n        name = \"_\" + name;\n      }\n      lname = new Literal(name);\n      func = new Code([], Block.wrap([this.body]));\n      args = [];\n      o.classScope = func.makeScope(o.scope);\n      this.hoistDirectivePrologue();\n      this.setContext(name);\n      this.walkBody(name, o);\n      this.ensureConstructor(name);\n      this.addBoundFunctions(o);\n      this.body.spaced = true;\n      this.body.expressions.push(lname);\n      if (this.parent) {\n        superClass = new Literal(o.classScope.freeVariable('super', false));\n        this.body.expressions.unshift(new Extends(lname, superClass));\n        func.params.push(new Param(superClass));\n        args.push(this.parent);\n      }\n      (_ref2 = this.body.expressions).unshift.apply(_ref2, this.directives);\n      klass = new Parens(new Call(func, args));\n      if (this.variable) {\n        klass = new Assign(this.variable, klass);\n      }\n      return klass.compileToFragments(o);\n    };\n\n    return Class;\n\n  })(Base);\n\n  exports.Assign = Assign = (function(_super) {\n    __extends(Assign, _super);\n\n    function Assign(variable, value, context, options) {\n      var forbidden, name, _ref2;\n      this.variable = variable;\n      this.value = value;\n      this.context = context;\n      this.param = options && options.param;\n      this.subpattern = options && options.subpattern;\n      forbidden = (_ref2 = (name = this.variable.unwrapAll().value), __indexOf.call(STRICT_PROSCRIBED, _ref2) >= 0);\n      if (forbidden && this.context !== 'object') {\n        this.variable.error(\"variable name may not be \\\"\" + name + \"\\\"\");\n      }\n    }\n\n    Assign.prototype.children = ['variable', 'value'];\n\n    Assign.prototype.isStatement = function(o) {\n      return (o != null ? o.level : void 0) === LEVEL_TOP && (this.context != null) && __indexOf.call(this.context, \"?\") >= 0;\n    };\n\n    Assign.prototype.assigns = function(name) {\n      return this[this.context === 'object' ? 'value' : 'variable'].assigns(name);\n    };\n\n    Assign.prototype.unfoldSoak = function(o) {\n      return unfoldSoak(o, this, 'variable');\n    };\n\n    Assign.prototype.compileNode = function(o) {\n      var answer, compiledName, isValue, match, name, val, varBase, _ref2, _ref3, _ref4;\n      if (isValue = this.variable instanceof Value) {\n        if (this.variable.isArray() || this.variable.isObject()) {\n          return this.compilePatternMatch(o);\n        }\n        if (this.variable.isSplice()) {\n          return this.compileSplice(o);\n        }\n        if ((_ref2 = this.context) === '||=' || _ref2 === '&&=' || _ref2 === '?=') {\n          return this.compileConditional(o);\n        }\n      }\n      compiledName = this.variable.compileToFragments(o, LEVEL_LIST);\n      name = fragmentsToText(compiledName);\n      if (!this.context) {\n        varBase = this.variable.unwrapAll();\n        if (!varBase.isAssignable()) {\n          this.variable.error(\"\\\"\" + (this.variable.compile(o)) + \"\\\" cannot be assigned\");\n        }\n        if (!(typeof varBase.hasProperties === \"function\" ? varBase.hasProperties() : void 0)) {\n          if (this.param) {\n            o.scope.add(name, 'var');\n          } else {\n            o.scope.find(name);\n          }\n        }\n      }\n      if (this.value instanceof Code && (match = METHOD_DEF.exec(name))) {\n        if (match[2]) {\n          this.value.klass = match[1];\n        }\n        this.value.name = (_ref3 = (_ref4 = match[3]) != null ? _ref4 : match[4]) != null ? _ref3 : match[5];\n      }\n      val = this.value.compileToFragments(o, LEVEL_LIST);\n      if (this.context === 'object') {\n        return compiledName.concat(this.makeCode(\": \"), val);\n      }\n      answer = compiledName.concat(this.makeCode(\" \" + (this.context || '=') + \" \"), val);\n      if (o.level <= LEVEL_LIST) {\n        return answer;\n      } else {\n        return this.wrapInBraces(answer);\n      }\n    };\n\n    Assign.prototype.compilePatternMatch = function(o) {\n      var acc, assigns, code, fragments, i, idx, isObject, ivar, name, obj, objects, olen, ref, rest, splat, top, val, value, vvar, vvarText, _i, _len, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7;\n      top = o.level === LEVEL_TOP;\n      value = this.value;\n      objects = this.variable.base.objects;\n      if (!(olen = objects.length)) {\n        code = value.compileToFragments(o);\n        if (o.level >= LEVEL_OP) {\n          return this.wrapInBraces(code);\n        } else {\n          return code;\n        }\n      }\n      isObject = this.variable.isObject();\n      if (top && olen === 1 && !((obj = objects[0]) instanceof Splat)) {\n        if (obj instanceof Assign) {\n          _ref2 = obj, (_ref3 = _ref2.variable, idx = _ref3.base), obj = _ref2.value;\n        } else {\n          idx = isObject ? obj[\"this\"] ? obj.properties[0].name : obj : new Literal(0);\n        }\n        acc = IDENTIFIER.test(idx.unwrap().value || 0);\n        value = new Value(value);\n        value.properties.push(new (acc ? Access : Index)(idx));\n        if (_ref4 = obj.unwrap().value, __indexOf.call(RESERVED, _ref4) >= 0) {\n          obj.error(\"assignment to a reserved word: \" + (obj.compile(o)));\n        }\n        return new Assign(obj, value, null, {\n          param: this.param\n        }).compileToFragments(o, LEVEL_TOP);\n      }\n      vvar = value.compileToFragments(o, LEVEL_LIST);\n      vvarText = fragmentsToText(vvar);\n      assigns = [];\n      splat = false;\n      if (!IDENTIFIER.test(vvarText) || this.variable.assigns(vvarText)) {\n        assigns.push([this.makeCode(\"\" + (ref = o.scope.freeVariable('ref')) + \" = \")].concat(__slice.call(vvar)));\n        vvar = [this.makeCode(ref)];\n        vvarText = ref;\n      }\n      for (i = _i = 0, _len = objects.length; _i < _len; i = ++_i) {\n        obj = objects[i];\n        idx = i;\n        if (isObject) {\n          if (obj instanceof Assign) {\n            _ref5 = obj, (_ref6 = _ref5.variable, idx = _ref6.base), obj = _ref5.value;\n          } else {\n            if (obj.base instanceof Parens) {\n              _ref7 = new Value(obj.unwrapAll()).cacheReference(o), obj = _ref7[0], idx = _ref7[1];\n            } else {\n              idx = obj[\"this\"] ? obj.properties[0].name : obj;\n            }\n          }\n        }\n        if (!splat && obj instanceof Splat) {\n          name = obj.name.unwrap().value;\n          obj = obj.unwrap();\n          val = \"\" + olen + \" <= \" + vvarText + \".length ? \" + (utility('slice')) + \".call(\" + vvarText + \", \" + i;\n          if (rest = olen - i - 1) {\n            ivar = o.scope.freeVariable('i');\n            val += \", \" + ivar + \" = \" + vvarText + \".length - \" + rest + \") : (\" + ivar + \" = \" + i + \", [])\";\n          } else {\n            val += \") : []\";\n          }\n          val = new Literal(val);\n          splat = \"\" + ivar + \"++\";\n        } else {\n          name = obj.unwrap().value;\n          if (obj instanceof Splat) {\n            obj.error(\"multiple splats are disallowed in an assignment\");\n          }\n          if (typeof idx === 'number') {\n            idx = new Literal(splat || idx);\n            acc = false;\n          } else {\n            acc = isObject && IDENTIFIER.test(idx.unwrap().value || 0);\n          }\n          val = new Value(new Literal(vvarText), [new (acc ? Access : Index)(idx)]);\n        }\n        if ((name != null) && __indexOf.call(RESERVED, name) >= 0) {\n          obj.error(\"assignment to a reserved word: \" + (obj.compile(o)));\n        }\n        assigns.push(new Assign(obj, val, null, {\n          param: this.param,\n          subpattern: true\n        }).compileToFragments(o, LEVEL_LIST));\n      }\n      if (!(top || this.subpattern)) {\n        assigns.push(vvar);\n      }\n      fragments = this.joinFragmentArrays(assigns, ', ');\n      if (o.level < LEVEL_LIST) {\n        return fragments;\n      } else {\n        return this.wrapInBraces(fragments);\n      }\n    };\n\n    Assign.prototype.compileConditional = function(o) {\n      var fragments, left, right, _ref2;\n      _ref2 = this.variable.cacheReference(o), left = _ref2[0], right = _ref2[1];\n      if (!left.properties.length && left.base instanceof Literal && left.base.value !== \"this\" && !o.scope.check(left.base.value)) {\n        this.variable.error(\"the variable \\\"\" + left.base.value + \"\\\" can't be assigned with \" + this.context + \" because it has not been declared before\");\n      }\n      if (__indexOf.call(this.context, \"?\") >= 0) {\n        o.isExistentialEquals = true;\n        return new If(new Existence(left), right, {\n          type: 'if'\n        }).addElse(new Assign(right, this.value, '=')).compileToFragments(o);\n      } else {\n        fragments = new Op(this.context.slice(0, -1), left, new Assign(right, this.value, '=')).compileToFragments(o);\n        if (o.level <= LEVEL_LIST) {\n          return fragments;\n        } else {\n          return this.wrapInBraces(fragments);\n        }\n      }\n    };\n\n    Assign.prototype.compileSplice = function(o) {\n      var answer, exclusive, from, fromDecl, fromRef, name, to, valDef, valRef, _ref2, _ref3, _ref4;\n      _ref2 = this.variable.properties.pop().range, from = _ref2.from, to = _ref2.to, exclusive = _ref2.exclusive;\n      name = this.variable.compile(o);\n      if (from) {\n        _ref3 = this.cacheToCodeFragments(from.cache(o, LEVEL_OP)), fromDecl = _ref3[0], fromRef = _ref3[1];\n      } else {\n        fromDecl = fromRef = '0';\n      }\n      if (to) {\n        if (from instanceof Value && from.isSimpleNumber() && to instanceof Value && to.isSimpleNumber()) {\n          to = to.compile(o) - fromRef;\n          if (!exclusive) {\n            to += 1;\n          }\n        } else {\n          to = to.compile(o, LEVEL_ACCESS) + ' - ' + fromRef;\n          if (!exclusive) {\n            to += ' + 1';\n          }\n        }\n      } else {\n        to = \"9e9\";\n      }\n      _ref4 = this.value.cache(o, LEVEL_LIST), valDef = _ref4[0], valRef = _ref4[1];\n      answer = [].concat(this.makeCode(\"[].splice.apply(\" + name + \", [\" + fromDecl + \", \" + to + \"].concat(\"), valDef, this.makeCode(\")), \"), valRef);\n      if (o.level > LEVEL_TOP) {\n        return this.wrapInBraces(answer);\n      } else {\n        return answer;\n      }\n    };\n\n    return Assign;\n\n  })(Base);\n\n  exports.Code = Code = (function(_super) {\n    __extends(Code, _super);\n\n    function Code(params, body, tag) {\n      this.params = params || [];\n      this.body = body || new Block;\n      this.bound = tag === 'boundfunc';\n    }\n\n    Code.prototype.children = ['params', 'body'];\n\n    Code.prototype.isStatement = function() {\n      return !!this.ctor;\n    };\n\n    Code.prototype.jumps = NO;\n\n    Code.prototype.makeScope = function(parentScope) {\n      return new Scope(parentScope, this.body, this);\n    };\n\n    Code.prototype.compileNode = function(o) {\n      var answer, boundfunc, code, exprs, i, lit, p, param, params, ref, splats, uniqs, val, wasEmpty, wrapper, _i, _j, _k, _l, _len, _len1, _len2, _len3, _len4, _len5, _m, _n, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7;\n      if (this.bound && ((_ref2 = o.scope.method) != null ? _ref2.bound : void 0)) {\n        this.context = o.scope.method.context;\n      }\n      if (this.bound && !this.context) {\n        this.context = '_this';\n        wrapper = new Code([new Param(new Literal(this.context))], new Block([this]));\n        boundfunc = new Call(wrapper, [new Literal('this')]);\n        boundfunc.updateLocationDataIfMissing(this.locationData);\n        return boundfunc.compileNode(o);\n      }\n      o.scope = del(o, 'classScope') || this.makeScope(o.scope);\n      o.scope.shared = del(o, 'sharedScope');\n      o.indent += TAB;\n      delete o.bare;\n      delete o.isExistentialEquals;\n      params = [];\n      exprs = [];\n      _ref3 = this.params;\n      for (_i = 0, _len = _ref3.length; _i < _len; _i++) {\n        param = _ref3[_i];\n        o.scope.parameter(param.asReference(o));\n      }\n      _ref4 = this.params;\n      for (_j = 0, _len1 = _ref4.length; _j < _len1; _j++) {\n        param = _ref4[_j];\n        if (!param.splat) {\n          continue;\n        }\n        _ref5 = this.params;\n        for (_k = 0, _len2 = _ref5.length; _k < _len2; _k++) {\n          p = _ref5[_k].name;\n          if (p[\"this\"]) {\n            p = p.properties[0].name;\n          }\n          if (p.value) {\n            o.scope.add(p.value, 'var', true);\n          }\n        }\n        splats = new Assign(new Value(new Arr((function() {\n          var _l, _len3, _ref6, _results;\n          _ref6 = this.params;\n          _results = [];\n          for (_l = 0, _len3 = _ref6.length; _l < _len3; _l++) {\n            p = _ref6[_l];\n            _results.push(p.asReference(o));\n          }\n          return _results;\n        }).call(this))), new Value(new Literal('arguments')));\n        break;\n      }\n      _ref6 = this.params;\n      for (_l = 0, _len3 = _ref6.length; _l < _len3; _l++) {\n        param = _ref6[_l];\n        if (param.isComplex()) {\n          val = ref = param.asReference(o);\n          if (param.value) {\n            val = new Op('?', ref, param.value);\n          }\n          exprs.push(new Assign(new Value(param.name), val, '=', {\n            param: true\n          }));\n        } else {\n          ref = param;\n          if (param.value) {\n            lit = new Literal(ref.name.value + ' == null');\n            val = new Assign(new Value(param.name), param.value, '=');\n            exprs.push(new If(lit, val));\n          }\n        }\n        if (!splats) {\n          params.push(ref);\n        }\n      }\n      wasEmpty = this.body.isEmpty();\n      if (splats) {\n        exprs.unshift(splats);\n      }\n      if (exprs.length) {\n        (_ref7 = this.body.expressions).unshift.apply(_ref7, exprs);\n      }\n      for (i = _m = 0, _len4 = params.length; _m < _len4; i = ++_m) {\n        p = params[i];\n        params[i] = p.compileToFragments(o);\n        o.scope.parameter(fragmentsToText(params[i]));\n      }\n      uniqs = [];\n      this.eachParamName(function(name, node) {\n        if (__indexOf.call(uniqs, name) >= 0) {\n          node.error(\"multiple parameters named '\" + name + \"'\");\n        }\n        return uniqs.push(name);\n      });\n      if (!(wasEmpty || this.noReturn)) {\n        this.body.makeReturn();\n      }\n      code = 'function';\n      if (this.ctor) {\n        code += ' ' + this.name;\n      }\n      code += '(';\n      answer = [this.makeCode(code)];\n      for (i = _n = 0, _len5 = params.length; _n < _len5; i = ++_n) {\n        p = params[i];\n        if (i) {\n          answer.push(this.makeCode(\", \"));\n        }\n        answer.push.apply(answer, p);\n      }\n      answer.push(this.makeCode(') {'));\n      if (!this.body.isEmpty()) {\n        answer = answer.concat(this.makeCode(\"\\n\"), this.body.compileWithDeclarations(o), this.makeCode(\"\\n\" + this.tab));\n      }\n      answer.push(this.makeCode('}'));\n      if (this.ctor) {\n        return [this.makeCode(this.tab)].concat(__slice.call(answer));\n      }\n      if (this.front || (o.level >= LEVEL_ACCESS)) {\n        return this.wrapInBraces(answer);\n      } else {\n        return answer;\n      }\n    };\n\n    Code.prototype.eachParamName = function(iterator) {\n      var param, _i, _len, _ref2, _results;\n      _ref2 = this.params;\n      _results = [];\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        param = _ref2[_i];\n        _results.push(param.eachName(iterator));\n      }\n      return _results;\n    };\n\n    Code.prototype.traverseChildren = function(crossScope, func) {\n      if (crossScope) {\n        return Code.__super__.traverseChildren.call(this, crossScope, func);\n      }\n    };\n\n    return Code;\n\n  })(Base);\n\n  exports.Param = Param = (function(_super) {\n    __extends(Param, _super);\n\n    function Param(name, value, splat) {\n      var _ref2;\n      this.name = name;\n      this.value = value;\n      this.splat = splat;\n      if (_ref2 = (name = this.name.unwrapAll().value), __indexOf.call(STRICT_PROSCRIBED, _ref2) >= 0) {\n        this.name.error(\"parameter name \\\"\" + name + \"\\\" is not allowed\");\n      }\n    }\n\n    Param.prototype.children = ['name', 'value'];\n\n    Param.prototype.compileToFragments = function(o) {\n      return this.name.compileToFragments(o, LEVEL_LIST);\n    };\n\n    Param.prototype.asReference = function(o) {\n      var node;\n      if (this.reference) {\n        return this.reference;\n      }\n      node = this.name;\n      if (node[\"this\"]) {\n        node = node.properties[0].name;\n        if (node.value.reserved) {\n          node = new Literal(o.scope.freeVariable(node.value));\n        }\n      } else if (node.isComplex()) {\n        node = new Literal(o.scope.freeVariable('arg'));\n      }\n      node = new Value(node);\n      if (this.splat) {\n        node = new Splat(node);\n      }\n      node.updateLocationDataIfMissing(this.locationData);\n      return this.reference = node;\n    };\n\n    Param.prototype.isComplex = function() {\n      return this.name.isComplex();\n    };\n\n    Param.prototype.eachName = function(iterator, name) {\n      var atParam, node, obj, _i, _len, _ref2;\n      if (name == null) {\n        name = this.name;\n      }\n      atParam = function(obj) {\n        var node;\n        node = obj.properties[0].name;\n        if (!node.value.reserved) {\n          return iterator(node.value, node);\n        }\n      };\n      if (name instanceof Literal) {\n        return iterator(name.value, name);\n      }\n      if (name instanceof Value) {\n        return atParam(name);\n      }\n      _ref2 = name.objects;\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        obj = _ref2[_i];\n        if (obj instanceof Assign) {\n          this.eachName(iterator, obj.value.unwrap());\n        } else if (obj instanceof Splat) {\n          node = obj.name.unwrap();\n          iterator(node.value, node);\n        } else if (obj instanceof Value) {\n          if (obj.isArray() || obj.isObject()) {\n            this.eachName(iterator, obj.base);\n          } else if (obj[\"this\"]) {\n            atParam(obj);\n          } else {\n            iterator(obj.base.value, obj.base);\n          }\n        } else {\n          obj.error(\"illegal parameter \" + (obj.compile()));\n        }\n      }\n    };\n\n    return Param;\n\n  })(Base);\n\n  exports.Splat = Splat = (function(_super) {\n    __extends(Splat, _super);\n\n    Splat.prototype.children = ['name'];\n\n    Splat.prototype.isAssignable = YES;\n\n    function Splat(name) {\n      this.name = name.compile ? name : new Literal(name);\n    }\n\n    Splat.prototype.assigns = function(name) {\n      return this.name.assigns(name);\n    };\n\n    Splat.prototype.compileToFragments = function(o) {\n      return this.name.compileToFragments(o);\n    };\n\n    Splat.prototype.unwrap = function() {\n      return this.name;\n    };\n\n    Splat.compileSplattedArray = function(o, list, apply) {\n      var args, base, compiledNode, concatPart, fragments, i, index, node, _i, _len;\n      index = -1;\n      while ((node = list[++index]) && !(node instanceof Splat)) {\n        continue;\n      }\n      if (index >= list.length) {\n        return [];\n      }\n      if (list.length === 1) {\n        node = list[0];\n        fragments = node.compileToFragments(o, LEVEL_LIST);\n        if (apply) {\n          return fragments;\n        }\n        return [].concat(node.makeCode(\"\" + (utility('slice')) + \".call(\"), fragments, node.makeCode(\")\"));\n      }\n      args = list.slice(index);\n      for (i = _i = 0, _len = args.length; _i < _len; i = ++_i) {\n        node = args[i];\n        compiledNode = node.compileToFragments(o, LEVEL_LIST);\n        args[i] = node instanceof Splat ? [].concat(node.makeCode(\"\" + (utility('slice')) + \".call(\"), compiledNode, node.makeCode(\")\")) : [].concat(node.makeCode(\"[\"), compiledNode, node.makeCode(\"]\"));\n      }\n      if (index === 0) {\n        node = list[0];\n        concatPart = node.joinFragmentArrays(args.slice(1), ', ');\n        return args[0].concat(node.makeCode(\".concat(\"), concatPart, node.makeCode(\")\"));\n      }\n      base = (function() {\n        var _j, _len1, _ref2, _results;\n        _ref2 = list.slice(0, index);\n        _results = [];\n        for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {\n          node = _ref2[_j];\n          _results.push(node.compileToFragments(o, LEVEL_LIST));\n        }\n        return _results;\n      })();\n      base = list[0].joinFragmentArrays(base, ', ');\n      concatPart = list[index].joinFragmentArrays(args, ', ');\n      return [].concat(list[0].makeCode(\"[\"), base, list[index].makeCode(\"].concat(\"), concatPart, (last(list)).makeCode(\")\"));\n    };\n\n    return Splat;\n\n  })(Base);\n\n  exports.While = While = (function(_super) {\n    __extends(While, _super);\n\n    function While(condition, options) {\n      this.condition = (options != null ? options.invert : void 0) ? condition.invert() : condition;\n      this.guard = options != null ? options.guard : void 0;\n    }\n\n    While.prototype.children = ['condition', 'guard', 'body'];\n\n    While.prototype.isStatement = YES;\n\n    While.prototype.makeReturn = function(res) {\n      if (res) {\n        return While.__super__.makeReturn.apply(this, arguments);\n      } else {\n        this.returns = !this.jumps({\n          loop: true\n        });\n        return this;\n      }\n    };\n\n    While.prototype.addBody = function(body) {\n      this.body = body;\n      return this;\n    };\n\n    While.prototype.jumps = function() {\n      var expressions, jumpNode, node, _i, _len;\n      expressions = this.body.expressions;\n      if (!expressions.length) {\n        return false;\n      }\n      for (_i = 0, _len = expressions.length; _i < _len; _i++) {\n        node = expressions[_i];\n        if (jumpNode = node.jumps({\n          loop: true\n        })) {\n          return jumpNode;\n        }\n      }\n      return false;\n    };\n\n    While.prototype.compileNode = function(o) {\n      var answer, body, rvar, set;\n      o.indent += TAB;\n      set = '';\n      body = this.body;\n      if (body.isEmpty()) {\n        body = this.makeCode('');\n      } else {\n        if (this.returns) {\n          body.makeReturn(rvar = o.scope.freeVariable('results'));\n          set = \"\" + this.tab + rvar + \" = [];\\n\";\n        }\n        if (this.guard) {\n          if (body.expressions.length > 1) {\n            body.expressions.unshift(new If((new Parens(this.guard)).invert(), new Literal(\"continue\")));\n          } else {\n            if (this.guard) {\n              body = Block.wrap([new If(this.guard, body)]);\n            }\n          }\n        }\n        body = [].concat(this.makeCode(\"\\n\"), body.compileToFragments(o, LEVEL_TOP), this.makeCode(\"\\n\" + this.tab));\n      }\n      answer = [].concat(this.makeCode(set + this.tab + \"while (\"), this.condition.compileToFragments(o, LEVEL_PAREN), this.makeCode(\") {\"), body, this.makeCode(\"}\"));\n      if (this.returns) {\n        answer.push(this.makeCode(\"\\n\" + this.tab + \"return \" + rvar + \";\"));\n      }\n      return answer;\n    };\n\n    return While;\n\n  })(Base);\n\n  exports.Op = Op = (function(_super) {\n    var CONVERSIONS, INVERSIONS;\n\n    __extends(Op, _super);\n\n    function Op(op, first, second, flip) {\n      if (op === 'in') {\n        return new In(first, second);\n      }\n      if (op === 'do') {\n        return this.generateDo(first);\n      }\n      if (op === 'new') {\n        if (first instanceof Call && !first[\"do\"] && !first.isNew) {\n          return first.newInstance();\n        }\n        if (first instanceof Code && first.bound || first[\"do\"]) {\n          first = new Parens(first);\n        }\n      }\n      this.operator = CONVERSIONS[op] || op;\n      this.first = first;\n      this.second = second;\n      this.flip = !!flip;\n      return this;\n    }\n\n    CONVERSIONS = {\n      '==': '===',\n      '!=': '!==',\n      'of': 'in'\n    };\n\n    INVERSIONS = {\n      '!==': '===',\n      '===': '!=='\n    };\n\n    Op.prototype.children = ['first', 'second'];\n\n    Op.prototype.isSimpleNumber = NO;\n\n    Op.prototype.isUnary = function() {\n      return !this.second;\n    };\n\n    Op.prototype.isComplex = function() {\n      var _ref2;\n      return !(this.isUnary() && ((_ref2 = this.operator) === '+' || _ref2 === '-')) || this.first.isComplex();\n    };\n\n    Op.prototype.isChainable = function() {\n      var _ref2;\n      return (_ref2 = this.operator) === '<' || _ref2 === '>' || _ref2 === '>=' || _ref2 === '<=' || _ref2 === '===' || _ref2 === '!==';\n    };\n\n    Op.prototype.invert = function() {\n      var allInvertable, curr, fst, op, _ref2;\n      if (this.isChainable() && this.first.isChainable()) {\n        allInvertable = true;\n        curr = this;\n        while (curr && curr.operator) {\n          allInvertable && (allInvertable = curr.operator in INVERSIONS);\n          curr = curr.first;\n        }\n        if (!allInvertable) {\n          return new Parens(this).invert();\n        }\n        curr = this;\n        while (curr && curr.operator) {\n          curr.invert = !curr.invert;\n          curr.operator = INVERSIONS[curr.operator];\n          curr = curr.first;\n        }\n        return this;\n      } else if (op = INVERSIONS[this.operator]) {\n        this.operator = op;\n        if (this.first.unwrap() instanceof Op) {\n          this.first.invert();\n        }\n        return this;\n      } else if (this.second) {\n        return new Parens(this).invert();\n      } else if (this.operator === '!' && (fst = this.first.unwrap()) instanceof Op && ((_ref2 = fst.operator) === '!' || _ref2 === 'in' || _ref2 === 'instanceof')) {\n        return fst;\n      } else {\n        return new Op('!', this);\n      }\n    };\n\n    Op.prototype.unfoldSoak = function(o) {\n      var _ref2;\n      return ((_ref2 = this.operator) === '++' || _ref2 === '--' || _ref2 === 'delete') && unfoldSoak(o, this, 'first');\n    };\n\n    Op.prototype.generateDo = function(exp) {\n      var call, func, param, passedParams, ref, _i, _len, _ref2;\n      passedParams = [];\n      func = exp instanceof Assign && (ref = exp.value.unwrap()) instanceof Code ? ref : exp;\n      _ref2 = func.params || [];\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        param = _ref2[_i];\n        if (param.value) {\n          passedParams.push(param.value);\n          delete param.value;\n        } else {\n          passedParams.push(param);\n        }\n      }\n      call = new Call(exp, passedParams);\n      call[\"do\"] = true;\n      return call;\n    };\n\n    Op.prototype.compileNode = function(o) {\n      var answer, isChain, _ref2, _ref3;\n      isChain = this.isChainable() && this.first.isChainable();\n      if (!isChain) {\n        this.first.front = this.front;\n      }\n      if (this.operator === 'delete' && o.scope.check(this.first.unwrapAll().value)) {\n        this.error('delete operand may not be argument or var');\n      }\n      if (((_ref2 = this.operator) === '--' || _ref2 === '++') && (_ref3 = this.first.unwrapAll().value, __indexOf.call(STRICT_PROSCRIBED, _ref3) >= 0)) {\n        this.error(\"cannot increment/decrement \\\"\" + (this.first.unwrapAll().value) + \"\\\"\");\n      }\n      if (this.isUnary()) {\n        return this.compileUnary(o);\n      }\n      if (isChain) {\n        return this.compileChain(o);\n      }\n      if (this.operator === '?') {\n        return this.compileExistence(o);\n      }\n      answer = [].concat(this.first.compileToFragments(o, LEVEL_OP), this.makeCode(' ' + this.operator + ' '), this.second.compileToFragments(o, LEVEL_OP));\n      if (o.level <= LEVEL_OP) {\n        return answer;\n      } else {\n        return this.wrapInBraces(answer);\n      }\n    };\n\n    Op.prototype.compileChain = function(o) {\n      var fragments, fst, shared, _ref2;\n      _ref2 = this.first.second.cache(o), this.first.second = _ref2[0], shared = _ref2[1];\n      fst = this.first.compileToFragments(o, LEVEL_OP);\n      fragments = fst.concat(this.makeCode(\" \" + (this.invert ? '&&' : '||') + \" \"), shared.compileToFragments(o), this.makeCode(\" \" + this.operator + \" \"), this.second.compileToFragments(o, LEVEL_OP));\n      return this.wrapInBraces(fragments);\n    };\n\n    Op.prototype.compileExistence = function(o) {\n      var fst, ref;\n      if (this.first.isComplex()) {\n        ref = new Literal(o.scope.freeVariable('ref'));\n        fst = new Parens(new Assign(ref, this.first));\n      } else {\n        fst = this.first;\n        ref = fst;\n      }\n      return new If(new Existence(fst), ref, {\n        type: 'if'\n      }).addElse(this.second).compileToFragments(o);\n    };\n\n    Op.prototype.compileUnary = function(o) {\n      var op, parts, plusMinus;\n      parts = [];\n      op = this.operator;\n      parts.push([this.makeCode(op)]);\n      if (op === '!' && this.first instanceof Existence) {\n        this.first.negated = !this.first.negated;\n        return this.first.compileToFragments(o);\n      }\n      if (o.level >= LEVEL_ACCESS) {\n        return (new Parens(this)).compileToFragments(o);\n      }\n      plusMinus = op === '+' || op === '-';\n      if ((op === 'new' || op === 'typeof' || op === 'delete') || plusMinus && this.first instanceof Op && this.first.operator === op) {\n        parts.push([this.makeCode(' ')]);\n      }\n      if ((plusMinus && this.first instanceof Op) || (op === 'new' && this.first.isStatement(o))) {\n        this.first = new Parens(this.first);\n      }\n      parts.push(this.first.compileToFragments(o, LEVEL_OP));\n      if (this.flip) {\n        parts.reverse();\n      }\n      return this.joinFragmentArrays(parts, '');\n    };\n\n    Op.prototype.toString = function(idt) {\n      return Op.__super__.toString.call(this, idt, this.constructor.name + ' ' + this.operator);\n    };\n\n    return Op;\n\n  })(Base);\n\n  exports.In = In = (function(_super) {\n    __extends(In, _super);\n\n    function In(object, array) {\n      this.object = object;\n      this.array = array;\n    }\n\n    In.prototype.children = ['object', 'array'];\n\n    In.prototype.invert = NEGATE;\n\n    In.prototype.compileNode = function(o) {\n      var hasSplat, obj, _i, _len, _ref2;\n      if (this.array instanceof Value && this.array.isArray()) {\n        _ref2 = this.array.base.objects;\n        for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n          obj = _ref2[_i];\n          if (!(obj instanceof Splat)) {\n            continue;\n          }\n          hasSplat = true;\n          break;\n        }\n        if (!hasSplat) {\n          return this.compileOrTest(o);\n        }\n      }\n      return this.compileLoopTest(o);\n    };\n\n    In.prototype.compileOrTest = function(o) {\n      var cmp, cnj, i, item, ref, sub, tests, _i, _len, _ref2, _ref3, _ref4;\n      if (this.array.base.objects.length === 0) {\n        return [this.makeCode(\"\" + (!!this.negated))];\n      }\n      _ref2 = this.object.cache(o, LEVEL_OP), sub = _ref2[0], ref = _ref2[1];\n      _ref3 = this.negated ? [' !== ', ' && '] : [' === ', ' || '], cmp = _ref3[0], cnj = _ref3[1];\n      tests = [];\n      _ref4 = this.array.base.objects;\n      for (i = _i = 0, _len = _ref4.length; _i < _len; i = ++_i) {\n        item = _ref4[i];\n        if (i) {\n          tests.push(this.makeCode(cnj));\n        }\n        tests = tests.concat((i ? ref : sub), this.makeCode(cmp), item.compileToFragments(o, LEVEL_ACCESS));\n      }\n      if (o.level < LEVEL_OP) {\n        return tests;\n      } else {\n        return this.wrapInBraces(tests);\n      }\n    };\n\n    In.prototype.compileLoopTest = function(o) {\n      var fragments, ref, sub, _ref2;\n      _ref2 = this.object.cache(o, LEVEL_LIST), sub = _ref2[0], ref = _ref2[1];\n      fragments = [].concat(this.makeCode(utility('indexOf') + \".call(\"), this.array.compileToFragments(o, LEVEL_LIST), this.makeCode(\", \"), ref, this.makeCode(\") \" + (this.negated ? '< 0' : '>= 0')));\n      if (fragmentsToText(sub) === fragmentsToText(ref)) {\n        return fragments;\n      }\n      fragments = sub.concat(this.makeCode(', '), fragments);\n      if (o.level < LEVEL_LIST) {\n        return fragments;\n      } else {\n        return this.wrapInBraces(fragments);\n      }\n    };\n\n    In.prototype.toString = function(idt) {\n      return In.__super__.toString.call(this, idt, this.constructor.name + (this.negated ? '!' : ''));\n    };\n\n    return In;\n\n  })(Base);\n\n  exports.Try = Try = (function(_super) {\n    __extends(Try, _super);\n\n    function Try(attempt, errorVariable, recovery, ensure) {\n      this.attempt = attempt;\n      this.errorVariable = errorVariable;\n      this.recovery = recovery;\n      this.ensure = ensure;\n    }\n\n    Try.prototype.children = ['attempt', 'recovery', 'ensure'];\n\n    Try.prototype.isStatement = YES;\n\n    Try.prototype.jumps = function(o) {\n      var _ref2;\n      return this.attempt.jumps(o) || ((_ref2 = this.recovery) != null ? _ref2.jumps(o) : void 0);\n    };\n\n    Try.prototype.makeReturn = function(res) {\n      if (this.attempt) {\n        this.attempt = this.attempt.makeReturn(res);\n      }\n      if (this.recovery) {\n        this.recovery = this.recovery.makeReturn(res);\n      }\n      return this;\n    };\n\n    Try.prototype.compileNode = function(o) {\n      var catchPart, ensurePart, placeholder, tryPart;\n      o.indent += TAB;\n      tryPart = this.attempt.compileToFragments(o, LEVEL_TOP);\n      catchPart = this.recovery ? (placeholder = new Literal('_error'), this.errorVariable ? this.recovery.unshift(new Assign(this.errorVariable, placeholder)) : void 0, [].concat(this.makeCode(\" catch (\"), placeholder.compileToFragments(o), this.makeCode(\") {\\n\"), this.recovery.compileToFragments(o, LEVEL_TOP), this.makeCode(\"\\n\" + this.tab + \"}\"))) : !(this.ensure || this.recovery) ? [this.makeCode(' catch (_error) {}')] : [];\n      ensurePart = this.ensure ? [].concat(this.makeCode(\" finally {\\n\"), this.ensure.compileToFragments(o, LEVEL_TOP), this.makeCode(\"\\n\" + this.tab + \"}\")) : [];\n      return [].concat(this.makeCode(\"\" + this.tab + \"try {\\n\"), tryPart, this.makeCode(\"\\n\" + this.tab + \"}\"), catchPart, ensurePart);\n    };\n\n    return Try;\n\n  })(Base);\n\n  exports.Throw = Throw = (function(_super) {\n    __extends(Throw, _super);\n\n    function Throw(expression) {\n      this.expression = expression;\n    }\n\n    Throw.prototype.children = ['expression'];\n\n    Throw.prototype.isStatement = YES;\n\n    Throw.prototype.jumps = NO;\n\n    Throw.prototype.makeReturn = THIS;\n\n    Throw.prototype.compileNode = function(o) {\n      return [].concat(this.makeCode(this.tab + \"throw \"), this.expression.compileToFragments(o), this.makeCode(\";\"));\n    };\n\n    return Throw;\n\n  })(Base);\n\n  exports.Existence = Existence = (function(_super) {\n    __extends(Existence, _super);\n\n    function Existence(expression) {\n      this.expression = expression;\n    }\n\n    Existence.prototype.children = ['expression'];\n\n    Existence.prototype.invert = NEGATE;\n\n    Existence.prototype.compileNode = function(o) {\n      var cmp, cnj, code, _ref2;\n      this.expression.front = this.front;\n      code = this.expression.compile(o, LEVEL_OP);\n      if (IDENTIFIER.test(code) && !o.scope.check(code)) {\n        _ref2 = this.negated ? ['===', '||'] : ['!==', '&&'], cmp = _ref2[0], cnj = _ref2[1];\n        code = \"typeof \" + code + \" \" + cmp + \" \\\"undefined\\\" \" + cnj + \" \" + code + \" \" + cmp + \" null\";\n      } else {\n        code = \"\" + code + \" \" + (this.negated ? '==' : '!=') + \" null\";\n      }\n      return [this.makeCode(o.level <= LEVEL_COND ? code : \"(\" + code + \")\")];\n    };\n\n    return Existence;\n\n  })(Base);\n\n  exports.Parens = Parens = (function(_super) {\n    __extends(Parens, _super);\n\n    function Parens(body) {\n      this.body = body;\n    }\n\n    Parens.prototype.children = ['body'];\n\n    Parens.prototype.unwrap = function() {\n      return this.body;\n    };\n\n    Parens.prototype.isComplex = function() {\n      return this.body.isComplex();\n    };\n\n    Parens.prototype.compileNode = function(o) {\n      var bare, expr, fragments;\n      expr = this.body.unwrap();\n      if (expr instanceof Value && expr.isAtomic()) {\n        expr.front = this.front;\n        return expr.compileToFragments(o);\n      }\n      fragments = expr.compileToFragments(o, LEVEL_PAREN);\n      bare = o.level < LEVEL_OP && (expr instanceof Op || expr instanceof Call || (expr instanceof For && expr.returns));\n      if (bare) {\n        return fragments;\n      } else {\n        return this.wrapInBraces(fragments);\n      }\n    };\n\n    return Parens;\n\n  })(Base);\n\n  exports.For = For = (function(_super) {\n    __extends(For, _super);\n\n    function For(body, source) {\n      var _ref2;\n      this.source = source.source, this.guard = source.guard, this.step = source.step, this.name = source.name, this.index = source.index;\n      this.body = Block.wrap([body]);\n      this.own = !!source.own;\n      this.object = !!source.object;\n      if (this.object) {\n        _ref2 = [this.index, this.name], this.name = _ref2[0], this.index = _ref2[1];\n      }\n      if (this.index instanceof Value) {\n        this.index.error('index cannot be a pattern matching expression');\n      }\n      this.range = this.source instanceof Value && this.source.base instanceof Range && !this.source.properties.length;\n      this.pattern = this.name instanceof Value;\n      if (this.range && this.index) {\n        this.index.error('indexes do not apply to range loops');\n      }\n      if (this.range && this.pattern) {\n        this.name.error('cannot pattern match over range loops');\n      }\n      if (this.own && !this.object) {\n        this.name.error('cannot use own with for-in');\n      }\n      this.returns = false;\n    }\n\n    For.prototype.children = ['body', 'source', 'guard', 'step'];\n\n    For.prototype.compileNode = function(o) {\n      var body, bodyFragments, compare, compareDown, declare, declareDown, defPart, defPartFragments, down, forPartFragments, guardPart, idt1, increment, index, ivar, kvar, kvarAssign, lastJumps, lvar, name, namePart, ref, resultPart, returnResult, rvar, scope, source, step, stepNum, stepVar, svar, varPart, _ref2, _ref3;\n      body = Block.wrap([this.body]);\n      lastJumps = (_ref2 = last(body.expressions)) != null ? _ref2.jumps() : void 0;\n      if (lastJumps && lastJumps instanceof Return) {\n        this.returns = false;\n      }\n      source = this.range ? this.source.base : this.source;\n      scope = o.scope;\n      name = this.name && (this.name.compile(o, LEVEL_LIST));\n      index = this.index && (this.index.compile(o, LEVEL_LIST));\n      if (name && !this.pattern) {\n        scope.find(name);\n      }\n      if (index) {\n        scope.find(index);\n      }\n      if (this.returns) {\n        rvar = scope.freeVariable('results');\n      }\n      ivar = (this.object && index) || scope.freeVariable('i');\n      kvar = (this.range && name) || index || ivar;\n      kvarAssign = kvar !== ivar ? \"\" + kvar + \" = \" : \"\";\n      if (this.step && !this.range) {\n        _ref3 = this.cacheToCodeFragments(this.step.cache(o, LEVEL_LIST)), step = _ref3[0], stepVar = _ref3[1];\n        stepNum = stepVar.match(NUMBER);\n      }\n      if (this.pattern) {\n        name = ivar;\n      }\n      varPart = '';\n      guardPart = '';\n      defPart = '';\n      idt1 = this.tab + TAB;\n      if (this.range) {\n        forPartFragments = source.compileToFragments(merge(o, {\n          index: ivar,\n          name: name,\n          step: this.step\n        }));\n      } else {\n        svar = this.source.compile(o, LEVEL_LIST);\n        if ((name || this.own) && !IDENTIFIER.test(svar)) {\n          defPart += \"\" + this.tab + (ref = scope.freeVariable('ref')) + \" = \" + svar + \";\\n\";\n          svar = ref;\n        }\n        if (name && !this.pattern) {\n          namePart = \"\" + name + \" = \" + svar + \"[\" + kvar + \"]\";\n        }\n        if (!this.object) {\n          if (step !== stepVar) {\n            defPart += \"\" + this.tab + step + \";\\n\";\n          }\n          if (!(this.step && stepNum && (down = parseNum(stepNum[0]) < 0))) {\n            lvar = scope.freeVariable('len');\n          }\n          declare = \"\" + kvarAssign + ivar + \" = 0, \" + lvar + \" = \" + svar + \".length\";\n          declareDown = \"\" + kvarAssign + ivar + \" = \" + svar + \".length - 1\";\n          compare = \"\" + ivar + \" < \" + lvar;\n          compareDown = \"\" + ivar + \" >= 0\";\n          if (this.step) {\n            if (stepNum) {\n              if (down) {\n                compare = compareDown;\n                declare = declareDown;\n              }\n            } else {\n              compare = \"\" + stepVar + \" > 0 ? \" + compare + \" : \" + compareDown;\n              declare = \"(\" + stepVar + \" > 0 ? (\" + declare + \") : \" + declareDown + \")\";\n            }\n            increment = \"\" + ivar + \" += \" + stepVar;\n          } else {\n            increment = \"\" + (kvar !== ivar ? \"++\" + ivar : \"\" + ivar + \"++\");\n          }\n          forPartFragments = [this.makeCode(\"\" + declare + \"; \" + compare + \"; \" + kvarAssign + increment)];\n        }\n      }\n      if (this.returns) {\n        resultPart = \"\" + this.tab + rvar + \" = [];\\n\";\n        returnResult = \"\\n\" + this.tab + \"return \" + rvar + \";\";\n        body.makeReturn(rvar);\n      }\n      if (this.guard) {\n        if (body.expressions.length > 1) {\n          body.expressions.unshift(new If((new Parens(this.guard)).invert(), new Literal(\"continue\")));\n        } else {\n          if (this.guard) {\n            body = Block.wrap([new If(this.guard, body)]);\n          }\n        }\n      }\n      if (this.pattern) {\n        body.expressions.unshift(new Assign(this.name, new Literal(\"\" + svar + \"[\" + kvar + \"]\")));\n      }\n      defPartFragments = [].concat(this.makeCode(defPart), this.pluckDirectCall(o, body));\n      if (namePart) {\n        varPart = \"\\n\" + idt1 + namePart + \";\";\n      }\n      if (this.object) {\n        forPartFragments = [this.makeCode(\"\" + kvar + \" in \" + svar)];\n        if (this.own) {\n          guardPart = \"\\n\" + idt1 + \"if (!\" + (utility('hasProp')) + \".call(\" + svar + \", \" + kvar + \")) continue;\";\n        }\n      }\n      bodyFragments = body.compileToFragments(merge(o, {\n        indent: idt1\n      }), LEVEL_TOP);\n      if (bodyFragments && (bodyFragments.length > 0)) {\n        bodyFragments = [].concat(this.makeCode(\"\\n\"), bodyFragments, this.makeCode(\"\\n\"));\n      }\n      return [].concat(defPartFragments, this.makeCode(\"\" + (resultPart || '') + this.tab + \"for (\"), forPartFragments, this.makeCode(\") {\" + guardPart + varPart), bodyFragments, this.makeCode(\"\" + this.tab + \"}\" + (returnResult || '')));\n    };\n\n    For.prototype.pluckDirectCall = function(o, body) {\n      var base, defs, expr, fn, idx, ref, val, _i, _len, _ref2, _ref3, _ref4, _ref5, _ref6, _ref7, _ref8;\n      defs = [];\n      _ref2 = body.expressions;\n      for (idx = _i = 0, _len = _ref2.length; _i < _len; idx = ++_i) {\n        expr = _ref2[idx];\n        expr = expr.unwrapAll();\n        if (!(expr instanceof Call)) {\n          continue;\n        }\n        val = (_ref3 = expr.variable) != null ? _ref3.unwrapAll() : void 0;\n        if (!((val instanceof Code) || (val instanceof Value && ((_ref4 = val.base) != null ? _ref4.unwrapAll() : void 0) instanceof Code && val.properties.length === 1 && ((_ref5 = (_ref6 = val.properties[0].name) != null ? _ref6.value : void 0) === 'call' || _ref5 === 'apply')))) {\n          continue;\n        }\n        fn = ((_ref7 = val.base) != null ? _ref7.unwrapAll() : void 0) || val;\n        ref = new Literal(o.scope.freeVariable('fn'));\n        base = new Value(ref);\n        if (val.base) {\n          _ref8 = [base, val], val.base = _ref8[0], base = _ref8[1];\n        }\n        body.expressions[idx] = new Call(base, expr.args);\n        defs = defs.concat(this.makeCode(this.tab), new Assign(ref, fn).compileToFragments(o, LEVEL_TOP), this.makeCode(';\\n'));\n      }\n      return defs;\n    };\n\n    return For;\n\n  })(While);\n\n  exports.Switch = Switch = (function(_super) {\n    __extends(Switch, _super);\n\n    function Switch(subject, cases, otherwise) {\n      this.subject = subject;\n      this.cases = cases;\n      this.otherwise = otherwise;\n    }\n\n    Switch.prototype.children = ['subject', 'cases', 'otherwise'];\n\n    Switch.prototype.isStatement = YES;\n\n    Switch.prototype.jumps = function(o) {\n      var block, conds, jumpNode, _i, _len, _ref2, _ref3, _ref4;\n      if (o == null) {\n        o = {\n          block: true\n        };\n      }\n      _ref2 = this.cases;\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        _ref3 = _ref2[_i], conds = _ref3[0], block = _ref3[1];\n        if (jumpNode = block.jumps(o)) {\n          return jumpNode;\n        }\n      }\n      return (_ref4 = this.otherwise) != null ? _ref4.jumps(o) : void 0;\n    };\n\n    Switch.prototype.makeReturn = function(res) {\n      var pair, _i, _len, _ref2, _ref3;\n      _ref2 = this.cases;\n      for (_i = 0, _len = _ref2.length; _i < _len; _i++) {\n        pair = _ref2[_i];\n        pair[1].makeReturn(res);\n      }\n      if (res) {\n        this.otherwise || (this.otherwise = new Block([new Literal('void 0')]));\n      }\n      if ((_ref3 = this.otherwise) != null) {\n        _ref3.makeReturn(res);\n      }\n      return this;\n    };\n\n    Switch.prototype.compileNode = function(o) {\n      var block, body, cond, conditions, expr, fragments, i, idt1, idt2, _i, _j, _len, _len1, _ref2, _ref3, _ref4;\n      idt1 = o.indent + TAB;\n      idt2 = o.indent = idt1 + TAB;\n      fragments = [].concat(this.makeCode(this.tab + \"switch (\"), (this.subject ? this.subject.compileToFragments(o, LEVEL_PAREN) : this.makeCode(\"false\")), this.makeCode(\") {\\n\"));\n      _ref2 = this.cases;\n      for (i = _i = 0, _len = _ref2.length; _i < _len; i = ++_i) {\n        _ref3 = _ref2[i], conditions = _ref3[0], block = _ref3[1];\n        _ref4 = flatten([conditions]);\n        for (_j = 0, _len1 = _ref4.length; _j < _len1; _j++) {\n          cond = _ref4[_j];\n          if (!this.subject) {\n            cond = cond.invert();\n          }\n          fragments = fragments.concat(this.makeCode(idt1 + \"case \"), cond.compileToFragments(o, LEVEL_PAREN), this.makeCode(\":\\n\"));\n        }\n        if ((body = block.compileToFragments(o, LEVEL_TOP)).length > 0) {\n          fragments = fragments.concat(body, this.makeCode('\\n'));\n        }\n        if (i === this.cases.length - 1 && !this.otherwise) {\n          break;\n        }\n        expr = this.lastNonComment(block.expressions);\n        if (expr instanceof Return || (expr instanceof Literal && expr.jumps() && expr.value !== 'debugger')) {\n          continue;\n        }\n        fragments.push(cond.makeCode(idt2 + 'break;\\n'));\n      }\n      if (this.otherwise && this.otherwise.expressions.length) {\n        fragments.push.apply(fragments, [this.makeCode(idt1 + \"default:\\n\")].concat(__slice.call(this.otherwise.compileToFragments(o, LEVEL_TOP)), [this.makeCode(\"\\n\")]));\n      }\n      fragments.push(this.makeCode(this.tab + '}'));\n      return fragments;\n    };\n\n    return Switch;\n\n  })(Base);\n\n  exports.If = If = (function(_super) {\n    __extends(If, _super);\n\n    function If(condition, body, options) {\n      this.body = body;\n      if (options == null) {\n        options = {};\n      }\n      this.condition = options.type === 'unless' ? condition.invert() : condition;\n      this.elseBody = null;\n      this.isChain = false;\n      this.soak = options.soak;\n    }\n\n    If.prototype.children = ['condition', 'body', 'elseBody'];\n\n    If.prototype.bodyNode = function() {\n      var _ref2;\n      return (_ref2 = this.body) != null ? _ref2.unwrap() : void 0;\n    };\n\n    If.prototype.elseBodyNode = function() {\n      var _ref2;\n      return (_ref2 = this.elseBody) != null ? _ref2.unwrap() : void 0;\n    };\n\n    If.prototype.addElse = function(elseBody) {\n      if (this.isChain) {\n        this.elseBodyNode().addElse(elseBody);\n      } else {\n        this.isChain = elseBody instanceof If;\n        this.elseBody = this.ensureBlock(elseBody);\n        this.elseBody.updateLocationDataIfMissing(elseBody.locationData);\n      }\n      return this;\n    };\n\n    If.prototype.isStatement = function(o) {\n      var _ref2;\n      return (o != null ? o.level : void 0) === LEVEL_TOP || this.bodyNode().isStatement(o) || ((_ref2 = this.elseBodyNode()) != null ? _ref2.isStatement(o) : void 0);\n    };\n\n    If.prototype.jumps = function(o) {\n      var _ref2;\n      return this.body.jumps(o) || ((_ref2 = this.elseBody) != null ? _ref2.jumps(o) : void 0);\n    };\n\n    If.prototype.compileNode = function(o) {\n      if (this.isStatement(o)) {\n        return this.compileStatement(o);\n      } else {\n        return this.compileExpression(o);\n      }\n    };\n\n    If.prototype.makeReturn = function(res) {\n      if (res) {\n        this.elseBody || (this.elseBody = new Block([new Literal('void 0')]));\n      }\n      this.body && (this.body = new Block([this.body.makeReturn(res)]));\n      this.elseBody && (this.elseBody = new Block([this.elseBody.makeReturn(res)]));\n      return this;\n    };\n\n    If.prototype.ensureBlock = function(node) {\n      if (node instanceof Block) {\n        return node;\n      } else {\n        return new Block([node]);\n      }\n    };\n\n    If.prototype.compileStatement = function(o) {\n      var answer, body, child, cond, exeq, ifPart, indent;\n      child = del(o, 'chainChild');\n      exeq = del(o, 'isExistentialEquals');\n      if (exeq) {\n        return new If(this.condition.invert(), this.elseBodyNode(), {\n          type: 'if'\n        }).compileToFragments(o);\n      }\n      indent = o.indent + TAB;\n      cond = this.condition.compileToFragments(o, LEVEL_PAREN);\n      body = this.ensureBlock(this.body).compileToFragments(merge(o, {\n        indent: indent\n      }));\n      ifPart = [].concat(this.makeCode(\"if (\"), cond, this.makeCode(\") {\\n\"), body, this.makeCode(\"\\n\" + this.tab + \"}\"));\n      if (!child) {\n        ifPart.unshift(this.makeCode(this.tab));\n      }\n      if (!this.elseBody) {\n        return ifPart;\n      }\n      answer = ifPart.concat(this.makeCode(' else '));\n      if (this.isChain) {\n        o.chainChild = true;\n        answer = answer.concat(this.elseBody.unwrap().compileToFragments(o, LEVEL_TOP));\n      } else {\n        answer = answer.concat(this.makeCode(\"{\\n\"), this.elseBody.compileToFragments(merge(o, {\n          indent: indent\n        }), LEVEL_TOP), this.makeCode(\"\\n\" + this.tab + \"}\"));\n      }\n      return answer;\n    };\n\n    If.prototype.compileExpression = function(o) {\n      var alt, body, cond, fragments;\n      cond = this.condition.compileToFragments(o, LEVEL_COND);\n      body = this.bodyNode().compileToFragments(o, LEVEL_LIST);\n      alt = this.elseBodyNode() ? this.elseBodyNode().compileToFragments(o, LEVEL_LIST) : [this.makeCode('void 0')];\n      fragments = cond.concat(this.makeCode(\" ? \"), body, this.makeCode(\" : \"), alt);\n      if (o.level >= LEVEL_COND) {\n        return this.wrapInBraces(fragments);\n      } else {\n        return fragments;\n      }\n    };\n\n    If.prototype.unfoldSoak = function() {\n      return this.soak && this;\n    };\n\n    return If;\n\n  })(Base);\n\n  UTILITIES = {\n    \"extends\": function() {\n      return \"function(child, parent) { for (var key in parent) { if (\" + (utility('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; }\";\n    },\n    bind: function() {\n      return 'function(fn, me){ return function(){ return fn.apply(me, arguments); }; }';\n    },\n    indexOf: function() {\n      return \"[].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }\";\n    },\n    hasProp: function() {\n      return '{}.hasOwnProperty';\n    },\n    slice: function() {\n      return '[].slice';\n    }\n  };\n\n  LEVEL_TOP = 1;\n\n  LEVEL_PAREN = 2;\n\n  LEVEL_LIST = 3;\n\n  LEVEL_COND = 4;\n\n  LEVEL_OP = 5;\n\n  LEVEL_ACCESS = 6;\n\n  TAB = '  ';\n\n  IDENTIFIER_STR = \"[$A-Za-z_\\\\x7f-\\\\uffff][$\\\\w\\\\x7f-\\\\uffff]*\";\n\n  IDENTIFIER = RegExp(\"^\" + IDENTIFIER_STR + \"$\");\n\n  SIMPLENUM = /^[+-]?\\d+$/;\n\n  HEXNUM = /^[+-]?0x[\\da-f]+/i;\n\n  NUMBER = /^[+-]?(?:0x[\\da-f]+|\\d*\\.?\\d+(?:e[+-]?\\d+)?)$/i;\n\n  METHOD_DEF = RegExp(\"^(\" + IDENTIFIER_STR + \")(\\\\.prototype)?(?:\\\\.(\" + IDENTIFIER_STR + \")|\\\\[(\\\"(?:[^\\\\\\\\\\\"\\\\r\\\\n]|\\\\\\\\.)*\\\"|'(?:[^\\\\\\\\'\\\\r\\\\n]|\\\\\\\\.)*')\\\\]|\\\\[(0x[\\\\da-fA-F]+|\\\\d*\\\\.?\\\\d+(?:[eE][+-]?\\\\d+)?)\\\\])$\");\n\n  IS_STRING = /^['\"]/;\n\n  IS_REGEX = /^\\//;\n\n  utility = function(name) {\n    var ref;\n    ref = \"__\" + name;\n    Scope.root.assign(ref, UTILITIES[name]());\n    return ref;\n  };\n\n  multident = function(code, tab) {\n    code = code.replace(/\\n/g, '$&' + tab);\n    return code.replace(/\\s+$/, '');\n  };\n\n  parseNum = function(x) {\n    if (x == null) {\n      return 0;\n    } else if (x.match(HEXNUM)) {\n      return parseInt(x, 16);\n    } else {\n      return parseFloat(x);\n    }\n  };\n\n  isLiteralArguments = function(node) {\n    return node instanceof Literal && node.value === 'arguments' && !node.asKey;\n  };\n\n  isLiteralThis = function(node) {\n    return (node instanceof Literal && node.value === 'this' && !node.asKey) || (node instanceof Code && node.bound) || (node instanceof Call && node.isSuper);\n  };\n\n  unfoldSoak = function(o, parent, name) {\n    var ifn;\n    if (!(ifn = parent[name].unfoldSoak(o))) {\n      return;\n    }\n    parent[name] = ifn.body;\n    ifn.body = new Value(parent);\n    return ifn;\n  };\n\n\n});\n\nace.define(\"ace/mode/coffee/coffee-script\",[\"require\",\"exports\",\"module\",\"ace/mode/coffee/lexer\",\"ace/mode/coffee/parser\",\"ace/mode/coffee/nodes\"], function(require, exports, module) {\n\n    var Lexer = require(\"./lexer\").Lexer;\n    var parser = require(\"./parser\");\n\n    var lexer = new Lexer();\n    parser.lexer = {\n        lex: function() {\n            var tag, token;\n            token = this.tokens[this.pos++];\n            if (token) {\n                tag = token[0], this.yytext = token[1], this.yylloc = token[2];\n                this.yylineno = this.yylloc.first_line;\n            } else {\n                tag = '';\n            }\n            return tag;\n        },\n        setInput: function(tokens) {\n            this.tokens = tokens;\n            return this.pos = 0;\n        },\n        upcomingInput: function() {\n            return \"\";\n        }\n    };\n    parser.yy = require('./nodes');\n\n    exports.parse = function(code) {\n        return parser.parse(lexer.tokenize(code));\n    };\n});\n\nace.define(\"ace/mode/coffee_worker\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/worker/mirror\",\"ace/mode/coffee/coffee-script\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar Mirror = require(\"../worker/mirror\").Mirror;\nvar coffee = require(\"../mode/coffee/coffee-script\");\n\nwindow.addEventListener = function() {};\n\n\nvar Worker = exports.Worker = function(sender) {\n    Mirror.call(this, sender);\n    this.setTimeout(250);\n};\n\noop.inherits(Worker, Mirror);\n\n(function() {\n\n    this.onUpdate = function() {\n        var value = this.doc.getValue();\n\n        try {\n            coffee.parse(value).compile();\n        } catch(e) {\n            var loc = e.location;\n            if (loc) {\n                this.sender.emit(\"error\", {\n                    row: loc.first_line,\n                    column: loc.first_column,\n                    endRow: loc.last_line,\n                    endColumn: loc.last_column,\n                    text: e.message,\n                    type: \"error\"\n                });\n            }\n            return;\n        }\n        this.sender.emit(\"ok\");\n    };\n\n}).call(Worker.prototype);\n\n});\n\nace.define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\nfunction Empty() {}\n\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function bind(that) { // .length is 1\n        var target = this;\n        if (typeof target != \"function\") {\n            throw new TypeError(\"Function.prototype.bind called on incompatible \" + target);\n        }\n        var args = slice.call(arguments, 1); // for normal call\n        var bound = function () {\n\n            if (this instanceof bound) {\n\n                var result = target.apply(\n                    this,\n                    args.concat(slice.call(arguments))\n                );\n                if (Object(result) === result) {\n                    return result;\n                }\n                return this;\n\n            } else {\n                return target.apply(\n                    that,\n                    args.concat(slice.call(arguments))\n                );\n\n            }\n\n        };\n        if(target.prototype) {\n            Empty.prototype = target.prototype;\n            bound.prototype = new Empty();\n            Empty.prototype = null;\n        }\n        return bound;\n    };\n}\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar _toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n    defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n    defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n    lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n    lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\nif ([1,2].splice(0).length != 2) {\n    if(function() { // test IE < 9 to splice bug - see issue #138\n        function makeArray(l) {\n            var a = new Array(l+2);\n            a[0] = a[1] = 0;\n            return a;\n        }\n        var array = [], lengthBefore;\n        \n        array.splice.apply(array, makeArray(20));\n        array.splice.apply(array, makeArray(26));\n\n        lengthBefore = array.length; //46\n        array.splice(5, 0, \"XXX\"); // add one element\n\n        lengthBefore + 1 == array.length\n\n        if (lengthBefore + 1 == array.length) {\n            return true;// has right splice implementation without bugs\n        }\n    }()) {//IE 6/7\n        var array_splice = Array.prototype.splice;\n        Array.prototype.splice = function(start, deleteCount) {\n            if (!arguments.length) {\n                return [];\n            } else {\n                return array_splice.apply(this, [\n                    start === void 0 ? 0 : start,\n                    deleteCount === void 0 ? (this.length - start) : deleteCount\n                ].concat(slice.call(arguments, 2)))\n            }\n        };\n    } else {//IE8\n        Array.prototype.splice = function(pos, removeCount){\n            var length = this.length;\n            if (pos > 0) {\n                if (pos > length)\n                    pos = length;\n            } else if (pos == void 0) {\n                pos = 0;\n            } else if (pos < 0) {\n                pos = Math.max(length + pos, 0);\n            }\n\n            if (!(pos+removeCount < length))\n                removeCount = length - pos;\n\n            var removed = this.slice(pos, pos+removeCount);\n            var insert = slice.call(arguments, 2);\n            var add = insert.length;            \n            if (pos === length) {\n                if (add) {\n                    this.push.apply(this, insert);\n                }\n            } else {\n                var remove = Math.min(removeCount, length - pos);\n                var tailOldPos = pos + remove;\n                var tailNewPos = tailOldPos + add - remove;\n                var tailCount = length - tailOldPos;\n                var lengthAfterRemove = length - remove;\n\n                if (tailNewPos < tailOldPos) { // case A\n                    for (var i = 0; i < tailCount; ++i) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } else if (tailNewPos > tailOldPos) { // case B\n                    for (i = tailCount; i--; ) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } // else, add == remove (nothing to do)\n\n                if (add && pos === lengthAfterRemove) {\n                    this.length = lengthAfterRemove; // truncate array\n                    this.push.apply(this, insert);\n                } else {\n                    this.length = lengthAfterRemove + add; // reserves space\n                    for (i = 0; i < add; ++i) {\n                        this[pos+i] = insert[i];\n                    }\n                }\n            }\n            return removed;\n        };\n    }\n}\nif (!Array.isArray) {\n    Array.isArray = function isArray(obj) {\n        return _toString(obj) == \"[object Array]\";\n    };\n}\nvar boxedString = Object(\"a\"),\n    splitString = boxedString[0] != \"a\" || !(0 in boxedString);\n\nif (!Array.prototype.forEach) {\n    Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            thisp = arguments[1],\n            i = -1,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        while (++i < length) {\n            if (i in self) {\n                fun.call(thisp, self[i], i, object);\n            }\n        }\n    };\n}\nif (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            result = Array(length),\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self)\n                result[i] = fun.call(thisp, self[i], i, object);\n        }\n        return result;\n    };\n}\nif (!Array.prototype.filter) {\n    Array.prototype.filter = function filter(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                    object,\n            length = self.length >>> 0,\n            result = [],\n            value,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self) {\n                value = self[i];\n                if (fun.call(thisp, value, i, object)) {\n                    result.push(value);\n                }\n            }\n        }\n        return result;\n    };\n}\nif (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && !fun.call(thisp, self[i], i, object)) {\n                return false;\n            }\n        }\n        return true;\n    };\n}\nif (!Array.prototype.some) {\n    Array.prototype.some = function some(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, object)) {\n                return true;\n            }\n        }\n        return false;\n    };\n}\nif (!Array.prototype.reduce) {\n    Array.prototype.reduce = function reduce(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduce of empty array with no initial value\");\n        }\n\n        var i = 0;\n        var result;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i++];\n                    break;\n                }\n                if (++i >= length) {\n                    throw new TypeError(\"reduce of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        for (; i < length; i++) {\n            if (i in self) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        }\n\n        return result;\n    };\n}\nif (!Array.prototype.reduceRight) {\n    Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduceRight of empty array with no initial value\");\n        }\n\n        var result, i = length - 1;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i--];\n                    break;\n                }\n                if (--i < 0) {\n                    throw new TypeError(\"reduceRight of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        do {\n            if (i in this) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        } while (i--);\n\n        return result;\n    };\n}\nif (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {\n    Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n\n        var i = 0;\n        if (arguments.length > 1) {\n            i = toInteger(arguments[1]);\n        }\n        i = i >= 0 ? i : Math.max(0, length + i);\n        for (; i < length; i++) {\n            if (i in self && self[i] === sought) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {\n    Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n        var i = length - 1;\n        if (arguments.length > 1) {\n            i = Math.min(i, toInteger(arguments[1]));\n        }\n        i = i >= 0 ? i : length - Math.abs(i);\n        for (; i >= 0; i--) {\n            if (i in self && sought === self[i]) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Object.getPrototypeOf) {\n    Object.getPrototypeOf = function getPrototypeOf(object) {\n        return object.__proto__ || (\n            object.constructor ?\n            object.constructor.prototype :\n            prototypeOfObject\n        );\n    };\n}\nif (!Object.getOwnPropertyDescriptor) {\n    var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n                         \"non-object: \";\n    Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT + object);\n        if (!owns(object, property))\n            return;\n\n        var descriptor, getter, setter;\n        descriptor =  { enumerable: true, configurable: true };\n        if (supportsAccessors) {\n            var prototype = object.__proto__;\n            object.__proto__ = prototypeOfObject;\n\n            var getter = lookupGetter(object, property);\n            var setter = lookupSetter(object, property);\n            object.__proto__ = prototype;\n\n            if (getter || setter) {\n                if (getter) descriptor.get = getter;\n                if (setter) descriptor.set = setter;\n                return descriptor;\n            }\n        }\n        descriptor.value = object[property];\n        return descriptor;\n    };\n}\nif (!Object.getOwnPropertyNames) {\n    Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n        return Object.keys(object);\n    };\n}\nif (!Object.create) {\n    var createEmpty;\n    if (Object.prototype.__proto__ === null) {\n        createEmpty = function () {\n            return { \"__proto__\": null };\n        };\n    } else {\n        createEmpty = function () {\n            var empty = {};\n            for (var i in empty)\n                empty[i] = null;\n            empty.constructor =\n            empty.hasOwnProperty =\n            empty.propertyIsEnumerable =\n            empty.isPrototypeOf =\n            empty.toLocaleString =\n            empty.toString =\n            empty.valueOf =\n            empty.__proto__ = null;\n            return empty;\n        }\n    }\n\n    Object.create = function create(prototype, properties) {\n        var object;\n        if (prototype === null) {\n            object = createEmpty();\n        } else {\n            if (typeof prototype != \"object\")\n                throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n            var Type = function () {};\n            Type.prototype = prototype;\n            object = new Type();\n            object.__proto__ = prototype;\n        }\n        if (properties !== void 0)\n            Object.defineProperties(object, properties);\n        return object;\n    };\n}\n\nfunction doesDefinePropertyWork(object) {\n    try {\n        Object.defineProperty(object, \"sentinel\", {});\n        return \"sentinel\" in object;\n    } catch (exception) {\n    }\n}\nif (Object.defineProperty) {\n    var definePropertyWorksOnObject = doesDefinePropertyWork({});\n    var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n        doesDefinePropertyWork(document.createElement(\"div\"));\n    if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n        var definePropertyFallback = Object.defineProperty;\n    }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n    var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n    var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n    var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n                                      \"on this javascript engine\";\n\n    Object.defineProperty = function defineProperty(object, property, descriptor) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n        if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n            throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n        if (definePropertyFallback) {\n            try {\n                return definePropertyFallback.call(Object, object, property, descriptor);\n            } catch (exception) {\n            }\n        }\n        if (owns(descriptor, \"value\")) {\n\n            if (supportsAccessors && (lookupGetter(object, property) ||\n                                      lookupSetter(object, property)))\n            {\n                var prototype = object.__proto__;\n                object.__proto__ = prototypeOfObject;\n                delete object[property];\n                object[property] = descriptor.value;\n                object.__proto__ = prototype;\n            } else {\n                object[property] = descriptor.value;\n            }\n        } else {\n            if (!supportsAccessors)\n                throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n            if (owns(descriptor, \"get\"))\n                defineGetter(object, property, descriptor.get);\n            if (owns(descriptor, \"set\"))\n                defineSetter(object, property, descriptor.set);\n        }\n\n        return object;\n    };\n}\nif (!Object.defineProperties) {\n    Object.defineProperties = function defineProperties(object, properties) {\n        for (var property in properties) {\n            if (owns(properties, property))\n                Object.defineProperty(object, property, properties[property]);\n        }\n        return object;\n    };\n}\nif (!Object.seal) {\n    Object.seal = function seal(object) {\n        return object;\n    };\n}\nif (!Object.freeze) {\n    Object.freeze = function freeze(object) {\n        return object;\n    };\n}\ntry {\n    Object.freeze(function () {});\n} catch (exception) {\n    Object.freeze = (function freeze(freezeObject) {\n        return function freeze(object) {\n            if (typeof object == \"function\") {\n                return object;\n            } else {\n                return freezeObject(object);\n            }\n        };\n    })(Object.freeze);\n}\nif (!Object.preventExtensions) {\n    Object.preventExtensions = function preventExtensions(object) {\n        return object;\n    };\n}\nif (!Object.isSealed) {\n    Object.isSealed = function isSealed(object) {\n        return false;\n    };\n}\nif (!Object.isFrozen) {\n    Object.isFrozen = function isFrozen(object) {\n        return false;\n    };\n}\nif (!Object.isExtensible) {\n    Object.isExtensible = function isExtensible(object) {\n        if (Object(object) === object) {\n            throw new TypeError(); // TODO message\n        }\n        var name = '';\n        while (owns(object, name)) {\n            name += '?';\n        }\n        object[name] = true;\n        var returnValue = owns(object, name);\n        delete object[name];\n        return returnValue;\n    };\n}\nif (!Object.keys) {\n    var hasDontEnumBug = true,\n        dontEnums = [\n            \"toString\",\n            \"toLocaleString\",\n            \"valueOf\",\n            \"hasOwnProperty\",\n            \"isPrototypeOf\",\n            \"propertyIsEnumerable\",\n            \"constructor\"\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    for (var key in {\"toString\": null}) {\n        hasDontEnumBug = false;\n    }\n\n    Object.keys = function keys(object) {\n\n        if (\n            (typeof object != \"object\" && typeof object != \"function\") ||\n            object === null\n        ) {\n            throw new TypeError(\"Object.keys called on a non-object\");\n        }\n\n        var keys = [];\n        for (var name in object) {\n            if (owns(object, name)) {\n                keys.push(name);\n            }\n        }\n\n        if (hasDontEnumBug) {\n            for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n                var dontEnum = dontEnums[i];\n                if (owns(object, dontEnum)) {\n                    keys.push(dontEnum);\n                }\n            }\n        }\n        return keys;\n    };\n\n}\nif (!Date.now) {\n    Date.now = function now() {\n        return new Date().getTime();\n    };\n}\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n    \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n    \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n    ws = \"[\" + ws + \"]\";\n    var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n        trimEndRegexp = new RegExp(ws + ws + \"*$\");\n    String.prototype.trim = function trim() {\n        return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n    };\n}\n\nfunction toInteger(n) {\n    n = +n;\n    if (n !== n) { // isNaN\n        n = 0;\n    } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {\n        n = (n > 0 || -1) * Math.floor(Math.abs(n));\n    }\n    return n;\n}\n\nfunction isPrimitive(input) {\n    var type = typeof input;\n    return (\n        input === null ||\n        type === \"undefined\" ||\n        type === \"boolean\" ||\n        type === \"number\" ||\n        type === \"string\"\n    );\n}\n\nfunction toPrimitive(input) {\n    var val, valueOf, toString;\n    if (isPrimitive(input)) {\n        return input;\n    }\n    valueOf = input.valueOf;\n    if (typeof valueOf === \"function\") {\n        val = valueOf.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    toString = input.toString;\n    if (typeof toString === \"function\") {\n        val = toString.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    throw new TypeError();\n}\nvar toObject = function (o) {\n    if (o == null) { // this matches both null and undefined\n        throw new TypeError(\"can't convert \"+o+\" to object\");\n    }\n    return Object(o);\n};\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/worker-css.js",
    "content": "\"no use strict\";\n;(function(window) {\nif (typeof window.window != \"undefined\" && window.document) {\n    return;\n}\n\nwindow.console = function() {\n    var msgs = Array.prototype.slice.call(arguments, 0);\n    postMessage({type: \"log\", data: msgs});\n};\nwindow.console.error =\nwindow.console.warn = \nwindow.console.log =\nwindow.console.trace = window.console;\n\nwindow.window = window;\nwindow.ace = window;\n\nwindow.onerror = function(message, file, line, col, err) {\n    postMessage({type: \"error\", data: {\n        message: message,\n        file: file,\n        line: line, \n        col: col,\n        stack: err.stack\n    }});\n};\n\nwindow.normalizeModule = function(parentId, moduleName) {\n    // normalize plugin requires\n    if (moduleName.indexOf(\"!\") !== -1) {\n        var chunks = moduleName.split(\"!\");\n        return window.normalizeModule(parentId, chunks[0]) + \"!\" + window.normalizeModule(parentId, chunks[1]);\n    }\n    // normalize relative requires\n    if (moduleName.charAt(0) == \".\") {\n        var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n        moduleName = (base ? base + \"/\" : \"\") + moduleName;\n        \n        while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n            var previous = moduleName;\n            moduleName = moduleName.replace(/^\\.\\//, \"\").replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n        }\n    }\n    \n    return moduleName;\n};\n\nwindow.require = function(parentId, id) {\n    if (!id) {\n        id = parentId;\n        parentId = null;\n    }\n    if (!id.charAt)\n        throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");\n\n    id = window.normalizeModule(parentId, id);\n\n    var module = window.require.modules[id];\n    if (module) {\n        if (!module.initialized) {\n            module.initialized = true;\n            module.exports = module.factory().exports;\n        }\n        return module.exports;\n    }\n    \n    var chunks = id.split(\"/\");\n    if (!window.require.tlns)\n        return console.log(\"unable to load \" + id);\n    chunks[0] = window.require.tlns[chunks[0]] || chunks[0];\n    var path = chunks.join(\"/\") + \".js\";\n    \n    window.require.id = id;\n    importScripts(path);\n    return window.require(parentId, id);\n};\nwindow.require.modules = {};\nwindow.require.tlns = {};\n\nwindow.define = function(id, deps, factory) {\n    if (arguments.length == 2) {\n        factory = deps;\n        if (typeof id != \"string\") {\n            deps = id;\n            id = window.require.id;\n        }\n    } else if (arguments.length == 1) {\n        factory = id;\n        deps = [];\n        id = window.require.id;\n    }\n    \n    if (typeof factory != \"function\") {\n        window.require.modules[id] = {\n            exports: factory,\n            initialized: true\n        };\n        return;\n    }\n\n    if (!deps.length)\n        // If there is no dependencies, we inject 'require', 'exports' and\n        // 'module' as dependencies, to provide CommonJS compatibility.\n        deps = ['require', 'exports', 'module'];\n\n    var req = function(childId) {\n        return window.require(id, childId);\n    };\n\n    window.require.modules[id] = {\n        exports: {},\n        factory: function() {\n            var module = this;\n            var returnExports = factory.apply(this, deps.map(function(dep) {\n              switch(dep) {\n                  // Because 'require', 'exports' and 'module' aren't actual\n                  // dependencies, we must handle them seperately.\n                  case 'require': return req;\n                  case 'exports': return module.exports;\n                  case 'module':  return module;\n                  // But for all other dependencies, we can just go ahead and\n                  // require them.\n                  default:        return req(dep);\n              }\n            }));\n            if (returnExports)\n                module.exports = returnExports;\n            return module;\n        }\n    };\n};\nwindow.define.amd = {};\n\nwindow.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n    require.tlns = topLevelNamespaces;\n};\n\nwindow.initSender = function initSender() {\n\n    var EventEmitter = window.require(\"ace/lib/event_emitter\").EventEmitter;\n    var oop = window.require(\"ace/lib/oop\");\n    \n    var Sender = function() {};\n    \n    (function() {\n        \n        oop.implement(this, EventEmitter);\n                \n        this.callback = function(data, callbackId) {\n            postMessage({\n                type: \"call\",\n                id: callbackId,\n                data: data\n            });\n        };\n    \n        this.emit = function(name, data) {\n            postMessage({\n                type: \"event\",\n                name: name,\n                data: data\n            });\n        };\n        \n    }).call(Sender.prototype);\n    \n    return new Sender();\n};\n\nvar main = window.main = null;\nvar sender = window.sender = null;\n\nwindow.onmessage = function(e) {\n    var msg = e.data;\n    if (msg.command) {\n        if (main[msg.command])\n            main[msg.command].apply(main, msg.args);\n        else\n            throw new Error(\"Unknown command:\" + msg.command);\n    }\n    else if (msg.init) {        \n        initBaseUrls(msg.tlns);\n        require(\"ace/lib/es5-shim\");\n        sender = window.sender = initSender();\n        var clazz = require(msg.module)[msg.classname];\n        main = window.main = new clazz(sender);\n    } \n    else if (msg.event && sender) {\n        sender._signal(msg.event, msg.data);\n    }\n};\n})(this);\n\nace.define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.inherits = function(ctor, 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\nexports.mixin = function(obj, mixin) {\n    for (var key in mixin) {\n        obj[key] = mixin[key];\n    }\n    return obj;\n};\n\nexports.implement = function(proto, mixin) {\n    exports.mixin(proto, mixin);\n};\n\n});\n\nace.define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.last = function(a) {\n    return a[a.length - 1];\n};\n\nexports.stringReverse = function(string) {\n    return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n    var result = '';\n    while (count > 0) {\n        if (count & 1)\n            result += string;\n\n        if (count >>= 1)\n            string += string;\n    }\n    return result;\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n    return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n    return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n    var copy = {};\n    for (var key in obj) {\n        copy[key] = obj[key];\n    }\n    return copy;\n};\n\nexports.copyArray = function(array){\n    var copy = [];\n    for (var i=0, l=array.length; i<l; i++) {\n        if (array[i] && typeof array[i] == \"object\")\n            copy[i] = this.copyObject( array[i] );\n        else \n            copy[i] = array[i];\n    }\n    return copy;\n};\n\nexports.deepCopy = function (obj) {\n    if (typeof obj !== \"object\" || !obj)\n        return obj;\n    var cons = obj.constructor;\n    if (cons === RegExp)\n        return obj;\n    \n    var copy = cons();\n    for (var key in obj) {\n        if (typeof obj[key] === \"object\") {\n            copy[key] = exports.deepCopy(obj[key]);\n        } else {\n            copy[key] = obj[key];\n        }\n    }\n    return copy;\n};\n\nexports.arrayToMap = function(arr) {\n    var map = {};\n    for (var i=0; i<arr.length; i++) {\n        map[arr[i]] = 1;\n    }\n    return map;\n\n};\n\nexports.createMap = function(props) {\n    var map = Object.create(null);\n    for (var i in props) {\n        map[i] = props[i];\n    }\n    return map;\n};\nexports.arrayRemove = function(array, value) {\n  for (var i = 0; i <= array.length; i++) {\n    if (value === array[i]) {\n      array.splice(i, 1);\n    }\n  }\n};\n\nexports.escapeRegExp = function(str) {\n    return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n};\n\nexports.escapeHTML = function(str) {\n    return str.replace(/&/g, \"&#38;\").replace(/\"/g, \"&#34;\").replace(/'/g, \"&#39;\").replace(/</g, \"&#60;\");\n};\n\nexports.getMatchOffsets = function(string, regExp) {\n    var matches = [];\n\n    string.replace(regExp, function(str) {\n        matches.push({\n            offset: arguments[arguments.length-2],\n            length: str.length\n        });\n    });\n\n    return matches;\n};\nexports.deferredCall = function(fcn) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var deferred = function(timeout) {\n        deferred.cancel();\n        timer = setTimeout(callback, timeout || 0);\n        return deferred;\n    };\n\n    deferred.schedule = deferred;\n\n    deferred.call = function() {\n        this.cancel();\n        fcn();\n        return deferred;\n    };\n\n    deferred.cancel = function() {\n        clearTimeout(timer);\n        timer = null;\n        return deferred;\n    };\n    \n    deferred.isPending = function() {\n        return timer;\n    };\n\n    return deferred;\n};\n\n\nexports.delayedCall = function(fcn, defaultTimeout) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var _self = function(timeout) {\n        if (timer == null)\n            timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n\n    _self.delay = function(timeout) {\n        timer && clearTimeout(timer);\n        timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n    _self.schedule = _self;\n\n    _self.call = function() {\n        this.cancel();\n        fcn();\n    };\n\n    _self.cancel = function() {\n        timer && clearTimeout(timer);\n        timer = null;\n    };\n\n    _self.isPending = function() {\n        return timer;\n    };\n\n    return _self;\n};\n});\n\nace.define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nvar EventEmitter = {};\nvar stopPropagation = function() { this.propagationStopped = true; };\nvar preventDefault = function() { this.defaultPrevented = true; };\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n    this._eventRegistry || (this._eventRegistry = {});\n    this._defaultHandlers || (this._defaultHandlers = {});\n\n    var listeners = this._eventRegistry[eventName] || [];\n    var defaultHandler = this._defaultHandlers[eventName];\n    if (!listeners.length && !defaultHandler)\n        return;\n\n    if (typeof e != \"object\" || !e)\n        e = {};\n\n    if (!e.type)\n        e.type = eventName;\n    if (!e.stopPropagation)\n        e.stopPropagation = stopPropagation;\n    if (!e.preventDefault)\n        e.preventDefault = preventDefault;\n\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++) {\n        listeners[i](e, this);\n        if (e.propagationStopped)\n            break;\n    }\n    \n    if (defaultHandler && !e.defaultPrevented)\n        return defaultHandler(e, this);\n};\n\n\nEventEmitter._signal = function(eventName, e) {\n    var listeners = (this._eventRegistry || {})[eventName];\n    if (!listeners)\n        return;\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++)\n        listeners[i](e, this);\n};\n\nEventEmitter.once = function(eventName, callback) {\n    var _self = this;\n    callback && this.addEventListener(eventName, function newCallback() {\n        _self.removeEventListener(eventName, newCallback);\n        callback.apply(null, arguments);\n    });\n};\n\n\nEventEmitter.setDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        handlers = this._defaultHandlers = {_disabled_: {}};\n    \n    if (handlers[eventName]) {\n        var old = handlers[eventName];\n        var disabled = handlers._disabled_[eventName];\n        if (!disabled)\n            handlers._disabled_[eventName] = disabled = [];\n        disabled.push(old);\n        var i = disabled.indexOf(callback);\n        if (i != -1) \n            disabled.splice(i, 1);\n    }\n    handlers[eventName] = callback;\n};\nEventEmitter.removeDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        return;\n    var disabled = handlers._disabled_[eventName];\n    \n    if (handlers[eventName] == callback) {\n        var old = handlers[eventName];\n        if (disabled)\n            this.setDefaultHandler(eventName, disabled.pop());\n    } else if (disabled) {\n        var i = disabled.indexOf(callback);\n        if (i != -1)\n            disabled.splice(i, 1);\n    }\n};\n\nEventEmitter.on =\nEventEmitter.addEventListener = function(eventName, callback, capturing) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        listeners = this._eventRegistry[eventName] = [];\n\n    if (listeners.indexOf(callback) == -1)\n        listeners[capturing ? \"unshift\" : \"push\"](callback);\n    return callback;\n};\n\nEventEmitter.off =\nEventEmitter.removeListener =\nEventEmitter.removeEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        return;\n\n    var index = listeners.indexOf(callback);\n    if (index !== -1)\n        listeners.splice(index, 1);\n};\n\nEventEmitter.removeAllListeners = function(eventName) {\n    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n};\n\nexports.EventEmitter = EventEmitter;\n\n});\n\nace.define(\"ace/range\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nvar comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n    this.start = {\n        row: startRow,\n        column: startColumn\n    };\n\n    this.end = {\n        row: endRow,\n        column: endColumn\n    };\n};\n\n(function() {\n    this.isEqual = function(range) {\n        return this.start.row === range.start.row &&\n            this.end.row === range.end.row &&\n            this.start.column === range.start.column &&\n            this.end.column === range.end.column;\n    };\n    this.toString = function() {\n        return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n            \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n    };\n\n    this.contains = function(row, column) {\n        return this.compare(row, column) == 0;\n    };\n    this.compareRange = function(range) {\n        var cmp,\n            end = range.end,\n            start = range.start;\n\n        cmp = this.compare(end.row, end.column);\n        if (cmp == 1) {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == 1) {\n                return 2;\n            } else if (cmp == 0) {\n                return 1;\n            } else {\n                return 0;\n            }\n        } else if (cmp == -1) {\n            return -2;\n        } else {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == -1) {\n                return -1;\n            } else if (cmp == 1) {\n                return 42;\n            } else {\n                return 0;\n            }\n        }\n    };\n    this.comparePoint = function(p) {\n        return this.compare(p.row, p.column);\n    };\n    this.containsRange = function(range) {\n        return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n    };\n    this.intersects = function(range) {\n        var cmp = this.compareRange(range);\n        return (cmp == -1 || cmp == 0 || cmp == 1);\n    };\n    this.isEnd = function(row, column) {\n        return this.end.row == row && this.end.column == column;\n    };\n    this.isStart = function(row, column) {\n        return this.start.row == row && this.start.column == column;\n    };\n    this.setStart = function(row, column) {\n        if (typeof row == \"object\") {\n            this.start.column = row.column;\n            this.start.row = row.row;\n        } else {\n            this.start.row = row;\n            this.start.column = column;\n        }\n    };\n    this.setEnd = function(row, column) {\n        if (typeof row == \"object\") {\n            this.end.column = row.column;\n            this.end.row = row.row;\n        } else {\n            this.end.row = row;\n            this.end.column = column;\n        }\n    };\n    this.inside = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column) || this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideStart = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideEnd = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.compare = function(row, column) {\n        if (!this.isMultiLine()) {\n            if (row === this.start.row) {\n                return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n            };\n        }\n\n        if (row < this.start.row)\n            return -1;\n\n        if (row > this.end.row)\n            return 1;\n\n        if (this.start.row === row)\n            return column >= this.start.column ? 0 : -1;\n\n        if (this.end.row === row)\n            return column <= this.end.column ? 0 : 1;\n\n        return 0;\n    };\n    this.compareStart = function(row, column) {\n        if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareEnd = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareInside = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.clipRows = function(firstRow, lastRow) {\n        if (this.end.row > lastRow)\n            var end = {row: lastRow + 1, column: 0};\n        else if (this.end.row < firstRow)\n            var end = {row: firstRow, column: 0};\n\n        if (this.start.row > lastRow)\n            var start = {row: lastRow + 1, column: 0};\n        else if (this.start.row < firstRow)\n            var start = {row: firstRow, column: 0};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n    this.extend = function(row, column) {\n        var cmp = this.compare(row, column);\n\n        if (cmp == 0)\n            return this;\n        else if (cmp == -1)\n            var start = {row: row, column: column};\n        else\n            var end = {row: row, column: column};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n\n    this.isEmpty = function() {\n        return (this.start.row === this.end.row && this.start.column === this.end.column);\n    };\n    this.isMultiLine = function() {\n        return (this.start.row !== this.end.row);\n    };\n    this.clone = function() {\n        return Range.fromPoints(this.start, this.end);\n    };\n    this.collapseRows = function() {\n        if (this.end.column == 0)\n            return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)\n        else\n            return new Range(this.start.row, 0, this.end.row, 0)\n    };\n    this.toScreenRange = function(session) {\n        var screenPosStart = session.documentToScreenPosition(this.start);\n        var screenPosEnd = session.documentToScreenPosition(this.end);\n\n        return new Range(\n            screenPosStart.row, screenPosStart.column,\n            screenPosEnd.row, screenPosEnd.column\n        );\n    };\n    this.moveBy = function(row, column) {\n        this.start.row += row;\n        this.start.column += column;\n        this.end.row += row;\n        this.end.column += column;\n    };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n    return new Range(start.row, start.column, end.row, end.column);\n};\nRange.comparePoints = comparePoints;\n\nRange.comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\n\n\nexports.Range = Range;\n});\n\nace.define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n    this.$onChange = this.onChange.bind(this);\n    this.attach(doc);\n    \n    if (typeof column == \"undefined\")\n        this.setPosition(row.row, row.column);\n    else\n        this.setPosition(row, column);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.getPosition = function() {\n        return this.$clipPositionToDocument(this.row, this.column);\n    };\n    this.getDocument = function() {\n        return this.document;\n    };\n    this.$insertRight = false;\n    this.onChange = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n\n        if (range.start.row == range.end.row && range.start.row != this.row)\n            return;\n\n        if (range.start.row > this.row)\n            return;\n\n        if (range.start.row == this.row && range.start.column > this.column)\n            return;\n\n        var row = this.row;\n        var column = this.column;\n        var start = range.start;\n        var end = range.end;\n\n        if (delta.action === \"insertText\") {\n            if (start.row === row && start.column <= column) {\n                if (start.column === column && this.$insertRight) {\n                } else if (start.row === end.row) {\n                    column += end.column - start.column;\n                } else {\n                    column -= start.column;\n                    row += end.row - start.row;\n                }\n            } else if (start.row !== end.row && start.row < row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"insertLines\") {\n            if (start.row === row && column === 0 && this.$insertRight) {\n            }\n            else if (start.row <= row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"removeText\") {\n            if (start.row === row && start.column < column) {\n                if (end.column >= column)\n                    column = start.column;\n                else\n                    column = Math.max(0, column - (end.column - start.column));\n\n            } else if (start.row !== end.row && start.row < row) {\n                if (end.row === row)\n                    column = Math.max(0, column - end.column) + start.column;\n                row -= (end.row - start.row);\n            } else if (end.row === row) {\n                row -= end.row - start.row;\n                column = Math.max(0, column - end.column) + start.column;\n            }\n        } else if (delta.action == \"removeLines\") {\n            if (start.row <= row) {\n                if (end.row <= row)\n                    row -= end.row - start.row;\n                else {\n                    row = start.row;\n                    column = 0;\n                }\n            }\n        }\n\n        this.setPosition(row, column, true);\n    };\n    this.setPosition = function(row, column, noClip) {\n        var pos;\n        if (noClip) {\n            pos = {\n                row: row,\n                column: column\n            };\n        } else {\n            pos = this.$clipPositionToDocument(row, column);\n        }\n\n        if (this.row == pos.row && this.column == pos.column)\n            return;\n\n        var old = {\n            row: this.row,\n            column: this.column\n        };\n\n        this.row = pos.row;\n        this.column = pos.column;\n        this._signal(\"change\", {\n            old: old,\n            value: pos\n        });\n    };\n    this.detach = function() {\n        this.document.removeEventListener(\"change\", this.$onChange);\n    };\n    this.attach = function(doc) {\n        this.document = doc || this.document;\n        this.document.on(\"change\", this.$onChange);\n    };\n    this.$clipPositionToDocument = function(row, column) {\n        var pos = {};\n\n        if (row >= this.document.getLength()) {\n            pos.row = Math.max(0, this.document.getLength() - 1);\n            pos.column = this.document.getLine(pos.row).length;\n        }\n        else if (row < 0) {\n            pos.row = 0;\n            pos.column = 0;\n        }\n        else {\n            pos.row = row;\n            pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n        }\n\n        if (column < 0)\n            pos.column = 0;\n\n        return pos;\n    };\n\n}).call(Anchor.prototype);\n\n});\n\nace.define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\nvar Document = function(text) {\n    this.$lines = [];\n    if (text.length === 0) {\n        this.$lines = [\"\"];\n    } else if (Array.isArray(text)) {\n        this._insertLines(0, text);\n    } else {\n        this.insert({row: 0, column:0}, text);\n    }\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setValue = function(text) {\n        var len = this.getLength();\n        this.remove(new Range(0, 0, len, this.getLine(len-1).length));\n        this.insert({row: 0, column:0}, text);\n    };\n    this.getValue = function() {\n        return this.getAllLines().join(this.getNewLineCharacter());\n    };\n    this.createAnchor = function(row, column) {\n        return new Anchor(this, row, column);\n    };\n    if (\"aaa\".split(/a/).length === 0)\n        this.$split = function(text) {\n            return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n        };\n    else\n        this.$split = function(text) {\n            return text.split(/\\r\\n|\\r|\\n/);\n        };\n\n\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n        this.$autoNewLine = match ? match[1] : \"\\n\";\n        this._signal(\"changeNewLineMode\");\n    };\n    this.getNewLineCharacter = function() {\n        switch (this.$newLineMode) {\n          case \"windows\":\n            return \"\\r\\n\";\n          case \"unix\":\n            return \"\\n\";\n          default:\n            return this.$autoNewLine || \"\\n\";\n        }\n    };\n\n    this.$autoNewLine = \"\";\n    this.$newLineMode = \"auto\";\n    this.setNewLineMode = function(newLineMode) {\n        if (this.$newLineMode === newLineMode)\n            return;\n\n        this.$newLineMode = newLineMode;\n        this._signal(\"changeNewLineMode\");\n    };\n    this.getNewLineMode = function() {\n        return this.$newLineMode;\n    };\n    this.isNewLine = function(text) {\n        return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n    };\n    this.getLine = function(row) {\n        return this.$lines[row] || \"\";\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.$lines.slice(firstRow, lastRow + 1);\n    };\n    this.getAllLines = function() {\n        return this.getLines(0, this.getLength());\n    };\n    this.getLength = function() {\n        return this.$lines.length;\n    };\n    this.getTextRange = function(range) {\n        if (range.start.row == range.end.row) {\n            return this.getLine(range.start.row)\n                .substring(range.start.column, range.end.column);\n        }\n        var lines = this.getLines(range.start.row, range.end.row);\n        lines[0] = (lines[0] || \"\").substring(range.start.column);\n        var l = lines.length - 1;\n        if (range.end.row - range.start.row == l)\n            lines[l] = lines[l].substring(0, range.end.column);\n        return lines.join(this.getNewLineCharacter());\n    };\n\n    this.$clipPosition = function(position) {\n        var length = this.getLength();\n        if (position.row >= length) {\n            position.row = Math.max(0, length - 1);\n            position.column = this.getLine(length-1).length;\n        } else if (position.row < 0)\n            position.row = 0;\n        return position;\n    };\n    this.insert = function(position, text) {\n        if (!text || text.length === 0)\n            return position;\n\n        position = this.$clipPosition(position);\n        if (this.getLength() <= 1)\n            this.$detectNewLine(text);\n\n        var lines = this.$split(text);\n        var firstLine = lines.splice(0, 1)[0];\n        var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];\n\n        position = this.insertInLine(position, firstLine);\n        if (lastLine !== null) {\n            position = this.insertNewLine(position); // terminate first line\n            position = this._insertLines(position.row, lines);\n            position = this.insertInLine(position, lastLine || \"\");\n        }\n        return position;\n    };\n    this.insertLines = function(row, lines) {\n        if (row >= this.getLength())\n            return this.insert({row: row, column: 0}, \"\\n\" + lines.join(\"\\n\"));\n        return this._insertLines(Math.max(row, 0), lines);\n    };\n    this._insertLines = function(row, lines) {\n        if (lines.length == 0)\n            return {row: row, column: 0};\n        while (lines.length > 0xF000) {\n            var end = this._insertLines(row, lines.slice(0, 0xF000));\n            lines = lines.slice(0xF000);\n            row = end.row;\n        }\n\n        var args = [row, 0];\n        args.push.apply(args, lines);\n        this.$lines.splice.apply(this.$lines, args);\n\n        var range = new Range(row, 0, row + lines.length, 0);\n        var delta = {\n            action: \"insertLines\",\n            range: range,\n            lines: lines\n        };\n        this._signal(\"change\", { data: delta });\n        return range.end;\n    };\n    this.insertNewLine = function(position) {\n        position = this.$clipPosition(position);\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column);\n        this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));\n\n        var end = {\n            row : position.row + 1,\n            column : 0\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: this.getNewLineCharacter()\n        };\n        this._signal(\"change\", { data: delta });\n\n        return end;\n    };\n    this.insertInLine = function(position, text) {\n        if (text.length == 0)\n            return position;\n\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column) + text\n                + line.substring(position.column);\n\n        var end = {\n            row : position.row,\n            column : position.column + text.length\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: text\n        };\n        this._signal(\"change\", { data: delta });\n\n        return end;\n    };\n    this.remove = function(range) {\n        if (!(range instanceof Range))\n            range = Range.fromPoints(range.start, range.end);\n        range.start = this.$clipPosition(range.start);\n        range.end = this.$clipPosition(range.end);\n\n        if (range.isEmpty())\n            return range.start;\n\n        var firstRow = range.start.row;\n        var lastRow = range.end.row;\n\n        if (range.isMultiLine()) {\n            var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;\n            var lastFullRow = lastRow - 1;\n\n            if (range.end.column > 0)\n                this.removeInLine(lastRow, 0, range.end.column);\n\n            if (lastFullRow >= firstFullRow)\n                this._removeLines(firstFullRow, lastFullRow);\n\n            if (firstFullRow != firstRow) {\n                this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);\n                this.removeNewLine(range.start.row);\n            }\n        }\n        else {\n            this.removeInLine(firstRow, range.start.column, range.end.column);\n        }\n        return range.start;\n    };\n    this.removeInLine = function(row, startColumn, endColumn) {\n        if (startColumn == endColumn)\n            return;\n\n        var range = new Range(row, startColumn, row, endColumn);\n        var line = this.getLine(row);\n        var removed = line.substring(startColumn, endColumn);\n        var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);\n        this.$lines.splice(row, 1, newLine);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: removed\n        };\n        this._signal(\"change\", { data: delta });\n        return range.start;\n    };\n    this.removeLines = function(firstRow, lastRow) {\n        if (firstRow < 0 || lastRow >= this.getLength())\n            return this.remove(new Range(firstRow, 0, lastRow + 1, 0));\n        return this._removeLines(firstRow, lastRow);\n    };\n\n    this._removeLines = function(firstRow, lastRow) {\n        var range = new Range(firstRow, 0, lastRow + 1, 0);\n        var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);\n\n        var delta = {\n            action: \"removeLines\",\n            range: range,\n            nl: this.getNewLineCharacter(),\n            lines: removed\n        };\n        this._signal(\"change\", { data: delta });\n        return removed;\n    };\n    this.removeNewLine = function(row) {\n        var firstLine = this.getLine(row);\n        var secondLine = this.getLine(row+1);\n\n        var range = new Range(row, firstLine.length, row+1, 0);\n        var line = firstLine + secondLine;\n\n        this.$lines.splice(row, 2, line);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: this.getNewLineCharacter()\n        };\n        this._signal(\"change\", { data: delta });\n    };\n    this.replace = function(range, text) {\n        if (!(range instanceof Range))\n            range = Range.fromPoints(range.start, range.end);\n        if (text.length == 0 && range.isEmpty())\n            return range.start;\n        if (text == this.getTextRange(range))\n            return range.end;\n\n        this.remove(range);\n        if (text) {\n            var end = this.insert(range.start, text);\n        }\n        else {\n            end = range.start;\n        }\n\n        return end;\n    };\n    this.applyDeltas = function(deltas) {\n        for (var i=0; i<deltas.length; i++) {\n            var delta = deltas[i];\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"insertText\")\n                this.insert(range.start, delta.text);\n            else if (delta.action == \"removeLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"removeText\")\n                this.remove(range);\n        }\n    };\n    this.revertDeltas = function(deltas) {\n        for (var i=deltas.length-1; i>=0; i--) {\n            var delta = deltas[i];\n\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"insertText\")\n                this.remove(range);\n            else if (delta.action == \"removeLines\")\n                this._insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"removeText\")\n                this.insert(range.start, delta.text);\n        }\n    };\n    this.indexToPosition = function(index, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        for (var i = startRow || 0, l = lines.length; i < l; i++) {\n            index -= lines[i].length + newlineLength;\n            if (index < 0)\n                return {row: i, column: index + lines[i].length + newlineLength};\n        }\n        return {row: l-1, column: lines[l-1].length};\n    };\n    this.positionToIndex = function(pos, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        var index = 0;\n        var row = Math.min(pos.row, lines.length);\n        for (var i = startRow || 0; i < row; ++i)\n            index += lines[i].length + newlineLength;\n\n        return index + pos.column;\n    };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\nace.define(\"ace/worker/mirror\",[\"require\",\"exports\",\"module\",\"ace/document\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar Document = require(\"../document\").Document;\nvar lang = require(\"../lib/lang\");\n    \nvar Mirror = exports.Mirror = function(sender) {\n    this.sender = sender;\n    var doc = this.doc = new Document(\"\");\n    \n    var deferredUpdate = this.deferredUpdate = lang.delayedCall(this.onUpdate.bind(this));\n    \n    var _self = this;\n    sender.on(\"change\", function(e) {\n        doc.applyDeltas(e.data);\n        if (_self.$timeout)\n            return deferredUpdate.schedule(_self.$timeout);\n        _self.onUpdate();\n    });\n};\n\n(function() {\n    \n    this.$timeout = 500;\n    \n    this.setTimeout = function(timeout) {\n        this.$timeout = timeout;\n    };\n    \n    this.setValue = function(value) {\n        this.doc.setValue(value);\n        this.deferredUpdate.schedule(this.$timeout);\n    };\n    \n    this.getValue = function(callbackId) {\n        this.sender.callback(this.doc.getValue(), callbackId);\n    };\n    \n    this.onUpdate = function() {\n    };\n    \n    this.isPending = function() {\n        return this.deferredUpdate.isPending();\n    };\n    \n}).call(Mirror.prototype);\n\n});\n\nace.define(\"ace/mode/css/csslint\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\nvar parserlib = {};\n(function(){\nfunction EventTarget(){\n    this._listeners = {};\n}\n\nEventTarget.prototype = {\n    constructor: EventTarget,\n    addListener: function(type, listener){\n        if (!this._listeners[type]){\n            this._listeners[type] = [];\n        }\n\n        this._listeners[type].push(listener);\n    },\n    fire: function(event){\n        if (typeof event == \"string\"){\n            event = { type: event };\n        }\n        if (typeof event.target != \"undefined\"){\n            event.target = this;\n        }\n\n        if (typeof event.type == \"undefined\"){\n            throw new Error(\"Event object missing 'type' property.\");\n        }\n\n        if (this._listeners[event.type]){\n            var listeners = this._listeners[event.type].concat();\n            for (var i=0, len=listeners.length; i < len; i++){\n                listeners[i].call(this, event);\n            }\n        }\n    },\n    removeListener: function(type, listener){\n        if (this._listeners[type]){\n            var listeners = this._listeners[type];\n            for (var i=0, len=listeners.length; i < len; i++){\n                if (listeners[i] === listener){\n                    listeners.splice(i, 1);\n                    break;\n                }\n            }\n\n\n        }\n    }\n};\nfunction StringReader(text){\n    this._input = text.replace(/\\n\\r?/g, \"\\n\");\n    this._line = 1;\n    this._col = 1;\n    this._cursor = 0;\n}\n\nStringReader.prototype = {\n    constructor: StringReader,\n    getCol: function(){\n        return this._col;\n    },\n    getLine: function(){\n        return this._line ;\n    },\n    eof: function(){\n        return (this._cursor == this._input.length);\n    },\n    peek: function(count){\n        var c = null;\n        count = (typeof count == \"undefined\" ? 1 : count);\n        if (this._cursor < this._input.length){\n            c = this._input.charAt(this._cursor + count - 1);\n        }\n\n        return c;\n    },\n    read: function(){\n        var c = null;\n        if (this._cursor < this._input.length){\n            if (this._input.charAt(this._cursor) == \"\\n\"){\n                this._line++;\n                this._col=1;\n            } else {\n                this._col++;\n            }\n            c = this._input.charAt(this._cursor++);\n        }\n\n        return c;\n    },\n    mark: function(){\n        this._bookmark = {\n            cursor: this._cursor,\n            line:   this._line,\n            col:    this._col\n        };\n    },\n\n    reset: function(){\n        if (this._bookmark){\n            this._cursor = this._bookmark.cursor;\n            this._line = this._bookmark.line;\n            this._col = this._bookmark.col;\n            delete this._bookmark;\n        }\n    },\n    readTo: function(pattern){\n\n        var buffer = \"\",\n            c;\n        while (buffer.length < pattern.length || buffer.lastIndexOf(pattern) != buffer.length - pattern.length){\n            c = this.read();\n            if (c){\n                buffer += c;\n            } else {\n                throw new Error(\"Expected \\\"\" + pattern + \"\\\" at line \" + this._line  + \", col \" + this._col + \".\");\n            }\n        }\n\n        return buffer;\n\n    },\n    readWhile: function(filter){\n\n        var buffer = \"\",\n            c = this.read();\n\n        while(c !== null && filter(c)){\n            buffer += c;\n            c = this.read();\n        }\n\n        return buffer;\n\n    },\n    readMatch: function(matcher){\n\n        var source = this._input.substring(this._cursor),\n            value = null;\n        if (typeof matcher == \"string\"){\n            if (source.indexOf(matcher) === 0){\n                value = this.readCount(matcher.length);\n            }\n        } else if (matcher instanceof RegExp){\n            if (matcher.test(source)){\n                value = this.readCount(RegExp.lastMatch.length);\n            }\n        }\n\n        return value;\n    },\n    readCount: function(count){\n        var buffer = \"\";\n\n        while(count--){\n            buffer += this.read();\n        }\n\n        return buffer;\n    }\n\n};\nfunction SyntaxError(message, line, col){\n    this.col = col;\n    this.line = line;\n    this.message = message;\n\n}\nSyntaxError.prototype = new Error();\nfunction SyntaxUnit(text, line, col, type){\n    this.col = col;\n    this.line = line;\n    this.text = text;\n    this.type = type;\n}\nSyntaxUnit.fromToken = function(token){\n    return new SyntaxUnit(token.value, token.startLine, token.startCol);\n};\n\nSyntaxUnit.prototype = {\n    constructor: SyntaxUnit,\n    valueOf: function(){\n        return this.text;\n    },\n    toString: function(){\n        return this.text;\n    }\n\n};\nfunction TokenStreamBase(input, tokenData){\n    this._reader = input ? new StringReader(input.toString()) : null;\n    this._token = null;\n    this._tokenData = tokenData;\n    this._lt = [];\n    this._ltIndex = 0;\n\n    this._ltIndexCache = [];\n}\nTokenStreamBase.createTokenData = function(tokens){\n\n    var nameMap     = [],\n        typeMap     = {},\n        tokenData     = tokens.concat([]),\n        i            = 0,\n        len            = tokenData.length+1;\n\n    tokenData.UNKNOWN = -1;\n    tokenData.unshift({name:\"EOF\"});\n\n    for (; i < len; i++){\n        nameMap.push(tokenData[i].name);\n        tokenData[tokenData[i].name] = i;\n        if (tokenData[i].text){\n            typeMap[tokenData[i].text] = i;\n        }\n    }\n\n    tokenData.name = function(tt){\n        return nameMap[tt];\n    };\n\n    tokenData.type = function(c){\n        return typeMap[c];\n    };\n\n    return tokenData;\n};\n\nTokenStreamBase.prototype = {\n    constructor: TokenStreamBase,\n    match: function(tokenTypes, channel){\n        if (!(tokenTypes instanceof Array)){\n            tokenTypes = [tokenTypes];\n        }\n\n        var tt  = this.get(channel),\n            i   = 0,\n            len = tokenTypes.length;\n\n        while(i < len){\n            if (tt == tokenTypes[i++]){\n                return true;\n            }\n        }\n        this.unget();\n        return false;\n    },\n    mustMatch: function(tokenTypes, channel){\n\n        var token;\n        if (!(tokenTypes instanceof Array)){\n            tokenTypes = [tokenTypes];\n        }\n\n        if (!this.match.apply(this, arguments)){\n            token = this.LT(1);\n            throw new SyntaxError(\"Expected \" + this._tokenData[tokenTypes[0]].name +\n                \" at line \" + token.startLine + \", col \" + token.startCol + \".\", token.startLine, token.startCol);\n        }\n    },\n    advance: function(tokenTypes, channel){\n\n        while(this.LA(0) !== 0 && !this.match(tokenTypes, channel)){\n            this.get();\n        }\n\n        return this.LA(0);\n    },\n    get: function(channel){\n\n        var tokenInfo   = this._tokenData,\n            reader      = this._reader,\n            value,\n            i           =0,\n            len         = tokenInfo.length,\n            found       = false,\n            token,\n            info;\n        if (this._lt.length && this._ltIndex >= 0 && this._ltIndex < this._lt.length){\n\n            i++;\n            this._token = this._lt[this._ltIndex++];\n            info = tokenInfo[this._token.type];\n            while((info.channel !== undefined && channel !== info.channel) &&\n                    this._ltIndex < this._lt.length){\n                this._token = this._lt[this._ltIndex++];\n                info = tokenInfo[this._token.type];\n                i++;\n            }\n            if ((info.channel === undefined || channel === info.channel) &&\n                    this._ltIndex <= this._lt.length){\n                this._ltIndexCache.push(i);\n                return this._token.type;\n            }\n        }\n        token = this._getToken();\n        if (token.type > -1 && !tokenInfo[token.type].hide){\n            token.channel = tokenInfo[token.type].channel;\n            this._token = token;\n            this._lt.push(token);\n            this._ltIndexCache.push(this._lt.length - this._ltIndex + i);\n            if (this._lt.length > 5){\n                this._lt.shift();\n            }\n            if (this._ltIndexCache.length > 5){\n                this._ltIndexCache.shift();\n            }\n            this._ltIndex = this._lt.length;\n        }\n        info = tokenInfo[token.type];\n        if (info &&\n                (info.hide ||\n                (info.channel !== undefined && channel !== info.channel))){\n            return this.get(channel);\n        } else {\n            return token.type;\n        }\n    },\n    LA: function(index){\n        var total = index,\n            tt;\n        if (index > 0){\n            if (index > 5){\n                throw new Error(\"Too much lookahead.\");\n            }\n            while(total){\n                tt = this.get();\n                total--;\n            }\n            while(total < index){\n                this.unget();\n                total++;\n            }\n        } else if (index < 0){\n\n            if(this._lt[this._ltIndex+index]){\n                tt = this._lt[this._ltIndex+index].type;\n            } else {\n                throw new Error(\"Too much lookbehind.\");\n            }\n\n        } else {\n            tt = this._token.type;\n        }\n\n        return tt;\n\n    },\n    LT: function(index){\n        this.LA(index);\n        return this._lt[this._ltIndex+index-1];\n    },\n    peek: function(){\n        return this.LA(1);\n    },\n    token: function(){\n        return this._token;\n    },\n    tokenName: function(tokenType){\n        if (tokenType < 0 || tokenType > this._tokenData.length){\n            return \"UNKNOWN_TOKEN\";\n        } else {\n            return this._tokenData[tokenType].name;\n        }\n    },\n    tokenType: function(tokenName){\n        return this._tokenData[tokenName] || -1;\n    },\n    unget: function(){\n        if (this._ltIndexCache.length){\n            this._ltIndex -= this._ltIndexCache.pop();//--;\n            this._token = this._lt[this._ltIndex - 1];\n        } else {\n            throw new Error(\"Too much lookahead.\");\n        }\n    }\n\n};\n\n\nparserlib.util = {\nStringReader: StringReader,\nSyntaxError : SyntaxError,\nSyntaxUnit  : SyntaxUnit,\nEventTarget : EventTarget,\nTokenStreamBase : TokenStreamBase\n};\n})();\n(function(){\nvar EventTarget = parserlib.util.EventTarget,\nTokenStreamBase = parserlib.util.TokenStreamBase,\nStringReader = parserlib.util.StringReader,\nSyntaxError = parserlib.util.SyntaxError,\nSyntaxUnit  = parserlib.util.SyntaxUnit;\n\nvar Colors = {\n    aliceblue       :\"#f0f8ff\",\n    antiquewhite    :\"#faebd7\",\n    aqua            :\"#00ffff\",\n    aquamarine      :\"#7fffd4\",\n    azure           :\"#f0ffff\",\n    beige           :\"#f5f5dc\",\n    bisque          :\"#ffe4c4\",\n    black           :\"#000000\",\n    blanchedalmond  :\"#ffebcd\",\n    blue            :\"#0000ff\",\n    blueviolet      :\"#8a2be2\",\n    brown           :\"#a52a2a\",\n    burlywood       :\"#deb887\",\n    cadetblue       :\"#5f9ea0\",\n    chartreuse      :\"#7fff00\",\n    chocolate       :\"#d2691e\",\n    coral           :\"#ff7f50\",\n    cornflowerblue  :\"#6495ed\",\n    cornsilk        :\"#fff8dc\",\n    crimson         :\"#dc143c\",\n    cyan            :\"#00ffff\",\n    darkblue        :\"#00008b\",\n    darkcyan        :\"#008b8b\",\n    darkgoldenrod   :\"#b8860b\",\n    darkgray        :\"#a9a9a9\",\n    darkgrey        :\"#a9a9a9\",\n    darkgreen       :\"#006400\",\n    darkkhaki       :\"#bdb76b\",\n    darkmagenta     :\"#8b008b\",\n    darkolivegreen  :\"#556b2f\",\n    darkorange      :\"#ff8c00\",\n    darkorchid      :\"#9932cc\",\n    darkred         :\"#8b0000\",\n    darksalmon      :\"#e9967a\",\n    darkseagreen    :\"#8fbc8f\",\n    darkslateblue   :\"#483d8b\",\n    darkslategray   :\"#2f4f4f\",\n    darkslategrey   :\"#2f4f4f\",\n    darkturquoise   :\"#00ced1\",\n    darkviolet      :\"#9400d3\",\n    deeppink        :\"#ff1493\",\n    deepskyblue     :\"#00bfff\",\n    dimgray         :\"#696969\",\n    dimgrey         :\"#696969\",\n    dodgerblue      :\"#1e90ff\",\n    firebrick       :\"#b22222\",\n    floralwhite     :\"#fffaf0\",\n    forestgreen     :\"#228b22\",\n    fuchsia         :\"#ff00ff\",\n    gainsboro       :\"#dcdcdc\",\n    ghostwhite      :\"#f8f8ff\",\n    gold            :\"#ffd700\",\n    goldenrod       :\"#daa520\",\n    gray            :\"#808080\",\n    grey            :\"#808080\",\n    green           :\"#008000\",\n    greenyellow     :\"#adff2f\",\n    honeydew        :\"#f0fff0\",\n    hotpink         :\"#ff69b4\",\n    indianred       :\"#cd5c5c\",\n    indigo          :\"#4b0082\",\n    ivory           :\"#fffff0\",\n    khaki           :\"#f0e68c\",\n    lavender        :\"#e6e6fa\",\n    lavenderblush   :\"#fff0f5\",\n    lawngreen       :\"#7cfc00\",\n    lemonchiffon    :\"#fffacd\",\n    lightblue       :\"#add8e6\",\n    lightcoral      :\"#f08080\",\n    lightcyan       :\"#e0ffff\",\n    lightgoldenrodyellow  :\"#fafad2\",\n    lightgray       :\"#d3d3d3\",\n    lightgrey       :\"#d3d3d3\",\n    lightgreen      :\"#90ee90\",\n    lightpink       :\"#ffb6c1\",\n    lightsalmon     :\"#ffa07a\",\n    lightseagreen   :\"#20b2aa\",\n    lightskyblue    :\"#87cefa\",\n    lightslategray  :\"#778899\",\n    lightslategrey  :\"#778899\",\n    lightsteelblue  :\"#b0c4de\",\n    lightyellow     :\"#ffffe0\",\n    lime            :\"#00ff00\",\n    limegreen       :\"#32cd32\",\n    linen           :\"#faf0e6\",\n    magenta         :\"#ff00ff\",\n    maroon          :\"#800000\",\n    mediumaquamarine:\"#66cdaa\",\n    mediumblue      :\"#0000cd\",\n    mediumorchid    :\"#ba55d3\",\n    mediumpurple    :\"#9370d8\",\n    mediumseagreen  :\"#3cb371\",\n    mediumslateblue :\"#7b68ee\",\n    mediumspringgreen   :\"#00fa9a\",\n    mediumturquoise :\"#48d1cc\",\n    mediumvioletred :\"#c71585\",\n    midnightblue    :\"#191970\",\n    mintcream       :\"#f5fffa\",\n    mistyrose       :\"#ffe4e1\",\n    moccasin        :\"#ffe4b5\",\n    navajowhite     :\"#ffdead\",\n    navy            :\"#000080\",\n    oldlace         :\"#fdf5e6\",\n    olive           :\"#808000\",\n    olivedrab       :\"#6b8e23\",\n    orange          :\"#ffa500\",\n    orangered       :\"#ff4500\",\n    orchid          :\"#da70d6\",\n    palegoldenrod   :\"#eee8aa\",\n    palegreen       :\"#98fb98\",\n    paleturquoise   :\"#afeeee\",\n    palevioletred   :\"#d87093\",\n    papayawhip      :\"#ffefd5\",\n    peachpuff       :\"#ffdab9\",\n    peru            :\"#cd853f\",\n    pink            :\"#ffc0cb\",\n    plum            :\"#dda0dd\",\n    powderblue      :\"#b0e0e6\",\n    purple          :\"#800080\",\n    red             :\"#ff0000\",\n    rosybrown       :\"#bc8f8f\",\n    royalblue       :\"#4169e1\",\n    saddlebrown     :\"#8b4513\",\n    salmon          :\"#fa8072\",\n    sandybrown      :\"#f4a460\",\n    seagreen        :\"#2e8b57\",\n    seashell        :\"#fff5ee\",\n    sienna          :\"#a0522d\",\n    silver          :\"#c0c0c0\",\n    skyblue         :\"#87ceeb\",\n    slateblue       :\"#6a5acd\",\n    slategray       :\"#708090\",\n    slategrey       :\"#708090\",\n    snow            :\"#fffafa\",\n    springgreen     :\"#00ff7f\",\n    steelblue       :\"#4682b4\",\n    tan             :\"#d2b48c\",\n    teal            :\"#008080\",\n    thistle         :\"#d8bfd8\",\n    tomato          :\"#ff6347\",\n    turquoise       :\"#40e0d0\",\n    violet          :\"#ee82ee\",\n    wheat           :\"#f5deb3\",\n    white           :\"#ffffff\",\n    whitesmoke      :\"#f5f5f5\",\n    yellow          :\"#ffff00\",\n    yellowgreen     :\"#9acd32\",\n    activeBorder        :\"Active window border.\",\n    activecaption       :\"Active window caption.\",\n    appworkspace        :\"Background color of multiple document interface.\",\n    background          :\"Desktop background.\",\n    buttonface          :\"The face background color for 3-D elements that appear 3-D due to one layer of surrounding border.\",\n    buttonhighlight     :\"The color of the border facing the light source for 3-D elements that appear 3-D due to one layer of surrounding border.\",\n    buttonshadow        :\"The color of the border away from the light source for 3-D elements that appear 3-D due to one layer of surrounding border.\",\n    buttontext          :\"Text on push buttons.\",\n    captiontext         :\"Text in caption, size box, and scrollbar arrow box.\",\n    graytext            :\"Grayed (disabled) text. This color is set to #000 if the current display driver does not support a solid gray color.\",\n    greytext            :\"Greyed (disabled) text. This color is set to #000 if the current display driver does not support a solid grey color.\",\n    highlight           :\"Item(s) selected in a control.\",\n    highlighttext       :\"Text of item(s) selected in a control.\",\n    inactiveborder      :\"Inactive window border.\",\n    inactivecaption     :\"Inactive window caption.\",\n    inactivecaptiontext :\"Color of text in an inactive caption.\",\n    infobackground      :\"Background color for tooltip controls.\",\n    infotext            :\"Text color for tooltip controls.\",\n    menu                :\"Menu background.\",\n    menutext            :\"Text in menus.\",\n    scrollbar           :\"Scroll bar gray area.\",\n    threeddarkshadow    :\"The color of the darker (generally outer) of the two borders away from the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.\",\n    threedface          :\"The face background color for 3-D elements that appear 3-D due to two concentric layers of surrounding border.\",\n    threedhighlight     :\"The color of the lighter (generally outer) of the two borders facing the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.\",\n    threedlightshadow   :\"The color of the darker (generally inner) of the two borders facing the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.\",\n    threedshadow        :\"The color of the lighter (generally inner) of the two borders away from the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.\",\n    window              :\"Window background.\",\n    windowframe         :\"Window frame.\",\n    windowtext          :\"Text in windows.\"\n};\nfunction Combinator(text, line, col){\n\n    SyntaxUnit.call(this, text, line, col, Parser.COMBINATOR_TYPE);\n    this.type = \"unknown\";\n    if (/^\\s+$/.test(text)){\n        this.type = \"descendant\";\n    } else if (text == \">\"){\n        this.type = \"child\";\n    } else if (text == \"+\"){\n        this.type = \"adjacent-sibling\";\n    } else if (text == \"~\"){\n        this.type = \"sibling\";\n    }\n\n}\n\nCombinator.prototype = new SyntaxUnit();\nCombinator.prototype.constructor = Combinator;\nfunction MediaFeature(name, value){\n\n    SyntaxUnit.call(this, \"(\" + name + (value !== null ? \":\" + value : \"\") + \")\", name.startLine, name.startCol, Parser.MEDIA_FEATURE_TYPE);\n    this.name = name;\n    this.value = value;\n}\n\nMediaFeature.prototype = new SyntaxUnit();\nMediaFeature.prototype.constructor = MediaFeature;\nfunction MediaQuery(modifier, mediaType, features, line, col){\n\n    SyntaxUnit.call(this, (modifier ? modifier + \" \": \"\") + (mediaType ? mediaType : \"\") + (mediaType && features.length > 0 ? \" and \" : \"\") + features.join(\" and \"), line, col, Parser.MEDIA_QUERY_TYPE);\n    this.modifier = modifier;\n    this.mediaType = mediaType;\n    this.features = features;\n\n}\n\nMediaQuery.prototype = new SyntaxUnit();\nMediaQuery.prototype.constructor = MediaQuery;\nfunction Parser(options){\n    EventTarget.call(this);\n\n\n    this.options = options || {};\n\n    this._tokenStream = null;\n}\nParser.DEFAULT_TYPE = 0;\nParser.COMBINATOR_TYPE = 1;\nParser.MEDIA_FEATURE_TYPE = 2;\nParser.MEDIA_QUERY_TYPE = 3;\nParser.PROPERTY_NAME_TYPE = 4;\nParser.PROPERTY_VALUE_TYPE = 5;\nParser.PROPERTY_VALUE_PART_TYPE = 6;\nParser.SELECTOR_TYPE = 7;\nParser.SELECTOR_PART_TYPE = 8;\nParser.SELECTOR_SUB_PART_TYPE = 9;\n\nParser.prototype = function(){\n\n    var proto = new EventTarget(),  //new prototype\n        prop,\n        additions =  {\n            constructor: Parser,\n            DEFAULT_TYPE : 0,\n            COMBINATOR_TYPE : 1,\n            MEDIA_FEATURE_TYPE : 2,\n            MEDIA_QUERY_TYPE : 3,\n            PROPERTY_NAME_TYPE : 4,\n            PROPERTY_VALUE_TYPE : 5,\n            PROPERTY_VALUE_PART_TYPE : 6,\n            SELECTOR_TYPE : 7,\n            SELECTOR_PART_TYPE : 8,\n            SELECTOR_SUB_PART_TYPE : 9,\n\n            _stylesheet: function(){\n\n                var tokenStream = this._tokenStream,\n                    charset     = null,\n                    count,\n                    token,\n                    tt;\n\n                this.fire(\"startstylesheet\");\n                this._charset();\n\n                this._skipCruft();\n                while (tokenStream.peek() == Tokens.IMPORT_SYM){\n                    this._import();\n                    this._skipCruft();\n                }\n                while (tokenStream.peek() == Tokens.NAMESPACE_SYM){\n                    this._namespace();\n                    this._skipCruft();\n                }\n                tt = tokenStream.peek();\n                while(tt > Tokens.EOF){\n\n                    try {\n\n                        switch(tt){\n                            case Tokens.MEDIA_SYM:\n                                this._media();\n                                this._skipCruft();\n                                break;\n                            case Tokens.PAGE_SYM:\n                                this._page();\n                                this._skipCruft();\n                                break;\n                            case Tokens.FONT_FACE_SYM:\n                                this._font_face();\n                                this._skipCruft();\n                                break;\n                            case Tokens.KEYFRAMES_SYM:\n                                this._keyframes();\n                                this._skipCruft();\n                                break;\n                            case Tokens.VIEWPORT_SYM:\n                                this._viewport();\n                                this._skipCruft();\n                                break;\n                            case Tokens.UNKNOWN_SYM:  //unknown @ rule\n                                tokenStream.get();\n                                if (!this.options.strict){\n                                    this.fire({\n                                        type:       \"error\",\n                                        error:      null,\n                                        message:    \"Unknown @ rule: \" + tokenStream.LT(0).value + \".\",\n                                        line:       tokenStream.LT(0).startLine,\n                                        col:        tokenStream.LT(0).startCol\n                                    });\n                                    count=0;\n                                    while (tokenStream.advance([Tokens.LBRACE, Tokens.RBRACE]) == Tokens.LBRACE){\n                                        count++;    //keep track of nesting depth\n                                    }\n\n                                    while(count){\n                                        tokenStream.advance([Tokens.RBRACE]);\n                                        count--;\n                                    }\n\n                                } else {\n                                    throw new SyntaxError(\"Unknown @ rule.\", tokenStream.LT(0).startLine, tokenStream.LT(0).startCol);\n                                }\n                                break;\n                            case Tokens.S:\n                                this._readWhitespace();\n                                break;\n                            default:\n                                if(!this._ruleset()){\n                                    switch(tt){\n                                        case Tokens.CHARSET_SYM:\n                                            token = tokenStream.LT(1);\n                                            this._charset(false);\n                                            throw new SyntaxError(\"@charset not allowed here.\", token.startLine, token.startCol);\n                                        case Tokens.IMPORT_SYM:\n                                            token = tokenStream.LT(1);\n                                            this._import(false);\n                                            throw new SyntaxError(\"@import not allowed here.\", token.startLine, token.startCol);\n                                        case Tokens.NAMESPACE_SYM:\n                                            token = tokenStream.LT(1);\n                                            this._namespace(false);\n                                            throw new SyntaxError(\"@namespace not allowed here.\", token.startLine, token.startCol);\n                                        default:\n                                            tokenStream.get();  //get the last token\n                                            this._unexpectedToken(tokenStream.token());\n                                    }\n\n                                }\n                        }\n                    } catch(ex) {\n                        if (ex instanceof SyntaxError && !this.options.strict){\n                            this.fire({\n                                type:       \"error\",\n                                error:      ex,\n                                message:    ex.message,\n                                line:       ex.line,\n                                col:        ex.col\n                            });\n                        } else {\n                            throw ex;\n                        }\n                    }\n\n                    tt = tokenStream.peek();\n                }\n\n                if (tt != Tokens.EOF){\n                    this._unexpectedToken(tokenStream.token());\n                }\n\n                this.fire(\"endstylesheet\");\n            },\n\n            _charset: function(emit){\n                var tokenStream = this._tokenStream,\n                    charset,\n                    token,\n                    line,\n                    col;\n\n                if (tokenStream.match(Tokens.CHARSET_SYM)){\n                    line = tokenStream.token().startLine;\n                    col = tokenStream.token().startCol;\n\n                    this._readWhitespace();\n                    tokenStream.mustMatch(Tokens.STRING);\n\n                    token = tokenStream.token();\n                    charset = token.value;\n\n                    this._readWhitespace();\n                    tokenStream.mustMatch(Tokens.SEMICOLON);\n\n                    if (emit !== false){\n                        this.fire({\n                            type:   \"charset\",\n                            charset:charset,\n                            line:   line,\n                            col:    col\n                        });\n                    }\n                }\n            },\n\n            _import: function(emit){\n\n                var tokenStream = this._tokenStream,\n                    tt,\n                    uri,\n                    importToken,\n                    mediaList   = [];\n                tokenStream.mustMatch(Tokens.IMPORT_SYM);\n                importToken = tokenStream.token();\n                this._readWhitespace();\n\n                tokenStream.mustMatch([Tokens.STRING, Tokens.URI]);\n                uri = tokenStream.token().value.replace(/^(?:url\\()?[\"']?([^\"']+?)[\"']?\\)?$/, \"$1\");\n\n                this._readWhitespace();\n\n                mediaList = this._media_query_list();\n                tokenStream.mustMatch(Tokens.SEMICOLON);\n                this._readWhitespace();\n\n                if (emit !== false){\n                    this.fire({\n                        type:   \"import\",\n                        uri:    uri,\n                        media:  mediaList,\n                        line:   importToken.startLine,\n                        col:    importToken.startCol\n                    });\n                }\n\n            },\n\n            _namespace: function(emit){\n\n                var tokenStream = this._tokenStream,\n                    line,\n                    col,\n                    prefix,\n                    uri;\n                tokenStream.mustMatch(Tokens.NAMESPACE_SYM);\n                line = tokenStream.token().startLine;\n                col = tokenStream.token().startCol;\n                this._readWhitespace();\n                if (tokenStream.match(Tokens.IDENT)){\n                    prefix = tokenStream.token().value;\n                    this._readWhitespace();\n                }\n\n                tokenStream.mustMatch([Tokens.STRING, Tokens.URI]);\n                uri = tokenStream.token().value.replace(/(?:url\\()?[\"']([^\"']+)[\"']\\)?/, \"$1\");\n\n                this._readWhitespace();\n                tokenStream.mustMatch(Tokens.SEMICOLON);\n                this._readWhitespace();\n\n                if (emit !== false){\n                    this.fire({\n                        type:   \"namespace\",\n                        prefix: prefix,\n                        uri:    uri,\n                        line:   line,\n                        col:    col\n                    });\n                }\n\n            },\n\n            _media: function(){\n                var tokenStream     = this._tokenStream,\n                    line,\n                    col,\n                    mediaList;//       = [];\n                tokenStream.mustMatch(Tokens.MEDIA_SYM);\n                line = tokenStream.token().startLine;\n                col = tokenStream.token().startCol;\n\n                this._readWhitespace();\n\n                mediaList = this._media_query_list();\n\n                tokenStream.mustMatch(Tokens.LBRACE);\n                this._readWhitespace();\n\n                this.fire({\n                    type:   \"startmedia\",\n                    media:  mediaList,\n                    line:   line,\n                    col:    col\n                });\n\n                while(true) {\n                    if (tokenStream.peek() == Tokens.PAGE_SYM){\n                        this._page();\n                    } else if (tokenStream.peek() == Tokens.FONT_FACE_SYM){\n                        this._font_face();\n                    } else if (tokenStream.peek() == Tokens.VIEWPORT_SYM){\n                        this._viewport();\n                    } else if (!this._ruleset()){\n                        break;\n                    }\n                }\n\n                tokenStream.mustMatch(Tokens.RBRACE);\n                this._readWhitespace();\n\n                this.fire({\n                    type:   \"endmedia\",\n                    media:  mediaList,\n                    line:   line,\n                    col:    col\n                });\n            },\n            _media_query_list: function(){\n                var tokenStream = this._tokenStream,\n                    mediaList   = [];\n\n\n                this._readWhitespace();\n\n                if (tokenStream.peek() == Tokens.IDENT || tokenStream.peek() == Tokens.LPAREN){\n                    mediaList.push(this._media_query());\n                }\n\n                while(tokenStream.match(Tokens.COMMA)){\n                    this._readWhitespace();\n                    mediaList.push(this._media_query());\n                }\n\n                return mediaList;\n            },\n            _media_query: function(){\n                var tokenStream = this._tokenStream,\n                    type        = null,\n                    ident       = null,\n                    token       = null,\n                    expressions = [];\n\n                if (tokenStream.match(Tokens.IDENT)){\n                    ident = tokenStream.token().value.toLowerCase();\n                    if (ident != \"only\" && ident != \"not\"){\n                        tokenStream.unget();\n                        ident = null;\n                    } else {\n                        token = tokenStream.token();\n                    }\n                }\n\n                this._readWhitespace();\n\n                if (tokenStream.peek() == Tokens.IDENT){\n                    type = this._media_type();\n                    if (token === null){\n                        token = tokenStream.token();\n                    }\n                } else if (tokenStream.peek() == Tokens.LPAREN){\n                    if (token === null){\n                        token = tokenStream.LT(1);\n                    }\n                    expressions.push(this._media_expression());\n                }\n\n                if (type === null && expressions.length === 0){\n                    return null;\n                } else {\n                    this._readWhitespace();\n                    while (tokenStream.match(Tokens.IDENT)){\n                        if (tokenStream.token().value.toLowerCase() != \"and\"){\n                            this._unexpectedToken(tokenStream.token());\n                        }\n\n                        this._readWhitespace();\n                        expressions.push(this._media_expression());\n                    }\n                }\n\n                return new MediaQuery(ident, type, expressions, token.startLine, token.startCol);\n            },\n            _media_type: function(){\n                return this._media_feature();\n            },\n            _media_expression: function(){\n                var tokenStream = this._tokenStream,\n                    feature     = null,\n                    token,\n                    expression  = null;\n\n                tokenStream.mustMatch(Tokens.LPAREN);\n\n                feature = this._media_feature();\n                this._readWhitespace();\n\n                if (tokenStream.match(Tokens.COLON)){\n                    this._readWhitespace();\n                    token = tokenStream.LT(1);\n                    expression = this._expression();\n                }\n\n                tokenStream.mustMatch(Tokens.RPAREN);\n                this._readWhitespace();\n\n                return new MediaFeature(feature, (expression ? new SyntaxUnit(expression, token.startLine, token.startCol) : null));\n            },\n            _media_feature: function(){\n                var tokenStream = this._tokenStream;\n\n                tokenStream.mustMatch(Tokens.IDENT);\n\n                return SyntaxUnit.fromToken(tokenStream.token());\n            },\n            _page: function(){\n                var tokenStream = this._tokenStream,\n                    line,\n                    col,\n                    identifier  = null,\n                    pseudoPage  = null;\n                tokenStream.mustMatch(Tokens.PAGE_SYM);\n                line = tokenStream.token().startLine;\n                col = tokenStream.token().startCol;\n\n                this._readWhitespace();\n\n                if (tokenStream.match(Tokens.IDENT)){\n                    identifier = tokenStream.token().value;\n                    if (identifier.toLowerCase() === \"auto\"){\n                        this._unexpectedToken(tokenStream.token());\n                    }\n                }\n                if (tokenStream.peek() == Tokens.COLON){\n                    pseudoPage = this._pseudo_page();\n                }\n\n                this._readWhitespace();\n\n                this.fire({\n                    type:   \"startpage\",\n                    id:     identifier,\n                    pseudo: pseudoPage,\n                    line:   line,\n                    col:    col\n                });\n\n                this._readDeclarations(true, true);\n\n                this.fire({\n                    type:   \"endpage\",\n                    id:     identifier,\n                    pseudo: pseudoPage,\n                    line:   line,\n                    col:    col\n                });\n\n            },\n            _margin: function(){\n                var tokenStream = this._tokenStream,\n                    line,\n                    col,\n                    marginSym   = this._margin_sym();\n\n                if (marginSym){\n                    line = tokenStream.token().startLine;\n                    col = tokenStream.token().startCol;\n\n                    this.fire({\n                        type: \"startpagemargin\",\n                        margin: marginSym,\n                        line:   line,\n                        col:    col\n                    });\n\n                    this._readDeclarations(true);\n\n                    this.fire({\n                        type: \"endpagemargin\",\n                        margin: marginSym,\n                        line:   line,\n                        col:    col\n                    });\n                    return true;\n                } else {\n                    return false;\n                }\n            },\n            _margin_sym: function(){\n\n                var tokenStream = this._tokenStream;\n\n                if(tokenStream.match([Tokens.TOPLEFTCORNER_SYM, Tokens.TOPLEFT_SYM,\n                        Tokens.TOPCENTER_SYM, Tokens.TOPRIGHT_SYM, Tokens.TOPRIGHTCORNER_SYM,\n                        Tokens.BOTTOMLEFTCORNER_SYM, Tokens.BOTTOMLEFT_SYM,\n                        Tokens.BOTTOMCENTER_SYM, Tokens.BOTTOMRIGHT_SYM,\n                        Tokens.BOTTOMRIGHTCORNER_SYM, Tokens.LEFTTOP_SYM,\n                        Tokens.LEFTMIDDLE_SYM, Tokens.LEFTBOTTOM_SYM, Tokens.RIGHTTOP_SYM,\n                        Tokens.RIGHTMIDDLE_SYM, Tokens.RIGHTBOTTOM_SYM]))\n                {\n                    return SyntaxUnit.fromToken(tokenStream.token());\n                } else {\n                    return null;\n                }\n\n            },\n\n            _pseudo_page: function(){\n\n                var tokenStream = this._tokenStream;\n\n                tokenStream.mustMatch(Tokens.COLON);\n                tokenStream.mustMatch(Tokens.IDENT);\n\n                return tokenStream.token().value;\n            },\n\n            _font_face: function(){\n                var tokenStream = this._tokenStream,\n                    line,\n                    col;\n                tokenStream.mustMatch(Tokens.FONT_FACE_SYM);\n                line = tokenStream.token().startLine;\n                col = tokenStream.token().startCol;\n\n                this._readWhitespace();\n\n                this.fire({\n                    type:   \"startfontface\",\n                    line:   line,\n                    col:    col\n                });\n\n                this._readDeclarations(true);\n\n                this.fire({\n                    type:   \"endfontface\",\n                    line:   line,\n                    col:    col\n                });\n            },\n\n            _viewport: function(){\n                 var tokenStream = this._tokenStream,\n                    line,\n                    col;\n\n                    tokenStream.mustMatch(Tokens.VIEWPORT_SYM);\n                    line = tokenStream.token().startLine;\n                    col = tokenStream.token().startCol;\n\n                    this._readWhitespace();\n\n                    this.fire({\n                        type:   \"startviewport\",\n                        line:   line,\n                        col:    col\n                    });\n\n                    this._readDeclarations(true);\n\n                    this.fire({\n                        type:   \"endviewport\",\n                        line:   line,\n                        col:    col\n                    });\n\n            },\n\n            _operator: function(inFunction){\n\n                var tokenStream = this._tokenStream,\n                    token       = null;\n\n                if (tokenStream.match([Tokens.SLASH, Tokens.COMMA]) ||\n                    (inFunction && tokenStream.match([Tokens.PLUS, Tokens.STAR, Tokens.MINUS]))){\n                    token =  tokenStream.token();\n                    this._readWhitespace();\n                }\n                return token ? PropertyValuePart.fromToken(token) : null;\n\n            },\n\n            _combinator: function(){\n\n                var tokenStream = this._tokenStream,\n                    value       = null,\n                    token;\n\n                if(tokenStream.match([Tokens.PLUS, Tokens.GREATER, Tokens.TILDE])){\n                    token = tokenStream.token();\n                    value = new Combinator(token.value, token.startLine, token.startCol);\n                    this._readWhitespace();\n                }\n\n                return value;\n            },\n\n            _unary_operator: function(){\n\n                var tokenStream = this._tokenStream;\n\n                if (tokenStream.match([Tokens.MINUS, Tokens.PLUS])){\n                    return tokenStream.token().value;\n                } else {\n                    return null;\n                }\n            },\n\n            _property: function(){\n\n                var tokenStream = this._tokenStream,\n                    value       = null,\n                    hack        = null,\n                    tokenValue,\n                    token,\n                    line,\n                    col;\n                if (tokenStream.peek() == Tokens.STAR && this.options.starHack){\n                    tokenStream.get();\n                    token = tokenStream.token();\n                    hack = token.value;\n                    line = token.startLine;\n                    col = token.startCol;\n                }\n\n                if(tokenStream.match(Tokens.IDENT)){\n                    token = tokenStream.token();\n                    tokenValue = token.value;\n                    if (tokenValue.charAt(0) == \"_\" && this.options.underscoreHack){\n                        hack = \"_\";\n                        tokenValue = tokenValue.substring(1);\n                    }\n\n                    value = new PropertyName(tokenValue, hack, (line||token.startLine), (col||token.startCol));\n                    this._readWhitespace();\n                }\n\n                return value;\n            },\n            _ruleset: function(){\n\n                var tokenStream = this._tokenStream,\n                    tt,\n                    selectors;\n                try {\n                    selectors = this._selectors_group();\n                } catch (ex){\n                    if (ex instanceof SyntaxError && !this.options.strict){\n                        this.fire({\n                            type:       \"error\",\n                            error:      ex,\n                            message:    ex.message,\n                            line:       ex.line,\n                            col:        ex.col\n                        });\n                        tt = tokenStream.advance([Tokens.RBRACE]);\n                        if (tt == Tokens.RBRACE){\n                        } else {\n                            throw ex;\n                        }\n\n                    } else {\n                        throw ex;\n                    }\n                    return true;\n                }\n                if (selectors){\n\n                    this.fire({\n                        type:       \"startrule\",\n                        selectors:  selectors,\n                        line:       selectors[0].line,\n                        col:        selectors[0].col\n                    });\n\n                    this._readDeclarations(true);\n\n                    this.fire({\n                        type:       \"endrule\",\n                        selectors:  selectors,\n                        line:       selectors[0].line,\n                        col:        selectors[0].col\n                    });\n\n                }\n\n                return selectors;\n\n            },\n            _selectors_group: function(){\n                var tokenStream = this._tokenStream,\n                    selectors   = [],\n                    selector;\n\n                selector = this._selector();\n                if (selector !== null){\n\n                    selectors.push(selector);\n                    while(tokenStream.match(Tokens.COMMA)){\n                        this._readWhitespace();\n                        selector = this._selector();\n                        if (selector !== null){\n                            selectors.push(selector);\n                        } else {\n                            this._unexpectedToken(tokenStream.LT(1));\n                        }\n                    }\n                }\n\n                return selectors.length ? selectors : null;\n            },\n            _selector: function(){\n\n                var tokenStream = this._tokenStream,\n                    selector    = [],\n                    nextSelector = null,\n                    combinator  = null,\n                    ws          = null;\n                nextSelector = this._simple_selector_sequence();\n                if (nextSelector === null){\n                    return null;\n                }\n\n                selector.push(nextSelector);\n\n                do {\n                    combinator = this._combinator();\n\n                    if (combinator !== null){\n                        selector.push(combinator);\n                        nextSelector = this._simple_selector_sequence();\n                        if (nextSelector === null){\n                            this._unexpectedToken(tokenStream.LT(1));\n                        } else {\n                            selector.push(nextSelector);\n                        }\n                    } else {\n                        if (this._readWhitespace()){\n                            ws = new Combinator(tokenStream.token().value, tokenStream.token().startLine, tokenStream.token().startCol);\n                            combinator = this._combinator();\n                            nextSelector = this._simple_selector_sequence();\n                            if (nextSelector === null){\n                                if (combinator !== null){\n                                    this._unexpectedToken(tokenStream.LT(1));\n                                }\n                            } else {\n\n                                if (combinator !== null){\n                                    selector.push(combinator);\n                                } else {\n                                    selector.push(ws);\n                                }\n\n                                selector.push(nextSelector);\n                            }\n                        } else {\n                            break;\n                        }\n\n                    }\n                } while(true);\n\n                return new Selector(selector, selector[0].line, selector[0].col);\n            },\n            _simple_selector_sequence: function(){\n\n                var tokenStream = this._tokenStream,\n                    elementName = null,\n                    modifiers   = [],\n                    selectorText= \"\",\n                    components  = [\n                        function(){\n                            return tokenStream.match(Tokens.HASH) ?\n                                    new SelectorSubPart(tokenStream.token().value, \"id\", tokenStream.token().startLine, tokenStream.token().startCol) :\n                                    null;\n                        },\n                        this._class,\n                        this._attrib,\n                        this._pseudo,\n                        this._negation\n                    ],\n                    i           = 0,\n                    len         = components.length,\n                    component   = null,\n                    found       = false,\n                    line,\n                    col;\n                line = tokenStream.LT(1).startLine;\n                col = tokenStream.LT(1).startCol;\n\n                elementName = this._type_selector();\n                if (!elementName){\n                    elementName = this._universal();\n                }\n\n                if (elementName !== null){\n                    selectorText += elementName;\n                }\n\n                while(true){\n                    if (tokenStream.peek() === Tokens.S){\n                        break;\n                    }\n                    while(i < len && component === null){\n                        component = components[i++].call(this);\n                    }\n\n                    if (component === null){\n                        if (selectorText === \"\"){\n                            return null;\n                        } else {\n                            break;\n                        }\n                    } else {\n                        i = 0;\n                        modifiers.push(component);\n                        selectorText += component.toString();\n                        component = null;\n                    }\n                }\n\n\n                return selectorText !== \"\" ?\n                        new SelectorPart(elementName, modifiers, selectorText, line, col) :\n                        null;\n            },\n            _type_selector: function(){\n\n                var tokenStream = this._tokenStream,\n                    ns          = this._namespace_prefix(),\n                    elementName = this._element_name();\n\n                if (!elementName){\n                    if (ns){\n                        tokenStream.unget();\n                        if (ns.length > 1){\n                            tokenStream.unget();\n                        }\n                    }\n\n                    return null;\n                } else {\n                    if (ns){\n                        elementName.text = ns + elementName.text;\n                        elementName.col -= ns.length;\n                    }\n                    return elementName;\n                }\n            },\n            _class: function(){\n\n                var tokenStream = this._tokenStream,\n                    token;\n\n                if (tokenStream.match(Tokens.DOT)){\n                    tokenStream.mustMatch(Tokens.IDENT);\n                    token = tokenStream.token();\n                    return new SelectorSubPart(\".\" + token.value, \"class\", token.startLine, token.startCol - 1);\n                } else {\n                    return null;\n                }\n\n            },\n            _element_name: function(){\n\n                var tokenStream = this._tokenStream,\n                    token;\n\n                if (tokenStream.match(Tokens.IDENT)){\n                    token = tokenStream.token();\n                    return new SelectorSubPart(token.value, \"elementName\", token.startLine, token.startCol);\n\n                } else {\n                    return null;\n                }\n            },\n            _namespace_prefix: function(){\n                var tokenStream = this._tokenStream,\n                    value       = \"\";\n                if (tokenStream.LA(1) === Tokens.PIPE || tokenStream.LA(2) === Tokens.PIPE){\n\n                    if(tokenStream.match([Tokens.IDENT, Tokens.STAR])){\n                        value += tokenStream.token().value;\n                    }\n\n                    tokenStream.mustMatch(Tokens.PIPE);\n                    value += \"|\";\n\n                }\n\n                return value.length ? value : null;\n            },\n            _universal: function(){\n                var tokenStream = this._tokenStream,\n                    value       = \"\",\n                    ns;\n\n                ns = this._namespace_prefix();\n                if(ns){\n                    value += ns;\n                }\n\n                if(tokenStream.match(Tokens.STAR)){\n                    value += \"*\";\n                }\n\n                return value.length ? value : null;\n\n           },\n            _attrib: function(){\n\n                var tokenStream = this._tokenStream,\n                    value       = null,\n                    ns,\n                    token;\n\n                if (tokenStream.match(Tokens.LBRACKET)){\n                    token = tokenStream.token();\n                    value = token.value;\n                    value += this._readWhitespace();\n\n                    ns = this._namespace_prefix();\n\n                    if (ns){\n                        value += ns;\n                    }\n\n                    tokenStream.mustMatch(Tokens.IDENT);\n                    value += tokenStream.token().value;\n                    value += this._readWhitespace();\n\n                    if(tokenStream.match([Tokens.PREFIXMATCH, Tokens.SUFFIXMATCH, Tokens.SUBSTRINGMATCH,\n                            Tokens.EQUALS, Tokens.INCLUDES, Tokens.DASHMATCH])){\n\n                        value += tokenStream.token().value;\n                        value += this._readWhitespace();\n\n                        tokenStream.mustMatch([Tokens.IDENT, Tokens.STRING]);\n                        value += tokenStream.token().value;\n                        value += this._readWhitespace();\n                    }\n\n                    tokenStream.mustMatch(Tokens.RBRACKET);\n\n                    return new SelectorSubPart(value + \"]\", \"attribute\", token.startLine, token.startCol);\n                } else {\n                    return null;\n                }\n            },\n            _pseudo: function(){\n\n                var tokenStream = this._tokenStream,\n                    pseudo      = null,\n                    colons      = \":\",\n                    line,\n                    col;\n\n                if (tokenStream.match(Tokens.COLON)){\n\n                    if (tokenStream.match(Tokens.COLON)){\n                        colons += \":\";\n                    }\n\n                    if (tokenStream.match(Tokens.IDENT)){\n                        pseudo = tokenStream.token().value;\n                        line = tokenStream.token().startLine;\n                        col = tokenStream.token().startCol - colons.length;\n                    } else if (tokenStream.peek() == Tokens.FUNCTION){\n                        line = tokenStream.LT(1).startLine;\n                        col = tokenStream.LT(1).startCol - colons.length;\n                        pseudo = this._functional_pseudo();\n                    }\n\n                    if (pseudo){\n                        pseudo = new SelectorSubPart(colons + pseudo, \"pseudo\", line, col);\n                    }\n                }\n\n                return pseudo;\n            },\n            _functional_pseudo: function(){\n\n                var tokenStream = this._tokenStream,\n                    value = null;\n\n                if(tokenStream.match(Tokens.FUNCTION)){\n                    value = tokenStream.token().value;\n                    value += this._readWhitespace();\n                    value += this._expression();\n                    tokenStream.mustMatch(Tokens.RPAREN);\n                    value += \")\";\n                }\n\n                return value;\n            },\n            _expression: function(){\n\n                var tokenStream = this._tokenStream,\n                    value       = \"\";\n\n                while(tokenStream.match([Tokens.PLUS, Tokens.MINUS, Tokens.DIMENSION,\n                        Tokens.NUMBER, Tokens.STRING, Tokens.IDENT, Tokens.LENGTH,\n                        Tokens.FREQ, Tokens.ANGLE, Tokens.TIME,\n                        Tokens.RESOLUTION, Tokens.SLASH])){\n\n                    value += tokenStream.token().value;\n                    value += this._readWhitespace();\n                }\n\n                return value.length ? value : null;\n\n            },\n            _negation: function(){\n\n                var tokenStream = this._tokenStream,\n                    line,\n                    col,\n                    value       = \"\",\n                    arg,\n                    subpart     = null;\n\n                if (tokenStream.match(Tokens.NOT)){\n                    value = tokenStream.token().value;\n                    line = tokenStream.token().startLine;\n                    col = tokenStream.token().startCol;\n                    value += this._readWhitespace();\n                    arg = this._negation_arg();\n                    value += arg;\n                    value += this._readWhitespace();\n                    tokenStream.match(Tokens.RPAREN);\n                    value += tokenStream.token().value;\n\n                    subpart = new SelectorSubPart(value, \"not\", line, col);\n                    subpart.args.push(arg);\n                }\n\n                return subpart;\n            },\n            _negation_arg: function(){\n\n                var tokenStream = this._tokenStream,\n                    args        = [\n                        this._type_selector,\n                        this._universal,\n                        function(){\n                            return tokenStream.match(Tokens.HASH) ?\n                                    new SelectorSubPart(tokenStream.token().value, \"id\", tokenStream.token().startLine, tokenStream.token().startCol) :\n                                    null;\n                        },\n                        this._class,\n                        this._attrib,\n                        this._pseudo\n                    ],\n                    arg         = null,\n                    i           = 0,\n                    len         = args.length,\n                    elementName,\n                    line,\n                    col,\n                    part;\n\n                line = tokenStream.LT(1).startLine;\n                col = tokenStream.LT(1).startCol;\n\n                while(i < len && arg === null){\n\n                    arg = args[i].call(this);\n                    i++;\n                }\n                if (arg === null){\n                    this._unexpectedToken(tokenStream.LT(1));\n                }\n                if (arg.type == \"elementName\"){\n                    part = new SelectorPart(arg, [], arg.toString(), line, col);\n                } else {\n                    part = new SelectorPart(null, [arg], arg.toString(), line, col);\n                }\n\n                return part;\n            },\n\n            _declaration: function(){\n\n                var tokenStream = this._tokenStream,\n                    property    = null,\n                    expr        = null,\n                    prio        = null,\n                    error       = null,\n                    invalid     = null,\n                    propertyName= \"\";\n\n                property = this._property();\n                if (property !== null){\n\n                    tokenStream.mustMatch(Tokens.COLON);\n                    this._readWhitespace();\n\n                    expr = this._expr();\n                    if (!expr || expr.length === 0){\n                        this._unexpectedToken(tokenStream.LT(1));\n                    }\n\n                    prio = this._prio();\n                    propertyName = property.toString();\n                    if (this.options.starHack && property.hack == \"*\" ||\n                            this.options.underscoreHack && property.hack == \"_\") {\n\n                        propertyName = property.text;\n                    }\n\n                    try {\n                        this._validateProperty(propertyName, expr);\n                    } catch (ex) {\n                        invalid = ex;\n                    }\n\n                    this.fire({\n                        type:       \"property\",\n                        property:   property,\n                        value:      expr,\n                        important:  prio,\n                        line:       property.line,\n                        col:        property.col,\n                        invalid:    invalid\n                    });\n\n                    return true;\n                } else {\n                    return false;\n                }\n            },\n\n            _prio: function(){\n\n                var tokenStream = this._tokenStream,\n                    result      = tokenStream.match(Tokens.IMPORTANT_SYM);\n\n                this._readWhitespace();\n                return result;\n            },\n\n            _expr: function(inFunction){\n\n                var tokenStream = this._tokenStream,\n                    values      = [],\n                    value       = null,\n                    operator    = null;\n\n                value = this._term(inFunction);\n                if (value !== null){\n\n                    values.push(value);\n\n                    do {\n                        operator = this._operator(inFunction);\n                        if (operator){\n                            values.push(operator);\n                        } /*else {\n\t\t\t\t\t\t\tvalues.push(new PropertyValue(valueParts, valueParts[0].line, valueParts[0].col));\n\t\t\t\t\t\t\tvalueParts = [];\n\t\t\t\t\t\t}*/\n\n                        value = this._term(inFunction);\n\n                        if (value === null){\n                            break;\n                        } else {\n                            values.push(value);\n                        }\n                    } while(true);\n                }\n\n                return values.length > 0 ? new PropertyValue(values, values[0].line, values[0].col) : null;\n            },\n\n            _term: function(inFunction){\n\n                var tokenStream = this._tokenStream,\n                    unary       = null,\n                    value       = null,\n                    endChar     = null,\n                    token,\n                    line,\n                    col;\n                unary = this._unary_operator();\n                if (unary !== null){\n                    line = tokenStream.token().startLine;\n                    col = tokenStream.token().startCol;\n                }\n                if (tokenStream.peek() == Tokens.IE_FUNCTION && this.options.ieFilters){\n\n                    value = this._ie_function();\n                    if (unary === null){\n                        line = tokenStream.token().startLine;\n                        col = tokenStream.token().startCol;\n                    }\n                } else if (inFunction && tokenStream.match([Tokens.LPAREN, Tokens.LBRACE, Tokens.LBRACKET])){\n\n                    token = tokenStream.token();\n                    endChar = token.endChar;\n                    value = token.value + this._expr(inFunction).text;\n                    if (unary === null){\n                        line = tokenStream.token().startLine;\n                        col = tokenStream.token().startCol;\n                    }\n                    tokenStream.mustMatch(Tokens.type(endChar));\n                    value += endChar;\n                    this._readWhitespace();\n                } else if (tokenStream.match([Tokens.NUMBER, Tokens.PERCENTAGE, Tokens.LENGTH,\n                        Tokens.ANGLE, Tokens.TIME,\n                        Tokens.FREQ, Tokens.STRING, Tokens.IDENT, Tokens.URI, Tokens.UNICODE_RANGE])){\n\n                    value = tokenStream.token().value;\n                    if (unary === null){\n                        line = tokenStream.token().startLine;\n                        col = tokenStream.token().startCol;\n                    }\n                    this._readWhitespace();\n                } else {\n                    token = this._hexcolor();\n                    if (token === null){\n                        if (unary === null){\n                            line = tokenStream.LT(1).startLine;\n                            col = tokenStream.LT(1).startCol;\n                        }\n                        if (value === null){\n                            if (tokenStream.LA(3) == Tokens.EQUALS && this.options.ieFilters){\n                                value = this._ie_function();\n                            } else {\n                                value = this._function();\n                            }\n                        }\n\n                    } else {\n                        value = token.value;\n                        if (unary === null){\n                            line = token.startLine;\n                            col = token.startCol;\n                        }\n                    }\n\n                }\n\n                return value !== null ?\n                        new PropertyValuePart(unary !== null ? unary + value : value, line, col) :\n                        null;\n\n            },\n\n            _function: function(){\n\n                var tokenStream = this._tokenStream,\n                    functionText = null,\n                    expr        = null,\n                    lt;\n\n                if (tokenStream.match(Tokens.FUNCTION)){\n                    functionText = tokenStream.token().value;\n                    this._readWhitespace();\n                    expr = this._expr(true);\n                    functionText += expr;\n                    if (this.options.ieFilters && tokenStream.peek() == Tokens.EQUALS){\n                        do {\n\n                            if (this._readWhitespace()){\n                                functionText += tokenStream.token().value;\n                            }\n                            if (tokenStream.LA(0) == Tokens.COMMA){\n                                functionText += tokenStream.token().value;\n                            }\n\n                            tokenStream.match(Tokens.IDENT);\n                            functionText += tokenStream.token().value;\n\n                            tokenStream.match(Tokens.EQUALS);\n                            functionText += tokenStream.token().value;\n                            lt = tokenStream.peek();\n                            while(lt != Tokens.COMMA && lt != Tokens.S && lt != Tokens.RPAREN){\n                                tokenStream.get();\n                                functionText += tokenStream.token().value;\n                                lt = tokenStream.peek();\n                            }\n                        } while(tokenStream.match([Tokens.COMMA, Tokens.S]));\n                    }\n\n                    tokenStream.match(Tokens.RPAREN);\n                    functionText += \")\";\n                    this._readWhitespace();\n                }\n\n                return functionText;\n            },\n\n            _ie_function: function(){\n\n                var tokenStream = this._tokenStream,\n                    functionText = null,\n                    expr        = null,\n                    lt;\n                if (tokenStream.match([Tokens.IE_FUNCTION, Tokens.FUNCTION])){\n                    functionText = tokenStream.token().value;\n\n                    do {\n\n                        if (this._readWhitespace()){\n                            functionText += tokenStream.token().value;\n                        }\n                        if (tokenStream.LA(0) == Tokens.COMMA){\n                            functionText += tokenStream.token().value;\n                        }\n\n                        tokenStream.match(Tokens.IDENT);\n                        functionText += tokenStream.token().value;\n\n                        tokenStream.match(Tokens.EQUALS);\n                        functionText += tokenStream.token().value;\n                        lt = tokenStream.peek();\n                        while(lt != Tokens.COMMA && lt != Tokens.S && lt != Tokens.RPAREN){\n                            tokenStream.get();\n                            functionText += tokenStream.token().value;\n                            lt = tokenStream.peek();\n                        }\n                    } while(tokenStream.match([Tokens.COMMA, Tokens.S]));\n\n                    tokenStream.match(Tokens.RPAREN);\n                    functionText += \")\";\n                    this._readWhitespace();\n                }\n\n                return functionText;\n            },\n\n            _hexcolor: function(){\n\n                var tokenStream = this._tokenStream,\n                    token = null,\n                    color;\n\n                if(tokenStream.match(Tokens.HASH)){\n\n                    token = tokenStream.token();\n                    color = token.value;\n                    if (!/#[a-f0-9]{3,6}/i.test(color)){\n                        throw new SyntaxError(\"Expected a hex color but found '\" + color + \"' at line \" + token.startLine + \", col \" + token.startCol + \".\", token.startLine, token.startCol);\n                    }\n                    this._readWhitespace();\n                }\n\n                return token;\n            },\n\n            _keyframes: function(){\n                var tokenStream = this._tokenStream,\n                    token,\n                    tt,\n                    name,\n                    prefix = \"\";\n\n                tokenStream.mustMatch(Tokens.KEYFRAMES_SYM);\n                token = tokenStream.token();\n                if (/^@\\-([^\\-]+)\\-/.test(token.value)) {\n                    prefix = RegExp.$1;\n                }\n\n                this._readWhitespace();\n                name = this._keyframe_name();\n\n                this._readWhitespace();\n                tokenStream.mustMatch(Tokens.LBRACE);\n\n                this.fire({\n                    type:   \"startkeyframes\",\n                    name:   name,\n                    prefix: prefix,\n                    line:   token.startLine,\n                    col:    token.startCol\n                });\n\n                this._readWhitespace();\n                tt = tokenStream.peek();\n                while(tt == Tokens.IDENT || tt == Tokens.PERCENTAGE) {\n                    this._keyframe_rule();\n                    this._readWhitespace();\n                    tt = tokenStream.peek();\n                }\n\n                this.fire({\n                    type:   \"endkeyframes\",\n                    name:   name,\n                    prefix: prefix,\n                    line:   token.startLine,\n                    col:    token.startCol\n                });\n\n                this._readWhitespace();\n                tokenStream.mustMatch(Tokens.RBRACE);\n\n            },\n\n            _keyframe_name: function(){\n                var tokenStream = this._tokenStream,\n                    token;\n\n                tokenStream.mustMatch([Tokens.IDENT, Tokens.STRING]);\n                return SyntaxUnit.fromToken(tokenStream.token());\n            },\n\n            _keyframe_rule: function(){\n                var tokenStream = this._tokenStream,\n                    token,\n                    keyList = this._key_list();\n\n                this.fire({\n                    type:   \"startkeyframerule\",\n                    keys:   keyList,\n                    line:   keyList[0].line,\n                    col:    keyList[0].col\n                });\n\n                this._readDeclarations(true);\n\n                this.fire({\n                    type:   \"endkeyframerule\",\n                    keys:   keyList,\n                    line:   keyList[0].line,\n                    col:    keyList[0].col\n                });\n\n            },\n\n            _key_list: function(){\n                var tokenStream = this._tokenStream,\n                    token,\n                    key,\n                    keyList = [];\n                keyList.push(this._key());\n\n                this._readWhitespace();\n\n                while(tokenStream.match(Tokens.COMMA)){\n                    this._readWhitespace();\n                    keyList.push(this._key());\n                    this._readWhitespace();\n                }\n\n                return keyList;\n            },\n\n            _key: function(){\n\n                var tokenStream = this._tokenStream,\n                    token;\n\n                if (tokenStream.match(Tokens.PERCENTAGE)){\n                    return SyntaxUnit.fromToken(tokenStream.token());\n                } else if (tokenStream.match(Tokens.IDENT)){\n                    token = tokenStream.token();\n\n                    if (/from|to/i.test(token.value)){\n                        return SyntaxUnit.fromToken(token);\n                    }\n\n                    tokenStream.unget();\n                }\n                this._unexpectedToken(tokenStream.LT(1));\n            },\n            _skipCruft: function(){\n                while(this._tokenStream.match([Tokens.S, Tokens.CDO, Tokens.CDC])){\n                }\n            },\n            _readDeclarations: function(checkStart, readMargins){\n                var tokenStream = this._tokenStream,\n                    tt;\n\n\n                this._readWhitespace();\n\n                if (checkStart){\n                    tokenStream.mustMatch(Tokens.LBRACE);\n                }\n\n                this._readWhitespace();\n\n                try {\n\n                    while(true){\n\n                        if (tokenStream.match(Tokens.SEMICOLON) || (readMargins && this._margin())){\n                        } else if (this._declaration()){\n                            if (!tokenStream.match(Tokens.SEMICOLON)){\n                                break;\n                            }\n                        } else {\n                            break;\n                        }\n                        this._readWhitespace();\n                    }\n\n                    tokenStream.mustMatch(Tokens.RBRACE);\n                    this._readWhitespace();\n\n                } catch (ex) {\n                    if (ex instanceof SyntaxError && !this.options.strict){\n                        this.fire({\n                            type:       \"error\",\n                            error:      ex,\n                            message:    ex.message,\n                            line:       ex.line,\n                            col:        ex.col\n                        });\n                        tt = tokenStream.advance([Tokens.SEMICOLON, Tokens.RBRACE]);\n                        if (tt == Tokens.SEMICOLON){\n                            this._readDeclarations(false, readMargins);\n                        } else if (tt != Tokens.RBRACE){\n                            throw ex;\n                        }\n\n                    } else {\n                        throw ex;\n                    }\n                }\n\n            },\n            _readWhitespace: function(){\n\n                var tokenStream = this._tokenStream,\n                    ws = \"\";\n\n                while(tokenStream.match(Tokens.S)){\n                    ws += tokenStream.token().value;\n                }\n\n                return ws;\n            },\n            _unexpectedToken: function(token){\n                throw new SyntaxError(\"Unexpected token '\" + token.value + \"' at line \" + token.startLine + \", col \" + token.startCol + \".\", token.startLine, token.startCol);\n            },\n            _verifyEnd: function(){\n                if (this._tokenStream.LA(1) != Tokens.EOF){\n                    this._unexpectedToken(this._tokenStream.LT(1));\n                }\n            },\n            _validateProperty: function(property, value){\n                Validation.validate(property, value);\n            },\n\n            parse: function(input){\n                this._tokenStream = new TokenStream(input, Tokens);\n                this._stylesheet();\n            },\n\n            parseStyleSheet: function(input){\n                return this.parse(input);\n            },\n\n            parseMediaQuery: function(input){\n                this._tokenStream = new TokenStream(input, Tokens);\n                var result = this._media_query();\n                this._verifyEnd();\n                return result;\n            },\n            parsePropertyValue: function(input){\n\n                this._tokenStream = new TokenStream(input, Tokens);\n                this._readWhitespace();\n\n                var result = this._expr();\n                this._readWhitespace();\n                this._verifyEnd();\n                return result;\n            },\n            parseRule: function(input){\n                this._tokenStream = new TokenStream(input, Tokens);\n                this._readWhitespace();\n\n                var result = this._ruleset();\n                this._readWhitespace();\n                this._verifyEnd();\n                return result;\n            },\n            parseSelector: function(input){\n\n                this._tokenStream = new TokenStream(input, Tokens);\n                this._readWhitespace();\n\n                var result = this._selector();\n                this._readWhitespace();\n                this._verifyEnd();\n                return result;\n            },\n            parseStyleAttribute: function(input){\n                input += \"}\"; // for error recovery in _readDeclarations()\n                this._tokenStream = new TokenStream(input, Tokens);\n                this._readDeclarations();\n            }\n        };\n    for (prop in additions){\n        if (additions.hasOwnProperty(prop)){\n            proto[prop] = additions[prop];\n        }\n    }\n\n    return proto;\n}();\nvar Properties = {\n    \"align-items\"                   : \"flex-start | flex-end | center | baseline | stretch\",\n    \"align-content\"                 : \"flex-start | flex-end | center | space-between | space-around | stretch\",\n    \"align-self\"                    : \"auto | flex-start | flex-end | center | baseline | stretch\",\n    \"-webkit-align-items\"           : \"flex-start | flex-end | center | baseline | stretch\",\n    \"-webkit-align-content\"         : \"flex-start | flex-end | center | space-between | space-around | stretch\",\n    \"-webkit-align-self\"            : \"auto | flex-start | flex-end | center | baseline | stretch\",\n    \"alignment-adjust\"              : \"auto | baseline | before-edge | text-before-edge | middle | central | after-edge | text-after-edge | ideographic | alphabetic | hanging | mathematical | <percentage> | <length>\",\n    \"alignment-baseline\"            : \"baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical\",\n    \"animation\"                     : 1,\n    \"animation-delay\"               : { multi: \"<time>\", comma: true },\n    \"animation-direction\"           : { multi: \"normal | alternate\", comma: true },\n    \"animation-duration\"            : { multi: \"<time>\", comma: true },\n    \"animation-fill-mode\"           : { multi: \"none | forwards | backwards | both\", comma: true },\n    \"animation-iteration-count\"     : { multi: \"<number> | infinite\", comma: true },\n    \"animation-name\"                : { multi: \"none | <ident>\", comma: true },\n    \"animation-play-state\"          : { multi: \"running | paused\", comma: true },\n    \"animation-timing-function\"     : 1,\n    \"-moz-animation-delay\"               : { multi: \"<time>\", comma: true },\n    \"-moz-animation-direction\"           : { multi: \"normal | alternate\", comma: true },\n    \"-moz-animation-duration\"            : { multi: \"<time>\", comma: true },\n    \"-moz-animation-iteration-count\"     : { multi: \"<number> | infinite\", comma: true },\n    \"-moz-animation-name\"                : { multi: \"none | <ident>\", comma: true },\n    \"-moz-animation-play-state\"          : { multi: \"running | paused\", comma: true },\n\n    \"-ms-animation-delay\"               : { multi: \"<time>\", comma: true },\n    \"-ms-animation-direction\"           : { multi: \"normal | alternate\", comma: true },\n    \"-ms-animation-duration\"            : { multi: \"<time>\", comma: true },\n    \"-ms-animation-iteration-count\"     : { multi: \"<number> | infinite\", comma: true },\n    \"-ms-animation-name\"                : { multi: \"none | <ident>\", comma: true },\n    \"-ms-animation-play-state\"          : { multi: \"running | paused\", comma: true },\n\n    \"-webkit-animation-delay\"               : { multi: \"<time>\", comma: true },\n    \"-webkit-animation-direction\"           : { multi: \"normal | alternate\", comma: true },\n    \"-webkit-animation-duration\"            : { multi: \"<time>\", comma: true },\n    \"-webkit-animation-fill-mode\"           : { multi: \"none | forwards | backwards | both\", comma: true },\n    \"-webkit-animation-iteration-count\"     : { multi: \"<number> | infinite\", comma: true },\n    \"-webkit-animation-name\"                : { multi: \"none | <ident>\", comma: true },\n    \"-webkit-animation-play-state\"          : { multi: \"running | paused\", comma: true },\n\n    \"-o-animation-delay\"               : { multi: \"<time>\", comma: true },\n    \"-o-animation-direction\"           : { multi: \"normal | alternate\", comma: true },\n    \"-o-animation-duration\"            : { multi: \"<time>\", comma: true },\n    \"-o-animation-iteration-count\"     : { multi: \"<number> | infinite\", comma: true },\n    \"-o-animation-name\"                : { multi: \"none | <ident>\", comma: true },\n    \"-o-animation-play-state\"          : { multi: \"running | paused\", comma: true },\n\n    \"appearance\"                    : \"icon | window | desktop | workspace | document | tooltip | dialog | button | push-button | hyperlink | radio-button | checkbox | menu-item | tab | menu | menubar | pull-down-menu | pop-up-menu | list-menu | radio-group | checkbox-group | outline-tree | range | field | combo-box | signature | password | normal | none | inherit\",\n    \"azimuth\"                       : function (expression) {\n        var simple      = \"<angle> | leftwards | rightwards | inherit\",\n            direction   = \"left-side | far-left | left | center-left | center | center-right | right | far-right | right-side\",\n            behind      = false,\n            valid       = false,\n            part;\n\n        if (!ValidationTypes.isAny(expression, simple)) {\n            if (ValidationTypes.isAny(expression, \"behind\")) {\n                behind = true;\n                valid = true;\n            }\n\n            if (ValidationTypes.isAny(expression, direction)) {\n                valid = true;\n                if (!behind) {\n                    ValidationTypes.isAny(expression, \"behind\");\n                }\n            }\n        }\n\n        if (expression.hasNext()) {\n            part = expression.next();\n            if (valid) {\n                throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n            } else {\n                throw new ValidationError(\"Expected (<'azimuth'>) but found '\" + part + \"'.\", part.line, part.col);\n            }\n        }\n    },\n    \"backface-visibility\"           : \"visible | hidden\",\n    \"background\"                    : 1,\n    \"background-attachment\"         : { multi: \"<attachment>\", comma: true },\n    \"background-clip\"               : { multi: \"<box>\", comma: true },\n    \"background-color\"              : \"<color> | inherit\",\n    \"background-image\"              : { multi: \"<bg-image>\", comma: true },\n    \"background-origin\"             : { multi: \"<box>\", comma: true },\n    \"background-position\"           : { multi: \"<bg-position>\", comma: true },\n    \"background-repeat\"             : { multi: \"<repeat-style>\" },\n    \"background-size\"               : { multi: \"<bg-size>\", comma: true },\n    \"baseline-shift\"                : \"baseline | sub | super | <percentage> | <length>\",\n    \"behavior\"                      : 1,\n    \"binding\"                       : 1,\n    \"bleed\"                         : \"<length>\",\n    \"bookmark-label\"                : \"<content> | <attr> | <string>\",\n    \"bookmark-level\"                : \"none | <integer>\",\n    \"bookmark-state\"                : \"open | closed\",\n    \"bookmark-target\"               : \"none | <uri> | <attr>\",\n    \"border\"                        : \"<border-width> || <border-style> || <color>\",\n    \"border-bottom\"                 : \"<border-width> || <border-style> || <color>\",\n    \"border-bottom-color\"           : \"<color> | inherit\",\n    \"border-bottom-left-radius\"     :  \"<x-one-radius>\",\n    \"border-bottom-right-radius\"    :  \"<x-one-radius>\",\n    \"border-bottom-style\"           : \"<border-style>\",\n    \"border-bottom-width\"           : \"<border-width>\",\n    \"border-collapse\"               : \"collapse | separate | inherit\",\n    \"border-color\"                  : { multi: \"<color> | inherit\", max: 4 },\n    \"border-image\"                  : 1,\n    \"border-image-outset\"           : { multi: \"<length> | <number>\", max: 4 },\n    \"border-image-repeat\"           : { multi: \"stretch | repeat | round\", max: 2 },\n    \"border-image-slice\"            : function(expression) {\n\n        var valid   = false,\n            numeric = \"<number> | <percentage>\",\n            fill    = false,\n            count   = 0,\n            max     = 4,\n            part;\n\n        if (ValidationTypes.isAny(expression, \"fill\")) {\n            fill = true;\n            valid = true;\n        }\n\n        while (expression.hasNext() && count < max) {\n            valid = ValidationTypes.isAny(expression, numeric);\n            if (!valid) {\n                break;\n            }\n            count++;\n        }\n\n\n        if (!fill) {\n            ValidationTypes.isAny(expression, \"fill\");\n        } else {\n            valid = true;\n        }\n\n        if (expression.hasNext()) {\n            part = expression.next();\n            if (valid) {\n                throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n            } else {\n                throw new ValidationError(\"Expected ([<number> | <percentage>]{1,4} && fill?) but found '\" + part + \"'.\", part.line, part.col);\n            }\n        }\n    },\n    \"border-image-source\"           : \"<image> | none\",\n    \"border-image-width\"            : { multi: \"<length> | <percentage> | <number> | auto\", max: 4 },\n    \"border-left\"                   : \"<border-width> || <border-style> || <color>\",\n    \"border-left-color\"             : \"<color> | inherit\",\n    \"border-left-style\"             : \"<border-style>\",\n    \"border-left-width\"             : \"<border-width>\",\n    \"border-radius\"                 : function(expression) {\n\n        var valid   = false,\n            simple = \"<length> | <percentage> | inherit\",\n            slash   = false,\n            fill    = false,\n            count   = 0,\n            max     = 8,\n            part;\n\n        while (expression.hasNext() && count < max) {\n            valid = ValidationTypes.isAny(expression, simple);\n            if (!valid) {\n\n                if (expression.peek() == \"/\" && count > 0 && !slash) {\n                    slash = true;\n                    max = count + 5;\n                    expression.next();\n                } else {\n                    break;\n                }\n            }\n            count++;\n        }\n\n        if (expression.hasNext()) {\n            part = expression.next();\n            if (valid) {\n                throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n            } else {\n                throw new ValidationError(\"Expected (<'border-radius'>) but found '\" + part + \"'.\", part.line, part.col);\n            }\n        }\n    },\n    \"border-right\"                  : \"<border-width> || <border-style> || <color>\",\n    \"border-right-color\"            : \"<color> | inherit\",\n    \"border-right-style\"            : \"<border-style>\",\n    \"border-right-width\"            : \"<border-width>\",\n    \"border-spacing\"                : { multi: \"<length> | inherit\", max: 2 },\n    \"border-style\"                  : { multi: \"<border-style>\", max: 4 },\n    \"border-top\"                    : \"<border-width> || <border-style> || <color>\",\n    \"border-top-color\"              : \"<color> | inherit\",\n    \"border-top-left-radius\"        : \"<x-one-radius>\",\n    \"border-top-right-radius\"       : \"<x-one-radius>\",\n    \"border-top-style\"              : \"<border-style>\",\n    \"border-top-width\"              : \"<border-width>\",\n    \"border-width\"                  : { multi: \"<border-width>\", max: 4 },\n    \"bottom\"                        : \"<margin-width> | inherit\",\n    \"-moz-box-align\"                : \"start | end | center | baseline | stretch\",\n    \"-moz-box-decoration-break\"     : \"slice |clone\",\n    \"-moz-box-direction\"            : \"normal | reverse | inherit\",\n    \"-moz-box-flex\"                 : \"<number>\",\n    \"-moz-box-flex-group\"           : \"<integer>\",\n    \"-moz-box-lines\"                : \"single | multiple\",\n    \"-moz-box-ordinal-group\"        : \"<integer>\",\n    \"-moz-box-orient\"               : \"horizontal | vertical | inline-axis | block-axis | inherit\",\n    \"-moz-box-pack\"                 : \"start | end | center | justify\",\n    \"-webkit-box-align\"             : \"start | end | center | baseline | stretch\",\n    \"-webkit-box-decoration-break\"  : \"slice |clone\",\n    \"-webkit-box-direction\"         : \"normal | reverse | inherit\",\n    \"-webkit-box-flex\"              : \"<number>\",\n    \"-webkit-box-flex-group\"        : \"<integer>\",\n    \"-webkit-box-lines\"             : \"single | multiple\",\n    \"-webkit-box-ordinal-group\"     : \"<integer>\",\n    \"-webkit-box-orient\"            : \"horizontal | vertical | inline-axis | block-axis | inherit\",\n    \"-webkit-box-pack\"              : \"start | end | center | justify\",\n    \"box-shadow\"                    : function (expression) {\n        var result      = false,\n            part;\n\n        if (!ValidationTypes.isAny(expression, \"none\")) {\n            Validation.multiProperty(\"<shadow>\", expression, true, Infinity);\n        } else {\n            if (expression.hasNext()) {\n                part = expression.next();\n                throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n            }\n        }\n    },\n    \"box-sizing\"                    : \"content-box | border-box | inherit\",\n    \"break-after\"                   : \"auto | always | avoid | left | right | page | column | avoid-page | avoid-column\",\n    \"break-before\"                  : \"auto | always | avoid | left | right | page | column | avoid-page | avoid-column\",\n    \"break-inside\"                  : \"auto | avoid | avoid-page | avoid-column\",\n    \"caption-side\"                  : \"top | bottom | inherit\",\n    \"clear\"                         : \"none | right | left | both | inherit\",\n    \"clip\"                          : 1,\n    \"color\"                         : \"<color> | inherit\",\n    \"color-profile\"                 : 1,\n    \"column-count\"                  : \"<integer> | auto\",                      //http://www.w3.org/TR/css3-multicol/\n    \"column-fill\"                   : \"auto | balance\",\n    \"column-gap\"                    : \"<length> | normal\",\n    \"column-rule\"                   : \"<border-width> || <border-style> || <color>\",\n    \"column-rule-color\"             : \"<color>\",\n    \"column-rule-style\"             : \"<border-style>\",\n    \"column-rule-width\"             : \"<border-width>\",\n    \"column-span\"                   : \"none | all\",\n    \"column-width\"                  : \"<length> | auto\",\n    \"columns\"                       : 1,\n    \"content\"                       : 1,\n    \"counter-increment\"             : 1,\n    \"counter-reset\"                 : 1,\n    \"crop\"                          : \"<shape> | auto\",\n    \"cue\"                           : \"cue-after | cue-before | inherit\",\n    \"cue-after\"                     : 1,\n    \"cue-before\"                    : 1,\n    \"cursor\"                        : 1,\n    \"direction\"                     : \"ltr | rtl | inherit\",\n    \"display\"                       : \"inline | block | list-item | inline-block | table | inline-table | table-row-group | table-header-group | table-footer-group | table-row | table-column-group | table-column | table-cell | table-caption | grid | inline-grid | none | inherit | -moz-box | -moz-inline-block | -moz-inline-box | -moz-inline-grid | -moz-inline-stack | -moz-inline-table | -moz-grid | -moz-grid-group | -moz-grid-line | -moz-groupbox | -moz-deck | -moz-popup | -moz-stack | -moz-marker | -webkit-box | -webkit-inline-box | -ms-flexbox | -ms-inline-flexbox | flex | -webkit-flex | inline-flex | -webkit-inline-flex\",\n    \"dominant-baseline\"             : 1,\n    \"drop-initial-after-adjust\"     : \"central | middle | after-edge | text-after-edge | ideographic | alphabetic | mathematical | <percentage> | <length>\",\n    \"drop-initial-after-align\"      : \"baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical\",\n    \"drop-initial-before-adjust\"    : \"before-edge | text-before-edge | central | middle | hanging | mathematical | <percentage> | <length>\",\n    \"drop-initial-before-align\"     : \"caps-height | baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical\",\n    \"drop-initial-size\"             : \"auto | line | <length> | <percentage>\",\n    \"drop-initial-value\"            : \"initial | <integer>\",\n    \"elevation\"                     : \"<angle> | below | level | above | higher | lower | inherit\",\n    \"empty-cells\"                   : \"show | hide | inherit\",\n    \"filter\"                        : 1,\n    \"fit\"                           : \"fill | hidden | meet | slice\",\n    \"fit-position\"                  : 1,\n    \"flex\"                          : \"<flex>\",\n    \"flex-basis\"                    : \"<width>\",\n    \"flex-direction\"                : \"row | row-reverse | column | column-reverse\",\n    \"flex-flow\"                     : \"<flex-direction> || <flex-wrap>\",\n    \"flex-grow\"                     : \"<number>\",\n    \"flex-shrink\"                   : \"<number>\",\n    \"flex-wrap\"                     : \"nowrap | wrap | wrap-reverse\",\n    \"-webkit-flex\"                  : \"<flex>\",\n    \"-webkit-flex-basis\"            : \"<width>\",\n    \"-webkit-flex-direction\"        : \"row | row-reverse | column | column-reverse\",\n    \"-webkit-flex-flow\"             : \"<flex-direction> || <flex-wrap>\",\n    \"-webkit-flex-grow\"             : \"<number>\",\n    \"-webkit-flex-shrink\"           : \"<number>\",\n    \"-webkit-flex-wrap\"             : \"nowrap | wrap | wrap-reverse\",\n    \"-ms-flex\"                      : \"<flex>\",\n    \"-ms-flex-align\"                : \"start | end | center | stretch | baseline\",\n    \"-ms-flex-direction\"            : \"row | row-reverse | column | column-reverse | inherit\",\n    \"-ms-flex-order\"                : \"<number>\",\n    \"-ms-flex-pack\"                 : \"start | end | center | justify\",\n    \"-ms-flex-wrap\"                 : \"nowrap | wrap | wrap-reverse\",\n    \"float\"                         : \"left | right | none | inherit\",\n    \"float-offset\"                  : 1,\n    \"font\"                          : 1,\n    \"font-family\"                   : 1,\n    \"font-size\"                     : \"<absolute-size> | <relative-size> | <length> | <percentage> | inherit\",\n    \"font-size-adjust\"              : \"<number> | none | inherit\",\n    \"font-stretch\"                  : \"normal | ultra-condensed | extra-condensed | condensed | semi-condensed | semi-expanded | expanded | extra-expanded | ultra-expanded | inherit\",\n    \"font-style\"                    : \"normal | italic | oblique | inherit\",\n    \"font-variant\"                  : \"normal | small-caps | inherit\",\n    \"font-weight\"                   : \"normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | inherit\",\n    \"grid-cell-stacking\"            : \"columns | rows | layer\",\n    \"grid-column\"                   : 1,\n    \"grid-columns\"                  : 1,\n    \"grid-column-align\"             : \"start | end | center | stretch\",\n    \"grid-column-sizing\"            : 1,\n    \"grid-column-span\"              : \"<integer>\",\n    \"grid-flow\"                     : \"none | rows | columns\",\n    \"grid-layer\"                    : \"<integer>\",\n    \"grid-row\"                      : 1,\n    \"grid-rows\"                     : 1,\n    \"grid-row-align\"                : \"start | end | center | stretch\",\n    \"grid-row-span\"                 : \"<integer>\",\n    \"grid-row-sizing\"               : 1,\n    \"hanging-punctuation\"           : 1,\n    \"height\"                        : \"<margin-width> | <content-sizing> | inherit\",\n    \"hyphenate-after\"               : \"<integer> | auto\",\n    \"hyphenate-before\"              : \"<integer> | auto\",\n    \"hyphenate-character\"           : \"<string> | auto\",\n    \"hyphenate-lines\"               : \"no-limit | <integer>\",\n    \"hyphenate-resource\"            : 1,\n    \"hyphens\"                       : \"none | manual | auto\",\n    \"icon\"                          : 1,\n    \"image-orientation\"             : \"angle | auto\",\n    \"image-rendering\"               : 1,\n    \"image-resolution\"              : 1,\n    \"inline-box-align\"              : \"initial | last | <integer>\",\n    \"justify-content\"               : \"flex-start | flex-end | center | space-between | space-around\",\n    \"-webkit-justify-content\"       : \"flex-start | flex-end | center | space-between | space-around\",\n    \"left\"                          : \"<margin-width> | inherit\",\n    \"letter-spacing\"                : \"<length> | normal | inherit\",\n    \"line-height\"                   : \"<number> | <length> | <percentage> | normal | inherit\",\n    \"line-break\"                    : \"auto | loose | normal | strict\",\n    \"line-stacking\"                 : 1,\n    \"line-stacking-ruby\"            : \"exclude-ruby | include-ruby\",\n    \"line-stacking-shift\"           : \"consider-shifts | disregard-shifts\",\n    \"line-stacking-strategy\"        : \"inline-line-height | block-line-height | max-height | grid-height\",\n    \"list-style\"                    : 1,\n    \"list-style-image\"              : \"<uri> | none | inherit\",\n    \"list-style-position\"           : \"inside | outside | inherit\",\n    \"list-style-type\"               : \"disc | circle | square | decimal | decimal-leading-zero | lower-roman | upper-roman | lower-greek | lower-latin | upper-latin | armenian | georgian | lower-alpha | upper-alpha | none | inherit\",\n    \"margin\"                        : { multi: \"<margin-width> | inherit\", max: 4 },\n    \"margin-bottom\"                 : \"<margin-width> | inherit\",\n    \"margin-left\"                   : \"<margin-width> | inherit\",\n    \"margin-right\"                  : \"<margin-width> | inherit\",\n    \"margin-top\"                    : \"<margin-width> | inherit\",\n    \"mark\"                          : 1,\n    \"mark-after\"                    : 1,\n    \"mark-before\"                   : 1,\n    \"marks\"                         : 1,\n    \"marquee-direction\"             : 1,\n    \"marquee-play-count\"            : 1,\n    \"marquee-speed\"                 : 1,\n    \"marquee-style\"                 : 1,\n    \"max-height\"                    : \"<length> | <percentage> | <content-sizing> | none | inherit\",\n    \"max-width\"                     : \"<length> | <percentage> | <content-sizing> | none | inherit\",\n    \"min-height\"                    : \"<length> | <percentage> | <content-sizing> | contain-floats | -moz-contain-floats | -webkit-contain-floats | inherit\",\n    \"min-width\"                     : \"<length> | <percentage> | <content-sizing> | contain-floats | -moz-contain-floats | -webkit-contain-floats | inherit\",\n    \"move-to\"                       : 1,\n    \"nav-down\"                      : 1,\n    \"nav-index\"                     : 1,\n    \"nav-left\"                      : 1,\n    \"nav-right\"                     : 1,\n    \"nav-up\"                        : 1,\n    \"opacity\"                       : \"<number> | inherit\",\n    \"order\"                         : \"<integer>\",\n    \"-webkit-order\"                 : \"<integer>\",\n    \"orphans\"                       : \"<integer> | inherit\",\n    \"outline\"                       : 1,\n    \"outline-color\"                 : \"<color> | invert | inherit\",\n    \"outline-offset\"                : 1,\n    \"outline-style\"                 : \"<border-style> | inherit\",\n    \"outline-width\"                 : \"<border-width> | inherit\",\n    \"overflow\"                      : \"visible | hidden | scroll | auto | inherit\",\n    \"overflow-style\"                : 1,\n    \"overflow-wrap\"                 : \"normal | break-word\",\n    \"overflow-x\"                    : 1,\n    \"overflow-y\"                    : 1,\n    \"padding\"                       : { multi: \"<padding-width> | inherit\", max: 4 },\n    \"padding-bottom\"                : \"<padding-width> | inherit\",\n    \"padding-left\"                  : \"<padding-width> | inherit\",\n    \"padding-right\"                 : \"<padding-width> | inherit\",\n    \"padding-top\"                   : \"<padding-width> | inherit\",\n    \"page\"                          : 1,\n    \"page-break-after\"              : \"auto | always | avoid | left | right | inherit\",\n    \"page-break-before\"             : \"auto | always | avoid | left | right | inherit\",\n    \"page-break-inside\"             : \"auto | avoid | inherit\",\n    \"page-policy\"                   : 1,\n    \"pause\"                         : 1,\n    \"pause-after\"                   : 1,\n    \"pause-before\"                  : 1,\n    \"perspective\"                   : 1,\n    \"perspective-origin\"            : 1,\n    \"phonemes\"                      : 1,\n    \"pitch\"                         : 1,\n    \"pitch-range\"                   : 1,\n    \"play-during\"                   : 1,\n    \"pointer-events\"                : \"auto | none | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | inherit\",\n    \"position\"                      : \"static | relative | absolute | fixed | inherit\",\n    \"presentation-level\"            : 1,\n    \"punctuation-trim\"              : 1,\n    \"quotes\"                        : 1,\n    \"rendering-intent\"              : 1,\n    \"resize\"                        : 1,\n    \"rest\"                          : 1,\n    \"rest-after\"                    : 1,\n    \"rest-before\"                   : 1,\n    \"richness\"                      : 1,\n    \"right\"                         : \"<margin-width> | inherit\",\n    \"rotation\"                      : 1,\n    \"rotation-point\"                : 1,\n    \"ruby-align\"                    : 1,\n    \"ruby-overhang\"                 : 1,\n    \"ruby-position\"                 : 1,\n    \"ruby-span\"                     : 1,\n    \"size\"                          : 1,\n    \"speak\"                         : \"normal | none | spell-out | inherit\",\n    \"speak-header\"                  : \"once | always | inherit\",\n    \"speak-numeral\"                 : \"digits | continuous | inherit\",\n    \"speak-punctuation\"             : \"code | none | inherit\",\n    \"speech-rate\"                   : 1,\n    \"src\"                           : 1,\n    \"stress\"                        : 1,\n    \"string-set\"                    : 1,\n\n    \"table-layout\"                  : \"auto | fixed | inherit\",\n    \"tab-size\"                      : \"<integer> | <length>\",\n    \"target\"                        : 1,\n    \"target-name\"                   : 1,\n    \"target-new\"                    : 1,\n    \"target-position\"               : 1,\n    \"text-align\"                    : \"left | right | center | justify | inherit\" ,\n    \"text-align-last\"               : 1,\n    \"text-decoration\"               : 1,\n    \"text-emphasis\"                 : 1,\n    \"text-height\"                   : 1,\n    \"text-indent\"                   : \"<length> | <percentage> | inherit\",\n    \"text-justify\"                  : \"auto | none | inter-word | inter-ideograph | inter-cluster | distribute | kashida\",\n    \"text-outline\"                  : 1,\n    \"text-overflow\"                 : 1,\n    \"text-rendering\"                : \"auto | optimizeSpeed | optimizeLegibility | geometricPrecision | inherit\",\n    \"text-shadow\"                   : 1,\n    \"text-transform\"                : \"capitalize | uppercase | lowercase | none | inherit\",\n    \"text-wrap\"                     : \"normal | none | avoid\",\n    \"top\"                           : \"<margin-width> | inherit\",\n    \"-ms-touch-action\"              : \"auto | none | pan-x | pan-y\",\n    \"touch-action\"                  : \"auto | none | pan-x | pan-y\",\n    \"transform\"                     : 1,\n    \"transform-origin\"              : 1,\n    \"transform-style\"               : 1,\n    \"transition\"                    : 1,\n    \"transition-delay\"              : 1,\n    \"transition-duration\"           : 1,\n    \"transition-property\"           : 1,\n    \"transition-timing-function\"    : 1,\n    \"unicode-bidi\"                  : \"normal | embed | isolate | bidi-override | isolate-override | plaintext | inherit\",\n    \"user-modify\"                   : \"read-only | read-write | write-only | inherit\",\n    \"user-select\"                   : \"none | text | toggle | element | elements | all | inherit\",\n    \"vertical-align\"                : \"auto | use-script | baseline | sub | super | top | text-top | central | middle | bottom | text-bottom | <percentage> | <length>\",\n    \"visibility\"                    : \"visible | hidden | collapse | inherit\",\n    \"voice-balance\"                 : 1,\n    \"voice-duration\"                : 1,\n    \"voice-family\"                  : 1,\n    \"voice-pitch\"                   : 1,\n    \"voice-pitch-range\"             : 1,\n    \"voice-rate\"                    : 1,\n    \"voice-stress\"                  : 1,\n    \"voice-volume\"                  : 1,\n    \"volume\"                        : 1,\n    \"white-space\"                   : \"normal | pre | nowrap | pre-wrap | pre-line | inherit | -pre-wrap | -o-pre-wrap | -moz-pre-wrap | -hp-pre-wrap\", //http://perishablepress.com/wrapping-content/\n    \"white-space-collapse\"          : 1,\n    \"widows\"                        : \"<integer> | inherit\",\n    \"width\"                         : \"<length> | <percentage> | <content-sizing> | auto | inherit\",\n    \"word-break\"                    : \"normal | keep-all | break-all\",\n    \"word-spacing\"                  : \"<length> | normal | inherit\",\n    \"word-wrap\"                     : \"normal | break-word\",\n    \"writing-mode\"                  : \"horizontal-tb | vertical-rl | vertical-lr | lr-tb | rl-tb | tb-rl | bt-rl | tb-lr | bt-lr | lr-bt | rl-bt | lr | rl | tb | inherit\",\n    \"z-index\"                       : \"<integer> | auto | inherit\",\n    \"zoom\"                          : \"<number> | <percentage> | normal\"\n};\nfunction PropertyName(text, hack, line, col){\n\n    SyntaxUnit.call(this, text, line, col, Parser.PROPERTY_NAME_TYPE);\n    this.hack = hack;\n\n}\n\nPropertyName.prototype = new SyntaxUnit();\nPropertyName.prototype.constructor = PropertyName;\nPropertyName.prototype.toString = function(){\n    return (this.hack ? this.hack : \"\") + this.text;\n};\nfunction PropertyValue(parts, line, col){\n\n    SyntaxUnit.call(this, parts.join(\" \"), line, col, Parser.PROPERTY_VALUE_TYPE);\n    this.parts = parts;\n\n}\n\nPropertyValue.prototype = new SyntaxUnit();\nPropertyValue.prototype.constructor = PropertyValue;\nfunction PropertyValueIterator(value){\n    this._i = 0;\n    this._parts = value.parts;\n    this._marks = [];\n    this.value = value;\n\n}\nPropertyValueIterator.prototype.count = function(){\n    return this._parts.length;\n};\nPropertyValueIterator.prototype.isFirst = function(){\n    return this._i === 0;\n};\nPropertyValueIterator.prototype.hasNext = function(){\n    return (this._i < this._parts.length);\n};\nPropertyValueIterator.prototype.mark = function(){\n    this._marks.push(this._i);\n};\nPropertyValueIterator.prototype.peek = function(count){\n    return this.hasNext() ? this._parts[this._i + (count || 0)] : null;\n};\nPropertyValueIterator.prototype.next = function(){\n    return this.hasNext() ? this._parts[this._i++] : null;\n};\nPropertyValueIterator.prototype.previous = function(){\n    return this._i > 0 ? this._parts[--this._i] : null;\n};\nPropertyValueIterator.prototype.restore = function(){\n    if (this._marks.length){\n        this._i = this._marks.pop();\n    }\n};\nfunction PropertyValuePart(text, line, col){\n\n    SyntaxUnit.call(this, text, line, col, Parser.PROPERTY_VALUE_PART_TYPE);\n    this.type = \"unknown\";\n\n    var temp;\n    if (/^([+\\-]?[\\d\\.]+)([a-z]+)$/i.test(text)){  //dimension\n        this.type = \"dimension\";\n        this.value = +RegExp.$1;\n        this.units = RegExp.$2;\n        switch(this.units.toLowerCase()){\n\n            case \"em\":\n            case \"rem\":\n            case \"ex\":\n            case \"px\":\n            case \"cm\":\n            case \"mm\":\n            case \"in\":\n            case \"pt\":\n            case \"pc\":\n            case \"ch\":\n            case \"vh\":\n            case \"vw\":\n            case \"vmax\":\n            case \"vmin\":\n                this.type = \"length\";\n                break;\n\n            case \"deg\":\n            case \"rad\":\n            case \"grad\":\n                this.type = \"angle\";\n                break;\n\n            case \"ms\":\n            case \"s\":\n                this.type = \"time\";\n                break;\n\n            case \"hz\":\n            case \"khz\":\n                this.type = \"frequency\";\n                break;\n\n            case \"dpi\":\n            case \"dpcm\":\n                this.type = \"resolution\";\n                break;\n\n        }\n\n    } else if (/^([+\\-]?[\\d\\.]+)%$/i.test(text)){  //percentage\n        this.type = \"percentage\";\n        this.value = +RegExp.$1;\n    } else if (/^([+\\-]?\\d+)$/i.test(text)){  //integer\n        this.type = \"integer\";\n        this.value = +RegExp.$1;\n    } else if (/^([+\\-]?[\\d\\.]+)$/i.test(text)){  //number\n        this.type = \"number\";\n        this.value = +RegExp.$1;\n\n    } else if (/^#([a-f0-9]{3,6})/i.test(text)){  //hexcolor\n        this.type = \"color\";\n        temp = RegExp.$1;\n        if (temp.length == 3){\n            this.red    = parseInt(temp.charAt(0)+temp.charAt(0),16);\n            this.green  = parseInt(temp.charAt(1)+temp.charAt(1),16);\n            this.blue   = parseInt(temp.charAt(2)+temp.charAt(2),16);\n        } else {\n            this.red    = parseInt(temp.substring(0,2),16);\n            this.green  = parseInt(temp.substring(2,4),16);\n            this.blue   = parseInt(temp.substring(4,6),16);\n        }\n    } else if (/^rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/i.test(text)){ //rgb() color with absolute numbers\n        this.type   = \"color\";\n        this.red    = +RegExp.$1;\n        this.green  = +RegExp.$2;\n        this.blue   = +RegExp.$3;\n    } else if (/^rgb\\(\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*\\)/i.test(text)){ //rgb() color with percentages\n        this.type   = \"color\";\n        this.red    = +RegExp.$1 * 255 / 100;\n        this.green  = +RegExp.$2 * 255 / 100;\n        this.blue   = +RegExp.$3 * 255 / 100;\n    } else if (/^rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*([\\d\\.]+)\\s*\\)/i.test(text)){ //rgba() color with absolute numbers\n        this.type   = \"color\";\n        this.red    = +RegExp.$1;\n        this.green  = +RegExp.$2;\n        this.blue   = +RegExp.$3;\n        this.alpha  = +RegExp.$4;\n    } else if (/^rgba\\(\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*,\\s*([\\d\\.]+)\\s*\\)/i.test(text)){ //rgba() color with percentages\n        this.type   = \"color\";\n        this.red    = +RegExp.$1 * 255 / 100;\n        this.green  = +RegExp.$2 * 255 / 100;\n        this.blue   = +RegExp.$3 * 255 / 100;\n        this.alpha  = +RegExp.$4;\n    } else if (/^hsl\\(\\s*(\\d+)\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*\\)/i.test(text)){ //hsl()\n        this.type   = \"color\";\n        this.hue    = +RegExp.$1;\n        this.saturation = +RegExp.$2 / 100;\n        this.lightness  = +RegExp.$3 / 100;\n    } else if (/^hsla\\(\\s*(\\d+)\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*,\\s*([\\d\\.]+)\\s*\\)/i.test(text)){ //hsla() color with percentages\n        this.type   = \"color\";\n        this.hue    = +RegExp.$1;\n        this.saturation = +RegExp.$2 / 100;\n        this.lightness  = +RegExp.$3 / 100;\n        this.alpha  = +RegExp.$4;\n    } else if (/^url\\([\"']?([^\\)\"']+)[\"']?\\)/i.test(text)){ //URI\n        this.type   = \"uri\";\n        this.uri    = RegExp.$1;\n    } else if (/^([^\\(]+)\\(/i.test(text)){\n        this.type   = \"function\";\n        this.name   = RegExp.$1;\n        this.value  = text;\n    } else if (/^[\"'][^\"']*[\"']/.test(text)){    //string\n        this.type   = \"string\";\n        this.value  = eval(text);\n    } else if (Colors[text.toLowerCase()]){  //named color\n        this.type   = \"color\";\n        temp        = Colors[text.toLowerCase()].substring(1);\n        this.red    = parseInt(temp.substring(0,2),16);\n        this.green  = parseInt(temp.substring(2,4),16);\n        this.blue   = parseInt(temp.substring(4,6),16);\n    } else if (/^[\\,\\/]$/.test(text)){\n        this.type   = \"operator\";\n        this.value  = text;\n    } else if (/^[a-z\\-_\\u0080-\\uFFFF][a-z0-9\\-_\\u0080-\\uFFFF]*$/i.test(text)){\n        this.type   = \"identifier\";\n        this.value  = text;\n    }\n\n}\n\nPropertyValuePart.prototype = new SyntaxUnit();\nPropertyValuePart.prototype.constructor = PropertyValuePart;\nPropertyValuePart.fromToken = function(token){\n    return new PropertyValuePart(token.value, token.startLine, token.startCol);\n};\nvar Pseudos = {\n    \":first-letter\": 1,\n    \":first-line\":   1,\n    \":before\":       1,\n    \":after\":        1\n};\n\nPseudos.ELEMENT = 1;\nPseudos.CLASS = 2;\n\nPseudos.isElement = function(pseudo){\n    return pseudo.indexOf(\"::\") === 0 || Pseudos[pseudo.toLowerCase()] == Pseudos.ELEMENT;\n};\nfunction Selector(parts, line, col){\n\n    SyntaxUnit.call(this, parts.join(\" \"), line, col, Parser.SELECTOR_TYPE);\n    this.parts = parts;\n    this.specificity = Specificity.calculate(this);\n\n}\n\nSelector.prototype = new SyntaxUnit();\nSelector.prototype.constructor = Selector;\nfunction SelectorPart(elementName, modifiers, text, line, col){\n\n    SyntaxUnit.call(this, text, line, col, Parser.SELECTOR_PART_TYPE);\n    this.elementName = elementName;\n    this.modifiers = modifiers;\n\n}\n\nSelectorPart.prototype = new SyntaxUnit();\nSelectorPart.prototype.constructor = SelectorPart;\nfunction SelectorSubPart(text, type, line, col){\n\n    SyntaxUnit.call(this, text, line, col, Parser.SELECTOR_SUB_PART_TYPE);\n    this.type = type;\n    this.args = [];\n\n}\n\nSelectorSubPart.prototype = new SyntaxUnit();\nSelectorSubPart.prototype.constructor = SelectorSubPart;\nfunction Specificity(a, b, c, d){\n    this.a = a;\n    this.b = b;\n    this.c = c;\n    this.d = d;\n}\n\nSpecificity.prototype = {\n    constructor: Specificity,\n    compare: function(other){\n        var comps = [\"a\", \"b\", \"c\", \"d\"],\n            i, len;\n\n        for (i=0, len=comps.length; i < len; i++){\n            if (this[comps[i]] < other[comps[i]]){\n                return -1;\n            } else if (this[comps[i]] > other[comps[i]]){\n                return 1;\n            }\n        }\n\n        return 0;\n    },\n    valueOf: function(){\n        return (this.a * 1000) + (this.b * 100) + (this.c * 10) + this.d;\n    },\n    toString: function(){\n        return this.a + \",\" + this.b + \",\" + this.c + \",\" + this.d;\n    }\n\n};\nSpecificity.calculate = function(selector){\n\n    var i, len,\n        part,\n        b=0, c=0, d=0;\n\n    function updateValues(part){\n\n        var i, j, len, num,\n            elementName = part.elementName ? part.elementName.text : \"\",\n            modifier;\n\n        if (elementName && elementName.charAt(elementName.length-1) != \"*\") {\n            d++;\n        }\n\n        for (i=0, len=part.modifiers.length; i < len; i++){\n            modifier = part.modifiers[i];\n            switch(modifier.type){\n                case \"class\":\n                case \"attribute\":\n                    c++;\n                    break;\n\n                case \"id\":\n                    b++;\n                    break;\n\n                case \"pseudo\":\n                    if (Pseudos.isElement(modifier.text)){\n                        d++;\n                    } else {\n                        c++;\n                    }\n                    break;\n\n                case \"not\":\n                    for (j=0, num=modifier.args.length; j < num; j++){\n                        updateValues(modifier.args[j]);\n                    }\n            }\n         }\n    }\n\n    for (i=0, len=selector.parts.length; i < len; i++){\n        part = selector.parts[i];\n\n        if (part instanceof SelectorPart){\n            updateValues(part);\n        }\n    }\n\n    return new Specificity(0, b, c, d);\n};\n\nvar h = /^[0-9a-fA-F]$/,\n    nonascii = /^[\\u0080-\\uFFFF]$/,\n    nl = /\\n|\\r\\n|\\r|\\f/;\n\n\nfunction isHexDigit(c){\n    return c !== null && h.test(c);\n}\n\nfunction isDigit(c){\n    return c !== null && /\\d/.test(c);\n}\n\nfunction isWhitespace(c){\n    return c !== null && /\\s/.test(c);\n}\n\nfunction isNewLine(c){\n    return c !== null && nl.test(c);\n}\n\nfunction isNameStart(c){\n    return c !== null && (/[a-z_\\u0080-\\uFFFF\\\\]/i.test(c));\n}\n\nfunction isNameChar(c){\n    return c !== null && (isNameStart(c) || /[0-9\\-\\\\]/.test(c));\n}\n\nfunction isIdentStart(c){\n    return c !== null && (isNameStart(c) || /\\-\\\\/.test(c));\n}\n\nfunction mix(receiver, supplier){\n\tfor (var prop in supplier){\n\t\tif (supplier.hasOwnProperty(prop)){\n\t\t\treceiver[prop] = supplier[prop];\n\t\t}\n\t}\n\treturn receiver;\n}\nfunction TokenStream(input){\n\tTokenStreamBase.call(this, input, Tokens);\n}\n\nTokenStream.prototype = mix(new TokenStreamBase(), {\n    _getToken: function(channel){\n\n        var c,\n            reader = this._reader,\n            token   = null,\n            startLine   = reader.getLine(),\n            startCol    = reader.getCol();\n\n        c = reader.read();\n\n\n        while(c){\n            switch(c){\n                case \"/\":\n\n                    if(reader.peek() == \"*\"){\n                        token = this.commentToken(c, startLine, startCol);\n                    } else {\n                        token = this.charToken(c, startLine, startCol);\n                    }\n                    break;\n                case \"|\":\n                case \"~\":\n                case \"^\":\n                case \"$\":\n                case \"*\":\n                    if(reader.peek() == \"=\"){\n                        token = this.comparisonToken(c, startLine, startCol);\n                    } else {\n                        token = this.charToken(c, startLine, startCol);\n                    }\n                    break;\n                case \"\\\"\":\n                case \"'\":\n                    token = this.stringToken(c, startLine, startCol);\n                    break;\n                case \"#\":\n                    if (isNameChar(reader.peek())){\n                        token = this.hashToken(c, startLine, startCol);\n                    } else {\n                        token = this.charToken(c, startLine, startCol);\n                    }\n                    break;\n                case \".\":\n                    if (isDigit(reader.peek())){\n                        token = this.numberToken(c, startLine, startCol);\n                    } else {\n                        token = this.charToken(c, startLine, startCol);\n                    }\n                    break;\n                case \"-\":\n                    if (reader.peek() == \"-\"){  //could be closing HTML-style comment\n                        token = this.htmlCommentEndToken(c, startLine, startCol);\n                    } else if (isNameStart(reader.peek())){\n                        token = this.identOrFunctionToken(c, startLine, startCol);\n                    } else {\n                        token = this.charToken(c, startLine, startCol);\n                    }\n                    break;\n                case \"!\":\n                    token = this.importantToken(c, startLine, startCol);\n                    break;\n                case \"@\":\n                    token = this.atRuleToken(c, startLine, startCol);\n                    break;\n                case \":\":\n                    token = this.notToken(c, startLine, startCol);\n                    break;\n                case \"<\":\n                    token = this.htmlCommentStartToken(c, startLine, startCol);\n                    break;\n                case \"U\":\n                case \"u\":\n                    if (reader.peek() == \"+\"){\n                        token = this.unicodeRangeToken(c, startLine, startCol);\n                        break;\n                    }\n                default:\n                    if (isDigit(c)){\n                        token = this.numberToken(c, startLine, startCol);\n                    } else\n                    if (isWhitespace(c)){\n                        token = this.whitespaceToken(c, startLine, startCol);\n                    } else\n                    if (isIdentStart(c)){\n                        token = this.identOrFunctionToken(c, startLine, startCol);\n                    } else\n                    {\n                        token = this.charToken(c, startLine, startCol);\n                    }\n\n\n\n\n\n\n            }\n            break;\n        }\n\n        if (!token && c === null){\n            token = this.createToken(Tokens.EOF,null,startLine,startCol);\n        }\n\n        return token;\n    },\n    createToken: function(tt, value, startLine, startCol, options){\n        var reader = this._reader;\n        options = options || {};\n\n        return {\n            value:      value,\n            type:       tt,\n            channel:    options.channel,\n            endChar:    options.endChar,\n            hide:       options.hide || false,\n            startLine:  startLine,\n            startCol:   startCol,\n            endLine:    reader.getLine(),\n            endCol:     reader.getCol()\n        };\n    },\n    atRuleToken: function(first, startLine, startCol){\n        var rule    = first,\n            reader  = this._reader,\n            tt      = Tokens.CHAR,\n            valid   = false,\n            ident,\n            c;\n        reader.mark();\n        ident = this.readName();\n        rule = first + ident;\n        tt = Tokens.type(rule.toLowerCase());\n        if (tt == Tokens.CHAR || tt == Tokens.UNKNOWN){\n            if (rule.length > 1){\n                tt = Tokens.UNKNOWN_SYM;\n            } else {\n                tt = Tokens.CHAR;\n                rule = first;\n                reader.reset();\n            }\n        }\n\n        return this.createToken(tt, rule, startLine, startCol);\n    },\n    charToken: function(c, startLine, startCol){\n        var tt = Tokens.type(c);\n        var opts = {};\n\n        if (tt == -1){\n            tt = Tokens.CHAR;\n        } else {\n            opts.endChar = Tokens[tt].endChar;\n        }\n\n        return this.createToken(tt, c, startLine, startCol, opts);\n    },\n    commentToken: function(first, startLine, startCol){\n        var reader  = this._reader,\n            comment = this.readComment(first);\n\n        return this.createToken(Tokens.COMMENT, comment, startLine, startCol);\n    },\n    comparisonToken: function(c, startLine, startCol){\n        var reader  = this._reader,\n            comparison  = c + reader.read(),\n            tt      = Tokens.type(comparison) || Tokens.CHAR;\n\n        return this.createToken(tt, comparison, startLine, startCol);\n    },\n    hashToken: function(first, startLine, startCol){\n        var reader  = this._reader,\n            name    = this.readName(first);\n\n        return this.createToken(Tokens.HASH, name, startLine, startCol);\n    },\n    htmlCommentStartToken: function(first, startLine, startCol){\n        var reader      = this._reader,\n            text        = first;\n\n        reader.mark();\n        text += reader.readCount(3);\n\n        if (text == \"<!--\"){\n            return this.createToken(Tokens.CDO, text, startLine, startCol);\n        } else {\n            reader.reset();\n            return this.charToken(first, startLine, startCol);\n        }\n    },\n    htmlCommentEndToken: function(first, startLine, startCol){\n        var reader      = this._reader,\n            text        = first;\n\n        reader.mark();\n        text += reader.readCount(2);\n\n        if (text == \"-->\"){\n            return this.createToken(Tokens.CDC, text, startLine, startCol);\n        } else {\n            reader.reset();\n            return this.charToken(first, startLine, startCol);\n        }\n    },\n    identOrFunctionToken: function(first, startLine, startCol){\n        var reader  = this._reader,\n            ident   = this.readName(first),\n            tt      = Tokens.IDENT;\n        if (reader.peek() == \"(\"){\n            ident += reader.read();\n            if (ident.toLowerCase() == \"url(\"){\n                tt = Tokens.URI;\n                ident = this.readURI(ident);\n                if (ident.toLowerCase() == \"url(\"){\n                    tt = Tokens.FUNCTION;\n                }\n            } else {\n                tt = Tokens.FUNCTION;\n            }\n        } else if (reader.peek() == \":\"){  //might be an IE function\n            if (ident.toLowerCase() == \"progid\"){\n                ident += reader.readTo(\"(\");\n                tt = Tokens.IE_FUNCTION;\n            }\n        }\n\n        return this.createToken(tt, ident, startLine, startCol);\n    },\n    importantToken: function(first, startLine, startCol){\n        var reader      = this._reader,\n            important   = first,\n            tt          = Tokens.CHAR,\n            temp,\n            c;\n\n        reader.mark();\n        c = reader.read();\n\n        while(c){\n            if (c == \"/\"){\n                if (reader.peek() != \"*\"){\n                    break;\n                } else {\n                    temp = this.readComment(c);\n                    if (temp === \"\"){    //broken!\n                        break;\n                    }\n                }\n            } else if (isWhitespace(c)){\n                important += c + this.readWhitespace();\n            } else if (/i/i.test(c)){\n                temp = reader.readCount(8);\n                if (/mportant/i.test(temp)){\n                    important += c + temp;\n                    tt = Tokens.IMPORTANT_SYM;\n\n                }\n                break;  //we're done\n            } else {\n                break;\n            }\n\n            c = reader.read();\n        }\n\n        if (tt == Tokens.CHAR){\n            reader.reset();\n            return this.charToken(first, startLine, startCol);\n        } else {\n            return this.createToken(tt, important, startLine, startCol);\n        }\n\n\n    },\n    notToken: function(first, startLine, startCol){\n        var reader      = this._reader,\n            text        = first;\n\n        reader.mark();\n        text += reader.readCount(4);\n\n        if (text.toLowerCase() == \":not(\"){\n            return this.createToken(Tokens.NOT, text, startLine, startCol);\n        } else {\n            reader.reset();\n            return this.charToken(first, startLine, startCol);\n        }\n    },\n    numberToken: function(first, startLine, startCol){\n        var reader  = this._reader,\n            value   = this.readNumber(first),\n            ident,\n            tt      = Tokens.NUMBER,\n            c       = reader.peek();\n\n        if (isIdentStart(c)){\n            ident = this.readName(reader.read());\n            value += ident;\n\n            if (/^em$|^ex$|^px$|^gd$|^rem$|^vw$|^vh$|^vmax$|^vmin$|^ch$|^cm$|^mm$|^in$|^pt$|^pc$/i.test(ident)){\n                tt = Tokens.LENGTH;\n            } else if (/^deg|^rad$|^grad$/i.test(ident)){\n                tt = Tokens.ANGLE;\n            } else if (/^ms$|^s$/i.test(ident)){\n                tt = Tokens.TIME;\n            } else if (/^hz$|^khz$/i.test(ident)){\n                tt = Tokens.FREQ;\n            } else if (/^dpi$|^dpcm$/i.test(ident)){\n                tt = Tokens.RESOLUTION;\n            } else {\n                tt = Tokens.DIMENSION;\n            }\n\n        } else if (c == \"%\"){\n            value += reader.read();\n            tt = Tokens.PERCENTAGE;\n        }\n\n        return this.createToken(tt, value, startLine, startCol);\n    },\n    stringToken: function(first, startLine, startCol){\n        var delim   = first,\n            string  = first,\n            reader  = this._reader,\n            prev    = first,\n            tt      = Tokens.STRING,\n            c       = reader.read();\n\n        while(c){\n            string += c;\n            if (c == delim && prev != \"\\\\\"){\n                break;\n            }\n            if (isNewLine(reader.peek()) && c != \"\\\\\"){\n                tt = Tokens.INVALID;\n                break;\n            }\n            prev = c;\n            c = reader.read();\n        }\n        if (c === null){\n            tt = Tokens.INVALID;\n        }\n\n        return this.createToken(tt, string, startLine, startCol);\n    },\n\n    unicodeRangeToken: function(first, startLine, startCol){\n        var reader  = this._reader,\n            value   = first,\n            temp,\n            tt      = Tokens.CHAR;\n        if (reader.peek() == \"+\"){\n            reader.mark();\n            value += reader.read();\n            value += this.readUnicodeRangePart(true);\n            if (value.length == 2){\n                reader.reset();\n            } else {\n\n                tt = Tokens.UNICODE_RANGE;\n                if (value.indexOf(\"?\") == -1){\n\n                    if (reader.peek() == \"-\"){\n                        reader.mark();\n                        temp = reader.read();\n                        temp += this.readUnicodeRangePart(false);\n                        if (temp.length == 1){\n                            reader.reset();\n                        } else {\n                            value += temp;\n                        }\n                    }\n\n                }\n            }\n        }\n\n        return this.createToken(tt, value, startLine, startCol);\n    },\n    whitespaceToken: function(first, startLine, startCol){\n        var reader  = this._reader,\n            value   = first + this.readWhitespace();\n        return this.createToken(Tokens.S, value, startLine, startCol);\n    },\n\n    readUnicodeRangePart: function(allowQuestionMark){\n        var reader  = this._reader,\n            part = \"\",\n            c       = reader.peek();\n        while(isHexDigit(c) && part.length < 6){\n            reader.read();\n            part += c;\n            c = reader.peek();\n        }\n        if (allowQuestionMark){\n            while(c == \"?\" && part.length < 6){\n                reader.read();\n                part += c;\n                c = reader.peek();\n            }\n        }\n\n        return part;\n    },\n\n    readWhitespace: function(){\n        var reader  = this._reader,\n            whitespace = \"\",\n            c       = reader.peek();\n\n        while(isWhitespace(c)){\n            reader.read();\n            whitespace += c;\n            c = reader.peek();\n        }\n\n        return whitespace;\n    },\n    readNumber: function(first){\n        var reader  = this._reader,\n            number  = first,\n            hasDot  = (first == \".\"),\n            c       = reader.peek();\n\n\n        while(c){\n            if (isDigit(c)){\n                number += reader.read();\n            } else if (c == \".\"){\n                if (hasDot){\n                    break;\n                } else {\n                    hasDot = true;\n                    number += reader.read();\n                }\n            } else {\n                break;\n            }\n\n            c = reader.peek();\n        }\n\n        return number;\n    },\n    readString: function(){\n        var reader  = this._reader,\n            delim   = reader.read(),\n            string  = delim,\n            prev    = delim,\n            c       = reader.peek();\n\n        while(c){\n            c = reader.read();\n            string += c;\n            if (c == delim && prev != \"\\\\\"){\n                break;\n            }\n            if (isNewLine(reader.peek()) && c != \"\\\\\"){\n                string = \"\";\n                break;\n            }\n            prev = c;\n            c = reader.peek();\n        }\n        if (c === null){\n            string = \"\";\n        }\n\n        return string;\n    },\n    readURI: function(first){\n        var reader  = this._reader,\n            uri     = first,\n            inner   = \"\",\n            c       = reader.peek();\n\n        reader.mark();\n        while(c && isWhitespace(c)){\n            reader.read();\n            c = reader.peek();\n        }\n        if (c == \"'\" || c == \"\\\"\"){\n            inner = this.readString();\n        } else {\n            inner = this.readURL();\n        }\n\n        c = reader.peek();\n        while(c && isWhitespace(c)){\n            reader.read();\n            c = reader.peek();\n        }\n        if (inner === \"\" || c != \")\"){\n            uri = first;\n            reader.reset();\n        } else {\n            uri += inner + reader.read();\n        }\n\n        return uri;\n    },\n    readURL: function(){\n        var reader  = this._reader,\n            url     = \"\",\n            c       = reader.peek();\n        while (/^[!#$%&\\\\*-~]$/.test(c)){\n            url += reader.read();\n            c = reader.peek();\n        }\n\n        return url;\n\n    },\n    readName: function(first){\n        var reader  = this._reader,\n            ident   = first || \"\",\n            c       = reader.peek();\n\n        while(true){\n            if (c == \"\\\\\"){\n                ident += this.readEscape(reader.read());\n                c = reader.peek();\n            } else if(c && isNameChar(c)){\n                ident += reader.read();\n                c = reader.peek();\n            } else {\n                break;\n            }\n        }\n\n        return ident;\n    },\n\n    readEscape: function(first){\n        var reader  = this._reader,\n            cssEscape = first || \"\",\n            i       = 0,\n            c       = reader.peek();\n\n        if (isHexDigit(c)){\n            do {\n                cssEscape += reader.read();\n                c = reader.peek();\n            } while(c && isHexDigit(c) && ++i < 6);\n        }\n\n        if (cssEscape.length == 3 && /\\s/.test(c) ||\n            cssEscape.length == 7 || cssEscape.length == 1){\n                reader.read();\n        } else {\n            c = \"\";\n        }\n\n        return cssEscape + c;\n    },\n\n    readComment: function(first){\n        var reader  = this._reader,\n            comment = first || \"\",\n            c       = reader.read();\n\n        if (c == \"*\"){\n            while(c){\n                comment += c;\n                if (comment.length > 2 && c == \"*\" && reader.peek() == \"/\"){\n                    comment += reader.read();\n                    break;\n                }\n\n                c = reader.read();\n            }\n\n            return comment;\n        } else {\n            return \"\";\n        }\n\n    }\n});\n\nvar Tokens  = [\n    { name: \"CDO\"},\n    { name: \"CDC\"},\n    { name: \"S\", whitespace: true/*, channel: \"ws\"*/},\n    { name: \"COMMENT\", comment: true, hide: true, channel: \"comment\" },\n    { name: \"INCLUDES\", text: \"~=\"},\n    { name: \"DASHMATCH\", text: \"|=\"},\n    { name: \"PREFIXMATCH\", text: \"^=\"},\n    { name: \"SUFFIXMATCH\", text: \"$=\"},\n    { name: \"SUBSTRINGMATCH\", text: \"*=\"},\n    { name: \"STRING\"},\n    { name: \"IDENT\"},\n    { name: \"HASH\"},\n    { name: \"IMPORT_SYM\", text: \"@import\"},\n    { name: \"PAGE_SYM\", text: \"@page\"},\n    { name: \"MEDIA_SYM\", text: \"@media\"},\n    { name: \"FONT_FACE_SYM\", text: \"@font-face\"},\n    { name: \"CHARSET_SYM\", text: \"@charset\"},\n    { name: \"NAMESPACE_SYM\", text: \"@namespace\"},\n    { name: \"VIEWPORT_SYM\", text: [\"@viewport\", \"@-ms-viewport\"]},\n    { name: \"UNKNOWN_SYM\" },\n    { name: \"KEYFRAMES_SYM\", text: [ \"@keyframes\", \"@-webkit-keyframes\", \"@-moz-keyframes\", \"@-o-keyframes\" ] },\n    { name: \"IMPORTANT_SYM\"},\n    { name: \"LENGTH\"},\n    { name: \"ANGLE\"},\n    { name: \"TIME\"},\n    { name: \"FREQ\"},\n    { name: \"DIMENSION\"},\n    { name: \"PERCENTAGE\"},\n    { name: \"NUMBER\"},\n    { name: \"URI\"},\n    { name: \"FUNCTION\"},\n    { name: \"UNICODE_RANGE\"},\n    { name: \"INVALID\"},\n    { name: \"PLUS\", text: \"+\" },\n    { name: \"GREATER\", text: \">\"},\n    { name: \"COMMA\", text: \",\"},\n    { name: \"TILDE\", text: \"~\"},\n    { name: \"NOT\"},\n    { name: \"TOPLEFTCORNER_SYM\", text: \"@top-left-corner\"},\n    { name: \"TOPLEFT_SYM\", text: \"@top-left\"},\n    { name: \"TOPCENTER_SYM\", text: \"@top-center\"},\n    { name: \"TOPRIGHT_SYM\", text: \"@top-right\"},\n    { name: \"TOPRIGHTCORNER_SYM\", text: \"@top-right-corner\"},\n    { name: \"BOTTOMLEFTCORNER_SYM\", text: \"@bottom-left-corner\"},\n    { name: \"BOTTOMLEFT_SYM\", text: \"@bottom-left\"},\n    { name: \"BOTTOMCENTER_SYM\", text: \"@bottom-center\"},\n    { name: \"BOTTOMRIGHT_SYM\", text: \"@bottom-right\"},\n    { name: \"BOTTOMRIGHTCORNER_SYM\", text: \"@bottom-right-corner\"},\n    { name: \"LEFTTOP_SYM\", text: \"@left-top\"},\n    { name: \"LEFTMIDDLE_SYM\", text: \"@left-middle\"},\n    { name: \"LEFTBOTTOM_SYM\", text: \"@left-bottom\"},\n    { name: \"RIGHTTOP_SYM\", text: \"@right-top\"},\n    { name: \"RIGHTMIDDLE_SYM\", text: \"@right-middle\"},\n    { name: \"RIGHTBOTTOM_SYM\", text: \"@right-bottom\"},\n    { name: \"RESOLUTION\", state: \"media\"},\n    { name: \"IE_FUNCTION\" },\n    { name: \"CHAR\" },\n    {\n        name: \"PIPE\",\n        text: \"|\"\n    },\n    {\n        name: \"SLASH\",\n        text: \"/\"\n    },\n    {\n        name: \"MINUS\",\n        text: \"-\"\n    },\n    {\n        name: \"STAR\",\n        text: \"*\"\n    },\n\n    {\n        name: \"LBRACE\",\n        endChar: \"}\",\n        text: \"{\"\n    },\n    {\n        name: \"RBRACE\",\n        text: \"}\"\n    },\n    {\n        name: \"LBRACKET\",\n        endChar: \"]\",\n        text: \"[\"\n    },\n    {\n        name: \"RBRACKET\",\n        text: \"]\"\n    },\n    {\n        name: \"EQUALS\",\n        text: \"=\"\n    },\n    {\n        name: \"COLON\",\n        text: \":\"\n    },\n    {\n        name: \"SEMICOLON\",\n        text: \";\"\n    },\n\n    {\n        name: \"LPAREN\",\n        endChar: \")\",\n        text: \"(\"\n    },\n    {\n        name: \"RPAREN\",\n        text: \")\"\n    },\n    {\n        name: \"DOT\",\n        text: \".\"\n    }\n];\n\n(function(){\n\n    var nameMap = [],\n        typeMap = {};\n\n    Tokens.UNKNOWN = -1;\n    Tokens.unshift({name:\"EOF\"});\n    for (var i=0, len = Tokens.length; i < len; i++){\n        nameMap.push(Tokens[i].name);\n        Tokens[Tokens[i].name] = i;\n        if (Tokens[i].text){\n            if (Tokens[i].text instanceof Array){\n                for (var j=0; j < Tokens[i].text.length; j++){\n                    typeMap[Tokens[i].text[j]] = i;\n                }\n            } else {\n                typeMap[Tokens[i].text] = i;\n            }\n        }\n    }\n\n    Tokens.name = function(tt){\n        return nameMap[tt];\n    };\n\n    Tokens.type = function(c){\n        return typeMap[c] || -1;\n    };\n\n})();\nvar Validation = {\n\n    validate: function(property, value){\n        var name        = property.toString().toLowerCase(),\n            parts       = value.parts,\n            expression  = new PropertyValueIterator(value),\n            spec        = Properties[name],\n            part,\n            valid,\n            j, count,\n            msg,\n            types,\n            last,\n            literals,\n            max, multi, group;\n\n        if (!spec) {\n            if (name.indexOf(\"-\") !== 0){    //vendor prefixed are ok\n                throw new ValidationError(\"Unknown property '\" + property + \"'.\", property.line, property.col);\n            }\n        } else if (typeof spec != \"number\"){\n            if (typeof spec == \"string\"){\n                if (spec.indexOf(\"||\") > -1) {\n                    this.groupProperty(spec, expression);\n                } else {\n                    this.singleProperty(spec, expression, 1);\n                }\n\n            } else if (spec.multi) {\n                this.multiProperty(spec.multi, expression, spec.comma, spec.max || Infinity);\n            } else if (typeof spec == \"function\") {\n                spec(expression);\n            }\n\n        }\n\n    },\n\n    singleProperty: function(types, expression, max, partial) {\n\n        var result      = false,\n            value       = expression.value,\n            count       = 0,\n            part;\n\n        while (expression.hasNext() && count < max) {\n            result = ValidationTypes.isAny(expression, types);\n            if (!result) {\n                break;\n            }\n            count++;\n        }\n\n        if (!result) {\n            if (expression.hasNext() && !expression.isFirst()) {\n                part = expression.peek();\n                throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n            } else {\n                 throw new ValidationError(\"Expected (\" + types + \") but found '\" + value + \"'.\", value.line, value.col);\n            }\n        } else if (expression.hasNext()) {\n            part = expression.next();\n            throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n        }\n\n    },\n\n    multiProperty: function (types, expression, comma, max) {\n\n        var result      = false,\n            value       = expression.value,\n            count       = 0,\n            sep         = false,\n            part;\n\n        while(expression.hasNext() && !result && count < max) {\n            if (ValidationTypes.isAny(expression, types)) {\n                count++;\n                if (!expression.hasNext()) {\n                    result = true;\n\n                } else if (comma) {\n                    if (expression.peek() == \",\") {\n                        part = expression.next();\n                    } else {\n                        break;\n                    }\n                }\n            } else {\n                break;\n\n            }\n        }\n\n        if (!result) {\n            if (expression.hasNext() && !expression.isFirst()) {\n                part = expression.peek();\n                throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n            } else {\n                part = expression.previous();\n                if (comma && part == \",\") {\n                    throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n                } else {\n                    throw new ValidationError(\"Expected (\" + types + \") but found '\" + value + \"'.\", value.line, value.col);\n                }\n            }\n\n        } else if (expression.hasNext()) {\n            part = expression.next();\n            throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n        }\n\n    },\n\n    groupProperty: function (types, expression, comma) {\n\n        var result      = false,\n            value       = expression.value,\n            typeCount   = types.split(\"||\").length,\n            groups      = { count: 0 },\n            partial     = false,\n            name,\n            part;\n\n        while(expression.hasNext() && !result) {\n            name = ValidationTypes.isAnyOfGroup(expression, types);\n            if (name) {\n                if (groups[name]) {\n                    break;\n                } else {\n                    groups[name] = 1;\n                    groups.count++;\n                    partial = true;\n\n                    if (groups.count == typeCount || !expression.hasNext()) {\n                        result = true;\n                    }\n                }\n            } else {\n                break;\n            }\n        }\n\n        if (!result) {\n            if (partial && expression.hasNext()) {\n                    part = expression.peek();\n                    throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n            } else {\n                throw new ValidationError(\"Expected (\" + types + \") but found '\" + value + \"'.\", value.line, value.col);\n            }\n        } else if (expression.hasNext()) {\n            part = expression.next();\n            throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n        }\n    }\n\n\n\n};\nfunction ValidationError(message, line, col){\n    this.col = col;\n    this.line = line;\n    this.message = message;\n\n}\nValidationError.prototype = new Error();\nvar ValidationTypes = {\n\n    isLiteral: function (part, literals) {\n        var text = part.text.toString().toLowerCase(),\n            args = literals.split(\" | \"),\n            i, len, found = false;\n\n        for (i=0,len=args.length; i < len && !found; i++){\n            if (text == args[i].toLowerCase()){\n                found = true;\n            }\n        }\n\n        return found;\n    },\n\n    isSimple: function(type) {\n        return !!this.simple[type];\n    },\n\n    isComplex: function(type) {\n        return !!this.complex[type];\n    },\n    isAny: function (expression, types) {\n        var args = types.split(\" | \"),\n            i, len, found = false;\n\n        for (i=0,len=args.length; i < len && !found && expression.hasNext(); i++){\n            found = this.isType(expression, args[i]);\n        }\n\n        return found;\n    },\n    isAnyOfGroup: function(expression, types) {\n        var args = types.split(\" || \"),\n            i, len, found = false;\n\n        for (i=0,len=args.length; i < len && !found; i++){\n            found = this.isType(expression, args[i]);\n        }\n\n        return found ? args[i-1] : false;\n    },\n    isType: function (expression, type) {\n        var part = expression.peek(),\n            result = false;\n\n        if (type.charAt(0) != \"<\") {\n            result = this.isLiteral(part, type);\n            if (result) {\n                expression.next();\n            }\n        } else if (this.simple[type]) {\n            result = this.simple[type](part);\n            if (result) {\n                expression.next();\n            }\n        } else {\n            result = this.complex[type](expression);\n        }\n\n        return result;\n    },\n\n\n\n    simple: {\n\n        \"<absolute-size>\": function(part){\n            return ValidationTypes.isLiteral(part, \"xx-small | x-small | small | medium | large | x-large | xx-large\");\n        },\n\n        \"<attachment>\": function(part){\n            return ValidationTypes.isLiteral(part, \"scroll | fixed | local\");\n        },\n\n        \"<attr>\": function(part){\n            return part.type == \"function\" && part.name == \"attr\";\n        },\n\n        \"<bg-image>\": function(part){\n            return this[\"<image>\"](part) || this[\"<gradient>\"](part) ||  part == \"none\";\n        },\n\n        \"<gradient>\": function(part) {\n            return part.type == \"function\" && /^(?:\\-(?:ms|moz|o|webkit)\\-)?(?:repeating\\-)?(?:radial\\-|linear\\-)?gradient/i.test(part);\n        },\n\n        \"<box>\": function(part){\n            return ValidationTypes.isLiteral(part, \"padding-box | border-box | content-box\");\n        },\n\n        \"<content>\": function(part){\n            return part.type == \"function\" && part.name == \"content\";\n        },\n\n        \"<relative-size>\": function(part){\n            return ValidationTypes.isLiteral(part, \"smaller | larger\");\n        },\n        \"<ident>\": function(part){\n            return part.type == \"identifier\";\n        },\n\n        \"<length>\": function(part){\n            if (part.type == \"function\" && /^(?:\\-(?:ms|moz|o|webkit)\\-)?calc/i.test(part)){\n                return true;\n            }else{\n                return part.type == \"length\" || part.type == \"number\" || part.type == \"integer\" || part == \"0\";\n            }\n        },\n\n        \"<color>\": function(part){\n            return part.type == \"color\" || part == \"transparent\";\n        },\n\n        \"<number>\": function(part){\n            return part.type == \"number\" || this[\"<integer>\"](part);\n        },\n\n        \"<integer>\": function(part){\n            return part.type == \"integer\";\n        },\n\n        \"<line>\": function(part){\n            return part.type == \"integer\";\n        },\n\n        \"<angle>\": function(part){\n            return part.type == \"angle\";\n        },\n\n        \"<uri>\": function(part){\n            return part.type == \"uri\";\n        },\n\n        \"<image>\": function(part){\n            return this[\"<uri>\"](part);\n        },\n\n        \"<percentage>\": function(part){\n            return part.type == \"percentage\" || part == \"0\";\n        },\n\n        \"<border-width>\": function(part){\n            return this[\"<length>\"](part) || ValidationTypes.isLiteral(part, \"thin | medium | thick\");\n        },\n\n        \"<border-style>\": function(part){\n            return ValidationTypes.isLiteral(part, \"none | hidden | dotted | dashed | solid | double | groove | ridge | inset | outset\");\n        },\n\n        \"<content-sizing>\": function(part){ // http://www.w3.org/TR/css3-sizing/#width-height-keywords\n            return ValidationTypes.isLiteral(part, \"fill-available | -moz-available | -webkit-fill-available | max-content | -moz-max-content | -webkit-max-content | min-content | -moz-min-content | -webkit-min-content | fit-content | -moz-fit-content | -webkit-fit-content\");\n        },\n\n        \"<margin-width>\": function(part){\n            return this[\"<length>\"](part) || this[\"<percentage>\"](part) || ValidationTypes.isLiteral(part, \"auto\");\n        },\n\n        \"<padding-width>\": function(part){\n            return this[\"<length>\"](part) || this[\"<percentage>\"](part);\n        },\n\n        \"<shape>\": function(part){\n            return part.type == \"function\" && (part.name == \"rect\" || part.name == \"inset-rect\");\n        },\n\n        \"<time>\": function(part) {\n            return part.type == \"time\";\n        },\n\n        \"<flex-grow>\": function(part){\n            return this[\"<number>\"](part);\n        },\n\n        \"<flex-shrink>\": function(part){\n            return this[\"<number>\"](part);\n        },\n\n        \"<width>\": function(part){\n            return this[\"<margin-width>\"](part);\n        },\n\n        \"<flex-basis>\": function(part){\n            return this[\"<width>\"](part);\n        },\n\n        \"<flex-direction>\": function(part){\n            return ValidationTypes.isLiteral(part, \"row | row-reverse | column | column-reverse\");\n        },\n\n        \"<flex-wrap>\": function(part){\n            return ValidationTypes.isLiteral(part, \"nowrap | wrap | wrap-reverse\");\n        }\n    },\n\n    complex: {\n\n        \"<bg-position>\": function(expression){\n            var types   = this,\n                result  = false,\n                numeric = \"<percentage> | <length>\",\n                xDir    = \"left | right\",\n                yDir    = \"top | bottom\",\n                count = 0,\n                hasNext = function() {\n                    return expression.hasNext() && expression.peek() != \",\";\n                };\n\n            while (expression.peek(count) && expression.peek(count) != \",\") {\n                count++;\n            }\n\n            if (count < 3) {\n                if (ValidationTypes.isAny(expression, xDir + \" | center | \" + numeric)) {\n                        result = true;\n                        ValidationTypes.isAny(expression, yDir + \" | center | \" + numeric);\n                } else if (ValidationTypes.isAny(expression, yDir)) {\n                        result = true;\n                        ValidationTypes.isAny(expression, xDir + \" | center\");\n                }\n            } else {\n                if (ValidationTypes.isAny(expression, xDir)) {\n                    if (ValidationTypes.isAny(expression, yDir)) {\n                        result = true;\n                        ValidationTypes.isAny(expression, numeric);\n                    } else if (ValidationTypes.isAny(expression, numeric)) {\n                        if (ValidationTypes.isAny(expression, yDir)) {\n                            result = true;\n                            ValidationTypes.isAny(expression, numeric);\n                        } else if (ValidationTypes.isAny(expression, \"center\")) {\n                            result = true;\n                        }\n                    }\n                } else if (ValidationTypes.isAny(expression, yDir)) {\n                    if (ValidationTypes.isAny(expression, xDir)) {\n                        result = true;\n                        ValidationTypes.isAny(expression, numeric);\n                    } else if (ValidationTypes.isAny(expression, numeric)) {\n                        if (ValidationTypes.isAny(expression, xDir)) {\n                                result = true;\n                                ValidationTypes.isAny(expression, numeric);\n                        } else if (ValidationTypes.isAny(expression, \"center\")) {\n                            result = true;\n                        }\n                    }\n                } else if (ValidationTypes.isAny(expression, \"center\")) {\n                    if (ValidationTypes.isAny(expression, xDir + \" | \" + yDir)) {\n                        result = true;\n                        ValidationTypes.isAny(expression, numeric);\n                    }\n                }\n            }\n\n            return result;\n        },\n\n        \"<bg-size>\": function(expression){\n            var types   = this,\n                result  = false,\n                numeric = \"<percentage> | <length> | auto\",\n                part,\n                i, len;\n\n            if (ValidationTypes.isAny(expression, \"cover | contain\")) {\n                result = true;\n            } else if (ValidationTypes.isAny(expression, numeric)) {\n                result = true;\n                ValidationTypes.isAny(expression, numeric);\n            }\n\n            return result;\n        },\n\n        \"<repeat-style>\": function(expression){\n            var result  = false,\n                values  = \"repeat | space | round | no-repeat\",\n                part;\n\n            if (expression.hasNext()){\n                part = expression.next();\n\n                if (ValidationTypes.isLiteral(part, \"repeat-x | repeat-y\")) {\n                    result = true;\n                } else if (ValidationTypes.isLiteral(part, values)) {\n                    result = true;\n\n                    if (expression.hasNext() && ValidationTypes.isLiteral(expression.peek(), values)) {\n                        expression.next();\n                    }\n                }\n            }\n\n            return result;\n\n        },\n\n        \"<shadow>\": function(expression) {\n            var result  = false,\n                count   = 0,\n                inset   = false,\n                color   = false,\n                part;\n\n            if (expression.hasNext()) {\n\n                if (ValidationTypes.isAny(expression, \"inset\")){\n                    inset = true;\n                }\n\n                if (ValidationTypes.isAny(expression, \"<color>\")) {\n                    color = true;\n                }\n\n                while (ValidationTypes.isAny(expression, \"<length>\") && count < 4) {\n                    count++;\n                }\n\n\n                if (expression.hasNext()) {\n                    if (!color) {\n                        ValidationTypes.isAny(expression, \"<color>\");\n                    }\n\n                    if (!inset) {\n                        ValidationTypes.isAny(expression, \"inset\");\n                    }\n\n                }\n\n                result = (count >= 2 && count <= 4);\n\n            }\n\n            return result;\n        },\n\n        \"<x-one-radius>\": function(expression) {\n            var result  = false,\n                simple = \"<length> | <percentage> | inherit\";\n\n            if (ValidationTypes.isAny(expression, simple)){\n                result = true;\n                ValidationTypes.isAny(expression, simple);\n            }\n\n            return result;\n        },\n\n        \"<flex>\": function(expression) {\n            var part,\n                result = false;\n            if (ValidationTypes.isAny(expression, \"none | inherit\")) {\n                result = true;\n            } else {\n                if (ValidationTypes.isType(expression, \"<flex-grow>\")) {\n                    if (expression.peek()) {\n                        if (ValidationTypes.isType(expression, \"<flex-shrink>\")) {\n                            if (expression.peek()) {\n                                result = ValidationTypes.isType(expression, \"<flex-basis>\");\n                            } else {\n                                result = true;\n                            }\n                        } else if (ValidationTypes.isType(expression, \"<flex-basis>\")) {\n                            result = expression.peek() === null;\n                        }\n                    } else {\n                        result = true;\n                    }\n                } else if (ValidationTypes.isType(expression, \"<flex-basis>\")) {\n                    result = true;\n                }\n            }\n\n            if (!result) {\n                part = expression.peek();\n                throw new ValidationError(\"Expected (none | [ <flex-grow> <flex-shrink>? || <flex-basis> ]) but found '\" + expression.value.text + \"'.\", part.line, part.col);\n            }\n\n            return result;\n        }\n    }\n};\n\nparserlib.css = {\nColors              :Colors,\nCombinator          :Combinator,\nParser              :Parser,\nPropertyName        :PropertyName,\nPropertyValue       :PropertyValue,\nPropertyValuePart   :PropertyValuePart,\nMediaFeature        :MediaFeature,\nMediaQuery          :MediaQuery,\nSelector            :Selector,\nSelectorPart        :SelectorPart,\nSelectorSubPart     :SelectorSubPart,\nSpecificity         :Specificity,\nTokenStream         :TokenStream,\nTokens              :Tokens,\nValidationError     :ValidationError\n};\n})();\n\n(function(){\nfor(var prop in parserlib){\nexports[prop] = parserlib[prop];\n}\n})();\n\n\nfunction objectToString(o) {\n  return Object.prototype.toString.call(o);\n}\nvar util = {\n  isArray: function (ar) {\n    return Array.isArray(ar) || (typeof ar === 'object' && objectToString(ar) === '[object Array]');\n  },\n  isDate: function (d) {\n    return typeof d === 'object' && objectToString(d) === '[object Date]';\n  },\n  isRegExp: function (re) {\n    return typeof re === 'object' && objectToString(re) === '[object RegExp]';\n  },\n  getRegExpFlags: function (re) {\n    var flags = '';\n    re.global && (flags += 'g');\n    re.ignoreCase && (flags += 'i');\n    re.multiline && (flags += 'm');\n    return flags;\n  }\n};\n\n\nif (typeof module === 'object')\n  module.exports = clone;\n\nfunction clone(parent, circular, depth, prototype) {\n  var allParents = [];\n  var allChildren = [];\n\n  var useBuffer = typeof Buffer != 'undefined';\n\n  if (typeof circular == 'undefined')\n    circular = true;\n\n  if (typeof depth == 'undefined')\n    depth = Infinity;\n  function _clone(parent, depth) {\n    if (parent === null)\n      return null;\n\n    if (depth == 0)\n      return parent;\n\n    var child;\n    if (typeof parent != 'object') {\n      return parent;\n    }\n\n    if (util.isArray(parent)) {\n      child = [];\n    } else if (util.isRegExp(parent)) {\n      child = new RegExp(parent.source, util.getRegExpFlags(parent));\n      if (parent.lastIndex) child.lastIndex = parent.lastIndex;\n    } else if (util.isDate(parent)) {\n      child = new Date(parent.getTime());\n    } else if (useBuffer && Buffer.isBuffer(parent)) {\n      child = new Buffer(parent.length);\n      parent.copy(child);\n      return child;\n    } else {\n      if (typeof prototype == 'undefined') child = Object.create(Object.getPrototypeOf(parent));\n      else child = Object.create(prototype);\n    }\n\n    if (circular) {\n      var index = allParents.indexOf(parent);\n\n      if (index != -1) {\n        return allChildren[index];\n      }\n      allParents.push(parent);\n      allChildren.push(child);\n    }\n\n    for (var i in parent) {\n      child[i] = _clone(parent[i], depth - 1);\n    }\n\n    return child;\n  }\n\n  return _clone(parent, depth);\n}\nclone.clonePrototype = function(parent) {\n  if (parent === null)\n    return null;\n\n  var c = function () {};\n  c.prototype = parent;\n  return new c();\n};\n\nvar CSSLint = (function(){\n\n    var rules           = [],\n        formatters      = [],\n        embeddedRuleset = /\\/\\*csslint([^\\*]*)\\*\\//,\n        api             = new parserlib.util.EventTarget();\n\n    api.version = \"@VERSION@\";\n    api.addRule = function(rule){\n        rules.push(rule);\n        rules[rule.id] = rule;\n    };\n    api.clearRules = function(){\n        rules = [];\n    };\n    api.getRules = function(){\n        return [].concat(rules).sort(function(a,b){\n            return a.id > b.id ? 1 : 0;\n        });\n    };\n    api.getRuleset = function() {\n        var ruleset = {},\n            i = 0,\n            len = rules.length;\n\n        while (i < len){\n            ruleset[rules[i++].id] = 1;    //by default, everything is a warning\n        }\n\n        return ruleset;\n    };\n    function applyEmbeddedRuleset(text, ruleset){\n        var valueMap,\n            embedded = text && text.match(embeddedRuleset),\n            rules = embedded && embedded[1];\n\n        if (rules) {\n            valueMap = {\n                \"true\": 2,  // true is error\n                \"\": 1,      // blank is warning\n                \"false\": 0, // false is ignore\n\n                \"2\": 2,     // explicit error\n                \"1\": 1,     // explicit warning\n                \"0\": 0      // explicit ignore\n            };\n\n            rules.toLowerCase().split(\",\").forEach(function(rule){\n                var pair = rule.split(\":\"),\n                    property = pair[0] || \"\",\n                    value = pair[1] || \"\";\n\n                ruleset[property.trim()] = valueMap[value.trim()];\n            });\n        }\n\n        return ruleset;\n    }\n    api.addFormatter = function(formatter) {\n        formatters[formatter.id] = formatter;\n    };\n    api.getFormatter = function(formatId){\n        return formatters[formatId];\n    };\n    api.format = function(results, filename, formatId, options) {\n        var formatter = this.getFormatter(formatId),\n            result = null;\n\n        if (formatter){\n            result = formatter.startFormat();\n            result += formatter.formatResults(results, filename, options || {});\n            result += formatter.endFormat();\n        }\n\n        return result;\n    };\n    api.hasFormat = function(formatId){\n        return formatters.hasOwnProperty(formatId);\n    };\n    api.verify = function(text, ruleset){\n\n        var i = 0,\n            reporter,\n            lines,\n            report,\n            parser = new parserlib.css.Parser({ starHack: true, ieFilters: true,\n                                                underscoreHack: true, strict: false });\n        lines = text.replace(/\\n\\r?/g, \"$split$\").split(\"$split$\");\n\n        if (!ruleset){\n            ruleset = this.getRuleset();\n        }\n\n        if (embeddedRuleset.test(text)){\n            ruleset = clone(ruleset);\n            ruleset = applyEmbeddedRuleset(text, ruleset);\n        }\n\n        reporter = new Reporter(lines, ruleset);\n\n        ruleset.errors = 2;       //always report parsing errors as errors\n        for (i in ruleset){\n            if(ruleset.hasOwnProperty(i) && ruleset[i]){\n                if (rules[i]){\n                    rules[i].init(parser, reporter);\n                }\n            }\n        }\n        try {\n            parser.parse(text);\n        } catch (ex) {\n            reporter.error(\"Fatal error, cannot continue: \" + ex.message, ex.line, ex.col, {});\n        }\n\n        report = {\n            messages    : reporter.messages,\n            stats       : reporter.stats,\n            ruleset     : reporter.ruleset\n        };\n        report.messages.sort(function (a, b){\n            if (a.rollup && !b.rollup){\n                return 1;\n            } else if (!a.rollup && b.rollup){\n                return -1;\n            } else {\n                return a.line - b.line;\n            }\n        });\n\n        return report;\n    };\n\n    return api;\n\n})();\nfunction Reporter(lines, ruleset){\n    this.messages = [];\n    this.stats = [];\n    this.lines = lines;\n    this.ruleset = ruleset;\n}\n\nReporter.prototype = {\n    constructor: Reporter,\n    error: function(message, line, col, rule){\n        this.messages.push({\n            type    : \"error\",\n            line    : line,\n            col     : col,\n            message : message,\n            evidence: this.lines[line-1],\n            rule    : rule || {}\n        });\n    },\n    warn: function(message, line, col, rule){\n        this.report(message, line, col, rule);\n    },\n    report: function(message, line, col, rule){\n        this.messages.push({\n            type    : this.ruleset[rule.id] === 2 ? \"error\" : \"warning\",\n            line    : line,\n            col     : col,\n            message : message,\n            evidence: this.lines[line-1],\n            rule    : rule\n        });\n    },\n    info: function(message, line, col, rule){\n        this.messages.push({\n            type    : \"info\",\n            line    : line,\n            col     : col,\n            message : message,\n            evidence: this.lines[line-1],\n            rule    : rule\n        });\n    },\n    rollupError: function(message, rule){\n        this.messages.push({\n            type    : \"error\",\n            rollup  : true,\n            message : message,\n            rule    : rule\n        });\n    },\n    rollupWarn: function(message, rule){\n        this.messages.push({\n            type    : \"warning\",\n            rollup  : true,\n            message : message,\n            rule    : rule\n        });\n    },\n    stat: function(name, value){\n        this.stats[name] = value;\n    }\n};\nCSSLint._Reporter = Reporter;\nCSSLint.Util = {\n    mix: function(receiver, supplier){\n        var prop;\n\n        for (prop in supplier){\n            if (supplier.hasOwnProperty(prop)){\n                receiver[prop] = supplier[prop];\n            }\n        }\n\n        return prop;\n    },\n    indexOf: function(values, value){\n        if (values.indexOf){\n            return values.indexOf(value);\n        } else {\n            for (var i=0, len=values.length; i < len; i++){\n                if (values[i] === value){\n                    return i;\n                }\n            }\n            return -1;\n        }\n    },\n    forEach: function(values, func) {\n        if (values.forEach){\n            return values.forEach(func);\n        } else {\n            for (var i=0, len=values.length; i < len; i++){\n                func(values[i], i, values);\n            }\n        }\n    }\n};\n\nCSSLint.addRule({\n    id: \"adjoining-classes\",\n    name: \"Disallow adjoining classes\",\n    desc: \"Don't use adjoining classes.\",\n    browsers: \"IE6\",\n    init: function(parser, reporter){\n        var rule = this;\n        parser.addListener(\"startrule\", function(event){\n            var selectors = event.selectors,\n                selector,\n                part,\n                modifier,\n                classCount,\n                i, j, k;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n                for (j=0; j < selector.parts.length; j++){\n                    part = selector.parts[j];\n                    if (part.type === parser.SELECTOR_PART_TYPE){\n                        classCount = 0;\n                        for (k=0; k < part.modifiers.length; k++){\n                            modifier = part.modifiers[k];\n                            if (modifier.type === \"class\"){\n                                classCount++;\n                            }\n                            if (classCount > 1){\n                                reporter.report(\"Don't use adjoining classes.\", part.line, part.col, rule);\n                            }\n                        }\n                    }\n                }\n            }\n        });\n    }\n\n});\nCSSLint.addRule({\n    id: \"box-model\",\n    name: \"Beware of broken box size\",\n    desc: \"Don't use width or height when using padding or border.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            widthProperties = {\n                border: 1,\n                \"border-left\": 1,\n                \"border-right\": 1,\n                padding: 1,\n                \"padding-left\": 1,\n                \"padding-right\": 1\n            },\n            heightProperties = {\n                border: 1,\n                \"border-bottom\": 1,\n                \"border-top\": 1,\n                padding: 1,\n                \"padding-bottom\": 1,\n                \"padding-top\": 1\n            },\n            properties,\n            boxSizing = false;\n\n        function startRule(){\n            properties = {};\n            boxSizing = false;\n        }\n\n        function endRule(){\n            var prop, value;\n\n            if (!boxSizing) {\n                if (properties.height){\n                    for (prop in heightProperties){\n                        if (heightProperties.hasOwnProperty(prop) && properties[prop]){\n                            value = properties[prop].value;\n                            if (!(prop === \"padding\" && value.parts.length === 2 && value.parts[0].value === 0)){\n                                reporter.report(\"Using height with \" + prop + \" can sometimes make elements larger than you expect.\", properties[prop].line, properties[prop].col, rule);\n                            }\n                        }\n                    }\n                }\n\n                if (properties.width){\n                    for (prop in widthProperties){\n                        if (widthProperties.hasOwnProperty(prop) && properties[prop]){\n                            value = properties[prop].value;\n\n                            if (!(prop === \"padding\" && value.parts.length === 2 && value.parts[1].value === 0)){\n                                reporter.report(\"Using width with \" + prop + \" can sometimes make elements larger than you expect.\", properties[prop].line, properties[prop].col, rule);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"startpage\", startRule);\n        parser.addListener(\"startpagemargin\", startRule);\n        parser.addListener(\"startkeyframerule\", startRule);\n\n        parser.addListener(\"property\", function(event){\n            var name = event.property.text.toLowerCase();\n\n            if (heightProperties[name] || widthProperties[name]){\n                if (!/^0\\S*$/.test(event.value) && !(name === \"border\" && event.value.toString() === \"none\")){\n                    properties[name] = { line: event.property.line, col: event.property.col, value: event.value };\n                }\n            } else {\n                if (/^(width|height)/i.test(name) && /^(length|percentage)/.test(event.value.parts[0].type)){\n                    properties[name] = 1;\n                } else if (name === \"box-sizing\") {\n                    boxSizing = true;\n                }\n            }\n\n        });\n\n        parser.addListener(\"endrule\", endRule);\n        parser.addListener(\"endfontface\", endRule);\n        parser.addListener(\"endpage\", endRule);\n        parser.addListener(\"endpagemargin\", endRule);\n        parser.addListener(\"endkeyframerule\", endRule);\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"box-sizing\",\n    name: \"Disallow use of box-sizing\",\n    desc: \"The box-sizing properties isn't supported in IE6 and IE7.\",\n    browsers: \"IE6, IE7\",\n    tags: [\"Compatibility\"],\n    init: function(parser, reporter){\n        var rule = this;\n\n        parser.addListener(\"property\", function(event){\n            var name = event.property.text.toLowerCase();\n\n            if (name === \"box-sizing\"){\n                reporter.report(\"The box-sizing property isn't supported in IE6 and IE7.\", event.line, event.col, rule);\n            }\n        });\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"bulletproof-font-face\",\n    name: \"Use the bulletproof @font-face syntax\",\n    desc: \"Use the bulletproof @font-face syntax to avoid 404's in old IE (http://www.fontspring.com/blog/the-new-bulletproof-font-face-syntax).\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            fontFaceRule = false,\n            firstSrc     = true,\n            ruleFailed    = false,\n            line, col;\n        parser.addListener(\"startfontface\", function(){\n            fontFaceRule = true;\n        });\n\n        parser.addListener(\"property\", function(event){\n            if (!fontFaceRule) {\n                return;\n            }\n\n            var propertyName = event.property.toString().toLowerCase(),\n                value        = event.value.toString();\n            line = event.line;\n            col  = event.col;\n            if (propertyName === \"src\") {\n                var regex = /^\\s?url\\(['\"].+\\.eot\\?.*['\"]\\)\\s*format\\(['\"]embedded-opentype['\"]\\).*$/i;\n                if (!value.match(regex) && firstSrc) {\n                    ruleFailed = true;\n                    firstSrc = false;\n                } else if (value.match(regex) && !firstSrc) {\n                    ruleFailed = false;\n                }\n            }\n\n\n        });\n        parser.addListener(\"endfontface\", function(){\n            fontFaceRule = false;\n\n            if (ruleFailed) {\n                reporter.report(\"@font-face declaration doesn't follow the fontspring bulletproof syntax.\", line, col, rule);\n            }\n        });\n    }\n});\n\nCSSLint.addRule({\n    id: \"compatible-vendor-prefixes\",\n    name: \"Require compatible vendor prefixes\",\n    desc: \"Include all compatible vendor prefixes to reach a wider range of users.\",\n    browsers: \"All\",\n    init: function (parser, reporter) {\n        var rule = this,\n            compatiblePrefixes,\n            properties,\n            prop,\n            variations,\n            prefixed,\n            i,\n            len,\n            inKeyFrame = false,\n            arrayPush = Array.prototype.push,\n            applyTo = [];\n        compatiblePrefixes = {\n            \"animation\"                  : \"webkit moz\",\n            \"animation-delay\"            : \"webkit moz\",\n            \"animation-direction\"        : \"webkit moz\",\n            \"animation-duration\"         : \"webkit moz\",\n            \"animation-fill-mode\"        : \"webkit moz\",\n            \"animation-iteration-count\"  : \"webkit moz\",\n            \"animation-name\"             : \"webkit moz\",\n            \"animation-play-state\"       : \"webkit moz\",\n            \"animation-timing-function\"  : \"webkit moz\",\n            \"appearance\"                 : \"webkit moz\",\n            \"border-end\"                 : \"webkit moz\",\n            \"border-end-color\"           : \"webkit moz\",\n            \"border-end-style\"           : \"webkit moz\",\n            \"border-end-width\"           : \"webkit moz\",\n            \"border-image\"               : \"webkit moz o\",\n            \"border-radius\"              : \"webkit\",\n            \"border-start\"               : \"webkit moz\",\n            \"border-start-color\"         : \"webkit moz\",\n            \"border-start-style\"         : \"webkit moz\",\n            \"border-start-width\"         : \"webkit moz\",\n            \"box-align\"                  : \"webkit moz ms\",\n            \"box-direction\"              : \"webkit moz ms\",\n            \"box-flex\"                   : \"webkit moz ms\",\n            \"box-lines\"                  : \"webkit ms\",\n            \"box-ordinal-group\"          : \"webkit moz ms\",\n            \"box-orient\"                 : \"webkit moz ms\",\n            \"box-pack\"                   : \"webkit moz ms\",\n            \"box-sizing\"                 : \"webkit moz\",\n            \"box-shadow\"                 : \"webkit moz\",\n            \"column-count\"               : \"webkit moz ms\",\n            \"column-gap\"                 : \"webkit moz ms\",\n            \"column-rule\"                : \"webkit moz ms\",\n            \"column-rule-color\"          : \"webkit moz ms\",\n            \"column-rule-style\"          : \"webkit moz ms\",\n            \"column-rule-width\"          : \"webkit moz ms\",\n            \"column-width\"               : \"webkit moz ms\",\n            \"hyphens\"                    : \"epub moz\",\n            \"line-break\"                 : \"webkit ms\",\n            \"margin-end\"                 : \"webkit moz\",\n            \"margin-start\"               : \"webkit moz\",\n            \"marquee-speed\"              : \"webkit wap\",\n            \"marquee-style\"              : \"webkit wap\",\n            \"padding-end\"                : \"webkit moz\",\n            \"padding-start\"              : \"webkit moz\",\n            \"tab-size\"                   : \"moz o\",\n            \"text-size-adjust\"           : \"webkit ms\",\n            \"transform\"                  : \"webkit moz ms o\",\n            \"transform-origin\"           : \"webkit moz ms o\",\n            \"transition\"                 : \"webkit moz o\",\n            \"transition-delay\"           : \"webkit moz o\",\n            \"transition-duration\"        : \"webkit moz o\",\n            \"transition-property\"        : \"webkit moz o\",\n            \"transition-timing-function\" : \"webkit moz o\",\n            \"user-modify\"                : \"webkit moz\",\n            \"user-select\"                : \"webkit moz ms\",\n            \"word-break\"                 : \"epub ms\",\n            \"writing-mode\"               : \"epub ms\"\n        };\n\n\n        for (prop in compatiblePrefixes) {\n            if (compatiblePrefixes.hasOwnProperty(prop)) {\n                variations = [];\n                prefixed = compatiblePrefixes[prop].split(\" \");\n                for (i = 0, len = prefixed.length; i < len; i++) {\n                    variations.push(\"-\" + prefixed[i] + \"-\" + prop);\n                }\n                compatiblePrefixes[prop] = variations;\n                arrayPush.apply(applyTo, variations);\n            }\n        }\n\n        parser.addListener(\"startrule\", function () {\n            properties = [];\n        });\n\n        parser.addListener(\"startkeyframes\", function (event) {\n            inKeyFrame = event.prefix || true;\n        });\n\n        parser.addListener(\"endkeyframes\", function () {\n            inKeyFrame = false;\n        });\n\n        parser.addListener(\"property\", function (event) {\n            var name = event.property;\n            if (CSSLint.Util.indexOf(applyTo, name.text) > -1) {\n                if (!inKeyFrame || typeof inKeyFrame !== \"string\" ||\n                        name.text.indexOf(\"-\" + inKeyFrame + \"-\") !== 0) {\n                    properties.push(name);\n                }\n            }\n        });\n\n        parser.addListener(\"endrule\", function () {\n            if (!properties.length) {\n                return;\n            }\n\n            var propertyGroups = {},\n                i,\n                len,\n                name,\n                prop,\n                variations,\n                value,\n                full,\n                actual,\n                item,\n                propertiesSpecified;\n\n            for (i = 0, len = properties.length; i < len; i++) {\n                name = properties[i];\n\n                for (prop in compatiblePrefixes) {\n                    if (compatiblePrefixes.hasOwnProperty(prop)) {\n                        variations = compatiblePrefixes[prop];\n                        if (CSSLint.Util.indexOf(variations, name.text) > -1) {\n                            if (!propertyGroups[prop]) {\n                                propertyGroups[prop] = {\n                                    full : variations.slice(0),\n                                    actual : [],\n                                    actualNodes: []\n                                };\n                            }\n                            if (CSSLint.Util.indexOf(propertyGroups[prop].actual, name.text) === -1) {\n                                propertyGroups[prop].actual.push(name.text);\n                                propertyGroups[prop].actualNodes.push(name);\n                            }\n                        }\n                    }\n                }\n            }\n\n            for (prop in propertyGroups) {\n                if (propertyGroups.hasOwnProperty(prop)) {\n                    value = propertyGroups[prop];\n                    full = value.full;\n                    actual = value.actual;\n\n                    if (full.length > actual.length) {\n                        for (i = 0, len = full.length; i < len; i++) {\n                            item = full[i];\n                            if (CSSLint.Util.indexOf(actual, item) === -1) {\n                                propertiesSpecified = (actual.length === 1) ? actual[0] : (actual.length === 2) ? actual.join(\" and \") : actual.join(\", \");\n                                reporter.report(\"The property \" + item + \" is compatible with \" + propertiesSpecified + \" and should be included as well.\", value.actualNodes[0].line, value.actualNodes[0].col, rule);\n                            }\n                        }\n\n                    }\n                }\n            }\n        });\n    }\n});\n\nCSSLint.addRule({\n    id: \"display-property-grouping\",\n    name: \"Require properties appropriate for display\",\n    desc: \"Certain properties shouldn't be used with certain display property values.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n\n        var propertiesToCheck = {\n                display: 1,\n                \"float\": \"none\",\n                height: 1,\n                width: 1,\n                margin: 1,\n                \"margin-left\": 1,\n                \"margin-right\": 1,\n                \"margin-bottom\": 1,\n                \"margin-top\": 1,\n                padding: 1,\n                \"padding-left\": 1,\n                \"padding-right\": 1,\n                \"padding-bottom\": 1,\n                \"padding-top\": 1,\n                \"vertical-align\": 1\n            },\n            properties;\n\n        function reportProperty(name, display, msg){\n            if (properties[name]){\n                if (typeof propertiesToCheck[name] !== \"string\" || properties[name].value.toLowerCase() !== propertiesToCheck[name]){\n                    reporter.report(msg || name + \" can't be used with display: \" + display + \".\", properties[name].line, properties[name].col, rule);\n                }\n            }\n        }\n\n        function startRule(){\n            properties = {};\n        }\n\n        function endRule(){\n\n            var display = properties.display ? properties.display.value : null;\n            if (display){\n                switch(display){\n\n                    case \"inline\":\n                        reportProperty(\"height\", display);\n                        reportProperty(\"width\", display);\n                        reportProperty(\"margin\", display);\n                        reportProperty(\"margin-top\", display);\n                        reportProperty(\"margin-bottom\", display);\n                        reportProperty(\"float\", display, \"display:inline has no effect on floated elements (but may be used to fix the IE6 double-margin bug).\");\n                        break;\n\n                    case \"block\":\n                        reportProperty(\"vertical-align\", display);\n                        break;\n\n                    case \"inline-block\":\n                        reportProperty(\"float\", display);\n                        break;\n\n                    default:\n                        if (display.indexOf(\"table-\") === 0){\n                            reportProperty(\"margin\", display);\n                            reportProperty(\"margin-left\", display);\n                            reportProperty(\"margin-right\", display);\n                            reportProperty(\"margin-top\", display);\n                            reportProperty(\"margin-bottom\", display);\n                            reportProperty(\"float\", display);\n                        }\n                }\n            }\n\n        }\n\n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"startkeyframerule\", startRule);\n        parser.addListener(\"startpagemargin\", startRule);\n        parser.addListener(\"startpage\", startRule);\n\n        parser.addListener(\"property\", function(event){\n            var name = event.property.text.toLowerCase();\n\n            if (propertiesToCheck[name]){\n                properties[name] = { value: event.value.text, line: event.property.line, col: event.property.col };\n            }\n        });\n\n        parser.addListener(\"endrule\", endRule);\n        parser.addListener(\"endfontface\", endRule);\n        parser.addListener(\"endkeyframerule\", endRule);\n        parser.addListener(\"endpagemargin\", endRule);\n        parser.addListener(\"endpage\", endRule);\n\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"duplicate-background-images\",\n    name: \"Disallow duplicate background images\",\n    desc: \"Every background-image should be unique. Use a common class for e.g. sprites.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            stack = {};\n\n        parser.addListener(\"property\", function(event){\n            var name = event.property.text,\n                value = event.value,\n                i, len;\n\n            if (name.match(/background/i)) {\n                for (i=0, len=value.parts.length; i < len; i++) {\n                    if (value.parts[i].type === \"uri\") {\n                        if (typeof stack[value.parts[i].uri] === \"undefined\") {\n                            stack[value.parts[i].uri] = event;\n                        }\n                        else {\n                            reporter.report(\"Background image '\" + value.parts[i].uri + \"' was used multiple times, first declared at line \" + stack[value.parts[i].uri].line + \", col \" + stack[value.parts[i].uri].col + \".\", event.line, event.col, rule);\n                        }\n                    }\n                }\n            }\n        });\n    }\n});\n\nCSSLint.addRule({\n    id: \"duplicate-properties\",\n    name: \"Disallow duplicate properties\",\n    desc: \"Duplicate properties must appear one after the other.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            properties,\n            lastProperty;\n\n        function startRule(){\n            properties = {};\n        }\n\n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"startpage\", startRule);\n        parser.addListener(\"startpagemargin\", startRule);\n        parser.addListener(\"startkeyframerule\", startRule);\n\n        parser.addListener(\"property\", function(event){\n            var property = event.property,\n                name = property.text.toLowerCase();\n\n            if (properties[name] && (lastProperty !== name || properties[name] === event.value.text)){\n                reporter.report(\"Duplicate property '\" + event.property + \"' found.\", event.line, event.col, rule);\n            }\n\n            properties[name] = event.value.text;\n            lastProperty = name;\n\n        });\n\n\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"empty-rules\",\n    name: \"Disallow empty rules\",\n    desc: \"Rules without any properties specified should be removed.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            count = 0;\n\n        parser.addListener(\"startrule\", function(){\n            count=0;\n        });\n\n        parser.addListener(\"property\", function(){\n            count++;\n        });\n\n        parser.addListener(\"endrule\", function(event){\n            var selectors = event.selectors;\n            if (count === 0){\n                reporter.report(\"Rule is empty.\", selectors[0].line, selectors[0].col, rule);\n            }\n        });\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"errors\",\n    name: \"Parsing Errors\",\n    desc: \"This rule looks for recoverable syntax errors.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n\n        parser.addListener(\"error\", function(event){\n            reporter.error(event.message, event.line, event.col, rule);\n        });\n\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"fallback-colors\",\n    name: \"Require fallback colors\",\n    desc: \"For older browsers that don't support RGBA, HSL, or HSLA, provide a fallback color.\",\n    browsers: \"IE6,IE7,IE8\",\n    init: function(parser, reporter){\n        var rule = this,\n            lastProperty,\n            propertiesToCheck = {\n                color: 1,\n                background: 1,\n                \"border-color\": 1,\n                \"border-top-color\": 1,\n                \"border-right-color\": 1,\n                \"border-bottom-color\": 1,\n                \"border-left-color\": 1,\n                border: 1,\n                \"border-top\": 1,\n                \"border-right\": 1,\n                \"border-bottom\": 1,\n                \"border-left\": 1,\n                \"background-color\": 1\n            },\n            properties;\n\n        function startRule(){\n            properties = {};\n            lastProperty = null;\n        }\n\n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"startpage\", startRule);\n        parser.addListener(\"startpagemargin\", startRule);\n        parser.addListener(\"startkeyframerule\", startRule);\n\n        parser.addListener(\"property\", function(event){\n            var property = event.property,\n                name = property.text.toLowerCase(),\n                parts = event.value.parts,\n                i = 0,\n                colorType = \"\",\n                len = parts.length;\n\n            if(propertiesToCheck[name]){\n                while(i < len){\n                    if (parts[i].type === \"color\"){\n                        if (\"alpha\" in parts[i] || \"hue\" in parts[i]){\n\n                            if (/([^\\)]+)\\(/.test(parts[i])){\n                                colorType = RegExp.$1.toUpperCase();\n                            }\n\n                            if (!lastProperty || (lastProperty.property.text.toLowerCase() !== name || lastProperty.colorType !== \"compat\")){\n                                reporter.report(\"Fallback \" + name + \" (hex or RGB) should precede \" + colorType + \" \" + name + \".\", event.line, event.col, rule);\n                            }\n                        } else {\n                            event.colorType = \"compat\";\n                        }\n                    }\n\n                    i++;\n                }\n            }\n\n            lastProperty = event;\n        });\n\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"floats\",\n    name: \"Disallow too many floats\",\n    desc: \"This rule tests if the float property is used too many times\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n        var count = 0;\n        parser.addListener(\"property\", function(event){\n            if (event.property.text.toLowerCase() === \"float\" &&\n                    event.value.text.toLowerCase() !== \"none\"){\n                count++;\n            }\n        });\n        parser.addListener(\"endstylesheet\", function(){\n            reporter.stat(\"floats\", count);\n            if (count >= 10){\n                reporter.rollupWarn(\"Too many floats (\" + count + \"), you're probably using them for layout. Consider using a grid system instead.\", rule);\n            }\n        });\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"font-faces\",\n    name: \"Don't use too many web fonts\",\n    desc: \"Too many different web fonts in the same stylesheet.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            count = 0;\n\n\n        parser.addListener(\"startfontface\", function(){\n            count++;\n        });\n\n        parser.addListener(\"endstylesheet\", function(){\n            if (count > 5){\n                reporter.rollupWarn(\"Too many @font-face declarations (\" + count + \").\", rule);\n            }\n        });\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"font-sizes\",\n    name: \"Disallow too many font sizes\",\n    desc: \"Checks the number of font-size declarations.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            count = 0;\n        parser.addListener(\"property\", function(event){\n            if (event.property.toString() === \"font-size\"){\n                count++;\n            }\n        });\n        parser.addListener(\"endstylesheet\", function(){\n            reporter.stat(\"font-sizes\", count);\n            if (count >= 10){\n                reporter.rollupWarn(\"Too many font-size declarations (\" + count + \"), abstraction needed.\", rule);\n            }\n        });\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"gradients\",\n    name: \"Require all gradient definitions\",\n    desc: \"When using a vendor-prefixed gradient, make sure to use them all.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            gradients;\n\n        parser.addListener(\"startrule\", function(){\n            gradients = {\n                moz: 0,\n                webkit: 0,\n                oldWebkit: 0,\n                o: 0\n            };\n        });\n\n        parser.addListener(\"property\", function(event){\n\n            if (/\\-(moz|o|webkit)(?:\\-(?:linear|radial))\\-gradient/i.test(event.value)){\n                gradients[RegExp.$1] = 1;\n            } else if (/\\-webkit\\-gradient/i.test(event.value)){\n                gradients.oldWebkit = 1;\n            }\n\n        });\n\n        parser.addListener(\"endrule\", function(event){\n            var missing = [];\n\n            if (!gradients.moz){\n                missing.push(\"Firefox 3.6+\");\n            }\n\n            if (!gradients.webkit){\n                missing.push(\"Webkit (Safari 5+, Chrome)\");\n            }\n\n            if (!gradients.oldWebkit){\n                missing.push(\"Old Webkit (Safari 4+, Chrome)\");\n            }\n\n            if (!gradients.o){\n                missing.push(\"Opera 11.1+\");\n            }\n\n            if (missing.length && missing.length < 4){\n                reporter.report(\"Missing vendor-prefixed CSS gradients for \" + missing.join(\", \") + \".\", event.selectors[0].line, event.selectors[0].col, rule);\n            }\n\n        });\n\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"ids\",\n    name: \"Disallow IDs in selectors\",\n    desc: \"Selectors should not contain IDs.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n        parser.addListener(\"startrule\", function(event){\n            var selectors = event.selectors,\n                selector,\n                part,\n                modifier,\n                idCount,\n                i, j, k;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n                idCount = 0;\n\n                for (j=0; j < selector.parts.length; j++){\n                    part = selector.parts[j];\n                    if (part.type === parser.SELECTOR_PART_TYPE){\n                        for (k=0; k < part.modifiers.length; k++){\n                            modifier = part.modifiers[k];\n                            if (modifier.type === \"id\"){\n                                idCount++;\n                            }\n                        }\n                    }\n                }\n\n                if (idCount === 1){\n                    reporter.report(\"Don't use IDs in selectors.\", selector.line, selector.col, rule);\n                } else if (idCount > 1){\n                    reporter.report(idCount + \" IDs in the selector, really?\", selector.line, selector.col, rule);\n                }\n            }\n\n        });\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"import\",\n    name: \"Disallow @import\",\n    desc: \"Don't use @import, use <link> instead.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n\n        parser.addListener(\"import\", function(event){\n            reporter.report(\"@import prevents parallel downloads, use <link> instead.\", event.line, event.col, rule);\n        });\n\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"important\",\n    name: \"Disallow !important\",\n    desc: \"Be careful when using !important declaration\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            count = 0;\n        parser.addListener(\"property\", function(event){\n            if (event.important === true){\n                count++;\n                reporter.report(\"Use of !important\", event.line, event.col, rule);\n            }\n        });\n        parser.addListener(\"endstylesheet\", function(){\n            reporter.stat(\"important\", count);\n            if (count >= 10){\n                reporter.rollupWarn(\"Too many !important declarations (\" + count + \"), try to use less than 10 to avoid specificity issues.\", rule);\n            }\n        });\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"known-properties\",\n    name: \"Require use of known properties\",\n    desc: \"Properties should be known (listed in CSS3 specification) or be a vendor-prefixed property.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n\n        parser.addListener(\"property\", function(event){\n            if (event.invalid) {\n                reporter.report(event.invalid.message, event.line, event.col, rule);\n            }\n\n        });\n    }\n\n});\nCSSLint.addRule({\n    id: \"order-alphabetical\",\n    name: \"Alphabetical order\",\n    desc: \"Assure properties are in alphabetical order\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            properties;\n\n        var startRule = function () {\n            properties = [];\n        };\n\n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"startpage\", startRule);\n        parser.addListener(\"startpagemargin\", startRule);\n        parser.addListener(\"startkeyframerule\", startRule);\n\n        parser.addListener(\"property\", function(event){\n            var name = event.property.text,\n                lowerCasePrefixLessName = name.toLowerCase().replace(/^-.*?-/, \"\");\n\n            properties.push(lowerCasePrefixLessName);\n        });\n\n        parser.addListener(\"endrule\", function(event){\n            var currentProperties = properties.join(\",\"),\n                expectedProperties = properties.sort().join(\",\");\n\n            if (currentProperties !== expectedProperties){\n                reporter.report(\"Rule doesn't have all its properties in alphabetical ordered.\", event.line, event.col, rule);\n            }\n        });\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"outline-none\",\n    name: \"Disallow outline: none\",\n    desc: \"Use of outline: none or outline: 0 should be limited to :focus rules.\",\n    browsers: \"All\",\n    tags: [\"Accessibility\"],\n    init: function(parser, reporter){\n        var rule = this,\n            lastRule;\n\n        function startRule(event){\n            if (event.selectors){\n                lastRule = {\n                    line: event.line,\n                    col: event.col,\n                    selectors: event.selectors,\n                    propCount: 0,\n                    outline: false\n                };\n            } else {\n                lastRule = null;\n            }\n        }\n\n        function endRule(){\n            if (lastRule){\n                if (lastRule.outline){\n                    if (lastRule.selectors.toString().toLowerCase().indexOf(\":focus\") === -1){\n                        reporter.report(\"Outlines should only be modified using :focus.\", lastRule.line, lastRule.col, rule);\n                    } else if (lastRule.propCount === 1) {\n                        reporter.report(\"Outlines shouldn't be hidden unless other visual changes are made.\", lastRule.line, lastRule.col, rule);\n                    }\n                }\n            }\n        }\n\n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"startpage\", startRule);\n        parser.addListener(\"startpagemargin\", startRule);\n        parser.addListener(\"startkeyframerule\", startRule);\n\n        parser.addListener(\"property\", function(event){\n            var name = event.property.text.toLowerCase(),\n                value = event.value;\n\n            if (lastRule){\n                lastRule.propCount++;\n                if (name === \"outline\" && (value.toString() === \"none\" || value.toString() === \"0\")){\n                    lastRule.outline = true;\n                }\n            }\n\n        });\n\n        parser.addListener(\"endrule\", endRule);\n        parser.addListener(\"endfontface\", endRule);\n        parser.addListener(\"endpage\", endRule);\n        parser.addListener(\"endpagemargin\", endRule);\n        parser.addListener(\"endkeyframerule\", endRule);\n\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"overqualified-elements\",\n    name: \"Disallow overqualified elements\",\n    desc: \"Don't use classes or IDs with elements (a.foo or a#foo).\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            classes = {};\n\n        parser.addListener(\"startrule\", function(event){\n            var selectors = event.selectors,\n                selector,\n                part,\n                modifier,\n                i, j, k;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n\n                for (j=0; j < selector.parts.length; j++){\n                    part = selector.parts[j];\n                    if (part.type === parser.SELECTOR_PART_TYPE){\n                        for (k=0; k < part.modifiers.length; k++){\n                            modifier = part.modifiers[k];\n                            if (part.elementName && modifier.type === \"id\"){\n                                reporter.report(\"Element (\" + part + \") is overqualified, just use \" + modifier + \" without element name.\", part.line, part.col, rule);\n                            } else if (modifier.type === \"class\"){\n\n                                if (!classes[modifier]){\n                                    classes[modifier] = [];\n                                }\n                                classes[modifier].push({ modifier: modifier, part: part });\n                            }\n                        }\n                    }\n                }\n            }\n        });\n\n        parser.addListener(\"endstylesheet\", function(){\n\n            var prop;\n            for (prop in classes){\n                if (classes.hasOwnProperty(prop)){\n                    if (classes[prop].length === 1 && classes[prop][0].part.elementName){\n                        reporter.report(\"Element (\" + classes[prop][0].part + \") is overqualified, just use \" + classes[prop][0].modifier + \" without element name.\", classes[prop][0].part.line, classes[prop][0].part.col, rule);\n                    }\n                }\n            }\n        });\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"qualified-headings\",\n    name: \"Disallow qualified headings\",\n    desc: \"Headings should not be qualified (namespaced).\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n\n        parser.addListener(\"startrule\", function(event){\n            var selectors = event.selectors,\n                selector,\n                part,\n                i, j;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n\n                for (j=0; j < selector.parts.length; j++){\n                    part = selector.parts[j];\n                    if (part.type === parser.SELECTOR_PART_TYPE){\n                        if (part.elementName && /h[1-6]/.test(part.elementName.toString()) && j > 0){\n                            reporter.report(\"Heading (\" + part.elementName + \") should not be qualified.\", part.line, part.col, rule);\n                        }\n                    }\n                }\n            }\n        });\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"regex-selectors\",\n    name: \"Disallow selectors that look like regexs\",\n    desc: \"Selectors that look like regular expressions are slow and should be avoided.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n\n        parser.addListener(\"startrule\", function(event){\n            var selectors = event.selectors,\n                selector,\n                part,\n                modifier,\n                i, j, k;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n                for (j=0; j < selector.parts.length; j++){\n                    part = selector.parts[j];\n                    if (part.type === parser.SELECTOR_PART_TYPE){\n                        for (k=0; k < part.modifiers.length; k++){\n                            modifier = part.modifiers[k];\n                            if (modifier.type === \"attribute\"){\n                                if (/([\\~\\|\\^\\$\\*]=)/.test(modifier)){\n                                    reporter.report(\"Attribute selectors with \" + RegExp.$1 + \" are slow!\", modifier.line, modifier.col, rule);\n                                }\n                            }\n\n                        }\n                    }\n                }\n            }\n        });\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"rules-count\",\n    name: \"Rules Count\",\n    desc: \"Track how many rules there are.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var count = 0;\n        parser.addListener(\"startrule\", function(){\n            count++;\n        });\n\n        parser.addListener(\"endstylesheet\", function(){\n            reporter.stat(\"rule-count\", count);\n        });\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"selector-max-approaching\",\n    name: \"Warn when approaching the 4095 selector limit for IE\",\n    desc: \"Will warn when selector count is >= 3800 selectors.\",\n    browsers: \"IE\",\n    init: function(parser, reporter) {\n        var rule = this, count = 0;\n\n        parser.addListener(\"startrule\", function(event) {\n            count += event.selectors.length;\n        });\n\n        parser.addListener(\"endstylesheet\", function() {\n            if (count >= 3800) {\n                reporter.report(\"You have \" + count + \" selectors. Internet Explorer supports a maximum of 4095 selectors per stylesheet. Consider refactoring.\",0,0,rule);\n            }\n        });\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"selector-max\",\n    name: \"Error when past the 4095 selector limit for IE\",\n    desc: \"Will error when selector count is > 4095.\",\n    browsers: \"IE\",\n    init: function(parser, reporter){\n        var rule = this, count = 0;\n\n        parser.addListener(\"startrule\", function(event) {\n            count += event.selectors.length;\n        });\n\n        parser.addListener(\"endstylesheet\", function() {\n            if (count > 4095) {\n                reporter.report(\"You have \" + count + \" selectors. Internet Explorer supports a maximum of 4095 selectors per stylesheet. Consider refactoring.\",0,0,rule);\n            }\n        });\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"selector-newline\",\n    name: \"Disallow new-line characters in selectors\",\n    desc: \"New-line characters in selectors are usually a forgotten comma and not a descendant combinator.\",\n    browsers: \"All\",\n    init: function(parser, reporter) {\n        var rule = this;\n\n        function startRule(event) {\n            var i, len, selector, p, n, pLen, part, part2, type, currentLine, nextLine,\n                selectors = event.selectors;\n\n            for (i = 0, len = selectors.length; i < len; i++) {\n                selector = selectors[i];\n                for (p = 0, pLen = selector.parts.length; p < pLen; p++) {\n                    for (n = p + 1; n < pLen; n++) {\n                        part = selector.parts[p];\n                        part2 = selector.parts[n];\n                        type = part.type;\n                        currentLine = part.line;\n                        nextLine = part2.line;\n\n                        if (type === \"descendant\" && nextLine > currentLine) {\n                            reporter.report(\"newline character found in selector (forgot a comma?)\", currentLine, selectors[i].parts[0].col, rule);\n                        }\n                    }\n                }\n\n            }\n        }\n\n        parser.addListener(\"startrule\", startRule);\n\n    }\n});\n\nCSSLint.addRule({\n    id: \"shorthand\",\n    name: \"Require shorthand properties\",\n    desc: \"Use shorthand properties where possible.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            prop, i, len,\n            propertiesToCheck = {},\n            properties,\n            mapping = {\n                \"margin\": [\n                    \"margin-top\",\n                    \"margin-bottom\",\n                    \"margin-left\",\n                    \"margin-right\"\n                ],\n                \"padding\": [\n                    \"padding-top\",\n                    \"padding-bottom\",\n                    \"padding-left\",\n                    \"padding-right\"\n                ]\n            };\n        for (prop in mapping){\n            if (mapping.hasOwnProperty(prop)){\n                for (i=0, len=mapping[prop].length; i < len; i++){\n                    propertiesToCheck[mapping[prop][i]] = prop;\n                }\n            }\n        }\n\n        function startRule(){\n            properties = {};\n        }\n        function endRule(event){\n\n            var prop, i, len, total;\n            for (prop in mapping){\n                if (mapping.hasOwnProperty(prop)){\n                    total=0;\n\n                    for (i=0, len=mapping[prop].length; i < len; i++){\n                        total += properties[mapping[prop][i]] ? 1 : 0;\n                    }\n\n                    if (total === mapping[prop].length){\n                        reporter.report(\"The properties \" + mapping[prop].join(\", \") + \" can be replaced by \" + prop + \".\", event.line, event.col, rule);\n                    }\n                }\n            }\n        }\n\n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"property\", function(event){\n            var name = event.property.toString().toLowerCase();\n\n            if (propertiesToCheck[name]){\n                properties[name] = 1;\n            }\n        });\n\n        parser.addListener(\"endrule\", endRule);\n        parser.addListener(\"endfontface\", endRule);\n\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"star-property-hack\",\n    name: \"Disallow properties with a star prefix\",\n    desc: \"Checks for the star property hack (targets IE6/7)\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n        parser.addListener(\"property\", function(event){\n            var property = event.property;\n\n            if (property.hack === \"*\") {\n                reporter.report(\"Property with star prefix found.\", event.property.line, event.property.col, rule);\n            }\n        });\n    }\n});\n\nCSSLint.addRule({\n    id: \"text-indent\",\n    name: \"Disallow negative text-indent\",\n    desc: \"Checks for text indent less than -99px\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            textIndent,\n            direction;\n\n\n        function startRule(){\n            textIndent = false;\n            direction = \"inherit\";\n        }\n        function endRule(){\n            if (textIndent && direction !== \"ltr\"){\n                reporter.report(\"Negative text-indent doesn't work well with RTL. If you use text-indent for image replacement explicitly set direction for that item to ltr.\", textIndent.line, textIndent.col, rule);\n            }\n        }\n\n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"property\", function(event){\n            var name = event.property.toString().toLowerCase(),\n                value = event.value;\n\n            if (name === \"text-indent\" && value.parts[0].value < -99){\n                textIndent = event.property;\n            } else if (name === \"direction\" && value.toString() === \"ltr\"){\n                direction = \"ltr\";\n            }\n        });\n\n        parser.addListener(\"endrule\", endRule);\n        parser.addListener(\"endfontface\", endRule);\n\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"underscore-property-hack\",\n    name: \"Disallow properties with an underscore prefix\",\n    desc: \"Checks for the underscore property hack (targets IE6)\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n        parser.addListener(\"property\", function(event){\n            var property = event.property;\n\n            if (property.hack === \"_\") {\n                reporter.report(\"Property with underscore prefix found.\", event.property.line, event.property.col, rule);\n            }\n        });\n    }\n});\n\nCSSLint.addRule({\n    id: \"unique-headings\",\n    name: \"Headings should only be defined once\",\n    desc: \"Headings should be defined only once.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n\n        var headings = {\n                h1: 0,\n                h2: 0,\n                h3: 0,\n                h4: 0,\n                h5: 0,\n                h6: 0\n            };\n\n        parser.addListener(\"startrule\", function(event){\n            var selectors = event.selectors,\n                selector,\n                part,\n                pseudo,\n                i, j;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n                part = selector.parts[selector.parts.length-1];\n\n                if (part.elementName && /(h[1-6])/i.test(part.elementName.toString())){\n\n                    for (j=0; j < part.modifiers.length; j++){\n                        if (part.modifiers[j].type === \"pseudo\"){\n                            pseudo = true;\n                            break;\n                        }\n                    }\n\n                    if (!pseudo){\n                        headings[RegExp.$1]++;\n                        if (headings[RegExp.$1] > 1) {\n                            reporter.report(\"Heading (\" + part.elementName + \") has already been defined.\", part.line, part.col, rule);\n                        }\n                    }\n                }\n            }\n        });\n\n        parser.addListener(\"endstylesheet\", function(){\n            var prop,\n                messages = [];\n\n            for (prop in headings){\n                if (headings.hasOwnProperty(prop)){\n                    if (headings[prop] > 1){\n                        messages.push(headings[prop] + \" \" + prop + \"s\");\n                    }\n                }\n            }\n\n            if (messages.length){\n                reporter.rollupWarn(\"You have \" + messages.join(\", \") + \" defined in this stylesheet.\", rule);\n            }\n        });\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"universal-selector\",\n    name: \"Disallow universal selector\",\n    desc: \"The universal selector (*) is known to be slow.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n\n        parser.addListener(\"startrule\", function(event){\n            var selectors = event.selectors,\n                selector,\n                part,\n                i;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n\n                part = selector.parts[selector.parts.length-1];\n                if (part.elementName === \"*\"){\n                    reporter.report(rule.desc, part.line, part.col, rule);\n                }\n            }\n        });\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"unqualified-attributes\",\n    name: \"Disallow unqualified attribute selectors\",\n    desc: \"Unqualified attribute selectors are known to be slow.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n\n        parser.addListener(\"startrule\", function(event){\n\n            var selectors = event.selectors,\n                selector,\n                part,\n                modifier,\n                i, k;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n\n                part = selector.parts[selector.parts.length-1];\n                if (part.type === parser.SELECTOR_PART_TYPE){\n                    for (k=0; k < part.modifiers.length; k++){\n                        modifier = part.modifiers[k];\n                        if (modifier.type === \"attribute\" && (!part.elementName || part.elementName === \"*\")){\n                            reporter.report(rule.desc, part.line, part.col, rule);\n                        }\n                    }\n                }\n\n            }\n        });\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"vendor-prefix\",\n    name: \"Require standard property with vendor prefix\",\n    desc: \"When using a vendor-prefixed property, make sure to include the standard one.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            properties,\n            num,\n            propertiesToCheck = {\n                \"-webkit-border-radius\": \"border-radius\",\n                \"-webkit-border-top-left-radius\": \"border-top-left-radius\",\n                \"-webkit-border-top-right-radius\": \"border-top-right-radius\",\n                \"-webkit-border-bottom-left-radius\": \"border-bottom-left-radius\",\n                \"-webkit-border-bottom-right-radius\": \"border-bottom-right-radius\",\n\n                \"-o-border-radius\": \"border-radius\",\n                \"-o-border-top-left-radius\": \"border-top-left-radius\",\n                \"-o-border-top-right-radius\": \"border-top-right-radius\",\n                \"-o-border-bottom-left-radius\": \"border-bottom-left-radius\",\n                \"-o-border-bottom-right-radius\": \"border-bottom-right-radius\",\n\n                \"-moz-border-radius\": \"border-radius\",\n                \"-moz-border-radius-topleft\": \"border-top-left-radius\",\n                \"-moz-border-radius-topright\": \"border-top-right-radius\",\n                \"-moz-border-radius-bottomleft\": \"border-bottom-left-radius\",\n                \"-moz-border-radius-bottomright\": \"border-bottom-right-radius\",\n\n                \"-moz-column-count\": \"column-count\",\n                \"-webkit-column-count\": \"column-count\",\n\n                \"-moz-column-gap\": \"column-gap\",\n                \"-webkit-column-gap\": \"column-gap\",\n\n                \"-moz-column-rule\": \"column-rule\",\n                \"-webkit-column-rule\": \"column-rule\",\n\n                \"-moz-column-rule-style\": \"column-rule-style\",\n                \"-webkit-column-rule-style\": \"column-rule-style\",\n\n                \"-moz-column-rule-color\": \"column-rule-color\",\n                \"-webkit-column-rule-color\": \"column-rule-color\",\n\n                \"-moz-column-rule-width\": \"column-rule-width\",\n                \"-webkit-column-rule-width\": \"column-rule-width\",\n\n                \"-moz-column-width\": \"column-width\",\n                \"-webkit-column-width\": \"column-width\",\n\n                \"-webkit-column-span\": \"column-span\",\n                \"-webkit-columns\": \"columns\",\n\n                \"-moz-box-shadow\": \"box-shadow\",\n                \"-webkit-box-shadow\": \"box-shadow\",\n\n                \"-moz-transform\" : \"transform\",\n                \"-webkit-transform\" : \"transform\",\n                \"-o-transform\" : \"transform\",\n                \"-ms-transform\" : \"transform\",\n\n                \"-moz-transform-origin\" : \"transform-origin\",\n                \"-webkit-transform-origin\" : \"transform-origin\",\n                \"-o-transform-origin\" : \"transform-origin\",\n                \"-ms-transform-origin\" : \"transform-origin\",\n\n                \"-moz-box-sizing\" : \"box-sizing\",\n                \"-webkit-box-sizing\" : \"box-sizing\"\n            };\n        function startRule(){\n            properties = {};\n            num = 1;\n        }\n        function endRule(){\n            var prop,\n                i,\n                len,\n                needed,\n                actual,\n                needsStandard = [];\n\n            for (prop in properties){\n                if (propertiesToCheck[prop]){\n                    needsStandard.push({ actual: prop, needed: propertiesToCheck[prop]});\n                }\n            }\n\n            for (i=0, len=needsStandard.length; i < len; i++){\n                needed = needsStandard[i].needed;\n                actual = needsStandard[i].actual;\n\n                if (!properties[needed]){\n                    reporter.report(\"Missing standard property '\" + needed + \"' to go along with '\" + actual + \"'.\", properties[actual][0].name.line, properties[actual][0].name.col, rule);\n                } else {\n                    if (properties[needed][0].pos < properties[actual][0].pos){\n                        reporter.report(\"Standard property '\" + needed + \"' should come after vendor-prefixed property '\" + actual + \"'.\", properties[actual][0].name.line, properties[actual][0].name.col, rule);\n                    }\n                }\n            }\n\n        }\n\n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"startpage\", startRule);\n        parser.addListener(\"startpagemargin\", startRule);\n        parser.addListener(\"startkeyframerule\", startRule);\n\n        parser.addListener(\"property\", function(event){\n            var name = event.property.text.toLowerCase();\n\n            if (!properties[name]){\n                properties[name] = [];\n            }\n\n            properties[name].push({ name: event.property, value : event.value, pos:num++ });\n        });\n\n        parser.addListener(\"endrule\", endRule);\n        parser.addListener(\"endfontface\", endRule);\n        parser.addListener(\"endpage\", endRule);\n        parser.addListener(\"endpagemargin\", endRule);\n        parser.addListener(\"endkeyframerule\", endRule);\n    }\n\n});\n\nCSSLint.addRule({\n    id: \"zero-units\",\n    name: \"Disallow units for 0 values\",\n    desc: \"You don't need to specify units when a value is 0.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n        parser.addListener(\"property\", function(event){\n            var parts = event.value.parts,\n                i = 0,\n                len = parts.length;\n\n            while(i < len){\n                if ((parts[i].units || parts[i].type === \"percentage\") && parts[i].value === 0 && parts[i].type !== \"time\"){\n                    reporter.report(\"Values of 0 shouldn't have units specified.\", parts[i].line, parts[i].col, rule);\n                }\n                i++;\n            }\n\n        });\n\n    }\n\n});\n\n(function() {\n    var xmlEscape = function(str) {\n        if (!str || str.constructor !== String) {\n            return \"\";\n        }\n\n        return str.replace(/[\\\"&><]/g, function(match) {\n            switch (match) {\n                case \"\\\"\":\n                    return \"&quot;\";\n                case \"&\":\n                    return \"&amp;\";\n                case \"<\":\n                    return \"&lt;\";\n                case \">\":\n                    return \"&gt;\";\n            }\n        });\n    };\n\n    CSSLint.addFormatter({\n        id: \"checkstyle-xml\",\n        name: \"Checkstyle XML format\",\n        startFormat: function(){\n            return \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?><checkstyle>\";\n        },\n        endFormat: function(){\n            return \"</checkstyle>\";\n        },\n        readError: function(filename, message) {\n            return \"<file name=\\\"\" + xmlEscape(filename) + \"\\\"><error line=\\\"0\\\" column=\\\"0\\\" severty=\\\"error\\\" message=\\\"\" + xmlEscape(message) + \"\\\"></error></file>\";\n        },\n        formatResults: function(results, filename/*, options*/) {\n            var messages = results.messages,\n                output = [];\n            var generateSource = function(rule) {\n                if (!rule || !(\"name\" in rule)) {\n                    return \"\";\n                }\n                return \"net.csslint.\" + rule.name.replace(/\\s/g,\"\");\n            };\n\n\n\n            if (messages.length > 0) {\n                output.push(\"<file name=\\\"\"+filename+\"\\\">\");\n                CSSLint.Util.forEach(messages, function (message) {\n                    if (!message.rollup) {\n                        output.push(\"<error line=\\\"\" + message.line + \"\\\" column=\\\"\" + message.col + \"\\\" severity=\\\"\" + message.type + \"\\\"\" +\n                          \" message=\\\"\" + xmlEscape(message.message) + \"\\\" source=\\\"\" + generateSource(message.rule) +\"\\\"/>\");\n                    }\n                });\n                output.push(\"</file>\");\n            }\n\n            return output.join(\"\");\n        }\n    });\n\n}());\n\nCSSLint.addFormatter({\n    id: \"compact\",\n    name: \"Compact, 'porcelain' format\",\n    startFormat: function() {\n        return \"\";\n    },\n    endFormat: function() {\n        return \"\";\n    },\n    formatResults: function(results, filename, options) {\n        var messages = results.messages,\n            output = \"\";\n        options = options || {};\n        var capitalize = function(str) {\n            return str.charAt(0).toUpperCase() + str.slice(1);\n        };\n\n        if (messages.length === 0) {\n              return options.quiet ? \"\" : filename + \": Lint Free!\";\n        }\n\n        CSSLint.Util.forEach(messages, function(message) {\n            if (message.rollup) {\n                output += filename + \": \" + capitalize(message.type) + \" - \" + message.message + \"\\n\";\n            } else {\n                output += filename + \": \" + \"line \" + message.line +\n                    \", col \" + message.col + \", \" + capitalize(message.type) + \" - \" + message.message + \" (\" + message.rule.id + \")\\n\";\n            }\n        });\n\n        return output;\n    }\n});\n\nCSSLint.addFormatter({\n    id: \"csslint-xml\",\n    name: \"CSSLint XML format\",\n    startFormat: function(){\n        return \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?><csslint>\";\n    },\n    endFormat: function(){\n        return \"</csslint>\";\n    },\n    formatResults: function(results, filename/*, options*/) {\n        var messages = results.messages,\n            output = [];\n        var escapeSpecialCharacters = function(str) {\n            if (!str || str.constructor !== String) {\n                return \"\";\n            }\n            return str.replace(/\\\"/g, \"'\").replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n        };\n\n        if (messages.length > 0) {\n            output.push(\"<file name=\\\"\"+filename+\"\\\">\");\n            CSSLint.Util.forEach(messages, function (message) {\n                if (message.rollup) {\n                    output.push(\"<issue severity=\\\"\" + message.type + \"\\\" reason=\\\"\" + escapeSpecialCharacters(message.message) + \"\\\" evidence=\\\"\" + escapeSpecialCharacters(message.evidence) + \"\\\"/>\");\n                } else {\n                    output.push(\"<issue line=\\\"\" + message.line + \"\\\" char=\\\"\" + message.col + \"\\\" severity=\\\"\" + message.type + \"\\\"\" +\n                        \" reason=\\\"\" + escapeSpecialCharacters(message.message) + \"\\\" evidence=\\\"\" + escapeSpecialCharacters(message.evidence) + \"\\\"/>\");\n                }\n            });\n            output.push(\"</file>\");\n        }\n\n        return output.join(\"\");\n    }\n});\n\nCSSLint.addFormatter({\n    id: \"junit-xml\",\n    name: \"JUNIT XML format\",\n    startFormat: function(){\n        return \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?><testsuites>\";\n    },\n    endFormat: function() {\n        return \"</testsuites>\";\n    },\n    formatResults: function(results, filename/*, options*/) {\n\n        var messages = results.messages,\n            output = [],\n            tests = {\n                \"error\": 0,\n                \"failure\": 0\n            };\n        var generateSource = function(rule) {\n            if (!rule || !(\"name\" in rule)) {\n                return \"\";\n            }\n            return \"net.csslint.\" + rule.name.replace(/\\s/g,\"\");\n        };\n        var escapeSpecialCharacters = function(str) {\n\n            if (!str || str.constructor !== String) {\n                return \"\";\n            }\n\n            return str.replace(/\\\"/g, \"'\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n\n        };\n\n        if (messages.length > 0) {\n\n            messages.forEach(function (message) {\n                var type = message.type === \"warning\" ? \"error\" : message.type;\n                if (!message.rollup) {\n                    output.push(\"<testcase time=\\\"0\\\" name=\\\"\" + generateSource(message.rule) + \"\\\">\");\n                    output.push(\"<\" + type + \" message=\\\"\" + escapeSpecialCharacters(message.message) + \"\\\"><![CDATA[\" + message.line + \":\" + message.col + \":\" + escapeSpecialCharacters(message.evidence)  + \"]]></\" + type + \">\");\n                    output.push(\"</testcase>\");\n\n                    tests[type] += 1;\n\n                }\n\n            });\n\n            output.unshift(\"<testsuite time=\\\"0\\\" tests=\\\"\" + messages.length + \"\\\" skipped=\\\"0\\\" errors=\\\"\" + tests.error + \"\\\" failures=\\\"\" + tests.failure + \"\\\" package=\\\"net.csslint\\\" name=\\\"\" + filename + \"\\\">\");\n            output.push(\"</testsuite>\");\n\n        }\n\n        return output.join(\"\");\n\n    }\n});\n\nCSSLint.addFormatter({\n    id: \"lint-xml\",\n    name: \"Lint XML format\",\n    startFormat: function(){\n        return \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?><lint>\";\n    },\n    endFormat: function(){\n        return \"</lint>\";\n    },\n    formatResults: function(results, filename/*, options*/) {\n        var messages = results.messages,\n            output = [];\n        var escapeSpecialCharacters = function(str) {\n            if (!str || str.constructor !== String) {\n                return \"\";\n            }\n            return str.replace(/\\\"/g, \"'\").replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n        };\n\n        if (messages.length > 0) {\n\n            output.push(\"<file name=\\\"\"+filename+\"\\\">\");\n            CSSLint.Util.forEach(messages, function (message) {\n                if (message.rollup) {\n                    output.push(\"<issue severity=\\\"\" + message.type + \"\\\" reason=\\\"\" + escapeSpecialCharacters(message.message) + \"\\\" evidence=\\\"\" + escapeSpecialCharacters(message.evidence) + \"\\\"/>\");\n                } else {\n                    output.push(\"<issue line=\\\"\" + message.line + \"\\\" char=\\\"\" + message.col + \"\\\" severity=\\\"\" + message.type + \"\\\"\" +\n                        \" reason=\\\"\" + escapeSpecialCharacters(message.message) + \"\\\" evidence=\\\"\" + escapeSpecialCharacters(message.evidence) + \"\\\"/>\");\n                }\n            });\n            output.push(\"</file>\");\n        }\n\n        return output.join(\"\");\n    }\n});\n\nCSSLint.addFormatter({\n    id: \"text\",\n    name: \"Plain Text\",\n    startFormat: function() {\n        return \"\";\n    },\n    endFormat: function() {\n        return \"\";\n    },\n    formatResults: function(results, filename, options) {\n        var messages = results.messages,\n            output = \"\";\n        options = options || {};\n\n        if (messages.length === 0) {\n            return options.quiet ? \"\" : \"\\n\\ncsslint: No errors in \" + filename + \".\";\n        }\n\n        output = \"\\n\\ncsslint: There \";\n        if (messages.length === 1) {\n            output += \"is 1 problem\";\n        } else {\n            output += \"are \" + messages.length  +  \" problems\";\n        }\n        output += \" in \" + filename + \".\";\n\n        var pos = filename.lastIndexOf(\"/\"),\n            shortFilename = filename;\n\n        if (pos === -1){\n            pos = filename.lastIndexOf(\"\\\\\");\n        }\n        if (pos > -1){\n            shortFilename = filename.substring(pos+1);\n        }\n\n        CSSLint.Util.forEach(messages, function (message, i) {\n            output = output + \"\\n\\n\" + shortFilename;\n            if (message.rollup) {\n                output += \"\\n\" + (i+1) + \": \" + message.type;\n                output += \"\\n\" + message.message;\n            } else {\n                output += \"\\n\" + (i+1) + \": \" + message.type + \" at line \" + message.line + \", col \" + message.col;\n                output += \"\\n\" + message.message;\n                output += \"\\n\" + message.evidence;\n            }\n        });\n\n        return output;\n    }\n});\n\nmodule.exports.CSSLint = CSSLint;\n\n});\n\nace.define(\"ace/mode/css_worker\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/worker/mirror\",\"ace/mode/css/csslint\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar Mirror = require(\"../worker/mirror\").Mirror;\nvar CSSLint = require(\"./css/csslint\").CSSLint;\n\nvar Worker = exports.Worker = function(sender) {\n    Mirror.call(this, sender);\n    this.setTimeout(400);\n    this.ruleset = null;\n    this.setDisabledRules(\"ids|order-alphabetical\");\n    this.setInfoRules(\n      \"adjoining-classes|qualified-headings|zero-units|gradients|\" +\n      \"import|outline-none|vendor-prefix\"\n    );\n};\n\noop.inherits(Worker, Mirror);\n\n(function() {\n    this.setInfoRules = function(ruleNames) {\n        if (typeof ruleNames == \"string\")\n            ruleNames = ruleNames.split(\"|\");\n        this.infoRules = lang.arrayToMap(ruleNames);\n        this.doc.getValue() && this.deferredUpdate.schedule(100);\n    };\n\n    this.setDisabledRules = function(ruleNames) {\n        if (!ruleNames) {\n            this.ruleset = null;\n        } else {\n            if (typeof ruleNames == \"string\")\n                ruleNames = ruleNames.split(\"|\");\n            var all = {};\n\n            CSSLint.getRules().forEach(function(x){\n                all[x.id] = true;\n            });\n            ruleNames.forEach(function(x) {\n                delete all[x];\n            });\n            \n            this.ruleset = all;\n        }\n        this.doc.getValue() && this.deferredUpdate.schedule(100);\n    };\n\n    this.onUpdate = function() {\n        var value = this.doc.getValue();\n        if (!value)\n            return this.sender.emit(\"csslint\", []);\n        var infoRules = this.infoRules;\n\n        var result = CSSLint.verify(value, this.ruleset);\n        this.sender.emit(\"csslint\", result.messages.map(function(msg) {\n            return {\n                row: msg.line - 1,\n                column: msg.col - 1,\n                text: msg.message,\n                type: infoRules[msg.rule.id] ? \"info\" : msg.type,\n                rule: msg.rule.name\n            }\n        }));\n    };\n\n}).call(Worker.prototype);\n\n});\n\nace.define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\nfunction Empty() {}\n\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function bind(that) { // .length is 1\n        var target = this;\n        if (typeof target != \"function\") {\n            throw new TypeError(\"Function.prototype.bind called on incompatible \" + target);\n        }\n        var args = slice.call(arguments, 1); // for normal call\n        var bound = function () {\n\n            if (this instanceof bound) {\n\n                var result = target.apply(\n                    this,\n                    args.concat(slice.call(arguments))\n                );\n                if (Object(result) === result) {\n                    return result;\n                }\n                return this;\n\n            } else {\n                return target.apply(\n                    that,\n                    args.concat(slice.call(arguments))\n                );\n\n            }\n\n        };\n        if(target.prototype) {\n            Empty.prototype = target.prototype;\n            bound.prototype = new Empty();\n            Empty.prototype = null;\n        }\n        return bound;\n    };\n}\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar _toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n    defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n    defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n    lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n    lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\nif ([1,2].splice(0).length != 2) {\n    if(function() { // test IE < 9 to splice bug - see issue #138\n        function makeArray(l) {\n            var a = new Array(l+2);\n            a[0] = a[1] = 0;\n            return a;\n        }\n        var array = [], lengthBefore;\n        \n        array.splice.apply(array, makeArray(20));\n        array.splice.apply(array, makeArray(26));\n\n        lengthBefore = array.length; //46\n        array.splice(5, 0, \"XXX\"); // add one element\n\n        lengthBefore + 1 == array.length\n\n        if (lengthBefore + 1 == array.length) {\n            return true;// has right splice implementation without bugs\n        }\n    }()) {//IE 6/7\n        var array_splice = Array.prototype.splice;\n        Array.prototype.splice = function(start, deleteCount) {\n            if (!arguments.length) {\n                return [];\n            } else {\n                return array_splice.apply(this, [\n                    start === void 0 ? 0 : start,\n                    deleteCount === void 0 ? (this.length - start) : deleteCount\n                ].concat(slice.call(arguments, 2)))\n            }\n        };\n    } else {//IE8\n        Array.prototype.splice = function(pos, removeCount){\n            var length = this.length;\n            if (pos > 0) {\n                if (pos > length)\n                    pos = length;\n            } else if (pos == void 0) {\n                pos = 0;\n            } else if (pos < 0) {\n                pos = Math.max(length + pos, 0);\n            }\n\n            if (!(pos+removeCount < length))\n                removeCount = length - pos;\n\n            var removed = this.slice(pos, pos+removeCount);\n            var insert = slice.call(arguments, 2);\n            var add = insert.length;            \n            if (pos === length) {\n                if (add) {\n                    this.push.apply(this, insert);\n                }\n            } else {\n                var remove = Math.min(removeCount, length - pos);\n                var tailOldPos = pos + remove;\n                var tailNewPos = tailOldPos + add - remove;\n                var tailCount = length - tailOldPos;\n                var lengthAfterRemove = length - remove;\n\n                if (tailNewPos < tailOldPos) { // case A\n                    for (var i = 0; i < tailCount; ++i) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } else if (tailNewPos > tailOldPos) { // case B\n                    for (i = tailCount; i--; ) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } // else, add == remove (nothing to do)\n\n                if (add && pos === lengthAfterRemove) {\n                    this.length = lengthAfterRemove; // truncate array\n                    this.push.apply(this, insert);\n                } else {\n                    this.length = lengthAfterRemove + add; // reserves space\n                    for (i = 0; i < add; ++i) {\n                        this[pos+i] = insert[i];\n                    }\n                }\n            }\n            return removed;\n        };\n    }\n}\nif (!Array.isArray) {\n    Array.isArray = function isArray(obj) {\n        return _toString(obj) == \"[object Array]\";\n    };\n}\nvar boxedString = Object(\"a\"),\n    splitString = boxedString[0] != \"a\" || !(0 in boxedString);\n\nif (!Array.prototype.forEach) {\n    Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            thisp = arguments[1],\n            i = -1,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        while (++i < length) {\n            if (i in self) {\n                fun.call(thisp, self[i], i, object);\n            }\n        }\n    };\n}\nif (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            result = Array(length),\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self)\n                result[i] = fun.call(thisp, self[i], i, object);\n        }\n        return result;\n    };\n}\nif (!Array.prototype.filter) {\n    Array.prototype.filter = function filter(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                    object,\n            length = self.length >>> 0,\n            result = [],\n            value,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self) {\n                value = self[i];\n                if (fun.call(thisp, value, i, object)) {\n                    result.push(value);\n                }\n            }\n        }\n        return result;\n    };\n}\nif (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && !fun.call(thisp, self[i], i, object)) {\n                return false;\n            }\n        }\n        return true;\n    };\n}\nif (!Array.prototype.some) {\n    Array.prototype.some = function some(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, object)) {\n                return true;\n            }\n        }\n        return false;\n    };\n}\nif (!Array.prototype.reduce) {\n    Array.prototype.reduce = function reduce(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduce of empty array with no initial value\");\n        }\n\n        var i = 0;\n        var result;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i++];\n                    break;\n                }\n                if (++i >= length) {\n                    throw new TypeError(\"reduce of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        for (; i < length; i++) {\n            if (i in self) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        }\n\n        return result;\n    };\n}\nif (!Array.prototype.reduceRight) {\n    Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduceRight of empty array with no initial value\");\n        }\n\n        var result, i = length - 1;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i--];\n                    break;\n                }\n                if (--i < 0) {\n                    throw new TypeError(\"reduceRight of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        do {\n            if (i in this) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        } while (i--);\n\n        return result;\n    };\n}\nif (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {\n    Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n\n        var i = 0;\n        if (arguments.length > 1) {\n            i = toInteger(arguments[1]);\n        }\n        i = i >= 0 ? i : Math.max(0, length + i);\n        for (; i < length; i++) {\n            if (i in self && self[i] === sought) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {\n    Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n        var i = length - 1;\n        if (arguments.length > 1) {\n            i = Math.min(i, toInteger(arguments[1]));\n        }\n        i = i >= 0 ? i : length - Math.abs(i);\n        for (; i >= 0; i--) {\n            if (i in self && sought === self[i]) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Object.getPrototypeOf) {\n    Object.getPrototypeOf = function getPrototypeOf(object) {\n        return object.__proto__ || (\n            object.constructor ?\n            object.constructor.prototype :\n            prototypeOfObject\n        );\n    };\n}\nif (!Object.getOwnPropertyDescriptor) {\n    var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n                         \"non-object: \";\n    Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT + object);\n        if (!owns(object, property))\n            return;\n\n        var descriptor, getter, setter;\n        descriptor =  { enumerable: true, configurable: true };\n        if (supportsAccessors) {\n            var prototype = object.__proto__;\n            object.__proto__ = prototypeOfObject;\n\n            var getter = lookupGetter(object, property);\n            var setter = lookupSetter(object, property);\n            object.__proto__ = prototype;\n\n            if (getter || setter) {\n                if (getter) descriptor.get = getter;\n                if (setter) descriptor.set = setter;\n                return descriptor;\n            }\n        }\n        descriptor.value = object[property];\n        return descriptor;\n    };\n}\nif (!Object.getOwnPropertyNames) {\n    Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n        return Object.keys(object);\n    };\n}\nif (!Object.create) {\n    var createEmpty;\n    if (Object.prototype.__proto__ === null) {\n        createEmpty = function () {\n            return { \"__proto__\": null };\n        };\n    } else {\n        createEmpty = function () {\n            var empty = {};\n            for (var i in empty)\n                empty[i] = null;\n            empty.constructor =\n            empty.hasOwnProperty =\n            empty.propertyIsEnumerable =\n            empty.isPrototypeOf =\n            empty.toLocaleString =\n            empty.toString =\n            empty.valueOf =\n            empty.__proto__ = null;\n            return empty;\n        }\n    }\n\n    Object.create = function create(prototype, properties) {\n        var object;\n        if (prototype === null) {\n            object = createEmpty();\n        } else {\n            if (typeof prototype != \"object\")\n                throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n            var Type = function () {};\n            Type.prototype = prototype;\n            object = new Type();\n            object.__proto__ = prototype;\n        }\n        if (properties !== void 0)\n            Object.defineProperties(object, properties);\n        return object;\n    };\n}\n\nfunction doesDefinePropertyWork(object) {\n    try {\n        Object.defineProperty(object, \"sentinel\", {});\n        return \"sentinel\" in object;\n    } catch (exception) {\n    }\n}\nif (Object.defineProperty) {\n    var definePropertyWorksOnObject = doesDefinePropertyWork({});\n    var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n        doesDefinePropertyWork(document.createElement(\"div\"));\n    if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n        var definePropertyFallback = Object.defineProperty;\n    }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n    var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n    var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n    var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n                                      \"on this javascript engine\";\n\n    Object.defineProperty = function defineProperty(object, property, descriptor) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n        if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n            throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n        if (definePropertyFallback) {\n            try {\n                return definePropertyFallback.call(Object, object, property, descriptor);\n            } catch (exception) {\n            }\n        }\n        if (owns(descriptor, \"value\")) {\n\n            if (supportsAccessors && (lookupGetter(object, property) ||\n                                      lookupSetter(object, property)))\n            {\n                var prototype = object.__proto__;\n                object.__proto__ = prototypeOfObject;\n                delete object[property];\n                object[property] = descriptor.value;\n                object.__proto__ = prototype;\n            } else {\n                object[property] = descriptor.value;\n            }\n        } else {\n            if (!supportsAccessors)\n                throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n            if (owns(descriptor, \"get\"))\n                defineGetter(object, property, descriptor.get);\n            if (owns(descriptor, \"set\"))\n                defineSetter(object, property, descriptor.set);\n        }\n\n        return object;\n    };\n}\nif (!Object.defineProperties) {\n    Object.defineProperties = function defineProperties(object, properties) {\n        for (var property in properties) {\n            if (owns(properties, property))\n                Object.defineProperty(object, property, properties[property]);\n        }\n        return object;\n    };\n}\nif (!Object.seal) {\n    Object.seal = function seal(object) {\n        return object;\n    };\n}\nif (!Object.freeze) {\n    Object.freeze = function freeze(object) {\n        return object;\n    };\n}\ntry {\n    Object.freeze(function () {});\n} catch (exception) {\n    Object.freeze = (function freeze(freezeObject) {\n        return function freeze(object) {\n            if (typeof object == \"function\") {\n                return object;\n            } else {\n                return freezeObject(object);\n            }\n        };\n    })(Object.freeze);\n}\nif (!Object.preventExtensions) {\n    Object.preventExtensions = function preventExtensions(object) {\n        return object;\n    };\n}\nif (!Object.isSealed) {\n    Object.isSealed = function isSealed(object) {\n        return false;\n    };\n}\nif (!Object.isFrozen) {\n    Object.isFrozen = function isFrozen(object) {\n        return false;\n    };\n}\nif (!Object.isExtensible) {\n    Object.isExtensible = function isExtensible(object) {\n        if (Object(object) === object) {\n            throw new TypeError(); // TODO message\n        }\n        var name = '';\n        while (owns(object, name)) {\n            name += '?';\n        }\n        object[name] = true;\n        var returnValue = owns(object, name);\n        delete object[name];\n        return returnValue;\n    };\n}\nif (!Object.keys) {\n    var hasDontEnumBug = true,\n        dontEnums = [\n            \"toString\",\n            \"toLocaleString\",\n            \"valueOf\",\n            \"hasOwnProperty\",\n            \"isPrototypeOf\",\n            \"propertyIsEnumerable\",\n            \"constructor\"\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    for (var key in {\"toString\": null}) {\n        hasDontEnumBug = false;\n    }\n\n    Object.keys = function keys(object) {\n\n        if (\n            (typeof object != \"object\" && typeof object != \"function\") ||\n            object === null\n        ) {\n            throw new TypeError(\"Object.keys called on a non-object\");\n        }\n\n        var keys = [];\n        for (var name in object) {\n            if (owns(object, name)) {\n                keys.push(name);\n            }\n        }\n\n        if (hasDontEnumBug) {\n            for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n                var dontEnum = dontEnums[i];\n                if (owns(object, dontEnum)) {\n                    keys.push(dontEnum);\n                }\n            }\n        }\n        return keys;\n    };\n\n}\nif (!Date.now) {\n    Date.now = function now() {\n        return new Date().getTime();\n    };\n}\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n    \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n    \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n    ws = \"[\" + ws + \"]\";\n    var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n        trimEndRegexp = new RegExp(ws + ws + \"*$\");\n    String.prototype.trim = function trim() {\n        return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n    };\n}\n\nfunction toInteger(n) {\n    n = +n;\n    if (n !== n) { // isNaN\n        n = 0;\n    } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {\n        n = (n > 0 || -1) * Math.floor(Math.abs(n));\n    }\n    return n;\n}\n\nfunction isPrimitive(input) {\n    var type = typeof input;\n    return (\n        input === null ||\n        type === \"undefined\" ||\n        type === \"boolean\" ||\n        type === \"number\" ||\n        type === \"string\"\n    );\n}\n\nfunction toPrimitive(input) {\n    var val, valueOf, toString;\n    if (isPrimitive(input)) {\n        return input;\n    }\n    valueOf = input.valueOf;\n    if (typeof valueOf === \"function\") {\n        val = valueOf.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    toString = input.toString;\n    if (typeof toString === \"function\") {\n        val = toString.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    throw new TypeError();\n}\nvar toObject = function (o) {\n    if (o == null) { // this matches both null and undefined\n        throw new TypeError(\"can't convert \"+o+\" to object\");\n    }\n    return Object(o);\n};\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/worker-html.js",
    "content": "\"no use strict\";\n;(function(window) {\nif (typeof window.window != \"undefined\" && window.document) {\n    return;\n}\n\nwindow.console = function() {\n    var msgs = Array.prototype.slice.call(arguments, 0);\n    postMessage({type: \"log\", data: msgs});\n};\nwindow.console.error =\nwindow.console.warn = \nwindow.console.log =\nwindow.console.trace = window.console;\n\nwindow.window = window;\nwindow.ace = window;\n\nwindow.onerror = function(message, file, line, col, err) {\n    postMessage({type: \"error\", data: {\n        message: message,\n        file: file,\n        line: line, \n        col: col,\n        stack: err.stack\n    }});\n};\n\nwindow.normalizeModule = function(parentId, moduleName) {\n    // normalize plugin requires\n    if (moduleName.indexOf(\"!\") !== -1) {\n        var chunks = moduleName.split(\"!\");\n        return window.normalizeModule(parentId, chunks[0]) + \"!\" + window.normalizeModule(parentId, chunks[1]);\n    }\n    // normalize relative requires\n    if (moduleName.charAt(0) == \".\") {\n        var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n        moduleName = (base ? base + \"/\" : \"\") + moduleName;\n        \n        while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n            var previous = moduleName;\n            moduleName = moduleName.replace(/^\\.\\//, \"\").replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n        }\n    }\n    \n    return moduleName;\n};\n\nwindow.require = function(parentId, id) {\n    if (!id) {\n        id = parentId;\n        parentId = null;\n    }\n    if (!id.charAt)\n        throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");\n\n    id = window.normalizeModule(parentId, id);\n\n    var module = window.require.modules[id];\n    if (module) {\n        if (!module.initialized) {\n            module.initialized = true;\n            module.exports = module.factory().exports;\n        }\n        return module.exports;\n    }\n    \n    var chunks = id.split(\"/\");\n    if (!window.require.tlns)\n        return console.log(\"unable to load \" + id);\n    chunks[0] = window.require.tlns[chunks[0]] || chunks[0];\n    var path = chunks.join(\"/\") + \".js\";\n    \n    window.require.id = id;\n    importScripts(path);\n    return window.require(parentId, id);\n};\nwindow.require.modules = {};\nwindow.require.tlns = {};\n\nwindow.define = function(id, deps, factory) {\n    if (arguments.length == 2) {\n        factory = deps;\n        if (typeof id != \"string\") {\n            deps = id;\n            id = window.require.id;\n        }\n    } else if (arguments.length == 1) {\n        factory = id;\n        deps = [];\n        id = window.require.id;\n    }\n    \n    if (typeof factory != \"function\") {\n        window.require.modules[id] = {\n            exports: factory,\n            initialized: true\n        };\n        return;\n    }\n\n    if (!deps.length)\n        // If there is no dependencies, we inject 'require', 'exports' and\n        // 'module' as dependencies, to provide CommonJS compatibility.\n        deps = ['require', 'exports', 'module'];\n\n    var req = function(childId) {\n        return window.require(id, childId);\n    };\n\n    window.require.modules[id] = {\n        exports: {},\n        factory: function() {\n            var module = this;\n            var returnExports = factory.apply(this, deps.map(function(dep) {\n              switch(dep) {\n                  // Because 'require', 'exports' and 'module' aren't actual\n                  // dependencies, we must handle them seperately.\n                  case 'require': return req;\n                  case 'exports': return module.exports;\n                  case 'module':  return module;\n                  // But for all other dependencies, we can just go ahead and\n                  // require them.\n                  default:        return req(dep);\n              }\n            }));\n            if (returnExports)\n                module.exports = returnExports;\n            return module;\n        }\n    };\n};\nwindow.define.amd = {};\n\nwindow.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n    require.tlns = topLevelNamespaces;\n};\n\nwindow.initSender = function initSender() {\n\n    var EventEmitter = window.require(\"ace/lib/event_emitter\").EventEmitter;\n    var oop = window.require(\"ace/lib/oop\");\n    \n    var Sender = function() {};\n    \n    (function() {\n        \n        oop.implement(this, EventEmitter);\n                \n        this.callback = function(data, callbackId) {\n            postMessage({\n                type: \"call\",\n                id: callbackId,\n                data: data\n            });\n        };\n    \n        this.emit = function(name, data) {\n            postMessage({\n                type: \"event\",\n                name: name,\n                data: data\n            });\n        };\n        \n    }).call(Sender.prototype);\n    \n    return new Sender();\n};\n\nvar main = window.main = null;\nvar sender = window.sender = null;\n\nwindow.onmessage = function(e) {\n    var msg = e.data;\n    if (msg.command) {\n        if (main[msg.command])\n            main[msg.command].apply(main, msg.args);\n        else\n            throw new Error(\"Unknown command:\" + msg.command);\n    }\n    else if (msg.init) {        \n        initBaseUrls(msg.tlns);\n        require(\"ace/lib/es5-shim\");\n        sender = window.sender = initSender();\n        var clazz = require(msg.module)[msg.classname];\n        main = window.main = new clazz(sender);\n    } \n    else if (msg.event && sender) {\n        sender._signal(msg.event, msg.data);\n    }\n};\n})(this);\n\nace.define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.inherits = function(ctor, 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\nexports.mixin = function(obj, mixin) {\n    for (var key in mixin) {\n        obj[key] = mixin[key];\n    }\n    return obj;\n};\n\nexports.implement = function(proto, mixin) {\n    exports.mixin(proto, mixin);\n};\n\n});\n\nace.define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.last = function(a) {\n    return a[a.length - 1];\n};\n\nexports.stringReverse = function(string) {\n    return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n    var result = '';\n    while (count > 0) {\n        if (count & 1)\n            result += string;\n\n        if (count >>= 1)\n            string += string;\n    }\n    return result;\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n    return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n    return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n    var copy = {};\n    for (var key in obj) {\n        copy[key] = obj[key];\n    }\n    return copy;\n};\n\nexports.copyArray = function(array){\n    var copy = [];\n    for (var i=0, l=array.length; i<l; i++) {\n        if (array[i] && typeof array[i] == \"object\")\n            copy[i] = this.copyObject( array[i] );\n        else \n            copy[i] = array[i];\n    }\n    return copy;\n};\n\nexports.deepCopy = function (obj) {\n    if (typeof obj !== \"object\" || !obj)\n        return obj;\n    var cons = obj.constructor;\n    if (cons === RegExp)\n        return obj;\n    \n    var copy = cons();\n    for (var key in obj) {\n        if (typeof obj[key] === \"object\") {\n            copy[key] = exports.deepCopy(obj[key]);\n        } else {\n            copy[key] = obj[key];\n        }\n    }\n    return copy;\n};\n\nexports.arrayToMap = function(arr) {\n    var map = {};\n    for (var i=0; i<arr.length; i++) {\n        map[arr[i]] = 1;\n    }\n    return map;\n\n};\n\nexports.createMap = function(props) {\n    var map = Object.create(null);\n    for (var i in props) {\n        map[i] = props[i];\n    }\n    return map;\n};\nexports.arrayRemove = function(array, value) {\n  for (var i = 0; i <= array.length; i++) {\n    if (value === array[i]) {\n      array.splice(i, 1);\n    }\n  }\n};\n\nexports.escapeRegExp = function(str) {\n    return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n};\n\nexports.escapeHTML = function(str) {\n    return str.replace(/&/g, \"&#38;\").replace(/\"/g, \"&#34;\").replace(/'/g, \"&#39;\").replace(/</g, \"&#60;\");\n};\n\nexports.getMatchOffsets = function(string, regExp) {\n    var matches = [];\n\n    string.replace(regExp, function(str) {\n        matches.push({\n            offset: arguments[arguments.length-2],\n            length: str.length\n        });\n    });\n\n    return matches;\n};\nexports.deferredCall = function(fcn) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var deferred = function(timeout) {\n        deferred.cancel();\n        timer = setTimeout(callback, timeout || 0);\n        return deferred;\n    };\n\n    deferred.schedule = deferred;\n\n    deferred.call = function() {\n        this.cancel();\n        fcn();\n        return deferred;\n    };\n\n    deferred.cancel = function() {\n        clearTimeout(timer);\n        timer = null;\n        return deferred;\n    };\n    \n    deferred.isPending = function() {\n        return timer;\n    };\n\n    return deferred;\n};\n\n\nexports.delayedCall = function(fcn, defaultTimeout) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var _self = function(timeout) {\n        if (timer == null)\n            timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n\n    _self.delay = function(timeout) {\n        timer && clearTimeout(timer);\n        timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n    _self.schedule = _self;\n\n    _self.call = function() {\n        this.cancel();\n        fcn();\n    };\n\n    _self.cancel = function() {\n        timer && clearTimeout(timer);\n        timer = null;\n    };\n\n    _self.isPending = function() {\n        return timer;\n    };\n\n    return _self;\n};\n});\n\nace.define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nvar EventEmitter = {};\nvar stopPropagation = function() { this.propagationStopped = true; };\nvar preventDefault = function() { this.defaultPrevented = true; };\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n    this._eventRegistry || (this._eventRegistry = {});\n    this._defaultHandlers || (this._defaultHandlers = {});\n\n    var listeners = this._eventRegistry[eventName] || [];\n    var defaultHandler = this._defaultHandlers[eventName];\n    if (!listeners.length && !defaultHandler)\n        return;\n\n    if (typeof e != \"object\" || !e)\n        e = {};\n\n    if (!e.type)\n        e.type = eventName;\n    if (!e.stopPropagation)\n        e.stopPropagation = stopPropagation;\n    if (!e.preventDefault)\n        e.preventDefault = preventDefault;\n\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++) {\n        listeners[i](e, this);\n        if (e.propagationStopped)\n            break;\n    }\n    \n    if (defaultHandler && !e.defaultPrevented)\n        return defaultHandler(e, this);\n};\n\n\nEventEmitter._signal = function(eventName, e) {\n    var listeners = (this._eventRegistry || {})[eventName];\n    if (!listeners)\n        return;\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++)\n        listeners[i](e, this);\n};\n\nEventEmitter.once = function(eventName, callback) {\n    var _self = this;\n    callback && this.addEventListener(eventName, function newCallback() {\n        _self.removeEventListener(eventName, newCallback);\n        callback.apply(null, arguments);\n    });\n};\n\n\nEventEmitter.setDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        handlers = this._defaultHandlers = {_disabled_: {}};\n    \n    if (handlers[eventName]) {\n        var old = handlers[eventName];\n        var disabled = handlers._disabled_[eventName];\n        if (!disabled)\n            handlers._disabled_[eventName] = disabled = [];\n        disabled.push(old);\n        var i = disabled.indexOf(callback);\n        if (i != -1) \n            disabled.splice(i, 1);\n    }\n    handlers[eventName] = callback;\n};\nEventEmitter.removeDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        return;\n    var disabled = handlers._disabled_[eventName];\n    \n    if (handlers[eventName] == callback) {\n        var old = handlers[eventName];\n        if (disabled)\n            this.setDefaultHandler(eventName, disabled.pop());\n    } else if (disabled) {\n        var i = disabled.indexOf(callback);\n        if (i != -1)\n            disabled.splice(i, 1);\n    }\n};\n\nEventEmitter.on =\nEventEmitter.addEventListener = function(eventName, callback, capturing) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        listeners = this._eventRegistry[eventName] = [];\n\n    if (listeners.indexOf(callback) == -1)\n        listeners[capturing ? \"unshift\" : \"push\"](callback);\n    return callback;\n};\n\nEventEmitter.off =\nEventEmitter.removeListener =\nEventEmitter.removeEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        return;\n\n    var index = listeners.indexOf(callback);\n    if (index !== -1)\n        listeners.splice(index, 1);\n};\n\nEventEmitter.removeAllListeners = function(eventName) {\n    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n};\n\nexports.EventEmitter = EventEmitter;\n\n});\n\nace.define(\"ace/range\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nvar comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n    this.start = {\n        row: startRow,\n        column: startColumn\n    };\n\n    this.end = {\n        row: endRow,\n        column: endColumn\n    };\n};\n\n(function() {\n    this.isEqual = function(range) {\n        return this.start.row === range.start.row &&\n            this.end.row === range.end.row &&\n            this.start.column === range.start.column &&\n            this.end.column === range.end.column;\n    };\n    this.toString = function() {\n        return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n            \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n    };\n\n    this.contains = function(row, column) {\n        return this.compare(row, column) == 0;\n    };\n    this.compareRange = function(range) {\n        var cmp,\n            end = range.end,\n            start = range.start;\n\n        cmp = this.compare(end.row, end.column);\n        if (cmp == 1) {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == 1) {\n                return 2;\n            } else if (cmp == 0) {\n                return 1;\n            } else {\n                return 0;\n            }\n        } else if (cmp == -1) {\n            return -2;\n        } else {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == -1) {\n                return -1;\n            } else if (cmp == 1) {\n                return 42;\n            } else {\n                return 0;\n            }\n        }\n    };\n    this.comparePoint = function(p) {\n        return this.compare(p.row, p.column);\n    };\n    this.containsRange = function(range) {\n        return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n    };\n    this.intersects = function(range) {\n        var cmp = this.compareRange(range);\n        return (cmp == -1 || cmp == 0 || cmp == 1);\n    };\n    this.isEnd = function(row, column) {\n        return this.end.row == row && this.end.column == column;\n    };\n    this.isStart = function(row, column) {\n        return this.start.row == row && this.start.column == column;\n    };\n    this.setStart = function(row, column) {\n        if (typeof row == \"object\") {\n            this.start.column = row.column;\n            this.start.row = row.row;\n        } else {\n            this.start.row = row;\n            this.start.column = column;\n        }\n    };\n    this.setEnd = function(row, column) {\n        if (typeof row == \"object\") {\n            this.end.column = row.column;\n            this.end.row = row.row;\n        } else {\n            this.end.row = row;\n            this.end.column = column;\n        }\n    };\n    this.inside = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column) || this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideStart = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideEnd = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.compare = function(row, column) {\n        if (!this.isMultiLine()) {\n            if (row === this.start.row) {\n                return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n            };\n        }\n\n        if (row < this.start.row)\n            return -1;\n\n        if (row > this.end.row)\n            return 1;\n\n        if (this.start.row === row)\n            return column >= this.start.column ? 0 : -1;\n\n        if (this.end.row === row)\n            return column <= this.end.column ? 0 : 1;\n\n        return 0;\n    };\n    this.compareStart = function(row, column) {\n        if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareEnd = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareInside = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.clipRows = function(firstRow, lastRow) {\n        if (this.end.row > lastRow)\n            var end = {row: lastRow + 1, column: 0};\n        else if (this.end.row < firstRow)\n            var end = {row: firstRow, column: 0};\n\n        if (this.start.row > lastRow)\n            var start = {row: lastRow + 1, column: 0};\n        else if (this.start.row < firstRow)\n            var start = {row: firstRow, column: 0};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n    this.extend = function(row, column) {\n        var cmp = this.compare(row, column);\n\n        if (cmp == 0)\n            return this;\n        else if (cmp == -1)\n            var start = {row: row, column: column};\n        else\n            var end = {row: row, column: column};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n\n    this.isEmpty = function() {\n        return (this.start.row === this.end.row && this.start.column === this.end.column);\n    };\n    this.isMultiLine = function() {\n        return (this.start.row !== this.end.row);\n    };\n    this.clone = function() {\n        return Range.fromPoints(this.start, this.end);\n    };\n    this.collapseRows = function() {\n        if (this.end.column == 0)\n            return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)\n        else\n            return new Range(this.start.row, 0, this.end.row, 0)\n    };\n    this.toScreenRange = function(session) {\n        var screenPosStart = session.documentToScreenPosition(this.start);\n        var screenPosEnd = session.documentToScreenPosition(this.end);\n\n        return new Range(\n            screenPosStart.row, screenPosStart.column,\n            screenPosEnd.row, screenPosEnd.column\n        );\n    };\n    this.moveBy = function(row, column) {\n        this.start.row += row;\n        this.start.column += column;\n        this.end.row += row;\n        this.end.column += column;\n    };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n    return new Range(start.row, start.column, end.row, end.column);\n};\nRange.comparePoints = comparePoints;\n\nRange.comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\n\n\nexports.Range = Range;\n});\n\nace.define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n    this.$onChange = this.onChange.bind(this);\n    this.attach(doc);\n    \n    if (typeof column == \"undefined\")\n        this.setPosition(row.row, row.column);\n    else\n        this.setPosition(row, column);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.getPosition = function() {\n        return this.$clipPositionToDocument(this.row, this.column);\n    };\n    this.getDocument = function() {\n        return this.document;\n    };\n    this.$insertRight = false;\n    this.onChange = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n\n        if (range.start.row == range.end.row && range.start.row != this.row)\n            return;\n\n        if (range.start.row > this.row)\n            return;\n\n        if (range.start.row == this.row && range.start.column > this.column)\n            return;\n\n        var row = this.row;\n        var column = this.column;\n        var start = range.start;\n        var end = range.end;\n\n        if (delta.action === \"insertText\") {\n            if (start.row === row && start.column <= column) {\n                if (start.column === column && this.$insertRight) {\n                } else if (start.row === end.row) {\n                    column += end.column - start.column;\n                } else {\n                    column -= start.column;\n                    row += end.row - start.row;\n                }\n            } else if (start.row !== end.row && start.row < row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"insertLines\") {\n            if (start.row === row && column === 0 && this.$insertRight) {\n            }\n            else if (start.row <= row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"removeText\") {\n            if (start.row === row && start.column < column) {\n                if (end.column >= column)\n                    column = start.column;\n                else\n                    column = Math.max(0, column - (end.column - start.column));\n\n            } else if (start.row !== end.row && start.row < row) {\n                if (end.row === row)\n                    column = Math.max(0, column - end.column) + start.column;\n                row -= (end.row - start.row);\n            } else if (end.row === row) {\n                row -= end.row - start.row;\n                column = Math.max(0, column - end.column) + start.column;\n            }\n        } else if (delta.action == \"removeLines\") {\n            if (start.row <= row) {\n                if (end.row <= row)\n                    row -= end.row - start.row;\n                else {\n                    row = start.row;\n                    column = 0;\n                }\n            }\n        }\n\n        this.setPosition(row, column, true);\n    };\n    this.setPosition = function(row, column, noClip) {\n        var pos;\n        if (noClip) {\n            pos = {\n                row: row,\n                column: column\n            };\n        } else {\n            pos = this.$clipPositionToDocument(row, column);\n        }\n\n        if (this.row == pos.row && this.column == pos.column)\n            return;\n\n        var old = {\n            row: this.row,\n            column: this.column\n        };\n\n        this.row = pos.row;\n        this.column = pos.column;\n        this._signal(\"change\", {\n            old: old,\n            value: pos\n        });\n    };\n    this.detach = function() {\n        this.document.removeEventListener(\"change\", this.$onChange);\n    };\n    this.attach = function(doc) {\n        this.document = doc || this.document;\n        this.document.on(\"change\", this.$onChange);\n    };\n    this.$clipPositionToDocument = function(row, column) {\n        var pos = {};\n\n        if (row >= this.document.getLength()) {\n            pos.row = Math.max(0, this.document.getLength() - 1);\n            pos.column = this.document.getLine(pos.row).length;\n        }\n        else if (row < 0) {\n            pos.row = 0;\n            pos.column = 0;\n        }\n        else {\n            pos.row = row;\n            pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n        }\n\n        if (column < 0)\n            pos.column = 0;\n\n        return pos;\n    };\n\n}).call(Anchor.prototype);\n\n});\n\nace.define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\nvar Document = function(text) {\n    this.$lines = [];\n    if (text.length === 0) {\n        this.$lines = [\"\"];\n    } else if (Array.isArray(text)) {\n        this._insertLines(0, text);\n    } else {\n        this.insert({row: 0, column:0}, text);\n    }\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setValue = function(text) {\n        var len = this.getLength();\n        this.remove(new Range(0, 0, len, this.getLine(len-1).length));\n        this.insert({row: 0, column:0}, text);\n    };\n    this.getValue = function() {\n        return this.getAllLines().join(this.getNewLineCharacter());\n    };\n    this.createAnchor = function(row, column) {\n        return new Anchor(this, row, column);\n    };\n    if (\"aaa\".split(/a/).length === 0)\n        this.$split = function(text) {\n            return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n        };\n    else\n        this.$split = function(text) {\n            return text.split(/\\r\\n|\\r|\\n/);\n        };\n\n\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n        this.$autoNewLine = match ? match[1] : \"\\n\";\n        this._signal(\"changeNewLineMode\");\n    };\n    this.getNewLineCharacter = function() {\n        switch (this.$newLineMode) {\n          case \"windows\":\n            return \"\\r\\n\";\n          case \"unix\":\n            return \"\\n\";\n          default:\n            return this.$autoNewLine || \"\\n\";\n        }\n    };\n\n    this.$autoNewLine = \"\";\n    this.$newLineMode = \"auto\";\n    this.setNewLineMode = function(newLineMode) {\n        if (this.$newLineMode === newLineMode)\n            return;\n\n        this.$newLineMode = newLineMode;\n        this._signal(\"changeNewLineMode\");\n    };\n    this.getNewLineMode = function() {\n        return this.$newLineMode;\n    };\n    this.isNewLine = function(text) {\n        return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n    };\n    this.getLine = function(row) {\n        return this.$lines[row] || \"\";\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.$lines.slice(firstRow, lastRow + 1);\n    };\n    this.getAllLines = function() {\n        return this.getLines(0, this.getLength());\n    };\n    this.getLength = function() {\n        return this.$lines.length;\n    };\n    this.getTextRange = function(range) {\n        if (range.start.row == range.end.row) {\n            return this.getLine(range.start.row)\n                .substring(range.start.column, range.end.column);\n        }\n        var lines = this.getLines(range.start.row, range.end.row);\n        lines[0] = (lines[0] || \"\").substring(range.start.column);\n        var l = lines.length - 1;\n        if (range.end.row - range.start.row == l)\n            lines[l] = lines[l].substring(0, range.end.column);\n        return lines.join(this.getNewLineCharacter());\n    };\n\n    this.$clipPosition = function(position) {\n        var length = this.getLength();\n        if (position.row >= length) {\n            position.row = Math.max(0, length - 1);\n            position.column = this.getLine(length-1).length;\n        } else if (position.row < 0)\n            position.row = 0;\n        return position;\n    };\n    this.insert = function(position, text) {\n        if (!text || text.length === 0)\n            return position;\n\n        position = this.$clipPosition(position);\n        if (this.getLength() <= 1)\n            this.$detectNewLine(text);\n\n        var lines = this.$split(text);\n        var firstLine = lines.splice(0, 1)[0];\n        var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];\n\n        position = this.insertInLine(position, firstLine);\n        if (lastLine !== null) {\n            position = this.insertNewLine(position); // terminate first line\n            position = this._insertLines(position.row, lines);\n            position = this.insertInLine(position, lastLine || \"\");\n        }\n        return position;\n    };\n    this.insertLines = function(row, lines) {\n        if (row >= this.getLength())\n            return this.insert({row: row, column: 0}, \"\\n\" + lines.join(\"\\n\"));\n        return this._insertLines(Math.max(row, 0), lines);\n    };\n    this._insertLines = function(row, lines) {\n        if (lines.length == 0)\n            return {row: row, column: 0};\n        while (lines.length > 0xF000) {\n            var end = this._insertLines(row, lines.slice(0, 0xF000));\n            lines = lines.slice(0xF000);\n            row = end.row;\n        }\n\n        var args = [row, 0];\n        args.push.apply(args, lines);\n        this.$lines.splice.apply(this.$lines, args);\n\n        var range = new Range(row, 0, row + lines.length, 0);\n        var delta = {\n            action: \"insertLines\",\n            range: range,\n            lines: lines\n        };\n        this._signal(\"change\", { data: delta });\n        return range.end;\n    };\n    this.insertNewLine = function(position) {\n        position = this.$clipPosition(position);\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column);\n        this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));\n\n        var end = {\n            row : position.row + 1,\n            column : 0\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: this.getNewLineCharacter()\n        };\n        this._signal(\"change\", { data: delta });\n\n        return end;\n    };\n    this.insertInLine = function(position, text) {\n        if (text.length == 0)\n            return position;\n\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column) + text\n                + line.substring(position.column);\n\n        var end = {\n            row : position.row,\n            column : position.column + text.length\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: text\n        };\n        this._signal(\"change\", { data: delta });\n\n        return end;\n    };\n    this.remove = function(range) {\n        if (!(range instanceof Range))\n            range = Range.fromPoints(range.start, range.end);\n        range.start = this.$clipPosition(range.start);\n        range.end = this.$clipPosition(range.end);\n\n        if (range.isEmpty())\n            return range.start;\n\n        var firstRow = range.start.row;\n        var lastRow = range.end.row;\n\n        if (range.isMultiLine()) {\n            var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;\n            var lastFullRow = lastRow - 1;\n\n            if (range.end.column > 0)\n                this.removeInLine(lastRow, 0, range.end.column);\n\n            if (lastFullRow >= firstFullRow)\n                this._removeLines(firstFullRow, lastFullRow);\n\n            if (firstFullRow != firstRow) {\n                this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);\n                this.removeNewLine(range.start.row);\n            }\n        }\n        else {\n            this.removeInLine(firstRow, range.start.column, range.end.column);\n        }\n        return range.start;\n    };\n    this.removeInLine = function(row, startColumn, endColumn) {\n        if (startColumn == endColumn)\n            return;\n\n        var range = new Range(row, startColumn, row, endColumn);\n        var line = this.getLine(row);\n        var removed = line.substring(startColumn, endColumn);\n        var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);\n        this.$lines.splice(row, 1, newLine);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: removed\n        };\n        this._signal(\"change\", { data: delta });\n        return range.start;\n    };\n    this.removeLines = function(firstRow, lastRow) {\n        if (firstRow < 0 || lastRow >= this.getLength())\n            return this.remove(new Range(firstRow, 0, lastRow + 1, 0));\n        return this._removeLines(firstRow, lastRow);\n    };\n\n    this._removeLines = function(firstRow, lastRow) {\n        var range = new Range(firstRow, 0, lastRow + 1, 0);\n        var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);\n\n        var delta = {\n            action: \"removeLines\",\n            range: range,\n            nl: this.getNewLineCharacter(),\n            lines: removed\n        };\n        this._signal(\"change\", { data: delta });\n        return removed;\n    };\n    this.removeNewLine = function(row) {\n        var firstLine = this.getLine(row);\n        var secondLine = this.getLine(row+1);\n\n        var range = new Range(row, firstLine.length, row+1, 0);\n        var line = firstLine + secondLine;\n\n        this.$lines.splice(row, 2, line);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: this.getNewLineCharacter()\n        };\n        this._signal(\"change\", { data: delta });\n    };\n    this.replace = function(range, text) {\n        if (!(range instanceof Range))\n            range = Range.fromPoints(range.start, range.end);\n        if (text.length == 0 && range.isEmpty())\n            return range.start;\n        if (text == this.getTextRange(range))\n            return range.end;\n\n        this.remove(range);\n        if (text) {\n            var end = this.insert(range.start, text);\n        }\n        else {\n            end = range.start;\n        }\n\n        return end;\n    };\n    this.applyDeltas = function(deltas) {\n        for (var i=0; i<deltas.length; i++) {\n            var delta = deltas[i];\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"insertText\")\n                this.insert(range.start, delta.text);\n            else if (delta.action == \"removeLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"removeText\")\n                this.remove(range);\n        }\n    };\n    this.revertDeltas = function(deltas) {\n        for (var i=deltas.length-1; i>=0; i--) {\n            var delta = deltas[i];\n\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"insertText\")\n                this.remove(range);\n            else if (delta.action == \"removeLines\")\n                this._insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"removeText\")\n                this.insert(range.start, delta.text);\n        }\n    };\n    this.indexToPosition = function(index, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        for (var i = startRow || 0, l = lines.length; i < l; i++) {\n            index -= lines[i].length + newlineLength;\n            if (index < 0)\n                return {row: i, column: index + lines[i].length + newlineLength};\n        }\n        return {row: l-1, column: lines[l-1].length};\n    };\n    this.positionToIndex = function(pos, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        var index = 0;\n        var row = Math.min(pos.row, lines.length);\n        for (var i = startRow || 0; i < row; ++i)\n            index += lines[i].length + newlineLength;\n\n        return index + pos.column;\n    };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\nace.define(\"ace/worker/mirror\",[\"require\",\"exports\",\"module\",\"ace/document\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar Document = require(\"../document\").Document;\nvar lang = require(\"../lib/lang\");\n    \nvar Mirror = exports.Mirror = function(sender) {\n    this.sender = sender;\n    var doc = this.doc = new Document(\"\");\n    \n    var deferredUpdate = this.deferredUpdate = lang.delayedCall(this.onUpdate.bind(this));\n    \n    var _self = this;\n    sender.on(\"change\", function(e) {\n        doc.applyDeltas(e.data);\n        if (_self.$timeout)\n            return deferredUpdate.schedule(_self.$timeout);\n        _self.onUpdate();\n    });\n};\n\n(function() {\n    \n    this.$timeout = 500;\n    \n    this.setTimeout = function(timeout) {\n        this.$timeout = timeout;\n    };\n    \n    this.setValue = function(value) {\n        this.doc.setValue(value);\n        this.deferredUpdate.schedule(this.$timeout);\n    };\n    \n    this.getValue = function(callbackId) {\n        this.sender.callback(this.doc.getValue(), callbackId);\n    };\n    \n    this.onUpdate = function() {\n    };\n    \n    this.isPending = function() {\n        return this.deferredUpdate.isPending();\n    };\n    \n}).call(Mirror.prototype);\n\n});\n\nace.define(\"ace/mode/html/saxparser\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\nmodule.exports = (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);throw new Error(\"Cannot find module '\"+o+\"'\")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.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})({\n1:[function(_dereq_,module,exports){\nfunction isScopeMarker(node) {\r\n\tif (node.namespaceURI === \"http://www.w3.org/1999/xhtml\") {\r\n\t\treturn node.localName === \"applet\"\r\n\t\t\t|| node.localName === \"caption\"\r\n\t\t\t|| node.localName === \"marquee\"\r\n\t\t\t|| node.localName === \"object\"\r\n\t\t\t|| node.localName === \"table\"\r\n\t\t\t|| node.localName === \"td\"\r\n\t\t\t|| node.localName === \"th\";\r\n\t}\r\n\tif (node.namespaceURI === \"http://www.w3.org/1998/Math/MathML\") {\r\n\t\treturn node.localName === \"mi\"\r\n\t\t\t|| node.localName === \"mo\"\r\n\t\t\t|| node.localName === \"mn\"\r\n\t\t\t|| node.localName === \"ms\"\r\n\t\t\t|| node.localName === \"mtext\"\r\n\t\t\t|| node.localName === \"annotation-xml\";\r\n\t}\r\n\tif (node.namespaceURI === \"http://www.w3.org/2000/svg\") {\r\n\t\treturn node.localName === \"foreignObject\"\r\n\t\t\t|| node.localName === \"desc\"\r\n\t\t\t|| node.localName === \"title\";\r\n\t}\r\n}\r\n\r\nfunction isListItemScopeMarker(node) {\r\n\treturn isScopeMarker(node)\r\n\t\t|| (node.namespaceURI === \"http://www.w3.org/1999/xhtml\" && node.localName === 'ol')\r\n\t\t|| (node.namespaceURI === \"http://www.w3.org/1999/xhtml\" && node.localName === 'ul');\r\n}\r\n\r\nfunction isTableScopeMarker(node) {\r\n\treturn (node.namespaceURI === \"http://www.w3.org/1999/xhtml\" && node.localName === 'table')\r\n\t\t|| (node.namespaceURI === \"http://www.w3.org/1999/xhtml\" && node.localName === 'html');\r\n}\r\n\r\nfunction isTableBodyScopeMarker(node) {\r\n\treturn (node.namespaceURI === \"http://www.w3.org/1999/xhtml\" && node.localName === 'tbody')\r\n\t\t|| (node.namespaceURI === \"http://www.w3.org/1999/xhtml\" && node.localName === 'tfoot')\r\n\t\t|| (node.namespaceURI === \"http://www.w3.org/1999/xhtml\" && node.localName === 'thead')\r\n\t\t|| (node.namespaceURI === \"http://www.w3.org/1999/xhtml\" && node.localName === 'html');\r\n}\r\n\r\nfunction isTableRowScopeMarker(node) {\r\n\treturn (node.namespaceURI === \"http://www.w3.org/1999/xhtml\" && node.localName === 'tr')\r\n\t\t|| (node.namespaceURI === \"http://www.w3.org/1999/xhtml\" && node.localName === 'html');\r\n}\r\n\r\nfunction isButtonScopeMarker(node) {\r\n\treturn isScopeMarker(node)\r\n\t\t|| (node.namespaceURI === \"http://www.w3.org/1999/xhtml\" && node.localName === 'button');\r\n}\r\n\r\nfunction isSelectScopeMarker(node) {\r\n\treturn !(node.namespaceURI === \"http://www.w3.org/1999/xhtml\" && node.localName === 'optgroup')\r\n\t\t&& !(node.namespaceURI === \"http://www.w3.org/1999/xhtml\" && node.localName === 'option');\r\n}\r\r\nfunction ElementStack() {\r\n\tthis.elements = [];\r\n\tthis.rootNode = null;\r\n\tthis.headElement = null;\r\n\tthis.bodyElement = null;\r\n}\r\r\nElementStack.prototype._inScope = function(localName, isMarker) {\r\n\tfor (var i = this.elements.length - 1; i >= 0; i--) {\r\n\t\tvar node = this.elements[i];\r\n\t\tif (node.localName === localName)\r\n\t\t\treturn true;\r\n\t\tif (isMarker(node))\r\n\t\t\treturn false;\r\n\t}\r\n};\r\nElementStack.prototype.push = function(item) {\r\n\tthis.elements.push(item);\r\n};\r\nElementStack.prototype.pushHtmlElement = function(item) {\r\n\tthis.rootNode = item.node;\r\n\tthis.push(item);\r\n};\r\nElementStack.prototype.pushHeadElement = function(item) {\r\n\tthis.headElement = item.node;\r\n\tthis.push(item);\r\n};\r\nElementStack.prototype.pushBodyElement = function(item) {\r\n\tthis.bodyElement = item.node;\r\n\tthis.push(item);\r\n};\r\nElementStack.prototype.pop = function() {\r\n\treturn this.elements.pop();\r\n};\r\nElementStack.prototype.remove = function(item) {\r\n\tthis.elements.splice(this.elements.indexOf(item), 1);\r\n};\r\nElementStack.prototype.popUntilPopped = function(localName) {\r\n\tvar element;\r\n\tdo {\r\n\t\telement = this.pop();\r\n\t} while (element.localName != localName);\r\n};\r\n\r\nElementStack.prototype.popUntilTableScopeMarker = function() {\r\n\twhile (!isTableScopeMarker(this.top))\r\n\t\tthis.pop();\r\n};\r\n\r\nElementStack.prototype.popUntilTableBodyScopeMarker = function() {\r\n\twhile (!isTableBodyScopeMarker(this.top))\r\n\t\tthis.pop();\r\n};\r\n\r\nElementStack.prototype.popUntilTableRowScopeMarker = function() {\r\n\twhile (!isTableRowScopeMarker(this.top))\r\n\t\tthis.pop();\r\n};\r\nElementStack.prototype.item = function(index) {\r\n\treturn this.elements[index];\r\n};\r\nElementStack.prototype.contains = function(element) {\r\n\treturn this.elements.indexOf(element) !== -1;\r\n};\r\nElementStack.prototype.inScope = function(localName) {\r\n\treturn this._inScope(localName, isScopeMarker);\r\n};\r\nElementStack.prototype.inListItemScope = function(localName) {\r\n\treturn this._inScope(localName, isListItemScopeMarker);\r\n};\r\nElementStack.prototype.inTableScope = function(localName) {\r\n\treturn this._inScope(localName, isTableScopeMarker);\r\n};\r\nElementStack.prototype.inButtonScope = function(localName) {\r\n\treturn this._inScope(localName, isButtonScopeMarker);\r\n};\r\nElementStack.prototype.inSelectScope = function(localName) {\r\n\treturn this._inScope(localName, isSelectScopeMarker);\r\n};\r\nElementStack.prototype.hasNumberedHeaderElementInScope = function() {\r\n\tfor (var i = this.elements.length - 1; i >= 0; i--) {\r\n\t\tvar node = this.elements[i];\r\n\t\tif (node.isNumberedHeader())\r\n\t\t\treturn true;\r\n\t\tif (isScopeMarker(node))\r\n\t\t\treturn false;\r\n\t}\r\n};\r\nElementStack.prototype.furthestBlockForFormattingElement = function(element) {\r\n\tvar furthestBlock = null;\r\n\tfor (var i = this.elements.length - 1; i >= 0; i--) {\r\n\t\tvar node = this.elements[i];\r\n\t\tif (node.node === element)\r\n\t\t\tbreak;\r\n\t\tif (node.isSpecial())\r\n\t\t\tfurthestBlock = node;\r\n\t}\r\n    return furthestBlock;\r\n};\r\nElementStack.prototype.findIndex = function(localName) {\r\n\tfor (var i = this.elements.length - 1; i >= 0; i--) {\r\n\t\tif (this.elements[i].localName == localName)\r\n\t\t\treturn i;\r\n\t}\r\n    return -1;\r\n};\r\n\r\nElementStack.prototype.remove_openElements_until = function(callback) {\r\n\tvar finished = false;\r\n\tvar element;\r\n\twhile (!finished) {\r\n\t\telement = this.elements.pop();\r\n\t\tfinished = callback(element);\r\n\t}\r\n\treturn element;\r\n};\r\n\r\nObject.defineProperty(ElementStack.prototype, 'top', {\r\n\tget: function() {\r\n\t\treturn this.elements[this.elements.length - 1];\r\n\t}\r\n});\r\n\r\nObject.defineProperty(ElementStack.prototype, 'length', {\r\n\tget: function() {\r\n\t\treturn this.elements.length;\r\n\t}\r\n});\r\n\r\nexports.ElementStack = ElementStack;\r\n\n},\n{}],\n2:[function(_dereq_,module,exports){\nvar entities  = _dereq_('html5-entities');\r\nvar InputStream = _dereq_('./InputStream').InputStream;\r\n\r\nvar namedEntityPrefixes = {};\r\nObject.keys(entities).forEach(function (entityKey) {\r\n\tfor (var i = 0; i < entityKey.length; i++) {\r\n\t\tnamedEntityPrefixes[entityKey.substring(0, i + 1)] = true;\r\n\t}\r\n});\r\n\r\nfunction isAlphaNumeric(c) {\r\n\treturn (c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');\r\n}\r\n\r\nfunction isHexDigit(c) {\r\n\treturn (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F');\r\n}\r\n\r\nfunction isDecimalDigit(c) {\r\n\treturn (c >= '0' && c <= '9');\r\n}\r\n\r\nvar EntityParser = {};\r\n\r\nEntityParser.consumeEntity = function(buffer, tokenizer, additionalAllowedCharacter) {\r\n\tvar decodedCharacter = '';\r\n\tvar consumedCharacters = '';\r\n\tvar ch = buffer.char();\r\n\tif (ch === InputStream.EOF)\r\n\t\treturn false;\r\n\tconsumedCharacters += ch;\r\n\tif (ch == '\\t' || ch == '\\n' || ch == '\\v' || ch == ' ' || ch == '<' || ch == '&') {\r\n\t\tbuffer.unget(consumedCharacters);\r\n\t\treturn false;\r\n\t}\r\n\tif (additionalAllowedCharacter === ch) {\r\n\t\tbuffer.unget(consumedCharacters);\r\n\t\treturn false;\r\n\t}\r\n\tif (ch == '#') {\r\n\t\tch = buffer.shift(1);\r\n\t\tif (ch === InputStream.EOF) {\r\n\t\t\ttokenizer._parseError(\"expected-numeric-entity-but-got-eof\");\r\n\t\t\tbuffer.unget(consumedCharacters);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tconsumedCharacters += ch;\r\n\t\tvar radix = 10;\r\n\t\tvar isDigit = isDecimalDigit;\r\n\t\tif (ch == 'x' || ch == 'X') {\r\n\t\t\tradix = 16;\r\n\t\t\tisDigit = isHexDigit;\r\n\t\t\tch = buffer.shift(1);\r\n\t\t\tif (ch === InputStream.EOF) {\r\n\t\t\t\ttokenizer._parseError(\"expected-numeric-entity-but-got-eof\");\r\n\t\t\t\tbuffer.unget(consumedCharacters);\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t\tconsumedCharacters += ch;\r\n\t\t}\r\n\t\tif (isDigit(ch)) {\r\n\t\t\tvar code = '';\r\n\t\t\twhile (ch !== InputStream.EOF && isDigit(ch)) {\r\n\t\t\t\tcode += ch;\r\n\t\t\t\tch = buffer.char();\r\n\t\t\t}\r\n\t\t\tcode = parseInt(code, radix);\r\n\t\t\tvar replacement = this.replaceEntityNumbers(code);\r\n\t\t\tif (replacement) {\r\n\t\t\t\ttokenizer._parseError(\"invalid-numeric-entity-replaced\");\r\n\t\t\t\tcode = replacement;\r\n\t\t\t}\r\n\t\t\tif (code > 0xFFFF && code <= 0x10FFFF) {\r\r\r\n\t\t        code -= 0x10000;\r\r\r\n\t\t        var first = ((0xffc00 & code) >> 10) + 0xD800;\r\r\r\n\t\t        var second = (0x3ff & code) + 0xDC00;\r\n\t\t\t\tdecodedCharacter = String.fromCharCode(first, second);\r\n\t\t\t} else\r\n\t\t\t\tdecodedCharacter = String.fromCharCode(code);\r\n\t\t\tif (ch !== ';') {\r\n\t\t\t\ttokenizer._parseError(\"numeric-entity-without-semicolon\");\r\n\t\t\t\tbuffer.unget(ch);\r\n\t\t\t}\r\n\t\t\treturn decodedCharacter;\r\n\t\t}\r\n\t\tbuffer.unget(consumedCharacters);\r\n\t\ttokenizer._parseError(\"expected-numeric-entity\");\r\n\t\treturn false;\r\n\t}\r\n\tif ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')) {\r\n\t\tvar mostRecentMatch = '';\r\n\t\twhile (namedEntityPrefixes[consumedCharacters]) {\r\n\t\t\tif (entities[consumedCharacters]) {\r\n\t\t\t\tmostRecentMatch = consumedCharacters;\r\n\t\t\t}\r\n\t\t\tif (ch == ';')\r\n\t\t\t\tbreak;\r\n\t\t\tch = buffer.char();\r\n\t\t\tif (ch === InputStream.EOF)\r\n\t\t\t\tbreak;\r\n\t\t\tconsumedCharacters += ch;\r\n\t\t}\r\n\t\tif (!mostRecentMatch) {\r\n\t\t\ttokenizer._parseError(\"expected-named-entity\");\r\n\t\t\tbuffer.unget(consumedCharacters);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tdecodedCharacter = entities[mostRecentMatch];\r\n\t\tif (ch === ';' || !additionalAllowedCharacter || !(isAlphaNumeric(ch) || ch === '=')) {\r\n\t\t\tif (consumedCharacters.length > mostRecentMatch.length) {\r\n\t\t\t\tbuffer.unget(consumedCharacters.substring(mostRecentMatch.length));\r\n\t\t\t}\r\n\t\t\tif (ch !== ';') {\r\n\t\t\t\ttokenizer._parseError(\"named-entity-without-semicolon\");\r\n\t\t\t}\r\n\t\t\treturn decodedCharacter;\r\n\t\t}\r\n\t\tbuffer.unget(consumedCharacters);\r\n\t\treturn false;\r\n\t}\r\n};\r\n\r\nEntityParser.replaceEntityNumbers = function(c) {\r\n\tswitch(c) {\r\n\t\tcase 0x00: return 0xFFFD; // REPLACEMENT CHARACTER\r\n\t\tcase 0x13: return 0x0010; // Carriage return\r\n\t\tcase 0x80: return 0x20AC; // EURO SIGN\r\n\t\tcase 0x81: return 0x0081; // <control>\r\n\t\tcase 0x82: return 0x201A; // SINGLE LOW-9 QUOTATION MARK\r\n\t\tcase 0x83: return 0x0192; // LATIN SMALL LETTER F WITH HOOK\r\n\t\tcase 0x84: return 0x201E; // DOUBLE LOW-9 QUOTATION MARK\r\n\t\tcase 0x85: return 0x2026; // HORIZONTAL ELLIPSIS\r\n\t\tcase 0x86: return 0x2020; // DAGGER\r\n\t\tcase 0x87: return 0x2021; // DOUBLE DAGGER\r\n\t\tcase 0x88: return 0x02C6; // MODIFIER LETTER CIRCUMFLEX ACCENT\r\n\t\tcase 0x89: return 0x2030; // PER MILLE SIGN\r\n\t\tcase 0x8A: return 0x0160; // LATIN CAPITAL LETTER S WITH CARON\r\n\t\tcase 0x8B: return 0x2039; // SINGLE LEFT-POINTING ANGLE QUOTATION MARK\r\n\t\tcase 0x8C: return 0x0152; // LATIN CAPITAL LIGATURE OE\r\n\t\tcase 0x8D: return 0x008D; // <control>\r\n\t\tcase 0x8E: return 0x017D; // LATIN CAPITAL LETTER Z WITH CARON\r\n\t\tcase 0x8F: return 0x008F; // <control>\r\n\t\tcase 0x90: return 0x0090; // <control>\r\n\t\tcase 0x91: return 0x2018; // LEFT SINGLE QUOTATION MARK\r\n\t\tcase 0x92: return 0x2019; // RIGHT SINGLE QUOTATION MARK\r\n\t\tcase 0x93: return 0x201C; // LEFT DOUBLE QUOTATION MARK\r\n\t\tcase 0x94: return 0x201D; // RIGHT DOUBLE QUOTATION MARK\r\n\t\tcase 0x95: return 0x2022; // BULLET\r\n\t\tcase 0x96: return 0x2013; // EN DASH\r\n\t\tcase 0x97: return 0x2014; // EM DASH\r\n\t\tcase 0x98: return 0x02DC; // SMALL TILDE\r\n\t\tcase 0x99: return 0x2122; // TRADE MARK SIGN\r\n\t\tcase 0x9A: return 0x0161; // LATIN SMALL LETTER S WITH CARON\r\n\t\tcase 0x9B: return 0x203A; // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK\r\n\t\tcase 0x9C: return 0x0153; // LATIN SMALL LIGATURE OE\r\n\t\tcase 0x9D: return 0x009D; // <control>\r\n\t\tcase 0x9E: return 0x017E; // LATIN SMALL LETTER Z WITH CARON\r\n\t\tcase 0x9F: return 0x0178; // LATIN CAPITAL LETTER Y WITH DIAERESIS\r\n\t\tdefault:\r\n\t\t\tif ((c >= 0xD800 && c <= 0xDFFF) || c > 0x10FFFF) {\r\n\t\t\t\treturn 0xFFFD;\r\n\t\t\t} else if ((c >= 0x0001 && c <= 0x0008) || (c >= 0x000E && c <= 0x001F) ||\r\n\t\t\t\t(c >= 0x007F && c <= 0x009F) || (c >= 0xFDD0 && c <= 0xFDEF) ||\r\n\t\t\t\tc == 0x000B || c == 0xFFFE || c == 0x1FFFE || c == 0x2FFFFE ||\r\n\t\t\t\tc == 0x2FFFF || c == 0x3FFFE || c == 0x3FFFF || c == 0x4FFFE ||\r\n\t\t\t\tc == 0x4FFFF || c == 0x5FFFE || c == 0x5FFFF || c == 0x6FFFE ||\r\n\t\t\t\tc == 0x6FFFF || c == 0x7FFFE || c == 0x7FFFF || c == 0x8FFFE ||\r\n\t\t\t\tc == 0x8FFFF || c == 0x9FFFE || c == 0x9FFFF || c == 0xAFFFE ||\r\n\t\t\t\tc == 0xAFFFF || c == 0xBFFFE || c == 0xBFFFF || c == 0xCFFFE ||\r\n\t\t\t\tc == 0xCFFFF || c == 0xDFFFE || c == 0xDFFFF || c == 0xEFFFE ||\r\n\t\t\t\tc == 0xEFFFF || c == 0xFFFFE || c == 0xFFFFF || c == 0x10FFFE ||\r\n\t\t\t\tc == 0x10FFFF) {\r\n\t\t\t\treturn c;\r\n\t\t\t}\r\n\t}\r\n};\r\n\r\nexports.EntityParser = EntityParser;\r\n\n},\n{\"./InputStream\":3,\"html5-entities\":12}],\n3:[function(_dereq_,module,exports){\nfunction InputStream() {\n\tthis.data = '';\n\tthis.start = 0;\n\tthis.committed = 0;\n\tthis.eof = false;\n\tthis.lastLocation = {line: 0, column: 0};\n}\n\nInputStream.EOF = -1;\n\nInputStream.DRAIN = -2;\n\nInputStream.prototype = {\n\tslice: function() {\n\t\tif(this.start >= this.data.length) {\n\t\t\tif(!this.eof) throw InputStream.DRAIN;\n\t\t\treturn InputStream.EOF;\n\t\t}\n\t\treturn this.data.slice(this.start, this.data.length);\n\t},\n\tchar: function() {\n\t\tif(!this.eof && this.start >= this.data.length - 1) throw InputStream.DRAIN;\n\t\tif(this.start >= this.data.length) {\n\t\t\treturn InputStream.EOF;\n\t\t}\n\t\tvar ch = this.data[this.start++];\n\t\tif (ch === '\\r')\n\t\t\tch = '\\n';\n\t\treturn ch;\n\t},\n\tadvance: function(amount) {\n\t\tthis.start += amount;\n\t\tif(this.start >= this.data.length) {\n\t\t\tif(!this.eof) throw InputStream.DRAIN;\n\t\t\treturn InputStream.EOF;\n\t\t} else {\n\t\t\tif(this.committed > this.data.length / 2) {\n\t\t\t\tthis.lastLocation = this.location();\n\t\t\t\tthis.data = this.data.slice(this.committed);\n\t\t\t\tthis.start = this.start - this.committed;\n\t\t\t\tthis.committed = 0;\n\t\t\t}\n\t\t}\n\t},\n\tmatchWhile: function(re) {\n\t\tif(this.eof && this.start >= this.data.length ) return '';\n\t\tvar r = new RegExp(\"^\"+re+\"+\");\n\t\tvar m = r.exec(this.slice());\n\t\tif(m) {\n\t\t\tif(!this.eof && m[0].length == this.data.length - this.start) throw InputStream.DRAIN;\n\t\t\tthis.advance(m[0].length);\n\t\t\treturn m[0];\n\t\t} else {\n\t\t\treturn '';\n\t\t}\n\t},\n\tmatchUntil: function(re) {\n\t\tvar m, s;\n\t\ts = this.slice();\n\t\tif(s === InputStream.EOF) {\n\t\t\treturn '';\n\t\t} else if(m = new RegExp(re + (this.eof ? \"|$\" : \"\")).exec(s)) {\n\t\t\tvar t = this.data.slice(this.start, this.start + m.index);\n\t\t\tthis.advance(m.index);\n\t\t\treturn t.replace(/\\r/g, '\\n').replace(/\\n{2,}/g, '\\n');\n\t\t} else {\n\t\t\tthrow InputStream.DRAIN;\n\t\t}\n\t},\n\tappend: function(data) {\n\t\tthis.data += data;\n\t},\n\tshift: function(n) {\n\t\tif(!this.eof && this.start + n >= this.data.length) throw InputStream.DRAIN;\n\t\tif(this.eof && this.start >= this.data.length) return InputStream.EOF;\n\t\tvar d = this.data.slice(this.start, this.start + n).toString();\n\t\tthis.advance(Math.min(n, this.data.length - this.start));\n\t\treturn d;\n\t},\n\tpeek: function(n) {\n\t\tif(!this.eof && this.start + n >= this.data.length) throw InputStream.DRAIN;\n\t\tif(this.eof && this.start >= this.data.length) return InputStream.EOF;\n\t\treturn this.data.slice(this.start, Math.min(this.start + n, this.data.length)).toString();\n\t},\n\tlength: function() {\n\t\treturn this.data.length - this.start - 1;\n\t},\n\tunget: function(d) {\n\t\tif(d === InputStream.EOF) return;\n\t\tthis.start -= (d.length);\n\t},\n\tundo: function() {\n\t\tthis.start = this.committed;\n\t},\n\tcommit: function() {\n\t\tthis.committed = this.start;\n\t},\n\tlocation: function() {\n\t\tvar lastLine = this.lastLocation.line;\n\t\tvar lastColumn = this.lastLocation.column;\n\t\tvar read = this.data.slice(0, this.committed);\n\t\tvar newlines = read.match(/\\n/g);\n\t\tvar line = newlines ? lastLine + newlines.length : lastLine;\n\t\tvar column = newlines ? read.length - read.lastIndexOf('\\n') - 1 : lastColumn + read.length;\n\t\treturn {line: line, column: column};\n\t}\n};\n\nexports.InputStream = InputStream;\n\n},\n{}],\n4:[function(_dereq_,module,exports){\nvar SpecialElements = {\r\n\t\"http://www.w3.org/1999/xhtml\": [\r\n\t\t'address',\r\n\t\t'applet',\r\n\t\t'area',\r\n\t\t'article',\r\n\t\t'aside',\r\n\t\t'base',\r\n\t\t'basefont',\r\n\t\t'bgsound',\r\n\t\t'blockquote',\r\n\t\t'body',\r\n\t\t'br',\r\n\t\t'button',\r\n\t\t'caption',\r\n\t\t'center',\r\n\t\t'col',\r\n\t\t'colgroup',\r\n\t\t'dd',\r\n\t\t'details',\r\n\t\t'dir',\r\n\t\t'div',\r\n\t\t'dl',\r\n\t\t'dt',\r\n\t\t'embed',\r\n\t\t'fieldset',\r\n\t\t'figcaption',\r\n\t\t'figure',\r\n\t\t'footer',\r\n\t\t'form',\r\n\t\t'frame',\r\n\t\t'frameset',\r\n\t\t'h1',\r\n\t\t'h2',\r\n\t\t'h3',\r\n\t\t'h4',\r\n\t\t'h5',\r\n\t\t'h6',\r\n\t\t'head',\r\n\t\t'header',\r\n\t\t'hgroup',\r\n\t\t'hr',\r\n\t\t'html',\r\n\t\t'iframe',\r\n\t\t'img',\r\n\t\t'input',\r\n\t\t'isindex',\r\n\t\t'li',\r\n\t\t'link',\r\n\t\t'listing',\r\n\t\t'main',\r\n\t\t'marquee',\r\n\t\t'menu',\r\n\t\t'menuitem',\r\n\t\t'meta',\r\n\t\t'nav',\r\n\t\t'noembed',\r\n\t\t'noframes',\r\n\t\t'noscript',\r\n\t\t'object',\r\n\t\t'ol',\r\n\t\t'p',\r\n\t\t'param',\r\n\t\t'plaintext',\r\n\t\t'pre',\r\n\t\t'script',\r\n\t\t'section',\r\n\t\t'select',\r\n\t\t'source',\r\n\t\t'style',\r\n\t\t'summary',\r\n\t\t'table',\r\n\t\t'tbody',\r\n\t\t'td',\r\n\t\t'textarea',\r\n\t\t'tfoot',\r\n\t\t'th',\r\n\t\t'thead',\r\n\t\t'title',\r\n\t\t'tr',\r\n\t\t'track',\r\n\t\t'ul',\r\n\t\t'wbr',\r\n\t\t'xmp'\r\n\t],\r\n\t\"http://www.w3.org/1998/Math/MathML\": [\r\n\t\t'mi',\r\n\t\t'mo',\r\n\t\t'mn',\r\n\t\t'ms',\r\n\t\t'mtext',\r\n\t\t'annotation-xml'\r\n\t],\r\n\t\"http://www.w3.org/2000/svg\": [\r\n\t\t'foreignObject',\r\n\t\t'desc',\r\n\t\t'title'\r\n\t]\r\n};\r\n\r\n\r\nfunction StackItem(namespaceURI, localName, attributes, node) {\r\n\tthis.localName = localName;\r\n\tthis.namespaceURI = namespaceURI;\r\n\tthis.attributes = attributes;\r\n\tthis.node = node;\r\n}\r\r\nStackItem.prototype.isSpecial = function() {\r\n\treturn this.namespaceURI in SpecialElements &&\r\n\t\tSpecialElements[this.namespaceURI].indexOf(this.localName) > -1;\r\n};\r\n\r\nStackItem.prototype.isFosterParenting = function() {\r\n\tif (this.namespaceURI === \"http://www.w3.org/1999/xhtml\") {\r\n\t\treturn this.localName === 'table' ||\r\n\t\t\tthis.localName === 'tbody' ||\r\n\t\t\tthis.localName === 'tfoot' ||\r\n\t\t\tthis.localName === 'thead' ||\r\n\t\t\tthis.localName === 'tr';\r\n\t}\r\n\treturn false;\r\n};\r\n\r\nStackItem.prototype.isNumberedHeader = function() {\r\n\tif (this.namespaceURI === \"http://www.w3.org/1999/xhtml\") {\r\n\t\treturn this.localName === 'h1' ||\r\n\t\t\tthis.localName === 'h2' ||\r\n\t\t\tthis.localName === 'h3' ||\r\n\t\t\tthis.localName === 'h4' ||\r\n\t\t\tthis.localName === 'h5' ||\r\n\t\t\tthis.localName === 'h6';\r\n\t}\r\n\treturn false;\r\n};\r\n\r\nStackItem.prototype.isForeign = function() {\r\n\treturn this.namespaceURI != \"http://www.w3.org/1999/xhtml\";\r\n};\r\n\r\nfunction getAttribute(item, name) {\r\n\tfor (var i = 0; i < item.attributes.length; i++) {\r\n\t\tif (item.attributes[i].nodeName == name)\r\n\t\t\treturn item.attributes[i].nodeValue;\r\n\t}\r\n\treturn null;\r\n}\r\n\r\nStackItem.prototype.isHtmlIntegrationPoint = function() {\r\n\tif (this.namespaceURI === \"http://www.w3.org/1998/Math/MathML\") {\r\n\t\tif (this.localName !== \"annotation-xml\")\r\n\t\t\treturn false;\r\n\t\tvar encoding = getAttribute(this, 'encoding');\r\n\t\tif (!encoding)\r\n\t\t\treturn false;\r\n\t\tencoding = encoding.toLowerCase();\r\n\t\treturn encoding === \"text/html\" || encoding === \"application/xhtml+xml\";\r\n\t}\r\n\tif (this.namespaceURI === \"http://www.w3.org/2000/svg\") {\r\n\t\treturn this.localName === \"foreignObject\"\r\n\t\t\t|| this.localName === \"desc\"\r\n\t\t\t|| this.localName === \"title\";\r\n\t}\r\n\treturn false;\r\n};\r\n\r\nStackItem.prototype.isMathMLTextIntegrationPoint = function() {\r\n\tif (this.namespaceURI === \"http://www.w3.org/1998/Math/MathML\") {\r\n\t\treturn this.localName === \"mi\"\r\n\t\t\t|| this.localName === \"mo\"\r\n\t\t\t|| this.localName === \"mn\"\r\n\t\t\t|| this.localName === \"ms\"\r\n\t\t\t|| this.localName === \"mtext\";\r\n\t}\r\n\treturn false;\r\n};\r\n\r\nexports.StackItem = StackItem;\r\n\n},\n{}],\n5:[function(_dereq_,module,exports){\nvar InputStream = _dereq_('./InputStream').InputStream;\nvar EntityParser = _dereq_('./EntityParser').EntityParser;\n\nfunction isWhitespace(c){\n\treturn c === \" \" || c === \"\\n\" || c === \"\\t\" || c === \"\\r\" || c === \"\\f\";\n}\n\nfunction isAlpha(c) {\n\treturn (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');\n}\nfunction Tokenizer(tokenHandler) {\n\tthis._tokenHandler = tokenHandler;\n\tthis._state = Tokenizer.DATA;\n\tthis._inputStream = new InputStream();\n\tthis._currentToken = null;\n\tthis._temporaryBuffer = '';\n\tthis._additionalAllowedCharacter = '';\n}\n\nTokenizer.prototype._parseError = function(code, args) {\n\tthis._tokenHandler.parseError(code, args);\n};\n\nTokenizer.prototype._emitToken = function(token) {\n\tif (token.type === 'StartTag') {\n\t\tfor (var i = 1; i < token.data.length; i++) {\n\t\t\tif (!token.data[i].nodeName)\n\t\t\t\ttoken.data.splice(i--, 1);\n\t\t}\n\t} else if (token.type === 'EndTag') {\n\t\tif (token.selfClosing) {\n\t\t\tthis._parseError('self-closing-flag-on-end-tag');\n\t\t}\n\t\tif (token.data.length !== 0) {\n\t\t\tthis._parseError('attributes-in-end-tag');\n\t\t}\n\t}\n\tthis._tokenHandler.processToken(token);\n\tif (token.type === 'StartTag' && token.selfClosing && !this._tokenHandler.isSelfClosingFlagAcknowledged()) {\n\t\tthis._parseError('non-void-element-with-trailing-solidus', {name: token.name});\n\t}\n};\n\nTokenizer.prototype._emitCurrentToken = function() {\n\tthis._state = Tokenizer.DATA;\n\tthis._emitToken(this._currentToken);\n};\n\nTokenizer.prototype._currentAttribute = function() {\n\treturn this._currentToken.data[this._currentToken.data.length - 1];\n};\n\nTokenizer.prototype.setState = function(state) {\n\tthis._state = state;\n};\n\nTokenizer.prototype.tokenize = function(source) {\n\tTokenizer.DATA = data_state;\n\tTokenizer.RCDATA = rcdata_state;\n\tTokenizer.RAWTEXT = rawtext_state;\n\tTokenizer.SCRIPT_DATA = script_data_state;\n\tTokenizer.PLAINTEXT = plaintext_state;\n\n\n\tthis._state = Tokenizer.DATA;\n\n\tthis._inputStream.append(source);\n\n\tthis._tokenHandler.startTokenization(this);\n\n\tthis._inputStream.eof = true;\n\n\tvar tokenizer = this;\n\n\twhile (this._state.call(this, this._inputStream));\n\n\n\tfunction data_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._emitToken({type: 'EOF', data: null});\n\t\t\treturn false;\n\t\t} else if (data === '&') {\n\t\t\ttokenizer.setState(character_reference_in_data_state);\n\t\t} else if (data === '<') {\n\t\t\ttokenizer.setState(tag_open_state);\n\t\t} else if (data === '\\u0000') {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: data});\n\t\t\tbuffer.commit();\n\t\t} else {\n\t\t\tvar chars = buffer.matchUntil(\"&|<|\\u0000\");\n\t\t\ttokenizer._emitToken({type: 'Characters', data: data + chars});\n\t\t\tbuffer.commit();\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction character_reference_in_data_state(buffer) {\n\t\tvar character = EntityParser.consumeEntity(buffer, tokenizer);\n\t\ttokenizer.setState(data_state);\n\t\ttokenizer._emitToken({type: 'Characters', data: character || '&'});\n\t\treturn true;\n\t}\n\n\tfunction rcdata_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._emitToken({type: 'EOF', data: null});\n\t\t\treturn false;\n\t\t} else if (data === '&') {\n\t\t\ttokenizer.setState(character_reference_in_rcdata_state);\n\t\t} else if (data === '<') {\n\t\t\ttokenizer.setState(rcdata_less_than_sign_state);\n\t\t} else if (data === \"\\u0000\") {\n\t\t\ttokenizer._parseError(\"invalid-codepoint\");\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '\\uFFFD'});\n\t\t\tbuffer.commit();\n\t\t} else {\n\t\t\tvar chars = buffer.matchUntil(\"&|<|\\u0000\");\n\t\t\ttokenizer._emitToken({type: 'Characters', data: data + chars});\n\t\t\tbuffer.commit();\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction character_reference_in_rcdata_state(buffer) {\n\t\tvar character = EntityParser.consumeEntity(buffer, tokenizer);\n\t\ttokenizer.setState(rcdata_state);\n\t\ttokenizer._emitToken({type: 'Characters', data: character || '&'});\n\t\treturn true;\n\t}\n\n\tfunction rawtext_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._emitToken({type: 'EOF', data: null});\n\t\t\treturn false;\n\t\t} else if (data === '<') {\n\t\t\ttokenizer.setState(rawtext_less_than_sign_state);\n\t\t} else if (data === \"\\u0000\") {\n\t\t\ttokenizer._parseError(\"invalid-codepoint\");\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '\\uFFFD'});\n\t\t\tbuffer.commit();\n\t\t} else {\n\t\t\tvar chars = buffer.matchUntil(\"<|\\u0000\");\n\t\t\ttokenizer._emitToken({type: 'Characters', data: data + chars});\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction plaintext_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._emitToken({type: 'EOF', data: null});\n\t\t\treturn false;\n\t\t} else if (data === \"\\u0000\") {\n\t\t\ttokenizer._parseError(\"invalid-codepoint\");\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '\\uFFFD'});\n\t\t\tbuffer.commit();\n\t\t} else {\n\t\t\tvar chars = buffer.matchUntil(\"\\u0000\");\n\t\t\ttokenizer._emitToken({type: 'Characters', data: data + chars});\n\t\t}\n\t\treturn true;\n\t}\n\n\n\tfunction script_data_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._emitToken({type: 'EOF', data: null});\n\t\t\treturn false;\n\t\t} else if (data === '<') {\n\t\t\ttokenizer.setState(script_data_less_than_sign_state);\n\t\t} else if (data === '\\u0000') {\n\t\t\ttokenizer._parseError(\"invalid-codepoint\");\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '\\uFFFD'});\n\t\t\tbuffer.commit();\n\t\t} else {\n\t\t\tvar chars = buffer.matchUntil(\"<|\\u0000\");\n\t\t\ttokenizer._emitToken({type: 'Characters', data: data + chars});\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction rcdata_less_than_sign_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === \"/\") {\n\t\t\tthis._temporaryBuffer = '';\n\t\t\ttokenizer.setState(rcdata_end_tag_open_state);\n\t\t} else {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '<'});\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(rcdata_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction rcdata_end_tag_open_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (isAlpha(data)) {\n\t\t\tthis._temporaryBuffer += data;\n\t\t\ttokenizer.setState(rcdata_end_tag_name_state);\n\t\t} else {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '</'});\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(rcdata_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction rcdata_end_tag_name_state(buffer) {\n\t\tvar appropriate = tokenizer._currentToken && (tokenizer._currentToken.name === this._temporaryBuffer.toLowerCase());\n\t\tvar data = buffer.char();\n\t\tif (isWhitespace(data) && appropriate) {\n\t\t\ttokenizer._currentToken = {type: 'EndTag', name: this._temporaryBuffer, data: [], selfClosing: false};\n\t\t\ttokenizer.setState(before_attribute_name_state);\n\t\t} else if (data === '/' && appropriate) {\n\t\t\ttokenizer._currentToken = {type: 'EndTag', name: this._temporaryBuffer, data: [], selfClosing: false};\n\t\t\ttokenizer.setState(self_closing_tag_state);\n\t\t} else if (data === '>' && appropriate) {\n\t\t\ttokenizer._currentToken = {type: 'EndTag', name: this._temporaryBuffer, data: [], selfClosing: false};\n\t\t\ttokenizer._emitCurrentToken();\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (isAlpha(data)) {\n\t\t\tthis._temporaryBuffer += data;\n\t\t\tbuffer.commit();\n\t\t} else {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '</' + this._temporaryBuffer});\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(rcdata_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction rawtext_less_than_sign_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === \"/\") {\n\t\t\tthis._temporaryBuffer = '';\n\t\t\ttokenizer.setState(rawtext_end_tag_open_state);\n\t\t} else {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '<'});\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(rawtext_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction rawtext_end_tag_open_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (isAlpha(data)) {\n\t\t\tthis._temporaryBuffer += data;\n\t\t\ttokenizer.setState(rawtext_end_tag_name_state);\n\t\t} else {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '</'});\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(rawtext_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction rawtext_end_tag_name_state(buffer) {\n\t\tvar appropriate = tokenizer._currentToken && (tokenizer._currentToken.name === this._temporaryBuffer.toLowerCase());\n\t\tvar data = buffer.char();\n\t\tif (isWhitespace(data) && appropriate) {\n\t\t\ttokenizer._currentToken = {type: 'EndTag', name: this._temporaryBuffer, data: [], selfClosing: false};\n\t\t\ttokenizer.setState(before_attribute_name_state);\n\t\t} else if (data === '/' && appropriate) {\n\t\t\ttokenizer._currentToken = {type: 'EndTag', name: this._temporaryBuffer, data: [], selfClosing: false};\n\t\t\ttokenizer.setState(self_closing_tag_state);\n\t\t} else if (data === '>' && appropriate) {\n\t\t\ttokenizer._currentToken = {type: 'EndTag', name: this._temporaryBuffer, data: [], selfClosing: false};\n\t\t\ttokenizer._emitCurrentToken();\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (isAlpha(data)) {\n\t\t\tthis._temporaryBuffer += data;\n\t\t\tbuffer.commit();\n\t\t} else {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '</' + this._temporaryBuffer});\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(rawtext_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction script_data_less_than_sign_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === \"/\") {\n\t\t\tthis._temporaryBuffer = '';\n\t\t\ttokenizer.setState(script_data_end_tag_open_state);\n\t\t} else if (data === '!') {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '<!'});\n\t\t\ttokenizer.setState(script_data_escape_start_state);\n\t\t} else {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '<'});\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(script_data_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction script_data_end_tag_open_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (isAlpha(data)) {\n\t\t\tthis._temporaryBuffer += data;\n\t\t\ttokenizer.setState(script_data_end_tag_name_state);\n\t\t} else {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '</'});\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(script_data_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction script_data_end_tag_name_state(buffer) {\n\t\tvar appropriate = tokenizer._currentToken && (tokenizer._currentToken.name === this._temporaryBuffer.toLowerCase());\n\t\tvar data = buffer.char();\n\t\tif (isWhitespace(data) && appropriate) {\n\t\t\ttokenizer._currentToken = {type: 'EndTag', name: 'script', data: [], selfClosing: false};\n\t\t\ttokenizer.setState(before_attribute_name_state);\n\t\t} else if (data === '/' && appropriate) {\n\t\t\ttokenizer._currentToken = {type: 'EndTag', name: 'script', data: [], selfClosing: false};\n\t\t\ttokenizer.setState(self_closing_tag_state);\n\t\t} else if (data === '>' && appropriate) {\n\t\t\ttokenizer._currentToken = {type: 'EndTag', name: 'script', data: [], selfClosing: false};\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else if (isAlpha(data)) {\n\t\t\tthis._temporaryBuffer += data;\n\t\t\tbuffer.commit();\n\t\t} else {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '</' + this._temporaryBuffer});\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(script_data_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction script_data_escape_start_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === '-') {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '-'});\n\t\t\ttokenizer.setState(script_data_escape_start_dash_state);\n\t\t} else {\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(script_data_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction script_data_escape_start_dash_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === '-') {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '-'});\n\t\t\ttokenizer.setState(script_data_escaped_dash_dash_state);\n\t\t} else {\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(script_data_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction script_data_escaped_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === '-') {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '-'});\n\t\t\ttokenizer.setState(script_data_escaped_dash_state);\n\t\t} else if (data === '<') {\n\t\t\ttokenizer.setState(script_data_escaped_less_then_sign_state);\n\t\t} else if (data === '\\u0000') {\n\t\t\ttokenizer._parseError(\"invalid-codepoint\");\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '\\uFFFD'});\n\t\t\tbuffer.commit();\n\t\t} else {\n\t\t\tvar chars = buffer.matchUntil('<|-|\\u0000');\n\t\t\ttokenizer._emitToken({type: 'Characters', data: data + chars});\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction script_data_escaped_dash_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === '-') {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '-'});\n\t\t\ttokenizer.setState(script_data_escaped_dash_dash_state);\n\t\t} else if (data === '<') {\n\t\t\ttokenizer.setState(script_data_escaped_less_then_sign_state);\n\t\t} else if (data === '\\u0000') {\n\t\t\ttokenizer._parseError(\"invalid-codepoint\");\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '\\uFFFD'});\n\t\t\ttokenizer.setState(script_data_escaped_state);\n\t\t} else {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: data});\n\t\t\ttokenizer.setState(script_data_escaped_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction script_data_escaped_dash_dash_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError('eof-in-script');\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === '<') {\n\t\t\ttokenizer.setState(script_data_escaped_less_then_sign_state);\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '>'});\n\t\t\ttokenizer.setState(script_data_state);\n\t\t} else if (data === '\\u0000') {\n\t\t\ttokenizer._parseError(\"invalid-codepoint\");\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '\\uFFFD'});\n\t\t\ttokenizer.setState(script_data_escaped_state);\n\t\t} else {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: data});\n\t\t\ttokenizer.setState(script_data_escaped_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction script_data_escaped_less_then_sign_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === '/') {\n\t\t\tthis._temporaryBuffer = '';\n\t\t\ttokenizer.setState(script_data_escaped_end_tag_open_state);\n\t\t} else if (isAlpha(data)) {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '<' + data});\n\t\t\tthis._temporaryBuffer = data;\n\t\t\ttokenizer.setState(script_data_double_escape_start_state);\n\t\t} else {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '<'});\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(script_data_escaped_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction script_data_escaped_end_tag_open_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (isAlpha(data)) {\n\t\t\tthis._temporaryBuffer = data;\n\t\t\ttokenizer.setState(script_data_escaped_end_tag_name_state);\n\t\t} else {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '</'});\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(script_data_escaped_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction script_data_escaped_end_tag_name_state(buffer) {\n\t\tvar appropriate = tokenizer._currentToken && (tokenizer._currentToken.name === this._temporaryBuffer.toLowerCase());\n\t\tvar data = buffer.char();\n\t\tif (isWhitespace(data) && appropriate) {\n\t\t\ttokenizer._currentToken = {type: 'EndTag', name: 'script', data: [], selfClosing: false};\n\t\t\ttokenizer.setState(before_attribute_name_state);\n\t\t} else if (data === '/' && appropriate) {\n\t\t\ttokenizer._currentToken = {type: 'EndTag', name: 'script', data: [], selfClosing: false};\n\t\t\ttokenizer.setState(self_closing_tag_state);\n\t\t} else if (data === '>' &&  appropriate) {\n\t\t\ttokenizer._currentToken = {type: 'EndTag', name: 'script', data: [], selfClosing: false};\n\t\t\ttokenizer.setState(data_state);\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else if (isAlpha(data)) {\n\t\t\tthis._temporaryBuffer += data;\n\t\t\tbuffer.commit();\n\t\t} else {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '</' + this._temporaryBuffer});\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(script_data_escaped_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction script_data_double_escape_start_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (isWhitespace(data) || data === '/' || data === '>') {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: data});\n\t\t\tif (this._temporaryBuffer.toLowerCase() === 'script')\n\t\t\t\ttokenizer.setState(script_data_double_escaped_state);\n\t\t\telse\n\t\t\t\ttokenizer.setState(script_data_escaped_state);\n\t\t} else if (isAlpha(data)) {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: data});\n\t\t\tthis._temporaryBuffer += data;\n\t\t\tbuffer.commit();\n\t\t} else {\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(script_data_escaped_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction script_data_double_escaped_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError('eof-in-script');\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === '-') {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '-'});\n\t\t\ttokenizer.setState(script_data_double_escaped_dash_state);\n\t\t} else if (data === '<') {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '<'});\n\t\t\ttokenizer.setState(script_data_double_escaped_less_than_sign_state);\n\t\t} else if (data === '\\u0000') {\n\t\t\ttokenizer._parseError('invalid-codepoint');\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '\\uFFFD'});\n\t\t\tbuffer.commit();\n\t\t} else {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: data});\n\t\t\tbuffer.commit();\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction script_data_double_escaped_dash_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError('eof-in-script');\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === '-') {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '-'});\n\t\t\ttokenizer.setState(script_data_double_escaped_dash_dash_state);\n\t\t} else if (data === '<') {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '<'});\n\t\t\ttokenizer.setState(script_data_double_escaped_less_than_sign_state);\n\t\t} else if (data === '\\u0000') {\n\t\t\ttokenizer._parseError('invalid-codepoint');\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '\\uFFFD'});\n\t\t\ttokenizer.setState(script_data_double_escaped_state);\n\t\t} else {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: data});\n\t\t\ttokenizer.setState(script_data_double_escaped_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction script_data_double_escaped_dash_dash_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError('eof-in-script');\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === '-') {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '-'});\n\t\t\tbuffer.commit();\n\t\t} else if (data === '<') {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '<'});\n\t\t\ttokenizer.setState(script_data_double_escaped_less_than_sign_state);\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '>'});\n\t\t\ttokenizer.setState(script_data_state);\n\t\t} else if (data === '\\u0000') {\n\t\t\ttokenizer._parseError('invalid-codepoint');\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '\\uFFFD'});\n\t\t\ttokenizer.setState(script_data_double_escaped_state);\n\t\t} else {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: data});\n\t\t\ttokenizer.setState(script_data_double_escaped_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction script_data_double_escaped_less_than_sign_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === '/') {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '/'});\n\t\t\tthis._temporaryBuffer = '';\n\t\t\ttokenizer.setState(script_data_double_escape_end_state);\n\t\t} else {\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(script_data_double_escaped_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction script_data_double_escape_end_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (isWhitespace(data) || data === '/' || data === '>') {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: data});\n\t\t\tif (this._temporaryBuffer.toLowerCase() === 'script')\n\t\t\t\ttokenizer.setState(script_data_escaped_state);\n\t\t\telse\n\t\t\t\ttokenizer.setState(script_data_double_escaped_state);\n\t\t} else if (isAlpha(data)) {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: data});\n\t\t\tthis._temporaryBuffer += data;\n\t\t\tbuffer.commit();\n\t\t} else {\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(script_data_double_escaped_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction tag_open_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"bare-less-than-sign-at-eof\");\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '<'});\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (isAlpha(data)) {\n\t\t\ttokenizer._currentToken = {type: 'StartTag', name: data.toLowerCase(), data: []};\n\t\t\ttokenizer.setState(tag_name_state);\n\t\t} else if (data === '!') {\n\t\t\ttokenizer.setState(markup_declaration_open_state);\n\t\t} else if (data === '/') {\n\t\t\ttokenizer.setState(close_tag_open_state);\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._parseError(\"expected-tag-name-but-got-right-bracket\");\n\t\t\ttokenizer._emitToken({type: 'Characters', data: \"<>\"});\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === '?') {\n\t\t\ttokenizer._parseError(\"expected-tag-name-but-got-question-mark\");\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(bogus_comment_state);\n\t\t} else {\n\t\t\ttokenizer._parseError(\"expected-tag-name\");\n\t\t\ttokenizer._emitToken({type: 'Characters', data: \"<\"});\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction close_tag_open_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"expected-closing-tag-but-got-eof\");\n\t\t\ttokenizer._emitToken({type: 'Characters', data: '</'});\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (isAlpha(data)) {\n\t\t\ttokenizer._currentToken = {type: 'EndTag', name: data.toLowerCase(), data: []};\n\t\t\ttokenizer.setState(tag_name_state);\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._parseError(\"expected-closing-tag-but-got-right-bracket\");\n\t\t\ttokenizer.setState(data_state);\n\t\t} else {\n\t\t\ttokenizer._parseError(\"expected-closing-tag-but-got-char\", {data: data}); // param 1 is datavars:\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(bogus_comment_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction tag_name_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError('eof-in-tag-name');\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (isWhitespace(data)) {\n\t\t\ttokenizer.setState(before_attribute_name_state);\n\t\t} else if (isAlpha(data)) {\n\t\t\ttokenizer._currentToken.name += data.toLowerCase();\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else if (data === '/') {\n\t\t\ttokenizer.setState(self_closing_tag_state);\n\t\t} else if (data === '\\u0000') {\n\t\t\ttokenizer._parseError(\"invalid-codepoint\");\n\t\t\ttokenizer._currentToken.name += \"\\uFFFD\";\n\t\t} else {\n\t\t\ttokenizer._currentToken.name += data;\n\t\t}\n\t\tbuffer.commit();\n\n\t\treturn true;\n\t}\n\n\tfunction before_attribute_name_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"expected-attribute-name-but-got-eof\");\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (isWhitespace(data)) {\n\t\t\treturn true;\n\t\t} else if (isAlpha(data)) {\n\t\t\ttokenizer._currentToken.data.push({nodeName: data.toLowerCase(), nodeValue: \"\"});\n\t\t\ttokenizer.setState(attribute_name_state);\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else if (data === '/') {\n\t\t\ttokenizer.setState(self_closing_tag_state);\n\t\t} else if (data === \"'\" || data === '\"' || data === '=' || data === '<') {\n\t\t\ttokenizer._parseError(\"invalid-character-in-attribute-name\");\n\t\t\ttokenizer._currentToken.data.push({nodeName: data, nodeValue: \"\"});\n\t\t\ttokenizer.setState(attribute_name_state);\n\t\t} else if (data === '\\u0000') {\n\t\t\ttokenizer._parseError(\"invalid-codepoint\");\n\t\t\ttokenizer._currentToken.data.push({nodeName: \"\\uFFFD\", nodeValue: \"\"});\n\t\t} else {\n\t\t\ttokenizer._currentToken.data.push({nodeName: data, nodeValue: \"\"});\n\t\t\ttokenizer.setState(attribute_name_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction attribute_name_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tvar leavingThisState = true;\n\t\tvar shouldEmit = false;\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"eof-in-attribute-name\");\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t\tshouldEmit = true;\n\t\t} else if (data === '=') {\n\t\t\ttokenizer.setState(before_attribute_value_state);\n\t\t} else if (isAlpha(data)) {\n\t\t\ttokenizer._currentAttribute().nodeName += data.toLowerCase();\n\t\t\tleavingThisState = false;\n\t\t} else if (data === '>') {\n\t\t\tshouldEmit = true;\n\t\t} else if (isWhitespace(data)) {\n\t\t\ttokenizer.setState(after_attribute_name_state);\n\t\t} else if (data === '/') {\n\t\t\ttokenizer.setState(self_closing_tag_state);\n\t\t} else if (data === \"'\" || data === '\"') {\n\t\t\ttokenizer._parseError(\"invalid-character-in-attribute-name\");\n\t\t\ttokenizer._currentAttribute().nodeName += data;\n\t\t\tleavingThisState = false;\n\t\t} else if (data === '\\u0000') {\n\t\t\ttokenizer._parseError(\"invalid-codepoint\");\n\t\t\ttokenizer._currentAttribute().nodeName += \"\\uFFFD\";\n\t\t} else {\n\t\t\ttokenizer._currentAttribute().nodeName += data;\n\t\t\tleavingThisState = false;\n\t\t}\n\n\t\tif (leavingThisState) {\n\t\t\tvar attributes = tokenizer._currentToken.data;\n\t\t\tvar currentAttribute = attributes[attributes.length - 1];\n\t\t\tfor (var i = attributes.length - 2; i >= 0; i--) {\n\t\t\t\tif (currentAttribute.nodeName === attributes[i].nodeName) {\n\t\t\t\t\ttokenizer._parseError(\"duplicate-attribute\", {name: currentAttribute.nodeName});\n\t\t\t\t\tcurrentAttribute.nodeName = null;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (shouldEmit)\n\t\t\t\ttokenizer._emitCurrentToken();\n\t\t} else {\n\t\t\tbuffer.commit();\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction after_attribute_name_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"expected-end-of-tag-but-got-eof\");\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (isWhitespace(data)) {\n\t\t\treturn true;\n\t\t} else if (data === '=') {\n\t\t\ttokenizer.setState(before_attribute_value_state);\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else if (isAlpha(data)) {\n\t\t\ttokenizer._currentToken.data.push({nodeName: data, nodeValue: \"\"});\n\t\t\ttokenizer.setState(attribute_name_state);\n\t\t} else if (data === '/') {\n\t\t\ttokenizer.setState(self_closing_tag_state);\n\t\t} else if (data === \"'\" || data === '\"' || data === '<') {\n\t\t\ttokenizer._parseError(\"invalid-character-after-attribute-name\");\n\t\t\ttokenizer._currentToken.data.push({nodeName: data, nodeValue: \"\"});\n\t\t\ttokenizer.setState(attribute_name_state);\n\t\t} else if (data === '\\u0000') {\n\t\t\ttokenizer._parseError(\"invalid-codepoint\");\n\t\t\ttokenizer._currentToken.data.push({nodeName: \"\\uFFFD\", nodeValue: \"\"});\n\t\t} else {\n\t\t\ttokenizer._currentToken.data.push({nodeName: data, nodeValue: \"\"});\n\t\t\ttokenizer.setState(attribute_name_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction before_attribute_value_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"expected-attribute-value-but-got-eof\");\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (isWhitespace(data)) {\n\t\t\treturn true;\n\t\t} else if (data === '\"') {\n\t\t\ttokenizer.setState(attribute_value_double_quoted_state);\n\t\t} else if (data === '&') {\n\t\t\ttokenizer.setState(attribute_value_unquoted_state);\n\t\t\tbuffer.unget(data);\n\t\t} else if (data === \"'\") {\n\t\t\ttokenizer.setState(attribute_value_single_quoted_state);\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._parseError(\"expected-attribute-value-but-got-right-bracket\");\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else if (data === '=' || data === '<' || data === '`') {\n\t\t\ttokenizer._parseError(\"unexpected-character-in-unquoted-attribute-value\");\n\t\t\ttokenizer._currentAttribute().nodeValue += data;\n\t\t\ttokenizer.setState(attribute_value_unquoted_state);\n\t\t} else if (data === '\\u0000') {\n\t\t\ttokenizer._parseError(\"invalid-codepoint\");\n\t\t\ttokenizer._currentAttribute().nodeValue += \"\\uFFFD\";\n\t\t} else {\n\t\t\ttokenizer._currentAttribute().nodeValue += data;\n\t\t\ttokenizer.setState(attribute_value_unquoted_state);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tfunction attribute_value_double_quoted_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"eof-in-attribute-value-double-quote\");\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === '\"') {\n\t\t\ttokenizer.setState(after_attribute_value_state);\n\t\t} else if (data === '&') {\n\t\t\tthis._additionalAllowedCharacter = '\"';\n\t\t\ttokenizer.setState(character_reference_in_attribute_value_state);\n\t\t} else if (data === '\\u0000') {\n\t\t\ttokenizer._parseError(\"invalid-codepoint\");\n\t\t\ttokenizer._currentAttribute().nodeValue += \"\\uFFFD\";\n\t\t} else {\n\t\t\tvar s = buffer.matchUntil('[\\0\"&]');\n\t\t\tdata = data + s;\n\t\t\ttokenizer._currentAttribute().nodeValue += data;\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction attribute_value_single_quoted_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"eof-in-attribute-value-single-quote\");\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === \"'\") {\n\t\t\ttokenizer.setState(after_attribute_value_state);\n\t\t} else if (data === '&') {\n\t\t\tthis._additionalAllowedCharacter = \"'\";\n\t\t\ttokenizer.setState(character_reference_in_attribute_value_state);\n\t\t} else if (data === '\\u0000') {\n\t\t\ttokenizer._parseError(\"invalid-codepoint\");\n\t\t\ttokenizer._currentAttribute().nodeValue += \"\\uFFFD\";\n\t\t} else {\n\t\t\ttokenizer._currentAttribute().nodeValue += data + buffer.matchUntil(\"\\u0000|['&]\");\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction attribute_value_unquoted_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"eof-after-attribute-value\");\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (isWhitespace(data)) {\n\t\t\ttokenizer.setState(before_attribute_name_state);\n\t\t} else if (data === '&') {\n\t\t\tthis._additionalAllowedCharacter = \">\";\n\t\t\ttokenizer.setState(character_reference_in_attribute_value_state);\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else if (data === '\"' || data === \"'\" || data === '=' || data === '`' || data === '<') {\n\t\t\ttokenizer._parseError(\"unexpected-character-in-unquoted-attribute-value\");\n\t\t\ttokenizer._currentAttribute().nodeValue += data;\n\t\t\tbuffer.commit();\n\t\t} else if (data === '\\u0000') {\n\t\t\ttokenizer._parseError(\"invalid-codepoint\");\n\t\t\ttokenizer._currentAttribute().nodeValue += \"\\uFFFD\";\n\t\t} else {\n\t\t\tvar o = buffer.matchUntil(\"\\u0000|[\"+ \"\\t\\n\\v\\f\\x20\\r\" + \"&<>\\\"'=`\" +\"]\");\n\t\t\tif (o === InputStream.EOF) {\n\t\t\t\ttokenizer._parseError(\"eof-in-attribute-value-no-quotes\");\n\t\t\t\ttokenizer._emitCurrentToken();\n\t\t\t}\n\t\t\tbuffer.commit();\n\t\t\ttokenizer._currentAttribute().nodeValue += data + o;\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction character_reference_in_attribute_value_state(buffer) {\n\t\tvar character = EntityParser.consumeEntity(buffer, tokenizer, this._additionalAllowedCharacter);\n\t\tthis._currentAttribute().nodeValue += character || '&';\n\t\tif (this._additionalAllowedCharacter === '\"')\n\t\t\ttokenizer.setState(attribute_value_double_quoted_state);\n\t\telse if (this._additionalAllowedCharacter === '\\'')\n\t\t\ttokenizer.setState(attribute_value_single_quoted_state);\n\t\telse if (this._additionalAllowedCharacter === '>')\n\t\t\ttokenizer.setState(attribute_value_unquoted_state);\n\t\treturn true;\n\t}\n\n\tfunction after_attribute_value_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"eof-after-attribute-value\");\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (isWhitespace(data)) {\n\t\t\ttokenizer.setState(before_attribute_name_state);\n\t\t} else if (data === '>') {\n\t\t\ttokenizer.setState(data_state);\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else if (data === '/') {\n\t\t\ttokenizer.setState(self_closing_tag_state);\n\t\t} else {\n\t\t\ttokenizer._parseError(\"unexpected-character-after-attribute-value\");\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(before_attribute_name_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction self_closing_tag_state(buffer) {\n\t\tvar c = buffer.char();\n\t\tif (c === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"unexpected-eof-after-solidus-in-tag\");\n\t\t\tbuffer.unget(c);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (c === '>') {\n\t\t\ttokenizer._currentToken.selfClosing = true;\n\t\t\ttokenizer.setState(data_state);\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else {\n\t\t\ttokenizer._parseError(\"unexpected-character-after-solidus-in-tag\");\n\t\t\tbuffer.unget(c);\n\t\t\ttokenizer.setState(before_attribute_name_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction bogus_comment_state(buffer) {\n\t\tvar data = buffer.matchUntil('>');\n\t\tdata = data.replace(/\\u0000/g, \"\\uFFFD\");\n\t\tbuffer.char();\n\t\ttokenizer._emitToken({type: 'Comment', data: data});\n\t\ttokenizer.setState(data_state);\n\t\treturn true;\n\t}\n\n\tfunction markup_declaration_open_state(buffer) {\n\t\tvar chars = buffer.shift(2);\n\t\tif (chars === '--') {\n\t\t\ttokenizer._currentToken = {type: 'Comment', data: ''};\n\t\t\ttokenizer.setState(comment_start_state);\n\t\t} else {\n\t\t\tvar newchars = buffer.shift(5);\n\t\t\tif (newchars === InputStream.EOF || chars === InputStream.EOF) {\n\t\t\t\ttokenizer._parseError(\"expected-dashes-or-doctype\");\n\t\t\t\ttokenizer.setState(bogus_comment_state);\n\t\t\t\tbuffer.unget(chars);\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tchars += newchars;\n\t\t\tif (chars.toUpperCase() === 'DOCTYPE') {\n\t\t\t\ttokenizer._currentToken = {type: 'Doctype', name: '', publicId: null, systemId: null, forceQuirks: false};\n\t\t\t\ttokenizer.setState(doctype_state);\n\t\t\t} else if (tokenizer._tokenHandler.isCdataSectionAllowed() && chars === '[CDATA[') {\n\t\t\t\ttokenizer.setState(cdata_section_state);\n\t\t\t} else {\n\t\t\t\ttokenizer._parseError(\"expected-dashes-or-doctype\");\n\t\t\t\tbuffer.unget(chars);\n\t\t\t\ttokenizer.setState(bogus_comment_state);\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction cdata_section_state(buffer) {\n\t\tvar data = buffer.matchUntil(']]>');\n\t\tbuffer.shift(3);\n\t\tif (data) {\n\t\t\ttokenizer._emitToken({type: 'Characters', data: data});\n\t\t}\n\t\ttokenizer.setState(data_state);\n\t\treturn true;\n\t}\n\n\tfunction comment_start_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"eof-in-comment\");\n\t\t\ttokenizer._emitToken(tokenizer._currentToken);\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === '-') {\n\t\t\ttokenizer.setState(comment_start_dash_state);\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._parseError(\"incorrect-comment\");\n\t\t\ttokenizer._emitToken(tokenizer._currentToken);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === '\\u0000') {\n\t\t\ttokenizer._parseError(\"invalid-codepoint\");\n\t\t\ttokenizer._currentToken.data += \"\\uFFFD\";\n\t\t} else {\n\t\t\ttokenizer._currentToken.data += data;\n\t\t\ttokenizer.setState(comment_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction comment_start_dash_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"eof-in-comment\");\n\t\t\ttokenizer._emitToken(tokenizer._currentToken);\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === '-') {\n\t\t\ttokenizer.setState(comment_end_state);\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._parseError(\"incorrect-comment\");\n\t\t\ttokenizer._emitToken(tokenizer._currentToken);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === '\\u0000') {\n\t\t\ttokenizer._parseError(\"invalid-codepoint\");\n\t\t\ttokenizer._currentToken.data += \"\\uFFFD\";\n\t\t} else {\n\t\t\ttokenizer._currentToken.data += '-' + data;\n\t\t\ttokenizer.setState(comment_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction comment_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"eof-in-comment\");\n\t\t\ttokenizer._emitToken(tokenizer._currentToken);\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === '-') {\n\t\t\ttokenizer.setState(comment_end_dash_state);\n\t\t} else if (data === '\\u0000') {\n\t\t\ttokenizer._parseError(\"invalid-codepoint\");\n\t\t\ttokenizer._currentToken.data += \"\\uFFFD\";\n\t\t} else {\n\t\t\ttokenizer._currentToken.data += data;\n\t\t\tbuffer.commit();\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction comment_end_dash_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"eof-in-comment-end-dash\");\n\t\t\ttokenizer._emitToken(tokenizer._currentToken);\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === '-') {\n\t\t\ttokenizer.setState(comment_end_state);\n\t\t} else if (data === '\\u0000') {\n\t\t\ttokenizer._parseError(\"invalid-codepoint\");\n\t\t\ttokenizer._currentToken.data += \"-\\uFFFD\";\n\t\t\ttokenizer.setState(comment_state);\n\t\t} else {\n\t\t\ttokenizer._currentToken.data += '-' + data + buffer.matchUntil('\\u0000|-');\n\t\t\tbuffer.char();\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction comment_end_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"eof-in-comment-double-dash\");\n\t\t\ttokenizer._emitToken(tokenizer._currentToken);\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._emitToken(tokenizer._currentToken);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === '!') {\n\t\t\ttokenizer._parseError(\"unexpected-bang-after-double-dash-in-comment\");\n\t\t\ttokenizer.setState(comment_end_bang_state);\n\t\t} else if (data === '-') {\n\t\t\ttokenizer._parseError(\"unexpected-dash-after-double-dash-in-comment\");\n\t\t\ttokenizer._currentToken.data += data;\n\t\t} else if (data === '\\u0000') {\n\t\t\ttokenizer._parseError(\"invalid-codepoint\");\n\t\t\ttokenizer._currentToken.data += \"--\\uFFFD\";\n\t\t\ttokenizer.setState(comment_state);\n\t\t} else {\n\t\t\ttokenizer._parseError(\"unexpected-char-in-comment\");\n\t\t\ttokenizer._currentToken.data += '--' + data;\n\t\t\ttokenizer.setState(comment_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction comment_end_bang_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"eof-in-comment-end-bang-state\");\n\t\t\ttokenizer._emitToken(tokenizer._currentToken);\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._emitToken(tokenizer._currentToken);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === '-') {\n\t\t\ttokenizer._currentToken.data += '--!';\n\t\t\ttokenizer.setState(comment_end_dash_state);\n\t\t} else {\n\t\t\ttokenizer._currentToken.data += '--!' + data;\n\t\t\ttokenizer.setState(comment_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction doctype_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"expected-doctype-name-but-got-eof\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else if (isWhitespace(data)) {\n\t\t\ttokenizer.setState(before_doctype_name_state);\n\t\t} else {\n\t\t\ttokenizer._parseError(\"need-space-after-doctype\");\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(before_doctype_name_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction before_doctype_name_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"expected-doctype-name-but-got-eof\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else if (isWhitespace(data)) {\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._parseError(\"expected-doctype-name-but-got-right-bracket\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\ttokenizer.setState(data_state);\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else {\n\t\t\tif (isAlpha(data))\n\t\t\t\tdata = data.toLowerCase();\n\t\t\ttokenizer._currentToken.name = data;\n\t\t\ttokenizer.setState(doctype_name_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction doctype_name_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer._parseError(\"eof-in-doctype-name\");\n\t\t\ttokenizer.setState(data_state);\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else if (isWhitespace(data)) {\n\t\t\ttokenizer.setState(after_doctype_name_state);\n\t\t} else if (data === '>') {\n\t\t\ttokenizer.setState(data_state);\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else {\n\t\t\tif (isAlpha(data))\n\t\t\t\tdata = data.toLowerCase();\n\t\t\ttokenizer._currentToken.name += data;\n\t\t\tbuffer.commit();\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction after_doctype_name_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer._parseError(\"eof-in-doctype\");\n\t\t\ttokenizer.setState(data_state);\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else if (isWhitespace(data)) {\n\t\t} else if (data === '>') {\n\t\t\ttokenizer.setState(data_state);\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else {\n\t\t\tif (['p', 'P'].indexOf(data) > -1) {\n\t\t\t\tvar expected = [['u', 'U'], ['b', 'B'], ['l', 'L'], ['i', 'I'], ['c', 'C']];\n\t\t\t\tvar matched = expected.every(function(expected){\n\t\t\t\t\tdata = buffer.char();\n\t\t\t\t\treturn expected.indexOf(data) > -1;\n\t\t\t\t});\n\t\t\t\tif (matched) {\n\t\t\t\t\ttokenizer.setState(after_doctype_public_keyword_state);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else if (['s', 'S'].indexOf(data) > -1) {\n\t\t\t\tvar expected = [['y', 'Y'], ['s', 'S'], ['t', 'T'], ['e', 'E'], ['m', 'M']];\n\t\t\t\tvar matched = expected.every(function(expected){\n\t\t\t\t\tdata = buffer.char();\n\t\t\t\t\treturn expected.indexOf(data) > -1;\n\t\t\t\t});\n\t\t\t\tif (matched) {\n\t\t\t\t\ttokenizer.setState(after_doctype_system_keyword_state);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\n\t\t\tif (data === InputStream.EOF) {\n\t\t\t\ttokenizer._parseError(\"eof-in-doctype\");\n\t\t\t\tbuffer.unget(data);\n\t\t\t\ttokenizer.setState(data_state);\n\t\t\t\ttokenizer._emitCurrentToken();\n\t\t\t} else {\n\t\t\t\ttokenizer._parseError(\"expected-space-or-right-bracket-in-doctype\", {data: data});\n\t\t\t\ttokenizer.setState(bogus_doctype_state);\n\t\t\t}\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction after_doctype_public_keyword_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"eof-in-doctype\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else if (isWhitespace(data)) {\n\t\t\ttokenizer.setState(before_doctype_public_identifier_state);\n\t\t} else if (data === \"'\" || data === '\"') {\n\t\t\ttokenizer._parseError(\"unexpected-char-in-doctype\");\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(before_doctype_public_identifier_state);\n\t\t} else {\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(before_doctype_public_identifier_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction before_doctype_public_identifier_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"eof-in-doctype\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else if (isWhitespace(data)) {\n\t\t} else if (data === '\"') {\n\t\t\ttokenizer._currentToken.publicId = '';\n\t\t\ttokenizer.setState(doctype_public_identifier_double_quoted_state);\n\t\t} else if (data === \"'\") {\n\t\t\ttokenizer._currentToken.publicId = '';\n\t\t\ttokenizer.setState(doctype_public_identifier_single_quoted_state);\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._parseError(\"unexpected-end-of-doctype\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\ttokenizer.setState(data_state);\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else {\n\t\t\ttokenizer._parseError(\"unexpected-char-in-doctype\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\ttokenizer.setState(bogus_doctype_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction doctype_public_identifier_double_quoted_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"eof-in-doctype\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else if (data === '\"') {\n\t\t\ttokenizer.setState(after_doctype_public_identifier_state);\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._parseError(\"unexpected-end-of-doctype\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\ttokenizer.setState(data_state);\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else {\n\t\t\ttokenizer._currentToken.publicId += data;\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction doctype_public_identifier_single_quoted_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"eof-in-doctype\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else if (data === \"'\") {\n\t\t\ttokenizer.setState(after_doctype_public_identifier_state);\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._parseError(\"unexpected-end-of-doctype\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\ttokenizer.setState(data_state);\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else {\n\t\t\ttokenizer._currentToken.publicId += data;\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction after_doctype_public_identifier_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"eof-in-doctype\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\ttokenizer._emitCurrentToken();\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (isWhitespace(data)) {\n\t\t\ttokenizer.setState(between_doctype_public_and_system_identifiers_state);\n\t\t} else if (data === '>') {\n\t\t\ttokenizer.setState(data_state);\n\t\t\ttokenizer._emitCurrentToken();\n\t\t} else if (data === '\"') {\n\t\t\ttokenizer._parseError(\"unexpected-char-in-doctype\");\n\t\t\ttokenizer._currentToken.systemId = '';\n\t\t\ttokenizer.setState(doctype_system_identifier_double_quoted_state);\n\t\t} else if (data === \"'\") {\n\t\t\ttokenizer._parseError(\"unexpected-char-in-doctype\");\n\t\t\ttokenizer._currentToken.systemId = '';\n\t\t\ttokenizer.setState(doctype_system_identifier_single_quoted_state);\n\t\t} else {\n\t\t\ttokenizer._parseError(\"unexpected-char-in-doctype\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\ttokenizer.setState(bogus_doctype_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction between_doctype_public_and_system_identifiers_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"eof-in-doctype\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\ttokenizer._emitCurrentToken();\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (isWhitespace(data)) {\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._emitCurrentToken();\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === '\"') {\n\t\t\ttokenizer._currentToken.systemId = '';\n\t\t\ttokenizer.setState(doctype_system_identifier_double_quoted_state);\n\t\t} else if (data === \"'\") {\n\t\t\ttokenizer._currentToken.systemId = '';\n\t\t\ttokenizer.setState(doctype_system_identifier_single_quoted_state);\n\t\t} else {\n\t\t\ttokenizer._parseError(\"unexpected-char-in-doctype\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\ttokenizer.setState(bogus_doctype_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction after_doctype_system_keyword_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"eof-in-doctype\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\ttokenizer._emitCurrentToken();\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (isWhitespace(data)) {\n\t\t\ttokenizer.setState(before_doctype_system_identifier_state);\n\t\t} else if (data === \"'\" || data === '\"') {\n\t\t\ttokenizer._parseError(\"unexpected-char-in-doctype\");\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(before_doctype_system_identifier_state);\n\t\t} else {\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(before_doctype_system_identifier_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction before_doctype_system_identifier_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"eof-in-doctype\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\ttokenizer._emitCurrentToken();\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (isWhitespace(data)) {\n\t\t} else if (data === '\"') {\n\t\t\ttokenizer._currentToken.systemId = '';\n\t\t\ttokenizer.setState(doctype_system_identifier_double_quoted_state);\n\t\t} else if (data === \"'\") {\n\t\t\ttokenizer._currentToken.systemId = '';\n\t\t\ttokenizer.setState(doctype_system_identifier_single_quoted_state);\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._parseError(\"unexpected-end-of-doctype\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\ttokenizer._emitCurrentToken();\n\t\t\ttokenizer.setState(data_state);\n\t\t} else {\n\t\t\ttokenizer._parseError(\"unexpected-char-in-doctype\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\ttokenizer.setState(bogus_doctype_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction doctype_system_identifier_double_quoted_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"eof-in-doctype\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\ttokenizer._emitCurrentToken();\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === '\"') {\n\t\t\ttokenizer.setState(after_doctype_system_identifier_state);\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._parseError(\"unexpected-end-of-doctype\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\ttokenizer._emitCurrentToken();\n\t\t\ttokenizer.setState(data_state);\n\t\t} else {\n\t\t\ttokenizer._currentToken.systemId += data;\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction doctype_system_identifier_single_quoted_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"eof-in-doctype\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\ttokenizer._emitCurrentToken();\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === \"'\") {\n\t\t\ttokenizer.setState(after_doctype_system_identifier_state);\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._parseError(\"unexpected-end-of-doctype\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\ttokenizer._emitCurrentToken();\n\t\t\ttokenizer.setState(data_state);\n\t\t} else {\n\t\t\ttokenizer._currentToken.systemId += data;\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction after_doctype_system_identifier_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\ttokenizer._parseError(\"eof-in-doctype\");\n\t\t\ttokenizer._currentToken.forceQuirks = true;\n\t\t\ttokenizer._emitCurrentToken();\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (isWhitespace(data)) {\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._emitCurrentToken();\n\t\t\ttokenizer.setState(data_state);\n\t\t} else {\n\t\t\ttokenizer._parseError(\"unexpected-char-in-doctype\");\n\t\t\ttokenizer.setState(bogus_doctype_state);\n\t\t}\n\t\treturn true;\n\t}\n\n\tfunction bogus_doctype_state(buffer) {\n\t\tvar data = buffer.char();\n\t\tif (data === InputStream.EOF) {\n\t\t\tbuffer.unget(data);\n\t\t\ttokenizer._emitCurrentToken();\n\t\t\ttokenizer.setState(data_state);\n\t\t} else if (data === '>') {\n\t\t\ttokenizer._emitCurrentToken();\n\t\t\ttokenizer.setState(data_state);\n\t\t}\n\t\treturn true;\n\t}\n};\n\nObject.defineProperty(Tokenizer.prototype, 'lineNumber', {\n\tget: function() {\n\t\treturn this._inputStream.location().line;\n\t}\n});\n\nObject.defineProperty(Tokenizer.prototype, 'columnNumber', {\n\tget: function() {\n\t\treturn this._inputStream.location().column;\n\t}\n});\n\nexports.Tokenizer = Tokenizer;\n\n},\n{\"./EntityParser\":2,\"./InputStream\":3}],\n6:[function(_dereq_,module,exports){\nvar assert = _dereq_('assert');\r\n\r\nvar messages = _dereq_('./messages.json');\r\nvar constants = _dereq_('./constants');\r\n\r\nvar EventEmitter = _dereq_('events').EventEmitter;\r\n\r\nvar Tokenizer = _dereq_('./Tokenizer').Tokenizer;\r\nvar ElementStack = _dereq_('./ElementStack').ElementStack;\r\nvar StackItem = _dereq_('./StackItem').StackItem;\r\n\r\nvar Marker = {};\r\n\r\nfunction isWhitespace(ch) {\r\n\treturn ch === \" \" || ch === \"\\n\" || ch === \"\\t\" || ch === \"\\r\" || ch === \"\\f\";\r\n}\r\n\r\nfunction isWhitespaceOrReplacementCharacter(ch) {\r\n\treturn isWhitespace(ch) || ch === '\\uFFFD';\r\n}\r\n\r\nfunction isAllWhitespace(characters) {\r\n\tfor (var i = 0; i < characters.length; i++) {\r\n\t\tvar ch = characters[i];\r\n\t\tif (!isWhitespace(ch))\r\n\t\t\treturn false;\r\n\t}\r\n\treturn true;\r\n}\r\n\r\nfunction isAllWhitespaceOrReplacementCharacters(characters) {\r\n\tfor (var i = 0; i < characters.length; i++) {\r\n\t\tvar ch = characters[i];\r\n\t\tif (!isWhitespaceOrReplacementCharacter(ch))\r\n\t\t\treturn false;\r\n\t}\r\n\treturn true;\r\n}\r\n\r\nfunction getAttribute(node, name) {\r\n\tfor (var i = 0; i < node.attributes.length; i++) {\r\n\t\tvar attribute = node.attributes[i];\r\n\t\tif (attribute.nodeName === name) {\r\n\t\t\treturn attribute;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n}\r\n\r\nfunction CharacterBuffer(characters) {\r\n\tthis.characters = characters;\r\n\tthis.current = 0;\r\n\tthis.end = this.characters.length;\r\n}\r\n\r\nCharacterBuffer.prototype.skipAtMostOneLeadingNewline = function() {\r\n\tif (this.characters[this.current] === '\\n')\r\n\t\tthis.current++;\r\n};\r\n\r\nCharacterBuffer.prototype.skipLeadingWhitespace = function() {\r\n\twhile (isWhitespace(this.characters[this.current])) {\r\n\t\tif (++this.current == this.end)\r\n\t\t\treturn;\r\n\t}\r\n};\r\n\r\nCharacterBuffer.prototype.skipLeadingNonWhitespace = function() {\r\n\twhile (!isWhitespace(this.characters[this.current])) {\r\n\t\tif (++this.current == this.end)\r\n\t\t\treturn;\r\n\t}\r\n};\r\n\r\nCharacterBuffer.prototype.takeRemaining = function() {\r\n\treturn this.characters.substring(this.current);\r\n};\r\n\r\nCharacterBuffer.prototype.takeLeadingWhitespace = function() {\r\n\tvar start = this.current;\r\n\tthis.skipLeadingWhitespace();\r\n\tif (start === this.current)\r\n\t\treturn \"\";\r\n\treturn this.characters.substring(start, this.current - start);\r\n};\r\n\r\nObject.defineProperty(CharacterBuffer.prototype, 'length', {\r\n\tget: function(){\r\n\t\treturn this.end - this.current;\r\n\t}\r\n});\r\nfunction TreeBuilder() {\r\n\tthis.tokenizer = null;\r\n\tthis.errorHandler = null;\r\n\tthis.scriptingEnabled = false;\r\n\tthis.document = null;\r\n\tthis.head = null;\r\n\tthis.form = null;\r\n\tthis.openElements = new ElementStack();\r\n\tthis.activeFormattingElements = [];\r\n\tthis.insertionMode = null;\r\n\tthis.insertionModeName = \"\";\r\n\tthis.originalInsertionMode = \"\";\r\n\tthis.inQuirksMode = false; // TODO quirks mode\r\n\tthis.compatMode = \"no quirks\";\r\n\tthis.framesetOk = true;\r\n\tthis.redirectAttachToFosterParent = false;\r\n\tthis.selfClosingFlagAcknowledged = false;\r\n\tthis.context = \"\";\r\n\tthis.pendingTableCharacters = [];\r\n\tthis.shouldSkipLeadingNewline = false;\r\n\r\n\tvar tree = this;\r\n\tvar modes = this.insertionModes = {};\r\n\tmodes.base = {\r\n\t\tend_tag_handlers: {\"-default\": 'endTagOther'},\r\n\t\tstart_tag_handlers: {\"-default\": 'startTagOther'},\r\n\t\tprocessEOF: function() {\r\n\t\t\ttree.generateImpliedEndTags();\r\n\t\t\tif (tree.openElements.length > 2) {\r\n\t\t\t\ttree.parseError('expected-closing-tag-but-got-eof');\r\n\t\t\t} else if (tree.openElements.length == 2 &&\r\n\t\t\t\ttree.openElements.item(1).localName != 'body') {\r\r\n\t\t\t\ttree.parseError('expected-closing-tag-but-got-eof');\r\n\t\t\t} else if (tree.context && tree.openElements.length > 1) {\r\r\r\n\t\t\t}\r\n\t\t},\r\n\t\tprocessComment: function(data) {\r\r\r\n\t\t\ttree.insertComment(data, tree.currentStackItem().node);\r\n\t\t},\r\n\t\tprocessDoctype: function(name, publicId, systemId, forceQuirks) {\r\n\t\t\ttree.parseError('unexpected-doctype');\r\n\t\t},\r\n\t\tprocessStartTag: function(name, attributes, selfClosing) {\r\n\t\t\tif (this[this.start_tag_handlers[name]]) {\r\n\t\t\t\tthis[this.start_tag_handlers[name]](name, attributes, selfClosing);\r\n\t\t\t} else if (this[this.start_tag_handlers[\"-default\"]]) {\r\n\t\t\t\tthis[this.start_tag_handlers[\"-default\"]](name, attributes, selfClosing);\r\n\t\t\t} else {\r\n\t\t\t\tthrow(new Error(\"No handler found for \"+name));\r\n\t\t\t}\r\n\t\t},\r\n\t\tprocessEndTag: function(name) {\r\n\t\t\tif (this[this.end_tag_handlers[name]]) {\r\n\t\t\t\tthis[this.end_tag_handlers[name]](name);\r\n\t\t\t} else if (this[this.end_tag_handlers[\"-default\"]]) {\r\n\t\t\t\tthis[this.end_tag_handlers[\"-default\"]](name);\r\n\t\t\t} else {\r\n\t\t\t\tthrow(new Error(\"No handler found for \"+name));\r\n\t\t\t}\r\n\t\t},\r\n\t\tstartTagHtml: function(name, attributes) {\r\n\t\t\tmodes.inBody.startTagHtml(name, attributes);\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.initial = Object.create(modes.base);\r\n\r\n\tmodes.initial.processEOF = function() {\r\n\t\ttree.parseError(\"expected-doctype-but-got-eof\");\r\n\t\tthis.anythingElse();\r\n\t\ttree.insertionMode.processEOF();\r\n\t};\r\n\r\n\tmodes.initial.processComment = function(data) {\r\n\t\ttree.insertComment(data, tree.document);\r\n\t};\r\n\r\n\tmodes.initial.processDoctype = function(name, publicId, systemId, forceQuirks) {\r\n\t\ttree.insertDoctype(name || '', publicId || '', systemId || '');\r\n\r\n\t\tif (forceQuirks || name != 'html' || (publicId != null && ([\r\n\t\t\t\t\t\"+//silmaril//dtd html pro v0r11 19970101//\",\r\n\t\t\t\t\t\"-//advasoft ltd//dtd html 3.0 aswedit + extensions//\",\r\n\t\t\t\t\t\"-//as//dtd html 3.0 aswedit + extensions//\",\r\n\t\t\t\t\t\"-//ietf//dtd html 2.0 level 1//\",\r\n\t\t\t\t\t\"-//ietf//dtd html 2.0 level 2//\",\r\n\t\t\t\t\t\"-//ietf//dtd html 2.0 strict level 1//\",\r\n\t\t\t\t\t\"-//ietf//dtd html 2.0 strict level 2//\",\r\n\t\t\t\t\t\"-//ietf//dtd html 2.0 strict//\",\r\n\t\t\t\t\t\"-//ietf//dtd html 2.0//\",\r\n\t\t\t\t\t\"-//ietf//dtd html 2.1e//\",\r\n\t\t\t\t\t\"-//ietf//dtd html 3.0//\",\r\n\t\t\t\t\t\"-//ietf//dtd html 3.0//\",\r\n\t\t\t\t\t\"-//ietf//dtd html 3.2 final//\",\r\n\t\t\t\t\t\"-//ietf//dtd html 3.2//\",\r\n\t\t\t\t\t\"-//ietf//dtd html 3//\",\r\n\t\t\t\t\t\"-//ietf//dtd html level 0//\",\r\n\t\t\t\t\t\"-//ietf//dtd html level 0//\",\r\n\t\t\t\t\t\"-//ietf//dtd html level 1//\",\r\n\t\t\t\t\t\"-//ietf//dtd html level 1//\",\r\n\t\t\t\t\t\"-//ietf//dtd html level 2//\",\r\n\t\t\t\t\t\"-//ietf//dtd html level 2//\",\r\n\t\t\t\t\t\"-//ietf//dtd html level 3//\",\r\n\t\t\t\t\t\"-//ietf//dtd html level 3//\",\r\n\t\t\t\t\t\"-//ietf//dtd html strict level 0//\",\r\n\t\t\t\t\t\"-//ietf//dtd html strict level 0//\",\r\n\t\t\t\t\t\"-//ietf//dtd html strict level 1//\",\r\n\t\t\t\t\t\"-//ietf//dtd html strict level 1//\",\r\n\t\t\t\t\t\"-//ietf//dtd html strict level 2//\",\r\n\t\t\t\t\t\"-//ietf//dtd html strict level 2//\",\r\n\t\t\t\t\t\"-//ietf//dtd html strict level 3//\",\r\n\t\t\t\t\t\"-//ietf//dtd html strict level 3//\",\r\n\t\t\t\t\t\"-//ietf//dtd html strict//\",\r\n\t\t\t\t\t\"-//ietf//dtd html strict//\",\r\n\t\t\t\t\t\"-//ietf//dtd html strict//\",\r\n\t\t\t\t\t\"-//ietf//dtd html//\",\r\n\t\t\t\t\t\"-//ietf//dtd html//\",\r\n\t\t\t\t\t\"-//ietf//dtd html//\",\r\n\t\t\t\t\t\"-//metrius//dtd metrius presentational//\",\r\n\t\t\t\t\t\"-//microsoft//dtd internet explorer 2.0 html strict//\",\r\n\t\t\t\t\t\"-//microsoft//dtd internet explorer 2.0 html//\",\r\n\t\t\t\t\t\"-//microsoft//dtd internet explorer 2.0 tables//\",\r\n\t\t\t\t\t\"-//microsoft//dtd internet explorer 3.0 html strict//\",\r\n\t\t\t\t\t\"-//microsoft//dtd internet explorer 3.0 html//\",\r\n\t\t\t\t\t\"-//microsoft//dtd internet explorer 3.0 tables//\",\r\n\t\t\t\t\t\"-//netscape comm. corp.//dtd html//\",\r\n\t\t\t\t\t\"-//netscape comm. corp.//dtd strict html//\",\r\n\t\t\t\t\t\"-//o'reilly and associates//dtd html 2.0//\",\r\n\t\t\t\t\t\"-//o'reilly and associates//dtd html extended 1.0//\",\r\n\t\t\t\t\t\"-//spyglass//dtd html 2.0 extended//\",\r\n\t\t\t\t\t\"-//sq//dtd html 2.0 hotmetal + extensions//\",\r\n\t\t\t\t\t\"-//sun microsystems corp.//dtd hotjava html//\",\r\n\t\t\t\t\t\"-//sun microsystems corp.//dtd hotjava strict html//\",\r\n\t\t\t\t\t\"-//w3c//dtd html 3 1995-03-24//\",\r\n\t\t\t\t\t\"-//w3c//dtd html 3.2 draft//\",\r\n\t\t\t\t\t\"-//w3c//dtd html 3.2 final//\",\r\n\t\t\t\t\t\"-//w3c//dtd html 3.2//\",\r\n\t\t\t\t\t\"-//w3c//dtd html 3.2s draft//\",\r\n\t\t\t\t\t\"-//w3c//dtd html 4.0 frameset//\",\r\n\t\t\t\t\t\"-//w3c//dtd html 4.0 transitional//\",\r\n\t\t\t\t\t\"-//w3c//dtd html experimental 19960712//\",\r\n\t\t\t\t\t\"-//w3c//dtd html experimental 970421//\",\r\n\t\t\t\t\t\"-//w3c//dtd w3 html//\",\r\n\t\t\t\t\t\"-//w3o//dtd w3 html 3.0//\",\r\n\t\t\t\t\t\"-//webtechs//dtd mozilla html 2.0//\",\r\n\t\t\t\t\t\"-//webtechs//dtd mozilla html//\",\r\n\t\t\t\t\t\"html\"\r\n\t\t\t\t].some(publicIdStartsWith)\r\n\t\t\t\t|| [\r\n\t\t\t\t\t\"-//w3o//dtd w3 html strict 3.0//en//\",\r\n\t\t\t\t\t\"-/w3c/dtd html 4.0 transitional/en\",\r\n\t\t\t\t\t\"html\"\r\n\t\t\t\t].indexOf(publicId.toLowerCase()) > -1\r\n\t\t\t\t|| (systemId == null && [\r\n\t\t\t\t\t\"-//w3c//dtd html 4.01 transitional//\",\r\n\t\t\t\t\t\"-//w3c//dtd html 4.01 frameset//\"\r\n\t\t\t\t].some(publicIdStartsWith)))\r\n\t\t\t)\r\n\t\t\t|| (systemId != null && (systemId.toLowerCase() == \"http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd\"))\r\n\t\t) {\r\n\t\t\ttree.compatMode = \"quirks\";\r\n\t\t\ttree.parseError(\"quirky-doctype\");\r\n\t\t} else if (publicId != null && ([\r\n\t\t\t\t\"-//w3c//dtd xhtml 1.0 transitional//\",\r\n\t\t\t\t\"-//w3c//dtd xhtml 1.0 frameset//\"\r\n\t\t\t].some(publicIdStartsWith)\r\n\t\t\t|| (systemId != null && [\r\n\t\t\t\t\"-//w3c//dtd html 4.01 transitional//\",\r\n\t\t\t\t\"-//w3c//dtd html 4.01 frameset//\"\r\n\t\t\t].indexOf(publicId.toLowerCase()) > -1))\r\n\t\t) {\r\n\t\t\ttree.compatMode = \"limited quirks\";\r\n\t\t\ttree.parseError(\"almost-standards-doctype\");\r\n\t\t} else {\r\n\t\t\tif ((publicId == \"-//W3C//DTD HTML 4.0//EN\" && (systemId == null || systemId == \"http://www.w3.org/TR/REC-html40/strict.dtd\"))\r\n\t\t\t\t|| (publicId == \"-//W3C//DTD HTML 4.01//EN\" && (systemId == null || systemId == \"http://www.w3.org/TR/html4/strict.dtd\"))\r\n\t\t\t\t|| (publicId == \"-//W3C//DTD XHTML 1.0 Strict//EN\" && (systemId == \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"))\r\n\t\t\t\t|| (publicId == \"-//W3C//DTD XHTML 1.1//EN\" && (systemId == \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\"))\r\n\t\t\t) {\r\r\r\n\t\t\t} else if (!((systemId == null || systemId == \"about:legacy-compat\") && publicId == null)) {\r\n\t\t\t\ttree.parseError(\"unknown-doctype\");\r\n\t\t\t}\r\n\t\t}\r\n\t\ttree.setInsertionMode('beforeHTML');\r\n\t\tfunction publicIdStartsWith(string) {\r\n\t\t\treturn publicId.toLowerCase().indexOf(string) === 0;\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.initial.processCharacters = function(buffer) {\r\n\t\tbuffer.skipLeadingWhitespace();\r\n\t\tif (!buffer.length)\r\n\t\t\treturn;\r\n\t\ttree.parseError('expected-doctype-but-got-chars');\r\n\t\tthis.anythingElse();\r\n\t\ttree.insertionMode.processCharacters(buffer);\r\n\t};\r\n\r\n\tmodes.initial.processStartTag = function(name, attributes, selfClosing) {\r\n\t\ttree.parseError('expected-doctype-but-got-start-tag', {name: name});\r\n\t\tthis.anythingElse();\r\n\t\ttree.insertionMode.processStartTag(name, attributes, selfClosing);\r\n\t};\r\n\r\n\tmodes.initial.processEndTag = function(name) {\r\n\t\ttree.parseError('expected-doctype-but-got-end-tag', {name: name});\r\n\t\tthis.anythingElse();\r\n\t\ttree.insertionMode.processEndTag(name);\r\n\t};\r\n\r\n\tmodes.initial.anythingElse = function() {\r\n\t\ttree.compatMode = 'quirks';\r\n\t\ttree.setInsertionMode('beforeHTML');\r\n\t};\r\n\r\n\tmodes.beforeHTML = Object.create(modes.base);\r\n\r\n\tmodes.beforeHTML.start_tag_handlers = {\r\n\t\thtml: 'startTagHtml',\r\n\t\t'-default': 'startTagOther'\r\n\t};\r\n\r\n\tmodes.beforeHTML.processEOF = function() {\r\n\t\tthis.anythingElse();\r\n\t\ttree.insertionMode.processEOF();\r\n\t};\r\n\r\n\tmodes.beforeHTML.processComment = function(data) {\r\n\t\ttree.insertComment(data, tree.document);\r\n\t};\r\n\r\n\tmodes.beforeHTML.processCharacters = function(buffer) {\r\n\t\tbuffer.skipLeadingWhitespace();\r\n\t\tif (!buffer.length)\r\n\t\t\treturn;\r\n\t\tthis.anythingElse();\r\n\t\ttree.insertionMode.processCharacters(buffer);\r\n\t};\r\n\r\n\tmodes.beforeHTML.startTagHtml = function(name, attributes, selfClosing) {\r\n\t\ttree.insertHtmlElement(attributes);\r\n\t\ttree.setInsertionMode('beforeHead');\r\n\t};\r\n\r\n\tmodes.beforeHTML.startTagOther = function(name, attributes, selfClosing) {\r\n\t\tthis.anythingElse();\r\n\t\ttree.insertionMode.processStartTag(name, attributes, selfClosing);\r\n\t};\r\n\r\n\tmodes.beforeHTML.processEndTag = function(name) {\r\n\t\tthis.anythingElse();\r\n\t\ttree.insertionMode.processEndTag(name);\r\n\t};\r\n\r\n\tmodes.beforeHTML.anythingElse = function() {\r\n\t\ttree.insertHtmlElement();\r\n\t\ttree.setInsertionMode('beforeHead');\r\n\t};\r\n\r\n\tmodes.afterAfterBody = Object.create(modes.base);\r\n\r\n\tmodes.afterAfterBody.start_tag_handlers = {\r\n\t\thtml: 'startTagHtml',\r\n\t\t'-default': 'startTagOther'\r\n\t};\r\n\r\n\tmodes.afterAfterBody.processComment = function(data) {\r\n\t\ttree.insertComment(data, tree.document);\r\n\t};\r\n\r\n\tmodes.afterAfterBody.processDoctype = function(data) {\r\n\t\tmodes.inBody.processDoctype(data);\r\n\t};\r\n\r\n\tmodes.afterAfterBody.startTagHtml = function(data, attributes) {\r\n\t\tmodes.inBody.startTagHtml(data, attributes);\r\n\t};\r\n\r\n\tmodes.afterAfterBody.startTagOther = function(name, attributes, selfClosing) {\r\n\t\ttree.parseError('unexpected-start-tag', {name: name});\r\n\t\ttree.setInsertionMode('inBody');\r\n\t\ttree.insertionMode.processStartTag(name, attributes, selfClosing);\r\n\t};\r\n\r\n\tmodes.afterAfterBody.endTagOther = function(name) {\r\n\t\ttree.parseError('unexpected-end-tag', {name: name});\r\n\t\ttree.setInsertionMode('inBody');\r\n\t\ttree.insertionMode.processEndTag(name);\r\n\t};\r\n\r\n\tmodes.afterAfterBody.processCharacters = function(data) {\r\n\t\tif (!isAllWhitespace(data.characters)) {\r\n\t\t\ttree.parseError('unexpected-char-after-body');\r\n\t\t\ttree.setInsertionMode('inBody');\r\n\t\t\treturn tree.insertionMode.processCharacters(data);\r\n\t\t}\r\n\t\tmodes.inBody.processCharacters(data);\r\n\t};\r\n\r\n\tmodes.afterBody = Object.create(modes.base);\r\n\r\n\tmodes.afterBody.end_tag_handlers = {\r\n\t\thtml: 'endTagHtml',\r\n\t\t'-default': 'endTagOther'\r\n\t};\r\n\r\n\tmodes.afterBody.processComment = function(data) {\r\r\r\n\t\ttree.insertComment(data, tree.openElements.rootNode);\r\n\t};\r\n\r\n\tmodes.afterBody.processCharacters = function(data) {\r\n\t\tif (!isAllWhitespace(data.characters)) {\r\n\t\t\ttree.parseError('unexpected-char-after-body');\r\n\t\t\ttree.setInsertionMode('inBody');\r\n\t\t\treturn tree.insertionMode.processCharacters(data);\r\n\t\t}\r\n\t\tmodes.inBody.processCharacters(data);\r\n\t};\r\n\r\n\tmodes.afterBody.processStartTag = function(name, attributes, selfClosing) {\r\n\t\ttree.parseError('unexpected-start-tag-after-body', {name: name});\r\n\t\ttree.setInsertionMode('inBody');\r\n\t\ttree.insertionMode.processStartTag(name, attributes, selfClosing);\r\n\t};\r\n\r\n\tmodes.afterBody.endTagHtml = function(name) {\r\n\t\tif (tree.context) {\r\n\t\t\ttree.parseError('end-html-in-innerhtml');\r\n\t\t} else {\r\r\r\r\r\r\n\t\t\ttree.setInsertionMode('afterAfterBody');\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.afterBody.endTagOther = function(name) {\r\n\t\ttree.parseError('unexpected-end-tag-after-body', {name: name});\r\n\t\ttree.setInsertionMode('inBody');\r\n\t\ttree.insertionMode.processEndTag(name);\r\n\t};\r\n\r\n\tmodes.afterFrameset = Object.create(modes.base);\r\n\r\n\tmodes.afterFrameset.start_tag_handlers = {\r\n\t\thtml: 'startTagHtml',\r\n\t\tnoframes: 'startTagNoframes',\r\n\t\t'-default': 'startTagOther'\r\n\t};\r\n\r\n\tmodes.afterFrameset.end_tag_handlers = {\r\n\t\thtml: 'endTagHtml',\r\n\t\t'-default': 'endTagOther'\r\n\t};\r\n\r\n\tmodes.afterFrameset.processCharacters = function(buffer) {\r\n\t\tvar characters = buffer.takeRemaining();\r\n\t\tvar whitespace = \"\";\r\n\t\tfor (var i = 0; i < characters.length; i++) {\r\n\t\t\tvar ch = characters[i];\r\n\t\t\tif (isWhitespace(ch))\r\n\t\t\t\twhitespace += ch;\r\n\t\t}\r\n\t\tif (whitespace) {\r\n\t\t\ttree.insertText(whitespace);\r\n\t\t}\r\n\t\tif (whitespace.length < characters.length)\r\n\t\t\ttree.parseError('expected-eof-but-got-char');\r\n\t};\r\n\r\n\tmodes.afterFrameset.startTagNoframes = function(name, attributes) {\r\n\t\tmodes.inHead.processStartTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.afterFrameset.startTagOther = function(name, attributes) {\r\n\t\ttree.parseError(\"unexpected-start-tag-after-frameset\", {name: name});\r\n\t};\r\n\r\n\tmodes.afterFrameset.endTagHtml = function(name) {\r\n\t\ttree.setInsertionMode('afterAfterFrameset');\r\n\t};\r\n\r\n\tmodes.afterFrameset.endTagOther = function(name) {\r\n\t\ttree.parseError(\"unexpected-end-tag-after-frameset\", {name: name});\r\n\t};\r\n\r\n\tmodes.beforeHead = Object.create(modes.base);\r\n\r\n\tmodes.beforeHead.start_tag_handlers = {\r\n\t\thtml: 'startTagHtml',\r\n\t\thead: 'startTagHead',\r\n\t\t'-default': 'startTagOther'\r\n\t};\r\n\r\n\tmodes.beforeHead.end_tag_handlers = {\r\n\t\thtml: 'endTagImplyHead',\r\n\t\thead: 'endTagImplyHead',\r\n\t\tbody: 'endTagImplyHead',\r\n\t\tbr: 'endTagImplyHead',\r\n\t\t'-default': 'endTagOther'\r\n\t};\r\n\r\n\tmodes.beforeHead.processEOF = function() {\r\n\t\tthis.startTagHead('head', []);\r\n\t\ttree.insertionMode.processEOF();\r\n\t};\r\n\r\n\tmodes.beforeHead.processCharacters = function(buffer) {\r\n\t\tbuffer.skipLeadingWhitespace();\r\n\t\tif (!buffer.length)\r\n\t\t\treturn;\r\n\t\tthis.startTagHead('head', []);\r\n\t\ttree.insertionMode.processCharacters(buffer);\r\n\t};\r\n\r\n\tmodes.beforeHead.startTagHead = function(name, attributes) {\r\n\t\ttree.insertHeadElement(attributes);\r\n\t\ttree.setInsertionMode('inHead');\r\n\t};\r\n\r\n\tmodes.beforeHead.startTagOther = function(name, attributes, selfClosing) {\r\n\t\tthis.startTagHead('head', []);\r\n\t\ttree.insertionMode.processStartTag(name, attributes, selfClosing);\r\n\t};\r\n\r\n\tmodes.beforeHead.endTagImplyHead = function(name) {\r\n\t\tthis.startTagHead('head', []);\r\n\t\ttree.insertionMode.processEndTag(name);\r\n\t};\r\n\r\n\tmodes.beforeHead.endTagOther = function(name) {\r\n\t\ttree.parseError('end-tag-after-implied-root', {name: name});\r\n\t};\r\n\r\n\tmodes.inHead = Object.create(modes.base);\r\n\r\n\tmodes.inHead.start_tag_handlers = {\r\n\t\thtml: 'startTagHtml',\r\n\t\thead: 'startTagHead',\r\n\t\ttitle: 'startTagTitle',\r\n\t\tscript: 'startTagScript',\r\n\t\tstyle: 'startTagNoFramesStyle',\r\n\t\tnoscript: 'startTagNoScript',\r\n\t\tnoframes: 'startTagNoFramesStyle',\r\n\t\tbase: 'startTagBaseBasefontBgsoundLink',\r\n\t\tbasefont: 'startTagBaseBasefontBgsoundLink',\r\n\t\tbgsound: 'startTagBaseBasefontBgsoundLink',\r\n\t\tlink: 'startTagBaseBasefontBgsoundLink',\r\n\t\tmeta: 'startTagMeta',\r\n\t\t\"-default\": 'startTagOther'\r\n\t};\r\n\r\n\tmodes.inHead.end_tag_handlers = {\r\n\t\thead: 'endTagHead',\r\n\t\thtml: 'endTagHtmlBodyBr',\r\n\t\tbody: 'endTagHtmlBodyBr',\r\n\t\tbr: 'endTagHtmlBodyBr',\r\n\t\t\"-default\": 'endTagOther'\r\n\t};\r\n\r\n\tmodes.inHead.processEOF = function() {\r\n\t\tvar name = tree.currentStackItem().localName;\r\n\t\tif (['title', 'style', 'script'].indexOf(name) != -1) {\r\n\t\t\ttree.parseError(\"expected-named-closing-tag-but-got-eof\", {name: name});\r\n\t\t\ttree.popElement();\r\n\t\t}\r\n\r\n\t\tthis.anythingElse();\r\n\r\n\t\ttree.insertionMode.processEOF();\r\n\t};\r\n\r\n\tmodes.inHead.processCharacters = function(buffer) {\r\n\t\tvar leadingWhitespace = buffer.takeLeadingWhitespace();\r\n\t\tif (leadingWhitespace)\r\n\t\t\ttree.insertText(leadingWhitespace);\r\n\t\tif (!buffer.length)\r\n\t\t\treturn;\r\n\t\tthis.anythingElse();\r\n\t\ttree.insertionMode.processCharacters(buffer);\r\n\t};\r\n\r\n\tmodes.inHead.startTagHtml = function(name, attributes) {\r\n\t\tmodes.inBody.processStartTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.inHead.startTagHead = function(name, attributes) {\r\n\t\ttree.parseError('two-heads-are-not-better-than-one');\r\n\t};\r\n\r\n\tmodes.inHead.startTagTitle = function(name, attributes) {\r\n\t\ttree.processGenericRCDATAStartTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.inHead.startTagNoScript = function(name, attributes) {\r\n\t\tif (tree.scriptingEnabled)\r\n\t\t\treturn tree.processGenericRawTextStartTag(name, attributes);\r\n\t\ttree.insertElement(name, attributes);\r\n\t\ttree.setInsertionMode('inHeadNoscript');\r\n\t};\r\n\r\n\tmodes.inHead.startTagNoFramesStyle = function(name, attributes) {\r\r\n\t\ttree.processGenericRawTextStartTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.inHead.startTagScript = function(name, attributes) {\r\n\t\ttree.insertElement(name, attributes);\r\n\t\ttree.tokenizer.setState(Tokenizer.SCRIPT_DATA);\r\n\t\ttree.originalInsertionMode = tree.insertionModeName;\r\n\t\ttree.setInsertionMode('text');\r\n\t};\r\n\r\n\tmodes.inHead.startTagBaseBasefontBgsoundLink = function(name, attributes) {\r\n\t\ttree.insertSelfClosingElement(name, attributes);\r\n\t};\r\n\r\n\tmodes.inHead.startTagMeta = function(name, attributes) {\r\n\t\ttree.insertSelfClosingElement(name, attributes);\r\r\n\t};\r\n\r\n\tmodes.inHead.startTagOther = function(name, attributes, selfClosing) {\r\n\t\tthis.anythingElse();\r\n\t\ttree.insertionMode.processStartTag(name, attributes, selfClosing);\r\n\t};\r\n\r\n\tmodes.inHead.endTagHead = function(name) {\r\n\t\tif (tree.openElements.item(tree.openElements.length - 1).localName == 'head') {\r\n\t\t\ttree.openElements.pop();\r\n\t\t} else {\r\n\t\t\ttree.parseError('unexpected-end-tag', {name: 'head'});\r\n\t\t}\r\n\t\ttree.setInsertionMode('afterHead');\r\n\t};\r\n\r\n\tmodes.inHead.endTagHtmlBodyBr = function(name) {\r\n\t\tthis.anythingElse();\r\n\t\ttree.insertionMode.processEndTag(name);\r\n\t};\r\n\r\n\tmodes.inHead.endTagOther = function(name) {\r\n\t\ttree.parseError('unexpected-end-tag', {name: name});\r\n\t};\r\n\r\n\tmodes.inHead.anythingElse = function() {\r\n\t\tthis.endTagHead('head');\r\n\t};\r\n\r\n\tmodes.afterHead = Object.create(modes.base);\r\n\r\n\tmodes.afterHead.start_tag_handlers = {\r\n\t\thtml: 'startTagHtml',\r\n\t\thead: 'startTagHead',\r\n\t\tbody: 'startTagBody',\r\n\t\tframeset: 'startTagFrameset',\r\n\t\tbase: 'startTagFromHead',\r\n\t\tlink: 'startTagFromHead',\r\n\t\tmeta: 'startTagFromHead',\r\n\t\tscript: 'startTagFromHead',\r\r\n\t\tstyle: 'startTagFromHead',\r\n\t\ttitle: 'startTagFromHead',\r\n\t\t\"-default\": 'startTagOther'\r\n\t};\r\n\r\n\tmodes.afterHead.end_tag_handlers = {\r\n\t\tbody: 'endTagBodyHtmlBr',\r\n\t\thtml: 'endTagBodyHtmlBr',\r\n\t\tbr: 'endTagBodyHtmlBr',\r\n\t\t\"-default\": 'endTagOther'\r\n\t};\r\n\r\n\tmodes.afterHead.processEOF = function() {\r\n\t\tthis.anythingElse();\r\n\t\ttree.insertionMode.processEOF();\r\n\t};\r\n\r\n\tmodes.afterHead.processCharacters = function(buffer) {\r\n\t\tvar leadingWhitespace = buffer.takeLeadingWhitespace();\r\n\t\tif (leadingWhitespace)\r\n\t\t\ttree.insertText(leadingWhitespace);\r\n\t\tif (!buffer.length)\r\n\t\t\treturn;\r\n\t\tthis.anythingElse();\r\n\t\ttree.insertionMode.processCharacters(buffer);\r\n\t};\r\n\r\n\tmodes.afterHead.startTagHtml = function(name, attributes) {\r\n\t\tmodes.inBody.processStartTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.afterHead.startTagBody = function(name, attributes) {\r\n\t\ttree.framesetOk = false;\r\n\t\ttree.insertBodyElement(attributes);\r\n\t\ttree.setInsertionMode('inBody');\r\n\t};\r\n\r\n\tmodes.afterHead.startTagFrameset = function(name, attributes) {\r\n\t\ttree.insertElement(name, attributes);\r\n\t\ttree.setInsertionMode('inFrameset');\r\n\t};\r\n\r\n\tmodes.afterHead.startTagFromHead = function(name, attributes, selfClosing) {\r\n\t\ttree.parseError(\"unexpected-start-tag-out-of-my-head\", {name: name});\r\r\n\t\ttree.openElements.push(tree.head);\r\n\t\tmodes.inHead.processStartTag(name, attributes, selfClosing);\r\n\t\ttree.openElements.remove(tree.head);\r\n\t};\r\n\r\n\tmodes.afterHead.startTagHead = function(name, attributes, selfClosing) {\r\n\t\ttree.parseError('unexpected-start-tag', {name: name});\r\n\t};\r\n\r\n\tmodes.afterHead.startTagOther = function(name, attributes, selfClosing) {\r\n\t\tthis.anythingElse();\r\n\t\ttree.insertionMode.processStartTag(name, attributes, selfClosing);\r\n\t};\r\n\r\n\tmodes.afterHead.endTagBodyHtmlBr = function(name) {\r\n\t\tthis.anythingElse();\r\n\t\ttree.insertionMode.processEndTag(name);\r\n\t};\r\n\r\n\tmodes.afterHead.endTagOther = function(name) {\r\n\t\ttree.parseError('unexpected-end-tag', {name: name});\r\n\t};\r\n\r\n\tmodes.afterHead.anythingElse = function() {\r\n\t\ttree.insertBodyElement([]);\r\n\t\ttree.setInsertionMode('inBody');\r\n\t\ttree.framesetOk = true;\r\n\t}\r\n\r\n\tmodes.inBody = Object.create(modes.base);\r\n\r\n\tmodes.inBody.start_tag_handlers = {\r\n\t\thtml: 'startTagHtml',\r\n\t\thead: 'startTagMisplaced',\r\n\t\tbase: 'startTagProcessInHead',\r\n\t\tbasefont: 'startTagProcessInHead',\r\n\t\tbgsound: 'startTagProcessInHead',\r\n\t\tlink: 'startTagProcessInHead',\r\n\t\tmeta: 'startTagProcessInHead',\r\n\t\tnoframes: 'startTagProcessInHead',\r\n\t\tscript: 'startTagProcessInHead',\r\n\t\tstyle: 'startTagProcessInHead',\r\n\t\ttitle: 'startTagProcessInHead',\r\n\t\tbody: 'startTagBody',\r\n\t\tform: 'startTagForm',\r\n\t\tplaintext: 'startTagPlaintext',\r\n\t\ta: 'startTagA',\r\n\t\tbutton: 'startTagButton',\r\n\t\txmp: 'startTagXmp',\r\n\t\ttable: 'startTagTable',\r\n\t\thr: 'startTagHr',\r\n\t\timage: 'startTagImage',\r\n\t\tinput: 'startTagInput',\r\n\t\ttextarea: 'startTagTextarea',\r\n\t\tselect: 'startTagSelect',\r\n\t\tisindex: 'startTagIsindex',\r\n\t\tapplet:\t'startTagAppletMarqueeObject',\r\n\t\tmarquee:\t'startTagAppletMarqueeObject',\r\n\t\tobject:\t'startTagAppletMarqueeObject',\r\n\t\tli: 'startTagListItem',\r\n\t\tdd: 'startTagListItem',\r\n\t\tdt: 'startTagListItem',\r\n\t\taddress: 'startTagCloseP',\r\n\t\tarticle: 'startTagCloseP',\r\n\t\taside: 'startTagCloseP',\r\n\t\tblockquote: 'startTagCloseP',\r\n\t\tcenter: 'startTagCloseP',\r\n\t\tdetails: 'startTagCloseP',\r\n\t\tdir: 'startTagCloseP',\r\n\t\tdiv: 'startTagCloseP',\r\n\t\tdl: 'startTagCloseP',\r\n\t\tfieldset: 'startTagCloseP',\r\n\t\tfigcaption: 'startTagCloseP',\r\n\t\tfigure: 'startTagCloseP',\r\n\t\tfooter: 'startTagCloseP',\r\n\t\theader: 'startTagCloseP',\r\n\t\thgroup: 'startTagCloseP',\r\n\t\tmain: 'startTagCloseP',\r\n\t\tmenu: 'startTagCloseP',\r\n\t\tnav: 'startTagCloseP',\r\n\t\tol: 'startTagCloseP',\r\n\t\tp: 'startTagCloseP',\r\n\t\tsection: 'startTagCloseP',\r\n\t\tsummary: 'startTagCloseP',\r\n\t\tul: 'startTagCloseP',\r\n\t\tlisting: 'startTagPreListing',\r\n\t\tpre: 'startTagPreListing',\r\n\t\tb: 'startTagFormatting',\r\n\t\tbig: 'startTagFormatting',\r\n\t\tcode: 'startTagFormatting',\r\n\t\tem: 'startTagFormatting',\r\n\t\tfont: 'startTagFormatting',\r\n\t\ti: 'startTagFormatting',\r\n\t\ts: 'startTagFormatting',\r\n\t\tsmall: 'startTagFormatting',\r\n\t\tstrike: 'startTagFormatting',\r\n\t\tstrong: 'startTagFormatting',\r\n\t\ttt: 'startTagFormatting',\r\n\t\tu: 'startTagFormatting',\r\n\t\tnobr: 'startTagNobr',\r\n\t\tarea: 'startTagVoidFormatting',\r\n\t\tbr: 'startTagVoidFormatting',\r\n\t\tembed: 'startTagVoidFormatting',\r\n\t\timg: 'startTagVoidFormatting',\r\n\t\tkeygen: 'startTagVoidFormatting',\r\n\t\twbr: 'startTagVoidFormatting',\r\n\t\tparam: 'startTagParamSourceTrack',\r\n\t\tsource: 'startTagParamSourceTrack',\r\n\t\ttrack: 'startTagParamSourceTrack',\r\n\t\tiframe: 'startTagIFrame',\r\n\t\tnoembed: 'startTagRawText',\r\n\t\tnoscript: 'startTagRawText',\r\n\t\th1: 'startTagHeading',\r\n\t\th2: 'startTagHeading',\r\n\t\th3: 'startTagHeading',\r\n\t\th4: 'startTagHeading',\r\n\t\th5: 'startTagHeading',\r\n\t\th6: 'startTagHeading',\r\n\t\tcaption: 'startTagMisplaced',\r\n\t\tcol: 'startTagMisplaced',\r\n\t\tcolgroup: 'startTagMisplaced',\r\n\t\tframe: 'startTagMisplaced',\r\n\t\tframeset: 'startTagFrameset',\r\n\t\ttbody: 'startTagMisplaced',\r\n\t\ttd: 'startTagMisplaced',\r\n\t\ttfoot: 'startTagMisplaced',\r\n\t\tth: 'startTagMisplaced',\r\n\t\tthead: 'startTagMisplaced',\r\n\t\ttr: 'startTagMisplaced',\r\n\t\toption: 'startTagOptionOptgroup',\r\n\t\toptgroup: 'startTagOptionOptgroup',\r\n\t\tmath: 'startTagMath',\r\n\t\tsvg: 'startTagSVG',\r\n\t\trt: 'startTagRpRt',\r\n\t\trp: 'startTagRpRt',\r\n\t\t\"-default\": 'startTagOther'\r\n\t};\r\n\r\n\tmodes.inBody.end_tag_handlers = {\r\n\t\tp: 'endTagP',\r\n\t\tbody: 'endTagBody',\r\n\t\thtml: 'endTagHtml',\r\n\t\taddress: 'endTagBlock',\r\n\t\tarticle: 'endTagBlock',\r\n\t\taside: 'endTagBlock',\r\n\t\tblockquote: 'endTagBlock',\r\n\t\tbutton: 'endTagBlock',\r\n\t\tcenter: 'endTagBlock',\r\n\t\tdetails: 'endTagBlock',\r\n\t\tdir: 'endTagBlock',\r\n\t\tdiv: 'endTagBlock',\r\n\t\tdl: 'endTagBlock',\r\n\t\tfieldset: 'endTagBlock',\r\n\t\tfigcaption: 'endTagBlock',\r\n\t\tfigure: 'endTagBlock',\r\n\t\tfooter: 'endTagBlock',\r\n\t\theader: 'endTagBlock',\r\n\t\thgroup: 'endTagBlock',\r\n\t\tlisting: 'endTagBlock',\r\n\t\tmain: 'endTagBlock',\r\n\t\tmenu: 'endTagBlock',\r\n\t\tnav: 'endTagBlock',\r\n\t\tol: 'endTagBlock',\r\n\t\tpre: 'endTagBlock',\r\n\t\tsection: 'endTagBlock',\r\n\t\tsummary: 'endTagBlock',\r\n\t\tul: 'endTagBlock',\r\n\t\tform: 'endTagForm',\r\n\t\tapplet: 'endTagAppletMarqueeObject',\r\n\t\tmarquee: 'endTagAppletMarqueeObject',\r\n\t\tobject: 'endTagAppletMarqueeObject',\r\n\t\tdd: 'endTagListItem',\r\n\t\tdt: 'endTagListItem',\r\n\t\tli: 'endTagListItem',\r\n\t\th1: 'endTagHeading',\r\n\t\th2: 'endTagHeading',\r\n\t\th3: 'endTagHeading',\r\n\t\th4: 'endTagHeading',\r\n\t\th5: 'endTagHeading',\r\n\t\th6: 'endTagHeading',\r\n\t\ta: 'endTagFormatting',\r\n\t\tb: 'endTagFormatting',\r\n\t\tbig: 'endTagFormatting',\r\n\t\tcode: 'endTagFormatting',\r\n\t\tem: 'endTagFormatting',\r\n\t\tfont: 'endTagFormatting',\r\n\t\ti: 'endTagFormatting',\r\n\t\tnobr: 'endTagFormatting',\r\n\t\ts: 'endTagFormatting',\r\n\t\tsmall: 'endTagFormatting',\r\n\t\tstrike: 'endTagFormatting',\r\n\t\tstrong: 'endTagFormatting',\r\n\t\ttt: 'endTagFormatting',\r\n\t\tu: 'endTagFormatting',\r\n\t\tbr: 'endTagBr',\r\n\t\t\"-default\": 'endTagOther'\r\n\t};\r\n\r\n\tmodes.inBody.processCharacters = function(buffer) {\r\n\t\tif (tree.shouldSkipLeadingNewline) {\r\n\t\t\ttree.shouldSkipLeadingNewline = false;\r\n\t\t\tbuffer.skipAtMostOneLeadingNewline();\r\n\t\t}\r\n\t\ttree.reconstructActiveFormattingElements();\r\n\t\tvar characters = buffer.takeRemaining();\r\n\t\tcharacters = characters.replace(/\\u0000/g, function(match, index){\r\r\n\t\t\ttree.parseError(\"invalid-codepoint\");\r\n\t\t\treturn '';\r\n\t\t});\r\n\t\tif (!characters)\r\n\t\t\treturn;\r\n\t\ttree.insertText(characters);\r\n\t\tif (tree.framesetOk && !isAllWhitespaceOrReplacementCharacters(characters))\r\n\t\t\ttree.framesetOk = false;\r\n\t};\r\n\r\n\tmodes.inBody.startTagHtml = function(name, attributes) {\r\n\t\ttree.parseError('non-html-root');\r\n\t\ttree.addAttributesToElement(tree.openElements.rootNode, attributes);\r\n\t};\r\n\r\n\tmodes.inBody.startTagProcessInHead = function(name, attributes) {\r\n\t\tmodes.inHead.processStartTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.inBody.startTagBody = function(name, attributes) {\r\n\t\ttree.parseError('unexpected-start-tag', {name: 'body'});\r\n\t\tif (tree.openElements.length == 1 ||\r\n\t\t\ttree.openElements.item(1).localName != 'body') {\r\n\t\t\tassert.ok(tree.context);\r\n\t\t} else {\r\n\t\t\ttree.framesetOk = false;\r\n\t\t\ttree.addAttributesToElement(tree.openElements.bodyElement, attributes);\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inBody.startTagFrameset = function(name, attributes) {\r\n\t\ttree.parseError('unexpected-start-tag', {name: 'frameset'});\r\n\t\tif (tree.openElements.length == 1 ||\r\n\t\t\ttree.openElements.item(1).localName != 'body') {\r\n\t\t\tassert.ok(tree.context);\r\n\t\t} else if (tree.framesetOk) {\r\n\t\t\ttree.detachFromParent(tree.openElements.bodyElement);\r\n\t\t\twhile (tree.openElements.length > 1)\r\n\t\t\t\ttree.openElements.pop();\r\n\t\t\ttree.insertElement(name, attributes);\r\n\t\t\ttree.setInsertionMode('inFrameset');\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inBody.startTagCloseP = function(name, attributes) {\r\n\t\tif (tree.openElements.inButtonScope('p'))\r\n\t\t\tthis.endTagP('p');\r\n\t\ttree.insertElement(name, attributes);\r\n\t};\r\n\r\n\tmodes.inBody.startTagPreListing = function(name, attributes) {\r\n\t\tif (tree.openElements.inButtonScope('p'))\r\n\t\t\tthis.endTagP('p');\r\n\t\ttree.insertElement(name, attributes);\r\n\t\ttree.framesetOk = false;\r\n\t\ttree.shouldSkipLeadingNewline = true;\r\n\t};\r\n\r\n\tmodes.inBody.startTagForm = function(name, attributes) {\r\n\t\tif (tree.form) {\r\n\t\t\ttree.parseError('unexpected-start-tag', {name: name});\r\n\t\t} else {\r\n\t\t\tif (tree.openElements.inButtonScope('p'))\r\n\t\t\t\tthis.endTagP('p');\r\n\t\t\ttree.insertElement(name, attributes);\r\n\t\t\ttree.form = tree.currentStackItem();\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inBody.startTagRpRt = function(name, attributes) {\r\n\t\tif (tree.openElements.inScope('ruby')) {\r\n\t\t\ttree.generateImpliedEndTags();\r\n\t\t\tif (tree.currentStackItem().localName != 'ruby') {\r\n\t\t\t\ttree.parseError('unexpected-start-tag', {name: name});\r\n\t\t\t}\r\n\t\t}\r\n\t\ttree.insertElement(name, attributes);\r\n\t};\r\n\r\n\tmodes.inBody.startTagListItem = function(name, attributes) {\r\r\n\t\tvar stopNames = {li: ['li'], dd: ['dd', 'dt'], dt: ['dd', 'dt']};\r\n\t\tvar stopName = stopNames[name];\r\n\r\n\t\tvar els = tree.openElements;\r\n\t\tfor (var i = els.length - 1; i >= 0; i--) {\r\n\t\t\tvar node = els.item(i);\r\n\t\t\tif (stopName.indexOf(node.localName) != -1) {\r\n\t\t\t\ttree.insertionMode.processEndTag(node.localName);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\r\n\t\t\tif (node.isSpecial() && node.localName !== 'p' && node.localName !== 'address' && node.localName !== 'div')\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t\tif (tree.openElements.inButtonScope('p'))\r\n\t\t\tthis.endTagP('p');\r\r\n\t\ttree.insertElement(name, attributes);\r\n\t\ttree.framesetOk = false;\r\n\t};\r\n\r\n\tmodes.inBody.startTagPlaintext = function(name, attributes) {\r\n\t\tif (tree.openElements.inButtonScope('p'))\r\n\t\t\tthis.endTagP('p');\r\n\t\ttree.insertElement(name, attributes);\r\n\t\ttree.tokenizer.setState(Tokenizer.PLAINTEXT);\r\n\t};\r\n\r\n\tmodes.inBody.startTagHeading = function(name, attributes) {\r\n\t\tif (tree.openElements.inButtonScope('p'))\r\n\t\t\tthis.endTagP('p');\r\n\t\tif (tree.currentStackItem().isNumberedHeader()) {\r\n\t\t\ttree.parseError('unexpected-start-tag', {name: name});\r\n\t\t\ttree.popElement();\r\n\t\t}\r\n\t\ttree.insertElement(name, attributes);\r\n\t};\r\n\r\n\tmodes.inBody.startTagA = function(name, attributes) {\r\n\t\tvar activeA = tree.elementInActiveFormattingElements('a');\r\n\t\tif (activeA) {\r\n\t\t\ttree.parseError(\"unexpected-start-tag-implies-end-tag\", {startName: \"a\", endName: \"a\"});\r\n\t\t\ttree.adoptionAgencyEndTag('a');\r\n\t\t\tif (tree.openElements.contains(activeA))\r\n\t\t\t\ttree.openElements.remove(activeA);\r\n\t\t\ttree.removeElementFromActiveFormattingElements(activeA);\r\n\t\t}\r\n\t\ttree.reconstructActiveFormattingElements();\r\n\t\ttree.insertFormattingElement(name, attributes);\r\n\t};\r\n\r\n\tmodes.inBody.startTagFormatting = function(name, attributes) {\r\n\t\ttree.reconstructActiveFormattingElements();\r\n\t\ttree.insertFormattingElement(name, attributes);\r\n\t};\r\n\r\n\tmodes.inBody.startTagNobr = function(name, attributes) {\r\n\t\ttree.reconstructActiveFormattingElements();\r\n\t\tif (tree.openElements.inScope('nobr')) {\r\n\t\t\ttree.parseError(\"unexpected-start-tag-implies-end-tag\", {startName: 'nobr', endName: 'nobr'});\r\n\t\t\tthis.processEndTag('nobr');\r\r\n\t\t\t\ttree.reconstructActiveFormattingElements();\r\n\t\t}\r\n\t\ttree.insertFormattingElement(name, attributes);\r\n\t};\r\n\r\n\tmodes.inBody.startTagButton = function(name, attributes) {\r\n\t\tif (tree.openElements.inScope('button')) {\r\n\t\t\ttree.parseError('unexpected-start-tag-implies-end-tag', {startName: 'button', endName: 'button'});\r\n\t\t\tthis.processEndTag('button');\r\n\t\t\ttree.insertionMode.processStartTag(name, attributes);\r\n\t\t} else {\r\n\t\t\ttree.framesetOk = false;\r\n\t\t\ttree.reconstructActiveFormattingElements();\r\n\t\t\ttree.insertElement(name, attributes);\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inBody.startTagAppletMarqueeObject = function(name, attributes) {\r\n\t\ttree.reconstructActiveFormattingElements();\r\n\t\ttree.insertElement(name, attributes);\r\n\t\ttree.activeFormattingElements.push(Marker);\r\n\t\ttree.framesetOk = false;\r\n\t};\r\n\r\n\tmodes.inBody.endTagAppletMarqueeObject = function(name) {\r\n\t\tif (!tree.openElements.inScope(name)) {\r\n\t\t\ttree.parseError(\"unexpected-end-tag\", {name: name});\r\n\t\t} else {\r\n\t\t\ttree.generateImpliedEndTags();\r\n\t\t\tif (tree.currentStackItem().localName != name) {\r\n\t\t\t\ttree.parseError('end-tag-too-early', {name: name});\r\n\t\t\t}\r\n\t\t\ttree.openElements.popUntilPopped(name);\r\n\t\t\ttree.clearActiveFormattingElements();\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inBody.startTagXmp = function(name, attributes) {\r\n\t\tif (tree.openElements.inButtonScope('p'))\r\n\t\t\tthis.processEndTag('p');\r\n\t\ttree.reconstructActiveFormattingElements();\r\n\t\ttree.processGenericRawTextStartTag(name, attributes);\r\n\t\ttree.framesetOk = false;\r\n\t};\r\n\r\n\tmodes.inBody.startTagTable = function(name, attributes) {\r\n\t\tif (tree.compatMode !== \"quirks\")\r\n\t\t\tif (tree.openElements.inButtonScope('p'))\r\n\t\t\t\tthis.processEndTag('p');\r\n\t\ttree.insertElement(name, attributes);\r\n\t\ttree.setInsertionMode('inTable');\r\n\t\ttree.framesetOk = false;\r\n\t};\r\n\r\n\tmodes.inBody.startTagVoidFormatting = function(name, attributes) {\r\n\t\ttree.reconstructActiveFormattingElements();\r\n\t\ttree.insertSelfClosingElement(name, attributes);\r\n\t\ttree.framesetOk = false;\r\n\t};\r\n\r\n\tmodes.inBody.startTagParamSourceTrack = function(name, attributes) {\r\n\t\ttree.insertSelfClosingElement(name, attributes);\r\n\t};\r\n\r\n\tmodes.inBody.startTagHr = function(name, attributes) {\r\n\t\tif (tree.openElements.inButtonScope('p'))\r\n\t\t\tthis.endTagP('p');\r\n\t\ttree.insertSelfClosingElement(name, attributes);\r\n\t\ttree.framesetOk = false;\r\n\t};\r\n\r\n\tmodes.inBody.startTagImage = function(name, attributes) {\r\r\n\t\ttree.parseError('unexpected-start-tag-treated-as', {originalName: 'image', newName: 'img'});\r\n\t\tthis.processStartTag('img', attributes);\r\n\t};\r\n\r\n\tmodes.inBody.startTagInput = function(name, attributes) {\r\n\t\tvar currentFramesetOk = tree.framesetOk;\r\n\t\tthis.startTagVoidFormatting(name, attributes);\r\n\t\tfor (var key in attributes) {\r\r\n\t\t\tif (attributes[key].nodeName == 'type') {\r\n\t\t\t\tif (attributes[key].nodeValue.toLowerCase() == 'hidden')\r\n\t\t\t\t\ttree.framesetOk = currentFramesetOk;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inBody.startTagIsindex = function(name, attributes) {\r\n\t\ttree.parseError('deprecated-tag', {name: 'isindex'});\r\n\t\ttree.selfClosingFlagAcknowledged = true;\r\n\t\tif (tree.form)\r\n\t\t\treturn;\r\n\t\tvar formAttributes = [];\r\n\t\tvar inputAttributes = [];\r\n\t\tvar prompt = \"This is a searchable index. Enter search keywords: \";\r\n\t\tfor (var key in attributes) {\r\n\t\t\tswitch (attributes[key].nodeName) {\r\n\t\t\t\tcase 'action':\r\n\t\t\t\t\tformAttributes.push({nodeName: 'action',\r\n\t\t\t\t\t\tnodeValue: attributes[key].nodeValue});\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'prompt':\r\n\t\t\t\t\tprompt = attributes[key].nodeValue;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'name':\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tinputAttributes.push({nodeName: attributes[key].nodeName,\r\n\t\t\t\t\t\tnodeValue: attributes[key].nodeValue});\r\n\t\t\t}\r\n\t\t}\r\n\t\tinputAttributes.push({nodeName: 'name', nodeValue: 'isindex'});\r\n\t\tthis.processStartTag('form', formAttributes);\r\n\t\tthis.processStartTag('hr');\r\n\t\tthis.processStartTag('label');\r\n\t\tthis.processCharacters(new CharacterBuffer(prompt));\r\n\t\tthis.processStartTag('input', inputAttributes);\r\n\t\tthis.processEndTag('label');\r\n\t\tthis.processStartTag('hr');\r\n\t\tthis.processEndTag('form');\r\n\t};\r\n\r\n\tmodes.inBody.startTagTextarea = function(name, attributes) {\r\r\n\t\ttree.insertElement(name, attributes);\r\n\t\ttree.tokenizer.setState(Tokenizer.RCDATA);\r\n\t\ttree.originalInsertionMode = tree.insertionModeName;\r\n\t\ttree.shouldSkipLeadingNewline = true;\r\n\t\ttree.framesetOk = false;\r\n\t\ttree.setInsertionMode('text');\r\n\t};\r\n\r\n\tmodes.inBody.startTagIFrame = function(name, attributes) {\r\n\t\ttree.framesetOk = false;\r\n\t\tthis.startTagRawText(name, attributes);\r\n\t};\r\n\r\n\tmodes.inBody.startTagRawText = function(name, attributes) {\r\n\t\ttree.processGenericRawTextStartTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.inBody.startTagSelect = function(name, attributes) {\r\n\t\ttree.reconstructActiveFormattingElements();\r\n\t\ttree.insertElement(name, attributes);\r\n\t\ttree.framesetOk = false;\r\n\t\tvar insertionModeName = tree.insertionModeName;\r\n\t\tif (insertionModeName == 'inTable' ||\r\n\t\t\tinsertionModeName == 'inCaption' ||\r\n\t\t\tinsertionModeName == 'inColumnGroup' ||\r\n\t\t\tinsertionModeName == 'inTableBody' ||\r\n\t\t\tinsertionModeName == 'inRow' ||\r\n\t\t\tinsertionModeName == 'inCell') {\r\n\t\t\ttree.setInsertionMode('inSelectInTable');\r\n\t\t} else {\r\n\t\t\ttree.setInsertionMode('inSelect');\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inBody.startTagMisplaced = function(name, attributes) {\r\n\t\ttree.parseError('unexpected-start-tag-ignored', {name: name});\r\n\t};\r\n\r\n\tmodes.inBody.endTagMisplaced = function(name) {\r\r\n\t\ttree.parseError(\"unexpected-end-tag\", {name: name});\r\n\t};\r\n\r\n\tmodes.inBody.endTagBr = function(name) {\r\n\t\ttree.parseError(\"unexpected-end-tag-treated-as\", {originalName: \"br\", newName: \"br element\"});\r\n\t\ttree.reconstructActiveFormattingElements();\r\n\t\ttree.insertElement(name, []);\r\n\t\ttree.popElement();\r\n\t};\r\n\r\n\tmodes.inBody.startTagOptionOptgroup = function(name, attributes) {\r\n\t\tif (tree.currentStackItem().localName == 'option')\r\n\t\t\ttree.popElement();\r\n\t\ttree.reconstructActiveFormattingElements();\r\n\t\ttree.insertElement(name, attributes);\r\n\t};\r\n\r\n\tmodes.inBody.startTagOther = function(name, attributes) {\r\n\t\ttree.reconstructActiveFormattingElements();\r\n\t\ttree.insertElement(name, attributes);\r\n\t};\r\n\r\n\tmodes.inBody.endTagOther = function(name) {\r\n\t\tvar node;\r\n\t\tfor (var i = tree.openElements.length - 1; i > 0; i--) {\r\n\t\t\tnode = tree.openElements.item(i);\r\n\t\t\tif (node.localName == name) {\r\n\t\t\t\ttree.generateImpliedEndTags(name);\r\n\t\t\t\tif (tree.currentStackItem().localName != name)\r\n\t\t\t\t\ttree.parseError('unexpected-end-tag', {name: name});\r\r\n\t\t\t\ttree.openElements.remove_openElements_until(function(x) {return x === node;});\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tif (node.isSpecial()) {\r\n\t\t\t\ttree.parseError('unexpected-end-tag', {name: name});\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inBody.startTagMath = function(name, attributes, selfClosing) {\r\n\t\ttree.reconstructActiveFormattingElements();\r\n\t\tattributes = tree.adjustMathMLAttributes(attributes);\r\n\t\tattributes = tree.adjustForeignAttributes(attributes);\r\n\t\ttree.insertForeignElement(name, attributes, \"http://www.w3.org/1998/Math/MathML\", selfClosing);\r\r\r\n\t};\r\n\r\n\tmodes.inBody.startTagSVG = function(name, attributes, selfClosing) {\r\n\t\ttree.reconstructActiveFormattingElements();\r\n\t\tattributes = tree.adjustSVGAttributes(attributes);\r\n\t\tattributes = tree.adjustForeignAttributes(attributes);\r\n\t\ttree.insertForeignElement(name, attributes, \"http://www.w3.org/2000/svg\", selfClosing);\r\r\r\n\t};\r\n\r\n\tmodes.inBody.endTagP = function(name) {\r\n\t\tif (!tree.openElements.inButtonScope('p')) {\r\n\t\t\ttree.parseError('unexpected-end-tag', {name: 'p'});\r\n\t\t\tthis.startTagCloseP('p', []);\r\n\t\t\tthis.endTagP('p');\r\n\t\t} else {\r\n\t\t\ttree.generateImpliedEndTags('p');\r\n\t\t\tif (tree.currentStackItem().localName != 'p')\r\n\t\t\t\ttree.parseError('unexpected-implied-end-tag', {name: 'p'});\r\n\t\t\ttree.openElements.popUntilPopped(name);\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inBody.endTagBody = function(name) {\r\n\t\tif (!tree.openElements.inScope('body')) {\r\n\t\t\ttree.parseError('unexpected-end-tag', {name: name});\r\n\t\t\treturn;\r\n\t\t}\r\r\r\n\t\tif (tree.currentStackItem().localName != 'body') {\r\n\t\t\ttree.parseError('expected-one-end-tag-but-got-another', {\r\n\t\t\t\texpectedName: tree.currentStackItem().localName,\r\n\t\t\t\tgotName: name\r\n\t\t\t});\r\n\t\t}\r\n\t\ttree.setInsertionMode('afterBody');\r\n\t};\r\n\r\n\tmodes.inBody.endTagHtml = function(name) {\r\n\t\tif (!tree.openElements.inScope('body')) {\r\n\t\t\ttree.parseError('unexpected-end-tag', {name: name});\r\n\t\t\treturn;\r\n\t\t}\r\r\r\n\t\tif (tree.currentStackItem().localName != 'body') {\r\n\t\t\ttree.parseError('expected-one-end-tag-but-got-another', {\r\n\t\t\t\texpectedName: tree.currentStackItem().localName,\r\n\t\t\t\tgotName: name\r\n\t\t\t});\r\n\t\t}\r\n\t\ttree.setInsertionMode('afterBody');\r\n\t\ttree.insertionMode.processEndTag(name);\r\n\t};\r\n\r\n\tmodes.inBody.endTagBlock = function(name) {\r\n\t\tif (!tree.openElements.inScope(name)) {\r\n\t\t\ttree.parseError('unexpected-end-tag', {name: name});\r\n\t\t} else {\r\n\t\t\ttree.generateImpliedEndTags();\r\n\t\t\tif (tree.currentStackItem().localName != name) {\r\n\t\t\t\ttree.parseError('end-tag-too-early', {name: name});\r\n\t\t\t}\r\n\t\t\ttree.openElements.popUntilPopped(name);\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inBody.endTagForm = function(name)  {\r\n\t\tvar node = tree.form;\r\n\t\ttree.form = null;\r\n\t\tif (!node || !tree.openElements.inScope(name)) {\r\n\t\t\ttree.parseError('unexpected-end-tag', {name: name});\r\n\t\t} else {\r\n\t\t\ttree.generateImpliedEndTags();\r\n\t\t\tif (tree.currentStackItem() != node) {\r\n\t\t\t\ttree.parseError('end-tag-too-early-ignored', {name: 'form'});\r\n\t\t\t}\r\n\t\t\ttree.openElements.remove(node);\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inBody.endTagListItem = function(name) {\r\n\t\tif (!tree.openElements.inListItemScope(name)) {\r\n\t\t\ttree.parseError('unexpected-end-tag', {name: name});\r\n\t\t} else {\r\n\t\t\ttree.generateImpliedEndTags(name);\r\n\t\t\tif (tree.currentStackItem().localName != name)\r\n\t\t\t\ttree.parseError('end-tag-too-early', {name: name});\r\n\t\t\ttree.openElements.popUntilPopped(name);\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inBody.endTagHeading = function(name) {\r\n\t\tif (!tree.openElements.hasNumberedHeaderElementInScope()) {\r\n\t\t\ttree.parseError('unexpected-end-tag', {name: name});\r\n\t\t\treturn;\r\n\t\t}\r\n\t\ttree.generateImpliedEndTags();\r\n\t\tif (tree.currentStackItem().localName != name)\r\n\t\t\ttree.parseError('end-tag-too-early', {name: name});\r\n\r\n\t\ttree.openElements.remove_openElements_until(function(e) {\r\n\t\t\treturn e.isNumberedHeader();\r\n\t\t});\r\n\t};\r\n\r\n\tmodes.inBody.endTagFormatting = function(name, attributes) {\r\n\t\tif (!tree.adoptionAgencyEndTag(name))\r\n\t\t\tthis.endTagOther(name, attributes);\r\n\t};\r\n\r\n\tmodes.inCaption = Object.create(modes.base);\r\n\r\n\tmodes.inCaption.start_tag_handlers = {\r\n\t\thtml: 'startTagHtml',\r\n\t\tcaption: 'startTagTableElement',\r\n\t\tcol: 'startTagTableElement',\r\n\t\tcolgroup: 'startTagTableElement',\r\n\t\ttbody: 'startTagTableElement',\r\n\t\ttd: 'startTagTableElement',\r\n\t\ttfoot: 'startTagTableElement',\r\n\t\tthead: 'startTagTableElement',\r\n\t\ttr: 'startTagTableElement',\r\n\t\t'-default': 'startTagOther'\r\n\t};\r\n\r\n\tmodes.inCaption.end_tag_handlers = {\r\n\t\tcaption: 'endTagCaption',\r\n\t\ttable: 'endTagTable',\r\n\t\tbody: 'endTagIgnore',\r\n\t\tcol: 'endTagIgnore',\r\n\t\tcolgroup: 'endTagIgnore',\r\n\t\thtml: 'endTagIgnore',\r\n\t\ttbody: 'endTagIgnore',\r\n\t\ttd: 'endTagIgnore',\r\n\t\ttfood: 'endTagIgnore',\r\n\t\tthead: 'endTagIgnore',\r\n\t\ttr: 'endTagIgnore',\r\n\t\t'-default': 'endTagOther'\r\n\t};\r\n\r\n\tmodes.inCaption.processCharacters = function(data) {\r\n\t\tmodes.inBody.processCharacters(data);\r\n\t};\r\n\r\n\tmodes.inCaption.startTagTableElement = function(name, attributes) {\r\n\t\ttree.parseError('unexpected-end-tag', {name: name});\r\n\t\tvar ignoreEndTag = !tree.openElements.inTableScope('caption');\r\n\t\ttree.insertionMode.processEndTag('caption');\r\n\t\tif (!ignoreEndTag) tree.insertionMode.processStartTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.inCaption.startTagOther = function(name, attributes, selfClosing) {\r\n\t\tmodes.inBody.processStartTag(name, attributes, selfClosing);\r\n\t};\r\n\r\n\tmodes.inCaption.endTagCaption = function(name) {\r\n\t\tif (!tree.openElements.inTableScope('caption')) {\r\r\n\t\t\tassert.ok(tree.context);\r\n\t\t\ttree.parseError('unexpected-end-tag', {name: name});\r\n\t\t} else {\r\r\n\t\t\ttree.generateImpliedEndTags();\r\n\t\t\tif (tree.currentStackItem().localName != 'caption') {\r\r\n\t\t\t\ttree.parseError('expected-one-end-tag-but-got-another', {\r\n\t\t\t\t\tgotName: \"caption\",\r\n\t\t\t\t\texpectedName: tree.currentStackItem().localName\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t\ttree.openElements.popUntilPopped('caption');\r\n\t\t\ttree.clearActiveFormattingElements();\r\n\t\t\ttree.setInsertionMode('inTable');\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inCaption.endTagTable = function(name) {\r\n\t\ttree.parseError(\"unexpected-end-table-in-caption\");\r\n\t\tvar ignoreEndTag = !tree.openElements.inTableScope('caption');\r\n\t\ttree.insertionMode.processEndTag('caption');\r\n\t\tif (!ignoreEndTag) tree.insertionMode.processEndTag(name);\r\n\t};\r\n\r\n\tmodes.inCaption.endTagIgnore = function(name) {\r\n\t\ttree.parseError('unexpected-end-tag', {name: name});\r\n\t};\r\n\r\n\tmodes.inCaption.endTagOther = function(name) {\r\n\t\tmodes.inBody.processEndTag(name);\r\n\t};\r\n\r\n\tmodes.inCell = Object.create(modes.base);\r\n\r\n\tmodes.inCell.start_tag_handlers = {\r\n\t\thtml: 'startTagHtml',\r\n\t\tcaption: 'startTagTableOther',\r\n\t\tcol: 'startTagTableOther',\r\n\t\tcolgroup: 'startTagTableOther',\r\n\t\ttbody: 'startTagTableOther',\r\n\t\ttd: 'startTagTableOther',\r\n\t\ttfoot: 'startTagTableOther',\r\n\t\tth: 'startTagTableOther',\r\n\t\tthead: 'startTagTableOther',\r\n\t\ttr: 'startTagTableOther',\r\n\t\t'-default': 'startTagOther'\r\n\t};\r\n\r\n\tmodes.inCell.end_tag_handlers = {\r\n\t\ttd: 'endTagTableCell',\r\n\t\tth: 'endTagTableCell',\r\n\t\tbody: 'endTagIgnore',\r\n\t\tcaption: 'endTagIgnore',\r\n\t\tcol: 'endTagIgnore',\r\n\t\tcolgroup: 'endTagIgnore',\r\n\t\thtml: 'endTagIgnore',\r\n\t\ttable: 'endTagImply',\r\n\t\ttbody: 'endTagImply',\r\n\t\ttfoot: 'endTagImply',\r\n\t\tthead: 'endTagImply',\r\n\t\ttr: 'endTagImply',\r\n\t\t'-default': 'endTagOther'\r\n\t};\r\n\r\n\tmodes.inCell.processCharacters = function(data) {\r\n\t\tmodes.inBody.processCharacters(data);\r\n\t};\r\n\r\n\tmodes.inCell.startTagTableOther = function(name, attributes, selfClosing) {\r\n\t\tif (tree.openElements.inTableScope('td') || tree.openElements.inTableScope('th')) {\r\n\t\t\tthis.closeCell();\r\n\t\t\ttree.insertionMode.processStartTag(name, attributes, selfClosing);\r\n\t\t} else {\r\r\n\t\t\ttree.parseError('unexpected-start-tag', {name: name});\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inCell.startTagOther = function(name, attributes, selfClosing) {\r\n\t\tmodes.inBody.processStartTag(name, attributes, selfClosing);\r\n\t};\r\n\r\n\tmodes.inCell.endTagTableCell = function(name) {\r\n\t\tif (tree.openElements.inTableScope(name)) {\r\n\t\t\ttree.generateImpliedEndTags(name);\r\n\t\t\tif (tree.currentStackItem().localName != name.toLowerCase()) {\r\n\t\t\t\ttree.parseError('unexpected-cell-end-tag', {name: name});\r\n\t\t\t\ttree.openElements.popUntilPopped(name);\r\n\t\t\t} else {\r\n\t\t\t\ttree.popElement();\r\n\t\t\t}\r\n\t\t\ttree.clearActiveFormattingElements();\r\n\t\t\ttree.setInsertionMode('inRow');\r\n\t\t} else {\r\n\t\t\ttree.parseError('unexpected-end-tag', {name: name});\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inCell.endTagIgnore = function(name) {\r\n\t\ttree.parseError('unexpected-end-tag', {name: name});\r\n\t};\r\n\r\n\tmodes.inCell.endTagImply = function(name) {\r\n\t\tif (tree.openElements.inTableScope(name)) {\r\n\t\t\tthis.closeCell();\r\n\t\t\ttree.insertionMode.processEndTag(name);\r\n\t\t} else {\r\r\n\t\t\ttree.parseError('unexpected-end-tag', {name: name});\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inCell.endTagOther = function(name) {\r\n\t\tmodes.inBody.processEndTag(name);\r\n\t};\r\n\r\n\tmodes.inCell.closeCell = function() {\r\n\t\tif (tree.openElements.inTableScope('td')) {\r\n\t\t\tthis.endTagTableCell('td');\r\n\t\t} else if (tree.openElements.inTableScope('th')) {\r\n\t\t\tthis.endTagTableCell('th');\r\n\t\t}\r\n\t};\r\n\r\n\r\n\tmodes.inColumnGroup = Object.create(modes.base);\r\n\r\n\tmodes.inColumnGroup.start_tag_handlers = {\r\n\t\thtml: 'startTagHtml',\r\n\t\tcol: 'startTagCol',\r\n\t\t'-default': 'startTagOther'\r\n\t};\r\n\r\n\tmodes.inColumnGroup.end_tag_handlers = {\r\n\t\tcolgroup: 'endTagColgroup',\r\n\t\tcol: 'endTagCol',\r\n\t\t'-default': 'endTagOther'\r\n\t};\r\n\r\n\tmodes.inColumnGroup.ignoreEndTagColgroup = function() {\r\n\t\treturn tree.currentStackItem().localName == 'html';\r\n\t};\r\n\r\n\tmodes.inColumnGroup.processCharacters = function(buffer) {\r\n\t\tvar leadingWhitespace = buffer.takeLeadingWhitespace();\r\n\t\tif (leadingWhitespace)\r\n\t\t\ttree.insertText(leadingWhitespace);\r\n\t\tif (!buffer.length)\r\n\t\t\treturn;\r\n\t\tvar ignoreEndTag = this.ignoreEndTagColgroup();\r\n\t\tthis.endTagColgroup('colgroup');\r\n\t\tif (!ignoreEndTag) tree.insertionMode.processCharacters(buffer);\r\n\t};\r\n\r\n\tmodes.inColumnGroup.startTagCol = function(name, attributes) {\r\n\t\ttree.insertSelfClosingElement(name, attributes);\r\n\t};\r\n\r\n\tmodes.inColumnGroup.startTagOther = function(name, attributes, selfClosing) {\r\n\t\tvar ignoreEndTag = this.ignoreEndTagColgroup();\r\n\t\tthis.endTagColgroup('colgroup');\r\n\t\tif (!ignoreEndTag) tree.insertionMode.processStartTag(name, attributes, selfClosing);\r\n\t};\r\n\r\n\tmodes.inColumnGroup.endTagColgroup = function(name) {\r\n\t\tif (this.ignoreEndTagColgroup()) {\r\r\n\t\t\tassert.ok(tree.context);\r\n\t\t\ttree.parseError('unexpected-end-tag', {name: name});\r\n\t\t} else {\r\n\t\t\ttree.popElement();\r\n\t\t\ttree.setInsertionMode('inTable');\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inColumnGroup.endTagCol = function(name) {\r\n\t\ttree.parseError(\"no-end-tag\", {name: 'col'});\r\n\t};\r\n\r\n\tmodes.inColumnGroup.endTagOther = function(name) {\r\n\t\tvar ignoreEndTag = this.ignoreEndTagColgroup();\r\n\t\tthis.endTagColgroup('colgroup');\r\n\t\tif (!ignoreEndTag) tree.insertionMode.processEndTag(name) ;\r\n\t};\r\n\r\n\tmodes.inForeignContent = Object.create(modes.base);\r\n\r\n\tmodes.inForeignContent.processStartTag = function(name, attributes, selfClosing) {\r\n\t\tif (['b', 'big', 'blockquote', 'body', 'br', 'center', 'code', 'dd', 'div', 'dl', 'dt', 'em', 'embed', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'hr', 'i', 'img', 'li', 'listing', 'menu', 'meta', 'nobr', 'ol', 'p', 'pre', 'ruby', 's', 'small', 'span', 'strong', 'strike', 'sub', 'sup', 'table', 'tt', 'u', 'ul', 'var'].indexOf(name) != -1\r\n\t\t\t\t|| (name == 'font' && attributes.some(function(attr){ return ['color', 'face', 'size'].indexOf(attr.nodeName) >= 0 }))) {\r\n\t\t\ttree.parseError('unexpected-html-element-in-foreign-content', {name: name});\r\n\t\t\twhile (tree.currentStackItem().isForeign()\r\n\t\t\t\t&& !tree.currentStackItem().isHtmlIntegrationPoint()\r\n\t\t\t\t&& !tree.currentStackItem().isMathMLTextIntegrationPoint()) {\r\n\t\t\t\ttree.openElements.pop();\r\n\t\t\t}\r\n\t\t\ttree.insertionMode.processStartTag(name, attributes, selfClosing);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (tree.currentStackItem().namespaceURI == \"http://www.w3.org/1998/Math/MathML\") {\r\n\t\t\tattributes = tree.adjustMathMLAttributes(attributes);\r\n\t\t}\r\n\t\tif (tree.currentStackItem().namespaceURI == \"http://www.w3.org/2000/svg\") {\r\n\t\t\tname = tree.adjustSVGTagNameCase(name);\r\n\t\t\tattributes = tree.adjustSVGAttributes(attributes);\r\n\t\t}\r\n\t\tattributes = tree.adjustForeignAttributes(attributes);\r\n\t\ttree.insertForeignElement(name, attributes, tree.currentStackItem().namespaceURI, selfClosing);\r\n\t};\r\n\r\n\tmodes.inForeignContent.processEndTag = function(name) {\r\n\t\tvar node = tree.currentStackItem();\r\n\t\tvar index = tree.openElements.length - 1;\r\n\t\tif (node.localName.toLowerCase() != name)\r\n\t\t\ttree.parseError(\"unexpected-end-tag\", {name: name});\r\n\r\n\t\twhile (true) {\r\n\t\t\tif (index === 0)\r\n\t\t\t\tbreak;\r\n\t\t\tif (node.localName.toLowerCase() == name) {\r\n\t\t\t\twhile (tree.openElements.pop() != node);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tindex -= 1;\r\n\t\t\tnode = tree.openElements.item(index);\r\n\t\t\tif (node.isForeign()) {\r\n\t\t\t\tcontinue;\r\n\t\t\t} else {\r\n\t\t\t\ttree.insertionMode.processEndTag(name);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inForeignContent.processCharacters = function(buffer) {\r\n\t\tvar characters = buffer.takeRemaining();\r\n\t\tcharacters = characters.replace(/\\u0000/g, function(match, index){\r\r\n\t\t\ttree.parseError('invalid-codepoint');\r\n\t\t\treturn '\\uFFFD';\r\n\t\t});\r\n\t\tif (tree.framesetOk && !isAllWhitespaceOrReplacementCharacters(characters))\r\n\t\t\ttree.framesetOk = false;\r\n\t\ttree.insertText(characters);\r\n\t};\r\n\r\n\tmodes.inHeadNoscript = Object.create(modes.base);\r\n\r\n\tmodes.inHeadNoscript.start_tag_handlers = {\r\n\t\thtml: 'startTagHtml',\r\n\t\tbasefont: 'startTagBasefontBgsoundLinkMetaNoframesStyle',\r\n\t\tbgsound: 'startTagBasefontBgsoundLinkMetaNoframesStyle',\r\n\t\tlink: 'startTagBasefontBgsoundLinkMetaNoframesStyle',\r\n\t\tmeta: 'startTagBasefontBgsoundLinkMetaNoframesStyle',\r\n\t\tnoframes: 'startTagBasefontBgsoundLinkMetaNoframesStyle',\r\n\t\tstyle: 'startTagBasefontBgsoundLinkMetaNoframesStyle',\r\n\t\thead: 'startTagHeadNoscript',\r\n\t\tnoscript: 'startTagHeadNoscript',\r\n\t\t\"-default\": 'startTagOther'\r\n\t};\r\n\r\n\tmodes.inHeadNoscript.end_tag_handlers = {\r\n\t\tnoscript: 'endTagNoscript',\r\n\t\tbr: 'endTagBr',\r\n\t\t'-default': 'endTagOther'\r\n\t};\r\n\r\n\tmodes.inHeadNoscript.processCharacters = function(buffer) {\r\n\t\tvar leadingWhitespace = buffer.takeLeadingWhitespace();\r\n\t\tif (leadingWhitespace)\r\n\t\t\ttree.insertText(leadingWhitespace);\r\n\t\tif (!buffer.length)\r\n\t\t\treturn;\r\r\n\t\ttree.parseError(\"unexpected-char-in-frameset\");\r\n\t\tthis.anythingElse();\r\n\t\ttree.insertionMode.processCharacters(buffer);\r\n\t};\r\n\r\n\tmodes.inHeadNoscript.processComment = function(data) {\r\n\t\tmodes.inHead.processComment(data);\r\n\t};\r\n\r\n\tmodes.inHeadNoscript.startTagBasefontBgsoundLinkMetaNoframesStyle = function(name, attributes) {\r\n\t\tmodes.inHead.processStartTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.inHeadNoscript.startTagHeadNoscript = function(name, attributes) {\r\r\n\t\ttree.parseError(\"unexpected-start-tag-in-frameset\", {name: name});\r\n\t};\r\n\r\n\tmodes.inHeadNoscript.startTagOther = function(name, attributes) {\r\r\n\t\ttree.parseError(\"unexpected-start-tag-in-frameset\", {name: name});\r\n\t\tthis.anythingElse();\r\n\t\ttree.insertionMode.processStartTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.inHeadNoscript.endTagBr = function(name, attributes) {\r\r\n\t\ttree.parseError(\"unexpected-end-tag-in-frameset\", {name: name});\r\n\t\tthis.anythingElse();\r\n\t\ttree.insertionMode.processEndTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.inHeadNoscript.endTagNoscript = function(name, attributes) {\r\n\t\ttree.popElement();\r\n\t\ttree.setInsertionMode('inHead');\r\n\t};\r\n\r\n\tmodes.inHeadNoscript.endTagOther = function(name, attributes) {\r\r\n\t\ttree.parseError(\"unexpected-end-tag-in-frameset\", {name: name});\r\n\t};\r\n\r\n\tmodes.inHeadNoscript.anythingElse = function() {\r\n\t\ttree.popElement();\r\n\t\ttree.setInsertionMode('inHead');\r\n\t};\r\n\r\n\r\n\tmodes.inFrameset = Object.create(modes.base);\r\n\r\n\tmodes.inFrameset.start_tag_handlers = {\r\n\t\thtml: 'startTagHtml',\r\n\t\tframeset: 'startTagFrameset',\r\n\t\tframe: 'startTagFrame',\r\n\t\tnoframes: 'startTagNoframes',\r\n\t\t\"-default\": 'startTagOther'\r\n\t};\r\n\r\n\tmodes.inFrameset.end_tag_handlers = {\r\n\t\tframeset: 'endTagFrameset',\r\n\t\tnoframes: 'endTagNoframes',\r\n\t\t'-default': 'endTagOther'\r\n\t};\r\n\r\n\tmodes.inFrameset.processCharacters = function(data) {\r\n\t\ttree.parseError(\"unexpected-char-in-frameset\");\r\n\t};\r\n\r\n\tmodes.inFrameset.startTagFrameset = function(name, attributes) {\r\n\t\ttree.insertElement(name, attributes);\r\n\t};\r\n\r\n\tmodes.inFrameset.startTagFrame = function(name, attributes) {\r\n\t\ttree.insertSelfClosingElement(name, attributes);\r\n\t};\r\n\r\n\tmodes.inFrameset.startTagNoframes = function(name, attributes) {\r\n\t\tmodes.inBody.processStartTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.inFrameset.startTagOther = function(name, attributes) {\r\n\t\ttree.parseError(\"unexpected-start-tag-in-frameset\", {name: name});\r\n\t};\r\n\r\n\tmodes.inFrameset.endTagFrameset = function(name, attributes) {\r\n\t\tif (tree.currentStackItem().localName == 'html') {\r\r\n\t\t\ttree.parseError(\"unexpected-frameset-in-frameset-innerhtml\");\r\n\t\t} else {\r\n\t\t\ttree.popElement();\r\n\t\t}\r\n\r\n\t\tif (!tree.context && tree.currentStackItem().localName != 'frameset') {\r\r\n\t\t\ttree.setInsertionMode('afterFrameset');\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inFrameset.endTagNoframes = function(name) {\r\n\t\tmodes.inBody.processEndTag(name);\r\n\t};\r\n\r\n\tmodes.inFrameset.endTagOther = function(name) {\r\n\t\ttree.parseError(\"unexpected-end-tag-in-frameset\", {name: name});\r\n\t};\r\n\r\n\tmodes.inTable = Object.create(modes.base);\r\n\r\n\tmodes.inTable.start_tag_handlers = {\r\n\t\thtml: 'startTagHtml',\r\n\t\tcaption: 'startTagCaption',\r\n\t\tcolgroup: 'startTagColgroup',\r\n\t\tcol: 'startTagCol',\r\n\t\ttable: 'startTagTable',\r\n\t\ttbody: 'startTagRowGroup',\r\n\t\ttfoot: 'startTagRowGroup',\r\n\t\tthead: 'startTagRowGroup',\r\n\t\ttd: 'startTagImplyTbody',\r\n\t\tth: 'startTagImplyTbody',\r\n\t\ttr: 'startTagImplyTbody',\r\n\t\tstyle: 'startTagStyleScript',\r\n\t\tscript: 'startTagStyleScript',\r\n\t\tinput: 'startTagInput',\r\n\t\tform: 'startTagForm',\r\n\t\t'-default': 'startTagOther'\r\n\t};\r\n\r\n\tmodes.inTable.end_tag_handlers = {\r\n\t\ttable: 'endTagTable',\r\n\t\tbody: 'endTagIgnore',\r\n\t\tcaption: 'endTagIgnore',\r\n\t\tcol: 'endTagIgnore',\r\n\t\tcolgroup: 'endTagIgnore',\r\n\t\thtml: 'endTagIgnore',\r\n\t\ttbody: 'endTagIgnore',\r\n\t\ttd: 'endTagIgnore',\r\n\t\ttfoot: 'endTagIgnore',\r\n\t\tth: 'endTagIgnore',\r\n\t\tthead: 'endTagIgnore',\r\n\t\ttr: 'endTagIgnore',\r\n\t\t'-default': 'endTagOther'\r\n\t};\r\n\r\n\tmodes.inTable.processCharacters =  function(data) {\r\n\t\tif (tree.currentStackItem().isFosterParenting()) {\r\n\t\t\tvar originalInsertionMode = tree.insertionModeName;\r\n\t\t\ttree.setInsertionMode('inTableText');\r\n\t\t\ttree.originalInsertionMode = originalInsertionMode;\r\n\t\t\ttree.insertionMode.processCharacters(data);\r\n\t\t} else {\r\n\t\t\ttree.redirectAttachToFosterParent = true;\r\n\t\t\tmodes.inBody.processCharacters(data);\r\n\t\t\ttree.redirectAttachToFosterParent = false;\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inTable.startTagCaption = function(name, attributes) {\r\n\t\ttree.openElements.popUntilTableScopeMarker();\r\n\t\ttree.activeFormattingElements.push(Marker);\r\n\t\ttree.insertElement(name, attributes);\r\n\t\ttree.setInsertionMode('inCaption');\r\n\t};\r\n\r\n\tmodes.inTable.startTagColgroup = function(name, attributes) {\r\n\t\ttree.openElements.popUntilTableScopeMarker();\r\n\t\ttree.insertElement(name, attributes);\r\n\t\ttree.setInsertionMode('inColumnGroup');\r\n\t};\r\n\r\n\tmodes.inTable.startTagCol = function(name, attributes) {\r\n\t\tthis.startTagColgroup('colgroup', []);\r\n\t\ttree.insertionMode.processStartTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.inTable.startTagRowGroup = function(name, attributes) {\r\n\t\ttree.openElements.popUntilTableScopeMarker();\r\n\t\ttree.insertElement(name, attributes);\r\n\t\ttree.setInsertionMode('inTableBody');\r\n\t};\r\n\r\n\tmodes.inTable.startTagImplyTbody = function(name, attributes) {\r\n\t\tthis.startTagRowGroup('tbody', []);\r\n\t\ttree.insertionMode.processStartTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.inTable.startTagTable = function(name, attributes) {\r\n\t\ttree.parseError(\"unexpected-start-tag-implies-end-tag\",\r\n\t\t\t\t{startName: \"table\", endName: \"table\"});\r\n\t\ttree.insertionMode.processEndTag('table');\r\n\t\tif (!tree.context) tree.insertionMode.processStartTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.inTable.startTagStyleScript = function(name, attributes) {\r\n\t\tmodes.inHead.processStartTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.inTable.startTagInput = function(name, attributes) {\r\n\t\tfor (var key in attributes) {\r\n\t\t\tif (attributes[key].nodeName.toLowerCase() == 'type') {\r\n\t\t\t\tif (attributes[key].nodeValue.toLowerCase() == 'hidden') {\r\n\t\t\t\t\ttree.parseError(\"unexpected-hidden-input-in-table\");\r\n\t\t\t\t\ttree.insertElement(name, attributes);\r\r\n\t\t\t\t\ttree.openElements.pop();\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\tthis.startTagOther(name, attributes);\r\n\t};\r\n\r\n\tmodes.inTable.startTagForm = function(name, attributes) {\r\n\t\ttree.parseError(\"unexpected-form-in-table\");\r\n\t\tif (!tree.form) {\r\n\t\t\ttree.insertElement(name, attributes);\r\n\t\t\ttree.form = tree.currentStackItem();\r\n\t\t\ttree.openElements.pop();\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inTable.startTagOther = function(name, attributes, selfClosing) {\r\n\t\ttree.parseError(\"unexpected-start-tag-implies-table-voodoo\", {name: name});\r\n\t\ttree.redirectAttachToFosterParent = true;\r\n\t\tmodes.inBody.processStartTag(name, attributes, selfClosing);\r\n\t\ttree.redirectAttachToFosterParent = false;\r\n\t};\r\n\r\n\tmodes.inTable.endTagTable = function(name) {\r\n\t\tif (tree.openElements.inTableScope(name)) {\r\n\t\t\ttree.generateImpliedEndTags();\r\n\t\t\tif (tree.currentStackItem().localName != name) {\r\n\t\t\t\ttree.parseError(\"end-tag-too-early-named\", {gotName: 'table', expectedName: tree.currentStackItem().localName});\r\n\t\t\t}\r\n\r\n\t\t\ttree.openElements.popUntilPopped('table');\r\n\t\t\ttree.resetInsertionMode();\r\n\t\t} else {\r\n\t\t\tassert.ok(tree.context);\r\n\t\t\ttree.parseError('unexpected-end-tag', {name: name});\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inTable.endTagIgnore = function(name) {\r\n\t\ttree.parseError(\"unexpected-end-tag\", {name: name});\r\n\t};\r\n\r\n\tmodes.inTable.endTagOther = function(name) {\r\n\t\ttree.parseError(\"unexpected-end-tag-implies-table-voodoo\", {name: name});\r\r\n\t\ttree.redirectAttachToFosterParent = true;\r\r\n\t\tmodes.inBody.processEndTag(name);\r\n\t\ttree.redirectAttachToFosterParent = false;\r\n\t};\r\n\r\n\tmodes.inTableText = Object.create(modes.base);\r\n\r\n\tmodes.inTableText.flushCharacters = function() {\r\n\t\tvar characters = tree.pendingTableCharacters.join('');\r\n\t\tif (!isAllWhitespace(characters)) {\r\n\t\t\ttree.redirectAttachToFosterParent = true;\r\n\t\t\ttree.reconstructActiveFormattingElements();\r\n\t\t\ttree.insertText(characters);\r\n\t\t\ttree.framesetOk = false;\r\n\t\t\ttree.redirectAttachToFosterParent = false;\r\n\t\t} else {\r\n\t\t\ttree.insertText(characters);\r\n\t\t}\r\n\t\ttree.pendingTableCharacters = [];\r\n\t};\r\n\r\n\tmodes.inTableText.processComment = function(data) {\r\n\t\tthis.flushCharacters();\r\n\t\ttree.setInsertionMode(tree.originalInsertionMode);\r\n\t\ttree.insertionMode.processComment(data);\r\n\t};\r\n\r\n\tmodes.inTableText.processEOF = function(data) {\r\n\t\tthis.flushCharacters();\r\n\t\ttree.setInsertionMode(tree.originalInsertionMode);\r\n\t\ttree.insertionMode.processEOF();\r\n\t};\r\n\r\n\tmodes.inTableText.processCharacters = function(buffer) {\r\n\t\tvar characters = buffer.takeRemaining();\r\n\t\tcharacters = characters.replace(/\\u0000/g, function(match, index){\r\r\n\t\t\ttree.parseError(\"invalid-codepoint\");\r\n\t\t\treturn '';\r\n\t\t});\r\n\t\tif (!characters)\r\n\t\t\treturn;\r\n\t\ttree.pendingTableCharacters.push(characters);\r\n\t};\r\n\r\n\tmodes.inTableText.processStartTag = function(name, attributes, selfClosing) {\r\n\t\tthis.flushCharacters();\r\n\t\ttree.setInsertionMode(tree.originalInsertionMode);\r\n\t\ttree.insertionMode.processStartTag(name, attributes, selfClosing);\r\n\t};\r\n\r\n\tmodes.inTableText.processEndTag = function(name, attributes) {\r\n\t\tthis.flushCharacters();\r\n\t\ttree.setInsertionMode(tree.originalInsertionMode);\r\n\t\ttree.insertionMode.processEndTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.inTableBody = Object.create(modes.base);\r\n\r\n\tmodes.inTableBody.start_tag_handlers = {\r\n\t\thtml: 'startTagHtml',\r\n\t\ttr: 'startTagTr',\r\n\t\ttd: 'startTagTableCell',\r\n\t\tth: 'startTagTableCell',\r\n\t\tcaption: 'startTagTableOther',\r\n\t\tcol: 'startTagTableOther',\r\n\t\tcolgroup: 'startTagTableOther',\r\n\t\ttbody: 'startTagTableOther',\r\n\t\ttfoot: 'startTagTableOther',\r\n\t\tthead: 'startTagTableOther',\r\n\t\t'-default': 'startTagOther'\r\n\t};\r\n\r\n\tmodes.inTableBody.end_tag_handlers = {\r\n\t\ttable: 'endTagTable',\r\n\t\ttbody: 'endTagTableRowGroup',\r\n\t\ttfoot: 'endTagTableRowGroup',\r\n\t\tthead: 'endTagTableRowGroup',\r\n\t\tbody: 'endTagIgnore',\r\n\t\tcaption: 'endTagIgnore',\r\n\t\tcol: 'endTagIgnore',\r\n\t\tcolgroup: 'endTagIgnore',\r\n\t\thtml: 'endTagIgnore',\r\n\t\ttd: 'endTagIgnore',\r\n\t\tth: 'endTagIgnore',\r\n\t\ttr: 'endTagIgnore',\r\n\t\t'-default': 'endTagOther'\r\n\t};\r\n\r\n\tmodes.inTableBody.processCharacters = function(data) {\r\n\t\tmodes.inTable.processCharacters(data);\r\n\t};\r\n\r\n\tmodes.inTableBody.startTagTr = function(name, attributes) {\r\n\t\ttree.openElements.popUntilTableBodyScopeMarker();\r\n\t\ttree.insertElement(name, attributes);\r\n\t\ttree.setInsertionMode('inRow');\r\n\t};\r\n\r\n\tmodes.inTableBody.startTagTableCell = function(name, attributes) {\r\n\t\ttree.parseError(\"unexpected-cell-in-table-body\", {name: name});\r\n\t\tthis.startTagTr('tr', []);\r\n\t\ttree.insertionMode.processStartTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.inTableBody.startTagTableOther = function(name, attributes) {\r\r\n\t\tif (tree.openElements.inTableScope('tbody') ||  tree.openElements.inTableScope('thead') || tree.openElements.inTableScope('tfoot')) {\r\n\t\t\ttree.openElements.popUntilTableBodyScopeMarker();\r\n\t\t\tthis.endTagTableRowGroup(tree.currentStackItem().localName);\r\n\t\t\ttree.insertionMode.processStartTag(name, attributes);\r\n\t\t} else {\r\r\n\t\t\ttree.parseError('unexpected-start-tag', {name: name});\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inTableBody.startTagOther = function(name, attributes) {\r\n\t\tmodes.inTable.processStartTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.inTableBody.endTagTableRowGroup = function(name) {\r\n\t\tif (tree.openElements.inTableScope(name)) {\r\n\t\t\ttree.openElements.popUntilTableBodyScopeMarker();\r\n\t\t\ttree.popElement();\r\n\t\t\ttree.setInsertionMode('inTable');\r\n\t\t} else {\r\n\t\t\ttree.parseError('unexpected-end-tag-in-table-body', {name: name});\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inTableBody.endTagTable = function(name) {\r\n\t\tif (tree.openElements.inTableScope('tbody') ||  tree.openElements.inTableScope('thead') || tree.openElements.inTableScope('tfoot')) {\r\n\t\t\ttree.openElements.popUntilTableBodyScopeMarker();\r\n\t\t\tthis.endTagTableRowGroup(tree.currentStackItem().localName);\r\n\t\t\ttree.insertionMode.processEndTag(name);\r\n\t\t} else {\r\r\n\t\t\ttree.parseError('unexpected-end-tag', {name: name});\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inTableBody.endTagIgnore = function(name) {\r\n\t\ttree.parseError(\"unexpected-end-tag-in-table-body\", {name: name});\r\n\t};\r\n\r\n\tmodes.inTableBody.endTagOther = function(name) {\r\n\t\tmodes.inTable.processEndTag(name);\r\n\t};\r\n\r\n\tmodes.inSelect = Object.create(modes.base);\r\n\r\n\tmodes.inSelect.start_tag_handlers = {\r\n\t\thtml: 'startTagHtml',\r\n\t\toption: 'startTagOption',\r\n\t\toptgroup: 'startTagOptgroup',\r\n\t\tselect: 'startTagSelect',\r\n\t\tinput: 'startTagInput',\r\n\t\tkeygen: 'startTagInput',\r\n\t\ttextarea: 'startTagInput',\r\n\t\tscript: 'startTagScript',\r\n\t\t'-default': 'startTagOther'\r\n\t};\r\n\r\n\tmodes.inSelect.end_tag_handlers = {\r\n\t\toption: 'endTagOption',\r\n\t\toptgroup: 'endTagOptgroup',\r\n\t\tselect: 'endTagSelect',\r\n\t\tcaption: 'endTagTableElements',\r\n\t\ttable: 'endTagTableElements',\r\n\t\ttbody: 'endTagTableElements',\r\n\t\ttfoot: 'endTagTableElements',\r\n\t\tthead: 'endTagTableElements',\r\n\t\ttr: 'endTagTableElements',\r\n\t\ttd: 'endTagTableElements',\r\n\t\tth: 'endTagTableElements',\r\n\t\t'-default': 'endTagOther'\r\n\t};\r\n\r\n\tmodes.inSelect.processCharacters = function(buffer) {\r\n\t\tvar data = buffer.takeRemaining();\r\n\t\tdata = data.replace(/\\u0000/g, function(match, index){\r\r\n\t\t\ttree.parseError(\"invalid-codepoint\");\r\n\t\t\treturn '';\r\n\t\t});\r\n\t\tif (!data)\r\n\t\t\treturn;\r\n\t\ttree.insertText(data);\r\n\t};\r\n\r\n\tmodes.inSelect.startTagOption = function(name, attributes) {\r\r\n\t\tif (tree.currentStackItem().localName == 'option')\r\n\t\t\ttree.popElement();\r\n\t\ttree.insertElement(name, attributes);\r\n\t};\r\n\r\n\tmodes.inSelect.startTagOptgroup = function(name, attributes) {\r\n\t\tif (tree.currentStackItem().localName == 'option')\r\n\t\t\ttree.popElement();\r\n\t\tif (tree.currentStackItem().localName == 'optgroup')\r\n\t\t\ttree.popElement();\r\n\t\ttree.insertElement(name, attributes);\r\n\t};\r\n\r\n\tmodes.inSelect.endTagOption = function(name) {\r\n\t\tif (tree.currentStackItem().localName !== 'option') {\r\n\t\t\ttree.parseError('unexpected-end-tag-in-select', {name: name});\r\n\t\t\treturn;\r\n\t\t}\r\n\t\ttree.popElement();\r\n\t};\r\n\r\n\tmodes.inSelect.endTagOptgroup = function(name) {\r\r\n\t\tif (tree.currentStackItem().localName == 'option' && tree.openElements.item(tree.openElements.length - 2).localName == 'optgroup') {\r\n\t\t\ttree.popElement();\r\n\t\t}\r\r\n\t\tif (tree.currentStackItem().localName == 'optgroup') {\r\n\t\t\ttree.popElement();\r\n\t\t} else {\r\r\n\t\t\ttree.parseError('unexpected-end-tag-in-select', {name: 'optgroup'});\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inSelect.startTagSelect = function(name) {\r\n\t\ttree.parseError(\"unexpected-select-in-select\");\r\n\t\tthis.endTagSelect('select');\r\n\t};\r\n\r\n\tmodes.inSelect.endTagSelect = function(name) {\r\n\t\tif (tree.openElements.inTableScope('select')) {\r\n\t\t\ttree.openElements.popUntilPopped('select');\r\n\t\t\ttree.resetInsertionMode();\r\n\t\t} else {\r\r\n\t\t\ttree.parseError('unexpected-end-tag', {name: name});\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inSelect.startTagInput = function(name, attributes) {\r\n\t\ttree.parseError(\"unexpected-input-in-select\");\r\n\t\tif (tree.openElements.inSelectScope('select')) {\r\n\t\t\tthis.endTagSelect('select');\r\n\t\t\ttree.insertionMode.processStartTag(name, attributes);\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inSelect.startTagScript = function(name, attributes) {\r\n\t\tmodes.inHead.processStartTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.inSelect.endTagTableElements = function(name) {\r\n\t\ttree.parseError('unexpected-end-tag-in-select', {name: name});\r\n\t\tif (tree.openElements.inTableScope(name)) {\r\n\t\t\tthis.endTagSelect('select');\r\n\t\t\ttree.insertionMode.processEndTag(name);\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inSelect.startTagOther = function(name, attributes) {\r\n\t\ttree.parseError(\"unexpected-start-tag-in-select\", {name: name});\r\n\t};\r\n\r\n\tmodes.inSelect.endTagOther = function(name) {\r\n\t\ttree.parseError('unexpected-end-tag-in-select', {name: name});\r\n\t};\r\n\r\n\tmodes.inSelectInTable = Object.create(modes.base);\r\n\r\n\tmodes.inSelectInTable.start_tag_handlers = {\r\n\t\tcaption: 'startTagTable',\r\n\t\ttable: 'startTagTable',\r\n\t\ttbody: 'startTagTable',\r\n\t\ttfoot: 'startTagTable',\r\n\t\tthead: 'startTagTable',\r\n\t\ttr: 'startTagTable',\r\n\t\ttd: 'startTagTable',\r\n\t\tth: 'startTagTable',\r\n\t\t'-default': 'startTagOther'\r\n\t};\r\n\r\n\tmodes.inSelectInTable.end_tag_handlers = {\r\n\t\tcaption: 'endTagTable',\r\n\t\ttable: 'endTagTable',\r\n\t\ttbody: 'endTagTable',\r\n\t\ttfoot: 'endTagTable',\r\n\t\tthead: 'endTagTable',\r\n\t\ttr: 'endTagTable',\r\n\t\ttd: 'endTagTable',\r\n\t\tth: 'endTagTable',\r\n\t\t'-default': 'endTagOther'\r\n\t};\r\n\r\n\tmodes.inSelectInTable.processCharacters = function(data) {\r\n\t\tmodes.inSelect.processCharacters(data);\r\n\t};\r\n\r\n\tmodes.inSelectInTable.startTagTable = function(name, attributes) {\r\n\t\ttree.parseError(\"unexpected-table-element-start-tag-in-select-in-table\", {name: name});\r\n\t\tthis.endTagOther(\"select\");\r\n\t\ttree.insertionMode.processStartTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.inSelectInTable.startTagOther = function(name, attributes, selfClosing) {\r\n\t\tmodes.inSelect.processStartTag(name, attributes, selfClosing);\r\n\t};\r\n\r\n\tmodes.inSelectInTable.endTagTable = function(name) {\r\n\t\ttree.parseError(\"unexpected-table-element-end-tag-in-select-in-table\", {name: name});\r\n\t\tif (tree.openElements.inTableScope(name)) {\r\n\t\t\tthis.endTagOther(\"select\");\r\n\t\t\ttree.insertionMode.processEndTag(name);\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inSelectInTable.endTagOther = function(name) {\r\n\t\tmodes.inSelect.processEndTag(name);\r\n\t};\r\n\r\n\tmodes.inRow = Object.create(modes.base);\r\n\r\n\tmodes.inRow.start_tag_handlers = {\r\n\t\thtml: 'startTagHtml',\r\n\t\ttd: 'startTagTableCell',\r\n\t\tth: 'startTagTableCell',\r\n\t\tcaption: 'startTagTableOther',\r\n\t\tcol: 'startTagTableOther',\r\n\t\tcolgroup: 'startTagTableOther',\r\n\t\ttbody: 'startTagTableOther',\r\n\t\ttfoot: 'startTagTableOther',\r\n\t\tthead: 'startTagTableOther',\r\n\t\ttr: 'startTagTableOther',\r\n\t\t'-default': 'startTagOther'\r\n\t};\r\n\r\n\tmodes.inRow.end_tag_handlers = {\r\n\t\ttr: 'endTagTr',\r\n\t\ttable: 'endTagTable',\r\n\t\ttbody: 'endTagTableRowGroup',\r\n\t\ttfoot: 'endTagTableRowGroup',\r\n\t\tthead: 'endTagTableRowGroup',\r\n\t\tbody: 'endTagIgnore',\r\n\t\tcaption: 'endTagIgnore',\r\n\t\tcol: 'endTagIgnore',\r\n\t\tcolgroup: 'endTagIgnore',\r\n\t\thtml: 'endTagIgnore',\r\n\t\ttd: 'endTagIgnore',\r\n\t\tth: 'endTagIgnore',\r\n\t\t'-default': 'endTagOther'\r\n\t};\r\n\r\n\tmodes.inRow.processCharacters = function(data) {\r\n\t\tmodes.inTable.processCharacters(data);\r\n\t};\r\n\r\n\tmodes.inRow.startTagTableCell = function(name, attributes) {\r\n\t\ttree.openElements.popUntilTableRowScopeMarker();\r\n\t\ttree.insertElement(name, attributes);\r\n\t\ttree.setInsertionMode('inCell');\r\n\t\ttree.activeFormattingElements.push(Marker);\r\n\t};\r\n\r\n\tmodes.inRow.startTagTableOther = function(name, attributes) {\r\n\t\tvar ignoreEndTag = this.ignoreEndTagTr();\r\n\t\tthis.endTagTr('tr');\r\r\n\t\tif (!ignoreEndTag) tree.insertionMode.processStartTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.inRow.startTagOther = function(name, attributes, selfClosing) {\r\n\t\tmodes.inTable.processStartTag(name, attributes, selfClosing);\r\n\t};\r\n\r\n\tmodes.inRow.endTagTr = function(name) {\r\n\t\tif (this.ignoreEndTagTr()) {\r\n\t\t\tassert.ok(tree.context);\r\n\t\t\ttree.parseError('unexpected-end-tag', {name: name});\r\n\t\t} else {\r\n\t\t\ttree.openElements.popUntilTableRowScopeMarker();\r\n\t\t\ttree.popElement();\r\n\t\t\ttree.setInsertionMode('inTableBody');\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inRow.endTagTable = function(name) {\r\n\t\tvar ignoreEndTag = this.ignoreEndTagTr();\r\n\t\tthis.endTagTr('tr');\r\r\r\n\t\tif (!ignoreEndTag) tree.insertionMode.processEndTag(name);\r\n\t};\r\n\r\n\tmodes.inRow.endTagTableRowGroup = function(name) {\r\n\t\tif (tree.openElements.inTableScope(name)) {\r\n\t\t\tthis.endTagTr('tr');\r\n\t\t\ttree.insertionMode.processEndTag(name);\r\n\t\t} else {\r\r\n\t\t\ttree.parseError('unexpected-end-tag', {name: name});\r\n\t\t}\r\n\t};\r\n\r\n\tmodes.inRow.endTagIgnore = function(name) {\r\n\t\ttree.parseError(\"unexpected-end-tag-in-table-row\", {name: name});\r\n\t};\r\n\r\n\tmodes.inRow.endTagOther = function(name) {\r\n\t\tmodes.inTable.processEndTag(name);\r\n\t};\r\n\r\n\tmodes.inRow.ignoreEndTagTr = function() {\r\n\t\treturn !tree.openElements.inTableScope('tr');\r\n\t};\r\n\r\n\tmodes.afterAfterFrameset = Object.create(modes.base);\r\n\r\n\tmodes.afterAfterFrameset.start_tag_handlers = {\r\n\t\thtml: 'startTagHtml',\r\n\t\tnoframes: 'startTagNoFrames',\r\n\t\t'-default': 'startTagOther'\r\n\t};\r\n\r\n\tmodes.afterAfterFrameset.processEOF = function() {};\r\n\r\n\tmodes.afterAfterFrameset.processComment = function(data) {\r\n\t\ttree.insertComment(data, tree.document);\r\n\t};\r\n\r\n\tmodes.afterAfterFrameset.processCharacters = function(buffer) {\r\n\t\tvar characters = buffer.takeRemaining();\r\n\t\tvar whitespace = \"\";\r\n\t\tfor (var i = 0; i < characters.length; i++) {\r\n\t\t\tvar ch = characters[i];\r\n\t\t\tif (isWhitespace(ch))\r\n\t\t\t\twhitespace += ch;\r\n\t\t}\r\n\t\tif (whitespace) {\r\n\t\t\ttree.reconstructActiveFormattingElements();\r\n\t\t\ttree.insertText(whitespace);\r\n\t\t}\r\n\t\tif (whitespace.length < characters.length)\r\n\t\t\ttree.parseError('expected-eof-but-got-char');\r\n\t};\r\n\r\n\tmodes.afterAfterFrameset.startTagNoFrames = function(name, attributes) {\r\n\t\tmodes.inHead.processStartTag(name, attributes);\r\n\t};\r\n\r\n\tmodes.afterAfterFrameset.startTagOther = function(name, attributes, selfClosing) {\r\n\t\ttree.parseError('expected-eof-but-got-start-tag', {name: name});\r\n\t};\r\n\r\n\tmodes.afterAfterFrameset.processEndTag = function(name, attributes) {\r\n\t\ttree.parseError('expected-eof-but-got-end-tag', {name: name});\r\n\t};\r\n\r\n\tmodes.text = Object.create(modes.base);\r\n\r\n\tmodes.text.start_tag_handlers = {\r\n\t\t'-default': 'startTagOther'\r\n\t};\r\n\r\n\tmodes.text.end_tag_handlers = {\r\n\t\tscript: 'endTagScript',\r\n\t\t'-default': 'endTagOther'\r\n\t};\r\n\r\n\tmodes.text.processCharacters = function(buffer) {\r\n\t\tif (tree.shouldSkipLeadingNewline) {\r\n\t\t\ttree.shouldSkipLeadingNewline = false;\r\n\t\t\tbuffer.skipAtMostOneLeadingNewline();\r\n\t\t}\r\n\t\tvar data = buffer.takeRemaining();\r\n\t\tif (!data)\r\n\t\t\treturn;\r\n\t\ttree.insertText(data);\r\n\t};\r\n\r\n\tmodes.text.processEOF = function() {\r\n\t\ttree.parseError(\"expected-named-closing-tag-but-got-eof\",\r\n\t\t\t{name: tree.currentStackItem().localName});\r\n\t\ttree.openElements.pop();\r\n\t\ttree.setInsertionMode(tree.originalInsertionMode);\r\n\t\ttree.insertionMode.processEOF();\r\n\t};\r\n\r\n\tmodes.text.startTagOther = function(name) {\r\n\t\tthrow \"Tried to process start tag \" + name + \" in RCDATA/RAWTEXT mode\";\r\n\t};\r\n\r\n\tmodes.text.endTagScript = function(name) {\r\n\t\tvar node = tree.openElements.pop();\r\n\t\tassert.ok(node.localName == 'script');\r\n\t\ttree.setInsertionMode(tree.originalInsertionMode);\r\n\t};\r\n\r\n\tmodes.text.endTagOther = function(name) {\r\n\t\ttree.openElements.pop();\r\n\t\ttree.setInsertionMode(tree.originalInsertionMode);\r\n\t};\r\n}\r\n\r\nTreeBuilder.prototype.setInsertionMode = function(name) {\r\n\tthis.insertionMode = this.insertionModes[name];\r\n\tthis.insertionModeName = name;\r\n};\r\nTreeBuilder.prototype.adoptionAgencyEndTag = function(name) {\r\n\tvar outerIterationLimit = 8;\r\n\tvar innerIterationLimit = 3;\r\n\tvar formattingElement;\r\n\r\n\tfunction isActiveFormattingElement(el) {\r\n\t\treturn el === formattingElement;\r\n\t}\r\n\r\n\tvar outerLoopCounter = 0;\r\n\r\n\twhile (outerLoopCounter++ < outerIterationLimit) {\r\r\n\t\tformattingElement = this.elementInActiveFormattingElements(name);\r\n\r\n\t\tif (!formattingElement || (this.openElements.contains(formattingElement) && !this.openElements.inScope(formattingElement.localName))) {\r\n\t\t\tthis.parseError('adoption-agency-1.1', {name: name});\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tif (!this.openElements.contains(formattingElement)) {\r\n\t\t\tthis.parseError('adoption-agency-1.2', {name: name});\r\n\t\t\tthis.removeElementFromActiveFormattingElements(formattingElement);\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tif (!this.openElements.inScope(formattingElement.localName)) {\r\n\t\t\tthis.parseError('adoption-agency-4.4', {name: name});\r\n\t\t}\r\n\r\n\t\tif (formattingElement != this.currentStackItem()) {\r\n\t\t\tthis.parseError('adoption-agency-1.3', {name: name});\r\n\t\t}\r\r\r\n\t\tvar furthestBlock = this.openElements.furthestBlockForFormattingElement(formattingElement.node);\r\n\r\n\t\tif (!furthestBlock) {\r\n\t\t\tthis.openElements.remove_openElements_until(isActiveFormattingElement);\r\n\t\t\tthis.removeElementFromActiveFormattingElements(formattingElement);\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tvar afeIndex = this.openElements.elements.indexOf(formattingElement);\r\n\t\tvar commonAncestor = this.openElements.item(afeIndex - 1);\r\n\r\n\t\tvar bookmark = this.activeFormattingElements.indexOf(formattingElement);\r\n\r\n\t\tvar node = furthestBlock;\r\n\t\tvar lastNode = furthestBlock;\r\n\t\tvar index = this.openElements.elements.indexOf(node);\r\n\r\n\t\tvar innerLoopCounter = 0;\r\n\t\twhile (innerLoopCounter++ < innerIterationLimit) {\r\n\t\t\tindex -= 1;\r\n\t\t\tnode = this.openElements.item(index);\r\n\t\t\tif (this.activeFormattingElements.indexOf(node) < 0) {\r\n\t\t\t\tthis.openElements.elements.splice(index, 1);\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif (node == formattingElement)\r\n\t\t\t\tbreak;\r\n\r\n\t\t\tif (lastNode == furthestBlock)\r\n\t\t\t\tbookmark = this.activeFormattingElements.indexOf(node) + 1;\r\n\r\n\t\t\tvar clone = this.createElement(node.namespaceURI, node.localName, node.attributes);\r\n\t\t\tvar newNode = new StackItem(node.namespaceURI, node.localName, node.attributes, clone);\r\n\r\n\t\t\tthis.activeFormattingElements[this.activeFormattingElements.indexOf(node)] = newNode;\r\n\t\t\tthis.openElements.elements[this.openElements.elements.indexOf(node)] = newNode;\r\n\r\n\t\t\tnode = newNode;\r\n\t\t\tthis.detachFromParent(lastNode.node);\r\n\t\t\tthis.attachNode(lastNode.node, node.node);\r\n\t\t\tlastNode = node;\r\n\t\t}\r\n\r\n\t\tthis.detachFromParent(lastNode.node);\r\n\t\tif (commonAncestor.isFosterParenting()) {\r\n\t\t\tthis.insertIntoFosterParent(lastNode.node);\r\n\t\t} else {\r\n\t\t\tthis.attachNode(lastNode.node, commonAncestor.node);\r\n\t\t}\r\n\r\n\t\tvar clone = this.createElement(\"http://www.w3.org/1999/xhtml\", formattingElement.localName, formattingElement.attributes);\r\n\t\tvar formattingClone = new StackItem(formattingElement.namespaceURI, formattingElement.localName, formattingElement.attributes, clone);\r\n\r\n\t\tthis.reparentChildren(furthestBlock.node, clone);\r\n\t\tthis.attachNode(clone, furthestBlock.node);\r\n\r\n\t\tthis.removeElementFromActiveFormattingElements(formattingElement);\r\n\t\tthis.activeFormattingElements.splice(Math.min(bookmark, this.activeFormattingElements.length), 0, formattingClone);\r\n\r\n\t\tthis.openElements.remove(formattingElement);\r\n\t\tthis.openElements.elements.splice(this.openElements.elements.indexOf(furthestBlock) + 1, 0, formattingClone);\r\n\t}\r\n\r\n\treturn true;\r\n};\r\n\r\nTreeBuilder.prototype.start = function() {\r\n\tthrow \"Not mplemented\";\r\n};\r\n\r\nTreeBuilder.prototype.startTokenization = function(tokenizer) {\r\n\tthis.tokenizer = tokenizer;\r\n\tthis.compatMode = \"no quirks\";\r\n\tthis.originalInsertionMode = \"initial\";\r\n\tthis.framesetOk = true;\r\n\tthis.openElements = new ElementStack();\r\n\tthis.activeFormattingElements = [];\r\n\tthis.start();\r\n\tif (this.context) {\r\n\t\tswitch(this.context) {\r\n\t\tcase 'title':\r\n\t\tcase 'textarea':\r\n\t\t\tthis.tokenizer.setState(Tokenizer.RCDATA);\r\n\t\t\tbreak;\r\n\t\tcase 'style':\r\n\t\tcase 'xmp':\r\n\t\tcase 'iframe':\r\n\t\tcase 'noembed':\r\n\t\tcase 'noframes':\r\n\t\t\tthis.tokenizer.setState(Tokenizer.RAWTEXT);\r\n\t\t\tbreak;\r\n\t\tcase 'script':\r\n\t\t\tthis.tokenizer.setState(Tokenizer.SCRIPT_DATA);\r\n\t\t\tbreak;\r\n\t\tcase 'noscript':\r\n\t\t\tif (this.scriptingEnabled)\r\n\t\t\t\tthis.tokenizer.setState(Tokenizer.RAWTEXT);\r\n\t\t\tbreak;\r\n\t\tcase 'plaintext':\r\n\t\t\tthis.tokenizer.setState(Tokenizer.PLAINTEXT);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tthis.insertHtmlElement();\r\n\t\tthis.resetInsertionMode();\r\r\n\t} else {\r\n\t\tthis.setInsertionMode('initial');\r\n\t}\r\n};\r\n\r\nTreeBuilder.prototype.processToken = function(token) {\r\n\tthis.selfClosingFlagAcknowledged = false;\r\n\r\n\tvar currentNode = this.openElements.top || null;\r\n\tvar insertionMode;\r\n\tif (!currentNode || !currentNode.isForeign() ||\r\n\t\t(currentNode.isMathMLTextIntegrationPoint() &&\r\n\t\t\t((token.type == 'StartTag' &&\r\n\t\t\t\t\t!(token.name in {mglyph:0, malignmark:0})) ||\r\n\t\t\t\t(token.type === 'Characters'))\r\n\t\t) ||\r\n\t\t(currentNode.namespaceURI == \"http://www.w3.org/1998/Math/MathML\" &&\r\n\t\t\tcurrentNode.localName == 'annotation-xml' &&\r\n\t\t\ttoken.type == 'StartTag' && token.name == 'svg'\r\n\t\t) ||\r\n\t\t(currentNode.isHtmlIntegrationPoint() &&\r\n\t\t\ttoken.type in {StartTag:0, Characters:0}\r\n\t\t) ||\r\n\t\ttoken.type == 'EOF'\r\n\t) {\r\n\t\tinsertionMode = this.insertionMode;\r\n\t} else {\r\n\t\tinsertionMode = this.insertionModes.inForeignContent;\r\n\t}\r\n\tswitch(token.type) {\r\n\tcase 'Characters':\r\n\t\tvar buffer = new CharacterBuffer(token.data);\r\n\t\tinsertionMode.processCharacters(buffer);\r\n\t\tbreak;\r\n\tcase 'Comment':\r\n\t\tinsertionMode.processComment(token.data);\r\n\t\tbreak;\r\n\tcase 'StartTag':\r\n\t\tinsertionMode.processStartTag(token.name, token.data, token.selfClosing);\r\n\t\tbreak;\r\n\tcase 'EndTag':\r\n\t\tinsertionMode.processEndTag(token.name);\r\n\t\tbreak;\r\n\tcase 'Doctype':\r\n\t\tinsertionMode.processDoctype(token.name, token.publicId, token.systemId, token.forceQuirks);\r\n\t\tbreak;\r\n\tcase 'EOF':\r\n\t\tinsertionMode.processEOF();\r\n\t\tbreak;\r\n\t}\r\n};\r\nTreeBuilder.prototype.isCdataSectionAllowed = function() {\r\n\treturn this.openElements.length > 0 && this.currentStackItem().isForeign();\r\n};\r\nTreeBuilder.prototype.isSelfClosingFlagAcknowledged = function() {\r\n\treturn this.selfClosingFlagAcknowledged;\r\n};\r\n\r\nTreeBuilder.prototype.createElement = function(namespaceURI, localName, attributes) {\r\n\tthrow new Error(\"Not implemented\");\r\n};\r\n\r\nTreeBuilder.prototype.attachNode = function(child, parent) {\r\n\tthrow new Error(\"Not implemented\");\r\n};\r\n\r\nTreeBuilder.prototype.attachNodeToFosterParent = function(child, table, stackParent) {\r\n\tthrow new Error(\"Not implemented\");\r\n};\r\n\r\nTreeBuilder.prototype.detachFromParent = function(node) {\r\n\tthrow new Error(\"Not implemented\");\r\n};\r\n\r\nTreeBuilder.prototype.addAttributesToElement = function(element, attributes) {\r\n\tthrow new Error(\"Not implemented\");\r\n};\r\n\r\nTreeBuilder.prototype.insertHtmlElement = function(attributes) {\r\n\tvar root = this.createElement(\"http://www.w3.org/1999/xhtml\", 'html', attributes);\r\n\tthis.attachNode(root, this.document);\r\n\tthis.openElements.pushHtmlElement(new StackItem(\"http://www.w3.org/1999/xhtml\", 'html', attributes, root));\r\n\treturn root;\r\n};\r\n\r\nTreeBuilder.prototype.insertHeadElement = function(attributes) {\r\n\tvar element = this.createElement(\"http://www.w3.org/1999/xhtml\", \"head\", attributes);\r\n\tthis.head = new StackItem(\"http://www.w3.org/1999/xhtml\", \"head\", attributes, element);\r\n\tthis.attachNode(element, this.openElements.top.node);\r\n\tthis.openElements.pushHeadElement(this.head);\r\n\treturn element;\r\n};\r\n\r\nTreeBuilder.prototype.insertBodyElement = function(attributes) {\r\n\tvar element = this.createElement(\"http://www.w3.org/1999/xhtml\", \"body\", attributes);\r\n\tthis.attachNode(element, this.openElements.top.node);\r\n\tthis.openElements.pushBodyElement(new StackItem(\"http://www.w3.org/1999/xhtml\", \"body\", attributes, element));\r\n\treturn element;\r\n};\r\n\r\nTreeBuilder.prototype.insertIntoFosterParent = function(node) {\r\n\tvar tableIndex = this.openElements.findIndex('table');\r\n\tvar tableElement = this.openElements.item(tableIndex).node;\r\n\tif (tableIndex === 0)\r\n\t\treturn this.attachNode(node, tableElement);\r\n\tthis.attachNodeToFosterParent(node, tableElement, this.openElements.item(tableIndex - 1).node);\r\n};\r\n\r\nTreeBuilder.prototype.insertElement = function(name, attributes, namespaceURI, selfClosing) {\r\n\tif (!namespaceURI)\r\n\t\tnamespaceURI = \"http://www.w3.org/1999/xhtml\";\r\n\tvar element = this.createElement(namespaceURI, name, attributes);\r\n\tif (this.shouldFosterParent())\r\n\t\tthis.insertIntoFosterParent(element);\r\n\telse\r\n\t\tthis.attachNode(element, this.openElements.top.node);\r\n\tif (!selfClosing)\r\n\t\tthis.openElements.push(new StackItem(namespaceURI, name, attributes, element));\r\n};\r\n\r\nTreeBuilder.prototype.insertFormattingElement = function(name, attributes) {\r\n\tthis.insertElement(name, attributes, \"http://www.w3.org/1999/xhtml\");\r\n\tthis.appendElementToActiveFormattingElements(this.currentStackItem());\r\n};\r\n\r\nTreeBuilder.prototype.insertSelfClosingElement = function(name, attributes) {\r\n\tthis.selfClosingFlagAcknowledged = true;\r\n\tthis.insertElement(name, attributes, \"http://www.w3.org/1999/xhtml\", true);\r\n};\r\n\r\nTreeBuilder.prototype.insertForeignElement = function(name, attributes, namespaceURI, selfClosing) {\r\n\tif (selfClosing)\r\n\t\tthis.selfClosingFlagAcknowledged = true;\r\n\tthis.insertElement(name, attributes, namespaceURI, selfClosing);\r\n};\r\n\r\nTreeBuilder.prototype.insertComment = function(data, parent) {\r\n\tthrow new Error(\"Not implemented\");\r\n};\r\n\r\nTreeBuilder.prototype.insertDoctype = function(name, publicId, systemId) {\r\n\tthrow new Error(\"Not implemented\");\r\n};\r\n\r\nTreeBuilder.prototype.insertText = function(data) {\r\n\tthrow new Error(\"Not implemented\");\r\n};\r\nTreeBuilder.prototype.currentStackItem = function() {\r\n\treturn this.openElements.top;\r\n};\r\nTreeBuilder.prototype.popElement = function() {\r\n\treturn this.openElements.pop();\r\n};\r\nTreeBuilder.prototype.shouldFosterParent = function() {\r\n\treturn this.redirectAttachToFosterParent && this.currentStackItem().isFosterParenting();\r\n};\r\nTreeBuilder.prototype.generateImpliedEndTags = function(exclude) {\r\r\n\tvar name = this.openElements.top.localName;\r\n\tif (['dd', 'dt', 'li', 'option', 'optgroup', 'p', 'rp', 'rt'].indexOf(name) != -1 && name != exclude) {\r\n\t\tthis.popElement();\r\n\t\tthis.generateImpliedEndTags(exclude);\r\n\t}\r\n};\r\nTreeBuilder.prototype.reconstructActiveFormattingElements = function() {\r\r\r\r\r\n\tif (this.activeFormattingElements.length === 0)\r\n\t\treturn;\r\r\n\tvar i = this.activeFormattingElements.length - 1;\r\n\tvar entry = this.activeFormattingElements[i];\r\n\tif (entry == Marker || this.openElements.contains(entry))\r\n\t\treturn;\r\n\r\n\twhile (entry != Marker && !this.openElements.contains(entry)) {\r\n\t\ti -= 1;\r\n\t\tentry = this.activeFormattingElements[i];\r\n\t\tif (!entry)\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\twhile (true) {\r\n\t\ti += 1;\r\n\t\tentry = this.activeFormattingElements[i];\r\n\t\tthis.insertElement(entry.localName, entry.attributes);\r\n\t\tvar element = this.currentStackItem();\r\n\t\tthis.activeFormattingElements[i] = element;\r\n\t\tif (element == this.activeFormattingElements[this.activeFormattingElements.length -1])\r\n\t\t\tbreak;\r\n\t}\r\n\r\n};\r\nTreeBuilder.prototype.ensureNoahsArkCondition = function(item) {\r\n\tvar kNoahsArkCapacity = 3;\r\n\tif (this.activeFormattingElements.length < kNoahsArkCapacity)\r\n\t\treturn;\r\n\tvar candidates = [];\r\n\tvar newItemAttributeCount = item.attributes.length;\r\n\tfor (var i = this.activeFormattingElements.length - 1; i >= 0; i--) {\r\n\t\tvar candidate = this.activeFormattingElements[i];\r\n\t\tif (candidate === Marker)\r\n\t\t\tbreak;\r\n\t\tif (item.localName !== candidate.localName || item.namespaceURI !== candidate.namespaceURI)\r\n\t\t\tcontinue;\r\n\t\tif (candidate.attributes.length != newItemAttributeCount)\r\n\t\t\tcontinue;\r\n\t\tcandidates.push(candidate);\r\n\t}\r\n\tif (candidates.length < kNoahsArkCapacity)\r\n\t\treturn;\r\n\r\n\tvar remainingCandidates = [];\r\n\tvar attributes = item.attributes;\r\n\tfor (var i = 0; i < attributes.length; i++) {\r\n\t\tvar attribute = attributes[i];\r\n\r\n\t\tfor (var j = 0; j < candidates.length; j++) {\r\n\t\t\tvar candidate = candidates[j];\r\n\t\t\tvar candidateAttribute = getAttribute(candidate, attribute.nodeName);\r\n\t\t\tif (candidateAttribute && candidateAttribute.nodeValue === attribute.nodeValue)\r\n\t\t\t\tremainingCandidates.push(candidate);\r\n\t\t}\r\n\t\tif (remainingCandidates.length < kNoahsArkCapacity)\r\n\t\t\treturn;\r\n\t\tcandidates = remainingCandidates;\r\n\t\tremainingCandidates = [];\r\n\t}\r\r\r\r\n\tfor (var i = kNoahsArkCapacity - 1; i < candidates.length; i++)\r\n\t\tthis.removeElementFromActiveFormattingElements(candidates[i]);\r\n};\r\nTreeBuilder.prototype.appendElementToActiveFormattingElements = function(item) {\r\n\tthis.ensureNoahsArkCondition(item);\r\n\tthis.activeFormattingElements.push(item);\r\n};\r\nTreeBuilder.prototype.removeElementFromActiveFormattingElements = function(item) {\r\n\tvar index = this.activeFormattingElements.indexOf(item);\r\n\tif (index >= 0)\r\n\t\tthis.activeFormattingElements.splice(index, 1);\r\n};\r\n\r\nTreeBuilder.prototype.elementInActiveFormattingElements = function(name) {\r\n\tvar els = this.activeFormattingElements;\r\n\tfor (var i = els.length - 1; i >= 0; i--) {\r\n\t\tif (els[i] == Marker) break;\r\n\t\tif (els[i].localName == name) return els[i];\r\n\t}\r\n\treturn false;\r\n};\r\n\r\nTreeBuilder.prototype.clearActiveFormattingElements = function() {\r\n    while (!(this.activeFormattingElements.length === 0 || this.activeFormattingElements.pop() == Marker));\r\n};\r\n\r\nTreeBuilder.prototype.reparentChildren = function(oldParent, newParent) {\r\n\tthrow new Error(\"Not implemented\");\r\n};\r\nTreeBuilder.prototype.setFragmentContext = function(context) {\r\r\r\r\r\r\n\tthis.context = context;\r\n};\r\nTreeBuilder.prototype.parseError = function(code, args) {\r\r\n\tif (!this.errorHandler)\r\n\t\treturn;\r\n\tvar message = formatMessage(messages[code], args);\r\n\tthis.errorHandler.error(message, this.tokenizer._inputStream.location(), code);\r\n};\r\nTreeBuilder.prototype.resetInsertionMode = function() {\r\n\tvar last = false;\r\n\tvar node = null;\r\n\tfor (var i = this.openElements.length - 1; i >= 0; i--) {\r\n\t\tnode = this.openElements.item(i);\r\n\t\tif (i === 0) {\r\n\t\t\tassert.ok(this.context);\r\n\t\t\tlast = true;\r\n\t\t\tnode = new StackItem(\"http://www.w3.org/1999/xhtml\", this.context, [], null);\r\n\t\t}\r\n\r\n\t\tif (node.namespaceURI === \"http://www.w3.org/1999/xhtml\") {\r\r\n\t\t\tif (node.localName === 'select')\r\r\n\t\t\t\treturn this.setInsertionMode('inSelect');\r\n\t\t\tif (node.localName === 'td' || node.localName === 'th')\r\n\t\t\t\treturn this.setInsertionMode('inCell');\r\n\t\t\tif (node.localName === 'tr')\r\n\t\t\t\treturn this.setInsertionMode('inRow');\r\n\t\t\tif (node.localName === 'tbody' || node.localName === 'thead' || node.localName === 'tfoot')\r\n\t\t\t\treturn this.setInsertionMode('inTableBody');\r\n\t\t\tif (node.localName === 'caption')\r\n\t\t\t\treturn this.setInsertionMode('inCaption');\r\n\t\t\tif (node.localName === 'colgroup')\r\n\t\t\t\treturn this.setInsertionMode('inColumnGroup');\r\n\t\t\tif (node.localName === 'table')\r\n\t\t\t\treturn this.setInsertionMode('inTable');\r\n\t\t\tif (node.localName === 'head' && !last)\r\n\t\t\t\treturn this.setInsertionMode('inHead');\r\n\t\t\tif (node.localName === 'body')\r\n\t\t\t\treturn this.setInsertionMode('inBody');\r\n\t\t\tif (node.localName === 'frameset')\r\n\t\t\t\treturn this.setInsertionMode('inFrameset');\r\n\t\t\tif (node.localName === 'html')\r\n\t\t\t\tif (!this.openElements.headElement)\r\n\t\t\t\t\treturn this.setInsertionMode('beforeHead');\r\n\t\t\t\telse\r\n\t\t\t\t\treturn this.setInsertionMode('afterHead');\r\n\t\t}\r\n\r\n\t\tif (last)\r\n\t\t\treturn this.setInsertionMode('inBody');\r\n\t}\r\n};\r\n\r\nTreeBuilder.prototype.processGenericRCDATAStartTag = function(name, attributes) {\r\n\tthis.insertElement(name, attributes);\r\n\tthis.tokenizer.setState(Tokenizer.RCDATA);\r\n\tthis.originalInsertionMode = this.insertionModeName;\r\n\tthis.setInsertionMode('text');\r\n};\r\n\r\nTreeBuilder.prototype.processGenericRawTextStartTag = function(name, attributes) {\r\n\tthis.insertElement(name, attributes);\r\n\tthis.tokenizer.setState(Tokenizer.RAWTEXT);\r\n\tthis.originalInsertionMode = this.insertionModeName;\r\n\tthis.setInsertionMode('text');\r\n};\r\n\r\nTreeBuilder.prototype.adjustMathMLAttributes = function(attributes) {\r\n\tattributes.forEach(function(a) {\r\n\t\ta.namespaceURI = \"http://www.w3.org/1998/Math/MathML\";\r\n\t\tif (constants.MATHMLAttributeMap[a.nodeName])\r\n\t\t\ta.nodeName = constants.MATHMLAttributeMap[a.nodeName];\r\n\t});\r\n\treturn attributes;\r\n};\r\n\r\nTreeBuilder.prototype.adjustSVGTagNameCase = function(name) {\r\n\treturn constants.SVGTagMap[name] || name;\r\n};\r\n\r\nTreeBuilder.prototype.adjustSVGAttributes = function(attributes) {\r\n\tattributes.forEach(function(a) {\r\n\t\ta.namespaceURI = \"http://www.w3.org/2000/svg\";\r\n\t\tif (constants.SVGAttributeMap[a.nodeName])\r\n\t\t\ta.nodeName = constants.SVGAttributeMap[a.nodeName];\r\n\t});\r\n\treturn attributes;\r\n};\r\n\r\nTreeBuilder.prototype.adjustForeignAttributes = function(attributes) {\r\n\tfor (var i = 0; i < attributes.length; i++) {\r\n\t\tvar attribute = attributes[i];\r\n\t\tvar adjusted = constants.ForeignAttributeMap[attribute.nodeName];\r\n\t\tif (adjusted) {\r\n\t\t\tattribute.nodeName = adjusted.localName;\r\n\t\t\tattribute.prefix = adjusted.prefix;\r\n\t\t\tattribute.namespaceURI = adjusted.namespaceURI;\r\n\t\t}\r\n\t}\r\n\treturn attributes;\r\n};\r\n\r\nfunction formatMessage(format, args) {\r\n\treturn format.replace(new RegExp('{[0-9a-z-]+}', 'gi'), function(match) {\r\n\t\treturn args[match.slice(1, -1)] || match;\r\n\t});\r\n}\r\n\r\nexports.TreeBuilder = TreeBuilder;\r\n\n},\n{\"./ElementStack\":1,\"./StackItem\":4,\"./Tokenizer\":5,\"./constants\":7,\"./messages.json\":8,\"assert\":13,\"events\":16}],\n7:[function(_dereq_,module,exports){\nexports.SVGTagMap = {\n\t\"altglyph\": \"altGlyph\",\n\t\"altglyphdef\": \"altGlyphDef\",\n\t\"altglyphitem\": \"altGlyphItem\",\n\t\"animatecolor\": \"animateColor\",\n\t\"animatemotion\": \"animateMotion\",\n\t\"animatetransform\": \"animateTransform\",\n\t\"clippath\": \"clipPath\",\n\t\"feblend\": \"feBlend\",\n\t\"fecolormatrix\": \"feColorMatrix\",\n\t\"fecomponenttransfer\": \"feComponentTransfer\",\n\t\"fecomposite\": \"feComposite\",\n\t\"feconvolvematrix\": \"feConvolveMatrix\",\n\t\"fediffuselighting\": \"feDiffuseLighting\",\n\t\"fedisplacementmap\": \"feDisplacementMap\",\n\t\"fedistantlight\": \"feDistantLight\",\n\t\"feflood\": \"feFlood\",\n\t\"fefunca\": \"feFuncA\",\n\t\"fefuncb\": \"feFuncB\",\n\t\"fefuncg\": \"feFuncG\",\n\t\"fefuncr\": \"feFuncR\",\n\t\"fegaussianblur\": \"feGaussianBlur\",\n\t\"feimage\": \"feImage\",\n\t\"femerge\": \"feMerge\",\n\t\"femergenode\": \"feMergeNode\",\n\t\"femorphology\": \"feMorphology\",\n\t\"feoffset\": \"feOffset\",\n\t\"fepointlight\": \"fePointLight\",\n\t\"fespecularlighting\": \"feSpecularLighting\",\n\t\"fespotlight\": \"feSpotLight\",\n\t\"fetile\": \"feTile\",\n\t\"feturbulence\": \"feTurbulence\",\n\t\"foreignobject\": \"foreignObject\",\n\t\"glyphref\": \"glyphRef\",\n\t\"lineargradient\": \"linearGradient\",\n\t\"radialgradient\": \"radialGradient\",\n\t\"textpath\": \"textPath\"\n};\n\nexports.MATHMLAttributeMap = {\n\tdefinitionurl: 'definitionURL'\n};\n\nexports.SVGAttributeMap = {\n\tattributename:\t'attributeName',\n\tattributetype:\t'attributeType',\n\tbasefrequency:\t'baseFrequency',\n\tbaseprofile:\t'baseProfile',\n\tcalcmode:\t'calcMode',\n\tclippathunits:\t'clipPathUnits',\n\tcontentscripttype:\t'contentScriptType',\n\tcontentstyletype:\t'contentStyleType',\n\tdiffuseconstant:\t'diffuseConstant',\n\tedgemode:\t'edgeMode',\n\texternalresourcesrequired:\t'externalResourcesRequired',\n\tfilterres:\t'filterRes',\n\tfilterunits:\t'filterUnits',\n\tglyphref:\t'glyphRef',\n\tgradienttransform:\t'gradientTransform',\n\tgradientunits:\t'gradientUnits',\n\tkernelmatrix:\t'kernelMatrix',\n\tkernelunitlength:\t'kernelUnitLength',\n\tkeypoints:\t'keyPoints',\n\tkeysplines:\t'keySplines',\n\tkeytimes:\t'keyTimes',\n\tlengthadjust:\t'lengthAdjust',\n\tlimitingconeangle:\t'limitingConeAngle',\n\tmarkerheight:\t'markerHeight',\n\tmarkerunits:\t'markerUnits',\n\tmarkerwidth:\t'markerWidth',\n\tmaskcontentunits:\t'maskContentUnits',\n\tmaskunits:\t'maskUnits',\n\tnumoctaves:\t'numOctaves',\n\tpathlength:\t'pathLength',\n\tpatterncontentunits:\t'patternContentUnits',\n\tpatterntransform:\t'patternTransform',\n\tpatternunits:\t'patternUnits',\n\tpointsatx:\t'pointsAtX',\n\tpointsaty:\t'pointsAtY',\n\tpointsatz:\t'pointsAtZ',\n\tpreservealpha:\t'preserveAlpha',\n\tpreserveaspectratio:\t'preserveAspectRatio',\n\tprimitiveunits:\t'primitiveUnits',\n\trefx:\t'refX',\n\trefy:\t'refY',\n\trepeatcount:\t'repeatCount',\n\trepeatdur:\t'repeatDur',\n\trequiredextensions:\t'requiredExtensions',\n\trequiredfeatures:\t'requiredFeatures',\n\tspecularconstant:\t'specularConstant',\n\tspecularexponent:\t'specularExponent',\n\tspreadmethod:\t'spreadMethod',\n\tstartoffset:\t'startOffset',\n\tstddeviation:\t'stdDeviation',\n\tstitchtiles:\t'stitchTiles',\n\tsurfacescale:\t'surfaceScale',\n\tsystemlanguage:\t'systemLanguage',\n\ttablevalues:\t'tableValues',\n\ttargetx:\t'targetX',\n\ttargety:\t'targetY',\n\ttextlength:\t'textLength',\n\tviewbox:\t'viewBox',\n\tviewtarget:\t'viewTarget',\n\txchannelselector:\t'xChannelSelector',\n\tychannelselector:\t'yChannelSelector',\n\tzoomandpan:\t'zoomAndPan'\n};\n\nexports.ForeignAttributeMap = {\n\t\"xlink:actuate\": {prefix: \"xlink\", localName: \"actuate\", namespaceURI: \"http://www.w3.org/1999/xlink\"},\n\t\"xlink:arcrole\": {prefix: \"xlink\", localName: \"arcrole\", namespaceURI: \"http://www.w3.org/1999/xlink\"},\n\t\"xlink:href\": {prefix: \"xlink\", localName: \"href\", namespaceURI: \"http://www.w3.org/1999/xlink\"},\n\t\"xlink:role\": {prefix: \"xlink\", localName: \"role\", namespaceURI: \"http://www.w3.org/1999/xlink\"},\n\t\"xlink:show\": {prefix: \"xlink\", localName: \"show\", namespaceURI: \"http://www.w3.org/1999/xlink\"},\n\t\"xlink:title\": {prefix: \"xlink\", localName: \"title\", namespaceURI: \"http://www.w3.org/1999/xlink\"},\n\t\"xlink:type\": {prefix: \"xlink\", localName: \"title\", namespaceURI: \"http://www.w3.org/1999/xlink\"},\n\t\"xml:base\": {prefix: \"xml\", localName: \"base\", namespaceURI: \"http://www.w3.org/XML/1998/namespace\"},\n\t\"xml:lang\": {prefix: \"xml\", localName: \"lang\", namespaceURI: \"http://www.w3.org/XML/1998/namespace\"},\n\t\"xml:space\": {prefix: \"xml\", localName: \"space\", namespaceURI: \"http://www.w3.org/XML/1998/namespace\"},\n\t\"xmlns\": {prefix: null, localName: \"xmlns\", namespaceURI: \"http://www.w3.org/2000/xmlns/\"},\n\t\"xmlns:xlink\": {prefix: \"xmlns\", localName: \"xlink\", namespaceURI: \"http://www.w3.org/2000/xmlns/\"},\n};\n},\n{}],\n8:[function(_dereq_,module,exports){\nmodule.exports={\r\n\t\"null-character\":\r\n\t\t\"Null character in input stream, replaced with U+FFFD.\",\r\n\t\"invalid-codepoint\":\r\n\t\t\"Invalid codepoint in stream\",\r\n\t\"incorrectly-placed-solidus\":\r\n\t\t\"Solidus (/) incorrectly placed in tag.\",\r\n\t\"incorrect-cr-newline-entity\":\r\n\t\t\"Incorrect CR newline entity, replaced with LF.\",\r\n\t\"illegal-windows-1252-entity\":\r\n\t\t\"Entity used with illegal number (windows-1252 reference).\",\r\n\t\"cant-convert-numeric-entity\":\r\n\t\t\"Numeric entity couldn't be converted to character (codepoint U+{charAsInt}).\",\r\n\t\"invalid-numeric-entity-replaced\":\r\n\t\t\"Numeric entity represents an illegal codepoint. Expanded to the C1 controls range.\",\r\n\t\"numeric-entity-without-semicolon\":\r\n\t\t\"Numeric entity didn't end with ';'.\",\r\n\t\"expected-numeric-entity-but-got-eof\":\r\n\t\t\"Numeric entity expected. Got end of file instead.\",\r\n\t\"expected-numeric-entity\":\r\n\t\t\"Numeric entity expected but none found.\",\r\n\t\"named-entity-without-semicolon\":\r\n\t\t\"Named entity didn't end with ';'.\",\r\n\t\"expected-named-entity\":\r\n\t\t\"Named entity expected. Got none.\",\r\n\t\"attributes-in-end-tag\":\r\n\t\t\"End tag contains unexpected attributes.\",\r\n\t\"self-closing-flag-on-end-tag\":\r\n\t\t\"End tag contains unexpected self-closing flag.\",\r\n\t\"bare-less-than-sign-at-eof\":\r\n\t\t\"End of file after <.\",\r\n\t\"expected-tag-name-but-got-right-bracket\":\r\n\t\t\"Expected tag name. Got '>' instead.\",\r\n\t\"expected-tag-name-but-got-question-mark\":\r\n\t\t\"Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.)\",\r\n\t\"expected-tag-name\":\r\n\t\t\"Expected tag name. Got something else instead.\",\r\n\t\"expected-closing-tag-but-got-right-bracket\":\r\n\t\t\"Expected closing tag. Got '>' instead. Ignoring '</>'.\",\r\n\t\"expected-closing-tag-but-got-eof\":\r\n\t\t\"Expected closing tag. Unexpected end of file.\",\r\n\t\"expected-closing-tag-but-got-char\":\r\n\t\t\"Expected closing tag. Unexpected character '{data}' found.\",\r\n\t\"eof-in-tag-name\":\r\n\t\t\"Unexpected end of file in the tag name.\",\r\n\t\"expected-attribute-name-but-got-eof\":\r\n\t\t\"Unexpected end of file. Expected attribute name instead.\",\r\n\t\"eof-in-attribute-name\":\r\n\t\t\"Unexpected end of file in attribute name.\",\r\n\t\"invalid-character-in-attribute-name\":\r\n\t\t\"Invalid character in attribute name.\",\r\n\t\"duplicate-attribute\":\r\n\t\t\"Dropped duplicate attribute '{name}' on tag.\",\r\n\t\"expected-end-of-tag-but-got-eof\":\r\n\t\t\"Unexpected end of file. Expected = or end of tag.\",\r\n\t\"expected-attribute-value-but-got-eof\":\r\n\t\t\"Unexpected end of file. Expected attribute value.\",\r\n\t\"expected-attribute-value-but-got-right-bracket\":\r\n\t\t\"Expected attribute value. Got '>' instead.\",\r\n\t\"unexpected-character-in-unquoted-attribute-value\":\r\n\t\t\"Unexpected character in unquoted attribute\",\r\n\t\"invalid-character-after-attribute-name\":\r\n\t\t\"Unexpected character after attribute name.\",\r\n\t\"unexpected-character-after-attribute-value\":\r\n\t\t\"Unexpected character after attribute value.\",\r\n\t\"eof-in-attribute-value-double-quote\":\r\n\t\t\"Unexpected end of file in attribute value (\\\").\",\r\n\t\"eof-in-attribute-value-single-quote\":\r\n\t\t\"Unexpected end of file in attribute value (').\",\r\n\t\"eof-in-attribute-value-no-quotes\":\r\n\t\t\"Unexpected end of file in attribute value.\",\r\n\t\"eof-after-attribute-value\":\r\n\t\t\"Unexpected end of file after attribute value.\",\r\n\t\"unexpected-eof-after-solidus-in-tag\":\r\n\t\t\"Unexpected end of file in tag. Expected >.\",\r\n\t\"unexpected-character-after-solidus-in-tag\":\r\n\t\t\"Unexpected character after / in tag. Expected >.\",\r\n\t\"expected-dashes-or-doctype\":\r\n\t\t\"Expected '--' or 'DOCTYPE'. Not found.\",\r\n\t\"unexpected-bang-after-double-dash-in-comment\":\r\n\t\t\"Unexpected ! after -- in comment.\",\r\n\t\"incorrect-comment\":\r\n\t\t\"Incorrect comment.\",\r\n\t\"eof-in-comment\":\r\n\t\t\"Unexpected end of file in comment.\",\r\n\t\"eof-in-comment-end-dash\":\r\n\t\t\"Unexpected end of file in comment (-).\",\r\n\t\"unexpected-dash-after-double-dash-in-comment\":\r\n\t\t\"Unexpected '-' after '--' found in comment.\",\r\n\t\"eof-in-comment-double-dash\":\r\n\t\t\"Unexpected end of file in comment (--).\",\r\n\t\"eof-in-comment-end-bang-state\":\r\n\t\t\"Unexpected end of file in comment.\",\r\n\t\"unexpected-char-in-comment\":\r\n\t\t\"Unexpected character in comment found.\",\r\n\t\"need-space-after-doctype\":\r\n\t\t\"No space after literal string 'DOCTYPE'.\",\r\n\t\"expected-doctype-name-but-got-right-bracket\":\r\n\t\t\"Unexpected > character. Expected DOCTYPE name.\",\r\n\t\"expected-doctype-name-but-got-eof\":\r\n\t\t\"Unexpected end of file. Expected DOCTYPE name.\",\r\n\t\"eof-in-doctype-name\":\r\n\t\t\"Unexpected end of file in DOCTYPE name.\",\r\n\t\"eof-in-doctype\":\r\n\t\t\"Unexpected end of file in DOCTYPE.\",\r\n\t\"expected-space-or-right-bracket-in-doctype\":\r\n\t\t\"Expected space or '>'. Got '{data}'.\",\r\n\t\"unexpected-end-of-doctype\":\r\n\t\t\"Unexpected end of DOCTYPE.\",\r\n\t\"unexpected-char-in-doctype\":\r\n\t\t\"Unexpected character in DOCTYPE.\",\r\n\t\"eof-in-bogus-doctype\":\r\n\t\t\"Unexpected end of file in bogus doctype.\",\r\n\t\"eof-in-innerhtml\":\r\n\t\t\"Unexpected EOF in inner html mode.\",\r\n\t\"unexpected-doctype\":\r\n\t\t\"Unexpected DOCTYPE. Ignored.\",\r\n\t\"non-html-root\":\r\n\t\t\"html needs to be the first start tag.\",\r\n\t\"expected-doctype-but-got-eof\":\r\n\t\t\"Unexpected End of file. Expected DOCTYPE.\",\r\n\t\"unknown-doctype\":\r\n\t\t\"Erroneous DOCTYPE. Expected <!DOCTYPE html>.\",\r\n\t\"quirky-doctype\":\r\n\t\t\"Quirky doctype. Expected <!DOCTYPE html>.\",\r\n\t\"almost-standards-doctype\":\r\n\t\t\"Almost standards mode doctype. Expected <!DOCTYPE html>.\",\r\n\t\"obsolete-doctype\":\r\n\t\t\"Obsolete doctype. Expected <!DOCTYPE html>.\",\r\n\t\"expected-doctype-but-got-chars\":\r\n\t\t\"Non-space characters found without seeing a doctype first. Expected e.g. <!DOCTYPE html>.\",\r\n\t\"expected-doctype-but-got-start-tag\":\r\n\t\t\"Start tag seen without seeing a doctype first. Expected e.g. <!DOCTYPE html>.\",\r\n\t\"expected-doctype-but-got-end-tag\":\r\n\t\t\"End tag seen without seeing a doctype first. Expected e.g. <!DOCTYPE html>.\",\r\n\t\"end-tag-after-implied-root\":\r\n\t\t\"Unexpected end tag ({name}) after the (implied) root element.\",\r\n\t\"expected-named-closing-tag-but-got-eof\":\r\n\t\t\"Unexpected end of file. Expected end tag ({name}).\",\r\n\t\"two-heads-are-not-better-than-one\":\r\n\t\t\"Unexpected start tag head in existing head. Ignored.\",\r\n\t\"unexpected-end-tag\":\r\n\t\t\"Unexpected end tag ({name}). Ignored.\",\r\n\t\"unexpected-implied-end-tag\":\r\n\t\t\"End tag {name} implied, but there were open elements.\",\r\n\t\"unexpected-start-tag-out-of-my-head\":\r\n\t\t\"Unexpected start tag ({name}) that can be in head. Moved.\",\r\n\t\"unexpected-start-tag\":\r\n\t\t\"Unexpected start tag ({name}).\",\r\n\t\"missing-end-tag\":\r\n\t\t\"Missing end tag ({name}).\",\r\n\t\"missing-end-tags\":\r\n\t\t\"Missing end tags ({name}).\",\r\n\t\"unexpected-start-tag-implies-end-tag\":\r\n\t\t\"Unexpected start tag ({startName}) implies end tag ({endName}).\",\r\n\t\"unexpected-start-tag-treated-as\":\r\n\t\t\"Unexpected start tag ({originalName}). Treated as {newName}.\",\r\n\t\"deprecated-tag\":\r\n\t\t\"Unexpected start tag {name}. Don't use it!\",\r\n\t\"unexpected-start-tag-ignored\":\r\n\t\t\"Unexpected start tag {name}. Ignored.\",\r\n\t\"expected-one-end-tag-but-got-another\":\r\n\t\t\"Unexpected end tag ({gotName}). Missing end tag ({expectedName}).\",\r\n\t\"end-tag-too-early\":\r\n\t\t\"End tag ({name}) seen too early. Expected other end tag.\",\r\n\t\"end-tag-too-early-named\":\r\n\t\t\"Unexpected end tag ({gotName}). Expected end tag ({expectedName}.\",\r\n\t\"end-tag-too-early-ignored\":\r\n\t\t\"End tag ({name}) seen too early. Ignored.\",\r\n\t\"adoption-agency-1.1\":\r\n\t\t\"End tag ({name}) violates step 1, paragraph 1 of the adoption agency algorithm.\",\r\n\t\"adoption-agency-1.2\":\r\n\t\t\"End tag ({name}) violates step 1, paragraph 2 of the adoption agency algorithm.\",\r\n\t\"adoption-agency-1.3\":\r\n\t\t\"End tag ({name}) violates step 1, paragraph 3 of the adoption agency algorithm.\",\r\n\t\"adoption-agency-4.4\":\r\n\t\t\"End tag ({name}) violates step 4, paragraph 4 of the adoption agency algorithm.\",\r\n\t\"unexpected-end-tag-treated-as\":\r\n\t\t\"Unexpected end tag ({originalName}). Treated as {newName}.\",\r\n\t\"no-end-tag\":\r\n\t\t\"This element ({name}) has no end tag.\",\r\n\t\"unexpected-implied-end-tag-in-table\":\r\n\t\t\"Unexpected implied end tag ({name}) in the table phase.\",\r\n\t\"unexpected-implied-end-tag-in-table-body\":\r\n\t\t\"Unexpected implied end tag ({name}) in the table body phase.\",\r\n\t\"unexpected-char-implies-table-voodoo\":\r\n\t\t\"Unexpected non-space characters in table context caused voodoo mode.\",\r\n\t\"unexpected-hidden-input-in-table\":\r\n\t\t\"Unexpected input with type hidden in table context.\",\r\n\t\"unexpected-form-in-table\":\r\n\t\t\"Unexpected form in table context.\",\r\n\t\"unexpected-start-tag-implies-table-voodoo\":\r\n\t\t\"Unexpected start tag ({name}) in table context caused voodoo mode.\",\r\n\t\"unexpected-end-tag-implies-table-voodoo\":\r\n\t\t\"Unexpected end tag ({name}) in table context caused voodoo mode.\",\r\n\t\"unexpected-cell-in-table-body\":\r\n\t\t\"Unexpected table cell start tag ({name}) in the table body phase.\",\r\n\t\"unexpected-cell-end-tag\":\r\n\t\t\"Got table cell end tag ({name}) while required end tags are missing.\",\r\n\t\"unexpected-end-tag-in-table-body\":\r\n\t\t\"Unexpected end tag ({name}) in the table body phase. Ignored.\",\r\n\t\"unexpected-implied-end-tag-in-table-row\":\r\n\t\t\"Unexpected implied end tag ({name}) in the table row phase.\",\r\n\t\"unexpected-end-tag-in-table-row\":\r\n\t\t\"Unexpected end tag ({name}) in the table row phase. Ignored.\",\r\n\t\"unexpected-select-in-select\":\r\n\t\t\"Unexpected select start tag in the select phase treated as select end tag.\",\r\n\t\"unexpected-input-in-select\":\r\n\t\t\"Unexpected input start tag in the select phase.\",\r\n\t\"unexpected-start-tag-in-select\":\r\n\t\t\"Unexpected start tag token ({name}) in the select phase. Ignored.\",\r\n\t\"unexpected-end-tag-in-select\":\r\n\t\t\"Unexpected end tag ({name}) in the select phase. Ignored.\",\r\n\t\"unexpected-table-element-start-tag-in-select-in-table\":\r\n\t\t\"Unexpected table element start tag ({name}) in the select in table phase.\",\r\n\t\"unexpected-table-element-end-tag-in-select-in-table\":\r\n\t\t\"Unexpected table element end tag ({name}) in the select in table phase.\",\r\n\t\"unexpected-char-after-body\":\r\n\t\t\"Unexpected non-space characters in the after body phase.\",\r\n\t\"unexpected-start-tag-after-body\":\r\n\t\t\"Unexpected start tag token ({name}) in the after body phase.\",\r\n\t\"unexpected-end-tag-after-body\":\r\n\t\t\"Unexpected end tag token ({name}) in the after body phase.\",\r\n\t\"unexpected-char-in-frameset\":\r\n\t\t\"Unepxected characters in the frameset phase. Characters ignored.\",\r\n\t\"unexpected-start-tag-in-frameset\":\r\n\t\t\"Unexpected start tag token ({name}) in the frameset phase. Ignored.\",\r\n\t\"unexpected-frameset-in-frameset-innerhtml\":\r\n\t\t\"Unexpected end tag token (frameset in the frameset phase (innerHTML).\",\r\n\t\"unexpected-end-tag-in-frameset\":\r\n\t\t\"Unexpected end tag token ({name}) in the frameset phase. Ignored.\",\r\n\t\"unexpected-char-after-frameset\":\r\n\t\t\"Unexpected non-space characters in the after frameset phase. Ignored.\",\r\n\t\"unexpected-start-tag-after-frameset\":\r\n\t\t\"Unexpected start tag ({name}) in the after frameset phase. Ignored.\",\r\n\t\"unexpected-end-tag-after-frameset\":\r\n\t\t\"Unexpected end tag ({name}) in the after frameset phase. Ignored.\",\r\n\t\"expected-eof-but-got-char\":\r\n\t\t\"Unexpected non-space characters. Expected end of file.\",\r\n\t\"expected-eof-but-got-start-tag\":\r\n\t\t\"Unexpected start tag ({name}). Expected end of file.\",\r\n\t\"expected-eof-but-got-end-tag\":\r\n\t\t\"Unexpected end tag ({name}). Expected end of file.\",\r\n\t\"unexpected-end-table-in-caption\":\r\n\t\t\"Unexpected end table tag in caption. Generates implied end caption.\",\r\n\t\"end-html-in-innerhtml\": \r\n\t\t\"Unexpected html end tag in inner html mode.\",\r\n\t\"eof-in-table\":\r\n\t\t\"Unexpected end of file. Expected table content.\",\r\n\t\"eof-in-script\":\r\n\t\t\"Unexpected end of file. Expected script content.\",\r\n\t\"non-void-element-with-trailing-solidus\":\r\n\t\t\"Trailing solidus not allowed on element {name}.\",\r\n\t\"unexpected-html-element-in-foreign-content\":\r\n\t\t\"HTML start tag \\\"{name}\\\" in a foreign namespace context.\",\r\n\t\"unexpected-start-tag-in-table\":\r\n\t\t\"Unexpected {name}. Expected table content.\"\r\n}\n},\n{}],\n9:[function(_dereq_,module,exports){\nvar SAXTreeBuilder = _dereq_('./SAXTreeBuilder').SAXTreeBuilder;\nvar Tokenizer = _dereq_('../Tokenizer').Tokenizer;\nvar TreeParser = _dereq_('./TreeParser').TreeParser;\n\nfunction SAXParser() {\n\tthis.contentHandler = null;\n\tthis._errorHandler = null;\n\tthis._treeBuilder = new SAXTreeBuilder();\n\tthis._tokenizer = new Tokenizer(this._treeBuilder);\n\tthis._scriptingEnabled = false;\n}\n\nSAXParser.prototype.parse = function(source) {\n\tthis._tokenizer.tokenize(source);\n\tvar document = this._treeBuilder.document;\n\tif (document) {\n\t\tnew TreeParser(this.contentHandler).parse(document);\n\t}\n};\n\nSAXParser.prototype.parseFragment = function(source, context) {\n\tthis._treeBuilder.setFragmentContext(context);\n\tthis._tokenizer.tokenize(source);\n\tvar fragment = this._treeBuilder.getFragment();\n\tif (fragment) {\n\t\tnew TreeParser(this.contentHandler).parse(fragment);\n\t}\n};\n\nObject.defineProperty(SAXParser.prototype, 'scriptingEnabled', {\n\tget: function() {\n\t\treturn this._scriptingEnabled;\n\t},\n\tset: function(value) {\n\t\tthis._scriptingEnabled = value;\n\t\tthis._treeBuilder.scriptingEnabled = value;\n\t}\n});\n\nObject.defineProperty(SAXParser.prototype, 'errorHandler', {\n\tget: function() {\n\t\treturn this._errorHandler;\n\t},\n\tset: function(value) {\n\t\tthis._errorHandler = value;\n\t\tthis._treeBuilder.errorHandler = value;\n\t}\n});\n\nexports.SAXParser = SAXParser;\n\n},\n{\"../Tokenizer\":5,\"./SAXTreeBuilder\":10,\"./TreeParser\":11}],\n10:[function(_dereq_,module,exports){\nvar util = _dereq_('util');\r\nvar TreeBuilder = _dereq_('../TreeBuilder').TreeBuilder;\r\n\r\nfunction SAXTreeBuilder() {\r\n\tTreeBuilder.call(this);\r\n}\r\n\r\nutil.inherits(SAXTreeBuilder, TreeBuilder);\r\n\r\nSAXTreeBuilder.prototype.start = function(tokenizer) {\r\n\tthis.document = new Document(this.tokenizer);\r\n};\r\n\r\nSAXTreeBuilder.prototype.end = function() {\r\n\tthis.document.endLocator = this.tokenizer;\r\n};\r\n\r\nSAXTreeBuilder.prototype.insertDoctype = function(name, publicId, systemId) {\r\n\tvar doctype = new DTD(this.tokenizer, name, publicId, systemId);\r\n\tdoctype.endLocator = this.tokenizer;\r\n\tthis.document.appendChild(doctype);\r\n};\r\n\r\nSAXTreeBuilder.prototype.createElement = function(namespaceURI, localName, attributes) {\r\n\tvar element = new Element(this.tokenizer, namespaceURI, localName, localName, attributes || []);\r\n\treturn element;\r\n};\r\n\r\nSAXTreeBuilder.prototype.insertComment = function(data, parent) {\r\n\tif (!parent)\r\n\t\tparent = this.currentStackItem();\r\n\tvar comment = new Comment(this.tokenizer, data);\r\n\tparent.appendChild(comment);\r\n};\r\n\r\nSAXTreeBuilder.prototype.appendCharacters = function(parent, data) {\r\n\tvar text = new Characters(this.tokenizer, data);\r\n\tparent.appendChild(text);\r\n};\r\n\r\nSAXTreeBuilder.prototype.insertText = function(data) {\r\n\tif (this.redirectAttachToFosterParent && this.openElements.top.isFosterParenting()) {\r\n\t\tvar tableIndex = this.openElements.findIndex('table');\r\n\t\tvar tableItem = this.openElements.item(tableIndex);\r\n\t\tvar table = tableItem.node;\r\n\t\tif (tableIndex === 0) {\r\n\t\t\treturn this.appendCharacters(table, data);\r\n\t\t}\r\n\t\tvar text = new Characters(this.tokenizer, data);\r\n\t\tvar parent = table.parentNode;\r\n\t\tif (parent) {\r\n\t\t\tparent.insertBetween(text, table.previousSibling, table);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tvar stackParent = this.openElements.item(tableIndex - 1).node;\r\n\t\tstackParent.appendChild(text);\r\n\t\treturn;\r\n\t}\r\n\tthis.appendCharacters(this.currentStackItem().node, data);\r\n};\r\n\r\nSAXTreeBuilder.prototype.attachNode = function(node, parent) {\r\n\tparent.appendChild(node);\r\n};\r\n\r\nSAXTreeBuilder.prototype.attachNodeToFosterParent = function(child, table, stackParent) {\r\n\tvar parent = table.parentNode;\r\n\tif (parent)\r\n\t\tparent.insertBetween(child, table.previousSibling, table);\r\n\telse\r\n\t\tstackParent.appendChild(child);\r\n};\r\n\r\nSAXTreeBuilder.prototype.detachFromParent = function(element) {\r\n\telement.detach();\r\n};\r\n\r\nSAXTreeBuilder.prototype.reparentChildren = function(oldParent, newParent) {\r\n\tnewParent.appendChildren(oldParent.firstChild);\r\n};\r\n\r\nSAXTreeBuilder.prototype.getFragment = function() {\r\n\tvar fragment = new DocumentFragment();\r\n\tthis.reparentChildren(this.openElements.rootNode, fragment);\r\n\treturn fragment;\r\n};\r\n\r\nfunction getAttribute(node, name) {\r\n\tfor (var i = 0; i < node.attributes.length; i++) {\r\n\t\tvar attribute = node.attributes[i];\r\n\t\tif (attribute.nodeName === name)\r\n\t\t\treturn attribute.nodeValue;\r\n\t}\r\n}\r\n\r\nSAXTreeBuilder.prototype.addAttributesToElement = function(element, attributes) {\r\n\tfor (var i = 0; i < attributes.length; i++) {\r\n\t\tvar attribute = attributes[i];\r\n\t\tif (!getAttribute(element, attribute.nodeName))\r\n\t\t\telement.attributes.push(attribute);\r\n\t}\r\n};\r\n\r\nvar NodeType = {\r\r\n\tCDATA: 1,\r\r\n\tCHARACTERS: 2,\r\r\n\tCOMMENT: 3,\r\r\n\tDOCUMENT: 4,\r\r\n\tDOCUMENT_FRAGMENT: 5,\r\r\n\tDTD: 6,\r\r\n\tELEMENT: 7,\r\r\n\tENTITY: 8,\r\r\n\tIGNORABLE_WHITESPACE: 9,\r\r\n\tPROCESSING_INSTRUCTION: 10,\r\r\n\tSKIPPED_ENTITY: 11\r\n};\r\nfunction Node(locator) {\r\n\tif (!locator) {\r\n\t\tthis.columnNumber = -1;\r\n\t\tthis.lineNumber = -1;\r\n\t} else {\r\n\t\tthis.columnNumber = locator.columnNumber;\r\n\t\tthis.lineNumber = locator.lineNumber;\r\n\t}\r\n\tthis.parentNode = null;\r\n\tthis.nextSibling = null;\r\n\tthis.firstChild = null;\r\n}\r\r\nNode.prototype.visit = function(treeParser) {\r\n\tthrow new Error(\"Not Implemented\");\r\n};\r\nNode.prototype.revisit = function(treeParser) {\r\n\treturn;\r\n};\r\r\r\r\nNode.prototype.detach = function() {\r\n\tif (this.parentNode !== null) {\r\n\t\tthis.parentNode.removeChild(this);\r\n\t\tthis.parentNode = null;\r\n\t}\r\n};\r\n\r\nObject.defineProperty(Node.prototype, 'previousSibling', {\r\n\tget: function() {\r\n\t\tvar prev = null;\r\n\t\tvar next = this.parentNode.firstChild;\r\n\t\tfor(;;) {\r\n\t\t\tif (this == next) {\r\n\t\t\t\treturn prev;\r\n\t\t\t}\r\n\t\t\tprev = next;\r\n\t\t\tnext = next.nextSibling;\r\n\t\t}\r\n\t}\r\n});\r\n\r\n\r\nfunction ParentNode(locator) {\r\n\tNode.call(this, locator);\r\n\tthis.lastChild = null;\r\n\tthis._endLocator = null;\r\n}\r\n\r\nParentNode.prototype = Object.create(Node.prototype);\r\nParentNode.prototype.insertBefore = function(child, sibling) {\r\r\n\tif (!sibling) {\r\n\t\treturn this.appendChild(child);\r\n\t}\r\n\tchild.detach();\r\n\tchild.parentNode = this;\r\n\tif (this.firstChild == sibling) {\r\n\t\tchild.nextSibling = sibling;\r\n\t\tthis.firstChild = child;\r\n\t} else {\r\n\t\tvar prev = this.firstChild;\r\n\t\tvar next = this.firstChild.nextSibling;\r\n\t\twhile (next != sibling) {\r\n\t\t\tprev = next;\r\n\t\t\tnext = next.nextSibling;\r\n\t\t}\r\n\t\tprev.nextSibling = child;\r\n\t\tchild.nextSibling = next;\r\n\t}\r\n\treturn child;\r\n};\r\n\r\nParentNode.prototype.insertBetween = function(child, prev, next) {\r\r\r\r\r\r\n\tif (!next) {\r\n\t\treturn this.appendChild(child);\r\n\t}\r\n\tchild.detach();\r\n\tchild.parentNode = this;\r\n\tchild.nextSibling = next;\r\n\tif (!prev) {\r\n\t\tfirstChild = child;\r\n\t} else {\r\n\t\tprev.nextSibling = child;\r\n\t}\r\n\treturn child;\r\n};\r\nParentNode.prototype.appendChild = function(child) {\r\n\tchild.detach();\r\n\tchild.parentNode = this;\r\n\tif (!this.firstChild) {\r\n\t\tthis.firstChild = child;\r\n\t} else {\r\n\t\tthis.lastChild.nextSibling = child;\r\n\t}\r\n\tthis.lastChild = child;\r\n\treturn child;\r\n};\r\nParentNode.prototype.appendChildren = function(parent) {\r\n\tvar child = parent.firstChild;\r\n\tif (!child) {\r\n\t\treturn;\r\n\t}\r\n\tvar another = parent;\r\n\tif (!this.firstChild) {\r\n\t\tthis.firstChild = child;\r\n\t} else {\r\n\t\tthis.lastChild.nextSibling = child;\r\n\t}\r\n\tthis.lastChild = another.lastChild;\r\n\tdo {\r\n\t\tchild.parentNode = this;\r\n\t} while ((child = child.nextSibling));\r\n\tanother.firstChild = null;\r\n\tanother.lastChild = null;\r\n};\r\nParentNode.prototype.removeChild = function(node) {\r\r\n\tif (this.firstChild == node) {\r\n\t\tthis.firstChild = node.nextSibling;\r\n\t\tif (this.lastChild == node) {\r\n\t\t\tthis.lastChild = null;\r\n\t\t}\r\n\t} else {\r\n\t\tvar prev = this.firstChild;\r\n\t\tvar next = this.firstChild.nextSibling;\r\n\t\twhile (next != node) {\r\n\t\t\tprev = next;\r\n\t\t\tnext = next.nextSibling;\r\n\t\t}\r\n\t\tprev.nextSibling = node.nextSibling;\r\n\t\tif (this.lastChild == node) {\r\n\t\t\tthis.lastChild = prev;\r\n\t\t}\r\n\t}\r\n\tnode.parentNode = null;\r\n\treturn node;\r\n};\r\n\r\nObject.defineProperty(ParentNode.prototype, 'endLocator', {\r\n\tget: function() {\r\n\t\treturn this._endLocator;\r\n\t},\r\n\tset: function(endLocator) {\r\n\t\tthis._endLocator = {\r\n\t\t\tlineNumber: endLocator.lineNumber,\r\n\t\t\tcolumnNumber: endLocator.columnNumber\r\n\t\t};\r\n\t}\r\n});\r\nfunction Document (locator) {\r\n\tParentNode.call(this, locator);\r\n\tthis.nodeType = NodeType.DOCUMENT;\r\n}\r\n\r\nDocument.prototype = Object.create(ParentNode.prototype);\r\nDocument.prototype.visit = function(treeParser) {\r\n\ttreeParser.startDocument(this);\r\n};\r\nDocument.prototype.revisit = function(treeParser) {\r\n\ttreeParser.endDocument(this.endLocator);\r\n};\r\r\nfunction DocumentFragment() {\r\n\tParentNode.call(this, new Locator());\r\n\tthis.nodeType = NodeType.DOCUMENT_FRAGMENT;\r\n}\r\n\r\nDocumentFragment.prototype = Object.create(ParentNode.prototype);\r\nDocumentFragment.prototype.visit = function(treeParser) {\r\r\n};\r\nfunction Element(locator, uri, localName, qName, atts, prefixMappings) {\r\n\tParentNode.call(this, locator);\r\n\tthis.uri = uri;\r\n\tthis.localName = localName;\r\n\tthis.qName = qName;\r\n\tthis.attributes = atts;\r\n\tthis.prefixMappings = prefixMappings;\r\n\tthis.nodeType = NodeType.ELEMENT;\r\n}\r\n\r\nElement.prototype = Object.create(ParentNode.prototype);\r\nElement.prototype.visit = function(treeParser) {\r\n\tif (this.prefixMappings) {\r\n\t\tfor (var key in prefixMappings) {\r\n\t\t\tvar mapping = prefixMappings[key];\r\n\t\t\ttreeParser.startPrefixMapping(mapping.getPrefix(),\r\n\t\t\t\t\tmapping.getUri(), this);\r\n\t\t}\r\n\t}\r\n\ttreeParser.startElement(this.uri, this.localName, this.qName, this.attributes, this);\r\n};\r\nElement.prototype.revisit = function(treeParser) {\r\n\ttreeParser.endElement(this.uri, this.localName, this.qName, this.endLocator);\r\n\tif (this.prefixMappings) {\r\n\t\tfor (var key in prefixMappings) {\r\n\t\t\tvar mapping = prefixMappings[key];\r\n\t\t\ttreeParser.endPrefixMapping(mapping.getPrefix(), this.endLocator);\r\n\t\t}\r\n\t}\r\n};\r\nfunction Characters(locator, data){\r\n\tNode.call(this, locator);\r\n\tthis.data = data;\r\n\tthis.nodeType = NodeType.CHARACTERS;\r\n}\r\n\r\nCharacters.prototype = Object.create(Node.prototype);\r\nCharacters.prototype.visit = function (treeParser) {\r\n\ttreeParser.characters(this.data, 0, this.data.length, this);\r\n};\r\nfunction IgnorableWhitespace(locator, data) {\r\n\tNode.call(this, locator);\r\n\tthis.data = data;\r\n\tthis.nodeType = NodeType.IGNORABLE_WHITESPACE;\r\n}\r\n\r\nIgnorableWhitespace.prototype = Object.create(Node.prototype);\r\nIgnorableWhitespace.prototype.visit = function(treeParser) {\r\n\ttreeParser.ignorableWhitespace(this.data, 0, this.data.length, this);\r\n};\r\r\nfunction Comment(locator, data) {\r\n\tNode.call(this, locator);\r\n\tthis.data = data;\r\n\tthis.nodeType = NodeType.COMMENT;\r\n}\r\n\r\nComment.prototype = Object.create(Node.prototype);\r\nComment.prototype.visit = function(treeParser) {\r\n\ttreeParser.comment(this.data, 0, this.data.length, this);\r\n};\r\r\nfunction CDATA(locator) {\r\n\tParentNode.call(this, locator);\r\n\tthis.nodeType = NodeType.CDATA;\r\n}\r\n\r\nCDATA.prototype = Object.create(ParentNode.prototype);\r\nCDATA.prototype.visit = function(treeParser) {\r\n\ttreeParser.startCDATA(this);\r\n};\r\nCDATA.prototype.revisit = function(treeParser) {\r\n\ttreeParser.endCDATA(this.endLocator);\r\n};\r\r\nfunction Entity(name) {\r\n\tParentNode.call(this);\r\n\tthis.name = name;\r\n\tthis.nodeType = NodeType.ENTITY;\r\n}\r\n\r\nEntity.prototype = Object.create(ParentNode.prototype);\r\nEntity.prototype.visit = function(treeParser) {\r\n\ttreeParser.startEntity(this.name, this);\r\n};\r\nEntity.prototype.revisit = function(treeParser) {\r\n\ttreeParser.endEntity(this.name);\r\n};\r\r\n\r\nfunction SkippedEntity(name) {\r\n\tNode.call(this);\r\n\tthis.name = name;\r\n\tthis.nodeType = NodeType.SKIPPED_ENTITY;\r\n}\r\n\r\nSkippedEntity.prototype = Object.create(Node.prototype);\r\nSkippedEntity.prototype.visit = function(treeParser) {\r\n\ttreeParser.skippedEntity(this.name, this);\r\n};\r\r\r\r\r\r\nfunction ProcessingInstruction(target, data) {\r\n\tNode.call(this);\r\n\tthis.target = target;\r\n\tthis.data = data;\r\n}\r\n\r\nProcessingInstruction.prototype = Object.create(Node.prototype);\r\nProcessingInstruction.prototype.visit = function(treeParser) {\r\n\ttreeParser.processingInstruction(this.target, this.data, this);\r\n};\r\nProcessingInstruction.prototype.getNodeType = function() {\r\n\treturn NodeType.PROCESSING_INSTRUCTION;\r\n};\r\nfunction DTD(name, publicIdentifier, systemIdentifier) {\r\n\tParentNode.call(this);\r\n\tthis.name = name;\r\n\tthis.publicIdentifier = publicIdentifier;\r\n\tthis.systemIdentifier = systemIdentifier;\r\n\tthis.nodeType = NodeType.DTD;\r\n}\r\n\r\nDTD.prototype = Object.create(ParentNode.prototype);\r\nDTD.prototype.visit = function(treeParser) {\r\n\ttreeParser.startDTD(this.name, this.publicIdentifier, this.systemIdentifier, this);\r\n};\r\nDTD.prototype.revisit = function(treeParser) {\r\n\ttreeParser.endDTD();\r\n};\r\n\r\nexports.SAXTreeBuilder = SAXTreeBuilder;\r\n\n},\n{\"../TreeBuilder\":6,\"util\":20}],\n11:[function(_dereq_,module,exports){\r\r\nfunction TreeParser(contentHandler, lexicalHandler){\r\r\n\tthis.contentHandler;\r\n\tthis.lexicalHandler;\r\n\tthis.locatorDelegate;\r\n\r\n\tif (!contentHandler) {\r\n\t\tthrow new IllegalArgumentException(\"contentHandler was null.\");\r\n\t}\r\n\tthis.contentHandler = contentHandler;\r\n\tif (!lexicalHandler) {\r\n\t\tthis.lexicalHandler = new NullLexicalHandler();\r\n\t} else {\r\n\t\tthis.lexicalHandler = lexicalHandler;\r\n\t}\r\n}\r\r\nTreeParser.prototype.parse = function(node) {\r\n\tthis.contentHandler.documentLocator = this;\r\n\tvar current = node;\r\n\tvar next;\r\n\tfor (;;) {\r\n\t\tcurrent.visit(this);\r\n\t\tif (next = current.firstChild) {\r\n\t\t\tcurrent = next;\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tfor (;;) {\r\n\t\t\tcurrent.revisit(this);\r\n\t\t\tif (current == node) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\tif (next = current.nextSibling) {\r\n\t\t\t\tcurrent = next;\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tcurrent = current.parentNode;\r\n\t\t}\r\n\t}\r\n};\r\nTreeParser.prototype.characters = function(ch, start, length, locator) {\r\n\tthis.locatorDelegate = locator;\r\n\tthis.contentHandler.characters(ch, start, length);\r\n};\r\nTreeParser.prototype.endDocument = function(locator) {\r\n\tthis.locatorDelegate = locator;\r\n\tthis.contentHandler.endDocument();\r\n};\r\nTreeParser.prototype.endElement = function(uri, localName, qName, locator) {\r\n\tthis.locatorDelegate = locator;\r\n\tthis.contentHandler.endElement(uri, localName, qName);\r\n};\r\nTreeParser.prototype.endPrefixMapping = function(prefix, locator) {\r\n\tthis.locatorDelegate = locator;\r\n\tthis.contentHandler.endPrefixMapping(prefix);\r\n};\r\nTreeParser.prototype.ignorableWhitespace = function(ch, start, length, locator) {\r\n\tthis.locatorDelegate = locator;\r\n\tthis.contentHandler.ignorableWhitespace(ch, start, length);\r\n};\r\nTreeParser.prototype.processingInstruction = function(target, data, locator) {\r\n\tthis.locatorDelegate = locator;\r\n\tthis.contentHandler.processingInstruction(target, data);\r\n};\r\nTreeParser.prototype.skippedEntity = function(name, locator) {\r\n\tthis.locatorDelegate = locator;\r\n\tthis.contentHandler.skippedEntity(name);\r\n};\r\nTreeParser.prototype.startDocument = function(locator) {\r\n\tthis.locatorDelegate = locator;\r\n\tthis.contentHandler.startDocument();\r\n};\r\nTreeParser.prototype.startElement = function(uri, localName, qName, atts, locator) {\r\n\tthis.locatorDelegate = locator;\r\n\tthis.contentHandler.startElement(uri, localName, qName, atts);\r\n};\r\nTreeParser.prototype.startPrefixMapping = function(prefix, uri, locator) {\r\n\tthis.locatorDelegate = locator;\r\n\tthis.contentHandler.startPrefixMapping(prefix, uri);\r\n};\r\nTreeParser.prototype.comment = function(ch, start, length, locator) {\r\n\tthis.locatorDelegate = locator;\r\n\tthis.lexicalHandler.comment(ch, start, length);\r\n};\r\nTreeParser.prototype.endCDATA = function(locator) {\r\n\tthis.locatorDelegate = locator;\r\n\tthis.lexicalHandler.endCDATA();\r\n};\r\nTreeParser.prototype.endDTD = function(locator) {\r\n\tthis.locatorDelegate = locator;\r\n\tthis.lexicalHandler.endDTD();\r\n};\r\nTreeParser.prototype.endEntity = function(name, locator) {\r\n\tthis.locatorDelegate = locator;\r\n\tthis.lexicalHandler.endEntity(name);\r\n};\r\nTreeParser.prototype.startCDATA = function(locator) {\r\n\tthis.locatorDelegate = locator;\r\n\tthis.lexicalHandler.startCDATA();\r\n};\r\nTreeParser.prototype.startDTD = function(name, publicId, systemId, locator) {\r\n\tthis.locatorDelegate = locator;\r\n\tthis.lexicalHandler.startDTD(name, publicId, systemId);\r\n};\r\nTreeParser.prototype.startEntity = function(name, locator) {\r\n\tthis.locatorDelegate = locator;\r\n\tthis.lexicalHandler.startEntity(name);\r\n};\r\n\r\nObject.defineProperty(TreeParser.prototype, 'columnNumber', {\r\n\tget: function() {\r\n\t\tif (!this.locatorDelegate)\r\n\t\t\treturn -1;\r\n\t\telse\r\n\t\t\treturn this.locatorDelegate.columnNumber;\r\n\t}\r\n});\r\n\r\nObject.defineProperty(TreeParser.prototype, 'lineNumber', {\r\n\tget: function() {\r\n\t\tif (!this.locatorDelegate)\r\n\t\t\treturn -1;\r\n\t\telse\r\n\t\t\treturn this.locatorDelegate.lineNumber;\r\n\t}\r\n});\r\r\nfunction NullLexicalHandler() {\r\n\r\n}\r\n\r\nNullLexicalHandler.prototype.comment = function() {};\r\nNullLexicalHandler.prototype.endCDATA = function() {};\r\nNullLexicalHandler.prototype.endDTD = function() {};\r\nNullLexicalHandler.prototype.endEntity = function() {};\r\nNullLexicalHandler.prototype.startCDATA = function() {};\r\nNullLexicalHandler.prototype.startDTD = function() {};\r\nNullLexicalHandler.prototype.startEntity = function() {};\r\n\r\nexports.TreeParser = TreeParser;\r\n\n},\n{}],\n12:[function(_dereq_,module,exports){\nmodule.exports = {\n\t\"Aacute;\": \"\\u00C1\",\n\t\"Aacute\": \"\\u00C1\",\n\t\"aacute;\": \"\\u00E1\",\n\t\"aacute\": \"\\u00E1\",\n\t\"Abreve;\": \"\\u0102\",\n\t\"abreve;\": \"\\u0103\",\n\t\"ac;\": \"\\u223E\",\n\t\"acd;\": \"\\u223F\",\n\t\"acE;\": \"\\u223E\\u0333\",\n\t\"Acirc;\": \"\\u00C2\",\n\t\"Acirc\": \"\\u00C2\",\n\t\"acirc;\": \"\\u00E2\",\n\t\"acirc\": \"\\u00E2\",\n\t\"acute;\": \"\\u00B4\",\n\t\"acute\": \"\\u00B4\",\n\t\"Acy;\": \"\\u0410\",\n\t\"acy;\": \"\\u0430\",\n\t\"AElig;\": \"\\u00C6\",\n\t\"AElig\": \"\\u00C6\",\n\t\"aelig;\": \"\\u00E6\",\n\t\"aelig\": \"\\u00E6\",\n\t\"af;\": \"\\u2061\",\n\t\"Afr;\": \"\\uD835\\uDD04\",\n\t\"afr;\": \"\\uD835\\uDD1E\",\n\t\"Agrave;\": \"\\u00C0\",\n\t\"Agrave\": \"\\u00C0\",\n\t\"agrave;\": \"\\u00E0\",\n\t\"agrave\": \"\\u00E0\",\n\t\"alefsym;\": \"\\u2135\",\n\t\"aleph;\": \"\\u2135\",\n\t\"Alpha;\": \"\\u0391\",\n\t\"alpha;\": \"\\u03B1\",\n\t\"Amacr;\": \"\\u0100\",\n\t\"amacr;\": \"\\u0101\",\n\t\"amalg;\": \"\\u2A3F\",\n\t\"amp;\": \"\\u0026\",\n\t\"amp\": \"\\u0026\",\n\t\"AMP;\": \"\\u0026\",\n\t\"AMP\": \"\\u0026\",\n\t\"andand;\": \"\\u2A55\",\n\t\"And;\": \"\\u2A53\",\n\t\"and;\": \"\\u2227\",\n\t\"andd;\": \"\\u2A5C\",\n\t\"andslope;\": \"\\u2A58\",\n\t\"andv;\": \"\\u2A5A\",\n\t\"ang;\": \"\\u2220\",\n\t\"ange;\": \"\\u29A4\",\n\t\"angle;\": \"\\u2220\",\n\t\"angmsdaa;\": \"\\u29A8\",\n\t\"angmsdab;\": \"\\u29A9\",\n\t\"angmsdac;\": \"\\u29AA\",\n\t\"angmsdad;\": \"\\u29AB\",\n\t\"angmsdae;\": \"\\u29AC\",\n\t\"angmsdaf;\": \"\\u29AD\",\n\t\"angmsdag;\": \"\\u29AE\",\n\t\"angmsdah;\": \"\\u29AF\",\n\t\"angmsd;\": \"\\u2221\",\n\t\"angrt;\": \"\\u221F\",\n\t\"angrtvb;\": \"\\u22BE\",\n\t\"angrtvbd;\": \"\\u299D\",\n\t\"angsph;\": \"\\u2222\",\n\t\"angst;\": \"\\u00C5\",\n\t\"angzarr;\": \"\\u237C\",\n\t\"Aogon;\": \"\\u0104\",\n\t\"aogon;\": \"\\u0105\",\n\t\"Aopf;\": \"\\uD835\\uDD38\",\n\t\"aopf;\": \"\\uD835\\uDD52\",\n\t\"apacir;\": \"\\u2A6F\",\n\t\"ap;\": \"\\u2248\",\n\t\"apE;\": \"\\u2A70\",\n\t\"ape;\": \"\\u224A\",\n\t\"apid;\": \"\\u224B\",\n\t\"apos;\": \"\\u0027\",\n\t\"ApplyFunction;\": \"\\u2061\",\n\t\"approx;\": \"\\u2248\",\n\t\"approxeq;\": \"\\u224A\",\n\t\"Aring;\": \"\\u00C5\",\n\t\"Aring\": \"\\u00C5\",\n\t\"aring;\": \"\\u00E5\",\n\t\"aring\": \"\\u00E5\",\n\t\"Ascr;\": \"\\uD835\\uDC9C\",\n\t\"ascr;\": \"\\uD835\\uDCB6\",\n\t\"Assign;\": \"\\u2254\",\n\t\"ast;\": \"\\u002A\",\n\t\"asymp;\": \"\\u2248\",\n\t\"asympeq;\": \"\\u224D\",\n\t\"Atilde;\": \"\\u00C3\",\n\t\"Atilde\": \"\\u00C3\",\n\t\"atilde;\": \"\\u00E3\",\n\t\"atilde\": \"\\u00E3\",\n\t\"Auml;\": \"\\u00C4\",\n\t\"Auml\": \"\\u00C4\",\n\t\"auml;\": \"\\u00E4\",\n\t\"auml\": \"\\u00E4\",\n\t\"awconint;\": \"\\u2233\",\n\t\"awint;\": \"\\u2A11\",\n\t\"backcong;\": \"\\u224C\",\n\t\"backepsilon;\": \"\\u03F6\",\n\t\"backprime;\": \"\\u2035\",\n\t\"backsim;\": \"\\u223D\",\n\t\"backsimeq;\": \"\\u22CD\",\n\t\"Backslash;\": \"\\u2216\",\n\t\"Barv;\": \"\\u2AE7\",\n\t\"barvee;\": \"\\u22BD\",\n\t\"barwed;\": \"\\u2305\",\n\t\"Barwed;\": \"\\u2306\",\n\t\"barwedge;\": \"\\u2305\",\n\t\"bbrk;\": \"\\u23B5\",\n\t\"bbrktbrk;\": \"\\u23B6\",\n\t\"bcong;\": \"\\u224C\",\n\t\"Bcy;\": \"\\u0411\",\n\t\"bcy;\": \"\\u0431\",\n\t\"bdquo;\": \"\\u201E\",\n\t\"becaus;\": \"\\u2235\",\n\t\"because;\": \"\\u2235\",\n\t\"Because;\": \"\\u2235\",\n\t\"bemptyv;\": \"\\u29B0\",\n\t\"bepsi;\": \"\\u03F6\",\n\t\"bernou;\": \"\\u212C\",\n\t\"Bernoullis;\": \"\\u212C\",\n\t\"Beta;\": \"\\u0392\",\n\t\"beta;\": \"\\u03B2\",\n\t\"beth;\": \"\\u2136\",\n\t\"between;\": \"\\u226C\",\n\t\"Bfr;\": \"\\uD835\\uDD05\",\n\t\"bfr;\": \"\\uD835\\uDD1F\",\n\t\"bigcap;\": \"\\u22C2\",\n\t\"bigcirc;\": \"\\u25EF\",\n\t\"bigcup;\": \"\\u22C3\",\n\t\"bigodot;\": \"\\u2A00\",\n\t\"bigoplus;\": \"\\u2A01\",\n\t\"bigotimes;\": \"\\u2A02\",\n\t\"bigsqcup;\": \"\\u2A06\",\n\t\"bigstar;\": \"\\u2605\",\n\t\"bigtriangledown;\": \"\\u25BD\",\n\t\"bigtriangleup;\": \"\\u25B3\",\n\t\"biguplus;\": \"\\u2A04\",\n\t\"bigvee;\": \"\\u22C1\",\n\t\"bigwedge;\": \"\\u22C0\",\n\t\"bkarow;\": \"\\u290D\",\n\t\"blacklozenge;\": \"\\u29EB\",\n\t\"blacksquare;\": \"\\u25AA\",\n\t\"blacktriangle;\": \"\\u25B4\",\n\t\"blacktriangledown;\": \"\\u25BE\",\n\t\"blacktriangleleft;\": \"\\u25C2\",\n\t\"blacktriangleright;\": \"\\u25B8\",\n\t\"blank;\": \"\\u2423\",\n\t\"blk12;\": \"\\u2592\",\n\t\"blk14;\": \"\\u2591\",\n\t\"blk34;\": \"\\u2593\",\n\t\"block;\": \"\\u2588\",\n\t\"bne;\": \"\\u003D\\u20E5\",\n\t\"bnequiv;\": \"\\u2261\\u20E5\",\n\t\"bNot;\": \"\\u2AED\",\n\t\"bnot;\": \"\\u2310\",\n\t\"Bopf;\": \"\\uD835\\uDD39\",\n\t\"bopf;\": \"\\uD835\\uDD53\",\n\t\"bot;\": \"\\u22A5\",\n\t\"bottom;\": \"\\u22A5\",\n\t\"bowtie;\": \"\\u22C8\",\n\t\"boxbox;\": \"\\u29C9\",\n\t\"boxdl;\": \"\\u2510\",\n\t\"boxdL;\": \"\\u2555\",\n\t\"boxDl;\": \"\\u2556\",\n\t\"boxDL;\": \"\\u2557\",\n\t\"boxdr;\": \"\\u250C\",\n\t\"boxdR;\": \"\\u2552\",\n\t\"boxDr;\": \"\\u2553\",\n\t\"boxDR;\": \"\\u2554\",\n\t\"boxh;\": \"\\u2500\",\n\t\"boxH;\": \"\\u2550\",\n\t\"boxhd;\": \"\\u252C\",\n\t\"boxHd;\": \"\\u2564\",\n\t\"boxhD;\": \"\\u2565\",\n\t\"boxHD;\": \"\\u2566\",\n\t\"boxhu;\": \"\\u2534\",\n\t\"boxHu;\": \"\\u2567\",\n\t\"boxhU;\": \"\\u2568\",\n\t\"boxHU;\": \"\\u2569\",\n\t\"boxminus;\": \"\\u229F\",\n\t\"boxplus;\": \"\\u229E\",\n\t\"boxtimes;\": \"\\u22A0\",\n\t\"boxul;\": \"\\u2518\",\n\t\"boxuL;\": \"\\u255B\",\n\t\"boxUl;\": \"\\u255C\",\n\t\"boxUL;\": \"\\u255D\",\n\t\"boxur;\": \"\\u2514\",\n\t\"boxuR;\": \"\\u2558\",\n\t\"boxUr;\": \"\\u2559\",\n\t\"boxUR;\": \"\\u255A\",\n\t\"boxv;\": \"\\u2502\",\n\t\"boxV;\": \"\\u2551\",\n\t\"boxvh;\": \"\\u253C\",\n\t\"boxvH;\": \"\\u256A\",\n\t\"boxVh;\": \"\\u256B\",\n\t\"boxVH;\": \"\\u256C\",\n\t\"boxvl;\": \"\\u2524\",\n\t\"boxvL;\": \"\\u2561\",\n\t\"boxVl;\": \"\\u2562\",\n\t\"boxVL;\": \"\\u2563\",\n\t\"boxvr;\": \"\\u251C\",\n\t\"boxvR;\": \"\\u255E\",\n\t\"boxVr;\": \"\\u255F\",\n\t\"boxVR;\": \"\\u2560\",\n\t\"bprime;\": \"\\u2035\",\n\t\"breve;\": \"\\u02D8\",\n\t\"Breve;\": \"\\u02D8\",\n\t\"brvbar;\": \"\\u00A6\",\n\t\"brvbar\": \"\\u00A6\",\n\t\"bscr;\": \"\\uD835\\uDCB7\",\n\t\"Bscr;\": \"\\u212C\",\n\t\"bsemi;\": \"\\u204F\",\n\t\"bsim;\": \"\\u223D\",\n\t\"bsime;\": \"\\u22CD\",\n\t\"bsolb;\": \"\\u29C5\",\n\t\"bsol;\": \"\\u005C\",\n\t\"bsolhsub;\": \"\\u27C8\",\n\t\"bull;\": \"\\u2022\",\n\t\"bullet;\": \"\\u2022\",\n\t\"bump;\": \"\\u224E\",\n\t\"bumpE;\": \"\\u2AAE\",\n\t\"bumpe;\": \"\\u224F\",\n\t\"Bumpeq;\": \"\\u224E\",\n\t\"bumpeq;\": \"\\u224F\",\n\t\"Cacute;\": \"\\u0106\",\n\t\"cacute;\": \"\\u0107\",\n\t\"capand;\": \"\\u2A44\",\n\t\"capbrcup;\": \"\\u2A49\",\n\t\"capcap;\": \"\\u2A4B\",\n\t\"cap;\": \"\\u2229\",\n\t\"Cap;\": \"\\u22D2\",\n\t\"capcup;\": \"\\u2A47\",\n\t\"capdot;\": \"\\u2A40\",\n\t\"CapitalDifferentialD;\": \"\\u2145\",\n\t\"caps;\": \"\\u2229\\uFE00\",\n\t\"caret;\": \"\\u2041\",\n\t\"caron;\": \"\\u02C7\",\n\t\"Cayleys;\": \"\\u212D\",\n\t\"ccaps;\": \"\\u2A4D\",\n\t\"Ccaron;\": \"\\u010C\",\n\t\"ccaron;\": \"\\u010D\",\n\t\"Ccedil;\": \"\\u00C7\",\n\t\"Ccedil\": \"\\u00C7\",\n\t\"ccedil;\": \"\\u00E7\",\n\t\"ccedil\": \"\\u00E7\",\n\t\"Ccirc;\": \"\\u0108\",\n\t\"ccirc;\": \"\\u0109\",\n\t\"Cconint;\": \"\\u2230\",\n\t\"ccups;\": \"\\u2A4C\",\n\t\"ccupssm;\": \"\\u2A50\",\n\t\"Cdot;\": \"\\u010A\",\n\t\"cdot;\": \"\\u010B\",\n\t\"cedil;\": \"\\u00B8\",\n\t\"cedil\": \"\\u00B8\",\n\t\"Cedilla;\": \"\\u00B8\",\n\t\"cemptyv;\": \"\\u29B2\",\n\t\"cent;\": \"\\u00A2\",\n\t\"cent\": \"\\u00A2\",\n\t\"centerdot;\": \"\\u00B7\",\n\t\"CenterDot;\": \"\\u00B7\",\n\t\"cfr;\": \"\\uD835\\uDD20\",\n\t\"Cfr;\": \"\\u212D\",\n\t\"CHcy;\": \"\\u0427\",\n\t\"chcy;\": \"\\u0447\",\n\t\"check;\": \"\\u2713\",\n\t\"checkmark;\": \"\\u2713\",\n\t\"Chi;\": \"\\u03A7\",\n\t\"chi;\": \"\\u03C7\",\n\t\"circ;\": \"\\u02C6\",\n\t\"circeq;\": \"\\u2257\",\n\t\"circlearrowleft;\": \"\\u21BA\",\n\t\"circlearrowright;\": \"\\u21BB\",\n\t\"circledast;\": \"\\u229B\",\n\t\"circledcirc;\": \"\\u229A\",\n\t\"circleddash;\": \"\\u229D\",\n\t\"CircleDot;\": \"\\u2299\",\n\t\"circledR;\": \"\\u00AE\",\n\t\"circledS;\": \"\\u24C8\",\n\t\"CircleMinus;\": \"\\u2296\",\n\t\"CirclePlus;\": \"\\u2295\",\n\t\"CircleTimes;\": \"\\u2297\",\n\t\"cir;\": \"\\u25CB\",\n\t\"cirE;\": \"\\u29C3\",\n\t\"cire;\": \"\\u2257\",\n\t\"cirfnint;\": \"\\u2A10\",\n\t\"cirmid;\": \"\\u2AEF\",\n\t\"cirscir;\": \"\\u29C2\",\n\t\"ClockwiseContourIntegral;\": \"\\u2232\",\n\t\"CloseCurlyDoubleQuote;\": \"\\u201D\",\n\t\"CloseCurlyQuote;\": \"\\u2019\",\n\t\"clubs;\": \"\\u2663\",\n\t\"clubsuit;\": \"\\u2663\",\n\t\"colon;\": \"\\u003A\",\n\t\"Colon;\": \"\\u2237\",\n\t\"Colone;\": \"\\u2A74\",\n\t\"colone;\": \"\\u2254\",\n\t\"coloneq;\": \"\\u2254\",\n\t\"comma;\": \"\\u002C\",\n\t\"commat;\": \"\\u0040\",\n\t\"comp;\": \"\\u2201\",\n\t\"compfn;\": \"\\u2218\",\n\t\"complement;\": \"\\u2201\",\n\t\"complexes;\": \"\\u2102\",\n\t\"cong;\": \"\\u2245\",\n\t\"congdot;\": \"\\u2A6D\",\n\t\"Congruent;\": \"\\u2261\",\n\t\"conint;\": \"\\u222E\",\n\t\"Conint;\": \"\\u222F\",\n\t\"ContourIntegral;\": \"\\u222E\",\n\t\"copf;\": \"\\uD835\\uDD54\",\n\t\"Copf;\": \"\\u2102\",\n\t\"coprod;\": \"\\u2210\",\n\t\"Coproduct;\": \"\\u2210\",\n\t\"copy;\": \"\\u00A9\",\n\t\"copy\": \"\\u00A9\",\n\t\"COPY;\": \"\\u00A9\",\n\t\"COPY\": \"\\u00A9\",\n\t\"copysr;\": \"\\u2117\",\n\t\"CounterClockwiseContourIntegral;\": \"\\u2233\",\n\t\"crarr;\": \"\\u21B5\",\n\t\"cross;\": \"\\u2717\",\n\t\"Cross;\": \"\\u2A2F\",\n\t\"Cscr;\": \"\\uD835\\uDC9E\",\n\t\"cscr;\": \"\\uD835\\uDCB8\",\n\t\"csub;\": \"\\u2ACF\",\n\t\"csube;\": \"\\u2AD1\",\n\t\"csup;\": \"\\u2AD0\",\n\t\"csupe;\": \"\\u2AD2\",\n\t\"ctdot;\": \"\\u22EF\",\n\t\"cudarrl;\": \"\\u2938\",\n\t\"cudarrr;\": \"\\u2935\",\n\t\"cuepr;\": \"\\u22DE\",\n\t\"cuesc;\": \"\\u22DF\",\n\t\"cularr;\": \"\\u21B6\",\n\t\"cularrp;\": \"\\u293D\",\n\t\"cupbrcap;\": \"\\u2A48\",\n\t\"cupcap;\": \"\\u2A46\",\n\t\"CupCap;\": \"\\u224D\",\n\t\"cup;\": \"\\u222A\",\n\t\"Cup;\": \"\\u22D3\",\n\t\"cupcup;\": \"\\u2A4A\",\n\t\"cupdot;\": \"\\u228D\",\n\t\"cupor;\": \"\\u2A45\",\n\t\"cups;\": \"\\u222A\\uFE00\",\n\t\"curarr;\": \"\\u21B7\",\n\t\"curarrm;\": \"\\u293C\",\n\t\"curlyeqprec;\": \"\\u22DE\",\n\t\"curlyeqsucc;\": \"\\u22DF\",\n\t\"curlyvee;\": \"\\u22CE\",\n\t\"curlywedge;\": \"\\u22CF\",\n\t\"curren;\": \"\\u00A4\",\n\t\"curren\": \"\\u00A4\",\n\t\"curvearrowleft;\": \"\\u21B6\",\n\t\"curvearrowright;\": \"\\u21B7\",\n\t\"cuvee;\": \"\\u22CE\",\n\t\"cuwed;\": \"\\u22CF\",\n\t\"cwconint;\": \"\\u2232\",\n\t\"cwint;\": \"\\u2231\",\n\t\"cylcty;\": \"\\u232D\",\n\t\"dagger;\": \"\\u2020\",\n\t\"Dagger;\": \"\\u2021\",\n\t\"daleth;\": \"\\u2138\",\n\t\"darr;\": \"\\u2193\",\n\t\"Darr;\": \"\\u21A1\",\n\t\"dArr;\": \"\\u21D3\",\n\t\"dash;\": \"\\u2010\",\n\t\"Dashv;\": \"\\u2AE4\",\n\t\"dashv;\": \"\\u22A3\",\n\t\"dbkarow;\": \"\\u290F\",\n\t\"dblac;\": \"\\u02DD\",\n\t\"Dcaron;\": \"\\u010E\",\n\t\"dcaron;\": \"\\u010F\",\n\t\"Dcy;\": \"\\u0414\",\n\t\"dcy;\": \"\\u0434\",\n\t\"ddagger;\": \"\\u2021\",\n\t\"ddarr;\": \"\\u21CA\",\n\t\"DD;\": \"\\u2145\",\n\t\"dd;\": \"\\u2146\",\n\t\"DDotrahd;\": \"\\u2911\",\n\t\"ddotseq;\": \"\\u2A77\",\n\t\"deg;\": \"\\u00B0\",\n\t\"deg\": \"\\u00B0\",\n\t\"Del;\": \"\\u2207\",\n\t\"Delta;\": \"\\u0394\",\n\t\"delta;\": \"\\u03B4\",\n\t\"demptyv;\": \"\\u29B1\",\n\t\"dfisht;\": \"\\u297F\",\n\t\"Dfr;\": \"\\uD835\\uDD07\",\n\t\"dfr;\": \"\\uD835\\uDD21\",\n\t\"dHar;\": \"\\u2965\",\n\t\"dharl;\": \"\\u21C3\",\n\t\"dharr;\": \"\\u21C2\",\n\t\"DiacriticalAcute;\": \"\\u00B4\",\n\t\"DiacriticalDot;\": \"\\u02D9\",\n\t\"DiacriticalDoubleAcute;\": \"\\u02DD\",\n\t\"DiacriticalGrave;\": \"\\u0060\",\n\t\"DiacriticalTilde;\": \"\\u02DC\",\n\t\"diam;\": \"\\u22C4\",\n\t\"diamond;\": \"\\u22C4\",\n\t\"Diamond;\": \"\\u22C4\",\n\t\"diamondsuit;\": \"\\u2666\",\n\t\"diams;\": \"\\u2666\",\n\t\"die;\": \"\\u00A8\",\n\t\"DifferentialD;\": \"\\u2146\",\n\t\"digamma;\": \"\\u03DD\",\n\t\"disin;\": \"\\u22F2\",\n\t\"div;\": \"\\u00F7\",\n\t\"divide;\": \"\\u00F7\",\n\t\"divide\": \"\\u00F7\",\n\t\"divideontimes;\": \"\\u22C7\",\n\t\"divonx;\": \"\\u22C7\",\n\t\"DJcy;\": \"\\u0402\",\n\t\"djcy;\": \"\\u0452\",\n\t\"dlcorn;\": \"\\u231E\",\n\t\"dlcrop;\": \"\\u230D\",\n\t\"dollar;\": \"\\u0024\",\n\t\"Dopf;\": \"\\uD835\\uDD3B\",\n\t\"dopf;\": \"\\uD835\\uDD55\",\n\t\"Dot;\": \"\\u00A8\",\n\t\"dot;\": \"\\u02D9\",\n\t\"DotDot;\": \"\\u20DC\",\n\t\"doteq;\": \"\\u2250\",\n\t\"doteqdot;\": \"\\u2251\",\n\t\"DotEqual;\": \"\\u2250\",\n\t\"dotminus;\": \"\\u2238\",\n\t\"dotplus;\": \"\\u2214\",\n\t\"dotsquare;\": \"\\u22A1\",\n\t\"doublebarwedge;\": \"\\u2306\",\n\t\"DoubleContourIntegral;\": \"\\u222F\",\n\t\"DoubleDot;\": \"\\u00A8\",\n\t\"DoubleDownArrow;\": \"\\u21D3\",\n\t\"DoubleLeftArrow;\": \"\\u21D0\",\n\t\"DoubleLeftRightArrow;\": \"\\u21D4\",\n\t\"DoubleLeftTee;\": \"\\u2AE4\",\n\t\"DoubleLongLeftArrow;\": \"\\u27F8\",\n\t\"DoubleLongLeftRightArrow;\": \"\\u27FA\",\n\t\"DoubleLongRightArrow;\": \"\\u27F9\",\n\t\"DoubleRightArrow;\": \"\\u21D2\",\n\t\"DoubleRightTee;\": \"\\u22A8\",\n\t\"DoubleUpArrow;\": \"\\u21D1\",\n\t\"DoubleUpDownArrow;\": \"\\u21D5\",\n\t\"DoubleVerticalBar;\": \"\\u2225\",\n\t\"DownArrowBar;\": \"\\u2913\",\n\t\"downarrow;\": \"\\u2193\",\n\t\"DownArrow;\": \"\\u2193\",\n\t\"Downarrow;\": \"\\u21D3\",\n\t\"DownArrowUpArrow;\": \"\\u21F5\",\n\t\"DownBreve;\": \"\\u0311\",\n\t\"downdownarrows;\": \"\\u21CA\",\n\t\"downharpoonleft;\": \"\\u21C3\",\n\t\"downharpoonright;\": \"\\u21C2\",\n\t\"DownLeftRightVector;\": \"\\u2950\",\n\t\"DownLeftTeeVector;\": \"\\u295E\",\n\t\"DownLeftVectorBar;\": \"\\u2956\",\n\t\"DownLeftVector;\": \"\\u21BD\",\n\t\"DownRightTeeVector;\": \"\\u295F\",\n\t\"DownRightVectorBar;\": \"\\u2957\",\n\t\"DownRightVector;\": \"\\u21C1\",\n\t\"DownTeeArrow;\": \"\\u21A7\",\n\t\"DownTee;\": \"\\u22A4\",\n\t\"drbkarow;\": \"\\u2910\",\n\t\"drcorn;\": \"\\u231F\",\n\t\"drcrop;\": \"\\u230C\",\n\t\"Dscr;\": \"\\uD835\\uDC9F\",\n\t\"dscr;\": \"\\uD835\\uDCB9\",\n\t\"DScy;\": \"\\u0405\",\n\t\"dscy;\": \"\\u0455\",\n\t\"dsol;\": \"\\u29F6\",\n\t\"Dstrok;\": \"\\u0110\",\n\t\"dstrok;\": \"\\u0111\",\n\t\"dtdot;\": \"\\u22F1\",\n\t\"dtri;\": \"\\u25BF\",\n\t\"dtrif;\": \"\\u25BE\",\n\t\"duarr;\": \"\\u21F5\",\n\t\"duhar;\": \"\\u296F\",\n\t\"dwangle;\": \"\\u29A6\",\n\t\"DZcy;\": \"\\u040F\",\n\t\"dzcy;\": \"\\u045F\",\n\t\"dzigrarr;\": \"\\u27FF\",\n\t\"Eacute;\": \"\\u00C9\",\n\t\"Eacute\": \"\\u00C9\",\n\t\"eacute;\": \"\\u00E9\",\n\t\"eacute\": \"\\u00E9\",\n\t\"easter;\": \"\\u2A6E\",\n\t\"Ecaron;\": \"\\u011A\",\n\t\"ecaron;\": \"\\u011B\",\n\t\"Ecirc;\": \"\\u00CA\",\n\t\"Ecirc\": \"\\u00CA\",\n\t\"ecirc;\": \"\\u00EA\",\n\t\"ecirc\": \"\\u00EA\",\n\t\"ecir;\": \"\\u2256\",\n\t\"ecolon;\": \"\\u2255\",\n\t\"Ecy;\": \"\\u042D\",\n\t\"ecy;\": \"\\u044D\",\n\t\"eDDot;\": \"\\u2A77\",\n\t\"Edot;\": \"\\u0116\",\n\t\"edot;\": \"\\u0117\",\n\t\"eDot;\": \"\\u2251\",\n\t\"ee;\": \"\\u2147\",\n\t\"efDot;\": \"\\u2252\",\n\t\"Efr;\": \"\\uD835\\uDD08\",\n\t\"efr;\": \"\\uD835\\uDD22\",\n\t\"eg;\": \"\\u2A9A\",\n\t\"Egrave;\": \"\\u00C8\",\n\t\"Egrave\": \"\\u00C8\",\n\t\"egrave;\": \"\\u00E8\",\n\t\"egrave\": \"\\u00E8\",\n\t\"egs;\": \"\\u2A96\",\n\t\"egsdot;\": \"\\u2A98\",\n\t\"el;\": \"\\u2A99\",\n\t\"Element;\": \"\\u2208\",\n\t\"elinters;\": \"\\u23E7\",\n\t\"ell;\": \"\\u2113\",\n\t\"els;\": \"\\u2A95\",\n\t\"elsdot;\": \"\\u2A97\",\n\t\"Emacr;\": \"\\u0112\",\n\t\"emacr;\": \"\\u0113\",\n\t\"empty;\": \"\\u2205\",\n\t\"emptyset;\": \"\\u2205\",\n\t\"EmptySmallSquare;\": \"\\u25FB\",\n\t\"emptyv;\": \"\\u2205\",\n\t\"EmptyVerySmallSquare;\": \"\\u25AB\",\n\t\"emsp13;\": \"\\u2004\",\n\t\"emsp14;\": \"\\u2005\",\n\t\"emsp;\": \"\\u2003\",\n\t\"ENG;\": \"\\u014A\",\n\t\"eng;\": \"\\u014B\",\n\t\"ensp;\": \"\\u2002\",\n\t\"Eogon;\": \"\\u0118\",\n\t\"eogon;\": \"\\u0119\",\n\t\"Eopf;\": \"\\uD835\\uDD3C\",\n\t\"eopf;\": \"\\uD835\\uDD56\",\n\t\"epar;\": \"\\u22D5\",\n\t\"eparsl;\": \"\\u29E3\",\n\t\"eplus;\": \"\\u2A71\",\n\t\"epsi;\": \"\\u03B5\",\n\t\"Epsilon;\": \"\\u0395\",\n\t\"epsilon;\": \"\\u03B5\",\n\t\"epsiv;\": \"\\u03F5\",\n\t\"eqcirc;\": \"\\u2256\",\n\t\"eqcolon;\": \"\\u2255\",\n\t\"eqsim;\": \"\\u2242\",\n\t\"eqslantgtr;\": \"\\u2A96\",\n\t\"eqslantless;\": \"\\u2A95\",\n\t\"Equal;\": \"\\u2A75\",\n\t\"equals;\": \"\\u003D\",\n\t\"EqualTilde;\": \"\\u2242\",\n\t\"equest;\": \"\\u225F\",\n\t\"Equilibrium;\": \"\\u21CC\",\n\t\"equiv;\": \"\\u2261\",\n\t\"equivDD;\": \"\\u2A78\",\n\t\"eqvparsl;\": \"\\u29E5\",\n\t\"erarr;\": \"\\u2971\",\n\t\"erDot;\": \"\\u2253\",\n\t\"escr;\": \"\\u212F\",\n\t\"Escr;\": \"\\u2130\",\n\t\"esdot;\": \"\\u2250\",\n\t\"Esim;\": \"\\u2A73\",\n\t\"esim;\": \"\\u2242\",\n\t\"Eta;\": \"\\u0397\",\n\t\"eta;\": \"\\u03B7\",\n\t\"ETH;\": \"\\u00D0\",\n\t\"ETH\": \"\\u00D0\",\n\t\"eth;\": \"\\u00F0\",\n\t\"eth\": \"\\u00F0\",\n\t\"Euml;\": \"\\u00CB\",\n\t\"Euml\": \"\\u00CB\",\n\t\"euml;\": \"\\u00EB\",\n\t\"euml\": \"\\u00EB\",\n\t\"euro;\": \"\\u20AC\",\n\t\"excl;\": \"\\u0021\",\n\t\"exist;\": \"\\u2203\",\n\t\"Exists;\": \"\\u2203\",\n\t\"expectation;\": \"\\u2130\",\n\t\"exponentiale;\": \"\\u2147\",\n\t\"ExponentialE;\": \"\\u2147\",\n\t\"fallingdotseq;\": \"\\u2252\",\n\t\"Fcy;\": \"\\u0424\",\n\t\"fcy;\": \"\\u0444\",\n\t\"female;\": \"\\u2640\",\n\t\"ffilig;\": \"\\uFB03\",\n\t\"fflig;\": \"\\uFB00\",\n\t\"ffllig;\": \"\\uFB04\",\n\t\"Ffr;\": \"\\uD835\\uDD09\",\n\t\"ffr;\": \"\\uD835\\uDD23\",\n\t\"filig;\": \"\\uFB01\",\n\t\"FilledSmallSquare;\": \"\\u25FC\",\n\t\"FilledVerySmallSquare;\": \"\\u25AA\",\n\t\"fjlig;\": \"\\u0066\\u006A\",\n\t\"flat;\": \"\\u266D\",\n\t\"fllig;\": \"\\uFB02\",\n\t\"fltns;\": \"\\u25B1\",\n\t\"fnof;\": \"\\u0192\",\n\t\"Fopf;\": \"\\uD835\\uDD3D\",\n\t\"fopf;\": \"\\uD835\\uDD57\",\n\t\"forall;\": \"\\u2200\",\n\t\"ForAll;\": \"\\u2200\",\n\t\"fork;\": \"\\u22D4\",\n\t\"forkv;\": \"\\u2AD9\",\n\t\"Fouriertrf;\": \"\\u2131\",\n\t\"fpartint;\": \"\\u2A0D\",\n\t\"frac12;\": \"\\u00BD\",\n\t\"frac12\": \"\\u00BD\",\n\t\"frac13;\": \"\\u2153\",\n\t\"frac14;\": \"\\u00BC\",\n\t\"frac14\": \"\\u00BC\",\n\t\"frac15;\": \"\\u2155\",\n\t\"frac16;\": \"\\u2159\",\n\t\"frac18;\": \"\\u215B\",\n\t\"frac23;\": \"\\u2154\",\n\t\"frac25;\": \"\\u2156\",\n\t\"frac34;\": \"\\u00BE\",\n\t\"frac34\": \"\\u00BE\",\n\t\"frac35;\": \"\\u2157\",\n\t\"frac38;\": \"\\u215C\",\n\t\"frac45;\": \"\\u2158\",\n\t\"frac56;\": \"\\u215A\",\n\t\"frac58;\": \"\\u215D\",\n\t\"frac78;\": \"\\u215E\",\n\t\"frasl;\": \"\\u2044\",\n\t\"frown;\": \"\\u2322\",\n\t\"fscr;\": \"\\uD835\\uDCBB\",\n\t\"Fscr;\": \"\\u2131\",\n\t\"gacute;\": \"\\u01F5\",\n\t\"Gamma;\": \"\\u0393\",\n\t\"gamma;\": \"\\u03B3\",\n\t\"Gammad;\": \"\\u03DC\",\n\t\"gammad;\": \"\\u03DD\",\n\t\"gap;\": \"\\u2A86\",\n\t\"Gbreve;\": \"\\u011E\",\n\t\"gbreve;\": \"\\u011F\",\n\t\"Gcedil;\": \"\\u0122\",\n\t\"Gcirc;\": \"\\u011C\",\n\t\"gcirc;\": \"\\u011D\",\n\t\"Gcy;\": \"\\u0413\",\n\t\"gcy;\": \"\\u0433\",\n\t\"Gdot;\": \"\\u0120\",\n\t\"gdot;\": \"\\u0121\",\n\t\"ge;\": \"\\u2265\",\n\t\"gE;\": \"\\u2267\",\n\t\"gEl;\": \"\\u2A8C\",\n\t\"gel;\": \"\\u22DB\",\n\t\"geq;\": \"\\u2265\",\n\t\"geqq;\": \"\\u2267\",\n\t\"geqslant;\": \"\\u2A7E\",\n\t\"gescc;\": \"\\u2AA9\",\n\t\"ges;\": \"\\u2A7E\",\n\t\"gesdot;\": \"\\u2A80\",\n\t\"gesdoto;\": \"\\u2A82\",\n\t\"gesdotol;\": \"\\u2A84\",\n\t\"gesl;\": \"\\u22DB\\uFE00\",\n\t\"gesles;\": \"\\u2A94\",\n\t\"Gfr;\": \"\\uD835\\uDD0A\",\n\t\"gfr;\": \"\\uD835\\uDD24\",\n\t\"gg;\": \"\\u226B\",\n\t\"Gg;\": \"\\u22D9\",\n\t\"ggg;\": \"\\u22D9\",\n\t\"gimel;\": \"\\u2137\",\n\t\"GJcy;\": \"\\u0403\",\n\t\"gjcy;\": \"\\u0453\",\n\t\"gla;\": \"\\u2AA5\",\n\t\"gl;\": \"\\u2277\",\n\t\"glE;\": \"\\u2A92\",\n\t\"glj;\": \"\\u2AA4\",\n\t\"gnap;\": \"\\u2A8A\",\n\t\"gnapprox;\": \"\\u2A8A\",\n\t\"gne;\": \"\\u2A88\",\n\t\"gnE;\": \"\\u2269\",\n\t\"gneq;\": \"\\u2A88\",\n\t\"gneqq;\": \"\\u2269\",\n\t\"gnsim;\": \"\\u22E7\",\n\t\"Gopf;\": \"\\uD835\\uDD3E\",\n\t\"gopf;\": \"\\uD835\\uDD58\",\n\t\"grave;\": \"\\u0060\",\n\t\"GreaterEqual;\": \"\\u2265\",\n\t\"GreaterEqualLess;\": \"\\u22DB\",\n\t\"GreaterFullEqual;\": \"\\u2267\",\n\t\"GreaterGreater;\": \"\\u2AA2\",\n\t\"GreaterLess;\": \"\\u2277\",\n\t\"GreaterSlantEqual;\": \"\\u2A7E\",\n\t\"GreaterTilde;\": \"\\u2273\",\n\t\"Gscr;\": \"\\uD835\\uDCA2\",\n\t\"gscr;\": \"\\u210A\",\n\t\"gsim;\": \"\\u2273\",\n\t\"gsime;\": \"\\u2A8E\",\n\t\"gsiml;\": \"\\u2A90\",\n\t\"gtcc;\": \"\\u2AA7\",\n\t\"gtcir;\": \"\\u2A7A\",\n\t\"gt;\": \"\\u003E\",\n\t\"gt\": \"\\u003E\",\n\t\"GT;\": \"\\u003E\",\n\t\"GT\": \"\\u003E\",\n\t\"Gt;\": \"\\u226B\",\n\t\"gtdot;\": \"\\u22D7\",\n\t\"gtlPar;\": \"\\u2995\",\n\t\"gtquest;\": \"\\u2A7C\",\n\t\"gtrapprox;\": \"\\u2A86\",\n\t\"gtrarr;\": \"\\u2978\",\n\t\"gtrdot;\": \"\\u22D7\",\n\t\"gtreqless;\": \"\\u22DB\",\n\t\"gtreqqless;\": \"\\u2A8C\",\n\t\"gtrless;\": \"\\u2277\",\n\t\"gtrsim;\": \"\\u2273\",\n\t\"gvertneqq;\": \"\\u2269\\uFE00\",\n\t\"gvnE;\": \"\\u2269\\uFE00\",\n\t\"Hacek;\": \"\\u02C7\",\n\t\"hairsp;\": \"\\u200A\",\n\t\"half;\": \"\\u00BD\",\n\t\"hamilt;\": \"\\u210B\",\n\t\"HARDcy;\": \"\\u042A\",\n\t\"hardcy;\": \"\\u044A\",\n\t\"harrcir;\": \"\\u2948\",\n\t\"harr;\": \"\\u2194\",\n\t\"hArr;\": \"\\u21D4\",\n\t\"harrw;\": \"\\u21AD\",\n\t\"Hat;\": \"\\u005E\",\n\t\"hbar;\": \"\\u210F\",\n\t\"Hcirc;\": \"\\u0124\",\n\t\"hcirc;\": \"\\u0125\",\n\t\"hearts;\": \"\\u2665\",\n\t\"heartsuit;\": \"\\u2665\",\n\t\"hellip;\": \"\\u2026\",\n\t\"hercon;\": \"\\u22B9\",\n\t\"hfr;\": \"\\uD835\\uDD25\",\n\t\"Hfr;\": \"\\u210C\",\n\t\"HilbertSpace;\": \"\\u210B\",\n\t\"hksearow;\": \"\\u2925\",\n\t\"hkswarow;\": \"\\u2926\",\n\t\"hoarr;\": \"\\u21FF\",\n\t\"homtht;\": \"\\u223B\",\n\t\"hookleftarrow;\": \"\\u21A9\",\n\t\"hookrightarrow;\": \"\\u21AA\",\n\t\"hopf;\": \"\\uD835\\uDD59\",\n\t\"Hopf;\": \"\\u210D\",\n\t\"horbar;\": \"\\u2015\",\n\t\"HorizontalLine;\": \"\\u2500\",\n\t\"hscr;\": \"\\uD835\\uDCBD\",\n\t\"Hscr;\": \"\\u210B\",\n\t\"hslash;\": \"\\u210F\",\n\t\"Hstrok;\": \"\\u0126\",\n\t\"hstrok;\": \"\\u0127\",\n\t\"HumpDownHump;\": \"\\u224E\",\n\t\"HumpEqual;\": \"\\u224F\",\n\t\"hybull;\": \"\\u2043\",\n\t\"hyphen;\": \"\\u2010\",\n\t\"Iacute;\": \"\\u00CD\",\n\t\"Iacute\": \"\\u00CD\",\n\t\"iacute;\": \"\\u00ED\",\n\t\"iacute\": \"\\u00ED\",\n\t\"ic;\": \"\\u2063\",\n\t\"Icirc;\": \"\\u00CE\",\n\t\"Icirc\": \"\\u00CE\",\n\t\"icirc;\": \"\\u00EE\",\n\t\"icirc\": \"\\u00EE\",\n\t\"Icy;\": \"\\u0418\",\n\t\"icy;\": \"\\u0438\",\n\t\"Idot;\": \"\\u0130\",\n\t\"IEcy;\": \"\\u0415\",\n\t\"iecy;\": \"\\u0435\",\n\t\"iexcl;\": \"\\u00A1\",\n\t\"iexcl\": \"\\u00A1\",\n\t\"iff;\": \"\\u21D4\",\n\t\"ifr;\": \"\\uD835\\uDD26\",\n\t\"Ifr;\": \"\\u2111\",\n\t\"Igrave;\": \"\\u00CC\",\n\t\"Igrave\": \"\\u00CC\",\n\t\"igrave;\": \"\\u00EC\",\n\t\"igrave\": \"\\u00EC\",\n\t\"ii;\": \"\\u2148\",\n\t\"iiiint;\": \"\\u2A0C\",\n\t\"iiint;\": \"\\u222D\",\n\t\"iinfin;\": \"\\u29DC\",\n\t\"iiota;\": \"\\u2129\",\n\t\"IJlig;\": \"\\u0132\",\n\t\"ijlig;\": \"\\u0133\",\n\t\"Imacr;\": \"\\u012A\",\n\t\"imacr;\": \"\\u012B\",\n\t\"image;\": \"\\u2111\",\n\t\"ImaginaryI;\": \"\\u2148\",\n\t\"imagline;\": \"\\u2110\",\n\t\"imagpart;\": \"\\u2111\",\n\t\"imath;\": \"\\u0131\",\n\t\"Im;\": \"\\u2111\",\n\t\"imof;\": \"\\u22B7\",\n\t\"imped;\": \"\\u01B5\",\n\t\"Implies;\": \"\\u21D2\",\n\t\"incare;\": \"\\u2105\",\n\t\"in;\": \"\\u2208\",\n\t\"infin;\": \"\\u221E\",\n\t\"infintie;\": \"\\u29DD\",\n\t\"inodot;\": \"\\u0131\",\n\t\"intcal;\": \"\\u22BA\",\n\t\"int;\": \"\\u222B\",\n\t\"Int;\": \"\\u222C\",\n\t\"integers;\": \"\\u2124\",\n\t\"Integral;\": \"\\u222B\",\n\t\"intercal;\": \"\\u22BA\",\n\t\"Intersection;\": \"\\u22C2\",\n\t\"intlarhk;\": \"\\u2A17\",\n\t\"intprod;\": \"\\u2A3C\",\n\t\"InvisibleComma;\": \"\\u2063\",\n\t\"InvisibleTimes;\": \"\\u2062\",\n\t\"IOcy;\": \"\\u0401\",\n\t\"iocy;\": \"\\u0451\",\n\t\"Iogon;\": \"\\u012E\",\n\t\"iogon;\": \"\\u012F\",\n\t\"Iopf;\": \"\\uD835\\uDD40\",\n\t\"iopf;\": \"\\uD835\\uDD5A\",\n\t\"Iota;\": \"\\u0399\",\n\t\"iota;\": \"\\u03B9\",\n\t\"iprod;\": \"\\u2A3C\",\n\t\"iquest;\": \"\\u00BF\",\n\t\"iquest\": \"\\u00BF\",\n\t\"iscr;\": \"\\uD835\\uDCBE\",\n\t\"Iscr;\": \"\\u2110\",\n\t\"isin;\": \"\\u2208\",\n\t\"isindot;\": \"\\u22F5\",\n\t\"isinE;\": \"\\u22F9\",\n\t\"isins;\": \"\\u22F4\",\n\t\"isinsv;\": \"\\u22F3\",\n\t\"isinv;\": \"\\u2208\",\n\t\"it;\": \"\\u2062\",\n\t\"Itilde;\": \"\\u0128\",\n\t\"itilde;\": \"\\u0129\",\n\t\"Iukcy;\": \"\\u0406\",\n\t\"iukcy;\": \"\\u0456\",\n\t\"Iuml;\": \"\\u00CF\",\n\t\"Iuml\": \"\\u00CF\",\n\t\"iuml;\": \"\\u00EF\",\n\t\"iuml\": \"\\u00EF\",\n\t\"Jcirc;\": \"\\u0134\",\n\t\"jcirc;\": \"\\u0135\",\n\t\"Jcy;\": \"\\u0419\",\n\t\"jcy;\": \"\\u0439\",\n\t\"Jfr;\": \"\\uD835\\uDD0D\",\n\t\"jfr;\": \"\\uD835\\uDD27\",\n\t\"jmath;\": \"\\u0237\",\n\t\"Jopf;\": \"\\uD835\\uDD41\",\n\t\"jopf;\": \"\\uD835\\uDD5B\",\n\t\"Jscr;\": \"\\uD835\\uDCA5\",\n\t\"jscr;\": \"\\uD835\\uDCBF\",\n\t\"Jsercy;\": \"\\u0408\",\n\t\"jsercy;\": \"\\u0458\",\n\t\"Jukcy;\": \"\\u0404\",\n\t\"jukcy;\": \"\\u0454\",\n\t\"Kappa;\": \"\\u039A\",\n\t\"kappa;\": \"\\u03BA\",\n\t\"kappav;\": \"\\u03F0\",\n\t\"Kcedil;\": \"\\u0136\",\n\t\"kcedil;\": \"\\u0137\",\n\t\"Kcy;\": \"\\u041A\",\n\t\"kcy;\": \"\\u043A\",\n\t\"Kfr;\": \"\\uD835\\uDD0E\",\n\t\"kfr;\": \"\\uD835\\uDD28\",\n\t\"kgreen;\": \"\\u0138\",\n\t\"KHcy;\": \"\\u0425\",\n\t\"khcy;\": \"\\u0445\",\n\t\"KJcy;\": \"\\u040C\",\n\t\"kjcy;\": \"\\u045C\",\n\t\"Kopf;\": \"\\uD835\\uDD42\",\n\t\"kopf;\": \"\\uD835\\uDD5C\",\n\t\"Kscr;\": \"\\uD835\\uDCA6\",\n\t\"kscr;\": \"\\uD835\\uDCC0\",\n\t\"lAarr;\": \"\\u21DA\",\n\t\"Lacute;\": \"\\u0139\",\n\t\"lacute;\": \"\\u013A\",\n\t\"laemptyv;\": \"\\u29B4\",\n\t\"lagran;\": \"\\u2112\",\n\t\"Lambda;\": \"\\u039B\",\n\t\"lambda;\": \"\\u03BB\",\n\t\"lang;\": \"\\u27E8\",\n\t\"Lang;\": \"\\u27EA\",\n\t\"langd;\": \"\\u2991\",\n\t\"langle;\": \"\\u27E8\",\n\t\"lap;\": \"\\u2A85\",\n\t\"Laplacetrf;\": \"\\u2112\",\n\t\"laquo;\": \"\\u00AB\",\n\t\"laquo\": \"\\u00AB\",\n\t\"larrb;\": \"\\u21E4\",\n\t\"larrbfs;\": \"\\u291F\",\n\t\"larr;\": \"\\u2190\",\n\t\"Larr;\": \"\\u219E\",\n\t\"lArr;\": \"\\u21D0\",\n\t\"larrfs;\": \"\\u291D\",\n\t\"larrhk;\": \"\\u21A9\",\n\t\"larrlp;\": \"\\u21AB\",\n\t\"larrpl;\": \"\\u2939\",\n\t\"larrsim;\": \"\\u2973\",\n\t\"larrtl;\": \"\\u21A2\",\n\t\"latail;\": \"\\u2919\",\n\t\"lAtail;\": \"\\u291B\",\n\t\"lat;\": \"\\u2AAB\",\n\t\"late;\": \"\\u2AAD\",\n\t\"lates;\": \"\\u2AAD\\uFE00\",\n\t\"lbarr;\": \"\\u290C\",\n\t\"lBarr;\": \"\\u290E\",\n\t\"lbbrk;\": \"\\u2772\",\n\t\"lbrace;\": \"\\u007B\",\n\t\"lbrack;\": \"\\u005B\",\n\t\"lbrke;\": \"\\u298B\",\n\t\"lbrksld;\": \"\\u298F\",\n\t\"lbrkslu;\": \"\\u298D\",\n\t\"Lcaron;\": \"\\u013D\",\n\t\"lcaron;\": \"\\u013E\",\n\t\"Lcedil;\": \"\\u013B\",\n\t\"lcedil;\": \"\\u013C\",\n\t\"lceil;\": \"\\u2308\",\n\t\"lcub;\": \"\\u007B\",\n\t\"Lcy;\": \"\\u041B\",\n\t\"lcy;\": \"\\u043B\",\n\t\"ldca;\": \"\\u2936\",\n\t\"ldquo;\": \"\\u201C\",\n\t\"ldquor;\": \"\\u201E\",\n\t\"ldrdhar;\": \"\\u2967\",\n\t\"ldrushar;\": \"\\u294B\",\n\t\"ldsh;\": \"\\u21B2\",\n\t\"le;\": \"\\u2264\",\n\t\"lE;\": \"\\u2266\",\n\t\"LeftAngleBracket;\": \"\\u27E8\",\n\t\"LeftArrowBar;\": \"\\u21E4\",\n\t\"leftarrow;\": \"\\u2190\",\n\t\"LeftArrow;\": \"\\u2190\",\n\t\"Leftarrow;\": \"\\u21D0\",\n\t\"LeftArrowRightArrow;\": \"\\u21C6\",\n\t\"leftarrowtail;\": \"\\u21A2\",\n\t\"LeftCeiling;\": \"\\u2308\",\n\t\"LeftDoubleBracket;\": \"\\u27E6\",\n\t\"LeftDownTeeVector;\": \"\\u2961\",\n\t\"LeftDownVectorBar;\": \"\\u2959\",\n\t\"LeftDownVector;\": \"\\u21C3\",\n\t\"LeftFloor;\": \"\\u230A\",\n\t\"leftharpoondown;\": \"\\u21BD\",\n\t\"leftharpoonup;\": \"\\u21BC\",\n\t\"leftleftarrows;\": \"\\u21C7\",\n\t\"leftrightarrow;\": \"\\u2194\",\n\t\"LeftRightArrow;\": \"\\u2194\",\n\t\"Leftrightarrow;\": \"\\u21D4\",\n\t\"leftrightarrows;\": \"\\u21C6\",\n\t\"leftrightharpoons;\": \"\\u21CB\",\n\t\"leftrightsquigarrow;\": \"\\u21AD\",\n\t\"LeftRightVector;\": \"\\u294E\",\n\t\"LeftTeeArrow;\": \"\\u21A4\",\n\t\"LeftTee;\": \"\\u22A3\",\n\t\"LeftTeeVector;\": \"\\u295A\",\n\t\"leftthreetimes;\": \"\\u22CB\",\n\t\"LeftTriangleBar;\": \"\\u29CF\",\n\t\"LeftTriangle;\": \"\\u22B2\",\n\t\"LeftTriangleEqual;\": \"\\u22B4\",\n\t\"LeftUpDownVector;\": \"\\u2951\",\n\t\"LeftUpTeeVector;\": \"\\u2960\",\n\t\"LeftUpVectorBar;\": \"\\u2958\",\n\t\"LeftUpVector;\": \"\\u21BF\",\n\t\"LeftVectorBar;\": \"\\u2952\",\n\t\"LeftVector;\": \"\\u21BC\",\n\t\"lEg;\": \"\\u2A8B\",\n\t\"leg;\": \"\\u22DA\",\n\t\"leq;\": \"\\u2264\",\n\t\"leqq;\": \"\\u2266\",\n\t\"leqslant;\": \"\\u2A7D\",\n\t\"lescc;\": \"\\u2AA8\",\n\t\"les;\": \"\\u2A7D\",\n\t\"lesdot;\": \"\\u2A7F\",\n\t\"lesdoto;\": \"\\u2A81\",\n\t\"lesdotor;\": \"\\u2A83\",\n\t\"lesg;\": \"\\u22DA\\uFE00\",\n\t\"lesges;\": \"\\u2A93\",\n\t\"lessapprox;\": \"\\u2A85\",\n\t\"lessdot;\": \"\\u22D6\",\n\t\"lesseqgtr;\": \"\\u22DA\",\n\t\"lesseqqgtr;\": \"\\u2A8B\",\n\t\"LessEqualGreater;\": \"\\u22DA\",\n\t\"LessFullEqual;\": \"\\u2266\",\n\t\"LessGreater;\": \"\\u2276\",\n\t\"lessgtr;\": \"\\u2276\",\n\t\"LessLess;\": \"\\u2AA1\",\n\t\"lesssim;\": \"\\u2272\",\n\t\"LessSlantEqual;\": \"\\u2A7D\",\n\t\"LessTilde;\": \"\\u2272\",\n\t\"lfisht;\": \"\\u297C\",\n\t\"lfloor;\": \"\\u230A\",\n\t\"Lfr;\": \"\\uD835\\uDD0F\",\n\t\"lfr;\": \"\\uD835\\uDD29\",\n\t\"lg;\": \"\\u2276\",\n\t\"lgE;\": \"\\u2A91\",\n\t\"lHar;\": \"\\u2962\",\n\t\"lhard;\": \"\\u21BD\",\n\t\"lharu;\": \"\\u21BC\",\n\t\"lharul;\": \"\\u296A\",\n\t\"lhblk;\": \"\\u2584\",\n\t\"LJcy;\": \"\\u0409\",\n\t\"ljcy;\": \"\\u0459\",\n\t\"llarr;\": \"\\u21C7\",\n\t\"ll;\": \"\\u226A\",\n\t\"Ll;\": \"\\u22D8\",\n\t\"llcorner;\": \"\\u231E\",\n\t\"Lleftarrow;\": \"\\u21DA\",\n\t\"llhard;\": \"\\u296B\",\n\t\"lltri;\": \"\\u25FA\",\n\t\"Lmidot;\": \"\\u013F\",\n\t\"lmidot;\": \"\\u0140\",\n\t\"lmoustache;\": \"\\u23B0\",\n\t\"lmoust;\": \"\\u23B0\",\n\t\"lnap;\": \"\\u2A89\",\n\t\"lnapprox;\": \"\\u2A89\",\n\t\"lne;\": \"\\u2A87\",\n\t\"lnE;\": \"\\u2268\",\n\t\"lneq;\": \"\\u2A87\",\n\t\"lneqq;\": \"\\u2268\",\n\t\"lnsim;\": \"\\u22E6\",\n\t\"loang;\": \"\\u27EC\",\n\t\"loarr;\": \"\\u21FD\",\n\t\"lobrk;\": \"\\u27E6\",\n\t\"longleftarrow;\": \"\\u27F5\",\n\t\"LongLeftArrow;\": \"\\u27F5\",\n\t\"Longleftarrow;\": \"\\u27F8\",\n\t\"longleftrightarrow;\": \"\\u27F7\",\n\t\"LongLeftRightArrow;\": \"\\u27F7\",\n\t\"Longleftrightarrow;\": \"\\u27FA\",\n\t\"longmapsto;\": \"\\u27FC\",\n\t\"longrightarrow;\": \"\\u27F6\",\n\t\"LongRightArrow;\": \"\\u27F6\",\n\t\"Longrightarrow;\": \"\\u27F9\",\n\t\"looparrowleft;\": \"\\u21AB\",\n\t\"looparrowright;\": \"\\u21AC\",\n\t\"lopar;\": \"\\u2985\",\n\t\"Lopf;\": \"\\uD835\\uDD43\",\n\t\"lopf;\": \"\\uD835\\uDD5D\",\n\t\"loplus;\": \"\\u2A2D\",\n\t\"lotimes;\": \"\\u2A34\",\n\t\"lowast;\": \"\\u2217\",\n\t\"lowbar;\": \"\\u005F\",\n\t\"LowerLeftArrow;\": \"\\u2199\",\n\t\"LowerRightArrow;\": \"\\u2198\",\n\t\"loz;\": \"\\u25CA\",\n\t\"lozenge;\": \"\\u25CA\",\n\t\"lozf;\": \"\\u29EB\",\n\t\"lpar;\": \"\\u0028\",\n\t\"lparlt;\": \"\\u2993\",\n\t\"lrarr;\": \"\\u21C6\",\n\t\"lrcorner;\": \"\\u231F\",\n\t\"lrhar;\": \"\\u21CB\",\n\t\"lrhard;\": \"\\u296D\",\n\t\"lrm;\": \"\\u200E\",\n\t\"lrtri;\": \"\\u22BF\",\n\t\"lsaquo;\": \"\\u2039\",\n\t\"lscr;\": \"\\uD835\\uDCC1\",\n\t\"Lscr;\": \"\\u2112\",\n\t\"lsh;\": \"\\u21B0\",\n\t\"Lsh;\": \"\\u21B0\",\n\t\"lsim;\": \"\\u2272\",\n\t\"lsime;\": \"\\u2A8D\",\n\t\"lsimg;\": \"\\u2A8F\",\n\t\"lsqb;\": \"\\u005B\",\n\t\"lsquo;\": \"\\u2018\",\n\t\"lsquor;\": \"\\u201A\",\n\t\"Lstrok;\": \"\\u0141\",\n\t\"lstrok;\": \"\\u0142\",\n\t\"ltcc;\": \"\\u2AA6\",\n\t\"ltcir;\": \"\\u2A79\",\n\t\"lt;\": \"\\u003C\",\n\t\"lt\": \"\\u003C\",\n\t\"LT;\": \"\\u003C\",\n\t\"LT\": \"\\u003C\",\n\t\"Lt;\": \"\\u226A\",\n\t\"ltdot;\": \"\\u22D6\",\n\t\"lthree;\": \"\\u22CB\",\n\t\"ltimes;\": \"\\u22C9\",\n\t\"ltlarr;\": \"\\u2976\",\n\t\"ltquest;\": \"\\u2A7B\",\n\t\"ltri;\": \"\\u25C3\",\n\t\"ltrie;\": \"\\u22B4\",\n\t\"ltrif;\": \"\\u25C2\",\n\t\"ltrPar;\": \"\\u2996\",\n\t\"lurdshar;\": \"\\u294A\",\n\t\"luruhar;\": \"\\u2966\",\n\t\"lvertneqq;\": \"\\u2268\\uFE00\",\n\t\"lvnE;\": \"\\u2268\\uFE00\",\n\t\"macr;\": \"\\u00AF\",\n\t\"macr\": \"\\u00AF\",\n\t\"male;\": \"\\u2642\",\n\t\"malt;\": \"\\u2720\",\n\t\"maltese;\": \"\\u2720\",\n\t\"Map;\": \"\\u2905\",\n\t\"map;\": \"\\u21A6\",\n\t\"mapsto;\": \"\\u21A6\",\n\t\"mapstodown;\": \"\\u21A7\",\n\t\"mapstoleft;\": \"\\u21A4\",\n\t\"mapstoup;\": \"\\u21A5\",\n\t\"marker;\": \"\\u25AE\",\n\t\"mcomma;\": \"\\u2A29\",\n\t\"Mcy;\": \"\\u041C\",\n\t\"mcy;\": \"\\u043C\",\n\t\"mdash;\": \"\\u2014\",\n\t\"mDDot;\": \"\\u223A\",\n\t\"measuredangle;\": \"\\u2221\",\n\t\"MediumSpace;\": \"\\u205F\",\n\t\"Mellintrf;\": \"\\u2133\",\n\t\"Mfr;\": \"\\uD835\\uDD10\",\n\t\"mfr;\": \"\\uD835\\uDD2A\",\n\t\"mho;\": \"\\u2127\",\n\t\"micro;\": \"\\u00B5\",\n\t\"micro\": \"\\u00B5\",\n\t\"midast;\": \"\\u002A\",\n\t\"midcir;\": \"\\u2AF0\",\n\t\"mid;\": \"\\u2223\",\n\t\"middot;\": \"\\u00B7\",\n\t\"middot\": \"\\u00B7\",\n\t\"minusb;\": \"\\u229F\",\n\t\"minus;\": \"\\u2212\",\n\t\"minusd;\": \"\\u2238\",\n\t\"minusdu;\": \"\\u2A2A\",\n\t\"MinusPlus;\": \"\\u2213\",\n\t\"mlcp;\": \"\\u2ADB\",\n\t\"mldr;\": \"\\u2026\",\n\t\"mnplus;\": \"\\u2213\",\n\t\"models;\": \"\\u22A7\",\n\t\"Mopf;\": \"\\uD835\\uDD44\",\n\t\"mopf;\": \"\\uD835\\uDD5E\",\n\t\"mp;\": \"\\u2213\",\n\t\"mscr;\": \"\\uD835\\uDCC2\",\n\t\"Mscr;\": \"\\u2133\",\n\t\"mstpos;\": \"\\u223E\",\n\t\"Mu;\": \"\\u039C\",\n\t\"mu;\": \"\\u03BC\",\n\t\"multimap;\": \"\\u22B8\",\n\t\"mumap;\": \"\\u22B8\",\n\t\"nabla;\": \"\\u2207\",\n\t\"Nacute;\": \"\\u0143\",\n\t\"nacute;\": \"\\u0144\",\n\t\"nang;\": \"\\u2220\\u20D2\",\n\t\"nap;\": \"\\u2249\",\n\t\"napE;\": \"\\u2A70\\u0338\",\n\t\"napid;\": \"\\u224B\\u0338\",\n\t\"napos;\": \"\\u0149\",\n\t\"napprox;\": \"\\u2249\",\n\t\"natural;\": \"\\u266E\",\n\t\"naturals;\": \"\\u2115\",\n\t\"natur;\": \"\\u266E\",\n\t\"nbsp;\": \"\\u00A0\",\n\t\"nbsp\": \"\\u00A0\",\n\t\"nbump;\": \"\\u224E\\u0338\",\n\t\"nbumpe;\": \"\\u224F\\u0338\",\n\t\"ncap;\": \"\\u2A43\",\n\t\"Ncaron;\": \"\\u0147\",\n\t\"ncaron;\": \"\\u0148\",\n\t\"Ncedil;\": \"\\u0145\",\n\t\"ncedil;\": \"\\u0146\",\n\t\"ncong;\": \"\\u2247\",\n\t\"ncongdot;\": \"\\u2A6D\\u0338\",\n\t\"ncup;\": \"\\u2A42\",\n\t\"Ncy;\": \"\\u041D\",\n\t\"ncy;\": \"\\u043D\",\n\t\"ndash;\": \"\\u2013\",\n\t\"nearhk;\": \"\\u2924\",\n\t\"nearr;\": \"\\u2197\",\n\t\"neArr;\": \"\\u21D7\",\n\t\"nearrow;\": \"\\u2197\",\n\t\"ne;\": \"\\u2260\",\n\t\"nedot;\": \"\\u2250\\u0338\",\n\t\"NegativeMediumSpace;\": \"\\u200B\",\n\t\"NegativeThickSpace;\": \"\\u200B\",\n\t\"NegativeThinSpace;\": \"\\u200B\",\n\t\"NegativeVeryThinSpace;\": \"\\u200B\",\n\t\"nequiv;\": \"\\u2262\",\n\t\"nesear;\": \"\\u2928\",\n\t\"nesim;\": \"\\u2242\\u0338\",\n\t\"NestedGreaterGreater;\": \"\\u226B\",\n\t\"NestedLessLess;\": \"\\u226A\",\n\t\"NewLine;\": \"\\u000A\",\n\t\"nexist;\": \"\\u2204\",\n\t\"nexists;\": \"\\u2204\",\n\t\"Nfr;\": \"\\uD835\\uDD11\",\n\t\"nfr;\": \"\\uD835\\uDD2B\",\n\t\"ngE;\": \"\\u2267\\u0338\",\n\t\"nge;\": \"\\u2271\",\n\t\"ngeq;\": \"\\u2271\",\n\t\"ngeqq;\": \"\\u2267\\u0338\",\n\t\"ngeqslant;\": \"\\u2A7E\\u0338\",\n\t\"nges;\": \"\\u2A7E\\u0338\",\n\t\"nGg;\": \"\\u22D9\\u0338\",\n\t\"ngsim;\": \"\\u2275\",\n\t\"nGt;\": \"\\u226B\\u20D2\",\n\t\"ngt;\": \"\\u226F\",\n\t\"ngtr;\": \"\\u226F\",\n\t\"nGtv;\": \"\\u226B\\u0338\",\n\t\"nharr;\": \"\\u21AE\",\n\t\"nhArr;\": \"\\u21CE\",\n\t\"nhpar;\": \"\\u2AF2\",\n\t\"ni;\": \"\\u220B\",\n\t\"nis;\": \"\\u22FC\",\n\t\"nisd;\": \"\\u22FA\",\n\t\"niv;\": \"\\u220B\",\n\t\"NJcy;\": \"\\u040A\",\n\t\"njcy;\": \"\\u045A\",\n\t\"nlarr;\": \"\\u219A\",\n\t\"nlArr;\": \"\\u21CD\",\n\t\"nldr;\": \"\\u2025\",\n\t\"nlE;\": \"\\u2266\\u0338\",\n\t\"nle;\": \"\\u2270\",\n\t\"nleftarrow;\": \"\\u219A\",\n\t\"nLeftarrow;\": \"\\u21CD\",\n\t\"nleftrightarrow;\": \"\\u21AE\",\n\t\"nLeftrightarrow;\": \"\\u21CE\",\n\t\"nleq;\": \"\\u2270\",\n\t\"nleqq;\": \"\\u2266\\u0338\",\n\t\"nleqslant;\": \"\\u2A7D\\u0338\",\n\t\"nles;\": \"\\u2A7D\\u0338\",\n\t\"nless;\": \"\\u226E\",\n\t\"nLl;\": \"\\u22D8\\u0338\",\n\t\"nlsim;\": \"\\u2274\",\n\t\"nLt;\": \"\\u226A\\u20D2\",\n\t\"nlt;\": \"\\u226E\",\n\t\"nltri;\": \"\\u22EA\",\n\t\"nltrie;\": \"\\u22EC\",\n\t\"nLtv;\": \"\\u226A\\u0338\",\n\t\"nmid;\": \"\\u2224\",\n\t\"NoBreak;\": \"\\u2060\",\n\t\"NonBreakingSpace;\": \"\\u00A0\",\n\t\"nopf;\": \"\\uD835\\uDD5F\",\n\t\"Nopf;\": \"\\u2115\",\n\t\"Not;\": \"\\u2AEC\",\n\t\"not;\": \"\\u00AC\",\n\t\"not\": \"\\u00AC\",\n\t\"NotCongruent;\": \"\\u2262\",\n\t\"NotCupCap;\": \"\\u226D\",\n\t\"NotDoubleVerticalBar;\": \"\\u2226\",\n\t\"NotElement;\": \"\\u2209\",\n\t\"NotEqual;\": \"\\u2260\",\n\t\"NotEqualTilde;\": \"\\u2242\\u0338\",\n\t\"NotExists;\": \"\\u2204\",\n\t\"NotGreater;\": \"\\u226F\",\n\t\"NotGreaterEqual;\": \"\\u2271\",\n\t\"NotGreaterFullEqual;\": \"\\u2267\\u0338\",\n\t\"NotGreaterGreater;\": \"\\u226B\\u0338\",\n\t\"NotGreaterLess;\": \"\\u2279\",\n\t\"NotGreaterSlantEqual;\": \"\\u2A7E\\u0338\",\n\t\"NotGreaterTilde;\": \"\\u2275\",\n\t\"NotHumpDownHump;\": \"\\u224E\\u0338\",\n\t\"NotHumpEqual;\": \"\\u224F\\u0338\",\n\t\"notin;\": \"\\u2209\",\n\t\"notindot;\": \"\\u22F5\\u0338\",\n\t\"notinE;\": \"\\u22F9\\u0338\",\n\t\"notinva;\": \"\\u2209\",\n\t\"notinvb;\": \"\\u22F7\",\n\t\"notinvc;\": \"\\u22F6\",\n\t\"NotLeftTriangleBar;\": \"\\u29CF\\u0338\",\n\t\"NotLeftTriangle;\": \"\\u22EA\",\n\t\"NotLeftTriangleEqual;\": \"\\u22EC\",\n\t\"NotLess;\": \"\\u226E\",\n\t\"NotLessEqual;\": \"\\u2270\",\n\t\"NotLessGreater;\": \"\\u2278\",\n\t\"NotLessLess;\": \"\\u226A\\u0338\",\n\t\"NotLessSlantEqual;\": \"\\u2A7D\\u0338\",\n\t\"NotLessTilde;\": \"\\u2274\",\n\t\"NotNestedGreaterGreater;\": \"\\u2AA2\\u0338\",\n\t\"NotNestedLessLess;\": \"\\u2AA1\\u0338\",\n\t\"notni;\": \"\\u220C\",\n\t\"notniva;\": \"\\u220C\",\n\t\"notnivb;\": \"\\u22FE\",\n\t\"notnivc;\": \"\\u22FD\",\n\t\"NotPrecedes;\": \"\\u2280\",\n\t\"NotPrecedesEqual;\": \"\\u2AAF\\u0338\",\n\t\"NotPrecedesSlantEqual;\": \"\\u22E0\",\n\t\"NotReverseElement;\": \"\\u220C\",\n\t\"NotRightTriangleBar;\": \"\\u29D0\\u0338\",\n\t\"NotRightTriangle;\": \"\\u22EB\",\n\t\"NotRightTriangleEqual;\": \"\\u22ED\",\n\t\"NotSquareSubset;\": \"\\u228F\\u0338\",\n\t\"NotSquareSubsetEqual;\": \"\\u22E2\",\n\t\"NotSquareSuperset;\": \"\\u2290\\u0338\",\n\t\"NotSquareSupersetEqual;\": \"\\u22E3\",\n\t\"NotSubset;\": \"\\u2282\\u20D2\",\n\t\"NotSubsetEqual;\": \"\\u2288\",\n\t\"NotSucceeds;\": \"\\u2281\",\n\t\"NotSucceedsEqual;\": \"\\u2AB0\\u0338\",\n\t\"NotSucceedsSlantEqual;\": \"\\u22E1\",\n\t\"NotSucceedsTilde;\": \"\\u227F\\u0338\",\n\t\"NotSuperset;\": \"\\u2283\\u20D2\",\n\t\"NotSupersetEqual;\": \"\\u2289\",\n\t\"NotTilde;\": \"\\u2241\",\n\t\"NotTildeEqual;\": \"\\u2244\",\n\t\"NotTildeFullEqual;\": \"\\u2247\",\n\t\"NotTildeTilde;\": \"\\u2249\",\n\t\"NotVerticalBar;\": \"\\u2224\",\n\t\"nparallel;\": \"\\u2226\",\n\t\"npar;\": \"\\u2226\",\n\t\"nparsl;\": \"\\u2AFD\\u20E5\",\n\t\"npart;\": \"\\u2202\\u0338\",\n\t\"npolint;\": \"\\u2A14\",\n\t\"npr;\": \"\\u2280\",\n\t\"nprcue;\": \"\\u22E0\",\n\t\"nprec;\": \"\\u2280\",\n\t\"npreceq;\": \"\\u2AAF\\u0338\",\n\t\"npre;\": \"\\u2AAF\\u0338\",\n\t\"nrarrc;\": \"\\u2933\\u0338\",\n\t\"nrarr;\": \"\\u219B\",\n\t\"nrArr;\": \"\\u21CF\",\n\t\"nrarrw;\": \"\\u219D\\u0338\",\n\t\"nrightarrow;\": \"\\u219B\",\n\t\"nRightarrow;\": \"\\u21CF\",\n\t\"nrtri;\": \"\\u22EB\",\n\t\"nrtrie;\": \"\\u22ED\",\n\t\"nsc;\": \"\\u2281\",\n\t\"nsccue;\": \"\\u22E1\",\n\t\"nsce;\": \"\\u2AB0\\u0338\",\n\t\"Nscr;\": \"\\uD835\\uDCA9\",\n\t\"nscr;\": \"\\uD835\\uDCC3\",\n\t\"nshortmid;\": \"\\u2224\",\n\t\"nshortparallel;\": \"\\u2226\",\n\t\"nsim;\": \"\\u2241\",\n\t\"nsime;\": \"\\u2244\",\n\t\"nsimeq;\": \"\\u2244\",\n\t\"nsmid;\": \"\\u2224\",\n\t\"nspar;\": \"\\u2226\",\n\t\"nsqsube;\": \"\\u22E2\",\n\t\"nsqsupe;\": \"\\u22E3\",\n\t\"nsub;\": \"\\u2284\",\n\t\"nsubE;\": \"\\u2AC5\\u0338\",\n\t\"nsube;\": \"\\u2288\",\n\t\"nsubset;\": \"\\u2282\\u20D2\",\n\t\"nsubseteq;\": \"\\u2288\",\n\t\"nsubseteqq;\": \"\\u2AC5\\u0338\",\n\t\"nsucc;\": \"\\u2281\",\n\t\"nsucceq;\": \"\\u2AB0\\u0338\",\n\t\"nsup;\": \"\\u2285\",\n\t\"nsupE;\": \"\\u2AC6\\u0338\",\n\t\"nsupe;\": \"\\u2289\",\n\t\"nsupset;\": \"\\u2283\\u20D2\",\n\t\"nsupseteq;\": \"\\u2289\",\n\t\"nsupseteqq;\": \"\\u2AC6\\u0338\",\n\t\"ntgl;\": \"\\u2279\",\n\t\"Ntilde;\": \"\\u00D1\",\n\t\"Ntilde\": \"\\u00D1\",\n\t\"ntilde;\": \"\\u00F1\",\n\t\"ntilde\": \"\\u00F1\",\n\t\"ntlg;\": \"\\u2278\",\n\t\"ntriangleleft;\": \"\\u22EA\",\n\t\"ntrianglelefteq;\": \"\\u22EC\",\n\t\"ntriangleright;\": \"\\u22EB\",\n\t\"ntrianglerighteq;\": \"\\u22ED\",\n\t\"Nu;\": \"\\u039D\",\n\t\"nu;\": \"\\u03BD\",\n\t\"num;\": \"\\u0023\",\n\t\"numero;\": \"\\u2116\",\n\t\"numsp;\": \"\\u2007\",\n\t\"nvap;\": \"\\u224D\\u20D2\",\n\t\"nvdash;\": \"\\u22AC\",\n\t\"nvDash;\": \"\\u22AD\",\n\t\"nVdash;\": \"\\u22AE\",\n\t\"nVDash;\": \"\\u22AF\",\n\t\"nvge;\": \"\\u2265\\u20D2\",\n\t\"nvgt;\": \"\\u003E\\u20D2\",\n\t\"nvHarr;\": \"\\u2904\",\n\t\"nvinfin;\": \"\\u29DE\",\n\t\"nvlArr;\": \"\\u2902\",\n\t\"nvle;\": \"\\u2264\\u20D2\",\n\t\"nvlt;\": \"\\u003C\\u20D2\",\n\t\"nvltrie;\": \"\\u22B4\\u20D2\",\n\t\"nvrArr;\": \"\\u2903\",\n\t\"nvrtrie;\": \"\\u22B5\\u20D2\",\n\t\"nvsim;\": \"\\u223C\\u20D2\",\n\t\"nwarhk;\": \"\\u2923\",\n\t\"nwarr;\": \"\\u2196\",\n\t\"nwArr;\": \"\\u21D6\",\n\t\"nwarrow;\": \"\\u2196\",\n\t\"nwnear;\": \"\\u2927\",\n\t\"Oacute;\": \"\\u00D3\",\n\t\"Oacute\": \"\\u00D3\",\n\t\"oacute;\": \"\\u00F3\",\n\t\"oacute\": \"\\u00F3\",\n\t\"oast;\": \"\\u229B\",\n\t\"Ocirc;\": \"\\u00D4\",\n\t\"Ocirc\": \"\\u00D4\",\n\t\"ocirc;\": \"\\u00F4\",\n\t\"ocirc\": \"\\u00F4\",\n\t\"ocir;\": \"\\u229A\",\n\t\"Ocy;\": \"\\u041E\",\n\t\"ocy;\": \"\\u043E\",\n\t\"odash;\": \"\\u229D\",\n\t\"Odblac;\": \"\\u0150\",\n\t\"odblac;\": \"\\u0151\",\n\t\"odiv;\": \"\\u2A38\",\n\t\"odot;\": \"\\u2299\",\n\t\"odsold;\": \"\\u29BC\",\n\t\"OElig;\": \"\\u0152\",\n\t\"oelig;\": \"\\u0153\",\n\t\"ofcir;\": \"\\u29BF\",\n\t\"Ofr;\": \"\\uD835\\uDD12\",\n\t\"ofr;\": \"\\uD835\\uDD2C\",\n\t\"ogon;\": \"\\u02DB\",\n\t\"Ograve;\": \"\\u00D2\",\n\t\"Ograve\": \"\\u00D2\",\n\t\"ograve;\": \"\\u00F2\",\n\t\"ograve\": \"\\u00F2\",\n\t\"ogt;\": \"\\u29C1\",\n\t\"ohbar;\": \"\\u29B5\",\n\t\"ohm;\": \"\\u03A9\",\n\t\"oint;\": \"\\u222E\",\n\t\"olarr;\": \"\\u21BA\",\n\t\"olcir;\": \"\\u29BE\",\n\t\"olcross;\": \"\\u29BB\",\n\t\"oline;\": \"\\u203E\",\n\t\"olt;\": \"\\u29C0\",\n\t\"Omacr;\": \"\\u014C\",\n\t\"omacr;\": \"\\u014D\",\n\t\"Omega;\": \"\\u03A9\",\n\t\"omega;\": \"\\u03C9\",\n\t\"Omicron;\": \"\\u039F\",\n\t\"omicron;\": \"\\u03BF\",\n\t\"omid;\": \"\\u29B6\",\n\t\"ominus;\": \"\\u2296\",\n\t\"Oopf;\": \"\\uD835\\uDD46\",\n\t\"oopf;\": \"\\uD835\\uDD60\",\n\t\"opar;\": \"\\u29B7\",\n\t\"OpenCurlyDoubleQuote;\": \"\\u201C\",\n\t\"OpenCurlyQuote;\": \"\\u2018\",\n\t\"operp;\": \"\\u29B9\",\n\t\"oplus;\": \"\\u2295\",\n\t\"orarr;\": \"\\u21BB\",\n\t\"Or;\": \"\\u2A54\",\n\t\"or;\": \"\\u2228\",\n\t\"ord;\": \"\\u2A5D\",\n\t\"order;\": \"\\u2134\",\n\t\"orderof;\": \"\\u2134\",\n\t\"ordf;\": \"\\u00AA\",\n\t\"ordf\": \"\\u00AA\",\n\t\"ordm;\": \"\\u00BA\",\n\t\"ordm\": \"\\u00BA\",\n\t\"origof;\": \"\\u22B6\",\n\t\"oror;\": \"\\u2A56\",\n\t\"orslope;\": \"\\u2A57\",\n\t\"orv;\": \"\\u2A5B\",\n\t\"oS;\": \"\\u24C8\",\n\t\"Oscr;\": \"\\uD835\\uDCAA\",\n\t\"oscr;\": \"\\u2134\",\n\t\"Oslash;\": \"\\u00D8\",\n\t\"Oslash\": \"\\u00D8\",\n\t\"oslash;\": \"\\u00F8\",\n\t\"oslash\": \"\\u00F8\",\n\t\"osol;\": \"\\u2298\",\n\t\"Otilde;\": \"\\u00D5\",\n\t\"Otilde\": \"\\u00D5\",\n\t\"otilde;\": \"\\u00F5\",\n\t\"otilde\": \"\\u00F5\",\n\t\"otimesas;\": \"\\u2A36\",\n\t\"Otimes;\": \"\\u2A37\",\n\t\"otimes;\": \"\\u2297\",\n\t\"Ouml;\": \"\\u00D6\",\n\t\"Ouml\": \"\\u00D6\",\n\t\"ouml;\": \"\\u00F6\",\n\t\"ouml\": \"\\u00F6\",\n\t\"ovbar;\": \"\\u233D\",\n\t\"OverBar;\": \"\\u203E\",\n\t\"OverBrace;\": \"\\u23DE\",\n\t\"OverBracket;\": \"\\u23B4\",\n\t\"OverParenthesis;\": \"\\u23DC\",\n\t\"para;\": \"\\u00B6\",\n\t\"para\": \"\\u00B6\",\n\t\"parallel;\": \"\\u2225\",\n\t\"par;\": \"\\u2225\",\n\t\"parsim;\": \"\\u2AF3\",\n\t\"parsl;\": \"\\u2AFD\",\n\t\"part;\": \"\\u2202\",\n\t\"PartialD;\": \"\\u2202\",\n\t\"Pcy;\": \"\\u041F\",\n\t\"pcy;\": \"\\u043F\",\n\t\"percnt;\": \"\\u0025\",\n\t\"period;\": \"\\u002E\",\n\t\"permil;\": \"\\u2030\",\n\t\"perp;\": \"\\u22A5\",\n\t\"pertenk;\": \"\\u2031\",\n\t\"Pfr;\": \"\\uD835\\uDD13\",\n\t\"pfr;\": \"\\uD835\\uDD2D\",\n\t\"Phi;\": \"\\u03A6\",\n\t\"phi;\": \"\\u03C6\",\n\t\"phiv;\": \"\\u03D5\",\n\t\"phmmat;\": \"\\u2133\",\n\t\"phone;\": \"\\u260E\",\n\t\"Pi;\": \"\\u03A0\",\n\t\"pi;\": \"\\u03C0\",\n\t\"pitchfork;\": \"\\u22D4\",\n\t\"piv;\": \"\\u03D6\",\n\t\"planck;\": \"\\u210F\",\n\t\"planckh;\": \"\\u210E\",\n\t\"plankv;\": \"\\u210F\",\n\t\"plusacir;\": \"\\u2A23\",\n\t\"plusb;\": \"\\u229E\",\n\t\"pluscir;\": \"\\u2A22\",\n\t\"plus;\": \"\\u002B\",\n\t\"plusdo;\": \"\\u2214\",\n\t\"plusdu;\": \"\\u2A25\",\n\t\"pluse;\": \"\\u2A72\",\n\t\"PlusMinus;\": \"\\u00B1\",\n\t\"plusmn;\": \"\\u00B1\",\n\t\"plusmn\": \"\\u00B1\",\n\t\"plussim;\": \"\\u2A26\",\n\t\"plustwo;\": \"\\u2A27\",\n\t\"pm;\": \"\\u00B1\",\n\t\"Poincareplane;\": \"\\u210C\",\n\t\"pointint;\": \"\\u2A15\",\n\t\"popf;\": \"\\uD835\\uDD61\",\n\t\"Popf;\": \"\\u2119\",\n\t\"pound;\": \"\\u00A3\",\n\t\"pound\": \"\\u00A3\",\n\t\"prap;\": \"\\u2AB7\",\n\t\"Pr;\": \"\\u2ABB\",\n\t\"pr;\": \"\\u227A\",\n\t\"prcue;\": \"\\u227C\",\n\t\"precapprox;\": \"\\u2AB7\",\n\t\"prec;\": \"\\u227A\",\n\t\"preccurlyeq;\": \"\\u227C\",\n\t\"Precedes;\": \"\\u227A\",\n\t\"PrecedesEqual;\": \"\\u2AAF\",\n\t\"PrecedesSlantEqual;\": \"\\u227C\",\n\t\"PrecedesTilde;\": \"\\u227E\",\n\t\"preceq;\": \"\\u2AAF\",\n\t\"precnapprox;\": \"\\u2AB9\",\n\t\"precneqq;\": \"\\u2AB5\",\n\t\"precnsim;\": \"\\u22E8\",\n\t\"pre;\": \"\\u2AAF\",\n\t\"prE;\": \"\\u2AB3\",\n\t\"precsim;\": \"\\u227E\",\n\t\"prime;\": \"\\u2032\",\n\t\"Prime;\": \"\\u2033\",\n\t\"primes;\": \"\\u2119\",\n\t\"prnap;\": \"\\u2AB9\",\n\t\"prnE;\": \"\\u2AB5\",\n\t\"prnsim;\": \"\\u22E8\",\n\t\"prod;\": \"\\u220F\",\n\t\"Product;\": \"\\u220F\",\n\t\"profalar;\": \"\\u232E\",\n\t\"profline;\": \"\\u2312\",\n\t\"profsurf;\": \"\\u2313\",\n\t\"prop;\": \"\\u221D\",\n\t\"Proportional;\": \"\\u221D\",\n\t\"Proportion;\": \"\\u2237\",\n\t\"propto;\": \"\\u221D\",\n\t\"prsim;\": \"\\u227E\",\n\t\"prurel;\": \"\\u22B0\",\n\t\"Pscr;\": \"\\uD835\\uDCAB\",\n\t\"pscr;\": \"\\uD835\\uDCC5\",\n\t\"Psi;\": \"\\u03A8\",\n\t\"psi;\": \"\\u03C8\",\n\t\"puncsp;\": \"\\u2008\",\n\t\"Qfr;\": \"\\uD835\\uDD14\",\n\t\"qfr;\": \"\\uD835\\uDD2E\",\n\t\"qint;\": \"\\u2A0C\",\n\t\"qopf;\": \"\\uD835\\uDD62\",\n\t\"Qopf;\": \"\\u211A\",\n\t\"qprime;\": \"\\u2057\",\n\t\"Qscr;\": \"\\uD835\\uDCAC\",\n\t\"qscr;\": \"\\uD835\\uDCC6\",\n\t\"quaternions;\": \"\\u210D\",\n\t\"quatint;\": \"\\u2A16\",\n\t\"quest;\": \"\\u003F\",\n\t\"questeq;\": \"\\u225F\",\n\t\"quot;\": \"\\u0022\",\n\t\"quot\": \"\\u0022\",\n\t\"QUOT;\": \"\\u0022\",\n\t\"QUOT\": \"\\u0022\",\n\t\"rAarr;\": \"\\u21DB\",\n\t\"race;\": \"\\u223D\\u0331\",\n\t\"Racute;\": \"\\u0154\",\n\t\"racute;\": \"\\u0155\",\n\t\"radic;\": \"\\u221A\",\n\t\"raemptyv;\": \"\\u29B3\",\n\t\"rang;\": \"\\u27E9\",\n\t\"Rang;\": \"\\u27EB\",\n\t\"rangd;\": \"\\u2992\",\n\t\"range;\": \"\\u29A5\",\n\t\"rangle;\": \"\\u27E9\",\n\t\"raquo;\": \"\\u00BB\",\n\t\"raquo\": \"\\u00BB\",\n\t\"rarrap;\": \"\\u2975\",\n\t\"rarrb;\": \"\\u21E5\",\n\t\"rarrbfs;\": \"\\u2920\",\n\t\"rarrc;\": \"\\u2933\",\n\t\"rarr;\": \"\\u2192\",\n\t\"Rarr;\": \"\\u21A0\",\n\t\"rArr;\": \"\\u21D2\",\n\t\"rarrfs;\": \"\\u291E\",\n\t\"rarrhk;\": \"\\u21AA\",\n\t\"rarrlp;\": \"\\u21AC\",\n\t\"rarrpl;\": \"\\u2945\",\n\t\"rarrsim;\": \"\\u2974\",\n\t\"Rarrtl;\": \"\\u2916\",\n\t\"rarrtl;\": \"\\u21A3\",\n\t\"rarrw;\": \"\\u219D\",\n\t\"ratail;\": \"\\u291A\",\n\t\"rAtail;\": \"\\u291C\",\n\t\"ratio;\": \"\\u2236\",\n\t\"rationals;\": \"\\u211A\",\n\t\"rbarr;\": \"\\u290D\",\n\t\"rBarr;\": \"\\u290F\",\n\t\"RBarr;\": \"\\u2910\",\n\t\"rbbrk;\": \"\\u2773\",\n\t\"rbrace;\": \"\\u007D\",\n\t\"rbrack;\": \"\\u005D\",\n\t\"rbrke;\": \"\\u298C\",\n\t\"rbrksld;\": \"\\u298E\",\n\t\"rbrkslu;\": \"\\u2990\",\n\t\"Rcaron;\": \"\\u0158\",\n\t\"rcaron;\": \"\\u0159\",\n\t\"Rcedil;\": \"\\u0156\",\n\t\"rcedil;\": \"\\u0157\",\n\t\"rceil;\": \"\\u2309\",\n\t\"rcub;\": \"\\u007D\",\n\t\"Rcy;\": \"\\u0420\",\n\t\"rcy;\": \"\\u0440\",\n\t\"rdca;\": \"\\u2937\",\n\t\"rdldhar;\": \"\\u2969\",\n\t\"rdquo;\": \"\\u201D\",\n\t\"rdquor;\": \"\\u201D\",\n\t\"rdsh;\": \"\\u21B3\",\n\t\"real;\": \"\\u211C\",\n\t\"realine;\": \"\\u211B\",\n\t\"realpart;\": \"\\u211C\",\n\t\"reals;\": \"\\u211D\",\n\t\"Re;\": \"\\u211C\",\n\t\"rect;\": \"\\u25AD\",\n\t\"reg;\": \"\\u00AE\",\n\t\"reg\": \"\\u00AE\",\n\t\"REG;\": \"\\u00AE\",\n\t\"REG\": \"\\u00AE\",\n\t\"ReverseElement;\": \"\\u220B\",\n\t\"ReverseEquilibrium;\": \"\\u21CB\",\n\t\"ReverseUpEquilibrium;\": \"\\u296F\",\n\t\"rfisht;\": \"\\u297D\",\n\t\"rfloor;\": \"\\u230B\",\n\t\"rfr;\": \"\\uD835\\uDD2F\",\n\t\"Rfr;\": \"\\u211C\",\n\t\"rHar;\": \"\\u2964\",\n\t\"rhard;\": \"\\u21C1\",\n\t\"rharu;\": \"\\u21C0\",\n\t\"rharul;\": \"\\u296C\",\n\t\"Rho;\": \"\\u03A1\",\n\t\"rho;\": \"\\u03C1\",\n\t\"rhov;\": \"\\u03F1\",\n\t\"RightAngleBracket;\": \"\\u27E9\",\n\t\"RightArrowBar;\": \"\\u21E5\",\n\t\"rightarrow;\": \"\\u2192\",\n\t\"RightArrow;\": \"\\u2192\",\n\t\"Rightarrow;\": \"\\u21D2\",\n\t\"RightArrowLeftArrow;\": \"\\u21C4\",\n\t\"rightarrowtail;\": \"\\u21A3\",\n\t\"RightCeiling;\": \"\\u2309\",\n\t\"RightDoubleBracket;\": \"\\u27E7\",\n\t\"RightDownTeeVector;\": \"\\u295D\",\n\t\"RightDownVectorBar;\": \"\\u2955\",\n\t\"RightDownVector;\": \"\\u21C2\",\n\t\"RightFloor;\": \"\\u230B\",\n\t\"rightharpoondown;\": \"\\u21C1\",\n\t\"rightharpoonup;\": \"\\u21C0\",\n\t\"rightleftarrows;\": \"\\u21C4\",\n\t\"rightleftharpoons;\": \"\\u21CC\",\n\t\"rightrightarrows;\": \"\\u21C9\",\n\t\"rightsquigarrow;\": \"\\u219D\",\n\t\"RightTeeArrow;\": \"\\u21A6\",\n\t\"RightTee;\": \"\\u22A2\",\n\t\"RightTeeVector;\": \"\\u295B\",\n\t\"rightthreetimes;\": \"\\u22CC\",\n\t\"RightTriangleBar;\": \"\\u29D0\",\n\t\"RightTriangle;\": \"\\u22B3\",\n\t\"RightTriangleEqual;\": \"\\u22B5\",\n\t\"RightUpDownVector;\": \"\\u294F\",\n\t\"RightUpTeeVector;\": \"\\u295C\",\n\t\"RightUpVectorBar;\": \"\\u2954\",\n\t\"RightUpVector;\": \"\\u21BE\",\n\t\"RightVectorBar;\": \"\\u2953\",\n\t\"RightVector;\": \"\\u21C0\",\n\t\"ring;\": \"\\u02DA\",\n\t\"risingdotseq;\": \"\\u2253\",\n\t\"rlarr;\": \"\\u21C4\",\n\t\"rlhar;\": \"\\u21CC\",\n\t\"rlm;\": \"\\u200F\",\n\t\"rmoustache;\": \"\\u23B1\",\n\t\"rmoust;\": \"\\u23B1\",\n\t\"rnmid;\": \"\\u2AEE\",\n\t\"roang;\": \"\\u27ED\",\n\t\"roarr;\": \"\\u21FE\",\n\t\"robrk;\": \"\\u27E7\",\n\t\"ropar;\": \"\\u2986\",\n\t\"ropf;\": \"\\uD835\\uDD63\",\n\t\"Ropf;\": \"\\u211D\",\n\t\"roplus;\": \"\\u2A2E\",\n\t\"rotimes;\": \"\\u2A35\",\n\t\"RoundImplies;\": \"\\u2970\",\n\t\"rpar;\": \"\\u0029\",\n\t\"rpargt;\": \"\\u2994\",\n\t\"rppolint;\": \"\\u2A12\",\n\t\"rrarr;\": \"\\u21C9\",\n\t\"Rrightarrow;\": \"\\u21DB\",\n\t\"rsaquo;\": \"\\u203A\",\n\t\"rscr;\": \"\\uD835\\uDCC7\",\n\t\"Rscr;\": \"\\u211B\",\n\t\"rsh;\": \"\\u21B1\",\n\t\"Rsh;\": \"\\u21B1\",\n\t\"rsqb;\": \"\\u005D\",\n\t\"rsquo;\": \"\\u2019\",\n\t\"rsquor;\": \"\\u2019\",\n\t\"rthree;\": \"\\u22CC\",\n\t\"rtimes;\": \"\\u22CA\",\n\t\"rtri;\": \"\\u25B9\",\n\t\"rtrie;\": \"\\u22B5\",\n\t\"rtrif;\": \"\\u25B8\",\n\t\"rtriltri;\": \"\\u29CE\",\n\t\"RuleDelayed;\": \"\\u29F4\",\n\t\"ruluhar;\": \"\\u2968\",\n\t\"rx;\": \"\\u211E\",\n\t\"Sacute;\": \"\\u015A\",\n\t\"sacute;\": \"\\u015B\",\n\t\"sbquo;\": \"\\u201A\",\n\t\"scap;\": \"\\u2AB8\",\n\t\"Scaron;\": \"\\u0160\",\n\t\"scaron;\": \"\\u0161\",\n\t\"Sc;\": \"\\u2ABC\",\n\t\"sc;\": \"\\u227B\",\n\t\"sccue;\": \"\\u227D\",\n\t\"sce;\": \"\\u2AB0\",\n\t\"scE;\": \"\\u2AB4\",\n\t\"Scedil;\": \"\\u015E\",\n\t\"scedil;\": \"\\u015F\",\n\t\"Scirc;\": \"\\u015C\",\n\t\"scirc;\": \"\\u015D\",\n\t\"scnap;\": \"\\u2ABA\",\n\t\"scnE;\": \"\\u2AB6\",\n\t\"scnsim;\": \"\\u22E9\",\n\t\"scpolint;\": \"\\u2A13\",\n\t\"scsim;\": \"\\u227F\",\n\t\"Scy;\": \"\\u0421\",\n\t\"scy;\": \"\\u0441\",\n\t\"sdotb;\": \"\\u22A1\",\n\t\"sdot;\": \"\\u22C5\",\n\t\"sdote;\": \"\\u2A66\",\n\t\"searhk;\": \"\\u2925\",\n\t\"searr;\": \"\\u2198\",\n\t\"seArr;\": \"\\u21D8\",\n\t\"searrow;\": \"\\u2198\",\n\t\"sect;\": \"\\u00A7\",\n\t\"sect\": \"\\u00A7\",\n\t\"semi;\": \"\\u003B\",\n\t\"seswar;\": \"\\u2929\",\n\t\"setminus;\": \"\\u2216\",\n\t\"setmn;\": \"\\u2216\",\n\t\"sext;\": \"\\u2736\",\n\t\"Sfr;\": \"\\uD835\\uDD16\",\n\t\"sfr;\": \"\\uD835\\uDD30\",\n\t\"sfrown;\": \"\\u2322\",\n\t\"sharp;\": \"\\u266F\",\n\t\"SHCHcy;\": \"\\u0429\",\n\t\"shchcy;\": \"\\u0449\",\n\t\"SHcy;\": \"\\u0428\",\n\t\"shcy;\": \"\\u0448\",\n\t\"ShortDownArrow;\": \"\\u2193\",\n\t\"ShortLeftArrow;\": \"\\u2190\",\n\t\"shortmid;\": \"\\u2223\",\n\t\"shortparallel;\": \"\\u2225\",\n\t\"ShortRightArrow;\": \"\\u2192\",\n\t\"ShortUpArrow;\": \"\\u2191\",\n\t\"shy;\": \"\\u00AD\",\n\t\"shy\": \"\\u00AD\",\n\t\"Sigma;\": \"\\u03A3\",\n\t\"sigma;\": \"\\u03C3\",\n\t\"sigmaf;\": \"\\u03C2\",\n\t\"sigmav;\": \"\\u03C2\",\n\t\"sim;\": \"\\u223C\",\n\t\"simdot;\": \"\\u2A6A\",\n\t\"sime;\": \"\\u2243\",\n\t\"simeq;\": \"\\u2243\",\n\t\"simg;\": \"\\u2A9E\",\n\t\"simgE;\": \"\\u2AA0\",\n\t\"siml;\": \"\\u2A9D\",\n\t\"simlE;\": \"\\u2A9F\",\n\t\"simne;\": \"\\u2246\",\n\t\"simplus;\": \"\\u2A24\",\n\t\"simrarr;\": \"\\u2972\",\n\t\"slarr;\": \"\\u2190\",\n\t\"SmallCircle;\": \"\\u2218\",\n\t\"smallsetminus;\": \"\\u2216\",\n\t\"smashp;\": \"\\u2A33\",\n\t\"smeparsl;\": \"\\u29E4\",\n\t\"smid;\": \"\\u2223\",\n\t\"smile;\": \"\\u2323\",\n\t\"smt;\": \"\\u2AAA\",\n\t\"smte;\": \"\\u2AAC\",\n\t\"smtes;\": \"\\u2AAC\\uFE00\",\n\t\"SOFTcy;\": \"\\u042C\",\n\t\"softcy;\": \"\\u044C\",\n\t\"solbar;\": \"\\u233F\",\n\t\"solb;\": \"\\u29C4\",\n\t\"sol;\": \"\\u002F\",\n\t\"Sopf;\": \"\\uD835\\uDD4A\",\n\t\"sopf;\": \"\\uD835\\uDD64\",\n\t\"spades;\": \"\\u2660\",\n\t\"spadesuit;\": \"\\u2660\",\n\t\"spar;\": \"\\u2225\",\n\t\"sqcap;\": \"\\u2293\",\n\t\"sqcaps;\": \"\\u2293\\uFE00\",\n\t\"sqcup;\": \"\\u2294\",\n\t\"sqcups;\": \"\\u2294\\uFE00\",\n\t\"Sqrt;\": \"\\u221A\",\n\t\"sqsub;\": \"\\u228F\",\n\t\"sqsube;\": \"\\u2291\",\n\t\"sqsubset;\": \"\\u228F\",\n\t\"sqsubseteq;\": \"\\u2291\",\n\t\"sqsup;\": \"\\u2290\",\n\t\"sqsupe;\": \"\\u2292\",\n\t\"sqsupset;\": \"\\u2290\",\n\t\"sqsupseteq;\": \"\\u2292\",\n\t\"square;\": \"\\u25A1\",\n\t\"Square;\": \"\\u25A1\",\n\t\"SquareIntersection;\": \"\\u2293\",\n\t\"SquareSubset;\": \"\\u228F\",\n\t\"SquareSubsetEqual;\": \"\\u2291\",\n\t\"SquareSuperset;\": \"\\u2290\",\n\t\"SquareSupersetEqual;\": \"\\u2292\",\n\t\"SquareUnion;\": \"\\u2294\",\n\t\"squarf;\": \"\\u25AA\",\n\t\"squ;\": \"\\u25A1\",\n\t\"squf;\": \"\\u25AA\",\n\t\"srarr;\": \"\\u2192\",\n\t\"Sscr;\": \"\\uD835\\uDCAE\",\n\t\"sscr;\": \"\\uD835\\uDCC8\",\n\t\"ssetmn;\": \"\\u2216\",\n\t\"ssmile;\": \"\\u2323\",\n\t\"sstarf;\": \"\\u22C6\",\n\t\"Star;\": \"\\u22C6\",\n\t\"star;\": \"\\u2606\",\n\t\"starf;\": \"\\u2605\",\n\t\"straightepsilon;\": \"\\u03F5\",\n\t\"straightphi;\": \"\\u03D5\",\n\t\"strns;\": \"\\u00AF\",\n\t\"sub;\": \"\\u2282\",\n\t\"Sub;\": \"\\u22D0\",\n\t\"subdot;\": \"\\u2ABD\",\n\t\"subE;\": \"\\u2AC5\",\n\t\"sube;\": \"\\u2286\",\n\t\"subedot;\": \"\\u2AC3\",\n\t\"submult;\": \"\\u2AC1\",\n\t\"subnE;\": \"\\u2ACB\",\n\t\"subne;\": \"\\u228A\",\n\t\"subplus;\": \"\\u2ABF\",\n\t\"subrarr;\": \"\\u2979\",\n\t\"subset;\": \"\\u2282\",\n\t\"Subset;\": \"\\u22D0\",\n\t\"subseteq;\": \"\\u2286\",\n\t\"subseteqq;\": \"\\u2AC5\",\n\t\"SubsetEqual;\": \"\\u2286\",\n\t\"subsetneq;\": \"\\u228A\",\n\t\"subsetneqq;\": \"\\u2ACB\",\n\t\"subsim;\": \"\\u2AC7\",\n\t\"subsub;\": \"\\u2AD5\",\n\t\"subsup;\": \"\\u2AD3\",\n\t\"succapprox;\": \"\\u2AB8\",\n\t\"succ;\": \"\\u227B\",\n\t\"succcurlyeq;\": \"\\u227D\",\n\t\"Succeeds;\": \"\\u227B\",\n\t\"SucceedsEqual;\": \"\\u2AB0\",\n\t\"SucceedsSlantEqual;\": \"\\u227D\",\n\t\"SucceedsTilde;\": \"\\u227F\",\n\t\"succeq;\": \"\\u2AB0\",\n\t\"succnapprox;\": \"\\u2ABA\",\n\t\"succneqq;\": \"\\u2AB6\",\n\t\"succnsim;\": \"\\u22E9\",\n\t\"succsim;\": \"\\u227F\",\n\t\"SuchThat;\": \"\\u220B\",\n\t\"sum;\": \"\\u2211\",\n\t\"Sum;\": \"\\u2211\",\n\t\"sung;\": \"\\u266A\",\n\t\"sup1;\": \"\\u00B9\",\n\t\"sup1\": \"\\u00B9\",\n\t\"sup2;\": \"\\u00B2\",\n\t\"sup2\": \"\\u00B2\",\n\t\"sup3;\": \"\\u00B3\",\n\t\"sup3\": \"\\u00B3\",\n\t\"sup;\": \"\\u2283\",\n\t\"Sup;\": \"\\u22D1\",\n\t\"supdot;\": \"\\u2ABE\",\n\t\"supdsub;\": \"\\u2AD8\",\n\t\"supE;\": \"\\u2AC6\",\n\t\"supe;\": \"\\u2287\",\n\t\"supedot;\": \"\\u2AC4\",\n\t\"Superset;\": \"\\u2283\",\n\t\"SupersetEqual;\": \"\\u2287\",\n\t\"suphsol;\": \"\\u27C9\",\n\t\"suphsub;\": \"\\u2AD7\",\n\t\"suplarr;\": \"\\u297B\",\n\t\"supmult;\": \"\\u2AC2\",\n\t\"supnE;\": \"\\u2ACC\",\n\t\"supne;\": \"\\u228B\",\n\t\"supplus;\": \"\\u2AC0\",\n\t\"supset;\": \"\\u2283\",\n\t\"Supset;\": \"\\u22D1\",\n\t\"supseteq;\": \"\\u2287\",\n\t\"supseteqq;\": \"\\u2AC6\",\n\t\"supsetneq;\": \"\\u228B\",\n\t\"supsetneqq;\": \"\\u2ACC\",\n\t\"supsim;\": \"\\u2AC8\",\n\t\"supsub;\": \"\\u2AD4\",\n\t\"supsup;\": \"\\u2AD6\",\n\t\"swarhk;\": \"\\u2926\",\n\t\"swarr;\": \"\\u2199\",\n\t\"swArr;\": \"\\u21D9\",\n\t\"swarrow;\": \"\\u2199\",\n\t\"swnwar;\": \"\\u292A\",\n\t\"szlig;\": \"\\u00DF\",\n\t\"szlig\": \"\\u00DF\",\n\t\"Tab;\": \"\\u0009\",\n\t\"target;\": \"\\u2316\",\n\t\"Tau;\": \"\\u03A4\",\n\t\"tau;\": \"\\u03C4\",\n\t\"tbrk;\": \"\\u23B4\",\n\t\"Tcaron;\": \"\\u0164\",\n\t\"tcaron;\": \"\\u0165\",\n\t\"Tcedil;\": \"\\u0162\",\n\t\"tcedil;\": \"\\u0163\",\n\t\"Tcy;\": \"\\u0422\",\n\t\"tcy;\": \"\\u0442\",\n\t\"tdot;\": \"\\u20DB\",\n\t\"telrec;\": \"\\u2315\",\n\t\"Tfr;\": \"\\uD835\\uDD17\",\n\t\"tfr;\": \"\\uD835\\uDD31\",\n\t\"there4;\": \"\\u2234\",\n\t\"therefore;\": \"\\u2234\",\n\t\"Therefore;\": \"\\u2234\",\n\t\"Theta;\": \"\\u0398\",\n\t\"theta;\": \"\\u03B8\",\n\t\"thetasym;\": \"\\u03D1\",\n\t\"thetav;\": \"\\u03D1\",\n\t\"thickapprox;\": \"\\u2248\",\n\t\"thicksim;\": \"\\u223C\",\n\t\"ThickSpace;\": \"\\u205F\\u200A\",\n\t\"ThinSpace;\": \"\\u2009\",\n\t\"thinsp;\": \"\\u2009\",\n\t\"thkap;\": \"\\u2248\",\n\t\"thksim;\": \"\\u223C\",\n\t\"THORN;\": \"\\u00DE\",\n\t\"THORN\": \"\\u00DE\",\n\t\"thorn;\": \"\\u00FE\",\n\t\"thorn\": \"\\u00FE\",\n\t\"tilde;\": \"\\u02DC\",\n\t\"Tilde;\": \"\\u223C\",\n\t\"TildeEqual;\": \"\\u2243\",\n\t\"TildeFullEqual;\": \"\\u2245\",\n\t\"TildeTilde;\": \"\\u2248\",\n\t\"timesbar;\": \"\\u2A31\",\n\t\"timesb;\": \"\\u22A0\",\n\t\"times;\": \"\\u00D7\",\n\t\"times\": \"\\u00D7\",\n\t\"timesd;\": \"\\u2A30\",\n\t\"tint;\": \"\\u222D\",\n\t\"toea;\": \"\\u2928\",\n\t\"topbot;\": \"\\u2336\",\n\t\"topcir;\": \"\\u2AF1\",\n\t\"top;\": \"\\u22A4\",\n\t\"Topf;\": \"\\uD835\\uDD4B\",\n\t\"topf;\": \"\\uD835\\uDD65\",\n\t\"topfork;\": \"\\u2ADA\",\n\t\"tosa;\": \"\\u2929\",\n\t\"tprime;\": \"\\u2034\",\n\t\"trade;\": \"\\u2122\",\n\t\"TRADE;\": \"\\u2122\",\n\t\"triangle;\": \"\\u25B5\",\n\t\"triangledown;\": \"\\u25BF\",\n\t\"triangleleft;\": \"\\u25C3\",\n\t\"trianglelefteq;\": \"\\u22B4\",\n\t\"triangleq;\": \"\\u225C\",\n\t\"triangleright;\": \"\\u25B9\",\n\t\"trianglerighteq;\": \"\\u22B5\",\n\t\"tridot;\": \"\\u25EC\",\n\t\"trie;\": \"\\u225C\",\n\t\"triminus;\": \"\\u2A3A\",\n\t\"TripleDot;\": \"\\u20DB\",\n\t\"triplus;\": \"\\u2A39\",\n\t\"trisb;\": \"\\u29CD\",\n\t\"tritime;\": \"\\u2A3B\",\n\t\"trpezium;\": \"\\u23E2\",\n\t\"Tscr;\": \"\\uD835\\uDCAF\",\n\t\"tscr;\": \"\\uD835\\uDCC9\",\n\t\"TScy;\": \"\\u0426\",\n\t\"tscy;\": \"\\u0446\",\n\t\"TSHcy;\": \"\\u040B\",\n\t\"tshcy;\": \"\\u045B\",\n\t\"Tstrok;\": \"\\u0166\",\n\t\"tstrok;\": \"\\u0167\",\n\t\"twixt;\": \"\\u226C\",\n\t\"twoheadleftarrow;\": \"\\u219E\",\n\t\"twoheadrightarrow;\": \"\\u21A0\",\n\t\"Uacute;\": \"\\u00DA\",\n\t\"Uacute\": \"\\u00DA\",\n\t\"uacute;\": \"\\u00FA\",\n\t\"uacute\": \"\\u00FA\",\n\t\"uarr;\": \"\\u2191\",\n\t\"Uarr;\": \"\\u219F\",\n\t\"uArr;\": \"\\u21D1\",\n\t\"Uarrocir;\": \"\\u2949\",\n\t\"Ubrcy;\": \"\\u040E\",\n\t\"ubrcy;\": \"\\u045E\",\n\t\"Ubreve;\": \"\\u016C\",\n\t\"ubreve;\": \"\\u016D\",\n\t\"Ucirc;\": \"\\u00DB\",\n\t\"Ucirc\": \"\\u00DB\",\n\t\"ucirc;\": \"\\u00FB\",\n\t\"ucirc\": \"\\u00FB\",\n\t\"Ucy;\": \"\\u0423\",\n\t\"ucy;\": \"\\u0443\",\n\t\"udarr;\": \"\\u21C5\",\n\t\"Udblac;\": \"\\u0170\",\n\t\"udblac;\": \"\\u0171\",\n\t\"udhar;\": \"\\u296E\",\n\t\"ufisht;\": \"\\u297E\",\n\t\"Ufr;\": \"\\uD835\\uDD18\",\n\t\"ufr;\": \"\\uD835\\uDD32\",\n\t\"Ugrave;\": \"\\u00D9\",\n\t\"Ugrave\": \"\\u00D9\",\n\t\"ugrave;\": \"\\u00F9\",\n\t\"ugrave\": \"\\u00F9\",\n\t\"uHar;\": \"\\u2963\",\n\t\"uharl;\": \"\\u21BF\",\n\t\"uharr;\": \"\\u21BE\",\n\t\"uhblk;\": \"\\u2580\",\n\t\"ulcorn;\": \"\\u231C\",\n\t\"ulcorner;\": \"\\u231C\",\n\t\"ulcrop;\": \"\\u230F\",\n\t\"ultri;\": \"\\u25F8\",\n\t\"Umacr;\": \"\\u016A\",\n\t\"umacr;\": \"\\u016B\",\n\t\"uml;\": \"\\u00A8\",\n\t\"uml\": \"\\u00A8\",\n\t\"UnderBar;\": \"\\u005F\",\n\t\"UnderBrace;\": \"\\u23DF\",\n\t\"UnderBracket;\": \"\\u23B5\",\n\t\"UnderParenthesis;\": \"\\u23DD\",\n\t\"Union;\": \"\\u22C3\",\n\t\"UnionPlus;\": \"\\u228E\",\n\t\"Uogon;\": \"\\u0172\",\n\t\"uogon;\": \"\\u0173\",\n\t\"Uopf;\": \"\\uD835\\uDD4C\",\n\t\"uopf;\": \"\\uD835\\uDD66\",\n\t\"UpArrowBar;\": \"\\u2912\",\n\t\"uparrow;\": \"\\u2191\",\n\t\"UpArrow;\": \"\\u2191\",\n\t\"Uparrow;\": \"\\u21D1\",\n\t\"UpArrowDownArrow;\": \"\\u21C5\",\n\t\"updownarrow;\": \"\\u2195\",\n\t\"UpDownArrow;\": \"\\u2195\",\n\t\"Updownarrow;\": \"\\u21D5\",\n\t\"UpEquilibrium;\": \"\\u296E\",\n\t\"upharpoonleft;\": \"\\u21BF\",\n\t\"upharpoonright;\": \"\\u21BE\",\n\t\"uplus;\": \"\\u228E\",\n\t\"UpperLeftArrow;\": \"\\u2196\",\n\t\"UpperRightArrow;\": \"\\u2197\",\n\t\"upsi;\": \"\\u03C5\",\n\t\"Upsi;\": \"\\u03D2\",\n\t\"upsih;\": \"\\u03D2\",\n\t\"Upsilon;\": \"\\u03A5\",\n\t\"upsilon;\": \"\\u03C5\",\n\t\"UpTeeArrow;\": \"\\u21A5\",\n\t\"UpTee;\": \"\\u22A5\",\n\t\"upuparrows;\": \"\\u21C8\",\n\t\"urcorn;\": \"\\u231D\",\n\t\"urcorner;\": \"\\u231D\",\n\t\"urcrop;\": \"\\u230E\",\n\t\"Uring;\": \"\\u016E\",\n\t\"uring;\": \"\\u016F\",\n\t\"urtri;\": \"\\u25F9\",\n\t\"Uscr;\": \"\\uD835\\uDCB0\",\n\t\"uscr;\": \"\\uD835\\uDCCA\",\n\t\"utdot;\": \"\\u22F0\",\n\t\"Utilde;\": \"\\u0168\",\n\t\"utilde;\": \"\\u0169\",\n\t\"utri;\": \"\\u25B5\",\n\t\"utrif;\": \"\\u25B4\",\n\t\"uuarr;\": \"\\u21C8\",\n\t\"Uuml;\": \"\\u00DC\",\n\t\"Uuml\": \"\\u00DC\",\n\t\"uuml;\": \"\\u00FC\",\n\t\"uuml\": \"\\u00FC\",\n\t\"uwangle;\": \"\\u29A7\",\n\t\"vangrt;\": \"\\u299C\",\n\t\"varepsilon;\": \"\\u03F5\",\n\t\"varkappa;\": \"\\u03F0\",\n\t\"varnothing;\": \"\\u2205\",\n\t\"varphi;\": \"\\u03D5\",\n\t\"varpi;\": \"\\u03D6\",\n\t\"varpropto;\": \"\\u221D\",\n\t\"varr;\": \"\\u2195\",\n\t\"vArr;\": \"\\u21D5\",\n\t\"varrho;\": \"\\u03F1\",\n\t\"varsigma;\": \"\\u03C2\",\n\t\"varsubsetneq;\": \"\\u228A\\uFE00\",\n\t\"varsubsetneqq;\": \"\\u2ACB\\uFE00\",\n\t\"varsupsetneq;\": \"\\u228B\\uFE00\",\n\t\"varsupsetneqq;\": \"\\u2ACC\\uFE00\",\n\t\"vartheta;\": \"\\u03D1\",\n\t\"vartriangleleft;\": \"\\u22B2\",\n\t\"vartriangleright;\": \"\\u22B3\",\n\t\"vBar;\": \"\\u2AE8\",\n\t\"Vbar;\": \"\\u2AEB\",\n\t\"vBarv;\": \"\\u2AE9\",\n\t\"Vcy;\": \"\\u0412\",\n\t\"vcy;\": \"\\u0432\",\n\t\"vdash;\": \"\\u22A2\",\n\t\"vDash;\": \"\\u22A8\",\n\t\"Vdash;\": \"\\u22A9\",\n\t\"VDash;\": \"\\u22AB\",\n\t\"Vdashl;\": \"\\u2AE6\",\n\t\"veebar;\": \"\\u22BB\",\n\t\"vee;\": \"\\u2228\",\n\t\"Vee;\": \"\\u22C1\",\n\t\"veeeq;\": \"\\u225A\",\n\t\"vellip;\": \"\\u22EE\",\n\t\"verbar;\": \"\\u007C\",\n\t\"Verbar;\": \"\\u2016\",\n\t\"vert;\": \"\\u007C\",\n\t\"Vert;\": \"\\u2016\",\n\t\"VerticalBar;\": \"\\u2223\",\n\t\"VerticalLine;\": \"\\u007C\",\n\t\"VerticalSeparator;\": \"\\u2758\",\n\t\"VerticalTilde;\": \"\\u2240\",\n\t\"VeryThinSpace;\": \"\\u200A\",\n\t\"Vfr;\": \"\\uD835\\uDD19\",\n\t\"vfr;\": \"\\uD835\\uDD33\",\n\t\"vltri;\": \"\\u22B2\",\n\t\"vnsub;\": \"\\u2282\\u20D2\",\n\t\"vnsup;\": \"\\u2283\\u20D2\",\n\t\"Vopf;\": \"\\uD835\\uDD4D\",\n\t\"vopf;\": \"\\uD835\\uDD67\",\n\t\"vprop;\": \"\\u221D\",\n\t\"vrtri;\": \"\\u22B3\",\n\t\"Vscr;\": \"\\uD835\\uDCB1\",\n\t\"vscr;\": \"\\uD835\\uDCCB\",\n\t\"vsubnE;\": \"\\u2ACB\\uFE00\",\n\t\"vsubne;\": \"\\u228A\\uFE00\",\n\t\"vsupnE;\": \"\\u2ACC\\uFE00\",\n\t\"vsupne;\": \"\\u228B\\uFE00\",\n\t\"Vvdash;\": \"\\u22AA\",\n\t\"vzigzag;\": \"\\u299A\",\n\t\"Wcirc;\": \"\\u0174\",\n\t\"wcirc;\": \"\\u0175\",\n\t\"wedbar;\": \"\\u2A5F\",\n\t\"wedge;\": \"\\u2227\",\n\t\"Wedge;\": \"\\u22C0\",\n\t\"wedgeq;\": \"\\u2259\",\n\t\"weierp;\": \"\\u2118\",\n\t\"Wfr;\": \"\\uD835\\uDD1A\",\n\t\"wfr;\": \"\\uD835\\uDD34\",\n\t\"Wopf;\": \"\\uD835\\uDD4E\",\n\t\"wopf;\": \"\\uD835\\uDD68\",\n\t\"wp;\": \"\\u2118\",\n\t\"wr;\": \"\\u2240\",\n\t\"wreath;\": \"\\u2240\",\n\t\"Wscr;\": \"\\uD835\\uDCB2\",\n\t\"wscr;\": \"\\uD835\\uDCCC\",\n\t\"xcap;\": \"\\u22C2\",\n\t\"xcirc;\": \"\\u25EF\",\n\t\"xcup;\": \"\\u22C3\",\n\t\"xdtri;\": \"\\u25BD\",\n\t\"Xfr;\": \"\\uD835\\uDD1B\",\n\t\"xfr;\": \"\\uD835\\uDD35\",\n\t\"xharr;\": \"\\u27F7\",\n\t\"xhArr;\": \"\\u27FA\",\n\t\"Xi;\": \"\\u039E\",\n\t\"xi;\": \"\\u03BE\",\n\t\"xlarr;\": \"\\u27F5\",\n\t\"xlArr;\": \"\\u27F8\",\n\t\"xmap;\": \"\\u27FC\",\n\t\"xnis;\": \"\\u22FB\",\n\t\"xodot;\": \"\\u2A00\",\n\t\"Xopf;\": \"\\uD835\\uDD4F\",\n\t\"xopf;\": \"\\uD835\\uDD69\",\n\t\"xoplus;\": \"\\u2A01\",\n\t\"xotime;\": \"\\u2A02\",\n\t\"xrarr;\": \"\\u27F6\",\n\t\"xrArr;\": \"\\u27F9\",\n\t\"Xscr;\": \"\\uD835\\uDCB3\",\n\t\"xscr;\": \"\\uD835\\uDCCD\",\n\t\"xsqcup;\": \"\\u2A06\",\n\t\"xuplus;\": \"\\u2A04\",\n\t\"xutri;\": \"\\u25B3\",\n\t\"xvee;\": \"\\u22C1\",\n\t\"xwedge;\": \"\\u22C0\",\n\t\"Yacute;\": \"\\u00DD\",\n\t\"Yacute\": \"\\u00DD\",\n\t\"yacute;\": \"\\u00FD\",\n\t\"yacute\": \"\\u00FD\",\n\t\"YAcy;\": \"\\u042F\",\n\t\"yacy;\": \"\\u044F\",\n\t\"Ycirc;\": \"\\u0176\",\n\t\"ycirc;\": \"\\u0177\",\n\t\"Ycy;\": \"\\u042B\",\n\t\"ycy;\": \"\\u044B\",\n\t\"yen;\": \"\\u00A5\",\n\t\"yen\": \"\\u00A5\",\n\t\"Yfr;\": \"\\uD835\\uDD1C\",\n\t\"yfr;\": \"\\uD835\\uDD36\",\n\t\"YIcy;\": \"\\u0407\",\n\t\"yicy;\": \"\\u0457\",\n\t\"Yopf;\": \"\\uD835\\uDD50\",\n\t\"yopf;\": \"\\uD835\\uDD6A\",\n\t\"Yscr;\": \"\\uD835\\uDCB4\",\n\t\"yscr;\": \"\\uD835\\uDCCE\",\n\t\"YUcy;\": \"\\u042E\",\n\t\"yucy;\": \"\\u044E\",\n\t\"yuml;\": \"\\u00FF\",\n\t\"yuml\": \"\\u00FF\",\n\t\"Yuml;\": \"\\u0178\",\n\t\"Zacute;\": \"\\u0179\",\n\t\"zacute;\": \"\\u017A\",\n\t\"Zcaron;\": \"\\u017D\",\n\t\"zcaron;\": \"\\u017E\",\n\t\"Zcy;\": \"\\u0417\",\n\t\"zcy;\": \"\\u0437\",\n\t\"Zdot;\": \"\\u017B\",\n\t\"zdot;\": \"\\u017C\",\n\t\"zeetrf;\": \"\\u2128\",\n\t\"ZeroWidthSpace;\": \"\\u200B\",\n\t\"Zeta;\": \"\\u0396\",\n\t\"zeta;\": \"\\u03B6\",\n\t\"zfr;\": \"\\uD835\\uDD37\",\n\t\"Zfr;\": \"\\u2128\",\n\t\"ZHcy;\": \"\\u0416\",\n\t\"zhcy;\": \"\\u0436\",\n\t\"zigrarr;\": \"\\u21DD\",\n\t\"zopf;\": \"\\uD835\\uDD6B\",\n\t\"Zopf;\": \"\\u2124\",\n\t\"Zscr;\": \"\\uD835\\uDCB5\",\n\t\"zscr;\": \"\\uD835\\uDCCF\",\n\t\"zwj;\": \"\\u200D\",\n\t\"zwnj;\": \"\\u200C\"\n};\n\n},\n{}],\n13:[function(_dereq_,module,exports){\nvar util = _dereq_('util/');\n\nvar pSlice = Array.prototype.slice;\nvar hasOwn = Object.prototype.hasOwnProperty;\n\nvar assert = module.exports = ok;\n\nassert.AssertionError = function AssertionError(options) {\n  this.name = 'AssertionError';\n  this.actual = options.actual;\n  this.expected = options.expected;\n  this.operator = options.operator;\n  if (options.message) {\n    this.message = options.message;\n    this.generatedMessage = false;\n  } else {\n    this.message = getMessage(this);\n    this.generatedMessage = true;\n  }\n  var stackStartFunction = options.stackStartFunction || fail;\n\n  if (Error.captureStackTrace) {\n    Error.captureStackTrace(this, stackStartFunction);\n  }\n  else {\n    var err = new Error();\n    if (err.stack) {\n      var out = err.stack;\n      var fn_name = stackStartFunction.name;\n      var idx = out.indexOf('\\n' + fn_name);\n      if (idx >= 0) {\n        var next_line = out.indexOf('\\n', idx + 1);\n        out = out.substring(next_line + 1);\n      }\n\n      this.stack = out;\n    }\n  }\n};\nutil.inherits(assert.AssertionError, Error);\n\nfunction replacer(key, value) {\n  if (util.isUndefined(value)) {\n    return '' + value;\n  }\n  if (util.isNumber(value) && (isNaN(value) || !isFinite(value))) {\n    return value.toString();\n  }\n  if (util.isFunction(value) || util.isRegExp(value)) {\n    return value.toString();\n  }\n  return value;\n}\n\nfunction truncate(s, n) {\n  if (util.isString(s)) {\n    return s.length < n ? s : s.slice(0, n);\n  } else {\n    return s;\n  }\n}\n\nfunction getMessage(self) {\n  return truncate(JSON.stringify(self.actual, replacer), 128) + ' ' +\n         self.operator + ' ' +\n         truncate(JSON.stringify(self.expected, replacer), 128);\n}\n\nfunction fail(actual, expected, message, operator, stackStartFunction) {\n  throw new assert.AssertionError({\n    message: message,\n    actual: actual,\n    expected: expected,\n    operator: operator,\n    stackStartFunction: stackStartFunction\n  });\n}\nassert.fail = fail;\n\nfunction ok(value, message) {\n  if (!value) fail(value, true, message, '==', assert.ok);\n}\nassert.ok = ok;\n\nassert.equal = function equal(actual, expected, message) {\n  if (actual != expected) fail(actual, expected, message, '==', assert.equal);\n};\n\nassert.notEqual = function notEqual(actual, expected, message) {\n  if (actual == expected) {\n    fail(actual, expected, message, '!=', assert.notEqual);\n  }\n};\n\nassert.deepEqual = function deepEqual(actual, expected, message) {\n  if (!_deepEqual(actual, expected)) {\n    fail(actual, expected, message, 'deepEqual', assert.deepEqual);\n  }\n};\n\nfunction _deepEqual(actual, expected) {\n  if (actual === expected) {\n    return true;\n\n  } else if (util.isBuffer(actual) && util.isBuffer(expected)) {\n    if (actual.length != expected.length) return false;\n\n    for (var i = 0; i < actual.length; i++) {\n      if (actual[i] !== expected[i]) return false;\n    }\n\n    return true;\n  } else if (util.isDate(actual) && util.isDate(expected)) {\n    return actual.getTime() === expected.getTime();\n  } else if (util.isRegExp(actual) && util.isRegExp(expected)) {\n    return actual.source === expected.source &&\n           actual.global === expected.global &&\n           actual.multiline === expected.multiline &&\n           actual.lastIndex === expected.lastIndex &&\n           actual.ignoreCase === expected.ignoreCase;\n  } else if (!util.isObject(actual) && !util.isObject(expected)) {\n    return actual == expected;\n  } else {\n    return objEquiv(actual, expected);\n  }\n}\n\nfunction isArguments(object) {\n  return Object.prototype.toString.call(object) == '[object Arguments]';\n}\n\nfunction objEquiv(a, b) {\n  if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b))\n    return false;\n  if (a.prototype !== b.prototype) return false;\n  if (isArguments(a)) {\n    if (!isArguments(b)) {\n      return false;\n    }\n    a = pSlice.call(a);\n    b = pSlice.call(b);\n    return _deepEqual(a, b);\n  }\n  try {\n    var ka = objectKeys(a),\n        kb = objectKeys(b),\n        key, i;\n  } catch (e) {//happens when one is a string literal and the other isn't\n    return false;\n  }\n  if (ka.length != kb.length)\n    return false;\n  ka.sort();\n  kb.sort();\n  for (i = ka.length - 1; i >= 0; i--) {\n    if (ka[i] != kb[i])\n      return false;\n  }\n  for (i = ka.length - 1; i >= 0; i--) {\n    key = ka[i];\n    if (!_deepEqual(a[key], b[key])) return false;\n  }\n  return true;\n}\n\nassert.notDeepEqual = function notDeepEqual(actual, expected, message) {\n  if (_deepEqual(actual, expected)) {\n    fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);\n  }\n};\n\nassert.strictEqual = function strictEqual(actual, expected, message) {\n  if (actual !== expected) {\n    fail(actual, expected, message, '===', assert.strictEqual);\n  }\n};\n\nassert.notStrictEqual = function notStrictEqual(actual, expected, message) {\n  if (actual === expected) {\n    fail(actual, expected, message, '!==', assert.notStrictEqual);\n  }\n};\n\nfunction expectedException(actual, expected) {\n  if (!actual || !expected) {\n    return false;\n  }\n\n  if (Object.prototype.toString.call(expected) == '[object RegExp]') {\n    return expected.test(actual);\n  } else if (actual instanceof expected) {\n    return true;\n  } else if (expected.call({}, actual) === true) {\n    return true;\n  }\n\n  return false;\n}\n\nfunction _throws(shouldThrow, block, expected, message) {\n  var actual;\n\n  if (util.isString(expected)) {\n    message = expected;\n    expected = null;\n  }\n\n  try {\n    block();\n  } catch (e) {\n    actual = e;\n  }\n\n  message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +\n            (message ? ' ' + message : '.');\n\n  if (shouldThrow && !actual) {\n    fail(actual, expected, 'Missing expected exception' + message);\n  }\n\n  if (!shouldThrow && expectedException(actual, expected)) {\n    fail(actual, expected, 'Got unwanted exception' + message);\n  }\n\n  if ((shouldThrow && actual && expected &&\n      !expectedException(actual, expected)) || (!shouldThrow && actual)) {\n    throw actual;\n  }\n}\n\nassert.throws = function(block, /*optional*/error, /*optional*/message) {\n  _throws.apply(this, [true].concat(pSlice.call(arguments)));\n};\nassert.doesNotThrow = function(block, /*optional*/message) {\n  _throws.apply(this, [false].concat(pSlice.call(arguments)));\n};\n\nassert.ifError = function(err) { if (err) {throw err;}};\n\nvar objectKeys = Object.keys || function (obj) {\n  var keys = [];\n  for (var key in obj) {\n    if (hasOwn.call(obj, key)) keys.push(key);\n  }\n  return keys;\n};\n\n},\n{\"util/\":15}],\n14:[function(_dereq_,module,exports){\nmodule.exports = function isBuffer(arg) {\n  return arg && typeof arg === 'object'\n    && typeof arg.copy === 'function'\n    && typeof arg.fill === 'function'\n    && typeof arg.readUInt8 === 'function';\n}\n},\n{}],\n15:[function(_dereq_,module,exports){\n(function (process,global){\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n  if (!isString(f)) {\n    var objects = [];\n    for (var i = 0; i < arguments.length; i++) {\n      objects.push(inspect(arguments[i]));\n    }\n    return objects.join(' ');\n  }\n\n  var i = 1;\n  var args = arguments;\n  var len = args.length;\n  var str = String(f).replace(formatRegExp, function(x) {\n    if (x === '%%') return '%';\n    if (i >= len) return x;\n    switch (x) {\n      case '%s': return String(args[i++]);\n      case '%d': return Number(args[i++]);\n      case '%j':\n        try {\n          return JSON.stringify(args[i++]);\n        } catch (_) {\n          return '[Circular]';\n        }\n      default:\n        return x;\n    }\n  });\n  for (var x = args[i]; i < len; x = args[++i]) {\n    if (isNull(x) || !isObject(x)) {\n      str += ' ' + x;\n    } else {\n      str += ' ' + inspect(x);\n    }\n  }\n  return str;\n};\nexports.deprecate = function(fn, msg) {\n  if (isUndefined(global.process)) {\n    return function() {\n      return exports.deprecate(fn, msg).apply(this, arguments);\n    };\n  }\n\n  if (process.noDeprecation === true) {\n    return fn;\n  }\n\n  var warned = false;\n  function deprecated() {\n    if (!warned) {\n      if (process.throwDeprecation) {\n        throw new Error(msg);\n      } else if (process.traceDeprecation) {\n        console.trace(msg);\n      } else {\n        console.error(msg);\n      }\n      warned = true;\n    }\n    return fn.apply(this, arguments);\n  }\n\n  return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n  if (isUndefined(debugEnviron))\n    debugEnviron = process.env.NODE_DEBUG || '';\n  set = set.toUpperCase();\n  if (!debugs[set]) {\n    if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n      var pid = process.pid;\n      debugs[set] = function() {\n        var msg = exports.format.apply(exports, arguments);\n        console.error('%s %d: %s', set, pid, msg);\n      };\n    } else {\n      debugs[set] = function() {};\n    }\n  }\n  return debugs[set];\n};\nfunction inspect(obj, opts) {\n  var ctx = {\n    seen: [],\n    stylize: stylizeNoColor\n  };\n  if (arguments.length >= 3) ctx.depth = arguments[2];\n  if (arguments.length >= 4) ctx.colors = arguments[3];\n  if (isBoolean(opts)) {\n    ctx.showHidden = opts;\n  } else if (opts) {\n    exports._extend(ctx, opts);\n  }\n  if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n  if (isUndefined(ctx.depth)) ctx.depth = 2;\n  if (isUndefined(ctx.colors)) ctx.colors = false;\n  if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n  if (ctx.colors) ctx.stylize = stylizeWithColor;\n  return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\ninspect.colors = {\n  'bold' : [1, 22],\n  'italic' : [3, 23],\n  'underline' : [4, 24],\n  'inverse' : [7, 27],\n  'white' : [37, 39],\n  'grey' : [90, 39],\n  'black' : [30, 39],\n  'blue' : [34, 39],\n  'cyan' : [36, 39],\n  'green' : [32, 39],\n  'magenta' : [35, 39],\n  'red' : [31, 39],\n  'yellow' : [33, 39]\n};\ninspect.styles = {\n  'special': 'cyan',\n  'number': 'yellow',\n  'boolean': 'yellow',\n  'undefined': 'grey',\n  'null': 'bold',\n  'string': 'green',\n  'date': 'magenta',\n  'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n  var style = inspect.styles[styleType];\n\n  if (style) {\n    return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n           '\\u001b[' + inspect.colors[style][1] + 'm';\n  } else {\n    return str;\n  }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n  return str;\n}\n\n\nfunction arrayToHash(array) {\n  var hash = {};\n\n  array.forEach(function(val, idx) {\n    hash[val] = true;\n  });\n\n  return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n  if (ctx.customInspect &&\n      value &&\n      isFunction(value.inspect) &&\n      value.inspect !== exports.inspect &&\n      !(value.constructor && value.constructor.prototype === value)) {\n    var ret = value.inspect(recurseTimes, ctx);\n    if (!isString(ret)) {\n      ret = formatValue(ctx, ret, recurseTimes);\n    }\n    return ret;\n  }\n  var primitive = formatPrimitive(ctx, value);\n  if (primitive) {\n    return primitive;\n  }\n  var keys = Object.keys(value);\n  var visibleKeys = arrayToHash(keys);\n\n  if (ctx.showHidden) {\n    keys = Object.getOwnPropertyNames(value);\n  }\n  if (isError(value)\n      && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n    return formatError(value);\n  }\n  if (keys.length === 0) {\n    if (isFunction(value)) {\n      var name = value.name ? ': ' + value.name : '';\n      return ctx.stylize('[Function' + name + ']', 'special');\n    }\n    if (isRegExp(value)) {\n      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n    }\n    if (isDate(value)) {\n      return ctx.stylize(Date.prototype.toString.call(value), 'date');\n    }\n    if (isError(value)) {\n      return formatError(value);\n    }\n  }\n\n  var base = '', array = false, braces = ['{', '}'];\n  if (isArray(value)) {\n    array = true;\n    braces = ['[', ']'];\n  }\n  if (isFunction(value)) {\n    var n = value.name ? ': ' + value.name : '';\n    base = ' [Function' + n + ']';\n  }\n  if (isRegExp(value)) {\n    base = ' ' + RegExp.prototype.toString.call(value);\n  }\n  if (isDate(value)) {\n    base = ' ' + Date.prototype.toUTCString.call(value);\n  }\n  if (isError(value)) {\n    base = ' ' + formatError(value);\n  }\n\n  if (keys.length === 0 && (!array || value.length == 0)) {\n    return braces[0] + base + braces[1];\n  }\n\n  if (recurseTimes < 0) {\n    if (isRegExp(value)) {\n      return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n    } else {\n      return ctx.stylize('[Object]', 'special');\n    }\n  }\n\n  ctx.seen.push(value);\n\n  var output;\n  if (array) {\n    output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n  } else {\n    output = keys.map(function(key) {\n      return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n    });\n  }\n\n  ctx.seen.pop();\n\n  return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n  if (isUndefined(value))\n    return ctx.stylize('undefined', 'undefined');\n  if (isString(value)) {\n    var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n                                             .replace(/'/g, \"\\\\'\")\n                                             .replace(/\\\\\"/g, '\"') + '\\'';\n    return ctx.stylize(simple, 'string');\n  }\n  if (isNumber(value))\n    return ctx.stylize('' + value, 'number');\n  if (isBoolean(value))\n    return ctx.stylize('' + value, 'boolean');\n  if (isNull(value))\n    return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n  return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n  var output = [];\n  for (var i = 0, l = value.length; i < l; ++i) {\n    if (hasOwnProperty(value, String(i))) {\n      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n          String(i), true));\n    } else {\n      output.push('');\n    }\n  }\n  keys.forEach(function(key) {\n    if (!key.match(/^\\d+$/)) {\n      output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n          key, true));\n    }\n  });\n  return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n  var name, str, desc;\n  desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n  if (desc.get) {\n    if (desc.set) {\n      str = ctx.stylize('[Getter/Setter]', 'special');\n    } else {\n      str = ctx.stylize('[Getter]', 'special');\n    }\n  } else {\n    if (desc.set) {\n      str = ctx.stylize('[Setter]', 'special');\n    }\n  }\n  if (!hasOwnProperty(visibleKeys, key)) {\n    name = '[' + key + ']';\n  }\n  if (!str) {\n    if (ctx.seen.indexOf(desc.value) < 0) {\n      if (isNull(recurseTimes)) {\n        str = formatValue(ctx, desc.value, null);\n      } else {\n        str = formatValue(ctx, desc.value, recurseTimes - 1);\n      }\n      if (str.indexOf('\\n') > -1) {\n        if (array) {\n          str = str.split('\\n').map(function(line) {\n            return '  ' + line;\n          }).join('\\n').substr(2);\n        } else {\n          str = '\\n' + str.split('\\n').map(function(line) {\n            return '   ' + line;\n          }).join('\\n');\n        }\n      }\n    } else {\n      str = ctx.stylize('[Circular]', 'special');\n    }\n  }\n  if (isUndefined(name)) {\n    if (array && key.match(/^\\d+$/)) {\n      return str;\n    }\n    name = JSON.stringify('' + key);\n    if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n      name = name.substr(1, name.length - 2);\n      name = ctx.stylize(name, 'name');\n    } else {\n      name = name.replace(/'/g, \"\\\\'\")\n                 .replace(/\\\\\"/g, '\"')\n                 .replace(/(^\"|\"$)/g, \"'\");\n      name = ctx.stylize(name, 'string');\n    }\n  }\n\n  return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n  var numLinesEst = 0;\n  var length = output.reduce(function(prev, cur) {\n    numLinesEst++;\n    if (cur.indexOf('\\n') >= 0) numLinesEst++;\n    return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n  }, 0);\n\n  if (length > 60) {\n    return braces[0] +\n           (base === '' ? '' : base + '\\n ') +\n           ' ' +\n           output.join(',\\n  ') +\n           ' ' +\n           braces[1];\n  }\n\n  return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\nfunction isArray(ar) {\n  return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n  return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n  return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n  return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n  return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n  return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n  return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n  return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n  return isObject(e) &&\n      (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n  return arg === null ||\n         typeof arg === 'boolean' ||\n         typeof arg === 'number' ||\n         typeof arg === 'string' ||\n         typeof arg === 'symbol' ||  // ES6 symbol\n         typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = _dereq_('./support/isBuffer');\n\nfunction objectToString(o) {\n  return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n  return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n              'Oct', 'Nov', 'Dec'];\nfunction timestamp() {\n  var d = new Date();\n  var time = [pad(d.getHours()),\n              pad(d.getMinutes()),\n              pad(d.getSeconds())].join(':');\n  return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\nexports.log = function() {\n  console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\nexports.inherits = _dereq_('inherits');\n\nexports._extend = function(origin, add) {\n  if (!add || !isObject(add)) return origin;\n\n  var keys = Object.keys(add);\n  var i = keys.length;\n  while (i--) {\n    origin[keys[i]] = add[keys[i]];\n  }\n  return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n  return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\n}).call(this,_dereq_(\"/usr/local/lib/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js\"),typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},\n{\"./support/isBuffer\":14,\"/usr/local/lib/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js\":18,\"inherits\":17}],\n16:[function(_dereq_,module,exports){\n\nfunction EventEmitter() {\n  this._events = this._events || {};\n  this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\nEventEmitter.defaultMaxListeners = 10;\nEventEmitter.prototype.setMaxListeners = function(n) {\n  if (!isNumber(n) || n < 0 || isNaN(n))\n    throw TypeError('n must be a positive number');\n  this._maxListeners = n;\n  return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n  var er, handler, len, args, i, listeners;\n\n  if (!this._events)\n    this._events = {};\n  if (type === 'error') {\n    if (!this._events.error ||\n        (isObject(this._events.error) && !this._events.error.length)) {\n      er = arguments[1];\n      if (er instanceof Error) {\n        throw er; // Unhandled 'error' event\n      } else {\n        throw TypeError('Uncaught, unspecified \"error\" event.');\n      }\n      return false;\n    }\n  }\n\n  handler = this._events[type];\n\n  if (isUndefined(handler))\n    return false;\n\n  if (isFunction(handler)) {\n    switch (arguments.length) {\n      case 1:\n        handler.call(this);\n        break;\n      case 2:\n        handler.call(this, arguments[1]);\n        break;\n      case 3:\n        handler.call(this, arguments[1], arguments[2]);\n        break;\n      default:\n        len = arguments.length;\n        args = new Array(len - 1);\n        for (i = 1; i < len; i++)\n          args[i - 1] = arguments[i];\n        handler.apply(this, args);\n    }\n  } else if (isObject(handler)) {\n    len = arguments.length;\n    args = new Array(len - 1);\n    for (i = 1; i < len; i++)\n      args[i - 1] = arguments[i];\n\n    listeners = handler.slice();\n    len = listeners.length;\n    for (i = 0; i < len; i++)\n      listeners[i].apply(this, args);\n  }\n\n  return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n  var m;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events)\n    this._events = {};\n  if (this._events.newListener)\n    this.emit('newListener', type,\n              isFunction(listener.listener) ?\n              listener.listener : listener);\n\n  if (!this._events[type])\n    this._events[type] = listener;\n  else if (isObject(this._events[type]))\n    this._events[type].push(listener);\n  else\n    this._events[type] = [this._events[type], listener];\n  if (isObject(this._events[type]) && !this._events[type].warned) {\n    var m;\n    if (!isUndefined(this._maxListeners)) {\n      m = this._maxListeners;\n    } else {\n      m = EventEmitter.defaultMaxListeners;\n    }\n\n    if (m && m > 0 && this._events[type].length > m) {\n      this._events[type].warned = true;\n      console.error('(node) warning: possible EventEmitter memory ' +\n                    'leak detected. %d listeners added. ' +\n                    'Use emitter.setMaxListeners() to increase limit.',\n                    this._events[type].length);\n      console.trace();\n    }\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  var fired = false;\n\n  function g() {\n    this.removeListener(type, g);\n\n    if (!fired) {\n      fired = true;\n      listener.apply(this, arguments);\n    }\n  }\n\n  g.listener = listener;\n  this.on(type, g);\n\n  return this;\n};\nEventEmitter.prototype.removeListener = function(type, listener) {\n  var list, position, length, i;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events || !this._events[type])\n    return this;\n\n  list = this._events[type];\n  length = list.length;\n  position = -1;\n\n  if (list === listener ||\n      (isFunction(list.listener) && list.listener === listener)) {\n    delete this._events[type];\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n\n  } else if (isObject(list)) {\n    for (i = length; i-- > 0;) {\n      if (list[i] === listener ||\n          (list[i].listener && list[i].listener === listener)) {\n        position = i;\n        break;\n      }\n    }\n\n    if (position < 0)\n      return this;\n\n    if (list.length === 1) {\n      list.length = 0;\n      delete this._events[type];\n    } else {\n      list.splice(position, 1);\n    }\n\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n  var key, listeners;\n\n  if (!this._events)\n    return this;\n  if (!this._events.removeListener) {\n    if (arguments.length === 0)\n      this._events = {};\n    else if (this._events[type])\n      delete this._events[type];\n    return this;\n  }\n  if (arguments.length === 0) {\n    for (key in this._events) {\n      if (key === 'removeListener') continue;\n      this.removeAllListeners(key);\n    }\n    this.removeAllListeners('removeListener');\n    this._events = {};\n    return this;\n  }\n\n  listeners = this._events[type];\n\n  if (isFunction(listeners)) {\n    this.removeListener(type, listeners);\n  } else {\n    while (listeners.length)\n      this.removeListener(type, listeners[listeners.length - 1]);\n  }\n  delete this._events[type];\n\n  return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n  var ret;\n  if (!this._events || !this._events[type])\n    ret = [];\n  else if (isFunction(this._events[type]))\n    ret = [this._events[type]];\n  else\n    ret = this._events[type].slice();\n  return ret;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  var ret;\n  if (!emitter._events || !emitter._events[type])\n    ret = 0;\n  else if (isFunction(emitter._events[type]))\n    ret = 1;\n  else\n    ret = emitter._events[type].length;\n  return ret;\n};\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\n\n},\n{}],\n17:[function(_dereq_,module,exports){\nif (typeof Object.create === 'function') {\n  module.exports = function inherits(ctor, 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} else {\n  module.exports = function inherits(ctor, 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{}],\n18:[function(_dereq_,module,exports){\n\nvar process = module.exports = {};\n\nprocess.nextTick = (function () {\n    var canSetImmediate = typeof window !== 'undefined'\n    && window.setImmediate;\n    var canPost = typeof window !== 'undefined'\n    && window.postMessage && window.addEventListener\n    ;\n\n    if (canSetImmediate) {\n        return function (f) { return window.setImmediate(f) };\n    }\n\n    if (canPost) {\n        var queue = [];\n        window.addEventListener('message', function (ev) {\n            var source = ev.source;\n            if ((source === window || source === null) && ev.data === 'process-tick') {\n                ev.stopPropagation();\n                if (queue.length > 0) {\n                    var fn = queue.shift();\n                    fn();\n                }\n            }\n        }, true);\n\n        return function nextTick(fn) {\n            queue.push(fn);\n            window.postMessage('process-tick', '*');\n        };\n    }\n\n    return function nextTick(fn) {\n        setTimeout(fn, 0);\n    };\n})();\n\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n}\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\n\n},\n{}],\n19:[function(_dereq_,module,exports){\nmodule.exports=_dereq_(14)\n},\n{}],\n20:[function(_dereq_,module,exports){\nmodule.exports=_dereq_(15)\n},\n{\"./support/isBuffer\":19,\"/usr/local/lib/node_modules/browserify/node_modules/insert-module-globals/node_modules/process/browser.js\":18,\"inherits\":17}]},{},[9])\n(9)\n\n});\n\nace.define(\"ace/mode/html_worker\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/worker/mirror\",\"ace/mode/html/saxparser\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar Mirror = require(\"../worker/mirror\").Mirror;\nvar SAXParser = require(\"./html/saxparser\").SAXParser;\n\nvar errorTypes = {\n    \"expected-doctype-but-got-start-tag\": \"info\",\n    \"expected-doctype-but-got-chars\": \"info\",\n    \"non-html-root\": \"info\",\n}\n\nvar Worker = exports.Worker = function(sender) {\n    Mirror.call(this, sender);\n    this.setTimeout(400);\n    this.context = null;\n};\n\noop.inherits(Worker, Mirror);\n\n(function() {\n\n    this.setOptions = function(options) {\n        this.context = options.context;\n    };\n\n    this.onUpdate = function() {\n        var value = this.doc.getValue();\n        if (!value)\n            return;\n        var parser = new SAXParser();\n        var errors = [];\n        var noop = function(){};\n        parser.contentHandler = {\n           startDocument: noop,\n           endDocument: noop,\n           startElement: noop,\n           endElement: noop,\n           characters: noop\n        };\n        parser.errorHandler = {\n            error: function(message, location, code) {\n                errors.push({\n                    row: location.line,\n                    column: location.column,\n                    text: message,\n                    type: errorTypes[code] || \"error\"\n                });\n            }\n        };\n        if (this.context)\n            parser.parseFragment(value, this.context);\n        else\n            parser.parse(value);\n        this.sender.emit(\"error\", errors);\n    };\n\n}).call(Worker.prototype);\n\n});\n\nace.define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\nfunction Empty() {}\n\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function bind(that) { // .length is 1\n        var target = this;\n        if (typeof target != \"function\") {\n            throw new TypeError(\"Function.prototype.bind called on incompatible \" + target);\n        }\n        var args = slice.call(arguments, 1); // for normal call\n        var bound = function () {\n\n            if (this instanceof bound) {\n\n                var result = target.apply(\n                    this,\n                    args.concat(slice.call(arguments))\n                );\n                if (Object(result) === result) {\n                    return result;\n                }\n                return this;\n\n            } else {\n                return target.apply(\n                    that,\n                    args.concat(slice.call(arguments))\n                );\n\n            }\n\n        };\n        if(target.prototype) {\n            Empty.prototype = target.prototype;\n            bound.prototype = new Empty();\n            Empty.prototype = null;\n        }\n        return bound;\n    };\n}\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar _toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n    defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n    defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n    lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n    lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\nif ([1,2].splice(0).length != 2) {\n    if(function() { // test IE < 9 to splice bug - see issue #138\n        function makeArray(l) {\n            var a = new Array(l+2);\n            a[0] = a[1] = 0;\n            return a;\n        }\n        var array = [], lengthBefore;\n        \n        array.splice.apply(array, makeArray(20));\n        array.splice.apply(array, makeArray(26));\n\n        lengthBefore = array.length; //46\n        array.splice(5, 0, \"XXX\"); // add one element\n\n        lengthBefore + 1 == array.length\n\n        if (lengthBefore + 1 == array.length) {\n            return true;// has right splice implementation without bugs\n        }\n    }()) {//IE 6/7\n        var array_splice = Array.prototype.splice;\n        Array.prototype.splice = function(start, deleteCount) {\n            if (!arguments.length) {\n                return [];\n            } else {\n                return array_splice.apply(this, [\n                    start === void 0 ? 0 : start,\n                    deleteCount === void 0 ? (this.length - start) : deleteCount\n                ].concat(slice.call(arguments, 2)))\n            }\n        };\n    } else {//IE8\n        Array.prototype.splice = function(pos, removeCount){\n            var length = this.length;\n            if (pos > 0) {\n                if (pos > length)\n                    pos = length;\n            } else if (pos == void 0) {\n                pos = 0;\n            } else if (pos < 0) {\n                pos = Math.max(length + pos, 0);\n            }\n\n            if (!(pos+removeCount < length))\n                removeCount = length - pos;\n\n            var removed = this.slice(pos, pos+removeCount);\n            var insert = slice.call(arguments, 2);\n            var add = insert.length;            \n            if (pos === length) {\n                if (add) {\n                    this.push.apply(this, insert);\n                }\n            } else {\n                var remove = Math.min(removeCount, length - pos);\n                var tailOldPos = pos + remove;\n                var tailNewPos = tailOldPos + add - remove;\n                var tailCount = length - tailOldPos;\n                var lengthAfterRemove = length - remove;\n\n                if (tailNewPos < tailOldPos) { // case A\n                    for (var i = 0; i < tailCount; ++i) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } else if (tailNewPos > tailOldPos) { // case B\n                    for (i = tailCount; i--; ) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } // else, add == remove (nothing to do)\n\n                if (add && pos === lengthAfterRemove) {\n                    this.length = lengthAfterRemove; // truncate array\n                    this.push.apply(this, insert);\n                } else {\n                    this.length = lengthAfterRemove + add; // reserves space\n                    for (i = 0; i < add; ++i) {\n                        this[pos+i] = insert[i];\n                    }\n                }\n            }\n            return removed;\n        };\n    }\n}\nif (!Array.isArray) {\n    Array.isArray = function isArray(obj) {\n        return _toString(obj) == \"[object Array]\";\n    };\n}\nvar boxedString = Object(\"a\"),\n    splitString = boxedString[0] != \"a\" || !(0 in boxedString);\n\nif (!Array.prototype.forEach) {\n    Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            thisp = arguments[1],\n            i = -1,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        while (++i < length) {\n            if (i in self) {\n                fun.call(thisp, self[i], i, object);\n            }\n        }\n    };\n}\nif (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            result = Array(length),\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self)\n                result[i] = fun.call(thisp, self[i], i, object);\n        }\n        return result;\n    };\n}\nif (!Array.prototype.filter) {\n    Array.prototype.filter = function filter(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                    object,\n            length = self.length >>> 0,\n            result = [],\n            value,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self) {\n                value = self[i];\n                if (fun.call(thisp, value, i, object)) {\n                    result.push(value);\n                }\n            }\n        }\n        return result;\n    };\n}\nif (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && !fun.call(thisp, self[i], i, object)) {\n                return false;\n            }\n        }\n        return true;\n    };\n}\nif (!Array.prototype.some) {\n    Array.prototype.some = function some(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, object)) {\n                return true;\n            }\n        }\n        return false;\n    };\n}\nif (!Array.prototype.reduce) {\n    Array.prototype.reduce = function reduce(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduce of empty array with no initial value\");\n        }\n\n        var i = 0;\n        var result;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i++];\n                    break;\n                }\n                if (++i >= length) {\n                    throw new TypeError(\"reduce of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        for (; i < length; i++) {\n            if (i in self) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        }\n\n        return result;\n    };\n}\nif (!Array.prototype.reduceRight) {\n    Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduceRight of empty array with no initial value\");\n        }\n\n        var result, i = length - 1;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i--];\n                    break;\n                }\n                if (--i < 0) {\n                    throw new TypeError(\"reduceRight of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        do {\n            if (i in this) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        } while (i--);\n\n        return result;\n    };\n}\nif (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {\n    Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n\n        var i = 0;\n        if (arguments.length > 1) {\n            i = toInteger(arguments[1]);\n        }\n        i = i >= 0 ? i : Math.max(0, length + i);\n        for (; i < length; i++) {\n            if (i in self && self[i] === sought) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {\n    Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n        var i = length - 1;\n        if (arguments.length > 1) {\n            i = Math.min(i, toInteger(arguments[1]));\n        }\n        i = i >= 0 ? i : length - Math.abs(i);\n        for (; i >= 0; i--) {\n            if (i in self && sought === self[i]) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Object.getPrototypeOf) {\n    Object.getPrototypeOf = function getPrototypeOf(object) {\n        return object.__proto__ || (\n            object.constructor ?\n            object.constructor.prototype :\n            prototypeOfObject\n        );\n    };\n}\nif (!Object.getOwnPropertyDescriptor) {\n    var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n                         \"non-object: \";\n    Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT + object);\n        if (!owns(object, property))\n            return;\n\n        var descriptor, getter, setter;\n        descriptor =  { enumerable: true, configurable: true };\n        if (supportsAccessors) {\n            var prototype = object.__proto__;\n            object.__proto__ = prototypeOfObject;\n\n            var getter = lookupGetter(object, property);\n            var setter = lookupSetter(object, property);\n            object.__proto__ = prototype;\n\n            if (getter || setter) {\n                if (getter) descriptor.get = getter;\n                if (setter) descriptor.set = setter;\n                return descriptor;\n            }\n        }\n        descriptor.value = object[property];\n        return descriptor;\n    };\n}\nif (!Object.getOwnPropertyNames) {\n    Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n        return Object.keys(object);\n    };\n}\nif (!Object.create) {\n    var createEmpty;\n    if (Object.prototype.__proto__ === null) {\n        createEmpty = function () {\n            return { \"__proto__\": null };\n        };\n    } else {\n        createEmpty = function () {\n            var empty = {};\n            for (var i in empty)\n                empty[i] = null;\n            empty.constructor =\n            empty.hasOwnProperty =\n            empty.propertyIsEnumerable =\n            empty.isPrototypeOf =\n            empty.toLocaleString =\n            empty.toString =\n            empty.valueOf =\n            empty.__proto__ = null;\n            return empty;\n        }\n    }\n\n    Object.create = function create(prototype, properties) {\n        var object;\n        if (prototype === null) {\n            object = createEmpty();\n        } else {\n            if (typeof prototype != \"object\")\n                throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n            var Type = function () {};\n            Type.prototype = prototype;\n            object = new Type();\n            object.__proto__ = prototype;\n        }\n        if (properties !== void 0)\n            Object.defineProperties(object, properties);\n        return object;\n    };\n}\n\nfunction doesDefinePropertyWork(object) {\n    try {\n        Object.defineProperty(object, \"sentinel\", {});\n        return \"sentinel\" in object;\n    } catch (exception) {\n    }\n}\nif (Object.defineProperty) {\n    var definePropertyWorksOnObject = doesDefinePropertyWork({});\n    var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n        doesDefinePropertyWork(document.createElement(\"div\"));\n    if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n        var definePropertyFallback = Object.defineProperty;\n    }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n    var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n    var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n    var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n                                      \"on this javascript engine\";\n\n    Object.defineProperty = function defineProperty(object, property, descriptor) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n        if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n            throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n        if (definePropertyFallback) {\n            try {\n                return definePropertyFallback.call(Object, object, property, descriptor);\n            } catch (exception) {\n            }\n        }\n        if (owns(descriptor, \"value\")) {\n\n            if (supportsAccessors && (lookupGetter(object, property) ||\n                                      lookupSetter(object, property)))\n            {\n                var prototype = object.__proto__;\n                object.__proto__ = prototypeOfObject;\n                delete object[property];\n                object[property] = descriptor.value;\n                object.__proto__ = prototype;\n            } else {\n                object[property] = descriptor.value;\n            }\n        } else {\n            if (!supportsAccessors)\n                throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n            if (owns(descriptor, \"get\"))\n                defineGetter(object, property, descriptor.get);\n            if (owns(descriptor, \"set\"))\n                defineSetter(object, property, descriptor.set);\n        }\n\n        return object;\n    };\n}\nif (!Object.defineProperties) {\n    Object.defineProperties = function defineProperties(object, properties) {\n        for (var property in properties) {\n            if (owns(properties, property))\n                Object.defineProperty(object, property, properties[property]);\n        }\n        return object;\n    };\n}\nif (!Object.seal) {\n    Object.seal = function seal(object) {\n        return object;\n    };\n}\nif (!Object.freeze) {\n    Object.freeze = function freeze(object) {\n        return object;\n    };\n}\ntry {\n    Object.freeze(function () {});\n} catch (exception) {\n    Object.freeze = (function freeze(freezeObject) {\n        return function freeze(object) {\n            if (typeof object == \"function\") {\n                return object;\n            } else {\n                return freezeObject(object);\n            }\n        };\n    })(Object.freeze);\n}\nif (!Object.preventExtensions) {\n    Object.preventExtensions = function preventExtensions(object) {\n        return object;\n    };\n}\nif (!Object.isSealed) {\n    Object.isSealed = function isSealed(object) {\n        return false;\n    };\n}\nif (!Object.isFrozen) {\n    Object.isFrozen = function isFrozen(object) {\n        return false;\n    };\n}\nif (!Object.isExtensible) {\n    Object.isExtensible = function isExtensible(object) {\n        if (Object(object) === object) {\n            throw new TypeError(); // TODO message\n        }\n        var name = '';\n        while (owns(object, name)) {\n            name += '?';\n        }\n        object[name] = true;\n        var returnValue = owns(object, name);\n        delete object[name];\n        return returnValue;\n    };\n}\nif (!Object.keys) {\n    var hasDontEnumBug = true,\n        dontEnums = [\n            \"toString\",\n            \"toLocaleString\",\n            \"valueOf\",\n            \"hasOwnProperty\",\n            \"isPrototypeOf\",\n            \"propertyIsEnumerable\",\n            \"constructor\"\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    for (var key in {\"toString\": null}) {\n        hasDontEnumBug = false;\n    }\n\n    Object.keys = function keys(object) {\n\n        if (\n            (typeof object != \"object\" && typeof object != \"function\") ||\n            object === null\n        ) {\n            throw new TypeError(\"Object.keys called on a non-object\");\n        }\n\n        var keys = [];\n        for (var name in object) {\n            if (owns(object, name)) {\n                keys.push(name);\n            }\n        }\n\n        if (hasDontEnumBug) {\n            for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n                var dontEnum = dontEnums[i];\n                if (owns(object, dontEnum)) {\n                    keys.push(dontEnum);\n                }\n            }\n        }\n        return keys;\n    };\n\n}\nif (!Date.now) {\n    Date.now = function now() {\n        return new Date().getTime();\n    };\n}\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n    \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n    \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n    ws = \"[\" + ws + \"]\";\n    var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n        trimEndRegexp = new RegExp(ws + ws + \"*$\");\n    String.prototype.trim = function trim() {\n        return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n    };\n}\n\nfunction toInteger(n) {\n    n = +n;\n    if (n !== n) { // isNaN\n        n = 0;\n    } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {\n        n = (n > 0 || -1) * Math.floor(Math.abs(n));\n    }\n    return n;\n}\n\nfunction isPrimitive(input) {\n    var type = typeof input;\n    return (\n        input === null ||\n        type === \"undefined\" ||\n        type === \"boolean\" ||\n        type === \"number\" ||\n        type === \"string\"\n    );\n}\n\nfunction toPrimitive(input) {\n    var val, valueOf, toString;\n    if (isPrimitive(input)) {\n        return input;\n    }\n    valueOf = input.valueOf;\n    if (typeof valueOf === \"function\") {\n        val = valueOf.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    toString = input.toString;\n    if (typeof toString === \"function\") {\n        val = toString.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    throw new TypeError();\n}\nvar toObject = function (o) {\n    if (o == null) { // this matches both null and undefined\n        throw new TypeError(\"can't convert \"+o+\" to object\");\n    }\n    return Object(o);\n};\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/worker-javascript.js",
    "content": "\"no use strict\";\n;(function(window) {\nif (typeof window.window != \"undefined\" && window.document) {\n    return;\n}\n\nwindow.console = function() {\n    var msgs = Array.prototype.slice.call(arguments, 0);\n    postMessage({type: \"log\", data: msgs});\n};\nwindow.console.error =\nwindow.console.warn = \nwindow.console.log =\nwindow.console.trace = window.console;\n\nwindow.window = window;\nwindow.ace = window;\n\nwindow.onerror = function(message, file, line, col, err) {\n    postMessage({type: \"error\", data: {\n        message: message,\n        file: file,\n        line: line, \n        col: col,\n        stack: err.stack\n    }});\n};\n\nwindow.normalizeModule = function(parentId, moduleName) {\n    // normalize plugin requires\n    if (moduleName.indexOf(\"!\") !== -1) {\n        var chunks = moduleName.split(\"!\");\n        return window.normalizeModule(parentId, chunks[0]) + \"!\" + window.normalizeModule(parentId, chunks[1]);\n    }\n    // normalize relative requires\n    if (moduleName.charAt(0) == \".\") {\n        var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n        moduleName = (base ? base + \"/\" : \"\") + moduleName;\n        \n        while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n            var previous = moduleName;\n            moduleName = moduleName.replace(/^\\.\\//, \"\").replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n        }\n    }\n    \n    return moduleName;\n};\n\nwindow.require = function(parentId, id) {\n    if (!id) {\n        id = parentId;\n        parentId = null;\n    }\n    if (!id.charAt)\n        throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");\n\n    id = window.normalizeModule(parentId, id);\n\n    var module = window.require.modules[id];\n    if (module) {\n        if (!module.initialized) {\n            module.initialized = true;\n            module.exports = module.factory().exports;\n        }\n        return module.exports;\n    }\n    \n    var chunks = id.split(\"/\");\n    if (!window.require.tlns)\n        return console.log(\"unable to load \" + id);\n    chunks[0] = window.require.tlns[chunks[0]] || chunks[0];\n    var path = chunks.join(\"/\") + \".js\";\n    \n    window.require.id = id;\n    importScripts(path);\n    return window.require(parentId, id);\n};\nwindow.require.modules = {};\nwindow.require.tlns = {};\n\nwindow.define = function(id, deps, factory) {\n    if (arguments.length == 2) {\n        factory = deps;\n        if (typeof id != \"string\") {\n            deps = id;\n            id = window.require.id;\n        }\n    } else if (arguments.length == 1) {\n        factory = id;\n        deps = [];\n        id = window.require.id;\n    }\n    \n    if (typeof factory != \"function\") {\n        window.require.modules[id] = {\n            exports: factory,\n            initialized: true\n        };\n        return;\n    }\n\n    if (!deps.length)\n        // If there is no dependencies, we inject 'require', 'exports' and\n        // 'module' as dependencies, to provide CommonJS compatibility.\n        deps = ['require', 'exports', 'module'];\n\n    var req = function(childId) {\n        return window.require(id, childId);\n    };\n\n    window.require.modules[id] = {\n        exports: {},\n        factory: function() {\n            var module = this;\n            var returnExports = factory.apply(this, deps.map(function(dep) {\n              switch(dep) {\n                  // Because 'require', 'exports' and 'module' aren't actual\n                  // dependencies, we must handle them seperately.\n                  case 'require': return req;\n                  case 'exports': return module.exports;\n                  case 'module':  return module;\n                  // But for all other dependencies, we can just go ahead and\n                  // require them.\n                  default:        return req(dep);\n              }\n            }));\n            if (returnExports)\n                module.exports = returnExports;\n            return module;\n        }\n    };\n};\nwindow.define.amd = {};\n\nwindow.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n    require.tlns = topLevelNamespaces;\n};\n\nwindow.initSender = function initSender() {\n\n    var EventEmitter = window.require(\"ace/lib/event_emitter\").EventEmitter;\n    var oop = window.require(\"ace/lib/oop\");\n    \n    var Sender = function() {};\n    \n    (function() {\n        \n        oop.implement(this, EventEmitter);\n                \n        this.callback = function(data, callbackId) {\n            postMessage({\n                type: \"call\",\n                id: callbackId,\n                data: data\n            });\n        };\n    \n        this.emit = function(name, data) {\n            postMessage({\n                type: \"event\",\n                name: name,\n                data: data\n            });\n        };\n        \n    }).call(Sender.prototype);\n    \n    return new Sender();\n};\n\nvar main = window.main = null;\nvar sender = window.sender = null;\n\nwindow.onmessage = function(e) {\n    var msg = e.data;\n    if (msg.command) {\n        if (main[msg.command])\n            main[msg.command].apply(main, msg.args);\n        else\n            throw new Error(\"Unknown command:\" + msg.command);\n    }\n    else if (msg.init) {        \n        initBaseUrls(msg.tlns);\n        require(\"ace/lib/es5-shim\");\n        sender = window.sender = initSender();\n        var clazz = require(msg.module)[msg.classname];\n        main = window.main = new clazz(sender);\n    } \n    else if (msg.event && sender) {\n        sender._signal(msg.event, msg.data);\n    }\n};\n})(this);\n\nace.define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.inherits = function(ctor, 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\nexports.mixin = function(obj, mixin) {\n    for (var key in mixin) {\n        obj[key] = mixin[key];\n    }\n    return obj;\n};\n\nexports.implement = function(proto, mixin) {\n    exports.mixin(proto, mixin);\n};\n\n});\n\nace.define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nvar EventEmitter = {};\nvar stopPropagation = function() { this.propagationStopped = true; };\nvar preventDefault = function() { this.defaultPrevented = true; };\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n    this._eventRegistry || (this._eventRegistry = {});\n    this._defaultHandlers || (this._defaultHandlers = {});\n\n    var listeners = this._eventRegistry[eventName] || [];\n    var defaultHandler = this._defaultHandlers[eventName];\n    if (!listeners.length && !defaultHandler)\n        return;\n\n    if (typeof e != \"object\" || !e)\n        e = {};\n\n    if (!e.type)\n        e.type = eventName;\n    if (!e.stopPropagation)\n        e.stopPropagation = stopPropagation;\n    if (!e.preventDefault)\n        e.preventDefault = preventDefault;\n\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++) {\n        listeners[i](e, this);\n        if (e.propagationStopped)\n            break;\n    }\n    \n    if (defaultHandler && !e.defaultPrevented)\n        return defaultHandler(e, this);\n};\n\n\nEventEmitter._signal = function(eventName, e) {\n    var listeners = (this._eventRegistry || {})[eventName];\n    if (!listeners)\n        return;\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++)\n        listeners[i](e, this);\n};\n\nEventEmitter.once = function(eventName, callback) {\n    var _self = this;\n    callback && this.addEventListener(eventName, function newCallback() {\n        _self.removeEventListener(eventName, newCallback);\n        callback.apply(null, arguments);\n    });\n};\n\n\nEventEmitter.setDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        handlers = this._defaultHandlers = {_disabled_: {}};\n    \n    if (handlers[eventName]) {\n        var old = handlers[eventName];\n        var disabled = handlers._disabled_[eventName];\n        if (!disabled)\n            handlers._disabled_[eventName] = disabled = [];\n        disabled.push(old);\n        var i = disabled.indexOf(callback);\n        if (i != -1) \n            disabled.splice(i, 1);\n    }\n    handlers[eventName] = callback;\n};\nEventEmitter.removeDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        return;\n    var disabled = handlers._disabled_[eventName];\n    \n    if (handlers[eventName] == callback) {\n        var old = handlers[eventName];\n        if (disabled)\n            this.setDefaultHandler(eventName, disabled.pop());\n    } else if (disabled) {\n        var i = disabled.indexOf(callback);\n        if (i != -1)\n            disabled.splice(i, 1);\n    }\n};\n\nEventEmitter.on =\nEventEmitter.addEventListener = function(eventName, callback, capturing) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        listeners = this._eventRegistry[eventName] = [];\n\n    if (listeners.indexOf(callback) == -1)\n        listeners[capturing ? \"unshift\" : \"push\"](callback);\n    return callback;\n};\n\nEventEmitter.off =\nEventEmitter.removeListener =\nEventEmitter.removeEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        return;\n\n    var index = listeners.indexOf(callback);\n    if (index !== -1)\n        listeners.splice(index, 1);\n};\n\nEventEmitter.removeAllListeners = function(eventName) {\n    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n};\n\nexports.EventEmitter = EventEmitter;\n\n});\n\nace.define(\"ace/range\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nvar comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n    this.start = {\n        row: startRow,\n        column: startColumn\n    };\n\n    this.end = {\n        row: endRow,\n        column: endColumn\n    };\n};\n\n(function() {\n    this.isEqual = function(range) {\n        return this.start.row === range.start.row &&\n            this.end.row === range.end.row &&\n            this.start.column === range.start.column &&\n            this.end.column === range.end.column;\n    };\n    this.toString = function() {\n        return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n            \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n    };\n\n    this.contains = function(row, column) {\n        return this.compare(row, column) == 0;\n    };\n    this.compareRange = function(range) {\n        var cmp,\n            end = range.end,\n            start = range.start;\n\n        cmp = this.compare(end.row, end.column);\n        if (cmp == 1) {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == 1) {\n                return 2;\n            } else if (cmp == 0) {\n                return 1;\n            } else {\n                return 0;\n            }\n        } else if (cmp == -1) {\n            return -2;\n        } else {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == -1) {\n                return -1;\n            } else if (cmp == 1) {\n                return 42;\n            } else {\n                return 0;\n            }\n        }\n    };\n    this.comparePoint = function(p) {\n        return this.compare(p.row, p.column);\n    };\n    this.containsRange = function(range) {\n        return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n    };\n    this.intersects = function(range) {\n        var cmp = this.compareRange(range);\n        return (cmp == -1 || cmp == 0 || cmp == 1);\n    };\n    this.isEnd = function(row, column) {\n        return this.end.row == row && this.end.column == column;\n    };\n    this.isStart = function(row, column) {\n        return this.start.row == row && this.start.column == column;\n    };\n    this.setStart = function(row, column) {\n        if (typeof row == \"object\") {\n            this.start.column = row.column;\n            this.start.row = row.row;\n        } else {\n            this.start.row = row;\n            this.start.column = column;\n        }\n    };\n    this.setEnd = function(row, column) {\n        if (typeof row == \"object\") {\n            this.end.column = row.column;\n            this.end.row = row.row;\n        } else {\n            this.end.row = row;\n            this.end.column = column;\n        }\n    };\n    this.inside = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column) || this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideStart = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideEnd = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.compare = function(row, column) {\n        if (!this.isMultiLine()) {\n            if (row === this.start.row) {\n                return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n            };\n        }\n\n        if (row < this.start.row)\n            return -1;\n\n        if (row > this.end.row)\n            return 1;\n\n        if (this.start.row === row)\n            return column >= this.start.column ? 0 : -1;\n\n        if (this.end.row === row)\n            return column <= this.end.column ? 0 : 1;\n\n        return 0;\n    };\n    this.compareStart = function(row, column) {\n        if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareEnd = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareInside = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.clipRows = function(firstRow, lastRow) {\n        if (this.end.row > lastRow)\n            var end = {row: lastRow + 1, column: 0};\n        else if (this.end.row < firstRow)\n            var end = {row: firstRow, column: 0};\n\n        if (this.start.row > lastRow)\n            var start = {row: lastRow + 1, column: 0};\n        else if (this.start.row < firstRow)\n            var start = {row: firstRow, column: 0};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n    this.extend = function(row, column) {\n        var cmp = this.compare(row, column);\n\n        if (cmp == 0)\n            return this;\n        else if (cmp == -1)\n            var start = {row: row, column: column};\n        else\n            var end = {row: row, column: column};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n\n    this.isEmpty = function() {\n        return (this.start.row === this.end.row && this.start.column === this.end.column);\n    };\n    this.isMultiLine = function() {\n        return (this.start.row !== this.end.row);\n    };\n    this.clone = function() {\n        return Range.fromPoints(this.start, this.end);\n    };\n    this.collapseRows = function() {\n        if (this.end.column == 0)\n            return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)\n        else\n            return new Range(this.start.row, 0, this.end.row, 0)\n    };\n    this.toScreenRange = function(session) {\n        var screenPosStart = session.documentToScreenPosition(this.start);\n        var screenPosEnd = session.documentToScreenPosition(this.end);\n\n        return new Range(\n            screenPosStart.row, screenPosStart.column,\n            screenPosEnd.row, screenPosEnd.column\n        );\n    };\n    this.moveBy = function(row, column) {\n        this.start.row += row;\n        this.start.column += column;\n        this.end.row += row;\n        this.end.column += column;\n    };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n    return new Range(start.row, start.column, end.row, end.column);\n};\nRange.comparePoints = comparePoints;\n\nRange.comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\n\n\nexports.Range = Range;\n});\n\nace.define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n    this.$onChange = this.onChange.bind(this);\n    this.attach(doc);\n    \n    if (typeof column == \"undefined\")\n        this.setPosition(row.row, row.column);\n    else\n        this.setPosition(row, column);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.getPosition = function() {\n        return this.$clipPositionToDocument(this.row, this.column);\n    };\n    this.getDocument = function() {\n        return this.document;\n    };\n    this.$insertRight = false;\n    this.onChange = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n\n        if (range.start.row == range.end.row && range.start.row != this.row)\n            return;\n\n        if (range.start.row > this.row)\n            return;\n\n        if (range.start.row == this.row && range.start.column > this.column)\n            return;\n\n        var row = this.row;\n        var column = this.column;\n        var start = range.start;\n        var end = range.end;\n\n        if (delta.action === \"insertText\") {\n            if (start.row === row && start.column <= column) {\n                if (start.column === column && this.$insertRight) {\n                } else if (start.row === end.row) {\n                    column += end.column - start.column;\n                } else {\n                    column -= start.column;\n                    row += end.row - start.row;\n                }\n            } else if (start.row !== end.row && start.row < row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"insertLines\") {\n            if (start.row === row && column === 0 && this.$insertRight) {\n            }\n            else if (start.row <= row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"removeText\") {\n            if (start.row === row && start.column < column) {\n                if (end.column >= column)\n                    column = start.column;\n                else\n                    column = Math.max(0, column - (end.column - start.column));\n\n            } else if (start.row !== end.row && start.row < row) {\n                if (end.row === row)\n                    column = Math.max(0, column - end.column) + start.column;\n                row -= (end.row - start.row);\n            } else if (end.row === row) {\n                row -= end.row - start.row;\n                column = Math.max(0, column - end.column) + start.column;\n            }\n        } else if (delta.action == \"removeLines\") {\n            if (start.row <= row) {\n                if (end.row <= row)\n                    row -= end.row - start.row;\n                else {\n                    row = start.row;\n                    column = 0;\n                }\n            }\n        }\n\n        this.setPosition(row, column, true);\n    };\n    this.setPosition = function(row, column, noClip) {\n        var pos;\n        if (noClip) {\n            pos = {\n                row: row,\n                column: column\n            };\n        } else {\n            pos = this.$clipPositionToDocument(row, column);\n        }\n\n        if (this.row == pos.row && this.column == pos.column)\n            return;\n\n        var old = {\n            row: this.row,\n            column: this.column\n        };\n\n        this.row = pos.row;\n        this.column = pos.column;\n        this._signal(\"change\", {\n            old: old,\n            value: pos\n        });\n    };\n    this.detach = function() {\n        this.document.removeEventListener(\"change\", this.$onChange);\n    };\n    this.attach = function(doc) {\n        this.document = doc || this.document;\n        this.document.on(\"change\", this.$onChange);\n    };\n    this.$clipPositionToDocument = function(row, column) {\n        var pos = {};\n\n        if (row >= this.document.getLength()) {\n            pos.row = Math.max(0, this.document.getLength() - 1);\n            pos.column = this.document.getLine(pos.row).length;\n        }\n        else if (row < 0) {\n            pos.row = 0;\n            pos.column = 0;\n        }\n        else {\n            pos.row = row;\n            pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n        }\n\n        if (column < 0)\n            pos.column = 0;\n\n        return pos;\n    };\n\n}).call(Anchor.prototype);\n\n});\n\nace.define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\nvar Document = function(text) {\n    this.$lines = [];\n    if (text.length === 0) {\n        this.$lines = [\"\"];\n    } else if (Array.isArray(text)) {\n        this._insertLines(0, text);\n    } else {\n        this.insert({row: 0, column:0}, text);\n    }\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setValue = function(text) {\n        var len = this.getLength();\n        this.remove(new Range(0, 0, len, this.getLine(len-1).length));\n        this.insert({row: 0, column:0}, text);\n    };\n    this.getValue = function() {\n        return this.getAllLines().join(this.getNewLineCharacter());\n    };\n    this.createAnchor = function(row, column) {\n        return new Anchor(this, row, column);\n    };\n    if (\"aaa\".split(/a/).length === 0)\n        this.$split = function(text) {\n            return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n        };\n    else\n        this.$split = function(text) {\n            return text.split(/\\r\\n|\\r|\\n/);\n        };\n\n\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n        this.$autoNewLine = match ? match[1] : \"\\n\";\n        this._signal(\"changeNewLineMode\");\n    };\n    this.getNewLineCharacter = function() {\n        switch (this.$newLineMode) {\n          case \"windows\":\n            return \"\\r\\n\";\n          case \"unix\":\n            return \"\\n\";\n          default:\n            return this.$autoNewLine || \"\\n\";\n        }\n    };\n\n    this.$autoNewLine = \"\";\n    this.$newLineMode = \"auto\";\n    this.setNewLineMode = function(newLineMode) {\n        if (this.$newLineMode === newLineMode)\n            return;\n\n        this.$newLineMode = newLineMode;\n        this._signal(\"changeNewLineMode\");\n    };\n    this.getNewLineMode = function() {\n        return this.$newLineMode;\n    };\n    this.isNewLine = function(text) {\n        return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n    };\n    this.getLine = function(row) {\n        return this.$lines[row] || \"\";\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.$lines.slice(firstRow, lastRow + 1);\n    };\n    this.getAllLines = function() {\n        return this.getLines(0, this.getLength());\n    };\n    this.getLength = function() {\n        return this.$lines.length;\n    };\n    this.getTextRange = function(range) {\n        if (range.start.row == range.end.row) {\n            return this.getLine(range.start.row)\n                .substring(range.start.column, range.end.column);\n        }\n        var lines = this.getLines(range.start.row, range.end.row);\n        lines[0] = (lines[0] || \"\").substring(range.start.column);\n        var l = lines.length - 1;\n        if (range.end.row - range.start.row == l)\n            lines[l] = lines[l].substring(0, range.end.column);\n        return lines.join(this.getNewLineCharacter());\n    };\n\n    this.$clipPosition = function(position) {\n        var length = this.getLength();\n        if (position.row >= length) {\n            position.row = Math.max(0, length - 1);\n            position.column = this.getLine(length-1).length;\n        } else if (position.row < 0)\n            position.row = 0;\n        return position;\n    };\n    this.insert = function(position, text) {\n        if (!text || text.length === 0)\n            return position;\n\n        position = this.$clipPosition(position);\n        if (this.getLength() <= 1)\n            this.$detectNewLine(text);\n\n        var lines = this.$split(text);\n        var firstLine = lines.splice(0, 1)[0];\n        var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];\n\n        position = this.insertInLine(position, firstLine);\n        if (lastLine !== null) {\n            position = this.insertNewLine(position); // terminate first line\n            position = this._insertLines(position.row, lines);\n            position = this.insertInLine(position, lastLine || \"\");\n        }\n        return position;\n    };\n    this.insertLines = function(row, lines) {\n        if (row >= this.getLength())\n            return this.insert({row: row, column: 0}, \"\\n\" + lines.join(\"\\n\"));\n        return this._insertLines(Math.max(row, 0), lines);\n    };\n    this._insertLines = function(row, lines) {\n        if (lines.length == 0)\n            return {row: row, column: 0};\n        while (lines.length > 0xF000) {\n            var end = this._insertLines(row, lines.slice(0, 0xF000));\n            lines = lines.slice(0xF000);\n            row = end.row;\n        }\n\n        var args = [row, 0];\n        args.push.apply(args, lines);\n        this.$lines.splice.apply(this.$lines, args);\n\n        var range = new Range(row, 0, row + lines.length, 0);\n        var delta = {\n            action: \"insertLines\",\n            range: range,\n            lines: lines\n        };\n        this._signal(\"change\", { data: delta });\n        return range.end;\n    };\n    this.insertNewLine = function(position) {\n        position = this.$clipPosition(position);\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column);\n        this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));\n\n        var end = {\n            row : position.row + 1,\n            column : 0\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: this.getNewLineCharacter()\n        };\n        this._signal(\"change\", { data: delta });\n\n        return end;\n    };\n    this.insertInLine = function(position, text) {\n        if (text.length == 0)\n            return position;\n\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column) + text\n                + line.substring(position.column);\n\n        var end = {\n            row : position.row,\n            column : position.column + text.length\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: text\n        };\n        this._signal(\"change\", { data: delta });\n\n        return end;\n    };\n    this.remove = function(range) {\n        if (!(range instanceof Range))\n            range = Range.fromPoints(range.start, range.end);\n        range.start = this.$clipPosition(range.start);\n        range.end = this.$clipPosition(range.end);\n\n        if (range.isEmpty())\n            return range.start;\n\n        var firstRow = range.start.row;\n        var lastRow = range.end.row;\n\n        if (range.isMultiLine()) {\n            var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;\n            var lastFullRow = lastRow - 1;\n\n            if (range.end.column > 0)\n                this.removeInLine(lastRow, 0, range.end.column);\n\n            if (lastFullRow >= firstFullRow)\n                this._removeLines(firstFullRow, lastFullRow);\n\n            if (firstFullRow != firstRow) {\n                this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);\n                this.removeNewLine(range.start.row);\n            }\n        }\n        else {\n            this.removeInLine(firstRow, range.start.column, range.end.column);\n        }\n        return range.start;\n    };\n    this.removeInLine = function(row, startColumn, endColumn) {\n        if (startColumn == endColumn)\n            return;\n\n        var range = new Range(row, startColumn, row, endColumn);\n        var line = this.getLine(row);\n        var removed = line.substring(startColumn, endColumn);\n        var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);\n        this.$lines.splice(row, 1, newLine);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: removed\n        };\n        this._signal(\"change\", { data: delta });\n        return range.start;\n    };\n    this.removeLines = function(firstRow, lastRow) {\n        if (firstRow < 0 || lastRow >= this.getLength())\n            return this.remove(new Range(firstRow, 0, lastRow + 1, 0));\n        return this._removeLines(firstRow, lastRow);\n    };\n\n    this._removeLines = function(firstRow, lastRow) {\n        var range = new Range(firstRow, 0, lastRow + 1, 0);\n        var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);\n\n        var delta = {\n            action: \"removeLines\",\n            range: range,\n            nl: this.getNewLineCharacter(),\n            lines: removed\n        };\n        this._signal(\"change\", { data: delta });\n        return removed;\n    };\n    this.removeNewLine = function(row) {\n        var firstLine = this.getLine(row);\n        var secondLine = this.getLine(row+1);\n\n        var range = new Range(row, firstLine.length, row+1, 0);\n        var line = firstLine + secondLine;\n\n        this.$lines.splice(row, 2, line);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: this.getNewLineCharacter()\n        };\n        this._signal(\"change\", { data: delta });\n    };\n    this.replace = function(range, text) {\n        if (!(range instanceof Range))\n            range = Range.fromPoints(range.start, range.end);\n        if (text.length == 0 && range.isEmpty())\n            return range.start;\n        if (text == this.getTextRange(range))\n            return range.end;\n\n        this.remove(range);\n        if (text) {\n            var end = this.insert(range.start, text);\n        }\n        else {\n            end = range.start;\n        }\n\n        return end;\n    };\n    this.applyDeltas = function(deltas) {\n        for (var i=0; i<deltas.length; i++) {\n            var delta = deltas[i];\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"insertText\")\n                this.insert(range.start, delta.text);\n            else if (delta.action == \"removeLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"removeText\")\n                this.remove(range);\n        }\n    };\n    this.revertDeltas = function(deltas) {\n        for (var i=deltas.length-1; i>=0; i--) {\n            var delta = deltas[i];\n\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"insertText\")\n                this.remove(range);\n            else if (delta.action == \"removeLines\")\n                this._insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"removeText\")\n                this.insert(range.start, delta.text);\n        }\n    };\n    this.indexToPosition = function(index, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        for (var i = startRow || 0, l = lines.length; i < l; i++) {\n            index -= lines[i].length + newlineLength;\n            if (index < 0)\n                return {row: i, column: index + lines[i].length + newlineLength};\n        }\n        return {row: l-1, column: lines[l-1].length};\n    };\n    this.positionToIndex = function(pos, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        var index = 0;\n        var row = Math.min(pos.row, lines.length);\n        for (var i = startRow || 0; i < row; ++i)\n            index += lines[i].length + newlineLength;\n\n        return index + pos.column;\n    };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\nace.define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.last = function(a) {\n    return a[a.length - 1];\n};\n\nexports.stringReverse = function(string) {\n    return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n    var result = '';\n    while (count > 0) {\n        if (count & 1)\n            result += string;\n\n        if (count >>= 1)\n            string += string;\n    }\n    return result;\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n    return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n    return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n    var copy = {};\n    for (var key in obj) {\n        copy[key] = obj[key];\n    }\n    return copy;\n};\n\nexports.copyArray = function(array){\n    var copy = [];\n    for (var i=0, l=array.length; i<l; i++) {\n        if (array[i] && typeof array[i] == \"object\")\n            copy[i] = this.copyObject( array[i] );\n        else \n            copy[i] = array[i];\n    }\n    return copy;\n};\n\nexports.deepCopy = function (obj) {\n    if (typeof obj !== \"object\" || !obj)\n        return obj;\n    var cons = obj.constructor;\n    if (cons === RegExp)\n        return obj;\n    \n    var copy = cons();\n    for (var key in obj) {\n        if (typeof obj[key] === \"object\") {\n            copy[key] = exports.deepCopy(obj[key]);\n        } else {\n            copy[key] = obj[key];\n        }\n    }\n    return copy;\n};\n\nexports.arrayToMap = function(arr) {\n    var map = {};\n    for (var i=0; i<arr.length; i++) {\n        map[arr[i]] = 1;\n    }\n    return map;\n\n};\n\nexports.createMap = function(props) {\n    var map = Object.create(null);\n    for (var i in props) {\n        map[i] = props[i];\n    }\n    return map;\n};\nexports.arrayRemove = function(array, value) {\n  for (var i = 0; i <= array.length; i++) {\n    if (value === array[i]) {\n      array.splice(i, 1);\n    }\n  }\n};\n\nexports.escapeRegExp = function(str) {\n    return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n};\n\nexports.escapeHTML = function(str) {\n    return str.replace(/&/g, \"&#38;\").replace(/\"/g, \"&#34;\").replace(/'/g, \"&#39;\").replace(/</g, \"&#60;\");\n};\n\nexports.getMatchOffsets = function(string, regExp) {\n    var matches = [];\n\n    string.replace(regExp, function(str) {\n        matches.push({\n            offset: arguments[arguments.length-2],\n            length: str.length\n        });\n    });\n\n    return matches;\n};\nexports.deferredCall = function(fcn) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var deferred = function(timeout) {\n        deferred.cancel();\n        timer = setTimeout(callback, timeout || 0);\n        return deferred;\n    };\n\n    deferred.schedule = deferred;\n\n    deferred.call = function() {\n        this.cancel();\n        fcn();\n        return deferred;\n    };\n\n    deferred.cancel = function() {\n        clearTimeout(timer);\n        timer = null;\n        return deferred;\n    };\n    \n    deferred.isPending = function() {\n        return timer;\n    };\n\n    return deferred;\n};\n\n\nexports.delayedCall = function(fcn, defaultTimeout) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var _self = function(timeout) {\n        if (timer == null)\n            timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n\n    _self.delay = function(timeout) {\n        timer && clearTimeout(timer);\n        timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n    _self.schedule = _self;\n\n    _self.call = function() {\n        this.cancel();\n        fcn();\n    };\n\n    _self.cancel = function() {\n        timer && clearTimeout(timer);\n        timer = null;\n    };\n\n    _self.isPending = function() {\n        return timer;\n    };\n\n    return _self;\n};\n});\n\nace.define(\"ace/worker/mirror\",[\"require\",\"exports\",\"module\",\"ace/document\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar Document = require(\"../document\").Document;\nvar lang = require(\"../lib/lang\");\n    \nvar Mirror = exports.Mirror = function(sender) {\n    this.sender = sender;\n    var doc = this.doc = new Document(\"\");\n    \n    var deferredUpdate = this.deferredUpdate = lang.delayedCall(this.onUpdate.bind(this));\n    \n    var _self = this;\n    sender.on(\"change\", function(e) {\n        doc.applyDeltas(e.data);\n        if (_self.$timeout)\n            return deferredUpdate.schedule(_self.$timeout);\n        _self.onUpdate();\n    });\n};\n\n(function() {\n    \n    this.$timeout = 500;\n    \n    this.setTimeout = function(timeout) {\n        this.$timeout = timeout;\n    };\n    \n    this.setValue = function(value) {\n        this.doc.setValue(value);\n        this.deferredUpdate.schedule(this.$timeout);\n    };\n    \n    this.getValue = function(callbackId) {\n        this.sender.callback(this.doc.getValue(), callbackId);\n    };\n    \n    this.onUpdate = function() {\n    };\n    \n    this.isPending = function() {\n        return this.deferredUpdate.isPending();\n    };\n    \n}).call(Mirror.prototype);\n\n});\n\nace.define(\"ace/mode/javascript/jshint\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\nmodule.exports = (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);throw new Error(\"Cannot find module '\"+o+\"'\")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.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})({\n1:[function(_dereq_,module,exports){\nvar identifierStartTable = [];\n\nfor (var i = 0; i < 128; i++) {\n  identifierStartTable[i] =\n    i === 36 ||           // $\n    i >= 65 && i <= 90 || // A-Z\n    i === 95 ||           // _\n    i >= 97 && i <= 122;  // a-z\n}\n\nvar identifierPartTable = [];\n\nfor (var i = 0; i < 128; i++) {\n  identifierPartTable[i] =\n    identifierStartTable[i] || // $, _, A-Z, a-z\n    i >= 48 && i <= 57;        // 0-9\n}\n\nmodule.exports = {\n  asciiIdentifierStartTable: identifierStartTable,\n  asciiIdentifierPartTable: identifierPartTable\n};\n\n},\n{}],\n2:[function(_dereq_,module,exports){\n\n(function() {\n  var root = this;\n  var previousUnderscore = root._;\n  var breaker = {};\n  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;\n  var\n    push             = ArrayProto.push,\n    slice            = ArrayProto.slice,\n    concat           = ArrayProto.concat,\n    toString         = ObjProto.toString,\n    hasOwnProperty   = ObjProto.hasOwnProperty;\n  var\n    nativeForEach      = ArrayProto.forEach,\n    nativeMap          = ArrayProto.map,\n    nativeReduce       = ArrayProto.reduce,\n    nativeReduceRight  = ArrayProto.reduceRight,\n    nativeFilter       = ArrayProto.filter,\n    nativeEvery        = ArrayProto.every,\n    nativeSome         = ArrayProto.some,\n    nativeIndexOf      = ArrayProto.indexOf,\n    nativeLastIndexOf  = ArrayProto.lastIndexOf,\n    nativeIsArray      = Array.isArray,\n    nativeKeys         = Object.keys,\n    nativeBind         = FuncProto.bind;\n  var _ = function(obj) {\n    if (obj instanceof _) return obj;\n    if (!(this instanceof _)) return new _(obj);\n    this._wrapped = obj;\n  };\n  if (typeof exports !== 'undefined') {\n    if (typeof module !== 'undefined' && module.exports) {\n      exports = module.exports = _;\n    }\n    exports._ = _;\n  } else {\n    root._ = _;\n  }\n  _.VERSION = '1.6.0';\n  var each = _.each = _.forEach = function(obj, iterator, context) {\n    if (obj == null) return obj;\n    if (nativeForEach && obj.forEach === nativeForEach) {\n      obj.forEach(iterator, context);\n    } else if (obj.length === +obj.length) {\n      for (var i = 0, length = obj.length; i < length; i++) {\n        if (iterator.call(context, obj[i], i, obj) === breaker) return;\n      }\n    } else {\n      var keys = _.keys(obj);\n      for (var i = 0, length = keys.length; i < length; i++) {\n        if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;\n      }\n    }\n    return obj;\n  };\n  _.map = _.collect = function(obj, iterator, context) {\n    var results = [];\n    if (obj == null) return results;\n    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);\n    each(obj, function(value, index, list) {\n      results.push(iterator.call(context, value, index, list));\n    });\n    return results;\n  };\n\n  var reduceError = 'Reduce of empty array with no initial value';\n  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {\n    var initial = arguments.length > 2;\n    if (obj == null) obj = [];\n    if (nativeReduce && obj.reduce === nativeReduce) {\n      if (context) iterator = _.bind(iterator, context);\n      return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);\n    }\n    each(obj, function(value, index, list) {\n      if (!initial) {\n        memo = value;\n        initial = true;\n      } else {\n        memo = iterator.call(context, memo, value, index, list);\n      }\n    });\n    if (!initial) throw new TypeError(reduceError);\n    return memo;\n  };\n  _.reduceRight = _.foldr = function(obj, iterator, memo, context) {\n    var initial = arguments.length > 2;\n    if (obj == null) obj = [];\n    if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {\n      if (context) iterator = _.bind(iterator, context);\n      return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);\n    }\n    var length = obj.length;\n    if (length !== +length) {\n      var keys = _.keys(obj);\n      length = keys.length;\n    }\n    each(obj, function(value, index, list) {\n      index = keys ? keys[--length] : --length;\n      if (!initial) {\n        memo = obj[index];\n        initial = true;\n      } else {\n        memo = iterator.call(context, memo, obj[index], index, list);\n      }\n    });\n    if (!initial) throw new TypeError(reduceError);\n    return memo;\n  };\n  _.find = _.detect = function(obj, predicate, context) {\n    var result;\n    any(obj, function(value, index, list) {\n      if (predicate.call(context, value, index, list)) {\n        result = value;\n        return true;\n      }\n    });\n    return result;\n  };\n  _.filter = _.select = function(obj, predicate, context) {\n    var results = [];\n    if (obj == null) return results;\n    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(predicate, context);\n    each(obj, function(value, index, list) {\n      if (predicate.call(context, value, index, list)) results.push(value);\n    });\n    return results;\n  };\n  _.reject = function(obj, predicate, context) {\n    return _.filter(obj, function(value, index, list) {\n      return !predicate.call(context, value, index, list);\n    }, context);\n  };\n  _.every = _.all = function(obj, predicate, context) {\n    predicate || (predicate = _.identity);\n    var result = true;\n    if (obj == null) return result;\n    if (nativeEvery && obj.every === nativeEvery) return obj.every(predicate, context);\n    each(obj, function(value, index, list) {\n      if (!(result = result && predicate.call(context, value, index, list))) return breaker;\n    });\n    return !!result;\n  };\n  var any = _.some = _.any = function(obj, predicate, context) {\n    predicate || (predicate = _.identity);\n    var result = false;\n    if (obj == null) return result;\n    if (nativeSome && obj.some === nativeSome) return obj.some(predicate, context);\n    each(obj, function(value, index, list) {\n      if (result || (result = predicate.call(context, value, index, list))) return breaker;\n    });\n    return !!result;\n  };\n  _.contains = _.include = function(obj, target) {\n    if (obj == null) return false;\n    if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;\n    return any(obj, function(value) {\n      return value === target;\n    });\n  };\n  _.invoke = function(obj, method) {\n    var args = slice.call(arguments, 2);\n    var isFunc = _.isFunction(method);\n    return _.map(obj, function(value) {\n      return (isFunc ? method : value[method]).apply(value, args);\n    });\n  };\n  _.pluck = function(obj, key) {\n    return _.map(obj, _.property(key));\n  };\n  _.where = function(obj, attrs) {\n    return _.filter(obj, _.matches(attrs));\n  };\n  _.findWhere = function(obj, attrs) {\n    return _.find(obj, _.matches(attrs));\n  };\n  _.max = function(obj, iterator, context) {\n    if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {\n      return Math.max.apply(Math, obj);\n    }\n    var result = -Infinity, lastComputed = -Infinity;\n    each(obj, function(value, index, list) {\n      var computed = iterator ? iterator.call(context, value, index, list) : value;\n      if (computed > lastComputed) {\n        result = value;\n        lastComputed = computed;\n      }\n    });\n    return result;\n  };\n  _.min = function(obj, iterator, context) {\n    if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {\n      return Math.min.apply(Math, obj);\n    }\n    var result = Infinity, lastComputed = Infinity;\n    each(obj, function(value, index, list) {\n      var computed = iterator ? iterator.call(context, value, index, list) : value;\n      if (computed < lastComputed) {\n        result = value;\n        lastComputed = computed;\n      }\n    });\n    return result;\n  };\n  _.shuffle = function(obj) {\n    var rand;\n    var index = 0;\n    var shuffled = [];\n    each(obj, function(value) {\n      rand = _.random(index++);\n      shuffled[index - 1] = shuffled[rand];\n      shuffled[rand] = value;\n    });\n    return shuffled;\n  };\n  _.sample = function(obj, n, guard) {\n    if (n == null || guard) {\n      if (obj.length !== +obj.length) obj = _.values(obj);\n      return obj[_.random(obj.length - 1)];\n    }\n    return _.shuffle(obj).slice(0, Math.max(0, n));\n  };\n  var lookupIterator = function(value) {\n    if (value == null) return _.identity;\n    if (_.isFunction(value)) return value;\n    return _.property(value);\n  };\n  _.sortBy = function(obj, iterator, context) {\n    iterator = lookupIterator(iterator);\n    return _.pluck(_.map(obj, function(value, index, list) {\n      return {\n        value: value,\n        index: index,\n        criteria: iterator.call(context, value, index, list)\n      };\n    }).sort(function(left, right) {\n      var a = left.criteria;\n      var b = right.criteria;\n      if (a !== b) {\n        if (a > b || a === void 0) return 1;\n        if (a < b || b === void 0) return -1;\n      }\n      return left.index - right.index;\n    }), 'value');\n  };\n  var group = function(behavior) {\n    return function(obj, iterator, context) {\n      var result = {};\n      iterator = lookupIterator(iterator);\n      each(obj, function(value, index) {\n        var key = iterator.call(context, value, index, obj);\n        behavior(result, key, value);\n      });\n      return result;\n    };\n  };\n  _.groupBy = group(function(result, key, value) {\n    _.has(result, key) ? result[key].push(value) : result[key] = [value];\n  });\n  _.indexBy = group(function(result, key, value) {\n    result[key] = value;\n  });\n  _.countBy = group(function(result, key) {\n    _.has(result, key) ? result[key]++ : result[key] = 1;\n  });\n  _.sortedIndex = function(array, obj, iterator, context) {\n    iterator = lookupIterator(iterator);\n    var value = iterator.call(context, obj);\n    var low = 0, high = array.length;\n    while (low < high) {\n      var mid = (low + high) >>> 1;\n      iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;\n    }\n    return low;\n  };\n  _.toArray = function(obj) {\n    if (!obj) return [];\n    if (_.isArray(obj)) return slice.call(obj);\n    if (obj.length === +obj.length) return _.map(obj, _.identity);\n    return _.values(obj);\n  };\n  _.size = function(obj) {\n    if (obj == null) return 0;\n    return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;\n  };\n  _.first = _.head = _.take = function(array, n, guard) {\n    if (array == null) return void 0;\n    if ((n == null) || guard) return array[0];\n    if (n < 0) return [];\n    return slice.call(array, 0, n);\n  };\n  _.initial = function(array, n, guard) {\n    return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));\n  };\n  _.last = function(array, n, guard) {\n    if (array == null) return void 0;\n    if ((n == null) || guard) return array[array.length - 1];\n    return slice.call(array, Math.max(array.length - n, 0));\n  };\n  _.rest = _.tail = _.drop = function(array, n, guard) {\n    return slice.call(array, (n == null) || guard ? 1 : n);\n  };\n  _.compact = function(array) {\n    return _.filter(array, _.identity);\n  };\n  var flatten = function(input, shallow, output) {\n    if (shallow && _.every(input, _.isArray)) {\n      return concat.apply(output, input);\n    }\n    each(input, function(value) {\n      if (_.isArray(value) || _.isArguments(value)) {\n        shallow ? push.apply(output, value) : flatten(value, shallow, output);\n      } else {\n        output.push(value);\n      }\n    });\n    return output;\n  };\n  _.flatten = function(array, shallow) {\n    return flatten(array, shallow, []);\n  };\n  _.without = function(array) {\n    return _.difference(array, slice.call(arguments, 1));\n  };\n  _.partition = function(array, predicate) {\n    var pass = [], fail = [];\n    each(array, function(elem) {\n      (predicate(elem) ? pass : fail).push(elem);\n    });\n    return [pass, fail];\n  };\n  _.uniq = _.unique = function(array, isSorted, iterator, context) {\n    if (_.isFunction(isSorted)) {\n      context = iterator;\n      iterator = isSorted;\n      isSorted = false;\n    }\n    var initial = iterator ? _.map(array, iterator, context) : array;\n    var results = [];\n    var seen = [];\n    each(initial, function(value, index) {\n      if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {\n        seen.push(value);\n        results.push(array[index]);\n      }\n    });\n    return results;\n  };\n  _.union = function() {\n    return _.uniq(_.flatten(arguments, true));\n  };\n  _.intersection = function(array) {\n    var rest = slice.call(arguments, 1);\n    return _.filter(_.uniq(array), function(item) {\n      return _.every(rest, function(other) {\n        return _.contains(other, item);\n      });\n    });\n  };\n  _.difference = function(array) {\n    var rest = concat.apply(ArrayProto, slice.call(arguments, 1));\n    return _.filter(array, function(value){ return !_.contains(rest, value); });\n  };\n  _.zip = function() {\n    var length = _.max(_.pluck(arguments, 'length').concat(0));\n    var results = new Array(length);\n    for (var i = 0; i < length; i++) {\n      results[i] = _.pluck(arguments, '' + i);\n    }\n    return results;\n  };\n  _.object = function(list, values) {\n    if (list == null) return {};\n    var result = {};\n    for (var i = 0, length = list.length; i < length; i++) {\n      if (values) {\n        result[list[i]] = values[i];\n      } else {\n        result[list[i][0]] = list[i][1];\n      }\n    }\n    return result;\n  };\n  _.indexOf = function(array, item, isSorted) {\n    if (array == null) return -1;\n    var i = 0, length = array.length;\n    if (isSorted) {\n      if (typeof isSorted == 'number') {\n        i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted);\n      } else {\n        i = _.sortedIndex(array, item);\n        return array[i] === item ? i : -1;\n      }\n    }\n    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);\n    for (; i < length; i++) if (array[i] === item) return i;\n    return -1;\n  };\n  _.lastIndexOf = function(array, item, from) {\n    if (array == null) return -1;\n    var hasIndex = from != null;\n    if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {\n      return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);\n    }\n    var i = (hasIndex ? from : array.length);\n    while (i--) if (array[i] === item) return i;\n    return -1;\n  };\n  _.range = function(start, stop, step) {\n    if (arguments.length <= 1) {\n      stop = start || 0;\n      start = 0;\n    }\n    step = arguments[2] || 1;\n\n    var length = Math.max(Math.ceil((stop - start) / step), 0);\n    var idx = 0;\n    var range = new Array(length);\n\n    while(idx < length) {\n      range[idx++] = start;\n      start += step;\n    }\n\n    return range;\n  };\n  var ctor = function(){};\n  _.bind = function(func, context) {\n    var args, bound;\n    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));\n    if (!_.isFunction(func)) throw new TypeError;\n    args = slice.call(arguments, 2);\n    return bound = function() {\n      if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));\n      ctor.prototype = func.prototype;\n      var self = new ctor;\n      ctor.prototype = null;\n      var result = func.apply(self, args.concat(slice.call(arguments)));\n      if (Object(result) === result) return result;\n      return self;\n    };\n  };\n  _.partial = function(func) {\n    var boundArgs = slice.call(arguments, 1);\n    return function() {\n      var position = 0;\n      var args = boundArgs.slice();\n      for (var i = 0, length = args.length; i < length; i++) {\n        if (args[i] === _) args[i] = arguments[position++];\n      }\n      while (position < arguments.length) args.push(arguments[position++]);\n      return func.apply(this, args);\n    };\n  };\n  _.bindAll = function(obj) {\n    var funcs = slice.call(arguments, 1);\n    if (funcs.length === 0) throw new Error('bindAll must be passed function names');\n    each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });\n    return obj;\n  };\n  _.memoize = function(func, hasher) {\n    var memo = {};\n    hasher || (hasher = _.identity);\n    return function() {\n      var key = hasher.apply(this, arguments);\n      return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));\n    };\n  };\n  _.delay = function(func, wait) {\n    var args = slice.call(arguments, 2);\n    return setTimeout(function(){ return func.apply(null, args); }, wait);\n  };\n  _.defer = function(func) {\n    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));\n  };\n  _.throttle = function(func, wait, options) {\n    var context, args, result;\n    var timeout = null;\n    var previous = 0;\n    options || (options = {});\n    var later = function() {\n      previous = options.leading === false ? 0 : _.now();\n      timeout = null;\n      result = func.apply(context, args);\n      context = args = null;\n    };\n    return function() {\n      var now = _.now();\n      if (!previous && options.leading === false) previous = now;\n      var remaining = wait - (now - previous);\n      context = this;\n      args = arguments;\n      if (remaining <= 0) {\n        clearTimeout(timeout);\n        timeout = null;\n        previous = now;\n        result = func.apply(context, args);\n        context = args = null;\n      } else if (!timeout && options.trailing !== false) {\n        timeout = setTimeout(later, remaining);\n      }\n      return result;\n    };\n  };\n  _.debounce = function(func, wait, immediate) {\n    var timeout, args, context, timestamp, result;\n\n    var later = function() {\n      var last = _.now() - timestamp;\n      if (last < wait) {\n        timeout = setTimeout(later, wait - last);\n      } else {\n        timeout = null;\n        if (!immediate) {\n          result = func.apply(context, args);\n          context = args = null;\n        }\n      }\n    };\n\n    return function() {\n      context = this;\n      args = arguments;\n      timestamp = _.now();\n      var callNow = immediate && !timeout;\n      if (!timeout) {\n        timeout = setTimeout(later, wait);\n      }\n      if (callNow) {\n        result = func.apply(context, args);\n        context = args = null;\n      }\n\n      return result;\n    };\n  };\n  _.once = function(func) {\n    var ran = false, memo;\n    return function() {\n      if (ran) return memo;\n      ran = true;\n      memo = func.apply(this, arguments);\n      func = null;\n      return memo;\n    };\n  };\n  _.wrap = function(func, wrapper) {\n    return _.partial(wrapper, func);\n  };\n  _.compose = function() {\n    var funcs = arguments;\n    return function() {\n      var args = arguments;\n      for (var i = funcs.length - 1; i >= 0; i--) {\n        args = [funcs[i].apply(this, args)];\n      }\n      return args[0];\n    };\n  };\n  _.after = function(times, func) {\n    return function() {\n      if (--times < 1) {\n        return func.apply(this, arguments);\n      }\n    };\n  };\n  _.keys = function(obj) {\n    if (!_.isObject(obj)) return [];\n    if (nativeKeys) return nativeKeys(obj);\n    var keys = [];\n    for (var key in obj) if (_.has(obj, key)) keys.push(key);\n    return keys;\n  };\n  _.values = function(obj) {\n    var keys = _.keys(obj);\n    var length = keys.length;\n    var values = new Array(length);\n    for (var i = 0; i < length; i++) {\n      values[i] = obj[keys[i]];\n    }\n    return values;\n  };\n  _.pairs = function(obj) {\n    var keys = _.keys(obj);\n    var length = keys.length;\n    var pairs = new Array(length);\n    for (var i = 0; i < length; i++) {\n      pairs[i] = [keys[i], obj[keys[i]]];\n    }\n    return pairs;\n  };\n  _.invert = function(obj) {\n    var result = {};\n    var keys = _.keys(obj);\n    for (var i = 0, length = keys.length; i < length; i++) {\n      result[obj[keys[i]]] = keys[i];\n    }\n    return result;\n  };\n  _.functions = _.methods = function(obj) {\n    var names = [];\n    for (var key in obj) {\n      if (_.isFunction(obj[key])) names.push(key);\n    }\n    return names.sort();\n  };\n  _.extend = function(obj) {\n    each(slice.call(arguments, 1), function(source) {\n      if (source) {\n        for (var prop in source) {\n          obj[prop] = source[prop];\n        }\n      }\n    });\n    return obj;\n  };\n  _.pick = function(obj) {\n    var copy = {};\n    var keys = concat.apply(ArrayProto, slice.call(arguments, 1));\n    each(keys, function(key) {\n      if (key in obj) copy[key] = obj[key];\n    });\n    return copy;\n  };\n  _.omit = function(obj) {\n    var copy = {};\n    var keys = concat.apply(ArrayProto, slice.call(arguments, 1));\n    for (var key in obj) {\n      if (!_.contains(keys, key)) copy[key] = obj[key];\n    }\n    return copy;\n  };\n  _.defaults = function(obj) {\n    each(slice.call(arguments, 1), function(source) {\n      if (source) {\n        for (var prop in source) {\n          if (obj[prop] === void 0) obj[prop] = source[prop];\n        }\n      }\n    });\n    return obj;\n  };\n  _.clone = function(obj) {\n    if (!_.isObject(obj)) return obj;\n    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);\n  };\n  _.tap = function(obj, interceptor) {\n    interceptor(obj);\n    return obj;\n  };\n  var eq = function(a, b, aStack, bStack) {\n    if (a === b) return a !== 0 || 1 / a == 1 / b;\n    if (a == null || b == null) return a === b;\n    if (a instanceof _) a = a._wrapped;\n    if (b instanceof _) b = b._wrapped;\n    var className = toString.call(a);\n    if (className != toString.call(b)) return false;\n    switch (className) {\n      case '[object String]':\n        return a == String(b);\n      case '[object Number]':\n        return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);\n      case '[object Date]':\n      case '[object Boolean]':\n        return +a == +b;\n      case '[object RegExp]':\n        return a.source == b.source &&\n               a.global == b.global &&\n               a.multiline == b.multiline &&\n               a.ignoreCase == b.ignoreCase;\n    }\n    if (typeof a != 'object' || typeof b != 'object') return false;\n    var length = aStack.length;\n    while (length--) {\n      if (aStack[length] == a) return bStack[length] == b;\n    }\n    var aCtor = a.constructor, bCtor = b.constructor;\n    if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&\n                             _.isFunction(bCtor) && (bCtor instanceof bCtor))\n                        && ('constructor' in a && 'constructor' in b)) {\n      return false;\n    }\n    aStack.push(a);\n    bStack.push(b);\n    var size = 0, result = true;\n    if (className == '[object Array]') {\n      size = a.length;\n      result = size == b.length;\n      if (result) {\n        while (size--) {\n          if (!(result = eq(a[size], b[size], aStack, bStack))) break;\n        }\n      }\n    } else {\n      for (var key in a) {\n        if (_.has(a, key)) {\n          size++;\n          if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;\n        }\n      }\n      if (result) {\n        for (key in b) {\n          if (_.has(b, key) && !(size--)) break;\n        }\n        result = !size;\n      }\n    }\n    aStack.pop();\n    bStack.pop();\n    return result;\n  };\n  _.isEqual = function(a, b) {\n    return eq(a, b, [], []);\n  };\n  _.isEmpty = function(obj) {\n    if (obj == null) return true;\n    if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;\n    for (var key in obj) if (_.has(obj, key)) return false;\n    return true;\n  };\n  _.isElement = function(obj) {\n    return !!(obj && obj.nodeType === 1);\n  };\n  _.isArray = nativeIsArray || function(obj) {\n    return toString.call(obj) == '[object Array]';\n  };\n  _.isObject = function(obj) {\n    return obj === Object(obj);\n  };\n  each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {\n    _['is' + name] = function(obj) {\n      return toString.call(obj) == '[object ' + name + ']';\n    };\n  });\n  if (!_.isArguments(arguments)) {\n    _.isArguments = function(obj) {\n      return !!(obj && _.has(obj, 'callee'));\n    };\n  }\n  if (typeof (/./) !== 'function') {\n    _.isFunction = function(obj) {\n      return typeof obj === 'function';\n    };\n  }\n  _.isFinite = function(obj) {\n    return isFinite(obj) && !isNaN(parseFloat(obj));\n  };\n  _.isNaN = function(obj) {\n    return _.isNumber(obj) && obj != +obj;\n  };\n  _.isBoolean = function(obj) {\n    return obj === true || obj === false || toString.call(obj) == '[object Boolean]';\n  };\n  _.isNull = function(obj) {\n    return obj === null;\n  };\n  _.isUndefined = function(obj) {\n    return obj === void 0;\n  };\n  _.has = function(obj, key) {\n    return hasOwnProperty.call(obj, key);\n  };\n  _.noConflict = function() {\n    root._ = previousUnderscore;\n    return this;\n  };\n  _.identity = function(value) {\n    return value;\n  };\n\n  _.constant = function(value) {\n    return function () {\n      return value;\n    };\n  };\n\n  _.property = function(key) {\n    return function(obj) {\n      return obj[key];\n    };\n  };\n  _.matches = function(attrs) {\n    return function(obj) {\n      if (obj === attrs) return true; //avoid comparing an object to itself.\n      for (var key in attrs) {\n        if (attrs[key] !== obj[key])\n          return false;\n      }\n      return true;\n    }\n  };\n  _.times = function(n, iterator, context) {\n    var accum = Array(Math.max(0, n));\n    for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);\n    return accum;\n  };\n  _.random = function(min, max) {\n    if (max == null) {\n      max = min;\n      min = 0;\n    }\n    return min + Math.floor(Math.random() * (max - min + 1));\n  };\n  _.now = Date.now || function() { return new Date().getTime(); };\n  var entityMap = {\n    escape: {\n      '&': '&amp;',\n      '<': '&lt;',\n      '>': '&gt;',\n      '\"': '&quot;',\n      \"'\": '&#x27;'\n    }\n  };\n  entityMap.unescape = _.invert(entityMap.escape);\n  var entityRegexes = {\n    escape:   new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),\n    unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')\n  };\n  _.each(['escape', 'unescape'], function(method) {\n    _[method] = function(string) {\n      if (string == null) return '';\n      return ('' + string).replace(entityRegexes[method], function(match) {\n        return entityMap[method][match];\n      });\n    };\n  });\n  _.result = function(object, property) {\n    if (object == null) return void 0;\n    var value = object[property];\n    return _.isFunction(value) ? value.call(object) : value;\n  };\n  _.mixin = function(obj) {\n    each(_.functions(obj), function(name) {\n      var func = _[name] = obj[name];\n      _.prototype[name] = function() {\n        var args = [this._wrapped];\n        push.apply(args, arguments);\n        return result.call(this, func.apply(_, args));\n      };\n    });\n  };\n  var idCounter = 0;\n  _.uniqueId = function(prefix) {\n    var id = ++idCounter + '';\n    return prefix ? prefix + id : id;\n  };\n  _.templateSettings = {\n    evaluate    : /<%([\\s\\S]+?)%>/g,\n    interpolate : /<%=([\\s\\S]+?)%>/g,\n    escape      : /<%-([\\s\\S]+?)%>/g\n  };\n  var noMatch = /(.)^/;\n  var escapes = {\n    \"'\":      \"'\",\n    '\\\\':     '\\\\',\n    '\\r':     'r',\n    '\\n':     'n',\n    '\\t':     't',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  var escaper = /\\\\|'|\\r|\\n|\\t|\\u2028|\\u2029/g;\n  _.template = function(text, data, settings) {\n    var render;\n    settings = _.defaults({}, settings, _.templateSettings);\n    var matcher = new RegExp([\n      (settings.escape || noMatch).source,\n      (settings.interpolate || noMatch).source,\n      (settings.evaluate || noMatch).source\n    ].join('|') + '|$', 'g');\n    var index = 0;\n    var source = \"__p+='\";\n    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n      source += text.slice(index, offset)\n        .replace(escaper, function(match) { return '\\\\' + escapes[match]; });\n\n      if (escape) {\n        source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n      }\n      if (interpolate) {\n        source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n      }\n      if (evaluate) {\n        source += \"';\\n\" + evaluate + \"\\n__p+='\";\n      }\n      index = offset + match.length;\n      return match;\n    });\n    source += \"';\\n\";\n    if (!settings.variable) source = 'with(obj||{}){\\n' + source + '}\\n';\n\n    source = \"var __t,__p='',__j=Array.prototype.join,\" +\n      \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n      source + \"return __p;\\n\";\n\n    try {\n      render = new Function(settings.variable || 'obj', '_', source);\n    } catch (e) {\n      e.source = source;\n      throw e;\n    }\n\n    if (data) return render(data, _);\n    var template = function(data) {\n      return render.call(this, data, _);\n    };\n    template.source = 'function(' + (settings.variable || 'obj') + '){\\n' + source + '}';\n\n    return template;\n  };\n  _.chain = function(obj) {\n    return _(obj).chain();\n  };\n  var result = function(obj) {\n    return this._chain ? _(obj).chain() : obj;\n  };\n  _.mixin(_);\n  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      var obj = this._wrapped;\n      method.apply(obj, arguments);\n      if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];\n      return result.call(this, obj);\n    };\n  });\n  each(['concat', 'join', 'slice'], function(name) {\n    var method = ArrayProto[name];\n    _.prototype[name] = function() {\n      return result.call(this, method.apply(this._wrapped, arguments));\n    };\n  });\n\n  _.extend(_.prototype, {\n    chain: function() {\n      this._chain = true;\n      return this;\n    },\n    value: function() {\n      return this._wrapped;\n    }\n\n  });\n  if (typeof define === 'function' && define.amd) {\n    ace.define('underscore', [], function() {\n      return _;\n    });\n  }\n}).call(this);\n\n},\n{}],\n3:[function(_dereq_,module,exports){\n\nvar _        = _dereq_(\"underscore\");\nvar events   = _dereq_(\"events\");\nvar vars     = _dereq_(\"./vars.js\");\nvar messages = _dereq_(\"./messages.js\");\nvar Lexer    = _dereq_(\"./lex.js\").Lexer;\nvar reg      = _dereq_(\"./reg.js\");\nvar state    = _dereq_(\"./state.js\").state;\nvar style    = _dereq_(\"./style.js\");\n\nvar JSHINT = (function () {\n  \"use strict\";\n\n  var anonname, // The guessed name for anonymous functions.\n    api, // Extension API\n    bang = {\n      \"<\"  : true,\n      \"<=\" : true,\n      \"==\" : true,\n      \"===\": true,\n      \"!==\": true,\n      \"!=\" : true,\n      \">\"  : true,\n      \">=\" : true,\n      \"+\"  : true,\n      \"-\"  : true,\n      \"*\"  : true,\n      \"/\"  : true,\n      \"%\"  : true\n    },\n    boolOptions = {\n      asi         : true, // if automatic semicolon insertion should be tolerated\n      bitwise     : true, // if bitwise operators should not be allowed\n      boss        : true, // if advanced usage of assignments should be allowed\n      browser     : true, // if the standard browser globals should be predefined\n      camelcase   : true, // if identifiers should be required in camel case\n      couch       : true, // if CouchDB globals should be predefined\n      curly       : true, // if curly braces around all blocks should be required\n      debug       : true, // if debugger statements should be allowed\n      devel       : true, // if logging globals should be predefined (console, alert, etc.)\n      dojo        : true, // if Dojo Toolkit globals should be predefined\n      eqeqeq      : true, // if === should be required\n      eqnull      : true, // if == null comparisons should be tolerated\n      notypeof    : true, // if should report typos in typeof comparisons\n      es3         : true, // if ES3 syntax should be allowed\n      es5         : true, // if ES5 syntax should be allowed (is now set per default)\n      esnext      : true, // if es.next specific syntax should be allowed\n      moz         : true, // if mozilla specific syntax should be allowed\n      evil        : true, // if eval should be allowed\n      expr        : true, // if ExpressionStatement should be allowed as Programs\n      forin       : true, // if for in statements must filter\n      funcscope   : true, // if only function scope should be used for scope tests\n      globalstrict: true, // if global \"use strict\"; should be allowed (also enables 'strict')\n      immed       : true, // if immediate invocations must be wrapped in parens\n      iterator    : true, // if the `__iterator__` property should be allowed\n      jasmine     : true, // Jasmine functions should be predefined\n      jquery      : true, // if jQuery globals should be predefined\n      lastsemic   : true, // if semicolons may be ommitted for the trailing\n      laxbreak    : true, // if line breaks should not be checked\n      laxcomma    : true, // if line breaks should not be checked around commas\n      loopfunc    : true, // if functions should be allowed to be defined within\n      mootools    : true, // if MooTools globals should be predefined\n      multistr    : true, // allow multiline strings\n      freeze      : true, // if modifying native object prototypes should be disallowed\n      newcap      : true, // if constructor names must be capitalized\n      noarg       : true, // if arguments.caller and arguments.callee should be\n      node        : true, // if the Node.js environment globals should be\n      noempty     : true, // if empty blocks should be disallowed\n      nonbsp      : true, // if non-breaking spaces should be disallowed\n      nonew       : true, // if using `new` for side-effects should be disallowed\n      nonstandard : true, // if non-standard (but widely adopted) globals should\n      phantom     : true, // if PhantomJS symbols should be allowed\n      plusplus    : true, // if increment/decrement should not be allowed\n      proto       : true, // if the `__proto__` property should be allowed\n      prototypejs : true, // if Prototype and Scriptaculous globals should be\n      qunit       : true, // if the QUnit environment globals should be predefined\n      rhino       : true, // if the Rhino environment globals should be predefined\n      shelljs     : true, // if ShellJS globals should be predefined\n      typed       : true, // if typed array globals should be predefined\n      undef       : true, // if variables should be declared before used\n      scripturl   : true, // if script-targeted URLs should be tolerated\n      strict      : true, // require the \"use strict\"; pragma\n      sub         : true, // if all forms of subscript notation are tolerated\n      supernew    : true, // if `new function () { ... };` and `new Object;`\n      validthis   : true, // if 'this' inside a non-constructor function is valid.\n      withstmt    : true, // if with statements should be allowed\n      worker      : true, // if Web Worker script symbols should be allowed\n      wsh         : true, // if the Windows Scripting Host environment globals\n      yui         : true, // YUI variables should be predefined\n      mocha       : true, // Mocha functions should be predefined\n      noyield     : true, // allow generators without a yield\n      onecase     : true, // if one case switch statements should be allowed\n      regexp      : true, // if the . should not be allowed in regexp literals\n      regexdash   : true  // if unescaped first/last dash (-) inside brackets\n    },\n    valOptions = {\n      maxlen       : false,\n      indent       : false,\n      maxerr       : false,\n      predef       : false, // predef is deprecated and being replaced by globals\n      globals      : false,\n      quotmark     : false, // 'single'|'double'|true\n      scope        : false,\n      maxstatements: false, // {int} max statements per function\n      maxdepth     : false, // {int} max nested block depth per function\n      maxparams    : false, // {int} max params per function\n      maxcomplexity: false, // {int} max cyclomatic complexity per function\n      shadow       : false, // if variable shadowing should be tolerated\n      unused       : true,  // warn if variables are unused. Available options:\n      latedef      : false, // warn if the variable is used before its definition\n      ignore       : false  // start/end ignoring lines of code, bypassing the lexer\n    },\n    invertedOptions = {\n      bitwise : true,\n      forin   : true,\n      newcap  : true,\n      plusplus: true,\n      regexp  : true,\n      undef   : true,\n      eqeqeq  : true,\n      strict  : true\n    },\n    renamedOptions = {\n      eqeq   : \"eqeqeq\",\n      windows: \"wsh\",\n      sloppy : \"strict\"\n    },\n\n    removedOptions = {\n      nomen: true,\n      onevar: true,\n      passfail: true,\n      white: true,\n      gcl: true,\n      smarttabs: true,\n      trailing: true\n    },\n\n    declared, // Globals that were declared using /*global ... */ syntax.\n    exported, // Variables that are used outside of the current file.\n\n    functionicity = [\n      \"closure\", \"exception\", \"global\", \"label\",\n      \"outer\", \"unused\", \"var\"\n    ],\n\n    funct, // The current function\n    functions, // All of the functions\n\n    global, // The global scope\n    implied, // Implied globals\n    inblock,\n    indent,\n    lookahead,\n    lex,\n    member,\n    membersOnly,\n    noreach,\n    predefined,    // Global variables defined by option\n\n    scope,  // The current scope\n    stack,\n    unuseds,\n    urls,\n\n    extraModules = [],\n    emitter = new events.EventEmitter();\n\n  function checkOption(name, t) {\n    name = name.trim();\n\n    if (/^[+-]W\\d{3}$/g.test(name)) {\n      return true;\n    }\n\n    if (valOptions[name] === undefined && boolOptions[name] === undefined) {\n      if (t.type !== \"jslint\" && !removedOptions[name]) {\n        error(\"E001\", t, name);\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  function isString(obj) {\n    return Object.prototype.toString.call(obj) === \"[object String]\";\n  }\n\n  function isIdentifier(tkn, value) {\n    if (!tkn)\n      return false;\n\n    if (!tkn.identifier || tkn.value !== value)\n      return false;\n\n    return true;\n  }\n\n  function isReserved(token) {\n    if (!token.reserved) {\n      return false;\n    }\n    var meta = token.meta;\n\n    if (meta && meta.isFutureReservedWord && state.option.inES5()) {\n      if (!meta.es5) {\n        return false;\n      }\n      if (meta.strictOnly) {\n        if (!state.option.strict && !state.directive[\"use strict\"]) {\n          return false;\n        }\n      }\n\n      if (token.isProperty) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  function supplant(str, data) {\n    return str.replace(/\\{([^{}]*)\\}/g, function (a, b) {\n      var r = data[b];\n      return typeof r === \"string\" || typeof r === \"number\" ? r : a;\n    });\n  }\n\n  function combine(dest, src) {\n    Object.keys(src).forEach(function (name) {\n      if (_.has(JSHINT.blacklist, name)) return;\n      dest[name] = src[name];\n    });\n  }\n\n  function assume() {\n    if (state.option.esnext) {\n      combine(predefined, vars.newEcmaIdentifiers);\n    }\n\n    if (state.option.couch) {\n      combine(predefined, vars.couch);\n    }\n\n    if (state.option.qunit) {\n      combine(predefined, vars.qunit);\n    }\n\n    if (state.option.rhino) {\n      combine(predefined, vars.rhino);\n    }\n\n    if (state.option.shelljs) {\n      combine(predefined, vars.shelljs);\n      combine(predefined, vars.node);\n    }\n    if (state.option.typed) {\n      combine(predefined, vars.typed);\n    }\n\n    if (state.option.phantom) {\n      combine(predefined, vars.phantom);\n    }\n\n    if (state.option.prototypejs) {\n      combine(predefined, vars.prototypejs);\n    }\n\n    if (state.option.node) {\n      combine(predefined, vars.node);\n      combine(predefined, vars.typed);\n    }\n\n    if (state.option.devel) {\n      combine(predefined, vars.devel);\n    }\n\n    if (state.option.dojo) {\n      combine(predefined, vars.dojo);\n    }\n\n    if (state.option.browser) {\n      combine(predefined, vars.browser);\n      combine(predefined, vars.typed);\n    }\n\n    if (state.option.nonstandard) {\n      combine(predefined, vars.nonstandard);\n    }\n\n    if (state.option.jasmine) {\n      combine(predefined, vars.jasmine);\n    }\n\n    if (state.option.jquery) {\n      combine(predefined, vars.jquery);\n    }\n\n    if (state.option.mootools) {\n      combine(predefined, vars.mootools);\n    }\n\n    if (state.option.worker) {\n      combine(predefined, vars.worker);\n    }\n\n    if (state.option.wsh) {\n      combine(predefined, vars.wsh);\n    }\n\n    if (state.option.globalstrict && state.option.strict !== false) {\n      state.option.strict = true;\n    }\n\n    if (state.option.yui) {\n      combine(predefined, vars.yui);\n    }\n\n    if (state.option.mocha) {\n      combine(predefined, vars.mocha);\n    }\n\n    state.option.inMoz = function (strict) {\n      return state.option.moz;\n    };\n\n    state.option.inESNext = function (strict) {\n      return state.option.moz || state.option.esnext;\n    };\n\n    state.option.inES5 = function (/* strict */) {\n      return !state.option.es3;\n    };\n\n    state.option.inES3 = function (strict) {\n      if (strict) {\n        return !state.option.moz && !state.option.esnext && state.option.es3;\n      }\n      return state.option.es3;\n    };\n  }\n  function quit(code, line, chr) {\n    var percentage = Math.floor((line / state.lines.length) * 100);\n    var message = messages.errors[code].desc;\n\n    throw {\n      name: \"JSHintError\",\n      line: line,\n      character: chr,\n      message: message + \" (\" + percentage + \"% scanned).\",\n      raw: message,\n      code: code\n    };\n  }\n\n  function isundef(scope, code, token, a) {\n    return JSHINT.undefs.push([scope, code, token, a]);\n  }\n\n  function removeIgnoredMessages() {\n    var ignored = state.ignoredLines;\n\n    if (_.isEmpty(ignored)) return;\n    JSHINT.errors = _.reject(JSHINT.errors, function (err) { return ignored[err.line] });\n  }\n\n  function warning(code, t, a, b, c, d) {\n    var ch, l, w, msg;\n\n    if (/^W\\d{3}$/.test(code)) {\n      if (state.ignored[code])\n        return;\n\n      msg = messages.warnings[code];\n    } else if (/E\\d{3}/.test(code)) {\n      msg = messages.errors[code];\n    } else if (/I\\d{3}/.test(code)) {\n      msg = messages.info[code];\n    }\n\n    t = t || state.tokens.next;\n    if (t.id === \"(end)\") {  // `~\n      t = state.tokens.curr;\n    }\n\n    l = t.line || 0;\n    ch = t.from || 0;\n\n    w = {\n      id: \"(error)\",\n      raw: msg.desc,\n      code: msg.code,\n      evidence: state.lines[l - 1] || \"\",\n      line: l,\n      character: ch,\n      scope: JSHINT.scope,\n      a: a,\n      b: b,\n      c: c,\n      d: d\n    };\n\n    w.reason = supplant(msg.desc, w);\n    JSHINT.errors.push(w);\n\n    removeIgnoredMessages();\n\n    if (JSHINT.errors.length >= state.option.maxerr)\n      quit(\"E043\", l, ch);\n\n    return w;\n  }\n\n  function warningAt(m, l, ch, a, b, c, d) {\n    return warning(m, {\n      line: l,\n      from: ch\n    }, a, b, c, d);\n  }\n\n  function error(m, t, a, b, c, d) {\n    warning(m, t, a, b, c, d);\n  }\n\n  function errorAt(m, l, ch, a, b, c, d) {\n    return error(m, {\n      line: l,\n      from: ch\n    }, a, b, c, d);\n  }\n  function addInternalSrc(elem, src) {\n    var i;\n    i = {\n      id: \"(internal)\",\n      elem: elem,\n      value: src\n    };\n    JSHINT.internals.push(i);\n    return i;\n  }\n  function addlabel(name, opts) {\n    opts = opts || {};\n\n    var type  = opts.type;\n    var token = opts.token;\n    var islet = opts.islet;\n    if (type === \"exception\") {\n      if (_.has(funct[\"(context)\"], name)) {\n        if (funct[name] !== true && !state.option.node) {\n          warning(\"W002\", state.tokens.next, name);\n        }\n      }\n    }\n\n    if (_.has(funct, name) && !funct[\"(global)\"]) {\n      if (funct[name] === true) {\n        if (state.option.latedef) {\n          if ((state.option.latedef === true && _.contains([funct[name], type], \"unction\")) ||\n              !_.contains([funct[name], type], \"unction\")) {\n            warning(\"W003\", state.tokens.next, name);\n          }\n        }\n      } else {\n        if ((!state.option.shadow || _.contains([ \"inner\", \"outer\" ], state.option.shadow)) &&\n            type !== \"exception\" || funct[\"(blockscope)\"].getlabel(name)) {\n          warning(\"W004\", state.tokens.next, name);\n        }\n      }\n    }\n\n    if (funct[\"(context)\"] && _.has(funct[\"(context)\"], name) && type !== \"function\") {\n      if (state.option.shadow === \"outer\") {\n        warning(\"W123\", state.tokens.next, name);\n      }\n    }\n    if (islet) {\n      funct[\"(blockscope)\"].current.add(name, type, state.tokens.curr);\n    } else {\n      funct[\"(blockscope)\"].shadow(name);\n      funct[name] = type;\n\n      if (token) {\n        funct[\"(tokens)\"][name] = token;\n      }\n\n      setprop(funct, name, { unused: opts.unused || false });\n\n      if (funct[\"(global)\"]) {\n        global[name] = funct;\n        if (_.has(implied, name)) {\n          if (state.option.latedef) {\n            if ((state.option.latedef === true && _.contains([funct[name], type], \"unction\")) ||\n                !_.contains([funct[name], type], \"unction\")) {\n              warning(\"W003\", state.tokens.next, name);\n            }\n          }\n\n          delete implied[name];\n        }\n      } else {\n        scope[name] = funct;\n      }\n    }\n  }\n\n  function doOption() {\n    var nt = state.tokens.next;\n    var body = nt.body.match(/(-\\s+)?[^\\s,:]+(?:\\s*:\\s*(-\\s+)?[^\\s,]+)?/g) || [];\n    var predef = {};\n\n    if (nt.type === \"globals\") {\n      body.forEach(function (g) {\n        g = g.split(\":\");\n        var key = (g[0] || \"\").trim();\n        var val = (g[1] || \"\").trim();\n\n        if (key.charAt(0) === \"-\") {\n          key = key.slice(1);\n          val = false;\n\n          JSHINT.blacklist[key] = key;\n          delete predefined[key];\n        } else {\n          predef[key] = (val === \"true\");\n        }\n      });\n\n      combine(predefined, predef);\n\n      for (var key in predef) {\n        if (_.has(predef, key)) {\n          declared[key] = nt;\n        }\n      }\n    }\n\n    if (nt.type === \"exported\") {\n      body.forEach(function (e) {\n        exported[e] = true;\n      });\n    }\n\n    if (nt.type === \"members\") {\n      membersOnly = membersOnly || {};\n\n      body.forEach(function (m) {\n        var ch1 = m.charAt(0);\n        var ch2 = m.charAt(m.length - 1);\n\n        if (ch1 === ch2 && (ch1 === \"\\\"\" || ch1 === \"'\")) {\n          m = m\n            .substr(1, m.length - 2)\n            .replace(\"\\\\\\\"\", \"\\\"\");\n        }\n\n        membersOnly[m] = false;\n      });\n    }\n\n    var numvals = [\n      \"maxstatements\",\n      \"maxparams\",\n      \"maxdepth\",\n      \"maxcomplexity\",\n      \"maxerr\",\n      \"maxlen\",\n      \"indent\"\n    ];\n\n    if (nt.type === \"jshint\" || nt.type === \"jslint\") {\n      body.forEach(function (g) {\n        g = g.split(\":\");\n        var key = (g[0] || \"\").trim();\n        var val = (g[1] || \"\").trim();\n\n        if (!checkOption(key, nt)) {\n          return;\n        }\n\n        if (numvals.indexOf(key) >= 0) {\n          if (val !== \"false\") {\n            val = +val;\n\n            if (typeof val !== \"number\" || !isFinite(val) || val <= 0 || Math.floor(val) !== val) {\n              error(\"E032\", nt, g[1].trim());\n              return;\n            }\n\n            state.option[key] = val;\n          } else {\n            state.option[key] = key === \"indent\" ? 4 : false;\n          }\n\n          return;\n        }\n\n        if (key === \"validthis\") {\n\n          if (funct[\"(global)\"])\n            return void error(\"E009\");\n\n          if (val !== \"true\" && val !== \"false\")\n            return void error(\"E002\", nt);\n\n          state.option.validthis = (val === \"true\");\n          return;\n        }\n\n        if (key === \"quotmark\") {\n          switch (val) {\n          case \"true\":\n          case \"false\":\n            state.option.quotmark = (val === \"true\");\n            break;\n          case \"double\":\n          case \"single\":\n            state.option.quotmark = val;\n            break;\n          default:\n            error(\"E002\", nt);\n          }\n          return;\n        }\n\n        if (key === \"shadow\") {\n          switch (val) {\n          case \"true\":\n            state.option.shadow = true;\n            break;\n          case \"outer\":\n            state.option.shadow = \"outer\";\n            break;\n          case \"false\":\n          case \"inner\":\n            state.option.shadow = \"inner\";\n            break;\n          default:\n            error(\"E002\", nt);\n          }\n          return;\n        }\n\n        if (key === \"unused\") {\n          switch (val) {\n          case \"true\":\n            state.option.unused = true;\n            break;\n          case \"false\":\n            state.option.unused = false;\n            break;\n          case \"vars\":\n          case \"strict\":\n            state.option.unused = val;\n            break;\n          default:\n            error(\"E002\", nt);\n          }\n          return;\n        }\n\n        if (key === \"latedef\") {\n          switch (val) {\n          case \"true\":\n            state.option.latedef = true;\n            break;\n          case \"false\":\n            state.option.latedef = false;\n            break;\n          case \"nofunc\":\n            state.option.latedef = \"nofunc\";\n            break;\n          default:\n            error(\"E002\", nt);\n          }\n          return;\n        }\n\n        if (key === \"ignore\") {\n          switch (val) {\n          case \"start\":\n            state.ignoreLinterErrors = true;\n            break;\n          case \"end\":\n            state.ignoreLinterErrors = false;\n            break;\n          case \"line\":\n            state.ignoredLines[nt.line] = true;\n            removeIgnoredMessages();\n            break;\n          default:\n            error(\"E002\", nt);\n          }\n          return;\n        }\n\n        var match = /^([+-])(W\\d{3})$/g.exec(key);\n        if (match) {\n          state.ignored[match[2]] = (match[1] === \"-\");\n          return;\n        }\n\n        var tn;\n        if (val === \"true\" || val === \"false\") {\n          if (nt.type === \"jslint\") {\n            tn = renamedOptions[key] || key;\n            state.option[tn] = (val === \"true\");\n\n            if (invertedOptions[tn] !== undefined) {\n              state.option[tn] = !state.option[tn];\n            }\n          } else {\n            state.option[key] = (val === \"true\");\n          }\n\n          if (key === \"newcap\") {\n            state.option[\"(explicitNewcap)\"] = true;\n          }\n          return;\n        }\n\n        error(\"E002\", nt);\n      });\n\n      assume();\n    }\n  }\n\n  function peek(p) {\n    var i = p || 0, j = 0, t;\n\n    while (j <= i) {\n      t = lookahead[j];\n      if (!t) {\n        t = lookahead[j] = lex.token();\n      }\n      j += 1;\n    }\n    return t;\n  }\n\n  function advance(id, t) {\n    switch (state.tokens.curr.id) {\n    case \"(number)\":\n      if (state.tokens.next.id === \".\") {\n        warning(\"W005\", state.tokens.curr);\n      }\n      break;\n    case \"-\":\n      if (state.tokens.next.id === \"-\" || state.tokens.next.id === \"--\") {\n        warning(\"W006\");\n      }\n      break;\n    case \"+\":\n      if (state.tokens.next.id === \"+\" || state.tokens.next.id === \"++\") {\n        warning(\"W007\");\n      }\n      break;\n    }\n\n    if (state.tokens.curr.type === \"(string)\" || state.tokens.curr.identifier) {\n      anonname = state.tokens.curr.value;\n    }\n\n    if (id && state.tokens.next.id !== id) {\n      if (t) {\n        if (state.tokens.next.id === \"(end)\") {\n          error(\"E019\", t, t.id);\n        } else {\n          error(\"E020\", state.tokens.next, id, t.id, t.line, state.tokens.next.value);\n        }\n      } else if (state.tokens.next.type !== \"(identifier)\" || state.tokens.next.value !== id) {\n        warning(\"W116\", state.tokens.next, id, state.tokens.next.value);\n      }\n    }\n\n    state.tokens.prev = state.tokens.curr;\n    state.tokens.curr = state.tokens.next;\n    for (;;) {\n      state.tokens.next = lookahead.shift() || lex.token();\n\n      if (!state.tokens.next) { // No more tokens left, give up\n        quit(\"E041\", state.tokens.curr.line);\n      }\n\n      if (state.tokens.next.id === \"(end)\" || state.tokens.next.id === \"(error)\") {\n        return;\n      }\n\n      if (state.tokens.next.check) {\n        state.tokens.next.check();\n      }\n\n      if (state.tokens.next.isSpecial) {\n        doOption();\n      } else {\n        if (state.tokens.next.id !== \"(endline)\") {\n          break;\n        }\n      }\n    }\n  }\n\n  function isInfix(token) {\n    return token.infix || (!token.identifier && !!token.led);\n  }\n\n  function isEndOfExpr() {\n    var curr = state.tokens.curr;\n    var next = state.tokens.next;\n    if (next.id === \";\" || next.id === \"}\" || next.id === \":\") {\n      return true;\n    }\n    if (isInfix(next) === isInfix(curr) || (curr.id === \"yield\" && state.option.inMoz(true))) {\n      return curr.line !== next.line;\n    }\n    return false;\n  }\n\n  function expression(rbp, initial) {\n    var left, isArray = false, isObject = false, isLetExpr = false;\n    if (!initial && state.tokens.next.value === \"let\" && peek(0).value === \"(\") {\n      if (!state.option.inMoz(true)) {\n        warning(\"W118\", state.tokens.next, \"let expressions\");\n      }\n      isLetExpr = true;\n      funct[\"(blockscope)\"].stack();\n      advance(\"let\");\n      advance(\"(\");\n      state.syntax[\"let\"].fud.call(state.syntax[\"let\"].fud, false);\n      advance(\")\");\n    }\n\n    if (state.tokens.next.id === \"(end)\")\n      error(\"E006\", state.tokens.curr);\n\n    var isDangerous =\n      state.option.asi &&\n      state.tokens.prev.line < state.tokens.curr.line &&\n      _.contains([\"]\", \")\"], state.tokens.prev.id) &&\n      _.contains([\"[\", \"(\"], state.tokens.curr.id);\n\n    if (isDangerous)\n      warning(\"W014\", state.tokens.curr, state.tokens.curr.id);\n\n    advance();\n\n    if (initial) {\n      anonname = \"anonymous\";\n      funct[\"(verb)\"] = state.tokens.curr.value;\n    }\n\n    if (initial === true && state.tokens.curr.fud) {\n      left = state.tokens.curr.fud();\n    } else {\n      if (state.tokens.curr.nud) {\n        left = state.tokens.curr.nud();\n      } else {\n        error(\"E030\", state.tokens.curr, state.tokens.curr.id);\n      }\n\n      while (rbp < state.tokens.next.lbp && !isEndOfExpr()) {\n        isArray = state.tokens.curr.value === \"Array\";\n        isObject = state.tokens.curr.value === \"Object\";\n        if (left && (left.value || (left.first && left.first.value))) {\n          if (left.value !== \"new\" ||\n            (left.first && left.first.value && left.first.value === \".\")) {\n            isArray = false;\n            if (left.value !== state.tokens.curr.value) {\n              isObject = false;\n            }\n          }\n        }\n\n        advance();\n\n        if (isArray && state.tokens.curr.id === \"(\" && state.tokens.next.id === \")\") {\n          warning(\"W009\", state.tokens.curr);\n        }\n\n        if (isObject && state.tokens.curr.id === \"(\" && state.tokens.next.id === \")\") {\n          warning(\"W010\", state.tokens.curr);\n        }\n\n        if (left && state.tokens.curr.led) {\n          left = state.tokens.curr.led(left);\n        } else {\n          error(\"E033\", state.tokens.curr, state.tokens.curr.id);\n        }\n      }\n    }\n    if (isLetExpr) {\n      funct[\"(blockscope)\"].unstack();\n    }\n    return left;\n  }\n\n  function nobreaknonadjacent(left, right) {\n    left = left || state.tokens.curr;\n    right = right || state.tokens.next;\n    if (!state.option.laxbreak && left.line !== right.line) {\n      warning(\"W014\", right, right.value);\n    }\n  }\n\n  function nolinebreak(t) {\n    t = t || state.tokens.curr;\n    if (t.line !== state.tokens.next.line) {\n      warning(\"E022\", t, t.value);\n    }\n  }\n\n  function nobreakcomma(left, right) {\n    if (left.line !== right.line) {\n      if (!state.option.laxcomma) {\n        if (comma.first) {\n          warning(\"I001\");\n          comma.first = false;\n        }\n        warning(\"W014\", left, right.value);\n      }\n    }\n  }\n\n  function comma(opts) {\n    opts = opts || {};\n\n    if (!opts.peek) {\n      nobreakcomma(state.tokens.curr, state.tokens.next);\n      advance(\",\");\n    } else {\n      nobreakcomma(state.tokens.prev, state.tokens.curr);\n    }\n\n    if (state.tokens.next.identifier && !(opts.property && state.option.inES5())) {\n      switch (state.tokens.next.value) {\n      case \"break\":\n      case \"case\":\n      case \"catch\":\n      case \"continue\":\n      case \"default\":\n      case \"do\":\n      case \"else\":\n      case \"finally\":\n      case \"for\":\n      case \"if\":\n      case \"in\":\n      case \"instanceof\":\n      case \"return\":\n      case \"switch\":\n      case \"throw\":\n      case \"try\":\n      case \"var\":\n      case \"let\":\n      case \"while\":\n      case \"with\":\n        error(\"E024\", state.tokens.next, state.tokens.next.value);\n        return false;\n      }\n    }\n\n    if (state.tokens.next.type === \"(punctuator)\") {\n      switch (state.tokens.next.value) {\n      case \"}\":\n      case \"]\":\n      case \",\":\n        if (opts.allowTrailing) {\n          return true;\n        }\n      case \")\":\n        error(\"E024\", state.tokens.next, state.tokens.next.value);\n        return false;\n      }\n    }\n    return true;\n  }\n\n  function symbol(s, p) {\n    var x = state.syntax[s];\n    if (!x || typeof x !== \"object\") {\n      state.syntax[s] = x = {\n        id: s,\n        lbp: p,\n        value: s\n      };\n    }\n    return x;\n  }\n\n  function delim(s) {\n    return symbol(s, 0);\n  }\n\n  function stmt(s, f) {\n    var x = delim(s);\n    x.identifier = x.reserved = true;\n    x.fud = f;\n    return x;\n  }\n\n  function blockstmt(s, f) {\n    var x = stmt(s, f);\n    x.block = true;\n    return x;\n  }\n\n  function reserveName(x) {\n    var c = x.id.charAt(0);\n    if ((c >= \"a\" && c <= \"z\") || (c >= \"A\" && c <= \"Z\")) {\n      x.identifier = x.reserved = true;\n    }\n    return x;\n  }\n\n  function prefix(s, f) {\n    var x = symbol(s, 150);\n    reserveName(x);\n\n    x.nud = (typeof f === \"function\") ? f : function () {\n      this.right = expression(150);\n      this.arity = \"unary\";\n\n      if (this.id === \"++\" || this.id === \"--\") {\n        if (state.option.plusplus) {\n          warning(\"W016\", this, this.id);\n        } else if (this.right && (!this.right.identifier || isReserved(this.right)) &&\n            this.right.id !== \".\" && this.right.id !== \"[\") {\n          warning(\"W017\", this);\n        }\n      }\n\n      return this;\n    };\n\n    return x;\n  }\n\n  function type(s, f) {\n    var x = delim(s);\n    x.type = s;\n    x.nud = f;\n    return x;\n  }\n\n  function reserve(name, func) {\n    var x = type(name, func);\n    x.identifier = true;\n    x.reserved = true;\n    return x;\n  }\n\n  function FutureReservedWord(name, meta) {\n    var x = type(name, (meta && meta.nud) || function () {\n      return this;\n    });\n\n    meta = meta || {};\n    meta.isFutureReservedWord = true;\n\n    x.value = name;\n    x.identifier = true;\n    x.reserved = true;\n    x.meta = meta;\n\n    return x;\n  }\n\n  function reservevar(s, v) {\n    return reserve(s, function () {\n      if (typeof v === \"function\") {\n        v(this);\n      }\n      return this;\n    });\n  }\n\n  function infix(s, f, p, w) {\n    var x = symbol(s, p);\n    reserveName(x);\n    x.infix = true;\n    x.led = function (left) {\n      if (!w) {\n        nobreaknonadjacent(state.tokens.prev, state.tokens.curr);\n      }\n      if (s === \"in\" && left.id === \"!\") {\n        warning(\"W018\", left, \"!\");\n      }\n      if (typeof f === \"function\") {\n        return f(left, this);\n      } else {\n        this.left = left;\n        this.right = expression(p);\n        return this;\n      }\n    };\n    return x;\n  }\n\n\n  function application(s) {\n    var x = symbol(s, 42);\n\n    x.led = function (left) {\n      if (!state.option.inESNext()) {\n        warning(\"W104\", state.tokens.curr, \"arrow function syntax (=>)\");\n      }\n\n      nobreaknonadjacent(state.tokens.prev, state.tokens.curr);\n\n      this.left = left;\n      this.right = doFunction(undefined, undefined, false, left);\n      return this;\n    };\n    return x;\n  }\n\n  function relation(s, f) {\n    var x = symbol(s, 100);\n\n    x.led = function (left) {\n      nobreaknonadjacent(state.tokens.prev, state.tokens.curr);\n      var right = expression(100);\n\n      if (isIdentifier(left, \"NaN\") || isIdentifier(right, \"NaN\")) {\n        warning(\"W019\", this);\n      } else if (f) {\n        f.apply(this, [left, right]);\n      }\n\n      if (!left || !right) {\n        quit(\"E041\", state.tokens.curr.line);\n      }\n\n      if (left.id === \"!\") {\n        warning(\"W018\", left, \"!\");\n      }\n\n      if (right.id === \"!\") {\n        warning(\"W018\", right, \"!\");\n      }\n\n      this.left = left;\n      this.right = right;\n      return this;\n    };\n    return x;\n  }\n\n  function isPoorRelation(node) {\n    return node &&\n        ((node.type === \"(number)\" && +node.value === 0) ||\n         (node.type === \"(string)\" && node.value === \"\") ||\n         (node.type === \"null\" && !state.option.eqnull) ||\n        node.type === \"true\" ||\n        node.type === \"false\" ||\n        node.type === \"undefined\");\n  }\n\n  function isTypoTypeof(left, right) {\n    if (state.option.notypeof)\n      return false;\n\n    if (!left || !right)\n      return false;\n\n    var values = [\n      \"undefined\", \"object\", \"boolean\", \"number\",\n      \"string\", \"function\", \"xml\", \"object\", \"unknown\"\n    ];\n\n    if (right.type === \"(identifier)\" && right.value === \"typeof\" && left.type === \"(string)\")\n      return !_.contains(values, left.value);\n\n    return false;\n  }\n\n  function findNativePrototype(left) {\n    var natives = [\n      \"Array\", \"ArrayBuffer\", \"Boolean\", \"Collator\", \"DataView\", \"Date\",\n      \"DateTimeFormat\", \"Error\", \"EvalError\", \"Float32Array\", \"Float64Array\",\n      \"Function\", \"Infinity\", \"Intl\", \"Int16Array\", \"Int32Array\", \"Int8Array\",\n      \"Iterator\", \"Number\", \"NumberFormat\", \"Object\", \"RangeError\",\n      \"ReferenceError\", \"RegExp\", \"StopIteration\", \"String\", \"SyntaxError\",\n      \"TypeError\", \"Uint16Array\", \"Uint32Array\", \"Uint8Array\", \"Uint8ClampedArray\",\n      \"URIError\"\n    ];\n\n    function walkPrototype(obj) {\n      if (typeof obj !== \"object\") return;\n      return obj.right === \"prototype\" ? obj : walkPrototype(obj.left);\n    }\n\n    function walkNative(obj) {\n      while (!obj.identifier && typeof obj.left === \"object\")\n        obj = obj.left;\n\n      if (obj.identifier && natives.indexOf(obj.value) >= 0)\n        return obj.value;\n    }\n\n    var prototype = walkPrototype(left);\n    if (prototype) return walkNative(prototype);\n  }\n\n  function assignop(s, f, p) {\n    var x = infix(s, typeof f === \"function\" ? f : function (left, that) {\n      that.left = left;\n\n      if (left) {\n        if (state.option.freeze) {\n          var nativeObject = findNativePrototype(left);\n          if (nativeObject)\n            warning(\"W121\", left, nativeObject);\n        }\n\n        if (predefined[left.value] === false &&\n            scope[left.value][\"(global)\"] === true) {\n          warning(\"W020\", left);\n        } else if (left[\"function\"]) {\n          warning(\"W021\", left, left.value);\n        }\n\n        if (funct[left.value] === \"const\") {\n          error(\"E013\", left, left.value);\n        }\n\n        if (left.id === \".\") {\n          if (!left.left) {\n            warning(\"E031\", that);\n          } else if (left.left.value === \"arguments\" && !state.directive[\"use strict\"]) {\n            warning(\"E031\", that);\n          }\n\n          that.right = expression(10);\n          return that;\n        } else if (left.id === \"[\") {\n          if (state.tokens.curr.left.first) {\n            state.tokens.curr.left.first.forEach(function (t) {\n              if (t && funct[t.value] === \"const\") {\n                error(\"E013\", t, t.value);\n              }\n            });\n          } else if (!left.left) {\n            warning(\"E031\", that);\n          } else if (left.left.value === \"arguments\" && !state.directive[\"use strict\"]) {\n            warning(\"E031\", that);\n          }\n          that.right = expression(10);\n          return that;\n        } else if (left.identifier && !isReserved(left)) {\n          if (funct[left.value] === \"exception\") {\n            warning(\"W022\", left);\n          }\n          that.right = expression(10);\n          return that;\n        }\n\n        if (left === state.syntax[\"function\"]) {\n          warning(\"W023\", state.tokens.curr);\n        }\n      }\n\n      error(\"E031\", that);\n    }, p);\n\n    x.exps = true;\n    x.assign = true;\n    return x;\n  }\n\n\n  function bitwise(s, f, p) {\n    var x = symbol(s, p);\n    reserveName(x);\n    x.led = (typeof f === \"function\") ? f : function (left) {\n      if (state.option.bitwise) {\n        warning(\"W016\", this, this.id);\n      }\n      this.left = left;\n      this.right = expression(p);\n      return this;\n    };\n    return x;\n  }\n\n\n  function bitwiseassignop(s) {\n    return assignop(s, function (left, that) {\n      if (state.option.bitwise) {\n        warning(\"W016\", that, that.id);\n      }\n\n      if (left) {\n        if (left.id === \".\" || left.id === \"[\" ||\n            (left.identifier && !isReserved(left))) {\n          expression(10);\n          return that;\n        }\n        if (left === state.syntax[\"function\"]) {\n          warning(\"W023\", state.tokens.curr);\n        }\n        return that;\n      }\n      error(\"E031\", that);\n    }, 20);\n  }\n\n\n  function suffix(s) {\n    var x = symbol(s, 150);\n\n    x.led = function (left) {\n      if (state.option.plusplus) {\n        warning(\"W016\", this, this.id);\n      } else if ((!left.identifier || isReserved(left)) && left.id !== \".\" && left.id !== \"[\") {\n        warning(\"W017\", this);\n      }\n\n      this.left = left;\n      return this;\n    };\n    return x;\n  }\n\n  function optionalidentifier(fnparam, prop) {\n    if (!state.tokens.next.identifier) {\n      return;\n    }\n\n    advance();\n\n    var curr = state.tokens.curr;\n    var val  = state.tokens.curr.value;\n\n    if (!isReserved(curr)) {\n      return val;\n    }\n\n    if (prop) {\n      if (state.option.inES5()) {\n        return val;\n      }\n    }\n\n    if (fnparam && val === \"undefined\") {\n      return val;\n    }\n\n    warning(\"W024\", state.tokens.curr, state.tokens.curr.id);\n    return val;\n  }\n  function identifier(fnparam, prop) {\n    var i = optionalidentifier(fnparam, prop);\n    if (i) {\n      return i;\n    }\n    if (state.tokens.curr.id === \"function\" && state.tokens.next.id === \"(\") {\n      warning(\"W025\");\n    } else {\n      error(\"E030\", state.tokens.next, state.tokens.next.value);\n    }\n  }\n\n\n  function reachable(s) {\n    var i = 0, t;\n    if (state.tokens.next.id !== \";\" || noreach) {\n      return;\n    }\n    for (;;) {\n      do {\n        t = peek(i);\n        i += 1;\n      } while (t.id != \"(end)\" && t.id === \"(comment)\");\n\n      if (t.reach) {\n        return;\n      }\n      if (t.id !== \"(endline)\") {\n        if (t.id === \"function\") {\n          if (state.option.latedef === true) {\n            warning(\"W026\", t);\n          }\n          break;\n        }\n\n        warning(\"W027\", t, t.value, s);\n        break;\n      }\n    }\n  }\n\n  function parseFinalSemicolon() {\n    if (state.tokens.next.id !== \";\") {\n      if (!state.option.asi) {\n        if (!state.option.lastsemic || state.tokens.next.id !== \"}\" ||\n          state.tokens.next.line !== state.tokens.curr.line) {\n          warningAt(\"W033\", state.tokens.curr.line, state.tokens.curr.character);\n        }\n      }\n    } else {\n      advance(\";\");\n    }\n  }\n\n  function statement() {\n    var values;\n    var i = indent, r, s = scope, t = state.tokens.next;\n\n    if (t.id === \";\") {\n      advance(\";\");\n      return;\n    }\n    var res = isReserved(t);\n\n    if (res && t.meta && t.meta.isFutureReservedWord && peek().id === \":\") {\n      warning(\"W024\", t, t.id);\n      res = false;\n    }\n    if (t.value === \"module\" && t.type === \"(identifier)\") {\n      if (peek().type === \"(identifier)\") {\n        if (!state.option.inESNext()) {\n          warning(\"W119\", state.tokens.curr, \"module\");\n        }\n\n        advance(\"module\");\n        var name = identifier();\n        addlabel(name, { type: \"unused\", token: state.tokens.curr });\n        advance(\"from\");\n        advance(\"(string)\");\n        parseFinalSemicolon();\n        return;\n      }\n    }\n    if (_.has([\"[\", \"{\"], t.value)) {\n      if (lookupBlockType().isDestAssign) {\n        if (!state.option.inESNext()) {\n          warning(\"W104\", state.tokens.curr, \"destructuring expression\");\n        }\n        values = destructuringExpression();\n        values.forEach(function (tok) {\n          isundef(funct, \"W117\", tok.token, tok.id);\n        });\n        advance(\"=\");\n        destructuringExpressionMatch(values, expression(10, true));\n        advance(\";\");\n        return;\n      }\n    }\n    if (t.identifier && !res && peek().id === \":\") {\n      advance();\n      advance(\":\");\n      scope = Object.create(s);\n      addlabel(t.value, { type: \"label\" });\n\n      if (!state.tokens.next.labelled && state.tokens.next.value !== \"{\") {\n        warning(\"W028\", state.tokens.next, t.value, state.tokens.next.value);\n      }\n\n      state.tokens.next.label = t.value;\n      t = state.tokens.next;\n    }\n\n    if (t.id === \"{\") {\n      var iscase = (funct[\"(verb)\"] === \"case\" && state.tokens.curr.value === \":\");\n      block(true, true, false, false, iscase);\n      return;\n    }\n\n    r = expression(0, true);\n\n    if (r && (!r.identifier || r.value !== \"function\") && (r.type !== \"(punctuator)\")) {\n      if (!state.directive[\"use strict\"] &&\n          state.option.globalstrict &&\n          state.option.strict) {\n        warning(\"E007\");\n      }\n    }\n\n    if (!t.block) {\n      if (!state.option.expr && (!r || !r.exps)) {\n        warning(\"W030\", state.tokens.curr);\n      } else if (state.option.nonew && r && r.left && r.id === \"(\" && r.left.id === \"new\") {\n        warning(\"W031\", t);\n      }\n      parseFinalSemicolon();\n    }\n\n    indent = i;\n    scope = s;\n    return r;\n  }\n\n\n  function statements(startLine) {\n    var a = [], p;\n\n    while (!state.tokens.next.reach && state.tokens.next.id !== \"(end)\") {\n      if (state.tokens.next.id === \";\") {\n        p = peek();\n\n        if (!p || (p.id !== \"(\" && p.id !== \"[\")) {\n          warning(\"W032\");\n        }\n\n        advance(\";\");\n      } else {\n        a.push(statement(startLine === state.tokens.next.line));\n      }\n    }\n    return a;\n  }\n  function directives() {\n    var i, p, pn;\n\n    for (;;) {\n      if (state.tokens.next.id === \"(string)\") {\n        p = peek(0);\n        if (p.id === \"(endline)\") {\n          i = 1;\n          do {\n            pn = peek(i);\n            i = i + 1;\n          } while (pn.id === \"(endline)\");\n\n          if (pn.id !== \";\") {\n            if (pn.id !== \"(string)\" && pn.id !== \"(number)\" &&\n              pn.id !== \"(regexp)\" && pn.identifier !== true &&\n              pn.id !== \"}\") {\n              break;\n            }\n            warning(\"W033\", state.tokens.next);\n          } else {\n            p = pn;\n          }\n        } else if (p.id === \"}\") {\n          warning(\"W033\", p);\n        } else if (p.id !== \";\") {\n          break;\n        }\n\n        advance();\n        if (state.directive[state.tokens.curr.value]) {\n          warning(\"W034\", state.tokens.curr, state.tokens.curr.value);\n        }\n\n        if (state.tokens.curr.value === \"use strict\") {\n          if (!state.option[\"(explicitNewcap)\"])\n            state.option.newcap = true;\n          state.option.undef = true;\n        }\n        state.directive[state.tokens.curr.value] = true;\n\n        if (p.id === \";\") {\n          advance(\";\");\n        }\n        continue;\n      }\n      break;\n    }\n  }\n  function block(ordinary, stmt, isfunc, isfatarrow, iscase) {\n    var a,\n      b = inblock,\n      old_indent = indent,\n      m,\n      s = scope,\n      t,\n      line,\n      d;\n\n    inblock = ordinary;\n\n    if (!ordinary || !state.option.funcscope)\n      scope = Object.create(scope);\n\n    t = state.tokens.next;\n\n    var metrics = funct[\"(metrics)\"];\n    metrics.nestedBlockDepth += 1;\n    metrics.verifyMaxNestedBlockDepthPerFunction();\n\n    if (state.tokens.next.id === \"{\") {\n      advance(\"{\");\n      funct[\"(blockscope)\"].stack();\n\n      line = state.tokens.curr.line;\n      if (state.tokens.next.id !== \"}\") {\n        indent += state.option.indent;\n        while (!ordinary && state.tokens.next.from > indent) {\n          indent += state.option.indent;\n        }\n\n        if (isfunc) {\n          m = {};\n          for (d in state.directive) {\n            if (_.has(state.directive, d)) {\n              m[d] = state.directive[d];\n            }\n          }\n          directives();\n\n          if (state.option.strict && funct[\"(context)\"][\"(global)\"]) {\n            if (!m[\"use strict\"] && !state.directive[\"use strict\"]) {\n              warning(\"E007\");\n            }\n          }\n        }\n\n        a = statements(line);\n\n        metrics.statementCount += a.length;\n\n        if (isfunc) {\n          state.directive = m;\n        }\n\n        indent -= state.option.indent;\n      }\n\n      advance(\"}\", t);\n\n      funct[\"(blockscope)\"].unstack();\n\n      indent = old_indent;\n    } else if (!ordinary) {\n      if (isfunc) {\n        m = {};\n        if (stmt && !isfatarrow && !state.option.inMoz(true)) {\n          error(\"W118\", state.tokens.curr, \"function closure expressions\");\n        }\n\n        if (!stmt) {\n          for (d in state.directive) {\n            if (_.has(state.directive, d)) {\n              m[d] = state.directive[d];\n            }\n          }\n        }\n        expression(10);\n\n        if (state.option.strict && funct[\"(context)\"][\"(global)\"]) {\n          if (!m[\"use strict\"] && !state.directive[\"use strict\"]) {\n            warning(\"E007\");\n          }\n        }\n      } else {\n        error(\"E021\", state.tokens.next, \"{\", state.tokens.next.value);\n      }\n    } else {\n      funct[\"(nolet)\"] = true;\n\n      if (!stmt || state.option.curly) {\n        warning(\"W116\", state.tokens.next, \"{\", state.tokens.next.value);\n      }\n\n      noreach = true;\n      indent += state.option.indent;\n      a = [statement()];\n      indent -= state.option.indent;\n      noreach = false;\n\n      delete funct[\"(nolet)\"];\n    }\n    switch (funct[\"(verb)\"]) {\n    case \"break\":\n    case \"continue\":\n    case \"return\":\n    case \"throw\":\n      if (iscase) {\n        break;\n      }\n    default:\n      funct[\"(verb)\"] = null;\n    }\n\n    if (!ordinary || !state.option.funcscope) scope = s;\n    inblock = b;\n    if (ordinary && state.option.noempty && (!a || a.length === 0)) {\n      warning(\"W035\");\n    }\n    metrics.nestedBlockDepth -= 1;\n    return a;\n  }\n\n\n  function countMember(m) {\n    if (membersOnly && typeof membersOnly[m] !== \"boolean\") {\n      warning(\"W036\", state.tokens.curr, m);\n    }\n    if (typeof member[m] === \"number\") {\n      member[m] += 1;\n    } else {\n      member[m] = 1;\n    }\n  }\n\n\n  function note_implied(tkn) {\n    var name = tkn.value;\n    var desc = Object.getOwnPropertyDescriptor(implied, name);\n\n    if (!desc)\n      implied[name] = [tkn.line];\n    else\n      desc.value.push(tkn.line);\n  }\n\n  type(\"(number)\", function () {\n    return this;\n  });\n\n  type(\"(string)\", function () {\n    return this;\n  });\n\n  type(\"(template)\", function () {\n    return this;\n  });\n\n  state.syntax[\"(identifier)\"] = {\n    type: \"(identifier)\",\n    lbp: 0,\n    identifier: true,\n\n    nud: function () {\n      var v = this.value;\n      var s = scope[v];\n      var f;\n      var block;\n\n      if (typeof s === \"function\") {\n        s = undefined;\n      } else if (!funct[\"(blockscope)\"].current.has(v) && typeof s === \"boolean\") {\n        f = funct;\n        funct = functions[0];\n        addlabel(v, { type: \"var\" });\n        s = funct;\n        funct = f;\n      }\n\n      block = funct[\"(blockscope)\"].getlabel(v);\n      if (funct === s || block) {\n        switch (block ? block[v][\"(type)\"] : funct[v]) {\n        case \"unused\":\n          if (block) block[v][\"(type)\"] = \"var\";\n          else funct[v] = \"var\";\n          break;\n        case \"unction\":\n          if (block) block[v][\"(type)\"] = \"function\";\n          else funct[v] = \"function\";\n          this[\"function\"] = true;\n          break;\n        case \"const\":\n          setprop(funct, v, { unused: false });\n          break;\n        case \"function\":\n          this[\"function\"] = true;\n          break;\n        case \"label\":\n          warning(\"W037\", state.tokens.curr, v);\n          break;\n        }\n      } else if (funct[\"(global)\"]) {\n\n        if (typeof predefined[v] !== \"boolean\") {\n          if (!(anonname === \"typeof\" || anonname === \"delete\") ||\n            (state.tokens.next && (state.tokens.next.value === \".\" ||\n              state.tokens.next.value === \"[\"))) {\n\n            if (!funct[\"(comparray)\"].check(v)) {\n              isundef(funct, \"W117\", state.tokens.curr, v);\n            }\n          }\n        }\n\n        note_implied(state.tokens.curr);\n      } else {\n\n        switch (funct[v]) {\n        case \"closure\":\n        case \"function\":\n        case \"var\":\n        case \"unused\":\n          warning(\"W038\", state.tokens.curr, v);\n          break;\n        case \"label\":\n          warning(\"W037\", state.tokens.curr, v);\n          break;\n        case \"outer\":\n        case \"global\":\n          break;\n        default:\n          if (s === true) {\n            funct[v] = true;\n          } else if (s === null) {\n            warning(\"W039\", state.tokens.curr, v);\n            note_implied(state.tokens.curr);\n          } else if (typeof s !== \"object\") {\n            if (!(anonname === \"typeof\" || anonname === \"delete\") ||\n              (state.tokens.next &&\n                (state.tokens.next.value === \".\" || state.tokens.next.value === \"[\"))) {\n\n              isundef(funct, \"W117\", state.tokens.curr, v);\n            }\n            funct[v] = true;\n            note_implied(state.tokens.curr);\n          } else {\n            switch (s[v]) {\n            case \"function\":\n            case \"unction\":\n              this[\"function\"] = true;\n              s[v] = \"closure\";\n              funct[v] = s[\"(global)\"] ? \"global\" : \"outer\";\n              break;\n            case \"var\":\n            case \"unused\":\n              s[v] = \"closure\";\n              funct[v] = s[\"(global)\"] ? \"global\" : \"outer\";\n              break;\n            case \"const\":\n              setprop(s, v, { unused: false });\n              break;\n            case \"closure\":\n              funct[v] = s[\"(global)\"] ? \"global\" : \"outer\";\n              break;\n            case \"label\":\n              warning(\"W037\", state.tokens.curr, v);\n            }\n          }\n        }\n      }\n      return this;\n    },\n\n    led: function () {\n      error(\"E033\", state.tokens.next, state.tokens.next.value);\n    }\n  };\n\n  type(\"(regexp)\", function () {\n    return this;\n  });\n\n  delim(\"(endline)\");\n  delim(\"(begin)\");\n  delim(\"(end)\").reach = true;\n  delim(\"(error)\").reach = true;\n  delim(\"}\").reach = true;\n  delim(\")\");\n  delim(\"]\");\n  delim(\"\\\"\").reach = true;\n  delim(\"'\").reach = true;\n  delim(\";\");\n  delim(\":\").reach = true;\n  delim(\"#\");\n\n  reserve(\"else\");\n  reserve(\"case\").reach = true;\n  reserve(\"catch\");\n  reserve(\"default\").reach = true;\n  reserve(\"finally\");\n  reservevar(\"arguments\", function (x) {\n    if (state.directive[\"use strict\"] && funct[\"(global)\"]) {\n      warning(\"E008\", x);\n    }\n  });\n  reservevar(\"eval\");\n  reservevar(\"false\");\n  reservevar(\"Infinity\");\n  reservevar(\"null\");\n  reservevar(\"this\", function (x) {\n    if (state.directive[\"use strict\"] && !state.option.validthis && ((funct[\"(statement)\"] &&\n        funct[\"(name)\"].charAt(0) > \"Z\") || funct[\"(global)\"])) {\n      warning(\"W040\", x);\n    }\n  });\n  reservevar(\"true\");\n  reservevar(\"undefined\");\n\n  assignop(\"=\", \"assign\", 20);\n  assignop(\"+=\", \"assignadd\", 20);\n  assignop(\"-=\", \"assignsub\", 20);\n  assignop(\"*=\", \"assignmult\", 20);\n  assignop(\"/=\", \"assigndiv\", 20).nud = function () {\n    error(\"E014\");\n  };\n  assignop(\"%=\", \"assignmod\", 20);\n\n  bitwiseassignop(\"&=\", \"assignbitand\", 20);\n  bitwiseassignop(\"|=\", \"assignbitor\", 20);\n  bitwiseassignop(\"^=\", \"assignbitxor\", 20);\n  bitwiseassignop(\"<<=\", \"assignshiftleft\", 20);\n  bitwiseassignop(\">>=\", \"assignshiftright\", 20);\n  bitwiseassignop(\">>>=\", \"assignshiftrightunsigned\", 20);\n  infix(\",\", function (left, that) {\n    var expr;\n    that.exprs = [left];\n    if (!comma({peek: true})) {\n      return that;\n    }\n    while (true) {\n      if (!(expr = expression(10)))  {\n        break;\n      }\n      that.exprs.push(expr);\n      if (state.tokens.next.value !== \",\" || !comma()) {\n        break;\n      }\n    }\n    return that;\n  }, 10, true);\n\n  infix(\"?\", function (left, that) {\n    increaseComplexityCount();\n    that.left = left;\n    that.right = expression(10);\n    advance(\":\");\n    that[\"else\"] = expression(10);\n    return that;\n  }, 30);\n\n  var orPrecendence = 40;\n  infix(\"||\", function (left, that) {\n    increaseComplexityCount();\n    that.left = left;\n    that.right = expression(orPrecendence);\n    return that;\n  }, orPrecendence);\n  infix(\"&&\", \"and\", 50);\n  bitwise(\"|\", \"bitor\", 70);\n  bitwise(\"^\", \"bitxor\", 80);\n  bitwise(\"&\", \"bitand\", 90);\n  relation(\"==\", function (left, right) {\n    var eqnull = state.option.eqnull && (left.value === \"null\" || right.value === \"null\");\n\n    switch (true) {\n      case !eqnull && state.option.eqeqeq:\n        this.from = this.character;\n        warning(\"W116\", this, \"===\", \"==\");\n        break;\n      case isPoorRelation(left):\n        warning(\"W041\", this, \"===\", left.value);\n        break;\n      case isPoorRelation(right):\n        warning(\"W041\", this, \"===\", right.value);\n        break;\n      case isTypoTypeof(right, left):\n        warning(\"W122\", this, right.value);\n        break;\n      case isTypoTypeof(left, right):\n        warning(\"W122\", this, left.value);\n        break;\n    }\n\n    return this;\n  });\n  relation(\"===\", function (left, right) {\n    if (isTypoTypeof(right, left)) {\n      warning(\"W122\", this, right.value);\n    } else if (isTypoTypeof(left, right)) {\n      warning(\"W122\", this, left.value);\n    }\n    return this;\n  });\n  relation(\"!=\", function (left, right) {\n    var eqnull = state.option.eqnull &&\n        (left.value === \"null\" || right.value === \"null\");\n\n    if (!eqnull && state.option.eqeqeq) {\n      this.from = this.character;\n      warning(\"W116\", this, \"!==\", \"!=\");\n    } else if (isPoorRelation(left)) {\n      warning(\"W041\", this, \"!==\", left.value);\n    } else if (isPoorRelation(right)) {\n      warning(\"W041\", this, \"!==\", right.value);\n    } else if (isTypoTypeof(right, left)) {\n      warning(\"W122\", this, right.value);\n    } else if (isTypoTypeof(left, right)) {\n      warning(\"W122\", this, left.value);\n    }\n    return this;\n  });\n  relation(\"!==\", function (left, right) {\n    if (isTypoTypeof(right, left)) {\n      warning(\"W122\", this, right.value);\n    } else if (isTypoTypeof(left, right)) {\n      warning(\"W122\", this, left.value);\n    }\n    return this;\n  });\n  relation(\"<\");\n  relation(\">\");\n  relation(\"<=\");\n  relation(\">=\");\n  bitwise(\"<<\", \"shiftleft\", 120);\n  bitwise(\">>\", \"shiftright\", 120);\n  bitwise(\">>>\", \"shiftrightunsigned\", 120);\n  infix(\"in\", \"in\", 120);\n  infix(\"instanceof\", \"instanceof\", 120);\n  infix(\"+\", function (left, that) {\n    var right = expression(130);\n    if (left && right && left.id === \"(string)\" && right.id === \"(string)\") {\n      left.value += right.value;\n      left.character = right.character;\n      if (!state.option.scripturl && reg.javascriptURL.test(left.value)) {\n        warning(\"W050\", left);\n      }\n      return left;\n    }\n    that.left = left;\n    that.right = right;\n    return that;\n  }, 130);\n  prefix(\"+\", \"num\");\n  prefix(\"+++\", function () {\n    warning(\"W007\");\n    this.right = expression(150);\n    this.arity = \"unary\";\n    return this;\n  });\n  infix(\"+++\", function (left) {\n    warning(\"W007\");\n    this.left = left;\n    this.right = expression(130);\n    return this;\n  }, 130);\n  infix(\"-\", \"sub\", 130);\n  prefix(\"-\", \"neg\");\n  prefix(\"---\", function () {\n    warning(\"W006\");\n    this.right = expression(150);\n    this.arity = \"unary\";\n    return this;\n  });\n  infix(\"---\", function (left) {\n    warning(\"W006\");\n    this.left = left;\n    this.right = expression(130);\n    return this;\n  }, 130);\n  infix(\"*\", \"mult\", 140);\n  infix(\"/\", \"div\", 140);\n  infix(\"%\", \"mod\", 140);\n\n  suffix(\"++\", \"postinc\");\n  prefix(\"++\", \"preinc\");\n  state.syntax[\"++\"].exps = true;\n\n  suffix(\"--\", \"postdec\");\n  prefix(\"--\", \"predec\");\n  state.syntax[\"--\"].exps = true;\n  prefix(\"delete\", function () {\n    var p = expression(10);\n    if (!p || (p.id !== \".\" && p.id !== \"[\")) {\n      warning(\"W051\");\n    }\n    this.first = p;\n    return this;\n  }).exps = true;\n\n  prefix(\"~\", function () {\n    if (state.option.bitwise) {\n      warning(\"W052\", this, \"~\");\n    }\n    expression(150);\n    return this;\n  });\n\n  prefix(\"...\", function () {\n    if (!state.option.inESNext()) {\n      warning(\"W104\", this, \"spread/rest operator\");\n    }\n    if (!state.tokens.next.identifier) {\n      error(\"E030\", state.tokens.next, state.tokens.next.value);\n    }\n    expression(150);\n    return this;\n  });\n\n  prefix(\"!\", function () {\n    this.right = expression(150);\n    this.arity = \"unary\";\n\n    if (!this.right) { // '!' followed by nothing? Give up.\n      quit(\"E041\", this.line || 0);\n    }\n\n    if (bang[this.right.id] === true) {\n      warning(\"W018\", this, \"!\");\n    }\n    return this;\n  });\n\n  prefix(\"typeof\", \"typeof\");\n  prefix(\"new\", function () {\n    var c = expression(155), i;\n    if (c && c.id !== \"function\") {\n      if (c.identifier) {\n        c[\"new\"] = true;\n        switch (c.value) {\n        case \"Number\":\n        case \"String\":\n        case \"Boolean\":\n        case \"Math\":\n        case \"JSON\":\n          warning(\"W053\", state.tokens.prev, c.value);\n          break;\n        case \"Function\":\n          if (!state.option.evil) {\n            warning(\"W054\");\n          }\n          break;\n        case \"Date\":\n        case \"RegExp\":\n        case \"this\":\n          break;\n        default:\n          if (c.id !== \"function\") {\n            i = c.value.substr(0, 1);\n            if (state.option.newcap && (i < \"A\" || i > \"Z\") && !_.has(global, c.value)) {\n              warning(\"W055\", state.tokens.curr);\n            }\n          }\n        }\n      } else {\n        if (c.id !== \".\" && c.id !== \"[\" && c.id !== \"(\") {\n          warning(\"W056\", state.tokens.curr);\n        }\n      }\n    } else {\n      if (!state.option.supernew)\n        warning(\"W057\", this);\n    }\n    if (state.tokens.next.id !== \"(\" && !state.option.supernew) {\n      warning(\"W058\", state.tokens.curr, state.tokens.curr.value);\n    }\n    this.first = c;\n    return this;\n  });\n  state.syntax[\"new\"].exps = true;\n\n  prefix(\"void\").exps = true;\n\n  infix(\".\", function (left, that) {\n    var m = identifier(false, true);\n\n    if (typeof m === \"string\") {\n      countMember(m);\n    }\n\n    that.left = left;\n    that.right = m;\n\n    if (m && m === \"hasOwnProperty\" && state.tokens.next.value === \"=\") {\n      warning(\"W001\");\n    }\n\n    if (left && left.value === \"arguments\" && (m === \"callee\" || m === \"caller\")) {\n      if (state.option.noarg)\n        warning(\"W059\", left, m);\n      else if (state.directive[\"use strict\"])\n        error(\"E008\");\n    } else if (!state.option.evil && left && left.value === \"document\" &&\n        (m === \"write\" || m === \"writeln\")) {\n      warning(\"W060\", left);\n    }\n\n    if (!state.option.evil && (m === \"eval\" || m === \"execScript\")) {\n      warning(\"W061\");\n    }\n\n    return that;\n  }, 160, true);\n\n  infix(\"(\", function (left, that) {\n    if (state.option.immed && left && !left.immed && left.id === \"function\") {\n      warning(\"W062\");\n    }\n\n    var n = 0;\n    var p = [];\n\n    if (left) {\n      if (left.type === \"(identifier)\") {\n        if (left.value.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)) {\n          if (\"Number String Boolean Date Object Error\".indexOf(left.value) === -1) {\n            if (left.value === \"Math\") {\n              warning(\"W063\", left);\n            } else if (state.option.newcap) {\n              warning(\"W064\", left);\n            }\n          }\n        }\n      }\n    }\n\n    if (state.tokens.next.id !== \")\") {\n      for (;;) {\n        p[p.length] = expression(10);\n        n += 1;\n        if (state.tokens.next.id !== \",\") {\n          break;\n        }\n        comma();\n      }\n    }\n\n    advance(\")\");\n\n    if (typeof left === \"object\") {\n      if (state.option.inES3() && left.value === \"parseInt\" && n === 1) {\n        warning(\"W065\", state.tokens.curr);\n      }\n      if (!state.option.evil) {\n        if (left.value === \"eval\" || left.value === \"Function\" ||\n            left.value === \"execScript\") {\n          warning(\"W061\", left);\n\n          if (p[0] && [0].id === \"(string)\") {\n            addInternalSrc(left, p[0].value);\n          }\n        } else if (p[0] && p[0].id === \"(string)\" &&\n             (left.value === \"setTimeout\" ||\n            left.value === \"setInterval\")) {\n          warning(\"W066\", left);\n          addInternalSrc(left, p[0].value);\n        } else if (p[0] && p[0].id === \"(string)\" &&\n             left.value === \".\" &&\n             left.left.value === \"window\" &&\n             (left.right === \"setTimeout\" ||\n            left.right === \"setInterval\")) {\n          warning(\"W066\", left);\n          addInternalSrc(left, p[0].value);\n        }\n      }\n      if (!left.identifier && left.id !== \".\" && left.id !== \"[\" &&\n          left.id !== \"(\" && left.id !== \"&&\" && left.id !== \"||\" &&\n          left.id !== \"?\") {\n        warning(\"W067\", left);\n      }\n    }\n\n    that.left = left;\n    return that;\n  }, 155, true).exps = true;\n\n  prefix(\"(\", function () {\n    var bracket, brackets = [];\n    var pn, pn1, i = 0;\n    var ret;\n    var parens = 1;\n\n    do {\n      pn = peek(i);\n\n      if (pn.value === \"(\") {\n        parens += 1;\n      } else if (pn.value === \")\") {\n        parens -= 1;\n      }\n\n      i += 1;\n      pn1 = peek(i);\n    } while (!(parens === 0 && pn.value === \")\") &&\n             pn1.value !== \"=>\" && pn1.value !== \";\" && pn1.type !== \"(end)\");\n\n    if (state.tokens.next.id === \"function\") {\n      state.tokens.next.immed = true;\n    }\n\n    var exprs = [];\n\n    if (state.tokens.next.id !== \")\") {\n      for (;;) {\n        if (pn1.value === \"=>\" && _.contains([\"{\", \"[\"], state.tokens.next.value)) {\n          bracket = state.tokens.next;\n          bracket.left = destructuringExpression();\n          brackets.push(bracket);\n          for (var t in bracket.left) {\n            exprs.push(bracket.left[t].token);\n          }\n        } else {\n          exprs.push(expression(10));\n        }\n        if (state.tokens.next.id !== \",\") {\n          break;\n        }\n        comma();\n      }\n    }\n\n    advance(\")\", this);\n    if (state.option.immed && exprs[0] && exprs[0].id === \"function\") {\n      if (state.tokens.next.id !== \"(\" &&\n        (state.tokens.next.id !== \".\" || (peek().value !== \"call\" && peek().value !== \"apply\"))) {\n        warning(\"W068\", this);\n      }\n    }\n\n    if (state.tokens.next.value === \"=>\") {\n      return exprs;\n    }\n    if (!exprs.length) {\n      return;\n    }\n    if (exprs.length > 1) {\n      ret = Object.create(state.syntax[\",\"]);\n      ret.exprs = exprs;\n    } else {\n      ret = exprs[0];\n    }\n    if (ret) {\n      ret.paren = true;\n    }\n    return ret;\n  });\n\n  application(\"=>\");\n\n  infix(\"[\", function (left, that) {\n    var e = expression(10), s;\n    if (e && e.type === \"(string)\") {\n      if (!state.option.evil && (e.value === \"eval\" || e.value === \"execScript\")) {\n        warning(\"W061\", that);\n      }\n\n      countMember(e.value);\n      if (!state.option.sub && reg.identifier.test(e.value)) {\n        s = state.syntax[e.value];\n        if (!s || !isReserved(s)) {\n          warning(\"W069\", state.tokens.prev, e.value);\n        }\n      }\n    }\n    advance(\"]\", that);\n\n    if (e && e.value === \"hasOwnProperty\" && state.tokens.next.value === \"=\") {\n      warning(\"W001\");\n    }\n\n    that.left = left;\n    that.right = e;\n    return that;\n  }, 160, true);\n\n  function comprehensiveArrayExpression() {\n    var res = {};\n    res.exps = true;\n    funct[\"(comparray)\"].stack();\n    var reversed = false;\n    if (state.tokens.next.value !== \"for\") {\n      reversed = true;\n      if (!state.option.inMoz(true)) {\n        warning(\"W116\", state.tokens.next, \"for\", state.tokens.next.value);\n      }\n      funct[\"(comparray)\"].setState(\"use\");\n      res.right = expression(10);\n    }\n\n    advance(\"for\");\n    if (state.tokens.next.value === \"each\") {\n      advance(\"each\");\n      if (!state.option.inMoz(true)) {\n        warning(\"W118\", state.tokens.curr, \"for each\");\n      }\n    }\n    advance(\"(\");\n    funct[\"(comparray)\"].setState(\"define\");\n    res.left = expression(130);\n    if (_.contains([\"in\", \"of\"], state.tokens.next.value)) {\n      advance();\n    } else {\n      error(\"E045\", state.tokens.curr);\n    }\n    funct[\"(comparray)\"].setState(\"generate\");\n    expression(10);\n\n    advance(\")\");\n    if (state.tokens.next.value === \"if\") {\n      advance(\"if\");\n      advance(\"(\");\n      funct[\"(comparray)\"].setState(\"filter\");\n      res.filter = expression(10);\n      advance(\")\");\n    }\n\n    if (!reversed) {\n      funct[\"(comparray)\"].setState(\"use\");\n      res.right = expression(10);\n    }\n\n    advance(\"]\");\n    funct[\"(comparray)\"].unstack();\n    return res;\n  }\n\n  prefix(\"[\", function () {\n    var blocktype = lookupBlockType(true);\n    if (blocktype.isCompArray) {\n      if (!state.option.inESNext()) {\n        warning(\"W119\", state.tokens.curr, \"array comprehension\");\n      }\n      return comprehensiveArrayExpression();\n    } else if (blocktype.isDestAssign && !state.option.inESNext()) {\n      warning(\"W104\", state.tokens.curr, \"destructuring assignment\");\n    }\n    var b = state.tokens.curr.line !== state.tokens.next.line;\n    this.first = [];\n    if (b) {\n      indent += state.option.indent;\n      if (state.tokens.next.from === indent + state.option.indent) {\n        indent += state.option.indent;\n      }\n    }\n    while (state.tokens.next.id !== \"(end)\") {\n      while (state.tokens.next.id === \",\") {\n        if (!state.option.inES5())\n          warning(\"W070\");\n        advance(\",\");\n      }\n\n      if (state.tokens.next.id === \"]\") {\n        break;\n      }\n\n      this.first.push(expression(10));\n      if (state.tokens.next.id === \",\") {\n        comma({ allowTrailing: true });\n        if (state.tokens.next.id === \"]\" && !state.option.inES5(true)) {\n          warning(\"W070\", state.tokens.curr);\n          break;\n        }\n      } else {\n        break;\n      }\n    }\n    if (b) {\n      indent -= state.option.indent;\n    }\n    advance(\"]\", this);\n    return this;\n  }, 160);\n\n\n  function property_name() {\n    var id = optionalidentifier(false, true);\n\n    if (!id) {\n      if (state.tokens.next.id === \"(string)\") {\n        id = state.tokens.next.value;\n        advance();\n      } else if (state.tokens.next.id === \"(number)\") {\n        id = state.tokens.next.value.toString();\n        advance();\n      }\n    }\n\n    if (id === \"hasOwnProperty\") {\n      warning(\"W001\");\n    }\n\n    return id;\n  }\n\n  function functionparams(parsed) {\n    var curr, next;\n    var params = [];\n    var ident;\n    var tokens = [];\n    var t;\n    var pastDefault = false;\n\n    if (parsed) {\n      if (Array.isArray(parsed)) {\n        for (var i in parsed) {\n          curr = parsed[i];\n          if (curr.value === \"...\") {\n            if (!state.option.inESNext()) {\n              warning(\"W104\", curr, \"spread/rest operator\");\n            }\n            continue;\n          } else if (curr.value !== \",\") {\n            params.push(curr.value);\n            addlabel(curr.value, { type: \"unused\", token: curr });\n          }\n        }\n        return params;\n      } else {\n        if (parsed.identifier === true) {\n          addlabel(parsed.value, { type: \"unused\", token: parsed });\n          return [parsed];\n        }\n      }\n    }\n\n    next = state.tokens.next;\n\n    advance(\"(\");\n\n    if (state.tokens.next.id === \")\") {\n      advance(\")\");\n      return;\n    }\n\n    for (;;) {\n      if (_.contains([\"{\", \"[\"], state.tokens.next.id)) {\n        tokens = destructuringExpression();\n        for (t in tokens) {\n          t = tokens[t];\n          if (t.id) {\n            params.push(t.id);\n            addlabel(t.id, { type: \"unused\", token: t.token });\n          }\n        }\n      } else if (state.tokens.next.value === \"...\") {\n        if (!state.option.inESNext()) {\n          warning(\"W104\", state.tokens.next, \"spread/rest operator\");\n        }\n        advance(\"...\");\n        ident = identifier(true);\n        params.push(ident);\n        addlabel(ident, { type: \"unused\", token: state.tokens.curr });\n      } else {\n        ident = identifier(true);\n        params.push(ident);\n        addlabel(ident, { type: \"unused\", token: state.tokens.curr });\n      }\n      if (pastDefault) {\n        if (state.tokens.next.id !== \"=\") {\n          error(\"E051\", state.tokens.current);\n        }\n      }\n      if (state.tokens.next.id === \"=\") {\n        if (!state.option.inESNext()) {\n          warning(\"W119\", state.tokens.next, \"default parameters\");\n        }\n        advance(\"=\");\n        pastDefault = true;\n        expression(10);\n      }\n      if (state.tokens.next.id === \",\") {\n        comma();\n      } else {\n        advance(\")\", next);\n        return params;\n      }\n    }\n  }\n\n  function setprop(funct, name, values) {\n    if (!funct[\"(properties)\"][name]) {\n      funct[\"(properties)\"][name] = { unused: false };\n    }\n\n    _.extend(funct[\"(properties)\"][name], values);\n  }\n\n  function getprop(funct, name, prop) {\n    if (!funct[\"(properties)\"][name])\n      return null;\n\n    return funct[\"(properties)\"][name][prop] || null;\n  }\n\n  function functor(name, token, scope, overwrites) {\n    var funct = {\n      \"(name)\"      : name,\n      \"(breakage)\"  : 0,\n      \"(loopage)\"   : 0,\n      \"(scope)\"     : scope,\n      \"(tokens)\"    : {},\n      \"(properties)\": {},\n\n      \"(catch)\"     : false,\n      \"(global)\"    : false,\n\n      \"(line)\"      : null,\n      \"(character)\" : null,\n      \"(metrics)\"   : null,\n      \"(statement)\" : null,\n      \"(context)\"   : null,\n      \"(blockscope)\": null,\n      \"(comparray)\" : null,\n      \"(generator)\" : null,\n      \"(params)\"    : null\n    };\n\n    if (token) {\n      _.extend(funct, {\n        \"(line)\"     : token.line,\n        \"(character)\": token.character,\n        \"(metrics)\"  : createMetrics(token)\n      });\n    }\n\n    _.extend(funct, overwrites);\n\n    if (funct[\"(context)\"]) {\n      funct[\"(blockscope)\"] = funct[\"(context)\"][\"(blockscope)\"];\n      funct[\"(comparray)\"]  = funct[\"(context)\"][\"(comparray)\"];\n    }\n\n    return funct;\n  }\n\n  function doFunction(name, statement, generator, fatarrowparams) {\n    var f;\n    var oldOption = state.option;\n    var oldIgnored = state.ignored;\n    var oldScope  = scope;\n\n    state.option = Object.create(state.option);\n    state.ignored = Object.create(state.ignored);\n    scope = Object.create(scope);\n\n    funct = functor(name || \"\\\"\" + anonname + \"\\\"\", state.tokens.next, scope, {\n      \"(statement)\": statement,\n      \"(context)\":   funct,\n      \"(generator)\": generator ? true : null\n    });\n\n    f = funct;\n    state.tokens.curr.funct = funct;\n\n    functions.push(funct);\n\n    if (name) {\n      addlabel(name, { type: \"function\" });\n    }\n\n    funct[\"(params)\"] = functionparams(fatarrowparams);\n    funct[\"(metrics)\"].verifyMaxParametersPerFunction(funct[\"(params)\"]);\n\n    JSHINT.undefs = _.filter(JSHINT.undefs, function (item) {\n      return !_.contains(_.union(fatarrowparams), item[2]);\n    });\n\n    block(false, true, true, fatarrowparams ? true : false);\n\n    if (!state.option.noyield && generator && funct[\"(generator)\"] !== \"yielded\") {\n      warning(\"W124\", state.tokens.curr);\n    }\n\n    funct[\"(metrics)\"].verifyMaxStatementsPerFunction();\n    funct[\"(metrics)\"].verifyMaxComplexityPerFunction();\n    funct[\"(unusedOption)\"] = state.option.unused;\n\n    scope = oldScope;\n    state.option = oldOption;\n    state.ignored = oldIgnored;\n    funct[\"(last)\"] = state.tokens.curr.line;\n    funct[\"(lastcharacter)\"] = state.tokens.curr.character;\n\n    _.map(Object.keys(funct), function (key) {\n      if (key[0] === \"(\") return;\n      funct[\"(blockscope)\"].unshadow(key);\n    });\n\n    funct = funct[\"(context)\"];\n\n    return f;\n  }\n\n  function createMetrics(functionStartToken) {\n    return {\n      statementCount: 0,\n      nestedBlockDepth: -1,\n      ComplexityCount: 1,\n\n      verifyMaxStatementsPerFunction: function () {\n        if (state.option.maxstatements &&\n          this.statementCount > state.option.maxstatements) {\n          warning(\"W071\", functionStartToken, this.statementCount);\n        }\n      },\n\n      verifyMaxParametersPerFunction: function (params) {\n        params = params || [];\n\n        if (state.option.maxparams && params.length > state.option.maxparams) {\n          warning(\"W072\", functionStartToken, params.length);\n        }\n      },\n\n      verifyMaxNestedBlockDepthPerFunction: function () {\n        if (state.option.maxdepth &&\n          this.nestedBlockDepth > 0 &&\n          this.nestedBlockDepth === state.option.maxdepth + 1) {\n          warning(\"W073\", null, this.nestedBlockDepth);\n        }\n      },\n\n      verifyMaxComplexityPerFunction: function () {\n        var max = state.option.maxcomplexity;\n        var cc = this.ComplexityCount;\n        if (max && cc > max) {\n          warning(\"W074\", functionStartToken, cc);\n        }\n      }\n    };\n  }\n\n  function increaseComplexityCount() {\n    funct[\"(metrics)\"].ComplexityCount += 1;\n  }\n\n  function checkCondAssignment(expr) {\n    var id, paren;\n    if (expr) {\n      id = expr.id;\n      paren = expr.paren;\n      if (id === \",\" && (expr = expr.exprs[expr.exprs.length - 1])) {\n        id = expr.id;\n        paren = paren || expr.paren;\n      }\n    }\n    switch (id) {\n    case \"=\":\n    case \"+=\":\n    case \"-=\":\n    case \"*=\":\n    case \"%=\":\n    case \"&=\":\n    case \"|=\":\n    case \"^=\":\n    case \"/=\":\n      if (!paren && !state.option.boss) {\n        warning(\"W084\");\n      }\n    }\n  }\n\n\n  (function (x) {\n    x.nud = function (isclassdef) {\n      var b, f, i, p, t, g;\n      var props = {}; // All properties, including accessors\n      var tag = \"\";\n\n      function saveProperty(name, tkn) {\n        if (props[name] && _.has(props, name))\n          warning(\"W075\", state.tokens.next, i);\n        else\n          props[name] = {};\n\n        props[name].basic = true;\n        props[name].basictkn = tkn;\n      }\n\n      function saveSetter(name, tkn) {\n        if (props[name] && _.has(props, name)) {\n          if (props[name].basic || props[name].setter)\n            warning(\"W075\", state.tokens.next, i);\n        } else {\n          props[name] = {};\n        }\n\n        props[name].setter = true;\n        props[name].setterToken = tkn;\n      }\n\n      function saveGetter(name) {\n        if (props[name] && _.has(props, name)) {\n          if (props[name].basic || props[name].getter)\n            warning(\"W075\", state.tokens.next, i);\n        } else {\n          props[name] = {};\n        }\n\n        props[name].getter = true;\n        props[name].getterToken = state.tokens.curr;\n      }\n\n      b = state.tokens.curr.line !== state.tokens.next.line;\n      if (b) {\n        indent += state.option.indent;\n        if (state.tokens.next.from === indent + state.option.indent) {\n          indent += state.option.indent;\n        }\n      }\n\n      for (;;) {\n        if (state.tokens.next.id === \"}\") {\n          break;\n        }\n\n        if (isclassdef && state.tokens.next.value === \"static\") {\n          advance(\"static\");\n          tag = \"static \";\n        }\n\n        if (state.tokens.next.value === \"get\" && peek().id !== \":\") {\n          advance(\"get\");\n\n          if (!state.option.inES5(!isclassdef)) {\n            error(\"E034\");\n          }\n\n          i = property_name();\n          if (!i && !state.option.inESNext()) {\n            error(\"E035\");\n          }\n          if (isclassdef && i === \"constructor\") {\n            error(\"E049\", state.tokens.next, \"class getter method\", i);\n          }\n          if (i) {\n            saveGetter(tag + i);\n          }\n\n          t = state.tokens.next;\n          f = doFunction();\n          p = f[\"(params)\"];\n          if (i && p) {\n            warning(\"W076\", t, p[0], i);\n          }\n        } else if (state.tokens.next.value === \"set\" && peek().id !== \":\") {\n          advance(\"set\");\n\n          if (!state.option.inES5(!isclassdef)) {\n            error(\"E034\");\n          }\n\n          i = property_name();\n          if (!i && !state.option.inESNext()) {\n            error(\"E035\");\n          }\n          if (isclassdef && i === \"constructor\") {\n            error(\"E049\", state.tokens.next, \"class setter method\", i);\n          }\n          if (i) {\n            saveSetter(tag + i, state.tokens.next);\n          }\n\n          t = state.tokens.next;\n          f = doFunction();\n          p = f[\"(params)\"];\n          if (i && (!p || p.length !== 1)) {\n            warning(\"W077\", t, i);\n          }\n        } else {\n          g = false;\n          if (state.tokens.next.value === \"*\" && state.tokens.next.type === \"(punctuator)\") {\n            if (!state.option.inESNext()) {\n              warning(\"W104\", state.tokens.next, \"generator functions\");\n            }\n            advance(\"*\");\n            g = true;\n          }\n          i = property_name();\n          saveProperty(tag + i, state.tokens.next);\n\n          if (typeof i !== \"string\") {\n            break;\n          }\n\n          if (state.tokens.next.value === \"(\") {\n            if (!state.option.inESNext()) {\n              warning(\"W104\", state.tokens.curr, \"concise methods\");\n            }\n            doFunction(i, undefined, g);\n          } else if (!isclassdef) {\n            advance(\":\");\n            expression(10);\n          }\n        }\n        if (isclassdef && i === \"prototype\") {\n          error(\"E049\", state.tokens.next, \"class method\", i);\n        }\n\n        countMember(i);\n        if (isclassdef) {\n          tag = \"\";\n          continue;\n        }\n        if (state.tokens.next.id === \",\") {\n          comma({ allowTrailing: true, property: true });\n          if (state.tokens.next.id === \",\") {\n            warning(\"W070\", state.tokens.curr);\n          } else if (state.tokens.next.id === \"}\" && !state.option.inES5(true)) {\n            warning(\"W070\", state.tokens.curr);\n          }\n        } else {\n          break;\n        }\n      }\n      if (b) {\n        indent -= state.option.indent;\n      }\n      advance(\"}\", this);\n      if (state.option.inES5()) {\n        for (var name in props) {\n          if (_.has(props, name) && props[name].setter && !props[name].getter) {\n            warning(\"W078\", props[name].setterToken);\n          }\n        }\n      }\n      return this;\n    };\n    x.fud = function () {\n      error(\"E036\", state.tokens.curr);\n    };\n  }(delim(\"{\")));\n\n  function destructuringExpression() {\n    var id, ids;\n    var identifiers = [];\n    if (!state.option.inESNext()) {\n      warning(\"W104\", state.tokens.curr, \"destructuring expression\");\n    }\n    var nextInnerDE = function () {\n      var ident;\n      if (_.contains([\"[\", \"{\"], state.tokens.next.value)) {\n        ids = destructuringExpression();\n        for (var id in ids) {\n          id = ids[id];\n          identifiers.push({ id: id.id, token: id.token });\n        }\n      } else if (state.tokens.next.value === \",\") {\n        identifiers.push({ id: null, token: state.tokens.curr });\n      } else if (state.tokens.next.value === \"(\") {\n        advance(\"(\");\n        nextInnerDE();\n        advance(\")\");\n      } else {\n        ident = identifier();\n        if (ident)\n          identifiers.push({ id: ident, token: state.tokens.curr });\n      }\n    };\n    if (state.tokens.next.value === \"[\") {\n      advance(\"[\");\n      nextInnerDE();\n      while (state.tokens.next.value !== \"]\") {\n        advance(\",\");\n        nextInnerDE();\n      }\n      advance(\"]\");\n    } else if (state.tokens.next.value === \"{\") {\n      advance(\"{\");\n      id = identifier();\n      if (state.tokens.next.value === \":\") {\n        advance(\":\");\n        nextInnerDE();\n      } else {\n        identifiers.push({ id: id, token: state.tokens.curr });\n      }\n      while (state.tokens.next.value !== \"}\") {\n        advance(\",\");\n        id = identifier();\n        if (state.tokens.next.value === \":\") {\n          advance(\":\");\n          nextInnerDE();\n        } else {\n          identifiers.push({ id: id, token: state.tokens.curr });\n        }\n      }\n      advance(\"}\");\n    }\n    return identifiers;\n  }\n\n  function destructuringExpressionMatch(tokens, value) {\n    var first = value.first;\n\n    if (!first)\n      return;\n\n    _.zip(tokens, Array.isArray(first) ? first : [ first ]).forEach(function (val) {\n      var token = val[0];\n      var value = val[1];\n\n      if (token && value)\n        token.first = value;\n      else if (token && token.first && !value)\n        warning(\"W080\", token.first, token.first.value);\n    });\n  }\n\n  var conststatement = stmt(\"const\", function (prefix) {\n    var tokens;\n    var value;\n    var lone; // State variable to know if it is a lone identifier, or a destructuring statement.\n\n    if (!state.option.inESNext())\n      warning(\"W104\", state.tokens.curr, \"const\");\n\n    this.first = [];\n    for (;;) {\n      var names = [];\n      if (_.contains([\"{\", \"[\"], state.tokens.next.value)) {\n        tokens = destructuringExpression();\n        lone = false;\n      } else {\n        tokens = [ { id: identifier(), token: state.tokens.curr } ];\n        lone = true;\n      }\n      for (var t in tokens) {\n        if (tokens.hasOwnProperty(t)) {\n          t = tokens[t];\n          if (funct[t.id] === \"const\") {\n            warning(\"E011\", null, t.id);\n          }\n          if (funct[\"(global)\"] && predefined[t.id] === false) {\n            warning(\"W079\", t.token, t.id);\n          }\n          if (t.id) {\n            addlabel(t.id, { token: t.token, type: \"const\", unused: true });\n            names.push(t.token);\n          }\n        }\n      }\n      if (prefix) {\n        break;\n      }\n\n      this.first = this.first.concat(names);\n\n      if (state.tokens.next.id !== \"=\") {\n        warning(\"E012\", state.tokens.curr, state.tokens.curr.value);\n      }\n\n      if (state.tokens.next.id === \"=\") {\n        advance(\"=\");\n        if (state.tokens.next.id === \"undefined\") {\n          warning(\"W080\", state.tokens.prev, state.tokens.prev.value);\n        }\n        if (peek(0).id === \"=\" && state.tokens.next.identifier) {\n          warning(\"W120\", state.tokens.next, state.tokens.next.value);\n        }\n        value = expression(10);\n        if (lone) {\n          tokens[0].first = value;\n        } else {\n          destructuringExpressionMatch(names, value);\n        }\n      }\n\n      if (state.tokens.next.id !== \",\") {\n        break;\n      }\n      comma();\n    }\n    return this;\n  });\n\n  conststatement.exps = true;\n  var varstatement = stmt(\"var\", function (prefix) {\n    var tokens, lone, value;\n\n    this.first = [];\n    for (;;) {\n      var names = [];\n      if (_.contains([\"{\", \"[\"], state.tokens.next.value)) {\n        tokens = destructuringExpression();\n        lone = false;\n      } else {\n        tokens = [ { id: identifier(), token: state.tokens.curr } ];\n        lone = true;\n      }\n      for (var t in tokens) {\n        if (tokens.hasOwnProperty(t)) {\n          t = tokens[t];\n          if (state.option.inESNext() && funct[t.id] === \"const\") {\n            warning(\"E011\", null, t.id);\n          }\n          if (funct[\"(global)\"] && predefined[t.id] === false) {\n            warning(\"W079\", t.token, t.id);\n          }\n          if (t.id) {\n            addlabel(t.id, { type: \"unused\", token: t.token });\n            names.push(t.token);\n          }\n        }\n      }\n      if (prefix) {\n        break;\n      }\n\n      this.first = this.first.concat(names);\n\n      if (state.tokens.next.id === \"=\") {\n        advance(\"=\");\n        if (state.tokens.next.id === \"undefined\") {\n          warning(\"W080\", state.tokens.prev, state.tokens.prev.value);\n        }\n        if (peek(0).id === \"=\" && state.tokens.next.identifier) {\n          warning(\"W120\", state.tokens.next, state.tokens.next.value);\n        }\n        value = expression(10);\n        if (lone) {\n          tokens[0].first = value;\n        } else {\n          destructuringExpressionMatch(names, value);\n        }\n      }\n\n      if (state.tokens.next.id !== \",\") {\n        break;\n      }\n      comma();\n    }\n    return this;\n  });\n  varstatement.exps = true;\n\n  var letstatement = stmt(\"let\", function (prefix) {\n    var tokens, lone, value, letblock;\n\n    if (!state.option.inESNext()) {\n      warning(\"W104\", state.tokens.curr, \"let\");\n    }\n\n    if (state.tokens.next.value === \"(\") {\n      if (!state.option.inMoz(true)) {\n        warning(\"W118\", state.tokens.next, \"let block\");\n      }\n      advance(\"(\");\n      funct[\"(blockscope)\"].stack();\n      letblock = true;\n    } else if (funct[\"(nolet)\"]) {\n      error(\"E048\", state.tokens.curr);\n    }\n\n    this.first = [];\n    for (;;) {\n      var names = [];\n      if (_.contains([\"{\", \"[\"], state.tokens.next.value)) {\n        tokens = destructuringExpression();\n        lone = false;\n      } else {\n        tokens = [ { id: identifier(), token: state.tokens.curr.value } ];\n        lone = true;\n      }\n      for (var t in tokens) {\n        if (tokens.hasOwnProperty(t)) {\n          t = tokens[t];\n          if (state.option.inESNext() && funct[t.id] === \"const\") {\n            warning(\"E011\", null, t.id);\n          }\n          if (funct[\"(global)\"] && predefined[t.id] === false) {\n            warning(\"W079\", t.token, t.id);\n          }\n          if (t.id && !funct[\"(nolet)\"]) {\n            addlabel(t.id, { type: \"unused\", token: t.token, islet: true });\n            names.push(t.token);\n          }\n        }\n      }\n      if (prefix) {\n        break;\n      }\n\n      this.first = this.first.concat(names);\n\n      if (state.tokens.next.id === \"=\") {\n        advance(\"=\");\n        if (state.tokens.next.id === \"undefined\") {\n          warning(\"W080\", state.tokens.prev, state.tokens.prev.value);\n        }\n        if (peek(0).id === \"=\" && state.tokens.next.identifier) {\n          warning(\"W120\", state.tokens.next, state.tokens.next.value);\n        }\n        value = expression(10);\n        if (lone) {\n          tokens[0].first = value;\n        } else {\n          destructuringExpressionMatch(names, value);\n        }\n      }\n\n      if (state.tokens.next.id !== \",\") {\n        break;\n      }\n      comma();\n    }\n    if (letblock) {\n      advance(\")\");\n      block(true, true);\n      this.block = true;\n      funct[\"(blockscope)\"].unstack();\n    }\n\n    return this;\n  });\n  letstatement.exps = true;\n\n  blockstmt(\"class\", function () {\n    return classdef.call(this, true);\n  });\n\n  function classdef(stmt) {\n    if (!state.option.inESNext()) {\n      warning(\"W104\", state.tokens.curr, \"class\");\n    }\n    if (stmt) {\n      this.name = identifier();\n      addlabel(this.name, { type: \"unused\", token: state.tokens.curr });\n    } else if (state.tokens.next.identifier && state.tokens.next.value !== \"extends\") {\n      this.name = identifier();\n    }\n    classtail(this);\n    return this;\n  }\n\n  function classtail(c) {\n    var strictness = state.directive[\"use strict\"];\n    if (state.tokens.next.value === \"extends\") {\n      advance(\"extends\");\n      c.heritage = expression(10);\n    }\n    state.directive[\"use strict\"] = true;\n    advance(\"{\");\n    c.body = state.syntax[\"{\"].nud(true);\n    state.directive[\"use strict\"] = strictness;\n  }\n\n  blockstmt(\"function\", function () {\n    var generator = false;\n    if (state.tokens.next.value === \"*\") {\n      advance(\"*\");\n      if (state.option.inESNext(true)) {\n        generator = true;\n      } else {\n        warning(\"W119\", state.tokens.curr, \"function*\");\n      }\n    }\n    if (inblock) {\n      warning(\"W082\", state.tokens.curr);\n\n    }\n    var i = identifier();\n    if (funct[i] === \"const\") {\n      warning(\"E011\", null, i);\n    }\n    addlabel(i, { type: \"unction\", token: state.tokens.curr });\n\n    doFunction(i, { statement: true }, generator);\n    if (state.tokens.next.id === \"(\" && state.tokens.next.line === state.tokens.curr.line) {\n      error(\"E039\");\n    }\n    return this;\n  });\n\n  prefix(\"function\", function () {\n    var generator = false;\n    if (state.tokens.next.value === \"*\") {\n      if (!state.option.inESNext()) {\n        warning(\"W119\", state.tokens.curr, \"function*\");\n      }\n      advance(\"*\");\n      generator = true;\n    }\n    var i = optionalidentifier();\n    doFunction(i, undefined, generator);\n    if (!state.option.loopfunc && funct[\"(loopage)\"]) {\n      warning(\"W083\");\n    }\n    return this;\n  });\n\n  blockstmt(\"if\", function () {\n    var t = state.tokens.next;\n    increaseComplexityCount();\n    state.condition = true;\n    advance(\"(\");\n    checkCondAssignment(expression(0));\n    advance(\")\", t);\n    state.condition = false;\n    block(true, true);\n    if (state.tokens.next.id === \"else\") {\n      advance(\"else\");\n      if (state.tokens.next.id === \"if\" || state.tokens.next.id === \"switch\") {\n        statement(true);\n      } else {\n        block(true, true);\n      }\n    }\n    return this;\n  });\n\n  blockstmt(\"try\", function () {\n    var b;\n\n    function doCatch() {\n      var oldScope = scope;\n      var e;\n\n      advance(\"catch\");\n      advance(\"(\");\n\n      scope = Object.create(oldScope);\n\n      e = state.tokens.next.value;\n      if (state.tokens.next.type !== \"(identifier)\") {\n        e = null;\n        warning(\"E030\", state.tokens.next, e);\n      }\n\n      advance();\n\n      funct = functor(\"(catch)\", state.tokens.next, scope, {\n        \"(context)\"  : funct,\n        \"(breakage)\" : funct[\"(breakage)\"],\n        \"(loopage)\"  : funct[\"(loopage)\"],\n        \"(statement)\": false,\n        \"(catch)\"    : true\n      });\n\n      if (e) {\n        addlabel(e, { type: \"exception\" });\n      }\n\n      if (state.tokens.next.value === \"if\") {\n        if (!state.option.inMoz(true)) {\n          warning(\"W118\", state.tokens.curr, \"catch filter\");\n        }\n        advance(\"if\");\n        expression(0);\n      }\n\n      advance(\")\");\n\n      state.tokens.curr.funct = funct;\n      functions.push(funct);\n\n      block(false);\n\n      scope = oldScope;\n\n      funct[\"(last)\"] = state.tokens.curr.line;\n      funct[\"(lastcharacter)\"] = state.tokens.curr.character;\n      funct = funct[\"(context)\"];\n    }\n\n    block(true);\n\n    while (state.tokens.next.id === \"catch\") {\n      increaseComplexityCount();\n      if (b && (!state.option.inMoz(true))) {\n        warning(\"W118\", state.tokens.next, \"multiple catch blocks\");\n      }\n      doCatch();\n      b = true;\n    }\n\n    if (state.tokens.next.id === \"finally\") {\n      advance(\"finally\");\n      block(true);\n      return;\n    }\n\n    if (!b) {\n      error(\"E021\", state.tokens.next, \"catch\", state.tokens.next.value);\n    }\n\n    return this;\n  });\n\n  blockstmt(\"while\", function () {\n    var t = state.tokens.next;\n    funct[\"(breakage)\"] += 1;\n    funct[\"(loopage)\"] += 1;\n    increaseComplexityCount();\n    advance(\"(\");\n    checkCondAssignment(expression(0));\n    advance(\")\", t);\n    block(true, true);\n    funct[\"(breakage)\"] -= 1;\n    funct[\"(loopage)\"] -= 1;\n    return this;\n  }).labelled = true;\n\n  blockstmt(\"with\", function () {\n    var t = state.tokens.next;\n    if (state.directive[\"use strict\"]) {\n      error(\"E010\", state.tokens.curr);\n    } else if (!state.option.withstmt) {\n      warning(\"W085\", state.tokens.curr);\n    }\n\n    advance(\"(\");\n    expression(0);\n    advance(\")\", t);\n    block(true, true);\n\n    return this;\n  });\n\n  blockstmt(\"switch\", function () {\n    var t = state.tokens.next;\n    var g = false;\n    var noindent = false;\n\n    funct[\"(breakage)\"] += 1;\n    advance(\"(\");\n    checkCondAssignment(expression(0));\n    advance(\")\", t);\n    t = state.tokens.next;\n    advance(\"{\");\n\n    if (state.tokens.next.from === indent)\n      noindent = true;\n\n    if (!noindent)\n      indent += state.option.indent;\n\n    this.cases = [];\n\n    for (;;) {\n      switch (state.tokens.next.id) {\n      case \"case\":\n        switch (funct[\"(verb)\"]) {\n        case \"yield\":\n        case \"break\":\n        case \"case\":\n        case \"continue\":\n        case \"return\":\n        case \"switch\":\n        case \"throw\":\n          break;\n        default:\n          if (!reg.fallsThrough.test(state.lines[state.tokens.next.line - 2])) {\n            warning(\"W086\", state.tokens.curr, \"case\");\n          }\n        }\n\n        advance(\"case\");\n        this.cases.push(expression(0));\n        increaseComplexityCount();\n        g = true;\n        advance(\":\");\n        funct[\"(verb)\"] = \"case\";\n        break;\n      case \"default\":\n        switch (funct[\"(verb)\"]) {\n        case \"yield\":\n        case \"break\":\n        case \"continue\":\n        case \"return\":\n        case \"throw\":\n          break;\n        default:\n          if (this.cases.length) {\n            if (!reg.fallsThrough.test(state.lines[state.tokens.next.line - 2])) {\n              warning(\"W086\", state.tokens.curr, \"default\");\n            }\n          }\n        }\n\n        advance(\"default\");\n        g = true;\n        advance(\":\");\n        break;\n      case \"}\":\n        if (!noindent)\n          indent -= state.option.indent;\n\n        advance(\"}\", t);\n        funct[\"(breakage)\"] -= 1;\n        funct[\"(verb)\"] = undefined;\n        return;\n      case \"(end)\":\n        error(\"E023\", state.tokens.next, \"}\");\n        return;\n      default:\n        indent += state.option.indent;\n        if (g) {\n          switch (state.tokens.curr.id) {\n          case \",\":\n            error(\"E040\");\n            return;\n          case \":\":\n            g = false;\n            statements();\n            break;\n          default:\n            error(\"E025\", state.tokens.curr);\n            return;\n          }\n        } else {\n          if (state.tokens.curr.id === \":\") {\n            advance(\":\");\n            error(\"E024\", state.tokens.curr, \":\");\n            statements();\n          } else {\n            error(\"E021\", state.tokens.next, \"case\", state.tokens.next.value);\n            return;\n          }\n        }\n        indent -= state.option.indent;\n      }\n    }\n  }).labelled = true;\n\n  stmt(\"debugger\", function () {\n    if (!state.option.debug) {\n      warning(\"W087\", this);\n    }\n    return this;\n  }).exps = true;\n\n  (function () {\n    var x = stmt(\"do\", function () {\n      funct[\"(breakage)\"] += 1;\n      funct[\"(loopage)\"] += 1;\n      increaseComplexityCount();\n\n      this.first = block(true, true);\n      advance(\"while\");\n      var t = state.tokens.next;\n      advance(\"(\");\n      checkCondAssignment(expression(0));\n      advance(\")\", t);\n      funct[\"(breakage)\"] -= 1;\n      funct[\"(loopage)\"] -= 1;\n      return this;\n    });\n    x.labelled = true;\n    x.exps = true;\n  }());\n\n  blockstmt(\"for\", function () {\n    var s, t = state.tokens.next;\n    var letscope = false;\n    var foreachtok = null;\n\n    if (t.value === \"each\") {\n      foreachtok = t;\n      advance(\"each\");\n      if (!state.option.inMoz(true)) {\n        warning(\"W118\", state.tokens.curr, \"for each\");\n      }\n    }\n\n    funct[\"(breakage)\"] += 1;\n    funct[\"(loopage)\"] += 1;\n    increaseComplexityCount();\n    advance(\"(\");\n    var nextop; // contains the token of the \"in\" or \"of\" operator\n    var i = 0;\n    var inof = [\"in\", \"of\"];\n    do {\n      nextop = peek(i);\n      ++i;\n    } while (!_.contains(inof, nextop.value) && nextop.value !== \";\" &&\n          nextop.type !== \"(end)\");\n    if (_.contains(inof, nextop.value)) {\n      if (!state.option.inESNext() && nextop.value === \"of\") {\n        error(\"W104\", nextop, \"for of\");\n      }\n\n      if (state.tokens.next.id === \"var\") {\n        advance(\"var\");\n        state.syntax[\"var\"].fud.call(state.syntax[\"var\"].fud, true);\n      } else if (state.tokens.next.id === \"let\") {\n        advance(\"let\");\n        letscope = true;\n        funct[\"(blockscope)\"].stack();\n        state.syntax[\"let\"].fud.call(state.syntax[\"let\"].fud, true);\n      } else if (!state.tokens.next.identifier) {\n        error(\"E030\", state.tokens.next, state.tokens.next.type);\n        advance();\n      } else {\n        switch (funct[state.tokens.next.value]) {\n        case \"unused\":\n          funct[state.tokens.next.value] = \"var\";\n          break;\n        case \"var\":\n          break;\n        default:\n          if (!funct[\"(blockscope)\"].getlabel(state.tokens.next.value))\n            warning(\"W088\", state.tokens.next, state.tokens.next.value);\n        }\n        advance();\n      }\n      advance(nextop.value);\n      expression(20);\n      advance(\")\", t);\n      s = block(true, true);\n      if (state.option.forin && s && (s.length > 1 || typeof s[0] !== \"object\" ||\n          s[0].value !== \"if\")) {\n        warning(\"W089\", this);\n      }\n      funct[\"(breakage)\"] -= 1;\n      funct[\"(loopage)\"] -= 1;\n    } else {\n      if (foreachtok) {\n        error(\"E045\", foreachtok);\n      }\n      if (state.tokens.next.id !== \";\") {\n        if (state.tokens.next.id === \"var\") {\n          advance(\"var\");\n          state.syntax[\"var\"].fud.call(state.syntax[\"var\"].fud);\n        } else if (state.tokens.next.id === \"let\") {\n          advance(\"let\");\n          letscope = true;\n          funct[\"(blockscope)\"].stack();\n          state.syntax[\"let\"].fud.call(state.syntax[\"let\"].fud);\n        } else {\n          for (;;) {\n            expression(0, \"for\");\n            if (state.tokens.next.id !== \",\") {\n              break;\n            }\n            comma();\n          }\n        }\n      }\n      nolinebreak(state.tokens.curr);\n      advance(\";\");\n      if (state.tokens.next.id !== \";\") {\n        checkCondAssignment(expression(0));\n      }\n      nolinebreak(state.tokens.curr);\n      advance(\";\");\n      if (state.tokens.next.id === \";\") {\n        error(\"E021\", state.tokens.next, \")\", \";\");\n      }\n      if (state.tokens.next.id !== \")\") {\n        for (;;) {\n          expression(0, \"for\");\n          if (state.tokens.next.id !== \",\") {\n            break;\n          }\n          comma();\n        }\n      }\n      advance(\")\", t);\n      block(true, true);\n      funct[\"(breakage)\"] -= 1;\n      funct[\"(loopage)\"] -= 1;\n\n    }\n    if (letscope) {\n      funct[\"(blockscope)\"].unstack();\n    }\n    return this;\n  }).labelled = true;\n\n\n  stmt(\"break\", function () {\n    var v = state.tokens.next.value;\n\n    if (funct[\"(breakage)\"] === 0)\n      warning(\"W052\", state.tokens.next, this.value);\n\n    if (!state.option.asi)\n      nolinebreak(this);\n\n    if (state.tokens.next.id !== \";\" && !state.tokens.next.reach) {\n      if (state.tokens.curr.line === state.tokens.next.line) {\n        if (funct[v] !== \"label\") {\n          warning(\"W090\", state.tokens.next, v);\n        } else if (scope[v] !== funct) {\n          warning(\"W091\", state.tokens.next, v);\n        }\n        this.first = state.tokens.next;\n        advance();\n      }\n    }\n    reachable(\"break\");\n    return this;\n  }).exps = true;\n\n\n  stmt(\"continue\", function () {\n    var v = state.tokens.next.value;\n\n    if (funct[\"(breakage)\"] === 0)\n      warning(\"W052\", state.tokens.next, this.value);\n\n    if (!state.option.asi)\n      nolinebreak(this);\n\n    if (state.tokens.next.id !== \";\" && !state.tokens.next.reach) {\n      if (state.tokens.curr.line === state.tokens.next.line) {\n        if (funct[v] !== \"label\") {\n          warning(\"W090\", state.tokens.next, v);\n        } else if (scope[v] !== funct) {\n          warning(\"W091\", state.tokens.next, v);\n        }\n        this.first = state.tokens.next;\n        advance();\n      }\n    } else if (!funct[\"(loopage)\"]) {\n      warning(\"W052\", state.tokens.next, this.value);\n    }\n    reachable(\"continue\");\n    return this;\n  }).exps = true;\n\n\n  stmt(\"return\", function () {\n    if (this.line === state.tokens.next.line) {\n      if (state.tokens.next.id !== \";\" && !state.tokens.next.reach) {\n        this.first = expression(0);\n\n        if (this.first &&\n            this.first.type === \"(punctuator)\" && this.first.value === \"=\" &&\n            !this.first.paren && !state.option.boss) {\n          warningAt(\"W093\", this.first.line, this.first.character);\n        }\n      }\n    } else {\n      if (state.tokens.next.type === \"(punctuator)\" &&\n        [\"[\", \"{\", \"+\", \"-\"].indexOf(state.tokens.next.value) > -1) {\n        nolinebreak(this); // always warn (Line breaking error)\n      }\n    }\n    reachable(\"return\");\n    return this;\n  }).exps = true;\n\n  (function (x) {\n    x.exps = true;\n    x.lbp = 25;\n  }(prefix(\"yield\", function () {\n    var prev = state.tokens.prev;\n    if (state.option.inESNext(true) && !funct[\"(generator)\"]) {\n      if (!(\"(catch)\" === funct[\"(name)\"] && funct[\"(context)\"][\"(generator)\"])) {\n        error(\"E046\", state.tokens.curr, \"yield\");\n      }\n    } else if (!state.option.inESNext()) {\n      warning(\"W104\", state.tokens.curr, \"yield\");\n    }\n    funct[\"(generator)\"] = \"yielded\";\n    if (this.line === state.tokens.next.line || !state.option.inMoz(true)) {\n      if (state.tokens.next.id !== \";\" && !state.tokens.next.reach && state.tokens.next.nud) {\n        nobreaknonadjacent(state.tokens.curr, state.tokens.next);\n        this.first = expression(10);\n\n        if (this.first.type === \"(punctuator)\" && this.first.value === \"=\" &&\n            !this.first.paren && !state.option.boss) {\n          warningAt(\"W093\", this.first.line, this.first.character);\n        }\n      }\n\n      if (state.option.inMoz(true) && state.tokens.next.id !== \")\" &&\n          (prev.lbp > 30 || (!prev.assign && !isEndOfExpr()) || prev.id === \"yield\")) {\n        error(\"E050\", this);\n      }\n    } else if (!state.option.asi) {\n      nolinebreak(this); // always warn (Line breaking error)\n    }\n    return this;\n  })));\n\n\n  stmt(\"throw\", function () {\n    nolinebreak(this);\n    this.first = expression(20);\n    reachable(\"throw\");\n    return this;\n  }).exps = true;\n\n  stmt(\"import\", function () {\n    if (!state.option.inESNext()) {\n      warning(\"W119\", state.tokens.curr, \"import\");\n    }\n\n    if (state.tokens.next.type === \"(string)\") {\n      advance(\"(string)\");\n      return this;\n    }\n    if (state.tokens.next.identifier) {\n      this.name = identifier();\n      addlabel(this.name, { type: \"unused\", token: state.tokens.curr });\n    } else {\n      advance(\"{\");\n      for (;;) {\n        if (state.tokens.next.value === \"}\") {\n          advance(\"}\");\n          break;\n        }\n        var importName;\n        if (state.tokens.next.type === \"default\") {\n          importName = \"default\";\n          advance(\"default\");\n        } else {\n          importName = identifier();\n        }\n        if (state.tokens.next.value === \"as\") {\n          advance(\"as\");\n          importName = identifier();\n        }\n        addlabel(importName, { type: \"unused\", token: state.tokens.curr });\n\n        if (state.tokens.next.value === \",\") {\n          advance(\",\");\n        } else if (state.tokens.next.value === \"}\") {\n          advance(\"}\");\n          break;\n        } else {\n          error(\"E024\", state.tokens.next, state.tokens.next.value);\n          break;\n        }\n      }\n    }\n\n    advance(\"from\");\n    advance(\"(string)\");\n    return this;\n  }).exps = true;\n\n  stmt(\"export\", function () {\n    if (!state.option.inESNext()) {\n      warning(\"W119\", state.tokens.curr, \"export\");\n    }\n\n    if (state.tokens.next.type === \"default\") {\n      advance(\"default\");\n      if (state.tokens.next.id === \"function\" || state.tokens.next.id === \"class\") {\n        this.block = true;\n      }\n      this.exportee = expression(10);\n\n      return this;\n    }\n\n    if (state.tokens.next.value === \"{\") {\n      advance(\"{\");\n      for (;;) {\n        exported[identifier()] = true;\n\n        if (state.tokens.next.value === \",\") {\n          advance(\",\");\n        } else if (state.tokens.next.value === \"}\") {\n          advance(\"}\");\n          break;\n        } else {\n          error(\"E024\", state.tokens.next, state.tokens.next.value);\n          break;\n        }\n      }\n      return this;\n    }\n\n    if (state.tokens.next.id === \"var\") {\n      advance(\"var\");\n      exported[state.tokens.next.value] = true;\n      state.syntax[\"var\"].fud.call(state.syntax[\"var\"].fud);\n    } else if (state.tokens.next.id === \"let\") {\n      advance(\"let\");\n      exported[state.tokens.next.value] = true;\n      state.syntax[\"let\"].fud.call(state.syntax[\"let\"].fud);\n    } else if (state.tokens.next.id === \"const\") {\n      advance(\"const\");\n      exported[state.tokens.next.value] = true;\n      state.syntax[\"const\"].fud.call(state.syntax[\"const\"].fud);\n    } else if (state.tokens.next.id === \"function\") {\n      this.block = true;\n      advance(\"function\");\n      exported[state.tokens.next.value] = true;\n      state.syntax[\"function\"].fud();\n    } else if (state.tokens.next.id === \"class\") {\n      this.block = true;\n      advance(\"class\");\n      exported[state.tokens.next.value] = true;\n      state.syntax[\"class\"].fud();\n    } else {\n      error(\"E024\", state.tokens.next, state.tokens.next.value);\n    }\n\n    return this;\n  }).exps = true;\n\n  FutureReservedWord(\"abstract\");\n  FutureReservedWord(\"boolean\");\n  FutureReservedWord(\"byte\");\n  FutureReservedWord(\"char\");\n  FutureReservedWord(\"class\", { es5: true, nud: classdef });\n  FutureReservedWord(\"double\");\n  FutureReservedWord(\"enum\", { es5: true });\n  FutureReservedWord(\"export\", { es5: true });\n  FutureReservedWord(\"extends\", { es5: true });\n  FutureReservedWord(\"final\");\n  FutureReservedWord(\"float\");\n  FutureReservedWord(\"goto\");\n  FutureReservedWord(\"implements\", { es5: true, strictOnly: true });\n  FutureReservedWord(\"import\", { es5: true });\n  FutureReservedWord(\"int\");\n  FutureReservedWord(\"interface\", { es5: true, strictOnly: true });\n  FutureReservedWord(\"long\");\n  FutureReservedWord(\"native\");\n  FutureReservedWord(\"package\", { es5: true, strictOnly: true });\n  FutureReservedWord(\"private\", { es5: true, strictOnly: true });\n  FutureReservedWord(\"protected\", { es5: true, strictOnly: true });\n  FutureReservedWord(\"public\", { es5: true, strictOnly: true });\n  FutureReservedWord(\"short\");\n  FutureReservedWord(\"static\", { es5: true, strictOnly: true });\n  FutureReservedWord(\"super\", { es5: true });\n  FutureReservedWord(\"synchronized\");\n  FutureReservedWord(\"transient\");\n  FutureReservedWord(\"volatile\");\n\n  var lookupBlockType = function () {\n    var pn, pn1;\n    var i = -1;\n    var bracketStack = 0;\n    var ret = {};\n    if (_.contains([\"[\", \"{\"], state.tokens.curr.value))\n      bracketStack += 1;\n    do {\n      pn = (i === -1) ? state.tokens.next : peek(i);\n      pn1 = peek(i + 1);\n      i = i + 1;\n      if (_.contains([\"[\", \"{\"], pn.value)) {\n        bracketStack += 1;\n      } else if (_.contains([\"]\", \"}\"], pn.value)) {\n        bracketStack -= 1;\n      }\n      if (pn.identifier && pn.value === \"for\" && bracketStack === 1) {\n        ret.isCompArray = true;\n        ret.notJson = true;\n        break;\n      }\n      if (_.contains([\"}\", \"]\"], pn.value) && pn1.value === \"=\" && bracketStack === 0) {\n        ret.isDestAssign = true;\n        ret.notJson = true;\n        break;\n      }\n      if (pn.value === \";\") {\n        ret.isBlock = true;\n        ret.notJson = true;\n      }\n    } while (bracketStack > 0 && pn.id !== \"(end)\" && i < 15);\n    return ret;\n  };\n  function destructuringAssignOrJsonValue() {\n\n    var block = lookupBlockType();\n    if (block.notJson) {\n      if (!state.option.inESNext() && block.isDestAssign) {\n        warning(\"W104\", state.tokens.curr, \"destructuring assignment\");\n      }\n      statements();\n    } else {\n      state.option.laxbreak = true;\n      state.jsonMode = true;\n      jsonValue();\n    }\n  }\n\n  var arrayComprehension = function () {\n    var CompArray = function () {\n      this.mode = \"use\";\n      this.variables = [];\n    };\n    var _carrays = [];\n    var _current;\n    function declare(v) {\n      var l = _current.variables.filter(function (elt) {\n        if (elt.value === v) {\n          elt.undef = false;\n          return v;\n        }\n      }).length;\n      return l !== 0;\n    }\n    function use(v) {\n      var l = _current.variables.filter(function (elt) {\n        if (elt.value === v && !elt.undef) {\n          if (elt.unused === true) {\n            elt.unused = false;\n          }\n          return v;\n        }\n      }).length;\n      return (l === 0);\n    }\n    return {stack: function () {\n          _current = new CompArray();\n          _carrays.push(_current);\n        },\n        unstack: function () {\n          _current.variables.filter(function (v) {\n            if (v.unused)\n              warning(\"W098\", v.token, v.value);\n            if (v.undef)\n              isundef(v.funct, \"W117\", v.token, v.value);\n          });\n          _carrays.splice(-1, 1);\n          _current = _carrays[_carrays.length - 1];\n        },\n        setState: function (s) {\n          if (_.contains([\"use\", \"define\", \"generate\", \"filter\"], s))\n            _current.mode = s;\n        },\n        check: function (v) {\n          if (!_current) {\n            return;\n          }\n          if (_current && _current.mode === \"use\") {\n            if (use(v)) {\n              _current.variables.push({\n                funct: funct,\n                token: state.tokens.curr,\n                value: v,\n                undef: true,\n                unused: false\n              });\n            }\n            return true;\n          } else if (_current && _current.mode === \"define\") {\n            if (!declare(v)) {\n              _current.variables.push({\n                funct: funct,\n                token: state.tokens.curr,\n                value: v,\n                undef: false,\n                unused: true\n              });\n            }\n            return true;\n          } else if (_current && _current.mode === \"generate\") {\n            isundef(funct, \"W117\", state.tokens.curr, v);\n            return true;\n          } else if (_current && _current.mode === \"filter\") {\n            if (use(v)) {\n              isundef(funct, \"W117\", state.tokens.curr, v);\n            }\n            return true;\n          }\n          return false;\n        }\n        };\n  };\n\n  function jsonValue() {\n    function jsonObject() {\n      var o = {}, t = state.tokens.next;\n      advance(\"{\");\n      if (state.tokens.next.id !== \"}\") {\n        for (;;) {\n          if (state.tokens.next.id === \"(end)\") {\n            error(\"E026\", state.tokens.next, t.line);\n          } else if (state.tokens.next.id === \"}\") {\n            warning(\"W094\", state.tokens.curr);\n            break;\n          } else if (state.tokens.next.id === \",\") {\n            error(\"E028\", state.tokens.next);\n          } else if (state.tokens.next.id !== \"(string)\") {\n            warning(\"W095\", state.tokens.next, state.tokens.next.value);\n          }\n          if (o[state.tokens.next.value] === true) {\n            warning(\"W075\", state.tokens.next, state.tokens.next.value);\n          } else if ((state.tokens.next.value === \"__proto__\" &&\n            !state.option.proto) || (state.tokens.next.value === \"__iterator__\" &&\n            !state.option.iterator)) {\n            warning(\"W096\", state.tokens.next, state.tokens.next.value);\n          } else {\n            o[state.tokens.next.value] = true;\n          }\n          advance();\n          advance(\":\");\n          jsonValue();\n          if (state.tokens.next.id !== \",\") {\n            break;\n          }\n          advance(\",\");\n        }\n      }\n      advance(\"}\");\n    }\n\n    function jsonArray() {\n      var t = state.tokens.next;\n      advance(\"[\");\n      if (state.tokens.next.id !== \"]\") {\n        for (;;) {\n          if (state.tokens.next.id === \"(end)\") {\n            error(\"E027\", state.tokens.next, t.line);\n          } else if (state.tokens.next.id === \"]\") {\n            warning(\"W094\", state.tokens.curr);\n            break;\n          } else if (state.tokens.next.id === \",\") {\n            error(\"E028\", state.tokens.next);\n          }\n          jsonValue();\n          if (state.tokens.next.id !== \",\") {\n            break;\n          }\n          advance(\",\");\n        }\n      }\n      advance(\"]\");\n    }\n\n    switch (state.tokens.next.id) {\n    case \"{\":\n      jsonObject();\n      break;\n    case \"[\":\n      jsonArray();\n      break;\n    case \"true\":\n    case \"false\":\n    case \"null\":\n    case \"(number)\":\n    case \"(string)\":\n      advance();\n      break;\n    case \"-\":\n      advance(\"-\");\n      advance(\"(number)\");\n      break;\n    default:\n      error(\"E003\", state.tokens.next);\n    }\n  }\n\n  var blockScope = function () {\n    var _current = {};\n    var _variables = [_current];\n\n    function _checkBlockLabels() {\n      for (var t in _current) {\n        if (_current[t][\"(type)\"] === \"unused\") {\n          if (state.option.unused) {\n            var tkn = _current[t][\"(token)\"];\n            var line = tkn.line;\n            var chr  = tkn.character;\n            warningAt(\"W098\", line, chr, t);\n          }\n        }\n      }\n    }\n\n    return {\n      stack: function () {\n        _current = {};\n        _variables.push(_current);\n      },\n\n      unstack: function () {\n        _checkBlockLabels();\n        _variables.splice(_variables.length - 1, 1);\n        _current = _.last(_variables);\n      },\n\n      getlabel: function (l) {\n        for (var i = _variables.length - 1 ; i >= 0; --i) {\n          if (_.has(_variables[i], l) && !_variables[i][l][\"(shadowed)\"]) {\n            return _variables[i];\n          }\n        }\n      },\n\n      shadow: function (name) {\n        for (var i = _variables.length - 1; i >= 0; i--) {\n          if (_.has(_variables[i], name)) {\n            _variables[i][name][\"(shadowed)\"] = true;\n          }\n        }\n      },\n\n      unshadow: function (name) {\n        for (var i = _variables.length - 1; i >= 0; i--) {\n          if (_.has(_variables[i], name)) {\n            _variables[i][name][\"(shadowed)\"] = false;\n          }\n        }\n      },\n\n      current: {\n        has: function (t) {\n          return _.has(_current, t);\n        },\n\n        add: function (t, type, tok) {\n          _current[t] = { \"(type)\" : type, \"(token)\": tok, \"(shadowed)\": false };\n        }\n      }\n    };\n  };\n  var itself = function (s, o, g) {\n    var i, k, x;\n    var optionKeys;\n    var newOptionObj = {};\n    var newIgnoredObj = {};\n\n    o = _.clone(o);\n    state.reset();\n\n    if (o && o.scope) {\n      JSHINT.scope = o.scope;\n    } else {\n      JSHINT.errors = [];\n      JSHINT.undefs = [];\n      JSHINT.internals = [];\n      JSHINT.blacklist = {};\n      JSHINT.scope = \"(main)\";\n    }\n\n    predefined = Object.create(null);\n    combine(predefined, vars.ecmaIdentifiers);\n    combine(predefined, vars.reservedVars);\n\n    combine(predefined, g || {});\n\n    declared = Object.create(null);\n    exported = Object.create(null);\n\n    function each(obj, cb) {\n      if (!obj)\n        return;\n\n      if (!Array.isArray(obj) && typeof obj === \"object\")\n        obj = Object.keys(obj);\n\n      obj.forEach(cb);\n    }\n\n    if (o) {\n      each(o.predef || null, function (item) {\n        var slice, prop;\n\n        if (item[0] === \"-\") {\n          slice = item.slice(1);\n          JSHINT.blacklist[slice] = slice;\n        } else {\n          prop = Object.getOwnPropertyDescriptor(o.predef, item);\n          predefined[item] = prop ? prop.value : false;\n        }\n      });\n\n      each(o.exported || null, function (item) {\n        exported[item] = true;\n      });\n\n      delete o.predef;\n      delete o.exported;\n\n      optionKeys = Object.keys(o);\n      for (x = 0; x < optionKeys.length; x++) {\n        if (/^-W\\d{3}$/g.test(optionKeys[x])) {\n          newIgnoredObj[optionKeys[x].slice(1)] = true;\n        } else {\n          newOptionObj[optionKeys[x]] = o[optionKeys[x]];\n\n          if (optionKeys[x] === \"newcap\" && o[optionKeys[x]] === false)\n            newOptionObj[\"(explicitNewcap)\"] = true;\n        }\n      }\n    }\n\n    state.option = newOptionObj;\n    state.ignored = newIgnoredObj;\n\n    state.option.indent = state.option.indent || 4;\n    state.option.maxerr = state.option.maxerr || 50;\n\n    indent = 1;\n    global = Object.create(predefined);\n    scope = global;\n\n    funct = functor(\"(global)\", null, scope, {\n      \"(global)\"    : true,\n      \"(blockscope)\": blockScope(),\n      \"(comparray)\" : arrayComprehension(),\n      \"(metrics)\"   : createMetrics(state.tokens.next)\n    });\n\n    functions = [funct];\n    urls = [];\n    stack = null;\n    member = {};\n    membersOnly = null;\n    implied = {};\n    inblock = false;\n    lookahead = [];\n    unuseds = [];\n\n    if (!isString(s) && !Array.isArray(s)) {\n      errorAt(\"E004\", 0);\n      return false;\n    }\n\n    api = {\n      get isJSON() {\n        return state.jsonMode;\n      },\n\n      getOption: function (name) {\n        return state.option[name] || null;\n      },\n\n      getCache: function (name) {\n        return state.cache[name];\n      },\n\n      setCache: function (name, value) {\n        state.cache[name] = value;\n      },\n\n      warn: function (code, data) {\n        warningAt.apply(null, [ code, data.line, data.char ].concat(data.data));\n      },\n\n      on: function (names, listener) {\n        names.split(\" \").forEach(function (name) {\n          emitter.on(name, listener);\n        }.bind(this));\n      }\n    };\n\n    emitter.removeAllListeners();\n    (extraModules || []).forEach(function (func) {\n      func(api);\n    });\n\n    state.tokens.prev = state.tokens.curr = state.tokens.next = state.syntax[\"(begin)\"];\n\n    lex = new Lexer(s);\n\n    lex.on(\"warning\", function (ev) {\n      warningAt.apply(null, [ ev.code, ev.line, ev.character].concat(ev.data));\n    });\n\n    lex.on(\"error\", function (ev) {\n      errorAt.apply(null, [ ev.code, ev.line, ev.character ].concat(ev.data));\n    });\n\n    lex.on(\"fatal\", function (ev) {\n      quit(\"E041\", ev.line, ev.from);\n    });\n\n    lex.on(\"Identifier\", function (ev) {\n      emitter.emit(\"Identifier\", ev);\n    });\n\n    lex.on(\"String\", function (ev) {\n      emitter.emit(\"String\", ev);\n    });\n\n    lex.on(\"Number\", function (ev) {\n      emitter.emit(\"Number\", ev);\n    });\n\n    lex.start();\n    for (var name in o) {\n      if (_.has(o, name)) {\n        checkOption(name, state.tokens.curr);\n      }\n    }\n\n    assume();\n    combine(predefined, g || {});\n    comma.first = true;\n\n    try {\n      advance();\n      switch (state.tokens.next.id) {\n      case \"{\":\n      case \"[\":\n        destructuringAssignOrJsonValue();\n        break;\n      default:\n        directives();\n\n        if (state.directive[\"use strict\"]) {\n          if (!state.option.globalstrict && !(state.option.node || state.option.phantom)) {\n            warning(\"W097\", state.tokens.prev);\n          }\n        }\n\n        statements();\n      }\n      advance((state.tokens.next && state.tokens.next.value !== \".\")  ? \"(end)\" : undefined);\n      funct[\"(blockscope)\"].unstack();\n\n      var markDefined = function (name, context) {\n        do {\n          if (typeof context[name] === \"string\") {\n\n            if (context[name] === \"unused\")\n              context[name] = \"var\";\n            else if (context[name] === \"unction\")\n              context[name] = \"closure\";\n\n            return true;\n          }\n\n          context = context[\"(context)\"];\n        } while (context);\n\n        return false;\n      };\n\n      var clearImplied = function (name, line) {\n        if (!implied[name])\n          return;\n\n        var newImplied = [];\n        for (var i = 0; i < implied[name].length; i += 1) {\n          if (implied[name][i] !== line)\n            newImplied.push(implied[name][i]);\n        }\n\n        if (newImplied.length === 0)\n          delete implied[name];\n        else\n          implied[name] = newImplied;\n      };\n\n      var warnUnused = function (name, tkn, type, unused_opt) {\n        var line = tkn.line;\n        var chr  = tkn.character;\n\n        if (unused_opt === undefined) {\n          unused_opt = state.option.unused;\n        }\n\n        if (unused_opt === true) {\n          unused_opt = \"last-param\";\n        }\n\n        var warnable_types = {\n          \"vars\": [\"var\"],\n          \"last-param\": [\"var\", \"param\"],\n          \"strict\": [\"var\", \"param\", \"last-param\"]\n        };\n\n        if (unused_opt) {\n          if (warnable_types[unused_opt] && warnable_types[unused_opt].indexOf(type) !== -1) {\n            warningAt(\"W098\", line, chr, name);\n          }\n        }\n\n        unuseds.push({\n          name: name,\n          line: line,\n          character: chr\n        });\n      };\n\n      var checkUnused = function (func, key) {\n        var type = func[key];\n        var tkn = func[\"(tokens)\"][key];\n\n        if (key.charAt(0) === \"(\")\n          return;\n\n        if (type !== \"unused\" && type !== \"unction\" && type !== \"const\")\n          return;\n        if (func[\"(params)\"] && func[\"(params)\"].indexOf(key) !== -1)\n          return;\n        if (func[\"(global)\"] && _.has(exported, key))\n          return;\n        if (type === \"const\" && !getprop(func, key, \"unused\"))\n          return;\n\n        warnUnused(key, tkn, \"var\");\n      };\n      for (i = 0; i < JSHINT.undefs.length; i += 1) {\n        k = JSHINT.undefs[i].slice(0);\n\n        if (markDefined(k[2].value, k[0])) {\n          clearImplied(k[2].value, k[2].line);\n        } else if (state.option.undef) {\n          warning.apply(warning, k.slice(1));\n        }\n      }\n\n      functions.forEach(function (func) {\n        if (func[\"(unusedOption)\"] === false) {\n          return;\n        }\n\n        for (var key in func) {\n          if (_.has(func, key)) {\n            checkUnused(func, key);\n          }\n        }\n\n        if (!func[\"(params)\"])\n          return;\n\n        var params = func[\"(params)\"].slice();\n        var param  = params.pop();\n        var type, unused_opt;\n\n        while (param) {\n          type = func[param];\n          unused_opt = func[\"(unusedOption)\"] || state.option.unused;\n          unused_opt = unused_opt === true ? \"last-param\" : unused_opt;\n\n          if (param === \"undefined\")\n            return;\n\n          if (type === \"unused\" || type === \"unction\") {\n            warnUnused(param, func[\"(tokens)\"][param], \"param\", func[\"(unusedOption)\"]);\n          } else if (unused_opt === \"last-param\") {\n            return;\n          }\n\n          param = params.pop();\n        }\n      });\n\n      for (var key in declared) {\n        if (_.has(declared, key) && !_.has(global, key) && !_.has(exported, key)) {\n          warnUnused(key, declared[key], \"var\");\n        }\n      }\n\n    } catch (err) {\n      if (err && err.name === \"JSHintError\") {\n        var nt = state.tokens.next || {};\n        JSHINT.errors.push({\n          scope     : \"(main)\",\n          raw       : err.raw,\n          code      : err.code,\n          reason    : err.message,\n          line      : err.line || nt.line,\n          character : err.character || nt.from\n        }, null);\n      } else {\n        throw err;\n      }\n    }\n\n    if (JSHINT.scope === \"(main)\") {\n      o = o || {};\n\n      for (i = 0; i < JSHINT.internals.length; i += 1) {\n        k = JSHINT.internals[i];\n        o.scope = k.elem;\n        itself(k.value, o, g);\n      }\n    }\n\n    return JSHINT.errors.length === 0;\n  };\n  itself.addModule = function (func) {\n    extraModules.push(func);\n  };\n\n  itself.addModule(style.register);\n  itself.data = function () {\n    var data = {\n      functions: [],\n      options: state.option\n    };\n\n    var implieds = [];\n    var members = [];\n    var fu, f, i, j, n, globals;\n\n    if (itself.errors.length) {\n      data.errors = itself.errors;\n    }\n\n    if (state.jsonMode) {\n      data.json = true;\n    }\n\n    for (n in implied) {\n      if (_.has(implied, n)) {\n        implieds.push({\n          name: n,\n          line: implied[n]\n        });\n      }\n    }\n\n    if (implieds.length > 0) {\n      data.implieds = implieds;\n    }\n\n    if (urls.length > 0) {\n      data.urls = urls;\n    }\n\n    globals = Object.keys(scope);\n    if (globals.length > 0) {\n      data.globals = globals;\n    }\n\n    for (i = 1; i < functions.length; i += 1) {\n      f = functions[i];\n      fu = {};\n\n      for (j = 0; j < functionicity.length; j += 1) {\n        fu[functionicity[j]] = [];\n      }\n\n      for (j = 0; j < functionicity.length; j += 1) {\n        if (fu[functionicity[j]].length === 0) {\n          delete fu[functionicity[j]];\n        }\n      }\n\n      fu.name = f[\"(name)\"];\n      fu.param = f[\"(params)\"];\n      fu.line = f[\"(line)\"];\n      fu.character = f[\"(character)\"];\n      fu.last = f[\"(last)\"];\n      fu.lastcharacter = f[\"(lastcharacter)\"];\n\n      fu.metrics = {\n        complexity: f[\"(metrics)\"].ComplexityCount,\n        parameters: (f[\"(params)\"] || []).length,\n        statements: f[\"(metrics)\"].statementCount\n      };\n\n      data.functions.push(fu);\n    }\n\n    if (unuseds.length > 0) {\n      data.unused = unuseds;\n    }\n\n    members = [];\n    for (n in member) {\n      if (typeof member[n] === \"number\") {\n        data.member = member;\n        break;\n      }\n    }\n\n    return data;\n  };\n\n  itself.jshint = itself;\n\n  return itself;\n}());\nif (typeof exports === \"object\" && exports) {\n  exports.JSHINT = JSHINT;\n}\n\n},\n{\"./lex.js\":4,\"./messages.js\":5,\"./reg.js\":6,\"./state.js\":7,\"./style.js\":8,\"./vars.js\":9,\"events\":10,\"underscore\":2}],\n4:[function(_dereq_,module,exports){\n\n\"use strict\";\n\nvar _      = _dereq_(\"underscore\");\nvar events = _dereq_(\"events\");\nvar reg    = _dereq_(\"./reg.js\");\nvar state  = _dereq_(\"./state.js\").state;\n\nvar unicodeData = _dereq_(\"../data/ascii-identifier-data.js\");\nvar asciiIdentifierStartTable = unicodeData.asciiIdentifierStartTable;\nvar asciiIdentifierPartTable = unicodeData.asciiIdentifierPartTable;\n\nvar Token = {\n  Identifier: 1,\n  Punctuator: 2,\n  NumericLiteral: 3,\n  StringLiteral: 4,\n  Comment: 5,\n  Keyword: 6,\n  NullLiteral: 7,\n  BooleanLiteral: 8,\n  RegExp: 9,\n  TemplateLiteral: 10\n};\n\nfunction asyncTrigger() {\n  var _checks = [];\n\n  return {\n    push: function (fn) {\n      _checks.push(fn);\n    },\n\n    check: function () {\n      for (var check = 0; check < _checks.length; ++check) {\n        _checks[check]();\n      }\n\n      _checks.splice(0, _checks.length);\n    }\n  };\n}\nfunction Lexer(source) {\n  var lines = source;\n\n  if (typeof lines === \"string\") {\n    lines = lines\n      .replace(/\\r\\n/g, \"\\n\")\n      .replace(/\\r/g, \"\\n\")\n      .split(\"\\n\");\n  }\n\n  if (lines[0] && lines[0].substr(0, 2) === \"#!\") {\n    if (lines[0].indexOf(\"node\") !== -1) {\n      state.option.node = true;\n    }\n    lines[0] = \"\";\n  }\n\n  this.emitter = new events.EventEmitter();\n  this.source = source;\n  this.setLines(lines);\n  this.prereg = true;\n\n  this.line = 0;\n  this.char = 1;\n  this.from = 1;\n  this.input = \"\";\n  this.inComment = false;\n\n  for (var i = 0; i < state.option.indent; i += 1) {\n    state.tab += \" \";\n  }\n}\n\nLexer.prototype = {\n  _lines: [],\n\n  getLines: function () {\n    this._lines = state.lines;\n    return this._lines;\n  },\n\n  setLines: function (val) {\n    this._lines = val;\n    state.lines = this._lines;\n  },\n  peek: function (i) {\n    return this.input.charAt(i || 0);\n  },\n  skip: function (i) {\n    i = i || 1;\n    this.char += i;\n    this.input = this.input.slice(i);\n  },\n  on: function (names, listener) {\n    names.split(\" \").forEach(function (name) {\n      this.emitter.on(name, listener);\n    }.bind(this));\n  },\n  trigger: function () {\n    this.emitter.emit.apply(this.emitter, Array.prototype.slice.call(arguments));\n  },\n  triggerAsync: function (type, args, checks, fn) {\n    checks.push(function () {\n      if (fn()) {\n        this.trigger(type, args);\n      }\n    }.bind(this));\n  },\n  scanPunctuator: function () {\n    var ch1 = this.peek();\n    var ch2, ch3, ch4;\n\n    switch (ch1) {\n    case \".\":\n      if ((/^[0-9]$/).test(this.peek(1))) {\n        return null;\n      }\n      if (this.peek(1) === \".\" && this.peek(2) === \".\") {\n        return {\n          type: Token.Punctuator,\n          value: \"...\"\n        };\n      }\n    case \"(\":\n    case \")\":\n    case \";\":\n    case \",\":\n    case \"{\":\n    case \"}\":\n    case \"[\":\n    case \"]\":\n    case \":\":\n    case \"~\":\n    case \"?\":\n      return {\n        type: Token.Punctuator,\n        value: ch1\n      };\n    case \"#\":\n      return {\n        type: Token.Punctuator,\n        value: ch1\n      };\n    case \"\":\n      return null;\n    }\n\n    ch2 = this.peek(1);\n    ch3 = this.peek(2);\n    ch4 = this.peek(3);\n\n    if (ch1 === \">\" && ch2 === \">\" && ch3 === \">\" && ch4 === \"=\") {\n      return {\n        type: Token.Punctuator,\n        value: \">>>=\"\n      };\n    }\n\n    if (ch1 === \"=\" && ch2 === \"=\" && ch3 === \"=\") {\n      return {\n        type: Token.Punctuator,\n        value: \"===\"\n      };\n    }\n\n    if (ch1 === \"!\" && ch2 === \"=\" && ch3 === \"=\") {\n      return {\n        type: Token.Punctuator,\n        value: \"!==\"\n      };\n    }\n\n    if (ch1 === \">\" && ch2 === \">\" && ch3 === \">\") {\n      return {\n        type: Token.Punctuator,\n        value: \">>>\"\n      };\n    }\n\n    if (ch1 === \"<\" && ch2 === \"<\" && ch3 === \"=\") {\n      return {\n        type: Token.Punctuator,\n        value: \"<<=\"\n      };\n    }\n\n    if (ch1 === \">\" && ch2 === \">\" && ch3 === \"=\") {\n      return {\n        type: Token.Punctuator,\n        value: \">>=\"\n      };\n    }\n    if (ch1 === \"=\" && ch2 === \">\") {\n      return {\n        type: Token.Punctuator,\n        value: ch1 + ch2\n      };\n    }\n    if (ch1 === ch2 && (\"+-<>&|\".indexOf(ch1) >= 0)) {\n      return {\n        type: Token.Punctuator,\n        value: ch1 + ch2\n      };\n    }\n\n    if (\"<>=!+-*%&|^\".indexOf(ch1) >= 0) {\n      if (ch2 === \"=\") {\n        return {\n          type: Token.Punctuator,\n          value: ch1 + ch2\n        };\n      }\n\n      return {\n        type: Token.Punctuator,\n        value: ch1\n      };\n    }\n\n    if (ch1 === \"/\") {\n      if (ch2 === \"=\" && /\\/=(?!(\\S*\\/[gim]?))/.test(this.input)) {\n        return {\n          type: Token.Punctuator,\n          value: \"/=\"\n        };\n      }\n\n      return {\n        type: Token.Punctuator,\n        value: \"/\"\n      };\n    }\n\n    return null;\n  },\n  scanComments: function () {\n    var ch1 = this.peek();\n    var ch2 = this.peek(1);\n    var rest = this.input.substr(2);\n    var startLine = this.line;\n    var startChar = this.char;\n\n    function commentToken(label, body, opt) {\n      var special = [\"jshint\", \"jslint\", \"members\", \"member\", \"globals\", \"global\", \"exported\"];\n      var isSpecial = false;\n      var value = label + body;\n      var commentType = \"plain\";\n      opt = opt || {};\n\n      if (opt.isMultiline) {\n        value += \"*/\";\n      }\n\n      special.forEach(function (str) {\n        if (isSpecial) {\n          return;\n        }\n        if (label === \"//\" && str !== \"jshint\") {\n          return;\n        }\n\n        if (body.substr(0, str.length) === str) {\n          isSpecial = true;\n          label = label + str;\n          body = body.substr(str.length);\n        }\n\n        if (!isSpecial && body.charAt(0) === \" \" && body.substr(1, str.length) === str) {\n          isSpecial = true;\n          label = label + \" \" + str;\n          body = body.substr(str.length + 1);\n        }\n\n        if (!isSpecial) {\n          return;\n        }\n\n        switch (str) {\n        case \"member\":\n          commentType = \"members\";\n          break;\n        case \"global\":\n          commentType = \"globals\";\n          break;\n        default:\n          commentType = str;\n        }\n      });\n\n      return {\n        type: Token.Comment,\n        commentType: commentType,\n        value: value,\n        body: body,\n        isSpecial: isSpecial,\n        isMultiline: opt.isMultiline || false,\n        isMalformed: opt.isMalformed || false\n      };\n    }\n    if (ch1 === \"*\" && ch2 === \"/\") {\n      this.trigger(\"error\", {\n        code: \"E018\",\n        line: startLine,\n        character: startChar\n      });\n\n      this.skip(2);\n      return null;\n    }\n    if (ch1 !== \"/\" || (ch2 !== \"*\" && ch2 !== \"/\")) {\n      return null;\n    }\n    if (ch2 === \"/\") {\n      this.skip(this.input.length); // Skip to the EOL.\n      return commentToken(\"//\", rest);\n    }\n\n    var body = \"\";\n    if (ch2 === \"*\") {\n      this.inComment = true;\n      this.skip(2);\n\n      while (this.peek() !== \"*\" || this.peek(1) !== \"/\") {\n        if (this.peek() === \"\") { // End of Line\n          body += \"\\n\";\n          if (!this.nextLine()) {\n            this.trigger(\"error\", {\n              code: \"E017\",\n              line: startLine,\n              character: startChar\n            });\n\n            this.inComment = false;\n            return commentToken(\"/*\", body, {\n              isMultiline: true,\n              isMalformed: true\n            });\n          }\n        } else {\n          body += this.peek();\n          this.skip();\n        }\n      }\n\n      this.skip(2);\n      this.inComment = false;\n      return commentToken(\"/*\", body, { isMultiline: true });\n    }\n  },\n  scanKeyword: function () {\n    var result = /^[a-zA-Z_$][a-zA-Z0-9_$]*/.exec(this.input);\n    var keywords = [\n      \"if\", \"in\", \"do\", \"var\", \"for\", \"new\",\n      \"try\", \"let\", \"this\", \"else\", \"case\",\n      \"void\", \"with\", \"enum\", \"while\", \"break\",\n      \"catch\", \"throw\", \"const\", \"yield\", \"class\",\n      \"super\", \"return\", \"typeof\", \"delete\",\n      \"switch\", \"export\", \"import\", \"default\",\n      \"finally\", \"extends\", \"function\", \"continue\",\n      \"debugger\", \"instanceof\"\n    ];\n\n    if (result && keywords.indexOf(result[0]) >= 0) {\n      return {\n        type: Token.Keyword,\n        value: result[0]\n      };\n    }\n\n    return null;\n  },\n  scanIdentifier: function () {\n    var id = \"\";\n    var index = 0;\n    var type, char;\n\n    function isNonAsciiIdentifierStart(code) {\n      return code > 256;\n    }\n\n    function isNonAsciiIdentifierPart(code) {\n      return code > 256;\n    }\n\n    function isHexDigit(str) {\n      return (/^[0-9a-fA-F]$/).test(str);\n    }\n\n    var readUnicodeEscapeSequence = function () {\n      index += 1;\n\n      if (this.peek(index) !== \"u\") {\n        return null;\n      }\n\n      var ch1 = this.peek(index + 1);\n      var ch2 = this.peek(index + 2);\n      var ch3 = this.peek(index + 3);\n      var ch4 = this.peek(index + 4);\n      var code;\n\n      if (isHexDigit(ch1) && isHexDigit(ch2) && isHexDigit(ch3) && isHexDigit(ch4)) {\n        code = parseInt(ch1 + ch2 + ch3 + ch4, 16);\n\n        if (asciiIdentifierPartTable[code] || isNonAsciiIdentifierPart(code)) {\n          index += 5;\n          return \"\\\\u\" + ch1 + ch2 + ch3 + ch4;\n        }\n\n        return null;\n      }\n\n      return null;\n    }.bind(this);\n\n    var getIdentifierStart = function () {\n      var chr = this.peek(index);\n      var code = chr.charCodeAt(0);\n\n      if (code === 92) {\n        return readUnicodeEscapeSequence();\n      }\n\n      if (code < 128) {\n        if (asciiIdentifierStartTable[code]) {\n          index += 1;\n          return chr;\n        }\n\n        return null;\n      }\n\n      if (isNonAsciiIdentifierStart(code)) {\n        index += 1;\n        return chr;\n      }\n\n      return null;\n    }.bind(this);\n\n    var getIdentifierPart = function () {\n      var chr = this.peek(index);\n      var code = chr.charCodeAt(0);\n\n      if (code === 92) {\n        return readUnicodeEscapeSequence();\n      }\n\n      if (code < 128) {\n        if (asciiIdentifierPartTable[code]) {\n          index += 1;\n          return chr;\n        }\n\n        return null;\n      }\n\n      if (isNonAsciiIdentifierPart(code)) {\n        index += 1;\n        return chr;\n      }\n\n      return null;\n    }.bind(this);\n\n    char = getIdentifierStart();\n    if (char === null) {\n      return null;\n    }\n\n    id = char;\n    for (;;) {\n      char = getIdentifierPart();\n\n      if (char === null) {\n        break;\n      }\n\n      id += char;\n    }\n\n    switch (id) {\n    case \"true\":\n    case \"false\":\n      type = Token.BooleanLiteral;\n      break;\n    case \"null\":\n      type = Token.NullLiteral;\n      break;\n    default:\n      type = Token.Identifier;\n    }\n\n    return {\n      type: type,\n      value: id\n    };\n  },\n  scanNumericLiteral: function () {\n    var index = 0;\n    var value = \"\";\n    var length = this.input.length;\n    var char = this.peek(index);\n    var bad;\n\n    function isDecimalDigit(str) {\n      return (/^[0-9]$/).test(str);\n    }\n\n    function isOctalDigit(str) {\n      return (/^[0-7]$/).test(str);\n    }\n\n    function isHexDigit(str) {\n      return (/^[0-9a-fA-F]$/).test(str);\n    }\n\n    function isIdentifierStart(ch) {\n      return (ch === \"$\") || (ch === \"_\") || (ch === \"\\\\\") ||\n        (ch >= \"a\" && ch <= \"z\") || (ch >= \"A\" && ch <= \"Z\");\n    }\n\n    if (char !== \".\" && !isDecimalDigit(char)) {\n      return null;\n    }\n\n    if (char !== \".\") {\n      value = this.peek(index);\n      index += 1;\n      char = this.peek(index);\n\n      if (value === \"0\") {\n        if (char === \"x\" || char === \"X\") {\n          index += 1;\n          value += char;\n\n          while (index < length) {\n            char = this.peek(index);\n            if (!isHexDigit(char)) {\n              break;\n            }\n            value += char;\n            index += 1;\n          }\n\n          if (value.length <= 2) { // 0x\n            return {\n              type: Token.NumericLiteral,\n              value: value,\n              isMalformed: true\n            };\n          }\n\n          if (index < length) {\n            char = this.peek(index);\n            if (isIdentifierStart(char)) {\n              return null;\n            }\n          }\n\n          return {\n            type: Token.NumericLiteral,\n            value: value,\n            base: 16,\n            isMalformed: false\n          };\n        }\n        if (isOctalDigit(char)) {\n          index += 1;\n          value += char;\n          bad = false;\n\n          while (index < length) {\n            char = this.peek(index);\n\n            if (isDecimalDigit(char)) {\n              bad = true;\n            } else if (!isOctalDigit(char)) {\n              break;\n            }\n            value += char;\n            index += 1;\n          }\n\n          if (index < length) {\n            char = this.peek(index);\n            if (isIdentifierStart(char)) {\n              return null;\n            }\n          }\n\n          return {\n            type: Token.NumericLiteral,\n            value: value,\n            base: 8,\n            isMalformed: false\n          };\n        }\n\n        if (isDecimalDigit(char)) {\n          index += 1;\n          value += char;\n        }\n      }\n\n      while (index < length) {\n        char = this.peek(index);\n        if (!isDecimalDigit(char)) {\n          break;\n        }\n        value += char;\n        index += 1;\n      }\n    }\n\n    if (char === \".\") {\n      value += char;\n      index += 1;\n\n      while (index < length) {\n        char = this.peek(index);\n        if (!isDecimalDigit(char)) {\n          break;\n        }\n        value += char;\n        index += 1;\n      }\n    }\n\n    if (char === \"e\" || char === \"E\") {\n      value += char;\n      index += 1;\n      char = this.peek(index);\n\n      if (char === \"+\" || char === \"-\") {\n        value += this.peek(index);\n        index += 1;\n      }\n\n      char = this.peek(index);\n      if (isDecimalDigit(char)) {\n        value += char;\n        index += 1;\n\n        while (index < length) {\n          char = this.peek(index);\n          if (!isDecimalDigit(char)) {\n            break;\n          }\n          value += char;\n          index += 1;\n        }\n      } else {\n        return null;\n      }\n    }\n\n    if (index < length) {\n      char = this.peek(index);\n      if (isIdentifierStart(char)) {\n        return null;\n      }\n    }\n\n    return {\n      type: Token.NumericLiteral,\n      value: value,\n      base: 10,\n      isMalformed: !isFinite(value)\n    };\n  },\n  scanTemplateLiteral: function () {\n    if (!state.option.esnext || this.peek() !== \"`\") {\n      return null;\n    }\n\n    var startLine = this.line;\n    var startChar = this.char;\n    var jump = 1;\n    var value = \"\";\n    this.skip();\n\n    while (this.peek() !== \"`\") {\n      while (this.peek() === \"\") {\n        if (!this.nextLine()) {\n          this.trigger(\"error\", {\n            code: \"E052\",\n            line: startLine,\n            character: startChar\n          });\n\n          return {\n            type: Token.TemplateLiteral,\n            value: value,\n            isUnclosed: true\n          };\n        }\n        value += \"\\n\";\n      }\n      var char = this.peek();\n      this.skip(jump);\n      value += char;\n    }\n\n    this.skip();\n    return {\n      type: Token.TemplateLiteral,\n      value: value,\n      isUnclosed: false\n    };\n  },\n  scanStringLiteral: function (checks) {\n    var quote = this.peek();\n    if (quote !== \"\\\"\" && quote !== \"'\") {\n      return null;\n    }\n    this.triggerAsync(\"warning\", {\n      code: \"W108\",\n      line: this.line,\n      character: this.char // +1?\n    }, checks, function () { return state.jsonMode && quote !== \"\\\"\"; });\n\n    var value = \"\";\n    var startLine = this.line;\n    var startChar = this.char;\n    var allowNewLine = false;\n\n    this.skip();\n\n    outer: while (this.peek() !== quote) {\n      while (this.peek() === \"\") { // End Of Line\n\n        if (!allowNewLine) {\n          this.trigger(\"warning\", {\n            code: \"W112\",\n            line: this.line,\n            character: this.char\n          });\n        } else {\n          allowNewLine = false;\n\n          this.triggerAsync(\"warning\", {\n            code: \"W043\",\n            line: this.line,\n            character: this.char\n          }, checks, function () { return !state.option.multistr; });\n\n          this.triggerAsync(\"warning\", {\n            code: \"W042\",\n            line: this.line,\n            character: this.char\n          }, checks, function () { return state.jsonMode && state.option.multistr; });\n        }\n\n        if (!this.nextLine()) {\n          this.trigger(\"error\", {\n            code: \"E029\",\n            line: startLine,\n            character: startChar\n          });\n\n          return {\n            type: Token.StringLiteral,\n            value: value,\n            isUnclosed: true,\n            quote: quote\n          };\n        }\n        \n        if (this.peek() == quote)\n          break outer;\n      }\n\n      allowNewLine = false;\n      var char = this.peek();\n      var jump = 1; // A length of a jump, after we're done\n\n      if (char < \" \") {\n        this.trigger(\"warning\", {\n          code: \"W113\",\n          line: this.line,\n          character: this.char,\n          data: [ \"<non-printable>\" ]\n        });\n      }\n\n      if (char === \"\\\\\") {\n        this.skip();\n        char = this.peek();\n\n        switch (char) {\n        case \"'\":\n          this.triggerAsync(\"warning\", {\n            code: \"W114\",\n            line: this.line,\n            character: this.char,\n            data: [ \"\\\\'\" ]\n          }, checks, function () {return state.jsonMode; });\n          break;\n        case \"b\":\n          char = \"\\\\b\";\n          break;\n        case \"f\":\n          char = \"\\\\f\";\n          break;\n        case \"n\":\n          char = \"\\\\n\";\n          break;\n        case \"r\":\n          char = \"\\\\r\";\n          break;\n        case \"t\":\n          char = \"\\\\t\";\n          break;\n        case \"0\":\n          char = \"\\\\0\";\n          var n = parseInt(this.peek(1), 10);\n          this.triggerAsync(\"warning\", {\n            code: \"W115\",\n            line: this.line,\n            character: this.char\n          }, checks,\n          function () { return n >= 0 && n <= 7 && state.directive[\"use strict\"]; });\n          break;\n        case \"u\":\n          char = String.fromCharCode(parseInt(this.input.substr(1, 4), 16));\n          jump = 5;\n          break;\n        case \"v\":\n          this.triggerAsync(\"warning\", {\n            code: \"W114\",\n            line: this.line,\n            character: this.char,\n            data: [ \"\\\\v\" ]\n          }, checks, function () { return state.jsonMode; });\n\n          char = \"\\v\";\n          break;\n        case \"x\":\n          var  x = parseInt(this.input.substr(1, 2), 16);\n\n          this.triggerAsync(\"warning\", {\n            code: \"W114\",\n            line: this.line,\n            character: this.char,\n            data: [ \"\\\\x-\" ]\n          }, checks, function () { return state.jsonMode; });\n\n          char = String.fromCharCode(x);\n          jump = 3;\n          break;\n        case \"\\\\\":\n          char = \"\\\\\\\\\";\n          break;\n        case \"\\\"\":\n          char = \"\\\\\\\"\";\n          break;\n        case \"/\":\n          break;\n        case \"\":\n          allowNewLine = true;\n          char = \"\";\n          break;\n        case \"!\":\n          if (value.slice(value.length - 2) === \"<\") {\n            break;\n          }\n        default:\n          this.trigger(\"warning\", {\n            code: \"W044\",\n            line: this.line,\n            character: this.char\n          });\n        }\n      }\n\n      value += char;\n      this.skip(jump);\n    }\n\n    this.skip();\n    return {\n      type: Token.StringLiteral,\n      value: value,\n      isUnclosed: false,\n      quote: quote\n    };\n  },\n  scanRegExp: function () {\n    var index = 0;\n    var length = this.input.length;\n    var char = this.peek();\n    var value = char;\n    var body = \"\";\n    var flags = [];\n    var malformed = false;\n    var isCharSet = false;\n    var terminated;\n\n    var scanUnexpectedChars = function () {\n      if (char < \" \") {\n        malformed = true;\n        this.trigger(\"warning\", {\n          code: \"W048\",\n          line: this.line,\n          character: this.char\n        });\n      }\n      if (char === \"<\") {\n        malformed = true;\n        this.trigger(\"warning\", {\n          code: \"W049\",\n          line: this.line,\n          character: this.char,\n          data: [ char ]\n        });\n      }\n    }.bind(this);\n    if (!this.prereg || char !== \"/\") {\n      return null;\n    }\n\n    index += 1;\n    terminated = false;\n\n    while (index < length) {\n      char = this.peek(index);\n      value += char;\n      body += char;\n\n      if (isCharSet) {\n        if (char === \"]\") {\n          if (this.peek(index - 1) !== \"\\\\\" || this.peek(index - 2) === \"\\\\\") {\n            isCharSet = false;\n          }\n        }\n\n        if (char === \"\\\\\") {\n          index += 1;\n          char = this.peek(index);\n          body += char;\n          value += char;\n\n          scanUnexpectedChars();\n        }\n\n        index += 1;\n        continue;\n      }\n\n      if (char === \"\\\\\") {\n        index += 1;\n        char = this.peek(index);\n        body += char;\n        value += char;\n\n        scanUnexpectedChars();\n\n        if (char === \"/\") {\n          index += 1;\n          continue;\n        }\n\n        if (char === \"[\") {\n          index += 1;\n          continue;\n        }\n      }\n\n      if (char === \"[\") {\n        isCharSet = true;\n        index += 1;\n        continue;\n      }\n\n      if (char === \"/\") {\n        body = body.substr(0, body.length - 1);\n        terminated = true;\n        index += 1;\n        break;\n      }\n\n      index += 1;\n    }\n\n    if (!terminated) {\n      this.trigger(\"error\", {\n        code: \"E015\",\n        line: this.line,\n        character: this.from\n      });\n\n      return void this.trigger(\"fatal\", {\n        line: this.line,\n        from: this.from\n      });\n    }\n\n    while (index < length) {\n      char = this.peek(index);\n      if (!/[gim]/.test(char)) {\n        break;\n      }\n      flags.push(char);\n      value += char;\n      index += 1;\n    }\n\n    try {\n      new RegExp(body, flags.join(\"\"));\n    } catch (err) {\n      malformed = true;\n      this.trigger(\"error\", {\n        code: \"E016\",\n        line: this.line,\n        character: this.char,\n        data: [ err.message ] // Platform dependent!\n      });\n    }\n\n    return {\n      type: Token.RegExp,\n      value: value,\n      flags: flags,\n      isMalformed: malformed\n    };\n  },\n  scanNonBreakingSpaces: function () {\n    return state.option.nonbsp ?\n      this.input.search(/(\\u00A0)/) : -1;\n  },\n  scanUnsafeChars: function () {\n    return this.input.search(reg.unsafeChars);\n  },\n  next: function (checks) {\n    this.from = this.char;\n    var start;\n    if (/\\s/.test(this.peek())) {\n      start = this.char;\n\n      while (/\\s/.test(this.peek())) {\n        this.from += 1;\n        this.skip();\n      }\n    }\n\n    var match = this.scanComments() ||\n      this.scanStringLiteral(checks) ||\n      this.scanTemplateLiteral();\n\n    if (match) {\n      return match;\n    }\n\n    match =\n      this.scanRegExp() ||\n      this.scanPunctuator() ||\n      this.scanKeyword() ||\n      this.scanIdentifier() ||\n      this.scanNumericLiteral();\n\n    if (match) {\n      this.skip(match.value.length);\n      return match;\n    }\n\n    return null;\n  },\n  nextLine: function () {\n    var char;\n\n    if (this.line >= this.getLines().length) {\n      return false;\n    }\n\n    this.input = this.getLines()[this.line];\n    this.line += 1;\n    this.char = 1;\n    this.from = 1;\n\n    var inputTrimmed = this.input.trim();\n\n    var startsWith = function () {\n      return _.some(arguments, function (prefix) {\n        return inputTrimmed.indexOf(prefix) === 0;\n      });\n    };\n\n    var endsWith = function () {\n      return _.some(arguments, function (suffix) {\n        return inputTrimmed.indexOf(suffix, inputTrimmed.length - suffix.length) !== -1;\n      });\n    };\n    if (state.ignoreLinterErrors === true) {\n      if (!startsWith(\"/*\", \"//\") && !endsWith(\"*/\")) {\n        this.input = \"\";\n      }\n    }\n\n    char = this.scanNonBreakingSpaces();\n    if (char >= 0) {\n      this.trigger(\"warning\", { code: \"W125\", line: this.line, character: char + 1 });\n    }\n\n    this.input = this.input.replace(/\\t/g, state.tab);\n    char = this.scanUnsafeChars();\n\n    if (char >= 0) {\n      this.trigger(\"warning\", { code: \"W100\", line: this.line, character: char });\n    }\n\n    if (state.option.maxlen && state.option.maxlen < this.input.length) {\n      var inComment = this.inComment ||\n        startsWith.call(inputTrimmed, \"//\") ||\n        startsWith.call(inputTrimmed, \"/*\");\n\n      var shouldTriggerError = !inComment || !reg.maxlenException.test(inputTrimmed);\n\n      if (shouldTriggerError) {\n        this.trigger(\"warning\", { code: \"W101\", line: this.line, character: this.input.length });\n      }\n    }\n\n    return true;\n  },\n  start: function () {\n    this.nextLine();\n  },\n  token: function () {\n    var checks = asyncTrigger();\n    var token;\n\n\n    function isReserved(token, isProperty) {\n      if (!token.reserved) {\n        return false;\n      }\n      var meta = token.meta;\n\n      if (meta && meta.isFutureReservedWord && state.option.inES5()) {\n        if (!meta.es5) {\n          return false;\n        }\n        if (meta.strictOnly) {\n          if (!state.option.strict && !state.directive[\"use strict\"]) {\n            return false;\n          }\n        }\n\n        if (isProperty) {\n          return false;\n        }\n      }\n\n      return true;\n    }\n    var create = function (type, value, isProperty) {\n      var obj;\n\n      if (type !== \"(endline)\" && type !== \"(end)\") {\n        this.prereg = false;\n      }\n\n      if (type === \"(punctuator)\") {\n        switch (value) {\n        case \".\":\n        case \")\":\n        case \"~\":\n        case \"#\":\n        case \"]\":\n          this.prereg = false;\n          break;\n        default:\n          this.prereg = true;\n        }\n\n        obj = Object.create(state.syntax[value] || state.syntax[\"(error)\"]);\n      }\n\n      if (type === \"(identifier)\") {\n        if (value === \"return\" || value === \"case\" || value === \"typeof\") {\n          this.prereg = true;\n        }\n\n        if (_.has(state.syntax, value)) {\n          obj = Object.create(state.syntax[value] || state.syntax[\"(error)\"]);\n          if (!isReserved(obj, isProperty && type === \"(identifier)\")) {\n            obj = null;\n          }\n        }\n      }\n\n      if (!obj) {\n        obj = Object.create(state.syntax[type]);\n      }\n\n      obj.identifier = (type === \"(identifier)\");\n      obj.type = obj.type || type;\n      obj.value = value;\n      obj.line = this.line;\n      obj.character = this.char;\n      obj.from = this.from;\n\n      if (isProperty && obj.identifier) {\n        obj.isProperty = isProperty;\n      }\n\n      obj.check = checks.check;\n\n      return obj;\n    }.bind(this);\n\n    for (;;) {\n      if (!this.input.length) {\n        return create(this.nextLine() ? \"(endline)\" : \"(end)\", \"\");\n      }\n\n      token = this.next(checks);\n\n      if (!token) {\n        if (this.input.length) {\n          this.trigger(\"error\", {\n            code: \"E024\",\n            line: this.line,\n            character: this.char,\n            data: [ this.peek() ]\n          });\n\n          this.input = \"\";\n        }\n\n        continue;\n      }\n\n      switch (token.type) {\n      case Token.StringLiteral:\n        this.triggerAsync(\"String\", {\n          line: this.line,\n          char: this.char,\n          from: this.from,\n          value: token.value,\n          quote: token.quote\n        }, checks, function () { return true; });\n\n        return create(\"(string)\", token.value);\n\n      case Token.TemplateLiteral:\n        this.trigger(\"Template\", {\n          line: this.line,\n          char: this.char,\n          from: this.from,\n          value: token.value\n        });\n        return create(\"(template)\", token.value);\n\n      case Token.Identifier:\n        this.trigger(\"Identifier\", {\n          line: this.line,\n          char: this.char,\n          from: this.form,\n          name: token.value,\n          isProperty: state.tokens.curr.id === \".\"\n        });\n      case Token.Keyword:\n      case Token.NullLiteral:\n      case Token.BooleanLiteral:\n        return create(\"(identifier)\", token.value, state.tokens.curr.id === \".\");\n\n      case Token.NumericLiteral:\n        if (token.isMalformed) {\n          this.trigger(\"warning\", {\n            code: \"W045\",\n            line: this.line,\n            character: this.char,\n            data: [ token.value ]\n          });\n        }\n\n        this.triggerAsync(\"warning\", {\n          code: \"W114\",\n          line: this.line,\n          character: this.char,\n          data: [ \"0x-\" ]\n        }, checks, function () { return token.base === 16 && state.jsonMode; });\n\n        this.triggerAsync(\"warning\", {\n          code: \"W115\",\n          line: this.line,\n          character: this.char\n        }, checks, function () {\n          return state.directive[\"use strict\"] && token.base === 8;\n        });\n\n        this.trigger(\"Number\", {\n          line: this.line,\n          char: this.char,\n          from: this.from,\n          value: token.value,\n          base: token.base,\n          isMalformed: token.malformed\n        });\n\n        return create(\"(number)\", token.value);\n\n      case Token.RegExp:\n        return create(\"(regexp)\", token.value);\n\n      case Token.Comment:\n        state.tokens.curr.comment = true;\n\n        if (token.isSpecial) {\n          return {\n            id: '(comment)',\n            value: token.value,\n            body: token.body,\n            type: token.commentType,\n            isSpecial: token.isSpecial,\n            line: this.line,\n            character: this.char,\n            from: this.from\n          };\n        }\n\n        break;\n\n      case \"\":\n        break;\n\n      default:\n        return create(\"(punctuator)\", token.value);\n      }\n    }\n  }\n};\n\nexports.Lexer = Lexer;\n\n},\n{\"../data/ascii-identifier-data.js\":1,\"./reg.js\":6,\"./state.js\":7,\"events\":10,\"underscore\":2}],\n5:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar _ = _dereq_(\"underscore\");\n\nvar errors = {\n  E001: \"Bad option: '{a}'.\",\n  E002: \"Bad option value.\",\n  E003: \"Expected a JSON value.\",\n  E004: \"Input is neither a string nor an array of strings.\",\n  E005: \"Input is empty.\",\n  E006: \"Unexpected early end of program.\",\n  E007: \"Missing \\\"use strict\\\" statement.\",\n  E008: \"Strict violation.\",\n  E009: \"Option 'validthis' can't be used in a global scope.\",\n  E010: \"'with' is not allowed in strict mode.\",\n  E011: \"const '{a}' has already been declared.\",\n  E012: \"const '{a}' is initialized to 'undefined'.\",\n  E013: \"Attempting to override '{a}' which is a constant.\",\n  E014: \"A regular expression literal can be confused with '/='.\",\n  E015: \"Unclosed regular expression.\",\n  E016: \"Invalid regular expression.\",\n  E017: \"Unclosed comment.\",\n  E018: \"Unbegun comment.\",\n  E019: \"Unmatched '{a}'.\",\n  E020: \"Expected '{a}' to match '{b}' from line {c} and instead saw '{d}'.\",\n  E021: \"Expected '{a}' and instead saw '{b}'.\",\n  E022: \"Line breaking error '{a}'.\",\n  E023: \"Missing '{a}'.\",\n  E024: \"Unexpected '{a}'.\",\n  E025: \"Missing ':' on a case clause.\",\n  E026: \"Missing '}' to match '{' from line {a}.\",\n  E027: \"Missing ']' to match '[' from line {a}.\",\n  E028: \"Illegal comma.\",\n  E029: \"Unclosed string.\",\n  E030: \"Expected an identifier and instead saw '{a}'.\",\n  E031: \"Bad assignment.\", // FIXME: Rephrase\n  E032: \"Expected a small integer or 'false' and instead saw '{a}'.\",\n  E033: \"Expected an operator and instead saw '{a}'.\",\n  E034: \"get/set are ES5 features.\",\n  E035: \"Missing property name.\",\n  E036: \"Expected to see a statement and instead saw a block.\",\n  E037: null,\n  E038: null,\n  E039: \"Function declarations are not invocable. Wrap the whole function invocation in parens.\",\n  E040: \"Each value should have its own case label.\",\n  E041: \"Unrecoverable syntax error.\",\n  E042: \"Stopping.\",\n  E043: \"Too many errors.\",\n  E044: null,\n  E045: \"Invalid for each loop.\",\n  E046: \"A yield statement shall be within a generator function (with syntax: `function*`)\",\n  E047: null, // Vacant\n  E048: \"Let declaration not directly within block.\",\n  E049: \"A {a} cannot be named '{b}'.\",\n  E050: \"Mozilla requires the yield expression to be parenthesized here.\",\n  E051: \"Regular parameters cannot come after default parameters.\",\n  E052: \"Unclosed template literal.\"\n};\n\nvar warnings = {\n  W001: \"'hasOwnProperty' is a really bad name.\",\n  W002: \"Value of '{a}' may be overwritten in IE 8 and earlier.\",\n  W003: \"'{a}' was used before it was defined.\",\n  W004: \"'{a}' is already defined.\",\n  W005: \"A dot following a number can be confused with a decimal point.\",\n  W006: \"Confusing minuses.\",\n  W007: \"Confusing plusses.\",\n  W008: \"A leading decimal point can be confused with a dot: '{a}'.\",\n  W009: \"The array literal notation [] is preferable.\",\n  W010: \"The object literal notation {} is preferable.\",\n  W011: null,\n  W012: null,\n  W013: null,\n  W014: \"Bad line breaking before '{a}'.\",\n  W015: null,\n  W016: \"Unexpected use of '{a}'.\",\n  W017: \"Bad operand.\",\n  W018: \"Confusing use of '{a}'.\",\n  W019: \"Use the isNaN function to compare with NaN.\",\n  W020: \"Read only.\",\n  W021: \"'{a}' is a function.\",\n  W022: \"Do not assign to the exception parameter.\",\n  W023: \"Expected an identifier in an assignment and instead saw a function invocation.\",\n  W024: \"Expected an identifier and instead saw '{a}' (a reserved word).\",\n  W025: \"Missing name in function declaration.\",\n  W026: \"Inner functions should be listed at the top of the outer function.\",\n  W027: \"Unreachable '{a}' after '{b}'.\",\n  W028: \"Label '{a}' on {b} statement.\",\n  W030: \"Expected an assignment or function call and instead saw an expression.\",\n  W031: \"Do not use 'new' for side effects.\",\n  W032: \"Unnecessary semicolon.\",\n  W033: \"Missing semicolon.\",\n  W034: \"Unnecessary directive \\\"{a}\\\".\",\n  W035: \"Empty block.\",\n  W036: \"Unexpected /*member '{a}'.\",\n  W037: \"'{a}' is a statement label.\",\n  W038: \"'{a}' used out of scope.\",\n  W039: \"'{a}' is not allowed.\",\n  W040: \"Possible strict violation.\",\n  W041: \"Use '{a}' to compare with '{b}'.\",\n  W042: \"Avoid EOL escaping.\",\n  W043: \"Bad escaping of EOL. Use option multistr if needed.\",\n  W044: \"Bad or unnecessary escaping.\",\n  W045: \"Bad number '{a}'.\",\n  W046: \"Don't use extra leading zeros '{a}'.\",\n  W047: \"A trailing decimal point can be confused with a dot: '{a}'.\",\n  W048: \"Unexpected control character in regular expression.\",\n  W049: \"Unexpected escaped character '{a}' in regular expression.\",\n  W050: \"JavaScript URL.\",\n  W051: \"Variables should not be deleted.\",\n  W052: \"Unexpected '{a}'.\",\n  W053: \"Do not use {a} as a constructor.\",\n  W054: \"The Function constructor is a form of eval.\",\n  W055: \"A constructor name should start with an uppercase letter.\",\n  W056: \"Bad constructor.\",\n  W057: \"Weird construction. Is 'new' necessary?\",\n  W058: \"Missing '()' invoking a constructor.\",\n  W059: \"Avoid arguments.{a}.\",\n  W060: \"document.write can be a form of eval.\",\n  W061: \"eval can be harmful.\",\n  W062: \"Wrap an immediate function invocation in parens \" +\n    \"to assist the reader in understanding that the expression \" +\n    \"is the result of a function, and not the function itself.\",\n  W063: \"Math is not a function.\",\n  W064: \"Missing 'new' prefix when invoking a constructor.\",\n  W065: \"Missing radix parameter.\",\n  W066: \"Implied eval. Consider passing a function instead of a string.\",\n  W067: \"Bad invocation.\",\n  W068: \"Wrapping non-IIFE function literals in parens is unnecessary.\",\n  W069: \"['{a}'] is better written in dot notation.\",\n  W070: \"Extra comma. (it breaks older versions of IE)\",\n  W071: \"This function has too many statements. ({a})\",\n  W072: \"This function has too many parameters. ({a})\",\n  W073: \"Blocks are nested too deeply. ({a})\",\n  W074: \"This function's cyclomatic complexity is too high. ({a})\",\n  W075: \"Duplicate key '{a}'.\",\n  W076: \"Unexpected parameter '{a}' in get {b} function.\",\n  W077: \"Expected a single parameter in set {a} function.\",\n  W078: \"Setter is defined without getter.\",\n  W079: \"Redefinition of '{a}'.\",\n  W080: \"It's not necessary to initialize '{a}' to 'undefined'.\",\n  W081: null,\n  W082: \"Function declarations should not be placed in blocks. \" +\n    \"Use a function expression or move the statement to the top of \" +\n    \"the outer function.\",\n  W083: \"Don't make functions within a loop.\",\n  W084: \"Assignment in conditional expression\",\n  W085: \"Don't use 'with'.\",\n  W086: \"Expected a 'break' statement before '{a}'.\",\n  W087: \"Forgotten 'debugger' statement?\",\n  W088: \"Creating global 'for' variable. Should be 'for (var {a} ...'.\",\n  W089: \"The body of a for in should be wrapped in an if statement to filter \" +\n    \"unwanted properties from the prototype.\",\n  W090: \"'{a}' is not a statement label.\",\n  W091: \"'{a}' is out of scope.\",\n  W093: \"Did you mean to return a conditional instead of an assignment?\",\n  W094: \"Unexpected comma.\",\n  W095: \"Expected a string and instead saw {a}.\",\n  W096: \"The '{a}' key may produce unexpected results.\",\n  W097: \"Use the function form of \\\"use strict\\\".\",\n  W098: \"'{a}' is defined but never used.\",\n  W099: null,\n  W100: \"This character may get silently deleted by one or more browsers.\",\n  W101: \"Line is too long.\",\n  W102: null,\n  W103: \"The '{a}' property is deprecated.\",\n  W104: \"'{a}' is available in ES6 (use esnext option) or Mozilla JS extensions (use moz).\",\n  W105: \"Unexpected {a} in '{b}'.\",\n  W106: \"Identifier '{a}' is not in camel case.\",\n  W107: \"Script URL.\",\n  W108: \"Strings must use doublequote.\",\n  W109: \"Strings must use singlequote.\",\n  W110: \"Mixed double and single quotes.\",\n  W112: \"Unclosed string.\",\n  W113: \"Control character in string: {a}.\",\n  W114: \"Avoid {a}.\",\n  W115: \"Octal literals are not allowed in strict mode.\",\n  W116: \"Expected '{a}' and instead saw '{b}'.\",\n  W117: \"'{a}' is not defined.\",\n  W118: \"'{a}' is only available in Mozilla JavaScript extensions (use moz option).\",\n  W119: \"'{a}' is only available in ES6 (use esnext option).\",\n  W120: \"You might be leaking a variable ({a}) here.\",\n  W121: \"Extending prototype of native object: '{a}'.\",\n  W122: \"Invalid typeof value '{a}'\",\n  W123: \"'{a}' is already defined in outer scope.\",\n  W124: \"A generator function shall contain a yield statement.\",\n  W125: \"This line contains non-breaking spaces: http://jshint.com/doc/options/#nonbsp\"\n};\n\nvar info = {\n  I001: \"Comma warnings can be turned off with 'laxcomma'.\",\n  I002: null,\n  I003: \"ES5 option is now set per default\"\n};\n\nexports.errors = {};\nexports.warnings = {};\nexports.info = {};\n\n_.each(errors, function (desc, code) {\n  exports.errors[code] = { code: code, desc: desc };\n});\n\n_.each(warnings, function (desc, code) {\n  exports.warnings[code] = { code: code, desc: desc };\n});\n\n_.each(info, function (desc, code) {\n  exports.info[code] = { code: code, desc: desc };\n});\n\n},\n{\"underscore\":2}],\n6:[function(_dereq_,module,exports){\n\n\"use string\";\nexports.unsafeString =\n  /@cc|<\\/?|script|\\]\\s*\\]|<\\s*!|&lt/i;\nexports.unsafeChars =\n  /[\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/;\nexports.needEsc =\n  /[\\u0000-\\u001f&<\"\\/\\\\\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/;\n\nexports.needEscGlobal =\n  /[\\u0000-\\u001f&<\"\\/\\\\\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g;\nexports.starSlash = /\\*\\//;\nexports.identifier = /^([a-zA-Z_$][a-zA-Z0-9_$]*)$/;\nexports.javascriptURL = /^(?:javascript|jscript|ecmascript|vbscript|livescript)\\s*:/i;\nexports.fallsThrough = /^\\s*\\/\\*\\s*falls?\\sthrough\\s*\\*\\/\\s*$/;\nexports.maxlenException = /^(?:(?:\\/\\/|\\/\\*|\\*) ?)?[^ ]+$/;\n\n},\n{}],\n7:[function(_dereq_,module,exports){\n\"use strict\";\n\nvar state = {\n  syntax: {},\n\n  reset: function () {\n    this.tokens = {\n      prev: null,\n      next: null,\n      curr: null\n    };\n\n    this.option = {};\n    this.ignored = {};\n    this.directive = {};\n    this.jsonMode = false;\n    this.jsonWarnings = [];\n    this.lines = [];\n    this.tab = \"\";\n    this.cache = {}; // Node.JS doesn't have Map. Sniff.\n    this.ignoredLines = {};\n    this.ignoreLinterErrors = false;\n  }\n};\n\nexports.state = state;\n\n},\n{}],\n8:[function(_dereq_,module,exports){\n\"use strict\";\n\nexports.register = function (linter) {\n\n  linter.on(\"Identifier\", function style_scanProto(data) {\n    if (linter.getOption(\"proto\")) {\n      return;\n    }\n\n    if (data.name === \"__proto__\") {\n      linter.warn(\"W103\", {\n        line: data.line,\n        char: data.char,\n        data: [ data.name ]\n      });\n    }\n  });\n\n  linter.on(\"Identifier\", function style_scanIterator(data) {\n    if (linter.getOption(\"iterator\")) {\n      return;\n    }\n\n    if (data.name === \"__iterator__\") {\n      linter.warn(\"W104\", {\n        line: data.line,\n        char: data.char,\n        data: [ data.name ]\n      });\n    }\n  });\n\n  linter.on(\"Identifier\", function style_scanCamelCase(data) {\n    if (!linter.getOption(\"camelcase\")) {\n      return;\n    }\n\n    if (data.name.replace(/^_+|_+$/g, \"\").indexOf(\"_\") > -1 && !data.name.match(/^[A-Z0-9_]*$/)) {\n      linter.warn(\"W106\", {\n        line: data.line,\n        char: data.from,\n        data: [ data.name ]\n      });\n    }\n  });\n\n  linter.on(\"String\", function style_scanQuotes(data) {\n    var quotmark = linter.getOption(\"quotmark\");\n    var code;\n\n    if (!quotmark) {\n      return;\n    }\n\n    if (quotmark === \"single\" && data.quote !== \"'\") {\n      code = \"W109\";\n    }\n\n    if (quotmark === \"double\" && data.quote !== \"\\\"\") {\n      code = \"W108\";\n    }\n\n    if (quotmark === true) {\n      if (!linter.getCache(\"quotmark\")) {\n        linter.setCache(\"quotmark\", data.quote);\n      }\n\n      if (linter.getCache(\"quotmark\") !== data.quote) {\n        code = \"W110\";\n      }\n    }\n\n    if (code) {\n      linter.warn(code, {\n        line: data.line,\n        char: data.char,\n      });\n    }\n  });\n\n  linter.on(\"Number\", function style_scanNumbers(data) {\n    if (data.value.charAt(0) === \".\") {\n      linter.warn(\"W008\", {\n        line: data.line,\n        char: data.char,\n        data: [ data.value ]\n      });\n    }\n\n    if (data.value.substr(data.value.length - 1) === \".\") {\n      linter.warn(\"W047\", {\n        line: data.line,\n        char: data.char,\n        data: [ data.value ]\n      });\n    }\n\n    if (/^00+/.test(data.value)) {\n      linter.warn(\"W046\", {\n        line: data.line,\n        char: data.char,\n        data: [ data.value ]\n      });\n    }\n  });\n\n  linter.on(\"String\", function style_scanJavaScriptURLs(data) {\n    var re = /^(?:javascript|jscript|ecmascript|vbscript|livescript)\\s*:/i;\n\n    if (linter.getOption(\"scripturl\")) {\n      return;\n    }\n\n    if (re.test(data.value)) {\n      linter.warn(\"W107\", {\n        line: data.line,\n        char: data.char\n      });\n    }\n  });\n};\n\n},\n{}],\n9:[function(_dereq_,module,exports){\n\n\"use strict\";\n\nexports.reservedVars = {\n  arguments : false,\n  NaN       : false\n};\n\nexports.ecmaIdentifiers = {\n  Array              : false,\n  Boolean            : false,\n  Date               : false,\n  decodeURI          : false,\n  decodeURIComponent : false,\n  encodeURI          : false,\n  encodeURIComponent : false,\n  Error              : false,\n  \"eval\"             : false,\n  EvalError          : false,\n  Function           : false,\n  hasOwnProperty     : false,\n  isFinite           : false,\n  isNaN              : false,\n  JSON               : false,\n  Math               : false,\n  Number             : false,\n  Object             : false,\n  parseInt           : false,\n  parseFloat         : false,\n  RangeError         : false,\n  ReferenceError     : false,\n  RegExp             : false,\n  String             : false,\n  SyntaxError        : false,\n  TypeError          : false,\n  URIError           : false,\n};\n\nexports.newEcmaIdentifiers = {\n  Set     : false,\n  Map     : false,\n  WeakMap : false,\n  WeakSet : false,\n  Proxy   : false,\n  Promise : false\n};\n\nexports.browser = {\n  Audio                : false,\n  Blob                 : false,\n  addEventListener     : false,\n  applicationCache     : false,\n  atob                 : false,\n  blur                 : false,\n  btoa                 : false,\n  CanvasGradient       : false,\n  CanvasPattern        : false,\n  CanvasRenderingContext2D: false,\n  clearInterval        : false,\n  clearTimeout         : false,\n  close                : false,\n  closed               : false,\n  CustomEvent          : false,\n  DOMParser            : false,\n  defaultStatus        : false,\n  document             : false,\n  Element              : false,\n  ElementTimeControl   : false,\n  event                : false,\n  FileReader           : false,\n  FormData             : false,\n  focus                : false,\n  frames               : false,\n  getComputedStyle     : false,\n  HTMLElement          : false,\n  HTMLAnchorElement    : false,\n  HTMLBaseElement      : false,\n  HTMLBlockquoteElement: false,\n  HTMLBodyElement      : false,\n  HTMLBRElement        : false,\n  HTMLButtonElement    : false,\n  HTMLCanvasElement    : false,\n  HTMLDirectoryElement : false,\n  HTMLDivElement       : false,\n  HTMLDListElement     : false,\n  HTMLFieldSetElement  : false,\n  HTMLFontElement      : false,\n  HTMLFormElement      : false,\n  HTMLFrameElement     : false,\n  HTMLFrameSetElement  : false,\n  HTMLHeadElement      : false,\n  HTMLHeadingElement   : false,\n  HTMLHRElement        : false,\n  HTMLHtmlElement      : false,\n  HTMLIFrameElement    : false,\n  HTMLImageElement     : false,\n  HTMLInputElement     : false,\n  HTMLIsIndexElement   : false,\n  HTMLLabelElement     : false,\n  HTMLLayerElement     : false,\n  HTMLLegendElement    : false,\n  HTMLLIElement        : false,\n  HTMLLinkElement      : false,\n  HTMLMapElement       : false,\n  HTMLMenuElement      : false,\n  HTMLMetaElement      : false,\n  HTMLModElement       : false,\n  HTMLObjectElement    : false,\n  HTMLOListElement     : false,\n  HTMLOptGroupElement  : false,\n  HTMLOptionElement    : false,\n  HTMLParagraphElement : false,\n  HTMLParamElement     : false,\n  HTMLPreElement       : false,\n  HTMLQuoteElement     : false,\n  HTMLScriptElement    : false,\n  HTMLSelectElement    : false,\n  HTMLStyleElement     : false,\n  HTMLTableCaptionElement: false,\n  HTMLTableCellElement : false,\n  HTMLTableColElement  : false,\n  HTMLTableElement     : false,\n  HTMLTableRowElement  : false,\n  HTMLTableSectionElement: false,\n  HTMLTextAreaElement  : false,\n  HTMLTitleElement     : false,\n  HTMLUListElement     : false,\n  HTMLVideoElement     : false,\n  history              : false,\n  Image                : false,\n  length               : false,\n  localStorage         : false,\n  location             : false,\n  matchMedia           : false,\n  MessageChannel       : false,\n  MessageEvent         : false,\n  MessagePort          : false,\n  MouseEvent           : false,\n  moveBy               : false,\n  moveTo               : false,\n  MutationObserver     : false,\n  name                 : false,\n  Node                 : false,\n  NodeFilter           : false,\n  NodeList             : false,\n  navigator            : false,\n  onbeforeunload       : true,\n  onblur               : true,\n  onerror              : true,\n  onfocus              : true,\n  onload               : true,\n  onresize             : true,\n  onunload             : true,\n  open                 : false,\n  openDatabase         : false,\n  opener               : false,\n  Option               : false,\n  parent               : false,\n  print                : false,\n  removeEventListener  : false,\n  resizeBy             : false,\n  resizeTo             : false,\n  screen               : false,\n  scroll               : false,\n  scrollBy             : false,\n  scrollTo             : false,\n  sessionStorage       : false,\n  setInterval          : false,\n  setTimeout           : false,\n  SharedWorker         : false,\n  status               : false,\n  SVGAElement          : false,\n  SVGAltGlyphDefElement: false,\n  SVGAltGlyphElement   : false,\n  SVGAltGlyphItemElement: false,\n  SVGAngle             : false,\n  SVGAnimateColorElement: false,\n  SVGAnimateElement    : false,\n  SVGAnimateMotionElement: false,\n  SVGAnimateTransformElement: false,\n  SVGAnimatedAngle     : false,\n  SVGAnimatedBoolean   : false,\n  SVGAnimatedEnumeration: false,\n  SVGAnimatedInteger   : false,\n  SVGAnimatedLength    : false,\n  SVGAnimatedLengthList: false,\n  SVGAnimatedNumber    : false,\n  SVGAnimatedNumberList: false,\n  SVGAnimatedPathData  : false,\n  SVGAnimatedPoints    : false,\n  SVGAnimatedPreserveAspectRatio: false,\n  SVGAnimatedRect      : false,\n  SVGAnimatedString    : false,\n  SVGAnimatedTransformList: false,\n  SVGAnimationElement  : false,\n  SVGCSSRule           : false,\n  SVGCircleElement     : false,\n  SVGClipPathElement   : false,\n  SVGColor             : false,\n  SVGColorProfileElement: false,\n  SVGColorProfileRule  : false,\n  SVGComponentTransferFunctionElement: false,\n  SVGCursorElement     : false,\n  SVGDefsElement       : false,\n  SVGDescElement       : false,\n  SVGDocument          : false,\n  SVGElement           : false,\n  SVGElementInstance   : false,\n  SVGElementInstanceList: false,\n  SVGEllipseElement    : false,\n  SVGExternalResourcesRequired: false,\n  SVGFEBlendElement    : false,\n  SVGFEColorMatrixElement: false,\n  SVGFEComponentTransferElement: false,\n  SVGFECompositeElement: false,\n  SVGFEConvolveMatrixElement: false,\n  SVGFEDiffuseLightingElement: false,\n  SVGFEDisplacementMapElement: false,\n  SVGFEDistantLightElement: false,\n  SVGFEFloodElement    : false,\n  SVGFEFuncAElement    : false,\n  SVGFEFuncBElement    : false,\n  SVGFEFuncGElement    : false,\n  SVGFEFuncRElement    : false,\n  SVGFEGaussianBlurElement: false,\n  SVGFEImageElement    : false,\n  SVGFEMergeElement    : false,\n  SVGFEMergeNodeElement: false,\n  SVGFEMorphologyElement: false,\n  SVGFEOffsetElement   : false,\n  SVGFEPointLightElement: false,\n  SVGFESpecularLightingElement: false,\n  SVGFESpotLightElement: false,\n  SVGFETileElement     : false,\n  SVGFETurbulenceElement: false,\n  SVGFilterElement     : false,\n  SVGFilterPrimitiveStandardAttributes: false,\n  SVGFitToViewBox      : false,\n  SVGFontElement       : false,\n  SVGFontFaceElement   : false,\n  SVGFontFaceFormatElement: false,\n  SVGFontFaceNameElement: false,\n  SVGFontFaceSrcElement: false,\n  SVGFontFaceUriElement: false,\n  SVGForeignObjectElement: false,\n  SVGGElement          : false,\n  SVGGlyphElement      : false,\n  SVGGlyphRefElement   : false,\n  SVGGradientElement   : false,\n  SVGHKernElement      : false,\n  SVGICCColor          : false,\n  SVGImageElement      : false,\n  SVGLangSpace         : false,\n  SVGLength            : false,\n  SVGLengthList        : false,\n  SVGLineElement       : false,\n  SVGLinearGradientElement: false,\n  SVGLocatable         : false,\n  SVGMPathElement      : false,\n  SVGMarkerElement     : false,\n  SVGMaskElement       : false,\n  SVGMatrix            : false,\n  SVGMetadataElement   : false,\n  SVGMissingGlyphElement: false,\n  SVGNumber            : false,\n  SVGNumberList        : false,\n  SVGPaint             : false,\n  SVGPathElement       : false,\n  SVGPathSeg           : false,\n  SVGPathSegArcAbs     : false,\n  SVGPathSegArcRel     : false,\n  SVGPathSegClosePath  : false,\n  SVGPathSegCurvetoCubicAbs: false,\n  SVGPathSegCurvetoCubicRel: false,\n  SVGPathSegCurvetoCubicSmoothAbs: false,\n  SVGPathSegCurvetoCubicSmoothRel: false,\n  SVGPathSegCurvetoQuadraticAbs: false,\n  SVGPathSegCurvetoQuadraticRel: false,\n  SVGPathSegCurvetoQuadraticSmoothAbs: false,\n  SVGPathSegCurvetoQuadraticSmoothRel: false,\n  SVGPathSegLinetoAbs  : false,\n  SVGPathSegLinetoHorizontalAbs: false,\n  SVGPathSegLinetoHorizontalRel: false,\n  SVGPathSegLinetoRel  : false,\n  SVGPathSegLinetoVerticalAbs: false,\n  SVGPathSegLinetoVerticalRel: false,\n  SVGPathSegList       : false,\n  SVGPathSegMovetoAbs  : false,\n  SVGPathSegMovetoRel  : false,\n  SVGPatternElement    : false,\n  SVGPoint             : false,\n  SVGPointList         : false,\n  SVGPolygonElement    : false,\n  SVGPolylineElement   : false,\n  SVGPreserveAspectRatio: false,\n  SVGRadialGradientElement: false,\n  SVGRect              : false,\n  SVGRectElement       : false,\n  SVGRenderingIntent   : false,\n  SVGSVGElement        : false,\n  SVGScriptElement     : false,\n  SVGSetElement        : false,\n  SVGStopElement       : false,\n  SVGStringList        : false,\n  SVGStylable          : false,\n  SVGStyleElement      : false,\n  SVGSwitchElement     : false,\n  SVGSymbolElement     : false,\n  SVGTRefElement       : false,\n  SVGTSpanElement      : false,\n  SVGTests             : false,\n  SVGTextContentElement: false,\n  SVGTextElement       : false,\n  SVGTextPathElement   : false,\n  SVGTextPositioningElement: false,\n  SVGTitleElement      : false,\n  SVGTransform         : false,\n  SVGTransformList     : false,\n  SVGTransformable     : false,\n  SVGURIReference      : false,\n  SVGUnitTypes         : false,\n  SVGUseElement        : false,\n  SVGVKernElement      : false,\n  SVGViewElement       : false,\n  SVGViewSpec          : false,\n  SVGZoomAndPan        : false,\n  TimeEvent            : false,\n  top                  : false,\n  URL                  : false,\n  WebSocket            : false,\n  window               : false,\n  Worker               : false,\n  XMLHttpRequest       : false,\n  XMLSerializer        : false,\n  XPathEvaluator       : false,\n  XPathException       : false,\n  XPathExpression      : false,\n  XPathNamespace       : false,\n  XPathNSResolver      : false,\n  XPathResult          : false\n};\n\nexports.devel = {\n  alert  : false,\n  confirm: false,\n  console: false,\n  Debug  : false,\n  opera  : false,\n  prompt : false\n};\n\nexports.worker = {\n  importScripts: true,\n  postMessage  : true,\n  self         : true\n};\nexports.nonstandard = {\n  escape  : false,\n  unescape: false\n};\n\nexports.couch = {\n  \"require\" : false,\n  respond   : false,\n  getRow    : false,\n  emit      : false,\n  send      : false,\n  start     : false,\n  sum       : false,\n  log       : false,\n  exports   : false,\n  module    : false,\n  provides  : false\n};\n\nexports.node = {\n  __filename    : false,\n  __dirname     : false,\n  GLOBAL        : false,\n  global        : false,\n  module        : false,\n  require       : false,\n\n  Buffer        : true,\n  console       : true,\n  exports       : true,\n  process       : true,\n  setTimeout    : true,\n  clearTimeout  : true,\n  setInterval   : true,\n  clearInterval : true,\n  setImmediate  : true, // v0.9.1+\n  clearImmediate: true  // v0.9.1+\n};\n\nexports.phantom = {\n  phantom      : true,\n  require      : true,\n  WebPage      : true,\n  console      : true, // in examples, but undocumented\n  exports      : true  // v1.7+\n};\n\nexports.qunit = {\n  asyncTest      : false,\n  deepEqual      : false,\n  equal          : false,\n  expect         : false,\n  module         : false,\n  notDeepEqual   : false,\n  notEqual       : false,\n  notPropEqual   : false,\n  notStrictEqual : false,\n  ok             : false,\n  propEqual      : false,\n  QUnit          : false,\n  raises         : false,\n  start          : false,\n  stop           : false,\n  strictEqual    : false,\n  test           : false,\n  \"throws\"       : false\n};\n\nexports.rhino = {\n  defineClass  : false,\n  deserialize  : false,\n  gc           : false,\n  help         : false,\n  importClass  : false,\n  importPackage: false,\n  \"java\"       : false,\n  load         : false,\n  loadClass    : false,\n  Packages     : false,\n  print        : false,\n  quit         : false,\n  readFile     : false,\n  readUrl      : false,\n  runCommand   : false,\n  seal         : false,\n  serialize    : false,\n  spawn        : false,\n  sync         : false,\n  toint32      : false,\n  version      : false\n};\n\nexports.shelljs = {\n  target       : false,\n  echo         : false,\n  exit         : false,\n  cd           : false,\n  pwd          : false,\n  ls           : false,\n  find         : false,\n  cp           : false,\n  rm           : false,\n  mv           : false,\n  mkdir        : false,\n  test         : false,\n  cat          : false,\n  sed          : false,\n  grep         : false,\n  which        : false,\n  dirs         : false,\n  pushd        : false,\n  popd         : false,\n  env          : false,\n  exec         : false,\n  chmod        : false,\n  config       : false,\n  error        : false,\n  tempdir      : false\n};\n\nexports.typed = {\n  ArrayBuffer         : false,\n  ArrayBufferView     : false,\n  DataView            : false,\n  Float32Array        : false,\n  Float64Array        : false,\n  Int16Array          : false,\n  Int32Array          : false,\n  Int8Array           : false,\n  Uint16Array         : false,\n  Uint32Array         : false,\n  Uint8Array          : false,\n  Uint8ClampedArray   : false\n};\n\nexports.wsh = {\n  ActiveXObject            : true,\n  Enumerator               : true,\n  GetObject                : true,\n  ScriptEngine             : true,\n  ScriptEngineBuildVersion : true,\n  ScriptEngineMajorVersion : true,\n  ScriptEngineMinorVersion : true,\n  VBArray                  : true,\n  WSH                      : true,\n  WScript                  : true,\n  XDomainRequest           : true\n};\n\nexports.dojo = {\n  dojo     : false,\n  dijit    : false,\n  dojox    : false,\n  define   : false,\n  \"require\": false\n};\n\nexports.jquery = {\n  \"$\"    : false,\n  jQuery : false\n};\n\nexports.mootools = {\n  \"$\"           : false,\n  \"$$\"          : false,\n  Asset         : false,\n  Browser       : false,\n  Chain         : false,\n  Class         : false,\n  Color         : false,\n  Cookie        : false,\n  Core          : false,\n  Document      : false,\n  DomReady      : false,\n  DOMEvent      : false,\n  DOMReady      : false,\n  Drag          : false,\n  Element       : false,\n  Elements      : false,\n  Event         : false,\n  Events        : false,\n  Fx            : false,\n  Group         : false,\n  Hash          : false,\n  HtmlTable     : false,\n  IFrame        : false,\n  IframeShim    : false,\n  InputValidator: false,\n  instanceOf    : false,\n  Keyboard      : false,\n  Locale        : false,\n  Mask          : false,\n  MooTools      : false,\n  Native        : false,\n  Options       : false,\n  OverText      : false,\n  Request       : false,\n  Scroller      : false,\n  Slick         : false,\n  Slider        : false,\n  Sortables     : false,\n  Spinner       : false,\n  Swiff         : false,\n  Tips          : false,\n  Type          : false,\n  typeOf        : false,\n  URI           : false,\n  Window        : false\n};\n\nexports.prototypejs = {\n  \"$\"               : false,\n  \"$$\"              : false,\n  \"$A\"              : false,\n  \"$F\"              : false,\n  \"$H\"              : false,\n  \"$R\"              : false,\n  \"$break\"          : false,\n  \"$continue\"       : false,\n  \"$w\"              : false,\n  Abstract          : false,\n  Ajax              : false,\n  Class             : false,\n  Enumerable        : false,\n  Element           : false,\n  Event             : false,\n  Field             : false,\n  Form              : false,\n  Hash              : false,\n  Insertion         : false,\n  ObjectRange       : false,\n  PeriodicalExecuter: false,\n  Position          : false,\n  Prototype         : false,\n  Selector          : false,\n  Template          : false,\n  Toggle            : false,\n  Try               : false,\n  Autocompleter     : false,\n  Builder           : false,\n  Control           : false,\n  Draggable         : false,\n  Draggables        : false,\n  Droppables        : false,\n  Effect            : false,\n  Sortable          : false,\n  SortableObserver  : false,\n  Sound             : false,\n  Scriptaculous     : false\n};\n\nexports.yui = {\n  YUI       : false,\n  Y         : false,\n  YUI_config: false\n};\n\nexports.mocha = {\n  describe    : false,\n  it          : false,\n  before      : false,\n  after       : false,\n  beforeEach  : false,\n  afterEach   : false,\n  suite       : false,\n  test        : false,\n  setup       : false,\n  teardown    : false\n};\n\nexports.jasmine = {\n  jasmine     : false,\n  describe    : false,\n  it          : false,\n  xit         : false,\n  beforeEach  : false,\n  afterEach   : false,\n  setFixtures : false,\n  loadFixtures: false,\n  spyOn       : false,\n  expect      : false,\n  runs        : false,\n  waitsFor    : false,\n  waits       : false\n};\n\n},\n{}],\n10:[function(_dereq_,module,exports){\n\nfunction EventEmitter() {\n  this._events = this._events || {};\n  this._maxListeners = this._maxListeners || undefined;\n}\nmodule.exports = EventEmitter;\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._maxListeners = undefined;\nEventEmitter.defaultMaxListeners = 10;\nEventEmitter.prototype.setMaxListeners = function(n) {\n  if (!isNumber(n) || n < 0 || isNaN(n))\n    throw TypeError('n must be a positive number');\n  this._maxListeners = n;\n  return this;\n};\n\nEventEmitter.prototype.emit = function(type) {\n  var er, handler, len, args, i, listeners;\n\n  if (!this._events)\n    this._events = {};\n  if (type === 'error') {\n    if (!this._events.error ||\n        (isObject(this._events.error) && !this._events.error.length)) {\n      er = arguments[1];\n      if (er instanceof Error) {\n        throw er; // Unhandled 'error' event\n      } else {\n        throw TypeError('Uncaught, unspecified \"error\" event.');\n      }\n      return false;\n    }\n  }\n\n  handler = this._events[type];\n\n  if (isUndefined(handler))\n    return false;\n\n  if (isFunction(handler)) {\n    switch (arguments.length) {\n      case 1:\n        handler.call(this);\n        break;\n      case 2:\n        handler.call(this, arguments[1]);\n        break;\n      case 3:\n        handler.call(this, arguments[1], arguments[2]);\n        break;\n      default:\n        len = arguments.length;\n        args = new Array(len - 1);\n        for (i = 1; i < len; i++)\n          args[i - 1] = arguments[i];\n        handler.apply(this, args);\n    }\n  } else if (isObject(handler)) {\n    len = arguments.length;\n    args = new Array(len - 1);\n    for (i = 1; i < len; i++)\n      args[i - 1] = arguments[i];\n\n    listeners = handler.slice();\n    len = listeners.length;\n    for (i = 0; i < len; i++)\n      listeners[i].apply(this, args);\n  }\n\n  return true;\n};\n\nEventEmitter.prototype.addListener = function(type, listener) {\n  var m;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events)\n    this._events = {};\n  if (this._events.newListener)\n    this.emit('newListener', type,\n              isFunction(listener.listener) ?\n              listener.listener : listener);\n\n  if (!this._events[type])\n    this._events[type] = listener;\n  else if (isObject(this._events[type]))\n    this._events[type].push(listener);\n  else\n    this._events[type] = [this._events[type], listener];\n  if (isObject(this._events[type]) && !this._events[type].warned) {\n    var m;\n    if (!isUndefined(this._maxListeners)) {\n      m = this._maxListeners;\n    } else {\n      m = EventEmitter.defaultMaxListeners;\n    }\n\n    if (m && m > 0 && this._events[type].length > m) {\n      this._events[type].warned = true;\n      console.error('(node) warning: possible EventEmitter memory ' +\n                    'leak detected. %d listeners added. ' +\n                    'Use emitter.setMaxListeners() to increase limit.',\n                    this._events[type].length);\n      console.trace();\n    }\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.once = function(type, listener) {\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  var fired = false;\n\n  function g() {\n    this.removeListener(type, g);\n\n    if (!fired) {\n      fired = true;\n      listener.apply(this, arguments);\n    }\n  }\n\n  g.listener = listener;\n  this.on(type, g);\n\n  return this;\n};\nEventEmitter.prototype.removeListener = function(type, listener) {\n  var list, position, length, i;\n\n  if (!isFunction(listener))\n    throw TypeError('listener must be a function');\n\n  if (!this._events || !this._events[type])\n    return this;\n\n  list = this._events[type];\n  length = list.length;\n  position = -1;\n\n  if (list === listener ||\n      (isFunction(list.listener) && list.listener === listener)) {\n    delete this._events[type];\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n\n  } else if (isObject(list)) {\n    for (i = length; i-- > 0;) {\n      if (list[i] === listener ||\n          (list[i].listener && list[i].listener === listener)) {\n        position = i;\n        break;\n      }\n    }\n\n    if (position < 0)\n      return this;\n\n    if (list.length === 1) {\n      list.length = 0;\n      delete this._events[type];\n    } else {\n      list.splice(position, 1);\n    }\n\n    if (this._events.removeListener)\n      this.emit('removeListener', type, listener);\n  }\n\n  return this;\n};\n\nEventEmitter.prototype.removeAllListeners = function(type) {\n  var key, listeners;\n\n  if (!this._events)\n    return this;\n  if (!this._events.removeListener) {\n    if (arguments.length === 0)\n      this._events = {};\n    else if (this._events[type])\n      delete this._events[type];\n    return this;\n  }\n  if (arguments.length === 0) {\n    for (key in this._events) {\n      if (key === 'removeListener') continue;\n      this.removeAllListeners(key);\n    }\n    this.removeAllListeners('removeListener');\n    this._events = {};\n    return this;\n  }\n\n  listeners = this._events[type];\n\n  if (isFunction(listeners)) {\n    this.removeListener(type, listeners);\n  } else {\n    while (listeners.length)\n      this.removeListener(type, listeners[listeners.length - 1]);\n  }\n  delete this._events[type];\n\n  return this;\n};\n\nEventEmitter.prototype.listeners = function(type) {\n  var ret;\n  if (!this._events || !this._events[type])\n    ret = [];\n  else if (isFunction(this._events[type]))\n    ret = [this._events[type]];\n  else\n    ret = this._events[type].slice();\n  return ret;\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  var ret;\n  if (!emitter._events || !emitter._events[type])\n    ret = 0;\n  else if (isFunction(emitter._events[type]))\n    ret = 1;\n  else\n    ret = emitter._events[type].length;\n  return ret;\n};\n\nfunction isFunction(arg) {\n  return typeof arg === 'function';\n}\n\nfunction isNumber(arg) {\n  return typeof arg === 'number';\n}\n\nfunction isObject(arg) {\n  return typeof arg === 'object' && arg !== null;\n}\n\nfunction isUndefined(arg) {\n  return arg === void 0;\n}\n\n},\n{}]},{},[3])\n(3)\n\n});\n\nace.define(\"ace/mode/javascript_worker\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/worker/mirror\",\"ace/mode/javascript/jshint\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar Mirror = require(\"../worker/mirror\").Mirror;\nvar lint = require(\"./javascript/jshint\").JSHINT;\n\nfunction startRegex(arr) {\n    return RegExp(\"^(\" + arr.join(\"|\") + \")\");\n}\n\nvar disabledWarningsRe = startRegex([\n    \"Bad for in variable '(.+)'.\",\n    'Missing \"use strict\"'\n]);\nvar errorsRe = startRegex([\n    \"Unexpected\",\n    \"Expected \",\n    \"Confusing (plus|minus)\",\n    \"\\\\{a\\\\} unterminated regular expression\",\n    \"Unclosed \",\n    \"Unmatched \",\n    \"Unbegun comment\",\n    \"Bad invocation\",\n    \"Missing space after\",\n    \"Missing operator at\"\n]);\nvar infoRe = startRegex([\n    \"Expected an assignment\",\n    \"Bad escapement of EOL\",\n    \"Unexpected comma\",\n    \"Unexpected space\",\n    \"Missing radix parameter.\",\n    \"A leading decimal point can\",\n    \"\\\\['{a}'\\\\] is better written in dot notation.\",\n    \"'{a}' used out of scope\"\n]);\n\nvar JavaScriptWorker = exports.JavaScriptWorker = function(sender) {\n    Mirror.call(this, sender);\n    this.setTimeout(500);\n    this.setOptions();\n};\n\noop.inherits(JavaScriptWorker, Mirror);\n\n(function() {\n    this.setOptions = function(options) {\n        this.options = options || {\n            esnext: true,\n            moz: true,\n            devel: true,\n            browser: true,\n            node: true,\n            laxcomma: true,\n            laxbreak: true,\n            lastsemic: true,\n            onevar: false,\n            passfail: false,\n            maxerr: 100,\n            expr: true,\n            multistr: true,\n            globalstrict: true\n        };\n        this.doc.getValue() && this.deferredUpdate.schedule(100);\n    };\n\n    this.changeOptions = function(newOptions) {\n        oop.mixin(this.options, newOptions);\n        this.doc.getValue() && this.deferredUpdate.schedule(100);\n    };\n\n    this.isValidJS = function(str) {\n        try {\n            eval(\"throw 0;\" + str);\n        } catch(e) {\n            if (e === 0)\n                return true;\n        }\n        return false\n    };\n\n    this.onUpdate = function() {\n        var value = this.doc.getValue();\n        value = value.replace(/^#!.*\\n/, \"\\n\");\n        if (!value) {\n            this.sender.emit(\"jslint\", []);\n            return;\n        }\n        var errors = [];\n        var maxErrorLevel = this.isValidJS(value) ? \"warning\" : \"error\";\n        lint(value, this.options);\n        var results = lint.errors;\n\n        var errorAdded = false\n        for (var i = 0; i < results.length; i++) {\n            var error = results[i];\n            if (!error)\n                continue;\n            var raw = error.raw;\n            var type = \"warning\";\n\n            if (raw == \"Missing semicolon.\") {\n                var str = error.evidence.substr(error.character);\n                str = str.charAt(str.search(/\\S/));\n                if (maxErrorLevel == \"error\" && str && /[\\w\\d{(['\"]/.test(str)) {\n                    error.reason = 'Missing \";\" before statement';\n                    type = \"error\";\n                } else {\n                    type = \"info\";\n                }\n            }\n            else if (disabledWarningsRe.test(raw)) {\n                continue;\n            }\n            else if (infoRe.test(raw)) {\n                type = \"info\"\n            }\n            else if (errorsRe.test(raw)) {\n                errorAdded  = true;\n                type = maxErrorLevel;\n            }\n            else if (raw == \"'{a}' is not defined.\") {\n                type = \"warning\";\n            }\n            else if (raw == \"'{a}' is defined but never used.\") {\n                type = \"info\";\n            }\n\n            errors.push({\n                row: error.line-1,\n                column: error.character-1,\n                text: error.reason,\n                type: type,\n                raw: raw\n            });\n\n            if (errorAdded) {\n            }\n        }\n\n        this.sender.emit(\"jslint\", errors);\n    };\n\n}).call(JavaScriptWorker.prototype);\n\n});\n\nace.define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\nfunction Empty() {}\n\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function bind(that) { // .length is 1\n        var target = this;\n        if (typeof target != \"function\") {\n            throw new TypeError(\"Function.prototype.bind called on incompatible \" + target);\n        }\n        var args = slice.call(arguments, 1); // for normal call\n        var bound = function () {\n\n            if (this instanceof bound) {\n\n                var result = target.apply(\n                    this,\n                    args.concat(slice.call(arguments))\n                );\n                if (Object(result) === result) {\n                    return result;\n                }\n                return this;\n\n            } else {\n                return target.apply(\n                    that,\n                    args.concat(slice.call(arguments))\n                );\n\n            }\n\n        };\n        if(target.prototype) {\n            Empty.prototype = target.prototype;\n            bound.prototype = new Empty();\n            Empty.prototype = null;\n        }\n        return bound;\n    };\n}\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar _toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n    defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n    defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n    lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n    lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\nif ([1,2].splice(0).length != 2) {\n    if(function() { // test IE < 9 to splice bug - see issue #138\n        function makeArray(l) {\n            var a = new Array(l+2);\n            a[0] = a[1] = 0;\n            return a;\n        }\n        var array = [], lengthBefore;\n        \n        array.splice.apply(array, makeArray(20));\n        array.splice.apply(array, makeArray(26));\n\n        lengthBefore = array.length; //46\n        array.splice(5, 0, \"XXX\"); // add one element\n\n        lengthBefore + 1 == array.length\n\n        if (lengthBefore + 1 == array.length) {\n            return true;// has right splice implementation without bugs\n        }\n    }()) {//IE 6/7\n        var array_splice = Array.prototype.splice;\n        Array.prototype.splice = function(start, deleteCount) {\n            if (!arguments.length) {\n                return [];\n            } else {\n                return array_splice.apply(this, [\n                    start === void 0 ? 0 : start,\n                    deleteCount === void 0 ? (this.length - start) : deleteCount\n                ].concat(slice.call(arguments, 2)))\n            }\n        };\n    } else {//IE8\n        Array.prototype.splice = function(pos, removeCount){\n            var length = this.length;\n            if (pos > 0) {\n                if (pos > length)\n                    pos = length;\n            } else if (pos == void 0) {\n                pos = 0;\n            } else if (pos < 0) {\n                pos = Math.max(length + pos, 0);\n            }\n\n            if (!(pos+removeCount < length))\n                removeCount = length - pos;\n\n            var removed = this.slice(pos, pos+removeCount);\n            var insert = slice.call(arguments, 2);\n            var add = insert.length;            \n            if (pos === length) {\n                if (add) {\n                    this.push.apply(this, insert);\n                }\n            } else {\n                var remove = Math.min(removeCount, length - pos);\n                var tailOldPos = pos + remove;\n                var tailNewPos = tailOldPos + add - remove;\n                var tailCount = length - tailOldPos;\n                var lengthAfterRemove = length - remove;\n\n                if (tailNewPos < tailOldPos) { // case A\n                    for (var i = 0; i < tailCount; ++i) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } else if (tailNewPos > tailOldPos) { // case B\n                    for (i = tailCount; i--; ) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } // else, add == remove (nothing to do)\n\n                if (add && pos === lengthAfterRemove) {\n                    this.length = lengthAfterRemove; // truncate array\n                    this.push.apply(this, insert);\n                } else {\n                    this.length = lengthAfterRemove + add; // reserves space\n                    for (i = 0; i < add; ++i) {\n                        this[pos+i] = insert[i];\n                    }\n                }\n            }\n            return removed;\n        };\n    }\n}\nif (!Array.isArray) {\n    Array.isArray = function isArray(obj) {\n        return _toString(obj) == \"[object Array]\";\n    };\n}\nvar boxedString = Object(\"a\"),\n    splitString = boxedString[0] != \"a\" || !(0 in boxedString);\n\nif (!Array.prototype.forEach) {\n    Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            thisp = arguments[1],\n            i = -1,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        while (++i < length) {\n            if (i in self) {\n                fun.call(thisp, self[i], i, object);\n            }\n        }\n    };\n}\nif (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            result = Array(length),\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self)\n                result[i] = fun.call(thisp, self[i], i, object);\n        }\n        return result;\n    };\n}\nif (!Array.prototype.filter) {\n    Array.prototype.filter = function filter(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                    object,\n            length = self.length >>> 0,\n            result = [],\n            value,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self) {\n                value = self[i];\n                if (fun.call(thisp, value, i, object)) {\n                    result.push(value);\n                }\n            }\n        }\n        return result;\n    };\n}\nif (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && !fun.call(thisp, self[i], i, object)) {\n                return false;\n            }\n        }\n        return true;\n    };\n}\nif (!Array.prototype.some) {\n    Array.prototype.some = function some(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, object)) {\n                return true;\n            }\n        }\n        return false;\n    };\n}\nif (!Array.prototype.reduce) {\n    Array.prototype.reduce = function reduce(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduce of empty array with no initial value\");\n        }\n\n        var i = 0;\n        var result;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i++];\n                    break;\n                }\n                if (++i >= length) {\n                    throw new TypeError(\"reduce of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        for (; i < length; i++) {\n            if (i in self) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        }\n\n        return result;\n    };\n}\nif (!Array.prototype.reduceRight) {\n    Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduceRight of empty array with no initial value\");\n        }\n\n        var result, i = length - 1;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i--];\n                    break;\n                }\n                if (--i < 0) {\n                    throw new TypeError(\"reduceRight of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        do {\n            if (i in this) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        } while (i--);\n\n        return result;\n    };\n}\nif (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {\n    Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n\n        var i = 0;\n        if (arguments.length > 1) {\n            i = toInteger(arguments[1]);\n        }\n        i = i >= 0 ? i : Math.max(0, length + i);\n        for (; i < length; i++) {\n            if (i in self && self[i] === sought) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {\n    Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n        var i = length - 1;\n        if (arguments.length > 1) {\n            i = Math.min(i, toInteger(arguments[1]));\n        }\n        i = i >= 0 ? i : length - Math.abs(i);\n        for (; i >= 0; i--) {\n            if (i in self && sought === self[i]) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Object.getPrototypeOf) {\n    Object.getPrototypeOf = function getPrototypeOf(object) {\n        return object.__proto__ || (\n            object.constructor ?\n            object.constructor.prototype :\n            prototypeOfObject\n        );\n    };\n}\nif (!Object.getOwnPropertyDescriptor) {\n    var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n                         \"non-object: \";\n    Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT + object);\n        if (!owns(object, property))\n            return;\n\n        var descriptor, getter, setter;\n        descriptor =  { enumerable: true, configurable: true };\n        if (supportsAccessors) {\n            var prototype = object.__proto__;\n            object.__proto__ = prototypeOfObject;\n\n            var getter = lookupGetter(object, property);\n            var setter = lookupSetter(object, property);\n            object.__proto__ = prototype;\n\n            if (getter || setter) {\n                if (getter) descriptor.get = getter;\n                if (setter) descriptor.set = setter;\n                return descriptor;\n            }\n        }\n        descriptor.value = object[property];\n        return descriptor;\n    };\n}\nif (!Object.getOwnPropertyNames) {\n    Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n        return Object.keys(object);\n    };\n}\nif (!Object.create) {\n    var createEmpty;\n    if (Object.prototype.__proto__ === null) {\n        createEmpty = function () {\n            return { \"__proto__\": null };\n        };\n    } else {\n        createEmpty = function () {\n            var empty = {};\n            for (var i in empty)\n                empty[i] = null;\n            empty.constructor =\n            empty.hasOwnProperty =\n            empty.propertyIsEnumerable =\n            empty.isPrototypeOf =\n            empty.toLocaleString =\n            empty.toString =\n            empty.valueOf =\n            empty.__proto__ = null;\n            return empty;\n        }\n    }\n\n    Object.create = function create(prototype, properties) {\n        var object;\n        if (prototype === null) {\n            object = createEmpty();\n        } else {\n            if (typeof prototype != \"object\")\n                throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n            var Type = function () {};\n            Type.prototype = prototype;\n            object = new Type();\n            object.__proto__ = prototype;\n        }\n        if (properties !== void 0)\n            Object.defineProperties(object, properties);\n        return object;\n    };\n}\n\nfunction doesDefinePropertyWork(object) {\n    try {\n        Object.defineProperty(object, \"sentinel\", {});\n        return \"sentinel\" in object;\n    } catch (exception) {\n    }\n}\nif (Object.defineProperty) {\n    var definePropertyWorksOnObject = doesDefinePropertyWork({});\n    var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n        doesDefinePropertyWork(document.createElement(\"div\"));\n    if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n        var definePropertyFallback = Object.defineProperty;\n    }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n    var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n    var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n    var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n                                      \"on this javascript engine\";\n\n    Object.defineProperty = function defineProperty(object, property, descriptor) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n        if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n            throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n        if (definePropertyFallback) {\n            try {\n                return definePropertyFallback.call(Object, object, property, descriptor);\n            } catch (exception) {\n            }\n        }\n        if (owns(descriptor, \"value\")) {\n\n            if (supportsAccessors && (lookupGetter(object, property) ||\n                                      lookupSetter(object, property)))\n            {\n                var prototype = object.__proto__;\n                object.__proto__ = prototypeOfObject;\n                delete object[property];\n                object[property] = descriptor.value;\n                object.__proto__ = prototype;\n            } else {\n                object[property] = descriptor.value;\n            }\n        } else {\n            if (!supportsAccessors)\n                throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n            if (owns(descriptor, \"get\"))\n                defineGetter(object, property, descriptor.get);\n            if (owns(descriptor, \"set\"))\n                defineSetter(object, property, descriptor.set);\n        }\n\n        return object;\n    };\n}\nif (!Object.defineProperties) {\n    Object.defineProperties = function defineProperties(object, properties) {\n        for (var property in properties) {\n            if (owns(properties, property))\n                Object.defineProperty(object, property, properties[property]);\n        }\n        return object;\n    };\n}\nif (!Object.seal) {\n    Object.seal = function seal(object) {\n        return object;\n    };\n}\nif (!Object.freeze) {\n    Object.freeze = function freeze(object) {\n        return object;\n    };\n}\ntry {\n    Object.freeze(function () {});\n} catch (exception) {\n    Object.freeze = (function freeze(freezeObject) {\n        return function freeze(object) {\n            if (typeof object == \"function\") {\n                return object;\n            } else {\n                return freezeObject(object);\n            }\n        };\n    })(Object.freeze);\n}\nif (!Object.preventExtensions) {\n    Object.preventExtensions = function preventExtensions(object) {\n        return object;\n    };\n}\nif (!Object.isSealed) {\n    Object.isSealed = function isSealed(object) {\n        return false;\n    };\n}\nif (!Object.isFrozen) {\n    Object.isFrozen = function isFrozen(object) {\n        return false;\n    };\n}\nif (!Object.isExtensible) {\n    Object.isExtensible = function isExtensible(object) {\n        if (Object(object) === object) {\n            throw new TypeError(); // TODO message\n        }\n        var name = '';\n        while (owns(object, name)) {\n            name += '?';\n        }\n        object[name] = true;\n        var returnValue = owns(object, name);\n        delete object[name];\n        return returnValue;\n    };\n}\nif (!Object.keys) {\n    var hasDontEnumBug = true,\n        dontEnums = [\n            \"toString\",\n            \"toLocaleString\",\n            \"valueOf\",\n            \"hasOwnProperty\",\n            \"isPrototypeOf\",\n            \"propertyIsEnumerable\",\n            \"constructor\"\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    for (var key in {\"toString\": null}) {\n        hasDontEnumBug = false;\n    }\n\n    Object.keys = function keys(object) {\n\n        if (\n            (typeof object != \"object\" && typeof object != \"function\") ||\n            object === null\n        ) {\n            throw new TypeError(\"Object.keys called on a non-object\");\n        }\n\n        var keys = [];\n        for (var name in object) {\n            if (owns(object, name)) {\n                keys.push(name);\n            }\n        }\n\n        if (hasDontEnumBug) {\n            for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n                var dontEnum = dontEnums[i];\n                if (owns(object, dontEnum)) {\n                    keys.push(dontEnum);\n                }\n            }\n        }\n        return keys;\n    };\n\n}\nif (!Date.now) {\n    Date.now = function now() {\n        return new Date().getTime();\n    };\n}\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n    \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n    \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n    ws = \"[\" + ws + \"]\";\n    var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n        trimEndRegexp = new RegExp(ws + ws + \"*$\");\n    String.prototype.trim = function trim() {\n        return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n    };\n}\n\nfunction toInteger(n) {\n    n = +n;\n    if (n !== n) { // isNaN\n        n = 0;\n    } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {\n        n = (n > 0 || -1) * Math.floor(Math.abs(n));\n    }\n    return n;\n}\n\nfunction isPrimitive(input) {\n    var type = typeof input;\n    return (\n        input === null ||\n        type === \"undefined\" ||\n        type === \"boolean\" ||\n        type === \"number\" ||\n        type === \"string\"\n    );\n}\n\nfunction toPrimitive(input) {\n    var val, valueOf, toString;\n    if (isPrimitive(input)) {\n        return input;\n    }\n    valueOf = input.valueOf;\n    if (typeof valueOf === \"function\") {\n        val = valueOf.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    toString = input.toString;\n    if (typeof toString === \"function\") {\n        val = toString.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    throw new TypeError();\n}\nvar toObject = function (o) {\n    if (o == null) { // this matches both null and undefined\n        throw new TypeError(\"can't convert \"+o+\" to object\");\n    }\n    return Object(o);\n};\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/worker-json.js",
    "content": "\"no use strict\";\n;(function(window) {\nif (typeof window.window != \"undefined\" && window.document) {\n    return;\n}\n\nwindow.console = function() {\n    var msgs = Array.prototype.slice.call(arguments, 0);\n    postMessage({type: \"log\", data: msgs});\n};\nwindow.console.error =\nwindow.console.warn = \nwindow.console.log =\nwindow.console.trace = window.console;\n\nwindow.window = window;\nwindow.ace = window;\n\nwindow.onerror = function(message, file, line, col, err) {\n    postMessage({type: \"error\", data: {\n        message: message,\n        file: file,\n        line: line, \n        col: col,\n        stack: err.stack\n    }});\n};\n\nwindow.normalizeModule = function(parentId, moduleName) {\n    // normalize plugin requires\n    if (moduleName.indexOf(\"!\") !== -1) {\n        var chunks = moduleName.split(\"!\");\n        return window.normalizeModule(parentId, chunks[0]) + \"!\" + window.normalizeModule(parentId, chunks[1]);\n    }\n    // normalize relative requires\n    if (moduleName.charAt(0) == \".\") {\n        var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n        moduleName = (base ? base + \"/\" : \"\") + moduleName;\n        \n        while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n            var previous = moduleName;\n            moduleName = moduleName.replace(/^\\.\\//, \"\").replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n        }\n    }\n    \n    return moduleName;\n};\n\nwindow.require = function(parentId, id) {\n    if (!id) {\n        id = parentId;\n        parentId = null;\n    }\n    if (!id.charAt)\n        throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");\n\n    id = window.normalizeModule(parentId, id);\n\n    var module = window.require.modules[id];\n    if (module) {\n        if (!module.initialized) {\n            module.initialized = true;\n            module.exports = module.factory().exports;\n        }\n        return module.exports;\n    }\n    \n    var chunks = id.split(\"/\");\n    if (!window.require.tlns)\n        return console.log(\"unable to load \" + id);\n    chunks[0] = window.require.tlns[chunks[0]] || chunks[0];\n    var path = chunks.join(\"/\") + \".js\";\n    \n    window.require.id = id;\n    importScripts(path);\n    return window.require(parentId, id);\n};\nwindow.require.modules = {};\nwindow.require.tlns = {};\n\nwindow.define = function(id, deps, factory) {\n    if (arguments.length == 2) {\n        factory = deps;\n        if (typeof id != \"string\") {\n            deps = id;\n            id = window.require.id;\n        }\n    } else if (arguments.length == 1) {\n        factory = id;\n        deps = [];\n        id = window.require.id;\n    }\n    \n    if (typeof factory != \"function\") {\n        window.require.modules[id] = {\n            exports: factory,\n            initialized: true\n        };\n        return;\n    }\n\n    if (!deps.length)\n        // If there is no dependencies, we inject 'require', 'exports' and\n        // 'module' as dependencies, to provide CommonJS compatibility.\n        deps = ['require', 'exports', 'module'];\n\n    var req = function(childId) {\n        return window.require(id, childId);\n    };\n\n    window.require.modules[id] = {\n        exports: {},\n        factory: function() {\n            var module = this;\n            var returnExports = factory.apply(this, deps.map(function(dep) {\n              switch(dep) {\n                  // Because 'require', 'exports' and 'module' aren't actual\n                  // dependencies, we must handle them seperately.\n                  case 'require': return req;\n                  case 'exports': return module.exports;\n                  case 'module':  return module;\n                  // But for all other dependencies, we can just go ahead and\n                  // require them.\n                  default:        return req(dep);\n              }\n            }));\n            if (returnExports)\n                module.exports = returnExports;\n            return module;\n        }\n    };\n};\nwindow.define.amd = {};\n\nwindow.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n    require.tlns = topLevelNamespaces;\n};\n\nwindow.initSender = function initSender() {\n\n    var EventEmitter = window.require(\"ace/lib/event_emitter\").EventEmitter;\n    var oop = window.require(\"ace/lib/oop\");\n    \n    var Sender = function() {};\n    \n    (function() {\n        \n        oop.implement(this, EventEmitter);\n                \n        this.callback = function(data, callbackId) {\n            postMessage({\n                type: \"call\",\n                id: callbackId,\n                data: data\n            });\n        };\n    \n        this.emit = function(name, data) {\n            postMessage({\n                type: \"event\",\n                name: name,\n                data: data\n            });\n        };\n        \n    }).call(Sender.prototype);\n    \n    return new Sender();\n};\n\nvar main = window.main = null;\nvar sender = window.sender = null;\n\nwindow.onmessage = function(e) {\n    var msg = e.data;\n    if (msg.command) {\n        if (main[msg.command])\n            main[msg.command].apply(main, msg.args);\n        else\n            throw new Error(\"Unknown command:\" + msg.command);\n    }\n    else if (msg.init) {        \n        initBaseUrls(msg.tlns);\n        require(\"ace/lib/es5-shim\");\n        sender = window.sender = initSender();\n        var clazz = require(msg.module)[msg.classname];\n        main = window.main = new clazz(sender);\n    } \n    else if (msg.event && sender) {\n        sender._signal(msg.event, msg.data);\n    }\n};\n})(this);\n\nace.define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.inherits = function(ctor, 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\nexports.mixin = function(obj, mixin) {\n    for (var key in mixin) {\n        obj[key] = mixin[key];\n    }\n    return obj;\n};\n\nexports.implement = function(proto, mixin) {\n    exports.mixin(proto, mixin);\n};\n\n});\n\nace.define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nvar EventEmitter = {};\nvar stopPropagation = function() { this.propagationStopped = true; };\nvar preventDefault = function() { this.defaultPrevented = true; };\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n    this._eventRegistry || (this._eventRegistry = {});\n    this._defaultHandlers || (this._defaultHandlers = {});\n\n    var listeners = this._eventRegistry[eventName] || [];\n    var defaultHandler = this._defaultHandlers[eventName];\n    if (!listeners.length && !defaultHandler)\n        return;\n\n    if (typeof e != \"object\" || !e)\n        e = {};\n\n    if (!e.type)\n        e.type = eventName;\n    if (!e.stopPropagation)\n        e.stopPropagation = stopPropagation;\n    if (!e.preventDefault)\n        e.preventDefault = preventDefault;\n\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++) {\n        listeners[i](e, this);\n        if (e.propagationStopped)\n            break;\n    }\n    \n    if (defaultHandler && !e.defaultPrevented)\n        return defaultHandler(e, this);\n};\n\n\nEventEmitter._signal = function(eventName, e) {\n    var listeners = (this._eventRegistry || {})[eventName];\n    if (!listeners)\n        return;\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++)\n        listeners[i](e, this);\n};\n\nEventEmitter.once = function(eventName, callback) {\n    var _self = this;\n    callback && this.addEventListener(eventName, function newCallback() {\n        _self.removeEventListener(eventName, newCallback);\n        callback.apply(null, arguments);\n    });\n};\n\n\nEventEmitter.setDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        handlers = this._defaultHandlers = {_disabled_: {}};\n    \n    if (handlers[eventName]) {\n        var old = handlers[eventName];\n        var disabled = handlers._disabled_[eventName];\n        if (!disabled)\n            handlers._disabled_[eventName] = disabled = [];\n        disabled.push(old);\n        var i = disabled.indexOf(callback);\n        if (i != -1) \n            disabled.splice(i, 1);\n    }\n    handlers[eventName] = callback;\n};\nEventEmitter.removeDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        return;\n    var disabled = handlers._disabled_[eventName];\n    \n    if (handlers[eventName] == callback) {\n        var old = handlers[eventName];\n        if (disabled)\n            this.setDefaultHandler(eventName, disabled.pop());\n    } else if (disabled) {\n        var i = disabled.indexOf(callback);\n        if (i != -1)\n            disabled.splice(i, 1);\n    }\n};\n\nEventEmitter.on =\nEventEmitter.addEventListener = function(eventName, callback, capturing) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        listeners = this._eventRegistry[eventName] = [];\n\n    if (listeners.indexOf(callback) == -1)\n        listeners[capturing ? \"unshift\" : \"push\"](callback);\n    return callback;\n};\n\nEventEmitter.off =\nEventEmitter.removeListener =\nEventEmitter.removeEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        return;\n\n    var index = listeners.indexOf(callback);\n    if (index !== -1)\n        listeners.splice(index, 1);\n};\n\nEventEmitter.removeAllListeners = function(eventName) {\n    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n};\n\nexports.EventEmitter = EventEmitter;\n\n});\n\nace.define(\"ace/range\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nvar comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n    this.start = {\n        row: startRow,\n        column: startColumn\n    };\n\n    this.end = {\n        row: endRow,\n        column: endColumn\n    };\n};\n\n(function() {\n    this.isEqual = function(range) {\n        return this.start.row === range.start.row &&\n            this.end.row === range.end.row &&\n            this.start.column === range.start.column &&\n            this.end.column === range.end.column;\n    };\n    this.toString = function() {\n        return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n            \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n    };\n\n    this.contains = function(row, column) {\n        return this.compare(row, column) == 0;\n    };\n    this.compareRange = function(range) {\n        var cmp,\n            end = range.end,\n            start = range.start;\n\n        cmp = this.compare(end.row, end.column);\n        if (cmp == 1) {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == 1) {\n                return 2;\n            } else if (cmp == 0) {\n                return 1;\n            } else {\n                return 0;\n            }\n        } else if (cmp == -1) {\n            return -2;\n        } else {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == -1) {\n                return -1;\n            } else if (cmp == 1) {\n                return 42;\n            } else {\n                return 0;\n            }\n        }\n    };\n    this.comparePoint = function(p) {\n        return this.compare(p.row, p.column);\n    };\n    this.containsRange = function(range) {\n        return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n    };\n    this.intersects = function(range) {\n        var cmp = this.compareRange(range);\n        return (cmp == -1 || cmp == 0 || cmp == 1);\n    };\n    this.isEnd = function(row, column) {\n        return this.end.row == row && this.end.column == column;\n    };\n    this.isStart = function(row, column) {\n        return this.start.row == row && this.start.column == column;\n    };\n    this.setStart = function(row, column) {\n        if (typeof row == \"object\") {\n            this.start.column = row.column;\n            this.start.row = row.row;\n        } else {\n            this.start.row = row;\n            this.start.column = column;\n        }\n    };\n    this.setEnd = function(row, column) {\n        if (typeof row == \"object\") {\n            this.end.column = row.column;\n            this.end.row = row.row;\n        } else {\n            this.end.row = row;\n            this.end.column = column;\n        }\n    };\n    this.inside = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column) || this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideStart = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideEnd = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.compare = function(row, column) {\n        if (!this.isMultiLine()) {\n            if (row === this.start.row) {\n                return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n            };\n        }\n\n        if (row < this.start.row)\n            return -1;\n\n        if (row > this.end.row)\n            return 1;\n\n        if (this.start.row === row)\n            return column >= this.start.column ? 0 : -1;\n\n        if (this.end.row === row)\n            return column <= this.end.column ? 0 : 1;\n\n        return 0;\n    };\n    this.compareStart = function(row, column) {\n        if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareEnd = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareInside = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.clipRows = function(firstRow, lastRow) {\n        if (this.end.row > lastRow)\n            var end = {row: lastRow + 1, column: 0};\n        else if (this.end.row < firstRow)\n            var end = {row: firstRow, column: 0};\n\n        if (this.start.row > lastRow)\n            var start = {row: lastRow + 1, column: 0};\n        else if (this.start.row < firstRow)\n            var start = {row: firstRow, column: 0};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n    this.extend = function(row, column) {\n        var cmp = this.compare(row, column);\n\n        if (cmp == 0)\n            return this;\n        else if (cmp == -1)\n            var start = {row: row, column: column};\n        else\n            var end = {row: row, column: column};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n\n    this.isEmpty = function() {\n        return (this.start.row === this.end.row && this.start.column === this.end.column);\n    };\n    this.isMultiLine = function() {\n        return (this.start.row !== this.end.row);\n    };\n    this.clone = function() {\n        return Range.fromPoints(this.start, this.end);\n    };\n    this.collapseRows = function() {\n        if (this.end.column == 0)\n            return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)\n        else\n            return new Range(this.start.row, 0, this.end.row, 0)\n    };\n    this.toScreenRange = function(session) {\n        var screenPosStart = session.documentToScreenPosition(this.start);\n        var screenPosEnd = session.documentToScreenPosition(this.end);\n\n        return new Range(\n            screenPosStart.row, screenPosStart.column,\n            screenPosEnd.row, screenPosEnd.column\n        );\n    };\n    this.moveBy = function(row, column) {\n        this.start.row += row;\n        this.start.column += column;\n        this.end.row += row;\n        this.end.column += column;\n    };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n    return new Range(start.row, start.column, end.row, end.column);\n};\nRange.comparePoints = comparePoints;\n\nRange.comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\n\n\nexports.Range = Range;\n});\n\nace.define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n    this.$onChange = this.onChange.bind(this);\n    this.attach(doc);\n    \n    if (typeof column == \"undefined\")\n        this.setPosition(row.row, row.column);\n    else\n        this.setPosition(row, column);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.getPosition = function() {\n        return this.$clipPositionToDocument(this.row, this.column);\n    };\n    this.getDocument = function() {\n        return this.document;\n    };\n    this.$insertRight = false;\n    this.onChange = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n\n        if (range.start.row == range.end.row && range.start.row != this.row)\n            return;\n\n        if (range.start.row > this.row)\n            return;\n\n        if (range.start.row == this.row && range.start.column > this.column)\n            return;\n\n        var row = this.row;\n        var column = this.column;\n        var start = range.start;\n        var end = range.end;\n\n        if (delta.action === \"insertText\") {\n            if (start.row === row && start.column <= column) {\n                if (start.column === column && this.$insertRight) {\n                } else if (start.row === end.row) {\n                    column += end.column - start.column;\n                } else {\n                    column -= start.column;\n                    row += end.row - start.row;\n                }\n            } else if (start.row !== end.row && start.row < row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"insertLines\") {\n            if (start.row === row && column === 0 && this.$insertRight) {\n            }\n            else if (start.row <= row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"removeText\") {\n            if (start.row === row && start.column < column) {\n                if (end.column >= column)\n                    column = start.column;\n                else\n                    column = Math.max(0, column - (end.column - start.column));\n\n            } else if (start.row !== end.row && start.row < row) {\n                if (end.row === row)\n                    column = Math.max(0, column - end.column) + start.column;\n                row -= (end.row - start.row);\n            } else if (end.row === row) {\n                row -= end.row - start.row;\n                column = Math.max(0, column - end.column) + start.column;\n            }\n        } else if (delta.action == \"removeLines\") {\n            if (start.row <= row) {\n                if (end.row <= row)\n                    row -= end.row - start.row;\n                else {\n                    row = start.row;\n                    column = 0;\n                }\n            }\n        }\n\n        this.setPosition(row, column, true);\n    };\n    this.setPosition = function(row, column, noClip) {\n        var pos;\n        if (noClip) {\n            pos = {\n                row: row,\n                column: column\n            };\n        } else {\n            pos = this.$clipPositionToDocument(row, column);\n        }\n\n        if (this.row == pos.row && this.column == pos.column)\n            return;\n\n        var old = {\n            row: this.row,\n            column: this.column\n        };\n\n        this.row = pos.row;\n        this.column = pos.column;\n        this._signal(\"change\", {\n            old: old,\n            value: pos\n        });\n    };\n    this.detach = function() {\n        this.document.removeEventListener(\"change\", this.$onChange);\n    };\n    this.attach = function(doc) {\n        this.document = doc || this.document;\n        this.document.on(\"change\", this.$onChange);\n    };\n    this.$clipPositionToDocument = function(row, column) {\n        var pos = {};\n\n        if (row >= this.document.getLength()) {\n            pos.row = Math.max(0, this.document.getLength() - 1);\n            pos.column = this.document.getLine(pos.row).length;\n        }\n        else if (row < 0) {\n            pos.row = 0;\n            pos.column = 0;\n        }\n        else {\n            pos.row = row;\n            pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n        }\n\n        if (column < 0)\n            pos.column = 0;\n\n        return pos;\n    };\n\n}).call(Anchor.prototype);\n\n});\n\nace.define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\nvar Document = function(text) {\n    this.$lines = [];\n    if (text.length === 0) {\n        this.$lines = [\"\"];\n    } else if (Array.isArray(text)) {\n        this._insertLines(0, text);\n    } else {\n        this.insert({row: 0, column:0}, text);\n    }\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setValue = function(text) {\n        var len = this.getLength();\n        this.remove(new Range(0, 0, len, this.getLine(len-1).length));\n        this.insert({row: 0, column:0}, text);\n    };\n    this.getValue = function() {\n        return this.getAllLines().join(this.getNewLineCharacter());\n    };\n    this.createAnchor = function(row, column) {\n        return new Anchor(this, row, column);\n    };\n    if (\"aaa\".split(/a/).length === 0)\n        this.$split = function(text) {\n            return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n        };\n    else\n        this.$split = function(text) {\n            return text.split(/\\r\\n|\\r|\\n/);\n        };\n\n\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n        this.$autoNewLine = match ? match[1] : \"\\n\";\n        this._signal(\"changeNewLineMode\");\n    };\n    this.getNewLineCharacter = function() {\n        switch (this.$newLineMode) {\n          case \"windows\":\n            return \"\\r\\n\";\n          case \"unix\":\n            return \"\\n\";\n          default:\n            return this.$autoNewLine || \"\\n\";\n        }\n    };\n\n    this.$autoNewLine = \"\";\n    this.$newLineMode = \"auto\";\n    this.setNewLineMode = function(newLineMode) {\n        if (this.$newLineMode === newLineMode)\n            return;\n\n        this.$newLineMode = newLineMode;\n        this._signal(\"changeNewLineMode\");\n    };\n    this.getNewLineMode = function() {\n        return this.$newLineMode;\n    };\n    this.isNewLine = function(text) {\n        return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n    };\n    this.getLine = function(row) {\n        return this.$lines[row] || \"\";\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.$lines.slice(firstRow, lastRow + 1);\n    };\n    this.getAllLines = function() {\n        return this.getLines(0, this.getLength());\n    };\n    this.getLength = function() {\n        return this.$lines.length;\n    };\n    this.getTextRange = function(range) {\n        if (range.start.row == range.end.row) {\n            return this.getLine(range.start.row)\n                .substring(range.start.column, range.end.column);\n        }\n        var lines = this.getLines(range.start.row, range.end.row);\n        lines[0] = (lines[0] || \"\").substring(range.start.column);\n        var l = lines.length - 1;\n        if (range.end.row - range.start.row == l)\n            lines[l] = lines[l].substring(0, range.end.column);\n        return lines.join(this.getNewLineCharacter());\n    };\n\n    this.$clipPosition = function(position) {\n        var length = this.getLength();\n        if (position.row >= length) {\n            position.row = Math.max(0, length - 1);\n            position.column = this.getLine(length-1).length;\n        } else if (position.row < 0)\n            position.row = 0;\n        return position;\n    };\n    this.insert = function(position, text) {\n        if (!text || text.length === 0)\n            return position;\n\n        position = this.$clipPosition(position);\n        if (this.getLength() <= 1)\n            this.$detectNewLine(text);\n\n        var lines = this.$split(text);\n        var firstLine = lines.splice(0, 1)[0];\n        var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];\n\n        position = this.insertInLine(position, firstLine);\n        if (lastLine !== null) {\n            position = this.insertNewLine(position); // terminate first line\n            position = this._insertLines(position.row, lines);\n            position = this.insertInLine(position, lastLine || \"\");\n        }\n        return position;\n    };\n    this.insertLines = function(row, lines) {\n        if (row >= this.getLength())\n            return this.insert({row: row, column: 0}, \"\\n\" + lines.join(\"\\n\"));\n        return this._insertLines(Math.max(row, 0), lines);\n    };\n    this._insertLines = function(row, lines) {\n        if (lines.length == 0)\n            return {row: row, column: 0};\n        while (lines.length > 0xF000) {\n            var end = this._insertLines(row, lines.slice(0, 0xF000));\n            lines = lines.slice(0xF000);\n            row = end.row;\n        }\n\n        var args = [row, 0];\n        args.push.apply(args, lines);\n        this.$lines.splice.apply(this.$lines, args);\n\n        var range = new Range(row, 0, row + lines.length, 0);\n        var delta = {\n            action: \"insertLines\",\n            range: range,\n            lines: lines\n        };\n        this._signal(\"change\", { data: delta });\n        return range.end;\n    };\n    this.insertNewLine = function(position) {\n        position = this.$clipPosition(position);\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column);\n        this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));\n\n        var end = {\n            row : position.row + 1,\n            column : 0\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: this.getNewLineCharacter()\n        };\n        this._signal(\"change\", { data: delta });\n\n        return end;\n    };\n    this.insertInLine = function(position, text) {\n        if (text.length == 0)\n            return position;\n\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column) + text\n                + line.substring(position.column);\n\n        var end = {\n            row : position.row,\n            column : position.column + text.length\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: text\n        };\n        this._signal(\"change\", { data: delta });\n\n        return end;\n    };\n    this.remove = function(range) {\n        if (!(range instanceof Range))\n            range = Range.fromPoints(range.start, range.end);\n        range.start = this.$clipPosition(range.start);\n        range.end = this.$clipPosition(range.end);\n\n        if (range.isEmpty())\n            return range.start;\n\n        var firstRow = range.start.row;\n        var lastRow = range.end.row;\n\n        if (range.isMultiLine()) {\n            var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;\n            var lastFullRow = lastRow - 1;\n\n            if (range.end.column > 0)\n                this.removeInLine(lastRow, 0, range.end.column);\n\n            if (lastFullRow >= firstFullRow)\n                this._removeLines(firstFullRow, lastFullRow);\n\n            if (firstFullRow != firstRow) {\n                this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);\n                this.removeNewLine(range.start.row);\n            }\n        }\n        else {\n            this.removeInLine(firstRow, range.start.column, range.end.column);\n        }\n        return range.start;\n    };\n    this.removeInLine = function(row, startColumn, endColumn) {\n        if (startColumn == endColumn)\n            return;\n\n        var range = new Range(row, startColumn, row, endColumn);\n        var line = this.getLine(row);\n        var removed = line.substring(startColumn, endColumn);\n        var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);\n        this.$lines.splice(row, 1, newLine);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: removed\n        };\n        this._signal(\"change\", { data: delta });\n        return range.start;\n    };\n    this.removeLines = function(firstRow, lastRow) {\n        if (firstRow < 0 || lastRow >= this.getLength())\n            return this.remove(new Range(firstRow, 0, lastRow + 1, 0));\n        return this._removeLines(firstRow, lastRow);\n    };\n\n    this._removeLines = function(firstRow, lastRow) {\n        var range = new Range(firstRow, 0, lastRow + 1, 0);\n        var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);\n\n        var delta = {\n            action: \"removeLines\",\n            range: range,\n            nl: this.getNewLineCharacter(),\n            lines: removed\n        };\n        this._signal(\"change\", { data: delta });\n        return removed;\n    };\n    this.removeNewLine = function(row) {\n        var firstLine = this.getLine(row);\n        var secondLine = this.getLine(row+1);\n\n        var range = new Range(row, firstLine.length, row+1, 0);\n        var line = firstLine + secondLine;\n\n        this.$lines.splice(row, 2, line);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: this.getNewLineCharacter()\n        };\n        this._signal(\"change\", { data: delta });\n    };\n    this.replace = function(range, text) {\n        if (!(range instanceof Range))\n            range = Range.fromPoints(range.start, range.end);\n        if (text.length == 0 && range.isEmpty())\n            return range.start;\n        if (text == this.getTextRange(range))\n            return range.end;\n\n        this.remove(range);\n        if (text) {\n            var end = this.insert(range.start, text);\n        }\n        else {\n            end = range.start;\n        }\n\n        return end;\n    };\n    this.applyDeltas = function(deltas) {\n        for (var i=0; i<deltas.length; i++) {\n            var delta = deltas[i];\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"insertText\")\n                this.insert(range.start, delta.text);\n            else if (delta.action == \"removeLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"removeText\")\n                this.remove(range);\n        }\n    };\n    this.revertDeltas = function(deltas) {\n        for (var i=deltas.length-1; i>=0; i--) {\n            var delta = deltas[i];\n\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"insertText\")\n                this.remove(range);\n            else if (delta.action == \"removeLines\")\n                this._insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"removeText\")\n                this.insert(range.start, delta.text);\n        }\n    };\n    this.indexToPosition = function(index, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        for (var i = startRow || 0, l = lines.length; i < l; i++) {\n            index -= lines[i].length + newlineLength;\n            if (index < 0)\n                return {row: i, column: index + lines[i].length + newlineLength};\n        }\n        return {row: l-1, column: lines[l-1].length};\n    };\n    this.positionToIndex = function(pos, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        var index = 0;\n        var row = Math.min(pos.row, lines.length);\n        for (var i = startRow || 0; i < row; ++i)\n            index += lines[i].length + newlineLength;\n\n        return index + pos.column;\n    };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\nace.define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.last = function(a) {\n    return a[a.length - 1];\n};\n\nexports.stringReverse = function(string) {\n    return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n    var result = '';\n    while (count > 0) {\n        if (count & 1)\n            result += string;\n\n        if (count >>= 1)\n            string += string;\n    }\n    return result;\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n    return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n    return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n    var copy = {};\n    for (var key in obj) {\n        copy[key] = obj[key];\n    }\n    return copy;\n};\n\nexports.copyArray = function(array){\n    var copy = [];\n    for (var i=0, l=array.length; i<l; i++) {\n        if (array[i] && typeof array[i] == \"object\")\n            copy[i] = this.copyObject( array[i] );\n        else \n            copy[i] = array[i];\n    }\n    return copy;\n};\n\nexports.deepCopy = function (obj) {\n    if (typeof obj !== \"object\" || !obj)\n        return obj;\n    var cons = obj.constructor;\n    if (cons === RegExp)\n        return obj;\n    \n    var copy = cons();\n    for (var key in obj) {\n        if (typeof obj[key] === \"object\") {\n            copy[key] = exports.deepCopy(obj[key]);\n        } else {\n            copy[key] = obj[key];\n        }\n    }\n    return copy;\n};\n\nexports.arrayToMap = function(arr) {\n    var map = {};\n    for (var i=0; i<arr.length; i++) {\n        map[arr[i]] = 1;\n    }\n    return map;\n\n};\n\nexports.createMap = function(props) {\n    var map = Object.create(null);\n    for (var i in props) {\n        map[i] = props[i];\n    }\n    return map;\n};\nexports.arrayRemove = function(array, value) {\n  for (var i = 0; i <= array.length; i++) {\n    if (value === array[i]) {\n      array.splice(i, 1);\n    }\n  }\n};\n\nexports.escapeRegExp = function(str) {\n    return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n};\n\nexports.escapeHTML = function(str) {\n    return str.replace(/&/g, \"&#38;\").replace(/\"/g, \"&#34;\").replace(/'/g, \"&#39;\").replace(/</g, \"&#60;\");\n};\n\nexports.getMatchOffsets = function(string, regExp) {\n    var matches = [];\n\n    string.replace(regExp, function(str) {\n        matches.push({\n            offset: arguments[arguments.length-2],\n            length: str.length\n        });\n    });\n\n    return matches;\n};\nexports.deferredCall = function(fcn) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var deferred = function(timeout) {\n        deferred.cancel();\n        timer = setTimeout(callback, timeout || 0);\n        return deferred;\n    };\n\n    deferred.schedule = deferred;\n\n    deferred.call = function() {\n        this.cancel();\n        fcn();\n        return deferred;\n    };\n\n    deferred.cancel = function() {\n        clearTimeout(timer);\n        timer = null;\n        return deferred;\n    };\n    \n    deferred.isPending = function() {\n        return timer;\n    };\n\n    return deferred;\n};\n\n\nexports.delayedCall = function(fcn, defaultTimeout) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var _self = function(timeout) {\n        if (timer == null)\n            timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n\n    _self.delay = function(timeout) {\n        timer && clearTimeout(timer);\n        timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n    _self.schedule = _self;\n\n    _self.call = function() {\n        this.cancel();\n        fcn();\n    };\n\n    _self.cancel = function() {\n        timer && clearTimeout(timer);\n        timer = null;\n    };\n\n    _self.isPending = function() {\n        return timer;\n    };\n\n    return _self;\n};\n});\n\nace.define(\"ace/worker/mirror\",[\"require\",\"exports\",\"module\",\"ace/document\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar Document = require(\"../document\").Document;\nvar lang = require(\"../lib/lang\");\n    \nvar Mirror = exports.Mirror = function(sender) {\n    this.sender = sender;\n    var doc = this.doc = new Document(\"\");\n    \n    var deferredUpdate = this.deferredUpdate = lang.delayedCall(this.onUpdate.bind(this));\n    \n    var _self = this;\n    sender.on(\"change\", function(e) {\n        doc.applyDeltas(e.data);\n        if (_self.$timeout)\n            return deferredUpdate.schedule(_self.$timeout);\n        _self.onUpdate();\n    });\n};\n\n(function() {\n    \n    this.$timeout = 500;\n    \n    this.setTimeout = function(timeout) {\n        this.$timeout = timeout;\n    };\n    \n    this.setValue = function(value) {\n        this.doc.setValue(value);\n        this.deferredUpdate.schedule(this.$timeout);\n    };\n    \n    this.getValue = function(callbackId) {\n        this.sender.callback(this.doc.getValue(), callbackId);\n    };\n    \n    this.onUpdate = function() {\n    };\n    \n    this.isPending = function() {\n        return this.deferredUpdate.isPending();\n    };\n    \n}).call(Mirror.prototype);\n\n});\n\nace.define(\"ace/mode/json/json_parse\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\n    var at,     // The index of the current character\n        ch,     // The current character\n        escapee = {\n            '\"':  '\"',\n            '\\\\': '\\\\',\n            '/':  '/',\n            b:    '\\b',\n            f:    '\\f',\n            n:    '\\n',\n            r:    '\\r',\n            t:    '\\t'\n        },\n        text,\n\n        error = function (m) {\n\n            throw {\n                name:    'SyntaxError',\n                message: m,\n                at:      at,\n                text:    text\n            };\n        },\n\n        next = function (c) {\n\n            if (c && c !== ch) {\n                error(\"Expected '\" + c + \"' instead of '\" + ch + \"'\");\n            }\n\n            ch = text.charAt(at);\n            at += 1;\n            return ch;\n        },\n\n        number = function () {\n\n            var number,\n                string = '';\n\n            if (ch === '-') {\n                string = '-';\n                next('-');\n            }\n            while (ch >= '0' && ch <= '9') {\n                string += ch;\n                next();\n            }\n            if (ch === '.') {\n                string += '.';\n                while (next() && ch >= '0' && ch <= '9') {\n                    string += ch;\n                }\n            }\n            if (ch === 'e' || ch === 'E') {\n                string += ch;\n                next();\n                if (ch === '-' || ch === '+') {\n                    string += ch;\n                    next();\n                }\n                while (ch >= '0' && ch <= '9') {\n                    string += ch;\n                    next();\n                }\n            }\n            number = +string;\n            if (isNaN(number)) {\n                error(\"Bad number\");\n            } else {\n                return number;\n            }\n        },\n\n        string = function () {\n\n            var hex,\n                i,\n                string = '',\n                uffff;\n\n            if (ch === '\"') {\n                while (next()) {\n                    if (ch === '\"') {\n                        next();\n                        return string;\n                    } else if (ch === '\\\\') {\n                        next();\n                        if (ch === 'u') {\n                            uffff = 0;\n                            for (i = 0; i < 4; i += 1) {\n                                hex = parseInt(next(), 16);\n                                if (!isFinite(hex)) {\n                                    break;\n                                }\n                                uffff = uffff * 16 + hex;\n                            }\n                            string += String.fromCharCode(uffff);\n                        } else if (typeof escapee[ch] === 'string') {\n                            string += escapee[ch];\n                        } else {\n                            break;\n                        }\n                    } else {\n                        string += ch;\n                    }\n                }\n            }\n            error(\"Bad string\");\n        },\n\n        white = function () {\n\n            while (ch && ch <= ' ') {\n                next();\n            }\n        },\n\n        word = function () {\n\n            switch (ch) {\n            case 't':\n                next('t');\n                next('r');\n                next('u');\n                next('e');\n                return true;\n            case 'f':\n                next('f');\n                next('a');\n                next('l');\n                next('s');\n                next('e');\n                return false;\n            case 'n':\n                next('n');\n                next('u');\n                next('l');\n                next('l');\n                return null;\n            }\n            error(\"Unexpected '\" + ch + \"'\");\n        },\n\n        value,  // Place holder for the value function.\n\n        array = function () {\n\n            var array = [];\n\n            if (ch === '[') {\n                next('[');\n                white();\n                if (ch === ']') {\n                    next(']');\n                    return array;   // empty array\n                }\n                while (ch) {\n                    array.push(value());\n                    white();\n                    if (ch === ']') {\n                        next(']');\n                        return array;\n                    }\n                    next(',');\n                    white();\n                }\n            }\n            error(\"Bad array\");\n        },\n\n        object = function () {\n\n            var key,\n                object = {};\n\n            if (ch === '{') {\n                next('{');\n                white();\n                if (ch === '}') {\n                    next('}');\n                    return object;   // empty object\n                }\n                while (ch) {\n                    key = string();\n                    white();\n                    next(':');\n                    if (Object.hasOwnProperty.call(object, key)) {\n                        error('Duplicate key \"' + key + '\"');\n                    }\n                    object[key] = value();\n                    white();\n                    if (ch === '}') {\n                        next('}');\n                        return object;\n                    }\n                    next(',');\n                    white();\n                }\n            }\n            error(\"Bad object\");\n        };\n\n    value = function () {\n\n        white();\n        switch (ch) {\n        case '{':\n            return object();\n        case '[':\n            return array();\n        case '\"':\n            return string();\n        case '-':\n            return number();\n        default:\n            return ch >= '0' && ch <= '9' ? number() : word();\n        }\n    };\n\n    return function (source, reviver) {\n        var result;\n\n        text = source;\n        at = 0;\n        ch = ' ';\n        result = value();\n        white();\n        if (ch) {\n            error(\"Syntax error\");\n        }\n\n        return typeof reviver === 'function' ? function walk(holder, key) {\n            var k, v, value = holder[key];\n            if (value && typeof value === 'object') {\n                for (k in value) {\n                    if (Object.hasOwnProperty.call(value, k)) {\n                        v = walk(value, k);\n                        if (v !== undefined) {\n                            value[k] = v;\n                        } else {\n                            delete value[k];\n                        }\n                    }\n                }\n            }\n            return reviver.call(holder, key, value);\n        }({'': result}, '') : result;\n    };\n});\n\nace.define(\"ace/mode/json_worker\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/worker/mirror\",\"ace/mode/json/json_parse\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar Mirror = require(\"../worker/mirror\").Mirror;\nvar parse = require(\"./json/json_parse\");\n\nvar JsonWorker = exports.JsonWorker = function(sender) {\n    Mirror.call(this, sender);\n    this.setTimeout(200);\n};\n\noop.inherits(JsonWorker, Mirror);\n\n(function() {\n\n    this.onUpdate = function() {\n        var value = this.doc.getValue();\n\n        try {\n            if (value)\n                parse(value);\n        } catch (e) {\n            var pos = this.doc.indexToPosition(e.at-1);\n            this.sender.emit(\"error\", {\n                row: pos.row,\n                column: pos.column,\n                text: e.message,\n                type: \"error\"\n            });\n            return;\n        }\n        this.sender.emit(\"ok\");\n    };\n\n}).call(JsonWorker.prototype);\n\n});\n\nace.define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\nfunction Empty() {}\n\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function bind(that) { // .length is 1\n        var target = this;\n        if (typeof target != \"function\") {\n            throw new TypeError(\"Function.prototype.bind called on incompatible \" + target);\n        }\n        var args = slice.call(arguments, 1); // for normal call\n        var bound = function () {\n\n            if (this instanceof bound) {\n\n                var result = target.apply(\n                    this,\n                    args.concat(slice.call(arguments))\n                );\n                if (Object(result) === result) {\n                    return result;\n                }\n                return this;\n\n            } else {\n                return target.apply(\n                    that,\n                    args.concat(slice.call(arguments))\n                );\n\n            }\n\n        };\n        if(target.prototype) {\n            Empty.prototype = target.prototype;\n            bound.prototype = new Empty();\n            Empty.prototype = null;\n        }\n        return bound;\n    };\n}\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar _toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n    defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n    defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n    lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n    lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\nif ([1,2].splice(0).length != 2) {\n    if(function() { // test IE < 9 to splice bug - see issue #138\n        function makeArray(l) {\n            var a = new Array(l+2);\n            a[0] = a[1] = 0;\n            return a;\n        }\n        var array = [], lengthBefore;\n        \n        array.splice.apply(array, makeArray(20));\n        array.splice.apply(array, makeArray(26));\n\n        lengthBefore = array.length; //46\n        array.splice(5, 0, \"XXX\"); // add one element\n\n        lengthBefore + 1 == array.length\n\n        if (lengthBefore + 1 == array.length) {\n            return true;// has right splice implementation without bugs\n        }\n    }()) {//IE 6/7\n        var array_splice = Array.prototype.splice;\n        Array.prototype.splice = function(start, deleteCount) {\n            if (!arguments.length) {\n                return [];\n            } else {\n                return array_splice.apply(this, [\n                    start === void 0 ? 0 : start,\n                    deleteCount === void 0 ? (this.length - start) : deleteCount\n                ].concat(slice.call(arguments, 2)))\n            }\n        };\n    } else {//IE8\n        Array.prototype.splice = function(pos, removeCount){\n            var length = this.length;\n            if (pos > 0) {\n                if (pos > length)\n                    pos = length;\n            } else if (pos == void 0) {\n                pos = 0;\n            } else if (pos < 0) {\n                pos = Math.max(length + pos, 0);\n            }\n\n            if (!(pos+removeCount < length))\n                removeCount = length - pos;\n\n            var removed = this.slice(pos, pos+removeCount);\n            var insert = slice.call(arguments, 2);\n            var add = insert.length;            \n            if (pos === length) {\n                if (add) {\n                    this.push.apply(this, insert);\n                }\n            } else {\n                var remove = Math.min(removeCount, length - pos);\n                var tailOldPos = pos + remove;\n                var tailNewPos = tailOldPos + add - remove;\n                var tailCount = length - tailOldPos;\n                var lengthAfterRemove = length - remove;\n\n                if (tailNewPos < tailOldPos) { // case A\n                    for (var i = 0; i < tailCount; ++i) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } else if (tailNewPos > tailOldPos) { // case B\n                    for (i = tailCount; i--; ) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } // else, add == remove (nothing to do)\n\n                if (add && pos === lengthAfterRemove) {\n                    this.length = lengthAfterRemove; // truncate array\n                    this.push.apply(this, insert);\n                } else {\n                    this.length = lengthAfterRemove + add; // reserves space\n                    for (i = 0; i < add; ++i) {\n                        this[pos+i] = insert[i];\n                    }\n                }\n            }\n            return removed;\n        };\n    }\n}\nif (!Array.isArray) {\n    Array.isArray = function isArray(obj) {\n        return _toString(obj) == \"[object Array]\";\n    };\n}\nvar boxedString = Object(\"a\"),\n    splitString = boxedString[0] != \"a\" || !(0 in boxedString);\n\nif (!Array.prototype.forEach) {\n    Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            thisp = arguments[1],\n            i = -1,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        while (++i < length) {\n            if (i in self) {\n                fun.call(thisp, self[i], i, object);\n            }\n        }\n    };\n}\nif (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            result = Array(length),\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self)\n                result[i] = fun.call(thisp, self[i], i, object);\n        }\n        return result;\n    };\n}\nif (!Array.prototype.filter) {\n    Array.prototype.filter = function filter(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                    object,\n            length = self.length >>> 0,\n            result = [],\n            value,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self) {\n                value = self[i];\n                if (fun.call(thisp, value, i, object)) {\n                    result.push(value);\n                }\n            }\n        }\n        return result;\n    };\n}\nif (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && !fun.call(thisp, self[i], i, object)) {\n                return false;\n            }\n        }\n        return true;\n    };\n}\nif (!Array.prototype.some) {\n    Array.prototype.some = function some(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, object)) {\n                return true;\n            }\n        }\n        return false;\n    };\n}\nif (!Array.prototype.reduce) {\n    Array.prototype.reduce = function reduce(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduce of empty array with no initial value\");\n        }\n\n        var i = 0;\n        var result;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i++];\n                    break;\n                }\n                if (++i >= length) {\n                    throw new TypeError(\"reduce of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        for (; i < length; i++) {\n            if (i in self) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        }\n\n        return result;\n    };\n}\nif (!Array.prototype.reduceRight) {\n    Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduceRight of empty array with no initial value\");\n        }\n\n        var result, i = length - 1;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i--];\n                    break;\n                }\n                if (--i < 0) {\n                    throw new TypeError(\"reduceRight of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        do {\n            if (i in this) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        } while (i--);\n\n        return result;\n    };\n}\nif (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {\n    Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n\n        var i = 0;\n        if (arguments.length > 1) {\n            i = toInteger(arguments[1]);\n        }\n        i = i >= 0 ? i : Math.max(0, length + i);\n        for (; i < length; i++) {\n            if (i in self && self[i] === sought) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {\n    Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n        var i = length - 1;\n        if (arguments.length > 1) {\n            i = Math.min(i, toInteger(arguments[1]));\n        }\n        i = i >= 0 ? i : length - Math.abs(i);\n        for (; i >= 0; i--) {\n            if (i in self && sought === self[i]) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Object.getPrototypeOf) {\n    Object.getPrototypeOf = function getPrototypeOf(object) {\n        return object.__proto__ || (\n            object.constructor ?\n            object.constructor.prototype :\n            prototypeOfObject\n        );\n    };\n}\nif (!Object.getOwnPropertyDescriptor) {\n    var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n                         \"non-object: \";\n    Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT + object);\n        if (!owns(object, property))\n            return;\n\n        var descriptor, getter, setter;\n        descriptor =  { enumerable: true, configurable: true };\n        if (supportsAccessors) {\n            var prototype = object.__proto__;\n            object.__proto__ = prototypeOfObject;\n\n            var getter = lookupGetter(object, property);\n            var setter = lookupSetter(object, property);\n            object.__proto__ = prototype;\n\n            if (getter || setter) {\n                if (getter) descriptor.get = getter;\n                if (setter) descriptor.set = setter;\n                return descriptor;\n            }\n        }\n        descriptor.value = object[property];\n        return descriptor;\n    };\n}\nif (!Object.getOwnPropertyNames) {\n    Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n        return Object.keys(object);\n    };\n}\nif (!Object.create) {\n    var createEmpty;\n    if (Object.prototype.__proto__ === null) {\n        createEmpty = function () {\n            return { \"__proto__\": null };\n        };\n    } else {\n        createEmpty = function () {\n            var empty = {};\n            for (var i in empty)\n                empty[i] = null;\n            empty.constructor =\n            empty.hasOwnProperty =\n            empty.propertyIsEnumerable =\n            empty.isPrototypeOf =\n            empty.toLocaleString =\n            empty.toString =\n            empty.valueOf =\n            empty.__proto__ = null;\n            return empty;\n        }\n    }\n\n    Object.create = function create(prototype, properties) {\n        var object;\n        if (prototype === null) {\n            object = createEmpty();\n        } else {\n            if (typeof prototype != \"object\")\n                throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n            var Type = function () {};\n            Type.prototype = prototype;\n            object = new Type();\n            object.__proto__ = prototype;\n        }\n        if (properties !== void 0)\n            Object.defineProperties(object, properties);\n        return object;\n    };\n}\n\nfunction doesDefinePropertyWork(object) {\n    try {\n        Object.defineProperty(object, \"sentinel\", {});\n        return \"sentinel\" in object;\n    } catch (exception) {\n    }\n}\nif (Object.defineProperty) {\n    var definePropertyWorksOnObject = doesDefinePropertyWork({});\n    var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n        doesDefinePropertyWork(document.createElement(\"div\"));\n    if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n        var definePropertyFallback = Object.defineProperty;\n    }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n    var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n    var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n    var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n                                      \"on this javascript engine\";\n\n    Object.defineProperty = function defineProperty(object, property, descriptor) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n        if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n            throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n        if (definePropertyFallback) {\n            try {\n                return definePropertyFallback.call(Object, object, property, descriptor);\n            } catch (exception) {\n            }\n        }\n        if (owns(descriptor, \"value\")) {\n\n            if (supportsAccessors && (lookupGetter(object, property) ||\n                                      lookupSetter(object, property)))\n            {\n                var prototype = object.__proto__;\n                object.__proto__ = prototypeOfObject;\n                delete object[property];\n                object[property] = descriptor.value;\n                object.__proto__ = prototype;\n            } else {\n                object[property] = descriptor.value;\n            }\n        } else {\n            if (!supportsAccessors)\n                throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n            if (owns(descriptor, \"get\"))\n                defineGetter(object, property, descriptor.get);\n            if (owns(descriptor, \"set\"))\n                defineSetter(object, property, descriptor.set);\n        }\n\n        return object;\n    };\n}\nif (!Object.defineProperties) {\n    Object.defineProperties = function defineProperties(object, properties) {\n        for (var property in properties) {\n            if (owns(properties, property))\n                Object.defineProperty(object, property, properties[property]);\n        }\n        return object;\n    };\n}\nif (!Object.seal) {\n    Object.seal = function seal(object) {\n        return object;\n    };\n}\nif (!Object.freeze) {\n    Object.freeze = function freeze(object) {\n        return object;\n    };\n}\ntry {\n    Object.freeze(function () {});\n} catch (exception) {\n    Object.freeze = (function freeze(freezeObject) {\n        return function freeze(object) {\n            if (typeof object == \"function\") {\n                return object;\n            } else {\n                return freezeObject(object);\n            }\n        };\n    })(Object.freeze);\n}\nif (!Object.preventExtensions) {\n    Object.preventExtensions = function preventExtensions(object) {\n        return object;\n    };\n}\nif (!Object.isSealed) {\n    Object.isSealed = function isSealed(object) {\n        return false;\n    };\n}\nif (!Object.isFrozen) {\n    Object.isFrozen = function isFrozen(object) {\n        return false;\n    };\n}\nif (!Object.isExtensible) {\n    Object.isExtensible = function isExtensible(object) {\n        if (Object(object) === object) {\n            throw new TypeError(); // TODO message\n        }\n        var name = '';\n        while (owns(object, name)) {\n            name += '?';\n        }\n        object[name] = true;\n        var returnValue = owns(object, name);\n        delete object[name];\n        return returnValue;\n    };\n}\nif (!Object.keys) {\n    var hasDontEnumBug = true,\n        dontEnums = [\n            \"toString\",\n            \"toLocaleString\",\n            \"valueOf\",\n            \"hasOwnProperty\",\n            \"isPrototypeOf\",\n            \"propertyIsEnumerable\",\n            \"constructor\"\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    for (var key in {\"toString\": null}) {\n        hasDontEnumBug = false;\n    }\n\n    Object.keys = function keys(object) {\n\n        if (\n            (typeof object != \"object\" && typeof object != \"function\") ||\n            object === null\n        ) {\n            throw new TypeError(\"Object.keys called on a non-object\");\n        }\n\n        var keys = [];\n        for (var name in object) {\n            if (owns(object, name)) {\n                keys.push(name);\n            }\n        }\n\n        if (hasDontEnumBug) {\n            for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n                var dontEnum = dontEnums[i];\n                if (owns(object, dontEnum)) {\n                    keys.push(dontEnum);\n                }\n            }\n        }\n        return keys;\n    };\n\n}\nif (!Date.now) {\n    Date.now = function now() {\n        return new Date().getTime();\n    };\n}\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n    \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n    \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n    ws = \"[\" + ws + \"]\";\n    var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n        trimEndRegexp = new RegExp(ws + ws + \"*$\");\n    String.prototype.trim = function trim() {\n        return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n    };\n}\n\nfunction toInteger(n) {\n    n = +n;\n    if (n !== n) { // isNaN\n        n = 0;\n    } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {\n        n = (n > 0 || -1) * Math.floor(Math.abs(n));\n    }\n    return n;\n}\n\nfunction isPrimitive(input) {\n    var type = typeof input;\n    return (\n        input === null ||\n        type === \"undefined\" ||\n        type === \"boolean\" ||\n        type === \"number\" ||\n        type === \"string\"\n    );\n}\n\nfunction toPrimitive(input) {\n    var val, valueOf, toString;\n    if (isPrimitive(input)) {\n        return input;\n    }\n    valueOf = input.valueOf;\n    if (typeof valueOf === \"function\") {\n        val = valueOf.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    toString = input.toString;\n    if (typeof toString === \"function\") {\n        val = toString.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    throw new TypeError();\n}\nvar toObject = function (o) {\n    if (o == null) { // this matches both null and undefined\n        throw new TypeError(\"can't convert \"+o+\" to object\");\n    }\n    return Object(o);\n};\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/worker-lua.js",
    "content": "\"no use strict\";\n;(function(window) {\nif (typeof window.window != \"undefined\" && window.document) {\n    return;\n}\n\nwindow.console = function() {\n    var msgs = Array.prototype.slice.call(arguments, 0);\n    postMessage({type: \"log\", data: msgs});\n};\nwindow.console.error =\nwindow.console.warn = \nwindow.console.log =\nwindow.console.trace = window.console;\n\nwindow.window = window;\nwindow.ace = window;\n\nwindow.onerror = function(message, file, line, col, err) {\n    postMessage({type: \"error\", data: {\n        message: message,\n        file: file,\n        line: line, \n        col: col,\n        stack: err.stack\n    }});\n};\n\nwindow.normalizeModule = function(parentId, moduleName) {\n    // normalize plugin requires\n    if (moduleName.indexOf(\"!\") !== -1) {\n        var chunks = moduleName.split(\"!\");\n        return window.normalizeModule(parentId, chunks[0]) + \"!\" + window.normalizeModule(parentId, chunks[1]);\n    }\n    // normalize relative requires\n    if (moduleName.charAt(0) == \".\") {\n        var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n        moduleName = (base ? base + \"/\" : \"\") + moduleName;\n        \n        while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n            var previous = moduleName;\n            moduleName = moduleName.replace(/^\\.\\//, \"\").replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n        }\n    }\n    \n    return moduleName;\n};\n\nwindow.require = function(parentId, id) {\n    if (!id) {\n        id = parentId;\n        parentId = null;\n    }\n    if (!id.charAt)\n        throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");\n\n    id = window.normalizeModule(parentId, id);\n\n    var module = window.require.modules[id];\n    if (module) {\n        if (!module.initialized) {\n            module.initialized = true;\n            module.exports = module.factory().exports;\n        }\n        return module.exports;\n    }\n    \n    var chunks = id.split(\"/\");\n    if (!window.require.tlns)\n        return console.log(\"unable to load \" + id);\n    chunks[0] = window.require.tlns[chunks[0]] || chunks[0];\n    var path = chunks.join(\"/\") + \".js\";\n    \n    window.require.id = id;\n    importScripts(path);\n    return window.require(parentId, id);\n};\nwindow.require.modules = {};\nwindow.require.tlns = {};\n\nwindow.define = function(id, deps, factory) {\n    if (arguments.length == 2) {\n        factory = deps;\n        if (typeof id != \"string\") {\n            deps = id;\n            id = window.require.id;\n        }\n    } else if (arguments.length == 1) {\n        factory = id;\n        deps = [];\n        id = window.require.id;\n    }\n    \n    if (typeof factory != \"function\") {\n        window.require.modules[id] = {\n            exports: factory,\n            initialized: true\n        };\n        return;\n    }\n\n    if (!deps.length)\n        // If there is no dependencies, we inject 'require', 'exports' and\n        // 'module' as dependencies, to provide CommonJS compatibility.\n        deps = ['require', 'exports', 'module'];\n\n    var req = function(childId) {\n        return window.require(id, childId);\n    };\n\n    window.require.modules[id] = {\n        exports: {},\n        factory: function() {\n            var module = this;\n            var returnExports = factory.apply(this, deps.map(function(dep) {\n              switch(dep) {\n                  // Because 'require', 'exports' and 'module' aren't actual\n                  // dependencies, we must handle them seperately.\n                  case 'require': return req;\n                  case 'exports': return module.exports;\n                  case 'module':  return module;\n                  // But for all other dependencies, we can just go ahead and\n                  // require them.\n                  default:        return req(dep);\n              }\n            }));\n            if (returnExports)\n                module.exports = returnExports;\n            return module;\n        }\n    };\n};\nwindow.define.amd = {};\n\nwindow.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n    require.tlns = topLevelNamespaces;\n};\n\nwindow.initSender = function initSender() {\n\n    var EventEmitter = window.require(\"ace/lib/event_emitter\").EventEmitter;\n    var oop = window.require(\"ace/lib/oop\");\n    \n    var Sender = function() {};\n    \n    (function() {\n        \n        oop.implement(this, EventEmitter);\n                \n        this.callback = function(data, callbackId) {\n            postMessage({\n                type: \"call\",\n                id: callbackId,\n                data: data\n            });\n        };\n    \n        this.emit = function(name, data) {\n            postMessage({\n                type: \"event\",\n                name: name,\n                data: data\n            });\n        };\n        \n    }).call(Sender.prototype);\n    \n    return new Sender();\n};\n\nvar main = window.main = null;\nvar sender = window.sender = null;\n\nwindow.onmessage = function(e) {\n    var msg = e.data;\n    if (msg.command) {\n        if (main[msg.command])\n            main[msg.command].apply(main, msg.args);\n        else\n            throw new Error(\"Unknown command:\" + msg.command);\n    }\n    else if (msg.init) {        \n        initBaseUrls(msg.tlns);\n        require(\"ace/lib/es5-shim\");\n        sender = window.sender = initSender();\n        var clazz = require(msg.module)[msg.classname];\n        main = window.main = new clazz(sender);\n    } \n    else if (msg.event && sender) {\n        sender._signal(msg.event, msg.data);\n    }\n};\n})(this);\n\nace.define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.inherits = function(ctor, 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\nexports.mixin = function(obj, mixin) {\n    for (var key in mixin) {\n        obj[key] = mixin[key];\n    }\n    return obj;\n};\n\nexports.implement = function(proto, mixin) {\n    exports.mixin(proto, mixin);\n};\n\n});\n\nace.define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nvar EventEmitter = {};\nvar stopPropagation = function() { this.propagationStopped = true; };\nvar preventDefault = function() { this.defaultPrevented = true; };\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n    this._eventRegistry || (this._eventRegistry = {});\n    this._defaultHandlers || (this._defaultHandlers = {});\n\n    var listeners = this._eventRegistry[eventName] || [];\n    var defaultHandler = this._defaultHandlers[eventName];\n    if (!listeners.length && !defaultHandler)\n        return;\n\n    if (typeof e != \"object\" || !e)\n        e = {};\n\n    if (!e.type)\n        e.type = eventName;\n    if (!e.stopPropagation)\n        e.stopPropagation = stopPropagation;\n    if (!e.preventDefault)\n        e.preventDefault = preventDefault;\n\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++) {\n        listeners[i](e, this);\n        if (e.propagationStopped)\n            break;\n    }\n    \n    if (defaultHandler && !e.defaultPrevented)\n        return defaultHandler(e, this);\n};\n\n\nEventEmitter._signal = function(eventName, e) {\n    var listeners = (this._eventRegistry || {})[eventName];\n    if (!listeners)\n        return;\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++)\n        listeners[i](e, this);\n};\n\nEventEmitter.once = function(eventName, callback) {\n    var _self = this;\n    callback && this.addEventListener(eventName, function newCallback() {\n        _self.removeEventListener(eventName, newCallback);\n        callback.apply(null, arguments);\n    });\n};\n\n\nEventEmitter.setDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        handlers = this._defaultHandlers = {_disabled_: {}};\n    \n    if (handlers[eventName]) {\n        var old = handlers[eventName];\n        var disabled = handlers._disabled_[eventName];\n        if (!disabled)\n            handlers._disabled_[eventName] = disabled = [];\n        disabled.push(old);\n        var i = disabled.indexOf(callback);\n        if (i != -1) \n            disabled.splice(i, 1);\n    }\n    handlers[eventName] = callback;\n};\nEventEmitter.removeDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        return;\n    var disabled = handlers._disabled_[eventName];\n    \n    if (handlers[eventName] == callback) {\n        var old = handlers[eventName];\n        if (disabled)\n            this.setDefaultHandler(eventName, disabled.pop());\n    } else if (disabled) {\n        var i = disabled.indexOf(callback);\n        if (i != -1)\n            disabled.splice(i, 1);\n    }\n};\n\nEventEmitter.on =\nEventEmitter.addEventListener = function(eventName, callback, capturing) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        listeners = this._eventRegistry[eventName] = [];\n\n    if (listeners.indexOf(callback) == -1)\n        listeners[capturing ? \"unshift\" : \"push\"](callback);\n    return callback;\n};\n\nEventEmitter.off =\nEventEmitter.removeListener =\nEventEmitter.removeEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        return;\n\n    var index = listeners.indexOf(callback);\n    if (index !== -1)\n        listeners.splice(index, 1);\n};\n\nEventEmitter.removeAllListeners = function(eventName) {\n    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n};\n\nexports.EventEmitter = EventEmitter;\n\n});\n\nace.define(\"ace/range\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nvar comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n    this.start = {\n        row: startRow,\n        column: startColumn\n    };\n\n    this.end = {\n        row: endRow,\n        column: endColumn\n    };\n};\n\n(function() {\n    this.isEqual = function(range) {\n        return this.start.row === range.start.row &&\n            this.end.row === range.end.row &&\n            this.start.column === range.start.column &&\n            this.end.column === range.end.column;\n    };\n    this.toString = function() {\n        return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n            \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n    };\n\n    this.contains = function(row, column) {\n        return this.compare(row, column) == 0;\n    };\n    this.compareRange = function(range) {\n        var cmp,\n            end = range.end,\n            start = range.start;\n\n        cmp = this.compare(end.row, end.column);\n        if (cmp == 1) {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == 1) {\n                return 2;\n            } else if (cmp == 0) {\n                return 1;\n            } else {\n                return 0;\n            }\n        } else if (cmp == -1) {\n            return -2;\n        } else {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == -1) {\n                return -1;\n            } else if (cmp == 1) {\n                return 42;\n            } else {\n                return 0;\n            }\n        }\n    };\n    this.comparePoint = function(p) {\n        return this.compare(p.row, p.column);\n    };\n    this.containsRange = function(range) {\n        return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n    };\n    this.intersects = function(range) {\n        var cmp = this.compareRange(range);\n        return (cmp == -1 || cmp == 0 || cmp == 1);\n    };\n    this.isEnd = function(row, column) {\n        return this.end.row == row && this.end.column == column;\n    };\n    this.isStart = function(row, column) {\n        return this.start.row == row && this.start.column == column;\n    };\n    this.setStart = function(row, column) {\n        if (typeof row == \"object\") {\n            this.start.column = row.column;\n            this.start.row = row.row;\n        } else {\n            this.start.row = row;\n            this.start.column = column;\n        }\n    };\n    this.setEnd = function(row, column) {\n        if (typeof row == \"object\") {\n            this.end.column = row.column;\n            this.end.row = row.row;\n        } else {\n            this.end.row = row;\n            this.end.column = column;\n        }\n    };\n    this.inside = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column) || this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideStart = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideEnd = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.compare = function(row, column) {\n        if (!this.isMultiLine()) {\n            if (row === this.start.row) {\n                return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n            };\n        }\n\n        if (row < this.start.row)\n            return -1;\n\n        if (row > this.end.row)\n            return 1;\n\n        if (this.start.row === row)\n            return column >= this.start.column ? 0 : -1;\n\n        if (this.end.row === row)\n            return column <= this.end.column ? 0 : 1;\n\n        return 0;\n    };\n    this.compareStart = function(row, column) {\n        if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareEnd = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareInside = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.clipRows = function(firstRow, lastRow) {\n        if (this.end.row > lastRow)\n            var end = {row: lastRow + 1, column: 0};\n        else if (this.end.row < firstRow)\n            var end = {row: firstRow, column: 0};\n\n        if (this.start.row > lastRow)\n            var start = {row: lastRow + 1, column: 0};\n        else if (this.start.row < firstRow)\n            var start = {row: firstRow, column: 0};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n    this.extend = function(row, column) {\n        var cmp = this.compare(row, column);\n\n        if (cmp == 0)\n            return this;\n        else if (cmp == -1)\n            var start = {row: row, column: column};\n        else\n            var end = {row: row, column: column};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n\n    this.isEmpty = function() {\n        return (this.start.row === this.end.row && this.start.column === this.end.column);\n    };\n    this.isMultiLine = function() {\n        return (this.start.row !== this.end.row);\n    };\n    this.clone = function() {\n        return Range.fromPoints(this.start, this.end);\n    };\n    this.collapseRows = function() {\n        if (this.end.column == 0)\n            return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)\n        else\n            return new Range(this.start.row, 0, this.end.row, 0)\n    };\n    this.toScreenRange = function(session) {\n        var screenPosStart = session.documentToScreenPosition(this.start);\n        var screenPosEnd = session.documentToScreenPosition(this.end);\n\n        return new Range(\n            screenPosStart.row, screenPosStart.column,\n            screenPosEnd.row, screenPosEnd.column\n        );\n    };\n    this.moveBy = function(row, column) {\n        this.start.row += row;\n        this.start.column += column;\n        this.end.row += row;\n        this.end.column += column;\n    };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n    return new Range(start.row, start.column, end.row, end.column);\n};\nRange.comparePoints = comparePoints;\n\nRange.comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\n\n\nexports.Range = Range;\n});\n\nace.define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n    this.$onChange = this.onChange.bind(this);\n    this.attach(doc);\n    \n    if (typeof column == \"undefined\")\n        this.setPosition(row.row, row.column);\n    else\n        this.setPosition(row, column);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.getPosition = function() {\n        return this.$clipPositionToDocument(this.row, this.column);\n    };\n    this.getDocument = function() {\n        return this.document;\n    };\n    this.$insertRight = false;\n    this.onChange = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n\n        if (range.start.row == range.end.row && range.start.row != this.row)\n            return;\n\n        if (range.start.row > this.row)\n            return;\n\n        if (range.start.row == this.row && range.start.column > this.column)\n            return;\n\n        var row = this.row;\n        var column = this.column;\n        var start = range.start;\n        var end = range.end;\n\n        if (delta.action === \"insertText\") {\n            if (start.row === row && start.column <= column) {\n                if (start.column === column && this.$insertRight) {\n                } else if (start.row === end.row) {\n                    column += end.column - start.column;\n                } else {\n                    column -= start.column;\n                    row += end.row - start.row;\n                }\n            } else if (start.row !== end.row && start.row < row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"insertLines\") {\n            if (start.row === row && column === 0 && this.$insertRight) {\n            }\n            else if (start.row <= row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"removeText\") {\n            if (start.row === row && start.column < column) {\n                if (end.column >= column)\n                    column = start.column;\n                else\n                    column = Math.max(0, column - (end.column - start.column));\n\n            } else if (start.row !== end.row && start.row < row) {\n                if (end.row === row)\n                    column = Math.max(0, column - end.column) + start.column;\n                row -= (end.row - start.row);\n            } else if (end.row === row) {\n                row -= end.row - start.row;\n                column = Math.max(0, column - end.column) + start.column;\n            }\n        } else if (delta.action == \"removeLines\") {\n            if (start.row <= row) {\n                if (end.row <= row)\n                    row -= end.row - start.row;\n                else {\n                    row = start.row;\n                    column = 0;\n                }\n            }\n        }\n\n        this.setPosition(row, column, true);\n    };\n    this.setPosition = function(row, column, noClip) {\n        var pos;\n        if (noClip) {\n            pos = {\n                row: row,\n                column: column\n            };\n        } else {\n            pos = this.$clipPositionToDocument(row, column);\n        }\n\n        if (this.row == pos.row && this.column == pos.column)\n            return;\n\n        var old = {\n            row: this.row,\n            column: this.column\n        };\n\n        this.row = pos.row;\n        this.column = pos.column;\n        this._signal(\"change\", {\n            old: old,\n            value: pos\n        });\n    };\n    this.detach = function() {\n        this.document.removeEventListener(\"change\", this.$onChange);\n    };\n    this.attach = function(doc) {\n        this.document = doc || this.document;\n        this.document.on(\"change\", this.$onChange);\n    };\n    this.$clipPositionToDocument = function(row, column) {\n        var pos = {};\n\n        if (row >= this.document.getLength()) {\n            pos.row = Math.max(0, this.document.getLength() - 1);\n            pos.column = this.document.getLine(pos.row).length;\n        }\n        else if (row < 0) {\n            pos.row = 0;\n            pos.column = 0;\n        }\n        else {\n            pos.row = row;\n            pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n        }\n\n        if (column < 0)\n            pos.column = 0;\n\n        return pos;\n    };\n\n}).call(Anchor.prototype);\n\n});\n\nace.define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\nvar Document = function(text) {\n    this.$lines = [];\n    if (text.length === 0) {\n        this.$lines = [\"\"];\n    } else if (Array.isArray(text)) {\n        this._insertLines(0, text);\n    } else {\n        this.insert({row: 0, column:0}, text);\n    }\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setValue = function(text) {\n        var len = this.getLength();\n        this.remove(new Range(0, 0, len, this.getLine(len-1).length));\n        this.insert({row: 0, column:0}, text);\n    };\n    this.getValue = function() {\n        return this.getAllLines().join(this.getNewLineCharacter());\n    };\n    this.createAnchor = function(row, column) {\n        return new Anchor(this, row, column);\n    };\n    if (\"aaa\".split(/a/).length === 0)\n        this.$split = function(text) {\n            return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n        };\n    else\n        this.$split = function(text) {\n            return text.split(/\\r\\n|\\r|\\n/);\n        };\n\n\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n        this.$autoNewLine = match ? match[1] : \"\\n\";\n        this._signal(\"changeNewLineMode\");\n    };\n    this.getNewLineCharacter = function() {\n        switch (this.$newLineMode) {\n          case \"windows\":\n            return \"\\r\\n\";\n          case \"unix\":\n            return \"\\n\";\n          default:\n            return this.$autoNewLine || \"\\n\";\n        }\n    };\n\n    this.$autoNewLine = \"\";\n    this.$newLineMode = \"auto\";\n    this.setNewLineMode = function(newLineMode) {\n        if (this.$newLineMode === newLineMode)\n            return;\n\n        this.$newLineMode = newLineMode;\n        this._signal(\"changeNewLineMode\");\n    };\n    this.getNewLineMode = function() {\n        return this.$newLineMode;\n    };\n    this.isNewLine = function(text) {\n        return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n    };\n    this.getLine = function(row) {\n        return this.$lines[row] || \"\";\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.$lines.slice(firstRow, lastRow + 1);\n    };\n    this.getAllLines = function() {\n        return this.getLines(0, this.getLength());\n    };\n    this.getLength = function() {\n        return this.$lines.length;\n    };\n    this.getTextRange = function(range) {\n        if (range.start.row == range.end.row) {\n            return this.getLine(range.start.row)\n                .substring(range.start.column, range.end.column);\n        }\n        var lines = this.getLines(range.start.row, range.end.row);\n        lines[0] = (lines[0] || \"\").substring(range.start.column);\n        var l = lines.length - 1;\n        if (range.end.row - range.start.row == l)\n            lines[l] = lines[l].substring(0, range.end.column);\n        return lines.join(this.getNewLineCharacter());\n    };\n\n    this.$clipPosition = function(position) {\n        var length = this.getLength();\n        if (position.row >= length) {\n            position.row = Math.max(0, length - 1);\n            position.column = this.getLine(length-1).length;\n        } else if (position.row < 0)\n            position.row = 0;\n        return position;\n    };\n    this.insert = function(position, text) {\n        if (!text || text.length === 0)\n            return position;\n\n        position = this.$clipPosition(position);\n        if (this.getLength() <= 1)\n            this.$detectNewLine(text);\n\n        var lines = this.$split(text);\n        var firstLine = lines.splice(0, 1)[0];\n        var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];\n\n        position = this.insertInLine(position, firstLine);\n        if (lastLine !== null) {\n            position = this.insertNewLine(position); // terminate first line\n            position = this._insertLines(position.row, lines);\n            position = this.insertInLine(position, lastLine || \"\");\n        }\n        return position;\n    };\n    this.insertLines = function(row, lines) {\n        if (row >= this.getLength())\n            return this.insert({row: row, column: 0}, \"\\n\" + lines.join(\"\\n\"));\n        return this._insertLines(Math.max(row, 0), lines);\n    };\n    this._insertLines = function(row, lines) {\n        if (lines.length == 0)\n            return {row: row, column: 0};\n        while (lines.length > 0xF000) {\n            var end = this._insertLines(row, lines.slice(0, 0xF000));\n            lines = lines.slice(0xF000);\n            row = end.row;\n        }\n\n        var args = [row, 0];\n        args.push.apply(args, lines);\n        this.$lines.splice.apply(this.$lines, args);\n\n        var range = new Range(row, 0, row + lines.length, 0);\n        var delta = {\n            action: \"insertLines\",\n            range: range,\n            lines: lines\n        };\n        this._signal(\"change\", { data: delta });\n        return range.end;\n    };\n    this.insertNewLine = function(position) {\n        position = this.$clipPosition(position);\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column);\n        this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));\n\n        var end = {\n            row : position.row + 1,\n            column : 0\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: this.getNewLineCharacter()\n        };\n        this._signal(\"change\", { data: delta });\n\n        return end;\n    };\n    this.insertInLine = function(position, text) {\n        if (text.length == 0)\n            return position;\n\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column) + text\n                + line.substring(position.column);\n\n        var end = {\n            row : position.row,\n            column : position.column + text.length\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: text\n        };\n        this._signal(\"change\", { data: delta });\n\n        return end;\n    };\n    this.remove = function(range) {\n        if (!(range instanceof Range))\n            range = Range.fromPoints(range.start, range.end);\n        range.start = this.$clipPosition(range.start);\n        range.end = this.$clipPosition(range.end);\n\n        if (range.isEmpty())\n            return range.start;\n\n        var firstRow = range.start.row;\n        var lastRow = range.end.row;\n\n        if (range.isMultiLine()) {\n            var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;\n            var lastFullRow = lastRow - 1;\n\n            if (range.end.column > 0)\n                this.removeInLine(lastRow, 0, range.end.column);\n\n            if (lastFullRow >= firstFullRow)\n                this._removeLines(firstFullRow, lastFullRow);\n\n            if (firstFullRow != firstRow) {\n                this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);\n                this.removeNewLine(range.start.row);\n            }\n        }\n        else {\n            this.removeInLine(firstRow, range.start.column, range.end.column);\n        }\n        return range.start;\n    };\n    this.removeInLine = function(row, startColumn, endColumn) {\n        if (startColumn == endColumn)\n            return;\n\n        var range = new Range(row, startColumn, row, endColumn);\n        var line = this.getLine(row);\n        var removed = line.substring(startColumn, endColumn);\n        var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);\n        this.$lines.splice(row, 1, newLine);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: removed\n        };\n        this._signal(\"change\", { data: delta });\n        return range.start;\n    };\n    this.removeLines = function(firstRow, lastRow) {\n        if (firstRow < 0 || lastRow >= this.getLength())\n            return this.remove(new Range(firstRow, 0, lastRow + 1, 0));\n        return this._removeLines(firstRow, lastRow);\n    };\n\n    this._removeLines = function(firstRow, lastRow) {\n        var range = new Range(firstRow, 0, lastRow + 1, 0);\n        var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);\n\n        var delta = {\n            action: \"removeLines\",\n            range: range,\n            nl: this.getNewLineCharacter(),\n            lines: removed\n        };\n        this._signal(\"change\", { data: delta });\n        return removed;\n    };\n    this.removeNewLine = function(row) {\n        var firstLine = this.getLine(row);\n        var secondLine = this.getLine(row+1);\n\n        var range = new Range(row, firstLine.length, row+1, 0);\n        var line = firstLine + secondLine;\n\n        this.$lines.splice(row, 2, line);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: this.getNewLineCharacter()\n        };\n        this._signal(\"change\", { data: delta });\n    };\n    this.replace = function(range, text) {\n        if (!(range instanceof Range))\n            range = Range.fromPoints(range.start, range.end);\n        if (text.length == 0 && range.isEmpty())\n            return range.start;\n        if (text == this.getTextRange(range))\n            return range.end;\n\n        this.remove(range);\n        if (text) {\n            var end = this.insert(range.start, text);\n        }\n        else {\n            end = range.start;\n        }\n\n        return end;\n    };\n    this.applyDeltas = function(deltas) {\n        for (var i=0; i<deltas.length; i++) {\n            var delta = deltas[i];\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"insertText\")\n                this.insert(range.start, delta.text);\n            else if (delta.action == \"removeLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"removeText\")\n                this.remove(range);\n        }\n    };\n    this.revertDeltas = function(deltas) {\n        for (var i=deltas.length-1; i>=0; i--) {\n            var delta = deltas[i];\n\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"insertText\")\n                this.remove(range);\n            else if (delta.action == \"removeLines\")\n                this._insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"removeText\")\n                this.insert(range.start, delta.text);\n        }\n    };\n    this.indexToPosition = function(index, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        for (var i = startRow || 0, l = lines.length; i < l; i++) {\n            index -= lines[i].length + newlineLength;\n            if (index < 0)\n                return {row: i, column: index + lines[i].length + newlineLength};\n        }\n        return {row: l-1, column: lines[l-1].length};\n    };\n    this.positionToIndex = function(pos, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        var index = 0;\n        var row = Math.min(pos.row, lines.length);\n        for (var i = startRow || 0; i < row; ++i)\n            index += lines[i].length + newlineLength;\n\n        return index + pos.column;\n    };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\nace.define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.last = function(a) {\n    return a[a.length - 1];\n};\n\nexports.stringReverse = function(string) {\n    return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n    var result = '';\n    while (count > 0) {\n        if (count & 1)\n            result += string;\n\n        if (count >>= 1)\n            string += string;\n    }\n    return result;\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n    return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n    return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n    var copy = {};\n    for (var key in obj) {\n        copy[key] = obj[key];\n    }\n    return copy;\n};\n\nexports.copyArray = function(array){\n    var copy = [];\n    for (var i=0, l=array.length; i<l; i++) {\n        if (array[i] && typeof array[i] == \"object\")\n            copy[i] = this.copyObject( array[i] );\n        else \n            copy[i] = array[i];\n    }\n    return copy;\n};\n\nexports.deepCopy = function (obj) {\n    if (typeof obj !== \"object\" || !obj)\n        return obj;\n    var cons = obj.constructor;\n    if (cons === RegExp)\n        return obj;\n    \n    var copy = cons();\n    for (var key in obj) {\n        if (typeof obj[key] === \"object\") {\n            copy[key] = exports.deepCopy(obj[key]);\n        } else {\n            copy[key] = obj[key];\n        }\n    }\n    return copy;\n};\n\nexports.arrayToMap = function(arr) {\n    var map = {};\n    for (var i=0; i<arr.length; i++) {\n        map[arr[i]] = 1;\n    }\n    return map;\n\n};\n\nexports.createMap = function(props) {\n    var map = Object.create(null);\n    for (var i in props) {\n        map[i] = props[i];\n    }\n    return map;\n};\nexports.arrayRemove = function(array, value) {\n  for (var i = 0; i <= array.length; i++) {\n    if (value === array[i]) {\n      array.splice(i, 1);\n    }\n  }\n};\n\nexports.escapeRegExp = function(str) {\n    return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n};\n\nexports.escapeHTML = function(str) {\n    return str.replace(/&/g, \"&#38;\").replace(/\"/g, \"&#34;\").replace(/'/g, \"&#39;\").replace(/</g, \"&#60;\");\n};\n\nexports.getMatchOffsets = function(string, regExp) {\n    var matches = [];\n\n    string.replace(regExp, function(str) {\n        matches.push({\n            offset: arguments[arguments.length-2],\n            length: str.length\n        });\n    });\n\n    return matches;\n};\nexports.deferredCall = function(fcn) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var deferred = function(timeout) {\n        deferred.cancel();\n        timer = setTimeout(callback, timeout || 0);\n        return deferred;\n    };\n\n    deferred.schedule = deferred;\n\n    deferred.call = function() {\n        this.cancel();\n        fcn();\n        return deferred;\n    };\n\n    deferred.cancel = function() {\n        clearTimeout(timer);\n        timer = null;\n        return deferred;\n    };\n    \n    deferred.isPending = function() {\n        return timer;\n    };\n\n    return deferred;\n};\n\n\nexports.delayedCall = function(fcn, defaultTimeout) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var _self = function(timeout) {\n        if (timer == null)\n            timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n\n    _self.delay = function(timeout) {\n        timer && clearTimeout(timer);\n        timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n    _self.schedule = _self;\n\n    _self.call = function() {\n        this.cancel();\n        fcn();\n    };\n\n    _self.cancel = function() {\n        timer && clearTimeout(timer);\n        timer = null;\n    };\n\n    _self.isPending = function() {\n        return timer;\n    };\n\n    return _self;\n};\n});\n\nace.define(\"ace/worker/mirror\",[\"require\",\"exports\",\"module\",\"ace/document\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar Document = require(\"../document\").Document;\nvar lang = require(\"../lib/lang\");\n    \nvar Mirror = exports.Mirror = function(sender) {\n    this.sender = sender;\n    var doc = this.doc = new Document(\"\");\n    \n    var deferredUpdate = this.deferredUpdate = lang.delayedCall(this.onUpdate.bind(this));\n    \n    var _self = this;\n    sender.on(\"change\", function(e) {\n        doc.applyDeltas(e.data);\n        if (_self.$timeout)\n            return deferredUpdate.schedule(_self.$timeout);\n        _self.onUpdate();\n    });\n};\n\n(function() {\n    \n    this.$timeout = 500;\n    \n    this.setTimeout = function(timeout) {\n        this.$timeout = timeout;\n    };\n    \n    this.setValue = function(value) {\n        this.doc.setValue(value);\n        this.deferredUpdate.schedule(this.$timeout);\n    };\n    \n    this.getValue = function(callbackId) {\n        this.sender.callback(this.doc.getValue(), callbackId);\n    };\n    \n    this.onUpdate = function() {\n    };\n    \n    this.isPending = function() {\n        return this.deferredUpdate.isPending();\n    };\n    \n}).call(Mirror.prototype);\n\n});\n\nace.define(\"ace/mode/lua/luaparse\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\n(function (root, name, factory) {\n   factory(exports)\n}(this, 'luaparse', function (exports) {\n  'use strict';\n\n  exports.version = '0.1.4';\n\n  var input, options, length;\n  var defaultOptions = exports.defaultOptions = {\n      wait: false\n    , comments: true\n    , scope: false\n    , locations: false\n    , ranges: false\n  };\n\n  var EOF = 1, StringLiteral = 2, Keyword = 4, Identifier = 8\n    , NumericLiteral = 16, Punctuator = 32, BooleanLiteral = 64\n    , NilLiteral = 128, VarargLiteral = 256;\n\n  exports.tokenTypes = { EOF: EOF, StringLiteral: StringLiteral\n    , Keyword: Keyword, Identifier: Identifier, NumericLiteral: NumericLiteral\n    , Punctuator: Punctuator, BooleanLiteral: BooleanLiteral\n    , NilLiteral: NilLiteral, VarargLiteral: VarargLiteral\n  };\n\n  var errors = exports.errors = {\n      unexpected: 'Unexpected %1 \\'%2\\' near \\'%3\\''\n    , expected: '\\'%1\\' expected near \\'%2\\''\n    , expectedToken: '%1 expected near \\'%2\\''\n    , unfinishedString: 'unfinished string near \\'%1\\''\n    , malformedNumber: 'malformed number near \\'%1\\''\n  };\n\n  var ast = exports.ast = {\n      labelStatement: function(label) {\n      return {\n          type: 'LabelStatement'\n        , label: label\n      };\n    }\n\n    , breakStatement: function() {\n      return {\n          type: 'BreakStatement'\n      };\n    }\n\n    , gotoStatement: function(label) {\n      return {\n          type: 'GotoStatement'\n        , label: label\n      };\n    }\n\n    , returnStatement: function(args) {\n      return {\n          type: 'ReturnStatement'\n        , 'arguments': args\n      };\n    }\n\n    , ifStatement: function(clauses) {\n      return {\n          type: 'IfStatement'\n        , clauses: clauses\n      };\n    }\n    , ifClause: function(condition, body) {\n      return {\n          type: 'IfClause'\n        , condition: condition\n        , body: body\n      };\n    }\n    , elseifClause: function(condition, body) {\n      return {\n          type: 'ElseifClause'\n        , condition: condition\n        , body: body\n      };\n    }\n    , elseClause: function(body) {\n      return {\n          type: 'ElseClause'\n        , body: body\n      };\n    }\n\n    , whileStatement: function(condition, body) {\n      return {\n          type: 'WhileStatement'\n        , condition: condition\n        , body: body\n      };\n    }\n\n    , doStatement: function(body) {\n      return {\n          type: 'DoStatement'\n        , body: body\n      };\n    }\n\n    , repeatStatement: function(condition, body) {\n      return {\n          type: 'RepeatStatement'\n        , condition: condition\n        , body: body\n      };\n    }\n\n    , localStatement: function(variables, init) {\n      return {\n          type: 'LocalStatement'\n        , variables: variables\n        , init: init\n      };\n    }\n\n    , assignmentStatement: function(variables, init) {\n      return {\n          type: 'AssignmentStatement'\n        , variables: variables\n        , init: init\n      };\n    }\n\n    , callStatement: function(expression) {\n      return {\n          type: 'CallStatement'\n        , expression: expression\n      };\n    }\n\n    , functionStatement: function(identifier, parameters, isLocal, body) {\n      return {\n          type: 'FunctionDeclaration'\n        , identifier: identifier\n        , isLocal: isLocal\n        , parameters: parameters\n        , body: body\n      };\n    }\n\n    , forNumericStatement: function(variable, start, end, step, body) {\n      return {\n          type: 'ForNumericStatement'\n        , variable: variable\n        , start: start\n        , end: end\n        , step: step\n        , body: body\n      };\n    }\n\n    , forGenericStatement: function(variables, iterators, body) {\n      return {\n          type: 'ForGenericStatement'\n        , variables: variables\n        , iterators: iterators\n        , body: body\n      };\n    }\n\n    , chunk: function(body) {\n      return {\n          type: 'Chunk'\n        , body: body\n      };\n    }\n\n    , identifier: function(name) {\n      return {\n          type: 'Identifier'\n        , name: name\n      };\n    }\n\n    , literal: function(type, value, raw) {\n      type = (type === StringLiteral) ? 'StringLiteral'\n        : (type === NumericLiteral) ? 'NumericLiteral'\n        : (type === BooleanLiteral) ? 'BooleanLiteral'\n        : (type === NilLiteral) ? 'NilLiteral'\n        : 'VarargLiteral';\n\n      return {\n          type: type\n        , value: value\n        , raw: raw\n      };\n    }\n\n    , tableKey: function(key, value) {\n      return {\n          type: 'TableKey'\n        , key: key\n        , value: value\n      };\n    }\n    , tableKeyString: function(key, value) {\n      return {\n          type: 'TableKeyString'\n        , key: key\n        , value: value\n      };\n    }\n    , tableValue: function(value) {\n      return {\n          type: 'TableValue'\n        , value: value\n      };\n    }\n\n\n    , tableConstructorExpression: function(fields) {\n      return {\n          type: 'TableConstructorExpression'\n        , fields: fields\n      };\n    }\n    , binaryExpression: function(operator, left, right) {\n      var type = ('and' === operator || 'or' === operator) ?\n        'LogicalExpression' :\n        'BinaryExpression';\n\n      return {\n          type: type\n        , operator: operator\n        , left: left\n        , right: right\n      };\n    }\n    , unaryExpression: function(operator, argument) {\n      return {\n          type: 'UnaryExpression'\n        , operator: operator\n        , argument: argument\n      };\n    }\n    , memberExpression: function(base, indexer, identifier) {\n      return {\n          type: 'MemberExpression'\n        , indexer: indexer\n        , identifier: identifier\n        , base: base\n      };\n    }\n\n    , indexExpression: function(base, index) {\n      return {\n          type: 'IndexExpression'\n        , base: base\n        , index: index\n      };\n    }\n\n    , callExpression: function(base, args) {\n      return {\n          type: 'CallExpression'\n        , base: base\n        , 'arguments': args\n      };\n    }\n\n    , tableCallExpression: function(base, args) {\n      return {\n          type: 'TableCallExpression'\n        , base: base\n        , 'arguments': args\n      };\n    }\n\n    , stringCallExpression: function(base, argument) {\n      return {\n          type: 'StringCallExpression'\n        , base: base\n        , argument: argument\n      };\n    }\n\n    , comment: function(value, raw) {\n      return {\n          type: 'Comment'\n        , value: value\n        , raw: raw\n      };\n    }\n  };\n\n  function finishNode(node) {\n    if (trackLocations) {\n      var location = locations.pop();\n      location.complete();\n      if (options.locations) node.loc = location.loc;\n      if (options.ranges) node.range = location.range;\n    }\n    return node;\n  }\n\n  var slice = Array.prototype.slice\n    , toString = Object.prototype.toString\n    , indexOf = function indexOf(array, element) {\n      for (var i = 0, length = array.length; i < length; i++) {\n        if (array[i] === element) return i;\n      }\n      return -1;\n    };\n\n  function indexOfObject(array, property, element) {\n    for (var i = 0, length = array.length; i < length; i++) {\n      if (array[i][property] === element) return i;\n    }\n    return -1;\n  }\n\n  function sprintf(format) {\n    var args = slice.call(arguments, 1);\n    format = format.replace(/%(\\d)/g, function (match, index) {\n      return '' + args[index - 1] || '';\n    });\n    return format;\n  }\n\n  function extend() {\n    var args = slice.call(arguments)\n      , dest = {}\n      , src, prop;\n\n    for (var i = 0, length = args.length; i < length; i++) {\n      src = args[i];\n      for (prop in src) if (src.hasOwnProperty(prop)) {\n        dest[prop] = src[prop];\n      }\n    }\n    return dest;\n  }\n\n  function raise(token) {\n    var message = sprintf.apply(null, slice.call(arguments, 1))\n      , error, col;\n\n    if ('undefined' !== typeof token.line) {\n      col = token.range[0] - token.lineStart;\n      error = new SyntaxError(sprintf('[%1:%2] %3', token.line, col, message));\n      error.line = token.line;\n      error.index = token.range[0];\n      error.column = col;\n    } else {\n      col = index - lineStart + 1;\n      error = new SyntaxError(sprintf('[%1:%2] %3', line, col, message));\n      error.index = index;\n      error.line = line;\n      error.column = col;\n    }\n    throw error;\n  }\n\n  function raiseUnexpectedToken(type, token) {\n    raise(token, errors.expectedToken, type, token.value);\n  }\n\n  function unexpected(found, near) {\n    if ('undefined' === typeof near) near = lookahead.value;\n    if ('undefined' !== typeof found.type) {\n      var type;\n      switch (found.type) {\n        case StringLiteral:   type = 'string';      break;\n        case Keyword:         type = 'keyword';     break;\n        case Identifier:      type = 'identifier';  break;\n        case NumericLiteral:  type = 'number';      break;\n        case Punctuator:      type = 'symbol';      break;\n        case BooleanLiteral:  type = 'boolean';     break;\n        case NilLiteral:\n          return raise(found, errors.unexpected, 'symbol', 'nil', near);\n      }\n      return raise(found, errors.unexpected, type, found.value, near);\n    }\n    return raise(found, errors.unexpected, 'symbol', found, near);\n  }\n\n  var index\n    , token\n    , previousToken\n    , lookahead\n    , comments\n    , tokenStart\n    , line\n    , lineStart;\n\n  exports.lex = lex;\n\n  function lex() {\n    skipWhiteSpace();\n    while (45 === input.charCodeAt(index) &&\n           45 === input.charCodeAt(index + 1)) {\n      scanComment();\n      skipWhiteSpace();\n    }\n    if (index >= length) return {\n        type : EOF\n      , value: '<eof>'\n      , line: line\n      , lineStart: lineStart\n      , range: [index, index]\n    };\n\n    var charCode = input.charCodeAt(index)\n      , next = input.charCodeAt(index + 1);\n    tokenStart = index;\n    if (isIdentifierStart(charCode)) return scanIdentifierOrKeyword();\n\n    switch (charCode) {\n      case 39: case 34: // '\"\n        return scanStringLiteral();\n      case 48: case 49: case 50: case 51: case 52: case 53:\n      case 54: case 55: case 56: case 57:\n        return scanNumericLiteral();\n\n      case 46: // .\n        if (isDecDigit(next)) return scanNumericLiteral();\n        if (46 === next) {\n          if (46 === input.charCodeAt(index + 2)) return scanVarargLiteral();\n          return scanPunctuator('..');\n        }\n        return scanPunctuator('.');\n\n      case 61: // =\n        if (61 === next) return scanPunctuator('==');\n        return scanPunctuator('=');\n\n      case 62: // >\n        if (61 === next) return scanPunctuator('>=');\n        return scanPunctuator('>');\n\n      case 60: // <\n        if (61 === next) return scanPunctuator('<=');\n        return scanPunctuator('<');\n\n      case 126: // ~\n        if (61 === next) return scanPunctuator('~=');\n        return raise({}, errors.expected, '=', '~');\n\n      case 58: // :\n        if (58 === next) return scanPunctuator('::');\n        return scanPunctuator(':');\n\n      case 91: // [\n        if (91 === next || 61 === next) return scanLongStringLiteral();\n        return scanPunctuator('[');\n      case 42: case 47: case 94: case 37: case 44: case 123: case 125:\n      case 93: case 40: case 41: case 59: case 35: case 45: case 43:\n        return scanPunctuator(input.charAt(index));\n    }\n\n    return unexpected(input.charAt(index));\n  }\n\n  function skipWhiteSpace() {\n    while (index < length) {\n      var charCode = input.charCodeAt(index);\n      if (isWhiteSpace(charCode)) {\n        index++;\n      } else if (isLineTerminator(charCode)) {\n        line++;\n        lineStart = ++index;\n      } else {\n        break;\n      }\n    }\n  }\n\n  function scanIdentifierOrKeyword() {\n    var value, type;\n    while (isIdentifierPart(input.charCodeAt(++index)));\n    value = input.slice(tokenStart, index);\n    if (isKeyword(value)) {\n      type = Keyword;\n    } else if ('true' === value || 'false' === value) {\n      type = BooleanLiteral;\n      value = ('true' === value);\n    } else if ('nil' === value) {\n      type = NilLiteral;\n      value = null;\n    } else {\n      type = Identifier;\n    }\n\n    return {\n        type: type\n      , value: value\n      , line: line\n      , lineStart: lineStart\n      , range: [tokenStart, index]\n    };\n  }\n\n  function scanPunctuator(value) {\n    index += value.length;\n    return {\n        type: Punctuator\n      , value: value\n      , line: line\n      , lineStart: lineStart\n      , range: [tokenStart, index]\n    };\n  }\n\n  function scanVarargLiteral() {\n    index += 3;\n    return {\n        type: VarargLiteral\n      , value: '...'\n      , line: line\n      , lineStart: lineStart\n      , range: [tokenStart, index]\n    };\n  }\n\n  function scanStringLiteral() {\n    var delimiter = input.charCodeAt(index++)\n      , stringStart = index\n      , string = ''\n      , charCode;\n\n    while (index < length) {\n      charCode = input.charCodeAt(index++);\n      if (delimiter === charCode) break;\n      if (92 === charCode) { // \\\n        string += input.slice(stringStart, index - 1) + readEscapeSequence();\n        stringStart = index;\n      }\n      else if (index >= length || isLineTerminator(charCode)) {\n        string += input.slice(stringStart, index - 1);\n        raise({}, errors.unfinishedString, string + String.fromCharCode(charCode));\n      }\n    }\n    string += input.slice(stringStart, index - 1);\n\n    return {\n        type: StringLiteral\n      , value: string\n      , line: line\n      , lineStart: lineStart\n      , range: [tokenStart, index]\n    };\n  }\n\n  function scanLongStringLiteral() {\n    var string = readLongString();\n    if (false === string) raise(token, errors.expected, '[', token.value);\n\n    return {\n        type: StringLiteral\n      , value: string\n      , line: line\n      , lineStart: lineStart\n      , range: [tokenStart, index]\n    };\n  }\n\n  function scanNumericLiteral() {\n    var character = input.charAt(index)\n      , next = input.charAt(index + 1);\n\n    var value = ('0' === character && 'xX'.indexOf(next || null) >= 0) ?\n      readHexLiteral() : readDecLiteral();\n\n    return {\n        type: NumericLiteral\n      , value: value\n      , line: line\n      , lineStart: lineStart\n      , range: [tokenStart, index]\n    };\n  }\n\n  function readHexLiteral() {\n    var fraction = 0 // defaults to 0 as it gets summed\n      , binaryExponent = 1 // defaults to 1 as it gets multiplied\n      , binarySign = 1 // positive\n      , digit, fractionStart, exponentStart, digitStart;\n\n    digitStart = index += 2; // Skip 0x part\n    if (!isHexDigit(input.charCodeAt(index)))\n      raise({}, errors.malformedNumber, input.slice(tokenStart, index));\n\n    while (isHexDigit(input.charCodeAt(index))) index++;\n    digit = parseInt(input.slice(digitStart, index), 16);\n    if ('.' === input.charAt(index)) {\n      fractionStart = ++index;\n\n      while (isHexDigit(input.charCodeAt(index))) index++;\n      fraction = input.slice(fractionStart, index);\n      fraction = (fractionStart === index) ? 0\n        : parseInt(fraction, 16) / Math.pow(16, index - fractionStart);\n    }\n    if ('pP'.indexOf(input.charAt(index) || null) >= 0) {\n      index++;\n      if ('+-'.indexOf(input.charAt(index) || null) >= 0)\n        binarySign = ('+' === input.charAt(index++)) ? 1 : -1;\n\n      exponentStart = index;\n      if (!isDecDigit(input.charCodeAt(index)))\n        raise({}, errors.malformedNumber, input.slice(tokenStart, index));\n\n      while (isDecDigit(input.charCodeAt(index))) index++;\n      binaryExponent = input.slice(exponentStart, index);\n      binaryExponent = Math.pow(2, binaryExponent * binarySign);\n    }\n\n    return (digit + fraction) * binaryExponent;\n  }\n\n  function readDecLiteral() {\n    while (isDecDigit(input.charCodeAt(index))) index++;\n    if ('.' === input.charAt(index)) {\n      index++;\n      while (isDecDigit(input.charCodeAt(index))) index++;\n    }\n    if ('eE'.indexOf(input.charAt(index) || null) >= 0) {\n      index++;\n      if ('+-'.indexOf(input.charAt(index) || null) >= 0) index++;\n      if (!isDecDigit(input.charCodeAt(index)))\n        raise({}, errors.malformedNumber, input.slice(tokenStart, index));\n\n      while (isDecDigit(input.charCodeAt(index))) index++;\n    }\n\n    return parseFloat(input.slice(tokenStart, index));\n  }\n\n  function readEscapeSequence() {\n    var sequenceStart = index;\n    switch (input.charAt(index)) {\n      case 'n': index++; return '\\n';\n      case 'r': index++; return '\\r';\n      case 't': index++; return '\\t';\n      case 'v': index++; return '\\x0B';\n      case 'b': index++; return '\\b';\n      case 'f': index++; return '\\f';\n      case 'z': index++; skipWhiteSpace(); return '';\n      case 'x':\n        if (isHexDigit(input.charCodeAt(index + 1)) &&\n            isHexDigit(input.charCodeAt(index + 2))) {\n          index += 3;\n          return '\\\\' + input.slice(sequenceStart, index);\n        }\n        return '\\\\' + input.charAt(index++);\n      default:\n        if (isDecDigit(input.charCodeAt(index))) {\n          while (isDecDigit(input.charCodeAt(++index)));\n          return '\\\\' + input.slice(sequenceStart, index);\n        }\n        return input.charAt(index++);\n    }\n  }\n\n  function scanComment() {\n    tokenStart = index;\n    index += 2; // --\n\n    var character = input.charAt(index)\n      , content = ''\n      , isLong = false\n      , commentStart = index\n      , lineStartComment = lineStart\n      , lineComment = line;\n\n    if ('[' === character) {\n      content = readLongString();\n      if (false === content) content = character;\n      else isLong = true;\n    }\n    if (!isLong) {\n      while (index < length) {\n        if (isLineTerminator(input.charCodeAt(index))) break;\n        index++;\n      }\n      if (options.comments) content = input.slice(commentStart, index);\n    }\n\n    if (options.comments) {\n      var node = ast.comment(content, input.slice(tokenStart, index));\n      if (options.locations) {\n        node.loc = {\n            start: { line: lineComment, column: tokenStart - lineStartComment }\n          , end: { line: line, column: index - lineStart }\n        };\n      }\n      if (options.ranges) {\n        node.range = [tokenStart, index];\n      }\n      comments.push(node);\n    }\n  }\n\n  function readLongString() {\n    var level = 0\n      , content = ''\n      , terminator = false\n      , character, stringStart;\n\n    index++; // [\n    while ('=' === input.charAt(index + level)) level++;\n    if ('[' !== input.charAt(index + level)) return false;\n\n    index += level + 1;\n    if (isLineTerminator(input.charCodeAt(index))) {\n      line++;\n      lineStart = index++;\n    }\n\n    stringStart = index;\n    while (index < length) {\n      character = input.charAt(index++);\n      if (isLineTerminator(character.charCodeAt(0))) {\n        line++;\n        lineStart = index;\n      }\n      if (']' === character) {\n        terminator = true;\n        for (var i = 0; i < level; i++) {\n          if ('=' !== input.charAt(index + i)) terminator = false;\n        }\n        if (']' !== input.charAt(index + level)) terminator = false;\n      }\n      if (terminator) break;\n    }\n    content += input.slice(stringStart, index - 1);\n    index += level + 1;\n\n    return content;\n  }\n\n  function next() {\n    previousToken = token;\n    token = lookahead;\n    lookahead = lex();\n  }\n\n  function consume(value) {\n    if (value === token.value) {\n      next();\n      return true;\n    }\n    return false;\n  }\n\n  function expect(value) {\n    if (value === token.value) next();\n    else raise(token, errors.expected, value, token.value);\n  }\n\n  function isWhiteSpace(charCode) {\n    return 9 === charCode || 32 === charCode || 0xB === charCode || 0xC === charCode;\n  }\n\n  function isLineTerminator(charCode) {\n    return 10 === charCode || 13 === charCode;\n  }\n\n  function isDecDigit(charCode) {\n    return charCode >= 48 && charCode <= 57;\n  }\n\n  function isHexDigit(charCode) {\n    return (charCode >= 48 && charCode <= 57) || (charCode >= 97 && charCode <= 102) || (charCode >= 65 && charCode <= 70);\n  }\n\n  function isIdentifierStart(charCode) {\n    return (charCode >= 65 && charCode <= 90) || (charCode >= 97 && charCode <= 122) || 95 === charCode;\n  }\n\n  function isIdentifierPart(charCode) {\n    return (charCode >= 65 && charCode <= 90) || (charCode >= 97 && charCode <= 122) || 95 === charCode || (charCode >= 48 && charCode <= 57);\n  }\n\n  function isKeyword(id) {\n    switch (id.length) {\n      case 2:\n        return 'do' === id || 'if' === id || 'in' === id || 'or' === id;\n      case 3:\n        return 'and' === id || 'end' === id || 'for' === id || 'not' === id;\n      case 4:\n        return 'else' === id || 'goto' === id || 'then' === id;\n      case 5:\n        return 'break' === id || 'local' === id || 'until' === id || 'while' === id;\n      case 6:\n        return 'elseif' === id || 'repeat' === id || 'return' === id;\n      case 8:\n        return 'function' === id;\n    }\n    return false;\n  }\n\n  function isUnary(token) {\n    if (Punctuator === token.type) return '#-'.indexOf(token.value) >= 0;\n    if (Keyword === token.type) return 'not' === token.value;\n    return false;\n  }\n  function isCallExpression(expression) {\n    switch (expression.type) {\n      case 'CallExpression':\n      case 'TableCallExpression':\n      case 'StringCallExpression':\n        return true;\n    }\n    return false;\n  }\n\n  function isBlockFollow(token) {\n    if (EOF === token.type) return true;\n    if (Keyword !== token.type) return false;\n    switch (token.value) {\n      case 'else': case 'elseif':\n      case 'end': case 'until':\n        return true;\n      default:\n        return false;\n    }\n  }\n  var scopes\n    , scopeDepth\n    , globals;\n  function createScope() {\n    scopes.push(Array.apply(null, scopes[scopeDepth++]));\n  }\n  function exitScope() {\n    scopes.pop();\n    scopeDepth--;\n  }\n  function scopeIdentifierName(name) {\n    if (-1 !== indexOf(scopes[scopeDepth], name)) return;\n    scopes[scopeDepth].push(name);\n  }\n  function scopeIdentifier(node) {\n    scopeIdentifierName(node.name);\n    attachScope(node, true);\n  }\n  function attachScope(node, isLocal) {\n    if (!isLocal && -1 === indexOfObject(globals, 'name', node.name))\n      globals.push(node);\n\n    node.isLocal = isLocal;\n  }\n  function scopeHasName(name) {\n    return (-1 !== indexOf(scopes[scopeDepth], name));\n  }\n\n  var locations = []\n    , trackLocations;\n\n  function createLocationMarker() {\n    return new Marker(token);\n  }\n\n  function Marker(token) {\n    if (options.locations) {\n      this.loc = {\n          start: {\n            line: token.line\n          , column: token.range[0] - token.lineStart\n        }\n        , end: {\n            line: 0\n          , column: 0\n        }\n      };\n    }\n    if (options.ranges) this.range = [token.range[0], 0];\n  }\n  Marker.prototype.complete = function() {\n    if (options.locations) {\n      this.loc.end.line = previousToken.line;\n      this.loc.end.column = previousToken.range[1] - previousToken.lineStart;\n    }\n    if (options.ranges) {\n      this.range[1] = previousToken.range[1];\n    }\n  };\n  function markLocation() {\n    if (trackLocations) locations.push(createLocationMarker());\n  }\n  function pushLocation(marker) {\n    if (trackLocations) locations.push(marker);\n  }\n\n  function parseChunk() {\n    next();\n    markLocation();\n    var body = parseBlock();\n    if (EOF !== token.type) unexpected(token);\n    if (trackLocations && !body.length) previousToken = token;\n    return finishNode(ast.chunk(body));\n  }\n\n  function parseBlock(terminator) {\n    var block = []\n      , statement;\n    if (options.scope) createScope();\n\n    while (!isBlockFollow(token)) {\n      if ('return' === token.value) {\n        block.push(parseStatement());\n        break;\n      }\n      statement = parseStatement();\n      if (statement) block.push(statement);\n    }\n\n    if (options.scope) exitScope();\n    return block;\n  }\n\n  function parseStatement() {\n    markLocation();\n    if (Keyword === token.type) {\n      switch (token.value) {\n        case 'local':    next(); return parseLocalStatement();\n        case 'if':       next(); return parseIfStatement();\n        case 'return':   next(); return parseReturnStatement();\n        case 'function': next();\n          var name = parseFunctionName();\n          return parseFunctionDeclaration(name);\n        case 'while':    next(); return parseWhileStatement();\n        case 'for':      next(); return parseForStatement();\n        case 'repeat':   next(); return parseRepeatStatement();\n        case 'break':    next(); return parseBreakStatement();\n        case 'do':       next(); return parseDoStatement();\n        case 'goto':     next(); return parseGotoStatement();\n      }\n    }\n\n    if (Punctuator === token.type) {\n      if (consume('::')) return parseLabelStatement();\n    }\n    if (trackLocations) locations.pop();\n    if (consume(';')) return;\n\n    return parseAssignmentOrCallStatement();\n  }\n\n  function parseLabelStatement() {\n    var name = token.value\n      , label = parseIdentifier();\n\n    if (options.scope) {\n      scopeIdentifierName('::' + name + '::');\n      attachScope(label, true);\n    }\n\n    expect('::');\n    return finishNode(ast.labelStatement(label));\n  }\n\n  function parseBreakStatement() {\n    return finishNode(ast.breakStatement());\n  }\n\n  function parseGotoStatement() {\n    var name = token.value\n      , label = parseIdentifier();\n\n    if (options.scope) label.isLabel = scopeHasName('::' + name + '::');\n    return finishNode(ast.gotoStatement(label));\n  }\n\n  function parseDoStatement() {\n    var body = parseBlock();\n    expect('end');\n    return finishNode(ast.doStatement(body));\n  }\n\n  function parseWhileStatement() {\n    var condition = parseExpectedExpression();\n    expect('do');\n    var body = parseBlock();\n    expect('end');\n    return finishNode(ast.whileStatement(condition, body));\n  }\n\n  function parseRepeatStatement() {\n    var body = parseBlock();\n    expect('until');\n    var condition = parseExpectedExpression();\n    return finishNode(ast.repeatStatement(condition, body));\n  }\n\n  function parseReturnStatement() {\n    var expressions = [];\n\n    if ('end' !== token.value) {\n      var expression = parseExpression();\n      if (null != expression) expressions.push(expression);\n      while (consume(',')) {\n        expression = parseExpectedExpression();\n        expressions.push(expression);\n      }\n      consume(';'); // grammar tells us ; is optional here.\n    }\n    return finishNode(ast.returnStatement(expressions));\n  }\n\n  function parseIfStatement() {\n    var clauses = []\n      , condition\n      , body\n      , marker;\n    if (trackLocations) {\n      marker = locations[locations.length - 1];\n      locations.push(marker);\n    }\n    condition = parseExpectedExpression();\n    expect('then');\n    body = parseBlock();\n    clauses.push(finishNode(ast.ifClause(condition, body)));\n\n    if (trackLocations) marker = createLocationMarker();\n    while (consume('elseif')) {\n      pushLocation(marker);\n      condition = parseExpectedExpression();\n      expect('then');\n      body = parseBlock();\n      clauses.push(finishNode(ast.elseifClause(condition, body)));\n      if (trackLocations) marker = createLocationMarker();\n    }\n\n    if (consume('else')) {\n      if (trackLocations) {\n        marker = new Marker(previousToken);\n        locations.push(marker);\n      }\n      body = parseBlock();\n      clauses.push(finishNode(ast.elseClause(body)));\n    }\n\n    expect('end');\n    return finishNode(ast.ifStatement(clauses));\n  }\n\n  function parseForStatement() {\n    var variable = parseIdentifier()\n      , body;\n    if (options.scope) scopeIdentifier(variable);\n    if (consume('=')) {\n      var start = parseExpectedExpression();\n      expect(',');\n      var end = parseExpectedExpression();\n      var step = consume(',') ? parseExpectedExpression() : null;\n\n      expect('do');\n      body = parseBlock();\n      expect('end');\n\n      return finishNode(ast.forNumericStatement(variable, start, end, step, body));\n    }\n    else {\n      var variables = [variable];\n      while (consume(',')) {\n        variable = parseIdentifier();\n        if (options.scope) scopeIdentifier(variable);\n        variables.push(variable);\n      }\n      expect('in');\n      var iterators = [];\n      do {\n        var expression = parseExpectedExpression();\n        iterators.push(expression);\n      } while (consume(','));\n\n      expect('do');\n      body = parseBlock();\n      expect('end');\n\n      return finishNode(ast.forGenericStatement(variables, iterators, body));\n    }\n  }\n\n  function parseLocalStatement() {\n    var name;\n\n    if (Identifier === token.type) {\n      var variables = []\n        , init = [];\n\n      do {\n        name = parseIdentifier();\n\n        variables.push(name);\n      } while (consume(','));\n\n      if (consume('=')) {\n        do {\n          var expression = parseExpectedExpression();\n          init.push(expression);\n        } while (consume(','));\n      }\n      if (options.scope) {\n        for (var i = 0, l = variables.length; i < l; i++) {\n          scopeIdentifier(variables[i]);\n        }\n      }\n\n      return finishNode(ast.localStatement(variables, init));\n    }\n    if (consume('function')) {\n      name = parseIdentifier();\n      if (options.scope) scopeIdentifier(name);\n      return parseFunctionDeclaration(name, true);\n    } else {\n      raiseUnexpectedToken('<name>', token);\n    }\n  }\n\n  function parseAssignmentOrCallStatement() {\n    var previous = token\n      , expression, marker;\n\n    if (trackLocations) marker = createLocationMarker();\n    expression = parsePrefixExpression();\n\n    if (null == expression) return unexpected(token);\n    if (',='.indexOf(token.value) >= 0) {\n      var variables = [expression]\n        , init = []\n        , exp;\n\n      while (consume(',')) {\n        exp = parsePrefixExpression();\n        if (null == exp) raiseUnexpectedToken('<expression>', token);\n        variables.push(exp);\n      }\n      expect('=');\n      do {\n        exp = parseExpectedExpression();\n        init.push(exp);\n      } while (consume(','));\n\n      pushLocation(marker);\n      return finishNode(ast.assignmentStatement(variables, init));\n    }\n    if (isCallExpression(expression)) {\n      pushLocation(marker);\n      return finishNode(ast.callStatement(expression));\n    }\n    return unexpected(previous);\n  }\n\n  function parseIdentifier() {\n    markLocation();\n    var identifier = token.value;\n    if (Identifier !== token.type) raiseUnexpectedToken('<name>', token);\n    next();\n    return finishNode(ast.identifier(identifier));\n  }\n\n  function parseFunctionDeclaration(name, isLocal) {\n    var parameters = [];\n    expect('(');\n    if (!consume(')')) {\n      while (true) {\n        if (Identifier === token.type) {\n          var parameter = parseIdentifier();\n          if (options.scope) scopeIdentifier(parameter);\n\n          parameters.push(parameter);\n\n          if (consume(',')) continue;\n          else if (consume(')')) break;\n        }\n        else if (VarargLiteral === token.type) {\n          parameters.push(parsePrimaryExpression());\n          expect(')');\n          break;\n        } else {\n          raiseUnexpectedToken('<name> or \\'...\\'', token);\n        }\n      }\n    }\n\n    var body = parseBlock();\n    expect('end');\n\n    isLocal = isLocal || false;\n    return finishNode(ast.functionStatement(name, parameters, isLocal, body));\n  }\n\n  function parseFunctionName() {\n    var base, name, marker;\n\n    if (trackLocations) marker = createLocationMarker();\n    base = parseIdentifier();\n\n    if (options.scope) attachScope(base, false);\n\n    while (consume('.')) {\n      pushLocation(marker);\n      name = parseIdentifier();\n      if (options.scope) attachScope(name, false);\n      base = finishNode(ast.memberExpression(base, '.', name));\n    }\n\n    if (consume(':')) {\n      pushLocation(marker);\n      name = parseIdentifier();\n      if (options.scope) attachScope(name, false);\n      base = finishNode(ast.memberExpression(base, ':', name));\n    }\n\n    return base;\n  }\n\n  function parseTableConstructor() {\n    var fields = []\n      , key, value;\n\n    while (true) {\n      markLocation();\n      if (Punctuator === token.type && consume('[')) {\n        key = parseExpectedExpression();\n        expect(']');\n        expect('=');\n        value = parseExpectedExpression();\n        fields.push(finishNode(ast.tableKey(key, value)));\n      } else if (Identifier === token.type) {\n        key = parseExpectedExpression();\n        if (consume('=')) {\n          value = parseExpectedExpression();\n          fields.push(finishNode(ast.tableKeyString(key, value)));\n        } else {\n          fields.push(finishNode(ast.tableValue(key)));\n        }\n      } else {\n        if (null == (value = parseExpression())) {\n          locations.pop();\n          break;\n        }\n        fields.push(finishNode(ast.tableValue(value)));\n      }\n      if (',;'.indexOf(token.value) >= 0) {\n        next();\n        continue;\n      }\n      if ('}' === token.value) break;\n    }\n    expect('}');\n    return finishNode(ast.tableConstructorExpression(fields));\n  }\n\n  function parseExpression() {\n    var expression = parseSubExpression(0);\n    return expression;\n  }\n\n  function parseExpectedExpression() {\n    var expression = parseExpression();\n    if (null == expression) raiseUnexpectedToken('<expression>', token);\n    else return expression;\n  }\n\n  function binaryPrecedence(operator) {\n    var charCode = operator.charCodeAt(0)\n      , length = operator.length;\n\n    if (1 === length) {\n      switch (charCode) {\n        case 94: return 10; // ^\n        case 42: case 47: case 37: return 7; // * / %\n        case 43: case 45: return 6; // + -\n        case 60: case 62: return 3; // < >\n      }\n    } else if (2 === length) {\n      switch (charCode) {\n        case 46: return 5; // ..\n        case 60: case 62: case 61: case 126: return 3; // <= >= == ~=\n        case 111: return 1; // or\n      }\n    } else if (97 === charCode && 'and' === operator) return 2;\n    return 0;\n  }\n\n  function parseSubExpression(minPrecedence) {\n    var operator = token.value\n      , expression, marker;\n\n    if (trackLocations) marker = createLocationMarker();\n    if (isUnary(token)) {\n      markLocation();\n      next();\n      var argument = parseSubExpression(8);\n      if (argument == null) raiseUnexpectedToken('<expression>', token);\n      expression = finishNode(ast.unaryExpression(operator, argument));\n    }\n    if (null == expression) {\n      expression = parsePrimaryExpression();\n      if (null == expression) {\n        expression = parsePrefixExpression();\n      }\n    }\n    if (null == expression) return null;\n\n    var precedence;\n    while (true) {\n      operator = token.value;\n\n      precedence = (Punctuator === token.type || Keyword === token.type) ?\n        binaryPrecedence(operator) : 0;\n\n      if (precedence === 0 || precedence <= minPrecedence) break;\n      if ('^' === operator || '..' === operator) precedence--;\n      next();\n      var right = parseSubExpression(precedence);\n      if (null == right) raiseUnexpectedToken('<expression>', token);\n      if (trackLocations) locations.push(marker);\n      expression = finishNode(ast.binaryExpression(operator, expression, right));\n\n    }\n    return expression;\n  }\n\n  function parsePrefixExpression() {\n    var base, name, marker\n      , isLocal;\n\n    if (trackLocations) marker = createLocationMarker();\n    if (Identifier === token.type) {\n      name = token.value;\n      base = parseIdentifier();\n      if (options.scope) attachScope(base, isLocal = scopeHasName(name));\n    } else if (consume('(')) {\n      base = parseExpectedExpression();\n      expect(')');\n      if (options.scope) isLocal = base.isLocal;\n    } else {\n      return null;\n    }\n    var expression, identifier;\n    while (true) {\n      if (Punctuator === token.type) {\n        switch (token.value) {\n          case '[':\n            pushLocation(marker);\n            next();\n            expression = parseExpectedExpression();\n            base = finishNode(ast.indexExpression(base, expression));\n            expect(']');\n            break;\n          case '.':\n            pushLocation(marker);\n            next();\n            identifier = parseIdentifier();\n            if (options.scope) attachScope(identifier, isLocal);\n            base = finishNode(ast.memberExpression(base, '.', identifier));\n            break;\n          case ':':\n            pushLocation(marker);\n            next();\n            identifier = parseIdentifier();\n            if (options.scope) attachScope(identifier, isLocal);\n            base = finishNode(ast.memberExpression(base, ':', identifier));\n            pushLocation(marker);\n            base = parseCallExpression(base);\n            break;\n          case '(': case '{': // args\n            pushLocation(marker);\n            base = parseCallExpression(base);\n            break;\n          default:\n            return base;\n        }\n      } else if (StringLiteral === token.type) {\n        pushLocation(marker);\n        base = parseCallExpression(base);\n      } else {\n        break;\n      }\n    }\n\n    return base;\n  }\n\n  function parseCallExpression(base) {\n    if (Punctuator === token.type) {\n      switch (token.value) {\n        case '(':\n          next();\n          var expressions = [];\n          var expression = parseExpression();\n          if (null != expression) expressions.push(expression);\n          while (consume(',')) {\n            expression = parseExpectedExpression();\n            expressions.push(expression);\n          }\n\n          expect(')');\n          return finishNode(ast.callExpression(base, expressions));\n\n        case '{':\n          markLocation();\n          next();\n          var table = parseTableConstructor();\n          return finishNode(ast.tableCallExpression(base, table));\n      }\n    } else if (StringLiteral === token.type) {\n      return finishNode(ast.stringCallExpression(base, parsePrimaryExpression()));\n    }\n\n    raiseUnexpectedToken('function arguments', token);\n  }\n\n  function parsePrimaryExpression() {\n    var literals = StringLiteral | NumericLiteral | BooleanLiteral | NilLiteral | VarargLiteral\n      , value = token.value\n      , type = token.type\n      , marker;\n\n    if (trackLocations) marker = createLocationMarker();\n\n    if (type & literals) {\n      pushLocation(marker);\n      var raw = input.slice(token.range[0], token.range[1]);\n      next();\n      return finishNode(ast.literal(type, value, raw));\n    } else if (Keyword === type && 'function' === value) {\n      pushLocation(marker);\n      next();\n      return parseFunctionDeclaration(null);\n    } else if (consume('{')) {\n      pushLocation(marker);\n      return parseTableConstructor();\n    }\n  }\n\n  exports.parse = parse;\n\n  function parse(_input, _options) {\n    if ('undefined' === typeof _options && 'object' === typeof _input) {\n      _options = _input;\n      _input = undefined;\n    }\n    if (!_options) _options = {};\n\n    input = _input || '';\n    options = extend(defaultOptions, _options);\n    index = 0;\n    line = 1;\n    lineStart = 0;\n    length = input.length;\n    scopes = [[]];\n    scopeDepth = 0;\n    globals = [];\n    locations = [];\n\n    if (options.comments) comments = [];\n    if (!options.wait) return end();\n    return exports;\n  }\n  exports.write = write;\n\n  function write(_input) {\n    input += String(_input);\n    length = input.length;\n    return exports;\n  }\n  exports.end = end;\n\n  function end(_input) {\n    if ('undefined' !== typeof _input) write(_input);\n\n    length = input.length;\n    trackLocations = options.locations || options.ranges;\n    lookahead = lex();\n\n    var chunk = parseChunk();\n    if (options.comments) chunk.comments = comments;\n    if (options.scope) chunk.globals = globals;\n\n    if (locations.length > 0)\n      throw new Error('Location tracking failed. This is most likely a bug in luaparse');\n\n    return chunk;\n  }\n\n}));\n\n});\n\nace.define(\"ace/mode/lua_worker\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/worker/mirror\",\"ace/mode/lua/luaparse\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar Mirror = require(\"../worker/mirror\").Mirror;\nvar luaparse = require(\"../mode/lua/luaparse\");\n\nvar Worker = exports.Worker = function(sender) {\n    Mirror.call(this, sender);\n    this.setTimeout(500);\n};\n\noop.inherits(Worker, Mirror);\n\n(function() {\n\n    this.onUpdate = function() {\n        var value = this.doc.getValue();\n        try {\n            luaparse.parse(value);\n        } catch(e) {\n            if (e instanceof SyntaxError) {\n                this.sender.emit(\"error\", {\n\t\t\t\t\trow: e.line - 1,\n\t\t\t\t\tcolumn: e.column,\n\t\t\t\t\ttext: e.message,\n\t\t\t\t\ttype: \"error\"\n\t\t\t\t});\n            }\n            return;\n        }\n        this.sender.emit(\"ok\");\n    };\n\n}).call(Worker.prototype);\n\n});\n\nace.define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\nfunction Empty() {}\n\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function bind(that) { // .length is 1\n        var target = this;\n        if (typeof target != \"function\") {\n            throw new TypeError(\"Function.prototype.bind called on incompatible \" + target);\n        }\n        var args = slice.call(arguments, 1); // for normal call\n        var bound = function () {\n\n            if (this instanceof bound) {\n\n                var result = target.apply(\n                    this,\n                    args.concat(slice.call(arguments))\n                );\n                if (Object(result) === result) {\n                    return result;\n                }\n                return this;\n\n            } else {\n                return target.apply(\n                    that,\n                    args.concat(slice.call(arguments))\n                );\n\n            }\n\n        };\n        if(target.prototype) {\n            Empty.prototype = target.prototype;\n            bound.prototype = new Empty();\n            Empty.prototype = null;\n        }\n        return bound;\n    };\n}\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar _toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n    defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n    defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n    lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n    lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\nif ([1,2].splice(0).length != 2) {\n    if(function() { // test IE < 9 to splice bug - see issue #138\n        function makeArray(l) {\n            var a = new Array(l+2);\n            a[0] = a[1] = 0;\n            return a;\n        }\n        var array = [], lengthBefore;\n        \n        array.splice.apply(array, makeArray(20));\n        array.splice.apply(array, makeArray(26));\n\n        lengthBefore = array.length; //46\n        array.splice(5, 0, \"XXX\"); // add one element\n\n        lengthBefore + 1 == array.length\n\n        if (lengthBefore + 1 == array.length) {\n            return true;// has right splice implementation without bugs\n        }\n    }()) {//IE 6/7\n        var array_splice = Array.prototype.splice;\n        Array.prototype.splice = function(start, deleteCount) {\n            if (!arguments.length) {\n                return [];\n            } else {\n                return array_splice.apply(this, [\n                    start === void 0 ? 0 : start,\n                    deleteCount === void 0 ? (this.length - start) : deleteCount\n                ].concat(slice.call(arguments, 2)))\n            }\n        };\n    } else {//IE8\n        Array.prototype.splice = function(pos, removeCount){\n            var length = this.length;\n            if (pos > 0) {\n                if (pos > length)\n                    pos = length;\n            } else if (pos == void 0) {\n                pos = 0;\n            } else if (pos < 0) {\n                pos = Math.max(length + pos, 0);\n            }\n\n            if (!(pos+removeCount < length))\n                removeCount = length - pos;\n\n            var removed = this.slice(pos, pos+removeCount);\n            var insert = slice.call(arguments, 2);\n            var add = insert.length;            \n            if (pos === length) {\n                if (add) {\n                    this.push.apply(this, insert);\n                }\n            } else {\n                var remove = Math.min(removeCount, length - pos);\n                var tailOldPos = pos + remove;\n                var tailNewPos = tailOldPos + add - remove;\n                var tailCount = length - tailOldPos;\n                var lengthAfterRemove = length - remove;\n\n                if (tailNewPos < tailOldPos) { // case A\n                    for (var i = 0; i < tailCount; ++i) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } else if (tailNewPos > tailOldPos) { // case B\n                    for (i = tailCount; i--; ) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } // else, add == remove (nothing to do)\n\n                if (add && pos === lengthAfterRemove) {\n                    this.length = lengthAfterRemove; // truncate array\n                    this.push.apply(this, insert);\n                } else {\n                    this.length = lengthAfterRemove + add; // reserves space\n                    for (i = 0; i < add; ++i) {\n                        this[pos+i] = insert[i];\n                    }\n                }\n            }\n            return removed;\n        };\n    }\n}\nif (!Array.isArray) {\n    Array.isArray = function isArray(obj) {\n        return _toString(obj) == \"[object Array]\";\n    };\n}\nvar boxedString = Object(\"a\"),\n    splitString = boxedString[0] != \"a\" || !(0 in boxedString);\n\nif (!Array.prototype.forEach) {\n    Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            thisp = arguments[1],\n            i = -1,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        while (++i < length) {\n            if (i in self) {\n                fun.call(thisp, self[i], i, object);\n            }\n        }\n    };\n}\nif (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            result = Array(length),\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self)\n                result[i] = fun.call(thisp, self[i], i, object);\n        }\n        return result;\n    };\n}\nif (!Array.prototype.filter) {\n    Array.prototype.filter = function filter(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                    object,\n            length = self.length >>> 0,\n            result = [],\n            value,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self) {\n                value = self[i];\n                if (fun.call(thisp, value, i, object)) {\n                    result.push(value);\n                }\n            }\n        }\n        return result;\n    };\n}\nif (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && !fun.call(thisp, self[i], i, object)) {\n                return false;\n            }\n        }\n        return true;\n    };\n}\nif (!Array.prototype.some) {\n    Array.prototype.some = function some(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, object)) {\n                return true;\n            }\n        }\n        return false;\n    };\n}\nif (!Array.prototype.reduce) {\n    Array.prototype.reduce = function reduce(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduce of empty array with no initial value\");\n        }\n\n        var i = 0;\n        var result;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i++];\n                    break;\n                }\n                if (++i >= length) {\n                    throw new TypeError(\"reduce of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        for (; i < length; i++) {\n            if (i in self) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        }\n\n        return result;\n    };\n}\nif (!Array.prototype.reduceRight) {\n    Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduceRight of empty array with no initial value\");\n        }\n\n        var result, i = length - 1;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i--];\n                    break;\n                }\n                if (--i < 0) {\n                    throw new TypeError(\"reduceRight of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        do {\n            if (i in this) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        } while (i--);\n\n        return result;\n    };\n}\nif (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {\n    Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n\n        var i = 0;\n        if (arguments.length > 1) {\n            i = toInteger(arguments[1]);\n        }\n        i = i >= 0 ? i : Math.max(0, length + i);\n        for (; i < length; i++) {\n            if (i in self && self[i] === sought) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {\n    Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n        var i = length - 1;\n        if (arguments.length > 1) {\n            i = Math.min(i, toInteger(arguments[1]));\n        }\n        i = i >= 0 ? i : length - Math.abs(i);\n        for (; i >= 0; i--) {\n            if (i in self && sought === self[i]) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Object.getPrototypeOf) {\n    Object.getPrototypeOf = function getPrototypeOf(object) {\n        return object.__proto__ || (\n            object.constructor ?\n            object.constructor.prototype :\n            prototypeOfObject\n        );\n    };\n}\nif (!Object.getOwnPropertyDescriptor) {\n    var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n                         \"non-object: \";\n    Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT + object);\n        if (!owns(object, property))\n            return;\n\n        var descriptor, getter, setter;\n        descriptor =  { enumerable: true, configurable: true };\n        if (supportsAccessors) {\n            var prototype = object.__proto__;\n            object.__proto__ = prototypeOfObject;\n\n            var getter = lookupGetter(object, property);\n            var setter = lookupSetter(object, property);\n            object.__proto__ = prototype;\n\n            if (getter || setter) {\n                if (getter) descriptor.get = getter;\n                if (setter) descriptor.set = setter;\n                return descriptor;\n            }\n        }\n        descriptor.value = object[property];\n        return descriptor;\n    };\n}\nif (!Object.getOwnPropertyNames) {\n    Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n        return Object.keys(object);\n    };\n}\nif (!Object.create) {\n    var createEmpty;\n    if (Object.prototype.__proto__ === null) {\n        createEmpty = function () {\n            return { \"__proto__\": null };\n        };\n    } else {\n        createEmpty = function () {\n            var empty = {};\n            for (var i in empty)\n                empty[i] = null;\n            empty.constructor =\n            empty.hasOwnProperty =\n            empty.propertyIsEnumerable =\n            empty.isPrototypeOf =\n            empty.toLocaleString =\n            empty.toString =\n            empty.valueOf =\n            empty.__proto__ = null;\n            return empty;\n        }\n    }\n\n    Object.create = function create(prototype, properties) {\n        var object;\n        if (prototype === null) {\n            object = createEmpty();\n        } else {\n            if (typeof prototype != \"object\")\n                throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n            var Type = function () {};\n            Type.prototype = prototype;\n            object = new Type();\n            object.__proto__ = prototype;\n        }\n        if (properties !== void 0)\n            Object.defineProperties(object, properties);\n        return object;\n    };\n}\n\nfunction doesDefinePropertyWork(object) {\n    try {\n        Object.defineProperty(object, \"sentinel\", {});\n        return \"sentinel\" in object;\n    } catch (exception) {\n    }\n}\nif (Object.defineProperty) {\n    var definePropertyWorksOnObject = doesDefinePropertyWork({});\n    var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n        doesDefinePropertyWork(document.createElement(\"div\"));\n    if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n        var definePropertyFallback = Object.defineProperty;\n    }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n    var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n    var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n    var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n                                      \"on this javascript engine\";\n\n    Object.defineProperty = function defineProperty(object, property, descriptor) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n        if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n            throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n        if (definePropertyFallback) {\n            try {\n                return definePropertyFallback.call(Object, object, property, descriptor);\n            } catch (exception) {\n            }\n        }\n        if (owns(descriptor, \"value\")) {\n\n            if (supportsAccessors && (lookupGetter(object, property) ||\n                                      lookupSetter(object, property)))\n            {\n                var prototype = object.__proto__;\n                object.__proto__ = prototypeOfObject;\n                delete object[property];\n                object[property] = descriptor.value;\n                object.__proto__ = prototype;\n            } else {\n                object[property] = descriptor.value;\n            }\n        } else {\n            if (!supportsAccessors)\n                throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n            if (owns(descriptor, \"get\"))\n                defineGetter(object, property, descriptor.get);\n            if (owns(descriptor, \"set\"))\n                defineSetter(object, property, descriptor.set);\n        }\n\n        return object;\n    };\n}\nif (!Object.defineProperties) {\n    Object.defineProperties = function defineProperties(object, properties) {\n        for (var property in properties) {\n            if (owns(properties, property))\n                Object.defineProperty(object, property, properties[property]);\n        }\n        return object;\n    };\n}\nif (!Object.seal) {\n    Object.seal = function seal(object) {\n        return object;\n    };\n}\nif (!Object.freeze) {\n    Object.freeze = function freeze(object) {\n        return object;\n    };\n}\ntry {\n    Object.freeze(function () {});\n} catch (exception) {\n    Object.freeze = (function freeze(freezeObject) {\n        return function freeze(object) {\n            if (typeof object == \"function\") {\n                return object;\n            } else {\n                return freezeObject(object);\n            }\n        };\n    })(Object.freeze);\n}\nif (!Object.preventExtensions) {\n    Object.preventExtensions = function preventExtensions(object) {\n        return object;\n    };\n}\nif (!Object.isSealed) {\n    Object.isSealed = function isSealed(object) {\n        return false;\n    };\n}\nif (!Object.isFrozen) {\n    Object.isFrozen = function isFrozen(object) {\n        return false;\n    };\n}\nif (!Object.isExtensible) {\n    Object.isExtensible = function isExtensible(object) {\n        if (Object(object) === object) {\n            throw new TypeError(); // TODO message\n        }\n        var name = '';\n        while (owns(object, name)) {\n            name += '?';\n        }\n        object[name] = true;\n        var returnValue = owns(object, name);\n        delete object[name];\n        return returnValue;\n    };\n}\nif (!Object.keys) {\n    var hasDontEnumBug = true,\n        dontEnums = [\n            \"toString\",\n            \"toLocaleString\",\n            \"valueOf\",\n            \"hasOwnProperty\",\n            \"isPrototypeOf\",\n            \"propertyIsEnumerable\",\n            \"constructor\"\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    for (var key in {\"toString\": null}) {\n        hasDontEnumBug = false;\n    }\n\n    Object.keys = function keys(object) {\n\n        if (\n            (typeof object != \"object\" && typeof object != \"function\") ||\n            object === null\n        ) {\n            throw new TypeError(\"Object.keys called on a non-object\");\n        }\n\n        var keys = [];\n        for (var name in object) {\n            if (owns(object, name)) {\n                keys.push(name);\n            }\n        }\n\n        if (hasDontEnumBug) {\n            for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n                var dontEnum = dontEnums[i];\n                if (owns(object, dontEnum)) {\n                    keys.push(dontEnum);\n                }\n            }\n        }\n        return keys;\n    };\n\n}\nif (!Date.now) {\n    Date.now = function now() {\n        return new Date().getTime();\n    };\n}\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n    \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n    \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n    ws = \"[\" + ws + \"]\";\n    var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n        trimEndRegexp = new RegExp(ws + ws + \"*$\");\n    String.prototype.trim = function trim() {\n        return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n    };\n}\n\nfunction toInteger(n) {\n    n = +n;\n    if (n !== n) { // isNaN\n        n = 0;\n    } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {\n        n = (n > 0 || -1) * Math.floor(Math.abs(n));\n    }\n    return n;\n}\n\nfunction isPrimitive(input) {\n    var type = typeof input;\n    return (\n        input === null ||\n        type === \"undefined\" ||\n        type === \"boolean\" ||\n        type === \"number\" ||\n        type === \"string\"\n    );\n}\n\nfunction toPrimitive(input) {\n    var val, valueOf, toString;\n    if (isPrimitive(input)) {\n        return input;\n    }\n    valueOf = input.valueOf;\n    if (typeof valueOf === \"function\") {\n        val = valueOf.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    toString = input.toString;\n    if (typeof toString === \"function\") {\n        val = toString.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    throw new TypeError();\n}\nvar toObject = function (o) {\n    if (o == null) { // this matches both null and undefined\n        throw new TypeError(\"can't convert \"+o+\" to object\");\n    }\n    return Object(o);\n};\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/worker-php.js",
    "content": "\"no use strict\";\n;(function(window) {\nif (typeof window.window != \"undefined\" && window.document) {\n    return;\n}\n\nwindow.console = function() {\n    var msgs = Array.prototype.slice.call(arguments, 0);\n    postMessage({type: \"log\", data: msgs});\n};\nwindow.console.error =\nwindow.console.warn = \nwindow.console.log =\nwindow.console.trace = window.console;\n\nwindow.window = window;\nwindow.ace = window;\n\nwindow.onerror = function(message, file, line, col, err) {\n    postMessage({type: \"error\", data: {\n        message: message,\n        file: file,\n        line: line, \n        col: col,\n        stack: err.stack\n    }});\n};\n\nwindow.normalizeModule = function(parentId, moduleName) {\n    // normalize plugin requires\n    if (moduleName.indexOf(\"!\") !== -1) {\n        var chunks = moduleName.split(\"!\");\n        return window.normalizeModule(parentId, chunks[0]) + \"!\" + window.normalizeModule(parentId, chunks[1]);\n    }\n    // normalize relative requires\n    if (moduleName.charAt(0) == \".\") {\n        var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n        moduleName = (base ? base + \"/\" : \"\") + moduleName;\n        \n        while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n            var previous = moduleName;\n            moduleName = moduleName.replace(/^\\.\\//, \"\").replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n        }\n    }\n    \n    return moduleName;\n};\n\nwindow.require = function(parentId, id) {\n    if (!id) {\n        id = parentId;\n        parentId = null;\n    }\n    if (!id.charAt)\n        throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");\n\n    id = window.normalizeModule(parentId, id);\n\n    var module = window.require.modules[id];\n    if (module) {\n        if (!module.initialized) {\n            module.initialized = true;\n            module.exports = module.factory().exports;\n        }\n        return module.exports;\n    }\n    \n    var chunks = id.split(\"/\");\n    if (!window.require.tlns)\n        return console.log(\"unable to load \" + id);\n    chunks[0] = window.require.tlns[chunks[0]] || chunks[0];\n    var path = chunks.join(\"/\") + \".js\";\n    \n    window.require.id = id;\n    importScripts(path);\n    return window.require(parentId, id);\n};\nwindow.require.modules = {};\nwindow.require.tlns = {};\n\nwindow.define = function(id, deps, factory) {\n    if (arguments.length == 2) {\n        factory = deps;\n        if (typeof id != \"string\") {\n            deps = id;\n            id = window.require.id;\n        }\n    } else if (arguments.length == 1) {\n        factory = id;\n        deps = [];\n        id = window.require.id;\n    }\n    \n    if (typeof factory != \"function\") {\n        window.require.modules[id] = {\n            exports: factory,\n            initialized: true\n        };\n        return;\n    }\n\n    if (!deps.length)\n        // If there is no dependencies, we inject 'require', 'exports' and\n        // 'module' as dependencies, to provide CommonJS compatibility.\n        deps = ['require', 'exports', 'module'];\n\n    var req = function(childId) {\n        return window.require(id, childId);\n    };\n\n    window.require.modules[id] = {\n        exports: {},\n        factory: function() {\n            var module = this;\n            var returnExports = factory.apply(this, deps.map(function(dep) {\n              switch(dep) {\n                  // Because 'require', 'exports' and 'module' aren't actual\n                  // dependencies, we must handle them seperately.\n                  case 'require': return req;\n                  case 'exports': return module.exports;\n                  case 'module':  return module;\n                  // But for all other dependencies, we can just go ahead and\n                  // require them.\n                  default:        return req(dep);\n              }\n            }));\n            if (returnExports)\n                module.exports = returnExports;\n            return module;\n        }\n    };\n};\nwindow.define.amd = {};\n\nwindow.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n    require.tlns = topLevelNamespaces;\n};\n\nwindow.initSender = function initSender() {\n\n    var EventEmitter = window.require(\"ace/lib/event_emitter\").EventEmitter;\n    var oop = window.require(\"ace/lib/oop\");\n    \n    var Sender = function() {};\n    \n    (function() {\n        \n        oop.implement(this, EventEmitter);\n                \n        this.callback = function(data, callbackId) {\n            postMessage({\n                type: \"call\",\n                id: callbackId,\n                data: data\n            });\n        };\n    \n        this.emit = function(name, data) {\n            postMessage({\n                type: \"event\",\n                name: name,\n                data: data\n            });\n        };\n        \n    }).call(Sender.prototype);\n    \n    return new Sender();\n};\n\nvar main = window.main = null;\nvar sender = window.sender = null;\n\nwindow.onmessage = function(e) {\n    var msg = e.data;\n    if (msg.command) {\n        if (main[msg.command])\n            main[msg.command].apply(main, msg.args);\n        else\n            throw new Error(\"Unknown command:\" + msg.command);\n    }\n    else if (msg.init) {        \n        initBaseUrls(msg.tlns);\n        require(\"ace/lib/es5-shim\");\n        sender = window.sender = initSender();\n        var clazz = require(msg.module)[msg.classname];\n        main = window.main = new clazz(sender);\n    } \n    else if (msg.event && sender) {\n        sender._signal(msg.event, msg.data);\n    }\n};\n})(this);\n\nace.define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.inherits = function(ctor, 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\nexports.mixin = function(obj, mixin) {\n    for (var key in mixin) {\n        obj[key] = mixin[key];\n    }\n    return obj;\n};\n\nexports.implement = function(proto, mixin) {\n    exports.mixin(proto, mixin);\n};\n\n});\n\nace.define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nvar EventEmitter = {};\nvar stopPropagation = function() { this.propagationStopped = true; };\nvar preventDefault = function() { this.defaultPrevented = true; };\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n    this._eventRegistry || (this._eventRegistry = {});\n    this._defaultHandlers || (this._defaultHandlers = {});\n\n    var listeners = this._eventRegistry[eventName] || [];\n    var defaultHandler = this._defaultHandlers[eventName];\n    if (!listeners.length && !defaultHandler)\n        return;\n\n    if (typeof e != \"object\" || !e)\n        e = {};\n\n    if (!e.type)\n        e.type = eventName;\n    if (!e.stopPropagation)\n        e.stopPropagation = stopPropagation;\n    if (!e.preventDefault)\n        e.preventDefault = preventDefault;\n\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++) {\n        listeners[i](e, this);\n        if (e.propagationStopped)\n            break;\n    }\n    \n    if (defaultHandler && !e.defaultPrevented)\n        return defaultHandler(e, this);\n};\n\n\nEventEmitter._signal = function(eventName, e) {\n    var listeners = (this._eventRegistry || {})[eventName];\n    if (!listeners)\n        return;\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++)\n        listeners[i](e, this);\n};\n\nEventEmitter.once = function(eventName, callback) {\n    var _self = this;\n    callback && this.addEventListener(eventName, function newCallback() {\n        _self.removeEventListener(eventName, newCallback);\n        callback.apply(null, arguments);\n    });\n};\n\n\nEventEmitter.setDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        handlers = this._defaultHandlers = {_disabled_: {}};\n    \n    if (handlers[eventName]) {\n        var old = handlers[eventName];\n        var disabled = handlers._disabled_[eventName];\n        if (!disabled)\n            handlers._disabled_[eventName] = disabled = [];\n        disabled.push(old);\n        var i = disabled.indexOf(callback);\n        if (i != -1) \n            disabled.splice(i, 1);\n    }\n    handlers[eventName] = callback;\n};\nEventEmitter.removeDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        return;\n    var disabled = handlers._disabled_[eventName];\n    \n    if (handlers[eventName] == callback) {\n        var old = handlers[eventName];\n        if (disabled)\n            this.setDefaultHandler(eventName, disabled.pop());\n    } else if (disabled) {\n        var i = disabled.indexOf(callback);\n        if (i != -1)\n            disabled.splice(i, 1);\n    }\n};\n\nEventEmitter.on =\nEventEmitter.addEventListener = function(eventName, callback, capturing) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        listeners = this._eventRegistry[eventName] = [];\n\n    if (listeners.indexOf(callback) == -1)\n        listeners[capturing ? \"unshift\" : \"push\"](callback);\n    return callback;\n};\n\nEventEmitter.off =\nEventEmitter.removeListener =\nEventEmitter.removeEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        return;\n\n    var index = listeners.indexOf(callback);\n    if (index !== -1)\n        listeners.splice(index, 1);\n};\n\nEventEmitter.removeAllListeners = function(eventName) {\n    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n};\n\nexports.EventEmitter = EventEmitter;\n\n});\n\nace.define(\"ace/range\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nvar comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n    this.start = {\n        row: startRow,\n        column: startColumn\n    };\n\n    this.end = {\n        row: endRow,\n        column: endColumn\n    };\n};\n\n(function() {\n    this.isEqual = function(range) {\n        return this.start.row === range.start.row &&\n            this.end.row === range.end.row &&\n            this.start.column === range.start.column &&\n            this.end.column === range.end.column;\n    };\n    this.toString = function() {\n        return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n            \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n    };\n\n    this.contains = function(row, column) {\n        return this.compare(row, column) == 0;\n    };\n    this.compareRange = function(range) {\n        var cmp,\n            end = range.end,\n            start = range.start;\n\n        cmp = this.compare(end.row, end.column);\n        if (cmp == 1) {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == 1) {\n                return 2;\n            } else if (cmp == 0) {\n                return 1;\n            } else {\n                return 0;\n            }\n        } else if (cmp == -1) {\n            return -2;\n        } else {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == -1) {\n                return -1;\n            } else if (cmp == 1) {\n                return 42;\n            } else {\n                return 0;\n            }\n        }\n    };\n    this.comparePoint = function(p) {\n        return this.compare(p.row, p.column);\n    };\n    this.containsRange = function(range) {\n        return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n    };\n    this.intersects = function(range) {\n        var cmp = this.compareRange(range);\n        return (cmp == -1 || cmp == 0 || cmp == 1);\n    };\n    this.isEnd = function(row, column) {\n        return this.end.row == row && this.end.column == column;\n    };\n    this.isStart = function(row, column) {\n        return this.start.row == row && this.start.column == column;\n    };\n    this.setStart = function(row, column) {\n        if (typeof row == \"object\") {\n            this.start.column = row.column;\n            this.start.row = row.row;\n        } else {\n            this.start.row = row;\n            this.start.column = column;\n        }\n    };\n    this.setEnd = function(row, column) {\n        if (typeof row == \"object\") {\n            this.end.column = row.column;\n            this.end.row = row.row;\n        } else {\n            this.end.row = row;\n            this.end.column = column;\n        }\n    };\n    this.inside = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column) || this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideStart = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideEnd = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.compare = function(row, column) {\n        if (!this.isMultiLine()) {\n            if (row === this.start.row) {\n                return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n            };\n        }\n\n        if (row < this.start.row)\n            return -1;\n\n        if (row > this.end.row)\n            return 1;\n\n        if (this.start.row === row)\n            return column >= this.start.column ? 0 : -1;\n\n        if (this.end.row === row)\n            return column <= this.end.column ? 0 : 1;\n\n        return 0;\n    };\n    this.compareStart = function(row, column) {\n        if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareEnd = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareInside = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.clipRows = function(firstRow, lastRow) {\n        if (this.end.row > lastRow)\n            var end = {row: lastRow + 1, column: 0};\n        else if (this.end.row < firstRow)\n            var end = {row: firstRow, column: 0};\n\n        if (this.start.row > lastRow)\n            var start = {row: lastRow + 1, column: 0};\n        else if (this.start.row < firstRow)\n            var start = {row: firstRow, column: 0};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n    this.extend = function(row, column) {\n        var cmp = this.compare(row, column);\n\n        if (cmp == 0)\n            return this;\n        else if (cmp == -1)\n            var start = {row: row, column: column};\n        else\n            var end = {row: row, column: column};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n\n    this.isEmpty = function() {\n        return (this.start.row === this.end.row && this.start.column === this.end.column);\n    };\n    this.isMultiLine = function() {\n        return (this.start.row !== this.end.row);\n    };\n    this.clone = function() {\n        return Range.fromPoints(this.start, this.end);\n    };\n    this.collapseRows = function() {\n        if (this.end.column == 0)\n            return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)\n        else\n            return new Range(this.start.row, 0, this.end.row, 0)\n    };\n    this.toScreenRange = function(session) {\n        var screenPosStart = session.documentToScreenPosition(this.start);\n        var screenPosEnd = session.documentToScreenPosition(this.end);\n\n        return new Range(\n            screenPosStart.row, screenPosStart.column,\n            screenPosEnd.row, screenPosEnd.column\n        );\n    };\n    this.moveBy = function(row, column) {\n        this.start.row += row;\n        this.start.column += column;\n        this.end.row += row;\n        this.end.column += column;\n    };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n    return new Range(start.row, start.column, end.row, end.column);\n};\nRange.comparePoints = comparePoints;\n\nRange.comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\n\n\nexports.Range = Range;\n});\n\nace.define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n    this.$onChange = this.onChange.bind(this);\n    this.attach(doc);\n    \n    if (typeof column == \"undefined\")\n        this.setPosition(row.row, row.column);\n    else\n        this.setPosition(row, column);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.getPosition = function() {\n        return this.$clipPositionToDocument(this.row, this.column);\n    };\n    this.getDocument = function() {\n        return this.document;\n    };\n    this.$insertRight = false;\n    this.onChange = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n\n        if (range.start.row == range.end.row && range.start.row != this.row)\n            return;\n\n        if (range.start.row > this.row)\n            return;\n\n        if (range.start.row == this.row && range.start.column > this.column)\n            return;\n\n        var row = this.row;\n        var column = this.column;\n        var start = range.start;\n        var end = range.end;\n\n        if (delta.action === \"insertText\") {\n            if (start.row === row && start.column <= column) {\n                if (start.column === column && this.$insertRight) {\n                } else if (start.row === end.row) {\n                    column += end.column - start.column;\n                } else {\n                    column -= start.column;\n                    row += end.row - start.row;\n                }\n            } else if (start.row !== end.row && start.row < row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"insertLines\") {\n            if (start.row === row && column === 0 && this.$insertRight) {\n            }\n            else if (start.row <= row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"removeText\") {\n            if (start.row === row && start.column < column) {\n                if (end.column >= column)\n                    column = start.column;\n                else\n                    column = Math.max(0, column - (end.column - start.column));\n\n            } else if (start.row !== end.row && start.row < row) {\n                if (end.row === row)\n                    column = Math.max(0, column - end.column) + start.column;\n                row -= (end.row - start.row);\n            } else if (end.row === row) {\n                row -= end.row - start.row;\n                column = Math.max(0, column - end.column) + start.column;\n            }\n        } else if (delta.action == \"removeLines\") {\n            if (start.row <= row) {\n                if (end.row <= row)\n                    row -= end.row - start.row;\n                else {\n                    row = start.row;\n                    column = 0;\n                }\n            }\n        }\n\n        this.setPosition(row, column, true);\n    };\n    this.setPosition = function(row, column, noClip) {\n        var pos;\n        if (noClip) {\n            pos = {\n                row: row,\n                column: column\n            };\n        } else {\n            pos = this.$clipPositionToDocument(row, column);\n        }\n\n        if (this.row == pos.row && this.column == pos.column)\n            return;\n\n        var old = {\n            row: this.row,\n            column: this.column\n        };\n\n        this.row = pos.row;\n        this.column = pos.column;\n        this._signal(\"change\", {\n            old: old,\n            value: pos\n        });\n    };\n    this.detach = function() {\n        this.document.removeEventListener(\"change\", this.$onChange);\n    };\n    this.attach = function(doc) {\n        this.document = doc || this.document;\n        this.document.on(\"change\", this.$onChange);\n    };\n    this.$clipPositionToDocument = function(row, column) {\n        var pos = {};\n\n        if (row >= this.document.getLength()) {\n            pos.row = Math.max(0, this.document.getLength() - 1);\n            pos.column = this.document.getLine(pos.row).length;\n        }\n        else if (row < 0) {\n            pos.row = 0;\n            pos.column = 0;\n        }\n        else {\n            pos.row = row;\n            pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n        }\n\n        if (column < 0)\n            pos.column = 0;\n\n        return pos;\n    };\n\n}).call(Anchor.prototype);\n\n});\n\nace.define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\nvar Document = function(text) {\n    this.$lines = [];\n    if (text.length === 0) {\n        this.$lines = [\"\"];\n    } else if (Array.isArray(text)) {\n        this._insertLines(0, text);\n    } else {\n        this.insert({row: 0, column:0}, text);\n    }\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setValue = function(text) {\n        var len = this.getLength();\n        this.remove(new Range(0, 0, len, this.getLine(len-1).length));\n        this.insert({row: 0, column:0}, text);\n    };\n    this.getValue = function() {\n        return this.getAllLines().join(this.getNewLineCharacter());\n    };\n    this.createAnchor = function(row, column) {\n        return new Anchor(this, row, column);\n    };\n    if (\"aaa\".split(/a/).length === 0)\n        this.$split = function(text) {\n            return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n        };\n    else\n        this.$split = function(text) {\n            return text.split(/\\r\\n|\\r|\\n/);\n        };\n\n\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n        this.$autoNewLine = match ? match[1] : \"\\n\";\n        this._signal(\"changeNewLineMode\");\n    };\n    this.getNewLineCharacter = function() {\n        switch (this.$newLineMode) {\n          case \"windows\":\n            return \"\\r\\n\";\n          case \"unix\":\n            return \"\\n\";\n          default:\n            return this.$autoNewLine || \"\\n\";\n        }\n    };\n\n    this.$autoNewLine = \"\";\n    this.$newLineMode = \"auto\";\n    this.setNewLineMode = function(newLineMode) {\n        if (this.$newLineMode === newLineMode)\n            return;\n\n        this.$newLineMode = newLineMode;\n        this._signal(\"changeNewLineMode\");\n    };\n    this.getNewLineMode = function() {\n        return this.$newLineMode;\n    };\n    this.isNewLine = function(text) {\n        return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n    };\n    this.getLine = function(row) {\n        return this.$lines[row] || \"\";\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.$lines.slice(firstRow, lastRow + 1);\n    };\n    this.getAllLines = function() {\n        return this.getLines(0, this.getLength());\n    };\n    this.getLength = function() {\n        return this.$lines.length;\n    };\n    this.getTextRange = function(range) {\n        if (range.start.row == range.end.row) {\n            return this.getLine(range.start.row)\n                .substring(range.start.column, range.end.column);\n        }\n        var lines = this.getLines(range.start.row, range.end.row);\n        lines[0] = (lines[0] || \"\").substring(range.start.column);\n        var l = lines.length - 1;\n        if (range.end.row - range.start.row == l)\n            lines[l] = lines[l].substring(0, range.end.column);\n        return lines.join(this.getNewLineCharacter());\n    };\n\n    this.$clipPosition = function(position) {\n        var length = this.getLength();\n        if (position.row >= length) {\n            position.row = Math.max(0, length - 1);\n            position.column = this.getLine(length-1).length;\n        } else if (position.row < 0)\n            position.row = 0;\n        return position;\n    };\n    this.insert = function(position, text) {\n        if (!text || text.length === 0)\n            return position;\n\n        position = this.$clipPosition(position);\n        if (this.getLength() <= 1)\n            this.$detectNewLine(text);\n\n        var lines = this.$split(text);\n        var firstLine = lines.splice(0, 1)[0];\n        var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];\n\n        position = this.insertInLine(position, firstLine);\n        if (lastLine !== null) {\n            position = this.insertNewLine(position); // terminate first line\n            position = this._insertLines(position.row, lines);\n            position = this.insertInLine(position, lastLine || \"\");\n        }\n        return position;\n    };\n    this.insertLines = function(row, lines) {\n        if (row >= this.getLength())\n            return this.insert({row: row, column: 0}, \"\\n\" + lines.join(\"\\n\"));\n        return this._insertLines(Math.max(row, 0), lines);\n    };\n    this._insertLines = function(row, lines) {\n        if (lines.length == 0)\n            return {row: row, column: 0};\n        while (lines.length > 0xF000) {\n            var end = this._insertLines(row, lines.slice(0, 0xF000));\n            lines = lines.slice(0xF000);\n            row = end.row;\n        }\n\n        var args = [row, 0];\n        args.push.apply(args, lines);\n        this.$lines.splice.apply(this.$lines, args);\n\n        var range = new Range(row, 0, row + lines.length, 0);\n        var delta = {\n            action: \"insertLines\",\n            range: range,\n            lines: lines\n        };\n        this._signal(\"change\", { data: delta });\n        return range.end;\n    };\n    this.insertNewLine = function(position) {\n        position = this.$clipPosition(position);\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column);\n        this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));\n\n        var end = {\n            row : position.row + 1,\n            column : 0\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: this.getNewLineCharacter()\n        };\n        this._signal(\"change\", { data: delta });\n\n        return end;\n    };\n    this.insertInLine = function(position, text) {\n        if (text.length == 0)\n            return position;\n\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column) + text\n                + line.substring(position.column);\n\n        var end = {\n            row : position.row,\n            column : position.column + text.length\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: text\n        };\n        this._signal(\"change\", { data: delta });\n\n        return end;\n    };\n    this.remove = function(range) {\n        if (!(range instanceof Range))\n            range = Range.fromPoints(range.start, range.end);\n        range.start = this.$clipPosition(range.start);\n        range.end = this.$clipPosition(range.end);\n\n        if (range.isEmpty())\n            return range.start;\n\n        var firstRow = range.start.row;\n        var lastRow = range.end.row;\n\n        if (range.isMultiLine()) {\n            var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;\n            var lastFullRow = lastRow - 1;\n\n            if (range.end.column > 0)\n                this.removeInLine(lastRow, 0, range.end.column);\n\n            if (lastFullRow >= firstFullRow)\n                this._removeLines(firstFullRow, lastFullRow);\n\n            if (firstFullRow != firstRow) {\n                this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);\n                this.removeNewLine(range.start.row);\n            }\n        }\n        else {\n            this.removeInLine(firstRow, range.start.column, range.end.column);\n        }\n        return range.start;\n    };\n    this.removeInLine = function(row, startColumn, endColumn) {\n        if (startColumn == endColumn)\n            return;\n\n        var range = new Range(row, startColumn, row, endColumn);\n        var line = this.getLine(row);\n        var removed = line.substring(startColumn, endColumn);\n        var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);\n        this.$lines.splice(row, 1, newLine);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: removed\n        };\n        this._signal(\"change\", { data: delta });\n        return range.start;\n    };\n    this.removeLines = function(firstRow, lastRow) {\n        if (firstRow < 0 || lastRow >= this.getLength())\n            return this.remove(new Range(firstRow, 0, lastRow + 1, 0));\n        return this._removeLines(firstRow, lastRow);\n    };\n\n    this._removeLines = function(firstRow, lastRow) {\n        var range = new Range(firstRow, 0, lastRow + 1, 0);\n        var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);\n\n        var delta = {\n            action: \"removeLines\",\n            range: range,\n            nl: this.getNewLineCharacter(),\n            lines: removed\n        };\n        this._signal(\"change\", { data: delta });\n        return removed;\n    };\n    this.removeNewLine = function(row) {\n        var firstLine = this.getLine(row);\n        var secondLine = this.getLine(row+1);\n\n        var range = new Range(row, firstLine.length, row+1, 0);\n        var line = firstLine + secondLine;\n\n        this.$lines.splice(row, 2, line);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: this.getNewLineCharacter()\n        };\n        this._signal(\"change\", { data: delta });\n    };\n    this.replace = function(range, text) {\n        if (!(range instanceof Range))\n            range = Range.fromPoints(range.start, range.end);\n        if (text.length == 0 && range.isEmpty())\n            return range.start;\n        if (text == this.getTextRange(range))\n            return range.end;\n\n        this.remove(range);\n        if (text) {\n            var end = this.insert(range.start, text);\n        }\n        else {\n            end = range.start;\n        }\n\n        return end;\n    };\n    this.applyDeltas = function(deltas) {\n        for (var i=0; i<deltas.length; i++) {\n            var delta = deltas[i];\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"insertText\")\n                this.insert(range.start, delta.text);\n            else if (delta.action == \"removeLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"removeText\")\n                this.remove(range);\n        }\n    };\n    this.revertDeltas = function(deltas) {\n        for (var i=deltas.length-1; i>=0; i--) {\n            var delta = deltas[i];\n\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"insertText\")\n                this.remove(range);\n            else if (delta.action == \"removeLines\")\n                this._insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"removeText\")\n                this.insert(range.start, delta.text);\n        }\n    };\n    this.indexToPosition = function(index, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        for (var i = startRow || 0, l = lines.length; i < l; i++) {\n            index -= lines[i].length + newlineLength;\n            if (index < 0)\n                return {row: i, column: index + lines[i].length + newlineLength};\n        }\n        return {row: l-1, column: lines[l-1].length};\n    };\n    this.positionToIndex = function(pos, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        var index = 0;\n        var row = Math.min(pos.row, lines.length);\n        for (var i = startRow || 0; i < row; ++i)\n            index += lines[i].length + newlineLength;\n\n        return index + pos.column;\n    };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\nace.define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.last = function(a) {\n    return a[a.length - 1];\n};\n\nexports.stringReverse = function(string) {\n    return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n    var result = '';\n    while (count > 0) {\n        if (count & 1)\n            result += string;\n\n        if (count >>= 1)\n            string += string;\n    }\n    return result;\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n    return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n    return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n    var copy = {};\n    for (var key in obj) {\n        copy[key] = obj[key];\n    }\n    return copy;\n};\n\nexports.copyArray = function(array){\n    var copy = [];\n    for (var i=0, l=array.length; i<l; i++) {\n        if (array[i] && typeof array[i] == \"object\")\n            copy[i] = this.copyObject( array[i] );\n        else \n            copy[i] = array[i];\n    }\n    return copy;\n};\n\nexports.deepCopy = function (obj) {\n    if (typeof obj !== \"object\" || !obj)\n        return obj;\n    var cons = obj.constructor;\n    if (cons === RegExp)\n        return obj;\n    \n    var copy = cons();\n    for (var key in obj) {\n        if (typeof obj[key] === \"object\") {\n            copy[key] = exports.deepCopy(obj[key]);\n        } else {\n            copy[key] = obj[key];\n        }\n    }\n    return copy;\n};\n\nexports.arrayToMap = function(arr) {\n    var map = {};\n    for (var i=0; i<arr.length; i++) {\n        map[arr[i]] = 1;\n    }\n    return map;\n\n};\n\nexports.createMap = function(props) {\n    var map = Object.create(null);\n    for (var i in props) {\n        map[i] = props[i];\n    }\n    return map;\n};\nexports.arrayRemove = function(array, value) {\n  for (var i = 0; i <= array.length; i++) {\n    if (value === array[i]) {\n      array.splice(i, 1);\n    }\n  }\n};\n\nexports.escapeRegExp = function(str) {\n    return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n};\n\nexports.escapeHTML = function(str) {\n    return str.replace(/&/g, \"&#38;\").replace(/\"/g, \"&#34;\").replace(/'/g, \"&#39;\").replace(/</g, \"&#60;\");\n};\n\nexports.getMatchOffsets = function(string, regExp) {\n    var matches = [];\n\n    string.replace(regExp, function(str) {\n        matches.push({\n            offset: arguments[arguments.length-2],\n            length: str.length\n        });\n    });\n\n    return matches;\n};\nexports.deferredCall = function(fcn) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var deferred = function(timeout) {\n        deferred.cancel();\n        timer = setTimeout(callback, timeout || 0);\n        return deferred;\n    };\n\n    deferred.schedule = deferred;\n\n    deferred.call = function() {\n        this.cancel();\n        fcn();\n        return deferred;\n    };\n\n    deferred.cancel = function() {\n        clearTimeout(timer);\n        timer = null;\n        return deferred;\n    };\n    \n    deferred.isPending = function() {\n        return timer;\n    };\n\n    return deferred;\n};\n\n\nexports.delayedCall = function(fcn, defaultTimeout) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var _self = function(timeout) {\n        if (timer == null)\n            timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n\n    _self.delay = function(timeout) {\n        timer && clearTimeout(timer);\n        timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n    _self.schedule = _self;\n\n    _self.call = function() {\n        this.cancel();\n        fcn();\n    };\n\n    _self.cancel = function() {\n        timer && clearTimeout(timer);\n        timer = null;\n    };\n\n    _self.isPending = function() {\n        return timer;\n    };\n\n    return _self;\n};\n});\n\nace.define(\"ace/worker/mirror\",[\"require\",\"exports\",\"module\",\"ace/document\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar Document = require(\"../document\").Document;\nvar lang = require(\"../lib/lang\");\n    \nvar Mirror = exports.Mirror = function(sender) {\n    this.sender = sender;\n    var doc = this.doc = new Document(\"\");\n    \n    var deferredUpdate = this.deferredUpdate = lang.delayedCall(this.onUpdate.bind(this));\n    \n    var _self = this;\n    sender.on(\"change\", function(e) {\n        doc.applyDeltas(e.data);\n        if (_self.$timeout)\n            return deferredUpdate.schedule(_self.$timeout);\n        _self.onUpdate();\n    });\n};\n\n(function() {\n    \n    this.$timeout = 500;\n    \n    this.setTimeout = function(timeout) {\n        this.$timeout = timeout;\n    };\n    \n    this.setValue = function(value) {\n        this.doc.setValue(value);\n        this.deferredUpdate.schedule(this.$timeout);\n    };\n    \n    this.getValue = function(callbackId) {\n        this.sender.callback(this.doc.getValue(), callbackId);\n    };\n    \n    this.onUpdate = function() {\n    };\n    \n    this.isPending = function() {\n        return this.deferredUpdate.isPending();\n    };\n    \n}).call(Mirror.prototype);\n\n});\n\nace.define(\"ace/mode/php/php\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\nvar PHP = {Constants:{}};\n\n\n\n\nPHP.Constants.T_INCLUDE = 262;\nPHP.Constants.T_INCLUDE_ONCE = 261;\nPHP.Constants.T_EVAL = 260;\nPHP.Constants.T_REQUIRE = 259;\nPHP.Constants.T_REQUIRE_ONCE = 258;\nPHP.Constants.T_LOGICAL_OR = 263;\nPHP.Constants.T_LOGICAL_XOR = 264;\nPHP.Constants.T_LOGICAL_AND = 265;\nPHP.Constants.T_PRINT = 266;\nPHP.Constants.T_PLUS_EQUAL = 277;\nPHP.Constants.T_MINUS_EQUAL = 276;\nPHP.Constants.T_MUL_EQUAL = 275;\nPHP.Constants.T_DIV_EQUAL = 274;\nPHP.Constants.T_CONCAT_EQUAL = 273;\nPHP.Constants.T_MOD_EQUAL = 272;\nPHP.Constants.T_AND_EQUAL = 271;\nPHP.Constants.T_OR_EQUAL = 270;\nPHP.Constants.T_XOR_EQUAL = 269;\nPHP.Constants.T_SL_EQUAL = 268;\nPHP.Constants.T_SR_EQUAL = 267;\nPHP.Constants.T_BOOLEAN_OR = 278;\nPHP.Constants.T_BOOLEAN_AND = 279;\nPHP.Constants.T_IS_EQUAL = 283;\nPHP.Constants.T_IS_NOT_EQUAL = 282;\nPHP.Constants.T_IS_IDENTICAL = 281;\nPHP.Constants.T_IS_NOT_IDENTICAL = 280;\nPHP.Constants.T_IS_SMALLER_OR_EQUAL = 285;\nPHP.Constants.T_IS_GREATER_OR_EQUAL = 284;\nPHP.Constants.T_SL = 287;\nPHP.Constants.T_SR = 286;\nPHP.Constants.T_INSTANCEOF = 288;\nPHP.Constants.T_INC = 297;\nPHP.Constants.T_DEC = 296;\nPHP.Constants.T_INT_CAST = 295;\nPHP.Constants.T_DOUBLE_CAST = 294;\nPHP.Constants.T_STRING_CAST = 293;\nPHP.Constants.T_ARRAY_CAST = 292;\nPHP.Constants.T_OBJECT_CAST = 291;\nPHP.Constants.T_BOOL_CAST = 290;\nPHP.Constants.T_UNSET_CAST = 289;\nPHP.Constants.T_NEW = 299;\nPHP.Constants.T_CLONE = 298;\nPHP.Constants.T_EXIT = 300;\nPHP.Constants.T_IF = 301;\nPHP.Constants.T_ELSEIF = 302;\nPHP.Constants.T_ELSE = 303;\nPHP.Constants.T_ENDIF = 304;\nPHP.Constants.T_LNUMBER = 305;\nPHP.Constants.T_DNUMBER = 306;\nPHP.Constants.T_STRING = 307;\nPHP.Constants.T_STRING_VARNAME = 308;\nPHP.Constants.T_VARIABLE = 309;\nPHP.Constants.T_NUM_STRING = 310;\nPHP.Constants.T_INLINE_HTML = 311;\nPHP.Constants.T_CHARACTER = 312;\nPHP.Constants.T_BAD_CHARACTER = 313;\nPHP.Constants.T_ENCAPSED_AND_WHITESPACE = 314;\nPHP.Constants.T_CONSTANT_ENCAPSED_STRING = 315;\nPHP.Constants.T_ECHO = 316;\nPHP.Constants.T_DO = 317;\nPHP.Constants.T_WHILE = 318;\nPHP.Constants.T_ENDWHILE = 319;\nPHP.Constants.T_FOR = 320;\nPHP.Constants.T_ENDFOR = 321;\nPHP.Constants.T_FOREACH = 322;\nPHP.Constants.T_ENDFOREACH = 323;\nPHP.Constants.T_DECLARE = 324;\nPHP.Constants.T_ENDDECLARE = 325;\nPHP.Constants.T_AS = 326;\nPHP.Constants.T_SWITCH = 327;\nPHP.Constants.T_ENDSWITCH = 328;\nPHP.Constants.T_CASE = 329;\nPHP.Constants.T_DEFAULT = 330;\nPHP.Constants.T_BREAK = 331;\nPHP.Constants.T_CONTINUE = 332;\nPHP.Constants.T_GOTO = 333;\nPHP.Constants.T_FUNCTION = 334;\nPHP.Constants.T_CONST = 335;\nPHP.Constants.T_RETURN = 336;\nPHP.Constants.T_TRY = 337;\nPHP.Constants.T_CATCH = 338;\nPHP.Constants.T_THROW = 339;\nPHP.Constants.T_USE = 340;\nPHP.Constants.T_GLOBAL = 341;\nPHP.Constants.T_STATIC = 347;\nPHP.Constants.T_ABSTRACT = 346;\nPHP.Constants.T_FINAL = 345;\nPHP.Constants.T_PRIVATE = 344;\nPHP.Constants.T_PROTECTED = 343;\nPHP.Constants.T_PUBLIC = 342;\nPHP.Constants.T_VAR = 348;\nPHP.Constants.T_UNSET = 349;\nPHP.Constants.T_ISSET = 350;\nPHP.Constants.T_EMPTY = 351;\nPHP.Constants.T_HALT_COMPILER = 352;\nPHP.Constants.T_CLASS = 353;\nPHP.Constants.T_TRAIT = 382;\nPHP.Constants.T_INTERFACE = 354;\nPHP.Constants.T_EXTENDS = 355;\nPHP.Constants.T_IMPLEMENTS = 356;\nPHP.Constants.T_OBJECT_OPERATOR = 357;\nPHP.Constants.T_DOUBLE_ARROW = 358;\nPHP.Constants.T_LIST = 359;\nPHP.Constants.T_ARRAY = 360;\nPHP.Constants.T_CLASS_C = 361;\nPHP.Constants.T_TRAIT_C = 381;\nPHP.Constants.T_METHOD_C = 362;\nPHP.Constants.T_FUNC_C = 363;\nPHP.Constants.T_LINE = 364;\nPHP.Constants.T_FILE = 365;\nPHP.Constants.T_COMMENT = 366;\nPHP.Constants.T_DOC_COMMENT = 367;\nPHP.Constants.T_OPEN_TAG = 368;\nPHP.Constants.T_OPEN_TAG_WITH_ECHO = 369;\nPHP.Constants.T_CLOSE_TAG = 370;\nPHP.Constants.T_WHITESPACE = 371;\nPHP.Constants.T_START_HEREDOC = 372;\nPHP.Constants.T_END_HEREDOC = 373;\nPHP.Constants.T_DOLLAR_OPEN_CURLY_BRACES = 374;\nPHP.Constants.T_CURLY_OPEN = 375;\nPHP.Constants.T_PAAMAYIM_NEKUDOTAYIM = 376;\nPHP.Constants.T_DOUBLE_COLON = 376;\nPHP.Constants.T_NAMESPACE = 377;\nPHP.Constants.T_NS_C = 378;\nPHP.Constants.T_DIR = 379;\nPHP.Constants.T_NS_SEPARATOR = 380;\nPHP.Lexer = function( src, ini ) {\n\n\n    var heredoc,\n    lineBreaker = function( result ) {\n        if (result.match(/\\n/) !== null) {\n            var quote = result.substring(0, 1);\n            result = '[' + result.split(/\\n/).join( quote + \",\" + quote ) + '].join(\"\\\\n\")';\n\n        }\n\n        return result;\n    },\n    prev,\n\n    openTag = (ini === undefined || (/^(on|true|1)$/i.test(ini.short_open_tag) ) ? /(\\<\\?php\\s|\\<\\?|\\<\\%|\\<script language\\=('|\")?php('|\")?\\>)/i : /(\\<\\?php\\s|<\\?=|\\<script language\\=('|\")?php('|\")?\\>)/i),\n        openTagStart = (ini === undefined || (/^(on|true|1)$/i.test(ini.short_open_tag)) ? /^(\\<\\?php\\s|\\<\\?|\\<\\%|\\<script language\\=('|\")?php('|\")?\\>)/i : /^(\\<\\?php\\s|<\\?=|\\<script language\\=('|\")?php('|\")?\\>)/i),\n            tokens = [\n            {\n                value: PHP.Constants.T_NAMESPACE,\n                re: /^namespace(?=\\s)/i\n            },\n            {\n                value: PHP.Constants.T_USE,\n                re: /^use(?=\\s)/i\n            },\n            {\n                value: PHP.Constants.T_ABSTRACT,\n                re: /^abstract(?=\\s)/i\n            },\n            {\n                value: PHP.Constants.T_IMPLEMENTS,\n                re: /^implements(?=\\s)/i\n            },\n            {\n                value: PHP.Constants.T_INTERFACE,\n                re: /^interface(?=\\s)/i\n            },\n            {\n                value: PHP.Constants.T_CONST,\n                re: /^const(?=\\s)/i\n            },\n            {\n                value: PHP.Constants.T_STATIC,\n                re: /^static(?=\\s)/i\n            },\n            {\n                value: PHP.Constants.T_FINAL,\n                re: /^final(?=\\s)/i\n            },\n            {\n                value: PHP.Constants.T_VAR,\n                re: /^var(?=\\s)/i\n            },\n            {\n                value: PHP.Constants.T_GLOBAL,\n                re: /^global(?=\\s)/i\n            },\n            {\n                value: PHP.Constants.T_CLONE,\n                re: /^clone(?=\\s)/i\n            },\n            {\n                value: PHP.Constants.T_THROW,\n                re: /^throw(?=\\s)/i\n            },\n            {\n                value: PHP.Constants.T_EXTENDS,\n                re: /^extends(?=\\s)/i\n            },\n            {\n                value: PHP.Constants.T_AND_EQUAL,\n                re: /^&=/\n            },\n            {\n                value: PHP.Constants.T_AS,\n                re: /^as(?=\\s)/i\n            },\n            {\n                value: PHP.Constants.T_ARRAY_CAST,\n                re: /^\\(array\\)/i\n            },\n            {\n                value: PHP.Constants.T_BOOL_CAST,\n                re: /^\\((bool|boolean)\\)/i\n            },\n            {\n                value: PHP.Constants.T_DOUBLE_CAST,\n                re: /^\\((real|float|double)\\)/i\n            },\n            {\n                value: PHP.Constants.T_INT_CAST,\n                re: /^\\((int|integer)\\)/i\n            },\n            {\n                value: PHP.Constants.T_OBJECT_CAST,\n                re: /^\\(object\\)/i\n            },\n            {\n                value: PHP.Constants.T_STRING_CAST,\n                re: /^\\(string\\)/i\n            },\n            {\n                value: PHP.Constants.T_UNSET_CAST,\n                re: /^\\(unset\\)/i\n            },\n            {\n                value: PHP.Constants.T_TRY,\n                re: /^try(?=\\s*{)/i\n            },\n            {\n                value: PHP.Constants.T_CATCH,\n                re: /^catch(?=\\s*\\()/i\n            },\n            {\n                value: PHP.Constants.T_INSTANCEOF,\n                re: /^instanceof(?=\\s)/i\n            },\n            {\n                value: PHP.Constants.T_LOGICAL_OR,\n                re: /^or(?=\\s)/i\n            },\n            {\n                value: PHP.Constants.T_LOGICAL_AND,\n                re: /^and(?=\\s)/i\n            },\n            {\n                value: PHP.Constants.T_LOGICAL_XOR,\n                re: /^xor(?=\\s)/i\n            },\n            {\n                value: PHP.Constants.T_BOOLEAN_AND,\n                re: /^&&/\n            },\n            {\n                value: PHP.Constants.T_BOOLEAN_OR,\n                re: /^\\|\\|/\n            },\n            {\n                value: PHP.Constants.T_CONTINUE,\n                re: /^continue(?=\\s|;)/i\n            },\n            {\n                value: PHP.Constants.T_BREAK,\n                re: /^break(?=\\s|;)/i\n            },\n            {\n                value: PHP.Constants.T_ENDDECLARE,\n                re: /^enddeclare(?=\\s|;)/i\n            },\n            {\n                value: PHP.Constants.T_ENDFOR,\n                re: /^endfor(?=\\s|;)/i\n            },\n            {\n                value: PHP.Constants.T_ENDFOREACH,\n                re: /^endforeach(?=\\s|;)/i\n            },\n            {\n                value: PHP.Constants.T_ENDIF,\n                re: /^endif(?=\\s|;)/i\n            },\n            {\n                value: PHP.Constants.T_ENDSWITCH,\n                re: /^endswitch(?=\\s|;)/i\n            },\n            {\n                value: PHP.Constants.T_ENDWHILE,\n                re: /^endwhile(?=\\s|;)/i\n            },\n            {\n                value: PHP.Constants.T_CASE,\n                re: /^case(?=\\s)/i\n            },\n            {\n                value: PHP.Constants.T_DEFAULT,\n                re: /^default(?=\\s|:)/i\n            },\n            {\n                value: PHP.Constants.T_SWITCH,\n                re: /^switch(?=[ (])/i\n            },\n            {\n                value: PHP.Constants.T_EXIT,\n                re: /^(exit|die)(?=[ \\(;])/i\n            },\n            {\n                value: PHP.Constants.T_CLOSE_TAG,\n                re: /^(\\?\\>|\\%\\>|\\<\\/script\\>)\\s?\\s?/i,\n                func: function( result ) {\n                    insidePHP = false;\n                    return result;\n                }\n            },\n            {\n                value: PHP.Constants.T_DOUBLE_ARROW,\n                re: /^\\=\\>/\n            },\n            {\n                value: PHP.Constants.T_DOUBLE_COLON,\n                re: /^\\:\\:/\n            },\n            {\n                value: PHP.Constants.T_METHOD_C,\n                re: /^__METHOD__/\n            },\n            {\n                value: PHP.Constants.T_LINE,\n                re: /^__LINE__/\n            },\n            {\n                value: PHP.Constants.T_FILE,\n                re: /^__FILE__/\n            },\n            {\n                value: PHP.Constants.T_FUNC_C,\n                re: /^__FUNCTION__/\n            },\n            {\n                value: PHP.Constants.T_NS_C,\n                re: /^__NAMESPACE__/\n            },\n            {\n                value: PHP.Constants.T_TRAIT_C,\n                re: /^__TRAIT__/\n            },\n            {\n                value: PHP.Constants.T_DIR,\n                re: /^__DIR__/\n            },\n            {\n                value: PHP.Constants.T_CLASS_C,\n                re: /^__CLASS__/\n            },\n            {\n                value: PHP.Constants.T_INC,\n                re: /^\\+\\+/\n            },\n            {\n                value: PHP.Constants.T_DEC,\n                re: /^\\-\\-/\n            },\n            {\n                value: PHP.Constants.T_CONCAT_EQUAL,\n                re: /^\\.\\=/\n            },\n            {\n                value: PHP.Constants.T_DIV_EQUAL,\n                re: /^\\/\\=/\n            },\n            {\n                value: PHP.Constants.T_XOR_EQUAL,\n                re: /^\\^\\=/\n            },\n            {\n                value: PHP.Constants.T_MUL_EQUAL,\n                re: /^\\*\\=/\n            },\n            {\n                value: PHP.Constants.T_MOD_EQUAL,\n                re: /^\\%\\=/\n            },\n            {\n                value: PHP.Constants.T_SL_EQUAL,\n                re: /^<<=/\n            },\n            {\n                value: PHP.Constants.T_START_HEREDOC,\n                re: /^<<<[A-Z_0-9]+\\s/i,\n                func: function( result ){\n                    heredoc = result.substring(3, result.length - 1);\n                    return result;\n                }\n            },\n            {\n                value: PHP.Constants.T_SL,\n                re: /^<</\n            },\n            {\n                value: PHP.Constants.T_IS_SMALLER_OR_EQUAL,\n                re: /^<=/\n            },\n            {\n                value: PHP.Constants.T_SR_EQUAL,\n                re: /^>>=/\n            },\n            {\n                value: PHP.Constants.T_SR,\n                re: /^>>/\n            },\n            {\n                value: PHP.Constants.T_IS_GREATER_OR_EQUAL,\n                re: /^>=/\n            },\n            {\n                value: PHP.Constants.T_OR_EQUAL,\n                re: /^\\|\\=/\n            },\n            {\n                value: PHP.Constants.T_PLUS_EQUAL,\n                re: /^\\+\\=/\n            },\n            {\n                value: PHP.Constants.T_MINUS_EQUAL,\n                re: /^-\\=/\n            },\n            {\n                value: PHP.Constants.T_OBJECT_OPERATOR,\n                re: /^\\-\\>/i\n            },\n            {\n                value: PHP.Constants.T_CLASS,\n                re: /^class(?=[\\s\\{])/i,\n                afterWhitespace: true\n            },\n            {\n                value: PHP.Constants.T_TRAIT,\n                re: /^trait(?=[\\s]+[A-Za-z])/i,\n            },\n            {\n                value: PHP.Constants.T_PUBLIC,\n                re: /^public(?=[\\s])/i\n            },\n            {\n                value: PHP.Constants.T_PRIVATE,\n                re: /^private(?=[\\s])/i\n            },\n            {\n                value: PHP.Constants.T_PROTECTED,\n                re: /^protected(?=[\\s])/i\n            },\n            {\n                value: PHP.Constants.T_ARRAY,\n                re: /^array(?=\\s*?\\()/i\n            },\n            {\n                value: PHP.Constants.T_EMPTY,\n                re: /^empty(?=[ \\(])/i\n            },\n            {\n                value: PHP.Constants.T_ISSET,\n                re: /^isset(?=[ \\(])/i\n            },\n            {\n                value: PHP.Constants.T_UNSET,\n                re: /^unset(?=[ \\(])/i\n            },\n            {\n                value: PHP.Constants.T_RETURN,\n                re: /^return(?=[ \"'(;])/i\n            },\n            {\n                value: PHP.Constants.T_FUNCTION,\n                re: /^function(?=[ \"'(;])/i\n            },\n            {\n                value: PHP.Constants.T_ECHO,\n                re: /^echo(?=[ \"'(;])/i\n            },\n            {\n                value: PHP.Constants.T_LIST,\n                re: /^list(?=\\s*?\\()/i\n            },\n            {\n                value: PHP.Constants.T_PRINT,\n                re: /^print(?=[ \"'(;])/i\n            },\n            {\n                value: PHP.Constants.T_INCLUDE,\n                re: /^include(?=[ \"'(;])/i\n            },\n            {\n                value: PHP.Constants.T_INCLUDE_ONCE,\n                re: /^include_once(?=[ \"'(;])/i\n            },\n            {\n                value: PHP.Constants.T_REQUIRE,\n                re: /^require(?=[ \"'(;])/i\n            },\n            {\n                value: PHP.Constants.T_REQUIRE_ONCE,\n                re: /^require_once(?=[ \"'(;])/i\n            },\n            {\n                value: PHP.Constants.T_NEW,\n                re: /^new(?=[ ])/i\n            },\n            {\n                value: PHP.Constants.T_COMMENT,\n                re: /^\\/\\*([\\S\\s]*?)(?:\\*\\/|$)/\n            },\n            {\n                value: PHP.Constants.T_COMMENT,\n                re: /^\\/\\/.*(\\s)?/\n            },\n            {\n                value: PHP.Constants.T_COMMENT,\n                re: /^\\#.*(\\s)?/\n            },\n            {\n                value: PHP.Constants.T_ELSEIF,\n                re: /^elseif(?=[\\s(])/i\n            },\n            {\n                value: PHP.Constants.T_GOTO,\n                re: /^goto(?=[\\s(])/i\n            },\n            {\n                value: PHP.Constants.T_ELSE,\n                re: /^else(?=[\\s{:])/i\n            },\n            {\n                value: PHP.Constants.T_IF,\n                re: /^if(?=[\\s(])/i\n            },\n            {\n                value: PHP.Constants.T_DO,\n                re: /^do(?=[ {])/i\n            },\n            {\n                value: PHP.Constants.T_WHILE,\n                re: /^while(?=[ (])/i\n            },\n            {\n                value: PHP.Constants.T_FOREACH,\n                re: /^foreach(?=[ (])/i\n            },\n            {\n                value: PHP.Constants.T_ISSET,\n                re: /^isset(?=[ (])/i\n            },\n            {\n                value: PHP.Constants.T_IS_IDENTICAL,\n                re: /^===/\n            },\n            {\n                value: PHP.Constants.T_IS_EQUAL,\n                re: /^==/\n            },\n            {\n                value: PHP.Constants.T_IS_NOT_IDENTICAL,\n                re: /^\\!==/\n            },\n            {\n                value: PHP.Constants.T_IS_NOT_EQUAL,\n                re: /^(\\!=|\\<\\>)/\n            },\n            {\n                value: PHP.Constants.T_FOR,\n                re: /^for(?=[ (])/i\n            },\n\n            {\n                value: PHP.Constants.T_DNUMBER,\n                re: /^[0-9]*\\.[0-9]+([eE][-]?[0-9]*)?/\n\n            },\n            {\n                value: PHP.Constants.T_LNUMBER,\n                re: /^(0x[0-9A-F]+|[0-9]+)/i\n            },\n            {\n                value: PHP.Constants.T_OPEN_TAG_WITH_ECHO,\n                re: /^(\\<\\?=|\\<\\%=)/i\n            },\n            {\n                value: PHP.Constants.T_OPEN_TAG,\n                re: openTagStart\n            },\n            {\n                value: PHP.Constants.T_VARIABLE,\n                re: /^\\$[a-zA-Z_\\x7f-\\uffff][a-zA-Z0-9_\\x7f-\\uffff]*/\n            },\n            {\n                value: PHP.Constants.T_WHITESPACE,\n                re: /^\\s+/\n            },\n            {\n                value: PHP.Constants.T_CONSTANT_ENCAPSED_STRING,\n                re: /^(\"(?:[^\"\\\\]|\\\\[\\s\\S])*\"|'(?:[^'\\\\]|\\\\[\\s\\S])*')/,\n                func: function( result, token ) {\n\n                    var curlyOpen = 0,\n                    len,\n                    bracketOpen = 0;\n\n                    if (result.substring( 0,1 ) === \"'\") {\n                        return result;\n                    }\n\n                    var match = result.match( /(?:[^\\\\]|\\\\.)*[^\\\\]\\$[a-zA-Z_\\x7f-\\uffff][a-zA-Z0-9_\\x7f-\\uffff]*/g );\n                    if ( match !== null ) {\n\n                        while( result.length > 0 ) {\n                            len = result.length;\n                            match = result.match( /^[\\[\\]\\;\\:\\?\\(\\)\\!\\.\\,\\>\\<\\=\\+\\-\\/\\*\\|\\&\\@\\^\\%\\\"\\'\\{\\}]/ );\n\n                            if ( match !== null ) {\n\n                                results.push( match[ 0 ] );\n                                result = result.substring( 1 );\n\n                                if ( curlyOpen > 0 && match[ 0 ] === \"}\") {\n                                    curlyOpen--;\n                                }\n\n                                if ( match[ 0 ] === \"[\" ) {\n                                    bracketOpen++;\n                                }\n\n                                if ( match[ 0 ] === \"]\" ) {\n                                    bracketOpen--;\n                                }\n\n                            }\n\n                            match = result.match(/^\\$[a-zA-Z_\\x7f-\\uffff][a-zA-Z0-9_\\x7f-\\uffff]*/);\n\n\n\n                            if ( match !== null ) {\n\n                                results.push([\n                                    parseInt(PHP.Constants.T_VARIABLE, 10),\n                                    match[ 0 ],\n                                    line\n                                    ]);\n\n                                result = result.substring( match[ 0 ].length );\n\n                                match = result.match(/^(\\-\\>)\\s*([a-zA-Z_\\x7f-\\uffff][a-zA-Z0-9_\\x7f-\\uffff]*)\\s*(\\()/);\n\n                                if ( match !== null ) {\n\n                                    results.push([\n                                        parseInt(PHP.Constants.T_OBJECT_OPERATOR, 10),\n                                        match[ 1 ],\n                                        line\n                                        ]);\n                                    results.push([\n                                        parseInt(PHP.Constants.T_STRING, 10),\n                                        match[ 2 ],\n                                        line\n                                        ]);\n                                    if (match[3]) {\n                                        results.push(match[3]);\n                                    }\n                                    result = result.substring( match[ 0 ].length );\n                                }\n\n\n                                if ( result.match( /^\\[/g ) !== null ) {\n                                    continue;\n                                }\n                            }\n\n                            var re;\n                            if ( curlyOpen > 0) {\n                                re = /^([^\\\\\\$\"{}\\]\\(\\)\\->]|\\\\.)+/g;\n                            } else {\n                                re = /^([^\\\\\\$\"{]|\\\\.|{[^\\$]|\\$(?=[^a-zA-Z_\\x7f-\\uffff]))+/g;;\n                            }\n\n                            var type, match2;\n                            while(( match = result.match( re )) !== null ) {\n                                if (result.length === 1) {\n                                    throw new Error(match);\n                                }\n                                \n                                type = 0;\n\n                                if( curlyOpen > 0 ){\n                                    if( match2 = match[0].match(/^[\\[\\]\\;\\:\\?\\(\\)\\!\\.\\,\\>\\<\\=\\+\\-\\/\\*\\|\\&\\{\\}\\@\\^\\%\\$\\~]/) ){\n                                        results.push(match2[0]);\n                                    }else{                                    \n                                        type = PHP.Constants.T_STRING;    \n                                    }\n                                }else{\n                                    type = PHP.Constants.T_ENCAPSED_AND_WHITESPACE;\n                                }\n                                \n                                if( type ){\n                                    results.push([\n                                        parseInt(type, 10),\n                                        match[ 0 ].replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\"),\n                                        line\n                                        ]);\n                                }\n\n                                line += match[ 0 ].split('\\n').length - 1;\n\n                                result = result.substring( match[ 0 ].length );\n                            }\n\n                            if( curlyOpen > 0 && result.match(/^\\->/) !== null ) {\n                                results.push([\n                                    parseInt(PHP.Constants.T_OBJECT_OPERATOR, 10),\n                                    '->',\n                                    line\n                                    ]);\n                                result = result.substring( 2 );\n                            }\n\n                            if( result.match(/^{\\$/) !== null ) {\n                                results.push([\n                                    parseInt(PHP.Constants.T_CURLY_OPEN, 10),\n                                    \"{\",\n                                    line\n                                    ]);\n                                result = result.substring( 1 );\n                                curlyOpen++;\n                            }\n\n                            if (len === result.length) {\n                                if ((match =  result.match( /^(([^\\\\]|\\\\.)*?[^\\\\]\\$[a-zA-Z_\\x7f-\\uffff][a-zA-Z0-9_\\x7f-\\uffff]*)/g )) !== null) {\n                                    return;\n                                }\n                            }\n\n                        }\n\n                        return undefined;\n\n                    } else {\n                        result = result.replace(/\\r/g,\"\");\n                    }\n                    return result;\n                }\n            },\n            {\n                value: PHP.Constants.T_NS_SEPARATOR,\n                re: /^\\\\(?=[a-zA-Z_])/\n            },\n            {\n                value: PHP.Constants.T_STRING,\n                re: /^[a-zA-Z_\\x7f-\\uffff][a-zA-Z0-9_\\x7f-\\uffff]*/\n            },\n            {\n                value: -1,\n                re: /^[\\[\\]\\;\\:\\?\\(\\)\\!\\.\\,\\>\\<\\=\\+\\-\\/\\*\\|\\&\\{\\}\\@\\^\\%\\\"\\'\\$\\~]/\n            }];\n\n\n\n\n\n            var results = [],\n            line = 1,\n            insidePHP = false,\n            cancel = true;\n\n            if ( src === null ) {\n                return results;\n            }\n\n            if ( typeof src !== \"string\" ) {\n                src = src.toString();\n            }\n\n\n\n            while (src.length > 0 && cancel === true) {\n\n                if ( insidePHP === true ) {\n\n                    if ( heredoc !== undefined ) {\n\n                        var regexp = new RegExp('([\\\\S\\\\s]*?)(\\\\r\\\\n|\\\\n|\\\\r)(' + heredoc + ')(;|\\\\r\\\\n|\\\\n)',\"i\");\n\n\n\n                        var result = src.match( regexp );\n                        if ( result !== null ) {\n\n                            results.push([\n                                parseInt(PHP.Constants.T_ENCAPSED_AND_WHITESPACE, 10),\n                                result[ 1 ].replace(/^\\n/g,\"\").replace(/\\\\\\$/g,\"$\") + \"\\n\",\n                                line\n                                ]);\n                            line += result[ 1 ].split('\\n').length;\n                            results.push([\n                                parseInt(PHP.Constants.T_END_HEREDOC, 10),\n                                result[ 3 ],\n                                line\n                                ]);\n\n                            src = src.substring( result[1].length + result[2].length + result[3].length );\n                            heredoc = undefined;\n                        }\n\n                        if (result === null) {\n                            throw Error(\"sup\");\n                        }\n\n\n                    } else {\n                        cancel =  tokens.some(function( token ){\n                            if ( token.afterWhitespace === true ) {\n                                var last = results[ results.length - 1 ];\n                                if ( !Array.isArray( last ) || (last[ 0 ] !== PHP.Constants.T_WHITESPACE && last[ 0 ] !== PHP.Constants.T_OPEN_TAG  && last[ 0 ] !== PHP.Constants.T_COMMENT)) {\n                                    return false;\n                                }\n                            }\n                            var result = src.match( token.re );\n\n                            if ( result !== null ) {\n                                if ( token.value !== -1) {\n                                    var resultString = result[ 0 ];\n\n\n\n                                    if (token.func !== undefined ) {\n                                        resultString = token.func( resultString, token );\n                                    }\n                                    if (resultString !== undefined ) {\n\n                                        results.push([\n                                            parseInt(token.value, 10),\n                                            resultString,\n                                            line\n                                            ]);\n                                        line += resultString.split('\\n').length - 1;\n                                    }\n\n                                } else {\n                                    results.push( result[ 0 ] );\n                                }\n\n                                src = src.substring(result[ 0 ].length);\n\n                                return true;\n                            }\n                            return false;\n\n\n                        });\n                    }\n\n                } else {\n\n                    var result = openTag.exec( src );\n\n\n                    if ( result !== null ) {\n                        if ( result.index > 0 ) {\n                            var resultString = src.substring(0, result.index);\n                            results.push ([\n                                parseInt(PHP.Constants.T_INLINE_HTML, 10),\n                                resultString,\n                                line\n                                ]);\n\n                            line += resultString.split('\\n').length - 1;\n\n                            src = src.substring( result.index );\n                        }\n\n                        insidePHP = true;\n                    } else {\n\n                        results.push ([\n                            parseInt(PHP.Constants.T_INLINE_HTML, 10),\n                            src.replace(/^\\n/, \"\"),\n                            line\n                            ]);\n                        return results;\n                    }\n\n                }\n\n\n\n            }\n\n\n\n            return results;\n\n\n\n        };\n\n\nPHP.Parser = function ( preprocessedTokens, eval ) {\n\n    var yybase = this.yybase,\n    yydefault = this.yydefault,\n    yycheck = this.yycheck,\n    yyaction = this.yyaction,\n    yylen = this.yylen,\n    yygbase = this.yygbase,\n    yygcheck = this.yygcheck,\n    yyp = this.yyp,\n    yygoto = this.yygoto,\n    yylhs = this.yylhs,\n    terminals = this.terminals,\n    translate = this.translate,\n    yygdefault = this.yygdefault;\n\n\n    this.pos = -1;\n    this.line = 1;\n\n    this.tokenMap = this.createTokenMap( );\n\n    this.dropTokens = {};\n    this.dropTokens[ PHP.Constants.T_WHITESPACE ] = 1;\n    this.dropTokens[ PHP.Constants.T_OPEN_TAG ] = 1;\n    var tokens = [];\n    preprocessedTokens.forEach( function( token, index ) {\n        if ( typeof token === \"object\" && token[ 0 ] === PHP.Constants.T_OPEN_TAG_WITH_ECHO) {\n            tokens.push([\n                PHP.Constants.T_OPEN_TAG,\n                token[ 1 ],\n                token[ 2 ]\n                ]);\n            tokens.push([\n                PHP.Constants.T_ECHO,\n                token[ 1 ],\n                token[ 2 ]\n                ]);\n        } else {\n            tokens.push( token );\n        }\n    });\n    this.tokens = tokens;\n    var tokenId = this.TOKEN_NONE;\n    this.startAttributes = {\n        'startLine': 1\n    };\n\n    this.endAttributes = {};\n    var attributeStack = [ this.startAttributes ];\n    var state = 0;\n    var stateStack = [ state ];\n    this.yyastk = [];\n    this.stackPos  = 0;\n\n    var yyn;\n\n    var origTokenId;\n\n\n    for (;;) {\n\n        if ( yybase[ state ] === 0 ) {\n            yyn = yydefault[ state ];\n        } else {\n            if (tokenId === this.TOKEN_NONE ) {\n                origTokenId = this.getNextToken( );\n                tokenId = (origTokenId >= 0 && origTokenId < this.TOKEN_MAP_SIZE) ? translate[ origTokenId ] : this.TOKEN_INVALID;\n\n                attributeStack[ this.stackPos ] = this.startAttributes;\n            }\n\n            if (((yyn = yybase[ state ] + tokenId) >= 0\n                && yyn < this.YYLAST && yycheck[ yyn ] === tokenId\n                || (state < this.YY2TBLSTATE\n                    && (yyn = yybase[state + this.YYNLSTATES] + tokenId) >= 0\n                    && yyn < this.YYLAST\n                    && yycheck[ yyn ] === tokenId))\n            && (yyn = yyaction[ yyn ]) !== this.YYDEFAULT ) {\n                if (yyn > 0) {\n                    ++this.stackPos;\n\n                    stateStack[ this.stackPos ] = state = yyn;\n                    this.yyastk[ this.stackPos ] = this.tokenValue;\n                    attributeStack[ this.stackPos ] = this.startAttributes;\n                    tokenId = this.TOKEN_NONE;\n\n                    if (yyn < this.YYNLSTATES)\n                        continue;\n                    yyn -= this.YYNLSTATES;\n                } else {\n                    yyn = -yyn;\n                }\n            } else {\n                yyn = yydefault[ state ];\n            }\n        }\n\n        for (;;) {\n\n            if ( yyn === 0 ) {\n                return this.yyval;\n            } else if (yyn !== this.YYUNEXPECTED ) {\n                for (var attr in this.endAttributes) {\n                    attributeStack[ this.stackPos - yylen[ yyn ] ][ attr ] = this.endAttributes[ attr ];\n                }\n                try {\n                    this['yyn' + yyn](attributeStack[ this.stackPos - yylen[ yyn ] ]);\n                } catch (e) {\n                    throw e;\n                }\n                this.stackPos -= yylen[ yyn ];\n                yyn = yylhs[ yyn ];\n                if ((yyp = yygbase[ yyn ] + stateStack[ this.stackPos ]) >= 0\n                    && yyp < this.YYGLAST\n                    && yygcheck[ yyp ] === yyn) {\n                    state = yygoto[ yyp ];\n                } else {\n                    state = yygdefault[ yyn ];\n                }\n\n                ++this.stackPos;\n\n                stateStack[ this.stackPos ] = state;\n                this.yyastk[ this.stackPos ] = this.yyval;\n                attributeStack[ this.stackPos ] = this.startAttributes;\n            } else {\n                if (eval !== true) {\n\n                    var expected = [];\n\n                    for (var i = 0; i < this.TOKEN_MAP_SIZE; ++i) {\n                        if ((yyn = yybase[ state ] + i) >= 0 && yyn < this.YYLAST && yycheck[ yyn ] == i\n                         || state < this.YY2TBLSTATE\n                            && (yyn = yybase[ state + this.YYNLSTATES] + i)\n                            && yyn < this.YYLAST && yycheck[ yyn ] == i\n                        ) {\n                            if (yyaction[ yyn ] != this.YYUNEXPECTED) {\n                                if (expected.length == 4) {\n                                    expected = [];\n                                    break;\n                                }\n\n                                expected.push( this.terminals[ i ] );\n                            }\n                        }\n                    }\n\n                    var expectedString = '';\n                    if (expected.length) {\n                        expectedString = ', expecting ' + expected.join(' or ');\n                    }\n                    throw new PHP.ParseError('syntax error, unexpected ' + terminals[ tokenId ] + expectedString, this.startAttributes['startLine']);\n                } else {\n                    return this.startAttributes['startLine'];\n                }\n\n            }\n\n            if (state < this.YYNLSTATES)\n                break;\n            yyn = state - this.YYNLSTATES;\n        }\n    }\n};\n\nPHP.ParseError = function( msg, line ) {\n    this.message = msg;\n    this.line = line;\n};\n\nPHP.Parser.prototype.MODIFIER_PUBLIC    =  1;\nPHP.Parser.prototype.MODIFIER_PROTECTED =  2;\nPHP.Parser.prototype.MODIFIER_PRIVATE   =  4;\nPHP.Parser.prototype.MODIFIER_STATIC    =  8;\nPHP.Parser.prototype.MODIFIER_ABSTRACT  = 16;\nPHP.Parser.prototype.MODIFIER_FINAL     = 32;\n\nPHP.Parser.prototype.getNextToken = function( ) {\n\n    this.startAttributes = {};\n    this.endAttributes = {};\n\n    var token,\n    tmp;\n\n    while (this.tokens[++this.pos] !== undefined) {\n        token = this.tokens[this.pos];\n\n        if (typeof token === \"string\") {\n            this.startAttributes['startLine'] = this.line;\n            this.endAttributes['endLine'] = this.line;\n            if ('b\"' === token) {\n                this.tokenValue = 'b\"';\n                return '\"'.charCodeAt(0);\n            } else {\n                this.tokenValue = token;\n                return token.charCodeAt(0);\n            }\n        } else {\n\n\n\n            this.line += ((tmp = token[ 1 ].match(/\\n/g)) === null) ? 0 : tmp.length;\n\n            if (PHP.Constants.T_COMMENT === token[0]) {\n\n                if (!Array.isArray(this.startAttributes['comments'])) {\n                    this.startAttributes['comments'] = [];\n                }\n\n                this.startAttributes['comments'].push( {\n                    type: \"comment\",\n                    comment: token[1],\n                    line: token[2]\n                });\n\n            } else if (PHP.Constants.T_DOC_COMMENT === token[0]) {\n                this.startAttributes['comments'].push( new PHPParser_Comment_Doc(token[1], token[2]) );\n            } else if (this.dropTokens[token[0]] === undefined) {\n                this.tokenValue = token[1];\n                this.startAttributes['startLine'] = token[2];\n                this.endAttributes['endLine'] = this.line;\n\n                return this.tokenMap[token[0]];\n            }\n        }\n    }\n\n    this.startAttributes['startLine'] = this.line;\n    return 0;\n};\n\nPHP.Parser.prototype.tokenName = function( token ) {\n    var constants = [\"T_INCLUDE\",\"T_INCLUDE_ONCE\",\"T_EVAL\",\"T_REQUIRE\",\"T_REQUIRE_ONCE\",\"T_LOGICAL_OR\",\"T_LOGICAL_XOR\",\"T_LOGICAL_AND\",\"T_PRINT\",\"T_PLUS_EQUAL\",\"T_MINUS_EQUAL\",\"T_MUL_EQUAL\",\"T_DIV_EQUAL\",\"T_CONCAT_EQUAL\",\"T_MOD_EQUAL\",\"T_AND_EQUAL\",\"T_OR_EQUAL\",\"T_XOR_EQUAL\",\"T_SL_EQUAL\",\"T_SR_EQUAL\",\"T_BOOLEAN_OR\",\"T_BOOLEAN_AND\",\"T_IS_EQUAL\",\"T_IS_NOT_EQUAL\",\"T_IS_IDENTICAL\",\"T_IS_NOT_IDENTICAL\",\"T_IS_SMALLER_OR_EQUAL\",\"T_IS_GREATER_OR_EQUAL\",\"T_SL\",\"T_SR\",\"T_INSTANCEOF\",\"T_INC\",\"T_DEC\",\"T_INT_CAST\",\"T_DOUBLE_CAST\",\"T_STRING_CAST\",\"T_ARRAY_CAST\",\"T_OBJECT_CAST\",\"T_BOOL_CAST\",\"T_UNSET_CAST\",\"T_NEW\",\"T_CLONE\",\"T_EXIT\",\"T_IF\",\"T_ELSEIF\",\"T_ELSE\",\"T_ENDIF\",\"T_LNUMBER\",\"T_DNUMBER\",\"T_STRING\",\"T_STRING_VARNAME\",\"T_VARIABLE\",\"T_NUM_STRING\",\"T_INLINE_HTML\",\"T_CHARACTER\",\"T_BAD_CHARACTER\",\"T_ENCAPSED_AND_WHITESPACE\",\"T_CONSTANT_ENCAPSED_STRING\",\"T_ECHO\",\"T_DO\",\"T_WHILE\",\"T_ENDWHILE\",\"T_FOR\",\"T_ENDFOR\",\"T_FOREACH\",\"T_ENDFOREACH\",\"T_DECLARE\",\"T_ENDDECLARE\",\"T_AS\",\"T_SWITCH\",\"T_ENDSWITCH\",\"T_CASE\",\"T_DEFAULT\",\"T_BREAK\",\"T_CONTINUE\",\"T_GOTO\",\"T_FUNCTION\",\"T_CONST\",\"T_RETURN\",\"T_TRY\",\"T_CATCH\",\"T_THROW\",\"T_USE\",\"T_INSTEADOF\",\"T_GLOBAL\",\"T_STATIC\",\"T_ABSTRACT\",\"T_FINAL\",\"T_PRIVATE\",\"T_PROTECTED\",\"T_PUBLIC\",\"T_VAR\",\"T_UNSET\",\"T_ISSET\",\"T_EMPTY\",\"T_HALT_COMPILER\",\"T_CLASS\",\"T_TRAIT\",\"T_INTERFACE\",\"T_EXTENDS\",\"T_IMPLEMENTS\",\"T_OBJECT_OPERATOR\",\"T_DOUBLE_ARROW\",\"T_LIST\",\"T_ARRAY\",\"T_CALLABLE\",\"T_CLASS_C\",\"T_TRAIT_C\",\"T_METHOD_C\",\"T_FUNC_C\",\"T_LINE\",\"T_FILE\",\"T_COMMENT\",\"T_DOC_COMMENT\",\"T_OPEN_TAG\",\"T_OPEN_TAG_WITH_ECHO\",\"T_CLOSE_TAG\",\"T_WHITESPACE\",\"T_START_HEREDOC\",\"T_END_HEREDOC\",\"T_DOLLAR_OPEN_CURLY_BRACES\",\"T_CURLY_OPEN\",\"T_PAAMAYIM_NEKUDOTAYIM\",\"T_DOUBLE_COLON\",\"T_NAMESPACE\",\"T_NS_C\",\"T_DIR\",\"T_NS_SEPARATOR\"];\n    var current = \"UNKNOWN\";\n    constants.some(function( constant ) {\n        if (PHP.Constants[ constant ] === token) {\n            current = constant;\n            return true;\n        } else {\n            return false;\n        }\n    });\n\n    return current;\n};\n\nPHP.Parser.prototype.createTokenMap = function() {\n    var tokenMap = {},\n    name,\n    i;\n    var T_DOUBLE_COLON = PHP.Constants.T_PAAMAYIM_NEKUDOTAYIM;\n    for ( i = 256; i < 1000; ++i ) {\n        if ( T_DOUBLE_COLON === i ) {\n            tokenMap[ i ] = this.T_PAAMAYIM_NEKUDOTAYIM;\n        } else if( PHP.Constants.T_OPEN_TAG_WITH_ECHO === i ) {\n            tokenMap[ i ] = PHP.Constants.T_ECHO;\n        } else if( PHP.Constants.T_CLOSE_TAG === i ) {\n            tokenMap[ i ] = 59;\n        } else if ( 'UNKNOWN' !== (name = this.tokenName( i ) ) ) { \n            tokenMap[ i ] =  this[name];\n        }\n    }\n    return tokenMap;\n};\n\nvar yynStandard = function () {\n    this.yyval =  this.yyastk[ this.stackPos-(1-1) ];\n};\n\nPHP.Parser.prototype.MakeArray = function( arr ) {\n    return Array.isArray( arr ) ? arr : [ arr ];\n}\n\n\nPHP.Parser.prototype.parseString = function( str ) {\n    var bLength = 0;\n    if ('b' === str[0]) {\n        bLength = 1;\n    }\n\n    if ('\\'' === str[ bLength ]) {\n        str = str.replace(\n            ['\\\\\\\\', '\\\\\\''],\n            [  '\\\\',   '\\'']);\n    } else {\n\n        str = this.parseEscapeSequences( str, '\"');\n\n    }\n\n    return str;\n\n};\n\nPHP.Parser.prototype.parseEscapeSequences = function( str, quote ) {\n\n\n\n    if (undefined !== quote) {\n        str = str.replace(new RegExp('\\\\' + quote, \"g\"), quote);\n    }\n\n    var replacements = {\n        '\\\\': '\\\\',\n        '$':  '$',\n        'n': \"\\n\",\n        'r': \"\\r\",\n        't': \"\\t\",\n        'f': \"\\f\",\n        'v': \"\\v\",\n        'e': \"\\x1B\"\n    };\n\n    return str.replace(\n        /~\\\\\\\\([\\\\\\\\$nrtfve]|[xX][0-9a-fA-F]{1,2}|[0-7]{1,3})~/g,\n        function ( matches ){\n            var str = matches[1];\n\n            if ( replacements[ str ] !== undefined ) {\n                return replacements[ str ];\n            } else if ('x' === str[ 0 ] || 'X' === str[ 0 ]) {\n                return chr(hexdec(str));\n            } else {\n                return chr(octdec(str));\n            }\n        }\n        );\n\n    return str;\n};\n\nPHP.Parser.prototype.TOKEN_NONE    = -1;\nPHP.Parser.prototype.TOKEN_INVALID = 149;\n\nPHP.Parser.prototype.TOKEN_MAP_SIZE = 384;\n\nPHP.Parser.prototype.YYLAST       = 913;\nPHP.Parser.prototype.YY2TBLSTATE  = 328;\nPHP.Parser.prototype.YYGLAST      = 415;\nPHP.Parser.prototype.YYNLSTATES   = 544;\nPHP.Parser.prototype.YYUNEXPECTED = 32767;\nPHP.Parser.prototype.YYDEFAULT    = -32766;\nPHP.Parser.prototype.YYERRTOK = 256;\nPHP.Parser.prototype.T_INCLUDE = 257;\nPHP.Parser.prototype.T_INCLUDE_ONCE = 258;\nPHP.Parser.prototype.T_EVAL = 259;\nPHP.Parser.prototype.T_REQUIRE = 260;\nPHP.Parser.prototype.T_REQUIRE_ONCE = 261;\nPHP.Parser.prototype.T_LOGICAL_OR = 262;\nPHP.Parser.prototype.T_LOGICAL_XOR = 263;\nPHP.Parser.prototype.T_LOGICAL_AND = 264;\nPHP.Parser.prototype.T_PRINT = 265;\nPHP.Parser.prototype.T_PLUS_EQUAL = 266;\nPHP.Parser.prototype.T_MINUS_EQUAL = 267;\nPHP.Parser.prototype.T_MUL_EQUAL = 268;\nPHP.Parser.prototype.T_DIV_EQUAL = 269;\nPHP.Parser.prototype.T_CONCAT_EQUAL = 270;\nPHP.Parser.prototype.T_MOD_EQUAL = 271;\nPHP.Parser.prototype.T_AND_EQUAL = 272;\nPHP.Parser.prototype.T_OR_EQUAL = 273;\nPHP.Parser.prototype.T_XOR_EQUAL = 274;\nPHP.Parser.prototype.T_SL_EQUAL = 275;\nPHP.Parser.prototype.T_SR_EQUAL = 276;\nPHP.Parser.prototype.T_BOOLEAN_OR = 277;\nPHP.Parser.prototype.T_BOOLEAN_AND = 278;\nPHP.Parser.prototype.T_IS_EQUAL = 279;\nPHP.Parser.prototype.T_IS_NOT_EQUAL = 280;\nPHP.Parser.prototype.T_IS_IDENTICAL = 281;\nPHP.Parser.prototype.T_IS_NOT_IDENTICAL = 282;\nPHP.Parser.prototype.T_IS_SMALLER_OR_EQUAL = 283;\nPHP.Parser.prototype.T_IS_GREATER_OR_EQUAL = 284;\nPHP.Parser.prototype.T_SL = 285;\nPHP.Parser.prototype.T_SR = 286;\nPHP.Parser.prototype.T_INSTANCEOF = 287;\nPHP.Parser.prototype.T_INC = 288;\nPHP.Parser.prototype.T_DEC = 289;\nPHP.Parser.prototype.T_INT_CAST = 290;\nPHP.Parser.prototype.T_DOUBLE_CAST = 291;\nPHP.Parser.prototype.T_STRING_CAST = 292;\nPHP.Parser.prototype.T_ARRAY_CAST = 293;\nPHP.Parser.prototype.T_OBJECT_CAST = 294;\nPHP.Parser.prototype.T_BOOL_CAST = 295;\nPHP.Parser.prototype.T_UNSET_CAST = 296;\nPHP.Parser.prototype.T_NEW = 297;\nPHP.Parser.prototype.T_CLONE = 298;\nPHP.Parser.prototype.T_EXIT = 299;\nPHP.Parser.prototype.T_IF = 300;\nPHP.Parser.prototype.T_ELSEIF = 301;\nPHP.Parser.prototype.T_ELSE = 302;\nPHP.Parser.prototype.T_ENDIF = 303;\nPHP.Parser.prototype.T_LNUMBER = 304;\nPHP.Parser.prototype.T_DNUMBER = 305;\nPHP.Parser.prototype.T_STRING = 306;\nPHP.Parser.prototype.T_STRING_VARNAME = 307;\nPHP.Parser.prototype.T_VARIABLE = 308;\nPHP.Parser.prototype.T_NUM_STRING = 309;\nPHP.Parser.prototype.T_INLINE_HTML = 310;\nPHP.Parser.prototype.T_CHARACTER = 311;\nPHP.Parser.prototype.T_BAD_CHARACTER = 312;\nPHP.Parser.prototype.T_ENCAPSED_AND_WHITESPACE = 313;\nPHP.Parser.prototype.T_CONSTANT_ENCAPSED_STRING = 314;\nPHP.Parser.prototype.T_ECHO = 315;\nPHP.Parser.prototype.T_DO = 316;\nPHP.Parser.prototype.T_WHILE = 317;\nPHP.Parser.prototype.T_ENDWHILE = 318;\nPHP.Parser.prototype.T_FOR = 319;\nPHP.Parser.prototype.T_ENDFOR = 320;\nPHP.Parser.prototype.T_FOREACH = 321;\nPHP.Parser.prototype.T_ENDFOREACH = 322;\nPHP.Parser.prototype.T_DECLARE = 323;\nPHP.Parser.prototype.T_ENDDECLARE = 324;\nPHP.Parser.prototype.T_AS = 325;\nPHP.Parser.prototype.T_SWITCH = 326;\nPHP.Parser.prototype.T_ENDSWITCH = 327;\nPHP.Parser.prototype.T_CASE = 328;\nPHP.Parser.prototype.T_DEFAULT = 329;\nPHP.Parser.prototype.T_BREAK = 330;\nPHP.Parser.prototype.T_CONTINUE = 331;\nPHP.Parser.prototype.T_GOTO = 332;\nPHP.Parser.prototype.T_FUNCTION = 333;\nPHP.Parser.prototype.T_CONST = 334;\nPHP.Parser.prototype.T_RETURN = 335;\nPHP.Parser.prototype.T_TRY = 336;\nPHP.Parser.prototype.T_CATCH = 337;\nPHP.Parser.prototype.T_THROW = 338;\nPHP.Parser.prototype.T_USE = 339;\nPHP.Parser.prototype.T_INSTEADOF = 340;\nPHP.Parser.prototype.T_GLOBAL = 341;\nPHP.Parser.prototype.T_STATIC = 342;\nPHP.Parser.prototype.T_ABSTRACT = 343;\nPHP.Parser.prototype.T_FINAL = 344;\nPHP.Parser.prototype.T_PRIVATE = 345;\nPHP.Parser.prototype.T_PROTECTED = 346;\nPHP.Parser.prototype.T_PUBLIC = 347;\nPHP.Parser.prototype.T_VAR = 348;\nPHP.Parser.prototype.T_UNSET = 349;\nPHP.Parser.prototype.T_ISSET = 350;\nPHP.Parser.prototype.T_EMPTY = 351;\nPHP.Parser.prototype.T_HALT_COMPILER = 352;\nPHP.Parser.prototype.T_CLASS = 353;\nPHP.Parser.prototype.T_TRAIT = 354;\nPHP.Parser.prototype.T_INTERFACE = 355;\nPHP.Parser.prototype.T_EXTENDS = 356;\nPHP.Parser.prototype.T_IMPLEMENTS = 357;\nPHP.Parser.prototype.T_OBJECT_OPERATOR = 358;\nPHP.Parser.prototype.T_DOUBLE_ARROW = 359;\nPHP.Parser.prototype.T_LIST = 360;\nPHP.Parser.prototype.T_ARRAY = 361;\nPHP.Parser.prototype.T_CALLABLE = 362;\nPHP.Parser.prototype.T_CLASS_C = 363;\nPHP.Parser.prototype.T_TRAIT_C = 364;\nPHP.Parser.prototype.T_METHOD_C = 365;\nPHP.Parser.prototype.T_FUNC_C = 366;\nPHP.Parser.prototype.T_LINE = 367;\nPHP.Parser.prototype.T_FILE = 368;\nPHP.Parser.prototype.T_COMMENT = 369;\nPHP.Parser.prototype.T_DOC_COMMENT = 370;\nPHP.Parser.prototype.T_OPEN_TAG = 371;\nPHP.Parser.prototype.T_OPEN_TAG_WITH_ECHO = 372;\nPHP.Parser.prototype.T_CLOSE_TAG = 373;\nPHP.Parser.prototype.T_WHITESPACE = 374;\nPHP.Parser.prototype.T_START_HEREDOC = 375;\nPHP.Parser.prototype.T_END_HEREDOC = 376;\nPHP.Parser.prototype.T_DOLLAR_OPEN_CURLY_BRACES = 377;\nPHP.Parser.prototype.T_CURLY_OPEN = 378;\nPHP.Parser.prototype.T_PAAMAYIM_NEKUDOTAYIM = 379;\nPHP.Parser.prototype.T_NAMESPACE = 380;\nPHP.Parser.prototype.T_NS_C = 381;\nPHP.Parser.prototype.T_DIR = 382;\nPHP.Parser.prototype.T_NS_SEPARATOR = 383;\nPHP.Parser.prototype.terminals = [\n    \"$EOF\",\n    \"error\",\n    \"T_INCLUDE\",\n    \"T_INCLUDE_ONCE\",\n    \"T_EVAL\",\n    \"T_REQUIRE\",\n    \"T_REQUIRE_ONCE\",\n    \"','\",\n    \"T_LOGICAL_OR\",\n    \"T_LOGICAL_XOR\",\n    \"T_LOGICAL_AND\",\n    \"T_PRINT\",\n    \"'='\",\n    \"T_PLUS_EQUAL\",\n    \"T_MINUS_EQUAL\",\n    \"T_MUL_EQUAL\",\n    \"T_DIV_EQUAL\",\n    \"T_CONCAT_EQUAL\",\n    \"T_MOD_EQUAL\",\n    \"T_AND_EQUAL\",\n    \"T_OR_EQUAL\",\n    \"T_XOR_EQUAL\",\n    \"T_SL_EQUAL\",\n    \"T_SR_EQUAL\",\n    \"'?'\",\n    \"':'\",\n    \"T_BOOLEAN_OR\",\n    \"T_BOOLEAN_AND\",\n    \"'|'\",\n    \"'^'\",\n    \"'&'\",\n    \"T_IS_EQUAL\",\n    \"T_IS_NOT_EQUAL\",\n    \"T_IS_IDENTICAL\",\n    \"T_IS_NOT_IDENTICAL\",\n    \"'<'\",\n    \"T_IS_SMALLER_OR_EQUAL\",\n    \"'>'\",\n    \"T_IS_GREATER_OR_EQUAL\",\n    \"T_SL\",\n    \"T_SR\",\n    \"'+'\",\n    \"'-'\",\n    \"'.'\",\n    \"'*'\",\n    \"'/'\",\n    \"'%'\",\n    \"'!'\",\n    \"T_INSTANCEOF\",\n    \"'~'\",\n    \"T_INC\",\n    \"T_DEC\",\n    \"T_INT_CAST\",\n    \"T_DOUBLE_CAST\",\n    \"T_STRING_CAST\",\n    \"T_ARRAY_CAST\",\n    \"T_OBJECT_CAST\",\n    \"T_BOOL_CAST\",\n    \"T_UNSET_CAST\",\n    \"'@'\",\n    \"'['\",\n    \"T_NEW\",\n    \"T_CLONE\",\n    \"T_EXIT\",\n    \"T_IF\",\n    \"T_ELSEIF\",\n    \"T_ELSE\",\n    \"T_ENDIF\",\n    \"T_LNUMBER\",\n    \"T_DNUMBER\",\n    \"T_STRING\",\n    \"T_STRING_VARNAME\",\n    \"T_VARIABLE\",\n    \"T_NUM_STRING\",\n    \"T_INLINE_HTML\",\n    \"T_ENCAPSED_AND_WHITESPACE\",\n    \"T_CONSTANT_ENCAPSED_STRING\",\n    \"T_ECHO\",\n    \"T_DO\",\n    \"T_WHILE\",\n    \"T_ENDWHILE\",\n    \"T_FOR\",\n    \"T_ENDFOR\",\n    \"T_FOREACH\",\n    \"T_ENDFOREACH\",\n    \"T_DECLARE\",\n    \"T_ENDDECLARE\",\n    \"T_AS\",\n    \"T_SWITCH\",\n    \"T_ENDSWITCH\",\n    \"T_CASE\",\n    \"T_DEFAULT\",\n    \"T_BREAK\",\n    \"T_CONTINUE\",\n    \"T_GOTO\",\n    \"T_FUNCTION\",\n    \"T_CONST\",\n    \"T_RETURN\",\n    \"T_TRY\",\n    \"T_CATCH\",\n    \"T_THROW\",\n    \"T_USE\",\n    \"T_INSTEADOF\",\n    \"T_GLOBAL\",\n    \"T_STATIC\",\n    \"T_ABSTRACT\",\n    \"T_FINAL\",\n    \"T_PRIVATE\",\n    \"T_PROTECTED\",\n    \"T_PUBLIC\",\n    \"T_VAR\",\n    \"T_UNSET\",\n    \"T_ISSET\",\n    \"T_EMPTY\",\n    \"T_HALT_COMPILER\",\n    \"T_CLASS\",\n    \"T_TRAIT\",\n    \"T_INTERFACE\",\n    \"T_EXTENDS\",\n    \"T_IMPLEMENTS\",\n    \"T_OBJECT_OPERATOR\",\n    \"T_DOUBLE_ARROW\",\n    \"T_LIST\",\n    \"T_ARRAY\",\n    \"T_CALLABLE\",\n    \"T_CLASS_C\",\n    \"T_TRAIT_C\",\n    \"T_METHOD_C\",\n    \"T_FUNC_C\",\n    \"T_LINE\",\n    \"T_FILE\",\n    \"T_START_HEREDOC\",\n    \"T_END_HEREDOC\",\n    \"T_DOLLAR_OPEN_CURLY_BRACES\",\n    \"T_CURLY_OPEN\",\n    \"T_PAAMAYIM_NEKUDOTAYIM\",\n    \"T_NAMESPACE\",\n    \"T_NS_C\",\n    \"T_DIR\",\n    \"T_NS_SEPARATOR\",\n    \"';'\",\n    \"'{'\",\n    \"'}'\",\n    \"'('\",\n    \"')'\",\n    \"'$'\",\n    \"']'\",\n    \"'`'\",\n    \"'\\\"'\"\n    , \"???\"\n];\nPHP.Parser.prototype.translate = [\n        0,  149,  149,  149,  149,  149,  149,  149,  149,  149,\n      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,\n      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,\n      149,  149,  149,   47,  148,  149,  145,   46,   30,  149,\n      143,  144,   44,   41,    7,   42,   43,   45,  149,  149,\n      149,  149,  149,  149,  149,  149,  149,  149,   25,  140,\n       35,   12,   37,   24,   59,  149,  149,  149,  149,  149,\n      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,\n      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,\n      149,   60,  149,  146,   29,  149,  147,  149,  149,  149,\n      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,\n      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,\n      149,  149,  149,  141,   28,  142,   49,  149,  149,  149,\n      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,\n      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,\n      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,\n      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,\n      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,\n      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,\n      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,\n      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,\n      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,\n      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,\n      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,\n      149,  149,  149,  149,  149,  149,  149,  149,  149,  149,\n      149,  149,  149,  149,  149,  149,    1,    2,    3,    4,\n        5,    6,    8,    9,   10,   11,   13,   14,   15,   16,\n       17,   18,   19,   20,   21,   22,   23,   26,   27,   31,\n       32,   33,   34,   36,   38,   39,   40,   48,   50,   51,\n       52,   53,   54,   55,   56,   57,   58,   61,   62,   63,\n       64,   65,   66,   67,   68,   69,   70,   71,   72,   73,\n       74,  149,  149,   75,   76,   77,   78,   79,   80,   81,\n       82,   83,   84,   85,   86,   87,   88,   89,   90,   91,\n       92,   93,   94,   95,   96,   97,   98,   99,  100,  101,\n      102,  103,  104,  105,  106,  107,  108,  109,  110,  111,\n      112,  113,  114,  115,  116,  117,  118,  119,  120,  121,\n      122,  123,  124,  125,  126,  127,  128,  129,  130,  149,\n      149,  149,  149,  149,  149,  131,  132,  133,  134,  135,\n      136,  137,  138,  139\n];\n\nPHP.Parser.prototype.yyaction = [\n       61,   62,  363,   63,   64,-32766,-32766,-32766,  509,   65,\n      708,  709,  710,  707,  706,  705,-32766,-32766,-32766,-32766,\n    -32766,-32766,  132,-32766,-32766,-32766,-32766,-32766,-32767,-32767,\n    -32767,-32767,-32766,  335,-32766,-32766,-32766,-32766,-32766,   66,\n       67,  351,  663,  664,   40,   68,  548,   69,  232,  233,\n       70,   71,   72,   73,   74,   75,   76,   77,   30,  246,\n       78,  336,  364, -112,    0,  469,  833,  834,  365,  641,\n      890,  436,  590,   41,  835,   53,   27,  366,  294,  367,\n      687,  368,  921,  369,  923,  922,  370,-32766,-32766,-32766,\n       42,   43,  371,  339,  126,   44,  372,  337,   79,  297,\n      349,  292,  293,-32766,  918,-32766,-32766,  373,  374,  375,\n      376,  377,  391,  199,  361,  338,  573,  613,  378,  379,\n      380,  381,  845,  839,  840,  841,  842,  836,  837,  253,\n    -32766,   87,   88,   89,  391,  843,  838,  338,  597,  519,\n      128,   80,  129,  273,  332,  257,  261,   47,  673,   90,\n       91,   92,   93,   94,   95,   96,   97,   98,   99,  100,\n      101,  102,  103,  104,  105,  106,  107,  108,  109,  110,\n      799,  247,  884,  108,  109,  110,  226,  247,   21,-32766,\n      310,-32766,-32766,-32766,  642,  548,-32766,-32766,-32766,-32766,\n       56,  353,-32766,-32766,-32766,   55,-32766,-32766,-32766,-32766,\n    -32766,   58,-32766,-32766,-32766,-32766,-32766,-32766,-32766,-32766,\n    -32766,  557,-32766,-32766,  518,-32766,  548,  890,-32766,  390,\n    -32766,  228,  252,-32766,-32766,-32766,-32766,-32766,  275,-32766,\n      234,-32766,  587,  588,-32766,-32766,-32766,-32766,-32766,-32766,\n    -32766,   46,  236,-32766,-32766,  281,-32766,  682,  348,-32766,\n      390,-32766,  346,  333,  521,-32766,-32766,-32766,  271,  911,\n      262,  237,  446,  911,-32766,  894,   59,  700,  358,  135,\n      548,  123,  538,   35,-32766,  333,  122,-32766,-32766,-32766,\n      271,-32766,  124,-32766,  692,-32766,-32766,-32766,-32766,  700,\n      273,   22,-32766,-32766,-32766,-32766,  239,-32766,-32766,  612,\n    -32766,  548,  134,-32766,  390,-32766,  462,  354,-32766,-32766,\n    -32766,-32766,-32766,  227,-32766,  238,-32766,  845,  542,-32766,\n      856,  611,  200,-32766,-32766,-32766,  259,  280,-32766,-32766,\n      201,-32766,  855,  129,-32766,  390,  130,  202,  333,  206,\n    -32766,-32766,-32766,  271,-32766,-32766,-32766,  125,  601,-32766,\n      136,  299,  700,  489,   28,  548,  105,  106,  107,-32766,\n      498,  499,-32766,-32766,-32766,  207,-32766,  133,-32766,  525,\n    -32766,-32766,-32766,-32766,  663,  664,  527,-32766,-32766,-32766,\n    -32766,  528,-32766,-32766,  610,-32766,  548,  427,-32766,  390,\n    -32766,  532,  539,-32766,-32766,-32766,-32766,-32766,  240,-32766,\n      247,-32766,  697,  543,-32766,  554,  523,  608,-32766,-32766,\n    -32766,  686,  535,-32766,-32766,   54,-32766,   57,   60,-32766,\n      390,  246, -155,  278,  345,-32766,-32766,-32766,  506,  347,\n     -152,  471,  402,  403,-32766,  405,  404,  272,  493,  416,\n      548,  318,  417,  505,-32766,  517,  548,-32766,-32766,-32766,\n      549,-32766,  562,-32766,  916,-32766,-32766,-32766,-32766,  564,\n      826,  848,-32766,-32766,-32766,-32766,  694,-32766,-32766,  485,\n    -32766,  548,  487,-32766,  390,-32766,  504,  802,-32766,-32766,\n    -32766,-32766,-32766,  279,-32766,  911,-32766,  502,  492,-32766,\n      413,  483,  269,-32766,-32766,-32766,  243,  337,-32766,-32766,\n      418,-32766,  454,  229,-32766,  390,  274,  373,  374,  344,\n    -32766,-32766,-32766,  360,  614,-32766,  573,  613,  378,  379,\n     -274,  548,  615, -332,  844,-32766,  258,   51,-32766,-32766,\n    -32766,  270,-32766,  346,-32766,   52,-32766,  260,    0,-32766,\n     -333,-32766,-32766,-32766,-32766,-32766,-32766,  205,-32766,-32766,\n       49,-32766,  548,  424,-32766,  390,-32766, -266,  264,-32766,\n    -32766,-32766,-32766,-32766,  409,-32766,  343,-32766,  265,  312,\n    -32766,  470,  513, -275,-32766,-32766,-32766,  920,  337,-32766,\n    -32766,  530,-32766,  531,  600,-32766,  390,  592,  373,  374,\n      578,  581,-32766,-32766,  644,  629,-32766,  573,  613,  378,\n      379,  635,  548,  636,  576,  627,-32766,  625,  693,-32766,\n    -32766,-32766,  691,-32766,  591,-32766,  582,-32766,  203,  204,\n    -32766,  584,  583,-32766,-32766,-32766,-32766,  586,  599,-32766,\n    -32766,  589,-32766,  690,  558,-32766,  390,  197,  683,  919,\n       86,  520,  522,-32766,  524,  833,  834,  529,  533,-32766,\n      534,  537,  541,  835,   48,  111,  112,  113,  114,  115,\n      116,  117,  118,  119,  120,  121,  127,   31,  633,  337,\n      330,  634,  585,-32766,   32,  291,  337,  330,  478,  373,\n      374,  917,  291,  891,  889,  875,  373,  374,  553,  613,\n      378,  379,  737,  739,  887,  553,  613,  378,  379,  824,\n      451,  675,  839,  840,  841,  842,  836,  837,  320,  895,\n      277,  885,   23,   33,  843,  838,  556,  277,  337,  330,\n    -32766,   34,-32766,  555,  291,   36,   37,   38,  373,  374,\n       39,   45,   50,   81,   82,   83,   84,  553,  613,  378,\n      379,-32767,-32767,-32767,-32767,  103,  104,  105,  106,  107,\n      337,   85,  131,  137,  337,  138,  198,  224,  225,  277,\n      373,  374, -332,  230,  373,  374,   24,  337,  231,  573,\n      613,  378,  379,  573,  613,  378,  379,  373,  374,  235,\n      248,  249,  250,  337,  251,    0,  573,  613,  378,  379,\n      276,  329,  331,  373,  374,-32766,  337,  574,  490,  792,\n      337,  609,  573,  613,  378,  379,  373,  374,   25,  300,\n      373,  374,  319,  337,  795,  573,  613,  378,  379,  573,\n      613,  378,  379,  373,  374,  516,  355,  359,  445,  482,\n      796,  507,  573,  613,  378,  379,  508,  548,  337,  890,\n      775,  791,  337,  604,  803,  808,  806,  698,  373,  374,\n      888,  807,  373,  374,-32766,-32766,-32766,  573,  613,  378,\n      379,  573,  613,  378,  379,  873,  832,  804,  872,  851,\n    -32766,  809,-32766,-32766,-32766,-32766,  805,   20,   26,   29,\n      298,  480,  515,  770,  778,  827,  457,    0,  900,  455,\n      774,    0,    0,    0,  874,  870,  886,  823,  915,  852,\n      869,  488,    0,  391,  793,    0,  338,    0,    0,    0,\n      340,    0,  273\n];\n\nPHP.Parser.prototype.yycheck = [\n        2,    3,    4,    5,    6,    8,    9,   10,   70,   11,\n      104,  105,  106,  107,  108,  109,    8,    9,   10,    8,\n        9,   24,   60,   26,   27,   28,   29,   30,   31,   32,\n       33,   34,   24,    7,   26,   27,   28,   29,   30,   41,\n       42,    7,  123,  124,    7,   47,   70,   49,   50,   51,\n       52,   53,   54,   55,   56,   57,   58,   59,   60,   61,\n       62,   63,   64,  144,    0,   75,   68,   69,   70,   25,\n       72,   70,   74,    7,   76,   77,   78,   79,    7,   81,\n      142,   83,   70,   85,   72,   73,   88,    8,    9,   10,\n       92,   93,   94,   95,    7,   97,   98,   95,  100,    7,\n        7,  103,  104,   24,  142,   26,   27,  105,  106,  111,\n      112,  113,  136,    7,    7,  139,  114,  115,  116,  117,\n      122,  123,  132,  125,  126,  127,  128,  129,  130,  131,\n        8,    8,    9,   10,  136,  137,  138,  139,  140,  141,\n       25,  143,  141,  145,  142,  147,  148,   24,   72,   26,\n       27,   28,   29,   30,   31,   32,   33,   34,   35,   36,\n       37,   38,   39,   40,   41,   42,   43,   44,   45,   46,\n      144,   48,   72,   44,   45,   46,   30,   48,  144,   64,\n       72,    8,    9,   10,  140,   70,    8,    9,   10,   74,\n       60,   25,   77,   78,   79,   60,   81,   24,   83,   26,\n       85,   60,   24,   88,   26,   27,   28,   92,   93,   94,\n       64,  140,   97,   98,   70,  100,   70,   72,  103,  104,\n       74,  145,    7,   77,   78,   79,  111,   81,    7,   83,\n       30,   85,  140,  140,   88,    8,    9,   10,   92,   93,\n       94,  133,  134,   97,   98,  145,  100,  140,    7,  103,\n      104,   24,  139,   96,  141,  140,  141,  111,  101,   75,\n       75,   30,   70,   75,   64,   70,   60,  110,  121,   12,\n       70,  141,   25,  143,   74,   96,  141,   77,   78,   79,\n      101,   81,  141,   83,  140,   85,  140,  141,   88,  110,\n      145,  144,   92,   93,   94,   64,    7,   97,   98,  142,\n      100,   70,  141,  103,  104,   74,  145,  141,   77,   78,\n       79,  111,   81,    7,   83,   30,   85,  132,   25,   88,\n      132,  142,   12,   92,   93,   94,  120,   60,   97,   98,\n       12,  100,  148,  141,  103,  104,  141,   12,   96,   12,\n      140,  141,  111,  101,    8,    9,   10,  141,   25,   64,\n       90,   91,  110,   65,   66,   70,   41,   42,   43,   74,\n       65,   66,   77,   78,   79,   12,   81,   25,   83,   25,\n       85,  140,  141,   88,  123,  124,   25,   92,   93,   94,\n       64,   25,   97,   98,  142,  100,   70,  120,  103,  104,\n       74,   25,   25,   77,   78,   79,  111,   81,   30,   83,\n       48,   85,  140,  141,   88,  140,  141,   30,   92,   93,\n       94,  140,  141,   97,   98,   60,  100,   60,   60,  103,\n      104,   61,   72,   75,   70,  140,  141,  111,   67,   70,\n       87,   99,   70,   70,   64,   70,   72,  102,   89,   70,\n       70,   71,   70,   70,   74,   70,   70,   77,   78,   79,\n       70,   81,   70,   83,   70,   85,  140,  141,   88,   70,\n      144,   70,   92,   93,   94,   64,   70,   97,   98,   72,\n      100,   70,   72,  103,  104,   74,   72,   72,   77,   78,\n       79,  111,   81,   75,   83,   75,   85,   89,   86,   88,\n       79,  101,  118,   92,   93,   94,   87,   95,   97,   98,\n       87,  100,   87,   87,  103,  104,  118,  105,  106,   95,\n      140,  141,  111,   95,  115,   64,  114,  115,  116,  117,\n      135,   70,  115,  120,  132,   74,  120,  140,   77,   78,\n       79,  119,   81,  139,   83,  140,   85,  120,   -1,   88,\n      120,  140,  141,   92,   93,   94,   64,  121,   97,   98,\n      121,  100,   70,  122,  103,  104,   74,  135,  135,   77,\n       78,   79,  111,   81,  139,   83,  139,   85,  135,  135,\n       88,  135,  135,  135,   92,   93,   94,  142,   95,   97,\n       98,  140,  100,  140,  140,  103,  104,  140,  105,  106,\n      140,  140,  141,  111,  140,  140,   64,  114,  115,  116,\n      117,  140,   70,  140,  140,  140,   74,  140,  140,   77,\n       78,   79,  140,   81,  140,   83,  140,   85,   41,   42,\n       88,  140,  140,  141,   92,   93,   94,  140,  140,   97,\n       98,  140,  100,  140,  140,  103,  104,   60,  140,  142,\n      141,  141,  141,  111,  141,   68,   69,  141,  141,   72,\n      141,  141,  141,   76,   12,   13,   14,   15,   16,   17,\n       18,   19,   20,   21,   22,   23,  141,  143,  142,   95,\n       96,  142,  140,  141,  143,  101,   95,   96,  142,  105,\n      106,  142,  101,  142,  142,  142,  105,  106,  114,  115,\n      116,  117,   50,   51,  142,  114,  115,  116,  117,  142,\n      123,  142,  125,  126,  127,  128,  129,  130,  131,  142,\n      136,  142,  144,  143,  137,  138,  142,  136,   95,   96,\n      143,  143,  145,  142,  101,  143,  143,  143,  105,  106,\n      143,  143,  143,  143,  143,  143,  143,  114,  115,  116,\n      117,   35,   36,   37,   38,   39,   40,   41,   42,   43,\n       95,  143,  143,  143,   95,  143,  143,  143,  143,  136,\n      105,  106,  120,  143,  105,  106,  144,   95,  143,  114,\n      115,  116,  117,  114,  115,  116,  117,  105,  106,  143,\n      143,  143,  143,   95,  143,   -1,  114,  115,  116,  117,\n      143,  143,  143,  105,  106,  143,   95,  142,   80,  146,\n       95,  142,  114,  115,  116,  117,  105,  106,  144,  144,\n      105,  106,  144,   95,  142,  114,  115,  116,  117,  114,\n      115,  116,  117,  105,  106,   82,  144,  144,  144,  144,\n      142,   84,  114,  115,  116,  117,  144,   70,   95,   72,\n      144,  144,   95,  142,  144,  146,  144,  142,  105,  106,\n      146,  144,  105,  106,    8,    9,   10,  114,  115,  116,\n      117,  114,  115,  116,  117,  144,  144,  144,  144,  144,\n       24,  104,   26,   27,   28,   29,  144,  144,  144,  144,\n      144,  144,  144,  144,  144,  144,  144,   -1,  144,  144,\n      144,   -1,   -1,   -1,  146,  146,  146,  146,  146,  146,\n      146,  146,   -1,  136,  147,   -1,  139,   -1,   -1,   -1,\n      143,   -1,  145\n];\n\nPHP.Parser.prototype.yybase = [\n        0,  574,  581,  623,  655,    2,  718,  402,  747,  659,\n      672,  688,  743,  701,  705,  483,  483,  483,  483,  483,\n      351,  356,  366,  366,  367,  366,  344,   -2,   -2,   -2,\n      200,  200,  231,  231,  231,  231,  231,  231,  231,  231,\n      200,  231,  451,  482,  532,  316,  370,  115,  146,  285,\n      401,  401,  401,  401,  401,  401,  401,  401,  401,  401,\n      401,  401,  401,  401,  401,  401,  401,  401,  401,  401,\n      401,  401,  401,  401,  401,  401,  401,  401,  401,  401,\n      401,  401,  401,  401,  401,  401,  401,  401,  401,  401,\n      401,  401,  401,  401,  401,  401,  401,  401,  401,  401,\n      401,  401,  401,  401,  401,  401,  401,  401,  401,  401,\n      401,  401,  401,  401,  401,  401,  401,  401,  401,  401,\n      401,  401,  401,  401,  401,  401,  401,  401,  401,  401,\n      401,  401,  401,  401,  401,  401,  401,  401,  401,   44,\n      474,  429,  476,  481,  487,  488,  739,  740,  741,  734,\n      733,  416,  736,  539,  541,  342,  542,  543,  552,  557,\n      559,  536,  567,  737,  755,  569,  735,  738,  123,  123,\n      123,  123,  123,  123,  123,  123,  123,  122,   11,  336,\n      336,  336,  336,  336,  336,  336,  336,  336,  336,  336,\n      336,  336,  336,  336,  227,  227,  173,  577,  577,  577,\n      577,  577,  577,  577,  577,  577,  577,  577,   79,  178,\n      846,    8,   -3,   -3,   -3,   -3,  642,  706,  706,  706,\n      706,  157,  179,  242,  431,  431,  360,  431,  525,  368,\n      767,  767,  767,  767,  767,  767,  767,  767,  767,  767,\n      767,  767,  350,  375,  315,  315,  652,  652,  -81,  -81,\n      -81,  -81,  251,  185,  188,  184,  -62,  348,  195,  195,\n      195,  408,  392,  410,    1,  192,  129,  129,  129,  -24,\n      -24,  -24,  -24,  499,  -24,  -24,  -24,  113,  108,  108,\n       12,  161,  349,  526,  271,  398,  529,  438,  130,  206,\n      265,  427,   76,  414,  427,  288,  295,   76,  166,   44,\n      262,  422,  141,  491,  372,  494,  413,   71,   92,   93,\n      267,  135,  100,   34,  415,  745,  746,  742,  -38,  420,\n      -10,  135,  147,  744,  498,  107,   26,  493,  144,  377,\n      363,  369,  332,  363,  400,  377,  588,  377,  376,  377,\n      360,   37,  582,  376,  377,  374,  376,  388,  363,  364,\n      412,  369,  377,  441,  443,  390,  106,  332,  377,  390,\n      377,  400,   64,  590,  591,  323,  592,  589,  593,  649,\n      608,  362,  500,  399,  407,  620,  625,  636,  365,  354,\n      614,  524,  425,  359,  355,  423,  570,  578,  357,  406,\n      414,  394,  352,  403,  531,  433,  403,  653,  434,  385,\n      417,  411,  444,  310,  318,  501,  425,  668,  757,  380,\n      637,  684,  403,  609,  387,   87,  325,  638,  382,  403,\n      639,  403,  696,  503,  615,  403,  697,  384,  435,  425,\n      352,  352,  352,  700,   66,  699,  583,  702,  707,  704,\n      748,  721,  749,  584,  750,  358,  583,  722,  751,  682,\n      215,  613,  422,  436,  389,  447,  221,  257,  752,  403,\n      403,  506,  499,  403,  395,  685,  397,  426,  753,  392,\n      391,  647,  683,  403,  418,  754,  221,  723,  587,  724,\n      450,  568,  507,  648,  509,  327,  725,  353,  497,  610,\n      454,  622,  455,  461,  404,  510,  373,  732,  612,  247,\n      361,  664,  463,  405,  692,  641,  464,  465,  511,  343,\n      437,  335,  409,  396,  665,  293,  467,  468,  472,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,   -2,   -2,   -2,   -2,   -2,\n       -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,\n       -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,\n       -2,    0,    0,    0,   -2,   -2,   -2,   -2,   -2,   -2,\n       -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,\n       -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,\n       -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,\n       -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,\n       -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,\n       -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,\n       -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,\n       -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,\n       -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,\n       -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,   -2,\n       -2,   -2,   -2,  123,  123,  123,  123,  123,  123,  123,\n      123,  123,  123,  123,  123,  123,  123,  123,  123,  123,\n      123,  123,  123,  123,  123,  123,  123,  123,  123,  123,\n      123,  123,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,  123,  123,  123,  123,  123,  123,  123,  123,  123,\n      123,  123,  123,  123,  123,  123,  123,  123,  123,  123,\n      123,  767,  767,  767,  767,  767,  767,  767,  767,  767,\n      767,  767,  123,  123,  123,  123,  123,  123,  123,  123,\n        0,  129,  129,  129,  129,  -94,  -94,  -94,  767,  767,\n      767,  767,  767,  767,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,  -94,  -94,  129,  129,\n      767,  767,  -24,  -24,  -24,  -24,  -24,  108,  108,  108,\n      -24,  108,  145,  145,  145,  108,  108,  108,  100,  100,\n        0,    0,    0,    0,    0,    0,    0,  145,    0,    0,\n        0,  376,    0,    0,    0,  145,  260,  260,  221,  260,\n      260,  135,    0,    0,  425,  376,    0,  364,  376,    0,\n        0,    0,    0,    0,    0,  531,    0,   87,  637,  241,\n      425,    0,    0,    0,    0,    0,    0,    0,  425,  289,\n      289,  306,    0,  358,    0,    0,    0,  306,  241,    0,\n        0,  221\n];\n\nPHP.Parser.prototype.yydefault = [\n        3,32767,32767,    1,32767,32767,32767,32767,32767,32767,\n    32767,32767,32767,32767,32767,  104,   96,  110,   95,  106,\n    32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n      358,  358,  122,  122,  122,  122,  122,  122,  122,  122,\n      316,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n      173,  173,  173,32767,  348,  348,  348,  348,  348,  348,\n      348,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n    32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n    32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n    32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n    32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n    32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n    32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n    32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n    32767,  363,32767,32767,32767,32767,32767,32767,32767,32767,\n    32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n    32767,32767,32767,32767,32767,32767,32767,32767,  232,  233,\n      235,  236,  172,  125,  349,  362,  171,  199,  201,  250,\n      200,  177,  182,  183,  184,  185,  186,  187,  188,  189,\n      190,  191,  192,  176,  229,  228,  197,  313,  313,  316,\n    32767,32767,32767,32767,32767,32767,32767,32767,  198,  202,\n      204,  203,  219,  220,  217,  218,  175,  221,  222,  223,\n      224,  157,  157,  157,  357,  357,32767,  357,32767,32767,\n    32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n    32767,32767,  158,32767,  211,  212,  276,  276,  117,  117,\n      117,  117,  117,32767,32767,32767,32767,  284,32767,32767,\n    32767,32767,32767,  286,32767,32767,  206,  207,  205,32767,\n    32767,32767,32767,32767,32767,32767,32767,32767,  285,32767,\n    32767,32767,32767,32767,32767,32767,32767,  334,  321,  272,\n    32767,32767,32767,  265,32767,  107,  109,32767,32767,32767,\n    32767,  302,  339,32767,32767,32767,   17,32767,32767,32767,\n      370,  334,32767,32767,   19,32767,32767,32767,32767,  227,\n    32767,  338,  332,32767,32767,32767,32767,32767,32767,   63,\n    32767,32767,32767,32767,32767,   63,  281,   63,32767,   63,\n    32767,  315,  287,32767,   63,   74,32767,   72,32767,32767,\n       76,32767,   63,   93,   93,  254,  315,   54,   63,  254,\n       63,32767,32767,32767,32767,    4,32767,32767,32767,32767,\n    32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n    32767,32767,  267,32767,  323,32767,  337,  336,  324,32767,\n      265,32767,  215,  194,  266,32767,  196,32767,32767,  270,\n      273,32767,32767,32767,  134,32767,  268,  180,32767,32767,\n    32767,32767,  365,32767,32767,  174,32767,32767,32767,  130,\n    32767,   61,  332,32767,32767,  355,32767,32767,  332,  269,\n      208,  209,  210,32767,  121,32767,  310,32767,32767,32767,\n    32767,32767,32767,  327,32767,  333,32767,32767,32767,32767,\n      111,32767,  302,32767,32767,32767,   75,32767,32767,  178,\n      126,32767,32767,  364,32767,32767,32767,  320,32767,32767,\n    32767,32767,32767,   62,32767,32767,   77,32767,32767,32767,\n    32767,  332,32767,32767,32767,  115,32767,  169,32767,32767,\n    32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,\n    32767,  332,32767,32767,32767,32767,32767,32767,32767,    4,\n    32767,  151,32767,32767,32767,32767,32767,32767,32767,   25,\n       25,    3,  137,    3,  137,   25,  101,   25,   25,  137,\n       93,   93,   25,   25,   25,  144,   25,   25,   25,   25,\n       25,   25,   25,   25\n];\n\nPHP.Parser.prototype.yygoto = [\n      141,  141,  173,  173,  173,  173,  173,  173,  173,  173,\n      141,  173,  142,  143,  144,  148,  153,  155,  181,  175,\n      172,  172,  172,  172,  174,  174,  174,  174,  174,  174,\n      174,  168,  169,  170,  171,  179,  757,  758,  392,  760,\n      781,  782,  783,  784,  785,  786,  787,  789,  725,  145,\n      146,  147,  149,  150,  151,  152,  154,  177,  178,  180,\n      196,  208,  209,  210,  211,  212,  213,  214,  215,  217,\n      218,  219,  220,  244,  245,  266,  267,  268,  430,  431,\n      432,  182,  183,  184,  185,  186,  187,  188,  189,  190,\n      191,  192,  156,  157,  158,  159,  176,  160,  194,  161,\n      162,  163,  164,  195,  165,  193,  139,  166,  167,  452,\n      452,  452,  452,  452,  452,  452,  452,  452,  452,  452,\n      453,  453,  453,  453,  453,  453,  453,  453,  453,  453,\n      453,  551,  551,  551,  464,  491,  394,  394,  394,  394,\n      394,  394,  394,  394,  394,  394,  394,  394,  394,  394,\n      394,  394,  394,  394,  407,  552,  552,  552,  810,  810,\n      662,  662,  662,  662,  662,  594,  283,  595,  510,  399,\n      399,  567,  679,  632,  849,  850,  863,  660,  714,  426,\n      222,  622,  622,  622,  622,  223,  617,  623,  494,  395,\n      395,  395,  395,  395,  395,  395,  395,  395,  395,  395,\n      395,  395,  395,  395,  395,  395,  395,  465,  472,  514,\n      904,  398,  398,  425,  425,  459,  425,  419,  322,  421,\n      421,  393,  396,  412,  422,  428,  460,  463,  473,  481,\n      501,    5,  476,  284,  327,    1,   15,    2,    6,    7,\n      550,  550,  550,    8,    9,   10,  668,   16,   11,   17,\n       12,   18,   13,   19,   14,  704,  328,  881,  881,  643,\n      628,  626,  626,  624,  626,  526,  401,  652,  647,  847,\n      847,  847,  847,  847,  847,  847,  847,  847,  847,  847,\n      437,  438,  441,  447,  477,  479,  497,  290,  910,  910,\n      400,  400,  486,  880,  880,  263,  913,  910,  303,  255,\n      723,  306,  822,  821,  306,  896,  896,  896,  861,  304,\n      323,  410,  913,  913,  897,  316,  420,  769,  658,  559,\n      879,  671,  536,  324,  466,  565,  311,  311,  311,  801,\n      241,  676,  496,  439,  440,  442,  444,  448,  475,  631,\n      858,  311,  285,  286,  603,  495,  712,    0,  406,  321,\n        0,    0,    0,  314,    0,    0,  429,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,  411\n];\n\nPHP.Parser.prototype.yygcheck = [\n       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,\n       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,\n       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,\n       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,\n       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,\n       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,\n       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,\n       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,\n       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,\n       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,\n       15,   15,   15,   15,   15,   15,   15,   15,   15,   35,\n       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,\n       86,   86,   86,   86,   86,   86,   86,   86,   86,   86,\n       86,    6,    6,    6,   21,   21,   35,   35,   35,   35,\n       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,\n       35,   35,   35,   35,   71,    7,    7,    7,   35,   35,\n       35,   35,   35,   35,   35,   29,   44,   29,   35,   86,\n       86,   12,   12,   12,   12,   12,   12,   12,   12,   75,\n       40,   35,   35,   35,   35,   40,   35,   35,   35,   82,\n       82,   82,   82,   82,   82,   82,   82,   82,   82,   82,\n       82,   82,   82,   82,   82,   82,   82,   36,   36,   36,\n      104,   82,   82,   28,   28,   28,   28,   28,   28,   28,\n       28,   28,   28,   28,   28,   28,   28,   28,   28,   28,\n       28,   13,   42,   42,   42,    2,   13,    2,   13,   13,\n        5,    5,    5,   13,   13,   13,   54,   13,   13,   13,\n       13,   13,   13,   13,   13,   67,   67,   83,   83,    5,\n        5,    5,    5,    5,    5,    5,    5,    5,    5,   93,\n       93,   93,   93,   93,   93,   93,   93,   93,   93,   93,\n       52,   52,   52,   52,   52,   52,   52,    4,  105,  105,\n       89,   89,   94,   84,   84,   92,  105,  105,   26,   92,\n       71,    4,   91,   91,    4,   84,   84,   84,   97,   30,\n       70,   30,  105,  105,  102,   27,   30,   72,   50,   10,\n       84,   55,   46,    9,   30,   11,   90,   90,   90,   80,\n       30,   56,   30,   85,   85,   85,   85,   85,   85,   43,\n       96,   90,   44,   44,   34,   77,   69,   -1,    4,   90,\n       -1,   -1,   -1,    4,   -1,   -1,    4,   -1,   -1,   -1,\n       -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,\n       -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,\n       -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,\n       -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,\n       -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,\n       -1,   -1,   -1,   -1,   71\n];\n\nPHP.Parser.prototype.yygbase = [\n        0,    0, -286,    0,   10,  239,  130,  154,    0,  -10,\n       25,  -23,  -29, -289,    0,  -30,    0,    0,    0,    0,\n        0,   83,    0,    0,    0,    0,  245,   84,  -11,  142,\n      -28,    0,    0,    0,  -13,  -88,  -42,    0,    0,    0,\n     -344,    0,  -38,  -12, -188,    0,   23,    0,    0,    0,\n       66,    0,  247,    0,  205,   24,  -18,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,   13,    0,  -15,\n       85,   74,   70,    0,    0,  148,    0,  -14,    0,    0,\n       -6,    0,  -35,   11,   47,  278,  -77,    0,    0,   44,\n       68,   43,   38,   72,   94,    0,  -16,  109,    0,    0,\n        0,    0,   87,    0,  170,   34,    0\n];\n\nPHP.Parser.prototype.yygdefault = [\n    -32768,  362,    3,  546,  382,  570,  571,  572,  307,  305,\n      560,  566,  467,    4,  568,  140,  295,  575,  296,  500,\n      577,  414,  579,  580,  308,  309,  415,  315,  216,  593,\n      503,  313,  596,  357,  602,  301,  449,  383,  350,  461,\n      221,  423,  456,  630,  282,  638,  540,  646,  649,  450,\n      657,  352,  433,  434,  667,  672,  677,  680,  334,  325,\n      474,  684,  685,  256,  689,  511,  512,  703,  242,  711,\n      317,  724,  342,  788,  790,  397,  408,  484,  797,  326,\n      800,  384,  385,  386,  387,  435,  818,  815,  289,  866,\n      287,  443,  254,  853,  468,  356,  903,  862,  288,  388,\n      389,  302,  898,  341,  905,  912,  458\n];\n\nPHP.Parser.prototype.yylhs = [\n        0,    1,    2,    2,    4,    4,    3,    3,    3,    3,\n        3,    3,    3,    3,    3,    8,    8,   10,   10,   10,\n       10,    9,    9,   11,   13,   13,   14,   14,   14,   14,\n        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,\n        5,    5,    5,    5,    5,    5,    5,    5,    5,    5,\n        5,    5,    5,    5,    5,    5,    5,    5,   33,   33,\n       34,   27,   27,   30,   30,    6,    7,    7,    7,   37,\n       37,   37,   38,   38,   41,   41,   39,   39,   42,   42,\n       22,   22,   29,   29,   32,   32,   31,   31,   43,   23,\n       23,   23,   23,   44,   44,   45,   45,   46,   46,   20,\n       20,   16,   16,   47,   18,   18,   48,   17,   17,   19,\n       19,   36,   36,   49,   49,   50,   50,   51,   51,   51,\n       51,   52,   52,   53,   53,   54,   54,   24,   24,   55,\n       55,   55,   25,   25,   56,   56,   40,   40,   57,   57,\n       57,   57,   62,   62,   63,   63,   64,   64,   64,   64,\n       65,   66,   66,   61,   61,   58,   58,   60,   60,   68,\n       68,   67,   67,   67,   67,   67,   67,   59,   59,   69,\n       69,   26,   26,   21,   21,   15,   15,   15,   15,   15,\n       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,\n       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,\n       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,\n       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,\n       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,\n       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,\n       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,\n       15,   15,   15,   71,   77,   77,   79,   79,   80,   81,\n       81,   81,   81,   81,   81,   86,   86,   35,   35,   35,\n       72,   72,   87,   87,   82,   82,   88,   88,   88,   88,\n       88,   73,   73,   73,   76,   76,   76,   78,   78,   93,\n       93,   93,   93,   93,   93,   93,   93,   93,   93,   93,\n       93,   93,   93,   12,   12,   12,   12,   12,   12,   74,\n       74,   74,   74,   94,   94,   96,   96,   95,   95,   97,\n       97,   28,   28,   28,   28,   99,   99,   98,   98,   98,\n       98,   98,  100,  100,   84,   84,   89,   89,   83,   83,\n      101,  101,  101,  101,   90,   90,   90,   90,   85,   85,\n       91,   91,   91,   70,   70,  102,  102,  102,   75,   75,\n      103,  103,  104,  104,  104,  104,   92,   92,   92,   92,\n      105,  105,  105,  105,  105,  105,  105,  106,  106,  106\n];\n\nPHP.Parser.prototype.yylen = [\n        1,    1,    2,    0,    1,    3,    1,    1,    1,    1,\n        3,    5,    4,    3,    3,    3,    1,    1,    3,    2,\n        4,    3,    1,    3,    2,    0,    1,    1,    1,    1,\n        3,    7,   10,    5,    7,    9,    5,    2,    3,    2,\n        3,    2,    3,    3,    3,    3,    1,    2,    5,    7,\n        8,   10,    5,    1,    5,    3,    3,    2,    1,    2,\n        8,    1,    3,    0,    1,    9,    7,    6,    5,    1,\n        2,    2,    0,    2,    0,    2,    0,    2,    1,    3,\n        1,    4,    1,    4,    1,    4,    1,    3,    3,    3,\n        4,    4,    5,    0,    2,    4,    3,    1,    1,    1,\n        4,    0,    2,    5,    0,    2,    6,    0,    2,    0,\n        3,    1,    0,    1,    3,    3,    5,    0,    1,    1,\n        1,    1,    0,    1,    3,    1,    2,    3,    1,    1,\n        2,    4,    3,    1,    1,    3,    2,    0,    3,    3,\n        8,    3,    1,    3,    0,    2,    4,    5,    4,    4,\n        3,    1,    1,    1,    3,    1,    1,    0,    1,    1,\n        2,    1,    1,    1,    1,    1,    1,    1,    3,    1,\n        3,    3,    1,    0,    1,    1,    6,    3,    4,    4,\n        1,    2,    3,    3,    3,    3,    3,    3,    3,    3,\n        3,    3,    3,    2,    2,    2,    2,    3,    3,    3,\n        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,\n        3,    3,    3,    2,    2,    2,    2,    3,    3,    3,\n        3,    3,    3,    3,    3,    3,    3,    3,    5,    4,\n        4,    4,    2,    2,    4,    2,    2,    2,    2,    2,\n        2,    2,    2,    2,    2,    2,    1,    4,    3,    3,\n        2,    9,   10,    3,    0,    4,    1,    3,    2,    4,\n        6,    8,    4,    4,    4,    1,    1,    1,    2,    3,\n        1,    1,    1,    1,    1,    1,    0,    3,    3,    4,\n        4,    0,    2,    3,    0,    1,    1,    0,    3,    1,\n        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,\n        3,    2,    1,    1,    3,    2,    2,    4,    3,    1,\n        3,    3,    3,    0,    2,    0,    1,    3,    1,    3,\n        1,    1,    1,    1,    1,    6,    4,    3,    6,    4,\n        4,    4,    1,    3,    1,    2,    1,    1,    4,    1,\n        3,    6,    4,    4,    4,    4,    1,    4,    0,    1,\n        1,    3,    1,    3,    1,    1,    4,    0,    0,    2,\n        3,    1,    3,    1,    4,    2,    2,    2,    1,    2,\n        1,    4,    3,    3,    3,    6,    3,    1,    1,    1\n];\n\n\n\n\n\n\n\nPHP.Parser.prototype.yyn0 = function () {\n    this.yyval = this.yyastk[ this.stackPos ];\n};\n\nPHP.Parser.prototype.yyn1 = function ( attributes ) {\n     this.yyval = this.Stmt_Namespace_postprocess(this.yyastk[ this.stackPos-(1-1) ]); \n};\n\nPHP.Parser.prototype.yyn2 = function ( attributes ) {\n     if (Array.isArray(this.yyastk[ this.stackPos-(2-2) ])) { this.yyval = this.yyastk[ this.stackPos-(2-1) ].concat( this.yyastk[ this.stackPos-(2-2) ]); } else { this.yyastk[ this.stackPos-(2-1) ].push( this.yyastk[ this.stackPos-(2-2) ] ); this.yyval = this.yyastk[ this.stackPos-(2-1) ]; }; \n};\n\nPHP.Parser.prototype.yyn3 = function ( attributes ) {\n     this.yyval = []; \n};\n\nPHP.Parser.prototype.yyn4 = function ( attributes ) {\n     this.yyval = [this.yyastk[ this.stackPos-(1-1) ]]; \n};\n\nPHP.Parser.prototype.yyn5 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(3-1) ].push( this.yyastk[ this.stackPos-(3-3) ] ); this.yyval = this.yyastk[ this.stackPos-(3-1) ]; \n};\n\nPHP.Parser.prototype.yyn6 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn7 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn8 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn9 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_HaltCompiler(attributes); \n};\n\nPHP.Parser.prototype.yyn10 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Namespace(this.Node_Name(this.yyastk[ this.stackPos-(3-2) ], attributes), null, attributes); \n};\n\nPHP.Parser.prototype.yyn11 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Namespace(this.Node_Name(this.yyastk[ this.stackPos-(5-2) ], attributes), this.yyastk[ this.stackPos-(5-4) ], attributes); \n};\n\nPHP.Parser.prototype.yyn12 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Namespace(null, this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn13 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Use(this.yyastk[ this.stackPos-(3-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn14 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Const(this.yyastk[ this.stackPos-(3-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn15 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(3-1) ].push( this.yyastk[ this.stackPos-(3-3) ] ); this.yyval = this.yyastk[ this.stackPos-(3-1) ]; \n};\n\nPHP.Parser.prototype.yyn16 = function ( attributes ) {\n     this.yyval = [this.yyastk[ this.stackPos-(1-1) ]]; \n};\n\nPHP.Parser.prototype.yyn17 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_UseUse(this.Node_Name(this.yyastk[ this.stackPos-(1-1) ], attributes), null, attributes); \n};\n\nPHP.Parser.prototype.yyn18 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_UseUse(this.Node_Name(this.yyastk[ this.stackPos-(3-1) ], attributes), this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn19 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_UseUse(this.Node_Name(this.yyastk[ this.stackPos-(2-2) ], attributes), null, attributes); \n};\n\nPHP.Parser.prototype.yyn20 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_UseUse(this.Node_Name(this.yyastk[ this.stackPos-(4-2) ], attributes), this.yyastk[ this.stackPos-(4-4) ], attributes); \n};\n\nPHP.Parser.prototype.yyn21 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(3-1) ].push( this.yyastk[ this.stackPos-(3-3) ] ); this.yyval = this.yyastk[ this.stackPos-(3-1) ]; \n};\n\nPHP.Parser.prototype.yyn22 = function ( attributes ) {\n     this.yyval = [this.yyastk[ this.stackPos-(1-1) ]]; \n};\n\nPHP.Parser.prototype.yyn23 = function ( attributes ) {\n     this.yyval = this.Node_Const(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn24 = function ( attributes ) {\n     if (Array.isArray(this.yyastk[ this.stackPos-(2-2) ])) { this.yyval = this.yyastk[ this.stackPos-(2-1) ].concat( this.yyastk[ this.stackPos-(2-2) ]); } else { this.yyastk[ this.stackPos-(2-1) ].push( this.yyastk[ this.stackPos-(2-2) ] ); this.yyval = this.yyastk[ this.stackPos-(2-1) ]; }; \n};\n\nPHP.Parser.prototype.yyn25 = function ( attributes ) {\n     this.yyval = []; \n};\n\nPHP.Parser.prototype.yyn26 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn27 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn28 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn29 = function ( attributes ) {\n     throw new Error('__halt_compiler() can only be used from the outermost scope'); \n};\n\nPHP.Parser.prototype.yyn30 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(3-2) ]; \n};\n\nPHP.Parser.prototype.yyn31 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_If(this.yyastk[ this.stackPos-(7-3) ], {'stmts':  Array.isArray(this.yyastk[ this.stackPos-(7-5) ]) ? this.yyastk[ this.stackPos-(7-5) ] : [this.yyastk[ this.stackPos-(7-5) ]], 'elseifs':  this.yyastk[ this.stackPos-(7-6) ], 'Else':  this.yyastk[ this.stackPos-(7-7) ]}, attributes); \n};\n\nPHP.Parser.prototype.yyn32 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_If(this.yyastk[ this.stackPos-(10-3) ], {'stmts':  this.yyastk[ this.stackPos-(10-6) ], 'elseifs':  this.yyastk[ this.stackPos-(10-7) ], 'else':  this.yyastk[ this.stackPos-(10-8) ]}, attributes); \n};\n\nPHP.Parser.prototype.yyn33 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_While(this.yyastk[ this.stackPos-(5-3) ], this.yyastk[ this.stackPos-(5-5) ], attributes); \n};\n\nPHP.Parser.prototype.yyn34 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Do(this.yyastk[ this.stackPos-(7-5) ], Array.isArray(this.yyastk[ this.stackPos-(7-2) ]) ? this.yyastk[ this.stackPos-(7-2) ] : [this.yyastk[ this.stackPos-(7-2) ]], attributes); \n};\n\nPHP.Parser.prototype.yyn35 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_For({'init':  this.yyastk[ this.stackPos-(9-3) ], 'cond':  this.yyastk[ this.stackPos-(9-5) ], 'loop':  this.yyastk[ this.stackPos-(9-7) ], 'stmts':  this.yyastk[ this.stackPos-(9-9) ]}, attributes); \n};\n\nPHP.Parser.prototype.yyn36 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Switch(this.yyastk[ this.stackPos-(5-3) ], this.yyastk[ this.stackPos-(5-5) ], attributes); \n};\n\nPHP.Parser.prototype.yyn37 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Break(null, attributes); \n};\n\nPHP.Parser.prototype.yyn38 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Break(this.yyastk[ this.stackPos-(3-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn39 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Continue(null, attributes); \n};\n\nPHP.Parser.prototype.yyn40 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Continue(this.yyastk[ this.stackPos-(3-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn41 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Return(null, attributes); \n};\n\nPHP.Parser.prototype.yyn42 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Return(this.yyastk[ this.stackPos-(3-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn43 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Global(this.yyastk[ this.stackPos-(3-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn44 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Static(this.yyastk[ this.stackPos-(3-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn45 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Echo(this.yyastk[ this.stackPos-(3-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn46 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_InlineHTML(this.yyastk[ this.stackPos-(1-1) ], attributes); \n};\n\nPHP.Parser.prototype.yyn47 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(2-1) ]; \n};\n\nPHP.Parser.prototype.yyn48 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Unset(this.yyastk[ this.stackPos-(5-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn49 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Foreach(this.yyastk[ this.stackPos-(7-3) ], this.yyastk[ this.stackPos-(7-5) ], {'keyVar':  null, 'byRef':  false, 'stmts':  this.yyastk[ this.stackPos-(7-7) ]}, attributes); \n};\n\nPHP.Parser.prototype.yyn50 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Foreach(this.yyastk[ this.stackPos-(8-3) ], this.yyastk[ this.stackPos-(8-6) ], {'keyVar':  null, 'byRef':  true, 'stmts':  this.yyastk[ this.stackPos-(8-8) ]}, attributes); \n};\n\nPHP.Parser.prototype.yyn51 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Foreach(this.yyastk[ this.stackPos-(10-3) ], this.yyastk[ this.stackPos-(10-8) ], {'keyVar':  this.yyastk[ this.stackPos-(10-5) ], 'byRef':  this.yyastk[ this.stackPos-(10-7) ], 'stmts':  this.yyastk[ this.stackPos-(10-10) ]}, attributes); \n};\n\nPHP.Parser.prototype.yyn52 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Declare(this.yyastk[ this.stackPos-(5-3) ], this.yyastk[ this.stackPos-(5-5) ], attributes); \n};\n\nPHP.Parser.prototype.yyn53 = function ( attributes ) {\n     this.yyval = []; \n};\n\nPHP.Parser.prototype.yyn54 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_TryCatch(this.yyastk[ this.stackPos-(5-3) ], this.yyastk[ this.stackPos-(5-5) ], attributes); \n};\n\nPHP.Parser.prototype.yyn55 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Throw(this.yyastk[ this.stackPos-(3-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn56 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Goto(this.yyastk[ this.stackPos-(3-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn57 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Label(this.yyastk[ this.stackPos-(2-1) ], attributes); \n};\n\nPHP.Parser.prototype.yyn58 = function ( attributes ) {\n     this.yyval = [this.yyastk[ this.stackPos-(1-1) ]]; \n};\n\nPHP.Parser.prototype.yyn59 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(2-1) ].push( this.yyastk[ this.stackPos-(2-2) ] ); this.yyval = this.yyastk[ this.stackPos-(2-1) ]; \n};\n\nPHP.Parser.prototype.yyn60 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Catch(this.yyastk[ this.stackPos-(8-3) ], this.yyastk[ this.stackPos-(8-4) ].substring( 1 ), this.yyastk[ this.stackPos-(8-7) ], attributes); \n};\n\nPHP.Parser.prototype.yyn61 = function ( attributes ) {\n     this.yyval = [this.yyastk[ this.stackPos-(1-1) ]]; \n};\n\nPHP.Parser.prototype.yyn62 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(3-1) ].push( this.yyastk[ this.stackPos-(3-3) ] ); this.yyval = this.yyastk[ this.stackPos-(3-1) ]; \n};\n\nPHP.Parser.prototype.yyn63 = function ( attributes ) {\n     this.yyval = false; \n};\n\nPHP.Parser.prototype.yyn64 = function ( attributes ) {\n     this.yyval = true; \n};\n\nPHP.Parser.prototype.yyn65 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Function(this.yyastk[ this.stackPos-(9-3) ], {'byRef':  this.yyastk[ this.stackPos-(9-2) ], 'params':  this.yyastk[ this.stackPos-(9-5) ], 'stmts':  this.yyastk[ this.stackPos-(9-8) ]}, attributes); \n};\n\nPHP.Parser.prototype.yyn66 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Class(this.yyastk[ this.stackPos-(7-2) ], {'type':  this.yyastk[ this.stackPos-(7-1) ], 'Extends':  this.yyastk[ this.stackPos-(7-3) ], 'Implements':  this.yyastk[ this.stackPos-(7-4) ], 'stmts':  this.yyastk[ this.stackPos-(7-6) ]}, attributes); \n};\n\nPHP.Parser.prototype.yyn67 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Interface(this.yyastk[ this.stackPos-(6-2) ], {'Extends':  this.yyastk[ this.stackPos-(6-3) ], 'stmts':  this.yyastk[ this.stackPos-(6-5) ]}, attributes); \n};\n\nPHP.Parser.prototype.yyn68 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Trait(this.yyastk[ this.stackPos-(5-2) ], this.yyastk[ this.stackPos-(5-4) ], attributes); \n};\n\nPHP.Parser.prototype.yyn69 = function ( attributes ) {\n     this.yyval = 0; \n};\n\nPHP.Parser.prototype.yyn70 = function ( attributes ) {\n     this.yyval = this.MODIFIER_ABSTRACT; \n};\n\nPHP.Parser.prototype.yyn71 = function ( attributes ) {\n     this.yyval = this.MODIFIER_FINAL; \n};\n\nPHP.Parser.prototype.yyn72 = function ( attributes ) {\n     this.yyval = null; \n};\n\nPHP.Parser.prototype.yyn73 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(2-2) ]; \n};\n\nPHP.Parser.prototype.yyn74 = function ( attributes ) {\n     this.yyval = []; \n};\n\nPHP.Parser.prototype.yyn75 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(2-2) ]; \n};\n\nPHP.Parser.prototype.yyn76 = function ( attributes ) {\n     this.yyval = []; \n};\n\nPHP.Parser.prototype.yyn77 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(2-2) ]; \n};\n\nPHP.Parser.prototype.yyn78 = function ( attributes ) {\n     this.yyval = [this.yyastk[ this.stackPos-(1-1) ]]; \n};\n\nPHP.Parser.prototype.yyn79 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(3-1) ].push( this.yyastk[ this.stackPos-(3-3) ] ); this.yyval = this.yyastk[ this.stackPos-(3-1) ]; \n};\n\nPHP.Parser.prototype.yyn80 = function ( attributes ) {\n     this.yyval = Array.isArray(this.yyastk[ this.stackPos-(1-1) ]) ? this.yyastk[ this.stackPos-(1-1) ] : [this.yyastk[ this.stackPos-(1-1) ]]; \n};\n\nPHP.Parser.prototype.yyn81 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(4-2) ]; \n};\n\nPHP.Parser.prototype.yyn82 = function ( attributes ) {\n     this.yyval = Array.isArray(this.yyastk[ this.stackPos-(1-1) ]) ? this.yyastk[ this.stackPos-(1-1) ] : [this.yyastk[ this.stackPos-(1-1) ]]; \n};\n\nPHP.Parser.prototype.yyn83 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(4-2) ]; \n};\n\nPHP.Parser.prototype.yyn84 = function ( attributes ) {\n     this.yyval = Array.isArray(this.yyastk[ this.stackPos-(1-1) ]) ? this.yyastk[ this.stackPos-(1-1) ] : [this.yyastk[ this.stackPos-(1-1) ]]; \n};\n\nPHP.Parser.prototype.yyn85 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(4-2) ]; \n};\n\nPHP.Parser.prototype.yyn86 = function ( attributes ) {\n     this.yyval = [this.yyastk[ this.stackPos-(1-1) ]]; \n};\n\nPHP.Parser.prototype.yyn87 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(3-1) ].push( this.yyastk[ this.stackPos-(3-3) ] ); this.yyval = this.yyastk[ this.stackPos-(3-1) ]; \n};\n\nPHP.Parser.prototype.yyn88 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_DeclareDeclare(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn89 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(3-2) ]; \n};\n\nPHP.Parser.prototype.yyn90 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(4-3) ]; \n};\n\nPHP.Parser.prototype.yyn91 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(4-2) ]; \n};\n\nPHP.Parser.prototype.yyn92 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(5-3) ]; \n};\n\nPHP.Parser.prototype.yyn93 = function ( attributes ) {\n     this.yyval = []; \n};\n\nPHP.Parser.prototype.yyn94 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(2-1) ].push( this.yyastk[ this.stackPos-(2-2) ] ); this.yyval = this.yyastk[ this.stackPos-(2-1) ]; \n};\n\nPHP.Parser.prototype.yyn95 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Case(this.yyastk[ this.stackPos-(4-2) ], this.yyastk[ this.stackPos-(4-4) ], attributes); \n};\n\nPHP.Parser.prototype.yyn96 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Case(null, this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn97 = function () {\n    this.yyval = this.yyastk[ this.stackPos ];\n};\n\nPHP.Parser.prototype.yyn98 = function () {\n    this.yyval = this.yyastk[ this.stackPos ];\n};\n\nPHP.Parser.prototype.yyn99 = function ( attributes ) {\n     this.yyval = Array.isArray(this.yyastk[ this.stackPos-(1-1) ]) ? this.yyastk[ this.stackPos-(1-1) ] : [this.yyastk[ this.stackPos-(1-1) ]]; \n};\n\nPHP.Parser.prototype.yyn100 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(4-2) ]; \n};\n\nPHP.Parser.prototype.yyn101 = function ( attributes ) {\n     this.yyval = []; \n};\n\nPHP.Parser.prototype.yyn102 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(2-1) ].push( this.yyastk[ this.stackPos-(2-2) ] ); this.yyval = this.yyastk[ this.stackPos-(2-1) ]; \n};\n\nPHP.Parser.prototype.yyn103 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_ElseIf(this.yyastk[ this.stackPos-(5-3) ], Array.isArray(this.yyastk[ this.stackPos-(5-5) ]) ? this.yyastk[ this.stackPos-(5-5) ] : [this.yyastk[ this.stackPos-(5-5) ]], attributes); \n};\n\nPHP.Parser.prototype.yyn104 = function ( attributes ) {\n     this.yyval = []; \n};\n\nPHP.Parser.prototype.yyn105 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(2-1) ].push( this.yyastk[ this.stackPos-(2-2) ] ); this.yyval = this.yyastk[ this.stackPos-(2-1) ]; \n};\n\nPHP.Parser.prototype.yyn106 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_ElseIf(this.yyastk[ this.stackPos-(6-3) ], this.yyastk[ this.stackPos-(6-6) ], attributes); \n};\n\nPHP.Parser.prototype.yyn107 = function ( attributes ) {\n     this.yyval = null; \n};\n\nPHP.Parser.prototype.yyn108 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Else(Array.isArray(this.yyastk[ this.stackPos-(2-2) ]) ? this.yyastk[ this.stackPos-(2-2) ] : [this.yyastk[ this.stackPos-(2-2) ]], attributes); \n};\n\nPHP.Parser.prototype.yyn109 = function ( attributes ) {\n     this.yyval = null; \n};\n\nPHP.Parser.prototype.yyn110 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Else(this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn111 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn112 = function ( attributes ) {\n     this.yyval = []; \n};\n\nPHP.Parser.prototype.yyn113 = function ( attributes ) {\n     this.yyval = [this.yyastk[ this.stackPos-(1-1) ]]; \n};\n\nPHP.Parser.prototype.yyn114 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(3-1) ].push( this.yyastk[ this.stackPos-(3-3) ] ); this.yyval = this.yyastk[ this.stackPos-(3-1) ]; \n};\n\nPHP.Parser.prototype.yyn115 = function ( attributes ) {\n     this.yyval = this.Node_Param(this.yyastk[ this.stackPos-(3-3) ].substring( 1 ), null, this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn116 = function ( attributes ) {\n     this.yyval = this.Node_Param(this.yyastk[ this.stackPos-(5-3) ].substring( 1 ), this.yyastk[ this.stackPos-(5-5) ], this.yyastk[ this.stackPos-(5-1) ], this.yyastk[ this.stackPos-(5-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn117 = function ( attributes ) {\n     this.yyval = null; \n};\n\nPHP.Parser.prototype.yyn118 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn119 = function ( attributes ) {\n     this.yyval = 'array'; \n};\n\nPHP.Parser.prototype.yyn120 = function ( attributes ) {\n     this.yyval = 'callable'; \n};\n\nPHP.Parser.prototype.yyn121 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn122 = function ( attributes ) {\n     this.yyval = []; \n};\n\nPHP.Parser.prototype.yyn123 = function ( attributes ) {\n     this.yyval = [this.yyastk[ this.stackPos-(1-1) ]]; \n};\n\nPHP.Parser.prototype.yyn124 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(3-1) ].push( this.yyastk[ this.stackPos-(3-3) ] ); this.yyval = this.yyastk[ this.stackPos-(3-1) ]; \n};\n\nPHP.Parser.prototype.yyn125 = function ( attributes ) {\n     this.yyval = this.Node_Arg(this.yyastk[ this.stackPos-(1-1) ], false, attributes); \n};\n\nPHP.Parser.prototype.yyn126 = function ( attributes ) {\n     this.yyval = this.Node_Arg(this.yyastk[ this.stackPos-(2-2) ], true, attributes); \n};\n\nPHP.Parser.prototype.yyn127 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(3-1) ].push( this.yyastk[ this.stackPos-(3-3) ] ); this.yyval = this.yyastk[ this.stackPos-(3-1) ]; \n};\n\nPHP.Parser.prototype.yyn128 = function ( attributes ) {\n     this.yyval = [this.yyastk[ this.stackPos-(1-1) ]]; \n};\n\nPHP.Parser.prototype.yyn129 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Variable(this.yyastk[ this.stackPos-(1-1) ].substring( 1 ), attributes); \n};\n\nPHP.Parser.prototype.yyn130 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Variable(this.yyastk[ this.stackPos-(2-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn131 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Variable(this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn132 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(3-1) ].push( this.yyastk[ this.stackPos-(3-3) ] ); this.yyval = this.yyastk[ this.stackPos-(3-1) ]; \n};\n\nPHP.Parser.prototype.yyn133 = function ( attributes ) {\n     this.yyval = [this.yyastk[ this.stackPos-(1-1) ]]; \n};\n\nPHP.Parser.prototype.yyn134 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_StaticVar(this.yyastk[ this.stackPos-(1-1) ].substring( 1 ), null, attributes); \n};\n\nPHP.Parser.prototype.yyn135 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_StaticVar(this.yyastk[ this.stackPos-(3-1) ].substring( 1 ), this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn136 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(2-1) ].push( this.yyastk[ this.stackPos-(2-2) ] ); this.yyval = this.yyastk[ this.stackPos-(2-1) ]; \n};\n\nPHP.Parser.prototype.yyn137 = function ( attributes ) {\n     this.yyval = []; \n};\n\nPHP.Parser.prototype.yyn138 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_Property(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn139 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_ClassConst(this.yyastk[ this.stackPos-(3-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn140 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_ClassMethod(this.yyastk[ this.stackPos-(8-4) ], {'type':  this.yyastk[ this.stackPos-(8-1) ], 'byRef':  this.yyastk[ this.stackPos-(8-3) ], 'params':  this.yyastk[ this.stackPos-(8-6) ], 'stmts':  this.yyastk[ this.stackPos-(8-8) ]}, attributes); \n};\n\nPHP.Parser.prototype.yyn141 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_TraitUse(this.yyastk[ this.stackPos-(3-2) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn142 = function ( attributes ) {\n     this.yyval = []; \n};\n\nPHP.Parser.prototype.yyn143 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(3-2) ]; \n};\n\nPHP.Parser.prototype.yyn144 = function ( attributes ) {\n     this.yyval = []; \n};\n\nPHP.Parser.prototype.yyn145 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(2-1) ].push( this.yyastk[ this.stackPos-(2-2) ] ); this.yyval = this.yyastk[ this.stackPos-(2-1) ]; \n};\n\nPHP.Parser.prototype.yyn146 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_TraitUseAdaptation_Precedence(this.yyastk[ this.stackPos-(4-1) ][0], this.yyastk[ this.stackPos-(4-1) ][1], this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn147 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_TraitUseAdaptation_Alias(this.yyastk[ this.stackPos-(5-1) ][0], this.yyastk[ this.stackPos-(5-1) ][1], this.yyastk[ this.stackPos-(5-3) ], this.yyastk[ this.stackPos-(5-4) ], attributes); \n};\n\nPHP.Parser.prototype.yyn148 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_TraitUseAdaptation_Alias(this.yyastk[ this.stackPos-(4-1) ][0], this.yyastk[ this.stackPos-(4-1) ][1], this.yyastk[ this.stackPos-(4-3) ], null, attributes); \n};\n\nPHP.Parser.prototype.yyn149 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_TraitUseAdaptation_Alias(this.yyastk[ this.stackPos-(4-1) ][0], this.yyastk[ this.stackPos-(4-1) ][1], null, this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn150 = function ( attributes ) {\n     this.yyval = array(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ]); \n};\n\nPHP.Parser.prototype.yyn151 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn152 = function ( attributes ) {\n     this.yyval = array(null, this.yyastk[ this.stackPos-(1-1) ]); \n};\n\nPHP.Parser.prototype.yyn153 = function ( attributes ) {\n     this.yyval = null; \n};\n\nPHP.Parser.prototype.yyn154 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(3-2) ]; \n};\n\nPHP.Parser.prototype.yyn155 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn156 = function ( attributes ) {\n     this.yyval = this.MODIFIER_PUBLIC; \n};\n\nPHP.Parser.prototype.yyn157 = function ( attributes ) {\n     this.yyval = this.MODIFIER_PUBLIC; \n};\n\nPHP.Parser.prototype.yyn158 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn159 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn160 = function ( attributes ) {\n     this.Stmt_Class_verifyModifier(this.yyastk[ this.stackPos-(2-1) ], this.yyastk[ this.stackPos-(2-2) ]); this.yyval = this.yyastk[ this.stackPos-(2-1) ] | this.yyastk[ this.stackPos-(2-2) ]; \n};\n\nPHP.Parser.prototype.yyn161 = function ( attributes ) {\n     this.yyval = this.MODIFIER_PUBLIC; \n};\n\nPHP.Parser.prototype.yyn162 = function ( attributes ) {\n     this.yyval = this.MODIFIER_PROTECTED; \n};\n\nPHP.Parser.prototype.yyn163 = function ( attributes ) {\n     this.yyval = this.MODIFIER_PRIVATE; \n};\n\nPHP.Parser.prototype.yyn164 = function ( attributes ) {\n     this.yyval = this.MODIFIER_STATIC; \n};\n\nPHP.Parser.prototype.yyn165 = function ( attributes ) {\n     this.yyval = this.MODIFIER_ABSTRACT; \n};\n\nPHP.Parser.prototype.yyn166 = function ( attributes ) {\n     this.yyval = this.MODIFIER_FINAL; \n};\n\nPHP.Parser.prototype.yyn167 = function ( attributes ) {\n     this.yyval = [this.yyastk[ this.stackPos-(1-1) ]]; \n};\n\nPHP.Parser.prototype.yyn168 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(3-1) ].push( this.yyastk[ this.stackPos-(3-3) ] ); this.yyval = this.yyastk[ this.stackPos-(3-1) ]; \n};\n\nPHP.Parser.prototype.yyn169 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_PropertyProperty(this.yyastk[ this.stackPos-(1-1) ].substring( 1 ), null, attributes); \n};\n\nPHP.Parser.prototype.yyn170 = function ( attributes ) {\n     this.yyval = this.Node_Stmt_PropertyProperty(this.yyastk[ this.stackPos-(3-1) ].substring( 1 ), this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn171 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(3-1) ].push( this.yyastk[ this.stackPos-(3-3) ] ); this.yyval = this.yyastk[ this.stackPos-(3-1) ]; \n};\n\nPHP.Parser.prototype.yyn172 = function ( attributes ) {\n     this.yyval = [this.yyastk[ this.stackPos-(1-1) ]]; \n};\n\nPHP.Parser.prototype.yyn173 = function ( attributes ) {\n     this.yyval = []; \n};\n\nPHP.Parser.prototype.yyn174 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn175 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn176 = function ( attributes ) {\n     this.yyval = this.Node_Expr_AssignList(this.yyastk[ this.stackPos-(6-3) ], this.yyastk[ this.stackPos-(6-6) ], attributes); \n};\n\nPHP.Parser.prototype.yyn177 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Assign(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn178 = function ( attributes ) {\n     this.yyval = this.Node_Expr_AssignRef(this.yyastk[ this.stackPos-(4-1) ], this.yyastk[ this.stackPos-(4-4) ], attributes); \n};\n\nPHP.Parser.prototype.yyn179 = function ( attributes ) {\n     this.yyval = this.Node_Expr_AssignRef(this.yyastk[ this.stackPos-(4-1) ], this.yyastk[ this.stackPos-(4-4) ], attributes); \n};\n\nPHP.Parser.prototype.yyn180 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn181 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Clone(this.yyastk[ this.stackPos-(2-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn182 = function ( attributes ) {\n     this.yyval = this.Node_Expr_AssignPlus(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn183 = function ( attributes ) {\n     this.yyval = this.Node_Expr_AssignMinus(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn184 = function ( attributes ) {\n     this.yyval = this.Node_Expr_AssignMul(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn185 = function ( attributes ) {\n     this.yyval = this.Node_Expr_AssignDiv(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn186 = function ( attributes ) {\n     this.yyval = this.Node_Expr_AssignConcat(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn187 = function ( attributes ) {\n     this.yyval = this.Node_Expr_AssignMod(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn188 = function ( attributes ) {\n     this.yyval = this.Node_Expr_AssignBitwiseAnd(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn189 = function ( attributes ) {\n     this.yyval = this.Node_Expr_AssignBitwiseOr(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn190 = function ( attributes ) {\n     this.yyval = this.Node_Expr_AssignBitwiseXor(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn191 = function ( attributes ) {\n     this.yyval = this.Node_Expr_AssignShiftLeft(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn192 = function ( attributes ) {\n     this.yyval = this.Node_Expr_AssignShiftRight(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn193 = function ( attributes ) {\n     this.yyval = this.Node_Expr_PostInc(this.yyastk[ this.stackPos-(2-1) ], attributes); \n};\n\nPHP.Parser.prototype.yyn194 = function ( attributes ) {\n     this.yyval = this.Node_Expr_PreInc(this.yyastk[ this.stackPos-(2-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn195 = function ( attributes ) {\n     this.yyval = this.Node_Expr_PostDec(this.yyastk[ this.stackPos-(2-1) ], attributes); \n};\n\nPHP.Parser.prototype.yyn196 = function ( attributes ) {\n     this.yyval = this.Node_Expr_PreDec(this.yyastk[ this.stackPos-(2-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn197 = function ( attributes ) {\n     this.yyval = this.Node_Expr_BooleanOr(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn198 = function ( attributes ) {\n     this.yyval = this.Node_Expr_BooleanAnd(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn199 = function ( attributes ) {\n     this.yyval = this.Node_Expr_LogicalOr(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn200 = function ( attributes ) {\n     this.yyval = this.Node_Expr_LogicalAnd(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn201 = function ( attributes ) {\n     this.yyval = this.Node_Expr_LogicalXor(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn202 = function ( attributes ) {\n     this.yyval = this.Node_Expr_BitwiseOr(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn203 = function ( attributes ) {\n     this.yyval = this.Node_Expr_BitwiseAnd(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn204 = function ( attributes ) {\n     this.yyval = this.Node_Expr_BitwiseXor(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn205 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Concat(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn206 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Plus(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn207 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Minus(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn208 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Mul(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn209 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Div(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn210 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Mod(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn211 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ShiftLeft(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn212 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ShiftRight(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn213 = function ( attributes ) {\n     this.yyval = this.Node_Expr_UnaryPlus(this.yyastk[ this.stackPos-(2-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn214 = function ( attributes ) {\n     this.yyval = this.Node_Expr_UnaryMinus(this.yyastk[ this.stackPos-(2-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn215 = function ( attributes ) {\n     this.yyval = this.Node_Expr_BooleanNot(this.yyastk[ this.stackPos-(2-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn216 = function ( attributes ) {\n     this.yyval = this.Node_Expr_BitwiseNot(this.yyastk[ this.stackPos-(2-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn217 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Identical(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn218 = function ( attributes ) {\n     this.yyval = this.Node_Expr_NotIdentical(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn219 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Equal(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn220 = function ( attributes ) {\n     this.yyval = this.Node_Expr_NotEqual(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn221 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Smaller(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn222 = function ( attributes ) {\n     this.yyval = this.Node_Expr_SmallerOrEqual(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn223 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Greater(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn224 = function ( attributes ) {\n     this.yyval = this.Node_Expr_GreaterOrEqual(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn225 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Instanceof(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn226 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(3-2) ]; \n};\n\nPHP.Parser.prototype.yyn227 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(3-2) ]; \n};\n\nPHP.Parser.prototype.yyn228 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Ternary(this.yyastk[ this.stackPos-(5-1) ], this.yyastk[ this.stackPos-(5-3) ], this.yyastk[ this.stackPos-(5-5) ], attributes); \n};\n\nPHP.Parser.prototype.yyn229 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Ternary(this.yyastk[ this.stackPos-(4-1) ], null, this.yyastk[ this.stackPos-(4-4) ], attributes); \n};\n\nPHP.Parser.prototype.yyn230 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Isset(this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn231 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Empty(this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn232 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Include(this.yyastk[ this.stackPos-(2-2) ], \"Node_Expr_Include\", attributes); \n};\n\nPHP.Parser.prototype.yyn233 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Include(this.yyastk[ this.stackPos-(2-2) ], \"Node_Expr_IncludeOnce\", attributes); \n};\n\nPHP.Parser.prototype.yyn234 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Eval(this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn235 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Include(this.yyastk[ this.stackPos-(2-2) ], \"Node_Expr_Require\", attributes); \n};\n\nPHP.Parser.prototype.yyn236 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Include(this.yyastk[ this.stackPos-(2-2) ], \"Node_Expr_RequireOnce\", attributes); \n};\n\nPHP.Parser.prototype.yyn237 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Cast_Int(this.yyastk[ this.stackPos-(2-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn238 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Cast_Double(this.yyastk[ this.stackPos-(2-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn239 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Cast_String(this.yyastk[ this.stackPos-(2-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn240 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Cast_Array(this.yyastk[ this.stackPos-(2-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn241 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Cast_Object(this.yyastk[ this.stackPos-(2-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn242 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Cast_Bool(this.yyastk[ this.stackPos-(2-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn243 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Cast_Unset(this.yyastk[ this.stackPos-(2-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn244 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Exit(this.yyastk[ this.stackPos-(2-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn245 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ErrorSuppress(this.yyastk[ this.stackPos-(2-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn246 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn247 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Array(this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn248 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Array(this.yyastk[ this.stackPos-(3-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn249 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ShellExec(this.yyastk[ this.stackPos-(3-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn250 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Print(this.yyastk[ this.stackPos-(2-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn251 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Closure({'static':  false, 'byRef':  this.yyastk[ this.stackPos-(9-2) ], 'params':  this.yyastk[ this.stackPos-(9-4) ], 'uses':  this.yyastk[ this.stackPos-(9-6) ], 'stmts':  this.yyastk[ this.stackPos-(9-8) ]}, attributes); \n};\n\nPHP.Parser.prototype.yyn252 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Closure({'static':  true, 'byRef':  this.yyastk[ this.stackPos-(10-3) ], 'params':  this.yyastk[ this.stackPos-(10-5) ], 'uses':  this.yyastk[ this.stackPos-(10-7) ], 'stmts':  this.yyastk[ this.stackPos-(10-9) ]}, attributes); \n};\n\nPHP.Parser.prototype.yyn253 = function ( attributes ) {\n     this.yyval = this.Node_Expr_New(this.yyastk[ this.stackPos-(3-2) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn254 = function ( attributes ) {\n     this.yyval = []; \n};\n\nPHP.Parser.prototype.yyn255 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(4-3) ]; \n};\n\nPHP.Parser.prototype.yyn256 = function ( attributes ) {\n     this.yyval = [this.yyastk[ this.stackPos-(1-1) ]]; \n};\n\nPHP.Parser.prototype.yyn257 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(3-1) ].push( this.yyastk[ this.stackPos-(3-3) ] ); this.yyval = this.yyastk[ this.stackPos-(3-1) ]; \n};\n\nPHP.Parser.prototype.yyn258 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ClosureUse(this.yyastk[ this.stackPos-(2-2) ].substring( 1 ), this.yyastk[ this.stackPos-(2-1) ], attributes); \n};\n\nPHP.Parser.prototype.yyn259 = function ( attributes ) {\n     this.yyval = this.Node_Expr_FuncCall(this.yyastk[ this.stackPos-(4-1) ], this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn260 = function ( attributes ) {\n     this.yyval = this.Node_Expr_StaticCall(this.yyastk[ this.stackPos-(6-1) ], this.yyastk[ this.stackPos-(6-3) ], this.yyastk[ this.stackPos-(6-5) ], attributes); \n};\n\nPHP.Parser.prototype.yyn261 = function ( attributes ) {\n     this.yyval = this.Node_Expr_StaticCall(this.yyastk[ this.stackPos-(8-1) ], this.yyastk[ this.stackPos-(8-4) ], this.yyastk[ this.stackPos-(8-7) ], attributes); \n};\n\nPHP.Parser.prototype.yyn262 = function ( attributes ) {\n    \n            if (this.yyastk[ this.stackPos-(4-1) ].type === \"Node_Expr_StaticPropertyFetch\") {\n                this.yyval = this.Node_Expr_StaticCall(this.yyastk[ this.stackPos-(4-1) ].Class, this.Node_Expr_Variable(this.yyastk[ this.stackPos-(4-1) ].name, attributes), this.yyastk[ this.stackPos-(4-3) ], attributes);\n            } else if (this.yyastk[ this.stackPos-(4-1) ].type === \"Node_Expr_ArrayDimFetch\") {\n                var tmp = this.yyastk[ this.stackPos-(4-1) ];\n                while (tmp.variable.type === \"Node_Expr_ArrayDimFetch\") {\n                    tmp = tmp.variable;\n                }\n\n                this.yyval = this.Node_Expr_StaticCall(tmp.variable.Class, this.yyastk[ this.stackPos-(4-1) ], this.yyastk[ this.stackPos-(4-3) ], attributes);\n                tmp.variable = this.Node_Expr_Variable(tmp.variable.name, attributes);\n            } else {\n                throw new Exception;\n            }\n          \n};\n\nPHP.Parser.prototype.yyn263 = function ( attributes ) {\n     this.yyval = this.Node_Expr_FuncCall(this.yyastk[ this.stackPos-(4-1) ], this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn264 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ArrayDimFetch(this.yyastk[ this.stackPos-(4-1) ], this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn265 = function ( attributes ) {\n     this.yyval = this.Node_Name('static', attributes); \n};\n\nPHP.Parser.prototype.yyn266 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn267 = function ( attributes ) {\n     this.yyval = this.Node_Name(this.yyastk[ this.stackPos-(1-1) ], attributes); \n};\n\nPHP.Parser.prototype.yyn268 = function ( attributes ) {\n     this.yyval = this.Node_Name_FullyQualified(this.yyastk[ this.stackPos-(2-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn269 = function ( attributes ) {\n     this.yyval = this.Node_Name_Relative(this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn270 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn271 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn272 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn273 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn274 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn275 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn276 = function () {\n    this.yyval = this.yyastk[ this.stackPos ];\n};\n\nPHP.Parser.prototype.yyn277 = function ( attributes ) {\n     this.yyval = this.Node_Expr_PropertyFetch(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn278 = function ( attributes ) {\n     this.yyval = this.Node_Expr_PropertyFetch(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn279 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ArrayDimFetch(this.yyastk[ this.stackPos-(4-1) ], this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn280 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ArrayDimFetch(this.yyastk[ this.stackPos-(4-1) ], this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn281 = function ( attributes ) {\n     this.yyval = null; \n};\n\nPHP.Parser.prototype.yyn282 = function ( attributes ) {\n     this.yyval = null; \n};\n\nPHP.Parser.prototype.yyn283 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(3-2) ]; \n};\n\nPHP.Parser.prototype.yyn284 = function ( attributes ) {\n     this.yyval = []; \n};\n\nPHP.Parser.prototype.yyn285 = function ( attributes ) {\n     this.yyval = [this.Scalar_String_parseEscapeSequences(this.yyastk[ this.stackPos-(1-1) ], '`')]; \n};\n\nPHP.Parser.prototype.yyn286 = function ( attributes ) {\n     ; this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn287 = function ( attributes ) {\n     this.yyval = []; \n};\n\nPHP.Parser.prototype.yyn288 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(3-2) ]; \n};\n\nPHP.Parser.prototype.yyn289 = function ( attributes ) {\n     this.yyval = this.Node_Scalar_LNumber(this.Scalar_LNumber_parse(this.yyastk[ this.stackPos-(1-1) ]), attributes); \n};\n\nPHP.Parser.prototype.yyn290 = function ( attributes ) {\n     this.yyval = this.Node_Scalar_DNumber(this.Scalar_DNumber_parse(this.yyastk[ this.stackPos-(1-1) ]), attributes); \n};\n\nPHP.Parser.prototype.yyn291 = function ( attributes ) {\n     this.yyval = this.Scalar_String_create(this.yyastk[ this.stackPos-(1-1) ], attributes); \n};\n\nPHP.Parser.prototype.yyn292 = function ( attributes ) {\n     this.yyval = {type: \"Node_Scalar_LineConst\", attributes: attributes}; \n};\n\nPHP.Parser.prototype.yyn293 = function ( attributes ) {\n     this.yyval = {type: \"Node_Scalar_FileConst\", attributes: attributes}; \n};\n\nPHP.Parser.prototype.yyn294 = function ( attributes ) {\n     this.yyval = {type: \"Node_Scalar_DirConst\", attributes: attributes}; \n};\n\nPHP.Parser.prototype.yyn295 = function ( attributes ) {\n     this.yyval = {type: \"Node_Scalar_ClassConst\", attributes: attributes}; \n};\n\nPHP.Parser.prototype.yyn296 = function ( attributes ) {\n     this.yyval = {type: \"Node_Scalar_TraitConst\", attributes: attributes}; \n};\n\nPHP.Parser.prototype.yyn297 = function ( attributes ) {\n     this.yyval = {type: \"Node_Scalar_MethodConst\", attributes: attributes}; \n};\n\nPHP.Parser.prototype.yyn298 = function ( attributes ) {\n     this.yyval = {type: \"Node_Scalar_FuncConst\", attributes: attributes}; \n};\n\nPHP.Parser.prototype.yyn299 = function ( attributes ) {\n     this.yyval = {type: \"Node_Scalar_NSConst\", attributes: attributes}; \n};\n\nPHP.Parser.prototype.yyn300 = function ( attributes ) {\n     this.yyval = this.Node_Scalar_String(this.Scalar_String_parseDocString(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-2) ]), attributes); \n};\n\nPHP.Parser.prototype.yyn301 = function ( attributes ) {\n     this.yyval = this.Node_Scalar_String('', attributes); \n};\n\nPHP.Parser.prototype.yyn302 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ConstFetch(this.yyastk[ this.stackPos-(1-1) ], attributes); \n};\n\nPHP.Parser.prototype.yyn303 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn304 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ClassConstFetch(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn305 = function ( attributes ) {\n     this.yyval = this.Node_Expr_UnaryPlus(this.yyastk[ this.stackPos-(2-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn306 = function ( attributes ) {\n     this.yyval = this.Node_Expr_UnaryMinus(this.yyastk[ this.stackPos-(2-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn307 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Array(this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn308 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Array(this.yyastk[ this.stackPos-(3-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn309 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn310 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ClassConstFetch(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn311 = function ( attributes ) {\n     ; this.yyval = this.Node_Scalar_Encapsed(this.yyastk[ this.stackPos-(3-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn312 = function ( attributes ) {\n     ; this.yyval = this.Node_Scalar_Encapsed(this.yyastk[ this.stackPos-(3-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn313 = function ( attributes ) {\n     this.yyval = []; \n};\n\nPHP.Parser.prototype.yyn314 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(2-1) ]; \n};\n\nPHP.Parser.prototype.yyn315 = function () {\n    this.yyval = this.yyastk[ this.stackPos ];\n};\n\nPHP.Parser.prototype.yyn316 = function () {\n    this.yyval = this.yyastk[ this.stackPos ];\n};\n\nPHP.Parser.prototype.yyn317 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(3-1) ].push( this.yyastk[ this.stackPos-(3-3) ] ); this.yyval = this.yyastk[ this.stackPos-(3-1) ]; \n};\n\nPHP.Parser.prototype.yyn318 = function ( attributes ) {\n     this.yyval = [this.yyastk[ this.stackPos-(1-1) ]]; \n};\n\nPHP.Parser.prototype.yyn319 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ArrayItem(this.yyastk[ this.stackPos-(3-3) ], this.yyastk[ this.stackPos-(3-1) ], false, attributes); \n};\n\nPHP.Parser.prototype.yyn320 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ArrayItem(this.yyastk[ this.stackPos-(1-1) ], null, false, attributes); \n};\n\nPHP.Parser.prototype.yyn321 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn322 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn323 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn324 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn325 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ArrayDimFetch(this.yyastk[ this.stackPos-(6-2) ], this.yyastk[ this.stackPos-(6-5) ], attributes); \n};\n\nPHP.Parser.prototype.yyn326 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ArrayDimFetch(this.yyastk[ this.stackPos-(4-1) ], this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn327 = function ( attributes ) {\n     this.yyval = this.Node_Expr_PropertyFetch(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn328 = function ( attributes ) {\n     this.yyval = this.Node_Expr_MethodCall(this.yyastk[ this.stackPos-(6-1) ], this.yyastk[ this.stackPos-(6-3) ], this.yyastk[ this.stackPos-(6-5) ], attributes); \n};\n\nPHP.Parser.prototype.yyn329 = function ( attributes ) {\n     this.yyval = this.Node_Expr_FuncCall(this.yyastk[ this.stackPos-(4-1) ], this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn330 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ArrayDimFetch(this.yyastk[ this.stackPos-(4-1) ], this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn331 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ArrayDimFetch(this.yyastk[ this.stackPos-(4-1) ], this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn332 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn333 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(3-2) ]; \n};\n\nPHP.Parser.prototype.yyn334 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn335 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Variable(this.yyastk[ this.stackPos-(2-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn336 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn337 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn338 = function ( attributes ) {\n     this.yyval = this.Node_Expr_StaticPropertyFetch(this.yyastk[ this.stackPos-(4-1) ], this.yyastk[ this.stackPos-(4-4) ], attributes); \n};\n\nPHP.Parser.prototype.yyn339 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn340 = function ( attributes ) {\n     this.yyval = this.Node_Expr_StaticPropertyFetch(this.yyastk[ this.stackPos-(3-1) ], this.yyastk[ this.stackPos-(3-3) ].substring( 1 ), attributes); \n};\n\nPHP.Parser.prototype.yyn341 = function ( attributes ) {\n     this.yyval = this.Node_Expr_StaticPropertyFetch(this.yyastk[ this.stackPos-(6-1) ], this.yyastk[ this.stackPos-(6-5) ], attributes); \n};\n\nPHP.Parser.prototype.yyn342 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ArrayDimFetch(this.yyastk[ this.stackPos-(4-1) ], this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn343 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ArrayDimFetch(this.yyastk[ this.stackPos-(4-1) ], this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn344 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ArrayDimFetch(this.yyastk[ this.stackPos-(4-1) ], this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn345 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ArrayDimFetch(this.yyastk[ this.stackPos-(4-1) ], this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn346 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Variable(this.yyastk[ this.stackPos-(1-1) ].substring( 1 ), attributes); \n};\n\nPHP.Parser.prototype.yyn347 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Variable(this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn348 = function ( attributes ) {\n     this.yyval = null; \n};\n\nPHP.Parser.prototype.yyn349 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn350 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn351 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(3-2) ]; \n};\n\nPHP.Parser.prototype.yyn352 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn353 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(3-1) ].push( this.yyastk[ this.stackPos-(3-3) ] ); this.yyval = this.yyastk[ this.stackPos-(3-1) ]; \n};\n\nPHP.Parser.prototype.yyn354 = function ( attributes ) {\n     this.yyval = [this.yyastk[ this.stackPos-(1-1) ]]; \n};\n\nPHP.Parser.prototype.yyn355 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(1-1) ]; \n};\n\nPHP.Parser.prototype.yyn356 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(4-3) ]; \n};\n\nPHP.Parser.prototype.yyn357 = function ( attributes ) {\n     this.yyval = null; \n};\n\nPHP.Parser.prototype.yyn358 = function ( attributes ) {\n     this.yyval = []; \n};\n\nPHP.Parser.prototype.yyn359 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(2-1) ]; \n};\n\nPHP.Parser.prototype.yyn360 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(3-1) ].push( this.yyastk[ this.stackPos-(3-3) ] ); this.yyval = this.yyastk[ this.stackPos-(3-1) ]; \n};\n\nPHP.Parser.prototype.yyn361 = function ( attributes ) {\n     this.yyval = [this.yyastk[ this.stackPos-(1-1) ]]; \n};\n\nPHP.Parser.prototype.yyn362 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ArrayItem(this.yyastk[ this.stackPos-(3-3) ], this.yyastk[ this.stackPos-(3-1) ], false, attributes); \n};\n\nPHP.Parser.prototype.yyn363 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ArrayItem(this.yyastk[ this.stackPos-(1-1) ], null, false, attributes); \n};\n\nPHP.Parser.prototype.yyn364 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ArrayItem(this.yyastk[ this.stackPos-(4-4) ], this.yyastk[ this.stackPos-(4-1) ], true, attributes); \n};\n\nPHP.Parser.prototype.yyn365 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ArrayItem(this.yyastk[ this.stackPos-(2-2) ], null, true, attributes); \n};\n\nPHP.Parser.prototype.yyn366 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(2-1) ].push( this.yyastk[ this.stackPos-(2-2) ] ); this.yyval = this.yyastk[ this.stackPos-(2-1) ]; \n};\n\nPHP.Parser.prototype.yyn367 = function ( attributes ) {\n     this.yyastk[ this.stackPos-(2-1) ].push( this.yyastk[ this.stackPos-(2-2) ] ); this.yyval = this.yyastk[ this.stackPos-(2-1) ]; \n};\n\nPHP.Parser.prototype.yyn368 = function ( attributes ) {\n     this.yyval = [this.yyastk[ this.stackPos-(1-1) ]]; \n};\n\nPHP.Parser.prototype.yyn369 = function ( attributes ) {\n     this.yyval = [this.yyastk[ this.stackPos-(2-1) ], this.yyastk[ this.stackPos-(2-2) ]]; \n};\n\nPHP.Parser.prototype.yyn370 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Variable(this.yyastk[ this.stackPos-(1-1) ].substring( 1 ), attributes); \n};\n\nPHP.Parser.prototype.yyn371 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ArrayDimFetch(this.Node_Expr_Variable(this.yyastk[ this.stackPos-(4-1) ].substring( 1 ), attributes), this.yyastk[ this.stackPos-(4-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn372 = function ( attributes ) {\n     this.yyval = this.Node_Expr_PropertyFetch(this.Node_Expr_Variable(this.yyastk[ this.stackPos-(3-1) ].substring( 1 ), attributes), this.yyastk[ this.stackPos-(3-3) ], attributes); \n};\n\nPHP.Parser.prototype.yyn373 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Variable(this.yyastk[ this.stackPos-(3-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn374 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Variable(this.yyastk[ this.stackPos-(3-2) ], attributes); \n};\n\nPHP.Parser.prototype.yyn375 = function ( attributes ) {\n     this.yyval = this.Node_Expr_ArrayDimFetch(this.Node_Expr_Variable(this.yyastk[ this.stackPos-(6-2) ], attributes), this.yyastk[ this.stackPos-(6-4) ], attributes); \n};\n\nPHP.Parser.prototype.yyn376 = function ( attributes ) {\n     this.yyval = this.yyastk[ this.stackPos-(3-2) ]; \n};\n\nPHP.Parser.prototype.yyn377 = function ( attributes ) {\n     this.yyval = this.Node_Scalar_String(this.yyastk[ this.stackPos-(1-1) ], attributes); \n};\n\nPHP.Parser.prototype.yyn378 = function ( attributes ) {\n     this.yyval = this.Node_Scalar_String(this.yyastk[ this.stackPos-(1-1) ], attributes); \n};\n\nPHP.Parser.prototype.yyn379 = function ( attributes ) {\n     this.yyval = this.Node_Expr_Variable(this.yyastk[ this.stackPos-(1-1) ].substring( 1 ), attributes); \n};\n\n\nPHP.Parser.prototype.Stmt_Namespace_postprocess = function( a ) {\n  return a;  \n};\n\n\nPHP.Parser.prototype.Node_Stmt_Echo = function() {\n    return {\n        type: \"Node_Stmt_Echo\",\n        exprs: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };  \n\n};\n\n\nPHP.Parser.prototype.Node_Stmt_If = function() {\n    return {\n        type: \"Node_Stmt_If\",\n        cond: arguments[ 0 ],\n        stmts: arguments[ 1 ].stmts,\n        elseifs: arguments[ 1 ].elseifs,\n        Else: arguments[ 1 ].Else || null,\n        attributes: arguments[ 2 ]\n    };  \n\n};\n\n\nPHP.Parser.prototype.Node_Stmt_For = function() {\n    \n    return {\n        type: \"Node_Stmt_For\",\n        init: arguments[ 0 ].init,\n        cond: arguments[ 0 ].cond,\n        loop: arguments[ 0 ].loop,\n        stmts: arguments[ 0 ].stmts,\n        attributes: arguments[ 1 ]\n    };   \n\n};\n\nPHP.Parser.prototype.Node_Stmt_Function = function() {\n    return {\n        type: \"Node_Stmt_Function\",\n        name: arguments[ 0 ],\n        byRef: arguments[ 1 ].byRef,\n        params: arguments[ 1 ].params,\n        stmts: arguments[ 1 ].stmts,\n        attributes: arguments[ 2 ]\n    };  \n\n};\n\nPHP.Parser.prototype.Stmt_Class_verifyModifier = function() {\n  \n\n};\n\nPHP.Parser.prototype.Node_Stmt_Namespace = function() {\n    return {\n        type: \"Node_Stmt_Namespace\",\n        name: arguments[ 0 ],\n        attributes: arguments[ 2 ]\n    };  \n};\n\nPHP.Parser.prototype.Node_Stmt_Use = function() {\n    return {\n        type: \"Node_Stmt_Use\",\n        name: arguments[ 0 ],\n        attributes: arguments[ 2 ]\n    };  \n};\n\nPHP.Parser.prototype.Node_Stmt_UseUse = function() {\n    return {\n        type: \"Node_Stmt_UseUse\",\n        name: arguments[ 0 ],\n        as: arguments[1],\n        attributes: arguments[ 2 ]\n    };  \n};\n\nPHP.Parser.prototype.Node_Stmt_TraitUseAdaptation_Precedence = function() {\n    return {\n        type: \"Node_Stmt_TraitUseAdaptation_Precedence\",\n        name: arguments[ 0 ],\n        attributes: arguments[ 2 ]\n    };  \n};\n\nPHP.Parser.prototype.Node_Stmt_TraitUseAdaptation_Alias = function() {\n    return {\n        type: \"Node_Stmt_TraitUseAdaptation_Alias\",\n        name: arguments[ 0 ],\n        attributes: arguments[ 2 ]\n    };  \n};\n\nPHP.Parser.prototype.Node_Stmt_Trait = function() {\n    return {\n        type: \"Node_Stmt_Trait\",\n        name: arguments[ 0 ],\n        attributes: arguments[ 2 ]\n    };  \n};\n\nPHP.Parser.prototype.Node_Stmt_TraitUse = function() {\n    return {\n        type: \"Node_Stmt_TraitUse\",\n        name: arguments[ 0 ],\n        attributes: arguments[ 2 ]\n    };  \n};\n\nPHP.Parser.prototype.Node_Stmt_Class = function() {\n    return {\n        type: \"Node_Stmt_Class\",\n        name: arguments[ 0 ],\n        Type: arguments[ 1 ].type,\n        Extends: arguments[ 1 ].Extends,\n        Implements: arguments[ 1 ].Implements,\n        stmts: arguments[ 1 ].stmts,\n        attributes: arguments[ 2 ]\n    };  \n\n};\n\nPHP.Parser.prototype.Node_Stmt_ClassMethod = function() {\n    return {\n        type: \"Node_Stmt_ClassMethod\",\n        name: arguments[ 0 ],\n        Type: arguments[ 1 ].type,\n        byRef: arguments[ 1 ].byRef,\n        params: arguments[ 1 ].params,\n        stmts: arguments[ 1 ].stmts,\n        attributes: arguments[ 2 ]\n    };  \n\n};\n\n\nPHP.Parser.prototype.Node_Stmt_ClassConst = function() {\n    return {\n        type: \"Node_Stmt_ClassConst\",\n        consts: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };  \n\n};\n\nPHP.Parser.prototype.Node_Stmt_Interface = function() {\n    return {\n        type: \"Node_Stmt_Interface\",\n        name: arguments[ 0 ],\n        Extends: arguments[ 1 ].Extends,\n        stmts: arguments[ 1 ].stmts,\n        attributes: arguments[ 2 ]\n    };  \n\n};\n\nPHP.Parser.prototype.Node_Stmt_Throw = function() {\n    return {\n        type: \"Node_Stmt_Throw\",\n        expr: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };  \n\n};\n\nPHP.Parser.prototype.Node_Stmt_Catch = function() {\n    return {\n        type: \"Node_Stmt_Catch\",\n        Type: arguments[ 0 ],\n        variable: arguments[ 1 ],\n        stmts: arguments[ 2 ],\n        attributes: arguments[ 3 ]\n    };  \n\n};\n\n\nPHP.Parser.prototype.Node_Stmt_TryCatch = function() {\n    return {\n        type: \"Node_Stmt_TryCatch\",\n        stmts: arguments[ 0 ],\n        catches: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };  \n\n};\n\n\nPHP.Parser.prototype.Node_Stmt_Foreach = function() {\n    return {\n        type: \"Node_Stmt_Foreach\",\n        expr: arguments[ 0 ],\n        valueVar: arguments[ 1 ],\n        keyVar: arguments[ 2 ].keyVar,\n        byRef: arguments[ 2 ].byRef,\n        stmts: arguments[ 2 ].stmts,\n        attributes: arguments[ 3 ]\n    };  \n\n};\n\nPHP.Parser.prototype.Node_Stmt_While = function() {\n    return {\n        type: \"Node_Stmt_While\",\n        cond: arguments[ 0 ],\n        stmts: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };  \n\n};\n\nPHP.Parser.prototype.Node_Stmt_Do = function() {\n    return {\n        type: \"Node_Stmt_Do\",\n        cond: arguments[ 0 ],\n        stmts: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };  \n\n};\n\nPHP.Parser.prototype.Node_Stmt_Break = function() {\n    return {\n        type: \"Node_Stmt_Break\",\n        num: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };  \n\n};\n\nPHP.Parser.prototype.Node_Stmt_Continue = function() {\n    return {\n        type: \"Node_Stmt_Continue\",\n        num: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };  \n\n};\n\nPHP.Parser.prototype.Node_Stmt_Return = function() {\n    return {\n        type: \"Node_Stmt_Return\",\n        expr: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };  \n\n};\n\nPHP.Parser.prototype.Node_Stmt_Case = function() {\n    return {\n        type: \"Node_Stmt_Case\",\n        cond: arguments[ 0 ],\n        stmts: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };  \n\n};\n\nPHP.Parser.prototype.Node_Stmt_Switch = function() {\n    return {\n        type: \"Node_Stmt_Switch\",\n        cond: arguments[ 0 ],\n        cases: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };  \n\n};\n\nPHP.Parser.prototype.Node_Stmt_Else = function() {\n   \n    return {\n        type: \"Node_Stmt_Else\",\n        stmts: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };  \n\n};\n\nPHP.Parser.prototype.Node_Stmt_ElseIf = function() {\n    return {\n        type: \"Node_Stmt_ElseIf\",\n        cond: arguments[ 0 ],\n        stmts: arguments[ 1 ],\n        attributes: arguments[ 1 ]\n    };  \n\n};\n\nPHP.Parser.prototype.Node_Stmt_InlineHTML = function() {\n    return {\n        type: \"Node_Stmt_InlineHTML\",\n        value: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };  \n\n};\n\n\nPHP.Parser.prototype.Node_Stmt_StaticVar = function() {\n    return {\n        type: \"Node_Stmt_StaticVar\",\n        name: arguments[ 0 ],\n        def: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };  \n\n};\n\n\nPHP.Parser.prototype.Node_Stmt_Static = function() {\n    return {\n        type: \"Node_Stmt_Static\",\n        vars: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };  \n\n};\n\nPHP.Parser.prototype.Node_Stmt_Global = function() {\n    return {\n        type: \"Node_Stmt_Global\",\n        vars: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };  \n\n};\n\n\nPHP.Parser.prototype.Node_Stmt_PropertyProperty = function() {\n    return {\n        type: \"Node_Stmt_PropertyProperty\",\n        name: arguments[ 0 ],\n        def: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };  \n\n};\n\n\nPHP.Parser.prototype.Node_Stmt_Property = function() {\n    return {\n        type: \"Node_Stmt_Property\",\n        Type: arguments[ 0 ],\n        props: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };  \n\n};\n\nPHP.Parser.prototype.Node_Stmt_Unset = function() {\n    return {\n        type: \"Node_Stmt_Unset\",\n        variables: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };  \n\n};\n\n\nPHP.Parser.prototype.Node_Expr_Variable = function( a ) {\n    return {\n        type: \"Node_Expr_Variable\",\n        name: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n};\n\nPHP.Parser.prototype.Node_Expr_FuncCall = function() {\n\n    return {\n        type: \"Node_Expr_FuncCall\",\n        func: arguments[ 0 ],\n        args: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_MethodCall = function() {\n\n    return {\n        type: \"Node_Expr_MethodCall\",\n        variable: arguments[ 0 ],\n        name: arguments[ 1 ],\n        args: arguments[ 2 ],\n        attributes: arguments[ 3 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_StaticCall = function() {\n\n    return {\n        type: \"Node_Expr_StaticCall\",\n        Class: arguments[ 0 ],\n        func: arguments[ 1 ],\n        args: arguments[ 2 ],\n        attributes: arguments[ 3 ]\n    };\n\n};\n\n\nPHP.Parser.prototype.Node_Expr_Ternary = function() {\n\n    return {\n        type: \"Node_Expr_Ternary\",\n        cond: arguments[ 0 ],\n        If: arguments[ 1 ],\n        Else: arguments[ 2 ],\n        attributes: arguments[ 3 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_AssignList = function() {\n\n    return {\n        type: \"Node_Expr_AssignList\",\n        assignList: arguments[ 0 ],\n        expr: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\n\nPHP.Parser.prototype.Node_Expr_Assign = function() {\n\n    return {\n        type: \"Node_Expr_Assign\",\n        variable: arguments[ 0 ],\n        expr: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_AssignConcat = function() {\n\n    return {\n        type: \"Node_Expr_AssignConcat\",\n        variable: arguments[ 0 ],\n        expr: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_AssignMinus = function() {\n\n    return {\n        type: \"Node_Expr_AssignMinus\",\n        variable: arguments[ 0 ],\n        expr: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_AssignPlus = function() {\n\n    return {\n        type: \"Node_Expr_AssignPlus\",\n        variable: arguments[ 0 ],\n        expr: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_AssignDiv = function() {\n\n    return {\n        type: \"Node_Expr_AssignDiv\",\n        variable: arguments[ 0 ],\n        expr: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_AssignRef = function() {\n\n    return {\n        type: \"Node_Expr_AssignRef\",\n        variable: arguments[ 0 ],\n        refVar: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_AssignMul = function() {\n\n    return {\n        type: \"Node_Expr_AssignMul\",\n        variable: arguments[ 0 ],\n        expr: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_AssignMod = function() {\n\n    return {\n        type: \"Node_Expr_AssignMod\",\n        variable: arguments[ 0 ],\n        expr: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_Plus = function() {\n\n    return {\n        type: \"Node_Expr_Plus\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_Minus = function() {\n\n    return {\n        type: \"Node_Expr_Minus\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\n\nPHP.Parser.prototype.Node_Expr_Mul = function() {\n\n    return {\n        type: \"Node_Expr_Mul\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\n\nPHP.Parser.prototype.Node_Expr_Div = function() {\n\n    return {\n        type: \"Node_Expr_Div\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\n\nPHP.Parser.prototype.Node_Expr_Mod = function() {\n\n    return {\n        type: \"Node_Expr_Mod\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_Greater = function() {\n\n    return {\n        type: \"Node_Expr_Greater\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_Equal = function() {\n\n    return {\n        type: \"Node_Expr_Equal\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_NotEqual = function() {\n\n    return {\n        type: \"Node_Expr_NotEqual\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\n\nPHP.Parser.prototype.Node_Expr_Identical = function() {\n\n    return {\n        type: \"Node_Expr_Identical\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\n\nPHP.Parser.prototype.Node_Expr_NotIdentical = function() {\n\n    return {\n        type: \"Node_Expr_NotIdentical\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_GreaterOrEqual = function() {\n\n    return {\n        type: \"Node_Expr_GreaterOrEqual\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_SmallerOrEqual = function() {\n\n    return {\n        type: \"Node_Expr_SmallerOrEqual\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_Concat = function() {\n\n    return {\n        type: \"Node_Expr_Concat\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_Smaller = function() {\n\n    return {\n        type: \"Node_Expr_Smaller\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_PostInc = function() {\n\n    return {\n        type: \"Node_Expr_PostInc\",\n        variable: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_PostDec = function() {\n\n    return {\n        type: \"Node_Expr_PostDec\",\n        variable: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_PreInc = function() {\n\n    return {\n        type: \"Node_Expr_PreInc\",\n        variable: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_PreDec = function() {\n\n    return {\n        type: \"Node_Expr_PreDec\",\n        variable: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_Include = function() {\n    return {\n        expr: arguments[ 0 ],\n        type: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n};\n\nPHP.Parser.prototype.Node_Expr_ArrayDimFetch = function() {\n\n    return {\n        type: \"Node_Expr_ArrayDimFetch\",\n        variable: arguments[ 0 ],\n        dim: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_StaticPropertyFetch = function() {\n\n    return {\n        type: \"Node_Expr_StaticPropertyFetch\",\n        Class: arguments[ 0 ],\n        name: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_ClassConstFetch = function() {\n\n    return {\n        type: \"Node_Expr_ClassConstFetch\",\n        Class: arguments[ 0 ],\n        name: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\n\nPHP.Parser.prototype.Node_Expr_StaticPropertyFetch = function() {\n\n    return {\n        type: \"Node_Expr_StaticPropertyFetch\",\n        Class: arguments[ 0 ],\n        name: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_ConstFetch = function() {\n\n    return {\n        type: \"Node_Expr_ConstFetch\",\n        name: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_ArrayItem = function() {\n\n    return {\n        type: \"Node_Expr_ArrayItem\",\n        value: arguments[ 0 ],\n        key: arguments[ 1 ],\n        byRef: arguments[ 2 ],\n        attributes: arguments[ 3 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_Array = function() {\n\n    return {\n        type: \"Node_Expr_Array\",\n        items: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_PropertyFetch = function() {\n\n    return {\n        type: \"Node_Expr_PropertyFetch\",\n        variable: arguments[ 0 ],\n        name: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_New = function() {\n\n    return {\n        type: \"Node_Expr_New\",\n        Class: arguments[ 0 ],\n        args: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\n\nPHP.Parser.prototype.Node_Expr_Print = function() {\n    return {\n        type: \"Node_Expr_Print\",\n        expr: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n\n};\n\n\nPHP.Parser.prototype.Node_Expr_Exit = function() {\n    return {\n        type: \"Node_Expr_Exit\",\n        expr: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n\n};\n\n\nPHP.Parser.prototype.Node_Expr_Cast_Bool = function() {\n    return {\n        type: \"Node_Expr_Cast_Bool\",\n        expr: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_Cast_Int = function() {\n    return {\n        type: \"Node_Expr_Cast_Int\",\n        expr: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_Cast_String = function() {\n    return {\n        type: \"Node_Expr_Cast_String\",\n        expr: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_Cast_Double = function() {\n    return {\n        type: \"Node_Expr_Cast_Double\",\n        expr: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_Cast_Array = function() {\n    return {\n        type: \"Node_Expr_Cast_Array\",\n        expr: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_Cast_Object = function() {\n    return {\n        type: \"Node_Expr_Cast_Object\",\n        expr: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n\n};\n\n\nPHP.Parser.prototype.Node_Expr_ErrorSuppress = function() {\n    return {\n        type: \"Node_Expr_ErrorSuppress\",\n        expr: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n\n};\n\n\nPHP.Parser.prototype.Node_Expr_Isset = function() {\n    return {\n        type: \"Node_Expr_Isset\",\n        variables: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n\n};\n\n\n\n\nPHP.Parser.prototype.Node_Expr_UnaryMinus = function() {\n    return {\n        type: \"Node_Expr_UnaryMinus\",\n        expr: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n\n};\n\n\nPHP.Parser.prototype.Node_Expr_UnaryPlus = function() {\n    return {\n        type: \"Node_Expr_UnaryPlus\",\n        expr: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_Empty = function() {\n    return {\n        type: \"Node_Expr_Empty\",\n        variable: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_BooleanOr = function() {\n    return {\n        type: \"Node_Expr_BooleanOr\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_LogicalOr = function() {\n    return {\n        type: \"Node_Expr_LogicalOr\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_LogicalAnd = function() {\n    return {\n        type: \"Node_Expr_LogicalAnd\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\n\nPHP.Parser.prototype.Node_Expr_LogicalXor = function() {\n    return {\n        type: \"Node_Expr_LogicalXor\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_BitwiseAnd = function() {\n    return {\n        type: \"Node_Expr_BitwiseAnd\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_BitwiseOr = function() {\n    return {\n        type: \"Node_Expr_BitwiseOr\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_BitwiseXor = function() {\n    return {\n        type: \"Node_Expr_BitwiseXor\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_BitwiseNot = function() {\n    return {\n        type: \"Node_Expr_BitwiseNot\",\n        expr: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_BooleanNot = function() {\n    return {\n        type: \"Node_Expr_BooleanNot\",\n        expr: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_BooleanAnd = function() {\n    return {\n        type: \"Node_Expr_BooleanAnd\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_Instanceof = function() {\n\n    return {\n        type: \"Node_Expr_Instanceof\",\n        left: arguments[ 0 ],\n        right: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };\n\n};\n\nPHP.Parser.prototype.Node_Expr_Clone = function() {\n\n    return {\n        type: \"Node_Expr_Clone\",\n        expr: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };\n\n};\n\n\n\nPHP.Parser.prototype.Scalar_LNumber_parse = function( a ) {\n   \n    return a;  \n};\n\nPHP.Parser.prototype.Scalar_DNumber_parse = function( a ) {\n   \n    return a;  \n};\n\nPHP.Parser.prototype.Scalar_String_parseDocString = function() {\n    \n    return '\"' + arguments[ 1 ].replace(/([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"/g, '$1\\\\\"') + '\"';\n};\n\n\nPHP.Parser.prototype.Node_Scalar_String = function( ) {\n   \n    return {\n        type: \"Node_Scalar_String\",\n        value: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };  \n\n};\n\nPHP.Parser.prototype.Scalar_String_create = function( ) {\n    return {\n        type: \"Node_Scalar_String\",\n        value: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };  \n\n};\n\nPHP.Parser.prototype.Node_Scalar_LNumber = function() {\n   \n    return {\n        type: \"Node_Scalar_LNumber\",\n        value: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };  \n  \n};\n\n\nPHP.Parser.prototype.Node_Scalar_DNumber = function() {\n   \n    return {\n        type: \"Node_Scalar_DNumber\",\n        value: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };  \n  \n};\n\n\nPHP.Parser.prototype.Node_Scalar_Encapsed = function() {\n   \n    return {\n        type: \"Node_Scalar_Encapsed\",\n        parts: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };  \n  \n};\n\nPHP.Parser.prototype.Node_Name = function() {\n   \n    return {\n        type: \"Node_Name\",\n        parts: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };  \n  \n};\n\nPHP.Parser.prototype.Node_Name_FullyQualified = function() {\n   \n    return {\n        type: \"Node_Name_FullyQualified\",\n        parts: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };  \n  \n};\n\nPHP.Parser.prototype.Node_Name_Relative = function() {\n   \n    return {\n        type: \"Node_Name_Relative\",\n        parts: arguments[ 0 ],\n        attributes: arguments[ 1 ]\n    };  \n  \n};\n\nPHP.Parser.prototype.Node_Param = function() {\n   \n    return {\n        type: \"Node_Param\",\n        name: arguments[ 0 ],\n        def: arguments[ 1 ],\n        Type: arguments[ 2 ],\n        byRef: arguments[ 3 ],\n        attributes: arguments[ 4 ]\n    };  \n  \n};\n\nPHP.Parser.prototype.Node_Arg = function() {\n   \n    return {\n        type: \"Node_Name\",\n        value: arguments[ 0 ],\n        byRef: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };  \n  \n};\n\nPHP.Parser.prototype.Node_Const = function() {\n   \n    return {\n        type: \"Node_Const\",\n        name: arguments[ 0 ],\n        value: arguments[ 1 ],\n        attributes: arguments[ 2 ]\n    };  \n  \n};\n\n\nexports.PHP = PHP;\n});\n\nace.define(\"ace/mode/php_worker\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/worker/mirror\",\"ace/mode/php/php\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"../lib/oop\");\nvar Mirror = require(\"../worker/mirror\").Mirror;\nvar PHP = require(\"./php/php\").PHP;\n\nvar PhpWorker = exports.PhpWorker = function(sender) {\n    Mirror.call(this, sender);\n    this.setTimeout(500);\n};\n\noop.inherits(PhpWorker, Mirror);\n\n(function() {\n    this.setOptions = function(opts) {\n        this.inlinePhp = opts && opts.inline;\n    };\n    \n    this.onUpdate = function() {\n        var value = this.doc.getValue();\n        var errors = [];\n        if (this.inlinePhp)\n            value = \"<?\" + value + \"?>\";\n\n        var tokens = PHP.Lexer(value, {short_open_tag: 1});\n        try {\n            new PHP.Parser(tokens);\n        } catch(e) {\n            errors.push({\n                row: e.line - 1,\n                column: null,\n                text: e.message.charAt(0).toUpperCase() + e.message.substring(1),\n                type: \"error\"\n            });\n        }\n\n        if (errors.length) {\n            this.sender.emit(\"error\", errors);\n        } else {\n            this.sender.emit(\"ok\");\n        }\n    };\n\n}).call(PhpWorker.prototype);\n\n});\n\nace.define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\nfunction Empty() {}\n\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function bind(that) { // .length is 1\n        var target = this;\n        if (typeof target != \"function\") {\n            throw new TypeError(\"Function.prototype.bind called on incompatible \" + target);\n        }\n        var args = slice.call(arguments, 1); // for normal call\n        var bound = function () {\n\n            if (this instanceof bound) {\n\n                var result = target.apply(\n                    this,\n                    args.concat(slice.call(arguments))\n                );\n                if (Object(result) === result) {\n                    return result;\n                }\n                return this;\n\n            } else {\n                return target.apply(\n                    that,\n                    args.concat(slice.call(arguments))\n                );\n\n            }\n\n        };\n        if(target.prototype) {\n            Empty.prototype = target.prototype;\n            bound.prototype = new Empty();\n            Empty.prototype = null;\n        }\n        return bound;\n    };\n}\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar _toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n    defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n    defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n    lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n    lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\nif ([1,2].splice(0).length != 2) {\n    if(function() { // test IE < 9 to splice bug - see issue #138\n        function makeArray(l) {\n            var a = new Array(l+2);\n            a[0] = a[1] = 0;\n            return a;\n        }\n        var array = [], lengthBefore;\n        \n        array.splice.apply(array, makeArray(20));\n        array.splice.apply(array, makeArray(26));\n\n        lengthBefore = array.length; //46\n        array.splice(5, 0, \"XXX\"); // add one element\n\n        lengthBefore + 1 == array.length\n\n        if (lengthBefore + 1 == array.length) {\n            return true;// has right splice implementation without bugs\n        }\n    }()) {//IE 6/7\n        var array_splice = Array.prototype.splice;\n        Array.prototype.splice = function(start, deleteCount) {\n            if (!arguments.length) {\n                return [];\n            } else {\n                return array_splice.apply(this, [\n                    start === void 0 ? 0 : start,\n                    deleteCount === void 0 ? (this.length - start) : deleteCount\n                ].concat(slice.call(arguments, 2)))\n            }\n        };\n    } else {//IE8\n        Array.prototype.splice = function(pos, removeCount){\n            var length = this.length;\n            if (pos > 0) {\n                if (pos > length)\n                    pos = length;\n            } else if (pos == void 0) {\n                pos = 0;\n            } else if (pos < 0) {\n                pos = Math.max(length + pos, 0);\n            }\n\n            if (!(pos+removeCount < length))\n                removeCount = length - pos;\n\n            var removed = this.slice(pos, pos+removeCount);\n            var insert = slice.call(arguments, 2);\n            var add = insert.length;            \n            if (pos === length) {\n                if (add) {\n                    this.push.apply(this, insert);\n                }\n            } else {\n                var remove = Math.min(removeCount, length - pos);\n                var tailOldPos = pos + remove;\n                var tailNewPos = tailOldPos + add - remove;\n                var tailCount = length - tailOldPos;\n                var lengthAfterRemove = length - remove;\n\n                if (tailNewPos < tailOldPos) { // case A\n                    for (var i = 0; i < tailCount; ++i) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } else if (tailNewPos > tailOldPos) { // case B\n                    for (i = tailCount; i--; ) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } // else, add == remove (nothing to do)\n\n                if (add && pos === lengthAfterRemove) {\n                    this.length = lengthAfterRemove; // truncate array\n                    this.push.apply(this, insert);\n                } else {\n                    this.length = lengthAfterRemove + add; // reserves space\n                    for (i = 0; i < add; ++i) {\n                        this[pos+i] = insert[i];\n                    }\n                }\n            }\n            return removed;\n        };\n    }\n}\nif (!Array.isArray) {\n    Array.isArray = function isArray(obj) {\n        return _toString(obj) == \"[object Array]\";\n    };\n}\nvar boxedString = Object(\"a\"),\n    splitString = boxedString[0] != \"a\" || !(0 in boxedString);\n\nif (!Array.prototype.forEach) {\n    Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            thisp = arguments[1],\n            i = -1,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        while (++i < length) {\n            if (i in self) {\n                fun.call(thisp, self[i], i, object);\n            }\n        }\n    };\n}\nif (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            result = Array(length),\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self)\n                result[i] = fun.call(thisp, self[i], i, object);\n        }\n        return result;\n    };\n}\nif (!Array.prototype.filter) {\n    Array.prototype.filter = function filter(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                    object,\n            length = self.length >>> 0,\n            result = [],\n            value,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self) {\n                value = self[i];\n                if (fun.call(thisp, value, i, object)) {\n                    result.push(value);\n                }\n            }\n        }\n        return result;\n    };\n}\nif (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && !fun.call(thisp, self[i], i, object)) {\n                return false;\n            }\n        }\n        return true;\n    };\n}\nif (!Array.prototype.some) {\n    Array.prototype.some = function some(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, object)) {\n                return true;\n            }\n        }\n        return false;\n    };\n}\nif (!Array.prototype.reduce) {\n    Array.prototype.reduce = function reduce(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduce of empty array with no initial value\");\n        }\n\n        var i = 0;\n        var result;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i++];\n                    break;\n                }\n                if (++i >= length) {\n                    throw new TypeError(\"reduce of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        for (; i < length; i++) {\n            if (i in self) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        }\n\n        return result;\n    };\n}\nif (!Array.prototype.reduceRight) {\n    Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduceRight of empty array with no initial value\");\n        }\n\n        var result, i = length - 1;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i--];\n                    break;\n                }\n                if (--i < 0) {\n                    throw new TypeError(\"reduceRight of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        do {\n            if (i in this) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        } while (i--);\n\n        return result;\n    };\n}\nif (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {\n    Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n\n        var i = 0;\n        if (arguments.length > 1) {\n            i = toInteger(arguments[1]);\n        }\n        i = i >= 0 ? i : Math.max(0, length + i);\n        for (; i < length; i++) {\n            if (i in self && self[i] === sought) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {\n    Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n        var i = length - 1;\n        if (arguments.length > 1) {\n            i = Math.min(i, toInteger(arguments[1]));\n        }\n        i = i >= 0 ? i : length - Math.abs(i);\n        for (; i >= 0; i--) {\n            if (i in self && sought === self[i]) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Object.getPrototypeOf) {\n    Object.getPrototypeOf = function getPrototypeOf(object) {\n        return object.__proto__ || (\n            object.constructor ?\n            object.constructor.prototype :\n            prototypeOfObject\n        );\n    };\n}\nif (!Object.getOwnPropertyDescriptor) {\n    var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n                         \"non-object: \";\n    Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT + object);\n        if (!owns(object, property))\n            return;\n\n        var descriptor, getter, setter;\n        descriptor =  { enumerable: true, configurable: true };\n        if (supportsAccessors) {\n            var prototype = object.__proto__;\n            object.__proto__ = prototypeOfObject;\n\n            var getter = lookupGetter(object, property);\n            var setter = lookupSetter(object, property);\n            object.__proto__ = prototype;\n\n            if (getter || setter) {\n                if (getter) descriptor.get = getter;\n                if (setter) descriptor.set = setter;\n                return descriptor;\n            }\n        }\n        descriptor.value = object[property];\n        return descriptor;\n    };\n}\nif (!Object.getOwnPropertyNames) {\n    Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n        return Object.keys(object);\n    };\n}\nif (!Object.create) {\n    var createEmpty;\n    if (Object.prototype.__proto__ === null) {\n        createEmpty = function () {\n            return { \"__proto__\": null };\n        };\n    } else {\n        createEmpty = function () {\n            var empty = {};\n            for (var i in empty)\n                empty[i] = null;\n            empty.constructor =\n            empty.hasOwnProperty =\n            empty.propertyIsEnumerable =\n            empty.isPrototypeOf =\n            empty.toLocaleString =\n            empty.toString =\n            empty.valueOf =\n            empty.__proto__ = null;\n            return empty;\n        }\n    }\n\n    Object.create = function create(prototype, properties) {\n        var object;\n        if (prototype === null) {\n            object = createEmpty();\n        } else {\n            if (typeof prototype != \"object\")\n                throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n            var Type = function () {};\n            Type.prototype = prototype;\n            object = new Type();\n            object.__proto__ = prototype;\n        }\n        if (properties !== void 0)\n            Object.defineProperties(object, properties);\n        return object;\n    };\n}\n\nfunction doesDefinePropertyWork(object) {\n    try {\n        Object.defineProperty(object, \"sentinel\", {});\n        return \"sentinel\" in object;\n    } catch (exception) {\n    }\n}\nif (Object.defineProperty) {\n    var definePropertyWorksOnObject = doesDefinePropertyWork({});\n    var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n        doesDefinePropertyWork(document.createElement(\"div\"));\n    if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n        var definePropertyFallback = Object.defineProperty;\n    }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n    var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n    var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n    var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n                                      \"on this javascript engine\";\n\n    Object.defineProperty = function defineProperty(object, property, descriptor) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n        if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n            throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n        if (definePropertyFallback) {\n            try {\n                return definePropertyFallback.call(Object, object, property, descriptor);\n            } catch (exception) {\n            }\n        }\n        if (owns(descriptor, \"value\")) {\n\n            if (supportsAccessors && (lookupGetter(object, property) ||\n                                      lookupSetter(object, property)))\n            {\n                var prototype = object.__proto__;\n                object.__proto__ = prototypeOfObject;\n                delete object[property];\n                object[property] = descriptor.value;\n                object.__proto__ = prototype;\n            } else {\n                object[property] = descriptor.value;\n            }\n        } else {\n            if (!supportsAccessors)\n                throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n            if (owns(descriptor, \"get\"))\n                defineGetter(object, property, descriptor.get);\n            if (owns(descriptor, \"set\"))\n                defineSetter(object, property, descriptor.set);\n        }\n\n        return object;\n    };\n}\nif (!Object.defineProperties) {\n    Object.defineProperties = function defineProperties(object, properties) {\n        for (var property in properties) {\n            if (owns(properties, property))\n                Object.defineProperty(object, property, properties[property]);\n        }\n        return object;\n    };\n}\nif (!Object.seal) {\n    Object.seal = function seal(object) {\n        return object;\n    };\n}\nif (!Object.freeze) {\n    Object.freeze = function freeze(object) {\n        return object;\n    };\n}\ntry {\n    Object.freeze(function () {});\n} catch (exception) {\n    Object.freeze = (function freeze(freezeObject) {\n        return function freeze(object) {\n            if (typeof object == \"function\") {\n                return object;\n            } else {\n                return freezeObject(object);\n            }\n        };\n    })(Object.freeze);\n}\nif (!Object.preventExtensions) {\n    Object.preventExtensions = function preventExtensions(object) {\n        return object;\n    };\n}\nif (!Object.isSealed) {\n    Object.isSealed = function isSealed(object) {\n        return false;\n    };\n}\nif (!Object.isFrozen) {\n    Object.isFrozen = function isFrozen(object) {\n        return false;\n    };\n}\nif (!Object.isExtensible) {\n    Object.isExtensible = function isExtensible(object) {\n        if (Object(object) === object) {\n            throw new TypeError(); // TODO message\n        }\n        var name = '';\n        while (owns(object, name)) {\n            name += '?';\n        }\n        object[name] = true;\n        var returnValue = owns(object, name);\n        delete object[name];\n        return returnValue;\n    };\n}\nif (!Object.keys) {\n    var hasDontEnumBug = true,\n        dontEnums = [\n            \"toString\",\n            \"toLocaleString\",\n            \"valueOf\",\n            \"hasOwnProperty\",\n            \"isPrototypeOf\",\n            \"propertyIsEnumerable\",\n            \"constructor\"\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    for (var key in {\"toString\": null}) {\n        hasDontEnumBug = false;\n    }\n\n    Object.keys = function keys(object) {\n\n        if (\n            (typeof object != \"object\" && typeof object != \"function\") ||\n            object === null\n        ) {\n            throw new TypeError(\"Object.keys called on a non-object\");\n        }\n\n        var keys = [];\n        for (var name in object) {\n            if (owns(object, name)) {\n                keys.push(name);\n            }\n        }\n\n        if (hasDontEnumBug) {\n            for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n                var dontEnum = dontEnums[i];\n                if (owns(object, dontEnum)) {\n                    keys.push(dontEnum);\n                }\n            }\n        }\n        return keys;\n    };\n\n}\nif (!Date.now) {\n    Date.now = function now() {\n        return new Date().getTime();\n    };\n}\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n    \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n    \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n    ws = \"[\" + ws + \"]\";\n    var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n        trimEndRegexp = new RegExp(ws + ws + \"*$\");\n    String.prototype.trim = function trim() {\n        return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n    };\n}\n\nfunction toInteger(n) {\n    n = +n;\n    if (n !== n) { // isNaN\n        n = 0;\n    } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {\n        n = (n > 0 || -1) * Math.floor(Math.abs(n));\n    }\n    return n;\n}\n\nfunction isPrimitive(input) {\n    var type = typeof input;\n    return (\n        input === null ||\n        type === \"undefined\" ||\n        type === \"boolean\" ||\n        type === \"number\" ||\n        type === \"string\"\n    );\n}\n\nfunction toPrimitive(input) {\n    var val, valueOf, toString;\n    if (isPrimitive(input)) {\n        return input;\n    }\n    valueOf = input.valueOf;\n    if (typeof valueOf === \"function\") {\n        val = valueOf.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    toString = input.toString;\n    if (typeof toString === \"function\") {\n        val = toString.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    throw new TypeError();\n}\nvar toObject = function (o) {\n    if (o == null) { // this matches both null and undefined\n        throw new TypeError(\"can't convert \"+o+\" to object\");\n    }\n    return Object(o);\n};\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/src-noconflict/worker-xquery.js",
    "content": "\"no use strict\";\n;(function(window) {\nif (typeof window.window != \"undefined\" && window.document) {\n    return;\n}\n\nwindow.console = function() {\n    var msgs = Array.prototype.slice.call(arguments, 0);\n    postMessage({type: \"log\", data: msgs});\n};\nwindow.console.error =\nwindow.console.warn = \nwindow.console.log =\nwindow.console.trace = window.console;\n\nwindow.window = window;\nwindow.ace = window;\n\nwindow.onerror = function(message, file, line, col, err) {\n    postMessage({type: \"error\", data: {\n        message: message,\n        file: file,\n        line: line, \n        col: col,\n        stack: err.stack\n    }});\n};\n\nwindow.normalizeModule = function(parentId, moduleName) {\n    // normalize plugin requires\n    if (moduleName.indexOf(\"!\") !== -1) {\n        var chunks = moduleName.split(\"!\");\n        return window.normalizeModule(parentId, chunks[0]) + \"!\" + window.normalizeModule(parentId, chunks[1]);\n    }\n    // normalize relative requires\n    if (moduleName.charAt(0) == \".\") {\n        var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n        moduleName = (base ? base + \"/\" : \"\") + moduleName;\n        \n        while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n            var previous = moduleName;\n            moduleName = moduleName.replace(/^\\.\\//, \"\").replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n        }\n    }\n    \n    return moduleName;\n};\n\nwindow.require = function(parentId, id) {\n    if (!id) {\n        id = parentId;\n        parentId = null;\n    }\n    if (!id.charAt)\n        throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");\n\n    id = window.normalizeModule(parentId, id);\n\n    var module = window.require.modules[id];\n    if (module) {\n        if (!module.initialized) {\n            module.initialized = true;\n            module.exports = module.factory().exports;\n        }\n        return module.exports;\n    }\n    \n    var chunks = id.split(\"/\");\n    if (!window.require.tlns)\n        return console.log(\"unable to load \" + id);\n    chunks[0] = window.require.tlns[chunks[0]] || chunks[0];\n    var path = chunks.join(\"/\") + \".js\";\n    \n    window.require.id = id;\n    importScripts(path);\n    return window.require(parentId, id);\n};\nwindow.require.modules = {};\nwindow.require.tlns = {};\n\nwindow.define = function(id, deps, factory) {\n    if (arguments.length == 2) {\n        factory = deps;\n        if (typeof id != \"string\") {\n            deps = id;\n            id = window.require.id;\n        }\n    } else if (arguments.length == 1) {\n        factory = id;\n        deps = [];\n        id = window.require.id;\n    }\n    \n    if (typeof factory != \"function\") {\n        window.require.modules[id] = {\n            exports: factory,\n            initialized: true\n        };\n        return;\n    }\n\n    if (!deps.length)\n        // If there is no dependencies, we inject 'require', 'exports' and\n        // 'module' as dependencies, to provide CommonJS compatibility.\n        deps = ['require', 'exports', 'module'];\n\n    var req = function(childId) {\n        return window.require(id, childId);\n    };\n\n    window.require.modules[id] = {\n        exports: {},\n        factory: function() {\n            var module = this;\n            var returnExports = factory.apply(this, deps.map(function(dep) {\n              switch(dep) {\n                  // Because 'require', 'exports' and 'module' aren't actual\n                  // dependencies, we must handle them seperately.\n                  case 'require': return req;\n                  case 'exports': return module.exports;\n                  case 'module':  return module;\n                  // But for all other dependencies, we can just go ahead and\n                  // require them.\n                  default:        return req(dep);\n              }\n            }));\n            if (returnExports)\n                module.exports = returnExports;\n            return module;\n        }\n    };\n};\nwindow.define.amd = {};\n\nwindow.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n    require.tlns = topLevelNamespaces;\n};\n\nwindow.initSender = function initSender() {\n\n    var EventEmitter = window.require(\"ace/lib/event_emitter\").EventEmitter;\n    var oop = window.require(\"ace/lib/oop\");\n    \n    var Sender = function() {};\n    \n    (function() {\n        \n        oop.implement(this, EventEmitter);\n                \n        this.callback = function(data, callbackId) {\n            postMessage({\n                type: \"call\",\n                id: callbackId,\n                data: data\n            });\n        };\n    \n        this.emit = function(name, data) {\n            postMessage({\n                type: \"event\",\n                name: name,\n                data: data\n            });\n        };\n        \n    }).call(Sender.prototype);\n    \n    return new Sender();\n};\n\nvar main = window.main = null;\nvar sender = window.sender = null;\n\nwindow.onmessage = function(e) {\n    var msg = e.data;\n    if (msg.command) {\n        if (main[msg.command])\n            main[msg.command].apply(main, msg.args);\n        else\n            throw new Error(\"Unknown command:\" + msg.command);\n    }\n    else if (msg.init) {        \n        initBaseUrls(msg.tlns);\n        require(\"ace/lib/es5-shim\");\n        sender = window.sender = initSender();\n        var clazz = require(msg.module)[msg.classname];\n        main = window.main = new clazz(sender);\n    } \n    else if (msg.event && sender) {\n        sender._signal(msg.event, msg.data);\n    }\n};\n})(this);\n\nace.define(\"ace/lib/oop\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.inherits = function(ctor, 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\nexports.mixin = function(obj, mixin) {\n    for (var key in mixin) {\n        obj[key] = mixin[key];\n    }\n    return obj;\n};\n\nexports.implement = function(proto, mixin) {\n    exports.mixin(proto, mixin);\n};\n\n});\n\nace.define(\"ace/lib/event_emitter\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nvar EventEmitter = {};\nvar stopPropagation = function() { this.propagationStopped = true; };\nvar preventDefault = function() { this.defaultPrevented = true; };\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n    this._eventRegistry || (this._eventRegistry = {});\n    this._defaultHandlers || (this._defaultHandlers = {});\n\n    var listeners = this._eventRegistry[eventName] || [];\n    var defaultHandler = this._defaultHandlers[eventName];\n    if (!listeners.length && !defaultHandler)\n        return;\n\n    if (typeof e != \"object\" || !e)\n        e = {};\n\n    if (!e.type)\n        e.type = eventName;\n    if (!e.stopPropagation)\n        e.stopPropagation = stopPropagation;\n    if (!e.preventDefault)\n        e.preventDefault = preventDefault;\n\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++) {\n        listeners[i](e, this);\n        if (e.propagationStopped)\n            break;\n    }\n    \n    if (defaultHandler && !e.defaultPrevented)\n        return defaultHandler(e, this);\n};\n\n\nEventEmitter._signal = function(eventName, e) {\n    var listeners = (this._eventRegistry || {})[eventName];\n    if (!listeners)\n        return;\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++)\n        listeners[i](e, this);\n};\n\nEventEmitter.once = function(eventName, callback) {\n    var _self = this;\n    callback && this.addEventListener(eventName, function newCallback() {\n        _self.removeEventListener(eventName, newCallback);\n        callback.apply(null, arguments);\n    });\n};\n\n\nEventEmitter.setDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        handlers = this._defaultHandlers = {_disabled_: {}};\n    \n    if (handlers[eventName]) {\n        var old = handlers[eventName];\n        var disabled = handlers._disabled_[eventName];\n        if (!disabled)\n            handlers._disabled_[eventName] = disabled = [];\n        disabled.push(old);\n        var i = disabled.indexOf(callback);\n        if (i != -1) \n            disabled.splice(i, 1);\n    }\n    handlers[eventName] = callback;\n};\nEventEmitter.removeDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        return;\n    var disabled = handlers._disabled_[eventName];\n    \n    if (handlers[eventName] == callback) {\n        var old = handlers[eventName];\n        if (disabled)\n            this.setDefaultHandler(eventName, disabled.pop());\n    } else if (disabled) {\n        var i = disabled.indexOf(callback);\n        if (i != -1)\n            disabled.splice(i, 1);\n    }\n};\n\nEventEmitter.on =\nEventEmitter.addEventListener = function(eventName, callback, capturing) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        listeners = this._eventRegistry[eventName] = [];\n\n    if (listeners.indexOf(callback) == -1)\n        listeners[capturing ? \"unshift\" : \"push\"](callback);\n    return callback;\n};\n\nEventEmitter.off =\nEventEmitter.removeListener =\nEventEmitter.removeEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        return;\n\n    var index = listeners.indexOf(callback);\n    if (index !== -1)\n        listeners.splice(index, 1);\n};\n\nEventEmitter.removeAllListeners = function(eventName) {\n    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n};\n\nexports.EventEmitter = EventEmitter;\n\n});\n\nace.define(\"ace/range\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\nvar comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n    this.start = {\n        row: startRow,\n        column: startColumn\n    };\n\n    this.end = {\n        row: endRow,\n        column: endColumn\n    };\n};\n\n(function() {\n    this.isEqual = function(range) {\n        return this.start.row === range.start.row &&\n            this.end.row === range.end.row &&\n            this.start.column === range.start.column &&\n            this.end.column === range.end.column;\n    };\n    this.toString = function() {\n        return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n            \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n    };\n\n    this.contains = function(row, column) {\n        return this.compare(row, column) == 0;\n    };\n    this.compareRange = function(range) {\n        var cmp,\n            end = range.end,\n            start = range.start;\n\n        cmp = this.compare(end.row, end.column);\n        if (cmp == 1) {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == 1) {\n                return 2;\n            } else if (cmp == 0) {\n                return 1;\n            } else {\n                return 0;\n            }\n        } else if (cmp == -1) {\n            return -2;\n        } else {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == -1) {\n                return -1;\n            } else if (cmp == 1) {\n                return 42;\n            } else {\n                return 0;\n            }\n        }\n    };\n    this.comparePoint = function(p) {\n        return this.compare(p.row, p.column);\n    };\n    this.containsRange = function(range) {\n        return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n    };\n    this.intersects = function(range) {\n        var cmp = this.compareRange(range);\n        return (cmp == -1 || cmp == 0 || cmp == 1);\n    };\n    this.isEnd = function(row, column) {\n        return this.end.row == row && this.end.column == column;\n    };\n    this.isStart = function(row, column) {\n        return this.start.row == row && this.start.column == column;\n    };\n    this.setStart = function(row, column) {\n        if (typeof row == \"object\") {\n            this.start.column = row.column;\n            this.start.row = row.row;\n        } else {\n            this.start.row = row;\n            this.start.column = column;\n        }\n    };\n    this.setEnd = function(row, column) {\n        if (typeof row == \"object\") {\n            this.end.column = row.column;\n            this.end.row = row.row;\n        } else {\n            this.end.row = row;\n            this.end.column = column;\n        }\n    };\n    this.inside = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column) || this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideStart = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideEnd = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.compare = function(row, column) {\n        if (!this.isMultiLine()) {\n            if (row === this.start.row) {\n                return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n            };\n        }\n\n        if (row < this.start.row)\n            return -1;\n\n        if (row > this.end.row)\n            return 1;\n\n        if (this.start.row === row)\n            return column >= this.start.column ? 0 : -1;\n\n        if (this.end.row === row)\n            return column <= this.end.column ? 0 : 1;\n\n        return 0;\n    };\n    this.compareStart = function(row, column) {\n        if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareEnd = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareInside = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.clipRows = function(firstRow, lastRow) {\n        if (this.end.row > lastRow)\n            var end = {row: lastRow + 1, column: 0};\n        else if (this.end.row < firstRow)\n            var end = {row: firstRow, column: 0};\n\n        if (this.start.row > lastRow)\n            var start = {row: lastRow + 1, column: 0};\n        else if (this.start.row < firstRow)\n            var start = {row: firstRow, column: 0};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n    this.extend = function(row, column) {\n        var cmp = this.compare(row, column);\n\n        if (cmp == 0)\n            return this;\n        else if (cmp == -1)\n            var start = {row: row, column: column};\n        else\n            var end = {row: row, column: column};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n\n    this.isEmpty = function() {\n        return (this.start.row === this.end.row && this.start.column === this.end.column);\n    };\n    this.isMultiLine = function() {\n        return (this.start.row !== this.end.row);\n    };\n    this.clone = function() {\n        return Range.fromPoints(this.start, this.end);\n    };\n    this.collapseRows = function() {\n        if (this.end.column == 0)\n            return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)\n        else\n            return new Range(this.start.row, 0, this.end.row, 0)\n    };\n    this.toScreenRange = function(session) {\n        var screenPosStart = session.documentToScreenPosition(this.start);\n        var screenPosEnd = session.documentToScreenPosition(this.end);\n\n        return new Range(\n            screenPosStart.row, screenPosStart.column,\n            screenPosEnd.row, screenPosEnd.column\n        );\n    };\n    this.moveBy = function(row, column) {\n        this.start.row += row;\n        this.start.column += column;\n        this.end.row += row;\n        this.end.column += column;\n    };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n    return new Range(start.row, start.column, end.row, end.column);\n};\nRange.comparePoints = comparePoints;\n\nRange.comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\n\n\nexports.Range = Range;\n});\n\nace.define(\"ace/anchor\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n    this.$onChange = this.onChange.bind(this);\n    this.attach(doc);\n    \n    if (typeof column == \"undefined\")\n        this.setPosition(row.row, row.column);\n    else\n        this.setPosition(row, column);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.getPosition = function() {\n        return this.$clipPositionToDocument(this.row, this.column);\n    };\n    this.getDocument = function() {\n        return this.document;\n    };\n    this.$insertRight = false;\n    this.onChange = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n\n        if (range.start.row == range.end.row && range.start.row != this.row)\n            return;\n\n        if (range.start.row > this.row)\n            return;\n\n        if (range.start.row == this.row && range.start.column > this.column)\n            return;\n\n        var row = this.row;\n        var column = this.column;\n        var start = range.start;\n        var end = range.end;\n\n        if (delta.action === \"insertText\") {\n            if (start.row === row && start.column <= column) {\n                if (start.column === column && this.$insertRight) {\n                } else if (start.row === end.row) {\n                    column += end.column - start.column;\n                } else {\n                    column -= start.column;\n                    row += end.row - start.row;\n                }\n            } else if (start.row !== end.row && start.row < row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"insertLines\") {\n            if (start.row === row && column === 0 && this.$insertRight) {\n            }\n            else if (start.row <= row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"removeText\") {\n            if (start.row === row && start.column < column) {\n                if (end.column >= column)\n                    column = start.column;\n                else\n                    column = Math.max(0, column - (end.column - start.column));\n\n            } else if (start.row !== end.row && start.row < row) {\n                if (end.row === row)\n                    column = Math.max(0, column - end.column) + start.column;\n                row -= (end.row - start.row);\n            } else if (end.row === row) {\n                row -= end.row - start.row;\n                column = Math.max(0, column - end.column) + start.column;\n            }\n        } else if (delta.action == \"removeLines\") {\n            if (start.row <= row) {\n                if (end.row <= row)\n                    row -= end.row - start.row;\n                else {\n                    row = start.row;\n                    column = 0;\n                }\n            }\n        }\n\n        this.setPosition(row, column, true);\n    };\n    this.setPosition = function(row, column, noClip) {\n        var pos;\n        if (noClip) {\n            pos = {\n                row: row,\n                column: column\n            };\n        } else {\n            pos = this.$clipPositionToDocument(row, column);\n        }\n\n        if (this.row == pos.row && this.column == pos.column)\n            return;\n\n        var old = {\n            row: this.row,\n            column: this.column\n        };\n\n        this.row = pos.row;\n        this.column = pos.column;\n        this._signal(\"change\", {\n            old: old,\n            value: pos\n        });\n    };\n    this.detach = function() {\n        this.document.removeEventListener(\"change\", this.$onChange);\n    };\n    this.attach = function(doc) {\n        this.document = doc || this.document;\n        this.document.on(\"change\", this.$onChange);\n    };\n    this.$clipPositionToDocument = function(row, column) {\n        var pos = {};\n\n        if (row >= this.document.getLength()) {\n            pos.row = Math.max(0, this.document.getLength() - 1);\n            pos.column = this.document.getLine(pos.row).length;\n        }\n        else if (row < 0) {\n            pos.row = 0;\n            pos.column = 0;\n        }\n        else {\n            pos.row = row;\n            pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n        }\n\n        if (column < 0)\n            pos.column = 0;\n\n        return pos;\n    };\n\n}).call(Anchor.prototype);\n\n});\n\nace.define(\"ace/document\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/event_emitter\",\"ace/range\",\"ace/anchor\"], function(require, exports, module) {\n\"use strict\";\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\nvar Document = function(text) {\n    this.$lines = [];\n    if (text.length === 0) {\n        this.$lines = [\"\"];\n    } else if (Array.isArray(text)) {\n        this._insertLines(0, text);\n    } else {\n        this.insert({row: 0, column:0}, text);\n    }\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setValue = function(text) {\n        var len = this.getLength();\n        this.remove(new Range(0, 0, len, this.getLine(len-1).length));\n        this.insert({row: 0, column:0}, text);\n    };\n    this.getValue = function() {\n        return this.getAllLines().join(this.getNewLineCharacter());\n    };\n    this.createAnchor = function(row, column) {\n        return new Anchor(this, row, column);\n    };\n    if (\"aaa\".split(/a/).length === 0)\n        this.$split = function(text) {\n            return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n        };\n    else\n        this.$split = function(text) {\n            return text.split(/\\r\\n|\\r|\\n/);\n        };\n\n\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n        this.$autoNewLine = match ? match[1] : \"\\n\";\n        this._signal(\"changeNewLineMode\");\n    };\n    this.getNewLineCharacter = function() {\n        switch (this.$newLineMode) {\n          case \"windows\":\n            return \"\\r\\n\";\n          case \"unix\":\n            return \"\\n\";\n          default:\n            return this.$autoNewLine || \"\\n\";\n        }\n    };\n\n    this.$autoNewLine = \"\";\n    this.$newLineMode = \"auto\";\n    this.setNewLineMode = function(newLineMode) {\n        if (this.$newLineMode === newLineMode)\n            return;\n\n        this.$newLineMode = newLineMode;\n        this._signal(\"changeNewLineMode\");\n    };\n    this.getNewLineMode = function() {\n        return this.$newLineMode;\n    };\n    this.isNewLine = function(text) {\n        return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n    };\n    this.getLine = function(row) {\n        return this.$lines[row] || \"\";\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.$lines.slice(firstRow, lastRow + 1);\n    };\n    this.getAllLines = function() {\n        return this.getLines(0, this.getLength());\n    };\n    this.getLength = function() {\n        return this.$lines.length;\n    };\n    this.getTextRange = function(range) {\n        if (range.start.row == range.end.row) {\n            return this.getLine(range.start.row)\n                .substring(range.start.column, range.end.column);\n        }\n        var lines = this.getLines(range.start.row, range.end.row);\n        lines[0] = (lines[0] || \"\").substring(range.start.column);\n        var l = lines.length - 1;\n        if (range.end.row - range.start.row == l)\n            lines[l] = lines[l].substring(0, range.end.column);\n        return lines.join(this.getNewLineCharacter());\n    };\n\n    this.$clipPosition = function(position) {\n        var length = this.getLength();\n        if (position.row >= length) {\n            position.row = Math.max(0, length - 1);\n            position.column = this.getLine(length-1).length;\n        } else if (position.row < 0)\n            position.row = 0;\n        return position;\n    };\n    this.insert = function(position, text) {\n        if (!text || text.length === 0)\n            return position;\n\n        position = this.$clipPosition(position);\n        if (this.getLength() <= 1)\n            this.$detectNewLine(text);\n\n        var lines = this.$split(text);\n        var firstLine = lines.splice(0, 1)[0];\n        var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];\n\n        position = this.insertInLine(position, firstLine);\n        if (lastLine !== null) {\n            position = this.insertNewLine(position); // terminate first line\n            position = this._insertLines(position.row, lines);\n            position = this.insertInLine(position, lastLine || \"\");\n        }\n        return position;\n    };\n    this.insertLines = function(row, lines) {\n        if (row >= this.getLength())\n            return this.insert({row: row, column: 0}, \"\\n\" + lines.join(\"\\n\"));\n        return this._insertLines(Math.max(row, 0), lines);\n    };\n    this._insertLines = function(row, lines) {\n        if (lines.length == 0)\n            return {row: row, column: 0};\n        while (lines.length > 0xF000) {\n            var end = this._insertLines(row, lines.slice(0, 0xF000));\n            lines = lines.slice(0xF000);\n            row = end.row;\n        }\n\n        var args = [row, 0];\n        args.push.apply(args, lines);\n        this.$lines.splice.apply(this.$lines, args);\n\n        var range = new Range(row, 0, row + lines.length, 0);\n        var delta = {\n            action: \"insertLines\",\n            range: range,\n            lines: lines\n        };\n        this._signal(\"change\", { data: delta });\n        return range.end;\n    };\n    this.insertNewLine = function(position) {\n        position = this.$clipPosition(position);\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column);\n        this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));\n\n        var end = {\n            row : position.row + 1,\n            column : 0\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: this.getNewLineCharacter()\n        };\n        this._signal(\"change\", { data: delta });\n\n        return end;\n    };\n    this.insertInLine = function(position, text) {\n        if (text.length == 0)\n            return position;\n\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column) + text\n                + line.substring(position.column);\n\n        var end = {\n            row : position.row,\n            column : position.column + text.length\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: text\n        };\n        this._signal(\"change\", { data: delta });\n\n        return end;\n    };\n    this.remove = function(range) {\n        if (!(range instanceof Range))\n            range = Range.fromPoints(range.start, range.end);\n        range.start = this.$clipPosition(range.start);\n        range.end = this.$clipPosition(range.end);\n\n        if (range.isEmpty())\n            return range.start;\n\n        var firstRow = range.start.row;\n        var lastRow = range.end.row;\n\n        if (range.isMultiLine()) {\n            var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;\n            var lastFullRow = lastRow - 1;\n\n            if (range.end.column > 0)\n                this.removeInLine(lastRow, 0, range.end.column);\n\n            if (lastFullRow >= firstFullRow)\n                this._removeLines(firstFullRow, lastFullRow);\n\n            if (firstFullRow != firstRow) {\n                this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);\n                this.removeNewLine(range.start.row);\n            }\n        }\n        else {\n            this.removeInLine(firstRow, range.start.column, range.end.column);\n        }\n        return range.start;\n    };\n    this.removeInLine = function(row, startColumn, endColumn) {\n        if (startColumn == endColumn)\n            return;\n\n        var range = new Range(row, startColumn, row, endColumn);\n        var line = this.getLine(row);\n        var removed = line.substring(startColumn, endColumn);\n        var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);\n        this.$lines.splice(row, 1, newLine);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: removed\n        };\n        this._signal(\"change\", { data: delta });\n        return range.start;\n    };\n    this.removeLines = function(firstRow, lastRow) {\n        if (firstRow < 0 || lastRow >= this.getLength())\n            return this.remove(new Range(firstRow, 0, lastRow + 1, 0));\n        return this._removeLines(firstRow, lastRow);\n    };\n\n    this._removeLines = function(firstRow, lastRow) {\n        var range = new Range(firstRow, 0, lastRow + 1, 0);\n        var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);\n\n        var delta = {\n            action: \"removeLines\",\n            range: range,\n            nl: this.getNewLineCharacter(),\n            lines: removed\n        };\n        this._signal(\"change\", { data: delta });\n        return removed;\n    };\n    this.removeNewLine = function(row) {\n        var firstLine = this.getLine(row);\n        var secondLine = this.getLine(row+1);\n\n        var range = new Range(row, firstLine.length, row+1, 0);\n        var line = firstLine + secondLine;\n\n        this.$lines.splice(row, 2, line);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: this.getNewLineCharacter()\n        };\n        this._signal(\"change\", { data: delta });\n    };\n    this.replace = function(range, text) {\n        if (!(range instanceof Range))\n            range = Range.fromPoints(range.start, range.end);\n        if (text.length == 0 && range.isEmpty())\n            return range.start;\n        if (text == this.getTextRange(range))\n            return range.end;\n\n        this.remove(range);\n        if (text) {\n            var end = this.insert(range.start, text);\n        }\n        else {\n            end = range.start;\n        }\n\n        return end;\n    };\n    this.applyDeltas = function(deltas) {\n        for (var i=0; i<deltas.length; i++) {\n            var delta = deltas[i];\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"insertText\")\n                this.insert(range.start, delta.text);\n            else if (delta.action == \"removeLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"removeText\")\n                this.remove(range);\n        }\n    };\n    this.revertDeltas = function(deltas) {\n        for (var i=deltas.length-1; i>=0; i--) {\n            var delta = deltas[i];\n\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"insertText\")\n                this.remove(range);\n            else if (delta.action == \"removeLines\")\n                this._insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"removeText\")\n                this.insert(range.start, delta.text);\n        }\n    };\n    this.indexToPosition = function(index, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        for (var i = startRow || 0, l = lines.length; i < l; i++) {\n            index -= lines[i].length + newlineLength;\n            if (index < 0)\n                return {row: i, column: index + lines[i].length + newlineLength};\n        }\n        return {row: l-1, column: lines[l-1].length};\n    };\n    this.positionToIndex = function(pos, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        var index = 0;\n        var row = Math.min(pos.row, lines.length);\n        for (var i = startRow || 0; i < row; ++i)\n            index += lines[i].length + newlineLength;\n\n        return index + pos.column;\n    };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\nace.define(\"ace/lib/lang\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\"use strict\";\n\nexports.last = function(a) {\n    return a[a.length - 1];\n};\n\nexports.stringReverse = function(string) {\n    return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n    var result = '';\n    while (count > 0) {\n        if (count & 1)\n            result += string;\n\n        if (count >>= 1)\n            string += string;\n    }\n    return result;\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n    return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n    return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n    var copy = {};\n    for (var key in obj) {\n        copy[key] = obj[key];\n    }\n    return copy;\n};\n\nexports.copyArray = function(array){\n    var copy = [];\n    for (var i=0, l=array.length; i<l; i++) {\n        if (array[i] && typeof array[i] == \"object\")\n            copy[i] = this.copyObject( array[i] );\n        else \n            copy[i] = array[i];\n    }\n    return copy;\n};\n\nexports.deepCopy = function (obj) {\n    if (typeof obj !== \"object\" || !obj)\n        return obj;\n    var cons = obj.constructor;\n    if (cons === RegExp)\n        return obj;\n    \n    var copy = cons();\n    for (var key in obj) {\n        if (typeof obj[key] === \"object\") {\n            copy[key] = exports.deepCopy(obj[key]);\n        } else {\n            copy[key] = obj[key];\n        }\n    }\n    return copy;\n};\n\nexports.arrayToMap = function(arr) {\n    var map = {};\n    for (var i=0; i<arr.length; i++) {\n        map[arr[i]] = 1;\n    }\n    return map;\n\n};\n\nexports.createMap = function(props) {\n    var map = Object.create(null);\n    for (var i in props) {\n        map[i] = props[i];\n    }\n    return map;\n};\nexports.arrayRemove = function(array, value) {\n  for (var i = 0; i <= array.length; i++) {\n    if (value === array[i]) {\n      array.splice(i, 1);\n    }\n  }\n};\n\nexports.escapeRegExp = function(str) {\n    return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n};\n\nexports.escapeHTML = function(str) {\n    return str.replace(/&/g, \"&#38;\").replace(/\"/g, \"&#34;\").replace(/'/g, \"&#39;\").replace(/</g, \"&#60;\");\n};\n\nexports.getMatchOffsets = function(string, regExp) {\n    var matches = [];\n\n    string.replace(regExp, function(str) {\n        matches.push({\n            offset: arguments[arguments.length-2],\n            length: str.length\n        });\n    });\n\n    return matches;\n};\nexports.deferredCall = function(fcn) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var deferred = function(timeout) {\n        deferred.cancel();\n        timer = setTimeout(callback, timeout || 0);\n        return deferred;\n    };\n\n    deferred.schedule = deferred;\n\n    deferred.call = function() {\n        this.cancel();\n        fcn();\n        return deferred;\n    };\n\n    deferred.cancel = function() {\n        clearTimeout(timer);\n        timer = null;\n        return deferred;\n    };\n    \n    deferred.isPending = function() {\n        return timer;\n    };\n\n    return deferred;\n};\n\n\nexports.delayedCall = function(fcn, defaultTimeout) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var _self = function(timeout) {\n        if (timer == null)\n            timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n\n    _self.delay = function(timeout) {\n        timer && clearTimeout(timer);\n        timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n    _self.schedule = _self;\n\n    _self.call = function() {\n        this.cancel();\n        fcn();\n    };\n\n    _self.cancel = function() {\n        timer && clearTimeout(timer);\n        timer = null;\n    };\n\n    _self.isPending = function() {\n        return timer;\n    };\n\n    return _self;\n};\n});\n\nace.define(\"ace/worker/mirror\",[\"require\",\"exports\",\"module\",\"ace/document\",\"ace/lib/lang\"], function(require, exports, module) {\n\"use strict\";\n\nvar Document = require(\"../document\").Document;\nvar lang = require(\"../lib/lang\");\n    \nvar Mirror = exports.Mirror = function(sender) {\n    this.sender = sender;\n    var doc = this.doc = new Document(\"\");\n    \n    var deferredUpdate = this.deferredUpdate = lang.delayedCall(this.onUpdate.bind(this));\n    \n    var _self = this;\n    sender.on(\"change\", function(e) {\n        doc.applyDeltas(e.data);\n        if (_self.$timeout)\n            return deferredUpdate.schedule(_self.$timeout);\n        _self.onUpdate();\n    });\n};\n\n(function() {\n    \n    this.$timeout = 500;\n    \n    this.setTimeout = function(timeout) {\n        this.$timeout = timeout;\n    };\n    \n    this.setValue = function(value) {\n        this.doc.setValue(value);\n        this.deferredUpdate.schedule(this.$timeout);\n    };\n    \n    this.getValue = function(callbackId) {\n        this.sender.callback(this.doc.getValue(), callbackId);\n    };\n    \n    this.onUpdate = function() {\n    };\n    \n    this.isPending = function() {\n        return this.deferredUpdate.isPending();\n    };\n    \n}).call(Mirror.prototype);\n\n});\n\nace.define(\"ace/mode/xquery/xqlint\",[\"require\",\"exports\",\"module\",\"ace/mode/tree_ops\",\"ace/mode/xquery/errors\",\"ace/mode/tree_ops\",\"ace/mode/xquery/errors\",\"ace/mode/xquery/schema_built-in_types\",\"ace/mode/xquery/errors\",\"ace/mode/tree_ops\",\"ace/mode/xquery/static_context\",\"ace/mode/xquery/handlers\",\"ace/mode/tree_ops\",\"ace/mode/xquery/parsers/JSONiqParser\",\"ace/mode/xquery/parsers/XQueryParser\",\"ace/mode/xquery/parsers/JSONParseTreeHandler\",\"ace/mode/xquery/compiler/translator\",\"ace/mode/xquery/formatter/style_checker\",\"ace/mode/lib/completion/completer\",\"ace/mode/xquery/compiler/static_context\"], function(require, exports, module) {\nmodule.exports = (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})({\n1:[function(require,module,exports){\n'use strict';\n\nvar init = function(that, code, message, pos, type){\n    if(!code) {\n        throw new Error(type + ' code is missing.');\n    }\n    \n    if(!message) {\n        throw new Error(type + ' message is missing.');\n    }\n    \n    if(!pos) {\n        throw new Error(type + ' position is missing.');\n    }\n\n    that.getCode = function(){\n        return code;\n    };\n    \n    that.getMessage = function(){\n        return message;\n    };\n\n    that.getPos = function(){\n        return pos;\n    };\n};\n\nvar StaticError = {};\nvar StaticWarning = {};\nStaticError.prototype = new Error();\nStaticWarning.prototype = new Error();\n\nexports.StaticError = StaticError.prototype.constructor = function(code, message, pos) {\n    init(this, code, message, pos, 'Error');\n};\n\nexports.StaticWarning = StaticWarning.prototype.constructor = function(code, message, pos) {\n    init(this, code, message, pos, 'Warning');\n};\n},\n{}],\n2:[function(require,module,exports){\n'use strict';\n\nvar TreeOps = require('../tree_ops').TreeOps;\nvar Errors = require('./errors');\nvar StaticWarning = Errors.StaticWarning;\nexports.ModuleDecl = function(translator, rootSctx, node){\n    var prefix = '';\n    return {\n        NCName: function(ncname){\n            prefix = TreeOps.flatten(ncname);\n        },\n\n        URILiteral: function(uri) {\n            uri = TreeOps.flatten(uri);\n            uri = uri.substring(1, uri.length - 1);\n            translator.apply(function(){\n                rootSctx.moduleNamespace = uri;\n                rootSctx.addNamespace(uri, prefix, node.pos, 'moduleDecl');\n            });\n        }\n    };\n};\n\nexports.ModuleImport = function(translator, rootSctx, node) {\n    var prefix = '';\n    var moduleURI;\n\n    return {\n        NCName: function(ncname){\n            prefix = TreeOps.flatten(ncname);\n        },\n\n        URILiteral: function(uri) {\n            if(moduleURI !== undefined) {\n                return;\n            }\n            uri = TreeOps.flatten(uri);\n            uri = uri.substring(1, uri.length - 1);\n            moduleURI = uri;\n            translator.apply(function(){\n                rootSctx.importModule(uri, prefix, node.pos);\n            });\n        }\n    };\n};\n\nexports.SchemaImport = function(translator, rootSctx, node) {\n    var prefix = '';\n    var schemaURI;\n    \n    return {\n        SchemaPrefix: function(schemaPrefix) {\n            var SchemaPrefixHandler = function () {\n                this.NCName = function (ncname) {\n                    prefix = TreeOps.flatten(ncname);\n                };\n            };\n            translator.visitChildren(schemaPrefix, new SchemaPrefixHandler());\n        },\n\n        URILiteral: function(uri) {\n            if(schemaURI !== undefined) {\n                return;\n            }\n            uri = TreeOps.flatten(uri);\n            uri = uri.substring(1, uri.length - 1);\n            schemaURI = uri;\n            translator.apply(function(){\n                rootSctx.addNamespace(uri, prefix, node.pos, 'schema');\n            });\n        }\n    };\n};\n\nexports.DefaultNamespaceDecl = function(translator, rootSctx, node) {\n    var fn = false;\n    var ns = '';\n\n    return {\n        TOKEN: function(token){\n            fn = fn ? true : (token.value === 'function');\n        },\n        URILiteral: function(uri){\n            ns = TreeOps.flatten(uri);\n            ns = ns.substring(1, ns.length - 1);\n            if(!fn) {\n                translator.apply(function(){\n                    throw new StaticWarning('W06', 'Avoid default element namespace declarations.', node.pos);\n                });\n                rootSctx.defaultElementNamespace = ns;\n            } else {\n                rootSctx.defaultFunctionNamespace = ns;\n            }\n        }\n    };\n};\n\nexports.NamespaceDecl = function(translator, rootSctx, node) {\n    var prefix = '';\n    return {\n        NCName: function(ncname) {\n            prefix = TreeOps.flatten(ncname);\n        },\n        URILiteral: function(uri) {\n            uri = TreeOps.flatten(uri);\n            uri = uri.substring(1, uri.length - 1);\n            translator.apply(function(){\n                rootSctx.addNamespace(uri, prefix, node.pos, 'declare');\n            });\n        }\n    };\n};\nexports.VarHandler = function(translator, sctx, node){\n    var EQNameHandler = function(eqname){\n        var value = TreeOps.flatten(eqname);\n        translator.apply(function(){\n            var qname = sctx.resolveQName(value, eqname.pos);\n            sctx.addVariable(qname, node.name, eqname.pos);\n        });\n    };\n    return {\n        ExprSingle: function(){ return true; },\n        VarValue: function(){ return true; },\n        VarDefaultValue: function(){ return true; },\n        VarName: EQNameHandler,\n        EQName: EQNameHandler\n    };\n};\n\nexports.VarRefHandler = function(translator, sctx, node){\n    return {\n        VarName: function(eqname){\n            var value = TreeOps.flatten(eqname);\n            translator.apply(function(){\n                var qname = sctx.resolveQName(value, node.pos);\n                if(qname.uri !== '') {\n                    sctx.root.namespaces[qname.uri].used = true;\n                }\n                sctx.addVarRef(qname, eqname.pos);\n            });\n        }\n    };\n};\n},\n{\"../tree_ops\":11,\"./errors\":1}],\n3:[function(require,module,exports){\n'use strict';\nexports.getSchemaBuiltinTypes = function(){\n    var ns = 'http://www.w3.org/2001/XMLSchema';\n    var SchemaBuiltinTypes = {};\n    SchemaBuiltinTypes[ns] = {\n        variables: {},\n        functions: {}\n    };\n    SchemaBuiltinTypes[ns].functions[ns + '#string#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'string', arity: 1, eqname: { uri: ns, name: 'string' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#boolean#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'boolean', arity: 1, eqname: { uri: ns, name: 'boolean' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#decimal#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'decimal', arity: 1, eqname: { uri: ns, name: 'decimal' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#float#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'float', arity: 1, eqname: { uri: ns, name: 'float' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#double#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'double', arity: 1, eqname: { uri: ns, name: 'double' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#duration#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'duration', arity: 1, eqname: { uri: ns, name: 'duration' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#dateTime#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'dateTime', arity: 1, eqname: { uri: ns, name: 'dateTime' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#time#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'time', arity: 1, eqname: { uri: ns, name: 'time' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#date#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'date', arity: 1, eqname: { uri: ns, name: 'date' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#gYearMonth#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'gYearMonth', arity: 1, eqname: { uri: ns, name: 'gYearMonth' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#gYear#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'gYear', arity: 1, eqname: { uri: ns, name: 'gYear' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#gMonthDay#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'gMonthDay', arity: 1, eqname: { uri: ns, name: 'gMonthDay' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#gDay#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'gDay', arity: 1, eqname: { uri: ns, name: 'gDay' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#gMonth#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'gMonth', arity: 1, eqname: { uri: ns, name: 'gMonth' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#hexBinary#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'hexBinary', arity: 1, eqname: { uri: ns, name: 'hexBinary' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#base64Binary#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'base64Binary', arity: 1, eqname: { uri: ns, name: 'base64Binary' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#anyURI#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'anyURI', arity: 1, eqname: { uri: ns, name: 'anyURI' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#QName#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'QName', arity: 1, eqname: { uri: ns, name: 'QName' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#normalizedString#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'normalizedString', arity: 1, eqname: { uri: ns, name: 'normalizedString' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#token#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'token', arity: 1, eqname: { uri: ns, name: 'token' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#language#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'language', arity: 1, eqname: { uri: ns, name: 'language' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#NMTOKEN#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'NMTOKEN', arity: 1, eqname: { uri: ns, name: 'NMTOKEN' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#Name#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'Name', arity: 1, eqname: { uri: ns, name: 'Name' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#NCName#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'NCName', arity: 1, eqname: { uri: ns, name: 'NCName' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#ID#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'ID', arity: 1, eqname: { uri: ns, name: 'ID' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#IDREF#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'IDREF', arity: 1, eqname: { uri: ns, name: 'IDREF' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#ENTITY#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'ENTITY', arity: 1, eqname: { uri: ns, name: 'ENTITY' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#integer#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'integer', arity: 1, eqname: { uri: ns, name: 'integer' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#nonPositiveInteger#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'nonPositiveInteger', arity: 1, eqname: { uri: ns, name: 'nonPositiveInteger' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#negativeInteger#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'negativeInteger', arity: 1, eqname: { uri: ns, name: 'negativeInteger' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#long#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'long', arity: 1, eqname: { uri: ns, name: 'long' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#int#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'int', arity: 1, eqname: { uri: ns, name: 'int' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#short#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'short', arity: 1, eqname: { uri: ns, name: 'short' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#byte#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'byte', arity: 1, eqname: { uri: ns, name: 'byte' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#nonNegativeInteger#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'nonNegativeInteger', arity: 1, eqname: { uri: ns, name: 'nonNegativeInteger' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#unsignedLong#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'unsignedLong', arity: 1, eqname: { uri: ns, name: 'unsignedLong' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#unsignedInt#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'unsignedInt', arity: 1, eqname: { uri: ns, name: 'unsignedInt' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#unsignedShort#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'unsignedShort', arity: 1, eqname: { uri: ns, name: 'unsignedShort' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#unsignedByte#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'unsignedByte', arity: 1, eqname: { uri: ns, name: 'unsignedByte' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#positiveInteger#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'positiveInteger', arity: 1, eqname: { uri: ns, name: 'positiveInteger' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#yearMonthDuration#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'yearMonthDuration', arity: 1, eqname: { uri: ns, name: 'yearMonthDuration' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#dayTimeDuration#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'dayTimeDuration', arity: 1, eqname: { uri: ns, name: 'dayTimeDuration' } };\n    SchemaBuiltinTypes[ns].functions[ns + '#untypedAtomic#1'] = { params: ['$arg as xs:anyAtomicType?'], annotations: [], name: 'untypedAtomic', arity: 1, eqname: { uri: ns, name: 'untypedAtomic' } };\n    return SchemaBuiltinTypes;\n};\n},\n{}],\n4:[function(require,module,exports){\nexports.StaticContext = function (parent, pos) {\n    'use strict';\n    \n    var TreeOps = require('../tree_ops').TreeOps;\n    \n    var Errors = require('./errors');\n    var StaticError = Errors.StaticError;\n    var StaticWarning = Errors.StaticWarning;\n    \n    var getSchemaBuiltinTypes = require('./schema_built-in_types').getSchemaBuiltinTypes;\n    \n    var emptyPos = { sl:0, sc: 0, el: 0, ec: 0 };\n    var namespaces = {};\n    \n    var getVarKey = function(qname) {\n        return qname.uri + '#' + qname.name;\n    };\n\n    var getFnKey = function(qname, arity) {\n        return getVarKey(qname) + '#' + arity;\n    };\n\n    if(!parent) {\n        namespaces['http://jsoniq.org/functions'] = {\n            prefix: 'jn',\n            pos: emptyPos,\n            type: 'module',\n            override: true\n        };\n        namespaces['http://www.28msec.com/modules/collections'] = {\n            prefix: 'db',\n            pos: emptyPos,\n            type: 'module',\n            override: true\n        };\n        namespaces['http://www.28msec.com/modules/store'] = {\n            prefix: 'store',\n            pos: emptyPos,\n            type: 'module',\n            override: true\n        };\n        namespaces['http://jsoniq.org/function-library'] = {\n            prefix: 'libjn',\n            pos: emptyPos,\n            type: 'module',\n            override: true\n        };\n        namespaces['http://www.w3.org/2005/xpath-functions'] = {\n            prefix: 'fn',\n            pos: emptyPos,\n            type: 'module',\n            override: true\n        };\n        namespaces['http://www.w3.org/2005/xquery-local-functions'] = {\n            prefix: 'local',\n            pos: emptyPos,\n            type: 'declare',\n            override: true\n        };\n        namespaces['http://www.w3.org/2001/XMLSchema-instance'] = {\n            prefix: 'xsi',\n            pos: emptyPos,\n            type: 'declare'\n        };\n        namespaces['http://www.w3.org/2001/XMLSchema'] = {\n            prefix: 'xs',\n            pos: emptyPos,\n            type: 'declare'\n        };\n        namespaces['http://www.w3.org/XML/1998/namespace'] = {\n            prefix: 'xml',\n            pos: emptyPos,\n            type: 'declare'\n        };\n        namespaces['http://zorba.io/annotations'] = {\n            prefix: 'an',\n            pos: emptyPos,\n            type: 'declare',\n            override: true\n        };\n        namespaces['http://www.28msec.com/annotations/rest'] = {\n            prefix: 'rest',\n            pos: emptyPos,\n            type: 'declare',\n            override: true\n        };\n        namespaces['http://www.w3.org/2005/xqt-errors'] = {\n            prefix: 'err',\n            pos: emptyPos,\n            type: 'declare',\n            override: true\n        };\n        namespaces['http://zorba.io/errors'] = {\n            prefix: 'zerr',\n            pos: emptyPos,\n            type: 'declare',\n            override: true\n        };\n    }\n\n    var s = {\n        parent: parent,\n        children: [],\n        pos: pos,\n        setModuleResolver: function(resolver){\n            this.root.moduleResolver = resolver;\n            return this;\n        },\n        setModules: function(index){\n            if(this !== this.root){\n                throw new Error('setModules() not invoked from the root static context.');\n            }\n            this.moduleResolver = function(uri){\n                return index[uri];\n            };\n            var that = this;\n            Object.keys(this.namespaces).forEach(function(uri){\n                var ns = that.namespaces[uri];\n                if(ns.type === 'module') {\n                    var mod = that.moduleResolver(uri);\n                    if(mod.variables) {\n                        TreeOps.concat(that.variables, mod.variables);\n                    }\n                    if(mod.functions) {\n                        TreeOps.concat(that.functions, mod.functions);\n                    }\n                }\n            });\n            return this;\n        },\n        setModulesFromXQDoc: function(xqdoc){\n            if(this !== this.root){\n                throw new Error('setModulesFromXQDoc() not invoked from the root static context.');\n            }\n            var index = {};\n            Object.keys(xqdoc).forEach(function(uri) {\n                var mod = xqdoc[uri];\n                var variables = {};\n                var functions = {};\n                mod.functions.forEach(function(fn){\n                    functions[uri + '#' + fn.name + '#' + fn.arity] = {\n                        params: [],\n                        annotations: [],\n                        name: fn.name,\n                        arity: fn.arity,\n                        eqname: { uri: uri, name: fn.name }\n                    };\n                    fn.parameters.forEach(function(param){\n                        functions[uri + '#' + fn.name + '#' + fn.arity].params.push('$' + param.name);\n                    });\n                });\n                mod.variables.forEach(function(variable){\n                    var name = variable.name.substring(variable.name.indexOf(':') + 1);\n                    variables[uri + '#' + name] = { type: 'VarDecl', annotations: [], eqname: { uri: uri, name: name } };\n                });\n                index[uri] = {\n                    variables: variables,\n                    functions: functions\n                };\n            });\n            this.root.moduleResolver = function(uri){\n                return index[uri];\n            };\n            var that = this;\n            Object.keys(this.namespaces).forEach(function(uri){\n                var ns = that.namespaces[uri];\n                if(ns.type === 'module') {\n                    var mod = that.moduleResolver(uri);\n                    if(mod.variables) {\n                        TreeOps.concat(that.variables, mod.variables);\n                    }\n                    if(mod.functions) {\n                        TreeOps.concat(that.functions, mod.functions);\n                    }\n                }\n            });\n            return this;\n        },\n        moduleNamespace: '',\n        defaultFunctionNamespace: 'http://www.w3.org/2005/xpath-functions',\n        defaultFunctionNamespaces: [\n            'http://www.28msec.com/modules/collections',\n            'http://www.28msec.com/modules/store',\n            'http://jsoniq.org/functions',\n            'http://jsoniq.org/function-library',\n            'http://www.w3.org/2001/XMLSchema' //Built-in type constructors\n        ],\n        defaultElementNamespace: '',\n        namespaces: namespaces,\n        availableModuleNamespaces: [],\n        importModule: function(uri, prefix, pos) {\n            if(this !== this.root){\n                throw new Error('Function not invoked from the root static context.');\n            }\n            this.addNamespace(uri, prefix, pos, 'module');\n            if(this.moduleResolver) {\n                try {\n                    var mod = this.moduleResolver(uri, []);\n                    if(mod.variables) {\n                        TreeOps.concat(this.variables, mod.variables);\n                    }\n                    if(mod.functions) {\n                        TreeOps.concat(this.functions, mod.functions);\n                    }\n                } catch(e) {\n                    throw new StaticError('XQST0059', 'module \"' + uri + '\" not found', pos);\n                }\n            }\n            return this;\n        },\n        getAvailableModuleNamespaces: function(){\n            return this.root.availableModuleNamespaces;\n        },\n        getPrefixByNamespace: function(uri){\n            return this.root.namespaces[uri].prefix;\n        },\n        addNamespace: function (uri, prefix, pos, type) {\n            if(prefix === '' && type === 'module') {\n                throw new StaticWarning('W01', 'Avoid this type of import. Use import module namespace instead', pos);\n            }\n            if (uri === '') {\n                throw new StaticError('XQST0088', 'empty target namespace in module import or module declaration', pos);\n            }\n            var namespace = this.getNamespace(uri);\n            if (namespace && namespace.type === type && type !== 'declare' && !namespace.override) {\n                throw new StaticError('XQST0047', '\"' + uri + '\": duplicate target namespace', pos);\n            }\n            namespace = this.getNamespaceByPrefix(prefix);\n            if (namespace && !namespace.override) {\n                throw new StaticError('XQST0033', '\"' + prefix + '\": namespace prefix already bound to \"' + namespace.uri + '\"', pos);\n            }\n\n            namespace = this.namespaces[uri];\n            this.namespaces[uri] = {\n                prefix: prefix,\n                pos: pos,\n                type: type\n            };\n\n            if (namespace) {\n                throw new StaticWarning('W02', '\"' + uri + '\" already bound to the \"' + namespace.prefix + '\" prefix', pos);\n            }\n\n        },\n\n        getNamespaces: function(){\n            return this.root.namespaces;\n        },\n        \n        getNamespace: function (uri) {\n            var that = this;\n            while (that) {\n                var namespace = that.namespaces[uri];\n                if (namespace) {\n                    return namespace;\n                }\n                that = that.parent;\n            }\n\n        },\n\n        getNamespaceByPrefix: function (prefix) {\n            var handler = function (uri) {\n                var namespace = that.namespaces[uri];\n                if (namespace.prefix === prefix) {\n                    namespace.uri = uri;\n                    throw namespace;\n                }\n            };\n            var that = this;\n            while (that) {\n                try {\n                    Object.keys(that.namespaces).forEach(handler);\n                } catch (e) {\n                    return e;\n                }\n                that = that.parent;\n            }\n\n        },\n        \n        resolveQName: function(value, pos){\n            var qname = {\n                uri: '',\n                prefix: '',\n                name: ''\n            };\n            var idx;\n            if (value.substring(0, 2) === 'Q{') {\n                idx = value.indexOf('}');\n                qname.uri = value.substring(2, idx);\n                qname.name = value.substring(idx + 1);\n            } else {\n                idx = value.indexOf(':');\n                qname.prefix = value.substring(0, idx);\n                var namespace = this.getNamespaceByPrefix(qname.prefix);\n                if(!namespace && qname.prefix !== '' && ['fn', 'jn'].indexOf(qname.prefix) === -1) {\n                    throw new StaticError('XPST0081', '\"' + qname.prefix + '\": can not expand prefix of lexical QName to namespace URI', pos);\n                }\n                if(namespace) {\n                    qname.uri = namespace.uri;\n                }\n                qname.name = value.substring(idx + 1);\n            }\n            return qname;\n        },\n        \n        variables: {},\n        varRefs: {},\n        functionCalls: {},\n    \n        addVariable: function(qname, type, pos){\n            if(\n                type === 'VarDecl' && this.moduleNamespace !== '' &&\n                !(this.moduleNamespace === qname.uri || (qname.uri === '' && this.defaultFunctionNamespace === this.moduleNamespace))\n            ) {\n                throw new StaticError('XQST0048', '\"' + qname.prefix + ':' + qname.name + '\": Qname not library namespace', pos);\n            }\n            var key = getVarKey(qname);\n            if(type === 'VarDecl' && this.variables[key]) {\n                throw new StaticError('XQST0049', '\"' + qname.name + '\": duplicate variable declaration', pos);\n            }\n            this.variables[key] = {\n                type: type,\n                pos: pos,\n                qname: qname,\n                annotations: {}\n            };\n            return this;\n        },\n        \n        getVariables: function(){\n            var variables = {};\n            var that = this;\n            var handler = function(key){\n                if(!variables[key]){\n                    variables[key] = that.variables[key];\n                }\n            };\n            while(that){\n                Object.keys(that.variables).forEach(handler);\n                that = that.parent;\n            }\n            return variables;\n        },\n        \n        getVariable: function(qname) {\n            var key = getVarKey(qname);\n            var that = this;\n            while(that) {\n                if(that.variables[key]) {\n                    return that.variables[key];\n                }\n                that = that.parent;\n            }\n        },\n        \n        addVarRef: function(qname, pos){\n            var varDecl = this.getVariable(qname);\n            if(!varDecl && (qname.uri === '' || this.root.moduleResolver)) {\n                throw new StaticError('XPST0008', '\"' + qname.name + '\": undeclared variable', pos);\n            }\n            var key = getVarKey(qname);\n            this.varRefs[key] = true;\n        },\n        \n        addFunctionCall: function(qname, arity, pos){\n            var fn = this.getFunction(qname, arity);\n            if(!fn && (qname.uri === 'http://www.w3.org/2005/xquery-local-functions' || this.root.moduleResolver)){\n                if((qname.uri === 'http://www.w3.org/2005/xpath-functions' ||\n                    (qname.uri === '' && this.root.defaultFunctionNamespaces.concat(this.root.defaultFunctionNamespace).indexOf('http://www.w3.org/2005/xpath-functions') !== -1)) && qname.name === 'concat') {\n                } else if(!fn){\n                    throw new StaticError('XPST0008', '\"' + qname.name + '#' + arity + '\": undeclared function', pos);\n                }\n            }\n            var key = getFnKey(qname, arity);\n            this.functionCalls[key] = true;\n        },\n        \n        functions: getSchemaBuiltinTypes()['http://www.w3.org/2001/XMLSchema'].functions,\n\n        getFunctions: function(){\n            return this.root.functions;\n        },\n        \n        getFunction: function(qname, arity){\n            var key = getFnKey(qname, arity);\n            var fn;\n            if(qname.uri === '') {\n                var that = this;\n                this.root.defaultFunctionNamespaces.concat([this.root.defaultFunctionNamespace]).forEach(function(defaultFunctionNamespace){\n                    if(!fn){\n                        fn = that.getFunction({ uri: defaultFunctionNamespace, prefix: qname.prefix, name: qname.name }, arity);\n                    } else {\n                        return false;\n                    }\n                });\n                return fn;\n            } else {\n                return this.root.functions[key];\n            }\n        },\n        \n        addFunction: function(qname, pos, params) {\n            if(this !== this.root){\n                throw new Error('addFunction() not invoked from the root static context.');\n            }\n            var arity = params.length;\n            if(\n                this.moduleNamespace !== '' &&\n                !(this.moduleNamespace === qname.uri || (qname.uri === '' && this.defaultFunctionNamespace === this.moduleNamespace))\n            ) {\n                throw new StaticError('XQST0048', '\"' + qname.prefix + ':' + qname.name + '\": Qname not library namespace', pos);\n            }\n            var key = getFnKey(qname, arity);\n            if(this.functions[key]) {\n                throw new StaticError('XQST0034', '\"' + qname.name + '\": duplicate function declaration', pos);\n            }\n            this.functions[key] = {\n                pos: pos,\n                params: params\n            };\n            return this;\n        }\n        \n    };\n    s.root = parent ? parent.root : s;\n    return s;\n};\n\n},\n{\"../tree_ops\":11,\"./errors\":1,\"./schema_built-in_types\":3}],\n5:[function(require,module,exports){\nexports.Translator = function(rootStcx, ast){\n    'use strict';\n\n    var Errors = require('./errors');\n    var StaticError = Errors.StaticError;\n    var StaticWarning = Errors.StaticWarning;\n    \n    var TreeOps = require('../tree_ops').TreeOps;\n    var StaticContext = require('./static_context').StaticContext;\n    var Handlers = require('./handlers');\n    \n    var get = function(node, path){\n        var result = [];\n        if(path.length === 0){\n            return node;\n        }\n        node.children.forEach(function(child){\n            if(child.name === path[0] && path.length > 1) {\n                result = get(child, path.slice(1));\n            } else if(child.name === path[0]) {\n                result.push(child);\n            }\n        });\n        return result;\n    };\n    \n    var markers = [];\n    this.apply = function(fn) {\n        try {\n            fn();\n        } catch(e) {\n            if(e instanceof StaticError) {\n                addStaticError(e);\n            } else if(e instanceof StaticWarning) {\n                addWarning(e.getCode(), e.getMessage(), e.getPos());\n            } else {\n                throw e;\n            }\n        }\n    };\n\n    var addStaticError = function(e){\n        markers.push({\n            pos: e.getPos(),\n            type: 'error',\n            level: 'error',\n            message: '[' + e.getCode() + '] ' + e.getMessage()\n        });\n    };\n    \n    var addWarning = function(code, message, pos) {\n        markers.push({\n            pos: pos,\n            type: 'warning',\n            level: 'warning',\n            message: '[' + code + '] ' + message\n        });\n    };\n    \n    this.getMarkers = function(){\n        return markers;\n    };\n\n    var translator = this;\n\n    rootStcx.pos = ast.pos;\n    var sctx = rootStcx;\n    var pushSctx = function(pos){\n        sctx = new StaticContext(sctx, pos);\n        sctx.parent.children.push(sctx);\n    };\n    \n    var popSctx = function(pos){\n        if (pos !== undefined) {\n            sctx.pos.el = pos.el;\n            sctx.pos.ec = pos.ec;\n        }\n\n        Object.keys(sctx.varRefs).forEach(function(key){\n            if(!sctx.variables[key]) {\n                sctx.parent.varRefs[key] = true;\n            }\n        });\n        Object.keys(sctx.variables).forEach(function(key){\n            if(!sctx.varRefs[key] && sctx.variables[key].type !== 'GroupingVariable' && sctx.variables[key].type !== 'CatchVar') {\n                addWarning('W03', 'Unused variable \"$' + sctx.variables[key].qname.name + '\"', sctx.variables[key].pos);\n            }\n        });\n        \n        sctx = sctx.parent;\n    };\n    \n    this.visitOnly = function(node, names) {\n        node.children.forEach(function(child){\n            if (names.indexOf(child.name) !== -1){\n                translator.visit(child);\n            }\n        });\n    };\n    \n    this.getFirstChild = function(node, name) {\n        var result;\n        node.children.forEach(function(child){\n            if(child.name === name && result === undefined){\n                result = child;\n            }\n        });\n        return result;\n    };\n    \n    this.ModuleDecl = function(node){\n        this.visitChildren(node, Handlers.ModuleDecl(translator, rootStcx, node));\n        return true;\n    };\n    \n    this.Prolog = function(node){\n        this.visitOnly(node, ['DefaultNamespaceDecl', 'Setter', 'NamespaceDecl', 'Import']);\n        ast.index.forEach(function(node){\n            if(node.name === 'VarDecl') {\n                node.children.forEach(function(child){\n                    if(child.name === 'VarName') {\n                        translator.apply(function(){\n                            var value = TreeOps.flatten(child);\n                            var qname = rootStcx.resolveQName(value, child.pos);\n                            rootStcx.addVariable(qname, node.name, child.pos);\n                        });\n                    }\n                });\n            } else if(node.name === 'FunctionDecl') {\n                var qname, pos, params = [];\n                node.children.forEach(function(child){\n                    if(child.name === 'EQName') {\n                        qname = child;\n                        pos = child.pos;\n                    } else if(child.name === 'ParamList'){\n                        child.children.forEach(function(c){\n                            if(c.name === 'Param') {\n                                params.push(TreeOps.flatten(c));\n                            }\n                        });\n                    }\n                });\n                translator.apply(function(){\n                    qname = TreeOps.flatten(qname);\n                    qname = rootStcx.resolveQName(qname, pos);\n                    rootStcx.addFunction(qname, pos, params);\n                });\n            }\n        });\n        this.visitOnly(node, ['ContextItemDecl', 'AnnotatedDecl', 'OptionDecl']);\n        return true;\n    };\n    \n    this.ModuleImport = function (node) {\n        this.visitChildren(node, Handlers.ModuleImport(translator, rootStcx, node));\n        return true;\n    };\n    \n    this.SchemaImport = function (node) {\n        this.visitChildren(node, Handlers.SchemaImport(translator, rootStcx, node));\n        return true;\n    };\n    \n    this.DefaultNamespaceDecl = function(node){\n        this.visitChildren(node, Handlers.DefaultNamespaceDecl(translator, rootStcx, node));\n        return true;\n    };\n    \n    this.NamespaceDecl = function (node) {\n        this.visitChildren(node, Handlers.NamespaceDecl(translator, rootStcx, node));\n        return true;\n    };\n    \n    var annotations = {};\n    this.AnnotatedDecl = function(node) {\n        annotations = {};\n        this.visitChildren(node, Handlers.NamespaceDecl(translator, rootStcx, node));\n        return true;\n    };\n    \n    this.CompatibilityAnnotation = function(){\n        annotations['http://www.w3.org/2012/xquery#updating'] = [];\n        return true;\n    };\n    \n    this.Annotation = function(node){\n        this.visitChildren(node, {\n            EQName: function(eqname){\n                var value = TreeOps.flatten(eqname);\n                translator.apply(function(){\n                    var qname = sctx.resolveQName(value, eqname.pos);\n                    annotations[qname.uri + '#' + qname.name] = [];\n                });\n            }\n        });\n        return true;\n    };\n    \n    this.VarDecl = function(node){\n        try {\n            var varname = translator.getFirstChild(node, 'VarName');\n            var value = TreeOps.flatten(varname);\n            var qname = sctx.resolveQName(value, varname.pos);\n            var variable = rootStcx.getVariable(qname);\n            if(variable) {\n                variable.annotations = annotations;\n            }\n        } catch(e) {\n        }\n        this.visitOnly(node, ['ExprSingle', 'VarValue', 'VarDefaultValue']);\n        return true;\n    };\n    \n    this.FunctionDecl = function(node) {\n        var isUpdating = annotations['http://www.w3.org/2012/xquery#updating'] !== undefined;\n        var typeDecl = get(node, ['ReturnType'])[0];\n        var name = get(node, ['EQName'])[0];\n        if(!typeDecl && !isUpdating){\n            addWarning('W05', 'Untyped return value', name.pos);\n        }\n        var isExternal = false;\n        node.children.forEach(function(child){\n            if(child.name === 'TOKEN' && child.value === 'external') {\n                isExternal = true;\n                return false;\n            }\n        });\n        if(!isExternal) {\n            pushSctx(node.pos);\n            this.visitChildren(node);\n            popSctx();\n        }\n        return true;\n    };\n    \n    this.VarRef = function(node) {\n        this.visitChildren(node, Handlers.VarRefHandler(translator, sctx, node));\n        return true;\n    };\n    \n    this.Param = function(node){\n        var typeDecl = get(node, ['TypeDeclaration'])[0];\n        if(!typeDecl){\n            addWarning('W05', 'Untyped function parameter', node.pos);\n        }\n        this.visitChildren(node, Handlers.VarHandler(translator, sctx, node));\n        return true;\n    };\n    \n    this.InlineFunctionExpr\t= function(node) {\n        pushSctx(node.pos);\n        this.visitChildren(node);\n        popSctx();\n        return true;\n    };\n    var statementCount = [];\n    var handleStatements = function(node) {\n        pushSctx(node.pos);\n        statementCount.push(0);\n        translator.visitChildren(node);\n        for (var i = 1; i <= statementCount[statementCount.length - 1]; i++) {\n            popSctx(node.pos);\n        }\n        statementCount.pop();\n        popSctx();\n    };\n\n    this.StatementsAndOptionalExpr = function (node) {\n        handleStatements(node);\n        return true;\n    };\n\n    this.StatementsAndExpr = function (node) {\n        handleStatements(node);\n        return true;\n    };\n\n    this.BlockStatement = function (node) {\n        handleStatements(node);\n        return true;\n    };\n    \n    this.VarDeclStatement = function(node){\n        pushSctx(node.pos);\n        statementCount[statementCount.length - 1]++;\n        this.visitChildren(node, Handlers.VarHandler(translator, sctx, node));\n    };\n    var clauses = [];\n    this.FLWORExpr = this.FLWORStatement = function (node) {\n        pushSctx(node.pos);\n        clauses.push(0);\n        this.visitChildren(node);\n        for(var i=1; i <= clauses[clauses.length - 1]; i++) {\n            popSctx(node.pos);\n        }\n        clauses.pop();\n        popSctx();\n        return true;\n    };\n    \n    this.ForBinding = function (node) {\n        this.visitOnly(node, ['ExprSingle', 'VarValue', 'VarDefaultValue']);\n        pushSctx(node.pos);\n        clauses[clauses.length - 1]++;\n        this.visitChildren(node, Handlers.VarHandler(translator, sctx, node));\n        return true;\n    };\n    \n    this.LetBinding = function(node){\n        this.visitOnly(node, ['ExprSingle', 'VarValue', 'VarDefaultValue']);\n        pushSctx(node.pos);\n        clauses[clauses.length - 1]++;\n        this.visitChildren(node, Handlers.VarHandler(translator, sctx, node));\n        return true;\n    };\n\n    this.GroupingSpec = function(node){\n        var isVarDecl = false;\n        node.children.forEach(function(child){\n            if(child.value === ':=') {\n                isVarDecl = true;\n                return false;\n            }\n        });\n        if(isVarDecl) {\n            var groupingVariable = node.children[0];\n            this.visitOnly(node, ['ExprSingle', 'VarValue', 'VarDefaultValue']);\n            pushSctx(node.pos);\n            clauses[clauses.length - 1]++;\n            this.visitChildren(groupingVariable, Handlers.VarHandler(translator, sctx, groupingVariable));\n            return true;\n        } else {\n            \n        }\n    };\n    \n    this.TumblingWindowClause = function (node) {\n        this.visitOnly(node, ['ExprSingle']);\n        pushSctx(node.pos);\n        clauses[clauses.length - 1]++;\n        this.visitChildren(node, Handlers.VarHandler(translator, sctx, node));\n        this.visitOnly(node, ['WindowStartCondition', 'WindowEndCondition']);\n        return true;\n    };\n\n    this.WindowVars = function (node) {\n        pushSctx(node.pos);\n        clauses[clauses.length - 1]++;\n        this.visitChildren(node, Handlers.VarHandler(translator, sctx, node));\n        return true;\n    };\n\n    this.SlidingWindowClause = function (node) {\n        this.visitOnly(node, ['ExprSingle', 'VarValue', 'VarDefaultValue']);\n        pushSctx(node.pos);\n        clauses[clauses.length - 1]++;\n        this.visitChildren(node, Handlers.VarHandler(translator, sctx, node));\n        this.visitOnly(node, ['WindowStartCondition', 'WindowEndCondition']);\n        return true;\n    };\n\n    this.PositionalVar = function (node) {\n        this.visitChildren(node, Handlers.VarHandler(translator, sctx, node));\n        return true;\n    };\n\n    this.PositionalVar = function (node) {\n        this.visitChildren(node, Handlers.VarHandler(translator, sctx, node));\n        return true;\n    };\n\n    this.CurrentItem = function (node) {\n        this.visitChildren(node, Handlers.VarHandler(translator, sctx, node));\n        return true;\n    };\n\n    this.PreviousItem = function (node) {\n        this.visitChildren(node, Handlers.VarHandler(translator, sctx, node));\n        return true;\n    };\n\n    this.NextItem = function (node) {\n        this.visitChildren(node, Handlers.VarHandler(translator, sctx, node));\n        return true;\n    };\n\n    this.CountClause = function (node) {\n        pushSctx(node.pos);\n        clauses[clauses.length - 1]++;\n        this.visitChildren(node, Handlers.VarHandler(translator, sctx, node));\n        return true;\n    };\n    \n    this.CaseClause = function(node) {\n        pushSctx(node.pos);\n        this.visitChildren(node, Handlers.VarHandler(translator, sctx, node));\n        this.visitOnly(node, ['ExprSingle']);\n        popSctx();\n        return true;\n    };\n    \n    this.TransformExpr = function (node) {\n        pushSctx(node.pos);\n        this.visitChildren(node);\n        popSctx();\n        return true;\n    };\n    \n    this.TransformSpec = function(node) {\n        this.visitOnly(node, ['ExprSingle', 'VarValue', 'VarDefaultValue']);\n        this.visitChildren(node, Handlers.VarHandler(translator, sctx, node));\n        return true;\n    };\n    var quantifiedDecls = [];\n    this.QuantifiedExpr = function (node) {\n        pushSctx(node.pos);\n        quantifiedDecls.push(0);\n        this.visitChildren(node);\n        for(var i=1; i <= quantifiedDecls[quantifiedDecls.length - 1]; i++) {\n            popSctx(node.pos);\n        }\n        quantifiedDecls.pop();\n        popSctx();\n        return true;\n    };\n    \n    this.QuantifiedVarDecl = function(node) {\n        this.visitOnly(node, ['ExprSingle']);\n        pushSctx(node.pos);\n        quantifiedDecls[quantifiedDecls.length - 1]++;\n        this.visitChildren(node, Handlers.VarHandler(translator, sctx, node));\n        return true;\n    };\n    \n    this.FunctionCall = function(node){\n        this.visitOnly(node, ['ArgumentList']);\n        var name = translator.getFirstChild(node, 'EQName');\n        var eqname = TreeOps.flatten(name);\n        var arity = get(node, ['ArgumentList', 'Argument']).length;\n        translator.apply(function(){\n            var qname = sctx.resolveQName(eqname, node.pos);\n            try {\n                if(qname.uri !== '') {\n                    sctx.root.namespaces[qname.uri].used = true;\n                }\n            } catch(e){\n            }\n            sctx.addFunctionCall(qname, arity, name.pos);\n        });\n        return true;\n    };\n    \n    this.TryClause = function(node){\n        pushSctx(node.pos);\n        this.visitChildren(node);\n        popSctx();\n        return true;\n    };\n    \n    this.CatchClause = function(node){\n        pushSctx(node.pos);\n        var prefix = 'err';\n        var uri = 'http://www.w3.org/2005/xqt-errors';\n        var emptyPos = { sl: 0, sc: 0, el: 0, ec: 0 };\n        sctx.addVariable({ prefix: prefix, uri: uri, name: 'code' }, 'CatchVar', emptyPos);\n        sctx.addVariable({ prefix: prefix, uri: uri, name: 'description' }, 'CatchVar', emptyPos);\n        sctx.addVariable({ prefix: prefix, uri: uri, name: 'value' }, 'CatchVar', emptyPos);\n        sctx.addVariable({ prefix: prefix, uri: uri, name: 'module' }, 'CatchVar', emptyPos);\n        sctx.addVariable({ prefix: prefix, uri: uri, name: 'line-number' }, 'CatchVar', emptyPos);\n        sctx.addVariable({ prefix: prefix, uri: uri, name: 'column-number' }, 'CatchVar', emptyPos);\n        sctx.addVariable({ prefix: prefix, uri: uri, name: 'additional' }, 'CatchVar', emptyPos);\n        this.visitChildren(node);\n        popSctx();\n        return true;\n    };\n\n    this.Pragma = function(node){\n        var qname = TreeOps.flatten(get(node, ['EQName'])[0]);\n        qname = rootStcx.resolveQName(qname, node);\n        var value = TreeOps.flatten(get(node, ['PragmaContents'])[0]);\n        if (qname.name === 'xqlint' && qname.uri === 'http://xqlint.io') {\n            pushSctx(node.pos);\n            var commands = value.match(/[a-zA-Z]+\\(([^)]+)\\)/g);\n            commands.forEach(function (command) {\n                var name = command.substring(0, command.indexOf('('));\n                var args = command.substring(0, command.length - 1).substring(command.indexOf('(') + 1).split(',').map(function (val) {\n                    return val.trim();\n                });\n                if (name === 'varrefs') {\n                    args.forEach(function (arg) {\n                        var qname = sctx.resolveQName(arg.substring(1), node.pos);\n                        if (qname.uri !== '') {\n                            sctx.root.namespaces[qname.uri].used = true;\n                        }\n                        sctx.addVarRef(qname, node.pos);\n                    });\n                }\n            });\n            this.visitChildren(node);\n            popSctx();\n            return true;\n        }\n    };\n\n    this.visit = function (node) {\n        var name = node.name;\n        var skip = false;\n\n        if (typeof this[name] === 'function') {\n            skip = this[name](node) === true;\n        }\n\n        if (!skip) {\n            this.visitChildren(node);\n        }\n    };\n\n    this.visitChildren = function (node, handler) {\n        for (var i = 0; i < node.children.length; i++) {\n            var child = node.children[i];\n            if (handler !== undefined && typeof handler[child.name] === 'function') {\n                handler[child.name](child);\n            } else {\n                this.visit(child);\n            }\n        }\n    };\n\n    this.visit(ast);\n    Object.keys(rootStcx.variables).forEach(function(key){\n        if(!rootStcx.varRefs[key] && (rootStcx.variables[key].annotations['http://www.w3.org/2005/xpath-functions#private'] || rootStcx.moduleNamespace === '') && rootStcx.variables[key].pos) {\n            addWarning('W03', 'Unused variable \"' + rootStcx.variables[key].qname.name + '\"', rootStcx.variables[key].pos);\n        }\n    });\n    Object.keys(rootStcx.namespaces).forEach(function(uri){\n        var namespace = rootStcx.namespaces[uri];\n        if(namespace.used === undefined && !namespace.override && namespace.type === 'module') {\n            addWarning('W04', 'Unused module \"' + uri + '\"', namespace.pos);\n        }\n    });\n};\n\n},\n{\"../tree_ops\":11,\"./errors\":1,\"./handlers\":2,\"./static_context\":4}],\n6:[function(require,module,exports){\n'use strict';\n\nvar TreeOps = require('../tree_ops').TreeOps;\n\nvar ID_REGEX = /[a-zA-Z_0-9\\$]/;\n\nfunction retrievePrecedingIdentifier(text, pos, regex) {\n    regex = regex || ID_REGEX;\n    var buf = [];\n    for (var i = pos-1; i >= 0; i--) {\n        if (regex.test(text[i])) {\n            buf.push(text[i]);\n        } else {\n            break;\n        }\n    }\n    return buf.reverse().join('');\n}\n\nfunction prefixBinarySearch(items, prefix) {\n    var startIndex = 0;\n    var stopIndex = items.length - 1;\n    var middle = Math.floor((stopIndex + startIndex) / 2);\n    \n    while (stopIndex > startIndex && middle >= 0 && items[middle].indexOf(prefix) !== 0) {\n        if (prefix < items[middle]) {\n            stopIndex = middle - 1;\n        } else if (prefix > items[middle]) {\n            startIndex = middle + 1;\n        }\n        middle = Math.floor((stopIndex + startIndex) / 2);\n    }\n    while (middle > 0 && items[middle-1].indexOf(prefix) === 0) {\n        middle--;\n    }\n    return middle >= 0 ? middle : 0; // ensure we're not returning a negative index\n}\n\nvar uriRegex = /[a-zA-Z_0-9\\/\\.:\\-#]/;\nvar char = '-._A-Za-z0-9:\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02ff\\u0300-\\u037D\\u037F-\\u1FFF\\u200C\\u200D\\u203f\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD';\nvar nameChar = '[' + char + ']';\nvar varChar = '[' + char + '\\\\$]';\nvar nameCharRegExp = new RegExp(nameChar);\nvar varCharRegExp = new RegExp(varChar);\n\nvar varDeclLabels = {\n    'LetBinding': 'Let binding',\n    'Param': 'Function parameter',\n    'QuantifiedExpr': 'Quantified expression binding',\n    'VarDeclStatement': 'Local variable',\n    'ForBinding': 'For binding',\n    'TumblingWindowClause': 'Tumbling window binding',\n    'WindowVars': 'Window variable',\n    'SlidingWindowClause': 'Sliding window binding',\n    'PositionalVar': 'Positional variable',\n    'CurrentItem': 'Current item',\n    'PreviousItem': 'Previous item',\n    'NextItem': 'Next item',\n    'CountClause': 'Count binding',\n    'GroupingVariable': 'Grouping variable',\n    'VarDecl': 'Module variable'\n};\n\nvar findCompletions = function(prefix, allIdentifiers) {\n    allIdentifiers.sort();\n    var startIdx = prefixBinarySearch(allIdentifiers, prefix);\n    var matches = [];\n    for (var i = startIdx; i < allIdentifiers.length && allIdentifiers[i].indexOf(prefix) === 0; i++) {\n        matches.push(allIdentifiers[i]);\n    }\n    return matches;\n};\n\n\nvar completePrefix = function(identifier, pos, sctx){\n    var idx = identifier.indexOf(':');\n    if(idx === -1) {\n        var prefixes = [];\n        var namespaces = sctx.getNamespaces();\n        Object.keys(namespaces).forEach(function(key){\n            if(namespaces[key].type === 'module' || key === 'http://www.w3.org/2005/xquery-local-functions') {\n                prefixes.push(namespaces[key].prefix);\n            }\n        });\n        var matches = findCompletions(identifier, prefixes);\n        var match = function(name) {\n            return {\n                name: name + ':',\n                value: name + ':',\n                meta: 'prefix'\n            };\n        };\n        return matches.map(match);\n    } else {\n        return [];\n    }\n};\n\nvar completeFunction = function(identifier, pos, sctx){\n    var names = [];\n    var snippets = {};\n    var functions = sctx.getFunctions();\n    var uri = '';\n    var prefix = '';\n    var name = identifier;\n    var idx = identifier.indexOf(':');\n    var defaultNamespace = false;\n    if(idx !== -1){\n        prefix = identifier.substring(0, idx);\n        name = identifier.substring(idx + 1);\n        var ns = sctx.getNamespaceByPrefix(prefix);\n        if(ns){\n            uri = sctx.getNamespaceByPrefix(prefix).uri;\n        }\n    } else {\n        defaultNamespace = true;\n        uri = sctx.root.defaultFunctionNamespace;\n    }\n    Object.keys(functions).forEach(function(key){\n        var fn = functions[key];\n        var ns = key.substring(0, key.indexOf('#'));\n        var name = key.substring(key.indexOf('#') + 1);\n        name = name.substring(0, name.indexOf('#'));\n        if(ns !== uri) {\n            return;\n        }\n        if(!defaultNamespace){\n            name = sctx.getNamespaces()[ns].prefix + ':' + name;\n        }\n        name += '(';\n        var snippet = name;\n        snippet += fn.params.map(function(param, index){\n            return '${' + (index + 1) + ':\\\\' + param.split(' ')[0] + '}';\n        }).join(', ');\n        name += fn.params.join(', ');\n        name += ')';\n        snippet += ')';\n        names.push(name);\n        snippets[name] = snippet;\n    });\n    var matches = findCompletions(identifier, names);\n    var match = function(name) {\n        return {\n            name: name,\n            value: name,\n            meta: 'function',\n            priority: 4,\n            identifierRegex: nameCharRegExp,\n            snippet: snippets[name]\n        };\n    };\n    return matches.map(match);\n};\n\nvar completeVariable = function(identifier, pos, sctx){\n    var uri = '';\n    var prefix = '';\n    var idx = identifier.indexOf(':');\n    if(idx !== -1){\n        prefix = identifier.substring(0, idx);\n        uri = sctx.getNamespaceByPrefix(prefix).uri;\n    }\n    var decls = sctx.getVariables();\n    var names = [];\n    var types = {};\n    Object.keys(decls).forEach(function(key){\n        var i = key.indexOf('#');\n        var ns = key.substring(0, i);\n        var name = key.substring(i+1);\n        if(ns !== ''){\n            names.push(sctx.getPrefixByNamespace(ns) + ':' + name);\n            types[sctx.getPrefixByNamespace(ns) + ':' + name] = decls[key].type;\n        } else {\n            names.push(name);\n            types[name] = decls[key].type;\n        }\n    });\n    \n    var matches = findCompletions(identifier, names);\n    var match = function(name) {\n        return {\n            name: '$' + name,\n            value: '$' + name,\n            meta: varDeclLabels[types[name]],\n            priority: 4,\n            identifierRegex: varCharRegExp\n        };\n    };\n    return matches.map(match);\n};\n\nvar completeExpr = function(line, pos, sctx){\n    var identifier = retrievePrecedingIdentifier(line, pos.col, nameCharRegExp);\n    var before = line.substring(0, pos.col - (identifier.length === 0 ? 0 : identifier.length));\n    var isVar = before[before.length - 1] === '$';\n    if(isVar) {\n        return completeVariable(identifier, pos, sctx);\n    } else if(identifier !== '') {\n        return completeFunction(identifier, pos, sctx).concat(completePrefix(identifier, pos, sctx));\n    } else {\n        return completeVariable(identifier, pos, sctx).concat(completeFunction(identifier, pos, sctx)).concat(completePrefix(identifier, pos, sctx));\n    }\n};\n\nvar completeModuleUri = function(line, pos, sctx){\n    var identifier = retrievePrecedingIdentifier(line, pos.col, uriRegex);\n    var matches = findCompletions(identifier, sctx.getAvailableModuleNamespaces());\n    var match = function(uri) {\n        return {\n            name: uri,\n            value: uri,\n            meta: 'module',\n            priority: 4,\n            identifierRegex: uriRegex\n        };\n    };\n    return matches.map(match);\n};\n\nexports.complete = function(source, ast, rootSctx, pos){\n    var line = source.split('\\n')[pos.line];\n    var node = TreeOps.findNode(ast, pos);\n    var sctx = TreeOps.findNode(rootSctx, pos);\n    sctx = sctx ? sctx : rootSctx;\n    if(node && node.name === 'URILiteral' && node.getParent && node.getParent.name === 'ModuleImport'){\n        return completeModuleUri(line, pos, sctx);\n    } else {\n        return completeExpr(line, pos, sctx);\n    }\n};\n\n},\n{\"../tree_ops\":11}],\n7:[function(require,module,exports){\nexports.StyleChecker = function (ast, source) {\n    'use strict';\n\n    var tab = '    ';\n    var markers = [];\n    \n    this.getMarkers = function(){\n        return markers;\n    };\n\n    this.WS = function(node) {\n        var lines = node.value.split('\\n');\n        lines.forEach(function(line, index){\n            var isFirst = index === 0;\n            var isLast  = index === (lines.length - 1);\n\n            if(/\\r$/.test(line)) {\n                markers.push({\n                    pos: {\n                        sl: node.pos.sl + index,\n                        el: node.pos.sl + index,\n                        sc: line.length - 1,\n                        ec: line.length\n                    },\n                    type: 'warning',\n                    level: 'warning',\n                    message: '[SW01] Detected CRLF'\n                });\n            }\n            \n            var match = line.match(/\\t+/);\n            if(match !== null){\n                markers.push({\n                    pos: {\n                        sl: node.pos.sl + index,\n                        el: node.pos.sl + index,\n                        sc: match.index,\n                        ec: match.index + match[0].length\n                    },\n                    type: 'warning',\n                    level: 'warning',\n                    message: '[SW02] Tabs detected'\n                });\n            }\n\n            if((!isFirst) && isLast){\n                match = line.match(/^\\ +/);\n                if(match !== null) {\n                    var mod = match[0].length % tab.length;\n                    if(mod !== 0) {\n                        markers.push({\n                            pos: {\n                                sl: node.pos.sl + index,\n                                el: node.pos.sl + index,\n                                sc: match.index,\n                                ec: match.index + match[0].length\n                            },\n                            type: 'warning',\n                            level: 'warning',\n                            message: '[SW03] Unexcepted indentation of ' + match[0].length\n                        });\n                    }\n                }\n            }\n        });\n        return true;\n    };\n    \n    this.visit = function (node, index) {\n        var name = node.name;\n        var skip = false;\n\n        if (typeof this[name] === 'function') {\n            skip = this[name](node, index) === true;\n        }\n\n        if (!skip) {\n            this.visitChildren(node);\n        }\n    };\n\n    this.visitChildren = function (node, handler) {\n        for (var i = 0; i < node.children.length; i++) {\n            var child = node.children[i];\n            if (handler !== undefined && typeof handler[child.name] === 'function') {\n                handler[child.name](child);\n            } else {\n                this.visit(child);\n            }\n        }\n    };\n\n    source.split('\\n').forEach(function(line, index){\n        var match = line.match(/\\ +$/);\n        if(match){\n            markers.push({\n                pos: {\n                    sl: index,\n                    el: index,\n                    sc: match.index,\n                    ec: match.index + match[0].length\n                },\n                type: 'warning',\n                level: 'warning',\n                message: '[SW04] Trailing whitespace'\n            });\n        }\n    });\n    this.visit(ast);\n};\n},\n{}],\n8:[function(require,module,exports){\nexports.JSONParseTreeHandler = function (code) {\n\t'use strict';\n    var toBeIndex = ['VarDecl', 'FunctionDecl'];\n    var list = [\n        'OrExpr', 'AndExpr', 'ComparisonExpr', 'StringConcatExpr', 'RangeExpr',\n        'UnionExpr', 'IntersectExceptExpr', 'InstanceofExpr', 'TreatExpr', 'CastableExpr', 'CastExpr', 'UnaryExpr', 'ValueExpr',\n        'FTContainsExpr', 'SimpleMapExpr', 'PathExpr', 'RelativePathExpr', 'PostfixExpr', 'StepExpr'\n    ];\n\n    var ast = null;\n    var ptr = null;\n    var remains = code;\n    var cursor = 0;\n    var lineCursor = 0;\n    var line = 0;\n\n    function createNode(name) {\n        return {\n            name: name,\n            children: [],\n            getParent: null,\n            pos: {\n                sl: 0,\n                sc: 0,\n                el: 0,\n                ec: 0\n            }\n        };\n    }\n\n    function pushNode(name) { //begin\n        var node = createNode(name);\n        if (ast === null) {\n            ast = node;\n            ast.index = [];\n            ptr = node;\n        } else {\n            node.getParent = ptr;\n            ptr.children.push(node);\n            ptr = ptr.children[ptr.children.length - 1];\n        }\n    }\n\n    function popNode() {\n\n        if (ptr.children.length > 0) {\n            var s = ptr.children[0];\n            var e = null;\n            for (var i = ptr.children.length - 1; i >= 0; i--) {\n                e = ptr.children[i];\n                if (e.pos.el !== 0 || e.pos.ec !== 0) {\n                    break;\n                }\n            }\n            ptr.pos.sl = s.pos.sl;\n            ptr.pos.sc = s.pos.sc;\n            ptr.pos.el = e.pos.el;\n            ptr.pos.ec = e.pos.ec;\n        }\n        if (ptr.name === 'FunctionName') {\n            ptr.name = 'EQName';\n        }\n        if (ptr.name === 'EQName' && ptr.value === undefined) {\n            ptr.value = ptr.children[0].value;\n            ptr.children.pop();\n        }\n    \n        if(toBeIndex.indexOf(ptr.name) !== -1) {\n            ast.index.push(ptr);\n        }\n    \n        if (ptr.getParent !== null) {\n            ptr = ptr.getParent;\n        } else {\n        }\n        if (ptr.children.length > 0) {\n            var lastChild = ptr.children[ptr.children.length - 1];\n            if (lastChild.children.length === 1 && list.indexOf(lastChild.name) !== -1) {\n                ptr.children[ptr.children.length - 1] = lastChild.children[0];\n            }\n        }\n    }\n\n    this.closeParseTree = function () {\n        while (ptr.getParent !== null) {\n            popNode();\n        }\n        popNode();\n    };\n\n    this.peek = function () {\n        return ptr;\n    };\n\n    this.getParseTree = function () {\n        return ast;\n    };\n\n    this.reset = function () {}; //input\n\n    this.startNonterminal = function (name, begin) {\n        pushNode(name, begin);\n    };\n\n    this.endNonterminal = function () {//name, end\n        popNode();\n    };\n\n    this.terminal = function (name, begin, end) {\n        name = (name.substring(0, 1) === '\\'' && name.substring(name.length - 1) === '\\'') ? 'TOKEN' : name;\n        pushNode(name, begin);\n        setValue(ptr, begin, end);\n        popNode();\n    };\n\n    this.whitespace = function (begin, end) {\n        var name = 'WS';\n        pushNode(name, begin);\n        setValue(ptr, begin, end);\n        popNode();\n    };\n\n    function setValue(node, begin, end) {\n\n        var e = end - cursor;\n        ptr.value = remains.substring(0, e);\n        remains = remains.substring(e);\n        cursor = end;\n\n        var sl = line;\n        var sc = lineCursor;\n        var el = sl + ptr.value.split('\\n').length - 1;\n        var lastIdx = ptr.value.lastIndexOf('\\n');\n        var ec = lastIdx === -1 ? sc + ptr.value.length : ptr.value.substring(lastIdx + 1).length;\n\n        line = el;\n        lineCursor = ec;\n\n        ptr.pos.sl = sl;\n        ptr.pos.sc = sc;\n        ptr.pos.el = el;\n        ptr.pos.ec = ec;\n    }\n};\n},\n{}],\n9:[function(require,module,exports){\n                                                            var JSONiqParser = exports.JSONiqParser = function JSONiqParser(string, parsingEventHandler)\n                                                            {\n                                                              init(string, parsingEventHandler);\n  var self = this;\n\n  this.ParseException = function(b, e, s, o, x)\n  {\n    var\n      begin = b,\n      end = e,\n      state = s,\n      offending = o,\n      expected = x;\n\n    this.getBegin = function() {return begin;};\n    this.getEnd = function() {return end;};\n    this.getState = function() {return state;};\n    this.getExpected = function() {return expected;};\n    this.getOffending = function() {return offending;};\n\n    this.getMessage = function()\n    {\n      return offending < 0 ? \"lexical analysis failed\" : \"syntax error\";\n    };\n  };\n\n  function init(string, parsingEventHandler)\n  {\n    eventHandler = parsingEventHandler;\n    input = string;\n    size = string.length;\n    reset(0, 0, 0);\n  }\n\n  this.getInput = function()\n  {\n    return input;\n  };\n\n  function reset(l, b, e)\n  {\n            b0 = b; e0 = b;\n    l1 = l; b1 = b; e1 = e;\n    l2 = 0;\n    end = e;\n    ex = -1;\n    memo = {};\n    eventHandler.reset(input);\n  }\n\n  this.getOffendingToken = function(e)\n  {\n    var o = e.getOffending();\n    return o >= 0 ? JSONiqParser.TOKEN[o] : null;\n  };\n\n  this.getExpectedTokenSet = function(e)\n  {\n    var expected;\n    if (e.getExpected() < 0)\n    {\n      expected = JSONiqParser.getTokenSet(- e.getState());\n    }\n    else\n    {\n      expected = [JSONiqParser.TOKEN[e.getExpected()]];\n    }\n    return expected;\n  };\n\n  this.getErrorMessage = function(e)\n  {\n    var tokenSet = this.getExpectedTokenSet(e);\n    var found = this.getOffendingToken(e);\n    var prefix = input.substring(0, e.getBegin());\n    var lines = prefix.split(\"\\n\");\n    var line = lines.length;\n    var column = lines[line - 1].length + 1;\n    var size = e.getEnd() - e.getBegin();\n    return e.getMessage()\n         + (found == null ? \"\" : \", found \" + found)\n         + \"\\nwhile expecting \"\n         + (tokenSet.length == 1 ? tokenSet[0] : (\"[\" + tokenSet.join(\", \") + \"]\"))\n         + \"\\n\"\n         + (size == 0 || found != null ? \"\" : \"after successfully scanning \" + size + \" characters beginning \")\n         + \"at line \" + line + \", column \" + column + \":\\n...\"\n         + input.substring(e.getBegin(), Math.min(input.length, e.getBegin() + 64))\n         + \"...\";\n  };\n\n  this.parse_XQuery = function()\n  {\n    eventHandler.startNonterminal(\"XQuery\", e0);\n    lookahead1W(278);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Module();\n    shift(25);                      // EOF\n    eventHandler.endNonterminal(\"XQuery\", e0);\n  };\n\n  function parse_Module()\n  {\n    eventHandler.startNonterminal(\"Module\", e0);\n    switch (l1)\n    {\n    case 170:                       // 'jsoniq'\n      lookahead2W(168);             // S^WS | '#' | '(' | '(:' | 'encoding' | 'version'\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 64682                 // 'jsoniq' 'encoding'\n     || lk == 137898)               // 'jsoniq' 'version'\n    {\n      parse_VersionDecl();\n    }\n    lookahead1W(278);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    switch (l1)\n    {\n    case 185:                       // 'module'\n      lookahead2W(146);             // S^WS | '#' | '(' | '(:' | 'namespace'\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 95929:                     // 'module' 'namespace'\n      whitespace();\n      parse_LibraryModule();\n      break;\n    default:\n      whitespace();\n      parse_MainModule();\n    }\n    eventHandler.endNonterminal(\"Module\", e0);\n  }\n\n  function parse_VersionDecl()\n  {\n    eventHandler.startNonterminal(\"VersionDecl\", e0);\n    shift(170);                     // 'jsoniq'\n    lookahead1W(120);               // S^WS | '(:' | 'encoding' | 'version'\n    switch (l1)\n    {\n    case 126:                       // 'encoding'\n      shift(126);                   // 'encoding'\n      lookahead1W(17);              // StringLiteral | S^WS | '(:'\n      shift(11);                    // StringLiteral\n      break;\n    default:\n      shift(269);                   // 'version'\n      lookahead1W(17);              // StringLiteral | S^WS | '(:'\n      shift(11);                    // StringLiteral\n      lookahead1W(113);             // S^WS | '(:' | ';' | 'encoding'\n      if (l1 == 126)                // 'encoding'\n      {\n        shift(126);                 // 'encoding'\n        lookahead1W(17);            // StringLiteral | S^WS | '(:'\n        shift(11);                  // StringLiteral\n      }\n    }\n    lookahead1W(29);                // S^WS | '(:' | ';'\n    whitespace();\n    parse_Separator();\n    eventHandler.endNonterminal(\"VersionDecl\", e0);\n  }\n\n  function parse_LibraryModule()\n  {\n    eventHandler.startNonterminal(\"LibraryModule\", e0);\n    parse_ModuleDecl();\n    lookahead1W(142);               // S^WS | EOF | '(:' | 'declare' | 'import'\n    whitespace();\n    parse_Prolog();\n    eventHandler.endNonterminal(\"LibraryModule\", e0);\n  }\n\n  function parse_ModuleDecl()\n  {\n    eventHandler.startNonterminal(\"ModuleDecl\", e0);\n    shift(185);                     // 'module'\n    lookahead1W(64);                // S^WS | '(:' | 'namespace'\n    shift(187);                     // 'namespace'\n    lookahead1W(240);               // NCName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_NCName();\n    lookahead1W(30);                // S^WS | '(:' | '='\n    shift(61);                      // '='\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shift(7);                       // URILiteral\n    lookahead1W(29);                // S^WS | '(:' | ';'\n    whitespace();\n    parse_Separator();\n    eventHandler.endNonterminal(\"ModuleDecl\", e0);\n  }\n\n  function parse_Prolog()\n  {\n    eventHandler.startNonterminal(\"Prolog\", e0);\n    for (;;)\n    {\n      lookahead1W(278);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      switch (l1)\n      {\n      case 109:                     // 'declare'\n        lookahead2W(207);           // S^WS | '#' | '%' | '(' | '(:' | 'base-uri' | 'boundary-space' | 'collection' |\n        break;\n      case 155:                     // 'import'\n        lookahead2W(169);           // S^WS | '#' | '(' | '(:' | 'module' | 'schema'\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk != 43117               // 'declare' 'base-uri'\n       && lk != 44141               // 'declare' 'boundary-space'\n       && lk != 50797               // 'declare' 'construction'\n       && lk != 53869               // 'declare' 'copy-namespaces'\n       && lk != 54893               // 'declare' 'decimal-format'\n       && lk != 56429               // 'declare' 'default'\n       && lk != 73325               // 'declare' 'ft-option'\n       && lk != 94875               // 'import' 'module'\n       && lk != 95853               // 'declare' 'namespace'\n       && lk != 106093              // 'declare' 'ordering'\n       && lk != 115821              // 'declare' 'revalidation'\n       && lk != 117403)             // 'import' 'schema'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 109:                     // 'declare'\n        lookahead2W(201);           // S^WS | '(:' | 'base-uri' | 'boundary-space' | 'construction' |\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk == 56429)              // 'declare' 'default'\n      {\n        lk = memoized(0, e0);\n        if (lk == 0)\n        {\n          var b0A = b0; var e0A = e0; var l1A = l1;\n          var b1A = b1; var e1A = e1; var l2A = l2;\n          var b2A = b2; var e2A = e2;\n          try\n          {\n            try_DefaultNamespaceDecl();\n            lk = -1;\n          }\n          catch (p1A)\n          {\n            lk = -2;\n          }\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(0, e0, lk);\n        }\n      }\n      switch (lk)\n      {\n      case -1:\n        whitespace();\n        parse_DefaultNamespaceDecl();\n        break;\n      case 95853:                   // 'declare' 'namespace'\n        whitespace();\n        parse_NamespaceDecl();\n        break;\n      case 155:                     // 'import'\n        whitespace();\n        parse_Import();\n        break;\n      case 73325:                   // 'declare' 'ft-option'\n        whitespace();\n        parse_FTOptionDecl();\n        break;\n      default:\n        whitespace();\n        parse_Setter();\n      }\n      lookahead1W(29);              // S^WS | '(:' | ';'\n      whitespace();\n      parse_Separator();\n    }\n    for (;;)\n    {\n      lookahead1W(278);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      switch (l1)\n      {\n      case 109:                     // 'declare'\n        lookahead2W(202);           // S^WS | '#' | '%' | '(' | '(:' | 'collection' | 'context' | 'function' | 'index' |\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk != 17005               // 'declare' '%'\n       && lk != 49261               // 'declare' 'collection'\n       && lk != 52333               // 'declare' 'context'\n       && lk != 75373               // 'declare' 'function'\n       && lk != 80493               // 'declare' 'index'\n       && lk != 83565               // 'declare' 'integrity'\n       && lk != 104045              // 'declare' 'option'\n       && lk != 134765              // 'declare' 'updating'\n       && lk != 137325)             // 'declare' 'variable'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 109:                     // 'declare'\n        lookahead2W(197);           // S^WS | '%' | '(:' | 'collection' | 'context' | 'function' | 'index' |\n        break;\n      default:\n        lk = l1;\n      }\n      switch (lk)\n      {\n      case 52333:                   // 'declare' 'context'\n        whitespace();\n        parse_ContextItemDecl();\n        break;\n      case 104045:                  // 'declare' 'option'\n        whitespace();\n        parse_OptionDecl();\n        break;\n      default:\n        whitespace();\n        parse_AnnotatedDecl();\n      }\n      lookahead1W(29);              // S^WS | '(:' | ';'\n      whitespace();\n      parse_Separator();\n    }\n    eventHandler.endNonterminal(\"Prolog\", e0);\n  }\n\n  function parse_Separator()\n  {\n    eventHandler.startNonterminal(\"Separator\", e0);\n    shift(54);                      // ';'\n    eventHandler.endNonterminal(\"Separator\", e0);\n  }\n\n  function parse_Setter()\n  {\n    eventHandler.startNonterminal(\"Setter\", e0);\n    switch (l1)\n    {\n    case 109:                       // 'declare'\n      lookahead2W(194);             // S^WS | '(:' | 'base-uri' | 'boundary-space' | 'construction' |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 56429)                // 'declare' 'default'\n    {\n      lk = memoized(1, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_DefaultCollationDecl();\n          lk = -2;\n        }\n        catch (p2A)\n        {\n          try\n          {\n            b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n            b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n            b2 = b2A; e2 = e2A; end = e2A; }}\n            try_EmptyOrderDecl();\n            lk = -6;\n          }\n          catch (p6A)\n          {\n            lk = -9;\n          }\n        }\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(1, e0, lk);\n      }\n    }\n    switch (lk)\n    {\n    case 44141:                     // 'declare' 'boundary-space'\n      parse_BoundarySpaceDecl();\n      break;\n    case -2:\n      parse_DefaultCollationDecl();\n      break;\n    case 43117:                     // 'declare' 'base-uri'\n      parse_BaseURIDecl();\n      break;\n    case 50797:                     // 'declare' 'construction'\n      parse_ConstructionDecl();\n      break;\n    case 106093:                    // 'declare' 'ordering'\n      parse_OrderingModeDecl();\n      break;\n    case -6:\n      parse_EmptyOrderDecl();\n      break;\n    case 115821:                    // 'declare' 'revalidation'\n      parse_RevalidationDecl();\n      break;\n    case 53869:                     // 'declare' 'copy-namespaces'\n      parse_CopyNamespacesDecl();\n      break;\n    default:\n      parse_DecimalFormatDecl();\n    }\n    eventHandler.endNonterminal(\"Setter\", e0);\n  }\n\n  function parse_BoundarySpaceDecl()\n  {\n    eventHandler.startNonterminal(\"BoundarySpaceDecl\", e0);\n    shift(109);                     // 'declare'\n    lookahead1W(36);                // S^WS | '(:' | 'boundary-space'\n    shift(86);                      // 'boundary-space'\n    lookahead1W(137);               // S^WS | '(:' | 'preserve' | 'strip'\n    switch (l1)\n    {\n    case 218:                       // 'preserve'\n      shift(218);                   // 'preserve'\n      break;\n    default:\n      shift(246);                   // 'strip'\n    }\n    eventHandler.endNonterminal(\"BoundarySpaceDecl\", e0);\n  }\n\n  function parse_DefaultCollationDecl()\n  {\n    eventHandler.startNonterminal(\"DefaultCollationDecl\", e0);\n    shift(109);                     // 'declare'\n    lookahead1W(49);                // S^WS | '(:' | 'default'\n    shift(110);                     // 'default'\n    lookahead1W(41);                // S^WS | '(:' | 'collation'\n    shift(95);                      // 'collation'\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shift(7);                       // URILiteral\n    eventHandler.endNonterminal(\"DefaultCollationDecl\", e0);\n  }\n\n  function try_DefaultCollationDecl()\n  {\n    shiftT(109);                    // 'declare'\n    lookahead1W(49);                // S^WS | '(:' | 'default'\n    shiftT(110);                    // 'default'\n    lookahead1W(41);                // S^WS | '(:' | 'collation'\n    shiftT(95);                     // 'collation'\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shiftT(7);                      // URILiteral\n  }\n\n  function parse_BaseURIDecl()\n  {\n    eventHandler.startNonterminal(\"BaseURIDecl\", e0);\n    shift(109);                     // 'declare'\n    lookahead1W(35);                // S^WS | '(:' | 'base-uri'\n    shift(84);                      // 'base-uri'\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shift(7);                       // URILiteral\n    eventHandler.endNonterminal(\"BaseURIDecl\", e0);\n  }\n\n  function parse_ConstructionDecl()\n  {\n    eventHandler.startNonterminal(\"ConstructionDecl\", e0);\n    shift(109);                     // 'declare'\n    lookahead1W(44);                // S^WS | '(:' | 'construction'\n    shift(99);                      // 'construction'\n    lookahead1W(137);               // S^WS | '(:' | 'preserve' | 'strip'\n    switch (l1)\n    {\n    case 246:                       // 'strip'\n      shift(246);                   // 'strip'\n      break;\n    default:\n      shift(218);                   // 'preserve'\n    }\n    eventHandler.endNonterminal(\"ConstructionDecl\", e0);\n  }\n\n  function parse_OrderingModeDecl()\n  {\n    eventHandler.startNonterminal(\"OrderingModeDecl\", e0);\n    shift(109);                     // 'declare'\n    lookahead1W(71);                // S^WS | '(:' | 'ordering'\n    shift(207);                     // 'ordering'\n    lookahead1W(135);               // S^WS | '(:' | 'ordered' | 'unordered'\n    switch (l1)\n    {\n    case 206:                       // 'ordered'\n      shift(206);                   // 'ordered'\n      break;\n    default:\n      shift(262);                   // 'unordered'\n    }\n    eventHandler.endNonterminal(\"OrderingModeDecl\", e0);\n  }\n\n  function parse_EmptyOrderDecl()\n  {\n    eventHandler.startNonterminal(\"EmptyOrderDecl\", e0);\n    shift(109);                     // 'declare'\n    lookahead1W(49);                // S^WS | '(:' | 'default'\n    shift(110);                     // 'default'\n    lookahead1W(70);                // S^WS | '(:' | 'order'\n    shift(205);                     // 'order'\n    lookahead1W(52);                // S^WS | '(:' | 'empty'\n    shift(124);                     // 'empty'\n    lookahead1W(125);               // S^WS | '(:' | 'greatest' | 'least'\n    switch (l1)\n    {\n    case 149:                       // 'greatest'\n      shift(149);                   // 'greatest'\n      break;\n    default:\n      shift(176);                   // 'least'\n    }\n    eventHandler.endNonterminal(\"EmptyOrderDecl\", e0);\n  }\n\n  function try_EmptyOrderDecl()\n  {\n    shiftT(109);                    // 'declare'\n    lookahead1W(49);                // S^WS | '(:' | 'default'\n    shiftT(110);                    // 'default'\n    lookahead1W(70);                // S^WS | '(:' | 'order'\n    shiftT(205);                    // 'order'\n    lookahead1W(52);                // S^WS | '(:' | 'empty'\n    shiftT(124);                    // 'empty'\n    lookahead1W(125);               // S^WS | '(:' | 'greatest' | 'least'\n    switch (l1)\n    {\n    case 149:                       // 'greatest'\n      shiftT(149);                  // 'greatest'\n      break;\n    default:\n      shiftT(176);                  // 'least'\n    }\n  }\n\n  function parse_CopyNamespacesDecl()\n  {\n    eventHandler.startNonterminal(\"CopyNamespacesDecl\", e0);\n    shift(109);                     // 'declare'\n    lookahead1W(47);                // S^WS | '(:' | 'copy-namespaces'\n    shift(105);                     // 'copy-namespaces'\n    lookahead1W(132);               // S^WS | '(:' | 'no-preserve' | 'preserve'\n    whitespace();\n    parse_PreserveMode();\n    lookahead1W(25);                // S^WS | '(:' | ','\n    shift(42);                      // ','\n    lookahead1W(127);               // S^WS | '(:' | 'inherit' | 'no-inherit'\n    whitespace();\n    parse_InheritMode();\n    eventHandler.endNonterminal(\"CopyNamespacesDecl\", e0);\n  }\n\n  function parse_PreserveMode()\n  {\n    eventHandler.startNonterminal(\"PreserveMode\", e0);\n    switch (l1)\n    {\n    case 218:                       // 'preserve'\n      shift(218);                   // 'preserve'\n      break;\n    default:\n      shift(193);                   // 'no-preserve'\n    }\n    eventHandler.endNonterminal(\"PreserveMode\", e0);\n  }\n\n  function parse_InheritMode()\n  {\n    eventHandler.startNonterminal(\"InheritMode\", e0);\n    switch (l1)\n    {\n    case 159:                       // 'inherit'\n      shift(159);                   // 'inherit'\n      break;\n    default:\n      shift(192);                   // 'no-inherit'\n    }\n    eventHandler.endNonterminal(\"InheritMode\", e0);\n  }\n\n  function parse_DecimalFormatDecl()\n  {\n    eventHandler.startNonterminal(\"DecimalFormatDecl\", e0);\n    shift(109);                     // 'declare'\n    lookahead1W(118);               // S^WS | '(:' | 'decimal-format' | 'default'\n    switch (l1)\n    {\n    case 107:                       // 'decimal-format'\n      shift(107);                   // 'decimal-format'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_EQName();\n      break;\n    default:\n      shift(110);                   // 'default'\n      lookahead1W(48);              // S^WS | '(:' | 'decimal-format'\n      shift(107);                   // 'decimal-format'\n    }\n    for (;;)\n    {\n      lookahead1W(204);             // S^WS | '(:' | ';' | 'NaN' | 'decimal-separator' | 'digit' |\n      if (l1 == 54)                 // ';'\n      {\n        break;\n      }\n      whitespace();\n      parse_DFPropertyName();\n      lookahead1W(30);              // S^WS | '(:' | '='\n      shift(61);                    // '='\n      lookahead1W(17);              // StringLiteral | S^WS | '(:'\n      shift(11);                    // StringLiteral\n    }\n    eventHandler.endNonterminal(\"DecimalFormatDecl\", e0);\n  }\n\n  function parse_DFPropertyName()\n  {\n    eventHandler.startNonterminal(\"DFPropertyName\", e0);\n    switch (l1)\n    {\n    case 108:                       // 'decimal-separator'\n      shift(108);                   // 'decimal-separator'\n      break;\n    case 151:                       // 'grouping-separator'\n      shift(151);                   // 'grouping-separator'\n      break;\n    case 158:                       // 'infinity'\n      shift(158);                   // 'infinity'\n      break;\n    case 182:                       // 'minus-sign'\n      shift(182);                   // 'minus-sign'\n      break;\n    case 68:                        // 'NaN'\n      shift(68);                    // 'NaN'\n      break;\n    case 213:                       // 'percent'\n      shift(213);                   // 'percent'\n      break;\n    case 212:                       // 'per-mille'\n      shift(212);                   // 'per-mille'\n      break;\n    case 280:                       // 'zero-digit'\n      shift(280);                   // 'zero-digit'\n      break;\n    case 117:                       // 'digit'\n      shift(117);                   // 'digit'\n      break;\n    default:\n      shift(211);                   // 'pattern-separator'\n    }\n    eventHandler.endNonterminal(\"DFPropertyName\", e0);\n  }\n\n  function parse_Import()\n  {\n    eventHandler.startNonterminal(\"Import\", e0);\n    switch (l1)\n    {\n    case 155:                       // 'import'\n      lookahead2W(130);             // S^WS | '(:' | 'module' | 'schema'\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 117403:                    // 'import' 'schema'\n      parse_SchemaImport();\n      break;\n    default:\n      parse_ModuleImport();\n    }\n    eventHandler.endNonterminal(\"Import\", e0);\n  }\n\n  function parse_SchemaImport()\n  {\n    eventHandler.startNonterminal(\"SchemaImport\", e0);\n    shift(155);                     // 'import'\n    lookahead1W(76);                // S^WS | '(:' | 'schema'\n    shift(229);                     // 'schema'\n    lookahead1W(141);               // URILiteral | S^WS | '(:' | 'default' | 'namespace'\n    if (l1 != 7)                    // URILiteral\n    {\n      whitespace();\n      parse_SchemaPrefix();\n    }\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shift(7);                       // URILiteral\n    lookahead1W(112);               // S^WS | '(:' | ';' | 'at'\n    if (l1 == 82)                   // 'at'\n    {\n      shift(82);                    // 'at'\n      lookahead1W(15);              // URILiteral | S^WS | '(:'\n      shift(7);                     // URILiteral\n      for (;;)\n      {\n        lookahead1W(107);           // S^WS | '(:' | ',' | ';'\n        if (l1 != 42)               // ','\n        {\n          break;\n        }\n        shift(42);                  // ','\n        lookahead1W(15);            // URILiteral | S^WS | '(:'\n        shift(7);                   // URILiteral\n      }\n    }\n    eventHandler.endNonterminal(\"SchemaImport\", e0);\n  }\n\n  function parse_SchemaPrefix()\n  {\n    eventHandler.startNonterminal(\"SchemaPrefix\", e0);\n    switch (l1)\n    {\n    case 187:                       // 'namespace'\n      shift(187);                   // 'namespace'\n      lookahead1W(240);             // NCName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_NCName();\n      lookahead1W(30);              // S^WS | '(:' | '='\n      shift(61);                    // '='\n      break;\n    default:\n      shift(110);                   // 'default'\n      lookahead1W(50);              // S^WS | '(:' | 'element'\n      shift(122);                   // 'element'\n      lookahead1W(64);              // S^WS | '(:' | 'namespace'\n      shift(187);                   // 'namespace'\n    }\n    eventHandler.endNonterminal(\"SchemaPrefix\", e0);\n  }\n\n  function parse_ModuleImport()\n  {\n    eventHandler.startNonterminal(\"ModuleImport\", e0);\n    shift(155);                     // 'import'\n    lookahead1W(63);                // S^WS | '(:' | 'module'\n    shift(185);                     // 'module'\n    lookahead1W(93);                // URILiteral | S^WS | '(:' | 'namespace'\n    if (l1 == 187)                  // 'namespace'\n    {\n      shift(187);                   // 'namespace'\n      lookahead1W(240);             // NCName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_NCName();\n      lookahead1W(30);              // S^WS | '(:' | '='\n      shift(61);                    // '='\n    }\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shift(7);                       // URILiteral\n    lookahead1W(112);               // S^WS | '(:' | ';' | 'at'\n    if (l1 == 82)                   // 'at'\n    {\n      shift(82);                    // 'at'\n      lookahead1W(15);              // URILiteral | S^WS | '(:'\n      shift(7);                     // URILiteral\n      for (;;)\n      {\n        lookahead1W(107);           // S^WS | '(:' | ',' | ';'\n        if (l1 != 42)               // ','\n        {\n          break;\n        }\n        shift(42);                  // ','\n        lookahead1W(15);            // URILiteral | S^WS | '(:'\n        shift(7);                   // URILiteral\n      }\n    }\n    eventHandler.endNonterminal(\"ModuleImport\", e0);\n  }\n\n  function parse_NamespaceDecl()\n  {\n    eventHandler.startNonterminal(\"NamespaceDecl\", e0);\n    shift(109);                     // 'declare'\n    lookahead1W(64);                // S^WS | '(:' | 'namespace'\n    shift(187);                     // 'namespace'\n    lookahead1W(240);               // NCName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_NCName();\n    lookahead1W(30);                // S^WS | '(:' | '='\n    shift(61);                      // '='\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shift(7);                       // URILiteral\n    eventHandler.endNonterminal(\"NamespaceDecl\", e0);\n  }\n\n  function parse_DefaultNamespaceDecl()\n  {\n    eventHandler.startNonterminal(\"DefaultNamespaceDecl\", e0);\n    shift(109);                     // 'declare'\n    lookahead1W(49);                // S^WS | '(:' | 'default'\n    shift(110);                     // 'default'\n    lookahead1W(119);               // S^WS | '(:' | 'element' | 'function'\n    switch (l1)\n    {\n    case 122:                       // 'element'\n      shift(122);                   // 'element'\n      break;\n    default:\n      shift(147);                   // 'function'\n    }\n    lookahead1W(64);                // S^WS | '(:' | 'namespace'\n    shift(187);                     // 'namespace'\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shift(7);                       // URILiteral\n    eventHandler.endNonterminal(\"DefaultNamespaceDecl\", e0);\n  }\n\n  function try_DefaultNamespaceDecl()\n  {\n    shiftT(109);                    // 'declare'\n    lookahead1W(49);                // S^WS | '(:' | 'default'\n    shiftT(110);                    // 'default'\n    lookahead1W(119);               // S^WS | '(:' | 'element' | 'function'\n    switch (l1)\n    {\n    case 122:                       // 'element'\n      shiftT(122);                  // 'element'\n      break;\n    default:\n      shiftT(147);                  // 'function'\n    }\n    lookahead1W(64);                // S^WS | '(:' | 'namespace'\n    shiftT(187);                    // 'namespace'\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shiftT(7);                      // URILiteral\n  }\n\n  function parse_FTOptionDecl()\n  {\n    eventHandler.startNonterminal(\"FTOptionDecl\", e0);\n    shift(109);                     // 'declare'\n    lookahead1W(55);                // S^WS | '(:' | 'ft-option'\n    shift(143);                     // 'ft-option'\n    lookahead1W(84);                // S^WS | '(:' | 'using'\n    whitespace();\n    parse_FTMatchOptions();\n    eventHandler.endNonterminal(\"FTOptionDecl\", e0);\n  }\n\n  function parse_AnnotatedDecl()\n  {\n    eventHandler.startNonterminal(\"AnnotatedDecl\", e0);\n    shift(109);                     // 'declare'\n    for (;;)\n    {\n      lookahead1W(192);             // S^WS | '%' | '(:' | 'collection' | 'function' | 'index' | 'integrity' |\n      if (l1 != 33                  // '%'\n       && l1 != 263)                // 'updating'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 263:                     // 'updating'\n        whitespace();\n        parse_CompatibilityAnnotation();\n        break;\n      default:\n        whitespace();\n        parse_Annotation();\n      }\n    }\n    switch (l1)\n    {\n    case 268:                       // 'variable'\n      whitespace();\n      parse_VarDecl();\n      break;\n    case 147:                       // 'function'\n      whitespace();\n      parse_FunctionDecl();\n      break;\n    case 96:                        // 'collection'\n      whitespace();\n      parse_CollectionDecl();\n      break;\n    case 157:                       // 'index'\n      whitespace();\n      parse_IndexDecl();\n      break;\n    default:\n      whitespace();\n      parse_ICDecl();\n    }\n    eventHandler.endNonterminal(\"AnnotatedDecl\", e0);\n  }\n\n  function parse_CompatibilityAnnotation()\n  {\n    eventHandler.startNonterminal(\"CompatibilityAnnotation\", e0);\n    shift(263);                     // 'updating'\n    eventHandler.endNonterminal(\"CompatibilityAnnotation\", e0);\n  }\n\n  function parse_Annotation()\n  {\n    eventHandler.startNonterminal(\"Annotation\", e0);\n    shift(33);                      // '%'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_EQName();\n    lookahead1W(193);               // S^WS | '%' | '(' | '(:' | 'collection' | 'function' | 'index' | 'integrity' |\n    if (l1 == 35)                   // '('\n    {\n      shift(35);                    // '('\n      lookahead1W(190);             // IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral | S^WS | '(:' |\n      whitespace();\n      parse_Literal();\n      for (;;)\n      {\n        lookahead1W(105);           // S^WS | '(:' | ')' | ','\n        if (l1 != 42)               // ','\n        {\n          break;\n        }\n        shift(42);                  // ','\n        lookahead1W(190);           // IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral | S^WS | '(:' |\n        whitespace();\n        parse_Literal();\n      }\n      shift(38);                    // ')'\n    }\n    eventHandler.endNonterminal(\"Annotation\", e0);\n  }\n\n  function try_Annotation()\n  {\n    shiftT(33);                     // '%'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_EQName();\n    lookahead1W(193);               // S^WS | '%' | '(' | '(:' | 'collection' | 'function' | 'index' | 'integrity' |\n    if (l1 == 35)                   // '('\n    {\n      shiftT(35);                   // '('\n      lookahead1W(190);             // IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral | S^WS | '(:' |\n      try_Literal();\n      for (;;)\n      {\n        lookahead1W(105);           // S^WS | '(:' | ')' | ','\n        if (l1 != 42)               // ','\n        {\n          break;\n        }\n        shiftT(42);                 // ','\n        lookahead1W(190);           // IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral | S^WS | '(:' |\n        try_Literal();\n      }\n      shiftT(38);                   // ')'\n    }\n  }\n\n  function parse_VarDecl()\n  {\n    eventHandler.startNonterminal(\"VarDecl\", e0);\n    shift(268);                     // 'variable'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shift(31);                      // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    lookahead1W(157);               // S^WS | '(:' | ':=' | 'as' | 'external'\n    if (l1 == 80)                   // 'as'\n    {\n      whitespace();\n      parse_TypeDeclaration();\n    }\n    lookahead1W(110);               // S^WS | '(:' | ':=' | 'external'\n    switch (l1)\n    {\n    case 53:                        // ':='\n      shift(53);                    // ':='\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_VarValue();\n      break;\n    default:\n      shift(134);                   // 'external'\n      lookahead1W(108);             // S^WS | '(:' | ':=' | ';'\n      if (l1 == 53)                 // ':='\n      {\n        shift(53);                  // ':='\n        lookahead1W(267);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        whitespace();\n        parse_VarDefaultValue();\n      }\n    }\n    eventHandler.endNonterminal(\"VarDecl\", e0);\n  }\n\n  function parse_VarValue()\n  {\n    eventHandler.startNonterminal(\"VarValue\", e0);\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"VarValue\", e0);\n  }\n\n  function parse_VarDefaultValue()\n  {\n    eventHandler.startNonterminal(\"VarDefaultValue\", e0);\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"VarDefaultValue\", e0);\n  }\n\n  function parse_ContextItemDecl()\n  {\n    eventHandler.startNonterminal(\"ContextItemDecl\", e0);\n    shift(109);                     // 'declare'\n    lookahead1W(46);                // S^WS | '(:' | 'context'\n    shift(102);                     // 'context'\n    lookahead1W(58);                // S^WS | '(:' | 'item'\n    shift(167);                     // 'item'\n    lookahead1W(157);               // S^WS | '(:' | ':=' | 'as' | 'external'\n    if (l1 == 80)                   // 'as'\n    {\n      shift(80);                    // 'as'\n      lookahead1W(254);             // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_ItemType();\n    }\n    lookahead1W(110);               // S^WS | '(:' | ':=' | 'external'\n    switch (l1)\n    {\n    case 53:                        // ':='\n      shift(53);                    // ':='\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_VarValue();\n      break;\n    default:\n      shift(134);                   // 'external'\n      lookahead1W(108);             // S^WS | '(:' | ':=' | ';'\n      if (l1 == 53)                 // ':='\n      {\n        shift(53);                  // ':='\n        lookahead1W(267);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        whitespace();\n        parse_VarDefaultValue();\n      }\n    }\n    eventHandler.endNonterminal(\"ContextItemDecl\", e0);\n  }\n\n  function parse_ParamList()\n  {\n    eventHandler.startNonterminal(\"ParamList\", e0);\n    parse_Param();\n    for (;;)\n    {\n      lookahead1W(105);             // S^WS | '(:' | ')' | ','\n      if (l1 != 42)                 // ','\n      {\n        break;\n      }\n      shift(42);                    // ','\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      whitespace();\n      parse_Param();\n    }\n    eventHandler.endNonterminal(\"ParamList\", e0);\n  }\n\n  function try_ParamList()\n  {\n    try_Param();\n    for (;;)\n    {\n      lookahead1W(105);             // S^WS | '(:' | ')' | ','\n      if (l1 != 42)                 // ','\n      {\n        break;\n      }\n      shiftT(42);                   // ','\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      try_Param();\n    }\n  }\n\n  function parse_Param()\n  {\n    eventHandler.startNonterminal(\"Param\", e0);\n    shift(31);                      // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_EQName();\n    lookahead1W(153);               // S^WS | '(:' | ')' | ',' | 'as'\n    if (l1 == 80)                   // 'as'\n    {\n      whitespace();\n      parse_TypeDeclaration();\n    }\n    eventHandler.endNonterminal(\"Param\", e0);\n  }\n\n  function try_Param()\n  {\n    shiftT(31);                     // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_EQName();\n    lookahead1W(153);               // S^WS | '(:' | ')' | ',' | 'as'\n    if (l1 == 80)                   // 'as'\n    {\n      try_TypeDeclaration();\n    }\n  }\n\n  function parse_FunctionBody()\n  {\n    eventHandler.startNonterminal(\"FunctionBody\", e0);\n    parse_EnclosedExpr();\n    eventHandler.endNonterminal(\"FunctionBody\", e0);\n  }\n\n  function try_FunctionBody()\n  {\n    try_EnclosedExpr();\n  }\n\n  function parse_EnclosedExpr()\n  {\n    eventHandler.startNonterminal(\"EnclosedExpr\", e0);\n    shift(281);                     // '{'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Expr();\n    shift(287);                     // '}'\n    eventHandler.endNonterminal(\"EnclosedExpr\", e0);\n  }\n\n  function try_EnclosedExpr()\n  {\n    shiftT(281);                    // '{'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Expr();\n    shiftT(287);                    // '}'\n  }\n\n  function parse_OptionDecl()\n  {\n    eventHandler.startNonterminal(\"OptionDecl\", e0);\n    shift(109);                     // 'declare'\n    lookahead1W(69);                // S^WS | '(:' | 'option'\n    shift(203);                     // 'option'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_EQName();\n    lookahead1W(17);                // StringLiteral | S^WS | '(:'\n    shift(11);                      // StringLiteral\n    eventHandler.endNonterminal(\"OptionDecl\", e0);\n  }\n\n  function parse_Expr()\n  {\n    eventHandler.startNonterminal(\"Expr\", e0);\n    parse_ExprSingle();\n    for (;;)\n    {\n      if (l1 != 42)                 // ','\n      {\n        break;\n      }\n      shift(42);                    // ','\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_ExprSingle();\n    }\n    eventHandler.endNonterminal(\"Expr\", e0);\n  }\n\n  function try_Expr()\n  {\n    try_ExprSingle();\n    for (;;)\n    {\n      if (l1 != 42)                 // ','\n      {\n        break;\n      }\n      shiftT(42);                   // ','\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_ExprSingle();\n    }\n  }\n\n  function parse_FLWORExpr()\n  {\n    eventHandler.startNonterminal(\"FLWORExpr\", e0);\n    parse_InitialClause();\n    for (;;)\n    {\n      lookahead1W(195);             // S^WS | '(:' | 'count' | 'for' | 'group' | 'let' | 'order' | 'return' | 'stable' |\n      if (l1 == 224)                // 'return'\n      {\n        break;\n      }\n      whitespace();\n      parse_IntermediateClause();\n    }\n    whitespace();\n    parse_ReturnClause();\n    eventHandler.endNonterminal(\"FLWORExpr\", e0);\n  }\n\n  function try_FLWORExpr()\n  {\n    try_InitialClause();\n    for (;;)\n    {\n      lookahead1W(195);             // S^WS | '(:' | 'count' | 'for' | 'group' | 'let' | 'order' | 'return' | 'stable' |\n      if (l1 == 224)                // 'return'\n      {\n        break;\n      }\n      try_IntermediateClause();\n    }\n    try_ReturnClause();\n  }\n\n  function parse_InitialClause()\n  {\n    eventHandler.startNonterminal(\"InitialClause\", e0);\n    switch (l1)\n    {\n    case 139:                       // 'for'\n      lookahead2W(151);             // S^WS | '$' | '(:' | 'sliding' | 'tumbling'\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 16011:                     // 'for' '$'\n      parse_ForClause();\n      break;\n    case 177:                       // 'let'\n      parse_LetClause();\n      break;\n    default:\n      parse_WindowClause();\n    }\n    eventHandler.endNonterminal(\"InitialClause\", e0);\n  }\n\n  function try_InitialClause()\n  {\n    switch (l1)\n    {\n    case 139:                       // 'for'\n      lookahead2W(151);             // S^WS | '$' | '(:' | 'sliding' | 'tumbling'\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 16011:                     // 'for' '$'\n      try_ForClause();\n      break;\n    case 177:                       // 'let'\n      try_LetClause();\n      break;\n    default:\n      try_WindowClause();\n    }\n  }\n\n  function parse_IntermediateClause()\n  {\n    eventHandler.startNonterminal(\"IntermediateClause\", e0);\n    switch (l1)\n    {\n    case 139:                       // 'for'\n    case 177:                       // 'let'\n      parse_InitialClause();\n      break;\n    case 272:                       // 'where'\n      parse_WhereClause();\n      break;\n    case 150:                       // 'group'\n      parse_GroupByClause();\n      break;\n    case 106:                       // 'count'\n      parse_CountClause();\n      break;\n    default:\n      parse_OrderByClause();\n    }\n    eventHandler.endNonterminal(\"IntermediateClause\", e0);\n  }\n\n  function try_IntermediateClause()\n  {\n    switch (l1)\n    {\n    case 139:                       // 'for'\n    case 177:                       // 'let'\n      try_InitialClause();\n      break;\n    case 272:                       // 'where'\n      try_WhereClause();\n      break;\n    case 150:                       // 'group'\n      try_GroupByClause();\n      break;\n    case 106:                       // 'count'\n      try_CountClause();\n      break;\n    default:\n      try_OrderByClause();\n    }\n  }\n\n  function parse_ForClause()\n  {\n    eventHandler.startNonterminal(\"ForClause\", e0);\n    shift(139);                     // 'for'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    whitespace();\n    parse_ForBinding();\n    for (;;)\n    {\n      if (l1 != 42)                 // ','\n      {\n        break;\n      }\n      shift(42);                    // ','\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      whitespace();\n      parse_ForBinding();\n    }\n    eventHandler.endNonterminal(\"ForClause\", e0);\n  }\n\n  function try_ForClause()\n  {\n    shiftT(139);                    // 'for'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    try_ForBinding();\n    for (;;)\n    {\n      if (l1 != 42)                 // ','\n      {\n        break;\n      }\n      shiftT(42);                   // ','\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      try_ForBinding();\n    }\n  }\n\n  function parse_ForBinding()\n  {\n    eventHandler.startNonterminal(\"ForBinding\", e0);\n    shift(31);                      // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    lookahead1W(182);               // S^WS | '(:' | 'allowing' | 'as' | 'at' | 'in' | 'score'\n    if (l1 == 80)                   // 'as'\n    {\n      whitespace();\n      parse_TypeDeclaration();\n    }\n    lookahead1W(173);               // S^WS | '(:' | 'allowing' | 'at' | 'in' | 'score'\n    if (l1 == 73)                   // 'allowing'\n    {\n      whitespace();\n      parse_AllowingEmpty();\n    }\n    lookahead1W(160);               // S^WS | '(:' | 'at' | 'in' | 'score'\n    if (l1 == 82)                   // 'at'\n    {\n      whitespace();\n      parse_PositionalVar();\n    }\n    lookahead1W(126);               // S^WS | '(:' | 'in' | 'score'\n    if (l1 == 232)                  // 'score'\n    {\n      whitespace();\n      parse_FTScoreVar();\n    }\n    lookahead1W(56);                // S^WS | '(:' | 'in'\n    shift(156);                     // 'in'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"ForBinding\", e0);\n  }\n\n  function try_ForBinding()\n  {\n    shiftT(31);                     // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n    lookahead1W(182);               // S^WS | '(:' | 'allowing' | 'as' | 'at' | 'in' | 'score'\n    if (l1 == 80)                   // 'as'\n    {\n      try_TypeDeclaration();\n    }\n    lookahead1W(173);               // S^WS | '(:' | 'allowing' | 'at' | 'in' | 'score'\n    if (l1 == 73)                   // 'allowing'\n    {\n      try_AllowingEmpty();\n    }\n    lookahead1W(160);               // S^WS | '(:' | 'at' | 'in' | 'score'\n    if (l1 == 82)                   // 'at'\n    {\n      try_PositionalVar();\n    }\n    lookahead1W(126);               // S^WS | '(:' | 'in' | 'score'\n    if (l1 == 232)                  // 'score'\n    {\n      try_FTScoreVar();\n    }\n    lookahead1W(56);                // S^WS | '(:' | 'in'\n    shiftT(156);                    // 'in'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_AllowingEmpty()\n  {\n    eventHandler.startNonterminal(\"AllowingEmpty\", e0);\n    shift(73);                      // 'allowing'\n    lookahead1W(52);                // S^WS | '(:' | 'empty'\n    shift(124);                     // 'empty'\n    eventHandler.endNonterminal(\"AllowingEmpty\", e0);\n  }\n\n  function try_AllowingEmpty()\n  {\n    shiftT(73);                     // 'allowing'\n    lookahead1W(52);                // S^WS | '(:' | 'empty'\n    shiftT(124);                    // 'empty'\n  }\n\n  function parse_PositionalVar()\n  {\n    eventHandler.startNonterminal(\"PositionalVar\", e0);\n    shift(82);                      // 'at'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shift(31);                      // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    eventHandler.endNonterminal(\"PositionalVar\", e0);\n  }\n\n  function try_PositionalVar()\n  {\n    shiftT(82);                     // 'at'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shiftT(31);                     // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n  }\n\n  function parse_FTScoreVar()\n  {\n    eventHandler.startNonterminal(\"FTScoreVar\", e0);\n    shift(232);                     // 'score'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shift(31);                      // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    eventHandler.endNonterminal(\"FTScoreVar\", e0);\n  }\n\n  function try_FTScoreVar()\n  {\n    shiftT(232);                    // 'score'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shiftT(31);                     // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n  }\n\n  function parse_LetClause()\n  {\n    eventHandler.startNonterminal(\"LetClause\", e0);\n    shift(177);                     // 'let'\n    lookahead1W(100);               // S^WS | '$' | '(:' | 'score'\n    whitespace();\n    parse_LetBinding();\n    for (;;)\n    {\n      if (l1 != 42)                 // ','\n      {\n        break;\n      }\n      shift(42);                    // ','\n      lookahead1W(100);             // S^WS | '$' | '(:' | 'score'\n      whitespace();\n      parse_LetBinding();\n    }\n    eventHandler.endNonterminal(\"LetClause\", e0);\n  }\n\n  function try_LetClause()\n  {\n    shiftT(177);                    // 'let'\n    lookahead1W(100);               // S^WS | '$' | '(:' | 'score'\n    try_LetBinding();\n    for (;;)\n    {\n      if (l1 != 42)                 // ','\n      {\n        break;\n      }\n      shiftT(42);                   // ','\n      lookahead1W(100);             // S^WS | '$' | '(:' | 'score'\n      try_LetBinding();\n    }\n  }\n\n  function parse_LetBinding()\n  {\n    eventHandler.startNonterminal(\"LetBinding\", e0);\n    switch (l1)\n    {\n    case 31:                        // '$'\n      shift(31);                    // '$'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_VarName();\n      lookahead1W(109);             // S^WS | '(:' | ':=' | 'as'\n      if (l1 == 80)                 // 'as'\n      {\n        whitespace();\n        parse_TypeDeclaration();\n      }\n      break;\n    default:\n      parse_FTScoreVar();\n    }\n    lookahead1W(28);                // S^WS | '(:' | ':='\n    shift(53);                      // ':='\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"LetBinding\", e0);\n  }\n\n  function try_LetBinding()\n  {\n    switch (l1)\n    {\n    case 31:                        // '$'\n      shiftT(31);                   // '$'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_VarName();\n      lookahead1W(109);             // S^WS | '(:' | ':=' | 'as'\n      if (l1 == 80)                 // 'as'\n      {\n        try_TypeDeclaration();\n      }\n      break;\n    default:\n      try_FTScoreVar();\n    }\n    lookahead1W(28);                // S^WS | '(:' | ':='\n    shiftT(53);                     // ':='\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_WindowClause()\n  {\n    eventHandler.startNonterminal(\"WindowClause\", e0);\n    shift(139);                     // 'for'\n    lookahead1W(139);               // S^WS | '(:' | 'sliding' | 'tumbling'\n    switch (l1)\n    {\n    case 257:                       // 'tumbling'\n      whitespace();\n      parse_TumblingWindowClause();\n      break;\n    default:\n      whitespace();\n      parse_SlidingWindowClause();\n    }\n    eventHandler.endNonterminal(\"WindowClause\", e0);\n  }\n\n  function try_WindowClause()\n  {\n    shiftT(139);                    // 'for'\n    lookahead1W(139);               // S^WS | '(:' | 'sliding' | 'tumbling'\n    switch (l1)\n    {\n    case 257:                       // 'tumbling'\n      try_TumblingWindowClause();\n      break;\n    default:\n      try_SlidingWindowClause();\n    }\n  }\n\n  function parse_TumblingWindowClause()\n  {\n    eventHandler.startNonterminal(\"TumblingWindowClause\", e0);\n    shift(257);                     // 'tumbling'\n    lookahead1W(88);                // S^WS | '(:' | 'window'\n    shift(275);                     // 'window'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shift(31);                      // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    lookahead1W(114);               // S^WS | '(:' | 'as' | 'in'\n    if (l1 == 80)                   // 'as'\n    {\n      whitespace();\n      parse_TypeDeclaration();\n    }\n    lookahead1W(56);                // S^WS | '(:' | 'in'\n    shift(156);                     // 'in'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    whitespace();\n    parse_WindowStartCondition();\n    if (l1 == 127                   // 'end'\n     || l1 == 202)                  // 'only'\n    {\n      whitespace();\n      parse_WindowEndCondition();\n    }\n    eventHandler.endNonterminal(\"TumblingWindowClause\", e0);\n  }\n\n  function try_TumblingWindowClause()\n  {\n    shiftT(257);                    // 'tumbling'\n    lookahead1W(88);                // S^WS | '(:' | 'window'\n    shiftT(275);                    // 'window'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shiftT(31);                     // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n    lookahead1W(114);               // S^WS | '(:' | 'as' | 'in'\n    if (l1 == 80)                   // 'as'\n    {\n      try_TypeDeclaration();\n    }\n    lookahead1W(56);                // S^WS | '(:' | 'in'\n    shiftT(156);                    // 'in'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n    try_WindowStartCondition();\n    if (l1 == 127                   // 'end'\n     || l1 == 202)                  // 'only'\n    {\n      try_WindowEndCondition();\n    }\n  }\n\n  function parse_SlidingWindowClause()\n  {\n    eventHandler.startNonterminal(\"SlidingWindowClause\", e0);\n    shift(239);                     // 'sliding'\n    lookahead1W(88);                // S^WS | '(:' | 'window'\n    shift(275);                     // 'window'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shift(31);                      // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    lookahead1W(114);               // S^WS | '(:' | 'as' | 'in'\n    if (l1 == 80)                   // 'as'\n    {\n      whitespace();\n      parse_TypeDeclaration();\n    }\n    lookahead1W(56);                // S^WS | '(:' | 'in'\n    shift(156);                     // 'in'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    whitespace();\n    parse_WindowStartCondition();\n    whitespace();\n    parse_WindowEndCondition();\n    eventHandler.endNonterminal(\"SlidingWindowClause\", e0);\n  }\n\n  function try_SlidingWindowClause()\n  {\n    shiftT(239);                    // 'sliding'\n    lookahead1W(88);                // S^WS | '(:' | 'window'\n    shiftT(275);                    // 'window'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shiftT(31);                     // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n    lookahead1W(114);               // S^WS | '(:' | 'as' | 'in'\n    if (l1 == 80)                   // 'as'\n    {\n      try_TypeDeclaration();\n    }\n    lookahead1W(56);                // S^WS | '(:' | 'in'\n    shiftT(156);                    // 'in'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n    try_WindowStartCondition();\n    try_WindowEndCondition();\n  }\n\n  function parse_WindowStartCondition()\n  {\n    eventHandler.startNonterminal(\"WindowStartCondition\", e0);\n    shift(242);                     // 'start'\n    lookahead1W(181);               // S^WS | '$' | '(:' | 'at' | 'next' | 'previous' | 'when'\n    whitespace();\n    parse_WindowVars();\n    lookahead1W(86);                // S^WS | '(:' | 'when'\n    shift(271);                     // 'when'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"WindowStartCondition\", e0);\n  }\n\n  function try_WindowStartCondition()\n  {\n    shiftT(242);                    // 'start'\n    lookahead1W(181);               // S^WS | '$' | '(:' | 'at' | 'next' | 'previous' | 'when'\n    try_WindowVars();\n    lookahead1W(86);                // S^WS | '(:' | 'when'\n    shiftT(271);                    // 'when'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_WindowEndCondition()\n  {\n    eventHandler.startNonterminal(\"WindowEndCondition\", e0);\n    if (l1 == 202)                  // 'only'\n    {\n      shift(202);                   // 'only'\n    }\n    lookahead1W(53);                // S^WS | '(:' | 'end'\n    shift(127);                     // 'end'\n    lookahead1W(181);               // S^WS | '$' | '(:' | 'at' | 'next' | 'previous' | 'when'\n    whitespace();\n    parse_WindowVars();\n    lookahead1W(86);                // S^WS | '(:' | 'when'\n    shift(271);                     // 'when'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"WindowEndCondition\", e0);\n  }\n\n  function try_WindowEndCondition()\n  {\n    if (l1 == 202)                  // 'only'\n    {\n      shiftT(202);                  // 'only'\n    }\n    lookahead1W(53);                // S^WS | '(:' | 'end'\n    shiftT(127);                    // 'end'\n    lookahead1W(181);               // S^WS | '$' | '(:' | 'at' | 'next' | 'previous' | 'when'\n    try_WindowVars();\n    lookahead1W(86);                // S^WS | '(:' | 'when'\n    shiftT(271);                    // 'when'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_WindowVars()\n  {\n    eventHandler.startNonterminal(\"WindowVars\", e0);\n    if (l1 == 31)                   // '$'\n    {\n      shift(31);                    // '$'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_CurrentItem();\n    }\n    lookahead1W(174);               // S^WS | '(:' | 'at' | 'next' | 'previous' | 'when'\n    if (l1 == 82)                   // 'at'\n    {\n      whitespace();\n      parse_PositionalVar();\n    }\n    lookahead1W(163);               // S^WS | '(:' | 'next' | 'previous' | 'when'\n    if (l1 == 219)                  // 'previous'\n    {\n      shift(219);                   // 'previous'\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      shift(31);                    // '$'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_PreviousItem();\n    }\n    lookahead1W(131);               // S^WS | '(:' | 'next' | 'when'\n    if (l1 == 190)                  // 'next'\n    {\n      shift(190);                   // 'next'\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      shift(31);                    // '$'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_NextItem();\n    }\n    eventHandler.endNonterminal(\"WindowVars\", e0);\n  }\n\n  function try_WindowVars()\n  {\n    if (l1 == 31)                   // '$'\n    {\n      shiftT(31);                   // '$'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_CurrentItem();\n    }\n    lookahead1W(174);               // S^WS | '(:' | 'at' | 'next' | 'previous' | 'when'\n    if (l1 == 82)                   // 'at'\n    {\n      try_PositionalVar();\n    }\n    lookahead1W(163);               // S^WS | '(:' | 'next' | 'previous' | 'when'\n    if (l1 == 219)                  // 'previous'\n    {\n      shiftT(219);                  // 'previous'\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      shiftT(31);                   // '$'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_PreviousItem();\n    }\n    lookahead1W(131);               // S^WS | '(:' | 'next' | 'when'\n    if (l1 == 190)                  // 'next'\n    {\n      shiftT(190);                  // 'next'\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      shiftT(31);                   // '$'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_NextItem();\n    }\n  }\n\n  function parse_CurrentItem()\n  {\n    eventHandler.startNonterminal(\"CurrentItem\", e0);\n    parse_EQName();\n    eventHandler.endNonterminal(\"CurrentItem\", e0);\n  }\n\n  function try_CurrentItem()\n  {\n    try_EQName();\n  }\n\n  function parse_PreviousItem()\n  {\n    eventHandler.startNonterminal(\"PreviousItem\", e0);\n    parse_EQName();\n    eventHandler.endNonterminal(\"PreviousItem\", e0);\n  }\n\n  function try_PreviousItem()\n  {\n    try_EQName();\n  }\n\n  function parse_NextItem()\n  {\n    eventHandler.startNonterminal(\"NextItem\", e0);\n    parse_EQName();\n    eventHandler.endNonterminal(\"NextItem\", e0);\n  }\n\n  function try_NextItem()\n  {\n    try_EQName();\n  }\n\n  function parse_CountClause()\n  {\n    eventHandler.startNonterminal(\"CountClause\", e0);\n    shift(106);                     // 'count'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shift(31);                      // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    eventHandler.endNonterminal(\"CountClause\", e0);\n  }\n\n  function try_CountClause()\n  {\n    shiftT(106);                    // 'count'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shiftT(31);                     // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n  }\n\n  function parse_WhereClause()\n  {\n    eventHandler.startNonterminal(\"WhereClause\", e0);\n    shift(272);                     // 'where'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"WhereClause\", e0);\n  }\n\n  function try_WhereClause()\n  {\n    shiftT(272);                    // 'where'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_GroupByClause()\n  {\n    eventHandler.startNonterminal(\"GroupByClause\", e0);\n    shift(150);                     // 'group'\n    lookahead1W(37);                // S^WS | '(:' | 'by'\n    shift(88);                      // 'by'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_GroupingSpecList();\n    eventHandler.endNonterminal(\"GroupByClause\", e0);\n  }\n\n  function try_GroupByClause()\n  {\n    shiftT(150);                    // 'group'\n    lookahead1W(37);                // S^WS | '(:' | 'by'\n    shiftT(88);                     // 'by'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_GroupingSpecList();\n  }\n\n  function parse_GroupingSpecList()\n  {\n    eventHandler.startNonterminal(\"GroupingSpecList\", e0);\n    parse_GroupingSpec();\n    for (;;)\n    {\n      lookahead1W(198);             // S^WS | '(:' | ',' | 'count' | 'for' | 'group' | 'let' | 'order' | 'return' |\n      if (l1 != 42)                 // ','\n      {\n        break;\n      }\n      shift(42);                    // ','\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_GroupingSpec();\n    }\n    eventHandler.endNonterminal(\"GroupingSpecList\", e0);\n  }\n\n  function try_GroupingSpecList()\n  {\n    try_GroupingSpec();\n    for (;;)\n    {\n      lookahead1W(198);             // S^WS | '(:' | ',' | 'count' | 'for' | 'group' | 'let' | 'order' | 'return' |\n      if (l1 != 42)                 // ','\n      {\n        break;\n      }\n      shiftT(42);                   // ','\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_GroupingSpec();\n    }\n  }\n\n  function parse_GroupingSpec()\n  {\n    eventHandler.startNonterminal(\"GroupingSpec\", e0);\n    switch (l1)\n    {\n    case 31:                        // '$'\n      lookahead2W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 3103                  // '$' EQName^Token\n     || lk == 36383                 // '$' 'after'\n     || lk == 37407                 // '$' 'allowing'\n     || lk == 37919                 // '$' 'ancestor'\n     || lk == 38431                 // '$' 'ancestor-or-self'\n     || lk == 38943                 // '$' 'and'\n     || lk == 39967                 // '$' 'append'\n     || lk == 40479                 // '$' 'array'\n     || lk == 40991                 // '$' 'as'\n     || lk == 41503                 // '$' 'ascending'\n     || lk == 42015                 // '$' 'at'\n     || lk == 42527                 // '$' 'attribute'\n     || lk == 43039                 // '$' 'base-uri'\n     || lk == 43551                 // '$' 'before'\n     || lk == 44063                 // '$' 'boundary-space'\n     || lk == 44575                 // '$' 'break'\n     || lk == 45599                 // '$' 'case'\n     || lk == 46111                 // '$' 'cast'\n     || lk == 46623                 // '$' 'castable'\n     || lk == 47135                 // '$' 'catch'\n     || lk == 48159                 // '$' 'child'\n     || lk == 48671                 // '$' 'collation'\n     || lk == 49695                 // '$' 'comment'\n     || lk == 50207                 // '$' 'constraint'\n     || lk == 50719                 // '$' 'construction'\n     || lk == 52255                 // '$' 'context'\n     || lk == 52767                 // '$' 'continue'\n     || lk == 53279                 // '$' 'copy'\n     || lk == 53791                 // '$' 'copy-namespaces'\n     || lk == 54303                 // '$' 'count'\n     || lk == 54815                 // '$' 'decimal-format'\n     || lk == 55839                 // '$' 'declare'\n     || lk == 56351                 // '$' 'default'\n     || lk == 56863                 // '$' 'delete'\n     || lk == 57375                 // '$' 'descendant'\n     || lk == 57887                 // '$' 'descendant-or-self'\n     || lk == 58399                 // '$' 'descending'\n     || lk == 60959                 // '$' 'div'\n     || lk == 61471                 // '$' 'document'\n     || lk == 61983                 // '$' 'document-node'\n     || lk == 62495                 // '$' 'element'\n     || lk == 63007                 // '$' 'else'\n     || lk == 63519                 // '$' 'empty'\n     || lk == 64031                 // '$' 'empty-sequence'\n     || lk == 64543                 // '$' 'encoding'\n     || lk == 65055                 // '$' 'end'\n     || lk == 66079                 // '$' 'eq'\n     || lk == 66591                 // '$' 'every'\n     || lk == 67615                 // '$' 'except'\n     || lk == 68127                 // '$' 'exit'\n     || lk == 68639                 // '$' 'external'\n     || lk == 69151                 // '$' 'false'\n     || lk == 69663                 // '$' 'first'\n     || lk == 70175                 // '$' 'following'\n     || lk == 70687                 // '$' 'following-sibling'\n     || lk == 71199                 // '$' 'for'\n     || lk == 72735                 // '$' 'from'\n     || lk == 73247                 // '$' 'ft-option'\n     || lk == 75295                 // '$' 'function'\n     || lk == 75807                 // '$' 'ge'\n     || lk == 76831                 // '$' 'group'\n     || lk == 77855                 // '$' 'gt'\n     || lk == 78367                 // '$' 'idiv'\n     || lk == 78879                 // '$' 'if'\n     || lk == 79391                 // '$' 'import'\n     || lk == 79903                 // '$' 'in'\n     || lk == 80415                 // '$' 'index'\n     || lk == 82463                 // '$' 'insert'\n     || lk == 82975                 // '$' 'instance'\n     || lk == 83487                 // '$' 'integrity'\n     || lk == 83999                 // '$' 'intersect'\n     || lk == 84511                 // '$' 'into'\n     || lk == 85023                 // '$' 'is'\n     || lk == 85535                 // '$' 'item'\n     || lk == 86047                 // '$' 'json'\n     || lk == 86559                 // '$' 'json-item'\n     || lk == 87071                 // '$' 'jsoniq'\n     || lk == 88607                 // '$' 'last'\n     || lk == 89119                 // '$' 'lax'\n     || lk == 89631                 // '$' 'le'\n     || lk == 90655                 // '$' 'let'\n     || lk == 91679                 // '$' 'loop'\n     || lk == 92703                 // '$' 'lt'\n     || lk == 93727                 // '$' 'mod'\n     || lk == 94239                 // '$' 'modify'\n     || lk == 94751                 // '$' 'module'\n     || lk == 95775                 // '$' 'namespace'\n     || lk == 96287                 // '$' 'namespace-node'\n     || lk == 96799                 // '$' 'ne'\n     || lk == 99359                 // '$' 'node'\n     || lk == 99871                 // '$' 'nodes'\n     || lk == 100895                // '$' 'null'\n     || lk == 101407                // '$' 'object'\n     || lk == 103455                // '$' 'only'\n     || lk == 103967                // '$' 'option'\n     || lk == 104479                // '$' 'or'\n     || lk == 104991                // '$' 'order'\n     || lk == 105503                // '$' 'ordered'\n     || lk == 106015                // '$' 'ordering'\n     || lk == 107551                // '$' 'parent'\n     || lk == 110623                // '$' 'preceding'\n     || lk == 111135                // '$' 'preceding-sibling'\n     || lk == 112671                // '$' 'processing-instruction'\n     || lk == 113695                // '$' 'rename'\n     || lk == 114207                // '$' 'replace'\n     || lk == 114719                // '$' 'return'\n     || lk == 115231                // '$' 'returning'\n     || lk == 115743                // '$' 'revalidation'\n     || lk == 116767                // '$' 'satisfies'\n     || lk == 117279                // '$' 'schema'\n     || lk == 117791                // '$' 'schema-attribute'\n     || lk == 118303                // '$' 'schema-element'\n     || lk == 118815                // '$' 'score'\n     || lk == 119327                // '$' 'select'\n     || lk == 119839                // '$' 'self'\n     || lk == 122399                // '$' 'sliding'\n     || lk == 122911                // '$' 'some'\n     || lk == 123423                // '$' 'stable'\n     || lk == 123935                // '$' 'start'\n     || lk == 125471                // '$' 'strict'\n     || lk == 126495                // '$' 'structured-item'\n     || lk == 127007                // '$' 'switch'\n     || lk == 127519                // '$' 'text'\n     || lk == 129567                // '$' 'to'\n     || lk == 130079                // '$' 'treat'\n     || lk == 130591                // '$' 'true'\n     || lk == 131103                // '$' 'try'\n     || lk == 131615                // '$' 'tumbling'\n     || lk == 132127                // '$' 'type'\n     || lk == 132639                // '$' 'typeswitch'\n     || lk == 133151                // '$' 'union'\n     || lk == 134175                // '$' 'unordered'\n     || lk == 134687                // '$' 'updating'\n     || lk == 136223                // '$' 'validate'\n     || lk == 136735                // '$' 'value'\n     || lk == 137247                // '$' 'variable'\n     || lk == 137759                // '$' 'version'\n     || lk == 139295                // '$' 'where'\n     || lk == 139807                // '$' 'while'\n     || lk == 141343)               // '$' 'with'\n    {\n      lk = memoized(2, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_GroupingVariable();\n          lookahead1W(206);         // S^WS | '(:' | ',' | ':=' | 'as' | 'collation' | 'count' | 'for' | 'group' |\n          if (l1 == 53              // ':='\n           || l1 == 80)             // 'as'\n          {\n            if (l1 == 80)           // 'as'\n            {\n              try_TypeDeclaration();\n            }\n            lookahead1W(28);        // S^WS | '(:' | ':='\n            shiftT(53);             // ':='\n            lookahead1W(267);       // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n            try_ExprSingle();\n          }\n          if (l1 == 95)             // 'collation'\n          {\n            shiftT(95);             // 'collation'\n            lookahead1W(15);        // URILiteral | S^WS | '(:'\n            shiftT(7);              // URILiteral\n          }\n          lk = -1;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n        }\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(2, e0, lk);\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n      parse_GroupingVariable();\n      lookahead1W(206);             // S^WS | '(:' | ',' | ':=' | 'as' | 'collation' | 'count' | 'for' | 'group' |\n      if (l1 == 53                  // ':='\n       || l1 == 80)                 // 'as'\n      {\n        if (l1 == 80)               // 'as'\n        {\n          whitespace();\n          parse_TypeDeclaration();\n        }\n        lookahead1W(28);            // S^WS | '(:' | ':='\n        shift(53);                  // ':='\n        lookahead1W(267);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        whitespace();\n        parse_ExprSingle();\n      }\n      if (l1 == 95)                 // 'collation'\n      {\n        shift(95);                  // 'collation'\n        lookahead1W(15);            // URILiteral | S^WS | '(:'\n        shift(7);                   // URILiteral\n      }\n      break;\n    default:\n      parse_ExprSingle();\n    }\n    eventHandler.endNonterminal(\"GroupingSpec\", e0);\n  }\n\n  function try_GroupingSpec()\n  {\n    switch (l1)\n    {\n    case 31:                        // '$'\n      lookahead2W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 3103                  // '$' EQName^Token\n     || lk == 36383                 // '$' 'after'\n     || lk == 37407                 // '$' 'allowing'\n     || lk == 37919                 // '$' 'ancestor'\n     || lk == 38431                 // '$' 'ancestor-or-self'\n     || lk == 38943                 // '$' 'and'\n     || lk == 39967                 // '$' 'append'\n     || lk == 40479                 // '$' 'array'\n     || lk == 40991                 // '$' 'as'\n     || lk == 41503                 // '$' 'ascending'\n     || lk == 42015                 // '$' 'at'\n     || lk == 42527                 // '$' 'attribute'\n     || lk == 43039                 // '$' 'base-uri'\n     || lk == 43551                 // '$' 'before'\n     || lk == 44063                 // '$' 'boundary-space'\n     || lk == 44575                 // '$' 'break'\n     || lk == 45599                 // '$' 'case'\n     || lk == 46111                 // '$' 'cast'\n     || lk == 46623                 // '$' 'castable'\n     || lk == 47135                 // '$' 'catch'\n     || lk == 48159                 // '$' 'child'\n     || lk == 48671                 // '$' 'collation'\n     || lk == 49695                 // '$' 'comment'\n     || lk == 50207                 // '$' 'constraint'\n     || lk == 50719                 // '$' 'construction'\n     || lk == 52255                 // '$' 'context'\n     || lk == 52767                 // '$' 'continue'\n     || lk == 53279                 // '$' 'copy'\n     || lk == 53791                 // '$' 'copy-namespaces'\n     || lk == 54303                 // '$' 'count'\n     || lk == 54815                 // '$' 'decimal-format'\n     || lk == 55839                 // '$' 'declare'\n     || lk == 56351                 // '$' 'default'\n     || lk == 56863                 // '$' 'delete'\n     || lk == 57375                 // '$' 'descendant'\n     || lk == 57887                 // '$' 'descendant-or-self'\n     || lk == 58399                 // '$' 'descending'\n     || lk == 60959                 // '$' 'div'\n     || lk == 61471                 // '$' 'document'\n     || lk == 61983                 // '$' 'document-node'\n     || lk == 62495                 // '$' 'element'\n     || lk == 63007                 // '$' 'else'\n     || lk == 63519                 // '$' 'empty'\n     || lk == 64031                 // '$' 'empty-sequence'\n     || lk == 64543                 // '$' 'encoding'\n     || lk == 65055                 // '$' 'end'\n     || lk == 66079                 // '$' 'eq'\n     || lk == 66591                 // '$' 'every'\n     || lk == 67615                 // '$' 'except'\n     || lk == 68127                 // '$' 'exit'\n     || lk == 68639                 // '$' 'external'\n     || lk == 69151                 // '$' 'false'\n     || lk == 69663                 // '$' 'first'\n     || lk == 70175                 // '$' 'following'\n     || lk == 70687                 // '$' 'following-sibling'\n     || lk == 71199                 // '$' 'for'\n     || lk == 72735                 // '$' 'from'\n     || lk == 73247                 // '$' 'ft-option'\n     || lk == 75295                 // '$' 'function'\n     || lk == 75807                 // '$' 'ge'\n     || lk == 76831                 // '$' 'group'\n     || lk == 77855                 // '$' 'gt'\n     || lk == 78367                 // '$' 'idiv'\n     || lk == 78879                 // '$' 'if'\n     || lk == 79391                 // '$' 'import'\n     || lk == 79903                 // '$' 'in'\n     || lk == 80415                 // '$' 'index'\n     || lk == 82463                 // '$' 'insert'\n     || lk == 82975                 // '$' 'instance'\n     || lk == 83487                 // '$' 'integrity'\n     || lk == 83999                 // '$' 'intersect'\n     || lk == 84511                 // '$' 'into'\n     || lk == 85023                 // '$' 'is'\n     || lk == 85535                 // '$' 'item'\n     || lk == 86047                 // '$' 'json'\n     || lk == 86559                 // '$' 'json-item'\n     || lk == 87071                 // '$' 'jsoniq'\n     || lk == 88607                 // '$' 'last'\n     || lk == 89119                 // '$' 'lax'\n     || lk == 89631                 // '$' 'le'\n     || lk == 90655                 // '$' 'let'\n     || lk == 91679                 // '$' 'loop'\n     || lk == 92703                 // '$' 'lt'\n     || lk == 93727                 // '$' 'mod'\n     || lk == 94239                 // '$' 'modify'\n     || lk == 94751                 // '$' 'module'\n     || lk == 95775                 // '$' 'namespace'\n     || lk == 96287                 // '$' 'namespace-node'\n     || lk == 96799                 // '$' 'ne'\n     || lk == 99359                 // '$' 'node'\n     || lk == 99871                 // '$' 'nodes'\n     || lk == 100895                // '$' 'null'\n     || lk == 101407                // '$' 'object'\n     || lk == 103455                // '$' 'only'\n     || lk == 103967                // '$' 'option'\n     || lk == 104479                // '$' 'or'\n     || lk == 104991                // '$' 'order'\n     || lk == 105503                // '$' 'ordered'\n     || lk == 106015                // '$' 'ordering'\n     || lk == 107551                // '$' 'parent'\n     || lk == 110623                // '$' 'preceding'\n     || lk == 111135                // '$' 'preceding-sibling'\n     || lk == 112671                // '$' 'processing-instruction'\n     || lk == 113695                // '$' 'rename'\n     || lk == 114207                // '$' 'replace'\n     || lk == 114719                // '$' 'return'\n     || lk == 115231                // '$' 'returning'\n     || lk == 115743                // '$' 'revalidation'\n     || lk == 116767                // '$' 'satisfies'\n     || lk == 117279                // '$' 'schema'\n     || lk == 117791                // '$' 'schema-attribute'\n     || lk == 118303                // '$' 'schema-element'\n     || lk == 118815                // '$' 'score'\n     || lk == 119327                // '$' 'select'\n     || lk == 119839                // '$' 'self'\n     || lk == 122399                // '$' 'sliding'\n     || lk == 122911                // '$' 'some'\n     || lk == 123423                // '$' 'stable'\n     || lk == 123935                // '$' 'start'\n     || lk == 125471                // '$' 'strict'\n     || lk == 126495                // '$' 'structured-item'\n     || lk == 127007                // '$' 'switch'\n     || lk == 127519                // '$' 'text'\n     || lk == 129567                // '$' 'to'\n     || lk == 130079                // '$' 'treat'\n     || lk == 130591                // '$' 'true'\n     || lk == 131103                // '$' 'try'\n     || lk == 131615                // '$' 'tumbling'\n     || lk == 132127                // '$' 'type'\n     || lk == 132639                // '$' 'typeswitch'\n     || lk == 133151                // '$' 'union'\n     || lk == 134175                // '$' 'unordered'\n     || lk == 134687                // '$' 'updating'\n     || lk == 136223                // '$' 'validate'\n     || lk == 136735                // '$' 'value'\n     || lk == 137247                // '$' 'variable'\n     || lk == 137759                // '$' 'version'\n     || lk == 139295                // '$' 'where'\n     || lk == 139807                // '$' 'while'\n     || lk == 141343)               // '$' 'with'\n    {\n      lk = memoized(2, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_GroupingVariable();\n          lookahead1W(206);         // S^WS | '(:' | ',' | ':=' | 'as' | 'collation' | 'count' | 'for' | 'group' |\n          if (l1 == 53              // ':='\n           || l1 == 80)             // 'as'\n          {\n            if (l1 == 80)           // 'as'\n            {\n              try_TypeDeclaration();\n            }\n            lookahead1W(28);        // S^WS | '(:' | ':='\n            shiftT(53);             // ':='\n            lookahead1W(267);       // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n            try_ExprSingle();\n          }\n          if (l1 == 95)             // 'collation'\n          {\n            shiftT(95);             // 'collation'\n            lookahead1W(15);        // URILiteral | S^WS | '(:'\n            shiftT(7);              // URILiteral\n          }\n          memoize(2, e0A, -1);\n          lk = -3;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(2, e0A, -2);\n        }\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n      try_GroupingVariable();\n      lookahead1W(206);             // S^WS | '(:' | ',' | ':=' | 'as' | 'collation' | 'count' | 'for' | 'group' |\n      if (l1 == 53                  // ':='\n       || l1 == 80)                 // 'as'\n      {\n        if (l1 == 80)               // 'as'\n        {\n          try_TypeDeclaration();\n        }\n        lookahead1W(28);            // S^WS | '(:' | ':='\n        shiftT(53);                 // ':='\n        lookahead1W(267);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        try_ExprSingle();\n      }\n      if (l1 == 95)                 // 'collation'\n      {\n        shiftT(95);                 // 'collation'\n        lookahead1W(15);            // URILiteral | S^WS | '(:'\n        shiftT(7);                  // URILiteral\n      }\n      break;\n    case -3:\n      break;\n    default:\n      try_ExprSingle();\n    }\n  }\n\n  function parse_GroupingVariable()\n  {\n    eventHandler.startNonterminal(\"GroupingVariable\", e0);\n    shift(31);                      // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    eventHandler.endNonterminal(\"GroupingVariable\", e0);\n  }\n\n  function try_GroupingVariable()\n  {\n    shiftT(31);                     // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n  }\n\n  function parse_OrderByClause()\n  {\n    eventHandler.startNonterminal(\"OrderByClause\", e0);\n    switch (l1)\n    {\n    case 205:                       // 'order'\n      shift(205);                   // 'order'\n      lookahead1W(37);              // S^WS | '(:' | 'by'\n      shift(88);                    // 'by'\n      break;\n    default:\n      shift(241);                   // 'stable'\n      lookahead1W(70);              // S^WS | '(:' | 'order'\n      shift(205);                   // 'order'\n      lookahead1W(37);              // S^WS | '(:' | 'by'\n      shift(88);                    // 'by'\n    }\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_OrderSpecList();\n    eventHandler.endNonterminal(\"OrderByClause\", e0);\n  }\n\n  function try_OrderByClause()\n  {\n    switch (l1)\n    {\n    case 205:                       // 'order'\n      shiftT(205);                  // 'order'\n      lookahead1W(37);              // S^WS | '(:' | 'by'\n      shiftT(88);                   // 'by'\n      break;\n    default:\n      shiftT(241);                  // 'stable'\n      lookahead1W(70);              // S^WS | '(:' | 'order'\n      shiftT(205);                  // 'order'\n      lookahead1W(37);              // S^WS | '(:' | 'by'\n      shiftT(88);                   // 'by'\n    }\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_OrderSpecList();\n  }\n\n  function parse_OrderSpecList()\n  {\n    eventHandler.startNonterminal(\"OrderSpecList\", e0);\n    parse_OrderSpec();\n    for (;;)\n    {\n      lookahead1W(198);             // S^WS | '(:' | ',' | 'count' | 'for' | 'group' | 'let' | 'order' | 'return' |\n      if (l1 != 42)                 // ','\n      {\n        break;\n      }\n      shift(42);                    // ','\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_OrderSpec();\n    }\n    eventHandler.endNonterminal(\"OrderSpecList\", e0);\n  }\n\n  function try_OrderSpecList()\n  {\n    try_OrderSpec();\n    for (;;)\n    {\n      lookahead1W(198);             // S^WS | '(:' | ',' | 'count' | 'for' | 'group' | 'let' | 'order' | 'return' |\n      if (l1 != 42)                 // ','\n      {\n        break;\n      }\n      shiftT(42);                   // ','\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_OrderSpec();\n    }\n  }\n\n  function parse_OrderSpec()\n  {\n    eventHandler.startNonterminal(\"OrderSpec\", e0);\n    parse_ExprSingle();\n    whitespace();\n    parse_OrderModifier();\n    eventHandler.endNonterminal(\"OrderSpec\", e0);\n  }\n\n  function try_OrderSpec()\n  {\n    try_ExprSingle();\n    try_OrderModifier();\n  }\n\n  function parse_OrderModifier()\n  {\n    eventHandler.startNonterminal(\"OrderModifier\", e0);\n    if (l1 == 81                    // 'ascending'\n     || l1 == 114)                  // 'descending'\n    {\n      switch (l1)\n      {\n      case 81:                      // 'ascending'\n        shift(81);                  // 'ascending'\n        break;\n      default:\n        shift(114);                 // 'descending'\n      }\n    }\n    lookahead1W(203);               // S^WS | '(:' | ',' | 'collation' | 'count' | 'empty' | 'for' | 'group' | 'let' |\n    if (l1 == 124)                  // 'empty'\n    {\n      shift(124);                   // 'empty'\n      lookahead1W(125);             // S^WS | '(:' | 'greatest' | 'least'\n      switch (l1)\n      {\n      case 149:                     // 'greatest'\n        shift(149);                 // 'greatest'\n        break;\n      default:\n        shift(176);                 // 'least'\n      }\n    }\n    lookahead1W(199);               // S^WS | '(:' | ',' | 'collation' | 'count' | 'for' | 'group' | 'let' | 'order' |\n    if (l1 == 95)                   // 'collation'\n    {\n      shift(95);                    // 'collation'\n      lookahead1W(15);              // URILiteral | S^WS | '(:'\n      shift(7);                     // URILiteral\n    }\n    eventHandler.endNonterminal(\"OrderModifier\", e0);\n  }\n\n  function try_OrderModifier()\n  {\n    if (l1 == 81                    // 'ascending'\n     || l1 == 114)                  // 'descending'\n    {\n      switch (l1)\n      {\n      case 81:                      // 'ascending'\n        shiftT(81);                 // 'ascending'\n        break;\n      default:\n        shiftT(114);                // 'descending'\n      }\n    }\n    lookahead1W(203);               // S^WS | '(:' | ',' | 'collation' | 'count' | 'empty' | 'for' | 'group' | 'let' |\n    if (l1 == 124)                  // 'empty'\n    {\n      shiftT(124);                  // 'empty'\n      lookahead1W(125);             // S^WS | '(:' | 'greatest' | 'least'\n      switch (l1)\n      {\n      case 149:                     // 'greatest'\n        shiftT(149);                // 'greatest'\n        break;\n      default:\n        shiftT(176);                // 'least'\n      }\n    }\n    lookahead1W(199);               // S^WS | '(:' | ',' | 'collation' | 'count' | 'for' | 'group' | 'let' | 'order' |\n    if (l1 == 95)                   // 'collation'\n    {\n      shiftT(95);                   // 'collation'\n      lookahead1W(15);              // URILiteral | S^WS | '(:'\n      shiftT(7);                    // URILiteral\n    }\n  }\n\n  function parse_ReturnClause()\n  {\n    eventHandler.startNonterminal(\"ReturnClause\", e0);\n    shift(224);                     // 'return'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"ReturnClause\", e0);\n  }\n\n  function try_ReturnClause()\n  {\n    shiftT(224);                    // 'return'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_QuantifiedExpr()\n  {\n    eventHandler.startNonterminal(\"QuantifiedExpr\", e0);\n    switch (l1)\n    {\n    case 240:                       // 'some'\n      shift(240);                   // 'some'\n      break;\n    default:\n      shift(130);                   // 'every'\n    }\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    whitespace();\n    parse_QuantifiedVarDecl();\n    for (;;)\n    {\n      if (l1 != 42)                 // ','\n      {\n        break;\n      }\n      shift(42);                    // ','\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      whitespace();\n      parse_QuantifiedVarDecl();\n    }\n    shift(228);                     // 'satisfies'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"QuantifiedExpr\", e0);\n  }\n\n  function try_QuantifiedExpr()\n  {\n    switch (l1)\n    {\n    case 240:                       // 'some'\n      shiftT(240);                  // 'some'\n      break;\n    default:\n      shiftT(130);                  // 'every'\n    }\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    try_QuantifiedVarDecl();\n    for (;;)\n    {\n      if (l1 != 42)                 // ','\n      {\n        break;\n      }\n      shiftT(42);                   // ','\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      try_QuantifiedVarDecl();\n    }\n    shiftT(228);                    // 'satisfies'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_QuantifiedVarDecl()\n  {\n    eventHandler.startNonterminal(\"QuantifiedVarDecl\", e0);\n    shift(31);                      // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    lookahead1W(114);               // S^WS | '(:' | 'as' | 'in'\n    if (l1 == 80)                   // 'as'\n    {\n      whitespace();\n      parse_TypeDeclaration();\n    }\n    lookahead1W(56);                // S^WS | '(:' | 'in'\n    shift(156);                     // 'in'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"QuantifiedVarDecl\", e0);\n  }\n\n  function try_QuantifiedVarDecl()\n  {\n    shiftT(31);                     // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n    lookahead1W(114);               // S^WS | '(:' | 'as' | 'in'\n    if (l1 == 80)                   // 'as'\n    {\n      try_TypeDeclaration();\n    }\n    lookahead1W(56);                // S^WS | '(:' | 'in'\n    shiftT(156);                    // 'in'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_SwitchExpr()\n  {\n    eventHandler.startNonterminal(\"SwitchExpr\", e0);\n    shift(248);                     // 'switch'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(35);                      // '('\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Expr();\n    shift(38);                      // ')'\n    for (;;)\n    {\n      lookahead1W(38);              // S^WS | '(:' | 'case'\n      whitespace();\n      parse_SwitchCaseClause();\n      if (l1 != 89)                 // 'case'\n      {\n        break;\n      }\n    }\n    shift(110);                     // 'default'\n    lookahead1W(73);                // S^WS | '(:' | 'return'\n    shift(224);                     // 'return'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"SwitchExpr\", e0);\n  }\n\n  function try_SwitchExpr()\n  {\n    shiftT(248);                    // 'switch'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(35);                     // '('\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Expr();\n    shiftT(38);                     // ')'\n    for (;;)\n    {\n      lookahead1W(38);              // S^WS | '(:' | 'case'\n      try_SwitchCaseClause();\n      if (l1 != 89)                 // 'case'\n      {\n        break;\n      }\n    }\n    shiftT(110);                    // 'default'\n    lookahead1W(73);                // S^WS | '(:' | 'return'\n    shiftT(224);                    // 'return'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_SwitchCaseClause()\n  {\n    eventHandler.startNonterminal(\"SwitchCaseClause\", e0);\n    for (;;)\n    {\n      shift(89);                    // 'case'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_SwitchCaseOperand();\n      if (l1 != 89)                 // 'case'\n      {\n        break;\n      }\n    }\n    shift(224);                     // 'return'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"SwitchCaseClause\", e0);\n  }\n\n  function try_SwitchCaseClause()\n  {\n    for (;;)\n    {\n      shiftT(89);                   // 'case'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_SwitchCaseOperand();\n      if (l1 != 89)                 // 'case'\n      {\n        break;\n      }\n    }\n    shiftT(224);                    // 'return'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_SwitchCaseOperand()\n  {\n    eventHandler.startNonterminal(\"SwitchCaseOperand\", e0);\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"SwitchCaseOperand\", e0);\n  }\n\n  function try_SwitchCaseOperand()\n  {\n    try_ExprSingle();\n  }\n\n  function parse_TypeswitchExpr()\n  {\n    eventHandler.startNonterminal(\"TypeswitchExpr\", e0);\n    shift(259);                     // 'typeswitch'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(35);                      // '('\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Expr();\n    shift(38);                      // ')'\n    for (;;)\n    {\n      lookahead1W(38);              // S^WS | '(:' | 'case'\n      whitespace();\n      parse_CaseClause();\n      if (l1 != 89)                 // 'case'\n      {\n        break;\n      }\n    }\n    shift(110);                     // 'default'\n    lookahead1W(99);                // S^WS | '$' | '(:' | 'return'\n    if (l1 == 31)                   // '$'\n    {\n      shift(31);                    // '$'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_VarName();\n    }\n    lookahead1W(73);                // S^WS | '(:' | 'return'\n    shift(224);                     // 'return'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"TypeswitchExpr\", e0);\n  }\n\n  function try_TypeswitchExpr()\n  {\n    shiftT(259);                    // 'typeswitch'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(35);                     // '('\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Expr();\n    shiftT(38);                     // ')'\n    for (;;)\n    {\n      lookahead1W(38);              // S^WS | '(:' | 'case'\n      try_CaseClause();\n      if (l1 != 89)                 // 'case'\n      {\n        break;\n      }\n    }\n    shiftT(110);                    // 'default'\n    lookahead1W(99);                // S^WS | '$' | '(:' | 'return'\n    if (l1 == 31)                   // '$'\n    {\n      shiftT(31);                   // '$'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_VarName();\n    }\n    lookahead1W(73);                // S^WS | '(:' | 'return'\n    shiftT(224);                    // 'return'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_CaseClause()\n  {\n    eventHandler.startNonterminal(\"CaseClause\", e0);\n    shift(89);                      // 'case'\n    lookahead1W(258);               // EQName^Token | S^WS | '$' | '%' | '(' | '(:' | 'after' | 'allowing' |\n    if (l1 == 31)                   // '$'\n    {\n      shift(31);                    // '$'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_VarName();\n      lookahead1W(33);              // S^WS | '(:' | 'as'\n      shift(80);                    // 'as'\n    }\n    lookahead1W(254);               // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_SequenceTypeUnion();\n    shift(224);                     // 'return'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"CaseClause\", e0);\n  }\n\n  function try_CaseClause()\n  {\n    shiftT(89);                     // 'case'\n    lookahead1W(258);               // EQName^Token | S^WS | '$' | '%' | '(' | '(:' | 'after' | 'allowing' |\n    if (l1 == 31)                   // '$'\n    {\n      shiftT(31);                   // '$'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_VarName();\n      lookahead1W(33);              // S^WS | '(:' | 'as'\n      shiftT(80);                   // 'as'\n    }\n    lookahead1W(254);               // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_SequenceTypeUnion();\n    shiftT(224);                    // 'return'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_SequenceTypeUnion()\n  {\n    eventHandler.startNonterminal(\"SequenceTypeUnion\", e0);\n    parse_SequenceType();\n    for (;;)\n    {\n      lookahead1W(138);             // S^WS | '(:' | 'return' | '|'\n      if (l1 != 284)                // '|'\n      {\n        break;\n      }\n      shift(284);                   // '|'\n      lookahead1W(254);             // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_SequenceType();\n    }\n    eventHandler.endNonterminal(\"SequenceTypeUnion\", e0);\n  }\n\n  function try_SequenceTypeUnion()\n  {\n    try_SequenceType();\n    for (;;)\n    {\n      lookahead1W(138);             // S^WS | '(:' | 'return' | '|'\n      if (l1 != 284)                // '|'\n      {\n        break;\n      }\n      shiftT(284);                  // '|'\n      lookahead1W(254);             // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_SequenceType();\n    }\n  }\n\n  function parse_IfExpr()\n  {\n    eventHandler.startNonterminal(\"IfExpr\", e0);\n    shift(154);                     // 'if'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(35);                      // '('\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Expr();\n    shift(38);                      // ')'\n    lookahead1W(80);                // S^WS | '(:' | 'then'\n    shift(250);                     // 'then'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    shift(123);                     // 'else'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"IfExpr\", e0);\n  }\n\n  function try_IfExpr()\n  {\n    shiftT(154);                    // 'if'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(35);                     // '('\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Expr();\n    shiftT(38);                     // ')'\n    lookahead1W(80);                // S^WS | '(:' | 'then'\n    shiftT(250);                    // 'then'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n    shiftT(123);                    // 'else'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_TryCatchExpr()\n  {\n    eventHandler.startNonterminal(\"TryCatchExpr\", e0);\n    parse_TryClause();\n    for (;;)\n    {\n      lookahead1W(39);              // S^WS | '(:' | 'catch'\n      whitespace();\n      parse_CatchClause();\n      lookahead1W(208);             // S^WS | EOF | '(:' | ')' | ',' | ':' | ';' | ']' | 'after' | 'as' | 'ascending' |\n      if (l1 != 92)                 // 'catch'\n      {\n        break;\n      }\n    }\n    eventHandler.endNonterminal(\"TryCatchExpr\", e0);\n  }\n\n  function try_TryCatchExpr()\n  {\n    try_TryClause();\n    for (;;)\n    {\n      lookahead1W(39);              // S^WS | '(:' | 'catch'\n      try_CatchClause();\n      lookahead1W(208);             // S^WS | EOF | '(:' | ')' | ',' | ':' | ';' | ']' | 'after' | 'as' | 'ascending' |\n      if (l1 != 92)                 // 'catch'\n      {\n        break;\n      }\n    }\n  }\n\n  function parse_TryClause()\n  {\n    eventHandler.startNonterminal(\"TryClause\", e0);\n    shift(256);                     // 'try'\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    shift(281);                     // '{'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_TryTargetExpr();\n    shift(287);                     // '}'\n    eventHandler.endNonterminal(\"TryClause\", e0);\n  }\n\n  function try_TryClause()\n  {\n    shiftT(256);                    // 'try'\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    shiftT(281);                    // '{'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_TryTargetExpr();\n    shiftT(287);                    // '}'\n  }\n\n  function parse_TryTargetExpr()\n  {\n    eventHandler.startNonterminal(\"TryTargetExpr\", e0);\n    parse_Expr();\n    eventHandler.endNonterminal(\"TryTargetExpr\", e0);\n  }\n\n  function try_TryTargetExpr()\n  {\n    try_Expr();\n  }\n\n  function parse_CatchClause()\n  {\n    eventHandler.startNonterminal(\"CatchClause\", e0);\n    shift(92);                      // 'catch'\n    lookahead1W(249);               // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_CatchErrorList();\n    shift(281);                     // '{'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Expr();\n    shift(287);                     // '}'\n    eventHandler.endNonterminal(\"CatchClause\", e0);\n  }\n\n  function try_CatchClause()\n  {\n    shiftT(92);                     // 'catch'\n    lookahead1W(249);               // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_CatchErrorList();\n    shiftT(281);                    // '{'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Expr();\n    shiftT(287);                    // '}'\n  }\n\n  function parse_CatchErrorList()\n  {\n    eventHandler.startNonterminal(\"CatchErrorList\", e0);\n    parse_NameTest();\n    for (;;)\n    {\n      lookahead1W(140);             // S^WS | '(:' | '{' | '|'\n      if (l1 != 284)                // '|'\n      {\n        break;\n      }\n      shift(284);                   // '|'\n      lookahead1W(249);             // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_NameTest();\n    }\n    eventHandler.endNonterminal(\"CatchErrorList\", e0);\n  }\n\n  function try_CatchErrorList()\n  {\n    try_NameTest();\n    for (;;)\n    {\n      lookahead1W(140);             // S^WS | '(:' | '{' | '|'\n      if (l1 != 284)                // '|'\n      {\n        break;\n      }\n      shiftT(284);                  // '|'\n      lookahead1W(249);             // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_NameTest();\n    }\n  }\n\n  function parse_OrExpr()\n  {\n    eventHandler.startNonterminal(\"OrExpr\", e0);\n    parse_AndExpr();\n    for (;;)\n    {\n      if (l1 != 204)                // 'or'\n      {\n        break;\n      }\n      shift(204);                   // 'or'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_AndExpr();\n    }\n    eventHandler.endNonterminal(\"OrExpr\", e0);\n  }\n\n  function try_OrExpr()\n  {\n    try_AndExpr();\n    for (;;)\n    {\n      if (l1 != 204)                // 'or'\n      {\n        break;\n      }\n      shiftT(204);                  // 'or'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_AndExpr();\n    }\n  }\n\n  function parse_AndExpr()\n  {\n    eventHandler.startNonterminal(\"AndExpr\", e0);\n    parse_NotExpr();\n    for (;;)\n    {\n      if (l1 != 76)                 // 'and'\n      {\n        break;\n      }\n      shift(76);                    // 'and'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_NotExpr();\n    }\n    eventHandler.endNonterminal(\"AndExpr\", e0);\n  }\n\n  function try_AndExpr()\n  {\n    try_NotExpr();\n    for (;;)\n    {\n      if (l1 != 76)                 // 'and'\n      {\n        break;\n      }\n      shiftT(76);                   // 'and'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_NotExpr();\n    }\n  }\n\n  function parse_NotExpr()\n  {\n    eventHandler.startNonterminal(\"NotExpr\", e0);\n    if (l1 == 196)                  // 'not'\n    {\n      shift(196);                   // 'not'\n    }\n    lookahead1W(266);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ComparisonExpr();\n    eventHandler.endNonterminal(\"NotExpr\", e0);\n  }\n\n  function try_NotExpr()\n  {\n    if (l1 == 196)                  // 'not'\n    {\n      shiftT(196);                  // 'not'\n    }\n    lookahead1W(266);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ComparisonExpr();\n  }\n\n  function parse_ComparisonExpr()\n  {\n    eventHandler.startNonterminal(\"ComparisonExpr\", e0);\n    parse_FTContainsExpr();\n    if (l1 == 27                    // '!='\n     || l1 == 55                    // '<'\n     || l1 == 58                    // '<<'\n     || l1 == 59                    // '<='\n     || l1 == 61                    // '='\n     || l1 == 62                    // '>'\n     || l1 == 63                    // '>='\n     || l1 == 64                    // '>>'\n     || l1 == 129                   // 'eq'\n     || l1 == 148                   // 'ge'\n     || l1 == 152                   // 'gt'\n     || l1 == 166                   // 'is'\n     || l1 == 175                   // 'le'\n     || l1 == 181                   // 'lt'\n     || l1 == 189)                  // 'ne'\n    {\n      switch (l1)\n      {\n      case 129:                     // 'eq'\n      case 148:                     // 'ge'\n      case 152:                     // 'gt'\n      case 175:                     // 'le'\n      case 181:                     // 'lt'\n      case 189:                     // 'ne'\n        whitespace();\n        parse_ValueComp();\n        break;\n      case 58:                      // '<<'\n      case 64:                      // '>>'\n      case 166:                     // 'is'\n        whitespace();\n        parse_NodeComp();\n        break;\n      default:\n        whitespace();\n        parse_GeneralComp();\n      }\n      lookahead1W(266);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_FTContainsExpr();\n    }\n    eventHandler.endNonterminal(\"ComparisonExpr\", e0);\n  }\n\n  function try_ComparisonExpr()\n  {\n    try_FTContainsExpr();\n    if (l1 == 27                    // '!='\n     || l1 == 55                    // '<'\n     || l1 == 58                    // '<<'\n     || l1 == 59                    // '<='\n     || l1 == 61                    // '='\n     || l1 == 62                    // '>'\n     || l1 == 63                    // '>='\n     || l1 == 64                    // '>>'\n     || l1 == 129                   // 'eq'\n     || l1 == 148                   // 'ge'\n     || l1 == 152                   // 'gt'\n     || l1 == 166                   // 'is'\n     || l1 == 175                   // 'le'\n     || l1 == 181                   // 'lt'\n     || l1 == 189)                  // 'ne'\n    {\n      switch (l1)\n      {\n      case 129:                     // 'eq'\n      case 148:                     // 'ge'\n      case 152:                     // 'gt'\n      case 175:                     // 'le'\n      case 181:                     // 'lt'\n      case 189:                     // 'ne'\n        try_ValueComp();\n        break;\n      case 58:                      // '<<'\n      case 64:                      // '>>'\n      case 166:                     // 'is'\n        try_NodeComp();\n        break;\n      default:\n        try_GeneralComp();\n      }\n      lookahead1W(266);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_FTContainsExpr();\n    }\n  }\n\n  function parse_FTContainsExpr()\n  {\n    eventHandler.startNonterminal(\"FTContainsExpr\", e0);\n    parse_StringConcatExpr();\n    if (l1 == 100)                  // 'contains'\n    {\n      shift(100);                   // 'contains'\n      lookahead1W(79);              // S^WS | '(:' | 'text'\n      shift(249);                   // 'text'\n      lookahead1W(177);             // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{'\n      whitespace();\n      parse_FTSelection();\n      if (l1 == 277)                // 'without'\n      {\n        whitespace();\n        parse_FTIgnoreOption();\n      }\n    }\n    eventHandler.endNonterminal(\"FTContainsExpr\", e0);\n  }\n\n  function try_FTContainsExpr()\n  {\n    try_StringConcatExpr();\n    if (l1 == 100)                  // 'contains'\n    {\n      shiftT(100);                  // 'contains'\n      lookahead1W(79);              // S^WS | '(:' | 'text'\n      shiftT(249);                  // 'text'\n      lookahead1W(177);             // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{'\n      try_FTSelection();\n      if (l1 == 277)                // 'without'\n      {\n        try_FTIgnoreOption();\n      }\n    }\n  }\n\n  function parse_StringConcatExpr()\n  {\n    eventHandler.startNonterminal(\"StringConcatExpr\", e0);\n    parse_RangeExpr();\n    for (;;)\n    {\n      if (l1 != 285)                // '||'\n      {\n        break;\n      }\n      shift(285);                   // '||'\n      lookahead1W(266);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_RangeExpr();\n    }\n    eventHandler.endNonterminal(\"StringConcatExpr\", e0);\n  }\n\n  function try_StringConcatExpr()\n  {\n    try_RangeExpr();\n    for (;;)\n    {\n      if (l1 != 285)                // '||'\n      {\n        break;\n      }\n      shiftT(285);                  // '||'\n      lookahead1W(266);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_RangeExpr();\n    }\n  }\n\n  function parse_RangeExpr()\n  {\n    eventHandler.startNonterminal(\"RangeExpr\", e0);\n    parse_AdditiveExpr();\n    if (l1 == 253)                  // 'to'\n    {\n      shift(253);                   // 'to'\n      lookahead1W(266);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_AdditiveExpr();\n    }\n    eventHandler.endNonterminal(\"RangeExpr\", e0);\n  }\n\n  function try_RangeExpr()\n  {\n    try_AdditiveExpr();\n    if (l1 == 253)                  // 'to'\n    {\n      shiftT(253);                  // 'to'\n      lookahead1W(266);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_AdditiveExpr();\n    }\n  }\n\n  function parse_AdditiveExpr()\n  {\n    eventHandler.startNonterminal(\"AdditiveExpr\", e0);\n    parse_MultiplicativeExpr();\n    for (;;)\n    {\n      if (l1 != 41                  // '+'\n       && l1 != 43)                 // '-'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 41:                      // '+'\n        shift(41);                  // '+'\n        break;\n      default:\n        shift(43);                  // '-'\n      }\n      lookahead1W(266);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_MultiplicativeExpr();\n    }\n    eventHandler.endNonterminal(\"AdditiveExpr\", e0);\n  }\n\n  function try_AdditiveExpr()\n  {\n    try_MultiplicativeExpr();\n    for (;;)\n    {\n      if (l1 != 41                  // '+'\n       && l1 != 43)                 // '-'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 41:                      // '+'\n        shiftT(41);                 // '+'\n        break;\n      default:\n        shiftT(43);                 // '-'\n      }\n      lookahead1W(266);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_MultiplicativeExpr();\n    }\n  }\n\n  function parse_MultiplicativeExpr()\n  {\n    eventHandler.startNonterminal(\"MultiplicativeExpr\", e0);\n    parse_UnionExpr();\n    for (;;)\n    {\n      if (l1 != 39                  // '*'\n       && l1 != 119                 // 'div'\n       && l1 != 153                 // 'idiv'\n       && l1 != 183)                // 'mod'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 39:                      // '*'\n        shift(39);                  // '*'\n        break;\n      case 119:                     // 'div'\n        shift(119);                 // 'div'\n        break;\n      case 153:                     // 'idiv'\n        shift(153);                 // 'idiv'\n        break;\n      default:\n        shift(183);                 // 'mod'\n      }\n      lookahead1W(266);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_UnionExpr();\n    }\n    eventHandler.endNonterminal(\"MultiplicativeExpr\", e0);\n  }\n\n  function try_MultiplicativeExpr()\n  {\n    try_UnionExpr();\n    for (;;)\n    {\n      if (l1 != 39                  // '*'\n       && l1 != 119                 // 'div'\n       && l1 != 153                 // 'idiv'\n       && l1 != 183)                // 'mod'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 39:                      // '*'\n        shiftT(39);                 // '*'\n        break;\n      case 119:                     // 'div'\n        shiftT(119);                // 'div'\n        break;\n      case 153:                     // 'idiv'\n        shiftT(153);                // 'idiv'\n        break;\n      default:\n        shiftT(183);                // 'mod'\n      }\n      lookahead1W(266);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_UnionExpr();\n    }\n  }\n\n  function parse_UnionExpr()\n  {\n    eventHandler.startNonterminal(\"UnionExpr\", e0);\n    parse_IntersectExceptExpr();\n    for (;;)\n    {\n      if (l1 != 260                 // 'union'\n       && l1 != 284)                // '|'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 260:                     // 'union'\n        shift(260);                 // 'union'\n        break;\n      default:\n        shift(284);                 // '|'\n      }\n      lookahead1W(266);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_IntersectExceptExpr();\n    }\n    eventHandler.endNonterminal(\"UnionExpr\", e0);\n  }\n\n  function try_UnionExpr()\n  {\n    try_IntersectExceptExpr();\n    for (;;)\n    {\n      if (l1 != 260                 // 'union'\n       && l1 != 284)                // '|'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 260:                     // 'union'\n        shiftT(260);                // 'union'\n        break;\n      default:\n        shiftT(284);                // '|'\n      }\n      lookahead1W(266);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_IntersectExceptExpr();\n    }\n  }\n\n  function parse_IntersectExceptExpr()\n  {\n    eventHandler.startNonterminal(\"IntersectExceptExpr\", e0);\n    parse_InstanceofExpr();\n    for (;;)\n    {\n      lookahead1W(222);             // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n      if (l1 != 132                 // 'except'\n       && l1 != 164)                // 'intersect'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 164:                     // 'intersect'\n        shift(164);                 // 'intersect'\n        break;\n      default:\n        shift(132);                 // 'except'\n      }\n      lookahead1W(266);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_InstanceofExpr();\n    }\n    eventHandler.endNonterminal(\"IntersectExceptExpr\", e0);\n  }\n\n  function try_IntersectExceptExpr()\n  {\n    try_InstanceofExpr();\n    for (;;)\n    {\n      lookahead1W(222);             // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n      if (l1 != 132                 // 'except'\n       && l1 != 164)                // 'intersect'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 164:                     // 'intersect'\n        shiftT(164);                // 'intersect'\n        break;\n      default:\n        shiftT(132);                // 'except'\n      }\n      lookahead1W(266);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_InstanceofExpr();\n    }\n  }\n\n  function parse_InstanceofExpr()\n  {\n    eventHandler.startNonterminal(\"InstanceofExpr\", e0);\n    parse_TreatExpr();\n    lookahead1W(223);               // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n    if (l1 == 162)                  // 'instance'\n    {\n      shift(162);                   // 'instance'\n      lookahead1W(67);              // S^WS | '(:' | 'of'\n      shift(200);                   // 'of'\n      lookahead1W(254);             // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_SequenceType();\n    }\n    eventHandler.endNonterminal(\"InstanceofExpr\", e0);\n  }\n\n  function try_InstanceofExpr()\n  {\n    try_TreatExpr();\n    lookahead1W(223);               // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n    if (l1 == 162)                  // 'instance'\n    {\n      shiftT(162);                  // 'instance'\n      lookahead1W(67);              // S^WS | '(:' | 'of'\n      shiftT(200);                  // 'of'\n      lookahead1W(254);             // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_SequenceType();\n    }\n  }\n\n  function parse_TreatExpr()\n  {\n    eventHandler.startNonterminal(\"TreatExpr\", e0);\n    parse_CastableExpr();\n    lookahead1W(224);               // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n    if (l1 == 254)                  // 'treat'\n    {\n      shift(254);                   // 'treat'\n      lookahead1W(33);              // S^WS | '(:' | 'as'\n      shift(80);                    // 'as'\n      lookahead1W(254);             // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_SequenceType();\n    }\n    eventHandler.endNonterminal(\"TreatExpr\", e0);\n  }\n\n  function try_TreatExpr()\n  {\n    try_CastableExpr();\n    lookahead1W(224);               // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n    if (l1 == 254)                  // 'treat'\n    {\n      shiftT(254);                  // 'treat'\n      lookahead1W(33);              // S^WS | '(:' | 'as'\n      shiftT(80);                   // 'as'\n      lookahead1W(254);             // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_SequenceType();\n    }\n  }\n\n  function parse_CastableExpr()\n  {\n    eventHandler.startNonterminal(\"CastableExpr\", e0);\n    parse_CastExpr();\n    lookahead1W(225);               // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n    if (l1 == 91)                   // 'castable'\n    {\n      shift(91);                    // 'castable'\n      lookahead1W(33);              // S^WS | '(:' | 'as'\n      shift(80);                    // 'as'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_SingleType();\n    }\n    eventHandler.endNonterminal(\"CastableExpr\", e0);\n  }\n\n  function try_CastableExpr()\n  {\n    try_CastExpr();\n    lookahead1W(225);               // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n    if (l1 == 91)                   // 'castable'\n    {\n      shiftT(91);                   // 'castable'\n      lookahead1W(33);              // S^WS | '(:' | 'as'\n      shiftT(80);                   // 'as'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_SingleType();\n    }\n  }\n\n  function parse_CastExpr()\n  {\n    eventHandler.startNonterminal(\"CastExpr\", e0);\n    parse_UnaryExpr();\n    lookahead1W(227);               // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n    if (l1 == 90)                   // 'cast'\n    {\n      shift(90);                    // 'cast'\n      lookahead1W(33);              // S^WS | '(:' | 'as'\n      shift(80);                    // 'as'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_SingleType();\n    }\n    eventHandler.endNonterminal(\"CastExpr\", e0);\n  }\n\n  function try_CastExpr()\n  {\n    try_UnaryExpr();\n    lookahead1W(227);               // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n    if (l1 == 90)                   // 'cast'\n    {\n      shiftT(90);                   // 'cast'\n      lookahead1W(33);              // S^WS | '(:' | 'as'\n      shiftT(80);                   // 'as'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_SingleType();\n    }\n  }\n\n  function parse_UnaryExpr()\n  {\n    eventHandler.startNonterminal(\"UnaryExpr\", e0);\n    for (;;)\n    {\n      lookahead1W(266);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      if (l1 != 41                  // '+'\n       && l1 != 43)                 // '-'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 43:                      // '-'\n        shift(43);                  // '-'\n        break;\n      default:\n        shift(41);                  // '+'\n      }\n    }\n    whitespace();\n    parse_ValueExpr();\n    eventHandler.endNonterminal(\"UnaryExpr\", e0);\n  }\n\n  function try_UnaryExpr()\n  {\n    for (;;)\n    {\n      lookahead1W(266);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      if (l1 != 41                  // '+'\n       && l1 != 43)                 // '-'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 43:                      // '-'\n        shiftT(43);                 // '-'\n        break;\n      default:\n        shiftT(41);                 // '+'\n      }\n    }\n    try_ValueExpr();\n  }\n\n  function parse_ValueExpr()\n  {\n    eventHandler.startNonterminal(\"ValueExpr\", e0);\n    switch (l1)\n    {\n    case 266:                       // 'validate'\n      lookahead2W(188);             // S^WS | '#' | '(' | '(:' | 'lax' | 'strict' | 'type' | '{'\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 89354:                     // 'validate' 'lax'\n    case 125706:                    // 'validate' 'strict'\n    case 132362:                    // 'validate' 'type'\n    case 144138:                    // 'validate' '{'\n      parse_ValidateExpr();\n      break;\n    case 36:                        // '(#'\n      parse_ExtensionExpr();\n      break;\n    default:\n      parse_SimpleMapExpr();\n    }\n    eventHandler.endNonterminal(\"ValueExpr\", e0);\n  }\n\n  function try_ValueExpr()\n  {\n    switch (l1)\n    {\n    case 266:                       // 'validate'\n      lookahead2W(188);             // S^WS | '#' | '(' | '(:' | 'lax' | 'strict' | 'type' | '{'\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 89354:                     // 'validate' 'lax'\n    case 125706:                    // 'validate' 'strict'\n    case 132362:                    // 'validate' 'type'\n    case 144138:                    // 'validate' '{'\n      try_ValidateExpr();\n      break;\n    case 36:                        // '(#'\n      try_ExtensionExpr();\n      break;\n    default:\n      try_SimpleMapExpr();\n    }\n  }\n\n  function parse_SimpleMapExpr()\n  {\n    eventHandler.startNonterminal(\"SimpleMapExpr\", e0);\n    parse_PathExpr();\n    for (;;)\n    {\n      if (l1 != 26)                 // '!'\n      {\n        break;\n      }\n      shift(26);                    // '!'\n      lookahead1W(263);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_PathExpr();\n    }\n    eventHandler.endNonterminal(\"SimpleMapExpr\", e0);\n  }\n\n  function try_SimpleMapExpr()\n  {\n    try_PathExpr();\n    for (;;)\n    {\n      if (l1 != 26)                 // '!'\n      {\n        break;\n      }\n      shiftT(26);                   // '!'\n      lookahead1W(263);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_PathExpr();\n    }\n  }\n\n  function parse_GeneralComp()\n  {\n    eventHandler.startNonterminal(\"GeneralComp\", e0);\n    switch (l1)\n    {\n    case 61:                        // '='\n      shift(61);                    // '='\n      break;\n    case 27:                        // '!='\n      shift(27);                    // '!='\n      break;\n    case 55:                        // '<'\n      shift(55);                    // '<'\n      break;\n    case 59:                        // '<='\n      shift(59);                    // '<='\n      break;\n    case 62:                        // '>'\n      shift(62);                    // '>'\n      break;\n    default:\n      shift(63);                    // '>='\n    }\n    eventHandler.endNonterminal(\"GeneralComp\", e0);\n  }\n\n  function try_GeneralComp()\n  {\n    switch (l1)\n    {\n    case 61:                        // '='\n      shiftT(61);                   // '='\n      break;\n    case 27:                        // '!='\n      shiftT(27);                   // '!='\n      break;\n    case 55:                        // '<'\n      shiftT(55);                   // '<'\n      break;\n    case 59:                        // '<='\n      shiftT(59);                   // '<='\n      break;\n    case 62:                        // '>'\n      shiftT(62);                   // '>'\n      break;\n    default:\n      shiftT(63);                   // '>='\n    }\n  }\n\n  function parse_ValueComp()\n  {\n    eventHandler.startNonterminal(\"ValueComp\", e0);\n    switch (l1)\n    {\n    case 129:                       // 'eq'\n      shift(129);                   // 'eq'\n      break;\n    case 189:                       // 'ne'\n      shift(189);                   // 'ne'\n      break;\n    case 181:                       // 'lt'\n      shift(181);                   // 'lt'\n      break;\n    case 175:                       // 'le'\n      shift(175);                   // 'le'\n      break;\n    case 152:                       // 'gt'\n      shift(152);                   // 'gt'\n      break;\n    default:\n      shift(148);                   // 'ge'\n    }\n    eventHandler.endNonterminal(\"ValueComp\", e0);\n  }\n\n  function try_ValueComp()\n  {\n    switch (l1)\n    {\n    case 129:                       // 'eq'\n      shiftT(129);                  // 'eq'\n      break;\n    case 189:                       // 'ne'\n      shiftT(189);                  // 'ne'\n      break;\n    case 181:                       // 'lt'\n      shiftT(181);                  // 'lt'\n      break;\n    case 175:                       // 'le'\n      shiftT(175);                  // 'le'\n      break;\n    case 152:                       // 'gt'\n      shiftT(152);                  // 'gt'\n      break;\n    default:\n      shiftT(148);                  // 'ge'\n    }\n  }\n\n  function parse_NodeComp()\n  {\n    eventHandler.startNonterminal(\"NodeComp\", e0);\n    switch (l1)\n    {\n    case 166:                       // 'is'\n      shift(166);                   // 'is'\n      break;\n    case 58:                        // '<<'\n      shift(58);                    // '<<'\n      break;\n    default:\n      shift(64);                    // '>>'\n    }\n    eventHandler.endNonterminal(\"NodeComp\", e0);\n  }\n\n  function try_NodeComp()\n  {\n    switch (l1)\n    {\n    case 166:                       // 'is'\n      shiftT(166);                  // 'is'\n      break;\n    case 58:                        // '<<'\n      shiftT(58);                   // '<<'\n      break;\n    default:\n      shiftT(64);                   // '>>'\n    }\n  }\n\n  function parse_ValidateExpr()\n  {\n    eventHandler.startNonterminal(\"ValidateExpr\", e0);\n    shift(266);                     // 'validate'\n    lookahead1W(175);               // S^WS | '(:' | 'lax' | 'strict' | 'type' | '{'\n    if (l1 != 281)                  // '{'\n    {\n      switch (l1)\n      {\n      case 258:                     // 'type'\n        shift(258);                 // 'type'\n        lookahead1W(246);           // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n        whitespace();\n        parse_TypeName();\n        break;\n      default:\n        whitespace();\n        parse_ValidationMode();\n      }\n    }\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    shift(281);                     // '{'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Expr();\n    shift(287);                     // '}'\n    eventHandler.endNonterminal(\"ValidateExpr\", e0);\n  }\n\n  function try_ValidateExpr()\n  {\n    shiftT(266);                    // 'validate'\n    lookahead1W(175);               // S^WS | '(:' | 'lax' | 'strict' | 'type' | '{'\n    if (l1 != 281)                  // '{'\n    {\n      switch (l1)\n      {\n      case 258:                     // 'type'\n        shiftT(258);                // 'type'\n        lookahead1W(246);           // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n        try_TypeName();\n        break;\n      default:\n        try_ValidationMode();\n      }\n    }\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    shiftT(281);                    // '{'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Expr();\n    shiftT(287);                    // '}'\n  }\n\n  function parse_ValidationMode()\n  {\n    eventHandler.startNonterminal(\"ValidationMode\", e0);\n    switch (l1)\n    {\n    case 174:                       // 'lax'\n      shift(174);                   // 'lax'\n      break;\n    default:\n      shift(245);                   // 'strict'\n    }\n    eventHandler.endNonterminal(\"ValidationMode\", e0);\n  }\n\n  function try_ValidationMode()\n  {\n    switch (l1)\n    {\n    case 174:                       // 'lax'\n      shiftT(174);                  // 'lax'\n      break;\n    default:\n      shiftT(245);                  // 'strict'\n    }\n  }\n\n  function parse_ExtensionExpr()\n  {\n    eventHandler.startNonterminal(\"ExtensionExpr\", e0);\n    for (;;)\n    {\n      whitespace();\n      parse_Pragma();\n      lookahead1W(104);             // S^WS | '(#' | '(:' | '{'\n      if (l1 != 36)                 // '(#'\n      {\n        break;\n      }\n    }\n    shift(281);                     // '{'\n    lookahead1W(275);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    if (l1 != 287)                  // '}'\n    {\n      whitespace();\n      parse_Expr();\n    }\n    shift(287);                     // '}'\n    eventHandler.endNonterminal(\"ExtensionExpr\", e0);\n  }\n\n  function try_ExtensionExpr()\n  {\n    for (;;)\n    {\n      try_Pragma();\n      lookahead1W(104);             // S^WS | '(#' | '(:' | '{'\n      if (l1 != 36)                 // '(#'\n      {\n        break;\n      }\n    }\n    shiftT(281);                    // '{'\n    lookahead1W(275);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    if (l1 != 287)                  // '}'\n    {\n      try_Expr();\n    }\n    shiftT(287);                    // '}'\n  }\n\n  function parse_Pragma()\n  {\n    eventHandler.startNonterminal(\"Pragma\", e0);\n    shift(36);                      // '(#'\n    lookahead1(243);                // EQName^Token | S | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' |\n    if (l1 == 21)                   // S\n    {\n      shift(21);                    // S\n    }\n    parse_EQName();\n    lookahead1(10);                 // S | '#)'\n    if (l1 == 21)                   // S\n    {\n      shift(21);                    // S\n      lookahead1(0);                // PragmaContents\n      shift(1);                     // PragmaContents\n    }\n    lookahead1(5);                  // '#)'\n    shift(30);                      // '#)'\n    eventHandler.endNonterminal(\"Pragma\", e0);\n  }\n\n  function try_Pragma()\n  {\n    shiftT(36);                     // '(#'\n    lookahead1(243);                // EQName^Token | S | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' |\n    if (l1 == 21)                   // S\n    {\n      shiftT(21);                   // S\n    }\n    try_EQName();\n    lookahead1(10);                 // S | '#)'\n    if (l1 == 21)                   // S\n    {\n      shiftT(21);                   // S\n      lookahead1(0);                // PragmaContents\n      shiftT(1);                    // PragmaContents\n    }\n    lookahead1(5);                  // '#)'\n    shiftT(30);                     // '#)'\n  }\n\n  function parse_PathExpr()\n  {\n    eventHandler.startNonterminal(\"PathExpr\", e0);\n    switch (l1)\n    {\n    case 47:                        // '/'\n      shift(47);                    // '/'\n      lookahead1W(289);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      switch (l1)\n      {\n      case 25:                      // EOF\n      case 26:                      // '!'\n      case 27:                      // '!='\n      case 38:                      // ')'\n      case 39:                      // '*'\n      case 41:                      // '+'\n      case 42:                      // ','\n      case 43:                      // '-'\n      case 50:                      // ':'\n      case 54:                      // ';'\n      case 58:                      // '<<'\n      case 59:                      // '<='\n      case 61:                      // '='\n      case 62:                      // '>'\n      case 63:                      // '>='\n      case 64:                      // '>>'\n      case 70:                      // ']'\n      case 88:                      // 'by'\n      case 100:                     // 'contains'\n      case 209:                     // 'paragraphs'\n      case 237:                     // 'sentences'\n      case 252:                     // 'times'\n      case 279:                     // 'words'\n      case 284:                     // '|'\n      case 285:                     // '||'\n      case 286:                     // '|}'\n      case 287:                     // '}'\n        break;\n      default:\n        whitespace();\n        parse_RelativePathExpr();\n      }\n      break;\n    case 48:                        // '//'\n      shift(48);                    // '//'\n      lookahead1W(260);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_RelativePathExpr();\n      break;\n    default:\n      parse_RelativePathExpr();\n    }\n    eventHandler.endNonterminal(\"PathExpr\", e0);\n  }\n\n  function try_PathExpr()\n  {\n    switch (l1)\n    {\n    case 47:                        // '/'\n      shiftT(47);                   // '/'\n      lookahead1W(289);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      switch (l1)\n      {\n      case 25:                      // EOF\n      case 26:                      // '!'\n      case 27:                      // '!='\n      case 38:                      // ')'\n      case 39:                      // '*'\n      case 41:                      // '+'\n      case 42:                      // ','\n      case 43:                      // '-'\n      case 50:                      // ':'\n      case 54:                      // ';'\n      case 58:                      // '<<'\n      case 59:                      // '<='\n      case 61:                      // '='\n      case 62:                      // '>'\n      case 63:                      // '>='\n      case 64:                      // '>>'\n      case 70:                      // ']'\n      case 88:                      // 'by'\n      case 100:                     // 'contains'\n      case 209:                     // 'paragraphs'\n      case 237:                     // 'sentences'\n      case 252:                     // 'times'\n      case 279:                     // 'words'\n      case 284:                     // '|'\n      case 285:                     // '||'\n      case 286:                     // '|}'\n      case 287:                     // '}'\n        break;\n      default:\n        try_RelativePathExpr();\n      }\n      break;\n    case 48:                        // '//'\n      shiftT(48);                   // '//'\n      lookahead1W(260);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_RelativePathExpr();\n      break;\n    default:\n      try_RelativePathExpr();\n    }\n  }\n\n  function parse_RelativePathExpr()\n  {\n    eventHandler.startNonterminal(\"RelativePathExpr\", e0);\n    parse_PostfixExpr();\n    for (;;)\n    {\n      switch (l1)\n      {\n      case 26:                      // '!'\n        lookahead2W(265);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk != 25                  // EOF\n       && lk != 27                  // '!='\n       && lk != 38                  // ')'\n       && lk != 39                  // '*'\n       && lk != 41                  // '+'\n       && lk != 42                  // ','\n       && lk != 43                  // '-'\n       && lk != 47                  // '/'\n       && lk != 48                  // '//'\n       && lk != 50                  // ':'\n       && lk != 54                  // ';'\n       && lk != 55                  // '<'\n       && lk != 58                  // '<<'\n       && lk != 59                  // '<='\n       && lk != 61                  // '='\n       && lk != 62                  // '>'\n       && lk != 63                  // '>='\n       && lk != 64                  // '>>'\n       && lk != 70                  // ']'\n       && lk != 71                  // 'after'\n       && lk != 76                  // 'and'\n       && lk != 80                  // 'as'\n       && lk != 81                  // 'ascending'\n       && lk != 82                  // 'at'\n       && lk != 85                  // 'before'\n       && lk != 88                  // 'by'\n       && lk != 89                  // 'case'\n       && lk != 90                  // 'cast'\n       && lk != 91                  // 'castable'\n       && lk != 95                  // 'collation'\n       && lk != 100                 // 'contains'\n       && lk != 106                 // 'count'\n       && lk != 110                 // 'default'\n       && lk != 114                 // 'descending'\n       && lk != 119                 // 'div'\n       && lk != 123                 // 'else'\n       && lk != 124                 // 'empty'\n       && lk != 127                 // 'end'\n       && lk != 129                 // 'eq'\n       && lk != 132                 // 'except'\n       && lk != 139                 // 'for'\n       && lk != 148                 // 'ge'\n       && lk != 150                 // 'group'\n       && lk != 152                 // 'gt'\n       && lk != 153                 // 'idiv'\n       && lk != 162                 // 'instance'\n       && lk != 164                 // 'intersect'\n       && lk != 165                 // 'into'\n       && lk != 166                 // 'is'\n       && lk != 175                 // 'le'\n       && lk != 177                 // 'let'\n       && lk != 181                 // 'lt'\n       && lk != 183                 // 'mod'\n       && lk != 184                 // 'modify'\n       && lk != 189                 // 'ne'\n       && lk != 202                 // 'only'\n       && lk != 204                 // 'or'\n       && lk != 205                 // 'order'\n       && lk != 209                 // 'paragraphs'\n       && lk != 224                 // 'return'\n       && lk != 228                 // 'satisfies'\n       && lk != 237                 // 'sentences'\n       && lk != 241                 // 'stable'\n       && lk != 242                 // 'start'\n       && lk != 252                 // 'times'\n       && lk != 253                 // 'to'\n       && lk != 254                 // 'treat'\n       && lk != 260                 // 'union'\n       && lk != 272                 // 'where'\n       && lk != 276                 // 'with'\n       && lk != 279                 // 'words'\n       && lk != 284                 // '|'\n       && lk != 285                 // '||'\n       && lk != 286                 // '|}'\n       && lk != 287                 // '}'\n       && lk != 2586                // '!' Wildcard\n       && lk != 23578               // '!' '..'\n       && lk != 24090               // '!' '/'\n       && lk != 24602               // '!' '//'\n       && lk != 34330)              // '!' '@'\n      {\n        lk = memoized(3, e0);\n        if (lk == 0)\n        {\n          var b0A = b0; var e0A = e0; var l1A = l1;\n          var b1A = b1; var e1A = e1; var l2A = l2;\n          var b2A = b2; var e2A = e2;\n          try\n          {\n            switch (l1)\n            {\n            case 47:                // '/'\n              shiftT(47);           // '/'\n              break;\n            case 48:                // '//'\n              shiftT(48);           // '//'\n              break;\n            default:\n              shiftT(26);           // '!'\n            }\n            lookahead1W(264);       // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n            try_StepExpr();\n            lk = -1;\n          }\n          catch (p1A)\n          {\n            lk = -2;\n          }\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(3, e0, lk);\n        }\n      }\n      if (lk != -1\n       && lk != 47                  // '/'\n       && lk != 48                  // '//'\n       && lk != 2586                // '!' Wildcard\n       && lk != 23578               // '!' '..'\n       && lk != 34330)              // '!' '@'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 47:                      // '/'\n        shift(47);                  // '/'\n        break;\n      case 48:                      // '//'\n        shift(48);                  // '//'\n        break;\n      default:\n        shift(26);                  // '!'\n      }\n      lookahead1W(264);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_StepExpr();\n    }\n    eventHandler.endNonterminal(\"RelativePathExpr\", e0);\n  }\n\n  function try_RelativePathExpr()\n  {\n    try_PostfixExpr();\n    for (;;)\n    {\n      switch (l1)\n      {\n      case 26:                      // '!'\n        lookahead2W(265);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk != 25                  // EOF\n       && lk != 27                  // '!='\n       && lk != 38                  // ')'\n       && lk != 39                  // '*'\n       && lk != 41                  // '+'\n       && lk != 42                  // ','\n       && lk != 43                  // '-'\n       && lk != 47                  // '/'\n       && lk != 48                  // '//'\n       && lk != 50                  // ':'\n       && lk != 54                  // ';'\n       && lk != 55                  // '<'\n       && lk != 58                  // '<<'\n       && lk != 59                  // '<='\n       && lk != 61                  // '='\n       && lk != 62                  // '>'\n       && lk != 63                  // '>='\n       && lk != 64                  // '>>'\n       && lk != 70                  // ']'\n       && lk != 71                  // 'after'\n       && lk != 76                  // 'and'\n       && lk != 80                  // 'as'\n       && lk != 81                  // 'ascending'\n       && lk != 82                  // 'at'\n       && lk != 85                  // 'before'\n       && lk != 88                  // 'by'\n       && lk != 89                  // 'case'\n       && lk != 90                  // 'cast'\n       && lk != 91                  // 'castable'\n       && lk != 95                  // 'collation'\n       && lk != 100                 // 'contains'\n       && lk != 106                 // 'count'\n       && lk != 110                 // 'default'\n       && lk != 114                 // 'descending'\n       && lk != 119                 // 'div'\n       && lk != 123                 // 'else'\n       && lk != 124                 // 'empty'\n       && lk != 127                 // 'end'\n       && lk != 129                 // 'eq'\n       && lk != 132                 // 'except'\n       && lk != 139                 // 'for'\n       && lk != 148                 // 'ge'\n       && lk != 150                 // 'group'\n       && lk != 152                 // 'gt'\n       && lk != 153                 // 'idiv'\n       && lk != 162                 // 'instance'\n       && lk != 164                 // 'intersect'\n       && lk != 165                 // 'into'\n       && lk != 166                 // 'is'\n       && lk != 175                 // 'le'\n       && lk != 177                 // 'let'\n       && lk != 181                 // 'lt'\n       && lk != 183                 // 'mod'\n       && lk != 184                 // 'modify'\n       && lk != 189                 // 'ne'\n       && lk != 202                 // 'only'\n       && lk != 204                 // 'or'\n       && lk != 205                 // 'order'\n       && lk != 209                 // 'paragraphs'\n       && lk != 224                 // 'return'\n       && lk != 228                 // 'satisfies'\n       && lk != 237                 // 'sentences'\n       && lk != 241                 // 'stable'\n       && lk != 242                 // 'start'\n       && lk != 252                 // 'times'\n       && lk != 253                 // 'to'\n       && lk != 254                 // 'treat'\n       && lk != 260                 // 'union'\n       && lk != 272                 // 'where'\n       && lk != 276                 // 'with'\n       && lk != 279                 // 'words'\n       && lk != 284                 // '|'\n       && lk != 285                 // '||'\n       && lk != 286                 // '|}'\n       && lk != 287                 // '}'\n       && lk != 2586                // '!' Wildcard\n       && lk != 23578               // '!' '..'\n       && lk != 24090               // '!' '/'\n       && lk != 24602               // '!' '//'\n       && lk != 34330)              // '!' '@'\n      {\n        lk = memoized(3, e0);\n        if (lk == 0)\n        {\n          var b0A = b0; var e0A = e0; var l1A = l1;\n          var b1A = b1; var e1A = e1; var l2A = l2;\n          var b2A = b2; var e2A = e2;\n          try\n          {\n            switch (l1)\n            {\n            case 47:                // '/'\n              shiftT(47);           // '/'\n              break;\n            case 48:                // '//'\n              shiftT(48);           // '//'\n              break;\n            default:\n              shiftT(26);           // '!'\n            }\n            lookahead1W(264);       // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n            try_StepExpr();\n            memoize(3, e0A, -1);\n            continue;\n          }\n          catch (p1A)\n          {\n            b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n            b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n            b2 = b2A; e2 = e2A; end = e2A; }}\n            memoize(3, e0A, -2);\n            break;\n          }\n        }\n      }\n      if (lk != -1\n       && lk != 47                  // '/'\n       && lk != 48                  // '//'\n       && lk != 2586                // '!' Wildcard\n       && lk != 23578               // '!' '..'\n       && lk != 34330)              // '!' '@'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 47:                      // '/'\n        shiftT(47);                 // '/'\n        break;\n      case 48:                      // '//'\n        shiftT(48);                 // '//'\n        break;\n      default:\n        shiftT(26);                 // '!'\n      }\n      lookahead1W(264);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_StepExpr();\n    }\n  }\n\n  function parse_StepExpr()\n  {\n    eventHandler.startNonterminal(\"StepExpr\", e0);\n    switch (l1)\n    {\n    case 83:                        // 'attribute'\n      lookahead2W(288);             // EQName^Token | S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' |\n      break;\n    case 122:                       // 'element'\n      lookahead2W(287);             // EQName^Token | S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' |\n      break;\n    case 187:                       // 'namespace'\n    case 220:                       // 'processing-instruction'\n      lookahead2W(285);             // NCName^Token | S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' |\n      break;\n    case 135:                       // 'false'\n    case 197:                       // 'null'\n    case 255:                       // 'true'\n      lookahead2W(237);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '.' |\n      break;\n    case 97:                        // 'comment'\n    case 120:                       // 'document'\n    case 206:                       // 'ordered'\n    case 249:                       // 'text'\n    case 262:                       // 'unordered'\n      lookahead2W(239);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    case 79:                        // 'array'\n    case 125:                       // 'empty-sequence'\n    case 154:                       // 'if'\n    case 167:                       // 'item'\n    case 169:                       // 'json-item'\n    case 247:                       // 'structured-item'\n    case 248:                       // 'switch'\n    case 259:                       // 'typeswitch'\n      lookahead2W(230);             // S^WS | EOF | '!' | '!=' | '#' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' |\n      break;\n    case 74:                        // 'ancestor'\n    case 75:                        // 'ancestor-or-self'\n    case 94:                        // 'child'\n    case 112:                       // 'descendant'\n    case 113:                       // 'descendant-or-self'\n    case 137:                       // 'following'\n    case 138:                       // 'following-sibling'\n    case 210:                       // 'parent'\n    case 216:                       // 'preceding'\n    case 217:                       // 'preceding-sibling'\n    case 234:                       // 'self'\n      lookahead2W(238);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    case 6:                         // EQName^Token\n    case 71:                        // 'after'\n    case 73:                        // 'allowing'\n    case 76:                        // 'and'\n    case 78:                        // 'append'\n    case 80:                        // 'as'\n    case 81:                        // 'ascending'\n    case 82:                        // 'at'\n    case 84:                        // 'base-uri'\n    case 85:                        // 'before'\n    case 86:                        // 'boundary-space'\n    case 87:                        // 'break'\n    case 89:                        // 'case'\n    case 90:                        // 'cast'\n    case 91:                        // 'castable'\n    case 92:                        // 'catch'\n    case 95:                        // 'collation'\n    case 98:                        // 'constraint'\n    case 99:                        // 'construction'\n    case 102:                       // 'context'\n    case 103:                       // 'continue'\n    case 104:                       // 'copy'\n    case 105:                       // 'copy-namespaces'\n    case 106:                       // 'count'\n    case 107:                       // 'decimal-format'\n    case 109:                       // 'declare'\n    case 110:                       // 'default'\n    case 111:                       // 'delete'\n    case 114:                       // 'descending'\n    case 119:                       // 'div'\n    case 121:                       // 'document-node'\n    case 123:                       // 'else'\n    case 124:                       // 'empty'\n    case 126:                       // 'encoding'\n    case 127:                       // 'end'\n    case 129:                       // 'eq'\n    case 130:                       // 'every'\n    case 132:                       // 'except'\n    case 133:                       // 'exit'\n    case 134:                       // 'external'\n    case 136:                       // 'first'\n    case 139:                       // 'for'\n    case 142:                       // 'from'\n    case 143:                       // 'ft-option'\n    case 147:                       // 'function'\n    case 148:                       // 'ge'\n    case 150:                       // 'group'\n    case 152:                       // 'gt'\n    case 153:                       // 'idiv'\n    case 155:                       // 'import'\n    case 156:                       // 'in'\n    case 157:                       // 'index'\n    case 161:                       // 'insert'\n    case 162:                       // 'instance'\n    case 163:                       // 'integrity'\n    case 164:                       // 'intersect'\n    case 165:                       // 'into'\n    case 166:                       // 'is'\n    case 168:                       // 'json'\n    case 170:                       // 'jsoniq'\n    case 173:                       // 'last'\n    case 174:                       // 'lax'\n    case 175:                       // 'le'\n    case 177:                       // 'let'\n    case 179:                       // 'loop'\n    case 181:                       // 'lt'\n    case 183:                       // 'mod'\n    case 184:                       // 'modify'\n    case 185:                       // 'module'\n    case 188:                       // 'namespace-node'\n    case 189:                       // 'ne'\n    case 194:                       // 'node'\n    case 195:                       // 'nodes'\n    case 198:                       // 'object'\n    case 202:                       // 'only'\n    case 203:                       // 'option'\n    case 204:                       // 'or'\n    case 205:                       // 'order'\n    case 207:                       // 'ordering'\n    case 222:                       // 'rename'\n    case 223:                       // 'replace'\n    case 224:                       // 'return'\n    case 225:                       // 'returning'\n    case 226:                       // 'revalidation'\n    case 228:                       // 'satisfies'\n    case 229:                       // 'schema'\n    case 230:                       // 'schema-attribute'\n    case 231:                       // 'schema-element'\n    case 232:                       // 'score'\n    case 233:                       // 'select'\n    case 239:                       // 'sliding'\n    case 240:                       // 'some'\n    case 241:                       // 'stable'\n    case 242:                       // 'start'\n    case 245:                       // 'strict'\n    case 253:                       // 'to'\n    case 254:                       // 'treat'\n    case 256:                       // 'try'\n    case 257:                       // 'tumbling'\n    case 258:                       // 'type'\n    case 260:                       // 'union'\n    case 263:                       // 'updating'\n    case 266:                       // 'validate'\n    case 267:                       // 'value'\n    case 268:                       // 'variable'\n    case 269:                       // 'version'\n    case 272:                       // 'where'\n    case 273:                       // 'while'\n    case 276:                       // 'with'\n      lookahead2W(234);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 12935                 // 'false' EOF\n     || lk == 12997                 // 'null' EOF\n     || lk == 13055                 // 'true' EOF\n     || lk == 13447                 // 'false' '!'\n     || lk == 13509                 // 'null' '!'\n     || lk == 13567                 // 'true' '!'\n     || lk == 13959                 // 'false' '!='\n     || lk == 14021                 // 'null' '!='\n     || lk == 14079                 // 'true' '!='\n     || lk == 19591                 // 'false' ')'\n     || lk == 19653                 // 'null' ')'\n     || lk == 19711                 // 'true' ')'\n     || lk == 20103                 // 'false' '*'\n     || lk == 20165                 // 'null' '*'\n     || lk == 20223                 // 'true' '*'\n     || lk == 21127                 // 'false' '+'\n     || lk == 21189                 // 'null' '+'\n     || lk == 21247                 // 'true' '+'\n     || lk == 21639                 // 'false' ','\n     || lk == 21701                 // 'null' ','\n     || lk == 21759                 // 'true' ','\n     || lk == 22151                 // 'false' '-'\n     || lk == 22213                 // 'null' '-'\n     || lk == 22271                 // 'true' '-'\n     || lk == 24199                 // 'false' '/'\n     || lk == 24261                 // 'null' '/'\n     || lk == 24319                 // 'true' '/'\n     || lk == 24711                 // 'false' '//'\n     || lk == 24773                 // 'null' '//'\n     || lk == 24831                 // 'true' '//'\n     || lk == 25735                 // 'false' ':'\n     || lk == 25797                 // 'null' ':'\n     || lk == 25855                 // 'true' ':'\n     || lk == 27783                 // 'false' ';'\n     || lk == 27845                 // 'null' ';'\n     || lk == 27903                 // 'true' ';'\n     || lk == 28295                 // 'false' '<'\n     || lk == 28357                 // 'null' '<'\n     || lk == 28415                 // 'true' '<'\n     || lk == 29831                 // 'false' '<<'\n     || lk == 29893                 // 'null' '<<'\n     || lk == 29951                 // 'true' '<<'\n     || lk == 30343                 // 'false' '<='\n     || lk == 30405                 // 'null' '<='\n     || lk == 30463                 // 'true' '<='\n     || lk == 31367                 // 'false' '='\n     || lk == 31429                 // 'null' '='\n     || lk == 31487                 // 'true' '='\n     || lk == 31879                 // 'false' '>'\n     || lk == 31941                 // 'null' '>'\n     || lk == 31999                 // 'true' '>'\n     || lk == 32391                 // 'false' '>='\n     || lk == 32453                 // 'null' '>='\n     || lk == 32511                 // 'true' '>='\n     || lk == 32903                 // 'false' '>>'\n     || lk == 32965                 // 'null' '>>'\n     || lk == 33023                 // 'true' '>>'\n     || lk == 35463                 // 'false' '['\n     || lk == 35525                 // 'null' '['\n     || lk == 35583                 // 'true' '['\n     || lk == 35975                 // 'false' ']'\n     || lk == 36037                 // 'null' ']'\n     || lk == 36095                 // 'true' ']'\n     || lk == 36435                 // 'attribute' 'after'\n     || lk == 36474                 // 'element' 'after'\n     || lk == 36487                 // 'false' 'after'\n     || lk == 36539                 // 'namespace' 'after'\n     || lk == 36549                 // 'null' 'after'\n     || lk == 36572                 // 'processing-instruction' 'after'\n     || lk == 36607                 // 'true' 'after'\n     || lk == 38995                 // 'attribute' 'and'\n     || lk == 39034                 // 'element' 'and'\n     || lk == 39047                 // 'false' 'and'\n     || lk == 39099                 // 'namespace' 'and'\n     || lk == 39109                 // 'null' 'and'\n     || lk == 39132                 // 'processing-instruction' 'and'\n     || lk == 39167                 // 'true' 'and'\n     || lk == 41043                 // 'attribute' 'as'\n     || lk == 41082                 // 'element' 'as'\n     || lk == 41095                 // 'false' 'as'\n     || lk == 41147                 // 'namespace' 'as'\n     || lk == 41157                 // 'null' 'as'\n     || lk == 41180                 // 'processing-instruction' 'as'\n     || lk == 41215                 // 'true' 'as'\n     || lk == 41555                 // 'attribute' 'ascending'\n     || lk == 41594                 // 'element' 'ascending'\n     || lk == 41607                 // 'false' 'ascending'\n     || lk == 41659                 // 'namespace' 'ascending'\n     || lk == 41669                 // 'null' 'ascending'\n     || lk == 41692                 // 'processing-instruction' 'ascending'\n     || lk == 41727                 // 'true' 'ascending'\n     || lk == 42067                 // 'attribute' 'at'\n     || lk == 42106                 // 'element' 'at'\n     || lk == 42119                 // 'false' 'at'\n     || lk == 42171                 // 'namespace' 'at'\n     || lk == 42181                 // 'null' 'at'\n     || lk == 42204                 // 'processing-instruction' 'at'\n     || lk == 42239                 // 'true' 'at'\n     || lk == 43603                 // 'attribute' 'before'\n     || lk == 43642                 // 'element' 'before'\n     || lk == 43655                 // 'false' 'before'\n     || lk == 43707                 // 'namespace' 'before'\n     || lk == 43717                 // 'null' 'before'\n     || lk == 43740                 // 'processing-instruction' 'before'\n     || lk == 43775                 // 'true' 'before'\n     || lk == 45191                 // 'false' 'by'\n     || lk == 45253                 // 'null' 'by'\n     || lk == 45311                 // 'true' 'by'\n     || lk == 45651                 // 'attribute' 'case'\n     || lk == 45690                 // 'element' 'case'\n     || lk == 45703                 // 'false' 'case'\n     || lk == 45755                 // 'namespace' 'case'\n     || lk == 45765                 // 'null' 'case'\n     || lk == 45788                 // 'processing-instruction' 'case'\n     || lk == 45823                 // 'true' 'case'\n     || lk == 46163                 // 'attribute' 'cast'\n     || lk == 46202                 // 'element' 'cast'\n     || lk == 46215                 // 'false' 'cast'\n     || lk == 46267                 // 'namespace' 'cast'\n     || lk == 46277                 // 'null' 'cast'\n     || lk == 46300                 // 'processing-instruction' 'cast'\n     || lk == 46335                 // 'true' 'cast'\n     || lk == 46675                 // 'attribute' 'castable'\n     || lk == 46714                 // 'element' 'castable'\n     || lk == 46727                 // 'false' 'castable'\n     || lk == 46779                 // 'namespace' 'castable'\n     || lk == 46789                 // 'null' 'castable'\n     || lk == 46812                 // 'processing-instruction' 'castable'\n     || lk == 46847                 // 'true' 'castable'\n     || lk == 48723                 // 'attribute' 'collation'\n     || lk == 48762                 // 'element' 'collation'\n     || lk == 48775                 // 'false' 'collation'\n     || lk == 48827                 // 'namespace' 'collation'\n     || lk == 48837                 // 'null' 'collation'\n     || lk == 48860                 // 'processing-instruction' 'collation'\n     || lk == 48895                 // 'true' 'collation'\n     || lk == 51335                 // 'false' 'contains'\n     || lk == 51397                 // 'null' 'contains'\n     || lk == 51455                 // 'true' 'contains'\n     || lk == 54355                 // 'attribute' 'count'\n     || lk == 54394                 // 'element' 'count'\n     || lk == 54407                 // 'false' 'count'\n     || lk == 54459                 // 'namespace' 'count'\n     || lk == 54469                 // 'null' 'count'\n     || lk == 54492                 // 'processing-instruction' 'count'\n     || lk == 54527                 // 'true' 'count'\n     || lk == 56403                 // 'attribute' 'default'\n     || lk == 56442                 // 'element' 'default'\n     || lk == 56455                 // 'false' 'default'\n     || lk == 56507                 // 'namespace' 'default'\n     || lk == 56517                 // 'null' 'default'\n     || lk == 56540                 // 'processing-instruction' 'default'\n     || lk == 56575                 // 'true' 'default'\n     || lk == 58451                 // 'attribute' 'descending'\n     || lk == 58490                 // 'element' 'descending'\n     || lk == 58503                 // 'false' 'descending'\n     || lk == 58555                 // 'namespace' 'descending'\n     || lk == 58565                 // 'null' 'descending'\n     || lk == 58588                 // 'processing-instruction' 'descending'\n     || lk == 58623                 // 'true' 'descending'\n     || lk == 61011                 // 'attribute' 'div'\n     || lk == 61050                 // 'element' 'div'\n     || lk == 61063                 // 'false' 'div'\n     || lk == 61115                 // 'namespace' 'div'\n     || lk == 61125                 // 'null' 'div'\n     || lk == 61148                 // 'processing-instruction' 'div'\n     || lk == 61183                 // 'true' 'div'\n     || lk == 63059                 // 'attribute' 'else'\n     || lk == 63098                 // 'element' 'else'\n     || lk == 63111                 // 'false' 'else'\n     || lk == 63163                 // 'namespace' 'else'\n     || lk == 63173                 // 'null' 'else'\n     || lk == 63196                 // 'processing-instruction' 'else'\n     || lk == 63231                 // 'true' 'else'\n     || lk == 63571                 // 'attribute' 'empty'\n     || lk == 63610                 // 'element' 'empty'\n     || lk == 63623                 // 'false' 'empty'\n     || lk == 63675                 // 'namespace' 'empty'\n     || lk == 63685                 // 'null' 'empty'\n     || lk == 63708                 // 'processing-instruction' 'empty'\n     || lk == 63743                 // 'true' 'empty'\n     || lk == 65107                 // 'attribute' 'end'\n     || lk == 65146                 // 'element' 'end'\n     || lk == 65159                 // 'false' 'end'\n     || lk == 65211                 // 'namespace' 'end'\n     || lk == 65221                 // 'null' 'end'\n     || lk == 65244                 // 'processing-instruction' 'end'\n     || lk == 65279                 // 'true' 'end'\n     || lk == 66131                 // 'attribute' 'eq'\n     || lk == 66170                 // 'element' 'eq'\n     || lk == 66183                 // 'false' 'eq'\n     || lk == 66235                 // 'namespace' 'eq'\n     || lk == 66245                 // 'null' 'eq'\n     || lk == 66268                 // 'processing-instruction' 'eq'\n     || lk == 66303                 // 'true' 'eq'\n     || lk == 67667                 // 'attribute' 'except'\n     || lk == 67706                 // 'element' 'except'\n     || lk == 67719                 // 'false' 'except'\n     || lk == 67771                 // 'namespace' 'except'\n     || lk == 67781                 // 'null' 'except'\n     || lk == 67804                 // 'processing-instruction' 'except'\n     || lk == 67839                 // 'true' 'except'\n     || lk == 71251                 // 'attribute' 'for'\n     || lk == 71290                 // 'element' 'for'\n     || lk == 71303                 // 'false' 'for'\n     || lk == 71355                 // 'namespace' 'for'\n     || lk == 71365                 // 'null' 'for'\n     || lk == 71388                 // 'processing-instruction' 'for'\n     || lk == 71423                 // 'true' 'for'\n     || lk == 75859                 // 'attribute' 'ge'\n     || lk == 75898                 // 'element' 'ge'\n     || lk == 75911                 // 'false' 'ge'\n     || lk == 75963                 // 'namespace' 'ge'\n     || lk == 75973                 // 'null' 'ge'\n     || lk == 75996                 // 'processing-instruction' 'ge'\n     || lk == 76031                 // 'true' 'ge'\n     || lk == 76883                 // 'attribute' 'group'\n     || lk == 76922                 // 'element' 'group'\n     || lk == 76935                 // 'false' 'group'\n     || lk == 76987                 // 'namespace' 'group'\n     || lk == 76997                 // 'null' 'group'\n     || lk == 77020                 // 'processing-instruction' 'group'\n     || lk == 77055                 // 'true' 'group'\n     || lk == 77907                 // 'attribute' 'gt'\n     || lk == 77946                 // 'element' 'gt'\n     || lk == 77959                 // 'false' 'gt'\n     || lk == 78011                 // 'namespace' 'gt'\n     || lk == 78021                 // 'null' 'gt'\n     || lk == 78044                 // 'processing-instruction' 'gt'\n     || lk == 78079                 // 'true' 'gt'\n     || lk == 78419                 // 'attribute' 'idiv'\n     || lk == 78458                 // 'element' 'idiv'\n     || lk == 78471                 // 'false' 'idiv'\n     || lk == 78523                 // 'namespace' 'idiv'\n     || lk == 78533                 // 'null' 'idiv'\n     || lk == 78556                 // 'processing-instruction' 'idiv'\n     || lk == 78591                 // 'true' 'idiv'\n     || lk == 83027                 // 'attribute' 'instance'\n     || lk == 83066                 // 'element' 'instance'\n     || lk == 83079                 // 'false' 'instance'\n     || lk == 83131                 // 'namespace' 'instance'\n     || lk == 83141                 // 'null' 'instance'\n     || lk == 83164                 // 'processing-instruction' 'instance'\n     || lk == 83199                 // 'true' 'instance'\n     || lk == 84051                 // 'attribute' 'intersect'\n     || lk == 84090                 // 'element' 'intersect'\n     || lk == 84103                 // 'false' 'intersect'\n     || lk == 84155                 // 'namespace' 'intersect'\n     || lk == 84165                 // 'null' 'intersect'\n     || lk == 84188                 // 'processing-instruction' 'intersect'\n     || lk == 84223                 // 'true' 'intersect'\n     || lk == 84563                 // 'attribute' 'into'\n     || lk == 84602                 // 'element' 'into'\n     || lk == 84615                 // 'false' 'into'\n     || lk == 84667                 // 'namespace' 'into'\n     || lk == 84677                 // 'null' 'into'\n     || lk == 84700                 // 'processing-instruction' 'into'\n     || lk == 84735                 // 'true' 'into'\n     || lk == 85075                 // 'attribute' 'is'\n     || lk == 85114                 // 'element' 'is'\n     || lk == 85127                 // 'false' 'is'\n     || lk == 85179                 // 'namespace' 'is'\n     || lk == 85189                 // 'null' 'is'\n     || lk == 85212                 // 'processing-instruction' 'is'\n     || lk == 85247                 // 'true' 'is'\n     || lk == 89683                 // 'attribute' 'le'\n     || lk == 89722                 // 'element' 'le'\n     || lk == 89735                 // 'false' 'le'\n     || lk == 89787                 // 'namespace' 'le'\n     || lk == 89797                 // 'null' 'le'\n     || lk == 89820                 // 'processing-instruction' 'le'\n     || lk == 89855                 // 'true' 'le'\n     || lk == 90707                 // 'attribute' 'let'\n     || lk == 90746                 // 'element' 'let'\n     || lk == 90759                 // 'false' 'let'\n     || lk == 90811                 // 'namespace' 'let'\n     || lk == 90821                 // 'null' 'let'\n     || lk == 90844                 // 'processing-instruction' 'let'\n     || lk == 90879                 // 'true' 'let'\n     || lk == 92755                 // 'attribute' 'lt'\n     || lk == 92794                 // 'element' 'lt'\n     || lk == 92807                 // 'false' 'lt'\n     || lk == 92859                 // 'namespace' 'lt'\n     || lk == 92869                 // 'null' 'lt'\n     || lk == 92892                 // 'processing-instruction' 'lt'\n     || lk == 92927                 // 'true' 'lt'\n     || lk == 93779                 // 'attribute' 'mod'\n     || lk == 93818                 // 'element' 'mod'\n     || lk == 93831                 // 'false' 'mod'\n     || lk == 93883                 // 'namespace' 'mod'\n     || lk == 93893                 // 'null' 'mod'\n     || lk == 93916                 // 'processing-instruction' 'mod'\n     || lk == 93951                 // 'true' 'mod'\n     || lk == 94291                 // 'attribute' 'modify'\n     || lk == 94330                 // 'element' 'modify'\n     || lk == 94343                 // 'false' 'modify'\n     || lk == 94395                 // 'namespace' 'modify'\n     || lk == 94405                 // 'null' 'modify'\n     || lk == 94428                 // 'processing-instruction' 'modify'\n     || lk == 94463                 // 'true' 'modify'\n     || lk == 96851                 // 'attribute' 'ne'\n     || lk == 96890                 // 'element' 'ne'\n     || lk == 96903                 // 'false' 'ne'\n     || lk == 96955                 // 'namespace' 'ne'\n     || lk == 96965                 // 'null' 'ne'\n     || lk == 96988                 // 'processing-instruction' 'ne'\n     || lk == 97023                 // 'true' 'ne'\n     || lk == 103507                // 'attribute' 'only'\n     || lk == 103546                // 'element' 'only'\n     || lk == 103559                // 'false' 'only'\n     || lk == 103611                // 'namespace' 'only'\n     || lk == 103621                // 'null' 'only'\n     || lk == 103644                // 'processing-instruction' 'only'\n     || lk == 103679                // 'true' 'only'\n     || lk == 104531                // 'attribute' 'or'\n     || lk == 104570                // 'element' 'or'\n     || lk == 104583                // 'false' 'or'\n     || lk == 104635                // 'namespace' 'or'\n     || lk == 104645                // 'null' 'or'\n     || lk == 104668                // 'processing-instruction' 'or'\n     || lk == 104703                // 'true' 'or'\n     || lk == 105043                // 'attribute' 'order'\n     || lk == 105082                // 'element' 'order'\n     || lk == 105095                // 'false' 'order'\n     || lk == 105147                // 'namespace' 'order'\n     || lk == 105157                // 'null' 'order'\n     || lk == 105180                // 'processing-instruction' 'order'\n     || lk == 105215                // 'true' 'order'\n     || lk == 107143                // 'false' 'paragraphs'\n     || lk == 107205                // 'null' 'paragraphs'\n     || lk == 107263                // 'true' 'paragraphs'\n     || lk == 114771                // 'attribute' 'return'\n     || lk == 114810                // 'element' 'return'\n     || lk == 114823                // 'false' 'return'\n     || lk == 114875                // 'namespace' 'return'\n     || lk == 114885                // 'null' 'return'\n     || lk == 114908                // 'processing-instruction' 'return'\n     || lk == 114943                // 'true' 'return'\n     || lk == 116819                // 'attribute' 'satisfies'\n     || lk == 116858                // 'element' 'satisfies'\n     || lk == 116871                // 'false' 'satisfies'\n     || lk == 116923                // 'namespace' 'satisfies'\n     || lk == 116933                // 'null' 'satisfies'\n     || lk == 116956                // 'processing-instruction' 'satisfies'\n     || lk == 116991                // 'true' 'satisfies'\n     || lk == 121479                // 'false' 'sentences'\n     || lk == 121541                // 'null' 'sentences'\n     || lk == 121599                // 'true' 'sentences'\n     || lk == 123475                // 'attribute' 'stable'\n     || lk == 123514                // 'element' 'stable'\n     || lk == 123527                // 'false' 'stable'\n     || lk == 123579                // 'namespace' 'stable'\n     || lk == 123589                // 'null' 'stable'\n     || lk == 123612                // 'processing-instruction' 'stable'\n     || lk == 123647                // 'true' 'stable'\n     || lk == 123987                // 'attribute' 'start'\n     || lk == 124026                // 'element' 'start'\n     || lk == 124039                // 'false' 'start'\n     || lk == 124091                // 'namespace' 'start'\n     || lk == 124101                // 'null' 'start'\n     || lk == 124124                // 'processing-instruction' 'start'\n     || lk == 124159                // 'true' 'start'\n     || lk == 129159                // 'false' 'times'\n     || lk == 129221                // 'null' 'times'\n     || lk == 129279                // 'true' 'times'\n     || lk == 129619                // 'attribute' 'to'\n     || lk == 129658                // 'element' 'to'\n     || lk == 129671                // 'false' 'to'\n     || lk == 129723                // 'namespace' 'to'\n     || lk == 129733                // 'null' 'to'\n     || lk == 129756                // 'processing-instruction' 'to'\n     || lk == 129791                // 'true' 'to'\n     || lk == 130131                // 'attribute' 'treat'\n     || lk == 130170                // 'element' 'treat'\n     || lk == 130183                // 'false' 'treat'\n     || lk == 130235                // 'namespace' 'treat'\n     || lk == 130245                // 'null' 'treat'\n     || lk == 130268                // 'processing-instruction' 'treat'\n     || lk == 130303                // 'true' 'treat'\n     || lk == 133203                // 'attribute' 'union'\n     || lk == 133242                // 'element' 'union'\n     || lk == 133255                // 'false' 'union'\n     || lk == 133307                // 'namespace' 'union'\n     || lk == 133317                // 'null' 'union'\n     || lk == 133340                // 'processing-instruction' 'union'\n     || lk == 133375                // 'true' 'union'\n     || lk == 139347                // 'attribute' 'where'\n     || lk == 139386                // 'element' 'where'\n     || lk == 139399                // 'false' 'where'\n     || lk == 139451                // 'namespace' 'where'\n     || lk == 139461                // 'null' 'where'\n     || lk == 139484                // 'processing-instruction' 'where'\n     || lk == 139519                // 'true' 'where'\n     || lk == 141395                // 'attribute' 'with'\n     || lk == 141434                // 'element' 'with'\n     || lk == 141447                // 'false' 'with'\n     || lk == 141499                // 'namespace' 'with'\n     || lk == 141509                // 'null' 'with'\n     || lk == 141532                // 'processing-instruction' 'with'\n     || lk == 141567                // 'true' 'with'\n     || lk == 142983                // 'false' 'words'\n     || lk == 143045                // 'null' 'words'\n     || lk == 143103                // 'true' 'words'\n     || lk == 145543                // 'false' '|'\n     || lk == 145605                // 'null' '|'\n     || lk == 145663                // 'true' '|'\n     || lk == 146055                // 'false' '||'\n     || lk == 146117                // 'null' '||'\n     || lk == 146175                // 'true' '||'\n     || lk == 146567                // 'false' '|}'\n     || lk == 146629                // 'null' '|}'\n     || lk == 146687                // 'true' '|}'\n     || lk == 147079                // 'false' '}'\n     || lk == 147141                // 'null' '}'\n     || lk == 147199)               // 'true' '}'\n    {\n      lk = memoized(4, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_PostfixExpr();\n          lk = -1;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n        }\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(4, e0, lk);\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n    case 8:                         // IntegerLiteral\n    case 9:                         // DecimalLiteral\n    case 10:                        // DoubleLiteral\n    case 11:                        // StringLiteral\n    case 31:                        // '$'\n    case 32:                        // '$$'\n    case 33:                        // '%'\n    case 35:                        // '('\n    case 55:                        // '<'\n    case 56:                        // '<!--'\n    case 60:                        // '<?'\n    case 69:                        // '['\n    case 281:                       // '{'\n    case 283:                       // '{|'\n    case 3155:                      // 'attribute' EQName^Token\n    case 3194:                      // 'element' EQName^Token\n    case 9915:                      // 'namespace' NCName^Token\n    case 9948:                      // 'processing-instruction' NCName^Token\n    case 14854:                     // EQName^Token '#'\n    case 14919:                     // 'after' '#'\n    case 14921:                     // 'allowing' '#'\n    case 14922:                     // 'ancestor' '#'\n    case 14923:                     // 'ancestor-or-self' '#'\n    case 14924:                     // 'and' '#'\n    case 14926:                     // 'append' '#'\n    case 14927:                     // 'array' '#'\n    case 14928:                     // 'as' '#'\n    case 14929:                     // 'ascending' '#'\n    case 14930:                     // 'at' '#'\n    case 14931:                     // 'attribute' '#'\n    case 14932:                     // 'base-uri' '#'\n    case 14933:                     // 'before' '#'\n    case 14934:                     // 'boundary-space' '#'\n    case 14935:                     // 'break' '#'\n    case 14937:                     // 'case' '#'\n    case 14938:                     // 'cast' '#'\n    case 14939:                     // 'castable' '#'\n    case 14940:                     // 'catch' '#'\n    case 14942:                     // 'child' '#'\n    case 14943:                     // 'collation' '#'\n    case 14945:                     // 'comment' '#'\n    case 14946:                     // 'constraint' '#'\n    case 14947:                     // 'construction' '#'\n    case 14950:                     // 'context' '#'\n    case 14951:                     // 'continue' '#'\n    case 14952:                     // 'copy' '#'\n    case 14953:                     // 'copy-namespaces' '#'\n    case 14954:                     // 'count' '#'\n    case 14955:                     // 'decimal-format' '#'\n    case 14957:                     // 'declare' '#'\n    case 14958:                     // 'default' '#'\n    case 14959:                     // 'delete' '#'\n    case 14960:                     // 'descendant' '#'\n    case 14961:                     // 'descendant-or-self' '#'\n    case 14962:                     // 'descending' '#'\n    case 14967:                     // 'div' '#'\n    case 14968:                     // 'document' '#'\n    case 14969:                     // 'document-node' '#'\n    case 14970:                     // 'element' '#'\n    case 14971:                     // 'else' '#'\n    case 14972:                     // 'empty' '#'\n    case 14973:                     // 'empty-sequence' '#'\n    case 14974:                     // 'encoding' '#'\n    case 14975:                     // 'end' '#'\n    case 14977:                     // 'eq' '#'\n    case 14978:                     // 'every' '#'\n    case 14980:                     // 'except' '#'\n    case 14981:                     // 'exit' '#'\n    case 14982:                     // 'external' '#'\n    case 14983:                     // 'false' '#'\n    case 14984:                     // 'first' '#'\n    case 14985:                     // 'following' '#'\n    case 14986:                     // 'following-sibling' '#'\n    case 14987:                     // 'for' '#'\n    case 14990:                     // 'from' '#'\n    case 14991:                     // 'ft-option' '#'\n    case 14995:                     // 'function' '#'\n    case 14996:                     // 'ge' '#'\n    case 14998:                     // 'group' '#'\n    case 15000:                     // 'gt' '#'\n    case 15001:                     // 'idiv' '#'\n    case 15002:                     // 'if' '#'\n    case 15003:                     // 'import' '#'\n    case 15004:                     // 'in' '#'\n    case 15005:                     // 'index' '#'\n    case 15009:                     // 'insert' '#'\n    case 15010:                     // 'instance' '#'\n    case 15011:                     // 'integrity' '#'\n    case 15012:                     // 'intersect' '#'\n    case 15013:                     // 'into' '#'\n    case 15014:                     // 'is' '#'\n    case 15015:                     // 'item' '#'\n    case 15016:                     // 'json' '#'\n    case 15017:                     // 'json-item' '#'\n    case 15018:                     // 'jsoniq' '#'\n    case 15021:                     // 'last' '#'\n    case 15022:                     // 'lax' '#'\n    case 15023:                     // 'le' '#'\n    case 15025:                     // 'let' '#'\n    case 15027:                     // 'loop' '#'\n    case 15029:                     // 'lt' '#'\n    case 15031:                     // 'mod' '#'\n    case 15032:                     // 'modify' '#'\n    case 15033:                     // 'module' '#'\n    case 15035:                     // 'namespace' '#'\n    case 15036:                     // 'namespace-node' '#'\n    case 15037:                     // 'ne' '#'\n    case 15042:                     // 'node' '#'\n    case 15043:                     // 'nodes' '#'\n    case 15045:                     // 'null' '#'\n    case 15046:                     // 'object' '#'\n    case 15050:                     // 'only' '#'\n    case 15051:                     // 'option' '#'\n    case 15052:                     // 'or' '#'\n    case 15053:                     // 'order' '#'\n    case 15054:                     // 'ordered' '#'\n    case 15055:                     // 'ordering' '#'\n    case 15058:                     // 'parent' '#'\n    case 15064:                     // 'preceding' '#'\n    case 15065:                     // 'preceding-sibling' '#'\n    case 15068:                     // 'processing-instruction' '#'\n    case 15070:                     // 'rename' '#'\n    case 15071:                     // 'replace' '#'\n    case 15072:                     // 'return' '#'\n    case 15073:                     // 'returning' '#'\n    case 15074:                     // 'revalidation' '#'\n    case 15076:                     // 'satisfies' '#'\n    case 15077:                     // 'schema' '#'\n    case 15078:                     // 'schema-attribute' '#'\n    case 15079:                     // 'schema-element' '#'\n    case 15080:                     // 'score' '#'\n    case 15081:                     // 'select' '#'\n    case 15082:                     // 'self' '#'\n    case 15087:                     // 'sliding' '#'\n    case 15088:                     // 'some' '#'\n    case 15089:                     // 'stable' '#'\n    case 15090:                     // 'start' '#'\n    case 15093:                     // 'strict' '#'\n    case 15095:                     // 'structured-item' '#'\n    case 15096:                     // 'switch' '#'\n    case 15097:                     // 'text' '#'\n    case 15101:                     // 'to' '#'\n    case 15102:                     // 'treat' '#'\n    case 15103:                     // 'true' '#'\n    case 15104:                     // 'try' '#'\n    case 15105:                     // 'tumbling' '#'\n    case 15106:                     // 'type' '#'\n    case 15107:                     // 'typeswitch' '#'\n    case 15108:                     // 'union' '#'\n    case 15110:                     // 'unordered' '#'\n    case 15111:                     // 'updating' '#'\n    case 15114:                     // 'validate' '#'\n    case 15115:                     // 'value' '#'\n    case 15116:                     // 'variable' '#'\n    case 15117:                     // 'version' '#'\n    case 15120:                     // 'where' '#'\n    case 15121:                     // 'while' '#'\n    case 15124:                     // 'with' '#'\n    case 17926:                     // EQName^Token '('\n    case 17991:                     // 'after' '('\n    case 17993:                     // 'allowing' '('\n    case 17994:                     // 'ancestor' '('\n    case 17995:                     // 'ancestor-or-self' '('\n    case 17996:                     // 'and' '('\n    case 17998:                     // 'append' '('\n    case 18000:                     // 'as' '('\n    case 18001:                     // 'ascending' '('\n    case 18002:                     // 'at' '('\n    case 18004:                     // 'base-uri' '('\n    case 18005:                     // 'before' '('\n    case 18006:                     // 'boundary-space' '('\n    case 18007:                     // 'break' '('\n    case 18009:                     // 'case' '('\n    case 18010:                     // 'cast' '('\n    case 18011:                     // 'castable' '('\n    case 18012:                     // 'catch' '('\n    case 18014:                     // 'child' '('\n    case 18015:                     // 'collation' '('\n    case 18018:                     // 'constraint' '('\n    case 18019:                     // 'construction' '('\n    case 18022:                     // 'context' '('\n    case 18023:                     // 'continue' '('\n    case 18024:                     // 'copy' '('\n    case 18025:                     // 'copy-namespaces' '('\n    case 18026:                     // 'count' '('\n    case 18027:                     // 'decimal-format' '('\n    case 18029:                     // 'declare' '('\n    case 18030:                     // 'default' '('\n    case 18031:                     // 'delete' '('\n    case 18032:                     // 'descendant' '('\n    case 18033:                     // 'descendant-or-self' '('\n    case 18034:                     // 'descending' '('\n    case 18039:                     // 'div' '('\n    case 18040:                     // 'document' '('\n    case 18043:                     // 'else' '('\n    case 18044:                     // 'empty' '('\n    case 18046:                     // 'encoding' '('\n    case 18047:                     // 'end' '('\n    case 18049:                     // 'eq' '('\n    case 18050:                     // 'every' '('\n    case 18052:                     // 'except' '('\n    case 18053:                     // 'exit' '('\n    case 18054:                     // 'external' '('\n    case 18055:                     // 'false' '('\n    case 18056:                     // 'first' '('\n    case 18057:                     // 'following' '('\n    case 18058:                     // 'following-sibling' '('\n    case 18059:                     // 'for' '('\n    case 18062:                     // 'from' '('\n    case 18063:                     // 'ft-option' '('\n    case 18067:                     // 'function' '('\n    case 18068:                     // 'ge' '('\n    case 18070:                     // 'group' '('\n    case 18072:                     // 'gt' '('\n    case 18073:                     // 'idiv' '('\n    case 18075:                     // 'import' '('\n    case 18076:                     // 'in' '('\n    case 18077:                     // 'index' '('\n    case 18081:                     // 'insert' '('\n    case 18082:                     // 'instance' '('\n    case 18083:                     // 'integrity' '('\n    case 18084:                     // 'intersect' '('\n    case 18085:                     // 'into' '('\n    case 18086:                     // 'is' '('\n    case 18088:                     // 'json' '('\n    case 18090:                     // 'jsoniq' '('\n    case 18093:                     // 'last' '('\n    case 18094:                     // 'lax' '('\n    case 18095:                     // 'le' '('\n    case 18097:                     // 'let' '('\n    case 18099:                     // 'loop' '('\n    case 18101:                     // 'lt' '('\n    case 18103:                     // 'mod' '('\n    case 18104:                     // 'modify' '('\n    case 18105:                     // 'module' '('\n    case 18107:                     // 'namespace' '('\n    case 18109:                     // 'ne' '('\n    case 18115:                     // 'nodes' '('\n    case 18117:                     // 'null' '('\n    case 18118:                     // 'object' '('\n    case 18122:                     // 'only' '('\n    case 18123:                     // 'option' '('\n    case 18124:                     // 'or' '('\n    case 18125:                     // 'order' '('\n    case 18126:                     // 'ordered' '('\n    case 18127:                     // 'ordering' '('\n    case 18130:                     // 'parent' '('\n    case 18136:                     // 'preceding' '('\n    case 18137:                     // 'preceding-sibling' '('\n    case 18142:                     // 'rename' '('\n    case 18143:                     // 'replace' '('\n    case 18144:                     // 'return' '('\n    case 18145:                     // 'returning' '('\n    case 18146:                     // 'revalidation' '('\n    case 18148:                     // 'satisfies' '('\n    case 18149:                     // 'schema' '('\n    case 18152:                     // 'score' '('\n    case 18153:                     // 'select' '('\n    case 18154:                     // 'self' '('\n    case 18159:                     // 'sliding' '('\n    case 18160:                     // 'some' '('\n    case 18161:                     // 'stable' '('\n    case 18162:                     // 'start' '('\n    case 18165:                     // 'strict' '('\n    case 18173:                     // 'to' '('\n    case 18174:                     // 'treat' '('\n    case 18175:                     // 'true' '('\n    case 18176:                     // 'try' '('\n    case 18177:                     // 'tumbling' '('\n    case 18178:                     // 'type' '('\n    case 18180:                     // 'union' '('\n    case 18182:                     // 'unordered' '('\n    case 18183:                     // 'updating' '('\n    case 18186:                     // 'validate' '('\n    case 18187:                     // 'value' '('\n    case 18188:                     // 'variable' '('\n    case 18189:                     // 'version' '('\n    case 18192:                     // 'where' '('\n    case 18193:                     // 'while' '('\n    case 18196:                     // 'with' '('\n    case 23175:                     // 'false' '.'\n    case 23237:                     // 'null' '.'\n    case 23295:                     // 'true' '.'\n    case 37459:                     // 'attribute' 'allowing'\n    case 37498:                     // 'element' 'allowing'\n    case 37563:                     // 'namespace' 'allowing'\n    case 37596:                     // 'processing-instruction' 'allowing'\n    case 37971:                     // 'attribute' 'ancestor'\n    case 38010:                     // 'element' 'ancestor'\n    case 38075:                     // 'namespace' 'ancestor'\n    case 38108:                     // 'processing-instruction' 'ancestor'\n    case 38483:                     // 'attribute' 'ancestor-or-self'\n    case 38522:                     // 'element' 'ancestor-or-self'\n    case 38587:                     // 'namespace' 'ancestor-or-self'\n    case 38620:                     // 'processing-instruction' 'ancestor-or-self'\n    case 40019:                     // 'attribute' 'append'\n    case 40058:                     // 'element' 'append'\n    case 40123:                     // 'namespace' 'append'\n    case 40156:                     // 'processing-instruction' 'append'\n    case 40531:                     // 'attribute' 'array'\n    case 40570:                     // 'element' 'array'\n    case 42579:                     // 'attribute' 'attribute'\n    case 42618:                     // 'element' 'attribute'\n    case 42683:                     // 'namespace' 'attribute'\n    case 42716:                     // 'processing-instruction' 'attribute'\n    case 43091:                     // 'attribute' 'base-uri'\n    case 43130:                     // 'element' 'base-uri'\n    case 43195:                     // 'namespace' 'base-uri'\n    case 43228:                     // 'processing-instruction' 'base-uri'\n    case 44115:                     // 'attribute' 'boundary-space'\n    case 44154:                     // 'element' 'boundary-space'\n    case 44219:                     // 'namespace' 'boundary-space'\n    case 44252:                     // 'processing-instruction' 'boundary-space'\n    case 44627:                     // 'attribute' 'break'\n    case 44666:                     // 'element' 'break'\n    case 44731:                     // 'namespace' 'break'\n    case 44764:                     // 'processing-instruction' 'break'\n    case 47187:                     // 'attribute' 'catch'\n    case 47226:                     // 'element' 'catch'\n    case 47291:                     // 'namespace' 'catch'\n    case 47324:                     // 'processing-instruction' 'catch'\n    case 48211:                     // 'attribute' 'child'\n    case 48250:                     // 'element' 'child'\n    case 48315:                     // 'namespace' 'child'\n    case 48348:                     // 'processing-instruction' 'child'\n    case 49747:                     // 'attribute' 'comment'\n    case 49786:                     // 'element' 'comment'\n    case 49851:                     // 'namespace' 'comment'\n    case 49884:                     // 'processing-instruction' 'comment'\n    case 50259:                     // 'attribute' 'constraint'\n    case 50298:                     // 'element' 'constraint'\n    case 50363:                     // 'namespace' 'constraint'\n    case 50396:                     // 'processing-instruction' 'constraint'\n    case 50771:                     // 'attribute' 'construction'\n    case 50810:                     // 'element' 'construction'\n    case 50875:                     // 'namespace' 'construction'\n    case 50908:                     // 'processing-instruction' 'construction'\n    case 52307:                     // 'attribute' 'context'\n    case 52346:                     // 'element' 'context'\n    case 52411:                     // 'namespace' 'context'\n    case 52444:                     // 'processing-instruction' 'context'\n    case 52819:                     // 'attribute' 'continue'\n    case 52858:                     // 'element' 'continue'\n    case 52923:                     // 'namespace' 'continue'\n    case 52956:                     // 'processing-instruction' 'continue'\n    case 53331:                     // 'attribute' 'copy'\n    case 53370:                     // 'element' 'copy'\n    case 53435:                     // 'namespace' 'copy'\n    case 53468:                     // 'processing-instruction' 'copy'\n    case 53843:                     // 'attribute' 'copy-namespaces'\n    case 53882:                     // 'element' 'copy-namespaces'\n    case 53947:                     // 'namespace' 'copy-namespaces'\n    case 53980:                     // 'processing-instruction' 'copy-namespaces'\n    case 54867:                     // 'attribute' 'decimal-format'\n    case 54906:                     // 'element' 'decimal-format'\n    case 54971:                     // 'namespace' 'decimal-format'\n    case 55004:                     // 'processing-instruction' 'decimal-format'\n    case 55891:                     // 'attribute' 'declare'\n    case 55930:                     // 'element' 'declare'\n    case 55995:                     // 'namespace' 'declare'\n    case 56028:                     // 'processing-instruction' 'declare'\n    case 56915:                     // 'attribute' 'delete'\n    case 56954:                     // 'element' 'delete'\n    case 57019:                     // 'namespace' 'delete'\n    case 57052:                     // 'processing-instruction' 'delete'\n    case 57427:                     // 'attribute' 'descendant'\n    case 57466:                     // 'element' 'descendant'\n    case 57531:                     // 'namespace' 'descendant'\n    case 57564:                     // 'processing-instruction' 'descendant'\n    case 57939:                     // 'attribute' 'descendant-or-self'\n    case 57978:                     // 'element' 'descendant-or-self'\n    case 58043:                     // 'namespace' 'descendant-or-self'\n    case 58076:                     // 'processing-instruction' 'descendant-or-self'\n    case 61523:                     // 'attribute' 'document'\n    case 61562:                     // 'element' 'document'\n    case 61627:                     // 'namespace' 'document'\n    case 61660:                     // 'processing-instruction' 'document'\n    case 62035:                     // 'attribute' 'document-node'\n    case 62074:                     // 'element' 'document-node'\n    case 62139:                     // 'namespace' 'document-node'\n    case 62172:                     // 'processing-instruction' 'document-node'\n    case 62547:                     // 'attribute' 'element'\n    case 62586:                     // 'element' 'element'\n    case 62651:                     // 'namespace' 'element'\n    case 62684:                     // 'processing-instruction' 'element'\n    case 64083:                     // 'attribute' 'empty-sequence'\n    case 64122:                     // 'element' 'empty-sequence'\n    case 64187:                     // 'namespace' 'empty-sequence'\n    case 64220:                     // 'processing-instruction' 'empty-sequence'\n    case 64595:                     // 'attribute' 'encoding'\n    case 64634:                     // 'element' 'encoding'\n    case 64699:                     // 'namespace' 'encoding'\n    case 64732:                     // 'processing-instruction' 'encoding'\n    case 66643:                     // 'attribute' 'every'\n    case 66682:                     // 'element' 'every'\n    case 66747:                     // 'namespace' 'every'\n    case 66780:                     // 'processing-instruction' 'every'\n    case 68179:                     // 'attribute' 'exit'\n    case 68218:                     // 'element' 'exit'\n    case 68283:                     // 'namespace' 'exit'\n    case 68316:                     // 'processing-instruction' 'exit'\n    case 68691:                     // 'attribute' 'external'\n    case 68730:                     // 'element' 'external'\n    case 68795:                     // 'namespace' 'external'\n    case 68828:                     // 'processing-instruction' 'external'\n    case 69203:                     // 'attribute' 'false'\n    case 69242:                     // 'element' 'false'\n    case 69307:                     // 'namespace' 'false'\n    case 69340:                     // 'processing-instruction' 'false'\n    case 69715:                     // 'attribute' 'first'\n    case 69754:                     // 'element' 'first'\n    case 69819:                     // 'namespace' 'first'\n    case 69852:                     // 'processing-instruction' 'first'\n    case 70227:                     // 'attribute' 'following'\n    case 70266:                     // 'element' 'following'\n    case 70331:                     // 'namespace' 'following'\n    case 70364:                     // 'processing-instruction' 'following'\n    case 70739:                     // 'attribute' 'following-sibling'\n    case 70778:                     // 'element' 'following-sibling'\n    case 70843:                     // 'namespace' 'following-sibling'\n    case 70876:                     // 'processing-instruction' 'following-sibling'\n    case 72787:                     // 'attribute' 'from'\n    case 72826:                     // 'element' 'from'\n    case 72891:                     // 'namespace' 'from'\n    case 72924:                     // 'processing-instruction' 'from'\n    case 73299:                     // 'attribute' 'ft-option'\n    case 73338:                     // 'element' 'ft-option'\n    case 73403:                     // 'namespace' 'ft-option'\n    case 73436:                     // 'processing-instruction' 'ft-option'\n    case 75347:                     // 'attribute' 'function'\n    case 75386:                     // 'element' 'function'\n    case 75451:                     // 'namespace' 'function'\n    case 75484:                     // 'processing-instruction' 'function'\n    case 78931:                     // 'attribute' 'if'\n    case 78970:                     // 'element' 'if'\n    case 79035:                     // 'namespace' 'if'\n    case 79068:                     // 'processing-instruction' 'if'\n    case 79443:                     // 'attribute' 'import'\n    case 79482:                     // 'element' 'import'\n    case 79547:                     // 'namespace' 'import'\n    case 79580:                     // 'processing-instruction' 'import'\n    case 79955:                     // 'attribute' 'in'\n    case 79994:                     // 'element' 'in'\n    case 80059:                     // 'namespace' 'in'\n    case 80092:                     // 'processing-instruction' 'in'\n    case 80467:                     // 'attribute' 'index'\n    case 80506:                     // 'element' 'index'\n    case 80571:                     // 'namespace' 'index'\n    case 80604:                     // 'processing-instruction' 'index'\n    case 82515:                     // 'attribute' 'insert'\n    case 82554:                     // 'element' 'insert'\n    case 82619:                     // 'namespace' 'insert'\n    case 82652:                     // 'processing-instruction' 'insert'\n    case 83539:                     // 'attribute' 'integrity'\n    case 83578:                     // 'element' 'integrity'\n    case 83643:                     // 'namespace' 'integrity'\n    case 83676:                     // 'processing-instruction' 'integrity'\n    case 85587:                     // 'attribute' 'item'\n    case 85626:                     // 'element' 'item'\n    case 85691:                     // 'namespace' 'item'\n    case 85724:                     // 'processing-instruction' 'item'\n    case 86099:                     // 'attribute' 'json'\n    case 86138:                     // 'element' 'json'\n    case 86203:                     // 'namespace' 'json'\n    case 86236:                     // 'processing-instruction' 'json'\n    case 86611:                     // 'attribute' 'json-item'\n    case 86650:                     // 'element' 'json-item'\n    case 87123:                     // 'attribute' 'jsoniq'\n    case 87162:                     // 'element' 'jsoniq'\n    case 87227:                     // 'namespace' 'jsoniq'\n    case 87260:                     // 'processing-instruction' 'jsoniq'\n    case 88659:                     // 'attribute' 'last'\n    case 88698:                     // 'element' 'last'\n    case 88763:                     // 'namespace' 'last'\n    case 88796:                     // 'processing-instruction' 'last'\n    case 89171:                     // 'attribute' 'lax'\n    case 89210:                     // 'element' 'lax'\n    case 89275:                     // 'namespace' 'lax'\n    case 89308:                     // 'processing-instruction' 'lax'\n    case 91731:                     // 'attribute' 'loop'\n    case 91770:                     // 'element' 'loop'\n    case 91835:                     // 'namespace' 'loop'\n    case 91868:                     // 'processing-instruction' 'loop'\n    case 94803:                     // 'attribute' 'module'\n    case 94842:                     // 'element' 'module'\n    case 94907:                     // 'namespace' 'module'\n    case 94940:                     // 'processing-instruction' 'module'\n    case 95827:                     // 'attribute' 'namespace'\n    case 95866:                     // 'element' 'namespace'\n    case 95931:                     // 'namespace' 'namespace'\n    case 95964:                     // 'processing-instruction' 'namespace'\n    case 96339:                     // 'attribute' 'namespace-node'\n    case 96378:                     // 'element' 'namespace-node'\n    case 96443:                     // 'namespace' 'namespace-node'\n    case 96476:                     // 'processing-instruction' 'namespace-node'\n    case 99411:                     // 'attribute' 'node'\n    case 99450:                     // 'element' 'node'\n    case 99515:                     // 'namespace' 'node'\n    case 99548:                     // 'processing-instruction' 'node'\n    case 99923:                     // 'attribute' 'nodes'\n    case 99962:                     // 'element' 'nodes'\n    case 100027:                    // 'namespace' 'nodes'\n    case 100060:                    // 'processing-instruction' 'nodes'\n    case 100947:                    // 'attribute' 'null'\n    case 100986:                    // 'element' 'null'\n    case 101051:                    // 'namespace' 'null'\n    case 101084:                    // 'processing-instruction' 'null'\n    case 101459:                    // 'attribute' 'object'\n    case 101498:                    // 'element' 'object'\n    case 101563:                    // 'namespace' 'object'\n    case 101596:                    // 'processing-instruction' 'object'\n    case 104019:                    // 'attribute' 'option'\n    case 104058:                    // 'element' 'option'\n    case 104123:                    // 'namespace' 'option'\n    case 104156:                    // 'processing-instruction' 'option'\n    case 105555:                    // 'attribute' 'ordered'\n    case 105594:                    // 'element' 'ordered'\n    case 105659:                    // 'namespace' 'ordered'\n    case 105692:                    // 'processing-instruction' 'ordered'\n    case 106067:                    // 'attribute' 'ordering'\n    case 106106:                    // 'element' 'ordering'\n    case 106171:                    // 'namespace' 'ordering'\n    case 106204:                    // 'processing-instruction' 'ordering'\n    case 107603:                    // 'attribute' 'parent'\n    case 107642:                    // 'element' 'parent'\n    case 107707:                    // 'namespace' 'parent'\n    case 107740:                    // 'processing-instruction' 'parent'\n    case 110675:                    // 'attribute' 'preceding'\n    case 110714:                    // 'element' 'preceding'\n    case 110779:                    // 'namespace' 'preceding'\n    case 110812:                    // 'processing-instruction' 'preceding'\n    case 111187:                    // 'attribute' 'preceding-sibling'\n    case 111226:                    // 'element' 'preceding-sibling'\n    case 111291:                    // 'namespace' 'preceding-sibling'\n    case 111324:                    // 'processing-instruction' 'preceding-sibling'\n    case 112723:                    // 'attribute' 'processing-instruction'\n    case 112762:                    // 'element' 'processing-instruction'\n    case 112827:                    // 'namespace' 'processing-instruction'\n    case 112860:                    // 'processing-instruction' 'processing-instruction'\n    case 113747:                    // 'attribute' 'rename'\n    case 113786:                    // 'element' 'rename'\n    case 113851:                    // 'namespace' 'rename'\n    case 113884:                    // 'processing-instruction' 'rename'\n    case 114259:                    // 'attribute' 'replace'\n    case 114298:                    // 'element' 'replace'\n    case 114363:                    // 'namespace' 'replace'\n    case 114396:                    // 'processing-instruction' 'replace'\n    case 115283:                    // 'attribute' 'returning'\n    case 115322:                    // 'element' 'returning'\n    case 115387:                    // 'namespace' 'returning'\n    case 115420:                    // 'processing-instruction' 'returning'\n    case 115795:                    // 'attribute' 'revalidation'\n    case 115834:                    // 'element' 'revalidation'\n    case 115899:                    // 'namespace' 'revalidation'\n    case 115932:                    // 'processing-instruction' 'revalidation'\n    case 117331:                    // 'attribute' 'schema'\n    case 117370:                    // 'element' 'schema'\n    case 117435:                    // 'namespace' 'schema'\n    case 117468:                    // 'processing-instruction' 'schema'\n    case 117843:                    // 'attribute' 'schema-attribute'\n    case 117882:                    // 'element' 'schema-attribute'\n    case 117947:                    // 'namespace' 'schema-attribute'\n    case 117980:                    // 'processing-instruction' 'schema-attribute'\n    case 118355:                    // 'attribute' 'schema-element'\n    case 118394:                    // 'element' 'schema-element'\n    case 118459:                    // 'namespace' 'schema-element'\n    case 118492:                    // 'processing-instruction' 'schema-element'\n    case 118867:                    // 'attribute' 'score'\n    case 118906:                    // 'element' 'score'\n    case 118971:                    // 'namespace' 'score'\n    case 119004:                    // 'processing-instruction' 'score'\n    case 119379:                    // 'attribute' 'select'\n    case 119418:                    // 'element' 'select'\n    case 119483:                    // 'namespace' 'select'\n    case 119516:                    // 'processing-instruction' 'select'\n    case 119891:                    // 'attribute' 'self'\n    case 119930:                    // 'element' 'self'\n    case 119995:                    // 'namespace' 'self'\n    case 120028:                    // 'processing-instruction' 'self'\n    case 122451:                    // 'attribute' 'sliding'\n    case 122490:                    // 'element' 'sliding'\n    case 122555:                    // 'namespace' 'sliding'\n    case 122588:                    // 'processing-instruction' 'sliding'\n    case 122963:                    // 'attribute' 'some'\n    case 123002:                    // 'element' 'some'\n    case 123067:                    // 'namespace' 'some'\n    case 123100:                    // 'processing-instruction' 'some'\n    case 125523:                    // 'attribute' 'strict'\n    case 125562:                    // 'element' 'strict'\n    case 125627:                    // 'namespace' 'strict'\n    case 125660:                    // 'processing-instruction' 'strict'\n    case 126547:                    // 'attribute' 'structured-item'\n    case 126586:                    // 'element' 'structured-item'\n    case 127059:                    // 'attribute' 'switch'\n    case 127098:                    // 'element' 'switch'\n    case 127163:                    // 'namespace' 'switch'\n    case 127196:                    // 'processing-instruction' 'switch'\n    case 127571:                    // 'attribute' 'text'\n    case 127610:                    // 'element' 'text'\n    case 127675:                    // 'namespace' 'text'\n    case 127708:                    // 'processing-instruction' 'text'\n    case 130643:                    // 'attribute' 'true'\n    case 130682:                    // 'element' 'true'\n    case 130747:                    // 'namespace' 'true'\n    case 130780:                    // 'processing-instruction' 'true'\n    case 131155:                    // 'attribute' 'try'\n    case 131194:                    // 'element' 'try'\n    case 131259:                    // 'namespace' 'try'\n    case 131292:                    // 'processing-instruction' 'try'\n    case 131667:                    // 'attribute' 'tumbling'\n    case 131706:                    // 'element' 'tumbling'\n    case 131771:                    // 'namespace' 'tumbling'\n    case 131804:                    // 'processing-instruction' 'tumbling'\n    case 132179:                    // 'attribute' 'type'\n    case 132218:                    // 'element' 'type'\n    case 132283:                    // 'namespace' 'type'\n    case 132316:                    // 'processing-instruction' 'type'\n    case 132691:                    // 'attribute' 'typeswitch'\n    case 132730:                    // 'element' 'typeswitch'\n    case 132795:                    // 'namespace' 'typeswitch'\n    case 132828:                    // 'processing-instruction' 'typeswitch'\n    case 134227:                    // 'attribute' 'unordered'\n    case 134266:                    // 'element' 'unordered'\n    case 134331:                    // 'namespace' 'unordered'\n    case 134364:                    // 'processing-instruction' 'unordered'\n    case 134739:                    // 'attribute' 'updating'\n    case 134778:                    // 'element' 'updating'\n    case 134843:                    // 'namespace' 'updating'\n    case 134876:                    // 'processing-instruction' 'updating'\n    case 136275:                    // 'attribute' 'validate'\n    case 136314:                    // 'element' 'validate'\n    case 136379:                    // 'namespace' 'validate'\n    case 136412:                    // 'processing-instruction' 'validate'\n    case 136787:                    // 'attribute' 'value'\n    case 136826:                    // 'element' 'value'\n    case 136891:                    // 'namespace' 'value'\n    case 136924:                    // 'processing-instruction' 'value'\n    case 137299:                    // 'attribute' 'variable'\n    case 137338:                    // 'element' 'variable'\n    case 137403:                    // 'namespace' 'variable'\n    case 137436:                    // 'processing-instruction' 'variable'\n    case 137811:                    // 'attribute' 'version'\n    case 137850:                    // 'element' 'version'\n    case 137915:                    // 'namespace' 'version'\n    case 137948:                    // 'processing-instruction' 'version'\n    case 139859:                    // 'attribute' 'while'\n    case 139898:                    // 'element' 'while'\n    case 139963:                    // 'namespace' 'while'\n    case 139996:                    // 'processing-instruction' 'while'\n    case 143955:                    // 'attribute' '{'\n    case 143969:                    // 'comment' '{'\n    case 143992:                    // 'document' '{'\n    case 143994:                    // 'element' '{'\n    case 144059:                    // 'namespace' '{'\n    case 144078:                    // 'ordered' '{'\n    case 144092:                    // 'processing-instruction' '{'\n    case 144121:                    // 'text' '{'\n    case 144134:                    // 'unordered' '{'\n      parse_PostfixExpr();\n      break;\n    default:\n      parse_AxisStep();\n    }\n    eventHandler.endNonterminal(\"StepExpr\", e0);\n  }\n\n  function try_StepExpr()\n  {\n    switch (l1)\n    {\n    case 83:                        // 'attribute'\n      lookahead2W(288);             // EQName^Token | S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' |\n      break;\n    case 122:                       // 'element'\n      lookahead2W(287);             // EQName^Token | S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' |\n      break;\n    case 187:                       // 'namespace'\n    case 220:                       // 'processing-instruction'\n      lookahead2W(285);             // NCName^Token | S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' |\n      break;\n    case 135:                       // 'false'\n    case 197:                       // 'null'\n    case 255:                       // 'true'\n      lookahead2W(237);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '.' |\n      break;\n    case 97:                        // 'comment'\n    case 120:                       // 'document'\n    case 206:                       // 'ordered'\n    case 249:                       // 'text'\n    case 262:                       // 'unordered'\n      lookahead2W(239);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    case 79:                        // 'array'\n    case 125:                       // 'empty-sequence'\n    case 154:                       // 'if'\n    case 167:                       // 'item'\n    case 169:                       // 'json-item'\n    case 247:                       // 'structured-item'\n    case 248:                       // 'switch'\n    case 259:                       // 'typeswitch'\n      lookahead2W(230);             // S^WS | EOF | '!' | '!=' | '#' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' |\n      break;\n    case 74:                        // 'ancestor'\n    case 75:                        // 'ancestor-or-self'\n    case 94:                        // 'child'\n    case 112:                       // 'descendant'\n    case 113:                       // 'descendant-or-self'\n    case 137:                       // 'following'\n    case 138:                       // 'following-sibling'\n    case 210:                       // 'parent'\n    case 216:                       // 'preceding'\n    case 217:                       // 'preceding-sibling'\n    case 234:                       // 'self'\n      lookahead2W(238);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    case 6:                         // EQName^Token\n    case 71:                        // 'after'\n    case 73:                        // 'allowing'\n    case 76:                        // 'and'\n    case 78:                        // 'append'\n    case 80:                        // 'as'\n    case 81:                        // 'ascending'\n    case 82:                        // 'at'\n    case 84:                        // 'base-uri'\n    case 85:                        // 'before'\n    case 86:                        // 'boundary-space'\n    case 87:                        // 'break'\n    case 89:                        // 'case'\n    case 90:                        // 'cast'\n    case 91:                        // 'castable'\n    case 92:                        // 'catch'\n    case 95:                        // 'collation'\n    case 98:                        // 'constraint'\n    case 99:                        // 'construction'\n    case 102:                       // 'context'\n    case 103:                       // 'continue'\n    case 104:                       // 'copy'\n    case 105:                       // 'copy-namespaces'\n    case 106:                       // 'count'\n    case 107:                       // 'decimal-format'\n    case 109:                       // 'declare'\n    case 110:                       // 'default'\n    case 111:                       // 'delete'\n    case 114:                       // 'descending'\n    case 119:                       // 'div'\n    case 121:                       // 'document-node'\n    case 123:                       // 'else'\n    case 124:                       // 'empty'\n    case 126:                       // 'encoding'\n    case 127:                       // 'end'\n    case 129:                       // 'eq'\n    case 130:                       // 'every'\n    case 132:                       // 'except'\n    case 133:                       // 'exit'\n    case 134:                       // 'external'\n    case 136:                       // 'first'\n    case 139:                       // 'for'\n    case 142:                       // 'from'\n    case 143:                       // 'ft-option'\n    case 147:                       // 'function'\n    case 148:                       // 'ge'\n    case 150:                       // 'group'\n    case 152:                       // 'gt'\n    case 153:                       // 'idiv'\n    case 155:                       // 'import'\n    case 156:                       // 'in'\n    case 157:                       // 'index'\n    case 161:                       // 'insert'\n    case 162:                       // 'instance'\n    case 163:                       // 'integrity'\n    case 164:                       // 'intersect'\n    case 165:                       // 'into'\n    case 166:                       // 'is'\n    case 168:                       // 'json'\n    case 170:                       // 'jsoniq'\n    case 173:                       // 'last'\n    case 174:                       // 'lax'\n    case 175:                       // 'le'\n    case 177:                       // 'let'\n    case 179:                       // 'loop'\n    case 181:                       // 'lt'\n    case 183:                       // 'mod'\n    case 184:                       // 'modify'\n    case 185:                       // 'module'\n    case 188:                       // 'namespace-node'\n    case 189:                       // 'ne'\n    case 194:                       // 'node'\n    case 195:                       // 'nodes'\n    case 198:                       // 'object'\n    case 202:                       // 'only'\n    case 203:                       // 'option'\n    case 204:                       // 'or'\n    case 205:                       // 'order'\n    case 207:                       // 'ordering'\n    case 222:                       // 'rename'\n    case 223:                       // 'replace'\n    case 224:                       // 'return'\n    case 225:                       // 'returning'\n    case 226:                       // 'revalidation'\n    case 228:                       // 'satisfies'\n    case 229:                       // 'schema'\n    case 230:                       // 'schema-attribute'\n    case 231:                       // 'schema-element'\n    case 232:                       // 'score'\n    case 233:                       // 'select'\n    case 239:                       // 'sliding'\n    case 240:                       // 'some'\n    case 241:                       // 'stable'\n    case 242:                       // 'start'\n    case 245:                       // 'strict'\n    case 253:                       // 'to'\n    case 254:                       // 'treat'\n    case 256:                       // 'try'\n    case 257:                       // 'tumbling'\n    case 258:                       // 'type'\n    case 260:                       // 'union'\n    case 263:                       // 'updating'\n    case 266:                       // 'validate'\n    case 267:                       // 'value'\n    case 268:                       // 'variable'\n    case 269:                       // 'version'\n    case 272:                       // 'where'\n    case 273:                       // 'while'\n    case 276:                       // 'with'\n      lookahead2W(234);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 12935                 // 'false' EOF\n     || lk == 12997                 // 'null' EOF\n     || lk == 13055                 // 'true' EOF\n     || lk == 13447                 // 'false' '!'\n     || lk == 13509                 // 'null' '!'\n     || lk == 13567                 // 'true' '!'\n     || lk == 13959                 // 'false' '!='\n     || lk == 14021                 // 'null' '!='\n     || lk == 14079                 // 'true' '!='\n     || lk == 19591                 // 'false' ')'\n     || lk == 19653                 // 'null' ')'\n     || lk == 19711                 // 'true' ')'\n     || lk == 20103                 // 'false' '*'\n     || lk == 20165                 // 'null' '*'\n     || lk == 20223                 // 'true' '*'\n     || lk == 21127                 // 'false' '+'\n     || lk == 21189                 // 'null' '+'\n     || lk == 21247                 // 'true' '+'\n     || lk == 21639                 // 'false' ','\n     || lk == 21701                 // 'null' ','\n     || lk == 21759                 // 'true' ','\n     || lk == 22151                 // 'false' '-'\n     || lk == 22213                 // 'null' '-'\n     || lk == 22271                 // 'true' '-'\n     || lk == 24199                 // 'false' '/'\n     || lk == 24261                 // 'null' '/'\n     || lk == 24319                 // 'true' '/'\n     || lk == 24711                 // 'false' '//'\n     || lk == 24773                 // 'null' '//'\n     || lk == 24831                 // 'true' '//'\n     || lk == 25735                 // 'false' ':'\n     || lk == 25797                 // 'null' ':'\n     || lk == 25855                 // 'true' ':'\n     || lk == 27783                 // 'false' ';'\n     || lk == 27845                 // 'null' ';'\n     || lk == 27903                 // 'true' ';'\n     || lk == 28295                 // 'false' '<'\n     || lk == 28357                 // 'null' '<'\n     || lk == 28415                 // 'true' '<'\n     || lk == 29831                 // 'false' '<<'\n     || lk == 29893                 // 'null' '<<'\n     || lk == 29951                 // 'true' '<<'\n     || lk == 30343                 // 'false' '<='\n     || lk == 30405                 // 'null' '<='\n     || lk == 30463                 // 'true' '<='\n     || lk == 31367                 // 'false' '='\n     || lk == 31429                 // 'null' '='\n     || lk == 31487                 // 'true' '='\n     || lk == 31879                 // 'false' '>'\n     || lk == 31941                 // 'null' '>'\n     || lk == 31999                 // 'true' '>'\n     || lk == 32391                 // 'false' '>='\n     || lk == 32453                 // 'null' '>='\n     || lk == 32511                 // 'true' '>='\n     || lk == 32903                 // 'false' '>>'\n     || lk == 32965                 // 'null' '>>'\n     || lk == 33023                 // 'true' '>>'\n     || lk == 35463                 // 'false' '['\n     || lk == 35525                 // 'null' '['\n     || lk == 35583                 // 'true' '['\n     || lk == 35975                 // 'false' ']'\n     || lk == 36037                 // 'null' ']'\n     || lk == 36095                 // 'true' ']'\n     || lk == 36435                 // 'attribute' 'after'\n     || lk == 36474                 // 'element' 'after'\n     || lk == 36487                 // 'false' 'after'\n     || lk == 36539                 // 'namespace' 'after'\n     || lk == 36549                 // 'null' 'after'\n     || lk == 36572                 // 'processing-instruction' 'after'\n     || lk == 36607                 // 'true' 'after'\n     || lk == 38995                 // 'attribute' 'and'\n     || lk == 39034                 // 'element' 'and'\n     || lk == 39047                 // 'false' 'and'\n     || lk == 39099                 // 'namespace' 'and'\n     || lk == 39109                 // 'null' 'and'\n     || lk == 39132                 // 'processing-instruction' 'and'\n     || lk == 39167                 // 'true' 'and'\n     || lk == 41043                 // 'attribute' 'as'\n     || lk == 41082                 // 'element' 'as'\n     || lk == 41095                 // 'false' 'as'\n     || lk == 41147                 // 'namespace' 'as'\n     || lk == 41157                 // 'null' 'as'\n     || lk == 41180                 // 'processing-instruction' 'as'\n     || lk == 41215                 // 'true' 'as'\n     || lk == 41555                 // 'attribute' 'ascending'\n     || lk == 41594                 // 'element' 'ascending'\n     || lk == 41607                 // 'false' 'ascending'\n     || lk == 41659                 // 'namespace' 'ascending'\n     || lk == 41669                 // 'null' 'ascending'\n     || lk == 41692                 // 'processing-instruction' 'ascending'\n     || lk == 41727                 // 'true' 'ascending'\n     || lk == 42067                 // 'attribute' 'at'\n     || lk == 42106                 // 'element' 'at'\n     || lk == 42119                 // 'false' 'at'\n     || lk == 42171                 // 'namespace' 'at'\n     || lk == 42181                 // 'null' 'at'\n     || lk == 42204                 // 'processing-instruction' 'at'\n     || lk == 42239                 // 'true' 'at'\n     || lk == 43603                 // 'attribute' 'before'\n     || lk == 43642                 // 'element' 'before'\n     || lk == 43655                 // 'false' 'before'\n     || lk == 43707                 // 'namespace' 'before'\n     || lk == 43717                 // 'null' 'before'\n     || lk == 43740                 // 'processing-instruction' 'before'\n     || lk == 43775                 // 'true' 'before'\n     || lk == 45191                 // 'false' 'by'\n     || lk == 45253                 // 'null' 'by'\n     || lk == 45311                 // 'true' 'by'\n     || lk == 45651                 // 'attribute' 'case'\n     || lk == 45690                 // 'element' 'case'\n     || lk == 45703                 // 'false' 'case'\n     || lk == 45755                 // 'namespace' 'case'\n     || lk == 45765                 // 'null' 'case'\n     || lk == 45788                 // 'processing-instruction' 'case'\n     || lk == 45823                 // 'true' 'case'\n     || lk == 46163                 // 'attribute' 'cast'\n     || lk == 46202                 // 'element' 'cast'\n     || lk == 46215                 // 'false' 'cast'\n     || lk == 46267                 // 'namespace' 'cast'\n     || lk == 46277                 // 'null' 'cast'\n     || lk == 46300                 // 'processing-instruction' 'cast'\n     || lk == 46335                 // 'true' 'cast'\n     || lk == 46675                 // 'attribute' 'castable'\n     || lk == 46714                 // 'element' 'castable'\n     || lk == 46727                 // 'false' 'castable'\n     || lk == 46779                 // 'namespace' 'castable'\n     || lk == 46789                 // 'null' 'castable'\n     || lk == 46812                 // 'processing-instruction' 'castable'\n     || lk == 46847                 // 'true' 'castable'\n     || lk == 48723                 // 'attribute' 'collation'\n     || lk == 48762                 // 'element' 'collation'\n     || lk == 48775                 // 'false' 'collation'\n     || lk == 48827                 // 'namespace' 'collation'\n     || lk == 48837                 // 'null' 'collation'\n     || lk == 48860                 // 'processing-instruction' 'collation'\n     || lk == 48895                 // 'true' 'collation'\n     || lk == 51335                 // 'false' 'contains'\n     || lk == 51397                 // 'null' 'contains'\n     || lk == 51455                 // 'true' 'contains'\n     || lk == 54355                 // 'attribute' 'count'\n     || lk == 54394                 // 'element' 'count'\n     || lk == 54407                 // 'false' 'count'\n     || lk == 54459                 // 'namespace' 'count'\n     || lk == 54469                 // 'null' 'count'\n     || lk == 54492                 // 'processing-instruction' 'count'\n     || lk == 54527                 // 'true' 'count'\n     || lk == 56403                 // 'attribute' 'default'\n     || lk == 56442                 // 'element' 'default'\n     || lk == 56455                 // 'false' 'default'\n     || lk == 56507                 // 'namespace' 'default'\n     || lk == 56517                 // 'null' 'default'\n     || lk == 56540                 // 'processing-instruction' 'default'\n     || lk == 56575                 // 'true' 'default'\n     || lk == 58451                 // 'attribute' 'descending'\n     || lk == 58490                 // 'element' 'descending'\n     || lk == 58503                 // 'false' 'descending'\n     || lk == 58555                 // 'namespace' 'descending'\n     || lk == 58565                 // 'null' 'descending'\n     || lk == 58588                 // 'processing-instruction' 'descending'\n     || lk == 58623                 // 'true' 'descending'\n     || lk == 61011                 // 'attribute' 'div'\n     || lk == 61050                 // 'element' 'div'\n     || lk == 61063                 // 'false' 'div'\n     || lk == 61115                 // 'namespace' 'div'\n     || lk == 61125                 // 'null' 'div'\n     || lk == 61148                 // 'processing-instruction' 'div'\n     || lk == 61183                 // 'true' 'div'\n     || lk == 63059                 // 'attribute' 'else'\n     || lk == 63098                 // 'element' 'else'\n     || lk == 63111                 // 'false' 'else'\n     || lk == 63163                 // 'namespace' 'else'\n     || lk == 63173                 // 'null' 'else'\n     || lk == 63196                 // 'processing-instruction' 'else'\n     || lk == 63231                 // 'true' 'else'\n     || lk == 63571                 // 'attribute' 'empty'\n     || lk == 63610                 // 'element' 'empty'\n     || lk == 63623                 // 'false' 'empty'\n     || lk == 63675                 // 'namespace' 'empty'\n     || lk == 63685                 // 'null' 'empty'\n     || lk == 63708                 // 'processing-instruction' 'empty'\n     || lk == 63743                 // 'true' 'empty'\n     || lk == 65107                 // 'attribute' 'end'\n     || lk == 65146                 // 'element' 'end'\n     || lk == 65159                 // 'false' 'end'\n     || lk == 65211                 // 'namespace' 'end'\n     || lk == 65221                 // 'null' 'end'\n     || lk == 65244                 // 'processing-instruction' 'end'\n     || lk == 65279                 // 'true' 'end'\n     || lk == 66131                 // 'attribute' 'eq'\n     || lk == 66170                 // 'element' 'eq'\n     || lk == 66183                 // 'false' 'eq'\n     || lk == 66235                 // 'namespace' 'eq'\n     || lk == 66245                 // 'null' 'eq'\n     || lk == 66268                 // 'processing-instruction' 'eq'\n     || lk == 66303                 // 'true' 'eq'\n     || lk == 67667                 // 'attribute' 'except'\n     || lk == 67706                 // 'element' 'except'\n     || lk == 67719                 // 'false' 'except'\n     || lk == 67771                 // 'namespace' 'except'\n     || lk == 67781                 // 'null' 'except'\n     || lk == 67804                 // 'processing-instruction' 'except'\n     || lk == 67839                 // 'true' 'except'\n     || lk == 71251                 // 'attribute' 'for'\n     || lk == 71290                 // 'element' 'for'\n     || lk == 71303                 // 'false' 'for'\n     || lk == 71355                 // 'namespace' 'for'\n     || lk == 71365                 // 'null' 'for'\n     || lk == 71388                 // 'processing-instruction' 'for'\n     || lk == 71423                 // 'true' 'for'\n     || lk == 75859                 // 'attribute' 'ge'\n     || lk == 75898                 // 'element' 'ge'\n     || lk == 75911                 // 'false' 'ge'\n     || lk == 75963                 // 'namespace' 'ge'\n     || lk == 75973                 // 'null' 'ge'\n     || lk == 75996                 // 'processing-instruction' 'ge'\n     || lk == 76031                 // 'true' 'ge'\n     || lk == 76883                 // 'attribute' 'group'\n     || lk == 76922                 // 'element' 'group'\n     || lk == 76935                 // 'false' 'group'\n     || lk == 76987                 // 'namespace' 'group'\n     || lk == 76997                 // 'null' 'group'\n     || lk == 77020                 // 'processing-instruction' 'group'\n     || lk == 77055                 // 'true' 'group'\n     || lk == 77907                 // 'attribute' 'gt'\n     || lk == 77946                 // 'element' 'gt'\n     || lk == 77959                 // 'false' 'gt'\n     || lk == 78011                 // 'namespace' 'gt'\n     || lk == 78021                 // 'null' 'gt'\n     || lk == 78044                 // 'processing-instruction' 'gt'\n     || lk == 78079                 // 'true' 'gt'\n     || lk == 78419                 // 'attribute' 'idiv'\n     || lk == 78458                 // 'element' 'idiv'\n     || lk == 78471                 // 'false' 'idiv'\n     || lk == 78523                 // 'namespace' 'idiv'\n     || lk == 78533                 // 'null' 'idiv'\n     || lk == 78556                 // 'processing-instruction' 'idiv'\n     || lk == 78591                 // 'true' 'idiv'\n     || lk == 83027                 // 'attribute' 'instance'\n     || lk == 83066                 // 'element' 'instance'\n     || lk == 83079                 // 'false' 'instance'\n     || lk == 83131                 // 'namespace' 'instance'\n     || lk == 83141                 // 'null' 'instance'\n     || lk == 83164                 // 'processing-instruction' 'instance'\n     || lk == 83199                 // 'true' 'instance'\n     || lk == 84051                 // 'attribute' 'intersect'\n     || lk == 84090                 // 'element' 'intersect'\n     || lk == 84103                 // 'false' 'intersect'\n     || lk == 84155                 // 'namespace' 'intersect'\n     || lk == 84165                 // 'null' 'intersect'\n     || lk == 84188                 // 'processing-instruction' 'intersect'\n     || lk == 84223                 // 'true' 'intersect'\n     || lk == 84563                 // 'attribute' 'into'\n     || lk == 84602                 // 'element' 'into'\n     || lk == 84615                 // 'false' 'into'\n     || lk == 84667                 // 'namespace' 'into'\n     || lk == 84677                 // 'null' 'into'\n     || lk == 84700                 // 'processing-instruction' 'into'\n     || lk == 84735                 // 'true' 'into'\n     || lk == 85075                 // 'attribute' 'is'\n     || lk == 85114                 // 'element' 'is'\n     || lk == 85127                 // 'false' 'is'\n     || lk == 85179                 // 'namespace' 'is'\n     || lk == 85189                 // 'null' 'is'\n     || lk == 85212                 // 'processing-instruction' 'is'\n     || lk == 85247                 // 'true' 'is'\n     || lk == 89683                 // 'attribute' 'le'\n     || lk == 89722                 // 'element' 'le'\n     || lk == 89735                 // 'false' 'le'\n     || lk == 89787                 // 'namespace' 'le'\n     || lk == 89797                 // 'null' 'le'\n     || lk == 89820                 // 'processing-instruction' 'le'\n     || lk == 89855                 // 'true' 'le'\n     || lk == 90707                 // 'attribute' 'let'\n     || lk == 90746                 // 'element' 'let'\n     || lk == 90759                 // 'false' 'let'\n     || lk == 90811                 // 'namespace' 'let'\n     || lk == 90821                 // 'null' 'let'\n     || lk == 90844                 // 'processing-instruction' 'let'\n     || lk == 90879                 // 'true' 'let'\n     || lk == 92755                 // 'attribute' 'lt'\n     || lk == 92794                 // 'element' 'lt'\n     || lk == 92807                 // 'false' 'lt'\n     || lk == 92859                 // 'namespace' 'lt'\n     || lk == 92869                 // 'null' 'lt'\n     || lk == 92892                 // 'processing-instruction' 'lt'\n     || lk == 92927                 // 'true' 'lt'\n     || lk == 93779                 // 'attribute' 'mod'\n     || lk == 93818                 // 'element' 'mod'\n     || lk == 93831                 // 'false' 'mod'\n     || lk == 93883                 // 'namespace' 'mod'\n     || lk == 93893                 // 'null' 'mod'\n     || lk == 93916                 // 'processing-instruction' 'mod'\n     || lk == 93951                 // 'true' 'mod'\n     || lk == 94291                 // 'attribute' 'modify'\n     || lk == 94330                 // 'element' 'modify'\n     || lk == 94343                 // 'false' 'modify'\n     || lk == 94395                 // 'namespace' 'modify'\n     || lk == 94405                 // 'null' 'modify'\n     || lk == 94428                 // 'processing-instruction' 'modify'\n     || lk == 94463                 // 'true' 'modify'\n     || lk == 96851                 // 'attribute' 'ne'\n     || lk == 96890                 // 'element' 'ne'\n     || lk == 96903                 // 'false' 'ne'\n     || lk == 96955                 // 'namespace' 'ne'\n     || lk == 96965                 // 'null' 'ne'\n     || lk == 96988                 // 'processing-instruction' 'ne'\n     || lk == 97023                 // 'true' 'ne'\n     || lk == 103507                // 'attribute' 'only'\n     || lk == 103546                // 'element' 'only'\n     || lk == 103559                // 'false' 'only'\n     || lk == 103611                // 'namespace' 'only'\n     || lk == 103621                // 'null' 'only'\n     || lk == 103644                // 'processing-instruction' 'only'\n     || lk == 103679                // 'true' 'only'\n     || lk == 104531                // 'attribute' 'or'\n     || lk == 104570                // 'element' 'or'\n     || lk == 104583                // 'false' 'or'\n     || lk == 104635                // 'namespace' 'or'\n     || lk == 104645                // 'null' 'or'\n     || lk == 104668                // 'processing-instruction' 'or'\n     || lk == 104703                // 'true' 'or'\n     || lk == 105043                // 'attribute' 'order'\n     || lk == 105082                // 'element' 'order'\n     || lk == 105095                // 'false' 'order'\n     || lk == 105147                // 'namespace' 'order'\n     || lk == 105157                // 'null' 'order'\n     || lk == 105180                // 'processing-instruction' 'order'\n     || lk == 105215                // 'true' 'order'\n     || lk == 107143                // 'false' 'paragraphs'\n     || lk == 107205                // 'null' 'paragraphs'\n     || lk == 107263                // 'true' 'paragraphs'\n     || lk == 114771                // 'attribute' 'return'\n     || lk == 114810                // 'element' 'return'\n     || lk == 114823                // 'false' 'return'\n     || lk == 114875                // 'namespace' 'return'\n     || lk == 114885                // 'null' 'return'\n     || lk == 114908                // 'processing-instruction' 'return'\n     || lk == 114943                // 'true' 'return'\n     || lk == 116819                // 'attribute' 'satisfies'\n     || lk == 116858                // 'element' 'satisfies'\n     || lk == 116871                // 'false' 'satisfies'\n     || lk == 116923                // 'namespace' 'satisfies'\n     || lk == 116933                // 'null' 'satisfies'\n     || lk == 116956                // 'processing-instruction' 'satisfies'\n     || lk == 116991                // 'true' 'satisfies'\n     || lk == 121479                // 'false' 'sentences'\n     || lk == 121541                // 'null' 'sentences'\n     || lk == 121599                // 'true' 'sentences'\n     || lk == 123475                // 'attribute' 'stable'\n     || lk == 123514                // 'element' 'stable'\n     || lk == 123527                // 'false' 'stable'\n     || lk == 123579                // 'namespace' 'stable'\n     || lk == 123589                // 'null' 'stable'\n     || lk == 123612                // 'processing-instruction' 'stable'\n     || lk == 123647                // 'true' 'stable'\n     || lk == 123987                // 'attribute' 'start'\n     || lk == 124026                // 'element' 'start'\n     || lk == 124039                // 'false' 'start'\n     || lk == 124091                // 'namespace' 'start'\n     || lk == 124101                // 'null' 'start'\n     || lk == 124124                // 'processing-instruction' 'start'\n     || lk == 124159                // 'true' 'start'\n     || lk == 129159                // 'false' 'times'\n     || lk == 129221                // 'null' 'times'\n     || lk == 129279                // 'true' 'times'\n     || lk == 129619                // 'attribute' 'to'\n     || lk == 129658                // 'element' 'to'\n     || lk == 129671                // 'false' 'to'\n     || lk == 129723                // 'namespace' 'to'\n     || lk == 129733                // 'null' 'to'\n     || lk == 129756                // 'processing-instruction' 'to'\n     || lk == 129791                // 'true' 'to'\n     || lk == 130131                // 'attribute' 'treat'\n     || lk == 130170                // 'element' 'treat'\n     || lk == 130183                // 'false' 'treat'\n     || lk == 130235                // 'namespace' 'treat'\n     || lk == 130245                // 'null' 'treat'\n     || lk == 130268                // 'processing-instruction' 'treat'\n     || lk == 130303                // 'true' 'treat'\n     || lk == 133203                // 'attribute' 'union'\n     || lk == 133242                // 'element' 'union'\n     || lk == 133255                // 'false' 'union'\n     || lk == 133307                // 'namespace' 'union'\n     || lk == 133317                // 'null' 'union'\n     || lk == 133340                // 'processing-instruction' 'union'\n     || lk == 133375                // 'true' 'union'\n     || lk == 139347                // 'attribute' 'where'\n     || lk == 139386                // 'element' 'where'\n     || lk == 139399                // 'false' 'where'\n     || lk == 139451                // 'namespace' 'where'\n     || lk == 139461                // 'null' 'where'\n     || lk == 139484                // 'processing-instruction' 'where'\n     || lk == 139519                // 'true' 'where'\n     || lk == 141395                // 'attribute' 'with'\n     || lk == 141434                // 'element' 'with'\n     || lk == 141447                // 'false' 'with'\n     || lk == 141499                // 'namespace' 'with'\n     || lk == 141509                // 'null' 'with'\n     || lk == 141532                // 'processing-instruction' 'with'\n     || lk == 141567                // 'true' 'with'\n     || lk == 142983                // 'false' 'words'\n     || lk == 143045                // 'null' 'words'\n     || lk == 143103                // 'true' 'words'\n     || lk == 145543                // 'false' '|'\n     || lk == 145605                // 'null' '|'\n     || lk == 145663                // 'true' '|'\n     || lk == 146055                // 'false' '||'\n     || lk == 146117                // 'null' '||'\n     || lk == 146175                // 'true' '||'\n     || lk == 146567                // 'false' '|}'\n     || lk == 146629                // 'null' '|}'\n     || lk == 146687                // 'true' '|}'\n     || lk == 147079                // 'false' '}'\n     || lk == 147141                // 'null' '}'\n     || lk == 147199)               // 'true' '}'\n    {\n      lk = memoized(4, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_PostfixExpr();\n          memoize(4, e0A, -1);\n          lk = -3;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(4, e0A, -2);\n        }\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n    case 8:                         // IntegerLiteral\n    case 9:                         // DecimalLiteral\n    case 10:                        // DoubleLiteral\n    case 11:                        // StringLiteral\n    case 31:                        // '$'\n    case 32:                        // '$$'\n    case 33:                        // '%'\n    case 35:                        // '('\n    case 55:                        // '<'\n    case 56:                        // '<!--'\n    case 60:                        // '<?'\n    case 69:                        // '['\n    case 281:                       // '{'\n    case 283:                       // '{|'\n    case 3155:                      // 'attribute' EQName^Token\n    case 3194:                      // 'element' EQName^Token\n    case 9915:                      // 'namespace' NCName^Token\n    case 9948:                      // 'processing-instruction' NCName^Token\n    case 14854:                     // EQName^Token '#'\n    case 14919:                     // 'after' '#'\n    case 14921:                     // 'allowing' '#'\n    case 14922:                     // 'ancestor' '#'\n    case 14923:                     // 'ancestor-or-self' '#'\n    case 14924:                     // 'and' '#'\n    case 14926:                     // 'append' '#'\n    case 14927:                     // 'array' '#'\n    case 14928:                     // 'as' '#'\n    case 14929:                     // 'ascending' '#'\n    case 14930:                     // 'at' '#'\n    case 14931:                     // 'attribute' '#'\n    case 14932:                     // 'base-uri' '#'\n    case 14933:                     // 'before' '#'\n    case 14934:                     // 'boundary-space' '#'\n    case 14935:                     // 'break' '#'\n    case 14937:                     // 'case' '#'\n    case 14938:                     // 'cast' '#'\n    case 14939:                     // 'castable' '#'\n    case 14940:                     // 'catch' '#'\n    case 14942:                     // 'child' '#'\n    case 14943:                     // 'collation' '#'\n    case 14945:                     // 'comment' '#'\n    case 14946:                     // 'constraint' '#'\n    case 14947:                     // 'construction' '#'\n    case 14950:                     // 'context' '#'\n    case 14951:                     // 'continue' '#'\n    case 14952:                     // 'copy' '#'\n    case 14953:                     // 'copy-namespaces' '#'\n    case 14954:                     // 'count' '#'\n    case 14955:                     // 'decimal-format' '#'\n    case 14957:                     // 'declare' '#'\n    case 14958:                     // 'default' '#'\n    case 14959:                     // 'delete' '#'\n    case 14960:                     // 'descendant' '#'\n    case 14961:                     // 'descendant-or-self' '#'\n    case 14962:                     // 'descending' '#'\n    case 14967:                     // 'div' '#'\n    case 14968:                     // 'document' '#'\n    case 14969:                     // 'document-node' '#'\n    case 14970:                     // 'element' '#'\n    case 14971:                     // 'else' '#'\n    case 14972:                     // 'empty' '#'\n    case 14973:                     // 'empty-sequence' '#'\n    case 14974:                     // 'encoding' '#'\n    case 14975:                     // 'end' '#'\n    case 14977:                     // 'eq' '#'\n    case 14978:                     // 'every' '#'\n    case 14980:                     // 'except' '#'\n    case 14981:                     // 'exit' '#'\n    case 14982:                     // 'external' '#'\n    case 14983:                     // 'false' '#'\n    case 14984:                     // 'first' '#'\n    case 14985:                     // 'following' '#'\n    case 14986:                     // 'following-sibling' '#'\n    case 14987:                     // 'for' '#'\n    case 14990:                     // 'from' '#'\n    case 14991:                     // 'ft-option' '#'\n    case 14995:                     // 'function' '#'\n    case 14996:                     // 'ge' '#'\n    case 14998:                     // 'group' '#'\n    case 15000:                     // 'gt' '#'\n    case 15001:                     // 'idiv' '#'\n    case 15002:                     // 'if' '#'\n    case 15003:                     // 'import' '#'\n    case 15004:                     // 'in' '#'\n    case 15005:                     // 'index' '#'\n    case 15009:                     // 'insert' '#'\n    case 15010:                     // 'instance' '#'\n    case 15011:                     // 'integrity' '#'\n    case 15012:                     // 'intersect' '#'\n    case 15013:                     // 'into' '#'\n    case 15014:                     // 'is' '#'\n    case 15015:                     // 'item' '#'\n    case 15016:                     // 'json' '#'\n    case 15017:                     // 'json-item' '#'\n    case 15018:                     // 'jsoniq' '#'\n    case 15021:                     // 'last' '#'\n    case 15022:                     // 'lax' '#'\n    case 15023:                     // 'le' '#'\n    case 15025:                     // 'let' '#'\n    case 15027:                     // 'loop' '#'\n    case 15029:                     // 'lt' '#'\n    case 15031:                     // 'mod' '#'\n    case 15032:                     // 'modify' '#'\n    case 15033:                     // 'module' '#'\n    case 15035:                     // 'namespace' '#'\n    case 15036:                     // 'namespace-node' '#'\n    case 15037:                     // 'ne' '#'\n    case 15042:                     // 'node' '#'\n    case 15043:                     // 'nodes' '#'\n    case 15045:                     // 'null' '#'\n    case 15046:                     // 'object' '#'\n    case 15050:                     // 'only' '#'\n    case 15051:                     // 'option' '#'\n    case 15052:                     // 'or' '#'\n    case 15053:                     // 'order' '#'\n    case 15054:                     // 'ordered' '#'\n    case 15055:                     // 'ordering' '#'\n    case 15058:                     // 'parent' '#'\n    case 15064:                     // 'preceding' '#'\n    case 15065:                     // 'preceding-sibling' '#'\n    case 15068:                     // 'processing-instruction' '#'\n    case 15070:                     // 'rename' '#'\n    case 15071:                     // 'replace' '#'\n    case 15072:                     // 'return' '#'\n    case 15073:                     // 'returning' '#'\n    case 15074:                     // 'revalidation' '#'\n    case 15076:                     // 'satisfies' '#'\n    case 15077:                     // 'schema' '#'\n    case 15078:                     // 'schema-attribute' '#'\n    case 15079:                     // 'schema-element' '#'\n    case 15080:                     // 'score' '#'\n    case 15081:                     // 'select' '#'\n    case 15082:                     // 'self' '#'\n    case 15087:                     // 'sliding' '#'\n    case 15088:                     // 'some' '#'\n    case 15089:                     // 'stable' '#'\n    case 15090:                     // 'start' '#'\n    case 15093:                     // 'strict' '#'\n    case 15095:                     // 'structured-item' '#'\n    case 15096:                     // 'switch' '#'\n    case 15097:                     // 'text' '#'\n    case 15101:                     // 'to' '#'\n    case 15102:                     // 'treat' '#'\n    case 15103:                     // 'true' '#'\n    case 15104:                     // 'try' '#'\n    case 15105:                     // 'tumbling' '#'\n    case 15106:                     // 'type' '#'\n    case 15107:                     // 'typeswitch' '#'\n    case 15108:                     // 'union' '#'\n    case 15110:                     // 'unordered' '#'\n    case 15111:                     // 'updating' '#'\n    case 15114:                     // 'validate' '#'\n    case 15115:                     // 'value' '#'\n    case 15116:                     // 'variable' '#'\n    case 15117:                     // 'version' '#'\n    case 15120:                     // 'where' '#'\n    case 15121:                     // 'while' '#'\n    case 15124:                     // 'with' '#'\n    case 17926:                     // EQName^Token '('\n    case 17991:                     // 'after' '('\n    case 17993:                     // 'allowing' '('\n    case 17994:                     // 'ancestor' '('\n    case 17995:                     // 'ancestor-or-self' '('\n    case 17996:                     // 'and' '('\n    case 17998:                     // 'append' '('\n    case 18000:                     // 'as' '('\n    case 18001:                     // 'ascending' '('\n    case 18002:                     // 'at' '('\n    case 18004:                     // 'base-uri' '('\n    case 18005:                     // 'before' '('\n    case 18006:                     // 'boundary-space' '('\n    case 18007:                     // 'break' '('\n    case 18009:                     // 'case' '('\n    case 18010:                     // 'cast' '('\n    case 18011:                     // 'castable' '('\n    case 18012:                     // 'catch' '('\n    case 18014:                     // 'child' '('\n    case 18015:                     // 'collation' '('\n    case 18018:                     // 'constraint' '('\n    case 18019:                     // 'construction' '('\n    case 18022:                     // 'context' '('\n    case 18023:                     // 'continue' '('\n    case 18024:                     // 'copy' '('\n    case 18025:                     // 'copy-namespaces' '('\n    case 18026:                     // 'count' '('\n    case 18027:                     // 'decimal-format' '('\n    case 18029:                     // 'declare' '('\n    case 18030:                     // 'default' '('\n    case 18031:                     // 'delete' '('\n    case 18032:                     // 'descendant' '('\n    case 18033:                     // 'descendant-or-self' '('\n    case 18034:                     // 'descending' '('\n    case 18039:                     // 'div' '('\n    case 18040:                     // 'document' '('\n    case 18043:                     // 'else' '('\n    case 18044:                     // 'empty' '('\n    case 18046:                     // 'encoding' '('\n    case 18047:                     // 'end' '('\n    case 18049:                     // 'eq' '('\n    case 18050:                     // 'every' '('\n    case 18052:                     // 'except' '('\n    case 18053:                     // 'exit' '('\n    case 18054:                     // 'external' '('\n    case 18055:                     // 'false' '('\n    case 18056:                     // 'first' '('\n    case 18057:                     // 'following' '('\n    case 18058:                     // 'following-sibling' '('\n    case 18059:                     // 'for' '('\n    case 18062:                     // 'from' '('\n    case 18063:                     // 'ft-option' '('\n    case 18067:                     // 'function' '('\n    case 18068:                     // 'ge' '('\n    case 18070:                     // 'group' '('\n    case 18072:                     // 'gt' '('\n    case 18073:                     // 'idiv' '('\n    case 18075:                     // 'import' '('\n    case 18076:                     // 'in' '('\n    case 18077:                     // 'index' '('\n    case 18081:                     // 'insert' '('\n    case 18082:                     // 'instance' '('\n    case 18083:                     // 'integrity' '('\n    case 18084:                     // 'intersect' '('\n    case 18085:                     // 'into' '('\n    case 18086:                     // 'is' '('\n    case 18088:                     // 'json' '('\n    case 18090:                     // 'jsoniq' '('\n    case 18093:                     // 'last' '('\n    case 18094:                     // 'lax' '('\n    case 18095:                     // 'le' '('\n    case 18097:                     // 'let' '('\n    case 18099:                     // 'loop' '('\n    case 18101:                     // 'lt' '('\n    case 18103:                     // 'mod' '('\n    case 18104:                     // 'modify' '('\n    case 18105:                     // 'module' '('\n    case 18107:                     // 'namespace' '('\n    case 18109:                     // 'ne' '('\n    case 18115:                     // 'nodes' '('\n    case 18117:                     // 'null' '('\n    case 18118:                     // 'object' '('\n    case 18122:                     // 'only' '('\n    case 18123:                     // 'option' '('\n    case 18124:                     // 'or' '('\n    case 18125:                     // 'order' '('\n    case 18126:                     // 'ordered' '('\n    case 18127:                     // 'ordering' '('\n    case 18130:                     // 'parent' '('\n    case 18136:                     // 'preceding' '('\n    case 18137:                     // 'preceding-sibling' '('\n    case 18142:                     // 'rename' '('\n    case 18143:                     // 'replace' '('\n    case 18144:                     // 'return' '('\n    case 18145:                     // 'returning' '('\n    case 18146:                     // 'revalidation' '('\n    case 18148:                     // 'satisfies' '('\n    case 18149:                     // 'schema' '('\n    case 18152:                     // 'score' '('\n    case 18153:                     // 'select' '('\n    case 18154:                     // 'self' '('\n    case 18159:                     // 'sliding' '('\n    case 18160:                     // 'some' '('\n    case 18161:                     // 'stable' '('\n    case 18162:                     // 'start' '('\n    case 18165:                     // 'strict' '('\n    case 18173:                     // 'to' '('\n    case 18174:                     // 'treat' '('\n    case 18175:                     // 'true' '('\n    case 18176:                     // 'try' '('\n    case 18177:                     // 'tumbling' '('\n    case 18178:                     // 'type' '('\n    case 18180:                     // 'union' '('\n    case 18182:                     // 'unordered' '('\n    case 18183:                     // 'updating' '('\n    case 18186:                     // 'validate' '('\n    case 18187:                     // 'value' '('\n    case 18188:                     // 'variable' '('\n    case 18189:                     // 'version' '('\n    case 18192:                     // 'where' '('\n    case 18193:                     // 'while' '('\n    case 18196:                     // 'with' '('\n    case 23175:                     // 'false' '.'\n    case 23237:                     // 'null' '.'\n    case 23295:                     // 'true' '.'\n    case 37459:                     // 'attribute' 'allowing'\n    case 37498:                     // 'element' 'allowing'\n    case 37563:                     // 'namespace' 'allowing'\n    case 37596:                     // 'processing-instruction' 'allowing'\n    case 37971:                     // 'attribute' 'ancestor'\n    case 38010:                     // 'element' 'ancestor'\n    case 38075:                     // 'namespace' 'ancestor'\n    case 38108:                     // 'processing-instruction' 'ancestor'\n    case 38483:                     // 'attribute' 'ancestor-or-self'\n    case 38522:                     // 'element' 'ancestor-or-self'\n    case 38587:                     // 'namespace' 'ancestor-or-self'\n    case 38620:                     // 'processing-instruction' 'ancestor-or-self'\n    case 40019:                     // 'attribute' 'append'\n    case 40058:                     // 'element' 'append'\n    case 40123:                     // 'namespace' 'append'\n    case 40156:                     // 'processing-instruction' 'append'\n    case 40531:                     // 'attribute' 'array'\n    case 40570:                     // 'element' 'array'\n    case 42579:                     // 'attribute' 'attribute'\n    case 42618:                     // 'element' 'attribute'\n    case 42683:                     // 'namespace' 'attribute'\n    case 42716:                     // 'processing-instruction' 'attribute'\n    case 43091:                     // 'attribute' 'base-uri'\n    case 43130:                     // 'element' 'base-uri'\n    case 43195:                     // 'namespace' 'base-uri'\n    case 43228:                     // 'processing-instruction' 'base-uri'\n    case 44115:                     // 'attribute' 'boundary-space'\n    case 44154:                     // 'element' 'boundary-space'\n    case 44219:                     // 'namespace' 'boundary-space'\n    case 44252:                     // 'processing-instruction' 'boundary-space'\n    case 44627:                     // 'attribute' 'break'\n    case 44666:                     // 'element' 'break'\n    case 44731:                     // 'namespace' 'break'\n    case 44764:                     // 'processing-instruction' 'break'\n    case 47187:                     // 'attribute' 'catch'\n    case 47226:                     // 'element' 'catch'\n    case 47291:                     // 'namespace' 'catch'\n    case 47324:                     // 'processing-instruction' 'catch'\n    case 48211:                     // 'attribute' 'child'\n    case 48250:                     // 'element' 'child'\n    case 48315:                     // 'namespace' 'child'\n    case 48348:                     // 'processing-instruction' 'child'\n    case 49747:                     // 'attribute' 'comment'\n    case 49786:                     // 'element' 'comment'\n    case 49851:                     // 'namespace' 'comment'\n    case 49884:                     // 'processing-instruction' 'comment'\n    case 50259:                     // 'attribute' 'constraint'\n    case 50298:                     // 'element' 'constraint'\n    case 50363:                     // 'namespace' 'constraint'\n    case 50396:                     // 'processing-instruction' 'constraint'\n    case 50771:                     // 'attribute' 'construction'\n    case 50810:                     // 'element' 'construction'\n    case 50875:                     // 'namespace' 'construction'\n    case 50908:                     // 'processing-instruction' 'construction'\n    case 52307:                     // 'attribute' 'context'\n    case 52346:                     // 'element' 'context'\n    case 52411:                     // 'namespace' 'context'\n    case 52444:                     // 'processing-instruction' 'context'\n    case 52819:                     // 'attribute' 'continue'\n    case 52858:                     // 'element' 'continue'\n    case 52923:                     // 'namespace' 'continue'\n    case 52956:                     // 'processing-instruction' 'continue'\n    case 53331:                     // 'attribute' 'copy'\n    case 53370:                     // 'element' 'copy'\n    case 53435:                     // 'namespace' 'copy'\n    case 53468:                     // 'processing-instruction' 'copy'\n    case 53843:                     // 'attribute' 'copy-namespaces'\n    case 53882:                     // 'element' 'copy-namespaces'\n    case 53947:                     // 'namespace' 'copy-namespaces'\n    case 53980:                     // 'processing-instruction' 'copy-namespaces'\n    case 54867:                     // 'attribute' 'decimal-format'\n    case 54906:                     // 'element' 'decimal-format'\n    case 54971:                     // 'namespace' 'decimal-format'\n    case 55004:                     // 'processing-instruction' 'decimal-format'\n    case 55891:                     // 'attribute' 'declare'\n    case 55930:                     // 'element' 'declare'\n    case 55995:                     // 'namespace' 'declare'\n    case 56028:                     // 'processing-instruction' 'declare'\n    case 56915:                     // 'attribute' 'delete'\n    case 56954:                     // 'element' 'delete'\n    case 57019:                     // 'namespace' 'delete'\n    case 57052:                     // 'processing-instruction' 'delete'\n    case 57427:                     // 'attribute' 'descendant'\n    case 57466:                     // 'element' 'descendant'\n    case 57531:                     // 'namespace' 'descendant'\n    case 57564:                     // 'processing-instruction' 'descendant'\n    case 57939:                     // 'attribute' 'descendant-or-self'\n    case 57978:                     // 'element' 'descendant-or-self'\n    case 58043:                     // 'namespace' 'descendant-or-self'\n    case 58076:                     // 'processing-instruction' 'descendant-or-self'\n    case 61523:                     // 'attribute' 'document'\n    case 61562:                     // 'element' 'document'\n    case 61627:                     // 'namespace' 'document'\n    case 61660:                     // 'processing-instruction' 'document'\n    case 62035:                     // 'attribute' 'document-node'\n    case 62074:                     // 'element' 'document-node'\n    case 62139:                     // 'namespace' 'document-node'\n    case 62172:                     // 'processing-instruction' 'document-node'\n    case 62547:                     // 'attribute' 'element'\n    case 62586:                     // 'element' 'element'\n    case 62651:                     // 'namespace' 'element'\n    case 62684:                     // 'processing-instruction' 'element'\n    case 64083:                     // 'attribute' 'empty-sequence'\n    case 64122:                     // 'element' 'empty-sequence'\n    case 64187:                     // 'namespace' 'empty-sequence'\n    case 64220:                     // 'processing-instruction' 'empty-sequence'\n    case 64595:                     // 'attribute' 'encoding'\n    case 64634:                     // 'element' 'encoding'\n    case 64699:                     // 'namespace' 'encoding'\n    case 64732:                     // 'processing-instruction' 'encoding'\n    case 66643:                     // 'attribute' 'every'\n    case 66682:                     // 'element' 'every'\n    case 66747:                     // 'namespace' 'every'\n    case 66780:                     // 'processing-instruction' 'every'\n    case 68179:                     // 'attribute' 'exit'\n    case 68218:                     // 'element' 'exit'\n    case 68283:                     // 'namespace' 'exit'\n    case 68316:                     // 'processing-instruction' 'exit'\n    case 68691:                     // 'attribute' 'external'\n    case 68730:                     // 'element' 'external'\n    case 68795:                     // 'namespace' 'external'\n    case 68828:                     // 'processing-instruction' 'external'\n    case 69203:                     // 'attribute' 'false'\n    case 69242:                     // 'element' 'false'\n    case 69307:                     // 'namespace' 'false'\n    case 69340:                     // 'processing-instruction' 'false'\n    case 69715:                     // 'attribute' 'first'\n    case 69754:                     // 'element' 'first'\n    case 69819:                     // 'namespace' 'first'\n    case 69852:                     // 'processing-instruction' 'first'\n    case 70227:                     // 'attribute' 'following'\n    case 70266:                     // 'element' 'following'\n    case 70331:                     // 'namespace' 'following'\n    case 70364:                     // 'processing-instruction' 'following'\n    case 70739:                     // 'attribute' 'following-sibling'\n    case 70778:                     // 'element' 'following-sibling'\n    case 70843:                     // 'namespace' 'following-sibling'\n    case 70876:                     // 'processing-instruction' 'following-sibling'\n    case 72787:                     // 'attribute' 'from'\n    case 72826:                     // 'element' 'from'\n    case 72891:                     // 'namespace' 'from'\n    case 72924:                     // 'processing-instruction' 'from'\n    case 73299:                     // 'attribute' 'ft-option'\n    case 73338:                     // 'element' 'ft-option'\n    case 73403:                     // 'namespace' 'ft-option'\n    case 73436:                     // 'processing-instruction' 'ft-option'\n    case 75347:                     // 'attribute' 'function'\n    case 75386:                     // 'element' 'function'\n    case 75451:                     // 'namespace' 'function'\n    case 75484:                     // 'processing-instruction' 'function'\n    case 78931:                     // 'attribute' 'if'\n    case 78970:                     // 'element' 'if'\n    case 79035:                     // 'namespace' 'if'\n    case 79068:                     // 'processing-instruction' 'if'\n    case 79443:                     // 'attribute' 'import'\n    case 79482:                     // 'element' 'import'\n    case 79547:                     // 'namespace' 'import'\n    case 79580:                     // 'processing-instruction' 'import'\n    case 79955:                     // 'attribute' 'in'\n    case 79994:                     // 'element' 'in'\n    case 80059:                     // 'namespace' 'in'\n    case 80092:                     // 'processing-instruction' 'in'\n    case 80467:                     // 'attribute' 'index'\n    case 80506:                     // 'element' 'index'\n    case 80571:                     // 'namespace' 'index'\n    case 80604:                     // 'processing-instruction' 'index'\n    case 82515:                     // 'attribute' 'insert'\n    case 82554:                     // 'element' 'insert'\n    case 82619:                     // 'namespace' 'insert'\n    case 82652:                     // 'processing-instruction' 'insert'\n    case 83539:                     // 'attribute' 'integrity'\n    case 83578:                     // 'element' 'integrity'\n    case 83643:                     // 'namespace' 'integrity'\n    case 83676:                     // 'processing-instruction' 'integrity'\n    case 85587:                     // 'attribute' 'item'\n    case 85626:                     // 'element' 'item'\n    case 85691:                     // 'namespace' 'item'\n    case 85724:                     // 'processing-instruction' 'item'\n    case 86099:                     // 'attribute' 'json'\n    case 86138:                     // 'element' 'json'\n    case 86203:                     // 'namespace' 'json'\n    case 86236:                     // 'processing-instruction' 'json'\n    case 86611:                     // 'attribute' 'json-item'\n    case 86650:                     // 'element' 'json-item'\n    case 87123:                     // 'attribute' 'jsoniq'\n    case 87162:                     // 'element' 'jsoniq'\n    case 87227:                     // 'namespace' 'jsoniq'\n    case 87260:                     // 'processing-instruction' 'jsoniq'\n    case 88659:                     // 'attribute' 'last'\n    case 88698:                     // 'element' 'last'\n    case 88763:                     // 'namespace' 'last'\n    case 88796:                     // 'processing-instruction' 'last'\n    case 89171:                     // 'attribute' 'lax'\n    case 89210:                     // 'element' 'lax'\n    case 89275:                     // 'namespace' 'lax'\n    case 89308:                     // 'processing-instruction' 'lax'\n    case 91731:                     // 'attribute' 'loop'\n    case 91770:                     // 'element' 'loop'\n    case 91835:                     // 'namespace' 'loop'\n    case 91868:                     // 'processing-instruction' 'loop'\n    case 94803:                     // 'attribute' 'module'\n    case 94842:                     // 'element' 'module'\n    case 94907:                     // 'namespace' 'module'\n    case 94940:                     // 'processing-instruction' 'module'\n    case 95827:                     // 'attribute' 'namespace'\n    case 95866:                     // 'element' 'namespace'\n    case 95931:                     // 'namespace' 'namespace'\n    case 95964:                     // 'processing-instruction' 'namespace'\n    case 96339:                     // 'attribute' 'namespace-node'\n    case 96378:                     // 'element' 'namespace-node'\n    case 96443:                     // 'namespace' 'namespace-node'\n    case 96476:                     // 'processing-instruction' 'namespace-node'\n    case 99411:                     // 'attribute' 'node'\n    case 99450:                     // 'element' 'node'\n    case 99515:                     // 'namespace' 'node'\n    case 99548:                     // 'processing-instruction' 'node'\n    case 99923:                     // 'attribute' 'nodes'\n    case 99962:                     // 'element' 'nodes'\n    case 100027:                    // 'namespace' 'nodes'\n    case 100060:                    // 'processing-instruction' 'nodes'\n    case 100947:                    // 'attribute' 'null'\n    case 100986:                    // 'element' 'null'\n    case 101051:                    // 'namespace' 'null'\n    case 101084:                    // 'processing-instruction' 'null'\n    case 101459:                    // 'attribute' 'object'\n    case 101498:                    // 'element' 'object'\n    case 101563:                    // 'namespace' 'object'\n    case 101596:                    // 'processing-instruction' 'object'\n    case 104019:                    // 'attribute' 'option'\n    case 104058:                    // 'element' 'option'\n    case 104123:                    // 'namespace' 'option'\n    case 104156:                    // 'processing-instruction' 'option'\n    case 105555:                    // 'attribute' 'ordered'\n    case 105594:                    // 'element' 'ordered'\n    case 105659:                    // 'namespace' 'ordered'\n    case 105692:                    // 'processing-instruction' 'ordered'\n    case 106067:                    // 'attribute' 'ordering'\n    case 106106:                    // 'element' 'ordering'\n    case 106171:                    // 'namespace' 'ordering'\n    case 106204:                    // 'processing-instruction' 'ordering'\n    case 107603:                    // 'attribute' 'parent'\n    case 107642:                    // 'element' 'parent'\n    case 107707:                    // 'namespace' 'parent'\n    case 107740:                    // 'processing-instruction' 'parent'\n    case 110675:                    // 'attribute' 'preceding'\n    case 110714:                    // 'element' 'preceding'\n    case 110779:                    // 'namespace' 'preceding'\n    case 110812:                    // 'processing-instruction' 'preceding'\n    case 111187:                    // 'attribute' 'preceding-sibling'\n    case 111226:                    // 'element' 'preceding-sibling'\n    case 111291:                    // 'namespace' 'preceding-sibling'\n    case 111324:                    // 'processing-instruction' 'preceding-sibling'\n    case 112723:                    // 'attribute' 'processing-instruction'\n    case 112762:                    // 'element' 'processing-instruction'\n    case 112827:                    // 'namespace' 'processing-instruction'\n    case 112860:                    // 'processing-instruction' 'processing-instruction'\n    case 113747:                    // 'attribute' 'rename'\n    case 113786:                    // 'element' 'rename'\n    case 113851:                    // 'namespace' 'rename'\n    case 113884:                    // 'processing-instruction' 'rename'\n    case 114259:                    // 'attribute' 'replace'\n    case 114298:                    // 'element' 'replace'\n    case 114363:                    // 'namespace' 'replace'\n    case 114396:                    // 'processing-instruction' 'replace'\n    case 115283:                    // 'attribute' 'returning'\n    case 115322:                    // 'element' 'returning'\n    case 115387:                    // 'namespace' 'returning'\n    case 115420:                    // 'processing-instruction' 'returning'\n    case 115795:                    // 'attribute' 'revalidation'\n    case 115834:                    // 'element' 'revalidation'\n    case 115899:                    // 'namespace' 'revalidation'\n    case 115932:                    // 'processing-instruction' 'revalidation'\n    case 117331:                    // 'attribute' 'schema'\n    case 117370:                    // 'element' 'schema'\n    case 117435:                    // 'namespace' 'schema'\n    case 117468:                    // 'processing-instruction' 'schema'\n    case 117843:                    // 'attribute' 'schema-attribute'\n    case 117882:                    // 'element' 'schema-attribute'\n    case 117947:                    // 'namespace' 'schema-attribute'\n    case 117980:                    // 'processing-instruction' 'schema-attribute'\n    case 118355:                    // 'attribute' 'schema-element'\n    case 118394:                    // 'element' 'schema-element'\n    case 118459:                    // 'namespace' 'schema-element'\n    case 118492:                    // 'processing-instruction' 'schema-element'\n    case 118867:                    // 'attribute' 'score'\n    case 118906:                    // 'element' 'score'\n    case 118971:                    // 'namespace' 'score'\n    case 119004:                    // 'processing-instruction' 'score'\n    case 119379:                    // 'attribute' 'select'\n    case 119418:                    // 'element' 'select'\n    case 119483:                    // 'namespace' 'select'\n    case 119516:                    // 'processing-instruction' 'select'\n    case 119891:                    // 'attribute' 'self'\n    case 119930:                    // 'element' 'self'\n    case 119995:                    // 'namespace' 'self'\n    case 120028:                    // 'processing-instruction' 'self'\n    case 122451:                    // 'attribute' 'sliding'\n    case 122490:                    // 'element' 'sliding'\n    case 122555:                    // 'namespace' 'sliding'\n    case 122588:                    // 'processing-instruction' 'sliding'\n    case 122963:                    // 'attribute' 'some'\n    case 123002:                    // 'element' 'some'\n    case 123067:                    // 'namespace' 'some'\n    case 123100:                    // 'processing-instruction' 'some'\n    case 125523:                    // 'attribute' 'strict'\n    case 125562:                    // 'element' 'strict'\n    case 125627:                    // 'namespace' 'strict'\n    case 125660:                    // 'processing-instruction' 'strict'\n    case 126547:                    // 'attribute' 'structured-item'\n    case 126586:                    // 'element' 'structured-item'\n    case 127059:                    // 'attribute' 'switch'\n    case 127098:                    // 'element' 'switch'\n    case 127163:                    // 'namespace' 'switch'\n    case 127196:                    // 'processing-instruction' 'switch'\n    case 127571:                    // 'attribute' 'text'\n    case 127610:                    // 'element' 'text'\n    case 127675:                    // 'namespace' 'text'\n    case 127708:                    // 'processing-instruction' 'text'\n    case 130643:                    // 'attribute' 'true'\n    case 130682:                    // 'element' 'true'\n    case 130747:                    // 'namespace' 'true'\n    case 130780:                    // 'processing-instruction' 'true'\n    case 131155:                    // 'attribute' 'try'\n    case 131194:                    // 'element' 'try'\n    case 131259:                    // 'namespace' 'try'\n    case 131292:                    // 'processing-instruction' 'try'\n    case 131667:                    // 'attribute' 'tumbling'\n    case 131706:                    // 'element' 'tumbling'\n    case 131771:                    // 'namespace' 'tumbling'\n    case 131804:                    // 'processing-instruction' 'tumbling'\n    case 132179:                    // 'attribute' 'type'\n    case 132218:                    // 'element' 'type'\n    case 132283:                    // 'namespace' 'type'\n    case 132316:                    // 'processing-instruction' 'type'\n    case 132691:                    // 'attribute' 'typeswitch'\n    case 132730:                    // 'element' 'typeswitch'\n    case 132795:                    // 'namespace' 'typeswitch'\n    case 132828:                    // 'processing-instruction' 'typeswitch'\n    case 134227:                    // 'attribute' 'unordered'\n    case 134266:                    // 'element' 'unordered'\n    case 134331:                    // 'namespace' 'unordered'\n    case 134364:                    // 'processing-instruction' 'unordered'\n    case 134739:                    // 'attribute' 'updating'\n    case 134778:                    // 'element' 'updating'\n    case 134843:                    // 'namespace' 'updating'\n    case 134876:                    // 'processing-instruction' 'updating'\n    case 136275:                    // 'attribute' 'validate'\n    case 136314:                    // 'element' 'validate'\n    case 136379:                    // 'namespace' 'validate'\n    case 136412:                    // 'processing-instruction' 'validate'\n    case 136787:                    // 'attribute' 'value'\n    case 136826:                    // 'element' 'value'\n    case 136891:                    // 'namespace' 'value'\n    case 136924:                    // 'processing-instruction' 'value'\n    case 137299:                    // 'attribute' 'variable'\n    case 137338:                    // 'element' 'variable'\n    case 137403:                    // 'namespace' 'variable'\n    case 137436:                    // 'processing-instruction' 'variable'\n    case 137811:                    // 'attribute' 'version'\n    case 137850:                    // 'element' 'version'\n    case 137915:                    // 'namespace' 'version'\n    case 137948:                    // 'processing-instruction' 'version'\n    case 139859:                    // 'attribute' 'while'\n    case 139898:                    // 'element' 'while'\n    case 139963:                    // 'namespace' 'while'\n    case 139996:                    // 'processing-instruction' 'while'\n    case 143955:                    // 'attribute' '{'\n    case 143969:                    // 'comment' '{'\n    case 143992:                    // 'document' '{'\n    case 143994:                    // 'element' '{'\n    case 144059:                    // 'namespace' '{'\n    case 144078:                    // 'ordered' '{'\n    case 144092:                    // 'processing-instruction' '{'\n    case 144121:                    // 'text' '{'\n    case 144134:                    // 'unordered' '{'\n      try_PostfixExpr();\n      break;\n    case -3:\n      break;\n    default:\n      try_AxisStep();\n    }\n  }\n\n  function parse_AxisStep()\n  {\n    eventHandler.startNonterminal(\"AxisStep\", e0);\n    switch (l1)\n    {\n    case 74:                        // 'ancestor'\n    case 75:                        // 'ancestor-or-self'\n    case 210:                       // 'parent'\n    case 216:                       // 'preceding'\n    case 217:                       // 'preceding-sibling'\n      lookahead2W(232);             // S^WS | EOF | '!' | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' | ':' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 46:                        // '..'\n    case 26698:                     // 'ancestor' '::'\n    case 26699:                     // 'ancestor-or-self' '::'\n    case 26834:                     // 'parent' '::'\n    case 26840:                     // 'preceding' '::'\n    case 26841:                     // 'preceding-sibling' '::'\n      parse_ReverseStep();\n      break;\n    default:\n      parse_ForwardStep();\n    }\n    lookahead1W(228);               // S^WS | EOF | '!' | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' | ':' |\n    whitespace();\n    parse_PredicateList();\n    eventHandler.endNonterminal(\"AxisStep\", e0);\n  }\n\n  function try_AxisStep()\n  {\n    switch (l1)\n    {\n    case 74:                        // 'ancestor'\n    case 75:                        // 'ancestor-or-self'\n    case 210:                       // 'parent'\n    case 216:                       // 'preceding'\n    case 217:                       // 'preceding-sibling'\n      lookahead2W(232);             // S^WS | EOF | '!' | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' | ':' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 46:                        // '..'\n    case 26698:                     // 'ancestor' '::'\n    case 26699:                     // 'ancestor-or-self' '::'\n    case 26834:                     // 'parent' '::'\n    case 26840:                     // 'preceding' '::'\n    case 26841:                     // 'preceding-sibling' '::'\n      try_ReverseStep();\n      break;\n    default:\n      try_ForwardStep();\n    }\n    lookahead1W(228);               // S^WS | EOF | '!' | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' | ':' |\n    try_PredicateList();\n  }\n\n  function parse_ForwardStep()\n  {\n    eventHandler.startNonterminal(\"ForwardStep\", e0);\n    switch (l1)\n    {\n    case 83:                        // 'attribute'\n      lookahead2W(236);             // S^WS | EOF | '!' | '!=' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' |\n      break;\n    case 94:                        // 'child'\n    case 112:                       // 'descendant'\n    case 113:                       // 'descendant-or-self'\n    case 137:                       // 'following'\n    case 138:                       // 'following-sibling'\n    case 234:                       // 'self'\n      lookahead2W(232);             // S^WS | EOF | '!' | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' | ':' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 26707:                     // 'attribute' '::'\n    case 26718:                     // 'child' '::'\n    case 26736:                     // 'descendant' '::'\n    case 26737:                     // 'descendant-or-self' '::'\n    case 26761:                     // 'following' '::'\n    case 26762:                     // 'following-sibling' '::'\n    case 26858:                     // 'self' '::'\n      parse_ForwardAxis();\n      lookahead1W(249);             // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_NodeTest();\n      break;\n    default:\n      parse_AbbrevForwardStep();\n    }\n    eventHandler.endNonterminal(\"ForwardStep\", e0);\n  }\n\n  function try_ForwardStep()\n  {\n    switch (l1)\n    {\n    case 83:                        // 'attribute'\n      lookahead2W(236);             // S^WS | EOF | '!' | '!=' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' |\n      break;\n    case 94:                        // 'child'\n    case 112:                       // 'descendant'\n    case 113:                       // 'descendant-or-self'\n    case 137:                       // 'following'\n    case 138:                       // 'following-sibling'\n    case 234:                       // 'self'\n      lookahead2W(232);             // S^WS | EOF | '!' | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' | ':' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 26707:                     // 'attribute' '::'\n    case 26718:                     // 'child' '::'\n    case 26736:                     // 'descendant' '::'\n    case 26737:                     // 'descendant-or-self' '::'\n    case 26761:                     // 'following' '::'\n    case 26762:                     // 'following-sibling' '::'\n    case 26858:                     // 'self' '::'\n      try_ForwardAxis();\n      lookahead1W(249);             // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_NodeTest();\n      break;\n    default:\n      try_AbbrevForwardStep();\n    }\n  }\n\n  function parse_ForwardAxis()\n  {\n    eventHandler.startNonterminal(\"ForwardAxis\", e0);\n    switch (l1)\n    {\n    case 94:                        // 'child'\n      shift(94);                    // 'child'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shift(52);                    // '::'\n      break;\n    case 112:                       // 'descendant'\n      shift(112);                   // 'descendant'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shift(52);                    // '::'\n      break;\n    case 83:                        // 'attribute'\n      shift(83);                    // 'attribute'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shift(52);                    // '::'\n      break;\n    case 234:                       // 'self'\n      shift(234);                   // 'self'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shift(52);                    // '::'\n      break;\n    case 113:                       // 'descendant-or-self'\n      shift(113);                   // 'descendant-or-self'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shift(52);                    // '::'\n      break;\n    case 138:                       // 'following-sibling'\n      shift(138);                   // 'following-sibling'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shift(52);                    // '::'\n      break;\n    default:\n      shift(137);                   // 'following'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shift(52);                    // '::'\n    }\n    eventHandler.endNonterminal(\"ForwardAxis\", e0);\n  }\n\n  function try_ForwardAxis()\n  {\n    switch (l1)\n    {\n    case 94:                        // 'child'\n      shiftT(94);                   // 'child'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shiftT(52);                   // '::'\n      break;\n    case 112:                       // 'descendant'\n      shiftT(112);                  // 'descendant'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shiftT(52);                   // '::'\n      break;\n    case 83:                        // 'attribute'\n      shiftT(83);                   // 'attribute'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shiftT(52);                   // '::'\n      break;\n    case 234:                       // 'self'\n      shiftT(234);                  // 'self'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shiftT(52);                   // '::'\n      break;\n    case 113:                       // 'descendant-or-self'\n      shiftT(113);                  // 'descendant-or-self'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shiftT(52);                   // '::'\n      break;\n    case 138:                       // 'following-sibling'\n      shiftT(138);                  // 'following-sibling'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shiftT(52);                   // '::'\n      break;\n    default:\n      shiftT(137);                  // 'following'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shiftT(52);                   // '::'\n    }\n  }\n\n  function parse_AbbrevForwardStep()\n  {\n    eventHandler.startNonterminal(\"AbbrevForwardStep\", e0);\n    if (l1 == 67)                   // '@'\n    {\n      shift(67);                    // '@'\n    }\n    lookahead1W(249);               // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_NodeTest();\n    eventHandler.endNonterminal(\"AbbrevForwardStep\", e0);\n  }\n\n  function try_AbbrevForwardStep()\n  {\n    if (l1 == 67)                   // '@'\n    {\n      shiftT(67);                   // '@'\n    }\n    lookahead1W(249);               // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_NodeTest();\n  }\n\n  function parse_ReverseStep()\n  {\n    eventHandler.startNonterminal(\"ReverseStep\", e0);\n    switch (l1)\n    {\n    case 46:                        // '..'\n      parse_AbbrevReverseStep();\n      break;\n    default:\n      parse_ReverseAxis();\n      lookahead1W(249);             // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_NodeTest();\n    }\n    eventHandler.endNonterminal(\"ReverseStep\", e0);\n  }\n\n  function try_ReverseStep()\n  {\n    switch (l1)\n    {\n    case 46:                        // '..'\n      try_AbbrevReverseStep();\n      break;\n    default:\n      try_ReverseAxis();\n      lookahead1W(249);             // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_NodeTest();\n    }\n  }\n\n  function parse_ReverseAxis()\n  {\n    eventHandler.startNonterminal(\"ReverseAxis\", e0);\n    switch (l1)\n    {\n    case 210:                       // 'parent'\n      shift(210);                   // 'parent'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shift(52);                    // '::'\n      break;\n    case 74:                        // 'ancestor'\n      shift(74);                    // 'ancestor'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shift(52);                    // '::'\n      break;\n    case 217:                       // 'preceding-sibling'\n      shift(217);                   // 'preceding-sibling'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shift(52);                    // '::'\n      break;\n    case 216:                       // 'preceding'\n      shift(216);                   // 'preceding'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shift(52);                    // '::'\n      break;\n    default:\n      shift(75);                    // 'ancestor-or-self'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shift(52);                    // '::'\n    }\n    eventHandler.endNonterminal(\"ReverseAxis\", e0);\n  }\n\n  function try_ReverseAxis()\n  {\n    switch (l1)\n    {\n    case 210:                       // 'parent'\n      shiftT(210);                  // 'parent'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shiftT(52);                   // '::'\n      break;\n    case 74:                        // 'ancestor'\n      shiftT(74);                   // 'ancestor'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shiftT(52);                   // '::'\n      break;\n    case 217:                       // 'preceding-sibling'\n      shiftT(217);                  // 'preceding-sibling'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shiftT(52);                   // '::'\n      break;\n    case 216:                       // 'preceding'\n      shiftT(216);                  // 'preceding'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shiftT(52);                   // '::'\n      break;\n    default:\n      shiftT(75);                   // 'ancestor-or-self'\n      lookahead1W(27);              // S^WS | '(:' | '::'\n      shiftT(52);                   // '::'\n    }\n  }\n\n  function parse_AbbrevReverseStep()\n  {\n    eventHandler.startNonterminal(\"AbbrevReverseStep\", e0);\n    shift(46);                      // '..'\n    eventHandler.endNonterminal(\"AbbrevReverseStep\", e0);\n  }\n\n  function try_AbbrevReverseStep()\n  {\n    shiftT(46);                     // '..'\n  }\n\n  function parse_NodeTest()\n  {\n    eventHandler.startNonterminal(\"NodeTest\", e0);\n    switch (l1)\n    {\n    case 83:                        // 'attribute'\n    case 97:                        // 'comment'\n    case 121:                       // 'document-node'\n    case 122:                       // 'element'\n    case 188:                       // 'namespace-node'\n    case 194:                       // 'node'\n    case 220:                       // 'processing-instruction'\n    case 230:                       // 'schema-attribute'\n    case 231:                       // 'schema-element'\n    case 249:                       // 'text'\n      lookahead2W(231);             // S^WS | EOF | '!' | '!=' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 18003:                     // 'attribute' '('\n    case 18017:                     // 'comment' '('\n    case 18041:                     // 'document-node' '('\n    case 18042:                     // 'element' '('\n    case 18108:                     // 'namespace-node' '('\n    case 18114:                     // 'node' '('\n    case 18140:                     // 'processing-instruction' '('\n    case 18150:                     // 'schema-attribute' '('\n    case 18151:                     // 'schema-element' '('\n    case 18169:                     // 'text' '('\n      parse_KindTest();\n      break;\n    default:\n      parse_NameTest();\n    }\n    eventHandler.endNonterminal(\"NodeTest\", e0);\n  }\n\n  function try_NodeTest()\n  {\n    switch (l1)\n    {\n    case 83:                        // 'attribute'\n    case 97:                        // 'comment'\n    case 121:                       // 'document-node'\n    case 122:                       // 'element'\n    case 188:                       // 'namespace-node'\n    case 194:                       // 'node'\n    case 220:                       // 'processing-instruction'\n    case 230:                       // 'schema-attribute'\n    case 231:                       // 'schema-element'\n    case 249:                       // 'text'\n      lookahead2W(231);             // S^WS | EOF | '!' | '!=' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 18003:                     // 'attribute' '('\n    case 18017:                     // 'comment' '('\n    case 18041:                     // 'document-node' '('\n    case 18042:                     // 'element' '('\n    case 18108:                     // 'namespace-node' '('\n    case 18114:                     // 'node' '('\n    case 18140:                     // 'processing-instruction' '('\n    case 18150:                     // 'schema-attribute' '('\n    case 18151:                     // 'schema-element' '('\n    case 18169:                     // 'text' '('\n      try_KindTest();\n      break;\n    default:\n      try_NameTest();\n    }\n  }\n\n  function parse_NameTest()\n  {\n    eventHandler.startNonterminal(\"NameTest\", e0);\n    switch (l1)\n    {\n    case 5:                         // Wildcard\n      shift(5);                     // Wildcard\n      break;\n    default:\n      parse_EQName();\n    }\n    eventHandler.endNonterminal(\"NameTest\", e0);\n  }\n\n  function try_NameTest()\n  {\n    switch (l1)\n    {\n    case 5:                         // Wildcard\n      shiftT(5);                    // Wildcard\n      break;\n    default:\n      try_EQName();\n    }\n  }\n\n  function parse_PostfixExpr()\n  {\n    eventHandler.startNonterminal(\"PostfixExpr\", e0);\n    parse_PrimaryExpr();\n    for (;;)\n    {\n      lookahead1W(235);             // S^WS | EOF | '!' | '!=' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '.' | '/' |\n      if (l1 != 35                  // '('\n       && l1 != 45                  // '.'\n       && l1 != 69)                 // '['\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 69:                      // '['\n        lookahead2W(273);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk == 35397)              // '[' '['\n      {\n        lk = memoized(5, e0);\n        if (lk == 0)\n        {\n          var b0A = b0; var e0A = e0; var l1A = l1;\n          var b1A = b1; var e1A = e1; var l2A = l2;\n          var b2A = b2; var e2A = e2;\n          try\n          {\n            try_Predicate();\n            lk = -1;\n          }\n          catch (p1A)\n          {\n            lk = -4;\n          }\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(5, e0, lk);\n        }\n      }\n      switch (lk)\n      {\n      case 35:                      // '('\n        whitespace();\n        parse_ArgumentList();\n        break;\n      case 45:                      // '.'\n        whitespace();\n        parse_ObjectLookup();\n        break;\n      case -4:\n        whitespace();\n        parse_ArrayLookup();\n        break;\n      case 35909:                   // '[' ']'\n        whitespace();\n        parse_ArrayUnboxing();\n        break;\n      default:\n        whitespace();\n        parse_Predicate();\n      }\n    }\n    eventHandler.endNonterminal(\"PostfixExpr\", e0);\n  }\n\n  function try_PostfixExpr()\n  {\n    try_PrimaryExpr();\n    for (;;)\n    {\n      lookahead1W(235);             // S^WS | EOF | '!' | '!=' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '.' | '/' |\n      if (l1 != 35                  // '('\n       && l1 != 45                  // '.'\n       && l1 != 69)                 // '['\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 69:                      // '['\n        lookahead2W(273);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk == 35397)              // '[' '['\n      {\n        lk = memoized(5, e0);\n        if (lk == 0)\n        {\n          var b0A = b0; var e0A = e0; var l1A = l1;\n          var b1A = b1; var e1A = e1; var l2A = l2;\n          var b2A = b2; var e2A = e2;\n          try\n          {\n            try_Predicate();\n            memoize(5, e0A, -1);\n            lk = -6;\n          }\n          catch (p1A)\n          {\n            lk = -4;\n            b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n            b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n            b2 = b2A; e2 = e2A; end = e2A; }}\n            memoize(5, e0A, -4);\n          }\n        }\n      }\n      switch (lk)\n      {\n      case 35:                      // '('\n        try_ArgumentList();\n        break;\n      case 45:                      // '.'\n        try_ObjectLookup();\n        break;\n      case -4:\n        try_ArrayLookup();\n        break;\n      case 35909:                   // '[' ']'\n        try_ArrayUnboxing();\n        break;\n      case -6:\n        break;\n      default:\n        try_Predicate();\n      }\n    }\n  }\n\n  function parse_ObjectLookup()\n  {\n    eventHandler.startNonterminal(\"ObjectLookup\", e0);\n    shift(45);                      // '.'\n    lookahead1W(251);               // StringLiteral | NCName^Token | S^WS | '$' | '$$' | '(' | '(:' | 'after' |\n    switch (l1)\n    {\n    case 11:                        // StringLiteral\n      shift(11);                    // StringLiteral\n      break;\n    case 35:                        // '('\n      whitespace();\n      parse_ParenthesizedExpr();\n      break;\n    case 31:                        // '$'\n      whitespace();\n      parse_VarRef();\n      break;\n    case 32:                        // '$$'\n      whitespace();\n      parse_ContextItemExpr();\n      break;\n    default:\n      whitespace();\n      parse_NCName();\n    }\n    eventHandler.endNonterminal(\"ObjectLookup\", e0);\n  }\n\n  function try_ObjectLookup()\n  {\n    shiftT(45);                     // '.'\n    lookahead1W(251);               // StringLiteral | NCName^Token | S^WS | '$' | '$$' | '(' | '(:' | 'after' |\n    switch (l1)\n    {\n    case 11:                        // StringLiteral\n      shiftT(11);                   // StringLiteral\n      break;\n    case 35:                        // '('\n      try_ParenthesizedExpr();\n      break;\n    case 31:                        // '$'\n      try_VarRef();\n      break;\n    case 32:                        // '$$'\n      try_ContextItemExpr();\n      break;\n    default:\n      try_NCName();\n    }\n  }\n\n  function parse_ArrayLookup()\n  {\n    eventHandler.startNonterminal(\"ArrayLookup\", e0);\n    shift(69);                      // '['\n    lookahead1W(31);                // S^WS | '(:' | '['\n    shift(69);                      // '['\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Expr();\n    shift(70);                      // ']'\n    lookahead1W(32);                // S^WS | '(:' | ']'\n    shift(70);                      // ']'\n    eventHandler.endNonterminal(\"ArrayLookup\", e0);\n  }\n\n  function try_ArrayLookup()\n  {\n    shiftT(69);                     // '['\n    lookahead1W(31);                // S^WS | '(:' | '['\n    shiftT(69);                     // '['\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Expr();\n    shiftT(70);                     // ']'\n    lookahead1W(32);                // S^WS | '(:' | ']'\n    shiftT(70);                     // ']'\n  }\n\n  function parse_ArrayUnboxing()\n  {\n    eventHandler.startNonterminal(\"ArrayUnboxing\", e0);\n    shift(69);                      // '['\n    lookahead1W(32);                // S^WS | '(:' | ']'\n    shift(70);                      // ']'\n    eventHandler.endNonterminal(\"ArrayUnboxing\", e0);\n  }\n\n  function try_ArrayUnboxing()\n  {\n    shiftT(69);                     // '['\n    lookahead1W(32);                // S^WS | '(:' | ']'\n    shiftT(70);                     // ']'\n  }\n\n  function parse_ArgumentList()\n  {\n    eventHandler.startNonterminal(\"ArgumentList\", e0);\n    shift(35);                      // '('\n    lookahead1W(280);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    if (l1 != 38)                   // ')'\n    {\n      whitespace();\n      parse_Argument();\n      for (;;)\n      {\n        lookahead1W(105);           // S^WS | '(:' | ')' | ','\n        if (l1 != 42)               // ','\n        {\n          break;\n        }\n        shift(42);                  // ','\n        lookahead1W(272);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        whitespace();\n        parse_Argument();\n      }\n    }\n    shift(38);                      // ')'\n    eventHandler.endNonterminal(\"ArgumentList\", e0);\n  }\n\n  function try_ArgumentList()\n  {\n    shiftT(35);                     // '('\n    lookahead1W(280);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    if (l1 != 38)                   // ')'\n    {\n      try_Argument();\n      for (;;)\n      {\n        lookahead1W(105);           // S^WS | '(:' | ')' | ','\n        if (l1 != 42)               // ','\n        {\n          break;\n        }\n        shiftT(42);                 // ','\n        lookahead1W(272);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        try_Argument();\n      }\n    }\n    shiftT(38);                     // ')'\n  }\n\n  function parse_PredicateList()\n  {\n    eventHandler.startNonterminal(\"PredicateList\", e0);\n    for (;;)\n    {\n      lookahead1W(228);             // S^WS | EOF | '!' | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' | ':' |\n      if (l1 != 69)                 // '['\n      {\n        break;\n      }\n      whitespace();\n      parse_Predicate();\n    }\n    eventHandler.endNonterminal(\"PredicateList\", e0);\n  }\n\n  function try_PredicateList()\n  {\n    for (;;)\n    {\n      lookahead1W(228);             // S^WS | EOF | '!' | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' | ':' |\n      if (l1 != 69)                 // '['\n      {\n        break;\n      }\n      try_Predicate();\n    }\n  }\n\n  function parse_Predicate()\n  {\n    eventHandler.startNonterminal(\"Predicate\", e0);\n    shift(69);                      // '['\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Expr();\n    shift(70);                      // ']'\n    eventHandler.endNonterminal(\"Predicate\", e0);\n  }\n\n  function try_Predicate()\n  {\n    shiftT(69);                     // '['\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Expr();\n    shiftT(70);                     // ']'\n  }\n\n  function parse_Literal()\n  {\n    eventHandler.startNonterminal(\"Literal\", e0);\n    switch (l1)\n    {\n    case 11:                        // StringLiteral\n      shift(11);                    // StringLiteral\n      break;\n    case 135:                       // 'false'\n    case 255:                       // 'true'\n      parse_BooleanLiteral();\n      break;\n    case 197:                       // 'null'\n      parse_NullLiteral();\n      break;\n    default:\n      parse_NumericLiteral();\n    }\n    eventHandler.endNonterminal(\"Literal\", e0);\n  }\n\n  function try_Literal()\n  {\n    switch (l1)\n    {\n    case 11:                        // StringLiteral\n      shiftT(11);                   // StringLiteral\n      break;\n    case 135:                       // 'false'\n    case 255:                       // 'true'\n      try_BooleanLiteral();\n      break;\n    case 197:                       // 'null'\n      try_NullLiteral();\n      break;\n    default:\n      try_NumericLiteral();\n    }\n  }\n\n  function parse_BooleanLiteral()\n  {\n    eventHandler.startNonterminal(\"BooleanLiteral\", e0);\n    switch (l1)\n    {\n    case 255:                       // 'true'\n      shift(255);                   // 'true'\n      break;\n    default:\n      shift(135);                   // 'false'\n    }\n    eventHandler.endNonterminal(\"BooleanLiteral\", e0);\n  }\n\n  function try_BooleanLiteral()\n  {\n    switch (l1)\n    {\n    case 255:                       // 'true'\n      shiftT(255);                  // 'true'\n      break;\n    default:\n      shiftT(135);                  // 'false'\n    }\n  }\n\n  function parse_NullLiteral()\n  {\n    eventHandler.startNonterminal(\"NullLiteral\", e0);\n    shift(197);                     // 'null'\n    eventHandler.endNonterminal(\"NullLiteral\", e0);\n  }\n\n  function try_NullLiteral()\n  {\n    shiftT(197);                    // 'null'\n  }\n\n  function parse_NumericLiteral()\n  {\n    eventHandler.startNonterminal(\"NumericLiteral\", e0);\n    switch (l1)\n    {\n    case 8:                         // IntegerLiteral\n      shift(8);                     // IntegerLiteral\n      break;\n    case 9:                         // DecimalLiteral\n      shift(9);                     // DecimalLiteral\n      break;\n    default:\n      shift(10);                    // DoubleLiteral\n    }\n    eventHandler.endNonterminal(\"NumericLiteral\", e0);\n  }\n\n  function try_NumericLiteral()\n  {\n    switch (l1)\n    {\n    case 8:                         // IntegerLiteral\n      shiftT(8);                    // IntegerLiteral\n      break;\n    case 9:                         // DecimalLiteral\n      shiftT(9);                    // DecimalLiteral\n      break;\n    default:\n      shiftT(10);                   // DoubleLiteral\n    }\n  }\n\n  function parse_VarRef()\n  {\n    eventHandler.startNonterminal(\"VarRef\", e0);\n    shift(31);                      // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    eventHandler.endNonterminal(\"VarRef\", e0);\n  }\n\n  function try_VarRef()\n  {\n    shiftT(31);                     // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n  }\n\n  function parse_VarName()\n  {\n    eventHandler.startNonterminal(\"VarName\", e0);\n    parse_EQName();\n    eventHandler.endNonterminal(\"VarName\", e0);\n  }\n\n  function try_VarName()\n  {\n    try_EQName();\n  }\n\n  function parse_ParenthesizedExpr()\n  {\n    eventHandler.startNonterminal(\"ParenthesizedExpr\", e0);\n    shift(35);                      // '('\n    lookahead1W(270);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    if (l1 != 38)                   // ')'\n    {\n      whitespace();\n      parse_Expr();\n    }\n    shift(38);                      // ')'\n    eventHandler.endNonterminal(\"ParenthesizedExpr\", e0);\n  }\n\n  function try_ParenthesizedExpr()\n  {\n    shiftT(35);                     // '('\n    lookahead1W(270);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    if (l1 != 38)                   // ')'\n    {\n      try_Expr();\n    }\n    shiftT(38);                     // ')'\n  }\n\n  function parse_ContextItemExpr()\n  {\n    eventHandler.startNonterminal(\"ContextItemExpr\", e0);\n    shift(32);                      // '$$'\n    eventHandler.endNonterminal(\"ContextItemExpr\", e0);\n  }\n\n  function try_ContextItemExpr()\n  {\n    shiftT(32);                     // '$$'\n  }\n\n  function parse_OrderedExpr()\n  {\n    eventHandler.startNonterminal(\"OrderedExpr\", e0);\n    shift(206);                     // 'ordered'\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    shift(281);                     // '{'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Expr();\n    shift(287);                     // '}'\n    eventHandler.endNonterminal(\"OrderedExpr\", e0);\n  }\n\n  function try_OrderedExpr()\n  {\n    shiftT(206);                    // 'ordered'\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    shiftT(281);                    // '{'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Expr();\n    shiftT(287);                    // '}'\n  }\n\n  function parse_UnorderedExpr()\n  {\n    eventHandler.startNonterminal(\"UnorderedExpr\", e0);\n    shift(262);                     // 'unordered'\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    shift(281);                     // '{'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Expr();\n    shift(287);                     // '}'\n    eventHandler.endNonterminal(\"UnorderedExpr\", e0);\n  }\n\n  function try_UnorderedExpr()\n  {\n    shiftT(262);                    // 'unordered'\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    shiftT(281);                    // '{'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Expr();\n    shiftT(287);                    // '}'\n  }\n\n  function parse_FunctionCall()\n  {\n    eventHandler.startNonterminal(\"FunctionCall\", e0);\n    parse_FunctionName();\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    whitespace();\n    parse_ArgumentList();\n    eventHandler.endNonterminal(\"FunctionCall\", e0);\n  }\n\n  function try_FunctionCall()\n  {\n    try_FunctionName();\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    try_ArgumentList();\n  }\n\n  function parse_Argument()\n  {\n    eventHandler.startNonterminal(\"Argument\", e0);\n    switch (l1)\n    {\n    case 65:                        // '?'\n      parse_ArgumentPlaceholder();\n      break;\n    default:\n      parse_ExprSingle();\n    }\n    eventHandler.endNonterminal(\"Argument\", e0);\n  }\n\n  function try_Argument()\n  {\n    switch (l1)\n    {\n    case 65:                        // '?'\n      try_ArgumentPlaceholder();\n      break;\n    default:\n      try_ExprSingle();\n    }\n  }\n\n  function parse_ArgumentPlaceholder()\n  {\n    eventHandler.startNonterminal(\"ArgumentPlaceholder\", e0);\n    shift(65);                      // '?'\n    eventHandler.endNonterminal(\"ArgumentPlaceholder\", e0);\n  }\n\n  function try_ArgumentPlaceholder()\n  {\n    shiftT(65);                     // '?'\n  }\n\n  function parse_Constructor()\n  {\n    eventHandler.startNonterminal(\"Constructor\", e0);\n    switch (l1)\n    {\n    case 55:                        // '<'\n    case 56:                        // '<!--'\n    case 60:                        // '<?'\n      parse_DirectConstructor();\n      break;\n    default:\n      parse_ComputedConstructor();\n    }\n    eventHandler.endNonterminal(\"Constructor\", e0);\n  }\n\n  function try_Constructor()\n  {\n    switch (l1)\n    {\n    case 55:                        // '<'\n    case 56:                        // '<!--'\n    case 60:                        // '<?'\n      try_DirectConstructor();\n      break;\n    default:\n      try_ComputedConstructor();\n    }\n  }\n\n  function parse_DirectConstructor()\n  {\n    eventHandler.startNonterminal(\"DirectConstructor\", e0);\n    switch (l1)\n    {\n    case 55:                        // '<'\n      parse_DirElemConstructor();\n      break;\n    case 56:                        // '<!--'\n      parse_DirCommentConstructor();\n      break;\n    default:\n      parse_DirPIConstructor();\n    }\n    eventHandler.endNonterminal(\"DirectConstructor\", e0);\n  }\n\n  function try_DirectConstructor()\n  {\n    switch (l1)\n    {\n    case 55:                        // '<'\n      try_DirElemConstructor();\n      break;\n    case 56:                        // '<!--'\n      try_DirCommentConstructor();\n      break;\n    default:\n      try_DirPIConstructor();\n    }\n  }\n\n  function parse_DirElemConstructor()\n  {\n    eventHandler.startNonterminal(\"DirElemConstructor\", e0);\n    shift(55);                      // '<'\n    lookahead1(4);                  // QName\n    shift(20);                      // QName\n    parse_DirAttributeList();\n    switch (l1)\n    {\n    case 49:                        // '/>'\n      shift(49);                    // '/>'\n      break;\n    default:\n      shift(62);                    // '>'\n      for (;;)\n      {\n        lookahead1(196);            // CDataSection | PredefinedEntityRef | ElementContentChar | CharRef | '<' |\n        if (l1 == 57)               // '</'\n        {\n          break;\n        }\n        parse_DirElemContent();\n      }\n      shift(57);                    // '</'\n      lookahead1(4);                // QName\n      shift(20);                    // QName\n      lookahead1(12);               // S | '>'\n      if (l1 == 21)                 // S\n      {\n        shift(21);                  // S\n      }\n      lookahead1(8);                // '>'\n      shift(62);                    // '>'\n    }\n    eventHandler.endNonterminal(\"DirElemConstructor\", e0);\n  }\n\n  function try_DirElemConstructor()\n  {\n    shiftT(55);                     // '<'\n    lookahead1(4);                  // QName\n    shiftT(20);                     // QName\n    try_DirAttributeList();\n    switch (l1)\n    {\n    case 49:                        // '/>'\n      shiftT(49);                   // '/>'\n      break;\n    default:\n      shiftT(62);                   // '>'\n      for (;;)\n      {\n        lookahead1(196);            // CDataSection | PredefinedEntityRef | ElementContentChar | CharRef | '<' |\n        if (l1 == 57)               // '</'\n        {\n          break;\n        }\n        try_DirElemContent();\n      }\n      shiftT(57);                   // '</'\n      lookahead1(4);                // QName\n      shiftT(20);                   // QName\n      lookahead1(12);               // S | '>'\n      if (l1 == 21)                 // S\n      {\n        shiftT(21);                 // S\n      }\n      lookahead1(8);                // '>'\n      shiftT(62);                   // '>'\n    }\n  }\n\n  function parse_DirAttributeList()\n  {\n    eventHandler.startNonterminal(\"DirAttributeList\", e0);\n    for (;;)\n    {\n      lookahead1(19);               // S | '/>' | '>'\n      if (l1 != 21)                 // S\n      {\n        break;\n      }\n      shift(21);                    // S\n      lookahead1(94);               // QName | S | '/>' | '>'\n      if (l1 == 20)                 // QName\n      {\n        shift(20);                  // QName\n        lookahead1(11);             // S | '='\n        if (l1 == 21)               // S\n        {\n          shift(21);                // S\n        }\n        lookahead1(7);              // '='\n        shift(61);                  // '='\n        lookahead1(18);             // S | '\"' | \"'\"\n        if (l1 == 21)               // S\n        {\n          shift(21);                // S\n        }\n        parse_DirAttributeValue();\n      }\n    }\n    eventHandler.endNonterminal(\"DirAttributeList\", e0);\n  }\n\n  function try_DirAttributeList()\n  {\n    for (;;)\n    {\n      lookahead1(19);               // S | '/>' | '>'\n      if (l1 != 21)                 // S\n      {\n        break;\n      }\n      shiftT(21);                   // S\n      lookahead1(94);               // QName | S | '/>' | '>'\n      if (l1 == 20)                 // QName\n      {\n        shiftT(20);                 // QName\n        lookahead1(11);             // S | '='\n        if (l1 == 21)               // S\n        {\n          shiftT(21);               // S\n        }\n        lookahead1(7);              // '='\n        shiftT(61);                 // '='\n        lookahead1(18);             // S | '\"' | \"'\"\n        if (l1 == 21)               // S\n        {\n          shiftT(21);               // S\n        }\n        try_DirAttributeValue();\n      }\n    }\n  }\n\n  function parse_DirAttributeValue()\n  {\n    eventHandler.startNonterminal(\"DirAttributeValue\", e0);\n    lookahead1(14);                 // '\"' | \"'\"\n    switch (l1)\n    {\n    case 28:                        // '\"'\n      shift(28);                    // '\"'\n      for (;;)\n      {\n        lookahead1(185);            // PredefinedEntityRef | EscapeQuot | QuotAttrContentChar | CharRef | '\"' | '{' |\n        if (l1 == 28)               // '\"'\n        {\n          break;\n        }\n        switch (l1)\n        {\n        case 13:                    // EscapeQuot\n          shift(13);                // EscapeQuot\n          break;\n        default:\n          parse_QuotAttrValueContent();\n        }\n      }\n      shift(28);                    // '\"'\n      break;\n    default:\n      shift(34);                    // \"'\"\n      for (;;)\n      {\n        lookahead1(186);            // PredefinedEntityRef | EscapeApos | AposAttrContentChar | CharRef | \"'\" | '{' |\n        if (l1 == 34)               // \"'\"\n        {\n          break;\n        }\n        switch (l1)\n        {\n        case 14:                    // EscapeApos\n          shift(14);                // EscapeApos\n          break;\n        default:\n          parse_AposAttrValueContent();\n        }\n      }\n      shift(34);                    // \"'\"\n    }\n    eventHandler.endNonterminal(\"DirAttributeValue\", e0);\n  }\n\n  function try_DirAttributeValue()\n  {\n    lookahead1(14);                 // '\"' | \"'\"\n    switch (l1)\n    {\n    case 28:                        // '\"'\n      shiftT(28);                   // '\"'\n      for (;;)\n      {\n        lookahead1(185);            // PredefinedEntityRef | EscapeQuot | QuotAttrContentChar | CharRef | '\"' | '{' |\n        if (l1 == 28)               // '\"'\n        {\n          break;\n        }\n        switch (l1)\n        {\n        case 13:                    // EscapeQuot\n          shiftT(13);               // EscapeQuot\n          break;\n        default:\n          try_QuotAttrValueContent();\n        }\n      }\n      shiftT(28);                   // '\"'\n      break;\n    default:\n      shiftT(34);                   // \"'\"\n      for (;;)\n      {\n        lookahead1(186);            // PredefinedEntityRef | EscapeApos | AposAttrContentChar | CharRef | \"'\" | '{' |\n        if (l1 == 34)               // \"'\"\n        {\n          break;\n        }\n        switch (l1)\n        {\n        case 14:                    // EscapeApos\n          shiftT(14);               // EscapeApos\n          break;\n        default:\n          try_AposAttrValueContent();\n        }\n      }\n      shiftT(34);                   // \"'\"\n    }\n  }\n\n  function parse_QuotAttrValueContent()\n  {\n    eventHandler.startNonterminal(\"QuotAttrValueContent\", e0);\n    switch (l1)\n    {\n    case 16:                        // QuotAttrContentChar\n      shift(16);                    // QuotAttrContentChar\n      break;\n    default:\n      parse_CommonContent();\n    }\n    eventHandler.endNonterminal(\"QuotAttrValueContent\", e0);\n  }\n\n  function try_QuotAttrValueContent()\n  {\n    switch (l1)\n    {\n    case 16:                        // QuotAttrContentChar\n      shiftT(16);                   // QuotAttrContentChar\n      break;\n    default:\n      try_CommonContent();\n    }\n  }\n\n  function parse_AposAttrValueContent()\n  {\n    eventHandler.startNonterminal(\"AposAttrValueContent\", e0);\n    switch (l1)\n    {\n    case 17:                        // AposAttrContentChar\n      shift(17);                    // AposAttrContentChar\n      break;\n    default:\n      parse_CommonContent();\n    }\n    eventHandler.endNonterminal(\"AposAttrValueContent\", e0);\n  }\n\n  function try_AposAttrValueContent()\n  {\n    switch (l1)\n    {\n    case 17:                        // AposAttrContentChar\n      shiftT(17);                   // AposAttrContentChar\n      break;\n    default:\n      try_CommonContent();\n    }\n  }\n\n  function parse_DirElemContent()\n  {\n    eventHandler.startNonterminal(\"DirElemContent\", e0);\n    switch (l1)\n    {\n    case 55:                        // '<'\n    case 56:                        // '<!--'\n    case 60:                        // '<?'\n      parse_DirectConstructor();\n      break;\n    case 4:                         // CDataSection\n      shift(4);                     // CDataSection\n      break;\n    case 15:                        // ElementContentChar\n      shift(15);                    // ElementContentChar\n      break;\n    default:\n      parse_CommonContent();\n    }\n    eventHandler.endNonterminal(\"DirElemContent\", e0);\n  }\n\n  function try_DirElemContent()\n  {\n    switch (l1)\n    {\n    case 55:                        // '<'\n    case 56:                        // '<!--'\n    case 60:                        // '<?'\n      try_DirectConstructor();\n      break;\n    case 4:                         // CDataSection\n      shiftT(4);                    // CDataSection\n      break;\n    case 15:                        // ElementContentChar\n      shiftT(15);                   // ElementContentChar\n      break;\n    default:\n      try_CommonContent();\n    }\n  }\n\n  function parse_DirCommentConstructor()\n  {\n    eventHandler.startNonterminal(\"DirCommentConstructor\", e0);\n    shift(56);                      // '<!--'\n    lookahead1(1);                  // DirCommentContents\n    shift(2);                       // DirCommentContents\n    lookahead1(6);                  // '-->'\n    shift(44);                      // '-->'\n    eventHandler.endNonterminal(\"DirCommentConstructor\", e0);\n  }\n\n  function try_DirCommentConstructor()\n  {\n    shiftT(56);                     // '<!--'\n    lookahead1(1);                  // DirCommentContents\n    shiftT(2);                      // DirCommentContents\n    lookahead1(6);                  // '-->'\n    shiftT(44);                     // '-->'\n  }\n\n  function parse_DirPIConstructor()\n  {\n    eventHandler.startNonterminal(\"DirPIConstructor\", e0);\n    shift(60);                      // '<?'\n    lookahead1(3);                  // PITarget\n    shift(18);                      // PITarget\n    lookahead1(13);                 // S | '?>'\n    if (l1 == 21)                   // S\n    {\n      shift(21);                    // S\n      lookahead1(2);                // DirPIContents\n      shift(3);                     // DirPIContents\n    }\n    lookahead1(9);                  // '?>'\n    shift(66);                      // '?>'\n    eventHandler.endNonterminal(\"DirPIConstructor\", e0);\n  }\n\n  function try_DirPIConstructor()\n  {\n    shiftT(60);                     // '<?'\n    lookahead1(3);                  // PITarget\n    shiftT(18);                     // PITarget\n    lookahead1(13);                 // S | '?>'\n    if (l1 == 21)                   // S\n    {\n      shiftT(21);                   // S\n      lookahead1(2);                // DirPIContents\n      shiftT(3);                    // DirPIContents\n    }\n    lookahead1(9);                  // '?>'\n    shiftT(66);                     // '?>'\n  }\n\n  function parse_ComputedConstructor()\n  {\n    eventHandler.startNonterminal(\"ComputedConstructor\", e0);\n    switch (l1)\n    {\n    case 120:                       // 'document'\n      parse_CompDocConstructor();\n      break;\n    case 122:                       // 'element'\n      parse_CompElemConstructor();\n      break;\n    case 83:                        // 'attribute'\n      parse_CompAttrConstructor();\n      break;\n    case 187:                       // 'namespace'\n      parse_CompNamespaceConstructor();\n      break;\n    case 249:                       // 'text'\n      parse_CompTextConstructor();\n      break;\n    case 97:                        // 'comment'\n      parse_CompCommentConstructor();\n      break;\n    default:\n      parse_CompPIConstructor();\n    }\n    eventHandler.endNonterminal(\"ComputedConstructor\", e0);\n  }\n\n  function try_ComputedConstructor()\n  {\n    switch (l1)\n    {\n    case 120:                       // 'document'\n      try_CompDocConstructor();\n      break;\n    case 122:                       // 'element'\n      try_CompElemConstructor();\n      break;\n    case 83:                        // 'attribute'\n      try_CompAttrConstructor();\n      break;\n    case 187:                       // 'namespace'\n      try_CompNamespaceConstructor();\n      break;\n    case 249:                       // 'text'\n      try_CompTextConstructor();\n      break;\n    case 97:                        // 'comment'\n      try_CompCommentConstructor();\n      break;\n    default:\n      try_CompPIConstructor();\n    }\n  }\n\n  function parse_CompElemConstructor()\n  {\n    eventHandler.startNonterminal(\"CompElemConstructor\", e0);\n    shift(122);                     // 'element'\n    lookahead1W(250);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    switch (l1)\n    {\n    case 281:                       // '{'\n      shift(281);                   // '{'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_Expr();\n      shift(287);                   // '}'\n      break;\n    default:\n      whitespace();\n      parse_EQName();\n    }\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    shift(281);                     // '{'\n    lookahead1W(281);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    if (l1 != 287)                  // '}'\n    {\n      whitespace();\n      parse_ContentExpr();\n    }\n    shift(287);                     // '}'\n    eventHandler.endNonterminal(\"CompElemConstructor\", e0);\n  }\n\n  function try_CompElemConstructor()\n  {\n    shiftT(122);                    // 'element'\n    lookahead1W(250);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    switch (l1)\n    {\n    case 281:                       // '{'\n      shiftT(281);                  // '{'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_Expr();\n      shiftT(287);                  // '}'\n      break;\n    default:\n      try_EQName();\n    }\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    shiftT(281);                    // '{'\n    lookahead1W(281);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    if (l1 != 287)                  // '}'\n    {\n      try_ContentExpr();\n    }\n    shiftT(287);                    // '}'\n  }\n\n  function parse_CompNamespaceConstructor()\n  {\n    eventHandler.startNonterminal(\"CompNamespaceConstructor\", e0);\n    shift(187);                     // 'namespace'\n    lookahead1W(242);               // NCName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    switch (l1)\n    {\n    case 281:                       // '{'\n      shift(281);                   // '{'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_PrefixExpr();\n      shift(287);                   // '}'\n      break;\n    default:\n      whitespace();\n      parse_Prefix();\n    }\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    shift(281);                     // '{'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_URIExpr();\n    shift(287);                     // '}'\n    eventHandler.endNonterminal(\"CompNamespaceConstructor\", e0);\n  }\n\n  function try_CompNamespaceConstructor()\n  {\n    shiftT(187);                    // 'namespace'\n    lookahead1W(242);               // NCName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    switch (l1)\n    {\n    case 281:                       // '{'\n      shiftT(281);                  // '{'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_PrefixExpr();\n      shiftT(287);                  // '}'\n      break;\n    default:\n      try_Prefix();\n    }\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    shiftT(281);                    // '{'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_URIExpr();\n    shiftT(287);                    // '}'\n  }\n\n  function parse_Prefix()\n  {\n    eventHandler.startNonterminal(\"Prefix\", e0);\n    parse_NCName();\n    eventHandler.endNonterminal(\"Prefix\", e0);\n  }\n\n  function try_Prefix()\n  {\n    try_NCName();\n  }\n\n  function parse_PrefixExpr()\n  {\n    eventHandler.startNonterminal(\"PrefixExpr\", e0);\n    parse_Expr();\n    eventHandler.endNonterminal(\"PrefixExpr\", e0);\n  }\n\n  function try_PrefixExpr()\n  {\n    try_Expr();\n  }\n\n  function parse_URIExpr()\n  {\n    eventHandler.startNonterminal(\"URIExpr\", e0);\n    parse_Expr();\n    eventHandler.endNonterminal(\"URIExpr\", e0);\n  }\n\n  function try_URIExpr()\n  {\n    try_Expr();\n  }\n\n  function parse_FunctionItemExpr()\n  {\n    eventHandler.startNonterminal(\"FunctionItemExpr\", e0);\n    switch (l1)\n    {\n    case 147:                       // 'function'\n      lookahead2W(95);              // S^WS | '#' | '(' | '(:'\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 33:                        // '%'\n    case 18067:                     // 'function' '('\n      parse_InlineFunctionExpr();\n      break;\n    default:\n      parse_NamedFunctionRef();\n    }\n    eventHandler.endNonterminal(\"FunctionItemExpr\", e0);\n  }\n\n  function try_FunctionItemExpr()\n  {\n    switch (l1)\n    {\n    case 147:                       // 'function'\n      lookahead2W(95);              // S^WS | '#' | '(' | '(:'\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 33:                        // '%'\n    case 18067:                     // 'function' '('\n      try_InlineFunctionExpr();\n      break;\n    default:\n      try_NamedFunctionRef();\n    }\n  }\n\n  function parse_NamedFunctionRef()\n  {\n    eventHandler.startNonterminal(\"NamedFunctionRef\", e0);\n    parse_EQName();\n    lookahead1W(20);                // S^WS | '#' | '(:'\n    shift(29);                      // '#'\n    lookahead1W(16);                // IntegerLiteral | S^WS | '(:'\n    shift(8);                       // IntegerLiteral\n    eventHandler.endNonterminal(\"NamedFunctionRef\", e0);\n  }\n\n  function try_NamedFunctionRef()\n  {\n    try_EQName();\n    lookahead1W(20);                // S^WS | '#' | '(:'\n    shiftT(29);                     // '#'\n    lookahead1W(16);                // IntegerLiteral | S^WS | '(:'\n    shiftT(8);                      // IntegerLiteral\n  }\n\n  function parse_InlineFunctionExpr()\n  {\n    eventHandler.startNonterminal(\"InlineFunctionExpr\", e0);\n    for (;;)\n    {\n      lookahead1W(101);             // S^WS | '%' | '(:' | 'function'\n      if (l1 != 33)                 // '%'\n      {\n        break;\n      }\n      whitespace();\n      parse_Annotation();\n    }\n    shift(147);                     // 'function'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(35);                      // '('\n    lookahead1W(98);                // S^WS | '$' | '(:' | ')'\n    if (l1 == 31)                   // '$'\n    {\n      whitespace();\n      parse_ParamList();\n    }\n    shift(38);                      // ')'\n    lookahead1W(115);               // S^WS | '(:' | 'as' | '{'\n    if (l1 == 80)                   // 'as'\n    {\n      shift(80);                    // 'as'\n      lookahead1W(254);             // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_SequenceType();\n    }\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    whitespace();\n    parse_FunctionBody();\n    eventHandler.endNonterminal(\"InlineFunctionExpr\", e0);\n  }\n\n  function try_InlineFunctionExpr()\n  {\n    for (;;)\n    {\n      lookahead1W(101);             // S^WS | '%' | '(:' | 'function'\n      if (l1 != 33)                 // '%'\n      {\n        break;\n      }\n      try_Annotation();\n    }\n    shiftT(147);                    // 'function'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(35);                     // '('\n    lookahead1W(98);                // S^WS | '$' | '(:' | ')'\n    if (l1 == 31)                   // '$'\n    {\n      try_ParamList();\n    }\n    shiftT(38);                     // ')'\n    lookahead1W(115);               // S^WS | '(:' | 'as' | '{'\n    if (l1 == 80)                   // 'as'\n    {\n      shiftT(80);                   // 'as'\n      lookahead1W(254);             // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_SequenceType();\n    }\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    try_FunctionBody();\n  }\n\n  function parse_SingleType()\n  {\n    eventHandler.startNonterminal(\"SingleType\", e0);\n    parse_SimpleTypeName();\n    lookahead1W(226);               // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n    if (l1 == 65)                   // '?'\n    {\n      shift(65);                    // '?'\n    }\n    eventHandler.endNonterminal(\"SingleType\", e0);\n  }\n\n  function try_SingleType()\n  {\n    try_SimpleTypeName();\n    lookahead1W(226);               // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n    if (l1 == 65)                   // '?'\n    {\n      shiftT(65);                   // '?'\n    }\n  }\n\n  function parse_TypeDeclaration()\n  {\n    eventHandler.startNonterminal(\"TypeDeclaration\", e0);\n    shift(80);                      // 'as'\n    lookahead1W(254);               // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_SequenceType();\n    eventHandler.endNonterminal(\"TypeDeclaration\", e0);\n  }\n\n  function try_TypeDeclaration()\n  {\n    shiftT(80);                     // 'as'\n    lookahead1W(254);               // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_SequenceType();\n  }\n\n  function parse_SequenceType()\n  {\n    eventHandler.startNonterminal(\"SequenceType\", e0);\n    switch (l1)\n    {\n    case 35:                        // '('\n      lookahead2W(259);             // EQName^Token | S^WS | '%' | '(' | '(:' | ')' | 'after' | 'allowing' |\n      break;\n    case 125:                       // 'empty-sequence'\n      lookahead2W(233);             // S^WS | EOF | '!=' | '(' | '(:' | ')' | '*' | '*' | '+' | ',' | '-' | ':' | ':=' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 18045:                     // 'empty-sequence' '('\n    case 19491:                     // '(' ')'\n      if (l1 == 125)                // 'empty-sequence'\n      {\n        shift(125);                 // 'empty-sequence'\n      }\n      lookahead1W(22);              // S^WS | '(' | '(:'\n      shift(35);                    // '('\n      lookahead1W(23);              // S^WS | '(:' | ')'\n      shift(38);                    // ')'\n      break;\n    default:\n      parse_ItemType();\n      lookahead1W(229);             // S^WS | EOF | '!=' | '(:' | ')' | '*' | '*' | '+' | ',' | '-' | ':' | ':=' | ';' |\n      switch (l1)\n      {\n      case 40:                      // '*'\n      case 41:                      // '+'\n      case 65:                      // '?'\n        whitespace();\n        parse_OccurrenceIndicator();\n        break;\n      default:\n        break;\n      }\n    }\n    eventHandler.endNonterminal(\"SequenceType\", e0);\n  }\n\n  function try_SequenceType()\n  {\n    switch (l1)\n    {\n    case 35:                        // '('\n      lookahead2W(259);             // EQName^Token | S^WS | '%' | '(' | '(:' | ')' | 'after' | 'allowing' |\n      break;\n    case 125:                       // 'empty-sequence'\n      lookahead2W(233);             // S^WS | EOF | '!=' | '(' | '(:' | ')' | '*' | '*' | '+' | ',' | '-' | ':' | ':=' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 18045:                     // 'empty-sequence' '('\n    case 19491:                     // '(' ')'\n      if (l1 == 125)                // 'empty-sequence'\n      {\n        shiftT(125);                // 'empty-sequence'\n      }\n      lookahead1W(22);              // S^WS | '(' | '(:'\n      shiftT(35);                   // '('\n      lookahead1W(23);              // S^WS | '(:' | ')'\n      shiftT(38);                   // ')'\n      break;\n    default:\n      try_ItemType();\n      lookahead1W(229);             // S^WS | EOF | '!=' | '(:' | ')' | '*' | '*' | '+' | ',' | '-' | ':' | ':=' | ';' |\n      switch (l1)\n      {\n      case 40:                      // '*'\n      case 41:                      // '+'\n      case 65:                      // '?'\n        try_OccurrenceIndicator();\n        break;\n      default:\n        break;\n      }\n    }\n  }\n\n  function parse_OccurrenceIndicator()\n  {\n    eventHandler.startNonterminal(\"OccurrenceIndicator\", e0);\n    switch (l1)\n    {\n    case 65:                        // '?'\n      shift(65);                    // '?'\n      break;\n    case 40:                        // '*'\n      shift(40);                    // '*'\n      break;\n    default:\n      shift(41);                    // '+'\n    }\n    eventHandler.endNonterminal(\"OccurrenceIndicator\", e0);\n  }\n\n  function try_OccurrenceIndicator()\n  {\n    switch (l1)\n    {\n    case 65:                        // '?'\n      shiftT(65);                   // '?'\n      break;\n    case 40:                        // '*'\n      shiftT(40);                   // '*'\n      break;\n    default:\n      shiftT(41);                   // '+'\n    }\n  }\n\n  function parse_ItemType()\n  {\n    eventHandler.startNonterminal(\"ItemType\", e0);\n    switch (l1)\n    {\n    case 79:                        // 'array'\n    case 83:                        // 'attribute'\n    case 97:                        // 'comment'\n    case 121:                       // 'document-node'\n    case 122:                       // 'element'\n    case 147:                       // 'function'\n    case 167:                       // 'item'\n    case 169:                       // 'json-item'\n    case 188:                       // 'namespace-node'\n    case 194:                       // 'node'\n    case 198:                       // 'object'\n    case 220:                       // 'processing-instruction'\n    case 230:                       // 'schema-attribute'\n    case 231:                       // 'schema-element'\n    case 247:                       // 'structured-item'\n    case 249:                       // 'text'\n      lookahead2W(233);             // S^WS | EOF | '!=' | '(' | '(:' | ')' | '*' | '*' | '+' | ',' | '-' | ':' | ':=' |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 12879                 // 'array' EOF\n     || lk == 12969                 // 'json-item' EOF\n     || lk == 12998                 // 'object' EOF\n     || lk == 13047                 // 'structured-item' EOF\n     || lk == 13903                 // 'array' '!='\n     || lk == 13993                 // 'json-item' '!='\n     || lk == 14022                 // 'object' '!='\n     || lk == 14071                 // 'structured-item' '!='\n     || lk == 19535                 // 'array' ')'\n     || lk == 19625                 // 'json-item' ')'\n     || lk == 19654                 // 'object' ')'\n     || lk == 19703                 // 'structured-item' ')'\n     || lk == 20047                 // 'array' '*'\n     || lk == 20137                 // 'json-item' '*'\n     || lk == 20166                 // 'object' '*'\n     || lk == 20215                 // 'structured-item' '*'\n     || lk == 20559                 // 'array' '*'\n     || lk == 20649                 // 'json-item' '*'\n     || lk == 20678                 // 'object' '*'\n     || lk == 20727                 // 'structured-item' '*'\n     || lk == 21071                 // 'array' '+'\n     || lk == 21161                 // 'json-item' '+'\n     || lk == 21190                 // 'object' '+'\n     || lk == 21239                 // 'structured-item' '+'\n     || lk == 21583                 // 'array' ','\n     || lk == 21673                 // 'json-item' ','\n     || lk == 21702                 // 'object' ','\n     || lk == 21751                 // 'structured-item' ','\n     || lk == 22095                 // 'array' '-'\n     || lk == 22185                 // 'json-item' '-'\n     || lk == 22214                 // 'object' '-'\n     || lk == 22263                 // 'structured-item' '-'\n     || lk == 25679                 // 'array' ':'\n     || lk == 25769                 // 'json-item' ':'\n     || lk == 25798                 // 'object' ':'\n     || lk == 25847                 // 'structured-item' ':'\n     || lk == 27215                 // 'array' ':='\n     || lk == 27305                 // 'json-item' ':='\n     || lk == 27334                 // 'object' ':='\n     || lk == 27383                 // 'structured-item' ':='\n     || lk == 27727                 // 'array' ';'\n     || lk == 27817                 // 'json-item' ';'\n     || lk == 27846                 // 'object' ';'\n     || lk == 27895                 // 'structured-item' ';'\n     || lk == 28239                 // 'array' '<'\n     || lk == 28329                 // 'json-item' '<'\n     || lk == 28358                 // 'object' '<'\n     || lk == 28407                 // 'structured-item' '<'\n     || lk == 29775                 // 'array' '<<'\n     || lk == 29865                 // 'json-item' '<<'\n     || lk == 29894                 // 'object' '<<'\n     || lk == 29943                 // 'structured-item' '<<'\n     || lk == 30287                 // 'array' '<='\n     || lk == 30377                 // 'json-item' '<='\n     || lk == 30406                 // 'object' '<='\n     || lk == 30455                 // 'structured-item' '<='\n     || lk == 31311                 // 'array' '='\n     || lk == 31401                 // 'json-item' '='\n     || lk == 31430                 // 'object' '='\n     || lk == 31479                 // 'structured-item' '='\n     || lk == 31823                 // 'array' '>'\n     || lk == 31913                 // 'json-item' '>'\n     || lk == 31942                 // 'object' '>'\n     || lk == 31991                 // 'structured-item' '>'\n     || lk == 32335                 // 'array' '>='\n     || lk == 32425                 // 'json-item' '>='\n     || lk == 32454                 // 'object' '>='\n     || lk == 32503                 // 'structured-item' '>='\n     || lk == 32847                 // 'array' '>>'\n     || lk == 32937                 // 'json-item' '>>'\n     || lk == 32966                 // 'object' '>>'\n     || lk == 33015                 // 'structured-item' '>>'\n     || lk == 33359                 // 'array' '?'\n     || lk == 33449                 // 'json-item' '?'\n     || lk == 33478                 // 'object' '?'\n     || lk == 33527                 // 'structured-item' '?'\n     || lk == 35919                 // 'array' ']'\n     || lk == 36009                 // 'json-item' ']'\n     || lk == 36038                 // 'object' ']'\n     || lk == 36087                 // 'structured-item' ']'\n     || lk == 36431                 // 'array' 'after'\n     || lk == 36521                 // 'json-item' 'after'\n     || lk == 36550                 // 'object' 'after'\n     || lk == 36599                 // 'structured-item' 'after'\n     || lk == 37455                 // 'array' 'allowing'\n     || lk == 37545                 // 'json-item' 'allowing'\n     || lk == 37574                 // 'object' 'allowing'\n     || lk == 37623                 // 'structured-item' 'allowing'\n     || lk == 38991                 // 'array' 'and'\n     || lk == 39081                 // 'json-item' 'and'\n     || lk == 39110                 // 'object' 'and'\n     || lk == 39159                 // 'structured-item' 'and'\n     || lk == 41039                 // 'array' 'as'\n     || lk == 41129                 // 'json-item' 'as'\n     || lk == 41158                 // 'object' 'as'\n     || lk == 41207                 // 'structured-item' 'as'\n     || lk == 41551                 // 'array' 'ascending'\n     || lk == 41641                 // 'json-item' 'ascending'\n     || lk == 41670                 // 'object' 'ascending'\n     || lk == 41719                 // 'structured-item' 'ascending'\n     || lk == 42063                 // 'array' 'at'\n     || lk == 42153                 // 'json-item' 'at'\n     || lk == 42182                 // 'object' 'at'\n     || lk == 42231                 // 'structured-item' 'at'\n     || lk == 43599                 // 'array' 'before'\n     || lk == 43689                 // 'json-item' 'before'\n     || lk == 43718                 // 'object' 'before'\n     || lk == 43767                 // 'structured-item' 'before'\n     || lk == 45647                 // 'array' 'case'\n     || lk == 45737                 // 'json-item' 'case'\n     || lk == 45766                 // 'object' 'case'\n     || lk == 45815                 // 'structured-item' 'case'\n     || lk == 48719                 // 'array' 'collation'\n     || lk == 48809                 // 'json-item' 'collation'\n     || lk == 48838                 // 'object' 'collation'\n     || lk == 48887                 // 'structured-item' 'collation'\n     || lk == 51279                 // 'array' 'contains'\n     || lk == 51369                 // 'json-item' 'contains'\n     || lk == 51398                 // 'object' 'contains'\n     || lk == 51447                 // 'structured-item' 'contains'\n     || lk == 54351                 // 'array' 'count'\n     || lk == 54441                 // 'json-item' 'count'\n     || lk == 54470                 // 'object' 'count'\n     || lk == 54519                 // 'structured-item' 'count'\n     || lk == 56399                 // 'array' 'default'\n     || lk == 56489                 // 'json-item' 'default'\n     || lk == 56518                 // 'object' 'default'\n     || lk == 56567                 // 'structured-item' 'default'\n     || lk == 58447                 // 'array' 'descending'\n     || lk == 58537                 // 'json-item' 'descending'\n     || lk == 58566                 // 'object' 'descending'\n     || lk == 58615                 // 'structured-item' 'descending'\n     || lk == 61007                 // 'array' 'div'\n     || lk == 61097                 // 'json-item' 'div'\n     || lk == 61126                 // 'object' 'div'\n     || lk == 61175                 // 'structured-item' 'div'\n     || lk == 63055                 // 'array' 'else'\n     || lk == 63145                 // 'json-item' 'else'\n     || lk == 63174                 // 'object' 'else'\n     || lk == 63223                 // 'structured-item' 'else'\n     || lk == 63567                 // 'array' 'empty'\n     || lk == 63657                 // 'json-item' 'empty'\n     || lk == 63686                 // 'object' 'empty'\n     || lk == 63735                 // 'structured-item' 'empty'\n     || lk == 65103                 // 'array' 'end'\n     || lk == 65193                 // 'json-item' 'end'\n     || lk == 65222                 // 'object' 'end'\n     || lk == 65271                 // 'structured-item' 'end'\n     || lk == 66127                 // 'array' 'eq'\n     || lk == 66217                 // 'json-item' 'eq'\n     || lk == 66246                 // 'object' 'eq'\n     || lk == 66295                 // 'structured-item' 'eq'\n     || lk == 67663                 // 'array' 'except'\n     || lk == 67753                 // 'json-item' 'except'\n     || lk == 67782                 // 'object' 'except'\n     || lk == 67831                 // 'structured-item' 'except'\n     || lk == 68687                 // 'array' 'external'\n     || lk == 68777                 // 'json-item' 'external'\n     || lk == 68806                 // 'object' 'external'\n     || lk == 68855                 // 'structured-item' 'external'\n     || lk == 71247                 // 'array' 'for'\n     || lk == 71337                 // 'json-item' 'for'\n     || lk == 71366                 // 'object' 'for'\n     || lk == 71415                 // 'structured-item' 'for'\n     || lk == 75855                 // 'array' 'ge'\n     || lk == 75945                 // 'json-item' 'ge'\n     || lk == 75974                 // 'object' 'ge'\n     || lk == 76023                 // 'structured-item' 'ge'\n     || lk == 76879                 // 'array' 'group'\n     || lk == 76969                 // 'json-item' 'group'\n     || lk == 76998                 // 'object' 'group'\n     || lk == 77047                 // 'structured-item' 'group'\n     || lk == 77903                 // 'array' 'gt'\n     || lk == 77993                 // 'json-item' 'gt'\n     || lk == 78022                 // 'object' 'gt'\n     || lk == 78071                 // 'structured-item' 'gt'\n     || lk == 78415                 // 'array' 'idiv'\n     || lk == 78505                 // 'json-item' 'idiv'\n     || lk == 78534                 // 'object' 'idiv'\n     || lk == 78583                 // 'structured-item' 'idiv'\n     || lk == 79951                 // 'array' 'in'\n     || lk == 80041                 // 'json-item' 'in'\n     || lk == 80070                 // 'object' 'in'\n     || lk == 80119                 // 'structured-item' 'in'\n     || lk == 83023                 // 'array' 'instance'\n     || lk == 83113                 // 'json-item' 'instance'\n     || lk == 83142                 // 'object' 'instance'\n     || lk == 83191                 // 'structured-item' 'instance'\n     || lk == 84047                 // 'array' 'intersect'\n     || lk == 84137                 // 'json-item' 'intersect'\n     || lk == 84166                 // 'object' 'intersect'\n     || lk == 84215                 // 'structured-item' 'intersect'\n     || lk == 84559                 // 'array' 'into'\n     || lk == 84649                 // 'json-item' 'into'\n     || lk == 84678                 // 'object' 'into'\n     || lk == 84727                 // 'structured-item' 'into'\n     || lk == 85071                 // 'array' 'is'\n     || lk == 85161                 // 'json-item' 'is'\n     || lk == 85190                 // 'object' 'is'\n     || lk == 85239                 // 'structured-item' 'is'\n     || lk == 89679                 // 'array' 'le'\n     || lk == 89769                 // 'json-item' 'le'\n     || lk == 89798                 // 'object' 'le'\n     || lk == 89847                 // 'structured-item' 'le'\n     || lk == 90703                 // 'array' 'let'\n     || lk == 90793                 // 'json-item' 'let'\n     || lk == 90822                 // 'object' 'let'\n     || lk == 90871                 // 'structured-item' 'let'\n     || lk == 92751                 // 'array' 'lt'\n     || lk == 92841                 // 'json-item' 'lt'\n     || lk == 92870                 // 'object' 'lt'\n     || lk == 92919                 // 'structured-item' 'lt'\n     || lk == 93775                 // 'array' 'mod'\n     || lk == 93865                 // 'json-item' 'mod'\n     || lk == 93894                 // 'object' 'mod'\n     || lk == 93943                 // 'structured-item' 'mod'\n     || lk == 94287                 // 'array' 'modify'\n     || lk == 94377                 // 'json-item' 'modify'\n     || lk == 94406                 // 'object' 'modify'\n     || lk == 94455                 // 'structured-item' 'modify'\n     || lk == 96847                 // 'array' 'ne'\n     || lk == 96937                 // 'json-item' 'ne'\n     || lk == 96966                 // 'object' 'ne'\n     || lk == 97015                 // 'structured-item' 'ne'\n     || lk == 103503                // 'array' 'only'\n     || lk == 103593                // 'json-item' 'only'\n     || lk == 103622                // 'object' 'only'\n     || lk == 103671                // 'structured-item' 'only'\n     || lk == 104527                // 'array' 'or'\n     || lk == 104617                // 'json-item' 'or'\n     || lk == 104646                // 'object' 'or'\n     || lk == 104695                // 'structured-item' 'or'\n     || lk == 105039                // 'array' 'order'\n     || lk == 105129                // 'json-item' 'order'\n     || lk == 105158                // 'object' 'order'\n     || lk == 105207                // 'structured-item' 'order'\n     || lk == 107087                // 'array' 'paragraphs'\n     || lk == 107177                // 'json-item' 'paragraphs'\n     || lk == 107206                // 'object' 'paragraphs'\n     || lk == 107255                // 'structured-item' 'paragraphs'\n     || lk == 114767                // 'array' 'return'\n     || lk == 114857                // 'json-item' 'return'\n     || lk == 114886                // 'object' 'return'\n     || lk == 114935                // 'structured-item' 'return'\n     || lk == 116815                // 'array' 'satisfies'\n     || lk == 116905                // 'json-item' 'satisfies'\n     || lk == 116934                // 'object' 'satisfies'\n     || lk == 116983                // 'structured-item' 'satisfies'\n     || lk == 118863                // 'array' 'score'\n     || lk == 118953                // 'json-item' 'score'\n     || lk == 118982                // 'object' 'score'\n     || lk == 119031                // 'structured-item' 'score'\n     || lk == 121423                // 'array' 'sentences'\n     || lk == 121513                // 'json-item' 'sentences'\n     || lk == 121542                // 'object' 'sentences'\n     || lk == 121591                // 'structured-item' 'sentences'\n     || lk == 123471                // 'array' 'stable'\n     || lk == 123561                // 'json-item' 'stable'\n     || lk == 123590                // 'object' 'stable'\n     || lk == 123639                // 'structured-item' 'stable'\n     || lk == 123983                // 'array' 'start'\n     || lk == 124073                // 'json-item' 'start'\n     || lk == 124102                // 'object' 'start'\n     || lk == 124151                // 'structured-item' 'start'\n     || lk == 129103                // 'array' 'times'\n     || lk == 129193                // 'json-item' 'times'\n     || lk == 129222                // 'object' 'times'\n     || lk == 129271                // 'structured-item' 'times'\n     || lk == 129615                // 'array' 'to'\n     || lk == 129705                // 'json-item' 'to'\n     || lk == 129734                // 'object' 'to'\n     || lk == 129783                // 'structured-item' 'to'\n     || lk == 133199                // 'array' 'union'\n     || lk == 133289                // 'json-item' 'union'\n     || lk == 133318                // 'object' 'union'\n     || lk == 133367                // 'structured-item' 'union'\n     || lk == 139343                // 'array' 'where'\n     || lk == 139433                // 'json-item' 'where'\n     || lk == 139462                // 'object' 'where'\n     || lk == 139511                // 'structured-item' 'where'\n     || lk == 141391                // 'array' 'with'\n     || lk == 141481                // 'json-item' 'with'\n     || lk == 141510                // 'object' 'with'\n     || lk == 141559                // 'structured-item' 'with'\n     || lk == 142927                // 'array' 'words'\n     || lk == 143017                // 'json-item' 'words'\n     || lk == 143046                // 'object' 'words'\n     || lk == 143095                // 'structured-item' 'words'\n     || lk == 143951                // 'array' '{'\n     || lk == 144041                // 'json-item' '{'\n     || lk == 144070                // 'object' '{'\n     || lk == 144119                // 'structured-item' '{'\n     || lk == 145487                // 'array' '|'\n     || lk == 145577                // 'json-item' '|'\n     || lk == 145606                // 'object' '|'\n     || lk == 145655                // 'structured-item' '|'\n     || lk == 145999                // 'array' '||'\n     || lk == 146089                // 'json-item' '||'\n     || lk == 146118                // 'object' '||'\n     || lk == 146167                // 'structured-item' '||'\n     || lk == 146511                // 'array' '|}'\n     || lk == 146601                // 'json-item' '|}'\n     || lk == 146630                // 'object' '|}'\n     || lk == 146679                // 'structured-item' '|}'\n     || lk == 147023                // 'array' '}'\n     || lk == 147113                // 'json-item' '}'\n     || lk == 147142                // 'object' '}'\n     || lk == 147191)               // 'structured-item' '}'\n    {\n      lk = memoized(6, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_AtomicOrUnionType();\n          lk = -4;\n        }\n        catch (p4A)\n        {\n          try\n          {\n            b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n            b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n            b2 = b2A; e2 = e2A; end = e2A; }}\n            try_JSONTest();\n            lk = -6;\n          }\n          catch (p6A)\n          {\n            lk = -7;\n          }\n        }\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(6, e0, lk);\n      }\n    }\n    switch (lk)\n    {\n    case 18003:                     // 'attribute' '('\n    case 18017:                     // 'comment' '('\n    case 18041:                     // 'document-node' '('\n    case 18042:                     // 'element' '('\n    case 18108:                     // 'namespace-node' '('\n    case 18114:                     // 'node' '('\n    case 18140:                     // 'processing-instruction' '('\n    case 18150:                     // 'schema-attribute' '('\n    case 18151:                     // 'schema-element' '('\n    case 18169:                     // 'text' '('\n      parse_KindTest();\n      break;\n    case 18087:                     // 'item' '('\n      shift(167);                   // 'item'\n      lookahead1W(22);              // S^WS | '(' | '(:'\n      shift(35);                    // '('\n      lookahead1W(23);              // S^WS | '(:' | ')'\n      shift(38);                    // ')'\n      break;\n    case 33:                        // '%'\n    case 18067:                     // 'function' '('\n      parse_FunctionTest();\n      break;\n    case 35:                        // '('\n      parse_ParenthesizedItemType();\n      break;\n    case -6:\n    case 17999:                     // 'array' '('\n    case 18089:                     // 'json-item' '('\n    case 18118:                     // 'object' '('\n      parse_JSONTest();\n      break;\n    case -7:\n    case 18167:                     // 'structured-item' '('\n      parse_StructuredItemTest();\n      break;\n    default:\n      parse_AtomicOrUnionType();\n    }\n    eventHandler.endNonterminal(\"ItemType\", e0);\n  }\n\n  function try_ItemType()\n  {\n    switch (l1)\n    {\n    case 79:                        // 'array'\n    case 83:                        // 'attribute'\n    case 97:                        // 'comment'\n    case 121:                       // 'document-node'\n    case 122:                       // 'element'\n    case 147:                       // 'function'\n    case 167:                       // 'item'\n    case 169:                       // 'json-item'\n    case 188:                       // 'namespace-node'\n    case 194:                       // 'node'\n    case 198:                       // 'object'\n    case 220:                       // 'processing-instruction'\n    case 230:                       // 'schema-attribute'\n    case 231:                       // 'schema-element'\n    case 247:                       // 'structured-item'\n    case 249:                       // 'text'\n      lookahead2W(233);             // S^WS | EOF | '!=' | '(' | '(:' | ')' | '*' | '*' | '+' | ',' | '-' | ':' | ':=' |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 12879                 // 'array' EOF\n     || lk == 12969                 // 'json-item' EOF\n     || lk == 12998                 // 'object' EOF\n     || lk == 13047                 // 'structured-item' EOF\n     || lk == 13903                 // 'array' '!='\n     || lk == 13993                 // 'json-item' '!='\n     || lk == 14022                 // 'object' '!='\n     || lk == 14071                 // 'structured-item' '!='\n     || lk == 19535                 // 'array' ')'\n     || lk == 19625                 // 'json-item' ')'\n     || lk == 19654                 // 'object' ')'\n     || lk == 19703                 // 'structured-item' ')'\n     || lk == 20047                 // 'array' '*'\n     || lk == 20137                 // 'json-item' '*'\n     || lk == 20166                 // 'object' '*'\n     || lk == 20215                 // 'structured-item' '*'\n     || lk == 20559                 // 'array' '*'\n     || lk == 20649                 // 'json-item' '*'\n     || lk == 20678                 // 'object' '*'\n     || lk == 20727                 // 'structured-item' '*'\n     || lk == 21071                 // 'array' '+'\n     || lk == 21161                 // 'json-item' '+'\n     || lk == 21190                 // 'object' '+'\n     || lk == 21239                 // 'structured-item' '+'\n     || lk == 21583                 // 'array' ','\n     || lk == 21673                 // 'json-item' ','\n     || lk == 21702                 // 'object' ','\n     || lk == 21751                 // 'structured-item' ','\n     || lk == 22095                 // 'array' '-'\n     || lk == 22185                 // 'json-item' '-'\n     || lk == 22214                 // 'object' '-'\n     || lk == 22263                 // 'structured-item' '-'\n     || lk == 25679                 // 'array' ':'\n     || lk == 25769                 // 'json-item' ':'\n     || lk == 25798                 // 'object' ':'\n     || lk == 25847                 // 'structured-item' ':'\n     || lk == 27215                 // 'array' ':='\n     || lk == 27305                 // 'json-item' ':='\n     || lk == 27334                 // 'object' ':='\n     || lk == 27383                 // 'structured-item' ':='\n     || lk == 27727                 // 'array' ';'\n     || lk == 27817                 // 'json-item' ';'\n     || lk == 27846                 // 'object' ';'\n     || lk == 27895                 // 'structured-item' ';'\n     || lk == 28239                 // 'array' '<'\n     || lk == 28329                 // 'json-item' '<'\n     || lk == 28358                 // 'object' '<'\n     || lk == 28407                 // 'structured-item' '<'\n     || lk == 29775                 // 'array' '<<'\n     || lk == 29865                 // 'json-item' '<<'\n     || lk == 29894                 // 'object' '<<'\n     || lk == 29943                 // 'structured-item' '<<'\n     || lk == 30287                 // 'array' '<='\n     || lk == 30377                 // 'json-item' '<='\n     || lk == 30406                 // 'object' '<='\n     || lk == 30455                 // 'structured-item' '<='\n     || lk == 31311                 // 'array' '='\n     || lk == 31401                 // 'json-item' '='\n     || lk == 31430                 // 'object' '='\n     || lk == 31479                 // 'structured-item' '='\n     || lk == 31823                 // 'array' '>'\n     || lk == 31913                 // 'json-item' '>'\n     || lk == 31942                 // 'object' '>'\n     || lk == 31991                 // 'structured-item' '>'\n     || lk == 32335                 // 'array' '>='\n     || lk == 32425                 // 'json-item' '>='\n     || lk == 32454                 // 'object' '>='\n     || lk == 32503                 // 'structured-item' '>='\n     || lk == 32847                 // 'array' '>>'\n     || lk == 32937                 // 'json-item' '>>'\n     || lk == 32966                 // 'object' '>>'\n     || lk == 33015                 // 'structured-item' '>>'\n     || lk == 33359                 // 'array' '?'\n     || lk == 33449                 // 'json-item' '?'\n     || lk == 33478                 // 'object' '?'\n     || lk == 33527                 // 'structured-item' '?'\n     || lk == 35919                 // 'array' ']'\n     || lk == 36009                 // 'json-item' ']'\n     || lk == 36038                 // 'object' ']'\n     || lk == 36087                 // 'structured-item' ']'\n     || lk == 36431                 // 'array' 'after'\n     || lk == 36521                 // 'json-item' 'after'\n     || lk == 36550                 // 'object' 'after'\n     || lk == 36599                 // 'structured-item' 'after'\n     || lk == 37455                 // 'array' 'allowing'\n     || lk == 37545                 // 'json-item' 'allowing'\n     || lk == 37574                 // 'object' 'allowing'\n     || lk == 37623                 // 'structured-item' 'allowing'\n     || lk == 38991                 // 'array' 'and'\n     || lk == 39081                 // 'json-item' 'and'\n     || lk == 39110                 // 'object' 'and'\n     || lk == 39159                 // 'structured-item' 'and'\n     || lk == 41039                 // 'array' 'as'\n     || lk == 41129                 // 'json-item' 'as'\n     || lk == 41158                 // 'object' 'as'\n     || lk == 41207                 // 'structured-item' 'as'\n     || lk == 41551                 // 'array' 'ascending'\n     || lk == 41641                 // 'json-item' 'ascending'\n     || lk == 41670                 // 'object' 'ascending'\n     || lk == 41719                 // 'structured-item' 'ascending'\n     || lk == 42063                 // 'array' 'at'\n     || lk == 42153                 // 'json-item' 'at'\n     || lk == 42182                 // 'object' 'at'\n     || lk == 42231                 // 'structured-item' 'at'\n     || lk == 43599                 // 'array' 'before'\n     || lk == 43689                 // 'json-item' 'before'\n     || lk == 43718                 // 'object' 'before'\n     || lk == 43767                 // 'structured-item' 'before'\n     || lk == 45647                 // 'array' 'case'\n     || lk == 45737                 // 'json-item' 'case'\n     || lk == 45766                 // 'object' 'case'\n     || lk == 45815                 // 'structured-item' 'case'\n     || lk == 48719                 // 'array' 'collation'\n     || lk == 48809                 // 'json-item' 'collation'\n     || lk == 48838                 // 'object' 'collation'\n     || lk == 48887                 // 'structured-item' 'collation'\n     || lk == 51279                 // 'array' 'contains'\n     || lk == 51369                 // 'json-item' 'contains'\n     || lk == 51398                 // 'object' 'contains'\n     || lk == 51447                 // 'structured-item' 'contains'\n     || lk == 54351                 // 'array' 'count'\n     || lk == 54441                 // 'json-item' 'count'\n     || lk == 54470                 // 'object' 'count'\n     || lk == 54519                 // 'structured-item' 'count'\n     || lk == 56399                 // 'array' 'default'\n     || lk == 56489                 // 'json-item' 'default'\n     || lk == 56518                 // 'object' 'default'\n     || lk == 56567                 // 'structured-item' 'default'\n     || lk == 58447                 // 'array' 'descending'\n     || lk == 58537                 // 'json-item' 'descending'\n     || lk == 58566                 // 'object' 'descending'\n     || lk == 58615                 // 'structured-item' 'descending'\n     || lk == 61007                 // 'array' 'div'\n     || lk == 61097                 // 'json-item' 'div'\n     || lk == 61126                 // 'object' 'div'\n     || lk == 61175                 // 'structured-item' 'div'\n     || lk == 63055                 // 'array' 'else'\n     || lk == 63145                 // 'json-item' 'else'\n     || lk == 63174                 // 'object' 'else'\n     || lk == 63223                 // 'structured-item' 'else'\n     || lk == 63567                 // 'array' 'empty'\n     || lk == 63657                 // 'json-item' 'empty'\n     || lk == 63686                 // 'object' 'empty'\n     || lk == 63735                 // 'structured-item' 'empty'\n     || lk == 65103                 // 'array' 'end'\n     || lk == 65193                 // 'json-item' 'end'\n     || lk == 65222                 // 'object' 'end'\n     || lk == 65271                 // 'structured-item' 'end'\n     || lk == 66127                 // 'array' 'eq'\n     || lk == 66217                 // 'json-item' 'eq'\n     || lk == 66246                 // 'object' 'eq'\n     || lk == 66295                 // 'structured-item' 'eq'\n     || lk == 67663                 // 'array' 'except'\n     || lk == 67753                 // 'json-item' 'except'\n     || lk == 67782                 // 'object' 'except'\n     || lk == 67831                 // 'structured-item' 'except'\n     || lk == 68687                 // 'array' 'external'\n     || lk == 68777                 // 'json-item' 'external'\n     || lk == 68806                 // 'object' 'external'\n     || lk == 68855                 // 'structured-item' 'external'\n     || lk == 71247                 // 'array' 'for'\n     || lk == 71337                 // 'json-item' 'for'\n     || lk == 71366                 // 'object' 'for'\n     || lk == 71415                 // 'structured-item' 'for'\n     || lk == 75855                 // 'array' 'ge'\n     || lk == 75945                 // 'json-item' 'ge'\n     || lk == 75974                 // 'object' 'ge'\n     || lk == 76023                 // 'structured-item' 'ge'\n     || lk == 76879                 // 'array' 'group'\n     || lk == 76969                 // 'json-item' 'group'\n     || lk == 76998                 // 'object' 'group'\n     || lk == 77047                 // 'structured-item' 'group'\n     || lk == 77903                 // 'array' 'gt'\n     || lk == 77993                 // 'json-item' 'gt'\n     || lk == 78022                 // 'object' 'gt'\n     || lk == 78071                 // 'structured-item' 'gt'\n     || lk == 78415                 // 'array' 'idiv'\n     || lk == 78505                 // 'json-item' 'idiv'\n     || lk == 78534                 // 'object' 'idiv'\n     || lk == 78583                 // 'structured-item' 'idiv'\n     || lk == 79951                 // 'array' 'in'\n     || lk == 80041                 // 'json-item' 'in'\n     || lk == 80070                 // 'object' 'in'\n     || lk == 80119                 // 'structured-item' 'in'\n     || lk == 83023                 // 'array' 'instance'\n     || lk == 83113                 // 'json-item' 'instance'\n     || lk == 83142                 // 'object' 'instance'\n     || lk == 83191                 // 'structured-item' 'instance'\n     || lk == 84047                 // 'array' 'intersect'\n     || lk == 84137                 // 'json-item' 'intersect'\n     || lk == 84166                 // 'object' 'intersect'\n     || lk == 84215                 // 'structured-item' 'intersect'\n     || lk == 84559                 // 'array' 'into'\n     || lk == 84649                 // 'json-item' 'into'\n     || lk == 84678                 // 'object' 'into'\n     || lk == 84727                 // 'structured-item' 'into'\n     || lk == 85071                 // 'array' 'is'\n     || lk == 85161                 // 'json-item' 'is'\n     || lk == 85190                 // 'object' 'is'\n     || lk == 85239                 // 'structured-item' 'is'\n     || lk == 89679                 // 'array' 'le'\n     || lk == 89769                 // 'json-item' 'le'\n     || lk == 89798                 // 'object' 'le'\n     || lk == 89847                 // 'structured-item' 'le'\n     || lk == 90703                 // 'array' 'let'\n     || lk == 90793                 // 'json-item' 'let'\n     || lk == 90822                 // 'object' 'let'\n     || lk == 90871                 // 'structured-item' 'let'\n     || lk == 92751                 // 'array' 'lt'\n     || lk == 92841                 // 'json-item' 'lt'\n     || lk == 92870                 // 'object' 'lt'\n     || lk == 92919                 // 'structured-item' 'lt'\n     || lk == 93775                 // 'array' 'mod'\n     || lk == 93865                 // 'json-item' 'mod'\n     || lk == 93894                 // 'object' 'mod'\n     || lk == 93943                 // 'structured-item' 'mod'\n     || lk == 94287                 // 'array' 'modify'\n     || lk == 94377                 // 'json-item' 'modify'\n     || lk == 94406                 // 'object' 'modify'\n     || lk == 94455                 // 'structured-item' 'modify'\n     || lk == 96847                 // 'array' 'ne'\n     || lk == 96937                 // 'json-item' 'ne'\n     || lk == 96966                 // 'object' 'ne'\n     || lk == 97015                 // 'structured-item' 'ne'\n     || lk == 103503                // 'array' 'only'\n     || lk == 103593                // 'json-item' 'only'\n     || lk == 103622                // 'object' 'only'\n     || lk == 103671                // 'structured-item' 'only'\n     || lk == 104527                // 'array' 'or'\n     || lk == 104617                // 'json-item' 'or'\n     || lk == 104646                // 'object' 'or'\n     || lk == 104695                // 'structured-item' 'or'\n     || lk == 105039                // 'array' 'order'\n     || lk == 105129                // 'json-item' 'order'\n     || lk == 105158                // 'object' 'order'\n     || lk == 105207                // 'structured-item' 'order'\n     || lk == 107087                // 'array' 'paragraphs'\n     || lk == 107177                // 'json-item' 'paragraphs'\n     || lk == 107206                // 'object' 'paragraphs'\n     || lk == 107255                // 'structured-item' 'paragraphs'\n     || lk == 114767                // 'array' 'return'\n     || lk == 114857                // 'json-item' 'return'\n     || lk == 114886                // 'object' 'return'\n     || lk == 114935                // 'structured-item' 'return'\n     || lk == 116815                // 'array' 'satisfies'\n     || lk == 116905                // 'json-item' 'satisfies'\n     || lk == 116934                // 'object' 'satisfies'\n     || lk == 116983                // 'structured-item' 'satisfies'\n     || lk == 118863                // 'array' 'score'\n     || lk == 118953                // 'json-item' 'score'\n     || lk == 118982                // 'object' 'score'\n     || lk == 119031                // 'structured-item' 'score'\n     || lk == 121423                // 'array' 'sentences'\n     || lk == 121513                // 'json-item' 'sentences'\n     || lk == 121542                // 'object' 'sentences'\n     || lk == 121591                // 'structured-item' 'sentences'\n     || lk == 123471                // 'array' 'stable'\n     || lk == 123561                // 'json-item' 'stable'\n     || lk == 123590                // 'object' 'stable'\n     || lk == 123639                // 'structured-item' 'stable'\n     || lk == 123983                // 'array' 'start'\n     || lk == 124073                // 'json-item' 'start'\n     || lk == 124102                // 'object' 'start'\n     || lk == 124151                // 'structured-item' 'start'\n     || lk == 129103                // 'array' 'times'\n     || lk == 129193                // 'json-item' 'times'\n     || lk == 129222                // 'object' 'times'\n     || lk == 129271                // 'structured-item' 'times'\n     || lk == 129615                // 'array' 'to'\n     || lk == 129705                // 'json-item' 'to'\n     || lk == 129734                // 'object' 'to'\n     || lk == 129783                // 'structured-item' 'to'\n     || lk == 133199                // 'array' 'union'\n     || lk == 133289                // 'json-item' 'union'\n     || lk == 133318                // 'object' 'union'\n     || lk == 133367                // 'structured-item' 'union'\n     || lk == 139343                // 'array' 'where'\n     || lk == 139433                // 'json-item' 'where'\n     || lk == 139462                // 'object' 'where'\n     || lk == 139511                // 'structured-item' 'where'\n     || lk == 141391                // 'array' 'with'\n     || lk == 141481                // 'json-item' 'with'\n     || lk == 141510                // 'object' 'with'\n     || lk == 141559                // 'structured-item' 'with'\n     || lk == 142927                // 'array' 'words'\n     || lk == 143017                // 'json-item' 'words'\n     || lk == 143046                // 'object' 'words'\n     || lk == 143095                // 'structured-item' 'words'\n     || lk == 143951                // 'array' '{'\n     || lk == 144041                // 'json-item' '{'\n     || lk == 144070                // 'object' '{'\n     || lk == 144119                // 'structured-item' '{'\n     || lk == 145487                // 'array' '|'\n     || lk == 145577                // 'json-item' '|'\n     || lk == 145606                // 'object' '|'\n     || lk == 145655                // 'structured-item' '|'\n     || lk == 145999                // 'array' '||'\n     || lk == 146089                // 'json-item' '||'\n     || lk == 146118                // 'object' '||'\n     || lk == 146167                // 'structured-item' '||'\n     || lk == 146511                // 'array' '|}'\n     || lk == 146601                // 'json-item' '|}'\n     || lk == 146630                // 'object' '|}'\n     || lk == 146679                // 'structured-item' '|}'\n     || lk == 147023                // 'array' '}'\n     || lk == 147113                // 'json-item' '}'\n     || lk == 147142                // 'object' '}'\n     || lk == 147191)               // 'structured-item' '}'\n    {\n      lk = memoized(6, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_AtomicOrUnionType();\n          memoize(6, e0A, -4);\n          lk = -8;\n        }\n        catch (p4A)\n        {\n          try\n          {\n            b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n            b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n            b2 = b2A; e2 = e2A; end = e2A; }}\n            try_JSONTest();\n            memoize(6, e0A, -6);\n            lk = -8;\n          }\n          catch (p6A)\n          {\n            lk = -7;\n            b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n            b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n            b2 = b2A; e2 = e2A; end = e2A; }}\n            memoize(6, e0A, -7);\n          }\n        }\n      }\n    }\n    switch (lk)\n    {\n    case 18003:                     // 'attribute' '('\n    case 18017:                     // 'comment' '('\n    case 18041:                     // 'document-node' '('\n    case 18042:                     // 'element' '('\n    case 18108:                     // 'namespace-node' '('\n    case 18114:                     // 'node' '('\n    case 18140:                     // 'processing-instruction' '('\n    case 18150:                     // 'schema-attribute' '('\n    case 18151:                     // 'schema-element' '('\n    case 18169:                     // 'text' '('\n      try_KindTest();\n      break;\n    case 18087:                     // 'item' '('\n      shiftT(167);                  // 'item'\n      lookahead1W(22);              // S^WS | '(' | '(:'\n      shiftT(35);                   // '('\n      lookahead1W(23);              // S^WS | '(:' | ')'\n      shiftT(38);                   // ')'\n      break;\n    case 33:                        // '%'\n    case 18067:                     // 'function' '('\n      try_FunctionTest();\n      break;\n    case 35:                        // '('\n      try_ParenthesizedItemType();\n      break;\n    case -6:\n    case 17999:                     // 'array' '('\n    case 18089:                     // 'json-item' '('\n    case 18118:                     // 'object' '('\n      try_JSONTest();\n      break;\n    case -7:\n    case 18167:                     // 'structured-item' '('\n      try_StructuredItemTest();\n      break;\n    case -8:\n      break;\n    default:\n      try_AtomicOrUnionType();\n    }\n  }\n\n  function parse_JSONTest()\n  {\n    eventHandler.startNonterminal(\"JSONTest\", e0);\n    switch (l1)\n    {\n    case 169:                       // 'json-item'\n      parse_JSONItemTest();\n      break;\n    case 198:                       // 'object'\n      parse_JSONObjectTest();\n      break;\n    default:\n      parse_JSONArrayTest();\n    }\n    eventHandler.endNonterminal(\"JSONTest\", e0);\n  }\n\n  function try_JSONTest()\n  {\n    switch (l1)\n    {\n    case 169:                       // 'json-item'\n      try_JSONItemTest();\n      break;\n    case 198:                       // 'object'\n      try_JSONObjectTest();\n      break;\n    default:\n      try_JSONArrayTest();\n    }\n  }\n\n  function parse_StructuredItemTest()\n  {\n    eventHandler.startNonterminal(\"StructuredItemTest\", e0);\n    shift(247);                     // 'structured-item'\n    lookahead1W(233);               // S^WS | EOF | '!=' | '(' | '(:' | ')' | '*' | '*' | '+' | ',' | '-' | ':' | ':=' |\n    if (l1 == 35)                   // '('\n    {\n      shift(35);                    // '('\n      lookahead1W(23);              // S^WS | '(:' | ')'\n      shift(38);                    // ')'\n    }\n    eventHandler.endNonterminal(\"StructuredItemTest\", e0);\n  }\n\n  function try_StructuredItemTest()\n  {\n    shiftT(247);                    // 'structured-item'\n    lookahead1W(233);               // S^WS | EOF | '!=' | '(' | '(:' | ')' | '*' | '*' | '+' | ',' | '-' | ':' | ':=' |\n    if (l1 == 35)                   // '('\n    {\n      shiftT(35);                   // '('\n      lookahead1W(23);              // S^WS | '(:' | ')'\n      shiftT(38);                   // ')'\n    }\n  }\n\n  function parse_JSONItemTest()\n  {\n    eventHandler.startNonterminal(\"JSONItemTest\", e0);\n    shift(169);                     // 'json-item'\n    lookahead1W(233);               // S^WS | EOF | '!=' | '(' | '(:' | ')' | '*' | '*' | '+' | ',' | '-' | ':' | ':=' |\n    if (l1 == 35)                   // '('\n    {\n      shift(35);                    // '('\n      lookahead1W(23);              // S^WS | '(:' | ')'\n      shift(38);                    // ')'\n    }\n    eventHandler.endNonterminal(\"JSONItemTest\", e0);\n  }\n\n  function try_JSONItemTest()\n  {\n    shiftT(169);                    // 'json-item'\n    lookahead1W(233);               // S^WS | EOF | '!=' | '(' | '(:' | ')' | '*' | '*' | '+' | ',' | '-' | ':' | ':=' |\n    if (l1 == 35)                   // '('\n    {\n      shiftT(35);                   // '('\n      lookahead1W(23);              // S^WS | '(:' | ')'\n      shiftT(38);                   // ')'\n    }\n  }\n\n  function parse_JSONObjectTest()\n  {\n    eventHandler.startNonterminal(\"JSONObjectTest\", e0);\n    shift(198);                     // 'object'\n    lookahead1W(233);               // S^WS | EOF | '!=' | '(' | '(:' | ')' | '*' | '*' | '+' | ',' | '-' | ':' | ':=' |\n    if (l1 == 35)                   // '('\n    {\n      shift(35);                    // '('\n      lookahead1W(23);              // S^WS | '(:' | ')'\n      shift(38);                    // ')'\n    }\n    eventHandler.endNonterminal(\"JSONObjectTest\", e0);\n  }\n\n  function try_JSONObjectTest()\n  {\n    shiftT(198);                    // 'object'\n    lookahead1W(233);               // S^WS | EOF | '!=' | '(' | '(:' | ')' | '*' | '*' | '+' | ',' | '-' | ':' | ':=' |\n    if (l1 == 35)                   // '('\n    {\n      shiftT(35);                   // '('\n      lookahead1W(23);              // S^WS | '(:' | ')'\n      shiftT(38);                   // ')'\n    }\n  }\n\n  function parse_JSONArrayTest()\n  {\n    eventHandler.startNonterminal(\"JSONArrayTest\", e0);\n    shift(79);                      // 'array'\n    lookahead1W(233);               // S^WS | EOF | '!=' | '(' | '(:' | ')' | '*' | '*' | '+' | ',' | '-' | ':' | ':=' |\n    if (l1 == 35)                   // '('\n    {\n      shift(35);                    // '('\n      lookahead1W(23);              // S^WS | '(:' | ')'\n      shift(38);                    // ')'\n    }\n    eventHandler.endNonterminal(\"JSONArrayTest\", e0);\n  }\n\n  function try_JSONArrayTest()\n  {\n    shiftT(79);                     // 'array'\n    lookahead1W(233);               // S^WS | EOF | '!=' | '(' | '(:' | ')' | '*' | '*' | '+' | ',' | '-' | ':' | ':=' |\n    if (l1 == 35)                   // '('\n    {\n      shiftT(35);                   // '('\n      lookahead1W(23);              // S^WS | '(:' | ')'\n      shiftT(38);                   // ')'\n    }\n  }\n\n  function parse_AtomicOrUnionType()\n  {\n    eventHandler.startNonterminal(\"AtomicOrUnionType\", e0);\n    parse_EQName();\n    eventHandler.endNonterminal(\"AtomicOrUnionType\", e0);\n  }\n\n  function try_AtomicOrUnionType()\n  {\n    try_EQName();\n  }\n\n  function parse_KindTest()\n  {\n    eventHandler.startNonterminal(\"KindTest\", e0);\n    switch (l1)\n    {\n    case 121:                       // 'document-node'\n      parse_DocumentTest();\n      break;\n    case 122:                       // 'element'\n      parse_ElementTest();\n      break;\n    case 83:                        // 'attribute'\n      parse_AttributeTest();\n      break;\n    case 231:                       // 'schema-element'\n      parse_SchemaElementTest();\n      break;\n    case 230:                       // 'schema-attribute'\n      parse_SchemaAttributeTest();\n      break;\n    case 220:                       // 'processing-instruction'\n      parse_PITest();\n      break;\n    case 97:                        // 'comment'\n      parse_CommentTest();\n      break;\n    case 249:                       // 'text'\n      parse_TextTest();\n      break;\n    case 188:                       // 'namespace-node'\n      parse_NamespaceNodeTest();\n      break;\n    default:\n      parse_AnyKindTest();\n    }\n    eventHandler.endNonterminal(\"KindTest\", e0);\n  }\n\n  function try_KindTest()\n  {\n    switch (l1)\n    {\n    case 121:                       // 'document-node'\n      try_DocumentTest();\n      break;\n    case 122:                       // 'element'\n      try_ElementTest();\n      break;\n    case 83:                        // 'attribute'\n      try_AttributeTest();\n      break;\n    case 231:                       // 'schema-element'\n      try_SchemaElementTest();\n      break;\n    case 230:                       // 'schema-attribute'\n      try_SchemaAttributeTest();\n      break;\n    case 220:                       // 'processing-instruction'\n      try_PITest();\n      break;\n    case 97:                        // 'comment'\n      try_CommentTest();\n      break;\n    case 249:                       // 'text'\n      try_TextTest();\n      break;\n    case 188:                       // 'namespace-node'\n      try_NamespaceNodeTest();\n      break;\n    default:\n      try_AnyKindTest();\n    }\n  }\n\n  function parse_AnyKindTest()\n  {\n    eventHandler.startNonterminal(\"AnyKindTest\", e0);\n    shift(194);                     // 'node'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(35);                      // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(38);                      // ')'\n    eventHandler.endNonterminal(\"AnyKindTest\", e0);\n  }\n\n  function try_AnyKindTest()\n  {\n    shiftT(194);                    // 'node'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(35);                     // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(38);                     // ')'\n  }\n\n  function parse_DocumentTest()\n  {\n    eventHandler.startNonterminal(\"DocumentTest\", e0);\n    shift(121);                     // 'document-node'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(35);                      // '('\n    lookahead1W(154);               // S^WS | '(:' | ')' | 'element' | 'schema-element'\n    if (l1 != 38)                   // ')'\n    {\n      switch (l1)\n      {\n      case 122:                     // 'element'\n        whitespace();\n        parse_ElementTest();\n        break;\n      default:\n        whitespace();\n        parse_SchemaElementTest();\n      }\n    }\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(38);                      // ')'\n    eventHandler.endNonterminal(\"DocumentTest\", e0);\n  }\n\n  function try_DocumentTest()\n  {\n    shiftT(121);                    // 'document-node'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(35);                     // '('\n    lookahead1W(154);               // S^WS | '(:' | ')' | 'element' | 'schema-element'\n    if (l1 != 38)                   // ')'\n    {\n      switch (l1)\n      {\n      case 122:                     // 'element'\n        try_ElementTest();\n        break;\n      default:\n        try_SchemaElementTest();\n      }\n    }\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(38);                     // ')'\n  }\n\n  function parse_TextTest()\n  {\n    eventHandler.startNonterminal(\"TextTest\", e0);\n    shift(249);                     // 'text'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(35);                      // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(38);                      // ')'\n    eventHandler.endNonterminal(\"TextTest\", e0);\n  }\n\n  function try_TextTest()\n  {\n    shiftT(249);                    // 'text'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(35);                     // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(38);                     // ')'\n  }\n\n  function parse_CommentTest()\n  {\n    eventHandler.startNonterminal(\"CommentTest\", e0);\n    shift(97);                      // 'comment'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(35);                      // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(38);                      // ')'\n    eventHandler.endNonterminal(\"CommentTest\", e0);\n  }\n\n  function try_CommentTest()\n  {\n    shiftT(97);                     // 'comment'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(35);                     // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(38);                     // ')'\n  }\n\n  function parse_NamespaceNodeTest()\n  {\n    eventHandler.startNonterminal(\"NamespaceNodeTest\", e0);\n    shift(188);                     // 'namespace-node'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(35);                      // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(38);                      // ')'\n    eventHandler.endNonterminal(\"NamespaceNodeTest\", e0);\n  }\n\n  function try_NamespaceNodeTest()\n  {\n    shiftT(188);                    // 'namespace-node'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(35);                     // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(38);                     // ')'\n  }\n\n  function parse_PITest()\n  {\n    eventHandler.startNonterminal(\"PITest\", e0);\n    shift(220);                     // 'processing-instruction'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(35);                      // '('\n    lookahead1W(244);               // StringLiteral | NCName^Token | S^WS | '(:' | ')' | 'after' | 'allowing' |\n    if (l1 != 38)                   // ')'\n    {\n      switch (l1)\n      {\n      case 11:                      // StringLiteral\n        shift(11);                  // StringLiteral\n        break;\n      default:\n        whitespace();\n        parse_NCName();\n      }\n    }\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(38);                      // ')'\n    eventHandler.endNonterminal(\"PITest\", e0);\n  }\n\n  function try_PITest()\n  {\n    shiftT(220);                    // 'processing-instruction'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(35);                     // '('\n    lookahead1W(244);               // StringLiteral | NCName^Token | S^WS | '(:' | ')' | 'after' | 'allowing' |\n    if (l1 != 38)                   // ')'\n    {\n      switch (l1)\n      {\n      case 11:                      // StringLiteral\n        shiftT(11);                 // StringLiteral\n        break;\n      default:\n        try_NCName();\n      }\n    }\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(38);                     // ')'\n  }\n\n  function parse_AttributeTest()\n  {\n    eventHandler.startNonterminal(\"AttributeTest\", e0);\n    shift(83);                      // 'attribute'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(35);                      // '('\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | ')' | '*' | 'after' | 'allowing' | 'ancestor' |\n    if (l1 != 38)                   // ')'\n    {\n      whitespace();\n      parse_AttribNameOrWildcard();\n      lookahead1W(105);             // S^WS | '(:' | ')' | ','\n      if (l1 == 42)                 // ','\n      {\n        shift(42);                  // ','\n        lookahead1W(246);           // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n        whitespace();\n        parse_TypeName();\n      }\n    }\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(38);                      // ')'\n    eventHandler.endNonterminal(\"AttributeTest\", e0);\n  }\n\n  function try_AttributeTest()\n  {\n    shiftT(83);                     // 'attribute'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(35);                     // '('\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | ')' | '*' | 'after' | 'allowing' | 'ancestor' |\n    if (l1 != 38)                   // ')'\n    {\n      try_AttribNameOrWildcard();\n      lookahead1W(105);             // S^WS | '(:' | ')' | ','\n      if (l1 == 42)                 // ','\n      {\n        shiftT(42);                 // ','\n        lookahead1W(246);           // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n        try_TypeName();\n      }\n    }\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(38);                     // ')'\n  }\n\n  function parse_AttribNameOrWildcard()\n  {\n    eventHandler.startNonterminal(\"AttribNameOrWildcard\", e0);\n    switch (l1)\n    {\n    case 39:                        // '*'\n      shift(39);                    // '*'\n      break;\n    default:\n      parse_AttributeName();\n    }\n    eventHandler.endNonterminal(\"AttribNameOrWildcard\", e0);\n  }\n\n  function try_AttribNameOrWildcard()\n  {\n    switch (l1)\n    {\n    case 39:                        // '*'\n      shiftT(39);                   // '*'\n      break;\n    default:\n      try_AttributeName();\n    }\n  }\n\n  function parse_SchemaAttributeTest()\n  {\n    eventHandler.startNonterminal(\"SchemaAttributeTest\", e0);\n    shift(230);                     // 'schema-attribute'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(35);                      // '('\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_AttributeDeclaration();\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(38);                      // ')'\n    eventHandler.endNonterminal(\"SchemaAttributeTest\", e0);\n  }\n\n  function try_SchemaAttributeTest()\n  {\n    shiftT(230);                    // 'schema-attribute'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(35);                     // '('\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_AttributeDeclaration();\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(38);                     // ')'\n  }\n\n  function parse_AttributeDeclaration()\n  {\n    eventHandler.startNonterminal(\"AttributeDeclaration\", e0);\n    parse_AttributeName();\n    eventHandler.endNonterminal(\"AttributeDeclaration\", e0);\n  }\n\n  function try_AttributeDeclaration()\n  {\n    try_AttributeName();\n  }\n\n  function parse_ElementTest()\n  {\n    eventHandler.startNonterminal(\"ElementTest\", e0);\n    shift(122);                     // 'element'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(35);                      // '('\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | ')' | '*' | 'after' | 'allowing' | 'ancestor' |\n    if (l1 != 38)                   // ')'\n    {\n      whitespace();\n      parse_ElementNameOrWildcard();\n      lookahead1W(105);             // S^WS | '(:' | ')' | ','\n      if (l1 == 42)                 // ','\n      {\n        shift(42);                  // ','\n        lookahead1W(246);           // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n        whitespace();\n        parse_TypeName();\n        lookahead1W(106);           // S^WS | '(:' | ')' | '?'\n        if (l1 == 65)               // '?'\n        {\n          shift(65);                // '?'\n        }\n      }\n    }\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(38);                      // ')'\n    eventHandler.endNonterminal(\"ElementTest\", e0);\n  }\n\n  function try_ElementTest()\n  {\n    shiftT(122);                    // 'element'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(35);                     // '('\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | ')' | '*' | 'after' | 'allowing' | 'ancestor' |\n    if (l1 != 38)                   // ')'\n    {\n      try_ElementNameOrWildcard();\n      lookahead1W(105);             // S^WS | '(:' | ')' | ','\n      if (l1 == 42)                 // ','\n      {\n        shiftT(42);                 // ','\n        lookahead1W(246);           // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n        try_TypeName();\n        lookahead1W(106);           // S^WS | '(:' | ')' | '?'\n        if (l1 == 65)               // '?'\n        {\n          shiftT(65);               // '?'\n        }\n      }\n    }\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(38);                     // ')'\n  }\n\n  function parse_ElementNameOrWildcard()\n  {\n    eventHandler.startNonterminal(\"ElementNameOrWildcard\", e0);\n    switch (l1)\n    {\n    case 39:                        // '*'\n      shift(39);                    // '*'\n      break;\n    default:\n      parse_ElementName();\n    }\n    eventHandler.endNonterminal(\"ElementNameOrWildcard\", e0);\n  }\n\n  function try_ElementNameOrWildcard()\n  {\n    switch (l1)\n    {\n    case 39:                        // '*'\n      shiftT(39);                   // '*'\n      break;\n    default:\n      try_ElementName();\n    }\n  }\n\n  function parse_SchemaElementTest()\n  {\n    eventHandler.startNonterminal(\"SchemaElementTest\", e0);\n    shift(231);                     // 'schema-element'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(35);                      // '('\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_ElementDeclaration();\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(38);                      // ')'\n    eventHandler.endNonterminal(\"SchemaElementTest\", e0);\n  }\n\n  function try_SchemaElementTest()\n  {\n    shiftT(231);                    // 'schema-element'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(35);                     // '('\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_ElementDeclaration();\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(38);                     // ')'\n  }\n\n  function parse_ElementDeclaration()\n  {\n    eventHandler.startNonterminal(\"ElementDeclaration\", e0);\n    parse_ElementName();\n    eventHandler.endNonterminal(\"ElementDeclaration\", e0);\n  }\n\n  function try_ElementDeclaration()\n  {\n    try_ElementName();\n  }\n\n  function parse_AttributeName()\n  {\n    eventHandler.startNonterminal(\"AttributeName\", e0);\n    parse_EQName();\n    eventHandler.endNonterminal(\"AttributeName\", e0);\n  }\n\n  function try_AttributeName()\n  {\n    try_EQName();\n  }\n\n  function parse_ElementName()\n  {\n    eventHandler.startNonterminal(\"ElementName\", e0);\n    parse_EQName();\n    eventHandler.endNonterminal(\"ElementName\", e0);\n  }\n\n  function try_ElementName()\n  {\n    try_EQName();\n  }\n\n  function parse_SimpleTypeName()\n  {\n    eventHandler.startNonterminal(\"SimpleTypeName\", e0);\n    parse_TypeName();\n    eventHandler.endNonterminal(\"SimpleTypeName\", e0);\n  }\n\n  function try_SimpleTypeName()\n  {\n    try_TypeName();\n  }\n\n  function parse_TypeName()\n  {\n    eventHandler.startNonterminal(\"TypeName\", e0);\n    parse_EQName();\n    eventHandler.endNonterminal(\"TypeName\", e0);\n  }\n\n  function try_TypeName()\n  {\n    try_EQName();\n  }\n\n  function parse_FunctionTest()\n  {\n    eventHandler.startNonterminal(\"FunctionTest\", e0);\n    for (;;)\n    {\n      lookahead1W(101);             // S^WS | '%' | '(:' | 'function'\n      if (l1 != 33)                 // '%'\n      {\n        break;\n      }\n      whitespace();\n      parse_Annotation();\n    }\n    switch (l1)\n    {\n    case 147:                       // 'function'\n      lookahead2W(22);              // S^WS | '(' | '(:'\n      break;\n    default:\n      lk = l1;\n    }\n    lk = memoized(7, e0);\n    if (lk == 0)\n    {\n      var b0A = b0; var e0A = e0; var l1A = l1;\n      var b1A = b1; var e1A = e1; var l2A = l2;\n      var b2A = b2; var e2A = e2;\n      try\n      {\n        try_AnyFunctionTest();\n        lk = -1;\n      }\n      catch (p1A)\n      {\n        lk = -2;\n      }\n      b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n      b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n      b2 = b2A; e2 = e2A; end = e2A; }}\n      memoize(7, e0, lk);\n    }\n    switch (lk)\n    {\n    case -1:\n      whitespace();\n      parse_AnyFunctionTest();\n      break;\n    default:\n      whitespace();\n      parse_TypedFunctionTest();\n    }\n    eventHandler.endNonterminal(\"FunctionTest\", e0);\n  }\n\n  function try_FunctionTest()\n  {\n    for (;;)\n    {\n      lookahead1W(101);             // S^WS | '%' | '(:' | 'function'\n      if (l1 != 33)                 // '%'\n      {\n        break;\n      }\n      try_Annotation();\n    }\n    switch (l1)\n    {\n    case 147:                       // 'function'\n      lookahead2W(22);              // S^WS | '(' | '(:'\n      break;\n    default:\n      lk = l1;\n    }\n    lk = memoized(7, e0);\n    if (lk == 0)\n    {\n      var b0A = b0; var e0A = e0; var l1A = l1;\n      var b1A = b1; var e1A = e1; var l2A = l2;\n      var b2A = b2; var e2A = e2;\n      try\n      {\n        try_AnyFunctionTest();\n        memoize(7, e0A, -1);\n        lk = -3;\n      }\n      catch (p1A)\n      {\n        lk = -2;\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(7, e0A, -2);\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n      try_AnyFunctionTest();\n      break;\n    case -3:\n      break;\n    default:\n      try_TypedFunctionTest();\n    }\n  }\n\n  function parse_AnyFunctionTest()\n  {\n    eventHandler.startNonterminal(\"AnyFunctionTest\", e0);\n    shift(147);                     // 'function'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(35);                      // '('\n    lookahead1W(24);                // S^WS | '(:' | '*'\n    shift(39);                      // '*'\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(38);                      // ')'\n    eventHandler.endNonterminal(\"AnyFunctionTest\", e0);\n  }\n\n  function try_AnyFunctionTest()\n  {\n    shiftT(147);                    // 'function'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(35);                     // '('\n    lookahead1W(24);                // S^WS | '(:' | '*'\n    shiftT(39);                     // '*'\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(38);                     // ')'\n  }\n\n  function parse_TypedFunctionTest()\n  {\n    eventHandler.startNonterminal(\"TypedFunctionTest\", e0);\n    shift(147);                     // 'function'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(35);                      // '('\n    lookahead1W(259);               // EQName^Token | S^WS | '%' | '(' | '(:' | ')' | 'after' | 'allowing' |\n    if (l1 != 38)                   // ')'\n    {\n      whitespace();\n      parse_SequenceType();\n      for (;;)\n      {\n        lookahead1W(105);           // S^WS | '(:' | ')' | ','\n        if (l1 != 42)               // ','\n        {\n          break;\n        }\n        shift(42);                  // ','\n        lookahead1W(254);           // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n        whitespace();\n        parse_SequenceType();\n      }\n    }\n    shift(38);                      // ')'\n    lookahead1W(33);                // S^WS | '(:' | 'as'\n    shift(80);                      // 'as'\n    lookahead1W(254);               // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_SequenceType();\n    eventHandler.endNonterminal(\"TypedFunctionTest\", e0);\n  }\n\n  function try_TypedFunctionTest()\n  {\n    shiftT(147);                    // 'function'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(35);                     // '('\n    lookahead1W(259);               // EQName^Token | S^WS | '%' | '(' | '(:' | ')' | 'after' | 'allowing' |\n    if (l1 != 38)                   // ')'\n    {\n      try_SequenceType();\n      for (;;)\n      {\n        lookahead1W(105);           // S^WS | '(:' | ')' | ','\n        if (l1 != 42)               // ','\n        {\n          break;\n        }\n        shiftT(42);                 // ','\n        lookahead1W(254);           // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n        try_SequenceType();\n      }\n    }\n    shiftT(38);                     // ')'\n    lookahead1W(33);                // S^WS | '(:' | 'as'\n    shiftT(80);                     // 'as'\n    lookahead1W(254);               // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_SequenceType();\n  }\n\n  function parse_ParenthesizedItemType()\n  {\n    eventHandler.startNonterminal(\"ParenthesizedItemType\", e0);\n    shift(35);                      // '('\n    lookahead1W(254);               // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_ItemType();\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(38);                      // ')'\n    eventHandler.endNonterminal(\"ParenthesizedItemType\", e0);\n  }\n\n  function try_ParenthesizedItemType()\n  {\n    shiftT(35);                     // '('\n    lookahead1W(254);               // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_ItemType();\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(38);                     // ')'\n  }\n\n  function parse_RevalidationDecl()\n  {\n    eventHandler.startNonterminal(\"RevalidationDecl\", e0);\n    shift(109);                     // 'declare'\n    lookahead1W(75);                // S^WS | '(:' | 'revalidation'\n    shift(226);                     // 'revalidation'\n    lookahead1W(162);               // S^WS | '(:' | 'lax' | 'skip' | 'strict'\n    switch (l1)\n    {\n    case 245:                       // 'strict'\n      shift(245);                   // 'strict'\n      break;\n    case 174:                       // 'lax'\n      shift(174);                   // 'lax'\n      break;\n    default:\n      shift(238);                   // 'skip'\n    }\n    eventHandler.endNonterminal(\"RevalidationDecl\", e0);\n  }\n\n  function parse_InsertExprTargetChoice()\n  {\n    eventHandler.startNonterminal(\"InsertExprTargetChoice\", e0);\n    switch (l1)\n    {\n    case 71:                        // 'after'\n      shift(71);                    // 'after'\n      break;\n    case 85:                        // 'before'\n      shift(85);                    // 'before'\n      break;\n    default:\n      if (l1 == 80)                 // 'as'\n      {\n        shift(80);                  // 'as'\n        lookahead1W(123);           // S^WS | '(:' | 'first' | 'last'\n        switch (l1)\n        {\n        case 136:                   // 'first'\n          shift(136);               // 'first'\n          break;\n        default:\n          shift(173);               // 'last'\n        }\n      }\n      lookahead1W(57);              // S^WS | '(:' | 'into'\n      shift(165);                   // 'into'\n    }\n    eventHandler.endNonterminal(\"InsertExprTargetChoice\", e0);\n  }\n\n  function try_InsertExprTargetChoice()\n  {\n    switch (l1)\n    {\n    case 71:                        // 'after'\n      shiftT(71);                   // 'after'\n      break;\n    case 85:                        // 'before'\n      shiftT(85);                   // 'before'\n      break;\n    default:\n      if (l1 == 80)                 // 'as'\n      {\n        shiftT(80);                 // 'as'\n        lookahead1W(123);           // S^WS | '(:' | 'first' | 'last'\n        switch (l1)\n        {\n        case 136:                   // 'first'\n          shiftT(136);              // 'first'\n          break;\n        default:\n          shiftT(173);              // 'last'\n        }\n      }\n      lookahead1W(57);              // S^WS | '(:' | 'into'\n      shiftT(165);                  // 'into'\n    }\n  }\n\n  function parse_InsertExpr()\n  {\n    eventHandler.startNonterminal(\"InsertExpr\", e0);\n    shift(161);                     // 'insert'\n    lookahead1W(133);               // S^WS | '(:' | 'node' | 'nodes'\n    switch (l1)\n    {\n    case 194:                       // 'node'\n      shift(194);                   // 'node'\n      break;\n    default:\n      shift(195);                   // 'nodes'\n    }\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_SourceExpr();\n    whitespace();\n    parse_InsertExprTargetChoice();\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_TargetExpr();\n    eventHandler.endNonterminal(\"InsertExpr\", e0);\n  }\n\n  function try_InsertExpr()\n  {\n    shiftT(161);                    // 'insert'\n    lookahead1W(133);               // S^WS | '(:' | 'node' | 'nodes'\n    switch (l1)\n    {\n    case 194:                       // 'node'\n      shiftT(194);                  // 'node'\n      break;\n    default:\n      shiftT(195);                  // 'nodes'\n    }\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_SourceExpr();\n    try_InsertExprTargetChoice();\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_TargetExpr();\n  }\n\n  function parse_DeleteExpr()\n  {\n    eventHandler.startNonterminal(\"DeleteExpr\", e0);\n    shift(111);                     // 'delete'\n    lookahead1W(133);               // S^WS | '(:' | 'node' | 'nodes'\n    switch (l1)\n    {\n    case 194:                       // 'node'\n      shift(194);                   // 'node'\n      break;\n    default:\n      shift(195);                   // 'nodes'\n    }\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_TargetExpr();\n    eventHandler.endNonterminal(\"DeleteExpr\", e0);\n  }\n\n  function try_DeleteExpr()\n  {\n    shiftT(111);                    // 'delete'\n    lookahead1W(133);               // S^WS | '(:' | 'node' | 'nodes'\n    switch (l1)\n    {\n    case 194:                       // 'node'\n      shiftT(194);                  // 'node'\n      break;\n    default:\n      shiftT(195);                  // 'nodes'\n    }\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_TargetExpr();\n  }\n\n  function parse_ReplaceExpr()\n  {\n    eventHandler.startNonterminal(\"ReplaceExpr\", e0);\n    shift(223);                     // 'replace'\n    lookahead1W(134);               // S^WS | '(:' | 'node' | 'value'\n    if (l1 == 267)                  // 'value'\n    {\n      shift(267);                   // 'value'\n      lookahead1W(67);              // S^WS | '(:' | 'of'\n      shift(200);                   // 'of'\n    }\n    lookahead1W(65);                // S^WS | '(:' | 'node'\n    shift(194);                     // 'node'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_TargetExpr();\n    shift(276);                     // 'with'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"ReplaceExpr\", e0);\n  }\n\n  function try_ReplaceExpr()\n  {\n    shiftT(223);                    // 'replace'\n    lookahead1W(134);               // S^WS | '(:' | 'node' | 'value'\n    if (l1 == 267)                  // 'value'\n    {\n      shiftT(267);                  // 'value'\n      lookahead1W(67);              // S^WS | '(:' | 'of'\n      shiftT(200);                  // 'of'\n    }\n    lookahead1W(65);                // S^WS | '(:' | 'node'\n    shiftT(194);                    // 'node'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_TargetExpr();\n    shiftT(276);                    // 'with'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_RenameExpr()\n  {\n    eventHandler.startNonterminal(\"RenameExpr\", e0);\n    shift(222);                     // 'rename'\n    lookahead1W(65);                // S^WS | '(:' | 'node'\n    shift(194);                     // 'node'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_TargetExpr();\n    shift(80);                      // 'as'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_NewNameExpr();\n    eventHandler.endNonterminal(\"RenameExpr\", e0);\n  }\n\n  function try_RenameExpr()\n  {\n    shiftT(222);                    // 'rename'\n    lookahead1W(65);                // S^WS | '(:' | 'node'\n    shiftT(194);                    // 'node'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_TargetExpr();\n    shiftT(80);                     // 'as'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_NewNameExpr();\n  }\n\n  function parse_SourceExpr()\n  {\n    eventHandler.startNonterminal(\"SourceExpr\", e0);\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"SourceExpr\", e0);\n  }\n\n  function try_SourceExpr()\n  {\n    try_ExprSingle();\n  }\n\n  function parse_TargetExpr()\n  {\n    eventHandler.startNonterminal(\"TargetExpr\", e0);\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"TargetExpr\", e0);\n  }\n\n  function try_TargetExpr()\n  {\n    try_ExprSingle();\n  }\n\n  function parse_NewNameExpr()\n  {\n    eventHandler.startNonterminal(\"NewNameExpr\", e0);\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"NewNameExpr\", e0);\n  }\n\n  function try_NewNameExpr()\n  {\n    try_ExprSingle();\n  }\n\n  function parse_TransformExpr()\n  {\n    eventHandler.startNonterminal(\"TransformExpr\", e0);\n    shift(104);                     // 'copy'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    whitespace();\n    parse_TransformSpec();\n    for (;;)\n    {\n      if (l1 != 42)                 // ','\n      {\n        break;\n      }\n      shift(42);                    // ','\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      whitespace();\n      parse_TransformSpec();\n    }\n    shift(184);                     // 'modify'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    shift(224);                     // 'return'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"TransformExpr\", e0);\n  }\n\n  function try_TransformExpr()\n  {\n    shiftT(104);                    // 'copy'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    try_TransformSpec();\n    for (;;)\n    {\n      if (l1 != 42)                 // ','\n      {\n        break;\n      }\n      shiftT(42);                   // ','\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      try_TransformSpec();\n    }\n    shiftT(184);                    // 'modify'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n    shiftT(224);                    // 'return'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_TransformSpec()\n  {\n    eventHandler.startNonterminal(\"TransformSpec\", e0);\n    shift(31);                      // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    lookahead1W(28);                // S^WS | '(:' | ':='\n    shift(53);                      // ':='\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"TransformSpec\", e0);\n  }\n\n  function try_TransformSpec()\n  {\n    shiftT(31);                     // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n    lookahead1W(28);                // S^WS | '(:' | ':='\n    shiftT(53);                     // ':='\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_FTSelection()\n  {\n    eventHandler.startNonterminal(\"FTSelection\", e0);\n    parse_FTOr();\n    for (;;)\n    {\n      lookahead1W(212);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      switch (l1)\n      {\n      case 82:                      // 'at'\n        lookahead2W(161);           // S^WS | '(:' | 'end' | 'position' | 'start'\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk != 116                 // 'different'\n       && lk != 118                 // 'distance'\n       && lk != 128                 // 'entire'\n       && lk != 206                 // 'ordered'\n       && lk != 227                 // 'same'\n       && lk != 275                 // 'window'\n       && lk != 65106               // 'at' 'end'\n       && lk != 123986)             // 'at' 'start'\n      {\n        break;\n      }\n      whitespace();\n      parse_FTPosFilter();\n    }\n    eventHandler.endNonterminal(\"FTSelection\", e0);\n  }\n\n  function try_FTSelection()\n  {\n    try_FTOr();\n    for (;;)\n    {\n      lookahead1W(212);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      switch (l1)\n      {\n      case 82:                      // 'at'\n        lookahead2W(161);           // S^WS | '(:' | 'end' | 'position' | 'start'\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk != 116                 // 'different'\n       && lk != 118                 // 'distance'\n       && lk != 128                 // 'entire'\n       && lk != 206                 // 'ordered'\n       && lk != 227                 // 'same'\n       && lk != 275                 // 'window'\n       && lk != 65106               // 'at' 'end'\n       && lk != 123986)             // 'at' 'start'\n      {\n        break;\n      }\n      try_FTPosFilter();\n    }\n  }\n\n  function parse_FTWeight()\n  {\n    eventHandler.startNonterminal(\"FTWeight\", e0);\n    shift(270);                     // 'weight'\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    shift(281);                     // '{'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Expr();\n    shift(287);                     // '}'\n    eventHandler.endNonterminal(\"FTWeight\", e0);\n  }\n\n  function try_FTWeight()\n  {\n    shiftT(270);                    // 'weight'\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    shiftT(281);                    // '{'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Expr();\n    shiftT(287);                    // '}'\n  }\n\n  function parse_FTOr()\n  {\n    eventHandler.startNonterminal(\"FTOr\", e0);\n    parse_FTAnd();\n    for (;;)\n    {\n      if (l1 != 146)                // 'ftor'\n      {\n        break;\n      }\n      shift(146);                   // 'ftor'\n      lookahead1W(177);             // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{'\n      whitespace();\n      parse_FTAnd();\n    }\n    eventHandler.endNonterminal(\"FTOr\", e0);\n  }\n\n  function try_FTOr()\n  {\n    try_FTAnd();\n    for (;;)\n    {\n      if (l1 != 146)                // 'ftor'\n      {\n        break;\n      }\n      shiftT(146);                  // 'ftor'\n      lookahead1W(177);             // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{'\n      try_FTAnd();\n    }\n  }\n\n  function parse_FTAnd()\n  {\n    eventHandler.startNonterminal(\"FTAnd\", e0);\n    parse_FTMildNot();\n    for (;;)\n    {\n      if (l1 != 144)                // 'ftand'\n      {\n        break;\n      }\n      shift(144);                   // 'ftand'\n      lookahead1W(177);             // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{'\n      whitespace();\n      parse_FTMildNot();\n    }\n    eventHandler.endNonterminal(\"FTAnd\", e0);\n  }\n\n  function try_FTAnd()\n  {\n    try_FTMildNot();\n    for (;;)\n    {\n      if (l1 != 144)                // 'ftand'\n      {\n        break;\n      }\n      shiftT(144);                  // 'ftand'\n      lookahead1W(177);             // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{'\n      try_FTMildNot();\n    }\n  }\n\n  function parse_FTMildNot()\n  {\n    eventHandler.startNonterminal(\"FTMildNot\", e0);\n    parse_FTUnaryNot();\n    for (;;)\n    {\n      lookahead1W(213);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      if (l1 != 196)                // 'not'\n      {\n        break;\n      }\n      shift(196);                   // 'not'\n      lookahead1W(56);              // S^WS | '(:' | 'in'\n      shift(156);                   // 'in'\n      lookahead1W(177);             // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{'\n      whitespace();\n      parse_FTUnaryNot();\n    }\n    eventHandler.endNonterminal(\"FTMildNot\", e0);\n  }\n\n  function try_FTMildNot()\n  {\n    try_FTUnaryNot();\n    for (;;)\n    {\n      lookahead1W(213);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      if (l1 != 196)                // 'not'\n      {\n        break;\n      }\n      shiftT(196);                  // 'not'\n      lookahead1W(56);              // S^WS | '(:' | 'in'\n      shiftT(156);                  // 'in'\n      lookahead1W(177);             // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{'\n      try_FTUnaryNot();\n    }\n  }\n\n  function parse_FTUnaryNot()\n  {\n    eventHandler.startNonterminal(\"FTUnaryNot\", e0);\n    if (l1 == 145)                  // 'ftnot'\n    {\n      shift(145);                   // 'ftnot'\n    }\n    lookahead1W(164);               // StringLiteral | S^WS | '(' | '(#' | '(:' | '{'\n    whitespace();\n    parse_FTPrimaryWithOptions();\n    eventHandler.endNonterminal(\"FTUnaryNot\", e0);\n  }\n\n  function try_FTUnaryNot()\n  {\n    if (l1 == 145)                  // 'ftnot'\n    {\n      shiftT(145);                  // 'ftnot'\n    }\n    lookahead1W(164);               // StringLiteral | S^WS | '(' | '(#' | '(:' | '{'\n    try_FTPrimaryWithOptions();\n  }\n\n  function parse_FTPrimaryWithOptions()\n  {\n    eventHandler.startNonterminal(\"FTPrimaryWithOptions\", e0);\n    parse_FTPrimary();\n    lookahead1W(214);               // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n    if (l1 == 265)                  // 'using'\n    {\n      whitespace();\n      parse_FTMatchOptions();\n    }\n    if (l1 == 270)                  // 'weight'\n    {\n      whitespace();\n      parse_FTWeight();\n    }\n    eventHandler.endNonterminal(\"FTPrimaryWithOptions\", e0);\n  }\n\n  function try_FTPrimaryWithOptions()\n  {\n    try_FTPrimary();\n    lookahead1W(214);               // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n    if (l1 == 265)                  // 'using'\n    {\n      try_FTMatchOptions();\n    }\n    if (l1 == 270)                  // 'weight'\n    {\n      try_FTWeight();\n    }\n  }\n\n  function parse_FTPrimary()\n  {\n    eventHandler.startNonterminal(\"FTPrimary\", e0);\n    switch (l1)\n    {\n    case 35:                        // '('\n      shift(35);                    // '('\n      lookahead1W(177);             // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{'\n      whitespace();\n      parse_FTSelection();\n      shift(38);                    // ')'\n      break;\n    case 36:                        // '(#'\n      parse_FTExtensionSelection();\n      break;\n    default:\n      parse_FTWords();\n      lookahead1W(215);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      if (l1 == 199)                // 'occurs'\n      {\n        whitespace();\n        parse_FTTimes();\n      }\n    }\n    eventHandler.endNonterminal(\"FTPrimary\", e0);\n  }\n\n  function try_FTPrimary()\n  {\n    switch (l1)\n    {\n    case 35:                        // '('\n      shiftT(35);                   // '('\n      lookahead1W(177);             // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{'\n      try_FTSelection();\n      shiftT(38);                   // ')'\n      break;\n    case 36:                        // '(#'\n      try_FTExtensionSelection();\n      break;\n    default:\n      try_FTWords();\n      lookahead1W(215);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      if (l1 == 199)                // 'occurs'\n      {\n        try_FTTimes();\n      }\n    }\n  }\n\n  function parse_FTWords()\n  {\n    eventHandler.startNonterminal(\"FTWords\", e0);\n    parse_FTWordsValue();\n    lookahead1W(221);               // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n    if (l1 == 72                    // 'all'\n     || l1 == 77                    // 'any'\n     || l1 == 214)                  // 'phrase'\n    {\n      whitespace();\n      parse_FTAnyallOption();\n    }\n    eventHandler.endNonterminal(\"FTWords\", e0);\n  }\n\n  function try_FTWords()\n  {\n    try_FTWordsValue();\n    lookahead1W(221);               // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n    if (l1 == 72                    // 'all'\n     || l1 == 77                    // 'any'\n     || l1 == 214)                  // 'phrase'\n    {\n      try_FTAnyallOption();\n    }\n  }\n\n  function parse_FTWordsValue()\n  {\n    eventHandler.startNonterminal(\"FTWordsValue\", e0);\n    switch (l1)\n    {\n    case 11:                        // StringLiteral\n      shift(11);                    // StringLiteral\n      break;\n    default:\n      shift(281);                   // '{'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_Expr();\n      shift(287);                   // '}'\n    }\n    eventHandler.endNonterminal(\"FTWordsValue\", e0);\n  }\n\n  function try_FTWordsValue()\n  {\n    switch (l1)\n    {\n    case 11:                        // StringLiteral\n      shiftT(11);                   // StringLiteral\n      break;\n    default:\n      shiftT(281);                  // '{'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_Expr();\n      shiftT(287);                  // '}'\n    }\n  }\n\n  function parse_FTExtensionSelection()\n  {\n    eventHandler.startNonterminal(\"FTExtensionSelection\", e0);\n    for (;;)\n    {\n      whitespace();\n      parse_Pragma();\n      lookahead1W(104);             // S^WS | '(#' | '(:' | '{'\n      if (l1 != 36)                 // '(#'\n      {\n        break;\n      }\n    }\n    shift(281);                     // '{'\n    lookahead1W(184);               // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{' | '}'\n    if (l1 != 287)                  // '}'\n    {\n      whitespace();\n      parse_FTSelection();\n    }\n    shift(287);                     // '}'\n    eventHandler.endNonterminal(\"FTExtensionSelection\", e0);\n  }\n\n  function try_FTExtensionSelection()\n  {\n    for (;;)\n    {\n      try_Pragma();\n      lookahead1W(104);             // S^WS | '(#' | '(:' | '{'\n      if (l1 != 36)                 // '(#'\n      {\n        break;\n      }\n    }\n    shiftT(281);                    // '{'\n    lookahead1W(184);               // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{' | '}'\n    if (l1 != 287)                  // '}'\n    {\n      try_FTSelection();\n    }\n    shiftT(287);                    // '}'\n  }\n\n  function parse_FTAnyallOption()\n  {\n    eventHandler.startNonterminal(\"FTAnyallOption\", e0);\n    switch (l1)\n    {\n    case 77:                        // 'any'\n      shift(77);                    // 'any'\n      lookahead1W(218);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      if (l1 == 278)                // 'word'\n      {\n        shift(278);                 // 'word'\n      }\n      break;\n    case 72:                        // 'all'\n      shift(72);                    // 'all'\n      lookahead1W(219);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      if (l1 == 279)                // 'words'\n      {\n        shift(279);                 // 'words'\n      }\n      break;\n    default:\n      shift(214);                   // 'phrase'\n    }\n    eventHandler.endNonterminal(\"FTAnyallOption\", e0);\n  }\n\n  function try_FTAnyallOption()\n  {\n    switch (l1)\n    {\n    case 77:                        // 'any'\n      shiftT(77);                   // 'any'\n      lookahead1W(218);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      if (l1 == 278)                // 'word'\n      {\n        shiftT(278);                // 'word'\n      }\n      break;\n    case 72:                        // 'all'\n      shiftT(72);                   // 'all'\n      lookahead1W(219);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      if (l1 == 279)                // 'words'\n      {\n        shiftT(279);                // 'words'\n      }\n      break;\n    default:\n      shiftT(214);                  // 'phrase'\n    }\n  }\n\n  function parse_FTTimes()\n  {\n    eventHandler.startNonterminal(\"FTTimes\", e0);\n    shift(199);                     // 'occurs'\n    lookahead1W(159);               // S^WS | '(:' | 'at' | 'exactly' | 'from'\n    whitespace();\n    parse_FTRange();\n    shift(252);                     // 'times'\n    eventHandler.endNonterminal(\"FTTimes\", e0);\n  }\n\n  function try_FTTimes()\n  {\n    shiftT(199);                    // 'occurs'\n    lookahead1W(159);               // S^WS | '(:' | 'at' | 'exactly' | 'from'\n    try_FTRange();\n    shiftT(252);                    // 'times'\n  }\n\n  function parse_FTRange()\n  {\n    eventHandler.startNonterminal(\"FTRange\", e0);\n    switch (l1)\n    {\n    case 131:                       // 'exactly'\n      shift(131);                   // 'exactly'\n      lookahead1W(266);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_AdditiveExpr();\n      break;\n    case 82:                        // 'at'\n      shift(82);                    // 'at'\n      lookahead1W(129);             // S^WS | '(:' | 'least' | 'most'\n      switch (l1)\n      {\n      case 176:                     // 'least'\n        shift(176);                 // 'least'\n        lookahead1W(266);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        whitespace();\n        parse_AdditiveExpr();\n        break;\n      default:\n        shift(186);                 // 'most'\n        lookahead1W(266);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        whitespace();\n        parse_AdditiveExpr();\n      }\n      break;\n    default:\n      shift(142);                   // 'from'\n      lookahead1W(266);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_AdditiveExpr();\n      shift(253);                   // 'to'\n      lookahead1W(266);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_AdditiveExpr();\n    }\n    eventHandler.endNonterminal(\"FTRange\", e0);\n  }\n\n  function try_FTRange()\n  {\n    switch (l1)\n    {\n    case 131:                       // 'exactly'\n      shiftT(131);                  // 'exactly'\n      lookahead1W(266);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_AdditiveExpr();\n      break;\n    case 82:                        // 'at'\n      shiftT(82);                   // 'at'\n      lookahead1W(129);             // S^WS | '(:' | 'least' | 'most'\n      switch (l1)\n      {\n      case 176:                     // 'least'\n        shiftT(176);                // 'least'\n        lookahead1W(266);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        try_AdditiveExpr();\n        break;\n      default:\n        shiftT(186);                // 'most'\n        lookahead1W(266);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        try_AdditiveExpr();\n      }\n      break;\n    default:\n      shiftT(142);                  // 'from'\n      lookahead1W(266);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_AdditiveExpr();\n      shiftT(253);                  // 'to'\n      lookahead1W(266);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_AdditiveExpr();\n    }\n  }\n\n  function parse_FTPosFilter()\n  {\n    eventHandler.startNonterminal(\"FTPosFilter\", e0);\n    switch (l1)\n    {\n    case 206:                       // 'ordered'\n      parse_FTOrder();\n      break;\n    case 275:                       // 'window'\n      parse_FTWindow();\n      break;\n    case 118:                       // 'distance'\n      parse_FTDistance();\n      break;\n    case 116:                       // 'different'\n    case 227:                       // 'same'\n      parse_FTScope();\n      break;\n    default:\n      parse_FTContent();\n    }\n    eventHandler.endNonterminal(\"FTPosFilter\", e0);\n  }\n\n  function try_FTPosFilter()\n  {\n    switch (l1)\n    {\n    case 206:                       // 'ordered'\n      try_FTOrder();\n      break;\n    case 275:                       // 'window'\n      try_FTWindow();\n      break;\n    case 118:                       // 'distance'\n      try_FTDistance();\n      break;\n    case 116:                       // 'different'\n    case 227:                       // 'same'\n      try_FTScope();\n      break;\n    default:\n      try_FTContent();\n    }\n  }\n\n  function parse_FTOrder()\n  {\n    eventHandler.startNonterminal(\"FTOrder\", e0);\n    shift(206);                     // 'ordered'\n    eventHandler.endNonterminal(\"FTOrder\", e0);\n  }\n\n  function try_FTOrder()\n  {\n    shiftT(206);                    // 'ordered'\n  }\n\n  function parse_FTWindow()\n  {\n    eventHandler.startNonterminal(\"FTWindow\", e0);\n    shift(275);                     // 'window'\n    lookahead1W(266);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_AdditiveExpr();\n    whitespace();\n    parse_FTUnit();\n    eventHandler.endNonterminal(\"FTWindow\", e0);\n  }\n\n  function try_FTWindow()\n  {\n    shiftT(275);                    // 'window'\n    lookahead1W(266);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_AdditiveExpr();\n    try_FTUnit();\n  }\n\n  function parse_FTDistance()\n  {\n    eventHandler.startNonterminal(\"FTDistance\", e0);\n    shift(118);                     // 'distance'\n    lookahead1W(159);               // S^WS | '(:' | 'at' | 'exactly' | 'from'\n    whitespace();\n    parse_FTRange();\n    whitespace();\n    parse_FTUnit();\n    eventHandler.endNonterminal(\"FTDistance\", e0);\n  }\n\n  function try_FTDistance()\n  {\n    shiftT(118);                    // 'distance'\n    lookahead1W(159);               // S^WS | '(:' | 'at' | 'exactly' | 'from'\n    try_FTRange();\n    try_FTUnit();\n  }\n\n  function parse_FTUnit()\n  {\n    eventHandler.startNonterminal(\"FTUnit\", e0);\n    switch (l1)\n    {\n    case 279:                       // 'words'\n      shift(279);                   // 'words'\n      break;\n    case 237:                       // 'sentences'\n      shift(237);                   // 'sentences'\n      break;\n    default:\n      shift(209);                   // 'paragraphs'\n    }\n    eventHandler.endNonterminal(\"FTUnit\", e0);\n  }\n\n  function try_FTUnit()\n  {\n    switch (l1)\n    {\n    case 279:                       // 'words'\n      shiftT(279);                  // 'words'\n      break;\n    case 237:                       // 'sentences'\n      shiftT(237);                  // 'sentences'\n      break;\n    default:\n      shiftT(209);                  // 'paragraphs'\n    }\n  }\n\n  function parse_FTScope()\n  {\n    eventHandler.startNonterminal(\"FTScope\", e0);\n    switch (l1)\n    {\n    case 227:                       // 'same'\n      shift(227);                   // 'same'\n      break;\n    default:\n      shift(116);                   // 'different'\n    }\n    lookahead1W(136);               // S^WS | '(:' | 'paragraph' | 'sentence'\n    whitespace();\n    parse_FTBigUnit();\n    eventHandler.endNonterminal(\"FTScope\", e0);\n  }\n\n  function try_FTScope()\n  {\n    switch (l1)\n    {\n    case 227:                       // 'same'\n      shiftT(227);                  // 'same'\n      break;\n    default:\n      shiftT(116);                  // 'different'\n    }\n    lookahead1W(136);               // S^WS | '(:' | 'paragraph' | 'sentence'\n    try_FTBigUnit();\n  }\n\n  function parse_FTBigUnit()\n  {\n    eventHandler.startNonterminal(\"FTBigUnit\", e0);\n    switch (l1)\n    {\n    case 236:                       // 'sentence'\n      shift(236);                   // 'sentence'\n      break;\n    default:\n      shift(208);                   // 'paragraph'\n    }\n    eventHandler.endNonterminal(\"FTBigUnit\", e0);\n  }\n\n  function try_FTBigUnit()\n  {\n    switch (l1)\n    {\n    case 236:                       // 'sentence'\n      shiftT(236);                  // 'sentence'\n      break;\n    default:\n      shiftT(208);                  // 'paragraph'\n    }\n  }\n\n  function parse_FTContent()\n  {\n    eventHandler.startNonterminal(\"FTContent\", e0);\n    switch (l1)\n    {\n    case 82:                        // 'at'\n      shift(82);                    // 'at'\n      lookahead1W(121);             // S^WS | '(:' | 'end' | 'start'\n      switch (l1)\n      {\n      case 242:                     // 'start'\n        shift(242);                 // 'start'\n        break;\n      default:\n        shift(127);                 // 'end'\n      }\n      break;\n    default:\n      shift(128);                   // 'entire'\n      lookahead1W(45);              // S^WS | '(:' | 'content'\n      shift(101);                   // 'content'\n    }\n    eventHandler.endNonterminal(\"FTContent\", e0);\n  }\n\n  function try_FTContent()\n  {\n    switch (l1)\n    {\n    case 82:                        // 'at'\n      shiftT(82);                   // 'at'\n      lookahead1W(121);             // S^WS | '(:' | 'end' | 'start'\n      switch (l1)\n      {\n      case 242:                     // 'start'\n        shiftT(242);                // 'start'\n        break;\n      default:\n        shiftT(127);                // 'end'\n      }\n      break;\n    default:\n      shiftT(128);                  // 'entire'\n      lookahead1W(45);              // S^WS | '(:' | 'content'\n      shiftT(101);                  // 'content'\n    }\n  }\n\n  function parse_FTMatchOptions()\n  {\n    eventHandler.startNonterminal(\"FTMatchOptions\", e0);\n    for (;;)\n    {\n      shift(265);                   // 'using'\n      lookahead1W(205);             // S^WS | '(:' | 'case' | 'diacritics' | 'language' | 'lowercase' | 'no' |\n      whitespace();\n      parse_FTMatchOption();\n      lookahead1W(214);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      if (l1 != 265)                // 'using'\n      {\n        break;\n      }\n    }\n    eventHandler.endNonterminal(\"FTMatchOptions\", e0);\n  }\n\n  function try_FTMatchOptions()\n  {\n    for (;;)\n    {\n      shiftT(265);                  // 'using'\n      lookahead1W(205);             // S^WS | '(:' | 'case' | 'diacritics' | 'language' | 'lowercase' | 'no' |\n      try_FTMatchOption();\n      lookahead1W(214);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      if (l1 != 265)                // 'using'\n      {\n        break;\n      }\n    }\n  }\n\n  function parse_FTMatchOption()\n  {\n    eventHandler.startNonterminal(\"FTMatchOption\", e0);\n    switch (l1)\n    {\n    case 191:                       // 'no'\n      lookahead2W(176);             // S^WS | '(:' | 'stemming' | 'stop' | 'thesaurus' | 'wildcards'\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 172:                       // 'language'\n      parse_FTLanguageOption();\n      break;\n    case 274:                       // 'wildcards'\n    case 140479:                    // 'no' 'wildcards'\n      parse_FTWildCardOption();\n      break;\n    case 251:                       // 'thesaurus'\n    case 128703:                    // 'no' 'thesaurus'\n      parse_FTThesaurusOption();\n      break;\n    case 243:                       // 'stemming'\n    case 124607:                    // 'no' 'stemming'\n      parse_FTStemOption();\n      break;\n    case 115:                       // 'diacritics'\n      parse_FTDiacriticsOption();\n      break;\n    case 244:                       // 'stop'\n    case 125119:                    // 'no' 'stop'\n      parse_FTStopWordOption();\n      break;\n    case 203:                       // 'option'\n      parse_FTExtensionOption();\n      break;\n    default:\n      parse_FTCaseOption();\n    }\n    eventHandler.endNonterminal(\"FTMatchOption\", e0);\n  }\n\n  function try_FTMatchOption()\n  {\n    switch (l1)\n    {\n    case 191:                       // 'no'\n      lookahead2W(176);             // S^WS | '(:' | 'stemming' | 'stop' | 'thesaurus' | 'wildcards'\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 172:                       // 'language'\n      try_FTLanguageOption();\n      break;\n    case 274:                       // 'wildcards'\n    case 140479:                    // 'no' 'wildcards'\n      try_FTWildCardOption();\n      break;\n    case 251:                       // 'thesaurus'\n    case 128703:                    // 'no' 'thesaurus'\n      try_FTThesaurusOption();\n      break;\n    case 243:                       // 'stemming'\n    case 124607:                    // 'no' 'stemming'\n      try_FTStemOption();\n      break;\n    case 115:                       // 'diacritics'\n      try_FTDiacriticsOption();\n      break;\n    case 244:                       // 'stop'\n    case 125119:                    // 'no' 'stop'\n      try_FTStopWordOption();\n      break;\n    case 203:                       // 'option'\n      try_FTExtensionOption();\n      break;\n    default:\n      try_FTCaseOption();\n    }\n  }\n\n  function parse_FTCaseOption()\n  {\n    eventHandler.startNonterminal(\"FTCaseOption\", e0);\n    switch (l1)\n    {\n    case 89:                        // 'case'\n      shift(89);                    // 'case'\n      lookahead1W(128);             // S^WS | '(:' | 'insensitive' | 'sensitive'\n      switch (l1)\n      {\n      case 160:                     // 'insensitive'\n        shift(160);                 // 'insensitive'\n        break;\n      default:\n        shift(235);                 // 'sensitive'\n      }\n      break;\n    case 180:                       // 'lowercase'\n      shift(180);                   // 'lowercase'\n      break;\n    default:\n      shift(264);                   // 'uppercase'\n    }\n    eventHandler.endNonterminal(\"FTCaseOption\", e0);\n  }\n\n  function try_FTCaseOption()\n  {\n    switch (l1)\n    {\n    case 89:                        // 'case'\n      shiftT(89);                   // 'case'\n      lookahead1W(128);             // S^WS | '(:' | 'insensitive' | 'sensitive'\n      switch (l1)\n      {\n      case 160:                     // 'insensitive'\n        shiftT(160);                // 'insensitive'\n        break;\n      default:\n        shiftT(235);                // 'sensitive'\n      }\n      break;\n    case 180:                       // 'lowercase'\n      shiftT(180);                  // 'lowercase'\n      break;\n    default:\n      shiftT(264);                  // 'uppercase'\n    }\n  }\n\n  function parse_FTDiacriticsOption()\n  {\n    eventHandler.startNonterminal(\"FTDiacriticsOption\", e0);\n    shift(115);                     // 'diacritics'\n    lookahead1W(128);               // S^WS | '(:' | 'insensitive' | 'sensitive'\n    switch (l1)\n    {\n    case 160:                       // 'insensitive'\n      shift(160);                   // 'insensitive'\n      break;\n    default:\n      shift(235);                   // 'sensitive'\n    }\n    eventHandler.endNonterminal(\"FTDiacriticsOption\", e0);\n  }\n\n  function try_FTDiacriticsOption()\n  {\n    shiftT(115);                    // 'diacritics'\n    lookahead1W(128);               // S^WS | '(:' | 'insensitive' | 'sensitive'\n    switch (l1)\n    {\n    case 160:                       // 'insensitive'\n      shiftT(160);                  // 'insensitive'\n      break;\n    default:\n      shiftT(235);                  // 'sensitive'\n    }\n  }\n\n  function parse_FTStemOption()\n  {\n    eventHandler.startNonterminal(\"FTStemOption\", e0);\n    switch (l1)\n    {\n    case 243:                       // 'stemming'\n      shift(243);                   // 'stemming'\n      break;\n    default:\n      shift(191);                   // 'no'\n      lookahead1W(77);              // S^WS | '(:' | 'stemming'\n      shift(243);                   // 'stemming'\n    }\n    eventHandler.endNonterminal(\"FTStemOption\", e0);\n  }\n\n  function try_FTStemOption()\n  {\n    switch (l1)\n    {\n    case 243:                       // 'stemming'\n      shiftT(243);                  // 'stemming'\n      break;\n    default:\n      shiftT(191);                  // 'no'\n      lookahead1W(77);              // S^WS | '(:' | 'stemming'\n      shiftT(243);                  // 'stemming'\n    }\n  }\n\n  function parse_FTThesaurusOption()\n  {\n    eventHandler.startNonterminal(\"FTThesaurusOption\", e0);\n    switch (l1)\n    {\n    case 251:                       // 'thesaurus'\n      shift(251);                   // 'thesaurus'\n      lookahead1W(152);             // S^WS | '(' | '(:' | 'at' | 'default'\n      switch (l1)\n      {\n      case 82:                      // 'at'\n        whitespace();\n        parse_FTThesaurusID();\n        break;\n      case 110:                     // 'default'\n        shift(110);                 // 'default'\n        break;\n      default:\n        shift(35);                  // '('\n        lookahead1W(116);           // S^WS | '(:' | 'at' | 'default'\n        switch (l1)\n        {\n        case 82:                    // 'at'\n          whitespace();\n          parse_FTThesaurusID();\n          break;\n        default:\n          shift(110);               // 'default'\n        }\n        for (;;)\n        {\n          lookahead1W(105);         // S^WS | '(:' | ')' | ','\n          if (l1 != 42)             // ','\n          {\n            break;\n          }\n          shift(42);                // ','\n          lookahead1W(34);          // S^WS | '(:' | 'at'\n          whitespace();\n          parse_FTThesaurusID();\n        }\n        shift(38);                  // ')'\n      }\n      break;\n    default:\n      shift(191);                   // 'no'\n      lookahead1W(81);              // S^WS | '(:' | 'thesaurus'\n      shift(251);                   // 'thesaurus'\n    }\n    eventHandler.endNonterminal(\"FTThesaurusOption\", e0);\n  }\n\n  function try_FTThesaurusOption()\n  {\n    switch (l1)\n    {\n    case 251:                       // 'thesaurus'\n      shiftT(251);                  // 'thesaurus'\n      lookahead1W(152);             // S^WS | '(' | '(:' | 'at' | 'default'\n      switch (l1)\n      {\n      case 82:                      // 'at'\n        try_FTThesaurusID();\n        break;\n      case 110:                     // 'default'\n        shiftT(110);                // 'default'\n        break;\n      default:\n        shiftT(35);                 // '('\n        lookahead1W(116);           // S^WS | '(:' | 'at' | 'default'\n        switch (l1)\n        {\n        case 82:                    // 'at'\n          try_FTThesaurusID();\n          break;\n        default:\n          shiftT(110);              // 'default'\n        }\n        for (;;)\n        {\n          lookahead1W(105);         // S^WS | '(:' | ')' | ','\n          if (l1 != 42)             // ','\n          {\n            break;\n          }\n          shiftT(42);               // ','\n          lookahead1W(34);          // S^WS | '(:' | 'at'\n          try_FTThesaurusID();\n        }\n        shiftT(38);                 // ')'\n      }\n      break;\n    default:\n      shiftT(191);                  // 'no'\n      lookahead1W(81);              // S^WS | '(:' | 'thesaurus'\n      shiftT(251);                  // 'thesaurus'\n    }\n  }\n\n  function parse_FTThesaurusID()\n  {\n    eventHandler.startNonterminal(\"FTThesaurusID\", e0);\n    shift(82);                      // 'at'\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shift(7);                       // URILiteral\n    lookahead1W(220);               // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n    if (l1 == 221)                  // 'relationship'\n    {\n      shift(221);                   // 'relationship'\n      lookahead1W(17);              // StringLiteral | S^WS | '(:'\n      shift(11);                    // StringLiteral\n    }\n    lookahead1W(216);               // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n    switch (l1)\n    {\n    case 82:                        // 'at'\n      lookahead2W(183);             // S^WS | '(:' | 'end' | 'least' | 'most' | 'position' | 'start'\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 131                   // 'exactly'\n     || lk == 142                   // 'from'\n     || lk == 90194                 // 'at' 'least'\n     || lk == 95314)                // 'at' 'most'\n    {\n      whitespace();\n      parse_FTLiteralRange();\n      lookahead1W(61);              // S^WS | '(:' | 'levels'\n      shift(178);                   // 'levels'\n    }\n    eventHandler.endNonterminal(\"FTThesaurusID\", e0);\n  }\n\n  function try_FTThesaurusID()\n  {\n    shiftT(82);                     // 'at'\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shiftT(7);                      // URILiteral\n    lookahead1W(220);               // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n    if (l1 == 221)                  // 'relationship'\n    {\n      shiftT(221);                  // 'relationship'\n      lookahead1W(17);              // StringLiteral | S^WS | '(:'\n      shiftT(11);                   // StringLiteral\n    }\n    lookahead1W(216);               // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n    switch (l1)\n    {\n    case 82:                        // 'at'\n      lookahead2W(183);             // S^WS | '(:' | 'end' | 'least' | 'most' | 'position' | 'start'\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 131                   // 'exactly'\n     || lk == 142                   // 'from'\n     || lk == 90194                 // 'at' 'least'\n     || lk == 95314)                // 'at' 'most'\n    {\n      try_FTLiteralRange();\n      lookahead1W(61);              // S^WS | '(:' | 'levels'\n      shiftT(178);                  // 'levels'\n    }\n  }\n\n  function parse_FTLiteralRange()\n  {\n    eventHandler.startNonterminal(\"FTLiteralRange\", e0);\n    switch (l1)\n    {\n    case 131:                       // 'exactly'\n      shift(131);                   // 'exactly'\n      lookahead1W(16);              // IntegerLiteral | S^WS | '(:'\n      shift(8);                     // IntegerLiteral\n      break;\n    case 82:                        // 'at'\n      shift(82);                    // 'at'\n      lookahead1W(129);             // S^WS | '(:' | 'least' | 'most'\n      switch (l1)\n      {\n      case 176:                     // 'least'\n        shift(176);                 // 'least'\n        lookahead1W(16);            // IntegerLiteral | S^WS | '(:'\n        shift(8);                   // IntegerLiteral\n        break;\n      default:\n        shift(186);                 // 'most'\n        lookahead1W(16);            // IntegerLiteral | S^WS | '(:'\n        shift(8);                   // IntegerLiteral\n      }\n      break;\n    default:\n      shift(142);                   // 'from'\n      lookahead1W(16);              // IntegerLiteral | S^WS | '(:'\n      shift(8);                     // IntegerLiteral\n      lookahead1W(82);              // S^WS | '(:' | 'to'\n      shift(253);                   // 'to'\n      lookahead1W(16);              // IntegerLiteral | S^WS | '(:'\n      shift(8);                     // IntegerLiteral\n    }\n    eventHandler.endNonterminal(\"FTLiteralRange\", e0);\n  }\n\n  function try_FTLiteralRange()\n  {\n    switch (l1)\n    {\n    case 131:                       // 'exactly'\n      shiftT(131);                  // 'exactly'\n      lookahead1W(16);              // IntegerLiteral | S^WS | '(:'\n      shiftT(8);                    // IntegerLiteral\n      break;\n    case 82:                        // 'at'\n      shiftT(82);                   // 'at'\n      lookahead1W(129);             // S^WS | '(:' | 'least' | 'most'\n      switch (l1)\n      {\n      case 176:                     // 'least'\n        shiftT(176);                // 'least'\n        lookahead1W(16);            // IntegerLiteral | S^WS | '(:'\n        shiftT(8);                  // IntegerLiteral\n        break;\n      default:\n        shiftT(186);                // 'most'\n        lookahead1W(16);            // IntegerLiteral | S^WS | '(:'\n        shiftT(8);                  // IntegerLiteral\n      }\n      break;\n    default:\n      shiftT(142);                  // 'from'\n      lookahead1W(16);              // IntegerLiteral | S^WS | '(:'\n      shiftT(8);                    // IntegerLiteral\n      lookahead1W(82);              // S^WS | '(:' | 'to'\n      shiftT(253);                  // 'to'\n      lookahead1W(16);              // IntegerLiteral | S^WS | '(:'\n      shiftT(8);                    // IntegerLiteral\n    }\n  }\n\n  function parse_FTStopWordOption()\n  {\n    eventHandler.startNonterminal(\"FTStopWordOption\", e0);\n    switch (l1)\n    {\n    case 244:                       // 'stop'\n      shift(244);                   // 'stop'\n      lookahead1W(89);              // S^WS | '(:' | 'words'\n      shift(279);                   // 'words'\n      lookahead1W(152);             // S^WS | '(' | '(:' | 'at' | 'default'\n      switch (l1)\n      {\n      case 110:                     // 'default'\n        shift(110);                 // 'default'\n        for (;;)\n        {\n          lookahead1W(217);         // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n          if (l1 != 132             // 'except'\n           && l1 != 260)            // 'union'\n          {\n            break;\n          }\n          whitespace();\n          parse_FTStopWordsInclExcl();\n        }\n        break;\n      default:\n        whitespace();\n        parse_FTStopWords();\n        for (;;)\n        {\n          lookahead1W(217);         // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n          if (l1 != 132             // 'except'\n           && l1 != 260)            // 'union'\n          {\n            break;\n          }\n          whitespace();\n          parse_FTStopWordsInclExcl();\n        }\n      }\n      break;\n    default:\n      shift(191);                   // 'no'\n      lookahead1W(78);              // S^WS | '(:' | 'stop'\n      shift(244);                   // 'stop'\n      lookahead1W(89);              // S^WS | '(:' | 'words'\n      shift(279);                   // 'words'\n    }\n    eventHandler.endNonterminal(\"FTStopWordOption\", e0);\n  }\n\n  function try_FTStopWordOption()\n  {\n    switch (l1)\n    {\n    case 244:                       // 'stop'\n      shiftT(244);                  // 'stop'\n      lookahead1W(89);              // S^WS | '(:' | 'words'\n      shiftT(279);                  // 'words'\n      lookahead1W(152);             // S^WS | '(' | '(:' | 'at' | 'default'\n      switch (l1)\n      {\n      case 110:                     // 'default'\n        shiftT(110);                // 'default'\n        for (;;)\n        {\n          lookahead1W(217);         // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n          if (l1 != 132             // 'except'\n           && l1 != 260)            // 'union'\n          {\n            break;\n          }\n          try_FTStopWordsInclExcl();\n        }\n        break;\n      default:\n        try_FTStopWords();\n        for (;;)\n        {\n          lookahead1W(217);         // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n          if (l1 != 132             // 'except'\n           && l1 != 260)            // 'union'\n          {\n            break;\n          }\n          try_FTStopWordsInclExcl();\n        }\n      }\n      break;\n    default:\n      shiftT(191);                  // 'no'\n      lookahead1W(78);              // S^WS | '(:' | 'stop'\n      shiftT(244);                  // 'stop'\n      lookahead1W(89);              // S^WS | '(:' | 'words'\n      shiftT(279);                  // 'words'\n    }\n  }\n\n  function parse_FTStopWords()\n  {\n    eventHandler.startNonterminal(\"FTStopWords\", e0);\n    switch (l1)\n    {\n    case 82:                        // 'at'\n      shift(82);                    // 'at'\n      lookahead1W(15);              // URILiteral | S^WS | '(:'\n      shift(7);                     // URILiteral\n      break;\n    default:\n      shift(35);                    // '('\n      lookahead1W(17);              // StringLiteral | S^WS | '(:'\n      shift(11);                    // StringLiteral\n      for (;;)\n      {\n        lookahead1W(105);           // S^WS | '(:' | ')' | ','\n        if (l1 != 42)               // ','\n        {\n          break;\n        }\n        shift(42);                  // ','\n        lookahead1W(17);            // StringLiteral | S^WS | '(:'\n        shift(11);                  // StringLiteral\n      }\n      shift(38);                    // ')'\n    }\n    eventHandler.endNonterminal(\"FTStopWords\", e0);\n  }\n\n  function try_FTStopWords()\n  {\n    switch (l1)\n    {\n    case 82:                        // 'at'\n      shiftT(82);                   // 'at'\n      lookahead1W(15);              // URILiteral | S^WS | '(:'\n      shiftT(7);                    // URILiteral\n      break;\n    default:\n      shiftT(35);                   // '('\n      lookahead1W(17);              // StringLiteral | S^WS | '(:'\n      shiftT(11);                   // StringLiteral\n      for (;;)\n      {\n        lookahead1W(105);           // S^WS | '(:' | ')' | ','\n        if (l1 != 42)               // ','\n        {\n          break;\n        }\n        shiftT(42);                 // ','\n        lookahead1W(17);            // StringLiteral | S^WS | '(:'\n        shiftT(11);                 // StringLiteral\n      }\n      shiftT(38);                   // ')'\n    }\n  }\n\n  function parse_FTStopWordsInclExcl()\n  {\n    eventHandler.startNonterminal(\"FTStopWordsInclExcl\", e0);\n    switch (l1)\n    {\n    case 260:                       // 'union'\n      shift(260);                   // 'union'\n      break;\n    default:\n      shift(132);                   // 'except'\n    }\n    lookahead1W(103);               // S^WS | '(' | '(:' | 'at'\n    whitespace();\n    parse_FTStopWords();\n    eventHandler.endNonterminal(\"FTStopWordsInclExcl\", e0);\n  }\n\n  function try_FTStopWordsInclExcl()\n  {\n    switch (l1)\n    {\n    case 260:                       // 'union'\n      shiftT(260);                  // 'union'\n      break;\n    default:\n      shiftT(132);                  // 'except'\n    }\n    lookahead1W(103);               // S^WS | '(' | '(:' | 'at'\n    try_FTStopWords();\n  }\n\n  function parse_FTLanguageOption()\n  {\n    eventHandler.startNonterminal(\"FTLanguageOption\", e0);\n    shift(172);                     // 'language'\n    lookahead1W(17);                // StringLiteral | S^WS | '(:'\n    shift(11);                      // StringLiteral\n    eventHandler.endNonterminal(\"FTLanguageOption\", e0);\n  }\n\n  function try_FTLanguageOption()\n  {\n    shiftT(172);                    // 'language'\n    lookahead1W(17);                // StringLiteral | S^WS | '(:'\n    shiftT(11);                     // StringLiteral\n  }\n\n  function parse_FTWildCardOption()\n  {\n    eventHandler.startNonterminal(\"FTWildCardOption\", e0);\n    switch (l1)\n    {\n    case 274:                       // 'wildcards'\n      shift(274);                   // 'wildcards'\n      break;\n    default:\n      shift(191);                   // 'no'\n      lookahead1W(87);              // S^WS | '(:' | 'wildcards'\n      shift(274);                   // 'wildcards'\n    }\n    eventHandler.endNonterminal(\"FTWildCardOption\", e0);\n  }\n\n  function try_FTWildCardOption()\n  {\n    switch (l1)\n    {\n    case 274:                       // 'wildcards'\n      shiftT(274);                  // 'wildcards'\n      break;\n    default:\n      shiftT(191);                  // 'no'\n      lookahead1W(87);              // S^WS | '(:' | 'wildcards'\n      shiftT(274);                  // 'wildcards'\n    }\n  }\n\n  function parse_FTExtensionOption()\n  {\n    eventHandler.startNonterminal(\"FTExtensionOption\", e0);\n    shift(203);                     // 'option'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_EQName();\n    lookahead1W(17);                // StringLiteral | S^WS | '(:'\n    shift(11);                      // StringLiteral\n    eventHandler.endNonterminal(\"FTExtensionOption\", e0);\n  }\n\n  function try_FTExtensionOption()\n  {\n    shiftT(203);                    // 'option'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_EQName();\n    lookahead1W(17);                // StringLiteral | S^WS | '(:'\n    shiftT(11);                     // StringLiteral\n  }\n\n  function parse_FTIgnoreOption()\n  {\n    eventHandler.startNonterminal(\"FTIgnoreOption\", e0);\n    shift(277);                     // 'without'\n    lookahead1W(45);                // S^WS | '(:' | 'content'\n    shift(101);                     // 'content'\n    lookahead1W(266);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_UnionExpr();\n    eventHandler.endNonterminal(\"FTIgnoreOption\", e0);\n  }\n\n  function try_FTIgnoreOption()\n  {\n    shiftT(277);                    // 'without'\n    lookahead1W(45);                // S^WS | '(:' | 'content'\n    shiftT(101);                    // 'content'\n    lookahead1W(266);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_UnionExpr();\n  }\n\n  function parse_CollectionDecl()\n  {\n    eventHandler.startNonterminal(\"CollectionDecl\", e0);\n    shift(96);                      // 'collection'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_EQName();\n    lookahead1W(111);               // S^WS | '(:' | ';' | 'as'\n    if (l1 == 80)                   // 'as'\n    {\n      whitespace();\n      parse_CollectionTypeDecl();\n    }\n    eventHandler.endNonterminal(\"CollectionDecl\", e0);\n  }\n\n  function parse_CollectionTypeDecl()\n  {\n    eventHandler.startNonterminal(\"CollectionTypeDecl\", e0);\n    shift(80);                      // 'as'\n    lookahead1W(200);               // S^WS | '(:' | 'attribute' | 'comment' | 'document-node' | 'element' |\n    whitespace();\n    parse_KindTest();\n    lookahead1W(171);               // S^WS | '(:' | '*' | '+' | ';' | '?'\n    if (l1 != 54)                   // ';'\n    {\n      whitespace();\n      parse_OccurrenceIndicator();\n    }\n    eventHandler.endNonterminal(\"CollectionTypeDecl\", e0);\n  }\n\n  function parse_IndexName()\n  {\n    eventHandler.startNonterminal(\"IndexName\", e0);\n    parse_EQName();\n    eventHandler.endNonterminal(\"IndexName\", e0);\n  }\n\n  function parse_IndexDomainExpr()\n  {\n    eventHandler.startNonterminal(\"IndexDomainExpr\", e0);\n    parse_PathExpr();\n    eventHandler.endNonterminal(\"IndexDomainExpr\", e0);\n  }\n\n  function parse_IndexKeySpec()\n  {\n    eventHandler.startNonterminal(\"IndexKeySpec\", e0);\n    parse_IndexKeyExpr();\n    if (l1 == 80)                   // 'as'\n    {\n      whitespace();\n      parse_IndexKeyTypeDecl();\n    }\n    lookahead1W(156);               // S^WS | '(:' | ',' | ';' | 'collation'\n    if (l1 == 95)                   // 'collation'\n    {\n      whitespace();\n      parse_IndexKeyCollation();\n    }\n    eventHandler.endNonterminal(\"IndexKeySpec\", e0);\n  }\n\n  function parse_IndexKeyExpr()\n  {\n    eventHandler.startNonterminal(\"IndexKeyExpr\", e0);\n    parse_PathExpr();\n    eventHandler.endNonterminal(\"IndexKeyExpr\", e0);\n  }\n\n  function parse_IndexKeyTypeDecl()\n  {\n    eventHandler.startNonterminal(\"IndexKeyTypeDecl\", e0);\n    shift(80);                      // 'as'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_AtomicType();\n    lookahead1W(189);               // S^WS | '(:' | '*' | '+' | ',' | ';' | '?' | 'collation'\n    if (l1 == 40                    // '*'\n     || l1 == 41                    // '+'\n     || l1 == 65)                   // '?'\n    {\n      whitespace();\n      parse_OccurrenceIndicator();\n    }\n    eventHandler.endNonterminal(\"IndexKeyTypeDecl\", e0);\n  }\n\n  function parse_AtomicType()\n  {\n    eventHandler.startNonterminal(\"AtomicType\", e0);\n    parse_EQName();\n    eventHandler.endNonterminal(\"AtomicType\", e0);\n  }\n\n  function parse_IndexKeyCollation()\n  {\n    eventHandler.startNonterminal(\"IndexKeyCollation\", e0);\n    shift(95);                      // 'collation'\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shift(7);                       // URILiteral\n    eventHandler.endNonterminal(\"IndexKeyCollation\", e0);\n  }\n\n  function parse_IndexDecl()\n  {\n    eventHandler.startNonterminal(\"IndexDecl\", e0);\n    shift(157);                     // 'index'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_IndexName();\n    lookahead1W(68);                // S^WS | '(:' | 'on'\n    shift(201);                     // 'on'\n    lookahead1W(66);                // S^WS | '(:' | 'nodes'\n    shift(195);                     // 'nodes'\n    lookahead1W(263);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_IndexDomainExpr();\n    shift(88);                      // 'by'\n    lookahead1W(263);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_IndexKeySpec();\n    for (;;)\n    {\n      lookahead1W(107);             // S^WS | '(:' | ',' | ';'\n      if (l1 != 42)                 // ','\n      {\n        break;\n      }\n      shift(42);                    // ','\n      lookahead1W(263);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_IndexKeySpec();\n    }\n    eventHandler.endNonterminal(\"IndexDecl\", e0);\n  }\n\n  function parse_ICDecl()\n  {\n    eventHandler.startNonterminal(\"ICDecl\", e0);\n    shift(163);                     // 'integrity'\n    lookahead1W(43);                // S^WS | '(:' | 'constraint'\n    shift(98);                      // 'constraint'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_EQName();\n    lookahead1W(124);               // S^WS | '(:' | 'foreign' | 'on'\n    switch (l1)\n    {\n    case 201:                       // 'on'\n      whitespace();\n      parse_ICCollection();\n      break;\n    default:\n      whitespace();\n      parse_ICForeignKey();\n    }\n    eventHandler.endNonterminal(\"ICDecl\", e0);\n  }\n\n  function parse_ICCollection()\n  {\n    eventHandler.startNonterminal(\"ICCollection\", e0);\n    shift(201);                     // 'on'\n    lookahead1W(42);                // S^WS | '(:' | 'collection'\n    shift(96);                      // 'collection'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_EQName();\n    lookahead1W(150);               // S^WS | '$' | '(:' | 'foreach' | 'node'\n    switch (l1)\n    {\n    case 31:                        // '$'\n      whitespace();\n      parse_ICCollSequence();\n      break;\n    case 194:                       // 'node'\n      whitespace();\n      parse_ICCollSequenceUnique();\n      break;\n    default:\n      whitespace();\n      parse_ICCollNode();\n    }\n    eventHandler.endNonterminal(\"ICCollection\", e0);\n  }\n\n  function parse_ICCollSequence()\n  {\n    eventHandler.startNonterminal(\"ICCollSequence\", e0);\n    parse_VarRef();\n    lookahead1W(40);                // S^WS | '(:' | 'check'\n    shift(93);                      // 'check'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"ICCollSequence\", e0);\n  }\n\n  function parse_ICCollSequenceUnique()\n  {\n    eventHandler.startNonterminal(\"ICCollSequenceUnique\", e0);\n    shift(194);                     // 'node'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    whitespace();\n    parse_VarRef();\n    lookahead1W(40);                // S^WS | '(:' | 'check'\n    shift(93);                      // 'check'\n    lookahead1W(83);                // S^WS | '(:' | 'unique'\n    shift(261);                     // 'unique'\n    lookahead1W(60);                // S^WS | '(:' | 'key'\n    shift(171);                     // 'key'\n    lookahead1W(263);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_PathExpr();\n    eventHandler.endNonterminal(\"ICCollSequenceUnique\", e0);\n  }\n\n  function parse_ICCollNode()\n  {\n    eventHandler.startNonterminal(\"ICCollNode\", e0);\n    shift(140);                     // 'foreach'\n    lookahead1W(65);                // S^WS | '(:' | 'node'\n    shift(194);                     // 'node'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    whitespace();\n    parse_VarRef();\n    lookahead1W(40);                // S^WS | '(:' | 'check'\n    shift(93);                      // 'check'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"ICCollNode\", e0);\n  }\n\n  function parse_ICForeignKey()\n  {\n    eventHandler.startNonterminal(\"ICForeignKey\", e0);\n    shift(141);                     // 'foreign'\n    lookahead1W(60);                // S^WS | '(:' | 'key'\n    shift(171);                     // 'key'\n    lookahead1W(54);                // S^WS | '(:' | 'from'\n    whitespace();\n    parse_ICForeignKeySource();\n    whitespace();\n    parse_ICForeignKeyTarget();\n    eventHandler.endNonterminal(\"ICForeignKey\", e0);\n  }\n\n  function parse_ICForeignKeySource()\n  {\n    eventHandler.startNonterminal(\"ICForeignKeySource\", e0);\n    shift(142);                     // 'from'\n    lookahead1W(42);                // S^WS | '(:' | 'collection'\n    whitespace();\n    parse_ICForeignKeyValues();\n    eventHandler.endNonterminal(\"ICForeignKeySource\", e0);\n  }\n\n  function parse_ICForeignKeyTarget()\n  {\n    eventHandler.startNonterminal(\"ICForeignKeyTarget\", e0);\n    shift(253);                     // 'to'\n    lookahead1W(42);                // S^WS | '(:' | 'collection'\n    whitespace();\n    parse_ICForeignKeyValues();\n    eventHandler.endNonterminal(\"ICForeignKeyTarget\", e0);\n  }\n\n  function parse_ICForeignKeyValues()\n  {\n    eventHandler.startNonterminal(\"ICForeignKeyValues\", e0);\n    shift(96);                      // 'collection'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_EQName();\n    lookahead1W(65);                // S^WS | '(:' | 'node'\n    shift(194);                     // 'node'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    whitespace();\n    parse_VarRef();\n    lookahead1W(60);                // S^WS | '(:' | 'key'\n    shift(171);                     // 'key'\n    lookahead1W(263);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_PathExpr();\n    eventHandler.endNonterminal(\"ICForeignKeyValues\", e0);\n  }\n\n  function try_Comment()\n  {\n    shiftT(37);                     // '(:'\n    for (;;)\n    {\n      lookahead1(92);               // CommentContents | '(:' | ':)'\n      if (l1 == 51)                 // ':)'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 24:                      // CommentContents\n        shiftT(24);                 // CommentContents\n        break;\n      default:\n        try_Comment();\n      }\n    }\n    shiftT(51);                     // ':)'\n  }\n\n  function try_Whitespace()\n  {\n    switch (l1)\n    {\n    case 22:                        // S^WS\n      shiftT(22);                   // S^WS\n      break;\n    default:\n      try_Comment();\n    }\n  }\n\n  function parse_EQName()\n  {\n    eventHandler.startNonterminal(\"EQName\", e0);\n    lookahead1(241);                // EQName^Token | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' | 'and' |\n    switch (l1)\n    {\n    case 83:                        // 'attribute'\n      shift(83);                    // 'attribute'\n      break;\n    case 97:                        // 'comment'\n      shift(97);                    // 'comment'\n      break;\n    case 121:                       // 'document-node'\n      shift(121);                   // 'document-node'\n      break;\n    case 122:                       // 'element'\n      shift(122);                   // 'element'\n      break;\n    case 125:                       // 'empty-sequence'\n      shift(125);                   // 'empty-sequence'\n      break;\n    case 147:                       // 'function'\n      shift(147);                   // 'function'\n      break;\n    case 154:                       // 'if'\n      shift(154);                   // 'if'\n      break;\n    case 167:                       // 'item'\n      shift(167);                   // 'item'\n      break;\n    case 188:                       // 'namespace-node'\n      shift(188);                   // 'namespace-node'\n      break;\n    case 194:                       // 'node'\n      shift(194);                   // 'node'\n      break;\n    case 220:                       // 'processing-instruction'\n      shift(220);                   // 'processing-instruction'\n      break;\n    case 230:                       // 'schema-attribute'\n      shift(230);                   // 'schema-attribute'\n      break;\n    case 231:                       // 'schema-element'\n      shift(231);                   // 'schema-element'\n      break;\n    case 248:                       // 'switch'\n      shift(248);                   // 'switch'\n      break;\n    case 249:                       // 'text'\n      shift(249);                   // 'text'\n      break;\n    case 259:                       // 'typeswitch'\n      shift(259);                   // 'typeswitch'\n      break;\n    case 79:                        // 'array'\n      shift(79);                    // 'array'\n      break;\n    case 169:                       // 'json-item'\n      shift(169);                   // 'json-item'\n      break;\n    case 247:                       // 'structured-item'\n      shift(247);                   // 'structured-item'\n      break;\n    default:\n      parse_FunctionName();\n    }\n    eventHandler.endNonterminal(\"EQName\", e0);\n  }\n\n  function try_EQName()\n  {\n    lookahead1(241);                // EQName^Token | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' | 'and' |\n    switch (l1)\n    {\n    case 83:                        // 'attribute'\n      shiftT(83);                   // 'attribute'\n      break;\n    case 97:                        // 'comment'\n      shiftT(97);                   // 'comment'\n      break;\n    case 121:                       // 'document-node'\n      shiftT(121);                  // 'document-node'\n      break;\n    case 122:                       // 'element'\n      shiftT(122);                  // 'element'\n      break;\n    case 125:                       // 'empty-sequence'\n      shiftT(125);                  // 'empty-sequence'\n      break;\n    case 147:                       // 'function'\n      shiftT(147);                  // 'function'\n      break;\n    case 154:                       // 'if'\n      shiftT(154);                  // 'if'\n      break;\n    case 167:                       // 'item'\n      shiftT(167);                  // 'item'\n      break;\n    case 188:                       // 'namespace-node'\n      shiftT(188);                  // 'namespace-node'\n      break;\n    case 194:                       // 'node'\n      shiftT(194);                  // 'node'\n      break;\n    case 220:                       // 'processing-instruction'\n      shiftT(220);                  // 'processing-instruction'\n      break;\n    case 230:                       // 'schema-attribute'\n      shiftT(230);                  // 'schema-attribute'\n      break;\n    case 231:                       // 'schema-element'\n      shiftT(231);                  // 'schema-element'\n      break;\n    case 248:                       // 'switch'\n      shiftT(248);                  // 'switch'\n      break;\n    case 249:                       // 'text'\n      shiftT(249);                  // 'text'\n      break;\n    case 259:                       // 'typeswitch'\n      shiftT(259);                  // 'typeswitch'\n      break;\n    case 79:                        // 'array'\n      shiftT(79);                   // 'array'\n      break;\n    case 169:                       // 'json-item'\n      shiftT(169);                  // 'json-item'\n      break;\n    case 247:                       // 'structured-item'\n      shiftT(247);                  // 'structured-item'\n      break;\n    default:\n      try_FunctionName();\n    }\n  }\n\n  function parse_FunctionName()\n  {\n    eventHandler.startNonterminal(\"FunctionName\", e0);\n    switch (l1)\n    {\n    case 6:                         // EQName^Token\n      shift(6);                     // EQName^Token\n      break;\n    case 71:                        // 'after'\n      shift(71);                    // 'after'\n      break;\n    case 74:                        // 'ancestor'\n      shift(74);                    // 'ancestor'\n      break;\n    case 75:                        // 'ancestor-or-self'\n      shift(75);                    // 'ancestor-or-self'\n      break;\n    case 76:                        // 'and'\n      shift(76);                    // 'and'\n      break;\n    case 80:                        // 'as'\n      shift(80);                    // 'as'\n      break;\n    case 81:                        // 'ascending'\n      shift(81);                    // 'ascending'\n      break;\n    case 85:                        // 'before'\n      shift(85);                    // 'before'\n      break;\n    case 89:                        // 'case'\n      shift(89);                    // 'case'\n      break;\n    case 90:                        // 'cast'\n      shift(90);                    // 'cast'\n      break;\n    case 91:                        // 'castable'\n      shift(91);                    // 'castable'\n      break;\n    case 94:                        // 'child'\n      shift(94);                    // 'child'\n      break;\n    case 95:                        // 'collation'\n      shift(95);                    // 'collation'\n      break;\n    case 104:                       // 'copy'\n      shift(104);                   // 'copy'\n      break;\n    case 106:                       // 'count'\n      shift(106);                   // 'count'\n      break;\n    case 109:                       // 'declare'\n      shift(109);                   // 'declare'\n      break;\n    case 110:                       // 'default'\n      shift(110);                   // 'default'\n      break;\n    case 111:                       // 'delete'\n      shift(111);                   // 'delete'\n      break;\n    case 112:                       // 'descendant'\n      shift(112);                   // 'descendant'\n      break;\n    case 113:                       // 'descendant-or-self'\n      shift(113);                   // 'descendant-or-self'\n      break;\n    case 114:                       // 'descending'\n      shift(114);                   // 'descending'\n      break;\n    case 119:                       // 'div'\n      shift(119);                   // 'div'\n      break;\n    case 120:                       // 'document'\n      shift(120);                   // 'document'\n      break;\n    case 123:                       // 'else'\n      shift(123);                   // 'else'\n      break;\n    case 124:                       // 'empty'\n      shift(124);                   // 'empty'\n      break;\n    case 127:                       // 'end'\n      shift(127);                   // 'end'\n      break;\n    case 129:                       // 'eq'\n      shift(129);                   // 'eq'\n      break;\n    case 130:                       // 'every'\n      shift(130);                   // 'every'\n      break;\n    case 132:                       // 'except'\n      shift(132);                   // 'except'\n      break;\n    case 136:                       // 'first'\n      shift(136);                   // 'first'\n      break;\n    case 137:                       // 'following'\n      shift(137);                   // 'following'\n      break;\n    case 138:                       // 'following-sibling'\n      shift(138);                   // 'following-sibling'\n      break;\n    case 139:                       // 'for'\n      shift(139);                   // 'for'\n      break;\n    case 148:                       // 'ge'\n      shift(148);                   // 'ge'\n      break;\n    case 150:                       // 'group'\n      shift(150);                   // 'group'\n      break;\n    case 152:                       // 'gt'\n      shift(152);                   // 'gt'\n      break;\n    case 153:                       // 'idiv'\n      shift(153);                   // 'idiv'\n      break;\n    case 155:                       // 'import'\n      shift(155);                   // 'import'\n      break;\n    case 161:                       // 'insert'\n      shift(161);                   // 'insert'\n      break;\n    case 162:                       // 'instance'\n      shift(162);                   // 'instance'\n      break;\n    case 164:                       // 'intersect'\n      shift(164);                   // 'intersect'\n      break;\n    case 165:                       // 'into'\n      shift(165);                   // 'into'\n      break;\n    case 166:                       // 'is'\n      shift(166);                   // 'is'\n      break;\n    case 173:                       // 'last'\n      shift(173);                   // 'last'\n      break;\n    case 175:                       // 'le'\n      shift(175);                   // 'le'\n      break;\n    case 177:                       // 'let'\n      shift(177);                   // 'let'\n      break;\n    case 181:                       // 'lt'\n      shift(181);                   // 'lt'\n      break;\n    case 183:                       // 'mod'\n      shift(183);                   // 'mod'\n      break;\n    case 184:                       // 'modify'\n      shift(184);                   // 'modify'\n      break;\n    case 185:                       // 'module'\n      shift(185);                   // 'module'\n      break;\n    case 187:                       // 'namespace'\n      shift(187);                   // 'namespace'\n      break;\n    case 189:                       // 'ne'\n      shift(189);                   // 'ne'\n      break;\n    case 202:                       // 'only'\n      shift(202);                   // 'only'\n      break;\n    case 204:                       // 'or'\n      shift(204);                   // 'or'\n      break;\n    case 205:                       // 'order'\n      shift(205);                   // 'order'\n      break;\n    case 206:                       // 'ordered'\n      shift(206);                   // 'ordered'\n      break;\n    case 210:                       // 'parent'\n      shift(210);                   // 'parent'\n      break;\n    case 216:                       // 'preceding'\n      shift(216);                   // 'preceding'\n      break;\n    case 217:                       // 'preceding-sibling'\n      shift(217);                   // 'preceding-sibling'\n      break;\n    case 222:                       // 'rename'\n      shift(222);                   // 'rename'\n      break;\n    case 223:                       // 'replace'\n      shift(223);                   // 'replace'\n      break;\n    case 224:                       // 'return'\n      shift(224);                   // 'return'\n      break;\n    case 228:                       // 'satisfies'\n      shift(228);                   // 'satisfies'\n      break;\n    case 234:                       // 'self'\n      shift(234);                   // 'self'\n      break;\n    case 240:                       // 'some'\n      shift(240);                   // 'some'\n      break;\n    case 241:                       // 'stable'\n      shift(241);                   // 'stable'\n      break;\n    case 242:                       // 'start'\n      shift(242);                   // 'start'\n      break;\n    case 253:                       // 'to'\n      shift(253);                   // 'to'\n      break;\n    case 254:                       // 'treat'\n      shift(254);                   // 'treat'\n      break;\n    case 256:                       // 'try'\n      shift(256);                   // 'try'\n      break;\n    case 260:                       // 'union'\n      shift(260);                   // 'union'\n      break;\n    case 262:                       // 'unordered'\n      shift(262);                   // 'unordered'\n      break;\n    case 266:                       // 'validate'\n      shift(266);                   // 'validate'\n      break;\n    case 272:                       // 'where'\n      shift(272);                   // 'where'\n      break;\n    case 276:                       // 'with'\n      shift(276);                   // 'with'\n      break;\n    case 170:                       // 'jsoniq'\n      shift(170);                   // 'jsoniq'\n      break;\n    case 73:                        // 'allowing'\n      shift(73);                    // 'allowing'\n      break;\n    case 82:                        // 'at'\n      shift(82);                    // 'at'\n      break;\n    case 84:                        // 'base-uri'\n      shift(84);                    // 'base-uri'\n      break;\n    case 86:                        // 'boundary-space'\n      shift(86);                    // 'boundary-space'\n      break;\n    case 87:                        // 'break'\n      shift(87);                    // 'break'\n      break;\n    case 92:                        // 'catch'\n      shift(92);                    // 'catch'\n      break;\n    case 99:                        // 'construction'\n      shift(99);                    // 'construction'\n      break;\n    case 102:                       // 'context'\n      shift(102);                   // 'context'\n      break;\n    case 103:                       // 'continue'\n      shift(103);                   // 'continue'\n      break;\n    case 105:                       // 'copy-namespaces'\n      shift(105);                   // 'copy-namespaces'\n      break;\n    case 107:                       // 'decimal-format'\n      shift(107);                   // 'decimal-format'\n      break;\n    case 126:                       // 'encoding'\n      shift(126);                   // 'encoding'\n      break;\n    case 133:                       // 'exit'\n      shift(133);                   // 'exit'\n      break;\n    case 134:                       // 'external'\n      shift(134);                   // 'external'\n      break;\n    case 143:                       // 'ft-option'\n      shift(143);                   // 'ft-option'\n      break;\n    case 156:                       // 'in'\n      shift(156);                   // 'in'\n      break;\n    case 157:                       // 'index'\n      shift(157);                   // 'index'\n      break;\n    case 163:                       // 'integrity'\n      shift(163);                   // 'integrity'\n      break;\n    case 174:                       // 'lax'\n      shift(174);                   // 'lax'\n      break;\n    case 195:                       // 'nodes'\n      shift(195);                   // 'nodes'\n      break;\n    case 203:                       // 'option'\n      shift(203);                   // 'option'\n      break;\n    case 207:                       // 'ordering'\n      shift(207);                   // 'ordering'\n      break;\n    case 226:                       // 'revalidation'\n      shift(226);                   // 'revalidation'\n      break;\n    case 229:                       // 'schema'\n      shift(229);                   // 'schema'\n      break;\n    case 232:                       // 'score'\n      shift(232);                   // 'score'\n      break;\n    case 239:                       // 'sliding'\n      shift(239);                   // 'sliding'\n      break;\n    case 245:                       // 'strict'\n      shift(245);                   // 'strict'\n      break;\n    case 257:                       // 'tumbling'\n      shift(257);                   // 'tumbling'\n      break;\n    case 258:                       // 'type'\n      shift(258);                   // 'type'\n      break;\n    case 263:                       // 'updating'\n      shift(263);                   // 'updating'\n      break;\n    case 267:                       // 'value'\n      shift(267);                   // 'value'\n      break;\n    case 268:                       // 'variable'\n      shift(268);                   // 'variable'\n      break;\n    case 269:                       // 'version'\n      shift(269);                   // 'version'\n      break;\n    case 273:                       // 'while'\n      shift(273);                   // 'while'\n      break;\n    case 98:                        // 'constraint'\n      shift(98);                    // 'constraint'\n      break;\n    case 179:                       // 'loop'\n      shift(179);                   // 'loop'\n      break;\n    case 225:                       // 'returning'\n      shift(225);                   // 'returning'\n      break;\n    case 78:                        // 'append'\n      shift(78);                    // 'append'\n      break;\n    case 135:                       // 'false'\n      shift(135);                   // 'false'\n      break;\n    case 142:                       // 'from'\n      shift(142);                   // 'from'\n      break;\n    case 197:                       // 'null'\n      shift(197);                   // 'null'\n      break;\n    case 168:                       // 'json'\n      shift(168);                   // 'json'\n      break;\n    case 198:                       // 'object'\n      shift(198);                   // 'object'\n      break;\n    case 233:                       // 'select'\n      shift(233);                   // 'select'\n      break;\n    default:\n      shift(255);                   // 'true'\n    }\n    eventHandler.endNonterminal(\"FunctionName\", e0);\n  }\n\n  function try_FunctionName()\n  {\n    switch (l1)\n    {\n    case 6:                         // EQName^Token\n      shiftT(6);                    // EQName^Token\n      break;\n    case 71:                        // 'after'\n      shiftT(71);                   // 'after'\n      break;\n    case 74:                        // 'ancestor'\n      shiftT(74);                   // 'ancestor'\n      break;\n    case 75:                        // 'ancestor-or-self'\n      shiftT(75);                   // 'ancestor-or-self'\n      break;\n    case 76:                        // 'and'\n      shiftT(76);                   // 'and'\n      break;\n    case 80:                        // 'as'\n      shiftT(80);                   // 'as'\n      break;\n    case 81:                        // 'ascending'\n      shiftT(81);                   // 'ascending'\n      break;\n    case 85:                        // 'before'\n      shiftT(85);                   // 'before'\n      break;\n    case 89:                        // 'case'\n      shiftT(89);                   // 'case'\n      break;\n    case 90:                        // 'cast'\n      shiftT(90);                   // 'cast'\n      break;\n    case 91:                        // 'castable'\n      shiftT(91);                   // 'castable'\n      break;\n    case 94:                        // 'child'\n      shiftT(94);                   // 'child'\n      break;\n    case 95:                        // 'collation'\n      shiftT(95);                   // 'collation'\n      break;\n    case 104:                       // 'copy'\n      shiftT(104);                  // 'copy'\n      break;\n    case 106:                       // 'count'\n      shiftT(106);                  // 'count'\n      break;\n    case 109:                       // 'declare'\n      shiftT(109);                  // 'declare'\n      break;\n    case 110:                       // 'default'\n      shiftT(110);                  // 'default'\n      break;\n    case 111:                       // 'delete'\n      shiftT(111);                  // 'delete'\n      break;\n    case 112:                       // 'descendant'\n      shiftT(112);                  // 'descendant'\n      break;\n    case 113:                       // 'descendant-or-self'\n      shiftT(113);                  // 'descendant-or-self'\n      break;\n    case 114:                       // 'descending'\n      shiftT(114);                  // 'descending'\n      break;\n    case 119:                       // 'div'\n      shiftT(119);                  // 'div'\n      break;\n    case 120:                       // 'document'\n      shiftT(120);                  // 'document'\n      break;\n    case 123:                       // 'else'\n      shiftT(123);                  // 'else'\n      break;\n    case 124:                       // 'empty'\n      shiftT(124);                  // 'empty'\n      break;\n    case 127:                       // 'end'\n      shiftT(127);                  // 'end'\n      break;\n    case 129:                       // 'eq'\n      shiftT(129);                  // 'eq'\n      break;\n    case 130:                       // 'every'\n      shiftT(130);                  // 'every'\n      break;\n    case 132:                       // 'except'\n      shiftT(132);                  // 'except'\n      break;\n    case 136:                       // 'first'\n      shiftT(136);                  // 'first'\n      break;\n    case 137:                       // 'following'\n      shiftT(137);                  // 'following'\n      break;\n    case 138:                       // 'following-sibling'\n      shiftT(138);                  // 'following-sibling'\n      break;\n    case 139:                       // 'for'\n      shiftT(139);                  // 'for'\n      break;\n    case 148:                       // 'ge'\n      shiftT(148);                  // 'ge'\n      break;\n    case 150:                       // 'group'\n      shiftT(150);                  // 'group'\n      break;\n    case 152:                       // 'gt'\n      shiftT(152);                  // 'gt'\n      break;\n    case 153:                       // 'idiv'\n      shiftT(153);                  // 'idiv'\n      break;\n    case 155:                       // 'import'\n      shiftT(155);                  // 'import'\n      break;\n    case 161:                       // 'insert'\n      shiftT(161);                  // 'insert'\n      break;\n    case 162:                       // 'instance'\n      shiftT(162);                  // 'instance'\n      break;\n    case 164:                       // 'intersect'\n      shiftT(164);                  // 'intersect'\n      break;\n    case 165:                       // 'into'\n      shiftT(165);                  // 'into'\n      break;\n    case 166:                       // 'is'\n      shiftT(166);                  // 'is'\n      break;\n    case 173:                       // 'last'\n      shiftT(173);                  // 'last'\n      break;\n    case 175:                       // 'le'\n      shiftT(175);                  // 'le'\n      break;\n    case 177:                       // 'let'\n      shiftT(177);                  // 'let'\n      break;\n    case 181:                       // 'lt'\n      shiftT(181);                  // 'lt'\n      break;\n    case 183:                       // 'mod'\n      shiftT(183);                  // 'mod'\n      break;\n    case 184:                       // 'modify'\n      shiftT(184);                  // 'modify'\n      break;\n    case 185:                       // 'module'\n      shiftT(185);                  // 'module'\n      break;\n    case 187:                       // 'namespace'\n      shiftT(187);                  // 'namespace'\n      break;\n    case 189:                       // 'ne'\n      shiftT(189);                  // 'ne'\n      break;\n    case 202:                       // 'only'\n      shiftT(202);                  // 'only'\n      break;\n    case 204:                       // 'or'\n      shiftT(204);                  // 'or'\n      break;\n    case 205:                       // 'order'\n      shiftT(205);                  // 'order'\n      break;\n    case 206:                       // 'ordered'\n      shiftT(206);                  // 'ordered'\n      break;\n    case 210:                       // 'parent'\n      shiftT(210);                  // 'parent'\n      break;\n    case 216:                       // 'preceding'\n      shiftT(216);                  // 'preceding'\n      break;\n    case 217:                       // 'preceding-sibling'\n      shiftT(217);                  // 'preceding-sibling'\n      break;\n    case 222:                       // 'rename'\n      shiftT(222);                  // 'rename'\n      break;\n    case 223:                       // 'replace'\n      shiftT(223);                  // 'replace'\n      break;\n    case 224:                       // 'return'\n      shiftT(224);                  // 'return'\n      break;\n    case 228:                       // 'satisfies'\n      shiftT(228);                  // 'satisfies'\n      break;\n    case 234:                       // 'self'\n      shiftT(234);                  // 'self'\n      break;\n    case 240:                       // 'some'\n      shiftT(240);                  // 'some'\n      break;\n    case 241:                       // 'stable'\n      shiftT(241);                  // 'stable'\n      break;\n    case 242:                       // 'start'\n      shiftT(242);                  // 'start'\n      break;\n    case 253:                       // 'to'\n      shiftT(253);                  // 'to'\n      break;\n    case 254:                       // 'treat'\n      shiftT(254);                  // 'treat'\n      break;\n    case 256:                       // 'try'\n      shiftT(256);                  // 'try'\n      break;\n    case 260:                       // 'union'\n      shiftT(260);                  // 'union'\n      break;\n    case 262:                       // 'unordered'\n      shiftT(262);                  // 'unordered'\n      break;\n    case 266:                       // 'validate'\n      shiftT(266);                  // 'validate'\n      break;\n    case 272:                       // 'where'\n      shiftT(272);                  // 'where'\n      break;\n    case 276:                       // 'with'\n      shiftT(276);                  // 'with'\n      break;\n    case 170:                       // 'jsoniq'\n      shiftT(170);                  // 'jsoniq'\n      break;\n    case 73:                        // 'allowing'\n      shiftT(73);                   // 'allowing'\n      break;\n    case 82:                        // 'at'\n      shiftT(82);                   // 'at'\n      break;\n    case 84:                        // 'base-uri'\n      shiftT(84);                   // 'base-uri'\n      break;\n    case 86:                        // 'boundary-space'\n      shiftT(86);                   // 'boundary-space'\n      break;\n    case 87:                        // 'break'\n      shiftT(87);                   // 'break'\n      break;\n    case 92:                        // 'catch'\n      shiftT(92);                   // 'catch'\n      break;\n    case 99:                        // 'construction'\n      shiftT(99);                   // 'construction'\n      break;\n    case 102:                       // 'context'\n      shiftT(102);                  // 'context'\n      break;\n    case 103:                       // 'continue'\n      shiftT(103);                  // 'continue'\n      break;\n    case 105:                       // 'copy-namespaces'\n      shiftT(105);                  // 'copy-namespaces'\n      break;\n    case 107:                       // 'decimal-format'\n      shiftT(107);                  // 'decimal-format'\n      break;\n    case 126:                       // 'encoding'\n      shiftT(126);                  // 'encoding'\n      break;\n    case 133:                       // 'exit'\n      shiftT(133);                  // 'exit'\n      break;\n    case 134:                       // 'external'\n      shiftT(134);                  // 'external'\n      break;\n    case 143:                       // 'ft-option'\n      shiftT(143);                  // 'ft-option'\n      break;\n    case 156:                       // 'in'\n      shiftT(156);                  // 'in'\n      break;\n    case 157:                       // 'index'\n      shiftT(157);                  // 'index'\n      break;\n    case 163:                       // 'integrity'\n      shiftT(163);                  // 'integrity'\n      break;\n    case 174:                       // 'lax'\n      shiftT(174);                  // 'lax'\n      break;\n    case 195:                       // 'nodes'\n      shiftT(195);                  // 'nodes'\n      break;\n    case 203:                       // 'option'\n      shiftT(203);                  // 'option'\n      break;\n    case 207:                       // 'ordering'\n      shiftT(207);                  // 'ordering'\n      break;\n    case 226:                       // 'revalidation'\n      shiftT(226);                  // 'revalidation'\n      break;\n    case 229:                       // 'schema'\n      shiftT(229);                  // 'schema'\n      break;\n    case 232:                       // 'score'\n      shiftT(232);                  // 'score'\n      break;\n    case 239:                       // 'sliding'\n      shiftT(239);                  // 'sliding'\n      break;\n    case 245:                       // 'strict'\n      shiftT(245);                  // 'strict'\n      break;\n    case 257:                       // 'tumbling'\n      shiftT(257);                  // 'tumbling'\n      break;\n    case 258:                       // 'type'\n      shiftT(258);                  // 'type'\n      break;\n    case 263:                       // 'updating'\n      shiftT(263);                  // 'updating'\n      break;\n    case 267:                       // 'value'\n      shiftT(267);                  // 'value'\n      break;\n    case 268:                       // 'variable'\n      shiftT(268);                  // 'variable'\n      break;\n    case 269:                       // 'version'\n      shiftT(269);                  // 'version'\n      break;\n    case 273:                       // 'while'\n      shiftT(273);                  // 'while'\n      break;\n    case 98:                        // 'constraint'\n      shiftT(98);                   // 'constraint'\n      break;\n    case 179:                       // 'loop'\n      shiftT(179);                  // 'loop'\n      break;\n    case 225:                       // 'returning'\n      shiftT(225);                  // 'returning'\n      break;\n    case 78:                        // 'append'\n      shiftT(78);                   // 'append'\n      break;\n    case 135:                       // 'false'\n      shiftT(135);                  // 'false'\n      break;\n    case 142:                       // 'from'\n      shiftT(142);                  // 'from'\n      break;\n    case 197:                       // 'null'\n      shiftT(197);                  // 'null'\n      break;\n    case 168:                       // 'json'\n      shiftT(168);                  // 'json'\n      break;\n    case 198:                       // 'object'\n      shiftT(198);                  // 'object'\n      break;\n    case 233:                       // 'select'\n      shiftT(233);                  // 'select'\n      break;\n    default:\n      shiftT(255);                  // 'true'\n    }\n  }\n\n  function parse_NCName()\n  {\n    eventHandler.startNonterminal(\"NCName\", e0);\n    switch (l1)\n    {\n    case 19:                        // NCName^Token\n      shift(19);                    // NCName^Token\n      break;\n    case 71:                        // 'after'\n      shift(71);                    // 'after'\n      break;\n    case 76:                        // 'and'\n      shift(76);                    // 'and'\n      break;\n    case 80:                        // 'as'\n      shift(80);                    // 'as'\n      break;\n    case 81:                        // 'ascending'\n      shift(81);                    // 'ascending'\n      break;\n    case 85:                        // 'before'\n      shift(85);                    // 'before'\n      break;\n    case 89:                        // 'case'\n      shift(89);                    // 'case'\n      break;\n    case 90:                        // 'cast'\n      shift(90);                    // 'cast'\n      break;\n    case 91:                        // 'castable'\n      shift(91);                    // 'castable'\n      break;\n    case 95:                        // 'collation'\n      shift(95);                    // 'collation'\n      break;\n    case 106:                       // 'count'\n      shift(106);                   // 'count'\n      break;\n    case 110:                       // 'default'\n      shift(110);                   // 'default'\n      break;\n    case 114:                       // 'descending'\n      shift(114);                   // 'descending'\n      break;\n    case 119:                       // 'div'\n      shift(119);                   // 'div'\n      break;\n    case 123:                       // 'else'\n      shift(123);                   // 'else'\n      break;\n    case 124:                       // 'empty'\n      shift(124);                   // 'empty'\n      break;\n    case 127:                       // 'end'\n      shift(127);                   // 'end'\n      break;\n    case 129:                       // 'eq'\n      shift(129);                   // 'eq'\n      break;\n    case 132:                       // 'except'\n      shift(132);                   // 'except'\n      break;\n    case 139:                       // 'for'\n      shift(139);                   // 'for'\n      break;\n    case 148:                       // 'ge'\n      shift(148);                   // 'ge'\n      break;\n    case 150:                       // 'group'\n      shift(150);                   // 'group'\n      break;\n    case 152:                       // 'gt'\n      shift(152);                   // 'gt'\n      break;\n    case 153:                       // 'idiv'\n      shift(153);                   // 'idiv'\n      break;\n    case 162:                       // 'instance'\n      shift(162);                   // 'instance'\n      break;\n    case 164:                       // 'intersect'\n      shift(164);                   // 'intersect'\n      break;\n    case 165:                       // 'into'\n      shift(165);                   // 'into'\n      break;\n    case 166:                       // 'is'\n      shift(166);                   // 'is'\n      break;\n    case 175:                       // 'le'\n      shift(175);                   // 'le'\n      break;\n    case 177:                       // 'let'\n      shift(177);                   // 'let'\n      break;\n    case 181:                       // 'lt'\n      shift(181);                   // 'lt'\n      break;\n    case 183:                       // 'mod'\n      shift(183);                   // 'mod'\n      break;\n    case 184:                       // 'modify'\n      shift(184);                   // 'modify'\n      break;\n    case 189:                       // 'ne'\n      shift(189);                   // 'ne'\n      break;\n    case 202:                       // 'only'\n      shift(202);                   // 'only'\n      break;\n    case 204:                       // 'or'\n      shift(204);                   // 'or'\n      break;\n    case 205:                       // 'order'\n      shift(205);                   // 'order'\n      break;\n    case 224:                       // 'return'\n      shift(224);                   // 'return'\n      break;\n    case 228:                       // 'satisfies'\n      shift(228);                   // 'satisfies'\n      break;\n    case 241:                       // 'stable'\n      shift(241);                   // 'stable'\n      break;\n    case 242:                       // 'start'\n      shift(242);                   // 'start'\n      break;\n    case 253:                       // 'to'\n      shift(253);                   // 'to'\n      break;\n    case 254:                       // 'treat'\n      shift(254);                   // 'treat'\n      break;\n    case 260:                       // 'union'\n      shift(260);                   // 'union'\n      break;\n    case 272:                       // 'where'\n      shift(272);                   // 'where'\n      break;\n    case 276:                       // 'with'\n      shift(276);                   // 'with'\n      break;\n    case 74:                        // 'ancestor'\n      shift(74);                    // 'ancestor'\n      break;\n    case 75:                        // 'ancestor-or-self'\n      shift(75);                    // 'ancestor-or-self'\n      break;\n    case 83:                        // 'attribute'\n      shift(83);                    // 'attribute'\n      break;\n    case 94:                        // 'child'\n      shift(94);                    // 'child'\n      break;\n    case 97:                        // 'comment'\n      shift(97);                    // 'comment'\n      break;\n    case 104:                       // 'copy'\n      shift(104);                   // 'copy'\n      break;\n    case 109:                       // 'declare'\n      shift(109);                   // 'declare'\n      break;\n    case 111:                       // 'delete'\n      shift(111);                   // 'delete'\n      break;\n    case 112:                       // 'descendant'\n      shift(112);                   // 'descendant'\n      break;\n    case 113:                       // 'descendant-or-self'\n      shift(113);                   // 'descendant-or-self'\n      break;\n    case 120:                       // 'document'\n      shift(120);                   // 'document'\n      break;\n    case 121:                       // 'document-node'\n      shift(121);                   // 'document-node'\n      break;\n    case 122:                       // 'element'\n      shift(122);                   // 'element'\n      break;\n    case 125:                       // 'empty-sequence'\n      shift(125);                   // 'empty-sequence'\n      break;\n    case 130:                       // 'every'\n      shift(130);                   // 'every'\n      break;\n    case 136:                       // 'first'\n      shift(136);                   // 'first'\n      break;\n    case 137:                       // 'following'\n      shift(137);                   // 'following'\n      break;\n    case 138:                       // 'following-sibling'\n      shift(138);                   // 'following-sibling'\n      break;\n    case 147:                       // 'function'\n      shift(147);                   // 'function'\n      break;\n    case 154:                       // 'if'\n      shift(154);                   // 'if'\n      break;\n    case 155:                       // 'import'\n      shift(155);                   // 'import'\n      break;\n    case 161:                       // 'insert'\n      shift(161);                   // 'insert'\n      break;\n    case 167:                       // 'item'\n      shift(167);                   // 'item'\n      break;\n    case 173:                       // 'last'\n      shift(173);                   // 'last'\n      break;\n    case 185:                       // 'module'\n      shift(185);                   // 'module'\n      break;\n    case 187:                       // 'namespace'\n      shift(187);                   // 'namespace'\n      break;\n    case 188:                       // 'namespace-node'\n      shift(188);                   // 'namespace-node'\n      break;\n    case 194:                       // 'node'\n      shift(194);                   // 'node'\n      break;\n    case 206:                       // 'ordered'\n      shift(206);                   // 'ordered'\n      break;\n    case 210:                       // 'parent'\n      shift(210);                   // 'parent'\n      break;\n    case 216:                       // 'preceding'\n      shift(216);                   // 'preceding'\n      break;\n    case 217:                       // 'preceding-sibling'\n      shift(217);                   // 'preceding-sibling'\n      break;\n    case 220:                       // 'processing-instruction'\n      shift(220);                   // 'processing-instruction'\n      break;\n    case 222:                       // 'rename'\n      shift(222);                   // 'rename'\n      break;\n    case 223:                       // 'replace'\n      shift(223);                   // 'replace'\n      break;\n    case 230:                       // 'schema-attribute'\n      shift(230);                   // 'schema-attribute'\n      break;\n    case 231:                       // 'schema-element'\n      shift(231);                   // 'schema-element'\n      break;\n    case 234:                       // 'self'\n      shift(234);                   // 'self'\n      break;\n    case 240:                       // 'some'\n      shift(240);                   // 'some'\n      break;\n    case 248:                       // 'switch'\n      shift(248);                   // 'switch'\n      break;\n    case 249:                       // 'text'\n      shift(249);                   // 'text'\n      break;\n    case 256:                       // 'try'\n      shift(256);                   // 'try'\n      break;\n    case 259:                       // 'typeswitch'\n      shift(259);                   // 'typeswitch'\n      break;\n    case 262:                       // 'unordered'\n      shift(262);                   // 'unordered'\n      break;\n    case 266:                       // 'validate'\n      shift(266);                   // 'validate'\n      break;\n    case 268:                       // 'variable'\n      shift(268);                   // 'variable'\n      break;\n    case 170:                       // 'jsoniq'\n      shift(170);                   // 'jsoniq'\n      break;\n    case 73:                        // 'allowing'\n      shift(73);                    // 'allowing'\n      break;\n    case 82:                        // 'at'\n      shift(82);                    // 'at'\n      break;\n    case 84:                        // 'base-uri'\n      shift(84);                    // 'base-uri'\n      break;\n    case 86:                        // 'boundary-space'\n      shift(86);                    // 'boundary-space'\n      break;\n    case 87:                        // 'break'\n      shift(87);                    // 'break'\n      break;\n    case 92:                        // 'catch'\n      shift(92);                    // 'catch'\n      break;\n    case 99:                        // 'construction'\n      shift(99);                    // 'construction'\n      break;\n    case 102:                       // 'context'\n      shift(102);                   // 'context'\n      break;\n    case 103:                       // 'continue'\n      shift(103);                   // 'continue'\n      break;\n    case 105:                       // 'copy-namespaces'\n      shift(105);                   // 'copy-namespaces'\n      break;\n    case 107:                       // 'decimal-format'\n      shift(107);                   // 'decimal-format'\n      break;\n    case 126:                       // 'encoding'\n      shift(126);                   // 'encoding'\n      break;\n    case 133:                       // 'exit'\n      shift(133);                   // 'exit'\n      break;\n    case 134:                       // 'external'\n      shift(134);                   // 'external'\n      break;\n    case 143:                       // 'ft-option'\n      shift(143);                   // 'ft-option'\n      break;\n    case 156:                       // 'in'\n      shift(156);                   // 'in'\n      break;\n    case 157:                       // 'index'\n      shift(157);                   // 'index'\n      break;\n    case 163:                       // 'integrity'\n      shift(163);                   // 'integrity'\n      break;\n    case 174:                       // 'lax'\n      shift(174);                   // 'lax'\n      break;\n    case 195:                       // 'nodes'\n      shift(195);                   // 'nodes'\n      break;\n    case 203:                       // 'option'\n      shift(203);                   // 'option'\n      break;\n    case 207:                       // 'ordering'\n      shift(207);                   // 'ordering'\n      break;\n    case 226:                       // 'revalidation'\n      shift(226);                   // 'revalidation'\n      break;\n    case 229:                       // 'schema'\n      shift(229);                   // 'schema'\n      break;\n    case 232:                       // 'score'\n      shift(232);                   // 'score'\n      break;\n    case 239:                       // 'sliding'\n      shift(239);                   // 'sliding'\n      break;\n    case 245:                       // 'strict'\n      shift(245);                   // 'strict'\n      break;\n    case 257:                       // 'tumbling'\n      shift(257);                   // 'tumbling'\n      break;\n    case 258:                       // 'type'\n      shift(258);                   // 'type'\n      break;\n    case 263:                       // 'updating'\n      shift(263);                   // 'updating'\n      break;\n    case 267:                       // 'value'\n      shift(267);                   // 'value'\n      break;\n    case 269:                       // 'version'\n      shift(269);                   // 'version'\n      break;\n    case 273:                       // 'while'\n      shift(273);                   // 'while'\n      break;\n    case 98:                        // 'constraint'\n      shift(98);                    // 'constraint'\n      break;\n    case 179:                       // 'loop'\n      shift(179);                   // 'loop'\n      break;\n    case 225:                       // 'returning'\n      shift(225);                   // 'returning'\n      break;\n    case 78:                        // 'append'\n      shift(78);                    // 'append'\n      break;\n    case 135:                       // 'false'\n      shift(135);                   // 'false'\n      break;\n    case 142:                       // 'from'\n      shift(142);                   // 'from'\n      break;\n    case 197:                       // 'null'\n      shift(197);                   // 'null'\n      break;\n    case 168:                       // 'json'\n      shift(168);                   // 'json'\n      break;\n    case 198:                       // 'object'\n      shift(198);                   // 'object'\n      break;\n    case 233:                       // 'select'\n      shift(233);                   // 'select'\n      break;\n    default:\n      shift(255);                   // 'true'\n    }\n    eventHandler.endNonterminal(\"NCName\", e0);\n  }\n\n  function try_NCName()\n  {\n    switch (l1)\n    {\n    case 19:                        // NCName^Token\n      shiftT(19);                   // NCName^Token\n      break;\n    case 71:                        // 'after'\n      shiftT(71);                   // 'after'\n      break;\n    case 76:                        // 'and'\n      shiftT(76);                   // 'and'\n      break;\n    case 80:                        // 'as'\n      shiftT(80);                   // 'as'\n      break;\n    case 81:                        // 'ascending'\n      shiftT(81);                   // 'ascending'\n      break;\n    case 85:                        // 'before'\n      shiftT(85);                   // 'before'\n      break;\n    case 89:                        // 'case'\n      shiftT(89);                   // 'case'\n      break;\n    case 90:                        // 'cast'\n      shiftT(90);                   // 'cast'\n      break;\n    case 91:                        // 'castable'\n      shiftT(91);                   // 'castable'\n      break;\n    case 95:                        // 'collation'\n      shiftT(95);                   // 'collation'\n      break;\n    case 106:                       // 'count'\n      shiftT(106);                  // 'count'\n      break;\n    case 110:                       // 'default'\n      shiftT(110);                  // 'default'\n      break;\n    case 114:                       // 'descending'\n      shiftT(114);                  // 'descending'\n      break;\n    case 119:                       // 'div'\n      shiftT(119);                  // 'div'\n      break;\n    case 123:                       // 'else'\n      shiftT(123);                  // 'else'\n      break;\n    case 124:                       // 'empty'\n      shiftT(124);                  // 'empty'\n      break;\n    case 127:                       // 'end'\n      shiftT(127);                  // 'end'\n      break;\n    case 129:                       // 'eq'\n      shiftT(129);                  // 'eq'\n      break;\n    case 132:                       // 'except'\n      shiftT(132);                  // 'except'\n      break;\n    case 139:                       // 'for'\n      shiftT(139);                  // 'for'\n      break;\n    case 148:                       // 'ge'\n      shiftT(148);                  // 'ge'\n      break;\n    case 150:                       // 'group'\n      shiftT(150);                  // 'group'\n      break;\n    case 152:                       // 'gt'\n      shiftT(152);                  // 'gt'\n      break;\n    case 153:                       // 'idiv'\n      shiftT(153);                  // 'idiv'\n      break;\n    case 162:                       // 'instance'\n      shiftT(162);                  // 'instance'\n      break;\n    case 164:                       // 'intersect'\n      shiftT(164);                  // 'intersect'\n      break;\n    case 165:                       // 'into'\n      shiftT(165);                  // 'into'\n      break;\n    case 166:                       // 'is'\n      shiftT(166);                  // 'is'\n      break;\n    case 175:                       // 'le'\n      shiftT(175);                  // 'le'\n      break;\n    case 177:                       // 'let'\n      shiftT(177);                  // 'let'\n      break;\n    case 181:                       // 'lt'\n      shiftT(181);                  // 'lt'\n      break;\n    case 183:                       // 'mod'\n      shiftT(183);                  // 'mod'\n      break;\n    case 184:                       // 'modify'\n      shiftT(184);                  // 'modify'\n      break;\n    case 189:                       // 'ne'\n      shiftT(189);                  // 'ne'\n      break;\n    case 202:                       // 'only'\n      shiftT(202);                  // 'only'\n      break;\n    case 204:                       // 'or'\n      shiftT(204);                  // 'or'\n      break;\n    case 205:                       // 'order'\n      shiftT(205);                  // 'order'\n      break;\n    case 224:                       // 'return'\n      shiftT(224);                  // 'return'\n      break;\n    case 228:                       // 'satisfies'\n      shiftT(228);                  // 'satisfies'\n      break;\n    case 241:                       // 'stable'\n      shiftT(241);                  // 'stable'\n      break;\n    case 242:                       // 'start'\n      shiftT(242);                  // 'start'\n      break;\n    case 253:                       // 'to'\n      shiftT(253);                  // 'to'\n      break;\n    case 254:                       // 'treat'\n      shiftT(254);                  // 'treat'\n      break;\n    case 260:                       // 'union'\n      shiftT(260);                  // 'union'\n      break;\n    case 272:                       // 'where'\n      shiftT(272);                  // 'where'\n      break;\n    case 276:                       // 'with'\n      shiftT(276);                  // 'with'\n      break;\n    case 74:                        // 'ancestor'\n      shiftT(74);                   // 'ancestor'\n      break;\n    case 75:                        // 'ancestor-or-self'\n      shiftT(75);                   // 'ancestor-or-self'\n      break;\n    case 83:                        // 'attribute'\n      shiftT(83);                   // 'attribute'\n      break;\n    case 94:                        // 'child'\n      shiftT(94);                   // 'child'\n      break;\n    case 97:                        // 'comment'\n      shiftT(97);                   // 'comment'\n      break;\n    case 104:                       // 'copy'\n      shiftT(104);                  // 'copy'\n      break;\n    case 109:                       // 'declare'\n      shiftT(109);                  // 'declare'\n      break;\n    case 111:                       // 'delete'\n      shiftT(111);                  // 'delete'\n      break;\n    case 112:                       // 'descendant'\n      shiftT(112);                  // 'descendant'\n      break;\n    case 113:                       // 'descendant-or-self'\n      shiftT(113);                  // 'descendant-or-self'\n      break;\n    case 120:                       // 'document'\n      shiftT(120);                  // 'document'\n      break;\n    case 121:                       // 'document-node'\n      shiftT(121);                  // 'document-node'\n      break;\n    case 122:                       // 'element'\n      shiftT(122);                  // 'element'\n      break;\n    case 125:                       // 'empty-sequence'\n      shiftT(125);                  // 'empty-sequence'\n      break;\n    case 130:                       // 'every'\n      shiftT(130);                  // 'every'\n      break;\n    case 136:                       // 'first'\n      shiftT(136);                  // 'first'\n      break;\n    case 137:                       // 'following'\n      shiftT(137);                  // 'following'\n      break;\n    case 138:                       // 'following-sibling'\n      shiftT(138);                  // 'following-sibling'\n      break;\n    case 147:                       // 'function'\n      shiftT(147);                  // 'function'\n      break;\n    case 154:                       // 'if'\n      shiftT(154);                  // 'if'\n      break;\n    case 155:                       // 'import'\n      shiftT(155);                  // 'import'\n      break;\n    case 161:                       // 'insert'\n      shiftT(161);                  // 'insert'\n      break;\n    case 167:                       // 'item'\n      shiftT(167);                  // 'item'\n      break;\n    case 173:                       // 'last'\n      shiftT(173);                  // 'last'\n      break;\n    case 185:                       // 'module'\n      shiftT(185);                  // 'module'\n      break;\n    case 187:                       // 'namespace'\n      shiftT(187);                  // 'namespace'\n      break;\n    case 188:                       // 'namespace-node'\n      shiftT(188);                  // 'namespace-node'\n      break;\n    case 194:                       // 'node'\n      shiftT(194);                  // 'node'\n      break;\n    case 206:                       // 'ordered'\n      shiftT(206);                  // 'ordered'\n      break;\n    case 210:                       // 'parent'\n      shiftT(210);                  // 'parent'\n      break;\n    case 216:                       // 'preceding'\n      shiftT(216);                  // 'preceding'\n      break;\n    case 217:                       // 'preceding-sibling'\n      shiftT(217);                  // 'preceding-sibling'\n      break;\n    case 220:                       // 'processing-instruction'\n      shiftT(220);                  // 'processing-instruction'\n      break;\n    case 222:                       // 'rename'\n      shiftT(222);                  // 'rename'\n      break;\n    case 223:                       // 'replace'\n      shiftT(223);                  // 'replace'\n      break;\n    case 230:                       // 'schema-attribute'\n      shiftT(230);                  // 'schema-attribute'\n      break;\n    case 231:                       // 'schema-element'\n      shiftT(231);                  // 'schema-element'\n      break;\n    case 234:                       // 'self'\n      shiftT(234);                  // 'self'\n      break;\n    case 240:                       // 'some'\n      shiftT(240);                  // 'some'\n      break;\n    case 248:                       // 'switch'\n      shiftT(248);                  // 'switch'\n      break;\n    case 249:                       // 'text'\n      shiftT(249);                  // 'text'\n      break;\n    case 256:                       // 'try'\n      shiftT(256);                  // 'try'\n      break;\n    case 259:                       // 'typeswitch'\n      shiftT(259);                  // 'typeswitch'\n      break;\n    case 262:                       // 'unordered'\n      shiftT(262);                  // 'unordered'\n      break;\n    case 266:                       // 'validate'\n      shiftT(266);                  // 'validate'\n      break;\n    case 268:                       // 'variable'\n      shiftT(268);                  // 'variable'\n      break;\n    case 170:                       // 'jsoniq'\n      shiftT(170);                  // 'jsoniq'\n      break;\n    case 73:                        // 'allowing'\n      shiftT(73);                   // 'allowing'\n      break;\n    case 82:                        // 'at'\n      shiftT(82);                   // 'at'\n      break;\n    case 84:                        // 'base-uri'\n      shiftT(84);                   // 'base-uri'\n      break;\n    case 86:                        // 'boundary-space'\n      shiftT(86);                   // 'boundary-space'\n      break;\n    case 87:                        // 'break'\n      shiftT(87);                   // 'break'\n      break;\n    case 92:                        // 'catch'\n      shiftT(92);                   // 'catch'\n      break;\n    case 99:                        // 'construction'\n      shiftT(99);                   // 'construction'\n      break;\n    case 102:                       // 'context'\n      shiftT(102);                  // 'context'\n      break;\n    case 103:                       // 'continue'\n      shiftT(103);                  // 'continue'\n      break;\n    case 105:                       // 'copy-namespaces'\n      shiftT(105);                  // 'copy-namespaces'\n      break;\n    case 107:                       // 'decimal-format'\n      shiftT(107);                  // 'decimal-format'\n      break;\n    case 126:                       // 'encoding'\n      shiftT(126);                  // 'encoding'\n      break;\n    case 133:                       // 'exit'\n      shiftT(133);                  // 'exit'\n      break;\n    case 134:                       // 'external'\n      shiftT(134);                  // 'external'\n      break;\n    case 143:                       // 'ft-option'\n      shiftT(143);                  // 'ft-option'\n      break;\n    case 156:                       // 'in'\n      shiftT(156);                  // 'in'\n      break;\n    case 157:                       // 'index'\n      shiftT(157);                  // 'index'\n      break;\n    case 163:                       // 'integrity'\n      shiftT(163);                  // 'integrity'\n      break;\n    case 174:                       // 'lax'\n      shiftT(174);                  // 'lax'\n      break;\n    case 195:                       // 'nodes'\n      shiftT(195);                  // 'nodes'\n      break;\n    case 203:                       // 'option'\n      shiftT(203);                  // 'option'\n      break;\n    case 207:                       // 'ordering'\n      shiftT(207);                  // 'ordering'\n      break;\n    case 226:                       // 'revalidation'\n      shiftT(226);                  // 'revalidation'\n      break;\n    case 229:                       // 'schema'\n      shiftT(229);                  // 'schema'\n      break;\n    case 232:                       // 'score'\n      shiftT(232);                  // 'score'\n      break;\n    case 239:                       // 'sliding'\n      shiftT(239);                  // 'sliding'\n      break;\n    case 245:                       // 'strict'\n      shiftT(245);                  // 'strict'\n      break;\n    case 257:                       // 'tumbling'\n      shiftT(257);                  // 'tumbling'\n      break;\n    case 258:                       // 'type'\n      shiftT(258);                  // 'type'\n      break;\n    case 263:                       // 'updating'\n      shiftT(263);                  // 'updating'\n      break;\n    case 267:                       // 'value'\n      shiftT(267);                  // 'value'\n      break;\n    case 269:                       // 'version'\n      shiftT(269);                  // 'version'\n      break;\n    case 273:                       // 'while'\n      shiftT(273);                  // 'while'\n      break;\n    case 98:                        // 'constraint'\n      shiftT(98);                   // 'constraint'\n      break;\n    case 179:                       // 'loop'\n      shiftT(179);                  // 'loop'\n      break;\n    case 225:                       // 'returning'\n      shiftT(225);                  // 'returning'\n      break;\n    case 78:                        // 'append'\n      shiftT(78);                   // 'append'\n      break;\n    case 135:                       // 'false'\n      shiftT(135);                  // 'false'\n      break;\n    case 142:                       // 'from'\n      shiftT(142);                  // 'from'\n      break;\n    case 197:                       // 'null'\n      shiftT(197);                  // 'null'\n      break;\n    case 168:                       // 'json'\n      shiftT(168);                  // 'json'\n      break;\n    case 198:                       // 'object'\n      shiftT(198);                  // 'object'\n      break;\n    case 233:                       // 'select'\n      shiftT(233);                  // 'select'\n      break;\n    default:\n      shiftT(255);                  // 'true'\n    }\n  }\n\n  function parse_MainModule()\n  {\n    eventHandler.startNonterminal(\"MainModule\", e0);\n    parse_Prolog();\n    whitespace();\n    parse_Program();\n    eventHandler.endNonterminal(\"MainModule\", e0);\n  }\n\n  function parse_Program()\n  {\n    eventHandler.startNonterminal(\"Program\", e0);\n    parse_StatementsAndOptionalExpr();\n    eventHandler.endNonterminal(\"Program\", e0);\n  }\n\n  function parse_Statements()\n  {\n    eventHandler.startNonterminal(\"Statements\", e0);\n    for (;;)\n    {\n      lookahead1W(284);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      switch (l1)\n      {\n      case 35:                      // '('\n        lookahead2W(270);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      case 36:                      // '(#'\n        lookahead2(243);            // EQName^Token | S | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' |\n        break;\n      case 47:                      // '/'\n        lookahead2W(286);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      case 48:                      // '//'\n        lookahead2W(260);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      case 55:                      // '<'\n        lookahead2(4);              // QName\n        break;\n      case 56:                      // '<!--'\n        lookahead2(1);              // DirCommentContents\n        break;\n      case 60:                      // '<?'\n        lookahead2(3);              // PITarget\n        break;\n      case 69:                      // '['\n        lookahead2W(273);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      case 78:                      // 'append'\n        lookahead2W(269);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      case 133:                     // 'exit'\n        lookahead2W(147);           // S^WS | '#' | '(' | '(:' | 'returning'\n        break;\n      case 139:                     // 'for'\n        lookahead2W(179);           // S^WS | '#' | '$' | '(' | '(:' | 'sliding' | 'tumbling'\n        break;\n      case 161:                     // 'insert'\n        lookahead2W(276);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      case 177:                     // 'let'\n        lookahead2W(166);           // S^WS | '#' | '$' | '(' | '(:' | 'score'\n        break;\n      case 187:                     // 'namespace'\n        lookahead2W(247);           // NCName^Token | S^WS | '#' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n        break;\n      case 220:                     // 'processing-instruction'\n        lookahead2W(245);           // NCName^Token | S^WS | '#' | '(:' | 'after' | 'allowing' | 'ancestor' |\n        break;\n      case 223:                     // 'replace'\n        lookahead2W(170);           // S^WS | '#' | '(' | '(:' | 'node' | 'value'\n        break;\n      case 266:                     // 'validate'\n        lookahead2W(188);           // S^WS | '#' | '(' | '(:' | 'lax' | 'strict' | 'type' | '{'\n        break;\n      case 281:                     // '{'\n        lookahead2W(283);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      case 283:                     // '{|'\n        lookahead2W(274);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      case 31:                      // '$'\n      case 33:                      // '%'\n        lookahead2W(246);           // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n        break;\n      case 83:                      // 'attribute'\n      case 122:                     // 'element'\n        lookahead2W(253);           // EQName^Token | S^WS | '#' | '(:' | 'after' | 'allowing' | 'ancestor' |\n        break;\n      case 87:                      // 'break'\n      case 103:                     // 'continue'\n        lookahead2W(145);           // S^WS | '#' | '(' | '(:' | 'loop'\n        break;\n      case 97:                      // 'comment'\n      case 249:                     // 'text'\n        lookahead2W(97);            // S^WS | '#' | '(:' | '{'\n        break;\n      case 111:                     // 'delete'\n      case 222:                     // 'rename'\n        lookahead2W(261);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      case 41:                      // '+'\n      case 43:                      // '-'\n      case 196:                     // 'not'\n        lookahead2W(266);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      case 135:                     // 'false'\n      case 197:                     // 'null'\n      case 255:                     // 'true'\n        lookahead2W(211);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '.' | '/' |\n        break;\n      case 104:                     // 'copy'\n      case 130:                     // 'every'\n      case 240:                     // 'some'\n      case 268:                     // 'variable'\n        lookahead2W(143);           // S^WS | '#' | '$' | '(' | '(:'\n        break;\n      case 120:                     // 'document'\n      case 206:                     // 'ordered'\n      case 256:                     // 'try'\n      case 262:                     // 'unordered'\n        lookahead2W(148);           // S^WS | '#' | '(' | '(:' | '{'\n        break;\n      case 8:                       // IntegerLiteral\n      case 9:                       // DecimalLiteral\n      case 10:                      // DoubleLiteral\n      case 11:                      // StringLiteral\n      case 32:                      // '$$'\n        lookahead2W(210);           // S^WS | EOF | '!' | '!=' | '(' | '(:' | '*' | '+' | ',' | '-' | '.' | '/' | '//' |\n        break;\n      case 79:                      // 'array'\n      case 121:                     // 'document-node'\n      case 125:                     // 'empty-sequence'\n      case 167:                     // 'item'\n      case 169:                     // 'json-item'\n      case 188:                     // 'namespace-node'\n      case 194:                     // 'node'\n      case 230:                     // 'schema-attribute'\n      case 231:                     // 'schema-element'\n      case 247:                     // 'structured-item'\n        lookahead2W(20);            // S^WS | '#' | '(:'\n        break;\n      case 6:                       // EQName^Token\n      case 71:                      // 'after'\n      case 73:                      // 'allowing'\n      case 74:                      // 'ancestor'\n      case 75:                      // 'ancestor-or-self'\n      case 76:                      // 'and'\n      case 80:                      // 'as'\n      case 81:                      // 'ascending'\n      case 82:                      // 'at'\n      case 84:                      // 'base-uri'\n      case 85:                      // 'before'\n      case 86:                      // 'boundary-space'\n      case 89:                      // 'case'\n      case 90:                      // 'cast'\n      case 91:                      // 'castable'\n      case 92:                      // 'catch'\n      case 94:                      // 'child'\n      case 95:                      // 'collation'\n      case 98:                      // 'constraint'\n      case 99:                      // 'construction'\n      case 102:                     // 'context'\n      case 105:                     // 'copy-namespaces'\n      case 106:                     // 'count'\n      case 107:                     // 'decimal-format'\n      case 109:                     // 'declare'\n      case 110:                     // 'default'\n      case 112:                     // 'descendant'\n      case 113:                     // 'descendant-or-self'\n      case 114:                     // 'descending'\n      case 119:                     // 'div'\n      case 123:                     // 'else'\n      case 124:                     // 'empty'\n      case 126:                     // 'encoding'\n      case 127:                     // 'end'\n      case 129:                     // 'eq'\n      case 132:                     // 'except'\n      case 134:                     // 'external'\n      case 136:                     // 'first'\n      case 137:                     // 'following'\n      case 138:                     // 'following-sibling'\n      case 142:                     // 'from'\n      case 143:                     // 'ft-option'\n      case 147:                     // 'function'\n      case 148:                     // 'ge'\n      case 150:                     // 'group'\n      case 152:                     // 'gt'\n      case 153:                     // 'idiv'\n      case 154:                     // 'if'\n      case 155:                     // 'import'\n      case 156:                     // 'in'\n      case 157:                     // 'index'\n      case 162:                     // 'instance'\n      case 163:                     // 'integrity'\n      case 164:                     // 'intersect'\n      case 165:                     // 'into'\n      case 166:                     // 'is'\n      case 168:                     // 'json'\n      case 170:                     // 'jsoniq'\n      case 173:                     // 'last'\n      case 174:                     // 'lax'\n      case 175:                     // 'le'\n      case 179:                     // 'loop'\n      case 181:                     // 'lt'\n      case 183:                     // 'mod'\n      case 184:                     // 'modify'\n      case 185:                     // 'module'\n      case 189:                     // 'ne'\n      case 195:                     // 'nodes'\n      case 198:                     // 'object'\n      case 202:                     // 'only'\n      case 203:                     // 'option'\n      case 204:                     // 'or'\n      case 205:                     // 'order'\n      case 207:                     // 'ordering'\n      case 210:                     // 'parent'\n      case 216:                     // 'preceding'\n      case 217:                     // 'preceding-sibling'\n      case 224:                     // 'return'\n      case 225:                     // 'returning'\n      case 226:                     // 'revalidation'\n      case 228:                     // 'satisfies'\n      case 229:                     // 'schema'\n      case 232:                     // 'score'\n      case 233:                     // 'select'\n      case 234:                     // 'self'\n      case 239:                     // 'sliding'\n      case 241:                     // 'stable'\n      case 242:                     // 'start'\n      case 245:                     // 'strict'\n      case 248:                     // 'switch'\n      case 253:                     // 'to'\n      case 254:                     // 'treat'\n      case 257:                     // 'tumbling'\n      case 258:                     // 'type'\n      case 259:                     // 'typeswitch'\n      case 260:                     // 'union'\n      case 263:                     // 'updating'\n      case 267:                     // 'value'\n      case 269:                     // 'version'\n      case 272:                     // 'where'\n      case 273:                     // 'while'\n      case 276:                     // 'with'\n        lookahead2W(95);            // S^WS | '#' | '(' | '(:'\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk != 25                  // EOF\n       && lk != 54                  // ';'\n       && lk != 287                 // '}'\n       && lk != 12808               // IntegerLiteral EOF\n       && lk != 12809               // DecimalLiteral EOF\n       && lk != 12810               // DoubleLiteral EOF\n       && lk != 12811               // StringLiteral EOF\n       && lk != 12832               // '$$' EOF\n       && lk != 12847               // '/' EOF\n       && lk != 12935               // 'false' EOF\n       && lk != 12997               // 'null' EOF\n       && lk != 13055               // 'true' EOF\n       && lk != 16140               // 'variable' '$'\n       && lk != 21512               // IntegerLiteral ','\n       && lk != 21513               // DecimalLiteral ','\n       && lk != 21514               // DoubleLiteral ','\n       && lk != 21515               // StringLiteral ','\n       && lk != 21536               // '$$' ','\n       && lk != 21551               // '/' ','\n       && lk != 21639               // 'false' ','\n       && lk != 21701               // 'null' ','\n       && lk != 21759               // 'true' ','\n       && lk != 27656               // IntegerLiteral ';'\n       && lk != 27657               // DecimalLiteral ';'\n       && lk != 27658               // DoubleLiteral ';'\n       && lk != 27659               // StringLiteral ';'\n       && lk != 27680               // '$$' ';'\n       && lk != 27695               // '/' ';'\n       && lk != 27783               // 'false' ';'\n       && lk != 27845               // 'null' ';'\n       && lk != 27903               // 'true' ';'\n       && lk != 91735               // 'break' 'loop'\n       && lk != 91751               // 'continue' 'loop'\n       && lk != 115333              // 'exit' 'returning'\n       && lk != 146952              // IntegerLiteral '}'\n       && lk != 146953              // DecimalLiteral '}'\n       && lk != 146954              // DoubleLiteral '}'\n       && lk != 146955              // StringLiteral '}'\n       && lk != 146976              // '$$' '}'\n       && lk != 146991              // '/' '}'\n       && lk != 147079              // 'false' '}'\n       && lk != 147141              // 'null' '}'\n       && lk != 147199)             // 'true' '}'\n      {\n        lk = memoized(8, e0);\n        if (lk == 0)\n        {\n          var b0A = b0; var e0A = e0; var l1A = l1;\n          var b1A = b1; var e1A = e1; var l2A = l2;\n          var b2A = b2; var e2A = e2;\n          try\n          {\n            try_Statement();\n            lk = -1;\n          }\n          catch (p1A)\n          {\n            lk = -2;\n          }\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(8, e0, lk);\n        }\n      }\n      if (lk != -1\n       && lk != 54                  // ';'\n       && lk != 16140               // 'variable' '$'\n       && lk != 27656               // IntegerLiteral ';'\n       && lk != 27657               // DecimalLiteral ';'\n       && lk != 27658               // DoubleLiteral ';'\n       && lk != 27659               // StringLiteral ';'\n       && lk != 27680               // '$$' ';'\n       && lk != 27695               // '/' ';'\n       && lk != 27783               // 'false' ';'\n       && lk != 27845               // 'null' ';'\n       && lk != 27903               // 'true' ';'\n       && lk != 91735               // 'break' 'loop'\n       && lk != 91751               // 'continue' 'loop'\n       && lk != 115333)             // 'exit' 'returning'\n      {\n        break;\n      }\n      whitespace();\n      parse_Statement();\n    }\n    eventHandler.endNonterminal(\"Statements\", e0);\n  }\n\n  function try_Statements()\n  {\n    for (;;)\n    {\n      lookahead1W(284);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      switch (l1)\n      {\n      case 35:                      // '('\n        lookahead2W(270);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      case 36:                      // '(#'\n        lookahead2(243);            // EQName^Token | S | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' |\n        break;\n      case 47:                      // '/'\n        lookahead2W(286);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      case 48:                      // '//'\n        lookahead2W(260);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      case 55:                      // '<'\n        lookahead2(4);              // QName\n        break;\n      case 56:                      // '<!--'\n        lookahead2(1);              // DirCommentContents\n        break;\n      case 60:                      // '<?'\n        lookahead2(3);              // PITarget\n        break;\n      case 69:                      // '['\n        lookahead2W(273);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      case 78:                      // 'append'\n        lookahead2W(269);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      case 133:                     // 'exit'\n        lookahead2W(147);           // S^WS | '#' | '(' | '(:' | 'returning'\n        break;\n      case 139:                     // 'for'\n        lookahead2W(179);           // S^WS | '#' | '$' | '(' | '(:' | 'sliding' | 'tumbling'\n        break;\n      case 161:                     // 'insert'\n        lookahead2W(276);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      case 177:                     // 'let'\n        lookahead2W(166);           // S^WS | '#' | '$' | '(' | '(:' | 'score'\n        break;\n      case 187:                     // 'namespace'\n        lookahead2W(247);           // NCName^Token | S^WS | '#' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n        break;\n      case 220:                     // 'processing-instruction'\n        lookahead2W(245);           // NCName^Token | S^WS | '#' | '(:' | 'after' | 'allowing' | 'ancestor' |\n        break;\n      case 223:                     // 'replace'\n        lookahead2W(170);           // S^WS | '#' | '(' | '(:' | 'node' | 'value'\n        break;\n      case 266:                     // 'validate'\n        lookahead2W(188);           // S^WS | '#' | '(' | '(:' | 'lax' | 'strict' | 'type' | '{'\n        break;\n      case 281:                     // '{'\n        lookahead2W(283);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      case 283:                     // '{|'\n        lookahead2W(274);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      case 31:                      // '$'\n      case 33:                      // '%'\n        lookahead2W(246);           // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n        break;\n      case 83:                      // 'attribute'\n      case 122:                     // 'element'\n        lookahead2W(253);           // EQName^Token | S^WS | '#' | '(:' | 'after' | 'allowing' | 'ancestor' |\n        break;\n      case 87:                      // 'break'\n      case 103:                     // 'continue'\n        lookahead2W(145);           // S^WS | '#' | '(' | '(:' | 'loop'\n        break;\n      case 97:                      // 'comment'\n      case 249:                     // 'text'\n        lookahead2W(97);            // S^WS | '#' | '(:' | '{'\n        break;\n      case 111:                     // 'delete'\n      case 222:                     // 'rename'\n        lookahead2W(261);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      case 41:                      // '+'\n      case 43:                      // '-'\n      case 196:                     // 'not'\n        lookahead2W(266);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      case 135:                     // 'false'\n      case 197:                     // 'null'\n      case 255:                     // 'true'\n        lookahead2W(211);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '.' | '/' |\n        break;\n      case 104:                     // 'copy'\n      case 130:                     // 'every'\n      case 240:                     // 'some'\n      case 268:                     // 'variable'\n        lookahead2W(143);           // S^WS | '#' | '$' | '(' | '(:'\n        break;\n      case 120:                     // 'document'\n      case 206:                     // 'ordered'\n      case 256:                     // 'try'\n      case 262:                     // 'unordered'\n        lookahead2W(148);           // S^WS | '#' | '(' | '(:' | '{'\n        break;\n      case 8:                       // IntegerLiteral\n      case 9:                       // DecimalLiteral\n      case 10:                      // DoubleLiteral\n      case 11:                      // StringLiteral\n      case 32:                      // '$$'\n        lookahead2W(210);           // S^WS | EOF | '!' | '!=' | '(' | '(:' | '*' | '+' | ',' | '-' | '.' | '/' | '//' |\n        break;\n      case 79:                      // 'array'\n      case 121:                     // 'document-node'\n      case 125:                     // 'empty-sequence'\n      case 167:                     // 'item'\n      case 169:                     // 'json-item'\n      case 188:                     // 'namespace-node'\n      case 194:                     // 'node'\n      case 230:                     // 'schema-attribute'\n      case 231:                     // 'schema-element'\n      case 247:                     // 'structured-item'\n        lookahead2W(20);            // S^WS | '#' | '(:'\n        break;\n      case 6:                       // EQName^Token\n      case 71:                      // 'after'\n      case 73:                      // 'allowing'\n      case 74:                      // 'ancestor'\n      case 75:                      // 'ancestor-or-self'\n      case 76:                      // 'and'\n      case 80:                      // 'as'\n      case 81:                      // 'ascending'\n      case 82:                      // 'at'\n      case 84:                      // 'base-uri'\n      case 85:                      // 'before'\n      case 86:                      // 'boundary-space'\n      case 89:                      // 'case'\n      case 90:                      // 'cast'\n      case 91:                      // 'castable'\n      case 92:                      // 'catch'\n      case 94:                      // 'child'\n      case 95:                      // 'collation'\n      case 98:                      // 'constraint'\n      case 99:                      // 'construction'\n      case 102:                     // 'context'\n      case 105:                     // 'copy-namespaces'\n      case 106:                     // 'count'\n      case 107:                     // 'decimal-format'\n      case 109:                     // 'declare'\n      case 110:                     // 'default'\n      case 112:                     // 'descendant'\n      case 113:                     // 'descendant-or-self'\n      case 114:                     // 'descending'\n      case 119:                     // 'div'\n      case 123:                     // 'else'\n      case 124:                     // 'empty'\n      case 126:                     // 'encoding'\n      case 127:                     // 'end'\n      case 129:                     // 'eq'\n      case 132:                     // 'except'\n      case 134:                     // 'external'\n      case 136:                     // 'first'\n      case 137:                     // 'following'\n      case 138:                     // 'following-sibling'\n      case 142:                     // 'from'\n      case 143:                     // 'ft-option'\n      case 147:                     // 'function'\n      case 148:                     // 'ge'\n      case 150:                     // 'group'\n      case 152:                     // 'gt'\n      case 153:                     // 'idiv'\n      case 154:                     // 'if'\n      case 155:                     // 'import'\n      case 156:                     // 'in'\n      case 157:                     // 'index'\n      case 162:                     // 'instance'\n      case 163:                     // 'integrity'\n      case 164:                     // 'intersect'\n      case 165:                     // 'into'\n      case 166:                     // 'is'\n      case 168:                     // 'json'\n      case 170:                     // 'jsoniq'\n      case 173:                     // 'last'\n      case 174:                     // 'lax'\n      case 175:                     // 'le'\n      case 179:                     // 'loop'\n      case 181:                     // 'lt'\n      case 183:                     // 'mod'\n      case 184:                     // 'modify'\n      case 185:                     // 'module'\n      case 189:                     // 'ne'\n      case 195:                     // 'nodes'\n      case 198:                     // 'object'\n      case 202:                     // 'only'\n      case 203:                     // 'option'\n      case 204:                     // 'or'\n      case 205:                     // 'order'\n      case 207:                     // 'ordering'\n      case 210:                     // 'parent'\n      case 216:                     // 'preceding'\n      case 217:                     // 'preceding-sibling'\n      case 224:                     // 'return'\n      case 225:                     // 'returning'\n      case 226:                     // 'revalidation'\n      case 228:                     // 'satisfies'\n      case 229:                     // 'schema'\n      case 232:                     // 'score'\n      case 233:                     // 'select'\n      case 234:                     // 'self'\n      case 239:                     // 'sliding'\n      case 241:                     // 'stable'\n      case 242:                     // 'start'\n      case 245:                     // 'strict'\n      case 248:                     // 'switch'\n      case 253:                     // 'to'\n      case 254:                     // 'treat'\n      case 257:                     // 'tumbling'\n      case 258:                     // 'type'\n      case 259:                     // 'typeswitch'\n      case 260:                     // 'union'\n      case 263:                     // 'updating'\n      case 267:                     // 'value'\n      case 269:                     // 'version'\n      case 272:                     // 'where'\n      case 273:                     // 'while'\n      case 276:                     // 'with'\n        lookahead2W(95);            // S^WS | '#' | '(' | '(:'\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk != 25                  // EOF\n       && lk != 54                  // ';'\n       && lk != 287                 // '}'\n       && lk != 12808               // IntegerLiteral EOF\n       && lk != 12809               // DecimalLiteral EOF\n       && lk != 12810               // DoubleLiteral EOF\n       && lk != 12811               // StringLiteral EOF\n       && lk != 12832               // '$$' EOF\n       && lk != 12847               // '/' EOF\n       && lk != 12935               // 'false' EOF\n       && lk != 12997               // 'null' EOF\n       && lk != 13055               // 'true' EOF\n       && lk != 16140               // 'variable' '$'\n       && lk != 21512               // IntegerLiteral ','\n       && lk != 21513               // DecimalLiteral ','\n       && lk != 21514               // DoubleLiteral ','\n       && lk != 21515               // StringLiteral ','\n       && lk != 21536               // '$$' ','\n       && lk != 21551               // '/' ','\n       && lk != 21639               // 'false' ','\n       && lk != 21701               // 'null' ','\n       && lk != 21759               // 'true' ','\n       && lk != 27656               // IntegerLiteral ';'\n       && lk != 27657               // DecimalLiteral ';'\n       && lk != 27658               // DoubleLiteral ';'\n       && lk != 27659               // StringLiteral ';'\n       && lk != 27680               // '$$' ';'\n       && lk != 27695               // '/' ';'\n       && lk != 27783               // 'false' ';'\n       && lk != 27845               // 'null' ';'\n       && lk != 27903               // 'true' ';'\n       && lk != 91735               // 'break' 'loop'\n       && lk != 91751               // 'continue' 'loop'\n       && lk != 115333              // 'exit' 'returning'\n       && lk != 146952              // IntegerLiteral '}'\n       && lk != 146953              // DecimalLiteral '}'\n       && lk != 146954              // DoubleLiteral '}'\n       && lk != 146955              // StringLiteral '}'\n       && lk != 146976              // '$$' '}'\n       && lk != 146991              // '/' '}'\n       && lk != 147079              // 'false' '}'\n       && lk != 147141              // 'null' '}'\n       && lk != 147199)             // 'true' '}'\n      {\n        lk = memoized(8, e0);\n        if (lk == 0)\n        {\n          var b0A = b0; var e0A = e0; var l1A = l1;\n          var b1A = b1; var e1A = e1; var l2A = l2;\n          var b2A = b2; var e2A = e2;\n          try\n          {\n            try_Statement();\n            memoize(8, e0A, -1);\n            continue;\n          }\n          catch (p1A)\n          {\n            b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n            b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n            b2 = b2A; e2 = e2A; end = e2A; }}\n            memoize(8, e0A, -2);\n            break;\n          }\n        }\n      }\n      if (lk != -1\n       && lk != 54                  // ';'\n       && lk != 16140               // 'variable' '$'\n       && lk != 27656               // IntegerLiteral ';'\n       && lk != 27657               // DecimalLiteral ';'\n       && lk != 27658               // DoubleLiteral ';'\n       && lk != 27659               // StringLiteral ';'\n       && lk != 27680               // '$$' ';'\n       && lk != 27695               // '/' ';'\n       && lk != 27783               // 'false' ';'\n       && lk != 27845               // 'null' ';'\n       && lk != 27903               // 'true' ';'\n       && lk != 91735               // 'break' 'loop'\n       && lk != 91751               // 'continue' 'loop'\n       && lk != 115333)             // 'exit' 'returning'\n      {\n        break;\n      }\n      try_Statement();\n    }\n  }\n\n  function parse_StatementsAndExpr()\n  {\n    eventHandler.startNonterminal(\"StatementsAndExpr\", e0);\n    parse_Statements();\n    whitespace();\n    parse_Expr();\n    eventHandler.endNonterminal(\"StatementsAndExpr\", e0);\n  }\n\n  function try_StatementsAndExpr()\n  {\n    try_Statements();\n    try_Expr();\n  }\n\n  function parse_StatementsAndOptionalExpr()\n  {\n    eventHandler.startNonterminal(\"StatementsAndOptionalExpr\", e0);\n    parse_Statements();\n    if (l1 != 25                    // EOF\n     && l1 != 287)                  // '}'\n    {\n      whitespace();\n      parse_Expr();\n    }\n    eventHandler.endNonterminal(\"StatementsAndOptionalExpr\", e0);\n  }\n\n  function try_StatementsAndOptionalExpr()\n  {\n    try_Statements();\n    if (l1 != 25                    // EOF\n     && l1 != 287)                  // '}'\n    {\n      try_Expr();\n    }\n  }\n\n  function parse_Statement()\n  {\n    eventHandler.startNonterminal(\"Statement\", e0);\n    switch (l1)\n    {\n    case 133:                       // 'exit'\n      lookahead2W(147);             // S^WS | '#' | '(' | '(:' | 'returning'\n      break;\n    case 139:                       // 'for'\n      lookahead2W(179);             // S^WS | '#' | '$' | '(' | '(:' | 'sliding' | 'tumbling'\n      break;\n    case 177:                       // 'let'\n      lookahead2W(166);             // S^WS | '#' | '$' | '(' | '(:' | 'score'\n      break;\n    case 256:                       // 'try'\n      lookahead2W(148);             // S^WS | '#' | '(' | '(:' | '{'\n      break;\n    case 268:                       // 'variable'\n      lookahead2W(143);             // S^WS | '#' | '$' | '(' | '(:'\n      break;\n    case 281:                       // '{'\n      lookahead2W(283);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    case 31:                        // '$'\n    case 33:                        // '%'\n      lookahead2W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    case 87:                        // 'break'\n    case 103:                       // 'continue'\n      lookahead2W(145);             // S^WS | '#' | '(' | '(:' | 'loop'\n      break;\n    case 154:                       // 'if'\n    case 248:                       // 'switch'\n    case 259:                       // 'typeswitch'\n    case 273:                       // 'while'\n      lookahead2W(95);              // S^WS | '#' | '(' | '(:'\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk != 6                     // EQName^Token\n     && lk != 8                     // IntegerLiteral\n     && lk != 9                     // DecimalLiteral\n     && lk != 10                    // DoubleLiteral\n     && lk != 11                    // StringLiteral\n     && lk != 32                    // '$$'\n     && lk != 35                    // '('\n     && lk != 36                    // '(#'\n     && lk != 41                    // '+'\n     && lk != 43                    // '-'\n     && lk != 47                    // '/'\n     && lk != 48                    // '//'\n     && lk != 54                    // ';'\n     && lk != 55                    // '<'\n     && lk != 56                    // '<!--'\n     && lk != 60                    // '<?'\n     && lk != 69                    // '['\n     && lk != 71                    // 'after'\n     && lk != 73                    // 'allowing'\n     && lk != 74                    // 'ancestor'\n     && lk != 75                    // 'ancestor-or-self'\n     && lk != 76                    // 'and'\n     && lk != 78                    // 'append'\n     && lk != 79                    // 'array'\n     && lk != 80                    // 'as'\n     && lk != 81                    // 'ascending'\n     && lk != 82                    // 'at'\n     && lk != 83                    // 'attribute'\n     && lk != 84                    // 'base-uri'\n     && lk != 85                    // 'before'\n     && lk != 86                    // 'boundary-space'\n     && lk != 89                    // 'case'\n     && lk != 90                    // 'cast'\n     && lk != 91                    // 'castable'\n     && lk != 92                    // 'catch'\n     && lk != 94                    // 'child'\n     && lk != 95                    // 'collation'\n     && lk != 97                    // 'comment'\n     && lk != 98                    // 'constraint'\n     && lk != 99                    // 'construction'\n     && lk != 102                   // 'context'\n     && lk != 104                   // 'copy'\n     && lk != 105                   // 'copy-namespaces'\n     && lk != 106                   // 'count'\n     && lk != 107                   // 'decimal-format'\n     && lk != 109                   // 'declare'\n     && lk != 110                   // 'default'\n     && lk != 111                   // 'delete'\n     && lk != 112                   // 'descendant'\n     && lk != 113                   // 'descendant-or-self'\n     && lk != 114                   // 'descending'\n     && lk != 119                   // 'div'\n     && lk != 120                   // 'document'\n     && lk != 121                   // 'document-node'\n     && lk != 122                   // 'element'\n     && lk != 123                   // 'else'\n     && lk != 124                   // 'empty'\n     && lk != 125                   // 'empty-sequence'\n     && lk != 126                   // 'encoding'\n     && lk != 127                   // 'end'\n     && lk != 129                   // 'eq'\n     && lk != 130                   // 'every'\n     && lk != 132                   // 'except'\n     && lk != 134                   // 'external'\n     && lk != 135                   // 'false'\n     && lk != 136                   // 'first'\n     && lk != 137                   // 'following'\n     && lk != 138                   // 'following-sibling'\n     && lk != 142                   // 'from'\n     && lk != 143                   // 'ft-option'\n     && lk != 147                   // 'function'\n     && lk != 148                   // 'ge'\n     && lk != 150                   // 'group'\n     && lk != 152                   // 'gt'\n     && lk != 153                   // 'idiv'\n     && lk != 155                   // 'import'\n     && lk != 156                   // 'in'\n     && lk != 157                   // 'index'\n     && lk != 161                   // 'insert'\n     && lk != 162                   // 'instance'\n     && lk != 163                   // 'integrity'\n     && lk != 164                   // 'intersect'\n     && lk != 165                   // 'into'\n     && lk != 166                   // 'is'\n     && lk != 167                   // 'item'\n     && lk != 168                   // 'json'\n     && lk != 169                   // 'json-item'\n     && lk != 170                   // 'jsoniq'\n     && lk != 173                   // 'last'\n     && lk != 174                   // 'lax'\n     && lk != 175                   // 'le'\n     && lk != 179                   // 'loop'\n     && lk != 181                   // 'lt'\n     && lk != 183                   // 'mod'\n     && lk != 184                   // 'modify'\n     && lk != 185                   // 'module'\n     && lk != 187                   // 'namespace'\n     && lk != 188                   // 'namespace-node'\n     && lk != 189                   // 'ne'\n     && lk != 194                   // 'node'\n     && lk != 195                   // 'nodes'\n     && lk != 196                   // 'not'\n     && lk != 197                   // 'null'\n     && lk != 198                   // 'object'\n     && lk != 202                   // 'only'\n     && lk != 203                   // 'option'\n     && lk != 204                   // 'or'\n     && lk != 205                   // 'order'\n     && lk != 206                   // 'ordered'\n     && lk != 207                   // 'ordering'\n     && lk != 210                   // 'parent'\n     && lk != 216                   // 'preceding'\n     && lk != 217                   // 'preceding-sibling'\n     && lk != 220                   // 'processing-instruction'\n     && lk != 222                   // 'rename'\n     && lk != 223                   // 'replace'\n     && lk != 224                   // 'return'\n     && lk != 225                   // 'returning'\n     && lk != 226                   // 'revalidation'\n     && lk != 228                   // 'satisfies'\n     && lk != 229                   // 'schema'\n     && lk != 230                   // 'schema-attribute'\n     && lk != 231                   // 'schema-element'\n     && lk != 232                   // 'score'\n     && lk != 233                   // 'select'\n     && lk != 234                   // 'self'\n     && lk != 239                   // 'sliding'\n     && lk != 240                   // 'some'\n     && lk != 241                   // 'stable'\n     && lk != 242                   // 'start'\n     && lk != 245                   // 'strict'\n     && lk != 247                   // 'structured-item'\n     && lk != 249                   // 'text'\n     && lk != 253                   // 'to'\n     && lk != 254                   // 'treat'\n     && lk != 255                   // 'true'\n     && lk != 257                   // 'tumbling'\n     && lk != 258                   // 'type'\n     && lk != 260                   // 'union'\n     && lk != 262                   // 'unordered'\n     && lk != 263                   // 'updating'\n     && lk != 266                   // 'validate'\n     && lk != 267                   // 'value'\n     && lk != 269                   // 'version'\n     && lk != 272                   // 'where'\n     && lk != 276                   // 'with'\n     && lk != 283                   // '{|'\n     && lk != 10009                 // '{' NCName^Token\n     && lk != 14935                 // 'break' '#'\n     && lk != 14951                 // 'continue' '#'\n     && lk != 14981                 // 'exit' '#'\n     && lk != 14987                 // 'for' '#'\n     && lk != 15002                 // 'if' '#'\n     && lk != 15025                 // 'let' '#'\n     && lk != 15096                 // 'switch' '#'\n     && lk != 15104                 // 'try' '#'\n     && lk != 15107                 // 'typeswitch' '#'\n     && lk != 15116                 // 'variable' '#'\n     && lk != 15121                 // 'while' '#'\n     && lk != 16011                 // 'for' '$'\n     && lk != 16049                 // 'let' '$'\n     && lk != 16140                 // 'variable' '$'\n     && lk != 18007                 // 'break' '('\n     && lk != 18023                 // 'continue' '('\n     && lk != 18053                 // 'exit' '('\n     && lk != 18059                 // 'for' '('\n     && lk != 18074                 // 'if' '('\n     && lk != 18097                 // 'let' '('\n     && lk != 18168                 // 'switch' '('\n     && lk != 18176                 // 'try' '('\n     && lk != 18179                 // 'typeswitch' '('\n     && lk != 18188                 // 'variable' '('\n     && lk != 91735                 // 'break' 'loop'\n     && lk != 91751                 // 'continue' 'loop'\n     && lk != 115333                // 'exit' 'returning'\n     && lk != 118961                // 'let' 'score'\n     && lk != 122507                // 'for' 'sliding'\n     && lk != 131723                // 'for' 'tumbling'\n     && lk != 144128                // 'try' '{'\n     && lk != 147225)               // '{' '}'\n    {\n      lk = memoized(9, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_ApplyStatement();\n          lk = -1;\n        }\n        catch (p1A)\n        {\n          try\n          {\n            b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n            b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n            b2 = b2A; e2 = e2A; end = e2A; }}\n            try_AssignStatement();\n            lk = -2;\n          }\n          catch (p2A)\n          {\n            try\n            {\n              b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n              b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n              b2 = b2A; e2 = e2A; end = e2A; }}\n              try_BlockStatement();\n              lk = -3;\n            }\n            catch (p3A)\n            {\n              try\n              {\n                b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n                b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n                b2 = b2A; e2 = e2A; end = e2A; }}\n                try_VarDeclStatement();\n                lk = -12;\n              }\n              catch (p12A)\n              {\n                lk = -13;\n              }\n            }\n          }\n        }\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(9, e0, lk);\n      }\n    }\n    switch (lk)\n    {\n    case -2:\n      parse_AssignStatement();\n      break;\n    case -3:\n      parse_BlockStatement();\n      break;\n    case 91735:                     // 'break' 'loop'\n      parse_BreakStatement();\n      break;\n    case 91751:                     // 'continue' 'loop'\n      parse_ContinueStatement();\n      break;\n    case 115333:                    // 'exit' 'returning'\n      parse_ExitStatement();\n      break;\n    case 16011:                     // 'for' '$'\n    case 16049:                     // 'let' '$'\n    case 118961:                    // 'let' 'score'\n    case 122507:                    // 'for' 'sliding'\n    case 131723:                    // 'for' 'tumbling'\n      parse_FLWORStatement();\n      break;\n    case 18074:                     // 'if' '('\n      parse_IfStatement();\n      break;\n    case 18168:                     // 'switch' '('\n      parse_SwitchStatement();\n      break;\n    case 144128:                    // 'try' '{'\n      parse_TryCatchStatement();\n      break;\n    case 18179:                     // 'typeswitch' '('\n      parse_TypeswitchStatement();\n      break;\n    case -12:\n    case 16140:                     // 'variable' '$'\n      parse_VarDeclStatement();\n      break;\n    case -13:\n      parse_WhileStatement();\n      break;\n    case 54:                        // ';'\n      parse_VoidStatement();\n      break;\n    default:\n      parse_ApplyStatement();\n    }\n    eventHandler.endNonterminal(\"Statement\", e0);\n  }\n\n  function try_Statement()\n  {\n    switch (l1)\n    {\n    case 133:                       // 'exit'\n      lookahead2W(147);             // S^WS | '#' | '(' | '(:' | 'returning'\n      break;\n    case 139:                       // 'for'\n      lookahead2W(179);             // S^WS | '#' | '$' | '(' | '(:' | 'sliding' | 'tumbling'\n      break;\n    case 177:                       // 'let'\n      lookahead2W(166);             // S^WS | '#' | '$' | '(' | '(:' | 'score'\n      break;\n    case 256:                       // 'try'\n      lookahead2W(148);             // S^WS | '#' | '(' | '(:' | '{'\n      break;\n    case 268:                       // 'variable'\n      lookahead2W(143);             // S^WS | '#' | '$' | '(' | '(:'\n      break;\n    case 281:                       // '{'\n      lookahead2W(283);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    case 31:                        // '$'\n    case 33:                        // '%'\n      lookahead2W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    case 87:                        // 'break'\n    case 103:                       // 'continue'\n      lookahead2W(145);             // S^WS | '#' | '(' | '(:' | 'loop'\n      break;\n    case 154:                       // 'if'\n    case 248:                       // 'switch'\n    case 259:                       // 'typeswitch'\n    case 273:                       // 'while'\n      lookahead2W(95);              // S^WS | '#' | '(' | '(:'\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk != 6                     // EQName^Token\n     && lk != 8                     // IntegerLiteral\n     && lk != 9                     // DecimalLiteral\n     && lk != 10                    // DoubleLiteral\n     && lk != 11                    // StringLiteral\n     && lk != 32                    // '$$'\n     && lk != 35                    // '('\n     && lk != 36                    // '(#'\n     && lk != 41                    // '+'\n     && lk != 43                    // '-'\n     && lk != 47                    // '/'\n     && lk != 48                    // '//'\n     && lk != 54                    // ';'\n     && lk != 55                    // '<'\n     && lk != 56                    // '<!--'\n     && lk != 60                    // '<?'\n     && lk != 69                    // '['\n     && lk != 71                    // 'after'\n     && lk != 73                    // 'allowing'\n     && lk != 74                    // 'ancestor'\n     && lk != 75                    // 'ancestor-or-self'\n     && lk != 76                    // 'and'\n     && lk != 78                    // 'append'\n     && lk != 79                    // 'array'\n     && lk != 80                    // 'as'\n     && lk != 81                    // 'ascending'\n     && lk != 82                    // 'at'\n     && lk != 83                    // 'attribute'\n     && lk != 84                    // 'base-uri'\n     && lk != 85                    // 'before'\n     && lk != 86                    // 'boundary-space'\n     && lk != 89                    // 'case'\n     && lk != 90                    // 'cast'\n     && lk != 91                    // 'castable'\n     && lk != 92                    // 'catch'\n     && lk != 94                    // 'child'\n     && lk != 95                    // 'collation'\n     && lk != 97                    // 'comment'\n     && lk != 98                    // 'constraint'\n     && lk != 99                    // 'construction'\n     && lk != 102                   // 'context'\n     && lk != 104                   // 'copy'\n     && lk != 105                   // 'copy-namespaces'\n     && lk != 106                   // 'count'\n     && lk != 107                   // 'decimal-format'\n     && lk != 109                   // 'declare'\n     && lk != 110                   // 'default'\n     && lk != 111                   // 'delete'\n     && lk != 112                   // 'descendant'\n     && lk != 113                   // 'descendant-or-self'\n     && lk != 114                   // 'descending'\n     && lk != 119                   // 'div'\n     && lk != 120                   // 'document'\n     && lk != 121                   // 'document-node'\n     && lk != 122                   // 'element'\n     && lk != 123                   // 'else'\n     && lk != 124                   // 'empty'\n     && lk != 125                   // 'empty-sequence'\n     && lk != 126                   // 'encoding'\n     && lk != 127                   // 'end'\n     && lk != 129                   // 'eq'\n     && lk != 130                   // 'every'\n     && lk != 132                   // 'except'\n     && lk != 134                   // 'external'\n     && lk != 135                   // 'false'\n     && lk != 136                   // 'first'\n     && lk != 137                   // 'following'\n     && lk != 138                   // 'following-sibling'\n     && lk != 142                   // 'from'\n     && lk != 143                   // 'ft-option'\n     && lk != 147                   // 'function'\n     && lk != 148                   // 'ge'\n     && lk != 150                   // 'group'\n     && lk != 152                   // 'gt'\n     && lk != 153                   // 'idiv'\n     && lk != 155                   // 'import'\n     && lk != 156                   // 'in'\n     && lk != 157                   // 'index'\n     && lk != 161                   // 'insert'\n     && lk != 162                   // 'instance'\n     && lk != 163                   // 'integrity'\n     && lk != 164                   // 'intersect'\n     && lk != 165                   // 'into'\n     && lk != 166                   // 'is'\n     && lk != 167                   // 'item'\n     && lk != 168                   // 'json'\n     && lk != 169                   // 'json-item'\n     && lk != 170                   // 'jsoniq'\n     && lk != 173                   // 'last'\n     && lk != 174                   // 'lax'\n     && lk != 175                   // 'le'\n     && lk != 179                   // 'loop'\n     && lk != 181                   // 'lt'\n     && lk != 183                   // 'mod'\n     && lk != 184                   // 'modify'\n     && lk != 185                   // 'module'\n     && lk != 187                   // 'namespace'\n     && lk != 188                   // 'namespace-node'\n     && lk != 189                   // 'ne'\n     && lk != 194                   // 'node'\n     && lk != 195                   // 'nodes'\n     && lk != 196                   // 'not'\n     && lk != 197                   // 'null'\n     && lk != 198                   // 'object'\n     && lk != 202                   // 'only'\n     && lk != 203                   // 'option'\n     && lk != 204                   // 'or'\n     && lk != 205                   // 'order'\n     && lk != 206                   // 'ordered'\n     && lk != 207                   // 'ordering'\n     && lk != 210                   // 'parent'\n     && lk != 216                   // 'preceding'\n     && lk != 217                   // 'preceding-sibling'\n     && lk != 220                   // 'processing-instruction'\n     && lk != 222                   // 'rename'\n     && lk != 223                   // 'replace'\n     && lk != 224                   // 'return'\n     && lk != 225                   // 'returning'\n     && lk != 226                   // 'revalidation'\n     && lk != 228                   // 'satisfies'\n     && lk != 229                   // 'schema'\n     && lk != 230                   // 'schema-attribute'\n     && lk != 231                   // 'schema-element'\n     && lk != 232                   // 'score'\n     && lk != 233                   // 'select'\n     && lk != 234                   // 'self'\n     && lk != 239                   // 'sliding'\n     && lk != 240                   // 'some'\n     && lk != 241                   // 'stable'\n     && lk != 242                   // 'start'\n     && lk != 245                   // 'strict'\n     && lk != 247                   // 'structured-item'\n     && lk != 249                   // 'text'\n     && lk != 253                   // 'to'\n     && lk != 254                   // 'treat'\n     && lk != 255                   // 'true'\n     && lk != 257                   // 'tumbling'\n     && lk != 258                   // 'type'\n     && lk != 260                   // 'union'\n     && lk != 262                   // 'unordered'\n     && lk != 263                   // 'updating'\n     && lk != 266                   // 'validate'\n     && lk != 267                   // 'value'\n     && lk != 269                   // 'version'\n     && lk != 272                   // 'where'\n     && lk != 276                   // 'with'\n     && lk != 283                   // '{|'\n     && lk != 10009                 // '{' NCName^Token\n     && lk != 14935                 // 'break' '#'\n     && lk != 14951                 // 'continue' '#'\n     && lk != 14981                 // 'exit' '#'\n     && lk != 14987                 // 'for' '#'\n     && lk != 15002                 // 'if' '#'\n     && lk != 15025                 // 'let' '#'\n     && lk != 15096                 // 'switch' '#'\n     && lk != 15104                 // 'try' '#'\n     && lk != 15107                 // 'typeswitch' '#'\n     && lk != 15116                 // 'variable' '#'\n     && lk != 15121                 // 'while' '#'\n     && lk != 16011                 // 'for' '$'\n     && lk != 16049                 // 'let' '$'\n     && lk != 16140                 // 'variable' '$'\n     && lk != 18007                 // 'break' '('\n     && lk != 18023                 // 'continue' '('\n     && lk != 18053                 // 'exit' '('\n     && lk != 18059                 // 'for' '('\n     && lk != 18074                 // 'if' '('\n     && lk != 18097                 // 'let' '('\n     && lk != 18168                 // 'switch' '('\n     && lk != 18176                 // 'try' '('\n     && lk != 18179                 // 'typeswitch' '('\n     && lk != 18188                 // 'variable' '('\n     && lk != 91735                 // 'break' 'loop'\n     && lk != 91751                 // 'continue' 'loop'\n     && lk != 115333                // 'exit' 'returning'\n     && lk != 118961                // 'let' 'score'\n     && lk != 122507                // 'for' 'sliding'\n     && lk != 131723                // 'for' 'tumbling'\n     && lk != 144128                // 'try' '{'\n     && lk != 147225)               // '{' '}'\n    {\n      lk = memoized(9, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_ApplyStatement();\n          memoize(9, e0A, -1);\n          lk = -15;\n        }\n        catch (p1A)\n        {\n          try\n          {\n            b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n            b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n            b2 = b2A; e2 = e2A; end = e2A; }}\n            try_AssignStatement();\n            memoize(9, e0A, -2);\n            lk = -15;\n          }\n          catch (p2A)\n          {\n            try\n            {\n              b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n              b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n              b2 = b2A; e2 = e2A; end = e2A; }}\n              try_BlockStatement();\n              memoize(9, e0A, -3);\n              lk = -15;\n            }\n            catch (p3A)\n            {\n              try\n              {\n                b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n                b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n                b2 = b2A; e2 = e2A; end = e2A; }}\n                try_VarDeclStatement();\n                memoize(9, e0A, -12);\n                lk = -15;\n              }\n              catch (p12A)\n              {\n                lk = -13;\n                b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n                b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n                b2 = b2A; e2 = e2A; end = e2A; }}\n                memoize(9, e0A, -13);\n              }\n            }\n          }\n        }\n      }\n    }\n    switch (lk)\n    {\n    case -2:\n      try_AssignStatement();\n      break;\n    case -3:\n      try_BlockStatement();\n      break;\n    case 91735:                     // 'break' 'loop'\n      try_BreakStatement();\n      break;\n    case 91751:                     // 'continue' 'loop'\n      try_ContinueStatement();\n      break;\n    case 115333:                    // 'exit' 'returning'\n      try_ExitStatement();\n      break;\n    case 16011:                     // 'for' '$'\n    case 16049:                     // 'let' '$'\n    case 118961:                    // 'let' 'score'\n    case 122507:                    // 'for' 'sliding'\n    case 131723:                    // 'for' 'tumbling'\n      try_FLWORStatement();\n      break;\n    case 18074:                     // 'if' '('\n      try_IfStatement();\n      break;\n    case 18168:                     // 'switch' '('\n      try_SwitchStatement();\n      break;\n    case 144128:                    // 'try' '{'\n      try_TryCatchStatement();\n      break;\n    case 18179:                     // 'typeswitch' '('\n      try_TypeswitchStatement();\n      break;\n    case -12:\n    case 16140:                     // 'variable' '$'\n      try_VarDeclStatement();\n      break;\n    case -13:\n      try_WhileStatement();\n      break;\n    case 54:                        // ';'\n      try_VoidStatement();\n      break;\n    case -15:\n      break;\n    default:\n      try_ApplyStatement();\n    }\n  }\n\n  function parse_ApplyStatement()\n  {\n    eventHandler.startNonterminal(\"ApplyStatement\", e0);\n    parse_ExprSimple();\n    shift(54);                      // ';'\n    eventHandler.endNonterminal(\"ApplyStatement\", e0);\n  }\n\n  function try_ApplyStatement()\n  {\n    try_ExprSimple();\n    shiftT(54);                     // ';'\n  }\n\n  function parse_AssignStatement()\n  {\n    eventHandler.startNonterminal(\"AssignStatement\", e0);\n    shift(31);                      // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    lookahead1W(28);                // S^WS | '(:' | ':='\n    shift(53);                      // ':='\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    shift(54);                      // ';'\n    eventHandler.endNonterminal(\"AssignStatement\", e0);\n  }\n\n  function try_AssignStatement()\n  {\n    shiftT(31);                     // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n    lookahead1W(28);                // S^WS | '(:' | ':='\n    shiftT(53);                     // ':='\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n    shiftT(54);                     // ';'\n  }\n\n  function parse_BlockStatement()\n  {\n    eventHandler.startNonterminal(\"BlockStatement\", e0);\n    shift(281);                     // '{'\n    lookahead1W(271);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Statement();\n    lookahead1W(281);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Statements();\n    shift(287);                     // '}'\n    eventHandler.endNonterminal(\"BlockStatement\", e0);\n  }\n\n  function try_BlockStatement()\n  {\n    shiftT(281);                    // '{'\n    lookahead1W(271);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Statement();\n    lookahead1W(281);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Statements();\n    shiftT(287);                    // '}'\n  }\n\n  function parse_BreakStatement()\n  {\n    eventHandler.startNonterminal(\"BreakStatement\", e0);\n    shift(87);                      // 'break'\n    lookahead1W(62);                // S^WS | '(:' | 'loop'\n    shift(179);                     // 'loop'\n    lookahead1W(29);                // S^WS | '(:' | ';'\n    shift(54);                      // ';'\n    eventHandler.endNonterminal(\"BreakStatement\", e0);\n  }\n\n  function try_BreakStatement()\n  {\n    shiftT(87);                     // 'break'\n    lookahead1W(62);                // S^WS | '(:' | 'loop'\n    shiftT(179);                    // 'loop'\n    lookahead1W(29);                // S^WS | '(:' | ';'\n    shiftT(54);                     // ';'\n  }\n\n  function parse_ContinueStatement()\n  {\n    eventHandler.startNonterminal(\"ContinueStatement\", e0);\n    shift(103);                     // 'continue'\n    lookahead1W(62);                // S^WS | '(:' | 'loop'\n    shift(179);                     // 'loop'\n    lookahead1W(29);                // S^WS | '(:' | ';'\n    shift(54);                      // ';'\n    eventHandler.endNonterminal(\"ContinueStatement\", e0);\n  }\n\n  function try_ContinueStatement()\n  {\n    shiftT(103);                    // 'continue'\n    lookahead1W(62);                // S^WS | '(:' | 'loop'\n    shiftT(179);                    // 'loop'\n    lookahead1W(29);                // S^WS | '(:' | ';'\n    shiftT(54);                     // ';'\n  }\n\n  function parse_ExitStatement()\n  {\n    eventHandler.startNonterminal(\"ExitStatement\", e0);\n    shift(133);                     // 'exit'\n    lookahead1W(74);                // S^WS | '(:' | 'returning'\n    shift(225);                     // 'returning'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    shift(54);                      // ';'\n    eventHandler.endNonterminal(\"ExitStatement\", e0);\n  }\n\n  function try_ExitStatement()\n  {\n    shiftT(133);                    // 'exit'\n    lookahead1W(74);                // S^WS | '(:' | 'returning'\n    shiftT(225);                    // 'returning'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n    shiftT(54);                     // ';'\n  }\n\n  function parse_FLWORStatement()\n  {\n    eventHandler.startNonterminal(\"FLWORStatement\", e0);\n    parse_InitialClause();\n    for (;;)\n    {\n      lookahead1W(195);             // S^WS | '(:' | 'count' | 'for' | 'group' | 'let' | 'order' | 'return' | 'stable' |\n      if (l1 == 224)                // 'return'\n      {\n        break;\n      }\n      whitespace();\n      parse_IntermediateClause();\n    }\n    whitespace();\n    parse_ReturnStatement();\n    eventHandler.endNonterminal(\"FLWORStatement\", e0);\n  }\n\n  function try_FLWORStatement()\n  {\n    try_InitialClause();\n    for (;;)\n    {\n      lookahead1W(195);             // S^WS | '(:' | 'count' | 'for' | 'group' | 'let' | 'order' | 'return' | 'stable' |\n      if (l1 == 224)                // 'return'\n      {\n        break;\n      }\n      try_IntermediateClause();\n    }\n    try_ReturnStatement();\n  }\n\n  function parse_ReturnStatement()\n  {\n    eventHandler.startNonterminal(\"ReturnStatement\", e0);\n    shift(224);                     // 'return'\n    lookahead1W(271);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Statement();\n    eventHandler.endNonterminal(\"ReturnStatement\", e0);\n  }\n\n  function try_ReturnStatement()\n  {\n    shiftT(224);                    // 'return'\n    lookahead1W(271);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Statement();\n  }\n\n  function parse_IfStatement()\n  {\n    eventHandler.startNonterminal(\"IfStatement\", e0);\n    shift(154);                     // 'if'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(35);                      // '('\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Expr();\n    shift(38);                      // ')'\n    lookahead1W(80);                // S^WS | '(:' | 'then'\n    shift(250);                     // 'then'\n    lookahead1W(271);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Statement();\n    lookahead1W(51);                // S^WS | '(:' | 'else'\n    shift(123);                     // 'else'\n    lookahead1W(271);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Statement();\n    eventHandler.endNonterminal(\"IfStatement\", e0);\n  }\n\n  function try_IfStatement()\n  {\n    shiftT(154);                    // 'if'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(35);                     // '('\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Expr();\n    shiftT(38);                     // ')'\n    lookahead1W(80);                // S^WS | '(:' | 'then'\n    shiftT(250);                    // 'then'\n    lookahead1W(271);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Statement();\n    lookahead1W(51);                // S^WS | '(:' | 'else'\n    shiftT(123);                    // 'else'\n    lookahead1W(271);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Statement();\n  }\n\n  function parse_SwitchStatement()\n  {\n    eventHandler.startNonterminal(\"SwitchStatement\", e0);\n    shift(248);                     // 'switch'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(35);                      // '('\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Expr();\n    shift(38);                      // ')'\n    for (;;)\n    {\n      lookahead1W(38);              // S^WS | '(:' | 'case'\n      whitespace();\n      parse_SwitchCaseStatement();\n      lookahead1W(117);             // S^WS | '(:' | 'case' | 'default'\n      if (l1 != 89)                 // 'case'\n      {\n        break;\n      }\n    }\n    shift(110);                     // 'default'\n    lookahead1W(73);                // S^WS | '(:' | 'return'\n    shift(224);                     // 'return'\n    lookahead1W(271);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Statement();\n    eventHandler.endNonterminal(\"SwitchStatement\", e0);\n  }\n\n  function try_SwitchStatement()\n  {\n    shiftT(248);                    // 'switch'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(35);                     // '('\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Expr();\n    shiftT(38);                     // ')'\n    for (;;)\n    {\n      lookahead1W(38);              // S^WS | '(:' | 'case'\n      try_SwitchCaseStatement();\n      lookahead1W(117);             // S^WS | '(:' | 'case' | 'default'\n      if (l1 != 89)                 // 'case'\n      {\n        break;\n      }\n    }\n    shiftT(110);                    // 'default'\n    lookahead1W(73);                // S^WS | '(:' | 'return'\n    shiftT(224);                    // 'return'\n    lookahead1W(271);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Statement();\n  }\n\n  function parse_SwitchCaseStatement()\n  {\n    eventHandler.startNonterminal(\"SwitchCaseStatement\", e0);\n    for (;;)\n    {\n      shift(89);                    // 'case'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_SwitchCaseOperand();\n      if (l1 != 89)                 // 'case'\n      {\n        break;\n      }\n    }\n    shift(224);                     // 'return'\n    lookahead1W(271);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Statement();\n    eventHandler.endNonterminal(\"SwitchCaseStatement\", e0);\n  }\n\n  function try_SwitchCaseStatement()\n  {\n    for (;;)\n    {\n      shiftT(89);                   // 'case'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_SwitchCaseOperand();\n      if (l1 != 89)                 // 'case'\n      {\n        break;\n      }\n    }\n    shiftT(224);                    // 'return'\n    lookahead1W(271);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Statement();\n  }\n\n  function parse_TryCatchStatement()\n  {\n    eventHandler.startNonterminal(\"TryCatchStatement\", e0);\n    shift(256);                     // 'try'\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    whitespace();\n    parse_BlockStatement();\n    for (;;)\n    {\n      lookahead1W(39);              // S^WS | '(:' | 'catch'\n      shift(92);                    // 'catch'\n      lookahead1W(249);             // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_CatchErrorList();\n      whitespace();\n      parse_BlockStatement();\n      lookahead1W(284);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      switch (l1)\n      {\n      case 92:                      // 'catch'\n        lookahead2W(256);           // Wildcard | EQName^Token | S^WS | '#' | '(' | '(:' | 'after' | 'allowing' |\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk != 2652                // 'catch' Wildcard\n       && lk != 3164                // 'catch' EQName^Token\n       && lk != 36444               // 'catch' 'after'\n       && lk != 37468               // 'catch' 'allowing'\n       && lk != 37980               // 'catch' 'ancestor'\n       && lk != 38492               // 'catch' 'ancestor-or-self'\n       && lk != 39004               // 'catch' 'and'\n       && lk != 40028               // 'catch' 'append'\n       && lk != 40540               // 'catch' 'array'\n       && lk != 41052               // 'catch' 'as'\n       && lk != 41564               // 'catch' 'ascending'\n       && lk != 42076               // 'catch' 'at'\n       && lk != 42588               // 'catch' 'attribute'\n       && lk != 43100               // 'catch' 'base-uri'\n       && lk != 43612               // 'catch' 'before'\n       && lk != 44124               // 'catch' 'boundary-space'\n       && lk != 44636               // 'catch' 'break'\n       && lk != 45660               // 'catch' 'case'\n       && lk != 46172               // 'catch' 'cast'\n       && lk != 46684               // 'catch' 'castable'\n       && lk != 47196               // 'catch' 'catch'\n       && lk != 48220               // 'catch' 'child'\n       && lk != 48732               // 'catch' 'collation'\n       && lk != 49756               // 'catch' 'comment'\n       && lk != 50268               // 'catch' 'constraint'\n       && lk != 50780               // 'catch' 'construction'\n       && lk != 52316               // 'catch' 'context'\n       && lk != 52828               // 'catch' 'continue'\n       && lk != 53340               // 'catch' 'copy'\n       && lk != 53852               // 'catch' 'copy-namespaces'\n       && lk != 54364               // 'catch' 'count'\n       && lk != 54876               // 'catch' 'decimal-format'\n       && lk != 55900               // 'catch' 'declare'\n       && lk != 56412               // 'catch' 'default'\n       && lk != 56924               // 'catch' 'delete'\n       && lk != 57436               // 'catch' 'descendant'\n       && lk != 57948               // 'catch' 'descendant-or-self'\n       && lk != 58460               // 'catch' 'descending'\n       && lk != 61020               // 'catch' 'div'\n       && lk != 61532               // 'catch' 'document'\n       && lk != 62044               // 'catch' 'document-node'\n       && lk != 62556               // 'catch' 'element'\n       && lk != 63068               // 'catch' 'else'\n       && lk != 63580               // 'catch' 'empty'\n       && lk != 64092               // 'catch' 'empty-sequence'\n       && lk != 64604               // 'catch' 'encoding'\n       && lk != 65116               // 'catch' 'end'\n       && lk != 66140               // 'catch' 'eq'\n       && lk != 66652               // 'catch' 'every'\n       && lk != 67676               // 'catch' 'except'\n       && lk != 68188               // 'catch' 'exit'\n       && lk != 68700               // 'catch' 'external'\n       && lk != 69212               // 'catch' 'false'\n       && lk != 69724               // 'catch' 'first'\n       && lk != 70236               // 'catch' 'following'\n       && lk != 70748               // 'catch' 'following-sibling'\n       && lk != 71260               // 'catch' 'for'\n       && lk != 72796               // 'catch' 'from'\n       && lk != 73308               // 'catch' 'ft-option'\n       && lk != 75356               // 'catch' 'function'\n       && lk != 75868               // 'catch' 'ge'\n       && lk != 76892               // 'catch' 'group'\n       && lk != 77916               // 'catch' 'gt'\n       && lk != 78428               // 'catch' 'idiv'\n       && lk != 78940               // 'catch' 'if'\n       && lk != 79452               // 'catch' 'import'\n       && lk != 79964               // 'catch' 'in'\n       && lk != 80476               // 'catch' 'index'\n       && lk != 82524               // 'catch' 'insert'\n       && lk != 83036               // 'catch' 'instance'\n       && lk != 83548               // 'catch' 'integrity'\n       && lk != 84060               // 'catch' 'intersect'\n       && lk != 84572               // 'catch' 'into'\n       && lk != 85084               // 'catch' 'is'\n       && lk != 85596               // 'catch' 'item'\n       && lk != 86108               // 'catch' 'json'\n       && lk != 86620               // 'catch' 'json-item'\n       && lk != 87132               // 'catch' 'jsoniq'\n       && lk != 88668               // 'catch' 'last'\n       && lk != 89180               // 'catch' 'lax'\n       && lk != 89692               // 'catch' 'le'\n       && lk != 90716               // 'catch' 'let'\n       && lk != 91740               // 'catch' 'loop'\n       && lk != 92764               // 'catch' 'lt'\n       && lk != 93788               // 'catch' 'mod'\n       && lk != 94300               // 'catch' 'modify'\n       && lk != 94812               // 'catch' 'module'\n       && lk != 95836               // 'catch' 'namespace'\n       && lk != 96348               // 'catch' 'namespace-node'\n       && lk != 96860               // 'catch' 'ne'\n       && lk != 99420               // 'catch' 'node'\n       && lk != 99932               // 'catch' 'nodes'\n       && lk != 100956              // 'catch' 'null'\n       && lk != 101468              // 'catch' 'object'\n       && lk != 103516              // 'catch' 'only'\n       && lk != 104028              // 'catch' 'option'\n       && lk != 104540              // 'catch' 'or'\n       && lk != 105052              // 'catch' 'order'\n       && lk != 105564              // 'catch' 'ordered'\n       && lk != 106076              // 'catch' 'ordering'\n       && lk != 107612              // 'catch' 'parent'\n       && lk != 110684              // 'catch' 'preceding'\n       && lk != 111196              // 'catch' 'preceding-sibling'\n       && lk != 112732              // 'catch' 'processing-instruction'\n       && lk != 113756              // 'catch' 'rename'\n       && lk != 114268              // 'catch' 'replace'\n       && lk != 114780              // 'catch' 'return'\n       && lk != 115292              // 'catch' 'returning'\n       && lk != 115804              // 'catch' 'revalidation'\n       && lk != 116828              // 'catch' 'satisfies'\n       && lk != 117340              // 'catch' 'schema'\n       && lk != 117852              // 'catch' 'schema-attribute'\n       && lk != 118364              // 'catch' 'schema-element'\n       && lk != 118876              // 'catch' 'score'\n       && lk != 119388              // 'catch' 'select'\n       && lk != 119900              // 'catch' 'self'\n       && lk != 122460              // 'catch' 'sliding'\n       && lk != 122972              // 'catch' 'some'\n       && lk != 123484              // 'catch' 'stable'\n       && lk != 123996              // 'catch' 'start'\n       && lk != 125532              // 'catch' 'strict'\n       && lk != 126556              // 'catch' 'structured-item'\n       && lk != 127068              // 'catch' 'switch'\n       && lk != 127580              // 'catch' 'text'\n       && lk != 129628              // 'catch' 'to'\n       && lk != 130140              // 'catch' 'treat'\n       && lk != 130652              // 'catch' 'true'\n       && lk != 131164              // 'catch' 'try'\n       && lk != 131676              // 'catch' 'tumbling'\n       && lk != 132188              // 'catch' 'type'\n       && lk != 132700              // 'catch' 'typeswitch'\n       && lk != 133212              // 'catch' 'union'\n       && lk != 134236              // 'catch' 'unordered'\n       && lk != 134748              // 'catch' 'updating'\n       && lk != 136284              // 'catch' 'validate'\n       && lk != 136796              // 'catch' 'value'\n       && lk != 137308              // 'catch' 'variable'\n       && lk != 137820              // 'catch' 'version'\n       && lk != 139356              // 'catch' 'where'\n       && lk != 139868              // 'catch' 'while'\n       && lk != 141404)             // 'catch' 'with'\n      {\n        break;\n      }\n    }\n    eventHandler.endNonterminal(\"TryCatchStatement\", e0);\n  }\n\n  function try_TryCatchStatement()\n  {\n    shiftT(256);                    // 'try'\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    try_BlockStatement();\n    for (;;)\n    {\n      lookahead1W(39);              // S^WS | '(:' | 'catch'\n      shiftT(92);                   // 'catch'\n      lookahead1W(249);             // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_CatchErrorList();\n      try_BlockStatement();\n      lookahead1W(284);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      switch (l1)\n      {\n      case 92:                      // 'catch'\n        lookahead2W(256);           // Wildcard | EQName^Token | S^WS | '#' | '(' | '(:' | 'after' | 'allowing' |\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk != 2652                // 'catch' Wildcard\n       && lk != 3164                // 'catch' EQName^Token\n       && lk != 36444               // 'catch' 'after'\n       && lk != 37468               // 'catch' 'allowing'\n       && lk != 37980               // 'catch' 'ancestor'\n       && lk != 38492               // 'catch' 'ancestor-or-self'\n       && lk != 39004               // 'catch' 'and'\n       && lk != 40028               // 'catch' 'append'\n       && lk != 40540               // 'catch' 'array'\n       && lk != 41052               // 'catch' 'as'\n       && lk != 41564               // 'catch' 'ascending'\n       && lk != 42076               // 'catch' 'at'\n       && lk != 42588               // 'catch' 'attribute'\n       && lk != 43100               // 'catch' 'base-uri'\n       && lk != 43612               // 'catch' 'before'\n       && lk != 44124               // 'catch' 'boundary-space'\n       && lk != 44636               // 'catch' 'break'\n       && lk != 45660               // 'catch' 'case'\n       && lk != 46172               // 'catch' 'cast'\n       && lk != 46684               // 'catch' 'castable'\n       && lk != 47196               // 'catch' 'catch'\n       && lk != 48220               // 'catch' 'child'\n       && lk != 48732               // 'catch' 'collation'\n       && lk != 49756               // 'catch' 'comment'\n       && lk != 50268               // 'catch' 'constraint'\n       && lk != 50780               // 'catch' 'construction'\n       && lk != 52316               // 'catch' 'context'\n       && lk != 52828               // 'catch' 'continue'\n       && lk != 53340               // 'catch' 'copy'\n       && lk != 53852               // 'catch' 'copy-namespaces'\n       && lk != 54364               // 'catch' 'count'\n       && lk != 54876               // 'catch' 'decimal-format'\n       && lk != 55900               // 'catch' 'declare'\n       && lk != 56412               // 'catch' 'default'\n       && lk != 56924               // 'catch' 'delete'\n       && lk != 57436               // 'catch' 'descendant'\n       && lk != 57948               // 'catch' 'descendant-or-self'\n       && lk != 58460               // 'catch' 'descending'\n       && lk != 61020               // 'catch' 'div'\n       && lk != 61532               // 'catch' 'document'\n       && lk != 62044               // 'catch' 'document-node'\n       && lk != 62556               // 'catch' 'element'\n       && lk != 63068               // 'catch' 'else'\n       && lk != 63580               // 'catch' 'empty'\n       && lk != 64092               // 'catch' 'empty-sequence'\n       && lk != 64604               // 'catch' 'encoding'\n       && lk != 65116               // 'catch' 'end'\n       && lk != 66140               // 'catch' 'eq'\n       && lk != 66652               // 'catch' 'every'\n       && lk != 67676               // 'catch' 'except'\n       && lk != 68188               // 'catch' 'exit'\n       && lk != 68700               // 'catch' 'external'\n       && lk != 69212               // 'catch' 'false'\n       && lk != 69724               // 'catch' 'first'\n       && lk != 70236               // 'catch' 'following'\n       && lk != 70748               // 'catch' 'following-sibling'\n       && lk != 71260               // 'catch' 'for'\n       && lk != 72796               // 'catch' 'from'\n       && lk != 73308               // 'catch' 'ft-option'\n       && lk != 75356               // 'catch' 'function'\n       && lk != 75868               // 'catch' 'ge'\n       && lk != 76892               // 'catch' 'group'\n       && lk != 77916               // 'catch' 'gt'\n       && lk != 78428               // 'catch' 'idiv'\n       && lk != 78940               // 'catch' 'if'\n       && lk != 79452               // 'catch' 'import'\n       && lk != 79964               // 'catch' 'in'\n       && lk != 80476               // 'catch' 'index'\n       && lk != 82524               // 'catch' 'insert'\n       && lk != 83036               // 'catch' 'instance'\n       && lk != 83548               // 'catch' 'integrity'\n       && lk != 84060               // 'catch' 'intersect'\n       && lk != 84572               // 'catch' 'into'\n       && lk != 85084               // 'catch' 'is'\n       && lk != 85596               // 'catch' 'item'\n       && lk != 86108               // 'catch' 'json'\n       && lk != 86620               // 'catch' 'json-item'\n       && lk != 87132               // 'catch' 'jsoniq'\n       && lk != 88668               // 'catch' 'last'\n       && lk != 89180               // 'catch' 'lax'\n       && lk != 89692               // 'catch' 'le'\n       && lk != 90716               // 'catch' 'let'\n       && lk != 91740               // 'catch' 'loop'\n       && lk != 92764               // 'catch' 'lt'\n       && lk != 93788               // 'catch' 'mod'\n       && lk != 94300               // 'catch' 'modify'\n       && lk != 94812               // 'catch' 'module'\n       && lk != 95836               // 'catch' 'namespace'\n       && lk != 96348               // 'catch' 'namespace-node'\n       && lk != 96860               // 'catch' 'ne'\n       && lk != 99420               // 'catch' 'node'\n       && lk != 99932               // 'catch' 'nodes'\n       && lk != 100956              // 'catch' 'null'\n       && lk != 101468              // 'catch' 'object'\n       && lk != 103516              // 'catch' 'only'\n       && lk != 104028              // 'catch' 'option'\n       && lk != 104540              // 'catch' 'or'\n       && lk != 105052              // 'catch' 'order'\n       && lk != 105564              // 'catch' 'ordered'\n       && lk != 106076              // 'catch' 'ordering'\n       && lk != 107612              // 'catch' 'parent'\n       && lk != 110684              // 'catch' 'preceding'\n       && lk != 111196              // 'catch' 'preceding-sibling'\n       && lk != 112732              // 'catch' 'processing-instruction'\n       && lk != 113756              // 'catch' 'rename'\n       && lk != 114268              // 'catch' 'replace'\n       && lk != 114780              // 'catch' 'return'\n       && lk != 115292              // 'catch' 'returning'\n       && lk != 115804              // 'catch' 'revalidation'\n       && lk != 116828              // 'catch' 'satisfies'\n       && lk != 117340              // 'catch' 'schema'\n       && lk != 117852              // 'catch' 'schema-attribute'\n       && lk != 118364              // 'catch' 'schema-element'\n       && lk != 118876              // 'catch' 'score'\n       && lk != 119388              // 'catch' 'select'\n       && lk != 119900              // 'catch' 'self'\n       && lk != 122460              // 'catch' 'sliding'\n       && lk != 122972              // 'catch' 'some'\n       && lk != 123484              // 'catch' 'stable'\n       && lk != 123996              // 'catch' 'start'\n       && lk != 125532              // 'catch' 'strict'\n       && lk != 126556              // 'catch' 'structured-item'\n       && lk != 127068              // 'catch' 'switch'\n       && lk != 127580              // 'catch' 'text'\n       && lk != 129628              // 'catch' 'to'\n       && lk != 130140              // 'catch' 'treat'\n       && lk != 130652              // 'catch' 'true'\n       && lk != 131164              // 'catch' 'try'\n       && lk != 131676              // 'catch' 'tumbling'\n       && lk != 132188              // 'catch' 'type'\n       && lk != 132700              // 'catch' 'typeswitch'\n       && lk != 133212              // 'catch' 'union'\n       && lk != 134236              // 'catch' 'unordered'\n       && lk != 134748              // 'catch' 'updating'\n       && lk != 136284              // 'catch' 'validate'\n       && lk != 136796              // 'catch' 'value'\n       && lk != 137308              // 'catch' 'variable'\n       && lk != 137820              // 'catch' 'version'\n       && lk != 139356              // 'catch' 'where'\n       && lk != 139868              // 'catch' 'while'\n       && lk != 141404)             // 'catch' 'with'\n      {\n        break;\n      }\n    }\n  }\n\n  function parse_TypeswitchStatement()\n  {\n    eventHandler.startNonterminal(\"TypeswitchStatement\", e0);\n    shift(259);                     // 'typeswitch'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(35);                      // '('\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Expr();\n    shift(38);                      // ')'\n    for (;;)\n    {\n      lookahead1W(38);              // S^WS | '(:' | 'case'\n      whitespace();\n      parse_CaseStatement();\n      lookahead1W(117);             // S^WS | '(:' | 'case' | 'default'\n      if (l1 != 89)                 // 'case'\n      {\n        break;\n      }\n    }\n    shift(110);                     // 'default'\n    lookahead1W(99);                // S^WS | '$' | '(:' | 'return'\n    if (l1 == 31)                   // '$'\n    {\n      shift(31);                    // '$'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_VarName();\n    }\n    lookahead1W(73);                // S^WS | '(:' | 'return'\n    shift(224);                     // 'return'\n    lookahead1W(271);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Statement();\n    eventHandler.endNonterminal(\"TypeswitchStatement\", e0);\n  }\n\n  function try_TypeswitchStatement()\n  {\n    shiftT(259);                    // 'typeswitch'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(35);                     // '('\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Expr();\n    shiftT(38);                     // ')'\n    for (;;)\n    {\n      lookahead1W(38);              // S^WS | '(:' | 'case'\n      try_CaseStatement();\n      lookahead1W(117);             // S^WS | '(:' | 'case' | 'default'\n      if (l1 != 89)                 // 'case'\n      {\n        break;\n      }\n    }\n    shiftT(110);                    // 'default'\n    lookahead1W(99);                // S^WS | '$' | '(:' | 'return'\n    if (l1 == 31)                   // '$'\n    {\n      shiftT(31);                   // '$'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_VarName();\n    }\n    lookahead1W(73);                // S^WS | '(:' | 'return'\n    shiftT(224);                    // 'return'\n    lookahead1W(271);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Statement();\n  }\n\n  function parse_CaseStatement()\n  {\n    eventHandler.startNonterminal(\"CaseStatement\", e0);\n    shift(89);                      // 'case'\n    lookahead1W(258);               // EQName^Token | S^WS | '$' | '%' | '(' | '(:' | 'after' | 'allowing' |\n    if (l1 == 31)                   // '$'\n    {\n      shift(31);                    // '$'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_VarName();\n      lookahead1W(33);              // S^WS | '(:' | 'as'\n      shift(80);                    // 'as'\n    }\n    lookahead1W(254);               // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_SequenceType();\n    lookahead1W(73);                // S^WS | '(:' | 'return'\n    shift(224);                     // 'return'\n    lookahead1W(271);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Statement();\n    eventHandler.endNonterminal(\"CaseStatement\", e0);\n  }\n\n  function try_CaseStatement()\n  {\n    shiftT(89);                     // 'case'\n    lookahead1W(258);               // EQName^Token | S^WS | '$' | '%' | '(' | '(:' | 'after' | 'allowing' |\n    if (l1 == 31)                   // '$'\n    {\n      shiftT(31);                   // '$'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_VarName();\n      lookahead1W(33);              // S^WS | '(:' | 'as'\n      shiftT(80);                   // 'as'\n    }\n    lookahead1W(254);               // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_SequenceType();\n    lookahead1W(73);                // S^WS | '(:' | 'return'\n    shiftT(224);                    // 'return'\n    lookahead1W(271);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Statement();\n  }\n\n  function parse_VarDeclStatement()\n  {\n    eventHandler.startNonterminal(\"VarDeclStatement\", e0);\n    for (;;)\n    {\n      lookahead1W(102);             // S^WS | '%' | '(:' | 'variable'\n      if (l1 != 33)                 // '%'\n      {\n        break;\n      }\n      whitespace();\n      parse_Annotation();\n    }\n    shift(268);                     // 'variable'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shift(31);                      // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    lookahead1W(172);               // S^WS | '(:' | ',' | ':=' | ';' | 'as'\n    if (l1 == 80)                   // 'as'\n    {\n      whitespace();\n      parse_TypeDeclaration();\n    }\n    lookahead1W(155);               // S^WS | '(:' | ',' | ':=' | ';'\n    if (l1 == 53)                   // ':='\n    {\n      shift(53);                    // ':='\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_ExprSingle();\n    }\n    for (;;)\n    {\n      if (l1 != 42)                 // ','\n      {\n        break;\n      }\n      shift(42);                    // ','\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      shift(31);                    // '$'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_VarName();\n      lookahead1W(172);             // S^WS | '(:' | ',' | ':=' | ';' | 'as'\n      if (l1 == 80)                 // 'as'\n      {\n        whitespace();\n        parse_TypeDeclaration();\n      }\n      lookahead1W(155);             // S^WS | '(:' | ',' | ':=' | ';'\n      if (l1 == 53)                 // ':='\n      {\n        shift(53);                  // ':='\n        lookahead1W(267);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        whitespace();\n        parse_ExprSingle();\n      }\n    }\n    shift(54);                      // ';'\n    eventHandler.endNonterminal(\"VarDeclStatement\", e0);\n  }\n\n  function try_VarDeclStatement()\n  {\n    for (;;)\n    {\n      lookahead1W(102);             // S^WS | '%' | '(:' | 'variable'\n      if (l1 != 33)                 // '%'\n      {\n        break;\n      }\n      try_Annotation();\n    }\n    shiftT(268);                    // 'variable'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shiftT(31);                     // '$'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n    lookahead1W(172);               // S^WS | '(:' | ',' | ':=' | ';' | 'as'\n    if (l1 == 80)                   // 'as'\n    {\n      try_TypeDeclaration();\n    }\n    lookahead1W(155);               // S^WS | '(:' | ',' | ':=' | ';'\n    if (l1 == 53)                   // ':='\n    {\n      shiftT(53);                   // ':='\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_ExprSingle();\n    }\n    for (;;)\n    {\n      if (l1 != 42)                 // ','\n      {\n        break;\n      }\n      shiftT(42);                   // ','\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      shiftT(31);                   // '$'\n      lookahead1W(246);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_VarName();\n      lookahead1W(172);             // S^WS | '(:' | ',' | ':=' | ';' | 'as'\n      if (l1 == 80)                 // 'as'\n      {\n        try_TypeDeclaration();\n      }\n      lookahead1W(155);             // S^WS | '(:' | ',' | ':=' | ';'\n      if (l1 == 53)                 // ':='\n      {\n        shiftT(53);                 // ':='\n        lookahead1W(267);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        try_ExprSingle();\n      }\n    }\n    shiftT(54);                     // ';'\n  }\n\n  function parse_WhileStatement()\n  {\n    eventHandler.startNonterminal(\"WhileStatement\", e0);\n    shift(273);                     // 'while'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(35);                      // '('\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Expr();\n    shift(38);                      // ')'\n    lookahead1W(271);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_Statement();\n    eventHandler.endNonterminal(\"WhileStatement\", e0);\n  }\n\n  function try_WhileStatement()\n  {\n    shiftT(273);                    // 'while'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(35);                     // '('\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Expr();\n    shiftT(38);                     // ')'\n    lookahead1W(271);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_Statement();\n  }\n\n  function parse_VoidStatement()\n  {\n    eventHandler.startNonterminal(\"VoidStatement\", e0);\n    shift(54);                      // ';'\n    eventHandler.endNonterminal(\"VoidStatement\", e0);\n  }\n\n  function try_VoidStatement()\n  {\n    shiftT(54);                     // ';'\n  }\n\n  function parse_ExprSingle()\n  {\n    eventHandler.startNonterminal(\"ExprSingle\", e0);\n    switch (l1)\n    {\n    case 139:                       // 'for'\n      lookahead2W(179);             // S^WS | '#' | '$' | '(' | '(:' | 'sliding' | 'tumbling'\n      break;\n    case 177:                       // 'let'\n      lookahead2W(166);             // S^WS | '#' | '$' | '(' | '(:' | 'score'\n      break;\n    case 256:                       // 'try'\n      lookahead2W(148);             // S^WS | '#' | '(' | '(:' | '{'\n      break;\n    case 154:                       // 'if'\n    case 248:                       // 'switch'\n    case 259:                       // 'typeswitch'\n      lookahead2W(95);              // S^WS | '#' | '(' | '(:'\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 16011:                     // 'for' '$'\n    case 16049:                     // 'let' '$'\n    case 118961:                    // 'let' 'score'\n    case 122507:                    // 'for' 'sliding'\n    case 131723:                    // 'for' 'tumbling'\n      parse_FLWORExpr();\n      break;\n    case 18074:                     // 'if' '('\n      parse_IfExpr();\n      break;\n    case 18168:                     // 'switch' '('\n      parse_SwitchExpr();\n      break;\n    case 144128:                    // 'try' '{'\n      parse_TryCatchExpr();\n      break;\n    case 18179:                     // 'typeswitch' '('\n      parse_TypeswitchExpr();\n      break;\n    default:\n      parse_ExprSimple();\n    }\n    eventHandler.endNonterminal(\"ExprSingle\", e0);\n  }\n\n  function try_ExprSingle()\n  {\n    switch (l1)\n    {\n    case 139:                       // 'for'\n      lookahead2W(179);             // S^WS | '#' | '$' | '(' | '(:' | 'sliding' | 'tumbling'\n      break;\n    case 177:                       // 'let'\n      lookahead2W(166);             // S^WS | '#' | '$' | '(' | '(:' | 'score'\n      break;\n    case 256:                       // 'try'\n      lookahead2W(148);             // S^WS | '#' | '(' | '(:' | '{'\n      break;\n    case 154:                       // 'if'\n    case 248:                       // 'switch'\n    case 259:                       // 'typeswitch'\n      lookahead2W(95);              // S^WS | '#' | '(' | '(:'\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 16011:                     // 'for' '$'\n    case 16049:                     // 'let' '$'\n    case 118961:                    // 'let' 'score'\n    case 122507:                    // 'for' 'sliding'\n    case 131723:                    // 'for' 'tumbling'\n      try_FLWORExpr();\n      break;\n    case 18074:                     // 'if' '('\n      try_IfExpr();\n      break;\n    case 18168:                     // 'switch' '('\n      try_SwitchExpr();\n      break;\n    case 144128:                    // 'try' '{'\n      try_TryCatchExpr();\n      break;\n    case 18179:                     // 'typeswitch' '('\n      try_TypeswitchExpr();\n      break;\n    default:\n      try_ExprSimple();\n    }\n  }\n\n  function parse_ExprSimple()\n  {\n    eventHandler.startNonterminal(\"ExprSimple\", e0);\n    switch (l1)\n    {\n    case 78:                        // 'append'\n      lookahead2W(269);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    case 161:                       // 'insert'\n      lookahead2W(276);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    case 223:                       // 'replace'\n      lookahead2W(170);             // S^WS | '#' | '(' | '(:' | 'node' | 'value'\n      break;\n    case 111:                       // 'delete'\n    case 222:                       // 'rename'\n      lookahead2W(261);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    case 104:                       // 'copy'\n    case 130:                       // 'every'\n    case 240:                       // 'some'\n      lookahead2W(143);             // S^WS | '#' | '$' | '(' | '(:'\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 17998                 // 'append' '('\n     || lk == 18031                 // 'delete' '('\n     || lk == 18081                 // 'insert' '('\n     || lk == 18142                 // 'rename' '('\n     || lk == 99439                 // 'delete' 'node'\n     || lk == 99489                 // 'insert' 'node'\n     || lk == 99550                 // 'rename' 'node'\n     || lk == 99951                 // 'delete' 'nodes'\n     || lk == 100001                // 'insert' 'nodes'\n     || lk == 136927)               // 'replace' 'value'\n    {\n      lk = memoized(10, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_OrExpr();\n          lk = -2;\n        }\n        catch (p2A)\n        {\n          try\n          {\n            b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n            b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n            b2 = b2A; e2 = e2A; end = e2A; }}\n            try_InsertExpr();\n            lk = -3;\n          }\n          catch (p3A)\n          {\n            try\n            {\n              b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n              b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n              b2 = b2A; e2 = e2A; end = e2A; }}\n              try_DeleteExpr();\n              lk = -4;\n            }\n            catch (p4A)\n            {\n              try\n              {\n                b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n                b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n                b2 = b2A; e2 = e2A; end = e2A; }}\n                try_RenameExpr();\n                lk = -5;\n              }\n              catch (p5A)\n              {\n                try\n                {\n                  b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n                  b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n                  b2 = b2A; e2 = e2A; end = e2A; }}\n                  try_ReplaceExpr();\n                  lk = -6;\n                }\n                catch (p6A)\n                {\n                  try\n                  {\n                    b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n                    b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n                    b2 = b2A; e2 = e2A; end = e2A; }}\n                    try_JSONDeleteExpr();\n                    lk = -8;\n                  }\n                  catch (p8A)\n                  {\n                    try\n                    {\n                      b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n                      b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n                      b2 = b2A; e2 = e2A; end = e2A; }}\n                      try_JSONInsertExpr();\n                      lk = -9;\n                    }\n                    catch (p9A)\n                    {\n                      try\n                      {\n                        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n                        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n                        b2 = b2A; e2 = e2A; end = e2A; }}\n                        try_JSONRenameExpr();\n                        lk = -10;\n                      }\n                      catch (p10A)\n                      {\n                        try\n                        {\n                          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n                          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n                          b2 = b2A; e2 = e2A; end = e2A; }}\n                          try_JSONReplaceExpr();\n                          lk = -11;\n                        }\n                        catch (p11A)\n                        {\n                          lk = -12;\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(10, e0, lk);\n      }\n    }\n    switch (lk)\n    {\n    case 16002:                     // 'every' '$'\n    case 16112:                     // 'some' '$'\n      parse_QuantifiedExpr();\n      break;\n    case -3:\n      parse_InsertExpr();\n      break;\n    case -4:\n      parse_DeleteExpr();\n      break;\n    case -5:\n      parse_RenameExpr();\n      break;\n    case -6:\n    case 99551:                     // 'replace' 'node'\n      parse_ReplaceExpr();\n      break;\n    case 15976:                     // 'copy' '$'\n      parse_TransformExpr();\n      break;\n    case -8:\n    case 3183:                      // 'delete' EQName^Token\n    case 4207:                      // 'delete' IntegerLiteral\n    case 4719:                      // 'delete' DecimalLiteral\n    case 5231:                      // 'delete' DoubleLiteral\n    case 5743:                      // 'delete' StringLiteral\n    case 15983:                     // 'delete' '$'\n    case 16495:                     // 'delete' '$$'\n    case 17007:                     // 'delete' '%'\n    case 28271:                     // 'delete' '<'\n    case 28783:                     // 'delete' '<!--'\n    case 30831:                     // 'delete' '<?'\n    case 35439:                     // 'delete' '['\n    case 36463:                     // 'delete' 'after'\n    case 37487:                     // 'delete' 'allowing'\n    case 37999:                     // 'delete' 'ancestor'\n    case 38511:                     // 'delete' 'ancestor-or-self'\n    case 39023:                     // 'delete' 'and'\n    case 40047:                     // 'delete' 'append'\n    case 40559:                     // 'delete' 'array'\n    case 41071:                     // 'delete' 'as'\n    case 41583:                     // 'delete' 'ascending'\n    case 42095:                     // 'delete' 'at'\n    case 42607:                     // 'delete' 'attribute'\n    case 43119:                     // 'delete' 'base-uri'\n    case 43631:                     // 'delete' 'before'\n    case 44143:                     // 'delete' 'boundary-space'\n    case 44655:                     // 'delete' 'break'\n    case 45679:                     // 'delete' 'case'\n    case 46191:                     // 'delete' 'cast'\n    case 46703:                     // 'delete' 'castable'\n    case 47215:                     // 'delete' 'catch'\n    case 48239:                     // 'delete' 'child'\n    case 48751:                     // 'delete' 'collation'\n    case 49775:                     // 'delete' 'comment'\n    case 50287:                     // 'delete' 'constraint'\n    case 50799:                     // 'delete' 'construction'\n    case 52335:                     // 'delete' 'context'\n    case 52847:                     // 'delete' 'continue'\n    case 53359:                     // 'delete' 'copy'\n    case 53871:                     // 'delete' 'copy-namespaces'\n    case 54383:                     // 'delete' 'count'\n    case 54895:                     // 'delete' 'decimal-format'\n    case 55919:                     // 'delete' 'declare'\n    case 56431:                     // 'delete' 'default'\n    case 56943:                     // 'delete' 'delete'\n    case 57455:                     // 'delete' 'descendant'\n    case 57967:                     // 'delete' 'descendant-or-self'\n    case 58479:                     // 'delete' 'descending'\n    case 61039:                     // 'delete' 'div'\n    case 61551:                     // 'delete' 'document'\n    case 62063:                     // 'delete' 'document-node'\n    case 62575:                     // 'delete' 'element'\n    case 63087:                     // 'delete' 'else'\n    case 63599:                     // 'delete' 'empty'\n    case 64111:                     // 'delete' 'empty-sequence'\n    case 64623:                     // 'delete' 'encoding'\n    case 65135:                     // 'delete' 'end'\n    case 66159:                     // 'delete' 'eq'\n    case 66671:                     // 'delete' 'every'\n    case 67695:                     // 'delete' 'except'\n    case 68207:                     // 'delete' 'exit'\n    case 68719:                     // 'delete' 'external'\n    case 69231:                     // 'delete' 'false'\n    case 69743:                     // 'delete' 'first'\n    case 70255:                     // 'delete' 'following'\n    case 70767:                     // 'delete' 'following-sibling'\n    case 71279:                     // 'delete' 'for'\n    case 72815:                     // 'delete' 'from'\n    case 73327:                     // 'delete' 'ft-option'\n    case 75375:                     // 'delete' 'function'\n    case 75887:                     // 'delete' 'ge'\n    case 76911:                     // 'delete' 'group'\n    case 77935:                     // 'delete' 'gt'\n    case 78447:                     // 'delete' 'idiv'\n    case 78959:                     // 'delete' 'if'\n    case 79471:                     // 'delete' 'import'\n    case 79983:                     // 'delete' 'in'\n    case 80495:                     // 'delete' 'index'\n    case 82543:                     // 'delete' 'insert'\n    case 83055:                     // 'delete' 'instance'\n    case 83567:                     // 'delete' 'integrity'\n    case 84079:                     // 'delete' 'intersect'\n    case 84591:                     // 'delete' 'into'\n    case 85103:                     // 'delete' 'is'\n    case 85615:                     // 'delete' 'item'\n    case 86127:                     // 'delete' 'json'\n    case 86639:                     // 'delete' 'json-item'\n    case 87151:                     // 'delete' 'jsoniq'\n    case 88687:                     // 'delete' 'last'\n    case 89199:                     // 'delete' 'lax'\n    case 89711:                     // 'delete' 'le'\n    case 90735:                     // 'delete' 'let'\n    case 91759:                     // 'delete' 'loop'\n    case 92783:                     // 'delete' 'lt'\n    case 93807:                     // 'delete' 'mod'\n    case 94319:                     // 'delete' 'modify'\n    case 94831:                     // 'delete' 'module'\n    case 95855:                     // 'delete' 'namespace'\n    case 96367:                     // 'delete' 'namespace-node'\n    case 96879:                     // 'delete' 'ne'\n    case 100975:                    // 'delete' 'null'\n    case 101487:                    // 'delete' 'object'\n    case 103535:                    // 'delete' 'only'\n    case 104047:                    // 'delete' 'option'\n    case 104559:                    // 'delete' 'or'\n    case 105071:                    // 'delete' 'order'\n    case 105583:                    // 'delete' 'ordered'\n    case 106095:                    // 'delete' 'ordering'\n    case 107631:                    // 'delete' 'parent'\n    case 110703:                    // 'delete' 'preceding'\n    case 111215:                    // 'delete' 'preceding-sibling'\n    case 112751:                    // 'delete' 'processing-instruction'\n    case 113775:                    // 'delete' 'rename'\n    case 114287:                    // 'delete' 'replace'\n    case 114799:                    // 'delete' 'return'\n    case 115311:                    // 'delete' 'returning'\n    case 115823:                    // 'delete' 'revalidation'\n    case 116847:                    // 'delete' 'satisfies'\n    case 117359:                    // 'delete' 'schema'\n    case 117871:                    // 'delete' 'schema-attribute'\n    case 118383:                    // 'delete' 'schema-element'\n    case 118895:                    // 'delete' 'score'\n    case 119407:                    // 'delete' 'select'\n    case 119919:                    // 'delete' 'self'\n    case 122479:                    // 'delete' 'sliding'\n    case 122991:                    // 'delete' 'some'\n    case 123503:                    // 'delete' 'stable'\n    case 124015:                    // 'delete' 'start'\n    case 125551:                    // 'delete' 'strict'\n    case 126575:                    // 'delete' 'structured-item'\n    case 127087:                    // 'delete' 'switch'\n    case 127599:                    // 'delete' 'text'\n    case 129647:                    // 'delete' 'to'\n    case 130159:                    // 'delete' 'treat'\n    case 130671:                    // 'delete' 'true'\n    case 131183:                    // 'delete' 'try'\n    case 131695:                    // 'delete' 'tumbling'\n    case 132207:                    // 'delete' 'type'\n    case 132719:                    // 'delete' 'typeswitch'\n    case 133231:                    // 'delete' 'union'\n    case 134255:                    // 'delete' 'unordered'\n    case 134767:                    // 'delete' 'updating'\n    case 136303:                    // 'delete' 'validate'\n    case 136815:                    // 'delete' 'value'\n    case 137327:                    // 'delete' 'variable'\n    case 137839:                    // 'delete' 'version'\n    case 139375:                    // 'delete' 'where'\n    case 139887:                    // 'delete' 'while'\n    case 141423:                    // 'delete' 'with'\n    case 143983:                    // 'delete' '{'\n    case 145007:                    // 'delete' '{|'\n      parse_JSONDeleteExpr();\n      break;\n    case -9:\n    case 3233:                      // 'insert' EQName^Token\n    case 4257:                      // 'insert' IntegerLiteral\n    case 4769:                      // 'insert' DecimalLiteral\n    case 5281:                      // 'insert' DoubleLiteral\n    case 5793:                      // 'insert' StringLiteral\n    case 9889:                      // 'insert' NCName^Token\n    case 16033:                     // 'insert' '$'\n    case 16545:                     // 'insert' '$$'\n    case 17057:                     // 'insert' '%'\n    case 18593:                     // 'insert' '(#'\n    case 21153:                     // 'insert' '+'\n    case 22177:                     // 'insert' '-'\n    case 24225:                     // 'insert' '/'\n    case 24737:                     // 'insert' '//'\n    case 28321:                     // 'insert' '<'\n    case 28833:                     // 'insert' '<!--'\n    case 30881:                     // 'insert' '<?'\n    case 35489:                     // 'insert' '['\n    case 36513:                     // 'insert' 'after'\n    case 37537:                     // 'insert' 'allowing'\n    case 38049:                     // 'insert' 'ancestor'\n    case 38561:                     // 'insert' 'ancestor-or-self'\n    case 39073:                     // 'insert' 'and'\n    case 40097:                     // 'insert' 'append'\n    case 40609:                     // 'insert' 'array'\n    case 41121:                     // 'insert' 'as'\n    case 41633:                     // 'insert' 'ascending'\n    case 42145:                     // 'insert' 'at'\n    case 42657:                     // 'insert' 'attribute'\n    case 43169:                     // 'insert' 'base-uri'\n    case 43681:                     // 'insert' 'before'\n    case 44193:                     // 'insert' 'boundary-space'\n    case 44705:                     // 'insert' 'break'\n    case 45729:                     // 'insert' 'case'\n    case 46241:                     // 'insert' 'cast'\n    case 46753:                     // 'insert' 'castable'\n    case 47265:                     // 'insert' 'catch'\n    case 48289:                     // 'insert' 'child'\n    case 48801:                     // 'insert' 'collation'\n    case 49825:                     // 'insert' 'comment'\n    case 50337:                     // 'insert' 'constraint'\n    case 50849:                     // 'insert' 'construction'\n    case 52385:                     // 'insert' 'context'\n    case 52897:                     // 'insert' 'continue'\n    case 53409:                     // 'insert' 'copy'\n    case 53921:                     // 'insert' 'copy-namespaces'\n    case 54433:                     // 'insert' 'count'\n    case 54945:                     // 'insert' 'decimal-format'\n    case 55969:                     // 'insert' 'declare'\n    case 56481:                     // 'insert' 'default'\n    case 56993:                     // 'insert' 'delete'\n    case 57505:                     // 'insert' 'descendant'\n    case 58017:                     // 'insert' 'descendant-or-self'\n    case 58529:                     // 'insert' 'descending'\n    case 61089:                     // 'insert' 'div'\n    case 61601:                     // 'insert' 'document'\n    case 62113:                     // 'insert' 'document-node'\n    case 62625:                     // 'insert' 'element'\n    case 63137:                     // 'insert' 'else'\n    case 63649:                     // 'insert' 'empty'\n    case 64161:                     // 'insert' 'empty-sequence'\n    case 64673:                     // 'insert' 'encoding'\n    case 65185:                     // 'insert' 'end'\n    case 66209:                     // 'insert' 'eq'\n    case 66721:                     // 'insert' 'every'\n    case 67745:                     // 'insert' 'except'\n    case 68257:                     // 'insert' 'exit'\n    case 68769:                     // 'insert' 'external'\n    case 69281:                     // 'insert' 'false'\n    case 69793:                     // 'insert' 'first'\n    case 70305:                     // 'insert' 'following'\n    case 70817:                     // 'insert' 'following-sibling'\n    case 71329:                     // 'insert' 'for'\n    case 72865:                     // 'insert' 'from'\n    case 73377:                     // 'insert' 'ft-option'\n    case 75425:                     // 'insert' 'function'\n    case 75937:                     // 'insert' 'ge'\n    case 76961:                     // 'insert' 'group'\n    case 77985:                     // 'insert' 'gt'\n    case 78497:                     // 'insert' 'idiv'\n    case 79009:                     // 'insert' 'if'\n    case 79521:                     // 'insert' 'import'\n    case 80033:                     // 'insert' 'in'\n    case 80545:                     // 'insert' 'index'\n    case 82593:                     // 'insert' 'insert'\n    case 83105:                     // 'insert' 'instance'\n    case 83617:                     // 'insert' 'integrity'\n    case 84129:                     // 'insert' 'intersect'\n    case 84641:                     // 'insert' 'into'\n    case 85153:                     // 'insert' 'is'\n    case 85665:                     // 'insert' 'item'\n    case 86177:                     // 'insert' 'json'\n    case 86689:                     // 'insert' 'json-item'\n    case 87201:                     // 'insert' 'jsoniq'\n    case 88737:                     // 'insert' 'last'\n    case 89249:                     // 'insert' 'lax'\n    case 89761:                     // 'insert' 'le'\n    case 90785:                     // 'insert' 'let'\n    case 91809:                     // 'insert' 'loop'\n    case 92833:                     // 'insert' 'lt'\n    case 93857:                     // 'insert' 'mod'\n    case 94369:                     // 'insert' 'modify'\n    case 94881:                     // 'insert' 'module'\n    case 95905:                     // 'insert' 'namespace'\n    case 96417:                     // 'insert' 'namespace-node'\n    case 96929:                     // 'insert' 'ne'\n    case 100513:                    // 'insert' 'not'\n    case 101025:                    // 'insert' 'null'\n    case 101537:                    // 'insert' 'object'\n    case 103585:                    // 'insert' 'only'\n    case 104097:                    // 'insert' 'option'\n    case 104609:                    // 'insert' 'or'\n    case 105121:                    // 'insert' 'order'\n    case 105633:                    // 'insert' 'ordered'\n    case 106145:                    // 'insert' 'ordering'\n    case 107681:                    // 'insert' 'parent'\n    case 110753:                    // 'insert' 'preceding'\n    case 111265:                    // 'insert' 'preceding-sibling'\n    case 112801:                    // 'insert' 'processing-instruction'\n    case 113825:                    // 'insert' 'rename'\n    case 114337:                    // 'insert' 'replace'\n    case 114849:                    // 'insert' 'return'\n    case 115361:                    // 'insert' 'returning'\n    case 115873:                    // 'insert' 'revalidation'\n    case 116897:                    // 'insert' 'satisfies'\n    case 117409:                    // 'insert' 'schema'\n    case 117921:                    // 'insert' 'schema-attribute'\n    case 118433:                    // 'insert' 'schema-element'\n    case 118945:                    // 'insert' 'score'\n    case 119457:                    // 'insert' 'select'\n    case 119969:                    // 'insert' 'self'\n    case 122529:                    // 'insert' 'sliding'\n    case 123041:                    // 'insert' 'some'\n    case 123553:                    // 'insert' 'stable'\n    case 124065:                    // 'insert' 'start'\n    case 125601:                    // 'insert' 'strict'\n    case 126625:                    // 'insert' 'structured-item'\n    case 127137:                    // 'insert' 'switch'\n    case 127649:                    // 'insert' 'text'\n    case 129697:                    // 'insert' 'to'\n    case 130209:                    // 'insert' 'treat'\n    case 130721:                    // 'insert' 'true'\n    case 131233:                    // 'insert' 'try'\n    case 131745:                    // 'insert' 'tumbling'\n    case 132257:                    // 'insert' 'type'\n    case 132769:                    // 'insert' 'typeswitch'\n    case 133281:                    // 'insert' 'union'\n    case 134305:                    // 'insert' 'unordered'\n    case 134817:                    // 'insert' 'updating'\n    case 136353:                    // 'insert' 'validate'\n    case 136865:                    // 'insert' 'value'\n    case 137377:                    // 'insert' 'variable'\n    case 137889:                    // 'insert' 'version'\n    case 139425:                    // 'insert' 'where'\n    case 139937:                    // 'insert' 'while'\n    case 141473:                    // 'insert' 'with'\n    case 144033:                    // 'insert' '{'\n    case 145057:                    // 'insert' '{|'\n      parse_JSONInsertExpr();\n      break;\n    case -10:\n    case 3294:                      // 'rename' EQName^Token\n    case 4318:                      // 'rename' IntegerLiteral\n    case 4830:                      // 'rename' DecimalLiteral\n    case 5342:                      // 'rename' DoubleLiteral\n    case 5854:                      // 'rename' StringLiteral\n    case 16094:                     // 'rename' '$'\n    case 16606:                     // 'rename' '$$'\n    case 17118:                     // 'rename' '%'\n    case 28382:                     // 'rename' '<'\n    case 28894:                     // 'rename' '<!--'\n    case 30942:                     // 'rename' '<?'\n    case 35550:                     // 'rename' '['\n    case 36574:                     // 'rename' 'after'\n    case 37598:                     // 'rename' 'allowing'\n    case 38110:                     // 'rename' 'ancestor'\n    case 38622:                     // 'rename' 'ancestor-or-self'\n    case 39134:                     // 'rename' 'and'\n    case 40158:                     // 'rename' 'append'\n    case 40670:                     // 'rename' 'array'\n    case 41182:                     // 'rename' 'as'\n    case 41694:                     // 'rename' 'ascending'\n    case 42206:                     // 'rename' 'at'\n    case 42718:                     // 'rename' 'attribute'\n    case 43230:                     // 'rename' 'base-uri'\n    case 43742:                     // 'rename' 'before'\n    case 44254:                     // 'rename' 'boundary-space'\n    case 44766:                     // 'rename' 'break'\n    case 45790:                     // 'rename' 'case'\n    case 46302:                     // 'rename' 'cast'\n    case 46814:                     // 'rename' 'castable'\n    case 47326:                     // 'rename' 'catch'\n    case 48350:                     // 'rename' 'child'\n    case 48862:                     // 'rename' 'collation'\n    case 49886:                     // 'rename' 'comment'\n    case 50398:                     // 'rename' 'constraint'\n    case 50910:                     // 'rename' 'construction'\n    case 52446:                     // 'rename' 'context'\n    case 52958:                     // 'rename' 'continue'\n    case 53470:                     // 'rename' 'copy'\n    case 53982:                     // 'rename' 'copy-namespaces'\n    case 54494:                     // 'rename' 'count'\n    case 55006:                     // 'rename' 'decimal-format'\n    case 56030:                     // 'rename' 'declare'\n    case 56542:                     // 'rename' 'default'\n    case 57054:                     // 'rename' 'delete'\n    case 57566:                     // 'rename' 'descendant'\n    case 58078:                     // 'rename' 'descendant-or-self'\n    case 58590:                     // 'rename' 'descending'\n    case 61150:                     // 'rename' 'div'\n    case 61662:                     // 'rename' 'document'\n    case 62174:                     // 'rename' 'document-node'\n    case 62686:                     // 'rename' 'element'\n    case 63198:                     // 'rename' 'else'\n    case 63710:                     // 'rename' 'empty'\n    case 64222:                     // 'rename' 'empty-sequence'\n    case 64734:                     // 'rename' 'encoding'\n    case 65246:                     // 'rename' 'end'\n    case 66270:                     // 'rename' 'eq'\n    case 66782:                     // 'rename' 'every'\n    case 67806:                     // 'rename' 'except'\n    case 68318:                     // 'rename' 'exit'\n    case 68830:                     // 'rename' 'external'\n    case 69342:                     // 'rename' 'false'\n    case 69854:                     // 'rename' 'first'\n    case 70366:                     // 'rename' 'following'\n    case 70878:                     // 'rename' 'following-sibling'\n    case 71390:                     // 'rename' 'for'\n    case 72926:                     // 'rename' 'from'\n    case 73438:                     // 'rename' 'ft-option'\n    case 75486:                     // 'rename' 'function'\n    case 75998:                     // 'rename' 'ge'\n    case 77022:                     // 'rename' 'group'\n    case 78046:                     // 'rename' 'gt'\n    case 78558:                     // 'rename' 'idiv'\n    case 79070:                     // 'rename' 'if'\n    case 79582:                     // 'rename' 'import'\n    case 80094:                     // 'rename' 'in'\n    case 80606:                     // 'rename' 'index'\n    case 82654:                     // 'rename' 'insert'\n    case 83166:                     // 'rename' 'instance'\n    case 83678:                     // 'rename' 'integrity'\n    case 84190:                     // 'rename' 'intersect'\n    case 84702:                     // 'rename' 'into'\n    case 85214:                     // 'rename' 'is'\n    case 85726:                     // 'rename' 'item'\n    case 86238:                     // 'rename' 'json'\n    case 86750:                     // 'rename' 'json-item'\n    case 87262:                     // 'rename' 'jsoniq'\n    case 88798:                     // 'rename' 'last'\n    case 89310:                     // 'rename' 'lax'\n    case 89822:                     // 'rename' 'le'\n    case 90846:                     // 'rename' 'let'\n    case 91870:                     // 'rename' 'loop'\n    case 92894:                     // 'rename' 'lt'\n    case 93918:                     // 'rename' 'mod'\n    case 94430:                     // 'rename' 'modify'\n    case 94942:                     // 'rename' 'module'\n    case 95966:                     // 'rename' 'namespace'\n    case 96478:                     // 'rename' 'namespace-node'\n    case 96990:                     // 'rename' 'ne'\n    case 100062:                    // 'rename' 'nodes'\n    case 101086:                    // 'rename' 'null'\n    case 101598:                    // 'rename' 'object'\n    case 103646:                    // 'rename' 'only'\n    case 104158:                    // 'rename' 'option'\n    case 104670:                    // 'rename' 'or'\n    case 105182:                    // 'rename' 'order'\n    case 105694:                    // 'rename' 'ordered'\n    case 106206:                    // 'rename' 'ordering'\n    case 107742:                    // 'rename' 'parent'\n    case 110814:                    // 'rename' 'preceding'\n    case 111326:                    // 'rename' 'preceding-sibling'\n    case 112862:                    // 'rename' 'processing-instruction'\n    case 113886:                    // 'rename' 'rename'\n    case 114398:                    // 'rename' 'replace'\n    case 114910:                    // 'rename' 'return'\n    case 115422:                    // 'rename' 'returning'\n    case 115934:                    // 'rename' 'revalidation'\n    case 116958:                    // 'rename' 'satisfies'\n    case 117470:                    // 'rename' 'schema'\n    case 117982:                    // 'rename' 'schema-attribute'\n    case 118494:                    // 'rename' 'schema-element'\n    case 119006:                    // 'rename' 'score'\n    case 119518:                    // 'rename' 'select'\n    case 120030:                    // 'rename' 'self'\n    case 122590:                    // 'rename' 'sliding'\n    case 123102:                    // 'rename' 'some'\n    case 123614:                    // 'rename' 'stable'\n    case 124126:                    // 'rename' 'start'\n    case 125662:                    // 'rename' 'strict'\n    case 126686:                    // 'rename' 'structured-item'\n    case 127198:                    // 'rename' 'switch'\n    case 127710:                    // 'rename' 'text'\n    case 129758:                    // 'rename' 'to'\n    case 130270:                    // 'rename' 'treat'\n    case 130782:                    // 'rename' 'true'\n    case 131294:                    // 'rename' 'try'\n    case 131806:                    // 'rename' 'tumbling'\n    case 132318:                    // 'rename' 'type'\n    case 132830:                    // 'rename' 'typeswitch'\n    case 133342:                    // 'rename' 'union'\n    case 134366:                    // 'rename' 'unordered'\n    case 134878:                    // 'rename' 'updating'\n    case 136414:                    // 'rename' 'validate'\n    case 136926:                    // 'rename' 'value'\n    case 137438:                    // 'rename' 'variable'\n    case 137950:                    // 'rename' 'version'\n    case 139486:                    // 'rename' 'where'\n    case 139998:                    // 'rename' 'while'\n    case 141534:                    // 'rename' 'with'\n    case 144094:                    // 'rename' '{'\n    case 145118:                    // 'rename' '{|'\n      parse_JSONRenameExpr();\n      break;\n    case -11:\n      parse_JSONReplaceExpr();\n      break;\n    case -12:\n    case 3150:                      // 'append' EQName^Token\n    case 4174:                      // 'append' IntegerLiteral\n    case 4686:                      // 'append' DecimalLiteral\n    case 5198:                      // 'append' DoubleLiteral\n    case 5710:                      // 'append' StringLiteral\n    case 15950:                     // 'append' '$'\n    case 16462:                     // 'append' '$$'\n    case 16974:                     // 'append' '%'\n    case 18510:                     // 'append' '(#'\n    case 21070:                     // 'append' '+'\n    case 22094:                     // 'append' '-'\n    case 24142:                     // 'append' '/'\n    case 24654:                     // 'append' '//'\n    case 28238:                     // 'append' '<'\n    case 28750:                     // 'append' '<!--'\n    case 30798:                     // 'append' '<?'\n    case 35406:                     // 'append' '['\n    case 36430:                     // 'append' 'after'\n    case 37454:                     // 'append' 'allowing'\n    case 37966:                     // 'append' 'ancestor'\n    case 38478:                     // 'append' 'ancestor-or-self'\n    case 38990:                     // 'append' 'and'\n    case 40014:                     // 'append' 'append'\n    case 40526:                     // 'append' 'array'\n    case 41038:                     // 'append' 'as'\n    case 41550:                     // 'append' 'ascending'\n    case 42062:                     // 'append' 'at'\n    case 42574:                     // 'append' 'attribute'\n    case 43086:                     // 'append' 'base-uri'\n    case 43598:                     // 'append' 'before'\n    case 44110:                     // 'append' 'boundary-space'\n    case 44622:                     // 'append' 'break'\n    case 45646:                     // 'append' 'case'\n    case 46158:                     // 'append' 'cast'\n    case 46670:                     // 'append' 'castable'\n    case 47182:                     // 'append' 'catch'\n    case 48206:                     // 'append' 'child'\n    case 48718:                     // 'append' 'collation'\n    case 49742:                     // 'append' 'comment'\n    case 50254:                     // 'append' 'constraint'\n    case 50766:                     // 'append' 'construction'\n    case 52302:                     // 'append' 'context'\n    case 52814:                     // 'append' 'continue'\n    case 53326:                     // 'append' 'copy'\n    case 53838:                     // 'append' 'copy-namespaces'\n    case 54350:                     // 'append' 'count'\n    case 54862:                     // 'append' 'decimal-format'\n    case 55886:                     // 'append' 'declare'\n    case 56398:                     // 'append' 'default'\n    case 56910:                     // 'append' 'delete'\n    case 57422:                     // 'append' 'descendant'\n    case 57934:                     // 'append' 'descendant-or-self'\n    case 58446:                     // 'append' 'descending'\n    case 61006:                     // 'append' 'div'\n    case 61518:                     // 'append' 'document'\n    case 62030:                     // 'append' 'document-node'\n    case 62542:                     // 'append' 'element'\n    case 63054:                     // 'append' 'else'\n    case 63566:                     // 'append' 'empty'\n    case 64078:                     // 'append' 'empty-sequence'\n    case 64590:                     // 'append' 'encoding'\n    case 65102:                     // 'append' 'end'\n    case 66126:                     // 'append' 'eq'\n    case 66638:                     // 'append' 'every'\n    case 67662:                     // 'append' 'except'\n    case 68174:                     // 'append' 'exit'\n    case 68686:                     // 'append' 'external'\n    case 69198:                     // 'append' 'false'\n    case 69710:                     // 'append' 'first'\n    case 70222:                     // 'append' 'following'\n    case 70734:                     // 'append' 'following-sibling'\n    case 71246:                     // 'append' 'for'\n    case 72782:                     // 'append' 'from'\n    case 73294:                     // 'append' 'ft-option'\n    case 75342:                     // 'append' 'function'\n    case 75854:                     // 'append' 'ge'\n    case 76878:                     // 'append' 'group'\n    case 77902:                     // 'append' 'gt'\n    case 78414:                     // 'append' 'idiv'\n    case 78926:                     // 'append' 'if'\n    case 79438:                     // 'append' 'import'\n    case 79950:                     // 'append' 'in'\n    case 80462:                     // 'append' 'index'\n    case 82510:                     // 'append' 'insert'\n    case 83022:                     // 'append' 'instance'\n    case 83534:                     // 'append' 'integrity'\n    case 84046:                     // 'append' 'intersect'\n    case 84558:                     // 'append' 'into'\n    case 85070:                     // 'append' 'is'\n    case 85582:                     // 'append' 'item'\n    case 86094:                     // 'append' 'json'\n    case 86606:                     // 'append' 'json-item'\n    case 87118:                     // 'append' 'jsoniq'\n    case 88654:                     // 'append' 'last'\n    case 89166:                     // 'append' 'lax'\n    case 89678:                     // 'append' 'le'\n    case 90702:                     // 'append' 'let'\n    case 91726:                     // 'append' 'loop'\n    case 92750:                     // 'append' 'lt'\n    case 93774:                     // 'append' 'mod'\n    case 94286:                     // 'append' 'modify'\n    case 94798:                     // 'append' 'module'\n    case 95822:                     // 'append' 'namespace'\n    case 96334:                     // 'append' 'namespace-node'\n    case 96846:                     // 'append' 'ne'\n    case 99406:                     // 'append' 'node'\n    case 99918:                     // 'append' 'nodes'\n    case 100430:                    // 'append' 'not'\n    case 100942:                    // 'append' 'null'\n    case 101454:                    // 'append' 'object'\n    case 103502:                    // 'append' 'only'\n    case 104014:                    // 'append' 'option'\n    case 104526:                    // 'append' 'or'\n    case 105038:                    // 'append' 'order'\n    case 105550:                    // 'append' 'ordered'\n    case 106062:                    // 'append' 'ordering'\n    case 107598:                    // 'append' 'parent'\n    case 110670:                    // 'append' 'preceding'\n    case 111182:                    // 'append' 'preceding-sibling'\n    case 112718:                    // 'append' 'processing-instruction'\n    case 113742:                    // 'append' 'rename'\n    case 114254:                    // 'append' 'replace'\n    case 114766:                    // 'append' 'return'\n    case 115278:                    // 'append' 'returning'\n    case 115790:                    // 'append' 'revalidation'\n    case 116814:                    // 'append' 'satisfies'\n    case 117326:                    // 'append' 'schema'\n    case 117838:                    // 'append' 'schema-attribute'\n    case 118350:                    // 'append' 'schema-element'\n    case 118862:                    // 'append' 'score'\n    case 119374:                    // 'append' 'select'\n    case 119886:                    // 'append' 'self'\n    case 122446:                    // 'append' 'sliding'\n    case 122958:                    // 'append' 'some'\n    case 123470:                    // 'append' 'stable'\n    case 123982:                    // 'append' 'start'\n    case 125518:                    // 'append' 'strict'\n    case 126542:                    // 'append' 'structured-item'\n    case 127054:                    // 'append' 'switch'\n    case 127566:                    // 'append' 'text'\n    case 129614:                    // 'append' 'to'\n    case 130126:                    // 'append' 'treat'\n    case 130638:                    // 'append' 'true'\n    case 131150:                    // 'append' 'try'\n    case 131662:                    // 'append' 'tumbling'\n    case 132174:                    // 'append' 'type'\n    case 132686:                    // 'append' 'typeswitch'\n    case 133198:                    // 'append' 'union'\n    case 134222:                    // 'append' 'unordered'\n    case 134734:                    // 'append' 'updating'\n    case 136270:                    // 'append' 'validate'\n    case 136782:                    // 'append' 'value'\n    case 137294:                    // 'append' 'variable'\n    case 137806:                    // 'append' 'version'\n    case 139342:                    // 'append' 'where'\n    case 139854:                    // 'append' 'while'\n    case 141390:                    // 'append' 'with'\n    case 143950:                    // 'append' '{'\n    case 144974:                    // 'append' '{|'\n      parse_JSONAppendExpr();\n      break;\n    default:\n      parse_OrExpr();\n    }\n    eventHandler.endNonterminal(\"ExprSimple\", e0);\n  }\n\n  function try_ExprSimple()\n  {\n    switch (l1)\n    {\n    case 78:                        // 'append'\n      lookahead2W(269);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    case 161:                       // 'insert'\n      lookahead2W(276);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    case 223:                       // 'replace'\n      lookahead2W(170);             // S^WS | '#' | '(' | '(:' | 'node' | 'value'\n      break;\n    case 111:                       // 'delete'\n    case 222:                       // 'rename'\n      lookahead2W(261);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    case 104:                       // 'copy'\n    case 130:                       // 'every'\n    case 240:                       // 'some'\n      lookahead2W(143);             // S^WS | '#' | '$' | '(' | '(:'\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 17998                 // 'append' '('\n     || lk == 18031                 // 'delete' '('\n     || lk == 18081                 // 'insert' '('\n     || lk == 18142                 // 'rename' '('\n     || lk == 99439                 // 'delete' 'node'\n     || lk == 99489                 // 'insert' 'node'\n     || lk == 99550                 // 'rename' 'node'\n     || lk == 99951                 // 'delete' 'nodes'\n     || lk == 100001                // 'insert' 'nodes'\n     || lk == 136927)               // 'replace' 'value'\n    {\n      lk = memoized(10, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_OrExpr();\n          memoize(10, e0A, -2);\n          lk = -13;\n        }\n        catch (p2A)\n        {\n          try\n          {\n            b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n            b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n            b2 = b2A; e2 = e2A; end = e2A; }}\n            try_InsertExpr();\n            memoize(10, e0A, -3);\n            lk = -13;\n          }\n          catch (p3A)\n          {\n            try\n            {\n              b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n              b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n              b2 = b2A; e2 = e2A; end = e2A; }}\n              try_DeleteExpr();\n              memoize(10, e0A, -4);\n              lk = -13;\n            }\n            catch (p4A)\n            {\n              try\n              {\n                b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n                b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n                b2 = b2A; e2 = e2A; end = e2A; }}\n                try_RenameExpr();\n                memoize(10, e0A, -5);\n                lk = -13;\n              }\n              catch (p5A)\n              {\n                try\n                {\n                  b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n                  b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n                  b2 = b2A; e2 = e2A; end = e2A; }}\n                  try_ReplaceExpr();\n                  memoize(10, e0A, -6);\n                  lk = -13;\n                }\n                catch (p6A)\n                {\n                  try\n                  {\n                    b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n                    b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n                    b2 = b2A; e2 = e2A; end = e2A; }}\n                    try_JSONDeleteExpr();\n                    memoize(10, e0A, -8);\n                    lk = -13;\n                  }\n                  catch (p8A)\n                  {\n                    try\n                    {\n                      b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n                      b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n                      b2 = b2A; e2 = e2A; end = e2A; }}\n                      try_JSONInsertExpr();\n                      memoize(10, e0A, -9);\n                      lk = -13;\n                    }\n                    catch (p9A)\n                    {\n                      try\n                      {\n                        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n                        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n                        b2 = b2A; e2 = e2A; end = e2A; }}\n                        try_JSONRenameExpr();\n                        memoize(10, e0A, -10);\n                        lk = -13;\n                      }\n                      catch (p10A)\n                      {\n                        try\n                        {\n                          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n                          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n                          b2 = b2A; e2 = e2A; end = e2A; }}\n                          try_JSONReplaceExpr();\n                          memoize(10, e0A, -11);\n                          lk = -13;\n                        }\n                        catch (p11A)\n                        {\n                          lk = -12;\n                          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n                          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n                          b2 = b2A; e2 = e2A; end = e2A; }}\n                          memoize(10, e0A, -12);\n                        }\n                      }\n                    }\n                  }\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n    switch (lk)\n    {\n    case 16002:                     // 'every' '$'\n    case 16112:                     // 'some' '$'\n      try_QuantifiedExpr();\n      break;\n    case -3:\n      try_InsertExpr();\n      break;\n    case -4:\n      try_DeleteExpr();\n      break;\n    case -5:\n      try_RenameExpr();\n      break;\n    case -6:\n    case 99551:                     // 'replace' 'node'\n      try_ReplaceExpr();\n      break;\n    case 15976:                     // 'copy' '$'\n      try_TransformExpr();\n      break;\n    case -8:\n    case 3183:                      // 'delete' EQName^Token\n    case 4207:                      // 'delete' IntegerLiteral\n    case 4719:                      // 'delete' DecimalLiteral\n    case 5231:                      // 'delete' DoubleLiteral\n    case 5743:                      // 'delete' StringLiteral\n    case 15983:                     // 'delete' '$'\n    case 16495:                     // 'delete' '$$'\n    case 17007:                     // 'delete' '%'\n    case 28271:                     // 'delete' '<'\n    case 28783:                     // 'delete' '<!--'\n    case 30831:                     // 'delete' '<?'\n    case 35439:                     // 'delete' '['\n    case 36463:                     // 'delete' 'after'\n    case 37487:                     // 'delete' 'allowing'\n    case 37999:                     // 'delete' 'ancestor'\n    case 38511:                     // 'delete' 'ancestor-or-self'\n    case 39023:                     // 'delete' 'and'\n    case 40047:                     // 'delete' 'append'\n    case 40559:                     // 'delete' 'array'\n    case 41071:                     // 'delete' 'as'\n    case 41583:                     // 'delete' 'ascending'\n    case 42095:                     // 'delete' 'at'\n    case 42607:                     // 'delete' 'attribute'\n    case 43119:                     // 'delete' 'base-uri'\n    case 43631:                     // 'delete' 'before'\n    case 44143:                     // 'delete' 'boundary-space'\n    case 44655:                     // 'delete' 'break'\n    case 45679:                     // 'delete' 'case'\n    case 46191:                     // 'delete' 'cast'\n    case 46703:                     // 'delete' 'castable'\n    case 47215:                     // 'delete' 'catch'\n    case 48239:                     // 'delete' 'child'\n    case 48751:                     // 'delete' 'collation'\n    case 49775:                     // 'delete' 'comment'\n    case 50287:                     // 'delete' 'constraint'\n    case 50799:                     // 'delete' 'construction'\n    case 52335:                     // 'delete' 'context'\n    case 52847:                     // 'delete' 'continue'\n    case 53359:                     // 'delete' 'copy'\n    case 53871:                     // 'delete' 'copy-namespaces'\n    case 54383:                     // 'delete' 'count'\n    case 54895:                     // 'delete' 'decimal-format'\n    case 55919:                     // 'delete' 'declare'\n    case 56431:                     // 'delete' 'default'\n    case 56943:                     // 'delete' 'delete'\n    case 57455:                     // 'delete' 'descendant'\n    case 57967:                     // 'delete' 'descendant-or-self'\n    case 58479:                     // 'delete' 'descending'\n    case 61039:                     // 'delete' 'div'\n    case 61551:                     // 'delete' 'document'\n    case 62063:                     // 'delete' 'document-node'\n    case 62575:                     // 'delete' 'element'\n    case 63087:                     // 'delete' 'else'\n    case 63599:                     // 'delete' 'empty'\n    case 64111:                     // 'delete' 'empty-sequence'\n    case 64623:                     // 'delete' 'encoding'\n    case 65135:                     // 'delete' 'end'\n    case 66159:                     // 'delete' 'eq'\n    case 66671:                     // 'delete' 'every'\n    case 67695:                     // 'delete' 'except'\n    case 68207:                     // 'delete' 'exit'\n    case 68719:                     // 'delete' 'external'\n    case 69231:                     // 'delete' 'false'\n    case 69743:                     // 'delete' 'first'\n    case 70255:                     // 'delete' 'following'\n    case 70767:                     // 'delete' 'following-sibling'\n    case 71279:                     // 'delete' 'for'\n    case 72815:                     // 'delete' 'from'\n    case 73327:                     // 'delete' 'ft-option'\n    case 75375:                     // 'delete' 'function'\n    case 75887:                     // 'delete' 'ge'\n    case 76911:                     // 'delete' 'group'\n    case 77935:                     // 'delete' 'gt'\n    case 78447:                     // 'delete' 'idiv'\n    case 78959:                     // 'delete' 'if'\n    case 79471:                     // 'delete' 'import'\n    case 79983:                     // 'delete' 'in'\n    case 80495:                     // 'delete' 'index'\n    case 82543:                     // 'delete' 'insert'\n    case 83055:                     // 'delete' 'instance'\n    case 83567:                     // 'delete' 'integrity'\n    case 84079:                     // 'delete' 'intersect'\n    case 84591:                     // 'delete' 'into'\n    case 85103:                     // 'delete' 'is'\n    case 85615:                     // 'delete' 'item'\n    case 86127:                     // 'delete' 'json'\n    case 86639:                     // 'delete' 'json-item'\n    case 87151:                     // 'delete' 'jsoniq'\n    case 88687:                     // 'delete' 'last'\n    case 89199:                     // 'delete' 'lax'\n    case 89711:                     // 'delete' 'le'\n    case 90735:                     // 'delete' 'let'\n    case 91759:                     // 'delete' 'loop'\n    case 92783:                     // 'delete' 'lt'\n    case 93807:                     // 'delete' 'mod'\n    case 94319:                     // 'delete' 'modify'\n    case 94831:                     // 'delete' 'module'\n    case 95855:                     // 'delete' 'namespace'\n    case 96367:                     // 'delete' 'namespace-node'\n    case 96879:                     // 'delete' 'ne'\n    case 100975:                    // 'delete' 'null'\n    case 101487:                    // 'delete' 'object'\n    case 103535:                    // 'delete' 'only'\n    case 104047:                    // 'delete' 'option'\n    case 104559:                    // 'delete' 'or'\n    case 105071:                    // 'delete' 'order'\n    case 105583:                    // 'delete' 'ordered'\n    case 106095:                    // 'delete' 'ordering'\n    case 107631:                    // 'delete' 'parent'\n    case 110703:                    // 'delete' 'preceding'\n    case 111215:                    // 'delete' 'preceding-sibling'\n    case 112751:                    // 'delete' 'processing-instruction'\n    case 113775:                    // 'delete' 'rename'\n    case 114287:                    // 'delete' 'replace'\n    case 114799:                    // 'delete' 'return'\n    case 115311:                    // 'delete' 'returning'\n    case 115823:                    // 'delete' 'revalidation'\n    case 116847:                    // 'delete' 'satisfies'\n    case 117359:                    // 'delete' 'schema'\n    case 117871:                    // 'delete' 'schema-attribute'\n    case 118383:                    // 'delete' 'schema-element'\n    case 118895:                    // 'delete' 'score'\n    case 119407:                    // 'delete' 'select'\n    case 119919:                    // 'delete' 'self'\n    case 122479:                    // 'delete' 'sliding'\n    case 122991:                    // 'delete' 'some'\n    case 123503:                    // 'delete' 'stable'\n    case 124015:                    // 'delete' 'start'\n    case 125551:                    // 'delete' 'strict'\n    case 126575:                    // 'delete' 'structured-item'\n    case 127087:                    // 'delete' 'switch'\n    case 127599:                    // 'delete' 'text'\n    case 129647:                    // 'delete' 'to'\n    case 130159:                    // 'delete' 'treat'\n    case 130671:                    // 'delete' 'true'\n    case 131183:                    // 'delete' 'try'\n    case 131695:                    // 'delete' 'tumbling'\n    case 132207:                    // 'delete' 'type'\n    case 132719:                    // 'delete' 'typeswitch'\n    case 133231:                    // 'delete' 'union'\n    case 134255:                    // 'delete' 'unordered'\n    case 134767:                    // 'delete' 'updating'\n    case 136303:                    // 'delete' 'validate'\n    case 136815:                    // 'delete' 'value'\n    case 137327:                    // 'delete' 'variable'\n    case 137839:                    // 'delete' 'version'\n    case 139375:                    // 'delete' 'where'\n    case 139887:                    // 'delete' 'while'\n    case 141423:                    // 'delete' 'with'\n    case 143983:                    // 'delete' '{'\n    case 145007:                    // 'delete' '{|'\n      try_JSONDeleteExpr();\n      break;\n    case -9:\n    case 3233:                      // 'insert' EQName^Token\n    case 4257:                      // 'insert' IntegerLiteral\n    case 4769:                      // 'insert' DecimalLiteral\n    case 5281:                      // 'insert' DoubleLiteral\n    case 5793:                      // 'insert' StringLiteral\n    case 9889:                      // 'insert' NCName^Token\n    case 16033:                     // 'insert' '$'\n    case 16545:                     // 'insert' '$$'\n    case 17057:                     // 'insert' '%'\n    case 18593:                     // 'insert' '(#'\n    case 21153:                     // 'insert' '+'\n    case 22177:                     // 'insert' '-'\n    case 24225:                     // 'insert' '/'\n    case 24737:                     // 'insert' '//'\n    case 28321:                     // 'insert' '<'\n    case 28833:                     // 'insert' '<!--'\n    case 30881:                     // 'insert' '<?'\n    case 35489:                     // 'insert' '['\n    case 36513:                     // 'insert' 'after'\n    case 37537:                     // 'insert' 'allowing'\n    case 38049:                     // 'insert' 'ancestor'\n    case 38561:                     // 'insert' 'ancestor-or-self'\n    case 39073:                     // 'insert' 'and'\n    case 40097:                     // 'insert' 'append'\n    case 40609:                     // 'insert' 'array'\n    case 41121:                     // 'insert' 'as'\n    case 41633:                     // 'insert' 'ascending'\n    case 42145:                     // 'insert' 'at'\n    case 42657:                     // 'insert' 'attribute'\n    case 43169:                     // 'insert' 'base-uri'\n    case 43681:                     // 'insert' 'before'\n    case 44193:                     // 'insert' 'boundary-space'\n    case 44705:                     // 'insert' 'break'\n    case 45729:                     // 'insert' 'case'\n    case 46241:                     // 'insert' 'cast'\n    case 46753:                     // 'insert' 'castable'\n    case 47265:                     // 'insert' 'catch'\n    case 48289:                     // 'insert' 'child'\n    case 48801:                     // 'insert' 'collation'\n    case 49825:                     // 'insert' 'comment'\n    case 50337:                     // 'insert' 'constraint'\n    case 50849:                     // 'insert' 'construction'\n    case 52385:                     // 'insert' 'context'\n    case 52897:                     // 'insert' 'continue'\n    case 53409:                     // 'insert' 'copy'\n    case 53921:                     // 'insert' 'copy-namespaces'\n    case 54433:                     // 'insert' 'count'\n    case 54945:                     // 'insert' 'decimal-format'\n    case 55969:                     // 'insert' 'declare'\n    case 56481:                     // 'insert' 'default'\n    case 56993:                     // 'insert' 'delete'\n    case 57505:                     // 'insert' 'descendant'\n    case 58017:                     // 'insert' 'descendant-or-self'\n    case 58529:                     // 'insert' 'descending'\n    case 61089:                     // 'insert' 'div'\n    case 61601:                     // 'insert' 'document'\n    case 62113:                     // 'insert' 'document-node'\n    case 62625:                     // 'insert' 'element'\n    case 63137:                     // 'insert' 'else'\n    case 63649:                     // 'insert' 'empty'\n    case 64161:                     // 'insert' 'empty-sequence'\n    case 64673:                     // 'insert' 'encoding'\n    case 65185:                     // 'insert' 'end'\n    case 66209:                     // 'insert' 'eq'\n    case 66721:                     // 'insert' 'every'\n    case 67745:                     // 'insert' 'except'\n    case 68257:                     // 'insert' 'exit'\n    case 68769:                     // 'insert' 'external'\n    case 69281:                     // 'insert' 'false'\n    case 69793:                     // 'insert' 'first'\n    case 70305:                     // 'insert' 'following'\n    case 70817:                     // 'insert' 'following-sibling'\n    case 71329:                     // 'insert' 'for'\n    case 72865:                     // 'insert' 'from'\n    case 73377:                     // 'insert' 'ft-option'\n    case 75425:                     // 'insert' 'function'\n    case 75937:                     // 'insert' 'ge'\n    case 76961:                     // 'insert' 'group'\n    case 77985:                     // 'insert' 'gt'\n    case 78497:                     // 'insert' 'idiv'\n    case 79009:                     // 'insert' 'if'\n    case 79521:                     // 'insert' 'import'\n    case 80033:                     // 'insert' 'in'\n    case 80545:                     // 'insert' 'index'\n    case 82593:                     // 'insert' 'insert'\n    case 83105:                     // 'insert' 'instance'\n    case 83617:                     // 'insert' 'integrity'\n    case 84129:                     // 'insert' 'intersect'\n    case 84641:                     // 'insert' 'into'\n    case 85153:                     // 'insert' 'is'\n    case 85665:                     // 'insert' 'item'\n    case 86177:                     // 'insert' 'json'\n    case 86689:                     // 'insert' 'json-item'\n    case 87201:                     // 'insert' 'jsoniq'\n    case 88737:                     // 'insert' 'last'\n    case 89249:                     // 'insert' 'lax'\n    case 89761:                     // 'insert' 'le'\n    case 90785:                     // 'insert' 'let'\n    case 91809:                     // 'insert' 'loop'\n    case 92833:                     // 'insert' 'lt'\n    case 93857:                     // 'insert' 'mod'\n    case 94369:                     // 'insert' 'modify'\n    case 94881:                     // 'insert' 'module'\n    case 95905:                     // 'insert' 'namespace'\n    case 96417:                     // 'insert' 'namespace-node'\n    case 96929:                     // 'insert' 'ne'\n    case 100513:                    // 'insert' 'not'\n    case 101025:                    // 'insert' 'null'\n    case 101537:                    // 'insert' 'object'\n    case 103585:                    // 'insert' 'only'\n    case 104097:                    // 'insert' 'option'\n    case 104609:                    // 'insert' 'or'\n    case 105121:                    // 'insert' 'order'\n    case 105633:                    // 'insert' 'ordered'\n    case 106145:                    // 'insert' 'ordering'\n    case 107681:                    // 'insert' 'parent'\n    case 110753:                    // 'insert' 'preceding'\n    case 111265:                    // 'insert' 'preceding-sibling'\n    case 112801:                    // 'insert' 'processing-instruction'\n    case 113825:                    // 'insert' 'rename'\n    case 114337:                    // 'insert' 'replace'\n    case 114849:                    // 'insert' 'return'\n    case 115361:                    // 'insert' 'returning'\n    case 115873:                    // 'insert' 'revalidation'\n    case 116897:                    // 'insert' 'satisfies'\n    case 117409:                    // 'insert' 'schema'\n    case 117921:                    // 'insert' 'schema-attribute'\n    case 118433:                    // 'insert' 'schema-element'\n    case 118945:                    // 'insert' 'score'\n    case 119457:                    // 'insert' 'select'\n    case 119969:                    // 'insert' 'self'\n    case 122529:                    // 'insert' 'sliding'\n    case 123041:                    // 'insert' 'some'\n    case 123553:                    // 'insert' 'stable'\n    case 124065:                    // 'insert' 'start'\n    case 125601:                    // 'insert' 'strict'\n    case 126625:                    // 'insert' 'structured-item'\n    case 127137:                    // 'insert' 'switch'\n    case 127649:                    // 'insert' 'text'\n    case 129697:                    // 'insert' 'to'\n    case 130209:                    // 'insert' 'treat'\n    case 130721:                    // 'insert' 'true'\n    case 131233:                    // 'insert' 'try'\n    case 131745:                    // 'insert' 'tumbling'\n    case 132257:                    // 'insert' 'type'\n    case 132769:                    // 'insert' 'typeswitch'\n    case 133281:                    // 'insert' 'union'\n    case 134305:                    // 'insert' 'unordered'\n    case 134817:                    // 'insert' 'updating'\n    case 136353:                    // 'insert' 'validate'\n    case 136865:                    // 'insert' 'value'\n    case 137377:                    // 'insert' 'variable'\n    case 137889:                    // 'insert' 'version'\n    case 139425:                    // 'insert' 'where'\n    case 139937:                    // 'insert' 'while'\n    case 141473:                    // 'insert' 'with'\n    case 144033:                    // 'insert' '{'\n    case 145057:                    // 'insert' '{|'\n      try_JSONInsertExpr();\n      break;\n    case -10:\n    case 3294:                      // 'rename' EQName^Token\n    case 4318:                      // 'rename' IntegerLiteral\n    case 4830:                      // 'rename' DecimalLiteral\n    case 5342:                      // 'rename' DoubleLiteral\n    case 5854:                      // 'rename' StringLiteral\n    case 16094:                     // 'rename' '$'\n    case 16606:                     // 'rename' '$$'\n    case 17118:                     // 'rename' '%'\n    case 28382:                     // 'rename' '<'\n    case 28894:                     // 'rename' '<!--'\n    case 30942:                     // 'rename' '<?'\n    case 35550:                     // 'rename' '['\n    case 36574:                     // 'rename' 'after'\n    case 37598:                     // 'rename' 'allowing'\n    case 38110:                     // 'rename' 'ancestor'\n    case 38622:                     // 'rename' 'ancestor-or-self'\n    case 39134:                     // 'rename' 'and'\n    case 40158:                     // 'rename' 'append'\n    case 40670:                     // 'rename' 'array'\n    case 41182:                     // 'rename' 'as'\n    case 41694:                     // 'rename' 'ascending'\n    case 42206:                     // 'rename' 'at'\n    case 42718:                     // 'rename' 'attribute'\n    case 43230:                     // 'rename' 'base-uri'\n    case 43742:                     // 'rename' 'before'\n    case 44254:                     // 'rename' 'boundary-space'\n    case 44766:                     // 'rename' 'break'\n    case 45790:                     // 'rename' 'case'\n    case 46302:                     // 'rename' 'cast'\n    case 46814:                     // 'rename' 'castable'\n    case 47326:                     // 'rename' 'catch'\n    case 48350:                     // 'rename' 'child'\n    case 48862:                     // 'rename' 'collation'\n    case 49886:                     // 'rename' 'comment'\n    case 50398:                     // 'rename' 'constraint'\n    case 50910:                     // 'rename' 'construction'\n    case 52446:                     // 'rename' 'context'\n    case 52958:                     // 'rename' 'continue'\n    case 53470:                     // 'rename' 'copy'\n    case 53982:                     // 'rename' 'copy-namespaces'\n    case 54494:                     // 'rename' 'count'\n    case 55006:                     // 'rename' 'decimal-format'\n    case 56030:                     // 'rename' 'declare'\n    case 56542:                     // 'rename' 'default'\n    case 57054:                     // 'rename' 'delete'\n    case 57566:                     // 'rename' 'descendant'\n    case 58078:                     // 'rename' 'descendant-or-self'\n    case 58590:                     // 'rename' 'descending'\n    case 61150:                     // 'rename' 'div'\n    case 61662:                     // 'rename' 'document'\n    case 62174:                     // 'rename' 'document-node'\n    case 62686:                     // 'rename' 'element'\n    case 63198:                     // 'rename' 'else'\n    case 63710:                     // 'rename' 'empty'\n    case 64222:                     // 'rename' 'empty-sequence'\n    case 64734:                     // 'rename' 'encoding'\n    case 65246:                     // 'rename' 'end'\n    case 66270:                     // 'rename' 'eq'\n    case 66782:                     // 'rename' 'every'\n    case 67806:                     // 'rename' 'except'\n    case 68318:                     // 'rename' 'exit'\n    case 68830:                     // 'rename' 'external'\n    case 69342:                     // 'rename' 'false'\n    case 69854:                     // 'rename' 'first'\n    case 70366:                     // 'rename' 'following'\n    case 70878:                     // 'rename' 'following-sibling'\n    case 71390:                     // 'rename' 'for'\n    case 72926:                     // 'rename' 'from'\n    case 73438:                     // 'rename' 'ft-option'\n    case 75486:                     // 'rename' 'function'\n    case 75998:                     // 'rename' 'ge'\n    case 77022:                     // 'rename' 'group'\n    case 78046:                     // 'rename' 'gt'\n    case 78558:                     // 'rename' 'idiv'\n    case 79070:                     // 'rename' 'if'\n    case 79582:                     // 'rename' 'import'\n    case 80094:                     // 'rename' 'in'\n    case 80606:                     // 'rename' 'index'\n    case 82654:                     // 'rename' 'insert'\n    case 83166:                     // 'rename' 'instance'\n    case 83678:                     // 'rename' 'integrity'\n    case 84190:                     // 'rename' 'intersect'\n    case 84702:                     // 'rename' 'into'\n    case 85214:                     // 'rename' 'is'\n    case 85726:                     // 'rename' 'item'\n    case 86238:                     // 'rename' 'json'\n    case 86750:                     // 'rename' 'json-item'\n    case 87262:                     // 'rename' 'jsoniq'\n    case 88798:                     // 'rename' 'last'\n    case 89310:                     // 'rename' 'lax'\n    case 89822:                     // 'rename' 'le'\n    case 90846:                     // 'rename' 'let'\n    case 91870:                     // 'rename' 'loop'\n    case 92894:                     // 'rename' 'lt'\n    case 93918:                     // 'rename' 'mod'\n    case 94430:                     // 'rename' 'modify'\n    case 94942:                     // 'rename' 'module'\n    case 95966:                     // 'rename' 'namespace'\n    case 96478:                     // 'rename' 'namespace-node'\n    case 96990:                     // 'rename' 'ne'\n    case 100062:                    // 'rename' 'nodes'\n    case 101086:                    // 'rename' 'null'\n    case 101598:                    // 'rename' 'object'\n    case 103646:                    // 'rename' 'only'\n    case 104158:                    // 'rename' 'option'\n    case 104670:                    // 'rename' 'or'\n    case 105182:                    // 'rename' 'order'\n    case 105694:                    // 'rename' 'ordered'\n    case 106206:                    // 'rename' 'ordering'\n    case 107742:                    // 'rename' 'parent'\n    case 110814:                    // 'rename' 'preceding'\n    case 111326:                    // 'rename' 'preceding-sibling'\n    case 112862:                    // 'rename' 'processing-instruction'\n    case 113886:                    // 'rename' 'rename'\n    case 114398:                    // 'rename' 'replace'\n    case 114910:                    // 'rename' 'return'\n    case 115422:                    // 'rename' 'returning'\n    case 115934:                    // 'rename' 'revalidation'\n    case 116958:                    // 'rename' 'satisfies'\n    case 117470:                    // 'rename' 'schema'\n    case 117982:                    // 'rename' 'schema-attribute'\n    case 118494:                    // 'rename' 'schema-element'\n    case 119006:                    // 'rename' 'score'\n    case 119518:                    // 'rename' 'select'\n    case 120030:                    // 'rename' 'self'\n    case 122590:                    // 'rename' 'sliding'\n    case 123102:                    // 'rename' 'some'\n    case 123614:                    // 'rename' 'stable'\n    case 124126:                    // 'rename' 'start'\n    case 125662:                    // 'rename' 'strict'\n    case 126686:                    // 'rename' 'structured-item'\n    case 127198:                    // 'rename' 'switch'\n    case 127710:                    // 'rename' 'text'\n    case 129758:                    // 'rename' 'to'\n    case 130270:                    // 'rename' 'treat'\n    case 130782:                    // 'rename' 'true'\n    case 131294:                    // 'rename' 'try'\n    case 131806:                    // 'rename' 'tumbling'\n    case 132318:                    // 'rename' 'type'\n    case 132830:                    // 'rename' 'typeswitch'\n    case 133342:                    // 'rename' 'union'\n    case 134366:                    // 'rename' 'unordered'\n    case 134878:                    // 'rename' 'updating'\n    case 136414:                    // 'rename' 'validate'\n    case 136926:                    // 'rename' 'value'\n    case 137438:                    // 'rename' 'variable'\n    case 137950:                    // 'rename' 'version'\n    case 139486:                    // 'rename' 'where'\n    case 139998:                    // 'rename' 'while'\n    case 141534:                    // 'rename' 'with'\n    case 144094:                    // 'rename' '{'\n    case 145118:                    // 'rename' '{|'\n      try_JSONRenameExpr();\n      break;\n    case -11:\n      try_JSONReplaceExpr();\n      break;\n    case -12:\n    case 3150:                      // 'append' EQName^Token\n    case 4174:                      // 'append' IntegerLiteral\n    case 4686:                      // 'append' DecimalLiteral\n    case 5198:                      // 'append' DoubleLiteral\n    case 5710:                      // 'append' StringLiteral\n    case 15950:                     // 'append' '$'\n    case 16462:                     // 'append' '$$'\n    case 16974:                     // 'append' '%'\n    case 18510:                     // 'append' '(#'\n    case 21070:                     // 'append' '+'\n    case 22094:                     // 'append' '-'\n    case 24142:                     // 'append' '/'\n    case 24654:                     // 'append' '//'\n    case 28238:                     // 'append' '<'\n    case 28750:                     // 'append' '<!--'\n    case 30798:                     // 'append' '<?'\n    case 35406:                     // 'append' '['\n    case 36430:                     // 'append' 'after'\n    case 37454:                     // 'append' 'allowing'\n    case 37966:                     // 'append' 'ancestor'\n    case 38478:                     // 'append' 'ancestor-or-self'\n    case 38990:                     // 'append' 'and'\n    case 40014:                     // 'append' 'append'\n    case 40526:                     // 'append' 'array'\n    case 41038:                     // 'append' 'as'\n    case 41550:                     // 'append' 'ascending'\n    case 42062:                     // 'append' 'at'\n    case 42574:                     // 'append' 'attribute'\n    case 43086:                     // 'append' 'base-uri'\n    case 43598:                     // 'append' 'before'\n    case 44110:                     // 'append' 'boundary-space'\n    case 44622:                     // 'append' 'break'\n    case 45646:                     // 'append' 'case'\n    case 46158:                     // 'append' 'cast'\n    case 46670:                     // 'append' 'castable'\n    case 47182:                     // 'append' 'catch'\n    case 48206:                     // 'append' 'child'\n    case 48718:                     // 'append' 'collation'\n    case 49742:                     // 'append' 'comment'\n    case 50254:                     // 'append' 'constraint'\n    case 50766:                     // 'append' 'construction'\n    case 52302:                     // 'append' 'context'\n    case 52814:                     // 'append' 'continue'\n    case 53326:                     // 'append' 'copy'\n    case 53838:                     // 'append' 'copy-namespaces'\n    case 54350:                     // 'append' 'count'\n    case 54862:                     // 'append' 'decimal-format'\n    case 55886:                     // 'append' 'declare'\n    case 56398:                     // 'append' 'default'\n    case 56910:                     // 'append' 'delete'\n    case 57422:                     // 'append' 'descendant'\n    case 57934:                     // 'append' 'descendant-or-self'\n    case 58446:                     // 'append' 'descending'\n    case 61006:                     // 'append' 'div'\n    case 61518:                     // 'append' 'document'\n    case 62030:                     // 'append' 'document-node'\n    case 62542:                     // 'append' 'element'\n    case 63054:                     // 'append' 'else'\n    case 63566:                     // 'append' 'empty'\n    case 64078:                     // 'append' 'empty-sequence'\n    case 64590:                     // 'append' 'encoding'\n    case 65102:                     // 'append' 'end'\n    case 66126:                     // 'append' 'eq'\n    case 66638:                     // 'append' 'every'\n    case 67662:                     // 'append' 'except'\n    case 68174:                     // 'append' 'exit'\n    case 68686:                     // 'append' 'external'\n    case 69198:                     // 'append' 'false'\n    case 69710:                     // 'append' 'first'\n    case 70222:                     // 'append' 'following'\n    case 70734:                     // 'append' 'following-sibling'\n    case 71246:                     // 'append' 'for'\n    case 72782:                     // 'append' 'from'\n    case 73294:                     // 'append' 'ft-option'\n    case 75342:                     // 'append' 'function'\n    case 75854:                     // 'append' 'ge'\n    case 76878:                     // 'append' 'group'\n    case 77902:                     // 'append' 'gt'\n    case 78414:                     // 'append' 'idiv'\n    case 78926:                     // 'append' 'if'\n    case 79438:                     // 'append' 'import'\n    case 79950:                     // 'append' 'in'\n    case 80462:                     // 'append' 'index'\n    case 82510:                     // 'append' 'insert'\n    case 83022:                     // 'append' 'instance'\n    case 83534:                     // 'append' 'integrity'\n    case 84046:                     // 'append' 'intersect'\n    case 84558:                     // 'append' 'into'\n    case 85070:                     // 'append' 'is'\n    case 85582:                     // 'append' 'item'\n    case 86094:                     // 'append' 'json'\n    case 86606:                     // 'append' 'json-item'\n    case 87118:                     // 'append' 'jsoniq'\n    case 88654:                     // 'append' 'last'\n    case 89166:                     // 'append' 'lax'\n    case 89678:                     // 'append' 'le'\n    case 90702:                     // 'append' 'let'\n    case 91726:                     // 'append' 'loop'\n    case 92750:                     // 'append' 'lt'\n    case 93774:                     // 'append' 'mod'\n    case 94286:                     // 'append' 'modify'\n    case 94798:                     // 'append' 'module'\n    case 95822:                     // 'append' 'namespace'\n    case 96334:                     // 'append' 'namespace-node'\n    case 96846:                     // 'append' 'ne'\n    case 99406:                     // 'append' 'node'\n    case 99918:                     // 'append' 'nodes'\n    case 100430:                    // 'append' 'not'\n    case 100942:                    // 'append' 'null'\n    case 101454:                    // 'append' 'object'\n    case 103502:                    // 'append' 'only'\n    case 104014:                    // 'append' 'option'\n    case 104526:                    // 'append' 'or'\n    case 105038:                    // 'append' 'order'\n    case 105550:                    // 'append' 'ordered'\n    case 106062:                    // 'append' 'ordering'\n    case 107598:                    // 'append' 'parent'\n    case 110670:                    // 'append' 'preceding'\n    case 111182:                    // 'append' 'preceding-sibling'\n    case 112718:                    // 'append' 'processing-instruction'\n    case 113742:                    // 'append' 'rename'\n    case 114254:                    // 'append' 'replace'\n    case 114766:                    // 'append' 'return'\n    case 115278:                    // 'append' 'returning'\n    case 115790:                    // 'append' 'revalidation'\n    case 116814:                    // 'append' 'satisfies'\n    case 117326:                    // 'append' 'schema'\n    case 117838:                    // 'append' 'schema-attribute'\n    case 118350:                    // 'append' 'schema-element'\n    case 118862:                    // 'append' 'score'\n    case 119374:                    // 'append' 'select'\n    case 119886:                    // 'append' 'self'\n    case 122446:                    // 'append' 'sliding'\n    case 122958:                    // 'append' 'some'\n    case 123470:                    // 'append' 'stable'\n    case 123982:                    // 'append' 'start'\n    case 125518:                    // 'append' 'strict'\n    case 126542:                    // 'append' 'structured-item'\n    case 127054:                    // 'append' 'switch'\n    case 127566:                    // 'append' 'text'\n    case 129614:                    // 'append' 'to'\n    case 130126:                    // 'append' 'treat'\n    case 130638:                    // 'append' 'true'\n    case 131150:                    // 'append' 'try'\n    case 131662:                    // 'append' 'tumbling'\n    case 132174:                    // 'append' 'type'\n    case 132686:                    // 'append' 'typeswitch'\n    case 133198:                    // 'append' 'union'\n    case 134222:                    // 'append' 'unordered'\n    case 134734:                    // 'append' 'updating'\n    case 136270:                    // 'append' 'validate'\n    case 136782:                    // 'append' 'value'\n    case 137294:                    // 'append' 'variable'\n    case 137806:                    // 'append' 'version'\n    case 139342:                    // 'append' 'where'\n    case 139854:                    // 'append' 'while'\n    case 141390:                    // 'append' 'with'\n    case 143950:                    // 'append' '{'\n    case 144974:                    // 'append' '{|'\n      try_JSONAppendExpr();\n      break;\n    case -13:\n      break;\n    default:\n      try_OrExpr();\n    }\n  }\n\n  function parse_JSONDeleteExpr()\n  {\n    eventHandler.startNonterminal(\"JSONDeleteExpr\", e0);\n    shift(111);                     // 'delete'\n    lookahead1W(260);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    switch (l1)\n    {\n    case 168:                       // 'json'\n      lookahead2W(261);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 18088)                // 'json' '('\n    {\n      lk = memoized(11, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          shiftT(168);              // 'json'\n          lk = -1;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n        }\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(11, e0, lk);\n      }\n    }\n    if (lk == -1\n     || lk == 3240                  // 'json' EQName^Token\n     || lk == 4264                  // 'json' IntegerLiteral\n     || lk == 4776                  // 'json' DecimalLiteral\n     || lk == 5288                  // 'json' DoubleLiteral\n     || lk == 5800                  // 'json' StringLiteral\n     || lk == 16040                 // 'json' '$'\n     || lk == 16552                 // 'json' '$$'\n     || lk == 17064                 // 'json' '%'\n     || lk == 28328                 // 'json' '<'\n     || lk == 28840                 // 'json' '<!--'\n     || lk == 30888                 // 'json' '<?'\n     || lk == 35496                 // 'json' '['\n     || lk == 36520                 // 'json' 'after'\n     || lk == 37544                 // 'json' 'allowing'\n     || lk == 38056                 // 'json' 'ancestor'\n     || lk == 38568                 // 'json' 'ancestor-or-self'\n     || lk == 39080                 // 'json' 'and'\n     || lk == 40104                 // 'json' 'append'\n     || lk == 40616                 // 'json' 'array'\n     || lk == 41128                 // 'json' 'as'\n     || lk == 41640                 // 'json' 'ascending'\n     || lk == 42152                 // 'json' 'at'\n     || lk == 42664                 // 'json' 'attribute'\n     || lk == 43176                 // 'json' 'base-uri'\n     || lk == 43688                 // 'json' 'before'\n     || lk == 44200                 // 'json' 'boundary-space'\n     || lk == 44712                 // 'json' 'break'\n     || lk == 45736                 // 'json' 'case'\n     || lk == 46248                 // 'json' 'cast'\n     || lk == 46760                 // 'json' 'castable'\n     || lk == 47272                 // 'json' 'catch'\n     || lk == 48296                 // 'json' 'child'\n     || lk == 48808                 // 'json' 'collation'\n     || lk == 49832                 // 'json' 'comment'\n     || lk == 50344                 // 'json' 'constraint'\n     || lk == 50856                 // 'json' 'construction'\n     || lk == 52392                 // 'json' 'context'\n     || lk == 52904                 // 'json' 'continue'\n     || lk == 53416                 // 'json' 'copy'\n     || lk == 53928                 // 'json' 'copy-namespaces'\n     || lk == 54440                 // 'json' 'count'\n     || lk == 54952                 // 'json' 'decimal-format'\n     || lk == 55976                 // 'json' 'declare'\n     || lk == 56488                 // 'json' 'default'\n     || lk == 57000                 // 'json' 'delete'\n     || lk == 57512                 // 'json' 'descendant'\n     || lk == 58024                 // 'json' 'descendant-or-self'\n     || lk == 58536                 // 'json' 'descending'\n     || lk == 61096                 // 'json' 'div'\n     || lk == 61608                 // 'json' 'document'\n     || lk == 62120                 // 'json' 'document-node'\n     || lk == 62632                 // 'json' 'element'\n     || lk == 63144                 // 'json' 'else'\n     || lk == 63656                 // 'json' 'empty'\n     || lk == 64168                 // 'json' 'empty-sequence'\n     || lk == 64680                 // 'json' 'encoding'\n     || lk == 65192                 // 'json' 'end'\n     || lk == 66216                 // 'json' 'eq'\n     || lk == 66728                 // 'json' 'every'\n     || lk == 67752                 // 'json' 'except'\n     || lk == 68264                 // 'json' 'exit'\n     || lk == 68776                 // 'json' 'external'\n     || lk == 69288                 // 'json' 'false'\n     || lk == 69800                 // 'json' 'first'\n     || lk == 70312                 // 'json' 'following'\n     || lk == 70824                 // 'json' 'following-sibling'\n     || lk == 71336                 // 'json' 'for'\n     || lk == 72872                 // 'json' 'from'\n     || lk == 73384                 // 'json' 'ft-option'\n     || lk == 75432                 // 'json' 'function'\n     || lk == 75944                 // 'json' 'ge'\n     || lk == 76968                 // 'json' 'group'\n     || lk == 77992                 // 'json' 'gt'\n     || lk == 78504                 // 'json' 'idiv'\n     || lk == 79016                 // 'json' 'if'\n     || lk == 79528                 // 'json' 'import'\n     || lk == 80040                 // 'json' 'in'\n     || lk == 80552                 // 'json' 'index'\n     || lk == 82600                 // 'json' 'insert'\n     || lk == 83112                 // 'json' 'instance'\n     || lk == 83624                 // 'json' 'integrity'\n     || lk == 84136                 // 'json' 'intersect'\n     || lk == 84648                 // 'json' 'into'\n     || lk == 85160                 // 'json' 'is'\n     || lk == 85672                 // 'json' 'item'\n     || lk == 86184                 // 'json' 'json'\n     || lk == 86696                 // 'json' 'json-item'\n     || lk == 87208                 // 'json' 'jsoniq'\n     || lk == 88744                 // 'json' 'last'\n     || lk == 89256                 // 'json' 'lax'\n     || lk == 89768                 // 'json' 'le'\n     || lk == 90792                 // 'json' 'let'\n     || lk == 91816                 // 'json' 'loop'\n     || lk == 92840                 // 'json' 'lt'\n     || lk == 93864                 // 'json' 'mod'\n     || lk == 94376                 // 'json' 'modify'\n     || lk == 94888                 // 'json' 'module'\n     || lk == 95912                 // 'json' 'namespace'\n     || lk == 96424                 // 'json' 'namespace-node'\n     || lk == 96936                 // 'json' 'ne'\n     || lk == 99496                 // 'json' 'node'\n     || lk == 100008                // 'json' 'nodes'\n     || lk == 101032                // 'json' 'null'\n     || lk == 101544                // 'json' 'object'\n     || lk == 103592                // 'json' 'only'\n     || lk == 104104                // 'json' 'option'\n     || lk == 104616                // 'json' 'or'\n     || lk == 105128                // 'json' 'order'\n     || lk == 105640                // 'json' 'ordered'\n     || lk == 106152                // 'json' 'ordering'\n     || lk == 107688                // 'json' 'parent'\n     || lk == 110760                // 'json' 'preceding'\n     || lk == 111272                // 'json' 'preceding-sibling'\n     || lk == 112808                // 'json' 'processing-instruction'\n     || lk == 113832                // 'json' 'rename'\n     || lk == 114344                // 'json' 'replace'\n     || lk == 114856                // 'json' 'return'\n     || lk == 115368                // 'json' 'returning'\n     || lk == 115880                // 'json' 'revalidation'\n     || lk == 116904                // 'json' 'satisfies'\n     || lk == 117416                // 'json' 'schema'\n     || lk == 117928                // 'json' 'schema-attribute'\n     || lk == 118440                // 'json' 'schema-element'\n     || lk == 118952                // 'json' 'score'\n     || lk == 119464                // 'json' 'select'\n     || lk == 119976                // 'json' 'self'\n     || lk == 122536                // 'json' 'sliding'\n     || lk == 123048                // 'json' 'some'\n     || lk == 123560                // 'json' 'stable'\n     || lk == 124072                // 'json' 'start'\n     || lk == 125608                // 'json' 'strict'\n     || lk == 126632                // 'json' 'structured-item'\n     || lk == 127144                // 'json' 'switch'\n     || lk == 127656                // 'json' 'text'\n     || lk == 129704                // 'json' 'to'\n     || lk == 130216                // 'json' 'treat'\n     || lk == 130728                // 'json' 'true'\n     || lk == 131240                // 'json' 'try'\n     || lk == 131752                // 'json' 'tumbling'\n     || lk == 132264                // 'json' 'type'\n     || lk == 132776                // 'json' 'typeswitch'\n     || lk == 133288                // 'json' 'union'\n     || lk == 134312                // 'json' 'unordered'\n     || lk == 134824                // 'json' 'updating'\n     || lk == 136360                // 'json' 'validate'\n     || lk == 136872                // 'json' 'value'\n     || lk == 137384                // 'json' 'variable'\n     || lk == 137896                // 'json' 'version'\n     || lk == 139432                // 'json' 'where'\n     || lk == 139944                // 'json' 'while'\n     || lk == 141480                // 'json' 'with'\n     || lk == 144040                // 'json' '{'\n     || lk == 145064)               // 'json' '{|'\n    {\n      shift(168);                   // 'json'\n    }\n    lookahead1W(260);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_PostfixExpr();\n    eventHandler.endNonterminal(\"JSONDeleteExpr\", e0);\n  }\n\n  function try_JSONDeleteExpr()\n  {\n    shiftT(111);                    // 'delete'\n    lookahead1W(260);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    switch (l1)\n    {\n    case 168:                       // 'json'\n      lookahead2W(261);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 18088)                // 'json' '('\n    {\n      lk = memoized(11, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          shiftT(168);              // 'json'\n          memoize(11, e0A, -1);\n        }\n        catch (p1A)\n        {\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(11, e0A, -2);\n        }\n        lk = -2;\n      }\n    }\n    if (lk == -1\n     || lk == 3240                  // 'json' EQName^Token\n     || lk == 4264                  // 'json' IntegerLiteral\n     || lk == 4776                  // 'json' DecimalLiteral\n     || lk == 5288                  // 'json' DoubleLiteral\n     || lk == 5800                  // 'json' StringLiteral\n     || lk == 16040                 // 'json' '$'\n     || lk == 16552                 // 'json' '$$'\n     || lk == 17064                 // 'json' '%'\n     || lk == 28328                 // 'json' '<'\n     || lk == 28840                 // 'json' '<!--'\n     || lk == 30888                 // 'json' '<?'\n     || lk == 35496                 // 'json' '['\n     || lk == 36520                 // 'json' 'after'\n     || lk == 37544                 // 'json' 'allowing'\n     || lk == 38056                 // 'json' 'ancestor'\n     || lk == 38568                 // 'json' 'ancestor-or-self'\n     || lk == 39080                 // 'json' 'and'\n     || lk == 40104                 // 'json' 'append'\n     || lk == 40616                 // 'json' 'array'\n     || lk == 41128                 // 'json' 'as'\n     || lk == 41640                 // 'json' 'ascending'\n     || lk == 42152                 // 'json' 'at'\n     || lk == 42664                 // 'json' 'attribute'\n     || lk == 43176                 // 'json' 'base-uri'\n     || lk == 43688                 // 'json' 'before'\n     || lk == 44200                 // 'json' 'boundary-space'\n     || lk == 44712                 // 'json' 'break'\n     || lk == 45736                 // 'json' 'case'\n     || lk == 46248                 // 'json' 'cast'\n     || lk == 46760                 // 'json' 'castable'\n     || lk == 47272                 // 'json' 'catch'\n     || lk == 48296                 // 'json' 'child'\n     || lk == 48808                 // 'json' 'collation'\n     || lk == 49832                 // 'json' 'comment'\n     || lk == 50344                 // 'json' 'constraint'\n     || lk == 50856                 // 'json' 'construction'\n     || lk == 52392                 // 'json' 'context'\n     || lk == 52904                 // 'json' 'continue'\n     || lk == 53416                 // 'json' 'copy'\n     || lk == 53928                 // 'json' 'copy-namespaces'\n     || lk == 54440                 // 'json' 'count'\n     || lk == 54952                 // 'json' 'decimal-format'\n     || lk == 55976                 // 'json' 'declare'\n     || lk == 56488                 // 'json' 'default'\n     || lk == 57000                 // 'json' 'delete'\n     || lk == 57512                 // 'json' 'descendant'\n     || lk == 58024                 // 'json' 'descendant-or-self'\n     || lk == 58536                 // 'json' 'descending'\n     || lk == 61096                 // 'json' 'div'\n     || lk == 61608                 // 'json' 'document'\n     || lk == 62120                 // 'json' 'document-node'\n     || lk == 62632                 // 'json' 'element'\n     || lk == 63144                 // 'json' 'else'\n     || lk == 63656                 // 'json' 'empty'\n     || lk == 64168                 // 'json' 'empty-sequence'\n     || lk == 64680                 // 'json' 'encoding'\n     || lk == 65192                 // 'json' 'end'\n     || lk == 66216                 // 'json' 'eq'\n     || lk == 66728                 // 'json' 'every'\n     || lk == 67752                 // 'json' 'except'\n     || lk == 68264                 // 'json' 'exit'\n     || lk == 68776                 // 'json' 'external'\n     || lk == 69288                 // 'json' 'false'\n     || lk == 69800                 // 'json' 'first'\n     || lk == 70312                 // 'json' 'following'\n     || lk == 70824                 // 'json' 'following-sibling'\n     || lk == 71336                 // 'json' 'for'\n     || lk == 72872                 // 'json' 'from'\n     || lk == 73384                 // 'json' 'ft-option'\n     || lk == 75432                 // 'json' 'function'\n     || lk == 75944                 // 'json' 'ge'\n     || lk == 76968                 // 'json' 'group'\n     || lk == 77992                 // 'json' 'gt'\n     || lk == 78504                 // 'json' 'idiv'\n     || lk == 79016                 // 'json' 'if'\n     || lk == 79528                 // 'json' 'import'\n     || lk == 80040                 // 'json' 'in'\n     || lk == 80552                 // 'json' 'index'\n     || lk == 82600                 // 'json' 'insert'\n     || lk == 83112                 // 'json' 'instance'\n     || lk == 83624                 // 'json' 'integrity'\n     || lk == 84136                 // 'json' 'intersect'\n     || lk == 84648                 // 'json' 'into'\n     || lk == 85160                 // 'json' 'is'\n     || lk == 85672                 // 'json' 'item'\n     || lk == 86184                 // 'json' 'json'\n     || lk == 86696                 // 'json' 'json-item'\n     || lk == 87208                 // 'json' 'jsoniq'\n     || lk == 88744                 // 'json' 'last'\n     || lk == 89256                 // 'json' 'lax'\n     || lk == 89768                 // 'json' 'le'\n     || lk == 90792                 // 'json' 'let'\n     || lk == 91816                 // 'json' 'loop'\n     || lk == 92840                 // 'json' 'lt'\n     || lk == 93864                 // 'json' 'mod'\n     || lk == 94376                 // 'json' 'modify'\n     || lk == 94888                 // 'json' 'module'\n     || lk == 95912                 // 'json' 'namespace'\n     || lk == 96424                 // 'json' 'namespace-node'\n     || lk == 96936                 // 'json' 'ne'\n     || lk == 99496                 // 'json' 'node'\n     || lk == 100008                // 'json' 'nodes'\n     || lk == 101032                // 'json' 'null'\n     || lk == 101544                // 'json' 'object'\n     || lk == 103592                // 'json' 'only'\n     || lk == 104104                // 'json' 'option'\n     || lk == 104616                // 'json' 'or'\n     || lk == 105128                // 'json' 'order'\n     || lk == 105640                // 'json' 'ordered'\n     || lk == 106152                // 'json' 'ordering'\n     || lk == 107688                // 'json' 'parent'\n     || lk == 110760                // 'json' 'preceding'\n     || lk == 111272                // 'json' 'preceding-sibling'\n     || lk == 112808                // 'json' 'processing-instruction'\n     || lk == 113832                // 'json' 'rename'\n     || lk == 114344                // 'json' 'replace'\n     || lk == 114856                // 'json' 'return'\n     || lk == 115368                // 'json' 'returning'\n     || lk == 115880                // 'json' 'revalidation'\n     || lk == 116904                // 'json' 'satisfies'\n     || lk == 117416                // 'json' 'schema'\n     || lk == 117928                // 'json' 'schema-attribute'\n     || lk == 118440                // 'json' 'schema-element'\n     || lk == 118952                // 'json' 'score'\n     || lk == 119464                // 'json' 'select'\n     || lk == 119976                // 'json' 'self'\n     || lk == 122536                // 'json' 'sliding'\n     || lk == 123048                // 'json' 'some'\n     || lk == 123560                // 'json' 'stable'\n     || lk == 124072                // 'json' 'start'\n     || lk == 125608                // 'json' 'strict'\n     || lk == 126632                // 'json' 'structured-item'\n     || lk == 127144                // 'json' 'switch'\n     || lk == 127656                // 'json' 'text'\n     || lk == 129704                // 'json' 'to'\n     || lk == 130216                // 'json' 'treat'\n     || lk == 130728                // 'json' 'true'\n     || lk == 131240                // 'json' 'try'\n     || lk == 131752                // 'json' 'tumbling'\n     || lk == 132264                // 'json' 'type'\n     || lk == 132776                // 'json' 'typeswitch'\n     || lk == 133288                // 'json' 'union'\n     || lk == 134312                // 'json' 'unordered'\n     || lk == 134824                // 'json' 'updating'\n     || lk == 136360                // 'json' 'validate'\n     || lk == 136872                // 'json' 'value'\n     || lk == 137384                // 'json' 'variable'\n     || lk == 137896                // 'json' 'version'\n     || lk == 139432                // 'json' 'where'\n     || lk == 139944                // 'json' 'while'\n     || lk == 141480                // 'json' 'with'\n     || lk == 144040                // 'json' '{'\n     || lk == 145064)               // 'json' '{|'\n    {\n      shiftT(168);                  // 'json'\n    }\n    lookahead1W(260);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_PostfixExpr();\n  }\n\n  function parse_JSONInsertExpr()\n  {\n    eventHandler.startNonterminal(\"JSONInsertExpr\", e0);\n    switch (l1)\n    {\n    case 161:                       // 'insert'\n      lookahead2W(268);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk != 9889)                 // 'insert' NCName^Token\n    {\n      lk = memoized(12, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          shiftT(161);              // 'insert'\n          lookahead1W(267);         // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n          switch (l1)\n          {\n          case 168:                 // 'json'\n            lookahead2W(269);       // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n            break;\n          default:\n            lk = l1;\n          }\n          if (lk == 18088)          // 'json' '('\n          {\n            lk = memoized(13, e0);\n            if (lk == 0)\n            {\n              var b0B = b0; var e0B = e0; var l1B = l1;\n              var b1B = b1; var e1B = e1; var l2B = l2;\n              var b2B = b2; var e2B = e2;\n              try\n              {\n                shiftT(168);        // 'json'\n                memoize(13, e0B, -1);\n              }\n              catch (p1B)\n              {\n                b0 = b0B; e0 = e0B; l1 = l1B; if (l1 == 0) {end = e0B;} else {\n                b1 = b1B; e1 = e1B; l2 = l2B; if (l2 == 0) {end = e1B;} else {\n                b2 = b2B; e2 = e2B; end = e2B; }}\n                memoize(13, e0B, -2);\n              }\n              lk = -2;\n            }\n          }\n          if (lk == -1\n           || lk == 3240            // 'json' EQName^Token\n           || lk == 4264            // 'json' IntegerLiteral\n           || lk == 4776            // 'json' DecimalLiteral\n           || lk == 5288            // 'json' DoubleLiteral\n           || lk == 5800            // 'json' StringLiteral\n           || lk == 16040           // 'json' '$'\n           || lk == 16552           // 'json' '$$'\n           || lk == 17064           // 'json' '%'\n           || lk == 18600           // 'json' '(#'\n           || lk == 21160           // 'json' '+'\n           || lk == 22184           // 'json' '-'\n           || lk == 24232           // 'json' '/'\n           || lk == 24744           // 'json' '//'\n           || lk == 28328           // 'json' '<'\n           || lk == 28840           // 'json' '<!--'\n           || lk == 30888           // 'json' '<?'\n           || lk == 35496           // 'json' '['\n           || lk == 36520           // 'json' 'after'\n           || lk == 37544           // 'json' 'allowing'\n           || lk == 38056           // 'json' 'ancestor'\n           || lk == 38568           // 'json' 'ancestor-or-self'\n           || lk == 39080           // 'json' 'and'\n           || lk == 40104           // 'json' 'append'\n           || lk == 40616           // 'json' 'array'\n           || lk == 41128           // 'json' 'as'\n           || lk == 41640           // 'json' 'ascending'\n           || lk == 42152           // 'json' 'at'\n           || lk == 42664           // 'json' 'attribute'\n           || lk == 43176           // 'json' 'base-uri'\n           || lk == 43688           // 'json' 'before'\n           || lk == 44200           // 'json' 'boundary-space'\n           || lk == 44712           // 'json' 'break'\n           || lk == 45736           // 'json' 'case'\n           || lk == 46248           // 'json' 'cast'\n           || lk == 46760           // 'json' 'castable'\n           || lk == 47272           // 'json' 'catch'\n           || lk == 48296           // 'json' 'child'\n           || lk == 48808           // 'json' 'collation'\n           || lk == 49832           // 'json' 'comment'\n           || lk == 50344           // 'json' 'constraint'\n           || lk == 50856           // 'json' 'construction'\n           || lk == 52392           // 'json' 'context'\n           || lk == 52904           // 'json' 'continue'\n           || lk == 53416           // 'json' 'copy'\n           || lk == 53928           // 'json' 'copy-namespaces'\n           || lk == 54440           // 'json' 'count'\n           || lk == 54952           // 'json' 'decimal-format'\n           || lk == 55976           // 'json' 'declare'\n           || lk == 56488           // 'json' 'default'\n           || lk == 57000           // 'json' 'delete'\n           || lk == 57512           // 'json' 'descendant'\n           || lk == 58024           // 'json' 'descendant-or-self'\n           || lk == 58536           // 'json' 'descending'\n           || lk == 61096           // 'json' 'div'\n           || lk == 61608           // 'json' 'document'\n           || lk == 62120           // 'json' 'document-node'\n           || lk == 62632           // 'json' 'element'\n           || lk == 63144           // 'json' 'else'\n           || lk == 63656           // 'json' 'empty'\n           || lk == 64168           // 'json' 'empty-sequence'\n           || lk == 64680           // 'json' 'encoding'\n           || lk == 65192           // 'json' 'end'\n           || lk == 66216           // 'json' 'eq'\n           || lk == 66728           // 'json' 'every'\n           || lk == 67752           // 'json' 'except'\n           || lk == 68264           // 'json' 'exit'\n           || lk == 68776           // 'json' 'external'\n           || lk == 69288           // 'json' 'false'\n           || lk == 69800           // 'json' 'first'\n           || lk == 70312           // 'json' 'following'\n           || lk == 70824           // 'json' 'following-sibling'\n           || lk == 71336           // 'json' 'for'\n           || lk == 72872           // 'json' 'from'\n           || lk == 73384           // 'json' 'ft-option'\n           || lk == 75432           // 'json' 'function'\n           || lk == 75944           // 'json' 'ge'\n           || lk == 76968           // 'json' 'group'\n           || lk == 77992           // 'json' 'gt'\n           || lk == 78504           // 'json' 'idiv'\n           || lk == 79016           // 'json' 'if'\n           || lk == 79528           // 'json' 'import'\n           || lk == 80040           // 'json' 'in'\n           || lk == 80552           // 'json' 'index'\n           || lk == 82600           // 'json' 'insert'\n           || lk == 83112           // 'json' 'instance'\n           || lk == 83624           // 'json' 'integrity'\n           || lk == 84136           // 'json' 'intersect'\n           || lk == 84648           // 'json' 'into'\n           || lk == 85160           // 'json' 'is'\n           || lk == 85672           // 'json' 'item'\n           || lk == 86184           // 'json' 'json'\n           || lk == 86696           // 'json' 'json-item'\n           || lk == 87208           // 'json' 'jsoniq'\n           || lk == 88744           // 'json' 'last'\n           || lk == 89256           // 'json' 'lax'\n           || lk == 89768           // 'json' 'le'\n           || lk == 90792           // 'json' 'let'\n           || lk == 91816           // 'json' 'loop'\n           || lk == 92840           // 'json' 'lt'\n           || lk == 93864           // 'json' 'mod'\n           || lk == 94376           // 'json' 'modify'\n           || lk == 94888           // 'json' 'module'\n           || lk == 95912           // 'json' 'namespace'\n           || lk == 96424           // 'json' 'namespace-node'\n           || lk == 96936           // 'json' 'ne'\n           || lk == 99496           // 'json' 'node'\n           || lk == 100008          // 'json' 'nodes'\n           || lk == 100520          // 'json' 'not'\n           || lk == 101032          // 'json' 'null'\n           || lk == 101544          // 'json' 'object'\n           || lk == 103592          // 'json' 'only'\n           || lk == 104104          // 'json' 'option'\n           || lk == 104616          // 'json' 'or'\n           || lk == 105128          // 'json' 'order'\n           || lk == 105640          // 'json' 'ordered'\n           || lk == 106152          // 'json' 'ordering'\n           || lk == 107688          // 'json' 'parent'\n           || lk == 110760          // 'json' 'preceding'\n           || lk == 111272          // 'json' 'preceding-sibling'\n           || lk == 112808          // 'json' 'processing-instruction'\n           || lk == 113832          // 'json' 'rename'\n           || lk == 114344          // 'json' 'replace'\n           || lk == 114856          // 'json' 'return'\n           || lk == 115368          // 'json' 'returning'\n           || lk == 115880          // 'json' 'revalidation'\n           || lk == 116904          // 'json' 'satisfies'\n           || lk == 117416          // 'json' 'schema'\n           || lk == 117928          // 'json' 'schema-attribute'\n           || lk == 118440          // 'json' 'schema-element'\n           || lk == 118952          // 'json' 'score'\n           || lk == 119464          // 'json' 'select'\n           || lk == 119976          // 'json' 'self'\n           || lk == 122536          // 'json' 'sliding'\n           || lk == 123048          // 'json' 'some'\n           || lk == 123560          // 'json' 'stable'\n           || lk == 124072          // 'json' 'start'\n           || lk == 125608          // 'json' 'strict'\n           || lk == 126632          // 'json' 'structured-item'\n           || lk == 127144          // 'json' 'switch'\n           || lk == 127656          // 'json' 'text'\n           || lk == 129704          // 'json' 'to'\n           || lk == 130216          // 'json' 'treat'\n           || lk == 130728          // 'json' 'true'\n           || lk == 131240          // 'json' 'try'\n           || lk == 131752          // 'json' 'tumbling'\n           || lk == 132264          // 'json' 'type'\n           || lk == 132776          // 'json' 'typeswitch'\n           || lk == 133288          // 'json' 'union'\n           || lk == 134312          // 'json' 'unordered'\n           || lk == 134824          // 'json' 'updating'\n           || lk == 136360          // 'json' 'validate'\n           || lk == 136872          // 'json' 'value'\n           || lk == 137384          // 'json' 'variable'\n           || lk == 137896          // 'json' 'version'\n           || lk == 139432          // 'json' 'where'\n           || lk == 139944          // 'json' 'while'\n           || lk == 141480          // 'json' 'with'\n           || lk == 144040          // 'json' '{'\n           || lk == 145064)         // 'json' '{|'\n          {\n            shiftT(168);            // 'json'\n          }\n          lookahead1W(267);         // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n          try_ExprSingle();\n          shiftT(165);              // 'into'\n          lookahead1W(267);         // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n          try_ExprSingle();\n          switch (l1)\n          {\n          case 82:                  // 'at'\n            lookahead2W(72);        // S^WS | '(:' | 'position'\n            break;\n          default:\n            lk = l1;\n          }\n          if (lk == 110162)         // 'at' 'position'\n          {\n            lk = memoized(14, e0);\n            if (lk == 0)\n            {\n              var b0B = b0; var e0B = e0; var l1B = l1;\n              var b1B = b1; var e1B = e1; var l2B = l2;\n              var b2B = b2; var e2B = e2;\n              try\n              {\n                shiftT(82);         // 'at'\n                lookahead1W(72);    // S^WS | '(:' | 'position'\n                shiftT(215);        // 'position'\n                lookahead1W(267);   // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n                try_ExprSingle();\n                memoize(14, e0B, -1);\n              }\n              catch (p1B)\n              {\n                b0 = b0B; e0 = e0B; l1 = l1B; if (l1 == 0) {end = e0B;} else {\n                b1 = b1B; e1 = e1B; l2 = l2B; if (l2 == 0) {end = e1B;} else {\n                b2 = b2B; e2 = e2B; end = e2B; }}\n                memoize(14, e0B, -2);\n              }\n              lk = -2;\n            }\n          }\n          if (lk == -1)\n          {\n            shiftT(82);             // 'at'\n            lookahead1W(72);        // S^WS | '(:' | 'position'\n            shiftT(215);            // 'position'\n            lookahead1W(267);       // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n            try_ExprSingle();\n          }\n          lk = -1;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n        }\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(12, e0, lk);\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n      shift(161);                   // 'insert'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      switch (l1)\n      {\n      case 168:                     // 'json'\n        lookahead2W(269);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk == 18088)              // 'json' '('\n      {\n        lk = memoized(13, e0);\n        if (lk == 0)\n        {\n          var b0B = b0; var e0B = e0; var l1B = l1;\n          var b1B = b1; var e1B = e1; var l2B = l2;\n          var b2B = b2; var e2B = e2;\n          try\n          {\n            shiftT(168);            // 'json'\n            lk = -1;\n          }\n          catch (p1B)\n          {\n            lk = -2;\n          }\n          b0 = b0B; e0 = e0B; l1 = l1B; if (l1 == 0) {end = e0B;} else {\n          b1 = b1B; e1 = e1B; l2 = l2B; if (l2 == 0) {end = e1B;} else {\n          b2 = b2B; e2 = e2B; end = e2B; }}\n          memoize(13, e0, lk);\n        }\n      }\n      if (lk == -1\n       || lk == 3240                // 'json' EQName^Token\n       || lk == 4264                // 'json' IntegerLiteral\n       || lk == 4776                // 'json' DecimalLiteral\n       || lk == 5288                // 'json' DoubleLiteral\n       || lk == 5800                // 'json' StringLiteral\n       || lk == 16040               // 'json' '$'\n       || lk == 16552               // 'json' '$$'\n       || lk == 17064               // 'json' '%'\n       || lk == 18600               // 'json' '(#'\n       || lk == 21160               // 'json' '+'\n       || lk == 22184               // 'json' '-'\n       || lk == 24232               // 'json' '/'\n       || lk == 24744               // 'json' '//'\n       || lk == 28328               // 'json' '<'\n       || lk == 28840               // 'json' '<!--'\n       || lk == 30888               // 'json' '<?'\n       || lk == 35496               // 'json' '['\n       || lk == 36520               // 'json' 'after'\n       || lk == 37544               // 'json' 'allowing'\n       || lk == 38056               // 'json' 'ancestor'\n       || lk == 38568               // 'json' 'ancestor-or-self'\n       || lk == 39080               // 'json' 'and'\n       || lk == 40104               // 'json' 'append'\n       || lk == 40616               // 'json' 'array'\n       || lk == 41128               // 'json' 'as'\n       || lk == 41640               // 'json' 'ascending'\n       || lk == 42152               // 'json' 'at'\n       || lk == 42664               // 'json' 'attribute'\n       || lk == 43176               // 'json' 'base-uri'\n       || lk == 43688               // 'json' 'before'\n       || lk == 44200               // 'json' 'boundary-space'\n       || lk == 44712               // 'json' 'break'\n       || lk == 45736               // 'json' 'case'\n       || lk == 46248               // 'json' 'cast'\n       || lk == 46760               // 'json' 'castable'\n       || lk == 47272               // 'json' 'catch'\n       || lk == 48296               // 'json' 'child'\n       || lk == 48808               // 'json' 'collation'\n       || lk == 49832               // 'json' 'comment'\n       || lk == 50344               // 'json' 'constraint'\n       || lk == 50856               // 'json' 'construction'\n       || lk == 52392               // 'json' 'context'\n       || lk == 52904               // 'json' 'continue'\n       || lk == 53416               // 'json' 'copy'\n       || lk == 53928               // 'json' 'copy-namespaces'\n       || lk == 54440               // 'json' 'count'\n       || lk == 54952               // 'json' 'decimal-format'\n       || lk == 55976               // 'json' 'declare'\n       || lk == 56488               // 'json' 'default'\n       || lk == 57000               // 'json' 'delete'\n       || lk == 57512               // 'json' 'descendant'\n       || lk == 58024               // 'json' 'descendant-or-self'\n       || lk == 58536               // 'json' 'descending'\n       || lk == 61096               // 'json' 'div'\n       || lk == 61608               // 'json' 'document'\n       || lk == 62120               // 'json' 'document-node'\n       || lk == 62632               // 'json' 'element'\n       || lk == 63144               // 'json' 'else'\n       || lk == 63656               // 'json' 'empty'\n       || lk == 64168               // 'json' 'empty-sequence'\n       || lk == 64680               // 'json' 'encoding'\n       || lk == 65192               // 'json' 'end'\n       || lk == 66216               // 'json' 'eq'\n       || lk == 66728               // 'json' 'every'\n       || lk == 67752               // 'json' 'except'\n       || lk == 68264               // 'json' 'exit'\n       || lk == 68776               // 'json' 'external'\n       || lk == 69288               // 'json' 'false'\n       || lk == 69800               // 'json' 'first'\n       || lk == 70312               // 'json' 'following'\n       || lk == 70824               // 'json' 'following-sibling'\n       || lk == 71336               // 'json' 'for'\n       || lk == 72872               // 'json' 'from'\n       || lk == 73384               // 'json' 'ft-option'\n       || lk == 75432               // 'json' 'function'\n       || lk == 75944               // 'json' 'ge'\n       || lk == 76968               // 'json' 'group'\n       || lk == 77992               // 'json' 'gt'\n       || lk == 78504               // 'json' 'idiv'\n       || lk == 79016               // 'json' 'if'\n       || lk == 79528               // 'json' 'import'\n       || lk == 80040               // 'json' 'in'\n       || lk == 80552               // 'json' 'index'\n       || lk == 82600               // 'json' 'insert'\n       || lk == 83112               // 'json' 'instance'\n       || lk == 83624               // 'json' 'integrity'\n       || lk == 84136               // 'json' 'intersect'\n       || lk == 84648               // 'json' 'into'\n       || lk == 85160               // 'json' 'is'\n       || lk == 85672               // 'json' 'item'\n       || lk == 86184               // 'json' 'json'\n       || lk == 86696               // 'json' 'json-item'\n       || lk == 87208               // 'json' 'jsoniq'\n       || lk == 88744               // 'json' 'last'\n       || lk == 89256               // 'json' 'lax'\n       || lk == 89768               // 'json' 'le'\n       || lk == 90792               // 'json' 'let'\n       || lk == 91816               // 'json' 'loop'\n       || lk == 92840               // 'json' 'lt'\n       || lk == 93864               // 'json' 'mod'\n       || lk == 94376               // 'json' 'modify'\n       || lk == 94888               // 'json' 'module'\n       || lk == 95912               // 'json' 'namespace'\n       || lk == 96424               // 'json' 'namespace-node'\n       || lk == 96936               // 'json' 'ne'\n       || lk == 99496               // 'json' 'node'\n       || lk == 100008              // 'json' 'nodes'\n       || lk == 100520              // 'json' 'not'\n       || lk == 101032              // 'json' 'null'\n       || lk == 101544              // 'json' 'object'\n       || lk == 103592              // 'json' 'only'\n       || lk == 104104              // 'json' 'option'\n       || lk == 104616              // 'json' 'or'\n       || lk == 105128              // 'json' 'order'\n       || lk == 105640              // 'json' 'ordered'\n       || lk == 106152              // 'json' 'ordering'\n       || lk == 107688              // 'json' 'parent'\n       || lk == 110760              // 'json' 'preceding'\n       || lk == 111272              // 'json' 'preceding-sibling'\n       || lk == 112808              // 'json' 'processing-instruction'\n       || lk == 113832              // 'json' 'rename'\n       || lk == 114344              // 'json' 'replace'\n       || lk == 114856              // 'json' 'return'\n       || lk == 115368              // 'json' 'returning'\n       || lk == 115880              // 'json' 'revalidation'\n       || lk == 116904              // 'json' 'satisfies'\n       || lk == 117416              // 'json' 'schema'\n       || lk == 117928              // 'json' 'schema-attribute'\n       || lk == 118440              // 'json' 'schema-element'\n       || lk == 118952              // 'json' 'score'\n       || lk == 119464              // 'json' 'select'\n       || lk == 119976              // 'json' 'self'\n       || lk == 122536              // 'json' 'sliding'\n       || lk == 123048              // 'json' 'some'\n       || lk == 123560              // 'json' 'stable'\n       || lk == 124072              // 'json' 'start'\n       || lk == 125608              // 'json' 'strict'\n       || lk == 126632              // 'json' 'structured-item'\n       || lk == 127144              // 'json' 'switch'\n       || lk == 127656              // 'json' 'text'\n       || lk == 129704              // 'json' 'to'\n       || lk == 130216              // 'json' 'treat'\n       || lk == 130728              // 'json' 'true'\n       || lk == 131240              // 'json' 'try'\n       || lk == 131752              // 'json' 'tumbling'\n       || lk == 132264              // 'json' 'type'\n       || lk == 132776              // 'json' 'typeswitch'\n       || lk == 133288              // 'json' 'union'\n       || lk == 134312              // 'json' 'unordered'\n       || lk == 134824              // 'json' 'updating'\n       || lk == 136360              // 'json' 'validate'\n       || lk == 136872              // 'json' 'value'\n       || lk == 137384              // 'json' 'variable'\n       || lk == 137896              // 'json' 'version'\n       || lk == 139432              // 'json' 'where'\n       || lk == 139944              // 'json' 'while'\n       || lk == 141480              // 'json' 'with'\n       || lk == 144040              // 'json' '{'\n       || lk == 145064)             // 'json' '{|'\n      {\n        shift(168);                 // 'json'\n      }\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_ExprSingle();\n      shift(165);                   // 'into'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_ExprSingle();\n      switch (l1)\n      {\n      case 82:                      // 'at'\n        lookahead2W(72);            // S^WS | '(:' | 'position'\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk == 110162)             // 'at' 'position'\n      {\n        lk = memoized(14, e0);\n        if (lk == 0)\n        {\n          var b0B = b0; var e0B = e0; var l1B = l1;\n          var b1B = b1; var e1B = e1; var l2B = l2;\n          var b2B = b2; var e2B = e2;\n          try\n          {\n            shiftT(82);             // 'at'\n            lookahead1W(72);        // S^WS | '(:' | 'position'\n            shiftT(215);            // 'position'\n            lookahead1W(267);       // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n            try_ExprSingle();\n            lk = -1;\n          }\n          catch (p1B)\n          {\n            lk = -2;\n          }\n          b0 = b0B; e0 = e0B; l1 = l1B; if (l1 == 0) {end = e0B;} else {\n          b1 = b1B; e1 = e1B; l2 = l2B; if (l2 == 0) {end = e1B;} else {\n          b2 = b2B; e2 = e2B; end = e2B; }}\n          memoize(14, e0, lk);\n        }\n      }\n      if (lk == -1)\n      {\n        shift(82);                  // 'at'\n        lookahead1W(72);            // S^WS | '(:' | 'position'\n        shift(215);                 // 'position'\n        lookahead1W(267);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        whitespace();\n        parse_ExprSingle();\n      }\n      break;\n    default:\n      shift(161);                   // 'insert'\n      lookahead1W(268);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      switch (l1)\n      {\n      case 168:                     // 'json'\n        lookahead2W(282);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk == 18088)              // 'json' '('\n      {\n        lk = memoized(15, e0);\n        if (lk == 0)\n        {\n          var b0B = b0; var e0B = e0; var l1B = l1;\n          var b1B = b1; var e1B = e1; var l2B = l2;\n          var b2B = b2; var e2B = e2;\n          try\n          {\n            shiftT(168);            // 'json'\n            lk = -1;\n          }\n          catch (p1B)\n          {\n            lk = -2;\n          }\n          b0 = b0B; e0 = e0B; l1 = l1B; if (l1 == 0) {end = e0B;} else {\n          b1 = b1B; e1 = e1B; l2 = l2B; if (l2 == 0) {end = e1B;} else {\n          b2 = b2B; e2 = e2B; end = e2B; }}\n          memoize(15, e0, lk);\n        }\n      }\n      if (lk == -1\n       || lk == 3240                // 'json' EQName^Token\n       || lk == 4264                // 'json' IntegerLiteral\n       || lk == 4776                // 'json' DecimalLiteral\n       || lk == 5288                // 'json' DoubleLiteral\n       || lk == 5800                // 'json' StringLiteral\n       || lk == 9896                // 'json' NCName^Token\n       || lk == 16040               // 'json' '$'\n       || lk == 16552               // 'json' '$$'\n       || lk == 17064               // 'json' '%'\n       || lk == 18600               // 'json' '(#'\n       || lk == 21160               // 'json' '+'\n       || lk == 22184               // 'json' '-'\n       || lk == 24232               // 'json' '/'\n       || lk == 24744               // 'json' '//'\n       || lk == 28328               // 'json' '<'\n       || lk == 28840               // 'json' '<!--'\n       || lk == 30888               // 'json' '<?'\n       || lk == 35496               // 'json' '['\n       || lk == 36520               // 'json' 'after'\n       || lk == 37544               // 'json' 'allowing'\n       || lk == 38056               // 'json' 'ancestor'\n       || lk == 38568               // 'json' 'ancestor-or-self'\n       || lk == 39080               // 'json' 'and'\n       || lk == 40104               // 'json' 'append'\n       || lk == 40616               // 'json' 'array'\n       || lk == 41128               // 'json' 'as'\n       || lk == 41640               // 'json' 'ascending'\n       || lk == 42152               // 'json' 'at'\n       || lk == 42664               // 'json' 'attribute'\n       || lk == 43176               // 'json' 'base-uri'\n       || lk == 43688               // 'json' 'before'\n       || lk == 44200               // 'json' 'boundary-space'\n       || lk == 44712               // 'json' 'break'\n       || lk == 45736               // 'json' 'case'\n       || lk == 46248               // 'json' 'cast'\n       || lk == 46760               // 'json' 'castable'\n       || lk == 47272               // 'json' 'catch'\n       || lk == 48296               // 'json' 'child'\n       || lk == 48808               // 'json' 'collation'\n       || lk == 49832               // 'json' 'comment'\n       || lk == 50344               // 'json' 'constraint'\n       || lk == 50856               // 'json' 'construction'\n       || lk == 52392               // 'json' 'context'\n       || lk == 52904               // 'json' 'continue'\n       || lk == 53416               // 'json' 'copy'\n       || lk == 53928               // 'json' 'copy-namespaces'\n       || lk == 54440               // 'json' 'count'\n       || lk == 54952               // 'json' 'decimal-format'\n       || lk == 55976               // 'json' 'declare'\n       || lk == 56488               // 'json' 'default'\n       || lk == 57000               // 'json' 'delete'\n       || lk == 57512               // 'json' 'descendant'\n       || lk == 58024               // 'json' 'descendant-or-self'\n       || lk == 58536               // 'json' 'descending'\n       || lk == 61096               // 'json' 'div'\n       || lk == 61608               // 'json' 'document'\n       || lk == 62120               // 'json' 'document-node'\n       || lk == 62632               // 'json' 'element'\n       || lk == 63144               // 'json' 'else'\n       || lk == 63656               // 'json' 'empty'\n       || lk == 64168               // 'json' 'empty-sequence'\n       || lk == 64680               // 'json' 'encoding'\n       || lk == 65192               // 'json' 'end'\n       || lk == 66216               // 'json' 'eq'\n       || lk == 66728               // 'json' 'every'\n       || lk == 67752               // 'json' 'except'\n       || lk == 68264               // 'json' 'exit'\n       || lk == 68776               // 'json' 'external'\n       || lk == 69288               // 'json' 'false'\n       || lk == 69800               // 'json' 'first'\n       || lk == 70312               // 'json' 'following'\n       || lk == 70824               // 'json' 'following-sibling'\n       || lk == 71336               // 'json' 'for'\n       || lk == 72872               // 'json' 'from'\n       || lk == 73384               // 'json' 'ft-option'\n       || lk == 75432               // 'json' 'function'\n       || lk == 75944               // 'json' 'ge'\n       || lk == 76968               // 'json' 'group'\n       || lk == 77992               // 'json' 'gt'\n       || lk == 78504               // 'json' 'idiv'\n       || lk == 79016               // 'json' 'if'\n       || lk == 79528               // 'json' 'import'\n       || lk == 80040               // 'json' 'in'\n       || lk == 80552               // 'json' 'index'\n       || lk == 82600               // 'json' 'insert'\n       || lk == 83112               // 'json' 'instance'\n       || lk == 83624               // 'json' 'integrity'\n       || lk == 84136               // 'json' 'intersect'\n       || lk == 84648               // 'json' 'into'\n       || lk == 85160               // 'json' 'is'\n       || lk == 85672               // 'json' 'item'\n       || lk == 86184               // 'json' 'json'\n       || lk == 86696               // 'json' 'json-item'\n       || lk == 87208               // 'json' 'jsoniq'\n       || lk == 88744               // 'json' 'last'\n       || lk == 89256               // 'json' 'lax'\n       || lk == 89768               // 'json' 'le'\n       || lk == 90792               // 'json' 'let'\n       || lk == 91816               // 'json' 'loop'\n       || lk == 92840               // 'json' 'lt'\n       || lk == 93864               // 'json' 'mod'\n       || lk == 94376               // 'json' 'modify'\n       || lk == 94888               // 'json' 'module'\n       || lk == 95912               // 'json' 'namespace'\n       || lk == 96424               // 'json' 'namespace-node'\n       || lk == 96936               // 'json' 'ne'\n       || lk == 99496               // 'json' 'node'\n       || lk == 100008              // 'json' 'nodes'\n       || lk == 100520              // 'json' 'not'\n       || lk == 101032              // 'json' 'null'\n       || lk == 101544              // 'json' 'object'\n       || lk == 103592              // 'json' 'only'\n       || lk == 104104              // 'json' 'option'\n       || lk == 104616              // 'json' 'or'\n       || lk == 105128              // 'json' 'order'\n       || lk == 105640              // 'json' 'ordered'\n       || lk == 106152              // 'json' 'ordering'\n       || lk == 107688              // 'json' 'parent'\n       || lk == 110760              // 'json' 'preceding'\n       || lk == 111272              // 'json' 'preceding-sibling'\n       || lk == 112808              // 'json' 'processing-instruction'\n       || lk == 113832              // 'json' 'rename'\n       || lk == 114344              // 'json' 'replace'\n       || lk == 114856              // 'json' 'return'\n       || lk == 115368              // 'json' 'returning'\n       || lk == 115880              // 'json' 'revalidation'\n       || lk == 116904              // 'json' 'satisfies'\n       || lk == 117416              // 'json' 'schema'\n       || lk == 117928              // 'json' 'schema-attribute'\n       || lk == 118440              // 'json' 'schema-element'\n       || lk == 118952              // 'json' 'score'\n       || lk == 119464              // 'json' 'select'\n       || lk == 119976              // 'json' 'self'\n       || lk == 122536              // 'json' 'sliding'\n       || lk == 123048              // 'json' 'some'\n       || lk == 123560              // 'json' 'stable'\n       || lk == 124072              // 'json' 'start'\n       || lk == 125608              // 'json' 'strict'\n       || lk == 126632              // 'json' 'structured-item'\n       || lk == 127144              // 'json' 'switch'\n       || lk == 127656              // 'json' 'text'\n       || lk == 129704              // 'json' 'to'\n       || lk == 130216              // 'json' 'treat'\n       || lk == 130728              // 'json' 'true'\n       || lk == 131240              // 'json' 'try'\n       || lk == 131752              // 'json' 'tumbling'\n       || lk == 132264              // 'json' 'type'\n       || lk == 132776              // 'json' 'typeswitch'\n       || lk == 133288              // 'json' 'union'\n       || lk == 134312              // 'json' 'unordered'\n       || lk == 134824              // 'json' 'updating'\n       || lk == 136360              // 'json' 'validate'\n       || lk == 136872              // 'json' 'value'\n       || lk == 137384              // 'json' 'variable'\n       || lk == 137896              // 'json' 'version'\n       || lk == 139432              // 'json' 'where'\n       || lk == 139944              // 'json' 'while'\n       || lk == 141480              // 'json' 'with'\n       || lk == 144040              // 'json' '{'\n       || lk == 145064)             // 'json' '{|'\n      {\n        shift(168);                 // 'json'\n      }\n      lookahead1W(268);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_PairConstructorList();\n      shift(165);                   // 'into'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_ExprSingle();\n    }\n    eventHandler.endNonterminal(\"JSONInsertExpr\", e0);\n  }\n\n  function try_JSONInsertExpr()\n  {\n    switch (l1)\n    {\n    case 161:                       // 'insert'\n      lookahead2W(268);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk != 9889)                 // 'insert' NCName^Token\n    {\n      lk = memoized(12, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          shiftT(161);              // 'insert'\n          lookahead1W(267);         // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n          switch (l1)\n          {\n          case 168:                 // 'json'\n            lookahead2W(269);       // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n            break;\n          default:\n            lk = l1;\n          }\n          if (lk == 18088)          // 'json' '('\n          {\n            lk = memoized(13, e0);\n            if (lk == 0)\n            {\n              var b0B = b0; var e0B = e0; var l1B = l1;\n              var b1B = b1; var e1B = e1; var l2B = l2;\n              var b2B = b2; var e2B = e2;\n              try\n              {\n                shiftT(168);        // 'json'\n                memoize(13, e0B, -1);\n              }\n              catch (p1B)\n              {\n                b0 = b0B; e0 = e0B; l1 = l1B; if (l1 == 0) {end = e0B;} else {\n                b1 = b1B; e1 = e1B; l2 = l2B; if (l2 == 0) {end = e1B;} else {\n                b2 = b2B; e2 = e2B; end = e2B; }}\n                memoize(13, e0B, -2);\n              }\n              lk = -2;\n            }\n          }\n          if (lk == -1\n           || lk == 3240            // 'json' EQName^Token\n           || lk == 4264            // 'json' IntegerLiteral\n           || lk == 4776            // 'json' DecimalLiteral\n           || lk == 5288            // 'json' DoubleLiteral\n           || lk == 5800            // 'json' StringLiteral\n           || lk == 16040           // 'json' '$'\n           || lk == 16552           // 'json' '$$'\n           || lk == 17064           // 'json' '%'\n           || lk == 18600           // 'json' '(#'\n           || lk == 21160           // 'json' '+'\n           || lk == 22184           // 'json' '-'\n           || lk == 24232           // 'json' '/'\n           || lk == 24744           // 'json' '//'\n           || lk == 28328           // 'json' '<'\n           || lk == 28840           // 'json' '<!--'\n           || lk == 30888           // 'json' '<?'\n           || lk == 35496           // 'json' '['\n           || lk == 36520           // 'json' 'after'\n           || lk == 37544           // 'json' 'allowing'\n           || lk == 38056           // 'json' 'ancestor'\n           || lk == 38568           // 'json' 'ancestor-or-self'\n           || lk == 39080           // 'json' 'and'\n           || lk == 40104           // 'json' 'append'\n           || lk == 40616           // 'json' 'array'\n           || lk == 41128           // 'json' 'as'\n           || lk == 41640           // 'json' 'ascending'\n           || lk == 42152           // 'json' 'at'\n           || lk == 42664           // 'json' 'attribute'\n           || lk == 43176           // 'json' 'base-uri'\n           || lk == 43688           // 'json' 'before'\n           || lk == 44200           // 'json' 'boundary-space'\n           || lk == 44712           // 'json' 'break'\n           || lk == 45736           // 'json' 'case'\n           || lk == 46248           // 'json' 'cast'\n           || lk == 46760           // 'json' 'castable'\n           || lk == 47272           // 'json' 'catch'\n           || lk == 48296           // 'json' 'child'\n           || lk == 48808           // 'json' 'collation'\n           || lk == 49832           // 'json' 'comment'\n           || lk == 50344           // 'json' 'constraint'\n           || lk == 50856           // 'json' 'construction'\n           || lk == 52392           // 'json' 'context'\n           || lk == 52904           // 'json' 'continue'\n           || lk == 53416           // 'json' 'copy'\n           || lk == 53928           // 'json' 'copy-namespaces'\n           || lk == 54440           // 'json' 'count'\n           || lk == 54952           // 'json' 'decimal-format'\n           || lk == 55976           // 'json' 'declare'\n           || lk == 56488           // 'json' 'default'\n           || lk == 57000           // 'json' 'delete'\n           || lk == 57512           // 'json' 'descendant'\n           || lk == 58024           // 'json' 'descendant-or-self'\n           || lk == 58536           // 'json' 'descending'\n           || lk == 61096           // 'json' 'div'\n           || lk == 61608           // 'json' 'document'\n           || lk == 62120           // 'json' 'document-node'\n           || lk == 62632           // 'json' 'element'\n           || lk == 63144           // 'json' 'else'\n           || lk == 63656           // 'json' 'empty'\n           || lk == 64168           // 'json' 'empty-sequence'\n           || lk == 64680           // 'json' 'encoding'\n           || lk == 65192           // 'json' 'end'\n           || lk == 66216           // 'json' 'eq'\n           || lk == 66728           // 'json' 'every'\n           || lk == 67752           // 'json' 'except'\n           || lk == 68264           // 'json' 'exit'\n           || lk == 68776           // 'json' 'external'\n           || lk == 69288           // 'json' 'false'\n           || lk == 69800           // 'json' 'first'\n           || lk == 70312           // 'json' 'following'\n           || lk == 70824           // 'json' 'following-sibling'\n           || lk == 71336           // 'json' 'for'\n           || lk == 72872           // 'json' 'from'\n           || lk == 73384           // 'json' 'ft-option'\n           || lk == 75432           // 'json' 'function'\n           || lk == 75944           // 'json' 'ge'\n           || lk == 76968           // 'json' 'group'\n           || lk == 77992           // 'json' 'gt'\n           || lk == 78504           // 'json' 'idiv'\n           || lk == 79016           // 'json' 'if'\n           || lk == 79528           // 'json' 'import'\n           || lk == 80040           // 'json' 'in'\n           || lk == 80552           // 'json' 'index'\n           || lk == 82600           // 'json' 'insert'\n           || lk == 83112           // 'json' 'instance'\n           || lk == 83624           // 'json' 'integrity'\n           || lk == 84136           // 'json' 'intersect'\n           || lk == 84648           // 'json' 'into'\n           || lk == 85160           // 'json' 'is'\n           || lk == 85672           // 'json' 'item'\n           || lk == 86184           // 'json' 'json'\n           || lk == 86696           // 'json' 'json-item'\n           || lk == 87208           // 'json' 'jsoniq'\n           || lk == 88744           // 'json' 'last'\n           || lk == 89256           // 'json' 'lax'\n           || lk == 89768           // 'json' 'le'\n           || lk == 90792           // 'json' 'let'\n           || lk == 91816           // 'json' 'loop'\n           || lk == 92840           // 'json' 'lt'\n           || lk == 93864           // 'json' 'mod'\n           || lk == 94376           // 'json' 'modify'\n           || lk == 94888           // 'json' 'module'\n           || lk == 95912           // 'json' 'namespace'\n           || lk == 96424           // 'json' 'namespace-node'\n           || lk == 96936           // 'json' 'ne'\n           || lk == 99496           // 'json' 'node'\n           || lk == 100008          // 'json' 'nodes'\n           || lk == 100520          // 'json' 'not'\n           || lk == 101032          // 'json' 'null'\n           || lk == 101544          // 'json' 'object'\n           || lk == 103592          // 'json' 'only'\n           || lk == 104104          // 'json' 'option'\n           || lk == 104616          // 'json' 'or'\n           || lk == 105128          // 'json' 'order'\n           || lk == 105640          // 'json' 'ordered'\n           || lk == 106152          // 'json' 'ordering'\n           || lk == 107688          // 'json' 'parent'\n           || lk == 110760          // 'json' 'preceding'\n           || lk == 111272          // 'json' 'preceding-sibling'\n           || lk == 112808          // 'json' 'processing-instruction'\n           || lk == 113832          // 'json' 'rename'\n           || lk == 114344          // 'json' 'replace'\n           || lk == 114856          // 'json' 'return'\n           || lk == 115368          // 'json' 'returning'\n           || lk == 115880          // 'json' 'revalidation'\n           || lk == 116904          // 'json' 'satisfies'\n           || lk == 117416          // 'json' 'schema'\n           || lk == 117928          // 'json' 'schema-attribute'\n           || lk == 118440          // 'json' 'schema-element'\n           || lk == 118952          // 'json' 'score'\n           || lk == 119464          // 'json' 'select'\n           || lk == 119976          // 'json' 'self'\n           || lk == 122536          // 'json' 'sliding'\n           || lk == 123048          // 'json' 'some'\n           || lk == 123560          // 'json' 'stable'\n           || lk == 124072          // 'json' 'start'\n           || lk == 125608          // 'json' 'strict'\n           || lk == 126632          // 'json' 'structured-item'\n           || lk == 127144          // 'json' 'switch'\n           || lk == 127656          // 'json' 'text'\n           || lk == 129704          // 'json' 'to'\n           || lk == 130216          // 'json' 'treat'\n           || lk == 130728          // 'json' 'true'\n           || lk == 131240          // 'json' 'try'\n           || lk == 131752          // 'json' 'tumbling'\n           || lk == 132264          // 'json' 'type'\n           || lk == 132776          // 'json' 'typeswitch'\n           || lk == 133288          // 'json' 'union'\n           || lk == 134312          // 'json' 'unordered'\n           || lk == 134824          // 'json' 'updating'\n           || lk == 136360          // 'json' 'validate'\n           || lk == 136872          // 'json' 'value'\n           || lk == 137384          // 'json' 'variable'\n           || lk == 137896          // 'json' 'version'\n           || lk == 139432          // 'json' 'where'\n           || lk == 139944          // 'json' 'while'\n           || lk == 141480          // 'json' 'with'\n           || lk == 144040          // 'json' '{'\n           || lk == 145064)         // 'json' '{|'\n          {\n            shiftT(168);            // 'json'\n          }\n          lookahead1W(267);         // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n          try_ExprSingle();\n          shiftT(165);              // 'into'\n          lookahead1W(267);         // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n          try_ExprSingle();\n          switch (l1)\n          {\n          case 82:                  // 'at'\n            lookahead2W(72);        // S^WS | '(:' | 'position'\n            break;\n          default:\n            lk = l1;\n          }\n          if (lk == 110162)         // 'at' 'position'\n          {\n            lk = memoized(14, e0);\n            if (lk == 0)\n            {\n              var b0B = b0; var e0B = e0; var l1B = l1;\n              var b1B = b1; var e1B = e1; var l2B = l2;\n              var b2B = b2; var e2B = e2;\n              try\n              {\n                shiftT(82);         // 'at'\n                lookahead1W(72);    // S^WS | '(:' | 'position'\n                shiftT(215);        // 'position'\n                lookahead1W(267);   // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n                try_ExprSingle();\n                memoize(14, e0B, -1);\n              }\n              catch (p1B)\n              {\n                b0 = b0B; e0 = e0B; l1 = l1B; if (l1 == 0) {end = e0B;} else {\n                b1 = b1B; e1 = e1B; l2 = l2B; if (l2 == 0) {end = e1B;} else {\n                b2 = b2B; e2 = e2B; end = e2B; }}\n                memoize(14, e0B, -2);\n              }\n              lk = -2;\n            }\n          }\n          if (lk == -1)\n          {\n            shiftT(82);             // 'at'\n            lookahead1W(72);        // S^WS | '(:' | 'position'\n            shiftT(215);            // 'position'\n            lookahead1W(267);       // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n            try_ExprSingle();\n          }\n          memoize(12, e0A, -1);\n          lk = -3;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(12, e0A, -2);\n        }\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n      shiftT(161);                  // 'insert'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      switch (l1)\n      {\n      case 168:                     // 'json'\n        lookahead2W(269);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk == 18088)              // 'json' '('\n      {\n        lk = memoized(13, e0);\n        if (lk == 0)\n        {\n          var b0B = b0; var e0B = e0; var l1B = l1;\n          var b1B = b1; var e1B = e1; var l2B = l2;\n          var b2B = b2; var e2B = e2;\n          try\n          {\n            shiftT(168);            // 'json'\n            memoize(13, e0B, -1);\n          }\n          catch (p1B)\n          {\n            b0 = b0B; e0 = e0B; l1 = l1B; if (l1 == 0) {end = e0B;} else {\n            b1 = b1B; e1 = e1B; l2 = l2B; if (l2 == 0) {end = e1B;} else {\n            b2 = b2B; e2 = e2B; end = e2B; }}\n            memoize(13, e0B, -2);\n          }\n          lk = -2;\n        }\n      }\n      if (lk == -1\n       || lk == 3240                // 'json' EQName^Token\n       || lk == 4264                // 'json' IntegerLiteral\n       || lk == 4776                // 'json' DecimalLiteral\n       || lk == 5288                // 'json' DoubleLiteral\n       || lk == 5800                // 'json' StringLiteral\n       || lk == 16040               // 'json' '$'\n       || lk == 16552               // 'json' '$$'\n       || lk == 17064               // 'json' '%'\n       || lk == 18600               // 'json' '(#'\n       || lk == 21160               // 'json' '+'\n       || lk == 22184               // 'json' '-'\n       || lk == 24232               // 'json' '/'\n       || lk == 24744               // 'json' '//'\n       || lk == 28328               // 'json' '<'\n       || lk == 28840               // 'json' '<!--'\n       || lk == 30888               // 'json' '<?'\n       || lk == 35496               // 'json' '['\n       || lk == 36520               // 'json' 'after'\n       || lk == 37544               // 'json' 'allowing'\n       || lk == 38056               // 'json' 'ancestor'\n       || lk == 38568               // 'json' 'ancestor-or-self'\n       || lk == 39080               // 'json' 'and'\n       || lk == 40104               // 'json' 'append'\n       || lk == 40616               // 'json' 'array'\n       || lk == 41128               // 'json' 'as'\n       || lk == 41640               // 'json' 'ascending'\n       || lk == 42152               // 'json' 'at'\n       || lk == 42664               // 'json' 'attribute'\n       || lk == 43176               // 'json' 'base-uri'\n       || lk == 43688               // 'json' 'before'\n       || lk == 44200               // 'json' 'boundary-space'\n       || lk == 44712               // 'json' 'break'\n       || lk == 45736               // 'json' 'case'\n       || lk == 46248               // 'json' 'cast'\n       || lk == 46760               // 'json' 'castable'\n       || lk == 47272               // 'json' 'catch'\n       || lk == 48296               // 'json' 'child'\n       || lk == 48808               // 'json' 'collation'\n       || lk == 49832               // 'json' 'comment'\n       || lk == 50344               // 'json' 'constraint'\n       || lk == 50856               // 'json' 'construction'\n       || lk == 52392               // 'json' 'context'\n       || lk == 52904               // 'json' 'continue'\n       || lk == 53416               // 'json' 'copy'\n       || lk == 53928               // 'json' 'copy-namespaces'\n       || lk == 54440               // 'json' 'count'\n       || lk == 54952               // 'json' 'decimal-format'\n       || lk == 55976               // 'json' 'declare'\n       || lk == 56488               // 'json' 'default'\n       || lk == 57000               // 'json' 'delete'\n       || lk == 57512               // 'json' 'descendant'\n       || lk == 58024               // 'json' 'descendant-or-self'\n       || lk == 58536               // 'json' 'descending'\n       || lk == 61096               // 'json' 'div'\n       || lk == 61608               // 'json' 'document'\n       || lk == 62120               // 'json' 'document-node'\n       || lk == 62632               // 'json' 'element'\n       || lk == 63144               // 'json' 'else'\n       || lk == 63656               // 'json' 'empty'\n       || lk == 64168               // 'json' 'empty-sequence'\n       || lk == 64680               // 'json' 'encoding'\n       || lk == 65192               // 'json' 'end'\n       || lk == 66216               // 'json' 'eq'\n       || lk == 66728               // 'json' 'every'\n       || lk == 67752               // 'json' 'except'\n       || lk == 68264               // 'json' 'exit'\n       || lk == 68776               // 'json' 'external'\n       || lk == 69288               // 'json' 'false'\n       || lk == 69800               // 'json' 'first'\n       || lk == 70312               // 'json' 'following'\n       || lk == 70824               // 'json' 'following-sibling'\n       || lk == 71336               // 'json' 'for'\n       || lk == 72872               // 'json' 'from'\n       || lk == 73384               // 'json' 'ft-option'\n       || lk == 75432               // 'json' 'function'\n       || lk == 75944               // 'json' 'ge'\n       || lk == 76968               // 'json' 'group'\n       || lk == 77992               // 'json' 'gt'\n       || lk == 78504               // 'json' 'idiv'\n       || lk == 79016               // 'json' 'if'\n       || lk == 79528               // 'json' 'import'\n       || lk == 80040               // 'json' 'in'\n       || lk == 80552               // 'json' 'index'\n       || lk == 82600               // 'json' 'insert'\n       || lk == 83112               // 'json' 'instance'\n       || lk == 83624               // 'json' 'integrity'\n       || lk == 84136               // 'json' 'intersect'\n       || lk == 84648               // 'json' 'into'\n       || lk == 85160               // 'json' 'is'\n       || lk == 85672               // 'json' 'item'\n       || lk == 86184               // 'json' 'json'\n       || lk == 86696               // 'json' 'json-item'\n       || lk == 87208               // 'json' 'jsoniq'\n       || lk == 88744               // 'json' 'last'\n       || lk == 89256               // 'json' 'lax'\n       || lk == 89768               // 'json' 'le'\n       || lk == 90792               // 'json' 'let'\n       || lk == 91816               // 'json' 'loop'\n       || lk == 92840               // 'json' 'lt'\n       || lk == 93864               // 'json' 'mod'\n       || lk == 94376               // 'json' 'modify'\n       || lk == 94888               // 'json' 'module'\n       || lk == 95912               // 'json' 'namespace'\n       || lk == 96424               // 'json' 'namespace-node'\n       || lk == 96936               // 'json' 'ne'\n       || lk == 99496               // 'json' 'node'\n       || lk == 100008              // 'json' 'nodes'\n       || lk == 100520              // 'json' 'not'\n       || lk == 101032              // 'json' 'null'\n       || lk == 101544              // 'json' 'object'\n       || lk == 103592              // 'json' 'only'\n       || lk == 104104              // 'json' 'option'\n       || lk == 104616              // 'json' 'or'\n       || lk == 105128              // 'json' 'order'\n       || lk == 105640              // 'json' 'ordered'\n       || lk == 106152              // 'json' 'ordering'\n       || lk == 107688              // 'json' 'parent'\n       || lk == 110760              // 'json' 'preceding'\n       || lk == 111272              // 'json' 'preceding-sibling'\n       || lk == 112808              // 'json' 'processing-instruction'\n       || lk == 113832              // 'json' 'rename'\n       || lk == 114344              // 'json' 'replace'\n       || lk == 114856              // 'json' 'return'\n       || lk == 115368              // 'json' 'returning'\n       || lk == 115880              // 'json' 'revalidation'\n       || lk == 116904              // 'json' 'satisfies'\n       || lk == 117416              // 'json' 'schema'\n       || lk == 117928              // 'json' 'schema-attribute'\n       || lk == 118440              // 'json' 'schema-element'\n       || lk == 118952              // 'json' 'score'\n       || lk == 119464              // 'json' 'select'\n       || lk == 119976              // 'json' 'self'\n       || lk == 122536              // 'json' 'sliding'\n       || lk == 123048              // 'json' 'some'\n       || lk == 123560              // 'json' 'stable'\n       || lk == 124072              // 'json' 'start'\n       || lk == 125608              // 'json' 'strict'\n       || lk == 126632              // 'json' 'structured-item'\n       || lk == 127144              // 'json' 'switch'\n       || lk == 127656              // 'json' 'text'\n       || lk == 129704              // 'json' 'to'\n       || lk == 130216              // 'json' 'treat'\n       || lk == 130728              // 'json' 'true'\n       || lk == 131240              // 'json' 'try'\n       || lk == 131752              // 'json' 'tumbling'\n       || lk == 132264              // 'json' 'type'\n       || lk == 132776              // 'json' 'typeswitch'\n       || lk == 133288              // 'json' 'union'\n       || lk == 134312              // 'json' 'unordered'\n       || lk == 134824              // 'json' 'updating'\n       || lk == 136360              // 'json' 'validate'\n       || lk == 136872              // 'json' 'value'\n       || lk == 137384              // 'json' 'variable'\n       || lk == 137896              // 'json' 'version'\n       || lk == 139432              // 'json' 'where'\n       || lk == 139944              // 'json' 'while'\n       || lk == 141480              // 'json' 'with'\n       || lk == 144040              // 'json' '{'\n       || lk == 145064)             // 'json' '{|'\n      {\n        shiftT(168);                // 'json'\n      }\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_ExprSingle();\n      shiftT(165);                  // 'into'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_ExprSingle();\n      switch (l1)\n      {\n      case 82:                      // 'at'\n        lookahead2W(72);            // S^WS | '(:' | 'position'\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk == 110162)             // 'at' 'position'\n      {\n        lk = memoized(14, e0);\n        if (lk == 0)\n        {\n          var b0B = b0; var e0B = e0; var l1B = l1;\n          var b1B = b1; var e1B = e1; var l2B = l2;\n          var b2B = b2; var e2B = e2;\n          try\n          {\n            shiftT(82);             // 'at'\n            lookahead1W(72);        // S^WS | '(:' | 'position'\n            shiftT(215);            // 'position'\n            lookahead1W(267);       // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n            try_ExprSingle();\n            memoize(14, e0B, -1);\n          }\n          catch (p1B)\n          {\n            b0 = b0B; e0 = e0B; l1 = l1B; if (l1 == 0) {end = e0B;} else {\n            b1 = b1B; e1 = e1B; l2 = l2B; if (l2 == 0) {end = e1B;} else {\n            b2 = b2B; e2 = e2B; end = e2B; }}\n            memoize(14, e0B, -2);\n          }\n          lk = -2;\n        }\n      }\n      if (lk == -1)\n      {\n        shiftT(82);                 // 'at'\n        lookahead1W(72);            // S^WS | '(:' | 'position'\n        shiftT(215);                // 'position'\n        lookahead1W(267);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        try_ExprSingle();\n      }\n      break;\n    case -3:\n      break;\n    default:\n      shiftT(161);                  // 'insert'\n      lookahead1W(268);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      switch (l1)\n      {\n      case 168:                     // 'json'\n        lookahead2W(282);           // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk == 18088)              // 'json' '('\n      {\n        lk = memoized(15, e0);\n        if (lk == 0)\n        {\n          var b0B = b0; var e0B = e0; var l1B = l1;\n          var b1B = b1; var e1B = e1; var l2B = l2;\n          var b2B = b2; var e2B = e2;\n          try\n          {\n            shiftT(168);            // 'json'\n            memoize(15, e0B, -1);\n          }\n          catch (p1B)\n          {\n            b0 = b0B; e0 = e0B; l1 = l1B; if (l1 == 0) {end = e0B;} else {\n            b1 = b1B; e1 = e1B; l2 = l2B; if (l2 == 0) {end = e1B;} else {\n            b2 = b2B; e2 = e2B; end = e2B; }}\n            memoize(15, e0B, -2);\n          }\n          lk = -2;\n        }\n      }\n      if (lk == -1\n       || lk == 3240                // 'json' EQName^Token\n       || lk == 4264                // 'json' IntegerLiteral\n       || lk == 4776                // 'json' DecimalLiteral\n       || lk == 5288                // 'json' DoubleLiteral\n       || lk == 5800                // 'json' StringLiteral\n       || lk == 9896                // 'json' NCName^Token\n       || lk == 16040               // 'json' '$'\n       || lk == 16552               // 'json' '$$'\n       || lk == 17064               // 'json' '%'\n       || lk == 18600               // 'json' '(#'\n       || lk == 21160               // 'json' '+'\n       || lk == 22184               // 'json' '-'\n       || lk == 24232               // 'json' '/'\n       || lk == 24744               // 'json' '//'\n       || lk == 28328               // 'json' '<'\n       || lk == 28840               // 'json' '<!--'\n       || lk == 30888               // 'json' '<?'\n       || lk == 35496               // 'json' '['\n       || lk == 36520               // 'json' 'after'\n       || lk == 37544               // 'json' 'allowing'\n       || lk == 38056               // 'json' 'ancestor'\n       || lk == 38568               // 'json' 'ancestor-or-self'\n       || lk == 39080               // 'json' 'and'\n       || lk == 40104               // 'json' 'append'\n       || lk == 40616               // 'json' 'array'\n       || lk == 41128               // 'json' 'as'\n       || lk == 41640               // 'json' 'ascending'\n       || lk == 42152               // 'json' 'at'\n       || lk == 42664               // 'json' 'attribute'\n       || lk == 43176               // 'json' 'base-uri'\n       || lk == 43688               // 'json' 'before'\n       || lk == 44200               // 'json' 'boundary-space'\n       || lk == 44712               // 'json' 'break'\n       || lk == 45736               // 'json' 'case'\n       || lk == 46248               // 'json' 'cast'\n       || lk == 46760               // 'json' 'castable'\n       || lk == 47272               // 'json' 'catch'\n       || lk == 48296               // 'json' 'child'\n       || lk == 48808               // 'json' 'collation'\n       || lk == 49832               // 'json' 'comment'\n       || lk == 50344               // 'json' 'constraint'\n       || lk == 50856               // 'json' 'construction'\n       || lk == 52392               // 'json' 'context'\n       || lk == 52904               // 'json' 'continue'\n       || lk == 53416               // 'json' 'copy'\n       || lk == 53928               // 'json' 'copy-namespaces'\n       || lk == 54440               // 'json' 'count'\n       || lk == 54952               // 'json' 'decimal-format'\n       || lk == 55976               // 'json' 'declare'\n       || lk == 56488               // 'json' 'default'\n       || lk == 57000               // 'json' 'delete'\n       || lk == 57512               // 'json' 'descendant'\n       || lk == 58024               // 'json' 'descendant-or-self'\n       || lk == 58536               // 'json' 'descending'\n       || lk == 61096               // 'json' 'div'\n       || lk == 61608               // 'json' 'document'\n       || lk == 62120               // 'json' 'document-node'\n       || lk == 62632               // 'json' 'element'\n       || lk == 63144               // 'json' 'else'\n       || lk == 63656               // 'json' 'empty'\n       || lk == 64168               // 'json' 'empty-sequence'\n       || lk == 64680               // 'json' 'encoding'\n       || lk == 65192               // 'json' 'end'\n       || lk == 66216               // 'json' 'eq'\n       || lk == 66728               // 'json' 'every'\n       || lk == 67752               // 'json' 'except'\n       || lk == 68264               // 'json' 'exit'\n       || lk == 68776               // 'json' 'external'\n       || lk == 69288               // 'json' 'false'\n       || lk == 69800               // 'json' 'first'\n       || lk == 70312               // 'json' 'following'\n       || lk == 70824               // 'json' 'following-sibling'\n       || lk == 71336               // 'json' 'for'\n       || lk == 72872               // 'json' 'from'\n       || lk == 73384               // 'json' 'ft-option'\n       || lk == 75432               // 'json' 'function'\n       || lk == 75944               // 'json' 'ge'\n       || lk == 76968               // 'json' 'group'\n       || lk == 77992               // 'json' 'gt'\n       || lk == 78504               // 'json' 'idiv'\n       || lk == 79016               // 'json' 'if'\n       || lk == 79528               // 'json' 'import'\n       || lk == 80040               // 'json' 'in'\n       || lk == 80552               // 'json' 'index'\n       || lk == 82600               // 'json' 'insert'\n       || lk == 83112               // 'json' 'instance'\n       || lk == 83624               // 'json' 'integrity'\n       || lk == 84136               // 'json' 'intersect'\n       || lk == 84648               // 'json' 'into'\n       || lk == 85160               // 'json' 'is'\n       || lk == 85672               // 'json' 'item'\n       || lk == 86184               // 'json' 'json'\n       || lk == 86696               // 'json' 'json-item'\n       || lk == 87208               // 'json' 'jsoniq'\n       || lk == 88744               // 'json' 'last'\n       || lk == 89256               // 'json' 'lax'\n       || lk == 89768               // 'json' 'le'\n       || lk == 90792               // 'json' 'let'\n       || lk == 91816               // 'json' 'loop'\n       || lk == 92840               // 'json' 'lt'\n       || lk == 93864               // 'json' 'mod'\n       || lk == 94376               // 'json' 'modify'\n       || lk == 94888               // 'json' 'module'\n       || lk == 95912               // 'json' 'namespace'\n       || lk == 96424               // 'json' 'namespace-node'\n       || lk == 96936               // 'json' 'ne'\n       || lk == 99496               // 'json' 'node'\n       || lk == 100008              // 'json' 'nodes'\n       || lk == 100520              // 'json' 'not'\n       || lk == 101032              // 'json' 'null'\n       || lk == 101544              // 'json' 'object'\n       || lk == 103592              // 'json' 'only'\n       || lk == 104104              // 'json' 'option'\n       || lk == 104616              // 'json' 'or'\n       || lk == 105128              // 'json' 'order'\n       || lk == 105640              // 'json' 'ordered'\n       || lk == 106152              // 'json' 'ordering'\n       || lk == 107688              // 'json' 'parent'\n       || lk == 110760              // 'json' 'preceding'\n       || lk == 111272              // 'json' 'preceding-sibling'\n       || lk == 112808              // 'json' 'processing-instruction'\n       || lk == 113832              // 'json' 'rename'\n       || lk == 114344              // 'json' 'replace'\n       || lk == 114856              // 'json' 'return'\n       || lk == 115368              // 'json' 'returning'\n       || lk == 115880              // 'json' 'revalidation'\n       || lk == 116904              // 'json' 'satisfies'\n       || lk == 117416              // 'json' 'schema'\n       || lk == 117928              // 'json' 'schema-attribute'\n       || lk == 118440              // 'json' 'schema-element'\n       || lk == 118952              // 'json' 'score'\n       || lk == 119464              // 'json' 'select'\n       || lk == 119976              // 'json' 'self'\n       || lk == 122536              // 'json' 'sliding'\n       || lk == 123048              // 'json' 'some'\n       || lk == 123560              // 'json' 'stable'\n       || lk == 124072              // 'json' 'start'\n       || lk == 125608              // 'json' 'strict'\n       || lk == 126632              // 'json' 'structured-item'\n       || lk == 127144              // 'json' 'switch'\n       || lk == 127656              // 'json' 'text'\n       || lk == 129704              // 'json' 'to'\n       || lk == 130216              // 'json' 'treat'\n       || lk == 130728              // 'json' 'true'\n       || lk == 131240              // 'json' 'try'\n       || lk == 131752              // 'json' 'tumbling'\n       || lk == 132264              // 'json' 'type'\n       || lk == 132776              // 'json' 'typeswitch'\n       || lk == 133288              // 'json' 'union'\n       || lk == 134312              // 'json' 'unordered'\n       || lk == 134824              // 'json' 'updating'\n       || lk == 136360              // 'json' 'validate'\n       || lk == 136872              // 'json' 'value'\n       || lk == 137384              // 'json' 'variable'\n       || lk == 137896              // 'json' 'version'\n       || lk == 139432              // 'json' 'where'\n       || lk == 139944              // 'json' 'while'\n       || lk == 141480              // 'json' 'with'\n       || lk == 144040              // 'json' '{'\n       || lk == 145064)             // 'json' '{|'\n      {\n        shiftT(168);                // 'json'\n      }\n      lookahead1W(268);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_PairConstructorList();\n      shiftT(165);                  // 'into'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_ExprSingle();\n    }\n  }\n\n  function parse_JSONRenameExpr()\n  {\n    eventHandler.startNonterminal(\"JSONRenameExpr\", e0);\n    shift(222);                     // 'rename'\n    lookahead1W(260);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    switch (l1)\n    {\n    case 168:                       // 'json'\n      lookahead2W(261);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 18088)                // 'json' '('\n    {\n      lk = memoized(16, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          shiftT(168);              // 'json'\n          lk = -1;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n        }\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(16, e0, lk);\n      }\n    }\n    if (lk == -1\n     || lk == 3240                  // 'json' EQName^Token\n     || lk == 4264                  // 'json' IntegerLiteral\n     || lk == 4776                  // 'json' DecimalLiteral\n     || lk == 5288                  // 'json' DoubleLiteral\n     || lk == 5800                  // 'json' StringLiteral\n     || lk == 16040                 // 'json' '$'\n     || lk == 16552                 // 'json' '$$'\n     || lk == 17064                 // 'json' '%'\n     || lk == 28328                 // 'json' '<'\n     || lk == 28840                 // 'json' '<!--'\n     || lk == 30888                 // 'json' '<?'\n     || lk == 35496                 // 'json' '['\n     || lk == 36520                 // 'json' 'after'\n     || lk == 37544                 // 'json' 'allowing'\n     || lk == 38056                 // 'json' 'ancestor'\n     || lk == 38568                 // 'json' 'ancestor-or-self'\n     || lk == 39080                 // 'json' 'and'\n     || lk == 40104                 // 'json' 'append'\n     || lk == 40616                 // 'json' 'array'\n     || lk == 41128                 // 'json' 'as'\n     || lk == 41640                 // 'json' 'ascending'\n     || lk == 42152                 // 'json' 'at'\n     || lk == 42664                 // 'json' 'attribute'\n     || lk == 43176                 // 'json' 'base-uri'\n     || lk == 43688                 // 'json' 'before'\n     || lk == 44200                 // 'json' 'boundary-space'\n     || lk == 44712                 // 'json' 'break'\n     || lk == 45736                 // 'json' 'case'\n     || lk == 46248                 // 'json' 'cast'\n     || lk == 46760                 // 'json' 'castable'\n     || lk == 47272                 // 'json' 'catch'\n     || lk == 48296                 // 'json' 'child'\n     || lk == 48808                 // 'json' 'collation'\n     || lk == 49832                 // 'json' 'comment'\n     || lk == 50344                 // 'json' 'constraint'\n     || lk == 50856                 // 'json' 'construction'\n     || lk == 52392                 // 'json' 'context'\n     || lk == 52904                 // 'json' 'continue'\n     || lk == 53416                 // 'json' 'copy'\n     || lk == 53928                 // 'json' 'copy-namespaces'\n     || lk == 54440                 // 'json' 'count'\n     || lk == 54952                 // 'json' 'decimal-format'\n     || lk == 55976                 // 'json' 'declare'\n     || lk == 56488                 // 'json' 'default'\n     || lk == 57000                 // 'json' 'delete'\n     || lk == 57512                 // 'json' 'descendant'\n     || lk == 58024                 // 'json' 'descendant-or-self'\n     || lk == 58536                 // 'json' 'descending'\n     || lk == 61096                 // 'json' 'div'\n     || lk == 61608                 // 'json' 'document'\n     || lk == 62120                 // 'json' 'document-node'\n     || lk == 62632                 // 'json' 'element'\n     || lk == 63144                 // 'json' 'else'\n     || lk == 63656                 // 'json' 'empty'\n     || lk == 64168                 // 'json' 'empty-sequence'\n     || lk == 64680                 // 'json' 'encoding'\n     || lk == 65192                 // 'json' 'end'\n     || lk == 66216                 // 'json' 'eq'\n     || lk == 66728                 // 'json' 'every'\n     || lk == 67752                 // 'json' 'except'\n     || lk == 68264                 // 'json' 'exit'\n     || lk == 68776                 // 'json' 'external'\n     || lk == 69288                 // 'json' 'false'\n     || lk == 69800                 // 'json' 'first'\n     || lk == 70312                 // 'json' 'following'\n     || lk == 70824                 // 'json' 'following-sibling'\n     || lk == 71336                 // 'json' 'for'\n     || lk == 72872                 // 'json' 'from'\n     || lk == 73384                 // 'json' 'ft-option'\n     || lk == 75432                 // 'json' 'function'\n     || lk == 75944                 // 'json' 'ge'\n     || lk == 76968                 // 'json' 'group'\n     || lk == 77992                 // 'json' 'gt'\n     || lk == 78504                 // 'json' 'idiv'\n     || lk == 79016                 // 'json' 'if'\n     || lk == 79528                 // 'json' 'import'\n     || lk == 80040                 // 'json' 'in'\n     || lk == 80552                 // 'json' 'index'\n     || lk == 82600                 // 'json' 'insert'\n     || lk == 83112                 // 'json' 'instance'\n     || lk == 83624                 // 'json' 'integrity'\n     || lk == 84136                 // 'json' 'intersect'\n     || lk == 84648                 // 'json' 'into'\n     || lk == 85160                 // 'json' 'is'\n     || lk == 85672                 // 'json' 'item'\n     || lk == 86184                 // 'json' 'json'\n     || lk == 86696                 // 'json' 'json-item'\n     || lk == 87208                 // 'json' 'jsoniq'\n     || lk == 88744                 // 'json' 'last'\n     || lk == 89256                 // 'json' 'lax'\n     || lk == 89768                 // 'json' 'le'\n     || lk == 90792                 // 'json' 'let'\n     || lk == 91816                 // 'json' 'loop'\n     || lk == 92840                 // 'json' 'lt'\n     || lk == 93864                 // 'json' 'mod'\n     || lk == 94376                 // 'json' 'modify'\n     || lk == 94888                 // 'json' 'module'\n     || lk == 95912                 // 'json' 'namespace'\n     || lk == 96424                 // 'json' 'namespace-node'\n     || lk == 96936                 // 'json' 'ne'\n     || lk == 99496                 // 'json' 'node'\n     || lk == 100008                // 'json' 'nodes'\n     || lk == 101032                // 'json' 'null'\n     || lk == 101544                // 'json' 'object'\n     || lk == 103592                // 'json' 'only'\n     || lk == 104104                // 'json' 'option'\n     || lk == 104616                // 'json' 'or'\n     || lk == 105128                // 'json' 'order'\n     || lk == 105640                // 'json' 'ordered'\n     || lk == 106152                // 'json' 'ordering'\n     || lk == 107688                // 'json' 'parent'\n     || lk == 110760                // 'json' 'preceding'\n     || lk == 111272                // 'json' 'preceding-sibling'\n     || lk == 112808                // 'json' 'processing-instruction'\n     || lk == 113832                // 'json' 'rename'\n     || lk == 114344                // 'json' 'replace'\n     || lk == 114856                // 'json' 'return'\n     || lk == 115368                // 'json' 'returning'\n     || lk == 115880                // 'json' 'revalidation'\n     || lk == 116904                // 'json' 'satisfies'\n     || lk == 117416                // 'json' 'schema'\n     || lk == 117928                // 'json' 'schema-attribute'\n     || lk == 118440                // 'json' 'schema-element'\n     || lk == 118952                // 'json' 'score'\n     || lk == 119464                // 'json' 'select'\n     || lk == 119976                // 'json' 'self'\n     || lk == 122536                // 'json' 'sliding'\n     || lk == 123048                // 'json' 'some'\n     || lk == 123560                // 'json' 'stable'\n     || lk == 124072                // 'json' 'start'\n     || lk == 125608                // 'json' 'strict'\n     || lk == 126632                // 'json' 'structured-item'\n     || lk == 127144                // 'json' 'switch'\n     || lk == 127656                // 'json' 'text'\n     || lk == 129704                // 'json' 'to'\n     || lk == 130216                // 'json' 'treat'\n     || lk == 130728                // 'json' 'true'\n     || lk == 131240                // 'json' 'try'\n     || lk == 131752                // 'json' 'tumbling'\n     || lk == 132264                // 'json' 'type'\n     || lk == 132776                // 'json' 'typeswitch'\n     || lk == 133288                // 'json' 'union'\n     || lk == 134312                // 'json' 'unordered'\n     || lk == 134824                // 'json' 'updating'\n     || lk == 136360                // 'json' 'validate'\n     || lk == 136872                // 'json' 'value'\n     || lk == 137384                // 'json' 'variable'\n     || lk == 137896                // 'json' 'version'\n     || lk == 139432                // 'json' 'where'\n     || lk == 139944                // 'json' 'while'\n     || lk == 141480                // 'json' 'with'\n     || lk == 144040                // 'json' '{'\n     || lk == 145064)               // 'json' '{|'\n    {\n      shift(168);                   // 'json'\n    }\n    lookahead1W(260);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_PostfixExpr();\n    shift(80);                      // 'as'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"JSONRenameExpr\", e0);\n  }\n\n  function try_JSONRenameExpr()\n  {\n    shiftT(222);                    // 'rename'\n    lookahead1W(260);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    switch (l1)\n    {\n    case 168:                       // 'json'\n      lookahead2W(261);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 18088)                // 'json' '('\n    {\n      lk = memoized(16, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          shiftT(168);              // 'json'\n          memoize(16, e0A, -1);\n        }\n        catch (p1A)\n        {\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(16, e0A, -2);\n        }\n        lk = -2;\n      }\n    }\n    if (lk == -1\n     || lk == 3240                  // 'json' EQName^Token\n     || lk == 4264                  // 'json' IntegerLiteral\n     || lk == 4776                  // 'json' DecimalLiteral\n     || lk == 5288                  // 'json' DoubleLiteral\n     || lk == 5800                  // 'json' StringLiteral\n     || lk == 16040                 // 'json' '$'\n     || lk == 16552                 // 'json' '$$'\n     || lk == 17064                 // 'json' '%'\n     || lk == 28328                 // 'json' '<'\n     || lk == 28840                 // 'json' '<!--'\n     || lk == 30888                 // 'json' '<?'\n     || lk == 35496                 // 'json' '['\n     || lk == 36520                 // 'json' 'after'\n     || lk == 37544                 // 'json' 'allowing'\n     || lk == 38056                 // 'json' 'ancestor'\n     || lk == 38568                 // 'json' 'ancestor-or-self'\n     || lk == 39080                 // 'json' 'and'\n     || lk == 40104                 // 'json' 'append'\n     || lk == 40616                 // 'json' 'array'\n     || lk == 41128                 // 'json' 'as'\n     || lk == 41640                 // 'json' 'ascending'\n     || lk == 42152                 // 'json' 'at'\n     || lk == 42664                 // 'json' 'attribute'\n     || lk == 43176                 // 'json' 'base-uri'\n     || lk == 43688                 // 'json' 'before'\n     || lk == 44200                 // 'json' 'boundary-space'\n     || lk == 44712                 // 'json' 'break'\n     || lk == 45736                 // 'json' 'case'\n     || lk == 46248                 // 'json' 'cast'\n     || lk == 46760                 // 'json' 'castable'\n     || lk == 47272                 // 'json' 'catch'\n     || lk == 48296                 // 'json' 'child'\n     || lk == 48808                 // 'json' 'collation'\n     || lk == 49832                 // 'json' 'comment'\n     || lk == 50344                 // 'json' 'constraint'\n     || lk == 50856                 // 'json' 'construction'\n     || lk == 52392                 // 'json' 'context'\n     || lk == 52904                 // 'json' 'continue'\n     || lk == 53416                 // 'json' 'copy'\n     || lk == 53928                 // 'json' 'copy-namespaces'\n     || lk == 54440                 // 'json' 'count'\n     || lk == 54952                 // 'json' 'decimal-format'\n     || lk == 55976                 // 'json' 'declare'\n     || lk == 56488                 // 'json' 'default'\n     || lk == 57000                 // 'json' 'delete'\n     || lk == 57512                 // 'json' 'descendant'\n     || lk == 58024                 // 'json' 'descendant-or-self'\n     || lk == 58536                 // 'json' 'descending'\n     || lk == 61096                 // 'json' 'div'\n     || lk == 61608                 // 'json' 'document'\n     || lk == 62120                 // 'json' 'document-node'\n     || lk == 62632                 // 'json' 'element'\n     || lk == 63144                 // 'json' 'else'\n     || lk == 63656                 // 'json' 'empty'\n     || lk == 64168                 // 'json' 'empty-sequence'\n     || lk == 64680                 // 'json' 'encoding'\n     || lk == 65192                 // 'json' 'end'\n     || lk == 66216                 // 'json' 'eq'\n     || lk == 66728                 // 'json' 'every'\n     || lk == 67752                 // 'json' 'except'\n     || lk == 68264                 // 'json' 'exit'\n     || lk == 68776                 // 'json' 'external'\n     || lk == 69288                 // 'json' 'false'\n     || lk == 69800                 // 'json' 'first'\n     || lk == 70312                 // 'json' 'following'\n     || lk == 70824                 // 'json' 'following-sibling'\n     || lk == 71336                 // 'json' 'for'\n     || lk == 72872                 // 'json' 'from'\n     || lk == 73384                 // 'json' 'ft-option'\n     || lk == 75432                 // 'json' 'function'\n     || lk == 75944                 // 'json' 'ge'\n     || lk == 76968                 // 'json' 'group'\n     || lk == 77992                 // 'json' 'gt'\n     || lk == 78504                 // 'json' 'idiv'\n     || lk == 79016                 // 'json' 'if'\n     || lk == 79528                 // 'json' 'import'\n     || lk == 80040                 // 'json' 'in'\n     || lk == 80552                 // 'json' 'index'\n     || lk == 82600                 // 'json' 'insert'\n     || lk == 83112                 // 'json' 'instance'\n     || lk == 83624                 // 'json' 'integrity'\n     || lk == 84136                 // 'json' 'intersect'\n     || lk == 84648                 // 'json' 'into'\n     || lk == 85160                 // 'json' 'is'\n     || lk == 85672                 // 'json' 'item'\n     || lk == 86184                 // 'json' 'json'\n     || lk == 86696                 // 'json' 'json-item'\n     || lk == 87208                 // 'json' 'jsoniq'\n     || lk == 88744                 // 'json' 'last'\n     || lk == 89256                 // 'json' 'lax'\n     || lk == 89768                 // 'json' 'le'\n     || lk == 90792                 // 'json' 'let'\n     || lk == 91816                 // 'json' 'loop'\n     || lk == 92840                 // 'json' 'lt'\n     || lk == 93864                 // 'json' 'mod'\n     || lk == 94376                 // 'json' 'modify'\n     || lk == 94888                 // 'json' 'module'\n     || lk == 95912                 // 'json' 'namespace'\n     || lk == 96424                 // 'json' 'namespace-node'\n     || lk == 96936                 // 'json' 'ne'\n     || lk == 99496                 // 'json' 'node'\n     || lk == 100008                // 'json' 'nodes'\n     || lk == 101032                // 'json' 'null'\n     || lk == 101544                // 'json' 'object'\n     || lk == 103592                // 'json' 'only'\n     || lk == 104104                // 'json' 'option'\n     || lk == 104616                // 'json' 'or'\n     || lk == 105128                // 'json' 'order'\n     || lk == 105640                // 'json' 'ordered'\n     || lk == 106152                // 'json' 'ordering'\n     || lk == 107688                // 'json' 'parent'\n     || lk == 110760                // 'json' 'preceding'\n     || lk == 111272                // 'json' 'preceding-sibling'\n     || lk == 112808                // 'json' 'processing-instruction'\n     || lk == 113832                // 'json' 'rename'\n     || lk == 114344                // 'json' 'replace'\n     || lk == 114856                // 'json' 'return'\n     || lk == 115368                // 'json' 'returning'\n     || lk == 115880                // 'json' 'revalidation'\n     || lk == 116904                // 'json' 'satisfies'\n     || lk == 117416                // 'json' 'schema'\n     || lk == 117928                // 'json' 'schema-attribute'\n     || lk == 118440                // 'json' 'schema-element'\n     || lk == 118952                // 'json' 'score'\n     || lk == 119464                // 'json' 'select'\n     || lk == 119976                // 'json' 'self'\n     || lk == 122536                // 'json' 'sliding'\n     || lk == 123048                // 'json' 'some'\n     || lk == 123560                // 'json' 'stable'\n     || lk == 124072                // 'json' 'start'\n     || lk == 125608                // 'json' 'strict'\n     || lk == 126632                // 'json' 'structured-item'\n     || lk == 127144                // 'json' 'switch'\n     || lk == 127656                // 'json' 'text'\n     || lk == 129704                // 'json' 'to'\n     || lk == 130216                // 'json' 'treat'\n     || lk == 130728                // 'json' 'true'\n     || lk == 131240                // 'json' 'try'\n     || lk == 131752                // 'json' 'tumbling'\n     || lk == 132264                // 'json' 'type'\n     || lk == 132776                // 'json' 'typeswitch'\n     || lk == 133288                // 'json' 'union'\n     || lk == 134312                // 'json' 'unordered'\n     || lk == 134824                // 'json' 'updating'\n     || lk == 136360                // 'json' 'validate'\n     || lk == 136872                // 'json' 'value'\n     || lk == 137384                // 'json' 'variable'\n     || lk == 137896                // 'json' 'version'\n     || lk == 139432                // 'json' 'where'\n     || lk == 139944                // 'json' 'while'\n     || lk == 141480                // 'json' 'with'\n     || lk == 144040                // 'json' '{'\n     || lk == 145064)               // 'json' '{|'\n    {\n      shiftT(168);                  // 'json'\n    }\n    lookahead1W(260);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_PostfixExpr();\n    shiftT(80);                     // 'as'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_JSONReplaceExpr()\n  {\n    eventHandler.startNonterminal(\"JSONReplaceExpr\", e0);\n    shift(223);                     // 'replace'\n    lookahead1W(85);                // S^WS | '(:' | 'value'\n    shift(267);                     // 'value'\n    lookahead1W(67);                // S^WS | '(:' | 'of'\n    shift(200);                     // 'of'\n    lookahead1W(59);                // S^WS | '(:' | 'json'\n    shift(168);                     // 'json'\n    lookahead1W(260);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_PostfixExpr();\n    shift(276);                     // 'with'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"JSONReplaceExpr\", e0);\n  }\n\n  function try_JSONReplaceExpr()\n  {\n    shiftT(223);                    // 'replace'\n    lookahead1W(85);                // S^WS | '(:' | 'value'\n    shiftT(267);                    // 'value'\n    lookahead1W(67);                // S^WS | '(:' | 'of'\n    shiftT(200);                    // 'of'\n    lookahead1W(59);                // S^WS | '(:' | 'json'\n    shiftT(168);                    // 'json'\n    lookahead1W(260);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_PostfixExpr();\n    shiftT(276);                    // 'with'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_JSONAppendExpr()\n  {\n    eventHandler.startNonterminal(\"JSONAppendExpr\", e0);\n    shift(78);                      // 'append'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    switch (l1)\n    {\n    case 168:                       // 'json'\n      lookahead2W(269);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 18088)                // 'json' '('\n    {\n      lk = memoized(17, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          shiftT(168);              // 'json'\n          lk = -1;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n        }\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(17, e0, lk);\n      }\n    }\n    if (lk == -1\n     || lk == 3240                  // 'json' EQName^Token\n     || lk == 4264                  // 'json' IntegerLiteral\n     || lk == 4776                  // 'json' DecimalLiteral\n     || lk == 5288                  // 'json' DoubleLiteral\n     || lk == 5800                  // 'json' StringLiteral\n     || lk == 16040                 // 'json' '$'\n     || lk == 16552                 // 'json' '$$'\n     || lk == 17064                 // 'json' '%'\n     || lk == 18600                 // 'json' '(#'\n     || lk == 21160                 // 'json' '+'\n     || lk == 22184                 // 'json' '-'\n     || lk == 24232                 // 'json' '/'\n     || lk == 24744                 // 'json' '//'\n     || lk == 28328                 // 'json' '<'\n     || lk == 28840                 // 'json' '<!--'\n     || lk == 30888                 // 'json' '<?'\n     || lk == 35496                 // 'json' '['\n     || lk == 36520                 // 'json' 'after'\n     || lk == 37544                 // 'json' 'allowing'\n     || lk == 38056                 // 'json' 'ancestor'\n     || lk == 38568                 // 'json' 'ancestor-or-self'\n     || lk == 39080                 // 'json' 'and'\n     || lk == 40104                 // 'json' 'append'\n     || lk == 40616                 // 'json' 'array'\n     || lk == 41128                 // 'json' 'as'\n     || lk == 41640                 // 'json' 'ascending'\n     || lk == 42152                 // 'json' 'at'\n     || lk == 42664                 // 'json' 'attribute'\n     || lk == 43176                 // 'json' 'base-uri'\n     || lk == 43688                 // 'json' 'before'\n     || lk == 44200                 // 'json' 'boundary-space'\n     || lk == 44712                 // 'json' 'break'\n     || lk == 45736                 // 'json' 'case'\n     || lk == 46248                 // 'json' 'cast'\n     || lk == 46760                 // 'json' 'castable'\n     || lk == 47272                 // 'json' 'catch'\n     || lk == 48296                 // 'json' 'child'\n     || lk == 48808                 // 'json' 'collation'\n     || lk == 49832                 // 'json' 'comment'\n     || lk == 50344                 // 'json' 'constraint'\n     || lk == 50856                 // 'json' 'construction'\n     || lk == 52392                 // 'json' 'context'\n     || lk == 52904                 // 'json' 'continue'\n     || lk == 53416                 // 'json' 'copy'\n     || lk == 53928                 // 'json' 'copy-namespaces'\n     || lk == 54440                 // 'json' 'count'\n     || lk == 54952                 // 'json' 'decimal-format'\n     || lk == 55976                 // 'json' 'declare'\n     || lk == 56488                 // 'json' 'default'\n     || lk == 57000                 // 'json' 'delete'\n     || lk == 57512                 // 'json' 'descendant'\n     || lk == 58024                 // 'json' 'descendant-or-self'\n     || lk == 58536                 // 'json' 'descending'\n     || lk == 61096                 // 'json' 'div'\n     || lk == 61608                 // 'json' 'document'\n     || lk == 62120                 // 'json' 'document-node'\n     || lk == 62632                 // 'json' 'element'\n     || lk == 63144                 // 'json' 'else'\n     || lk == 63656                 // 'json' 'empty'\n     || lk == 64168                 // 'json' 'empty-sequence'\n     || lk == 64680                 // 'json' 'encoding'\n     || lk == 65192                 // 'json' 'end'\n     || lk == 66216                 // 'json' 'eq'\n     || lk == 66728                 // 'json' 'every'\n     || lk == 67752                 // 'json' 'except'\n     || lk == 68264                 // 'json' 'exit'\n     || lk == 68776                 // 'json' 'external'\n     || lk == 69288                 // 'json' 'false'\n     || lk == 69800                 // 'json' 'first'\n     || lk == 70312                 // 'json' 'following'\n     || lk == 70824                 // 'json' 'following-sibling'\n     || lk == 71336                 // 'json' 'for'\n     || lk == 72872                 // 'json' 'from'\n     || lk == 73384                 // 'json' 'ft-option'\n     || lk == 75432                 // 'json' 'function'\n     || lk == 75944                 // 'json' 'ge'\n     || lk == 76968                 // 'json' 'group'\n     || lk == 77992                 // 'json' 'gt'\n     || lk == 78504                 // 'json' 'idiv'\n     || lk == 79016                 // 'json' 'if'\n     || lk == 79528                 // 'json' 'import'\n     || lk == 80040                 // 'json' 'in'\n     || lk == 80552                 // 'json' 'index'\n     || lk == 82600                 // 'json' 'insert'\n     || lk == 83112                 // 'json' 'instance'\n     || lk == 83624                 // 'json' 'integrity'\n     || lk == 84136                 // 'json' 'intersect'\n     || lk == 84648                 // 'json' 'into'\n     || lk == 85160                 // 'json' 'is'\n     || lk == 85672                 // 'json' 'item'\n     || lk == 86184                 // 'json' 'json'\n     || lk == 86696                 // 'json' 'json-item'\n     || lk == 87208                 // 'json' 'jsoniq'\n     || lk == 88744                 // 'json' 'last'\n     || lk == 89256                 // 'json' 'lax'\n     || lk == 89768                 // 'json' 'le'\n     || lk == 90792                 // 'json' 'let'\n     || lk == 91816                 // 'json' 'loop'\n     || lk == 92840                 // 'json' 'lt'\n     || lk == 93864                 // 'json' 'mod'\n     || lk == 94376                 // 'json' 'modify'\n     || lk == 94888                 // 'json' 'module'\n     || lk == 95912                 // 'json' 'namespace'\n     || lk == 96424                 // 'json' 'namespace-node'\n     || lk == 96936                 // 'json' 'ne'\n     || lk == 99496                 // 'json' 'node'\n     || lk == 100008                // 'json' 'nodes'\n     || lk == 100520                // 'json' 'not'\n     || lk == 101032                // 'json' 'null'\n     || lk == 101544                // 'json' 'object'\n     || lk == 103592                // 'json' 'only'\n     || lk == 104104                // 'json' 'option'\n     || lk == 104616                // 'json' 'or'\n     || lk == 105128                // 'json' 'order'\n     || lk == 105640                // 'json' 'ordered'\n     || lk == 106152                // 'json' 'ordering'\n     || lk == 107688                // 'json' 'parent'\n     || lk == 110760                // 'json' 'preceding'\n     || lk == 111272                // 'json' 'preceding-sibling'\n     || lk == 112808                // 'json' 'processing-instruction'\n     || lk == 113832                // 'json' 'rename'\n     || lk == 114344                // 'json' 'replace'\n     || lk == 114856                // 'json' 'return'\n     || lk == 115368                // 'json' 'returning'\n     || lk == 115880                // 'json' 'revalidation'\n     || lk == 116904                // 'json' 'satisfies'\n     || lk == 117416                // 'json' 'schema'\n     || lk == 117928                // 'json' 'schema-attribute'\n     || lk == 118440                // 'json' 'schema-element'\n     || lk == 118952                // 'json' 'score'\n     || lk == 119464                // 'json' 'select'\n     || lk == 119976                // 'json' 'self'\n     || lk == 122536                // 'json' 'sliding'\n     || lk == 123048                // 'json' 'some'\n     || lk == 123560                // 'json' 'stable'\n     || lk == 124072                // 'json' 'start'\n     || lk == 125608                // 'json' 'strict'\n     || lk == 126632                // 'json' 'structured-item'\n     || lk == 127144                // 'json' 'switch'\n     || lk == 127656                // 'json' 'text'\n     || lk == 129704                // 'json' 'to'\n     || lk == 130216                // 'json' 'treat'\n     || lk == 130728                // 'json' 'true'\n     || lk == 131240                // 'json' 'try'\n     || lk == 131752                // 'json' 'tumbling'\n     || lk == 132264                // 'json' 'type'\n     || lk == 132776                // 'json' 'typeswitch'\n     || lk == 133288                // 'json' 'union'\n     || lk == 134312                // 'json' 'unordered'\n     || lk == 134824                // 'json' 'updating'\n     || lk == 136360                // 'json' 'validate'\n     || lk == 136872                // 'json' 'value'\n     || lk == 137384                // 'json' 'variable'\n     || lk == 137896                // 'json' 'version'\n     || lk == 139432                // 'json' 'where'\n     || lk == 139944                // 'json' 'while'\n     || lk == 141480                // 'json' 'with'\n     || lk == 144040                // 'json' '{'\n     || lk == 145064)               // 'json' '{|'\n    {\n      shift(168);                   // 'json'\n    }\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    shift(165);                     // 'into'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"JSONAppendExpr\", e0);\n  }\n\n  function try_JSONAppendExpr()\n  {\n    shiftT(78);                     // 'append'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    switch (l1)\n    {\n    case 168:                       // 'json'\n      lookahead2W(269);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 18088)                // 'json' '('\n    {\n      lk = memoized(17, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          shiftT(168);              // 'json'\n          memoize(17, e0A, -1);\n        }\n        catch (p1A)\n        {\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(17, e0A, -2);\n        }\n        lk = -2;\n      }\n    }\n    if (lk == -1\n     || lk == 3240                  // 'json' EQName^Token\n     || lk == 4264                  // 'json' IntegerLiteral\n     || lk == 4776                  // 'json' DecimalLiteral\n     || lk == 5288                  // 'json' DoubleLiteral\n     || lk == 5800                  // 'json' StringLiteral\n     || lk == 16040                 // 'json' '$'\n     || lk == 16552                 // 'json' '$$'\n     || lk == 17064                 // 'json' '%'\n     || lk == 18600                 // 'json' '(#'\n     || lk == 21160                 // 'json' '+'\n     || lk == 22184                 // 'json' '-'\n     || lk == 24232                 // 'json' '/'\n     || lk == 24744                 // 'json' '//'\n     || lk == 28328                 // 'json' '<'\n     || lk == 28840                 // 'json' '<!--'\n     || lk == 30888                 // 'json' '<?'\n     || lk == 35496                 // 'json' '['\n     || lk == 36520                 // 'json' 'after'\n     || lk == 37544                 // 'json' 'allowing'\n     || lk == 38056                 // 'json' 'ancestor'\n     || lk == 38568                 // 'json' 'ancestor-or-self'\n     || lk == 39080                 // 'json' 'and'\n     || lk == 40104                 // 'json' 'append'\n     || lk == 40616                 // 'json' 'array'\n     || lk == 41128                 // 'json' 'as'\n     || lk == 41640                 // 'json' 'ascending'\n     || lk == 42152                 // 'json' 'at'\n     || lk == 42664                 // 'json' 'attribute'\n     || lk == 43176                 // 'json' 'base-uri'\n     || lk == 43688                 // 'json' 'before'\n     || lk == 44200                 // 'json' 'boundary-space'\n     || lk == 44712                 // 'json' 'break'\n     || lk == 45736                 // 'json' 'case'\n     || lk == 46248                 // 'json' 'cast'\n     || lk == 46760                 // 'json' 'castable'\n     || lk == 47272                 // 'json' 'catch'\n     || lk == 48296                 // 'json' 'child'\n     || lk == 48808                 // 'json' 'collation'\n     || lk == 49832                 // 'json' 'comment'\n     || lk == 50344                 // 'json' 'constraint'\n     || lk == 50856                 // 'json' 'construction'\n     || lk == 52392                 // 'json' 'context'\n     || lk == 52904                 // 'json' 'continue'\n     || lk == 53416                 // 'json' 'copy'\n     || lk == 53928                 // 'json' 'copy-namespaces'\n     || lk == 54440                 // 'json' 'count'\n     || lk == 54952                 // 'json' 'decimal-format'\n     || lk == 55976                 // 'json' 'declare'\n     || lk == 56488                 // 'json' 'default'\n     || lk == 57000                 // 'json' 'delete'\n     || lk == 57512                 // 'json' 'descendant'\n     || lk == 58024                 // 'json' 'descendant-or-self'\n     || lk == 58536                 // 'json' 'descending'\n     || lk == 61096                 // 'json' 'div'\n     || lk == 61608                 // 'json' 'document'\n     || lk == 62120                 // 'json' 'document-node'\n     || lk == 62632                 // 'json' 'element'\n     || lk == 63144                 // 'json' 'else'\n     || lk == 63656                 // 'json' 'empty'\n     || lk == 64168                 // 'json' 'empty-sequence'\n     || lk == 64680                 // 'json' 'encoding'\n     || lk == 65192                 // 'json' 'end'\n     || lk == 66216                 // 'json' 'eq'\n     || lk == 66728                 // 'json' 'every'\n     || lk == 67752                 // 'json' 'except'\n     || lk == 68264                 // 'json' 'exit'\n     || lk == 68776                 // 'json' 'external'\n     || lk == 69288                 // 'json' 'false'\n     || lk == 69800                 // 'json' 'first'\n     || lk == 70312                 // 'json' 'following'\n     || lk == 70824                 // 'json' 'following-sibling'\n     || lk == 71336                 // 'json' 'for'\n     || lk == 72872                 // 'json' 'from'\n     || lk == 73384                 // 'json' 'ft-option'\n     || lk == 75432                 // 'json' 'function'\n     || lk == 75944                 // 'json' 'ge'\n     || lk == 76968                 // 'json' 'group'\n     || lk == 77992                 // 'json' 'gt'\n     || lk == 78504                 // 'json' 'idiv'\n     || lk == 79016                 // 'json' 'if'\n     || lk == 79528                 // 'json' 'import'\n     || lk == 80040                 // 'json' 'in'\n     || lk == 80552                 // 'json' 'index'\n     || lk == 82600                 // 'json' 'insert'\n     || lk == 83112                 // 'json' 'instance'\n     || lk == 83624                 // 'json' 'integrity'\n     || lk == 84136                 // 'json' 'intersect'\n     || lk == 84648                 // 'json' 'into'\n     || lk == 85160                 // 'json' 'is'\n     || lk == 85672                 // 'json' 'item'\n     || lk == 86184                 // 'json' 'json'\n     || lk == 86696                 // 'json' 'json-item'\n     || lk == 87208                 // 'json' 'jsoniq'\n     || lk == 88744                 // 'json' 'last'\n     || lk == 89256                 // 'json' 'lax'\n     || lk == 89768                 // 'json' 'le'\n     || lk == 90792                 // 'json' 'let'\n     || lk == 91816                 // 'json' 'loop'\n     || lk == 92840                 // 'json' 'lt'\n     || lk == 93864                 // 'json' 'mod'\n     || lk == 94376                 // 'json' 'modify'\n     || lk == 94888                 // 'json' 'module'\n     || lk == 95912                 // 'json' 'namespace'\n     || lk == 96424                 // 'json' 'namespace-node'\n     || lk == 96936                 // 'json' 'ne'\n     || lk == 99496                 // 'json' 'node'\n     || lk == 100008                // 'json' 'nodes'\n     || lk == 100520                // 'json' 'not'\n     || lk == 101032                // 'json' 'null'\n     || lk == 101544                // 'json' 'object'\n     || lk == 103592                // 'json' 'only'\n     || lk == 104104                // 'json' 'option'\n     || lk == 104616                // 'json' 'or'\n     || lk == 105128                // 'json' 'order'\n     || lk == 105640                // 'json' 'ordered'\n     || lk == 106152                // 'json' 'ordering'\n     || lk == 107688                // 'json' 'parent'\n     || lk == 110760                // 'json' 'preceding'\n     || lk == 111272                // 'json' 'preceding-sibling'\n     || lk == 112808                // 'json' 'processing-instruction'\n     || lk == 113832                // 'json' 'rename'\n     || lk == 114344                // 'json' 'replace'\n     || lk == 114856                // 'json' 'return'\n     || lk == 115368                // 'json' 'returning'\n     || lk == 115880                // 'json' 'revalidation'\n     || lk == 116904                // 'json' 'satisfies'\n     || lk == 117416                // 'json' 'schema'\n     || lk == 117928                // 'json' 'schema-attribute'\n     || lk == 118440                // 'json' 'schema-element'\n     || lk == 118952                // 'json' 'score'\n     || lk == 119464                // 'json' 'select'\n     || lk == 119976                // 'json' 'self'\n     || lk == 122536                // 'json' 'sliding'\n     || lk == 123048                // 'json' 'some'\n     || lk == 123560                // 'json' 'stable'\n     || lk == 124072                // 'json' 'start'\n     || lk == 125608                // 'json' 'strict'\n     || lk == 126632                // 'json' 'structured-item'\n     || lk == 127144                // 'json' 'switch'\n     || lk == 127656                // 'json' 'text'\n     || lk == 129704                // 'json' 'to'\n     || lk == 130216                // 'json' 'treat'\n     || lk == 130728                // 'json' 'true'\n     || lk == 131240                // 'json' 'try'\n     || lk == 131752                // 'json' 'tumbling'\n     || lk == 132264                // 'json' 'type'\n     || lk == 132776                // 'json' 'typeswitch'\n     || lk == 133288                // 'json' 'union'\n     || lk == 134312                // 'json' 'unordered'\n     || lk == 134824                // 'json' 'updating'\n     || lk == 136360                // 'json' 'validate'\n     || lk == 136872                // 'json' 'value'\n     || lk == 137384                // 'json' 'variable'\n     || lk == 137896                // 'json' 'version'\n     || lk == 139432                // 'json' 'where'\n     || lk == 139944                // 'json' 'while'\n     || lk == 141480                // 'json' 'with'\n     || lk == 144040                // 'json' '{'\n     || lk == 145064)               // 'json' '{|'\n    {\n      shiftT(168);                  // 'json'\n    }\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n    shiftT(165);                    // 'into'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_CommonContent()\n  {\n    eventHandler.startNonterminal(\"CommonContent\", e0);\n    switch (l1)\n    {\n    case 12:                        // PredefinedEntityRef\n      shift(12);                    // PredefinedEntityRef\n      break;\n    case 23:                        // CharRef\n      shift(23);                    // CharRef\n      break;\n    case 282:                       // '{{'\n      shift(282);                   // '{{'\n      break;\n    case 288:                       // '}}'\n      shift(288);                   // '}}'\n      break;\n    default:\n      parse_BlockExpr();\n    }\n    eventHandler.endNonterminal(\"CommonContent\", e0);\n  }\n\n  function try_CommonContent()\n  {\n    switch (l1)\n    {\n    case 12:                        // PredefinedEntityRef\n      shiftT(12);                   // PredefinedEntityRef\n      break;\n    case 23:                        // CharRef\n      shiftT(23);                   // CharRef\n      break;\n    case 282:                       // '{{'\n      shiftT(282);                  // '{{'\n      break;\n    case 288:                       // '}}'\n      shiftT(288);                  // '}}'\n      break;\n    default:\n      try_BlockExpr();\n    }\n  }\n\n  function parse_ContentExpr()\n  {\n    eventHandler.startNonterminal(\"ContentExpr\", e0);\n    parse_StatementsAndExpr();\n    eventHandler.endNonterminal(\"ContentExpr\", e0);\n  }\n\n  function try_ContentExpr()\n  {\n    try_StatementsAndExpr();\n  }\n\n  function parse_CompDocConstructor()\n  {\n    eventHandler.startNonterminal(\"CompDocConstructor\", e0);\n    shift(120);                     // 'document'\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    whitespace();\n    parse_BlockExpr();\n    eventHandler.endNonterminal(\"CompDocConstructor\", e0);\n  }\n\n  function try_CompDocConstructor()\n  {\n    shiftT(120);                    // 'document'\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    try_BlockExpr();\n  }\n\n  function parse_CompAttrConstructor()\n  {\n    eventHandler.startNonterminal(\"CompAttrConstructor\", e0);\n    shift(83);                      // 'attribute'\n    lookahead1W(250);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    switch (l1)\n    {\n    case 281:                       // '{'\n      shift(281);                   // '{'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_Expr();\n      shift(287);                   // '}'\n      break;\n    default:\n      whitespace();\n      parse_EQName();\n    }\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    switch (l1)\n    {\n    case 281:                       // '{'\n      lookahead2W(281);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 147225)               // '{' '}'\n    {\n      lk = memoized(18, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          shiftT(281);              // '{'\n          lookahead1W(91);          // S^WS | '(:' | '}'\n          shiftT(287);              // '}'\n          lk = -1;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n        }\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(18, e0, lk);\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n      shift(281);                   // '{'\n      lookahead1W(91);              // S^WS | '(:' | '}'\n      shift(287);                   // '}'\n      break;\n    default:\n      whitespace();\n      parse_BlockExpr();\n    }\n    eventHandler.endNonterminal(\"CompAttrConstructor\", e0);\n  }\n\n  function try_CompAttrConstructor()\n  {\n    shiftT(83);                     // 'attribute'\n    lookahead1W(250);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    switch (l1)\n    {\n    case 281:                       // '{'\n      shiftT(281);                  // '{'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_Expr();\n      shiftT(287);                  // '}'\n      break;\n    default:\n      try_EQName();\n    }\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    switch (l1)\n    {\n    case 281:                       // '{'\n      lookahead2W(281);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 147225)               // '{' '}'\n    {\n      lk = memoized(18, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          shiftT(281);              // '{'\n          lookahead1W(91);          // S^WS | '(:' | '}'\n          shiftT(287);              // '}'\n          memoize(18, e0A, -1);\n          lk = -3;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(18, e0A, -2);\n        }\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n      shiftT(281);                  // '{'\n      lookahead1W(91);              // S^WS | '(:' | '}'\n      shiftT(287);                  // '}'\n      break;\n    case -3:\n      break;\n    default:\n      try_BlockExpr();\n    }\n  }\n\n  function parse_CompPIConstructor()\n  {\n    eventHandler.startNonterminal(\"CompPIConstructor\", e0);\n    shift(220);                     // 'processing-instruction'\n    lookahead1W(242);               // NCName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    switch (l1)\n    {\n    case 281:                       // '{'\n      shift(281);                   // '{'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_Expr();\n      shift(287);                   // '}'\n      break;\n    default:\n      whitespace();\n      parse_NCName();\n    }\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    switch (l1)\n    {\n    case 281:                       // '{'\n      lookahead2W(281);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 147225)               // '{' '}'\n    {\n      lk = memoized(19, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          shiftT(281);              // '{'\n          lookahead1W(91);          // S^WS | '(:' | '}'\n          shiftT(287);              // '}'\n          lk = -1;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n        }\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(19, e0, lk);\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n      shift(281);                   // '{'\n      lookahead1W(91);              // S^WS | '(:' | '}'\n      shift(287);                   // '}'\n      break;\n    default:\n      whitespace();\n      parse_BlockExpr();\n    }\n    eventHandler.endNonterminal(\"CompPIConstructor\", e0);\n  }\n\n  function try_CompPIConstructor()\n  {\n    shiftT(220);                    // 'processing-instruction'\n    lookahead1W(242);               // NCName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    switch (l1)\n    {\n    case 281:                       // '{'\n      shiftT(281);                  // '{'\n      lookahead1W(267);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_Expr();\n      shiftT(287);                  // '}'\n      break;\n    default:\n      try_NCName();\n    }\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    switch (l1)\n    {\n    case 281:                       // '{'\n      lookahead2W(281);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 147225)               // '{' '}'\n    {\n      lk = memoized(19, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          shiftT(281);              // '{'\n          lookahead1W(91);          // S^WS | '(:' | '}'\n          shiftT(287);              // '}'\n          memoize(19, e0A, -1);\n          lk = -3;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(19, e0A, -2);\n        }\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n      shiftT(281);                  // '{'\n      lookahead1W(91);              // S^WS | '(:' | '}'\n      shiftT(287);                  // '}'\n      break;\n    case -3:\n      break;\n    default:\n      try_BlockExpr();\n    }\n  }\n\n  function parse_CompCommentConstructor()\n  {\n    eventHandler.startNonterminal(\"CompCommentConstructor\", e0);\n    shift(97);                      // 'comment'\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    whitespace();\n    parse_BlockExpr();\n    eventHandler.endNonterminal(\"CompCommentConstructor\", e0);\n  }\n\n  function try_CompCommentConstructor()\n  {\n    shiftT(97);                     // 'comment'\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    try_BlockExpr();\n  }\n\n  function parse_CompTextConstructor()\n  {\n    eventHandler.startNonterminal(\"CompTextConstructor\", e0);\n    shift(249);                     // 'text'\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    whitespace();\n    parse_BlockExpr();\n    eventHandler.endNonterminal(\"CompTextConstructor\", e0);\n  }\n\n  function try_CompTextConstructor()\n  {\n    shiftT(249);                    // 'text'\n    lookahead1W(90);                // S^WS | '(:' | '{'\n    try_BlockExpr();\n  }\n\n  function parse_PrimaryExpr()\n  {\n    eventHandler.startNonterminal(\"PrimaryExpr\", e0);\n    switch (l1)\n    {\n    case 187:                       // 'namespace'\n      lookahead2W(247);             // NCName^Token | S^WS | '#' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    case 220:                       // 'processing-instruction'\n      lookahead2W(245);             // NCName^Token | S^WS | '#' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    case 281:                       // '{'\n      lookahead2W(283);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    case 83:                        // 'attribute'\n    case 122:                       // 'element'\n      lookahead2W(253);             // EQName^Token | S^WS | '#' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    case 97:                        // 'comment'\n    case 249:                       // 'text'\n      lookahead2W(97);              // S^WS | '#' | '(:' | '{'\n      break;\n    case 120:                       // 'document'\n    case 206:                       // 'ordered'\n    case 262:                       // 'unordered'\n      lookahead2W(148);             // S^WS | '#' | '(' | '(:' | '{'\n      break;\n    case 135:                       // 'false'\n    case 197:                       // 'null'\n    case 255:                       // 'true'\n      lookahead2W(237);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '.' |\n      break;\n    case 6:                         // EQName^Token\n    case 71:                        // 'after'\n    case 73:                        // 'allowing'\n    case 74:                        // 'ancestor'\n    case 75:                        // 'ancestor-or-self'\n    case 76:                        // 'and'\n    case 78:                        // 'append'\n    case 80:                        // 'as'\n    case 81:                        // 'ascending'\n    case 82:                        // 'at'\n    case 84:                        // 'base-uri'\n    case 85:                        // 'before'\n    case 86:                        // 'boundary-space'\n    case 87:                        // 'break'\n    case 89:                        // 'case'\n    case 90:                        // 'cast'\n    case 91:                        // 'castable'\n    case 92:                        // 'catch'\n    case 94:                        // 'child'\n    case 95:                        // 'collation'\n    case 98:                        // 'constraint'\n    case 99:                        // 'construction'\n    case 102:                       // 'context'\n    case 103:                       // 'continue'\n    case 104:                       // 'copy'\n    case 105:                       // 'copy-namespaces'\n    case 106:                       // 'count'\n    case 107:                       // 'decimal-format'\n    case 109:                       // 'declare'\n    case 110:                       // 'default'\n    case 111:                       // 'delete'\n    case 112:                       // 'descendant'\n    case 113:                       // 'descendant-or-self'\n    case 114:                       // 'descending'\n    case 119:                       // 'div'\n    case 123:                       // 'else'\n    case 124:                       // 'empty'\n    case 126:                       // 'encoding'\n    case 127:                       // 'end'\n    case 129:                       // 'eq'\n    case 130:                       // 'every'\n    case 132:                       // 'except'\n    case 133:                       // 'exit'\n    case 134:                       // 'external'\n    case 136:                       // 'first'\n    case 137:                       // 'following'\n    case 138:                       // 'following-sibling'\n    case 139:                       // 'for'\n    case 142:                       // 'from'\n    case 143:                       // 'ft-option'\n    case 148:                       // 'ge'\n    case 150:                       // 'group'\n    case 152:                       // 'gt'\n    case 153:                       // 'idiv'\n    case 155:                       // 'import'\n    case 156:                       // 'in'\n    case 157:                       // 'index'\n    case 161:                       // 'insert'\n    case 162:                       // 'instance'\n    case 163:                       // 'integrity'\n    case 164:                       // 'intersect'\n    case 165:                       // 'into'\n    case 166:                       // 'is'\n    case 168:                       // 'json'\n    case 170:                       // 'jsoniq'\n    case 173:                       // 'last'\n    case 174:                       // 'lax'\n    case 175:                       // 'le'\n    case 177:                       // 'let'\n    case 179:                       // 'loop'\n    case 181:                       // 'lt'\n    case 183:                       // 'mod'\n    case 184:                       // 'modify'\n    case 185:                       // 'module'\n    case 189:                       // 'ne'\n    case 195:                       // 'nodes'\n    case 198:                       // 'object'\n    case 202:                       // 'only'\n    case 203:                       // 'option'\n    case 204:                       // 'or'\n    case 205:                       // 'order'\n    case 207:                       // 'ordering'\n    case 210:                       // 'parent'\n    case 216:                       // 'preceding'\n    case 217:                       // 'preceding-sibling'\n    case 222:                       // 'rename'\n    case 223:                       // 'replace'\n    case 224:                       // 'return'\n    case 225:                       // 'returning'\n    case 226:                       // 'revalidation'\n    case 228:                       // 'satisfies'\n    case 229:                       // 'schema'\n    case 232:                       // 'score'\n    case 233:                       // 'select'\n    case 234:                       // 'self'\n    case 239:                       // 'sliding'\n    case 240:                       // 'some'\n    case 241:                       // 'stable'\n    case 242:                       // 'start'\n    case 245:                       // 'strict'\n    case 253:                       // 'to'\n    case 254:                       // 'treat'\n    case 256:                       // 'try'\n    case 257:                       // 'tumbling'\n    case 258:                       // 'type'\n    case 260:                       // 'union'\n    case 263:                       // 'updating'\n    case 266:                       // 'validate'\n    case 267:                       // 'value'\n    case 268:                       // 'variable'\n    case 269:                       // 'version'\n    case 272:                       // 'where'\n    case 273:                       // 'while'\n    case 276:                       // 'with'\n      lookahead2W(95);              // S^WS | '#' | '(' | '(:'\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 3353                  // '{' EQName^Token\n     || lk == 4377                  // '{' IntegerLiteral\n     || lk == 4889                  // '{' DecimalLiteral\n     || lk == 5401                  // '{' DoubleLiteral\n     || lk == 5913                  // '{' StringLiteral\n     || lk == 16153                 // '{' '$'\n     || lk == 16665                 // '{' '$$'\n     || lk == 17177                 // '{' '%'\n     || lk == 18055                 // 'false' '('\n     || lk == 18117                 // 'null' '('\n     || lk == 18175                 // 'true' '('\n     || lk == 18201                 // '{' '('\n     || lk == 18713                 // '{' '(#'\n     || lk == 21273                 // '{' '+'\n     || lk == 22297                 // '{' '-'\n     || lk == 24345                 // '{' '/'\n     || lk == 24857                 // '{' '//'\n     || lk == 28441                 // '{' '<'\n     || lk == 28953                 // '{' '<!--'\n     || lk == 31001                 // '{' '<?'\n     || lk == 35609                 // '{' '['\n     || lk == 36633                 // '{' 'after'\n     || lk == 37657                 // '{' 'allowing'\n     || lk == 38169                 // '{' 'ancestor'\n     || lk == 38681                 // '{' 'ancestor-or-self'\n     || lk == 39193                 // '{' 'and'\n     || lk == 40217                 // '{' 'append'\n     || lk == 40729                 // '{' 'array'\n     || lk == 41241                 // '{' 'as'\n     || lk == 41753                 // '{' 'ascending'\n     || lk == 42265                 // '{' 'at'\n     || lk == 42777                 // '{' 'attribute'\n     || lk == 43289                 // '{' 'base-uri'\n     || lk == 43801                 // '{' 'before'\n     || lk == 44313                 // '{' 'boundary-space'\n     || lk == 44825                 // '{' 'break'\n     || lk == 45849                 // '{' 'case'\n     || lk == 46361                 // '{' 'cast'\n     || lk == 46873                 // '{' 'castable'\n     || lk == 47385                 // '{' 'catch'\n     || lk == 48409                 // '{' 'child'\n     || lk == 48921                 // '{' 'collation'\n     || lk == 49945                 // '{' 'comment'\n     || lk == 50457                 // '{' 'constraint'\n     || lk == 50969                 // '{' 'construction'\n     || lk == 52505                 // '{' 'context'\n     || lk == 53017                 // '{' 'continue'\n     || lk == 53529                 // '{' 'copy'\n     || lk == 54041                 // '{' 'copy-namespaces'\n     || lk == 54553                 // '{' 'count'\n     || lk == 55065                 // '{' 'decimal-format'\n     || lk == 56089                 // '{' 'declare'\n     || lk == 56601                 // '{' 'default'\n     || lk == 57113                 // '{' 'delete'\n     || lk == 57625                 // '{' 'descendant'\n     || lk == 58137                 // '{' 'descendant-or-self'\n     || lk == 58649                 // '{' 'descending'\n     || lk == 61209                 // '{' 'div'\n     || lk == 61721                 // '{' 'document'\n     || lk == 62233                 // '{' 'document-node'\n     || lk == 62745                 // '{' 'element'\n     || lk == 63257                 // '{' 'else'\n     || lk == 63769                 // '{' 'empty'\n     || lk == 64281                 // '{' 'empty-sequence'\n     || lk == 64793                 // '{' 'encoding'\n     || lk == 65305                 // '{' 'end'\n     || lk == 66329                 // '{' 'eq'\n     || lk == 66841                 // '{' 'every'\n     || lk == 67865                 // '{' 'except'\n     || lk == 68377                 // '{' 'exit'\n     || lk == 68889                 // '{' 'external'\n     || lk == 69401                 // '{' 'false'\n     || lk == 69913                 // '{' 'first'\n     || lk == 70425                 // '{' 'following'\n     || lk == 70937                 // '{' 'following-sibling'\n     || lk == 71449                 // '{' 'for'\n     || lk == 72985                 // '{' 'from'\n     || lk == 73497                 // '{' 'ft-option'\n     || lk == 75545                 // '{' 'function'\n     || lk == 76057                 // '{' 'ge'\n     || lk == 77081                 // '{' 'group'\n     || lk == 78105                 // '{' 'gt'\n     || lk == 78617                 // '{' 'idiv'\n     || lk == 79129                 // '{' 'if'\n     || lk == 79641                 // '{' 'import'\n     || lk == 80153                 // '{' 'in'\n     || lk == 80665                 // '{' 'index'\n     || lk == 82713                 // '{' 'insert'\n     || lk == 83225                 // '{' 'instance'\n     || lk == 83737                 // '{' 'integrity'\n     || lk == 84249                 // '{' 'intersect'\n     || lk == 84761                 // '{' 'into'\n     || lk == 85273                 // '{' 'is'\n     || lk == 85785                 // '{' 'item'\n     || lk == 86297                 // '{' 'json'\n     || lk == 86809                 // '{' 'json-item'\n     || lk == 87321                 // '{' 'jsoniq'\n     || lk == 88857                 // '{' 'last'\n     || lk == 89369                 // '{' 'lax'\n     || lk == 89881                 // '{' 'le'\n     || lk == 90905                 // '{' 'let'\n     || lk == 91929                 // '{' 'loop'\n     || lk == 92953                 // '{' 'lt'\n     || lk == 93977                 // '{' 'mod'\n     || lk == 94489                 // '{' 'modify'\n     || lk == 95001                 // '{' 'module'\n     || lk == 96025                 // '{' 'namespace'\n     || lk == 96537                 // '{' 'namespace-node'\n     || lk == 97049                 // '{' 'ne'\n     || lk == 99609                 // '{' 'node'\n     || lk == 100121                // '{' 'nodes'\n     || lk == 100633                // '{' 'not'\n     || lk == 101145                // '{' 'null'\n     || lk == 101657                // '{' 'object'\n     || lk == 103705                // '{' 'only'\n     || lk == 104217                // '{' 'option'\n     || lk == 104729                // '{' 'or'\n     || lk == 105241                // '{' 'order'\n     || lk == 105753                // '{' 'ordered'\n     || lk == 106265                // '{' 'ordering'\n     || lk == 107801                // '{' 'parent'\n     || lk == 110873                // '{' 'preceding'\n     || lk == 111385                // '{' 'preceding-sibling'\n     || lk == 112921                // '{' 'processing-instruction'\n     || lk == 113945                // '{' 'rename'\n     || lk == 114457                // '{' 'replace'\n     || lk == 114969                // '{' 'return'\n     || lk == 115481                // '{' 'returning'\n     || lk == 115993                // '{' 'revalidation'\n     || lk == 117017                // '{' 'satisfies'\n     || lk == 117529                // '{' 'schema'\n     || lk == 118041                // '{' 'schema-attribute'\n     || lk == 118553                // '{' 'schema-element'\n     || lk == 119065                // '{' 'score'\n     || lk == 119577                // '{' 'select'\n     || lk == 120089                // '{' 'self'\n     || lk == 122649                // '{' 'sliding'\n     || lk == 123161                // '{' 'some'\n     || lk == 123673                // '{' 'stable'\n     || lk == 124185                // '{' 'start'\n     || lk == 125721                // '{' 'strict'\n     || lk == 126745                // '{' 'structured-item'\n     || lk == 127257                // '{' 'switch'\n     || lk == 127769                // '{' 'text'\n     || lk == 129817                // '{' 'to'\n     || lk == 130329                // '{' 'treat'\n     || lk == 130841                // '{' 'true'\n     || lk == 131353                // '{' 'try'\n     || lk == 131865                // '{' 'tumbling'\n     || lk == 132377                // '{' 'type'\n     || lk == 132889                // '{' 'typeswitch'\n     || lk == 133401                // '{' 'union'\n     || lk == 134425                // '{' 'unordered'\n     || lk == 134937                // '{' 'updating'\n     || lk == 136473                // '{' 'validate'\n     || lk == 136985                // '{' 'value'\n     || lk == 137497                // '{' 'variable'\n     || lk == 138009                // '{' 'version'\n     || lk == 139545                // '{' 'where'\n     || lk == 140057                // '{' 'while'\n     || lk == 141593                // '{' 'with'\n     || lk == 144153                // '{' '{'\n     || lk == 145177                // '{' '{|'\n     || lk == 147225)               // '{' '}'\n    {\n      lk = memoized(20, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_Literal();\n          lk = -1;\n        }\n        catch (p1A)\n        {\n          try\n          {\n            b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n            b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n            b2 = b2A; e2 = e2A; end = e2A; }}\n            try_FunctionCall();\n            lk = -5;\n          }\n          catch (p5A)\n          {\n            try\n            {\n              b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n              b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n              b2 = b2A; e2 = e2A; end = e2A; }}\n              try_BlockExpr();\n              lk = -10;\n            }\n            catch (p10A)\n            {\n              lk = -11;\n            }\n          }\n        }\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(20, e0, lk);\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n    case 8:                         // IntegerLiteral\n    case 9:                         // DecimalLiteral\n    case 10:                        // DoubleLiteral\n    case 11:                        // StringLiteral\n    case 12935:                     // 'false' EOF\n    case 12997:                     // 'null' EOF\n    case 13055:                     // 'true' EOF\n    case 13447:                     // 'false' '!'\n    case 13509:                     // 'null' '!'\n    case 13567:                     // 'true' '!'\n    case 13959:                     // 'false' '!='\n    case 14021:                     // 'null' '!='\n    case 14079:                     // 'true' '!='\n    case 19591:                     // 'false' ')'\n    case 19653:                     // 'null' ')'\n    case 19711:                     // 'true' ')'\n    case 20103:                     // 'false' '*'\n    case 20165:                     // 'null' '*'\n    case 20223:                     // 'true' '*'\n    case 21127:                     // 'false' '+'\n    case 21189:                     // 'null' '+'\n    case 21247:                     // 'true' '+'\n    case 21639:                     // 'false' ','\n    case 21701:                     // 'null' ','\n    case 21759:                     // 'true' ','\n    case 22151:                     // 'false' '-'\n    case 22213:                     // 'null' '-'\n    case 22271:                     // 'true' '-'\n    case 23175:                     // 'false' '.'\n    case 23237:                     // 'null' '.'\n    case 23295:                     // 'true' '.'\n    case 24199:                     // 'false' '/'\n    case 24261:                     // 'null' '/'\n    case 24319:                     // 'true' '/'\n    case 24711:                     // 'false' '//'\n    case 24773:                     // 'null' '//'\n    case 24831:                     // 'true' '//'\n    case 25735:                     // 'false' ':'\n    case 25797:                     // 'null' ':'\n    case 25855:                     // 'true' ':'\n    case 27783:                     // 'false' ';'\n    case 27845:                     // 'null' ';'\n    case 27903:                     // 'true' ';'\n    case 28295:                     // 'false' '<'\n    case 28357:                     // 'null' '<'\n    case 28415:                     // 'true' '<'\n    case 29831:                     // 'false' '<<'\n    case 29893:                     // 'null' '<<'\n    case 29951:                     // 'true' '<<'\n    case 30343:                     // 'false' '<='\n    case 30405:                     // 'null' '<='\n    case 30463:                     // 'true' '<='\n    case 31367:                     // 'false' '='\n    case 31429:                     // 'null' '='\n    case 31487:                     // 'true' '='\n    case 31879:                     // 'false' '>'\n    case 31941:                     // 'null' '>'\n    case 31999:                     // 'true' '>'\n    case 32391:                     // 'false' '>='\n    case 32453:                     // 'null' '>='\n    case 32511:                     // 'true' '>='\n    case 32903:                     // 'false' '>>'\n    case 32965:                     // 'null' '>>'\n    case 33023:                     // 'true' '>>'\n    case 35463:                     // 'false' '['\n    case 35525:                     // 'null' '['\n    case 35583:                     // 'true' '['\n    case 35975:                     // 'false' ']'\n    case 36037:                     // 'null' ']'\n    case 36095:                     // 'true' ']'\n    case 36487:                     // 'false' 'after'\n    case 36549:                     // 'null' 'after'\n    case 36607:                     // 'true' 'after'\n    case 39047:                     // 'false' 'and'\n    case 39109:                     // 'null' 'and'\n    case 39167:                     // 'true' 'and'\n    case 41095:                     // 'false' 'as'\n    case 41157:                     // 'null' 'as'\n    case 41215:                     // 'true' 'as'\n    case 41607:                     // 'false' 'ascending'\n    case 41669:                     // 'null' 'ascending'\n    case 41727:                     // 'true' 'ascending'\n    case 42119:                     // 'false' 'at'\n    case 42181:                     // 'null' 'at'\n    case 42239:                     // 'true' 'at'\n    case 43655:                     // 'false' 'before'\n    case 43717:                     // 'null' 'before'\n    case 43775:                     // 'true' 'before'\n    case 45191:                     // 'false' 'by'\n    case 45253:                     // 'null' 'by'\n    case 45311:                     // 'true' 'by'\n    case 45703:                     // 'false' 'case'\n    case 45765:                     // 'null' 'case'\n    case 45823:                     // 'true' 'case'\n    case 46215:                     // 'false' 'cast'\n    case 46277:                     // 'null' 'cast'\n    case 46335:                     // 'true' 'cast'\n    case 46727:                     // 'false' 'castable'\n    case 46789:                     // 'null' 'castable'\n    case 46847:                     // 'true' 'castable'\n    case 48775:                     // 'false' 'collation'\n    case 48837:                     // 'null' 'collation'\n    case 48895:                     // 'true' 'collation'\n    case 51335:                     // 'false' 'contains'\n    case 51397:                     // 'null' 'contains'\n    case 51455:                     // 'true' 'contains'\n    case 54407:                     // 'false' 'count'\n    case 54469:                     // 'null' 'count'\n    case 54527:                     // 'true' 'count'\n    case 56455:                     // 'false' 'default'\n    case 56517:                     // 'null' 'default'\n    case 56575:                     // 'true' 'default'\n    case 58503:                     // 'false' 'descending'\n    case 58565:                     // 'null' 'descending'\n    case 58623:                     // 'true' 'descending'\n    case 61063:                     // 'false' 'div'\n    case 61125:                     // 'null' 'div'\n    case 61183:                     // 'true' 'div'\n    case 63111:                     // 'false' 'else'\n    case 63173:                     // 'null' 'else'\n    case 63231:                     // 'true' 'else'\n    case 63623:                     // 'false' 'empty'\n    case 63685:                     // 'null' 'empty'\n    case 63743:                     // 'true' 'empty'\n    case 65159:                     // 'false' 'end'\n    case 65221:                     // 'null' 'end'\n    case 65279:                     // 'true' 'end'\n    case 66183:                     // 'false' 'eq'\n    case 66245:                     // 'null' 'eq'\n    case 66303:                     // 'true' 'eq'\n    case 67719:                     // 'false' 'except'\n    case 67781:                     // 'null' 'except'\n    case 67839:                     // 'true' 'except'\n    case 71303:                     // 'false' 'for'\n    case 71365:                     // 'null' 'for'\n    case 71423:                     // 'true' 'for'\n    case 75911:                     // 'false' 'ge'\n    case 75973:                     // 'null' 'ge'\n    case 76031:                     // 'true' 'ge'\n    case 76935:                     // 'false' 'group'\n    case 76997:                     // 'null' 'group'\n    case 77055:                     // 'true' 'group'\n    case 77959:                     // 'false' 'gt'\n    case 78021:                     // 'null' 'gt'\n    case 78079:                     // 'true' 'gt'\n    case 78471:                     // 'false' 'idiv'\n    case 78533:                     // 'null' 'idiv'\n    case 78591:                     // 'true' 'idiv'\n    case 83079:                     // 'false' 'instance'\n    case 83141:                     // 'null' 'instance'\n    case 83199:                     // 'true' 'instance'\n    case 84103:                     // 'false' 'intersect'\n    case 84165:                     // 'null' 'intersect'\n    case 84223:                     // 'true' 'intersect'\n    case 84615:                     // 'false' 'into'\n    case 84677:                     // 'null' 'into'\n    case 84735:                     // 'true' 'into'\n    case 85127:                     // 'false' 'is'\n    case 85189:                     // 'null' 'is'\n    case 85247:                     // 'true' 'is'\n    case 89735:                     // 'false' 'le'\n    case 89797:                     // 'null' 'le'\n    case 89855:                     // 'true' 'le'\n    case 90759:                     // 'false' 'let'\n    case 90821:                     // 'null' 'let'\n    case 90879:                     // 'true' 'let'\n    case 92807:                     // 'false' 'lt'\n    case 92869:                     // 'null' 'lt'\n    case 92927:                     // 'true' 'lt'\n    case 93831:                     // 'false' 'mod'\n    case 93893:                     // 'null' 'mod'\n    case 93951:                     // 'true' 'mod'\n    case 94343:                     // 'false' 'modify'\n    case 94405:                     // 'null' 'modify'\n    case 94463:                     // 'true' 'modify'\n    case 96903:                     // 'false' 'ne'\n    case 96965:                     // 'null' 'ne'\n    case 97023:                     // 'true' 'ne'\n    case 103559:                    // 'false' 'only'\n    case 103621:                    // 'null' 'only'\n    case 103679:                    // 'true' 'only'\n    case 104583:                    // 'false' 'or'\n    case 104645:                    // 'null' 'or'\n    case 104703:                    // 'true' 'or'\n    case 105095:                    // 'false' 'order'\n    case 105157:                    // 'null' 'order'\n    case 105215:                    // 'true' 'order'\n    case 107143:                    // 'false' 'paragraphs'\n    case 107205:                    // 'null' 'paragraphs'\n    case 107263:                    // 'true' 'paragraphs'\n    case 114823:                    // 'false' 'return'\n    case 114885:                    // 'null' 'return'\n    case 114943:                    // 'true' 'return'\n    case 116871:                    // 'false' 'satisfies'\n    case 116933:                    // 'null' 'satisfies'\n    case 116991:                    // 'true' 'satisfies'\n    case 121479:                    // 'false' 'sentences'\n    case 121541:                    // 'null' 'sentences'\n    case 121599:                    // 'true' 'sentences'\n    case 123527:                    // 'false' 'stable'\n    case 123589:                    // 'null' 'stable'\n    case 123647:                    // 'true' 'stable'\n    case 124039:                    // 'false' 'start'\n    case 124101:                    // 'null' 'start'\n    case 124159:                    // 'true' 'start'\n    case 129159:                    // 'false' 'times'\n    case 129221:                    // 'null' 'times'\n    case 129279:                    // 'true' 'times'\n    case 129671:                    // 'false' 'to'\n    case 129733:                    // 'null' 'to'\n    case 129791:                    // 'true' 'to'\n    case 130183:                    // 'false' 'treat'\n    case 130245:                    // 'null' 'treat'\n    case 130303:                    // 'true' 'treat'\n    case 133255:                    // 'false' 'union'\n    case 133317:                    // 'null' 'union'\n    case 133375:                    // 'true' 'union'\n    case 139399:                    // 'false' 'where'\n    case 139461:                    // 'null' 'where'\n    case 139519:                    // 'true' 'where'\n    case 141447:                    // 'false' 'with'\n    case 141509:                    // 'null' 'with'\n    case 141567:                    // 'true' 'with'\n    case 142983:                    // 'false' 'words'\n    case 143045:                    // 'null' 'words'\n    case 143103:                    // 'true' 'words'\n    case 145543:                    // 'false' '|'\n    case 145605:                    // 'null' '|'\n    case 145663:                    // 'true' '|'\n    case 146055:                    // 'false' '||'\n    case 146117:                    // 'null' '||'\n    case 146175:                    // 'true' '||'\n    case 146567:                    // 'false' '|}'\n    case 146629:                    // 'null' '|}'\n    case 146687:                    // 'true' '|}'\n    case 147079:                    // 'false' '}'\n    case 147141:                    // 'null' '}'\n    case 147199:                    // 'true' '}'\n      parse_Literal();\n      break;\n    case 31:                        // '$'\n      parse_VarRef();\n      break;\n    case 35:                        // '('\n      parse_ParenthesizedExpr();\n      break;\n    case 32:                        // '$$'\n      parse_ContextItemExpr();\n      break;\n    case -5:\n    case 17926:                     // EQName^Token '('\n    case 17991:                     // 'after' '('\n    case 17993:                     // 'allowing' '('\n    case 17994:                     // 'ancestor' '('\n    case 17995:                     // 'ancestor-or-self' '('\n    case 17996:                     // 'and' '('\n    case 17998:                     // 'append' '('\n    case 18000:                     // 'as' '('\n    case 18001:                     // 'ascending' '('\n    case 18002:                     // 'at' '('\n    case 18004:                     // 'base-uri' '('\n    case 18005:                     // 'before' '('\n    case 18006:                     // 'boundary-space' '('\n    case 18007:                     // 'break' '('\n    case 18009:                     // 'case' '('\n    case 18010:                     // 'cast' '('\n    case 18011:                     // 'castable' '('\n    case 18012:                     // 'catch' '('\n    case 18014:                     // 'child' '('\n    case 18015:                     // 'collation' '('\n    case 18018:                     // 'constraint' '('\n    case 18019:                     // 'construction' '('\n    case 18022:                     // 'context' '('\n    case 18023:                     // 'continue' '('\n    case 18024:                     // 'copy' '('\n    case 18025:                     // 'copy-namespaces' '('\n    case 18026:                     // 'count' '('\n    case 18027:                     // 'decimal-format' '('\n    case 18029:                     // 'declare' '('\n    case 18030:                     // 'default' '('\n    case 18031:                     // 'delete' '('\n    case 18032:                     // 'descendant' '('\n    case 18033:                     // 'descendant-or-self' '('\n    case 18034:                     // 'descending' '('\n    case 18039:                     // 'div' '('\n    case 18040:                     // 'document' '('\n    case 18043:                     // 'else' '('\n    case 18044:                     // 'empty' '('\n    case 18046:                     // 'encoding' '('\n    case 18047:                     // 'end' '('\n    case 18049:                     // 'eq' '('\n    case 18050:                     // 'every' '('\n    case 18052:                     // 'except' '('\n    case 18053:                     // 'exit' '('\n    case 18054:                     // 'external' '('\n    case 18056:                     // 'first' '('\n    case 18057:                     // 'following' '('\n    case 18058:                     // 'following-sibling' '('\n    case 18059:                     // 'for' '('\n    case 18062:                     // 'from' '('\n    case 18063:                     // 'ft-option' '('\n    case 18068:                     // 'ge' '('\n    case 18070:                     // 'group' '('\n    case 18072:                     // 'gt' '('\n    case 18073:                     // 'idiv' '('\n    case 18075:                     // 'import' '('\n    case 18076:                     // 'in' '('\n    case 18077:                     // 'index' '('\n    case 18081:                     // 'insert' '('\n    case 18082:                     // 'instance' '('\n    case 18083:                     // 'integrity' '('\n    case 18084:                     // 'intersect' '('\n    case 18085:                     // 'into' '('\n    case 18086:                     // 'is' '('\n    case 18088:                     // 'json' '('\n    case 18090:                     // 'jsoniq' '('\n    case 18093:                     // 'last' '('\n    case 18094:                     // 'lax' '('\n    case 18095:                     // 'le' '('\n    case 18097:                     // 'let' '('\n    case 18099:                     // 'loop' '('\n    case 18101:                     // 'lt' '('\n    case 18103:                     // 'mod' '('\n    case 18104:                     // 'modify' '('\n    case 18105:                     // 'module' '('\n    case 18107:                     // 'namespace' '('\n    case 18109:                     // 'ne' '('\n    case 18115:                     // 'nodes' '('\n    case 18118:                     // 'object' '('\n    case 18122:                     // 'only' '('\n    case 18123:                     // 'option' '('\n    case 18124:                     // 'or' '('\n    case 18125:                     // 'order' '('\n    case 18126:                     // 'ordered' '('\n    case 18127:                     // 'ordering' '('\n    case 18130:                     // 'parent' '('\n    case 18136:                     // 'preceding' '('\n    case 18137:                     // 'preceding-sibling' '('\n    case 18142:                     // 'rename' '('\n    case 18143:                     // 'replace' '('\n    case 18144:                     // 'return' '('\n    case 18145:                     // 'returning' '('\n    case 18146:                     // 'revalidation' '('\n    case 18148:                     // 'satisfies' '('\n    case 18149:                     // 'schema' '('\n    case 18152:                     // 'score' '('\n    case 18153:                     // 'select' '('\n    case 18154:                     // 'self' '('\n    case 18159:                     // 'sliding' '('\n    case 18160:                     // 'some' '('\n    case 18161:                     // 'stable' '('\n    case 18162:                     // 'start' '('\n    case 18165:                     // 'strict' '('\n    case 18173:                     // 'to' '('\n    case 18174:                     // 'treat' '('\n    case 18176:                     // 'try' '('\n    case 18177:                     // 'tumbling' '('\n    case 18178:                     // 'type' '('\n    case 18180:                     // 'union' '('\n    case 18182:                     // 'unordered' '('\n    case 18183:                     // 'updating' '('\n    case 18186:                     // 'validate' '('\n    case 18187:                     // 'value' '('\n    case 18188:                     // 'variable' '('\n    case 18189:                     // 'version' '('\n    case 18192:                     // 'where' '('\n    case 18193:                     // 'while' '('\n    case 18196:                     // 'with' '('\n      parse_FunctionCall();\n      break;\n    case 144078:                    // 'ordered' '{'\n      parse_OrderedExpr();\n      break;\n    case 144134:                    // 'unordered' '{'\n      parse_UnorderedExpr();\n      break;\n    case 33:                        // '%'\n    case 79:                        // 'array'\n    case 121:                       // 'document-node'\n    case 125:                       // 'empty-sequence'\n    case 147:                       // 'function'\n    case 154:                       // 'if'\n    case 167:                       // 'item'\n    case 169:                       // 'json-item'\n    case 188:                       // 'namespace-node'\n    case 194:                       // 'node'\n    case 230:                       // 'schema-attribute'\n    case 231:                       // 'schema-element'\n    case 247:                       // 'structured-item'\n    case 248:                       // 'switch'\n    case 259:                       // 'typeswitch'\n    case 14854:                     // EQName^Token '#'\n    case 14919:                     // 'after' '#'\n    case 14921:                     // 'allowing' '#'\n    case 14922:                     // 'ancestor' '#'\n    case 14923:                     // 'ancestor-or-self' '#'\n    case 14924:                     // 'and' '#'\n    case 14926:                     // 'append' '#'\n    case 14928:                     // 'as' '#'\n    case 14929:                     // 'ascending' '#'\n    case 14930:                     // 'at' '#'\n    case 14931:                     // 'attribute' '#'\n    case 14932:                     // 'base-uri' '#'\n    case 14933:                     // 'before' '#'\n    case 14934:                     // 'boundary-space' '#'\n    case 14935:                     // 'break' '#'\n    case 14937:                     // 'case' '#'\n    case 14938:                     // 'cast' '#'\n    case 14939:                     // 'castable' '#'\n    case 14940:                     // 'catch' '#'\n    case 14942:                     // 'child' '#'\n    case 14943:                     // 'collation' '#'\n    case 14945:                     // 'comment' '#'\n    case 14946:                     // 'constraint' '#'\n    case 14947:                     // 'construction' '#'\n    case 14950:                     // 'context' '#'\n    case 14951:                     // 'continue' '#'\n    case 14952:                     // 'copy' '#'\n    case 14953:                     // 'copy-namespaces' '#'\n    case 14954:                     // 'count' '#'\n    case 14955:                     // 'decimal-format' '#'\n    case 14957:                     // 'declare' '#'\n    case 14958:                     // 'default' '#'\n    case 14959:                     // 'delete' '#'\n    case 14960:                     // 'descendant' '#'\n    case 14961:                     // 'descendant-or-self' '#'\n    case 14962:                     // 'descending' '#'\n    case 14967:                     // 'div' '#'\n    case 14968:                     // 'document' '#'\n    case 14970:                     // 'element' '#'\n    case 14971:                     // 'else' '#'\n    case 14972:                     // 'empty' '#'\n    case 14974:                     // 'encoding' '#'\n    case 14975:                     // 'end' '#'\n    case 14977:                     // 'eq' '#'\n    case 14978:                     // 'every' '#'\n    case 14980:                     // 'except' '#'\n    case 14981:                     // 'exit' '#'\n    case 14982:                     // 'external' '#'\n    case 14983:                     // 'false' '#'\n    case 14984:                     // 'first' '#'\n    case 14985:                     // 'following' '#'\n    case 14986:                     // 'following-sibling' '#'\n    case 14987:                     // 'for' '#'\n    case 14990:                     // 'from' '#'\n    case 14991:                     // 'ft-option' '#'\n    case 14996:                     // 'ge' '#'\n    case 14998:                     // 'group' '#'\n    case 15000:                     // 'gt' '#'\n    case 15001:                     // 'idiv' '#'\n    case 15003:                     // 'import' '#'\n    case 15004:                     // 'in' '#'\n    case 15005:                     // 'index' '#'\n    case 15009:                     // 'insert' '#'\n    case 15010:                     // 'instance' '#'\n    case 15011:                     // 'integrity' '#'\n    case 15012:                     // 'intersect' '#'\n    case 15013:                     // 'into' '#'\n    case 15014:                     // 'is' '#'\n    case 15016:                     // 'json' '#'\n    case 15018:                     // 'jsoniq' '#'\n    case 15021:                     // 'last' '#'\n    case 15022:                     // 'lax' '#'\n    case 15023:                     // 'le' '#'\n    case 15025:                     // 'let' '#'\n    case 15027:                     // 'loop' '#'\n    case 15029:                     // 'lt' '#'\n    case 15031:                     // 'mod' '#'\n    case 15032:                     // 'modify' '#'\n    case 15033:                     // 'module' '#'\n    case 15035:                     // 'namespace' '#'\n    case 15037:                     // 'ne' '#'\n    case 15043:                     // 'nodes' '#'\n    case 15045:                     // 'null' '#'\n    case 15046:                     // 'object' '#'\n    case 15050:                     // 'only' '#'\n    case 15051:                     // 'option' '#'\n    case 15052:                     // 'or' '#'\n    case 15053:                     // 'order' '#'\n    case 15054:                     // 'ordered' '#'\n    case 15055:                     // 'ordering' '#'\n    case 15058:                     // 'parent' '#'\n    case 15064:                     // 'preceding' '#'\n    case 15065:                     // 'preceding-sibling' '#'\n    case 15068:                     // 'processing-instruction' '#'\n    case 15070:                     // 'rename' '#'\n    case 15071:                     // 'replace' '#'\n    case 15072:                     // 'return' '#'\n    case 15073:                     // 'returning' '#'\n    case 15074:                     // 'revalidation' '#'\n    case 15076:                     // 'satisfies' '#'\n    case 15077:                     // 'schema' '#'\n    case 15080:                     // 'score' '#'\n    case 15081:                     // 'select' '#'\n    case 15082:                     // 'self' '#'\n    case 15087:                     // 'sliding' '#'\n    case 15088:                     // 'some' '#'\n    case 15089:                     // 'stable' '#'\n    case 15090:                     // 'start' '#'\n    case 15093:                     // 'strict' '#'\n    case 15097:                     // 'text' '#'\n    case 15101:                     // 'to' '#'\n    case 15102:                     // 'treat' '#'\n    case 15103:                     // 'true' '#'\n    case 15104:                     // 'try' '#'\n    case 15105:                     // 'tumbling' '#'\n    case 15106:                     // 'type' '#'\n    case 15108:                     // 'union' '#'\n    case 15110:                     // 'unordered' '#'\n    case 15111:                     // 'updating' '#'\n    case 15114:                     // 'validate' '#'\n    case 15115:                     // 'value' '#'\n    case 15116:                     // 'variable' '#'\n    case 15117:                     // 'version' '#'\n    case 15120:                     // 'where' '#'\n    case 15121:                     // 'while' '#'\n    case 15124:                     // 'with' '#'\n      parse_FunctionItemExpr();\n      break;\n    case -10:\n    case 27929:                     // '{' ';'\n      parse_BlockExpr();\n      break;\n    case -11:\n    case 10009:                     // '{' NCName^Token\n      parse_ObjectConstructor();\n      break;\n    case 69:                        // '['\n      parse_ArrayConstructor();\n      break;\n    case 283:                       // '{|'\n      parse_JSONSimpleObjectUnion();\n      break;\n    default:\n      parse_Constructor();\n    }\n    eventHandler.endNonterminal(\"PrimaryExpr\", e0);\n  }\n\n  function try_PrimaryExpr()\n  {\n    switch (l1)\n    {\n    case 187:                       // 'namespace'\n      lookahead2W(247);             // NCName^Token | S^WS | '#' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    case 220:                       // 'processing-instruction'\n      lookahead2W(245);             // NCName^Token | S^WS | '#' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    case 281:                       // '{'\n      lookahead2W(283);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    case 83:                        // 'attribute'\n    case 122:                       // 'element'\n      lookahead2W(253);             // EQName^Token | S^WS | '#' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    case 97:                        // 'comment'\n    case 249:                       // 'text'\n      lookahead2W(97);              // S^WS | '#' | '(:' | '{'\n      break;\n    case 120:                       // 'document'\n    case 206:                       // 'ordered'\n    case 262:                       // 'unordered'\n      lookahead2W(148);             // S^WS | '#' | '(' | '(:' | '{'\n      break;\n    case 135:                       // 'false'\n    case 197:                       // 'null'\n    case 255:                       // 'true'\n      lookahead2W(237);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '.' |\n      break;\n    case 6:                         // EQName^Token\n    case 71:                        // 'after'\n    case 73:                        // 'allowing'\n    case 74:                        // 'ancestor'\n    case 75:                        // 'ancestor-or-self'\n    case 76:                        // 'and'\n    case 78:                        // 'append'\n    case 80:                        // 'as'\n    case 81:                        // 'ascending'\n    case 82:                        // 'at'\n    case 84:                        // 'base-uri'\n    case 85:                        // 'before'\n    case 86:                        // 'boundary-space'\n    case 87:                        // 'break'\n    case 89:                        // 'case'\n    case 90:                        // 'cast'\n    case 91:                        // 'castable'\n    case 92:                        // 'catch'\n    case 94:                        // 'child'\n    case 95:                        // 'collation'\n    case 98:                        // 'constraint'\n    case 99:                        // 'construction'\n    case 102:                       // 'context'\n    case 103:                       // 'continue'\n    case 104:                       // 'copy'\n    case 105:                       // 'copy-namespaces'\n    case 106:                       // 'count'\n    case 107:                       // 'decimal-format'\n    case 109:                       // 'declare'\n    case 110:                       // 'default'\n    case 111:                       // 'delete'\n    case 112:                       // 'descendant'\n    case 113:                       // 'descendant-or-self'\n    case 114:                       // 'descending'\n    case 119:                       // 'div'\n    case 123:                       // 'else'\n    case 124:                       // 'empty'\n    case 126:                       // 'encoding'\n    case 127:                       // 'end'\n    case 129:                       // 'eq'\n    case 130:                       // 'every'\n    case 132:                       // 'except'\n    case 133:                       // 'exit'\n    case 134:                       // 'external'\n    case 136:                       // 'first'\n    case 137:                       // 'following'\n    case 138:                       // 'following-sibling'\n    case 139:                       // 'for'\n    case 142:                       // 'from'\n    case 143:                       // 'ft-option'\n    case 148:                       // 'ge'\n    case 150:                       // 'group'\n    case 152:                       // 'gt'\n    case 153:                       // 'idiv'\n    case 155:                       // 'import'\n    case 156:                       // 'in'\n    case 157:                       // 'index'\n    case 161:                       // 'insert'\n    case 162:                       // 'instance'\n    case 163:                       // 'integrity'\n    case 164:                       // 'intersect'\n    case 165:                       // 'into'\n    case 166:                       // 'is'\n    case 168:                       // 'json'\n    case 170:                       // 'jsoniq'\n    case 173:                       // 'last'\n    case 174:                       // 'lax'\n    case 175:                       // 'le'\n    case 177:                       // 'let'\n    case 179:                       // 'loop'\n    case 181:                       // 'lt'\n    case 183:                       // 'mod'\n    case 184:                       // 'modify'\n    case 185:                       // 'module'\n    case 189:                       // 'ne'\n    case 195:                       // 'nodes'\n    case 198:                       // 'object'\n    case 202:                       // 'only'\n    case 203:                       // 'option'\n    case 204:                       // 'or'\n    case 205:                       // 'order'\n    case 207:                       // 'ordering'\n    case 210:                       // 'parent'\n    case 216:                       // 'preceding'\n    case 217:                       // 'preceding-sibling'\n    case 222:                       // 'rename'\n    case 223:                       // 'replace'\n    case 224:                       // 'return'\n    case 225:                       // 'returning'\n    case 226:                       // 'revalidation'\n    case 228:                       // 'satisfies'\n    case 229:                       // 'schema'\n    case 232:                       // 'score'\n    case 233:                       // 'select'\n    case 234:                       // 'self'\n    case 239:                       // 'sliding'\n    case 240:                       // 'some'\n    case 241:                       // 'stable'\n    case 242:                       // 'start'\n    case 245:                       // 'strict'\n    case 253:                       // 'to'\n    case 254:                       // 'treat'\n    case 256:                       // 'try'\n    case 257:                       // 'tumbling'\n    case 258:                       // 'type'\n    case 260:                       // 'union'\n    case 263:                       // 'updating'\n    case 266:                       // 'validate'\n    case 267:                       // 'value'\n    case 268:                       // 'variable'\n    case 269:                       // 'version'\n    case 272:                       // 'where'\n    case 273:                       // 'while'\n    case 276:                       // 'with'\n      lookahead2W(95);              // S^WS | '#' | '(' | '(:'\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 3353                  // '{' EQName^Token\n     || lk == 4377                  // '{' IntegerLiteral\n     || lk == 4889                  // '{' DecimalLiteral\n     || lk == 5401                  // '{' DoubleLiteral\n     || lk == 5913                  // '{' StringLiteral\n     || lk == 16153                 // '{' '$'\n     || lk == 16665                 // '{' '$$'\n     || lk == 17177                 // '{' '%'\n     || lk == 18055                 // 'false' '('\n     || lk == 18117                 // 'null' '('\n     || lk == 18175                 // 'true' '('\n     || lk == 18201                 // '{' '('\n     || lk == 18713                 // '{' '(#'\n     || lk == 21273                 // '{' '+'\n     || lk == 22297                 // '{' '-'\n     || lk == 24345                 // '{' '/'\n     || lk == 24857                 // '{' '//'\n     || lk == 28441                 // '{' '<'\n     || lk == 28953                 // '{' '<!--'\n     || lk == 31001                 // '{' '<?'\n     || lk == 35609                 // '{' '['\n     || lk == 36633                 // '{' 'after'\n     || lk == 37657                 // '{' 'allowing'\n     || lk == 38169                 // '{' 'ancestor'\n     || lk == 38681                 // '{' 'ancestor-or-self'\n     || lk == 39193                 // '{' 'and'\n     || lk == 40217                 // '{' 'append'\n     || lk == 40729                 // '{' 'array'\n     || lk == 41241                 // '{' 'as'\n     || lk == 41753                 // '{' 'ascending'\n     || lk == 42265                 // '{' 'at'\n     || lk == 42777                 // '{' 'attribute'\n     || lk == 43289                 // '{' 'base-uri'\n     || lk == 43801                 // '{' 'before'\n     || lk == 44313                 // '{' 'boundary-space'\n     || lk == 44825                 // '{' 'break'\n     || lk == 45849                 // '{' 'case'\n     || lk == 46361                 // '{' 'cast'\n     || lk == 46873                 // '{' 'castable'\n     || lk == 47385                 // '{' 'catch'\n     || lk == 48409                 // '{' 'child'\n     || lk == 48921                 // '{' 'collation'\n     || lk == 49945                 // '{' 'comment'\n     || lk == 50457                 // '{' 'constraint'\n     || lk == 50969                 // '{' 'construction'\n     || lk == 52505                 // '{' 'context'\n     || lk == 53017                 // '{' 'continue'\n     || lk == 53529                 // '{' 'copy'\n     || lk == 54041                 // '{' 'copy-namespaces'\n     || lk == 54553                 // '{' 'count'\n     || lk == 55065                 // '{' 'decimal-format'\n     || lk == 56089                 // '{' 'declare'\n     || lk == 56601                 // '{' 'default'\n     || lk == 57113                 // '{' 'delete'\n     || lk == 57625                 // '{' 'descendant'\n     || lk == 58137                 // '{' 'descendant-or-self'\n     || lk == 58649                 // '{' 'descending'\n     || lk == 61209                 // '{' 'div'\n     || lk == 61721                 // '{' 'document'\n     || lk == 62233                 // '{' 'document-node'\n     || lk == 62745                 // '{' 'element'\n     || lk == 63257                 // '{' 'else'\n     || lk == 63769                 // '{' 'empty'\n     || lk == 64281                 // '{' 'empty-sequence'\n     || lk == 64793                 // '{' 'encoding'\n     || lk == 65305                 // '{' 'end'\n     || lk == 66329                 // '{' 'eq'\n     || lk == 66841                 // '{' 'every'\n     || lk == 67865                 // '{' 'except'\n     || lk == 68377                 // '{' 'exit'\n     || lk == 68889                 // '{' 'external'\n     || lk == 69401                 // '{' 'false'\n     || lk == 69913                 // '{' 'first'\n     || lk == 70425                 // '{' 'following'\n     || lk == 70937                 // '{' 'following-sibling'\n     || lk == 71449                 // '{' 'for'\n     || lk == 72985                 // '{' 'from'\n     || lk == 73497                 // '{' 'ft-option'\n     || lk == 75545                 // '{' 'function'\n     || lk == 76057                 // '{' 'ge'\n     || lk == 77081                 // '{' 'group'\n     || lk == 78105                 // '{' 'gt'\n     || lk == 78617                 // '{' 'idiv'\n     || lk == 79129                 // '{' 'if'\n     || lk == 79641                 // '{' 'import'\n     || lk == 80153                 // '{' 'in'\n     || lk == 80665                 // '{' 'index'\n     || lk == 82713                 // '{' 'insert'\n     || lk == 83225                 // '{' 'instance'\n     || lk == 83737                 // '{' 'integrity'\n     || lk == 84249                 // '{' 'intersect'\n     || lk == 84761                 // '{' 'into'\n     || lk == 85273                 // '{' 'is'\n     || lk == 85785                 // '{' 'item'\n     || lk == 86297                 // '{' 'json'\n     || lk == 86809                 // '{' 'json-item'\n     || lk == 87321                 // '{' 'jsoniq'\n     || lk == 88857                 // '{' 'last'\n     || lk == 89369                 // '{' 'lax'\n     || lk == 89881                 // '{' 'le'\n     || lk == 90905                 // '{' 'let'\n     || lk == 91929                 // '{' 'loop'\n     || lk == 92953                 // '{' 'lt'\n     || lk == 93977                 // '{' 'mod'\n     || lk == 94489                 // '{' 'modify'\n     || lk == 95001                 // '{' 'module'\n     || lk == 96025                 // '{' 'namespace'\n     || lk == 96537                 // '{' 'namespace-node'\n     || lk == 97049                 // '{' 'ne'\n     || lk == 99609                 // '{' 'node'\n     || lk == 100121                // '{' 'nodes'\n     || lk == 100633                // '{' 'not'\n     || lk == 101145                // '{' 'null'\n     || lk == 101657                // '{' 'object'\n     || lk == 103705                // '{' 'only'\n     || lk == 104217                // '{' 'option'\n     || lk == 104729                // '{' 'or'\n     || lk == 105241                // '{' 'order'\n     || lk == 105753                // '{' 'ordered'\n     || lk == 106265                // '{' 'ordering'\n     || lk == 107801                // '{' 'parent'\n     || lk == 110873                // '{' 'preceding'\n     || lk == 111385                // '{' 'preceding-sibling'\n     || lk == 112921                // '{' 'processing-instruction'\n     || lk == 113945                // '{' 'rename'\n     || lk == 114457                // '{' 'replace'\n     || lk == 114969                // '{' 'return'\n     || lk == 115481                // '{' 'returning'\n     || lk == 115993                // '{' 'revalidation'\n     || lk == 117017                // '{' 'satisfies'\n     || lk == 117529                // '{' 'schema'\n     || lk == 118041                // '{' 'schema-attribute'\n     || lk == 118553                // '{' 'schema-element'\n     || lk == 119065                // '{' 'score'\n     || lk == 119577                // '{' 'select'\n     || lk == 120089                // '{' 'self'\n     || lk == 122649                // '{' 'sliding'\n     || lk == 123161                // '{' 'some'\n     || lk == 123673                // '{' 'stable'\n     || lk == 124185                // '{' 'start'\n     || lk == 125721                // '{' 'strict'\n     || lk == 126745                // '{' 'structured-item'\n     || lk == 127257                // '{' 'switch'\n     || lk == 127769                // '{' 'text'\n     || lk == 129817                // '{' 'to'\n     || lk == 130329                // '{' 'treat'\n     || lk == 130841                // '{' 'true'\n     || lk == 131353                // '{' 'try'\n     || lk == 131865                // '{' 'tumbling'\n     || lk == 132377                // '{' 'type'\n     || lk == 132889                // '{' 'typeswitch'\n     || lk == 133401                // '{' 'union'\n     || lk == 134425                // '{' 'unordered'\n     || lk == 134937                // '{' 'updating'\n     || lk == 136473                // '{' 'validate'\n     || lk == 136985                // '{' 'value'\n     || lk == 137497                // '{' 'variable'\n     || lk == 138009                // '{' 'version'\n     || lk == 139545                // '{' 'where'\n     || lk == 140057                // '{' 'while'\n     || lk == 141593                // '{' 'with'\n     || lk == 144153                // '{' '{'\n     || lk == 145177                // '{' '{|'\n     || lk == 147225)               // '{' '}'\n    {\n      lk = memoized(20, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_Literal();\n          memoize(20, e0A, -1);\n          lk = -14;\n        }\n        catch (p1A)\n        {\n          try\n          {\n            b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n            b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n            b2 = b2A; e2 = e2A; end = e2A; }}\n            try_FunctionCall();\n            memoize(20, e0A, -5);\n            lk = -14;\n          }\n          catch (p5A)\n          {\n            try\n            {\n              b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n              b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n              b2 = b2A; e2 = e2A; end = e2A; }}\n              try_BlockExpr();\n              memoize(20, e0A, -10);\n              lk = -14;\n            }\n            catch (p10A)\n            {\n              lk = -11;\n              b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n              b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n              b2 = b2A; e2 = e2A; end = e2A; }}\n              memoize(20, e0A, -11);\n            }\n          }\n        }\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n    case 8:                         // IntegerLiteral\n    case 9:                         // DecimalLiteral\n    case 10:                        // DoubleLiteral\n    case 11:                        // StringLiteral\n    case 12935:                     // 'false' EOF\n    case 12997:                     // 'null' EOF\n    case 13055:                     // 'true' EOF\n    case 13447:                     // 'false' '!'\n    case 13509:                     // 'null' '!'\n    case 13567:                     // 'true' '!'\n    case 13959:                     // 'false' '!='\n    case 14021:                     // 'null' '!='\n    case 14079:                     // 'true' '!='\n    case 19591:                     // 'false' ')'\n    case 19653:                     // 'null' ')'\n    case 19711:                     // 'true' ')'\n    case 20103:                     // 'false' '*'\n    case 20165:                     // 'null' '*'\n    case 20223:                     // 'true' '*'\n    case 21127:                     // 'false' '+'\n    case 21189:                     // 'null' '+'\n    case 21247:                     // 'true' '+'\n    case 21639:                     // 'false' ','\n    case 21701:                     // 'null' ','\n    case 21759:                     // 'true' ','\n    case 22151:                     // 'false' '-'\n    case 22213:                     // 'null' '-'\n    case 22271:                     // 'true' '-'\n    case 23175:                     // 'false' '.'\n    case 23237:                     // 'null' '.'\n    case 23295:                     // 'true' '.'\n    case 24199:                     // 'false' '/'\n    case 24261:                     // 'null' '/'\n    case 24319:                     // 'true' '/'\n    case 24711:                     // 'false' '//'\n    case 24773:                     // 'null' '//'\n    case 24831:                     // 'true' '//'\n    case 25735:                     // 'false' ':'\n    case 25797:                     // 'null' ':'\n    case 25855:                     // 'true' ':'\n    case 27783:                     // 'false' ';'\n    case 27845:                     // 'null' ';'\n    case 27903:                     // 'true' ';'\n    case 28295:                     // 'false' '<'\n    case 28357:                     // 'null' '<'\n    case 28415:                     // 'true' '<'\n    case 29831:                     // 'false' '<<'\n    case 29893:                     // 'null' '<<'\n    case 29951:                     // 'true' '<<'\n    case 30343:                     // 'false' '<='\n    case 30405:                     // 'null' '<='\n    case 30463:                     // 'true' '<='\n    case 31367:                     // 'false' '='\n    case 31429:                     // 'null' '='\n    case 31487:                     // 'true' '='\n    case 31879:                     // 'false' '>'\n    case 31941:                     // 'null' '>'\n    case 31999:                     // 'true' '>'\n    case 32391:                     // 'false' '>='\n    case 32453:                     // 'null' '>='\n    case 32511:                     // 'true' '>='\n    case 32903:                     // 'false' '>>'\n    case 32965:                     // 'null' '>>'\n    case 33023:                     // 'true' '>>'\n    case 35463:                     // 'false' '['\n    case 35525:                     // 'null' '['\n    case 35583:                     // 'true' '['\n    case 35975:                     // 'false' ']'\n    case 36037:                     // 'null' ']'\n    case 36095:                     // 'true' ']'\n    case 36487:                     // 'false' 'after'\n    case 36549:                     // 'null' 'after'\n    case 36607:                     // 'true' 'after'\n    case 39047:                     // 'false' 'and'\n    case 39109:                     // 'null' 'and'\n    case 39167:                     // 'true' 'and'\n    case 41095:                     // 'false' 'as'\n    case 41157:                     // 'null' 'as'\n    case 41215:                     // 'true' 'as'\n    case 41607:                     // 'false' 'ascending'\n    case 41669:                     // 'null' 'ascending'\n    case 41727:                     // 'true' 'ascending'\n    case 42119:                     // 'false' 'at'\n    case 42181:                     // 'null' 'at'\n    case 42239:                     // 'true' 'at'\n    case 43655:                     // 'false' 'before'\n    case 43717:                     // 'null' 'before'\n    case 43775:                     // 'true' 'before'\n    case 45191:                     // 'false' 'by'\n    case 45253:                     // 'null' 'by'\n    case 45311:                     // 'true' 'by'\n    case 45703:                     // 'false' 'case'\n    case 45765:                     // 'null' 'case'\n    case 45823:                     // 'true' 'case'\n    case 46215:                     // 'false' 'cast'\n    case 46277:                     // 'null' 'cast'\n    case 46335:                     // 'true' 'cast'\n    case 46727:                     // 'false' 'castable'\n    case 46789:                     // 'null' 'castable'\n    case 46847:                     // 'true' 'castable'\n    case 48775:                     // 'false' 'collation'\n    case 48837:                     // 'null' 'collation'\n    case 48895:                     // 'true' 'collation'\n    case 51335:                     // 'false' 'contains'\n    case 51397:                     // 'null' 'contains'\n    case 51455:                     // 'true' 'contains'\n    case 54407:                     // 'false' 'count'\n    case 54469:                     // 'null' 'count'\n    case 54527:                     // 'true' 'count'\n    case 56455:                     // 'false' 'default'\n    case 56517:                     // 'null' 'default'\n    case 56575:                     // 'true' 'default'\n    case 58503:                     // 'false' 'descending'\n    case 58565:                     // 'null' 'descending'\n    case 58623:                     // 'true' 'descending'\n    case 61063:                     // 'false' 'div'\n    case 61125:                     // 'null' 'div'\n    case 61183:                     // 'true' 'div'\n    case 63111:                     // 'false' 'else'\n    case 63173:                     // 'null' 'else'\n    case 63231:                     // 'true' 'else'\n    case 63623:                     // 'false' 'empty'\n    case 63685:                     // 'null' 'empty'\n    case 63743:                     // 'true' 'empty'\n    case 65159:                     // 'false' 'end'\n    case 65221:                     // 'null' 'end'\n    case 65279:                     // 'true' 'end'\n    case 66183:                     // 'false' 'eq'\n    case 66245:                     // 'null' 'eq'\n    case 66303:                     // 'true' 'eq'\n    case 67719:                     // 'false' 'except'\n    case 67781:                     // 'null' 'except'\n    case 67839:                     // 'true' 'except'\n    case 71303:                     // 'false' 'for'\n    case 71365:                     // 'null' 'for'\n    case 71423:                     // 'true' 'for'\n    case 75911:                     // 'false' 'ge'\n    case 75973:                     // 'null' 'ge'\n    case 76031:                     // 'true' 'ge'\n    case 76935:                     // 'false' 'group'\n    case 76997:                     // 'null' 'group'\n    case 77055:                     // 'true' 'group'\n    case 77959:                     // 'false' 'gt'\n    case 78021:                     // 'null' 'gt'\n    case 78079:                     // 'true' 'gt'\n    case 78471:                     // 'false' 'idiv'\n    case 78533:                     // 'null' 'idiv'\n    case 78591:                     // 'true' 'idiv'\n    case 83079:                     // 'false' 'instance'\n    case 83141:                     // 'null' 'instance'\n    case 83199:                     // 'true' 'instance'\n    case 84103:                     // 'false' 'intersect'\n    case 84165:                     // 'null' 'intersect'\n    case 84223:                     // 'true' 'intersect'\n    case 84615:                     // 'false' 'into'\n    case 84677:                     // 'null' 'into'\n    case 84735:                     // 'true' 'into'\n    case 85127:                     // 'false' 'is'\n    case 85189:                     // 'null' 'is'\n    case 85247:                     // 'true' 'is'\n    case 89735:                     // 'false' 'le'\n    case 89797:                     // 'null' 'le'\n    case 89855:                     // 'true' 'le'\n    case 90759:                     // 'false' 'let'\n    case 90821:                     // 'null' 'let'\n    case 90879:                     // 'true' 'let'\n    case 92807:                     // 'false' 'lt'\n    case 92869:                     // 'null' 'lt'\n    case 92927:                     // 'true' 'lt'\n    case 93831:                     // 'false' 'mod'\n    case 93893:                     // 'null' 'mod'\n    case 93951:                     // 'true' 'mod'\n    case 94343:                     // 'false' 'modify'\n    case 94405:                     // 'null' 'modify'\n    case 94463:                     // 'true' 'modify'\n    case 96903:                     // 'false' 'ne'\n    case 96965:                     // 'null' 'ne'\n    case 97023:                     // 'true' 'ne'\n    case 103559:                    // 'false' 'only'\n    case 103621:                    // 'null' 'only'\n    case 103679:                    // 'true' 'only'\n    case 104583:                    // 'false' 'or'\n    case 104645:                    // 'null' 'or'\n    case 104703:                    // 'true' 'or'\n    case 105095:                    // 'false' 'order'\n    case 105157:                    // 'null' 'order'\n    case 105215:                    // 'true' 'order'\n    case 107143:                    // 'false' 'paragraphs'\n    case 107205:                    // 'null' 'paragraphs'\n    case 107263:                    // 'true' 'paragraphs'\n    case 114823:                    // 'false' 'return'\n    case 114885:                    // 'null' 'return'\n    case 114943:                    // 'true' 'return'\n    case 116871:                    // 'false' 'satisfies'\n    case 116933:                    // 'null' 'satisfies'\n    case 116991:                    // 'true' 'satisfies'\n    case 121479:                    // 'false' 'sentences'\n    case 121541:                    // 'null' 'sentences'\n    case 121599:                    // 'true' 'sentences'\n    case 123527:                    // 'false' 'stable'\n    case 123589:                    // 'null' 'stable'\n    case 123647:                    // 'true' 'stable'\n    case 124039:                    // 'false' 'start'\n    case 124101:                    // 'null' 'start'\n    case 124159:                    // 'true' 'start'\n    case 129159:                    // 'false' 'times'\n    case 129221:                    // 'null' 'times'\n    case 129279:                    // 'true' 'times'\n    case 129671:                    // 'false' 'to'\n    case 129733:                    // 'null' 'to'\n    case 129791:                    // 'true' 'to'\n    case 130183:                    // 'false' 'treat'\n    case 130245:                    // 'null' 'treat'\n    case 130303:                    // 'true' 'treat'\n    case 133255:                    // 'false' 'union'\n    case 133317:                    // 'null' 'union'\n    case 133375:                    // 'true' 'union'\n    case 139399:                    // 'false' 'where'\n    case 139461:                    // 'null' 'where'\n    case 139519:                    // 'true' 'where'\n    case 141447:                    // 'false' 'with'\n    case 141509:                    // 'null' 'with'\n    case 141567:                    // 'true' 'with'\n    case 142983:                    // 'false' 'words'\n    case 143045:                    // 'null' 'words'\n    case 143103:                    // 'true' 'words'\n    case 145543:                    // 'false' '|'\n    case 145605:                    // 'null' '|'\n    case 145663:                    // 'true' '|'\n    case 146055:                    // 'false' '||'\n    case 146117:                    // 'null' '||'\n    case 146175:                    // 'true' '||'\n    case 146567:                    // 'false' '|}'\n    case 146629:                    // 'null' '|}'\n    case 146687:                    // 'true' '|}'\n    case 147079:                    // 'false' '}'\n    case 147141:                    // 'null' '}'\n    case 147199:                    // 'true' '}'\n      try_Literal();\n      break;\n    case 31:                        // '$'\n      try_VarRef();\n      break;\n    case 35:                        // '('\n      try_ParenthesizedExpr();\n      break;\n    case 32:                        // '$$'\n      try_ContextItemExpr();\n      break;\n    case -5:\n    case 17926:                     // EQName^Token '('\n    case 17991:                     // 'after' '('\n    case 17993:                     // 'allowing' '('\n    case 17994:                     // 'ancestor' '('\n    case 17995:                     // 'ancestor-or-self' '('\n    case 17996:                     // 'and' '('\n    case 17998:                     // 'append' '('\n    case 18000:                     // 'as' '('\n    case 18001:                     // 'ascending' '('\n    case 18002:                     // 'at' '('\n    case 18004:                     // 'base-uri' '('\n    case 18005:                     // 'before' '('\n    case 18006:                     // 'boundary-space' '('\n    case 18007:                     // 'break' '('\n    case 18009:                     // 'case' '('\n    case 18010:                     // 'cast' '('\n    case 18011:                     // 'castable' '('\n    case 18012:                     // 'catch' '('\n    case 18014:                     // 'child' '('\n    case 18015:                     // 'collation' '('\n    case 18018:                     // 'constraint' '('\n    case 18019:                     // 'construction' '('\n    case 18022:                     // 'context' '('\n    case 18023:                     // 'continue' '('\n    case 18024:                     // 'copy' '('\n    case 18025:                     // 'copy-namespaces' '('\n    case 18026:                     // 'count' '('\n    case 18027:                     // 'decimal-format' '('\n    case 18029:                     // 'declare' '('\n    case 18030:                     // 'default' '('\n    case 18031:                     // 'delete' '('\n    case 18032:                     // 'descendant' '('\n    case 18033:                     // 'descendant-or-self' '('\n    case 18034:                     // 'descending' '('\n    case 18039:                     // 'div' '('\n    case 18040:                     // 'document' '('\n    case 18043:                     // 'else' '('\n    case 18044:                     // 'empty' '('\n    case 18046:                     // 'encoding' '('\n    case 18047:                     // 'end' '('\n    case 18049:                     // 'eq' '('\n    case 18050:                     // 'every' '('\n    case 18052:                     // 'except' '('\n    case 18053:                     // 'exit' '('\n    case 18054:                     // 'external' '('\n    case 18056:                     // 'first' '('\n    case 18057:                     // 'following' '('\n    case 18058:                     // 'following-sibling' '('\n    case 18059:                     // 'for' '('\n    case 18062:                     // 'from' '('\n    case 18063:                     // 'ft-option' '('\n    case 18068:                     // 'ge' '('\n    case 18070:                     // 'group' '('\n    case 18072:                     // 'gt' '('\n    case 18073:                     // 'idiv' '('\n    case 18075:                     // 'import' '('\n    case 18076:                     // 'in' '('\n    case 18077:                     // 'index' '('\n    case 18081:                     // 'insert' '('\n    case 18082:                     // 'instance' '('\n    case 18083:                     // 'integrity' '('\n    case 18084:                     // 'intersect' '('\n    case 18085:                     // 'into' '('\n    case 18086:                     // 'is' '('\n    case 18088:                     // 'json' '('\n    case 18090:                     // 'jsoniq' '('\n    case 18093:                     // 'last' '('\n    case 18094:                     // 'lax' '('\n    case 18095:                     // 'le' '('\n    case 18097:                     // 'let' '('\n    case 18099:                     // 'loop' '('\n    case 18101:                     // 'lt' '('\n    case 18103:                     // 'mod' '('\n    case 18104:                     // 'modify' '('\n    case 18105:                     // 'module' '('\n    case 18107:                     // 'namespace' '('\n    case 18109:                     // 'ne' '('\n    case 18115:                     // 'nodes' '('\n    case 18118:                     // 'object' '('\n    case 18122:                     // 'only' '('\n    case 18123:                     // 'option' '('\n    case 18124:                     // 'or' '('\n    case 18125:                     // 'order' '('\n    case 18126:                     // 'ordered' '('\n    case 18127:                     // 'ordering' '('\n    case 18130:                     // 'parent' '('\n    case 18136:                     // 'preceding' '('\n    case 18137:                     // 'preceding-sibling' '('\n    case 18142:                     // 'rename' '('\n    case 18143:                     // 'replace' '('\n    case 18144:                     // 'return' '('\n    case 18145:                     // 'returning' '('\n    case 18146:                     // 'revalidation' '('\n    case 18148:                     // 'satisfies' '('\n    case 18149:                     // 'schema' '('\n    case 18152:                     // 'score' '('\n    case 18153:                     // 'select' '('\n    case 18154:                     // 'self' '('\n    case 18159:                     // 'sliding' '('\n    case 18160:                     // 'some' '('\n    case 18161:                     // 'stable' '('\n    case 18162:                     // 'start' '('\n    case 18165:                     // 'strict' '('\n    case 18173:                     // 'to' '('\n    case 18174:                     // 'treat' '('\n    case 18176:                     // 'try' '('\n    case 18177:                     // 'tumbling' '('\n    case 18178:                     // 'type' '('\n    case 18180:                     // 'union' '('\n    case 18182:                     // 'unordered' '('\n    case 18183:                     // 'updating' '('\n    case 18186:                     // 'validate' '('\n    case 18187:                     // 'value' '('\n    case 18188:                     // 'variable' '('\n    case 18189:                     // 'version' '('\n    case 18192:                     // 'where' '('\n    case 18193:                     // 'while' '('\n    case 18196:                     // 'with' '('\n      try_FunctionCall();\n      break;\n    case 144078:                    // 'ordered' '{'\n      try_OrderedExpr();\n      break;\n    case 144134:                    // 'unordered' '{'\n      try_UnorderedExpr();\n      break;\n    case 33:                        // '%'\n    case 79:                        // 'array'\n    case 121:                       // 'document-node'\n    case 125:                       // 'empty-sequence'\n    case 147:                       // 'function'\n    case 154:                       // 'if'\n    case 167:                       // 'item'\n    case 169:                       // 'json-item'\n    case 188:                       // 'namespace-node'\n    case 194:                       // 'node'\n    case 230:                       // 'schema-attribute'\n    case 231:                       // 'schema-element'\n    case 247:                       // 'structured-item'\n    case 248:                       // 'switch'\n    case 259:                       // 'typeswitch'\n    case 14854:                     // EQName^Token '#'\n    case 14919:                     // 'after' '#'\n    case 14921:                     // 'allowing' '#'\n    case 14922:                     // 'ancestor' '#'\n    case 14923:                     // 'ancestor-or-self' '#'\n    case 14924:                     // 'and' '#'\n    case 14926:                     // 'append' '#'\n    case 14928:                     // 'as' '#'\n    case 14929:                     // 'ascending' '#'\n    case 14930:                     // 'at' '#'\n    case 14931:                     // 'attribute' '#'\n    case 14932:                     // 'base-uri' '#'\n    case 14933:                     // 'before' '#'\n    case 14934:                     // 'boundary-space' '#'\n    case 14935:                     // 'break' '#'\n    case 14937:                     // 'case' '#'\n    case 14938:                     // 'cast' '#'\n    case 14939:                     // 'castable' '#'\n    case 14940:                     // 'catch' '#'\n    case 14942:                     // 'child' '#'\n    case 14943:                     // 'collation' '#'\n    case 14945:                     // 'comment' '#'\n    case 14946:                     // 'constraint' '#'\n    case 14947:                     // 'construction' '#'\n    case 14950:                     // 'context' '#'\n    case 14951:                     // 'continue' '#'\n    case 14952:                     // 'copy' '#'\n    case 14953:                     // 'copy-namespaces' '#'\n    case 14954:                     // 'count' '#'\n    case 14955:                     // 'decimal-format' '#'\n    case 14957:                     // 'declare' '#'\n    case 14958:                     // 'default' '#'\n    case 14959:                     // 'delete' '#'\n    case 14960:                     // 'descendant' '#'\n    case 14961:                     // 'descendant-or-self' '#'\n    case 14962:                     // 'descending' '#'\n    case 14967:                     // 'div' '#'\n    case 14968:                     // 'document' '#'\n    case 14970:                     // 'element' '#'\n    case 14971:                     // 'else' '#'\n    case 14972:                     // 'empty' '#'\n    case 14974:                     // 'encoding' '#'\n    case 14975:                     // 'end' '#'\n    case 14977:                     // 'eq' '#'\n    case 14978:                     // 'every' '#'\n    case 14980:                     // 'except' '#'\n    case 14981:                     // 'exit' '#'\n    case 14982:                     // 'external' '#'\n    case 14983:                     // 'false' '#'\n    case 14984:                     // 'first' '#'\n    case 14985:                     // 'following' '#'\n    case 14986:                     // 'following-sibling' '#'\n    case 14987:                     // 'for' '#'\n    case 14990:                     // 'from' '#'\n    case 14991:                     // 'ft-option' '#'\n    case 14996:                     // 'ge' '#'\n    case 14998:                     // 'group' '#'\n    case 15000:                     // 'gt' '#'\n    case 15001:                     // 'idiv' '#'\n    case 15003:                     // 'import' '#'\n    case 15004:                     // 'in' '#'\n    case 15005:                     // 'index' '#'\n    case 15009:                     // 'insert' '#'\n    case 15010:                     // 'instance' '#'\n    case 15011:                     // 'integrity' '#'\n    case 15012:                     // 'intersect' '#'\n    case 15013:                     // 'into' '#'\n    case 15014:                     // 'is' '#'\n    case 15016:                     // 'json' '#'\n    case 15018:                     // 'jsoniq' '#'\n    case 15021:                     // 'last' '#'\n    case 15022:                     // 'lax' '#'\n    case 15023:                     // 'le' '#'\n    case 15025:                     // 'let' '#'\n    case 15027:                     // 'loop' '#'\n    case 15029:                     // 'lt' '#'\n    case 15031:                     // 'mod' '#'\n    case 15032:                     // 'modify' '#'\n    case 15033:                     // 'module' '#'\n    case 15035:                     // 'namespace' '#'\n    case 15037:                     // 'ne' '#'\n    case 15043:                     // 'nodes' '#'\n    case 15045:                     // 'null' '#'\n    case 15046:                     // 'object' '#'\n    case 15050:                     // 'only' '#'\n    case 15051:                     // 'option' '#'\n    case 15052:                     // 'or' '#'\n    case 15053:                     // 'order' '#'\n    case 15054:                     // 'ordered' '#'\n    case 15055:                     // 'ordering' '#'\n    case 15058:                     // 'parent' '#'\n    case 15064:                     // 'preceding' '#'\n    case 15065:                     // 'preceding-sibling' '#'\n    case 15068:                     // 'processing-instruction' '#'\n    case 15070:                     // 'rename' '#'\n    case 15071:                     // 'replace' '#'\n    case 15072:                     // 'return' '#'\n    case 15073:                     // 'returning' '#'\n    case 15074:                     // 'revalidation' '#'\n    case 15076:                     // 'satisfies' '#'\n    case 15077:                     // 'schema' '#'\n    case 15080:                     // 'score' '#'\n    case 15081:                     // 'select' '#'\n    case 15082:                     // 'self' '#'\n    case 15087:                     // 'sliding' '#'\n    case 15088:                     // 'some' '#'\n    case 15089:                     // 'stable' '#'\n    case 15090:                     // 'start' '#'\n    case 15093:                     // 'strict' '#'\n    case 15097:                     // 'text' '#'\n    case 15101:                     // 'to' '#'\n    case 15102:                     // 'treat' '#'\n    case 15103:                     // 'true' '#'\n    case 15104:                     // 'try' '#'\n    case 15105:                     // 'tumbling' '#'\n    case 15106:                     // 'type' '#'\n    case 15108:                     // 'union' '#'\n    case 15110:                     // 'unordered' '#'\n    case 15111:                     // 'updating' '#'\n    case 15114:                     // 'validate' '#'\n    case 15115:                     // 'value' '#'\n    case 15116:                     // 'variable' '#'\n    case 15117:                     // 'version' '#'\n    case 15120:                     // 'where' '#'\n    case 15121:                     // 'while' '#'\n    case 15124:                     // 'with' '#'\n      try_FunctionItemExpr();\n      break;\n    case -10:\n    case 27929:                     // '{' ';'\n      try_BlockExpr();\n      break;\n    case -11:\n    case 10009:                     // '{' NCName^Token\n      try_ObjectConstructor();\n      break;\n    case 69:                        // '['\n      try_ArrayConstructor();\n      break;\n    case 283:                       // '{|'\n      try_JSONSimpleObjectUnion();\n      break;\n    case -14:\n      break;\n    default:\n      try_Constructor();\n    }\n  }\n\n  function parse_JSONSimpleObjectUnion()\n  {\n    eventHandler.startNonterminal(\"JSONSimpleObjectUnion\", e0);\n    shift(283);                     // '{|'\n    lookahead1W(274);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    if (l1 != 286)                  // '|}'\n    {\n      whitespace();\n      parse_Expr();\n    }\n    shift(286);                     // '|}'\n    eventHandler.endNonterminal(\"JSONSimpleObjectUnion\", e0);\n  }\n\n  function try_JSONSimpleObjectUnion()\n  {\n    shiftT(283);                    // '{|'\n    lookahead1W(274);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    if (l1 != 286)                  // '|}'\n    {\n      try_Expr();\n    }\n    shiftT(286);                    // '|}'\n  }\n\n  function parse_ObjectConstructor()\n  {\n    eventHandler.startNonterminal(\"ObjectConstructor\", e0);\n    shift(281);                     // '{'\n    lookahead1W(277);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    if (l1 != 287)                  // '}'\n    {\n      whitespace();\n      parse_PairConstructorList();\n    }\n    shift(287);                     // '}'\n    eventHandler.endNonterminal(\"ObjectConstructor\", e0);\n  }\n\n  function try_ObjectConstructor()\n  {\n    shiftT(281);                    // '{'\n    lookahead1W(277);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    if (l1 != 287)                  // '}'\n    {\n      try_PairConstructorList();\n    }\n    shiftT(287);                    // '}'\n  }\n\n  function parse_PairConstructorList()\n  {\n    eventHandler.startNonterminal(\"PairConstructorList\", e0);\n    parse_PairConstructor();\n    for (;;)\n    {\n      if (l1 != 42)                 // ','\n      {\n        break;\n      }\n      shift(42);                    // ','\n      lookahead1W(268);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_PairConstructor();\n    }\n    eventHandler.endNonterminal(\"PairConstructorList\", e0);\n  }\n\n  function try_PairConstructorList()\n  {\n    try_PairConstructor();\n    for (;;)\n    {\n      if (l1 != 42)                 // ','\n      {\n        break;\n      }\n      shiftT(42);                   // ','\n      lookahead1W(268);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      try_PairConstructor();\n    }\n  }\n\n  function parse_PairConstructor()\n  {\n    eventHandler.startNonterminal(\"PairConstructor\", e0);\n    switch (l1)\n    {\n    case 78:                        // 'append'\n      lookahead2W(279);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    case 139:                       // 'for'\n      lookahead2W(187);             // S^WS | '#' | '$' | '(' | '(:' | ':' | 'sliding' | 'tumbling'\n      break;\n    case 161:                       // 'insert'\n      lookahead2W(282);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    case 177:                       // 'let'\n      lookahead2W(178);             // S^WS | '#' | '$' | '(' | '(:' | ':' | 'score'\n      break;\n    case 187:                       // 'namespace'\n      lookahead2W(252);             // NCName^Token | S^WS | '#' | '(' | '(:' | ':' | 'after' | 'allowing' |\n      break;\n    case 220:                       // 'processing-instruction'\n      lookahead2W(248);             // NCName^Token | S^WS | '#' | '(:' | ':' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    case 223:                       // 'replace'\n      lookahead2W(180);             // S^WS | '#' | '(' | '(:' | ':' | 'node' | 'value'\n      break;\n    case 266:                       // 'validate'\n      lookahead2W(191);             // S^WS | '#' | '(' | '(:' | ':' | 'lax' | 'strict' | 'type' | '{'\n      break;\n    case 83:                        // 'attribute'\n    case 122:                       // 'element'\n      lookahead2W(257);             // EQName^Token | S^WS | '#' | '(:' | ':' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    case 97:                        // 'comment'\n    case 249:                       // 'text'\n      lookahead2W(149);             // S^WS | '#' | '(:' | ':' | '{'\n      break;\n    case 111:                       // 'delete'\n    case 222:                       // 'rename'\n      lookahead2W(262);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    case 104:                       // 'copy'\n    case 130:                       // 'every'\n    case 240:                       // 'some'\n      lookahead2W(165);             // S^WS | '#' | '$' | '(' | '(:' | ':'\n      break;\n    case 135:                       // 'false'\n    case 197:                       // 'null'\n    case 255:                       // 'true'\n      lookahead2W(209);             // S^WS | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | '-' | '.' | '/' | '//' | ':' |\n      break;\n    case 120:                       // 'document'\n    case 206:                       // 'ordered'\n    case 256:                       // 'try'\n    case 262:                       // 'unordered'\n      lookahead2W(167);             // S^WS | '#' | '(' | '(:' | ':' | '{'\n      break;\n    case 121:                       // 'document-node'\n    case 125:                       // 'empty-sequence'\n    case 167:                       // 'item'\n    case 188:                       // 'namespace-node'\n    case 194:                       // 'node'\n    case 230:                       // 'schema-attribute'\n    case 231:                       // 'schema-element'\n      lookahead2W(96);              // S^WS | '#' | '(:' | ':'\n      break;\n    case 71:                        // 'after'\n    case 73:                        // 'allowing'\n    case 74:                        // 'ancestor'\n    case 75:                        // 'ancestor-or-self'\n    case 76:                        // 'and'\n    case 80:                        // 'as'\n    case 81:                        // 'ascending'\n    case 82:                        // 'at'\n    case 84:                        // 'base-uri'\n    case 85:                        // 'before'\n    case 86:                        // 'boundary-space'\n    case 87:                        // 'break'\n    case 89:                        // 'case'\n    case 90:                        // 'cast'\n    case 91:                        // 'castable'\n    case 92:                        // 'catch'\n    case 94:                        // 'child'\n    case 95:                        // 'collation'\n    case 98:                        // 'constraint'\n    case 99:                        // 'construction'\n    case 102:                       // 'context'\n    case 103:                       // 'continue'\n    case 105:                       // 'copy-namespaces'\n    case 106:                       // 'count'\n    case 107:                       // 'decimal-format'\n    case 109:                       // 'declare'\n    case 110:                       // 'default'\n    case 112:                       // 'descendant'\n    case 113:                       // 'descendant-or-self'\n    case 114:                       // 'descending'\n    case 119:                       // 'div'\n    case 123:                       // 'else'\n    case 124:                       // 'empty'\n    case 126:                       // 'encoding'\n    case 127:                       // 'end'\n    case 129:                       // 'eq'\n    case 132:                       // 'except'\n    case 133:                       // 'exit'\n    case 134:                       // 'external'\n    case 136:                       // 'first'\n    case 137:                       // 'following'\n    case 138:                       // 'following-sibling'\n    case 142:                       // 'from'\n    case 143:                       // 'ft-option'\n    case 147:                       // 'function'\n    case 148:                       // 'ge'\n    case 150:                       // 'group'\n    case 152:                       // 'gt'\n    case 153:                       // 'idiv'\n    case 154:                       // 'if'\n    case 155:                       // 'import'\n    case 156:                       // 'in'\n    case 157:                       // 'index'\n    case 162:                       // 'instance'\n    case 163:                       // 'integrity'\n    case 164:                       // 'intersect'\n    case 165:                       // 'into'\n    case 166:                       // 'is'\n    case 168:                       // 'json'\n    case 170:                       // 'jsoniq'\n    case 173:                       // 'last'\n    case 174:                       // 'lax'\n    case 175:                       // 'le'\n    case 179:                       // 'loop'\n    case 181:                       // 'lt'\n    case 183:                       // 'mod'\n    case 184:                       // 'modify'\n    case 185:                       // 'module'\n    case 189:                       // 'ne'\n    case 195:                       // 'nodes'\n    case 198:                       // 'object'\n    case 202:                       // 'only'\n    case 203:                       // 'option'\n    case 204:                       // 'or'\n    case 205:                       // 'order'\n    case 207:                       // 'ordering'\n    case 210:                       // 'parent'\n    case 216:                       // 'preceding'\n    case 217:                       // 'preceding-sibling'\n    case 224:                       // 'return'\n    case 225:                       // 'returning'\n    case 226:                       // 'revalidation'\n    case 228:                       // 'satisfies'\n    case 229:                       // 'schema'\n    case 232:                       // 'score'\n    case 233:                       // 'select'\n    case 234:                       // 'self'\n    case 239:                       // 'sliding'\n    case 241:                       // 'stable'\n    case 242:                       // 'start'\n    case 245:                       // 'strict'\n    case 248:                       // 'switch'\n    case 253:                       // 'to'\n    case 254:                       // 'treat'\n    case 257:                       // 'tumbling'\n    case 258:                       // 'type'\n    case 259:                       // 'typeswitch'\n    case 260:                       // 'union'\n    case 263:                       // 'updating'\n    case 267:                       // 'value'\n    case 268:                       // 'variable'\n    case 269:                       // 'version'\n    case 272:                       // 'where'\n    case 273:                       // 'while'\n    case 276:                       // 'with'\n      lookahead2W(144);             // S^WS | '#' | '(' | '(:' | ':'\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 25735                 // 'false' ':'\n     || lk == 25797                 // 'null' ':'\n     || lk == 25855)                // 'true' ':'\n    {\n      lk = memoized(21, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_ExprSingle();\n          lk = -1;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n        }\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(21, e0, lk);\n      }\n    }\n    switch (lk)\n    {\n    case -2:\n    case 19:                        // NCName^Token\n    case 25671:                     // 'after' ':'\n    case 25673:                     // 'allowing' ':'\n    case 25674:                     // 'ancestor' ':'\n    case 25675:                     // 'ancestor-or-self' ':'\n    case 25676:                     // 'and' ':'\n    case 25678:                     // 'append' ':'\n    case 25680:                     // 'as' ':'\n    case 25681:                     // 'ascending' ':'\n    case 25682:                     // 'at' ':'\n    case 25683:                     // 'attribute' ':'\n    case 25684:                     // 'base-uri' ':'\n    case 25685:                     // 'before' ':'\n    case 25686:                     // 'boundary-space' ':'\n    case 25687:                     // 'break' ':'\n    case 25689:                     // 'case' ':'\n    case 25690:                     // 'cast' ':'\n    case 25691:                     // 'castable' ':'\n    case 25692:                     // 'catch' ':'\n    case 25694:                     // 'child' ':'\n    case 25695:                     // 'collation' ':'\n    case 25697:                     // 'comment' ':'\n    case 25698:                     // 'constraint' ':'\n    case 25699:                     // 'construction' ':'\n    case 25702:                     // 'context' ':'\n    case 25703:                     // 'continue' ':'\n    case 25704:                     // 'copy' ':'\n    case 25705:                     // 'copy-namespaces' ':'\n    case 25706:                     // 'count' ':'\n    case 25707:                     // 'decimal-format' ':'\n    case 25709:                     // 'declare' ':'\n    case 25710:                     // 'default' ':'\n    case 25711:                     // 'delete' ':'\n    case 25712:                     // 'descendant' ':'\n    case 25713:                     // 'descendant-or-self' ':'\n    case 25714:                     // 'descending' ':'\n    case 25719:                     // 'div' ':'\n    case 25720:                     // 'document' ':'\n    case 25721:                     // 'document-node' ':'\n    case 25722:                     // 'element' ':'\n    case 25723:                     // 'else' ':'\n    case 25724:                     // 'empty' ':'\n    case 25725:                     // 'empty-sequence' ':'\n    case 25726:                     // 'encoding' ':'\n    case 25727:                     // 'end' ':'\n    case 25729:                     // 'eq' ':'\n    case 25730:                     // 'every' ':'\n    case 25732:                     // 'except' ':'\n    case 25733:                     // 'exit' ':'\n    case 25734:                     // 'external' ':'\n    case 25736:                     // 'first' ':'\n    case 25737:                     // 'following' ':'\n    case 25738:                     // 'following-sibling' ':'\n    case 25739:                     // 'for' ':'\n    case 25742:                     // 'from' ':'\n    case 25743:                     // 'ft-option' ':'\n    case 25747:                     // 'function' ':'\n    case 25748:                     // 'ge' ':'\n    case 25750:                     // 'group' ':'\n    case 25752:                     // 'gt' ':'\n    case 25753:                     // 'idiv' ':'\n    case 25754:                     // 'if' ':'\n    case 25755:                     // 'import' ':'\n    case 25756:                     // 'in' ':'\n    case 25757:                     // 'index' ':'\n    case 25761:                     // 'insert' ':'\n    case 25762:                     // 'instance' ':'\n    case 25763:                     // 'integrity' ':'\n    case 25764:                     // 'intersect' ':'\n    case 25765:                     // 'into' ':'\n    case 25766:                     // 'is' ':'\n    case 25767:                     // 'item' ':'\n    case 25768:                     // 'json' ':'\n    case 25770:                     // 'jsoniq' ':'\n    case 25773:                     // 'last' ':'\n    case 25774:                     // 'lax' ':'\n    case 25775:                     // 'le' ':'\n    case 25777:                     // 'let' ':'\n    case 25779:                     // 'loop' ':'\n    case 25781:                     // 'lt' ':'\n    case 25783:                     // 'mod' ':'\n    case 25784:                     // 'modify' ':'\n    case 25785:                     // 'module' ':'\n    case 25787:                     // 'namespace' ':'\n    case 25788:                     // 'namespace-node' ':'\n    case 25789:                     // 'ne' ':'\n    case 25794:                     // 'node' ':'\n    case 25795:                     // 'nodes' ':'\n    case 25798:                     // 'object' ':'\n    case 25802:                     // 'only' ':'\n    case 25803:                     // 'option' ':'\n    case 25804:                     // 'or' ':'\n    case 25805:                     // 'order' ':'\n    case 25806:                     // 'ordered' ':'\n    case 25807:                     // 'ordering' ':'\n    case 25810:                     // 'parent' ':'\n    case 25816:                     // 'preceding' ':'\n    case 25817:                     // 'preceding-sibling' ':'\n    case 25820:                     // 'processing-instruction' ':'\n    case 25822:                     // 'rename' ':'\n    case 25823:                     // 'replace' ':'\n    case 25824:                     // 'return' ':'\n    case 25825:                     // 'returning' ':'\n    case 25826:                     // 'revalidation' ':'\n    case 25828:                     // 'satisfies' ':'\n    case 25829:                     // 'schema' ':'\n    case 25830:                     // 'schema-attribute' ':'\n    case 25831:                     // 'schema-element' ':'\n    case 25832:                     // 'score' ':'\n    case 25833:                     // 'select' ':'\n    case 25834:                     // 'self' ':'\n    case 25839:                     // 'sliding' ':'\n    case 25840:                     // 'some' ':'\n    case 25841:                     // 'stable' ':'\n    case 25842:                     // 'start' ':'\n    case 25845:                     // 'strict' ':'\n    case 25848:                     // 'switch' ':'\n    case 25849:                     // 'text' ':'\n    case 25853:                     // 'to' ':'\n    case 25854:                     // 'treat' ':'\n    case 25856:                     // 'try' ':'\n    case 25857:                     // 'tumbling' ':'\n    case 25858:                     // 'type' ':'\n    case 25859:                     // 'typeswitch' ':'\n    case 25860:                     // 'union' ':'\n    case 25862:                     // 'unordered' ':'\n    case 25863:                     // 'updating' ':'\n    case 25866:                     // 'validate' ':'\n    case 25867:                     // 'value' ':'\n    case 25868:                     // 'variable' ':'\n    case 25869:                     // 'version' ':'\n    case 25872:                     // 'where' ':'\n    case 25873:                     // 'while' ':'\n    case 25876:                     // 'with' ':'\n      parse_NCName();\n      break;\n    default:\n      parse_ExprSingle();\n    }\n    lookahead1W(26);                // S^WS | '(:' | ':'\n    shift(50);                      // ':'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"PairConstructor\", e0);\n  }\n\n  function try_PairConstructor()\n  {\n    switch (l1)\n    {\n    case 78:                        // 'append'\n      lookahead2W(279);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    case 139:                       // 'for'\n      lookahead2W(187);             // S^WS | '#' | '$' | '(' | '(:' | ':' | 'sliding' | 'tumbling'\n      break;\n    case 161:                       // 'insert'\n      lookahead2W(282);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    case 177:                       // 'let'\n      lookahead2W(178);             // S^WS | '#' | '$' | '(' | '(:' | ':' | 'score'\n      break;\n    case 187:                       // 'namespace'\n      lookahead2W(252);             // NCName^Token | S^WS | '#' | '(' | '(:' | ':' | 'after' | 'allowing' |\n      break;\n    case 220:                       // 'processing-instruction'\n      lookahead2W(248);             // NCName^Token | S^WS | '#' | '(:' | ':' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    case 223:                       // 'replace'\n      lookahead2W(180);             // S^WS | '#' | '(' | '(:' | ':' | 'node' | 'value'\n      break;\n    case 266:                       // 'validate'\n      lookahead2W(191);             // S^WS | '#' | '(' | '(:' | ':' | 'lax' | 'strict' | 'type' | '{'\n      break;\n    case 83:                        // 'attribute'\n    case 122:                       // 'element'\n      lookahead2W(257);             // EQName^Token | S^WS | '#' | '(:' | ':' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    case 97:                        // 'comment'\n    case 249:                       // 'text'\n      lookahead2W(149);             // S^WS | '#' | '(:' | ':' | '{'\n      break;\n    case 111:                       // 'delete'\n    case 222:                       // 'rename'\n      lookahead2W(262);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      break;\n    case 104:                       // 'copy'\n    case 130:                       // 'every'\n    case 240:                       // 'some'\n      lookahead2W(165);             // S^WS | '#' | '$' | '(' | '(:' | ':'\n      break;\n    case 135:                       // 'false'\n    case 197:                       // 'null'\n    case 255:                       // 'true'\n      lookahead2W(209);             // S^WS | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | '-' | '.' | '/' | '//' | ':' |\n      break;\n    case 120:                       // 'document'\n    case 206:                       // 'ordered'\n    case 256:                       // 'try'\n    case 262:                       // 'unordered'\n      lookahead2W(167);             // S^WS | '#' | '(' | '(:' | ':' | '{'\n      break;\n    case 121:                       // 'document-node'\n    case 125:                       // 'empty-sequence'\n    case 167:                       // 'item'\n    case 188:                       // 'namespace-node'\n    case 194:                       // 'node'\n    case 230:                       // 'schema-attribute'\n    case 231:                       // 'schema-element'\n      lookahead2W(96);              // S^WS | '#' | '(:' | ':'\n      break;\n    case 71:                        // 'after'\n    case 73:                        // 'allowing'\n    case 74:                        // 'ancestor'\n    case 75:                        // 'ancestor-or-self'\n    case 76:                        // 'and'\n    case 80:                        // 'as'\n    case 81:                        // 'ascending'\n    case 82:                        // 'at'\n    case 84:                        // 'base-uri'\n    case 85:                        // 'before'\n    case 86:                        // 'boundary-space'\n    case 87:                        // 'break'\n    case 89:                        // 'case'\n    case 90:                        // 'cast'\n    case 91:                        // 'castable'\n    case 92:                        // 'catch'\n    case 94:                        // 'child'\n    case 95:                        // 'collation'\n    case 98:                        // 'constraint'\n    case 99:                        // 'construction'\n    case 102:                       // 'context'\n    case 103:                       // 'continue'\n    case 105:                       // 'copy-namespaces'\n    case 106:                       // 'count'\n    case 107:                       // 'decimal-format'\n    case 109:                       // 'declare'\n    case 110:                       // 'default'\n    case 112:                       // 'descendant'\n    case 113:                       // 'descendant-or-self'\n    case 114:                       // 'descending'\n    case 119:                       // 'div'\n    case 123:                       // 'else'\n    case 124:                       // 'empty'\n    case 126:                       // 'encoding'\n    case 127:                       // 'end'\n    case 129:                       // 'eq'\n    case 132:                       // 'except'\n    case 133:                       // 'exit'\n    case 134:                       // 'external'\n    case 136:                       // 'first'\n    case 137:                       // 'following'\n    case 138:                       // 'following-sibling'\n    case 142:                       // 'from'\n    case 143:                       // 'ft-option'\n    case 147:                       // 'function'\n    case 148:                       // 'ge'\n    case 150:                       // 'group'\n    case 152:                       // 'gt'\n    case 153:                       // 'idiv'\n    case 154:                       // 'if'\n    case 155:                       // 'import'\n    case 156:                       // 'in'\n    case 157:                       // 'index'\n    case 162:                       // 'instance'\n    case 163:                       // 'integrity'\n    case 164:                       // 'intersect'\n    case 165:                       // 'into'\n    case 166:                       // 'is'\n    case 168:                       // 'json'\n    case 170:                       // 'jsoniq'\n    case 173:                       // 'last'\n    case 174:                       // 'lax'\n    case 175:                       // 'le'\n    case 179:                       // 'loop'\n    case 181:                       // 'lt'\n    case 183:                       // 'mod'\n    case 184:                       // 'modify'\n    case 185:                       // 'module'\n    case 189:                       // 'ne'\n    case 195:                       // 'nodes'\n    case 198:                       // 'object'\n    case 202:                       // 'only'\n    case 203:                       // 'option'\n    case 204:                       // 'or'\n    case 205:                       // 'order'\n    case 207:                       // 'ordering'\n    case 210:                       // 'parent'\n    case 216:                       // 'preceding'\n    case 217:                       // 'preceding-sibling'\n    case 224:                       // 'return'\n    case 225:                       // 'returning'\n    case 226:                       // 'revalidation'\n    case 228:                       // 'satisfies'\n    case 229:                       // 'schema'\n    case 232:                       // 'score'\n    case 233:                       // 'select'\n    case 234:                       // 'self'\n    case 239:                       // 'sliding'\n    case 241:                       // 'stable'\n    case 242:                       // 'start'\n    case 245:                       // 'strict'\n    case 248:                       // 'switch'\n    case 253:                       // 'to'\n    case 254:                       // 'treat'\n    case 257:                       // 'tumbling'\n    case 258:                       // 'type'\n    case 259:                       // 'typeswitch'\n    case 260:                       // 'union'\n    case 263:                       // 'updating'\n    case 267:                       // 'value'\n    case 268:                       // 'variable'\n    case 269:                       // 'version'\n    case 272:                       // 'where'\n    case 273:                       // 'while'\n    case 276:                       // 'with'\n      lookahead2W(144);             // S^WS | '#' | '(' | '(:' | ':'\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 25735                 // 'false' ':'\n     || lk == 25797                 // 'null' ':'\n     || lk == 25855)                // 'true' ':'\n    {\n      lk = memoized(21, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_ExprSingle();\n          memoize(21, e0A, -1);\n          lk = -3;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(21, e0A, -2);\n        }\n      }\n    }\n    switch (lk)\n    {\n    case -2:\n    case 19:                        // NCName^Token\n    case 25671:                     // 'after' ':'\n    case 25673:                     // 'allowing' ':'\n    case 25674:                     // 'ancestor' ':'\n    case 25675:                     // 'ancestor-or-self' ':'\n    case 25676:                     // 'and' ':'\n    case 25678:                     // 'append' ':'\n    case 25680:                     // 'as' ':'\n    case 25681:                     // 'ascending' ':'\n    case 25682:                     // 'at' ':'\n    case 25683:                     // 'attribute' ':'\n    case 25684:                     // 'base-uri' ':'\n    case 25685:                     // 'before' ':'\n    case 25686:                     // 'boundary-space' ':'\n    case 25687:                     // 'break' ':'\n    case 25689:                     // 'case' ':'\n    case 25690:                     // 'cast' ':'\n    case 25691:                     // 'castable' ':'\n    case 25692:                     // 'catch' ':'\n    case 25694:                     // 'child' ':'\n    case 25695:                     // 'collation' ':'\n    case 25697:                     // 'comment' ':'\n    case 25698:                     // 'constraint' ':'\n    case 25699:                     // 'construction' ':'\n    case 25702:                     // 'context' ':'\n    case 25703:                     // 'continue' ':'\n    case 25704:                     // 'copy' ':'\n    case 25705:                     // 'copy-namespaces' ':'\n    case 25706:                     // 'count' ':'\n    case 25707:                     // 'decimal-format' ':'\n    case 25709:                     // 'declare' ':'\n    case 25710:                     // 'default' ':'\n    case 25711:                     // 'delete' ':'\n    case 25712:                     // 'descendant' ':'\n    case 25713:                     // 'descendant-or-self' ':'\n    case 25714:                     // 'descending' ':'\n    case 25719:                     // 'div' ':'\n    case 25720:                     // 'document' ':'\n    case 25721:                     // 'document-node' ':'\n    case 25722:                     // 'element' ':'\n    case 25723:                     // 'else' ':'\n    case 25724:                     // 'empty' ':'\n    case 25725:                     // 'empty-sequence' ':'\n    case 25726:                     // 'encoding' ':'\n    case 25727:                     // 'end' ':'\n    case 25729:                     // 'eq' ':'\n    case 25730:                     // 'every' ':'\n    case 25732:                     // 'except' ':'\n    case 25733:                     // 'exit' ':'\n    case 25734:                     // 'external' ':'\n    case 25736:                     // 'first' ':'\n    case 25737:                     // 'following' ':'\n    case 25738:                     // 'following-sibling' ':'\n    case 25739:                     // 'for' ':'\n    case 25742:                     // 'from' ':'\n    case 25743:                     // 'ft-option' ':'\n    case 25747:                     // 'function' ':'\n    case 25748:                     // 'ge' ':'\n    case 25750:                     // 'group' ':'\n    case 25752:                     // 'gt' ':'\n    case 25753:                     // 'idiv' ':'\n    case 25754:                     // 'if' ':'\n    case 25755:                     // 'import' ':'\n    case 25756:                     // 'in' ':'\n    case 25757:                     // 'index' ':'\n    case 25761:                     // 'insert' ':'\n    case 25762:                     // 'instance' ':'\n    case 25763:                     // 'integrity' ':'\n    case 25764:                     // 'intersect' ':'\n    case 25765:                     // 'into' ':'\n    case 25766:                     // 'is' ':'\n    case 25767:                     // 'item' ':'\n    case 25768:                     // 'json' ':'\n    case 25770:                     // 'jsoniq' ':'\n    case 25773:                     // 'last' ':'\n    case 25774:                     // 'lax' ':'\n    case 25775:                     // 'le' ':'\n    case 25777:                     // 'let' ':'\n    case 25779:                     // 'loop' ':'\n    case 25781:                     // 'lt' ':'\n    case 25783:                     // 'mod' ':'\n    case 25784:                     // 'modify' ':'\n    case 25785:                     // 'module' ':'\n    case 25787:                     // 'namespace' ':'\n    case 25788:                     // 'namespace-node' ':'\n    case 25789:                     // 'ne' ':'\n    case 25794:                     // 'node' ':'\n    case 25795:                     // 'nodes' ':'\n    case 25798:                     // 'object' ':'\n    case 25802:                     // 'only' ':'\n    case 25803:                     // 'option' ':'\n    case 25804:                     // 'or' ':'\n    case 25805:                     // 'order' ':'\n    case 25806:                     // 'ordered' ':'\n    case 25807:                     // 'ordering' ':'\n    case 25810:                     // 'parent' ':'\n    case 25816:                     // 'preceding' ':'\n    case 25817:                     // 'preceding-sibling' ':'\n    case 25820:                     // 'processing-instruction' ':'\n    case 25822:                     // 'rename' ':'\n    case 25823:                     // 'replace' ':'\n    case 25824:                     // 'return' ':'\n    case 25825:                     // 'returning' ':'\n    case 25826:                     // 'revalidation' ':'\n    case 25828:                     // 'satisfies' ':'\n    case 25829:                     // 'schema' ':'\n    case 25830:                     // 'schema-attribute' ':'\n    case 25831:                     // 'schema-element' ':'\n    case 25832:                     // 'score' ':'\n    case 25833:                     // 'select' ':'\n    case 25834:                     // 'self' ':'\n    case 25839:                     // 'sliding' ':'\n    case 25840:                     // 'some' ':'\n    case 25841:                     // 'stable' ':'\n    case 25842:                     // 'start' ':'\n    case 25845:                     // 'strict' ':'\n    case 25848:                     // 'switch' ':'\n    case 25849:                     // 'text' ':'\n    case 25853:                     // 'to' ':'\n    case 25854:                     // 'treat' ':'\n    case 25856:                     // 'try' ':'\n    case 25857:                     // 'tumbling' ':'\n    case 25858:                     // 'type' ':'\n    case 25859:                     // 'typeswitch' ':'\n    case 25860:                     // 'union' ':'\n    case 25862:                     // 'unordered' ':'\n    case 25863:                     // 'updating' ':'\n    case 25866:                     // 'validate' ':'\n    case 25867:                     // 'value' ':'\n    case 25868:                     // 'variable' ':'\n    case 25869:                     // 'version' ':'\n    case 25872:                     // 'where' ':'\n    case 25873:                     // 'while' ':'\n    case 25876:                     // 'with' ':'\n      try_NCName();\n      break;\n    case -3:\n      break;\n    default:\n      try_ExprSingle();\n    }\n    lookahead1W(26);                // S^WS | '(:' | ':'\n    shiftT(50);                     // ':'\n    lookahead1W(267);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_ArrayConstructor()\n  {\n    eventHandler.startNonterminal(\"ArrayConstructor\", e0);\n    shift(69);                      // '['\n    lookahead1W(273);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    if (l1 != 70)                   // ']'\n    {\n      whitespace();\n      parse_Expr();\n    }\n    shift(70);                      // ']'\n    eventHandler.endNonterminal(\"ArrayConstructor\", e0);\n  }\n\n  function try_ArrayConstructor()\n  {\n    shiftT(69);                     // '['\n    lookahead1W(273);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    if (l1 != 70)                   // ']'\n    {\n      try_Expr();\n    }\n    shiftT(70);                     // ']'\n  }\n\n  function parse_BlockExpr()\n  {\n    eventHandler.startNonterminal(\"BlockExpr\", e0);\n    shift(281);                     // '{'\n    lookahead1W(281);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_StatementsAndOptionalExpr();\n    shift(287);                     // '}'\n    eventHandler.endNonterminal(\"BlockExpr\", e0);\n  }\n\n  function try_BlockExpr()\n  {\n    shiftT(281);                    // '{'\n    lookahead1W(281);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_StatementsAndOptionalExpr();\n    shiftT(287);                    // '}'\n  }\n\n  function parse_FunctionDecl()\n  {\n    eventHandler.startNonterminal(\"FunctionDecl\", e0);\n    shift(147);                     // 'function'\n    lookahead1W(246);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_EQName();\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(35);                      // '('\n    lookahead1W(98);                // S^WS | '$' | '(:' | ')'\n    if (l1 == 31)                   // '$'\n    {\n      whitespace();\n      parse_ParamList();\n    }\n    shift(38);                      // ')'\n    lookahead1W(158);               // S^WS | '(:' | 'as' | 'external' | '{'\n    if (l1 == 80)                   // 'as'\n    {\n      whitespace();\n      parse_ReturnType();\n    }\n    lookahead1W(122);               // S^WS | '(:' | 'external' | '{'\n    switch (l1)\n    {\n    case 281:                       // '{'\n      shift(281);                   // '{'\n      lookahead1W(281);             // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n      whitespace();\n      parse_StatementsAndOptionalExpr();\n      shift(287);                   // '}'\n      break;\n    default:\n      shift(134);                   // 'external'\n    }\n    eventHandler.endNonterminal(\"FunctionDecl\", e0);\n  }\n\n  function parse_ReturnType()\n  {\n    eventHandler.startNonterminal(\"ReturnType\", e0);\n    shift(80);                      // 'as'\n    lookahead1W(254);               // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_SequenceType();\n    eventHandler.endNonterminal(\"ReturnType\", e0);\n  }\n\n  function shift(t)\n  {\n    if (l1 == t)\n    {\n      whitespace();\n      eventHandler.terminal(JSONiqParser.TOKEN[l1], b1, e1 > size ? size : e1);\n      b0 = b1; e0 = e1; l1 = l2; if (l1 != 0) {\n      b1 = b2; e1 = e2; l2 = 0; }\n    }\n    else\n    {\n      error(b1, e1, 0, l1, t);\n    }\n  }\n\n  function shiftT(t)\n  {\n    if (l1 == t)\n    {\n      b0 = b1; e0 = e1; l1 = l2; if (l1 != 0) {\n      b1 = b2; e1 = e2; l2 = 0; }\n    }\n    else\n    {\n      error(b1, e1, 0, l1, t);\n    }\n  }\n\n  function skip(code)\n  {\n    var b0W = b0; var e0W = e0; var l1W = l1;\n    var b1W = b1; var e1W = e1;\n\n    l1 = code; b1 = begin; e1 = end;\n    l2 = 0;\n\n    try_Whitespace();\n\n    b0 = b0W; e0 = e0W; l1 = l1W; if (l1 != 0) {\n    b1 = b1W; e1 = e1W; }\n  }\n\n  function whitespace()\n  {\n    if (e0 != b1)\n    {\n      b0 = e0;\n      e0 = b1;\n      eventHandler.whitespace(b0, e0);\n    }\n  }\n\n  function matchW(set)\n  {\n    var code;\n    for (;;)\n    {\n      code = match(set);\n      if (code != 22)               // S^WS\n      {\n        if (code != 37)             // '(:'\n        {\n          break;\n        }\n        skip(code);\n      }\n    }\n    return code;\n  }\n\n  function lookahead1W(set)\n  {\n    if (l1 == 0)\n    {\n      l1 = matchW(set);\n      b1 = begin;\n      e1 = end;\n    }\n  }\n\n  function lookahead2W(set)\n  {\n    if (l2 == 0)\n    {\n      l2 = matchW(set);\n      b2 = begin;\n      e2 = end;\n    }\n    lk = (l2 << 9) | l1;\n  }\n\n  function lookahead1(set)\n  {\n    if (l1 == 0)\n    {\n      l1 = match(set);\n      b1 = begin;\n      e1 = end;\n    }\n  }\n\n  function lookahead2(set)\n  {\n    if (l2 == 0)\n    {\n      l2 = match(set);\n      b2 = begin;\n      e2 = end;\n    }\n    lk = (l2 << 9) | l1;\n  }\n\n  function error(b, e, s, l, t)\n  {\n    if (e > ex)\n    {\n      bx = b;\n      ex = e;\n      sx = s;\n      lx = l;\n      tx = t;\n    }\n    throw new self.ParseException(bx, ex, sx, lx, tx);\n  }\n\n  var lk, b0, e0;\n  var l1, b1, e1;\n  var l2, b2, e2;\n  var bx, ex, sx, lx, tx;\n  var eventHandler;\n  var memo;\n\n  function memoize(i, e, v)\n  {\n    memo[(e << 5) + i] = v;\n  }\n\n  function memoized(i, e)\n  {\n    var v = memo[(e << 5) + i];\n    return typeof v != \"undefined\" ? v : 0;\n  }\n\n  var input;\n  var size;\n  var begin;\n  var end;\n\n  function match(tokenSetId)\n  {\n    var nonbmp = false;\n    begin = end;\n    var current = end;\n    var result = JSONiqParser.INITIAL[tokenSetId];\n    var state = 0;\n\n    for (var code = result & 8191; code != 0; )\n    {\n      var charclass;\n      var c0 = current < size ? input.charCodeAt(current) : 0;\n      ++current;\n      if (c0 < 0x80)\n      {\n        charclass = JSONiqParser.MAP0[c0];\n      }\n      else if (c0 < 0xd800)\n      {\n        var c1 = c0 >> 4;\n        charclass = JSONiqParser.MAP1[(c0 & 15) + JSONiqParser.MAP1[(c1 & 31) + JSONiqParser.MAP1[c1 >> 5]]];\n      }\n      else\n      {\n        if (c0 < 0xdc00)\n        {\n          var c1 = current < size ? input.charCodeAt(current) : 0;\n          if (c1 >= 0xdc00 && c1 < 0xe000)\n          {\n            ++current;\n            c0 = ((c0 & 0x3ff) << 10) + (c1 & 0x3ff) + 0x10000;\n            nonbmp = true;\n          }\n        }\n        var lo = 0, hi = 5;\n        for (var m = 3; ; m = (hi + lo) >> 1)\n        {\n          if (JSONiqParser.MAP2[m] > c0) hi = m - 1;\n          else if (JSONiqParser.MAP2[6 + m] < c0) lo = m + 1;\n          else {charclass = JSONiqParser.MAP2[12 + m]; break;}\n          if (lo > hi) {charclass = 0; break;}\n        }\n      }\n\n      state = code;\n      var i0 = (charclass << 13) + code - 1;\n      code = JSONiqParser.TRANSITION[(i0 & 15) + JSONiqParser.TRANSITION[i0 >> 4]];\n\n      if (code > 8191)\n      {\n        result = code;\n        code &= 8191;\n        end = current;\n      }\n    }\n\n    result >>= 13;\n    if (result == 0)\n    {\n      end = current - 1;\n      var c1 = end < size ? input.charCodeAt(end) : 0;\n      if (c1 >= 0xdc00 && c1 < 0xe000) --end;\n      return error(begin, end, state, -1, -1);\n    }\n\n    if (nonbmp)\n    {\n      for (var i = result >> 9; i > 0; --i)\n      {\n        --end;\n        var c1 = end < size ? input.charCodeAt(end) : 0;\n        if (c1 >= 0xdc00 && c1 < 0xe000) --end;\n      }\n    }\n    else\n    {\n      end -= result >> 9;\n    }\n\n    return (result & 511) - 1;\n  }\n}\n\nJSONiqParser.getTokenSet = function(tokenSetId)\n{\n  var set = [];\n  var s = tokenSetId < 0 ? - tokenSetId : INITIAL[tokenSetId] & 8191;\n  for (var i = 0; i < 289; i += 32)\n  {\n    var j = i;\n    var i0 = (i >> 5) * 4317 + s - 1;\n    var i1 = i0 >> 2;\n    var i2 = i1 >> 2;\n    var f = JSONiqParser.EXPECTED[(i0 & 3) + JSONiqParser.EXPECTED[(i1 & 3) + JSONiqParser.EXPECTED[(i2 & 15) + JSONiqParser.EXPECTED[i2 >> 4]]]];\n    for ( ; f != 0; f >>>= 1, ++j)\n    {\n      if ((f & 1) != 0)\n      {\n        set.push(JSONiqParser.TOKEN[j]);\n      }\n    }\n  }\n  return set;\n};\n\nJSONiqParser.MAP0 =\n[ 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 26, 30, 30, 30, 30, 30, 31, 32, 33, 30, 30, 34, 30, 30, 35, 30, 30, 30, 36, 30, 30, 37, 38, 39, 40, 30, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 40, 40\n];\n\nJSONiqParser.MAP1 =\n[ 108, 124, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 156, 181, 181, 181, 181, 181, 214, 215, 213, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 247, 261, 277, 293, 309, 355, 371, 387, 423, 423, 423, 415, 339, 331, 339, 331, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 440, 440, 440, 440, 440, 440, 440, 324, 339, 339, 339, 339, 339, 339, 339, 339, 401, 423, 423, 424, 422, 423, 423, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 338, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 423, 71, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 26, 30, 30, 30, 30, 30, 31, 32, 33, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 40, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 34, 30, 30, 35, 30, 30, 30, 36, 30, 30, 37, 38, 39, 40, 30, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 30, 30, 40, 40, 40, 40, 40, 40, 40, 70, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70\n];\n\nJSONiqParser.MAP2 =\n[ 57344, 63744, 64976, 65008, 65536, 983040, 63743, 64975, 65007, 65533, 983039, 1114111, 40, 30, 40, 30, 30, 40\n];\n\nJSONiqParser.INITIAL =\n[ 1, 24578, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290\n];\n\nJSONiqParser.TRANSITION =\n[ 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 36864, 36899, 36883, 36883, 36883, 36903, 36883, 36883, 36883, 36883, 36883, 36926, 36919, 36883, 36883, 36879, 36883, 36883, 36942, 36991, 37318, 37318, 41289, 37087, 37318, 37318, 37010, 37318, 37318, 37318, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39335, 40192, 38527, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 37318, 37318, 37318, 37318, 48276, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 39727, 39739, 37318, 37318, 72403, 39755, 36991, 37318, 37318, 41289, 37087, 37318, 37318, 37010, 39794, 37318, 37318, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39813, 40192, 39835, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39854, 39870, 37318, 37318, 37318, 46325, 37318, 37318, 36994, 37318, 61657, 45847, 57964, 37318, 37318, 61650, 62405, 62409, 50496, 39889, 37318, 37318, 41289, 37087, 37318, 44009, 37010, 37318, 37318, 37318, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39335, 40192, 45833, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39908, 62747, 37318, 37318, 37318, 42026, 65655, 37318, 73568, 65651, 65646, 39935, 62736, 68791, 45102, 45088, 45095, 68779, 39950, 36991, 37318, 37318, 41289, 39994, 37318, 45426, 37010, 37318, 37318, 37318, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39335, 40192, 39370, 40016, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 40039, 69458, 41098, 41041, 37318, 46044, 44842, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 47580, 37318, 37318, 37318, 48276, 40073, 37318, 37015, 71422, 71423, 40094, 57964, 37318, 37318, 67783, 40130, 40134, 40150, 36991, 37318, 37318, 41289, 37087, 37318, 37318, 37010, 37318, 37318, 37318, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 40186, 40192, 38527, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 37318, 37318, 37318, 37318, 48276, 71599, 37318, 37318, 37318, 37318, 67919, 40209, 37318, 37318, 66772, 40222, 40225, 40241, 36991, 37318, 37318, 41289, 37087, 37318, 37318, 37010, 37318, 37318, 37318, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39335, 40192, 38527, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 37318, 37318, 37318, 37318, 48276, 37318, 37318, 37318, 37318, 37318, 71606, 73347, 37318, 37318, 37318, 37318, 37318, 40283, 40324, 37318, 37318, 41289, 37087, 37318, 37318, 37010, 37318, 37318, 37318, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39335, 40192, 38527, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 40344, 37116, 37202, 37162, 40378, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 40416, 40432, 37318, 37318, 37318, 48315, 37318, 37318, 37526, 37318, 62612, 40451, 57964, 37318, 37318, 62605, 65082, 65086, 40487, 40535, 37318, 37318, 41289, 37087, 37318, 37318, 40554, 37318, 37318, 37318, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39335, 40192, 38131, 40575, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 40598, 40656, 40697, 40697, 40697, 40663, 40736, 40697, 40698, 40727, 40642, 40679, 40626, 40693, 40745, 40613, 40752, 40714, 40768, 36991, 37318, 37318, 40817, 40815, 37318, 37318, 37010, 37318, 37318, 37318, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39335, 40192, 38527, 37031, 44584, 37054, 40804, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 43152, 37318, 37318, 37318, 48276, 40833, 37318, 37318, 73511, 37318, 67919, 57964, 40868, 40872, 43155, 43156, 43784, 40888, 36991, 37318, 37318, 41289, 40924, 37318, 37318, 37010, 37318, 37318, 37318, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39335, 40192, 38527, 37031, 44584, 37054, 40942, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 43775, 37318, 37318, 37318, 48276, 37318, 37318, 37318, 37318, 69945, 73273, 57964, 40977, 41007, 44794, 41023, 73756, 40991, 36991, 37318, 37318, 41289, 37087, 37318, 37318, 37010, 37318, 37318, 37318, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39335, 40192, 38527, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 41058, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 37318, 37318, 37318, 37318, 48276, 37318, 37318, 37318, 37318, 45645, 38564, 57964, 41115, 41135, 37318, 41119, 41135, 41149, 36991, 37318, 37318, 41289, 37087, 37318, 37318, 37010, 37318, 37318, 37318, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39335, 40192, 38527, 37031, 44584, 37054, 37076, 37318, 37318, 37301, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 62620, 37318, 37318, 37318, 48276, 62315, 37318, 37318, 42112, 62617, 51150, 68655, 68669, 68671, 37318, 37318, 74000, 41165, 36991, 37318, 37318, 41289, 37087, 37318, 37318, 37010, 37318, 37318, 37318, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39335, 40192, 38527, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 41215, 37318, 37318, 37318, 37318, 48276, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 41238, 41258, 37318, 41242, 41258, 41272, 36991, 37318, 37318, 41289, 37087, 37318, 37318, 37010, 37318, 37318, 37318, 37318, 37318, 44404, 72644, 50028, 41369, 65498, 47282, 62003, 69205, 37318, 62433, 37318, 68839, 45752, 41288, 37301, 44633, 37318, 37318, 37318, 37318, 73164, 72644, 41305, 72644, 72644, 41324, 38775, 41542, 41542, 58552, 65498, 52179, 65498, 65498, 52319, 41461, 41342, 41461, 41461, 60376, 37318, 37318, 37318, 37318, 37318, 37318, 57380, 44576, 38329, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 72644, 41363, 41542, 41542, 41542, 41542, 41542, 65493, 65498, 65498, 65498, 65498, 65498, 46825, 41461, 41461, 41461, 41461, 41461, 47041, 57802, 45001, 37318, 37318, 37318, 37318, 37318, 62575, 37318, 37318, 71516, 41385, 72644, 72644, 72644, 72645, 41405, 67865, 41542, 58857, 41542, 41542, 46917, 69302, 65498, 55881, 65498, 65498, 53308, 58621, 41461, 41722, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 64802, 37318, 37318, 72642, 48855, 72644, 72644, 72644, 38767, 41542, 41439, 41542, 41542, 41444, 65497, 64981, 65498, 65498, 65498, 59803, 41461, 41460, 41461, 41461, 47863, 54854, 37318, 37318, 69109, 41478, 37318, 60498, 72644, 72644, 70521, 58547, 41542, 41542, 60742, 46770, 65498, 65498, 73471, 59798, 41461, 41461, 70944, 47288, 64766, 37318, 37318, 37507, 37318, 71005, 72644, 60920, 59569, 41542, 41542, 72922, 65498, 65498, 48896, 41461, 41461, 46878, 37318, 60844, 41498, 41222, 67506, 72644, 41518, 41541, 58729, 41559, 65498, 46559, 41593, 41462, 56939, 50451, 37318, 66947, 41614, 41423, 73664, 58829, 59801, 41638, 49498, 41664, 52412, 41686, 41702, 41738, 63218, 38594, 66255, 64873, 73961, 46828, 73161, 59759, 73663, 59797, 47605, 39543, 41802, 41825, 41848, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 37318, 37318, 37318, 37318, 48276, 37318, 37318, 37318, 37318, 37318, 45787, 57964, 41925, 72170, 37318, 38278, 38288, 41945, 36991, 37318, 37318, 41289, 37087, 37318, 37318, 41981, 37318, 37318, 37318, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 69382, 40192, 38527, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 42002, 37318, 37318, 37318, 45026, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 42022, 71555, 37318, 43019, 43028, 71570, 36991, 37318, 37318, 41289, 37087, 37318, 37318, 37010, 42042, 37318, 73045, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39335, 40192, 45833, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 42061, 37318, 37318, 37318, 48276, 37318, 37318, 37318, 37318, 37318, 50713, 57964, 37318, 37318, 37318, 38993, 38997, 42078, 42128, 37318, 37318, 41289, 37087, 37318, 37318, 42147, 37318, 37318, 37318, 37318, 37318, 44404, 72644, 50028, 41369, 65498, 42168, 62003, 69205, 37318, 37318, 37318, 68839, 37318, 37318, 39275, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 41324, 41542, 41542, 41542, 58552, 65498, 65498, 65498, 65498, 57854, 41461, 41461, 41461, 41461, 64567, 42190, 37318, 37318, 37318, 37318, 37318, 42212, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 72644, 41363, 41542, 41542, 41542, 41542, 41542, 65493, 65498, 65498, 65498, 65498, 65498, 46825, 41461, 41461, 41461, 41461, 41461, 67436, 42249, 37318, 37318, 37318, 37318, 37318, 44403, 37318, 37318, 37318, 72643, 72644, 72644, 72644, 72644, 72187, 38772, 41542, 41542, 41542, 41542, 41542, 72266, 65498, 65498, 65498, 65498, 65498, 59800, 41461, 41461, 41461, 41461, 41461, 47863, 51497, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72642, 72644, 72644, 72644, 72644, 42270, 41542, 41542, 41542, 41542, 49331, 65497, 65498, 65498, 65498, 65498, 59803, 41461, 41461, 41461, 41461, 47863, 47501, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 42291, 41542, 41542, 41542, 59595, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 63809, 37318, 37318, 37318, 49242, 42389, 37318, 37318, 42312, 41767, 44524, 59934, 42356, 42367, 45136, 42383, 44513, 42405, 42445, 37318, 37318, 40926, 42420, 37318, 37318, 37010, 37318, 37318, 37318, 37318, 37318, 65657, 40192, 44142, 43528, 42807, 74542, 43714, 44329, 37031, 44584, 37054, 42466, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 42495, 44053, 42520, 44234, 42536, 42631, 42566, 42582, 42617, 43323, 74548, 42732, 42652, 43181, 43457, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 74695, 44148, 43301, 42504, 44146, 43812, 43314, 42636, 43906, 44107, 42807, 42594, 42699, 42706, 42722, 43750, 42901, 42677, 43141, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 42748, 42962, 43618, 43603, 43820, 43354, 42764, 44271, 43892, 42788, 42804, 42826, 43918, 42855, 43210, 42882, 42898, 42920, 44134, 44337, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 42949, 44040, 42992, 42978, 43271, 43008, 43044, 42839, 43084, 44099, 43110, 43126, 43172, 43197, 43740, 43442, 43226, 43242, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 43259, 44205, 43287, 43339, 74705, 42601, 43379, 43395, 43411, 42683, 43427, 43493, 43509, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 43544, 43363, 43588, 43648, 42772, 43664, 43059, 43680, 43709, 43730, 43766, 38739, 38791, 38841, 38876, 38942, 38892, 43800, 43836, 43632, 43878, 43941, 43957, 42665, 43973, 43989, 39013, 39048, 39078, 44025, 44069, 44085, 43094, 44123, 43693, 44164, 39249, 55484, 44195, 43559, 43068, 43925, 39327, 39819, 44240, 42810, 42904, 39356, 44221, 43849, 44282, 42866, 45051, 43520, 43862, 42933, 39494, 44256, 44298, 44314, 39590, 43572, 44353, 42550, 44369, 44420, 44431, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 37091, 37318, 37318, 37318, 48276, 39140, 44447, 37318, 67184, 67184, 50155, 62190, 71955, 71957, 37318, 37089, 71946, 44465, 36991, 37318, 37318, 41289, 37087, 37318, 37318, 37010, 37318, 37318, 37318, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39335, 40192, 38527, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 44502, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38381, 36956, 50180, 37398, 37414, 37436, 50351, 44540, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 44565, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 44600, 38038, 38061, 37792, 39434, 44649, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 44665, 37459, 38432, 38451, 37229, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 37318, 37318, 37318, 37318, 48276, 37318, 37318, 37318, 37318, 37318, 37318, 73156, 44700, 44701, 37318, 74225, 74229, 44717, 36991, 37318, 37318, 41289, 37087, 37318, 37318, 37010, 37318, 37318, 46650, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39335, 40192, 44756, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 44775, 67647, 37318, 37318, 37318, 48276, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 44810, 44811, 37318, 37318, 74488, 44827, 44876, 37318, 37318, 41289, 37087, 37318, 37318, 37010, 37318, 37318, 44898, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39335, 40192, 44921, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 44940, 44949, 37318, 37318, 37318, 45580, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 44969, 44970, 37318, 37318, 68795, 44986, 45022, 37318, 37318, 41289, 37087, 37318, 37318, 37010, 37318, 37318, 72142, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39335, 40192, 38201, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 45042, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45074, 37318, 37318, 37318, 37318, 48276, 59955, 37318, 37318, 37318, 59954, 73317, 57964, 37318, 45118, 37318, 37318, 45127, 45152, 36991, 37318, 37318, 41289, 37087, 37318, 37318, 37010, 45201, 37318, 37318, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 45220, 40192, 45247, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 37318, 37318, 37318, 37318, 48276, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 37318, 37318, 37318, 46105, 37318, 45266, 36991, 37318, 37318, 41289, 37087, 37318, 37318, 37010, 37318, 37318, 37318, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39335, 40192, 38527, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 37318, 44953, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 37318, 37318, 45323, 45350, 63443, 47000, 65689, 37318, 37318, 41289, 37087, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 44404, 72644, 50028, 41369, 65498, 47282, 62003, 72217, 37318, 37318, 37318, 68839, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 45386, 41542, 41542, 41542, 52709, 65498, 65498, 65498, 65498, 57854, 41461, 41461, 41461, 41461, 64567, 41960, 37318, 37318, 37318, 37318, 37318, 44399, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 72644, 41363, 41542, 41542, 41542, 41542, 41542, 65493, 65498, 65498, 65498, 65498, 65498, 46825, 41461, 41461, 41461, 41461, 41461, 63696, 45404, 37318, 37318, 37318, 37318, 37318, 44403, 37318, 37318, 37318, 72643, 72644, 72644, 72644, 72644, 72645, 38772, 41542, 41542, 41542, 41542, 41542, 45363, 65498, 65498, 65498, 65498, 65498, 59800, 41461, 41461, 41461, 41461, 41461, 47863, 51497, 37318, 37318, 37318, 37318, 47785, 37318, 37318, 72642, 72644, 72644, 72644, 72644, 61913, 41542, 41542, 41542, 41542, 48876, 65497, 65498, 65498, 65498, 65498, 59803, 41461, 41461, 41461, 41461, 47863, 47501, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 42291, 41542, 41542, 41542, 59595, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 45425, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 37318, 44953, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 37318, 37318, 45323, 45350, 63443, 47000, 65689, 37318, 37318, 41289, 37087, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 44404, 72644, 50028, 41369, 65498, 47282, 62003, 72217, 37318, 37318, 37318, 68839, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 45386, 41542, 41542, 41542, 52709, 65498, 65498, 65498, 65498, 57854, 41461, 41461, 41461, 41461, 64567, 41960, 37318, 37318, 37318, 37318, 37318, 44399, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 72644, 41363, 41542, 41542, 41542, 41542, 41542, 65493, 65498, 65498, 65498, 65498, 65498, 46825, 41461, 41461, 41461, 41461, 41461, 63696, 45404, 37318, 37318, 37318, 37318, 37318, 44403, 37318, 37318, 37318, 72643, 72644, 72644, 72644, 72644, 72645, 38772, 41542, 41542, 41542, 41542, 41542, 45363, 65498, 65498, 65498, 65498, 65498, 59800, 41461, 41461, 41461, 41461, 41461, 47863, 51497, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72642, 72644, 72644, 72644, 72644, 61913, 41542, 41542, 41542, 41542, 48876, 65497, 65498, 65498, 65498, 65498, 59803, 41461, 41461, 41461, 41461, 47863, 47501, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 42291, 41542, 41542, 41542, 59595, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 37318, 44953, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 37318, 37318, 45323, 45350, 63443, 47000, 65689, 37318, 37318, 41289, 37087, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 44404, 72644, 50028, 41369, 65498, 47282, 62003, 72217, 37318, 37318, 37318, 68839, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 45386, 41542, 41542, 41542, 52709, 65498, 65498, 65498, 65498, 57854, 41461, 41461, 41461, 41461, 64567, 41960, 37318, 37318, 37318, 37318, 37318, 44399, 68819, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 72644, 41363, 41542, 41542, 41542, 41542, 41542, 65493, 65498, 65498, 65498, 65498, 65498, 46825, 41461, 41461, 41461, 41461, 41461, 63696, 45404, 37318, 37318, 37318, 37318, 37318, 44403, 37318, 37318, 37318, 72643, 72644, 72644, 72644, 72644, 72645, 38772, 41542, 41542, 41542, 41542, 41542, 45363, 65498, 65498, 65498, 65498, 65498, 59800, 41461, 41461, 41461, 41461, 41461, 47863, 51497, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72642, 72644, 72644, 72644, 72644, 61913, 41542, 41542, 41542, 41542, 48876, 65497, 65498, 65498, 65498, 65498, 59803, 41461, 41461, 41461, 41461, 47863, 47501, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 42291, 41542, 41542, 41542, 59595, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 37318, 44953, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 37318, 37318, 45323, 45350, 63443, 47000, 65689, 37318, 37318, 41289, 37087, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 44404, 72644, 50028, 41369, 65498, 47282, 62003, 72217, 37318, 37318, 37318, 68839, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 45386, 41542, 41542, 41542, 52709, 65498, 65498, 65498, 65498, 57854, 41461, 41461, 41461, 41461, 64567, 41960, 37318, 37318, 37318, 37318, 37318, 44399, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 72644, 41363, 41542, 41542, 41542, 41542, 41542, 65493, 65498, 65498, 65498, 65498, 65498, 46825, 41461, 41461, 41461, 41461, 41461, 63696, 45404, 37318, 37318, 37318, 37318, 37318, 45442, 37318, 37318, 37318, 72643, 72644, 72644, 72644, 72644, 72645, 38772, 41542, 41542, 41542, 41542, 41542, 45363, 65498, 65498, 65498, 65498, 65498, 59800, 41461, 41461, 41461, 41461, 41461, 47863, 51497, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72642, 72644, 72644, 72644, 72644, 61913, 41542, 41542, 41542, 41542, 48876, 65497, 65498, 65498, 65498, 65498, 59803, 41461, 41461, 41461, 41461, 47863, 47501, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 42291, 41542, 41542, 41542, 59595, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 37318, 44953, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 37318, 37318, 45323, 45350, 63443, 47000, 65689, 37318, 37318, 41289, 37087, 37318, 37318, 50781, 37318, 37318, 37318, 37318, 37318, 44404, 72644, 50028, 41369, 65498, 47282, 62003, 72217, 37318, 37318, 37318, 68839, 37318, 37318, 53518, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 45386, 41542, 41542, 41542, 52709, 65498, 65498, 65498, 65498, 57854, 41461, 41461, 41461, 41461, 64567, 41960, 37318, 37318, 37318, 37318, 37318, 44399, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 72644, 41363, 41542, 41542, 41542, 41542, 41542, 65493, 65498, 65498, 65498, 65498, 65498, 46825, 41461, 41461, 41461, 41461, 41461, 63696, 45404, 37318, 37318, 37318, 37318, 37318, 44403, 37318, 37318, 37318, 72643, 72644, 72644, 72644, 72644, 72645, 38772, 41542, 41542, 41542, 41542, 41542, 45363, 65498, 65498, 65498, 65498, 65498, 59800, 41461, 41461, 41461, 41461, 41461, 47863, 51497, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72642, 72644, 72644, 72644, 72644, 61913, 41542, 41542, 41542, 41542, 48876, 65497, 65498, 65498, 65498, 65498, 59803, 41461, 41461, 41461, 41461, 47863, 47501, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 42291, 41542, 41542, 41542, 59595, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 37318, 44953, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 37318, 37318, 45323, 45350, 63443, 47000, 65689, 37318, 37318, 41289, 37087, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 44404, 72644, 50028, 41369, 65498, 47282, 62003, 72217, 37318, 37318, 37318, 68839, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 45386, 41542, 41542, 41542, 52709, 65498, 65498, 65498, 65498, 57854, 41461, 41461, 41461, 41461, 60376, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 72644, 41363, 41542, 41542, 41542, 41542, 41542, 65493, 65498, 65498, 65498, 65498, 65498, 46825, 41461, 41461, 41461, 41461, 41461, 47041, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72643, 72644, 72644, 72644, 72644, 72645, 38772, 41542, 41542, 41542, 41542, 41542, 45363, 65498, 65498, 65498, 65498, 65498, 59800, 41461, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72642, 72644, 72644, 72644, 72644, 38767, 41542, 41542, 41542, 41542, 41444, 65497, 65498, 65498, 65498, 65498, 59803, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 58547, 41542, 41542, 41542, 46770, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 37318, 44953, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 37318, 37318, 45323, 45350, 63443, 47000, 65689, 37318, 37318, 41289, 37087, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 44404, 72644, 50028, 41369, 65498, 47282, 62003, 65804, 37318, 37318, 37318, 68839, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 45386, 41542, 41542, 41542, 52709, 65498, 65498, 65498, 65498, 57854, 41461, 41461, 41461, 41461, 60376, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 72644, 41363, 41542, 41542, 41542, 41542, 41542, 65493, 65498, 65498, 65498, 65498, 65498, 46825, 41461, 41461, 41461, 41461, 41461, 47041, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72643, 72644, 72644, 72644, 72644, 72645, 38772, 41542, 41542, 41542, 41542, 41542, 45363, 65498, 65498, 65498, 65498, 65498, 59800, 41461, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72642, 72644, 72644, 72644, 72644, 38767, 41542, 41542, 41542, 41542, 41444, 65497, 65498, 65498, 65498, 65498, 59803, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 58547, 41542, 41542, 41542, 46770, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 37318, 44953, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 37318, 37318, 45323, 45350, 63443, 48653, 65689, 37318, 37318, 41289, 37087, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 44404, 72644, 50028, 41369, 65498, 47282, 62003, 72217, 37318, 37318, 37318, 68839, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 45386, 41542, 41542, 41542, 52709, 65498, 65498, 65498, 65498, 57854, 41461, 41461, 41461, 41461, 60376, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 72644, 41363, 41542, 41542, 41542, 41542, 41542, 65493, 65498, 65498, 65498, 65498, 65498, 46825, 41461, 41461, 41461, 41461, 41461, 47041, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72643, 72644, 72644, 72644, 72644, 72645, 38772, 41542, 41542, 41542, 41542, 41542, 45363, 65498, 65498, 65498, 65498, 65498, 59800, 41461, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72642, 72644, 72644, 72644, 72644, 38767, 41542, 41542, 41542, 41542, 41444, 65497, 65498, 65498, 65498, 65498, 59803, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 58547, 41542, 41542, 41542, 46770, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 37318, 44953, 37318, 37318, 37318, 37318, 37318, 67919, 60153, 37318, 37318, 45323, 45350, 63443, 47000, 65689, 37318, 37318, 41289, 37087, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 44404, 72644, 50028, 41369, 65498, 47282, 62003, 72217, 37318, 37318, 37318, 68839, 37318, 37318, 37318, 37318, 45477, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 45386, 41542, 41542, 41542, 52709, 65498, 65498, 65498, 65498, 57854, 41461, 41461, 41461, 41461, 60376, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 72644, 41363, 41542, 41542, 41542, 41542, 41542, 65493, 65498, 65498, 65498, 65498, 65498, 46825, 41461, 41461, 41461, 41461, 41461, 47041, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72643, 72644, 72644, 72644, 72644, 72645, 38772, 41542, 41542, 41542, 41542, 41542, 45363, 65498, 65498, 65498, 65498, 65498, 59800, 41461, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72642, 72644, 72644, 72644, 72644, 38767, 41542, 41542, 41542, 41542, 41444, 65497, 65498, 65498, 65498, 65498, 59803, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 58547, 41542, 41542, 41542, 46770, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 37318, 44953, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 37318, 37318, 45496, 45525, 45509, 45539, 65689, 37318, 37318, 41289, 37087, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 44404, 72644, 50028, 41369, 65498, 47282, 62003, 72217, 37318, 37318, 37318, 68839, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 45386, 41542, 41542, 41542, 52709, 65498, 65498, 65498, 65498, 57854, 41461, 41461, 41461, 41461, 60376, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 72644, 41363, 41542, 41542, 41542, 41542, 41542, 65493, 65498, 65498, 65498, 65498, 65498, 46825, 41461, 41461, 41461, 41461, 41461, 47041, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72643, 72644, 72644, 72644, 72644, 72645, 38772, 41542, 41542, 41542, 41542, 41542, 45363, 65498, 65498, 65498, 65498, 65498, 59800, 41461, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72642, 72644, 72644, 72644, 72644, 38767, 41542, 41542, 41542, 41542, 41444, 65497, 65498, 65498, 65498, 65498, 59803, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 58547, 41542, 41542, 41542, 46770, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 37318, 44953, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 37318, 37318, 45323, 45350, 63443, 47000, 65689, 37318, 37318, 41289, 37087, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 44404, 72644, 50028, 41369, 65498, 47282, 62003, 72217, 37318, 37318, 37318, 68839, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 45386, 41542, 41542, 41542, 52709, 65498, 65498, 65498, 65498, 57854, 41461, 41461, 41461, 41461, 60376, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 72644, 41363, 41542, 41542, 41542, 41542, 41542, 65493, 65498, 65498, 65498, 65498, 65498, 46825, 41461, 41461, 41461, 41461, 41461, 47041, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72643, 72644, 72644, 72644, 72644, 72645, 38772, 41542, 41542, 41542, 41542, 41542, 45363, 65498, 65498, 65498, 65498, 65498, 59800, 41461, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72642, 72644, 72644, 72644, 72644, 38767, 41542, 41542, 41542, 41542, 41444, 65497, 65498, 65498, 65498, 65498, 59803, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 64785, 37318, 37318, 60498, 72644, 72644, 72644, 58547, 41542, 41542, 41542, 46770, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45555, 37318, 37318, 37318, 37318, 44953, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 37318, 37318, 45323, 45350, 63443, 47000, 65689, 37318, 37318, 41289, 37087, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 44404, 72644, 50028, 41369, 65498, 47282, 62003, 72217, 37318, 37318, 37318, 68839, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 45386, 41542, 41542, 41542, 52709, 65498, 65498, 65498, 65498, 57854, 41461, 41461, 41461, 41461, 60376, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 72644, 41363, 41542, 41542, 41542, 41542, 41542, 65493, 65498, 65498, 65498, 65498, 65498, 46825, 41461, 41461, 41461, 41461, 41461, 47041, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72643, 72644, 72644, 72644, 72644, 72645, 38772, 41542, 41542, 41542, 41542, 41542, 45363, 65498, 65498, 65498, 65498, 65498, 59800, 41461, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72642, 72644, 72644, 72644, 72644, 38767, 41542, 41542, 41542, 41542, 41444, 65497, 65498, 65498, 65498, 65498, 59803, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 58547, 41542, 41542, 41542, 46770, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 38529, 37318, 37318, 37318, 48276, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 45576, 74434, 37318, 74579, 74583, 74448, 36991, 37318, 37318, 41289, 37087, 37318, 37318, 37010, 37318, 37318, 37318, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39335, 40192, 38527, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 68588, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 45596, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 37318, 37318, 37318, 37318, 48276, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 37318, 37318, 37318, 37318, 37318, 45625, 45661, 37318, 37318, 41289, 37087, 37318, 37318, 37010, 37318, 37318, 37318, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39335, 40192, 45833, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 37318, 45715, 37318, 37318, 48276, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 45680, 45684, 37318, 37318, 45700, 45732, 36991, 37318, 37318, 41289, 37087, 37318, 37318, 37010, 37318, 37318, 37318, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39335, 40192, 38527, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 45768, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 45803, 55484, 39265, 39291, 55476, 39311, 45819, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 37318, 37318, 37318, 37318, 48276, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 37318, 37318, 37318, 37318, 37318, 45266, 36991, 37318, 37318, 41289, 37087, 37318, 37318, 37010, 37318, 37318, 37318, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39335, 40192, 38527, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 45863, 37318, 37318, 44953, 53155, 45882, 37318, 52352, 45886, 39423, 67164, 45902, 45916, 45932, 45961, 45945, 45975, 45991, 37318, 45455, 41670, 46020, 50786, 46004, 46033, 45185, 46061, 46096, 44613, 41965, 46121, 46173, 46189, 46205, 46221, 46237, 46288, 65632, 46304, 37318, 37318, 68839, 40298, 50758, 37318, 41033, 53889, 69149, 37318, 46321, 73164, 72644, 72644, 72644, 46341, 45386, 41542, 41542, 59697, 52709, 65498, 65498, 65498, 64013, 57854, 41461, 41461, 41461, 53427, 64567, 41960, 63943, 65692, 37318, 55390, 46361, 44399, 46380, 37318, 58658, 46936, 46397, 46417, 72644, 72644, 59240, 58293, 46453, 46492, 41542, 41542, 52156, 55833, 61582, 46520, 65498, 65498, 64241, 46547, 52866, 68024, 41461, 41461, 68015, 46594, 47566, 46621, 37318, 37318, 46672, 37318, 46264, 44403, 37318, 40057, 46707, 46725, 63333, 41308, 72644, 46741, 63340, 42275, 46760, 41542, 46793, 66052, 61720, 45363, 46811, 65498, 49417, 68460, 65498, 46845, 46864, 41461, 51002, 52264, 41461, 46904, 52111, 46933, 46952, 37318, 46684, 52530, 67711, 37318, 59166, 64847, 72644, 54549, 51902, 61913, 46986, 41542, 41542, 73854, 71759, 72272, 41570, 65498, 54158, 68314, 46848, 58449, 41461, 41461, 47016, 47035, 51372, 47057, 47076, 37318, 47124, 37318, 47140, 47156, 71524, 72644, 42291, 47208, 67563, 41542, 59595, 47244, 47267, 65498, 59798, 47304, 47328, 41461, 53433, 37318, 47344, 37318, 61381, 37318, 72644, 47362, 47380, 41542, 47407, 47424, 65498, 47447, 64139, 63673, 47467, 64041, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 41347, 39062, 47486, 47520, 47551, 47602, 47622, 61702, 70577, 48688, 47605, 47638, 50030, 47449, 46829, 57656, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 47659, 37318, 37318, 44953, 37318, 37318, 37318, 37318, 37318, 67919, 47681, 47697, 47709, 47725, 47754, 47738, 47770, 65689, 37318, 37318, 41289, 37087, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 44404, 67827, 50028, 47806, 47251, 47282, 47858, 50482, 37318, 37318, 37318, 68839, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 45386, 41542, 41542, 41542, 52709, 65498, 65498, 65498, 65498, 57854, 41461, 41461, 41461, 41461, 64567, 41960, 37318, 37318, 37318, 37318, 73633, 44399, 56082, 37318, 56083, 37318, 73164, 72644, 72644, 72644, 72644, 47879, 41363, 41542, 41542, 41542, 41542, 47922, 65493, 65498, 65498, 65498, 65498, 47955, 46825, 41461, 41461, 41461, 67629, 66428, 63696, 45404, 37318, 37318, 37318, 37318, 37318, 44403, 37318, 37318, 37318, 72643, 72644, 72644, 72644, 72644, 72645, 38772, 41542, 41542, 41542, 41542, 41542, 45363, 65498, 65498, 65498, 65498, 65498, 59800, 41461, 41461, 41461, 41461, 41461, 47863, 51497, 37318, 58926, 37318, 37318, 64306, 57609, 37318, 65431, 72644, 72644, 72644, 56125, 63073, 47979, 41542, 41542, 41542, 70807, 58352, 65498, 65498, 65498, 65498, 47999, 41461, 41461, 41461, 41461, 48015, 47501, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 42291, 41542, 41542, 41542, 59595, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 65375, 48037, 48062, 48088, 48113, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 49548, 37318, 37318, 44953, 37318, 41780, 37318, 41482, 37318, 54642, 48139, 48155, 48170, 48186, 48215, 48199, 48231, 65689, 37318, 37318, 48273, 48292, 37318, 48311, 37318, 51503, 37318, 37318, 37318, 48331, 46709, 48623, 50028, 58342, 50938, 47282, 52495, 55465, 37318, 48349, 37318, 68839, 48369, 47665, 37318, 51866, 48388, 48408, 48427, 73007, 67026, 70205, 72644, 72644, 72644, 48444, 48468, 41542, 41542, 52709, 48501, 48532, 65498, 65498, 51441, 56912, 41461, 41461, 41461, 64567, 71585, 37318, 37318, 65402, 37318, 56580, 44399, 46364, 37873, 48553, 37318, 73164, 48570, 72644, 48622, 56986, 72644, 41363, 48639, 50032, 41542, 55261, 41542, 65493, 48669, 57135, 65498, 73731, 65498, 46825, 48704, 41598, 41461, 48739, 41461, 63696, 45404, 37318, 37318, 39025, 37318, 62106, 44403, 37318, 37318, 37318, 72643, 72644, 72644, 60958, 57260, 72645, 38772, 41542, 41542, 54046, 68350, 48760, 45363, 65498, 65498, 65498, 48780, 52828, 59800, 41461, 41461, 41461, 48796, 66903, 47863, 51534, 37318, 37318, 37318, 64199, 37318, 64441, 37318, 72642, 72644, 72644, 64854, 72644, 61913, 41542, 41542, 41542, 48812, 48876, 65497, 65498, 65498, 71839, 65498, 59803, 41461, 41461, 47470, 41461, 47863, 47501, 37318, 65142, 37318, 37318, 38723, 48831, 72644, 48851, 72644, 42291, 41542, 48871, 41542, 59595, 65498, 70398, 65498, 59798, 41461, 61249, 41461, 42174, 72114, 37318, 37318, 53513, 66795, 54283, 70249, 60920, 63484, 67969, 41542, 58586, 58373, 65498, 49897, 57220, 41461, 56936, 37318, 37318, 67331, 73163, 72644, 72800, 50031, 41542, 52475, 65498, 65498, 48892, 41461, 58211, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 47019, 45307, 48912, 48959, 48989, 49019, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 70340, 49053, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 49089, 37318, 44953, 37318, 48599, 37585, 39665, 37318, 67919, 49107, 49123, 49137, 49153, 49182, 49166, 49196, 65689, 37318, 37318, 41289, 37087, 37318, 37318, 37318, 37318, 37318, 48353, 37318, 48351, 60095, 51266, 41622, 41369, 62908, 47535, 62003, 72217, 37318, 62994, 49212, 68839, 37318, 49238, 37318, 49258, 37318, 51050, 39778, 49276, 57933, 60709, 68980, 49292, 71214, 49326, 70571, 70834, 49347, 57459, 49369, 49386, 49404, 49439, 49457, 61552, 61800, 49485, 58425, 64567, 41960, 37318, 37318, 68084, 37318, 56022, 44399, 37318, 37318, 37318, 70710, 73164, 72644, 72644, 72644, 72644, 49520, 41363, 41542, 41542, 41542, 52429, 41542, 65493, 65498, 65498, 65498, 59621, 65498, 46825, 41461, 41461, 41461, 65942, 41461, 71902, 49537, 37318, 37318, 48372, 63307, 37318, 44403, 37318, 37318, 38213, 70690, 72446, 72644, 72644, 72644, 64634, 56631, 49564, 49582, 41542, 41542, 56653, 45363, 49600, 48682, 65498, 65498, 64927, 49622, 49640, 70938, 41461, 41461, 62085, 49662, 51497, 37318, 37318, 37318, 37318, 37318, 49684, 37318, 68617, 72644, 72644, 69970, 72644, 65479, 41542, 41542, 41326, 41542, 48876, 49710, 65498, 65498, 47842, 65498, 59286, 41461, 41461, 58267, 41461, 47863, 47501, 37918, 62752, 37318, 37318, 49733, 60498, 55203, 65029, 49752, 42291, 67741, 65203, 74026, 59595, 66024, 65498, 49773, 59798, 49646, 41461, 49825, 47288, 37318, 51997, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 49852, 37318, 73163, 72644, 60539, 50031, 41542, 72428, 65498, 65498, 49872, 41461, 70461, 56939, 61615, 37318, 72643, 60923, 41542, 57845, 65498, 49892, 41461, 49913, 72946, 72644, 50030, 54383, 59799, 54339, 40392, 49935, 49960, 49980, 50002, 57326, 50022, 50048, 50069, 50089, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 50115, 37318, 44953, 44449, 50137, 37318, 37060, 50171, 54108, 64429, 50196, 50210, 50226, 50255, 50239, 50269, 65689, 44626, 50285, 50301, 50316, 50332, 50367, 39233, 53108, 50384, 61398, 55344, 50419, 50467, 50512, 50528, 50544, 50594, 50610, 50651, 50667, 73014, 50694, 49260, 50729, 62653, 50756, 50774, 72085, 37318, 37318, 49073, 37318, 73164, 50802, 70730, 47643, 67373, 50837, 50866, 47931, 48477, 50890, 64147, 50934, 50954, 50974, 61240, 51024, 54206, 54678, 60300, 51066, 42093, 59527, 51082, 54503, 44179, 51132, 51166, 69514, 50121, 44486, 44480, 51182, 51198, 51247, 51290, 51306, 51322, 51357, 51407, 51457, 51482, 51519, 51581, 60231, 51607, 51635, 51659, 51675, 51432, 54188, 73942, 51691, 51713, 51750, 51800, 41753, 51824, 51840, 37318, 45167, 74354, 51864, 51882, 51918, 51962, 51982, 72643, 52018, 52052, 68101, 52072, 70228, 38772, 52096, 72897, 41542, 52136, 57279, 52172, 66566, 52195, 65498, 64541, 65498, 52222, 56902, 52245, 41461, 67612, 41461, 52280, 51497, 37891, 64079, 46636, 37318, 52344, 55168, 73701, 70986, 47906, 72644, 52368, 52401, 61913, 52428, 52445, 53191, 52464, 52511, 46777, 66351, 65498, 52546, 52580, 55946, 51008, 41461, 52615, 49469, 47863, 47501, 37318, 39657, 52645, 37318, 58484, 60498, 52664, 60195, 52685, 42291, 67536, 73887, 52704, 59595, 49809, 69760, 70602, 59798, 46578, 54457, 71795, 47288, 37318, 68581, 52725, 60872, 52759, 71031, 52775, 65989, 69245, 52802, 72675, 52206, 52852, 55908, 48097, 54237, 46605, 52882, 52918, 52936, 39919, 39478, 52952, 52973, 52992, 65449, 53038, 56792, 66087, 71786, 53088, 56765, 56939, 40362, 53104, 72643, 69978, 41542, 52310, 65498, 53124, 53817, 55637, 53146, 55211, 53171, 53289, 59799, 53207, 55668, 73239, 68122, 73294, 50578, 53242, 53264, 53284, 53305, 53324, 42326, 53340, 53356, 53372, 60496, 73658, 47451, 66435, 53400, 53449, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 51938, 37318, 44953, 62203, 56053, 37318, 51929, 37318, 53498, 53534, 53550, 53564, 53580, 53609, 53593, 53623, 65689, 37318, 68909, 41289, 37087, 37318, 37318, 37318, 37318, 61388, 37318, 61393, 61388, 52002, 53639, 47391, 58863, 63536, 59869, 62003, 50482, 37318, 53663, 37318, 68839, 53663, 37318, 37318, 37318, 69142, 53682, 45250, 37318, 55674, 71208, 72644, 72644, 72644, 53704, 53738, 41542, 41542, 52709, 48072, 65498, 65498, 65498, 57854, 53755, 41461, 41461, 41461, 64567, 41960, 37318, 37318, 37318, 37318, 37318, 44399, 37318, 37318, 37318, 53779, 73164, 72644, 72644, 72644, 63735, 72644, 41363, 41542, 41542, 41542, 60760, 41542, 65493, 65498, 65498, 65498, 61277, 65498, 46825, 41461, 41461, 41461, 48744, 41461, 63696, 45404, 37318, 37318, 37318, 37318, 37318, 44403, 37318, 45747, 37318, 72643, 72644, 72644, 50815, 72644, 72645, 38772, 41542, 41542, 71247, 41542, 41542, 45363, 65498, 65498, 48537, 65498, 65498, 59800, 41461, 41461, 67762, 41461, 41461, 47863, 51497, 37318, 37318, 37318, 37318, 37318, 67308, 37318, 72642, 72644, 72644, 56359, 72644, 61913, 41542, 41542, 41542, 70112, 48876, 65497, 65498, 65498, 66735, 65498, 59803, 41461, 41461, 41461, 53797, 47863, 47501, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 42291, 41542, 41542, 41542, 59595, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 54260, 37318, 37318, 37318, 73163, 67467, 72644, 48046, 41542, 73662, 48935, 65498, 59802, 53815, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 41851, 61054, 66378, 62339, 68189, 53833, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 37318, 44953, 37318, 39797, 37318, 37318, 37318, 67919, 53869, 53905, 53909, 53925, 53954, 53938, 53968, 65689, 37318, 37318, 41289, 37087, 37318, 45716, 37318, 37318, 37318, 37318, 37318, 37318, 44404, 72644, 50028, 41369, 65498, 47282, 62003, 46136, 46156, 37318, 37318, 68839, 37318, 37318, 37318, 37318, 40903, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 45386, 41542, 41542, 41542, 52709, 65498, 65498, 65498, 65498, 57854, 41461, 41461, 41461, 41461, 60376, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 36975, 37318, 64085, 73164, 72644, 72644, 72644, 72644, 72644, 53984, 41542, 41542, 41542, 41542, 41542, 62136, 65498, 65498, 65498, 65498, 65498, 46825, 41461, 41461, 41461, 41461, 41461, 47041, 37318, 37318, 37318, 54006, 37318, 54026, 36968, 37318, 37318, 53666, 72643, 72644, 65774, 72644, 72644, 72645, 38772, 41542, 41542, 54043, 41542, 41542, 45363, 65498, 65498, 53015, 65498, 65498, 59800, 41461, 41461, 66593, 41461, 41461, 71140, 54854, 37318, 37318, 54062, 37318, 37318, 37318, 37318, 72642, 72644, 72644, 72644, 72644, 38767, 41542, 41542, 41542, 41542, 41444, 65497, 65498, 65498, 65498, 65498, 59803, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 54082, 64821, 37318, 60498, 72644, 72644, 62830, 58547, 41542, 41542, 58315, 46770, 65498, 65498, 71297, 59798, 41461, 41461, 54740, 47288, 59033, 54099, 69440, 44860, 37318, 54124, 64478, 44740, 41542, 54141, 70297, 54157, 61206, 54174, 54204, 58614, 54222, 56936, 53884, 37318, 41072, 40582, 71978, 54276, 54299, 54319, 56380, 73391, 73919, 41714, 55599, 54335, 56939, 50403, 59838, 42233, 54355, 53715, 54379, 54399, 59801, 54439, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 57408, 54473, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 37318, 44953, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 37318, 37318, 45323, 45350, 63443, 47000, 59399, 37318, 37318, 60166, 37087, 37318, 37318, 37318, 54501, 37318, 54501, 42045, 54519, 39472, 54546, 54565, 67872, 65498, 54590, 62375, 54624, 37318, 37318, 47504, 68839, 67717, 44759, 37318, 37318, 54658, 37318, 37318, 37318, 73164, 72644, 72644, 58045, 72644, 45386, 41542, 41542, 67542, 52709, 65498, 65498, 65498, 56180, 57854, 41461, 41461, 41461, 54676, 60376, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 68532, 57795, 73164, 72644, 72644, 72644, 72644, 72644, 54694, 41542, 41542, 41542, 41542, 41542, 54716, 65498, 65498, 65498, 65498, 65498, 54737, 41461, 41461, 41461, 41461, 41461, 54756, 71731, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 74625, 57661, 72644, 72644, 72644, 72644, 72645, 38772, 54791, 41542, 41542, 41542, 41542, 45363, 54808, 65498, 65498, 65498, 65498, 59800, 54829, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 66657, 37318, 37318, 37318, 37318, 72642, 72644, 72644, 72644, 58513, 38767, 41542, 41542, 41542, 63753, 41444, 65497, 65498, 65498, 65498, 70365, 59803, 41461, 41461, 41461, 60263, 47863, 54854, 37318, 37318, 49068, 37318, 37318, 60498, 72644, 72644, 72644, 58547, 41542, 41542, 41542, 46770, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 54946, 37318, 40844, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 54850, 61615, 65734, 72643, 61015, 41542, 72843, 65498, 54871, 41461, 54893, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 51946, 37318, 44953, 37318, 54915, 54931, 37318, 54967, 54974, 54990, 55006, 55021, 55037, 55066, 55050, 55080, 65689, 37318, 37318, 51966, 38825, 37318, 37318, 37318, 54010, 55096, 55115, 48257, 55149, 55184, 55227, 55249, 41525, 55284, 55303, 63265, 55333, 37318, 37318, 37318, 40256, 37318, 55133, 55360, 37318, 37318, 37318, 55377, 52524, 73164, 55412, 59232, 72644, 55450, 55508, 48452, 55571, 48764, 46504, 61212, 71358, 65498, 52836, 55590, 72384, 66401, 41461, 55624, 55653, 37318, 55162, 48123, 45480, 68146, 44384, 37318, 37318, 55690, 55710, 55730, 55750, 50821, 72644, 73775, 55770, 55805, 41363, 53990, 41542, 54303, 55821, 55849, 65493, 53022, 65498, 61780, 55897, 55924, 46825, 56459, 41461, 71394, 55962, 55996, 47041, 37318, 37318, 37318, 54660, 56044, 56069, 49736, 37318, 37318, 37318, 56099, 56122, 72644, 56141, 70528, 58519, 56160, 58143, 41542, 63117, 55574, 66717, 50850, 52564, 65498, 63146, 65498, 56203, 56221, 51808, 41461, 56467, 41461, 56251, 56269, 54854, 55099, 56307, 46073, 56323, 59679, 56339, 62046, 56355, 52688, 61008, 58074, 70003, 51212, 41542, 66283, 70084, 56375, 56396, 56430, 65125, 61593, 46531, 69280, 62369, 41461, 56449, 56483, 56517, 56546, 63230, 66178, 37927, 69494, 47228, 56575, 66873, 56144, 56596, 56612, 70031, 45388, 56647, 56669, 56693, 56729, 56747, 56781, 56815, 56873, 56892, 51765, 56928, 56955, 37318, 37318, 61883, 53848, 56976, 57010, 57028, 57047, 57072, 57089, 57107, 57133, 57151, 57170, 57197, 57216, 56936, 60597, 37318, 40353, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 57236, 61615, 37318, 57252, 51333, 57276, 57295, 62141, 50073, 54877, 49498, 57311, 72644, 50030, 54383, 59799, 54339, 39384, 52786, 55523, 72337, 68506, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 57331, 57347, 55938, 57396, 53268, 62159, 62339, 66862, 41867, 57424, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 42152, 37318, 44953, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 37318, 37318, 57475, 57504, 57488, 57518, 65689, 37318, 37318, 41289, 37087, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 44404, 72644, 50028, 41369, 65498, 47282, 62003, 72217, 37318, 37318, 37318, 68839, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 66211, 72644, 45386, 41542, 41542, 57534, 52709, 65498, 65498, 49388, 65498, 57854, 41461, 41461, 51784, 41461, 60376, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 72644, 41363, 41542, 41542, 41542, 41542, 41542, 65493, 65498, 65498, 65498, 65498, 65498, 46825, 41461, 41461, 41461, 41461, 41461, 47041, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72643, 72644, 72644, 72644, 72644, 72645, 38772, 41542, 41542, 41542, 41542, 41542, 45363, 65498, 65498, 65498, 65498, 65498, 59800, 41461, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72642, 72644, 72644, 72644, 72644, 38767, 41542, 41542, 41542, 41542, 41444, 65497, 65498, 65498, 65498, 65498, 59803, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 58547, 41542, 41542, 41542, 46770, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 41502, 37318, 44953, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 37318, 37318, 45323, 45350, 63443, 47000, 65689, 37318, 37318, 41289, 37087, 37318, 52736, 37318, 37318, 37318, 37318, 37318, 37318, 44404, 72644, 50028, 41369, 65498, 47282, 62003, 72217, 37318, 37318, 37318, 68839, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 45386, 41542, 41542, 41542, 52709, 65498, 65498, 65498, 65498, 57854, 41461, 41461, 41461, 41461, 60376, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 72644, 41363, 41542, 41542, 41542, 41542, 41542, 65493, 65498, 65498, 65498, 65498, 65498, 46825, 41461, 41461, 41461, 41461, 41461, 47041, 47060, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 57438, 72644, 72644, 72644, 72644, 72645, 61918, 41542, 41542, 41542, 41542, 41542, 45363, 57553, 65498, 65498, 65498, 65498, 59800, 57571, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72642, 72644, 72644, 72644, 72644, 38767, 41542, 41542, 41542, 41542, 41444, 65497, 65498, 65498, 65498, 65498, 59803, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 58547, 41542, 41542, 41542, 46770, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 39711, 37318, 44953, 37318, 42450, 57589, 57607, 57625, 51565, 57641, 57677, 57681, 57697, 57726, 57710, 57740, 65689, 51556, 37318, 41289, 37087, 47346, 60068, 37318, 37318, 39892, 37318, 40511, 57756, 45560, 57818, 57834, 63977, 57879, 60331, 41648, 58000, 57914, 37318, 37318, 38814, 37318, 37318, 57949, 44882, 37318, 57925, 37318, 67807, 49037, 57985, 58044, 51257, 58061, 58115, 58131, 41542, 58165, 54574, 59660, 56705, 57154, 47834, 58193, 52256, 58227, 57863, 58246, 50918, 53781, 37318, 37318, 37318, 37318, 49029, 67667, 37318, 37318, 37318, 37318, 73164, 60986, 49757, 72644, 58283, 72644, 58309, 58331, 63863, 47408, 61105, 41542, 58368, 58389, 67585, 57555, 49801, 65498, 58422, 58441, 68033, 65185, 60256, 69351, 47041, 37318, 61839, 58465, 37318, 37318, 45281, 53688, 37318, 37318, 37318, 72643, 72644, 72644, 63835, 58500, 58535, 38772, 41542, 41542, 55268, 69704, 69729, 45363, 65498, 65498, 61489, 63774, 58568, 59800, 41461, 41461, 66754, 51734, 58602, 47863, 54854, 58637, 37318, 37318, 68901, 37318, 37318, 37318, 72642, 66219, 72644, 72644, 72644, 38767, 67986, 41542, 41542, 41542, 41444, 65497, 56713, 65498, 65498, 65498, 59803, 71875, 41461, 41461, 41461, 47863, 54899, 37318, 58657, 37318, 51097, 69488, 55754, 58674, 72644, 72644, 58694, 58724, 41542, 41542, 58745, 58769, 65498, 65498, 61143, 58793, 41461, 41461, 71804, 37318, 68935, 37318, 73352, 37318, 72644, 49303, 60920, 41542, 72302, 41542, 65498, 52557, 65498, 63673, 46570, 41461, 56936, 37318, 38852, 37318, 73163, 72644, 56106, 50031, 41542, 58818, 65498, 73828, 59802, 41461, 48715, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 53248, 58845, 64251, 68569, 67094, 58879, 59108, 47606, 53268, 62159, 58907, 58895, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37319, 37318, 44953, 37318, 37318, 58923, 37318, 37038, 61423, 60807, 58942, 58956, 58972, 59001, 58985, 59015, 65689, 38336, 37318, 41289, 37087, 37318, 59031, 37318, 37318, 40327, 37318, 38338, 59049, 40328, 59079, 54363, 41369, 59103, 48516, 62003, 72217, 37318, 37318, 59124, 68839, 37318, 63001, 62951, 44924, 37318, 37318, 37318, 59142, 59160, 59182, 72644, 59203, 59223, 59256, 41542, 57091, 48815, 59272, 59718, 65498, 52599, 56799, 57854, 54450, 41461, 63259, 59312, 52629, 59347, 40308, 54027, 37318, 37318, 37318, 37318, 56028, 37318, 37318, 37318, 73164, 56849, 59370, 68264, 72644, 72644, 41363, 63477, 59429, 70290, 41542, 41542, 65493, 64678, 69828, 70882, 65498, 65498, 46825, 59459, 66600, 59489, 41461, 41461, 47041, 37318, 60820, 72604, 37318, 37318, 56414, 63654, 59509, 37318, 37318, 72643, 61043, 72644, 72644, 59543, 72645, 59566, 72479, 41542, 41542, 59585, 41542, 65528, 73531, 59619, 65498, 70373, 65498, 59800, 54834, 59637, 41461, 64050, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72642, 72644, 72644, 72644, 72644, 38767, 41542, 41542, 41542, 41542, 41444, 65497, 65498, 65498, 65498, 65498, 59803, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 58547, 41542, 41542, 41542, 46770, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 44851, 37318, 37318, 37318, 37318, 59207, 72644, 60920, 61740, 41542, 41542, 73606, 65498, 65498, 49876, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 61445, 73662, 65498, 59655, 59802, 56876, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 59676, 72644, 59695, 59713, 71108, 58802, 59734, 59756, 59775, 59794, 59819, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 59854, 73737, 67066, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 67305, 48392, 37318, 54855, 59885, 59896, 59919, 66152, 67290, 59971, 59985, 60001, 60031, 60044, 60015, 65689, 47586, 44905, 38860, 60060, 60084, 37318, 60579, 48333, 40435, 72237, 60111, 60138, 60122, 60182, 60217, 60279, 60316, 65566, 60366, 50482, 58641, 37318, 37318, 48606, 72949, 68216, 73429, 60392, 69215, 60419, 37318, 60465, 60494, 60514, 60535, 72871, 72644, 60555, 49584, 41542, 47939, 52709, 70645, 70888, 65498, 70640, 57854, 54601, 60344, 63674, 41461, 59473, 64205, 46157, 37318, 60571, 37318, 37318, 37318, 60595, 37318, 37318, 45177, 73164, 60613, 72644, 53647, 72644, 72644, 41363, 60640, 41542, 61097, 41542, 41542, 58708, 70406, 65498, 55874, 65498, 65498, 50904, 58204, 41461, 60666, 41461, 41461, 47041, 37318, 37318, 37318, 37318, 40106, 37318, 37318, 44677, 60687, 37318, 60703, 72644, 72644, 46744, 72644, 58087, 60725, 41542, 41542, 41542, 60758, 74033, 52815, 65498, 65498, 65498, 52593, 61759, 41832, 41461, 41461, 41461, 53066, 69906, 47863, 49504, 60776, 60792, 64608, 60842, 51384, 60860, 60895, 60918, 60939, 60974, 61031, 61070, 38767, 70056, 61088, 61121, 61167, 41444, 65497, 61193, 61228, 55536, 61274, 59803, 61293, 61309, 61258, 72531, 61332, 54854, 48246, 61348, 61369, 61414, 58477, 51897, 68272, 58678, 65107, 61439, 53722, 46795, 49566, 61461, 54813, 65498, 61486, 61505, 72623, 61531, 61548, 61568, 67348, 61609, 37318, 37318, 61636, 61678, 47889, 61697, 61718, 52147, 61736, 61756, 56291, 61775, 61796, 55608, 61816, 46251, 61838, 37318, 61855, 73163, 61899, 68974, 61934, 52295, 73662, 61950, 58777, 71058, 61966, 62000, 62019, 63023, 62043, 40852, 60923, 72471, 73664, 62062, 59801, 62083, 49498, 62101, 55233, 62122, 54383, 62157, 62175, 62225, 62247, 62263, 62279, 62295, 62331, 57449, 55864, 54413, 66647, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 62355, 62391, 62339, 66862, 41867, 41898, 57361, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 62425, 44953, 37318, 41929, 62645, 37318, 37318, 67919, 62449, 62465, 62479, 62495, 62524, 62508, 62538, 62554, 62570, 62591, 51116, 40267, 62636, 62669, 37763, 62688, 62721, 40114, 62768, 62784, 62800, 62846, 62862, 62878, 62894, 62929, 62967, 62983, 37318, 74513, 46381, 42254, 37318, 40466, 50397, 50445, 63017, 37318, 37318, 63039, 73164, 72644, 63059, 63089, 55789, 45386, 47983, 63105, 51466, 69257, 65498, 47963, 66977, 63139, 63162, 41461, 63187, 63203, 63246, 60376, 37318, 65243, 37318, 54083, 37318, 65923, 63281, 37318, 49694, 37318, 63306, 63323, 63356, 63373, 63389, 72644, 67473, 63412, 41542, 63428, 63500, 41542, 54700, 59443, 65498, 63522, 63557, 65498, 56187, 53414, 41461, 63578, 63594, 41461, 68051, 48021, 46148, 37318, 59832, 55125, 37318, 37318, 37318, 37318, 37318, 63803, 72643, 72644, 70758, 59187, 72644, 72645, 38772, 41542, 55434, 57073, 41542, 41542, 45363, 65498, 74070, 65498, 63613, 65498, 59800, 41461, 60671, 41461, 63633, 41461, 47863, 54854, 37318, 37318, 63653, 44684, 37318, 37318, 37318, 72642, 72644, 72644, 72644, 57012, 55426, 41542, 41542, 41542, 41542, 66835, 62140, 65498, 65498, 65498, 65498, 63670, 41461, 41461, 41461, 41461, 63690, 54854, 67948, 37318, 37318, 37318, 37318, 63712, 72644, 63734, 72644, 46430, 41542, 63751, 41542, 56170, 65498, 63769, 65498, 41577, 41461, 51728, 41461, 47288, 63790, 37318, 37318, 37318, 37318, 62822, 66520, 60920, 41416, 71239, 41542, 47825, 58753, 65498, 61151, 71116, 41461, 72584, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 45334, 61615, 37318, 63825, 73373, 63858, 64501, 63879, 65885, 41461, 56530, 63897, 63917, 63966, 63993, 64029, 64066, 39534, 64101, 64126, 64163, 64186, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 50006, 53268, 62159, 64221, 66862, 41867, 64277, 64293, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 66665, 44953, 37318, 37318, 68891, 37318, 64328, 64337, 67698, 39838, 64353, 64369, 64398, 64382, 64414, 65689, 37318, 69115, 41289, 37087, 37318, 37318, 63950, 37318, 51547, 37318, 37318, 37318, 44404, 64465, 64494, 64517, 49717, 67057, 64557, 72217, 37318, 64583, 37318, 68839, 37318, 40908, 40502, 64605, 50368, 64607, 37318, 37318, 62231, 64624, 67101, 73183, 63396, 64650, 67404, 68345, 48485, 71344, 64666, 64694, 64712, 71834, 64730, 57181, 60350, 61532, 53072, 55317, 64759, 37318, 64782, 64801, 45664, 45866, 38224, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 52669, 72644, 72644, 41363, 41542, 41542, 67409, 41542, 41542, 65493, 65498, 65498, 55555, 65498, 65498, 46825, 41461, 41461, 68042, 41461, 41461, 49668, 53220, 61353, 37318, 37318, 37318, 64818, 59354, 57374, 68538, 37318, 72643, 72644, 64837, 72644, 72644, 72645, 64870, 41542, 64889, 41542, 41542, 41542, 68453, 65498, 51231, 64925, 65498, 65498, 59800, 41461, 61515, 64943, 41461, 41461, 47863, 54854, 59903, 37318, 37318, 37318, 37909, 37318, 37318, 72642, 72644, 72644, 64960, 72644, 56626, 41542, 41542, 73894, 41542, 42296, 65497, 65498, 65498, 64978, 65498, 59803, 41461, 41461, 71869, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 58547, 41542, 41542, 41542, 46770, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 52897, 37318, 59144, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 62943, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 56828, 64997, 65024, 65045, 64231, 59603, 54339, 38753, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 37318, 44953, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 37318, 37318, 45323, 45350, 63443, 47000, 65689, 37318, 37318, 41289, 37087, 37318, 46305, 37318, 37318, 37318, 42426, 42429, 65068, 54066, 65102, 51341, 41369, 65123, 50559, 62003, 48585, 65141, 37318, 37318, 68839, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 45386, 41542, 41542, 41542, 52709, 65498, 65498, 65498, 65498, 57854, 41461, 41461, 41461, 41461, 60376, 37318, 37318, 37318, 43472, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 72644, 65158, 41542, 41542, 41542, 41542, 41542, 66019, 65498, 65498, 65498, 65498, 65498, 46825, 41461, 41461, 41461, 41461, 41461, 47041, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72643, 72644, 72644, 72644, 72644, 72645, 38772, 41542, 41542, 41542, 41542, 41542, 45363, 65498, 65498, 65498, 65498, 65498, 59800, 41461, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72642, 72644, 52976, 72644, 72644, 38767, 41542, 41542, 73801, 41542, 41444, 65497, 65498, 49370, 65498, 65498, 59803, 41461, 41461, 65182, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 58547, 41542, 41542, 41542, 46770, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 51274, 72644, 50031, 65201, 73662, 71079, 65498, 59802, 58261, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 37806, 44953, 65219, 37318, 37420, 65239, 37318, 67919, 65259, 65275, 65288, 65304, 65333, 65317, 65347, 65689, 45409, 47790, 41289, 50740, 71165, 72077, 54775, 46691, 68943, 37318, 65363, 65398, 65418, 65465, 65515, 65551, 65582, 68491, 65617, 65675, 37318, 37318, 37318, 55396, 65708, 50432, 65732, 40783, 60879, 37318, 37318, 46888, 65750, 54125, 65773, 60201, 65790, 65831, 49353, 41542, 61177, 57056, 65855, 49783, 65498, 65874, 65901, 41461, 65939, 58230, 64743, 49003, 37318, 37318, 37318, 54951, 44007, 65958, 37318, 73691, 37318, 44004, 69414, 59740, 72644, 52378, 72644, 64962, 65976, 66005, 41542, 53183, 41542, 52448, 66040, 66074, 65498, 73466, 65498, 70854, 66103, 60245, 41461, 66119, 41461, 72537, 66911, 47041, 37318, 37318, 38803, 72980, 60478, 40954, 37318, 37480, 66138, 66168, 66202, 72644, 66235, 46345, 66251, 72645, 66271, 41542, 58177, 66299, 66320, 41542, 56559, 65498, 65535, 66344, 66367, 65498, 69808, 41461, 53763, 66394, 66417, 41461, 47863, 49919, 37318, 37318, 52902, 66451, 37318, 66495, 39978, 72642, 66512, 60519, 72644, 72644, 38767, 65839, 41542, 66536, 41542, 41444, 65497, 66557, 54721, 65498, 65498, 59803, 66582, 73488, 41461, 41461, 52328, 47223, 43477, 62672, 37318, 37318, 37318, 65382, 72644, 72644, 61681, 58099, 41542, 41542, 41542, 66616, 65498, 65498, 65498, 66632, 66681, 41461, 41461, 54252, 37318, 70963, 37318, 37318, 37318, 66698, 72644, 60920, 66716, 41542, 67896, 66733, 65498, 69783, 66751, 41461, 54608, 56936, 37318, 66770, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 56009, 66788, 66811, 66827, 66851, 66889, 49836, 61620, 60922, 73660, 47450, 46828, 42223, 66927, 59778, 49606, 47605, 66943, 50030, 47449, 46829, 60496, 73658, 47451, 52229, 66963, 67001, 67042, 47192, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 42006, 44953, 41194, 40023, 67082, 63290, 67117, 67133, 67149, 67200, 67214, 67230, 67259, 67243, 67275, 67324, 37318, 67347, 72149, 37087, 37318, 39873, 37318, 37318, 73640, 55694, 39647, 45609, 60403, 67364, 67389, 66058, 64007, 71278, 67425, 72217, 39770, 40165, 39032, 68839, 68408, 37318, 37318, 37318, 37318, 39965, 41180, 37318, 67452, 67489, 70764, 72644, 72644, 67522, 67558, 63467, 41542, 52709, 51619, 65498, 67579, 65498, 57854, 67601, 63637, 67628, 41461, 60376, 37318, 67645, 37318, 67663, 67683, 37318, 56960, 37318, 65223, 37318, 37318, 73164, 52080, 69630, 72644, 72644, 72644, 67733, 60734, 73861, 41542, 41542, 53739, 65493, 58399, 51643, 65498, 65498, 63881, 46825, 67757, 59323, 41461, 41461, 66122, 50625, 37318, 37318, 67778, 47108, 48295, 37318, 38228, 67799, 44787, 57969, 67823, 72644, 72644, 69591, 55783, 67843, 67888, 41542, 41542, 63123, 65166, 73809, 53005, 65498, 65498, 64714, 62913, 63541, 72852, 41461, 41461, 59639, 69865, 70909, 48723, 67912, 59519, 37318, 37900, 37318, 51391, 37318, 67935, 72642, 72644, 52056, 59087, 72644, 38767, 41542, 41542, 67964, 67985, 41444, 65497, 65498, 65858, 58406, 65498, 59803, 41461, 41461, 68002, 41461, 47863, 54854, 37318, 68397, 37318, 68076, 37318, 60498, 68624, 72644, 68100, 65444, 66541, 41542, 68117, 51222, 72818, 65498, 55549, 59798, 53799, 41461, 51777, 47288, 37318, 37318, 40078, 37318, 68138, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 65915, 37954, 37318, 68162, 56840, 72644, 69566, 50031, 41542, 68178, 65498, 72029, 59802, 41461, 61324, 68205, 61615, 68239, 68255, 57031, 68288, 49964, 68312, 64170, 41461, 72350, 72946, 63842, 68330, 50053, 68366, 68384, 61620, 60922, 73660, 47450, 46828, 40170, 49310, 63506, 57898, 47605, 68424, 68440, 45370, 63171, 40400, 68476, 68554, 68604, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 38247, 68640, 37318, 37318, 44545, 44549, 42062, 66479, 66466, 68687, 68703, 68719, 68748, 68732, 68764, 68811, 49856, 37318, 68835, 73418, 40538, 54530, 37318, 68855, 37963, 68877, 39120, 68925, 68959, 68996, 69012, 46476, 69028, 71470, 69063, 59385, 62027, 45461, 65008, 68839, 69079, 37318, 38220, 69096, 65716, 69131, 41882, 69165, 69175, 69191, 63718, 59550, 63357, 69231, 50874, 46465, 70280, 70118, 64531, 65596, 69273, 69296, 57117, 69318, 73551, 69334, 69350, 69367, 69406, 69430, 37318, 69456, 69475, 69510, 37318, 37318, 68519, 50099, 69530, 44732, 69549, 69582, 60998, 72644, 69624, 41363, 69646, 69670, 69695, 41542, 69720, 65493, 69753, 69776, 69799, 65498, 69824, 48973, 69844, 69860, 69881, 41461, 69903, 51039, 37318, 69922, 62705, 62209, 69940, 52743, 51107, 45640, 57591, 40471, 72643, 69961, 69994, 72644, 48835, 70019, 70047, 70072, 69679, 41542, 41542, 70100, 64902, 48943, 63562, 65498, 65498, 70134, 59800, 68060, 61822, 41461, 41461, 70150, 47863, 72356, 45780, 37318, 73436, 47091, 37318, 37318, 70166, 72704, 72644, 70194, 70221, 70244, 47170, 73209, 73218, 70265, 66328, 41444, 70313, 65498, 70329, 70356, 70389, 60293, 70422, 70441, 54423, 70477, 47863, 50635, 37318, 50706, 66496, 53384, 69533, 46401, 70511, 72644, 72644, 70544, 70560, 70789, 41542, 70593, 70626, 69047, 65498, 52486, 70661, 69887, 41461, 70487, 37318, 41199, 59126, 70706, 37318, 70726, 70746, 56994, 70780, 70823, 72308, 70850, 70870, 65601, 70904, 70925, 51697, 70495, 37450, 37318, 70960, 70979, 71002, 71021, 63456, 46437, 71047, 71074, 71095, 49624, 59493, 71132, 71156, 71181, 41086, 71197, 69608, 71230, 71263, 71294, 71313, 57200, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 65052, 64909, 59331, 55194, 71329, 71374, 71410, 71439, 71455, 66985, 70676, 53268, 62159, 62339, 66862, 71486, 71502, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 37318, 71540, 37318, 37318, 62697, 37318, 37318, 67919, 71622, 71638, 71652, 71668, 71697, 71681, 71711, 65689, 37318, 37318, 41289, 71727, 43243, 37318, 54635, 37318, 47100, 37318, 37318, 37318, 44404, 60624, 71747, 71775, 71820, 71855, 71891, 71918, 50345, 37318, 37318, 68839, 37318, 37318, 64312, 71934, 37318, 37318, 37318, 63901, 73164, 71973, 72644, 72644, 67498, 71994, 41542, 41542, 41542, 72010, 61470, 65498, 65498, 49441, 57854, 72045, 41461, 41461, 72052, 56235, 72068, 37318, 72101, 73266, 37318, 37318, 37318, 72130, 72165, 37318, 45286, 73164, 72644, 72186, 72203, 52036, 66700, 41363, 41543, 41542, 72253, 47431, 72288, 65493, 56731, 65499, 62067, 70610, 72324, 46825, 73981, 63597, 47312, 56493, 72372, 47041, 37318, 38557, 37318, 72400, 37318, 37318, 37318, 52648, 37318, 37318, 72643, 69558, 72644, 72644, 72644, 72645, 72419, 58149, 41542, 41542, 41542, 41542, 61134, 64696, 65498, 65498, 65498, 65498, 59800, 57573, 41461, 41461, 41461, 41461, 47863, 56406, 37318, 67179, 37318, 37318, 37318, 37318, 60902, 62813, 72644, 72644, 72644, 72644, 42340, 41542, 41542, 41542, 41542, 41444, 47816, 65498, 65498, 65498, 65498, 64261, 41461, 41461, 41461, 41461, 47863, 54766, 37318, 37318, 46970, 37318, 37318, 39394, 72444, 72644, 72644, 67855, 72462, 41542, 57537, 51591, 72495, 65498, 65498, 72517, 72553, 41461, 41461, 72576, 37318, 72600, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 65757, 60923, 69654, 73664, 69041, 59801, 72620, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 72639, 72661, 49423, 56501, 60496, 73658, 47451, 47606, 53268, 68368, 54485, 72691, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 37318, 42479, 51143, 66186, 50148, 37318, 40519, 67015, 72720, 37318, 37318, 72736, 72765, 72749, 72779, 65689, 37318, 37318, 41289, 37087, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 44404, 72795, 49944, 41369, 72816, 50989, 62003, 72217, 37318, 49091, 63043, 68839, 37318, 37318, 37318, 37318, 37318, 52920, 37318, 37318, 73164, 47899, 72644, 73587, 72644, 45386, 72834, 41542, 56677, 52709, 56433, 65498, 65498, 72024, 57854, 55980, 41461, 64944, 41461, 60376, 37318, 37318, 37318, 37318, 37318, 55361, 37318, 37318, 37318, 53853, 37318, 73164, 72644, 72644, 72868, 72644, 72644, 41363, 41542, 41542, 72887, 41542, 41542, 65493, 65498, 65498, 72920, 65498, 65498, 46825, 41461, 56253, 41461, 41461, 41461, 47041, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72643, 72644, 72644, 72644, 72644, 72645, 38772, 41542, 41542, 41542, 41542, 41542, 45363, 65498, 65498, 65498, 65498, 65498, 59800, 41461, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72642, 72644, 72644, 72644, 72644, 38767, 41542, 41542, 41542, 41542, 41444, 65497, 65498, 65498, 65498, 65498, 59803, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 40788, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 58547, 41542, 41542, 41542, 46770, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 69080, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 72938, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 37318, 50678, 37318, 37318, 72976, 37318, 72965, 72996, 73030, 73066, 73080, 73096, 73125, 73109, 73141, 65689, 37318, 37318, 41289, 37087, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 44404, 49521, 50028, 47181, 50958, 47282, 59296, 63932, 37318, 37318, 37318, 68839, 37318, 37318, 37318, 37318, 45204, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 45386, 41542, 41542, 41542, 52709, 65498, 65498, 65498, 65498, 57854, 41461, 41461, 41461, 41461, 60376, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 72644, 41363, 41542, 41542, 41542, 41542, 41542, 65493, 65498, 65498, 65498, 65498, 65498, 46825, 41461, 41461, 41461, 41461, 41461, 47041, 37318, 37318, 37318, 37318, 37318, 48411, 37318, 37318, 37318, 37318, 73180, 72644, 72644, 72644, 72644, 72645, 73199, 41542, 41542, 41542, 41542, 41542, 56282, 65498, 65498, 65498, 65498, 65498, 56756, 41461, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 68223, 37318, 37318, 37318, 37318, 37318, 72642, 72644, 73234, 72644, 56857, 38767, 41542, 66304, 41542, 41542, 73255, 65497, 65498, 73289, 65498, 72501, 59803, 41461, 61976, 41461, 70425, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 58547, 41542, 41542, 41542, 46770, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45555, 37318, 37318, 37318, 37318, 44953, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 37318, 37318, 45323, 45350, 63443, 47000, 65689, 37318, 37318, 41289, 73310, 37318, 39135, 37318, 37318, 37318, 46656, 37318, 73333, 55714, 73368, 64110, 41369, 73389, 53053, 62003, 72217, 37318, 37318, 37318, 73407, 48428, 48554, 40049, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 61072, 72644, 52030, 45386, 41542, 41809, 41542, 73452, 65498, 65498, 58580, 63617, 57854, 41461, 41461, 73487, 55972, 60376, 73504, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 72644, 41363, 41542, 41542, 41542, 41542, 41542, 65493, 65498, 65498, 65498, 65498, 65498, 46825, 41461, 41461, 41461, 41461, 41461, 47041, 37318, 37318, 37318, 37318, 37318, 37318, 62308, 37318, 37318, 37318, 72643, 72644, 52957, 72644, 72644, 74050, 38772, 41542, 54792, 41542, 41542, 41542, 48926, 65498, 65498, 73527, 65498, 65498, 59800, 41461, 41461, 73547, 41461, 41461, 47863, 54854, 73567, 37318, 37318, 37318, 37318, 37318, 37318, 72642, 73584, 72644, 72644, 72644, 38767, 72904, 41542, 41542, 41542, 41444, 65497, 73603, 65498, 65498, 65498, 59803, 70455, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 58547, 41542, 41542, 41542, 46770, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 37318, 44953, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 37318, 37318, 45323, 45350, 63443, 47000, 73622, 37318, 37318, 41289, 37087, 37318, 42196, 37318, 37318, 37318, 37318, 37318, 37318, 40000, 72644, 73656, 60650, 55287, 47282, 61984, 73680, 37318, 42131, 37318, 68839, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 41786, 73164, 72644, 72644, 72644, 69600, 45386, 41542, 41542, 41542, 73717, 65498, 65498, 65498, 56205, 57854, 41461, 41461, 41461, 72560, 60376, 37318, 59949, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73753, 37318, 73164, 52385, 72644, 72644, 73772, 72644, 41363, 69737, 41542, 41542, 73791, 41542, 65493, 49792, 65498, 65498, 73825, 65498, 46825, 50572, 41461, 66682, 41461, 41461, 47041, 37318, 46080, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72643, 41389, 72644, 72644, 72644, 72645, 73844, 41542, 73877, 41542, 41542, 41542, 51420, 65498, 73910, 65498, 65498, 65498, 49986, 41461, 73935, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 61662, 37318, 72642, 72644, 47364, 72644, 72644, 38767, 41542, 41542, 70798, 41542, 41444, 65497, 65498, 65498, 73958, 65498, 59803, 41461, 41461, 73977, 41461, 47863, 54854, 37318, 37318, 42105, 37318, 37318, 60498, 72644, 72644, 72644, 58547, 41542, 41542, 41542, 46770, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 73997, 37318, 37318, 40961, 37318, 60952, 72644, 60920, 74016, 41542, 41542, 57892, 65498, 65498, 71387, 41461, 41461, 56936, 37318, 60826, 37318, 73163, 72644, 74049, 50031, 68296, 73662, 65498, 74066, 59802, 53130, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 45302, 37318, 37318, 37318, 37318, 44953, 37318, 37318, 37318, 37318, 37318, 67919, 61870, 37318, 37318, 45323, 45350, 63443, 47000, 65689, 37318, 37318, 41289, 37087, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 44404, 72644, 50028, 41369, 65498, 47282, 62003, 72217, 37318, 37318, 37318, 68839, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 45386, 41542, 41542, 41542, 52709, 65498, 65498, 65498, 65498, 57854, 41461, 41461, 41461, 41461, 60376, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 72644, 41363, 41542, 41542, 41542, 41542, 41542, 65493, 65498, 65498, 65498, 65498, 65498, 46825, 41461, 41461, 41461, 41461, 41461, 47041, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72643, 72644, 72644, 72644, 72644, 72645, 38772, 41542, 41542, 41542, 41542, 41542, 45363, 65498, 65498, 65498, 65498, 65498, 59800, 41461, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72642, 72644, 72644, 72644, 72644, 38767, 41542, 41542, 41542, 41542, 41444, 65497, 65498, 65498, 65498, 65498, 59803, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 58547, 41542, 41542, 41542, 46770, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 37318, 37318, 37318, 37318, 64589, 74088, 74086, 40559, 74115, 74104, 74140, 74169, 37318, 74124, 74153, 74190, 74194, 74210, 36991, 37318, 37318, 41289, 37087, 37318, 37318, 74245, 37318, 37318, 37318, 37318, 37318, 65657, 40192, 74266, 55734, 37318, 53472, 40192, 38527, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 72228, 37116, 37202, 37162, 74643, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 37318, 37318, 37318, 37318, 48276, 37318, 37318, 53226, 37318, 37318, 67919, 57964, 74289, 74334, 37318, 37318, 74319, 74303, 36991, 37318, 37318, 41289, 37087, 37318, 37318, 37010, 37318, 37318, 37318, 74350, 37318, 53463, 40192, 38525, 37318, 37318, 74370, 40192, 38527, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 37182, 37116, 37202, 37162, 37222, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 37318, 37318, 37318, 37318, 74174, 37318, 37318, 37318, 37318, 37318, 52120, 37296, 74401, 74403, 37318, 37318, 74392, 74419, 36991, 37318, 37318, 41289, 37087, 37318, 37318, 74464, 37318, 37318, 74485, 37318, 37318, 59413, 40192, 38525, 37318, 37318, 39335, 40192, 38527, 37031, 44584, 37054, 37076, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 74504, 37116, 37202, 37162, 74529, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 39013, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 39249, 55484, 39265, 39291, 55476, 39311, 39327, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 39708, 37318, 37318, 37318, 37318, 48276, 37318, 37318, 37318, 37318, 37318, 67919, 57964, 37318, 37318, 37318, 37318, 37318, 74564, 65689, 37318, 37318, 41289, 37087, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 44404, 72644, 50028, 41369, 65498, 47282, 62003, 69205, 37318, 37318, 37318, 68839, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 41324, 41542, 41542, 41542, 58552, 65498, 65498, 65498, 65498, 57854, 41461, 41461, 41461, 41461, 60376, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 73164, 72644, 72644, 72644, 72644, 72644, 41363, 41542, 41542, 41542, 41542, 41542, 65493, 65498, 65498, 65498, 65498, 65498, 46825, 41461, 41461, 41461, 41461, 41461, 47041, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72643, 72644, 72644, 72644, 72644, 72645, 38772, 41542, 41542, 41542, 41542, 41542, 45363, 65498, 65498, 65498, 65498, 65498, 59800, 41461, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 72642, 72644, 72644, 72644, 72644, 38767, 41542, 41542, 41542, 41542, 41444, 65497, 65498, 65498, 65498, 65498, 59803, 41461, 41461, 41461, 41461, 47863, 54854, 37318, 37318, 37318, 37318, 37318, 60498, 72644, 72644, 72644, 58547, 41542, 41542, 41542, 46770, 65498, 65498, 65498, 59798, 41461, 41461, 41461, 47288, 37318, 37318, 37318, 37318, 37318, 72644, 72644, 60920, 41542, 41542, 41542, 65498, 65498, 65498, 63673, 41461, 41461, 56936, 37318, 37318, 37318, 73163, 72644, 72644, 50031, 41542, 73662, 65498, 65498, 59802, 41461, 41462, 56939, 61615, 37318, 72643, 60923, 41542, 73664, 65498, 59801, 41461, 49498, 72946, 72644, 50030, 54383, 59799, 54339, 61620, 60922, 73660, 47450, 46828, 73161, 59759, 73663, 59797, 47605, 60497, 50030, 47449, 46829, 60496, 73658, 47451, 47606, 53268, 62159, 62339, 66862, 41867, 41898, 41909, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 65960, 37318, 37318, 37318, 37318, 74599, 74601, 37318, 37318, 70178, 74617, 37014, 37318, 37318, 37318, 37318, 37318, 37318, 37010, 37318, 37318, 37318, 37318, 37318, 65657, 40192, 38525, 37318, 37318, 39335, 40192, 38527, 37031, 44584, 37054, 74641, 37318, 37318, 74250, 37318, 69924, 37107, 37136, 37152, 65815, 69390, 37247, 37265, 53482, 72228, 37116, 37202, 37162, 74643, 37186, 37120, 37206, 37166, 74726, 69388, 37245, 37263, 53480, 37281, 37318, 41092, 37317, 37318, 37318, 45006, 57380, 37335, 37318, 74671, 64449, 74683, 40193, 37351, 37378, 40192, 39199, 37741, 69458, 41098, 41041, 37318, 46044, 37882, 69459, 41099, 41042, 37318, 46045, 37371, 74376, 37355, 37382, 40192, 39202, 38523, 74469, 50180, 37398, 37414, 37436, 50351, 37475, 37318, 58014, 37496, 39340, 37628, 37651, 37674, 55492, 37717, 38230, 37546, 37566, 58028, 41986, 37605, 37523, 37542, 37562, 58024, 37582, 37601, 39304, 37621, 37644, 37667, 37690, 37709, 37733, 74273, 57770, 38317, 37757, 37779, 37822, 46961, 37943, 37979, 37995, 38150, 38170, 38011, 38093, 38038, 38061, 37792, 39434, 38084, 38100, 38045, 38068, 37799, 39441, 38116, 37992, 38147, 38166, 38186, 38022, 38246, 38263, 37318, 38304, 37318, 38354, 38370, 45231, 38397, 38413, 37861, 37459, 38432, 38451, 68861, 37456, 38429, 38448, 38467, 45226, 38483, 38407, 38516, 57783, 51848, 38545, 38580, 73050, 38677, 38610, 38626, 49222, 38643, 38660, 49221, 38642, 38659, 38676, 38693, 38624, 38714, 38739, 38791, 38841, 38876, 38942, 38892, 60443, 38908, 60433, 60449, 38914, 38930, 38946, 38962, 38978, 74659, 39048, 39078, 39105, 39169, 39156, 39172, 39188, 39089, 39218, 46272, 55484, 39265, 39291, 55476, 39311, 74721, 37693, 37318, 65659, 38698, 39356, 39410, 37835, 37848, 39457, 45051, 38498, 38500, 45058, 39494, 39520, 39559, 39504, 39575, 59063, 39606, 39616, 39632, 39681, 39692, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 37318, 1, 24578, 3, 0, 0, 0, 0, 0, 0, 0, 180524, 180524, 180524, 180524, 0, 188717, 0, 188717, 180524, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 180524, 180524, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 368, 188717, 180524, 188717, 188717, 188717, 188717, 188717, 131072, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 139264, 147456, 188717, 188717, 188717, 188717, 188717, 188717, 188717, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 180524, 188717, 302, 303, 0, 0, 307, 0, 0, 0, 307, 0, 0, 0, 4931584, 0, 0, 0, 0, 0, 0, 2367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1854, 0, 0, 0, 0, 0, 0, 4268032, 306, 307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 302, 0, 0, 0, 0, 0, 0, 4268032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262144, 0, 0, 4857856, 4874240, 0, 0, 4923392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5840896, 5849088, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 328, 0, 0, 375, 375, 405, 0, 0, 0, 6275072, 0, 0, 0, 0, 0, 0, 0, 368, 368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450560, 0, 0, 0, 0, 4857856, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5259264, 0, 0, 0, 0, 0, 0, 0, 0, 5414912, 0, 5447680, 0, 5464064, 0, 5414912, 5447680, 0, 0, 5562368, 5636096, 5685248, 0, 5750784, 5873664, 0, 0, 0, 0, 5636096, 5873664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5873664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6275072, 0, 0, 0, 914, 0, 0, 0, 0, 0, 4857856, 4874240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5447680, 0, 5464064, 0, 5480448, 5562368, 0, 0, 0, 5636096, 0, 5685248, 0, 0, 5750784, 0, 0, 0, 0, 0, 6275072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 990, 0, 0, 0, 4841472, 0, 0, 0, 4898816, 0, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 5414912, 4358144, 5447680, 4358144, 5464064, 4358144, 5480448, 5562368, 4358144, 4358144, 4358144, 5636096, 4358144, 5636096, 4358144, 5685248, 4358144, 4358144, 5750784, 4358144, 4358144, 4358144, 4358144, 4358144, 5873664, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4923392, 4358144, 4358144, 4358144, 4358144, 4358144, 0, 4923392, 0, 0, 0, 0, 4366336, 0, 0, 0, 0, 418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4276224, 1258, 0, 0, 0, 5603328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 341, 0, 0, 5341184, 0, 5652480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4759552, 4358144, 4358144, 4358144, 4358144, 4358144, 5242880, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 5341184, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 0, 0, 5808128, 4358144, 4358144, 4358144, 4825088, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 5627904, 5652480, 4358144, 5701632, 4358144, 4358144, 5808128, 4358144, 4358144, 4358144, 5668864, 0, 0, 5791744, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6201344, 6242304, 6250496, 0, 0, 0, 0, 6422528, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 351, 0, 0, 0, 0, 0, 0, 5619712, 0, 0, 0, 0, 0, 0, 0, 5726208, 5758976, 0, 0, 5791744, 0, 0, 0, 0, 0, 3664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5111808, 0, 0, 0, 0, 0, 5283840, 0, 0, 0, 0, 0, 5816320, 6291456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2389, 0, 2391, 2392, 0, 0, 0, 0, 6062080, 6463488, 0, 5398528, 0, 0, 6479872, 0, 0, 0, 0, 0, 0, 0, 3459, 0, 0, 0, 3463, 0, 0, 0, 0, 0, 0, 6463488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 303, 0, 0, 0, 0, 4931584, 4939776, 0, 0, 0, 0, 0, 0, 5054464, 0, 0, 0, 0, 0, 0, 0, 0, 5210112, 0, 0, 0, 5210112, 0, 0, 0, 0, 5292032, 0, 0, 0, 0, 5365760, 0, 0, 0, 5455872, 0, 0, 5816320, 0, 5857280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 327, 401, 0, 6119424, 0, 6168576, 0, 0, 0, 0, 0, 6242304, 0, 6291456, 0, 6316032, 0, 0, 0, 0, 0, 0, 0, 4358144, 4358144, 4931584, 4939776, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 5054464, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 5210112, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 5210112, 4358144, 4358144, 4358144, 4358144, 5292032, 4358144, 4358144, 4358144, 4358144, 5365760, 4358144, 4358144, 4358144, 5455872, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 5455872, 4358144, 4358144, 4358144, 4358144, 4358144, 5554176, 5570560, 5578752, 5619712, 5668864, 4358144, 4358144, 4358144, 5791744, 5816320, 4358144, 5857280, 4358144, 4358144, 4358144, 4358144, 5816320, 4358144, 5857280, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 0, 0, 0, 6119424, 4358144, 6168576, 4358144, 4358144, 4358144, 4358144, 4358144, 6242304, 4358144, 6291456, 4358144, 6316032, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 6463488, 0, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 6463488, 4358144, 4358144, 4358144, 4358144, 4358144, 0, 0, 0, 0, 0, 4825088, 0, 0, 0, 0, 0, 0, 0, 6184960, 5316608, 0, 0, 5644288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 646, 755, 756, 757, 0, 0, 6217728, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5390336, 5308416, 5488640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5799936, 0, 0, 5881856, 0, 0, 0, 0, 0, 0, 0, 0, 0, 351, 352, 353, 0, 0, 0, 0, 5070848, 5431296, 0, 6430720, 0, 0, 0, 0, 0, 0, 0, 0, 5160960, 0, 0, 0, 0, 0, 0, 6053888, 0, 0, 0, 0, 0, 5013504, 0, 0, 0, 0, 0, 0, 6053888, 0, 0, 0, 4358144, 4358144, 5013504, 4358144, 4358144, 4358144, 0, 0, 0, 0, 4841472, 0, 0, 0, 4898816, 0, 0, 0, 0, 0, 0, 1851, 0, 1853, 0, 0, 0, 0, 0, 0, 0, 0, 4825088, 0, 0, 0, 0, 0, 0, 0, 0, 2786, 0, 0, 0, 0, 0, 0, 0, 0, 2809, 0, 0, 0, 0, 0, 0, 0, 0, 2834, 0, 0, 0, 0, 0, 0, 0, 0, 3154, 0, 0, 0, 0, 0, 0, 0, 0, 3167, 3168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6283264, 6332416, 0, 0, 0, 5881856, 0, 5382144, 0, 0, 0, 0, 0, 0, 0, 3665, 3666, 0, 0, 0, 0, 0, 0, 0, 665, 0, 644, 0, 0, 0, 0, 0, 0, 0, 6266880, 4784128, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4915200, 4358144, 4956160, 4972544, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 5070848, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 5218304, 4358144, 5267456, 4358144, 4358144, 4358144, 6184960, 4358144, 4358144, 6283264, 4358144, 4358144, 6332416, 4358144, 4358144, 4358144, 6389760, 4358144, 4358144, 6430720, 6438912, 4358144, 4358144, 4358144, 6266880, 6488064, 0, 0, 0, 6266880, 0, 0, 4915200, 0, 4956160, 4972544, 0, 0, 0, 0, 0, 0, 5070848, 0, 0, 0, 0, 0, 0, 0, 5218304, 0, 5267456, 0, 0, 0, 0, 5218304, 0, 5267456, 0, 0, 5308416, 5316608, 0, 0, 0, 5431296, 0, 5488640, 0, 0, 0, 0, 0, 0, 0, 0, 6332416, 0, 0, 0, 6389760, 0, 0, 6430720, 6438912, 0, 0, 0, 0, 0, 0, 4784128, 0, 0, 0, 4849664, 0, 0, 0, 0, 0, 4915200, 0, 4956160, 4972544, 0, 0, 0, 6430720, 6438912, 4784128, 4358144, 4358144, 4358144, 4849664, 4358144, 4358144, 4358144, 4358144, 4358144, 4915200, 4358144, 4358144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 302, 0, 303, 306, 5218304, 4358144, 5267456, 4358144, 4358144, 5308416, 5316608, 4358144, 4358144, 4358144, 5431296, 4358144, 5488640, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 5799936, 4358144, 4358144, 5881856, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 6103040, 4358144, 4358144, 4358144, 6103040, 4358144, 4358144, 4358144, 6184960, 4358144, 4358144, 4358144, 6283264, 4358144, 4358144, 6332416, 4358144, 4358144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368640, 0, 0, 0, 0, 0, 0, 2411, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1256, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4931584, 4939776, 6488064, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 357, 5660672, 5718016, 0, 5865472, 0, 0, 6037504, 0, 0, 6078464, 0, 0, 6340608, 0, 6455296, 0, 0, 0, 0, 420, 420, 420, 420, 597, 597, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 420, 0, 420, 0, 0, 0, 0, 5472256, 0, 0, 0, 6209536, 0, 0, 0, 0, 6176768, 0, 0, 0, 0, 0, 0, 6373376, 6389760, 0, 0, 6488064, 6103040, 0, 0, 0, 0, 0, 0, 1850, 0, 0, 0, 0, 0, 0, 0, 0, 0, 662, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4898816, 0, 5709824, 0, 0, 0, 5283840, 0, 0, 0, 0, 5251072, 0, 6414336, 5832704, 0, 5955584, 0, 0, 4358144, 4358144, 4841472, 4358144, 4358144, 4358144, 4898816, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 0, 0, 0, 0, 0, 0, 303, 0, 0, 0, 4358144, 5472256, 5521408, 4358144, 4358144, 4358144, 5595136, 5709824, 5718016, 4358144, 5824512, 5865472, 4358144, 4358144, 5922816, 4358144, 4358144, 6021120, 4358144, 6037504, 4358144, 4358144, 6078464, 6111232, 4358144, 6176768, 6209536, 6234112, 4358144, 4358144, 4358144, 4358144, 5283840, 0, 0, 0, 0, 5472256, 5521408, 0, 0, 0, 0, 5595136, 5709824, 5718016, 0, 5824512, 5865472, 0, 0, 5865472, 0, 0, 5922816, 0, 0, 6021120, 0, 6037504, 0, 0, 6078464, 6111232, 0, 6176768, 6209536, 0, 6234112, 0, 0, 6234112, 0, 0, 0, 0, 0, 0, 0, 4358144, 4358144, 4841472, 4358144, 4358144, 4358144, 4898816, 4358144, 5283840, 4358144, 4358144, 4358144, 4358144, 5472256, 5521408, 4358144, 4358144, 4358144, 4358144, 5595136, 5709824, 5718016, 4358144, 4358144, 0, 0, 0, 0, 0, 5193728, 0, 0, 0, 0, 0, 0, 0, 0, 4358144, 4358144, 6209536, 4358144, 6234112, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 573440, 0, 0, 5890048, 0, 0, 0, 6160384, 0, 5095424, 5349376, 0, 5275648, 0, 0, 0, 0, 0, 0, 2308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139264, 147456, 0, 0, 344064, 0, 0, 0, 0, 4997120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5947392, 0, 0, 0, 0, 0, 3675, 0, 0, 0, 0, 0, 0, 0, 0, 4012, 528, 5103616, 4358144, 4358144, 5201920, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 5890048, 4358144, 4358144, 4358144, 6029312, 4358144, 4358144, 4358144, 4358144, 6160384, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 6406144, 0, 5103616, 0, 0, 5201920, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5890048, 0, 0, 0, 0, 6029312, 0, 0, 0, 0, 6160384, 0, 0, 0, 0, 0, 0, 0, 6406144, 6406144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4997120, 4358144, 4358144, 5038080, 4358144, 4358144, 4358144, 5095424, 5095424, 5103616, 4358144, 4358144, 5201920, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 0, 5013504, 0, 4358144, 6406144, 4358144, 4358144, 4358144, 0, 0, 0, 4890624, 0, 0, 0, 0, 0, 0, 0, 0, 3209, 0, 0, 3212, 0, 0, 0, 0, 0, 0, 5898240, 5963776, 0, 0, 6193152, 0, 0, 5406720, 6397952, 5300224, 5234688, 5423104, 0, 0, 0, 0, 0, 3675, 0, 0, 0, 0, 0, 4009, 0, 4011, 528, 528, 0, 0, 0, 0, 0, 0, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58815, 57893, 57893, 0, 0, 5988352, 0, 0, 6135808, 6307840, 0, 5996544, 4800512, 0, 6356992, 0, 0, 0, 0, 0, 0, 2317, 2318, 0, 2320, 2321, 0, 0, 0, 0, 0, 0, 1207, 0, 1209, 0, 0, 368, 368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 710, 0, 0, 0, 0, 0, 0, 0, 0, 5496832, 0, 0, 0, 0, 0, 5611520, 0, 0, 0, 0, 0, 0, 0, 3673, 0, 0, 0, 0, 0, 0, 0, 0, 693, 0, 0, 0, 0, 0, 0, 368, 4947968, 5021696, 5529600, 0, 0, 5169152, 0, 0, 0, 4800512, 4808704, 4358144, 4358144, 4890624, 4358144, 4947968, 4358144, 4358144, 4358144, 5898240, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 6307840, 4358144, 4358144, 6356992, 6381568, 5185536, 0, 5234688, 5300224, 0, 0, 5406720, 5529600, 0, 0, 0, 0, 5898240, 0, 0, 0, 0, 0, 0, 0, 0, 6307840, 0, 0, 6356992, 6381568, 6397952, 4800512, 4808704, 4358144, 4358144, 4890624, 4358144, 4947968, 4358144, 4358144, 4358144, 5046272, 4358144, 4358144, 4358144, 4358144, 5185536, 4358144, 5234688, 5300224, 4358144, 4358144, 5406720, 5529600, 4358144, 4358144, 4358144, 4358144, 5898240, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 6307840, 4358144, 4358144, 6356992, 6381568, 6397952, 5021696, 4358144, 4358144, 5021696, 0, 0, 0, 4980736, 0, 0, 0, 0, 0, 5373952, 5734400, 6045696, 0, 0, 0, 0, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 421, 0, 421, 0, 6258688, 6447104, 0, 0, 6127616, 0, 6348800, 5906432, 0, 5537792, 3675, 4882432, 0, 0, 0, 0, 0, 0, 2329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5939200, 0, 0, 5677056, 6365184, 4866048, 0, 6070272, 5545984, 5152768, 0, 0, 0, 0, 0, 3675, 0, 0, 0, 0, 4008, 0, 4010, 0, 528, 4013, 6144000, 4358144, 4866048, 4882432, 4358144, 4980736, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 5324800, 5373952, 5537792, 5545984, 5586944, 5734400, 5971968, 4358144, 6045696, 4358144, 6070272, 4358144, 4358144, 5537792, 5545984, 5734400, 5971968, 4358144, 6045696, 4358144, 6070272, 4358144, 4358144, 4358144, 6348800, 0, 4866048, 4882432, 0, 0, 0, 0, 644, 0, 0, 0, 803, 0, 808, 0, 794, 0, 820, 0, 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450560, 450560, 0, 0, 450560, 0, 6045696, 0, 6070272, 0, 0, 0, 0, 6348800, 0, 4866048, 4882432, 0, 4980736, 0, 0, 0, 0, 0, 0, 0, 0, 5324800, 5373952, 5537792, 5545984, 5586944, 5734400, 5971968, 0, 6045696, 0, 6070272, 0, 0, 0, 0, 6348800, 4358144, 4866048, 4882432, 4358144, 4980736, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 6299648, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 6348800, 4358144, 6144000, 0, 6144000, 0, 4988928, 5005312, 0, 0, 0, 0, 5775360, 0, 0, 0, 0, 749, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 759, 0, 0, 3675, 0, 0, 0, 0, 0, 0, 5693440, 0, 6496256, 5144576, 5136384, 0, 5914624, 4358144, 6324224, 0, 0, 5005312, 0, 0, 0, 5120000, 5136384, 0, 0, 0, 0, 0, 0, 0, 1252, 0, 0, 0, 748, 1259, 0, 0, 0, 0, 0, 0, 0, 6324224, 0, 0, 5005312, 0, 0, 0, 5120000, 5136384, 0, 0, 0, 0, 0, 0, 6463488, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 6324224, 5914624, 5914624, 0, 0, 0, 0, 0, 5513216, 5783552, 0, 3675, 0, 0, 0, 0, 0, 0, 0, 0, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4931584, 4939776, 4358144, 4358144, 4358144, 0, 6053888, 0, 0, 0, 0, 0, 0, 0, 0, 6012928, 4358144, 4358144, 5013504, 4358144, 4358144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1153, 0, 0, 0, 0, 0, 3675, 0, 0, 4006, 4007, 0, 0, 0, 0, 528, 528, 528, 528, 3220, 528, 528, 528, 528, 528, 528, 3227, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 6053888, 4358144, 4358144, 0, 0, 5013504, 0, 0, 0, 0, 0, 312, 414, 0, 0, 139264, 147456, 0, 0, 0, 0, 0, 0, 0, 6103040, 0, 0, 0, 6184960, 0, 0, 0, 6283264, 0, 0, 6332416, 0, 0, 0, 6389760, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 6053888, 4358144, 4358144, 4358144, 0, 0, 0, 0, 5193728, 0, 0, 0, 0, 761, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 528, 528, 528, 3700, 528, 528, 528, 5742592, 0, 0, 0, 0, 0, 4358144, 4907008, 4358144, 5079040, 4358144, 5226496, 4358144, 5742592, 4358144, 4358144, 4358144, 6094848, 4358144, 5062656, 0, 0, 0, 0, 0, 4358144, 4358144, 6094848, 0, 4907008, 0, 5079040, 0, 5226496, 0, 5742592, 0, 0, 0, 6094848, 0, 0, 0, 0, 0, 3675, 0, 4005, 0, 0, 0, 0, 0, 0, 528, 528, 528, 528, 4155, 528, 528, 528, 528, 528, 528, 4907008, 0, 5079040, 0, 5226496, 0, 5742592, 0, 0, 0, 6094848, 0, 4358144, 4907008, 4358144, 5079040, 5062656, 4358144, 4358144, 4358144, 4358144, 4358144, 0, 5062656, 0, 0, 0, 0, 0, 6225920, 0, 5062656, 4358144, 4358144, 4358144, 4358144, 4358144, 913, 5063569, 913, 913, 913, 913, 913, 6226833, 989, 5063645, 0, 0, 0, 4816896, 4358144, 4358144, 4358144, 4358144, 6086656, 4816896, 0, 0, 0, 0, 6086656, 4816896, 4358144, 4358144, 4358144, 4358144, 6086656, 0, 5087232, 0, 5931008, 4358144, 5332992, 5980160, 4358144, 0, 5332992, 5980160, 0, 0, 5332992, 5980160, 0, 4358144, 5332992, 5980160, 4358144, 0, 0, 0, 0, 787, 0, 0, 0, 0, 806, 0, 0, 0, 0, 0, 0, 0, 3166, 0, 0, 0, 0, 0, 0, 0, 0, 327, 0, 0, 0, 0, 0, 0, 0, 5439488, 5128192, 4358144, 5128192, 0, 5128192, 0, 5128192, 4358144, 0, 4358144, 0, 0, 4358144, 0, 4358144, 0, 0, 4358144, 6004736, 6004736, 6004736, 6004736, 6004736, 0, 0, 0, 1, 24578, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 340, 0, 0, 221652, 221652, 221652, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 221652, 468, 221652, 221652, 221652, 468, 221652, 221652, 221652, 221652, 221652, 221652, 221652, 221652, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 1162, 0, 0, 1164, 0, 0, 0, 0, 0, 0, 0, 0, 1311, 0, 0, 0, 0, 0, 1179, 0, 0, 0, 762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 383, 0, 0, 0, 0, 1064, 0, 0, 0, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 913, 913, 913, 4358144, 4358144, 1064, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 507, 514, 514, 1, 24578, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237568, 302, 0, 306, 237568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 643, 0, 0, 4268032, 98304, 307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 661, 0, 0, 4210979, 24578, 3, 0, 0, 297, 0, 0, 0, 0, 297, 0, 0, 0, 0, 0, 0, 0, 3685, 0, 0, 0, 3688, 3689, 0, 0, 0, 0, 0, 245760, 245760, 245760, 0, 0, 0, 0, 139264, 147456, 245760, 245760, 0, 0, 245760, 0, 4210979, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 1164, 1297, 0, 0, 0, 0, 0, 0, 1304, 0, 0, 0, 0, 0, 2859, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2867, 368, 368, 0, 0, 0, 303104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 647, 0, 0, 0, 0, 528, 1158, 0, 4857856, 4874240, 0, 0, 4923392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 379, 0, 0, 0, 0, 371, 0, 4358144, 4358144, 4358144, 4358144, 0, 1984, 0, 0, 0, 4825088, 0, 0, 0, 0, 0, 0, 0, 1253, 0, 0, 0, 0, 0, 0, 0, 0, 2399, 2400, 0, 0, 2402, 0, 0, 0, 0, 0, 262144, 262144, 262144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3449, 0, 0, 0, 0, 0, 262144, 262144, 0, 262144, 0, 0, 0, 139264, 147456, 262144, 0, 0, 0, 0, 0, 0, 2344, 2345, 0, 0, 0, 0, 0, 0, 0, 0, 798, 0, 0, 0, 0, 0, 809, 0, 0, 0, 262144, 0, 262738, 262738, 262738, 262738, 262738, 262738, 262738, 262738, 262738, 262738, 262738, 262738, 262738, 0, 262738, 0, 0, 262738, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 1177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4086, 528, 528, 528, 528, 0, 270336, 0, 0, 0, 0, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 5177344, 278528, 278528, 0, 0, 131072, 278528, 0, 0, 0, 0, 278528, 0, 0, 0, 0, 278528, 278528, 278528, 278528, 278528, 278528, 278528, 278528, 278528, 278528, 278528, 278528, 278528, 278528, 0, 278528, 0, 0, 278528, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 1205, 1206, 0, 0, 0, 0, 0, 368, 368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 712, 0, 0, 0, 0, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 302, 638, 0, 0, 0, 0, 1218, 0, 0, 0, 0, 1223, 0, 0, 0, 0, 0, 0, 0, 1752, 0, 0, 0, 1755, 0, 0, 1758, 0, 4268032, 306, 641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 662, 0, 0, 528, 0, 1430, 0, 0, 0, 0, 0, 4857856, 4874240, 0, 0, 0, 0, 0, 0, 0, 0, 3686, 0, 0, 0, 0, 0, 0, 0, 0, 3826, 0, 3675, 0, 0, 0, 0, 0, 0, 6275072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1525, 0, 0, 0, 0, 0, 3675, 4004, 0, 0, 0, 0, 0, 0, 0, 528, 528, 4209, 528, 4210, 528, 528, 528, 528, 528, 1, 24578, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 286720, 303, 0, 307, 286720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 663, 0, 792, 0, 307, 0, 0, 0, 0, 0, 0, 307, 139264, 287139, 0, 0, 0, 307, 0, 0, 0, 0, 1234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2414, 0, 0, 0, 0, 0, 307, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 302, 66175, 0, 0, 0, 0, 1250, 0, 0, 0, 1255, 0, 0, 0, 0, 0, 0, 0, 661, 0, 0, 0, 0, 0, 0, 0, 0, 378, 0, 363, 0, 0, 0, 0, 0, 4268032, 306, 98946, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 728, 0, 0, 0, 0, 122880, 0, 4268032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2310144, 0, 0, 0, 0, 307, 4857856, 4874240, 0, 0, 4923392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 528, 528, 3699, 528, 528, 528, 528, 1, 24578, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 304, 0, 304, 0, 304, 304, 304, 295216, 304, 304, 304, 295216, 295216, 304, 295216, 304, 304, 131072, 304, 304, 304, 304, 304, 295216, 304, 304, 304, 304, 295216, 304, 304, 304, 304, 295286, 295216, 295216, 295216, 295216, 295216, 295216, 304, 304, 304, 304, 304, 0, 0, 304, 304, 295216, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 369, 304, 0, 295216, 304, 295286, 295216, 295216, 295216, 304, 304, 304, 295286, 139264, 147456, 295216, 295216, 304, 304, 295216, 295216, 295216, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 304, 295216, 295286, 295286, 295286, 295286, 295286, 295286, 295286, 295286, 295286, 295286, 295286, 295286, 295286, 295216, 295216, 295216, 295216, 295216, 304, 304, 304, 295216, 304, 304, 304, 304, 304, 304, 304, 295216, 374, 304, 304, 304, 304, 304, 304, 304, 295216, 304, 295216, 295216, 295216, 295216, 295216, 295216, 295216, 295216, 295286, 295286, 295286, 295286, 295286, 295286, 295216, 295216, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 1267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3170, 0, 0, 0, 0, 0, 0, 0, 6275072, 0, 0, 0, 0, 0, 0, 0, 4399804, 4399804, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4399804, 0, 0, 319488, 0, 0, 0, 0, 0, 0, 319488, 319488, 0, 0, 0, 0, 0, 0, 0, 3696, 0, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3849, 528, 528, 528, 319488, 0, 0, 0, 319488, 319488, 319488, 319488, 319488, 319488, 319488, 319488, 319488, 319488, 319488, 319488, 319488, 319488, 319488, 319488, 319488, 319488, 0, 24578, 3, 0, 0, 4366336, 253952, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 1282, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1241, 0, 0, 0, 0, 368, 425984, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4399805, 0, 0, 0, 6275072, 0, 0, 0, 0, 0, 0, 0, 368, 0, 0, 0, 0, 0, 0, 2357, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3461, 0, 0, 0, 0, 0, 0, 0, 327680, 327680, 327680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 327680, 327680, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 302, 303, 0, 327680, 327680, 327680, 327680, 327680, 335872, 327680, 327680, 327680, 335872, 327680, 327680, 327680, 327680, 327680, 327680, 49723, 0, 0, 0, 0, 0, 0, 0, 49723, 49723, 0, 0, 0, 0, 0, 0, 0, 1270, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5627904, 5652480, 0, 5701632, 0, 0, 0, 0, 0, 6275072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49152, 990, 0, 0, 0, 0, 0, 3683, 0, 0, 0, 0, 0, 0, 0, 3690, 0, 0, 0, 0, 0, 3836, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5242880, 0, 0, 0, 0, 0, 0, 0, 5341184, 0, 0, 0, 0, 0, 344064, 344064, 344064, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 344064, 344064, 344064, 344064, 344064, 344064, 344064, 344064, 344064, 344064, 344064, 344064, 344064, 344064, 344064, 344064, 344064, 344064, 344064, 344064, 344064, 344064, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 302, 303, 0, 352256, 352256, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 1309, 0, 0, 0, 0, 0, 0, 0, 0, 1315, 0, 0, 0, 0, 371, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3438, 0, 0, 3440, 0, 1, 292, 3, 0, 0, 0, 298, 0, 0, 0, 0, 0, 0, 0, 0, 0, 528, 3698, 528, 528, 528, 3701, 528, 0, 360448, 360448, 360448, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 360448, 360448, 360448, 360448, 360448, 360448, 360448, 360448, 360448, 360448, 360448, 360448, 360448, 360448, 360448, 360448, 360448, 360448, 360448, 360448, 360448, 360448, 1, 0, 3, 155942, 155942, 296, 0, 636, 0, 0, 0, 302, 303, 0, 1230, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 528, 528, 1376, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2460, 528, 0, 914, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60322, 57943, 57943, 57943, 57943, 59004, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 528, 57893, 3998, 0, 4000, 528, 528, 528, 528, 58773, 0, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 0, 57916, 57916, 57916, 57916, 57916, 528, 528, 528, 2437, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2446, 528, 2448, 0, 0, 0, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59856, 57893, 57893, 57893, 57893, 57893, 57893, 60873, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61213, 57893, 57893, 57893, 57893, 61214, 61215, 57893, 57893, 57893, 57893, 60300, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 0, 0, 0, 0, 0, 60432, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 528, 0, 0, 0, 3191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 319, 0, 0, 0, 0, 0, 0, 3682, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 338, 0, 0, 0, 528, 57893, 61069, 57893, 57893, 57893, 61072, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58331, 0, 57916, 57916, 57916, 57916, 57916, 61080, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59358, 61101, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61109, 57916, 57916, 57916, 57916, 57916, 57916, 60360, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 60707, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61138, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59568, 57943, 57943, 57943, 528, 528, 3852, 3853, 528, 528, 528, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58291, 57893, 57893, 57943, 57943, 57943, 61251, 57943, 57943, 57943, 57943, 61252, 61253, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 58468, 57943, 57943, 57943, 57943, 528, 528, 528, 898, 0, 0, 3675, 0, 0, 3929, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 695, 0, 0, 0, 0, 368, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 61299, 57893, 57893, 57893, 57893, 57893, 57893, 61305, 57893, 57893, 57893, 61309, 57893, 57916, 57916, 57916, 57916, 57916, 57916, 61315, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 61128, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60066, 57943, 57943, 57943, 57943, 57943, 57943, 57916, 57916, 61321, 57916, 57916, 57916, 61325, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 61331, 57943, 528, 1951, 528, 2283, 528, 57893, 59394, 57893, 59632, 57893, 2290, 0, 2291, 0, 0, 0, 0, 0, 417792, 0, 417792, 0, 0, 0, 0, 310, 0, 0, 0, 0, 0, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1328, 0, 0, 0, 0, 0, 528, 528, 57893, 57893, 57893, 57893, 61511, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58826, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 57916, 57916, 57916, 61524, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 60024, 57943, 60026, 57943, 57943, 57943, 57943, 57943, 61537, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 0, 0, 0, 0, 0, 0, 4244, 528, 528, 528, 57893, 57893, 57893, 57893, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 0, 0, 0, 0, 1310, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1316, 1269, 0, 528, 528, 57893, 57893, 57916, 57916, 57943, 57943, 0, 528, 57893, 57916, 57943, 0, 528, 57893, 57916, 57943, 0, 528, 57893, 57916, 57943, 0, 0, 0, 0, 376832, 376832, 376832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 346, 0, 0, 0, 0, 420, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 1731, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 4268780, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6119424, 0, 6168576, 0, 0, 0, 0, 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 354, 355, 356, 0, 0, 393685, 393685, 393685, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 0, 0, 245760, 0, 0, 475136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 761, 0, 0, 305, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 411, 0, 421, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 1731, 0, 0, 0, 0, 1738, 0, 1740, 0, 0, 0, 0, 0, 0, 3180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 352256, 0, 352256, 352256, 0, 0, 0, 305, 306, 307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1185, 0, 0, 0, 0, 0, 748, 421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 337, 0, 0, 0, 0, 57916, 0, 0, 0, 748, 57893, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 528, 528, 3413, 57893, 57893, 60760, 1725, 0, 0, 0, 1731, 1732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 1252, 1825, 0, 0, 0, 0, 1259, 1259, 0, 0, 0, 0, 0, 0, 0, 4083, 0, 4085, 0, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3848, 528, 528, 528, 528, 0, 0, 2293, 1732, 2294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 368, 1212, 0, 0, 528, 528, 2499, 2932, 0, 0, 0, 0, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59860, 528, 528, 528, 2932, 0, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 0, 0, 2592, 0, 0, 417792, 0, 0, 0, 0, 417792, 0, 0, 0, 0, 0, 310, 0, 310, 0, 0, 0, 0, 0, 4151, 4152, 4153, 528, 528, 528, 4156, 528, 4158, 528, 528, 0, 0, 0, 0, 0, 0, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60283, 417792, 417792, 0, 0, 417792, 417792, 417792, 417792, 417792, 417792, 417792, 417792, 417792, 417792, 417792, 417792, 418102, 417792, 417792, 418101, 418102, 417792, 417792, 418101, 417792, 418101, 417792, 0, 417792, 0, 0, 0, 0, 417792, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 310, 310, 310, 0, 418101, 417792, 1, 24578, 3, 0, 0, 4366971, 0, 0, 0, 0, 0, 302, 303, 311296, 4399805, 0, 0, 0, 311296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 800, 0, 0, 0, 0, 0, 0, 0, 0, 4268032, 306, 307, 0, 434176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 381, 0, 384, 0, 0, 0, 0, 0, 6275072, 0, 0, 0, 0, 0, 0, 0, 0, 4399805, 0, 0, 0, 0, 0, 363, 0, 0, 0, 0, 0, 0, 368, 0, 296, 0, 0, 914, 913, 913, 913, 913, 913, 4858769, 4875153, 913, 913, 913, 913, 913, 913, 913, 913, 913, 5628817, 5653393, 913, 5702545, 913, 913, 913, 913, 5448593, 913, 5464977, 913, 5481361, 5563281, 913, 913, 913, 5637009, 913, 5686161, 913, 913, 5751697, 913, 6275985, 913, 913, 913, 913, 913, 913, 913, 913, 913, 0, 0, 990, 989, 989, 989, 989, 6087645, 4817809, 4359057, 4359057, 4359057, 4359057, 6087569, 0, 5087232, 0, 5931008, 4358144, 989, 989, 5260253, 989, 989, 989, 989, 989, 989, 989, 989, 5415901, 989, 5448669, 989, 5465053, 989, 5481437, 5563357, 989, 989, 989, 5637085, 989, 5686237, 989, 989, 5751773, 989, 989, 989, 989, 989, 989, 6300637, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 5112797, 989, 989, 989, 989, 989, 989, 5874653, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 6276061, 989, 989, 989, 4858845, 4875229, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 5178333, 989, 989, 4359057, 5637009, 4359057, 5686161, 4359057, 4359057, 5751697, 4359057, 4359057, 4359057, 4359057, 4359057, 5874577, 4359057, 4359057, 4359057, 4359057, 5186449, 4359057, 5235601, 5301137, 4359057, 4359057, 5407633, 5530513, 4359057, 4359057, 4359057, 4359057, 4359057, 6300561, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 5112721, 4359057, 4359057, 4359057, 4359057, 989, 989, 5809041, 4359057, 4359057, 4359057, 4826001, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 5178257, 4359057, 4359057, 4359057, 4359057, 4359057, 5243793, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 5342097, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 5415825, 4359057, 5448593, 4359057, 5464977, 4359057, 5481361, 5563281, 4359057, 4359057, 0, 0, 0, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 4932497, 4940689, 913, 913, 6464401, 0, 0, 0, 0, 989, 989, 989, 989, 989, 989, 989, 989, 989, 4998109, 989, 989, 5039069, 989, 989, 989, 5096413, 989, 5456861, 989, 989, 989, 989, 989, 5555165, 5571549, 5579741, 5620701, 5669853, 989, 989, 989, 5792733, 5817309, 989, 5858269, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 4359057, 4359057, 4359057, 6120413, 989, 6169565, 989, 989, 989, 989, 989, 6243293, 989, 6292445, 989, 6317021, 989, 989, 989, 989, 989, 5071837, 989, 989, 989, 989, 989, 989, 989, 5219293, 989, 5268445, 4359057, 4359057, 4932497, 4940689, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 5055377, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 6054801, 4359057, 4359057, 4359057, 0, 0, 0, 0, 5193728, 0, 4359057, 5456785, 4359057, 4359057, 4359057, 4359057, 4359057, 5555089, 5571473, 5579665, 5620625, 5669777, 4359057, 4359057, 4359057, 5792657, 5817233, 4359057, 5858193, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 0, 5013504, 0, 6120337, 4359057, 6169489, 4359057, 4359057, 4359057, 4359057, 4359057, 6243217, 4359057, 6292369, 4359057, 6316945, 4359057, 4359057, 4359057, 5194641, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4907008, 0, 5079040, 6094848, 6430720, 6438912, 0, 0, 0, 0, 0, 0, 4785041, 913, 913, 913, 4850577, 913, 913, 913, 913, 913, 913, 5055377, 913, 913, 913, 913, 913, 913, 913, 913, 5211025, 5489553, 913, 913, 913, 913, 913, 913, 913, 913, 913, 5800849, 913, 913, 5882769, 913, 913, 913, 913, 5219217, 913, 5268369, 913, 913, 5309329, 5317521, 913, 913, 913, 5432209, 913, 913, 913, 6333329, 913, 913, 913, 6390673, 913, 913, 6431633, 6439825, 0, 0, 0, 0, 0, 0, 0, 393685, 0, 393685, 393685, 393685, 393685, 393685, 393685, 393685, 393685, 393685, 393685, 393685, 393685, 393685, 393685, 0, 393685, 0, 4785117, 989, 989, 989, 4850653, 989, 989, 989, 989, 989, 4916189, 989, 4957149, 4973533, 989, 989, 989, 6030301, 989, 989, 989, 989, 6161373, 989, 989, 989, 989, 989, 989, 989, 6325213, 4359057, 4359057, 5006225, 4359057, 4359057, 4359057, 5120913, 5137297, 989, 989, 5309405, 5317597, 989, 989, 989, 5432285, 989, 5489629, 989, 989, 989, 989, 989, 989, 5325789, 5374941, 5538781, 5546973, 5587933, 5735389, 5972957, 989, 6046685, 989, 6104029, 989, 989, 989, 6185949, 989, 989, 989, 6284253, 989, 989, 6333405, 989, 989, 989, 6390749, 989, 989, 6431709, 6439901, 4785041, 4359057, 4359057, 4359057, 4850577, 4359057, 4359057, 4359057, 4359057, 4359057, 4916113, 4359057, 4358144, 4358144, 4358144, 4358144, 4358144, 913, 913, 913, 913, 913, 0, 0, 0, 0, 0, 0, 0, 319488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 319488, 0, 4957073, 4973457, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 5071761, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 6275985, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 5219217, 4359057, 5268369, 4359057, 4359057, 5309329, 5317521, 4359057, 4359057, 4359057, 5432209, 4359057, 5489553, 4359057, 4359057, 4359057, 5211025, 4359057, 4359057, 4359057, 4359057, 5292945, 4359057, 4359057, 4359057, 4359057, 5366673, 4359057, 4359057, 4359057, 4359057, 6390673, 4359057, 4359057, 6431633, 6439825, 4358144, 4358144, 4358144, 6266880, 6488064, 913, 913, 913, 6267793, 6488977, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 730, 4358144, 4358144, 4358144, 0, 0, 913, 913, 4842385, 913, 913, 913, 4899729, 913, 913, 913, 913, 913, 913, 913, 6103953, 913, 913, 913, 6185873, 913, 913, 913, 6284177, 913, 913, 5473169, 5522321, 913, 913, 913, 913, 5596049, 5710737, 5718929, 913, 5825425, 5866385, 913, 913, 913, 913, 5243793, 913, 913, 913, 913, 913, 913, 913, 5342097, 913, 913, 913, 0, 0, 989, 989, 989, 4826077, 989, 989, 989, 989, 989, 989, 989, 0, 913, 4359057, 4359057, 4359057, 4359057, 4359057, 4858769, 4875153, 5923729, 913, 913, 6022033, 913, 6038417, 913, 913, 6079377, 6112145, 913, 6177681, 6210449, 913, 6235025, 913, 913, 913, 913, 6243217, 913, 6292369, 913, 6316945, 913, 913, 913, 913, 913, 913, 913, 4998033, 913, 913, 5038993, 913, 913, 913, 5096337, 5104529, 5284829, 989, 989, 989, 989, 5473245, 5522397, 989, 989, 989, 989, 5596125, 5710813, 5719005, 989, 5825501, 5866461, 989, 989, 5923805, 989, 989, 6022109, 989, 6038493, 989, 989, 6079453, 6112221, 989, 6177757, 6210525, 989, 6235101, 989, 989, 989, 989, 989, 989, 989, 4359057, 4359057, 4842385, 4359057, 4359057, 4359057, 4899729, 4359057, 5284753, 4359057, 4359057, 4359057, 4359057, 5473169, 5522321, 4359057, 4359057, 4359057, 4359057, 5596049, 5710737, 5718929, 4359057, 4359057, 4359057, 6103953, 4359057, 4359057, 4359057, 6185873, 4359057, 4359057, 4359057, 6284177, 4359057, 4359057, 6333329, 4359057, 4359057, 4923392, 4358144, 4358144, 4358144, 4358144, 4358144, 913, 4924305, 913, 913, 913, 913, 4366336, 0, 0, 0, 0, 1779, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3156, 0, 3157, 0, 0, 5825425, 5866385, 4359057, 4359057, 5923729, 4359057, 4359057, 6022033, 4359057, 6038417, 4359057, 4359057, 6079377, 6112145, 4359057, 6177681, 6210449, 4359057, 6235025, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4358144, 4358144, 4358144, 913, 913, 913, 913, 913, 5194641, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 988, 989, 989, 989, 989, 989, 4358144, 4358144, 6029312, 4358144, 4358144, 4358144, 4358144, 6160384, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 6406144, 913, 913, 913, 913, 6325137, 989, 989, 5006301, 989, 989, 989, 5120989, 5137373, 989, 989, 989, 989, 989, 6226909, 4359057, 5063569, 4359057, 4359057, 4359057, 4359057, 4359057, 6226833, 0, 6086656, 913, 913, 5202833, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 5890961, 913, 913, 913, 5555089, 5571473, 5579665, 5620625, 5669777, 913, 913, 913, 5792657, 5817233, 913, 5858193, 913, 913, 913, 913, 5292945, 913, 913, 913, 913, 5366673, 913, 913, 913, 5456785, 913, 913, 913, 913, 913, 6308753, 913, 913, 6357905, 6382481, 6398865, 4801501, 4809693, 989, 989, 4891613, 913, 913, 6030225, 913, 913, 913, 913, 6161297, 913, 913, 913, 913, 913, 913, 913, 6407057, 5104605, 989, 989, 5202909, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 989, 5891037, 6407133, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4998033, 4359057, 4359057, 5038993, 4359057, 4359057, 4359057, 5325713, 5374865, 5538705, 5546897, 5587857, 5735313, 5972881, 4359057, 6046609, 4359057, 6071185, 4359057, 4359057, 5096337, 5104529, 4359057, 4359057, 5202833, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4358144, 4358144, 4358144, 4358144, 5890961, 4359057, 4359057, 4359057, 6030225, 4359057, 4359057, 4359057, 4359057, 6161297, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 5800849, 4359057, 4359057, 5882769, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 5628817, 5653393, 4359057, 5702545, 4359057, 4359057, 5809041, 4359057, 4359057, 4359057, 4359057, 6407057, 4358144, 4358144, 4358144, 913, 913, 913, 4890624, 0, 0, 0, 0, 0, 0, 0, 0, 327680, 0, 0, 0, 0, 0, 0, 0, 0, 319488, 0, 0, 0, 0, 319488, 0, 319488, 6397952, 4801425, 4809617, 913, 913, 4891537, 913, 4948881, 913, 913, 913, 5047185, 913, 913, 913, 913, 913, 913, 913, 6300561, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 6120337, 913, 6169489, 913, 5186449, 913, 5235601, 5301137, 913, 913, 5407633, 5530513, 913, 913, 913, 913, 5899153, 913, 913, 913, 913, 913, 913, 6054801, 913, 913, 913, 989, 989, 5014493, 989, 989, 989, 989, 989, 5194717, 989, 989, 989, 989, 989, 989, 989, 989, 4359057, 4359057, 989, 4948957, 989, 989, 989, 5047261, 989, 989, 989, 989, 5186525, 989, 5235677, 5301213, 989, 989, 989, 5211101, 989, 989, 989, 989, 5293021, 989, 989, 989, 989, 5366749, 989, 989, 989, 5243869, 989, 989, 989, 989, 989, 989, 989, 5342173, 989, 989, 989, 989, 989, 989, 6464477, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 6325137, 5914624, 5915537, 0, 0, 0, 5407709, 5530589, 989, 989, 989, 989, 5899229, 989, 989, 989, 989, 989, 989, 989, 989, 6308829, 989, 989, 6357981, 6382557, 6398941, 4801425, 4809617, 4359057, 4359057, 4891537, 4359057, 4948881, 4359057, 4359057, 4359057, 5047185, 5899153, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 6308753, 4359057, 4359057, 6357905, 6382481, 6398865, 5021696, 4358144, 4358144, 5022609, 913, 913, 0, 4980736, 0, 0, 0, 0, 0, 5373952, 5734400, 6045696, 0, 0, 0, 0, 1792, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114688, 0, 5537792, 5545984, 5734400, 5971968, 4358144, 6045696, 4358144, 6070272, 4358144, 4358144, 4358144, 6348800, 913, 4866961, 4883345, 913, 913, 4916113, 913, 4957073, 4973457, 913, 913, 913, 913, 913, 913, 5071761, 913, 913, 913, 913, 913, 913, 5260177, 913, 913, 913, 913, 913, 913, 913, 913, 5415825, 4981649, 913, 913, 913, 913, 913, 913, 913, 913, 5325713, 5374865, 5538705, 5546897, 5587857, 5735313, 5972881, 913, 6046609, 913, 6071185, 913, 913, 913, 913, 6349713, 989, 4867037, 4883421, 989, 4981725, 989, 989, 989, 5800925, 989, 989, 5882845, 989, 989, 989, 989, 989, 989, 989, 989, 989, 5628893, 5653469, 989, 5702621, 989, 989, 989, 989, 6071261, 989, 989, 989, 989, 6349789, 4359057, 4866961, 4883345, 4359057, 4981649, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 6464401, 4358144, 4358144, 4358144, 4358144, 4358144, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 5178257, 913, 4359057, 4359057, 6349713, 4358144, 6144000, 913, 6144913, 0, 4988928, 5005312, 0, 0, 0, 0, 5775360, 0, 0, 0, 0, 1795, 0, 0, 1798, 0, 1800, 0, 0, 0, 0, 0, 1806, 4358144, 6324224, 913, 913, 5006225, 913, 913, 913, 5120913, 5137297, 913, 913, 913, 913, 913, 913, 913, 5112721, 913, 913, 913, 913, 913, 5284753, 913, 913, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 6053888, 4358144, 4358144, 913, 913, 5014417, 913, 913, 913, 913, 913, 5874577, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 913, 989, 989, 989, 4358144, 6094848, 913, 4907921, 913, 5079953, 913, 5227409, 913, 5743505, 913, 913, 913, 6095761, 913, 989, 989, 4932573, 4940765, 989, 989, 989, 989, 989, 989, 5055453, 989, 989, 989, 989, 989, 989, 6054877, 989, 989, 989, 4359057, 4359057, 5014417, 4359057, 4359057, 4359057, 4907997, 989, 5080029, 989, 5227485, 989, 5743581, 989, 989, 989, 6095837, 989, 4359057, 4907921, 4359057, 5079953, 4359057, 5227409, 4359057, 5743505, 4359057, 4359057, 4359057, 6095761, 4359057, 5062656, 0, 0, 0, 0, 0, 4358144, 4358144, 0, 913, 913, 913, 913, 913, 913, 0, 0, 0, 0, 0, 0, 0, 0, 4956160, 4964352, 0, 0, 0, 0, 0, 0, 0, 0, 4816896, 4358144, 4358144, 4358144, 4358144, 6086656, 4817809, 913, 913, 913, 913, 6087569, 4817885, 5332992, 5980160, 4358144, 913, 5333905, 5981073, 913, 989, 5333981, 5981149, 989, 4359057, 5333905, 5981073, 4359057, 0, 0, 0, 0, 1811, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1820, 0, 0, 0, 0, 1825, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 528, 5439488, 5128192, 4358144, 5129105, 913, 5129181, 989, 5129105, 4359057, 0, 4358144, 913, 989, 4359057, 0, 4358144, 913, 989, 4359057, 6004736, 6004736, 6005649, 6005725, 6005649, 0, 0, 0, 450560, 450560, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 375, 0, 450560, 450560, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 1876, 1877, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1867, 0, 0, 1870, 0, 0, 0, 0, 0, 196608, 0, 0, 0, 106496, 0, 0, 4284416, 0, 0, 0, 0, 0, 0, 0, 417792, 0, 0, 417792, 0, 0, 417792, 0, 417792, 0, 0, 0, 0, 139264, 147456, 417792, 0, 0, 0, 417792, 196608, 0, 0, 5816320, 6291456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 400, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 303, 0, 0, 307, 0, 0, 0, 4956160, 4964352, 0, 0, 0, 0, 0, 0, 0, 466944, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5480448, 0, 0, 0, 0, 0, 0, 6430720, 6438912, 914, 0, 0, 0, 914, 0, 4784128, 0, 0, 0, 4849664, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 818, 0, 0, 0, 0, 0, 658, 659, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1272, 0, 0, 0, 0, 0, 0, 0, 0, 6332416, 0, 0, 0, 6389760, 0, 0, 6430720, 6438912, 990, 0, 0, 0, 990, 4358144, 4358144, 4358144, 914, 0, 0, 0, 4841472, 0, 0, 0, 4898816, 0, 0, 0, 0, 0, 0, 2383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2825, 0, 0, 0, 0, 0, 0, 0, 459222, 459222, 459222, 459222, 459222, 459222, 459222, 459222, 459222, 459222, 459222, 459222, 459222, 459222, 459222, 459222, 459222, 459379, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 1887, 0, 1889, 1865, 528, 528, 528, 528, 528, 528, 528, 528, 3516, 528, 528, 3519, 528, 528, 528, 60866, 4358144, 4358144, 483328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1243, 0, 0, 1, 24578, 3, 0, 0, 0, 0, 507904, 0, 0, 0, 507904, 0, 0, 0, 0, 0, 0, 2398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49723, 0, 0, 0, 0, 0, 327680, 0, 507904, 507904, 507904, 507904, 507904, 507904, 507904, 507904, 507904, 507904, 507904, 507904, 507904, 507904, 507904, 507904, 507904, 507904, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 2084, 0, 0, 0, 4825088, 0, 0, 0, 0, 0, 0, 0, 0, 3423, 0, 0, 0, 0, 0, 0, 0, 0, 3460, 0, 0, 0, 0, 0, 3465, 0, 4268032, 306, 307, 0, 0, 442368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1168, 1167, 0, 0, 0, 0, 0, 0, 0, 229376, 0, 491520, 524288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 678, 0, 0, 0, 0, 0, 0, 4358144, 4358144, 491520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1275, 0, 1277, 1, 24578, 3, 0, 0, 0, 0, 0, 516096, 0, 0, 0, 516096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 0, 296, 0, 0, 516567, 516567, 516567, 516567, 516567, 516567, 516567, 516567, 516567, 516567, 516567, 516567, 516567, 516567, 516567, 516567, 516567, 516567, 1, 24578, 0, 0, 0, 4366336, 0, 0, 548864, 0, 0, 302, 303, 0, 0, 0, 0, 2306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5627904, 0, 0, 0, 4268032, 306, 307, 409600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 0, 308, 0, 0, 0, 5513216, 5783552, 0, 40960, 0, 0, 0, 0, 0, 0, 0, 0, 4358144, 4358144, 4358144, 4358144, 4358144, 5193728, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4907008, 0, 5079040, 6094848, 1, 24578, 4227365, 0, 0, 0, 0, 0, 0, 299, 0, 0, 0, 299, 0, 0, 0, 0, 0, 245760, 0, 245760, 245760, 0, 0, 0, 245760, 245760, 0, 0, 0, 0, 0, 0, 245760, 0, 0, 0, 245760, 0, 0, 245760, 245760, 245760, 0, 0, 540672, 0, 0, 540672, 0, 0, 0, 540672, 0, 0, 0, 0, 0, 0, 0, 540672, 0, 0, 0, 0, 0, 0, 0, 0, 417792, 0, 0, 0, 417792, 0, 0, 0, 0, 0, 1, 24578, 4227365, 0, 0, 4366336, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 2328, 0, 0, 0, 0, 2332, 0, 0, 0, 0, 0, 0, 0, 1879, 0, 0, 0, 0, 0, 0, 0, 0, 768, 0, 0, 771, 0, 0, 0, 0, 0, 0, 499712, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1291, 0, 0, 0, 0, 499712, 0, 0, 0, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 5111808, 4358144, 4358144, 4358144, 4358144, 4358144, 5283840, 4358144, 4358144, 4358144, 4358144, 4358144, 499712, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1314, 0, 0, 0, 0, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 2355, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1882, 0, 0, 0, 0, 1, 24578, 3, 155942, 296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 528, 4087, 528, 4088, 528, 528, 57893, 528, 57893, 528, 528, 57893, 528, 528, 57916, 57893, 528, 528, 57893, 57893, 57893, 0, 0, 0, 0, 0, 0, 3821, 0, 0, 0, 0, 57916, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 57916, 57893, 57893, 57943, 57893, 57893, 57893, 0, 0, 0, 0, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61529, 57916, 57916, 57916, 57943, 57943, 58773, 914, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60631, 0, 0, 2293, 0, 2294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 664, 0, 0, 0, 0, 3453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 744, 1825, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2373, 0, 0, 0, 0, 0, 674, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1182, 0, 0, 0, 0, 0, 0, 0, 1280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1788, 0, 0, 528, 57894, 528, 57894, 528, 528, 57894, 528, 528, 57917, 57894, 528, 528, 57894, 57894, 57894, 57894, 57944, 57944, 57894, 57894, 57894, 57894, 57944, 57944, 57894, 528, 57894, 57894, 57917, 57894, 57894, 57894, 57894, 57894, 57894, 57894, 57917, 57917, 57894, 57894, 57944, 57894, 57894, 57894, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 1, 24578, 3, 155943, 296, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 740, 661, 0, 0, 528, 0, 573440, 573440, 573440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 0, 516096, 0, 0, 0, 5988352, 0, 0, 6135808, 6307840, 0, 5996544, 4800512, 0, 6356992, 3675, 0, 0, 0, 0, 0, 694, 0, 0, 0, 787, 0, 0, 0, 0, 806, 0, 0, 0, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 637, 303, 0, 0, 0, 0, 2381, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 344064, 0, 0, 0, 0, 4268032, 640, 307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1804, 0, 0, 581632, 0, 0, 0, 581632, 581632, 581632, 581632, 581632, 581632, 581632, 581632, 581632, 581632, 581632, 581632, 581632, 581632, 581632, 581632, 0, 581632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 581632, 0, 581632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 746, 581632, 581632, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 2397, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1225, 0, 0, 0, 0, 6258688, 6447104, 0, 0, 6127616, 0, 6348800, 5906432, 0, 5537792, 3827, 4882432, 0, 0, 0, 0, 0, 0, 2784, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139264, 147456, 0, 0, 0, 420, 0, 0, 0, 3926, 0, 0, 0, 0, 0, 0, 5693440, 0, 6496256, 5144576, 5136384, 0, 5914624, 0, 0, 5513216, 5783552, 0, 3926, 0, 0, 0, 0, 0, 0, 0, 0, 4358144, 4358144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 302, 0, 0, 306, 0, 0, 0, 0, 0, 0, 306, 237983, 147456, 0, 0, 0, 306, 0, 0, 311, 312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1819, 0, 0, 312, 0, 311, 311, 312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 311, 409, 312, 0, 458, 472, 472, 472, 485, 485, 485, 485, 485, 485, 485, 485, 485, 506, 485, 485, 485, 485, 485, 524, 485, 485, 485, 524, 485, 485, 485, 485, 485, 485, 529, 57895, 529, 57895, 529, 529, 57895, 529, 529, 57918, 57895, 529, 529, 57895, 57895, 57895, 57895, 57945, 57945, 57895, 57895, 57895, 57895, 57945, 57945, 57895, 529, 57895, 57895, 57918, 57895, 57895, 57895, 57895, 57895, 57895, 57895, 57918, 57918, 57895, 57895, 57945, 57895, 57895, 57895, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 0, 306, 307, 0, 0, 0, 0, 0, 645, 0, 0, 648, 649, 0, 0, 0, 0, 0, 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 745, 368, 368, 0, 0, 704, 0, 0, 0, 0, 0, 0, 0, 711, 0, 0, 0, 0, 0, 750, 0, 0, 0, 0, 645, 0, 0, 0, 0, 0, 0, 0, 6299648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 777, 0, 0, 781, 0, 0, 0, 0, 0, 0, 0, 789, 0, 0, 0, 0, 0, 0, 2807, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2310, 0, 0, 0, 0, 0, 0, 793, 0, 0, 0, 0, 0, 0, 0, 797, 0, 0, 0, 0, 0, 0, 0, 0, 557056, 557056, 0, 0, 0, 0, 0, 0, 0, 833, 793, 0, 0, 0, 0, 0, 837, 838, 0, 0, 0, 0, 793, 528, 528, 0, 57893, 57893, 57893, 57893, 57893, 57893, 155942, 1151, 0, 0, 1155, 0, 0, 0, 0, 2295, 0, 1160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1759, 528, 847, 851, 528, 528, 863, 528, 528, 528, 879, 528, 884, 528, 892, 528, 895, 528, 528, 909, 528, 57893, 57893, 57893, 58266, 58270, 57893, 57893, 58282, 57893, 57893, 57893, 58298, 57893, 58303, 57893, 58311, 57893, 58314, 57893, 57893, 58328, 57893, 0, 57916, 57916, 57916, 58342, 58346, 57916, 57916, 58358, 57916, 57916, 57916, 58374, 57916, 58379, 57916, 58387, 57916, 58390, 57916, 57916, 58404, 57916, 0, 0, 0, 0, 58303, 57943, 57943, 57943, 58417, 58421, 57943, 57943, 58433, 57943, 57943, 528, 528, 528, 57893, 57893, 57893, 0, 0, 3655, 0, 3657, 0, 0, 0, 0, 0, 2356, 0, 2358, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5693440, 0, 6496256, 5144576, 5136384, 0, 5914624, 57943, 58449, 57943, 58454, 57943, 58462, 57943, 58465, 57943, 57943, 58479, 57943, 847, 851, 1141, 895, 1159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 747, 0, 0, 0, 1320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 302, 0, 0, 528, 528, 528, 1411, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2470, 528, 528, 0, 0, 1809, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1842, 0, 0, 1832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1201, 1885, 0, 0, 1886, 0, 0, 0, 0, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3225, 528, 528, 528, 1899, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1912, 528, 528, 528, 0, 0, 57893, 60609, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61085, 57893, 57893, 57893, 57893, 57893, 57893, 528, 528, 528, 528, 58773, 1985, 57893, 57893, 57893, 57893, 57893, 59336, 57893, 57893, 57893, 57893, 57893, 58822, 57893, 57893, 57893, 57893, 58827, 57893, 57893, 57893, 57893, 57893, 58319, 57893, 57893, 57893, 57893, 0, 57916, 57916, 58341, 57916, 57916, 57893, 59342, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59355, 57893, 57893, 57893, 57893, 57893, 58859, 57893, 57893, 57893, 58866, 57893, 50676, 58773, 990, 57916, 57916, 59442, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59455, 57916, 57916, 57916, 57916, 57916, 57916, 60387, 57916, 57916, 57916, 57916, 57916, 57916, 60394, 57916, 57916, 57916, 57916, 57916, 57916, 59514, 57916, 57916, 57916, 57916, 57916, 57916, 59520, 57916, 57916, 57916, 57916, 57916, 57943, 61127, 57943, 57943, 57943, 61130, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60968, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60721, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59610, 57943, 57943, 57943, 57943, 57943, 57943, 59616, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60982, 60984, 57943, 57943, 57943, 57943, 60988, 57943, 60990, 0, 0, 2293, 0, 2294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2300, 0, 0, 0, 0, 2806, 0, 0, 0, 0, 0, 2811, 0, 2813, 2814, 0, 0, 0, 0, 0, 483328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 801, 0, 0, 0, 0, 0, 0, 2325, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2334, 0, 0, 0, 0, 0, 0, 2822, 0, 0, 0, 0, 0, 0, 0, 0, 0, 769, 0, 0, 0, 774, 0, 0, 0, 2407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 702, 528, 2399, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2429, 528, 528, 2432, 528, 528, 2475, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2471, 528, 57893, 57893, 59863, 57893, 57893, 57893, 57893, 57893, 57893, 59871, 57893, 57893, 57893, 57893, 57893, 57893, 0, 0, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60351, 57916, 57916, 57916, 57916, 57916, 57916, 57893, 59891, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60640, 57916, 57916, 57916, 59949, 57916, 57916, 59952, 57916, 57916, 57916, 57916, 57916, 57916, 59960, 57916, 57916, 57893, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 0, 0, 0, 0, 57916, 57916, 60017, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60417, 57943, 57943, 57943, 57943, 57943, 60032, 57943, 57943, 60035, 57943, 57943, 57943, 57943, 57943, 57943, 60043, 57943, 57943, 528, 528, 528, 57893, 57893, 57893, 0, 3654, 0, 0, 0, 0, 0, 0, 0, 1325, 0, 0, 0, 1329, 0, 0, 0, 0, 57943, 57943, 60100, 57943, 57943, 57943, 57943, 2760, 528, 528, 528, 528, 60109, 57893, 57893, 57893, 0, 0, 0, 0, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59945, 57916, 0, 0, 2781, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1884, 0, 0, 0, 0, 2794, 0, 0, 0, 0, 0, 2798, 0, 0, 0, 0, 0, 0, 0, 0, 4784128, 0, 0, 0, 0, 0, 0, 0, 0, 3181, 0, 0, 0, 0, 0, 3186, 0, 57893, 60285, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60293, 57893, 57893, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 57943, 57943, 60461, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 4075, 0, 4076, 57943, 60472, 57943, 57943, 57943, 57943, 57943, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 0, 0, 0, 0, 0, 0, 0, 3150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2299, 0, 0, 0, 3160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3173, 0, 0, 0, 0, 2820, 0, 0, 0, 2824, 0, 0, 0, 0, 0, 0, 0, 703, 0, 0, 0, 0, 0, 0, 0, 0, 2331, 0, 0, 0, 0, 0, 0, 0, 0, 3189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3202, 3203, 0, 0, 3215, 0, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3226, 528, 528, 3230, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3239, 528, 528, 0, 0, 0, 0, 0, 0, 57893, 57893, 60279, 57893, 57893, 57893, 57893, 57893, 58320, 57893, 57893, 57893, 57893, 0, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 0, 0, 4289, 0, 528, 60617, 57893, 57893, 60621, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60630, 57893, 0, 0, 3137, 3138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3199, 0, 0, 0, 0, 57916, 57916, 57916, 60666, 57916, 57916, 60670, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58383, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60679, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60687, 57916, 0, 0, 0, 0, 57893, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 528, 528, 528, 57893, 57893, 57893, 57943, 57943, 57943, 57943, 60715, 57943, 57943, 60719, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59582, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60728, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60736, 0, 3430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 729, 0, 528, 3495, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2904, 528, 528, 528, 528, 3512, 528, 3514, 528, 528, 528, 528, 528, 528, 528, 528, 57893, 57893, 58259, 57893, 57893, 57893, 57893, 57893, 57893, 58292, 57893, 57893, 60879, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59389, 57893, 57893, 57893, 57893, 60897, 57893, 60899, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59399, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 60921, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 60963, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60457, 57943, 528, 4015, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 57893, 61372, 57893, 302, 306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1199, 0, 0, 61374, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 61388, 57916, 0, 0, 0, 0, 57893, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 58442, 61390, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 61404, 57943, 528, 2281, 528, 528, 528, 57893, 59630, 57893, 57893, 57893, 2290, 0, 2291, 0, 0, 0, 0, 0, 262144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 663, 0, 0, 666, 667, 0, 61406, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 0, 0, 0, 0, 0, 0, 528, 4077, 0, 0, 0, 0, 0, 0, 0, 4084, 0, 0, 528, 528, 528, 528, 4089, 0, 0, 4148, 0, 4150, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1399, 528, 528, 528, 0, 0, 0, 313, 314, 315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1240, 0, 0, 0, 0, 0, 0, 0, 427, 0, 131072, 0, 0, 0, 0, 427, 0, 0, 0, 0, 0, 427, 459, 0, 0, 0, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 459, 523, 459, 523, 523, 523, 459, 523, 523, 523, 523, 523, 523, 530, 57896, 530, 57896, 530, 530, 57896, 530, 530, 57919, 57896, 530, 530, 57896, 57896, 57896, 57896, 57946, 57946, 57896, 57896, 57896, 57896, 57946, 57946, 57896, 621, 57896, 57973, 57919, 57896, 57896, 57896, 57896, 57896, 57896, 57896, 57919, 57919, 57896, 57896, 57946, 57896, 57896, 57896, 57973, 57973, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 2830, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 680, 681, 0, 0, 0, 57893, 57893, 58307, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 0, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60350, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60915, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58942, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60389, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 58458, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 528, 528, 1965, 528, 528, 528, 528, 528, 528, 1972, 528, 528, 528, 528, 528, 528, 528, 3501, 528, 3503, 528, 528, 528, 528, 528, 528, 1360, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2887, 528, 2889, 528, 528, 528, 528, 57893, 59408, 57893, 57893, 57893, 57893, 57893, 57893, 59416, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58823, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58840, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59508, 57916, 57916, 57916, 57916, 57916, 57916, 59516, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58909, 57916, 57916, 57916, 58912, 57916, 57916, 57916, 57893, 57893, 57893, 60286, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58814, 57893, 57893, 57893, 60408, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 60414, 57943, 57943, 57943, 57943, 60418, 57943, 57943, 57943, 60473, 57943, 57943, 57943, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 0, 0, 0, 0, 2292, 528, 528, 528, 4093, 528, 4095, 528, 528, 4097, 528, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61077, 57893, 57893, 57893, 57893, 61450, 57893, 61452, 57893, 57893, 61454, 57893, 57893, 57916, 57916, 57916, 57916, 57916, 57916, 58879, 57916, 57916, 57916, 57916, 57916, 58891, 57916, 57916, 57916, 57916, 57916, 61464, 57916, 61466, 57916, 57916, 61468, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 60956, 57943, 57943, 57943, 57943, 57943, 60960, 57943, 57943, 57943, 57943, 61478, 57943, 61480, 57943, 57943, 61482, 57943, 57943, 0, 0, 0, 0, 0, 0, 0, 1766, 0, 0, 1769, 0, 0, 0, 0, 0, 320, 320, 428, 429, 131072, 436, 429, 437, 439, 428, 436, 437, 0, 316, 437, 455, 460, 473, 473, 473, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 508, 508, 521, 521, 522, 522, 508, 522, 522, 522, 508, 522, 522, 522, 522, 522, 522, 531, 57897, 531, 57897, 531, 531, 57897, 531, 531, 57920, 57897, 531, 531, 57897, 57897, 57897, 57897, 57947, 57947, 57897, 57897, 57897, 57897, 57947, 57947, 57897, 622, 57972, 57972, 57920, 57897, 57897, 57897, 57897, 57897, 57897, 57897, 57920, 57920, 57897, 57897, 57947, 57897, 57897, 57897, 57972, 57972, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 3151, 0, 0, 0, 0, 0, 3155, 0, 0, 0, 0, 0, 0, 814, 0, 0, 0, 0, 0, 0, 819, 0, 0, 0, 686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 0, 0, 0, 368, 368, 702, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2315, 0, 0, 0, 0, 0, 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 303, 0, 0, 0, 823, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 775, 0, 0, 1174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 804, 0, 0, 0, 0, 1216, 1174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2336, 0, 0, 0, 0, 0, 1281, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 342, 296, 0, 0, 0, 1295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2363, 0, 0, 1307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1229, 58773, 914, 57893, 57893, 58777, 57893, 57893, 58781, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58808, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58795, 57893, 58800, 57893, 57893, 58804, 57893, 57893, 58807, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58838, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58841, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58872, 57916, 57916, 58876, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58890, 57916, 58895, 57916, 0, 0, 0, 0, 57893, 57943, 57943, 57943, 57943, 57943, 57943, 58428, 57943, 57943, 58444, 57916, 58899, 57916, 57916, 58902, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59985, 57916, 57916, 57916, 1860, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1245, 528, 528, 528, 528, 1902, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1914, 528, 528, 0, 57893, 57893, 57893, 57893, 57893, 57893, 155942, 1151, 0, 0, 1156, 0, 0, 0, 0, 327, 327, 377, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1210, 0, 368, 368, 0, 1213, 0, 1929, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 896, 57893, 57893, 57893, 59345, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59357, 57893, 57893, 1, 24578, 3, 155942, 156282, 296, 0, 0, 0, 0, 0, 302, 303, 0, 57916, 57916, 59445, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59457, 57916, 57916, 57916, 57916, 57916, 59967, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 61474, 57943, 59541, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59553, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61152, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 528, 528, 528, 2763, 2764, 57893, 57893, 57893, 60112, 57943, 57943, 57943, 59591, 59592, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59601, 57943, 57943, 57943, 57893, 59917, 59918, 59919, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58848, 57893, 57893, 58852, 57916, 59989, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60002, 57943, 60072, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60085, 57893, 57893, 60325, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58849, 57893, 57893, 0, 0, 0, 3216, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2484, 528, 528, 528, 528, 528, 3243, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2891, 528, 528, 57893, 57893, 57893, 57893, 60634, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 0, 2999, 0, 0, 0, 61125, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60962, 528, 528, 4092, 528, 528, 528, 528, 528, 528, 528, 57893, 61444, 57893, 61445, 57893, 57893, 57893, 2589, 0, 0, 0, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61106, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59954, 57916, 57916, 59958, 57916, 57916, 57916, 59962, 57893, 61449, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 61458, 57916, 61459, 57916, 57916, 57893, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59540, 57916, 61463, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 61472, 57943, 61473, 57943, 57943, 528, 528, 1715, 528, 528, 1718, 57893, 57893, 59064, 57893, 57893, 59067, 1151, 0, 57943, 61477, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 0, 0, 0, 0, 0, 0, 0, 1814, 0, 0, 0, 0, 0, 0, 0, 0, 528, 1338, 528, 528, 528, 528, 528, 528, 528, 528, 4291, 57893, 57893, 57893, 61637, 57916, 57916, 57916, 61639, 57943, 57943, 57943, 61641, 0, 0, 0, 0, 3178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1312, 0, 0, 0, 0, 326, 327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1186, 0, 0, 0, 377, 0, 131072, 0, 0, 0, 440, 377, 0, 0, 445, 451, 0, 377, 461, 474, 474, 474, 487, 487, 487, 487, 487, 487, 487, 487, 487, 487, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 509, 532, 57898, 532, 57898, 532, 532, 57898, 532, 532, 57921, 57898, 532, 532, 57898, 57898, 57898, 57898, 57948, 57948, 57898, 57898, 57898, 57898, 57948, 57948, 57898, 532, 57898, 57898, 57921, 57898, 57898, 57898, 57898, 57898, 57898, 57898, 57921, 57921, 57898, 57898, 57948, 57898, 57898, 57898, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 1188, 0, 1190, 1191, 0, 0, 0, 1193, 1194, 0, 0, 0, 0, 0, 0, 0, 0, 4997120, 0, 0, 5038080, 0, 0, 0, 5095424, 5103616, 0, 0, 1232, 1233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 370, 0, 0, 0, 1263, 1265, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1200, 0, 1317, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1303, 0, 0, 0, 1331, 1193, 528, 528, 1390, 528, 528, 1392, 528, 528, 528, 528, 1397, 528, 528, 528, 528, 528, 528, 3500, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 61443, 57893, 57893, 57893, 57893, 57893, 58773, 914, 57893, 57893, 58778, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 2588, 2999, 0, 0, 0, 58831, 57893, 57893, 57893, 57893, 58836, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58811, 58813, 57893, 57893, 57893, 57893, 58873, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60380, 57916, 58900, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58928, 57916, 57916, 58915, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58924, 57916, 57916, 58926, 57916, 57916, 57916, 57916, 57916, 59980, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61530, 57916, 57916, 57943, 57943, 57916, 58931, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58950, 57916, 57916, 57916, 58956, 57916, 57916, 57916, 57916, 0, 58831, 57943, 57943, 58967, 57943, 57943, 57943, 57943, 57943, 57943, 60464, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60470, 57943, 57943, 57943, 57943, 59018, 57943, 57943, 59020, 57943, 57943, 57943, 57943, 59026, 57943, 57943, 57943, 528, 528, 57893, 57893, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2778, 1963, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 901, 0, 0, 2293, 0, 2294, 0, 0, 0, 0, 0, 2297, 0, 0, 0, 0, 0, 0, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 57893, 59862, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60650, 57893, 59878, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58816, 57893, 59947, 57916, 57916, 57916, 57916, 59951, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 61475, 60015, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61133, 57943, 60030, 57943, 57943, 57943, 57943, 60034, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60723, 57943, 57943, 57943, 60098, 57943, 57943, 57943, 57943, 57943, 57943, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 0, 0, 0, 1729, 0, 0, 0, 0, 2844, 0, 0, 0, 0, 0, 2849, 0, 0, 0, 0, 0, 0, 0, 1852, 0, 0, 0, 0, 0, 0, 0, 1859, 0, 57916, 57916, 57916, 60347, 57916, 60348, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58385, 57916, 57916, 57916, 57916, 58403, 57916, 0, 0, 3205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2374, 0, 0, 528, 528, 528, 528, 3253, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1926, 528, 528, 528, 57916, 60688, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60694, 57916, 57916, 57916, 57916, 57916, 57916, 58906, 58908, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59451, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59498, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60672, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 60737, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60743, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61339, 57943, 57943, 57943, 528, 57893, 0, 0, 0, 0, 0, 0, 3671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 665, 0, 0, 668, 57916, 61126, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60961, 57943, 57916, 57916, 57916, 61239, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60959, 57943, 57943, 57943, 57943, 61258, 57943, 57943, 528, 528, 57893, 57893, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2776, 2777, 0, 528, 528, 528, 528, 4018, 528, 528, 528, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 58280, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61377, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 57916, 57916, 61223, 57916, 57916, 57916, 57916, 57916, 57916, 61393, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 60025, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61409, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 0, 0, 0, 4241, 0, 4243, 528, 528, 528, 528, 528, 4094, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59372, 57893, 57893, 57893, 61451, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61318, 57916, 57916, 57916, 61465, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 61244, 57943, 57943, 57943, 57943, 57943, 57943, 61479, 57943, 57943, 57943, 57943, 57943, 57943, 0, 0, 0, 0, 0, 0, 0, 1865, 1866, 0, 0, 0, 1869, 0, 0, 0, 0, 0, 328, 329, 330, 331, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1855, 1856, 0, 1857, 1858, 0, 0, 376, 0, 0, 0, 0, 0, 328, 376, 331, 375, 0, 0, 0, 0, 0, 0, 363, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139264, 147456, 0, 0, 450560, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 376, 0, 0, 0, 0, 0, 0, 0, 0, 5210112, 0, 5365760, 0, 5554176, 5570560, 5578752, 0, 462, 475, 475, 475, 488, 488, 488, 488, 499, 501, 488, 488, 499, 488, 510, 510, 510, 510, 510, 525, 510, 510, 510, 525, 510, 510, 510, 510, 510, 510, 533, 57899, 533, 57899, 533, 533, 57899, 533, 533, 57922, 57899, 533, 533, 57899, 57899, 57899, 57899, 57949, 57949, 57899, 57899, 57899, 57899, 57949, 57949, 57899, 533, 57899, 57899, 57922, 57899, 57899, 57899, 57899, 57899, 57899, 57899, 57922, 57922, 57899, 57899, 57949, 57899, 57899, 57899, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 0, 670, 671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 683, 684, 685, 0, 0, 0, 689, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 368, 0, 0, 0, 0, 0, 0, 707, 708, 0, 0, 0, 0, 0, 714, 0, 0, 0, 718, 0, 720, 0, 0, 0, 0, 0, 0, 727, 0, 0, 0, 0, 0, 1163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6152192, 0, 0, 0, 6316032, 0, 731, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1292, 778, 779, 0, 0, 0, 0, 0, 0, 0, 0, 788, 0, 790, 0, 0, 0, 0, 0, 1201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3675, 0, 0, 0, 3830, 0, 822, 0, 0, 0, 0, 0, 822, 822, 825, 0, 0, 0, 790, 0, 0, 0, 0, 0, 1235, 0, 1237, 0, 0, 0, 0, 1242, 0, 0, 0, 0, 0, 1268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3675, 0, 0, 3829, 0, 0, 0, 0, 834, 0, 0, 0, 0, 0, 0, 0, 788, 0, 0, 0, 834, 528, 528, 0, 57893, 57893, 57893, 57893, 57893, 57893, 155942, 1151, 0, 302, 0, 0, 306, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 65536, 303, 0, 528, 848, 528, 854, 528, 528, 869, 528, 528, 880, 528, 885, 528, 528, 894, 897, 902, 528, 910, 528, 57893, 57893, 57893, 58267, 57893, 58273, 57893, 57893, 58288, 57893, 57893, 58299, 57893, 58304, 57893, 57893, 58313, 58316, 58321, 57893, 58329, 57893, 0, 57916, 57916, 57916, 58343, 57916, 0, 0, 0, 0, 57893, 57943, 57943, 57943, 57943, 57943, 57943, 58430, 57943, 57943, 57943, 57943, 57943, 59547, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61417, 57943, 0, 0, 0, 58349, 57916, 57916, 58364, 57916, 57916, 58375, 57916, 58380, 57916, 57916, 58389, 58392, 58397, 57916, 58405, 57916, 0, 0, 0, 0, 58304, 57943, 57943, 57943, 58418, 57943, 58424, 57943, 57943, 58439, 57943, 1906, 528, 528, 528, 528, 59349, 57893, 57893, 57893, 57893, 0, 0, 0, 0, 0, 3140, 0, 0, 3143, 3144, 0, 0, 3147, 3148, 0, 57943, 58450, 57943, 58455, 57943, 57943, 58464, 58467, 58472, 57943, 58480, 57943, 848, 528, 528, 1142, 902, 528, 0, 57893, 58267, 57893, 58492, 58321, 57893, 155942, 1151, 0, 0, 0, 0, 0, 0, 364, 365, 366, 367, 0, 0, 368, 0, 296, 0, 0, 0, 0, 1176, 0, 0, 0, 0, 0, 0, 0, 1183, 0, 0, 0, 0, 0, 0, 3165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139264, 147456, 0, 0, 0, 421, 0, 0, 1203, 1204, 0, 0, 0, 0, 1208, 0, 0, 0, 368, 368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 713, 0, 0, 1231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1244, 0, 0, 0, 1248, 0, 0, 1200, 0, 0, 0, 0, 0, 749, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 726, 0, 0, 0, 0, 528, 1347, 528, 528, 528, 528, 528, 528, 1362, 528, 528, 528, 1367, 528, 528, 528, 528, 528, 2464, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1910, 528, 528, 528, 528, 58773, 914, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58786, 57893, 57893, 57893, 0, 0, 0, 0, 57916, 57916, 57916, 57916, 57916, 57916, 59944, 57916, 57916, 57893, 57893, 57893, 58801, 57893, 57893, 57893, 58806, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58809, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58854, 57893, 57893, 57893, 57893, 57893, 57893, 58865, 57893, 50676, 58773, 990, 57916, 57916, 57893, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59537, 57943, 57943, 528, 1351, 528, 1408, 528, 528, 58790, 57893, 57893, 58847, 57893, 57893, 1151, 0, 57916, 57916, 57916, 58901, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58391, 57916, 57916, 57916, 57916, 57916, 57916, 58918, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58396, 57916, 57916, 57916, 57916, 57916, 57916, 58933, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58949, 57916, 0, 0, 0, 0, 57893, 57943, 57943, 57943, 57943, 57943, 57943, 58431, 57943, 57943, 57943, 57943, 57943, 60063, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60428, 57943, 60430, 57943, 57943, 57943, 57943, 58975, 57943, 57943, 57943, 57943, 57943, 57943, 58990, 57943, 57943, 57943, 58995, 57943, 2280, 528, 2282, 528, 528, 59629, 57893, 59631, 57893, 57893, 0, 0, 0, 0, 0, 0, 1298, 0, 0, 0, 0, 1303, 0, 0, 0, 0, 59055, 57943, 528, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 1151, 1724, 0, 1760, 0, 0, 1763, 1764, 1765, 0, 1767, 1768, 0, 0, 0, 0, 1773, 0, 0, 0, 0, 3192, 0, 0, 0, 0, 3197, 0, 0, 0, 0, 0, 0, 0, 2368, 2369, 0, 0, 0, 0, 0, 0, 0, 692, 0, 0, 0, 0, 0, 0, 699, 368, 1807, 0, 0, 0, 0, 0, 0, 0, 0, 1816, 1817, 0, 0, 0, 0, 0, 0, 373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139264, 147456, 0, 0, 352256, 0, 0, 0, 1823, 0, 0, 1825, 0, 0, 0, 0, 0, 0, 0, 0, 1829, 1830, 1831, 0, 1870, 0, 0, 0, 1888, 1740, 1740, 1890, 528, 1892, 528, 1893, 1894, 528, 1896, 528, 528, 528, 1900, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1913, 528, 528, 0, 0, 0, 0, 0, 0, 57893, 60278, 57893, 57893, 57893, 57893, 57893, 57893, 0, 2592, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59969, 57916, 57916, 57916, 57916, 57916, 57916, 59974, 57916, 528, 528, 1917, 528, 528, 528, 528, 1921, 528, 1923, 528, 528, 528, 528, 528, 528, 1393, 528, 1395, 528, 528, 528, 528, 528, 528, 528, 872, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3710, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1933, 1934, 1936, 528, 528, 528, 528, 528, 528, 528, 1944, 1945, 528, 1947, 528, 528, 1950, 1951, 528, 528, 528, 528, 528, 528, 528, 1959, 528, 1961, 528, 1964, 528, 528, 528, 528, 528, 1971, 528, 528, 1973, 528, 528, 528, 528, 528, 528, 3855, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 58279, 57893, 57893, 57893, 57893, 57893, 528, 528, 528, 528, 58773, 0, 59332, 57893, 59334, 57893, 59335, 57893, 59337, 57893, 59339, 57893, 302, 306, 0, 0, 0, 0, 3141, 0, 0, 0, 3145, 0, 0, 0, 0, 0, 0, 2832, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2835, 0, 0, 0, 0, 0, 0, 57893, 57893, 59343, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59356, 57893, 57893, 57893, 0, 0, 0, 0, 57916, 57916, 57916, 57916, 59942, 57916, 57916, 57916, 57916, 57916, 59515, 57916, 57916, 59517, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 0, 57893, 57943, 57943, 58966, 57943, 57943, 58970, 57943, 57893, 59360, 57893, 57893, 57893, 57893, 59364, 57893, 59366, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58839, 57893, 57893, 58846, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59376, 59377, 59379, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59387, 59388, 57893, 2770, 2291, 0, 2771, 2294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 770, 0, 0, 0, 0, 0, 59390, 57893, 57893, 59393, 59394, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59402, 57893, 59404, 57893, 2770, 2291, 0, 2771, 2294, 0, 0, 0, 0, 0, 0, 2775, 0, 0, 0, 0, 0, 784, 0, 0, 679, 0, 0, 0, 0, 0, 0, 0, 660, 661, 0, 0, 0, 0, 0, 0, 0, 384, 0, 139264, 147456, 0, 406, 0, 0, 406, 59407, 57893, 57893, 57893, 57893, 57893, 59415, 57893, 57893, 59417, 57893, 57893, 57893, 57893, 57893, 57893, 0, 0, 57916, 57916, 57916, 57916, 60660, 57916, 57916, 57916, 57916, 59443, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59456, 57916, 57916, 57916, 57916, 57916, 58878, 57916, 57916, 57916, 58882, 57916, 57916, 58893, 57916, 57916, 58897, 59460, 57916, 57916, 57916, 57916, 59464, 57916, 59466, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59467, 59468, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59476, 59477, 59479, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59487, 59488, 57916, 59490, 57916, 57916, 59493, 59494, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59502, 57916, 59504, 57916, 59507, 57943, 57943, 57943, 59560, 57943, 59562, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60987, 57943, 57943, 57943, 59572, 59573, 59575, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59583, 59584, 57943, 57943, 59586, 57943, 57943, 57943, 57943, 57943, 60731, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60081, 57943, 57943, 57943, 57943, 57943, 59589, 59590, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59598, 57943, 59600, 57943, 59603, 57943, 57943, 57943, 57943, 57943, 60739, 57943, 57943, 57943, 60742, 57943, 60744, 57943, 57943, 57943, 57943, 57943, 57943, 60740, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59023, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59611, 57943, 57943, 59613, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60039, 57943, 57943, 57943, 57943, 57943, 57943, 0, 0, 2293, 0, 2294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2301, 0, 0, 2304, 2305, 0, 0, 0, 2309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6406144, 5357568, 0, 5505024, 0, 0, 0, 0, 2352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1276, 0, 1825, 0, 2365, 0, 0, 0, 0, 0, 0, 0, 0, 2372, 0, 0, 2375, 0, 0, 0, 0, 3217, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2929, 528, 528, 528, 0, 2378, 0, 0, 0, 0, 0, 0, 2385, 0, 2387, 0, 0, 0, 0, 0, 0, 403, 0, 0, 0, 0, 0, 0, 0, 0, 332, 333, 0, 0, 0, 0, 0, 0, 0, 0, 334, 335, 336, 0, 0, 0, 0, 0, 0, 0, 0, 2396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 697, 698, 0, 368, 2406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2417, 0, 0, 0, 0, 3433, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 786, 0, 0, 0, 528, 2433, 528, 2435, 528, 528, 528, 528, 528, 528, 2443, 528, 2445, 528, 528, 528, 528, 528, 1414, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1956, 528, 528, 528, 528, 528, 528, 528, 528, 2451, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2902, 528, 528, 2473, 528, 528, 528, 528, 528, 528, 2480, 528, 528, 528, 528, 528, 528, 528, 528, 1906, 528, 528, 528, 528, 528, 528, 528, 57893, 57893, 57893, 59864, 57893, 59866, 57893, 57893, 57893, 57893, 57893, 57893, 59874, 57893, 59876, 57893, 2770, 2291, 0, 2771, 2294, 0, 0, 2773, 0, 0, 0, 0, 0, 0, 0, 0, 2359296, 418, 418, 0, 0, 0, 0, 0, 57893, 57893, 59904, 59905, 57893, 57893, 57893, 57893, 57893, 57893, 59912, 57893, 57893, 57893, 57893, 57893, 57893, 60885, 57893, 60887, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59397, 57893, 57893, 59400, 57893, 57893, 57893, 57893, 57893, 59930, 59931, 57893, 0, 0, 0, 0, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58910, 57916, 57916, 57916, 57916, 57916, 57916, 59963, 57916, 59965, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59971, 57916, 57916, 57916, 57916, 57916, 57916, 60914, 57916, 57916, 57916, 57916, 57916, 60918, 57916, 57916, 57916, 57916, 60016, 57916, 57916, 60019, 60020, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 0, 4239, 0, 0, 0, 0, 528, 60046, 57943, 60048, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60054, 57943, 57943, 57943, 57943, 57943, 57943, 58979, 58986, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60079, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60099, 57943, 57943, 60102, 60103, 57943, 2435, 528, 2762, 528, 528, 59866, 57893, 60111, 57893, 57893, 57893, 57893, 57893, 61083, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61089, 57893, 57893, 57893, 57893, 57893, 61219, 57893, 57893, 57893, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 1272, 57893, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 528, 3132, 528, 528, 528, 57893, 60479, 57893, 57893, 0, 0, 2829, 0, 0, 0, 0, 2833, 0, 0, 0, 0, 0, 0, 0, 0, 312, 311, 0, 0, 0, 311, 311, 312, 2905, 528, 528, 528, 528, 2909, 528, 528, 528, 2914, 528, 528, 528, 528, 528, 528, 1920, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1908, 528, 528, 528, 528, 528, 528, 528, 528, 2922, 528, 528, 528, 528, 528, 528, 528, 2927, 528, 528, 528, 528, 528, 528, 3940, 528, 528, 528, 528, 528, 528, 3946, 528, 528, 60284, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59406, 60296, 57893, 60298, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59403, 57893, 57893, 57893, 60324, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60332, 57893, 57893, 57893, 57893, 57893, 57893, 61096, 57893, 57893, 57893, 57893, 57916, 57916, 57916, 57916, 57916, 57916, 60703, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 58466, 57943, 57943, 57943, 57943, 528, 528, 528, 896, 57893, 57893, 57893, 60338, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 0, 2999, 0, 0, 0, 0, 0, 1323, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2836, 2837, 0, 0, 0, 0, 57916, 60382, 57916, 57916, 57916, 57916, 60386, 57916, 57916, 57916, 60391, 57916, 57916, 57916, 57916, 57916, 57916, 60926, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59956, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60399, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60405, 57916, 57916, 57916, 57916, 57916, 59992, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58925, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 60447, 57943, 57943, 57943, 57943, 60451, 57943, 57943, 57943, 60456, 57943, 57943, 528, 1352, 528, 528, 1717, 528, 58791, 57893, 57893, 57893, 59066, 57893, 1151, 0, 0, 0, 3177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2390, 0, 0, 528, 528, 528, 528, 3232, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1941, 528, 528, 528, 528, 528, 3251, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2892, 528, 57893, 57893, 57893, 57893, 60643, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 50676, 58773, 990, 57916, 57916, 3442, 3443, 0, 3444, 0, 3446, 0, 0, 0, 0, 3448, 0, 0, 0, 0, 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2360, 0, 0, 0, 0, 0, 2364, 3467, 0, 0, 0, 0, 3472, 3473, 0, 3475, 0, 0, 3478, 0, 0, 0, 3481, 528, 528, 528, 528, 3498, 528, 528, 528, 528, 528, 3504, 528, 528, 528, 528, 528, 528, 4020, 528, 4022, 4023, 528, 4025, 528, 57893, 57893, 57893, 57893, 57893, 57893, 60882, 57893, 57893, 57893, 57893, 57893, 60888, 57893, 57893, 60891, 57893, 57893, 57893, 0, 0, 0, 0, 57916, 57916, 57916, 59941, 57916, 59943, 57916, 57916, 57916, 57916, 57916, 60006, 60007, 60008, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58943, 57916, 57916, 58947, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60924, 57916, 57916, 57916, 57916, 57916, 60930, 57916, 57916, 60933, 57916, 57916, 57893, 57943, 57943, 57943, 57943, 57943, 59532, 57943, 57943, 57943, 57943, 57943, 59538, 57943, 60991, 57943, 528, 528, 3650, 57893, 57893, 60997, 0, 0, 0, 0, 0, 0, 3659, 0, 0, 0, 0, 3445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2812, 0, 0, 2815, 0, 0, 3662, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1306, 0, 3669, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3676, 0, 3678, 528, 528, 528, 528, 3705, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2458, 528, 528, 528, 528, 528, 3715, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2903, 528, 528, 57893, 57893, 57893, 61071, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61076, 57893, 57893, 57893, 0, 0, 0, 0, 57916, 57916, 59940, 57916, 57916, 57916, 57916, 57916, 57916, 59981, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59453, 57916, 57916, 57916, 57916, 57916, 57916, 57893, 57893, 57893, 57893, 61095, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 57916, 57916, 61100, 57916, 0, 0, 0, 0, 57893, 57943, 57943, 57943, 57943, 57943, 57943, 58432, 57943, 57943, 57943, 57943, 57943, 60075, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59048, 57943, 57943, 57943, 57943, 61134, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61145, 3832, 0, 0, 3835, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 772, 0, 0, 0, 57916, 57916, 61238, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61142, 57943, 57943, 57943, 3924, 0, 3675, 0, 0, 0, 0, 0, 3932, 0, 0, 0, 0, 0, 0, 0, 312, 0, 0, 0, 0, 0, 311, 0, 311, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61301, 57893, 57893, 57893, 57893, 57893, 59363, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60315, 57893, 57893, 57893, 57893, 60319, 57893, 57893, 57943, 61333, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 528, 57893, 0, 0, 0, 0, 0, 1736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2334720, 0, 2334720, 0, 0, 0, 0, 0, 0, 4079, 0, 0, 0, 0, 0, 0, 0, 528, 528, 528, 528, 528, 528, 528, 4157, 528, 4159, 528, 528, 4091, 528, 528, 528, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 57916, 61448, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61317, 57916, 61462, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60028, 57943, 61476, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 4141, 4142, 0, 0, 0, 4145, 528, 528, 61507, 61508, 61509, 57893, 57893, 57893, 61512, 57893, 61514, 57893, 57893, 57893, 57893, 61519, 61520, 61521, 61522, 57916, 57916, 57916, 61525, 57916, 61527, 57916, 57916, 57916, 57916, 61532, 61533, 61534, 61535, 57943, 57943, 57943, 61538, 57943, 61540, 57943, 57943, 57943, 57943, 61545, 0, 0, 0, 0, 0, 0, 3194, 0, 0, 0, 3198, 0, 3200, 0, 0, 0, 528, 4245, 528, 528, 528, 4249, 57893, 57893, 61595, 57893, 57893, 57893, 61599, 57893, 57916, 57916, 57893, 57943, 59529, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59536, 57943, 57943, 57943, 57943, 57943, 59040, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 528, 3412, 528, 57893, 60759, 57893, 61601, 57916, 57916, 57916, 61605, 57916, 57943, 57943, 61607, 57943, 57943, 57943, 61611, 57943, 0, 0, 0, 0, 0, 2342912, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4358144, 4359058, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 6275072, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 0, 413, 0, 0, 0, 0, 0, 0, 413, 139264, 147456, 0, 0, 0, 422, 0, 0, 0, 0, 3456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 749, 0, 0, 0, 0, 372, 372, 0, 430, 131072, 372, 430, 430, 0, 333, 372, 430, 0, 0, 430, 456, 430, 0, 0, 0, 430, 495, 495, 495, 500, 495, 495, 495, 500, 495, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 430, 534, 57900, 534, 57900, 534, 534, 57900, 534, 534, 57923, 57900, 534, 534, 57900, 57900, 57900, 57900, 57950, 57950, 57900, 57900, 57900, 57900, 57950, 57950, 57900, 534, 57900, 57900, 57923, 57900, 57900, 57900, 57900, 57900, 57900, 57900, 57923, 57923, 57900, 57900, 57950, 57900, 57900, 57900, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 841, 528, 528, 528, 528, 528, 528, 873, 528, 528, 528, 528, 528, 528, 528, 528, 1939, 528, 528, 528, 528, 528, 528, 528, 0, 0, 1175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2416, 0, 0, 0, 0, 0, 1296, 0, 1175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2371, 0, 0, 0, 0, 0, 58773, 914, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58784, 57893, 57893, 57893, 57893, 57893, 57893, 61210, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60626, 57893, 57893, 60629, 57893, 57893, 57893, 58796, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59424, 57943, 58973, 57943, 57943, 57943, 57943, 57943, 58985, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60053, 57943, 57943, 57943, 57943, 57943, 57943, 0, 1873, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1743, 1744, 57943, 60460, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60726, 57943, 61135, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61257, 528, 528, 528, 61636, 57893, 57893, 57893, 61638, 57916, 57916, 57916, 61640, 57943, 57943, 57943, 0, 0, 0, 0, 3471, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1868, 0, 0, 0, 0, 0, 0, 0, 431, 131072, 0, 431, 431, 0, 0, 0, 431, 446, 0, 431, 0, 0, 0, 0, 3663, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1289, 0, 0, 0, 0, 431, 476, 476, 476, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 535, 57901, 535, 57901, 535, 535, 57901, 535, 535, 57924, 57901, 535, 535, 57901, 57901, 57901, 57901, 57951, 57951, 57901, 57901, 57901, 57901, 57951, 57951, 57901, 535, 57901, 57901, 57924, 57901, 57901, 57901, 57901, 57901, 57901, 57901, 57924, 57924, 57901, 57901, 57951, 57901, 57901, 57901, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 528, 528, 528, 528, 58773, 1986, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59353, 57893, 57893, 57893, 57893, 57893, 0, 0, 0, 2327, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 773, 0, 0, 776, 2351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1774, 57893, 57893, 59892, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59900, 57893, 57893, 0, 0, 0, 2805, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 800, 0, 0, 528, 3175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1790, 0, 0, 3431, 0, 0, 0, 0, 0, 3437, 0, 0, 0, 0, 0, 0, 0, 331, 0, 139264, 147456, 0, 0, 0, 0, 0, 3482, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1372, 57893, 57893, 57893, 57893, 60883, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60893, 60908, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60396, 60935, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60944, 57916, 57916, 60947, 57916, 57916, 57893, 59528, 57943, 59530, 57943, 59531, 57943, 59533, 57943, 59535, 57943, 57943, 57943, 59539, 57916, 60950, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59012, 57943, 57943, 60977, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60986, 57943, 57943, 60989, 57943, 57943, 57943, 57943, 57943, 60966, 57943, 57943, 57943, 57943, 57943, 60972, 57943, 57943, 60975, 57943, 57943, 57943, 57943, 57943, 60750, 57943, 57943, 57943, 57943, 528, 528, 528, 57893, 57893, 57893, 0, 0, 0, 0, 0, 0, 0, 3660, 528, 528, 528, 528, 3716, 528, 3718, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3491, 528, 528, 528, 528, 528, 528, 57893, 57893, 61070, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59385, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61082, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61088, 57893, 61090, 57943, 61146, 57943, 61148, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 528, 57893, 0, 0, 0, 528, 528, 528, 528, 3854, 528, 528, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 58277, 57893, 57893, 58293, 57893, 57893, 61216, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61229, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61235, 57916, 57916, 57916, 57916, 57916, 61467, 57916, 57916, 61469, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60449, 57943, 57943, 60453, 57943, 57943, 57943, 57943, 57943, 61248, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61254, 57943, 57943, 57943, 57943, 57943, 57943, 58980, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60734, 57943, 57943, 57943, 57943, 57943, 57916, 61625, 61626, 57916, 57916, 57943, 57943, 61629, 61630, 57943, 57943, 0, 0, 0, 0, 528, 528, 528, 528, 4275, 528, 57893, 57893, 57893, 57893, 61623, 57893, 57916, 0, 761, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1789, 0, 761, 0, 0, 0, 0, 0, 761, 761, 0, 0, 828, 0, 0, 0, 0, 0, 0, 738, 0, 644, 738, 0, 742, 743, 644, 0, 0, 528, 528, 852, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2919, 528, 528, 528, 528, 911, 57893, 57893, 57893, 57893, 58271, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58862, 57893, 57893, 57893, 50676, 58773, 990, 57916, 58871, 58406, 0, 0, 0, 0, 57893, 57943, 57943, 57943, 57943, 58422, 57943, 57943, 57943, 57943, 57943, 57943, 58981, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60985, 57943, 57943, 57943, 57943, 57943, 528, 911, 0, 58271, 57893, 57893, 57893, 57893, 58330, 155942, 1151, 0, 0, 0, 0, 0, 0, 751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139264, 147456, 0, 0, 319, 0, 0, 0, 1279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2337, 0, 57943, 59035, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59028, 57943, 528, 528, 528, 1983, 58773, 0, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59418, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59427, 50676, 0, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60377, 57916, 57916, 57916, 57916, 59527, 57893, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60746, 57943, 59623, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 0, 0, 0, 0, 0, 0, 0, 3142, 0, 0, 0, 0, 0, 0, 0, 752, 0, 0, 0, 0, 0, 0, 758, 0, 59861, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59889, 57916, 57916, 57916, 57916, 59950, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60675, 57916, 57916, 60678, 57943, 57943, 57943, 57943, 60033, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60042, 57943, 57943, 57943, 3812, 528, 57893, 61158, 57893, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, 57916, 57916, 57916, 57916, 61240, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61255, 57943, 57943, 57943, 57943, 61259, 57943, 528, 528, 57893, 57893, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3146, 0, 0, 0, 0, 0, 334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 334, 385, 387, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, 0, 3672, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1786, 0, 0, 0, 0, 334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 334, 0, 0, 139264, 147456, 0, 0, 0, 0, 0, 425, 425, 0, 0, 131072, 425, 0, 0, 0, 0, 425, 0, 447, 0, 0, 425, 335, 477, 477, 477, 490, 490, 490, 490, 490, 490, 490, 490, 490, 490, 511, 519, 519, 519, 519, 519, 526, 519, 519, 519, 526, 519, 519, 519, 519, 519, 519, 536, 57902, 536, 57902, 536, 536, 57902, 536, 536, 57925, 57902, 536, 536, 57902, 57902, 57902, 57902, 57952, 57952, 57902, 57902, 57902, 57902, 57952, 57952, 57902, 536, 57902, 57902, 57925, 57902, 57902, 57902, 57902, 57902, 57902, 57902, 57925, 57925, 57902, 57902, 57952, 57902, 57902, 57902, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 780, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2789, 2790, 0, 0, 795, 0, 0, 0, 0, 0, 0, 0, 799, 0, 0, 0, 0, 0, 0, 0, 2330, 0, 0, 0, 0, 0, 0, 0, 0, 1238, 0, 0, 0, 0, 0, 0, 0, 819, 0, 0, 0, 0, 0, 819, 819, 0, 0, 0, 0, 799, 0, 0, 0, 0, 0, 1750, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2850, 0, 0, 0, 0, 0, 0, 0, 0, 835, 795, 0, 0, 835, 0, 0, 0, 0, 0, 0, 0, 528, 528, 528, 4154, 528, 528, 528, 528, 528, 528, 528, 3234, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3942, 528, 528, 528, 528, 528, 528, 528, 528, 528, 855, 528, 864, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3944, 528, 528, 528, 528, 528, 528, 528, 912, 57893, 57893, 57893, 57893, 57893, 58274, 57893, 58283, 57893, 57893, 57893, 57893, 57893, 59395, 59396, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59897, 57893, 57893, 57893, 57893, 57893, 57893, 58350, 57916, 58359, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58401, 57916, 57916, 58407, 0, 0, 0, 0, 57893, 57943, 57943, 57943, 57943, 57943, 58425, 57943, 58434, 57943, 57943, 528, 1354, 528, 528, 528, 528, 58793, 57893, 57893, 57893, 57893, 57893, 1151, 0, 1143, 912, 0, 57893, 57893, 57893, 57893, 58493, 58331, 155942, 1151, 0, 0, 0, 0, 0, 0, 790, 0, 802, 0, 816, 0, 0, 0, 0, 810, 1246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1821, 0, 0, 0, 1308, 0, 0, 0, 0, 0, 0, 0, 0, 1313, 0, 0, 0, 0, 0, 1796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1211, 368, 368, 0, 0, 1214, 528, 528, 528, 1350, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1369, 528, 528, 0, 0, 0, 2933, 0, 1986, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59884, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 528, 1409, 528, 528, 1413, 528, 528, 528, 528, 528, 1420, 528, 528, 528, 1427, 528, 528, 0, 57893, 57893, 57893, 58315, 57893, 57893, 155942, 1151, 0, 0, 0, 0, 0, 0, 0, 6324224, 4358144, 4358144, 5005312, 4358144, 4358144, 4358144, 5120000, 5136384, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 6119424, 4358144, 6168576, 4358144, 4358144, 4358144, 4358144, 58773, 914, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58789, 57893, 57893, 57893, 57893, 57893, 61379, 57893, 61381, 61382, 57893, 61384, 57893, 61386, 57916, 57916, 57916, 57916, 57916, 60385, 57916, 57916, 57916, 57916, 57916, 57916, 60393, 57916, 57916, 57916, 57916, 57916, 60691, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59484, 57916, 57916, 57916, 57916, 57916, 57893, 57893, 58818, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59914, 57893, 57893, 57916, 58954, 57916, 57916, 57916, 58961, 57916, 0, 57893, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61140, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60969, 57943, 60971, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59038, 57943, 57943, 59042, 57943, 57943, 57943, 57943, 57943, 59049, 57943, 57943, 57943, 528, 528, 57893, 57893, 0, 0, 0, 0, 0, 0, 0, 0, 3923, 59056, 57943, 528, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 1151, 0, 0, 0, 0, 4003, 3675, 0, 0, 0, 0, 0, 0, 0, 0, 528, 528, 528, 528, 528, 528, 528, 1345, 1844, 1845, 0, 1847, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 806, 0, 0, 0, 0, 1861, 0, 1863, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 839, 0, 0, 528, 0, 0, 0, 1875, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 990, 0, 0, 0, 0, 0, 1861, 0, 0, 0, 0, 0, 528, 528, 528, 528, 528, 528, 528, 528, 3223, 528, 528, 528, 528, 528, 528, 1949, 528, 528, 528, 528, 528, 528, 528, 528, 1958, 528, 528, 528, 528, 528, 2478, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1421, 528, 528, 528, 528, 528, 528, 528, 528, 1967, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1977, 1979, 57893, 57893, 59392, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59401, 57893, 57893, 57893, 57893, 57893, 59414, 57893, 57893, 57893, 57893, 57893, 57893, 59420, 57893, 57893, 57893, 57893, 57893, 59410, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59421, 59423, 57893, 57893, 57893, 57893, 57893, 61453, 57893, 57893, 61455, 57893, 57916, 57916, 57916, 57916, 57916, 57916, 59482, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59983, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59492, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59501, 57916, 57916, 57916, 57916, 57916, 57916, 60940, 60942, 57916, 57916, 57916, 57916, 60946, 57916, 60948, 60949, 57916, 59510, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59521, 59523, 57916, 57916, 57916, 57916, 57916, 61570, 57916, 61571, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60416, 57943, 57943, 57943, 59588, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59597, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59043, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 58988, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59606, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59617, 59619, 57943, 57943, 57943, 528, 528, 57893, 57893, 0, 0, 0, 0, 0, 3921, 0, 0, 0, 0, 0, 1812, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1839, 0, 0, 0, 0, 0, 0, 0, 2340, 0, 0, 0, 0, 0, 2346, 0, 0, 0, 0, 0, 0, 0, 372, 0, 0, 0, 380, 382, 0, 0, 0, 0, 0, 0, 2354, 0, 0, 0, 0, 0, 0, 0, 0, 2362, 0, 0, 0, 0, 0, 1835, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 528, 528, 528, 528, 528, 2424, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3722, 528, 528, 528, 528, 528, 528, 528, 2436, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2930, 528, 528, 528, 2463, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3240, 3241, 0, 0, 0, 57893, 57893, 57893, 57893, 57893, 57893, 59855, 57893, 57893, 57893, 57893, 57893, 57893, 0, 0, 57916, 60658, 57916, 57916, 57916, 57916, 57916, 57916, 58940, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59518, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60003, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58951, 57916, 57916, 57916, 57916, 60018, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 60027, 57943, 57943, 528, 1355, 528, 528, 528, 528, 58794, 57893, 57893, 57893, 57893, 57893, 1151, 0, 57943, 60086, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59570, 57943, 57943, 57943, 57943, 60101, 57943, 57943, 57943, 2436, 528, 528, 528, 528, 59867, 57893, 57893, 57893, 0, 0, 0, 0, 57916, 59939, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60927, 57916, 60929, 57916, 57916, 57916, 57916, 57916, 57916, 0, 2793, 0, 2795, 0, 0, 0, 0, 0, 0, 0, 0, 2800, 0, 0, 2803, 0, 0, 2818, 0, 0, 0, 0, 0, 0, 0, 2826, 0, 0, 0, 0, 2828, 0, 2842, 0, 0, 2845, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2855, 0, 0, 528, 2869, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2918, 528, 528, 57893, 57893, 57893, 57893, 60327, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 57916, 61099, 57916, 57916, 60336, 57893, 57893, 57893, 60339, 57893, 57893, 57893, 57893, 57893, 57893, 0, 0, 0, 0, 0, 0, 2772, 0, 0, 0, 0, 0, 0, 0, 0, 2359, 0, 0, 0, 0, 0, 0, 0, 0, 57916, 60345, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58894, 57916, 57916, 57943, 60433, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60438, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59549, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60067, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60444, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60452, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59595, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61543, 57943, 57943, 0, 0, 0, 0, 60459, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60468, 57943, 57943, 57943, 528, 528, 57893, 57893, 0, 0, 0, 3919, 0, 0, 3922, 0, 0, 60471, 57943, 57943, 57943, 57943, 57943, 57943, 3131, 528, 528, 528, 528, 60478, 57893, 57893, 57893, 0, 0, 0, 0, 59938, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59946, 3204, 0, 0, 0, 3206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1818, 0, 0, 0, 0, 528, 528, 528, 528, 3244, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3249, 528, 528, 528, 3252, 528, 3254, 528, 528, 528, 528, 528, 528, 528, 3258, 528, 528, 0, 0, 2503, 0, 0, 0, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59858, 57893, 57893, 57893, 60632, 57893, 57893, 57893, 57893, 60635, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59924, 57893, 59926, 57893, 57893, 57893, 57893, 60641, 57893, 57893, 57893, 60644, 57893, 60646, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58843, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60651, 57893, 57893, 57893, 57893, 57893, 0, 0, 57916, 57916, 57916, 60659, 57916, 57916, 57916, 57916, 57916, 58905, 57916, 58907, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60362, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60664, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59458, 57916, 57916, 57916, 60680, 60681, 57916, 57916, 57916, 57916, 60684, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 60022, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61153, 57943, 57943, 57943, 57943, 57943, 57943, 528, 57916, 57916, 57916, 57916, 60690, 57916, 57916, 57916, 60693, 57916, 60695, 57916, 57916, 57916, 57916, 57916, 57916, 61105, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58944, 57916, 57916, 57916, 57916, 57916, 58952, 57916, 57916, 57916, 60700, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 60708, 57943, 57943, 57943, 528, 528, 57893, 57893, 3918, 0, 0, 0, 3920, 0, 0, 0, 0, 0, 0, 3695, 0, 3697, 528, 528, 528, 528, 528, 528, 528, 1905, 528, 528, 528, 528, 528, 528, 528, 528, 2926, 528, 528, 528, 528, 528, 528, 528, 57943, 57943, 60713, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61144, 57943, 57943, 57943, 57943, 60729, 60730, 57943, 57943, 57943, 57943, 60733, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60036, 57943, 60038, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 58984, 57943, 58989, 57943, 57943, 58993, 57943, 57943, 58996, 57943, 57943, 57943, 57943, 60749, 57943, 57943, 57943, 57943, 57943, 528, 528, 528, 57893, 57893, 57893, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3417, 0, 0, 3420, 3421, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1827, 0, 0, 0, 0, 528, 528, 528, 528, 3486, 528, 528, 528, 528, 3490, 528, 528, 528, 528, 528, 528, 1952, 1953, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3517, 528, 528, 528, 528, 528, 57893, 528, 3496, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2931, 528, 3510, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 57893, 57893, 57893, 61204, 57893, 57893, 57893, 60870, 57893, 57893, 57893, 57893, 60874, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58863, 58864, 57893, 57893, 50676, 58773, 990, 57916, 57916, 60880, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59901, 57893, 60895, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58830, 57893, 57916, 57916, 57916, 57916, 60912, 57916, 57916, 57916, 57916, 60916, 57916, 57916, 57916, 57916, 57916, 57916, 58962, 0, 58963, 58964, 57943, 57943, 57943, 57943, 57943, 58971, 57916, 60922, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59472, 57916, 57916, 57916, 60937, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58927, 57916, 58929, 57916, 57943, 57943, 57943, 57943, 60954, 57943, 57943, 57943, 57943, 60958, 57943, 57943, 57943, 57943, 57943, 57943, 58982, 57943, 57943, 57943, 57943, 58992, 57943, 57943, 57943, 57943, 57943, 57943, 60964, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61256, 57943, 57943, 57943, 57943, 60979, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60974, 57943, 60976, 528, 528, 57893, 57893, 57893, 0, 0, 0, 0, 3819, 0, 0, 0, 0, 0, 3822, 0, 528, 528, 528, 528, 528, 528, 3844, 528, 528, 528, 528, 528, 528, 528, 528, 2481, 528, 528, 528, 528, 528, 2485, 2486, 57893, 57893, 61206, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59927, 57893, 57893, 57893, 57893, 61217, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 57916, 57916, 57916, 57916, 57916, 61225, 0, 0, 3675, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3934, 0, 0, 0, 0, 4080, 0, 0, 0, 0, 0, 0, 528, 528, 528, 528, 528, 528, 4211, 528, 4212, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 61562, 57893, 61563, 57893, 57893, 57893, 57893, 57916, 57943, 4313, 4314, 61659, 61660, 61661, 0, 528, 57893, 57916, 57943, 0, 0, 0, 0, 0, 2382, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4284416, 0, 0, 0, 0, 0, 57943, 57943, 61578, 57943, 61579, 57943, 57943, 57943, 57943, 0, 0, 0, 0, 0, 0, 528, 528, 4273, 4274, 528, 528, 57893, 57893, 61621, 61622, 57893, 57893, 57916, 0, 528, 528, 57893, 57893, 57916, 57916, 57943, 57943, 4303, 4304, 61649, 61650, 61651, 0, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2428, 528, 528, 528, 528, 528, 528, 4096, 528, 528, 4098, 57893, 57893, 57893, 57893, 57893, 57893, 58861, 57893, 57893, 57893, 57893, 50676, 58773, 990, 57916, 57916, 537, 57903, 537, 57903, 537, 537, 57903, 537, 537, 57926, 57903, 537, 537, 57903, 57903, 57903, 57903, 57953, 57953, 57903, 57903, 57903, 57903, 57953, 57953, 57903, 537, 57903, 57903, 57926, 57903, 57903, 57903, 57903, 57903, 57903, 57903, 57926, 57926, 57903, 57903, 57953, 57903, 57903, 57903, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 57893, 57893, 58833, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60649, 57893, 57893, 57916, 59948, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59489, 57916, 57943, 60031, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60044, 57943, 0, 384, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2404, 0, 0, 340, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2854, 0, 0, 0, 406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 406, 0, 0, 0, 432, 131072, 0, 432, 432, 0, 0, 0, 432, 0, 452, 432, 0, 0, 0, 0, 4206, 0, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2430, 528, 528, 432, 478, 478, 478, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 491, 538, 57904, 538, 57904, 538, 538, 57904, 538, 538, 57927, 57904, 538, 538, 57904, 57904, 57904, 57904, 57954, 57954, 57904, 57904, 57904, 57904, 57954, 57954, 57904, 538, 57904, 57904, 57927, 57904, 57904, 57904, 57904, 57904, 57904, 57904, 57927, 57927, 57904, 57904, 57954, 57904, 57904, 57904, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 661, 0, 661, 0, 0, 0, 0, 826, 0, 0, 0, 661, 0, 0, 0, 0, 0, 5218304, 0, 0, 0, 0, 5799936, 0, 5881856, 0, 0, 0, 0, 0, 0, 5029888, 5038080, 0, 0, 5103616, 5201920, 0, 0, 0, 0, 0, 0, 1878, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2296, 0, 0, 0, 0, 0, 0, 842, 528, 528, 528, 857, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 898, 528, 528, 528, 528, 57893, 57893, 58260, 57893, 57893, 57893, 58276, 57893, 57893, 57893, 57893, 57893, 57893, 61220, 57893, 57893, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 0, 57893, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59022, 57943, 59024, 57943, 57943, 57943, 57943, 57943, 57916, 58352, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58393, 57916, 57916, 57916, 57916, 57916, 60913, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61471, 57943, 57943, 57943, 57943, 57943, 1160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1167, 1168, 0, 0, 0, 0, 0, 0, 1299, 0, 0, 0, 0, 0, 0, 0, 0, 528, 528, 1340, 528, 528, 528, 528, 528, 0, 0, 0, 1249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1260, 1261, 0, 0, 0, 0, 131072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2415, 0, 0, 2418, 528, 528, 528, 528, 1351, 1358, 528, 528, 528, 528, 528, 528, 528, 528, 1371, 528, 528, 0, 57893, 57893, 57893, 58317, 57893, 57893, 294, 1151, 0, 0, 1155, 0, 0, 0, 0, 0, 5857280, 0, 6463488, 4939776, 0, 0, 5455872, 0, 0, 0, 0, 0, 5554176, 5570560, 5578752, 5619712, 5668864, 0, 0, 0, 5791744, 5816320, 0, 5857280, 0, 1373, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1406, 1408, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1423, 528, 528, 528, 528, 528, 2910, 528, 528, 528, 528, 528, 528, 2917, 528, 528, 528, 528, 528, 2490, 528, 528, 528, 528, 528, 528, 528, 528, 528, 0, 0, 57893, 57893, 57893, 57893, 57893, 60612, 57893, 60613, 57893, 57893, 57893, 58773, 914, 57893, 58776, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58790, 58797, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58810, 57893, 58812, 57893, 57893, 57893, 57893, 57893, 59867, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59872, 57893, 57893, 57893, 57893, 57893, 57893, 58832, 57893, 58834, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58847, 57893, 57893, 57893, 57893, 57893, 59881, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59888, 57893, 57916, 57916, 57916, 58957, 57916, 57916, 57916, 0, 57893, 57943, 58965, 57943, 57943, 57943, 57943, 57943, 57943, 59548, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61154, 57943, 57943, 57943, 57943, 528, 58999, 57943, 59001, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59027, 57943, 57943, 57943, 57943, 59037, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59052, 57943, 57943, 57943, 57943, 57943, 61139, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60454, 57943, 57943, 57943, 57943, 1946, 528, 528, 528, 528, 528, 528, 528, 528, 1955, 528, 528, 528, 528, 528, 528, 1970, 528, 528, 528, 528, 528, 528, 1976, 528, 528, 528, 528, 1982, 528, 58773, 1986, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60648, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59346, 59347, 57893, 57893, 57893, 57893, 59354, 57893, 57893, 57893, 57893, 57893, 58315, 57893, 57893, 57893, 57893, 0, 57916, 57916, 57916, 57916, 57916, 57916, 60349, 57916, 57916, 57916, 57916, 60353, 57916, 57916, 57916, 57893, 59426, 57893, 50676, 2086, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60932, 57916, 60934, 57916, 57916, 57916, 57916, 59446, 59447, 57916, 57916, 57916, 57916, 59454, 57916, 57916, 57916, 57916, 57916, 57916, 59449, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60390, 57916, 57916, 57916, 57916, 57916, 57916, 59526, 57916, 57893, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59051, 57943, 57943, 57943, 59542, 59543, 57943, 57943, 57943, 57943, 59550, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60425, 57943, 57943, 57943, 57943, 57943, 57943, 0, 2313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2322, 0, 0, 0, 0, 0, 0, 3208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3210, 3211, 0, 0, 0, 0, 0, 528, 528, 528, 528, 2477, 528, 528, 528, 528, 528, 528, 528, 2483, 528, 528, 528, 528, 528, 2924, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2496, 528, 528, 528, 0, 528, 528, 528, 2488, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 0, 0, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 0, 0, 990, 57916, 57916, 57916, 57916, 57916, 60004, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60010, 57916, 57916, 57916, 57916, 57916, 58921, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60917, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 60087, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60093, 57943, 57943, 57943, 57943, 57943, 57943, 60967, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60040, 57943, 57943, 57943, 57943, 57943, 0, 0, 0, 2782, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1169, 1170, 1171, 1172, 3159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1871, 528, 528, 528, 3231, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3248, 528, 528, 528, 3262, 528, 0, 0, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60614, 57893, 57893, 57893, 50676, 0, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59441, 57893, 57893, 57893, 57893, 60622, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 61098, 57916, 57916, 57916, 57893, 57893, 57893, 57893, 60655, 57893, 0, 0, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60928, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60663, 57916, 57916, 57916, 57916, 57916, 57916, 60671, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61118, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 60712, 57943, 57943, 57943, 57943, 57943, 57943, 60720, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61340, 57943, 57943, 528, 57893, 0, 0, 0, 57893, 57893, 57893, 61094, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 57916, 57916, 57916, 57916, 57916, 61232, 57916, 57916, 57916, 57916, 61233, 61234, 57916, 57916, 57916, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61513, 57893, 61515, 57893, 57893, 57893, 57893, 57893, 59894, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 0, 57916, 57916, 58335, 57916, 57916, 528, 528, 61559, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61567, 61624, 57916, 57916, 57916, 57916, 57943, 61628, 57943, 57943, 57943, 57943, 0, 0, 0, 0, 528, 4272, 528, 528, 528, 528, 57893, 61620, 57893, 57893, 57893, 57893, 57916, 0, 389, 341, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2801, 0, 0, 463, 479, 479, 479, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 512, 539, 57905, 539, 57905, 539, 539, 57905, 539, 539, 57928, 57905, 539, 539, 57905, 57905, 57905, 57905, 57955, 57955, 57905, 57905, 57905, 57905, 57955, 57955, 57905, 539, 57905, 57905, 57928, 57905, 57905, 57905, 57905, 57905, 57905, 57905, 57928, 57928, 57905, 57905, 57955, 57905, 57905, 57905, 1, 24578, 3, 155942, 156282, 296, 0, 0, 0, 0, 0, 302, 303, 0, 0, 732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3427, 0, 0, 0, 662, 0, 662, 0, 0, 0, 0, 0, 0, 0, 0, 662, 0, 0, 0, 0, 0, 6225920, 4358144, 5062656, 4358144, 4358144, 4358144, 4358144, 4358144, 6225920, 0, 6086656, 528, 528, 528, 528, 858, 528, 528, 874, 528, 528, 528, 528, 528, 528, 528, 528, 2913, 528, 528, 528, 528, 528, 528, 528, 57916, 58353, 57916, 57916, 58369, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61575, 57943, 57943, 57943, 0, 1189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3451, 0, 0, 1318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3480, 0, 0, 0, 1334, 0, 0, 0, 0, 0, 528, 528, 528, 528, 528, 528, 528, 528, 2876, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1352, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2469, 528, 528, 528, 528, 528, 528, 1391, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3493, 528, 528, 528, 528, 1410, 528, 528, 528, 528, 528, 1418, 528, 528, 528, 528, 528, 528, 528, 1379, 528, 528, 528, 528, 528, 528, 528, 528, 1954, 528, 528, 1957, 528, 528, 528, 528, 58773, 914, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58791, 57893, 57893, 57893, 58857, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 50676, 58773, 990, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 60412, 57943, 60413, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 58471, 57943, 57943, 57943, 57943, 528, 528, 528, 901, 57943, 57943, 57943, 57943, 59039, 57943, 57943, 57943, 57943, 57943, 59047, 57943, 57943, 57943, 57943, 57943, 57943, 59563, 59564, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61484, 0, 0, 4143, 4144, 0, 0, 0, 1727, 0, 0, 0, 0, 1734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2370, 0, 0, 0, 0, 0, 0, 528, 1916, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1927, 528, 528, 0, 57893, 57893, 57893, 58319, 57893, 57893, 155942, 1151, 0, 302, 0, 0, 306, 307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 650, 0, 0, 0, 0, 0, 2351104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4358144, 59359, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59370, 57893, 57893, 57893, 50676, 0, 57916, 59433, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59440, 57916, 57943, 57943, 57943, 59544, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59555, 57943, 57943, 528, 1714, 528, 1716, 528, 528, 59063, 57893, 57893, 59065, 57893, 57893, 1151, 0, 57943, 57943, 57943, 59577, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61143, 57943, 57943, 0, 0, 2379, 2380, 0, 0, 0, 0, 0, 2386, 0, 0, 0, 0, 0, 0, 0, 2785, 0, 0, 0, 0, 0, 0, 0, 0, 1753, 0, 0, 0, 0, 0, 0, 0, 528, 2474, 528, 528, 528, 528, 2479, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1396, 528, 528, 528, 1403, 1405, 528, 2501, 0, 0, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60878, 57893, 57893, 57893, 57893, 57893, 57893, 59906, 57893, 57893, 57893, 57893, 59911, 57893, 57893, 57893, 57893, 57893, 57893, 2999, 0, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 61327, 57943, 57943, 61329, 57943, 57943, 57943, 57916, 59964, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59506, 57916, 57943, 60047, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60070, 60071, 57916, 57916, 57916, 57916, 61115, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58885, 58892, 57916, 57916, 57916, 0, 3925, 3675, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2838, 2839, 0, 3949, 528, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58850, 57893, 57893, 57893, 61308, 57893, 57893, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58886, 57916, 57916, 57916, 57916, 4001, 0, 0, 0, 0, 3675, 0, 0, 0, 0, 0, 0, 0, 0, 528, 528, 528, 528, 528, 528, 1895, 528, 528, 528, 4016, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61375, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 57916, 57916, 57916, 57916, 61461, 57916, 61391, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61407, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 0, 0, 0, 0, 0, 2316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3838, 0, 0, 0, 0, 0, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61566, 57916, 0, 0, 0, 0, 57893, 57943, 57943, 58410, 57943, 57943, 57943, 57943, 57943, 57943, 58443, 0, 0, 0, 390, 391, 393, 343, 0, 0, 0, 0, 0, 0, 342, 0, 0, 0, 343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2787, 0, 0, 0, 0, 0, 0, 0, 0, 0, 390, 0, 0, 0, 0, 0, 0, 343, 0, 0, 0, 390, 0, 0, 0, 0, 131072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 310, 0, 0, 0, 0, 1749, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 540672, 0, 0, 0, 0, 0, 0, 480, 480, 480, 480, 496, 496, 496, 496, 496, 496, 496, 496, 496, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 480, 540, 57906, 540, 57906, 540, 540, 57906, 540, 540, 57929, 57906, 540, 540, 57906, 57906, 57906, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 57929, 57906, 57906, 57906, 57906, 57906, 57906, 57906, 57929, 57929, 57906, 57942, 57956, 57942, 57942, 57942, 57942, 57956, 57956, 57942, 57942, 57942, 57942, 57956, 57956, 57942, 540, 57906, 57906, 368, 368, 0, 0, 0, 0, 0, 706, 0, 0, 0, 0, 0, 0, 0, 0, 740, 0, 0, 0, 0, 740, 0, 746, 715, 0, 717, 0, 0, 0, 0, 0, 0, 0, 725, 0, 0, 0, 0, 0, 0, 804, 0, 0, 0, 0, 0, 0, 804, 0, 528, 0, 0, 813, 0, 796, 0, 0, 815, 0, 667, 0, 792, 0, 0, 0, 0, 0, 836, 0, 0, 0, 0, 796, 663, 840, 0, 528, 0, 792, 815, 0, 815, 813, 0, 0, 0, 827, 0, 0, 0, 663, 830, 0, 0, 0, 0, 131072, 0, 0, 0, 0, 0, 0, 0, 444, 0, 0, 0, 0, 0, 690, 691, 0, 0, 0, 0, 696, 0, 0, 0, 368, 843, 528, 528, 528, 859, 528, 528, 875, 528, 528, 528, 528, 889, 528, 528, 528, 528, 528, 3245, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1398, 528, 528, 528, 528, 528, 907, 528, 528, 57893, 57893, 58261, 57893, 57893, 57893, 58278, 57893, 57893, 58294, 57893, 57893, 57893, 50676, 0, 59432, 57916, 59434, 57916, 59435, 57916, 59437, 57916, 59439, 57916, 57916, 57893, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59534, 57943, 57943, 57943, 57943, 57943, 57943, 59594, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60467, 57943, 57943, 57943, 57943, 57943, 57893, 57893, 58308, 57893, 57893, 57893, 57893, 58326, 57893, 57893, 0, 57916, 57916, 58337, 57916, 57916, 57916, 57916, 57943, 57943, 60411, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59044, 57943, 57943, 57943, 57943, 57943, 57943, 57916, 58354, 57916, 57916, 58370, 57916, 57916, 57916, 57916, 58384, 57916, 57916, 57916, 57916, 58402, 57916, 0, 0, 0, 0, 57893, 57943, 57943, 58411, 57943, 57943, 57943, 58427, 57943, 57943, 57943, 57943, 57943, 59005, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59008, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 58459, 57943, 57943, 57943, 57943, 58477, 57943, 57943, 528, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 1151, 0, 0, 0, 1170, 0, 0, 0, 0, 0, 0, 0, 1172, 0, 0, 0, 0, 0, 0, 806, 0, 0, 0, 0, 787, 0, 806, 0, 528, 1293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1305, 0, 0, 0, 0, 0, 6307840, 0, 0, 6356992, 6381568, 6397952, 4800512, 4808704, 0, 0, 4890624, 0, 4947968, 0, 0, 0, 5046272, 0, 0, 0, 0, 5185536, 0, 5234688, 5300224, 0, 0, 0, 0, 1210, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1305, 0, 0, 0, 0, 0, 2343, 0, 0, 0, 0, 0, 2347, 0, 0, 2349, 0, 0, 1333, 0, 0, 0, 0, 0, 0, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1353, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2901, 528, 528, 528, 528, 528, 528, 1377, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3724, 528, 528, 58773, 914, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58792, 0, 0, 1777, 0, 0, 1780, 0, 1782, 0, 0, 0, 0, 0, 0, 0, 0, 753, 0, 0, 0, 0, 0, 0, 0, 0, 1833, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3667, 3668, 528, 1898, 528, 528, 528, 528, 528, 528, 528, 528, 1909, 528, 528, 528, 528, 528, 868, 528, 528, 528, 528, 528, 887, 528, 528, 528, 528, 59341, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59352, 57893, 57893, 57893, 57893, 57893, 57893, 58325, 57893, 57893, 57893, 0, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 59578, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60056, 57943, 57943, 57943, 0, 2394, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2405, 0, 528, 528, 528, 2422, 2423, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1366, 528, 528, 528, 528, 528, 0, 0, 0, 57893, 57893, 57893, 59852, 57893, 59854, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59349, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60647, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59903, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59405, 57893, 0, 2780, 0, 0, 2783, 0, 0, 0, 0, 0, 0, 2788, 0, 0, 0, 2791, 2792, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2802, 0, 0, 0, 0, 131072, 0, 0, 0, 0, 0, 0, 0, 448, 0, 0, 0, 0, 0, 2307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3674, 0, 0, 0, 0, 0, 0, 2817, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3677, 0, 0, 0, 2843, 0, 0, 0, 0, 0, 0, 0, 0, 2851, 0, 0, 0, 0, 0, 0, 3448, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1287, 1288, 0, 0, 0, 0, 0, 0, 2857, 0, 0, 0, 0, 2860, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2862, 0, 0, 0, 0, 0, 0, 2868, 0, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 2879, 528, 528, 2882, 2883, 528, 528, 528, 528, 528, 2888, 528, 2890, 528, 528, 528, 528, 528, 3487, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2468, 528, 528, 528, 528, 528, 528, 2894, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2900, 528, 528, 528, 528, 528, 1903, 1904, 528, 528, 528, 528, 1911, 528, 528, 528, 528, 528, 1935, 528, 528, 528, 1940, 528, 528, 528, 528, 528, 528, 2897, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3858, 528, 57893, 57893, 57893, 57893, 528, 528, 528, 528, 2908, 528, 528, 528, 528, 528, 528, 2916, 528, 528, 528, 528, 528, 2439, 528, 528, 528, 528, 2444, 528, 528, 528, 528, 528, 528, 61594, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61600, 57916, 528, 2921, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1387, 528, 57893, 60297, 57893, 60299, 57893, 57893, 57893, 57893, 60303, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59382, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59398, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60309, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60318, 57893, 57893, 57893, 0, 0, 0, 2593, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60704, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60957, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57893, 57893, 57893, 60326, 57893, 57893, 57893, 57893, 57893, 60331, 57893, 57893, 57893, 57893, 57893, 57893, 58837, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58851, 57893, 60355, 57916, 57916, 60358, 60359, 57916, 57916, 57916, 57916, 57916, 60364, 57916, 60366, 57916, 57916, 57916, 57916, 57916, 60925, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58884, 57916, 57916, 57916, 57916, 57916, 57916, 60370, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60376, 57916, 57916, 57916, 57916, 57916, 58960, 57916, 0, 57893, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60732, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60450, 57943, 57943, 57943, 57943, 57943, 57943, 60458, 57916, 57916, 60398, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59505, 57916, 57916, 57943, 57943, 57943, 60420, 57943, 57943, 60423, 60424, 57943, 57943, 57943, 57943, 57943, 60429, 57943, 60431, 57943, 57943, 57943, 57943, 60435, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60441, 57943, 57943, 57943, 57943, 57943, 61150, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 528, 528, 3133, 528, 528, 57893, 57893, 60480, 57893, 0, 0, 3161, 3162, 3163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2311, 0, 0, 0, 0, 0, 3176, 0, 0, 0, 0, 0, 0, 0, 3182, 0, 3184, 0, 0, 0, 0, 0, 0, 3458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 786, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 802, 0, 807, 0, 810, 3188, 0, 0, 0, 0, 3193, 0, 0, 3196, 0, 0, 0, 0, 0, 0, 0, 389, 0, 139264, 147456, 0, 0, 0, 0, 0, 528, 528, 3263, 0, 0, 60608, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61086, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60653, 57893, 57893, 60656, 0, 0, 60657, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58880, 57916, 57916, 57916, 58889, 57916, 57916, 57916, 57916, 57916, 57916, 60689, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59986, 57916, 57916, 57916, 57916, 60699, 57916, 57916, 60702, 57916, 57916, 60705, 60706, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60052, 57943, 57943, 57943, 57943, 57943, 57943, 60057, 57943, 60727, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59031, 57943, 57943, 57943, 60738, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 58994, 57943, 57943, 57943, 57943, 57943, 57943, 60748, 57943, 57943, 60751, 57943, 57943, 60754, 3411, 528, 528, 60758, 57893, 57893, 57893, 50676, 2085, 57916, 57916, 57916, 57916, 57916, 59436, 57916, 57916, 57916, 57916, 57916, 57916, 60373, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60379, 57916, 3429, 0, 0, 0, 0, 3434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3675, 0, 0, 0, 0, 0, 0, 0, 0, 528, 528, 0, 0, 0, 3470, 0, 0, 0, 0, 0, 0, 3477, 0, 0, 3479, 0, 0, 0, 0, 306, 0, 0, 0, 0, 0, 0, 306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2852, 0, 0, 0, 528, 528, 3484, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3259, 528, 3509, 528, 528, 3511, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 61446, 57893, 57893, 60868, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59928, 57893, 60894, 57893, 57893, 60896, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60877, 57893, 57893, 57893, 57916, 57916, 60910, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60012, 57916, 57916, 57916, 60936, 57916, 57916, 60938, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59485, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 60952, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59009, 57943, 57943, 57943, 57943, 57943, 60978, 57943, 57943, 60980, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60055, 57943, 57943, 57943, 60058, 3661, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2312, 3679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3691, 0, 0, 0, 0, 131072, 0, 0, 0, 0, 0, 0, 0, 450, 0, 0, 0, 0, 0, 3457, 0, 0, 0, 0, 3462, 0, 0, 0, 0, 3466, 3702, 3703, 528, 528, 528, 528, 3707, 3708, 528, 528, 528, 528, 528, 3712, 528, 528, 0, 2932, 0, 0, 0, 0, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59859, 57893, 57893, 528, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61073, 61074, 57893, 57893, 57893, 57893, 61078, 61079, 57916, 57916, 61102, 61103, 57916, 57916, 57916, 57916, 61107, 61108, 57916, 57916, 57916, 57916, 57916, 61112, 57943, 57943, 61136, 61137, 57943, 57943, 57943, 57943, 57943, 61141, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60436, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 58476, 57943, 57943, 57943, 1139, 528, 528, 528, 57943, 57943, 61147, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 528, 528, 528, 528, 528, 528, 57893, 57893, 57893, 0, 0, 3817, 0, 0, 0, 0, 0, 0, 0, 0, 1165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3834, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2865, 0, 0, 57916, 57916, 57916, 57916, 61230, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59486, 57916, 57916, 57916, 57916, 57943, 61249, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60096, 57943, 0, 0, 3675, 0, 3928, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2361, 0, 0, 0, 0, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61303, 57893, 57893, 57893, 50676, 2086, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61236, 61319, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 0, 0, 57943, 57943, 57943, 61335, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 528, 57893, 0, 3999, 0, 0, 0, 0, 131072, 0, 0, 0, 0, 0, 0, 0, 450560, 0, 0, 0, 0, 0, 372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2333, 0, 0, 0, 0, 2338, 0, 4002, 0, 0, 0, 3675, 0, 0, 0, 0, 0, 0, 0, 0, 528, 528, 528, 1341, 528, 528, 528, 528, 4014, 528, 528, 528, 528, 4019, 528, 528, 528, 528, 4024, 528, 528, 57893, 57893, 61373, 57893, 57893, 57893, 57893, 61378, 57893, 57893, 57893, 57893, 61383, 57893, 57893, 57893, 57916, 57916, 61389, 57916, 57916, 57916, 57916, 61394, 57916, 57916, 57916, 57916, 61399, 57916, 57916, 57916, 57943, 57943, 61405, 57943, 57943, 57943, 57943, 61410, 57943, 57943, 57943, 57943, 61415, 57943, 57943, 57943, 0, 0, 0, 0, 0, 2366, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 352256, 0, 352256, 0, 0, 0, 0, 0, 0, 4078, 0, 0, 4081, 0, 0, 0, 0, 0, 528, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 528, 528, 4246, 4247, 528, 528, 57893, 57893, 57893, 61596, 61597, 57893, 57893, 57893, 57916, 57916, 57916, 57916, 57943, 60410, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 58481, 528, 852, 528, 528, 57916, 61602, 61603, 57916, 57916, 57916, 57943, 57943, 57943, 61608, 61609, 57943, 57943, 57943, 0, 0, 0, 0, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 306, 0, 306, 0, 0, 0, 0, 345, 346, 347, 348, 349, 0, 0, 0, 0, 0, 0, 0, 0, 1181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 348, 131072, 347, 348, 348, 0, 349, 347, 348, 0, 347, 348, 457, 464, 481, 481, 481, 492, 492, 492, 498, 492, 492, 498, 498, 492, 498, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 541, 57907, 541, 57907, 541, 541, 57907, 541, 541, 57930, 57907, 541, 541, 57907, 57907, 57907, 57907, 57957, 57957, 57907, 57907, 57907, 57907, 57957, 57957, 57907, 541, 57907, 57907, 57930, 57907, 57907, 57907, 57907, 57907, 57907, 57907, 57930, 57930, 57907, 57907, 57957, 57907, 57907, 57907, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 0, 306, 307, 0, 0, 0, 0, 0, 0, 646, 0, 0, 0, 0, 651, 652, 653, 654, 655, 656, 657, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2388, 0, 0, 0, 0, 0, 0, 0, 672, 673, 0, 675, 676, 0, 0, 0, 0, 0, 682, 0, 0, 0, 0, 307, 0, 0, 0, 0, 0, 0, 307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 352256, 0, 0, 0, 0, 0, 0, 0, 716, 0, 0, 719, 0, 721, 0, 723, 0, 0, 0, 0, 0, 0, 0, 394, 0, 0, 0, 0, 0, 0, 0, 0, 1222, 0, 0, 0, 0, 0, 0, 0, 0, 0, 733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3172, 0, 0, 0, 0, 0, 763, 764, 0, 766, 767, 675, 0, 0, 0, 0, 0, 0, 0, 395, 0, 0, 0, 0, 0, 0, 0, 0, 2319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 782, 783, 0, 785, 0, 0, 0, 0, 764, 0, 0, 791, 0, 0, 0, 0, 131072, 0, 0, 0, 0, 0, 245760, 0, 0, 0, 0, 245760, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3171, 0, 0, 0, 0, 692, 0, 0, 0, 764, 0, 0, 0, 0, 0, 0, 0, 0, 757, 821, 0, 0, 0, 757, 0, 0, 824, 699, 0, 0, 0, 829, 0, 0, 0, 831, 0, 0, 0, 692, 699, 0, 0, 692, 829, 829, 0, 0, 0, 0, 0, 528, 528, 528, 528, 528, 528, 2874, 528, 528, 528, 528, 528, 528, 528, 3489, 528, 528, 528, 528, 528, 528, 528, 528, 3256, 528, 528, 528, 528, 528, 528, 528, 528, 849, 853, 856, 528, 865, 528, 528, 528, 881, 883, 886, 528, 528, 528, 899, 903, 528, 528, 528, 57893, 57893, 57893, 58268, 58272, 58275, 57893, 58284, 57893, 57893, 57893, 58300, 58302, 58305, 57893, 57893, 57893, 58318, 58322, 57893, 57893, 57893, 0, 57916, 57916, 57916, 58344, 58348, 58351, 57916, 58360, 57916, 57916, 57916, 58376, 58378, 58381, 57916, 57916, 57916, 58394, 58398, 57916, 57916, 57916, 57916, 58367, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59999, 57916, 57916, 57916, 57916, 0, 0, 0, 0, 58409, 57943, 57943, 57943, 58419, 58423, 58426, 57943, 58435, 57943, 57943, 528, 3649, 528, 57893, 60996, 57893, 0, 0, 0, 0, 0, 0, 0, 0, 1254, 0, 0, 0, 0, 0, 0, 0, 57943, 58451, 58453, 58456, 57943, 57943, 57943, 58469, 58473, 57943, 57943, 57943, 849, 1140, 528, 899, 903, 1144, 0, 58489, 58268, 57893, 58318, 58322, 58494, 155942, 1151, 0, 0, 0, 0, 0, 0, 1179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1239, 0, 0, 0, 0, 0, 0, 1278, 0, 0, 0, 0, 1283, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3675, 0, 3828, 0, 0, 0, 0, 0, 0, 1321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1198, 0, 0, 0, 528, 1375, 528, 528, 528, 1378, 528, 528, 528, 528, 528, 528, 528, 1385, 528, 528, 0, 2932, 0, 0, 0, 0, 57893, 57893, 57893, 57893, 57893, 57893, 60282, 57893, 1389, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1400, 528, 528, 1407, 58817, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58824, 57893, 57893, 58828, 57893, 57893, 57893, 57893, 57893, 59895, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59898, 59899, 57893, 57893, 57893, 57893, 57916, 57916, 57916, 58934, 57916, 57916, 58941, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59984, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58955, 57916, 57916, 57916, 57916, 57916, 0, 57893, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61542, 57943, 57943, 57943, 0, 4202, 0, 0, 57943, 57943, 57943, 59003, 57943, 57943, 57943, 59006, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59013, 57943, 57943, 59017, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59029, 57943, 57943, 57943, 57943, 57943, 61337, 57943, 57943, 57943, 61341, 57943, 528, 57893, 0, 0, 0, 0, 3139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3149, 57943, 59036, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59050, 57943, 57943, 57943, 57943, 57943, 59019, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 58482, 528, 528, 528, 528, 1822, 0, 1824, 0, 0, 0, 1826, 0, 746, 0, 0, 0, 0, 0, 0, 0, 399, 0, 0, 404, 0, 0, 0, 0, 0, 1872, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2350, 0, 1757, 0, 0, 0, 0, 0, 0, 528, 1891, 528, 528, 528, 528, 528, 528, 2440, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2495, 528, 528, 528, 528, 0, 1897, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1428, 528, 528, 528, 528, 1919, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1928, 528, 528, 528, 1932, 528, 528, 1937, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1419, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 58773, 0, 57893, 59333, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59340, 57893, 57893, 57893, 59362, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59371, 57893, 57893, 57893, 57893, 57943, 57943, 57893, 57893, 57893, 57893, 57943, 57943, 57893, 528, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61075, 57893, 57893, 57893, 57893, 57893, 58821, 57893, 57893, 57893, 58825, 57893, 57893, 57893, 57893, 57893, 57893, 59348, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60875, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59375, 57893, 57893, 59380, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61457, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59462, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59471, 57916, 57916, 57916, 57916, 58368, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60011, 57916, 57916, 57916, 57916, 59475, 57916, 57916, 59480, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59972, 57916, 57916, 57916, 59975, 59558, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59567, 57943, 57943, 57943, 59571, 57943, 57943, 59576, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59569, 57943, 57943, 57916, 57916, 57916, 59990, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58948, 57916, 57916, 57916, 57943, 57943, 57943, 60073, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59010, 57943, 57943, 57943, 2804, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2376, 57916, 60409, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59030, 57943, 57943, 57943, 57943, 60474, 57943, 57943, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 2290, 0, 2291, 0, 0, 3214, 0, 0, 0, 528, 3218, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1383, 528, 528, 528, 528, 1388, 3242, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1962, 57893, 60633, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60335, 57893, 57916, 57916, 57916, 57916, 60682, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59998, 57916, 57916, 57916, 57916, 0, 0, 3419, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3425, 0, 0, 0, 0, 0, 2410, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 417792, 309, 310, 0, 0, 0, 0, 3841, 528, 528, 528, 528, 528, 528, 528, 3846, 528, 528, 528, 528, 528, 528, 2465, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3943, 528, 3945, 528, 528, 528, 57893, 57893, 57893, 57893, 61208, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59369, 57893, 57893, 57893, 57893, 57916, 61227, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59524, 57916, 0, 0, 3675, 3927, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1266, 0, 0, 0, 528, 528, 528, 3937, 528, 528, 528, 528, 3941, 528, 528, 528, 528, 528, 3947, 528, 528, 0, 57893, 57893, 57893, 58320, 57893, 57893, 155942, 1151, 0, 0, 0, 0, 0, 0, 1751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 754, 0, 0, 0, 0, 0, 0, 528, 528, 57893, 57893, 57893, 61296, 57893, 57893, 57893, 57893, 61300, 57893, 57893, 57893, 57893, 57893, 58317, 57893, 57893, 57893, 57893, 0, 57916, 57916, 58336, 57916, 57916, 61306, 57893, 57893, 57893, 57893, 57916, 57916, 57916, 61312, 57916, 57916, 57916, 57916, 61316, 57916, 57916, 57916, 57916, 58371, 58373, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58945, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61322, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 61328, 57943, 57943, 57943, 57943, 57943, 57943, 60981, 57943, 60983, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60078, 57943, 57943, 57943, 57943, 60083, 57943, 57943, 61332, 57943, 57943, 57943, 57943, 57943, 61338, 57943, 57943, 57943, 57943, 528, 57893, 0, 0, 0, 0, 0, 2797, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1881, 0, 0, 0, 0, 0, 528, 528, 528, 4017, 528, 528, 528, 4021, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 58281, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61376, 57893, 57893, 57893, 61380, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 57916, 57916, 57916, 57916, 60939, 57916, 60941, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58881, 57916, 57916, 57916, 57916, 57916, 57916, 58896, 57916, 57916, 61392, 57916, 57916, 57916, 61396, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 61242, 57943, 57943, 57943, 61245, 57943, 57943, 57943, 57943, 61408, 57943, 57943, 57943, 61412, 57943, 57943, 57943, 57943, 57943, 57943, 0, 0, 0, 0, 0, 2821, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1739, 0, 0, 0, 0, 0, 0, 4270, 0, 528, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 61311, 57916, 57916, 61313, 57916, 57916, 57916, 57916, 57916, 57916, 59497, 57916, 57916, 59500, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61526, 57916, 61528, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60415, 57943, 57943, 57943, 57943, 0, 528, 528, 57893, 57893, 57916, 57916, 57943, 57943, 0, 528, 57893, 57916, 57943, 4308, 4309, 61654, 61655, 61656, 0, 528, 57893, 57916, 57943, 0, 528, 57893, 57916, 57943, 0, 0, 0, 0, 0, 2831, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1257, 0, 0, 0, 0, 1262, 0, 350, 0, 408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 408, 0, 350, 0, 139264, 147456, 0, 0, 0, 0, 0, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 514, 542, 57908, 542, 57908, 542, 542, 57908, 542, 542, 57931, 57908, 542, 542, 57908, 57908, 57908, 57908, 57958, 57958, 57908, 57908, 57908, 57908, 57958, 57958, 57908, 623, 57908, 57974, 57931, 57908, 57908, 57908, 57908, 57908, 57908, 57908, 57931, 57931, 57908, 57908, 57958, 57908, 57908, 57908, 57974, 57974, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 131072, 0, 0, 0, 328, 0, 0, 330, 0, 0, 0, 0, 0, 0, 2847, 2848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5808128, 0, 0, 0, 0, 4792320, 4833280, 844, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 890, 528, 528, 528, 528, 528, 3499, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3508, 528, 908, 528, 528, 57893, 57893, 58262, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61222, 57916, 57916, 57916, 57916, 57916, 57916, 57893, 57893, 58309, 57893, 57893, 57893, 57893, 58327, 57893, 57893, 0, 57916, 57916, 58338, 57916, 57916, 57916, 57916, 58877, 57916, 57916, 57916, 57916, 58883, 57916, 57916, 57916, 57916, 57916, 57916, 59993, 59994, 57916, 57916, 57916, 57916, 57916, 57916, 60001, 57916, 57943, 57943, 57943, 57943, 58460, 57943, 57943, 57943, 57943, 58478, 57943, 57943, 528, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 1151, 1724, 1173, 0, 0, 0, 0, 1178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2310144, 0, 368, 0, 0, 0, 0, 0, 1173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2816, 528, 528, 528, 528, 1354, 528, 528, 528, 528, 1364, 528, 528, 528, 528, 528, 528, 2491, 528, 2493, 528, 528, 528, 528, 528, 528, 0, 58773, 914, 57893, 57893, 57893, 58779, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58793, 57916, 58874, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58888, 57916, 57916, 57916, 57916, 57916, 59448, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59459, 58898, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59961, 57916, 58914, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59987, 59988, 58953, 57916, 57916, 57916, 57916, 57916, 57916, 0, 57893, 57943, 57943, 57943, 58968, 57943, 57943, 57943, 57943, 57943, 59041, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59053, 59054, 0, 1728, 0, 0, 0, 0, 1735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3424, 0, 0, 0, 0, 0, 0, 0, 0, 1761, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3185, 0, 0, 1775, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2840, 0, 0, 2353, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3201, 0, 0, 2449, 528, 528, 528, 528, 528, 528, 2454, 528, 2456, 528, 528, 528, 528, 528, 528, 2884, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2915, 528, 528, 528, 528, 528, 2502, 0, 0, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61387, 57916, 57916, 57893, 57893, 57893, 59880, 57893, 57893, 57893, 57893, 57893, 57893, 59885, 57893, 59887, 57893, 57893, 57893, 0, 0, 2592, 0, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61470, 57943, 57943, 57943, 57943, 57943, 57943, 59976, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60013, 57916, 60059, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59033, 528, 2906, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1960, 528, 57916, 57916, 60383, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60367, 57916, 57916, 0, 0, 3675, 0, 0, 0, 0, 3931, 0, 0, 3933, 0, 0, 0, 0, 0, 0, 1192, 0, 0, 0, 1196, 1197, 0, 0, 0, 0, 528, 3936, 528, 528, 3938, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3247, 528, 528, 528, 528, 528, 57893, 61295, 57893, 57893, 61297, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61456, 57916, 57916, 57916, 57916, 57916, 57916, 0, 0, 800, 0, 800, 0, 0, 0, 0, 0, 0, 0, 0, 800, 0, 0, 0, 0, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 307, 0, 307, 0, 528, 528, 528, 528, 860, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3257, 528, 528, 3260, 57916, 58355, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60368, 57916, 1161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3174, 528, 528, 528, 528, 58773, 1987, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59910, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57943, 57943, 60445, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59585, 57943, 57943, 57893, 61081, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60639, 57893, 0, 0, 0, 351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1746, 0, 0, 0, 0, 0, 0, 352, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1756, 1757, 0, 0, 0, 0, 353, 351, 131072, 0, 351, 351, 0, 353, 0, 351, 0, 0, 351, 353, 351, 0, 0, 0, 351, 351, 351, 351, 351, 351, 351, 351, 505, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 543, 57909, 543, 57909, 543, 543, 57909, 543, 543, 57932, 57909, 543, 543, 57909, 57909, 57909, 57909, 57959, 57959, 57909, 57909, 57909, 57909, 57959, 57959, 57909, 543, 57909, 57909, 57932, 57909, 57909, 57909, 57909, 57909, 57909, 57909, 57932, 57932, 57909, 57909, 57959, 57909, 57909, 57909, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 811, 812, 0, 0, 0, 0, 0, 0, 758, 0, 0, 817, 0, 0, 0, 0, 0, 0, 4082, 0, 0, 0, 0, 528, 528, 528, 528, 528, 3221, 528, 3222, 528, 528, 528, 528, 0, 817, 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1787, 0, 0, 0, 832, 0, 0, 0, 0, 0, 0, 812, 0, 0, 0, 0, 0, 0, 0, 528, 528, 528, 528, 528, 2873, 528, 528, 528, 528, 2877, 528, 528, 528, 0, 2503, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61087, 57893, 57893, 57893, 57893, 528, 850, 528, 528, 528, 866, 870, 528, 528, 528, 528, 528, 891, 893, 528, 528, 0, 2932, 0, 0, 0, 0, 57893, 57893, 57893, 60280, 57893, 60281, 57893, 57893, 57893, 50676, 0, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59473, 904, 528, 528, 528, 57893, 57893, 58263, 58269, 57893, 57893, 57893, 58285, 58289, 57893, 57893, 57893, 0, 2590, 0, 0, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59970, 57916, 57916, 57916, 57916, 57916, 57916, 57893, 57893, 58310, 58312, 57893, 57893, 58323, 57893, 57893, 57893, 0, 57916, 57916, 58339, 58345, 57916, 0, 0, 0, 0, 57893, 57943, 57943, 58412, 57943, 57943, 57943, 58429, 57943, 57943, 58445, 57916, 57916, 58361, 58365, 57916, 57916, 57916, 57916, 57916, 58386, 58388, 57916, 57916, 58399, 57916, 57916, 57916, 57916, 58904, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60945, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 58461, 58463, 57943, 57943, 58474, 57943, 57943, 57943, 850, 528, 893, 528, 528, 0, 58270, 58266, 58491, 58314, 57893, 57893, 155942, 1151, 0, 0, 1154, 0, 0, 0, 0, 0, 245760, 245760, 245760, 245760, 245760, 245760, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4358144, 4358144, 4358144, 904, 528, 0, 57893, 58269, 58312, 57893, 58323, 57893, 155942, 1151, 0, 302, 0, 0, 306, 307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1772, 0, 0, 0, 0, 0, 1217, 0, 1219, 0, 1221, 0, 0, 0, 0, 0, 0, 0, 0, 1286, 0, 0, 0, 0, 0, 0, 0, 0, 1247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3839, 0, 1332, 0, 0, 0, 0, 0, 0, 0, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3850, 528, 528, 1374, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2461, 528, 528, 528, 1412, 528, 528, 528, 528, 528, 528, 528, 528, 1424, 1425, 528, 528, 0, 57893, 57893, 57893, 57893, 57893, 57893, 294, 1151, 0, 0, 0, 0, 0, 0, 0, 5480448, 4358144, 4358144, 4358144, 4358144, 4857856, 4874240, 4358144, 4358144, 58773, 914, 57893, 57893, 57893, 57893, 58780, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60289, 57893, 57893, 57893, 57893, 57893, 60294, 57893, 57916, 57916, 58875, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60378, 57916, 57916, 57916, 57916, 58932, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58946, 57916, 57916, 57916, 57916, 57916, 57916, 61241, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61246, 57943, 57916, 57916, 57916, 58958, 58959, 57916, 57916, 0, 57893, 57943, 57943, 57943, 57943, 58969, 57943, 57943, 3648, 528, 528, 60995, 57893, 57893, 0, 0, 0, 0, 0, 0, 0, 0, 1815, 0, 0, 0, 0, 0, 0, 0, 57943, 59000, 59002, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59602, 57943, 57943, 0, 1808, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 212992, 0, 528, 528, 1966, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1975, 528, 528, 528, 528, 528, 3513, 3515, 528, 528, 528, 3518, 528, 3520, 3521, 528, 57893, 528, 1981, 528, 528, 58773, 0, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59338, 57893, 57893, 57893, 50676, 2087, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60674, 57916, 57916, 57916, 57916, 57893, 59409, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59419, 57893, 57893, 57893, 57893, 57893, 59907, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 0, 57916, 57916, 58340, 57916, 57916, 59425, 57893, 57893, 50676, 0, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59438, 57916, 57916, 57916, 57916, 57916, 61116, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61124, 57916, 59509, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59519, 57916, 57916, 57916, 57916, 59525, 57943, 57943, 59559, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59620, 57943, 57943, 2393, 0, 2395, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2403, 0, 0, 0, 0, 343, 390, 0, 0, 0, 139264, 147456, 0, 0, 0, 423, 0, 0, 0, 2408, 2409, 0, 0, 0, 0, 0, 2413, 0, 0, 0, 0, 0, 0, 0, 3153, 0, 0, 0, 0, 0, 0, 0, 0, 378, 0, 0, 0, 0, 0, 0, 0, 0, 2419, 528, 528, 528, 528, 528, 528, 2426, 528, 528, 528, 528, 528, 528, 528, 1394, 528, 528, 528, 528, 528, 528, 528, 528, 2886, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2450, 528, 528, 528, 528, 528, 528, 528, 528, 2457, 528, 2459, 528, 2462, 528, 528, 528, 2476, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 61371, 57893, 57893, 0, 0, 0, 59849, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59857, 57893, 57893, 57893, 57893, 57893, 60301, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60306, 57893, 57893, 59890, 57893, 59893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60304, 57893, 57893, 57893, 57893, 59902, 57893, 57893, 57893, 57893, 57893, 59908, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60330, 57893, 57893, 57893, 60333, 60334, 57893, 57893, 57916, 57916, 59977, 57916, 59979, 57916, 59982, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60363, 57916, 60365, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59991, 57916, 57916, 57916, 57916, 57916, 59997, 57916, 57916, 57916, 57916, 57916, 57916, 61606, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 0, 0, 57943, 57943, 60060, 57943, 60062, 57943, 60065, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59007, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60074, 57943, 57943, 57943, 57943, 57943, 60080, 57943, 57943, 57943, 57943, 57943, 57943, 59612, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 0, 0, 4240, 0, 0, 0, 528, 0, 0, 0, 2819, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2827, 0, 0, 0, 0, 131072, 0, 0, 0, 357, 0, 0, 0, 0, 359, 0, 0, 400, 0, 0, 0, 0, 0, 139264, 147456, 400, 411, 0, 424, 411, 2841, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3187, 528, 2880, 528, 528, 528, 528, 528, 2885, 528, 528, 528, 528, 528, 528, 528, 528, 3502, 528, 528, 528, 528, 528, 528, 528, 57893, 57893, 57893, 60310, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60628, 57893, 57893, 57893, 57893, 57916, 60356, 57916, 57916, 57916, 57916, 57916, 60361, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59953, 57916, 59955, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 60421, 57943, 57943, 57943, 57943, 57943, 60426, 57943, 57943, 57943, 57943, 57943, 57943, 60064, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59566, 57943, 57943, 57943, 57943, 57943, 57893, 60652, 57893, 57893, 57893, 57893, 0, 0, 57916, 57916, 57916, 57916, 57916, 60661, 57916, 60662, 57916, 57916, 57916, 57916, 60701, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 60710, 57943, 57943, 57943, 57943, 57943, 61481, 57943, 57943, 61483, 57943, 0, 0, 0, 0, 0, 0, 0, 2808, 0, 0, 0, 0, 0, 0, 0, 0, 350, 0, 0, 0, 0, 0, 0, 0, 60711, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59587, 528, 3483, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1978, 528, 60867, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59929, 57916, 60909, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60395, 57916, 57916, 57943, 60951, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60069, 57943, 57943, 0, 3670, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 278528, 0, 0, 0, 3675, 0, 0, 0, 3930, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3476, 0, 0, 0, 0, 0, 0, 3935, 528, 528, 528, 528, 3939, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3948, 528, 528, 61294, 57893, 57893, 57893, 57893, 61298, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60342, 57893, 57893, 0, 0, 0, 3000, 0, 57893, 61307, 57893, 57893, 57893, 61310, 57916, 57916, 57916, 57916, 61314, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 0, 0, 0, 0, 528, 528, 528, 3219, 528, 528, 528, 528, 528, 3224, 528, 528, 57916, 57916, 57916, 57916, 61323, 57916, 57916, 57916, 61326, 57943, 57943, 57943, 57943, 61330, 57943, 57943, 57943, 57943, 57943, 60089, 60090, 60091, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59615, 57943, 57943, 57943, 57943, 59621, 57943, 4090, 528, 528, 528, 528, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 61447, 0, 0, 0, 4149, 0, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3851, 528, 528, 528, 528, 528, 4248, 528, 57893, 57893, 57893, 57893, 57893, 61598, 57893, 57893, 57916, 57916, 57916, 57916, 58919, 57916, 57916, 58923, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61572, 61573, 57916, 57916, 57943, 57943, 57943, 57943, 57916, 57916, 57916, 61604, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 61610, 57943, 57943, 0, 0, 0, 0, 363, 0, 0, 0, 0, 139264, 147456, 0, 0, 0, 0, 0, 0, 1307, 0, 528, 528, 1339, 528, 1342, 528, 528, 528, 4269, 0, 4271, 528, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 0, 0, 0, 0, 57893, 57943, 57943, 58413, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61582, 0, 0, 0, 0, 0, 0, 528, 388, 0, 354, 0, 0, 0, 0, 0, 397, 398, 0, 399, 0, 0, 0, 0, 0, 0, 4208, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1380, 528, 528, 528, 528, 528, 528, 371, 379, 407, 0, 0, 0, 371, 0, 0, 354, 0, 0, 0, 371, 0, 410, 412, 0, 371, 399, 0, 0, 371, 379, 0, 139264, 147456, 399, 410, 0, 0, 410, 0, 0, 0, 433, 131072, 0, 433, 433, 443, 0, 0, 433, 0, 412, 433, 0, 0, 0, 0, 131072, 0, 0, 0, 438, 0, 0, 0, 0, 0, 311, 0, 0, 0, 0, 2796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 450560, 450560, 0, 0, 0, 465, 0, 0, 0, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 515, 515, 515, 515, 515, 527, 515, 515, 515, 527, 515, 515, 515, 515, 515, 515, 544, 57910, 544, 57910, 544, 544, 57910, 544, 544, 57933, 57910, 544, 544, 57910, 57910, 57910, 57910, 57960, 57960, 57910, 57910, 57910, 57910, 57960, 57960, 57910, 624, 57910, 57975, 57933, 57910, 57910, 57910, 57910, 57910, 57910, 57910, 57933, 57933, 57910, 57910, 57960, 57910, 57910, 57910, 57975, 57975, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 131072, 0, 0, 0, 441, 342, 0, 0, 0, 453, 0, 342, 343, 344, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2853, 0, 0, 0, 306, 307, 0, 0, 0, 643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3687, 0, 0, 0, 0, 0, 0, 669, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3428, 845, 528, 528, 528, 528, 528, 528, 876, 878, 528, 528, 528, 528, 528, 528, 528, 1415, 528, 528, 528, 528, 528, 528, 1426, 528, 528, 528, 528, 528, 57893, 57893, 58264, 57893, 57893, 57893, 57893, 57893, 57893, 58295, 58297, 57893, 57893, 57893, 57893, 58803, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59384, 57893, 57893, 57893, 57893, 58448, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 2290, 1725, 2291, 0, 0, 0, 0, 0, 1309, 1335, 1336, 0, 1309, 528, 528, 528, 528, 528, 528, 1344, 528, 528, 528, 528, 528, 3706, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1974, 528, 528, 528, 528, 528, 528, 1348, 528, 528, 1359, 528, 528, 1363, 528, 528, 528, 528, 528, 528, 528, 1416, 528, 528, 528, 528, 528, 528, 528, 528, 3709, 528, 528, 528, 528, 528, 528, 528, 58773, 914, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58783, 57893, 57893, 57893, 58787, 57893, 57893, 57893, 57893, 57893, 60623, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58845, 57893, 57893, 57893, 57893, 57893, 58798, 57893, 57893, 58802, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60638, 57893, 57893, 57893, 57893, 57916, 58916, 57916, 57916, 57916, 58920, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59469, 57916, 57916, 57916, 57916, 57916, 58972, 57943, 57943, 57943, 58976, 57943, 57943, 58987, 57943, 57943, 58991, 57943, 57943, 57943, 57943, 57943, 57943, 60076, 60077, 57943, 57943, 57943, 57943, 57943, 57943, 60084, 57943, 59014, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59604, 1745, 1746, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 507904, 0, 0, 0, 0, 1778, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1828, 0, 0, 0, 1791, 0, 1793, 0, 0, 0, 1797, 0, 0, 0, 1801, 0, 0, 0, 1805, 0, 0, 0, 0, 131072, 0, 0, 0, 442, 0, 0, 0, 449, 0, 0, 0, 0, 0, 2846, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1224, 0, 0, 0, 0, 0, 1980, 528, 528, 528, 58773, 0, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60625, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57943, 57943, 57943, 57943, 59545, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60068, 57943, 57943, 57943, 0, 0, 2314, 0, 2315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262738, 0, 0, 0, 0, 2377, 0, 0, 0, 0, 0, 0, 2384, 0, 0, 0, 0, 0, 0, 0, 0, 1326, 1327, 0, 0, 1167, 0, 0, 0, 0, 528, 528, 2421, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 888, 528, 528, 528, 528, 528, 528, 528, 2489, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 0, 0, 57893, 57893, 57893, 57893, 60611, 57893, 57893, 57893, 57893, 57893, 57893, 59868, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58330, 0, 57916, 57916, 57916, 57916, 58347, 0, 0, 0, 57893, 57893, 59851, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60901, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60113, 0, 0, 1729, 0, 0, 1736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139264, 147456, 0, 0, 0, 0, 0, 0, 0, 2858, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2864, 0, 0, 0, 0, 0, 3152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3158, 57893, 57893, 57893, 57893, 60311, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60890, 57893, 60892, 57893, 57893, 60323, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60295, 60443, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60455, 57943, 57943, 57943, 57943, 57943, 59593, 57943, 57943, 59596, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59551, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59565, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59580, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59614, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60037, 57943, 57943, 60041, 57943, 57943, 57943, 60045, 0, 0, 3190, 0, 0, 0, 0, 3195, 0, 0, 0, 0, 0, 0, 0, 0, 1783, 1784, 1785, 0, 0, 0, 0, 0, 3250, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2472, 57893, 57893, 60642, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61385, 57893, 57916, 57916, 57916, 0, 3468, 3469, 0, 0, 0, 0, 3474, 0, 0, 0, 0, 0, 0, 0, 0, 1799, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3681, 0, 0, 0, 3684, 0, 0, 0, 0, 0, 0, 0, 0, 3692, 57893, 61092, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 0, 0, 0, 0, 4290, 528, 3813, 57893, 57893, 61159, 3816, 0, 0, 0, 0, 3820, 0, 0, 0, 0, 0, 0, 1236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2799, 0, 0, 0, 0, 0, 0, 0, 3833, 0, 0, 0, 0, 3837, 0, 0, 0, 0, 0, 0, 0, 0, 3840, 0, 528, 528, 528, 3842, 528, 528, 528, 3845, 528, 528, 528, 528, 528, 528, 528, 1938, 528, 528, 528, 528, 528, 528, 528, 528, 3235, 528, 528, 3238, 528, 528, 528, 528, 57893, 57893, 57893, 61207, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61084, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61226, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60407, 57916, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61302, 57893, 61304, 57893, 57893, 57893, 57893, 58819, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59913, 57893, 57893, 57893, 57893, 57916, 61320, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 4268, 0, 57943, 57943, 61334, 57943, 61336, 57943, 57943, 57943, 57943, 57943, 57943, 528, 57893, 0, 0, 0, 0, 0, 3164, 0, 0, 0, 0, 3169, 0, 0, 0, 0, 0, 0, 1220, 0, 0, 0, 0, 0, 1226, 0, 1228, 0, 4146, 0, 0, 0, 0, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 4160, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61516, 57893, 57893, 57893, 0, 2591, 0, 0, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59996, 57916, 57916, 57916, 57916, 57916, 57916, 528, 528, 57893, 57893, 61560, 57893, 61561, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 0, 0, 0, 0, 57893, 57943, 57943, 58414, 58420, 57943, 57943, 57943, 58436, 58440, 57943, 57943, 57943, 57943, 57943, 61411, 57943, 61413, 61414, 57943, 61416, 57943, 61418, 0, 0, 0, 0, 0, 1849, 0, 0, 0, 0, 0, 0, 1748, 0, 0, 0, 0, 0, 1864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2401, 0, 0, 0, 0, 0, 57916, 61568, 57916, 61569, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 61576, 57943, 57943, 57943, 57943, 57943, 61539, 57943, 61541, 57943, 57943, 57943, 57943, 0, 0, 0, 0, 0, 0, 3435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1273, 0, 0, 0, 0, 0, 0, 61577, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 0, 0, 0, 0, 0, 0, 528, 528, 528, 2871, 2872, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3237, 528, 528, 528, 528, 528, 358, 359, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 0, 296, 0, 0, 0, 0, 131072, 0, 352256, 352256, 0, 0, 0, 352256, 0, 0, 352256, 0, 352256, 352256, 352256, 352256, 352256, 352256, 352256, 352256, 352256, 352256, 352256, 352256, 352256, 352256, 352256, 352256, 0, 482, 482, 482, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 516, 516, 520, 520, 520, 520, 520, 516, 520, 520, 520, 516, 520, 520, 520, 520, 520, 520, 545, 57911, 545, 57911, 545, 545, 57911, 545, 545, 57934, 57911, 545, 545, 57911, 57911, 57911, 57911, 57961, 57961, 57911, 57911, 57911, 57911, 57961, 57961, 57911, 625, 57911, 57976, 57934, 57911, 57911, 57911, 57911, 57911, 57911, 57911, 57934, 57934, 57911, 57911, 57961, 57911, 57911, 57911, 57976, 57976, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 245760, 0, 0, 245760, 0, 0, 245760, 0, 0, 245760, 0, 245760, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 516567, 516567, 516567, 0, 306, 307, 0, 0, 0, 0, 644, 0, 0, 0, 0, 0, 0, 0, 0, 1837, 0, 0, 0, 0, 0, 0, 0, 0, 0, 687, 688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 368, 0, 0, 0, 760, 0, 0, 0, 0, 765, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4841472, 0, 0, 0, 4898816, 0, 794, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 803, 0, 808, 0, 0, 0, 0, 392, 0, 0, 0, 396, 392, 0, 0, 0, 0, 0, 0, 0, 2823, 0, 0, 0, 0, 0, 0, 0, 0, 677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 820, 0, 0, 0, 0, 0, 644, 0, 0, 0, 0, 0, 0, 0, 3436, 0, 0, 0, 0, 0, 0, 0, 0, 681, 0, 0, 0, 0, 0, 0, 680, 0, 0, 794, 0, 0, 0, 0, 0, 0, 0, 0, 644, 0, 0, 794, 528, 528, 528, 528, 528, 3717, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1381, 528, 528, 528, 528, 528, 846, 528, 528, 528, 528, 867, 871, 877, 528, 882, 528, 528, 528, 528, 528, 900, 528, 528, 528, 528, 57893, 57893, 58265, 57893, 57893, 57893, 57893, 58286, 58290, 58296, 57893, 58301, 57916, 57916, 58362, 58366, 58372, 57916, 58377, 57916, 57916, 57916, 57916, 57916, 58395, 57916, 57916, 57916, 57916, 57916, 61231, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60686, 57916, 57916, 57916, 57916, 57916, 57943, 58452, 57943, 57943, 57943, 57943, 57943, 58470, 57943, 57943, 57943, 57943, 528, 528, 528, 900, 1215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3441, 1264, 0, 0, 0, 0, 0, 1269, 0, 0, 0, 0, 0, 1274, 0, 0, 0, 0, 0, 3179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 679, 0, 0, 0, 0, 0, 0, 1294, 0, 0, 1165, 0, 0, 0, 1300, 0, 1302, 0, 0, 0, 0, 0, 0, 1284, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1301, 0, 0, 0, 0, 0, 0, 0, 1300, 1319, 0, 1322, 0, 0, 0, 1196, 0, 0, 0, 0, 1330, 0, 0, 1215, 1330, 1337, 528, 528, 528, 528, 1343, 528, 528, 528, 528, 1349, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1370, 528, 528, 0, 57893, 57893, 57893, 57893, 57893, 57893, 155942, 0, 0, 0, 0, 0, 0, 0, 1285, 0, 0, 0, 0, 1290, 0, 0, 0, 58773, 914, 58775, 57893, 57893, 57893, 57893, 57893, 58782, 57893, 57893, 57893, 57893, 58788, 57893, 57893, 57893, 57893, 57893, 60872, 57893, 57893, 57893, 57893, 57893, 60876, 57893, 57893, 57893, 57893, 57893, 58860, 57893, 57893, 57893, 57893, 57893, 50676, 58773, 990, 57916, 57916, 57916, 58917, 57916, 57916, 57916, 57916, 58922, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60403, 57916, 57916, 57916, 60406, 57916, 57916, 58930, 57916, 57916, 57916, 58937, 58939, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59957, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 58977, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 58998, 57943, 59016, 57943, 57943, 57943, 57943, 57943, 59021, 57943, 57943, 57943, 59025, 57943, 57943, 57943, 59032, 59034, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59622, 57943, 59057, 528, 528, 528, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 1151, 0, 0, 0, 0, 385024, 0, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 5259264, 4358144, 4358144, 4358144, 4358144, 0, 0, 1729, 0, 0, 0, 0, 1736, 0, 0, 0, 0, 0, 0, 0, 0, 1880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1747, 1748, 0, 0, 0, 0, 0, 1754, 0, 0, 0, 0, 0, 0, 0, 3447, 0, 0, 0, 0, 0, 3450, 0, 3452, 0, 1776, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5177344, 0, 0, 0, 0, 0, 1794, 0, 0, 0, 0, 0, 0, 0, 1802, 1803, 0, 0, 0, 0, 0, 3207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3183, 0, 0, 0, 0, 0, 0, 0, 0, 1810, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1841, 0, 1843, 0, 0, 0, 1874, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3213, 0, 0, 528, 528, 528, 1901, 528, 528, 528, 528, 1907, 528, 528, 528, 528, 528, 528, 528, 2441, 528, 528, 528, 528, 528, 528, 528, 528, 3720, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1918, 528, 528, 528, 528, 1922, 528, 528, 528, 528, 528, 528, 528, 2466, 2467, 528, 528, 528, 528, 528, 528, 528, 1417, 528, 528, 528, 528, 528, 528, 528, 528, 3856, 528, 528, 528, 57893, 57893, 57893, 57893, 528, 528, 528, 528, 1968, 1969, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1924, 1925, 528, 528, 528, 528, 57893, 57893, 59344, 57893, 57893, 57893, 57893, 59350, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61212, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59361, 57893, 57893, 57893, 57893, 59365, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59883, 57893, 57893, 57893, 59886, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59378, 57893, 57893, 57893, 59383, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59909, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59915, 57893, 57893, 57893, 59412, 59413, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59921, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59351, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 59444, 57916, 57916, 57916, 57916, 59450, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60685, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59461, 57916, 57916, 57916, 57916, 59465, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60943, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59478, 57916, 57916, 57916, 59483, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60021, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60029, 57916, 57916, 59512, 59513, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59470, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 59546, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59557, 57943, 57943, 57943, 57943, 59561, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60082, 57943, 57943, 57943, 57943, 59574, 57943, 57943, 57943, 59579, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60735, 57943, 57943, 57943, 57943, 57943, 59608, 59609, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60095, 57943, 57943, 2302, 2303, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5767168, 0, 2339, 0, 0, 2341, 2342, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 335872, 0, 0, 0, 0, 528, 2434, 528, 528, 2438, 528, 528, 528, 2442, 528, 528, 528, 528, 528, 528, 528, 2912, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3857, 528, 528, 57893, 57893, 57893, 57893, 528, 528, 528, 528, 2452, 528, 528, 528, 2455, 528, 528, 528, 528, 528, 528, 528, 2925, 528, 528, 528, 2928, 528, 528, 528, 528, 528, 2487, 528, 528, 528, 528, 528, 2492, 528, 528, 528, 528, 528, 528, 528, 0, 0, 57893, 57893, 57893, 60610, 57893, 57893, 57893, 57893, 57893, 60615, 57893, 0, 2503, 0, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60288, 57893, 57893, 60291, 60292, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59865, 57893, 57893, 59869, 57893, 57893, 57893, 59873, 57893, 57893, 57893, 57893, 57893, 60312, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60320, 57893, 57893, 59916, 57893, 57893, 57893, 57893, 59920, 57893, 57893, 57893, 57893, 57893, 59925, 57893, 57893, 57893, 57893, 57893, 60328, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58867, 50676, 58773, 990, 58870, 57916, 57916, 57916, 57916, 57916, 60005, 57916, 57916, 57916, 57916, 60009, 57916, 57916, 57916, 57916, 57916, 60014, 57943, 57943, 57943, 57943, 60088, 57943, 57943, 57943, 57943, 60092, 57943, 57943, 57943, 57943, 57943, 60097, 2856, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2863, 0, 0, 0, 0, 0, 0, 212992, 0, 0, 0, 0, 0, 212992, 212992, 212992, 212992, 2893, 528, 528, 528, 528, 2896, 528, 528, 2898, 528, 2899, 528, 528, 528, 528, 528, 1356, 528, 1361, 528, 528, 1365, 528, 528, 1368, 528, 528, 528, 528, 528, 2907, 528, 528, 2911, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2494, 528, 528, 2497, 2498, 528, 0, 2920, 528, 528, 528, 2923, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3506, 3507, 528, 528, 57893, 60308, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60317, 57893, 57893, 60321, 57893, 57893, 57893, 57893, 58835, 57893, 57893, 57893, 58842, 58844, 57893, 57893, 57893, 57893, 57893, 57893, 59381, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60902, 57893, 57893, 60905, 57893, 57893, 57893, 0, 57916, 57916, 60346, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60354, 60369, 57916, 57916, 57916, 57916, 60372, 57916, 57916, 60374, 57916, 60375, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 4288, 0, 0, 0, 528, 57916, 57916, 57916, 57916, 60384, 57916, 57916, 60388, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60402, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59995, 57916, 57916, 57916, 57916, 60000, 57916, 57916, 57916, 60397, 57916, 57916, 57916, 60400, 60401, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60683, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59452, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 60419, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60469, 57943, 57943, 57943, 57943, 57943, 60434, 57943, 57943, 57943, 57943, 60437, 57943, 57943, 60439, 57943, 60440, 57943, 57943, 57943, 57943, 57943, 60422, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61155, 57943, 57943, 57943, 528, 57943, 57943, 57943, 57943, 60462, 57943, 57943, 57943, 60465, 60466, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60752, 57943, 57943, 528, 528, 528, 57893, 57893, 57893, 0, 0, 0, 0, 0, 3658, 0, 0, 3228, 528, 528, 528, 528, 3233, 528, 528, 528, 3236, 528, 528, 528, 528, 528, 528, 3255, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2482, 528, 528, 528, 528, 528, 3261, 528, 528, 0, 0, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60616, 57893, 60619, 57893, 57893, 57893, 57893, 60624, 57893, 57893, 57893, 60627, 57893, 57893, 57893, 57893, 57893, 58805, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 57916, 57916, 57916, 61460, 57916, 57893, 57893, 57893, 60654, 57893, 57893, 0, 0, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60692, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59499, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60665, 57916, 60668, 57916, 57916, 57916, 57916, 60673, 57916, 57916, 57916, 60676, 57916, 57916, 57916, 57916, 58935, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58887, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 60714, 57943, 60717, 57943, 57943, 57943, 57943, 60722, 57943, 57943, 57943, 60725, 57943, 57943, 57943, 57943, 57943, 61580, 61581, 57943, 57943, 0, 0, 0, 0, 4242, 0, 528, 528, 528, 528, 528, 528, 528, 528, 2427, 528, 528, 528, 528, 2431, 528, 0, 3454, 0, 3455, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1883, 0, 0, 0, 528, 528, 528, 3485, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1384, 528, 528, 528, 528, 528, 3497, 528, 528, 528, 528, 528, 528, 528, 528, 3505, 528, 528, 528, 528, 528, 2453, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1382, 528, 528, 528, 1386, 528, 57893, 57893, 60869, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60637, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60314, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60341, 57893, 57893, 57893, 0, 2999, 0, 0, 0, 57893, 60881, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60889, 57893, 57893, 57893, 57893, 57893, 58820, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58829, 57893, 57893, 57916, 57916, 57916, 60911, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59503, 57916, 57916, 57916, 57916, 57916, 60923, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60931, 57916, 57916, 57916, 57916, 57916, 59481, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58911, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 60953, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60094, 57943, 57943, 57943, 57943, 57943, 57943, 60965, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60973, 57943, 57943, 57943, 57943, 57943, 60050, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60745, 57943, 57943, 57943, 0, 3680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3439, 0, 0, 0, 0, 0, 3693, 3694, 0, 0, 0, 0, 528, 528, 528, 528, 528, 528, 528, 2875, 528, 528, 528, 528, 528, 528, 528, 528, 3704, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3494, 528, 528, 3714, 528, 528, 528, 528, 528, 3719, 528, 3721, 528, 528, 528, 528, 528, 528, 3488, 528, 528, 528, 528, 528, 3492, 528, 528, 528, 61091, 57893, 61093, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61131, 61132, 57943, 57943, 57916, 57916, 57916, 57916, 61104, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61110, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61114, 57916, 57916, 57916, 57916, 57916, 57916, 61120, 57916, 61122, 57916, 57916, 57916, 57916, 57916, 61324, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60970, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61149, 57943, 61151, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 528, 2761, 528, 528, 528, 57893, 60110, 57893, 57893, 528, 528, 57893, 57893, 57893, 0, 0, 0, 3818, 0, 0, 0, 0, 0, 0, 0, 722, 0, 724, 0, 0, 0, 0, 0, 0, 0, 0, 3823, 0, 0, 0, 0, 0, 0, 0, 3675, 0, 0, 0, 0, 3831, 0, 528, 528, 528, 528, 528, 3843, 528, 528, 528, 3847, 528, 528, 528, 528, 528, 1357, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1422, 528, 528, 528, 528, 57893, 61205, 57893, 57893, 57893, 61209, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60886, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59896, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61218, 57893, 57893, 57893, 57893, 57916, 57916, 57916, 57916, 57916, 61224, 57916, 0, 0, 0, 0, 57893, 57943, 57943, 58415, 57943, 57943, 57943, 57943, 57943, 57943, 58446, 57916, 57916, 61228, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60697, 57916, 57916, 57916, 61237, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 57943, 61243, 57943, 57943, 57943, 61247, 528, 4162, 57893, 57893, 57893, 61510, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61518, 57893, 57893, 57893, 57893, 58858, 57893, 57893, 57893, 57893, 57893, 57893, 50676, 58773, 990, 57916, 57916, 57916, 57916, 58903, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 58913, 57916, 57916, 57916, 57916, 61523, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61531, 57916, 57943, 57943, 57943, 57943, 57943, 60955, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59581, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61536, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 61544, 57943, 0, 0, 0, 0, 0, 0, 262144, 262144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4203, 4204, 4205, 0, 4207, 528, 528, 528, 528, 528, 528, 528, 528, 528, 4213, 4214, 528, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61564, 61565, 57893, 57893, 57916, 0, 0, 0, 0, 57893, 57943, 57943, 58416, 57943, 57943, 57943, 57943, 58437, 58441, 58447, 528, 528, 528, 57893, 57893, 57893, 57893, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 4298, 0, 528, 4299, 57893, 61644, 57916, 61645, 57943, 61646, 0, 528, 57893, 57916, 57943, 0, 528, 528, 528, 528, 528, 528, 2425, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3246, 528, 528, 528, 528, 528, 528, 0, 0, 0, 361, 362, 0, 0, 0, 0, 0, 0, 0, 368, 0, 296, 0, 0, 0, 0, 393685, 0, 393685, 393685, 393685, 0, 393685, 393685, 393685, 393685, 393685, 393685, 0, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 1731, 0, 0, 0, 0, 0, 0, 0, 1741, 1742, 0, 0, 0, 0, 0, 278528, 278528, 0, 0, 0, 0, 0, 0, 0, 0, 0, 416, 416, 0, 0, 0, 0, 0, 426, 426, 0, 0, 131072, 426, 0, 0, 0, 0, 426, 0, 0, 454, 0, 426, 0, 483, 483, 483, 0, 0, 362, 362, 362, 502, 362, 362, 362, 362, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 483, 546, 57912, 546, 57912, 546, 546, 57912, 546, 546, 57935, 57912, 546, 546, 57912, 57912, 57912, 57912, 57962, 57962, 57912, 57912, 57912, 57912, 57962, 57962, 57912, 546, 57912, 57912, 57935, 57912, 57912, 57912, 57912, 57912, 57912, 57912, 57935, 57935, 57912, 57912, 57962, 57912, 57912, 57912, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 368, 368, 0, 703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2298, 0, 0, 0, 905, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58287, 57893, 57893, 57893, 57893, 57893, 60340, 57893, 57893, 57893, 57893, 57893, 0, 2999, 0, 0, 0, 57893, 58306, 57893, 57893, 57893, 57893, 58324, 57893, 57893, 57893, 0, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 61129, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60741, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60753, 57943, 528, 528, 528, 57893, 57893, 57893, 57916, 57916, 58363, 57916, 57916, 57916, 57916, 57916, 58382, 57916, 57916, 57916, 57916, 58400, 57916, 57916, 57916, 57916, 58936, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60392, 57916, 57916, 57916, 57916, 57916, 0, 0, 0, 0, 58306, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 58438, 57943, 57943, 57943, 57943, 57943, 60448, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60427, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 58457, 57943, 57943, 57943, 57943, 58475, 57943, 57943, 57943, 528, 528, 528, 528, 2284, 57893, 57893, 57893, 57893, 59633, 2290, 0, 2291, 0, 0, 905, 528, 0, 57893, 57893, 57893, 57893, 58324, 57893, 155942, 1151, 0, 1152, 0, 0, 1157, 0, 0, 0, 1266, 0, 0, 0, 0, 0, 0, 0, 1266, 0, 0, 0, 0, 0, 0, 450560, 0, 0, 450560, 0, 450560, 450560, 450560, 450560, 450560, 450560, 450560, 450560, 450560, 450560, 450560, 450560, 450560, 450560, 450560, 450560, 1346, 528, 528, 528, 1355, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3711, 528, 528, 528, 58773, 914, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 58785, 57893, 57893, 57893, 58794, 57893, 57893, 58855, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 50676, 58773, 990, 57916, 57916, 57916, 57916, 58938, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61121, 57916, 57916, 57916, 57916, 57943, 57943, 58974, 57943, 57943, 57943, 58983, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59045, 57943, 57943, 57943, 57943, 57943, 57943, 0, 0, 0, 1730, 0, 0, 0, 0, 1737, 0, 0, 0, 0, 0, 0, 0, 739, 0, 0, 0, 0, 0, 0, 0, 0, 1271, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1762, 0, 0, 0, 0, 0, 0, 0, 1770, 1771, 0, 0, 0, 0, 0, 3422, 0, 0, 0, 0, 0, 0, 0, 3426, 0, 0, 0, 0, 0, 1834, 0, 0, 0, 0, 0, 0, 0, 1840, 0, 0, 0, 0, 0, 0, 532480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 694, 0, 0, 0, 0, 0, 368, 0, 0, 1846, 0, 1848, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 376832, 0, 376832, 0, 0, 1915, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2499, 528, 1930, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1943, 528, 528, 0, 57893, 57893, 57893, 57893, 57893, 57893, 155942, 1151, 0, 0, 0, 0, 0, 0, 0, 4857856, 4874240, 0, 0, 0, 0, 0, 0, 0, 796, 0, 0, 0, 0, 805, 0, 0, 0, 59373, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59386, 57893, 57893, 57893, 2588, 0, 0, 0, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60352, 57916, 57916, 57916, 57916, 57916, 57893, 57893, 59411, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59422, 57893, 57893, 57893, 57893, 57893, 60884, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60903, 57893, 57893, 57893, 57893, 57893, 57916, 59511, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59522, 57916, 57916, 57916, 57916, 57916, 61395, 57916, 61397, 61398, 57916, 61400, 57916, 61402, 57943, 57943, 57943, 3916, 528, 61261, 57893, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2774, 0, 0, 0, 0, 59607, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59618, 57943, 57943, 57943, 57943, 57943, 58978, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 58997, 0, 0, 2326, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221652, 221652, 221652, 0, 0, 2504, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61097, 57893, 57893, 57893, 57916, 57916, 57916, 57916, 57916, 528, 3229, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2447, 528, 60618, 57893, 60620, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61211, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59870, 57893, 57893, 57893, 57893, 59875, 57893, 57893, 57916, 57916, 57916, 60667, 57916, 60669, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60404, 57916, 57916, 57916, 57916, 57916, 60698, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 60709, 57943, 57943, 57943, 57943, 57943, 60463, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59599, 57943, 57943, 57943, 59605, 57943, 57943, 57943, 57943, 60716, 57943, 60718, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59046, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60747, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 528, 528, 528, 57893, 57893, 57893, 0, 0, 0, 3656, 0, 0, 0, 0, 0, 0, 0, 3432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2323, 2324, 0, 0, 57943, 57943, 61250, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60724, 57943, 57943, 0, 4147, 0, 0, 0, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 0, 4161, 528, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61517, 57893, 57893, 57893, 57893, 57893, 60898, 60900, 57893, 57893, 57893, 57893, 60904, 57893, 60906, 60907, 57893, 57916, 57916, 57916, 61627, 57916, 57943, 57943, 57943, 57943, 61631, 57943, 0, 0, 0, 0, 528, 528, 2870, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2878, 373, 373, 0, 0, 131072, 373, 0, 0, 0, 0, 373, 0, 0, 0, 0, 373, 547, 57913, 547, 57913, 547, 547, 57913, 547, 547, 57936, 57913, 547, 547, 57913, 57913, 57913, 57913, 57963, 57963, 57913, 57913, 57913, 57913, 57963, 57963, 57913, 547, 57913, 57913, 57936, 57913, 57913, 57913, 57913, 57913, 57913, 57913, 57936, 57936, 57913, 57913, 57963, 57913, 57913, 57913, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 528, 528, 528, 528, 861, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 3723, 528, 528, 528, 57916, 58356, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60677, 57916, 57893, 58799, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 61221, 57893, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 60023, 57943, 57943, 57943, 57943, 57943, 57943, 528, 528, 1931, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1401, 528, 528, 57893, 59374, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59882, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60290, 57893, 57893, 57893, 57893, 57893, 57893, 59474, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60920, 57916, 0, 0, 0, 3824, 0, 3825, 0, 0, 0, 0, 3675, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1227, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 364, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2335, 0, 0, 0, 365, 0, 0, 0, 0, 364, 0, 0, 0, 139264, 147456, 0, 0, 0, 0, 0, 0, 1324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 434, 131072, 0, 434, 434, 0, 0, 0, 434, 0, 365, 434, 0, 0, 0, 0, 401408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6471680, 0, 0, 0, 466, 0, 0, 0, 494, 494, 497, 497, 497, 497, 503, 504, 497, 497, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 548, 57914, 548, 57914, 548, 548, 57914, 548, 548, 57937, 57914, 548, 548, 57914, 57914, 57914, 57914, 57964, 57964, 57914, 57914, 57914, 57914, 57964, 57964, 57914, 626, 57914, 57977, 57937, 57914, 57914, 57914, 57914, 57914, 57914, 57914, 57937, 57937, 57914, 57914, 57964, 57914, 57914, 57914, 57977, 57977, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 459187, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 528, 528, 528, 528, 528, 528, 528, 528, 0, 528, 2420, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1402, 528, 528, 0, 0, 0, 57893, 59850, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60287, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60302, 57893, 57893, 57893, 57893, 60305, 57893, 57893, 60307, 528, 528, 528, 528, 2895, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 4026, 57893, 57893, 57893, 57893, 60337, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 0, 0, 0, 0, 0, 0, 1781, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139264, 147456, 0, 0, 335872, 0, 0, 57916, 57916, 57916, 57916, 60371, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61401, 57916, 57943, 57943, 57943, 368, 368, 0, 0, 0, 0, 705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139264, 147456, 0, 0, 540672, 0, 0, 0, 0, 735, 0, 801, 0, 0, 0, 0, 0, 0, 0, 0, 801, 0, 0, 0, 0, 416, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3464, 0, 0, 0, 528, 528, 528, 528, 862, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 61203, 57893, 57893, 57893, 57916, 58357, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61111, 57916, 1202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 368, 368, 0, 0, 0, 0, 0, 0, 0, 0, 709, 0, 0, 0, 0, 0, 0, 1251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2810, 0, 0, 0, 0, 0, 0, 58853, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 50676, 58773, 990, 57916, 57916, 57916, 57916, 59463, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60696, 57916, 57916, 57916, 57916, 59015, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 60442, 1726, 0, 0, 0, 0, 1733, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 319488, 319488, 0, 0, 0, 0, 0, 57916, 57916, 57916, 59978, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59959, 57916, 57916, 57916, 57943, 57943, 57943, 60061, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59011, 57943, 57943, 57943, 2779, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245760, 528, 528, 2881, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1404, 528, 528, 57916, 57916, 60357, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 60919, 57916, 57916, 0, 306, 307, 0, 0, 0, 0, 0, 0, 0, 647, 0, 0, 0, 0, 0, 0, 1813, 0, 0, 0, 0, 0, 0, 0, 0, 0, 787, 0, 0, 0, 0, 0, 0, 906, 528, 528, 528, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 906, 528, 0, 57893, 58490, 57893, 57893, 58325, 57893, 155942, 1151, 0, 0, 0, 0, 0, 0, 1836, 0, 0, 1838, 0, 0, 0, 0, 0, 0, 0, 2861, 2813, 0, 0, 0, 0, 0, 2866, 0, 57893, 57893, 58856, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 50676, 58773, 990, 57916, 57916, 57916, 57916, 59495, 59496, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61574, 57943, 57943, 57943, 57943, 0, 0, 1862, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 327680, 327680, 327680, 528, 528, 1948, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 1942, 528, 528, 57893, 59391, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60313, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59922, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59491, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61123, 57916, 57916, 0, 0, 0, 57893, 57893, 57893, 57893, 59853, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60329, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59367, 59368, 57893, 57893, 57893, 57893, 57893, 59877, 57893, 59879, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60636, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60316, 57893, 57893, 57893, 57893, 57893, 57893, 57916, 57916, 57916, 57916, 59966, 57916, 59968, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61117, 57916, 61119, 57916, 57916, 57916, 57916, 57916, 57916, 57943, 57943, 57943, 57943, 60049, 57943, 60051, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59552, 57943, 57943, 57943, 57943, 59556, 57943, 60381, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 61403, 57943, 57943, 57943, 57943, 57943, 60446, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 57943, 59554, 57943, 57943, 57943, 0, 3418, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 352256, 352256, 352256, 57893, 57893, 57893, 57893, 60871, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 60645, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 57893, 59923, 57893, 57893, 57893, 57893, 57893, 57893, 3713, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 2500, 57916, 57916, 61113, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 57916, 59973, 57916, 57916, 57916, 0, 0, 0, 2310144, 0, 0, 0, 0, 0, 0, 2310144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2310144, 0, 0, 2310144, 0, 0, 0, 0, 0, 0, 0, 2310144, 2310144, 0, 0, 0, 0, 0, 0, 0, 0, 2310144, 0, 0, 0, 2310144, 0, 0, 0, 0, 0, 2310144, 0, 2310144, 0, 0, 0, 0, 0, 0, 2310144, 2310561, 2310561, 0, 2310144, 0, 0, 2310144, 0, 0, 2310144, 0, 2310144, 2310144, 0, 2310144, 0, 2310144, 2310144, 0, 0, 0, 0, 0, 0, 2310561, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2359296, 368, 0, 0, 0, 0, 2310144, 0, 0, 2310740, 2310740, 2310740, 2310740, 2310740, 2310740, 2310740, 2310740, 2310740, 2310740, 2310740, 2310740, 2310740, 2310144, 2310740, 2310144, 2310144, 2310740, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 459347, 459347, 459347, 459347, 459347, 459347, 459347, 459347, 459347, 459347, 459347, 459347, 459347, 459222, 459379, 459222, 2318336, 0, 0, 0, 4268032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4276224, 0, 0, 0, 0, 4358144, 4358144, 4358144, 4358144, 0, 914, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4956160, 4964352, 0, 0, 0, 0, 0, 467, 2335204, 2335204, 2335204, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 2335238, 2335238, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 467, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2335238, 2335204, 2335238, 2335238, 2335238, 2335238, 2335238, 2335238, 2335238, 2335238, 2335238, 2335238, 2335238, 2335238, 2335238, 2335238, 2335238, 2335238, 0, 0, 0, 2342912, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2348, 0, 0, 0, 0, 0, 0, 2326528, 0, 0, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 4358144, 5177344, 4358144, 4358144, 4358144, 4358144, 0, 0, 0, 2359296, 0, 2359296, 0, 0, 0, 2359296, 0, 2359296, 2359296, 2359296, 2359296, 2359296, 2359296, 2359296, 2359296, 2359296, 2359296, 2359296, 2359296, 2359296, 2359296, 2359296, 2359296, 2359296, 2359296, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 573440, 0, 573440, 573440, 573440, 0, 573440, 573440, 573440, 573440, 573440, 573440, 1, 24578, 3, 0, 0, 4366336, 0, 0, 0, 0, 0, 302, 303, 0, 0, 2367488, 0, 0, 4268032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4931584, 0, 0, 0, 0, 0, 0, 2351104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 507904, 507904, 507904, 0, 913, 0, 0, 0, 0, 0, 4857856, 4874240, 0, 0, 0, 0, 0, 0, 0, 1180, 0, 0, 0, 0, 1184, 0, 0, 1187, 0, 6275072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 989, 0, 0, 0, 0, 913, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 4359057, 5260177, 4359057, 4359057, 0, 0, 1, 24578, 3, 155942, 155942, 296, 0, 0, 0, 0, 0, 302, 303, 0, 0, 0, 0, 573440, 573440, 573440, 573440, 573440, 573440, 573440, 573440, 573440, 573440, 573440, 573440, 573440, 573440, 573440, 573440, 212992, 0, 212992, 212992, 212992, 212992, 212992, 212992, 212992, 212992, 212992, 212992, 212992, 212992, 212992, 212992, 212992, 212992, 212992, 212992, 0, 0, 0, 0, 0, 4366336, 0, 0, 0, 0, 0, 0, 0, 0, 2412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6275072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6258688, 6447104, 0, 0, 6127616, 0, 6348800, 5906432, 0, 5537792, 0, 4882432, 0, 0, 0, 0, 0, 0, 4825088, 0, 0, 5177344, 0, 0, 0, 0, 5701632, 0, 0, 0, 0, 0, 4358144, 4358144, 4358144, 4825088, 4358144, 4358144, 4358144, 4358144, 0, 0, 913, 913, 913, 4826001, 913, 913, 913, 913, 913, 913, 0, 0, 989, 989, 4842461, 989, 989, 989, 4899805, 989, 0, 0, 5513216, 5783552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4358144, 4358144, 4358144, 4358144, 4358144, 4857856, 4874240\n];\n\nJSONiqParser.EXPECTED =\n[ 169, 185, 215, 1326, 231, 1001, 278, 928, 942, 1085, 320, 247, 263, 307, 336, 352, 368, 384, 400, 914, 2264, 430, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2268, 1707, 1603, 1403, 460, 1356, 1591, 491, 507, 517, 533, 1816, 1031, 2119, 564, 475, 580, 596, 625, 684, 700, 1905, 716, 1114, 747, 778, 788, 1693, 1145, 762, 804, 820, 836, 852, 868, 884, 900, 958, 988, 1017, 972, 1997, 1047, 1057, 1073, 1101, 1130, 2028, 1562, 1190, 1205, 1221, 1237, 1253, 1269, 1298, 1314, 1342, 1174, 1446, 1372, 1876, 2073, 1633, 668, 1388, 1419, 1434, 1467, 1483, 1499, 1515, 609, 1531, 1547, 1578, 444, 654, 640, 1619, 1649, 1662, 1678, 1723, 1738, 1754, 1770, 1786, 1802, 1832, 1848, 291, 1864, 2228, 1892, 1921, 1937, 199, 2149, 1953, 1969, 1985, 1282, 2013, 2044, 2060, 2089, 2105, 548, 2135, 2165, 2181, 2197, 2213, 1160, 2244, 731, 2260, 2264, 1457, 412, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 2264, 419, 2284, 2288, 2290, 2290, 2290, 2291, 2295, 2290, 2297, 2301, 2304, 2311, 2307, 2315, 2318, 2322, 2326, 2330, 2334, 2338, 2345, 2345, 3446, 2344, 2345, 3427, 2352, 3605, 2345, 4169, 2345, 2345, 2345, 3950, 4664, 4990, 4059, 4582, 2828, 4588, 2345, 4069, 4598, 2345, 4069, 4603, 2734, 3100, 2397, 2497, 2359, 2366, 2466, 2372, 2376, 2345, 2345, 4266, 2345, 2345, 2383, 3820, 2359, 2359, 2392, 2419, 2419, 2419, 2419, 2405, 2427, 2345, 2345, 2345, 2345, 2345, 2409, 2455, 3819, 2345, 2345, 3099, 3100, 3100, 3100, 2495, 2398, 2398, 2398, 2504, 2359, 2359, 2359, 2482, 2419, 2419, 2419, 2517, 2345, 2345, 2345, 2457, 2345, 3100, 3100, 3101, 2398, 2398, 2398, 2359, 2359, 2359, 2359, 2359, 2418, 2419, 2419, 2419, 2419, 2419, 2424, 2437, 2345, 2345, 2345, 2345, 4505, 2729, 2345, 2345, 2345, 2345, 4509, 5101, 4513, 2345, 2345, 3904, 2359, 2359, 2484, 2419, 2419, 2519, 2345, 3864, 2345, 4865, 3100, 3100, 2501, 2398, 2538, 2359, 2359, 2359, 2359, 2359, 2548, 2419, 2419, 2419, 2419, 2395, 2490, 2345, 2345, 2359, 2483, 2419, 2549, 2508, 3755, 2345, 4867, 4911, 2398, 2400, 2359, 2515, 2419, 2525, 3605, 3100, 2476, 2401, 2547, 2550, 2816, 4868, 2399, 2481, 2485, 2735, 2532, 2503, 2361, 2368, 4866, 2476, 2360, 2420, 4909, 2537, 2546, 2486, 2533, 2362, 2542, 2554, 2567, 2571, 2575, 2579, 2583, 2586, 2586, 2586, 2598, 2591, 2586, 2587, 2595, 2602, 2606, 2610, 2614, 2618, 2622, 2626, 2630, 4594, 2634, 2345, 2345, 2903, 2640, 2345, 2345, 2999, 2345, 2345, 2645, 2345, 2345, 2345, 2345, 2345, 2345, 4208, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 4460, 2655, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2655, 2345, 2345, 2636, 4128, 2345, 2345, 2345, 2345, 2635, 4127, 2345, 2345, 2345, 2345, 2635, 4127, 2794, 2345, 2345, 2345, 3016, 2798, 2345, 2345, 2345, 3017, 2799, 2345, 2345, 2345, 2806, 2729, 2876, 3308, 2345, 2915, 2345, 3310, 2345, 2922, 2345, 3536, 2683, 4475, 3831, 4927, 2685, 4422, 2850, 2345, 2345, 2345, 2345, 2345, 2345, 5004, 2345, 2345, 2345, 2345, 4417, 3024, 3547, 2854, 5007, 2861, 2345, 2345, 2345, 2345, 4422, 2869, 2345, 2345, 2345, 2345, 2345, 2868, 2729, 2345, 2345, 2345, 2345, 2345, 2873, 2345, 2345, 2345, 4443, 2345, 3549, 3338, 2880, 2345, 2345, 2345, 2345, 2887, 2729, 2345, 2345, 2345, 2883, 2880, 2345, 2345, 4951, 4956, 2345, 2345, 2345, 2345, 4604, 4971, 4982, 2345, 2345, 4805, 4988, 3762, 2345, 3965, 2345, 4436, 4591, 2907, 2345, 3192, 2909, 2345, 4490, 2345, 3191, 2908, 2345, 3491, 4849, 4476, 4920, 4920, 4920, 4849, 2720, 4477, 4477, 4477, 4918, 4922, 2683, 4476, 4863, 4478, 2719, 2684, 2432, 2429, 2431, 2563, 2345, 2345, 2345, 2345, 2345, 2345, 2984, 2345, 2345, 2345, 2511, 4068, 4075, 2345, 2345, 4081, 2345, 4085, 2345, 2345, 4099, 2345, 3067, 3768, 2729, 4088, 2928, 3046, 2947, 2932, 2935, 2938, 2940, 2940, 2944, 2345, 2951, 2956, 2345, 2345, 5022, 2729, 2345, 2345, 2345, 2345, 4180, 2345, 2345, 2345, 2345, 5023, 2345, 4654, 2345, 4496, 2345, 3077, 4168, 3570, 5100, 4176, 2345, 2345, 2345, 5024, 2345, 2345, 4147, 2345, 2345, 4258, 2345, 2345, 2339, 3845, 2345, 3726, 3911, 3122, 3918, 2345, 4757, 2345, 4949, 2345, 2961, 2974, 2978, 3641, 3718, 2988, 2996, 2722, 3003, 3008, 2345, 2998, 4205, 2345, 2952, 2345, 2345, 3697, 2345, 3015, 4630, 3021, 3029, 3033, 2412, 2991, 2723, 3040, 3497, 2345, 2951, 2956, 2345, 5067, 4831, 2345, 3623, 2964, 3050, 4101, 2345, 3156, 3059, 2345, 2345, 5115, 3712, 2387, 4578, 2345, 5120, 2458, 2509, 4221, 2345, 5107, 2345, 3202, 2763, 3060, 2345, 2345, 2345, 3733, 2345, 2951, 2733, 2345, 4755, 4856, 3111, 4236, 2557, 3086, 2345, 2348, 3162, 2345, 2345, 2527, 3154, 2345, 2345, 2347, 3161, 2345, 2345, 4684, 3167, 3432, 4676, 3096, 2345, 2345, 2345, 2345, 2472, 3106, 2345, 2345, 2345, 2345, 2346, 3105, 2345, 2345, 2345, 4878, 3110, 3119, 2345, 5067, 4832, 4234, 3023, 3126, 4109, 3602, 3171, 3176, 2345, 4069, 3180, 2345, 4170, 3176, 2345, 2345, 3187, 2345, 4682, 3217, 4094, 3257, 3196, 3972, 3190, 2345, 3974, 2345, 3251, 3209, 2345, 3973, 2345, 3214, 3218, 3223, 3227, 3231, 4192, 2345, 3229, 2345, 3237, 3606, 3242, 3246, 4319, 3250, 3238, 3230, 3255, 3261, 3266, 3266, 3266, 3274, 3278, 3262, 3262, 3262, 3285, 3289, 4198, 3290, 4959, 3294, 4246, 5038, 3298, 3302, 3306, 3316, 3322, 3329, 2345, 2345, 2345, 2345, 3926, 2345, 2345, 2875, 3333, 3337, 4593, 3342, 3347, 4397, 3357, 3361, 3365, 3366, 3366, 3370, 2345, 4118, 3376, 2345, 4445, 3382, 4945, 3392, 2721, 3398, 2829, 3406, 3410, 3417, 3424, 3004, 3431, 3947, 2345, 3426, 2345, 2345, 3115, 3658, 4038, 4560, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2650, 2345, 2345, 2454, 2345, 2345, 2345, 4867, 3100, 3100, 3100, 3100, 3101, 2398, 2398, 2398, 2398, 2545, 2359, 2359, 2359, 2359, 2359, 2464, 2419, 2419, 2419, 2419, 2419, 2395, 2470, 4119, 2345, 2345, 3437, 3706, 3578, 3394, 4115, 2345, 5085, 3441, 3522, 4170, 3451, 2345, 2345, 3132, 3489, 2345, 2345, 2345, 2345, 3143, 3495, 2345, 2345, 2345, 2345, 4516, 3484, 2345, 4070, 3455, 2345, 2345, 2345, 4071, 3456, 2345, 2345, 2345, 3460, 3464, 2345, 2345, 2345, 3098, 3100, 3100, 3100, 3100, 3100, 2397, 2398, 2398, 2398, 2398, 2398, 2480, 4118, 3830, 2345, 3469, 3584, 3579, 3476, 4935, 4215, 3011, 2345, 2345, 4515, 3483, 2345, 2345, 3191, 2898, 2345, 2345, 2345, 2892, 2345, 2345, 2345, 2897, 2345, 2345, 2345, 3963, 3232, 2345, 2345, 2345, 2345, 3517, 3490, 2345, 2345, 2345, 2345, 4515, 3520, 2345, 2345, 2345, 2345, 3982, 2345, 3526, 3585, 3535, 4117, 2786, 2345, 2345, 3541, 2345, 2345, 2345, 2345, 4530, 3545, 2345, 2345, 2345, 2345, 3541, 2345, 2345, 2345, 2345, 2456, 2345, 2345, 4910, 3100, 3100, 3100, 3100, 2476, 2398, 2398, 2398, 4531, 3232, 2345, 2345, 2345, 3560, 3565, 3576, 4115, 3204, 3583, 2345, 5095, 2345, 2345, 2345, 3163, 3064, 2345, 2345, 2345, 2345, 3219, 3071, 2345, 2345, 2345, 2345, 3157, 5054, 2345, 2345, 2345, 5094, 2345, 2345, 2345, 5053, 2345, 2345, 2345, 3590, 3966, 3561, 2345, 2521, 3137, 2345, 2345, 3754, 2981, 3141, 5078, 4842, 4667, 2967, 3147, 2528, 3155, 2345, 2751, 5076, 2686, 5082, 4996, 5091, 5099, 2345, 2345, 5072, 2345, 2345, 5105, 2345, 2345, 4450, 3818, 2345, 3825, 2345, 2460, 3835, 3839, 2345, 2345, 2345, 4069, 3843, 2345, 4928, 2345, 3443, 2345, 3828, 2345, 4052, 3148, 2345, 2386, 3114, 3150, 4047, 3149, 3635, 3635, 4052, 3113, 3150, 3150, 3150, 3980, 3634, 3112, 3635, 4053, 3622, 3635, 3150, 4974, 4976, 3627, 4978, 3631, 3640, 2345, 2345, 2345, 2345, 4428, 3779, 3723, 2345, 3595, 3645, 3649, 4091, 3655, 3663, 3667, 3671, 3675, 3679, 3680, 3684, 2345, 2801, 3689, 2345, 4841, 3695, 4295, 2763, 3350, 3199, 3691, 5040, 3485, 3701, 4584, 3465, 3705, 4823, 3710, 3716, 2345, 2345, 2802, 3690, 2345, 4616, 4756, 3722, 3731, 3957, 3201, 3737, 3750, 3759, 2345, 3940, 3766, 2345, 2345, 2345, 3312, 4745, 4749, 4761, 4765, 4769, 4773, 4777, 4781, 4785, 4788, 4792, 4795, 3504, 3232, 2345, 2345, 2345, 3505, 2345, 2345, 2345, 2646, 3772, 2345, 2345, 2345, 4427, 3778, 2345, 4164, 4095, 2345, 3785, 4903, 2651, 2345, 3753, 2345, 2345, 3793, 2345, 2345, 2345, 2345, 3098, 3100, 3100, 3100, 3100, 2398, 2398, 2398, 2398, 2478, 2359, 2359, 2345, 3797, 2345, 2345, 2345, 2345, 2345, 3801, 2345, 2345, 2345, 2345, 2345, 3805, 2345, 2345, 3846, 2810, 5004, 2345, 2345, 2345, 2345, 4151, 2345, 2815, 2820, 2833, 4077, 2838, 3850, 2345, 2345, 2345, 2345, 4737, 2345, 3855, 2458, 4716, 3837, 3863, 2345, 2345, 3172, 3871, 3924, 2345, 2340, 2345, 2345, 4149, 2345, 2339, 3845, 3723, 3089, 3789, 2345, 3930, 4129, 2345, 2776, 3914, 4135, 2728, 2345, 2345, 2345, 2345, 3210, 2345, 2784, 3082, 3938, 2345, 2790, 5046, 2345, 3935, 2345, 3944, 2730, 3877, 2345, 3352, 2732, 3955, 2731, 4157, 4157, 4157, 3351, 2732, 2732, 2732, 3531, 4156, 4716, 4157, 4718, 3878, 4157, 2732, 2345, 2345, 2345, 2345, 3851, 2345, 2345, 2345, 2345, 2345, 3850, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 3612, 2663, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 3780, 3961, 2345, 2345, 3920, 3970, 3978, 3986, 3990, 3994, 3998, 4001, 4005, 4007, 4011, 2345, 2345, 2345, 4015, 2345, 3606, 4752, 4107, 3553, 4020, 4024, 4643, 4888, 4028, 2345, 4851, 2811, 4032, 4826, 4037, 4042, 4046, 2345, 2345, 4016, 2345, 3746, 4051, 3551, 3877, 4057, 3636, 4570, 4063, 2345, 2345, 2345, 2780, 2345, 2345, 2345, 2510, 4067, 4105, 2924, 4156, 4113, 2386, 4123, 4538, 2345, 2345, 2635, 4127, 2345, 2345, 2345, 2345, 2641, 4133, 2345, 2345, 2345, 2345, 2778, 4181, 2345, 2457, 2345, 2345, 4984, 5025, 2345, 4139, 2345, 2855, 3611, 2345, 2857, 2345, 2345, 3386, 2345, 2856, 2345, 2345, 3830, 3616, 2345, 3445, 2345, 4145, 2345, 4670, 3724, 4155, 3572, 3114, 4161, 2345, 2345, 2345, 3472, 2729, 2345, 2345, 2345, 2345, 2842, 2345, 2345, 2345, 2345, 3081, 2846, 2345, 2345, 2345, 2345, 2345, 2739, 2692, 3821, 2749, 2757, 2345, 2761, 2767, 2345, 2771, 4802, 2345, 4185, 3077, 3725, 4231, 3041, 4220, 2345, 5087, 2729, 2345, 2345, 2911, 4134, 2345, 2345, 4172, 2345, 2345, 2345, 2354, 3845, 2345, 3723, 3606, 2458, 3787, 3901, 2345, 3781, 3537, 4190, 2345, 2345, 2910, 4196, 3378, 3685, 3607, 4673, 4202, 2823, 2345, 4033, 2729, 2345, 3931, 2956, 2345, 3925, 4214, 4219, 4225, 4240, 4244, 4264, 2345, 4250, 2345, 4252, 2345, 2345, 4256, 2345, 4251, 3343, 4538, 4228, 4262, 2345, 4270, 3353, 2345, 4610, 2345, 3183, 3130, 2345, 2345, 2345, 2346, 3136, 2345, 2345, 2345, 2345, 3183, 3130, 2345, 2345, 2673, 2345, 2345, 2677, 3814, 2690, 2696, 2700, 2704, 2708, 2712, 2716, 3744, 2727, 4275, 4284, 4288, 4419, 2668, 3659, 2733, 4292, 4308, 4420, 3556, 3556, 3556, 4317, 3530, 4421, 4335, 4323, 3555, 3529, 3568, 3025, 2669, 3556, 4330, 4339, 4341, 4333, 4326, 4345, 4349, 4351, 2345, 2345, 2345, 2345, 3897, 2992, 2345, 4313, 4355, 4359, 4390, 4363, 4367, 4371, 4375, 4379, 4381, 4383, 2345, 2345, 2345, 4937, 4387, 4657, 4394, 4401, 4460, 2827, 4636, 4599, 4278, 4407, 4411, 5122, 3727, 4426, 4432, 2345, 4440, 4449, 2345, 2345, 4938, 3774, 2657, 4454, 4458, 3325, 2345, 3053, 4464, 4468, 2345, 2345, 2345, 5128, 4474, 2345, 2345, 2345, 4482, 2345, 2345, 4271, 2888, 2345, 2345, 2345, 2345, 3233, 2345, 2345, 2345, 4962, 2864, 3650, 2893, 2345, 3727, 4483, 2345, 2345, 2345, 3055, 4487, 4494, 2345, 2345, 3890, 4311, 2433, 2446, 3618, 2826, 4186, 5066, 4947, 2733, 2345, 2345, 2345, 3413, 4500, 2345, 2345, 2345, 2345, 3420, 2800, 4414, 4622, 4520, 3318, 2345, 2970, 5060, 2345, 2345, 2345, 2377, 4524, 2345, 2345, 2345, 2345, 3869, 2345, 2345, 2345, 2345, 4171, 3876, 2345, 2345, 2345, 4069, 3870, 2345, 4952, 4311, 2443, 4535, 2827, 3865, 3433, 2345, 2345, 2345, 2379, 4543, 2345, 2345, 2345, 3858, 2345, 2345, 2345, 2345, 3859, 2345, 2345, 2345, 2957, 3045, 2345, 2345, 2377, 4548, 2345, 2345, 2345, 2345, 3281, 4553, 2345, 2345, 2345, 2378, 4549, 4470, 2345, 4558, 2440, 4564, 3203, 4831, 2345, 2345, 2377, 4568, 2345, 2345, 2345, 3951, 2345, 2345, 2345, 4574, 2345, 4640, 2345, 4069, 4647, 2560, 4651, 4661, 2345, 4680, 4539, 4642, 5031, 2345, 5014, 4688, 4830, 4815, 4403, 3883, 4642, 4692, 4628, 4816, 4696, 4696, 4702, 4830, 4706, 4714, 4714, 4722, 2414, 2449, 3808, 4731, 2414, 4906, 2450, 4735, 4725, 4727, 4741, 4829, 2345, 2345, 2345, 2345, 3925, 2345, 2772, 3501, 4141, 3509, 4115, 4215, 3074, 2345, 2345, 3513, 4799, 2345, 2345, 2345, 2345, 4809, 3015, 4813, 4820, 4967, 2388, 2680, 4210, 4836, 4554, 2345, 3372, 2345, 2345, 3384, 2345, 2345, 3372, 2345, 2345, 2856, 2345, 2345, 3589, 3594, 3599, 4708, 3872, 4840, 4846, 2345, 4710, 4855, 2345, 2345, 4544, 4860, 2834, 3742, 4965, 3080, 4872, 4877, 4882, 2345, 2345, 2345, 2345, 3606, 4886, 2345, 2345, 2345, 3478, 4892, 2345, 2345, 2345, 3882, 2663, 2459, 3092, 3887, 2345, 2345, 3894, 2345, 2345, 2345, 2355, 2345, 3479, 2345, 2345, 2345, 2345, 4897, 3616, 2345, 2345, 4544, 4915, 3035, 4280, 2918, 3446, 4873, 4698, 4926, 2345, 2345, 2345, 2345, 2345, 4932, 2345, 2345, 2345, 2345, 3606, 4942, 2345, 2345, 4435, 3377, 3907, 2902, 2345, 4489, 2729, 2345, 3651, 2902, 2345, 3192, 2909, 2345, 4994, 5020, 5001, 3205, 5011, 2345, 2345, 2345, 2345, 2741, 2745, 2345, 2345, 2345, 2345, 4170, 4608, 2345, 2345, 4614, 4989, 4620, 4626, 3755, 4950, 2345, 4634, 2345, 5013, 2345, 2744, 2345, 2345, 2345, 2345, 2345, 2743, 2345, 2345, 2345, 2345, 2345, 2743, 4900, 2345, 4501, 4915, 3036, 5018, 3447, 3864, 5029, 2345, 2345, 2345, 4170, 5035, 2345, 2345, 2345, 2345, 4303, 5044, 2345, 2345, 2345, 2345, 5050, 2345, 2345, 2345, 2345, 4304, 4900, 2345, 3811, 3740, 4997, 5058, 5064, 2345, 2345, 2345, 5071, 2345, 2345, 2345, 3269, 2345, 2345, 2345, 4297, 4301, 2345, 3402, 2800, 2345, 2345, 2345, 2345, 3401, 4528, 2345, 2345, 2345, 2345, 3401, 4528, 4470, 4299, 2345, 2345, 3270, 2345, 5111, 4997, 4577, 2345, 2345, 2753, 2345, 4893, 5116, 2345, 2752, 2491, 2458, 2345, 5126, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2345, 2661, 3388, 2667, 2345, 7267, 5893, 5132, 5144, 5141, 5151, 5153, 5153, 5153, 5153, 5148, 5176, 5152, 5153, 5153, 5153, 5159, 5163, 5176, 5153, 5153, 5169, 5164, 5153, 5180, 5155, 5154, 5168, 5151, 6159, 5173, 5199, 5205, 5205, 5205, 5209, 5209, 5201, 5213, 5217, 5220, 5224, 5228, 5245, 5232, 5242, 5234, 5238, 5236, 5249, 5252, 7269, 7026, 5260, 5273, 5276, 5276, 5276, 5255, 5821, 5295, 5276, 5276, 5276, 5276, 5268, 5730, 6588, 6270, 5301, 5276, 5276, 5254, 6597, 5821, 6646, 6646, 6646, 6646, 5394, 5396, 5325, 5449, 5322, 5396, 5396, 5325, 5276, 5384, 5428, 5333, 5409, 5274, 5276, 5276, 5276, 5286, 5290, 7174, 5276, 6844, 7218, 6005, 5276, 5276, 5276, 6390, 6115, 6646, 6647, 5323, 5396, 5397, 5400, 5428, 5428, 5428, 5428, 6645, 6646, 6646, 5398, 5400, 5428, 5345, 6844, 7217, 5353, 5276, 5266, 5276, 5276, 5388, 7455, 5457, 5396, 5396, 5396, 5396, 5276, 5399, 5402, 6779, 5408, 6667, 5275, 5276, 5275, 5276, 5276, 6239, 5276, 6839, 5410, 6667, 5275, 5276, 5275, 6561, 5276, 5275, 6839, 6843, 7454, 7155, 5276, 5276, 7229, 5276, 5276, 6466, 5276, 5276, 6526, 5276, 5276, 5276, 5302, 5276, 5276, 6646, 5393, 5396, 5396, 5396, 5400, 5407, 6668, 5276, 5276, 5268, 6066, 5402, 5428, 5428, 5428, 5429, 6646, 6646, 6646, 5395, 5396, 5396, 5396, 5326, 5368, 5419, 5276, 5276, 5276, 5305, 5401, 5428, 5428, 5428, 5430, 6646, 5427, 5428, 5428, 5428, 6644, 6646, 6646, 5402, 5387, 5276, 5276, 5276, 5307, 6771, 6646, 5394, 5396, 5396, 5398, 5427, 5276, 5276, 5268, 6630, 5397, 5403, 5276, 5276, 5269, 5731, 6036, 5400, 5400, 5402, 5428, 6644, 5402, 5428, 5428, 6643, 6646, 5368, 5400, 5427, 6643, 6646, 6646, 6646, 5396, 5396, 5396, 5397, 5387, 6646, 5395, 5324, 5368, 5276, 5999, 5276, 5276, 7234, 6237, 5276, 6239, 6237, 5401, 6643, 5393, 5324, 5415, 5434, 5460, 5464, 5463, 5462, 5461, 5326, 7445, 6108, 6418, 5509, 5541, 5438, 5442, 5508, 5508, 5508, 5508, 5486, 5515, 5454, 5468, 5472, 5491, 5543, 5496, 5508, 5508, 5538, 5446, 5582, 5487, 5506, 5581, 5513, 5475, 5519, 5535, 6805, 6808, 5547, 6811, 6814, 6815, 6816, 5551, 5554, 5558, 5569, 5573, 5579, 5492, 5586, 5590, 5594, 5598, 5605, 5604, 5601, 5609, 5613, 5561, 6981, 5276, 5276, 5276, 5308, 5312, 7372, 5276, 5276, 5276, 5309, 7137, 5276, 5276, 5276, 5329, 5276, 6389, 5276, 5276, 6557, 5276, 6391, 5276, 5276, 5275, 5276, 6392, 6392, 5276, 5276, 5279, 5276, 6282, 5276, 5276, 5276, 5366, 5276, 6000, 6885, 5910, 7281, 5626, 5297, 5629, 5276, 5276, 7348, 5276, 5276, 7354, 5276, 5276, 5276, 5631, 5640, 5899, 5276, 5647, 5276, 6987, 5263, 5186, 5654, 5657, 5659, 5660, 5664, 5668, 5673, 5672, 5677, 5679, 5680, 5680, 5684, 5686, 5693, 5688, 5700, 5688, 5697, 5689, 5704, 5276, 5276, 7355, 5276, 5276, 5276, 5648, 6027, 6933, 6281, 5898, 5276, 5276, 5276, 5367, 5276, 5276, 5276, 5368, 5400, 5708, 6023, 5276, 5276, 5281, 7411, 7471, 7426, 5276, 5276, 6043, 5135, 5276, 5276, 5281, 7468, 6467, 5276, 5716, 5276, 5276, 5721, 6061, 5339, 5276, 5276, 5304, 5276, 5341, 5737, 5745, 5751, 5749, 5276, 5276, 5276, 5369, 6219, 5751, 5276, 5276, 5306, 5310, 6765, 5276, 5276, 6988, 5276, 6526, 5277, 6886, 6113, 5784, 5276, 5793, 7239, 5808, 5855, 5812, 5831, 7055, 5318, 5276, 5276, 5276, 5372, 5348, 7452, 5827, 5832, 7056, 5137, 5276, 5276, 5276, 5376, 5368, 5276, 6525, 5276, 5414, 5276, 7452, 7443, 5276, 5276, 7419, 6200, 5276, 5925, 5276, 5276, 5276, 7249, 5717, 5276, 5276, 5276, 5387, 5795, 7243, 5854, 5845, 7241, 5851, 5855, 5846, 7242, 5852, 5856, 5317, 5850, 5854, 5845, 5898, 5860, 5276, 5276, 5276, 5388, 6362, 5276, 5854, 5876, 5318, 5276, 5276, 7441, 6519, 7240, 5851, 5855, 5877, 5898, 5881, 5839, 5276, 5276, 5370, 5276, 5276, 5853, 5885, 5318, 5276, 5276, 7452, 6134, 7239, 6135, 5854, 5886, 5898, 6404, 5870, 6865, 5276, 5276, 6117, 5869, 6864, 5898, 5276, 6867, 5276, 5276, 5276, 5617, 6117, 5890, 6866, 5276, 5276, 5276, 5620, 6857, 5276, 6719, 6723, 5276, 5276, 7455, 6886, 6721, 5898, 5276, 5276, 5373, 5276, 5914, 5276, 5898, 7023, 5934, 5938, 5942, 5945, 5948, 5949, 5949, 5950, 5954, 5954, 5954, 5954, 5954, 5958, 5961, 5276, 5277, 5921, 5930, 5276, 6659, 6079, 5966, 6872, 6872, 5276, 5276, 5276, 5650, 6487, 5276, 5711, 6194, 7445, 7444, 5368, 5276, 6000, 6525, 5276, 7025, 5302, 6259, 5276, 5370, 5979, 6510, 5997, 5276, 6523, 5276, 5276, 6660, 6080, 5967, 5898, 6890, 5997, 5276, 6889, 5276, 5276, 5276, 5841, 6010, 5276, 6606, 5276, 5276, 5276, 5822, 6016, 5276, 5276, 5276, 5787, 5276, 6605, 6017, 5276, 5277, 5962, 6001, 7450, 5276, 5276, 5276, 5826, 5831, 5712, 6195, 7052, 5276, 5368, 5276, 5276, 5366, 5369, 6121, 5276, 6513, 5276, 6559, 5276, 5276, 5386, 5282, 5276, 6093, 5276, 5276, 5276, 5864, 6029, 5276, 5276, 5276, 5896, 6848, 5998, 5276, 6523, 6792, 5276, 5276, 6397, 7112, 6033, 6047, 6053, 5898, 5276, 6034, 6048, 6054, 5276, 5278, 5281, 6211, 6035, 6049, 6055, 5276, 5278, 5909, 5276, 5279, 6836, 6888, 5276, 5276, 5276, 7452, 5761, 6526, 6233, 6268, 5276, 5280, 5303, 6536, 5276, 6268, 6140, 6038, 6070, 5276, 5276, 5400, 5400, 5400, 5400, 5401, 6066, 6588, 6039, 5894, 5276, 7456, 5276, 5276, 5276, 6002, 5276, 5276, 5276, 5975, 5277, 6078, 6084, 5367, 6266, 7445, 6236, 5999, 6524, 5276, 6100, 6037, 6070, 5276, 5276, 5477, 5481, 6630, 6587, 6090, 5894, 5276, 6080, 6086, 5276, 5276, 5478, 5482, 6099, 5276, 5276, 5276, 6003, 5276, 5276, 6036, 6107, 5276, 5276, 5276, 6072, 6033, 6588, 6106, 5276, 5276, 5276, 6073, 6085, 5276, 5276, 7023, 6099, 5276, 5276, 5281, 6583, 5728, 5732, 6105, 5894, 5729, 5733, 6106, 5276, 5281, 6629, 6586, 5727, 5731, 6104, 6108, 5276, 5276, 5276, 6117, 5890, 5371, 6000, 6125, 6268, 6456, 5276, 6388, 5276, 5276, 5276, 6523, 5276, 7417, 6416, 5276, 5276, 5276, 6119, 5276, 6524, 6525, 6659, 6322, 5276, 5276, 5276, 6074, 5363, 7445, 5276, 5370, 6000, 6236, 5276, 6320, 5799, 5803, 5276, 5276, 5276, 6127, 6319, 5798, 5802, 5276, 5276, 6321, 5276, 7260, 7446, 5368, 6001, 6320, 5799, 5801, 5276, 5276, 6319, 5797, 5276, 7073, 5276, 7258, 7447, 5276, 7447, 5302, 7075, 5803, 5276, 5276, 7072, 7076, 5276, 5281, 7468, 7477, 5276, 5276, 7073, 7260, 7446, 5276, 7074, 5802, 5276, 5285, 5289, 7173, 6339, 7258, 7447, 6339, 7077, 5276, 6117, 7076, 5276, 6342, 5276, 6117, 6342, 6139, 6117, 6200, 6978, 5276, 6978, 5276, 6978, 5276, 7445, 6197, 5276, 6237, 6722, 5276, 5276, 5372, 7365, 6199, 6197, 5276, 6199, 5276, 5925, 7445, 6198, 6198, 6198, 5276, 5276, 5926, 6198, 5276, 6896, 6896, 5389, 6536, 5368, 5525, 6145, 5276, 5276, 5276, 6133, 6358, 5367, 5276, 5276, 6198, 6537, 6199, 6536, 6200, 5276, 6537, 5276, 5276, 5276, 6480, 6167, 6152, 6171, 6175, 6179, 6181, 6185, 6185, 6181, 6189, 6189, 6189, 6189, 6189, 6191, 5276, 5276, 5564, 6363, 6206, 5276, 5276, 5276, 6199, 6200, 6251, 5898, 5276, 5276, 5565, 5371, 5276, 5276, 5575, 6934, 6200, 5276, 7454, 5803, 7356, 5276, 6293, 5276, 5804, 5276, 5287, 5291, 7160, 7066, 6196, 5276, 5285, 6217, 6223, 7106, 6232, 5276, 5287, 7149, 7129, 6243, 5276, 7260, 5276, 5288, 7150, 7141, 6257, 5276, 5789, 5276, 5276, 5276, 6202, 6263, 5276, 5276, 5276, 6201, 5367, 5369, 5387, 6274, 6253, 5278, 6018, 5276, 5276, 5642, 5276, 5276, 5276, 6388, 6113, 5193, 6286, 6935, 6040, 6287, 6936, 6041, 5276, 5276, 5191, 5195, 6288, 6937, 6042, 5276, 5276, 5276, 6226, 5385, 6114, 6252, 5276, 5307, 5311, 5315, 7420, 7354, 5276, 5276, 5739, 7397, 7403, 6298, 6329, 5803, 5276, 5276, 6006, 6299, 6330, 5276, 5276, 5276, 6265, 6300, 6331, 5276, 5276, 5753, 5752, 5387, 6275, 5897, 5276, 5328, 6552, 6547, 5803, 6197, 7453, 7421, 6267, 6392, 5479, 6312, 6329, 5276, 6458, 5480, 6313, 6330, 5276, 5276, 5764, 5276, 5385, 6246, 6253, 5276, 5363, 5367, 5276, 5276, 6536, 6317, 6267, 5276, 5276, 5276, 5621, 6392, 7412, 6327, 6332, 6301, 5803, 5276, 5276, 5815, 7444, 6522, 5276, 5276, 5375, 5276, 5276, 5365, 5276, 5276, 5916, 5276, 5276, 5276, 6294, 5368, 5386, 6336, 5276, 5365, 5276, 6535, 5276, 6820, 7444, 5276, 5276, 6519, 6308, 5276, 6198, 5276, 7452, 5280, 5276, 5276, 5276, 6307, 6197, 5276, 6843, 5276, 6356, 6250, 6678, 5276, 5276, 5276, 6368, 5276, 6844, 5894, 5276, 5369, 5998, 6524, 5276, 5276, 5276, 5277, 6208, 6362, 5276, 5276, 5276, 6371, 5276, 6846, 5276, 5276, 5898, 5276, 6005, 5276, 5276, 6005, 5276, 5276, 6846, 6004, 6002, 6846, 6005, 6005, 6005, 5276, 5276, 6004, 5276, 5276, 6005, 6847, 5276, 5276, 5995, 6375, 5894, 5276, 6520, 6383, 5276, 5276, 5276, 6404, 5871, 6112, 7024, 6387, 6111, 5276, 5276, 5276, 5363, 6401, 6761, 6409, 6972, 6429, 6432, 6433, 6434, 6438, 6438, 6438, 6438, 6441, 6443, 6444, 6444, 6451, 6451, 6451, 6451, 6448, 6452, 5276, 5276, 5276, 6425, 5348, 6566, 5276, 5276, 5276, 6463, 6370, 6494, 5276, 5276, 5973, 5276, 5362, 6468, 5276, 6469, 6475, 5276, 5276, 5276, 6519, 5276, 6484, 5276, 5276, 6000, 5389, 6228, 6477, 5276, 5276, 6012, 5276, 6112, 5276, 5276, 5276, 6520, 5276, 5276, 5276, 6396, 5304, 6197, 5276, 5276, 6060, 6059, 5276, 6499, 6507, 5276, 5386, 5283, 5276, 5276, 6395, 5276, 5276, 5279, 6208, 6518, 5276, 5276, 5359, 5276, 5276, 5276, 6524, 5276, 5276, 6534, 6534, 5276, 5388, 5276, 5284, 6546, 6618, 5276, 5276, 6109, 5903, 6553, 6548, 5276, 5276, 6116, 5998, 5349, 6567, 5276, 5276, 5276, 6392, 6611, 5305, 6199, 5276, 6537, 6265, 5276, 6236, 6525, 5276, 6830, 6573, 5818, 5276, 6831, 5501, 5819, 5276, 6832, 5502, 5820, 6830, 5500, 5818, 5276, 5422, 6847, 5276, 5522, 7448, 5276, 5636, 6001, 5998, 6565, 5276, 5276, 5276, 6525, 5276, 5276, 7449, 6887, 6493, 5276, 5641, 6843, 5276, 5276, 5276, 6237, 6537, 5276, 6268, 6140, 5276, 6390, 5276, 6459, 6571, 6577, 5821, 5276, 5276, 5276, 6657, 5276, 7285, 5499, 6578, 5276, 5276, 6886, 5279, 5276, 5649, 6028, 6094, 5276, 6458, 5276, 5276, 5276, 6526, 7024, 6877, 5256, 6579, 5276, 5276, 5276, 6528, 6598, 5276, 5276, 5276, 6536, 5276, 6592, 5276, 5276, 5276, 6620, 5276, 6391, 6459, 5276, 5739, 7123, 6938, 5281, 6583, 6579, 5276, 5741, 7125, 6332, 6602, 5276, 6459, 5276, 5741, 7125, 6522, 5276, 6404, 5871, 5280, 5276, 5302, 5276, 5757, 5276, 5356, 6392, 6526, 5276, 5276, 6118, 5279, 6610, 5276, 5276, 5276, 6783, 5367, 6615, 5276, 5276, 5276, 6784, 5276, 6919, 6923, 5276, 5777, 5276, 5276, 5327, 6542, 5280, 6537, 6266, 5276, 5788, 6264, 5276, 5288, 7184, 7189, 5276, 5277, 5276, 5367, 5276, 6268, 6141, 6712, 6424, 5276, 5276, 6126, 5898, 5276, 5276, 5632, 6626, 6634, 5276, 5276, 6131, 6414, 6108, 5276, 5276, 6395, 5276, 6844, 5276, 5276, 5917, 5276, 6521, 5276, 6395, 6522, 6729, 6846, 5276, 5375, 6502, 6651, 6664, 6672, 6682, 6685, 6689, 6693, 6693, 6693, 6695, 6697, 6697, 6697, 6697, 6701, 6702, 6702, 6702, 6703, 6707, 5276, 6711, 6423, 5276, 5276, 5276, 6735, 5276, 6716, 5276, 7351, 5276, 6727, 5276, 7420, 6268, 6969, 6745, 5276, 5276, 5276, 6785, 5450, 5276, 5276, 5276, 6793, 6743, 6094, 5276, 6750, 6751, 5276, 5276, 5276, 6844, 6212, 5276, 5276, 5276, 6847, 5276, 5276, 6755, 5276, 5276, 6238, 5276, 6524, 6798, 6267, 6759, 6771, 6766, 5276, 5276, 5276, 6877, 5194, 6287, 5276, 7275, 5276, 5276, 6248, 5276, 5276, 6776, 6772, 6767, 6790, 5276, 6792, 5276, 5907, 5276, 6269, 5894, 7260, 7023, 5276, 5276, 5276, 6111, 6392, 6422, 6847, 5276, 6100, 5276, 6888, 5276, 5276, 6521, 5276, 5276, 6194, 7446, 5368, 7418, 5276, 5276, 6293, 5276, 5276, 5276, 6269, 6206, 7033, 6523, 6797, 6266, 5312, 5316, 5276, 5276, 5276, 6921, 5313, 5317, 5276, 5276, 5276, 6933, 6792, 6791, 5276, 5276, 6305, 5304, 6420, 6424, 5276, 5276, 6319, 6922, 5276, 5276, 6118, 5276, 5374, 5276, 5276, 6535, 5276, 5276, 7034, 7452, 6826, 5276, 5908, 5278, 6495, 5276, 6519, 5276, 5276, 5276, 5281, 5255, 6598, 5276, 7033, 5863, 6828, 6852, 5314, 5318, 5276, 5276, 6913, 5276, 5276, 5276, 6958, 6858, 5318, 5276, 5276, 6321, 5800, 6857, 5317, 5276, 5276, 6340, 5802, 6535, 5276, 6862, 5276, 6022, 5753, 5276, 5278, 5276, 5276, 7210, 5276, 6871, 5276, 5276, 5276, 7191, 6199, 6200, 5276, 5276, 5276, 7042, 6425, 5276, 5276, 6876, 6887, 5276, 5367, 6820, 7444, 5276, 6002, 5276, 6194, 7052, 5276, 6637, 6520, 5276, 6536, 5276, 6822, 5276, 5276, 6341, 5276, 7204, 5276, 5276, 5276, 7203, 5367, 5276, 6786, 5276, 5276, 6392, 6921, 6821, 5276, 5276, 6904, 5276, 5276, 6388, 6391, 6480, 5276, 5276, 5276, 7239, 5276, 6478, 5367, 5276, 6095, 5276, 5276, 6394, 5276, 6897, 5276, 5276, 6883, 6535, 5276, 5371, 6904, 5364, 5276, 6894, 5276, 6110, 5276, 5276, 5981, 7461, 7451, 5276, 5276, 5276, 5983, 7470, 5990, 5283, 6536, 6901, 5276, 6114, 5276, 6001, 6911, 5374, 6535, 5368, 5803, 5276, 6392, 6412, 5369, 5276, 5276, 5366, 5364, 6537, 6364, 5364, 5276, 5367, 5371, 5366, 5364, 5276, 5276, 6536, 5365, 5276, 5366, 5276, 5366, 5367, 6538, 6538, 6538, 5773, 5767, 5769, 5771, 5771, 5772, 5276, 7445, 5183, 5276, 5282, 5917, 7454, 6113, 6917, 6942, 7063, 5336, 6951, 6962, 6966, 5531, 6992, 6995, 6995, 6998, 7003, 7002, 7002, 7004, 7008, 7009, 7015, 7013, 7013, 7013, 7013, 7019, 7022, 7030, 5276, 5276, 6115, 5375, 5528, 6927, 5276, 7445, 6842, 7453, 6149, 6156, 6163, 7038, 6983, 5276, 5276, 6392, 7229, 5277, 5276, 5276, 7046, 7060, 5276, 7070, 5276, 6116, 5999, 5276, 6117, 5276, 5276, 5364, 5276, 5276, 5276, 7240, 7085, 5276, 5276, 5276, 7337, 5349, 5276, 6906, 7086, 5276, 6117, 5368, 5276, 5276, 6907, 5276, 7090, 5276, 6120, 5276, 5368, 5389, 6113, 7094, 5276, 5276, 5276, 7338, 6840, 5276, 6782, 7444, 6985, 5276, 5896, 5276, 6197, 5276, 5276, 7024, 5276, 7104, 5277, 5276, 5276, 6947, 6946, 5276, 6378, 5276, 5276, 5276, 7356, 5276, 5276, 7356, 6396, 7111, 7118, 6379, 5276, 7119, 6094, 5276, 5276, 6405, 5872, 5898, 6956, 6954, 5276, 5276, 6422, 6847, 7144, 5276, 5276, 5276, 7363, 5285, 5289, 7113, 7142, 5286, 7148, 7114, 7143, 6201, 5367, 5276, 5276, 6458, 5480, 6298, 7452, 7154, 5276, 5895, 5290, 7159, 7164, 5318, 7066, 5318, 5276, 5276, 6458, 5481, 6301, 6676, 5276, 5276, 6199, 5276, 5276, 5276, 6879, 7180, 5276, 5276, 5276, 7364, 5290, 7174, 7179, 5276, 5276, 7178, 5276, 5276, 5276, 7380, 5740, 7169, 5276, 5276, 6467, 5276, 6677, 6197, 5276, 5924, 7196, 6975, 5276, 5276, 6467, 7049, 5285, 7195, 7185, 6391, 6116, 5276, 5276, 5276, 7208, 7454, 5276, 5276, 6473, 6477, 6526, 5276, 7449, 5276, 6197, 6520, 5276, 7446, 5276, 5375, 7224, 5276, 5276, 5276, 7381, 7214, 5276, 5276, 5276, 7408, 7223, 6847, 5276, 5276, 6479, 5276, 7222, 6425, 5276, 6201, 6886, 6492, 7200, 5276, 6237, 5276, 5276, 6841, 6675, 5276, 5276, 5387, 5276, 5276, 6488, 5276, 6878, 6781, 5276, 5276, 6514, 5276, 5276, 6879, 7230, 5276, 5276, 5276, 7446, 7228, 5276, 5276, 6249, 7452, 5276, 5389, 5276, 6198, 6197, 5276, 6000, 5276, 6238, 5276, 6524, 6201, 5276, 6201, 7449, 5276, 6193, 7445, 5276, 5280, 6209, 6213, 5276, 6520, 5276, 5281, 6065, 6587, 6879, 7455, 5276, 5276, 6525, 6526, 6659, 6079, 7450, 5276, 6395, 7455, 6621, 6847, 5276, 7238, 5276, 6622, 5276, 5276, 6526, 7416, 5276, 6622, 5276, 7247, 6620, 7455, 5276, 5276, 6530, 5276, 7391, 6527, 6621, 6847, 5276, 5276, 6537, 5276, 5276, 6536, 6621, 6847, 7455, 5387, 5388, 6847, 5388, 7344, 5276, 5276, 7229, 7453, 5386, 5423, 5389, 5276, 5276, 6593, 5276, 5388, 5276, 5386, 5388, 7253, 5276, 7258, 7446, 6196, 5276, 5363, 5276, 6210, 6887, 5276, 5894, 5276, 5276, 5276, 5971, 7257, 5276, 5916, 6640, 7264, 6258, 5276, 5189, 5276, 7260, 5916, 7259, 6503, 7097, 7283, 7273, 5724, 7100, 7135, 7279, 6930, 7132, 7289, 7293, 7302, 7295, 7297, 7306, 7298, 7317, 7310, 7311, 7315, 7318, 7326, 7326, 7328, 7324, 7322, 7332, 7335, 5276, 6218, 5750, 5276, 5276, 7362, 7366, 7364, 7342, 5276, 6467, 5389, 5281, 5276, 5276, 6621, 5276, 5276, 6393, 5276, 5915, 5276, 6227, 6476, 5276, 5377, 6746, 5276, 5386, 5276, 5276, 5276, 7449, 5276, 5276, 7360, 7370, 7376, 7385, 5276, 5276, 5276, 7450, 5276, 5276, 6529, 7386, 5276, 6265, 5276, 5276, 5378, 6094, 7392, 5276, 5276, 5276, 7451, 7342, 7445, 6201, 5276, 6266, 5276, 5276, 5382, 5400, 5400, 5400, 5427, 6389, 6113, 5276, 5276, 6235, 6234, 5276, 5276, 5276, 7457, 5276, 6526, 6716, 7433, 7396, 7402, 5276, 5276, 6733, 6739, 7403, 5276, 5276, 5276, 7466, 7408, 7398, 7404, 6844, 5276, 6847, 5276, 6267, 6140, 5276, 5388, 7230, 5276, 5414, 5400, 5400, 5400, 5428, 7342, 7447, 7451, 5276, 6268, 5276, 6237, 6268, 5276, 5276, 7356, 6110, 6268, 5276, 5276, 5276, 5643, 7409, 5986, 7425, 5276, 6292, 5276, 5276, 5740, 7124, 7030, 7410, 5987, 7426, 5276, 6306, 5305, 5276, 5276, 6201, 5276, 5276, 5276, 5739, 7168, 7411, 5988, 7427, 5276, 6323, 7446, 6117, 5276, 5371, 5276, 5276, 7454, 5276, 6887, 5276, 5985, 5989, 6236, 6846, 6003, 5276, 6004, 5276, 6004, 6002, 5276, 6845, 5276, 5276, 5276, 6802, 5311, 6560, 7449, 5276, 5276, 5281, 7200, 5276, 6393, 5276, 7452, 5276, 5276, 5276, 6388, 6113, 5276, 6233, 5836, 5898, 5276, 5276, 7387, 5868, 7434, 5276, 5276, 5276, 6877, 7228, 6201, 5276, 7452, 5962, 5276, 5276, 5276, 6853, 5315, 5898, 5276, 5276, 7431, 5276, 5276, 5276, 6878, 7229, 5984, 7471, 5991, 5276, 6340, 5803, 5276, 5780, 5276, 5990, 5276, 5276, 5276, 6920, 5821, 5982, 7469, 5989, 5276, 6346, 6351, 5276, 5276, 6388, 6113, 5276, 5276, 6946, 5276, 5276, 7438, 5276, 5276, 7024, 5276, 5276, 5276, 7467, 7476, 5276, 5276, 7477, 5276, 5276, 5276, 7025, 5276, 7450, 5276, 5388, 5281, 6279, 5276, 5276, 5622, 5315, 5276, 6389, 6114, 5276, 6347, 6352, 5276, 5276, 5276, 7444, 5276, 5276, 5276, 6945, 7466, 7475, 5276, 5276, 7041, 5276, 5631, 5276, 5388, 5282, 7466, 7462, 5276, 5276, 5276, 7040, 5276, 5276, 5276, 7081, 5276, 5303, 5276, 5276, 5276, 7110, 6654, 0, 0, 1075838976, 2097152, -1845493760, 0, 0, 0x80000000, 16777216, 4194560, 4196352, 270532608, 2097152, 2097152, 268435456, 4194432, 16777216, 4194432, 3145728, 541065216, -2143289344, 4194304, 4194304, 4194304, 4194304, 541065216, 4194304, 4194304, 4194432, 37748736, -1606418432, 541065216, 541065216, 541065216, 541065216, 4194304, 4194304, 4196352, -1606418432, -1606418432, 541065216, 541065216, 4194304, 4198144, 541065216, 541065216, -2143289344, -2143289344, 8425488, 4194304, 4194304, 4194304, 1, 32768, 0, 0x80000000, 16, 33554432, 33554432, 0, 2, 4, 112, 128, 256, 3584, 16384, 37748736, 742391808, 239075328, 775946240, 775946240, 775946240, 171966464, 171966464, 171966464, 171966464, 239075328, 171966464, 775946240, 239075328, 4718592, 64, 4718592, 2097216, 4720640, 541589504, 4194368, 541589504, 4194400, 4194368, -2142763008, 541589504, 541065280, 4194368, 4194368, 541065312, 541065280, -2143289280, 4194368, -2143285408, -2143285408, -2143285440, -2143285440, -2143285440, -2143285440, -1605890240, -2142761152, -2109731008, -1606414528, -2142761152, -1606414528, -2143285440, -2143285440, -1606414528, -1606414528, -2143285440, -2109731008, 776470528, -1908404416, 775946304, -1908404416, 2, 4, 8, 16, 512, 1024, 4194304, 128, 128, 0, 0x80000000, 524288, 5242880, 0x80000000, 0, 0, 2, 12, 64, 256, 2048, 2048, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3, 4, 16, 224, 256, 512, 1024, 16777216, 16777216, 0, 0, 0x80000000, 65536, 1792, 0, 0, 0, 8, 0, 0, 0, 12, 32, 64, 1024, 2048, 57344, 262144, 50331648, 268435456, 1073741824, 0x80000000, 0, 0, 1536, 64, 524352, 524352, 524352, 0, 0, 0, 62, 64, 128, 64, 262144, 1048576, 0, 0x80000000, 2097152, 0, -2113929216, 0, 0, -1979711488, -1912602624, 64, 64, 1048576, 128, 256, 2048, 262144, 524288, 4096, 1024, 1024, 0, -570425344, 32505856, 0, 0, 48, 25165824, 0, 0, 0, 33554432, 268435456, 0, 0, 0, 524288, 0, 0, 0, 32, 0, 0, 0, 44, 64576, 319029248, 0, 524288, 524288, 524288, 0, 64, 0, 0, 0, 64, 0, 96, 96, 96, 524352, 524352, 524352, 524352, 524288, 524288, 524288, 524288, 64, 64, 0, 64, 128, 128, 128, 128, 2048, 2048, 0, 0, 524288, 524288, 64, 64, 128, 2048, 0, 0, 64, 128, 8388608, 524288, 64, 64, 64, 64, 32, 96, 64, 96, 96, 524352, 96, 160, 1056, 262176, 1048608, 2097184, 4194336, 536870944, 40, 262176, 32, 96, 0, 0, 0, 60, 40, 48, 1120, 96, 96, 64, 524352, 0, 524288, 64, 96, 524352, 0, 524288, 4195360, 6291488, 2097184, 2097184, 4194336, 4194336, 4194336, 32, 56, 0, 4, 16, 32, 64, 128, 256, 1536, 2048, 40, 262184, 40, 40, 40, 40, 40, 262176, 32, 32, 6292512, 4195360, 2097184, 32, 128, 1792, 8192, 16384, 131072, 524288, 4195104, 6292512, 32, 32, 32, 32, 4, 40, 262184, 32, 32, 34, 34, 262184, 40, 4196128, 32, 262144, 524288, 0, 0, 64, 256, 0, 2097152, 135790592, 131073, 4, 393233, 262184, 34, 42, 32, 524320, 32, 1073872896, 32, 32, 40, 1120, 96, 1056, 4194336, 32, 2098208, -322695456, -322695456, -322695456, -322695456, -322597152, -320598176, -322597152, -322597144, -321548576, -320598168, -322597144, -321548568, -37482773, 0, 0, 64, 1536, 32768, -322588952, -321548568, -322588952, -321548568, -322597144, 32, 0, 32, 64, 65536, 0, 96, 32, 32, 56, 262184, 40, 41, 262184, 32, 42, 224, 40, 262176, 42, 106, 293601323, 293601323, 293863467, 293699627, 293617707, 293716011, 293702203, 293702203, 293702203, 297896507, 293702203, 293702203, 293702203, 293702267, 293964347, 293702267, 297896507, 293964347, 297896507, 297896507, -322597144, -37744981, 0, 32, 524288, 0, 0, 64, 2048, 16384, 32768, 0, 0, 262144, 65536, 262144, 262144, 0, 4096, 0, 8, 0, 2, 65536, 262656, 328192, 0, 0, 0, 1536, 32768, 0, 5242880, 0, 0, 0, 1998, 518144, 8388608, -2147418112, 5242880, -1842937664, 201330721, 201330721, -2111369023, -2111369023, -2111369023, -2111369023, -2111360575, -2111369023, -2111369023, -2111369023, -1977151295, -1977151293, -1910042431, -1893265183, -2111368509, -1893265183, -1893265183, -1893265183, -1893265183, -2111368509, -1893265183, -1893265183, -553689472, -553656704, -553689472, -553689472, -553656704, -553656704, -553656704, -553656704, -553656704, -553656672, -553656672, -553656672, -553656672, -536912159, -553656672, -553656672, -553656664, -553656664, -553656672, -553656672, -553656670, -553656672, -553656672, -553656670, -553656608, -553656671, -536879391, -536879391, -536879391, 0, 0, 262656, 0, 0, 65, 1024, 0, 1, 4096, 201326592, 0, 0, 0, 0, 462976, -2113929216, 100663296, 100663296, 2, 4, 8, 64, 128, 512, 2048, 8192, 16384, 458752, 18874368, 463488, 0, 0, 1, 2, 4, 32, 0, 0, 1007232, 15728640, 1040000, 15728640, -570425344, 0, 0, 0, 2014, 0, 0, 0, 32505856, -570425344, 196608, 2097152, 301989888, 0, 0, 80, 268435456, 0, 268435456, 0, 268435456, 268435456, 268435456, 268435456, 0, 0, 0, 4096, 201326592, 0, 0, 96, 2260992, 12288, 0, 0x80000000, 0, 0, 118, 577408, 22020096, 1040187392, 0, 0, 167772160, 234881024, 128, 512, 2048, 196608, 262144, 33554432, 536870912, 0, 0, 0, 557056, 7168, 16384, 196608, 786432, 503316480, 1073741824, 0x80000000, 0, 0, 128, 131072, 524288, 58720256, 402653184, 0, 0, 0, 318767104, 128, 512, 7168, 16384, 32768, 32768, 196608, 786432, 1048576, 2097152, 4194304, 33554432, 268435456, 536870912, 0x80000000, 0, 0, 1, 256, 8388608, 234881024, 268435456, 1073741824, 0x80000000, 4096, 16384, 32768, 131072, 524288, 1048576, 2097152, 4194304, 8388608, 234881024, 0, 0, 201326592, 0, 0, 128, 536870912, 4194304, 512, 3072, 16384, 131072, 524288, 1048576, 4194304, 134217728, 8388608, 33554432, 201326592, 268435456, 1073741824, 0, 1048576, 4194304, 268435456, 4194304, 8388608, 134217728, 268435456, 1073741824, 3072, 131072, 524288, 1048576, 1073741824, 0, 0, 0, 0x80000000, 0, 0, 0, -2147483646, 16384, 18432, 67108864, 1073741824, 16384, 8192, 0, 0, 65536, 262144, 0, 0, 67108864, 0, 0, 0, 32768, 0, 1, 18952, 1024, 0, 0, 192, 0, 0, 0, 65, 1024, 1024, 100663298, 18952, 65, 268436480, 2101248, 524288, 1024, 19017, -1744550912, 8388624, 8388624, 8388624, -1739308032, -1739308032, -1739308032, -1739308032, -1736162288, -1736162288, -1736162288, -1736162288, -7868466, -7868466, -7868466, -7868466, -7868466, -7868450, -7868450, -7868450, -7868450, 0, 0, 0, 65536, 2048, 16384, 67108864, 134217728, 268435456, 0, 0, 1073741824, 18432, 0, 0, 1, 285212672, 0, 585, 0, 0, 2, 8, 16, 64, 128, 3072, 4096, 8192, 65536, 131072, 0, 0, 1024, 5521408, -1744830464, 0, 0, 0, 262144, 0, 0, 0, 1024, 0, 0, 0, 112, 1040, 0, 0, -1744830464, 0, -1744830464, 59238400, -67108864, 0, 0, 0, 327680, 2014, 0, 0, 0, 328192, 518144, 8388608, 50331648, 201326592, 805306368, -1073741824, 768, 1024, 10240, 16384, 32768, 458752, 50331648, 67108864, 134217728, 805306368, 0, 0, 0, 458880, 32768, 458752, 8388608, 50331648, 67108864, 134217728, 67108864, 134217728, 805306368, 1073741824, 0x80000000, 0, 0, 220, 0, 0, 0, 471424, 12, 192, 768, 1024, 2048, 805306368, 1073741824, 0, 0, 2, 204, 768, 1024, 4, 8, 32, 64, 512, 2048, 512, 2048, 16384, 67108864, 0, 0, 458752, 50331648, 67108864, 805306368, -1073741824, 0, 0, 0, 393240, 0, 1048576, 4194304, 0, 0, 16384, 458752, 50331648, 67108864, 536870912, 1073741824, 0, 0, 16384, 0, 0, 0, 256, 0, 0, 0, 512, 0, 0, 0, 585, 16, 0, 0, 1048576, 4194304, 0x80000000, 4, 8, 128, 512, 3072, 16384, 32768, 131072, 512, 0, 0, 4096, 1048576, 0x80000000, 8192, 2097152, 268435456, 0x80000000, 537395200, 537395200, 0, 4196352, 51380242, 51380242, 51380242, 0, 537395200, 4196352, 4196352, 276901888, 8540160, -1606418432, 0, 32768, 537395200, 4196352, 1082130432, 0, 4196352, 537427968, 22022147, 22349827, 22349827, 22349827, 22366219, 22349843, 22349827, 22349827, 22366219, 22349827, 55576594, 55576594, 55576594, 55576594, 55576594, 324012114, 55576594, 55576594, 1062785014, 1062785014, 1062785014, 1062785014, 0, 0, 2, 33554432, 0, 0, 0, 131072, 0, 0, 0, 8192, 8392704, 32768, 268435456, 0, 0, 2, 67108864, 12, 16384, 0, 65536, 0, 22020096, 0, 0, 0, 1040000, 15728640, 0, 0, 329728, 0, 0, 254, 1792, 2809856, 58720256, 19, 0, 0, 0, 1048576, 0, 0, 0, 2048, 0, 0, 0, 18, 33554432, 0, 0, 256, 8192, 0, 0, 8192, 2097152, 0, 0x80000000, 0, 82, 301989888, 0, 0, 0, 2101248, 22020096, 1040187392, 0, 0, 0, 4194304, 0, 0, 0, 16384, 1536, 0, 256, 0, 8192, 2097152, 16, 1048576, 16777216, 33554432, 268435456, 536870912, 0x80000000, 3584, 16384, 32768, 524288, 1048576, 4194304, 0, 0, 8388608, 1073741824, 0, 0, 1536, 2048, 16384, 32768, 524288, 4194304, 134217728, 0, 0, 134217728, 4096, 0, 8, 0, 256, 1536, 16384, 32768, 524288, 128, 536870912, 0, 0, 4, 8, 512, 2048, 0, 0, 1536, 32768, 524288, 4194304, 33554432, 134217728, 536870912, 0, 0, 8192, 2097152, 0x80000000, 0, 0, 512, 2048, 131072, 536870912, 0, 0, 16, 64, 1536, 32768, 32768, 524288, 134217728, 0, 0, 0, 524288, 0, 64, 64, 16392, 1536, 32768, 524288, 0, 0, 33554432, 8192, 0, 65536, 0, 0, 1, 1, 0, 1, 67174400, 33554432, 536870912, -1073741824, 0, 0, 0, 0, 524288, 134217728, 67174400, 0, 0, 0, 16777216, 0, 0, 0, 4, 0, 0, 0, 7, 16, 16384, 8, 8, 0, 0, 512, 3072, 131072, 131072, 268435456, 134217728, 8, 512, 2048, 196608, 262144, 50331648, 536870912, 1073741824, 0, 4, 8, 2048, 8192, 32768, 8388608, 0, 0, 134217736, 16908320, 547389524, 547389524, 555909216, 555909216, 555909216, 555909216, 564297840, 564297844, 564297844, 564297844, 564297844, 1001055742, 1001056254, 1001055742, 1001055742, 1001056254, 1001056254, 1001056254, 1001056254, 1001055742, 1001056254, 1001056254, 1001056254, 1001056254, 0, 1052672, 0x80000000, 0, 0, 4, 16, 0, 0, 84, 2129920, 8388608, 4096, 0, 0, 0, 116, 0, 254, 1280, 2809856, 58720256, 939524096, 0, 0, 0, 50331648, 268435456, 0, 0, 0, 939524096, 0, 0, 520, 1024, 0, 0, 1, 0, 67108864, 1073741824, 0, 0, 0, 20, 64, 32768, 8192, 0, 2048, 0, 2097152, 8388608, 536870912, 0, 0, 1024, 278528, 0, 0, 0, 393232, 163840, 0, 0, 0, 134217728, 0, 0, 0, 16, 0, 0, 0, 15, 208, 15360, 1245184, 52, 0, 0, 0, 268435456, 0, 0, 33554432, 64, 128, 1280, 24576, 163840, 524288, 2097152, 58720256, 402653184, 536870912, 128, 1792, 24576, 163840, 524288, 0, 4, 16, 8388608, 0, 0, 4096, 32768, 262144, 524288, 33554432, 134217728, 0, 0, 24, 32, 128, 1280, 8192, 16384, 8192, 524288, 16777216, 33554432, 402653184, 0, 4, 8, 16, 1024, 2048, 8192, 16384, 32768, 458752, 0, 262144, 33554432, 134217728, 0, 512, 1024, 16777216, 33554432, 402653184, 0, 4096, 1048576, 0, 0, 1998, 59238400, -67108864, 4, 8, 16, 402653184, 0, 0, 8, 16, 402653184, 536870912, 0, 0, 4, 64, 128, 8388608, 0, 0, 67108866, 12, 64, 128, 512, 1024, 4, 16384, 65536, 67108864, 0, 65536, 0, 0, 2048, 64, 64, 64, 96, 96, 96, 96, 0, 8192, 8192, 268435460, 32768, 65536, 2490368, 16777216, 0x80000000, 0, 0, 1, 4, 8, 2048, 8192, 3670016, 2048, 2048, 2048, 2048, 0, 8192, 34816, 9216, 4096, 0, 128, 0, 2097152, 0, 0, 4096, 4096, 29696, 29712, 29840, 29712, 29712, 29840, 29840, 536900624, 4224144, 144384, 144384, 144384, 144384, -754647956, -754647956, -754647956, -754647956, -754647956, -754647940, -754647940, -754647940, -754647940, -754516884, -754647956, -754516884, -754516884, -754516884, 4, 8, 256, 512, 2048, 0, 0, 3670016, 0, 0, 2048, 131072, 524288, 4194304, 0x80000000, 0, 0, 9216, 0, 0, 4, 134217728, 0, 29696, 0, 0, 4, 268435456, 0, 16, 0, 29824, 0, 60, 64576, 319029248, -1073741824, 0, 0, 319160320, 0, 0, 0, 319160320, 0, 0, 524288, 3145728, 0, 12288, 131072, 0, 8, 131072, 61440, 262144, 318767104, -1073741824, 0, 0, 64, 1024, 2048, 61440, 262144, 0, 28, 32, 64, 64, 64, 128, 0, 0, 16384, 32768, 50331648, 268435456, 0, 0, 0, 393216, 0, 0, 0, 486539264, 0, 128, 0, 536870912, 0, 0, 12, 16, 32, 327155712, 34, 1056, 32, 32, 42, 4457568, -326784344, -322851160, -322698144, -322698144, -322698144, -322698144, -322695456, 0, 0, 524288, 1048576, 0, 0, 0, 536870912, 4194304, 131072, 0, 0, 6, 56, 128, 1792, 2, 67108864, 16384, 0, 0, 4096, 4194304, 32768, 0, 0, 0, 8388608, 0, 0, 0, 72, 0, 8, 64, 2048, 57344, 16384, 32768, 262144, 50331648, 268435456, 0, 524288, 1048576, 2097152, 4194304, 134217728, 0x80000000, 0, 0, 50331648, 268435456, 0x80000000, 0, 0, 1, 0, 0, 2, 4, 16, 64, 1, 0, 2, 0, 0, 65536, 0, 0, 0, 1040, 8667136, 0, 131072, 131072, 0, 131072, 0, 131072, 0, 0, 524288, 536870912, 131072, 0, 0, 7, 27756528, -503316480, 0, 256, 0, 2048, 32768, 8388608, 262144, 2113536, 0, 0, 8, 16, 512, 402653184, 0, 0, 0, 256, 32768, 0, 0, 4224, 65536, 262144, 1048576, 4194304, 16777216, 33554432, 67108864, 134217728, 0, 0, 256, 262144, 0, 0, 8192, 268435456, 0, 0, 0, 4, 131073, 0, 0, 9728, 268435456, 0, 0, 16, 393216, 0, 131073, 131073, 33554624, 4, 0, 131073, 0, 0, 13312, 131072, 4194304, -2146430976, 131072, 2097152, 16777216, 0, 0, 512, 131072, 1048576, 2097152, 0, 1572864, 0, 0, 0, 0x80000000, 524288, 0, 1610612736, 1610612736, 1610612736, 393241, 393241, 393241, 393241, 805707793, 805707793, 1879449617, 805708049, 1879449617, 1879449617, 1879449617, 1879449617, -483948553, -475559945, -483948553, -475559945, -483948553, -483948553, -475559945, -475559945, -475559945, -475559945, -483948553, -483948553, -215504905, -475559945, -207116297, -207116297, 0, 0, 0, 1073741824, 0, 0, 2097152, 67108864, 134217728, 536870912, 0, 0, 24576, 0, 0, 0, 2113536, 0, 0, 8, 64, 0, 0, 0, 401424, 805306368, 0, 0, 28672, 0, 0, 4096, 2097152, 4194304, 8388608, 503316480, 1073741824, 0, 0, 1879048192, 0, 0, 32768, 2097152, 8388608, 16777216, 33554432, 0, 401680, 0, 0, 8, 512, 2048, 131072, 33554432, 536870912, 0, 0, 7, 19367920, -503316480, 27756528, -503316480, 0, 0, 0, 0, 0, 19376112, -234881024, 0, 27764720, -234881024, 0, 0, 32768, 33554436, 0, 0, 33554436, 24, 0, 0, 0, 11, 346112, 7, 16, 480, 1536, 32768, 65536, 393216, 10485760, 65536, 10878976, 16777216, 33554432, 536870912, 4, 32, 524288, 1048576, 33554432, 67108864, 65536, 393216, 2097152, 16777216, 262400, 65536, 4224, 4224, 0, 65536, 201326592, 0x80000000, 393216, 10485760, 16777216, 33554432, 1073741824, 0x80000000, 0, 16, 224, 256, 1536, 32768, 65536, 0, 16384, 2097152, 0, 0, 1024, 32768, 65536, 131072, 262144, 262144, 2097152, 16777216, 33554432, 4, 32, 524288, 134217728, 0, 512, 32768, 131072, 262144, 2097152, 2097152, 8388608, 16777216, 1073741824, 0, 0, 512, 32768, 131072, 2097152, 8388608, 8388608, 16777216, 0, 0, 16, 33554432, 4, 16, 224, 512, 32768, 4, 524288, 134217728, 0, 0, 32768, 50331648, 268435456, 4096, 32768, 0, 0, 16, 536870912, 16, 192, 32768, 8388608, 4096, 4096, 4096, 1536, 2, 4, 16, 192, 32768, 0, 16, 64, 128, 8388608, 0, 0, 0, 2, 4, 134217728, 4, 0, 0, 128, 512, 3072, 4096, 16384, 131072, 4, 128, 0, 0, 18, 17825792, 524288, 8388608, 33554432, 0x80000000, 8192, 0, 33554432, 0, 0, 33554432, 0, 0, 0, 268435456, 2, 4, 8, 262144, 262144, 1048576, 2048, 32768, 0, 0, 28, 0, 100663296, 4224, 65536, 65536, 262144, 33554432, 0, 2, 4, 24, -1072627712, 805306384, -1342177264, -1342177264, -1070006272, -1070006272, -1069989376, -1069989376, -258932720, -258932720, -258932720, -258932720, -225378288, -1069989376, -1069989360, -1065795072, -1061600768, -258932720, -225378288, -258932720, -258932720, 1260767, 34815199, 1260767, 34815199, 1260767, 34815199, 34815199, 1260767, 1260767, 34815199, 1260767, 1260767, 169032927, -1978450721, 169032927, -1978450721, 169032927, 169032927, 169032927, 169032927, 1242774751, -1978450721, -1978450721, -225231649, -1173144353, -225231649, -91013921, 0, 0, 32, 128, 256, 262144, 524288, 8388608, 0, 64, 0, 0, 1114112, 1073741824, 0, 0, 34816, 0, 0, 2048, 4194304, 0, 0, 0, 3735552, 0, 0, 32, 512, 2048, 32768, 262144, 524288, 3751936, 0, 0, 0, 48, 0, 0, 528, 7946240, 12140544, 9502720, 1610612736, 0, 0, 0, 15360, 1245184, 0, 0, 134217728, 128, 15, 9633792, 0, 0, 0, 2, 12, 80, 128, 7168, 8192, 7168, 8192, 196608, 1048576, 0, 0, 0, 1, 2, 12, 16, 64, 128, 256, 0, 0, 3145728, 0, 0, 0, 536870912, 0, 0, 8192, 65536, 131072, 1048576, 0, 0, 0, 2097152, 0, 16384, 0, 4194304, 0, 0, 2097152, 16384, 0, 0, 131072, 2097152, 0, 0, 0, 4096, 0, 0, 8192, 0, 0, 0, 128, 0, 0, 0, 208, 0, 64, 128, 1024, 4096, 0, 0, 2, 8, 64, 128, 1024, 2048, 4096, 8192, 128, 1024, 4096, 8192, 0, 0\n];\n\nJSONiqParser.TOKEN =\n[\n  \"(0)\",\n  \"PragmaContents\",\n  \"DirCommentContents\",\n  \"DirPIContents\",\n  \"CDataSection\",\n  \"Wildcard\",\n  \"EQName\",\n  \"URILiteral\",\n  \"IntegerLiteral\",\n  \"DecimalLiteral\",\n  \"DoubleLiteral\",\n  \"StringLiteral\",\n  \"PredefinedEntityRef\",\n  \"'\\\"\\\"'\",\n  \"EscapeApos\",\n  \"ElementContentChar\",\n  \"QuotAttrContentChar\",\n  \"AposAttrContentChar\",\n  \"PITarget\",\n  \"NCName\",\n  \"QName\",\n  \"S\",\n  \"S\",\n  \"CharRef\",\n  \"CommentContents\",\n  \"EOF\",\n  \"'!'\",\n  \"'!='\",\n  \"'\\\"'\",\n  \"'#'\",\n  \"'#)'\",\n  \"'$'\",\n  \"'$$'\",\n  \"'%'\",\n  \"''''\",\n  \"'('\",\n  \"'(#'\",\n  \"'(:'\",\n  \"')'\",\n  \"'*'\",\n  \"'*'\",\n  \"'+'\",\n  \"','\",\n  \"'-'\",\n  \"'-->'\",\n  \"'.'\",\n  \"'..'\",\n  \"'/'\",\n  \"'//'\",\n  \"'/>'\",\n  \"':'\",\n  \"':)'\",\n  \"'::'\",\n  \"':='\",\n  \"';'\",\n  \"'<'\",\n  \"'<!--'\",\n  \"'</'\",\n  \"'<<'\",\n  \"'<='\",\n  \"'<?'\",\n  \"'='\",\n  \"'>'\",\n  \"'>='\",\n  \"'>>'\",\n  \"'?'\",\n  \"'?>'\",\n  \"'@'\",\n  \"'NaN'\",\n  \"'['\",\n  \"']'\",\n  \"'after'\",\n  \"'all'\",\n  \"'allowing'\",\n  \"'ancestor'\",\n  \"'ancestor-or-self'\",\n  \"'and'\",\n  \"'any'\",\n  \"'append'\",\n  \"'array'\",\n  \"'as'\",\n  \"'ascending'\",\n  \"'at'\",\n  \"'attribute'\",\n  \"'base-uri'\",\n  \"'before'\",\n  \"'boundary-space'\",\n  \"'break'\",\n  \"'by'\",\n  \"'case'\",\n  \"'cast'\",\n  \"'castable'\",\n  \"'catch'\",\n  \"'check'\",\n  \"'child'\",\n  \"'collation'\",\n  \"'collection'\",\n  \"'comment'\",\n  \"'constraint'\",\n  \"'construction'\",\n  \"'contains'\",\n  \"'content'\",\n  \"'context'\",\n  \"'continue'\",\n  \"'copy'\",\n  \"'copy-namespaces'\",\n  \"'count'\",\n  \"'decimal-format'\",\n  \"'decimal-separator'\",\n  \"'declare'\",\n  \"'default'\",\n  \"'delete'\",\n  \"'descendant'\",\n  \"'descendant-or-self'\",\n  \"'descending'\",\n  \"'diacritics'\",\n  \"'different'\",\n  \"'digit'\",\n  \"'distance'\",\n  \"'div'\",\n  \"'document'\",\n  \"'document-node'\",\n  \"'element'\",\n  \"'else'\",\n  \"'empty'\",\n  \"'empty-sequence'\",\n  \"'encoding'\",\n  \"'end'\",\n  \"'entire'\",\n  \"'eq'\",\n  \"'every'\",\n  \"'exactly'\",\n  \"'except'\",\n  \"'exit'\",\n  \"'external'\",\n  \"'false'\",\n  \"'first'\",\n  \"'following'\",\n  \"'following-sibling'\",\n  \"'for'\",\n  \"'foreach'\",\n  \"'foreign'\",\n  \"'from'\",\n  \"'ft-option'\",\n  \"'ftand'\",\n  \"'ftnot'\",\n  \"'ftor'\",\n  \"'function'\",\n  \"'ge'\",\n  \"'greatest'\",\n  \"'group'\",\n  \"'grouping-separator'\",\n  \"'gt'\",\n  \"'idiv'\",\n  \"'if'\",\n  \"'import'\",\n  \"'in'\",\n  \"'index'\",\n  \"'infinity'\",\n  \"'inherit'\",\n  \"'insensitive'\",\n  \"'insert'\",\n  \"'instance'\",\n  \"'integrity'\",\n  \"'intersect'\",\n  \"'into'\",\n  \"'is'\",\n  \"'item'\",\n  \"'json'\",\n  \"'json-item'\",\n  \"'jsoniq'\",\n  \"'key'\",\n  \"'language'\",\n  \"'last'\",\n  \"'lax'\",\n  \"'le'\",\n  \"'least'\",\n  \"'let'\",\n  \"'levels'\",\n  \"'loop'\",\n  \"'lowercase'\",\n  \"'lt'\",\n  \"'minus-sign'\",\n  \"'mod'\",\n  \"'modify'\",\n  \"'module'\",\n  \"'most'\",\n  \"'namespace'\",\n  \"'namespace-node'\",\n  \"'ne'\",\n  \"'next'\",\n  \"'no'\",\n  \"'no-inherit'\",\n  \"'no-preserve'\",\n  \"'node'\",\n  \"'nodes'\",\n  \"'not'\",\n  \"'null'\",\n  \"'object'\",\n  \"'occurs'\",\n  \"'of'\",\n  \"'on'\",\n  \"'only'\",\n  \"'option'\",\n  \"'or'\",\n  \"'order'\",\n  \"'ordered'\",\n  \"'ordering'\",\n  \"'paragraph'\",\n  \"'paragraphs'\",\n  \"'parent'\",\n  \"'pattern-separator'\",\n  \"'per-mille'\",\n  \"'percent'\",\n  \"'phrase'\",\n  \"'position'\",\n  \"'preceding'\",\n  \"'preceding-sibling'\",\n  \"'preserve'\",\n  \"'previous'\",\n  \"'processing-instruction'\",\n  \"'relationship'\",\n  \"'rename'\",\n  \"'replace'\",\n  \"'return'\",\n  \"'returning'\",\n  \"'revalidation'\",\n  \"'same'\",\n  \"'satisfies'\",\n  \"'schema'\",\n  \"'schema-attribute'\",\n  \"'schema-element'\",\n  \"'score'\",\n  \"'select'\",\n  \"'self'\",\n  \"'sensitive'\",\n  \"'sentence'\",\n  \"'sentences'\",\n  \"'skip'\",\n  \"'sliding'\",\n  \"'some'\",\n  \"'stable'\",\n  \"'start'\",\n  \"'stemming'\",\n  \"'stop'\",\n  \"'strict'\",\n  \"'strip'\",\n  \"'structured-item'\",\n  \"'switch'\",\n  \"'text'\",\n  \"'then'\",\n  \"'thesaurus'\",\n  \"'times'\",\n  \"'to'\",\n  \"'treat'\",\n  \"'true'\",\n  \"'try'\",\n  \"'tumbling'\",\n  \"'type'\",\n  \"'typeswitch'\",\n  \"'union'\",\n  \"'unique'\",\n  \"'unordered'\",\n  \"'updating'\",\n  \"'uppercase'\",\n  \"'using'\",\n  \"'validate'\",\n  \"'value'\",\n  \"'variable'\",\n  \"'version'\",\n  \"'weight'\",\n  \"'when'\",\n  \"'where'\",\n  \"'while'\",\n  \"'wildcards'\",\n  \"'window'\",\n  \"'with'\",\n  \"'without'\",\n  \"'word'\",\n  \"'words'\",\n  \"'zero-digit'\",\n  \"'{'\",\n  \"'{{'\",\n  \"'{|'\",\n  \"'|'\",\n  \"'||'\",\n  \"'|}'\",\n  \"'}'\",\n  \"'}}'\"\n];\n\n},\n{}],\n10:[function(require,module,exports){\n                                                            var XQueryParser = exports.XQueryParser = function XQueryParser(string, parsingEventHandler)\n                                                            {\n                                                              init(string, parsingEventHandler);\n  var self = this;\n\n  this.ParseException = function(b, e, s, o, x)\n  {\n    var\n      begin = b,\n      end = e,\n      state = s,\n      offending = o,\n      expected = x;\n\n    this.getBegin = function() {return begin;};\n    this.getEnd = function() {return end;};\n    this.getState = function() {return state;};\n    this.getExpected = function() {return expected;};\n    this.getOffending = function() {return offending;};\n\n    this.getMessage = function()\n    {\n      return offending < 0 ? \"lexical analysis failed\" : \"syntax error\";\n    };\n  };\n\n  function init(string, parsingEventHandler)\n  {\n    eventHandler = parsingEventHandler;\n    input = string;\n    size = string.length;\n    reset(0, 0, 0);\n  }\n\n  this.getInput = function()\n  {\n    return input;\n  };\n\n  function reset(l, b, e)\n  {\n            b0 = b; e0 = b;\n    l1 = l; b1 = b; e1 = e;\n    l2 = 0;\n    end = e;\n    ex = -1;\n    memo = {};\n    eventHandler.reset(input);\n  }\n\n  this.getOffendingToken = function(e)\n  {\n    var o = e.getOffending();\n    return o >= 0 ? XQueryParser.TOKEN[o] : null;\n  };\n\n  this.getExpectedTokenSet = function(e)\n  {\n    var expected;\n    if (e.getExpected() < 0)\n    {\n      expected = XQueryParser.getTokenSet(- e.getState());\n    }\n    else\n    {\n      expected = [XQueryParser.TOKEN[e.getExpected()]];\n    }\n    return expected;\n  };\n\n  this.getErrorMessage = function(e)\n  {\n    var tokenSet = this.getExpectedTokenSet(e);\n    var found = this.getOffendingToken(e);\n    var prefix = input.substring(0, e.getBegin());\n    var lines = prefix.split(\"\\n\");\n    var line = lines.length;\n    var column = lines[line - 1].length + 1;\n    var size = e.getEnd() - e.getBegin();\n    return e.getMessage()\n         + (found == null ? \"\" : \", found \" + found)\n         + \"\\nwhile expecting \"\n         + (tokenSet.length == 1 ? tokenSet[0] : (\"[\" + tokenSet.join(\", \") + \"]\"))\n         + \"\\n\"\n         + (size == 0 || found != null ? \"\" : \"after successfully scanning \" + size + \" characters beginning \")\n         + \"at line \" + line + \", column \" + column + \":\\n...\"\n         + input.substring(e.getBegin(), Math.min(input.length, e.getBegin() + 64))\n         + \"...\";\n  };\n\n  this.parse_XQuery = function()\n  {\n    eventHandler.startNonterminal(\"XQuery\", e0);\n    lookahead1W(275);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Module();\n    shift(25);                      // EOF\n    eventHandler.endNonterminal(\"XQuery\", e0);\n  };\n\n  function parse_Module()\n  {\n    eventHandler.startNonterminal(\"Module\", e0);\n    switch (l1)\n    {\n    case 274:                       // 'xquery'\n      lookahead2W(199);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 64274                 // 'xquery' 'encoding'\n     || lk == 134930)               // 'xquery' 'version'\n    {\n      parse_VersionDecl();\n    }\n    lookahead1W(275);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    switch (l1)\n    {\n    case 182:                       // 'module'\n      lookahead2W(194);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 94390:                     // 'module' 'namespace'\n      whitespace();\n      parse_LibraryModule();\n      break;\n    default:\n      whitespace();\n      parse_MainModule();\n    }\n    eventHandler.endNonterminal(\"Module\", e0);\n  }\n\n  function parse_VersionDecl()\n  {\n    eventHandler.startNonterminal(\"VersionDecl\", e0);\n    shift(274);                     // 'xquery'\n    lookahead1W(116);               // S^WS | '(:' | 'encoding' | 'version'\n    switch (l1)\n    {\n    case 125:                       // 'encoding'\n      shift(125);                   // 'encoding'\n      lookahead1W(17);              // StringLiteral | S^WS | '(:'\n      shift(11);                    // StringLiteral\n      break;\n    default:\n      shift(263);                   // 'version'\n      lookahead1W(17);              // StringLiteral | S^WS | '(:'\n      shift(11);                    // StringLiteral\n      lookahead1W(109);             // S^WS | '(:' | ';' | 'encoding'\n      if (l1 == 125)                // 'encoding'\n      {\n        shift(125);                 // 'encoding'\n        lookahead1W(17);            // StringLiteral | S^WS | '(:'\n        shift(11);                  // StringLiteral\n      }\n    }\n    lookahead1W(28);                // S^WS | '(:' | ';'\n    whitespace();\n    parse_Separator();\n    eventHandler.endNonterminal(\"VersionDecl\", e0);\n  }\n\n  function parse_LibraryModule()\n  {\n    eventHandler.startNonterminal(\"LibraryModule\", e0);\n    parse_ModuleDecl();\n    lookahead1W(138);               // S^WS | EOF | '(:' | 'declare' | 'import'\n    whitespace();\n    parse_Prolog();\n    eventHandler.endNonterminal(\"LibraryModule\", e0);\n  }\n\n  function parse_ModuleDecl()\n  {\n    eventHandler.startNonterminal(\"ModuleDecl\", e0);\n    shift(182);                     // 'module'\n    lookahead1W(61);                // S^WS | '(:' | 'namespace'\n    shift(184);                     // 'namespace'\n    lookahead1W(249);               // NCName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_NCName();\n    lookahead1W(29);                // S^WS | '(:' | '='\n    shift(60);                      // '='\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shift(7);                       // URILiteral\n    lookahead1W(28);                // S^WS | '(:' | ';'\n    whitespace();\n    parse_Separator();\n    eventHandler.endNonterminal(\"ModuleDecl\", e0);\n  }\n\n  function parse_Prolog()\n  {\n    eventHandler.startNonterminal(\"Prolog\", e0);\n    for (;;)\n    {\n      lookahead1W(275);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      switch (l1)\n      {\n      case 108:                     // 'declare'\n        lookahead2W(214);           // S^WS | EOF | '!' | '!=' | '#' | '%' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' |\n        break;\n      case 153:                     // 'import'\n        lookahead2W(202);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk != 42604               // 'declare' 'base-uri'\n       && lk != 43628               // 'declare' 'boundary-space'\n       && lk != 50284               // 'declare' 'construction'\n       && lk != 53356               // 'declare' 'copy-namespaces'\n       && lk != 54380               // 'declare' 'decimal-format'\n       && lk != 55916               // 'declare' 'default'\n       && lk != 72300               // 'declare' 'ft-option'\n       && lk != 93337               // 'import' 'module'\n       && lk != 94316               // 'declare' 'namespace'\n       && lk != 104044              // 'declare' 'ordering'\n       && lk != 113772              // 'declare' 'revalidation'\n       && lk != 115353)             // 'import' 'schema'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 108:                     // 'declare'\n        lookahead2W(179);           // S^WS | '(:' | 'base-uri' | 'boundary-space' | 'construction' |\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk == 55916)              // 'declare' 'default'\n      {\n        lk = memoized(0, e0);\n        if (lk == 0)\n        {\n          var b0A = b0; var e0A = e0; var l1A = l1;\n          var b1A = b1; var e1A = e1; var l2A = l2;\n          var b2A = b2; var e2A = e2;\n          try\n          {\n            try_DefaultNamespaceDecl();\n            lk = -1;\n          }\n          catch (p1A)\n          {\n            lk = -2;\n          }\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(0, e0, lk);\n        }\n      }\n      switch (lk)\n      {\n      case -1:\n        whitespace();\n        parse_DefaultNamespaceDecl();\n        break;\n      case 94316:                   // 'declare' 'namespace'\n        whitespace();\n        parse_NamespaceDecl();\n        break;\n      case 153:                     // 'import'\n        whitespace();\n        parse_Import();\n        break;\n      case 72300:                   // 'declare' 'ft-option'\n        whitespace();\n        parse_FTOptionDecl();\n        break;\n      default:\n        whitespace();\n        parse_Setter();\n      }\n      lookahead1W(28);              // S^WS | '(:' | ';'\n      whitespace();\n      parse_Separator();\n    }\n    for (;;)\n    {\n      lookahead1W(275);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      switch (l1)\n      {\n      case 108:                     // 'declare'\n        lookahead2W(211);           // S^WS | EOF | '!' | '!=' | '#' | '%' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' |\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk != 16492               // 'declare' '%'\n       && lk != 48748               // 'declare' 'collection'\n       && lk != 51820               // 'declare' 'context'\n       && lk != 74348               // 'declare' 'function'\n       && lk != 79468               // 'declare' 'index'\n       && lk != 82540               // 'declare' 'integrity'\n       && lk != 101996              // 'declare' 'option'\n       && lk != 131692              // 'declare' 'updating'\n       && lk != 134252)             // 'declare' 'variable'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 108:                     // 'declare'\n        lookahead2W(175);           // S^WS | '%' | '(:' | 'collection' | 'context' | 'function' | 'index' |\n        break;\n      default:\n        lk = l1;\n      }\n      switch (lk)\n      {\n      case 51820:                   // 'declare' 'context'\n        whitespace();\n        parse_ContextItemDecl();\n        break;\n      case 101996:                  // 'declare' 'option'\n        whitespace();\n        parse_OptionDecl();\n        break;\n      default:\n        whitespace();\n        parse_AnnotatedDecl();\n      }\n      lookahead1W(28);              // S^WS | '(:' | ';'\n      whitespace();\n      parse_Separator();\n    }\n    eventHandler.endNonterminal(\"Prolog\", e0);\n  }\n\n  function parse_Separator()\n  {\n    eventHandler.startNonterminal(\"Separator\", e0);\n    shift(53);                      // ';'\n    eventHandler.endNonterminal(\"Separator\", e0);\n  }\n\n  function parse_Setter()\n  {\n    eventHandler.startNonterminal(\"Setter\", e0);\n    switch (l1)\n    {\n    case 108:                       // 'declare'\n      lookahead2W(172);             // S^WS | '(:' | 'base-uri' | 'boundary-space' | 'construction' |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 55916)                // 'declare' 'default'\n    {\n      lk = memoized(1, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_DefaultCollationDecl();\n          lk = -2;\n        }\n        catch (p2A)\n        {\n          try\n          {\n            b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n            b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n            b2 = b2A; e2 = e2A; end = e2A; }}\n            try_EmptyOrderDecl();\n            lk = -6;\n          }\n          catch (p6A)\n          {\n            lk = -9;\n          }\n        }\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(1, e0, lk);\n      }\n    }\n    switch (lk)\n    {\n    case 43628:                     // 'declare' 'boundary-space'\n      parse_BoundarySpaceDecl();\n      break;\n    case -2:\n      parse_DefaultCollationDecl();\n      break;\n    case 42604:                     // 'declare' 'base-uri'\n      parse_BaseURIDecl();\n      break;\n    case 50284:                     // 'declare' 'construction'\n      parse_ConstructionDecl();\n      break;\n    case 104044:                    // 'declare' 'ordering'\n      parse_OrderingModeDecl();\n      break;\n    case -6:\n      parse_EmptyOrderDecl();\n      break;\n    case 113772:                    // 'declare' 'revalidation'\n      parse_RevalidationDecl();\n      break;\n    case 53356:                     // 'declare' 'copy-namespaces'\n      parse_CopyNamespacesDecl();\n      break;\n    default:\n      parse_DecimalFormatDecl();\n    }\n    eventHandler.endNonterminal(\"Setter\", e0);\n  }\n\n  function parse_BoundarySpaceDecl()\n  {\n    eventHandler.startNonterminal(\"BoundarySpaceDecl\", e0);\n    shift(108);                     // 'declare'\n    lookahead1W(33);                // S^WS | '(:' | 'boundary-space'\n    shift(85);                      // 'boundary-space'\n    lookahead1W(133);               // S^WS | '(:' | 'preserve' | 'strip'\n    switch (l1)\n    {\n    case 214:                       // 'preserve'\n      shift(214);                   // 'preserve'\n      break;\n    default:\n      shift(241);                   // 'strip'\n    }\n    eventHandler.endNonterminal(\"BoundarySpaceDecl\", e0);\n  }\n\n  function parse_DefaultCollationDecl()\n  {\n    eventHandler.startNonterminal(\"DefaultCollationDecl\", e0);\n    shift(108);                     // 'declare'\n    lookahead1W(46);                // S^WS | '(:' | 'default'\n    shift(109);                     // 'default'\n    lookahead1W(38);                // S^WS | '(:' | 'collation'\n    shift(94);                      // 'collation'\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shift(7);                       // URILiteral\n    eventHandler.endNonterminal(\"DefaultCollationDecl\", e0);\n  }\n\n  function try_DefaultCollationDecl()\n  {\n    shiftT(108);                    // 'declare'\n    lookahead1W(46);                // S^WS | '(:' | 'default'\n    shiftT(109);                    // 'default'\n    lookahead1W(38);                // S^WS | '(:' | 'collation'\n    shiftT(94);                     // 'collation'\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shiftT(7);                      // URILiteral\n  }\n\n  function parse_BaseURIDecl()\n  {\n    eventHandler.startNonterminal(\"BaseURIDecl\", e0);\n    shift(108);                     // 'declare'\n    lookahead1W(32);                // S^WS | '(:' | 'base-uri'\n    shift(83);                      // 'base-uri'\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shift(7);                       // URILiteral\n    eventHandler.endNonterminal(\"BaseURIDecl\", e0);\n  }\n\n  function parse_ConstructionDecl()\n  {\n    eventHandler.startNonterminal(\"ConstructionDecl\", e0);\n    shift(108);                     // 'declare'\n    lookahead1W(41);                // S^WS | '(:' | 'construction'\n    shift(98);                      // 'construction'\n    lookahead1W(133);               // S^WS | '(:' | 'preserve' | 'strip'\n    switch (l1)\n    {\n    case 241:                       // 'strip'\n      shift(241);                   // 'strip'\n      break;\n    default:\n      shift(214);                   // 'preserve'\n    }\n    eventHandler.endNonterminal(\"ConstructionDecl\", e0);\n  }\n\n  function parse_OrderingModeDecl()\n  {\n    eventHandler.startNonterminal(\"OrderingModeDecl\", e0);\n    shift(108);                     // 'declare'\n    lookahead1W(68);                // S^WS | '(:' | 'ordering'\n    shift(203);                     // 'ordering'\n    lookahead1W(131);               // S^WS | '(:' | 'ordered' | 'unordered'\n    switch (l1)\n    {\n    case 202:                       // 'ordered'\n      shift(202);                   // 'ordered'\n      break;\n    default:\n      shift(256);                   // 'unordered'\n    }\n    eventHandler.endNonterminal(\"OrderingModeDecl\", e0);\n  }\n\n  function parse_EmptyOrderDecl()\n  {\n    eventHandler.startNonterminal(\"EmptyOrderDecl\", e0);\n    shift(108);                     // 'declare'\n    lookahead1W(46);                // S^WS | '(:' | 'default'\n    shift(109);                     // 'default'\n    lookahead1W(67);                // S^WS | '(:' | 'order'\n    shift(201);                     // 'order'\n    lookahead1W(49);                // S^WS | '(:' | 'empty'\n    shift(123);                     // 'empty'\n    lookahead1W(121);               // S^WS | '(:' | 'greatest' | 'least'\n    switch (l1)\n    {\n    case 147:                       // 'greatest'\n      shift(147);                   // 'greatest'\n      break;\n    default:\n      shift(173);                   // 'least'\n    }\n    eventHandler.endNonterminal(\"EmptyOrderDecl\", e0);\n  }\n\n  function try_EmptyOrderDecl()\n  {\n    shiftT(108);                    // 'declare'\n    lookahead1W(46);                // S^WS | '(:' | 'default'\n    shiftT(109);                    // 'default'\n    lookahead1W(67);                // S^WS | '(:' | 'order'\n    shiftT(201);                    // 'order'\n    lookahead1W(49);                // S^WS | '(:' | 'empty'\n    shiftT(123);                    // 'empty'\n    lookahead1W(121);               // S^WS | '(:' | 'greatest' | 'least'\n    switch (l1)\n    {\n    case 147:                       // 'greatest'\n      shiftT(147);                  // 'greatest'\n      break;\n    default:\n      shiftT(173);                  // 'least'\n    }\n  }\n\n  function parse_CopyNamespacesDecl()\n  {\n    eventHandler.startNonterminal(\"CopyNamespacesDecl\", e0);\n    shift(108);                     // 'declare'\n    lookahead1W(44);                // S^WS | '(:' | 'copy-namespaces'\n    shift(104);                     // 'copy-namespaces'\n    lookahead1W(128);               // S^WS | '(:' | 'no-preserve' | 'preserve'\n    whitespace();\n    parse_PreserveMode();\n    lookahead1W(25);                // S^WS | '(:' | ','\n    shift(41);                      // ','\n    lookahead1W(123);               // S^WS | '(:' | 'inherit' | 'no-inherit'\n    whitespace();\n    parse_InheritMode();\n    eventHandler.endNonterminal(\"CopyNamespacesDecl\", e0);\n  }\n\n  function parse_PreserveMode()\n  {\n    eventHandler.startNonterminal(\"PreserveMode\", e0);\n    switch (l1)\n    {\n    case 214:                       // 'preserve'\n      shift(214);                   // 'preserve'\n      break;\n    default:\n      shift(190);                   // 'no-preserve'\n    }\n    eventHandler.endNonterminal(\"PreserveMode\", e0);\n  }\n\n  function parse_InheritMode()\n  {\n    eventHandler.startNonterminal(\"InheritMode\", e0);\n    switch (l1)\n    {\n    case 157:                       // 'inherit'\n      shift(157);                   // 'inherit'\n      break;\n    default:\n      shift(189);                   // 'no-inherit'\n    }\n    eventHandler.endNonterminal(\"InheritMode\", e0);\n  }\n\n  function parse_DecimalFormatDecl()\n  {\n    eventHandler.startNonterminal(\"DecimalFormatDecl\", e0);\n    shift(108);                     // 'declare'\n    lookahead1W(114);               // S^WS | '(:' | 'decimal-format' | 'default'\n    switch (l1)\n    {\n    case 106:                       // 'decimal-format'\n      shift(106);                   // 'decimal-format'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_EQName();\n      break;\n    default:\n      shift(109);                   // 'default'\n      lookahead1W(45);              // S^WS | '(:' | 'decimal-format'\n      shift(106);                   // 'decimal-format'\n    }\n    for (;;)\n    {\n      lookahead1W(181);             // S^WS | '(:' | ';' | 'NaN' | 'decimal-separator' | 'digit' |\n      if (l1 == 53)                 // ';'\n      {\n        break;\n      }\n      whitespace();\n      parse_DFPropertyName();\n      lookahead1W(29);              // S^WS | '(:' | '='\n      shift(60);                    // '='\n      lookahead1W(17);              // StringLiteral | S^WS | '(:'\n      shift(11);                    // StringLiteral\n    }\n    eventHandler.endNonterminal(\"DecimalFormatDecl\", e0);\n  }\n\n  function parse_DFPropertyName()\n  {\n    eventHandler.startNonterminal(\"DFPropertyName\", e0);\n    switch (l1)\n    {\n    case 107:                       // 'decimal-separator'\n      shift(107);                   // 'decimal-separator'\n      break;\n    case 149:                       // 'grouping-separator'\n      shift(149);                   // 'grouping-separator'\n      break;\n    case 156:                       // 'infinity'\n      shift(156);                   // 'infinity'\n      break;\n    case 179:                       // 'minus-sign'\n      shift(179);                   // 'minus-sign'\n      break;\n    case 67:                        // 'NaN'\n      shift(67);                    // 'NaN'\n      break;\n    case 209:                       // 'percent'\n      shift(209);                   // 'percent'\n      break;\n    case 208:                       // 'per-mille'\n      shift(208);                   // 'per-mille'\n      break;\n    case 275:                       // 'zero-digit'\n      shift(275);                   // 'zero-digit'\n      break;\n    case 116:                       // 'digit'\n      shift(116);                   // 'digit'\n      break;\n    default:\n      shift(207);                   // 'pattern-separator'\n    }\n    eventHandler.endNonterminal(\"DFPropertyName\", e0);\n  }\n\n  function parse_Import()\n  {\n    eventHandler.startNonterminal(\"Import\", e0);\n    switch (l1)\n    {\n    case 153:                       // 'import'\n      lookahead2W(126);             // S^WS | '(:' | 'module' | 'schema'\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 115353:                    // 'import' 'schema'\n      parse_SchemaImport();\n      break;\n    default:\n      parse_ModuleImport();\n    }\n    eventHandler.endNonterminal(\"Import\", e0);\n  }\n\n  function parse_SchemaImport()\n  {\n    eventHandler.startNonterminal(\"SchemaImport\", e0);\n    shift(153);                     // 'import'\n    lookahead1W(73);                // S^WS | '(:' | 'schema'\n    shift(225);                     // 'schema'\n    lookahead1W(137);               // URILiteral | S^WS | '(:' | 'default' | 'namespace'\n    if (l1 != 7)                    // URILiteral\n    {\n      whitespace();\n      parse_SchemaPrefix();\n    }\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shift(7);                       // URILiteral\n    lookahead1W(108);               // S^WS | '(:' | ';' | 'at'\n    if (l1 == 81)                   // 'at'\n    {\n      shift(81);                    // 'at'\n      lookahead1W(15);              // URILiteral | S^WS | '(:'\n      shift(7);                     // URILiteral\n      for (;;)\n      {\n        lookahead1W(103);           // S^WS | '(:' | ',' | ';'\n        if (l1 != 41)               // ','\n        {\n          break;\n        }\n        shift(41);                  // ','\n        lookahead1W(15);            // URILiteral | S^WS | '(:'\n        shift(7);                   // URILiteral\n      }\n    }\n    eventHandler.endNonterminal(\"SchemaImport\", e0);\n  }\n\n  function parse_SchemaPrefix()\n  {\n    eventHandler.startNonterminal(\"SchemaPrefix\", e0);\n    switch (l1)\n    {\n    case 184:                       // 'namespace'\n      shift(184);                   // 'namespace'\n      lookahead1W(249);             // NCName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_NCName();\n      lookahead1W(29);              // S^WS | '(:' | '='\n      shift(60);                    // '='\n      break;\n    default:\n      shift(109);                   // 'default'\n      lookahead1W(47);              // S^WS | '(:' | 'element'\n      shift(121);                   // 'element'\n      lookahead1W(61);              // S^WS | '(:' | 'namespace'\n      shift(184);                   // 'namespace'\n    }\n    eventHandler.endNonterminal(\"SchemaPrefix\", e0);\n  }\n\n  function parse_ModuleImport()\n  {\n    eventHandler.startNonterminal(\"ModuleImport\", e0);\n    shift(153);                     // 'import'\n    lookahead1W(60);                // S^WS | '(:' | 'module'\n    shift(182);                     // 'module'\n    lookahead1W(90);                // URILiteral | S^WS | '(:' | 'namespace'\n    if (l1 == 184)                  // 'namespace'\n    {\n      shift(184);                   // 'namespace'\n      lookahead1W(249);             // NCName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_NCName();\n      lookahead1W(29);              // S^WS | '(:' | '='\n      shift(60);                    // '='\n    }\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shift(7);                       // URILiteral\n    lookahead1W(108);               // S^WS | '(:' | ';' | 'at'\n    if (l1 == 81)                   // 'at'\n    {\n      shift(81);                    // 'at'\n      lookahead1W(15);              // URILiteral | S^WS | '(:'\n      shift(7);                     // URILiteral\n      for (;;)\n      {\n        lookahead1W(103);           // S^WS | '(:' | ',' | ';'\n        if (l1 != 41)               // ','\n        {\n          break;\n        }\n        shift(41);                  // ','\n        lookahead1W(15);            // URILiteral | S^WS | '(:'\n        shift(7);                   // URILiteral\n      }\n    }\n    eventHandler.endNonterminal(\"ModuleImport\", e0);\n  }\n\n  function parse_NamespaceDecl()\n  {\n    eventHandler.startNonterminal(\"NamespaceDecl\", e0);\n    shift(108);                     // 'declare'\n    lookahead1W(61);                // S^WS | '(:' | 'namespace'\n    shift(184);                     // 'namespace'\n    lookahead1W(249);               // NCName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_NCName();\n    lookahead1W(29);                // S^WS | '(:' | '='\n    shift(60);                      // '='\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shift(7);                       // URILiteral\n    eventHandler.endNonterminal(\"NamespaceDecl\", e0);\n  }\n\n  function parse_DefaultNamespaceDecl()\n  {\n    eventHandler.startNonterminal(\"DefaultNamespaceDecl\", e0);\n    shift(108);                     // 'declare'\n    lookahead1W(46);                // S^WS | '(:' | 'default'\n    shift(109);                     // 'default'\n    lookahead1W(115);               // S^WS | '(:' | 'element' | 'function'\n    switch (l1)\n    {\n    case 121:                       // 'element'\n      shift(121);                   // 'element'\n      break;\n    default:\n      shift(145);                   // 'function'\n    }\n    lookahead1W(61);                // S^WS | '(:' | 'namespace'\n    shift(184);                     // 'namespace'\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shift(7);                       // URILiteral\n    eventHandler.endNonterminal(\"DefaultNamespaceDecl\", e0);\n  }\n\n  function try_DefaultNamespaceDecl()\n  {\n    shiftT(108);                    // 'declare'\n    lookahead1W(46);                // S^WS | '(:' | 'default'\n    shiftT(109);                    // 'default'\n    lookahead1W(115);               // S^WS | '(:' | 'element' | 'function'\n    switch (l1)\n    {\n    case 121:                       // 'element'\n      shiftT(121);                  // 'element'\n      break;\n    default:\n      shiftT(145);                  // 'function'\n    }\n    lookahead1W(61);                // S^WS | '(:' | 'namespace'\n    shiftT(184);                    // 'namespace'\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shiftT(7);                      // URILiteral\n  }\n\n  function parse_FTOptionDecl()\n  {\n    eventHandler.startNonterminal(\"FTOptionDecl\", e0);\n    shift(108);                     // 'declare'\n    lookahead1W(52);                // S^WS | '(:' | 'ft-option'\n    shift(141);                     // 'ft-option'\n    lookahead1W(81);                // S^WS | '(:' | 'using'\n    whitespace();\n    parse_FTMatchOptions();\n    eventHandler.endNonterminal(\"FTOptionDecl\", e0);\n  }\n\n  function parse_AnnotatedDecl()\n  {\n    eventHandler.startNonterminal(\"AnnotatedDecl\", e0);\n    shift(108);                     // 'declare'\n    for (;;)\n    {\n      lookahead1W(170);             // S^WS | '%' | '(:' | 'collection' | 'function' | 'index' | 'integrity' |\n      if (l1 != 32                  // '%'\n       && l1 != 257)                // 'updating'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 257:                     // 'updating'\n        whitespace();\n        parse_CompatibilityAnnotation();\n        break;\n      default:\n        whitespace();\n        parse_Annotation();\n      }\n    }\n    switch (l1)\n    {\n    case 262:                       // 'variable'\n      whitespace();\n      parse_VarDecl();\n      break;\n    case 145:                       // 'function'\n      whitespace();\n      parse_FunctionDecl();\n      break;\n    case 95:                        // 'collection'\n      whitespace();\n      parse_CollectionDecl();\n      break;\n    case 155:                       // 'index'\n      whitespace();\n      parse_IndexDecl();\n      break;\n    default:\n      whitespace();\n      parse_ICDecl();\n    }\n    eventHandler.endNonterminal(\"AnnotatedDecl\", e0);\n  }\n\n  function parse_CompatibilityAnnotation()\n  {\n    eventHandler.startNonterminal(\"CompatibilityAnnotation\", e0);\n    shift(257);                     // 'updating'\n    eventHandler.endNonterminal(\"CompatibilityAnnotation\", e0);\n  }\n\n  function parse_Annotation()\n  {\n    eventHandler.startNonterminal(\"Annotation\", e0);\n    shift(32);                      // '%'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_EQName();\n    lookahead1W(171);               // S^WS | '%' | '(' | '(:' | 'collection' | 'function' | 'index' | 'integrity' |\n    if (l1 == 34)                   // '('\n    {\n      shift(34);                    // '('\n      lookahead1W(154);             // IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral | S^WS | '(:'\n      whitespace();\n      parse_Literal();\n      for (;;)\n      {\n        lookahead1W(101);           // S^WS | '(:' | ')' | ','\n        if (l1 != 41)               // ','\n        {\n          break;\n        }\n        shift(41);                  // ','\n        lookahead1W(154);           // IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral | S^WS | '(:'\n        whitespace();\n        parse_Literal();\n      }\n      shift(37);                    // ')'\n    }\n    eventHandler.endNonterminal(\"Annotation\", e0);\n  }\n\n  function try_Annotation()\n  {\n    shiftT(32);                     // '%'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_EQName();\n    lookahead1W(171);               // S^WS | '%' | '(' | '(:' | 'collection' | 'function' | 'index' | 'integrity' |\n    if (l1 == 34)                   // '('\n    {\n      shiftT(34);                   // '('\n      lookahead1W(154);             // IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral | S^WS | '(:'\n      try_Literal();\n      for (;;)\n      {\n        lookahead1W(101);           // S^WS | '(:' | ')' | ','\n        if (l1 != 41)               // ','\n        {\n          break;\n        }\n        shiftT(41);                 // ','\n        lookahead1W(154);           // IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral | S^WS | '(:'\n        try_Literal();\n      }\n      shiftT(37);                   // ')'\n    }\n  }\n\n  function parse_VarDecl()\n  {\n    eventHandler.startNonterminal(\"VarDecl\", e0);\n    shift(262);                     // 'variable'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shift(31);                      // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    lookahead1W(147);               // S^WS | '(:' | ':=' | 'as' | 'external'\n    if (l1 == 79)                   // 'as'\n    {\n      whitespace();\n      parse_TypeDeclaration();\n    }\n    lookahead1W(106);               // S^WS | '(:' | ':=' | 'external'\n    switch (l1)\n    {\n    case 52:                        // ':='\n      shift(52);                    // ':='\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_VarValue();\n      break;\n    default:\n      shift(133);                   // 'external'\n      lookahead1W(104);             // S^WS | '(:' | ':=' | ';'\n      if (l1 == 52)                 // ':='\n      {\n        shift(52);                  // ':='\n        lookahead1W(267);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        whitespace();\n        parse_VarDefaultValue();\n      }\n    }\n    eventHandler.endNonterminal(\"VarDecl\", e0);\n  }\n\n  function parse_VarValue()\n  {\n    eventHandler.startNonterminal(\"VarValue\", e0);\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"VarValue\", e0);\n  }\n\n  function parse_VarDefaultValue()\n  {\n    eventHandler.startNonterminal(\"VarDefaultValue\", e0);\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"VarDefaultValue\", e0);\n  }\n\n  function parse_ContextItemDecl()\n  {\n    eventHandler.startNonterminal(\"ContextItemDecl\", e0);\n    shift(108);                     // 'declare'\n    lookahead1W(43);                // S^WS | '(:' | 'context'\n    shift(101);                     // 'context'\n    lookahead1W(55);                // S^WS | '(:' | 'item'\n    shift(165);                     // 'item'\n    lookahead1W(147);               // S^WS | '(:' | ':=' | 'as' | 'external'\n    if (l1 == 79)                   // 'as'\n    {\n      shift(79);                    // 'as'\n      lookahead1W(260);             // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_ItemType();\n    }\n    lookahead1W(106);               // S^WS | '(:' | ':=' | 'external'\n    switch (l1)\n    {\n    case 52:                        // ':='\n      shift(52);                    // ':='\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_VarValue();\n      break;\n    default:\n      shift(133);                   // 'external'\n      lookahead1W(104);             // S^WS | '(:' | ':=' | ';'\n      if (l1 == 52)                 // ':='\n      {\n        shift(52);                  // ':='\n        lookahead1W(267);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        whitespace();\n        parse_VarDefaultValue();\n      }\n    }\n    eventHandler.endNonterminal(\"ContextItemDecl\", e0);\n  }\n\n  function parse_ParamList()\n  {\n    eventHandler.startNonterminal(\"ParamList\", e0);\n    parse_Param();\n    for (;;)\n    {\n      lookahead1W(101);             // S^WS | '(:' | ')' | ','\n      if (l1 != 41)                 // ','\n      {\n        break;\n      }\n      shift(41);                    // ','\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      whitespace();\n      parse_Param();\n    }\n    eventHandler.endNonterminal(\"ParamList\", e0);\n  }\n\n  function try_ParamList()\n  {\n    try_Param();\n    for (;;)\n    {\n      lookahead1W(101);             // S^WS | '(:' | ')' | ','\n      if (l1 != 41)                 // ','\n      {\n        break;\n      }\n      shiftT(41);                   // ','\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      try_Param();\n    }\n  }\n\n  function parse_Param()\n  {\n    eventHandler.startNonterminal(\"Param\", e0);\n    shift(31);                      // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_EQName();\n    lookahead1W(143);               // S^WS | '(:' | ')' | ',' | 'as'\n    if (l1 == 79)                   // 'as'\n    {\n      whitespace();\n      parse_TypeDeclaration();\n    }\n    eventHandler.endNonterminal(\"Param\", e0);\n  }\n\n  function try_Param()\n  {\n    shiftT(31);                     // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_EQName();\n    lookahead1W(143);               // S^WS | '(:' | ')' | ',' | 'as'\n    if (l1 == 79)                   // 'as'\n    {\n      try_TypeDeclaration();\n    }\n  }\n\n  function parse_FunctionBody()\n  {\n    eventHandler.startNonterminal(\"FunctionBody\", e0);\n    parse_EnclosedExpr();\n    eventHandler.endNonterminal(\"FunctionBody\", e0);\n  }\n\n  function try_FunctionBody()\n  {\n    try_EnclosedExpr();\n  }\n\n  function parse_EnclosedExpr()\n  {\n    eventHandler.startNonterminal(\"EnclosedExpr\", e0);\n    shift(276);                     // '{'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Expr();\n    shift(282);                     // '}'\n    eventHandler.endNonterminal(\"EnclosedExpr\", e0);\n  }\n\n  function try_EnclosedExpr()\n  {\n    shiftT(276);                    // '{'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Expr();\n    shiftT(282);                    // '}'\n  }\n\n  function parse_OptionDecl()\n  {\n    eventHandler.startNonterminal(\"OptionDecl\", e0);\n    shift(108);                     // 'declare'\n    lookahead1W(66);                // S^WS | '(:' | 'option'\n    shift(199);                     // 'option'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_EQName();\n    lookahead1W(17);                // StringLiteral | S^WS | '(:'\n    shift(11);                      // StringLiteral\n    eventHandler.endNonterminal(\"OptionDecl\", e0);\n  }\n\n  function parse_Expr()\n  {\n    eventHandler.startNonterminal(\"Expr\", e0);\n    parse_ExprSingle();\n    for (;;)\n    {\n      if (l1 != 41)                 // ','\n      {\n        break;\n      }\n      shift(41);                    // ','\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_ExprSingle();\n    }\n    eventHandler.endNonterminal(\"Expr\", e0);\n  }\n\n  function try_Expr()\n  {\n    try_ExprSingle();\n    for (;;)\n    {\n      if (l1 != 41)                 // ','\n      {\n        break;\n      }\n      shiftT(41);                   // ','\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_ExprSingle();\n    }\n  }\n\n  function parse_FLWORExpr()\n  {\n    eventHandler.startNonterminal(\"FLWORExpr\", e0);\n    parse_InitialClause();\n    for (;;)\n    {\n      lookahead1W(173);             // S^WS | '(:' | 'count' | 'for' | 'group' | 'let' | 'order' | 'return' | 'stable' |\n      if (l1 == 220)                // 'return'\n      {\n        break;\n      }\n      whitespace();\n      parse_IntermediateClause();\n    }\n    whitespace();\n    parse_ReturnClause();\n    eventHandler.endNonterminal(\"FLWORExpr\", e0);\n  }\n\n  function try_FLWORExpr()\n  {\n    try_InitialClause();\n    for (;;)\n    {\n      lookahead1W(173);             // S^WS | '(:' | 'count' | 'for' | 'group' | 'let' | 'order' | 'return' | 'stable' |\n      if (l1 == 220)                // 'return'\n      {\n        break;\n      }\n      try_IntermediateClause();\n    }\n    try_ReturnClause();\n  }\n\n  function parse_InitialClause()\n  {\n    eventHandler.startNonterminal(\"InitialClause\", e0);\n    switch (l1)\n    {\n    case 137:                       // 'for'\n      lookahead2W(141);             // S^WS | '$' | '(:' | 'sliding' | 'tumbling'\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 16009:                     // 'for' '$'\n      parse_ForClause();\n      break;\n    case 174:                       // 'let'\n      parse_LetClause();\n      break;\n    default:\n      parse_WindowClause();\n    }\n    eventHandler.endNonterminal(\"InitialClause\", e0);\n  }\n\n  function try_InitialClause()\n  {\n    switch (l1)\n    {\n    case 137:                       // 'for'\n      lookahead2W(141);             // S^WS | '$' | '(:' | 'sliding' | 'tumbling'\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 16009:                     // 'for' '$'\n      try_ForClause();\n      break;\n    case 174:                       // 'let'\n      try_LetClause();\n      break;\n    default:\n      try_WindowClause();\n    }\n  }\n\n  function parse_IntermediateClause()\n  {\n    eventHandler.startNonterminal(\"IntermediateClause\", e0);\n    switch (l1)\n    {\n    case 137:                       // 'for'\n    case 174:                       // 'let'\n      parse_InitialClause();\n      break;\n    case 266:                       // 'where'\n      parse_WhereClause();\n      break;\n    case 148:                       // 'group'\n      parse_GroupByClause();\n      break;\n    case 105:                       // 'count'\n      parse_CountClause();\n      break;\n    default:\n      parse_OrderByClause();\n    }\n    eventHandler.endNonterminal(\"IntermediateClause\", e0);\n  }\n\n  function try_IntermediateClause()\n  {\n    switch (l1)\n    {\n    case 137:                       // 'for'\n    case 174:                       // 'let'\n      try_InitialClause();\n      break;\n    case 266:                       // 'where'\n      try_WhereClause();\n      break;\n    case 148:                       // 'group'\n      try_GroupByClause();\n      break;\n    case 105:                       // 'count'\n      try_CountClause();\n      break;\n    default:\n      try_OrderByClause();\n    }\n  }\n\n  function parse_ForClause()\n  {\n    eventHandler.startNonterminal(\"ForClause\", e0);\n    shift(137);                     // 'for'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    whitespace();\n    parse_ForBinding();\n    for (;;)\n    {\n      if (l1 != 41)                 // ','\n      {\n        break;\n      }\n      shift(41);                    // ','\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      whitespace();\n      parse_ForBinding();\n    }\n    eventHandler.endNonterminal(\"ForClause\", e0);\n  }\n\n  function try_ForClause()\n  {\n    shiftT(137);                    // 'for'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    try_ForBinding();\n    for (;;)\n    {\n      if (l1 != 41)                 // ','\n      {\n        break;\n      }\n      shiftT(41);                   // ','\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      try_ForBinding();\n    }\n  }\n\n  function parse_ForBinding()\n  {\n    eventHandler.startNonterminal(\"ForBinding\", e0);\n    shift(31);                      // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    lookahead1W(164);               // S^WS | '(:' | 'allowing' | 'as' | 'at' | 'in' | 'score'\n    if (l1 == 79)                   // 'as'\n    {\n      whitespace();\n      parse_TypeDeclaration();\n    }\n    lookahead1W(158);               // S^WS | '(:' | 'allowing' | 'at' | 'in' | 'score'\n    if (l1 == 72)                   // 'allowing'\n    {\n      whitespace();\n      parse_AllowingEmpty();\n    }\n    lookahead1W(150);               // S^WS | '(:' | 'at' | 'in' | 'score'\n    if (l1 == 81)                   // 'at'\n    {\n      whitespace();\n      parse_PositionalVar();\n    }\n    lookahead1W(122);               // S^WS | '(:' | 'in' | 'score'\n    if (l1 == 228)                  // 'score'\n    {\n      whitespace();\n      parse_FTScoreVar();\n    }\n    lookahead1W(53);                // S^WS | '(:' | 'in'\n    shift(154);                     // 'in'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"ForBinding\", e0);\n  }\n\n  function try_ForBinding()\n  {\n    shiftT(31);                     // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n    lookahead1W(164);               // S^WS | '(:' | 'allowing' | 'as' | 'at' | 'in' | 'score'\n    if (l1 == 79)                   // 'as'\n    {\n      try_TypeDeclaration();\n    }\n    lookahead1W(158);               // S^WS | '(:' | 'allowing' | 'at' | 'in' | 'score'\n    if (l1 == 72)                   // 'allowing'\n    {\n      try_AllowingEmpty();\n    }\n    lookahead1W(150);               // S^WS | '(:' | 'at' | 'in' | 'score'\n    if (l1 == 81)                   // 'at'\n    {\n      try_PositionalVar();\n    }\n    lookahead1W(122);               // S^WS | '(:' | 'in' | 'score'\n    if (l1 == 228)                  // 'score'\n    {\n      try_FTScoreVar();\n    }\n    lookahead1W(53);                // S^WS | '(:' | 'in'\n    shiftT(154);                    // 'in'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_AllowingEmpty()\n  {\n    eventHandler.startNonterminal(\"AllowingEmpty\", e0);\n    shift(72);                      // 'allowing'\n    lookahead1W(49);                // S^WS | '(:' | 'empty'\n    shift(123);                     // 'empty'\n    eventHandler.endNonterminal(\"AllowingEmpty\", e0);\n  }\n\n  function try_AllowingEmpty()\n  {\n    shiftT(72);                     // 'allowing'\n    lookahead1W(49);                // S^WS | '(:' | 'empty'\n    shiftT(123);                    // 'empty'\n  }\n\n  function parse_PositionalVar()\n  {\n    eventHandler.startNonterminal(\"PositionalVar\", e0);\n    shift(81);                      // 'at'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shift(31);                      // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    eventHandler.endNonterminal(\"PositionalVar\", e0);\n  }\n\n  function try_PositionalVar()\n  {\n    shiftT(81);                     // 'at'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shiftT(31);                     // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n  }\n\n  function parse_FTScoreVar()\n  {\n    eventHandler.startNonterminal(\"FTScoreVar\", e0);\n    shift(228);                     // 'score'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shift(31);                      // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    eventHandler.endNonterminal(\"FTScoreVar\", e0);\n  }\n\n  function try_FTScoreVar()\n  {\n    shiftT(228);                    // 'score'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shiftT(31);                     // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n  }\n\n  function parse_LetClause()\n  {\n    eventHandler.startNonterminal(\"LetClause\", e0);\n    shift(174);                     // 'let'\n    lookahead1W(96);                // S^WS | '$' | '(:' | 'score'\n    whitespace();\n    parse_LetBinding();\n    for (;;)\n    {\n      if (l1 != 41)                 // ','\n      {\n        break;\n      }\n      shift(41);                    // ','\n      lookahead1W(96);              // S^WS | '$' | '(:' | 'score'\n      whitespace();\n      parse_LetBinding();\n    }\n    eventHandler.endNonterminal(\"LetClause\", e0);\n  }\n\n  function try_LetClause()\n  {\n    shiftT(174);                    // 'let'\n    lookahead1W(96);                // S^WS | '$' | '(:' | 'score'\n    try_LetBinding();\n    for (;;)\n    {\n      if (l1 != 41)                 // ','\n      {\n        break;\n      }\n      shiftT(41);                   // ','\n      lookahead1W(96);              // S^WS | '$' | '(:' | 'score'\n      try_LetBinding();\n    }\n  }\n\n  function parse_LetBinding()\n  {\n    eventHandler.startNonterminal(\"LetBinding\", e0);\n    switch (l1)\n    {\n    case 31:                        // '$'\n      shift(31);                    // '$'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_VarName();\n      lookahead1W(105);             // S^WS | '(:' | ':=' | 'as'\n      if (l1 == 79)                 // 'as'\n      {\n        whitespace();\n        parse_TypeDeclaration();\n      }\n      break;\n    default:\n      parse_FTScoreVar();\n    }\n    lookahead1W(27);                // S^WS | '(:' | ':='\n    shift(52);                      // ':='\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"LetBinding\", e0);\n  }\n\n  function try_LetBinding()\n  {\n    switch (l1)\n    {\n    case 31:                        // '$'\n      shiftT(31);                   // '$'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_VarName();\n      lookahead1W(105);             // S^WS | '(:' | ':=' | 'as'\n      if (l1 == 79)                 // 'as'\n      {\n        try_TypeDeclaration();\n      }\n      break;\n    default:\n      try_FTScoreVar();\n    }\n    lookahead1W(27);                // S^WS | '(:' | ':='\n    shiftT(52);                     // ':='\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_WindowClause()\n  {\n    eventHandler.startNonterminal(\"WindowClause\", e0);\n    shift(137);                     // 'for'\n    lookahead1W(135);               // S^WS | '(:' | 'sliding' | 'tumbling'\n    switch (l1)\n    {\n    case 251:                       // 'tumbling'\n      whitespace();\n      parse_TumblingWindowClause();\n      break;\n    default:\n      whitespace();\n      parse_SlidingWindowClause();\n    }\n    eventHandler.endNonterminal(\"WindowClause\", e0);\n  }\n\n  function try_WindowClause()\n  {\n    shiftT(137);                    // 'for'\n    lookahead1W(135);               // S^WS | '(:' | 'sliding' | 'tumbling'\n    switch (l1)\n    {\n    case 251:                       // 'tumbling'\n      try_TumblingWindowClause();\n      break;\n    default:\n      try_SlidingWindowClause();\n    }\n  }\n\n  function parse_TumblingWindowClause()\n  {\n    eventHandler.startNonterminal(\"TumblingWindowClause\", e0);\n    shift(251);                     // 'tumbling'\n    lookahead1W(85);                // S^WS | '(:' | 'window'\n    shift(269);                     // 'window'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shift(31);                      // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    lookahead1W(110);               // S^WS | '(:' | 'as' | 'in'\n    if (l1 == 79)                   // 'as'\n    {\n      whitespace();\n      parse_TypeDeclaration();\n    }\n    lookahead1W(53);                // S^WS | '(:' | 'in'\n    shift(154);                     // 'in'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    whitespace();\n    parse_WindowStartCondition();\n    if (l1 == 126                   // 'end'\n     || l1 == 198)                  // 'only'\n    {\n      whitespace();\n      parse_WindowEndCondition();\n    }\n    eventHandler.endNonterminal(\"TumblingWindowClause\", e0);\n  }\n\n  function try_TumblingWindowClause()\n  {\n    shiftT(251);                    // 'tumbling'\n    lookahead1W(85);                // S^WS | '(:' | 'window'\n    shiftT(269);                    // 'window'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shiftT(31);                     // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n    lookahead1W(110);               // S^WS | '(:' | 'as' | 'in'\n    if (l1 == 79)                   // 'as'\n    {\n      try_TypeDeclaration();\n    }\n    lookahead1W(53);                // S^WS | '(:' | 'in'\n    shiftT(154);                    // 'in'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n    try_WindowStartCondition();\n    if (l1 == 126                   // 'end'\n     || l1 == 198)                  // 'only'\n    {\n      try_WindowEndCondition();\n    }\n  }\n\n  function parse_SlidingWindowClause()\n  {\n    eventHandler.startNonterminal(\"SlidingWindowClause\", e0);\n    shift(234);                     // 'sliding'\n    lookahead1W(85);                // S^WS | '(:' | 'window'\n    shift(269);                     // 'window'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shift(31);                      // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    lookahead1W(110);               // S^WS | '(:' | 'as' | 'in'\n    if (l1 == 79)                   // 'as'\n    {\n      whitespace();\n      parse_TypeDeclaration();\n    }\n    lookahead1W(53);                // S^WS | '(:' | 'in'\n    shift(154);                     // 'in'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    whitespace();\n    parse_WindowStartCondition();\n    whitespace();\n    parse_WindowEndCondition();\n    eventHandler.endNonterminal(\"SlidingWindowClause\", e0);\n  }\n\n  function try_SlidingWindowClause()\n  {\n    shiftT(234);                    // 'sliding'\n    lookahead1W(85);                // S^WS | '(:' | 'window'\n    shiftT(269);                    // 'window'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shiftT(31);                     // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n    lookahead1W(110);               // S^WS | '(:' | 'as' | 'in'\n    if (l1 == 79)                   // 'as'\n    {\n      try_TypeDeclaration();\n    }\n    lookahead1W(53);                // S^WS | '(:' | 'in'\n    shiftT(154);                    // 'in'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n    try_WindowStartCondition();\n    try_WindowEndCondition();\n  }\n\n  function parse_WindowStartCondition()\n  {\n    eventHandler.startNonterminal(\"WindowStartCondition\", e0);\n    shift(237);                     // 'start'\n    lookahead1W(163);               // S^WS | '$' | '(:' | 'at' | 'next' | 'previous' | 'when'\n    whitespace();\n    parse_WindowVars();\n    lookahead1W(83);                // S^WS | '(:' | 'when'\n    shift(265);                     // 'when'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"WindowStartCondition\", e0);\n  }\n\n  function try_WindowStartCondition()\n  {\n    shiftT(237);                    // 'start'\n    lookahead1W(163);               // S^WS | '$' | '(:' | 'at' | 'next' | 'previous' | 'when'\n    try_WindowVars();\n    lookahead1W(83);                // S^WS | '(:' | 'when'\n    shiftT(265);                    // 'when'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_WindowEndCondition()\n  {\n    eventHandler.startNonterminal(\"WindowEndCondition\", e0);\n    if (l1 == 198)                  // 'only'\n    {\n      shift(198);                   // 'only'\n    }\n    lookahead1W(50);                // S^WS | '(:' | 'end'\n    shift(126);                     // 'end'\n    lookahead1W(163);               // S^WS | '$' | '(:' | 'at' | 'next' | 'previous' | 'when'\n    whitespace();\n    parse_WindowVars();\n    lookahead1W(83);                // S^WS | '(:' | 'when'\n    shift(265);                     // 'when'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"WindowEndCondition\", e0);\n  }\n\n  function try_WindowEndCondition()\n  {\n    if (l1 == 198)                  // 'only'\n    {\n      shiftT(198);                  // 'only'\n    }\n    lookahead1W(50);                // S^WS | '(:' | 'end'\n    shiftT(126);                    // 'end'\n    lookahead1W(163);               // S^WS | '$' | '(:' | 'at' | 'next' | 'previous' | 'when'\n    try_WindowVars();\n    lookahead1W(83);                // S^WS | '(:' | 'when'\n    shiftT(265);                    // 'when'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_WindowVars()\n  {\n    eventHandler.startNonterminal(\"WindowVars\", e0);\n    if (l1 == 31)                   // '$'\n    {\n      shift(31);                    // '$'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_CurrentItem();\n    }\n    lookahead1W(159);               // S^WS | '(:' | 'at' | 'next' | 'previous' | 'when'\n    if (l1 == 81)                   // 'at'\n    {\n      whitespace();\n      parse_PositionalVar();\n    }\n    lookahead1W(153);               // S^WS | '(:' | 'next' | 'previous' | 'when'\n    if (l1 == 215)                  // 'previous'\n    {\n      shift(215);                   // 'previous'\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      shift(31);                    // '$'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_PreviousItem();\n    }\n    lookahead1W(127);               // S^WS | '(:' | 'next' | 'when'\n    if (l1 == 187)                  // 'next'\n    {\n      shift(187);                   // 'next'\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      shift(31);                    // '$'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_NextItem();\n    }\n    eventHandler.endNonterminal(\"WindowVars\", e0);\n  }\n\n  function try_WindowVars()\n  {\n    if (l1 == 31)                   // '$'\n    {\n      shiftT(31);                   // '$'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_CurrentItem();\n    }\n    lookahead1W(159);               // S^WS | '(:' | 'at' | 'next' | 'previous' | 'when'\n    if (l1 == 81)                   // 'at'\n    {\n      try_PositionalVar();\n    }\n    lookahead1W(153);               // S^WS | '(:' | 'next' | 'previous' | 'when'\n    if (l1 == 215)                  // 'previous'\n    {\n      shiftT(215);                  // 'previous'\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      shiftT(31);                   // '$'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_PreviousItem();\n    }\n    lookahead1W(127);               // S^WS | '(:' | 'next' | 'when'\n    if (l1 == 187)                  // 'next'\n    {\n      shiftT(187);                  // 'next'\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      shiftT(31);                   // '$'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_NextItem();\n    }\n  }\n\n  function parse_CurrentItem()\n  {\n    eventHandler.startNonterminal(\"CurrentItem\", e0);\n    parse_EQName();\n    eventHandler.endNonterminal(\"CurrentItem\", e0);\n  }\n\n  function try_CurrentItem()\n  {\n    try_EQName();\n  }\n\n  function parse_PreviousItem()\n  {\n    eventHandler.startNonterminal(\"PreviousItem\", e0);\n    parse_EQName();\n    eventHandler.endNonterminal(\"PreviousItem\", e0);\n  }\n\n  function try_PreviousItem()\n  {\n    try_EQName();\n  }\n\n  function parse_NextItem()\n  {\n    eventHandler.startNonterminal(\"NextItem\", e0);\n    parse_EQName();\n    eventHandler.endNonterminal(\"NextItem\", e0);\n  }\n\n  function try_NextItem()\n  {\n    try_EQName();\n  }\n\n  function parse_CountClause()\n  {\n    eventHandler.startNonterminal(\"CountClause\", e0);\n    shift(105);                     // 'count'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shift(31);                      // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    eventHandler.endNonterminal(\"CountClause\", e0);\n  }\n\n  function try_CountClause()\n  {\n    shiftT(105);                    // 'count'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shiftT(31);                     // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n  }\n\n  function parse_WhereClause()\n  {\n    eventHandler.startNonterminal(\"WhereClause\", e0);\n    shift(266);                     // 'where'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"WhereClause\", e0);\n  }\n\n  function try_WhereClause()\n  {\n    shiftT(266);                    // 'where'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_GroupByClause()\n  {\n    eventHandler.startNonterminal(\"GroupByClause\", e0);\n    shift(148);                     // 'group'\n    lookahead1W(34);                // S^WS | '(:' | 'by'\n    shift(87);                      // 'by'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_GroupingSpecList();\n    eventHandler.endNonterminal(\"GroupByClause\", e0);\n  }\n\n  function try_GroupByClause()\n  {\n    shiftT(148);                    // 'group'\n    lookahead1W(34);                // S^WS | '(:' | 'by'\n    shiftT(87);                     // 'by'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_GroupingSpecList();\n  }\n\n  function parse_GroupingSpecList()\n  {\n    eventHandler.startNonterminal(\"GroupingSpecList\", e0);\n    parse_GroupingSpec();\n    for (;;)\n    {\n      lookahead1W(176);             // S^WS | '(:' | ',' | 'count' | 'for' | 'group' | 'let' | 'order' | 'return' |\n      if (l1 != 41)                 // ','\n      {\n        break;\n      }\n      shift(41);                    // ','\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_GroupingSpec();\n    }\n    eventHandler.endNonterminal(\"GroupingSpecList\", e0);\n  }\n\n  function try_GroupingSpecList()\n  {\n    try_GroupingSpec();\n    for (;;)\n    {\n      lookahead1W(176);             // S^WS | '(:' | ',' | 'count' | 'for' | 'group' | 'let' | 'order' | 'return' |\n      if (l1 != 41)                 // ','\n      {\n        break;\n      }\n      shiftT(41);                   // ','\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_GroupingSpec();\n    }\n  }\n\n  function parse_GroupingSpec()\n  {\n    eventHandler.startNonterminal(\"GroupingSpec\", e0);\n    switch (l1)\n    {\n    case 31:                        // '$'\n      lookahead2W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 3103                  // '$' EQName^Token\n     || lk == 35871                 // '$' 'after'\n     || lk == 36895                 // '$' 'allowing'\n     || lk == 37407                 // '$' 'ancestor'\n     || lk == 37919                 // '$' 'ancestor-or-self'\n     || lk == 38431                 // '$' 'and'\n     || lk == 39455                 // '$' 'append'\n     || lk == 39967                 // '$' 'array'\n     || lk == 40479                 // '$' 'as'\n     || lk == 40991                 // '$' 'ascending'\n     || lk == 41503                 // '$' 'at'\n     || lk == 42015                 // '$' 'attribute'\n     || lk == 42527                 // '$' 'base-uri'\n     || lk == 43039                 // '$' 'before'\n     || lk == 43551                 // '$' 'boundary-space'\n     || lk == 44063                 // '$' 'break'\n     || lk == 45087                 // '$' 'case'\n     || lk == 45599                 // '$' 'cast'\n     || lk == 46111                 // '$' 'castable'\n     || lk == 46623                 // '$' 'catch'\n     || lk == 47647                 // '$' 'child'\n     || lk == 48159                 // '$' 'collation'\n     || lk == 49183                 // '$' 'comment'\n     || lk == 49695                 // '$' 'constraint'\n     || lk == 50207                 // '$' 'construction'\n     || lk == 51743                 // '$' 'context'\n     || lk == 52255                 // '$' 'continue'\n     || lk == 52767                 // '$' 'copy'\n     || lk == 53279                 // '$' 'copy-namespaces'\n     || lk == 53791                 // '$' 'count'\n     || lk == 54303                 // '$' 'decimal-format'\n     || lk == 55327                 // '$' 'declare'\n     || lk == 55839                 // '$' 'default'\n     || lk == 56351                 // '$' 'delete'\n     || lk == 56863                 // '$' 'descendant'\n     || lk == 57375                 // '$' 'descendant-or-self'\n     || lk == 57887                 // '$' 'descending'\n     || lk == 60447                 // '$' 'div'\n     || lk == 60959                 // '$' 'document'\n     || lk == 61471                 // '$' 'document-node'\n     || lk == 61983                 // '$' 'element'\n     || lk == 62495                 // '$' 'else'\n     || lk == 63007                 // '$' 'empty'\n     || lk == 63519                 // '$' 'empty-sequence'\n     || lk == 64031                 // '$' 'encoding'\n     || lk == 64543                 // '$' 'end'\n     || lk == 65567                 // '$' 'eq'\n     || lk == 66079                 // '$' 'every'\n     || lk == 67103                 // '$' 'except'\n     || lk == 67615                 // '$' 'exit'\n     || lk == 68127                 // '$' 'external'\n     || lk == 68639                 // '$' 'first'\n     || lk == 69151                 // '$' 'following'\n     || lk == 69663                 // '$' 'following-sibling'\n     || lk == 70175                 // '$' 'for'\n     || lk == 72223                 // '$' 'ft-option'\n     || lk == 74271                 // '$' 'function'\n     || lk == 74783                 // '$' 'ge'\n     || lk == 75807                 // '$' 'group'\n     || lk == 76831                 // '$' 'gt'\n     || lk == 77343                 // '$' 'idiv'\n     || lk == 77855                 // '$' 'if'\n     || lk == 78367                 // '$' 'import'\n     || lk == 78879                 // '$' 'in'\n     || lk == 79391                 // '$' 'index'\n     || lk == 81439                 // '$' 'insert'\n     || lk == 81951                 // '$' 'instance'\n     || lk == 82463                 // '$' 'integrity'\n     || lk == 82975                 // '$' 'intersect'\n     || lk == 83487                 // '$' 'into'\n     || lk == 83999                 // '$' 'is'\n     || lk == 84511                 // '$' 'item'\n     || lk == 85023                 // '$' 'json'\n     || lk == 85535                 // '$' 'json-item'\n     || lk == 87071                 // '$' 'last'\n     || lk == 87583                 // '$' 'lax'\n     || lk == 88095                 // '$' 'le'\n     || lk == 89119                 // '$' 'let'\n     || lk == 90143                 // '$' 'loop'\n     || lk == 91167                 // '$' 'lt'\n     || lk == 92191                 // '$' 'mod'\n     || lk == 92703                 // '$' 'modify'\n     || lk == 93215                 // '$' 'module'\n     || lk == 94239                 // '$' 'namespace'\n     || lk == 94751                 // '$' 'namespace-node'\n     || lk == 95263                 // '$' 'ne'\n     || lk == 97823                 // '$' 'node'\n     || lk == 98335                 // '$' 'nodes'\n     || lk == 99359                 // '$' 'object'\n     || lk == 101407                // '$' 'only'\n     || lk == 101919                // '$' 'option'\n     || lk == 102431                // '$' 'or'\n     || lk == 102943                // '$' 'order'\n     || lk == 103455                // '$' 'ordered'\n     || lk == 103967                // '$' 'ordering'\n     || lk == 105503                // '$' 'parent'\n     || lk == 108575                // '$' 'preceding'\n     || lk == 109087                // '$' 'preceding-sibling'\n     || lk == 110623                // '$' 'processing-instruction'\n     || lk == 111647                // '$' 'rename'\n     || lk == 112159                // '$' 'replace'\n     || lk == 112671                // '$' 'return'\n     || lk == 113183                // '$' 'returning'\n     || lk == 113695                // '$' 'revalidation'\n     || lk == 114719                // '$' 'satisfies'\n     || lk == 115231                // '$' 'schema'\n     || lk == 115743                // '$' 'schema-attribute'\n     || lk == 116255                // '$' 'schema-element'\n     || lk == 116767                // '$' 'score'\n     || lk == 117279                // '$' 'self'\n     || lk == 119839                // '$' 'sliding'\n     || lk == 120351                // '$' 'some'\n     || lk == 120863                // '$' 'stable'\n     || lk == 121375                // '$' 'start'\n     || lk == 122911                // '$' 'strict'\n     || lk == 123935                // '$' 'structured-item'\n     || lk == 124447                // '$' 'switch'\n     || lk == 124959                // '$' 'text'\n     || lk == 127007                // '$' 'to'\n     || lk == 127519                // '$' 'treat'\n     || lk == 128031                // '$' 'try'\n     || lk == 128543                // '$' 'tumbling'\n     || lk == 129055                // '$' 'type'\n     || lk == 129567                // '$' 'typeswitch'\n     || lk == 130079                // '$' 'union'\n     || lk == 131103                // '$' 'unordered'\n     || lk == 131615                // '$' 'updating'\n     || lk == 133151                // '$' 'validate'\n     || lk == 133663                // '$' 'value'\n     || lk == 134175                // '$' 'variable'\n     || lk == 134687                // '$' 'version'\n     || lk == 136223                // '$' 'where'\n     || lk == 136735                // '$' 'while'\n     || lk == 138271                // '$' 'with'\n     || lk == 140319)               // '$' 'xquery'\n    {\n      lk = memoized(2, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_GroupingVariable();\n          lookahead1W(183);         // S^WS | '(:' | ',' | ':=' | 'as' | 'collation' | 'count' | 'for' | 'group' |\n          if (l1 == 52              // ':='\n           || l1 == 79)             // 'as'\n          {\n            if (l1 == 79)           // 'as'\n            {\n              try_TypeDeclaration();\n            }\n            lookahead1W(27);        // S^WS | '(:' | ':='\n            shiftT(52);             // ':='\n            lookahead1W(267);       // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n            try_ExprSingle();\n          }\n          if (l1 == 94)             // 'collation'\n          {\n            shiftT(94);             // 'collation'\n            lookahead1W(15);        // URILiteral | S^WS | '(:'\n            shiftT(7);              // URILiteral\n          }\n          lk = -1;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n        }\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(2, e0, lk);\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n      parse_GroupingVariable();\n      lookahead1W(183);             // S^WS | '(:' | ',' | ':=' | 'as' | 'collation' | 'count' | 'for' | 'group' |\n      if (l1 == 52                  // ':='\n       || l1 == 79)                 // 'as'\n      {\n        if (l1 == 79)               // 'as'\n        {\n          whitespace();\n          parse_TypeDeclaration();\n        }\n        lookahead1W(27);            // S^WS | '(:' | ':='\n        shift(52);                  // ':='\n        lookahead1W(267);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        whitespace();\n        parse_ExprSingle();\n      }\n      if (l1 == 94)                 // 'collation'\n      {\n        shift(94);                  // 'collation'\n        lookahead1W(15);            // URILiteral | S^WS | '(:'\n        shift(7);                   // URILiteral\n      }\n      break;\n    default:\n      parse_ExprSingle();\n    }\n    eventHandler.endNonterminal(\"GroupingSpec\", e0);\n  }\n\n  function try_GroupingSpec()\n  {\n    switch (l1)\n    {\n    case 31:                        // '$'\n      lookahead2W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 3103                  // '$' EQName^Token\n     || lk == 35871                 // '$' 'after'\n     || lk == 36895                 // '$' 'allowing'\n     || lk == 37407                 // '$' 'ancestor'\n     || lk == 37919                 // '$' 'ancestor-or-self'\n     || lk == 38431                 // '$' 'and'\n     || lk == 39455                 // '$' 'append'\n     || lk == 39967                 // '$' 'array'\n     || lk == 40479                 // '$' 'as'\n     || lk == 40991                 // '$' 'ascending'\n     || lk == 41503                 // '$' 'at'\n     || lk == 42015                 // '$' 'attribute'\n     || lk == 42527                 // '$' 'base-uri'\n     || lk == 43039                 // '$' 'before'\n     || lk == 43551                 // '$' 'boundary-space'\n     || lk == 44063                 // '$' 'break'\n     || lk == 45087                 // '$' 'case'\n     || lk == 45599                 // '$' 'cast'\n     || lk == 46111                 // '$' 'castable'\n     || lk == 46623                 // '$' 'catch'\n     || lk == 47647                 // '$' 'child'\n     || lk == 48159                 // '$' 'collation'\n     || lk == 49183                 // '$' 'comment'\n     || lk == 49695                 // '$' 'constraint'\n     || lk == 50207                 // '$' 'construction'\n     || lk == 51743                 // '$' 'context'\n     || lk == 52255                 // '$' 'continue'\n     || lk == 52767                 // '$' 'copy'\n     || lk == 53279                 // '$' 'copy-namespaces'\n     || lk == 53791                 // '$' 'count'\n     || lk == 54303                 // '$' 'decimal-format'\n     || lk == 55327                 // '$' 'declare'\n     || lk == 55839                 // '$' 'default'\n     || lk == 56351                 // '$' 'delete'\n     || lk == 56863                 // '$' 'descendant'\n     || lk == 57375                 // '$' 'descendant-or-self'\n     || lk == 57887                 // '$' 'descending'\n     || lk == 60447                 // '$' 'div'\n     || lk == 60959                 // '$' 'document'\n     || lk == 61471                 // '$' 'document-node'\n     || lk == 61983                 // '$' 'element'\n     || lk == 62495                 // '$' 'else'\n     || lk == 63007                 // '$' 'empty'\n     || lk == 63519                 // '$' 'empty-sequence'\n     || lk == 64031                 // '$' 'encoding'\n     || lk == 64543                 // '$' 'end'\n     || lk == 65567                 // '$' 'eq'\n     || lk == 66079                 // '$' 'every'\n     || lk == 67103                 // '$' 'except'\n     || lk == 67615                 // '$' 'exit'\n     || lk == 68127                 // '$' 'external'\n     || lk == 68639                 // '$' 'first'\n     || lk == 69151                 // '$' 'following'\n     || lk == 69663                 // '$' 'following-sibling'\n     || lk == 70175                 // '$' 'for'\n     || lk == 72223                 // '$' 'ft-option'\n     || lk == 74271                 // '$' 'function'\n     || lk == 74783                 // '$' 'ge'\n     || lk == 75807                 // '$' 'group'\n     || lk == 76831                 // '$' 'gt'\n     || lk == 77343                 // '$' 'idiv'\n     || lk == 77855                 // '$' 'if'\n     || lk == 78367                 // '$' 'import'\n     || lk == 78879                 // '$' 'in'\n     || lk == 79391                 // '$' 'index'\n     || lk == 81439                 // '$' 'insert'\n     || lk == 81951                 // '$' 'instance'\n     || lk == 82463                 // '$' 'integrity'\n     || lk == 82975                 // '$' 'intersect'\n     || lk == 83487                 // '$' 'into'\n     || lk == 83999                 // '$' 'is'\n     || lk == 84511                 // '$' 'item'\n     || lk == 85023                 // '$' 'json'\n     || lk == 85535                 // '$' 'json-item'\n     || lk == 87071                 // '$' 'last'\n     || lk == 87583                 // '$' 'lax'\n     || lk == 88095                 // '$' 'le'\n     || lk == 89119                 // '$' 'let'\n     || lk == 90143                 // '$' 'loop'\n     || lk == 91167                 // '$' 'lt'\n     || lk == 92191                 // '$' 'mod'\n     || lk == 92703                 // '$' 'modify'\n     || lk == 93215                 // '$' 'module'\n     || lk == 94239                 // '$' 'namespace'\n     || lk == 94751                 // '$' 'namespace-node'\n     || lk == 95263                 // '$' 'ne'\n     || lk == 97823                 // '$' 'node'\n     || lk == 98335                 // '$' 'nodes'\n     || lk == 99359                 // '$' 'object'\n     || lk == 101407                // '$' 'only'\n     || lk == 101919                // '$' 'option'\n     || lk == 102431                // '$' 'or'\n     || lk == 102943                // '$' 'order'\n     || lk == 103455                // '$' 'ordered'\n     || lk == 103967                // '$' 'ordering'\n     || lk == 105503                // '$' 'parent'\n     || lk == 108575                // '$' 'preceding'\n     || lk == 109087                // '$' 'preceding-sibling'\n     || lk == 110623                // '$' 'processing-instruction'\n     || lk == 111647                // '$' 'rename'\n     || lk == 112159                // '$' 'replace'\n     || lk == 112671                // '$' 'return'\n     || lk == 113183                // '$' 'returning'\n     || lk == 113695                // '$' 'revalidation'\n     || lk == 114719                // '$' 'satisfies'\n     || lk == 115231                // '$' 'schema'\n     || lk == 115743                // '$' 'schema-attribute'\n     || lk == 116255                // '$' 'schema-element'\n     || lk == 116767                // '$' 'score'\n     || lk == 117279                // '$' 'self'\n     || lk == 119839                // '$' 'sliding'\n     || lk == 120351                // '$' 'some'\n     || lk == 120863                // '$' 'stable'\n     || lk == 121375                // '$' 'start'\n     || lk == 122911                // '$' 'strict'\n     || lk == 123935                // '$' 'structured-item'\n     || lk == 124447                // '$' 'switch'\n     || lk == 124959                // '$' 'text'\n     || lk == 127007                // '$' 'to'\n     || lk == 127519                // '$' 'treat'\n     || lk == 128031                // '$' 'try'\n     || lk == 128543                // '$' 'tumbling'\n     || lk == 129055                // '$' 'type'\n     || lk == 129567                // '$' 'typeswitch'\n     || lk == 130079                // '$' 'union'\n     || lk == 131103                // '$' 'unordered'\n     || lk == 131615                // '$' 'updating'\n     || lk == 133151                // '$' 'validate'\n     || lk == 133663                // '$' 'value'\n     || lk == 134175                // '$' 'variable'\n     || lk == 134687                // '$' 'version'\n     || lk == 136223                // '$' 'where'\n     || lk == 136735                // '$' 'while'\n     || lk == 138271                // '$' 'with'\n     || lk == 140319)               // '$' 'xquery'\n    {\n      lk = memoized(2, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_GroupingVariable();\n          lookahead1W(183);         // S^WS | '(:' | ',' | ':=' | 'as' | 'collation' | 'count' | 'for' | 'group' |\n          if (l1 == 52              // ':='\n           || l1 == 79)             // 'as'\n          {\n            if (l1 == 79)           // 'as'\n            {\n              try_TypeDeclaration();\n            }\n            lookahead1W(27);        // S^WS | '(:' | ':='\n            shiftT(52);             // ':='\n            lookahead1W(267);       // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n            try_ExprSingle();\n          }\n          if (l1 == 94)             // 'collation'\n          {\n            shiftT(94);             // 'collation'\n            lookahead1W(15);        // URILiteral | S^WS | '(:'\n            shiftT(7);              // URILiteral\n          }\n          memoize(2, e0A, -1);\n          lk = -3;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(2, e0A, -2);\n        }\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n      try_GroupingVariable();\n      lookahead1W(183);             // S^WS | '(:' | ',' | ':=' | 'as' | 'collation' | 'count' | 'for' | 'group' |\n      if (l1 == 52                  // ':='\n       || l1 == 79)                 // 'as'\n      {\n        if (l1 == 79)               // 'as'\n        {\n          try_TypeDeclaration();\n        }\n        lookahead1W(27);            // S^WS | '(:' | ':='\n        shiftT(52);                 // ':='\n        lookahead1W(267);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        try_ExprSingle();\n      }\n      if (l1 == 94)                 // 'collation'\n      {\n        shiftT(94);                 // 'collation'\n        lookahead1W(15);            // URILiteral | S^WS | '(:'\n        shiftT(7);                  // URILiteral\n      }\n      break;\n    case -3:\n      break;\n    default:\n      try_ExprSingle();\n    }\n  }\n\n  function parse_GroupingVariable()\n  {\n    eventHandler.startNonterminal(\"GroupingVariable\", e0);\n    shift(31);                      // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    eventHandler.endNonterminal(\"GroupingVariable\", e0);\n  }\n\n  function try_GroupingVariable()\n  {\n    shiftT(31);                     // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n  }\n\n  function parse_OrderByClause()\n  {\n    eventHandler.startNonterminal(\"OrderByClause\", e0);\n    switch (l1)\n    {\n    case 201:                       // 'order'\n      shift(201);                   // 'order'\n      lookahead1W(34);              // S^WS | '(:' | 'by'\n      shift(87);                    // 'by'\n      break;\n    default:\n      shift(236);                   // 'stable'\n      lookahead1W(67);              // S^WS | '(:' | 'order'\n      shift(201);                   // 'order'\n      lookahead1W(34);              // S^WS | '(:' | 'by'\n      shift(87);                    // 'by'\n    }\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_OrderSpecList();\n    eventHandler.endNonterminal(\"OrderByClause\", e0);\n  }\n\n  function try_OrderByClause()\n  {\n    switch (l1)\n    {\n    case 201:                       // 'order'\n      shiftT(201);                  // 'order'\n      lookahead1W(34);              // S^WS | '(:' | 'by'\n      shiftT(87);                   // 'by'\n      break;\n    default:\n      shiftT(236);                  // 'stable'\n      lookahead1W(67);              // S^WS | '(:' | 'order'\n      shiftT(201);                  // 'order'\n      lookahead1W(34);              // S^WS | '(:' | 'by'\n      shiftT(87);                   // 'by'\n    }\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_OrderSpecList();\n  }\n\n  function parse_OrderSpecList()\n  {\n    eventHandler.startNonterminal(\"OrderSpecList\", e0);\n    parse_OrderSpec();\n    for (;;)\n    {\n      lookahead1W(176);             // S^WS | '(:' | ',' | 'count' | 'for' | 'group' | 'let' | 'order' | 'return' |\n      if (l1 != 41)                 // ','\n      {\n        break;\n      }\n      shift(41);                    // ','\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_OrderSpec();\n    }\n    eventHandler.endNonterminal(\"OrderSpecList\", e0);\n  }\n\n  function try_OrderSpecList()\n  {\n    try_OrderSpec();\n    for (;;)\n    {\n      lookahead1W(176);             // S^WS | '(:' | ',' | 'count' | 'for' | 'group' | 'let' | 'order' | 'return' |\n      if (l1 != 41)                 // ','\n      {\n        break;\n      }\n      shiftT(41);                   // ','\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_OrderSpec();\n    }\n  }\n\n  function parse_OrderSpec()\n  {\n    eventHandler.startNonterminal(\"OrderSpec\", e0);\n    parse_ExprSingle();\n    whitespace();\n    parse_OrderModifier();\n    eventHandler.endNonterminal(\"OrderSpec\", e0);\n  }\n\n  function try_OrderSpec()\n  {\n    try_ExprSingle();\n    try_OrderModifier();\n  }\n\n  function parse_OrderModifier()\n  {\n    eventHandler.startNonterminal(\"OrderModifier\", e0);\n    if (l1 == 80                    // 'ascending'\n     || l1 == 113)                  // 'descending'\n    {\n      switch (l1)\n      {\n      case 80:                      // 'ascending'\n        shift(80);                  // 'ascending'\n        break;\n      default:\n        shift(113);                 // 'descending'\n      }\n    }\n    lookahead1W(180);               // S^WS | '(:' | ',' | 'collation' | 'count' | 'empty' | 'for' | 'group' | 'let' |\n    if (l1 == 123)                  // 'empty'\n    {\n      shift(123);                   // 'empty'\n      lookahead1W(121);             // S^WS | '(:' | 'greatest' | 'least'\n      switch (l1)\n      {\n      case 147:                     // 'greatest'\n        shift(147);                 // 'greatest'\n        break;\n      default:\n        shift(173);                 // 'least'\n      }\n    }\n    lookahead1W(177);               // S^WS | '(:' | ',' | 'collation' | 'count' | 'for' | 'group' | 'let' | 'order' |\n    if (l1 == 94)                   // 'collation'\n    {\n      shift(94);                    // 'collation'\n      lookahead1W(15);              // URILiteral | S^WS | '(:'\n      shift(7);                     // URILiteral\n    }\n    eventHandler.endNonterminal(\"OrderModifier\", e0);\n  }\n\n  function try_OrderModifier()\n  {\n    if (l1 == 80                    // 'ascending'\n     || l1 == 113)                  // 'descending'\n    {\n      switch (l1)\n      {\n      case 80:                      // 'ascending'\n        shiftT(80);                 // 'ascending'\n        break;\n      default:\n        shiftT(113);                // 'descending'\n      }\n    }\n    lookahead1W(180);               // S^WS | '(:' | ',' | 'collation' | 'count' | 'empty' | 'for' | 'group' | 'let' |\n    if (l1 == 123)                  // 'empty'\n    {\n      shiftT(123);                  // 'empty'\n      lookahead1W(121);             // S^WS | '(:' | 'greatest' | 'least'\n      switch (l1)\n      {\n      case 147:                     // 'greatest'\n        shiftT(147);                // 'greatest'\n        break;\n      default:\n        shiftT(173);                // 'least'\n      }\n    }\n    lookahead1W(177);               // S^WS | '(:' | ',' | 'collation' | 'count' | 'for' | 'group' | 'let' | 'order' |\n    if (l1 == 94)                   // 'collation'\n    {\n      shiftT(94);                   // 'collation'\n      lookahead1W(15);              // URILiteral | S^WS | '(:'\n      shiftT(7);                    // URILiteral\n    }\n  }\n\n  function parse_ReturnClause()\n  {\n    eventHandler.startNonterminal(\"ReturnClause\", e0);\n    shift(220);                     // 'return'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"ReturnClause\", e0);\n  }\n\n  function try_ReturnClause()\n  {\n    shiftT(220);                    // 'return'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_QuantifiedExpr()\n  {\n    eventHandler.startNonterminal(\"QuantifiedExpr\", e0);\n    switch (l1)\n    {\n    case 235:                       // 'some'\n      shift(235);                   // 'some'\n      break;\n    default:\n      shift(129);                   // 'every'\n    }\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    whitespace();\n    parse_QuantifiedVarDecl();\n    for (;;)\n    {\n      if (l1 != 41)                 // ','\n      {\n        break;\n      }\n      shift(41);                    // ','\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      whitespace();\n      parse_QuantifiedVarDecl();\n    }\n    shift(224);                     // 'satisfies'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"QuantifiedExpr\", e0);\n  }\n\n  function try_QuantifiedExpr()\n  {\n    switch (l1)\n    {\n    case 235:                       // 'some'\n      shiftT(235);                  // 'some'\n      break;\n    default:\n      shiftT(129);                  // 'every'\n    }\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    try_QuantifiedVarDecl();\n    for (;;)\n    {\n      if (l1 != 41)                 // ','\n      {\n        break;\n      }\n      shiftT(41);                   // ','\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      try_QuantifiedVarDecl();\n    }\n    shiftT(224);                    // 'satisfies'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_QuantifiedVarDecl()\n  {\n    eventHandler.startNonterminal(\"QuantifiedVarDecl\", e0);\n    shift(31);                      // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    lookahead1W(110);               // S^WS | '(:' | 'as' | 'in'\n    if (l1 == 79)                   // 'as'\n    {\n      whitespace();\n      parse_TypeDeclaration();\n    }\n    lookahead1W(53);                // S^WS | '(:' | 'in'\n    shift(154);                     // 'in'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"QuantifiedVarDecl\", e0);\n  }\n\n  function try_QuantifiedVarDecl()\n  {\n    shiftT(31);                     // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n    lookahead1W(110);               // S^WS | '(:' | 'as' | 'in'\n    if (l1 == 79)                   // 'as'\n    {\n      try_TypeDeclaration();\n    }\n    lookahead1W(53);                // S^WS | '(:' | 'in'\n    shiftT(154);                    // 'in'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_SwitchExpr()\n  {\n    eventHandler.startNonterminal(\"SwitchExpr\", e0);\n    shift(243);                     // 'switch'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Expr();\n    shift(37);                      // ')'\n    for (;;)\n    {\n      lookahead1W(35);              // S^WS | '(:' | 'case'\n      whitespace();\n      parse_SwitchCaseClause();\n      if (l1 != 88)                 // 'case'\n      {\n        break;\n      }\n    }\n    shift(109);                     // 'default'\n    lookahead1W(70);                // S^WS | '(:' | 'return'\n    shift(220);                     // 'return'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"SwitchExpr\", e0);\n  }\n\n  function try_SwitchExpr()\n  {\n    shiftT(243);                    // 'switch'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Expr();\n    shiftT(37);                     // ')'\n    for (;;)\n    {\n      lookahead1W(35);              // S^WS | '(:' | 'case'\n      try_SwitchCaseClause();\n      if (l1 != 88)                 // 'case'\n      {\n        break;\n      }\n    }\n    shiftT(109);                    // 'default'\n    lookahead1W(70);                // S^WS | '(:' | 'return'\n    shiftT(220);                    // 'return'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_SwitchCaseClause()\n  {\n    eventHandler.startNonterminal(\"SwitchCaseClause\", e0);\n    for (;;)\n    {\n      shift(88);                    // 'case'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_SwitchCaseOperand();\n      if (l1 != 88)                 // 'case'\n      {\n        break;\n      }\n    }\n    shift(220);                     // 'return'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"SwitchCaseClause\", e0);\n  }\n\n  function try_SwitchCaseClause()\n  {\n    for (;;)\n    {\n      shiftT(88);                   // 'case'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_SwitchCaseOperand();\n      if (l1 != 88)                 // 'case'\n      {\n        break;\n      }\n    }\n    shiftT(220);                    // 'return'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_SwitchCaseOperand()\n  {\n    eventHandler.startNonterminal(\"SwitchCaseOperand\", e0);\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"SwitchCaseOperand\", e0);\n  }\n\n  function try_SwitchCaseOperand()\n  {\n    try_ExprSingle();\n  }\n\n  function parse_TypeswitchExpr()\n  {\n    eventHandler.startNonterminal(\"TypeswitchExpr\", e0);\n    shift(253);                     // 'typeswitch'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Expr();\n    shift(37);                      // ')'\n    for (;;)\n    {\n      lookahead1W(35);              // S^WS | '(:' | 'case'\n      whitespace();\n      parse_CaseClause();\n      if (l1 != 88)                 // 'case'\n      {\n        break;\n      }\n    }\n    shift(109);                     // 'default'\n    lookahead1W(95);                // S^WS | '$' | '(:' | 'return'\n    if (l1 == 31)                   // '$'\n    {\n      shift(31);                    // '$'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_VarName();\n    }\n    lookahead1W(70);                // S^WS | '(:' | 'return'\n    shift(220);                     // 'return'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"TypeswitchExpr\", e0);\n  }\n\n  function try_TypeswitchExpr()\n  {\n    shiftT(253);                    // 'typeswitch'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Expr();\n    shiftT(37);                     // ')'\n    for (;;)\n    {\n      lookahead1W(35);              // S^WS | '(:' | 'case'\n      try_CaseClause();\n      if (l1 != 88)                 // 'case'\n      {\n        break;\n      }\n    }\n    shiftT(109);                    // 'default'\n    lookahead1W(95);                // S^WS | '$' | '(:' | 'return'\n    if (l1 == 31)                   // '$'\n    {\n      shiftT(31);                   // '$'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_VarName();\n    }\n    lookahead1W(70);                // S^WS | '(:' | 'return'\n    shiftT(220);                    // 'return'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_CaseClause()\n  {\n    eventHandler.startNonterminal(\"CaseClause\", e0);\n    shift(88);                      // 'case'\n    lookahead1W(262);               // EQName^Token | S^WS | '$' | '%' | '(' | '(:' | 'after' | 'allowing' |\n    if (l1 == 31)                   // '$'\n    {\n      shift(31);                    // '$'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_VarName();\n      lookahead1W(30);              // S^WS | '(:' | 'as'\n      shift(79);                    // 'as'\n    }\n    lookahead1W(260);               // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_SequenceTypeUnion();\n    shift(220);                     // 'return'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"CaseClause\", e0);\n  }\n\n  function try_CaseClause()\n  {\n    shiftT(88);                     // 'case'\n    lookahead1W(262);               // EQName^Token | S^WS | '$' | '%' | '(' | '(:' | 'after' | 'allowing' |\n    if (l1 == 31)                   // '$'\n    {\n      shiftT(31);                   // '$'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_VarName();\n      lookahead1W(30);              // S^WS | '(:' | 'as'\n      shiftT(79);                   // 'as'\n    }\n    lookahead1W(260);               // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_SequenceTypeUnion();\n    shiftT(220);                    // 'return'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_SequenceTypeUnion()\n  {\n    eventHandler.startNonterminal(\"SequenceTypeUnion\", e0);\n    parse_SequenceType();\n    for (;;)\n    {\n      lookahead1W(134);             // S^WS | '(:' | 'return' | '|'\n      if (l1 != 279)                // '|'\n      {\n        break;\n      }\n      shift(279);                   // '|'\n      lookahead1W(260);             // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_SequenceType();\n    }\n    eventHandler.endNonterminal(\"SequenceTypeUnion\", e0);\n  }\n\n  function try_SequenceTypeUnion()\n  {\n    try_SequenceType();\n    for (;;)\n    {\n      lookahead1W(134);             // S^WS | '(:' | 'return' | '|'\n      if (l1 != 279)                // '|'\n      {\n        break;\n      }\n      shiftT(279);                  // '|'\n      lookahead1W(260);             // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_SequenceType();\n    }\n  }\n\n  function parse_IfExpr()\n  {\n    eventHandler.startNonterminal(\"IfExpr\", e0);\n    shift(152);                     // 'if'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Expr();\n    shift(37);                      // ')'\n    lookahead1W(77);                // S^WS | '(:' | 'then'\n    shift(245);                     // 'then'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    shift(122);                     // 'else'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"IfExpr\", e0);\n  }\n\n  function try_IfExpr()\n  {\n    shiftT(152);                    // 'if'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Expr();\n    shiftT(37);                     // ')'\n    lookahead1W(77);                // S^WS | '(:' | 'then'\n    shiftT(245);                    // 'then'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n    shiftT(122);                    // 'else'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_TryCatchExpr()\n  {\n    eventHandler.startNonterminal(\"TryCatchExpr\", e0);\n    parse_TryClause();\n    for (;;)\n    {\n      lookahead1W(36);              // S^WS | '(:' | 'catch'\n      whitespace();\n      parse_CatchClause();\n      lookahead1W(184);             // S^WS | EOF | '(:' | ')' | ',' | ':' | ';' | ']' | 'after' | 'as' | 'ascending' |\n      if (l1 != 91)                 // 'catch'\n      {\n        break;\n      }\n    }\n    eventHandler.endNonterminal(\"TryCatchExpr\", e0);\n  }\n\n  function try_TryCatchExpr()\n  {\n    try_TryClause();\n    for (;;)\n    {\n      lookahead1W(36);              // S^WS | '(:' | 'catch'\n      try_CatchClause();\n      lookahead1W(184);             // S^WS | EOF | '(:' | ')' | ',' | ':' | ';' | ']' | 'after' | 'as' | 'ascending' |\n      if (l1 != 91)                 // 'catch'\n      {\n        break;\n      }\n    }\n  }\n\n  function parse_TryClause()\n  {\n    eventHandler.startNonterminal(\"TryClause\", e0);\n    shift(250);                     // 'try'\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    shift(276);                     // '{'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_TryTargetExpr();\n    shift(282);                     // '}'\n    eventHandler.endNonterminal(\"TryClause\", e0);\n  }\n\n  function try_TryClause()\n  {\n    shiftT(250);                    // 'try'\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    shiftT(276);                    // '{'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_TryTargetExpr();\n    shiftT(282);                    // '}'\n  }\n\n  function parse_TryTargetExpr()\n  {\n    eventHandler.startNonterminal(\"TryTargetExpr\", e0);\n    parse_Expr();\n    eventHandler.endNonterminal(\"TryTargetExpr\", e0);\n  }\n\n  function try_TryTargetExpr()\n  {\n    try_Expr();\n  }\n\n  function parse_CatchClause()\n  {\n    eventHandler.startNonterminal(\"CatchClause\", e0);\n    shift(91);                      // 'catch'\n    lookahead1W(257);               // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_CatchErrorList();\n    shift(276);                     // '{'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Expr();\n    shift(282);                     // '}'\n    eventHandler.endNonterminal(\"CatchClause\", e0);\n  }\n\n  function try_CatchClause()\n  {\n    shiftT(91);                     // 'catch'\n    lookahead1W(257);               // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_CatchErrorList();\n    shiftT(276);                    // '{'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Expr();\n    shiftT(282);                    // '}'\n  }\n\n  function parse_CatchErrorList()\n  {\n    eventHandler.startNonterminal(\"CatchErrorList\", e0);\n    parse_NameTest();\n    for (;;)\n    {\n      lookahead1W(136);             // S^WS | '(:' | '{' | '|'\n      if (l1 != 279)                // '|'\n      {\n        break;\n      }\n      shift(279);                   // '|'\n      lookahead1W(257);             // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_NameTest();\n    }\n    eventHandler.endNonterminal(\"CatchErrorList\", e0);\n  }\n\n  function try_CatchErrorList()\n  {\n    try_NameTest();\n    for (;;)\n    {\n      lookahead1W(136);             // S^WS | '(:' | '{' | '|'\n      if (l1 != 279)                // '|'\n      {\n        break;\n      }\n      shiftT(279);                  // '|'\n      lookahead1W(257);             // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_NameTest();\n    }\n  }\n\n  function parse_OrExpr()\n  {\n    eventHandler.startNonterminal(\"OrExpr\", e0);\n    parse_AndExpr();\n    for (;;)\n    {\n      if (l1 != 200)                // 'or'\n      {\n        break;\n      }\n      shift(200);                   // 'or'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_AndExpr();\n    }\n    eventHandler.endNonterminal(\"OrExpr\", e0);\n  }\n\n  function try_OrExpr()\n  {\n    try_AndExpr();\n    for (;;)\n    {\n      if (l1 != 200)                // 'or'\n      {\n        break;\n      }\n      shiftT(200);                  // 'or'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_AndExpr();\n    }\n  }\n\n  function parse_AndExpr()\n  {\n    eventHandler.startNonterminal(\"AndExpr\", e0);\n    parse_ComparisonExpr();\n    for (;;)\n    {\n      if (l1 != 75)                 // 'and'\n      {\n        break;\n      }\n      shift(75);                    // 'and'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_ComparisonExpr();\n    }\n    eventHandler.endNonterminal(\"AndExpr\", e0);\n  }\n\n  function try_AndExpr()\n  {\n    try_ComparisonExpr();\n    for (;;)\n    {\n      if (l1 != 75)                 // 'and'\n      {\n        break;\n      }\n      shiftT(75);                   // 'and'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_ComparisonExpr();\n    }\n  }\n\n  function parse_ComparisonExpr()\n  {\n    eventHandler.startNonterminal(\"ComparisonExpr\", e0);\n    parse_FTContainsExpr();\n    if (l1 == 27                    // '!='\n     || l1 == 54                    // '<'\n     || l1 == 57                    // '<<'\n     || l1 == 58                    // '<='\n     || l1 == 60                    // '='\n     || l1 == 61                    // '>'\n     || l1 == 62                    // '>='\n     || l1 == 63                    // '>>'\n     || l1 == 128                   // 'eq'\n     || l1 == 146                   // 'ge'\n     || l1 == 150                   // 'gt'\n     || l1 == 164                   // 'is'\n     || l1 == 172                   // 'le'\n     || l1 == 178                   // 'lt'\n     || l1 == 186)                  // 'ne'\n    {\n      switch (l1)\n      {\n      case 128:                     // 'eq'\n      case 146:                     // 'ge'\n      case 150:                     // 'gt'\n      case 172:                     // 'le'\n      case 178:                     // 'lt'\n      case 186:                     // 'ne'\n        whitespace();\n        parse_ValueComp();\n        break;\n      case 57:                      // '<<'\n      case 63:                      // '>>'\n      case 164:                     // 'is'\n        whitespace();\n        parse_NodeComp();\n        break;\n      default:\n        whitespace();\n        parse_GeneralComp();\n      }\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_FTContainsExpr();\n    }\n    eventHandler.endNonterminal(\"ComparisonExpr\", e0);\n  }\n\n  function try_ComparisonExpr()\n  {\n    try_FTContainsExpr();\n    if (l1 == 27                    // '!='\n     || l1 == 54                    // '<'\n     || l1 == 57                    // '<<'\n     || l1 == 58                    // '<='\n     || l1 == 60                    // '='\n     || l1 == 61                    // '>'\n     || l1 == 62                    // '>='\n     || l1 == 63                    // '>>'\n     || l1 == 128                   // 'eq'\n     || l1 == 146                   // 'ge'\n     || l1 == 150                   // 'gt'\n     || l1 == 164                   // 'is'\n     || l1 == 172                   // 'le'\n     || l1 == 178                   // 'lt'\n     || l1 == 186)                  // 'ne'\n    {\n      switch (l1)\n      {\n      case 128:                     // 'eq'\n      case 146:                     // 'ge'\n      case 150:                     // 'gt'\n      case 172:                     // 'le'\n      case 178:                     // 'lt'\n      case 186:                     // 'ne'\n        try_ValueComp();\n        break;\n      case 57:                      // '<<'\n      case 63:                      // '>>'\n      case 164:                     // 'is'\n        try_NodeComp();\n        break;\n      default:\n        try_GeneralComp();\n      }\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_FTContainsExpr();\n    }\n  }\n\n  function parse_FTContainsExpr()\n  {\n    eventHandler.startNonterminal(\"FTContainsExpr\", e0);\n    parse_StringConcatExpr();\n    if (l1 == 99)                   // 'contains'\n    {\n      shift(99);                    // 'contains'\n      lookahead1W(76);              // S^WS | '(:' | 'text'\n      shift(244);                   // 'text'\n      lookahead1W(162);             // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{'\n      whitespace();\n      parse_FTSelection();\n      if (l1 == 271)                // 'without'\n      {\n        whitespace();\n        parse_FTIgnoreOption();\n      }\n    }\n    eventHandler.endNonterminal(\"FTContainsExpr\", e0);\n  }\n\n  function try_FTContainsExpr()\n  {\n    try_StringConcatExpr();\n    if (l1 == 99)                   // 'contains'\n    {\n      shiftT(99);                   // 'contains'\n      lookahead1W(76);              // S^WS | '(:' | 'text'\n      shiftT(244);                  // 'text'\n      lookahead1W(162);             // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{'\n      try_FTSelection();\n      if (l1 == 271)                // 'without'\n      {\n        try_FTIgnoreOption();\n      }\n    }\n  }\n\n  function parse_StringConcatExpr()\n  {\n    eventHandler.startNonterminal(\"StringConcatExpr\", e0);\n    parse_RangeExpr();\n    for (;;)\n    {\n      if (l1 != 280)                // '||'\n      {\n        break;\n      }\n      shift(280);                   // '||'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_RangeExpr();\n    }\n    eventHandler.endNonterminal(\"StringConcatExpr\", e0);\n  }\n\n  function try_StringConcatExpr()\n  {\n    try_RangeExpr();\n    for (;;)\n    {\n      if (l1 != 280)                // '||'\n      {\n        break;\n      }\n      shiftT(280);                  // '||'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_RangeExpr();\n    }\n  }\n\n  function parse_RangeExpr()\n  {\n    eventHandler.startNonterminal(\"RangeExpr\", e0);\n    parse_AdditiveExpr();\n    if (l1 == 248)                  // 'to'\n    {\n      shift(248);                   // 'to'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_AdditiveExpr();\n    }\n    eventHandler.endNonterminal(\"RangeExpr\", e0);\n  }\n\n  function try_RangeExpr()\n  {\n    try_AdditiveExpr();\n    if (l1 == 248)                  // 'to'\n    {\n      shiftT(248);                  // 'to'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_AdditiveExpr();\n    }\n  }\n\n  function parse_AdditiveExpr()\n  {\n    eventHandler.startNonterminal(\"AdditiveExpr\", e0);\n    parse_MultiplicativeExpr();\n    for (;;)\n    {\n      if (l1 != 40                  // '+'\n       && l1 != 42)                 // '-'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 40:                      // '+'\n        shift(40);                  // '+'\n        break;\n      default:\n        shift(42);                  // '-'\n      }\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_MultiplicativeExpr();\n    }\n    eventHandler.endNonterminal(\"AdditiveExpr\", e0);\n  }\n\n  function try_AdditiveExpr()\n  {\n    try_MultiplicativeExpr();\n    for (;;)\n    {\n      if (l1 != 40                  // '+'\n       && l1 != 42)                 // '-'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 40:                      // '+'\n        shiftT(40);                 // '+'\n        break;\n      default:\n        shiftT(42);                 // '-'\n      }\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_MultiplicativeExpr();\n    }\n  }\n\n  function parse_MultiplicativeExpr()\n  {\n    eventHandler.startNonterminal(\"MultiplicativeExpr\", e0);\n    parse_UnionExpr();\n    for (;;)\n    {\n      if (l1 != 38                  // '*'\n       && l1 != 118                 // 'div'\n       && l1 != 151                 // 'idiv'\n       && l1 != 180)                // 'mod'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 38:                      // '*'\n        shift(38);                  // '*'\n        break;\n      case 118:                     // 'div'\n        shift(118);                 // 'div'\n        break;\n      case 151:                     // 'idiv'\n        shift(151);                 // 'idiv'\n        break;\n      default:\n        shift(180);                 // 'mod'\n      }\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_UnionExpr();\n    }\n    eventHandler.endNonterminal(\"MultiplicativeExpr\", e0);\n  }\n\n  function try_MultiplicativeExpr()\n  {\n    try_UnionExpr();\n    for (;;)\n    {\n      if (l1 != 38                  // '*'\n       && l1 != 118                 // 'div'\n       && l1 != 151                 // 'idiv'\n       && l1 != 180)                // 'mod'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 38:                      // '*'\n        shiftT(38);                 // '*'\n        break;\n      case 118:                     // 'div'\n        shiftT(118);                // 'div'\n        break;\n      case 151:                     // 'idiv'\n        shiftT(151);                // 'idiv'\n        break;\n      default:\n        shiftT(180);                // 'mod'\n      }\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_UnionExpr();\n    }\n  }\n\n  function parse_UnionExpr()\n  {\n    eventHandler.startNonterminal(\"UnionExpr\", e0);\n    parse_IntersectExceptExpr();\n    for (;;)\n    {\n      if (l1 != 254                 // 'union'\n       && l1 != 279)                // '|'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 254:                     // 'union'\n        shift(254);                 // 'union'\n        break;\n      default:\n        shift(279);                 // '|'\n      }\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_IntersectExceptExpr();\n    }\n    eventHandler.endNonterminal(\"UnionExpr\", e0);\n  }\n\n  function try_UnionExpr()\n  {\n    try_IntersectExceptExpr();\n    for (;;)\n    {\n      if (l1 != 254                 // 'union'\n       && l1 != 279)                // '|'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 254:                     // 'union'\n        shiftT(254);                // 'union'\n        break;\n      default:\n        shiftT(279);                // '|'\n      }\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_IntersectExceptExpr();\n    }\n  }\n\n  function parse_IntersectExceptExpr()\n  {\n    eventHandler.startNonterminal(\"IntersectExceptExpr\", e0);\n    parse_InstanceofExpr();\n    for (;;)\n    {\n      lookahead1W(223);             // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n      if (l1 != 131                 // 'except'\n       && l1 != 162)                // 'intersect'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 162:                     // 'intersect'\n        shift(162);                 // 'intersect'\n        break;\n      default:\n        shift(131);                 // 'except'\n      }\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_InstanceofExpr();\n    }\n    eventHandler.endNonterminal(\"IntersectExceptExpr\", e0);\n  }\n\n  function try_IntersectExceptExpr()\n  {\n    try_InstanceofExpr();\n    for (;;)\n    {\n      lookahead1W(223);             // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n      if (l1 != 131                 // 'except'\n       && l1 != 162)                // 'intersect'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 162:                     // 'intersect'\n        shiftT(162);                // 'intersect'\n        break;\n      default:\n        shiftT(131);                // 'except'\n      }\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_InstanceofExpr();\n    }\n  }\n\n  function parse_InstanceofExpr()\n  {\n    eventHandler.startNonterminal(\"InstanceofExpr\", e0);\n    parse_TreatExpr();\n    lookahead1W(224);               // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n    if (l1 == 160)                  // 'instance'\n    {\n      shift(160);                   // 'instance'\n      lookahead1W(64);              // S^WS | '(:' | 'of'\n      shift(196);                   // 'of'\n      lookahead1W(260);             // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_SequenceType();\n    }\n    eventHandler.endNonterminal(\"InstanceofExpr\", e0);\n  }\n\n  function try_InstanceofExpr()\n  {\n    try_TreatExpr();\n    lookahead1W(224);               // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n    if (l1 == 160)                  // 'instance'\n    {\n      shiftT(160);                  // 'instance'\n      lookahead1W(64);              // S^WS | '(:' | 'of'\n      shiftT(196);                  // 'of'\n      lookahead1W(260);             // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_SequenceType();\n    }\n  }\n\n  function parse_TreatExpr()\n  {\n    eventHandler.startNonterminal(\"TreatExpr\", e0);\n    parse_CastableExpr();\n    lookahead1W(225);               // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n    if (l1 == 249)                  // 'treat'\n    {\n      shift(249);                   // 'treat'\n      lookahead1W(30);              // S^WS | '(:' | 'as'\n      shift(79);                    // 'as'\n      lookahead1W(260);             // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_SequenceType();\n    }\n    eventHandler.endNonterminal(\"TreatExpr\", e0);\n  }\n\n  function try_TreatExpr()\n  {\n    try_CastableExpr();\n    lookahead1W(225);               // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n    if (l1 == 249)                  // 'treat'\n    {\n      shiftT(249);                  // 'treat'\n      lookahead1W(30);              // S^WS | '(:' | 'as'\n      shiftT(79);                   // 'as'\n      lookahead1W(260);             // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_SequenceType();\n    }\n  }\n\n  function parse_CastableExpr()\n  {\n    eventHandler.startNonterminal(\"CastableExpr\", e0);\n    parse_CastExpr();\n    lookahead1W(226);               // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n    if (l1 == 90)                   // 'castable'\n    {\n      shift(90);                    // 'castable'\n      lookahead1W(30);              // S^WS | '(:' | 'as'\n      shift(79);                    // 'as'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_SingleType();\n    }\n    eventHandler.endNonterminal(\"CastableExpr\", e0);\n  }\n\n  function try_CastableExpr()\n  {\n    try_CastExpr();\n    lookahead1W(226);               // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n    if (l1 == 90)                   // 'castable'\n    {\n      shiftT(90);                   // 'castable'\n      lookahead1W(30);              // S^WS | '(:' | 'as'\n      shiftT(79);                   // 'as'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_SingleType();\n    }\n  }\n\n  function parse_CastExpr()\n  {\n    eventHandler.startNonterminal(\"CastExpr\", e0);\n    parse_UnaryExpr();\n    lookahead1W(228);               // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n    if (l1 == 89)                   // 'cast'\n    {\n      shift(89);                    // 'cast'\n      lookahead1W(30);              // S^WS | '(:' | 'as'\n      shift(79);                    // 'as'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_SingleType();\n    }\n    eventHandler.endNonterminal(\"CastExpr\", e0);\n  }\n\n  function try_CastExpr()\n  {\n    try_UnaryExpr();\n    lookahead1W(228);               // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n    if (l1 == 89)                   // 'cast'\n    {\n      shiftT(89);                   // 'cast'\n      lookahead1W(30);              // S^WS | '(:' | 'as'\n      shiftT(79);                   // 'as'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_SingleType();\n    }\n  }\n\n  function parse_UnaryExpr()\n  {\n    eventHandler.startNonterminal(\"UnaryExpr\", e0);\n    for (;;)\n    {\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      if (l1 != 40                  // '+'\n       && l1 != 42)                 // '-'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 42:                      // '-'\n        shift(42);                  // '-'\n        break;\n      default:\n        shift(40);                  // '+'\n      }\n    }\n    whitespace();\n    parse_ValueExpr();\n    eventHandler.endNonterminal(\"UnaryExpr\", e0);\n  }\n\n  function try_UnaryExpr()\n  {\n    for (;;)\n    {\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      if (l1 != 40                  // '+'\n       && l1 != 42)                 // '-'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 42:                      // '-'\n        shiftT(42);                 // '-'\n        break;\n      default:\n        shiftT(40);                 // '+'\n      }\n    }\n    try_ValueExpr();\n  }\n\n  function parse_ValueExpr()\n  {\n    eventHandler.startNonterminal(\"ValueExpr\", e0);\n    switch (l1)\n    {\n    case 260:                       // 'validate'\n      lookahead2W(248);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 87812:                     // 'validate' 'lax'\n    case 123140:                    // 'validate' 'strict'\n    case 129284:                    // 'validate' 'type'\n    case 141572:                    // 'validate' '{'\n      parse_ValidateExpr();\n      break;\n    case 35:                        // '(#'\n      parse_ExtensionExpr();\n      break;\n    default:\n      parse_SimpleMapExpr();\n    }\n    eventHandler.endNonterminal(\"ValueExpr\", e0);\n  }\n\n  function try_ValueExpr()\n  {\n    switch (l1)\n    {\n    case 260:                       // 'validate'\n      lookahead2W(248);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 87812:                     // 'validate' 'lax'\n    case 123140:                    // 'validate' 'strict'\n    case 129284:                    // 'validate' 'type'\n    case 141572:                    // 'validate' '{'\n      try_ValidateExpr();\n      break;\n    case 35:                        // '(#'\n      try_ExtensionExpr();\n      break;\n    default:\n      try_SimpleMapExpr();\n    }\n  }\n\n  function parse_SimpleMapExpr()\n  {\n    eventHandler.startNonterminal(\"SimpleMapExpr\", e0);\n    parse_PathExpr();\n    for (;;)\n    {\n      if (l1 != 26)                 // '!'\n      {\n        break;\n      }\n      shift(26);                    // '!'\n      lookahead1W(266);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_PathExpr();\n    }\n    eventHandler.endNonterminal(\"SimpleMapExpr\", e0);\n  }\n\n  function try_SimpleMapExpr()\n  {\n    try_PathExpr();\n    for (;;)\n    {\n      if (l1 != 26)                 // '!'\n      {\n        break;\n      }\n      shiftT(26);                   // '!'\n      lookahead1W(266);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_PathExpr();\n    }\n  }\n\n  function parse_GeneralComp()\n  {\n    eventHandler.startNonterminal(\"GeneralComp\", e0);\n    switch (l1)\n    {\n    case 60:                        // '='\n      shift(60);                    // '='\n      break;\n    case 27:                        // '!='\n      shift(27);                    // '!='\n      break;\n    case 54:                        // '<'\n      shift(54);                    // '<'\n      break;\n    case 58:                        // '<='\n      shift(58);                    // '<='\n      break;\n    case 61:                        // '>'\n      shift(61);                    // '>'\n      break;\n    default:\n      shift(62);                    // '>='\n    }\n    eventHandler.endNonterminal(\"GeneralComp\", e0);\n  }\n\n  function try_GeneralComp()\n  {\n    switch (l1)\n    {\n    case 60:                        // '='\n      shiftT(60);                   // '='\n      break;\n    case 27:                        // '!='\n      shiftT(27);                   // '!='\n      break;\n    case 54:                        // '<'\n      shiftT(54);                   // '<'\n      break;\n    case 58:                        // '<='\n      shiftT(58);                   // '<='\n      break;\n    case 61:                        // '>'\n      shiftT(61);                   // '>'\n      break;\n    default:\n      shiftT(62);                   // '>='\n    }\n  }\n\n  function parse_ValueComp()\n  {\n    eventHandler.startNonterminal(\"ValueComp\", e0);\n    switch (l1)\n    {\n    case 128:                       // 'eq'\n      shift(128);                   // 'eq'\n      break;\n    case 186:                       // 'ne'\n      shift(186);                   // 'ne'\n      break;\n    case 178:                       // 'lt'\n      shift(178);                   // 'lt'\n      break;\n    case 172:                       // 'le'\n      shift(172);                   // 'le'\n      break;\n    case 150:                       // 'gt'\n      shift(150);                   // 'gt'\n      break;\n    default:\n      shift(146);                   // 'ge'\n    }\n    eventHandler.endNonterminal(\"ValueComp\", e0);\n  }\n\n  function try_ValueComp()\n  {\n    switch (l1)\n    {\n    case 128:                       // 'eq'\n      shiftT(128);                  // 'eq'\n      break;\n    case 186:                       // 'ne'\n      shiftT(186);                  // 'ne'\n      break;\n    case 178:                       // 'lt'\n      shiftT(178);                  // 'lt'\n      break;\n    case 172:                       // 'le'\n      shiftT(172);                  // 'le'\n      break;\n    case 150:                       // 'gt'\n      shiftT(150);                  // 'gt'\n      break;\n    default:\n      shiftT(146);                  // 'ge'\n    }\n  }\n\n  function parse_NodeComp()\n  {\n    eventHandler.startNonterminal(\"NodeComp\", e0);\n    switch (l1)\n    {\n    case 164:                       // 'is'\n      shift(164);                   // 'is'\n      break;\n    case 57:                        // '<<'\n      shift(57);                    // '<<'\n      break;\n    default:\n      shift(63);                    // '>>'\n    }\n    eventHandler.endNonterminal(\"NodeComp\", e0);\n  }\n\n  function try_NodeComp()\n  {\n    switch (l1)\n    {\n    case 164:                       // 'is'\n      shiftT(164);                  // 'is'\n      break;\n    case 57:                        // '<<'\n      shiftT(57);                   // '<<'\n      break;\n    default:\n      shiftT(63);                   // '>>'\n    }\n  }\n\n  function parse_ValidateExpr()\n  {\n    eventHandler.startNonterminal(\"ValidateExpr\", e0);\n    shift(260);                     // 'validate'\n    lookahead1W(160);               // S^WS | '(:' | 'lax' | 'strict' | 'type' | '{'\n    if (l1 != 276)                  // '{'\n    {\n      switch (l1)\n      {\n      case 252:                     // 'type'\n        shift(252);                 // 'type'\n        lookahead1W(255);           // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n        whitespace();\n        parse_TypeName();\n        break;\n      default:\n        whitespace();\n        parse_ValidationMode();\n      }\n    }\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    shift(276);                     // '{'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Expr();\n    shift(282);                     // '}'\n    eventHandler.endNonterminal(\"ValidateExpr\", e0);\n  }\n\n  function try_ValidateExpr()\n  {\n    shiftT(260);                    // 'validate'\n    lookahead1W(160);               // S^WS | '(:' | 'lax' | 'strict' | 'type' | '{'\n    if (l1 != 276)                  // '{'\n    {\n      switch (l1)\n      {\n      case 252:                     // 'type'\n        shiftT(252);                // 'type'\n        lookahead1W(255);           // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n        try_TypeName();\n        break;\n      default:\n        try_ValidationMode();\n      }\n    }\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    shiftT(276);                    // '{'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Expr();\n    shiftT(282);                    // '}'\n  }\n\n  function parse_ValidationMode()\n  {\n    eventHandler.startNonterminal(\"ValidationMode\", e0);\n    switch (l1)\n    {\n    case 171:                       // 'lax'\n      shift(171);                   // 'lax'\n      break;\n    default:\n      shift(240);                   // 'strict'\n    }\n    eventHandler.endNonterminal(\"ValidationMode\", e0);\n  }\n\n  function try_ValidationMode()\n  {\n    switch (l1)\n    {\n    case 171:                       // 'lax'\n      shiftT(171);                  // 'lax'\n      break;\n    default:\n      shiftT(240);                  // 'strict'\n    }\n  }\n\n  function parse_ExtensionExpr()\n  {\n    eventHandler.startNonterminal(\"ExtensionExpr\", e0);\n    for (;;)\n    {\n      whitespace();\n      parse_Pragma();\n      lookahead1W(100);             // S^WS | '(#' | '(:' | '{'\n      if (l1 != 35)                 // '(#'\n      {\n        break;\n      }\n    }\n    shift(276);                     // '{'\n    lookahead1W(274);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    if (l1 != 282)                  // '}'\n    {\n      whitespace();\n      parse_Expr();\n    }\n    shift(282);                     // '}'\n    eventHandler.endNonterminal(\"ExtensionExpr\", e0);\n  }\n\n  function try_ExtensionExpr()\n  {\n    for (;;)\n    {\n      try_Pragma();\n      lookahead1W(100);             // S^WS | '(#' | '(:' | '{'\n      if (l1 != 35)                 // '(#'\n      {\n        break;\n      }\n    }\n    shiftT(276);                    // '{'\n    lookahead1W(274);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    if (l1 != 282)                  // '}'\n    {\n      try_Expr();\n    }\n    shiftT(282);                    // '}'\n  }\n\n  function parse_Pragma()\n  {\n    eventHandler.startNonterminal(\"Pragma\", e0);\n    shift(35);                      // '(#'\n    lookahead1(252);                // EQName^Token | S | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' |\n    if (l1 == 21)                   // S\n    {\n      shift(21);                    // S\n    }\n    parse_EQName();\n    lookahead1(10);                 // S | '#)'\n    if (l1 == 21)                   // S\n    {\n      shift(21);                    // S\n      lookahead1(0);                // PragmaContents\n      shift(1);                     // PragmaContents\n    }\n    lookahead1(5);                  // '#)'\n    shift(30);                      // '#)'\n    eventHandler.endNonterminal(\"Pragma\", e0);\n  }\n\n  function try_Pragma()\n  {\n    shiftT(35);                     // '(#'\n    lookahead1(252);                // EQName^Token | S | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' |\n    if (l1 == 21)                   // S\n    {\n      shiftT(21);                   // S\n    }\n    try_EQName();\n    lookahead1(10);                 // S | '#)'\n    if (l1 == 21)                   // S\n    {\n      shiftT(21);                   // S\n      lookahead1(0);                // PragmaContents\n      shiftT(1);                    // PragmaContents\n    }\n    lookahead1(5);                  // '#)'\n    shiftT(30);                     // '#)'\n  }\n\n  function parse_PathExpr()\n  {\n    eventHandler.startNonterminal(\"PathExpr\", e0);\n    switch (l1)\n    {\n    case 46:                        // '/'\n      shift(46);                    // '/'\n      lookahead1W(286);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      switch (l1)\n      {\n      case 25:                      // EOF\n      case 26:                      // '!'\n      case 27:                      // '!='\n      case 37:                      // ')'\n      case 38:                      // '*'\n      case 40:                      // '+'\n      case 41:                      // ','\n      case 42:                      // '-'\n      case 49:                      // ':'\n      case 53:                      // ';'\n      case 57:                      // '<<'\n      case 58:                      // '<='\n      case 60:                      // '='\n      case 61:                      // '>'\n      case 62:                      // '>='\n      case 63:                      // '>>'\n      case 69:                      // ']'\n      case 87:                      // 'by'\n      case 99:                      // 'contains'\n      case 205:                     // 'paragraphs'\n      case 232:                     // 'sentences'\n      case 247:                     // 'times'\n      case 273:                     // 'words'\n      case 279:                     // '|'\n      case 280:                     // '||'\n      case 281:                     // '|}'\n      case 282:                     // '}'\n        break;\n      default:\n        whitespace();\n        parse_RelativePathExpr();\n      }\n      break;\n    case 47:                        // '//'\n      shift(47);                    // '//'\n      lookahead1W(265);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_RelativePathExpr();\n      break;\n    default:\n      parse_RelativePathExpr();\n    }\n    eventHandler.endNonterminal(\"PathExpr\", e0);\n  }\n\n  function try_PathExpr()\n  {\n    switch (l1)\n    {\n    case 46:                        // '/'\n      shiftT(46);                   // '/'\n      lookahead1W(286);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      switch (l1)\n      {\n      case 25:                      // EOF\n      case 26:                      // '!'\n      case 27:                      // '!='\n      case 37:                      // ')'\n      case 38:                      // '*'\n      case 40:                      // '+'\n      case 41:                      // ','\n      case 42:                      // '-'\n      case 49:                      // ':'\n      case 53:                      // ';'\n      case 57:                      // '<<'\n      case 58:                      // '<='\n      case 60:                      // '='\n      case 61:                      // '>'\n      case 62:                      // '>='\n      case 63:                      // '>>'\n      case 69:                      // ']'\n      case 87:                      // 'by'\n      case 99:                      // 'contains'\n      case 205:                     // 'paragraphs'\n      case 232:                     // 'sentences'\n      case 247:                     // 'times'\n      case 273:                     // 'words'\n      case 279:                     // '|'\n      case 280:                     // '||'\n      case 281:                     // '|}'\n      case 282:                     // '}'\n        break;\n      default:\n        try_RelativePathExpr();\n      }\n      break;\n    case 47:                        // '//'\n      shiftT(47);                   // '//'\n      lookahead1W(265);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_RelativePathExpr();\n      break;\n    default:\n      try_RelativePathExpr();\n    }\n  }\n\n  function parse_RelativePathExpr()\n  {\n    eventHandler.startNonterminal(\"RelativePathExpr\", e0);\n    parse_StepExpr();\n    for (;;)\n    {\n      switch (l1)\n      {\n      case 26:                      // '!'\n        lookahead2W(266);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk != 25                  // EOF\n       && lk != 27                  // '!='\n       && lk != 37                  // ')'\n       && lk != 38                  // '*'\n       && lk != 40                  // '+'\n       && lk != 41                  // ','\n       && lk != 42                  // '-'\n       && lk != 46                  // '/'\n       && lk != 47                  // '//'\n       && lk != 49                  // ':'\n       && lk != 53                  // ';'\n       && lk != 54                  // '<'\n       && lk != 57                  // '<<'\n       && lk != 58                  // '<='\n       && lk != 60                  // '='\n       && lk != 61                  // '>'\n       && lk != 62                  // '>='\n       && lk != 63                  // '>>'\n       && lk != 69                  // ']'\n       && lk != 70                  // 'after'\n       && lk != 75                  // 'and'\n       && lk != 79                  // 'as'\n       && lk != 80                  // 'ascending'\n       && lk != 81                  // 'at'\n       && lk != 84                  // 'before'\n       && lk != 87                  // 'by'\n       && lk != 88                  // 'case'\n       && lk != 89                  // 'cast'\n       && lk != 90                  // 'castable'\n       && lk != 94                  // 'collation'\n       && lk != 99                  // 'contains'\n       && lk != 105                 // 'count'\n       && lk != 109                 // 'default'\n       && lk != 113                 // 'descending'\n       && lk != 118                 // 'div'\n       && lk != 122                 // 'else'\n       && lk != 123                 // 'empty'\n       && lk != 126                 // 'end'\n       && lk != 128                 // 'eq'\n       && lk != 131                 // 'except'\n       && lk != 137                 // 'for'\n       && lk != 146                 // 'ge'\n       && lk != 148                 // 'group'\n       && lk != 150                 // 'gt'\n       && lk != 151                 // 'idiv'\n       && lk != 160                 // 'instance'\n       && lk != 162                 // 'intersect'\n       && lk != 163                 // 'into'\n       && lk != 164                 // 'is'\n       && lk != 172                 // 'le'\n       && lk != 174                 // 'let'\n       && lk != 178                 // 'lt'\n       && lk != 180                 // 'mod'\n       && lk != 181                 // 'modify'\n       && lk != 186                 // 'ne'\n       && lk != 198                 // 'only'\n       && lk != 200                 // 'or'\n       && lk != 201                 // 'order'\n       && lk != 205                 // 'paragraphs'\n       && lk != 220                 // 'return'\n       && lk != 224                 // 'satisfies'\n       && lk != 232                 // 'sentences'\n       && lk != 236                 // 'stable'\n       && lk != 237                 // 'start'\n       && lk != 247                 // 'times'\n       && lk != 248                 // 'to'\n       && lk != 249                 // 'treat'\n       && lk != 254                 // 'union'\n       && lk != 266                 // 'where'\n       && lk != 270                 // 'with'\n       && lk != 273                 // 'words'\n       && lk != 279                 // '|'\n       && lk != 280                 // '||'\n       && lk != 281                 // '|}'\n       && lk != 282                 // '}'\n       && lk != 23578               // '!' '/'\n       && lk != 24090)              // '!' '//'\n      {\n        lk = memoized(3, e0);\n        if (lk == 0)\n        {\n          var b0A = b0; var e0A = e0; var l1A = l1;\n          var b1A = b1; var e1A = e1; var l2A = l2;\n          var b2A = b2; var e2A = e2;\n          try\n          {\n            switch (l1)\n            {\n            case 46:                // '/'\n              shiftT(46);           // '/'\n              break;\n            case 47:                // '//'\n              shiftT(47);           // '//'\n              break;\n            default:\n              shiftT(26);           // '!'\n            }\n            lookahead1W(265);       // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n            try_StepExpr();\n            lk = -1;\n          }\n          catch (p1A)\n          {\n            lk = -2;\n          }\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(3, e0, lk);\n        }\n      }\n      if (lk != -1\n       && lk != 46                  // '/'\n       && lk != 47)                 // '//'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 46:                      // '/'\n        shift(46);                  // '/'\n        break;\n      case 47:                      // '//'\n        shift(47);                  // '//'\n        break;\n      default:\n        shift(26);                  // '!'\n      }\n      lookahead1W(265);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_StepExpr();\n    }\n    eventHandler.endNonterminal(\"RelativePathExpr\", e0);\n  }\n\n  function try_RelativePathExpr()\n  {\n    try_StepExpr();\n    for (;;)\n    {\n      switch (l1)\n      {\n      case 26:                      // '!'\n        lookahead2W(266);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk != 25                  // EOF\n       && lk != 27                  // '!='\n       && lk != 37                  // ')'\n       && lk != 38                  // '*'\n       && lk != 40                  // '+'\n       && lk != 41                  // ','\n       && lk != 42                  // '-'\n       && lk != 46                  // '/'\n       && lk != 47                  // '//'\n       && lk != 49                  // ':'\n       && lk != 53                  // ';'\n       && lk != 54                  // '<'\n       && lk != 57                  // '<<'\n       && lk != 58                  // '<='\n       && lk != 60                  // '='\n       && lk != 61                  // '>'\n       && lk != 62                  // '>='\n       && lk != 63                  // '>>'\n       && lk != 69                  // ']'\n       && lk != 70                  // 'after'\n       && lk != 75                  // 'and'\n       && lk != 79                  // 'as'\n       && lk != 80                  // 'ascending'\n       && lk != 81                  // 'at'\n       && lk != 84                  // 'before'\n       && lk != 87                  // 'by'\n       && lk != 88                  // 'case'\n       && lk != 89                  // 'cast'\n       && lk != 90                  // 'castable'\n       && lk != 94                  // 'collation'\n       && lk != 99                  // 'contains'\n       && lk != 105                 // 'count'\n       && lk != 109                 // 'default'\n       && lk != 113                 // 'descending'\n       && lk != 118                 // 'div'\n       && lk != 122                 // 'else'\n       && lk != 123                 // 'empty'\n       && lk != 126                 // 'end'\n       && lk != 128                 // 'eq'\n       && lk != 131                 // 'except'\n       && lk != 137                 // 'for'\n       && lk != 146                 // 'ge'\n       && lk != 148                 // 'group'\n       && lk != 150                 // 'gt'\n       && lk != 151                 // 'idiv'\n       && lk != 160                 // 'instance'\n       && lk != 162                 // 'intersect'\n       && lk != 163                 // 'into'\n       && lk != 164                 // 'is'\n       && lk != 172                 // 'le'\n       && lk != 174                 // 'let'\n       && lk != 178                 // 'lt'\n       && lk != 180                 // 'mod'\n       && lk != 181                 // 'modify'\n       && lk != 186                 // 'ne'\n       && lk != 198                 // 'only'\n       && lk != 200                 // 'or'\n       && lk != 201                 // 'order'\n       && lk != 205                 // 'paragraphs'\n       && lk != 220                 // 'return'\n       && lk != 224                 // 'satisfies'\n       && lk != 232                 // 'sentences'\n       && lk != 236                 // 'stable'\n       && lk != 237                 // 'start'\n       && lk != 247                 // 'times'\n       && lk != 248                 // 'to'\n       && lk != 249                 // 'treat'\n       && lk != 254                 // 'union'\n       && lk != 266                 // 'where'\n       && lk != 270                 // 'with'\n       && lk != 273                 // 'words'\n       && lk != 279                 // '|'\n       && lk != 280                 // '||'\n       && lk != 281                 // '|}'\n       && lk != 282                 // '}'\n       && lk != 23578               // '!' '/'\n       && lk != 24090)              // '!' '//'\n      {\n        lk = memoized(3, e0);\n        if (lk == 0)\n        {\n          var b0A = b0; var e0A = e0; var l1A = l1;\n          var b1A = b1; var e1A = e1; var l2A = l2;\n          var b2A = b2; var e2A = e2;\n          try\n          {\n            switch (l1)\n            {\n            case 46:                // '/'\n              shiftT(46);           // '/'\n              break;\n            case 47:                // '//'\n              shiftT(47);           // '//'\n              break;\n            default:\n              shiftT(26);           // '!'\n            }\n            lookahead1W(265);       // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n            try_StepExpr();\n            memoize(3, e0A, -1);\n            continue;\n          }\n          catch (p1A)\n          {\n            b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n            b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n            b2 = b2A; e2 = e2A; end = e2A; }}\n            memoize(3, e0A, -2);\n            break;\n          }\n        }\n      }\n      if (lk != -1\n       && lk != 46                  // '/'\n       && lk != 47)                 // '//'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 46:                      // '/'\n        shiftT(46);                 // '/'\n        break;\n      case 47:                      // '//'\n        shiftT(47);                 // '//'\n        break;\n      default:\n        shiftT(26);                 // '!'\n      }\n      lookahead1W(265);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_StepExpr();\n    }\n  }\n\n  function parse_StepExpr()\n  {\n    eventHandler.startNonterminal(\"StepExpr\", e0);\n    switch (l1)\n    {\n    case 82:                        // 'attribute'\n      lookahead2W(285);             // EQName^Token | S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' |\n      break;\n    case 121:                       // 'element'\n      lookahead2W(283);             // EQName^Token | S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' |\n      break;\n    case 184:                       // 'namespace'\n    case 216:                       // 'processing-instruction'\n      lookahead2W(282);             // NCName^Token | S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' |\n      break;\n    case 96:                        // 'comment'\n    case 119:                       // 'document'\n    case 202:                       // 'ordered'\n    case 244:                       // 'text'\n    case 256:                       // 'unordered'\n      lookahead2W(247);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    case 78:                        // 'array'\n    case 124:                       // 'empty-sequence'\n    case 152:                       // 'if'\n    case 165:                       // 'item'\n    case 167:                       // 'json-item'\n    case 242:                       // 'structured-item'\n    case 243:                       // 'switch'\n    case 253:                       // 'typeswitch'\n      lookahead2W(240);             // S^WS | EOF | '!' | '!=' | '#' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' |\n      break;\n    case 73:                        // 'ancestor'\n    case 74:                        // 'ancestor-or-self'\n    case 93:                        // 'child'\n    case 111:                       // 'descendant'\n    case 112:                       // 'descendant-or-self'\n    case 135:                       // 'following'\n    case 136:                       // 'following-sibling'\n    case 206:                       // 'parent'\n    case 212:                       // 'preceding'\n    case 213:                       // 'preceding-sibling'\n    case 229:                       // 'self'\n      lookahead2W(246);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    case 6:                         // EQName^Token\n    case 70:                        // 'after'\n    case 72:                        // 'allowing'\n    case 75:                        // 'and'\n    case 77:                        // 'append'\n    case 79:                        // 'as'\n    case 80:                        // 'ascending'\n    case 81:                        // 'at'\n    case 83:                        // 'base-uri'\n    case 84:                        // 'before'\n    case 85:                        // 'boundary-space'\n    case 86:                        // 'break'\n    case 88:                        // 'case'\n    case 89:                        // 'cast'\n    case 90:                        // 'castable'\n    case 91:                        // 'catch'\n    case 94:                        // 'collation'\n    case 97:                        // 'constraint'\n    case 98:                        // 'construction'\n    case 101:                       // 'context'\n    case 102:                       // 'continue'\n    case 103:                       // 'copy'\n    case 104:                       // 'copy-namespaces'\n    case 105:                       // 'count'\n    case 106:                       // 'decimal-format'\n    case 108:                       // 'declare'\n    case 109:                       // 'default'\n    case 110:                       // 'delete'\n    case 113:                       // 'descending'\n    case 118:                       // 'div'\n    case 120:                       // 'document-node'\n    case 122:                       // 'else'\n    case 123:                       // 'empty'\n    case 125:                       // 'encoding'\n    case 126:                       // 'end'\n    case 128:                       // 'eq'\n    case 129:                       // 'every'\n    case 131:                       // 'except'\n    case 132:                       // 'exit'\n    case 133:                       // 'external'\n    case 134:                       // 'first'\n    case 137:                       // 'for'\n    case 141:                       // 'ft-option'\n    case 145:                       // 'function'\n    case 146:                       // 'ge'\n    case 148:                       // 'group'\n    case 150:                       // 'gt'\n    case 151:                       // 'idiv'\n    case 153:                       // 'import'\n    case 154:                       // 'in'\n    case 155:                       // 'index'\n    case 159:                       // 'insert'\n    case 160:                       // 'instance'\n    case 161:                       // 'integrity'\n    case 162:                       // 'intersect'\n    case 163:                       // 'into'\n    case 164:                       // 'is'\n    case 166:                       // 'json'\n    case 170:                       // 'last'\n    case 171:                       // 'lax'\n    case 172:                       // 'le'\n    case 174:                       // 'let'\n    case 176:                       // 'loop'\n    case 178:                       // 'lt'\n    case 180:                       // 'mod'\n    case 181:                       // 'modify'\n    case 182:                       // 'module'\n    case 185:                       // 'namespace-node'\n    case 186:                       // 'ne'\n    case 191:                       // 'node'\n    case 192:                       // 'nodes'\n    case 194:                       // 'object'\n    case 198:                       // 'only'\n    case 199:                       // 'option'\n    case 200:                       // 'or'\n    case 201:                       // 'order'\n    case 203:                       // 'ordering'\n    case 218:                       // 'rename'\n    case 219:                       // 'replace'\n    case 220:                       // 'return'\n    case 221:                       // 'returning'\n    case 222:                       // 'revalidation'\n    case 224:                       // 'satisfies'\n    case 225:                       // 'schema'\n    case 226:                       // 'schema-attribute'\n    case 227:                       // 'schema-element'\n    case 228:                       // 'score'\n    case 234:                       // 'sliding'\n    case 235:                       // 'some'\n    case 236:                       // 'stable'\n    case 237:                       // 'start'\n    case 240:                       // 'strict'\n    case 248:                       // 'to'\n    case 249:                       // 'treat'\n    case 250:                       // 'try'\n    case 251:                       // 'tumbling'\n    case 252:                       // 'type'\n    case 254:                       // 'union'\n    case 257:                       // 'updating'\n    case 260:                       // 'validate'\n    case 261:                       // 'value'\n    case 262:                       // 'variable'\n    case 263:                       // 'version'\n    case 266:                       // 'where'\n    case 267:                       // 'while'\n    case 270:                       // 'with'\n    case 274:                       // 'xquery'\n      lookahead2W(244);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 35922                 // 'attribute' 'after'\n     || lk == 35961                 // 'element' 'after'\n     || lk == 36024                 // 'namespace' 'after'\n     || lk == 36056                 // 'processing-instruction' 'after'\n     || lk == 38482                 // 'attribute' 'and'\n     || lk == 38521                 // 'element' 'and'\n     || lk == 38584                 // 'namespace' 'and'\n     || lk == 38616                 // 'processing-instruction' 'and'\n     || lk == 40530                 // 'attribute' 'as'\n     || lk == 40569                 // 'element' 'as'\n     || lk == 40632                 // 'namespace' 'as'\n     || lk == 40664                 // 'processing-instruction' 'as'\n     || lk == 41042                 // 'attribute' 'ascending'\n     || lk == 41081                 // 'element' 'ascending'\n     || lk == 41144                 // 'namespace' 'ascending'\n     || lk == 41176                 // 'processing-instruction' 'ascending'\n     || lk == 41554                 // 'attribute' 'at'\n     || lk == 41593                 // 'element' 'at'\n     || lk == 41656                 // 'namespace' 'at'\n     || lk == 41688                 // 'processing-instruction' 'at'\n     || lk == 43090                 // 'attribute' 'before'\n     || lk == 43129                 // 'element' 'before'\n     || lk == 43192                 // 'namespace' 'before'\n     || lk == 43224                 // 'processing-instruction' 'before'\n     || lk == 45138                 // 'attribute' 'case'\n     || lk == 45177                 // 'element' 'case'\n     || lk == 45240                 // 'namespace' 'case'\n     || lk == 45272                 // 'processing-instruction' 'case'\n     || lk == 45650                 // 'attribute' 'cast'\n     || lk == 45689                 // 'element' 'cast'\n     || lk == 45752                 // 'namespace' 'cast'\n     || lk == 45784                 // 'processing-instruction' 'cast'\n     || lk == 46162                 // 'attribute' 'castable'\n     || lk == 46201                 // 'element' 'castable'\n     || lk == 46264                 // 'namespace' 'castable'\n     || lk == 46296                 // 'processing-instruction' 'castable'\n     || lk == 48210                 // 'attribute' 'collation'\n     || lk == 48249                 // 'element' 'collation'\n     || lk == 48312                 // 'namespace' 'collation'\n     || lk == 48344                 // 'processing-instruction' 'collation'\n     || lk == 53842                 // 'attribute' 'count'\n     || lk == 53881                 // 'element' 'count'\n     || lk == 53944                 // 'namespace' 'count'\n     || lk == 53976                 // 'processing-instruction' 'count'\n     || lk == 55890                 // 'attribute' 'default'\n     || lk == 55929                 // 'element' 'default'\n     || lk == 55992                 // 'namespace' 'default'\n     || lk == 56024                 // 'processing-instruction' 'default'\n     || lk == 57938                 // 'attribute' 'descending'\n     || lk == 57977                 // 'element' 'descending'\n     || lk == 58040                 // 'namespace' 'descending'\n     || lk == 58072                 // 'processing-instruction' 'descending'\n     || lk == 60498                 // 'attribute' 'div'\n     || lk == 60537                 // 'element' 'div'\n     || lk == 60600                 // 'namespace' 'div'\n     || lk == 60632                 // 'processing-instruction' 'div'\n     || lk == 62546                 // 'attribute' 'else'\n     || lk == 62585                 // 'element' 'else'\n     || lk == 62648                 // 'namespace' 'else'\n     || lk == 62680                 // 'processing-instruction' 'else'\n     || lk == 63058                 // 'attribute' 'empty'\n     || lk == 63097                 // 'element' 'empty'\n     || lk == 63160                 // 'namespace' 'empty'\n     || lk == 63192                 // 'processing-instruction' 'empty'\n     || lk == 64594                 // 'attribute' 'end'\n     || lk == 64633                 // 'element' 'end'\n     || lk == 64696                 // 'namespace' 'end'\n     || lk == 64728                 // 'processing-instruction' 'end'\n     || lk == 65618                 // 'attribute' 'eq'\n     || lk == 65657                 // 'element' 'eq'\n     || lk == 65720                 // 'namespace' 'eq'\n     || lk == 65752                 // 'processing-instruction' 'eq'\n     || lk == 67154                 // 'attribute' 'except'\n     || lk == 67193                 // 'element' 'except'\n     || lk == 67256                 // 'namespace' 'except'\n     || lk == 67288                 // 'processing-instruction' 'except'\n     || lk == 70226                 // 'attribute' 'for'\n     || lk == 70265                 // 'element' 'for'\n     || lk == 70328                 // 'namespace' 'for'\n     || lk == 70360                 // 'processing-instruction' 'for'\n     || lk == 74834                 // 'attribute' 'ge'\n     || lk == 74873                 // 'element' 'ge'\n     || lk == 74936                 // 'namespace' 'ge'\n     || lk == 74968                 // 'processing-instruction' 'ge'\n     || lk == 75858                 // 'attribute' 'group'\n     || lk == 75897                 // 'element' 'group'\n     || lk == 75960                 // 'namespace' 'group'\n     || lk == 75992                 // 'processing-instruction' 'group'\n     || lk == 76882                 // 'attribute' 'gt'\n     || lk == 76921                 // 'element' 'gt'\n     || lk == 76984                 // 'namespace' 'gt'\n     || lk == 77016                 // 'processing-instruction' 'gt'\n     || lk == 77394                 // 'attribute' 'idiv'\n     || lk == 77433                 // 'element' 'idiv'\n     || lk == 77496                 // 'namespace' 'idiv'\n     || lk == 77528                 // 'processing-instruction' 'idiv'\n     || lk == 82002                 // 'attribute' 'instance'\n     || lk == 82041                 // 'element' 'instance'\n     || lk == 82104                 // 'namespace' 'instance'\n     || lk == 82136                 // 'processing-instruction' 'instance'\n     || lk == 83026                 // 'attribute' 'intersect'\n     || lk == 83065                 // 'element' 'intersect'\n     || lk == 83128                 // 'namespace' 'intersect'\n     || lk == 83160                 // 'processing-instruction' 'intersect'\n     || lk == 83538                 // 'attribute' 'into'\n     || lk == 83577                 // 'element' 'into'\n     || lk == 83640                 // 'namespace' 'into'\n     || lk == 83672                 // 'processing-instruction' 'into'\n     || lk == 84050                 // 'attribute' 'is'\n     || lk == 84089                 // 'element' 'is'\n     || lk == 84152                 // 'namespace' 'is'\n     || lk == 84184                 // 'processing-instruction' 'is'\n     || lk == 88146                 // 'attribute' 'le'\n     || lk == 88185                 // 'element' 'le'\n     || lk == 88248                 // 'namespace' 'le'\n     || lk == 88280                 // 'processing-instruction' 'le'\n     || lk == 89170                 // 'attribute' 'let'\n     || lk == 89209                 // 'element' 'let'\n     || lk == 89272                 // 'namespace' 'let'\n     || lk == 89304                 // 'processing-instruction' 'let'\n     || lk == 91218                 // 'attribute' 'lt'\n     || lk == 91257                 // 'element' 'lt'\n     || lk == 91320                 // 'namespace' 'lt'\n     || lk == 91352                 // 'processing-instruction' 'lt'\n     || lk == 92242                 // 'attribute' 'mod'\n     || lk == 92281                 // 'element' 'mod'\n     || lk == 92344                 // 'namespace' 'mod'\n     || lk == 92376                 // 'processing-instruction' 'mod'\n     || lk == 92754                 // 'attribute' 'modify'\n     || lk == 92793                 // 'element' 'modify'\n     || lk == 92856                 // 'namespace' 'modify'\n     || lk == 92888                 // 'processing-instruction' 'modify'\n     || lk == 95314                 // 'attribute' 'ne'\n     || lk == 95353                 // 'element' 'ne'\n     || lk == 95416                 // 'namespace' 'ne'\n     || lk == 95448                 // 'processing-instruction' 'ne'\n     || lk == 101458                // 'attribute' 'only'\n     || lk == 101497                // 'element' 'only'\n     || lk == 101560                // 'namespace' 'only'\n     || lk == 101592                // 'processing-instruction' 'only'\n     || lk == 102482                // 'attribute' 'or'\n     || lk == 102521                // 'element' 'or'\n     || lk == 102584                // 'namespace' 'or'\n     || lk == 102616                // 'processing-instruction' 'or'\n     || lk == 102994                // 'attribute' 'order'\n     || lk == 103033                // 'element' 'order'\n     || lk == 103096                // 'namespace' 'order'\n     || lk == 103128                // 'processing-instruction' 'order'\n     || lk == 112722                // 'attribute' 'return'\n     || lk == 112761                // 'element' 'return'\n     || lk == 112824                // 'namespace' 'return'\n     || lk == 112856                // 'processing-instruction' 'return'\n     || lk == 114770                // 'attribute' 'satisfies'\n     || lk == 114809                // 'element' 'satisfies'\n     || lk == 114872                // 'namespace' 'satisfies'\n     || lk == 114904                // 'processing-instruction' 'satisfies'\n     || lk == 120914                // 'attribute' 'stable'\n     || lk == 120953                // 'element' 'stable'\n     || lk == 121016                // 'namespace' 'stable'\n     || lk == 121048                // 'processing-instruction' 'stable'\n     || lk == 121426                // 'attribute' 'start'\n     || lk == 121465                // 'element' 'start'\n     || lk == 121528                // 'namespace' 'start'\n     || lk == 121560                // 'processing-instruction' 'start'\n     || lk == 127058                // 'attribute' 'to'\n     || lk == 127097                // 'element' 'to'\n     || lk == 127160                // 'namespace' 'to'\n     || lk == 127192                // 'processing-instruction' 'to'\n     || lk == 127570                // 'attribute' 'treat'\n     || lk == 127609                // 'element' 'treat'\n     || lk == 127672                // 'namespace' 'treat'\n     || lk == 127704                // 'processing-instruction' 'treat'\n     || lk == 130130                // 'attribute' 'union'\n     || lk == 130169                // 'element' 'union'\n     || lk == 130232                // 'namespace' 'union'\n     || lk == 130264                // 'processing-instruction' 'union'\n     || lk == 136274                // 'attribute' 'where'\n     || lk == 136313                // 'element' 'where'\n     || lk == 136376                // 'namespace' 'where'\n     || lk == 136408                // 'processing-instruction' 'where'\n     || lk == 138322                // 'attribute' 'with'\n     || lk == 138361                // 'element' 'with'\n     || lk == 138424                // 'namespace' 'with'\n     || lk == 138456)               // 'processing-instruction' 'with'\n    {\n      lk = memoized(4, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_PostfixExpr();\n          lk = -1;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n        }\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(4, e0, lk);\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n    case 8:                         // IntegerLiteral\n    case 9:                         // DecimalLiteral\n    case 10:                        // DoubleLiteral\n    case 11:                        // StringLiteral\n    case 31:                        // '$'\n    case 32:                        // '%'\n    case 34:                        // '('\n    case 44:                        // '.'\n    case 54:                        // '<'\n    case 55:                        // '<!--'\n    case 59:                        // '<?'\n    case 68:                        // '['\n    case 276:                       // '{'\n    case 278:                       // '{|'\n    case 3154:                      // 'attribute' EQName^Token\n    case 3193:                      // 'element' EQName^Token\n    case 9912:                      // 'namespace' NCName^Token\n    case 9944:                      // 'processing-instruction' NCName^Token\n    case 14854:                     // EQName^Token '#'\n    case 14918:                     // 'after' '#'\n    case 14920:                     // 'allowing' '#'\n    case 14921:                     // 'ancestor' '#'\n    case 14922:                     // 'ancestor-or-self' '#'\n    case 14923:                     // 'and' '#'\n    case 14925:                     // 'append' '#'\n    case 14926:                     // 'array' '#'\n    case 14927:                     // 'as' '#'\n    case 14928:                     // 'ascending' '#'\n    case 14929:                     // 'at' '#'\n    case 14930:                     // 'attribute' '#'\n    case 14931:                     // 'base-uri' '#'\n    case 14932:                     // 'before' '#'\n    case 14933:                     // 'boundary-space' '#'\n    case 14934:                     // 'break' '#'\n    case 14936:                     // 'case' '#'\n    case 14937:                     // 'cast' '#'\n    case 14938:                     // 'castable' '#'\n    case 14939:                     // 'catch' '#'\n    case 14941:                     // 'child' '#'\n    case 14942:                     // 'collation' '#'\n    case 14944:                     // 'comment' '#'\n    case 14945:                     // 'constraint' '#'\n    case 14946:                     // 'construction' '#'\n    case 14949:                     // 'context' '#'\n    case 14950:                     // 'continue' '#'\n    case 14951:                     // 'copy' '#'\n    case 14952:                     // 'copy-namespaces' '#'\n    case 14953:                     // 'count' '#'\n    case 14954:                     // 'decimal-format' '#'\n    case 14956:                     // 'declare' '#'\n    case 14957:                     // 'default' '#'\n    case 14958:                     // 'delete' '#'\n    case 14959:                     // 'descendant' '#'\n    case 14960:                     // 'descendant-or-self' '#'\n    case 14961:                     // 'descending' '#'\n    case 14966:                     // 'div' '#'\n    case 14967:                     // 'document' '#'\n    case 14968:                     // 'document-node' '#'\n    case 14969:                     // 'element' '#'\n    case 14970:                     // 'else' '#'\n    case 14971:                     // 'empty' '#'\n    case 14972:                     // 'empty-sequence' '#'\n    case 14973:                     // 'encoding' '#'\n    case 14974:                     // 'end' '#'\n    case 14976:                     // 'eq' '#'\n    case 14977:                     // 'every' '#'\n    case 14979:                     // 'except' '#'\n    case 14980:                     // 'exit' '#'\n    case 14981:                     // 'external' '#'\n    case 14982:                     // 'first' '#'\n    case 14983:                     // 'following' '#'\n    case 14984:                     // 'following-sibling' '#'\n    case 14985:                     // 'for' '#'\n    case 14989:                     // 'ft-option' '#'\n    case 14993:                     // 'function' '#'\n    case 14994:                     // 'ge' '#'\n    case 14996:                     // 'group' '#'\n    case 14998:                     // 'gt' '#'\n    case 14999:                     // 'idiv' '#'\n    case 15000:                     // 'if' '#'\n    case 15001:                     // 'import' '#'\n    case 15002:                     // 'in' '#'\n    case 15003:                     // 'index' '#'\n    case 15007:                     // 'insert' '#'\n    case 15008:                     // 'instance' '#'\n    case 15009:                     // 'integrity' '#'\n    case 15010:                     // 'intersect' '#'\n    case 15011:                     // 'into' '#'\n    case 15012:                     // 'is' '#'\n    case 15013:                     // 'item' '#'\n    case 15014:                     // 'json' '#'\n    case 15015:                     // 'json-item' '#'\n    case 15018:                     // 'last' '#'\n    case 15019:                     // 'lax' '#'\n    case 15020:                     // 'le' '#'\n    case 15022:                     // 'let' '#'\n    case 15024:                     // 'loop' '#'\n    case 15026:                     // 'lt' '#'\n    case 15028:                     // 'mod' '#'\n    case 15029:                     // 'modify' '#'\n    case 15030:                     // 'module' '#'\n    case 15032:                     // 'namespace' '#'\n    case 15033:                     // 'namespace-node' '#'\n    case 15034:                     // 'ne' '#'\n    case 15039:                     // 'node' '#'\n    case 15040:                     // 'nodes' '#'\n    case 15042:                     // 'object' '#'\n    case 15046:                     // 'only' '#'\n    case 15047:                     // 'option' '#'\n    case 15048:                     // 'or' '#'\n    case 15049:                     // 'order' '#'\n    case 15050:                     // 'ordered' '#'\n    case 15051:                     // 'ordering' '#'\n    case 15054:                     // 'parent' '#'\n    case 15060:                     // 'preceding' '#'\n    case 15061:                     // 'preceding-sibling' '#'\n    case 15064:                     // 'processing-instruction' '#'\n    case 15066:                     // 'rename' '#'\n    case 15067:                     // 'replace' '#'\n    case 15068:                     // 'return' '#'\n    case 15069:                     // 'returning' '#'\n    case 15070:                     // 'revalidation' '#'\n    case 15072:                     // 'satisfies' '#'\n    case 15073:                     // 'schema' '#'\n    case 15074:                     // 'schema-attribute' '#'\n    case 15075:                     // 'schema-element' '#'\n    case 15076:                     // 'score' '#'\n    case 15077:                     // 'self' '#'\n    case 15082:                     // 'sliding' '#'\n    case 15083:                     // 'some' '#'\n    case 15084:                     // 'stable' '#'\n    case 15085:                     // 'start' '#'\n    case 15088:                     // 'strict' '#'\n    case 15090:                     // 'structured-item' '#'\n    case 15091:                     // 'switch' '#'\n    case 15092:                     // 'text' '#'\n    case 15096:                     // 'to' '#'\n    case 15097:                     // 'treat' '#'\n    case 15098:                     // 'try' '#'\n    case 15099:                     // 'tumbling' '#'\n    case 15100:                     // 'type' '#'\n    case 15101:                     // 'typeswitch' '#'\n    case 15102:                     // 'union' '#'\n    case 15104:                     // 'unordered' '#'\n    case 15105:                     // 'updating' '#'\n    case 15108:                     // 'validate' '#'\n    case 15109:                     // 'value' '#'\n    case 15110:                     // 'variable' '#'\n    case 15111:                     // 'version' '#'\n    case 15114:                     // 'where' '#'\n    case 15115:                     // 'while' '#'\n    case 15118:                     // 'with' '#'\n    case 15122:                     // 'xquery' '#'\n    case 17414:                     // EQName^Token '('\n    case 17478:                     // 'after' '('\n    case 17480:                     // 'allowing' '('\n    case 17481:                     // 'ancestor' '('\n    case 17482:                     // 'ancestor-or-self' '('\n    case 17483:                     // 'and' '('\n    case 17485:                     // 'append' '('\n    case 17487:                     // 'as' '('\n    case 17488:                     // 'ascending' '('\n    case 17489:                     // 'at' '('\n    case 17491:                     // 'base-uri' '('\n    case 17492:                     // 'before' '('\n    case 17493:                     // 'boundary-space' '('\n    case 17494:                     // 'break' '('\n    case 17496:                     // 'case' '('\n    case 17497:                     // 'cast' '('\n    case 17498:                     // 'castable' '('\n    case 17499:                     // 'catch' '('\n    case 17501:                     // 'child' '('\n    case 17502:                     // 'collation' '('\n    case 17505:                     // 'constraint' '('\n    case 17506:                     // 'construction' '('\n    case 17509:                     // 'context' '('\n    case 17510:                     // 'continue' '('\n    case 17511:                     // 'copy' '('\n    case 17512:                     // 'copy-namespaces' '('\n    case 17513:                     // 'count' '('\n    case 17514:                     // 'decimal-format' '('\n    case 17516:                     // 'declare' '('\n    case 17517:                     // 'default' '('\n    case 17518:                     // 'delete' '('\n    case 17519:                     // 'descendant' '('\n    case 17520:                     // 'descendant-or-self' '('\n    case 17521:                     // 'descending' '('\n    case 17526:                     // 'div' '('\n    case 17527:                     // 'document' '('\n    case 17530:                     // 'else' '('\n    case 17531:                     // 'empty' '('\n    case 17533:                     // 'encoding' '('\n    case 17534:                     // 'end' '('\n    case 17536:                     // 'eq' '('\n    case 17537:                     // 'every' '('\n    case 17539:                     // 'except' '('\n    case 17540:                     // 'exit' '('\n    case 17541:                     // 'external' '('\n    case 17542:                     // 'first' '('\n    case 17543:                     // 'following' '('\n    case 17544:                     // 'following-sibling' '('\n    case 17545:                     // 'for' '('\n    case 17549:                     // 'ft-option' '('\n    case 17553:                     // 'function' '('\n    case 17554:                     // 'ge' '('\n    case 17556:                     // 'group' '('\n    case 17558:                     // 'gt' '('\n    case 17559:                     // 'idiv' '('\n    case 17561:                     // 'import' '('\n    case 17562:                     // 'in' '('\n    case 17563:                     // 'index' '('\n    case 17567:                     // 'insert' '('\n    case 17568:                     // 'instance' '('\n    case 17569:                     // 'integrity' '('\n    case 17570:                     // 'intersect' '('\n    case 17571:                     // 'into' '('\n    case 17572:                     // 'is' '('\n    case 17574:                     // 'json' '('\n    case 17578:                     // 'last' '('\n    case 17579:                     // 'lax' '('\n    case 17580:                     // 'le' '('\n    case 17582:                     // 'let' '('\n    case 17584:                     // 'loop' '('\n    case 17586:                     // 'lt' '('\n    case 17588:                     // 'mod' '('\n    case 17589:                     // 'modify' '('\n    case 17590:                     // 'module' '('\n    case 17592:                     // 'namespace' '('\n    case 17594:                     // 'ne' '('\n    case 17600:                     // 'nodes' '('\n    case 17602:                     // 'object' '('\n    case 17606:                     // 'only' '('\n    case 17607:                     // 'option' '('\n    case 17608:                     // 'or' '('\n    case 17609:                     // 'order' '('\n    case 17610:                     // 'ordered' '('\n    case 17611:                     // 'ordering' '('\n    case 17614:                     // 'parent' '('\n    case 17620:                     // 'preceding' '('\n    case 17621:                     // 'preceding-sibling' '('\n    case 17626:                     // 'rename' '('\n    case 17627:                     // 'replace' '('\n    case 17628:                     // 'return' '('\n    case 17629:                     // 'returning' '('\n    case 17630:                     // 'revalidation' '('\n    case 17632:                     // 'satisfies' '('\n    case 17633:                     // 'schema' '('\n    case 17636:                     // 'score' '('\n    case 17637:                     // 'self' '('\n    case 17642:                     // 'sliding' '('\n    case 17643:                     // 'some' '('\n    case 17644:                     // 'stable' '('\n    case 17645:                     // 'start' '('\n    case 17648:                     // 'strict' '('\n    case 17656:                     // 'to' '('\n    case 17657:                     // 'treat' '('\n    case 17658:                     // 'try' '('\n    case 17659:                     // 'tumbling' '('\n    case 17660:                     // 'type' '('\n    case 17662:                     // 'union' '('\n    case 17664:                     // 'unordered' '('\n    case 17665:                     // 'updating' '('\n    case 17668:                     // 'validate' '('\n    case 17669:                     // 'value' '('\n    case 17670:                     // 'variable' '('\n    case 17671:                     // 'version' '('\n    case 17674:                     // 'where' '('\n    case 17675:                     // 'while' '('\n    case 17678:                     // 'with' '('\n    case 17682:                     // 'xquery' '('\n    case 36946:                     // 'attribute' 'allowing'\n    case 36985:                     // 'element' 'allowing'\n    case 37048:                     // 'namespace' 'allowing'\n    case 37080:                     // 'processing-instruction' 'allowing'\n    case 37458:                     // 'attribute' 'ancestor'\n    case 37497:                     // 'element' 'ancestor'\n    case 37560:                     // 'namespace' 'ancestor'\n    case 37592:                     // 'processing-instruction' 'ancestor'\n    case 37970:                     // 'attribute' 'ancestor-or-self'\n    case 38009:                     // 'element' 'ancestor-or-self'\n    case 38072:                     // 'namespace' 'ancestor-or-self'\n    case 38104:                     // 'processing-instruction' 'ancestor-or-self'\n    case 39506:                     // 'attribute' 'append'\n    case 39545:                     // 'element' 'append'\n    case 39608:                     // 'namespace' 'append'\n    case 39640:                     // 'processing-instruction' 'append'\n    case 40018:                     // 'attribute' 'array'\n    case 40057:                     // 'element' 'array'\n    case 42066:                     // 'attribute' 'attribute'\n    case 42105:                     // 'element' 'attribute'\n    case 42168:                     // 'namespace' 'attribute'\n    case 42200:                     // 'processing-instruction' 'attribute'\n    case 42578:                     // 'attribute' 'base-uri'\n    case 42617:                     // 'element' 'base-uri'\n    case 42680:                     // 'namespace' 'base-uri'\n    case 42712:                     // 'processing-instruction' 'base-uri'\n    case 43602:                     // 'attribute' 'boundary-space'\n    case 43641:                     // 'element' 'boundary-space'\n    case 43704:                     // 'namespace' 'boundary-space'\n    case 43736:                     // 'processing-instruction' 'boundary-space'\n    case 44114:                     // 'attribute' 'break'\n    case 44153:                     // 'element' 'break'\n    case 44216:                     // 'namespace' 'break'\n    case 44248:                     // 'processing-instruction' 'break'\n    case 46674:                     // 'attribute' 'catch'\n    case 46713:                     // 'element' 'catch'\n    case 46776:                     // 'namespace' 'catch'\n    case 46808:                     // 'processing-instruction' 'catch'\n    case 47698:                     // 'attribute' 'child'\n    case 47737:                     // 'element' 'child'\n    case 47800:                     // 'namespace' 'child'\n    case 47832:                     // 'processing-instruction' 'child'\n    case 49234:                     // 'attribute' 'comment'\n    case 49273:                     // 'element' 'comment'\n    case 49336:                     // 'namespace' 'comment'\n    case 49368:                     // 'processing-instruction' 'comment'\n    case 49746:                     // 'attribute' 'constraint'\n    case 49785:                     // 'element' 'constraint'\n    case 49848:                     // 'namespace' 'constraint'\n    case 49880:                     // 'processing-instruction' 'constraint'\n    case 50258:                     // 'attribute' 'construction'\n    case 50297:                     // 'element' 'construction'\n    case 50360:                     // 'namespace' 'construction'\n    case 50392:                     // 'processing-instruction' 'construction'\n    case 51794:                     // 'attribute' 'context'\n    case 51833:                     // 'element' 'context'\n    case 51896:                     // 'namespace' 'context'\n    case 51928:                     // 'processing-instruction' 'context'\n    case 52306:                     // 'attribute' 'continue'\n    case 52345:                     // 'element' 'continue'\n    case 52408:                     // 'namespace' 'continue'\n    case 52440:                     // 'processing-instruction' 'continue'\n    case 52818:                     // 'attribute' 'copy'\n    case 52857:                     // 'element' 'copy'\n    case 52920:                     // 'namespace' 'copy'\n    case 52952:                     // 'processing-instruction' 'copy'\n    case 53330:                     // 'attribute' 'copy-namespaces'\n    case 53369:                     // 'element' 'copy-namespaces'\n    case 53432:                     // 'namespace' 'copy-namespaces'\n    case 53464:                     // 'processing-instruction' 'copy-namespaces'\n    case 54354:                     // 'attribute' 'decimal-format'\n    case 54393:                     // 'element' 'decimal-format'\n    case 54456:                     // 'namespace' 'decimal-format'\n    case 54488:                     // 'processing-instruction' 'decimal-format'\n    case 55378:                     // 'attribute' 'declare'\n    case 55417:                     // 'element' 'declare'\n    case 55480:                     // 'namespace' 'declare'\n    case 55512:                     // 'processing-instruction' 'declare'\n    case 56402:                     // 'attribute' 'delete'\n    case 56441:                     // 'element' 'delete'\n    case 56504:                     // 'namespace' 'delete'\n    case 56536:                     // 'processing-instruction' 'delete'\n    case 56914:                     // 'attribute' 'descendant'\n    case 56953:                     // 'element' 'descendant'\n    case 57016:                     // 'namespace' 'descendant'\n    case 57048:                     // 'processing-instruction' 'descendant'\n    case 57426:                     // 'attribute' 'descendant-or-self'\n    case 57465:                     // 'element' 'descendant-or-self'\n    case 57528:                     // 'namespace' 'descendant-or-self'\n    case 57560:                     // 'processing-instruction' 'descendant-or-self'\n    case 61010:                     // 'attribute' 'document'\n    case 61049:                     // 'element' 'document'\n    case 61112:                     // 'namespace' 'document'\n    case 61144:                     // 'processing-instruction' 'document'\n    case 61522:                     // 'attribute' 'document-node'\n    case 61561:                     // 'element' 'document-node'\n    case 61624:                     // 'namespace' 'document-node'\n    case 61656:                     // 'processing-instruction' 'document-node'\n    case 62034:                     // 'attribute' 'element'\n    case 62073:                     // 'element' 'element'\n    case 62136:                     // 'namespace' 'element'\n    case 62168:                     // 'processing-instruction' 'element'\n    case 63570:                     // 'attribute' 'empty-sequence'\n    case 63609:                     // 'element' 'empty-sequence'\n    case 63672:                     // 'namespace' 'empty-sequence'\n    case 63704:                     // 'processing-instruction' 'empty-sequence'\n    case 64082:                     // 'attribute' 'encoding'\n    case 64121:                     // 'element' 'encoding'\n    case 64184:                     // 'namespace' 'encoding'\n    case 64216:                     // 'processing-instruction' 'encoding'\n    case 66130:                     // 'attribute' 'every'\n    case 66169:                     // 'element' 'every'\n    case 66232:                     // 'namespace' 'every'\n    case 66264:                     // 'processing-instruction' 'every'\n    case 67666:                     // 'attribute' 'exit'\n    case 67705:                     // 'element' 'exit'\n    case 67768:                     // 'namespace' 'exit'\n    case 67800:                     // 'processing-instruction' 'exit'\n    case 68178:                     // 'attribute' 'external'\n    case 68217:                     // 'element' 'external'\n    case 68280:                     // 'namespace' 'external'\n    case 68312:                     // 'processing-instruction' 'external'\n    case 68690:                     // 'attribute' 'first'\n    case 68729:                     // 'element' 'first'\n    case 68792:                     // 'namespace' 'first'\n    case 68824:                     // 'processing-instruction' 'first'\n    case 69202:                     // 'attribute' 'following'\n    case 69241:                     // 'element' 'following'\n    case 69304:                     // 'namespace' 'following'\n    case 69336:                     // 'processing-instruction' 'following'\n    case 69714:                     // 'attribute' 'following-sibling'\n    case 69753:                     // 'element' 'following-sibling'\n    case 69816:                     // 'namespace' 'following-sibling'\n    case 69848:                     // 'processing-instruction' 'following-sibling'\n    case 72274:                     // 'attribute' 'ft-option'\n    case 72313:                     // 'element' 'ft-option'\n    case 72376:                     // 'namespace' 'ft-option'\n    case 72408:                     // 'processing-instruction' 'ft-option'\n    case 74322:                     // 'attribute' 'function'\n    case 74361:                     // 'element' 'function'\n    case 74424:                     // 'namespace' 'function'\n    case 74456:                     // 'processing-instruction' 'function'\n    case 77906:                     // 'attribute' 'if'\n    case 77945:                     // 'element' 'if'\n    case 78008:                     // 'namespace' 'if'\n    case 78040:                     // 'processing-instruction' 'if'\n    case 78418:                     // 'attribute' 'import'\n    case 78457:                     // 'element' 'import'\n    case 78520:                     // 'namespace' 'import'\n    case 78552:                     // 'processing-instruction' 'import'\n    case 78930:                     // 'attribute' 'in'\n    case 78969:                     // 'element' 'in'\n    case 79032:                     // 'namespace' 'in'\n    case 79064:                     // 'processing-instruction' 'in'\n    case 79442:                     // 'attribute' 'index'\n    case 79481:                     // 'element' 'index'\n    case 79544:                     // 'namespace' 'index'\n    case 79576:                     // 'processing-instruction' 'index'\n    case 81490:                     // 'attribute' 'insert'\n    case 81529:                     // 'element' 'insert'\n    case 81592:                     // 'namespace' 'insert'\n    case 81624:                     // 'processing-instruction' 'insert'\n    case 82514:                     // 'attribute' 'integrity'\n    case 82553:                     // 'element' 'integrity'\n    case 82616:                     // 'namespace' 'integrity'\n    case 82648:                     // 'processing-instruction' 'integrity'\n    case 84562:                     // 'attribute' 'item'\n    case 84601:                     // 'element' 'item'\n    case 84664:                     // 'namespace' 'item'\n    case 84696:                     // 'processing-instruction' 'item'\n    case 85074:                     // 'attribute' 'json'\n    case 85113:                     // 'element' 'json'\n    case 85176:                     // 'namespace' 'json'\n    case 85208:                     // 'processing-instruction' 'json'\n    case 85586:                     // 'attribute' 'json-item'\n    case 85625:                     // 'element' 'json-item'\n    case 87122:                     // 'attribute' 'last'\n    case 87161:                     // 'element' 'last'\n    case 87224:                     // 'namespace' 'last'\n    case 87256:                     // 'processing-instruction' 'last'\n    case 87634:                     // 'attribute' 'lax'\n    case 87673:                     // 'element' 'lax'\n    case 87736:                     // 'namespace' 'lax'\n    case 87768:                     // 'processing-instruction' 'lax'\n    case 90194:                     // 'attribute' 'loop'\n    case 90233:                     // 'element' 'loop'\n    case 90296:                     // 'namespace' 'loop'\n    case 90328:                     // 'processing-instruction' 'loop'\n    case 93266:                     // 'attribute' 'module'\n    case 93305:                     // 'element' 'module'\n    case 93368:                     // 'namespace' 'module'\n    case 93400:                     // 'processing-instruction' 'module'\n    case 94290:                     // 'attribute' 'namespace'\n    case 94329:                     // 'element' 'namespace'\n    case 94392:                     // 'namespace' 'namespace'\n    case 94424:                     // 'processing-instruction' 'namespace'\n    case 94802:                     // 'attribute' 'namespace-node'\n    case 94841:                     // 'element' 'namespace-node'\n    case 94904:                     // 'namespace' 'namespace-node'\n    case 94936:                     // 'processing-instruction' 'namespace-node'\n    case 97874:                     // 'attribute' 'node'\n    case 97913:                     // 'element' 'node'\n    case 97976:                     // 'namespace' 'node'\n    case 98008:                     // 'processing-instruction' 'node'\n    case 98386:                     // 'attribute' 'nodes'\n    case 98425:                     // 'element' 'nodes'\n    case 98488:                     // 'namespace' 'nodes'\n    case 98520:                     // 'processing-instruction' 'nodes'\n    case 99410:                     // 'attribute' 'object'\n    case 99449:                     // 'element' 'object'\n    case 99512:                     // 'namespace' 'object'\n    case 99544:                     // 'processing-instruction' 'object'\n    case 101970:                    // 'attribute' 'option'\n    case 102009:                    // 'element' 'option'\n    case 102072:                    // 'namespace' 'option'\n    case 102104:                    // 'processing-instruction' 'option'\n    case 103506:                    // 'attribute' 'ordered'\n    case 103545:                    // 'element' 'ordered'\n    case 103608:                    // 'namespace' 'ordered'\n    case 103640:                    // 'processing-instruction' 'ordered'\n    case 104018:                    // 'attribute' 'ordering'\n    case 104057:                    // 'element' 'ordering'\n    case 104120:                    // 'namespace' 'ordering'\n    case 104152:                    // 'processing-instruction' 'ordering'\n    case 105554:                    // 'attribute' 'parent'\n    case 105593:                    // 'element' 'parent'\n    case 105656:                    // 'namespace' 'parent'\n    case 105688:                    // 'processing-instruction' 'parent'\n    case 108626:                    // 'attribute' 'preceding'\n    case 108665:                    // 'element' 'preceding'\n    case 108728:                    // 'namespace' 'preceding'\n    case 108760:                    // 'processing-instruction' 'preceding'\n    case 109138:                    // 'attribute' 'preceding-sibling'\n    case 109177:                    // 'element' 'preceding-sibling'\n    case 109240:                    // 'namespace' 'preceding-sibling'\n    case 109272:                    // 'processing-instruction' 'preceding-sibling'\n    case 110674:                    // 'attribute' 'processing-instruction'\n    case 110713:                    // 'element' 'processing-instruction'\n    case 110776:                    // 'namespace' 'processing-instruction'\n    case 110808:                    // 'processing-instruction' 'processing-instruction'\n    case 111698:                    // 'attribute' 'rename'\n    case 111737:                    // 'element' 'rename'\n    case 111800:                    // 'namespace' 'rename'\n    case 111832:                    // 'processing-instruction' 'rename'\n    case 112210:                    // 'attribute' 'replace'\n    case 112249:                    // 'element' 'replace'\n    case 112312:                    // 'namespace' 'replace'\n    case 112344:                    // 'processing-instruction' 'replace'\n    case 113234:                    // 'attribute' 'returning'\n    case 113273:                    // 'element' 'returning'\n    case 113336:                    // 'namespace' 'returning'\n    case 113368:                    // 'processing-instruction' 'returning'\n    case 113746:                    // 'attribute' 'revalidation'\n    case 113785:                    // 'element' 'revalidation'\n    case 113848:                    // 'namespace' 'revalidation'\n    case 113880:                    // 'processing-instruction' 'revalidation'\n    case 115282:                    // 'attribute' 'schema'\n    case 115321:                    // 'element' 'schema'\n    case 115384:                    // 'namespace' 'schema'\n    case 115416:                    // 'processing-instruction' 'schema'\n    case 115794:                    // 'attribute' 'schema-attribute'\n    case 115833:                    // 'element' 'schema-attribute'\n    case 115896:                    // 'namespace' 'schema-attribute'\n    case 115928:                    // 'processing-instruction' 'schema-attribute'\n    case 116306:                    // 'attribute' 'schema-element'\n    case 116345:                    // 'element' 'schema-element'\n    case 116408:                    // 'namespace' 'schema-element'\n    case 116440:                    // 'processing-instruction' 'schema-element'\n    case 116818:                    // 'attribute' 'score'\n    case 116857:                    // 'element' 'score'\n    case 116920:                    // 'namespace' 'score'\n    case 116952:                    // 'processing-instruction' 'score'\n    case 117330:                    // 'attribute' 'self'\n    case 117369:                    // 'element' 'self'\n    case 117432:                    // 'namespace' 'self'\n    case 117464:                    // 'processing-instruction' 'self'\n    case 119890:                    // 'attribute' 'sliding'\n    case 119929:                    // 'element' 'sliding'\n    case 119992:                    // 'namespace' 'sliding'\n    case 120024:                    // 'processing-instruction' 'sliding'\n    case 120402:                    // 'attribute' 'some'\n    case 120441:                    // 'element' 'some'\n    case 120504:                    // 'namespace' 'some'\n    case 120536:                    // 'processing-instruction' 'some'\n    case 122962:                    // 'attribute' 'strict'\n    case 123001:                    // 'element' 'strict'\n    case 123064:                    // 'namespace' 'strict'\n    case 123096:                    // 'processing-instruction' 'strict'\n    case 123986:                    // 'attribute' 'structured-item'\n    case 124025:                    // 'element' 'structured-item'\n    case 124498:                    // 'attribute' 'switch'\n    case 124537:                    // 'element' 'switch'\n    case 124600:                    // 'namespace' 'switch'\n    case 124632:                    // 'processing-instruction' 'switch'\n    case 125010:                    // 'attribute' 'text'\n    case 125049:                    // 'element' 'text'\n    case 125112:                    // 'namespace' 'text'\n    case 125144:                    // 'processing-instruction' 'text'\n    case 128082:                    // 'attribute' 'try'\n    case 128121:                    // 'element' 'try'\n    case 128184:                    // 'namespace' 'try'\n    case 128216:                    // 'processing-instruction' 'try'\n    case 128594:                    // 'attribute' 'tumbling'\n    case 128633:                    // 'element' 'tumbling'\n    case 128696:                    // 'namespace' 'tumbling'\n    case 128728:                    // 'processing-instruction' 'tumbling'\n    case 129106:                    // 'attribute' 'type'\n    case 129145:                    // 'element' 'type'\n    case 129208:                    // 'namespace' 'type'\n    case 129240:                    // 'processing-instruction' 'type'\n    case 129618:                    // 'attribute' 'typeswitch'\n    case 129657:                    // 'element' 'typeswitch'\n    case 129720:                    // 'namespace' 'typeswitch'\n    case 129752:                    // 'processing-instruction' 'typeswitch'\n    case 131154:                    // 'attribute' 'unordered'\n    case 131193:                    // 'element' 'unordered'\n    case 131256:                    // 'namespace' 'unordered'\n    case 131288:                    // 'processing-instruction' 'unordered'\n    case 131666:                    // 'attribute' 'updating'\n    case 131705:                    // 'element' 'updating'\n    case 131768:                    // 'namespace' 'updating'\n    case 131800:                    // 'processing-instruction' 'updating'\n    case 133202:                    // 'attribute' 'validate'\n    case 133241:                    // 'element' 'validate'\n    case 133304:                    // 'namespace' 'validate'\n    case 133336:                    // 'processing-instruction' 'validate'\n    case 133714:                    // 'attribute' 'value'\n    case 133753:                    // 'element' 'value'\n    case 133816:                    // 'namespace' 'value'\n    case 133848:                    // 'processing-instruction' 'value'\n    case 134226:                    // 'attribute' 'variable'\n    case 134265:                    // 'element' 'variable'\n    case 134328:                    // 'namespace' 'variable'\n    case 134360:                    // 'processing-instruction' 'variable'\n    case 134738:                    // 'attribute' 'version'\n    case 134777:                    // 'element' 'version'\n    case 134840:                    // 'namespace' 'version'\n    case 134872:                    // 'processing-instruction' 'version'\n    case 136786:                    // 'attribute' 'while'\n    case 136825:                    // 'element' 'while'\n    case 136888:                    // 'namespace' 'while'\n    case 136920:                    // 'processing-instruction' 'while'\n    case 140370:                    // 'attribute' 'xquery'\n    case 140409:                    // 'element' 'xquery'\n    case 140472:                    // 'namespace' 'xquery'\n    case 140504:                    // 'processing-instruction' 'xquery'\n    case 141394:                    // 'attribute' '{'\n    case 141408:                    // 'comment' '{'\n    case 141431:                    // 'document' '{'\n    case 141433:                    // 'element' '{'\n    case 141496:                    // 'namespace' '{'\n    case 141514:                    // 'ordered' '{'\n    case 141528:                    // 'processing-instruction' '{'\n    case 141556:                    // 'text' '{'\n    case 141568:                    // 'unordered' '{'\n      parse_PostfixExpr();\n      break;\n    default:\n      parse_AxisStep();\n    }\n    eventHandler.endNonterminal(\"StepExpr\", e0);\n  }\n\n  function try_StepExpr()\n  {\n    switch (l1)\n    {\n    case 82:                        // 'attribute'\n      lookahead2W(285);             // EQName^Token | S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' |\n      break;\n    case 121:                       // 'element'\n      lookahead2W(283);             // EQName^Token | S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' |\n      break;\n    case 184:                       // 'namespace'\n    case 216:                       // 'processing-instruction'\n      lookahead2W(282);             // NCName^Token | S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' |\n      break;\n    case 96:                        // 'comment'\n    case 119:                       // 'document'\n    case 202:                       // 'ordered'\n    case 244:                       // 'text'\n    case 256:                       // 'unordered'\n      lookahead2W(247);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    case 78:                        // 'array'\n    case 124:                       // 'empty-sequence'\n    case 152:                       // 'if'\n    case 165:                       // 'item'\n    case 167:                       // 'json-item'\n    case 242:                       // 'structured-item'\n    case 243:                       // 'switch'\n    case 253:                       // 'typeswitch'\n      lookahead2W(240);             // S^WS | EOF | '!' | '!=' | '#' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' |\n      break;\n    case 73:                        // 'ancestor'\n    case 74:                        // 'ancestor-or-self'\n    case 93:                        // 'child'\n    case 111:                       // 'descendant'\n    case 112:                       // 'descendant-or-self'\n    case 135:                       // 'following'\n    case 136:                       // 'following-sibling'\n    case 206:                       // 'parent'\n    case 212:                       // 'preceding'\n    case 213:                       // 'preceding-sibling'\n    case 229:                       // 'self'\n      lookahead2W(246);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    case 6:                         // EQName^Token\n    case 70:                        // 'after'\n    case 72:                        // 'allowing'\n    case 75:                        // 'and'\n    case 77:                        // 'append'\n    case 79:                        // 'as'\n    case 80:                        // 'ascending'\n    case 81:                        // 'at'\n    case 83:                        // 'base-uri'\n    case 84:                        // 'before'\n    case 85:                        // 'boundary-space'\n    case 86:                        // 'break'\n    case 88:                        // 'case'\n    case 89:                        // 'cast'\n    case 90:                        // 'castable'\n    case 91:                        // 'catch'\n    case 94:                        // 'collation'\n    case 97:                        // 'constraint'\n    case 98:                        // 'construction'\n    case 101:                       // 'context'\n    case 102:                       // 'continue'\n    case 103:                       // 'copy'\n    case 104:                       // 'copy-namespaces'\n    case 105:                       // 'count'\n    case 106:                       // 'decimal-format'\n    case 108:                       // 'declare'\n    case 109:                       // 'default'\n    case 110:                       // 'delete'\n    case 113:                       // 'descending'\n    case 118:                       // 'div'\n    case 120:                       // 'document-node'\n    case 122:                       // 'else'\n    case 123:                       // 'empty'\n    case 125:                       // 'encoding'\n    case 126:                       // 'end'\n    case 128:                       // 'eq'\n    case 129:                       // 'every'\n    case 131:                       // 'except'\n    case 132:                       // 'exit'\n    case 133:                       // 'external'\n    case 134:                       // 'first'\n    case 137:                       // 'for'\n    case 141:                       // 'ft-option'\n    case 145:                       // 'function'\n    case 146:                       // 'ge'\n    case 148:                       // 'group'\n    case 150:                       // 'gt'\n    case 151:                       // 'idiv'\n    case 153:                       // 'import'\n    case 154:                       // 'in'\n    case 155:                       // 'index'\n    case 159:                       // 'insert'\n    case 160:                       // 'instance'\n    case 161:                       // 'integrity'\n    case 162:                       // 'intersect'\n    case 163:                       // 'into'\n    case 164:                       // 'is'\n    case 166:                       // 'json'\n    case 170:                       // 'last'\n    case 171:                       // 'lax'\n    case 172:                       // 'le'\n    case 174:                       // 'let'\n    case 176:                       // 'loop'\n    case 178:                       // 'lt'\n    case 180:                       // 'mod'\n    case 181:                       // 'modify'\n    case 182:                       // 'module'\n    case 185:                       // 'namespace-node'\n    case 186:                       // 'ne'\n    case 191:                       // 'node'\n    case 192:                       // 'nodes'\n    case 194:                       // 'object'\n    case 198:                       // 'only'\n    case 199:                       // 'option'\n    case 200:                       // 'or'\n    case 201:                       // 'order'\n    case 203:                       // 'ordering'\n    case 218:                       // 'rename'\n    case 219:                       // 'replace'\n    case 220:                       // 'return'\n    case 221:                       // 'returning'\n    case 222:                       // 'revalidation'\n    case 224:                       // 'satisfies'\n    case 225:                       // 'schema'\n    case 226:                       // 'schema-attribute'\n    case 227:                       // 'schema-element'\n    case 228:                       // 'score'\n    case 234:                       // 'sliding'\n    case 235:                       // 'some'\n    case 236:                       // 'stable'\n    case 237:                       // 'start'\n    case 240:                       // 'strict'\n    case 248:                       // 'to'\n    case 249:                       // 'treat'\n    case 250:                       // 'try'\n    case 251:                       // 'tumbling'\n    case 252:                       // 'type'\n    case 254:                       // 'union'\n    case 257:                       // 'updating'\n    case 260:                       // 'validate'\n    case 261:                       // 'value'\n    case 262:                       // 'variable'\n    case 263:                       // 'version'\n    case 266:                       // 'where'\n    case 267:                       // 'while'\n    case 270:                       // 'with'\n    case 274:                       // 'xquery'\n      lookahead2W(244);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 35922                 // 'attribute' 'after'\n     || lk == 35961                 // 'element' 'after'\n     || lk == 36024                 // 'namespace' 'after'\n     || lk == 36056                 // 'processing-instruction' 'after'\n     || lk == 38482                 // 'attribute' 'and'\n     || lk == 38521                 // 'element' 'and'\n     || lk == 38584                 // 'namespace' 'and'\n     || lk == 38616                 // 'processing-instruction' 'and'\n     || lk == 40530                 // 'attribute' 'as'\n     || lk == 40569                 // 'element' 'as'\n     || lk == 40632                 // 'namespace' 'as'\n     || lk == 40664                 // 'processing-instruction' 'as'\n     || lk == 41042                 // 'attribute' 'ascending'\n     || lk == 41081                 // 'element' 'ascending'\n     || lk == 41144                 // 'namespace' 'ascending'\n     || lk == 41176                 // 'processing-instruction' 'ascending'\n     || lk == 41554                 // 'attribute' 'at'\n     || lk == 41593                 // 'element' 'at'\n     || lk == 41656                 // 'namespace' 'at'\n     || lk == 41688                 // 'processing-instruction' 'at'\n     || lk == 43090                 // 'attribute' 'before'\n     || lk == 43129                 // 'element' 'before'\n     || lk == 43192                 // 'namespace' 'before'\n     || lk == 43224                 // 'processing-instruction' 'before'\n     || lk == 45138                 // 'attribute' 'case'\n     || lk == 45177                 // 'element' 'case'\n     || lk == 45240                 // 'namespace' 'case'\n     || lk == 45272                 // 'processing-instruction' 'case'\n     || lk == 45650                 // 'attribute' 'cast'\n     || lk == 45689                 // 'element' 'cast'\n     || lk == 45752                 // 'namespace' 'cast'\n     || lk == 45784                 // 'processing-instruction' 'cast'\n     || lk == 46162                 // 'attribute' 'castable'\n     || lk == 46201                 // 'element' 'castable'\n     || lk == 46264                 // 'namespace' 'castable'\n     || lk == 46296                 // 'processing-instruction' 'castable'\n     || lk == 48210                 // 'attribute' 'collation'\n     || lk == 48249                 // 'element' 'collation'\n     || lk == 48312                 // 'namespace' 'collation'\n     || lk == 48344                 // 'processing-instruction' 'collation'\n     || lk == 53842                 // 'attribute' 'count'\n     || lk == 53881                 // 'element' 'count'\n     || lk == 53944                 // 'namespace' 'count'\n     || lk == 53976                 // 'processing-instruction' 'count'\n     || lk == 55890                 // 'attribute' 'default'\n     || lk == 55929                 // 'element' 'default'\n     || lk == 55992                 // 'namespace' 'default'\n     || lk == 56024                 // 'processing-instruction' 'default'\n     || lk == 57938                 // 'attribute' 'descending'\n     || lk == 57977                 // 'element' 'descending'\n     || lk == 58040                 // 'namespace' 'descending'\n     || lk == 58072                 // 'processing-instruction' 'descending'\n     || lk == 60498                 // 'attribute' 'div'\n     || lk == 60537                 // 'element' 'div'\n     || lk == 60600                 // 'namespace' 'div'\n     || lk == 60632                 // 'processing-instruction' 'div'\n     || lk == 62546                 // 'attribute' 'else'\n     || lk == 62585                 // 'element' 'else'\n     || lk == 62648                 // 'namespace' 'else'\n     || lk == 62680                 // 'processing-instruction' 'else'\n     || lk == 63058                 // 'attribute' 'empty'\n     || lk == 63097                 // 'element' 'empty'\n     || lk == 63160                 // 'namespace' 'empty'\n     || lk == 63192                 // 'processing-instruction' 'empty'\n     || lk == 64594                 // 'attribute' 'end'\n     || lk == 64633                 // 'element' 'end'\n     || lk == 64696                 // 'namespace' 'end'\n     || lk == 64728                 // 'processing-instruction' 'end'\n     || lk == 65618                 // 'attribute' 'eq'\n     || lk == 65657                 // 'element' 'eq'\n     || lk == 65720                 // 'namespace' 'eq'\n     || lk == 65752                 // 'processing-instruction' 'eq'\n     || lk == 67154                 // 'attribute' 'except'\n     || lk == 67193                 // 'element' 'except'\n     || lk == 67256                 // 'namespace' 'except'\n     || lk == 67288                 // 'processing-instruction' 'except'\n     || lk == 70226                 // 'attribute' 'for'\n     || lk == 70265                 // 'element' 'for'\n     || lk == 70328                 // 'namespace' 'for'\n     || lk == 70360                 // 'processing-instruction' 'for'\n     || lk == 74834                 // 'attribute' 'ge'\n     || lk == 74873                 // 'element' 'ge'\n     || lk == 74936                 // 'namespace' 'ge'\n     || lk == 74968                 // 'processing-instruction' 'ge'\n     || lk == 75858                 // 'attribute' 'group'\n     || lk == 75897                 // 'element' 'group'\n     || lk == 75960                 // 'namespace' 'group'\n     || lk == 75992                 // 'processing-instruction' 'group'\n     || lk == 76882                 // 'attribute' 'gt'\n     || lk == 76921                 // 'element' 'gt'\n     || lk == 76984                 // 'namespace' 'gt'\n     || lk == 77016                 // 'processing-instruction' 'gt'\n     || lk == 77394                 // 'attribute' 'idiv'\n     || lk == 77433                 // 'element' 'idiv'\n     || lk == 77496                 // 'namespace' 'idiv'\n     || lk == 77528                 // 'processing-instruction' 'idiv'\n     || lk == 82002                 // 'attribute' 'instance'\n     || lk == 82041                 // 'element' 'instance'\n     || lk == 82104                 // 'namespace' 'instance'\n     || lk == 82136                 // 'processing-instruction' 'instance'\n     || lk == 83026                 // 'attribute' 'intersect'\n     || lk == 83065                 // 'element' 'intersect'\n     || lk == 83128                 // 'namespace' 'intersect'\n     || lk == 83160                 // 'processing-instruction' 'intersect'\n     || lk == 83538                 // 'attribute' 'into'\n     || lk == 83577                 // 'element' 'into'\n     || lk == 83640                 // 'namespace' 'into'\n     || lk == 83672                 // 'processing-instruction' 'into'\n     || lk == 84050                 // 'attribute' 'is'\n     || lk == 84089                 // 'element' 'is'\n     || lk == 84152                 // 'namespace' 'is'\n     || lk == 84184                 // 'processing-instruction' 'is'\n     || lk == 88146                 // 'attribute' 'le'\n     || lk == 88185                 // 'element' 'le'\n     || lk == 88248                 // 'namespace' 'le'\n     || lk == 88280                 // 'processing-instruction' 'le'\n     || lk == 89170                 // 'attribute' 'let'\n     || lk == 89209                 // 'element' 'let'\n     || lk == 89272                 // 'namespace' 'let'\n     || lk == 89304                 // 'processing-instruction' 'let'\n     || lk == 91218                 // 'attribute' 'lt'\n     || lk == 91257                 // 'element' 'lt'\n     || lk == 91320                 // 'namespace' 'lt'\n     || lk == 91352                 // 'processing-instruction' 'lt'\n     || lk == 92242                 // 'attribute' 'mod'\n     || lk == 92281                 // 'element' 'mod'\n     || lk == 92344                 // 'namespace' 'mod'\n     || lk == 92376                 // 'processing-instruction' 'mod'\n     || lk == 92754                 // 'attribute' 'modify'\n     || lk == 92793                 // 'element' 'modify'\n     || lk == 92856                 // 'namespace' 'modify'\n     || lk == 92888                 // 'processing-instruction' 'modify'\n     || lk == 95314                 // 'attribute' 'ne'\n     || lk == 95353                 // 'element' 'ne'\n     || lk == 95416                 // 'namespace' 'ne'\n     || lk == 95448                 // 'processing-instruction' 'ne'\n     || lk == 101458                // 'attribute' 'only'\n     || lk == 101497                // 'element' 'only'\n     || lk == 101560                // 'namespace' 'only'\n     || lk == 101592                // 'processing-instruction' 'only'\n     || lk == 102482                // 'attribute' 'or'\n     || lk == 102521                // 'element' 'or'\n     || lk == 102584                // 'namespace' 'or'\n     || lk == 102616                // 'processing-instruction' 'or'\n     || lk == 102994                // 'attribute' 'order'\n     || lk == 103033                // 'element' 'order'\n     || lk == 103096                // 'namespace' 'order'\n     || lk == 103128                // 'processing-instruction' 'order'\n     || lk == 112722                // 'attribute' 'return'\n     || lk == 112761                // 'element' 'return'\n     || lk == 112824                // 'namespace' 'return'\n     || lk == 112856                // 'processing-instruction' 'return'\n     || lk == 114770                // 'attribute' 'satisfies'\n     || lk == 114809                // 'element' 'satisfies'\n     || lk == 114872                // 'namespace' 'satisfies'\n     || lk == 114904                // 'processing-instruction' 'satisfies'\n     || lk == 120914                // 'attribute' 'stable'\n     || lk == 120953                // 'element' 'stable'\n     || lk == 121016                // 'namespace' 'stable'\n     || lk == 121048                // 'processing-instruction' 'stable'\n     || lk == 121426                // 'attribute' 'start'\n     || lk == 121465                // 'element' 'start'\n     || lk == 121528                // 'namespace' 'start'\n     || lk == 121560                // 'processing-instruction' 'start'\n     || lk == 127058                // 'attribute' 'to'\n     || lk == 127097                // 'element' 'to'\n     || lk == 127160                // 'namespace' 'to'\n     || lk == 127192                // 'processing-instruction' 'to'\n     || lk == 127570                // 'attribute' 'treat'\n     || lk == 127609                // 'element' 'treat'\n     || lk == 127672                // 'namespace' 'treat'\n     || lk == 127704                // 'processing-instruction' 'treat'\n     || lk == 130130                // 'attribute' 'union'\n     || lk == 130169                // 'element' 'union'\n     || lk == 130232                // 'namespace' 'union'\n     || lk == 130264                // 'processing-instruction' 'union'\n     || lk == 136274                // 'attribute' 'where'\n     || lk == 136313                // 'element' 'where'\n     || lk == 136376                // 'namespace' 'where'\n     || lk == 136408                // 'processing-instruction' 'where'\n     || lk == 138322                // 'attribute' 'with'\n     || lk == 138361                // 'element' 'with'\n     || lk == 138424                // 'namespace' 'with'\n     || lk == 138456)               // 'processing-instruction' 'with'\n    {\n      lk = memoized(4, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_PostfixExpr();\n          memoize(4, e0A, -1);\n          lk = -3;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(4, e0A, -2);\n        }\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n    case 8:                         // IntegerLiteral\n    case 9:                         // DecimalLiteral\n    case 10:                        // DoubleLiteral\n    case 11:                        // StringLiteral\n    case 31:                        // '$'\n    case 32:                        // '%'\n    case 34:                        // '('\n    case 44:                        // '.'\n    case 54:                        // '<'\n    case 55:                        // '<!--'\n    case 59:                        // '<?'\n    case 68:                        // '['\n    case 276:                       // '{'\n    case 278:                       // '{|'\n    case 3154:                      // 'attribute' EQName^Token\n    case 3193:                      // 'element' EQName^Token\n    case 9912:                      // 'namespace' NCName^Token\n    case 9944:                      // 'processing-instruction' NCName^Token\n    case 14854:                     // EQName^Token '#'\n    case 14918:                     // 'after' '#'\n    case 14920:                     // 'allowing' '#'\n    case 14921:                     // 'ancestor' '#'\n    case 14922:                     // 'ancestor-or-self' '#'\n    case 14923:                     // 'and' '#'\n    case 14925:                     // 'append' '#'\n    case 14926:                     // 'array' '#'\n    case 14927:                     // 'as' '#'\n    case 14928:                     // 'ascending' '#'\n    case 14929:                     // 'at' '#'\n    case 14930:                     // 'attribute' '#'\n    case 14931:                     // 'base-uri' '#'\n    case 14932:                     // 'before' '#'\n    case 14933:                     // 'boundary-space' '#'\n    case 14934:                     // 'break' '#'\n    case 14936:                     // 'case' '#'\n    case 14937:                     // 'cast' '#'\n    case 14938:                     // 'castable' '#'\n    case 14939:                     // 'catch' '#'\n    case 14941:                     // 'child' '#'\n    case 14942:                     // 'collation' '#'\n    case 14944:                     // 'comment' '#'\n    case 14945:                     // 'constraint' '#'\n    case 14946:                     // 'construction' '#'\n    case 14949:                     // 'context' '#'\n    case 14950:                     // 'continue' '#'\n    case 14951:                     // 'copy' '#'\n    case 14952:                     // 'copy-namespaces' '#'\n    case 14953:                     // 'count' '#'\n    case 14954:                     // 'decimal-format' '#'\n    case 14956:                     // 'declare' '#'\n    case 14957:                     // 'default' '#'\n    case 14958:                     // 'delete' '#'\n    case 14959:                     // 'descendant' '#'\n    case 14960:                     // 'descendant-or-self' '#'\n    case 14961:                     // 'descending' '#'\n    case 14966:                     // 'div' '#'\n    case 14967:                     // 'document' '#'\n    case 14968:                     // 'document-node' '#'\n    case 14969:                     // 'element' '#'\n    case 14970:                     // 'else' '#'\n    case 14971:                     // 'empty' '#'\n    case 14972:                     // 'empty-sequence' '#'\n    case 14973:                     // 'encoding' '#'\n    case 14974:                     // 'end' '#'\n    case 14976:                     // 'eq' '#'\n    case 14977:                     // 'every' '#'\n    case 14979:                     // 'except' '#'\n    case 14980:                     // 'exit' '#'\n    case 14981:                     // 'external' '#'\n    case 14982:                     // 'first' '#'\n    case 14983:                     // 'following' '#'\n    case 14984:                     // 'following-sibling' '#'\n    case 14985:                     // 'for' '#'\n    case 14989:                     // 'ft-option' '#'\n    case 14993:                     // 'function' '#'\n    case 14994:                     // 'ge' '#'\n    case 14996:                     // 'group' '#'\n    case 14998:                     // 'gt' '#'\n    case 14999:                     // 'idiv' '#'\n    case 15000:                     // 'if' '#'\n    case 15001:                     // 'import' '#'\n    case 15002:                     // 'in' '#'\n    case 15003:                     // 'index' '#'\n    case 15007:                     // 'insert' '#'\n    case 15008:                     // 'instance' '#'\n    case 15009:                     // 'integrity' '#'\n    case 15010:                     // 'intersect' '#'\n    case 15011:                     // 'into' '#'\n    case 15012:                     // 'is' '#'\n    case 15013:                     // 'item' '#'\n    case 15014:                     // 'json' '#'\n    case 15015:                     // 'json-item' '#'\n    case 15018:                     // 'last' '#'\n    case 15019:                     // 'lax' '#'\n    case 15020:                     // 'le' '#'\n    case 15022:                     // 'let' '#'\n    case 15024:                     // 'loop' '#'\n    case 15026:                     // 'lt' '#'\n    case 15028:                     // 'mod' '#'\n    case 15029:                     // 'modify' '#'\n    case 15030:                     // 'module' '#'\n    case 15032:                     // 'namespace' '#'\n    case 15033:                     // 'namespace-node' '#'\n    case 15034:                     // 'ne' '#'\n    case 15039:                     // 'node' '#'\n    case 15040:                     // 'nodes' '#'\n    case 15042:                     // 'object' '#'\n    case 15046:                     // 'only' '#'\n    case 15047:                     // 'option' '#'\n    case 15048:                     // 'or' '#'\n    case 15049:                     // 'order' '#'\n    case 15050:                     // 'ordered' '#'\n    case 15051:                     // 'ordering' '#'\n    case 15054:                     // 'parent' '#'\n    case 15060:                     // 'preceding' '#'\n    case 15061:                     // 'preceding-sibling' '#'\n    case 15064:                     // 'processing-instruction' '#'\n    case 15066:                     // 'rename' '#'\n    case 15067:                     // 'replace' '#'\n    case 15068:                     // 'return' '#'\n    case 15069:                     // 'returning' '#'\n    case 15070:                     // 'revalidation' '#'\n    case 15072:                     // 'satisfies' '#'\n    case 15073:                     // 'schema' '#'\n    case 15074:                     // 'schema-attribute' '#'\n    case 15075:                     // 'schema-element' '#'\n    case 15076:                     // 'score' '#'\n    case 15077:                     // 'self' '#'\n    case 15082:                     // 'sliding' '#'\n    case 15083:                     // 'some' '#'\n    case 15084:                     // 'stable' '#'\n    case 15085:                     // 'start' '#'\n    case 15088:                     // 'strict' '#'\n    case 15090:                     // 'structured-item' '#'\n    case 15091:                     // 'switch' '#'\n    case 15092:                     // 'text' '#'\n    case 15096:                     // 'to' '#'\n    case 15097:                     // 'treat' '#'\n    case 15098:                     // 'try' '#'\n    case 15099:                     // 'tumbling' '#'\n    case 15100:                     // 'type' '#'\n    case 15101:                     // 'typeswitch' '#'\n    case 15102:                     // 'union' '#'\n    case 15104:                     // 'unordered' '#'\n    case 15105:                     // 'updating' '#'\n    case 15108:                     // 'validate' '#'\n    case 15109:                     // 'value' '#'\n    case 15110:                     // 'variable' '#'\n    case 15111:                     // 'version' '#'\n    case 15114:                     // 'where' '#'\n    case 15115:                     // 'while' '#'\n    case 15118:                     // 'with' '#'\n    case 15122:                     // 'xquery' '#'\n    case 17414:                     // EQName^Token '('\n    case 17478:                     // 'after' '('\n    case 17480:                     // 'allowing' '('\n    case 17481:                     // 'ancestor' '('\n    case 17482:                     // 'ancestor-or-self' '('\n    case 17483:                     // 'and' '('\n    case 17485:                     // 'append' '('\n    case 17487:                     // 'as' '('\n    case 17488:                     // 'ascending' '('\n    case 17489:                     // 'at' '('\n    case 17491:                     // 'base-uri' '('\n    case 17492:                     // 'before' '('\n    case 17493:                     // 'boundary-space' '('\n    case 17494:                     // 'break' '('\n    case 17496:                     // 'case' '('\n    case 17497:                     // 'cast' '('\n    case 17498:                     // 'castable' '('\n    case 17499:                     // 'catch' '('\n    case 17501:                     // 'child' '('\n    case 17502:                     // 'collation' '('\n    case 17505:                     // 'constraint' '('\n    case 17506:                     // 'construction' '('\n    case 17509:                     // 'context' '('\n    case 17510:                     // 'continue' '('\n    case 17511:                     // 'copy' '('\n    case 17512:                     // 'copy-namespaces' '('\n    case 17513:                     // 'count' '('\n    case 17514:                     // 'decimal-format' '('\n    case 17516:                     // 'declare' '('\n    case 17517:                     // 'default' '('\n    case 17518:                     // 'delete' '('\n    case 17519:                     // 'descendant' '('\n    case 17520:                     // 'descendant-or-self' '('\n    case 17521:                     // 'descending' '('\n    case 17526:                     // 'div' '('\n    case 17527:                     // 'document' '('\n    case 17530:                     // 'else' '('\n    case 17531:                     // 'empty' '('\n    case 17533:                     // 'encoding' '('\n    case 17534:                     // 'end' '('\n    case 17536:                     // 'eq' '('\n    case 17537:                     // 'every' '('\n    case 17539:                     // 'except' '('\n    case 17540:                     // 'exit' '('\n    case 17541:                     // 'external' '('\n    case 17542:                     // 'first' '('\n    case 17543:                     // 'following' '('\n    case 17544:                     // 'following-sibling' '('\n    case 17545:                     // 'for' '('\n    case 17549:                     // 'ft-option' '('\n    case 17553:                     // 'function' '('\n    case 17554:                     // 'ge' '('\n    case 17556:                     // 'group' '('\n    case 17558:                     // 'gt' '('\n    case 17559:                     // 'idiv' '('\n    case 17561:                     // 'import' '('\n    case 17562:                     // 'in' '('\n    case 17563:                     // 'index' '('\n    case 17567:                     // 'insert' '('\n    case 17568:                     // 'instance' '('\n    case 17569:                     // 'integrity' '('\n    case 17570:                     // 'intersect' '('\n    case 17571:                     // 'into' '('\n    case 17572:                     // 'is' '('\n    case 17574:                     // 'json' '('\n    case 17578:                     // 'last' '('\n    case 17579:                     // 'lax' '('\n    case 17580:                     // 'le' '('\n    case 17582:                     // 'let' '('\n    case 17584:                     // 'loop' '('\n    case 17586:                     // 'lt' '('\n    case 17588:                     // 'mod' '('\n    case 17589:                     // 'modify' '('\n    case 17590:                     // 'module' '('\n    case 17592:                     // 'namespace' '('\n    case 17594:                     // 'ne' '('\n    case 17600:                     // 'nodes' '('\n    case 17602:                     // 'object' '('\n    case 17606:                     // 'only' '('\n    case 17607:                     // 'option' '('\n    case 17608:                     // 'or' '('\n    case 17609:                     // 'order' '('\n    case 17610:                     // 'ordered' '('\n    case 17611:                     // 'ordering' '('\n    case 17614:                     // 'parent' '('\n    case 17620:                     // 'preceding' '('\n    case 17621:                     // 'preceding-sibling' '('\n    case 17626:                     // 'rename' '('\n    case 17627:                     // 'replace' '('\n    case 17628:                     // 'return' '('\n    case 17629:                     // 'returning' '('\n    case 17630:                     // 'revalidation' '('\n    case 17632:                     // 'satisfies' '('\n    case 17633:                     // 'schema' '('\n    case 17636:                     // 'score' '('\n    case 17637:                     // 'self' '('\n    case 17642:                     // 'sliding' '('\n    case 17643:                     // 'some' '('\n    case 17644:                     // 'stable' '('\n    case 17645:                     // 'start' '('\n    case 17648:                     // 'strict' '('\n    case 17656:                     // 'to' '('\n    case 17657:                     // 'treat' '('\n    case 17658:                     // 'try' '('\n    case 17659:                     // 'tumbling' '('\n    case 17660:                     // 'type' '('\n    case 17662:                     // 'union' '('\n    case 17664:                     // 'unordered' '('\n    case 17665:                     // 'updating' '('\n    case 17668:                     // 'validate' '('\n    case 17669:                     // 'value' '('\n    case 17670:                     // 'variable' '('\n    case 17671:                     // 'version' '('\n    case 17674:                     // 'where' '('\n    case 17675:                     // 'while' '('\n    case 17678:                     // 'with' '('\n    case 17682:                     // 'xquery' '('\n    case 36946:                     // 'attribute' 'allowing'\n    case 36985:                     // 'element' 'allowing'\n    case 37048:                     // 'namespace' 'allowing'\n    case 37080:                     // 'processing-instruction' 'allowing'\n    case 37458:                     // 'attribute' 'ancestor'\n    case 37497:                     // 'element' 'ancestor'\n    case 37560:                     // 'namespace' 'ancestor'\n    case 37592:                     // 'processing-instruction' 'ancestor'\n    case 37970:                     // 'attribute' 'ancestor-or-self'\n    case 38009:                     // 'element' 'ancestor-or-self'\n    case 38072:                     // 'namespace' 'ancestor-or-self'\n    case 38104:                     // 'processing-instruction' 'ancestor-or-self'\n    case 39506:                     // 'attribute' 'append'\n    case 39545:                     // 'element' 'append'\n    case 39608:                     // 'namespace' 'append'\n    case 39640:                     // 'processing-instruction' 'append'\n    case 40018:                     // 'attribute' 'array'\n    case 40057:                     // 'element' 'array'\n    case 42066:                     // 'attribute' 'attribute'\n    case 42105:                     // 'element' 'attribute'\n    case 42168:                     // 'namespace' 'attribute'\n    case 42200:                     // 'processing-instruction' 'attribute'\n    case 42578:                     // 'attribute' 'base-uri'\n    case 42617:                     // 'element' 'base-uri'\n    case 42680:                     // 'namespace' 'base-uri'\n    case 42712:                     // 'processing-instruction' 'base-uri'\n    case 43602:                     // 'attribute' 'boundary-space'\n    case 43641:                     // 'element' 'boundary-space'\n    case 43704:                     // 'namespace' 'boundary-space'\n    case 43736:                     // 'processing-instruction' 'boundary-space'\n    case 44114:                     // 'attribute' 'break'\n    case 44153:                     // 'element' 'break'\n    case 44216:                     // 'namespace' 'break'\n    case 44248:                     // 'processing-instruction' 'break'\n    case 46674:                     // 'attribute' 'catch'\n    case 46713:                     // 'element' 'catch'\n    case 46776:                     // 'namespace' 'catch'\n    case 46808:                     // 'processing-instruction' 'catch'\n    case 47698:                     // 'attribute' 'child'\n    case 47737:                     // 'element' 'child'\n    case 47800:                     // 'namespace' 'child'\n    case 47832:                     // 'processing-instruction' 'child'\n    case 49234:                     // 'attribute' 'comment'\n    case 49273:                     // 'element' 'comment'\n    case 49336:                     // 'namespace' 'comment'\n    case 49368:                     // 'processing-instruction' 'comment'\n    case 49746:                     // 'attribute' 'constraint'\n    case 49785:                     // 'element' 'constraint'\n    case 49848:                     // 'namespace' 'constraint'\n    case 49880:                     // 'processing-instruction' 'constraint'\n    case 50258:                     // 'attribute' 'construction'\n    case 50297:                     // 'element' 'construction'\n    case 50360:                     // 'namespace' 'construction'\n    case 50392:                     // 'processing-instruction' 'construction'\n    case 51794:                     // 'attribute' 'context'\n    case 51833:                     // 'element' 'context'\n    case 51896:                     // 'namespace' 'context'\n    case 51928:                     // 'processing-instruction' 'context'\n    case 52306:                     // 'attribute' 'continue'\n    case 52345:                     // 'element' 'continue'\n    case 52408:                     // 'namespace' 'continue'\n    case 52440:                     // 'processing-instruction' 'continue'\n    case 52818:                     // 'attribute' 'copy'\n    case 52857:                     // 'element' 'copy'\n    case 52920:                     // 'namespace' 'copy'\n    case 52952:                     // 'processing-instruction' 'copy'\n    case 53330:                     // 'attribute' 'copy-namespaces'\n    case 53369:                     // 'element' 'copy-namespaces'\n    case 53432:                     // 'namespace' 'copy-namespaces'\n    case 53464:                     // 'processing-instruction' 'copy-namespaces'\n    case 54354:                     // 'attribute' 'decimal-format'\n    case 54393:                     // 'element' 'decimal-format'\n    case 54456:                     // 'namespace' 'decimal-format'\n    case 54488:                     // 'processing-instruction' 'decimal-format'\n    case 55378:                     // 'attribute' 'declare'\n    case 55417:                     // 'element' 'declare'\n    case 55480:                     // 'namespace' 'declare'\n    case 55512:                     // 'processing-instruction' 'declare'\n    case 56402:                     // 'attribute' 'delete'\n    case 56441:                     // 'element' 'delete'\n    case 56504:                     // 'namespace' 'delete'\n    case 56536:                     // 'processing-instruction' 'delete'\n    case 56914:                     // 'attribute' 'descendant'\n    case 56953:                     // 'element' 'descendant'\n    case 57016:                     // 'namespace' 'descendant'\n    case 57048:                     // 'processing-instruction' 'descendant'\n    case 57426:                     // 'attribute' 'descendant-or-self'\n    case 57465:                     // 'element' 'descendant-or-self'\n    case 57528:                     // 'namespace' 'descendant-or-self'\n    case 57560:                     // 'processing-instruction' 'descendant-or-self'\n    case 61010:                     // 'attribute' 'document'\n    case 61049:                     // 'element' 'document'\n    case 61112:                     // 'namespace' 'document'\n    case 61144:                     // 'processing-instruction' 'document'\n    case 61522:                     // 'attribute' 'document-node'\n    case 61561:                     // 'element' 'document-node'\n    case 61624:                     // 'namespace' 'document-node'\n    case 61656:                     // 'processing-instruction' 'document-node'\n    case 62034:                     // 'attribute' 'element'\n    case 62073:                     // 'element' 'element'\n    case 62136:                     // 'namespace' 'element'\n    case 62168:                     // 'processing-instruction' 'element'\n    case 63570:                     // 'attribute' 'empty-sequence'\n    case 63609:                     // 'element' 'empty-sequence'\n    case 63672:                     // 'namespace' 'empty-sequence'\n    case 63704:                     // 'processing-instruction' 'empty-sequence'\n    case 64082:                     // 'attribute' 'encoding'\n    case 64121:                     // 'element' 'encoding'\n    case 64184:                     // 'namespace' 'encoding'\n    case 64216:                     // 'processing-instruction' 'encoding'\n    case 66130:                     // 'attribute' 'every'\n    case 66169:                     // 'element' 'every'\n    case 66232:                     // 'namespace' 'every'\n    case 66264:                     // 'processing-instruction' 'every'\n    case 67666:                     // 'attribute' 'exit'\n    case 67705:                     // 'element' 'exit'\n    case 67768:                     // 'namespace' 'exit'\n    case 67800:                     // 'processing-instruction' 'exit'\n    case 68178:                     // 'attribute' 'external'\n    case 68217:                     // 'element' 'external'\n    case 68280:                     // 'namespace' 'external'\n    case 68312:                     // 'processing-instruction' 'external'\n    case 68690:                     // 'attribute' 'first'\n    case 68729:                     // 'element' 'first'\n    case 68792:                     // 'namespace' 'first'\n    case 68824:                     // 'processing-instruction' 'first'\n    case 69202:                     // 'attribute' 'following'\n    case 69241:                     // 'element' 'following'\n    case 69304:                     // 'namespace' 'following'\n    case 69336:                     // 'processing-instruction' 'following'\n    case 69714:                     // 'attribute' 'following-sibling'\n    case 69753:                     // 'element' 'following-sibling'\n    case 69816:                     // 'namespace' 'following-sibling'\n    case 69848:                     // 'processing-instruction' 'following-sibling'\n    case 72274:                     // 'attribute' 'ft-option'\n    case 72313:                     // 'element' 'ft-option'\n    case 72376:                     // 'namespace' 'ft-option'\n    case 72408:                     // 'processing-instruction' 'ft-option'\n    case 74322:                     // 'attribute' 'function'\n    case 74361:                     // 'element' 'function'\n    case 74424:                     // 'namespace' 'function'\n    case 74456:                     // 'processing-instruction' 'function'\n    case 77906:                     // 'attribute' 'if'\n    case 77945:                     // 'element' 'if'\n    case 78008:                     // 'namespace' 'if'\n    case 78040:                     // 'processing-instruction' 'if'\n    case 78418:                     // 'attribute' 'import'\n    case 78457:                     // 'element' 'import'\n    case 78520:                     // 'namespace' 'import'\n    case 78552:                     // 'processing-instruction' 'import'\n    case 78930:                     // 'attribute' 'in'\n    case 78969:                     // 'element' 'in'\n    case 79032:                     // 'namespace' 'in'\n    case 79064:                     // 'processing-instruction' 'in'\n    case 79442:                     // 'attribute' 'index'\n    case 79481:                     // 'element' 'index'\n    case 79544:                     // 'namespace' 'index'\n    case 79576:                     // 'processing-instruction' 'index'\n    case 81490:                     // 'attribute' 'insert'\n    case 81529:                     // 'element' 'insert'\n    case 81592:                     // 'namespace' 'insert'\n    case 81624:                     // 'processing-instruction' 'insert'\n    case 82514:                     // 'attribute' 'integrity'\n    case 82553:                     // 'element' 'integrity'\n    case 82616:                     // 'namespace' 'integrity'\n    case 82648:                     // 'processing-instruction' 'integrity'\n    case 84562:                     // 'attribute' 'item'\n    case 84601:                     // 'element' 'item'\n    case 84664:                     // 'namespace' 'item'\n    case 84696:                     // 'processing-instruction' 'item'\n    case 85074:                     // 'attribute' 'json'\n    case 85113:                     // 'element' 'json'\n    case 85176:                     // 'namespace' 'json'\n    case 85208:                     // 'processing-instruction' 'json'\n    case 85586:                     // 'attribute' 'json-item'\n    case 85625:                     // 'element' 'json-item'\n    case 87122:                     // 'attribute' 'last'\n    case 87161:                     // 'element' 'last'\n    case 87224:                     // 'namespace' 'last'\n    case 87256:                     // 'processing-instruction' 'last'\n    case 87634:                     // 'attribute' 'lax'\n    case 87673:                     // 'element' 'lax'\n    case 87736:                     // 'namespace' 'lax'\n    case 87768:                     // 'processing-instruction' 'lax'\n    case 90194:                     // 'attribute' 'loop'\n    case 90233:                     // 'element' 'loop'\n    case 90296:                     // 'namespace' 'loop'\n    case 90328:                     // 'processing-instruction' 'loop'\n    case 93266:                     // 'attribute' 'module'\n    case 93305:                     // 'element' 'module'\n    case 93368:                     // 'namespace' 'module'\n    case 93400:                     // 'processing-instruction' 'module'\n    case 94290:                     // 'attribute' 'namespace'\n    case 94329:                     // 'element' 'namespace'\n    case 94392:                     // 'namespace' 'namespace'\n    case 94424:                     // 'processing-instruction' 'namespace'\n    case 94802:                     // 'attribute' 'namespace-node'\n    case 94841:                     // 'element' 'namespace-node'\n    case 94904:                     // 'namespace' 'namespace-node'\n    case 94936:                     // 'processing-instruction' 'namespace-node'\n    case 97874:                     // 'attribute' 'node'\n    case 97913:                     // 'element' 'node'\n    case 97976:                     // 'namespace' 'node'\n    case 98008:                     // 'processing-instruction' 'node'\n    case 98386:                     // 'attribute' 'nodes'\n    case 98425:                     // 'element' 'nodes'\n    case 98488:                     // 'namespace' 'nodes'\n    case 98520:                     // 'processing-instruction' 'nodes'\n    case 99410:                     // 'attribute' 'object'\n    case 99449:                     // 'element' 'object'\n    case 99512:                     // 'namespace' 'object'\n    case 99544:                     // 'processing-instruction' 'object'\n    case 101970:                    // 'attribute' 'option'\n    case 102009:                    // 'element' 'option'\n    case 102072:                    // 'namespace' 'option'\n    case 102104:                    // 'processing-instruction' 'option'\n    case 103506:                    // 'attribute' 'ordered'\n    case 103545:                    // 'element' 'ordered'\n    case 103608:                    // 'namespace' 'ordered'\n    case 103640:                    // 'processing-instruction' 'ordered'\n    case 104018:                    // 'attribute' 'ordering'\n    case 104057:                    // 'element' 'ordering'\n    case 104120:                    // 'namespace' 'ordering'\n    case 104152:                    // 'processing-instruction' 'ordering'\n    case 105554:                    // 'attribute' 'parent'\n    case 105593:                    // 'element' 'parent'\n    case 105656:                    // 'namespace' 'parent'\n    case 105688:                    // 'processing-instruction' 'parent'\n    case 108626:                    // 'attribute' 'preceding'\n    case 108665:                    // 'element' 'preceding'\n    case 108728:                    // 'namespace' 'preceding'\n    case 108760:                    // 'processing-instruction' 'preceding'\n    case 109138:                    // 'attribute' 'preceding-sibling'\n    case 109177:                    // 'element' 'preceding-sibling'\n    case 109240:                    // 'namespace' 'preceding-sibling'\n    case 109272:                    // 'processing-instruction' 'preceding-sibling'\n    case 110674:                    // 'attribute' 'processing-instruction'\n    case 110713:                    // 'element' 'processing-instruction'\n    case 110776:                    // 'namespace' 'processing-instruction'\n    case 110808:                    // 'processing-instruction' 'processing-instruction'\n    case 111698:                    // 'attribute' 'rename'\n    case 111737:                    // 'element' 'rename'\n    case 111800:                    // 'namespace' 'rename'\n    case 111832:                    // 'processing-instruction' 'rename'\n    case 112210:                    // 'attribute' 'replace'\n    case 112249:                    // 'element' 'replace'\n    case 112312:                    // 'namespace' 'replace'\n    case 112344:                    // 'processing-instruction' 'replace'\n    case 113234:                    // 'attribute' 'returning'\n    case 113273:                    // 'element' 'returning'\n    case 113336:                    // 'namespace' 'returning'\n    case 113368:                    // 'processing-instruction' 'returning'\n    case 113746:                    // 'attribute' 'revalidation'\n    case 113785:                    // 'element' 'revalidation'\n    case 113848:                    // 'namespace' 'revalidation'\n    case 113880:                    // 'processing-instruction' 'revalidation'\n    case 115282:                    // 'attribute' 'schema'\n    case 115321:                    // 'element' 'schema'\n    case 115384:                    // 'namespace' 'schema'\n    case 115416:                    // 'processing-instruction' 'schema'\n    case 115794:                    // 'attribute' 'schema-attribute'\n    case 115833:                    // 'element' 'schema-attribute'\n    case 115896:                    // 'namespace' 'schema-attribute'\n    case 115928:                    // 'processing-instruction' 'schema-attribute'\n    case 116306:                    // 'attribute' 'schema-element'\n    case 116345:                    // 'element' 'schema-element'\n    case 116408:                    // 'namespace' 'schema-element'\n    case 116440:                    // 'processing-instruction' 'schema-element'\n    case 116818:                    // 'attribute' 'score'\n    case 116857:                    // 'element' 'score'\n    case 116920:                    // 'namespace' 'score'\n    case 116952:                    // 'processing-instruction' 'score'\n    case 117330:                    // 'attribute' 'self'\n    case 117369:                    // 'element' 'self'\n    case 117432:                    // 'namespace' 'self'\n    case 117464:                    // 'processing-instruction' 'self'\n    case 119890:                    // 'attribute' 'sliding'\n    case 119929:                    // 'element' 'sliding'\n    case 119992:                    // 'namespace' 'sliding'\n    case 120024:                    // 'processing-instruction' 'sliding'\n    case 120402:                    // 'attribute' 'some'\n    case 120441:                    // 'element' 'some'\n    case 120504:                    // 'namespace' 'some'\n    case 120536:                    // 'processing-instruction' 'some'\n    case 122962:                    // 'attribute' 'strict'\n    case 123001:                    // 'element' 'strict'\n    case 123064:                    // 'namespace' 'strict'\n    case 123096:                    // 'processing-instruction' 'strict'\n    case 123986:                    // 'attribute' 'structured-item'\n    case 124025:                    // 'element' 'structured-item'\n    case 124498:                    // 'attribute' 'switch'\n    case 124537:                    // 'element' 'switch'\n    case 124600:                    // 'namespace' 'switch'\n    case 124632:                    // 'processing-instruction' 'switch'\n    case 125010:                    // 'attribute' 'text'\n    case 125049:                    // 'element' 'text'\n    case 125112:                    // 'namespace' 'text'\n    case 125144:                    // 'processing-instruction' 'text'\n    case 128082:                    // 'attribute' 'try'\n    case 128121:                    // 'element' 'try'\n    case 128184:                    // 'namespace' 'try'\n    case 128216:                    // 'processing-instruction' 'try'\n    case 128594:                    // 'attribute' 'tumbling'\n    case 128633:                    // 'element' 'tumbling'\n    case 128696:                    // 'namespace' 'tumbling'\n    case 128728:                    // 'processing-instruction' 'tumbling'\n    case 129106:                    // 'attribute' 'type'\n    case 129145:                    // 'element' 'type'\n    case 129208:                    // 'namespace' 'type'\n    case 129240:                    // 'processing-instruction' 'type'\n    case 129618:                    // 'attribute' 'typeswitch'\n    case 129657:                    // 'element' 'typeswitch'\n    case 129720:                    // 'namespace' 'typeswitch'\n    case 129752:                    // 'processing-instruction' 'typeswitch'\n    case 131154:                    // 'attribute' 'unordered'\n    case 131193:                    // 'element' 'unordered'\n    case 131256:                    // 'namespace' 'unordered'\n    case 131288:                    // 'processing-instruction' 'unordered'\n    case 131666:                    // 'attribute' 'updating'\n    case 131705:                    // 'element' 'updating'\n    case 131768:                    // 'namespace' 'updating'\n    case 131800:                    // 'processing-instruction' 'updating'\n    case 133202:                    // 'attribute' 'validate'\n    case 133241:                    // 'element' 'validate'\n    case 133304:                    // 'namespace' 'validate'\n    case 133336:                    // 'processing-instruction' 'validate'\n    case 133714:                    // 'attribute' 'value'\n    case 133753:                    // 'element' 'value'\n    case 133816:                    // 'namespace' 'value'\n    case 133848:                    // 'processing-instruction' 'value'\n    case 134226:                    // 'attribute' 'variable'\n    case 134265:                    // 'element' 'variable'\n    case 134328:                    // 'namespace' 'variable'\n    case 134360:                    // 'processing-instruction' 'variable'\n    case 134738:                    // 'attribute' 'version'\n    case 134777:                    // 'element' 'version'\n    case 134840:                    // 'namespace' 'version'\n    case 134872:                    // 'processing-instruction' 'version'\n    case 136786:                    // 'attribute' 'while'\n    case 136825:                    // 'element' 'while'\n    case 136888:                    // 'namespace' 'while'\n    case 136920:                    // 'processing-instruction' 'while'\n    case 140370:                    // 'attribute' 'xquery'\n    case 140409:                    // 'element' 'xquery'\n    case 140472:                    // 'namespace' 'xquery'\n    case 140504:                    // 'processing-instruction' 'xquery'\n    case 141394:                    // 'attribute' '{'\n    case 141408:                    // 'comment' '{'\n    case 141431:                    // 'document' '{'\n    case 141433:                    // 'element' '{'\n    case 141496:                    // 'namespace' '{'\n    case 141514:                    // 'ordered' '{'\n    case 141528:                    // 'processing-instruction' '{'\n    case 141556:                    // 'text' '{'\n    case 141568:                    // 'unordered' '{'\n      try_PostfixExpr();\n      break;\n    case -3:\n      break;\n    default:\n      try_AxisStep();\n    }\n  }\n\n  function parse_AxisStep()\n  {\n    eventHandler.startNonterminal(\"AxisStep\", e0);\n    switch (l1)\n    {\n    case 73:                        // 'ancestor'\n    case 74:                        // 'ancestor-or-self'\n    case 206:                       // 'parent'\n    case 212:                       // 'preceding'\n    case 213:                       // 'preceding-sibling'\n      lookahead2W(242);             // S^WS | EOF | '!' | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' | ':' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 45:                        // '..'\n    case 26185:                     // 'ancestor' '::'\n    case 26186:                     // 'ancestor-or-self' '::'\n    case 26318:                     // 'parent' '::'\n    case 26324:                     // 'preceding' '::'\n    case 26325:                     // 'preceding-sibling' '::'\n      parse_ReverseStep();\n      break;\n    default:\n      parse_ForwardStep();\n    }\n    lookahead1W(238);               // S^WS | EOF | '!' | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' | ':' |\n    whitespace();\n    parse_PredicateList();\n    eventHandler.endNonterminal(\"AxisStep\", e0);\n  }\n\n  function try_AxisStep()\n  {\n    switch (l1)\n    {\n    case 73:                        // 'ancestor'\n    case 74:                        // 'ancestor-or-self'\n    case 206:                       // 'parent'\n    case 212:                       // 'preceding'\n    case 213:                       // 'preceding-sibling'\n      lookahead2W(242);             // S^WS | EOF | '!' | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' | ':' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 45:                        // '..'\n    case 26185:                     // 'ancestor' '::'\n    case 26186:                     // 'ancestor-or-self' '::'\n    case 26318:                     // 'parent' '::'\n    case 26324:                     // 'preceding' '::'\n    case 26325:                     // 'preceding-sibling' '::'\n      try_ReverseStep();\n      break;\n    default:\n      try_ForwardStep();\n    }\n    lookahead1W(238);               // S^WS | EOF | '!' | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' | ':' |\n    try_PredicateList();\n  }\n\n  function parse_ForwardStep()\n  {\n    eventHandler.startNonterminal(\"ForwardStep\", e0);\n    switch (l1)\n    {\n    case 82:                        // 'attribute'\n      lookahead2W(245);             // S^WS | EOF | '!' | '!=' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' |\n      break;\n    case 93:                        // 'child'\n    case 111:                       // 'descendant'\n    case 112:                       // 'descendant-or-self'\n    case 135:                       // 'following'\n    case 136:                       // 'following-sibling'\n    case 229:                       // 'self'\n      lookahead2W(242);             // S^WS | EOF | '!' | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' | ':' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 26194:                     // 'attribute' '::'\n    case 26205:                     // 'child' '::'\n    case 26223:                     // 'descendant' '::'\n    case 26224:                     // 'descendant-or-self' '::'\n    case 26247:                     // 'following' '::'\n    case 26248:                     // 'following-sibling' '::'\n    case 26341:                     // 'self' '::'\n      parse_ForwardAxis();\n      lookahead1W(257);             // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_NodeTest();\n      break;\n    default:\n      parse_AbbrevForwardStep();\n    }\n    eventHandler.endNonterminal(\"ForwardStep\", e0);\n  }\n\n  function try_ForwardStep()\n  {\n    switch (l1)\n    {\n    case 82:                        // 'attribute'\n      lookahead2W(245);             // S^WS | EOF | '!' | '!=' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' |\n      break;\n    case 93:                        // 'child'\n    case 111:                       // 'descendant'\n    case 112:                       // 'descendant-or-self'\n    case 135:                       // 'following'\n    case 136:                       // 'following-sibling'\n    case 229:                       // 'self'\n      lookahead2W(242);             // S^WS | EOF | '!' | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' | ':' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 26194:                     // 'attribute' '::'\n    case 26205:                     // 'child' '::'\n    case 26223:                     // 'descendant' '::'\n    case 26224:                     // 'descendant-or-self' '::'\n    case 26247:                     // 'following' '::'\n    case 26248:                     // 'following-sibling' '::'\n    case 26341:                     // 'self' '::'\n      try_ForwardAxis();\n      lookahead1W(257);             // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_NodeTest();\n      break;\n    default:\n      try_AbbrevForwardStep();\n    }\n  }\n\n  function parse_ForwardAxis()\n  {\n    eventHandler.startNonterminal(\"ForwardAxis\", e0);\n    switch (l1)\n    {\n    case 93:                        // 'child'\n      shift(93);                    // 'child'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shift(51);                    // '::'\n      break;\n    case 111:                       // 'descendant'\n      shift(111);                   // 'descendant'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shift(51);                    // '::'\n      break;\n    case 82:                        // 'attribute'\n      shift(82);                    // 'attribute'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shift(51);                    // '::'\n      break;\n    case 229:                       // 'self'\n      shift(229);                   // 'self'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shift(51);                    // '::'\n      break;\n    case 112:                       // 'descendant-or-self'\n      shift(112);                   // 'descendant-or-self'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shift(51);                    // '::'\n      break;\n    case 136:                       // 'following-sibling'\n      shift(136);                   // 'following-sibling'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shift(51);                    // '::'\n      break;\n    default:\n      shift(135);                   // 'following'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shift(51);                    // '::'\n    }\n    eventHandler.endNonterminal(\"ForwardAxis\", e0);\n  }\n\n  function try_ForwardAxis()\n  {\n    switch (l1)\n    {\n    case 93:                        // 'child'\n      shiftT(93);                   // 'child'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shiftT(51);                   // '::'\n      break;\n    case 111:                       // 'descendant'\n      shiftT(111);                  // 'descendant'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shiftT(51);                   // '::'\n      break;\n    case 82:                        // 'attribute'\n      shiftT(82);                   // 'attribute'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shiftT(51);                   // '::'\n      break;\n    case 229:                       // 'self'\n      shiftT(229);                  // 'self'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shiftT(51);                   // '::'\n      break;\n    case 112:                       // 'descendant-or-self'\n      shiftT(112);                  // 'descendant-or-self'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shiftT(51);                   // '::'\n      break;\n    case 136:                       // 'following-sibling'\n      shiftT(136);                  // 'following-sibling'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shiftT(51);                   // '::'\n      break;\n    default:\n      shiftT(135);                  // 'following'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shiftT(51);                   // '::'\n    }\n  }\n\n  function parse_AbbrevForwardStep()\n  {\n    eventHandler.startNonterminal(\"AbbrevForwardStep\", e0);\n    if (l1 == 66)                   // '@'\n    {\n      shift(66);                    // '@'\n    }\n    lookahead1W(257);               // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_NodeTest();\n    eventHandler.endNonterminal(\"AbbrevForwardStep\", e0);\n  }\n\n  function try_AbbrevForwardStep()\n  {\n    if (l1 == 66)                   // '@'\n    {\n      shiftT(66);                   // '@'\n    }\n    lookahead1W(257);               // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_NodeTest();\n  }\n\n  function parse_ReverseStep()\n  {\n    eventHandler.startNonterminal(\"ReverseStep\", e0);\n    switch (l1)\n    {\n    case 45:                        // '..'\n      parse_AbbrevReverseStep();\n      break;\n    default:\n      parse_ReverseAxis();\n      lookahead1W(257);             // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_NodeTest();\n    }\n    eventHandler.endNonterminal(\"ReverseStep\", e0);\n  }\n\n  function try_ReverseStep()\n  {\n    switch (l1)\n    {\n    case 45:                        // '..'\n      try_AbbrevReverseStep();\n      break;\n    default:\n      try_ReverseAxis();\n      lookahead1W(257);             // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_NodeTest();\n    }\n  }\n\n  function parse_ReverseAxis()\n  {\n    eventHandler.startNonterminal(\"ReverseAxis\", e0);\n    switch (l1)\n    {\n    case 206:                       // 'parent'\n      shift(206);                   // 'parent'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shift(51);                    // '::'\n      break;\n    case 73:                        // 'ancestor'\n      shift(73);                    // 'ancestor'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shift(51);                    // '::'\n      break;\n    case 213:                       // 'preceding-sibling'\n      shift(213);                   // 'preceding-sibling'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shift(51);                    // '::'\n      break;\n    case 212:                       // 'preceding'\n      shift(212);                   // 'preceding'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shift(51);                    // '::'\n      break;\n    default:\n      shift(74);                    // 'ancestor-or-self'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shift(51);                    // '::'\n    }\n    eventHandler.endNonterminal(\"ReverseAxis\", e0);\n  }\n\n  function try_ReverseAxis()\n  {\n    switch (l1)\n    {\n    case 206:                       // 'parent'\n      shiftT(206);                  // 'parent'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shiftT(51);                   // '::'\n      break;\n    case 73:                        // 'ancestor'\n      shiftT(73);                   // 'ancestor'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shiftT(51);                   // '::'\n      break;\n    case 213:                       // 'preceding-sibling'\n      shiftT(213);                  // 'preceding-sibling'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shiftT(51);                   // '::'\n      break;\n    case 212:                       // 'preceding'\n      shiftT(212);                  // 'preceding'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shiftT(51);                   // '::'\n      break;\n    default:\n      shiftT(74);                   // 'ancestor-or-self'\n      lookahead1W(26);              // S^WS | '(:' | '::'\n      shiftT(51);                   // '::'\n    }\n  }\n\n  function parse_AbbrevReverseStep()\n  {\n    eventHandler.startNonterminal(\"AbbrevReverseStep\", e0);\n    shift(45);                      // '..'\n    eventHandler.endNonterminal(\"AbbrevReverseStep\", e0);\n  }\n\n  function try_AbbrevReverseStep()\n  {\n    shiftT(45);                     // '..'\n  }\n\n  function parse_NodeTest()\n  {\n    eventHandler.startNonterminal(\"NodeTest\", e0);\n    switch (l1)\n    {\n    case 82:                        // 'attribute'\n    case 96:                        // 'comment'\n    case 120:                       // 'document-node'\n    case 121:                       // 'element'\n    case 185:                       // 'namespace-node'\n    case 191:                       // 'node'\n    case 216:                       // 'processing-instruction'\n    case 226:                       // 'schema-attribute'\n    case 227:                       // 'schema-element'\n    case 244:                       // 'text'\n      lookahead2W(241);             // S^WS | EOF | '!' | '!=' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 17490:                     // 'attribute' '('\n    case 17504:                     // 'comment' '('\n    case 17528:                     // 'document-node' '('\n    case 17529:                     // 'element' '('\n    case 17593:                     // 'namespace-node' '('\n    case 17599:                     // 'node' '('\n    case 17624:                     // 'processing-instruction' '('\n    case 17634:                     // 'schema-attribute' '('\n    case 17635:                     // 'schema-element' '('\n    case 17652:                     // 'text' '('\n      parse_KindTest();\n      break;\n    default:\n      parse_NameTest();\n    }\n    eventHandler.endNonterminal(\"NodeTest\", e0);\n  }\n\n  function try_NodeTest()\n  {\n    switch (l1)\n    {\n    case 82:                        // 'attribute'\n    case 96:                        // 'comment'\n    case 120:                       // 'document-node'\n    case 121:                       // 'element'\n    case 185:                       // 'namespace-node'\n    case 191:                       // 'node'\n    case 216:                       // 'processing-instruction'\n    case 226:                       // 'schema-attribute'\n    case 227:                       // 'schema-element'\n    case 244:                       // 'text'\n      lookahead2W(241);             // S^WS | EOF | '!' | '!=' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 17490:                     // 'attribute' '('\n    case 17504:                     // 'comment' '('\n    case 17528:                     // 'document-node' '('\n    case 17529:                     // 'element' '('\n    case 17593:                     // 'namespace-node' '('\n    case 17599:                     // 'node' '('\n    case 17624:                     // 'processing-instruction' '('\n    case 17634:                     // 'schema-attribute' '('\n    case 17635:                     // 'schema-element' '('\n    case 17652:                     // 'text' '('\n      try_KindTest();\n      break;\n    default:\n      try_NameTest();\n    }\n  }\n\n  function parse_NameTest()\n  {\n    eventHandler.startNonterminal(\"NameTest\", e0);\n    switch (l1)\n    {\n    case 5:                         // Wildcard\n      shift(5);                     // Wildcard\n      break;\n    default:\n      parse_EQName();\n    }\n    eventHandler.endNonterminal(\"NameTest\", e0);\n  }\n\n  function try_NameTest()\n  {\n    switch (l1)\n    {\n    case 5:                         // Wildcard\n      shiftT(5);                    // Wildcard\n      break;\n    default:\n      try_EQName();\n    }\n  }\n\n  function parse_PostfixExpr()\n  {\n    eventHandler.startNonterminal(\"PostfixExpr\", e0);\n    parse_PrimaryExpr();\n    for (;;)\n    {\n      lookahead1W(241);             // S^WS | EOF | '!' | '!=' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' |\n      if (l1 != 34                  // '('\n       && l1 != 68)                 // '['\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 68:                      // '['\n        whitespace();\n        parse_Predicate();\n        break;\n      default:\n        whitespace();\n        parse_ArgumentList();\n      }\n    }\n    eventHandler.endNonterminal(\"PostfixExpr\", e0);\n  }\n\n  function try_PostfixExpr()\n  {\n    try_PrimaryExpr();\n    for (;;)\n    {\n      lookahead1W(241);             // S^WS | EOF | '!' | '!=' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' |\n      if (l1 != 34                  // '('\n       && l1 != 68)                 // '['\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 68:                      // '['\n        try_Predicate();\n        break;\n      default:\n        try_ArgumentList();\n      }\n    }\n  }\n\n  function parse_ArgumentList()\n  {\n    eventHandler.startNonterminal(\"ArgumentList\", e0);\n    shift(34);                      // '('\n    lookahead1W(276);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    if (l1 != 37)                   // ')'\n    {\n      whitespace();\n      parse_Argument();\n      for (;;)\n      {\n        lookahead1W(101);           // S^WS | '(:' | ')' | ','\n        if (l1 != 41)               // ','\n        {\n          break;\n        }\n        shift(41);                  // ','\n        lookahead1W(271);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        whitespace();\n        parse_Argument();\n      }\n    }\n    shift(37);                      // ')'\n    eventHandler.endNonterminal(\"ArgumentList\", e0);\n  }\n\n  function try_ArgumentList()\n  {\n    shiftT(34);                     // '('\n    lookahead1W(276);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    if (l1 != 37)                   // ')'\n    {\n      try_Argument();\n      for (;;)\n      {\n        lookahead1W(101);           // S^WS | '(:' | ')' | ','\n        if (l1 != 41)               // ','\n        {\n          break;\n        }\n        shiftT(41);                 // ','\n        lookahead1W(271);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        try_Argument();\n      }\n    }\n    shiftT(37);                     // ')'\n  }\n\n  function parse_PredicateList()\n  {\n    eventHandler.startNonterminal(\"PredicateList\", e0);\n    for (;;)\n    {\n      lookahead1W(238);             // S^WS | EOF | '!' | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' | ':' |\n      if (l1 != 68)                 // '['\n      {\n        break;\n      }\n      whitespace();\n      parse_Predicate();\n    }\n    eventHandler.endNonterminal(\"PredicateList\", e0);\n  }\n\n  function try_PredicateList()\n  {\n    for (;;)\n    {\n      lookahead1W(238);             // S^WS | EOF | '!' | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' | '//' | ':' |\n      if (l1 != 68)                 // '['\n      {\n        break;\n      }\n      try_Predicate();\n    }\n  }\n\n  function parse_Predicate()\n  {\n    eventHandler.startNonterminal(\"Predicate\", e0);\n    shift(68);                      // '['\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Expr();\n    shift(69);                      // ']'\n    eventHandler.endNonterminal(\"Predicate\", e0);\n  }\n\n  function try_Predicate()\n  {\n    shiftT(68);                     // '['\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Expr();\n    shiftT(69);                     // ']'\n  }\n\n  function parse_Literal()\n  {\n    eventHandler.startNonterminal(\"Literal\", e0);\n    switch (l1)\n    {\n    case 11:                        // StringLiteral\n      shift(11);                    // StringLiteral\n      break;\n    default:\n      parse_NumericLiteral();\n    }\n    eventHandler.endNonterminal(\"Literal\", e0);\n  }\n\n  function try_Literal()\n  {\n    switch (l1)\n    {\n    case 11:                        // StringLiteral\n      shiftT(11);                   // StringLiteral\n      break;\n    default:\n      try_NumericLiteral();\n    }\n  }\n\n  function parse_NumericLiteral()\n  {\n    eventHandler.startNonterminal(\"NumericLiteral\", e0);\n    switch (l1)\n    {\n    case 8:                         // IntegerLiteral\n      shift(8);                     // IntegerLiteral\n      break;\n    case 9:                         // DecimalLiteral\n      shift(9);                     // DecimalLiteral\n      break;\n    default:\n      shift(10);                    // DoubleLiteral\n    }\n    eventHandler.endNonterminal(\"NumericLiteral\", e0);\n  }\n\n  function try_NumericLiteral()\n  {\n    switch (l1)\n    {\n    case 8:                         // IntegerLiteral\n      shiftT(8);                    // IntegerLiteral\n      break;\n    case 9:                         // DecimalLiteral\n      shiftT(9);                    // DecimalLiteral\n      break;\n    default:\n      shiftT(10);                   // DoubleLiteral\n    }\n  }\n\n  function parse_VarRef()\n  {\n    eventHandler.startNonterminal(\"VarRef\", e0);\n    shift(31);                      // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    eventHandler.endNonterminal(\"VarRef\", e0);\n  }\n\n  function try_VarRef()\n  {\n    shiftT(31);                     // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n  }\n\n  function parse_VarName()\n  {\n    eventHandler.startNonterminal(\"VarName\", e0);\n    parse_EQName();\n    eventHandler.endNonterminal(\"VarName\", e0);\n  }\n\n  function try_VarName()\n  {\n    try_EQName();\n  }\n\n  function parse_ParenthesizedExpr()\n  {\n    eventHandler.startNonterminal(\"ParenthesizedExpr\", e0);\n    shift(34);                      // '('\n    lookahead1W(269);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    if (l1 != 37)                   // ')'\n    {\n      whitespace();\n      parse_Expr();\n    }\n    shift(37);                      // ')'\n    eventHandler.endNonterminal(\"ParenthesizedExpr\", e0);\n  }\n\n  function try_ParenthesizedExpr()\n  {\n    shiftT(34);                     // '('\n    lookahead1W(269);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    if (l1 != 37)                   // ')'\n    {\n      try_Expr();\n    }\n    shiftT(37);                     // ')'\n  }\n\n  function parse_ContextItemExpr()\n  {\n    eventHandler.startNonterminal(\"ContextItemExpr\", e0);\n    shift(44);                      // '.'\n    eventHandler.endNonterminal(\"ContextItemExpr\", e0);\n  }\n\n  function try_ContextItemExpr()\n  {\n    shiftT(44);                     // '.'\n  }\n\n  function parse_OrderedExpr()\n  {\n    eventHandler.startNonterminal(\"OrderedExpr\", e0);\n    shift(202);                     // 'ordered'\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    shift(276);                     // '{'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Expr();\n    shift(282);                     // '}'\n    eventHandler.endNonterminal(\"OrderedExpr\", e0);\n  }\n\n  function try_OrderedExpr()\n  {\n    shiftT(202);                    // 'ordered'\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    shiftT(276);                    // '{'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Expr();\n    shiftT(282);                    // '}'\n  }\n\n  function parse_UnorderedExpr()\n  {\n    eventHandler.startNonterminal(\"UnorderedExpr\", e0);\n    shift(256);                     // 'unordered'\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    shift(276);                     // '{'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Expr();\n    shift(282);                     // '}'\n    eventHandler.endNonterminal(\"UnorderedExpr\", e0);\n  }\n\n  function try_UnorderedExpr()\n  {\n    shiftT(256);                    // 'unordered'\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    shiftT(276);                    // '{'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Expr();\n    shiftT(282);                    // '}'\n  }\n\n  function parse_FunctionCall()\n  {\n    eventHandler.startNonterminal(\"FunctionCall\", e0);\n    parse_FunctionName();\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    whitespace();\n    parse_ArgumentList();\n    eventHandler.endNonterminal(\"FunctionCall\", e0);\n  }\n\n  function try_FunctionCall()\n  {\n    try_FunctionName();\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    try_ArgumentList();\n  }\n\n  function parse_Argument()\n  {\n    eventHandler.startNonterminal(\"Argument\", e0);\n    switch (l1)\n    {\n    case 64:                        // '?'\n      parse_ArgumentPlaceholder();\n      break;\n    default:\n      parse_ExprSingle();\n    }\n    eventHandler.endNonterminal(\"Argument\", e0);\n  }\n\n  function try_Argument()\n  {\n    switch (l1)\n    {\n    case 64:                        // '?'\n      try_ArgumentPlaceholder();\n      break;\n    default:\n      try_ExprSingle();\n    }\n  }\n\n  function parse_ArgumentPlaceholder()\n  {\n    eventHandler.startNonterminal(\"ArgumentPlaceholder\", e0);\n    shift(64);                      // '?'\n    eventHandler.endNonterminal(\"ArgumentPlaceholder\", e0);\n  }\n\n  function try_ArgumentPlaceholder()\n  {\n    shiftT(64);                     // '?'\n  }\n\n  function parse_Constructor()\n  {\n    eventHandler.startNonterminal(\"Constructor\", e0);\n    switch (l1)\n    {\n    case 54:                        // '<'\n    case 55:                        // '<!--'\n    case 59:                        // '<?'\n      parse_DirectConstructor();\n      break;\n    default:\n      parse_ComputedConstructor();\n    }\n    eventHandler.endNonterminal(\"Constructor\", e0);\n  }\n\n  function try_Constructor()\n  {\n    switch (l1)\n    {\n    case 54:                        // '<'\n    case 55:                        // '<!--'\n    case 59:                        // '<?'\n      try_DirectConstructor();\n      break;\n    default:\n      try_ComputedConstructor();\n    }\n  }\n\n  function parse_DirectConstructor()\n  {\n    eventHandler.startNonterminal(\"DirectConstructor\", e0);\n    switch (l1)\n    {\n    case 54:                        // '<'\n      parse_DirElemConstructor();\n      break;\n    case 55:                        // '<!--'\n      parse_DirCommentConstructor();\n      break;\n    default:\n      parse_DirPIConstructor();\n    }\n    eventHandler.endNonterminal(\"DirectConstructor\", e0);\n  }\n\n  function try_DirectConstructor()\n  {\n    switch (l1)\n    {\n    case 54:                        // '<'\n      try_DirElemConstructor();\n      break;\n    case 55:                        // '<!--'\n      try_DirCommentConstructor();\n      break;\n    default:\n      try_DirPIConstructor();\n    }\n  }\n\n  function parse_DirElemConstructor()\n  {\n    eventHandler.startNonterminal(\"DirElemConstructor\", e0);\n    shift(54);                      // '<'\n    lookahead1(4);                  // QName\n    shift(20);                      // QName\n    parse_DirAttributeList();\n    switch (l1)\n    {\n    case 48:                        // '/>'\n      shift(48);                    // '/>'\n      break;\n    default:\n      shift(61);                    // '>'\n      for (;;)\n      {\n        lookahead1(174);            // CDataSection | PredefinedEntityRef | ElementContentChar | CharRef | '<' |\n        if (l1 == 56)               // '</'\n        {\n          break;\n        }\n        parse_DirElemContent();\n      }\n      shift(56);                    // '</'\n      lookahead1(4);                // QName\n      shift(20);                    // QName\n      lookahead1(12);               // S | '>'\n      if (l1 == 21)                 // S\n      {\n        shift(21);                  // S\n      }\n      lookahead1(8);                // '>'\n      shift(61);                    // '>'\n    }\n    eventHandler.endNonterminal(\"DirElemConstructor\", e0);\n  }\n\n  function try_DirElemConstructor()\n  {\n    shiftT(54);                     // '<'\n    lookahead1(4);                  // QName\n    shiftT(20);                     // QName\n    try_DirAttributeList();\n    switch (l1)\n    {\n    case 48:                        // '/>'\n      shiftT(48);                   // '/>'\n      break;\n    default:\n      shiftT(61);                   // '>'\n      for (;;)\n      {\n        lookahead1(174);            // CDataSection | PredefinedEntityRef | ElementContentChar | CharRef | '<' |\n        if (l1 == 56)               // '</'\n        {\n          break;\n        }\n        try_DirElemContent();\n      }\n      shiftT(56);                   // '</'\n      lookahead1(4);                // QName\n      shiftT(20);                   // QName\n      lookahead1(12);               // S | '>'\n      if (l1 == 21)                 // S\n      {\n        shiftT(21);                 // S\n      }\n      lookahead1(8);                // '>'\n      shiftT(61);                   // '>'\n    }\n  }\n\n  function parse_DirAttributeList()\n  {\n    eventHandler.startNonterminal(\"DirAttributeList\", e0);\n    for (;;)\n    {\n      lookahead1(19);               // S | '/>' | '>'\n      if (l1 != 21)                 // S\n      {\n        break;\n      }\n      shift(21);                    // S\n      lookahead1(91);               // QName | S | '/>' | '>'\n      if (l1 == 20)                 // QName\n      {\n        shift(20);                  // QName\n        lookahead1(11);             // S | '='\n        if (l1 == 21)               // S\n        {\n          shift(21);                // S\n        }\n        lookahead1(7);              // '='\n        shift(60);                  // '='\n        lookahead1(18);             // S | '\"' | \"'\"\n        if (l1 == 21)               // S\n        {\n          shift(21);                // S\n        }\n        parse_DirAttributeValue();\n      }\n    }\n    eventHandler.endNonterminal(\"DirAttributeList\", e0);\n  }\n\n  function try_DirAttributeList()\n  {\n    for (;;)\n    {\n      lookahead1(19);               // S | '/>' | '>'\n      if (l1 != 21)                 // S\n      {\n        break;\n      }\n      shiftT(21);                   // S\n      lookahead1(91);               // QName | S | '/>' | '>'\n      if (l1 == 20)                 // QName\n      {\n        shiftT(20);                 // QName\n        lookahead1(11);             // S | '='\n        if (l1 == 21)               // S\n        {\n          shiftT(21);               // S\n        }\n        lookahead1(7);              // '='\n        shiftT(60);                 // '='\n        lookahead1(18);             // S | '\"' | \"'\"\n        if (l1 == 21)               // S\n        {\n          shiftT(21);               // S\n        }\n        try_DirAttributeValue();\n      }\n    }\n  }\n\n  function parse_DirAttributeValue()\n  {\n    eventHandler.startNonterminal(\"DirAttributeValue\", e0);\n    lookahead1(14);                 // '\"' | \"'\"\n    switch (l1)\n    {\n    case 28:                        // '\"'\n      shift(28);                    // '\"'\n      for (;;)\n      {\n        lookahead1(167);            // PredefinedEntityRef | EscapeQuot | QuotAttrContentChar | CharRef | '\"' | '{' |\n        if (l1 == 28)               // '\"'\n        {\n          break;\n        }\n        switch (l1)\n        {\n        case 13:                    // EscapeQuot\n          shift(13);                // EscapeQuot\n          break;\n        default:\n          parse_QuotAttrValueContent();\n        }\n      }\n      shift(28);                    // '\"'\n      break;\n    default:\n      shift(33);                    // \"'\"\n      for (;;)\n      {\n        lookahead1(168);            // PredefinedEntityRef | EscapeApos | AposAttrContentChar | CharRef | \"'\" | '{' |\n        if (l1 == 33)               // \"'\"\n        {\n          break;\n        }\n        switch (l1)\n        {\n        case 14:                    // EscapeApos\n          shift(14);                // EscapeApos\n          break;\n        default:\n          parse_AposAttrValueContent();\n        }\n      }\n      shift(33);                    // \"'\"\n    }\n    eventHandler.endNonterminal(\"DirAttributeValue\", e0);\n  }\n\n  function try_DirAttributeValue()\n  {\n    lookahead1(14);                 // '\"' | \"'\"\n    switch (l1)\n    {\n    case 28:                        // '\"'\n      shiftT(28);                   // '\"'\n      for (;;)\n      {\n        lookahead1(167);            // PredefinedEntityRef | EscapeQuot | QuotAttrContentChar | CharRef | '\"' | '{' |\n        if (l1 == 28)               // '\"'\n        {\n          break;\n        }\n        switch (l1)\n        {\n        case 13:                    // EscapeQuot\n          shiftT(13);               // EscapeQuot\n          break;\n        default:\n          try_QuotAttrValueContent();\n        }\n      }\n      shiftT(28);                   // '\"'\n      break;\n    default:\n      shiftT(33);                   // \"'\"\n      for (;;)\n      {\n        lookahead1(168);            // PredefinedEntityRef | EscapeApos | AposAttrContentChar | CharRef | \"'\" | '{' |\n        if (l1 == 33)               // \"'\"\n        {\n          break;\n        }\n        switch (l1)\n        {\n        case 14:                    // EscapeApos\n          shiftT(14);               // EscapeApos\n          break;\n        default:\n          try_AposAttrValueContent();\n        }\n      }\n      shiftT(33);                   // \"'\"\n    }\n  }\n\n  function parse_QuotAttrValueContent()\n  {\n    eventHandler.startNonterminal(\"QuotAttrValueContent\", e0);\n    switch (l1)\n    {\n    case 16:                        // QuotAttrContentChar\n      shift(16);                    // QuotAttrContentChar\n      break;\n    default:\n      parse_CommonContent();\n    }\n    eventHandler.endNonterminal(\"QuotAttrValueContent\", e0);\n  }\n\n  function try_QuotAttrValueContent()\n  {\n    switch (l1)\n    {\n    case 16:                        // QuotAttrContentChar\n      shiftT(16);                   // QuotAttrContentChar\n      break;\n    default:\n      try_CommonContent();\n    }\n  }\n\n  function parse_AposAttrValueContent()\n  {\n    eventHandler.startNonterminal(\"AposAttrValueContent\", e0);\n    switch (l1)\n    {\n    case 17:                        // AposAttrContentChar\n      shift(17);                    // AposAttrContentChar\n      break;\n    default:\n      parse_CommonContent();\n    }\n    eventHandler.endNonterminal(\"AposAttrValueContent\", e0);\n  }\n\n  function try_AposAttrValueContent()\n  {\n    switch (l1)\n    {\n    case 17:                        // AposAttrContentChar\n      shiftT(17);                   // AposAttrContentChar\n      break;\n    default:\n      try_CommonContent();\n    }\n  }\n\n  function parse_DirElemContent()\n  {\n    eventHandler.startNonterminal(\"DirElemContent\", e0);\n    switch (l1)\n    {\n    case 54:                        // '<'\n    case 55:                        // '<!--'\n    case 59:                        // '<?'\n      parse_DirectConstructor();\n      break;\n    case 4:                         // CDataSection\n      shift(4);                     // CDataSection\n      break;\n    case 15:                        // ElementContentChar\n      shift(15);                    // ElementContentChar\n      break;\n    default:\n      parse_CommonContent();\n    }\n    eventHandler.endNonterminal(\"DirElemContent\", e0);\n  }\n\n  function try_DirElemContent()\n  {\n    switch (l1)\n    {\n    case 54:                        // '<'\n    case 55:                        // '<!--'\n    case 59:                        // '<?'\n      try_DirectConstructor();\n      break;\n    case 4:                         // CDataSection\n      shiftT(4);                    // CDataSection\n      break;\n    case 15:                        // ElementContentChar\n      shiftT(15);                   // ElementContentChar\n      break;\n    default:\n      try_CommonContent();\n    }\n  }\n\n  function parse_DirCommentConstructor()\n  {\n    eventHandler.startNonterminal(\"DirCommentConstructor\", e0);\n    shift(55);                      // '<!--'\n    lookahead1(1);                  // DirCommentContents\n    shift(2);                       // DirCommentContents\n    lookahead1(6);                  // '-->'\n    shift(43);                      // '-->'\n    eventHandler.endNonterminal(\"DirCommentConstructor\", e0);\n  }\n\n  function try_DirCommentConstructor()\n  {\n    shiftT(55);                     // '<!--'\n    lookahead1(1);                  // DirCommentContents\n    shiftT(2);                      // DirCommentContents\n    lookahead1(6);                  // '-->'\n    shiftT(43);                     // '-->'\n  }\n\n  function parse_DirPIConstructor()\n  {\n    eventHandler.startNonterminal(\"DirPIConstructor\", e0);\n    shift(59);                      // '<?'\n    lookahead1(3);                  // PITarget\n    shift(18);                      // PITarget\n    lookahead1(13);                 // S | '?>'\n    if (l1 == 21)                   // S\n    {\n      shift(21);                    // S\n      lookahead1(2);                // DirPIContents\n      shift(3);                     // DirPIContents\n    }\n    lookahead1(9);                  // '?>'\n    shift(65);                      // '?>'\n    eventHandler.endNonterminal(\"DirPIConstructor\", e0);\n  }\n\n  function try_DirPIConstructor()\n  {\n    shiftT(59);                     // '<?'\n    lookahead1(3);                  // PITarget\n    shiftT(18);                     // PITarget\n    lookahead1(13);                 // S | '?>'\n    if (l1 == 21)                   // S\n    {\n      shiftT(21);                   // S\n      lookahead1(2);                // DirPIContents\n      shiftT(3);                    // DirPIContents\n    }\n    lookahead1(9);                  // '?>'\n    shiftT(65);                     // '?>'\n  }\n\n  function parse_ComputedConstructor()\n  {\n    eventHandler.startNonterminal(\"ComputedConstructor\", e0);\n    switch (l1)\n    {\n    case 119:                       // 'document'\n      parse_CompDocConstructor();\n      break;\n    case 121:                       // 'element'\n      parse_CompElemConstructor();\n      break;\n    case 82:                        // 'attribute'\n      parse_CompAttrConstructor();\n      break;\n    case 184:                       // 'namespace'\n      parse_CompNamespaceConstructor();\n      break;\n    case 244:                       // 'text'\n      parse_CompTextConstructor();\n      break;\n    case 96:                        // 'comment'\n      parse_CompCommentConstructor();\n      break;\n    default:\n      parse_CompPIConstructor();\n    }\n    eventHandler.endNonterminal(\"ComputedConstructor\", e0);\n  }\n\n  function try_ComputedConstructor()\n  {\n    switch (l1)\n    {\n    case 119:                       // 'document'\n      try_CompDocConstructor();\n      break;\n    case 121:                       // 'element'\n      try_CompElemConstructor();\n      break;\n    case 82:                        // 'attribute'\n      try_CompAttrConstructor();\n      break;\n    case 184:                       // 'namespace'\n      try_CompNamespaceConstructor();\n      break;\n    case 244:                       // 'text'\n      try_CompTextConstructor();\n      break;\n    case 96:                        // 'comment'\n      try_CompCommentConstructor();\n      break;\n    default:\n      try_CompPIConstructor();\n    }\n  }\n\n  function parse_CompElemConstructor()\n  {\n    eventHandler.startNonterminal(\"CompElemConstructor\", e0);\n    shift(121);                     // 'element'\n    lookahead1W(258);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    switch (l1)\n    {\n    case 276:                       // '{'\n      shift(276);                   // '{'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_Expr();\n      shift(282);                   // '}'\n      break;\n    default:\n      whitespace();\n      parse_EQName();\n    }\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    shift(276);                     // '{'\n    lookahead1W(277);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    if (l1 != 282)                  // '}'\n    {\n      whitespace();\n      parse_ContentExpr();\n    }\n    shift(282);                     // '}'\n    eventHandler.endNonterminal(\"CompElemConstructor\", e0);\n  }\n\n  function try_CompElemConstructor()\n  {\n    shiftT(121);                    // 'element'\n    lookahead1W(258);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    switch (l1)\n    {\n    case 276:                       // '{'\n      shiftT(276);                  // '{'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_Expr();\n      shiftT(282);                  // '}'\n      break;\n    default:\n      try_EQName();\n    }\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    shiftT(276);                    // '{'\n    lookahead1W(277);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    if (l1 != 282)                  // '}'\n    {\n      try_ContentExpr();\n    }\n    shiftT(282);                    // '}'\n  }\n\n  function parse_CompNamespaceConstructor()\n  {\n    eventHandler.startNonterminal(\"CompNamespaceConstructor\", e0);\n    shift(184);                     // 'namespace'\n    lookahead1W(251);               // NCName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    switch (l1)\n    {\n    case 276:                       // '{'\n      shift(276);                   // '{'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_PrefixExpr();\n      shift(282);                   // '}'\n      break;\n    default:\n      whitespace();\n      parse_Prefix();\n    }\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    shift(276);                     // '{'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_URIExpr();\n    shift(282);                     // '}'\n    eventHandler.endNonterminal(\"CompNamespaceConstructor\", e0);\n  }\n\n  function try_CompNamespaceConstructor()\n  {\n    shiftT(184);                    // 'namespace'\n    lookahead1W(251);               // NCName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    switch (l1)\n    {\n    case 276:                       // '{'\n      shiftT(276);                  // '{'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_PrefixExpr();\n      shiftT(282);                  // '}'\n      break;\n    default:\n      try_Prefix();\n    }\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    shiftT(276);                    // '{'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_URIExpr();\n    shiftT(282);                    // '}'\n  }\n\n  function parse_Prefix()\n  {\n    eventHandler.startNonterminal(\"Prefix\", e0);\n    parse_NCName();\n    eventHandler.endNonterminal(\"Prefix\", e0);\n  }\n\n  function try_Prefix()\n  {\n    try_NCName();\n  }\n\n  function parse_PrefixExpr()\n  {\n    eventHandler.startNonterminal(\"PrefixExpr\", e0);\n    parse_Expr();\n    eventHandler.endNonterminal(\"PrefixExpr\", e0);\n  }\n\n  function try_PrefixExpr()\n  {\n    try_Expr();\n  }\n\n  function parse_URIExpr()\n  {\n    eventHandler.startNonterminal(\"URIExpr\", e0);\n    parse_Expr();\n    eventHandler.endNonterminal(\"URIExpr\", e0);\n  }\n\n  function try_URIExpr()\n  {\n    try_Expr();\n  }\n\n  function parse_FunctionItemExpr()\n  {\n    eventHandler.startNonterminal(\"FunctionItemExpr\", e0);\n    switch (l1)\n    {\n    case 145:                       // 'function'\n      lookahead2W(92);              // S^WS | '#' | '(' | '(:'\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 32:                        // '%'\n    case 17553:                     // 'function' '('\n      parse_InlineFunctionExpr();\n      break;\n    default:\n      parse_NamedFunctionRef();\n    }\n    eventHandler.endNonterminal(\"FunctionItemExpr\", e0);\n  }\n\n  function try_FunctionItemExpr()\n  {\n    switch (l1)\n    {\n    case 145:                       // 'function'\n      lookahead2W(92);              // S^WS | '#' | '(' | '(:'\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 32:                        // '%'\n    case 17553:                     // 'function' '('\n      try_InlineFunctionExpr();\n      break;\n    default:\n      try_NamedFunctionRef();\n    }\n  }\n\n  function parse_NamedFunctionRef()\n  {\n    eventHandler.startNonterminal(\"NamedFunctionRef\", e0);\n    parse_EQName();\n    lookahead1W(20);                // S^WS | '#' | '(:'\n    shift(29);                      // '#'\n    lookahead1W(16);                // IntegerLiteral | S^WS | '(:'\n    shift(8);                       // IntegerLiteral\n    eventHandler.endNonterminal(\"NamedFunctionRef\", e0);\n  }\n\n  function try_NamedFunctionRef()\n  {\n    try_EQName();\n    lookahead1W(20);                // S^WS | '#' | '(:'\n    shiftT(29);                     // '#'\n    lookahead1W(16);                // IntegerLiteral | S^WS | '(:'\n    shiftT(8);                      // IntegerLiteral\n  }\n\n  function parse_InlineFunctionExpr()\n  {\n    eventHandler.startNonterminal(\"InlineFunctionExpr\", e0);\n    for (;;)\n    {\n      lookahead1W(97);              // S^WS | '%' | '(:' | 'function'\n      if (l1 != 32)                 // '%'\n      {\n        break;\n      }\n      whitespace();\n      parse_Annotation();\n    }\n    shift(145);                     // 'function'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(94);                // S^WS | '$' | '(:' | ')'\n    if (l1 == 31)                   // '$'\n    {\n      whitespace();\n      parse_ParamList();\n    }\n    shift(37);                      // ')'\n    lookahead1W(111);               // S^WS | '(:' | 'as' | '{'\n    if (l1 == 79)                   // 'as'\n    {\n      shift(79);                    // 'as'\n      lookahead1W(260);             // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_SequenceType();\n    }\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    whitespace();\n    parse_FunctionBody();\n    eventHandler.endNonterminal(\"InlineFunctionExpr\", e0);\n  }\n\n  function try_InlineFunctionExpr()\n  {\n    for (;;)\n    {\n      lookahead1W(97);              // S^WS | '%' | '(:' | 'function'\n      if (l1 != 32)                 // '%'\n      {\n        break;\n      }\n      try_Annotation();\n    }\n    shiftT(145);                    // 'function'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(94);                // S^WS | '$' | '(:' | ')'\n    if (l1 == 31)                   // '$'\n    {\n      try_ParamList();\n    }\n    shiftT(37);                     // ')'\n    lookahead1W(111);               // S^WS | '(:' | 'as' | '{'\n    if (l1 == 79)                   // 'as'\n    {\n      shiftT(79);                   // 'as'\n      lookahead1W(260);             // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_SequenceType();\n    }\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    try_FunctionBody();\n  }\n\n  function parse_SingleType()\n  {\n    eventHandler.startNonterminal(\"SingleType\", e0);\n    parse_SimpleTypeName();\n    lookahead1W(227);               // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n    if (l1 == 64)                   // '?'\n    {\n      shift(64);                    // '?'\n    }\n    eventHandler.endNonterminal(\"SingleType\", e0);\n  }\n\n  function try_SingleType()\n  {\n    try_SimpleTypeName();\n    lookahead1W(227);               // S^WS | EOF | '!=' | '(:' | ')' | '*' | '+' | ',' | '-' | ':' | ';' | '<' | '<<' |\n    if (l1 == 64)                   // '?'\n    {\n      shiftT(64);                   // '?'\n    }\n  }\n\n  function parse_TypeDeclaration()\n  {\n    eventHandler.startNonterminal(\"TypeDeclaration\", e0);\n    shift(79);                      // 'as'\n    lookahead1W(260);               // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_SequenceType();\n    eventHandler.endNonterminal(\"TypeDeclaration\", e0);\n  }\n\n  function try_TypeDeclaration()\n  {\n    shiftT(79);                     // 'as'\n    lookahead1W(260);               // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_SequenceType();\n  }\n\n  function parse_SequenceType()\n  {\n    eventHandler.startNonterminal(\"SequenceType\", e0);\n    switch (l1)\n    {\n    case 124:                       // 'empty-sequence'\n      lookahead2W(243);             // S^WS | EOF | '!=' | '(' | '(:' | ')' | '*' | '*' | '+' | ',' | '-' | ':' | ':=' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 17532:                     // 'empty-sequence' '('\n      shift(124);                   // 'empty-sequence'\n      lookahead1W(22);              // S^WS | '(' | '(:'\n      shift(34);                    // '('\n      lookahead1W(23);              // S^WS | '(:' | ')'\n      shift(37);                    // ')'\n      break;\n    default:\n      parse_ItemType();\n      lookahead1W(239);             // S^WS | EOF | '!=' | '(:' | ')' | '*' | '*' | '+' | ',' | '-' | ':' | ':=' | ';' |\n      switch (l1)\n      {\n      case 39:                      // '*'\n      case 40:                      // '+'\n      case 64:                      // '?'\n        whitespace();\n        parse_OccurrenceIndicator();\n        break;\n      default:\n        break;\n      }\n    }\n    eventHandler.endNonterminal(\"SequenceType\", e0);\n  }\n\n  function try_SequenceType()\n  {\n    switch (l1)\n    {\n    case 124:                       // 'empty-sequence'\n      lookahead2W(243);             // S^WS | EOF | '!=' | '(' | '(:' | ')' | '*' | '*' | '+' | ',' | '-' | ':' | ':=' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 17532:                     // 'empty-sequence' '('\n      shiftT(124);                  // 'empty-sequence'\n      lookahead1W(22);              // S^WS | '(' | '(:'\n      shiftT(34);                   // '('\n      lookahead1W(23);              // S^WS | '(:' | ')'\n      shiftT(37);                   // ')'\n      break;\n    default:\n      try_ItemType();\n      lookahead1W(239);             // S^WS | EOF | '!=' | '(:' | ')' | '*' | '*' | '+' | ',' | '-' | ':' | ':=' | ';' |\n      switch (l1)\n      {\n      case 39:                      // '*'\n      case 40:                      // '+'\n      case 64:                      // '?'\n        try_OccurrenceIndicator();\n        break;\n      default:\n        break;\n      }\n    }\n  }\n\n  function parse_OccurrenceIndicator()\n  {\n    eventHandler.startNonterminal(\"OccurrenceIndicator\", e0);\n    switch (l1)\n    {\n    case 64:                        // '?'\n      shift(64);                    // '?'\n      break;\n    case 39:                        // '*'\n      shift(39);                    // '*'\n      break;\n    default:\n      shift(40);                    // '+'\n    }\n    eventHandler.endNonterminal(\"OccurrenceIndicator\", e0);\n  }\n\n  function try_OccurrenceIndicator()\n  {\n    switch (l1)\n    {\n    case 64:                        // '?'\n      shiftT(64);                   // '?'\n      break;\n    case 39:                        // '*'\n      shiftT(39);                   // '*'\n      break;\n    default:\n      shiftT(40);                   // '+'\n    }\n  }\n\n  function parse_ItemType()\n  {\n    eventHandler.startNonterminal(\"ItemType\", e0);\n    switch (l1)\n    {\n    case 78:                        // 'array'\n    case 82:                        // 'attribute'\n    case 96:                        // 'comment'\n    case 120:                       // 'document-node'\n    case 121:                       // 'element'\n    case 145:                       // 'function'\n    case 165:                       // 'item'\n    case 167:                       // 'json-item'\n    case 185:                       // 'namespace-node'\n    case 191:                       // 'node'\n    case 194:                       // 'object'\n    case 216:                       // 'processing-instruction'\n    case 226:                       // 'schema-attribute'\n    case 227:                       // 'schema-element'\n    case 242:                       // 'structured-item'\n    case 244:                       // 'text'\n      lookahead2W(243);             // S^WS | EOF | '!=' | '(' | '(:' | ')' | '*' | '*' | '+' | ',' | '-' | ':' | ':=' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 17490:                     // 'attribute' '('\n    case 17504:                     // 'comment' '('\n    case 17528:                     // 'document-node' '('\n    case 17529:                     // 'element' '('\n    case 17593:                     // 'namespace-node' '('\n    case 17599:                     // 'node' '('\n    case 17624:                     // 'processing-instruction' '('\n    case 17634:                     // 'schema-attribute' '('\n    case 17635:                     // 'schema-element' '('\n    case 17652:                     // 'text' '('\n      parse_KindTest();\n      break;\n    case 17573:                     // 'item' '('\n      shift(165);                   // 'item'\n      lookahead1W(22);              // S^WS | '(' | '(:'\n      shift(34);                    // '('\n      lookahead1W(23);              // S^WS | '(:' | ')'\n      shift(37);                    // ')'\n      break;\n    case 32:                        // '%'\n    case 17553:                     // 'function' '('\n      parse_FunctionTest();\n      break;\n    case 34:                        // '('\n      parse_ParenthesizedItemType();\n      break;\n    case 17486:                     // 'array' '('\n    case 17575:                     // 'json-item' '('\n    case 17602:                     // 'object' '('\n      parse_JSONTest();\n      break;\n    case 17650:                     // 'structured-item' '('\n      parse_StructuredItemTest();\n      break;\n    default:\n      parse_AtomicOrUnionType();\n    }\n    eventHandler.endNonterminal(\"ItemType\", e0);\n  }\n\n  function try_ItemType()\n  {\n    switch (l1)\n    {\n    case 78:                        // 'array'\n    case 82:                        // 'attribute'\n    case 96:                        // 'comment'\n    case 120:                       // 'document-node'\n    case 121:                       // 'element'\n    case 145:                       // 'function'\n    case 165:                       // 'item'\n    case 167:                       // 'json-item'\n    case 185:                       // 'namespace-node'\n    case 191:                       // 'node'\n    case 194:                       // 'object'\n    case 216:                       // 'processing-instruction'\n    case 226:                       // 'schema-attribute'\n    case 227:                       // 'schema-element'\n    case 242:                       // 'structured-item'\n    case 244:                       // 'text'\n      lookahead2W(243);             // S^WS | EOF | '!=' | '(' | '(:' | ')' | '*' | '*' | '+' | ',' | '-' | ':' | ':=' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 17490:                     // 'attribute' '('\n    case 17504:                     // 'comment' '('\n    case 17528:                     // 'document-node' '('\n    case 17529:                     // 'element' '('\n    case 17593:                     // 'namespace-node' '('\n    case 17599:                     // 'node' '('\n    case 17624:                     // 'processing-instruction' '('\n    case 17634:                     // 'schema-attribute' '('\n    case 17635:                     // 'schema-element' '('\n    case 17652:                     // 'text' '('\n      try_KindTest();\n      break;\n    case 17573:                     // 'item' '('\n      shiftT(165);                  // 'item'\n      lookahead1W(22);              // S^WS | '(' | '(:'\n      shiftT(34);                   // '('\n      lookahead1W(23);              // S^WS | '(:' | ')'\n      shiftT(37);                   // ')'\n      break;\n    case 32:                        // '%'\n    case 17553:                     // 'function' '('\n      try_FunctionTest();\n      break;\n    case 34:                        // '('\n      try_ParenthesizedItemType();\n      break;\n    case 17486:                     // 'array' '('\n    case 17575:                     // 'json-item' '('\n    case 17602:                     // 'object' '('\n      try_JSONTest();\n      break;\n    case 17650:                     // 'structured-item' '('\n      try_StructuredItemTest();\n      break;\n    default:\n      try_AtomicOrUnionType();\n    }\n  }\n\n  function parse_JSONTest()\n  {\n    eventHandler.startNonterminal(\"JSONTest\", e0);\n    switch (l1)\n    {\n    case 167:                       // 'json-item'\n      parse_JSONItemTest();\n      break;\n    case 194:                       // 'object'\n      parse_JSONObjectTest();\n      break;\n    default:\n      parse_JSONArrayTest();\n    }\n    eventHandler.endNonterminal(\"JSONTest\", e0);\n  }\n\n  function try_JSONTest()\n  {\n    switch (l1)\n    {\n    case 167:                       // 'json-item'\n      try_JSONItemTest();\n      break;\n    case 194:                       // 'object'\n      try_JSONObjectTest();\n      break;\n    default:\n      try_JSONArrayTest();\n    }\n  }\n\n  function parse_StructuredItemTest()\n  {\n    eventHandler.startNonterminal(\"StructuredItemTest\", e0);\n    shift(242);                     // 'structured-item'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(37);                      // ')'\n    eventHandler.endNonterminal(\"StructuredItemTest\", e0);\n  }\n\n  function try_StructuredItemTest()\n  {\n    shiftT(242);                    // 'structured-item'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(37);                     // ')'\n  }\n\n  function parse_JSONItemTest()\n  {\n    eventHandler.startNonterminal(\"JSONItemTest\", e0);\n    shift(167);                     // 'json-item'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(37);                      // ')'\n    eventHandler.endNonterminal(\"JSONItemTest\", e0);\n  }\n\n  function try_JSONItemTest()\n  {\n    shiftT(167);                    // 'json-item'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(37);                     // ')'\n  }\n\n  function parse_JSONObjectTest()\n  {\n    eventHandler.startNonterminal(\"JSONObjectTest\", e0);\n    shift(194);                     // 'object'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(37);                      // ')'\n    eventHandler.endNonterminal(\"JSONObjectTest\", e0);\n  }\n\n  function try_JSONObjectTest()\n  {\n    shiftT(194);                    // 'object'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(37);                     // ')'\n  }\n\n  function parse_JSONArrayTest()\n  {\n    eventHandler.startNonterminal(\"JSONArrayTest\", e0);\n    shift(78);                      // 'array'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(37);                      // ')'\n    eventHandler.endNonterminal(\"JSONArrayTest\", e0);\n  }\n\n  function try_JSONArrayTest()\n  {\n    shiftT(78);                     // 'array'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(37);                     // ')'\n  }\n\n  function parse_AtomicOrUnionType()\n  {\n    eventHandler.startNonterminal(\"AtomicOrUnionType\", e0);\n    parse_EQName();\n    eventHandler.endNonterminal(\"AtomicOrUnionType\", e0);\n  }\n\n  function try_AtomicOrUnionType()\n  {\n    try_EQName();\n  }\n\n  function parse_KindTest()\n  {\n    eventHandler.startNonterminal(\"KindTest\", e0);\n    switch (l1)\n    {\n    case 120:                       // 'document-node'\n      parse_DocumentTest();\n      break;\n    case 121:                       // 'element'\n      parse_ElementTest();\n      break;\n    case 82:                        // 'attribute'\n      parse_AttributeTest();\n      break;\n    case 227:                       // 'schema-element'\n      parse_SchemaElementTest();\n      break;\n    case 226:                       // 'schema-attribute'\n      parse_SchemaAttributeTest();\n      break;\n    case 216:                       // 'processing-instruction'\n      parse_PITest();\n      break;\n    case 96:                        // 'comment'\n      parse_CommentTest();\n      break;\n    case 244:                       // 'text'\n      parse_TextTest();\n      break;\n    case 185:                       // 'namespace-node'\n      parse_NamespaceNodeTest();\n      break;\n    default:\n      parse_AnyKindTest();\n    }\n    eventHandler.endNonterminal(\"KindTest\", e0);\n  }\n\n  function try_KindTest()\n  {\n    switch (l1)\n    {\n    case 120:                       // 'document-node'\n      try_DocumentTest();\n      break;\n    case 121:                       // 'element'\n      try_ElementTest();\n      break;\n    case 82:                        // 'attribute'\n      try_AttributeTest();\n      break;\n    case 227:                       // 'schema-element'\n      try_SchemaElementTest();\n      break;\n    case 226:                       // 'schema-attribute'\n      try_SchemaAttributeTest();\n      break;\n    case 216:                       // 'processing-instruction'\n      try_PITest();\n      break;\n    case 96:                        // 'comment'\n      try_CommentTest();\n      break;\n    case 244:                       // 'text'\n      try_TextTest();\n      break;\n    case 185:                       // 'namespace-node'\n      try_NamespaceNodeTest();\n      break;\n    default:\n      try_AnyKindTest();\n    }\n  }\n\n  function parse_AnyKindTest()\n  {\n    eventHandler.startNonterminal(\"AnyKindTest\", e0);\n    shift(191);                     // 'node'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(37);                      // ')'\n    eventHandler.endNonterminal(\"AnyKindTest\", e0);\n  }\n\n  function try_AnyKindTest()\n  {\n    shiftT(191);                    // 'node'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(37);                     // ')'\n  }\n\n  function parse_DocumentTest()\n  {\n    eventHandler.startNonterminal(\"DocumentTest\", e0);\n    shift(120);                     // 'document-node'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(144);               // S^WS | '(:' | ')' | 'element' | 'schema-element'\n    if (l1 != 37)                   // ')'\n    {\n      switch (l1)\n      {\n      case 121:                     // 'element'\n        whitespace();\n        parse_ElementTest();\n        break;\n      default:\n        whitespace();\n        parse_SchemaElementTest();\n      }\n    }\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(37);                      // ')'\n    eventHandler.endNonterminal(\"DocumentTest\", e0);\n  }\n\n  function try_DocumentTest()\n  {\n    shiftT(120);                    // 'document-node'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(144);               // S^WS | '(:' | ')' | 'element' | 'schema-element'\n    if (l1 != 37)                   // ')'\n    {\n      switch (l1)\n      {\n      case 121:                     // 'element'\n        try_ElementTest();\n        break;\n      default:\n        try_SchemaElementTest();\n      }\n    }\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(37);                     // ')'\n  }\n\n  function parse_TextTest()\n  {\n    eventHandler.startNonterminal(\"TextTest\", e0);\n    shift(244);                     // 'text'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(37);                      // ')'\n    eventHandler.endNonterminal(\"TextTest\", e0);\n  }\n\n  function try_TextTest()\n  {\n    shiftT(244);                    // 'text'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(37);                     // ')'\n  }\n\n  function parse_CommentTest()\n  {\n    eventHandler.startNonterminal(\"CommentTest\", e0);\n    shift(96);                      // 'comment'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(37);                      // ')'\n    eventHandler.endNonterminal(\"CommentTest\", e0);\n  }\n\n  function try_CommentTest()\n  {\n    shiftT(96);                     // 'comment'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(37);                     // ')'\n  }\n\n  function parse_NamespaceNodeTest()\n  {\n    eventHandler.startNonterminal(\"NamespaceNodeTest\", e0);\n    shift(185);                     // 'namespace-node'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(37);                      // ')'\n    eventHandler.endNonterminal(\"NamespaceNodeTest\", e0);\n  }\n\n  function try_NamespaceNodeTest()\n  {\n    shiftT(185);                    // 'namespace-node'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(37);                     // ')'\n  }\n\n  function parse_PITest()\n  {\n    eventHandler.startNonterminal(\"PITest\", e0);\n    shift(216);                     // 'processing-instruction'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(253);               // StringLiteral | NCName^Token | S^WS | '(:' | ')' | 'after' | 'allowing' |\n    if (l1 != 37)                   // ')'\n    {\n      switch (l1)\n      {\n      case 11:                      // StringLiteral\n        shift(11);                  // StringLiteral\n        break;\n      default:\n        whitespace();\n        parse_NCName();\n      }\n    }\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(37);                      // ')'\n    eventHandler.endNonterminal(\"PITest\", e0);\n  }\n\n  function try_PITest()\n  {\n    shiftT(216);                    // 'processing-instruction'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(253);               // StringLiteral | NCName^Token | S^WS | '(:' | ')' | 'after' | 'allowing' |\n    if (l1 != 37)                   // ')'\n    {\n      switch (l1)\n      {\n      case 11:                      // StringLiteral\n        shiftT(11);                 // StringLiteral\n        break;\n      default:\n        try_NCName();\n      }\n    }\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(37);                     // ')'\n  }\n\n  function parse_AttributeTest()\n  {\n    eventHandler.startNonterminal(\"AttributeTest\", e0);\n    shift(82);                      // 'attribute'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(261);               // EQName^Token | S^WS | '(:' | ')' | '*' | 'after' | 'allowing' | 'ancestor' |\n    if (l1 != 37)                   // ')'\n    {\n      whitespace();\n      parse_AttribNameOrWildcard();\n      lookahead1W(101);             // S^WS | '(:' | ')' | ','\n      if (l1 == 41)                 // ','\n      {\n        shift(41);                  // ','\n        lookahead1W(255);           // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n        whitespace();\n        parse_TypeName();\n      }\n    }\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(37);                      // ')'\n    eventHandler.endNonterminal(\"AttributeTest\", e0);\n  }\n\n  function try_AttributeTest()\n  {\n    shiftT(82);                     // 'attribute'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(261);               // EQName^Token | S^WS | '(:' | ')' | '*' | 'after' | 'allowing' | 'ancestor' |\n    if (l1 != 37)                   // ')'\n    {\n      try_AttribNameOrWildcard();\n      lookahead1W(101);             // S^WS | '(:' | ')' | ','\n      if (l1 == 41)                 // ','\n      {\n        shiftT(41);                 // ','\n        lookahead1W(255);           // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n        try_TypeName();\n      }\n    }\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(37);                     // ')'\n  }\n\n  function parse_AttribNameOrWildcard()\n  {\n    eventHandler.startNonterminal(\"AttribNameOrWildcard\", e0);\n    switch (l1)\n    {\n    case 38:                        // '*'\n      shift(38);                    // '*'\n      break;\n    default:\n      parse_AttributeName();\n    }\n    eventHandler.endNonterminal(\"AttribNameOrWildcard\", e0);\n  }\n\n  function try_AttribNameOrWildcard()\n  {\n    switch (l1)\n    {\n    case 38:                        // '*'\n      shiftT(38);                   // '*'\n      break;\n    default:\n      try_AttributeName();\n    }\n  }\n\n  function parse_SchemaAttributeTest()\n  {\n    eventHandler.startNonterminal(\"SchemaAttributeTest\", e0);\n    shift(226);                     // 'schema-attribute'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_AttributeDeclaration();\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(37);                      // ')'\n    eventHandler.endNonterminal(\"SchemaAttributeTest\", e0);\n  }\n\n  function try_SchemaAttributeTest()\n  {\n    shiftT(226);                    // 'schema-attribute'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_AttributeDeclaration();\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(37);                     // ')'\n  }\n\n  function parse_AttributeDeclaration()\n  {\n    eventHandler.startNonterminal(\"AttributeDeclaration\", e0);\n    parse_AttributeName();\n    eventHandler.endNonterminal(\"AttributeDeclaration\", e0);\n  }\n\n  function try_AttributeDeclaration()\n  {\n    try_AttributeName();\n  }\n\n  function parse_ElementTest()\n  {\n    eventHandler.startNonterminal(\"ElementTest\", e0);\n    shift(121);                     // 'element'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(261);               // EQName^Token | S^WS | '(:' | ')' | '*' | 'after' | 'allowing' | 'ancestor' |\n    if (l1 != 37)                   // ')'\n    {\n      whitespace();\n      parse_ElementNameOrWildcard();\n      lookahead1W(101);             // S^WS | '(:' | ')' | ','\n      if (l1 == 41)                 // ','\n      {\n        shift(41);                  // ','\n        lookahead1W(255);           // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n        whitespace();\n        parse_TypeName();\n        lookahead1W(102);           // S^WS | '(:' | ')' | '?'\n        if (l1 == 64)               // '?'\n        {\n          shift(64);                // '?'\n        }\n      }\n    }\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(37);                      // ')'\n    eventHandler.endNonterminal(\"ElementTest\", e0);\n  }\n\n  function try_ElementTest()\n  {\n    shiftT(121);                    // 'element'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(261);               // EQName^Token | S^WS | '(:' | ')' | '*' | 'after' | 'allowing' | 'ancestor' |\n    if (l1 != 37)                   // ')'\n    {\n      try_ElementNameOrWildcard();\n      lookahead1W(101);             // S^WS | '(:' | ')' | ','\n      if (l1 == 41)                 // ','\n      {\n        shiftT(41);                 // ','\n        lookahead1W(255);           // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n        try_TypeName();\n        lookahead1W(102);           // S^WS | '(:' | ')' | '?'\n        if (l1 == 64)               // '?'\n        {\n          shiftT(64);               // '?'\n        }\n      }\n    }\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(37);                     // ')'\n  }\n\n  function parse_ElementNameOrWildcard()\n  {\n    eventHandler.startNonterminal(\"ElementNameOrWildcard\", e0);\n    switch (l1)\n    {\n    case 38:                        // '*'\n      shift(38);                    // '*'\n      break;\n    default:\n      parse_ElementName();\n    }\n    eventHandler.endNonterminal(\"ElementNameOrWildcard\", e0);\n  }\n\n  function try_ElementNameOrWildcard()\n  {\n    switch (l1)\n    {\n    case 38:                        // '*'\n      shiftT(38);                   // '*'\n      break;\n    default:\n      try_ElementName();\n    }\n  }\n\n  function parse_SchemaElementTest()\n  {\n    eventHandler.startNonterminal(\"SchemaElementTest\", e0);\n    shift(227);                     // 'schema-element'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_ElementDeclaration();\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(37);                      // ')'\n    eventHandler.endNonterminal(\"SchemaElementTest\", e0);\n  }\n\n  function try_SchemaElementTest()\n  {\n    shiftT(227);                    // 'schema-element'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_ElementDeclaration();\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(37);                     // ')'\n  }\n\n  function parse_ElementDeclaration()\n  {\n    eventHandler.startNonterminal(\"ElementDeclaration\", e0);\n    parse_ElementName();\n    eventHandler.endNonterminal(\"ElementDeclaration\", e0);\n  }\n\n  function try_ElementDeclaration()\n  {\n    try_ElementName();\n  }\n\n  function parse_AttributeName()\n  {\n    eventHandler.startNonterminal(\"AttributeName\", e0);\n    parse_EQName();\n    eventHandler.endNonterminal(\"AttributeName\", e0);\n  }\n\n  function try_AttributeName()\n  {\n    try_EQName();\n  }\n\n  function parse_ElementName()\n  {\n    eventHandler.startNonterminal(\"ElementName\", e0);\n    parse_EQName();\n    eventHandler.endNonterminal(\"ElementName\", e0);\n  }\n\n  function try_ElementName()\n  {\n    try_EQName();\n  }\n\n  function parse_SimpleTypeName()\n  {\n    eventHandler.startNonterminal(\"SimpleTypeName\", e0);\n    parse_TypeName();\n    eventHandler.endNonterminal(\"SimpleTypeName\", e0);\n  }\n\n  function try_SimpleTypeName()\n  {\n    try_TypeName();\n  }\n\n  function parse_TypeName()\n  {\n    eventHandler.startNonterminal(\"TypeName\", e0);\n    parse_EQName();\n    eventHandler.endNonterminal(\"TypeName\", e0);\n  }\n\n  function try_TypeName()\n  {\n    try_EQName();\n  }\n\n  function parse_FunctionTest()\n  {\n    eventHandler.startNonterminal(\"FunctionTest\", e0);\n    for (;;)\n    {\n      lookahead1W(97);              // S^WS | '%' | '(:' | 'function'\n      if (l1 != 32)                 // '%'\n      {\n        break;\n      }\n      whitespace();\n      parse_Annotation();\n    }\n    switch (l1)\n    {\n    case 145:                       // 'function'\n      lookahead2W(22);              // S^WS | '(' | '(:'\n      break;\n    default:\n      lk = l1;\n    }\n    lk = memoized(5, e0);\n    if (lk == 0)\n    {\n      var b0A = b0; var e0A = e0; var l1A = l1;\n      var b1A = b1; var e1A = e1; var l2A = l2;\n      var b2A = b2; var e2A = e2;\n      try\n      {\n        try_AnyFunctionTest();\n        lk = -1;\n      }\n      catch (p1A)\n      {\n        lk = -2;\n      }\n      b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n      b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n      b2 = b2A; e2 = e2A; end = e2A; }}\n      memoize(5, e0, lk);\n    }\n    switch (lk)\n    {\n    case -1:\n      whitespace();\n      parse_AnyFunctionTest();\n      break;\n    default:\n      whitespace();\n      parse_TypedFunctionTest();\n    }\n    eventHandler.endNonterminal(\"FunctionTest\", e0);\n  }\n\n  function try_FunctionTest()\n  {\n    for (;;)\n    {\n      lookahead1W(97);              // S^WS | '%' | '(:' | 'function'\n      if (l1 != 32)                 // '%'\n      {\n        break;\n      }\n      try_Annotation();\n    }\n    switch (l1)\n    {\n    case 145:                       // 'function'\n      lookahead2W(22);              // S^WS | '(' | '(:'\n      break;\n    default:\n      lk = l1;\n    }\n    lk = memoized(5, e0);\n    if (lk == 0)\n    {\n      var b0A = b0; var e0A = e0; var l1A = l1;\n      var b1A = b1; var e1A = e1; var l2A = l2;\n      var b2A = b2; var e2A = e2;\n      try\n      {\n        try_AnyFunctionTest();\n        memoize(5, e0A, -1);\n        lk = -3;\n      }\n      catch (p1A)\n      {\n        lk = -2;\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(5, e0A, -2);\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n      try_AnyFunctionTest();\n      break;\n    case -3:\n      break;\n    default:\n      try_TypedFunctionTest();\n    }\n  }\n\n  function parse_AnyFunctionTest()\n  {\n    eventHandler.startNonterminal(\"AnyFunctionTest\", e0);\n    shift(145);                     // 'function'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(24);                // S^WS | '(:' | '*'\n    shift(38);                      // '*'\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(37);                      // ')'\n    eventHandler.endNonterminal(\"AnyFunctionTest\", e0);\n  }\n\n  function try_AnyFunctionTest()\n  {\n    shiftT(145);                    // 'function'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(24);                // S^WS | '(:' | '*'\n    shiftT(38);                     // '*'\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(37);                     // ')'\n  }\n\n  function parse_TypedFunctionTest()\n  {\n    eventHandler.startNonterminal(\"TypedFunctionTest\", e0);\n    shift(145);                     // 'function'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(263);               // EQName^Token | S^WS | '%' | '(' | '(:' | ')' | 'after' | 'allowing' |\n    if (l1 != 37)                   // ')'\n    {\n      whitespace();\n      parse_SequenceType();\n      for (;;)\n      {\n        lookahead1W(101);           // S^WS | '(:' | ')' | ','\n        if (l1 != 41)               // ','\n        {\n          break;\n        }\n        shift(41);                  // ','\n        lookahead1W(260);           // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n        whitespace();\n        parse_SequenceType();\n      }\n    }\n    shift(37);                      // ')'\n    lookahead1W(30);                // S^WS | '(:' | 'as'\n    shift(79);                      // 'as'\n    lookahead1W(260);               // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_SequenceType();\n    eventHandler.endNonterminal(\"TypedFunctionTest\", e0);\n  }\n\n  function try_TypedFunctionTest()\n  {\n    shiftT(145);                    // 'function'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(263);               // EQName^Token | S^WS | '%' | '(' | '(:' | ')' | 'after' | 'allowing' |\n    if (l1 != 37)                   // ')'\n    {\n      try_SequenceType();\n      for (;;)\n      {\n        lookahead1W(101);           // S^WS | '(:' | ')' | ','\n        if (l1 != 41)               // ','\n        {\n          break;\n        }\n        shiftT(41);                 // ','\n        lookahead1W(260);           // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n        try_SequenceType();\n      }\n    }\n    shiftT(37);                     // ')'\n    lookahead1W(30);                // S^WS | '(:' | 'as'\n    shiftT(79);                     // 'as'\n    lookahead1W(260);               // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_SequenceType();\n  }\n\n  function parse_ParenthesizedItemType()\n  {\n    eventHandler.startNonterminal(\"ParenthesizedItemType\", e0);\n    shift(34);                      // '('\n    lookahead1W(260);               // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_ItemType();\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shift(37);                      // ')'\n    eventHandler.endNonterminal(\"ParenthesizedItemType\", e0);\n  }\n\n  function try_ParenthesizedItemType()\n  {\n    shiftT(34);                     // '('\n    lookahead1W(260);               // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_ItemType();\n    lookahead1W(23);                // S^WS | '(:' | ')'\n    shiftT(37);                     // ')'\n  }\n\n  function parse_RevalidationDecl()\n  {\n    eventHandler.startNonterminal(\"RevalidationDecl\", e0);\n    shift(108);                     // 'declare'\n    lookahead1W(72);                // S^WS | '(:' | 'revalidation'\n    shift(222);                     // 'revalidation'\n    lookahead1W(152);               // S^WS | '(:' | 'lax' | 'skip' | 'strict'\n    switch (l1)\n    {\n    case 240:                       // 'strict'\n      shift(240);                   // 'strict'\n      break;\n    case 171:                       // 'lax'\n      shift(171);                   // 'lax'\n      break;\n    default:\n      shift(233);                   // 'skip'\n    }\n    eventHandler.endNonterminal(\"RevalidationDecl\", e0);\n  }\n\n  function parse_InsertExprTargetChoice()\n  {\n    eventHandler.startNonterminal(\"InsertExprTargetChoice\", e0);\n    switch (l1)\n    {\n    case 70:                        // 'after'\n      shift(70);                    // 'after'\n      break;\n    case 84:                        // 'before'\n      shift(84);                    // 'before'\n      break;\n    default:\n      if (l1 == 79)                 // 'as'\n      {\n        shift(79);                  // 'as'\n        lookahead1W(119);           // S^WS | '(:' | 'first' | 'last'\n        switch (l1)\n        {\n        case 134:                   // 'first'\n          shift(134);               // 'first'\n          break;\n        default:\n          shift(170);               // 'last'\n        }\n      }\n      lookahead1W(54);              // S^WS | '(:' | 'into'\n      shift(163);                   // 'into'\n    }\n    eventHandler.endNonterminal(\"InsertExprTargetChoice\", e0);\n  }\n\n  function try_InsertExprTargetChoice()\n  {\n    switch (l1)\n    {\n    case 70:                        // 'after'\n      shiftT(70);                   // 'after'\n      break;\n    case 84:                        // 'before'\n      shiftT(84);                   // 'before'\n      break;\n    default:\n      if (l1 == 79)                 // 'as'\n      {\n        shiftT(79);                 // 'as'\n        lookahead1W(119);           // S^WS | '(:' | 'first' | 'last'\n        switch (l1)\n        {\n        case 134:                   // 'first'\n          shiftT(134);              // 'first'\n          break;\n        default:\n          shiftT(170);              // 'last'\n        }\n      }\n      lookahead1W(54);              // S^WS | '(:' | 'into'\n      shiftT(163);                  // 'into'\n    }\n  }\n\n  function parse_InsertExpr()\n  {\n    eventHandler.startNonterminal(\"InsertExpr\", e0);\n    shift(159);                     // 'insert'\n    lookahead1W(129);               // S^WS | '(:' | 'node' | 'nodes'\n    switch (l1)\n    {\n    case 191:                       // 'node'\n      shift(191);                   // 'node'\n      break;\n    default:\n      shift(192);                   // 'nodes'\n    }\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_SourceExpr();\n    whitespace();\n    parse_InsertExprTargetChoice();\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_TargetExpr();\n    eventHandler.endNonterminal(\"InsertExpr\", e0);\n  }\n\n  function try_InsertExpr()\n  {\n    shiftT(159);                    // 'insert'\n    lookahead1W(129);               // S^WS | '(:' | 'node' | 'nodes'\n    switch (l1)\n    {\n    case 191:                       // 'node'\n      shiftT(191);                  // 'node'\n      break;\n    default:\n      shiftT(192);                  // 'nodes'\n    }\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_SourceExpr();\n    try_InsertExprTargetChoice();\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_TargetExpr();\n  }\n\n  function parse_DeleteExpr()\n  {\n    eventHandler.startNonterminal(\"DeleteExpr\", e0);\n    shift(110);                     // 'delete'\n    lookahead1W(129);               // S^WS | '(:' | 'node' | 'nodes'\n    switch (l1)\n    {\n    case 191:                       // 'node'\n      shift(191);                   // 'node'\n      break;\n    default:\n      shift(192);                   // 'nodes'\n    }\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_TargetExpr();\n    eventHandler.endNonterminal(\"DeleteExpr\", e0);\n  }\n\n  function try_DeleteExpr()\n  {\n    shiftT(110);                    // 'delete'\n    lookahead1W(129);               // S^WS | '(:' | 'node' | 'nodes'\n    switch (l1)\n    {\n    case 191:                       // 'node'\n      shiftT(191);                  // 'node'\n      break;\n    default:\n      shiftT(192);                  // 'nodes'\n    }\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_TargetExpr();\n  }\n\n  function parse_ReplaceExpr()\n  {\n    eventHandler.startNonterminal(\"ReplaceExpr\", e0);\n    shift(219);                     // 'replace'\n    lookahead1W(130);               // S^WS | '(:' | 'node' | 'value'\n    if (l1 == 261)                  // 'value'\n    {\n      shift(261);                   // 'value'\n      lookahead1W(64);              // S^WS | '(:' | 'of'\n      shift(196);                   // 'of'\n    }\n    lookahead1W(62);                // S^WS | '(:' | 'node'\n    shift(191);                     // 'node'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_TargetExpr();\n    shift(270);                     // 'with'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"ReplaceExpr\", e0);\n  }\n\n  function try_ReplaceExpr()\n  {\n    shiftT(219);                    // 'replace'\n    lookahead1W(130);               // S^WS | '(:' | 'node' | 'value'\n    if (l1 == 261)                  // 'value'\n    {\n      shiftT(261);                  // 'value'\n      lookahead1W(64);              // S^WS | '(:' | 'of'\n      shiftT(196);                  // 'of'\n    }\n    lookahead1W(62);                // S^WS | '(:' | 'node'\n    shiftT(191);                    // 'node'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_TargetExpr();\n    shiftT(270);                    // 'with'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_RenameExpr()\n  {\n    eventHandler.startNonterminal(\"RenameExpr\", e0);\n    shift(218);                     // 'rename'\n    lookahead1W(62);                // S^WS | '(:' | 'node'\n    shift(191);                     // 'node'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_TargetExpr();\n    shift(79);                      // 'as'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_NewNameExpr();\n    eventHandler.endNonterminal(\"RenameExpr\", e0);\n  }\n\n  function try_RenameExpr()\n  {\n    shiftT(218);                    // 'rename'\n    lookahead1W(62);                // S^WS | '(:' | 'node'\n    shiftT(191);                    // 'node'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_TargetExpr();\n    shiftT(79);                     // 'as'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_NewNameExpr();\n  }\n\n  function parse_SourceExpr()\n  {\n    eventHandler.startNonterminal(\"SourceExpr\", e0);\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"SourceExpr\", e0);\n  }\n\n  function try_SourceExpr()\n  {\n    try_ExprSingle();\n  }\n\n  function parse_TargetExpr()\n  {\n    eventHandler.startNonterminal(\"TargetExpr\", e0);\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"TargetExpr\", e0);\n  }\n\n  function try_TargetExpr()\n  {\n    try_ExprSingle();\n  }\n\n  function parse_NewNameExpr()\n  {\n    eventHandler.startNonterminal(\"NewNameExpr\", e0);\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"NewNameExpr\", e0);\n  }\n\n  function try_NewNameExpr()\n  {\n    try_ExprSingle();\n  }\n\n  function parse_TransformExpr()\n  {\n    eventHandler.startNonterminal(\"TransformExpr\", e0);\n    shift(103);                     // 'copy'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    whitespace();\n    parse_TransformSpec();\n    for (;;)\n    {\n      if (l1 != 41)                 // ','\n      {\n        break;\n      }\n      shift(41);                    // ','\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      whitespace();\n      parse_TransformSpec();\n    }\n    shift(181);                     // 'modify'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    shift(220);                     // 'return'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"TransformExpr\", e0);\n  }\n\n  function try_TransformExpr()\n  {\n    shiftT(103);                    // 'copy'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    try_TransformSpec();\n    for (;;)\n    {\n      if (l1 != 41)                 // ','\n      {\n        break;\n      }\n      shiftT(41);                   // ','\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      try_TransformSpec();\n    }\n    shiftT(181);                    // 'modify'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n    shiftT(220);                    // 'return'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_TransformSpec()\n  {\n    eventHandler.startNonterminal(\"TransformSpec\", e0);\n    shift(31);                      // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    lookahead1W(27);                // S^WS | '(:' | ':='\n    shift(52);                      // ':='\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"TransformSpec\", e0);\n  }\n\n  function try_TransformSpec()\n  {\n    shiftT(31);                     // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n    lookahead1W(27);                // S^WS | '(:' | ':='\n    shiftT(52);                     // ':='\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_FTSelection()\n  {\n    eventHandler.startNonterminal(\"FTSelection\", e0);\n    parse_FTOr();\n    for (;;)\n    {\n      lookahead1W(212);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      switch (l1)\n      {\n      case 81:                      // 'at'\n        lookahead2W(151);           // S^WS | '(:' | 'end' | 'position' | 'start'\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk != 115                 // 'different'\n       && lk != 117                 // 'distance'\n       && lk != 127                 // 'entire'\n       && lk != 202                 // 'ordered'\n       && lk != 223                 // 'same'\n       && lk != 269                 // 'window'\n       && lk != 64593               // 'at' 'end'\n       && lk != 121425)             // 'at' 'start'\n      {\n        break;\n      }\n      whitespace();\n      parse_FTPosFilter();\n    }\n    eventHandler.endNonterminal(\"FTSelection\", e0);\n  }\n\n  function try_FTSelection()\n  {\n    try_FTOr();\n    for (;;)\n    {\n      lookahead1W(212);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      switch (l1)\n      {\n      case 81:                      // 'at'\n        lookahead2W(151);           // S^WS | '(:' | 'end' | 'position' | 'start'\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk != 115                 // 'different'\n       && lk != 117                 // 'distance'\n       && lk != 127                 // 'entire'\n       && lk != 202                 // 'ordered'\n       && lk != 223                 // 'same'\n       && lk != 269                 // 'window'\n       && lk != 64593               // 'at' 'end'\n       && lk != 121425)             // 'at' 'start'\n      {\n        break;\n      }\n      try_FTPosFilter();\n    }\n  }\n\n  function parse_FTWeight()\n  {\n    eventHandler.startNonterminal(\"FTWeight\", e0);\n    shift(264);                     // 'weight'\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    shift(276);                     // '{'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Expr();\n    shift(282);                     // '}'\n    eventHandler.endNonterminal(\"FTWeight\", e0);\n  }\n\n  function try_FTWeight()\n  {\n    shiftT(264);                    // 'weight'\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    shiftT(276);                    // '{'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Expr();\n    shiftT(282);                    // '}'\n  }\n\n  function parse_FTOr()\n  {\n    eventHandler.startNonterminal(\"FTOr\", e0);\n    parse_FTAnd();\n    for (;;)\n    {\n      if (l1 != 144)                // 'ftor'\n      {\n        break;\n      }\n      shift(144);                   // 'ftor'\n      lookahead1W(162);             // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{'\n      whitespace();\n      parse_FTAnd();\n    }\n    eventHandler.endNonterminal(\"FTOr\", e0);\n  }\n\n  function try_FTOr()\n  {\n    try_FTAnd();\n    for (;;)\n    {\n      if (l1 != 144)                // 'ftor'\n      {\n        break;\n      }\n      shiftT(144);                  // 'ftor'\n      lookahead1W(162);             // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{'\n      try_FTAnd();\n    }\n  }\n\n  function parse_FTAnd()\n  {\n    eventHandler.startNonterminal(\"FTAnd\", e0);\n    parse_FTMildNot();\n    for (;;)\n    {\n      if (l1 != 142)                // 'ftand'\n      {\n        break;\n      }\n      shift(142);                   // 'ftand'\n      lookahead1W(162);             // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{'\n      whitespace();\n      parse_FTMildNot();\n    }\n    eventHandler.endNonterminal(\"FTAnd\", e0);\n  }\n\n  function try_FTAnd()\n  {\n    try_FTMildNot();\n    for (;;)\n    {\n      if (l1 != 142)                // 'ftand'\n      {\n        break;\n      }\n      shiftT(142);                  // 'ftand'\n      lookahead1W(162);             // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{'\n      try_FTMildNot();\n    }\n  }\n\n  function parse_FTMildNot()\n  {\n    eventHandler.startNonterminal(\"FTMildNot\", e0);\n    parse_FTUnaryNot();\n    for (;;)\n    {\n      lookahead1W(213);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      if (l1 != 193)                // 'not'\n      {\n        break;\n      }\n      shift(193);                   // 'not'\n      lookahead1W(53);              // S^WS | '(:' | 'in'\n      shift(154);                   // 'in'\n      lookahead1W(162);             // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{'\n      whitespace();\n      parse_FTUnaryNot();\n    }\n    eventHandler.endNonterminal(\"FTMildNot\", e0);\n  }\n\n  function try_FTMildNot()\n  {\n    try_FTUnaryNot();\n    for (;;)\n    {\n      lookahead1W(213);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      if (l1 != 193)                // 'not'\n      {\n        break;\n      }\n      shiftT(193);                  // 'not'\n      lookahead1W(53);              // S^WS | '(:' | 'in'\n      shiftT(154);                  // 'in'\n      lookahead1W(162);             // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{'\n      try_FTUnaryNot();\n    }\n  }\n\n  function parse_FTUnaryNot()\n  {\n    eventHandler.startNonterminal(\"FTUnaryNot\", e0);\n    if (l1 == 143)                  // 'ftnot'\n    {\n      shift(143);                   // 'ftnot'\n    }\n    lookahead1W(155);               // StringLiteral | S^WS | '(' | '(#' | '(:' | '{'\n    whitespace();\n    parse_FTPrimaryWithOptions();\n    eventHandler.endNonterminal(\"FTUnaryNot\", e0);\n  }\n\n  function try_FTUnaryNot()\n  {\n    if (l1 == 143)                  // 'ftnot'\n    {\n      shiftT(143);                  // 'ftnot'\n    }\n    lookahead1W(155);               // StringLiteral | S^WS | '(' | '(#' | '(:' | '{'\n    try_FTPrimaryWithOptions();\n  }\n\n  function parse_FTPrimaryWithOptions()\n  {\n    eventHandler.startNonterminal(\"FTPrimaryWithOptions\", e0);\n    parse_FTPrimary();\n    lookahead1W(215);               // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n    if (l1 == 259)                  // 'using'\n    {\n      whitespace();\n      parse_FTMatchOptions();\n    }\n    if (l1 == 264)                  // 'weight'\n    {\n      whitespace();\n      parse_FTWeight();\n    }\n    eventHandler.endNonterminal(\"FTPrimaryWithOptions\", e0);\n  }\n\n  function try_FTPrimaryWithOptions()\n  {\n    try_FTPrimary();\n    lookahead1W(215);               // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n    if (l1 == 259)                  // 'using'\n    {\n      try_FTMatchOptions();\n    }\n    if (l1 == 264)                  // 'weight'\n    {\n      try_FTWeight();\n    }\n  }\n\n  function parse_FTPrimary()\n  {\n    eventHandler.startNonterminal(\"FTPrimary\", e0);\n    switch (l1)\n    {\n    case 34:                        // '('\n      shift(34);                    // '('\n      lookahead1W(162);             // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{'\n      whitespace();\n      parse_FTSelection();\n      shift(37);                    // ')'\n      break;\n    case 35:                        // '(#'\n      parse_FTExtensionSelection();\n      break;\n    default:\n      parse_FTWords();\n      lookahead1W(216);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      if (l1 == 195)                // 'occurs'\n      {\n        whitespace();\n        parse_FTTimes();\n      }\n    }\n    eventHandler.endNonterminal(\"FTPrimary\", e0);\n  }\n\n  function try_FTPrimary()\n  {\n    switch (l1)\n    {\n    case 34:                        // '('\n      shiftT(34);                   // '('\n      lookahead1W(162);             // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{'\n      try_FTSelection();\n      shiftT(37);                   // ')'\n      break;\n    case 35:                        // '(#'\n      try_FTExtensionSelection();\n      break;\n    default:\n      try_FTWords();\n      lookahead1W(216);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      if (l1 == 195)                // 'occurs'\n      {\n        try_FTTimes();\n      }\n    }\n  }\n\n  function parse_FTWords()\n  {\n    eventHandler.startNonterminal(\"FTWords\", e0);\n    parse_FTWordsValue();\n    lookahead1W(222);               // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n    if (l1 == 71                    // 'all'\n     || l1 == 76                    // 'any'\n     || l1 == 210)                  // 'phrase'\n    {\n      whitespace();\n      parse_FTAnyallOption();\n    }\n    eventHandler.endNonterminal(\"FTWords\", e0);\n  }\n\n  function try_FTWords()\n  {\n    try_FTWordsValue();\n    lookahead1W(222);               // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n    if (l1 == 71                    // 'all'\n     || l1 == 76                    // 'any'\n     || l1 == 210)                  // 'phrase'\n    {\n      try_FTAnyallOption();\n    }\n  }\n\n  function parse_FTWordsValue()\n  {\n    eventHandler.startNonterminal(\"FTWordsValue\", e0);\n    switch (l1)\n    {\n    case 11:                        // StringLiteral\n      shift(11);                    // StringLiteral\n      break;\n    default:\n      shift(276);                   // '{'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_Expr();\n      shift(282);                   // '}'\n    }\n    eventHandler.endNonterminal(\"FTWordsValue\", e0);\n  }\n\n  function try_FTWordsValue()\n  {\n    switch (l1)\n    {\n    case 11:                        // StringLiteral\n      shiftT(11);                   // StringLiteral\n      break;\n    default:\n      shiftT(276);                  // '{'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_Expr();\n      shiftT(282);                  // '}'\n    }\n  }\n\n  function parse_FTExtensionSelection()\n  {\n    eventHandler.startNonterminal(\"FTExtensionSelection\", e0);\n    for (;;)\n    {\n      whitespace();\n      parse_Pragma();\n      lookahead1W(100);             // S^WS | '(#' | '(:' | '{'\n      if (l1 != 35)                 // '(#'\n      {\n        break;\n      }\n    }\n    shift(276);                     // '{'\n    lookahead1W(166);               // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{' | '}'\n    if (l1 != 282)                  // '}'\n    {\n      whitespace();\n      parse_FTSelection();\n    }\n    shift(282);                     // '}'\n    eventHandler.endNonterminal(\"FTExtensionSelection\", e0);\n  }\n\n  function try_FTExtensionSelection()\n  {\n    for (;;)\n    {\n      try_Pragma();\n      lookahead1W(100);             // S^WS | '(#' | '(:' | '{'\n      if (l1 != 35)                 // '(#'\n      {\n        break;\n      }\n    }\n    shiftT(276);                    // '{'\n    lookahead1W(166);               // StringLiteral | S^WS | '(' | '(#' | '(:' | 'ftnot' | '{' | '}'\n    if (l1 != 282)                  // '}'\n    {\n      try_FTSelection();\n    }\n    shiftT(282);                    // '}'\n  }\n\n  function parse_FTAnyallOption()\n  {\n    eventHandler.startNonterminal(\"FTAnyallOption\", e0);\n    switch (l1)\n    {\n    case 76:                        // 'any'\n      shift(76);                    // 'any'\n      lookahead1W(219);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      if (l1 == 272)                // 'word'\n      {\n        shift(272);                 // 'word'\n      }\n      break;\n    case 71:                        // 'all'\n      shift(71);                    // 'all'\n      lookahead1W(220);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      if (l1 == 273)                // 'words'\n      {\n        shift(273);                 // 'words'\n      }\n      break;\n    default:\n      shift(210);                   // 'phrase'\n    }\n    eventHandler.endNonterminal(\"FTAnyallOption\", e0);\n  }\n\n  function try_FTAnyallOption()\n  {\n    switch (l1)\n    {\n    case 76:                        // 'any'\n      shiftT(76);                   // 'any'\n      lookahead1W(219);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      if (l1 == 272)                // 'word'\n      {\n        shiftT(272);                // 'word'\n      }\n      break;\n    case 71:                        // 'all'\n      shiftT(71);                   // 'all'\n      lookahead1W(220);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      if (l1 == 273)                // 'words'\n      {\n        shiftT(273);                // 'words'\n      }\n      break;\n    default:\n      shiftT(210);                  // 'phrase'\n    }\n  }\n\n  function parse_FTTimes()\n  {\n    eventHandler.startNonterminal(\"FTTimes\", e0);\n    shift(195);                     // 'occurs'\n    lookahead1W(149);               // S^WS | '(:' | 'at' | 'exactly' | 'from'\n    whitespace();\n    parse_FTRange();\n    shift(247);                     // 'times'\n    eventHandler.endNonterminal(\"FTTimes\", e0);\n  }\n\n  function try_FTTimes()\n  {\n    shiftT(195);                    // 'occurs'\n    lookahead1W(149);               // S^WS | '(:' | 'at' | 'exactly' | 'from'\n    try_FTRange();\n    shiftT(247);                    // 'times'\n  }\n\n  function parse_FTRange()\n  {\n    eventHandler.startNonterminal(\"FTRange\", e0);\n    switch (l1)\n    {\n    case 130:                       // 'exactly'\n      shift(130);                   // 'exactly'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_AdditiveExpr();\n      break;\n    case 81:                        // 'at'\n      shift(81);                    // 'at'\n      lookahead1W(125);             // S^WS | '(:' | 'least' | 'most'\n      switch (l1)\n      {\n      case 173:                     // 'least'\n        shift(173);                 // 'least'\n        lookahead1W(267);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        whitespace();\n        parse_AdditiveExpr();\n        break;\n      default:\n        shift(183);                 // 'most'\n        lookahead1W(267);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        whitespace();\n        parse_AdditiveExpr();\n      }\n      break;\n    default:\n      shift(140);                   // 'from'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_AdditiveExpr();\n      shift(248);                   // 'to'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_AdditiveExpr();\n    }\n    eventHandler.endNonterminal(\"FTRange\", e0);\n  }\n\n  function try_FTRange()\n  {\n    switch (l1)\n    {\n    case 130:                       // 'exactly'\n      shiftT(130);                  // 'exactly'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_AdditiveExpr();\n      break;\n    case 81:                        // 'at'\n      shiftT(81);                   // 'at'\n      lookahead1W(125);             // S^WS | '(:' | 'least' | 'most'\n      switch (l1)\n      {\n      case 173:                     // 'least'\n        shiftT(173);                // 'least'\n        lookahead1W(267);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        try_AdditiveExpr();\n        break;\n      default:\n        shiftT(183);                // 'most'\n        lookahead1W(267);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        try_AdditiveExpr();\n      }\n      break;\n    default:\n      shiftT(140);                  // 'from'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_AdditiveExpr();\n      shiftT(248);                  // 'to'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_AdditiveExpr();\n    }\n  }\n\n  function parse_FTPosFilter()\n  {\n    eventHandler.startNonterminal(\"FTPosFilter\", e0);\n    switch (l1)\n    {\n    case 202:                       // 'ordered'\n      parse_FTOrder();\n      break;\n    case 269:                       // 'window'\n      parse_FTWindow();\n      break;\n    case 117:                       // 'distance'\n      parse_FTDistance();\n      break;\n    case 115:                       // 'different'\n    case 223:                       // 'same'\n      parse_FTScope();\n      break;\n    default:\n      parse_FTContent();\n    }\n    eventHandler.endNonterminal(\"FTPosFilter\", e0);\n  }\n\n  function try_FTPosFilter()\n  {\n    switch (l1)\n    {\n    case 202:                       // 'ordered'\n      try_FTOrder();\n      break;\n    case 269:                       // 'window'\n      try_FTWindow();\n      break;\n    case 117:                       // 'distance'\n      try_FTDistance();\n      break;\n    case 115:                       // 'different'\n    case 223:                       // 'same'\n      try_FTScope();\n      break;\n    default:\n      try_FTContent();\n    }\n  }\n\n  function parse_FTOrder()\n  {\n    eventHandler.startNonterminal(\"FTOrder\", e0);\n    shift(202);                     // 'ordered'\n    eventHandler.endNonterminal(\"FTOrder\", e0);\n  }\n\n  function try_FTOrder()\n  {\n    shiftT(202);                    // 'ordered'\n  }\n\n  function parse_FTWindow()\n  {\n    eventHandler.startNonterminal(\"FTWindow\", e0);\n    shift(269);                     // 'window'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_AdditiveExpr();\n    whitespace();\n    parse_FTUnit();\n    eventHandler.endNonterminal(\"FTWindow\", e0);\n  }\n\n  function try_FTWindow()\n  {\n    shiftT(269);                    // 'window'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_AdditiveExpr();\n    try_FTUnit();\n  }\n\n  function parse_FTDistance()\n  {\n    eventHandler.startNonterminal(\"FTDistance\", e0);\n    shift(117);                     // 'distance'\n    lookahead1W(149);               // S^WS | '(:' | 'at' | 'exactly' | 'from'\n    whitespace();\n    parse_FTRange();\n    whitespace();\n    parse_FTUnit();\n    eventHandler.endNonterminal(\"FTDistance\", e0);\n  }\n\n  function try_FTDistance()\n  {\n    shiftT(117);                    // 'distance'\n    lookahead1W(149);               // S^WS | '(:' | 'at' | 'exactly' | 'from'\n    try_FTRange();\n    try_FTUnit();\n  }\n\n  function parse_FTUnit()\n  {\n    eventHandler.startNonterminal(\"FTUnit\", e0);\n    switch (l1)\n    {\n    case 273:                       // 'words'\n      shift(273);                   // 'words'\n      break;\n    case 232:                       // 'sentences'\n      shift(232);                   // 'sentences'\n      break;\n    default:\n      shift(205);                   // 'paragraphs'\n    }\n    eventHandler.endNonterminal(\"FTUnit\", e0);\n  }\n\n  function try_FTUnit()\n  {\n    switch (l1)\n    {\n    case 273:                       // 'words'\n      shiftT(273);                  // 'words'\n      break;\n    case 232:                       // 'sentences'\n      shiftT(232);                  // 'sentences'\n      break;\n    default:\n      shiftT(205);                  // 'paragraphs'\n    }\n  }\n\n  function parse_FTScope()\n  {\n    eventHandler.startNonterminal(\"FTScope\", e0);\n    switch (l1)\n    {\n    case 223:                       // 'same'\n      shift(223);                   // 'same'\n      break;\n    default:\n      shift(115);                   // 'different'\n    }\n    lookahead1W(132);               // S^WS | '(:' | 'paragraph' | 'sentence'\n    whitespace();\n    parse_FTBigUnit();\n    eventHandler.endNonterminal(\"FTScope\", e0);\n  }\n\n  function try_FTScope()\n  {\n    switch (l1)\n    {\n    case 223:                       // 'same'\n      shiftT(223);                  // 'same'\n      break;\n    default:\n      shiftT(115);                  // 'different'\n    }\n    lookahead1W(132);               // S^WS | '(:' | 'paragraph' | 'sentence'\n    try_FTBigUnit();\n  }\n\n  function parse_FTBigUnit()\n  {\n    eventHandler.startNonterminal(\"FTBigUnit\", e0);\n    switch (l1)\n    {\n    case 231:                       // 'sentence'\n      shift(231);                   // 'sentence'\n      break;\n    default:\n      shift(204);                   // 'paragraph'\n    }\n    eventHandler.endNonterminal(\"FTBigUnit\", e0);\n  }\n\n  function try_FTBigUnit()\n  {\n    switch (l1)\n    {\n    case 231:                       // 'sentence'\n      shiftT(231);                  // 'sentence'\n      break;\n    default:\n      shiftT(204);                  // 'paragraph'\n    }\n  }\n\n  function parse_FTContent()\n  {\n    eventHandler.startNonterminal(\"FTContent\", e0);\n    switch (l1)\n    {\n    case 81:                        // 'at'\n      shift(81);                    // 'at'\n      lookahead1W(117);             // S^WS | '(:' | 'end' | 'start'\n      switch (l1)\n      {\n      case 237:                     // 'start'\n        shift(237);                 // 'start'\n        break;\n      default:\n        shift(126);                 // 'end'\n      }\n      break;\n    default:\n      shift(127);                   // 'entire'\n      lookahead1W(42);              // S^WS | '(:' | 'content'\n      shift(100);                   // 'content'\n    }\n    eventHandler.endNonterminal(\"FTContent\", e0);\n  }\n\n  function try_FTContent()\n  {\n    switch (l1)\n    {\n    case 81:                        // 'at'\n      shiftT(81);                   // 'at'\n      lookahead1W(117);             // S^WS | '(:' | 'end' | 'start'\n      switch (l1)\n      {\n      case 237:                     // 'start'\n        shiftT(237);                // 'start'\n        break;\n      default:\n        shiftT(126);                // 'end'\n      }\n      break;\n    default:\n      shiftT(127);                  // 'entire'\n      lookahead1W(42);              // S^WS | '(:' | 'content'\n      shiftT(100);                  // 'content'\n    }\n  }\n\n  function parse_FTMatchOptions()\n  {\n    eventHandler.startNonterminal(\"FTMatchOptions\", e0);\n    for (;;)\n    {\n      shift(259);                   // 'using'\n      lookahead1W(182);             // S^WS | '(:' | 'case' | 'diacritics' | 'language' | 'lowercase' | 'no' |\n      whitespace();\n      parse_FTMatchOption();\n      lookahead1W(215);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      if (l1 != 259)                // 'using'\n      {\n        break;\n      }\n    }\n    eventHandler.endNonterminal(\"FTMatchOptions\", e0);\n  }\n\n  function try_FTMatchOptions()\n  {\n    for (;;)\n    {\n      shiftT(259);                  // 'using'\n      lookahead1W(182);             // S^WS | '(:' | 'case' | 'diacritics' | 'language' | 'lowercase' | 'no' |\n      try_FTMatchOption();\n      lookahead1W(215);             // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n      if (l1 != 259)                // 'using'\n      {\n        break;\n      }\n    }\n  }\n\n  function parse_FTMatchOption()\n  {\n    eventHandler.startNonterminal(\"FTMatchOption\", e0);\n    switch (l1)\n    {\n    case 188:                       // 'no'\n      lookahead2W(161);             // S^WS | '(:' | 'stemming' | 'stop' | 'thesaurus' | 'wildcards'\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 169:                       // 'language'\n      parse_FTLanguageOption();\n      break;\n    case 268:                       // 'wildcards'\n    case 137404:                    // 'no' 'wildcards'\n      parse_FTWildCardOption();\n      break;\n    case 246:                       // 'thesaurus'\n    case 126140:                    // 'no' 'thesaurus'\n      parse_FTThesaurusOption();\n      break;\n    case 238:                       // 'stemming'\n    case 122044:                    // 'no' 'stemming'\n      parse_FTStemOption();\n      break;\n    case 114:                       // 'diacritics'\n      parse_FTDiacriticsOption();\n      break;\n    case 239:                       // 'stop'\n    case 122556:                    // 'no' 'stop'\n      parse_FTStopWordOption();\n      break;\n    case 199:                       // 'option'\n      parse_FTExtensionOption();\n      break;\n    default:\n      parse_FTCaseOption();\n    }\n    eventHandler.endNonterminal(\"FTMatchOption\", e0);\n  }\n\n  function try_FTMatchOption()\n  {\n    switch (l1)\n    {\n    case 188:                       // 'no'\n      lookahead2W(161);             // S^WS | '(:' | 'stemming' | 'stop' | 'thesaurus' | 'wildcards'\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 169:                       // 'language'\n      try_FTLanguageOption();\n      break;\n    case 268:                       // 'wildcards'\n    case 137404:                    // 'no' 'wildcards'\n      try_FTWildCardOption();\n      break;\n    case 246:                       // 'thesaurus'\n    case 126140:                    // 'no' 'thesaurus'\n      try_FTThesaurusOption();\n      break;\n    case 238:                       // 'stemming'\n    case 122044:                    // 'no' 'stemming'\n      try_FTStemOption();\n      break;\n    case 114:                       // 'diacritics'\n      try_FTDiacriticsOption();\n      break;\n    case 239:                       // 'stop'\n    case 122556:                    // 'no' 'stop'\n      try_FTStopWordOption();\n      break;\n    case 199:                       // 'option'\n      try_FTExtensionOption();\n      break;\n    default:\n      try_FTCaseOption();\n    }\n  }\n\n  function parse_FTCaseOption()\n  {\n    eventHandler.startNonterminal(\"FTCaseOption\", e0);\n    switch (l1)\n    {\n    case 88:                        // 'case'\n      shift(88);                    // 'case'\n      lookahead1W(124);             // S^WS | '(:' | 'insensitive' | 'sensitive'\n      switch (l1)\n      {\n      case 158:                     // 'insensitive'\n        shift(158);                 // 'insensitive'\n        break;\n      default:\n        shift(230);                 // 'sensitive'\n      }\n      break;\n    case 177:                       // 'lowercase'\n      shift(177);                   // 'lowercase'\n      break;\n    default:\n      shift(258);                   // 'uppercase'\n    }\n    eventHandler.endNonterminal(\"FTCaseOption\", e0);\n  }\n\n  function try_FTCaseOption()\n  {\n    switch (l1)\n    {\n    case 88:                        // 'case'\n      shiftT(88);                   // 'case'\n      lookahead1W(124);             // S^WS | '(:' | 'insensitive' | 'sensitive'\n      switch (l1)\n      {\n      case 158:                     // 'insensitive'\n        shiftT(158);                // 'insensitive'\n        break;\n      default:\n        shiftT(230);                // 'sensitive'\n      }\n      break;\n    case 177:                       // 'lowercase'\n      shiftT(177);                  // 'lowercase'\n      break;\n    default:\n      shiftT(258);                  // 'uppercase'\n    }\n  }\n\n  function parse_FTDiacriticsOption()\n  {\n    eventHandler.startNonterminal(\"FTDiacriticsOption\", e0);\n    shift(114);                     // 'diacritics'\n    lookahead1W(124);               // S^WS | '(:' | 'insensitive' | 'sensitive'\n    switch (l1)\n    {\n    case 158:                       // 'insensitive'\n      shift(158);                   // 'insensitive'\n      break;\n    default:\n      shift(230);                   // 'sensitive'\n    }\n    eventHandler.endNonterminal(\"FTDiacriticsOption\", e0);\n  }\n\n  function try_FTDiacriticsOption()\n  {\n    shiftT(114);                    // 'diacritics'\n    lookahead1W(124);               // S^WS | '(:' | 'insensitive' | 'sensitive'\n    switch (l1)\n    {\n    case 158:                       // 'insensitive'\n      shiftT(158);                  // 'insensitive'\n      break;\n    default:\n      shiftT(230);                  // 'sensitive'\n    }\n  }\n\n  function parse_FTStemOption()\n  {\n    eventHandler.startNonterminal(\"FTStemOption\", e0);\n    switch (l1)\n    {\n    case 238:                       // 'stemming'\n      shift(238);                   // 'stemming'\n      break;\n    default:\n      shift(188);                   // 'no'\n      lookahead1W(74);              // S^WS | '(:' | 'stemming'\n      shift(238);                   // 'stemming'\n    }\n    eventHandler.endNonterminal(\"FTStemOption\", e0);\n  }\n\n  function try_FTStemOption()\n  {\n    switch (l1)\n    {\n    case 238:                       // 'stemming'\n      shiftT(238);                  // 'stemming'\n      break;\n    default:\n      shiftT(188);                  // 'no'\n      lookahead1W(74);              // S^WS | '(:' | 'stemming'\n      shiftT(238);                  // 'stemming'\n    }\n  }\n\n  function parse_FTThesaurusOption()\n  {\n    eventHandler.startNonterminal(\"FTThesaurusOption\", e0);\n    switch (l1)\n    {\n    case 246:                       // 'thesaurus'\n      shift(246);                   // 'thesaurus'\n      lookahead1W(142);             // S^WS | '(' | '(:' | 'at' | 'default'\n      switch (l1)\n      {\n      case 81:                      // 'at'\n        whitespace();\n        parse_FTThesaurusID();\n        break;\n      case 109:                     // 'default'\n        shift(109);                 // 'default'\n        break;\n      default:\n        shift(34);                  // '('\n        lookahead1W(112);           // S^WS | '(:' | 'at' | 'default'\n        switch (l1)\n        {\n        case 81:                    // 'at'\n          whitespace();\n          parse_FTThesaurusID();\n          break;\n        default:\n          shift(109);               // 'default'\n        }\n        for (;;)\n        {\n          lookahead1W(101);         // S^WS | '(:' | ')' | ','\n          if (l1 != 41)             // ','\n          {\n            break;\n          }\n          shift(41);                // ','\n          lookahead1W(31);          // S^WS | '(:' | 'at'\n          whitespace();\n          parse_FTThesaurusID();\n        }\n        shift(37);                  // ')'\n      }\n      break;\n    default:\n      shift(188);                   // 'no'\n      lookahead1W(78);              // S^WS | '(:' | 'thesaurus'\n      shift(246);                   // 'thesaurus'\n    }\n    eventHandler.endNonterminal(\"FTThesaurusOption\", e0);\n  }\n\n  function try_FTThesaurusOption()\n  {\n    switch (l1)\n    {\n    case 246:                       // 'thesaurus'\n      shiftT(246);                  // 'thesaurus'\n      lookahead1W(142);             // S^WS | '(' | '(:' | 'at' | 'default'\n      switch (l1)\n      {\n      case 81:                      // 'at'\n        try_FTThesaurusID();\n        break;\n      case 109:                     // 'default'\n        shiftT(109);                // 'default'\n        break;\n      default:\n        shiftT(34);                 // '('\n        lookahead1W(112);           // S^WS | '(:' | 'at' | 'default'\n        switch (l1)\n        {\n        case 81:                    // 'at'\n          try_FTThesaurusID();\n          break;\n        default:\n          shiftT(109);              // 'default'\n        }\n        for (;;)\n        {\n          lookahead1W(101);         // S^WS | '(:' | ')' | ','\n          if (l1 != 41)             // ','\n          {\n            break;\n          }\n          shiftT(41);               // ','\n          lookahead1W(31);          // S^WS | '(:' | 'at'\n          try_FTThesaurusID();\n        }\n        shiftT(37);                 // ')'\n      }\n      break;\n    default:\n      shiftT(188);                  // 'no'\n      lookahead1W(78);              // S^WS | '(:' | 'thesaurus'\n      shiftT(246);                  // 'thesaurus'\n    }\n  }\n\n  function parse_FTThesaurusID()\n  {\n    eventHandler.startNonterminal(\"FTThesaurusID\", e0);\n    shift(81);                      // 'at'\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shift(7);                       // URILiteral\n    lookahead1W(221);               // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n    if (l1 == 217)                  // 'relationship'\n    {\n      shift(217);                   // 'relationship'\n      lookahead1W(17);              // StringLiteral | S^WS | '(:'\n      shift(11);                    // StringLiteral\n    }\n    lookahead1W(217);               // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n    switch (l1)\n    {\n    case 81:                        // 'at'\n      lookahead2W(165);             // S^WS | '(:' | 'end' | 'least' | 'most' | 'position' | 'start'\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 130                   // 'exactly'\n     || lk == 140                   // 'from'\n     || lk == 88657                 // 'at' 'least'\n     || lk == 93777)                // 'at' 'most'\n    {\n      whitespace();\n      parse_FTLiteralRange();\n      lookahead1W(58);              // S^WS | '(:' | 'levels'\n      shift(175);                   // 'levels'\n    }\n    eventHandler.endNonterminal(\"FTThesaurusID\", e0);\n  }\n\n  function try_FTThesaurusID()\n  {\n    shiftT(81);                     // 'at'\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shiftT(7);                      // URILiteral\n    lookahead1W(221);               // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n    if (l1 == 217)                  // 'relationship'\n    {\n      shiftT(217);                  // 'relationship'\n      lookahead1W(17);              // StringLiteral | S^WS | '(:'\n      shiftT(11);                   // StringLiteral\n    }\n    lookahead1W(217);               // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n    switch (l1)\n    {\n    case 81:                        // 'at'\n      lookahead2W(165);             // S^WS | '(:' | 'end' | 'least' | 'most' | 'position' | 'start'\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 130                   // 'exactly'\n     || lk == 140                   // 'from'\n     || lk == 88657                 // 'at' 'least'\n     || lk == 93777)                // 'at' 'most'\n    {\n      try_FTLiteralRange();\n      lookahead1W(58);              // S^WS | '(:' | 'levels'\n      shiftT(175);                  // 'levels'\n    }\n  }\n\n  function parse_FTLiteralRange()\n  {\n    eventHandler.startNonterminal(\"FTLiteralRange\", e0);\n    switch (l1)\n    {\n    case 130:                       // 'exactly'\n      shift(130);                   // 'exactly'\n      lookahead1W(16);              // IntegerLiteral | S^WS | '(:'\n      shift(8);                     // IntegerLiteral\n      break;\n    case 81:                        // 'at'\n      shift(81);                    // 'at'\n      lookahead1W(125);             // S^WS | '(:' | 'least' | 'most'\n      switch (l1)\n      {\n      case 173:                     // 'least'\n        shift(173);                 // 'least'\n        lookahead1W(16);            // IntegerLiteral | S^WS | '(:'\n        shift(8);                   // IntegerLiteral\n        break;\n      default:\n        shift(183);                 // 'most'\n        lookahead1W(16);            // IntegerLiteral | S^WS | '(:'\n        shift(8);                   // IntegerLiteral\n      }\n      break;\n    default:\n      shift(140);                   // 'from'\n      lookahead1W(16);              // IntegerLiteral | S^WS | '(:'\n      shift(8);                     // IntegerLiteral\n      lookahead1W(79);              // S^WS | '(:' | 'to'\n      shift(248);                   // 'to'\n      lookahead1W(16);              // IntegerLiteral | S^WS | '(:'\n      shift(8);                     // IntegerLiteral\n    }\n    eventHandler.endNonterminal(\"FTLiteralRange\", e0);\n  }\n\n  function try_FTLiteralRange()\n  {\n    switch (l1)\n    {\n    case 130:                       // 'exactly'\n      shiftT(130);                  // 'exactly'\n      lookahead1W(16);              // IntegerLiteral | S^WS | '(:'\n      shiftT(8);                    // IntegerLiteral\n      break;\n    case 81:                        // 'at'\n      shiftT(81);                   // 'at'\n      lookahead1W(125);             // S^WS | '(:' | 'least' | 'most'\n      switch (l1)\n      {\n      case 173:                     // 'least'\n        shiftT(173);                // 'least'\n        lookahead1W(16);            // IntegerLiteral | S^WS | '(:'\n        shiftT(8);                  // IntegerLiteral\n        break;\n      default:\n        shiftT(183);                // 'most'\n        lookahead1W(16);            // IntegerLiteral | S^WS | '(:'\n        shiftT(8);                  // IntegerLiteral\n      }\n      break;\n    default:\n      shiftT(140);                  // 'from'\n      lookahead1W(16);              // IntegerLiteral | S^WS | '(:'\n      shiftT(8);                    // IntegerLiteral\n      lookahead1W(79);              // S^WS | '(:' | 'to'\n      shiftT(248);                  // 'to'\n      lookahead1W(16);              // IntegerLiteral | S^WS | '(:'\n      shiftT(8);                    // IntegerLiteral\n    }\n  }\n\n  function parse_FTStopWordOption()\n  {\n    eventHandler.startNonterminal(\"FTStopWordOption\", e0);\n    switch (l1)\n    {\n    case 239:                       // 'stop'\n      shift(239);                   // 'stop'\n      lookahead1W(86);              // S^WS | '(:' | 'words'\n      shift(273);                   // 'words'\n      lookahead1W(142);             // S^WS | '(' | '(:' | 'at' | 'default'\n      switch (l1)\n      {\n      case 109:                     // 'default'\n        shift(109);                 // 'default'\n        for (;;)\n        {\n          lookahead1W(218);         // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n          if (l1 != 131             // 'except'\n           && l1 != 254)            // 'union'\n          {\n            break;\n          }\n          whitespace();\n          parse_FTStopWordsInclExcl();\n        }\n        break;\n      default:\n        whitespace();\n        parse_FTStopWords();\n        for (;;)\n        {\n          lookahead1W(218);         // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n          if (l1 != 131             // 'except'\n           && l1 != 254)            // 'union'\n          {\n            break;\n          }\n          whitespace();\n          parse_FTStopWordsInclExcl();\n        }\n      }\n      break;\n    default:\n      shift(188);                   // 'no'\n      lookahead1W(75);              // S^WS | '(:' | 'stop'\n      shift(239);                   // 'stop'\n      lookahead1W(86);              // S^WS | '(:' | 'words'\n      shift(273);                   // 'words'\n    }\n    eventHandler.endNonterminal(\"FTStopWordOption\", e0);\n  }\n\n  function try_FTStopWordOption()\n  {\n    switch (l1)\n    {\n    case 239:                       // 'stop'\n      shiftT(239);                  // 'stop'\n      lookahead1W(86);              // S^WS | '(:' | 'words'\n      shiftT(273);                  // 'words'\n      lookahead1W(142);             // S^WS | '(' | '(:' | 'at' | 'default'\n      switch (l1)\n      {\n      case 109:                     // 'default'\n        shiftT(109);                // 'default'\n        for (;;)\n        {\n          lookahead1W(218);         // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n          if (l1 != 131             // 'except'\n           && l1 != 254)            // 'union'\n          {\n            break;\n          }\n          try_FTStopWordsInclExcl();\n        }\n        break;\n      default:\n        try_FTStopWords();\n        for (;;)\n        {\n          lookahead1W(218);         // S^WS | EOF | '!=' | '(:' | ')' | ',' | ':' | ';' | '<' | '<<' | '<=' | '=' |\n          if (l1 != 131             // 'except'\n           && l1 != 254)            // 'union'\n          {\n            break;\n          }\n          try_FTStopWordsInclExcl();\n        }\n      }\n      break;\n    default:\n      shiftT(188);                  // 'no'\n      lookahead1W(75);              // S^WS | '(:' | 'stop'\n      shiftT(239);                  // 'stop'\n      lookahead1W(86);              // S^WS | '(:' | 'words'\n      shiftT(273);                  // 'words'\n    }\n  }\n\n  function parse_FTStopWords()\n  {\n    eventHandler.startNonterminal(\"FTStopWords\", e0);\n    switch (l1)\n    {\n    case 81:                        // 'at'\n      shift(81);                    // 'at'\n      lookahead1W(15);              // URILiteral | S^WS | '(:'\n      shift(7);                     // URILiteral\n      break;\n    default:\n      shift(34);                    // '('\n      lookahead1W(17);              // StringLiteral | S^WS | '(:'\n      shift(11);                    // StringLiteral\n      for (;;)\n      {\n        lookahead1W(101);           // S^WS | '(:' | ')' | ','\n        if (l1 != 41)               // ','\n        {\n          break;\n        }\n        shift(41);                  // ','\n        lookahead1W(17);            // StringLiteral | S^WS | '(:'\n        shift(11);                  // StringLiteral\n      }\n      shift(37);                    // ')'\n    }\n    eventHandler.endNonterminal(\"FTStopWords\", e0);\n  }\n\n  function try_FTStopWords()\n  {\n    switch (l1)\n    {\n    case 81:                        // 'at'\n      shiftT(81);                   // 'at'\n      lookahead1W(15);              // URILiteral | S^WS | '(:'\n      shiftT(7);                    // URILiteral\n      break;\n    default:\n      shiftT(34);                   // '('\n      lookahead1W(17);              // StringLiteral | S^WS | '(:'\n      shiftT(11);                   // StringLiteral\n      for (;;)\n      {\n        lookahead1W(101);           // S^WS | '(:' | ')' | ','\n        if (l1 != 41)               // ','\n        {\n          break;\n        }\n        shiftT(41);                 // ','\n        lookahead1W(17);            // StringLiteral | S^WS | '(:'\n        shiftT(11);                 // StringLiteral\n      }\n      shiftT(37);                   // ')'\n    }\n  }\n\n  function parse_FTStopWordsInclExcl()\n  {\n    eventHandler.startNonterminal(\"FTStopWordsInclExcl\", e0);\n    switch (l1)\n    {\n    case 254:                       // 'union'\n      shift(254);                   // 'union'\n      break;\n    default:\n      shift(131);                   // 'except'\n    }\n    lookahead1W(99);                // S^WS | '(' | '(:' | 'at'\n    whitespace();\n    parse_FTStopWords();\n    eventHandler.endNonterminal(\"FTStopWordsInclExcl\", e0);\n  }\n\n  function try_FTStopWordsInclExcl()\n  {\n    switch (l1)\n    {\n    case 254:                       // 'union'\n      shiftT(254);                  // 'union'\n      break;\n    default:\n      shiftT(131);                  // 'except'\n    }\n    lookahead1W(99);                // S^WS | '(' | '(:' | 'at'\n    try_FTStopWords();\n  }\n\n  function parse_FTLanguageOption()\n  {\n    eventHandler.startNonterminal(\"FTLanguageOption\", e0);\n    shift(169);                     // 'language'\n    lookahead1W(17);                // StringLiteral | S^WS | '(:'\n    shift(11);                      // StringLiteral\n    eventHandler.endNonterminal(\"FTLanguageOption\", e0);\n  }\n\n  function try_FTLanguageOption()\n  {\n    shiftT(169);                    // 'language'\n    lookahead1W(17);                // StringLiteral | S^WS | '(:'\n    shiftT(11);                     // StringLiteral\n  }\n\n  function parse_FTWildCardOption()\n  {\n    eventHandler.startNonterminal(\"FTWildCardOption\", e0);\n    switch (l1)\n    {\n    case 268:                       // 'wildcards'\n      shift(268);                   // 'wildcards'\n      break;\n    default:\n      shift(188);                   // 'no'\n      lookahead1W(84);              // S^WS | '(:' | 'wildcards'\n      shift(268);                   // 'wildcards'\n    }\n    eventHandler.endNonterminal(\"FTWildCardOption\", e0);\n  }\n\n  function try_FTWildCardOption()\n  {\n    switch (l1)\n    {\n    case 268:                       // 'wildcards'\n      shiftT(268);                  // 'wildcards'\n      break;\n    default:\n      shiftT(188);                  // 'no'\n      lookahead1W(84);              // S^WS | '(:' | 'wildcards'\n      shiftT(268);                  // 'wildcards'\n    }\n  }\n\n  function parse_FTExtensionOption()\n  {\n    eventHandler.startNonterminal(\"FTExtensionOption\", e0);\n    shift(199);                     // 'option'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_EQName();\n    lookahead1W(17);                // StringLiteral | S^WS | '(:'\n    shift(11);                      // StringLiteral\n    eventHandler.endNonterminal(\"FTExtensionOption\", e0);\n  }\n\n  function try_FTExtensionOption()\n  {\n    shiftT(199);                    // 'option'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_EQName();\n    lookahead1W(17);                // StringLiteral | S^WS | '(:'\n    shiftT(11);                     // StringLiteral\n  }\n\n  function parse_FTIgnoreOption()\n  {\n    eventHandler.startNonterminal(\"FTIgnoreOption\", e0);\n    shift(271);                     // 'without'\n    lookahead1W(42);                // S^WS | '(:' | 'content'\n    shift(100);                     // 'content'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_UnionExpr();\n    eventHandler.endNonterminal(\"FTIgnoreOption\", e0);\n  }\n\n  function try_FTIgnoreOption()\n  {\n    shiftT(271);                    // 'without'\n    lookahead1W(42);                // S^WS | '(:' | 'content'\n    shiftT(100);                    // 'content'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_UnionExpr();\n  }\n\n  function parse_CollectionDecl()\n  {\n    eventHandler.startNonterminal(\"CollectionDecl\", e0);\n    shift(95);                      // 'collection'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_EQName();\n    lookahead1W(107);               // S^WS | '(:' | ';' | 'as'\n    if (l1 == 79)                   // 'as'\n    {\n      whitespace();\n      parse_CollectionTypeDecl();\n    }\n    eventHandler.endNonterminal(\"CollectionDecl\", e0);\n  }\n\n  function parse_CollectionTypeDecl()\n  {\n    eventHandler.startNonterminal(\"CollectionTypeDecl\", e0);\n    shift(79);                      // 'as'\n    lookahead1W(178);               // S^WS | '(:' | 'attribute' | 'comment' | 'document-node' | 'element' |\n    whitespace();\n    parse_KindTest();\n    lookahead1W(156);               // S^WS | '(:' | '*' | '+' | ';' | '?'\n    if (l1 != 53)                   // ';'\n    {\n      whitespace();\n      parse_OccurrenceIndicator();\n    }\n    eventHandler.endNonterminal(\"CollectionTypeDecl\", e0);\n  }\n\n  function parse_IndexName()\n  {\n    eventHandler.startNonterminal(\"IndexName\", e0);\n    parse_EQName();\n    eventHandler.endNonterminal(\"IndexName\", e0);\n  }\n\n  function parse_IndexDomainExpr()\n  {\n    eventHandler.startNonterminal(\"IndexDomainExpr\", e0);\n    parse_PathExpr();\n    eventHandler.endNonterminal(\"IndexDomainExpr\", e0);\n  }\n\n  function parse_IndexKeySpec()\n  {\n    eventHandler.startNonterminal(\"IndexKeySpec\", e0);\n    parse_IndexKeyExpr();\n    if (l1 == 79)                   // 'as'\n    {\n      whitespace();\n      parse_IndexKeyTypeDecl();\n    }\n    lookahead1W(146);               // S^WS | '(:' | ',' | ';' | 'collation'\n    if (l1 == 94)                   // 'collation'\n    {\n      whitespace();\n      parse_IndexKeyCollation();\n    }\n    eventHandler.endNonterminal(\"IndexKeySpec\", e0);\n  }\n\n  function parse_IndexKeyExpr()\n  {\n    eventHandler.startNonterminal(\"IndexKeyExpr\", e0);\n    parse_PathExpr();\n    eventHandler.endNonterminal(\"IndexKeyExpr\", e0);\n  }\n\n  function parse_IndexKeyTypeDecl()\n  {\n    eventHandler.startNonterminal(\"IndexKeyTypeDecl\", e0);\n    shift(79);                      // 'as'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_AtomicType();\n    lookahead1W(169);               // S^WS | '(:' | '*' | '+' | ',' | ';' | '?' | 'collation'\n    if (l1 == 39                    // '*'\n     || l1 == 40                    // '+'\n     || l1 == 64)                   // '?'\n    {\n      whitespace();\n      parse_OccurrenceIndicator();\n    }\n    eventHandler.endNonterminal(\"IndexKeyTypeDecl\", e0);\n  }\n\n  function parse_AtomicType()\n  {\n    eventHandler.startNonterminal(\"AtomicType\", e0);\n    parse_EQName();\n    eventHandler.endNonterminal(\"AtomicType\", e0);\n  }\n\n  function parse_IndexKeyCollation()\n  {\n    eventHandler.startNonterminal(\"IndexKeyCollation\", e0);\n    shift(94);                      // 'collation'\n    lookahead1W(15);                // URILiteral | S^WS | '(:'\n    shift(7);                       // URILiteral\n    eventHandler.endNonterminal(\"IndexKeyCollation\", e0);\n  }\n\n  function parse_IndexDecl()\n  {\n    eventHandler.startNonterminal(\"IndexDecl\", e0);\n    shift(155);                     // 'index'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_IndexName();\n    lookahead1W(65);                // S^WS | '(:' | 'on'\n    shift(197);                     // 'on'\n    lookahead1W(63);                // S^WS | '(:' | 'nodes'\n    shift(192);                     // 'nodes'\n    lookahead1W(266);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_IndexDomainExpr();\n    shift(87);                      // 'by'\n    lookahead1W(266);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_IndexKeySpec();\n    for (;;)\n    {\n      lookahead1W(103);             // S^WS | '(:' | ',' | ';'\n      if (l1 != 41)                 // ','\n      {\n        break;\n      }\n      shift(41);                    // ','\n      lookahead1W(266);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_IndexKeySpec();\n    }\n    eventHandler.endNonterminal(\"IndexDecl\", e0);\n  }\n\n  function parse_ICDecl()\n  {\n    eventHandler.startNonterminal(\"ICDecl\", e0);\n    shift(161);                     // 'integrity'\n    lookahead1W(40);                // S^WS | '(:' | 'constraint'\n    shift(97);                      // 'constraint'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_EQName();\n    lookahead1W(120);               // S^WS | '(:' | 'foreign' | 'on'\n    switch (l1)\n    {\n    case 197:                       // 'on'\n      whitespace();\n      parse_ICCollection();\n      break;\n    default:\n      whitespace();\n      parse_ICForeignKey();\n    }\n    eventHandler.endNonterminal(\"ICDecl\", e0);\n  }\n\n  function parse_ICCollection()\n  {\n    eventHandler.startNonterminal(\"ICCollection\", e0);\n    shift(197);                     // 'on'\n    lookahead1W(39);                // S^WS | '(:' | 'collection'\n    shift(95);                      // 'collection'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_EQName();\n    lookahead1W(140);               // S^WS | '$' | '(:' | 'foreach' | 'node'\n    switch (l1)\n    {\n    case 31:                        // '$'\n      whitespace();\n      parse_ICCollSequence();\n      break;\n    case 191:                       // 'node'\n      whitespace();\n      parse_ICCollSequenceUnique();\n      break;\n    default:\n      whitespace();\n      parse_ICCollNode();\n    }\n    eventHandler.endNonterminal(\"ICCollection\", e0);\n  }\n\n  function parse_ICCollSequence()\n  {\n    eventHandler.startNonterminal(\"ICCollSequence\", e0);\n    parse_VarRef();\n    lookahead1W(37);                // S^WS | '(:' | 'check'\n    shift(92);                      // 'check'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"ICCollSequence\", e0);\n  }\n\n  function parse_ICCollSequenceUnique()\n  {\n    eventHandler.startNonterminal(\"ICCollSequenceUnique\", e0);\n    shift(191);                     // 'node'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    whitespace();\n    parse_VarRef();\n    lookahead1W(37);                // S^WS | '(:' | 'check'\n    shift(92);                      // 'check'\n    lookahead1W(80);                // S^WS | '(:' | 'unique'\n    shift(255);                     // 'unique'\n    lookahead1W(57);                // S^WS | '(:' | 'key'\n    shift(168);                     // 'key'\n    lookahead1W(266);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_PathExpr();\n    eventHandler.endNonterminal(\"ICCollSequenceUnique\", e0);\n  }\n\n  function parse_ICCollNode()\n  {\n    eventHandler.startNonterminal(\"ICCollNode\", e0);\n    shift(138);                     // 'foreach'\n    lookahead1W(62);                // S^WS | '(:' | 'node'\n    shift(191);                     // 'node'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    whitespace();\n    parse_VarRef();\n    lookahead1W(37);                // S^WS | '(:' | 'check'\n    shift(92);                      // 'check'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"ICCollNode\", e0);\n  }\n\n  function parse_ICForeignKey()\n  {\n    eventHandler.startNonterminal(\"ICForeignKey\", e0);\n    shift(139);                     // 'foreign'\n    lookahead1W(57);                // S^WS | '(:' | 'key'\n    shift(168);                     // 'key'\n    lookahead1W(51);                // S^WS | '(:' | 'from'\n    whitespace();\n    parse_ICForeignKeySource();\n    whitespace();\n    parse_ICForeignKeyTarget();\n    eventHandler.endNonterminal(\"ICForeignKey\", e0);\n  }\n\n  function parse_ICForeignKeySource()\n  {\n    eventHandler.startNonterminal(\"ICForeignKeySource\", e0);\n    shift(140);                     // 'from'\n    lookahead1W(39);                // S^WS | '(:' | 'collection'\n    whitespace();\n    parse_ICForeignKeyValues();\n    eventHandler.endNonterminal(\"ICForeignKeySource\", e0);\n  }\n\n  function parse_ICForeignKeyTarget()\n  {\n    eventHandler.startNonterminal(\"ICForeignKeyTarget\", e0);\n    shift(248);                     // 'to'\n    lookahead1W(39);                // S^WS | '(:' | 'collection'\n    whitespace();\n    parse_ICForeignKeyValues();\n    eventHandler.endNonterminal(\"ICForeignKeyTarget\", e0);\n  }\n\n  function parse_ICForeignKeyValues()\n  {\n    eventHandler.startNonterminal(\"ICForeignKeyValues\", e0);\n    shift(95);                      // 'collection'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_EQName();\n    lookahead1W(62);                // S^WS | '(:' | 'node'\n    shift(191);                     // 'node'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    whitespace();\n    parse_VarRef();\n    lookahead1W(57);                // S^WS | '(:' | 'key'\n    shift(168);                     // 'key'\n    lookahead1W(266);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_PathExpr();\n    eventHandler.endNonterminal(\"ICForeignKeyValues\", e0);\n  }\n\n  function try_Comment()\n  {\n    shiftT(36);                     // '(:'\n    for (;;)\n    {\n      lookahead1(89);               // CommentContents | '(:' | ':)'\n      if (l1 == 50)                 // ':)'\n      {\n        break;\n      }\n      switch (l1)\n      {\n      case 24:                      // CommentContents\n        shiftT(24);                 // CommentContents\n        break;\n      default:\n        try_Comment();\n      }\n    }\n    shiftT(50);                     // ':)'\n  }\n\n  function try_Whitespace()\n  {\n    switch (l1)\n    {\n    case 22:                        // S^WS\n      shiftT(22);                   // S^WS\n      break;\n    default:\n      try_Comment();\n    }\n  }\n\n  function parse_EQName()\n  {\n    eventHandler.startNonterminal(\"EQName\", e0);\n    lookahead1(250);                // EQName^Token | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' | 'and' |\n    switch (l1)\n    {\n    case 82:                        // 'attribute'\n      shift(82);                    // 'attribute'\n      break;\n    case 96:                        // 'comment'\n      shift(96);                    // 'comment'\n      break;\n    case 120:                       // 'document-node'\n      shift(120);                   // 'document-node'\n      break;\n    case 121:                       // 'element'\n      shift(121);                   // 'element'\n      break;\n    case 124:                       // 'empty-sequence'\n      shift(124);                   // 'empty-sequence'\n      break;\n    case 145:                       // 'function'\n      shift(145);                   // 'function'\n      break;\n    case 152:                       // 'if'\n      shift(152);                   // 'if'\n      break;\n    case 165:                       // 'item'\n      shift(165);                   // 'item'\n      break;\n    case 185:                       // 'namespace-node'\n      shift(185);                   // 'namespace-node'\n      break;\n    case 191:                       // 'node'\n      shift(191);                   // 'node'\n      break;\n    case 216:                       // 'processing-instruction'\n      shift(216);                   // 'processing-instruction'\n      break;\n    case 226:                       // 'schema-attribute'\n      shift(226);                   // 'schema-attribute'\n      break;\n    case 227:                       // 'schema-element'\n      shift(227);                   // 'schema-element'\n      break;\n    case 243:                       // 'switch'\n      shift(243);                   // 'switch'\n      break;\n    case 244:                       // 'text'\n      shift(244);                   // 'text'\n      break;\n    case 253:                       // 'typeswitch'\n      shift(253);                   // 'typeswitch'\n      break;\n    case 78:                        // 'array'\n      shift(78);                    // 'array'\n      break;\n    case 167:                       // 'json-item'\n      shift(167);                   // 'json-item'\n      break;\n    case 242:                       // 'structured-item'\n      shift(242);                   // 'structured-item'\n      break;\n    default:\n      parse_FunctionName();\n    }\n    eventHandler.endNonterminal(\"EQName\", e0);\n  }\n\n  function try_EQName()\n  {\n    lookahead1(250);                // EQName^Token | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' | 'and' |\n    switch (l1)\n    {\n    case 82:                        // 'attribute'\n      shiftT(82);                   // 'attribute'\n      break;\n    case 96:                        // 'comment'\n      shiftT(96);                   // 'comment'\n      break;\n    case 120:                       // 'document-node'\n      shiftT(120);                  // 'document-node'\n      break;\n    case 121:                       // 'element'\n      shiftT(121);                  // 'element'\n      break;\n    case 124:                       // 'empty-sequence'\n      shiftT(124);                  // 'empty-sequence'\n      break;\n    case 145:                       // 'function'\n      shiftT(145);                  // 'function'\n      break;\n    case 152:                       // 'if'\n      shiftT(152);                  // 'if'\n      break;\n    case 165:                       // 'item'\n      shiftT(165);                  // 'item'\n      break;\n    case 185:                       // 'namespace-node'\n      shiftT(185);                  // 'namespace-node'\n      break;\n    case 191:                       // 'node'\n      shiftT(191);                  // 'node'\n      break;\n    case 216:                       // 'processing-instruction'\n      shiftT(216);                  // 'processing-instruction'\n      break;\n    case 226:                       // 'schema-attribute'\n      shiftT(226);                  // 'schema-attribute'\n      break;\n    case 227:                       // 'schema-element'\n      shiftT(227);                  // 'schema-element'\n      break;\n    case 243:                       // 'switch'\n      shiftT(243);                  // 'switch'\n      break;\n    case 244:                       // 'text'\n      shiftT(244);                  // 'text'\n      break;\n    case 253:                       // 'typeswitch'\n      shiftT(253);                  // 'typeswitch'\n      break;\n    case 78:                        // 'array'\n      shiftT(78);                   // 'array'\n      break;\n    case 167:                       // 'json-item'\n      shiftT(167);                  // 'json-item'\n      break;\n    case 242:                       // 'structured-item'\n      shiftT(242);                  // 'structured-item'\n      break;\n    default:\n      try_FunctionName();\n    }\n  }\n\n  function parse_FunctionName()\n  {\n    eventHandler.startNonterminal(\"FunctionName\", e0);\n    switch (l1)\n    {\n    case 6:                         // EQName^Token\n      shift(6);                     // EQName^Token\n      break;\n    case 70:                        // 'after'\n      shift(70);                    // 'after'\n      break;\n    case 73:                        // 'ancestor'\n      shift(73);                    // 'ancestor'\n      break;\n    case 74:                        // 'ancestor-or-self'\n      shift(74);                    // 'ancestor-or-self'\n      break;\n    case 75:                        // 'and'\n      shift(75);                    // 'and'\n      break;\n    case 79:                        // 'as'\n      shift(79);                    // 'as'\n      break;\n    case 80:                        // 'ascending'\n      shift(80);                    // 'ascending'\n      break;\n    case 84:                        // 'before'\n      shift(84);                    // 'before'\n      break;\n    case 88:                        // 'case'\n      shift(88);                    // 'case'\n      break;\n    case 89:                        // 'cast'\n      shift(89);                    // 'cast'\n      break;\n    case 90:                        // 'castable'\n      shift(90);                    // 'castable'\n      break;\n    case 93:                        // 'child'\n      shift(93);                    // 'child'\n      break;\n    case 94:                        // 'collation'\n      shift(94);                    // 'collation'\n      break;\n    case 103:                       // 'copy'\n      shift(103);                   // 'copy'\n      break;\n    case 105:                       // 'count'\n      shift(105);                   // 'count'\n      break;\n    case 108:                       // 'declare'\n      shift(108);                   // 'declare'\n      break;\n    case 109:                       // 'default'\n      shift(109);                   // 'default'\n      break;\n    case 110:                       // 'delete'\n      shift(110);                   // 'delete'\n      break;\n    case 111:                       // 'descendant'\n      shift(111);                   // 'descendant'\n      break;\n    case 112:                       // 'descendant-or-self'\n      shift(112);                   // 'descendant-or-self'\n      break;\n    case 113:                       // 'descending'\n      shift(113);                   // 'descending'\n      break;\n    case 118:                       // 'div'\n      shift(118);                   // 'div'\n      break;\n    case 119:                       // 'document'\n      shift(119);                   // 'document'\n      break;\n    case 122:                       // 'else'\n      shift(122);                   // 'else'\n      break;\n    case 123:                       // 'empty'\n      shift(123);                   // 'empty'\n      break;\n    case 126:                       // 'end'\n      shift(126);                   // 'end'\n      break;\n    case 128:                       // 'eq'\n      shift(128);                   // 'eq'\n      break;\n    case 129:                       // 'every'\n      shift(129);                   // 'every'\n      break;\n    case 131:                       // 'except'\n      shift(131);                   // 'except'\n      break;\n    case 134:                       // 'first'\n      shift(134);                   // 'first'\n      break;\n    case 135:                       // 'following'\n      shift(135);                   // 'following'\n      break;\n    case 136:                       // 'following-sibling'\n      shift(136);                   // 'following-sibling'\n      break;\n    case 137:                       // 'for'\n      shift(137);                   // 'for'\n      break;\n    case 146:                       // 'ge'\n      shift(146);                   // 'ge'\n      break;\n    case 148:                       // 'group'\n      shift(148);                   // 'group'\n      break;\n    case 150:                       // 'gt'\n      shift(150);                   // 'gt'\n      break;\n    case 151:                       // 'idiv'\n      shift(151);                   // 'idiv'\n      break;\n    case 153:                       // 'import'\n      shift(153);                   // 'import'\n      break;\n    case 159:                       // 'insert'\n      shift(159);                   // 'insert'\n      break;\n    case 160:                       // 'instance'\n      shift(160);                   // 'instance'\n      break;\n    case 162:                       // 'intersect'\n      shift(162);                   // 'intersect'\n      break;\n    case 163:                       // 'into'\n      shift(163);                   // 'into'\n      break;\n    case 164:                       // 'is'\n      shift(164);                   // 'is'\n      break;\n    case 170:                       // 'last'\n      shift(170);                   // 'last'\n      break;\n    case 172:                       // 'le'\n      shift(172);                   // 'le'\n      break;\n    case 174:                       // 'let'\n      shift(174);                   // 'let'\n      break;\n    case 178:                       // 'lt'\n      shift(178);                   // 'lt'\n      break;\n    case 180:                       // 'mod'\n      shift(180);                   // 'mod'\n      break;\n    case 181:                       // 'modify'\n      shift(181);                   // 'modify'\n      break;\n    case 182:                       // 'module'\n      shift(182);                   // 'module'\n      break;\n    case 184:                       // 'namespace'\n      shift(184);                   // 'namespace'\n      break;\n    case 186:                       // 'ne'\n      shift(186);                   // 'ne'\n      break;\n    case 198:                       // 'only'\n      shift(198);                   // 'only'\n      break;\n    case 200:                       // 'or'\n      shift(200);                   // 'or'\n      break;\n    case 201:                       // 'order'\n      shift(201);                   // 'order'\n      break;\n    case 202:                       // 'ordered'\n      shift(202);                   // 'ordered'\n      break;\n    case 206:                       // 'parent'\n      shift(206);                   // 'parent'\n      break;\n    case 212:                       // 'preceding'\n      shift(212);                   // 'preceding'\n      break;\n    case 213:                       // 'preceding-sibling'\n      shift(213);                   // 'preceding-sibling'\n      break;\n    case 218:                       // 'rename'\n      shift(218);                   // 'rename'\n      break;\n    case 219:                       // 'replace'\n      shift(219);                   // 'replace'\n      break;\n    case 220:                       // 'return'\n      shift(220);                   // 'return'\n      break;\n    case 224:                       // 'satisfies'\n      shift(224);                   // 'satisfies'\n      break;\n    case 229:                       // 'self'\n      shift(229);                   // 'self'\n      break;\n    case 235:                       // 'some'\n      shift(235);                   // 'some'\n      break;\n    case 236:                       // 'stable'\n      shift(236);                   // 'stable'\n      break;\n    case 237:                       // 'start'\n      shift(237);                   // 'start'\n      break;\n    case 248:                       // 'to'\n      shift(248);                   // 'to'\n      break;\n    case 249:                       // 'treat'\n      shift(249);                   // 'treat'\n      break;\n    case 250:                       // 'try'\n      shift(250);                   // 'try'\n      break;\n    case 254:                       // 'union'\n      shift(254);                   // 'union'\n      break;\n    case 256:                       // 'unordered'\n      shift(256);                   // 'unordered'\n      break;\n    case 260:                       // 'validate'\n      shift(260);                   // 'validate'\n      break;\n    case 266:                       // 'where'\n      shift(266);                   // 'where'\n      break;\n    case 270:                       // 'with'\n      shift(270);                   // 'with'\n      break;\n    case 274:                       // 'xquery'\n      shift(274);                   // 'xquery'\n      break;\n    case 72:                        // 'allowing'\n      shift(72);                    // 'allowing'\n      break;\n    case 81:                        // 'at'\n      shift(81);                    // 'at'\n      break;\n    case 83:                        // 'base-uri'\n      shift(83);                    // 'base-uri'\n      break;\n    case 85:                        // 'boundary-space'\n      shift(85);                    // 'boundary-space'\n      break;\n    case 86:                        // 'break'\n      shift(86);                    // 'break'\n      break;\n    case 91:                        // 'catch'\n      shift(91);                    // 'catch'\n      break;\n    case 98:                        // 'construction'\n      shift(98);                    // 'construction'\n      break;\n    case 101:                       // 'context'\n      shift(101);                   // 'context'\n      break;\n    case 102:                       // 'continue'\n      shift(102);                   // 'continue'\n      break;\n    case 104:                       // 'copy-namespaces'\n      shift(104);                   // 'copy-namespaces'\n      break;\n    case 106:                       // 'decimal-format'\n      shift(106);                   // 'decimal-format'\n      break;\n    case 125:                       // 'encoding'\n      shift(125);                   // 'encoding'\n      break;\n    case 132:                       // 'exit'\n      shift(132);                   // 'exit'\n      break;\n    case 133:                       // 'external'\n      shift(133);                   // 'external'\n      break;\n    case 141:                       // 'ft-option'\n      shift(141);                   // 'ft-option'\n      break;\n    case 154:                       // 'in'\n      shift(154);                   // 'in'\n      break;\n    case 155:                       // 'index'\n      shift(155);                   // 'index'\n      break;\n    case 161:                       // 'integrity'\n      shift(161);                   // 'integrity'\n      break;\n    case 171:                       // 'lax'\n      shift(171);                   // 'lax'\n      break;\n    case 192:                       // 'nodes'\n      shift(192);                   // 'nodes'\n      break;\n    case 199:                       // 'option'\n      shift(199);                   // 'option'\n      break;\n    case 203:                       // 'ordering'\n      shift(203);                   // 'ordering'\n      break;\n    case 222:                       // 'revalidation'\n      shift(222);                   // 'revalidation'\n      break;\n    case 225:                       // 'schema'\n      shift(225);                   // 'schema'\n      break;\n    case 228:                       // 'score'\n      shift(228);                   // 'score'\n      break;\n    case 234:                       // 'sliding'\n      shift(234);                   // 'sliding'\n      break;\n    case 240:                       // 'strict'\n      shift(240);                   // 'strict'\n      break;\n    case 251:                       // 'tumbling'\n      shift(251);                   // 'tumbling'\n      break;\n    case 252:                       // 'type'\n      shift(252);                   // 'type'\n      break;\n    case 257:                       // 'updating'\n      shift(257);                   // 'updating'\n      break;\n    case 261:                       // 'value'\n      shift(261);                   // 'value'\n      break;\n    case 262:                       // 'variable'\n      shift(262);                   // 'variable'\n      break;\n    case 263:                       // 'version'\n      shift(263);                   // 'version'\n      break;\n    case 267:                       // 'while'\n      shift(267);                   // 'while'\n      break;\n    case 97:                        // 'constraint'\n      shift(97);                    // 'constraint'\n      break;\n    case 176:                       // 'loop'\n      shift(176);                   // 'loop'\n      break;\n    case 221:                       // 'returning'\n      shift(221);                   // 'returning'\n      break;\n    case 77:                        // 'append'\n      shift(77);                    // 'append'\n      break;\n    case 166:                       // 'json'\n      shift(166);                   // 'json'\n      break;\n    default:\n      shift(194);                   // 'object'\n    }\n    eventHandler.endNonterminal(\"FunctionName\", e0);\n  }\n\n  function try_FunctionName()\n  {\n    switch (l1)\n    {\n    case 6:                         // EQName^Token\n      shiftT(6);                    // EQName^Token\n      break;\n    case 70:                        // 'after'\n      shiftT(70);                   // 'after'\n      break;\n    case 73:                        // 'ancestor'\n      shiftT(73);                   // 'ancestor'\n      break;\n    case 74:                        // 'ancestor-or-self'\n      shiftT(74);                   // 'ancestor-or-self'\n      break;\n    case 75:                        // 'and'\n      shiftT(75);                   // 'and'\n      break;\n    case 79:                        // 'as'\n      shiftT(79);                   // 'as'\n      break;\n    case 80:                        // 'ascending'\n      shiftT(80);                   // 'ascending'\n      break;\n    case 84:                        // 'before'\n      shiftT(84);                   // 'before'\n      break;\n    case 88:                        // 'case'\n      shiftT(88);                   // 'case'\n      break;\n    case 89:                        // 'cast'\n      shiftT(89);                   // 'cast'\n      break;\n    case 90:                        // 'castable'\n      shiftT(90);                   // 'castable'\n      break;\n    case 93:                        // 'child'\n      shiftT(93);                   // 'child'\n      break;\n    case 94:                        // 'collation'\n      shiftT(94);                   // 'collation'\n      break;\n    case 103:                       // 'copy'\n      shiftT(103);                  // 'copy'\n      break;\n    case 105:                       // 'count'\n      shiftT(105);                  // 'count'\n      break;\n    case 108:                       // 'declare'\n      shiftT(108);                  // 'declare'\n      break;\n    case 109:                       // 'default'\n      shiftT(109);                  // 'default'\n      break;\n    case 110:                       // 'delete'\n      shiftT(110);                  // 'delete'\n      break;\n    case 111:                       // 'descendant'\n      shiftT(111);                  // 'descendant'\n      break;\n    case 112:                       // 'descendant-or-self'\n      shiftT(112);                  // 'descendant-or-self'\n      break;\n    case 113:                       // 'descending'\n      shiftT(113);                  // 'descending'\n      break;\n    case 118:                       // 'div'\n      shiftT(118);                  // 'div'\n      break;\n    case 119:                       // 'document'\n      shiftT(119);                  // 'document'\n      break;\n    case 122:                       // 'else'\n      shiftT(122);                  // 'else'\n      break;\n    case 123:                       // 'empty'\n      shiftT(123);                  // 'empty'\n      break;\n    case 126:                       // 'end'\n      shiftT(126);                  // 'end'\n      break;\n    case 128:                       // 'eq'\n      shiftT(128);                  // 'eq'\n      break;\n    case 129:                       // 'every'\n      shiftT(129);                  // 'every'\n      break;\n    case 131:                       // 'except'\n      shiftT(131);                  // 'except'\n      break;\n    case 134:                       // 'first'\n      shiftT(134);                  // 'first'\n      break;\n    case 135:                       // 'following'\n      shiftT(135);                  // 'following'\n      break;\n    case 136:                       // 'following-sibling'\n      shiftT(136);                  // 'following-sibling'\n      break;\n    case 137:                       // 'for'\n      shiftT(137);                  // 'for'\n      break;\n    case 146:                       // 'ge'\n      shiftT(146);                  // 'ge'\n      break;\n    case 148:                       // 'group'\n      shiftT(148);                  // 'group'\n      break;\n    case 150:                       // 'gt'\n      shiftT(150);                  // 'gt'\n      break;\n    case 151:                       // 'idiv'\n      shiftT(151);                  // 'idiv'\n      break;\n    case 153:                       // 'import'\n      shiftT(153);                  // 'import'\n      break;\n    case 159:                       // 'insert'\n      shiftT(159);                  // 'insert'\n      break;\n    case 160:                       // 'instance'\n      shiftT(160);                  // 'instance'\n      break;\n    case 162:                       // 'intersect'\n      shiftT(162);                  // 'intersect'\n      break;\n    case 163:                       // 'into'\n      shiftT(163);                  // 'into'\n      break;\n    case 164:                       // 'is'\n      shiftT(164);                  // 'is'\n      break;\n    case 170:                       // 'last'\n      shiftT(170);                  // 'last'\n      break;\n    case 172:                       // 'le'\n      shiftT(172);                  // 'le'\n      break;\n    case 174:                       // 'let'\n      shiftT(174);                  // 'let'\n      break;\n    case 178:                       // 'lt'\n      shiftT(178);                  // 'lt'\n      break;\n    case 180:                       // 'mod'\n      shiftT(180);                  // 'mod'\n      break;\n    case 181:                       // 'modify'\n      shiftT(181);                  // 'modify'\n      break;\n    case 182:                       // 'module'\n      shiftT(182);                  // 'module'\n      break;\n    case 184:                       // 'namespace'\n      shiftT(184);                  // 'namespace'\n      break;\n    case 186:                       // 'ne'\n      shiftT(186);                  // 'ne'\n      break;\n    case 198:                       // 'only'\n      shiftT(198);                  // 'only'\n      break;\n    case 200:                       // 'or'\n      shiftT(200);                  // 'or'\n      break;\n    case 201:                       // 'order'\n      shiftT(201);                  // 'order'\n      break;\n    case 202:                       // 'ordered'\n      shiftT(202);                  // 'ordered'\n      break;\n    case 206:                       // 'parent'\n      shiftT(206);                  // 'parent'\n      break;\n    case 212:                       // 'preceding'\n      shiftT(212);                  // 'preceding'\n      break;\n    case 213:                       // 'preceding-sibling'\n      shiftT(213);                  // 'preceding-sibling'\n      break;\n    case 218:                       // 'rename'\n      shiftT(218);                  // 'rename'\n      break;\n    case 219:                       // 'replace'\n      shiftT(219);                  // 'replace'\n      break;\n    case 220:                       // 'return'\n      shiftT(220);                  // 'return'\n      break;\n    case 224:                       // 'satisfies'\n      shiftT(224);                  // 'satisfies'\n      break;\n    case 229:                       // 'self'\n      shiftT(229);                  // 'self'\n      break;\n    case 235:                       // 'some'\n      shiftT(235);                  // 'some'\n      break;\n    case 236:                       // 'stable'\n      shiftT(236);                  // 'stable'\n      break;\n    case 237:                       // 'start'\n      shiftT(237);                  // 'start'\n      break;\n    case 248:                       // 'to'\n      shiftT(248);                  // 'to'\n      break;\n    case 249:                       // 'treat'\n      shiftT(249);                  // 'treat'\n      break;\n    case 250:                       // 'try'\n      shiftT(250);                  // 'try'\n      break;\n    case 254:                       // 'union'\n      shiftT(254);                  // 'union'\n      break;\n    case 256:                       // 'unordered'\n      shiftT(256);                  // 'unordered'\n      break;\n    case 260:                       // 'validate'\n      shiftT(260);                  // 'validate'\n      break;\n    case 266:                       // 'where'\n      shiftT(266);                  // 'where'\n      break;\n    case 270:                       // 'with'\n      shiftT(270);                  // 'with'\n      break;\n    case 274:                       // 'xquery'\n      shiftT(274);                  // 'xquery'\n      break;\n    case 72:                        // 'allowing'\n      shiftT(72);                   // 'allowing'\n      break;\n    case 81:                        // 'at'\n      shiftT(81);                   // 'at'\n      break;\n    case 83:                        // 'base-uri'\n      shiftT(83);                   // 'base-uri'\n      break;\n    case 85:                        // 'boundary-space'\n      shiftT(85);                   // 'boundary-space'\n      break;\n    case 86:                        // 'break'\n      shiftT(86);                   // 'break'\n      break;\n    case 91:                        // 'catch'\n      shiftT(91);                   // 'catch'\n      break;\n    case 98:                        // 'construction'\n      shiftT(98);                   // 'construction'\n      break;\n    case 101:                       // 'context'\n      shiftT(101);                  // 'context'\n      break;\n    case 102:                       // 'continue'\n      shiftT(102);                  // 'continue'\n      break;\n    case 104:                       // 'copy-namespaces'\n      shiftT(104);                  // 'copy-namespaces'\n      break;\n    case 106:                       // 'decimal-format'\n      shiftT(106);                  // 'decimal-format'\n      break;\n    case 125:                       // 'encoding'\n      shiftT(125);                  // 'encoding'\n      break;\n    case 132:                       // 'exit'\n      shiftT(132);                  // 'exit'\n      break;\n    case 133:                       // 'external'\n      shiftT(133);                  // 'external'\n      break;\n    case 141:                       // 'ft-option'\n      shiftT(141);                  // 'ft-option'\n      break;\n    case 154:                       // 'in'\n      shiftT(154);                  // 'in'\n      break;\n    case 155:                       // 'index'\n      shiftT(155);                  // 'index'\n      break;\n    case 161:                       // 'integrity'\n      shiftT(161);                  // 'integrity'\n      break;\n    case 171:                       // 'lax'\n      shiftT(171);                  // 'lax'\n      break;\n    case 192:                       // 'nodes'\n      shiftT(192);                  // 'nodes'\n      break;\n    case 199:                       // 'option'\n      shiftT(199);                  // 'option'\n      break;\n    case 203:                       // 'ordering'\n      shiftT(203);                  // 'ordering'\n      break;\n    case 222:                       // 'revalidation'\n      shiftT(222);                  // 'revalidation'\n      break;\n    case 225:                       // 'schema'\n      shiftT(225);                  // 'schema'\n      break;\n    case 228:                       // 'score'\n      shiftT(228);                  // 'score'\n      break;\n    case 234:                       // 'sliding'\n      shiftT(234);                  // 'sliding'\n      break;\n    case 240:                       // 'strict'\n      shiftT(240);                  // 'strict'\n      break;\n    case 251:                       // 'tumbling'\n      shiftT(251);                  // 'tumbling'\n      break;\n    case 252:                       // 'type'\n      shiftT(252);                  // 'type'\n      break;\n    case 257:                       // 'updating'\n      shiftT(257);                  // 'updating'\n      break;\n    case 261:                       // 'value'\n      shiftT(261);                  // 'value'\n      break;\n    case 262:                       // 'variable'\n      shiftT(262);                  // 'variable'\n      break;\n    case 263:                       // 'version'\n      shiftT(263);                  // 'version'\n      break;\n    case 267:                       // 'while'\n      shiftT(267);                  // 'while'\n      break;\n    case 97:                        // 'constraint'\n      shiftT(97);                   // 'constraint'\n      break;\n    case 176:                       // 'loop'\n      shiftT(176);                  // 'loop'\n      break;\n    case 221:                       // 'returning'\n      shiftT(221);                  // 'returning'\n      break;\n    case 77:                        // 'append'\n      shiftT(77);                   // 'append'\n      break;\n    case 166:                       // 'json'\n      shiftT(166);                  // 'json'\n      break;\n    default:\n      shiftT(194);                  // 'object'\n    }\n  }\n\n  function parse_NCName()\n  {\n    eventHandler.startNonterminal(\"NCName\", e0);\n    switch (l1)\n    {\n    case 19:                        // NCName^Token\n      shift(19);                    // NCName^Token\n      break;\n    case 70:                        // 'after'\n      shift(70);                    // 'after'\n      break;\n    case 75:                        // 'and'\n      shift(75);                    // 'and'\n      break;\n    case 79:                        // 'as'\n      shift(79);                    // 'as'\n      break;\n    case 80:                        // 'ascending'\n      shift(80);                    // 'ascending'\n      break;\n    case 84:                        // 'before'\n      shift(84);                    // 'before'\n      break;\n    case 88:                        // 'case'\n      shift(88);                    // 'case'\n      break;\n    case 89:                        // 'cast'\n      shift(89);                    // 'cast'\n      break;\n    case 90:                        // 'castable'\n      shift(90);                    // 'castable'\n      break;\n    case 94:                        // 'collation'\n      shift(94);                    // 'collation'\n      break;\n    case 105:                       // 'count'\n      shift(105);                   // 'count'\n      break;\n    case 109:                       // 'default'\n      shift(109);                   // 'default'\n      break;\n    case 113:                       // 'descending'\n      shift(113);                   // 'descending'\n      break;\n    case 118:                       // 'div'\n      shift(118);                   // 'div'\n      break;\n    case 122:                       // 'else'\n      shift(122);                   // 'else'\n      break;\n    case 123:                       // 'empty'\n      shift(123);                   // 'empty'\n      break;\n    case 126:                       // 'end'\n      shift(126);                   // 'end'\n      break;\n    case 128:                       // 'eq'\n      shift(128);                   // 'eq'\n      break;\n    case 131:                       // 'except'\n      shift(131);                   // 'except'\n      break;\n    case 137:                       // 'for'\n      shift(137);                   // 'for'\n      break;\n    case 146:                       // 'ge'\n      shift(146);                   // 'ge'\n      break;\n    case 148:                       // 'group'\n      shift(148);                   // 'group'\n      break;\n    case 150:                       // 'gt'\n      shift(150);                   // 'gt'\n      break;\n    case 151:                       // 'idiv'\n      shift(151);                   // 'idiv'\n      break;\n    case 160:                       // 'instance'\n      shift(160);                   // 'instance'\n      break;\n    case 162:                       // 'intersect'\n      shift(162);                   // 'intersect'\n      break;\n    case 163:                       // 'into'\n      shift(163);                   // 'into'\n      break;\n    case 164:                       // 'is'\n      shift(164);                   // 'is'\n      break;\n    case 172:                       // 'le'\n      shift(172);                   // 'le'\n      break;\n    case 174:                       // 'let'\n      shift(174);                   // 'let'\n      break;\n    case 178:                       // 'lt'\n      shift(178);                   // 'lt'\n      break;\n    case 180:                       // 'mod'\n      shift(180);                   // 'mod'\n      break;\n    case 181:                       // 'modify'\n      shift(181);                   // 'modify'\n      break;\n    case 186:                       // 'ne'\n      shift(186);                   // 'ne'\n      break;\n    case 198:                       // 'only'\n      shift(198);                   // 'only'\n      break;\n    case 200:                       // 'or'\n      shift(200);                   // 'or'\n      break;\n    case 201:                       // 'order'\n      shift(201);                   // 'order'\n      break;\n    case 220:                       // 'return'\n      shift(220);                   // 'return'\n      break;\n    case 224:                       // 'satisfies'\n      shift(224);                   // 'satisfies'\n      break;\n    case 236:                       // 'stable'\n      shift(236);                   // 'stable'\n      break;\n    case 237:                       // 'start'\n      shift(237);                   // 'start'\n      break;\n    case 248:                       // 'to'\n      shift(248);                   // 'to'\n      break;\n    case 249:                       // 'treat'\n      shift(249);                   // 'treat'\n      break;\n    case 254:                       // 'union'\n      shift(254);                   // 'union'\n      break;\n    case 266:                       // 'where'\n      shift(266);                   // 'where'\n      break;\n    case 270:                       // 'with'\n      shift(270);                   // 'with'\n      break;\n    case 73:                        // 'ancestor'\n      shift(73);                    // 'ancestor'\n      break;\n    case 74:                        // 'ancestor-or-self'\n      shift(74);                    // 'ancestor-or-self'\n      break;\n    case 82:                        // 'attribute'\n      shift(82);                    // 'attribute'\n      break;\n    case 93:                        // 'child'\n      shift(93);                    // 'child'\n      break;\n    case 96:                        // 'comment'\n      shift(96);                    // 'comment'\n      break;\n    case 103:                       // 'copy'\n      shift(103);                   // 'copy'\n      break;\n    case 108:                       // 'declare'\n      shift(108);                   // 'declare'\n      break;\n    case 110:                       // 'delete'\n      shift(110);                   // 'delete'\n      break;\n    case 111:                       // 'descendant'\n      shift(111);                   // 'descendant'\n      break;\n    case 112:                       // 'descendant-or-self'\n      shift(112);                   // 'descendant-or-self'\n      break;\n    case 119:                       // 'document'\n      shift(119);                   // 'document'\n      break;\n    case 120:                       // 'document-node'\n      shift(120);                   // 'document-node'\n      break;\n    case 121:                       // 'element'\n      shift(121);                   // 'element'\n      break;\n    case 124:                       // 'empty-sequence'\n      shift(124);                   // 'empty-sequence'\n      break;\n    case 129:                       // 'every'\n      shift(129);                   // 'every'\n      break;\n    case 134:                       // 'first'\n      shift(134);                   // 'first'\n      break;\n    case 135:                       // 'following'\n      shift(135);                   // 'following'\n      break;\n    case 136:                       // 'following-sibling'\n      shift(136);                   // 'following-sibling'\n      break;\n    case 145:                       // 'function'\n      shift(145);                   // 'function'\n      break;\n    case 152:                       // 'if'\n      shift(152);                   // 'if'\n      break;\n    case 153:                       // 'import'\n      shift(153);                   // 'import'\n      break;\n    case 159:                       // 'insert'\n      shift(159);                   // 'insert'\n      break;\n    case 165:                       // 'item'\n      shift(165);                   // 'item'\n      break;\n    case 170:                       // 'last'\n      shift(170);                   // 'last'\n      break;\n    case 182:                       // 'module'\n      shift(182);                   // 'module'\n      break;\n    case 184:                       // 'namespace'\n      shift(184);                   // 'namespace'\n      break;\n    case 185:                       // 'namespace-node'\n      shift(185);                   // 'namespace-node'\n      break;\n    case 191:                       // 'node'\n      shift(191);                   // 'node'\n      break;\n    case 202:                       // 'ordered'\n      shift(202);                   // 'ordered'\n      break;\n    case 206:                       // 'parent'\n      shift(206);                   // 'parent'\n      break;\n    case 212:                       // 'preceding'\n      shift(212);                   // 'preceding'\n      break;\n    case 213:                       // 'preceding-sibling'\n      shift(213);                   // 'preceding-sibling'\n      break;\n    case 216:                       // 'processing-instruction'\n      shift(216);                   // 'processing-instruction'\n      break;\n    case 218:                       // 'rename'\n      shift(218);                   // 'rename'\n      break;\n    case 219:                       // 'replace'\n      shift(219);                   // 'replace'\n      break;\n    case 226:                       // 'schema-attribute'\n      shift(226);                   // 'schema-attribute'\n      break;\n    case 227:                       // 'schema-element'\n      shift(227);                   // 'schema-element'\n      break;\n    case 229:                       // 'self'\n      shift(229);                   // 'self'\n      break;\n    case 235:                       // 'some'\n      shift(235);                   // 'some'\n      break;\n    case 243:                       // 'switch'\n      shift(243);                   // 'switch'\n      break;\n    case 244:                       // 'text'\n      shift(244);                   // 'text'\n      break;\n    case 250:                       // 'try'\n      shift(250);                   // 'try'\n      break;\n    case 253:                       // 'typeswitch'\n      shift(253);                   // 'typeswitch'\n      break;\n    case 256:                       // 'unordered'\n      shift(256);                   // 'unordered'\n      break;\n    case 260:                       // 'validate'\n      shift(260);                   // 'validate'\n      break;\n    case 262:                       // 'variable'\n      shift(262);                   // 'variable'\n      break;\n    case 274:                       // 'xquery'\n      shift(274);                   // 'xquery'\n      break;\n    case 72:                        // 'allowing'\n      shift(72);                    // 'allowing'\n      break;\n    case 81:                        // 'at'\n      shift(81);                    // 'at'\n      break;\n    case 83:                        // 'base-uri'\n      shift(83);                    // 'base-uri'\n      break;\n    case 85:                        // 'boundary-space'\n      shift(85);                    // 'boundary-space'\n      break;\n    case 86:                        // 'break'\n      shift(86);                    // 'break'\n      break;\n    case 91:                        // 'catch'\n      shift(91);                    // 'catch'\n      break;\n    case 98:                        // 'construction'\n      shift(98);                    // 'construction'\n      break;\n    case 101:                       // 'context'\n      shift(101);                   // 'context'\n      break;\n    case 102:                       // 'continue'\n      shift(102);                   // 'continue'\n      break;\n    case 104:                       // 'copy-namespaces'\n      shift(104);                   // 'copy-namespaces'\n      break;\n    case 106:                       // 'decimal-format'\n      shift(106);                   // 'decimal-format'\n      break;\n    case 125:                       // 'encoding'\n      shift(125);                   // 'encoding'\n      break;\n    case 132:                       // 'exit'\n      shift(132);                   // 'exit'\n      break;\n    case 133:                       // 'external'\n      shift(133);                   // 'external'\n      break;\n    case 141:                       // 'ft-option'\n      shift(141);                   // 'ft-option'\n      break;\n    case 154:                       // 'in'\n      shift(154);                   // 'in'\n      break;\n    case 155:                       // 'index'\n      shift(155);                   // 'index'\n      break;\n    case 161:                       // 'integrity'\n      shift(161);                   // 'integrity'\n      break;\n    case 171:                       // 'lax'\n      shift(171);                   // 'lax'\n      break;\n    case 192:                       // 'nodes'\n      shift(192);                   // 'nodes'\n      break;\n    case 199:                       // 'option'\n      shift(199);                   // 'option'\n      break;\n    case 203:                       // 'ordering'\n      shift(203);                   // 'ordering'\n      break;\n    case 222:                       // 'revalidation'\n      shift(222);                   // 'revalidation'\n      break;\n    case 225:                       // 'schema'\n      shift(225);                   // 'schema'\n      break;\n    case 228:                       // 'score'\n      shift(228);                   // 'score'\n      break;\n    case 234:                       // 'sliding'\n      shift(234);                   // 'sliding'\n      break;\n    case 240:                       // 'strict'\n      shift(240);                   // 'strict'\n      break;\n    case 251:                       // 'tumbling'\n      shift(251);                   // 'tumbling'\n      break;\n    case 252:                       // 'type'\n      shift(252);                   // 'type'\n      break;\n    case 257:                       // 'updating'\n      shift(257);                   // 'updating'\n      break;\n    case 261:                       // 'value'\n      shift(261);                   // 'value'\n      break;\n    case 263:                       // 'version'\n      shift(263);                   // 'version'\n      break;\n    case 267:                       // 'while'\n      shift(267);                   // 'while'\n      break;\n    case 97:                        // 'constraint'\n      shift(97);                    // 'constraint'\n      break;\n    case 176:                       // 'loop'\n      shift(176);                   // 'loop'\n      break;\n    case 221:                       // 'returning'\n      shift(221);                   // 'returning'\n      break;\n    case 77:                        // 'append'\n      shift(77);                    // 'append'\n      break;\n    case 166:                       // 'json'\n      shift(166);                   // 'json'\n      break;\n    default:\n      shift(194);                   // 'object'\n    }\n    eventHandler.endNonterminal(\"NCName\", e0);\n  }\n\n  function try_NCName()\n  {\n    switch (l1)\n    {\n    case 19:                        // NCName^Token\n      shiftT(19);                   // NCName^Token\n      break;\n    case 70:                        // 'after'\n      shiftT(70);                   // 'after'\n      break;\n    case 75:                        // 'and'\n      shiftT(75);                   // 'and'\n      break;\n    case 79:                        // 'as'\n      shiftT(79);                   // 'as'\n      break;\n    case 80:                        // 'ascending'\n      shiftT(80);                   // 'ascending'\n      break;\n    case 84:                        // 'before'\n      shiftT(84);                   // 'before'\n      break;\n    case 88:                        // 'case'\n      shiftT(88);                   // 'case'\n      break;\n    case 89:                        // 'cast'\n      shiftT(89);                   // 'cast'\n      break;\n    case 90:                        // 'castable'\n      shiftT(90);                   // 'castable'\n      break;\n    case 94:                        // 'collation'\n      shiftT(94);                   // 'collation'\n      break;\n    case 105:                       // 'count'\n      shiftT(105);                  // 'count'\n      break;\n    case 109:                       // 'default'\n      shiftT(109);                  // 'default'\n      break;\n    case 113:                       // 'descending'\n      shiftT(113);                  // 'descending'\n      break;\n    case 118:                       // 'div'\n      shiftT(118);                  // 'div'\n      break;\n    case 122:                       // 'else'\n      shiftT(122);                  // 'else'\n      break;\n    case 123:                       // 'empty'\n      shiftT(123);                  // 'empty'\n      break;\n    case 126:                       // 'end'\n      shiftT(126);                  // 'end'\n      break;\n    case 128:                       // 'eq'\n      shiftT(128);                  // 'eq'\n      break;\n    case 131:                       // 'except'\n      shiftT(131);                  // 'except'\n      break;\n    case 137:                       // 'for'\n      shiftT(137);                  // 'for'\n      break;\n    case 146:                       // 'ge'\n      shiftT(146);                  // 'ge'\n      break;\n    case 148:                       // 'group'\n      shiftT(148);                  // 'group'\n      break;\n    case 150:                       // 'gt'\n      shiftT(150);                  // 'gt'\n      break;\n    case 151:                       // 'idiv'\n      shiftT(151);                  // 'idiv'\n      break;\n    case 160:                       // 'instance'\n      shiftT(160);                  // 'instance'\n      break;\n    case 162:                       // 'intersect'\n      shiftT(162);                  // 'intersect'\n      break;\n    case 163:                       // 'into'\n      shiftT(163);                  // 'into'\n      break;\n    case 164:                       // 'is'\n      shiftT(164);                  // 'is'\n      break;\n    case 172:                       // 'le'\n      shiftT(172);                  // 'le'\n      break;\n    case 174:                       // 'let'\n      shiftT(174);                  // 'let'\n      break;\n    case 178:                       // 'lt'\n      shiftT(178);                  // 'lt'\n      break;\n    case 180:                       // 'mod'\n      shiftT(180);                  // 'mod'\n      break;\n    case 181:                       // 'modify'\n      shiftT(181);                  // 'modify'\n      break;\n    case 186:                       // 'ne'\n      shiftT(186);                  // 'ne'\n      break;\n    case 198:                       // 'only'\n      shiftT(198);                  // 'only'\n      break;\n    case 200:                       // 'or'\n      shiftT(200);                  // 'or'\n      break;\n    case 201:                       // 'order'\n      shiftT(201);                  // 'order'\n      break;\n    case 220:                       // 'return'\n      shiftT(220);                  // 'return'\n      break;\n    case 224:                       // 'satisfies'\n      shiftT(224);                  // 'satisfies'\n      break;\n    case 236:                       // 'stable'\n      shiftT(236);                  // 'stable'\n      break;\n    case 237:                       // 'start'\n      shiftT(237);                  // 'start'\n      break;\n    case 248:                       // 'to'\n      shiftT(248);                  // 'to'\n      break;\n    case 249:                       // 'treat'\n      shiftT(249);                  // 'treat'\n      break;\n    case 254:                       // 'union'\n      shiftT(254);                  // 'union'\n      break;\n    case 266:                       // 'where'\n      shiftT(266);                  // 'where'\n      break;\n    case 270:                       // 'with'\n      shiftT(270);                  // 'with'\n      break;\n    case 73:                        // 'ancestor'\n      shiftT(73);                   // 'ancestor'\n      break;\n    case 74:                        // 'ancestor-or-self'\n      shiftT(74);                   // 'ancestor-or-self'\n      break;\n    case 82:                        // 'attribute'\n      shiftT(82);                   // 'attribute'\n      break;\n    case 93:                        // 'child'\n      shiftT(93);                   // 'child'\n      break;\n    case 96:                        // 'comment'\n      shiftT(96);                   // 'comment'\n      break;\n    case 103:                       // 'copy'\n      shiftT(103);                  // 'copy'\n      break;\n    case 108:                       // 'declare'\n      shiftT(108);                  // 'declare'\n      break;\n    case 110:                       // 'delete'\n      shiftT(110);                  // 'delete'\n      break;\n    case 111:                       // 'descendant'\n      shiftT(111);                  // 'descendant'\n      break;\n    case 112:                       // 'descendant-or-self'\n      shiftT(112);                  // 'descendant-or-self'\n      break;\n    case 119:                       // 'document'\n      shiftT(119);                  // 'document'\n      break;\n    case 120:                       // 'document-node'\n      shiftT(120);                  // 'document-node'\n      break;\n    case 121:                       // 'element'\n      shiftT(121);                  // 'element'\n      break;\n    case 124:                       // 'empty-sequence'\n      shiftT(124);                  // 'empty-sequence'\n      break;\n    case 129:                       // 'every'\n      shiftT(129);                  // 'every'\n      break;\n    case 134:                       // 'first'\n      shiftT(134);                  // 'first'\n      break;\n    case 135:                       // 'following'\n      shiftT(135);                  // 'following'\n      break;\n    case 136:                       // 'following-sibling'\n      shiftT(136);                  // 'following-sibling'\n      break;\n    case 145:                       // 'function'\n      shiftT(145);                  // 'function'\n      break;\n    case 152:                       // 'if'\n      shiftT(152);                  // 'if'\n      break;\n    case 153:                       // 'import'\n      shiftT(153);                  // 'import'\n      break;\n    case 159:                       // 'insert'\n      shiftT(159);                  // 'insert'\n      break;\n    case 165:                       // 'item'\n      shiftT(165);                  // 'item'\n      break;\n    case 170:                       // 'last'\n      shiftT(170);                  // 'last'\n      break;\n    case 182:                       // 'module'\n      shiftT(182);                  // 'module'\n      break;\n    case 184:                       // 'namespace'\n      shiftT(184);                  // 'namespace'\n      break;\n    case 185:                       // 'namespace-node'\n      shiftT(185);                  // 'namespace-node'\n      break;\n    case 191:                       // 'node'\n      shiftT(191);                  // 'node'\n      break;\n    case 202:                       // 'ordered'\n      shiftT(202);                  // 'ordered'\n      break;\n    case 206:                       // 'parent'\n      shiftT(206);                  // 'parent'\n      break;\n    case 212:                       // 'preceding'\n      shiftT(212);                  // 'preceding'\n      break;\n    case 213:                       // 'preceding-sibling'\n      shiftT(213);                  // 'preceding-sibling'\n      break;\n    case 216:                       // 'processing-instruction'\n      shiftT(216);                  // 'processing-instruction'\n      break;\n    case 218:                       // 'rename'\n      shiftT(218);                  // 'rename'\n      break;\n    case 219:                       // 'replace'\n      shiftT(219);                  // 'replace'\n      break;\n    case 226:                       // 'schema-attribute'\n      shiftT(226);                  // 'schema-attribute'\n      break;\n    case 227:                       // 'schema-element'\n      shiftT(227);                  // 'schema-element'\n      break;\n    case 229:                       // 'self'\n      shiftT(229);                  // 'self'\n      break;\n    case 235:                       // 'some'\n      shiftT(235);                  // 'some'\n      break;\n    case 243:                       // 'switch'\n      shiftT(243);                  // 'switch'\n      break;\n    case 244:                       // 'text'\n      shiftT(244);                  // 'text'\n      break;\n    case 250:                       // 'try'\n      shiftT(250);                  // 'try'\n      break;\n    case 253:                       // 'typeswitch'\n      shiftT(253);                  // 'typeswitch'\n      break;\n    case 256:                       // 'unordered'\n      shiftT(256);                  // 'unordered'\n      break;\n    case 260:                       // 'validate'\n      shiftT(260);                  // 'validate'\n      break;\n    case 262:                       // 'variable'\n      shiftT(262);                  // 'variable'\n      break;\n    case 274:                       // 'xquery'\n      shiftT(274);                  // 'xquery'\n      break;\n    case 72:                        // 'allowing'\n      shiftT(72);                   // 'allowing'\n      break;\n    case 81:                        // 'at'\n      shiftT(81);                   // 'at'\n      break;\n    case 83:                        // 'base-uri'\n      shiftT(83);                   // 'base-uri'\n      break;\n    case 85:                        // 'boundary-space'\n      shiftT(85);                   // 'boundary-space'\n      break;\n    case 86:                        // 'break'\n      shiftT(86);                   // 'break'\n      break;\n    case 91:                        // 'catch'\n      shiftT(91);                   // 'catch'\n      break;\n    case 98:                        // 'construction'\n      shiftT(98);                   // 'construction'\n      break;\n    case 101:                       // 'context'\n      shiftT(101);                  // 'context'\n      break;\n    case 102:                       // 'continue'\n      shiftT(102);                  // 'continue'\n      break;\n    case 104:                       // 'copy-namespaces'\n      shiftT(104);                  // 'copy-namespaces'\n      break;\n    case 106:                       // 'decimal-format'\n      shiftT(106);                  // 'decimal-format'\n      break;\n    case 125:                       // 'encoding'\n      shiftT(125);                  // 'encoding'\n      break;\n    case 132:                       // 'exit'\n      shiftT(132);                  // 'exit'\n      break;\n    case 133:                       // 'external'\n      shiftT(133);                  // 'external'\n      break;\n    case 141:                       // 'ft-option'\n      shiftT(141);                  // 'ft-option'\n      break;\n    case 154:                       // 'in'\n      shiftT(154);                  // 'in'\n      break;\n    case 155:                       // 'index'\n      shiftT(155);                  // 'index'\n      break;\n    case 161:                       // 'integrity'\n      shiftT(161);                  // 'integrity'\n      break;\n    case 171:                       // 'lax'\n      shiftT(171);                  // 'lax'\n      break;\n    case 192:                       // 'nodes'\n      shiftT(192);                  // 'nodes'\n      break;\n    case 199:                       // 'option'\n      shiftT(199);                  // 'option'\n      break;\n    case 203:                       // 'ordering'\n      shiftT(203);                  // 'ordering'\n      break;\n    case 222:                       // 'revalidation'\n      shiftT(222);                  // 'revalidation'\n      break;\n    case 225:                       // 'schema'\n      shiftT(225);                  // 'schema'\n      break;\n    case 228:                       // 'score'\n      shiftT(228);                  // 'score'\n      break;\n    case 234:                       // 'sliding'\n      shiftT(234);                  // 'sliding'\n      break;\n    case 240:                       // 'strict'\n      shiftT(240);                  // 'strict'\n      break;\n    case 251:                       // 'tumbling'\n      shiftT(251);                  // 'tumbling'\n      break;\n    case 252:                       // 'type'\n      shiftT(252);                  // 'type'\n      break;\n    case 257:                       // 'updating'\n      shiftT(257);                  // 'updating'\n      break;\n    case 261:                       // 'value'\n      shiftT(261);                  // 'value'\n      break;\n    case 263:                       // 'version'\n      shiftT(263);                  // 'version'\n      break;\n    case 267:                       // 'while'\n      shiftT(267);                  // 'while'\n      break;\n    case 97:                        // 'constraint'\n      shiftT(97);                   // 'constraint'\n      break;\n    case 176:                       // 'loop'\n      shiftT(176);                  // 'loop'\n      break;\n    case 221:                       // 'returning'\n      shiftT(221);                  // 'returning'\n      break;\n    case 77:                        // 'append'\n      shiftT(77);                   // 'append'\n      break;\n    case 166:                       // 'json'\n      shiftT(166);                  // 'json'\n      break;\n    default:\n      shiftT(194);                  // 'object'\n    }\n  }\n\n  function parse_MainModule()\n  {\n    eventHandler.startNonterminal(\"MainModule\", e0);\n    parse_Prolog();\n    whitespace();\n    parse_Program();\n    eventHandler.endNonterminal(\"MainModule\", e0);\n  }\n\n  function parse_Program()\n  {\n    eventHandler.startNonterminal(\"Program\", e0);\n    parse_StatementsAndOptionalExpr();\n    eventHandler.endNonterminal(\"Program\", e0);\n  }\n\n  function parse_Statements()\n  {\n    eventHandler.startNonterminal(\"Statements\", e0);\n    for (;;)\n    {\n      lookahead1W(278);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      switch (l1)\n      {\n      case 34:                      // '('\n        lookahead2W(269);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        break;\n      case 35:                      // '(#'\n        lookahead2(252);            // EQName^Token | S | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' |\n        break;\n      case 46:                      // '/'\n        lookahead2W(284);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        break;\n      case 47:                      // '//'\n        lookahead2W(265);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        break;\n      case 54:                      // '<'\n        lookahead2(4);              // QName\n        break;\n      case 55:                      // '<!--'\n        lookahead2(1);              // DirCommentContents\n        break;\n      case 59:                      // '<?'\n        lookahead2(3);              // PITarget\n        break;\n      case 66:                      // '@'\n        lookahead2W(257);           // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n        break;\n      case 68:                      // '['\n        lookahead2W(272);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        break;\n      case 77:                      // 'append'\n        lookahead2W(200);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n        break;\n      case 82:                      // 'attribute'\n        lookahead2W(281);           // EQName^Token | S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' |\n        break;\n      case 121:                     // 'element'\n        lookahead2W(280);           // EQName^Token | S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' |\n        break;\n      case 132:                     // 'exit'\n        lookahead2W(203);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n        break;\n      case 137:                     // 'for'\n        lookahead2W(208);           // S^WS | EOF | '!' | '!=' | '#' | '$' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' |\n        break;\n      case 174:                     // 'let'\n        lookahead2W(205);           // S^WS | EOF | '!' | '!=' | '#' | '$' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' |\n        break;\n      case 218:                     // 'rename'\n        lookahead2W(206);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n        break;\n      case 219:                     // 'replace'\n        lookahead2W(207);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n        break;\n      case 260:                     // 'validate'\n        lookahead2W(210);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n        break;\n      case 276:                     // '{'\n        lookahead2W(277);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        break;\n      case 278:                     // '{|'\n        lookahead2W(273);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        break;\n      case 5:                       // Wildcard\n      case 45:                      // '..'\n        lookahead2W(186);           // S^WS | EOF | '!' | '!=' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' | ';' | '<' |\n        break;\n      case 31:                      // '$'\n      case 32:                      // '%'\n        lookahead2W(255);           // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n        break;\n      case 40:                      // '+'\n      case 42:                      // '-'\n        lookahead2W(267);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        break;\n      case 86:                      // 'break'\n      case 102:                     // 'continue'\n        lookahead2W(201);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n        break;\n      case 110:                     // 'delete'\n      case 159:                     // 'insert'\n        lookahead2W(209);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n        break;\n      case 184:                     // 'namespace'\n      case 216:                     // 'processing-instruction'\n        lookahead2W(268);           // NCName^Token | S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' |\n        break;\n      case 103:                     // 'copy'\n      case 129:                     // 'every'\n      case 235:                     // 'some'\n      case 262:                     // 'variable'\n        lookahead2W(197);           // S^WS | EOF | '!' | '!=' | '#' | '$' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' |\n        break;\n      case 8:                       // IntegerLiteral\n      case 9:                       // DecimalLiteral\n      case 10:                      // DoubleLiteral\n      case 11:                      // StringLiteral\n      case 44:                      // '.'\n        lookahead2W(192);           // S^WS | EOF | '!' | '!=' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' | ';' |\n        break;\n      case 78:                      // 'array'\n      case 124:                     // 'empty-sequence'\n      case 165:                     // 'item'\n      case 167:                     // 'json-item'\n      case 242:                     // 'structured-item'\n        lookahead2W(191);           // S^WS | EOF | '!' | '!=' | '#' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' | ';' |\n        break;\n      case 96:                      // 'comment'\n      case 119:                     // 'document'\n      case 202:                     // 'ordered'\n      case 244:                     // 'text'\n      case 250:                     // 'try'\n      case 256:                     // 'unordered'\n        lookahead2W(204);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n        break;\n      case 73:                      // 'ancestor'\n      case 74:                      // 'ancestor-or-self'\n      case 93:                      // 'child'\n      case 111:                     // 'descendant'\n      case 112:                     // 'descendant-or-self'\n      case 135:                     // 'following'\n      case 136:                     // 'following-sibling'\n      case 206:                     // 'parent'\n      case 212:                     // 'preceding'\n      case 213:                     // 'preceding-sibling'\n      case 229:                     // 'self'\n        lookahead2W(198);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n        break;\n      case 6:                       // EQName^Token\n      case 70:                      // 'after'\n      case 72:                      // 'allowing'\n      case 75:                      // 'and'\n      case 79:                      // 'as'\n      case 80:                      // 'ascending'\n      case 81:                      // 'at'\n      case 83:                      // 'base-uri'\n      case 84:                      // 'before'\n      case 85:                      // 'boundary-space'\n      case 88:                      // 'case'\n      case 89:                      // 'cast'\n      case 90:                      // 'castable'\n      case 91:                      // 'catch'\n      case 94:                      // 'collation'\n      case 97:                      // 'constraint'\n      case 98:                      // 'construction'\n      case 101:                     // 'context'\n      case 104:                     // 'copy-namespaces'\n      case 105:                     // 'count'\n      case 106:                     // 'decimal-format'\n      case 108:                     // 'declare'\n      case 109:                     // 'default'\n      case 113:                     // 'descending'\n      case 118:                     // 'div'\n      case 120:                     // 'document-node'\n      case 122:                     // 'else'\n      case 123:                     // 'empty'\n      case 125:                     // 'encoding'\n      case 126:                     // 'end'\n      case 128:                     // 'eq'\n      case 131:                     // 'except'\n      case 133:                     // 'external'\n      case 134:                     // 'first'\n      case 141:                     // 'ft-option'\n      case 145:                     // 'function'\n      case 146:                     // 'ge'\n      case 148:                     // 'group'\n      case 150:                     // 'gt'\n      case 151:                     // 'idiv'\n      case 152:                     // 'if'\n      case 153:                     // 'import'\n      case 154:                     // 'in'\n      case 155:                     // 'index'\n      case 160:                     // 'instance'\n      case 161:                     // 'integrity'\n      case 162:                     // 'intersect'\n      case 163:                     // 'into'\n      case 164:                     // 'is'\n      case 166:                     // 'json'\n      case 170:                     // 'last'\n      case 171:                     // 'lax'\n      case 172:                     // 'le'\n      case 176:                     // 'loop'\n      case 178:                     // 'lt'\n      case 180:                     // 'mod'\n      case 181:                     // 'modify'\n      case 182:                     // 'module'\n      case 185:                     // 'namespace-node'\n      case 186:                     // 'ne'\n      case 191:                     // 'node'\n      case 192:                     // 'nodes'\n      case 194:                     // 'object'\n      case 198:                     // 'only'\n      case 199:                     // 'option'\n      case 200:                     // 'or'\n      case 201:                     // 'order'\n      case 203:                     // 'ordering'\n      case 220:                     // 'return'\n      case 221:                     // 'returning'\n      case 222:                     // 'revalidation'\n      case 224:                     // 'satisfies'\n      case 225:                     // 'schema'\n      case 226:                     // 'schema-attribute'\n      case 227:                     // 'schema-element'\n      case 228:                     // 'score'\n      case 234:                     // 'sliding'\n      case 236:                     // 'stable'\n      case 237:                     // 'start'\n      case 240:                     // 'strict'\n      case 243:                     // 'switch'\n      case 248:                     // 'to'\n      case 249:                     // 'treat'\n      case 251:                     // 'tumbling'\n      case 252:                     // 'type'\n      case 253:                     // 'typeswitch'\n      case 254:                     // 'union'\n      case 257:                     // 'updating'\n      case 261:                     // 'value'\n      case 263:                     // 'version'\n      case 266:                     // 'where'\n      case 267:                     // 'while'\n      case 270:                     // 'with'\n      case 274:                     // 'xquery'\n        lookahead2W(195);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk != 25                  // EOF\n       && lk != 53                  // ';'\n       && lk != 282                 // '}'\n       && lk != 12805               // Wildcard EOF\n       && lk != 12806               // EQName^Token EOF\n       && lk != 12808               // IntegerLiteral EOF\n       && lk != 12809               // DecimalLiteral EOF\n       && lk != 12810               // DoubleLiteral EOF\n       && lk != 12811               // StringLiteral EOF\n       && lk != 12844               // '.' EOF\n       && lk != 12845               // '..' EOF\n       && lk != 12846               // '/' EOF\n       && lk != 12870               // 'after' EOF\n       && lk != 12872               // 'allowing' EOF\n       && lk != 12873               // 'ancestor' EOF\n       && lk != 12874               // 'ancestor-or-self' EOF\n       && lk != 12875               // 'and' EOF\n       && lk != 12877               // 'append' EOF\n       && lk != 12878               // 'array' EOF\n       && lk != 12879               // 'as' EOF\n       && lk != 12880               // 'ascending' EOF\n       && lk != 12881               // 'at' EOF\n       && lk != 12882               // 'attribute' EOF\n       && lk != 12883               // 'base-uri' EOF\n       && lk != 12884               // 'before' EOF\n       && lk != 12885               // 'boundary-space' EOF\n       && lk != 12886               // 'break' EOF\n       && lk != 12888               // 'case' EOF\n       && lk != 12889               // 'cast' EOF\n       && lk != 12890               // 'castable' EOF\n       && lk != 12891               // 'catch' EOF\n       && lk != 12893               // 'child' EOF\n       && lk != 12894               // 'collation' EOF\n       && lk != 12896               // 'comment' EOF\n       && lk != 12897               // 'constraint' EOF\n       && lk != 12898               // 'construction' EOF\n       && lk != 12901               // 'context' EOF\n       && lk != 12902               // 'continue' EOF\n       && lk != 12903               // 'copy' EOF\n       && lk != 12904               // 'copy-namespaces' EOF\n       && lk != 12905               // 'count' EOF\n       && lk != 12906               // 'decimal-format' EOF\n       && lk != 12908               // 'declare' EOF\n       && lk != 12909               // 'default' EOF\n       && lk != 12910               // 'delete' EOF\n       && lk != 12911               // 'descendant' EOF\n       && lk != 12912               // 'descendant-or-self' EOF\n       && lk != 12913               // 'descending' EOF\n       && lk != 12918               // 'div' EOF\n       && lk != 12919               // 'document' EOF\n       && lk != 12920               // 'document-node' EOF\n       && lk != 12921               // 'element' EOF\n       && lk != 12922               // 'else' EOF\n       && lk != 12923               // 'empty' EOF\n       && lk != 12924               // 'empty-sequence' EOF\n       && lk != 12925               // 'encoding' EOF\n       && lk != 12926               // 'end' EOF\n       && lk != 12928               // 'eq' EOF\n       && lk != 12929               // 'every' EOF\n       && lk != 12931               // 'except' EOF\n       && lk != 12932               // 'exit' EOF\n       && lk != 12933               // 'external' EOF\n       && lk != 12934               // 'first' EOF\n       && lk != 12935               // 'following' EOF\n       && lk != 12936               // 'following-sibling' EOF\n       && lk != 12937               // 'for' EOF\n       && lk != 12941               // 'ft-option' EOF\n       && lk != 12945               // 'function' EOF\n       && lk != 12946               // 'ge' EOF\n       && lk != 12948               // 'group' EOF\n       && lk != 12950               // 'gt' EOF\n       && lk != 12951               // 'idiv' EOF\n       && lk != 12952               // 'if' EOF\n       && lk != 12953               // 'import' EOF\n       && lk != 12954               // 'in' EOF\n       && lk != 12955               // 'index' EOF\n       && lk != 12959               // 'insert' EOF\n       && lk != 12960               // 'instance' EOF\n       && lk != 12961               // 'integrity' EOF\n       && lk != 12962               // 'intersect' EOF\n       && lk != 12963               // 'into' EOF\n       && lk != 12964               // 'is' EOF\n       && lk != 12965               // 'item' EOF\n       && lk != 12966               // 'json' EOF\n       && lk != 12967               // 'json-item' EOF\n       && lk != 12970               // 'last' EOF\n       && lk != 12971               // 'lax' EOF\n       && lk != 12972               // 'le' EOF\n       && lk != 12974               // 'let' EOF\n       && lk != 12976               // 'loop' EOF\n       && lk != 12978               // 'lt' EOF\n       && lk != 12980               // 'mod' EOF\n       && lk != 12981               // 'modify' EOF\n       && lk != 12982               // 'module' EOF\n       && lk != 12984               // 'namespace' EOF\n       && lk != 12985               // 'namespace-node' EOF\n       && lk != 12986               // 'ne' EOF\n       && lk != 12991               // 'node' EOF\n       && lk != 12992               // 'nodes' EOF\n       && lk != 12994               // 'object' EOF\n       && lk != 12998               // 'only' EOF\n       && lk != 12999               // 'option' EOF\n       && lk != 13000               // 'or' EOF\n       && lk != 13001               // 'order' EOF\n       && lk != 13002               // 'ordered' EOF\n       && lk != 13003               // 'ordering' EOF\n       && lk != 13006               // 'parent' EOF\n       && lk != 13012               // 'preceding' EOF\n       && lk != 13013               // 'preceding-sibling' EOF\n       && lk != 13016               // 'processing-instruction' EOF\n       && lk != 13018               // 'rename' EOF\n       && lk != 13019               // 'replace' EOF\n       && lk != 13020               // 'return' EOF\n       && lk != 13021               // 'returning' EOF\n       && lk != 13022               // 'revalidation' EOF\n       && lk != 13024               // 'satisfies' EOF\n       && lk != 13025               // 'schema' EOF\n       && lk != 13026               // 'schema-attribute' EOF\n       && lk != 13027               // 'schema-element' EOF\n       && lk != 13028               // 'score' EOF\n       && lk != 13029               // 'self' EOF\n       && lk != 13034               // 'sliding' EOF\n       && lk != 13035               // 'some' EOF\n       && lk != 13036               // 'stable' EOF\n       && lk != 13037               // 'start' EOF\n       && lk != 13040               // 'strict' EOF\n       && lk != 13042               // 'structured-item' EOF\n       && lk != 13043               // 'switch' EOF\n       && lk != 13044               // 'text' EOF\n       && lk != 13048               // 'to' EOF\n       && lk != 13049               // 'treat' EOF\n       && lk != 13050               // 'try' EOF\n       && lk != 13051               // 'tumbling' EOF\n       && lk != 13052               // 'type' EOF\n       && lk != 13053               // 'typeswitch' EOF\n       && lk != 13054               // 'union' EOF\n       && lk != 13056               // 'unordered' EOF\n       && lk != 13057               // 'updating' EOF\n       && lk != 13060               // 'validate' EOF\n       && lk != 13061               // 'value' EOF\n       && lk != 13062               // 'variable' EOF\n       && lk != 13063               // 'version' EOF\n       && lk != 13066               // 'where' EOF\n       && lk != 13067               // 'while' EOF\n       && lk != 13070               // 'with' EOF\n       && lk != 13074               // 'xquery' EOF\n       && lk != 16134               // 'variable' '$'\n       && lk != 20997               // Wildcard ','\n       && lk != 20998               // EQName^Token ','\n       && lk != 21000               // IntegerLiteral ','\n       && lk != 21001               // DecimalLiteral ','\n       && lk != 21002               // DoubleLiteral ','\n       && lk != 21003               // StringLiteral ','\n       && lk != 21036               // '.' ','\n       && lk != 21037               // '..' ','\n       && lk != 21038               // '/' ','\n       && lk != 21062               // 'after' ','\n       && lk != 21064               // 'allowing' ','\n       && lk != 21065               // 'ancestor' ','\n       && lk != 21066               // 'ancestor-or-self' ','\n       && lk != 21067               // 'and' ','\n       && lk != 21069               // 'append' ','\n       && lk != 21070               // 'array' ','\n       && lk != 21071               // 'as' ','\n       && lk != 21072               // 'ascending' ','\n       && lk != 21073               // 'at' ','\n       && lk != 21074               // 'attribute' ','\n       && lk != 21075               // 'base-uri' ','\n       && lk != 21076               // 'before' ','\n       && lk != 21077               // 'boundary-space' ','\n       && lk != 21078               // 'break' ','\n       && lk != 21080               // 'case' ','\n       && lk != 21081               // 'cast' ','\n       && lk != 21082               // 'castable' ','\n       && lk != 21083               // 'catch' ','\n       && lk != 21085               // 'child' ','\n       && lk != 21086               // 'collation' ','\n       && lk != 21088               // 'comment' ','\n       && lk != 21089               // 'constraint' ','\n       && lk != 21090               // 'construction' ','\n       && lk != 21093               // 'context' ','\n       && lk != 21094               // 'continue' ','\n       && lk != 21095               // 'copy' ','\n       && lk != 21096               // 'copy-namespaces' ','\n       && lk != 21097               // 'count' ','\n       && lk != 21098               // 'decimal-format' ','\n       && lk != 21100               // 'declare' ','\n       && lk != 21101               // 'default' ','\n       && lk != 21102               // 'delete' ','\n       && lk != 21103               // 'descendant' ','\n       && lk != 21104               // 'descendant-or-self' ','\n       && lk != 21105               // 'descending' ','\n       && lk != 21110               // 'div' ','\n       && lk != 21111               // 'document' ','\n       && lk != 21112               // 'document-node' ','\n       && lk != 21113               // 'element' ','\n       && lk != 21114               // 'else' ','\n       && lk != 21115               // 'empty' ','\n       && lk != 21116               // 'empty-sequence' ','\n       && lk != 21117               // 'encoding' ','\n       && lk != 21118               // 'end' ','\n       && lk != 21120               // 'eq' ','\n       && lk != 21121               // 'every' ','\n       && lk != 21123               // 'except' ','\n       && lk != 21124               // 'exit' ','\n       && lk != 21125               // 'external' ','\n       && lk != 21126               // 'first' ','\n       && lk != 21127               // 'following' ','\n       && lk != 21128               // 'following-sibling' ','\n       && lk != 21129               // 'for' ','\n       && lk != 21133               // 'ft-option' ','\n       && lk != 21137               // 'function' ','\n       && lk != 21138               // 'ge' ','\n       && lk != 21140               // 'group' ','\n       && lk != 21142               // 'gt' ','\n       && lk != 21143               // 'idiv' ','\n       && lk != 21144               // 'if' ','\n       && lk != 21145               // 'import' ','\n       && lk != 21146               // 'in' ','\n       && lk != 21147               // 'index' ','\n       && lk != 21151               // 'insert' ','\n       && lk != 21152               // 'instance' ','\n       && lk != 21153               // 'integrity' ','\n       && lk != 21154               // 'intersect' ','\n       && lk != 21155               // 'into' ','\n       && lk != 21156               // 'is' ','\n       && lk != 21157               // 'item' ','\n       && lk != 21158               // 'json' ','\n       && lk != 21159               // 'json-item' ','\n       && lk != 21162               // 'last' ','\n       && lk != 21163               // 'lax' ','\n       && lk != 21164               // 'le' ','\n       && lk != 21166               // 'let' ','\n       && lk != 21168               // 'loop' ','\n       && lk != 21170               // 'lt' ','\n       && lk != 21172               // 'mod' ','\n       && lk != 21173               // 'modify' ','\n       && lk != 21174               // 'module' ','\n       && lk != 21176               // 'namespace' ','\n       && lk != 21177               // 'namespace-node' ','\n       && lk != 21178               // 'ne' ','\n       && lk != 21183               // 'node' ','\n       && lk != 21184               // 'nodes' ','\n       && lk != 21186               // 'object' ','\n       && lk != 21190               // 'only' ','\n       && lk != 21191               // 'option' ','\n       && lk != 21192               // 'or' ','\n       && lk != 21193               // 'order' ','\n       && lk != 21194               // 'ordered' ','\n       && lk != 21195               // 'ordering' ','\n       && lk != 21198               // 'parent' ','\n       && lk != 21204               // 'preceding' ','\n       && lk != 21205               // 'preceding-sibling' ','\n       && lk != 21208               // 'processing-instruction' ','\n       && lk != 21210               // 'rename' ','\n       && lk != 21211               // 'replace' ','\n       && lk != 21212               // 'return' ','\n       && lk != 21213               // 'returning' ','\n       && lk != 21214               // 'revalidation' ','\n       && lk != 21216               // 'satisfies' ','\n       && lk != 21217               // 'schema' ','\n       && lk != 21218               // 'schema-attribute' ','\n       && lk != 21219               // 'schema-element' ','\n       && lk != 21220               // 'score' ','\n       && lk != 21221               // 'self' ','\n       && lk != 21226               // 'sliding' ','\n       && lk != 21227               // 'some' ','\n       && lk != 21228               // 'stable' ','\n       && lk != 21229               // 'start' ','\n       && lk != 21232               // 'strict' ','\n       && lk != 21234               // 'structured-item' ','\n       && lk != 21235               // 'switch' ','\n       && lk != 21236               // 'text' ','\n       && lk != 21240               // 'to' ','\n       && lk != 21241               // 'treat' ','\n       && lk != 21242               // 'try' ','\n       && lk != 21243               // 'tumbling' ','\n       && lk != 21244               // 'type' ','\n       && lk != 21245               // 'typeswitch' ','\n       && lk != 21246               // 'union' ','\n       && lk != 21248               // 'unordered' ','\n       && lk != 21249               // 'updating' ','\n       && lk != 21252               // 'validate' ','\n       && lk != 21253               // 'value' ','\n       && lk != 21254               // 'variable' ','\n       && lk != 21255               // 'version' ','\n       && lk != 21258               // 'where' ','\n       && lk != 21259               // 'while' ','\n       && lk != 21262               // 'with' ','\n       && lk != 21266               // 'xquery' ','\n       && lk != 27141               // Wildcard ';'\n       && lk != 27142               // EQName^Token ';'\n       && lk != 27144               // IntegerLiteral ';'\n       && lk != 27145               // DecimalLiteral ';'\n       && lk != 27146               // DoubleLiteral ';'\n       && lk != 27147               // StringLiteral ';'\n       && lk != 27180               // '.' ';'\n       && lk != 27181               // '..' ';'\n       && lk != 27182               // '/' ';'\n       && lk != 27206               // 'after' ';'\n       && lk != 27208               // 'allowing' ';'\n       && lk != 27209               // 'ancestor' ';'\n       && lk != 27210               // 'ancestor-or-self' ';'\n       && lk != 27211               // 'and' ';'\n       && lk != 27213               // 'append' ';'\n       && lk != 27214               // 'array' ';'\n       && lk != 27215               // 'as' ';'\n       && lk != 27216               // 'ascending' ';'\n       && lk != 27217               // 'at' ';'\n       && lk != 27218               // 'attribute' ';'\n       && lk != 27219               // 'base-uri' ';'\n       && lk != 27220               // 'before' ';'\n       && lk != 27221               // 'boundary-space' ';'\n       && lk != 27222               // 'break' ';'\n       && lk != 27224               // 'case' ';'\n       && lk != 27225               // 'cast' ';'\n       && lk != 27226               // 'castable' ';'\n       && lk != 27227               // 'catch' ';'\n       && lk != 27229               // 'child' ';'\n       && lk != 27230               // 'collation' ';'\n       && lk != 27232               // 'comment' ';'\n       && lk != 27233               // 'constraint' ';'\n       && lk != 27234               // 'construction' ';'\n       && lk != 27237               // 'context' ';'\n       && lk != 27238               // 'continue' ';'\n       && lk != 27239               // 'copy' ';'\n       && lk != 27240               // 'copy-namespaces' ';'\n       && lk != 27241               // 'count' ';'\n       && lk != 27242               // 'decimal-format' ';'\n       && lk != 27244               // 'declare' ';'\n       && lk != 27245               // 'default' ';'\n       && lk != 27246               // 'delete' ';'\n       && lk != 27247               // 'descendant' ';'\n       && lk != 27248               // 'descendant-or-self' ';'\n       && lk != 27249               // 'descending' ';'\n       && lk != 27254               // 'div' ';'\n       && lk != 27255               // 'document' ';'\n       && lk != 27256               // 'document-node' ';'\n       && lk != 27257               // 'element' ';'\n       && lk != 27258               // 'else' ';'\n       && lk != 27259               // 'empty' ';'\n       && lk != 27260               // 'empty-sequence' ';'\n       && lk != 27261               // 'encoding' ';'\n       && lk != 27262               // 'end' ';'\n       && lk != 27264               // 'eq' ';'\n       && lk != 27265               // 'every' ';'\n       && lk != 27267               // 'except' ';'\n       && lk != 27268               // 'exit' ';'\n       && lk != 27269               // 'external' ';'\n       && lk != 27270               // 'first' ';'\n       && lk != 27271               // 'following' ';'\n       && lk != 27272               // 'following-sibling' ';'\n       && lk != 27273               // 'for' ';'\n       && lk != 27277               // 'ft-option' ';'\n       && lk != 27281               // 'function' ';'\n       && lk != 27282               // 'ge' ';'\n       && lk != 27284               // 'group' ';'\n       && lk != 27286               // 'gt' ';'\n       && lk != 27287               // 'idiv' ';'\n       && lk != 27288               // 'if' ';'\n       && lk != 27289               // 'import' ';'\n       && lk != 27290               // 'in' ';'\n       && lk != 27291               // 'index' ';'\n       && lk != 27295               // 'insert' ';'\n       && lk != 27296               // 'instance' ';'\n       && lk != 27297               // 'integrity' ';'\n       && lk != 27298               // 'intersect' ';'\n       && lk != 27299               // 'into' ';'\n       && lk != 27300               // 'is' ';'\n       && lk != 27301               // 'item' ';'\n       && lk != 27302               // 'json' ';'\n       && lk != 27303               // 'json-item' ';'\n       && lk != 27306               // 'last' ';'\n       && lk != 27307               // 'lax' ';'\n       && lk != 27308               // 'le' ';'\n       && lk != 27310               // 'let' ';'\n       && lk != 27312               // 'loop' ';'\n       && lk != 27314               // 'lt' ';'\n       && lk != 27316               // 'mod' ';'\n       && lk != 27317               // 'modify' ';'\n       && lk != 27318               // 'module' ';'\n       && lk != 27320               // 'namespace' ';'\n       && lk != 27321               // 'namespace-node' ';'\n       && lk != 27322               // 'ne' ';'\n       && lk != 27327               // 'node' ';'\n       && lk != 27328               // 'nodes' ';'\n       && lk != 27330               // 'object' ';'\n       && lk != 27334               // 'only' ';'\n       && lk != 27335               // 'option' ';'\n       && lk != 27336               // 'or' ';'\n       && lk != 27337               // 'order' ';'\n       && lk != 27338               // 'ordered' ';'\n       && lk != 27339               // 'ordering' ';'\n       && lk != 27342               // 'parent' ';'\n       && lk != 27348               // 'preceding' ';'\n       && lk != 27349               // 'preceding-sibling' ';'\n       && lk != 27352               // 'processing-instruction' ';'\n       && lk != 27354               // 'rename' ';'\n       && lk != 27355               // 'replace' ';'\n       && lk != 27356               // 'return' ';'\n       && lk != 27357               // 'returning' ';'\n       && lk != 27358               // 'revalidation' ';'\n       && lk != 27360               // 'satisfies' ';'\n       && lk != 27361               // 'schema' ';'\n       && lk != 27362               // 'schema-attribute' ';'\n       && lk != 27363               // 'schema-element' ';'\n       && lk != 27364               // 'score' ';'\n       && lk != 27365               // 'self' ';'\n       && lk != 27370               // 'sliding' ';'\n       && lk != 27371               // 'some' ';'\n       && lk != 27372               // 'stable' ';'\n       && lk != 27373               // 'start' ';'\n       && lk != 27376               // 'strict' ';'\n       && lk != 27378               // 'structured-item' ';'\n       && lk != 27379               // 'switch' ';'\n       && lk != 27380               // 'text' ';'\n       && lk != 27384               // 'to' ';'\n       && lk != 27385               // 'treat' ';'\n       && lk != 27386               // 'try' ';'\n       && lk != 27387               // 'tumbling' ';'\n       && lk != 27388               // 'type' ';'\n       && lk != 27389               // 'typeswitch' ';'\n       && lk != 27390               // 'union' ';'\n       && lk != 27392               // 'unordered' ';'\n       && lk != 27393               // 'updating' ';'\n       && lk != 27396               // 'validate' ';'\n       && lk != 27397               // 'value' ';'\n       && lk != 27398               // 'variable' ';'\n       && lk != 27399               // 'version' ';'\n       && lk != 27402               // 'where' ';'\n       && lk != 27403               // 'while' ';'\n       && lk != 27406               // 'with' ';'\n       && lk != 27410               // 'xquery' ';'\n       && lk != 90198               // 'break' 'loop'\n       && lk != 90214               // 'continue' 'loop'\n       && lk != 113284              // 'exit' 'returning'\n       && lk != 144389              // Wildcard '}'\n       && lk != 144390              // EQName^Token '}'\n       && lk != 144392              // IntegerLiteral '}'\n       && lk != 144393              // DecimalLiteral '}'\n       && lk != 144394              // DoubleLiteral '}'\n       && lk != 144395              // StringLiteral '}'\n       && lk != 144428              // '.' '}'\n       && lk != 144429              // '..' '}'\n       && lk != 144430              // '/' '}'\n       && lk != 144454              // 'after' '}'\n       && lk != 144456              // 'allowing' '}'\n       && lk != 144457              // 'ancestor' '}'\n       && lk != 144458              // 'ancestor-or-self' '}'\n       && lk != 144459              // 'and' '}'\n       && lk != 144461              // 'append' '}'\n       && lk != 144462              // 'array' '}'\n       && lk != 144463              // 'as' '}'\n       && lk != 144464              // 'ascending' '}'\n       && lk != 144465              // 'at' '}'\n       && lk != 144466              // 'attribute' '}'\n       && lk != 144467              // 'base-uri' '}'\n       && lk != 144468              // 'before' '}'\n       && lk != 144469              // 'boundary-space' '}'\n       && lk != 144470              // 'break' '}'\n       && lk != 144472              // 'case' '}'\n       && lk != 144473              // 'cast' '}'\n       && lk != 144474              // 'castable' '}'\n       && lk != 144475              // 'catch' '}'\n       && lk != 144477              // 'child' '}'\n       && lk != 144478              // 'collation' '}'\n       && lk != 144480              // 'comment' '}'\n       && lk != 144481              // 'constraint' '}'\n       && lk != 144482              // 'construction' '}'\n       && lk != 144485              // 'context' '}'\n       && lk != 144486              // 'continue' '}'\n       && lk != 144487              // 'copy' '}'\n       && lk != 144488              // 'copy-namespaces' '}'\n       && lk != 144489              // 'count' '}'\n       && lk != 144490              // 'decimal-format' '}'\n       && lk != 144492              // 'declare' '}'\n       && lk != 144493              // 'default' '}'\n       && lk != 144494              // 'delete' '}'\n       && lk != 144495              // 'descendant' '}'\n       && lk != 144496              // 'descendant-or-self' '}'\n       && lk != 144497              // 'descending' '}'\n       && lk != 144502              // 'div' '}'\n       && lk != 144503              // 'document' '}'\n       && lk != 144504              // 'document-node' '}'\n       && lk != 144505              // 'element' '}'\n       && lk != 144506              // 'else' '}'\n       && lk != 144507              // 'empty' '}'\n       && lk != 144508              // 'empty-sequence' '}'\n       && lk != 144509              // 'encoding' '}'\n       && lk != 144510              // 'end' '}'\n       && lk != 144512              // 'eq' '}'\n       && lk != 144513              // 'every' '}'\n       && lk != 144515              // 'except' '}'\n       && lk != 144516              // 'exit' '}'\n       && lk != 144517              // 'external' '}'\n       && lk != 144518              // 'first' '}'\n       && lk != 144519              // 'following' '}'\n       && lk != 144520              // 'following-sibling' '}'\n       && lk != 144521              // 'for' '}'\n       && lk != 144525              // 'ft-option' '}'\n       && lk != 144529              // 'function' '}'\n       && lk != 144530              // 'ge' '}'\n       && lk != 144532              // 'group' '}'\n       && lk != 144534              // 'gt' '}'\n       && lk != 144535              // 'idiv' '}'\n       && lk != 144536              // 'if' '}'\n       && lk != 144537              // 'import' '}'\n       && lk != 144538              // 'in' '}'\n       && lk != 144539              // 'index' '}'\n       && lk != 144543              // 'insert' '}'\n       && lk != 144544              // 'instance' '}'\n       && lk != 144545              // 'integrity' '}'\n       && lk != 144546              // 'intersect' '}'\n       && lk != 144547              // 'into' '}'\n       && lk != 144548              // 'is' '}'\n       && lk != 144549              // 'item' '}'\n       && lk != 144550              // 'json' '}'\n       && lk != 144551              // 'json-item' '}'\n       && lk != 144554              // 'last' '}'\n       && lk != 144555              // 'lax' '}'\n       && lk != 144556              // 'le' '}'\n       && lk != 144558              // 'let' '}'\n       && lk != 144560              // 'loop' '}'\n       && lk != 144562              // 'lt' '}'\n       && lk != 144564              // 'mod' '}'\n       && lk != 144565              // 'modify' '}'\n       && lk != 144566              // 'module' '}'\n       && lk != 144568              // 'namespace' '}'\n       && lk != 144569              // 'namespace-node' '}'\n       && lk != 144570              // 'ne' '}'\n       && lk != 144575              // 'node' '}'\n       && lk != 144576              // 'nodes' '}'\n       && lk != 144578              // 'object' '}'\n       && lk != 144582              // 'only' '}'\n       && lk != 144583              // 'option' '}'\n       && lk != 144584              // 'or' '}'\n       && lk != 144585              // 'order' '}'\n       && lk != 144586              // 'ordered' '}'\n       && lk != 144587              // 'ordering' '}'\n       && lk != 144590              // 'parent' '}'\n       && lk != 144596              // 'preceding' '}'\n       && lk != 144597              // 'preceding-sibling' '}'\n       && lk != 144600              // 'processing-instruction' '}'\n       && lk != 144602              // 'rename' '}'\n       && lk != 144603              // 'replace' '}'\n       && lk != 144604              // 'return' '}'\n       && lk != 144605              // 'returning' '}'\n       && lk != 144606              // 'revalidation' '}'\n       && lk != 144608              // 'satisfies' '}'\n       && lk != 144609              // 'schema' '}'\n       && lk != 144610              // 'schema-attribute' '}'\n       && lk != 144611              // 'schema-element' '}'\n       && lk != 144612              // 'score' '}'\n       && lk != 144613              // 'self' '}'\n       && lk != 144618              // 'sliding' '}'\n       && lk != 144619              // 'some' '}'\n       && lk != 144620              // 'stable' '}'\n       && lk != 144621              // 'start' '}'\n       && lk != 144624              // 'strict' '}'\n       && lk != 144626              // 'structured-item' '}'\n       && lk != 144627              // 'switch' '}'\n       && lk != 144628              // 'text' '}'\n       && lk != 144632              // 'to' '}'\n       && lk != 144633              // 'treat' '}'\n       && lk != 144634              // 'try' '}'\n       && lk != 144635              // 'tumbling' '}'\n       && lk != 144636              // 'type' '}'\n       && lk != 144637              // 'typeswitch' '}'\n       && lk != 144638              // 'union' '}'\n       && lk != 144640              // 'unordered' '}'\n       && lk != 144641              // 'updating' '}'\n       && lk != 144644              // 'validate' '}'\n       && lk != 144645              // 'value' '}'\n       && lk != 144646              // 'variable' '}'\n       && lk != 144647              // 'version' '}'\n       && lk != 144650              // 'where' '}'\n       && lk != 144651              // 'while' '}'\n       && lk != 144654              // 'with' '}'\n       && lk != 144658)             // 'xquery' '}'\n      {\n        lk = memoized(6, e0);\n        if (lk == 0)\n        {\n          var b0A = b0; var e0A = e0; var l1A = l1;\n          var b1A = b1; var e1A = e1; var l2A = l2;\n          var b2A = b2; var e2A = e2;\n          try\n          {\n            try_Statement();\n            lk = -1;\n          }\n          catch (p1A)\n          {\n            lk = -2;\n          }\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(6, e0, lk);\n        }\n      }\n      if (lk != -1\n       && lk != 53                  // ';'\n       && lk != 16134               // 'variable' '$'\n       && lk != 27141               // Wildcard ';'\n       && lk != 27142               // EQName^Token ';'\n       && lk != 27144               // IntegerLiteral ';'\n       && lk != 27145               // DecimalLiteral ';'\n       && lk != 27146               // DoubleLiteral ';'\n       && lk != 27147               // StringLiteral ';'\n       && lk != 27180               // '.' ';'\n       && lk != 27181               // '..' ';'\n       && lk != 27182               // '/' ';'\n       && lk != 27206               // 'after' ';'\n       && lk != 27208               // 'allowing' ';'\n       && lk != 27209               // 'ancestor' ';'\n       && lk != 27210               // 'ancestor-or-self' ';'\n       && lk != 27211               // 'and' ';'\n       && lk != 27213               // 'append' ';'\n       && lk != 27214               // 'array' ';'\n       && lk != 27215               // 'as' ';'\n       && lk != 27216               // 'ascending' ';'\n       && lk != 27217               // 'at' ';'\n       && lk != 27218               // 'attribute' ';'\n       && lk != 27219               // 'base-uri' ';'\n       && lk != 27220               // 'before' ';'\n       && lk != 27221               // 'boundary-space' ';'\n       && lk != 27222               // 'break' ';'\n       && lk != 27224               // 'case' ';'\n       && lk != 27225               // 'cast' ';'\n       && lk != 27226               // 'castable' ';'\n       && lk != 27227               // 'catch' ';'\n       && lk != 27229               // 'child' ';'\n       && lk != 27230               // 'collation' ';'\n       && lk != 27232               // 'comment' ';'\n       && lk != 27233               // 'constraint' ';'\n       && lk != 27234               // 'construction' ';'\n       && lk != 27237               // 'context' ';'\n       && lk != 27238               // 'continue' ';'\n       && lk != 27239               // 'copy' ';'\n       && lk != 27240               // 'copy-namespaces' ';'\n       && lk != 27241               // 'count' ';'\n       && lk != 27242               // 'decimal-format' ';'\n       && lk != 27244               // 'declare' ';'\n       && lk != 27245               // 'default' ';'\n       && lk != 27246               // 'delete' ';'\n       && lk != 27247               // 'descendant' ';'\n       && lk != 27248               // 'descendant-or-self' ';'\n       && lk != 27249               // 'descending' ';'\n       && lk != 27254               // 'div' ';'\n       && lk != 27255               // 'document' ';'\n       && lk != 27256               // 'document-node' ';'\n       && lk != 27257               // 'element' ';'\n       && lk != 27258               // 'else' ';'\n       && lk != 27259               // 'empty' ';'\n       && lk != 27260               // 'empty-sequence' ';'\n       && lk != 27261               // 'encoding' ';'\n       && lk != 27262               // 'end' ';'\n       && lk != 27264               // 'eq' ';'\n       && lk != 27265               // 'every' ';'\n       && lk != 27267               // 'except' ';'\n       && lk != 27268               // 'exit' ';'\n       && lk != 27269               // 'external' ';'\n       && lk != 27270               // 'first' ';'\n       && lk != 27271               // 'following' ';'\n       && lk != 27272               // 'following-sibling' ';'\n       && lk != 27273               // 'for' ';'\n       && lk != 27277               // 'ft-option' ';'\n       && lk != 27281               // 'function' ';'\n       && lk != 27282               // 'ge' ';'\n       && lk != 27284               // 'group' ';'\n       && lk != 27286               // 'gt' ';'\n       && lk != 27287               // 'idiv' ';'\n       && lk != 27288               // 'if' ';'\n       && lk != 27289               // 'import' ';'\n       && lk != 27290               // 'in' ';'\n       && lk != 27291               // 'index' ';'\n       && lk != 27295               // 'insert' ';'\n       && lk != 27296               // 'instance' ';'\n       && lk != 27297               // 'integrity' ';'\n       && lk != 27298               // 'intersect' ';'\n       && lk != 27299               // 'into' ';'\n       && lk != 27300               // 'is' ';'\n       && lk != 27301               // 'item' ';'\n       && lk != 27302               // 'json' ';'\n       && lk != 27303               // 'json-item' ';'\n       && lk != 27306               // 'last' ';'\n       && lk != 27307               // 'lax' ';'\n       && lk != 27308               // 'le' ';'\n       && lk != 27310               // 'let' ';'\n       && lk != 27312               // 'loop' ';'\n       && lk != 27314               // 'lt' ';'\n       && lk != 27316               // 'mod' ';'\n       && lk != 27317               // 'modify' ';'\n       && lk != 27318               // 'module' ';'\n       && lk != 27320               // 'namespace' ';'\n       && lk != 27321               // 'namespace-node' ';'\n       && lk != 27322               // 'ne' ';'\n       && lk != 27327               // 'node' ';'\n       && lk != 27328               // 'nodes' ';'\n       && lk != 27330               // 'object' ';'\n       && lk != 27334               // 'only' ';'\n       && lk != 27335               // 'option' ';'\n       && lk != 27336               // 'or' ';'\n       && lk != 27337               // 'order' ';'\n       && lk != 27338               // 'ordered' ';'\n       && lk != 27339               // 'ordering' ';'\n       && lk != 27342               // 'parent' ';'\n       && lk != 27348               // 'preceding' ';'\n       && lk != 27349               // 'preceding-sibling' ';'\n       && lk != 27352               // 'processing-instruction' ';'\n       && lk != 27354               // 'rename' ';'\n       && lk != 27355               // 'replace' ';'\n       && lk != 27356               // 'return' ';'\n       && lk != 27357               // 'returning' ';'\n       && lk != 27358               // 'revalidation' ';'\n       && lk != 27360               // 'satisfies' ';'\n       && lk != 27361               // 'schema' ';'\n       && lk != 27362               // 'schema-attribute' ';'\n       && lk != 27363               // 'schema-element' ';'\n       && lk != 27364               // 'score' ';'\n       && lk != 27365               // 'self' ';'\n       && lk != 27370               // 'sliding' ';'\n       && lk != 27371               // 'some' ';'\n       && lk != 27372               // 'stable' ';'\n       && lk != 27373               // 'start' ';'\n       && lk != 27376               // 'strict' ';'\n       && lk != 27378               // 'structured-item' ';'\n       && lk != 27379               // 'switch' ';'\n       && lk != 27380               // 'text' ';'\n       && lk != 27384               // 'to' ';'\n       && lk != 27385               // 'treat' ';'\n       && lk != 27386               // 'try' ';'\n       && lk != 27387               // 'tumbling' ';'\n       && lk != 27388               // 'type' ';'\n       && lk != 27389               // 'typeswitch' ';'\n       && lk != 27390               // 'union' ';'\n       && lk != 27392               // 'unordered' ';'\n       && lk != 27393               // 'updating' ';'\n       && lk != 27396               // 'validate' ';'\n       && lk != 27397               // 'value' ';'\n       && lk != 27398               // 'variable' ';'\n       && lk != 27399               // 'version' ';'\n       && lk != 27402               // 'where' ';'\n       && lk != 27403               // 'while' ';'\n       && lk != 27406               // 'with' ';'\n       && lk != 27410               // 'xquery' ';'\n       && lk != 90198               // 'break' 'loop'\n       && lk != 90214               // 'continue' 'loop'\n       && lk != 113284)             // 'exit' 'returning'\n      {\n        break;\n      }\n      whitespace();\n      parse_Statement();\n    }\n    eventHandler.endNonterminal(\"Statements\", e0);\n  }\n\n  function try_Statements()\n  {\n    for (;;)\n    {\n      lookahead1W(278);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      switch (l1)\n      {\n      case 34:                      // '('\n        lookahead2W(269);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        break;\n      case 35:                      // '(#'\n        lookahead2(252);            // EQName^Token | S | 'after' | 'allowing' | 'ancestor' | 'ancestor-or-self' |\n        break;\n      case 46:                      // '/'\n        lookahead2W(284);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        break;\n      case 47:                      // '//'\n        lookahead2W(265);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        break;\n      case 54:                      // '<'\n        lookahead2(4);              // QName\n        break;\n      case 55:                      // '<!--'\n        lookahead2(1);              // DirCommentContents\n        break;\n      case 59:                      // '<?'\n        lookahead2(3);              // PITarget\n        break;\n      case 66:                      // '@'\n        lookahead2W(257);           // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n        break;\n      case 68:                      // '['\n        lookahead2W(272);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        break;\n      case 77:                      // 'append'\n        lookahead2W(200);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n        break;\n      case 82:                      // 'attribute'\n        lookahead2W(281);           // EQName^Token | S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' |\n        break;\n      case 121:                     // 'element'\n        lookahead2W(280);           // EQName^Token | S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' |\n        break;\n      case 132:                     // 'exit'\n        lookahead2W(203);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n        break;\n      case 137:                     // 'for'\n        lookahead2W(208);           // S^WS | EOF | '!' | '!=' | '#' | '$' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' |\n        break;\n      case 174:                     // 'let'\n        lookahead2W(205);           // S^WS | EOF | '!' | '!=' | '#' | '$' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' |\n        break;\n      case 218:                     // 'rename'\n        lookahead2W(206);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n        break;\n      case 219:                     // 'replace'\n        lookahead2W(207);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n        break;\n      case 260:                     // 'validate'\n        lookahead2W(210);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n        break;\n      case 276:                     // '{'\n        lookahead2W(277);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        break;\n      case 278:                     // '{|'\n        lookahead2W(273);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        break;\n      case 5:                       // Wildcard\n      case 45:                      // '..'\n        lookahead2W(186);           // S^WS | EOF | '!' | '!=' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' | ';' | '<' |\n        break;\n      case 31:                      // '$'\n      case 32:                      // '%'\n        lookahead2W(255);           // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n        break;\n      case 40:                      // '+'\n      case 42:                      // '-'\n        lookahead2W(267);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        break;\n      case 86:                      // 'break'\n      case 102:                     // 'continue'\n        lookahead2W(201);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n        break;\n      case 110:                     // 'delete'\n      case 159:                     // 'insert'\n        lookahead2W(209);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n        break;\n      case 184:                     // 'namespace'\n      case 216:                     // 'processing-instruction'\n        lookahead2W(268);           // NCName^Token | S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' |\n        break;\n      case 103:                     // 'copy'\n      case 129:                     // 'every'\n      case 235:                     // 'some'\n      case 262:                     // 'variable'\n        lookahead2W(197);           // S^WS | EOF | '!' | '!=' | '#' | '$' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' |\n        break;\n      case 8:                       // IntegerLiteral\n      case 9:                       // DecimalLiteral\n      case 10:                      // DoubleLiteral\n      case 11:                      // StringLiteral\n      case 44:                      // '.'\n        lookahead2W(192);           // S^WS | EOF | '!' | '!=' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' | ';' |\n        break;\n      case 78:                      // 'array'\n      case 124:                     // 'empty-sequence'\n      case 165:                     // 'item'\n      case 167:                     // 'json-item'\n      case 242:                     // 'structured-item'\n        lookahead2W(191);           // S^WS | EOF | '!' | '!=' | '#' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' | ';' |\n        break;\n      case 96:                      // 'comment'\n      case 119:                     // 'document'\n      case 202:                     // 'ordered'\n      case 244:                     // 'text'\n      case 250:                     // 'try'\n      case 256:                     // 'unordered'\n        lookahead2W(204);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n        break;\n      case 73:                      // 'ancestor'\n      case 74:                      // 'ancestor-or-self'\n      case 93:                      // 'child'\n      case 111:                     // 'descendant'\n      case 112:                     // 'descendant-or-self'\n      case 135:                     // 'following'\n      case 136:                     // 'following-sibling'\n      case 206:                     // 'parent'\n      case 212:                     // 'preceding'\n      case 213:                     // 'preceding-sibling'\n      case 229:                     // 'self'\n        lookahead2W(198);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n        break;\n      case 6:                       // EQName^Token\n      case 70:                      // 'after'\n      case 72:                      // 'allowing'\n      case 75:                      // 'and'\n      case 79:                      // 'as'\n      case 80:                      // 'ascending'\n      case 81:                      // 'at'\n      case 83:                      // 'base-uri'\n      case 84:                      // 'before'\n      case 85:                      // 'boundary-space'\n      case 88:                      // 'case'\n      case 89:                      // 'cast'\n      case 90:                      // 'castable'\n      case 91:                      // 'catch'\n      case 94:                      // 'collation'\n      case 97:                      // 'constraint'\n      case 98:                      // 'construction'\n      case 101:                     // 'context'\n      case 104:                     // 'copy-namespaces'\n      case 105:                     // 'count'\n      case 106:                     // 'decimal-format'\n      case 108:                     // 'declare'\n      case 109:                     // 'default'\n      case 113:                     // 'descending'\n      case 118:                     // 'div'\n      case 120:                     // 'document-node'\n      case 122:                     // 'else'\n      case 123:                     // 'empty'\n      case 125:                     // 'encoding'\n      case 126:                     // 'end'\n      case 128:                     // 'eq'\n      case 131:                     // 'except'\n      case 133:                     // 'external'\n      case 134:                     // 'first'\n      case 141:                     // 'ft-option'\n      case 145:                     // 'function'\n      case 146:                     // 'ge'\n      case 148:                     // 'group'\n      case 150:                     // 'gt'\n      case 151:                     // 'idiv'\n      case 152:                     // 'if'\n      case 153:                     // 'import'\n      case 154:                     // 'in'\n      case 155:                     // 'index'\n      case 160:                     // 'instance'\n      case 161:                     // 'integrity'\n      case 162:                     // 'intersect'\n      case 163:                     // 'into'\n      case 164:                     // 'is'\n      case 166:                     // 'json'\n      case 170:                     // 'last'\n      case 171:                     // 'lax'\n      case 172:                     // 'le'\n      case 176:                     // 'loop'\n      case 178:                     // 'lt'\n      case 180:                     // 'mod'\n      case 181:                     // 'modify'\n      case 182:                     // 'module'\n      case 185:                     // 'namespace-node'\n      case 186:                     // 'ne'\n      case 191:                     // 'node'\n      case 192:                     // 'nodes'\n      case 194:                     // 'object'\n      case 198:                     // 'only'\n      case 199:                     // 'option'\n      case 200:                     // 'or'\n      case 201:                     // 'order'\n      case 203:                     // 'ordering'\n      case 220:                     // 'return'\n      case 221:                     // 'returning'\n      case 222:                     // 'revalidation'\n      case 224:                     // 'satisfies'\n      case 225:                     // 'schema'\n      case 226:                     // 'schema-attribute'\n      case 227:                     // 'schema-element'\n      case 228:                     // 'score'\n      case 234:                     // 'sliding'\n      case 236:                     // 'stable'\n      case 237:                     // 'start'\n      case 240:                     // 'strict'\n      case 243:                     // 'switch'\n      case 248:                     // 'to'\n      case 249:                     // 'treat'\n      case 251:                     // 'tumbling'\n      case 252:                     // 'type'\n      case 253:                     // 'typeswitch'\n      case 254:                     // 'union'\n      case 257:                     // 'updating'\n      case 261:                     // 'value'\n      case 263:                     // 'version'\n      case 266:                     // 'where'\n      case 267:                     // 'while'\n      case 270:                     // 'with'\n      case 274:                     // 'xquery'\n        lookahead2W(195);           // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | ',' | '-' | '/' | '//' |\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk != 25                  // EOF\n       && lk != 53                  // ';'\n       && lk != 282                 // '}'\n       && lk != 12805               // Wildcard EOF\n       && lk != 12806               // EQName^Token EOF\n       && lk != 12808               // IntegerLiteral EOF\n       && lk != 12809               // DecimalLiteral EOF\n       && lk != 12810               // DoubleLiteral EOF\n       && lk != 12811               // StringLiteral EOF\n       && lk != 12844               // '.' EOF\n       && lk != 12845               // '..' EOF\n       && lk != 12846               // '/' EOF\n       && lk != 12870               // 'after' EOF\n       && lk != 12872               // 'allowing' EOF\n       && lk != 12873               // 'ancestor' EOF\n       && lk != 12874               // 'ancestor-or-self' EOF\n       && lk != 12875               // 'and' EOF\n       && lk != 12877               // 'append' EOF\n       && lk != 12878               // 'array' EOF\n       && lk != 12879               // 'as' EOF\n       && lk != 12880               // 'ascending' EOF\n       && lk != 12881               // 'at' EOF\n       && lk != 12882               // 'attribute' EOF\n       && lk != 12883               // 'base-uri' EOF\n       && lk != 12884               // 'before' EOF\n       && lk != 12885               // 'boundary-space' EOF\n       && lk != 12886               // 'break' EOF\n       && lk != 12888               // 'case' EOF\n       && lk != 12889               // 'cast' EOF\n       && lk != 12890               // 'castable' EOF\n       && lk != 12891               // 'catch' EOF\n       && lk != 12893               // 'child' EOF\n       && lk != 12894               // 'collation' EOF\n       && lk != 12896               // 'comment' EOF\n       && lk != 12897               // 'constraint' EOF\n       && lk != 12898               // 'construction' EOF\n       && lk != 12901               // 'context' EOF\n       && lk != 12902               // 'continue' EOF\n       && lk != 12903               // 'copy' EOF\n       && lk != 12904               // 'copy-namespaces' EOF\n       && lk != 12905               // 'count' EOF\n       && lk != 12906               // 'decimal-format' EOF\n       && lk != 12908               // 'declare' EOF\n       && lk != 12909               // 'default' EOF\n       && lk != 12910               // 'delete' EOF\n       && lk != 12911               // 'descendant' EOF\n       && lk != 12912               // 'descendant-or-self' EOF\n       && lk != 12913               // 'descending' EOF\n       && lk != 12918               // 'div' EOF\n       && lk != 12919               // 'document' EOF\n       && lk != 12920               // 'document-node' EOF\n       && lk != 12921               // 'element' EOF\n       && lk != 12922               // 'else' EOF\n       && lk != 12923               // 'empty' EOF\n       && lk != 12924               // 'empty-sequence' EOF\n       && lk != 12925               // 'encoding' EOF\n       && lk != 12926               // 'end' EOF\n       && lk != 12928               // 'eq' EOF\n       && lk != 12929               // 'every' EOF\n       && lk != 12931               // 'except' EOF\n       && lk != 12932               // 'exit' EOF\n       && lk != 12933               // 'external' EOF\n       && lk != 12934               // 'first' EOF\n       && lk != 12935               // 'following' EOF\n       && lk != 12936               // 'following-sibling' EOF\n       && lk != 12937               // 'for' EOF\n       && lk != 12941               // 'ft-option' EOF\n       && lk != 12945               // 'function' EOF\n       && lk != 12946               // 'ge' EOF\n       && lk != 12948               // 'group' EOF\n       && lk != 12950               // 'gt' EOF\n       && lk != 12951               // 'idiv' EOF\n       && lk != 12952               // 'if' EOF\n       && lk != 12953               // 'import' EOF\n       && lk != 12954               // 'in' EOF\n       && lk != 12955               // 'index' EOF\n       && lk != 12959               // 'insert' EOF\n       && lk != 12960               // 'instance' EOF\n       && lk != 12961               // 'integrity' EOF\n       && lk != 12962               // 'intersect' EOF\n       && lk != 12963               // 'into' EOF\n       && lk != 12964               // 'is' EOF\n       && lk != 12965               // 'item' EOF\n       && lk != 12966               // 'json' EOF\n       && lk != 12967               // 'json-item' EOF\n       && lk != 12970               // 'last' EOF\n       && lk != 12971               // 'lax' EOF\n       && lk != 12972               // 'le' EOF\n       && lk != 12974               // 'let' EOF\n       && lk != 12976               // 'loop' EOF\n       && lk != 12978               // 'lt' EOF\n       && lk != 12980               // 'mod' EOF\n       && lk != 12981               // 'modify' EOF\n       && lk != 12982               // 'module' EOF\n       && lk != 12984               // 'namespace' EOF\n       && lk != 12985               // 'namespace-node' EOF\n       && lk != 12986               // 'ne' EOF\n       && lk != 12991               // 'node' EOF\n       && lk != 12992               // 'nodes' EOF\n       && lk != 12994               // 'object' EOF\n       && lk != 12998               // 'only' EOF\n       && lk != 12999               // 'option' EOF\n       && lk != 13000               // 'or' EOF\n       && lk != 13001               // 'order' EOF\n       && lk != 13002               // 'ordered' EOF\n       && lk != 13003               // 'ordering' EOF\n       && lk != 13006               // 'parent' EOF\n       && lk != 13012               // 'preceding' EOF\n       && lk != 13013               // 'preceding-sibling' EOF\n       && lk != 13016               // 'processing-instruction' EOF\n       && lk != 13018               // 'rename' EOF\n       && lk != 13019               // 'replace' EOF\n       && lk != 13020               // 'return' EOF\n       && lk != 13021               // 'returning' EOF\n       && lk != 13022               // 'revalidation' EOF\n       && lk != 13024               // 'satisfies' EOF\n       && lk != 13025               // 'schema' EOF\n       && lk != 13026               // 'schema-attribute' EOF\n       && lk != 13027               // 'schema-element' EOF\n       && lk != 13028               // 'score' EOF\n       && lk != 13029               // 'self' EOF\n       && lk != 13034               // 'sliding' EOF\n       && lk != 13035               // 'some' EOF\n       && lk != 13036               // 'stable' EOF\n       && lk != 13037               // 'start' EOF\n       && lk != 13040               // 'strict' EOF\n       && lk != 13042               // 'structured-item' EOF\n       && lk != 13043               // 'switch' EOF\n       && lk != 13044               // 'text' EOF\n       && lk != 13048               // 'to' EOF\n       && lk != 13049               // 'treat' EOF\n       && lk != 13050               // 'try' EOF\n       && lk != 13051               // 'tumbling' EOF\n       && lk != 13052               // 'type' EOF\n       && lk != 13053               // 'typeswitch' EOF\n       && lk != 13054               // 'union' EOF\n       && lk != 13056               // 'unordered' EOF\n       && lk != 13057               // 'updating' EOF\n       && lk != 13060               // 'validate' EOF\n       && lk != 13061               // 'value' EOF\n       && lk != 13062               // 'variable' EOF\n       && lk != 13063               // 'version' EOF\n       && lk != 13066               // 'where' EOF\n       && lk != 13067               // 'while' EOF\n       && lk != 13070               // 'with' EOF\n       && lk != 13074               // 'xquery' EOF\n       && lk != 16134               // 'variable' '$'\n       && lk != 20997               // Wildcard ','\n       && lk != 20998               // EQName^Token ','\n       && lk != 21000               // IntegerLiteral ','\n       && lk != 21001               // DecimalLiteral ','\n       && lk != 21002               // DoubleLiteral ','\n       && lk != 21003               // StringLiteral ','\n       && lk != 21036               // '.' ','\n       && lk != 21037               // '..' ','\n       && lk != 21038               // '/' ','\n       && lk != 21062               // 'after' ','\n       && lk != 21064               // 'allowing' ','\n       && lk != 21065               // 'ancestor' ','\n       && lk != 21066               // 'ancestor-or-self' ','\n       && lk != 21067               // 'and' ','\n       && lk != 21069               // 'append' ','\n       && lk != 21070               // 'array' ','\n       && lk != 21071               // 'as' ','\n       && lk != 21072               // 'ascending' ','\n       && lk != 21073               // 'at' ','\n       && lk != 21074               // 'attribute' ','\n       && lk != 21075               // 'base-uri' ','\n       && lk != 21076               // 'before' ','\n       && lk != 21077               // 'boundary-space' ','\n       && lk != 21078               // 'break' ','\n       && lk != 21080               // 'case' ','\n       && lk != 21081               // 'cast' ','\n       && lk != 21082               // 'castable' ','\n       && lk != 21083               // 'catch' ','\n       && lk != 21085               // 'child' ','\n       && lk != 21086               // 'collation' ','\n       && lk != 21088               // 'comment' ','\n       && lk != 21089               // 'constraint' ','\n       && lk != 21090               // 'construction' ','\n       && lk != 21093               // 'context' ','\n       && lk != 21094               // 'continue' ','\n       && lk != 21095               // 'copy' ','\n       && lk != 21096               // 'copy-namespaces' ','\n       && lk != 21097               // 'count' ','\n       && lk != 21098               // 'decimal-format' ','\n       && lk != 21100               // 'declare' ','\n       && lk != 21101               // 'default' ','\n       && lk != 21102               // 'delete' ','\n       && lk != 21103               // 'descendant' ','\n       && lk != 21104               // 'descendant-or-self' ','\n       && lk != 21105               // 'descending' ','\n       && lk != 21110               // 'div' ','\n       && lk != 21111               // 'document' ','\n       && lk != 21112               // 'document-node' ','\n       && lk != 21113               // 'element' ','\n       && lk != 21114               // 'else' ','\n       && lk != 21115               // 'empty' ','\n       && lk != 21116               // 'empty-sequence' ','\n       && lk != 21117               // 'encoding' ','\n       && lk != 21118               // 'end' ','\n       && lk != 21120               // 'eq' ','\n       && lk != 21121               // 'every' ','\n       && lk != 21123               // 'except' ','\n       && lk != 21124               // 'exit' ','\n       && lk != 21125               // 'external' ','\n       && lk != 21126               // 'first' ','\n       && lk != 21127               // 'following' ','\n       && lk != 21128               // 'following-sibling' ','\n       && lk != 21129               // 'for' ','\n       && lk != 21133               // 'ft-option' ','\n       && lk != 21137               // 'function' ','\n       && lk != 21138               // 'ge' ','\n       && lk != 21140               // 'group' ','\n       && lk != 21142               // 'gt' ','\n       && lk != 21143               // 'idiv' ','\n       && lk != 21144               // 'if' ','\n       && lk != 21145               // 'import' ','\n       && lk != 21146               // 'in' ','\n       && lk != 21147               // 'index' ','\n       && lk != 21151               // 'insert' ','\n       && lk != 21152               // 'instance' ','\n       && lk != 21153               // 'integrity' ','\n       && lk != 21154               // 'intersect' ','\n       && lk != 21155               // 'into' ','\n       && lk != 21156               // 'is' ','\n       && lk != 21157               // 'item' ','\n       && lk != 21158               // 'json' ','\n       && lk != 21159               // 'json-item' ','\n       && lk != 21162               // 'last' ','\n       && lk != 21163               // 'lax' ','\n       && lk != 21164               // 'le' ','\n       && lk != 21166               // 'let' ','\n       && lk != 21168               // 'loop' ','\n       && lk != 21170               // 'lt' ','\n       && lk != 21172               // 'mod' ','\n       && lk != 21173               // 'modify' ','\n       && lk != 21174               // 'module' ','\n       && lk != 21176               // 'namespace' ','\n       && lk != 21177               // 'namespace-node' ','\n       && lk != 21178               // 'ne' ','\n       && lk != 21183               // 'node' ','\n       && lk != 21184               // 'nodes' ','\n       && lk != 21186               // 'object' ','\n       && lk != 21190               // 'only' ','\n       && lk != 21191               // 'option' ','\n       && lk != 21192               // 'or' ','\n       && lk != 21193               // 'order' ','\n       && lk != 21194               // 'ordered' ','\n       && lk != 21195               // 'ordering' ','\n       && lk != 21198               // 'parent' ','\n       && lk != 21204               // 'preceding' ','\n       && lk != 21205               // 'preceding-sibling' ','\n       && lk != 21208               // 'processing-instruction' ','\n       && lk != 21210               // 'rename' ','\n       && lk != 21211               // 'replace' ','\n       && lk != 21212               // 'return' ','\n       && lk != 21213               // 'returning' ','\n       && lk != 21214               // 'revalidation' ','\n       && lk != 21216               // 'satisfies' ','\n       && lk != 21217               // 'schema' ','\n       && lk != 21218               // 'schema-attribute' ','\n       && lk != 21219               // 'schema-element' ','\n       && lk != 21220               // 'score' ','\n       && lk != 21221               // 'self' ','\n       && lk != 21226               // 'sliding' ','\n       && lk != 21227               // 'some' ','\n       && lk != 21228               // 'stable' ','\n       && lk != 21229               // 'start' ','\n       && lk != 21232               // 'strict' ','\n       && lk != 21234               // 'structured-item' ','\n       && lk != 21235               // 'switch' ','\n       && lk != 21236               // 'text' ','\n       && lk != 21240               // 'to' ','\n       && lk != 21241               // 'treat' ','\n       && lk != 21242               // 'try' ','\n       && lk != 21243               // 'tumbling' ','\n       && lk != 21244               // 'type' ','\n       && lk != 21245               // 'typeswitch' ','\n       && lk != 21246               // 'union' ','\n       && lk != 21248               // 'unordered' ','\n       && lk != 21249               // 'updating' ','\n       && lk != 21252               // 'validate' ','\n       && lk != 21253               // 'value' ','\n       && lk != 21254               // 'variable' ','\n       && lk != 21255               // 'version' ','\n       && lk != 21258               // 'where' ','\n       && lk != 21259               // 'while' ','\n       && lk != 21262               // 'with' ','\n       && lk != 21266               // 'xquery' ','\n       && lk != 27141               // Wildcard ';'\n       && lk != 27142               // EQName^Token ';'\n       && lk != 27144               // IntegerLiteral ';'\n       && lk != 27145               // DecimalLiteral ';'\n       && lk != 27146               // DoubleLiteral ';'\n       && lk != 27147               // StringLiteral ';'\n       && lk != 27180               // '.' ';'\n       && lk != 27181               // '..' ';'\n       && lk != 27182               // '/' ';'\n       && lk != 27206               // 'after' ';'\n       && lk != 27208               // 'allowing' ';'\n       && lk != 27209               // 'ancestor' ';'\n       && lk != 27210               // 'ancestor-or-self' ';'\n       && lk != 27211               // 'and' ';'\n       && lk != 27213               // 'append' ';'\n       && lk != 27214               // 'array' ';'\n       && lk != 27215               // 'as' ';'\n       && lk != 27216               // 'ascending' ';'\n       && lk != 27217               // 'at' ';'\n       && lk != 27218               // 'attribute' ';'\n       && lk != 27219               // 'base-uri' ';'\n       && lk != 27220               // 'before' ';'\n       && lk != 27221               // 'boundary-space' ';'\n       && lk != 27222               // 'break' ';'\n       && lk != 27224               // 'case' ';'\n       && lk != 27225               // 'cast' ';'\n       && lk != 27226               // 'castable' ';'\n       && lk != 27227               // 'catch' ';'\n       && lk != 27229               // 'child' ';'\n       && lk != 27230               // 'collation' ';'\n       && lk != 27232               // 'comment' ';'\n       && lk != 27233               // 'constraint' ';'\n       && lk != 27234               // 'construction' ';'\n       && lk != 27237               // 'context' ';'\n       && lk != 27238               // 'continue' ';'\n       && lk != 27239               // 'copy' ';'\n       && lk != 27240               // 'copy-namespaces' ';'\n       && lk != 27241               // 'count' ';'\n       && lk != 27242               // 'decimal-format' ';'\n       && lk != 27244               // 'declare' ';'\n       && lk != 27245               // 'default' ';'\n       && lk != 27246               // 'delete' ';'\n       && lk != 27247               // 'descendant' ';'\n       && lk != 27248               // 'descendant-or-self' ';'\n       && lk != 27249               // 'descending' ';'\n       && lk != 27254               // 'div' ';'\n       && lk != 27255               // 'document' ';'\n       && lk != 27256               // 'document-node' ';'\n       && lk != 27257               // 'element' ';'\n       && lk != 27258               // 'else' ';'\n       && lk != 27259               // 'empty' ';'\n       && lk != 27260               // 'empty-sequence' ';'\n       && lk != 27261               // 'encoding' ';'\n       && lk != 27262               // 'end' ';'\n       && lk != 27264               // 'eq' ';'\n       && lk != 27265               // 'every' ';'\n       && lk != 27267               // 'except' ';'\n       && lk != 27268               // 'exit' ';'\n       && lk != 27269               // 'external' ';'\n       && lk != 27270               // 'first' ';'\n       && lk != 27271               // 'following' ';'\n       && lk != 27272               // 'following-sibling' ';'\n       && lk != 27273               // 'for' ';'\n       && lk != 27277               // 'ft-option' ';'\n       && lk != 27281               // 'function' ';'\n       && lk != 27282               // 'ge' ';'\n       && lk != 27284               // 'group' ';'\n       && lk != 27286               // 'gt' ';'\n       && lk != 27287               // 'idiv' ';'\n       && lk != 27288               // 'if' ';'\n       && lk != 27289               // 'import' ';'\n       && lk != 27290               // 'in' ';'\n       && lk != 27291               // 'index' ';'\n       && lk != 27295               // 'insert' ';'\n       && lk != 27296               // 'instance' ';'\n       && lk != 27297               // 'integrity' ';'\n       && lk != 27298               // 'intersect' ';'\n       && lk != 27299               // 'into' ';'\n       && lk != 27300               // 'is' ';'\n       && lk != 27301               // 'item' ';'\n       && lk != 27302               // 'json' ';'\n       && lk != 27303               // 'json-item' ';'\n       && lk != 27306               // 'last' ';'\n       && lk != 27307               // 'lax' ';'\n       && lk != 27308               // 'le' ';'\n       && lk != 27310               // 'let' ';'\n       && lk != 27312               // 'loop' ';'\n       && lk != 27314               // 'lt' ';'\n       && lk != 27316               // 'mod' ';'\n       && lk != 27317               // 'modify' ';'\n       && lk != 27318               // 'module' ';'\n       && lk != 27320               // 'namespace' ';'\n       && lk != 27321               // 'namespace-node' ';'\n       && lk != 27322               // 'ne' ';'\n       && lk != 27327               // 'node' ';'\n       && lk != 27328               // 'nodes' ';'\n       && lk != 27330               // 'object' ';'\n       && lk != 27334               // 'only' ';'\n       && lk != 27335               // 'option' ';'\n       && lk != 27336               // 'or' ';'\n       && lk != 27337               // 'order' ';'\n       && lk != 27338               // 'ordered' ';'\n       && lk != 27339               // 'ordering' ';'\n       && lk != 27342               // 'parent' ';'\n       && lk != 27348               // 'preceding' ';'\n       && lk != 27349               // 'preceding-sibling' ';'\n       && lk != 27352               // 'processing-instruction' ';'\n       && lk != 27354               // 'rename' ';'\n       && lk != 27355               // 'replace' ';'\n       && lk != 27356               // 'return' ';'\n       && lk != 27357               // 'returning' ';'\n       && lk != 27358               // 'revalidation' ';'\n       && lk != 27360               // 'satisfies' ';'\n       && lk != 27361               // 'schema' ';'\n       && lk != 27362               // 'schema-attribute' ';'\n       && lk != 27363               // 'schema-element' ';'\n       && lk != 27364               // 'score' ';'\n       && lk != 27365               // 'self' ';'\n       && lk != 27370               // 'sliding' ';'\n       && lk != 27371               // 'some' ';'\n       && lk != 27372               // 'stable' ';'\n       && lk != 27373               // 'start' ';'\n       && lk != 27376               // 'strict' ';'\n       && lk != 27378               // 'structured-item' ';'\n       && lk != 27379               // 'switch' ';'\n       && lk != 27380               // 'text' ';'\n       && lk != 27384               // 'to' ';'\n       && lk != 27385               // 'treat' ';'\n       && lk != 27386               // 'try' ';'\n       && lk != 27387               // 'tumbling' ';'\n       && lk != 27388               // 'type' ';'\n       && lk != 27389               // 'typeswitch' ';'\n       && lk != 27390               // 'union' ';'\n       && lk != 27392               // 'unordered' ';'\n       && lk != 27393               // 'updating' ';'\n       && lk != 27396               // 'validate' ';'\n       && lk != 27397               // 'value' ';'\n       && lk != 27398               // 'variable' ';'\n       && lk != 27399               // 'version' ';'\n       && lk != 27402               // 'where' ';'\n       && lk != 27403               // 'while' ';'\n       && lk != 27406               // 'with' ';'\n       && lk != 27410               // 'xquery' ';'\n       && lk != 90198               // 'break' 'loop'\n       && lk != 90214               // 'continue' 'loop'\n       && lk != 113284              // 'exit' 'returning'\n       && lk != 144389              // Wildcard '}'\n       && lk != 144390              // EQName^Token '}'\n       && lk != 144392              // IntegerLiteral '}'\n       && lk != 144393              // DecimalLiteral '}'\n       && lk != 144394              // DoubleLiteral '}'\n       && lk != 144395              // StringLiteral '}'\n       && lk != 144428              // '.' '}'\n       && lk != 144429              // '..' '}'\n       && lk != 144430              // '/' '}'\n       && lk != 144454              // 'after' '}'\n       && lk != 144456              // 'allowing' '}'\n       && lk != 144457              // 'ancestor' '}'\n       && lk != 144458              // 'ancestor-or-self' '}'\n       && lk != 144459              // 'and' '}'\n       && lk != 144461              // 'append' '}'\n       && lk != 144462              // 'array' '}'\n       && lk != 144463              // 'as' '}'\n       && lk != 144464              // 'ascending' '}'\n       && lk != 144465              // 'at' '}'\n       && lk != 144466              // 'attribute' '}'\n       && lk != 144467              // 'base-uri' '}'\n       && lk != 144468              // 'before' '}'\n       && lk != 144469              // 'boundary-space' '}'\n       && lk != 144470              // 'break' '}'\n       && lk != 144472              // 'case' '}'\n       && lk != 144473              // 'cast' '}'\n       && lk != 144474              // 'castable' '}'\n       && lk != 144475              // 'catch' '}'\n       && lk != 144477              // 'child' '}'\n       && lk != 144478              // 'collation' '}'\n       && lk != 144480              // 'comment' '}'\n       && lk != 144481              // 'constraint' '}'\n       && lk != 144482              // 'construction' '}'\n       && lk != 144485              // 'context' '}'\n       && lk != 144486              // 'continue' '}'\n       && lk != 144487              // 'copy' '}'\n       && lk != 144488              // 'copy-namespaces' '}'\n       && lk != 144489              // 'count' '}'\n       && lk != 144490              // 'decimal-format' '}'\n       && lk != 144492              // 'declare' '}'\n       && lk != 144493              // 'default' '}'\n       && lk != 144494              // 'delete' '}'\n       && lk != 144495              // 'descendant' '}'\n       && lk != 144496              // 'descendant-or-self' '}'\n       && lk != 144497              // 'descending' '}'\n       && lk != 144502              // 'div' '}'\n       && lk != 144503              // 'document' '}'\n       && lk != 144504              // 'document-node' '}'\n       && lk != 144505              // 'element' '}'\n       && lk != 144506              // 'else' '}'\n       && lk != 144507              // 'empty' '}'\n       && lk != 144508              // 'empty-sequence' '}'\n       && lk != 144509              // 'encoding' '}'\n       && lk != 144510              // 'end' '}'\n       && lk != 144512              // 'eq' '}'\n       && lk != 144513              // 'every' '}'\n       && lk != 144515              // 'except' '}'\n       && lk != 144516              // 'exit' '}'\n       && lk != 144517              // 'external' '}'\n       && lk != 144518              // 'first' '}'\n       && lk != 144519              // 'following' '}'\n       && lk != 144520              // 'following-sibling' '}'\n       && lk != 144521              // 'for' '}'\n       && lk != 144525              // 'ft-option' '}'\n       && lk != 144529              // 'function' '}'\n       && lk != 144530              // 'ge' '}'\n       && lk != 144532              // 'group' '}'\n       && lk != 144534              // 'gt' '}'\n       && lk != 144535              // 'idiv' '}'\n       && lk != 144536              // 'if' '}'\n       && lk != 144537              // 'import' '}'\n       && lk != 144538              // 'in' '}'\n       && lk != 144539              // 'index' '}'\n       && lk != 144543              // 'insert' '}'\n       && lk != 144544              // 'instance' '}'\n       && lk != 144545              // 'integrity' '}'\n       && lk != 144546              // 'intersect' '}'\n       && lk != 144547              // 'into' '}'\n       && lk != 144548              // 'is' '}'\n       && lk != 144549              // 'item' '}'\n       && lk != 144550              // 'json' '}'\n       && lk != 144551              // 'json-item' '}'\n       && lk != 144554              // 'last' '}'\n       && lk != 144555              // 'lax' '}'\n       && lk != 144556              // 'le' '}'\n       && lk != 144558              // 'let' '}'\n       && lk != 144560              // 'loop' '}'\n       && lk != 144562              // 'lt' '}'\n       && lk != 144564              // 'mod' '}'\n       && lk != 144565              // 'modify' '}'\n       && lk != 144566              // 'module' '}'\n       && lk != 144568              // 'namespace' '}'\n       && lk != 144569              // 'namespace-node' '}'\n       && lk != 144570              // 'ne' '}'\n       && lk != 144575              // 'node' '}'\n       && lk != 144576              // 'nodes' '}'\n       && lk != 144578              // 'object' '}'\n       && lk != 144582              // 'only' '}'\n       && lk != 144583              // 'option' '}'\n       && lk != 144584              // 'or' '}'\n       && lk != 144585              // 'order' '}'\n       && lk != 144586              // 'ordered' '}'\n       && lk != 144587              // 'ordering' '}'\n       && lk != 144590              // 'parent' '}'\n       && lk != 144596              // 'preceding' '}'\n       && lk != 144597              // 'preceding-sibling' '}'\n       && lk != 144600              // 'processing-instruction' '}'\n       && lk != 144602              // 'rename' '}'\n       && lk != 144603              // 'replace' '}'\n       && lk != 144604              // 'return' '}'\n       && lk != 144605              // 'returning' '}'\n       && lk != 144606              // 'revalidation' '}'\n       && lk != 144608              // 'satisfies' '}'\n       && lk != 144609              // 'schema' '}'\n       && lk != 144610              // 'schema-attribute' '}'\n       && lk != 144611              // 'schema-element' '}'\n       && lk != 144612              // 'score' '}'\n       && lk != 144613              // 'self' '}'\n       && lk != 144618              // 'sliding' '}'\n       && lk != 144619              // 'some' '}'\n       && lk != 144620              // 'stable' '}'\n       && lk != 144621              // 'start' '}'\n       && lk != 144624              // 'strict' '}'\n       && lk != 144626              // 'structured-item' '}'\n       && lk != 144627              // 'switch' '}'\n       && lk != 144628              // 'text' '}'\n       && lk != 144632              // 'to' '}'\n       && lk != 144633              // 'treat' '}'\n       && lk != 144634              // 'try' '}'\n       && lk != 144635              // 'tumbling' '}'\n       && lk != 144636              // 'type' '}'\n       && lk != 144637              // 'typeswitch' '}'\n       && lk != 144638              // 'union' '}'\n       && lk != 144640              // 'unordered' '}'\n       && lk != 144641              // 'updating' '}'\n       && lk != 144644              // 'validate' '}'\n       && lk != 144645              // 'value' '}'\n       && lk != 144646              // 'variable' '}'\n       && lk != 144647              // 'version' '}'\n       && lk != 144650              // 'where' '}'\n       && lk != 144651              // 'while' '}'\n       && lk != 144654              // 'with' '}'\n       && lk != 144658)             // 'xquery' '}'\n      {\n        lk = memoized(6, e0);\n        if (lk == 0)\n        {\n          var b0A = b0; var e0A = e0; var l1A = l1;\n          var b1A = b1; var e1A = e1; var l2A = l2;\n          var b2A = b2; var e2A = e2;\n          try\n          {\n            try_Statement();\n            memoize(6, e0A, -1);\n            continue;\n          }\n          catch (p1A)\n          {\n            b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n            b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n            b2 = b2A; e2 = e2A; end = e2A; }}\n            memoize(6, e0A, -2);\n            break;\n          }\n        }\n      }\n      if (lk != -1\n       && lk != 53                  // ';'\n       && lk != 16134               // 'variable' '$'\n       && lk != 27141               // Wildcard ';'\n       && lk != 27142               // EQName^Token ';'\n       && lk != 27144               // IntegerLiteral ';'\n       && lk != 27145               // DecimalLiteral ';'\n       && lk != 27146               // DoubleLiteral ';'\n       && lk != 27147               // StringLiteral ';'\n       && lk != 27180               // '.' ';'\n       && lk != 27181               // '..' ';'\n       && lk != 27182               // '/' ';'\n       && lk != 27206               // 'after' ';'\n       && lk != 27208               // 'allowing' ';'\n       && lk != 27209               // 'ancestor' ';'\n       && lk != 27210               // 'ancestor-or-self' ';'\n       && lk != 27211               // 'and' ';'\n       && lk != 27213               // 'append' ';'\n       && lk != 27214               // 'array' ';'\n       && lk != 27215               // 'as' ';'\n       && lk != 27216               // 'ascending' ';'\n       && lk != 27217               // 'at' ';'\n       && lk != 27218               // 'attribute' ';'\n       && lk != 27219               // 'base-uri' ';'\n       && lk != 27220               // 'before' ';'\n       && lk != 27221               // 'boundary-space' ';'\n       && lk != 27222               // 'break' ';'\n       && lk != 27224               // 'case' ';'\n       && lk != 27225               // 'cast' ';'\n       && lk != 27226               // 'castable' ';'\n       && lk != 27227               // 'catch' ';'\n       && lk != 27229               // 'child' ';'\n       && lk != 27230               // 'collation' ';'\n       && lk != 27232               // 'comment' ';'\n       && lk != 27233               // 'constraint' ';'\n       && lk != 27234               // 'construction' ';'\n       && lk != 27237               // 'context' ';'\n       && lk != 27238               // 'continue' ';'\n       && lk != 27239               // 'copy' ';'\n       && lk != 27240               // 'copy-namespaces' ';'\n       && lk != 27241               // 'count' ';'\n       && lk != 27242               // 'decimal-format' ';'\n       && lk != 27244               // 'declare' ';'\n       && lk != 27245               // 'default' ';'\n       && lk != 27246               // 'delete' ';'\n       && lk != 27247               // 'descendant' ';'\n       && lk != 27248               // 'descendant-or-self' ';'\n       && lk != 27249               // 'descending' ';'\n       && lk != 27254               // 'div' ';'\n       && lk != 27255               // 'document' ';'\n       && lk != 27256               // 'document-node' ';'\n       && lk != 27257               // 'element' ';'\n       && lk != 27258               // 'else' ';'\n       && lk != 27259               // 'empty' ';'\n       && lk != 27260               // 'empty-sequence' ';'\n       && lk != 27261               // 'encoding' ';'\n       && lk != 27262               // 'end' ';'\n       && lk != 27264               // 'eq' ';'\n       && lk != 27265               // 'every' ';'\n       && lk != 27267               // 'except' ';'\n       && lk != 27268               // 'exit' ';'\n       && lk != 27269               // 'external' ';'\n       && lk != 27270               // 'first' ';'\n       && lk != 27271               // 'following' ';'\n       && lk != 27272               // 'following-sibling' ';'\n       && lk != 27273               // 'for' ';'\n       && lk != 27277               // 'ft-option' ';'\n       && lk != 27281               // 'function' ';'\n       && lk != 27282               // 'ge' ';'\n       && lk != 27284               // 'group' ';'\n       && lk != 27286               // 'gt' ';'\n       && lk != 27287               // 'idiv' ';'\n       && lk != 27288               // 'if' ';'\n       && lk != 27289               // 'import' ';'\n       && lk != 27290               // 'in' ';'\n       && lk != 27291               // 'index' ';'\n       && lk != 27295               // 'insert' ';'\n       && lk != 27296               // 'instance' ';'\n       && lk != 27297               // 'integrity' ';'\n       && lk != 27298               // 'intersect' ';'\n       && lk != 27299               // 'into' ';'\n       && lk != 27300               // 'is' ';'\n       && lk != 27301               // 'item' ';'\n       && lk != 27302               // 'json' ';'\n       && lk != 27303               // 'json-item' ';'\n       && lk != 27306               // 'last' ';'\n       && lk != 27307               // 'lax' ';'\n       && lk != 27308               // 'le' ';'\n       && lk != 27310               // 'let' ';'\n       && lk != 27312               // 'loop' ';'\n       && lk != 27314               // 'lt' ';'\n       && lk != 27316               // 'mod' ';'\n       && lk != 27317               // 'modify' ';'\n       && lk != 27318               // 'module' ';'\n       && lk != 27320               // 'namespace' ';'\n       && lk != 27321               // 'namespace-node' ';'\n       && lk != 27322               // 'ne' ';'\n       && lk != 27327               // 'node' ';'\n       && lk != 27328               // 'nodes' ';'\n       && lk != 27330               // 'object' ';'\n       && lk != 27334               // 'only' ';'\n       && lk != 27335               // 'option' ';'\n       && lk != 27336               // 'or' ';'\n       && lk != 27337               // 'order' ';'\n       && lk != 27338               // 'ordered' ';'\n       && lk != 27339               // 'ordering' ';'\n       && lk != 27342               // 'parent' ';'\n       && lk != 27348               // 'preceding' ';'\n       && lk != 27349               // 'preceding-sibling' ';'\n       && lk != 27352               // 'processing-instruction' ';'\n       && lk != 27354               // 'rename' ';'\n       && lk != 27355               // 'replace' ';'\n       && lk != 27356               // 'return' ';'\n       && lk != 27357               // 'returning' ';'\n       && lk != 27358               // 'revalidation' ';'\n       && lk != 27360               // 'satisfies' ';'\n       && lk != 27361               // 'schema' ';'\n       && lk != 27362               // 'schema-attribute' ';'\n       && lk != 27363               // 'schema-element' ';'\n       && lk != 27364               // 'score' ';'\n       && lk != 27365               // 'self' ';'\n       && lk != 27370               // 'sliding' ';'\n       && lk != 27371               // 'some' ';'\n       && lk != 27372               // 'stable' ';'\n       && lk != 27373               // 'start' ';'\n       && lk != 27376               // 'strict' ';'\n       && lk != 27378               // 'structured-item' ';'\n       && lk != 27379               // 'switch' ';'\n       && lk != 27380               // 'text' ';'\n       && lk != 27384               // 'to' ';'\n       && lk != 27385               // 'treat' ';'\n       && lk != 27386               // 'try' ';'\n       && lk != 27387               // 'tumbling' ';'\n       && lk != 27388               // 'type' ';'\n       && lk != 27389               // 'typeswitch' ';'\n       && lk != 27390               // 'union' ';'\n       && lk != 27392               // 'unordered' ';'\n       && lk != 27393               // 'updating' ';'\n       && lk != 27396               // 'validate' ';'\n       && lk != 27397               // 'value' ';'\n       && lk != 27398               // 'variable' ';'\n       && lk != 27399               // 'version' ';'\n       && lk != 27402               // 'where' ';'\n       && lk != 27403               // 'while' ';'\n       && lk != 27406               // 'with' ';'\n       && lk != 27410               // 'xquery' ';'\n       && lk != 90198               // 'break' 'loop'\n       && lk != 90214               // 'continue' 'loop'\n       && lk != 113284)             // 'exit' 'returning'\n      {\n        break;\n      }\n      try_Statement();\n    }\n  }\n\n  function parse_StatementsAndExpr()\n  {\n    eventHandler.startNonterminal(\"StatementsAndExpr\", e0);\n    parse_Statements();\n    whitespace();\n    parse_Expr();\n    eventHandler.endNonterminal(\"StatementsAndExpr\", e0);\n  }\n\n  function try_StatementsAndExpr()\n  {\n    try_Statements();\n    try_Expr();\n  }\n\n  function parse_StatementsAndOptionalExpr()\n  {\n    eventHandler.startNonterminal(\"StatementsAndOptionalExpr\", e0);\n    parse_Statements();\n    if (l1 != 25                    // EOF\n     && l1 != 282)                  // '}'\n    {\n      whitespace();\n      parse_Expr();\n    }\n    eventHandler.endNonterminal(\"StatementsAndOptionalExpr\", e0);\n  }\n\n  function try_StatementsAndOptionalExpr()\n  {\n    try_Statements();\n    if (l1 != 25                    // EOF\n     && l1 != 282)                  // '}'\n    {\n      try_Expr();\n    }\n  }\n\n  function parse_Statement()\n  {\n    eventHandler.startNonterminal(\"Statement\", e0);\n    switch (l1)\n    {\n    case 132:                       // 'exit'\n      lookahead2W(189);             // S^WS | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | '-' | '/' | '//' | ';' | '<' |\n      break;\n    case 137:                       // 'for'\n      lookahead2W(196);             // S^WS | '!' | '!=' | '#' | '$' | '(' | '(:' | '*' | '+' | '-' | '/' | '//' | ';' |\n      break;\n    case 174:                       // 'let'\n      lookahead2W(193);             // S^WS | '!' | '!=' | '#' | '$' | '(' | '(:' | '*' | '+' | '-' | '/' | '//' | ';' |\n      break;\n    case 250:                       // 'try'\n      lookahead2W(190);             // S^WS | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | '-' | '/' | '//' | ';' | '<' |\n      break;\n    case 262:                       // 'variable'\n      lookahead2W(187);             // S^WS | '!' | '!=' | '#' | '$' | '(' | '(:' | '*' | '+' | '-' | '/' | '//' | ';' |\n      break;\n    case 276:                       // '{'\n      lookahead2W(277);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      break;\n    case 31:                        // '$'\n    case 32:                        // '%'\n      lookahead2W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    case 86:                        // 'break'\n    case 102:                       // 'continue'\n      lookahead2W(188);             // S^WS | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | '-' | '/' | '//' | ';' | '<' |\n      break;\n    case 152:                       // 'if'\n    case 243:                       // 'switch'\n    case 253:                       // 'typeswitch'\n    case 267:                       // 'while'\n      lookahead2W(185);             // S^WS | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | '-' | '/' | '//' | ';' | '<' |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 2836                  // '{' Wildcard\n     || lk == 3103                  // '$' EQName^Token\n     || lk == 3104                  // '%' EQName^Token\n     || lk == 3348                  // '{' EQName^Token\n     || lk == 4372                  // '{' IntegerLiteral\n     || lk == 4884                  // '{' DecimalLiteral\n     || lk == 5396                  // '{' DoubleLiteral\n     || lk == 5908                  // '{' StringLiteral\n     || lk == 16148                 // '{' '$'\n     || lk == 16660                 // '{' '%'\n     || lk == 17675                 // 'while' '('\n     || lk == 17684                 // '{' '('\n     || lk == 18196                 // '{' '(#'\n     || lk == 20756                 // '{' '+'\n     || lk == 21780                 // '{' '-'\n     || lk == 22804                 // '{' '.'\n     || lk == 23316                 // '{' '..'\n     || lk == 23828                 // '{' '/'\n     || lk == 24340                 // '{' '//'\n     || lk == 27412                 // '{' ';'\n     || lk == 27924                 // '{' '<'\n     || lk == 28436                 // '{' '<!--'\n     || lk == 30484                 // '{' '<?'\n     || lk == 34068                 // '{' '@'\n     || lk == 35092                 // '{' '['\n     || lk == 35871                 // '$' 'after'\n     || lk == 35872                 // '%' 'after'\n     || lk == 36116                 // '{' 'after'\n     || lk == 36895                 // '$' 'allowing'\n     || lk == 36896                 // '%' 'allowing'\n     || lk == 37140                 // '{' 'allowing'\n     || lk == 37407                 // '$' 'ancestor'\n     || lk == 37408                 // '%' 'ancestor'\n     || lk == 37652                 // '{' 'ancestor'\n     || lk == 37919                 // '$' 'ancestor-or-self'\n     || lk == 37920                 // '%' 'ancestor-or-self'\n     || lk == 38164                 // '{' 'ancestor-or-self'\n     || lk == 38431                 // '$' 'and'\n     || lk == 38432                 // '%' 'and'\n     || lk == 38676                 // '{' 'and'\n     || lk == 39455                 // '$' 'append'\n     || lk == 39456                 // '%' 'append'\n     || lk == 39700                 // '{' 'append'\n     || lk == 39967                 // '$' 'array'\n     || lk == 39968                 // '%' 'array'\n     || lk == 40212                 // '{' 'array'\n     || lk == 40479                 // '$' 'as'\n     || lk == 40480                 // '%' 'as'\n     || lk == 40724                 // '{' 'as'\n     || lk == 40991                 // '$' 'ascending'\n     || lk == 40992                 // '%' 'ascending'\n     || lk == 41236                 // '{' 'ascending'\n     || lk == 41503                 // '$' 'at'\n     || lk == 41504                 // '%' 'at'\n     || lk == 41748                 // '{' 'at'\n     || lk == 42015                 // '$' 'attribute'\n     || lk == 42016                 // '%' 'attribute'\n     || lk == 42260                 // '{' 'attribute'\n     || lk == 42527                 // '$' 'base-uri'\n     || lk == 42528                 // '%' 'base-uri'\n     || lk == 42772                 // '{' 'base-uri'\n     || lk == 43039                 // '$' 'before'\n     || lk == 43040                 // '%' 'before'\n     || lk == 43284                 // '{' 'before'\n     || lk == 43551                 // '$' 'boundary-space'\n     || lk == 43552                 // '%' 'boundary-space'\n     || lk == 43796                 // '{' 'boundary-space'\n     || lk == 44063                 // '$' 'break'\n     || lk == 44064                 // '%' 'break'\n     || lk == 44308                 // '{' 'break'\n     || lk == 45087                 // '$' 'case'\n     || lk == 45088                 // '%' 'case'\n     || lk == 45332                 // '{' 'case'\n     || lk == 45599                 // '$' 'cast'\n     || lk == 45600                 // '%' 'cast'\n     || lk == 45844                 // '{' 'cast'\n     || lk == 46111                 // '$' 'castable'\n     || lk == 46112                 // '%' 'castable'\n     || lk == 46356                 // '{' 'castable'\n     || lk == 46623                 // '$' 'catch'\n     || lk == 46624                 // '%' 'catch'\n     || lk == 46868                 // '{' 'catch'\n     || lk == 47647                 // '$' 'child'\n     || lk == 47648                 // '%' 'child'\n     || lk == 47892                 // '{' 'child'\n     || lk == 48159                 // '$' 'collation'\n     || lk == 48160                 // '%' 'collation'\n     || lk == 48404                 // '{' 'collation'\n     || lk == 49183                 // '$' 'comment'\n     || lk == 49184                 // '%' 'comment'\n     || lk == 49428                 // '{' 'comment'\n     || lk == 49695                 // '$' 'constraint'\n     || lk == 49696                 // '%' 'constraint'\n     || lk == 49940                 // '{' 'constraint'\n     || lk == 50207                 // '$' 'construction'\n     || lk == 50208                 // '%' 'construction'\n     || lk == 50452                 // '{' 'construction'\n     || lk == 51743                 // '$' 'context'\n     || lk == 51744                 // '%' 'context'\n     || lk == 51988                 // '{' 'context'\n     || lk == 52255                 // '$' 'continue'\n     || lk == 52256                 // '%' 'continue'\n     || lk == 52500                 // '{' 'continue'\n     || lk == 52767                 // '$' 'copy'\n     || lk == 52768                 // '%' 'copy'\n     || lk == 53012                 // '{' 'copy'\n     || lk == 53279                 // '$' 'copy-namespaces'\n     || lk == 53280                 // '%' 'copy-namespaces'\n     || lk == 53524                 // '{' 'copy-namespaces'\n     || lk == 53791                 // '$' 'count'\n     || lk == 53792                 // '%' 'count'\n     || lk == 54036                 // '{' 'count'\n     || lk == 54303                 // '$' 'decimal-format'\n     || lk == 54304                 // '%' 'decimal-format'\n     || lk == 54548                 // '{' 'decimal-format'\n     || lk == 55327                 // '$' 'declare'\n     || lk == 55328                 // '%' 'declare'\n     || lk == 55572                 // '{' 'declare'\n     || lk == 55839                 // '$' 'default'\n     || lk == 55840                 // '%' 'default'\n     || lk == 56084                 // '{' 'default'\n     || lk == 56351                 // '$' 'delete'\n     || lk == 56352                 // '%' 'delete'\n     || lk == 56596                 // '{' 'delete'\n     || lk == 56863                 // '$' 'descendant'\n     || lk == 56864                 // '%' 'descendant'\n     || lk == 57108                 // '{' 'descendant'\n     || lk == 57375                 // '$' 'descendant-or-self'\n     || lk == 57376                 // '%' 'descendant-or-self'\n     || lk == 57620                 // '{' 'descendant-or-self'\n     || lk == 57887                 // '$' 'descending'\n     || lk == 57888                 // '%' 'descending'\n     || lk == 58132                 // '{' 'descending'\n     || lk == 60447                 // '$' 'div'\n     || lk == 60448                 // '%' 'div'\n     || lk == 60692                 // '{' 'div'\n     || lk == 60959                 // '$' 'document'\n     || lk == 60960                 // '%' 'document'\n     || lk == 61204                 // '{' 'document'\n     || lk == 61471                 // '$' 'document-node'\n     || lk == 61472                 // '%' 'document-node'\n     || lk == 61716                 // '{' 'document-node'\n     || lk == 61983                 // '$' 'element'\n     || lk == 61984                 // '%' 'element'\n     || lk == 62228                 // '{' 'element'\n     || lk == 62495                 // '$' 'else'\n     || lk == 62496                 // '%' 'else'\n     || lk == 62740                 // '{' 'else'\n     || lk == 63007                 // '$' 'empty'\n     || lk == 63008                 // '%' 'empty'\n     || lk == 63252                 // '{' 'empty'\n     || lk == 63519                 // '$' 'empty-sequence'\n     || lk == 63520                 // '%' 'empty-sequence'\n     || lk == 63764                 // '{' 'empty-sequence'\n     || lk == 64031                 // '$' 'encoding'\n     || lk == 64032                 // '%' 'encoding'\n     || lk == 64276                 // '{' 'encoding'\n     || lk == 64543                 // '$' 'end'\n     || lk == 64544                 // '%' 'end'\n     || lk == 64788                 // '{' 'end'\n     || lk == 65567                 // '$' 'eq'\n     || lk == 65568                 // '%' 'eq'\n     || lk == 65812                 // '{' 'eq'\n     || lk == 66079                 // '$' 'every'\n     || lk == 66080                 // '%' 'every'\n     || lk == 66324                 // '{' 'every'\n     || lk == 67103                 // '$' 'except'\n     || lk == 67104                 // '%' 'except'\n     || lk == 67348                 // '{' 'except'\n     || lk == 67615                 // '$' 'exit'\n     || lk == 67616                 // '%' 'exit'\n     || lk == 67860                 // '{' 'exit'\n     || lk == 68127                 // '$' 'external'\n     || lk == 68128                 // '%' 'external'\n     || lk == 68372                 // '{' 'external'\n     || lk == 68639                 // '$' 'first'\n     || lk == 68640                 // '%' 'first'\n     || lk == 68884                 // '{' 'first'\n     || lk == 69151                 // '$' 'following'\n     || lk == 69152                 // '%' 'following'\n     || lk == 69396                 // '{' 'following'\n     || lk == 69663                 // '$' 'following-sibling'\n     || lk == 69664                 // '%' 'following-sibling'\n     || lk == 69908                 // '{' 'following-sibling'\n     || lk == 70175                 // '$' 'for'\n     || lk == 70176                 // '%' 'for'\n     || lk == 70420                 // '{' 'for'\n     || lk == 72223                 // '$' 'ft-option'\n     || lk == 72224                 // '%' 'ft-option'\n     || lk == 72468                 // '{' 'ft-option'\n     || lk == 74271                 // '$' 'function'\n     || lk == 74272                 // '%' 'function'\n     || lk == 74516                 // '{' 'function'\n     || lk == 74783                 // '$' 'ge'\n     || lk == 74784                 // '%' 'ge'\n     || lk == 75028                 // '{' 'ge'\n     || lk == 75807                 // '$' 'group'\n     || lk == 75808                 // '%' 'group'\n     || lk == 76052                 // '{' 'group'\n     || lk == 76831                 // '$' 'gt'\n     || lk == 76832                 // '%' 'gt'\n     || lk == 77076                 // '{' 'gt'\n     || lk == 77343                 // '$' 'idiv'\n     || lk == 77344                 // '%' 'idiv'\n     || lk == 77588                 // '{' 'idiv'\n     || lk == 77855                 // '$' 'if'\n     || lk == 77856                 // '%' 'if'\n     || lk == 78100                 // '{' 'if'\n     || lk == 78367                 // '$' 'import'\n     || lk == 78368                 // '%' 'import'\n     || lk == 78612                 // '{' 'import'\n     || lk == 78879                 // '$' 'in'\n     || lk == 78880                 // '%' 'in'\n     || lk == 79124                 // '{' 'in'\n     || lk == 79391                 // '$' 'index'\n     || lk == 79392                 // '%' 'index'\n     || lk == 79636                 // '{' 'index'\n     || lk == 81439                 // '$' 'insert'\n     || lk == 81440                 // '%' 'insert'\n     || lk == 81684                 // '{' 'insert'\n     || lk == 81951                 // '$' 'instance'\n     || lk == 81952                 // '%' 'instance'\n     || lk == 82196                 // '{' 'instance'\n     || lk == 82463                 // '$' 'integrity'\n     || lk == 82464                 // '%' 'integrity'\n     || lk == 82708                 // '{' 'integrity'\n     || lk == 82975                 // '$' 'intersect'\n     || lk == 82976                 // '%' 'intersect'\n     || lk == 83220                 // '{' 'intersect'\n     || lk == 83487                 // '$' 'into'\n     || lk == 83488                 // '%' 'into'\n     || lk == 83732                 // '{' 'into'\n     || lk == 83999                 // '$' 'is'\n     || lk == 84000                 // '%' 'is'\n     || lk == 84244                 // '{' 'is'\n     || lk == 84511                 // '$' 'item'\n     || lk == 84512                 // '%' 'item'\n     || lk == 84756                 // '{' 'item'\n     || lk == 85023                 // '$' 'json'\n     || lk == 85024                 // '%' 'json'\n     || lk == 85268                 // '{' 'json'\n     || lk == 85535                 // '$' 'json-item'\n     || lk == 85536                 // '%' 'json-item'\n     || lk == 85780                 // '{' 'json-item'\n     || lk == 87071                 // '$' 'last'\n     || lk == 87072                 // '%' 'last'\n     || lk == 87316                 // '{' 'last'\n     || lk == 87583                 // '$' 'lax'\n     || lk == 87584                 // '%' 'lax'\n     || lk == 87828                 // '{' 'lax'\n     || lk == 88095                 // '$' 'le'\n     || lk == 88096                 // '%' 'le'\n     || lk == 88340                 // '{' 'le'\n     || lk == 89119                 // '$' 'let'\n     || lk == 89120                 // '%' 'let'\n     || lk == 89364                 // '{' 'let'\n     || lk == 90143                 // '$' 'loop'\n     || lk == 90144                 // '%' 'loop'\n     || lk == 90388                 // '{' 'loop'\n     || lk == 91167                 // '$' 'lt'\n     || lk == 91168                 // '%' 'lt'\n     || lk == 91412                 // '{' 'lt'\n     || lk == 92191                 // '$' 'mod'\n     || lk == 92192                 // '%' 'mod'\n     || lk == 92436                 // '{' 'mod'\n     || lk == 92703                 // '$' 'modify'\n     || lk == 92704                 // '%' 'modify'\n     || lk == 92948                 // '{' 'modify'\n     || lk == 93215                 // '$' 'module'\n     || lk == 93216                 // '%' 'module'\n     || lk == 93460                 // '{' 'module'\n     || lk == 94239                 // '$' 'namespace'\n     || lk == 94240                 // '%' 'namespace'\n     || lk == 94484                 // '{' 'namespace'\n     || lk == 94751                 // '$' 'namespace-node'\n     || lk == 94752                 // '%' 'namespace-node'\n     || lk == 94996                 // '{' 'namespace-node'\n     || lk == 95263                 // '$' 'ne'\n     || lk == 95264                 // '%' 'ne'\n     || lk == 95508                 // '{' 'ne'\n     || lk == 97823                 // '$' 'node'\n     || lk == 97824                 // '%' 'node'\n     || lk == 98068                 // '{' 'node'\n     || lk == 98335                 // '$' 'nodes'\n     || lk == 98336                 // '%' 'nodes'\n     || lk == 98580                 // '{' 'nodes'\n     || lk == 99359                 // '$' 'object'\n     || lk == 99360                 // '%' 'object'\n     || lk == 99604                 // '{' 'object'\n     || lk == 101407                // '$' 'only'\n     || lk == 101408                // '%' 'only'\n     || lk == 101652                // '{' 'only'\n     || lk == 101919                // '$' 'option'\n     || lk == 101920                // '%' 'option'\n     || lk == 102164                // '{' 'option'\n     || lk == 102431                // '$' 'or'\n     || lk == 102432                // '%' 'or'\n     || lk == 102676                // '{' 'or'\n     || lk == 102943                // '$' 'order'\n     || lk == 102944                // '%' 'order'\n     || lk == 103188                // '{' 'order'\n     || lk == 103455                // '$' 'ordered'\n     || lk == 103456                // '%' 'ordered'\n     || lk == 103700                // '{' 'ordered'\n     || lk == 103967                // '$' 'ordering'\n     || lk == 103968                // '%' 'ordering'\n     || lk == 104212                // '{' 'ordering'\n     || lk == 105503                // '$' 'parent'\n     || lk == 105504                // '%' 'parent'\n     || lk == 105748                // '{' 'parent'\n     || lk == 108575                // '$' 'preceding'\n     || lk == 108576                // '%' 'preceding'\n     || lk == 108820                // '{' 'preceding'\n     || lk == 109087                // '$' 'preceding-sibling'\n     || lk == 109088                // '%' 'preceding-sibling'\n     || lk == 109332                // '{' 'preceding-sibling'\n     || lk == 110623                // '$' 'processing-instruction'\n     || lk == 110624                // '%' 'processing-instruction'\n     || lk == 110868                // '{' 'processing-instruction'\n     || lk == 111647                // '$' 'rename'\n     || lk == 111648                // '%' 'rename'\n     || lk == 111892                // '{' 'rename'\n     || lk == 112159                // '$' 'replace'\n     || lk == 112160                // '%' 'replace'\n     || lk == 112404                // '{' 'replace'\n     || lk == 112671                // '$' 'return'\n     || lk == 112672                // '%' 'return'\n     || lk == 112916                // '{' 'return'\n     || lk == 113183                // '$' 'returning'\n     || lk == 113184                // '%' 'returning'\n     || lk == 113428                // '{' 'returning'\n     || lk == 113695                // '$' 'revalidation'\n     || lk == 113696                // '%' 'revalidation'\n     || lk == 113940                // '{' 'revalidation'\n     || lk == 114719                // '$' 'satisfies'\n     || lk == 114720                // '%' 'satisfies'\n     || lk == 114964                // '{' 'satisfies'\n     || lk == 115231                // '$' 'schema'\n     || lk == 115232                // '%' 'schema'\n     || lk == 115476                // '{' 'schema'\n     || lk == 115743                // '$' 'schema-attribute'\n     || lk == 115744                // '%' 'schema-attribute'\n     || lk == 115988                // '{' 'schema-attribute'\n     || lk == 116255                // '$' 'schema-element'\n     || lk == 116256                // '%' 'schema-element'\n     || lk == 116500                // '{' 'schema-element'\n     || lk == 116767                // '$' 'score'\n     || lk == 116768                // '%' 'score'\n     || lk == 117012                // '{' 'score'\n     || lk == 117279                // '$' 'self'\n     || lk == 117280                // '%' 'self'\n     || lk == 117524                // '{' 'self'\n     || lk == 119839                // '$' 'sliding'\n     || lk == 119840                // '%' 'sliding'\n     || lk == 120084                // '{' 'sliding'\n     || lk == 120351                // '$' 'some'\n     || lk == 120352                // '%' 'some'\n     || lk == 120596                // '{' 'some'\n     || lk == 120863                // '$' 'stable'\n     || lk == 120864                // '%' 'stable'\n     || lk == 121108                // '{' 'stable'\n     || lk == 121375                // '$' 'start'\n     || lk == 121376                // '%' 'start'\n     || lk == 121620                // '{' 'start'\n     || lk == 122911                // '$' 'strict'\n     || lk == 122912                // '%' 'strict'\n     || lk == 123156                // '{' 'strict'\n     || lk == 123935                // '$' 'structured-item'\n     || lk == 123936                // '%' 'structured-item'\n     || lk == 124180                // '{' 'structured-item'\n     || lk == 124447                // '$' 'switch'\n     || lk == 124448                // '%' 'switch'\n     || lk == 124692                // '{' 'switch'\n     || lk == 124959                // '$' 'text'\n     || lk == 124960                // '%' 'text'\n     || lk == 125204                // '{' 'text'\n     || lk == 127007                // '$' 'to'\n     || lk == 127008                // '%' 'to'\n     || lk == 127252                // '{' 'to'\n     || lk == 127519                // '$' 'treat'\n     || lk == 127520                // '%' 'treat'\n     || lk == 127764                // '{' 'treat'\n     || lk == 128031                // '$' 'try'\n     || lk == 128032                // '%' 'try'\n     || lk == 128276                // '{' 'try'\n     || lk == 128543                // '$' 'tumbling'\n     || lk == 128544                // '%' 'tumbling'\n     || lk == 128788                // '{' 'tumbling'\n     || lk == 129055                // '$' 'type'\n     || lk == 129056                // '%' 'type'\n     || lk == 129300                // '{' 'type'\n     || lk == 129567                // '$' 'typeswitch'\n     || lk == 129568                // '%' 'typeswitch'\n     || lk == 129812                // '{' 'typeswitch'\n     || lk == 130079                // '$' 'union'\n     || lk == 130080                // '%' 'union'\n     || lk == 130324                // '{' 'union'\n     || lk == 131103                // '$' 'unordered'\n     || lk == 131104                // '%' 'unordered'\n     || lk == 131348                // '{' 'unordered'\n     || lk == 131615                // '$' 'updating'\n     || lk == 131616                // '%' 'updating'\n     || lk == 131860                // '{' 'updating'\n     || lk == 133151                // '$' 'validate'\n     || lk == 133152                // '%' 'validate'\n     || lk == 133396                // '{' 'validate'\n     || lk == 133663                // '$' 'value'\n     || lk == 133664                // '%' 'value'\n     || lk == 133908                // '{' 'value'\n     || lk == 134175                // '$' 'variable'\n     || lk == 134176                // '%' 'variable'\n     || lk == 134420                // '{' 'variable'\n     || lk == 134687                // '$' 'version'\n     || lk == 134688                // '%' 'version'\n     || lk == 134932                // '{' 'version'\n     || lk == 136223                // '$' 'where'\n     || lk == 136224                // '%' 'where'\n     || lk == 136468                // '{' 'where'\n     || lk == 136735                // '$' 'while'\n     || lk == 136736                // '%' 'while'\n     || lk == 136980                // '{' 'while'\n     || lk == 138271                // '$' 'with'\n     || lk == 138272                // '%' 'with'\n     || lk == 138516                // '{' 'with'\n     || lk == 140319                // '$' 'xquery'\n     || lk == 140320                // '%' 'xquery'\n     || lk == 140564                // '{' 'xquery'\n     || lk == 141588                // '{' '{'\n     || lk == 142612                // '{' '{|'\n     || lk == 144660)               // '{' '}'\n    {\n      lk = memoized(7, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_ApplyStatement();\n          lk = -1;\n        }\n        catch (p1A)\n        {\n          try\n          {\n            b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n            b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n            b2 = b2A; e2 = e2A; end = e2A; }}\n            try_AssignStatement();\n            lk = -2;\n          }\n          catch (p2A)\n          {\n            try\n            {\n              b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n              b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n              b2 = b2A; e2 = e2A; end = e2A; }}\n              try_BlockStatement();\n              lk = -3;\n            }\n            catch (p3A)\n            {\n              try\n              {\n                b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n                b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n                b2 = b2A; e2 = e2A; end = e2A; }}\n                try_VarDeclStatement();\n                lk = -12;\n              }\n              catch (p12A)\n              {\n                lk = -13;\n              }\n            }\n          }\n        }\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(7, e0, lk);\n      }\n    }\n    switch (lk)\n    {\n    case -2:\n      parse_AssignStatement();\n      break;\n    case -3:\n      parse_BlockStatement();\n      break;\n    case 90198:                     // 'break' 'loop'\n      parse_BreakStatement();\n      break;\n    case 90214:                     // 'continue' 'loop'\n      parse_ContinueStatement();\n      break;\n    case 113284:                    // 'exit' 'returning'\n      parse_ExitStatement();\n      break;\n    case 16009:                     // 'for' '$'\n    case 16046:                     // 'let' '$'\n    case 116910:                    // 'let' 'score'\n    case 119945:                    // 'for' 'sliding'\n    case 128649:                    // 'for' 'tumbling'\n      parse_FLWORStatement();\n      break;\n    case 17560:                     // 'if' '('\n      parse_IfStatement();\n      break;\n    case 17651:                     // 'switch' '('\n      parse_SwitchStatement();\n      break;\n    case 141562:                    // 'try' '{'\n      parse_TryCatchStatement();\n      break;\n    case 17661:                     // 'typeswitch' '('\n      parse_TypeswitchStatement();\n      break;\n    case -12:\n    case 16134:                     // 'variable' '$'\n      parse_VarDeclStatement();\n      break;\n    case -13:\n      parse_WhileStatement();\n      break;\n    case 53:                        // ';'\n      parse_VoidStatement();\n      break;\n    default:\n      parse_ApplyStatement();\n    }\n    eventHandler.endNonterminal(\"Statement\", e0);\n  }\n\n  function try_Statement()\n  {\n    switch (l1)\n    {\n    case 132:                       // 'exit'\n      lookahead2W(189);             // S^WS | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | '-' | '/' | '//' | ';' | '<' |\n      break;\n    case 137:                       // 'for'\n      lookahead2W(196);             // S^WS | '!' | '!=' | '#' | '$' | '(' | '(:' | '*' | '+' | '-' | '/' | '//' | ';' |\n      break;\n    case 174:                       // 'let'\n      lookahead2W(193);             // S^WS | '!' | '!=' | '#' | '$' | '(' | '(:' | '*' | '+' | '-' | '/' | '//' | ';' |\n      break;\n    case 250:                       // 'try'\n      lookahead2W(190);             // S^WS | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | '-' | '/' | '//' | ';' | '<' |\n      break;\n    case 262:                       // 'variable'\n      lookahead2W(187);             // S^WS | '!' | '!=' | '#' | '$' | '(' | '(:' | '*' | '+' | '-' | '/' | '//' | ';' |\n      break;\n    case 276:                       // '{'\n      lookahead2W(277);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      break;\n    case 31:                        // '$'\n    case 32:                        // '%'\n      lookahead2W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    case 86:                        // 'break'\n    case 102:                       // 'continue'\n      lookahead2W(188);             // S^WS | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | '-' | '/' | '//' | ';' | '<' |\n      break;\n    case 152:                       // 'if'\n    case 243:                       // 'switch'\n    case 253:                       // 'typeswitch'\n    case 267:                       // 'while'\n      lookahead2W(185);             // S^WS | '!' | '!=' | '#' | '(' | '(:' | '*' | '+' | '-' | '/' | '//' | ';' | '<' |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 2836                  // '{' Wildcard\n     || lk == 3103                  // '$' EQName^Token\n     || lk == 3104                  // '%' EQName^Token\n     || lk == 3348                  // '{' EQName^Token\n     || lk == 4372                  // '{' IntegerLiteral\n     || lk == 4884                  // '{' DecimalLiteral\n     || lk == 5396                  // '{' DoubleLiteral\n     || lk == 5908                  // '{' StringLiteral\n     || lk == 16148                 // '{' '$'\n     || lk == 16660                 // '{' '%'\n     || lk == 17675                 // 'while' '('\n     || lk == 17684                 // '{' '('\n     || lk == 18196                 // '{' '(#'\n     || lk == 20756                 // '{' '+'\n     || lk == 21780                 // '{' '-'\n     || lk == 22804                 // '{' '.'\n     || lk == 23316                 // '{' '..'\n     || lk == 23828                 // '{' '/'\n     || lk == 24340                 // '{' '//'\n     || lk == 27412                 // '{' ';'\n     || lk == 27924                 // '{' '<'\n     || lk == 28436                 // '{' '<!--'\n     || lk == 30484                 // '{' '<?'\n     || lk == 34068                 // '{' '@'\n     || lk == 35092                 // '{' '['\n     || lk == 35871                 // '$' 'after'\n     || lk == 35872                 // '%' 'after'\n     || lk == 36116                 // '{' 'after'\n     || lk == 36895                 // '$' 'allowing'\n     || lk == 36896                 // '%' 'allowing'\n     || lk == 37140                 // '{' 'allowing'\n     || lk == 37407                 // '$' 'ancestor'\n     || lk == 37408                 // '%' 'ancestor'\n     || lk == 37652                 // '{' 'ancestor'\n     || lk == 37919                 // '$' 'ancestor-or-self'\n     || lk == 37920                 // '%' 'ancestor-or-self'\n     || lk == 38164                 // '{' 'ancestor-or-self'\n     || lk == 38431                 // '$' 'and'\n     || lk == 38432                 // '%' 'and'\n     || lk == 38676                 // '{' 'and'\n     || lk == 39455                 // '$' 'append'\n     || lk == 39456                 // '%' 'append'\n     || lk == 39700                 // '{' 'append'\n     || lk == 39967                 // '$' 'array'\n     || lk == 39968                 // '%' 'array'\n     || lk == 40212                 // '{' 'array'\n     || lk == 40479                 // '$' 'as'\n     || lk == 40480                 // '%' 'as'\n     || lk == 40724                 // '{' 'as'\n     || lk == 40991                 // '$' 'ascending'\n     || lk == 40992                 // '%' 'ascending'\n     || lk == 41236                 // '{' 'ascending'\n     || lk == 41503                 // '$' 'at'\n     || lk == 41504                 // '%' 'at'\n     || lk == 41748                 // '{' 'at'\n     || lk == 42015                 // '$' 'attribute'\n     || lk == 42016                 // '%' 'attribute'\n     || lk == 42260                 // '{' 'attribute'\n     || lk == 42527                 // '$' 'base-uri'\n     || lk == 42528                 // '%' 'base-uri'\n     || lk == 42772                 // '{' 'base-uri'\n     || lk == 43039                 // '$' 'before'\n     || lk == 43040                 // '%' 'before'\n     || lk == 43284                 // '{' 'before'\n     || lk == 43551                 // '$' 'boundary-space'\n     || lk == 43552                 // '%' 'boundary-space'\n     || lk == 43796                 // '{' 'boundary-space'\n     || lk == 44063                 // '$' 'break'\n     || lk == 44064                 // '%' 'break'\n     || lk == 44308                 // '{' 'break'\n     || lk == 45087                 // '$' 'case'\n     || lk == 45088                 // '%' 'case'\n     || lk == 45332                 // '{' 'case'\n     || lk == 45599                 // '$' 'cast'\n     || lk == 45600                 // '%' 'cast'\n     || lk == 45844                 // '{' 'cast'\n     || lk == 46111                 // '$' 'castable'\n     || lk == 46112                 // '%' 'castable'\n     || lk == 46356                 // '{' 'castable'\n     || lk == 46623                 // '$' 'catch'\n     || lk == 46624                 // '%' 'catch'\n     || lk == 46868                 // '{' 'catch'\n     || lk == 47647                 // '$' 'child'\n     || lk == 47648                 // '%' 'child'\n     || lk == 47892                 // '{' 'child'\n     || lk == 48159                 // '$' 'collation'\n     || lk == 48160                 // '%' 'collation'\n     || lk == 48404                 // '{' 'collation'\n     || lk == 49183                 // '$' 'comment'\n     || lk == 49184                 // '%' 'comment'\n     || lk == 49428                 // '{' 'comment'\n     || lk == 49695                 // '$' 'constraint'\n     || lk == 49696                 // '%' 'constraint'\n     || lk == 49940                 // '{' 'constraint'\n     || lk == 50207                 // '$' 'construction'\n     || lk == 50208                 // '%' 'construction'\n     || lk == 50452                 // '{' 'construction'\n     || lk == 51743                 // '$' 'context'\n     || lk == 51744                 // '%' 'context'\n     || lk == 51988                 // '{' 'context'\n     || lk == 52255                 // '$' 'continue'\n     || lk == 52256                 // '%' 'continue'\n     || lk == 52500                 // '{' 'continue'\n     || lk == 52767                 // '$' 'copy'\n     || lk == 52768                 // '%' 'copy'\n     || lk == 53012                 // '{' 'copy'\n     || lk == 53279                 // '$' 'copy-namespaces'\n     || lk == 53280                 // '%' 'copy-namespaces'\n     || lk == 53524                 // '{' 'copy-namespaces'\n     || lk == 53791                 // '$' 'count'\n     || lk == 53792                 // '%' 'count'\n     || lk == 54036                 // '{' 'count'\n     || lk == 54303                 // '$' 'decimal-format'\n     || lk == 54304                 // '%' 'decimal-format'\n     || lk == 54548                 // '{' 'decimal-format'\n     || lk == 55327                 // '$' 'declare'\n     || lk == 55328                 // '%' 'declare'\n     || lk == 55572                 // '{' 'declare'\n     || lk == 55839                 // '$' 'default'\n     || lk == 55840                 // '%' 'default'\n     || lk == 56084                 // '{' 'default'\n     || lk == 56351                 // '$' 'delete'\n     || lk == 56352                 // '%' 'delete'\n     || lk == 56596                 // '{' 'delete'\n     || lk == 56863                 // '$' 'descendant'\n     || lk == 56864                 // '%' 'descendant'\n     || lk == 57108                 // '{' 'descendant'\n     || lk == 57375                 // '$' 'descendant-or-self'\n     || lk == 57376                 // '%' 'descendant-or-self'\n     || lk == 57620                 // '{' 'descendant-or-self'\n     || lk == 57887                 // '$' 'descending'\n     || lk == 57888                 // '%' 'descending'\n     || lk == 58132                 // '{' 'descending'\n     || lk == 60447                 // '$' 'div'\n     || lk == 60448                 // '%' 'div'\n     || lk == 60692                 // '{' 'div'\n     || lk == 60959                 // '$' 'document'\n     || lk == 60960                 // '%' 'document'\n     || lk == 61204                 // '{' 'document'\n     || lk == 61471                 // '$' 'document-node'\n     || lk == 61472                 // '%' 'document-node'\n     || lk == 61716                 // '{' 'document-node'\n     || lk == 61983                 // '$' 'element'\n     || lk == 61984                 // '%' 'element'\n     || lk == 62228                 // '{' 'element'\n     || lk == 62495                 // '$' 'else'\n     || lk == 62496                 // '%' 'else'\n     || lk == 62740                 // '{' 'else'\n     || lk == 63007                 // '$' 'empty'\n     || lk == 63008                 // '%' 'empty'\n     || lk == 63252                 // '{' 'empty'\n     || lk == 63519                 // '$' 'empty-sequence'\n     || lk == 63520                 // '%' 'empty-sequence'\n     || lk == 63764                 // '{' 'empty-sequence'\n     || lk == 64031                 // '$' 'encoding'\n     || lk == 64032                 // '%' 'encoding'\n     || lk == 64276                 // '{' 'encoding'\n     || lk == 64543                 // '$' 'end'\n     || lk == 64544                 // '%' 'end'\n     || lk == 64788                 // '{' 'end'\n     || lk == 65567                 // '$' 'eq'\n     || lk == 65568                 // '%' 'eq'\n     || lk == 65812                 // '{' 'eq'\n     || lk == 66079                 // '$' 'every'\n     || lk == 66080                 // '%' 'every'\n     || lk == 66324                 // '{' 'every'\n     || lk == 67103                 // '$' 'except'\n     || lk == 67104                 // '%' 'except'\n     || lk == 67348                 // '{' 'except'\n     || lk == 67615                 // '$' 'exit'\n     || lk == 67616                 // '%' 'exit'\n     || lk == 67860                 // '{' 'exit'\n     || lk == 68127                 // '$' 'external'\n     || lk == 68128                 // '%' 'external'\n     || lk == 68372                 // '{' 'external'\n     || lk == 68639                 // '$' 'first'\n     || lk == 68640                 // '%' 'first'\n     || lk == 68884                 // '{' 'first'\n     || lk == 69151                 // '$' 'following'\n     || lk == 69152                 // '%' 'following'\n     || lk == 69396                 // '{' 'following'\n     || lk == 69663                 // '$' 'following-sibling'\n     || lk == 69664                 // '%' 'following-sibling'\n     || lk == 69908                 // '{' 'following-sibling'\n     || lk == 70175                 // '$' 'for'\n     || lk == 70176                 // '%' 'for'\n     || lk == 70420                 // '{' 'for'\n     || lk == 72223                 // '$' 'ft-option'\n     || lk == 72224                 // '%' 'ft-option'\n     || lk == 72468                 // '{' 'ft-option'\n     || lk == 74271                 // '$' 'function'\n     || lk == 74272                 // '%' 'function'\n     || lk == 74516                 // '{' 'function'\n     || lk == 74783                 // '$' 'ge'\n     || lk == 74784                 // '%' 'ge'\n     || lk == 75028                 // '{' 'ge'\n     || lk == 75807                 // '$' 'group'\n     || lk == 75808                 // '%' 'group'\n     || lk == 76052                 // '{' 'group'\n     || lk == 76831                 // '$' 'gt'\n     || lk == 76832                 // '%' 'gt'\n     || lk == 77076                 // '{' 'gt'\n     || lk == 77343                 // '$' 'idiv'\n     || lk == 77344                 // '%' 'idiv'\n     || lk == 77588                 // '{' 'idiv'\n     || lk == 77855                 // '$' 'if'\n     || lk == 77856                 // '%' 'if'\n     || lk == 78100                 // '{' 'if'\n     || lk == 78367                 // '$' 'import'\n     || lk == 78368                 // '%' 'import'\n     || lk == 78612                 // '{' 'import'\n     || lk == 78879                 // '$' 'in'\n     || lk == 78880                 // '%' 'in'\n     || lk == 79124                 // '{' 'in'\n     || lk == 79391                 // '$' 'index'\n     || lk == 79392                 // '%' 'index'\n     || lk == 79636                 // '{' 'index'\n     || lk == 81439                 // '$' 'insert'\n     || lk == 81440                 // '%' 'insert'\n     || lk == 81684                 // '{' 'insert'\n     || lk == 81951                 // '$' 'instance'\n     || lk == 81952                 // '%' 'instance'\n     || lk == 82196                 // '{' 'instance'\n     || lk == 82463                 // '$' 'integrity'\n     || lk == 82464                 // '%' 'integrity'\n     || lk == 82708                 // '{' 'integrity'\n     || lk == 82975                 // '$' 'intersect'\n     || lk == 82976                 // '%' 'intersect'\n     || lk == 83220                 // '{' 'intersect'\n     || lk == 83487                 // '$' 'into'\n     || lk == 83488                 // '%' 'into'\n     || lk == 83732                 // '{' 'into'\n     || lk == 83999                 // '$' 'is'\n     || lk == 84000                 // '%' 'is'\n     || lk == 84244                 // '{' 'is'\n     || lk == 84511                 // '$' 'item'\n     || lk == 84512                 // '%' 'item'\n     || lk == 84756                 // '{' 'item'\n     || lk == 85023                 // '$' 'json'\n     || lk == 85024                 // '%' 'json'\n     || lk == 85268                 // '{' 'json'\n     || lk == 85535                 // '$' 'json-item'\n     || lk == 85536                 // '%' 'json-item'\n     || lk == 85780                 // '{' 'json-item'\n     || lk == 87071                 // '$' 'last'\n     || lk == 87072                 // '%' 'last'\n     || lk == 87316                 // '{' 'last'\n     || lk == 87583                 // '$' 'lax'\n     || lk == 87584                 // '%' 'lax'\n     || lk == 87828                 // '{' 'lax'\n     || lk == 88095                 // '$' 'le'\n     || lk == 88096                 // '%' 'le'\n     || lk == 88340                 // '{' 'le'\n     || lk == 89119                 // '$' 'let'\n     || lk == 89120                 // '%' 'let'\n     || lk == 89364                 // '{' 'let'\n     || lk == 90143                 // '$' 'loop'\n     || lk == 90144                 // '%' 'loop'\n     || lk == 90388                 // '{' 'loop'\n     || lk == 91167                 // '$' 'lt'\n     || lk == 91168                 // '%' 'lt'\n     || lk == 91412                 // '{' 'lt'\n     || lk == 92191                 // '$' 'mod'\n     || lk == 92192                 // '%' 'mod'\n     || lk == 92436                 // '{' 'mod'\n     || lk == 92703                 // '$' 'modify'\n     || lk == 92704                 // '%' 'modify'\n     || lk == 92948                 // '{' 'modify'\n     || lk == 93215                 // '$' 'module'\n     || lk == 93216                 // '%' 'module'\n     || lk == 93460                 // '{' 'module'\n     || lk == 94239                 // '$' 'namespace'\n     || lk == 94240                 // '%' 'namespace'\n     || lk == 94484                 // '{' 'namespace'\n     || lk == 94751                 // '$' 'namespace-node'\n     || lk == 94752                 // '%' 'namespace-node'\n     || lk == 94996                 // '{' 'namespace-node'\n     || lk == 95263                 // '$' 'ne'\n     || lk == 95264                 // '%' 'ne'\n     || lk == 95508                 // '{' 'ne'\n     || lk == 97823                 // '$' 'node'\n     || lk == 97824                 // '%' 'node'\n     || lk == 98068                 // '{' 'node'\n     || lk == 98335                 // '$' 'nodes'\n     || lk == 98336                 // '%' 'nodes'\n     || lk == 98580                 // '{' 'nodes'\n     || lk == 99359                 // '$' 'object'\n     || lk == 99360                 // '%' 'object'\n     || lk == 99604                 // '{' 'object'\n     || lk == 101407                // '$' 'only'\n     || lk == 101408                // '%' 'only'\n     || lk == 101652                // '{' 'only'\n     || lk == 101919                // '$' 'option'\n     || lk == 101920                // '%' 'option'\n     || lk == 102164                // '{' 'option'\n     || lk == 102431                // '$' 'or'\n     || lk == 102432                // '%' 'or'\n     || lk == 102676                // '{' 'or'\n     || lk == 102943                // '$' 'order'\n     || lk == 102944                // '%' 'order'\n     || lk == 103188                // '{' 'order'\n     || lk == 103455                // '$' 'ordered'\n     || lk == 103456                // '%' 'ordered'\n     || lk == 103700                // '{' 'ordered'\n     || lk == 103967                // '$' 'ordering'\n     || lk == 103968                // '%' 'ordering'\n     || lk == 104212                // '{' 'ordering'\n     || lk == 105503                // '$' 'parent'\n     || lk == 105504                // '%' 'parent'\n     || lk == 105748                // '{' 'parent'\n     || lk == 108575                // '$' 'preceding'\n     || lk == 108576                // '%' 'preceding'\n     || lk == 108820                // '{' 'preceding'\n     || lk == 109087                // '$' 'preceding-sibling'\n     || lk == 109088                // '%' 'preceding-sibling'\n     || lk == 109332                // '{' 'preceding-sibling'\n     || lk == 110623                // '$' 'processing-instruction'\n     || lk == 110624                // '%' 'processing-instruction'\n     || lk == 110868                // '{' 'processing-instruction'\n     || lk == 111647                // '$' 'rename'\n     || lk == 111648                // '%' 'rename'\n     || lk == 111892                // '{' 'rename'\n     || lk == 112159                // '$' 'replace'\n     || lk == 112160                // '%' 'replace'\n     || lk == 112404                // '{' 'replace'\n     || lk == 112671                // '$' 'return'\n     || lk == 112672                // '%' 'return'\n     || lk == 112916                // '{' 'return'\n     || lk == 113183                // '$' 'returning'\n     || lk == 113184                // '%' 'returning'\n     || lk == 113428                // '{' 'returning'\n     || lk == 113695                // '$' 'revalidation'\n     || lk == 113696                // '%' 'revalidation'\n     || lk == 113940                // '{' 'revalidation'\n     || lk == 114719                // '$' 'satisfies'\n     || lk == 114720                // '%' 'satisfies'\n     || lk == 114964                // '{' 'satisfies'\n     || lk == 115231                // '$' 'schema'\n     || lk == 115232                // '%' 'schema'\n     || lk == 115476                // '{' 'schema'\n     || lk == 115743                // '$' 'schema-attribute'\n     || lk == 115744                // '%' 'schema-attribute'\n     || lk == 115988                // '{' 'schema-attribute'\n     || lk == 116255                // '$' 'schema-element'\n     || lk == 116256                // '%' 'schema-element'\n     || lk == 116500                // '{' 'schema-element'\n     || lk == 116767                // '$' 'score'\n     || lk == 116768                // '%' 'score'\n     || lk == 117012                // '{' 'score'\n     || lk == 117279                // '$' 'self'\n     || lk == 117280                // '%' 'self'\n     || lk == 117524                // '{' 'self'\n     || lk == 119839                // '$' 'sliding'\n     || lk == 119840                // '%' 'sliding'\n     || lk == 120084                // '{' 'sliding'\n     || lk == 120351                // '$' 'some'\n     || lk == 120352                // '%' 'some'\n     || lk == 120596                // '{' 'some'\n     || lk == 120863                // '$' 'stable'\n     || lk == 120864                // '%' 'stable'\n     || lk == 121108                // '{' 'stable'\n     || lk == 121375                // '$' 'start'\n     || lk == 121376                // '%' 'start'\n     || lk == 121620                // '{' 'start'\n     || lk == 122911                // '$' 'strict'\n     || lk == 122912                // '%' 'strict'\n     || lk == 123156                // '{' 'strict'\n     || lk == 123935                // '$' 'structured-item'\n     || lk == 123936                // '%' 'structured-item'\n     || lk == 124180                // '{' 'structured-item'\n     || lk == 124447                // '$' 'switch'\n     || lk == 124448                // '%' 'switch'\n     || lk == 124692                // '{' 'switch'\n     || lk == 124959                // '$' 'text'\n     || lk == 124960                // '%' 'text'\n     || lk == 125204                // '{' 'text'\n     || lk == 127007                // '$' 'to'\n     || lk == 127008                // '%' 'to'\n     || lk == 127252                // '{' 'to'\n     || lk == 127519                // '$' 'treat'\n     || lk == 127520                // '%' 'treat'\n     || lk == 127764                // '{' 'treat'\n     || lk == 128031                // '$' 'try'\n     || lk == 128032                // '%' 'try'\n     || lk == 128276                // '{' 'try'\n     || lk == 128543                // '$' 'tumbling'\n     || lk == 128544                // '%' 'tumbling'\n     || lk == 128788                // '{' 'tumbling'\n     || lk == 129055                // '$' 'type'\n     || lk == 129056                // '%' 'type'\n     || lk == 129300                // '{' 'type'\n     || lk == 129567                // '$' 'typeswitch'\n     || lk == 129568                // '%' 'typeswitch'\n     || lk == 129812                // '{' 'typeswitch'\n     || lk == 130079                // '$' 'union'\n     || lk == 130080                // '%' 'union'\n     || lk == 130324                // '{' 'union'\n     || lk == 131103                // '$' 'unordered'\n     || lk == 131104                // '%' 'unordered'\n     || lk == 131348                // '{' 'unordered'\n     || lk == 131615                // '$' 'updating'\n     || lk == 131616                // '%' 'updating'\n     || lk == 131860                // '{' 'updating'\n     || lk == 133151                // '$' 'validate'\n     || lk == 133152                // '%' 'validate'\n     || lk == 133396                // '{' 'validate'\n     || lk == 133663                // '$' 'value'\n     || lk == 133664                // '%' 'value'\n     || lk == 133908                // '{' 'value'\n     || lk == 134175                // '$' 'variable'\n     || lk == 134176                // '%' 'variable'\n     || lk == 134420                // '{' 'variable'\n     || lk == 134687                // '$' 'version'\n     || lk == 134688                // '%' 'version'\n     || lk == 134932                // '{' 'version'\n     || lk == 136223                // '$' 'where'\n     || lk == 136224                // '%' 'where'\n     || lk == 136468                // '{' 'where'\n     || lk == 136735                // '$' 'while'\n     || lk == 136736                // '%' 'while'\n     || lk == 136980                // '{' 'while'\n     || lk == 138271                // '$' 'with'\n     || lk == 138272                // '%' 'with'\n     || lk == 138516                // '{' 'with'\n     || lk == 140319                // '$' 'xquery'\n     || lk == 140320                // '%' 'xquery'\n     || lk == 140564                // '{' 'xquery'\n     || lk == 141588                // '{' '{'\n     || lk == 142612                // '{' '{|'\n     || lk == 144660)               // '{' '}'\n    {\n      lk = memoized(7, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_ApplyStatement();\n          memoize(7, e0A, -1);\n          lk = -15;\n        }\n        catch (p1A)\n        {\n          try\n          {\n            b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n            b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n            b2 = b2A; e2 = e2A; end = e2A; }}\n            try_AssignStatement();\n            memoize(7, e0A, -2);\n            lk = -15;\n          }\n          catch (p2A)\n          {\n            try\n            {\n              b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n              b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n              b2 = b2A; e2 = e2A; end = e2A; }}\n              try_BlockStatement();\n              memoize(7, e0A, -3);\n              lk = -15;\n            }\n            catch (p3A)\n            {\n              try\n              {\n                b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n                b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n                b2 = b2A; e2 = e2A; end = e2A; }}\n                try_VarDeclStatement();\n                memoize(7, e0A, -12);\n                lk = -15;\n              }\n              catch (p12A)\n              {\n                lk = -13;\n                b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n                b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n                b2 = b2A; e2 = e2A; end = e2A; }}\n                memoize(7, e0A, -13);\n              }\n            }\n          }\n        }\n      }\n    }\n    switch (lk)\n    {\n    case -2:\n      try_AssignStatement();\n      break;\n    case -3:\n      try_BlockStatement();\n      break;\n    case 90198:                     // 'break' 'loop'\n      try_BreakStatement();\n      break;\n    case 90214:                     // 'continue' 'loop'\n      try_ContinueStatement();\n      break;\n    case 113284:                    // 'exit' 'returning'\n      try_ExitStatement();\n      break;\n    case 16009:                     // 'for' '$'\n    case 16046:                     // 'let' '$'\n    case 116910:                    // 'let' 'score'\n    case 119945:                    // 'for' 'sliding'\n    case 128649:                    // 'for' 'tumbling'\n      try_FLWORStatement();\n      break;\n    case 17560:                     // 'if' '('\n      try_IfStatement();\n      break;\n    case 17651:                     // 'switch' '('\n      try_SwitchStatement();\n      break;\n    case 141562:                    // 'try' '{'\n      try_TryCatchStatement();\n      break;\n    case 17661:                     // 'typeswitch' '('\n      try_TypeswitchStatement();\n      break;\n    case -12:\n    case 16134:                     // 'variable' '$'\n      try_VarDeclStatement();\n      break;\n    case -13:\n      try_WhileStatement();\n      break;\n    case 53:                        // ';'\n      try_VoidStatement();\n      break;\n    case -15:\n      break;\n    default:\n      try_ApplyStatement();\n    }\n  }\n\n  function parse_ApplyStatement()\n  {\n    eventHandler.startNonterminal(\"ApplyStatement\", e0);\n    parse_ExprSimple();\n    shift(53);                      // ';'\n    eventHandler.endNonterminal(\"ApplyStatement\", e0);\n  }\n\n  function try_ApplyStatement()\n  {\n    try_ExprSimple();\n    shiftT(53);                     // ';'\n  }\n\n  function parse_AssignStatement()\n  {\n    eventHandler.startNonterminal(\"AssignStatement\", e0);\n    shift(31);                      // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    lookahead1W(27);                // S^WS | '(:' | ':='\n    shift(52);                      // ':='\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    shift(53);                      // ';'\n    eventHandler.endNonterminal(\"AssignStatement\", e0);\n  }\n\n  function try_AssignStatement()\n  {\n    shiftT(31);                     // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n    lookahead1W(27);                // S^WS | '(:' | ':='\n    shiftT(52);                     // ':='\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n    shiftT(53);                     // ';'\n  }\n\n  function parse_BlockStatement()\n  {\n    eventHandler.startNonterminal(\"BlockStatement\", e0);\n    shift(276);                     // '{'\n    lookahead1W(277);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Statements();\n    shift(282);                     // '}'\n    eventHandler.endNonterminal(\"BlockStatement\", e0);\n  }\n\n  function try_BlockStatement()\n  {\n    shiftT(276);                    // '{'\n    lookahead1W(277);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Statements();\n    shiftT(282);                    // '}'\n  }\n\n  function parse_BreakStatement()\n  {\n    eventHandler.startNonterminal(\"BreakStatement\", e0);\n    shift(86);                      // 'break'\n    lookahead1W(59);                // S^WS | '(:' | 'loop'\n    shift(176);                     // 'loop'\n    lookahead1W(28);                // S^WS | '(:' | ';'\n    shift(53);                      // ';'\n    eventHandler.endNonterminal(\"BreakStatement\", e0);\n  }\n\n  function try_BreakStatement()\n  {\n    shiftT(86);                     // 'break'\n    lookahead1W(59);                // S^WS | '(:' | 'loop'\n    shiftT(176);                    // 'loop'\n    lookahead1W(28);                // S^WS | '(:' | ';'\n    shiftT(53);                     // ';'\n  }\n\n  function parse_ContinueStatement()\n  {\n    eventHandler.startNonterminal(\"ContinueStatement\", e0);\n    shift(102);                     // 'continue'\n    lookahead1W(59);                // S^WS | '(:' | 'loop'\n    shift(176);                     // 'loop'\n    lookahead1W(28);                // S^WS | '(:' | ';'\n    shift(53);                      // ';'\n    eventHandler.endNonterminal(\"ContinueStatement\", e0);\n  }\n\n  function try_ContinueStatement()\n  {\n    shiftT(102);                    // 'continue'\n    lookahead1W(59);                // S^WS | '(:' | 'loop'\n    shiftT(176);                    // 'loop'\n    lookahead1W(28);                // S^WS | '(:' | ';'\n    shiftT(53);                     // ';'\n  }\n\n  function parse_ExitStatement()\n  {\n    eventHandler.startNonterminal(\"ExitStatement\", e0);\n    shift(132);                     // 'exit'\n    lookahead1W(71);                // S^WS | '(:' | 'returning'\n    shift(221);                     // 'returning'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    shift(53);                      // ';'\n    eventHandler.endNonterminal(\"ExitStatement\", e0);\n  }\n\n  function try_ExitStatement()\n  {\n    shiftT(132);                    // 'exit'\n    lookahead1W(71);                // S^WS | '(:' | 'returning'\n    shiftT(221);                    // 'returning'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n    shiftT(53);                     // ';'\n  }\n\n  function parse_FLWORStatement()\n  {\n    eventHandler.startNonterminal(\"FLWORStatement\", e0);\n    parse_InitialClause();\n    for (;;)\n    {\n      lookahead1W(173);             // S^WS | '(:' | 'count' | 'for' | 'group' | 'let' | 'order' | 'return' | 'stable' |\n      if (l1 == 220)                // 'return'\n      {\n        break;\n      }\n      whitespace();\n      parse_IntermediateClause();\n    }\n    whitespace();\n    parse_ReturnStatement();\n    eventHandler.endNonterminal(\"FLWORStatement\", e0);\n  }\n\n  function try_FLWORStatement()\n  {\n    try_InitialClause();\n    for (;;)\n    {\n      lookahead1W(173);             // S^WS | '(:' | 'count' | 'for' | 'group' | 'let' | 'order' | 'return' | 'stable' |\n      if (l1 == 220)                // 'return'\n      {\n        break;\n      }\n      try_IntermediateClause();\n    }\n    try_ReturnStatement();\n  }\n\n  function parse_ReturnStatement()\n  {\n    eventHandler.startNonterminal(\"ReturnStatement\", e0);\n    shift(220);                     // 'return'\n    lookahead1W(270);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Statement();\n    eventHandler.endNonterminal(\"ReturnStatement\", e0);\n  }\n\n  function try_ReturnStatement()\n  {\n    shiftT(220);                    // 'return'\n    lookahead1W(270);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Statement();\n  }\n\n  function parse_IfStatement()\n  {\n    eventHandler.startNonterminal(\"IfStatement\", e0);\n    shift(152);                     // 'if'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Expr();\n    shift(37);                      // ')'\n    lookahead1W(77);                // S^WS | '(:' | 'then'\n    shift(245);                     // 'then'\n    lookahead1W(270);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Statement();\n    lookahead1W(48);                // S^WS | '(:' | 'else'\n    shift(122);                     // 'else'\n    lookahead1W(270);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Statement();\n    eventHandler.endNonterminal(\"IfStatement\", e0);\n  }\n\n  function try_IfStatement()\n  {\n    shiftT(152);                    // 'if'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Expr();\n    shiftT(37);                     // ')'\n    lookahead1W(77);                // S^WS | '(:' | 'then'\n    shiftT(245);                    // 'then'\n    lookahead1W(270);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Statement();\n    lookahead1W(48);                // S^WS | '(:' | 'else'\n    shiftT(122);                    // 'else'\n    lookahead1W(270);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Statement();\n  }\n\n  function parse_SwitchStatement()\n  {\n    eventHandler.startNonterminal(\"SwitchStatement\", e0);\n    shift(243);                     // 'switch'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Expr();\n    shift(37);                      // ')'\n    for (;;)\n    {\n      lookahead1W(35);              // S^WS | '(:' | 'case'\n      whitespace();\n      parse_SwitchCaseStatement();\n      lookahead1W(113);             // S^WS | '(:' | 'case' | 'default'\n      if (l1 != 88)                 // 'case'\n      {\n        break;\n      }\n    }\n    shift(109);                     // 'default'\n    lookahead1W(70);                // S^WS | '(:' | 'return'\n    shift(220);                     // 'return'\n    lookahead1W(270);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Statement();\n    eventHandler.endNonterminal(\"SwitchStatement\", e0);\n  }\n\n  function try_SwitchStatement()\n  {\n    shiftT(243);                    // 'switch'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Expr();\n    shiftT(37);                     // ')'\n    for (;;)\n    {\n      lookahead1W(35);              // S^WS | '(:' | 'case'\n      try_SwitchCaseStatement();\n      lookahead1W(113);             // S^WS | '(:' | 'case' | 'default'\n      if (l1 != 88)                 // 'case'\n      {\n        break;\n      }\n    }\n    shiftT(109);                    // 'default'\n    lookahead1W(70);                // S^WS | '(:' | 'return'\n    shiftT(220);                    // 'return'\n    lookahead1W(270);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Statement();\n  }\n\n  function parse_SwitchCaseStatement()\n  {\n    eventHandler.startNonterminal(\"SwitchCaseStatement\", e0);\n    for (;;)\n    {\n      shift(88);                    // 'case'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_SwitchCaseOperand();\n      if (l1 != 88)                 // 'case'\n      {\n        break;\n      }\n    }\n    shift(220);                     // 'return'\n    lookahead1W(270);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Statement();\n    eventHandler.endNonterminal(\"SwitchCaseStatement\", e0);\n  }\n\n  function try_SwitchCaseStatement()\n  {\n    for (;;)\n    {\n      shiftT(88);                   // 'case'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_SwitchCaseOperand();\n      if (l1 != 88)                 // 'case'\n      {\n        break;\n      }\n    }\n    shiftT(220);                    // 'return'\n    lookahead1W(270);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Statement();\n  }\n\n  function parse_TryCatchStatement()\n  {\n    eventHandler.startNonterminal(\"TryCatchStatement\", e0);\n    shift(250);                     // 'try'\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    whitespace();\n    parse_BlockStatement();\n    for (;;)\n    {\n      lookahead1W(36);              // S^WS | '(:' | 'catch'\n      shift(91);                    // 'catch'\n      lookahead1W(257);             // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_CatchErrorList();\n      whitespace();\n      parse_BlockStatement();\n      lookahead1W(278);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      switch (l1)\n      {\n      case 91:                      // 'catch'\n        lookahead2W(279);           // Wildcard | EQName^Token | S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' |\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk == 38491               // 'catch' 'and'\n       || lk == 45659               // 'catch' 'cast'\n       || lk == 46171               // 'catch' 'castable'\n       || lk == 60507               // 'catch' 'div'\n       || lk == 65627               // 'catch' 'eq'\n       || lk == 67163               // 'catch' 'except'\n       || lk == 74843               // 'catch' 'ge'\n       || lk == 76891               // 'catch' 'gt'\n       || lk == 77403               // 'catch' 'idiv'\n       || lk == 82011               // 'catch' 'instance'\n       || lk == 83035               // 'catch' 'intersect'\n       || lk == 84059               // 'catch' 'is'\n       || lk == 88155               // 'catch' 'le'\n       || lk == 91227               // 'catch' 'lt'\n       || lk == 92251               // 'catch' 'mod'\n       || lk == 95323               // 'catch' 'ne'\n       || lk == 102491              // 'catch' 'or'\n       || lk == 127067              // 'catch' 'to'\n       || lk == 127579              // 'catch' 'treat'\n       || lk == 130139)             // 'catch' 'union'\n      {\n        lk = memoized(8, e0);\n        if (lk == 0)\n        {\n          var b0A = b0; var e0A = e0; var l1A = l1;\n          var b1A = b1; var e1A = e1; var l2A = l2;\n          var b2A = b2; var e2A = e2;\n          try\n          {\n            lookahead1W(36);        // S^WS | '(:' | 'catch'\n            shiftT(91);             // 'catch'\n            lookahead1W(257);       // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n            try_CatchErrorList();\n            try_BlockStatement();\n            lk = -1;\n          }\n          catch (p1A)\n          {\n            lk = -2;\n          }\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(8, e0, lk);\n        }\n      }\n      if (lk != -1\n       && lk != 2651                // 'catch' Wildcard\n       && lk != 3163                // 'catch' EQName^Token\n       && lk != 35931               // 'catch' 'after'\n       && lk != 36955               // 'catch' 'allowing'\n       && lk != 37467               // 'catch' 'ancestor'\n       && lk != 37979               // 'catch' 'ancestor-or-self'\n       && lk != 39515               // 'catch' 'append'\n       && lk != 40027               // 'catch' 'array'\n       && lk != 40539               // 'catch' 'as'\n       && lk != 41051               // 'catch' 'ascending'\n       && lk != 41563               // 'catch' 'at'\n       && lk != 42075               // 'catch' 'attribute'\n       && lk != 42587               // 'catch' 'base-uri'\n       && lk != 43099               // 'catch' 'before'\n       && lk != 43611               // 'catch' 'boundary-space'\n       && lk != 44123               // 'catch' 'break'\n       && lk != 45147               // 'catch' 'case'\n       && lk != 46683               // 'catch' 'catch'\n       && lk != 47707               // 'catch' 'child'\n       && lk != 48219               // 'catch' 'collation'\n       && lk != 49243               // 'catch' 'comment'\n       && lk != 49755               // 'catch' 'constraint'\n       && lk != 50267               // 'catch' 'construction'\n       && lk != 51803               // 'catch' 'context'\n       && lk != 52315               // 'catch' 'continue'\n       && lk != 52827               // 'catch' 'copy'\n       && lk != 53339               // 'catch' 'copy-namespaces'\n       && lk != 53851               // 'catch' 'count'\n       && lk != 54363               // 'catch' 'decimal-format'\n       && lk != 55387               // 'catch' 'declare'\n       && lk != 55899               // 'catch' 'default'\n       && lk != 56411               // 'catch' 'delete'\n       && lk != 56923               // 'catch' 'descendant'\n       && lk != 57435               // 'catch' 'descendant-or-self'\n       && lk != 57947               // 'catch' 'descending'\n       && lk != 61019               // 'catch' 'document'\n       && lk != 61531               // 'catch' 'document-node'\n       && lk != 62043               // 'catch' 'element'\n       && lk != 62555               // 'catch' 'else'\n       && lk != 63067               // 'catch' 'empty'\n       && lk != 63579               // 'catch' 'empty-sequence'\n       && lk != 64091               // 'catch' 'encoding'\n       && lk != 64603               // 'catch' 'end'\n       && lk != 66139               // 'catch' 'every'\n       && lk != 67675               // 'catch' 'exit'\n       && lk != 68187               // 'catch' 'external'\n       && lk != 68699               // 'catch' 'first'\n       && lk != 69211               // 'catch' 'following'\n       && lk != 69723               // 'catch' 'following-sibling'\n       && lk != 70235               // 'catch' 'for'\n       && lk != 72283               // 'catch' 'ft-option'\n       && lk != 74331               // 'catch' 'function'\n       && lk != 75867               // 'catch' 'group'\n       && lk != 77915               // 'catch' 'if'\n       && lk != 78427               // 'catch' 'import'\n       && lk != 78939               // 'catch' 'in'\n       && lk != 79451               // 'catch' 'index'\n       && lk != 81499               // 'catch' 'insert'\n       && lk != 82523               // 'catch' 'integrity'\n       && lk != 83547               // 'catch' 'into'\n       && lk != 84571               // 'catch' 'item'\n       && lk != 85083               // 'catch' 'json'\n       && lk != 85595               // 'catch' 'json-item'\n       && lk != 87131               // 'catch' 'last'\n       && lk != 87643               // 'catch' 'lax'\n       && lk != 89179               // 'catch' 'let'\n       && lk != 90203               // 'catch' 'loop'\n       && lk != 92763               // 'catch' 'modify'\n       && lk != 93275               // 'catch' 'module'\n       && lk != 94299               // 'catch' 'namespace'\n       && lk != 94811               // 'catch' 'namespace-node'\n       && lk != 97883               // 'catch' 'node'\n       && lk != 98395               // 'catch' 'nodes'\n       && lk != 99419               // 'catch' 'object'\n       && lk != 101467              // 'catch' 'only'\n       && lk != 101979              // 'catch' 'option'\n       && lk != 103003              // 'catch' 'order'\n       && lk != 103515              // 'catch' 'ordered'\n       && lk != 104027              // 'catch' 'ordering'\n       && lk != 105563              // 'catch' 'parent'\n       && lk != 108635              // 'catch' 'preceding'\n       && lk != 109147              // 'catch' 'preceding-sibling'\n       && lk != 110683              // 'catch' 'processing-instruction'\n       && lk != 111707              // 'catch' 'rename'\n       && lk != 112219              // 'catch' 'replace'\n       && lk != 112731              // 'catch' 'return'\n       && lk != 113243              // 'catch' 'returning'\n       && lk != 113755              // 'catch' 'revalidation'\n       && lk != 114779              // 'catch' 'satisfies'\n       && lk != 115291              // 'catch' 'schema'\n       && lk != 115803              // 'catch' 'schema-attribute'\n       && lk != 116315              // 'catch' 'schema-element'\n       && lk != 116827              // 'catch' 'score'\n       && lk != 117339              // 'catch' 'self'\n       && lk != 119899              // 'catch' 'sliding'\n       && lk != 120411              // 'catch' 'some'\n       && lk != 120923              // 'catch' 'stable'\n       && lk != 121435              // 'catch' 'start'\n       && lk != 122971              // 'catch' 'strict'\n       && lk != 123995              // 'catch' 'structured-item'\n       && lk != 124507              // 'catch' 'switch'\n       && lk != 125019              // 'catch' 'text'\n       && lk != 128091              // 'catch' 'try'\n       && lk != 128603              // 'catch' 'tumbling'\n       && lk != 129115              // 'catch' 'type'\n       && lk != 129627              // 'catch' 'typeswitch'\n       && lk != 131163              // 'catch' 'unordered'\n       && lk != 131675              // 'catch' 'updating'\n       && lk != 133211              // 'catch' 'validate'\n       && lk != 133723              // 'catch' 'value'\n       && lk != 134235              // 'catch' 'variable'\n       && lk != 134747              // 'catch' 'version'\n       && lk != 136283              // 'catch' 'where'\n       && lk != 136795              // 'catch' 'while'\n       && lk != 138331              // 'catch' 'with'\n       && lk != 140379)             // 'catch' 'xquery'\n      {\n        break;\n      }\n    }\n    eventHandler.endNonterminal(\"TryCatchStatement\", e0);\n  }\n\n  function try_TryCatchStatement()\n  {\n    shiftT(250);                    // 'try'\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    try_BlockStatement();\n    lookahead1W(36);                // S^WS | '(:' | 'catch'\n    shiftT(91);                     // 'catch'\n    lookahead1W(257);               // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_CatchErrorList();\n    try_BlockStatement();\n    for (;;)\n    {\n      lookahead1W(278);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      switch (l1)\n      {\n      case 91:                      // 'catch'\n        lookahead2W(279);           // Wildcard | EQName^Token | S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | '*' |\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk == 38491               // 'catch' 'and'\n       || lk == 45659               // 'catch' 'cast'\n       || lk == 46171               // 'catch' 'castable'\n       || lk == 60507               // 'catch' 'div'\n       || lk == 65627               // 'catch' 'eq'\n       || lk == 67163               // 'catch' 'except'\n       || lk == 74843               // 'catch' 'ge'\n       || lk == 76891               // 'catch' 'gt'\n       || lk == 77403               // 'catch' 'idiv'\n       || lk == 82011               // 'catch' 'instance'\n       || lk == 83035               // 'catch' 'intersect'\n       || lk == 84059               // 'catch' 'is'\n       || lk == 88155               // 'catch' 'le'\n       || lk == 91227               // 'catch' 'lt'\n       || lk == 92251               // 'catch' 'mod'\n       || lk == 95323               // 'catch' 'ne'\n       || lk == 102491              // 'catch' 'or'\n       || lk == 127067              // 'catch' 'to'\n       || lk == 127579              // 'catch' 'treat'\n       || lk == 130139)             // 'catch' 'union'\n      {\n        lk = memoized(8, e0);\n        if (lk == 0)\n        {\n          var b0A = b0; var e0A = e0; var l1A = l1;\n          var b1A = b1; var e1A = e1; var l2A = l2;\n          var b2A = b2; var e2A = e2;\n          try\n          {\n            lookahead1W(36);        // S^WS | '(:' | 'catch'\n            shiftT(91);             // 'catch'\n            lookahead1W(257);       // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n            try_CatchErrorList();\n            try_BlockStatement();\n            memoize(8, e0A, -1);\n            continue;\n          }\n          catch (p1A)\n          {\n            b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n            b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n            b2 = b2A; e2 = e2A; end = e2A; }}\n            memoize(8, e0A, -2);\n            break;\n          }\n        }\n      }\n      if (lk != -1\n       && lk != 2651                // 'catch' Wildcard\n       && lk != 3163                // 'catch' EQName^Token\n       && lk != 35931               // 'catch' 'after'\n       && lk != 36955               // 'catch' 'allowing'\n       && lk != 37467               // 'catch' 'ancestor'\n       && lk != 37979               // 'catch' 'ancestor-or-self'\n       && lk != 39515               // 'catch' 'append'\n       && lk != 40027               // 'catch' 'array'\n       && lk != 40539               // 'catch' 'as'\n       && lk != 41051               // 'catch' 'ascending'\n       && lk != 41563               // 'catch' 'at'\n       && lk != 42075               // 'catch' 'attribute'\n       && lk != 42587               // 'catch' 'base-uri'\n       && lk != 43099               // 'catch' 'before'\n       && lk != 43611               // 'catch' 'boundary-space'\n       && lk != 44123               // 'catch' 'break'\n       && lk != 45147               // 'catch' 'case'\n       && lk != 46683               // 'catch' 'catch'\n       && lk != 47707               // 'catch' 'child'\n       && lk != 48219               // 'catch' 'collation'\n       && lk != 49243               // 'catch' 'comment'\n       && lk != 49755               // 'catch' 'constraint'\n       && lk != 50267               // 'catch' 'construction'\n       && lk != 51803               // 'catch' 'context'\n       && lk != 52315               // 'catch' 'continue'\n       && lk != 52827               // 'catch' 'copy'\n       && lk != 53339               // 'catch' 'copy-namespaces'\n       && lk != 53851               // 'catch' 'count'\n       && lk != 54363               // 'catch' 'decimal-format'\n       && lk != 55387               // 'catch' 'declare'\n       && lk != 55899               // 'catch' 'default'\n       && lk != 56411               // 'catch' 'delete'\n       && lk != 56923               // 'catch' 'descendant'\n       && lk != 57435               // 'catch' 'descendant-or-self'\n       && lk != 57947               // 'catch' 'descending'\n       && lk != 61019               // 'catch' 'document'\n       && lk != 61531               // 'catch' 'document-node'\n       && lk != 62043               // 'catch' 'element'\n       && lk != 62555               // 'catch' 'else'\n       && lk != 63067               // 'catch' 'empty'\n       && lk != 63579               // 'catch' 'empty-sequence'\n       && lk != 64091               // 'catch' 'encoding'\n       && lk != 64603               // 'catch' 'end'\n       && lk != 66139               // 'catch' 'every'\n       && lk != 67675               // 'catch' 'exit'\n       && lk != 68187               // 'catch' 'external'\n       && lk != 68699               // 'catch' 'first'\n       && lk != 69211               // 'catch' 'following'\n       && lk != 69723               // 'catch' 'following-sibling'\n       && lk != 70235               // 'catch' 'for'\n       && lk != 72283               // 'catch' 'ft-option'\n       && lk != 74331               // 'catch' 'function'\n       && lk != 75867               // 'catch' 'group'\n       && lk != 77915               // 'catch' 'if'\n       && lk != 78427               // 'catch' 'import'\n       && lk != 78939               // 'catch' 'in'\n       && lk != 79451               // 'catch' 'index'\n       && lk != 81499               // 'catch' 'insert'\n       && lk != 82523               // 'catch' 'integrity'\n       && lk != 83547               // 'catch' 'into'\n       && lk != 84571               // 'catch' 'item'\n       && lk != 85083               // 'catch' 'json'\n       && lk != 85595               // 'catch' 'json-item'\n       && lk != 87131               // 'catch' 'last'\n       && lk != 87643               // 'catch' 'lax'\n       && lk != 89179               // 'catch' 'let'\n       && lk != 90203               // 'catch' 'loop'\n       && lk != 92763               // 'catch' 'modify'\n       && lk != 93275               // 'catch' 'module'\n       && lk != 94299               // 'catch' 'namespace'\n       && lk != 94811               // 'catch' 'namespace-node'\n       && lk != 97883               // 'catch' 'node'\n       && lk != 98395               // 'catch' 'nodes'\n       && lk != 99419               // 'catch' 'object'\n       && lk != 101467              // 'catch' 'only'\n       && lk != 101979              // 'catch' 'option'\n       && lk != 103003              // 'catch' 'order'\n       && lk != 103515              // 'catch' 'ordered'\n       && lk != 104027              // 'catch' 'ordering'\n       && lk != 105563              // 'catch' 'parent'\n       && lk != 108635              // 'catch' 'preceding'\n       && lk != 109147              // 'catch' 'preceding-sibling'\n       && lk != 110683              // 'catch' 'processing-instruction'\n       && lk != 111707              // 'catch' 'rename'\n       && lk != 112219              // 'catch' 'replace'\n       && lk != 112731              // 'catch' 'return'\n       && lk != 113243              // 'catch' 'returning'\n       && lk != 113755              // 'catch' 'revalidation'\n       && lk != 114779              // 'catch' 'satisfies'\n       && lk != 115291              // 'catch' 'schema'\n       && lk != 115803              // 'catch' 'schema-attribute'\n       && lk != 116315              // 'catch' 'schema-element'\n       && lk != 116827              // 'catch' 'score'\n       && lk != 117339              // 'catch' 'self'\n       && lk != 119899              // 'catch' 'sliding'\n       && lk != 120411              // 'catch' 'some'\n       && lk != 120923              // 'catch' 'stable'\n       && lk != 121435              // 'catch' 'start'\n       && lk != 122971              // 'catch' 'strict'\n       && lk != 123995              // 'catch' 'structured-item'\n       && lk != 124507              // 'catch' 'switch'\n       && lk != 125019              // 'catch' 'text'\n       && lk != 128091              // 'catch' 'try'\n       && lk != 128603              // 'catch' 'tumbling'\n       && lk != 129115              // 'catch' 'type'\n       && lk != 129627              // 'catch' 'typeswitch'\n       && lk != 131163              // 'catch' 'unordered'\n       && lk != 131675              // 'catch' 'updating'\n       && lk != 133211              // 'catch' 'validate'\n       && lk != 133723              // 'catch' 'value'\n       && lk != 134235              // 'catch' 'variable'\n       && lk != 134747              // 'catch' 'version'\n       && lk != 136283              // 'catch' 'where'\n       && lk != 136795              // 'catch' 'while'\n       && lk != 138331              // 'catch' 'with'\n       && lk != 140379)             // 'catch' 'xquery'\n      {\n        break;\n      }\n      lookahead1W(36);              // S^WS | '(:' | 'catch'\n      shiftT(91);                   // 'catch'\n      lookahead1W(257);             // Wildcard | EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_CatchErrorList();\n      try_BlockStatement();\n    }\n  }\n\n  function parse_TypeswitchStatement()\n  {\n    eventHandler.startNonterminal(\"TypeswitchStatement\", e0);\n    shift(253);                     // 'typeswitch'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Expr();\n    shift(37);                      // ')'\n    for (;;)\n    {\n      lookahead1W(35);              // S^WS | '(:' | 'case'\n      whitespace();\n      parse_CaseStatement();\n      lookahead1W(113);             // S^WS | '(:' | 'case' | 'default'\n      if (l1 != 88)                 // 'case'\n      {\n        break;\n      }\n    }\n    shift(109);                     // 'default'\n    lookahead1W(95);                // S^WS | '$' | '(:' | 'return'\n    if (l1 == 31)                   // '$'\n    {\n      shift(31);                    // '$'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_VarName();\n    }\n    lookahead1W(70);                // S^WS | '(:' | 'return'\n    shift(220);                     // 'return'\n    lookahead1W(270);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Statement();\n    eventHandler.endNonterminal(\"TypeswitchStatement\", e0);\n  }\n\n  function try_TypeswitchStatement()\n  {\n    shiftT(253);                    // 'typeswitch'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Expr();\n    shiftT(37);                     // ')'\n    for (;;)\n    {\n      lookahead1W(35);              // S^WS | '(:' | 'case'\n      try_CaseStatement();\n      lookahead1W(113);             // S^WS | '(:' | 'case' | 'default'\n      if (l1 != 88)                 // 'case'\n      {\n        break;\n      }\n    }\n    shiftT(109);                    // 'default'\n    lookahead1W(95);                // S^WS | '$' | '(:' | 'return'\n    if (l1 == 31)                   // '$'\n    {\n      shiftT(31);                   // '$'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_VarName();\n    }\n    lookahead1W(70);                // S^WS | '(:' | 'return'\n    shiftT(220);                    // 'return'\n    lookahead1W(270);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Statement();\n  }\n\n  function parse_CaseStatement()\n  {\n    eventHandler.startNonterminal(\"CaseStatement\", e0);\n    shift(88);                      // 'case'\n    lookahead1W(262);               // EQName^Token | S^WS | '$' | '%' | '(' | '(:' | 'after' | 'allowing' |\n    if (l1 == 31)                   // '$'\n    {\n      shift(31);                    // '$'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_VarName();\n      lookahead1W(30);              // S^WS | '(:' | 'as'\n      shift(79);                    // 'as'\n    }\n    lookahead1W(260);               // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_SequenceType();\n    lookahead1W(70);                // S^WS | '(:' | 'return'\n    shift(220);                     // 'return'\n    lookahead1W(270);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Statement();\n    eventHandler.endNonterminal(\"CaseStatement\", e0);\n  }\n\n  function try_CaseStatement()\n  {\n    shiftT(88);                     // 'case'\n    lookahead1W(262);               // EQName^Token | S^WS | '$' | '%' | '(' | '(:' | 'after' | 'allowing' |\n    if (l1 == 31)                   // '$'\n    {\n      shiftT(31);                   // '$'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_VarName();\n      lookahead1W(30);              // S^WS | '(:' | 'as'\n      shiftT(79);                   // 'as'\n    }\n    lookahead1W(260);               // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_SequenceType();\n    lookahead1W(70);                // S^WS | '(:' | 'return'\n    shiftT(220);                    // 'return'\n    lookahead1W(270);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Statement();\n  }\n\n  function parse_VarDeclStatement()\n  {\n    eventHandler.startNonterminal(\"VarDeclStatement\", e0);\n    for (;;)\n    {\n      lookahead1W(98);              // S^WS | '%' | '(:' | 'variable'\n      if (l1 != 32)                 // '%'\n      {\n        break;\n      }\n      whitespace();\n      parse_Annotation();\n    }\n    shift(262);                     // 'variable'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shift(31);                      // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_VarName();\n    lookahead1W(157);               // S^WS | '(:' | ',' | ':=' | ';' | 'as'\n    if (l1 == 79)                   // 'as'\n    {\n      whitespace();\n      parse_TypeDeclaration();\n    }\n    lookahead1W(145);               // S^WS | '(:' | ',' | ':=' | ';'\n    if (l1 == 52)                   // ':='\n    {\n      shift(52);                    // ':='\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_ExprSingle();\n    }\n    for (;;)\n    {\n      if (l1 != 41)                 // ','\n      {\n        break;\n      }\n      shift(41);                    // ','\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      shift(31);                    // '$'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      whitespace();\n      parse_VarName();\n      lookahead1W(157);             // S^WS | '(:' | ',' | ':=' | ';' | 'as'\n      if (l1 == 79)                 // 'as'\n      {\n        whitespace();\n        parse_TypeDeclaration();\n      }\n      lookahead1W(145);             // S^WS | '(:' | ',' | ':=' | ';'\n      if (l1 == 52)                 // ':='\n      {\n        shift(52);                  // ':='\n        lookahead1W(267);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        whitespace();\n        parse_ExprSingle();\n      }\n    }\n    shift(53);                      // ';'\n    eventHandler.endNonterminal(\"VarDeclStatement\", e0);\n  }\n\n  function try_VarDeclStatement()\n  {\n    for (;;)\n    {\n      lookahead1W(98);              // S^WS | '%' | '(:' | 'variable'\n      if (l1 != 32)                 // '%'\n      {\n        break;\n      }\n      try_Annotation();\n    }\n    shiftT(262);                    // 'variable'\n    lookahead1W(21);                // S^WS | '$' | '(:'\n    shiftT(31);                     // '$'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    try_VarName();\n    lookahead1W(157);               // S^WS | '(:' | ',' | ':=' | ';' | 'as'\n    if (l1 == 79)                   // 'as'\n    {\n      try_TypeDeclaration();\n    }\n    lookahead1W(145);               // S^WS | '(:' | ',' | ':=' | ';'\n    if (l1 == 52)                   // ':='\n    {\n      shiftT(52);                   // ':='\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_ExprSingle();\n    }\n    for (;;)\n    {\n      if (l1 != 41)                 // ','\n      {\n        break;\n      }\n      shiftT(41);                   // ','\n      lookahead1W(21);              // S^WS | '$' | '(:'\n      shiftT(31);                   // '$'\n      lookahead1W(255);             // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n      try_VarName();\n      lookahead1W(157);             // S^WS | '(:' | ',' | ':=' | ';' | 'as'\n      if (l1 == 79)                 // 'as'\n      {\n        try_TypeDeclaration();\n      }\n      lookahead1W(145);             // S^WS | '(:' | ',' | ':=' | ';'\n      if (l1 == 52)                 // ':='\n      {\n        shiftT(52);                 // ':='\n        lookahead1W(267);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        try_ExprSingle();\n      }\n    }\n    shiftT(53);                     // ';'\n  }\n\n  function parse_WhileStatement()\n  {\n    eventHandler.startNonterminal(\"WhileStatement\", e0);\n    shift(267);                     // 'while'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Expr();\n    shift(37);                      // ')'\n    lookahead1W(270);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_Statement();\n    eventHandler.endNonterminal(\"WhileStatement\", e0);\n  }\n\n  function try_WhileStatement()\n  {\n    shiftT(267);                    // 'while'\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shiftT(34);                     // '('\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Expr();\n    shiftT(37);                     // ')'\n    lookahead1W(270);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_Statement();\n  }\n\n  function parse_VoidStatement()\n  {\n    eventHandler.startNonterminal(\"VoidStatement\", e0);\n    shift(53);                      // ';'\n    eventHandler.endNonterminal(\"VoidStatement\", e0);\n  }\n\n  function try_VoidStatement()\n  {\n    shiftT(53);                     // ';'\n  }\n\n  function parse_ExprSingle()\n  {\n    eventHandler.startNonterminal(\"ExprSingle\", e0);\n    switch (l1)\n    {\n    case 137:                       // 'for'\n      lookahead2W(236);             // S^WS | EOF | '!' | '!=' | '#' | '$' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' |\n      break;\n    case 174:                       // 'let'\n      lookahead2W(233);             // S^WS | EOF | '!' | '!=' | '#' | '$' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' |\n      break;\n    case 250:                       // 'try'\n      lookahead2W(232);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    case 152:                       // 'if'\n    case 243:                       // 'switch'\n    case 253:                       // 'typeswitch'\n      lookahead2W(229);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 16009:                     // 'for' '$'\n    case 16046:                     // 'let' '$'\n    case 116910:                    // 'let' 'score'\n    case 119945:                    // 'for' 'sliding'\n    case 128649:                    // 'for' 'tumbling'\n      parse_FLWORExpr();\n      break;\n    case 17560:                     // 'if' '('\n      parse_IfExpr();\n      break;\n    case 17651:                     // 'switch' '('\n      parse_SwitchExpr();\n      break;\n    case 141562:                    // 'try' '{'\n      parse_TryCatchExpr();\n      break;\n    case 17661:                     // 'typeswitch' '('\n      parse_TypeswitchExpr();\n      break;\n    default:\n      parse_ExprSimple();\n    }\n    eventHandler.endNonterminal(\"ExprSingle\", e0);\n  }\n\n  function try_ExprSingle()\n  {\n    switch (l1)\n    {\n    case 137:                       // 'for'\n      lookahead2W(236);             // S^WS | EOF | '!' | '!=' | '#' | '$' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' |\n      break;\n    case 174:                       // 'let'\n      lookahead2W(233);             // S^WS | EOF | '!' | '!=' | '#' | '$' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' |\n      break;\n    case 250:                       // 'try'\n      lookahead2W(232);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    case 152:                       // 'if'\n    case 243:                       // 'switch'\n    case 253:                       // 'typeswitch'\n      lookahead2W(229);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    default:\n      lk = l1;\n    }\n    switch (lk)\n    {\n    case 16009:                     // 'for' '$'\n    case 16046:                     // 'let' '$'\n    case 116910:                    // 'let' 'score'\n    case 119945:                    // 'for' 'sliding'\n    case 128649:                    // 'for' 'tumbling'\n      try_FLWORExpr();\n      break;\n    case 17560:                     // 'if' '('\n      try_IfExpr();\n      break;\n    case 17651:                     // 'switch' '('\n      try_SwitchExpr();\n      break;\n    case 141562:                    // 'try' '{'\n      try_TryCatchExpr();\n      break;\n    case 17661:                     // 'typeswitch' '('\n      try_TypeswitchExpr();\n      break;\n    default:\n      try_ExprSimple();\n    }\n  }\n\n  function parse_ExprSimple()\n  {\n    eventHandler.startNonterminal(\"ExprSimple\", e0);\n    switch (l1)\n    {\n    case 77:                        // 'append'\n      lookahead2W(231);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    case 218:                       // 'rename'\n      lookahead2W(234);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    case 219:                       // 'replace'\n      lookahead2W(235);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    case 110:                       // 'delete'\n    case 159:                       // 'insert'\n      lookahead2W(237);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    case 103:                       // 'copy'\n    case 129:                       // 'every'\n    case 235:                       // 'some'\n      lookahead2W(230);             // S^WS | EOF | '!' | '!=' | '#' | '$' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 133851)               // 'replace' 'value'\n    {\n      lk = memoized(9, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_ReplaceExpr();\n          lk = -6;\n        }\n        catch (p6A)\n        {\n          lk = -11;\n        }\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(9, e0, lk);\n      }\n    }\n    switch (lk)\n    {\n    case 16001:                     // 'every' '$'\n    case 16107:                     // 'some' '$'\n      parse_QuantifiedExpr();\n      break;\n    case 97951:                     // 'insert' 'node'\n    case 98463:                     // 'insert' 'nodes'\n      parse_InsertExpr();\n      break;\n    case 97902:                     // 'delete' 'node'\n    case 98414:                     // 'delete' 'nodes'\n      parse_DeleteExpr();\n      break;\n    case 98010:                     // 'rename' 'node'\n      parse_RenameExpr();\n      break;\n    case -6:\n    case 98011:                     // 'replace' 'node'\n      parse_ReplaceExpr();\n      break;\n    case 15975:                     // 'copy' '$'\n      parse_TransformExpr();\n      break;\n    case 85102:                     // 'delete' 'json'\n      parse_JSONDeleteExpr();\n      break;\n    case 85151:                     // 'insert' 'json'\n      parse_JSONInsertExpr();\n      break;\n    case 85210:                     // 'rename' 'json'\n      parse_JSONRenameExpr();\n      break;\n    case -11:\n      parse_JSONReplaceExpr();\n      break;\n    case 85069:                     // 'append' 'json'\n      parse_JSONAppendExpr();\n      break;\n    default:\n      parse_OrExpr();\n    }\n    eventHandler.endNonterminal(\"ExprSimple\", e0);\n  }\n\n  function try_ExprSimple()\n  {\n    switch (l1)\n    {\n    case 77:                        // 'append'\n      lookahead2W(231);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    case 218:                       // 'rename'\n      lookahead2W(234);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    case 219:                       // 'replace'\n      lookahead2W(235);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    case 110:                       // 'delete'\n    case 159:                       // 'insert'\n      lookahead2W(237);             // S^WS | EOF | '!' | '!=' | '#' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' | '/' |\n      break;\n    case 103:                       // 'copy'\n    case 129:                       // 'every'\n    case 235:                       // 'some'\n      lookahead2W(230);             // S^WS | EOF | '!' | '!=' | '#' | '$' | '(' | '(:' | ')' | '*' | '+' | ',' | '-' |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 133851)               // 'replace' 'value'\n    {\n      lk = memoized(9, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_ReplaceExpr();\n          memoize(9, e0A, -6);\n          lk = -13;\n        }\n        catch (p6A)\n        {\n          lk = -11;\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(9, e0A, -11);\n        }\n      }\n    }\n    switch (lk)\n    {\n    case 16001:                     // 'every' '$'\n    case 16107:                     // 'some' '$'\n      try_QuantifiedExpr();\n      break;\n    case 97951:                     // 'insert' 'node'\n    case 98463:                     // 'insert' 'nodes'\n      try_InsertExpr();\n      break;\n    case 97902:                     // 'delete' 'node'\n    case 98414:                     // 'delete' 'nodes'\n      try_DeleteExpr();\n      break;\n    case 98010:                     // 'rename' 'node'\n      try_RenameExpr();\n      break;\n    case -6:\n    case 98011:                     // 'replace' 'node'\n      try_ReplaceExpr();\n      break;\n    case 15975:                     // 'copy' '$'\n      try_TransformExpr();\n      break;\n    case 85102:                     // 'delete' 'json'\n      try_JSONDeleteExpr();\n      break;\n    case 85151:                     // 'insert' 'json'\n      try_JSONInsertExpr();\n      break;\n    case 85210:                     // 'rename' 'json'\n      try_JSONRenameExpr();\n      break;\n    case -11:\n      try_JSONReplaceExpr();\n      break;\n    case 85069:                     // 'append' 'json'\n      try_JSONAppendExpr();\n      break;\n    case -13:\n      break;\n    default:\n      try_OrExpr();\n    }\n  }\n\n  function parse_JSONDeleteExpr()\n  {\n    eventHandler.startNonterminal(\"JSONDeleteExpr\", e0);\n    shift(110);                     // 'delete'\n    lookahead1W(56);                // S^WS | '(:' | 'json'\n    shift(166);                     // 'json'\n    lookahead1W(264);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_PostfixExpr();\n    eventHandler.endNonterminal(\"JSONDeleteExpr\", e0);\n  }\n\n  function try_JSONDeleteExpr()\n  {\n    shiftT(110);                    // 'delete'\n    lookahead1W(56);                // S^WS | '(:' | 'json'\n    shiftT(166);                    // 'json'\n    lookahead1W(264);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_PostfixExpr();\n  }\n\n  function parse_JSONInsertExpr()\n  {\n    eventHandler.startNonterminal(\"JSONInsertExpr\", e0);\n    switch (l1)\n    {\n    case 159:                       // 'insert'\n      lookahead2W(56);              // S^WS | '(:' | 'json'\n      break;\n    default:\n      lk = l1;\n    }\n    lk = memoized(10, e0);\n    if (lk == 0)\n    {\n      var b0A = b0; var e0A = e0; var l1A = l1;\n      var b1A = b1; var e1A = e1; var l2A = l2;\n      var b2A = b2; var e2A = e2;\n      try\n      {\n        shiftT(159);                // 'insert'\n        lookahead1W(56);            // S^WS | '(:' | 'json'\n        shiftT(166);                // 'json'\n        lookahead1W(267);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        try_ExprSingle();\n        shiftT(163);                // 'into'\n        lookahead1W(267);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        try_ExprSingle();\n        switch (l1)\n        {\n        case 81:                    // 'at'\n          lookahead2W(69);          // S^WS | '(:' | 'position'\n          break;\n        default:\n          lk = l1;\n        }\n        if (lk == 108113)           // 'at' 'position'\n        {\n          lk = memoized(11, e0);\n          if (lk == 0)\n          {\n            var b0B = b0; var e0B = e0; var l1B = l1;\n            var b1B = b1; var e1B = e1; var l2B = l2;\n            var b2B = b2; var e2B = e2;\n            try\n            {\n              shiftT(81);           // 'at'\n              lookahead1W(69);      // S^WS | '(:' | 'position'\n              shiftT(211);          // 'position'\n              lookahead1W(267);     // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n              try_ExprSingle();\n              memoize(11, e0B, -1);\n            }\n            catch (p1B)\n            {\n              b0 = b0B; e0 = e0B; l1 = l1B; if (l1 == 0) {end = e0B;} else {\n              b1 = b1B; e1 = e1B; l2 = l2B; if (l2 == 0) {end = e1B;} else {\n              b2 = b2B; e2 = e2B; end = e2B; }}\n              memoize(11, e0B, -2);\n            }\n            lk = -2;\n          }\n        }\n        if (lk == -1)\n        {\n          shiftT(81);               // 'at'\n          lookahead1W(69);          // S^WS | '(:' | 'position'\n          shiftT(211);              // 'position'\n          lookahead1W(267);         // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n          try_ExprSingle();\n        }\n        lk = -1;\n      }\n      catch (p1A)\n      {\n        lk = -2;\n      }\n      b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n      b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n      b2 = b2A; e2 = e2A; end = e2A; }}\n      memoize(10, e0, lk);\n    }\n    switch (lk)\n    {\n    case -1:\n      shift(159);                   // 'insert'\n      lookahead1W(56);              // S^WS | '(:' | 'json'\n      shift(166);                   // 'json'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_ExprSingle();\n      shift(163);                   // 'into'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_ExprSingle();\n      switch (l1)\n      {\n      case 81:                      // 'at'\n        lookahead2W(69);            // S^WS | '(:' | 'position'\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk == 108113)             // 'at' 'position'\n      {\n        lk = memoized(11, e0);\n        if (lk == 0)\n        {\n          var b0B = b0; var e0B = e0; var l1B = l1;\n          var b1B = b1; var e1B = e1; var l2B = l2;\n          var b2B = b2; var e2B = e2;\n          try\n          {\n            shiftT(81);             // 'at'\n            lookahead1W(69);        // S^WS | '(:' | 'position'\n            shiftT(211);            // 'position'\n            lookahead1W(267);       // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n            try_ExprSingle();\n            lk = -1;\n          }\n          catch (p1B)\n          {\n            lk = -2;\n          }\n          b0 = b0B; e0 = e0B; l1 = l1B; if (l1 == 0) {end = e0B;} else {\n          b1 = b1B; e1 = e1B; l2 = l2B; if (l2 == 0) {end = e1B;} else {\n          b2 = b2B; e2 = e2B; end = e2B; }}\n          memoize(11, e0, lk);\n        }\n      }\n      if (lk == -1)\n      {\n        shift(81);                  // 'at'\n        lookahead1W(69);            // S^WS | '(:' | 'position'\n        shift(211);                 // 'position'\n        lookahead1W(267);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        whitespace();\n        parse_ExprSingle();\n      }\n      break;\n    default:\n      shift(159);                   // 'insert'\n      lookahead1W(56);              // S^WS | '(:' | 'json'\n      shift(166);                   // 'json'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_PairConstructorList();\n      shift(163);                   // 'into'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_ExprSingle();\n    }\n    eventHandler.endNonterminal(\"JSONInsertExpr\", e0);\n  }\n\n  function try_JSONInsertExpr()\n  {\n    switch (l1)\n    {\n    case 159:                       // 'insert'\n      lookahead2W(56);              // S^WS | '(:' | 'json'\n      break;\n    default:\n      lk = l1;\n    }\n    lk = memoized(10, e0);\n    if (lk == 0)\n    {\n      var b0A = b0; var e0A = e0; var l1A = l1;\n      var b1A = b1; var e1A = e1; var l2A = l2;\n      var b2A = b2; var e2A = e2;\n      try\n      {\n        shiftT(159);                // 'insert'\n        lookahead1W(56);            // S^WS | '(:' | 'json'\n        shiftT(166);                // 'json'\n        lookahead1W(267);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        try_ExprSingle();\n        shiftT(163);                // 'into'\n        lookahead1W(267);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        try_ExprSingle();\n        switch (l1)\n        {\n        case 81:                    // 'at'\n          lookahead2W(69);          // S^WS | '(:' | 'position'\n          break;\n        default:\n          lk = l1;\n        }\n        if (lk == 108113)           // 'at' 'position'\n        {\n          lk = memoized(11, e0);\n          if (lk == 0)\n          {\n            var b0B = b0; var e0B = e0; var l1B = l1;\n            var b1B = b1; var e1B = e1; var l2B = l2;\n            var b2B = b2; var e2B = e2;\n            try\n            {\n              shiftT(81);           // 'at'\n              lookahead1W(69);      // S^WS | '(:' | 'position'\n              shiftT(211);          // 'position'\n              lookahead1W(267);     // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n              try_ExprSingle();\n              memoize(11, e0B, -1);\n            }\n            catch (p1B)\n            {\n              b0 = b0B; e0 = e0B; l1 = l1B; if (l1 == 0) {end = e0B;} else {\n              b1 = b1B; e1 = e1B; l2 = l2B; if (l2 == 0) {end = e1B;} else {\n              b2 = b2B; e2 = e2B; end = e2B; }}\n              memoize(11, e0B, -2);\n            }\n            lk = -2;\n          }\n        }\n        if (lk == -1)\n        {\n          shiftT(81);               // 'at'\n          lookahead1W(69);          // S^WS | '(:' | 'position'\n          shiftT(211);              // 'position'\n          lookahead1W(267);         // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n          try_ExprSingle();\n        }\n        memoize(10, e0A, -1);\n        lk = -3;\n      }\n      catch (p1A)\n      {\n        lk = -2;\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(10, e0A, -2);\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n      shiftT(159);                  // 'insert'\n      lookahead1W(56);              // S^WS | '(:' | 'json'\n      shiftT(166);                  // 'json'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_ExprSingle();\n      shiftT(163);                  // 'into'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_ExprSingle();\n      switch (l1)\n      {\n      case 81:                      // 'at'\n        lookahead2W(69);            // S^WS | '(:' | 'position'\n        break;\n      default:\n        lk = l1;\n      }\n      if (lk == 108113)             // 'at' 'position'\n      {\n        lk = memoized(11, e0);\n        if (lk == 0)\n        {\n          var b0B = b0; var e0B = e0; var l1B = l1;\n          var b1B = b1; var e1B = e1; var l2B = l2;\n          var b2B = b2; var e2B = e2;\n          try\n          {\n            shiftT(81);             // 'at'\n            lookahead1W(69);        // S^WS | '(:' | 'position'\n            shiftT(211);            // 'position'\n            lookahead1W(267);       // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n            try_ExprSingle();\n            memoize(11, e0B, -1);\n          }\n          catch (p1B)\n          {\n            b0 = b0B; e0 = e0B; l1 = l1B; if (l1 == 0) {end = e0B;} else {\n            b1 = b1B; e1 = e1B; l2 = l2B; if (l2 == 0) {end = e1B;} else {\n            b2 = b2B; e2 = e2B; end = e2B; }}\n            memoize(11, e0B, -2);\n          }\n          lk = -2;\n        }\n      }\n      if (lk == -1)\n      {\n        shiftT(81);                 // 'at'\n        lookahead1W(69);            // S^WS | '(:' | 'position'\n        shiftT(211);                // 'position'\n        lookahead1W(267);           // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n        try_ExprSingle();\n      }\n      break;\n    case -3:\n      break;\n    default:\n      shiftT(159);                  // 'insert'\n      lookahead1W(56);              // S^WS | '(:' | 'json'\n      shiftT(166);                  // 'json'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_PairConstructorList();\n      shiftT(163);                  // 'into'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_ExprSingle();\n    }\n  }\n\n  function parse_JSONRenameExpr()\n  {\n    eventHandler.startNonterminal(\"JSONRenameExpr\", e0);\n    shift(218);                     // 'rename'\n    lookahead1W(56);                // S^WS | '(:' | 'json'\n    shift(166);                     // 'json'\n    lookahead1W(264);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_PostfixExpr();\n    shift(79);                      // 'as'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"JSONRenameExpr\", e0);\n  }\n\n  function try_JSONRenameExpr()\n  {\n    shiftT(218);                    // 'rename'\n    lookahead1W(56);                // S^WS | '(:' | 'json'\n    shiftT(166);                    // 'json'\n    lookahead1W(264);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_PostfixExpr();\n    shiftT(79);                     // 'as'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_JSONReplaceExpr()\n  {\n    eventHandler.startNonterminal(\"JSONReplaceExpr\", e0);\n    shift(219);                     // 'replace'\n    lookahead1W(82);                // S^WS | '(:' | 'value'\n    shift(261);                     // 'value'\n    lookahead1W(64);                // S^WS | '(:' | 'of'\n    shift(196);                     // 'of'\n    lookahead1W(56);                // S^WS | '(:' | 'json'\n    shift(166);                     // 'json'\n    lookahead1W(264);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    whitespace();\n    parse_PostfixExpr();\n    shift(270);                     // 'with'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"JSONReplaceExpr\", e0);\n  }\n\n  function try_JSONReplaceExpr()\n  {\n    shiftT(219);                    // 'replace'\n    lookahead1W(82);                // S^WS | '(:' | 'value'\n    shiftT(261);                    // 'value'\n    lookahead1W(64);                // S^WS | '(:' | 'of'\n    shiftT(196);                    // 'of'\n    lookahead1W(56);                // S^WS | '(:' | 'json'\n    shiftT(166);                    // 'json'\n    lookahead1W(264);               // EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral | StringLiteral |\n    try_PostfixExpr();\n    shiftT(270);                    // 'with'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_JSONAppendExpr()\n  {\n    eventHandler.startNonterminal(\"JSONAppendExpr\", e0);\n    shift(77);                      // 'append'\n    lookahead1W(56);                // S^WS | '(:' | 'json'\n    shift(166);                     // 'json'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    shift(163);                     // 'into'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"JSONAppendExpr\", e0);\n  }\n\n  function try_JSONAppendExpr()\n  {\n    shiftT(77);                     // 'append'\n    lookahead1W(56);                // S^WS | '(:' | 'json'\n    shiftT(166);                    // 'json'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n    shiftT(163);                    // 'into'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_CommonContent()\n  {\n    eventHandler.startNonterminal(\"CommonContent\", e0);\n    switch (l1)\n    {\n    case 12:                        // PredefinedEntityRef\n      shift(12);                    // PredefinedEntityRef\n      break;\n    case 23:                        // CharRef\n      shift(23);                    // CharRef\n      break;\n    case 277:                       // '{{'\n      shift(277);                   // '{{'\n      break;\n    case 283:                       // '}}'\n      shift(283);                   // '}}'\n      break;\n    default:\n      parse_BlockExpr();\n    }\n    eventHandler.endNonterminal(\"CommonContent\", e0);\n  }\n\n  function try_CommonContent()\n  {\n    switch (l1)\n    {\n    case 12:                        // PredefinedEntityRef\n      shiftT(12);                   // PredefinedEntityRef\n      break;\n    case 23:                        // CharRef\n      shiftT(23);                   // CharRef\n      break;\n    case 277:                       // '{{'\n      shiftT(277);                  // '{{'\n      break;\n    case 283:                       // '}}'\n      shiftT(283);                  // '}}'\n      break;\n    default:\n      try_BlockExpr();\n    }\n  }\n\n  function parse_ContentExpr()\n  {\n    eventHandler.startNonterminal(\"ContentExpr\", e0);\n    parse_StatementsAndExpr();\n    eventHandler.endNonterminal(\"ContentExpr\", e0);\n  }\n\n  function try_ContentExpr()\n  {\n    try_StatementsAndExpr();\n  }\n\n  function parse_CompDocConstructor()\n  {\n    eventHandler.startNonterminal(\"CompDocConstructor\", e0);\n    shift(119);                     // 'document'\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    whitespace();\n    parse_BlockExpr();\n    eventHandler.endNonterminal(\"CompDocConstructor\", e0);\n  }\n\n  function try_CompDocConstructor()\n  {\n    shiftT(119);                    // 'document'\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    try_BlockExpr();\n  }\n\n  function parse_CompAttrConstructor()\n  {\n    eventHandler.startNonterminal(\"CompAttrConstructor\", e0);\n    shift(82);                      // 'attribute'\n    lookahead1W(258);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    switch (l1)\n    {\n    case 276:                       // '{'\n      shift(276);                   // '{'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_Expr();\n      shift(282);                   // '}'\n      break;\n    default:\n      whitespace();\n      parse_EQName();\n    }\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    switch (l1)\n    {\n    case 276:                       // '{'\n      lookahead2W(277);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 144660)               // '{' '}'\n    {\n      lk = memoized(12, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          shiftT(276);              // '{'\n          lookahead1W(88);          // S^WS | '(:' | '}'\n          shiftT(282);              // '}'\n          lk = -1;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n        }\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(12, e0, lk);\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n      shift(276);                   // '{'\n      lookahead1W(88);              // S^WS | '(:' | '}'\n      shift(282);                   // '}'\n      break;\n    default:\n      whitespace();\n      parse_BlockExpr();\n    }\n    eventHandler.endNonterminal(\"CompAttrConstructor\", e0);\n  }\n\n  function try_CompAttrConstructor()\n  {\n    shiftT(82);                     // 'attribute'\n    lookahead1W(258);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    switch (l1)\n    {\n    case 276:                       // '{'\n      shiftT(276);                  // '{'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_Expr();\n      shiftT(282);                  // '}'\n      break;\n    default:\n      try_EQName();\n    }\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    switch (l1)\n    {\n    case 276:                       // '{'\n      lookahead2W(277);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 144660)               // '{' '}'\n    {\n      lk = memoized(12, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          shiftT(276);              // '{'\n          lookahead1W(88);          // S^WS | '(:' | '}'\n          shiftT(282);              // '}'\n          memoize(12, e0A, -1);\n          lk = -3;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(12, e0A, -2);\n        }\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n      shiftT(276);                  // '{'\n      lookahead1W(88);              // S^WS | '(:' | '}'\n      shiftT(282);                  // '}'\n      break;\n    case -3:\n      break;\n    default:\n      try_BlockExpr();\n    }\n  }\n\n  function parse_CompPIConstructor()\n  {\n    eventHandler.startNonterminal(\"CompPIConstructor\", e0);\n    shift(216);                     // 'processing-instruction'\n    lookahead1W(251);               // NCName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    switch (l1)\n    {\n    case 276:                       // '{'\n      shift(276);                   // '{'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_Expr();\n      shift(282);                   // '}'\n      break;\n    default:\n      whitespace();\n      parse_NCName();\n    }\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    switch (l1)\n    {\n    case 276:                       // '{'\n      lookahead2W(277);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 144660)               // '{' '}'\n    {\n      lk = memoized(13, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          shiftT(276);              // '{'\n          lookahead1W(88);          // S^WS | '(:' | '}'\n          shiftT(282);              // '}'\n          lk = -1;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n        }\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(13, e0, lk);\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n      shift(276);                   // '{'\n      lookahead1W(88);              // S^WS | '(:' | '}'\n      shift(282);                   // '}'\n      break;\n    default:\n      whitespace();\n      parse_BlockExpr();\n    }\n    eventHandler.endNonterminal(\"CompPIConstructor\", e0);\n  }\n\n  function try_CompPIConstructor()\n  {\n    shiftT(216);                    // 'processing-instruction'\n    lookahead1W(251);               // NCName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    switch (l1)\n    {\n    case 276:                       // '{'\n      shiftT(276);                  // '{'\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_Expr();\n      shiftT(282);                  // '}'\n      break;\n    default:\n      try_NCName();\n    }\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    switch (l1)\n    {\n    case 276:                       // '{'\n      lookahead2W(277);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 144660)               // '{' '}'\n    {\n      lk = memoized(13, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          shiftT(276);              // '{'\n          lookahead1W(88);          // S^WS | '(:' | '}'\n          shiftT(282);              // '}'\n          memoize(13, e0A, -1);\n          lk = -3;\n        }\n        catch (p1A)\n        {\n          lk = -2;\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(13, e0A, -2);\n        }\n      }\n    }\n    switch (lk)\n    {\n    case -1:\n      shiftT(276);                  // '{'\n      lookahead1W(88);              // S^WS | '(:' | '}'\n      shiftT(282);                  // '}'\n      break;\n    case -3:\n      break;\n    default:\n      try_BlockExpr();\n    }\n  }\n\n  function parse_CompCommentConstructor()\n  {\n    eventHandler.startNonterminal(\"CompCommentConstructor\", e0);\n    shift(96);                      // 'comment'\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    whitespace();\n    parse_BlockExpr();\n    eventHandler.endNonterminal(\"CompCommentConstructor\", e0);\n  }\n\n  function try_CompCommentConstructor()\n  {\n    shiftT(96);                     // 'comment'\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    try_BlockExpr();\n  }\n\n  function parse_CompTextConstructor()\n  {\n    eventHandler.startNonterminal(\"CompTextConstructor\", e0);\n    shift(244);                     // 'text'\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    whitespace();\n    parse_BlockExpr();\n    eventHandler.endNonterminal(\"CompTextConstructor\", e0);\n  }\n\n  function try_CompTextConstructor()\n  {\n    shiftT(244);                    // 'text'\n    lookahead1W(87);                // S^WS | '(:' | '{'\n    try_BlockExpr();\n  }\n\n  function parse_PrimaryExpr()\n  {\n    eventHandler.startNonterminal(\"PrimaryExpr\", e0);\n    switch (l1)\n    {\n    case 184:                       // 'namespace'\n      lookahead2W(256);             // NCName^Token | S^WS | '#' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    case 216:                       // 'processing-instruction'\n      lookahead2W(254);             // NCName^Token | S^WS | '#' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    case 276:                       // '{'\n      lookahead2W(277);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      break;\n    case 82:                        // 'attribute'\n    case 121:                       // 'element'\n      lookahead2W(259);             // EQName^Token | S^WS | '#' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    case 96:                        // 'comment'\n    case 244:                       // 'text'\n      lookahead2W(93);              // S^WS | '#' | '(:' | '{'\n      break;\n    case 119:                       // 'document'\n    case 202:                       // 'ordered'\n    case 256:                       // 'unordered'\n      lookahead2W(139);             // S^WS | '#' | '(' | '(:' | '{'\n      break;\n    case 6:                         // EQName^Token\n    case 70:                        // 'after'\n    case 72:                        // 'allowing'\n    case 73:                        // 'ancestor'\n    case 74:                        // 'ancestor-or-self'\n    case 75:                        // 'and'\n    case 77:                        // 'append'\n    case 79:                        // 'as'\n    case 80:                        // 'ascending'\n    case 81:                        // 'at'\n    case 83:                        // 'base-uri'\n    case 84:                        // 'before'\n    case 85:                        // 'boundary-space'\n    case 86:                        // 'break'\n    case 88:                        // 'case'\n    case 89:                        // 'cast'\n    case 90:                        // 'castable'\n    case 91:                        // 'catch'\n    case 93:                        // 'child'\n    case 94:                        // 'collation'\n    case 97:                        // 'constraint'\n    case 98:                        // 'construction'\n    case 101:                       // 'context'\n    case 102:                       // 'continue'\n    case 103:                       // 'copy'\n    case 104:                       // 'copy-namespaces'\n    case 105:                       // 'count'\n    case 106:                       // 'decimal-format'\n    case 108:                       // 'declare'\n    case 109:                       // 'default'\n    case 110:                       // 'delete'\n    case 111:                       // 'descendant'\n    case 112:                       // 'descendant-or-self'\n    case 113:                       // 'descending'\n    case 118:                       // 'div'\n    case 122:                       // 'else'\n    case 123:                       // 'empty'\n    case 125:                       // 'encoding'\n    case 126:                       // 'end'\n    case 128:                       // 'eq'\n    case 129:                       // 'every'\n    case 131:                       // 'except'\n    case 132:                       // 'exit'\n    case 133:                       // 'external'\n    case 134:                       // 'first'\n    case 135:                       // 'following'\n    case 136:                       // 'following-sibling'\n    case 137:                       // 'for'\n    case 141:                       // 'ft-option'\n    case 146:                       // 'ge'\n    case 148:                       // 'group'\n    case 150:                       // 'gt'\n    case 151:                       // 'idiv'\n    case 153:                       // 'import'\n    case 154:                       // 'in'\n    case 155:                       // 'index'\n    case 159:                       // 'insert'\n    case 160:                       // 'instance'\n    case 161:                       // 'integrity'\n    case 162:                       // 'intersect'\n    case 163:                       // 'into'\n    case 164:                       // 'is'\n    case 166:                       // 'json'\n    case 170:                       // 'last'\n    case 171:                       // 'lax'\n    case 172:                       // 'le'\n    case 174:                       // 'let'\n    case 176:                       // 'loop'\n    case 178:                       // 'lt'\n    case 180:                       // 'mod'\n    case 181:                       // 'modify'\n    case 182:                       // 'module'\n    case 186:                       // 'ne'\n    case 192:                       // 'nodes'\n    case 194:                       // 'object'\n    case 198:                       // 'only'\n    case 199:                       // 'option'\n    case 200:                       // 'or'\n    case 201:                       // 'order'\n    case 203:                       // 'ordering'\n    case 206:                       // 'parent'\n    case 212:                       // 'preceding'\n    case 213:                       // 'preceding-sibling'\n    case 218:                       // 'rename'\n    case 219:                       // 'replace'\n    case 220:                       // 'return'\n    case 221:                       // 'returning'\n    case 222:                       // 'revalidation'\n    case 224:                       // 'satisfies'\n    case 225:                       // 'schema'\n    case 228:                       // 'score'\n    case 229:                       // 'self'\n    case 234:                       // 'sliding'\n    case 235:                       // 'some'\n    case 236:                       // 'stable'\n    case 237:                       // 'start'\n    case 240:                       // 'strict'\n    case 248:                       // 'to'\n    case 249:                       // 'treat'\n    case 250:                       // 'try'\n    case 251:                       // 'tumbling'\n    case 252:                       // 'type'\n    case 254:                       // 'union'\n    case 257:                       // 'updating'\n    case 260:                       // 'validate'\n    case 261:                       // 'value'\n    case 262:                       // 'variable'\n    case 263:                       // 'version'\n    case 266:                       // 'where'\n    case 267:                       // 'while'\n    case 270:                       // 'with'\n    case 274:                       // 'xquery'\n      lookahead2W(92);              // S^WS | '#' | '(' | '(:'\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 2836                  // '{' Wildcard\n     || lk == 3348                  // '{' EQName^Token\n     || lk == 4372                  // '{' IntegerLiteral\n     || lk == 4884                  // '{' DecimalLiteral\n     || lk == 5396                  // '{' DoubleLiteral\n     || lk == 5908                  // '{' StringLiteral\n     || lk == 16148                 // '{' '$'\n     || lk == 16660                 // '{' '%'\n     || lk == 17684                 // '{' '('\n     || lk == 18196                 // '{' '(#'\n     || lk == 20756                 // '{' '+'\n     || lk == 21780                 // '{' '-'\n     || lk == 22804                 // '{' '.'\n     || lk == 23316                 // '{' '..'\n     || lk == 23828                 // '{' '/'\n     || lk == 24340                 // '{' '//'\n     || lk == 27924                 // '{' '<'\n     || lk == 28436                 // '{' '<!--'\n     || lk == 30484                 // '{' '<?'\n     || lk == 34068                 // '{' '@'\n     || lk == 35092                 // '{' '['\n     || lk == 36116                 // '{' 'after'\n     || lk == 37140                 // '{' 'allowing'\n     || lk == 37652                 // '{' 'ancestor'\n     || lk == 38164                 // '{' 'ancestor-or-self'\n     || lk == 38676                 // '{' 'and'\n     || lk == 39700                 // '{' 'append'\n     || lk == 40212                 // '{' 'array'\n     || lk == 40724                 // '{' 'as'\n     || lk == 41236                 // '{' 'ascending'\n     || lk == 41748                 // '{' 'at'\n     || lk == 42260                 // '{' 'attribute'\n     || lk == 42772                 // '{' 'base-uri'\n     || lk == 43284                 // '{' 'before'\n     || lk == 43796                 // '{' 'boundary-space'\n     || lk == 44308                 // '{' 'break'\n     || lk == 45332                 // '{' 'case'\n     || lk == 45844                 // '{' 'cast'\n     || lk == 46356                 // '{' 'castable'\n     || lk == 46868                 // '{' 'catch'\n     || lk == 47892                 // '{' 'child'\n     || lk == 48404                 // '{' 'collation'\n     || lk == 49428                 // '{' 'comment'\n     || lk == 49940                 // '{' 'constraint'\n     || lk == 50452                 // '{' 'construction'\n     || lk == 51988                 // '{' 'context'\n     || lk == 52500                 // '{' 'continue'\n     || lk == 53012                 // '{' 'copy'\n     || lk == 53524                 // '{' 'copy-namespaces'\n     || lk == 54036                 // '{' 'count'\n     || lk == 54548                 // '{' 'decimal-format'\n     || lk == 55572                 // '{' 'declare'\n     || lk == 56084                 // '{' 'default'\n     || lk == 56596                 // '{' 'delete'\n     || lk == 57108                 // '{' 'descendant'\n     || lk == 57620                 // '{' 'descendant-or-self'\n     || lk == 58132                 // '{' 'descending'\n     || lk == 60692                 // '{' 'div'\n     || lk == 61204                 // '{' 'document'\n     || lk == 61716                 // '{' 'document-node'\n     || lk == 62228                 // '{' 'element'\n     || lk == 62740                 // '{' 'else'\n     || lk == 63252                 // '{' 'empty'\n     || lk == 63764                 // '{' 'empty-sequence'\n     || lk == 64276                 // '{' 'encoding'\n     || lk == 64788                 // '{' 'end'\n     || lk == 65812                 // '{' 'eq'\n     || lk == 66324                 // '{' 'every'\n     || lk == 67348                 // '{' 'except'\n     || lk == 67860                 // '{' 'exit'\n     || lk == 68372                 // '{' 'external'\n     || lk == 68884                 // '{' 'first'\n     || lk == 69396                 // '{' 'following'\n     || lk == 69908                 // '{' 'following-sibling'\n     || lk == 70420                 // '{' 'for'\n     || lk == 72468                 // '{' 'ft-option'\n     || lk == 74516                 // '{' 'function'\n     || lk == 75028                 // '{' 'ge'\n     || lk == 76052                 // '{' 'group'\n     || lk == 77076                 // '{' 'gt'\n     || lk == 77588                 // '{' 'idiv'\n     || lk == 78100                 // '{' 'if'\n     || lk == 78612                 // '{' 'import'\n     || lk == 79124                 // '{' 'in'\n     || lk == 79636                 // '{' 'index'\n     || lk == 81684                 // '{' 'insert'\n     || lk == 82196                 // '{' 'instance'\n     || lk == 82708                 // '{' 'integrity'\n     || lk == 83220                 // '{' 'intersect'\n     || lk == 83732                 // '{' 'into'\n     || lk == 84244                 // '{' 'is'\n     || lk == 84756                 // '{' 'item'\n     || lk == 85268                 // '{' 'json'\n     || lk == 85780                 // '{' 'json-item'\n     || lk == 87316                 // '{' 'last'\n     || lk == 87828                 // '{' 'lax'\n     || lk == 88340                 // '{' 'le'\n     || lk == 89364                 // '{' 'let'\n     || lk == 90388                 // '{' 'loop'\n     || lk == 91412                 // '{' 'lt'\n     || lk == 92436                 // '{' 'mod'\n     || lk == 92948                 // '{' 'modify'\n     || lk == 93460                 // '{' 'module'\n     || lk == 94484                 // '{' 'namespace'\n     || lk == 94996                 // '{' 'namespace-node'\n     || lk == 95508                 // '{' 'ne'\n     || lk == 98068                 // '{' 'node'\n     || lk == 98580                 // '{' 'nodes'\n     || lk == 99604                 // '{' 'object'\n     || lk == 101652                // '{' 'only'\n     || lk == 102164                // '{' 'option'\n     || lk == 102676                // '{' 'or'\n     || lk == 103188                // '{' 'order'\n     || lk == 103700                // '{' 'ordered'\n     || lk == 104212                // '{' 'ordering'\n     || lk == 105748                // '{' 'parent'\n     || lk == 108820                // '{' 'preceding'\n     || lk == 109332                // '{' 'preceding-sibling'\n     || lk == 110868                // '{' 'processing-instruction'\n     || lk == 111892                // '{' 'rename'\n     || lk == 112404                // '{' 'replace'\n     || lk == 112916                // '{' 'return'\n     || lk == 113428                // '{' 'returning'\n     || lk == 113940                // '{' 'revalidation'\n     || lk == 114964                // '{' 'satisfies'\n     || lk == 115476                // '{' 'schema'\n     || lk == 115988                // '{' 'schema-attribute'\n     || lk == 116500                // '{' 'schema-element'\n     || lk == 117012                // '{' 'score'\n     || lk == 117524                // '{' 'self'\n     || lk == 120084                // '{' 'sliding'\n     || lk == 120596                // '{' 'some'\n     || lk == 121108                // '{' 'stable'\n     || lk == 121620                // '{' 'start'\n     || lk == 123156                // '{' 'strict'\n     || lk == 124180                // '{' 'structured-item'\n     || lk == 124692                // '{' 'switch'\n     || lk == 125204                // '{' 'text'\n     || lk == 127252                // '{' 'to'\n     || lk == 127764                // '{' 'treat'\n     || lk == 128276                // '{' 'try'\n     || lk == 128788                // '{' 'tumbling'\n     || lk == 129300                // '{' 'type'\n     || lk == 129812                // '{' 'typeswitch'\n     || lk == 130324                // '{' 'union'\n     || lk == 131348                // '{' 'unordered'\n     || lk == 131860                // '{' 'updating'\n     || lk == 133396                // '{' 'validate'\n     || lk == 133908                // '{' 'value'\n     || lk == 134420                // '{' 'variable'\n     || lk == 134932                // '{' 'version'\n     || lk == 136468                // '{' 'where'\n     || lk == 136980                // '{' 'while'\n     || lk == 138516                // '{' 'with'\n     || lk == 140564                // '{' 'xquery'\n     || lk == 141588                // '{' '{'\n     || lk == 142612                // '{' '{|'\n     || lk == 144660)               // '{' '}'\n    {\n      lk = memoized(14, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_BlockExpr();\n          lk = -10;\n        }\n        catch (p10A)\n        {\n          lk = -11;\n        }\n        b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n        b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n        b2 = b2A; e2 = e2A; end = e2A; }}\n        memoize(14, e0, lk);\n      }\n    }\n    switch (lk)\n    {\n    case 8:                         // IntegerLiteral\n    case 9:                         // DecimalLiteral\n    case 10:                        // DoubleLiteral\n    case 11:                        // StringLiteral\n      parse_Literal();\n      break;\n    case 31:                        // '$'\n      parse_VarRef();\n      break;\n    case 34:                        // '('\n      parse_ParenthesizedExpr();\n      break;\n    case 44:                        // '.'\n      parse_ContextItemExpr();\n      break;\n    case 17414:                     // EQName^Token '('\n    case 17478:                     // 'after' '('\n    case 17480:                     // 'allowing' '('\n    case 17481:                     // 'ancestor' '('\n    case 17482:                     // 'ancestor-or-self' '('\n    case 17483:                     // 'and' '('\n    case 17485:                     // 'append' '('\n    case 17487:                     // 'as' '('\n    case 17488:                     // 'ascending' '('\n    case 17489:                     // 'at' '('\n    case 17491:                     // 'base-uri' '('\n    case 17492:                     // 'before' '('\n    case 17493:                     // 'boundary-space' '('\n    case 17494:                     // 'break' '('\n    case 17496:                     // 'case' '('\n    case 17497:                     // 'cast' '('\n    case 17498:                     // 'castable' '('\n    case 17499:                     // 'catch' '('\n    case 17501:                     // 'child' '('\n    case 17502:                     // 'collation' '('\n    case 17505:                     // 'constraint' '('\n    case 17506:                     // 'construction' '('\n    case 17509:                     // 'context' '('\n    case 17510:                     // 'continue' '('\n    case 17511:                     // 'copy' '('\n    case 17512:                     // 'copy-namespaces' '('\n    case 17513:                     // 'count' '('\n    case 17514:                     // 'decimal-format' '('\n    case 17516:                     // 'declare' '('\n    case 17517:                     // 'default' '('\n    case 17518:                     // 'delete' '('\n    case 17519:                     // 'descendant' '('\n    case 17520:                     // 'descendant-or-self' '('\n    case 17521:                     // 'descending' '('\n    case 17526:                     // 'div' '('\n    case 17527:                     // 'document' '('\n    case 17530:                     // 'else' '('\n    case 17531:                     // 'empty' '('\n    case 17533:                     // 'encoding' '('\n    case 17534:                     // 'end' '('\n    case 17536:                     // 'eq' '('\n    case 17537:                     // 'every' '('\n    case 17539:                     // 'except' '('\n    case 17540:                     // 'exit' '('\n    case 17541:                     // 'external' '('\n    case 17542:                     // 'first' '('\n    case 17543:                     // 'following' '('\n    case 17544:                     // 'following-sibling' '('\n    case 17545:                     // 'for' '('\n    case 17549:                     // 'ft-option' '('\n    case 17554:                     // 'ge' '('\n    case 17556:                     // 'group' '('\n    case 17558:                     // 'gt' '('\n    case 17559:                     // 'idiv' '('\n    case 17561:                     // 'import' '('\n    case 17562:                     // 'in' '('\n    case 17563:                     // 'index' '('\n    case 17567:                     // 'insert' '('\n    case 17568:                     // 'instance' '('\n    case 17569:                     // 'integrity' '('\n    case 17570:                     // 'intersect' '('\n    case 17571:                     // 'into' '('\n    case 17572:                     // 'is' '('\n    case 17574:                     // 'json' '('\n    case 17578:                     // 'last' '('\n    case 17579:                     // 'lax' '('\n    case 17580:                     // 'le' '('\n    case 17582:                     // 'let' '('\n    case 17584:                     // 'loop' '('\n    case 17586:                     // 'lt' '('\n    case 17588:                     // 'mod' '('\n    case 17589:                     // 'modify' '('\n    case 17590:                     // 'module' '('\n    case 17592:                     // 'namespace' '('\n    case 17594:                     // 'ne' '('\n    case 17600:                     // 'nodes' '('\n    case 17602:                     // 'object' '('\n    case 17606:                     // 'only' '('\n    case 17607:                     // 'option' '('\n    case 17608:                     // 'or' '('\n    case 17609:                     // 'order' '('\n    case 17610:                     // 'ordered' '('\n    case 17611:                     // 'ordering' '('\n    case 17614:                     // 'parent' '('\n    case 17620:                     // 'preceding' '('\n    case 17621:                     // 'preceding-sibling' '('\n    case 17626:                     // 'rename' '('\n    case 17627:                     // 'replace' '('\n    case 17628:                     // 'return' '('\n    case 17629:                     // 'returning' '('\n    case 17630:                     // 'revalidation' '('\n    case 17632:                     // 'satisfies' '('\n    case 17633:                     // 'schema' '('\n    case 17636:                     // 'score' '('\n    case 17637:                     // 'self' '('\n    case 17642:                     // 'sliding' '('\n    case 17643:                     // 'some' '('\n    case 17644:                     // 'stable' '('\n    case 17645:                     // 'start' '('\n    case 17648:                     // 'strict' '('\n    case 17656:                     // 'to' '('\n    case 17657:                     // 'treat' '('\n    case 17658:                     // 'try' '('\n    case 17659:                     // 'tumbling' '('\n    case 17660:                     // 'type' '('\n    case 17662:                     // 'union' '('\n    case 17664:                     // 'unordered' '('\n    case 17665:                     // 'updating' '('\n    case 17668:                     // 'validate' '('\n    case 17669:                     // 'value' '('\n    case 17670:                     // 'variable' '('\n    case 17671:                     // 'version' '('\n    case 17674:                     // 'where' '('\n    case 17675:                     // 'while' '('\n    case 17678:                     // 'with' '('\n    case 17682:                     // 'xquery' '('\n      parse_FunctionCall();\n      break;\n    case 141514:                    // 'ordered' '{'\n      parse_OrderedExpr();\n      break;\n    case 141568:                    // 'unordered' '{'\n      parse_UnorderedExpr();\n      break;\n    case 32:                        // '%'\n    case 78:                        // 'array'\n    case 120:                       // 'document-node'\n    case 124:                       // 'empty-sequence'\n    case 145:                       // 'function'\n    case 152:                       // 'if'\n    case 165:                       // 'item'\n    case 167:                       // 'json-item'\n    case 185:                       // 'namespace-node'\n    case 191:                       // 'node'\n    case 226:                       // 'schema-attribute'\n    case 227:                       // 'schema-element'\n    case 242:                       // 'structured-item'\n    case 243:                       // 'switch'\n    case 253:                       // 'typeswitch'\n    case 14854:                     // EQName^Token '#'\n    case 14918:                     // 'after' '#'\n    case 14920:                     // 'allowing' '#'\n    case 14921:                     // 'ancestor' '#'\n    case 14922:                     // 'ancestor-or-self' '#'\n    case 14923:                     // 'and' '#'\n    case 14925:                     // 'append' '#'\n    case 14927:                     // 'as' '#'\n    case 14928:                     // 'ascending' '#'\n    case 14929:                     // 'at' '#'\n    case 14930:                     // 'attribute' '#'\n    case 14931:                     // 'base-uri' '#'\n    case 14932:                     // 'before' '#'\n    case 14933:                     // 'boundary-space' '#'\n    case 14934:                     // 'break' '#'\n    case 14936:                     // 'case' '#'\n    case 14937:                     // 'cast' '#'\n    case 14938:                     // 'castable' '#'\n    case 14939:                     // 'catch' '#'\n    case 14941:                     // 'child' '#'\n    case 14942:                     // 'collation' '#'\n    case 14944:                     // 'comment' '#'\n    case 14945:                     // 'constraint' '#'\n    case 14946:                     // 'construction' '#'\n    case 14949:                     // 'context' '#'\n    case 14950:                     // 'continue' '#'\n    case 14951:                     // 'copy' '#'\n    case 14952:                     // 'copy-namespaces' '#'\n    case 14953:                     // 'count' '#'\n    case 14954:                     // 'decimal-format' '#'\n    case 14956:                     // 'declare' '#'\n    case 14957:                     // 'default' '#'\n    case 14958:                     // 'delete' '#'\n    case 14959:                     // 'descendant' '#'\n    case 14960:                     // 'descendant-or-self' '#'\n    case 14961:                     // 'descending' '#'\n    case 14966:                     // 'div' '#'\n    case 14967:                     // 'document' '#'\n    case 14969:                     // 'element' '#'\n    case 14970:                     // 'else' '#'\n    case 14971:                     // 'empty' '#'\n    case 14973:                     // 'encoding' '#'\n    case 14974:                     // 'end' '#'\n    case 14976:                     // 'eq' '#'\n    case 14977:                     // 'every' '#'\n    case 14979:                     // 'except' '#'\n    case 14980:                     // 'exit' '#'\n    case 14981:                     // 'external' '#'\n    case 14982:                     // 'first' '#'\n    case 14983:                     // 'following' '#'\n    case 14984:                     // 'following-sibling' '#'\n    case 14985:                     // 'for' '#'\n    case 14989:                     // 'ft-option' '#'\n    case 14994:                     // 'ge' '#'\n    case 14996:                     // 'group' '#'\n    case 14998:                     // 'gt' '#'\n    case 14999:                     // 'idiv' '#'\n    case 15001:                     // 'import' '#'\n    case 15002:                     // 'in' '#'\n    case 15003:                     // 'index' '#'\n    case 15007:                     // 'insert' '#'\n    case 15008:                     // 'instance' '#'\n    case 15009:                     // 'integrity' '#'\n    case 15010:                     // 'intersect' '#'\n    case 15011:                     // 'into' '#'\n    case 15012:                     // 'is' '#'\n    case 15014:                     // 'json' '#'\n    case 15018:                     // 'last' '#'\n    case 15019:                     // 'lax' '#'\n    case 15020:                     // 'le' '#'\n    case 15022:                     // 'let' '#'\n    case 15024:                     // 'loop' '#'\n    case 15026:                     // 'lt' '#'\n    case 15028:                     // 'mod' '#'\n    case 15029:                     // 'modify' '#'\n    case 15030:                     // 'module' '#'\n    case 15032:                     // 'namespace' '#'\n    case 15034:                     // 'ne' '#'\n    case 15040:                     // 'nodes' '#'\n    case 15042:                     // 'object' '#'\n    case 15046:                     // 'only' '#'\n    case 15047:                     // 'option' '#'\n    case 15048:                     // 'or' '#'\n    case 15049:                     // 'order' '#'\n    case 15050:                     // 'ordered' '#'\n    case 15051:                     // 'ordering' '#'\n    case 15054:                     // 'parent' '#'\n    case 15060:                     // 'preceding' '#'\n    case 15061:                     // 'preceding-sibling' '#'\n    case 15064:                     // 'processing-instruction' '#'\n    case 15066:                     // 'rename' '#'\n    case 15067:                     // 'replace' '#'\n    case 15068:                     // 'return' '#'\n    case 15069:                     // 'returning' '#'\n    case 15070:                     // 'revalidation' '#'\n    case 15072:                     // 'satisfies' '#'\n    case 15073:                     // 'schema' '#'\n    case 15076:                     // 'score' '#'\n    case 15077:                     // 'self' '#'\n    case 15082:                     // 'sliding' '#'\n    case 15083:                     // 'some' '#'\n    case 15084:                     // 'stable' '#'\n    case 15085:                     // 'start' '#'\n    case 15088:                     // 'strict' '#'\n    case 15092:                     // 'text' '#'\n    case 15096:                     // 'to' '#'\n    case 15097:                     // 'treat' '#'\n    case 15098:                     // 'try' '#'\n    case 15099:                     // 'tumbling' '#'\n    case 15100:                     // 'type' '#'\n    case 15102:                     // 'union' '#'\n    case 15104:                     // 'unordered' '#'\n    case 15105:                     // 'updating' '#'\n    case 15108:                     // 'validate' '#'\n    case 15109:                     // 'value' '#'\n    case 15110:                     // 'variable' '#'\n    case 15111:                     // 'version' '#'\n    case 15114:                     // 'where' '#'\n    case 15115:                     // 'while' '#'\n    case 15118:                     // 'with' '#'\n    case 15122:                     // 'xquery' '#'\n      parse_FunctionItemExpr();\n      break;\n    case -10:\n    case 27412:                     // '{' ';'\n      parse_BlockExpr();\n      break;\n    case -11:\n      parse_ObjectConstructor();\n      break;\n    case 68:                        // '['\n      parse_ArrayConstructor();\n      break;\n    case 278:                       // '{|'\n      parse_JSONSimpleObjectUnion();\n      break;\n    default:\n      parse_Constructor();\n    }\n    eventHandler.endNonterminal(\"PrimaryExpr\", e0);\n  }\n\n  function try_PrimaryExpr()\n  {\n    switch (l1)\n    {\n    case 184:                       // 'namespace'\n      lookahead2W(256);             // NCName^Token | S^WS | '#' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    case 216:                       // 'processing-instruction'\n      lookahead2W(254);             // NCName^Token | S^WS | '#' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    case 276:                       // '{'\n      lookahead2W(277);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      break;\n    case 82:                        // 'attribute'\n    case 121:                       // 'element'\n      lookahead2W(259);             // EQName^Token | S^WS | '#' | '(:' | 'after' | 'allowing' | 'ancestor' |\n      break;\n    case 96:                        // 'comment'\n    case 244:                       // 'text'\n      lookahead2W(93);              // S^WS | '#' | '(:' | '{'\n      break;\n    case 119:                       // 'document'\n    case 202:                       // 'ordered'\n    case 256:                       // 'unordered'\n      lookahead2W(139);             // S^WS | '#' | '(' | '(:' | '{'\n      break;\n    case 6:                         // EQName^Token\n    case 70:                        // 'after'\n    case 72:                        // 'allowing'\n    case 73:                        // 'ancestor'\n    case 74:                        // 'ancestor-or-self'\n    case 75:                        // 'and'\n    case 77:                        // 'append'\n    case 79:                        // 'as'\n    case 80:                        // 'ascending'\n    case 81:                        // 'at'\n    case 83:                        // 'base-uri'\n    case 84:                        // 'before'\n    case 85:                        // 'boundary-space'\n    case 86:                        // 'break'\n    case 88:                        // 'case'\n    case 89:                        // 'cast'\n    case 90:                        // 'castable'\n    case 91:                        // 'catch'\n    case 93:                        // 'child'\n    case 94:                        // 'collation'\n    case 97:                        // 'constraint'\n    case 98:                        // 'construction'\n    case 101:                       // 'context'\n    case 102:                       // 'continue'\n    case 103:                       // 'copy'\n    case 104:                       // 'copy-namespaces'\n    case 105:                       // 'count'\n    case 106:                       // 'decimal-format'\n    case 108:                       // 'declare'\n    case 109:                       // 'default'\n    case 110:                       // 'delete'\n    case 111:                       // 'descendant'\n    case 112:                       // 'descendant-or-self'\n    case 113:                       // 'descending'\n    case 118:                       // 'div'\n    case 122:                       // 'else'\n    case 123:                       // 'empty'\n    case 125:                       // 'encoding'\n    case 126:                       // 'end'\n    case 128:                       // 'eq'\n    case 129:                       // 'every'\n    case 131:                       // 'except'\n    case 132:                       // 'exit'\n    case 133:                       // 'external'\n    case 134:                       // 'first'\n    case 135:                       // 'following'\n    case 136:                       // 'following-sibling'\n    case 137:                       // 'for'\n    case 141:                       // 'ft-option'\n    case 146:                       // 'ge'\n    case 148:                       // 'group'\n    case 150:                       // 'gt'\n    case 151:                       // 'idiv'\n    case 153:                       // 'import'\n    case 154:                       // 'in'\n    case 155:                       // 'index'\n    case 159:                       // 'insert'\n    case 160:                       // 'instance'\n    case 161:                       // 'integrity'\n    case 162:                       // 'intersect'\n    case 163:                       // 'into'\n    case 164:                       // 'is'\n    case 166:                       // 'json'\n    case 170:                       // 'last'\n    case 171:                       // 'lax'\n    case 172:                       // 'le'\n    case 174:                       // 'let'\n    case 176:                       // 'loop'\n    case 178:                       // 'lt'\n    case 180:                       // 'mod'\n    case 181:                       // 'modify'\n    case 182:                       // 'module'\n    case 186:                       // 'ne'\n    case 192:                       // 'nodes'\n    case 194:                       // 'object'\n    case 198:                       // 'only'\n    case 199:                       // 'option'\n    case 200:                       // 'or'\n    case 201:                       // 'order'\n    case 203:                       // 'ordering'\n    case 206:                       // 'parent'\n    case 212:                       // 'preceding'\n    case 213:                       // 'preceding-sibling'\n    case 218:                       // 'rename'\n    case 219:                       // 'replace'\n    case 220:                       // 'return'\n    case 221:                       // 'returning'\n    case 222:                       // 'revalidation'\n    case 224:                       // 'satisfies'\n    case 225:                       // 'schema'\n    case 228:                       // 'score'\n    case 229:                       // 'self'\n    case 234:                       // 'sliding'\n    case 235:                       // 'some'\n    case 236:                       // 'stable'\n    case 237:                       // 'start'\n    case 240:                       // 'strict'\n    case 248:                       // 'to'\n    case 249:                       // 'treat'\n    case 250:                       // 'try'\n    case 251:                       // 'tumbling'\n    case 252:                       // 'type'\n    case 254:                       // 'union'\n    case 257:                       // 'updating'\n    case 260:                       // 'validate'\n    case 261:                       // 'value'\n    case 262:                       // 'variable'\n    case 263:                       // 'version'\n    case 266:                       // 'where'\n    case 267:                       // 'while'\n    case 270:                       // 'with'\n    case 274:                       // 'xquery'\n      lookahead2W(92);              // S^WS | '#' | '(' | '(:'\n      break;\n    default:\n      lk = l1;\n    }\n    if (lk == 2836                  // '{' Wildcard\n     || lk == 3348                  // '{' EQName^Token\n     || lk == 4372                  // '{' IntegerLiteral\n     || lk == 4884                  // '{' DecimalLiteral\n     || lk == 5396                  // '{' DoubleLiteral\n     || lk == 5908                  // '{' StringLiteral\n     || lk == 16148                 // '{' '$'\n     || lk == 16660                 // '{' '%'\n     || lk == 17684                 // '{' '('\n     || lk == 18196                 // '{' '(#'\n     || lk == 20756                 // '{' '+'\n     || lk == 21780                 // '{' '-'\n     || lk == 22804                 // '{' '.'\n     || lk == 23316                 // '{' '..'\n     || lk == 23828                 // '{' '/'\n     || lk == 24340                 // '{' '//'\n     || lk == 27924                 // '{' '<'\n     || lk == 28436                 // '{' '<!--'\n     || lk == 30484                 // '{' '<?'\n     || lk == 34068                 // '{' '@'\n     || lk == 35092                 // '{' '['\n     || lk == 36116                 // '{' 'after'\n     || lk == 37140                 // '{' 'allowing'\n     || lk == 37652                 // '{' 'ancestor'\n     || lk == 38164                 // '{' 'ancestor-or-self'\n     || lk == 38676                 // '{' 'and'\n     || lk == 39700                 // '{' 'append'\n     || lk == 40212                 // '{' 'array'\n     || lk == 40724                 // '{' 'as'\n     || lk == 41236                 // '{' 'ascending'\n     || lk == 41748                 // '{' 'at'\n     || lk == 42260                 // '{' 'attribute'\n     || lk == 42772                 // '{' 'base-uri'\n     || lk == 43284                 // '{' 'before'\n     || lk == 43796                 // '{' 'boundary-space'\n     || lk == 44308                 // '{' 'break'\n     || lk == 45332                 // '{' 'case'\n     || lk == 45844                 // '{' 'cast'\n     || lk == 46356                 // '{' 'castable'\n     || lk == 46868                 // '{' 'catch'\n     || lk == 47892                 // '{' 'child'\n     || lk == 48404                 // '{' 'collation'\n     || lk == 49428                 // '{' 'comment'\n     || lk == 49940                 // '{' 'constraint'\n     || lk == 50452                 // '{' 'construction'\n     || lk == 51988                 // '{' 'context'\n     || lk == 52500                 // '{' 'continue'\n     || lk == 53012                 // '{' 'copy'\n     || lk == 53524                 // '{' 'copy-namespaces'\n     || lk == 54036                 // '{' 'count'\n     || lk == 54548                 // '{' 'decimal-format'\n     || lk == 55572                 // '{' 'declare'\n     || lk == 56084                 // '{' 'default'\n     || lk == 56596                 // '{' 'delete'\n     || lk == 57108                 // '{' 'descendant'\n     || lk == 57620                 // '{' 'descendant-or-self'\n     || lk == 58132                 // '{' 'descending'\n     || lk == 60692                 // '{' 'div'\n     || lk == 61204                 // '{' 'document'\n     || lk == 61716                 // '{' 'document-node'\n     || lk == 62228                 // '{' 'element'\n     || lk == 62740                 // '{' 'else'\n     || lk == 63252                 // '{' 'empty'\n     || lk == 63764                 // '{' 'empty-sequence'\n     || lk == 64276                 // '{' 'encoding'\n     || lk == 64788                 // '{' 'end'\n     || lk == 65812                 // '{' 'eq'\n     || lk == 66324                 // '{' 'every'\n     || lk == 67348                 // '{' 'except'\n     || lk == 67860                 // '{' 'exit'\n     || lk == 68372                 // '{' 'external'\n     || lk == 68884                 // '{' 'first'\n     || lk == 69396                 // '{' 'following'\n     || lk == 69908                 // '{' 'following-sibling'\n     || lk == 70420                 // '{' 'for'\n     || lk == 72468                 // '{' 'ft-option'\n     || lk == 74516                 // '{' 'function'\n     || lk == 75028                 // '{' 'ge'\n     || lk == 76052                 // '{' 'group'\n     || lk == 77076                 // '{' 'gt'\n     || lk == 77588                 // '{' 'idiv'\n     || lk == 78100                 // '{' 'if'\n     || lk == 78612                 // '{' 'import'\n     || lk == 79124                 // '{' 'in'\n     || lk == 79636                 // '{' 'index'\n     || lk == 81684                 // '{' 'insert'\n     || lk == 82196                 // '{' 'instance'\n     || lk == 82708                 // '{' 'integrity'\n     || lk == 83220                 // '{' 'intersect'\n     || lk == 83732                 // '{' 'into'\n     || lk == 84244                 // '{' 'is'\n     || lk == 84756                 // '{' 'item'\n     || lk == 85268                 // '{' 'json'\n     || lk == 85780                 // '{' 'json-item'\n     || lk == 87316                 // '{' 'last'\n     || lk == 87828                 // '{' 'lax'\n     || lk == 88340                 // '{' 'le'\n     || lk == 89364                 // '{' 'let'\n     || lk == 90388                 // '{' 'loop'\n     || lk == 91412                 // '{' 'lt'\n     || lk == 92436                 // '{' 'mod'\n     || lk == 92948                 // '{' 'modify'\n     || lk == 93460                 // '{' 'module'\n     || lk == 94484                 // '{' 'namespace'\n     || lk == 94996                 // '{' 'namespace-node'\n     || lk == 95508                 // '{' 'ne'\n     || lk == 98068                 // '{' 'node'\n     || lk == 98580                 // '{' 'nodes'\n     || lk == 99604                 // '{' 'object'\n     || lk == 101652                // '{' 'only'\n     || lk == 102164                // '{' 'option'\n     || lk == 102676                // '{' 'or'\n     || lk == 103188                // '{' 'order'\n     || lk == 103700                // '{' 'ordered'\n     || lk == 104212                // '{' 'ordering'\n     || lk == 105748                // '{' 'parent'\n     || lk == 108820                // '{' 'preceding'\n     || lk == 109332                // '{' 'preceding-sibling'\n     || lk == 110868                // '{' 'processing-instruction'\n     || lk == 111892                // '{' 'rename'\n     || lk == 112404                // '{' 'replace'\n     || lk == 112916                // '{' 'return'\n     || lk == 113428                // '{' 'returning'\n     || lk == 113940                // '{' 'revalidation'\n     || lk == 114964                // '{' 'satisfies'\n     || lk == 115476                // '{' 'schema'\n     || lk == 115988                // '{' 'schema-attribute'\n     || lk == 116500                // '{' 'schema-element'\n     || lk == 117012                // '{' 'score'\n     || lk == 117524                // '{' 'self'\n     || lk == 120084                // '{' 'sliding'\n     || lk == 120596                // '{' 'some'\n     || lk == 121108                // '{' 'stable'\n     || lk == 121620                // '{' 'start'\n     || lk == 123156                // '{' 'strict'\n     || lk == 124180                // '{' 'structured-item'\n     || lk == 124692                // '{' 'switch'\n     || lk == 125204                // '{' 'text'\n     || lk == 127252                // '{' 'to'\n     || lk == 127764                // '{' 'treat'\n     || lk == 128276                // '{' 'try'\n     || lk == 128788                // '{' 'tumbling'\n     || lk == 129300                // '{' 'type'\n     || lk == 129812                // '{' 'typeswitch'\n     || lk == 130324                // '{' 'union'\n     || lk == 131348                // '{' 'unordered'\n     || lk == 131860                // '{' 'updating'\n     || lk == 133396                // '{' 'validate'\n     || lk == 133908                // '{' 'value'\n     || lk == 134420                // '{' 'variable'\n     || lk == 134932                // '{' 'version'\n     || lk == 136468                // '{' 'where'\n     || lk == 136980                // '{' 'while'\n     || lk == 138516                // '{' 'with'\n     || lk == 140564                // '{' 'xquery'\n     || lk == 141588                // '{' '{'\n     || lk == 142612                // '{' '{|'\n     || lk == 144660)               // '{' '}'\n    {\n      lk = memoized(14, e0);\n      if (lk == 0)\n      {\n        var b0A = b0; var e0A = e0; var l1A = l1;\n        var b1A = b1; var e1A = e1; var l2A = l2;\n        var b2A = b2; var e2A = e2;\n        try\n        {\n          try_BlockExpr();\n          memoize(14, e0A, -10);\n          lk = -14;\n        }\n        catch (p10A)\n        {\n          lk = -11;\n          b0 = b0A; e0 = e0A; l1 = l1A; if (l1 == 0) {end = e0A;} else {\n          b1 = b1A; e1 = e1A; l2 = l2A; if (l2 == 0) {end = e1A;} else {\n          b2 = b2A; e2 = e2A; end = e2A; }}\n          memoize(14, e0A, -11);\n        }\n      }\n    }\n    switch (lk)\n    {\n    case 8:                         // IntegerLiteral\n    case 9:                         // DecimalLiteral\n    case 10:                        // DoubleLiteral\n    case 11:                        // StringLiteral\n      try_Literal();\n      break;\n    case 31:                        // '$'\n      try_VarRef();\n      break;\n    case 34:                        // '('\n      try_ParenthesizedExpr();\n      break;\n    case 44:                        // '.'\n      try_ContextItemExpr();\n      break;\n    case 17414:                     // EQName^Token '('\n    case 17478:                     // 'after' '('\n    case 17480:                     // 'allowing' '('\n    case 17481:                     // 'ancestor' '('\n    case 17482:                     // 'ancestor-or-self' '('\n    case 17483:                     // 'and' '('\n    case 17485:                     // 'append' '('\n    case 17487:                     // 'as' '('\n    case 17488:                     // 'ascending' '('\n    case 17489:                     // 'at' '('\n    case 17491:                     // 'base-uri' '('\n    case 17492:                     // 'before' '('\n    case 17493:                     // 'boundary-space' '('\n    case 17494:                     // 'break' '('\n    case 17496:                     // 'case' '('\n    case 17497:                     // 'cast' '('\n    case 17498:                     // 'castable' '('\n    case 17499:                     // 'catch' '('\n    case 17501:                     // 'child' '('\n    case 17502:                     // 'collation' '('\n    case 17505:                     // 'constraint' '('\n    case 17506:                     // 'construction' '('\n    case 17509:                     // 'context' '('\n    case 17510:                     // 'continue' '('\n    case 17511:                     // 'copy' '('\n    case 17512:                     // 'copy-namespaces' '('\n    case 17513:                     // 'count' '('\n    case 17514:                     // 'decimal-format' '('\n    case 17516:                     // 'declare' '('\n    case 17517:                     // 'default' '('\n    case 17518:                     // 'delete' '('\n    case 17519:                     // 'descendant' '('\n    case 17520:                     // 'descendant-or-self' '('\n    case 17521:                     // 'descending' '('\n    case 17526:                     // 'div' '('\n    case 17527:                     // 'document' '('\n    case 17530:                     // 'else' '('\n    case 17531:                     // 'empty' '('\n    case 17533:                     // 'encoding' '('\n    case 17534:                     // 'end' '('\n    case 17536:                     // 'eq' '('\n    case 17537:                     // 'every' '('\n    case 17539:                     // 'except' '('\n    case 17540:                     // 'exit' '('\n    case 17541:                     // 'external' '('\n    case 17542:                     // 'first' '('\n    case 17543:                     // 'following' '('\n    case 17544:                     // 'following-sibling' '('\n    case 17545:                     // 'for' '('\n    case 17549:                     // 'ft-option' '('\n    case 17554:                     // 'ge' '('\n    case 17556:                     // 'group' '('\n    case 17558:                     // 'gt' '('\n    case 17559:                     // 'idiv' '('\n    case 17561:                     // 'import' '('\n    case 17562:                     // 'in' '('\n    case 17563:                     // 'index' '('\n    case 17567:                     // 'insert' '('\n    case 17568:                     // 'instance' '('\n    case 17569:                     // 'integrity' '('\n    case 17570:                     // 'intersect' '('\n    case 17571:                     // 'into' '('\n    case 17572:                     // 'is' '('\n    case 17574:                     // 'json' '('\n    case 17578:                     // 'last' '('\n    case 17579:                     // 'lax' '('\n    case 17580:                     // 'le' '('\n    case 17582:                     // 'let' '('\n    case 17584:                     // 'loop' '('\n    case 17586:                     // 'lt' '('\n    case 17588:                     // 'mod' '('\n    case 17589:                     // 'modify' '('\n    case 17590:                     // 'module' '('\n    case 17592:                     // 'namespace' '('\n    case 17594:                     // 'ne' '('\n    case 17600:                     // 'nodes' '('\n    case 17602:                     // 'object' '('\n    case 17606:                     // 'only' '('\n    case 17607:                     // 'option' '('\n    case 17608:                     // 'or' '('\n    case 17609:                     // 'order' '('\n    case 17610:                     // 'ordered' '('\n    case 17611:                     // 'ordering' '('\n    case 17614:                     // 'parent' '('\n    case 17620:                     // 'preceding' '('\n    case 17621:                     // 'preceding-sibling' '('\n    case 17626:                     // 'rename' '('\n    case 17627:                     // 'replace' '('\n    case 17628:                     // 'return' '('\n    case 17629:                     // 'returning' '('\n    case 17630:                     // 'revalidation' '('\n    case 17632:                     // 'satisfies' '('\n    case 17633:                     // 'schema' '('\n    case 17636:                     // 'score' '('\n    case 17637:                     // 'self' '('\n    case 17642:                     // 'sliding' '('\n    case 17643:                     // 'some' '('\n    case 17644:                     // 'stable' '('\n    case 17645:                     // 'start' '('\n    case 17648:                     // 'strict' '('\n    case 17656:                     // 'to' '('\n    case 17657:                     // 'treat' '('\n    case 17658:                     // 'try' '('\n    case 17659:                     // 'tumbling' '('\n    case 17660:                     // 'type' '('\n    case 17662:                     // 'union' '('\n    case 17664:                     // 'unordered' '('\n    case 17665:                     // 'updating' '('\n    case 17668:                     // 'validate' '('\n    case 17669:                     // 'value' '('\n    case 17670:                     // 'variable' '('\n    case 17671:                     // 'version' '('\n    case 17674:                     // 'where' '('\n    case 17675:                     // 'while' '('\n    case 17678:                     // 'with' '('\n    case 17682:                     // 'xquery' '('\n      try_FunctionCall();\n      break;\n    case 141514:                    // 'ordered' '{'\n      try_OrderedExpr();\n      break;\n    case 141568:                    // 'unordered' '{'\n      try_UnorderedExpr();\n      break;\n    case 32:                        // '%'\n    case 78:                        // 'array'\n    case 120:                       // 'document-node'\n    case 124:                       // 'empty-sequence'\n    case 145:                       // 'function'\n    case 152:                       // 'if'\n    case 165:                       // 'item'\n    case 167:                       // 'json-item'\n    case 185:                       // 'namespace-node'\n    case 191:                       // 'node'\n    case 226:                       // 'schema-attribute'\n    case 227:                       // 'schema-element'\n    case 242:                       // 'structured-item'\n    case 243:                       // 'switch'\n    case 253:                       // 'typeswitch'\n    case 14854:                     // EQName^Token '#'\n    case 14918:                     // 'after' '#'\n    case 14920:                     // 'allowing' '#'\n    case 14921:                     // 'ancestor' '#'\n    case 14922:                     // 'ancestor-or-self' '#'\n    case 14923:                     // 'and' '#'\n    case 14925:                     // 'append' '#'\n    case 14927:                     // 'as' '#'\n    case 14928:                     // 'ascending' '#'\n    case 14929:                     // 'at' '#'\n    case 14930:                     // 'attribute' '#'\n    case 14931:                     // 'base-uri' '#'\n    case 14932:                     // 'before' '#'\n    case 14933:                     // 'boundary-space' '#'\n    case 14934:                     // 'break' '#'\n    case 14936:                     // 'case' '#'\n    case 14937:                     // 'cast' '#'\n    case 14938:                     // 'castable' '#'\n    case 14939:                     // 'catch' '#'\n    case 14941:                     // 'child' '#'\n    case 14942:                     // 'collation' '#'\n    case 14944:                     // 'comment' '#'\n    case 14945:                     // 'constraint' '#'\n    case 14946:                     // 'construction' '#'\n    case 14949:                     // 'context' '#'\n    case 14950:                     // 'continue' '#'\n    case 14951:                     // 'copy' '#'\n    case 14952:                     // 'copy-namespaces' '#'\n    case 14953:                     // 'count' '#'\n    case 14954:                     // 'decimal-format' '#'\n    case 14956:                     // 'declare' '#'\n    case 14957:                     // 'default' '#'\n    case 14958:                     // 'delete' '#'\n    case 14959:                     // 'descendant' '#'\n    case 14960:                     // 'descendant-or-self' '#'\n    case 14961:                     // 'descending' '#'\n    case 14966:                     // 'div' '#'\n    case 14967:                     // 'document' '#'\n    case 14969:                     // 'element' '#'\n    case 14970:                     // 'else' '#'\n    case 14971:                     // 'empty' '#'\n    case 14973:                     // 'encoding' '#'\n    case 14974:                     // 'end' '#'\n    case 14976:                     // 'eq' '#'\n    case 14977:                     // 'every' '#'\n    case 14979:                     // 'except' '#'\n    case 14980:                     // 'exit' '#'\n    case 14981:                     // 'external' '#'\n    case 14982:                     // 'first' '#'\n    case 14983:                     // 'following' '#'\n    case 14984:                     // 'following-sibling' '#'\n    case 14985:                     // 'for' '#'\n    case 14989:                     // 'ft-option' '#'\n    case 14994:                     // 'ge' '#'\n    case 14996:                     // 'group' '#'\n    case 14998:                     // 'gt' '#'\n    case 14999:                     // 'idiv' '#'\n    case 15001:                     // 'import' '#'\n    case 15002:                     // 'in' '#'\n    case 15003:                     // 'index' '#'\n    case 15007:                     // 'insert' '#'\n    case 15008:                     // 'instance' '#'\n    case 15009:                     // 'integrity' '#'\n    case 15010:                     // 'intersect' '#'\n    case 15011:                     // 'into' '#'\n    case 15012:                     // 'is' '#'\n    case 15014:                     // 'json' '#'\n    case 15018:                     // 'last' '#'\n    case 15019:                     // 'lax' '#'\n    case 15020:                     // 'le' '#'\n    case 15022:                     // 'let' '#'\n    case 15024:                     // 'loop' '#'\n    case 15026:                     // 'lt' '#'\n    case 15028:                     // 'mod' '#'\n    case 15029:                     // 'modify' '#'\n    case 15030:                     // 'module' '#'\n    case 15032:                     // 'namespace' '#'\n    case 15034:                     // 'ne' '#'\n    case 15040:                     // 'nodes' '#'\n    case 15042:                     // 'object' '#'\n    case 15046:                     // 'only' '#'\n    case 15047:                     // 'option' '#'\n    case 15048:                     // 'or' '#'\n    case 15049:                     // 'order' '#'\n    case 15050:                     // 'ordered' '#'\n    case 15051:                     // 'ordering' '#'\n    case 15054:                     // 'parent' '#'\n    case 15060:                     // 'preceding' '#'\n    case 15061:                     // 'preceding-sibling' '#'\n    case 15064:                     // 'processing-instruction' '#'\n    case 15066:                     // 'rename' '#'\n    case 15067:                     // 'replace' '#'\n    case 15068:                     // 'return' '#'\n    case 15069:                     // 'returning' '#'\n    case 15070:                     // 'revalidation' '#'\n    case 15072:                     // 'satisfies' '#'\n    case 15073:                     // 'schema' '#'\n    case 15076:                     // 'score' '#'\n    case 15077:                     // 'self' '#'\n    case 15082:                     // 'sliding' '#'\n    case 15083:                     // 'some' '#'\n    case 15084:                     // 'stable' '#'\n    case 15085:                     // 'start' '#'\n    case 15088:                     // 'strict' '#'\n    case 15092:                     // 'text' '#'\n    case 15096:                     // 'to' '#'\n    case 15097:                     // 'treat' '#'\n    case 15098:                     // 'try' '#'\n    case 15099:                     // 'tumbling' '#'\n    case 15100:                     // 'type' '#'\n    case 15102:                     // 'union' '#'\n    case 15104:                     // 'unordered' '#'\n    case 15105:                     // 'updating' '#'\n    case 15108:                     // 'validate' '#'\n    case 15109:                     // 'value' '#'\n    case 15110:                     // 'variable' '#'\n    case 15111:                     // 'version' '#'\n    case 15114:                     // 'where' '#'\n    case 15115:                     // 'while' '#'\n    case 15118:                     // 'with' '#'\n    case 15122:                     // 'xquery' '#'\n      try_FunctionItemExpr();\n      break;\n    case -10:\n    case 27412:                     // '{' ';'\n      try_BlockExpr();\n      break;\n    case -11:\n      try_ObjectConstructor();\n      break;\n    case 68:                        // '['\n      try_ArrayConstructor();\n      break;\n    case 278:                       // '{|'\n      try_JSONSimpleObjectUnion();\n      break;\n    case -14:\n      break;\n    default:\n      try_Constructor();\n    }\n  }\n\n  function parse_JSONSimpleObjectUnion()\n  {\n    eventHandler.startNonterminal(\"JSONSimpleObjectUnion\", e0);\n    shift(278);                     // '{|'\n    lookahead1W(273);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    if (l1 != 281)                  // '|}'\n    {\n      whitespace();\n      parse_Expr();\n    }\n    shift(281);                     // '|}'\n    eventHandler.endNonterminal(\"JSONSimpleObjectUnion\", e0);\n  }\n\n  function try_JSONSimpleObjectUnion()\n  {\n    shiftT(278);                    // '{|'\n    lookahead1W(273);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    if (l1 != 281)                  // '|}'\n    {\n      try_Expr();\n    }\n    shiftT(281);                    // '|}'\n  }\n\n  function parse_ObjectConstructor()\n  {\n    eventHandler.startNonterminal(\"ObjectConstructor\", e0);\n    shift(276);                     // '{'\n    lookahead1W(274);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    if (l1 != 282)                  // '}'\n    {\n      whitespace();\n      parse_PairConstructorList();\n    }\n    shift(282);                     // '}'\n    eventHandler.endNonterminal(\"ObjectConstructor\", e0);\n  }\n\n  function try_ObjectConstructor()\n  {\n    shiftT(276);                    // '{'\n    lookahead1W(274);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    if (l1 != 282)                  // '}'\n    {\n      try_PairConstructorList();\n    }\n    shiftT(282);                    // '}'\n  }\n\n  function parse_PairConstructorList()\n  {\n    eventHandler.startNonterminal(\"PairConstructorList\", e0);\n    parse_PairConstructor();\n    for (;;)\n    {\n      if (l1 != 41)                 // ','\n      {\n        break;\n      }\n      shift(41);                    // ','\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_PairConstructor();\n    }\n    eventHandler.endNonterminal(\"PairConstructorList\", e0);\n  }\n\n  function try_PairConstructorList()\n  {\n    try_PairConstructor();\n    for (;;)\n    {\n      if (l1 != 41)                 // ','\n      {\n        break;\n      }\n      shiftT(41);                   // ','\n      lookahead1W(267);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      try_PairConstructor();\n    }\n  }\n\n  function parse_PairConstructor()\n  {\n    eventHandler.startNonterminal(\"PairConstructor\", e0);\n    parse_ExprSingle();\n    shift(49);                      // ':'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_ExprSingle();\n    eventHandler.endNonterminal(\"PairConstructor\", e0);\n  }\n\n  function try_PairConstructor()\n  {\n    try_ExprSingle();\n    shiftT(49);                     // ':'\n    lookahead1W(267);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_ExprSingle();\n  }\n\n  function parse_ArrayConstructor()\n  {\n    eventHandler.startNonterminal(\"ArrayConstructor\", e0);\n    shift(68);                      // '['\n    lookahead1W(272);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    if (l1 != 69)                   // ']'\n    {\n      whitespace();\n      parse_Expr();\n    }\n    shift(69);                      // ']'\n    eventHandler.endNonterminal(\"ArrayConstructor\", e0);\n  }\n\n  function try_ArrayConstructor()\n  {\n    shiftT(68);                     // '['\n    lookahead1W(272);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    if (l1 != 69)                   // ']'\n    {\n      try_Expr();\n    }\n    shiftT(69);                     // ']'\n  }\n\n  function parse_BlockExpr()\n  {\n    eventHandler.startNonterminal(\"BlockExpr\", e0);\n    shift(276);                     // '{'\n    lookahead1W(277);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    whitespace();\n    parse_StatementsAndOptionalExpr();\n    shift(282);                     // '}'\n    eventHandler.endNonterminal(\"BlockExpr\", e0);\n  }\n\n  function try_BlockExpr()\n  {\n    shiftT(276);                    // '{'\n    lookahead1W(277);               // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n    try_StatementsAndOptionalExpr();\n    shiftT(282);                    // '}'\n  }\n\n  function parse_FunctionDecl()\n  {\n    eventHandler.startNonterminal(\"FunctionDecl\", e0);\n    shift(145);                     // 'function'\n    lookahead1W(255);               // EQName^Token | S^WS | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_EQName();\n    lookahead1W(22);                // S^WS | '(' | '(:'\n    shift(34);                      // '('\n    lookahead1W(94);                // S^WS | '$' | '(:' | ')'\n    if (l1 == 31)                   // '$'\n    {\n      whitespace();\n      parse_ParamList();\n    }\n    shift(37);                      // ')'\n    lookahead1W(148);               // S^WS | '(:' | 'as' | 'external' | '{'\n    if (l1 == 79)                   // 'as'\n    {\n      whitespace();\n      parse_ReturnType();\n    }\n    lookahead1W(118);               // S^WS | '(:' | 'external' | '{'\n    switch (l1)\n    {\n    case 276:                       // '{'\n      shift(276);                   // '{'\n      lookahead1W(277);             // Wildcard | EQName^Token | IntegerLiteral | DecimalLiteral | DoubleLiteral |\n      whitespace();\n      parse_StatementsAndOptionalExpr();\n      shift(282);                   // '}'\n      break;\n    default:\n      shift(133);                   // 'external'\n    }\n    eventHandler.endNonterminal(\"FunctionDecl\", e0);\n  }\n\n  function parse_ReturnType()\n  {\n    eventHandler.startNonterminal(\"ReturnType\", e0);\n    shift(79);                      // 'as'\n    lookahead1W(260);               // EQName^Token | S^WS | '%' | '(' | '(:' | 'after' | 'allowing' | 'ancestor' |\n    whitespace();\n    parse_SequenceType();\n    eventHandler.endNonterminal(\"ReturnType\", e0);\n  }\n\n  function shift(t)\n  {\n    if (l1 == t)\n    {\n      whitespace();\n      eventHandler.terminal(XQueryParser.TOKEN[l1], b1, e1 > size ? size : e1);\n      b0 = b1; e0 = e1; l1 = l2; if (l1 != 0) {\n      b1 = b2; e1 = e2; l2 = 0; }\n    }\n    else\n    {\n      error(b1, e1, 0, l1, t);\n    }\n  }\n\n  function shiftT(t)\n  {\n    if (l1 == t)\n    {\n      b0 = b1; e0 = e1; l1 = l2; if (l1 != 0) {\n      b1 = b2; e1 = e2; l2 = 0; }\n    }\n    else\n    {\n      error(b1, e1, 0, l1, t);\n    }\n  }\n\n  function skip(code)\n  {\n    var b0W = b0; var e0W = e0; var l1W = l1;\n    var b1W = b1; var e1W = e1;\n\n    l1 = code; b1 = begin; e1 = end;\n    l2 = 0;\n\n    try_Whitespace();\n\n    b0 = b0W; e0 = e0W; l1 = l1W; if (l1 != 0) {\n    b1 = b1W; e1 = e1W; }\n  }\n\n  function whitespace()\n  {\n    if (e0 != b1)\n    {\n      b0 = e0;\n      e0 = b1;\n      eventHandler.whitespace(b0, e0);\n    }\n  }\n\n  function matchW(set)\n  {\n    var code;\n    for (;;)\n    {\n      code = match(set);\n      if (code != 22)               // S^WS\n      {\n        if (code != 36)             // '(:'\n        {\n          break;\n        }\n        skip(code);\n      }\n    }\n    return code;\n  }\n\n  function lookahead1W(set)\n  {\n    if (l1 == 0)\n    {\n      l1 = matchW(set);\n      b1 = begin;\n      e1 = end;\n    }\n  }\n\n  function lookahead2W(set)\n  {\n    if (l2 == 0)\n    {\n      l2 = matchW(set);\n      b2 = begin;\n      e2 = end;\n    }\n    lk = (l2 << 9) | l1;\n  }\n\n  function lookahead1(set)\n  {\n    if (l1 == 0)\n    {\n      l1 = match(set);\n      b1 = begin;\n      e1 = end;\n    }\n  }\n\n  function lookahead2(set)\n  {\n    if (l2 == 0)\n    {\n      l2 = match(set);\n      b2 = begin;\n      e2 = end;\n    }\n    lk = (l2 << 9) | l1;\n  }\n\n  function error(b, e, s, l, t)\n  {\n    if (e > ex)\n    {\n      bx = b;\n      ex = e;\n      sx = s;\n      lx = l;\n      tx = t;\n    }\n    throw new self.ParseException(bx, ex, sx, lx, tx);\n  }\n\n  var lk, b0, e0;\n  var l1, b1, e1;\n  var l2, b2, e2;\n  var bx, ex, sx, lx, tx;\n  var eventHandler;\n  var memo;\n\n  function memoize(i, e, v)\n  {\n    memo[(e << 4) + i] = v;\n  }\n\n  function memoized(i, e)\n  {\n    var v = memo[(e << 4) + i];\n    return typeof v != \"undefined\" ? v : 0;\n  }\n\n  var input;\n  var size;\n  var begin;\n  var end;\n\n  function match(tokenSetId)\n  {\n    var nonbmp = false;\n    begin = end;\n    var current = end;\n    var result = XQueryParser.INITIAL[tokenSetId];\n    var state = 0;\n\n    for (var code = result & 4095; code != 0; )\n    {\n      var charclass;\n      var c0 = current < size ? input.charCodeAt(current) : 0;\n      ++current;\n      if (c0 < 0x80)\n      {\n        charclass = XQueryParser.MAP0[c0];\n      }\n      else if (c0 < 0xd800)\n      {\n        var c1 = c0 >> 4;\n        charclass = XQueryParser.MAP1[(c0 & 15) + XQueryParser.MAP1[(c1 & 31) + XQueryParser.MAP1[c1 >> 5]]];\n      }\n      else\n      {\n        if (c0 < 0xdc00)\n        {\n          var c1 = current < size ? input.charCodeAt(current) : 0;\n          if (c1 >= 0xdc00 && c1 < 0xe000)\n          {\n            ++current;\n            c0 = ((c0 & 0x3ff) << 10) + (c1 & 0x3ff) + 0x10000;\n            nonbmp = true;\n          }\n        }\n        var lo = 0, hi = 5;\n        for (var m = 3; ; m = (hi + lo) >> 1)\n        {\n          if (XQueryParser.MAP2[m] > c0) hi = m - 1;\n          else if (XQueryParser.MAP2[6 + m] < c0) lo = m + 1;\n          else {charclass = XQueryParser.MAP2[12 + m]; break;}\n          if (lo > hi) {charclass = 0; break;}\n        }\n      }\n\n      state = code;\n      var i0 = (charclass << 12) + code - 1;\n      code = XQueryParser.TRANSITION[(i0 & 15) + XQueryParser.TRANSITION[i0 >> 4]];\n\n      if (code > 4095)\n      {\n        result = code;\n        code &= 4095;\n        end = current;\n      }\n    }\n\n    result >>= 12;\n    if (result == 0)\n    {\n      end = current - 1;\n      var c1 = end < size ? input.charCodeAt(end) : 0;\n      if (c1 >= 0xdc00 && c1 < 0xe000) --end;\n      return error(begin, end, state, -1, -1);\n    }\n\n    if (nonbmp)\n    {\n      for (var i = result >> 9; i > 0; --i)\n      {\n        --end;\n        var c1 = end < size ? input.charCodeAt(end) : 0;\n        if (c1 >= 0xdc00 && c1 < 0xe000) --end;\n      }\n    }\n    else\n    {\n      end -= result >> 9;\n    }\n\n    return (result & 511) - 1;\n  }\n}\n\nXQueryParser.getTokenSet = function(tokenSetId)\n{\n  var set = [];\n  var s = tokenSetId < 0 ? - tokenSetId : INITIAL[tokenSetId] & 4095;\n  for (var i = 0; i < 284; i += 32)\n  {\n    var j = i;\n    var i0 = (i >> 5) * 3694 + s - 1;\n    var i1 = i0 >> 1;\n    var i2 = i1 >> 2;\n    var f = XQueryParser.EXPECTED[(i0 & 1) + XQueryParser.EXPECTED[(i1 & 3) + XQueryParser.EXPECTED[(i2 & 3) + XQueryParser.EXPECTED[i2 >> 2]]]];\n    for ( ; f != 0; f >>>= 1, ++j)\n    {\n      if ((f & 1) != 0)\n      {\n        set.push(XQueryParser.TOKEN[j]);\n      }\n    }\n  }\n  return set;\n};\n\nXQueryParser.MAP0 =\n[ 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 26, 30, 30, 30, 30, 30, 31, 32, 33, 30, 30, 34, 30, 30, 35, 30, 30, 30, 36, 30, 30, 37, 38, 39, 38, 30, 38, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 38, 38\n];\n\nXQueryParser.MAP1 =\n[ 108, 124, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 156, 181, 181, 181, 181, 181, 214, 215, 213, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 214, 247, 261, 277, 293, 309, 355, 371, 387, 423, 423, 423, 415, 339, 331, 339, 331, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 440, 440, 440, 440, 440, 440, 440, 324, 339, 339, 339, 339, 339, 339, 339, 339, 401, 423, 423, 424, 422, 423, 423, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 423, 338, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 339, 423, 70, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 26, 30, 30, 30, 30, 30, 31, 32, 33, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 38, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 34, 30, 30, 35, 30, 30, 30, 36, 30, 30, 37, 38, 39, 38, 30, 38, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 30, 30, 38, 38, 38, 38, 38, 38, 38, 69, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69\n];\n\nXQueryParser.MAP2 =\n[ 57344, 63744, 64976, 65008, 65536, 983040, 63743, 64975, 65007, 65533, 983039, 1114111, 38, 30, 38, 30, 30, 38\n];\n\nXQueryParser.INITIAL =\n[ 1, 12290, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287\n];\n\nXQueryParser.TRANSITION =\n[ 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 25651, 25666, 25670, 25670, 25670, 18189, 25670, 25670, 25670, 25670, 18201, 25670, 25670, 25670, 25670, 18176, 25670, 25671, 18217, 42516, 42516, 42516, 27632, 42516, 42516, 51474, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 19019, 18919, 18270, 40105, 18293, 18315, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 51199, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21141, 42516, 42516, 42516, 42516, 48069, 42516, 42516, 42516, 42516, 25917, 18730, 20976, 20988, 20999, 21015, 25420, 18732, 21040, 42516, 42516, 42516, 27632, 42516, 42516, 51474, 31122, 42516, 42516, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 21056, 21084, 18270, 40105, 18293, 18315, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 51199, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 23286, 21107, 42516, 42516, 42516, 39416, 42516, 42516, 43470, 47286, 25568, 42516, 42516, 42516, 42516, 23672, 41495, 21126, 21160, 42516, 42516, 42516, 27632, 42516, 42516, 35938, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 19019, 25556, 18270, 40105, 18293, 18315, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 51199, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21176, 21248, 42516, 42516, 42516, 50595, 42516, 42516, 42445, 42516, 25917, 23619, 21211, 21279, 21269, 21226, 21240, 44419, 21040, 42516, 42516, 42516, 27632, 21302, 42516, 32247, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 19019, 19871, 21321, 40105, 18293, 18315, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 51199, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 21344, 26008, 18612, 18632, 18596, 21349, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21141, 42510, 42516, 42516, 42516, 48894, 42515, 42516, 51366, 42516, 21365, 42504, 21403, 42515, 21410, 42516, 27599, 27612, 21040, 42516, 42516, 42516, 27632, 42516, 42516, 51474, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 19019, 18919, 18270, 40105, 18293, 18315, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 51199, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21141, 42516, 42516, 42516, 42516, 48069, 21426, 42516, 42516, 42516, 22170, 42516, 42516, 21445, 42516, 42516, 21468, 21481, 21040, 42516, 42516, 42516, 27632, 42516, 42516, 51474, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 19019, 18919, 18270, 40105, 18293, 18315, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 51199, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21141, 42516, 42516, 42516, 42516, 48069, 42516, 42516, 42516, 42516, 24484, 42516, 42516, 42516, 42516, 42516, 42516, 42517, 21497, 42516, 42516, 42516, 27632, 42516, 42516, 51474, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 19019, 18919, 18270, 40105, 18293, 18315, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 21513, 25598, 18486, 18508, 51408, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 25358, 21538, 42516, 42516, 42516, 29996, 42516, 42516, 26519, 46446, 25383, 42516, 42516, 42516, 42516, 25736, 28473, 18232, 21557, 42516, 42516, 42516, 27632, 42516, 42516, 51474, 21573, 42516, 42516, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 19019, 19060, 21591, 40105, 18293, 18315, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 51199, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 23074, 23089, 21619, 21619, 21619, 21672, 21614, 21619, 21624, 23096, 21640, 21745, 21688, 21665, 21655, 21732, 21703, 21716, 21040, 42516, 42516, 42516, 33326, 42516, 42516, 51474, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 19019, 18919, 18270, 40105, 18293, 21761, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 51199, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21141, 45317, 42516, 42516, 42516, 49458, 21798, 42516, 22640, 21804, 25917, 45316, 42516, 21821, 21844, 21828, 21860, 21869, 21885, 42516, 42516, 42516, 29550, 42516, 42516, 51474, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 19019, 18919, 18270, 40105, 18293, 21901, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 51199, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21141, 21944, 42516, 42516, 42516, 48069, 42516, 42516, 42516, 26308, 36543, 25445, 25454, 21937, 25455, 21960, 21985, 21998, 21040, 42516, 42516, 42516, 27632, 42516, 42516, 51474, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 19019, 18919, 18270, 40105, 18293, 18315, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 18888, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21141, 42516, 42516, 42516, 42516, 48069, 42516, 42516, 42516, 26329, 37275, 42655, 22014, 22031, 22014, 22046, 42653, 22015, 21040, 42516, 42516, 42516, 27632, 42516, 42516, 51474, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 19019, 18919, 18270, 40105, 18293, 18315, 42516, 42516, 22071, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 51199, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21141, 26891, 42516, 42516, 42516, 48069, 22092, 42516, 23653, 22130, 40293, 22116, 22186, 22191, 22191, 22207, 26888, 44587, 21040, 42516, 42516, 42516, 27632, 42516, 42516, 51474, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 19019, 18919, 18270, 40105, 18293, 18315, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 51199, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 18247, 42516, 42516, 42516, 42516, 48069, 42516, 42516, 42516, 42516, 25917, 35843, 22232, 22249, 22232, 22264, 35841, 22233, 22289, 42516, 42516, 42516, 27632, 42516, 42516, 51474, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 22657, 46314, 35273, 38147, 34810, 46363, 42516, 33841, 42516, 34304, 43899, 22305, 22071, 36154, 42516, 42516, 42516, 42516, 28243, 22657, 22322, 22657, 22657, 22341, 33347, 46316, 46316, 39789, 38147, 35514, 38147, 38147, 22359, 22382, 42516, 42516, 42516, 42516, 42516, 28815, 42516, 22405, 22426, 42516, 42516, 38368, 22657, 22657, 22657, 22657, 38374, 22541, 46316, 46316, 46316, 46316, 44805, 38147, 38147, 38147, 38147, 38147, 32923, 22444, 47355, 26569, 42516, 42516, 42516, 42516, 42516, 45225, 42516, 42516, 32981, 50880, 22657, 22657, 22657, 30360, 22467, 39622, 46316, 22501, 46316, 22343, 36422, 42625, 38147, 22520, 38147, 27826, 41766, 42516, 42516, 42516, 42516, 42516, 49148, 42516, 23255, 22657, 44467, 22657, 22657, 30361, 22539, 42077, 46316, 46316, 46316, 30525, 38147, 40186, 38147, 38147, 34440, 41769, 42516, 42516, 20027, 37487, 42516, 28242, 22657, 22657, 36250, 37745, 46316, 46316, 44329, 37798, 38147, 38147, 43834, 27827, 30836, 42516, 42516, 19405, 22558, 38368, 22576, 22657, 40730, 22597, 46316, 36583, 22617, 38147, 40469, 22638, 42516, 25905, 42516, 34153, 22656, 33064, 46073, 46316, 22674, 22710, 27827, 22690, 51145, 42516, 32408, 22729, 37572, 22752, 32120, 22683, 29050, 30609, 22771, 38961, 22813, 36803, 22874, 22893, 22911, 28238, 43147, 27775, 22913, 22451, 22736, 46400, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21141, 42516, 42516, 42516, 42516, 48069, 42516, 42516, 42516, 50215, 25917, 42516, 42516, 42516, 42516, 42516, 45715, 23059, 23112, 42516, 42516, 42516, 27632, 42516, 42516, 37325, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 22657, 46314, 35273, 38147, 23128, 46363, 42516, 42516, 42516, 34304, 42516, 42516, 18360, 42516, 42516, 42516, 42516, 42516, 28243, 22657, 22657, 22657, 22657, 22341, 46316, 46316, 46316, 39789, 38147, 38147, 38147, 38147, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 28815, 42516, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 22657, 22657, 38374, 22541, 46316, 46316, 46316, 46316, 44805, 38147, 38147, 38147, 38147, 38147, 32923, 22444, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38370, 22657, 22657, 22657, 22657, 30360, 22540, 46316, 46316, 46316, 46316, 22343, 30533, 38147, 38147, 38147, 38147, 27826, 41766, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 23255, 22657, 22657, 22657, 22657, 30361, 22539, 46316, 46316, 46316, 46316, 30525, 38147, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 37745, 46316, 46316, 46316, 37798, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21141, 23154, 42516, 42516, 42516, 46371, 42516, 42516, 42516, 42516, 25917, 35960, 23175, 23206, 23195, 23229, 35959, 23179, 21040, 42516, 42516, 42516, 27632, 42516, 42516, 51474, 27227, 42516, 43023, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 19019, 18919, 18270, 40105, 18293, 18315, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 51199, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21141, 23254, 42516, 42516, 42516, 48069, 42516, 42516, 42516, 19968, 25917, 42516, 42516, 42516, 42516, 42516, 42762, 23271, 23302, 42516, 42516, 42516, 27632, 42516, 42516, 21380, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 22657, 46314, 35273, 38147, 23318, 46363, 42516, 42516, 42516, 34304, 42516, 42516, 23344, 42516, 42516, 42516, 42516, 42516, 28243, 22657, 22657, 22657, 22657, 22341, 46316, 46316, 46316, 39789, 38147, 38147, 38147, 38147, 40896, 23370, 23409, 42516, 42516, 42516, 42516, 38331, 23429, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 22657, 22657, 38374, 22541, 46316, 46316, 46316, 46316, 44805, 38147, 38147, 38147, 38147, 38147, 32923, 23450, 23383, 42516, 42516, 42516, 42516, 42516, 23487, 42516, 42516, 42516, 38370, 22657, 22657, 22657, 22657, 50700, 22540, 46316, 46316, 46316, 46316, 47852, 30533, 38147, 38147, 38147, 38147, 27826, 35762, 23510, 42516, 42516, 42516, 42516, 42516, 42516, 23255, 22657, 22657, 22657, 22657, 29796, 22539, 46316, 46316, 46316, 46316, 23533, 38147, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 46191, 46316, 46316, 46316, 32038, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21141, 48371, 42516, 42516, 42516, 31492, 32078, 42516, 42516, 23557, 25917, 18721, 49121, 23587, 23594, 23610, 42516, 43878, 23635, 23651, 42516, 42516, 33439, 23669, 42516, 51474, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 32629, 20505, 25038, 24355, 23991, 25028, 23804, 18270, 40105, 18293, 23688, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 23724, 24084, 23749, 23789, 24317, 23827, 23849, 23904, 24015, 23917, 23946, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 23969, 24689, 24310, 25086, 25092, 23974, 23990, 24416, 24845, 24007, 23833, 24977, 24993, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 24031, 23930, 24046, 24073, 24057, 24100, 24137, 24664, 24240, 24198, 24251, 24225, 24986, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 24267, 24283, 24299, 24348, 24333, 24371, 24167, 24428, 24402, 23773, 24444, 24474, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 24500, 24558, 24572, 24588, 24604, 24182, 24745, 24620, 24636, 24767, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19514, 24680, 24514, 19528, 24705, 24152, 24757, 19947, 19984, 20043, 20080, 20119, 20157, 20667, 24542, 24528, 24731, 24830, 24209, 24939, 20235, 20264, 20301, 24783, 24799, 24815, 24715, 24861, 20381, 20397, 19814, 23733, 24877, 24893, 20503, 25039, 24968, 23864, 24927, 24955, 25015, 20652, 18443, 23763, 24386, 25055, 24651, 25071, 25108, 25159, 25175, 25191, 25243, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21141, 27003, 42516, 42516, 42516, 48069, 25296, 42516, 42516, 25291, 40518, 25312, 25320, 25320, 25320, 25327, 27168, 25343, 21040, 42516, 42516, 42516, 27632, 42516, 42516, 51474, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 19019, 18919, 18270, 40105, 18293, 18315, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 51199, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25399, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 18963, 25373, 18652, 18689, 18711, 18748, 18695, 25415, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 19337, 25436, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 25471, 25509, 25525, 20579, 19301, 19596, 25541, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 25584, 19614, 19632, 19650, 25620, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21141, 42516, 42516, 42516, 42516, 48069, 42516, 42516, 42516, 42516, 21541, 28730, 28739, 28739, 28739, 28746, 47533, 25636, 21040, 42516, 42516, 42516, 27632, 42516, 42516, 51474, 42516, 42516, 27653, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 19019, 25687, 18270, 40105, 18293, 18315, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 51199, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51268, 23158, 42516, 42516, 42516, 48069, 42516, 42516, 42516, 42516, 25917, 22795, 25710, 25710, 25710, 25717, 23159, 22797, 21040, 25733, 42516, 42516, 27632, 42516, 42516, 51474, 42516, 42516, 44769, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 19019, 25752, 18270, 40105, 18293, 18315, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 51199, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 26066, 26075, 42516, 42516, 42516, 42907, 42516, 42516, 42516, 42516, 25917, 26405, 25775, 25775, 25775, 25782, 28588, 26407, 25798, 25814, 42516, 42516, 27632, 42516, 42516, 51474, 42516, 42516, 23413, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 19019, 25831, 18270, 40105, 18293, 18315, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 51199, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 25857, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 25891, 42516, 42516, 42516, 42516, 48069, 25942, 42516, 42516, 28970, 33768, 42516, 42516, 42516, 25933, 25960, 26180, 25944, 25980, 42516, 42516, 42516, 27632, 42516, 42516, 51474, 27927, 42516, 42516, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 25996, 26028, 18270, 40105, 18293, 18315, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 51199, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21141, 42516, 42516, 42516, 42516, 48069, 42516, 42516, 42516, 42516, 25917, 42516, 42516, 42516, 42516, 42516, 41865, 26051, 21040, 42516, 42516, 42516, 27632, 42516, 42516, 51474, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 19019, 18919, 18270, 40105, 18293, 18315, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 51199, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 42516, 51537, 42516, 42516, 42516, 42516, 25917, 42516, 42516, 42516, 42516, 46741, 49861, 51029, 26099, 42516, 42516, 42516, 27632, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 22657, 46314, 35273, 38147, 34810, 28721, 42516, 42516, 42516, 34304, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28243, 22657, 22657, 22657, 22657, 27401, 46316, 46316, 46316, 48318, 38147, 38147, 38147, 38147, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 42516, 23487, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 22657, 22657, 38374, 22541, 46316, 46316, 46316, 46316, 44805, 38147, 38147, 38147, 38147, 38147, 32923, 26115, 26152, 42516, 42516, 42516, 42516, 42516, 23487, 42516, 42516, 42516, 38370, 22657, 22657, 22657, 22657, 30360, 22540, 46316, 46316, 46316, 46316, 22343, 30533, 38147, 38147, 38147, 38147, 27826, 35762, 23510, 42516, 42516, 42516, 42516, 26178, 42516, 23255, 22657, 22657, 22657, 22657, 22877, 22539, 46316, 46316, 46316, 46316, 32774, 38147, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 46191, 46316, 46316, 46316, 32038, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 23464, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 42516, 51537, 42516, 42516, 42516, 42516, 25917, 42516, 42516, 42516, 42516, 46741, 49861, 51029, 26099, 42516, 42516, 42516, 27632, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 22657, 46314, 35273, 38147, 34810, 28721, 42516, 42516, 42516, 34304, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28243, 22657, 22657, 22657, 22657, 27401, 46316, 46316, 46316, 48318, 38147, 38147, 38147, 38147, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 42516, 23487, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 22657, 22657, 38374, 22541, 46316, 46316, 46316, 46316, 44805, 38147, 38147, 38147, 38147, 38147, 32923, 26115, 26152, 42516, 42516, 42516, 42516, 42516, 23487, 42516, 42516, 42516, 38370, 22657, 22657, 22657, 22657, 30360, 22540, 46316, 46316, 46316, 46316, 22343, 30533, 38147, 38147, 38147, 38147, 27826, 35762, 23510, 42516, 42516, 42516, 42516, 42516, 42516, 23255, 22657, 22657, 22657, 22657, 22877, 22539, 46316, 46316, 46316, 46316, 32774, 38147, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 46191, 46316, 46316, 46316, 32038, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 42516, 51537, 42516, 42516, 42516, 42516, 25917, 42516, 42516, 42516, 42516, 46741, 49861, 51029, 26099, 42516, 42516, 42516, 27632, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 22657, 46314, 35273, 38147, 34810, 28721, 42516, 42516, 42516, 34304, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28243, 22657, 22657, 22657, 22657, 27401, 46316, 46316, 46316, 48318, 38147, 38147, 38147, 38147, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 42516, 23487, 26196, 42516, 42516, 42516, 38368, 22657, 22657, 22657, 22657, 38374, 22541, 46316, 46316, 46316, 46316, 44805, 38147, 38147, 38147, 38147, 38147, 32923, 26115, 26152, 42516, 42516, 42516, 42516, 42516, 23487, 42516, 42516, 42516, 38370, 22657, 22657, 22657, 22657, 30360, 22540, 46316, 46316, 46316, 46316, 22343, 30533, 38147, 38147, 38147, 38147, 27826, 35762, 23510, 42516, 42516, 42516, 42516, 42516, 42516, 23255, 22657, 22657, 22657, 22657, 22877, 22539, 46316, 46316, 46316, 46316, 32774, 38147, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 46191, 46316, 46316, 46316, 32038, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 42516, 51537, 42516, 42516, 42516, 42516, 25917, 42516, 42516, 42516, 42516, 46741, 49861, 51029, 26099, 42516, 42516, 42516, 27632, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 22657, 46314, 35273, 38147, 34810, 28721, 42516, 42516, 42516, 34304, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28243, 22657, 22657, 22657, 22657, 27401, 46316, 46316, 46316, 48318, 38147, 38147, 38147, 38147, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 42516, 23487, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 22657, 22657, 38374, 22541, 46316, 46316, 46316, 46316, 44805, 38147, 38147, 38147, 38147, 38147, 32923, 26115, 26152, 42516, 42516, 42516, 42516, 42516, 26216, 42516, 42516, 42516, 38370, 22657, 22657, 22657, 22657, 30360, 22540, 46316, 46316, 46316, 46316, 22343, 30533, 38147, 38147, 38147, 38147, 27826, 35762, 23510, 42516, 42516, 42516, 42516, 42516, 42516, 23255, 22657, 22657, 22657, 22657, 22877, 22539, 46316, 46316, 46316, 46316, 32774, 38147, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 46191, 46316, 46316, 46316, 32038, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 42516, 51537, 42516, 42516, 42516, 42516, 25917, 42516, 42516, 42516, 42516, 46741, 49861, 51029, 26099, 42516, 42516, 42516, 27632, 42516, 42516, 31151, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 22657, 46314, 35273, 38147, 34810, 28721, 42516, 42516, 42516, 34304, 42516, 42516, 31154, 42516, 42516, 42516, 42516, 42516, 28243, 22657, 22657, 22657, 22657, 27401, 46316, 46316, 46316, 48318, 38147, 38147, 38147, 38147, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 42516, 23487, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 22657, 22657, 38374, 22541, 46316, 46316, 46316, 46316, 44805, 38147, 38147, 38147, 38147, 38147, 32923, 26115, 26152, 42516, 42516, 42516, 42516, 42516, 23487, 42516, 42516, 42516, 38370, 22657, 22657, 22657, 22657, 30360, 22540, 46316, 46316, 46316, 46316, 22343, 30533, 38147, 38147, 38147, 38147, 27826, 35762, 23510, 42516, 42516, 42516, 42516, 42516, 42516, 23255, 22657, 22657, 22657, 22657, 22877, 22539, 46316, 46316, 46316, 46316, 32774, 38147, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 46191, 46316, 46316, 46316, 32038, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 42516, 51537, 42516, 42516, 42516, 42516, 25917, 42516, 42516, 42516, 42516, 46741, 49861, 51029, 26099, 42516, 42516, 42516, 27632, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 22657, 46314, 35273, 38147, 34810, 28721, 42516, 42516, 42516, 34304, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28243, 22657, 22657, 22657, 22657, 27401, 46316, 46316, 46316, 48318, 38147, 38147, 38147, 38147, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 22657, 22657, 38374, 22541, 46316, 46316, 46316, 46316, 44805, 38147, 38147, 38147, 38147, 38147, 32923, 22444, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38370, 22657, 22657, 22657, 22657, 30360, 22540, 46316, 46316, 46316, 46316, 22343, 30533, 38147, 38147, 38147, 38147, 27826, 41766, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 23255, 22657, 22657, 22657, 22657, 30361, 22539, 46316, 46316, 46316, 46316, 30525, 38147, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 37745, 46316, 46316, 46316, 37798, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 42516, 51537, 42516, 42516, 42516, 42516, 25917, 42516, 42516, 42516, 42516, 46741, 49861, 51029, 26099, 42516, 42516, 42516, 27632, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 22657, 46314, 35273, 38147, 34810, 22786, 42516, 42516, 42516, 34304, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28243, 22657, 22657, 22657, 22657, 27401, 46316, 46316, 46316, 48318, 38147, 38147, 38147, 38147, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 22657, 22657, 38374, 22541, 46316, 46316, 46316, 46316, 44805, 38147, 38147, 38147, 38147, 38147, 32923, 22444, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38370, 22657, 22657, 22657, 22657, 30360, 22540, 46316, 46316, 46316, 46316, 22343, 30533, 38147, 38147, 38147, 38147, 27826, 41766, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 23255, 22657, 22657, 22657, 22657, 30361, 22539, 46316, 46316, 46316, 46316, 30525, 38147, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 37745, 46316, 46316, 46316, 37798, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 42516, 51537, 42516, 42516, 42516, 42516, 25917, 42516, 42516, 42516, 42516, 46741, 49861, 51029, 26258, 42516, 42516, 42516, 27632, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 22657, 46314, 35273, 38147, 34810, 28721, 42516, 42516, 42516, 34304, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28243, 22657, 22657, 22657, 22657, 27401, 46316, 46316, 46316, 48318, 38147, 38147, 38147, 38147, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 22657, 22657, 38374, 22541, 46316, 46316, 46316, 46316, 44805, 38147, 38147, 38147, 38147, 38147, 32923, 22444, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38370, 22657, 22657, 22657, 22657, 30360, 22540, 46316, 46316, 46316, 46316, 22343, 30533, 38147, 38147, 38147, 38147, 27826, 41766, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 23255, 22657, 22657, 22657, 22657, 30361, 22539, 46316, 46316, 46316, 46316, 30525, 38147, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 37745, 46316, 46316, 46316, 37798, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 42516, 51537, 42516, 42516, 42516, 42516, 25917, 48694, 42516, 42516, 42516, 46741, 49861, 51029, 26099, 42516, 42516, 42516, 27632, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 22657, 46314, 35273, 38147, 34810, 28721, 42516, 42516, 42516, 34304, 42516, 42516, 42516, 28605, 42516, 42516, 42516, 42516, 28243, 22657, 22657, 22657, 22657, 27401, 46316, 46316, 46316, 48318, 38147, 38147, 38147, 38147, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 22657, 22657, 38374, 22541, 46316, 46316, 46316, 46316, 44805, 38147, 38147, 38147, 38147, 38147, 32923, 22444, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38370, 22657, 22657, 22657, 22657, 30360, 22540, 46316, 46316, 46316, 46316, 22343, 30533, 38147, 38147, 38147, 38147, 27826, 41766, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 23255, 22657, 22657, 22657, 22657, 30361, 22539, 46316, 46316, 46316, 46316, 30525, 38147, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 37745, 46316, 46316, 46316, 37798, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 42516, 51537, 42516, 42516, 42516, 42516, 25917, 42516, 42516, 42516, 42516, 47769, 26274, 26287, 26099, 42516, 42516, 42516, 27632, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 22657, 46314, 35273, 38147, 34810, 28721, 42516, 42516, 42516, 34304, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28243, 22657, 22657, 22657, 22657, 27401, 46316, 46316, 46316, 48318, 38147, 38147, 38147, 38147, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 22657, 22657, 38374, 22541, 46316, 46316, 46316, 46316, 44805, 38147, 38147, 38147, 38147, 38147, 32923, 22444, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38370, 22657, 22657, 22657, 22657, 30360, 22540, 46316, 46316, 46316, 46316, 22343, 30533, 38147, 38147, 38147, 38147, 27826, 41766, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 23255, 22657, 22657, 22657, 22657, 30361, 22539, 46316, 46316, 46316, 46316, 30525, 38147, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 37745, 46316, 46316, 46316, 37798, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 42516, 51537, 42516, 42516, 42516, 42516, 25917, 42516, 42516, 42516, 42516, 46741, 49861, 51029, 26099, 42516, 42516, 42516, 27632, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 22657, 46314, 35273, 38147, 34810, 28721, 42516, 42516, 42516, 34304, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28243, 22657, 22657, 22657, 22657, 27401, 46316, 46316, 46316, 48318, 38147, 38147, 38147, 38147, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 22657, 22657, 38374, 22541, 46316, 46316, 46316, 46316, 44805, 38147, 38147, 38147, 38147, 38147, 32923, 22444, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38370, 22657, 22657, 22657, 22657, 30360, 22540, 46316, 46316, 46316, 46316, 22343, 30533, 38147, 38147, 38147, 38147, 27826, 41766, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 23255, 22657, 22657, 22657, 22657, 30361, 22539, 46316, 46316, 46316, 46316, 30525, 38147, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 42516, 26303, 42516, 28242, 22657, 22657, 22657, 37745, 46316, 46316, 46316, 37798, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 26324, 42516, 42516, 42516, 42516, 51537, 42516, 42516, 42516, 42516, 25917, 42516, 42516, 42516, 42516, 46741, 49861, 51029, 26099, 42516, 42516, 42516, 27632, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 22657, 46314, 35273, 38147, 34810, 28721, 42516, 42516, 42516, 34304, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28243, 22657, 22657, 22657, 22657, 27401, 46316, 46316, 46316, 48318, 38147, 38147, 38147, 38147, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 22657, 22657, 38374, 22541, 46316, 46316, 46316, 46316, 44805, 38147, 38147, 38147, 38147, 38147, 32923, 22444, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38370, 22657, 22657, 22657, 22657, 30360, 22540, 46316, 46316, 46316, 46316, 22343, 30533, 38147, 38147, 38147, 38147, 27826, 41766, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 23255, 22657, 22657, 22657, 22657, 30361, 22539, 46316, 46316, 46316, 46316, 30525, 38147, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 37745, 46316, 46316, 46316, 37798, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21141, 42516, 42516, 42516, 42516, 48069, 42516, 42516, 42516, 42516, 25917, 35004, 26345, 26373, 26362, 26396, 35005, 26346, 21040, 42516, 42516, 42516, 27632, 42516, 42516, 51474, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 19019, 18919, 18270, 40105, 18293, 18315, 42516, 42516, 18360, 37963, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 51199, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 26423, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21141, 42516, 42516, 42516, 42516, 48069, 42516, 42516, 42516, 42516, 25917, 42516, 42516, 42516, 42516, 42516, 42516, 42517, 21040, 42516, 42516, 42516, 27632, 42516, 42516, 51474, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 19019, 18919, 18270, 40105, 18293, 18315, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 51199, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21141, 42516, 42516, 42516, 42516, 48069, 42516, 42516, 42516, 42516, 25917, 47727, 42516, 26460, 26483, 26467, 42516, 47735, 21040, 42516, 42516, 42516, 27632, 42516, 42516, 51474, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 19019, 18919, 18270, 40105, 18293, 18315, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 51199, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 26499, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 26535, 20397, 20422, 20606, 20438, 26551, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 29068, 42516, 42516, 42516, 51537, 26585, 26616, 29663, 26601, 26633, 26690, 26699, 26715, 26730, 26742, 26758, 26771, 26099, 19999, 42516, 26787, 26162, 26806, 41856, 26832, 26883, 26907, 26946, 30733, 26962, 26998, 27019, 27054, 46783, 31896, 27070, 46885, 46348, 36728, 27120, 42516, 42516, 34304, 27137, 37896, 42516, 27163, 34995, 39190, 42516, 27184, 43650, 22657, 22657, 22657, 27203, 27401, 46316, 46316, 41985, 48318, 38147, 38147, 38147, 37213, 40896, 22382, 42516, 27222, 48046, 42516, 27243, 27263, 27280, 42516, 42516, 27038, 20763, 27308, 27328, 22657, 22657, 27363, 27386, 27419, 35266, 46316, 30482, 27448, 27495, 27524, 27566, 38147, 35889, 38740, 46095, 27585, 26152, 27628, 42516, 45564, 42516, 47310, 23487, 42516, 46936, 27648, 27669, 27685, 34339, 22657, 27729, 22984, 44673, 27748, 45967, 46316, 27773, 39768, 32782, 27791, 37607, 38147, 27824, 22485, 27843, 27859, 27882, 27899, 42516, 27922, 31758, 27943, 23255, 33056, 27962, 22657, 42185, 33093, 27982, 30091, 46316, 35423, 43042, 32774, 28017, 38147, 38147, 42363, 28033, 23138, 28062, 40096, 28115, 41486, 28137, 21969, 22956, 28160, 22657, 46191, 35558, 28176, 28197, 32038, 49740, 47969, 28214, 27827, 28233, 42899, 42516, 21253, 42516, 38368, 42934, 43766, 40730, 37393, 48025, 36583, 51021, 44713, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 28260, 28298, 33550, 28320, 28341, 28379, 28401, 28421, 26921, 40729, 36585, 44924, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 28445, 42516, 42516, 51537, 42516, 42516, 42516, 42516, 31409, 28464, 42516, 28489, 28496, 28512, 28528, 28541, 26099, 42516, 42516, 42516, 27632, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 42942, 46314, 28557, 30860, 34810, 28721, 42516, 42516, 42516, 34304, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28243, 22657, 22657, 22657, 22657, 27401, 46316, 46316, 46316, 48318, 38147, 38147, 38147, 38147, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 28583, 23487, 28604, 45602, 42516, 42516, 38368, 22657, 22657, 22657, 44648, 28621, 22541, 46316, 46316, 46316, 40008, 44805, 38147, 38147, 38147, 38147, 41449, 32923, 26115, 26152, 42516, 42516, 42516, 42516, 42516, 23487, 42516, 42516, 42516, 38370, 22657, 22657, 22657, 22657, 30360, 22540, 46316, 46316, 46316, 46316, 22343, 30533, 38147, 38147, 38147, 38147, 27826, 35762, 23510, 42516, 32305, 42516, 42516, 28652, 43395, 23255, 28671, 22657, 22657, 22657, 28690, 28706, 46316, 46316, 46316, 37589, 32774, 28762, 38147, 38147, 38147, 44356, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 46191, 46316, 46316, 46316, 32038, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 23013, 26674, 44310, 41661, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 28784, 42516, 42516, 51537, 42516, 28813, 42516, 28831, 36313, 28851, 28860, 28876, 28891, 28903, 28919, 28932, 26099, 42516, 42516, 33807, 29427, 42516, 42516, 28948, 42516, 28965, 42516, 42516, 42516, 25275, 42516, 28986, 44283, 46314, 29021, 22622, 37863, 32069, 42516, 29066, 42516, 34304, 29084, 49128, 42516, 45291, 29103, 36853, 42516, 39408, 30216, 37513, 22657, 22657, 22657, 29138, 29162, 46316, 46316, 48917, 29187, 29203, 38147, 38147, 40896, 22382, 23471, 42516, 42516, 37970, 42516, 41320, 23487, 39926, 29222, 42516, 42516, 38368, 29257, 38293, 22657, 29296, 38374, 29315, 31567, 38618, 38779, 46316, 44805, 42631, 29346, 29367, 48610, 38147, 32923, 26115, 26152, 42516, 42516, 35359, 42516, 36267, 23487, 42516, 42516, 42516, 38370, 22657, 22657, 38875, 29587, 30360, 22540, 46316, 46316, 49716, 48753, 22343, 30533, 38147, 38147, 47896, 47206, 27826, 35762, 29388, 42516, 42516, 42516, 29423, 42516, 29443, 23255, 22657, 22657, 22657, 43545, 22877, 22539, 46316, 46316, 49625, 46316, 32774, 38147, 38147, 38147, 29464, 34440, 41769, 42516, 42516, 19074, 42516, 46902, 29483, 22657, 45738, 22657, 46191, 46316, 28001, 46316, 32038, 38147, 48630, 38147, 27827, 29518, 29546, 42516, 39530, 20864, 38368, 29566, 29583, 46250, 46316, 29603, 36583, 29623, 29640, 40469, 42516, 42516, 42516, 29661, 38373, 22657, 29679, 46316, 51108, 36586, 38147, 50541, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 29702, 29722, 29738, 29754, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 34720, 29778, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 26790, 42516, 42516, 51537, 42516, 29812, 25227, 42516, 31450, 29831, 29840, 29856, 29871, 29878, 29894, 29907, 26099, 42516, 42516, 42516, 27632, 42516, 42516, 42516, 42516, 42516, 42516, 31072, 31070, 42516, 32276, 32283, 40826, 29686, 35273, 29923, 34810, 28721, 42516, 35352, 29943, 34304, 42516, 29968, 36872, 42516, 42516, 29988, 30012, 34471, 30028, 22581, 34160, 30064, 24121, 30107, 48780, 30128, 30172, 30191, 29624, 22523, 47650, 28217, 40896, 22382, 42516, 42516, 42516, 42735, 42516, 30232, 23487, 42516, 42516, 42516, 27906, 38368, 22657, 22657, 22657, 26867, 38374, 22541, 46316, 46316, 46316, 37425, 44805, 38147, 38147, 38147, 38147, 30252, 50615, 30272, 30304, 42516, 42516, 42516, 30320, 30338, 23487, 42516, 42516, 27104, 21782, 30358, 30377, 22657, 22657, 30395, 30434, 30481, 30498, 46316, 46316, 30515, 51071, 30551, 30568, 38147, 38147, 30585, 35762, 23510, 42516, 42516, 42516, 42516, 42516, 30625, 23255, 30648, 22657, 22657, 30668, 22877, 30687, 46316, 46316, 34855, 46316, 32837, 38147, 38147, 43217, 38147, 34440, 41769, 45029, 42516, 30729, 42516, 21024, 28242, 29299, 22657, 30749, 46191, 50174, 46316, 30776, 32038, 38147, 30812, 48472, 27827, 22690, 23708, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 37071, 42516, 42516, 38373, 22657, 31523, 46316, 43307, 36586, 38147, 39352, 22690, 34920, 42516, 38372, 43148, 46316, 38137, 38147, 30829, 36804, 38368, 28385, 28404, 30535, 27085, 28354, 31634, 30852, 30600, 30074, 38197, 42103, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 21805, 30876, 42516, 51537, 49762, 30895, 42516, 30918, 43094, 30942, 30951, 30967, 30982, 30994, 31010, 31023, 26099, 42516, 31039, 39573, 31055, 20844, 31088, 31151, 40795, 31438, 31118, 31138, 31170, 31208, 31224, 31259, 31325, 39316, 31341, 31357, 42305, 39859, 31243, 31397, 39944, 31425, 33906, 31466, 31484, 36903, 42516, 42516, 38844, 42516, 28243, 31508, 40831, 43064, 26242, 31546, 31583, 49551, 32501, 35578, 43001, 31607, 35023, 30465, 31623, 22382, 40777, 39000, 31658, 40711, 31716, 41838, 31747, 42230, 41234, 31783, 31813, 31829, 31873, 31912, 31936, 31952, 31988, 32019, 35868, 32054, 38034, 47598, 32094, 32110, 32136, 39813, 32152, 32186, 47170, 32233, 26152, 32263, 42516, 49503, 42516, 32299, 32321, 32337, 32365, 32386, 32406, 32424, 22657, 35078, 32463, 30760, 22540, 32487, 46316, 47681, 50971, 43200, 30533, 32517, 38147, 37625, 38481, 40265, 32560, 23510, 18666, 32576, 32596, 39698, 32624, 37664, 32645, 31965, 32706, 47478, 32693, 32731, 32762, 40433, 46316, 32798, 32825, 32774, 32853, 32872, 49013, 32893, 32919, 41769, 42516, 21429, 46706, 42516, 42516, 32939, 25143, 43551, 27695, 46191, 47568, 50517, 33128, 32038, 44391, 37914, 44027, 27827, 22690, 51501, 22158, 32960, 23571, 32997, 33045, 33080, 33109, 33144, 33160, 33196, 33225, 33259, 33289, 25257, 41794, 33305, 33321, 22943, 47433, 44826, 33342, 33363, 33392, 45913, 37247, 22690, 23238, 33434, 38372, 47456, 46316, 49977, 38147, 33455, 33478, 32944, 28385, 33515, 33536, 30206, 38372, 33571, 38971, 31372, 39304, 33587, 33611, 33627, 33643, 33674, 33720, 28385, 36584, 33273, 33742, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 33784, 42516, 51537, 33805, 33823, 29972, 43389, 33866, 33897, 42516, 33882, 33940, 33947, 33963, 33976, 26099, 42516, 42516, 20279, 27632, 42516, 42516, 42516, 42516, 42516, 41269, 42516, 41261, 42516, 41268, 25123, 41628, 38176, 37400, 33992, 34810, 28721, 42516, 34012, 42516, 34304, 34012, 42516, 42516, 42516, 34029, 34013, 37295, 42516, 28243, 34045, 22657, 22657, 22657, 34069, 34103, 46316, 46316, 48318, 47159, 38147, 38147, 38147, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 42516, 23487, 42516, 42516, 45931, 42516, 38368, 22657, 22657, 22657, 44213, 38374, 22541, 46316, 46316, 46316, 42968, 44805, 38147, 38147, 38147, 38147, 34120, 32923, 26115, 26152, 42516, 42516, 42516, 42516, 42516, 23487, 42516, 46602, 42516, 38370, 22657, 22657, 30041, 22657, 30360, 22540, 46316, 46316, 42268, 46316, 22343, 30533, 38147, 38147, 44000, 38147, 27826, 35762, 23510, 42516, 42516, 42516, 42516, 42516, 39273, 23255, 22657, 22657, 22657, 37139, 22877, 22539, 46316, 46316, 49643, 46316, 32774, 38147, 38147, 38147, 48815, 34440, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 46191, 46316, 46316, 46316, 32038, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 46733, 42516, 42516, 42516, 36647, 22657, 28384, 27995, 46316, 49984, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 44874, 43254, 31692, 29762, 34139, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 42516, 51537, 42516, 38852, 42516, 42516, 51280, 34176, 34185, 34201, 34208, 34215, 34231, 34244, 26099, 42516, 42516, 42516, 27632, 42516, 42516, 34401, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 22657, 46314, 35273, 38147, 34810, 37878, 42057, 42516, 42516, 34304, 42516, 42516, 42516, 42516, 34260, 42516, 42516, 42516, 28243, 22657, 22657, 22657, 22657, 27401, 46316, 46316, 46316, 48318, 38147, 38147, 38147, 38147, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 34278, 42516, 28081, 38368, 22657, 22657, 22657, 22657, 38374, 42076, 46316, 46316, 46316, 46316, 46212, 38147, 38147, 38147, 38147, 38147, 32923, 22444, 42516, 42516, 42516, 47761, 42516, 34299, 19108, 42516, 42516, 19113, 34320, 22657, 22657, 34338, 22657, 30360, 22540, 46316, 34104, 46316, 46316, 22343, 30533, 38147, 42837, 38147, 38147, 27826, 34355, 42516, 42516, 42516, 34399, 42516, 42516, 42516, 23255, 22657, 22657, 22657, 22657, 30361, 22539, 46316, 46316, 46316, 46316, 30525, 38147, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 38663, 42516, 34417, 28242, 22657, 22657, 38760, 37745, 46316, 46316, 50996, 37798, 38147, 38147, 38147, 34438, 22690, 34456, 18364, 34487, 34538, 24114, 31309, 31274, 34559, 34565, 27432, 34581, 44559, 30458, 34604, 22076, 42516, 19757, 34657, 29792, 34679, 47804, 33555, 31559, 34736, 35451, 34758, 22690, 41150, 39051, 35676, 32439, 38610, 34776, 34795, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 34833, 34871, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 42516, 51537, 42516, 42516, 42516, 42516, 25917, 42516, 42516, 42516, 42516, 46741, 49861, 51029, 26099, 18277, 42516, 42516, 34899, 42516, 42516, 42516, 36062, 42516, 36065, 42516, 42516, 34947, 34936, 36697, 22657, 34963, 27757, 38148, 48007, 34986, 42516, 42516, 29815, 34304, 21387, 19116, 42516, 38636, 42516, 42516, 42516, 42516, 28243, 22657, 22657, 43325, 22657, 27401, 46316, 46316, 30705, 48318, 38147, 38147, 38147, 35021, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 35376, 42516, 35039, 38368, 22657, 22657, 22657, 22657, 50945, 22541, 46316, 46316, 46316, 46316, 38717, 38147, 38147, 38147, 38147, 38147, 41757, 22444, 42516, 35059, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 39196, 38370, 35077, 22657, 22657, 22657, 30360, 46821, 46316, 46316, 46316, 46316, 22343, 23541, 38147, 38147, 38147, 38147, 27826, 41766, 42516, 42516, 42516, 50318, 42516, 42516, 42516, 23255, 22657, 22657, 22657, 46040, 30361, 22539, 46316, 46316, 46316, 34080, 30525, 38147, 38147, 38147, 42204, 34440, 41769, 42516, 42516, 46608, 42516, 42516, 28242, 22657, 22657, 22657, 37745, 46316, 46316, 46316, 37798, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 23434, 42516, 22428, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 35094, 34920, 22560, 38372, 50497, 46316, 40393, 38147, 43581, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 44978, 42516, 51537, 30322, 33499, 42482, 50012, 50022, 18763, 18772, 35115, 35131, 35143, 35159, 35172, 26099, 42516, 42516, 42516, 36498, 41847, 42516, 42516, 42516, 31671, 41803, 35188, 36161, 35205, 35221, 43491, 35237, 35256, 29171, 35289, 37464, 35305, 42516, 42516, 42516, 35339, 42516, 28090, 35375, 42516, 42516, 28949, 35314, 39266, 28243, 48989, 48108, 22657, 35392, 47509, 37433, 35422, 34970, 35439, 27808, 35467, 38147, 35501, 35536, 22382, 42516, 35594, 39908, 48509, 34515, 35614, 42516, 18299, 18417, 42516, 35655, 35672, 48116, 22657, 43129, 29280, 37184, 22541, 48019, 46316, 38117, 35692, 47637, 38147, 35719, 38147, 35737, 27472, 35753, 22444, 42516, 42516, 42516, 42516, 35778, 48535, 35820, 42516, 42516, 42516, 23024, 36244, 22657, 22657, 29502, 38418, 35859, 41980, 46316, 46316, 48733, 41934, 49389, 35884, 38147, 38147, 40673, 49832, 35905, 42516, 36909, 35924, 35976, 35997, 18673, 36033, 34522, 36081, 47410, 36098, 36117, 36141, 36177, 46316, 36198, 32809, 43953, 30446, 38147, 43626, 42012, 36214, 36230, 23328, 20636, 45205, 36266, 36283, 36301, 35981, 36329, 26662, 46771, 36350, 36390, 48253, 35703, 36411, 36456, 40231, 38454, 41461, 37653, 42516, 42516, 37028, 36479, 40577, 43121, 45398, 22366, 37772, 48725, 38205, 36432, 50457, 40469, 42516, 25485, 42516, 36514, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 36626, 36531, 42516, 28996, 31885, 36559, 36579, 36602, 36619, 36804, 36642, 28385, 28404, 30535, 42423, 49897, 44263, 36663, 36694, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 36713, 36744, 34366, 22755, 31692, 28429, 36774, 36790, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 39935, 42516, 51537, 42516, 42516, 42516, 42516, 25917, 42516, 29952, 39942, 19158, 38671, 36820, 36833, 26099, 42516, 42516, 42516, 27632, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 22657, 46314, 35273, 38147, 34810, 28721, 42516, 42516, 42516, 34304, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28243, 22657, 22657, 44206, 22657, 27401, 46316, 46317, 46316, 48318, 38147, 38147, 34588, 38147, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 22657, 22657, 38374, 22541, 46316, 46316, 46316, 46316, 44805, 38147, 38147, 38147, 38147, 38147, 32923, 22444, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38370, 22657, 22657, 22657, 22657, 30360, 22540, 46316, 46316, 46316, 46316, 22343, 30533, 38147, 38147, 38147, 38147, 27826, 41766, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 23255, 22657, 22657, 22657, 22657, 30361, 22539, 46316, 46316, 46316, 46316, 30525, 38147, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 37745, 46316, 46316, 46316, 37798, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 19484, 42516, 51537, 42516, 42516, 42516, 42516, 25917, 42516, 42516, 42516, 42516, 46741, 49861, 51029, 26099, 42516, 42516, 42516, 27632, 42516, 42516, 36849, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 22657, 46314, 35273, 38147, 34810, 28721, 42516, 42516, 42516, 34304, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28243, 22657, 22657, 22657, 22657, 27401, 46316, 46316, 46316, 48318, 38147, 38147, 38147, 38147, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 22657, 22657, 38374, 22541, 46316, 46316, 46316, 46316, 44805, 38147, 38147, 38147, 38147, 38147, 32923, 22444, 42516, 36869, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 46294, 22657, 22657, 22657, 22657, 30360, 49232, 46316, 46316, 46316, 46316, 22343, 30796, 38147, 38147, 38147, 38147, 27826, 41766, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 23255, 22657, 22657, 22657, 22657, 30361, 22539, 46316, 46316, 46316, 46316, 30525, 38147, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 37745, 46316, 46316, 46316, 37798, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 46996, 42516, 51537, 42516, 23354, 42516, 42753, 36888, 36925, 36938, 36954, 36961, 36977, 36993, 37006, 26099, 42516, 37022, 42516, 27632, 42516, 41516, 26816, 42516, 42516, 37044, 42516, 37049, 18537, 37065, 37087, 37117, 44086, 37200, 37235, 39844, 33658, 37263, 42516, 42516, 35791, 42516, 42516, 34914, 28072, 42516, 37291, 22389, 37311, 18926, 37716, 37348, 43712, 48153, 37366, 37382, 46316, 37416, 40607, 40193, 49587, 35520, 37449, 27508, 37480, 37934, 42516, 42516, 42516, 42516, 41144, 42516, 42516, 42516, 42516, 42516, 38368, 37503, 36125, 22657, 37529, 39594, 37550, 37566, 48265, 46316, 37588, 30713, 29645, 37605, 37623, 38799, 38147, 37641, 22444, 42516, 42516, 37688, 42516, 42516, 49494, 24999, 42516, 42516, 42516, 38370, 22657, 22657, 29494, 37704, 37740, 22540, 46316, 46316, 40001, 37761, 37795, 30533, 38147, 38147, 37825, 37814, 37848, 41766, 42516, 37894, 42516, 42516, 51139, 42516, 42516, 23255, 22657, 41398, 22657, 22657, 30361, 22539, 42274, 46316, 46316, 46316, 30525, 38147, 37912, 38147, 38147, 34440, 41769, 37930, 36490, 42516, 34663, 37950, 28242, 37986, 22657, 22657, 46812, 38013, 46316, 46316, 45485, 49261, 38147, 38147, 48821, 22690, 49311, 42516, 42516, 38050, 38368, 41404, 22657, 40730, 47057, 46316, 36583, 48937, 38147, 40469, 42516, 21575, 42516, 42516, 38373, 22657, 38069, 46316, 45780, 36586, 38147, 40463, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 38089, 46273, 22694, 23034, 40134, 34366, 22755, 38105, 38164, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 26200, 42516, 51537, 42516, 27946, 42516, 42516, 47834, 20951, 20960, 38221, 38236, 38243, 38259, 38272, 26258, 42516, 38551, 42516, 27632, 42516, 34262, 42516, 42516, 42516, 38553, 42516, 38546, 21091, 38552, 21774, 38288, 31700, 35273, 38309, 34810, 28721, 42516, 42516, 38329, 34304, 42516, 29241, 23811, 23953, 42516, 42516, 42516, 38347, 38364, 33022, 22657, 38390, 38410, 28636, 46316, 29607, 39628, 38434, 42370, 38147, 48603, 38470, 47663, 38504, 38541, 39253, 39681, 42516, 42516, 42516, 42516, 41197, 42516, 42516, 42516, 38368, 31857, 22657, 38569, 22657, 38374, 22541, 38589, 28198, 46316, 46316, 44805, 29206, 27800, 32877, 38147, 38147, 32923, 22444, 42516, 28144, 42516, 38634, 42516, 45188, 42516, 38652, 42516, 42516, 38370, 39723, 22657, 22657, 38687, 30379, 22540, 23043, 46316, 46316, 38710, 22895, 30533, 49398, 38147, 38147, 38733, 27826, 41766, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 23255, 22657, 22657, 22657, 22657, 30361, 22539, 46316, 46316, 46316, 46316, 30525, 38147, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 37745, 46316, 46316, 46316, 37798, 38147, 38147, 38147, 27827, 33462, 42516, 42516, 42516, 42516, 38368, 38756, 22657, 40730, 38776, 46316, 36583, 38795, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 38815, 36586, 49663, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 49485, 38368, 44256, 40047, 45820, 38834, 38868, 32210, 38891, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 38914, 38935, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 27187, 42516, 30926, 42516, 34543, 38987, 37672, 39016, 39067, 39107, 39092, 39111, 39076, 39127, 39140, 26099, 42516, 25841, 23701, 20829, 39222, 20009, 42516, 39156, 41252, 39175, 39212, 32746, 21195, 39238, 26847, 39289, 45668, 39332, 39368, 34810, 28721, 32390, 42516, 42516, 26444, 30879, 36010, 28099, 40787, 39398, 38525, 26035, 39432, 39483, 44460, 39503, 41633, 22657, 32003, 22601, 46316, 49709, 48318, 47976, 47889, 30552, 38147, 33209, 39523, 39917, 39159, 42516, 39546, 42516, 42516, 40976, 42516, 42516, 42516, 39568, 39487, 37157, 22657, 39589, 22657, 38374, 39610, 45436, 46316, 39644, 46316, 44805, 27542, 39661, 38313, 38147, 38147, 32923, 22444, 42516, 42516, 42516, 42516, 30632, 42516, 42516, 21187, 39678, 39697, 39714, 22657, 22657, 50559, 22657, 39739, 39760, 46316, 46316, 38818, 46316, 39784, 39805, 38147, 38147, 32856, 38147, 39829, 41766, 46006, 39893, 48391, 49682, 42516, 39960, 34641, 39976, 38394, 40024, 37997, 33010, 30361, 22539, 40063, 40121, 43817, 40157, 30525, 40868, 40175, 40209, 40247, 34760, 44916, 20285, 40281, 34623, 40309, 51090, 50324, 48429, 40325, 40344, 40364, 39645, 40409, 40428, 40449, 38147, 40485, 49825, 39382, 22690, 40506, 42516, 42516, 22216, 40534, 39507, 48098, 30083, 50926, 38024, 33595, 45640, 28567, 40469, 40559, 42516, 40087, 26129, 45371, 31289, 28384, 40593, 41927, 40637, 40665, 40689, 34614, 41203, 40707, 27312, 43148, 48295, 28405, 40861, 22683, 50287, 38368, 40727, 40746, 40649, 40767, 40811, 22827, 40847, 33407, 49334, 48207, 33243, 28244, 40729, 36585, 22448, 28385, 36584, 41673, 40884, 31692, 28429, 22929, 40922, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 40951, 51537, 42516, 42744, 40972, 42516, 27292, 40992, 41001, 41017, 41032, 41039, 41055, 41068, 26099, 20248, 41084, 41102, 41129, 21286, 41166, 42516, 41182, 41219, 41286, 31731, 41302, 41336, 41352, 41368, 41384, 34883, 41420, 41436, 48349, 41477, 42516, 42240, 27121, 34422, 42516, 41511, 25267, 41532, 41575, 42516, 42516, 41594, 28243, 22657, 31843, 41613, 34053, 27401, 40159, 35568, 34847, 41649, 38147, 27550, 41689, 41744, 40896, 22382, 42516, 26380, 42516, 41578, 42516, 44762, 41785, 42516, 41828, 27866, 41270, 19255, 22657, 41881, 41897, 22657, 35406, 41916, 43971, 44095, 46316, 46316, 41950, 22851, 37219, 42001, 38147, 29467, 32923, 42028, 42044, 42516, 46644, 19385, 42516, 42516, 42516, 42516, 42516, 34632, 38370, 22657, 27339, 43920, 22657, 30360, 22540, 46316, 44514, 36395, 46316, 22343, 30533, 38147, 35478, 49592, 38147, 27826, 41766, 42516, 42516, 21305, 42516, 31235, 42516, 42516, 23255, 22657, 22657, 22657, 22657, 20064, 42074, 46316, 46316, 46316, 46316, 42093, 38147, 38147, 38147, 38147, 50734, 41769, 50664, 35952, 42516, 42516, 42516, 41113, 22657, 42177, 22657, 45759, 46316, 43945, 46316, 45799, 38147, 45843, 38147, 27827, 29041, 42127, 42516, 42516, 42516, 48412, 30671, 22657, 38073, 44692, 46316, 33520, 45533, 38147, 40469, 42146, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 43588, 34920, 42516, 42166, 40348, 33173, 48271, 42201, 22683, 42220, 41559, 42256, 42290, 42321, 33756, 44448, 35547, 42352, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 32531, 22755, 42386, 28429, 22929, 42410, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 39045, 51537, 42516, 42516, 42439, 19363, 42461, 42498, 42516, 31468, 42533, 42547, 42563, 42576, 26099, 42516, 42516, 25867, 27632, 42516, 42516, 42516, 42592, 26617, 42516, 42516, 26436, 25867, 42516, 30236, 31920, 49620, 42612, 36440, 34810, 28721, 42516, 42647, 42516, 34304, 42516, 44608, 36046, 42516, 35598, 42516, 42516, 36057, 51481, 44194, 32471, 36334, 37148, 42671, 32033, 42687, 33121, 42706, 38488, 30256, 30569, 29372, 32199, 42722, 42778, 42516, 42799, 42516, 49524, 50043, 35835, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 37175, 22657, 38374, 22541, 46316, 46316, 47563, 46316, 44805, 38147, 38147, 38147, 42836, 38147, 32923, 42853, 42888, 35656, 42516, 42516, 42516, 50763, 30902, 39460, 48700, 42516, 38370, 22657, 42923, 22657, 22657, 37350, 22540, 46316, 42958, 46316, 46316, 27403, 30533, 38147, 42991, 38147, 38147, 27826, 41766, 42516, 29233, 42516, 42516, 42516, 43017, 42516, 23255, 22657, 22657, 49093, 22657, 22325, 22539, 46316, 46316, 43039, 46316, 30788, 38147, 38147, 35485, 38147, 34440, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 37745, 46316, 46316, 46316, 37798, 38147, 38147, 38147, 27827, 22690, 42516, 36017, 42516, 42516, 43058, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 48843, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 46409, 43080, 43110, 32715, 30112, 30535, 40935, 43145, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 42516, 51537, 42516, 42516, 42516, 42516, 25917, 42516, 42516, 42516, 42516, 46741, 49861, 51029, 26099, 42516, 42516, 42516, 27632, 42516, 42516, 35061, 42516, 42516, 42516, 28279, 28282, 18254, 28275, 31684, 43164, 43182, 29146, 43216, 43233, 29330, 43270, 42516, 42516, 34304, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28243, 22657, 22657, 22657, 22657, 27401, 46316, 46316, 46316, 48318, 38147, 38147, 38147, 38147, 40896, 22382, 42516, 42516, 42516, 43287, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 22657, 22657, 38374, 43306, 46316, 46316, 46316, 46316, 50852, 38147, 38147, 38147, 38147, 38147, 32923, 22444, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38370, 22657, 22657, 22657, 22657, 30360, 22540, 46316, 46316, 46316, 46316, 22343, 30533, 38147, 38147, 38147, 38147, 27826, 41766, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 23255, 22657, 22657, 22657, 22657, 30361, 22539, 46316, 46316, 46316, 46316, 30525, 38147, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 37745, 46316, 46316, 46316, 37798, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 43323, 28384, 43789, 46316, 36586, 43341, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 50278, 22100, 42516, 42516, 50243, 42516, 29530, 43375, 33789, 43361, 43411, 43418, 43434, 43447, 26099, 42516, 33915, 33924, 27632, 40956, 43463, 43486, 41243, 43507, 26512, 26972, 26982, 27147, 41812, 42783, 43531, 49966, 43567, 43604, 44058, 40078, 42516, 42516, 42516, 23213, 43642, 34502, 43666, 43684, 38517, 42516, 42516, 35323, 43702, 22657, 43728, 30048, 43746, 43782, 42975, 46316, 43805, 34708, 43833, 43850, 27569, 49274, 49874, 43871, 42516, 42516, 42516, 45270, 35189, 42516, 42516, 43894, 43668, 42516, 42814, 33726, 22657, 43915, 22657, 37724, 49041, 43936, 46316, 43969, 46316, 45680, 43987, 44022, 33996, 38147, 38147, 44043, 44074, 22444, 42516, 42516, 19081, 42516, 44111, 44127, 42516, 43290, 44154, 44166, 44182, 22657, 37101, 44229, 44279, 30652, 44299, 46316, 42336, 45461, 44326, 40412, 44345, 38147, 44372, 45987, 44388, 34123, 41766, 28121, 42516, 42516, 24911, 44407, 50085, 42516, 44435, 27732, 44483, 22975, 22657, 30361, 22539, 44504, 42690, 46316, 46316, 30525, 28768, 44537, 44554, 38147, 40691, 44575, 42516, 44603, 44624, 42516, 42516, 28242, 44645, 22657, 22657, 44664, 44689, 46316, 46316, 49378, 44708, 38147, 38147, 49798, 22690, 42516, 44729, 42516, 42516, 20056, 22657, 22657, 34376, 46316, 51047, 22477, 38147, 44538, 40469, 42516, 22273, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 44749, 26230, 34694, 49922, 44785, 36803, 38372, 46315, 38146, 47702, 44821, 44842, 44862, 21913, 40729, 36585, 22448, 28385, 36584, 40621, 44890, 44940, 42111, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 46959, 51537, 45028, 47264, 44964, 45002, 45045, 45083, 45015, 45108, 45123, 45139, 45155, 45168, 26099, 45184, 28448, 42516, 28797, 42516, 42516, 30342, 42516, 42516, 45204, 45221, 31185, 28655, 31192, 26648, 48147, 38948, 50978, 45241, 34810, 28721, 45262, 45286, 25875, 34304, 35804, 42516, 42516, 42516, 42516, 45307, 45333, 42516, 45362, 45387, 27370, 22657, 22657, 45422, 45457, 45477, 46316, 48318, 45501, 22713, 45531, 38147, 40896, 22382, 41086, 42516, 42516, 45549, 45580, 42516, 42516, 42516, 42516, 42516, 41312, 38368, 32670, 37166, 22657, 22657, 33029, 22541, 45618, 47052, 46316, 46316, 45690, 35721, 38147, 45637, 38147, 38147, 45656, 22444, 42516, 42516, 45593, 44733, 42516, 45600, 35835, 45706, 27030, 38348, 45731, 22657, 22657, 40543, 26861, 45754, 45775, 46316, 46316, 43191, 44800, 45796, 45815, 38147, 38147, 40256, 45836, 45859, 28046, 42867, 49429, 42516, 25220, 42516, 19477, 43271, 20461, 22657, 22657, 27347, 45890, 30361, 22539, 46316, 48577, 44521, 46316, 30525, 38147, 38147, 46850, 45910, 34440, 41769, 42516, 50831, 45929, 19737, 42516, 28242, 22657, 45947, 43759, 50887, 46316, 45965, 46065, 28181, 38147, 45983, 46857, 27827, 22690, 42516, 42516, 46003, 44138, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 29031, 51383, 46022, 26136, 47337, 46039, 22657, 46056, 46316, 34383, 36586, 38147, 46089, 46111, 34920, 46149, 46173, 43148, 46207, 44846, 46228, 32903, 36804, 38368, 46247, 46266, 45515, 36803, 38372, 46315, 38146, 35099, 35240, 22504, 22913, 46289, 46310, 46333, 36758, 46387, 47879, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 27247, 51537, 42516, 42516, 23393, 42516, 46425, 46462, 46474, 46490, 46505, 46521, 46537, 46550, 26099, 46566, 25493, 25815, 46587, 26561, 21328, 46624, 21598, 42516, 46636, 46660, 46669, 46685, 46722, 46757, 46799, 32544, 46837, 46873, 41704, 47524, 33832, 37332, 35627, 34304, 46901, 42516, 44629, 46918, 39031, 46952, 46975, 47012, 47022, 48184, 31972, 27713, 43730, 47038, 31642, 47073, 47098, 47607, 47121, 47145, 47186, 47202, 47222, 47250, 47280, 47302, 42058, 42516, 47326, 47353, 42516, 42516, 47371, 47388, 46928, 47404, 47426, 47449, 47472, 29567, 47494, 47549, 47584, 47623, 47679, 36182, 44805, 36463, 37832, 40141, 38147, 32161, 32170, 47697, 42516, 45060, 42596, 50682, 47718, 42130, 47751, 46440, 36515, 21144, 38370, 47785, 29270, 22657, 44488, 47820, 47850, 47868, 40376, 46316, 45441, 47912, 47938, 47958, 43617, 38147, 38919, 47992, 41766, 29407, 48041, 42516, 27096, 48062, 42516, 50062, 40568, 48085, 38573, 48132, 48169, 30361, 48200, 48223, 48241, 48287, 48311, 47922, 47129, 22858, 48334, 43855, 34440, 40906, 48365, 50193, 42516, 22144, 48387, 48407, 44243, 48428, 22657, 49223, 47234, 48445, 46316, 47082, 50795, 48488, 38147, 33704, 22690, 42516, 48504, 48525, 42516, 20103, 22966, 48559, 32447, 40385, 48575, 48593, 50156, 48626, 48646, 48680, 42516, 33850, 39552, 21921, 26930, 48716, 48749, 48769, 48802, 45246, 48837, 48960, 48859, 48887, 32658, 28363, 48910, 33376, 48933, 48953, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 45621, 46231, 48976, 39991, 49005, 49029, 40039, 49057, 44903, 22755, 31692, 28429, 49073, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 42516, 49109, 42516, 42516, 49144, 42516, 32608, 18328, 18337, 49164, 18337, 18344, 49180, 49193, 26099, 42516, 42516, 42516, 27632, 20863, 28835, 42516, 42516, 42516, 42516, 28834, 42516, 20857, 42516, 28241, 49209, 31530, 22841, 49248, 36678, 30143, 33493, 42516, 42516, 34304, 42516, 42516, 35043, 49290, 42516, 42516, 42516, 38053, 28243, 49327, 22657, 22657, 22658, 49350, 46316, 46316, 46316, 31591, 33687, 38147, 38147, 38147, 49366, 49414, 49451, 42516, 49474, 49519, 42516, 42516, 43686, 45346, 42516, 46571, 46157, 38368, 45949, 40328, 45406, 25137, 29005, 22541, 48786, 34087, 38601, 49540, 48459, 38147, 33697, 39345, 49573, 33236, 49608, 22444, 42516, 19180, 42516, 50588, 42516, 42516, 42516, 18791, 42516, 42516, 38370, 38694, 22657, 22657, 22657, 30360, 49641, 32217, 46316, 46316, 46316, 22343, 49659, 38898, 38147, 38147, 38147, 27826, 41766, 46990, 42516, 49679, 42516, 42516, 42516, 42516, 20094, 31303, 22657, 22657, 22657, 30361, 49698, 46316, 46316, 46316, 46316, 30525, 49732, 38147, 38147, 38147, 34440, 35908, 42516, 42516, 46023, 49756, 42516, 29706, 37130, 22657, 22657, 39744, 38128, 46316, 46316, 49778, 49814, 38147, 38147, 49848, 22690, 22055, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 34322, 43148, 47105, 28405, 38446, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 49890, 49913, 49938, 22448, 28385, 36584, 34366, 34779, 33418, 49954, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 42516, 50000, 50082, 50038, 50059, 42516, 32349, 42516, 20487, 50078, 34283, 44986, 50101, 50114, 26099, 42516, 42516, 42516, 27632, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 50130, 42394, 35273, 50148, 34810, 28721, 42516, 36285, 32580, 34304, 42516, 42516, 42516, 42516, 42516, 25759, 42516, 42516, 28243, 27704, 22657, 37534, 22657, 27401, 50172, 46316, 38188, 48318, 29351, 38147, 30813, 38147, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 41597, 42516, 42516, 42516, 42476, 42516, 38368, 22657, 50132, 22657, 22657, 38374, 22541, 46316, 49557, 46316, 46316, 44805, 38147, 38147, 50449, 38147, 38147, 32923, 22444, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38370, 22657, 22657, 22657, 22657, 30360, 22540, 46316, 46316, 46316, 46316, 22343, 30533, 38147, 38147, 38147, 38147, 27826, 41766, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 23255, 22657, 22657, 22657, 22657, 30361, 22539, 46316, 46316, 46316, 46316, 30525, 38147, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 50190, 42516, 42516, 28242, 22657, 22657, 22657, 37745, 46316, 46316, 46316, 37798, 38147, 38147, 38147, 27827, 22690, 42516, 50209, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 50231, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 42516, 50266, 42516, 22306, 42516, 45067, 50303, 50340, 42516, 50365, 50380, 50394, 50410, 50423, 26099, 42516, 42516, 42516, 27632, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 45894, 46314, 50439, 28325, 41965, 36365, 42516, 42516, 42516, 34304, 42516, 42516, 42516, 42516, 25694, 42516, 42516, 42516, 28243, 22657, 22657, 22657, 22657, 27401, 46316, 46316, 46316, 48318, 38147, 38147, 38147, 38147, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 22657, 22657, 38374, 22541, 46316, 46316, 46316, 46316, 44805, 38147, 38147, 38147, 38147, 38147, 32923, 22444, 42516, 42516, 42516, 42516, 42516, 42516, 50473, 42516, 42516, 42516, 50491, 22657, 22657, 22657, 22657, 30360, 50513, 46316, 46316, 46316, 46316, 22343, 50533, 38147, 38147, 38147, 38147, 27826, 41766, 42516, 42516, 29399, 42516, 42516, 42516, 42516, 23255, 22657, 22657, 50557, 22657, 50575, 22539, 46316, 43245, 46316, 33180, 30525, 38147, 47942, 38147, 38147, 50611, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 37745, 46316, 46316, 46316, 37798, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 26324, 42516, 42516, 42516, 42516, 51537, 42516, 42516, 42516, 42516, 25917, 42516, 42516, 42516, 42516, 48543, 50631, 50644, 26099, 42516, 42516, 42516, 27632, 50660, 42516, 50680, 42516, 42516, 42516, 29122, 42516, 21452, 29118, 32973, 50698, 44948, 35273, 50716, 34810, 28721, 42516, 42516, 42516, 50750, 27264, 27883, 43515, 42516, 42516, 42516, 42516, 42516, 28243, 22657, 43166, 22657, 49088, 27401, 46316, 30696, 30175, 48318, 38147, 38147, 50786, 27533, 40896, 50811, 50827, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 22657, 22657, 38374, 22541, 46316, 46316, 46316, 46316, 44805, 38147, 38147, 38147, 38147, 38147, 32923, 22444, 42516, 42516, 42516, 42516, 42516, 42516, 51530, 42516, 42516, 42516, 38370, 22657, 27966, 22657, 22657, 27206, 22540, 46316, 36563, 46316, 46316, 48225, 30533, 38147, 43345, 38147, 38147, 27826, 41766, 21110, 42516, 42516, 42516, 42516, 42516, 42516, 23255, 36082, 22657, 22657, 22657, 30361, 22539, 50847, 46316, 46316, 46316, 30525, 40490, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 37745, 46316, 46316, 46316, 37798, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 42516, 51537, 42516, 42516, 42516, 42516, 25917, 42516, 42516, 42516, 42516, 46741, 49861, 51029, 26099, 24903, 42516, 42516, 27632, 42516, 42516, 20017, 42516, 42516, 42516, 42516, 20023, 42516, 42516, 50868, 36101, 46314, 27462, 29927, 45874, 41719, 42516, 29087, 42516, 34304, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42872, 28243, 22657, 22657, 22657, 47797, 27401, 46316, 46316, 22542, 48318, 38147, 38147, 38147, 27479, 40896, 22382, 42516, 50903, 42516, 42516, 42516, 42516, 42516, 42516, 42150, 42516, 42516, 38368, 46183, 22657, 41900, 22657, 38374, 22541, 50922, 46316, 37779, 46316, 44805, 36603, 38147, 38147, 40222, 38147, 32923, 22444, 42516, 50475, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38370, 22657, 50942, 22657, 22657, 30360, 50961, 30499, 50994, 46316, 46316, 22343, 49789, 39662, 51012, 38147, 38147, 27826, 41766, 42516, 42516, 42516, 42516, 42516, 42516, 48664, 23255, 22657, 22657, 32677, 22657, 28304, 22539, 46316, 46316, 51045, 46316, 51063, 38147, 38147, 50725, 38147, 44006, 41769, 42516, 42516, 50906, 42516, 42516, 28242, 22657, 22657, 22657, 37745, 46316, 46316, 46316, 37798, 38147, 38147, 38147, 27827, 48656, 42516, 42516, 47372, 42516, 31381, 22657, 22657, 34817, 46316, 46316, 40751, 38147, 38147, 40469, 42516, 42516, 51087, 42516, 38373, 28681, 28384, 46316, 51106, 36586, 34742, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 51361, 42516, 42516, 42516, 42516, 51537, 42516, 42516, 42516, 42516, 25917, 19962, 42516, 42516, 42516, 46741, 49861, 51029, 26099, 42516, 42516, 42516, 27632, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 22657, 46314, 35273, 38147, 34810, 28721, 42516, 42516, 42516, 34304, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28243, 22657, 22657, 22657, 22657, 27401, 46316, 46316, 46316, 48318, 38147, 38147, 38147, 38147, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 22657, 22657, 38374, 22541, 46316, 46316, 46316, 46316, 44805, 38147, 38147, 38147, 38147, 38147, 32923, 22444, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38370, 22657, 22657, 22657, 22657, 30360, 22540, 46316, 46316, 46316, 46316, 22343, 30533, 38147, 38147, 38147, 38147, 27826, 41766, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 23255, 22657, 22657, 22657, 22657, 30361, 22539, 46316, 46316, 46316, 46316, 30525, 38147, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 37745, 46316, 46316, 46316, 37798, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21141, 42516, 42516, 42516, 42516, 46123, 30288, 30286, 49299, 30156, 51124, 22408, 22410, 49308, 30152, 46133, 51161, 51174, 21040, 42516, 42516, 42516, 27632, 42516, 42516, 31797, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 32629, 20505, 20792, 18990, 21068, 19019, 18919, 18270, 40105, 18293, 18315, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 51190, 25598, 18486, 18508, 19308, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21141, 42516, 42516, 42516, 42516, 48069, 42516, 42516, 30409, 42516, 25917, 39868, 39877, 51215, 51230, 51237, 29448, 51253, 21040, 42516, 42516, 42516, 27632, 42516, 42516, 51474, 42516, 42516, 42516, 23517, 42516, 42516, 23514, 32629, 20505, 21066, 18953, 21068, 18866, 18919, 18270, 40105, 18293, 18315, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 18459, 25598, 18486, 18508, 51199, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21141, 42516, 42516, 42516, 42516, 36374, 42516, 42516, 42516, 42516, 31102, 50349, 51296, 51323, 51307, 51330, 32370, 51346, 21040, 42516, 42516, 42516, 27632, 42516, 42516, 51474, 51382, 42516, 26083, 42516, 42516, 42516, 26079, 32629, 20505, 21066, 18953, 21068, 19019, 18919, 18270, 40105, 18293, 18315, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 51399, 25598, 18486, 18508, 21522, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 20235, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 20381, 20397, 20422, 20606, 20438, 20477, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 21141, 42516, 42516, 42516, 42516, 48069, 42516, 42516, 42516, 42516, 25917, 42516, 42516, 42516, 42516, 42516, 42516, 42517, 26099, 42516, 42516, 42516, 27632, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28241, 22657, 46314, 35273, 38147, 34810, 46363, 42516, 42516, 42516, 34304, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 28243, 22657, 22657, 22657, 22657, 22341, 46316, 46316, 46316, 39789, 38147, 38147, 38147, 38147, 40896, 22382, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 22657, 22657, 38374, 22541, 46316, 46316, 46316, 46316, 44805, 38147, 38147, 38147, 38147, 38147, 32923, 22444, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 38370, 22657, 22657, 22657, 22657, 30360, 22540, 46316, 46316, 46316, 46316, 22343, 30533, 38147, 38147, 38147, 38147, 27826, 41766, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 23255, 22657, 22657, 22657, 22657, 30361, 22539, 46316, 46316, 46316, 46316, 30525, 38147, 38147, 38147, 38147, 34440, 41769, 42516, 42516, 42516, 42516, 42516, 28242, 22657, 22657, 22657, 37745, 46316, 46316, 46316, 37798, 38147, 38147, 38147, 27827, 22690, 42516, 42516, 42516, 42516, 38368, 22657, 22657, 40730, 46316, 46316, 36583, 38147, 38147, 40469, 42516, 42516, 42516, 42516, 38373, 22657, 28384, 46316, 46316, 36586, 38147, 27827, 22690, 34920, 42516, 38372, 43148, 46316, 28405, 38147, 22683, 36804, 38368, 28385, 28404, 30535, 36803, 38372, 46315, 38146, 28238, 43147, 27775, 22913, 28244, 40729, 36585, 22448, 28385, 36584, 34366, 22755, 31692, 28429, 22929, 23000, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 23494, 42516, 42516, 45092, 51424, 51429, 51429, 51451, 23492, 51445, 51467, 42516, 42516, 42516, 42516, 42516, 42516, 51474, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 32629, 20505, 21066, 18953, 21068, 19019, 18919, 18270, 40105, 18293, 51497, 42516, 42516, 18360, 42516, 49435, 42820, 18380, 18411, 18395, 18574, 19226, 18433, 20169, 51190, 25598, 18486, 18508, 19308, 18465, 25604, 18492, 18514, 20728, 18530, 42516, 30418, 42516, 42516, 42516, 50250, 25964, 50770, 42516, 18553, 39446, 18564, 20175, 20411, 20131, 20505, 23879, 18590, 26008, 18612, 18632, 18596, 18470, 18594, 26012, 18616, 18636, 20798, 20741, 20757, 42516, 18652, 18689, 18711, 18748, 18695, 18788, 42516, 41546, 48871, 18807, 18835, 19802, 18823, 19840, 25206, 18851, 18904, 18942, 18979, 19680, 19006, 18851, 18904, 18942, 18979, 19680, 19045, 20750, 46697, 19097, 19132, 20936, 31767, 19148, 19174, 19196, 20141, 20921, 19788, 19212, 19242, 19278, 25525, 20579, 19301, 19596, 19271, 25518, 20572, 19294, 19589, 19324, 19353, 35639, 19379, 39467, 19401, 41728, 19421, 19500, 24458, 19544, 19575, 19614, 19632, 19650, 19559, 19612, 19630, 19648, 19666, 19029, 19696, 19712, 19728, 19753, 19773, 19830, 19435, 19449, 19888, 19905, 19856, 19887, 19904, 19921, 19947, 19984, 20043, 20080, 20119, 20157, 20536, 20191, 20213, 20542, 20197, 20219, 19931, 51517, 20264, 20301, 20317, 20346, 20333, 20349, 20365, 51553, 20397, 20422, 20606, 20438, 20453, 20503, 21067, 21068, 20521, 20558, 20595, 20622, 20652, 23888, 18878, 20683, 20699, 20715, 20779, 20814, 20880, 20890, 20906, 19463, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 42516, 94506, 94506, 94506, 94506, 94506, 94506, 94506, 94506, 94506, 94506, 0, 94506, 90409, 94506, 94506, 94506, 94506, 94506, 94506, 94506, 94506, 94506, 365, 94506, 90409, 94506, 94506, 94506, 94506, 94506, 94506, 94506, 69632, 73728, 94506, 94506, 94506, 94506, 94506, 65536, 94506, 12290, 3, 0, 0, 2183168, 0, 0, 0, 90409, 94506, 299, 300, 0, 2134016, 303, 304, 304, 304, 304, 304, 304, 304, 0, 0, 0, 0, 0, 304, 0, 304, 1, 289, 3, 0, 0, 0, 295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 796, 0, 796, 0, 0, 0, 0, 0, 2424832, 2433024, 0, 0, 2457600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 650, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2904064, 2908160, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1685, 1686, 0, 1688, 0, 0, 0, 0, 3117056, 0, 0, 0, 0, 0, 0, 0, 365, 365, 0, 0, 0, 0, 0, 0, 448, 0, 0, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 474, 559, 582, 559, 582, 559, 559, 582, 0, 0, 0, 2138112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2991, 0, 0, 0, 2772992, 2805760, 2830336, 0, 2863104, 2920448, 0, 0, 0, 0, 0, 0, 0, 2805760, 2920448, 0, 0, 0, 0, 0, 0, 0, 2732032, 0, 2179072, 2179072, 2179072, 2179072, 2424832, 2433024, 0, 0, 0, 0, 0, 2920448, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1702, 0, 1704, 0, 0, 2179072, 2830336, 2179072, 2179072, 2863104, 2179072, 2179072, 2179072, 2179072, 2920448, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2126737, 2126737, 2126737, 2126737, 2126737, 2593681, 2126737, 2126737, 2126737, 2126737, 0, 914, 2125824, 2125824, 2125824, 2125824, 2125824, 2424832, 2433024, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 2125824, 2125824, 2125824, 2125824, 2723840, 2125824, 2732032, 2772992, 2125824, 2125824, 2125824, 2805760, 2125824, 2830336, 2125824, 2125824, 2863104, 2125824, 2125824, 2125824, 2125824, 2920448, 2125824, 2125824, 2125824, 2125824, 2125824, 2920448, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3117056, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2457600, 2125824, 2125824, 2125824, 2125824, 2183168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 661, 0, 661, 0, 0, 0, 2408448, 0, 0, 2584576, 0, 0, 0, 0, 2838528, 0, 0, 2838528, 0, 0, 0, 0, 0, 2179072, 2179072, 2179072, 2408448, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2625536, 2179072, 2179072, 0, 2125824, 2125824, 2125824, 2408448, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3125248, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2662400, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2801664, 2813952, 2125824, 2125824, 2801664, 2813952, 2125824, 2838528, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2461696, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2600960, 0, 0, 0, 0, 0, 0, 2441, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2493, 2494, 0, 0, 2497, 0, 2768896, 2777088, 2781184, 0, 2822144, 0, 0, 2883584, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3055616, 0, 0, 0, 3080192, 3100672, 3104768, 0, 0, 0, 0, 3186688, 0, 0, 0, 0, 0, 0, 0, 307, 204800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111051, 111051, 111051, 111051, 111051, 111051, 111051, 111051, 1, 0, 0, 0, 0, 0, 2797568, 0, 0, 0, 0, 0, 0, 0, 2850816, 2867200, 0, 0, 0, 0, 0, 441, 0, 0, 332, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 468, 0, 0, 3133440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2131, 0, 0, 0, 0, 0, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2461696, 2465792, 2179072, 2768896, 2777088, 2781184, 2797568, 2822144, 2179072, 2179072, 2179072, 2883584, 2179072, 2912256, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2523136, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2600960, 0, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2461696, 2465792, 2125824, 0, 1142784, 0, 2179072, 2125824, 2125824, 2179072, 2179072, 2179072, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2592768, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 24576, 988, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2523136, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2600960, 2125824, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 1272, 541, 541, 541, 541, 2125824, 2125824, 2125824, 2641920, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2719744, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 299, 0, 0, 0, 299, 0, 300, 0, 0, 0, 2768896, 2777088, 2781184, 2797568, 2822144, 2125824, 2125824, 2125824, 2883584, 2125824, 2912256, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 2125824, 2126812, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3133440, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3207168, 2125824, 0, 0, 0, 2179072, 2125824, 2125824, 2179072, 2179072, 2179072, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 2510848, 2514944, 0, 0, 2125824, 2125824, 3133440, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3207168, 2125824, 2179072, 2125824, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 300, 0, 0, 0, 0, 0, 0, 2764, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2059, 2060, 0, 2062, 2063, 0, 0, 0, 0, 2605056, 0, 0, 0, 0, 2887680, 0, 2924544, 0, 0, 0, 0, 0, 0, 0, 2108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1177, 0, 0, 0, 0, 0, 0, 3162112, 3170304, 0, 0, 3219456, 3035136, 0, 0, 0, 0, 0, 3072000, 3190784, 0, 0, 0, 0, 0, 0, 0, 0, 2576384, 0, 0, 0, 0, 0, 0, 0, 334, 0, 0, 334, 0, 0, 334, 0, 0, 0, 0, 0, 0, 0, 2387968, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2050, 0, 0, 0, 0, 3121152, 3141632, 0, 0, 0, 2924544, 0, 2682880, 0, 0, 0, 0, 0, 0, 3112960, 2387968, 2924544, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 3035136, 2179072, 2179072, 3072000, 2179072, 2179072, 2179072, 2179072, 2699264, 2179072, 2715648, 2179072, 2723840, 2179072, 2732032, 2772992, 2179072, 2179072, 2179072, 2805760, 3121152, 2179072, 2179072, 3141632, 2179072, 2179072, 2179072, 3170304, 2179072, 2179072, 3190784, 3194880, 2179072, 0, 0, 0, 0, 0, 0, 541, 1734, 541, 541, 541, 541, 541, 541, 1740, 541, 2125824, 3190784, 3194880, 2125824, 0, 0, 0, 0, 0, 0, 2387968, 2125824, 2125824, 2125824, 2420736, 2125824, 2125824, 2125824, 2125824, 2125824, 2453504, 2125824, 2473984, 2125824, 2736128, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2887680, 2125824, 2125824, 2924544, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 3141632, 2125824, 2125824, 2125824, 3170304, 2125824, 2125824, 3190784, 3194880, 2125824, 2179072, 2125824, 2125824, 2179072, 2179072, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 299, 0, 300, 3112960, 3219456, 2125824, 2125824, 3112960, 3219456, 2125824, 2125824, 3112960, 3219456, 0, 0, 0, 0, 0, 0, 0, 347, 0, 405, 0, 0, 0, 0, 0, 405, 3022848, 0, 0, 3145728, 0, 3203072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2072, 0, 0, 0, 0, 0, 0, 0, 3067904, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3003, 0, 0, 0, 0, 0, 2621440, 0, 3182592, 2899968, 0, 2961408, 0, 0, 2179072, 2179072, 2416640, 2179072, 2179072, 2179072, 2179072, 2928640, 2179072, 2179072, 2179072, 2998272, 2179072, 2179072, 2179072, 2179072, 3059712, 2179072, 2179072, 2179072, 2179072, 3178496, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2494464, 2125824, 2125824, 0, 2179072, 2125824, 2125824, 0, 2179072, 2125824, 2125824, 2985984, 2985984, 2985984, 2985984, 0, 0, 0, 0, 0, 0, 2490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 335, 0, 0, 0, 0, 0, 0, 2179072, 2445312, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2551808, 2179072, 2179072, 2179072, 2179072, 3178496, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2495377, 2126737, 2126737, 2126737, 2126737, 2126737, 3179409, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2495451, 2126811, 2895872, 2916352, 2179072, 2179072, 2945024, 2179072, 2179072, 2994176, 2179072, 3002368, 2179072, 2179072, 3022848, 2179072, 3067904, 3084288, 2125824, 3096576, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3223552, 0, 0, 2125824, 2125824, 2416640, 3096576, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 3223552, 0, 0, 2125824, 2125824, 2416640, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3035136, 2125824, 2125824, 3072000, 2125824, 2125824, 2125824, 3121152, 2125824, 2125824, 3141632, 2125824, 2125824, 2125824, 3170304, 2125824, 2125824, 2125824, 2125824, 2445312, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2551808, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2637824, 2125824, 2125824, 2125824, 2125824, 2727936, 2752512, 2125824, 2125824, 2125824, 2125824, 2842624, 2846720, 2842624, 2846720, 2125824, 2895872, 2916352, 2125824, 2125824, 2945024, 2125824, 2125824, 2994176, 2125824, 3002368, 2125824, 2125824, 3022848, 2125824, 3067904, 2125824, 3067904, 3084288, 2125824, 3096576, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3223552, 2179072, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3039232, 2125824, 3063808, 2125824, 2125824, 2125824, 2125824, 2125824, 3100672, 2547712, 2596864, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3178496, 2670592, 0, 2744320, 0, 0, 0, 0, 0, 2928640, 0, 0, 0, 3059712, 0, 2543616, 2666496, 0, 2633728, 0, 0, 0, 0, 0, 0, 2494464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2780, 0, 0, 0, 0, 2785, 0, 0, 0, 0, 2957312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3188, 0, 0, 0, 0, 3211264, 0, 0, 0, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2494464, 2179072, 2179072, 2179072, 2707456, 2179072, 2736128, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2887680, 2179072, 2179072, 2179072, 2179072, 2641920, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2719744, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 3137536, 2126737, 2126737, 2499473, 2126737, 2126737, 2126737, 2556817, 2565009, 2179072, 2514944, 2179072, 2179072, 2179072, 2543616, 2547712, 2179072, 2179072, 2596864, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 3039232, 2179072, 3063808, 2179072, 2179072, 2179072, 2179072, 3100672, 2125824, 2125824, 2125824, 2125824, 2125824, 3178496, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2494464, 2125824, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 1080, 1084, 0, 0, 1088, 2125824, 2514944, 2125824, 2125824, 2125824, 2543616, 2547712, 2125824, 2125824, 2596864, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2928640, 2125824, 2125824, 2125824, 2998272, 2125824, 2125824, 2125824, 2125824, 3059712, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3178496, 2179072, 2125824, 2125824, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 0, 2486272, 0, 0, 0, 0, 0, 2678784, 2854912, 3006464, 2441216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2932736, 2965504, 0, 0, 3076096, 0, 0, 0, 0, 0, 444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 407, 0, 0, 0, 0, 0, 0, 2695168, 3174400, 2646016, 2613248, 2703360, 0, 0, 0, 0, 2977792, 0, 0, 3047424, 3129344, 0, 0, 0, 0, 0, 645, 0, 0, 648, 649, 0, 0, 0, 0, 0, 0, 0, 725, 0, 0, 0, 0, 0, 0, 0, 0, 0, 743, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2769, 0, 0, 0, 2981888, 2396160, 0, 3153920, 0, 0, 0, 0, 0, 0, 0, 0, 2740224, 0, 0, 0, 0, 0, 0, 541, 3027, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2584, 541, 541, 541, 0, 0, 0, 0, 0, 2793472, 0, 0, 0, 0, 0, 2469888, 2506752, 2756608, 0, 0, 2580480, 0, 0, 0, 0, 0, 0, 2517, 0, 0, 0, 0, 0, 0, 0, 0, 541, 541, 541, 3029, 541, 541, 541, 541, 541, 541, 0, 2396160, 2400256, 2179072, 2179072, 2441216, 2179072, 2469888, 2179072, 2179072, 2179072, 2519040, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2801664, 2813952, 2179072, 2838528, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2453504, 2179072, 2473984, 2482176, 2179072, 2179072, 2179072, 2179072, 2588672, 2179072, 2613248, 2646016, 2179072, 2179072, 2695168, 2756608, 2179072, 2179072, 2179072, 2932736, 2179072, 2179072, 2179072, 2179072, 2179072, 3117056, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2584576, 2179072, 2179072, 2125824, 2125824, 2125824, 2519040, 2125824, 2125824, 2125824, 2125824, 2588672, 2125824, 2613248, 2646016, 2125824, 2125824, 2695168, 2756608, 2125824, 2125824, 2125824, 2125824, 2932736, 2125824, 2125824, 2125824, 2125824, 2125824, 2932736, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3129344, 2125824, 2125824, 3153920, 3166208, 3174400, 2506752, 2506752, 2506752, 0, 3108864, 3198976, 0, 0, 3043328, 0, 3149824, 2936832, 0, 2760704, 3180, 2437120, 0, 0, 0, 0, 0, 0, 646, 0, 0, 0, 0, 651, 652, 653, 654, 655, 0, 0, 0, 0, 0, 2953216, 0, 0, 2826240, 3158016, 2428928, 0, 3018752, 2764800, 2572288, 0, 0, 0, 0, 0, 677, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2741, 0, 0, 0, 0, 0, 3051520, 2179072, 2428928, 2437120, 2179072, 2486272, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2654208, 2678784, 2760704, 2764800, 2854912, 2969600, 2179072, 3006464, 2179072, 3018752, 2179072, 2179072, 2179072, 3149824, 2125824, 2428928, 2437120, 2969600, 2125824, 3006464, 2125824, 3018752, 2125824, 2125824, 2125824, 2125824, 3149824, 2125824, 2428928, 2437120, 2125824, 2486272, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2654208, 2678784, 2760704, 2764800, 2785280, 2854912, 2969600, 2125824, 3006464, 2125824, 3018752, 2125824, 2125824, 2125824, 2125824, 3149824, 2179072, 3051520, 2125824, 3051520, 2125824, 3051520, 0, 2490368, 2498560, 0, 0, 0, 0, 2875392, 0, 0, 0, 3180, 0, 0, 0, 0, 0, 0, 2834432, 0, 3227648, 2568192, 2564096, 0, 2940928, 2179072, 2179072, 2498560, 2179072, 2179072, 2179072, 2555904, 2564096, 2179072, 2179072, 2179072, 2617344, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2662400, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 3137536, 2125824, 2125824, 2498560, 2125824, 2125824, 2125824, 2555904, 2564096, 2125824, 2555904, 2564096, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3137536, 2940928, 2940928, 0, 0, 0, 0, 0, 2748416, 2879488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2519, 0, 0, 0, 0, 0, 541, 2940928, 0, 0, 0, 0, 0, 2748416, 2879488, 0, 3180, 0, 0, 0, 0, 0, 0, 0, 375, 0, 0, 0, 0, 0, 0, 0, 360, 0, 0, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2125824, 0, 2502656, 0, 0, 3010560, 0, 0, 0, 0, 0, 0, 0, 0, 2990080, 2179072, 2179072, 2179072, 3129344, 2179072, 2179072, 3153920, 3166208, 3174400, 2396160, 2400256, 2125824, 2125824, 2441216, 2125824, 2469888, 2125824, 2125824, 2125824, 2519040, 2125824, 2125824, 2179072, 2502656, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 3010560, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2605056, 2125824, 2629632, 2125824, 2125824, 2650112, 2125824, 2125824, 2125824, 2707456, 2125824, 2736128, 2125824, 2125824, 2125824, 2125824, 2125824, 2502656, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3010560, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3137536, 2125824, 2125824, 2498560, 2125824, 2125824, 2502656, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3010560, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 2739, 0, 0, 0, 0, 0, 0, 0, 2743, 0, 0, 0, 2592768, 0, 0, 0, 0, 0, 0, 2179072, 2179072, 2179072, 2179072, 2179072, 2592768, 2179072, 2179072, 2179072, 3129344, 2179072, 2179072, 3153920, 3166208, 3174400, 2397073, 2401169, 2126737, 2126737, 2442129, 2126737, 2470801, 2125824, 2125824, 2449408, 0, 2535424, 3031040, 2859008, 0, 0, 0, 0, 0, 2179072, 2449408, 2179072, 2535424, 2179072, 2609152, 2179072, 2859008, 2179072, 2179072, 2179072, 3031040, 2125824, 2449408, 2125824, 2535424, 2125824, 2609152, 2125824, 2859008, 2125824, 2125824, 2125824, 3031040, 2125824, 2125824, 2449408, 2125824, 2535424, 2125824, 2609152, 2125824, 2859008, 2125824, 2125824, 2125824, 0, 2179072, 2125824, 2125824, 2457600, 2179072, 2179072, 2179072, 2179072, 2457600, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2179072, 2125824, 2125824, 2179072, 2179072, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1727, 0, 0, 1728, 0, 3031040, 2125824, 2527232, 0, 0, 0, 0, 0, 2179072, 2527232, 2179072, 2179072, 2179072, 2179072, 2179072, 2125824, 2126738, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3125248, 2125824, 2125824, 2125824, 2125824, 2125824, 2527232, 2125824, 2125824, 2125824, 2125824, 2125824, 3092480, 2125824, 2527232, 2125824, 2125824, 2125824, 2125824, 2125824, 3092480, 0, 0, 0, 0, 0, 693, 0, 0, 0, 0, 0, 0, 365, 365, 365, 0, 0, 0, 0, 0, 707, 708, 0, 0, 0, 0, 0, 714, 0, 0, 0, 0, 0, 0, 703, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3020, 3026944, 0, 0, 0, 2404352, 2179072, 2179072, 2179072, 2179072, 3026944, 2404352, 2125824, 2125824, 2125824, 2125824, 3026944, 0, 2539520, 0, 2949120, 2179072, 2658304, 2973696, 2179072, 2125824, 2658304, 2973696, 2125824, 2125824, 2658304, 2973696, 2125824, 0, 2711552, 2560000, 2179072, 2560000, 2125824, 2560000, 2125824, 0, 2179072, 2179072, 2531328, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2605056, 2179072, 2629632, 2179072, 2179072, 2650112, 0, 0, 2809856, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3088384, 0, 0, 0, 0, 0, 442, 0, 0, 454, 470, 470, 470, 470, 470, 470, 470, 470, 470, 470, 480, 470, 470, 470, 470, 470, 111051, 111051, 111051, 111051, 111051, 111051, 111051, 111051, 111051, 111051, 111051, 111051, 111051, 111051, 111051, 111051, 459, 459, 111051, 459, 459, 459, 459, 459, 459, 459, 459, 459, 111051, 111051, 111051, 111051, 111051, 111051, 111051, 111051, 111051, 111051, 459, 111051, 111051, 111051, 459, 111051, 111051, 111051, 111051, 111051, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2795, 0, 0, 0, 0, 0, 0, 12290, 3, 0, 0, 2183168, 0, 0, 0, 0, 0, 299, 300, 0, 2134016, 303, 304, 2125824, 1060, 0, 0, 2179072, 2125824, 2125824, 2179072, 2179072, 2179072, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 1060, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 662, 0, 662, 0, 0, 0, 0, 303, 118784, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2434, 0, 303, 303, 303, 303, 303, 303, 303, 0, 0, 0, 0, 0, 303, 0, 303, 1, 12290, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2155, 0, 12290, 3, 0, 0, 2183168, 0, 0, 0, 0, 0, 33403, 300, 0, 2134016, 49791, 304, 2105632, 12290, 3, 0, 0, 294, 0, 0, 0, 0, 294, 0, 0, 0, 0, 0, 0, 0, 2124, 0, 0, 0, 0, 0, 0, 0, 0, 0, 788, 814, 0, 814, 809, 0, 0, 0, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 0, 0, 0, 122880, 0, 122880, 122880, 122880, 0, 0, 0, 0, 0, 122880, 0, 0, 122880, 0, 0, 0, 0, 0, 0, 0, 0, 122880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3002, 0, 0, 0, 0, 0, 0, 0, 0, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 122880, 0, 0, 122880, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 712, 0, 0, 0, 716, 0, 0, 0, 147456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2459, 0, 1092, 0, 2424832, 2433024, 0, 0, 2457600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 728, 0, 0, 0, 0, 0, 1823, 2125824, 2125824, 2125824, 2408448, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 1919, 2125824, 2125824, 2125824, 0, 0, 0, 131072, 0, 0, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 0, 740, 407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1158, 0, 0, 0, 0, 0, 0, 131072, 0, 0, 131072, 131072, 0, 0, 0, 0, 0, 0, 0, 131072, 0, 0, 131072, 0, 0, 131072, 0, 0, 0, 0, 135168, 135168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2756, 0, 0, 0, 0, 135168, 0, 0, 135168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 735, 0, 797, 0, 0, 0, 0, 0, 0, 0, 135168, 0, 135168, 135168, 135168, 135168, 135168, 135168, 0, 135168, 135168, 135168, 135168, 135168, 135168, 135168, 0, 0, 0, 0, 0, 135168, 0, 135168, 1, 12290, 3, 0, 0, 2183168, 0, 0, 0, 0, 0, 636, 637, 0, 2134016, 640, 641, 0, 1361, 2125824, 2125824, 2125824, 2125824, 2125824, 2424832, 2433024, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 987, 2125824, 2125824, 2125824, 2125824, 0, 304, 139264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225709, 0, 12290, 3, 0, 0, 2183168, 0, 0, 0, 0, 0, 299, 33406, 0, 2134016, 303, 49794, 0, 61440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3178, 0, 304, 2424832, 2433024, 0, 0, 2457600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 757, 0, 0, 0, 0, 762, 301, 301, 301, 143661, 371, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 143661, 301, 301, 143661, 301, 301, 301, 143731, 301, 301, 301, 143731, 69632, 73728, 301, 301, 143661, 301, 301, 65536, 301, 301, 301, 301, 301, 143661, 143661, 143661, 143661, 143661, 143661, 143661, 143661, 143661, 301, 301, 143661, 301, 301, 301, 301, 301, 301, 301, 301, 301, 366, 301, 0, 143661, 301, 301, 301, 143661, 143661, 143661, 143661, 143661, 143661, 143661, 143661, 143661, 143661, 143661, 143661, 143661, 143661, 143661, 143661, 301, 301, 301, 143661, 301, 143661, 143661, 143661, 143661, 143661, 143731, 143661, 143731, 143731, 143731, 143731, 143731, 143731, 143731, 143661, 143661, 143661, 143661, 143661, 143661, 143661, 143661, 1, 301, 143661, 301, 143661, 143661, 143661, 143661, 143661, 143661, 301, 0, 301, 0, 301, 301, 301, 301, 301, 301, 301, 301, 301, 143661, 301, 143661, 143661, 143661, 143661, 301, 0, 0, 0, 3117056, 0, 0, 0, 0, 0, 0, 0, 2200252, 2200252, 0, 0, 0, 0, 0, 0, 662, 0, 0, 0, 0, 0, 541, 541, 541, 541, 541, 541, 541, 541, 2168, 541, 541, 541, 0, 0, 0, 0, 0, 155648, 155648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 325, 0, 0, 0, 0, 155648, 155648, 0, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 0, 0, 0, 0, 155648, 0, 0, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 155648, 0, 0, 0, 0, 0, 155648, 0, 155648, 0, 0, 0, 0, 0, 155648, 0, 0, 0, 0, 0, 155648, 155648, 0, 155648, 155648, 0, 12290, 3, 0, 0, 2183168, 126976, 0, 0, 0, 0, 299, 300, 0, 2134016, 303, 304, 0, 0, 0, 3117056, 0, 0, 0, 0, 0, 0, 0, 365, 0, 0, 0, 0, 0, 0, 0, 3563, 0, 541, 541, 541, 541, 541, 541, 541, 541, 541, 3209, 541, 541, 541, 541, 541, 159744, 159744, 159744, 159744, 0, 0, 159744, 0, 0, 0, 0, 0, 0, 0, 0, 159744, 0, 0, 0, 0, 0, 0, 0, 159744, 159744, 159744, 163840, 159744, 159744, 159744, 159744, 159744, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2805, 0, 541, 541, 541, 541, 541, 0, 25162, 0, 0, 0, 159744, 0, 0, 0, 25162, 25162, 25162, 159744, 25162, 25162, 25162, 25162, 25162, 25162, 25162, 25162, 159744, 159744, 159744, 159744, 25162, 159744, 25162, 1, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 1, 167936, 167936, 167936, 167936, 0, 0, 167936, 0, 0, 0, 0, 0, 0, 0, 0, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2976, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2138112, 1183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3168, 0, 0, 0, 0, 0, 0, 0, 0, 172032, 0, 172032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 0, 293, 0, 0, 0, 348, 172032, 172032, 0, 0, 172032, 0, 0, 172032, 172032, 0, 172032, 0, 0, 0, 0, 172032, 172032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172032, 0, 0, 0, 0, 0, 0, 2777, 0, 0, 0, 0, 0, 0, 2784, 0, 0, 0, 0, 0, 0, 2986, 2987, 0, 2988, 0, 2990, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 135168, 135168, 0, 0, 65536, 135168, 172032, 0, 172032, 172032, 0, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3014, 0, 0, 0, 0, 0, 0, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 1, 176128, 176128, 176128, 176128, 0, 0, 176128, 0, 0, 0, 0, 0, 0, 0, 0, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3175, 0, 0, 0, 0, 0, 0, 0, 3, 78115, 78115, 293, 0, 634, 0, 0, 0, 299, 300, 0, 2134016, 303, 304, 1164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 361, 541, 541, 1308, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 0, 0, 2242, 0, 914, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 0, 0, 587, 587, 587, 1203, 541, 587, 563, 541, 541, 541, 541, 541, 563, 563, 563, 563, 3070, 563, 563, 563, 563, 3074, 563, 563, 587, 587, 587, 587, 587, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1102, 0, 0, 0, 0, 0, 0, 0, 229376, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1134592, 0, 0, 0, 0, 1691, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3201, 563, 563, 587, 587, 587, 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 541, 541, 541, 3569, 541, 541, 0, 0, 563, 563, 563, 563, 563, 563, 563, 2251, 563, 563, 563, 563, 563, 563, 587, 3109, 587, 587, 587, 587, 587, 587, 587, 587, 2407, 587, 587, 587, 587, 587, 2412, 2413, 563, 563, 2288, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3541, 587, 587, 587, 2375, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1497, 587, 587, 0, 0, 0, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1439, 0, 3007, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3317, 541, 541, 541, 541, 3038, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1300, 541, 541, 541, 563, 563, 563, 3078, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1401, 563, 563, 563, 587, 587, 587, 587, 3120, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1042, 587, 587, 587, 587, 0, 3159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 155648, 3214, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1359, 563, 563, 563, 587, 3259, 587, 587, 587, 3262, 587, 587, 587, 587, 587, 587, 587, 541, 541, 563, 563, 587, 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3609, 541, 541, 541, 587, 587, 3270, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1498, 587, 587, 541, 541, 541, 3330, 3331, 541, 541, 541, 541, 541, 541, 541, 541, 563, 563, 563, 563, 3581, 563, 563, 563, 563, 563, 3349, 563, 563, 563, 563, 563, 563, 563, 563, 563, 587, 587, 587, 587, 587, 587, 587, 587, 0, 541, 541, 541, 3406, 541, 541, 541, 541, 563, 563, 563, 563, 563, 563, 3415, 563, 0, 587, 587, 587, 587, 587, 291, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 1, 587, 3431, 587, 587, 587, 587, 587, 587, 3437, 587, 587, 587, 3441, 587, 541, 563, 563, 3473, 563, 563, 563, 563, 3478, 563, 563, 563, 563, 3483, 563, 563, 563, 563, 977, 563, 563, 563, 563, 0, 587, 587, 587, 587, 587, 587, 1931, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2678, 587, 587, 587, 2681, 587, 587, 0, 0, 3456, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 0, 2586, 0, 541, 3471, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 0, 2327, 563, 3487, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 0, 0, 563, 563, 587, 587, 587, 587, 0, 0, 541, 541, 563, 563, 587, 587, 0, 541, 541, 541, 3205, 541, 541, 541, 541, 541, 541, 541, 3210, 541, 541, 541, 541, 541, 541, 2816, 541, 541, 2820, 541, 541, 541, 541, 541, 541, 541, 541, 3041, 541, 541, 541, 541, 541, 541, 541, 541, 2556, 541, 541, 541, 541, 541, 541, 541, 541, 2233, 541, 541, 541, 541, 541, 0, 0, 563, 587, 0, 541, 563, 587, 0, 541, 563, 587, 0, 541, 563, 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3510, 0, 0, 0, 0, 541, 541, 541, 541, 541, 2165, 541, 541, 541, 541, 541, 541, 541, 541, 3616, 563, 563, 563, 563, 563, 563, 563, 2265, 563, 563, 563, 563, 2270, 563, 563, 563, 184932, 184932, 184932, 184932, 184932, 184932, 184932, 0, 0, 0, 0, 0, 184932, 0, 184932, 1, 12290, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 301, 301, 0, 0, 301, 301, 143661, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 143731, 301, 301, 301, 301, 12290, 3, 78115, 78115, 293, 0, 0, 0, 0, 0, 299, 300, 0, 2134016, 303, 304, 587, 0, 0, 188416, 541, 587, 563, 541, 541, 541, 541, 541, 563, 563, 563, 563, 587, 587, 587, 587, 0, 0, 0, 0, 2731, 0, 0, 0, 0, 305, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249856, 0, 0, 0, 192972, 192972, 192972, 192972, 192972, 192972, 192972, 192972, 192972, 192972, 192972, 192972, 192972, 192972, 192972, 192972, 0, 192972, 0, 1, 0, 0, 0, 0, 0, 192972, 192972, 192972, 192972, 192972, 192972, 192972, 192972, 192972, 192972, 0, 0, 192972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1145, 365, 365, 0, 0, 1148, 192972, 192972, 192972, 0, 192972, 192972, 192972, 192972, 192972, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3304, 0, 3180, 0, 0, 0, 0, 302, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 407, 407, 407, 407, 407, 407, 407, 0, 0, 0, 0, 0, 407, 0, 407, 1, 12290, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 118784, 299, 12290, 3, 78115, 78115, 293, 0, 0, 0, 0, 0, 299, 300, 0, 302, 303, 304, 587, 0, 0, 740, 541, 587, 563, 541, 541, 541, 541, 541, 563, 563, 563, 563, 587, 587, 587, 587, 0, 0, 2729, 0, 0, 0, 0, 0, 0, 740, 1184, 0, 0, 0, 0, 1188, 0, 0, 0, 0, 0, 0, 0, 378, 0, 381, 0, 0, 0, 381, 0, 0, 563, 587, 587, 587, 587, 587, 1079, 1559, 0, 0, 0, 1565, 0, 0, 0, 1571, 2034, 0, 0, 0, 0, 1577, 2036, 0, 0, 0, 0, 0, 0, 0, 397, 0, 0, 0, 0, 0, 397, 0, 0, 0, 0, 0, 1577, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262144, 0, 0, 0, 0, 0, 1188, 1669, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3177, 0, 0, 0, 563, 563, 587, 587, 587, 587, 1559, 2030, 0, 0, 0, 0, 1565, 2032, 0, 0, 0, 0, 0, 0, 2997, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1586, 1587, 0, 0, 0, 0, 0, 0, 0, 0, 1669, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106496, 0, 0, 0, 0, 0, 0, 2034, 0, 2036, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1150976, 0, 0, 0, 0, 0, 563, 563, 563, 563, 2325, 2652, 0, 0, 0, 0, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2343, 0, 307, 0, 307, 0, 0, 0, 0, 0, 0, 0, 0, 0, 307, 0, 0, 0, 0, 0, 0, 3011, 0, 0, 0, 0, 3016, 3017, 0, 3019, 0, 0, 0, 0, 0, 204800, 204800, 0, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 204800, 205107, 204800, 204800, 205106, 205107, 204800, 205106, 205106, 204800, 204800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122880, 0, 122880, 122880, 122880, 122880, 122880, 12290, 3, 0, 0, 2183801, 0, 0, 0, 0, 0, 299, 300, 151552, 2134016, 303, 304, 0, 212992, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172032, 0, 0, 151552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 303, 0, 0, 0, 0, 0, 3117056, 0, 0, 0, 0, 0, 0, 0, 0, 2200253, 0, 0, 0, 0, 0, 0, 678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2977, 0, 0, 0, 0, 0, 0, 914, 2126737, 2126737, 2126737, 2126737, 2126737, 2425745, 2433937, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 3138449, 2126811, 2126811, 2499547, 2126811, 2126811, 2126737, 2724753, 2126737, 2732945, 2773905, 2126737, 2126737, 2126737, 2806673, 2126737, 2831249, 2126737, 2126737, 2864017, 2126737, 2126737, 2126737, 2126737, 2126811, 2126811, 2126811, 2126811, 2126811, 2593755, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 3036123, 2126811, 2126811, 3072987, 2126811, 2126811, 2126811, 3122139, 2126811, 2126737, 2126737, 2921361, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 3117969, 2126737, 0, 2126811, 2126811, 2126811, 2126811, 2126811, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1190, 0, 0, 0, 0, 0, 2126811, 2425819, 2434011, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 3126235, 2126811, 2126811, 2126811, 2126811, 2126811, 2626523, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2700251, 2126811, 2716635, 2126811, 2724827, 2126811, 2733019, 2773979, 2126811, 0, 2502656, 0, 0, 3010560, 0, 0, 0, 0, 0, 0, 0, 0, 2990080, 2179072, 2179072, 3125248, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 2125824, 2592768, 2125824, 2125824, 2125824, 2125824, 2126811, 2126811, 2806747, 2126811, 2831323, 2126811, 2126811, 2864091, 2126811, 2126811, 2126811, 2126811, 2921435, 2126811, 2126811, 2126811, 0, 2179072, 2126811, 2126737, 2457600, 2179072, 2179072, 2179072, 2179072, 2458513, 2126737, 2126737, 2126737, 2126737, 2126737, 2524049, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2601873, 2126737, 2126737, 2458587, 2126811, 2126811, 2126811, 2126811, 2183168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1206, 0, 1208, 0, 0, 0, 0, 2126737, 2126737, 2126737, 2409361, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 0, 0, 2126811, 2126811, 2126811, 2409435, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2839515, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 3118043, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 0, 0, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2462609, 2466705, 2126737, 2126737, 2126737, 2642833, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2720657, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 3040145, 2126737, 3064721, 2126737, 2126737, 2126737, 2126737, 2126737, 3101585, 2769809, 2778001, 2782097, 2798481, 2823057, 2126737, 2126737, 2126737, 2884497, 2126737, 2913169, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2626449, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2700177, 2126737, 2716561, 2126737, 2126737, 3134353, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 3208081, 2126737, 0, 0, 0, 0, 0, 0, 3026, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1352, 541, 541, 541, 541, 541, 0, 0, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2462683, 2466779, 2126811, 2126811, 2126811, 2126811, 2126811, 2929627, 2126811, 2126811, 2126811, 2999259, 2126811, 2126811, 2126811, 2126811, 3060699, 2126811, 2126811, 2126811, 2126811, 2454491, 2126811, 2474971, 2483163, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2532315, 2126811, 2126811, 2126811, 2446299, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2552795, 2769883, 2778075, 2782171, 2798555, 2823131, 2126811, 2126811, 2126811, 2884571, 2126811, 2913243, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 3130331, 2126811, 2126811, 3154907, 3167195, 3175387, 2506752, 2507739, 2507665, 2126811, 2126811, 3134427, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 3208155, 2126811, 2179072, 2126811, 2126811, 2126811, 2642907, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2720731, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 3040219, 2126811, 3064795, 2126811, 2126811, 2126811, 2126811, 2126811, 3101659, 0, 0, 0, 2388881, 2126737, 2126737, 2126737, 2421649, 2126737, 2126737, 2126737, 2126737, 2126737, 2454417, 2126737, 2474897, 2483089, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2532241, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2605969, 2126737, 2630545, 2126737, 2126737, 2651025, 2126737, 2126737, 2126737, 2708369, 2126737, 2737041, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2663313, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 0, 0, 988, 2126811, 2126811, 2126811, 2126811, 3036049, 2126737, 2126737, 3072913, 2126737, 2126737, 2126737, 3122065, 2126737, 2126737, 3142545, 2126737, 2126737, 2126737, 3171217, 2126737, 2126737, 2126737, 2888593, 2126737, 2126737, 2925457, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 986, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126737, 3191697, 3195793, 2126737, 0, 0, 0, 0, 0, 0, 2388955, 2126811, 2126811, 2126811, 2421723, 2126811, 2126811, 2449408, 0, 2535424, 3031040, 2859008, 0, 0, 0, 0, 0, 2179072, 2449408, 2179072, 2535424, 2126811, 2737115, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2888667, 2126811, 2126811, 2925531, 2126811, 2126811, 2126811, 2126811, 2126811, 2585563, 2126811, 2126811, 2126811, 2126811, 2126811, 2618331, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2606043, 2126811, 2630619, 2126811, 2126811, 2651099, 2126811, 2126811, 2126811, 2708443, 2126811, 3142619, 2126811, 2126811, 2126811, 3171291, 2126811, 2126811, 3191771, 3195867, 2126811, 2179072, 2126811, 2126737, 2179072, 2179072, 2179072, 2637824, 2179072, 2179072, 2179072, 2179072, 2727936, 2752512, 2179072, 2179072, 2179072, 2842624, 2846720, 2179072, 3112960, 3219456, 2126737, 2126737, 3113873, 3220369, 2126811, 2126811, 3113947, 3220443, 0, 0, 0, 0, 0, 0, 0, 415, 415, 0, 0, 0, 0, 0, 415, 0, 3096576, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 3223552, 0, 0, 2126737, 2126737, 2417553, 2126737, 2126737, 2126737, 2126737, 2929553, 2126737, 2126737, 2126737, 2999185, 2126737, 2126737, 2126737, 2126737, 3060625, 2126737, 2126737, 2126737, 2126737, 2933649, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 3130257, 2126737, 2126737, 2126737, 2519953, 2126737, 2126737, 2126737, 2126737, 2589585, 2126737, 2614161, 2646929, 2126737, 2126737, 2696081, 2757521, 2126737, 2446225, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2552721, 2126737, 2126737, 2126737, 2638737, 2126737, 2126737, 2126737, 2126737, 2728849, 2753425, 2126737, 2126737, 2126737, 2126737, 2843537, 2847633, 2126737, 2896785, 2917265, 2126737, 2126737, 2945937, 2126737, 2126737, 2995089, 2126737, 3003281, 2126737, 2126737, 3023761, 2126737, 3068817, 3085201, 2126737, 3097489, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 3224465, 0, 0, 2126811, 2126811, 2417627, 2843611, 2847707, 2126811, 2896859, 2917339, 2126811, 2126811, 2946011, 2126811, 2126811, 2995163, 2126811, 3003355, 2126811, 2126811, 3023835, 2126811, 3068891, 3085275, 2126811, 3097563, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 3224539, 2179072, 2126811, 2126737, 2126737, 2126737, 3031953, 2126737, 2126811, 2450395, 2126811, 2536411, 2126811, 2610139, 2126811, 2859995, 2126811, 2126811, 2126811, 2126811, 2126811, 2524123, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2601947, 2126811, 2515857, 2126737, 2126737, 2126737, 2544529, 2548625, 2126737, 2126737, 2597777, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2585489, 2126737, 2126737, 2126737, 2126737, 2126737, 2618257, 2126811, 2515931, 2126811, 2126811, 2126811, 2544603, 2548699, 2126811, 2126811, 2597851, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2655195, 2679771, 2761691, 2765787, 2786267, 2855899, 2970587, 2126811, 3007451, 3154833, 3167121, 3175313, 2397147, 2401243, 2126811, 2126811, 2442203, 2126811, 2470875, 2126811, 2126811, 2126811, 2520027, 2126811, 2126811, 2126811, 2126811, 2126811, 2638811, 2126811, 2126811, 2126811, 2126811, 2728923, 2753499, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 3179483, 2179072, 2126811, 2126737, 2179072, 2179072, 2126737, 2126737, 2126811, 2126811, 0, 0, 0, 0, 0, 0, 2510848, 2514944, 0, 0, 2678784, 2760704, 2764800, 2854912, 2969600, 2179072, 3006464, 2179072, 3018752, 2179072, 2179072, 2179072, 3149824, 2126737, 2429841, 2438033, 2126737, 2487185, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2655121, 2679697, 2761617, 2765713, 2786193, 2855825, 2970513, 2126737, 3007377, 2126737, 3019665, 2126737, 2126737, 2126737, 2126737, 3150737, 2126811, 2429915, 2438107, 2126811, 2487259, 2126811, 2126811, 2589659, 2126811, 2614235, 2647003, 2126811, 2126811, 2696155, 2757595, 2126811, 2126811, 2126811, 2126811, 2933723, 2126811, 2126811, 2663387, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2802651, 2814939, 2126811, 3019739, 2126811, 2126811, 2126811, 2126811, 3150811, 2179072, 3051520, 2126737, 3052433, 2126811, 3052507, 0, 2490368, 2498560, 2126811, 2556891, 2565083, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 3138523, 2940928, 2941841, 2941915, 0, 0, 0, 0, 0, 2748416, 2879488, 0, 3180, 0, 0, 0, 0, 0, 0, 0, 647, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2467, 0, 0, 2470, 0, 0, 0, 2179072, 2502656, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 3010560, 2179072, 2179072, 2126737, 2126737, 2126811, 2126811, 0, 2486272, 0, 0, 0, 0, 0, 2678784, 2854912, 3006464, 2503569, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 3011473, 2126737, 2126737, 2126737, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2179072, 2126811, 2126737, 2179072, 2179072, 2179072, 2179072, 2126737, 2126737, 2126737, 2126737, 2126811, 2126811, 2126811, 2126811, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2112, 0, 0, 0, 0, 2503643, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 2126811, 3011547, 2126811, 2126811, 2126811, 0, 0, 0, 2179072, 2126811, 2126737, 2179072, 2179072, 2179072, 2179072, 2179072, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2179072, 2609152, 2179072, 2859008, 2179072, 2179072, 2179072, 3031040, 2126737, 2450321, 2126737, 2536337, 2126737, 2610065, 2126737, 2859921, 3032027, 2126811, 2527232, 0, 0, 0, 0, 0, 2179072, 2527232, 2179072, 2179072, 2179072, 2179072, 2179072, 2126737, 2126737, 2802577, 2814865, 2126737, 2839441, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 2126737, 3126161, 2126737, 2528145, 2126737, 2126737, 2126737, 2126737, 2126737, 3093393, 2126811, 2528219, 2126811, 2126811, 2126811, 2126811, 2126811, 3093467, 0, 0, 0, 0, 0, 782, 0, 0, 0, 0, 0, 0, 541, 843, 541, 541, 541, 541, 541, 1796, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2822, 541, 541, 541, 541, 3026944, 0, 0, 0, 2404352, 2179072, 2179072, 2179072, 2179072, 3026944, 2405265, 2126737, 2126737, 2126737, 2126737, 3027857, 2405339, 2126811, 2126811, 2126811, 2126811, 3027931, 0, 2539520, 0, 2949120, 2179072, 2658304, 2973696, 2179072, 2126737, 2659217, 2974609, 2126737, 2126811, 2659291, 2974683, 2126811, 0, 2711552, 2560000, 2179072, 2560913, 2126737, 2560987, 2126811, 0, 2179072, 2179072, 3133440, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 3207168, 2179072, 0, 0, 0, 0, 0, 0, 2464, 0, 0, 0, 0, 0, 0, 0, 0, 0, 324, 398, 0, 0, 0, 324, 0, 2126737, 2126811, 0, 2179072, 2126737, 2126811, 0, 2179072, 2126737, 2126811, 2985984, 2985984, 2986897, 2986971, 0, 0, 0, 0, 0, 0, 3164, 0, 0, 3167, 0, 0, 0, 0, 0, 0, 0, 1135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 824, 0, 0, 0, 0, 0, 0, 0, 221184, 221184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221184, 221184, 0, 0, 221184, 221184, 221184, 0, 0, 0, 0, 0, 0, 0, 221184, 0, 0, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221184, 0, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 221184, 1, 12290, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139264, 300, 0, 303, 0, 0, 0, 303, 0, 304, 0, 0, 0, 304, 0, 0, 0, 304, 69632, 139682, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 98304, 0, 0, 0, 53248, 0, 0, 0, 0, 0, 2662400, 0, 2813952, 0, 0, 3133440, 0, 98304, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111051, 0, 0, 0, 0, 303, 0, 304, 0, 0, 0, 2473984, 2478080, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 159744, 163840, 3121152, 2179072, 2179072, 3141632, 2179072, 2179072, 2179072, 3170304, 2179072, 2179072, 3190784, 3194880, 2179072, 914, 0, 0, 0, 0, 0, 0, 3172, 3173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 665, 0, 0, 668, 0, 0, 0, 0, 914, 0, 2387968, 2125824, 2125824, 2125824, 2420736, 2125824, 2125824, 2125824, 2125824, 2125824, 2453504, 2125824, 2473984, 2482176, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2531328, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2605056, 2125824, 3190784, 3194880, 2125824, 988, 0, 0, 0, 988, 0, 2387968, 2125824, 2125824, 2125824, 2420736, 2125824, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 299, 0, 0, 0, 303, 0, 0, 0, 303, 119198, 73728, 0, 0, 0, 0, 0, 65536, 0, 3096576, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 2179072, 3223552, 914, 0, 2125824, 2125824, 2416640, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2625536, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2699264, 2125824, 2715648, 2125824, 2723840, 2125824, 2732032, 2772992, 2125824, 3084288, 2125824, 3096576, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 3223552, 988, 0, 2125824, 2125824, 2416640, 225890, 225890, 225890, 225890, 225890, 225890, 225890, 225741, 225741, 225741, 225741, 225741, 225906, 225741, 225906, 1, 12290, 3, 0, 0, 0, 0, 0, 0, 0, 90409, 90409, 90409, 90409, 0, 94506, 94506, 90409, 90409, 94506, 94506, 94506, 94506, 94506, 94506, 94506, 94506, 94506, 94506, 94506, 94506, 94506, 94506, 94506, 94506, 1, 2125824, 237568, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1222, 0, 0, 0, 0, 0, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 249856, 0, 0, 0, 0, 0, 0, 0, 0, 0, 217088, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 304, 0, 0, 2125824, 241664, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1236, 0, 0, 0, 0, 0, 254414, 254414, 254414, 254414, 254414, 254414, 254414, 254414, 254414, 254414, 254414, 254414, 254414, 254414, 254414, 254414, 0, 0, 0, 0, 0, 0, 0, 12290, 0, 0, 0, 2183168, 0, 0, 270336, 0, 0, 299, 300, 0, 2134016, 303, 304, 200704, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 687, 2125824, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 180224, 0, 0, 0, 0, 0, 0, 0, 663, 0, 0, 666, 667, 0, 0, 0, 0, 2940928, 0, 0, 0, 0, 0, 2748416, 2879488, 0, 20480, 0, 0, 0, 0, 0, 0, 0, 679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1129, 0, 0, 0, 0, 0, 0, 1, 12290, 2113826, 0, 0, 0, 0, 0, 0, 296, 0, 0, 0, 296, 0, 0, 0, 0, 0, 0, 3182, 0, 0, 0, 0, 3187, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 266240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 266240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 266240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2662400, 0, 2813952, 12290, 2113826, 0, 0, 2183168, 0, 0, 0, 0, 0, 299, 300, 0, 2134016, 303, 304, 2125824, 245760, 0, 0, 2179072, 2125824, 2125824, 2179072, 2179072, 2179072, 2179072, 2179072, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2584576, 2125824, 2125824, 2125824, 2125824, 2125824, 2617344, 2125824, 2125824, 2125824, 2125824, 2125824, 245760, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1245, 0, 0, 0, 0, 0, 274432, 274432, 274432, 274432, 274432, 274432, 274432, 0, 0, 0, 0, 0, 274432, 0, 274432, 1, 12290, 3, 0, 0, 0, 0, 0, 253952, 0, 0, 0, 253952, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1155072, 0, 0, 0, 0, 0, 0, 12290, 3, 78115, 78115, 293, 0, 0, 0, 0, 0, 299, 300, 0, 0, 303, 304, 563, 563, 587, 587, 587, 587, 0, 2030, 0, 0, 0, 0, 0, 2032, 0, 0, 0, 0, 0, 0, 3196, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3186, 0, 0, 0, 3189, 0, 0, 0, 0, 2034, 0, 0, 0, 0, 0, 2036, 0, 0, 0, 0, 0, 0, 0, 695, 0, 0, 0, 0, 365, 365, 365, 0, 0, 2485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 266240, 0, 0, 0, 1678, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 338, 0, 0, 0, 0, 0, 0, 0, 1669, 0, 0, 0, 0, 0, 0, 0, 0, 2114, 0, 0, 0, 0, 0, 0, 3395, 541, 541, 541, 541, 3399, 541, 541, 541, 541, 541, 541, 1346, 541, 541, 541, 541, 541, 541, 1356, 541, 541, 12290, 3, 78115, 78456, 293, 0, 0, 0, 0, 0, 299, 300, 0, 0, 303, 304, 541, 588, 564, 564, 564, 564, 564, 564, 564, 588, 588, 588, 541, 588, 588, 588, 588, 588, 588, 588, 588, 564, 564, 541, 564, 588, 564, 588, 1, 0, 0, 0, 0, 2775, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 163840, 0, 0, 0, 1, 12290, 3, 78116, 293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167936, 0, 0, 0, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 1, 0, 0, 0, 0, 0, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 0, 0, 282624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1600, 1601, 0, 0, 0, 0, 282624, 282624, 282624, 0, 282624, 282624, 282624, 282624, 282624, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254414, 254414, 254414, 254414, 254414, 254414, 254414, 254414, 1, 2981888, 2396160, 0, 3153920, 3180, 0, 0, 0, 0, 0, 0, 0, 2740224, 0, 0, 0, 0, 0, 0, 679, 751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1144, 0, 365, 365, 0, 1147, 0, 0, 0, 0, 0, 286720, 286720, 0, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 0, 0, 0, 0, 0, 0, 0, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 286720, 0, 3108864, 3198976, 0, 0, 3043328, 0, 3149824, 2936832, 0, 2760704, 3305, 2437120, 0, 0, 0, 0, 0, 0, 680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2875392, 0, 0, 0, 3386, 0, 0, 0, 0, 0, 0, 2834432, 2940928, 0, 0, 0, 0, 0, 2748416, 2879488, 0, 3386, 0, 0, 0, 0, 0, 0, 0, 709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2048, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 0, 0, 0, 0, 0, 308, 0, 308, 309, 0, 308, 308, 0, 0, 0, 308, 308, 309, 309, 0, 0, 0, 0, 0, 0, 308, 408, 309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 781, 0, 0, 0, 309, 413, 0, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 0, 783, 0, 802, 0, 0, 0, 0, 541, 847, 541, 541, 541, 541, 541, 2830, 2831, 541, 541, 541, 541, 2834, 541, 541, 541, 541, 541, 541, 541, 3521, 541, 3523, 541, 541, 3525, 541, 563, 563, 0, 0, 432, 0, 0, 0, 0, 308, 449, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, 489, 489, 463, 489, 489, 489, 489, 489, 489, 489, 514, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 534, 489, 489, 489, 489, 489, 542, 565, 542, 565, 542, 542, 565, 542, 589, 565, 565, 565, 565, 565, 565, 565, 589, 589, 589, 542, 589, 589, 589, 589, 589, 589, 589, 589, 565, 565, 542, 565, 589, 565, 589, 1, 0, 0, 674, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 323, 324, 0, 0, 704, 0, 0, 0, 0, 0, 0, 0, 711, 0, 0, 0, 0, 0, 0, 0, 742, 0, 0, 0, 0, 742, 0, 748, 0, 0, 0, 736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 747, 0, 0, 0, 0, 0, 792, 663, 841, 0, 0, 0, 0, 541, 845, 541, 541, 541, 541, 541, 2217, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1802, 541, 541, 541, 541, 0, 0, 0, 0, 645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172032, 0, 0, 0, 0, 0, 0, 0, 0, 765, 0, 0, 768, 0, 0, 0, 0, 774, 0, 0, 778, 0, 0, 0, 0, 0, 0, 3562, 0, 3564, 541, 541, 541, 541, 541, 541, 541, 541, 541, 3219, 541, 541, 541, 541, 541, 3224, 0, 0, 785, 0, 0, 0, 0, 789, 0, 0, 0, 0, 0, 0, 0, 793, 0, 0, 736, 0, 793, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 807, 808, 0, 0, 0, 0, 808, 0, 0, 807, 0, 0, 0, 0, 0, 755, 0, 0, 816, 817, 0, 0, 0, 793, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221184, 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 834, 789, 0, 0, 0, 0, 0, 0, 0, 2139, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1712, 0, 0, 0, 0, 0, 0, 838, 839, 789, 789, 0, 0, 0, 0, 789, 736, 789, 0, 541, 541, 849, 853, 563, 964, 563, 967, 563, 563, 981, 563, 563, 0, 587, 587, 587, 996, 1000, 587, 0, 0, 0, 0, 0, 0, 0, 0, 3180, 3448, 0, 0, 0, 0, 0, 0, 0, 2465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2152, 0, 0, 0, 0, 0, 0, 1093, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1135, 0, 0, 0, 0, 1152, 0, 0, 0, 0, 1157, 0, 0, 0, 0, 0, 0, 0, 822, 0, 816, 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, 1201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221184, 0, 221184, 0, 0, 0, 1253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 339, 340, 341, 541, 541, 1342, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2239, 0, 0, 0, 0, 0, 1596, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 233472, 0, 0, 0, 0, 0, 0, 1640, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 354, 355, 356, 357, 1653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1163, 0, 0, 0, 0, 1669, 0, 0, 0, 0, 0, 0, 1673, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 0, 0, 346, 345, 65536, 344, 0, 1729, 0, 0, 0, 0, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 3327, 541, 541, 1742, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1755, 541, 541, 541, 541, 541, 541, 541, 2193, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2557, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1794, 541, 541, 1797, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1314, 541, 541, 541, 1318, 541, 541, 1809, 541, 541, 541, 541, 541, 1814, 541, 541, 541, 541, 541, 541, 541, 1360, 914, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 0, 2328, 1824, 563, 563, 563, 563, 563, 1831, 563, 563, 563, 563, 563, 1837, 563, 563, 563, 563, 563, 3093, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3102, 563, 563, 1892, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1905, 563, 563, 563, 563, 978, 563, 563, 563, 563, 0, 587, 587, 587, 587, 587, 587, 1997, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1531, 587, 587, 587, 587, 587, 587, 563, 563, 563, 1910, 563, 563, 563, 563, 563, 563, 563, 26028, 1920, 587, 587, 587, 0, 1285, 1469, 1377, 541, 541, 1339, 541, 541, 563, 563, 1431, 563, 587, 587, 1927, 587, 587, 587, 587, 587, 1933, 587, 587, 587, 587, 587, 587, 587, 1529, 587, 587, 587, 587, 587, 587, 587, 587, 1932, 587, 587, 587, 587, 587, 587, 587, 587, 1494, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1946, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1513, 587, 587, 563, 563, 2026, 587, 587, 587, 0, 2030, 0, 0, 0, 0, 0, 2032, 0, 0, 0, 0, 0, 0, 131072, 0, 131072, 131072, 131072, 131072, 0, 131072, 131072, 131072, 131072, 131072, 131072, 131072, 0, 0, 0, 0, 0, 131072, 0, 131072, 1, 0, 0, 0, 2042, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 365, 365, 0, 0, 2141, 0, 0, 2148, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237568, 0, 0, 0, 0, 0, 0, 2140, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2170, 541, 541, 2173, 541, 541, 541, 541, 541, 541, 2181, 541, 541, 541, 541, 541, 541, 541, 541, 2841, 541, 541, 541, 541, 541, 541, 541, 541, 1294, 541, 541, 541, 541, 541, 541, 541, 541, 1327, 541, 541, 541, 1334, 1336, 541, 541, 541, 541, 2214, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2535, 541, 563, 2258, 563, 563, 563, 563, 563, 563, 2266, 563, 563, 563, 563, 563, 563, 563, 983, 563, 0, 587, 587, 587, 587, 1001, 587, 563, 2300, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 587, 587, 587, 2345, 587, 587, 587, 587, 587, 587, 2353, 587, 587, 587, 587, 587, 587, 587, 1950, 587, 587, 587, 587, 587, 587, 587, 587, 1468, 587, 587, 587, 587, 587, 587, 587, 587, 2387, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 541, 587, 563, 2414, 541, 541, 541, 541, 563, 563, 563, 563, 587, 587, 587, 587, 2030, 0, 2032, 0, 2034, 0, 2036, 0, 0, 2428, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1713, 0, 0, 0, 0, 0, 2436, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1179, 2449, 0, 0, 0, 0, 0, 2453, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1726, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245760, 0, 0, 0, 0, 0, 2501, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 386, 338, 0, 541, 541, 541, 2539, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2198, 541, 541, 0, 0, 0, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2595, 563, 563, 563, 563, 563, 3238, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2880, 563, 563, 563, 563, 563, 587, 587, 587, 2661, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2669, 587, 587, 587, 587, 2714, 587, 587, 587, 587, 587, 587, 541, 587, 563, 541, 541, 2417, 2418, 563, 563, 2421, 2422, 587, 587, 2425, 2426, 0, 1563, 0, 0, 0, 2735, 0, 0, 0, 0, 0, 0, 2740, 0, 0, 0, 0, 0, 0, 0, 1102, 1101, 0, 0, 0, 0, 0, 0, 0, 0, 1724, 0, 0, 0, 0, 0, 0, 0, 0, 1172, 0, 0, 0, 0, 0, 0, 0, 0, 1187, 0, 0, 0, 0, 0, 0, 1104, 0, 0, 0, 0, 0, 2763, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2431, 2432, 0, 0, 0, 0, 0, 0, 0, 0, 2792, 2793, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2049, 0, 0, 0, 0, 0, 541, 541, 541, 541, 2829, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2836, 563, 563, 563, 563, 2876, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 0, 2329, 587, 587, 587, 2884, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1874, 587, 587, 2933, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1536, 587, 587, 2955, 541, 2957, 563, 2959, 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 541, 541, 541, 541, 541, 541, 587, 3442, 0, 3444, 0, 0, 0, 0, 0, 3180, 0, 0, 0, 0, 3452, 0, 0, 0, 0, 0, 796, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 796, 0, 0, 0, 0, 3454, 0, 541, 3457, 541, 3459, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2585, 0, 0, 0, 563, 587, 3488, 587, 3490, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1047, 587, 587, 587, 587, 587, 0, 0, 0, 3505, 0, 0, 0, 0, 0, 0, 0, 3512, 0, 0, 541, 541, 541, 541, 541, 541, 3462, 541, 541, 541, 541, 541, 541, 541, 541, 541, 3334, 541, 541, 541, 563, 563, 563, 541, 541, 541, 3517, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3530, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 587, 587, 587, 587, 587, 587, 587, 587, 3544, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 0, 0, 0, 0, 541, 541, 541, 541, 563, 563, 310, 311, 312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 669, 0, 0, 0, 0, 0, 421, 0, 0, 0, 0, 450, 0, 0, 0, 0, 0, 0, 0, 0, 304, 304, 304, 304, 0, 304, 304, 304, 0, 0, 0, 0, 450, 450, 421, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 450, 533, 450, 533, 533, 533, 450, 533, 533, 533, 533, 450, 543, 566, 543, 566, 543, 543, 566, 543, 590, 566, 566, 566, 566, 566, 566, 566, 590, 590, 590, 543, 590, 590, 590, 590, 590, 590, 590, 590, 566, 566, 616, 621, 590, 621, 627, 1, 960, 563, 563, 563, 563, 563, 563, 563, 563, 0, 587, 587, 587, 587, 587, 587, 587, 3136, 587, 587, 3138, 587, 587, 587, 587, 587, 0, 0, 0, 0, 1657, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254414, 0, 0, 0, 1676, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1211, 541, 541, 541, 1810, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1360, 914, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1378, 0, 0, 2486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 694, 0, 0, 541, 541, 541, 541, 2528, 541, 541, 541, 541, 2532, 541, 541, 541, 541, 541, 541, 541, 541, 3218, 541, 541, 541, 541, 541, 541, 541, 541, 2583, 541, 541, 541, 541, 0, 2586, 0, 0, 0, 0, 563, 563, 563, 563, 563, 563, 2592, 563, 563, 563, 563, 2596, 563, 0, 587, 587, 587, 587, 587, 78115, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225741, 225741, 225741, 225741, 225741, 225741, 225741, 225741, 225741, 225741, 225741, 225741, 225741, 225741, 225741, 225741, 0, 0, 0, 0, 0, 0, 0, 2658, 587, 587, 587, 587, 2662, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2665, 587, 587, 587, 587, 587, 0, 0, 0, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 0, 0, 0, 0, 0, 0, 694, 0, 0, 0, 0, 0, 365, 365, 365, 0, 0, 313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2142208, 0, 0, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 730, 0, 0, 0, 423, 431, 433, 422, 431, 0, 313, 431, 451, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 464, 485, 490, 490, 501, 490, 490, 490, 490, 490, 490, 490, 490, 516, 516, 529, 529, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 516, 530, 530, 530, 530, 530, 544, 567, 544, 567, 544, 544, 567, 544, 591, 567, 567, 567, 567, 567, 567, 567, 591, 591, 591, 613, 591, 591, 591, 591, 591, 591, 591, 614, 615, 615, 613, 615, 614, 615, 614, 1, 734, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1238, 0, 0, 0, 0, 767, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 266240, 0, 0, 0, 0, 0, 702, 0, 0, 0, 0, 0, 702, 0, 0, 0, 541, 541, 541, 541, 541, 541, 3322, 541, 541, 541, 541, 541, 541, 541, 541, 1816, 541, 541, 541, 541, 541, 541, 1360, 563, 563, 563, 968, 563, 563, 563, 563, 563, 0, 587, 587, 587, 587, 587, 587, 587, 3150, 3151, 3152, 541, 541, 563, 563, 587, 587, 0, 0, 2963, 0, 0, 0, 0, 0, 0, 0, 0, 3180, 0, 0, 3389, 0, 0, 0, 0, 0, 1108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 308, 309, 0, 1150, 1108, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1119, 0, 0, 1212, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1225, 0, 0, 0, 0, 0, 797, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 797, 0, 1360, 914, 563, 563, 1364, 563, 563, 1368, 563, 563, 563, 563, 563, 563, 563, 563, 985, 0, 587, 587, 587, 587, 587, 587, 1382, 563, 1387, 563, 563, 1391, 563, 563, 1394, 563, 563, 563, 563, 563, 563, 563, 984, 563, 0, 587, 587, 587, 587, 587, 1004, 587, 1460, 587, 587, 587, 587, 587, 587, 587, 587, 1474, 587, 1479, 587, 587, 1483, 587, 587, 1486, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1939, 587, 587, 0, 1692, 0, 1694, 0, 0, 0, 0, 0, 0, 1701, 0, 0, 0, 0, 0, 0, 0, 2442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1173, 0, 0, 0, 0, 0, 0, 541, 541, 1745, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1757, 541, 541, 541, 541, 541, 541, 2192, 541, 541, 2195, 541, 541, 541, 541, 541, 541, 541, 1798, 541, 541, 541, 541, 541, 541, 1806, 541, 541, 1792, 1793, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2824, 541, 0, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1840, 563, 0, 587, 587, 587, 587, 587, 78115, 1079, 0, 0, 1083, 1087, 0, 0, 1091, 587, 587, 587, 587, 1948, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1478, 587, 587, 587, 587, 587, 587, 587, 587, 1961, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1533, 587, 587, 587, 587, 0, 2034, 0, 2036, 0, 0, 0, 0, 0, 0, 2430, 0, 0, 0, 0, 0, 0, 0, 2454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2476, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 365, 365, 702, 0, 0, 0, 2502, 2503, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1147355, 0, 0, 0, 587, 587, 2700, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2004, 587, 587, 0, 0, 2802, 0, 0, 0, 0, 0, 0, 0, 2806, 541, 541, 541, 541, 541, 541, 541, 2204, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2220, 541, 541, 541, 541, 541, 541, 541, 2956, 563, 2958, 587, 2960, 0, 0, 0, 0, 0, 2966, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 0, 0, 350, 348, 65536, 0, 0, 0, 0, 2970, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 365, 208896, 0, 3035, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1807, 541, 541, 3050, 3051, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2223, 2224, 541, 563, 3090, 563, 3092, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1415, 563, 563, 563, 3117, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1484, 587, 587, 3132, 587, 3134, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1937, 1938, 587, 587, 587, 0, 3192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, 308, 541, 541, 541, 541, 3228, 541, 541, 541, 541, 563, 563, 563, 563, 563, 563, 563, 563, 563, 945, 563, 563, 563, 563, 587, 3503, 0, 3504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 541, 541, 541, 2810, 3515, 541, 3516, 541, 541, 541, 3520, 541, 541, 541, 541, 541, 541, 541, 563, 3528, 563, 3529, 563, 563, 563, 3533, 563, 563, 563, 563, 563, 563, 563, 563, 587, 3542, 587, 3543, 587, 587, 587, 3547, 587, 587, 587, 587, 587, 587, 587, 587, 0, 0, 0, 0, 3673, 541, 541, 541, 3675, 563, 563, 3676, 587, 587, 587, 3678, 0, 0, 541, 541, 563, 563, 587, 587, 0, 541, 541, 3204, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2238, 2586, 0, 324, 324, 374, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1133, 0, 0, 0, 0, 434, 374, 0, 439, 445, 0, 452, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 465, 491, 491, 502, 491, 491, 491, 491, 491, 491, 491, 491, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 517, 545, 568, 545, 568, 545, 545, 568, 545, 592, 568, 568, 568, 568, 568, 568, 568, 592, 592, 592, 545, 592, 592, 592, 592, 592, 592, 592, 592, 568, 568, 545, 568, 592, 568, 592, 1, 587, 587, 587, 1019, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1052, 587, 587, 587, 1122, 0, 1124, 1125, 0, 0, 0, 1127, 1128, 0, 0, 0, 0, 0, 0, 0, 0, 334, 0, 0, 0, 0, 0, 334, 0, 0, 0, 1166, 1167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 400, 0, 0, 0, 0, 0, 1228, 0, 0, 0, 0, 1233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1241, 0, 0, 0, 0, 1244, 0, 1194, 0, 1113, 0, 1250, 1127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 541, 1274, 541, 541, 541, 541, 541, 541, 2203, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1329, 541, 541, 541, 541, 541, 541, 541, 1322, 541, 541, 1324, 541, 541, 541, 1328, 541, 541, 541, 541, 541, 541, 541, 541, 3522, 541, 541, 541, 541, 541, 563, 563, 3068, 563, 563, 563, 563, 563, 563, 563, 563, 2603, 563, 563, 563, 563, 563, 563, 563, 1360, 914, 563, 563, 1365, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 587, 3427, 587, 587, 3429, 563, 563, 563, 1405, 563, 563, 563, 563, 563, 563, 563, 1414, 563, 563, 1416, 563, 0, 587, 587, 587, 1051, 587, 78115, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 1134592, 0, 0, 0, 0, 0, 0, 1134592, 0, 0, 0, 0, 563, 563, 1420, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1437, 563, 563, 563, 563, 563, 1444, 563, 563, 563, 563, 563, 26028, 1360, 988, 587, 587, 1457, 587, 0, 0, 0, 0, 0, 0, 0, 3447, 3180, 0, 0, 0, 0, 0, 0, 0, 1237, 0, 0, 541, 541, 1273, 541, 1276, 541, 0, 0, 0, 1656, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 846, 541, 541, 587, 587, 587, 1993, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1496, 587, 587, 587, 563, 2025, 587, 587, 587, 2029, 0, 2030, 0, 0, 0, 0, 0, 2032, 0, 0, 0, 0, 0, 0, 1134592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1134592, 0, 0, 0, 2034, 0, 0, 0, 0, 0, 2036, 0, 0, 0, 0, 0, 2039, 0, 2078, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 2092, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 643, 0, 0, 0, 541, 2172, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 0, 0, 0, 541, 2188, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 0, 2240, 541, 541, 541, 541, 2229, 541, 2231, 541, 541, 541, 541, 541, 541, 541, 0, 0, 0, 0, 0, 0, 1146880, 0, 1146880, 0, 0, 0, 0, 0, 0, 0, 0, 2617344, 0, 0, 0, 0, 0, 2789376, 0, 0, 0, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2253, 563, 563, 563, 563, 0, 0, 0, 0, 0, 0, 587, 2654, 587, 587, 587, 587, 587, 587, 3135, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1530, 587, 587, 587, 587, 587, 587, 2257, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1889, 2273, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2272, 563, 563, 563, 563, 2316, 563, 2318, 563, 563, 563, 563, 563, 563, 563, 0, 0, 0, 0, 0, 0, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 541, 563, 2344, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1516, 2360, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1517, 587, 587, 587, 587, 2403, 587, 2405, 587, 587, 587, 587, 587, 587, 587, 541, 587, 0, 0, 0, 0, 0, 0, 0, 3508, 0, 0, 0, 0, 0, 0, 541, 541, 541, 541, 541, 541, 3400, 541, 541, 541, 2499, 0, 0, 0, 0, 0, 2504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2086, 2087, 0, 0, 0, 0, 541, 541, 2526, 2527, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2237, 0, 0, 541, 541, 2566, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 3046, 541, 0, 0, 0, 563, 563, 563, 2590, 563, 2591, 563, 563, 563, 563, 563, 563, 563, 1411, 563, 563, 563, 563, 563, 563, 563, 563, 1429, 563, 563, 563, 563, 563, 563, 563, 563, 1916, 563, 563, 26028, 1921, 587, 587, 587, 0, 0, 0, 2761, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 674, 0, 0, 0, 541, 541, 2837, 541, 541, 541, 541, 541, 541, 541, 2843, 541, 541, 541, 541, 541, 541, 541, 2232, 541, 541, 2235, 2236, 541, 541, 0, 0, 563, 563, 563, 2885, 563, 563, 563, 563, 563, 563, 563, 2891, 563, 563, 563, 563, 0, 0, 2329, 0, 0, 0, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2341, 587, 587, 587, 2920, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1519, 587, 587, 587, 587, 3373, 587, 587, 541, 541, 563, 563, 587, 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2968, 563, 587, 587, 587, 587, 587, 587, 3493, 587, 587, 587, 587, 587, 587, 587, 587, 1034, 587, 587, 587, 587, 587, 587, 587, 326, 327, 328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1161, 0, 0, 0, 0, 0, 325, 373, 328, 372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2111, 0, 0, 0, 0, 0, 325, 0, 0, 372, 372, 402, 0, 328, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 339, 293, 0, 0, 0, 0, 0, 0, 325, 0, 327, 0, 0, 0, 453, 466, 466, 466, 466, 466, 466, 466, 479, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 466, 492, 492, 466, 492, 492, 507, 509, 492, 492, 507, 492, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 518, 535, 518, 518, 518, 518, 518, 546, 569, 546, 569, 546, 546, 569, 546, 593, 569, 569, 569, 569, 569, 569, 569, 593, 593, 593, 546, 593, 593, 593, 593, 593, 593, 593, 593, 569, 569, 546, 569, 593, 569, 593, 1, 0, 0, 658, 659, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 670, 671, 0, 689, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 365, 365, 0, 0, 0, 0, 0, 800, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 718, 0, 720, 0, 0, 0, 0, 0, 0, 727, 0, 0, 0, 731, 0, 0, 0, 0, 0, 0, 1159168, 417, 417, 0, 0, 0, 0, 0, 417, 0, 0, 784, 0, 786, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 759, 0, 0, 0, 0, 0, 798, 0, 803, 0, 806, 0, 0, 0, 0, 803, 806, 0, 0, 0, 0, 0, 0, 741, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 806, 806, 803, 0, 0, 0, 0, 0, 0, 0, 786, 0, 798, 0, 815, 0, 0, 0, 0, 0, 802, 0, 0, 783, 0, 0, 0, 0, 802, 0, 0, 0, 0, 0, 0, 0, 802, 0, 0, 0, 0, 806, 0, 707, 0, 0, 823, 0, 0, 0, 0, 0, 823, 823, 826, 0, 0, 0, 786, 0, 0, 0, 0, 0, 835, 0, 0, 0, 0, 0, 0, 0, 2480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1100, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 784, 0, 0, 0, 835, 815, 835, 0, 541, 541, 850, 541, 541, 541, 541, 541, 3052, 541, 541, 541, 541, 541, 541, 541, 541, 3060, 541, 541, 541, 541, 541, 3217, 541, 541, 541, 541, 541, 541, 541, 3222, 541, 541, 541, 541, 541, 2529, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 3043, 541, 541, 541, 541, 856, 541, 541, 869, 541, 541, 880, 541, 885, 541, 541, 893, 896, 901, 541, 909, 563, 563, 966, 969, 974, 563, 982, 563, 563, 0, 587, 587, 587, 997, 587, 1003, 587, 587, 1016, 587, 587, 1027, 587, 1032, 587, 587, 1040, 1043, 1048, 587, 1056, 587, 0, 0, 0, 0, 0, 0, 3507, 0, 0, 0, 0, 0, 0, 0, 541, 541, 541, 541, 541, 3031, 541, 541, 541, 541, 0, 0, 0, 1110, 0, 0, 0, 0, 0, 0, 0, 1117, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 0, 0, 421, 0, 65536, 0, 0, 1137, 1138, 0, 0, 0, 0, 1142, 0, 0, 0, 365, 365, 0, 0, 0, 0, 0, 0, 769, 0, 0, 0, 775, 776, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 0, 0, 374, 0, 65536, 0, 0, 1165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 515, 522, 0, 0, 1182, 741, 0, 0, 0, 1134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 367, 0, 0, 0, 0, 0, 0, 541, 541, 541, 1281, 541, 541, 541, 541, 541, 541, 1296, 541, 541, 541, 1301, 541, 541, 541, 541, 541, 3229, 541, 541, 541, 563, 563, 563, 563, 563, 563, 563, 941, 563, 563, 563, 563, 563, 563, 1360, 914, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1373, 563, 563, 563, 563, 563, 3249, 563, 3251, 563, 563, 563, 563, 563, 563, 563, 563, 1852, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1388, 563, 563, 563, 1393, 563, 563, 563, 563, 563, 563, 563, 563, 1451, 26028, 1360, 988, 587, 587, 587, 587, 587, 1485, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1500, 1540, 587, 587, 0, 541, 587, 563, 541, 541, 541, 541, 541, 563, 563, 563, 563, 563, 563, 3477, 563, 563, 563, 563, 563, 563, 563, 563, 1396, 563, 563, 563, 563, 563, 563, 563, 0, 0, 1607, 1608, 1609, 0, 1611, 1612, 0, 0, 0, 0, 1617, 0, 0, 0, 0, 0, 0, 770, 0, 0, 773, 0, 0, 777, 0, 0, 0, 0, 0, 0, 796, 0, 0, 0, 0, 0, 541, 541, 541, 541, 541, 541, 563, 563, 563, 563, 563, 563, 933, 563, 563, 947, 563, 563, 563, 563, 0, 0, 1639, 0, 0, 1642, 0, 1644, 0, 0, 0, 0, 0, 1650, 1651, 0, 0, 0, 0, 0, 805, 0, 0, 692, 0, 0, 672, 0, 692, 0, 810, 0, 1667, 0, 0, 1669, 0, 0, 0, 0, 1671, 1672, 0, 0, 0, 0, 0, 0, 0, 2491, 2492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2686976, 2736128, 0, 0, 2531328, 2707456, 0, 0, 0, 0, 0, 1708, 0, 0, 1711, 0, 0, 0, 0, 0, 1715, 0, 0, 0, 0, 0, 0, 2134016, 0, 0, 0, 0, 0, 0, 0, 0, 1138688, 0, 1719, 1720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1711, 0, 0, 0, 1731, 1585, 1585, 1733, 541, 1735, 541, 1736, 1737, 541, 1739, 541, 541, 541, 541, 541, 1310, 541, 541, 541, 541, 541, 541, 541, 1317, 541, 541, 541, 541, 541, 1748, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1759, 541, 1743, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1756, 541, 541, 541, 541, 541, 541, 541, 3333, 541, 541, 541, 541, 541, 563, 563, 563, 922, 926, 563, 563, 563, 563, 563, 563, 952, 563, 957, 1760, 541, 541, 541, 541, 1764, 541, 1766, 541, 541, 541, 541, 541, 541, 541, 541, 541, 889, 541, 541, 541, 541, 907, 541, 1774, 1775, 1777, 541, 541, 541, 541, 541, 541, 541, 1785, 1786, 1787, 541, 541, 1790, 1791, 541, 541, 541, 541, 541, 541, 541, 1799, 541, 541, 541, 1803, 541, 541, 541, 541, 541, 541, 2530, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1315, 541, 541, 541, 541, 1320, 541, 541, 541, 541, 1811, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1822, 1360, 914, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1379, 0, 1827, 563, 1829, 563, 1830, 563, 1832, 563, 1834, 563, 563, 563, 1838, 563, 563, 563, 563, 1390, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2652, 0, 587, 587, 587, 563, 1859, 563, 1861, 563, 563, 563, 563, 563, 563, 563, 563, 1869, 1870, 1872, 563, 0, 587, 587, 1042, 587, 587, 78115, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 307, 307, 307, 0, 0, 0, 0, 0, 1907, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1918, 26028, 0, 1923, 587, 1925, 587, 1926, 587, 1928, 587, 1930, 587, 587, 587, 1934, 587, 587, 587, 587, 587, 587, 587, 3366, 587, 587, 587, 587, 3367, 3368, 587, 587, 587, 587, 587, 1947, 587, 587, 587, 587, 1951, 587, 587, 587, 587, 1955, 587, 1957, 587, 587, 1976, 1977, 1978, 587, 587, 1981, 1982, 587, 587, 587, 587, 587, 587, 587, 1999, 2000, 587, 587, 587, 587, 587, 587, 587, 2015, 2016, 2017, 541, 2019, 541, 541, 563, 2023, 1990, 587, 587, 587, 1994, 587, 587, 587, 587, 587, 587, 587, 2003, 587, 587, 587, 0, 1288, 1472, 1380, 541, 541, 541, 541, 541, 563, 563, 563, 563, 3475, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2267, 563, 563, 563, 563, 563, 563, 2024, 563, 1982, 587, 2028, 587, 0, 2030, 0, 0, 0, 0, 0, 2032, 0, 0, 0, 0, 0, 0, 2134016, 0, 0, 0, 0, 0, 0, 0, 746, 0, 0, 0, 0, 0, 2043, 0, 0, 2046, 2047, 0, 0, 0, 2051, 0, 0, 0, 0, 0, 0, 800, 0, 0, 0, 0, 0, 0, 0, 800, 0, 0, 0, 0, 541, 541, 541, 541, 2090, 0, 0, 0, 0, 2094, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2456, 0, 0, 0, 0, 0, 0, 0, 0, 1669, 0, 0, 0, 0, 0, 0, 0, 2113, 0, 0, 2116, 0, 0, 2119, 0, 0, 0, 0, 0, 0, 2126, 0, 2128, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 370, 370, 0, 0, 65536, 370, 0, 0, 0, 0, 2137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1159168, 0, 0, 0, 0, 2047, 0, 2147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1103, 1104, 1105, 1106, 0, 2158, 0, 0, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 3329, 541, 541, 541, 2174, 541, 2176, 541, 541, 541, 541, 541, 541, 2184, 541, 2186, 541, 541, 541, 541, 541, 3332, 541, 541, 541, 541, 541, 541, 541, 563, 563, 563, 3069, 563, 563, 563, 563, 563, 563, 563, 2212, 541, 541, 541, 541, 541, 541, 2219, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1312, 541, 541, 541, 541, 541, 541, 563, 563, 2259, 563, 2261, 563, 563, 563, 563, 563, 563, 2269, 563, 2271, 563, 563, 563, 563, 1422, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1438, 587, 587, 2346, 587, 2348, 587, 587, 587, 587, 587, 587, 2356, 587, 2358, 587, 587, 0, 0, 0, 3634, 0, 3636, 541, 541, 541, 541, 541, 541, 541, 563, 563, 921, 563, 563, 563, 563, 940, 944, 950, 563, 955, 563, 563, 2261, 541, 2416, 541, 541, 563, 2420, 563, 563, 587, 2424, 587, 587, 2030, 0, 2032, 0, 0, 0, 2452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1132, 0, 0, 0, 0, 0, 2461, 0, 0, 0, 0, 0, 2466, 0, 2468, 2469, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 420, 420, 0, 0, 65536, 420, 0, 0, 0, 0, 2488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2179072, 2179072, 2179072, 2179072, 0, 0, 0, 0, 2516, 2468, 0, 0, 0, 0, 0, 2521, 0, 0, 0, 541, 541, 541, 541, 541, 3321, 541, 541, 541, 3325, 541, 541, 541, 541, 541, 541, 1749, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2558, 541, 541, 541, 541, 541, 2563, 541, 541, 541, 2568, 541, 541, 541, 541, 541, 541, 541, 2575, 541, 541, 541, 541, 541, 541, 2542, 541, 2544, 541, 541, 541, 541, 541, 541, 541, 541, 563, 3411, 563, 563, 3413, 563, 563, 563, 541, 541, 541, 541, 2580, 541, 541, 541, 541, 541, 541, 541, 541, 0, 2586, 0, 0, 0, 0, 0, 812, 0, 809, 792, 0, 0, 814, 0, 667, 0, 788, 0, 0, 0, 563, 563, 563, 563, 563, 563, 563, 563, 2594, 563, 563, 563, 563, 0, 2652, 0, 0, 0, 0, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2342, 587, 563, 2624, 563, 563, 563, 563, 2628, 563, 563, 563, 2633, 563, 563, 563, 563, 563, 563, 2629, 563, 563, 563, 563, 563, 563, 2636, 563, 563, 563, 563, 2640, 563, 563, 563, 563, 563, 563, 563, 563, 2646, 563, 563, 563, 563, 0, 2652, 0, 0, 0, 0, 587, 587, 587, 2656, 587, 2657, 587, 587, 2660, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2383, 587, 587, 587, 587, 2672, 587, 2674, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1970, 587, 587, 587, 587, 587, 2699, 587, 587, 587, 587, 587, 587, 587, 2706, 587, 587, 587, 587, 587, 587, 587, 3375, 541, 3376, 563, 3377, 587, 0, 0, 0, 587, 587, 2712, 587, 587, 587, 587, 587, 587, 587, 587, 541, 587, 563, 541, 541, 541, 541, 563, 563, 2800, 2801, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 541, 541, 541, 541, 541, 541, 541, 541, 3402, 2992, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2992, 0, 0, 0, 0, 0, 0, 840, 0, 0, 0, 0, 0, 541, 541, 541, 541, 541, 541, 2166, 541, 541, 541, 541, 541, 0, 3022, 0, 0, 0, 3025, 541, 541, 541, 541, 541, 541, 3032, 541, 541, 541, 541, 541, 541, 2570, 541, 541, 541, 541, 2574, 541, 541, 541, 541, 541, 541, 1286, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1818, 541, 541, 541, 541, 1360, 541, 541, 3036, 541, 541, 541, 541, 541, 541, 541, 3042, 541, 541, 541, 541, 541, 541, 541, 2531, 541, 541, 541, 541, 541, 541, 541, 541, 541, 563, 3230, 563, 563, 563, 3233, 563, 3048, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 3057, 3059, 541, 541, 541, 541, 541, 541, 2582, 541, 541, 541, 541, 541, 541, 0, 2586, 0, 3062, 541, 3064, 3065, 541, 563, 563, 563, 563, 563, 563, 3072, 563, 563, 563, 563, 563, 1425, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2889, 563, 563, 563, 563, 563, 563, 563, 3076, 563, 563, 563, 563, 563, 563, 563, 3082, 563, 563, 563, 563, 563, 3088, 563, 563, 3091, 563, 563, 563, 563, 563, 563, 563, 563, 3098, 3100, 563, 563, 563, 563, 563, 3342, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2645, 563, 563, 563, 563, 563, 563, 563, 3104, 563, 3106, 3107, 563, 587, 587, 587, 587, 587, 587, 3114, 587, 587, 587, 0, 1544, 1545, 1546, 541, 541, 1548, 541, 541, 563, 563, 1552, 563, 587, 587, 3118, 587, 587, 587, 587, 587, 587, 587, 3124, 587, 587, 587, 587, 587, 587, 1998, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3551, 587, 587, 3553, 587, 0, 0, 3130, 587, 587, 3133, 587, 587, 587, 587, 587, 587, 587, 587, 3140, 3142, 587, 587, 0, 0, 3633, 0, 0, 0, 541, 541, 3638, 541, 541, 541, 3642, 563, 587, 587, 3146, 587, 3148, 3149, 587, 541, 587, 563, 541, 3154, 563, 3156, 587, 3158, 0, 0, 0, 0, 0, 3181, 0, 3183, 0, 0, 0, 0, 0, 0, 0, 3190, 0, 0, 0, 3193, 3194, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2200252, 2200252, 2200252, 0, 563, 563, 563, 563, 3237, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1400, 563, 563, 563, 563, 563, 563, 563, 3248, 563, 563, 563, 563, 563, 563, 563, 563, 3256, 563, 563, 563, 563, 563, 3352, 563, 563, 563, 563, 587, 587, 587, 587, 587, 3358, 563, 563, 563, 587, 587, 587, 3261, 587, 587, 587, 587, 587, 587, 587, 3266, 587, 0, 0, 0, 0, 0, 3506, 0, 0, 3509, 0, 0, 0, 0, 0, 541, 541, 541, 541, 3662, 541, 563, 563, 563, 563, 3666, 563, 0, 3310, 0, 0, 3313, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2200253, 151552, 2200253, 0, 587, 587, 587, 3372, 587, 587, 587, 541, 541, 563, 563, 587, 587, 0, 0, 0, 0, 0, 0, 0, 0, 2967, 0, 0, 0, 0, 0, 0, 3383, 3384, 0, 3180, 0, 0, 0, 0, 0, 3392, 0, 0, 0, 0, 0, 1097, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 331, 382, 384, 0, 0, 0, 563, 3417, 563, 563, 563, 563, 563, 563, 563, 563, 563, 587, 587, 587, 587, 587, 587, 587, 3115, 587, 587, 587, 587, 587, 587, 3433, 587, 587, 587, 587, 587, 587, 587, 587, 587, 541, 563, 3472, 563, 3474, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3243, 563, 563, 563, 3470, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3485, 563, 563, 563, 563, 3532, 563, 563, 563, 563, 563, 563, 563, 563, 563, 587, 587, 3110, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3546, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3555, 3556, 0, 0, 0, 3559, 0, 0, 0, 0, 0, 3565, 3566, 3567, 541, 541, 541, 3570, 541, 3572, 541, 541, 541, 541, 3577, 3578, 3579, 563, 563, 563, 3582, 563, 3584, 563, 0, 587, 587, 1044, 587, 587, 291, 1079, 0, 0, 1082, 1086, 0, 0, 1090, 563, 563, 563, 3589, 3590, 3591, 3592, 587, 587, 587, 3595, 587, 3597, 587, 587, 587, 587, 587, 1464, 587, 587, 587, 1473, 587, 587, 587, 587, 587, 587, 1949, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2949, 587, 587, 587, 541, 587, 563, 587, 3602, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 541, 541, 541, 541, 541, 1738, 541, 541, 541, 563, 3644, 563, 563, 563, 3648, 563, 587, 587, 3650, 587, 587, 587, 3654, 587, 0, 0, 0, 0, 0, 0, 0, 0, 3180, 0, 3449, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 266240, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 329, 330, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 0, 0, 0, 0, 0, 369, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 686, 0, 0, 0, 0, 369, 0, 0, 0, 377, 379, 0, 0, 0, 0, 0, 0, 0, 0, 1099, 0, 0, 0, 0, 0, 0, 0, 0, 1115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3185, 0, 0, 0, 0, 0, 0, 0, 0, 412, 0, 0, 0, 412, 69632, 73728, 0, 369, 369, 0, 424, 65536, 369, 0, 0, 0, 369, 424, 499, 503, 499, 499, 508, 499, 499, 499, 508, 499, 424, 424, 0, 330, 424, 0, 0, 424, 424, 0, 0, 0, 0, 0, 0, 0, 0, 1156, 0, 0, 0, 0, 0, 0, 0, 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, 680, 681, 0, 0, 0, 0, 0, 0, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 424, 547, 570, 547, 570, 547, 547, 570, 547, 594, 570, 570, 570, 570, 570, 570, 570, 594, 594, 594, 547, 594, 594, 594, 594, 594, 594, 594, 594, 570, 570, 547, 570, 594, 570, 594, 1, 587, 587, 587, 1020, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1954, 587, 587, 587, 0, 0, 1109, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1215, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1226, 541, 1279, 541, 541, 541, 541, 541, 1291, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1351, 541, 541, 541, 541, 541, 541, 1360, 914, 563, 563, 563, 563, 563, 563, 563, 563, 1371, 563, 563, 563, 563, 563, 563, 2643, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1866, 563, 563, 563, 563, 563, 563, 1383, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2286, 587, 587, 1992, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2411, 541, 587, 563, 563, 3677, 587, 587, 587, 0, 0, 541, 541, 563, 563, 587, 587, 0, 541, 3203, 541, 541, 541, 3206, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1313, 541, 541, 541, 541, 541, 425, 425, 0, 0, 425, 440, 0, 425, 425, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 493, 493, 467, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 493, 548, 571, 548, 571, 548, 548, 571, 548, 595, 571, 571, 571, 571, 571, 571, 571, 595, 595, 595, 548, 595, 595, 595, 595, 595, 595, 595, 595, 571, 571, 548, 571, 595, 571, 595, 1, 0, 1213, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 732, 0, 0, 0, 0, 0, 1695, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, 2093, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 365, 0, 0, 0, 2157, 0, 0, 0, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 3328, 541, 2201, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2200, 563, 2415, 541, 541, 541, 2419, 563, 563, 563, 2423, 587, 587, 587, 0, 0, 0, 0, 0, 0, 541, 541, 541, 541, 541, 541, 541, 563, 3067, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3253, 563, 563, 563, 563, 563, 563, 0, 2460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 748, 0, 0, 0, 0, 0, 2791, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 365, 1146, 0, 0, 2943, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 541, 587, 563, 541, 541, 0, 0, 0, 0, 2971, 0, 0, 0, 2975, 0, 0, 0, 0, 0, 2981, 0, 0, 0, 0, 0, 1128, 0, 0, 0, 0, 0, 1233, 0, 0, 0, 1265, 0, 0, 0, 2994, 0, 2996, 0, 0, 0, 0, 0, 0, 0, 0, 3004, 0, 0, 0, 0, 0, 1169, 0, 1171, 0, 0, 0, 0, 1176, 0, 0, 0, 0, 0, 0, 1643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2520, 0, 0, 0, 0, 541, 0, 0, 0, 0, 3009, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 383, 0, 0, 0, 387, 541, 3063, 541, 541, 541, 3066, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3083, 563, 563, 563, 563, 563, 563, 563, 3105, 563, 563, 563, 3108, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1509, 587, 587, 587, 587, 587, 587, 3144, 587, 587, 3147, 587, 587, 587, 541, 587, 563, 541, 541, 563, 563, 587, 587, 0, 0, 3295, 0, 0, 0, 0, 0, 0, 0, 0, 2766, 0, 0, 0, 0, 0, 0, 0, 0, 2151, 0, 0, 0, 0, 0, 0, 0, 0, 2506, 0, 0, 0, 0, 0, 2512, 0, 0, 0, 0, 0, 0, 3195, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2782, 0, 0, 0, 0, 541, 541, 541, 541, 3216, 541, 541, 541, 541, 541, 541, 541, 3221, 541, 3223, 541, 541, 541, 541, 541, 3408, 541, 541, 3410, 563, 563, 563, 563, 3414, 563, 563, 563, 563, 1446, 1447, 563, 563, 563, 26028, 1360, 988, 587, 587, 587, 587, 587, 587, 3671, 0, 0, 0, 541, 541, 541, 3674, 563, 563, 563, 563, 563, 587, 587, 3260, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3274, 587, 587, 587, 587, 587, 587, 3280, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 541, 587, 563, 541, 2722, 563, 3350, 563, 563, 563, 563, 563, 563, 563, 563, 587, 587, 587, 587, 587, 587, 587, 587, 3655, 587, 587, 587, 587, 3363, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3369, 587, 0, 0, 0, 541, 587, 563, 541, 541, 541, 541, 541, 563, 563, 563, 563, 563, 3071, 563, 563, 563, 563, 563, 0, 0, 0, 0, 541, 541, 3660, 3661, 541, 541, 563, 563, 3664, 3665, 563, 563, 563, 563, 1423, 563, 563, 1430, 563, 563, 563, 563, 563, 563, 563, 563, 2631, 563, 563, 563, 563, 563, 563, 563, 587, 587, 3668, 3669, 587, 587, 0, 0, 0, 0, 541, 541, 541, 541, 563, 563, 563, 924, 928, 931, 563, 939, 563, 563, 563, 954, 956, 959, 0, 0, 690, 691, 0, 0, 0, 0, 696, 0, 0, 0, 365, 365, 365, 0, 0, 0, 0, 0, 1185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3180, 0, 0, 0, 0, 0, 0, 829, 0, 0, 0, 0, 0, 0, 0, 0, 0, 758, 0, 0, 0, 0, 0, 0, 758, 0, 0, 0, 0, 0, 758, 758, 910, 541, 563, 563, 563, 563, 927, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1432, 563, 563, 1436, 563, 563, 563, 983, 0, 587, 587, 587, 587, 1057, 78115, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 1220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 282624, 587, 1521, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1514, 587, 0, 0, 0, 1721, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1193, 0, 0, 0, 0, 2040, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 749, 0, 2171, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2211, 3288, 541, 3290, 563, 3292, 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3514, 468, 468, 468, 486, 494, 494, 486, 494, 494, 494, 494, 494, 494, 494, 494, 519, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 536, 527, 527, 527, 527, 527, 549, 572, 549, 572, 549, 549, 572, 549, 596, 572, 572, 572, 572, 572, 572, 572, 596, 596, 596, 549, 596, 596, 596, 596, 596, 596, 596, 596, 572, 572, 549, 572, 596, 572, 596, 1, 795, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1652, 0, 818, 0, 0, 0, 795, 0, 0, 818, 0, 0, 0, 0, 0, 818, 818, 0, 0, 0, 0, 795, 0, 0, 0, 0, 0, 0, 836, 791, 0, 0, 836, 857, 541, 865, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 3527, 563, 911, 541, 563, 563, 563, 563, 563, 930, 563, 938, 563, 563, 563, 563, 563, 563, 1850, 563, 563, 563, 563, 563, 563, 563, 563, 563, 0, 587, 587, 587, 587, 587, 587, 587, 1012, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1058, 984, 0, 587, 587, 587, 1077, 1058, 78115, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 1243, 0, 0, 0, 0, 0, 0, 0, 0, 1259, 0, 0, 0, 1263, 0, 0, 0, 0, 0, 0, 0, 1139, 1140, 0, 0, 0, 0, 0, 365, 365, 0, 0, 0, 0, 0, 0, 1113, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2071, 0, 0, 0, 0, 0, 1180, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1705, 1340, 541, 541, 1344, 541, 541, 541, 541, 541, 1350, 541, 541, 541, 1357, 541, 541, 541, 541, 541, 1812, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1360, 1403, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2638, 563, 563, 1442, 563, 563, 563, 1449, 563, 563, 26028, 1360, 988, 587, 587, 587, 587, 587, 587, 3272, 587, 587, 587, 587, 587, 587, 587, 587, 3278, 587, 587, 1487, 587, 587, 587, 587, 587, 587, 587, 1495, 587, 587, 587, 587, 587, 587, 2365, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2691, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1524, 587, 587, 1528, 587, 587, 587, 587, 587, 1534, 587, 587, 587, 587, 587, 1492, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1510, 587, 587, 587, 587, 587, 1541, 587, 587, 0, 541, 587, 563, 541, 541, 541, 541, 541, 563, 563, 563, 563, 563, 3476, 563, 563, 563, 3480, 563, 563, 563, 563, 563, 563, 2863, 563, 563, 2867, 563, 563, 563, 563, 563, 563, 1409, 563, 563, 1413, 563, 563, 563, 563, 563, 563, 1448, 563, 563, 26028, 1360, 988, 587, 587, 587, 587, 0, 0, 0, 1595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1223, 0, 0, 0, 0, 0, 1655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1664, 0, 0, 0, 0, 0, 0, 1126, 0, 0, 0, 1130, 1131, 0, 0, 0, 0, 0, 0, 0, 2818048, 2846720, 0, 2916352, 0, 0, 3002368, 0, 0, 1718, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2053, 1702, 0, 0, 0, 0, 0, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 3326, 541, 541, 541, 563, 563, 563, 1893, 563, 563, 563, 563, 563, 563, 1901, 563, 563, 563, 563, 563, 563, 2887, 563, 563, 563, 2890, 563, 2892, 563, 563, 563, 587, 1944, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1940, 587, 587, 1974, 587, 587, 587, 587, 1980, 587, 587, 587, 587, 587, 587, 587, 587, 1989, 2007, 2009, 587, 587, 587, 587, 587, 541, 587, 563, 541, 541, 541, 541, 563, 563, 563, 563, 587, 587, 587, 587, 2030, 0, 2032, 0, 0, 2079, 0, 0, 0, 2082, 0, 0, 0, 0, 0, 2088, 0, 0, 0, 0, 0, 0, 1141, 0, 1143, 0, 0, 365, 365, 0, 0, 0, 0, 0, 0, 1154, 0, 0, 0, 0, 0, 1160, 0, 1162, 0, 2104, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2115, 0, 0, 0, 0, 0, 1192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 176128, 176128, 176128, 176128, 176128, 176128, 176128, 0, 0, 563, 563, 563, 563, 563, 563, 2250, 563, 563, 563, 563, 563, 563, 563, 1851, 563, 563, 563, 563, 1855, 563, 563, 563, 587, 587, 587, 587, 2349, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1985, 587, 587, 1988, 587, 2262, 541, 541, 541, 541, 563, 563, 563, 563, 587, 587, 587, 587, 0, 0, 0, 0, 0, 2732, 0, 2450, 0, 0, 0, 0, 0, 0, 0, 0, 2455, 0, 0, 2458, 0, 0, 0, 0, 0, 0, 2134016, 0, 0, 0, 0, 0, 0, 57344, 0, 0, 0, 0, 0, 0, 2748, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192972, 192972, 192972, 192972, 192972, 192972, 192972, 0, 0, 0, 0, 2462, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 541, 541, 2809, 541, 2473, 0, 0, 0, 0, 0, 0, 0, 2481, 0, 0, 0, 2483, 0, 0, 0, 0, 0, 0, 1170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2989, 0, 0, 0, 0, 0, 0, 2500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2510, 0, 0, 0, 0, 0, 0, 1186, 0, 0, 0, 1191, 0, 0, 0, 0, 1107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 758, 0, 0, 0, 0, 0, 0, 0, 2524, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2536, 541, 541, 2552, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 905, 541, 541, 2564, 541, 541, 541, 541, 541, 541, 2571, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1768, 541, 541, 541, 541, 541, 541, 541, 2578, 541, 541, 541, 2581, 541, 541, 541, 541, 541, 541, 541, 0, 0, 0, 0, 0, 0, 1203, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 813, 0, 0, 0, 0, 0, 0, 0, 0, 563, 2588, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1903, 1904, 563, 563, 563, 2611, 563, 563, 563, 563, 563, 563, 2616, 563, 563, 563, 563, 563, 563, 563, 2622, 587, 587, 587, 587, 2702, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2710, 587, 587, 587, 2713, 587, 587, 587, 587, 587, 587, 587, 2718, 2719, 2720, 541, 541, 541, 541, 541, 2177, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2845, 541, 541, 541, 2758, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2103, 0, 2773, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1120, 0, 0, 0, 2789, 0, 0, 0, 0, 2794, 0, 0, 0, 2796, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 316, 317, 317, 422, 423, 65536, 430, 541, 541, 541, 541, 2814, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1333, 541, 541, 541, 541, 541, 2848, 541, 541, 541, 541, 541, 541, 0, 0, 563, 563, 563, 2856, 563, 0, 587, 587, 1047, 587, 587, 78115, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 1159168, 365, 0, 0, 0, 0, 0, 0, 563, 563, 563, 563, 2861, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2294, 563, 563, 563, 563, 563, 563, 563, 563, 2897, 563, 563, 563, 563, 563, 563, 0, 0, 587, 587, 587, 587, 587, 587, 587, 2338, 587, 587, 587, 587, 587, 587, 587, 3122, 587, 587, 587, 587, 587, 587, 587, 587, 1036, 587, 587, 587, 587, 1054, 587, 587, 2905, 587, 587, 587, 587, 587, 2910, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1935, 587, 587, 587, 587, 1941, 587, 3006, 0, 0, 0, 0, 3010, 0, 0, 0, 0, 3015, 0, 0, 0, 0, 0, 0, 0, 2749, 0, 0, 0, 0, 0, 0, 0, 0, 0, 697, 698, 0, 365, 365, 365, 0, 3191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2145, 3300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3180, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 163840, 0, 0, 0, 0, 65536, 0, 563, 563, 563, 3340, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2283, 563, 563, 563, 563, 563, 563, 3351, 563, 563, 563, 563, 563, 563, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3359, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1942, 3370, 587, 587, 587, 587, 587, 587, 541, 541, 563, 563, 587, 587, 0, 0, 0, 0, 3297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3394, 0, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 3211, 541, 541, 3486, 587, 587, 587, 587, 587, 587, 587, 587, 3495, 587, 3497, 3498, 587, 3500, 587, 0, 0, 0, 541, 587, 563, 541, 541, 541, 904, 541, 563, 563, 563, 977, 3502, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 541, 541, 854, 541, 541, 3612, 541, 3613, 541, 541, 541, 563, 563, 563, 563, 563, 563, 3619, 563, 0, 996, 1075, 1041, 587, 587, 78115, 1079, 0, 0, 1081, 1085, 0, 0, 1089, 3620, 563, 563, 563, 563, 587, 587, 587, 587, 587, 587, 3627, 587, 3628, 587, 587, 0, 3603, 0, 0, 0, 0, 0, 0, 0, 0, 541, 541, 3610, 541, 563, 563, 587, 587, 587, 587, 0, 0, 541, 541, 563, 563, 587, 587, 3683, 3684, 3685, 3686, 0, 541, 563, 587, 0, 541, 563, 587, 0, 541, 563, 587, 0, 0, 0, 0, 0, 0, 0, 0, 3180, 0, 0, 0, 0, 0, 0, 0, 550, 597, 573, 573, 573, 573, 573, 573, 573, 597, 597, 597, 550, 597, 597, 597, 597, 597, 597, 597, 597, 573, 573, 550, 573, 597, 573, 597, 1, 0, 0, 0, 737, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1237, 0, 0, 0, 0, 0, 2041, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1194, 1196, 0, 403, 0, 0, 0, 0, 381, 0, 69632, 73728, 0, 0, 0, 0, 426, 65536, 0, 0, 0, 0, 0, 1202, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2444, 2445, 0, 0, 2448, 426, 426, 0, 0, 426, 0, 446, 426, 426, 469, 469, 469, 476, 469, 469, 469, 469, 469, 469, 469, 469, 469, 476, 469, 469, 469, 469, 469, 469, 469, 469, 483, 469, 495, 495, 469, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, 538, 551, 574, 551, 574, 551, 551, 574, 551, 598, 574, 574, 574, 574, 574, 574, 574, 598, 598, 598, 551, 598, 598, 598, 598, 598, 598, 598, 598, 574, 574, 551, 574, 598, 574, 598, 1, 0, 0, 0, 0, 660, 661, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3001, 0, 0, 0, 0, 0, 0, 0, 0, 661, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 661, 0, 0, 0, 0, 0, 827, 0, 0, 0, 661, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3176, 0, 0, 0, 0, 0, 0, 0, 729, 0, 742, 661, 0, 0, 0, 0, 0, 541, 844, 541, 541, 541, 541, 541, 2191, 541, 541, 541, 541, 541, 541, 2197, 541, 2199, 541, 541, 859, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 897, 541, 541, 541, 541, 541, 541, 2817, 541, 2819, 541, 541, 541, 541, 541, 541, 541, 541, 2572, 541, 541, 541, 541, 541, 541, 541, 541, 1349, 541, 541, 541, 541, 541, 541, 541, 541, 1752, 541, 541, 541, 541, 541, 541, 541, 541, 1767, 541, 541, 541, 541, 541, 541, 541, 541, 1782, 541, 541, 541, 541, 541, 541, 541, 541, 1815, 1817, 541, 541, 541, 541, 541, 1360, 563, 563, 563, 970, 563, 563, 563, 563, 563, 0, 587, 587, 990, 587, 587, 587, 587, 587, 1526, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1953, 587, 587, 587, 587, 587, 1006, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1044, 587, 587, 587, 587, 587, 587, 3285, 587, 587, 587, 587, 587, 587, 541, 587, 563, 1094, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1101, 1102, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 167936, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 1229, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1247, 0, 0, 0, 0, 0, 0, 0, 1102, 0, 0, 0, 0, 1260, 1261, 0, 0, 1101, 0, 0, 0, 0, 0, 0, 2134756, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1116, 0, 0, 0, 0, 0, 541, 1306, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 0, 2241, 1360, 914, 563, 1363, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1377, 1384, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1398, 563, 563, 563, 563, 563, 563, 3079, 563, 563, 563, 563, 563, 563, 563, 563, 563, 0, 587, 587, 989, 587, 587, 587, 1418, 563, 563, 563, 563, 563, 563, 563, 1431, 563, 563, 563, 563, 563, 563, 563, 1897, 563, 563, 563, 563, 563, 563, 563, 563, 1395, 563, 563, 563, 563, 563, 563, 563, 587, 587, 1523, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1537, 587, 0, 0, 0, 541, 587, 563, 541, 541, 541, 1067, 911, 563, 563, 563, 1072, 563, 587, 587, 1523, 587, 587, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2781, 0, 0, 0, 0, 0, 541, 541, 541, 1746, 1747, 541, 541, 541, 541, 1754, 541, 541, 541, 541, 541, 541, 541, 1290, 541, 1295, 541, 541, 1299, 541, 541, 1302, 541, 541, 541, 541, 1795, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1335, 541, 541, 541, 1825, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1841, 1842, 563, 563, 563, 563, 1849, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3347, 563, 563, 563, 563, 3348, 1890, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2649, 587, 1945, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2372, 587, 587, 1959, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2384, 2385, 587, 587, 587, 587, 2012, 587, 587, 541, 587, 563, 541, 541, 541, 541, 563, 563, 587, 587, 2961, 0, 0, 2964, 2965, 0, 0, 0, 0, 0, 0, 0, 2505, 0, 0, 0, 0, 0, 0, 0, 0, 0, 387, 0, 0, 0, 0, 0, 387, 0, 0, 0, 2054, 0, 2055, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2064, 541, 541, 541, 541, 2216, 541, 541, 541, 541, 541, 541, 2221, 541, 541, 541, 541, 541, 541, 1285, 1292, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1800, 541, 541, 541, 1805, 541, 541, 541, 2226, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 0, 0, 563, 563, 563, 563, 563, 563, 563, 563, 2302, 563, 563, 563, 563, 563, 563, 2307, 563, 563, 563, 563, 563, 563, 3080, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1883, 563, 563, 563, 563, 563, 563, 563, 2313, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 0, 0, 587, 587, 587, 587, 587, 587, 2389, 587, 587, 587, 587, 587, 587, 2394, 587, 587, 587, 587, 587, 587, 2377, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1952, 587, 587, 587, 587, 1956, 587, 587, 2400, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 541, 587, 0, 0, 0, 541, 587, 563, 541, 541, 895, 541, 541, 563, 563, 968, 563, 0, 587, 587, 587, 587, 587, 78115, 1079, 0, 0, 1082, 1086, 0, 0, 1090, 0, 2437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1178, 0, 587, 2671, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2931, 587, 0, 0, 0, 2736, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1588, 1589, 0, 0, 2787, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2797, 0, 0, 0, 0, 0, 0, 1204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1631, 0, 0, 0, 0, 0, 541, 541, 541, 2813, 541, 541, 541, 541, 541, 541, 2821, 541, 541, 541, 541, 541, 541, 541, 2555, 541, 541, 541, 541, 541, 541, 541, 2562, 563, 563, 563, 2860, 563, 563, 563, 563, 563, 563, 2868, 563, 563, 563, 563, 563, 563, 3094, 563, 563, 3096, 563, 563, 563, 563, 563, 563, 1880, 1881, 1882, 563, 563, 1885, 1886, 563, 563, 563, 0, 0, 3008, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1197, 0, 0, 541, 541, 3227, 541, 541, 541, 541, 541, 541, 563, 563, 563, 563, 563, 563, 563, 3073, 563, 563, 563, 3571, 541, 3573, 541, 541, 541, 563, 563, 563, 563, 563, 563, 563, 3583, 563, 3585, 0, 0, 0, 0, 541, 3659, 541, 541, 541, 541, 563, 3663, 563, 563, 563, 563, 563, 1878, 563, 563, 563, 563, 1884, 563, 563, 563, 563, 563, 563, 2864, 563, 2866, 563, 563, 563, 563, 563, 563, 563, 3354, 563, 563, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1057, 587, 3667, 587, 587, 587, 587, 0, 0, 0, 0, 541, 541, 541, 541, 563, 563, 915, 563, 563, 563, 563, 563, 563, 946, 563, 563, 563, 563, 563, 1427, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3535, 563, 563, 563, 563, 563, 563, 587, 587, 587, 587, 3112, 587, 587, 587, 587, 3116, 470, 470, 470, 470, 454, 454, 470, 454, 454, 454, 454, 454, 454, 454, 454, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 520, 552, 575, 552, 575, 552, 552, 575, 552, 599, 575, 575, 575, 575, 575, 575, 575, 599, 599, 599, 552, 599, 599, 599, 599, 599, 599, 599, 599, 575, 575, 552, 575, 599, 575, 599, 1, 541, 860, 541, 541, 874, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1770, 541, 541, 541, 1007, 587, 587, 1021, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1971, 587, 587, 587, 0, 1123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1184, 1184, 1251, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2156, 0, 0, 0, 1268, 0, 0, 0, 0, 0, 0, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1360, 541, 541, 541, 1323, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2534, 541, 541, 541, 1341, 541, 541, 541, 541, 541, 1348, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2234, 541, 541, 541, 541, 0, 0, 1440, 563, 563, 563, 563, 563, 563, 563, 563, 26028, 1360, 988, 587, 587, 587, 587, 587, 587, 3365, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2936, 587, 587, 587, 2939, 587, 2941, 587, 587, 587, 587, 587, 1525, 587, 587, 587, 587, 587, 1532, 587, 587, 587, 587, 587, 587, 2392, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1472, 587, 587, 587, 587, 1482, 587, 563, 587, 587, 587, 1557, 587, 1079, 0, 1561, 0, 0, 0, 1567, 0, 0, 0, 0, 0, 0, 1218, 1219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1235, 0, 0, 0, 0, 0, 0, 1573, 0, 0, 0, 1579, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 662, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 541, 541, 1779, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2548, 541, 541, 563, 1843, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1854, 563, 563, 563, 563, 563, 1879, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3344, 563, 563, 563, 563, 563, 563, 563, 563, 1865, 563, 563, 563, 563, 563, 563, 563, 2065, 2066, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1210, 0, 2117, 0, 0, 2120, 2121, 0, 0, 0, 0, 0, 2127, 0, 0, 0, 0, 0, 0, 0, 2765, 0, 0, 0, 0, 0, 0, 0, 0, 0, 550, 573, 550, 573, 550, 550, 573, 541, 2213, 541, 541, 541, 541, 2218, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2182, 541, 541, 541, 541, 541, 2299, 563, 563, 563, 563, 2304, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1917, 563, 26028, 0, 587, 587, 587, 2386, 587, 587, 587, 587, 2391, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2001, 587, 587, 587, 587, 587, 2006, 541, 541, 541, 3037, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2846, 541, 541, 563, 563, 3077, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1887, 1888, 563, 587, 587, 587, 3119, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1986, 587, 587, 587, 563, 563, 3247, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2296, 563, 563, 587, 0, 0, 0, 3445, 0, 0, 0, 0, 3180, 0, 0, 0, 0, 0, 0, 0, 1242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 380, 0, 0, 0, 0, 0, 0, 0, 0, 541, 541, 541, 541, 3460, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2207, 541, 541, 541, 541, 541, 563, 587, 587, 587, 587, 3491, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2354, 587, 587, 587, 587, 587, 587, 563, 563, 563, 563, 3623, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2395, 587, 587, 587, 587, 587, 3631, 0, 0, 0, 0, 0, 0, 541, 541, 541, 541, 541, 541, 541, 563, 563, 920, 563, 563, 563, 563, 563, 563, 949, 951, 563, 563, 563, 563, 563, 3421, 563, 563, 563, 3425, 563, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3501, 388, 390, 340, 0, 0, 0, 0, 0, 0, 339, 0, 0, 340, 0, 0, 0, 0, 0, 0, 1598, 0, 0, 0, 0, 0, 0, 0, 0, 1604, 0, 0, 0, 387, 0, 0, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 0, 1217, 0, 0, 0, 0, 0, 0, 0, 1224, 0, 0, 0, 0, 0, 347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3316, 0, 0, 0, 0, 0, 0, 435, 339, 0, 0, 447, 0, 0, 471, 471, 471, 471, 471, 471, 471, 471, 471, 553, 576, 553, 576, 553, 553, 576, 471, 482, 471, 471, 471, 500, 477, 500, 500, 500, 500, 500, 500, 500, 500, 471, 471, 477, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 471, 481, 481, 471, 482, 471, 471, 553, 600, 576, 576, 576, 576, 576, 576, 576, 600, 600, 600, 553, 600, 600, 600, 600, 600, 600, 600, 600, 576, 576, 553, 576, 600, 576, 600, 1, 0, 0, 750, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1603, 0, 0, 0, 0, 0, 0, 663, 0, 788, 0, 0, 0, 0, 0, 0, 0, 792, 0, 0, 0, 0, 0, 1231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2153, 0, 0, 0, 0, 0, 0, 0, 801, 0, 0, 0, 0, 0, 809, 0, 0, 0, 0, 706, 0, 0, 0, 0, 0, 0, 0, 0, 715, 0, 717, 0, 828, 0, 0, 0, 663, 831, 0, 788, 0, 0, 0, 0, 0, 837, 0, 0, 0, 0, 0, 1597, 0, 0, 0, 577536, 0, 0, 1602, 0, 0, 0, 0, 0, 0, 1257, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2508, 0, 0, 0, 0, 0, 541, 861, 541, 541, 875, 541, 541, 541, 541, 888, 541, 541, 541, 541, 906, 541, 541, 541, 541, 541, 3519, 541, 541, 541, 541, 541, 541, 541, 541, 563, 563, 563, 923, 563, 929, 563, 563, 942, 563, 563, 953, 563, 958, 961, 563, 563, 563, 563, 979, 563, 563, 563, 0, 587, 587, 991, 587, 587, 587, 587, 587, 1962, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3287, 587, 587, 587, 541, 587, 563, 1008, 587, 587, 1022, 587, 587, 587, 587, 1035, 587, 587, 587, 587, 1053, 587, 587, 587, 587, 587, 2945, 587, 587, 2948, 587, 587, 2951, 587, 2952, 2953, 2954, 0, 0, 0, 0, 1216, 0, 0, 0, 0, 1221, 0, 0, 0, 0, 0, 0, 0, 1258, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 299, 0, 0, 0, 0, 0, 0, 1144, 0, 0, 1256, 0, 0, 0, 0, 0, 0, 0, 0, 1235, 0, 0, 0, 0, 0, 0, 2891776, 0, 0, 0, 0, 0, 2392064, 2412544, 0, 0, 0, 0, 0, 0, 2123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2727936, 0, 0, 0, 3084288, 0, 0, 0, 1267, 0, 0, 0, 0, 0, 0, 0, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1741, 541, 541, 541, 1309, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 3045, 541, 3047, 563, 587, 587, 1556, 587, 587, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3000, 0, 0, 0, 0, 0, 1621, 0, 0, 1624, 0, 1626, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3198, 3199, 0, 0, 0, 0, 0, 0, 0, 1722, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 683, 684, 685, 0, 0, 541, 541, 541, 541, 1780, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1820, 541, 541, 1360, 0, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1836, 563, 563, 563, 563, 563, 2263, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1433, 563, 563, 563, 563, 563, 1875, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2872, 1943, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2359, 0, 0, 2135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1618, 0, 0, 2146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2484, 0, 0, 0, 0, 541, 541, 541, 2163, 2164, 541, 541, 541, 541, 541, 541, 541, 541, 2180, 541, 541, 541, 541, 2185, 541, 541, 541, 541, 541, 2228, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 0, 0, 563, 563, 563, 563, 2857, 0, 0, 563, 563, 563, 2247, 563, 2249, 563, 563, 563, 563, 563, 563, 563, 563, 2320, 563, 563, 563, 563, 563, 0, 0, 563, 563, 563, 2315, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 0, 0, 988, 587, 587, 587, 587, 0, 0, 587, 587, 587, 2334, 587, 2336, 587, 587, 587, 587, 587, 587, 587, 587, 1965, 1966, 1968, 587, 587, 587, 587, 587, 587, 587, 587, 2402, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 541, 587, 0, 0, 0, 541, 587, 563, 541, 541, 897, 541, 541, 563, 563, 970, 563, 0, 997, 587, 1076, 1048, 587, 78115, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 458, 1147355, 1147355, 1147355, 1147355, 1147355, 1147355, 1147355, 1147355, 1147355, 1147355, 1147355, 1147355, 1147355, 1147355, 1147355, 1147355, 0, 0, 2438, 0, 0, 0, 0, 0, 0, 2443, 0, 0, 0, 2446, 2447, 0, 0, 0, 0, 0, 1610, 0, 0, 1613, 0, 0, 0, 0, 0, 0, 0, 0, 1584, 0, 0, 0, 0, 0, 0, 0, 0, 1683, 0, 0, 0, 0, 0, 0, 0, 0, 334, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1134, 0, 0, 0, 0, 2487, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2498, 0, 0, 0, 2515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2523, 0, 541, 541, 541, 541, 541, 3576, 563, 563, 563, 3580, 563, 563, 563, 563, 563, 563, 2290, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1899, 563, 563, 563, 563, 563, 1906, 2537, 2538, 541, 541, 541, 541, 541, 2543, 541, 2545, 541, 541, 541, 541, 2549, 541, 541, 541, 541, 541, 3614, 3615, 541, 563, 563, 563, 563, 563, 563, 563, 563, 3424, 563, 563, 587, 587, 587, 587, 587, 563, 563, 2598, 563, 563, 2601, 2602, 563, 563, 563, 563, 563, 2607, 563, 2609, 563, 0, 999, 1039, 587, 1050, 587, 78115, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 3184, 0, 0, 0, 0, 0, 0, 0, 0, 2750, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2732032, 0, 0, 0, 0, 0, 0, 563, 563, 563, 2613, 563, 563, 563, 563, 563, 563, 563, 563, 2619, 563, 563, 563, 563, 563, 3624, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1967, 587, 587, 587, 1972, 587, 587, 563, 2639, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1402, 563, 587, 587, 587, 2673, 587, 2675, 587, 587, 587, 587, 2679, 587, 587, 587, 587, 587, 587, 2676, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1469, 1476, 587, 587, 587, 587, 587, 587, 587, 587, 2685, 587, 587, 587, 587, 587, 587, 587, 587, 2693, 587, 587, 587, 587, 587, 1979, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2926, 2927, 587, 587, 587, 587, 2930, 587, 587, 587, 587, 587, 2701, 587, 587, 587, 587, 2705, 587, 587, 587, 587, 587, 587, 587, 2378, 2379, 587, 587, 587, 587, 587, 587, 587, 2406, 587, 587, 2409, 2410, 587, 587, 2176, 2348, 0, 2745, 0, 0, 0, 0, 0, 0, 0, 2751, 2752, 2753, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 172032, 0, 0, 0, 0, 65536, 0, 2772, 0, 2774, 0, 0, 0, 0, 2778, 0, 0, 0, 0, 2783, 0, 0, 2786, 541, 541, 2828, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1771, 541, 541, 541, 541, 541, 2838, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 3337, 563, 563, 541, 2847, 541, 541, 2850, 541, 541, 2853, 541, 0, 0, 2854, 563, 563, 563, 563, 563, 2277, 563, 563, 2280, 563, 563, 563, 563, 563, 563, 563, 3081, 563, 563, 563, 563, 563, 563, 563, 563, 3355, 563, 587, 587, 587, 587, 587, 587, 563, 563, 2875, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2324, 0, 0, 563, 563, 563, 563, 2886, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2606, 563, 2608, 563, 563, 563, 563, 563, 2896, 563, 563, 2899, 563, 563, 2902, 563, 0, 0, 2903, 587, 587, 587, 587, 587, 3284, 587, 587, 587, 587, 587, 587, 587, 541, 587, 563, 541, 541, 563, 563, 587, 587, 587, 2921, 587, 587, 2924, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2666, 587, 587, 587, 587, 0, 0, 0, 0, 0, 2972, 2973, 0, 0, 0, 0, 2978, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 221184, 0, 0, 0, 0, 65536, 0, 3021, 0, 0, 3023, 0, 0, 541, 541, 3028, 541, 541, 541, 541, 541, 541, 541, 541, 2205, 2206, 541, 541, 541, 541, 541, 541, 0, 0, 3160, 0, 3162, 0, 0, 0, 3166, 0, 0, 0, 0, 0, 0, 0, 0, 2518, 0, 0, 0, 0, 0, 0, 541, 541, 541, 541, 3030, 541, 541, 541, 541, 3034, 3234, 3235, 563, 563, 563, 563, 3239, 3240, 563, 563, 563, 563, 563, 3244, 563, 563, 563, 563, 1445, 563, 563, 563, 563, 26028, 1360, 988, 587, 1455, 587, 587, 0, 3632, 0, 0, 0, 0, 541, 541, 541, 541, 541, 3641, 541, 563, 563, 563, 563, 587, 587, 587, 587, 587, 587, 587, 3263, 3264, 587, 587, 587, 587, 587, 587, 3435, 587, 587, 587, 587, 587, 587, 587, 541, 563, 3268, 3269, 587, 587, 587, 587, 587, 3273, 587, 587, 587, 587, 587, 587, 587, 587, 2393, 587, 587, 587, 587, 587, 587, 587, 3279, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 541, 587, 563, 2721, 541, 0, 0, 0, 3312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1633, 0, 0, 0, 541, 3404, 541, 541, 541, 541, 541, 541, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3419, 563, 563, 563, 563, 563, 563, 563, 587, 587, 587, 587, 587, 3113, 587, 587, 587, 587, 587, 0, 3443, 0, 0, 3446, 0, 0, 0, 3180, 0, 0, 0, 0, 0, 0, 0, 1583, 0, 1585, 0, 0, 0, 0, 0, 0, 0, 1106, 0, 0, 0, 0, 0, 0, 0, 0, 0, 756, 0, 0, 0, 0, 0, 0, 0, 0, 541, 541, 3458, 541, 541, 541, 541, 3463, 541, 541, 541, 541, 3468, 541, 541, 541, 541, 872, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1316, 541, 541, 541, 563, 587, 587, 3489, 587, 587, 587, 587, 3494, 587, 587, 587, 587, 3499, 587, 587, 587, 587, 587, 3364, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2664, 587, 587, 2667, 2668, 587, 587, 563, 563, 3645, 3646, 563, 563, 563, 587, 587, 587, 3651, 3652, 587, 587, 587, 0, 541, 587, 563, 541, 541, 541, 541, 541, 563, 563, 563, 563, 587, 587, 587, 587, 0, 0, 0, 2730, 0, 0, 563, 587, 0, 541, 563, 587, 3691, 3692, 3693, 3694, 0, 541, 563, 587, 0, 0, 0, 0, 0, 0, 0, 0, 3180, 0, 0, 0, 0, 0, 3453, 342, 343, 344, 345, 346, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 713, 0, 0, 0, 0, 0, 0, 0, 391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1674, 0, 0, 0, 345, 345, 0, 346, 345, 0, 344, 345, 455, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 472, 487, 496, 496, 504, 496, 506, 496, 496, 506, 506, 496, 506, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 554, 577, 554, 577, 554, 554, 577, 554, 601, 577, 577, 577, 577, 577, 577, 577, 601, 601, 601, 554, 601, 601, 601, 601, 601, 601, 601, 601, 577, 577, 554, 577, 601, 577, 601, 1, 656, 657, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1590, 1591, 672, 673, 0, 675, 676, 0, 0, 0, 0, 0, 682, 0, 0, 0, 0, 0, 0, 0, 2804, 0, 0, 0, 541, 2808, 541, 541, 541, 0, 0, 0, 0, 692, 0, 0, 0, 0, 0, 0, 699, 365, 365, 365, 0, 0, 0, 0, 0, 1658, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3180, 0, 0, 0, 3308, 0, 719, 0, 721, 0, 723, 0, 0, 0, 0, 0, 0, 0, 0, 0, 733, 0, 0, 0, 0, 646, 752, 753, 754, 0, 0, 0, 0, 0, 760, 761, 0, 0, 0, 0, 0, 1680, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3180, 0, 3306, 0, 0, 763, 764, 675, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 779, 780, 0, 0, 0, 0, 0, 1696, 1697, 1698, 1699, 0, 0, 0, 0, 0, 0, 0, 0, 755, 0, 0, 0, 0, 0, 0, 0, 0, 772, 0, 0, 0, 0, 0, 0, 0, 0, 782, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1601, 0, 0, 761, 0, 0, 787, 0, 0, 0, 0, 0, 0, 0, 0, 0, 794, 675, 723, 0, 692, 811, 0, 0, 0, 0, 761, 0, 0, 0, 0, 0, 0, 0, 1591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1662, 0, 0, 0, 0, 0, 0, 0, 0, 754, 820, 821, 0, 0, 0, 0, 0, 0, 754, 0, 0, 825, 699, 0, 0, 0, 830, 0, 0, 0, 832, 0, 0, 0, 692, 699, 0, 0, 692, 830, 830, 0, 0, 0, 0, 0, 0, 0, 0, 0, 692, 541, 541, 851, 855, 858, 541, 866, 541, 541, 541, 881, 883, 886, 541, 541, 541, 898, 902, 541, 541, 541, 541, 541, 2541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 3044, 541, 541, 541, 563, 563, 563, 971, 975, 563, 563, 563, 563, 0, 587, 587, 587, 998, 1002, 1005, 587, 1013, 587, 587, 587, 1028, 1030, 1033, 587, 587, 587, 1045, 1049, 587, 587, 587, 587, 587, 1995, 587, 587, 587, 587, 587, 2002, 587, 587, 587, 587, 587, 587, 2946, 587, 587, 587, 587, 587, 587, 541, 587, 563, 1073, 0, 998, 587, 1045, 1049, 1078, 78115, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 2779, 0, 0, 0, 0, 0, 0, 0, 0, 303, 303, 303, 303, 0, 303, 303, 303, 0, 0, 0, 0, 1168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 729, 0, 0, 0, 0, 0, 0, 1199, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1209, 0, 0, 0, 0, 0, 0, 2912256, 0, 3207168, 2465792, 0, 0, 2719744, 0, 0, 0, 0, 0, 0, 541, 541, 541, 3397, 541, 541, 541, 541, 3401, 541, 0, 0, 1214, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1634, 0, 0, 0, 0, 1254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1665, 0, 0, 1321, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1331, 541, 541, 1338, 541, 541, 541, 541, 873, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1332, 541, 541, 541, 563, 563, 1443, 563, 563, 563, 563, 563, 563, 26028, 1360, 988, 587, 587, 587, 587, 587, 587, 3548, 587, 3550, 587, 587, 3552, 587, 587, 0, 0, 0, 0, 0, 0, 541, 541, 541, 3639, 3640, 541, 541, 563, 1501, 587, 587, 1505, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1515, 587, 0, 0, 0, 541, 587, 563, 541, 541, 899, 541, 541, 563, 563, 972, 563, 0, 1074, 587, 587, 1052, 587, 78115, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 2445312, 0, 2842624, 0, 0, 0, 2637824, 0, 587, 1522, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1535, 587, 587, 587, 587, 587, 2013, 587, 541, 587, 563, 541, 541, 541, 541, 563, 563, 563, 563, 587, 587, 587, 587, 0, 0, 0, 0, 0, 0, 1666, 0, 1668, 0, 0, 0, 1670, 0, 748, 0, 0, 0, 0, 0, 0, 0, 0, 3174, 0, 0, 0, 0, 0, 0, 0, 0, 791, 0, 0, 0, 0, 0, 0, 0, 0, 833, 0, 0, 0, 0, 0, 0, 808, 0, 0, 1693, 0, 0, 0, 0, 0, 0, 1700, 0, 0, 0, 0, 0, 0, 0, 1660, 1661, 0, 0, 0, 0, 0, 0, 0, 0, 710, 0, 0, 0, 0, 0, 0, 0, 0, 726, 0, 0, 0, 0, 0, 0, 0, 0, 0, 274432, 274432, 274432, 0, 274432, 274432, 274432, 541, 541, 1762, 541, 541, 541, 541, 541, 541, 541, 541, 1769, 541, 541, 541, 1773, 541, 541, 1778, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1788, 541, 541, 0, 563, 1828, 563, 563, 563, 563, 563, 563, 563, 1835, 563, 563, 563, 563, 563, 563, 3250, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2321, 563, 563, 563, 563, 0, 0, 563, 1908, 563, 563, 563, 563, 563, 563, 563, 563, 563, 26028, 0, 587, 1924, 587, 0, 0, 0, 541, 587, 563, 541, 541, 900, 541, 541, 563, 563, 973, 563, 563, 563, 563, 2262, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1434, 563, 563, 563, 563, 587, 587, 587, 1960, 587, 587, 587, 1964, 587, 587, 1969, 587, 587, 587, 587, 587, 587, 2688, 587, 587, 587, 587, 587, 587, 2695, 587, 587, 563, 563, 587, 587, 587, 587, 0, 0, 0, 2031, 0, 1082, 0, 0, 0, 2033, 0, 1086, 0, 0, 0, 2035, 0, 1090, 0, 0, 0, 2037, 0, 1094, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1620, 2587, 0, 1825, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2610, 2650, 563, 563, 563, 0, 0, 0, 2653, 0, 1921, 587, 587, 587, 587, 587, 587, 587, 3549, 587, 587, 587, 587, 587, 587, 0, 0, 3672, 0, 541, 541, 541, 541, 563, 563, 0, 0, 2969, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2102, 0, 0, 0, 0, 0, 3161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1703, 0, 0, 0, 0, 0, 3319, 541, 541, 541, 541, 541, 541, 541, 3324, 541, 541, 541, 541, 541, 541, 541, 2832, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2573, 541, 541, 541, 541, 541, 541, 587, 587, 3361, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2709, 587, 587, 3379, 0, 0, 3382, 0, 0, 0, 0, 3180, 3387, 0, 0, 0, 0, 0, 0, 0, 1682, 0, 1684, 0, 0, 0, 0, 0, 0, 0, 1114, 0, 0, 0, 0, 1118, 0, 0, 1121, 541, 541, 541, 541, 3407, 541, 541, 541, 563, 563, 563, 3412, 563, 563, 563, 563, 563, 2289, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2605, 563, 563, 563, 563, 563, 3416, 563, 563, 563, 563, 563, 3422, 563, 563, 563, 563, 587, 587, 587, 3428, 587, 0, 0, 0, 541, 587, 563, 850, 541, 1066, 901, 541, 923, 563, 1071, 974, 587, 587, 587, 3432, 587, 587, 587, 587, 587, 3438, 587, 587, 587, 587, 541, 563, 563, 563, 563, 2276, 563, 563, 563, 563, 563, 563, 2282, 563, 2284, 563, 2287, 563, 587, 587, 587, 587, 587, 3492, 587, 587, 587, 3496, 587, 587, 587, 587, 587, 587, 2704, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1470, 587, 587, 587, 587, 587, 587, 0, 0, 3657, 0, 541, 541, 541, 541, 541, 541, 563, 563, 563, 563, 563, 563, 936, 563, 563, 563, 563, 563, 563, 563, 563, 587, 3687, 3688, 3689, 3690, 0, 541, 563, 587, 0, 541, 563, 587, 0, 0, 0, 0, 0, 0, 0, 0, 3180, 0, 0, 3450, 3451, 0, 0, 389, 0, 0, 0, 393, 389, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122880, 0, 0, 0, 0, 0, 0, 0, 405, 0, 347, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 0, 1709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 399, 0, 0, 0, 0, 0, 0, 0, 436, 0, 0, 443, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131072, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 522, 522, 522, 522, 522, 0, 0, 0, 0, 0, 0, 0, 0, 0, 522, 522, 522, 522, 522, 522, 522, 522, 522, 555, 578, 555, 578, 555, 555, 578, 555, 602, 578, 578, 578, 578, 578, 578, 578, 602, 602, 602, 555, 602, 602, 602, 602, 602, 602, 602, 602, 578, 578, 617, 622, 602, 622, 628, 1, 0, 0, 0, 751, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2061, 0, 0, 0, 962, 563, 563, 563, 563, 980, 563, 563, 563, 0, 587, 587, 992, 587, 587, 587, 587, 587, 2350, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1936, 587, 587, 587, 587, 587, 1107, 0, 0, 0, 0, 1112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167936, 167936, 167936, 167936, 167936, 167936, 167936, 1360, 914, 563, 563, 563, 1366, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1380, 563, 563, 1404, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2620, 563, 563, 563, 1441, 563, 563, 563, 563, 563, 563, 563, 26028, 1360, 988, 587, 587, 587, 1458, 563, 587, 587, 587, 587, 587, 1079, 0, 1562, 0, 0, 0, 1568, 0, 0, 0, 0, 0, 0, 1627, 1628, 1629, 0, 0, 0, 0, 0, 0, 0, 0, 343, 0, 0, 0, 0, 0, 0, 0, 0, 403, 0, 0, 0, 0, 0, 0, 0, 0, 407, 407, 407, 407, 0, 407, 407, 407, 1574, 0, 0, 0, 1580, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 808, 541, 541, 852, 541, 1605, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1619, 0, 0, 0, 0, 0, 1723, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2625536, 0, 2699264, 2715648, 0, 1973, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2373, 563, 563, 587, 587, 587, 587, 0, 0, 1563, 0, 0, 0, 0, 0, 1569, 0, 1575, 0, 1581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1262, 0, 0, 0, 0, 0, 0, 0, 0, 1575, 0, 0, 0, 0, 0, 1581, 0, 0, 0, 0, 0, 0, 0, 2974, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 0, 253952, 0, 0, 0, 0, 541, 541, 541, 2190, 541, 541, 541, 541, 2194, 541, 2196, 541, 541, 541, 541, 541, 541, 541, 3039, 541, 541, 541, 541, 541, 541, 541, 541, 541, 887, 541, 541, 541, 541, 541, 541, 563, 563, 2275, 563, 563, 563, 563, 2279, 563, 2281, 563, 563, 563, 563, 563, 563, 1896, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1397, 1399, 563, 563, 563, 563, 563, 587, 587, 2362, 587, 587, 587, 587, 2366, 587, 2368, 587, 587, 587, 587, 587, 587, 1465, 587, 587, 587, 587, 587, 587, 1480, 587, 587, 0, 0, 0, 0, 0, 2489, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 196608, 0, 0, 0, 0, 563, 563, 2625, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2648, 563, 563, 0, 0, 0, 0, 3024, 0, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1330, 541, 541, 541, 541, 0, 3380, 0, 0, 0, 0, 0, 0, 3180, 0, 0, 0, 0, 3391, 0, 0, 0, 0, 0, 328, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 3393, 0, 0, 0, 0, 0, 541, 3396, 541, 541, 3398, 541, 541, 541, 541, 541, 541, 541, 3040, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1783, 541, 541, 541, 541, 1789, 541, 0, 3455, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 563, 563, 563, 541, 862, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1319, 541, 541, 912, 563, 563, 563, 563, 563, 563, 935, 563, 563, 563, 563, 563, 563, 563, 2291, 2292, 563, 563, 563, 563, 563, 563, 563, 2319, 563, 563, 2322, 2323, 563, 563, 0, 0, 1009, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2697, 1059, 0, 0, 0, 541, 587, 563, 541, 541, 541, 541, 541, 563, 563, 563, 563, 563, 2614, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3649, 587, 587, 587, 587, 587, 587, 587, 0, 1095, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2513, 0, 0, 1623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2130, 0, 2132, 1826, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3258, 541, 3215, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1337, 541, 587, 587, 587, 3271, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2370, 587, 587, 587, 0, 0, 0, 0, 348, 348, 350, 348, 348, 348, 348, 348, 348, 513, 348, 348, 0, 350, 348, 0, 0, 348, 348, 0, 0, 0, 0, 349, 0, 0, 0, 0, 0, 329, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2509, 0, 0, 0, 0, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 348, 556, 579, 556, 579, 556, 556, 579, 556, 603, 579, 579, 579, 579, 579, 579, 579, 603, 603, 603, 556, 603, 603, 603, 603, 603, 603, 603, 603, 579, 579, 556, 579, 603, 579, 603, 1, 0, 0, 0, 0, 722, 0, 724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 299, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 739, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 836, 541, 541, 541, 541, 0, 0, 0, 766, 0, 0, 0, 771, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1189, 0, 0, 0, 0, 0, 0, 541, 541, 541, 870, 541, 541, 541, 541, 541, 890, 892, 541, 541, 903, 541, 541, 541, 541, 541, 2569, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2835, 541, 541, 541, 963, 965, 563, 563, 976, 563, 563, 563, 563, 0, 587, 587, 993, 999, 587, 587, 587, 587, 587, 3374, 587, 541, 541, 563, 563, 587, 587, 0, 0, 0, 0, 0, 0, 3299, 0, 0, 0, 587, 587, 1017, 587, 587, 587, 587, 587, 1037, 1039, 587, 587, 1050, 587, 587, 587, 587, 587, 2364, 587, 587, 2367, 587, 587, 587, 587, 587, 587, 587, 2677, 587, 587, 587, 587, 587, 587, 2682, 587, 0, 0, 0, 1151, 0, 1153, 0, 1155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1231, 541, 541, 541, 541, 541, 541, 0, 1181, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1636, 0, 0, 1198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1675, 0, 0, 1266, 0, 0, 0, 0, 0, 0, 0, 1181, 541, 541, 541, 541, 541, 541, 541, 1326, 541, 541, 541, 541, 541, 541, 541, 1339, 1305, 1307, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1358, 541, 541, 541, 1343, 541, 541, 541, 541, 541, 541, 541, 541, 1354, 1355, 541, 541, 541, 541, 541, 541, 2840, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 3056, 541, 3058, 541, 541, 541, 1360, 914, 563, 563, 563, 563, 1367, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3242, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1421, 563, 563, 563, 563, 563, 563, 563, 1435, 563, 563, 563, 563, 563, 2627, 563, 563, 563, 563, 563, 563, 2635, 563, 563, 563, 1459, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2942, 587, 587, 587, 1489, 1491, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2707, 2708, 587, 587, 587, 1554, 587, 1555, 587, 587, 1558, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 306, 204800, 204800, 0, 205106, 204800, 1, 0, 1677, 0, 0, 1679, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1159, 0, 0, 0, 0, 541, 541, 541, 541, 1763, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2208, 541, 541, 541, 0, 563, 563, 563, 563, 563, 563, 563, 1833, 563, 563, 563, 563, 563, 563, 563, 2879, 563, 563, 563, 563, 563, 563, 563, 563, 2644, 563, 563, 563, 2647, 563, 563, 563, 1858, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1857, 563, 563, 563, 1909, 563, 563, 563, 563, 1915, 563, 563, 563, 26028, 0, 587, 587, 587, 587, 587, 2376, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2717, 541, 587, 563, 541, 541, 587, 587, 587, 587, 1929, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2938, 587, 587, 587, 587, 587, 1991, 587, 587, 587, 1996, 587, 587, 587, 587, 587, 587, 587, 587, 2005, 587, 0, 0, 0, 541, 587, 563, 852, 892, 541, 903, 541, 925, 965, 563, 976, 587, 587, 587, 2011, 587, 587, 587, 541, 587, 563, 541, 541, 541, 541, 563, 563, 916, 563, 563, 563, 932, 563, 563, 563, 563, 563, 563, 563, 1864, 563, 563, 563, 1868, 563, 563, 1873, 563, 2077, 0, 0, 0, 0, 0, 0, 0, 0, 2085, 0, 0, 0, 0, 0, 2089, 0, 0, 2091, 0, 0, 0, 0, 0, 0, 0, 2099, 0, 0, 0, 0, 0, 0, 0, 3012, 3013, 0, 0, 0, 0, 3018, 0, 0, 2133, 2134, 0, 2136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2144, 0, 0, 2149, 2150, 0, 0, 0, 0, 0, 2154, 0, 0, 0, 0, 0, 0, 0, 2160, 541, 541, 541, 541, 541, 541, 2167, 541, 541, 541, 541, 541, 541, 1288, 541, 541, 541, 541, 1298, 541, 541, 541, 541, 541, 541, 1325, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1801, 541, 541, 541, 541, 541, 2202, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2209, 541, 541, 541, 541, 541, 2815, 541, 2818, 541, 541, 541, 541, 2823, 541, 541, 541, 541, 541, 541, 3409, 541, 563, 563, 563, 563, 563, 563, 563, 563, 3479, 563, 3481, 3482, 563, 3484, 563, 541, 541, 541, 2215, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 895, 541, 541, 541, 0, 0, 2244, 563, 563, 563, 563, 563, 563, 563, 2252, 563, 563, 563, 563, 563, 563, 3534, 563, 3536, 563, 563, 3538, 563, 563, 587, 587, 563, 563, 2301, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2893, 563, 563, 0, 0, 2331, 587, 587, 587, 587, 587, 587, 587, 2339, 587, 587, 587, 587, 587, 587, 2715, 587, 587, 587, 587, 541, 587, 563, 541, 541, 587, 587, 587, 587, 2363, 587, 587, 587, 587, 587, 587, 2369, 587, 2371, 587, 2374, 587, 587, 2388, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2918, 587, 587, 0, 2474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2482, 0, 0, 0, 0, 0, 0, 0, 122880, 122880, 122880, 122880, 122880, 0, 122880, 0, 2105632, 0, 0, 2514, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2522, 0, 0, 541, 541, 541, 541, 541, 3461, 541, 541, 541, 3465, 541, 541, 541, 541, 541, 541, 1287, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2546, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2540, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2222, 541, 541, 541, 563, 563, 563, 2599, 563, 563, 563, 563, 563, 2604, 563, 563, 563, 563, 563, 563, 2278, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2632, 563, 563, 563, 563, 563, 563, 2670, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3143, 587, 587, 587, 587, 2686, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3125, 587, 587, 587, 587, 541, 541, 2723, 563, 563, 563, 2725, 587, 587, 587, 2727, 2728, 0, 0, 0, 0, 0, 0, 0, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 172032, 1, 0, 0, 2746, 0, 2747, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1175, 0, 0, 0, 0, 0, 0, 0, 0, 2762, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1192, 0, 1195, 0, 0, 2811, 541, 2812, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1804, 541, 541, 541, 541, 541, 2849, 541, 541, 541, 541, 541, 0, 0, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2255, 563, 2858, 563, 2859, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3086, 563, 563, 587, 587, 2907, 587, 2908, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3139, 587, 3141, 587, 587, 0, 0, 0, 2983, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2073, 0, 0, 0, 0, 0, 3381, 0, 0, 0, 0, 0, 3180, 0, 0, 0, 3390, 0, 0, 0, 0, 0, 0, 1659, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114688, 0, 241664, 258048, 0, 0, 3430, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3439, 587, 587, 587, 541, 563, 563, 563, 563, 2303, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 26028, 0, 587, 587, 587, 541, 541, 541, 541, 3518, 541, 541, 541, 541, 541, 541, 541, 541, 541, 563, 563, 563, 3232, 563, 563, 563, 563, 563, 563, 3531, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 587, 587, 587, 3357, 587, 587, 587, 587, 587, 3545, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 0, 0, 0, 0, 0, 0, 3637, 541, 541, 541, 541, 541, 541, 3643, 563, 563, 563, 563, 3647, 563, 563, 587, 587, 587, 587, 587, 3653, 587, 587, 0, 0, 0, 0, 3635, 0, 541, 541, 541, 541, 541, 541, 541, 563, 2724, 563, 563, 587, 2726, 587, 587, 0, 0, 0, 0, 0, 0, 0, 0, 3607, 0, 541, 541, 541, 541, 0, 3656, 0, 3658, 541, 541, 541, 541, 541, 541, 563, 563, 563, 563, 563, 563, 937, 563, 563, 563, 563, 563, 563, 563, 0, 0, 0, 0, 394, 395, 0, 396, 0, 0, 0, 0, 0, 396, 0, 0, 0, 0, 0, 331, 332, 333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 560, 583, 560, 583, 560, 560, 583, 401, 0, 0, 0, 0, 0, 368, 376, 404, 0, 0, 0, 0, 0, 368, 0, 0, 396, 0, 0, 0, 0, 0, 351, 0, 0, 368, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2744, 409, 411, 0, 0, 368, 376, 0, 69632, 73728, 0, 0, 0, 0, 427, 65536, 0, 0, 0, 0, 0, 2044, 2045, 0, 0, 0, 0, 0, 0, 0, 0, 0, 361, 0, 0, 0, 0, 0, 361, 427, 427, 437, 0, 427, 0, 411, 427, 456, 0, 0, 0, 0, 0, 0, 0, 0, 106496, 0, 106496, 0, 0, 0, 0, 106496, 396, 0, 409, 0, 497, 497, 0, 497, 497, 497, 497, 497, 497, 497, 497, 523, 523, 523, 523, 523, 456, 456, 456, 456, 531, 456, 456, 532, 456, 523, 537, 523, 523, 523, 537, 523, 523, 523, 523, 539, 557, 580, 557, 580, 557, 557, 580, 557, 604, 580, 580, 580, 580, 580, 580, 580, 604, 604, 604, 557, 604, 604, 604, 604, 604, 604, 604, 604, 580, 580, 618, 623, 604, 623, 629, 1, 0, 0, 0, 643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2101, 0, 0, 0, 783, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2757, 0, 0, 0, 802, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2129, 0, 0, 0, 587, 587, 587, 1023, 1025, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3275, 587, 587, 587, 587, 0, 0, 0, 0, 1096, 0, 0, 1098, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1630, 0, 0, 0, 0, 0, 1636, 0, 0, 0, 0, 1111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1207, 0, 0, 0, 0, 1098, 1227, 0, 0, 0, 0, 0, 0, 1234, 0, 0, 0, 0, 0, 0, 0, 0, 155648, 0, 0, 0, 0, 0, 0, 0, 0, 1239, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1239, 1248, 0, 0, 0, 0, 0, 0, 1681, 0, 0, 0, 0, 0, 0, 1687, 0, 1689, 0, 0, 0, 0, 1239, 1269, 1270, 0, 1239, 0, 541, 541, 541, 541, 541, 541, 541, 3207, 3208, 541, 541, 541, 541, 3212, 3213, 1278, 541, 541, 541, 1282, 541, 541, 1293, 541, 541, 1297, 541, 541, 541, 541, 541, 541, 541, 3054, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1784, 541, 541, 541, 541, 541, 541, 1360, 914, 563, 563, 563, 563, 563, 563, 563, 1370, 563, 563, 563, 1374, 563, 563, 563, 563, 1847, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2308, 563, 563, 563, 563, 1385, 563, 563, 1389, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2295, 563, 563, 563, 563, 563, 563, 1406, 563, 563, 563, 1410, 563, 563, 563, 563, 563, 563, 563, 563, 2901, 563, 563, 0, 0, 587, 587, 587, 587, 587, 587, 1462, 587, 587, 587, 1466, 587, 587, 1477, 587, 587, 1481, 587, 587, 587, 587, 587, 3434, 587, 3436, 587, 587, 587, 587, 587, 587, 541, 563, 587, 1502, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3128, 587, 0, 1622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1635, 0, 0, 0, 0, 0, 2067, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2076, 1637, 0, 0, 0, 1641, 0, 0, 0, 1645, 0, 0, 0, 1649, 0, 0, 0, 0, 0, 0, 2056, 0, 2057, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1676, 0, 563, 563, 1844, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3540, 587, 587, 1958, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3127, 587, 3129, 587, 587, 2010, 587, 587, 587, 587, 1749, 1940, 1844, 541, 541, 541, 541, 563, 563, 917, 563, 563, 563, 934, 563, 563, 948, 563, 563, 563, 563, 563, 1895, 563, 563, 563, 1900, 563, 563, 563, 563, 563, 563, 1914, 563, 563, 563, 563, 26028, 0, 587, 587, 587, 0, 2118, 0, 0, 0, 0, 0, 0, 2125, 0, 0, 0, 0, 0, 0, 0, 0, 184726, 184932, 184932, 184932, 0, 184932, 184932, 184932, 0, 0, 2159, 0, 541, 541, 2162, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2833, 541, 541, 541, 541, 541, 541, 541, 2227, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 0, 0, 563, 2855, 563, 563, 563, 0, 0, 563, 563, 2246, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3255, 563, 563, 563, 563, 563, 563, 2314, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 0, 0, 587, 2904, 587, 0, 0, 587, 587, 2333, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3440, 587, 587, 541, 563, 587, 587, 587, 587, 2390, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2928, 587, 587, 587, 587, 587, 587, 587, 587, 2401, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 541, 587, 0, 0, 0, 541, 587, 563, 1064, 541, 541, 905, 541, 1069, 563, 563, 978, 541, 541, 541, 2567, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 900, 541, 541, 541, 2698, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3277, 587, 587, 0, 2759, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1716, 0, 541, 2827, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1758, 541, 563, 2874, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2285, 563, 587, 587, 587, 2923, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2382, 587, 587, 587, 0, 0, 2993, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2433, 0, 2435, 3171, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2771, 3202, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2577, 3225, 541, 541, 541, 541, 541, 541, 541, 541, 563, 563, 563, 563, 563, 563, 563, 2888, 563, 563, 563, 563, 563, 563, 563, 563, 3241, 563, 563, 563, 563, 563, 563, 563, 587, 587, 587, 3282, 587, 587, 587, 587, 587, 587, 587, 587, 587, 541, 587, 563, 2018, 541, 541, 541, 2022, 563, 541, 3289, 563, 3291, 587, 3293, 3294, 0, 0, 0, 0, 3298, 0, 0, 0, 0, 0, 0, 0, 1134592, 0, 365, 0, 0, 0, 1134592, 0, 0, 0, 1134592, 1134592, 0, 0, 1134592, 0, 0, 1134592, 0, 0, 0, 3311, 0, 0, 0, 0, 3315, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1725, 0, 0, 0, 0, 0, 0, 3318, 0, 541, 541, 541, 3320, 541, 541, 541, 3323, 541, 541, 541, 541, 541, 541, 541, 1751, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2586, 0, 563, 563, 563, 563, 563, 3338, 563, 563, 563, 3341, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 26028, 1921, 587, 587, 587, 587, 3360, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3554, 0, 0, 3403, 541, 3405, 541, 541, 541, 541, 541, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3075, 563, 563, 3418, 563, 3420, 563, 563, 563, 563, 563, 563, 587, 587, 587, 587, 587, 587, 587, 3596, 587, 3598, 587, 587, 0, 0, 0, 0, 3560, 0, 0, 0, 0, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2169, 541, 541, 541, 541, 541, 3574, 541, 541, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1417, 3586, 563, 563, 563, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3599, 587, 0, 0, 0, 853, 1000, 926, 849, 1065, 894, 541, 541, 922, 1070, 967, 563, 0, 587, 587, 587, 587, 587, 78115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 0, 305, 0, 0, 0, 0, 3611, 541, 541, 541, 541, 541, 541, 541, 563, 563, 3617, 563, 3618, 563, 563, 563, 563, 587, 587, 587, 587, 3594, 587, 587, 587, 587, 587, 587, 587, 541, 541, 563, 563, 587, 587, 3378, 0, 0, 410, 356, 0, 0, 0, 0, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 0, 0, 0, 0, 2122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 304, 304, 0, 0, 0, 0, 0, 0, 354, 0, 0, 0, 356, 0, 0, 473, 473, 473, 473, 473, 473, 473, 478, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 473, 478, 473, 484, 473, 0, 0, 473, 0, 0, 0, 0, 0, 0, 0, 0, 524, 528, 528, 528, 528, 473, 473, 473, 473, 473, 473, 473, 478, 473, 528, 524, 528, 528, 528, 524, 528, 528, 528, 528, 540, 558, 581, 558, 581, 558, 558, 581, 558, 605, 581, 581, 581, 581, 581, 581, 581, 605, 605, 605, 558, 605, 605, 605, 605, 605, 605, 605, 605, 581, 581, 619, 624, 605, 624, 630, 1, 0, 0, 0, 0, 644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1606, 0, 0, 0, 0, 688, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 365, 365, 0, 0, 0, 0, 0, 2138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2768, 0, 0, 0, 0, 0, 0, 0, 738, 0, 0, 0, 644, 738, 0, 744, 745, 644, 0, 0, 0, 0, 0, 0, 790, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2058, 0, 0, 0, 0, 0, 0, 0, 0, 799, 0, 804, 0, 0, 0, 0, 0, 0, 804, 0, 0, 0, 0, 0, 644, 0, 0, 0, 799, 0, 804, 0, 790, 0, 819, 0, 0, 0, 665, 0, 0, 0, 0, 819, 0, 0, 0, 0, 0, 0, 0, 2473984, 2478080, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2767, 0, 0, 0, 0, 0, 0, 0, 644, 0, 0, 0, 0, 0, 0, 0, 0, 790, 0, 0, 0, 0, 0, 0, 0, 3165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 563, 541, 563, 541, 541, 563, 0, 0, 790, 790, 0, 644, 0, 0, 790, 804, 842, 0, 541, 848, 541, 541, 541, 541, 541, 2839, 541, 541, 541, 2842, 541, 2844, 541, 541, 541, 541, 541, 541, 879, 541, 884, 541, 891, 541, 894, 541, 541, 908, 541, 541, 867, 871, 877, 541, 882, 541, 541, 541, 541, 541, 899, 541, 541, 541, 541, 541, 541, 2852, 541, 541, 0, 0, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2256, 563, 563, 563, 972, 563, 563, 563, 563, 563, 0, 587, 587, 995, 587, 587, 587, 587, 587, 2687, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2937, 587, 587, 587, 587, 587, 587, 587, 1014, 1018, 1024, 587, 1029, 587, 587, 587, 587, 587, 1046, 587, 587, 587, 587, 587, 1026, 587, 1031, 587, 1038, 587, 1041, 587, 587, 1055, 587, 1149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2799, 0, 0, 0, 1200, 0, 0, 0, 0, 0, 1205, 0, 0, 0, 0, 0, 0, 0, 1714, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2140, 2141, 0, 0, 2143, 0, 0, 1099, 0, 0, 0, 1230, 0, 1232, 0, 0, 0, 0, 0, 0, 0, 0, 0, 351, 352, 353, 0, 0, 0, 0, 1240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1246, 0, 1249, 1200, 0, 0, 0, 0, 0, 2427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 336, 337, 0, 0, 0, 0, 1230, 1252, 0, 1255, 0, 0, 0, 0, 0, 1130, 0, 0, 0, 0, 1264, 0, 0, 1149, 1264, 0, 1271, 541, 541, 541, 541, 1277, 1360, 914, 1362, 563, 563, 563, 563, 563, 1369, 563, 563, 563, 563, 1375, 563, 563, 563, 563, 1862, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3084, 563, 563, 563, 563, 563, 563, 563, 1407, 563, 563, 563, 563, 1412, 563, 563, 563, 563, 563, 563, 563, 2900, 563, 563, 563, 0, 0, 587, 587, 587, 563, 1419, 563, 563, 563, 1426, 1428, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3346, 563, 563, 563, 563, 563, 563, 587, 587, 1461, 587, 587, 587, 587, 1467, 587, 587, 587, 587, 587, 587, 587, 587, 2663, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1488, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1499, 587, 587, 587, 587, 1463, 587, 587, 587, 587, 587, 1475, 587, 587, 587, 587, 587, 587, 2014, 541, 587, 563, 1791, 541, 2020, 541, 1886, 563, 587, 587, 1504, 587, 587, 587, 587, 587, 587, 587, 587, 1511, 587, 587, 587, 1518, 1520, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2396, 2397, 2398, 587, 587, 1542, 587, 0, 541, 587, 563, 541, 541, 541, 541, 541, 563, 563, 563, 563, 563, 2862, 563, 2865, 563, 563, 563, 563, 2870, 563, 563, 563, 563, 587, 587, 587, 587, 587, 1079, 0, 0, 1563, 0, 0, 0, 1569, 0, 0, 0, 0, 0, 376, 0, 0, 0, 0, 368, 0, 385, 0, 351, 0, 0, 1575, 0, 0, 0, 1581, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 303, 303, 0, 0, 0, 0, 1592, 1593, 0, 0, 0, 0, 0, 1599, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2098, 0, 2100, 0, 0, 0, 0, 0, 1638, 0, 0, 0, 0, 0, 0, 0, 1646, 1647, 0, 0, 0, 0, 0, 0, 0, 3197, 0, 0, 0, 0, 0, 0, 3200, 0, 0, 1654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2038, 0, 1690, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3005, 0, 1706, 1707, 0, 0, 0, 1710, 0, 0, 0, 0, 0, 1714, 0, 0, 1717, 0, 0, 1730, 0, 1732, 1706, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2547, 541, 541, 541, 541, 541, 1744, 541, 541, 541, 541, 1750, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 3220, 541, 541, 541, 541, 541, 541, 1761, 541, 541, 541, 541, 1765, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 3335, 541, 541, 563, 563, 563, 541, 1776, 541, 541, 541, 1781, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2559, 541, 541, 541, 541, 1808, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1360, 914, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1376, 563, 0, 587, 587, 1046, 587, 587, 78115, 1079, 0, 0, 0, 0, 0, 0, 0, 0, 225890, 225890, 225890, 225890, 225741, 225890, 225890, 225890, 0, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1839, 563, 563, 563, 563, 1877, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2869, 563, 563, 563, 563, 563, 563, 1845, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1856, 563, 563, 563, 563, 1894, 563, 563, 563, 1898, 563, 563, 563, 563, 563, 563, 563, 1450, 563, 26028, 1360, 988, 1454, 587, 587, 587, 563, 563, 1860, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1871, 563, 563, 563, 563, 1911, 1913, 563, 563, 563, 563, 563, 26028, 0, 587, 587, 587, 587, 587, 1506, 587, 587, 1508, 587, 587, 587, 1512, 587, 587, 587, 0, 1286, 1470, 1378, 541, 541, 541, 1549, 541, 563, 563, 563, 1553, 563, 1876, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2297, 2298, 563, 563, 587, 2027, 587, 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3511, 0, 3513, 0, 541, 0, 0, 0, 2080, 2081, 0, 0, 2083, 2084, 0, 0, 0, 0, 0, 0, 0, 0, 286720, 0, 0, 0, 0, 0, 0, 0, 0, 0, 286720, 286720, 0, 286720, 286720, 1, 0, 0, 0, 2106, 0, 0, 0, 0, 2109, 2110, 0, 0, 0, 0, 0, 0, 0, 2069, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 564, 541, 564, 541, 541, 564, 541, 541, 541, 541, 2175, 541, 541, 2179, 541, 541, 541, 2183, 541, 541, 541, 541, 541, 541, 1347, 541, 541, 541, 541, 541, 541, 541, 541, 541, 563, 563, 3231, 563, 563, 563, 563, 2225, 541, 541, 541, 541, 2230, 541, 541, 541, 541, 541, 541, 541, 541, 0, 0, 0, 0, 0, 386, 0, 69632, 73728, 0, 0, 0, 0, 0, 65536, 0, 2242, 0, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2325, 0, 563, 563, 563, 2260, 563, 563, 2264, 563, 563, 563, 2268, 563, 563, 563, 563, 563, 587, 587, 3625, 587, 3626, 587, 587, 587, 587, 587, 587, 1493, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2380, 587, 587, 587, 587, 587, 587, 2312, 563, 563, 563, 563, 2317, 563, 563, 563, 563, 563, 563, 563, 563, 0, 0, 0, 0, 0, 0, 587, 587, 2655, 587, 587, 587, 2329, 0, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2680, 587, 587, 587, 587, 587, 587, 2347, 587, 587, 2351, 587, 587, 587, 2355, 587, 587, 587, 587, 587, 587, 2925, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1471, 587, 587, 587, 587, 587, 587, 2399, 587, 587, 587, 587, 2404, 587, 587, 587, 587, 587, 587, 587, 587, 541, 587, 0, 0, 0, 854, 1001, 927, 541, 541, 541, 541, 910, 563, 563, 563, 563, 563, 1848, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3097, 563, 3099, 563, 563, 563, 0, 0, 0, 0, 2439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1616, 0, 0, 0, 0, 0, 0, 2475, 0, 0, 0, 2479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 0, 0, 0, 0, 0, 0, 541, 2525, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2533, 541, 541, 541, 541, 541, 541, 3053, 541, 541, 3055, 541, 541, 541, 541, 541, 541, 541, 1311, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1753, 541, 541, 541, 541, 541, 541, 541, 2551, 541, 541, 2553, 541, 2554, 541, 541, 541, 541, 541, 541, 541, 2561, 541, 541, 541, 541, 876, 878, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1353, 541, 541, 541, 541, 541, 2565, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2576, 541, 541, 541, 541, 1283, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1304, 0, 0, 0, 563, 563, 2589, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3537, 563, 563, 3539, 563, 587, 587, 563, 2597, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2326, 0, 563, 563, 2612, 563, 563, 563, 2615, 563, 563, 2617, 563, 2618, 563, 563, 563, 563, 563, 2877, 2878, 563, 563, 563, 563, 2881, 563, 563, 563, 563, 563, 1863, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3356, 587, 587, 587, 587, 587, 563, 563, 563, 563, 2626, 563, 563, 2630, 563, 563, 563, 563, 563, 563, 563, 563, 3345, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2641, 2642, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 26028, 1360, 988, 587, 587, 587, 587, 2683, 587, 2684, 587, 587, 587, 587, 587, 587, 587, 587, 2692, 587, 587, 2696, 587, 0, 0, 0, 1061, 1062, 1063, 851, 541, 898, 902, 1068, 924, 563, 971, 975, 2733, 2734, 0, 0, 2737, 2738, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 306, 307, 0, 0, 0, 0, 0, 2788, 0, 2790, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2457, 0, 0, 0, 0, 0, 0, 0, 2803, 0, 0, 0, 0, 0, 0, 541, 541, 541, 541, 541, 541, 541, 3033, 541, 541, 2826, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2825, 2873, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2883, 563, 563, 563, 563, 1912, 563, 563, 563, 563, 563, 563, 26028, 0, 587, 587, 587, 587, 587, 2934, 587, 587, 587, 587, 587, 587, 587, 2940, 587, 587, 587, 587, 2922, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2932, 0, 2982, 0, 0, 2984, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1632, 0, 0, 0, 0, 0, 0, 0, 0, 2995, 0, 0, 2998, 0, 2999, 0, 0, 0, 0, 0, 0, 0, 2096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 562, 585, 562, 585, 562, 562, 585, 541, 3049, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 3061, 3089, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2621, 563, 3103, 563, 563, 563, 563, 563, 587, 587, 587, 3111, 587, 587, 587, 587, 587, 587, 1507, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1983, 1984, 587, 587, 587, 587, 587, 587, 3131, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2929, 587, 587, 587, 587, 3145, 587, 587, 587, 587, 587, 541, 587, 563, 541, 541, 563, 563, 587, 587, 0, 2962, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2507, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3163, 0, 0, 0, 0, 0, 0, 0, 3169, 0, 0, 0, 0, 0, 438, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2142, 0, 0, 0, 0, 541, 3226, 541, 541, 541, 541, 541, 541, 541, 563, 563, 563, 563, 563, 563, 563, 3095, 563, 563, 563, 563, 563, 563, 563, 563, 2306, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3236, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2309, 2310, 2311, 563, 563, 3246, 563, 563, 563, 563, 563, 563, 3252, 563, 3254, 563, 563, 563, 563, 563, 1392, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1853, 563, 563, 563, 563, 563, 563, 563, 563, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3265, 587, 587, 587, 587, 587, 2703, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2950, 587, 587, 541, 587, 563, 587, 587, 3281, 587, 3283, 587, 587, 587, 587, 587, 587, 587, 587, 541, 587, 563, 3153, 541, 3155, 563, 3157, 587, 0, 0, 0, 3301, 0, 0, 0, 0, 0, 0, 0, 3180, 0, 0, 0, 0, 0, 0, 0, 3014656, 3207168, 0, 2691072, 0, 0, 3215360, 0, 0, 3309, 0, 0, 0, 0, 0, 3314, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 0, 0, 0, 0, 131072, 131072, 563, 563, 3339, 563, 563, 563, 3343, 563, 563, 563, 563, 563, 563, 563, 563, 563, 26028, 1360, 988, 587, 587, 1456, 587, 587, 587, 587, 3362, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3126, 587, 587, 587, 587, 587, 3371, 587, 587, 587, 587, 541, 541, 563, 563, 587, 587, 0, 0, 0, 3296, 0, 0, 0, 0, 0, 0, 3557, 3558, 0, 0, 0, 0, 0, 0, 0, 541, 541, 541, 3568, 541, 541, 541, 541, 541, 1284, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1303, 563, 563, 3588, 563, 587, 587, 587, 3593, 587, 587, 587, 587, 587, 587, 587, 587, 2690, 587, 587, 587, 587, 2694, 587, 587, 3601, 587, 0, 0, 0, 0, 0, 3604, 3605, 3606, 0, 3608, 541, 541, 541, 541, 541, 541, 1813, 541, 541, 541, 541, 1819, 541, 541, 541, 1360, 563, 3621, 3622, 563, 563, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3629, 3630, 563, 563, 587, 587, 587, 587, 3679, 0, 541, 3680, 563, 3681, 587, 3682, 0, 541, 541, 541, 541, 1345, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2560, 541, 541, 541, 358, 359, 0, 0, 0, 0, 0, 0, 0, 365, 0, 293, 0, 0, 0, 0, 0, 0, 306, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1174, 0, 0, 0, 0, 0, 0, 0, 0, 392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2495, 0, 0, 0, 474, 474, 474, 488, 0, 0, 488, 359, 359, 359, 510, 359, 359, 359, 359, 474, 559, 606, 582, 582, 582, 582, 582, 582, 582, 606, 606, 606, 559, 606, 606, 606, 606, 606, 606, 606, 606, 582, 582, 559, 582, 606, 582, 606, 1, 541, 541, 868, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 904, 541, 541, 541, 541, 541, 2851, 541, 541, 541, 0, 0, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2254, 563, 563, 563, 587, 1015, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1051, 587, 587, 587, 587, 587, 2909, 587, 587, 587, 587, 587, 587, 2917, 587, 587, 587, 587, 587, 1527, 587, 587, 587, 587, 587, 587, 587, 587, 1538, 1539, 1197, 0, 0, 0, 0, 0, 0, 0, 1197, 0, 0, 0, 0, 0, 0, 0, 0, 1134592, 0, 0, 1134592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2980, 0, 0, 541, 541, 1280, 541, 541, 541, 1289, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 3524, 541, 541, 3526, 563, 563, 1360, 914, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1372, 563, 563, 563, 1381, 587, 587, 1543, 0, 1289, 1473, 1381, 541, 541, 541, 541, 541, 563, 563, 563, 563, 563, 2898, 563, 563, 563, 563, 563, 0, 0, 587, 587, 587, 587, 587, 587, 2337, 587, 587, 587, 587, 587, 587, 587, 2352, 587, 587, 587, 587, 2357, 587, 587, 587, 563, 587, 587, 587, 587, 587, 1079, 0, 0, 0, 1564, 0, 0, 0, 1570, 0, 0, 0, 0, 0, 2440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2871296, 0, 0, 2424832, 0, 0, 0, 1576, 0, 0, 0, 1582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 0, 0, 0, 0, 155648, 0, 0, 1606, 0, 0, 0, 0, 0, 0, 0, 1614, 1615, 0, 0, 0, 0, 0, 0, 0, 3385, 3180, 0, 0, 0, 0, 0, 0, 0, 0, 2097, 0, 0, 0, 0, 0, 0, 0, 0, 2070, 0, 0, 0, 0, 2074, 0, 0, 0, 0, 0, 0, 1625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1648, 0, 0, 0, 0, 563, 1891, 563, 563, 563, 563, 563, 563, 563, 563, 1902, 563, 563, 563, 563, 563, 1408, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 1867, 563, 563, 563, 563, 563, 587, 1975, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 1987, 587, 587, 587, 587, 1490, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2381, 587, 587, 587, 587, 2008, 587, 587, 587, 587, 587, 587, 541, 587, 563, 541, 541, 541, 541, 563, 563, 918, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2634, 563, 563, 563, 563, 0, 2243, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2637, 563, 0, 2330, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3276, 587, 587, 587, 0, 0, 2451, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2471, 0, 2472, 0, 0, 0, 563, 563, 563, 563, 563, 563, 563, 2593, 563, 563, 563, 563, 563, 1424, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2293, 563, 563, 563, 563, 563, 563, 587, 2659, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2912, 587, 587, 2916, 587, 587, 587, 587, 0, 0, 0, 0, 0, 2776, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 372, 0, 0, 373, 0, 0, 563, 2895, 563, 563, 563, 563, 563, 563, 563, 563, 563, 0, 0, 587, 587, 587, 587, 2335, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2947, 587, 587, 587, 587, 587, 541, 587, 563, 587, 2906, 587, 587, 587, 587, 587, 587, 2913, 587, 2915, 587, 587, 587, 587, 587, 587, 2935, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2408, 587, 587, 587, 587, 2177, 2349, 587, 587, 587, 2944, 587, 587, 587, 587, 587, 587, 587, 587, 587, 541, 587, 563, 563, 563, 563, 563, 563, 563, 587, 587, 587, 541, 587, 587, 587, 0, 541, 587, 563, 541, 1547, 541, 541, 1550, 563, 1551, 563, 563, 0, 0, 0, 0, 0, 3561, 0, 0, 0, 541, 541, 541, 541, 541, 541, 541, 541, 3464, 541, 3466, 3467, 541, 3469, 541, 541, 541, 541, 3575, 541, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3423, 563, 563, 563, 3426, 587, 587, 587, 587, 563, 3587, 563, 563, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3600, 587, 587, 587, 587, 3670, 587, 0, 0, 0, 0, 541, 541, 541, 541, 563, 563, 919, 925, 563, 563, 563, 563, 943, 563, 563, 563, 563, 563, 563, 3353, 563, 563, 563, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3267, 0, 0, 360, 0, 0, 0, 0, 0, 0, 365, 0, 293, 0, 0, 0, 0, 0, 0, 331, 0, 0, 0, 0, 0, 0, 0, 331, 0, 0, 69632, 73728, 0, 419, 419, 0, 0, 65536, 419, 0, 0, 0, 0, 375, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1663, 0, 0, 0, 0, 0, 0, 360, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2511, 0, 0, 0, 0, 0, 370, 0, 0, 370, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2496, 0, 0, 560, 607, 583, 583, 583, 583, 583, 583, 583, 607, 607, 607, 560, 607, 607, 607, 607, 607, 607, 607, 607, 583, 583, 560, 583, 607, 583, 607, 1, 541, 863, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1772, 541, 1010, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3123, 587, 587, 587, 587, 587, 587, 587, 563, 1386, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2871, 563, 0, 0, 2760, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2755, 0, 0, 0, 0, 0, 0, 0, 2985, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3302, 0, 3303, 0, 0, 0, 0, 3180, 0, 0, 0, 0, 0, 0, 348, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2801664, 0, 0, 0, 0, 2142208, 0, 0, 0, 361, 362, 363, 364, 0, 0, 365, 0, 293, 0, 0, 0, 0, 0, 0, 348, 349, 350, 0, 0, 0, 0, 0, 0, 0, 0, 3180, 0, 3388, 0, 0, 0, 0, 0, 0, 362, 0, 361, 0, 0, 0, 69632, 73728, 0, 0, 0, 0, 428, 65536, 0, 0, 0, 0, 0, 2463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2807, 541, 541, 541, 541, 428, 428, 0, 0, 428, 0, 362, 428, 457, 0, 0, 0, 0, 0, 0, 0, 0, 1159168, 0, 1159168, 0, 0, 0, 0, 1159168, 0, 0, 0, 0, 498, 498, 0, 505, 505, 505, 505, 511, 512, 505, 505, 525, 525, 525, 525, 525, 457, 457, 457, 457, 457, 457, 457, 457, 457, 525, 525, 525, 525, 525, 525, 525, 525, 525, 561, 584, 561, 584, 561, 561, 584, 561, 608, 584, 584, 584, 584, 584, 584, 584, 608, 608, 608, 561, 608, 608, 608, 608, 608, 608, 608, 608, 584, 584, 620, 625, 608, 625, 631, 1, 563, 563, 563, 973, 563, 563, 563, 563, 563, 0, 587, 587, 587, 587, 587, 587, 1963, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3137, 587, 587, 587, 587, 587, 587, 587, 0, 2105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2052, 0, 0, 0, 0, 0, 541, 2161, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 3336, 541, 563, 563, 563, 0, 0, 563, 2245, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2882, 563, 563, 563, 0, 0, 587, 2332, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3286, 587, 587, 587, 587, 541, 587, 563, 2550, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2210, 541, 541, 541, 2579, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 0, 0, 0, 0, 0, 0, 2068, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 0, 0, 122880, 122880, 0, 0, 2711, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 541, 587, 563, 541, 541, 541, 2021, 563, 563, 562, 609, 585, 585, 585, 585, 585, 585, 585, 609, 609, 609, 562, 609, 609, 609, 609, 609, 609, 609, 609, 585, 585, 562, 585, 609, 585, 609, 1, 0, 0, 0, 705, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2742, 0, 0, 0, 0, 735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2075, 0, 541, 864, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 2238, 0, 1011, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2689, 587, 587, 587, 587, 587, 587, 587, 587, 2716, 587, 587, 587, 541, 587, 563, 541, 541, 1136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 365, 0, 0, 0, 0, 0, 0, 2095, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2375680, 0, 0, 0, 0, 0, 587, 1503, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2911, 587, 2914, 587, 587, 587, 587, 2919, 587, 563, 587, 587, 587, 587, 587, 1079, 1560, 0, 0, 0, 1566, 0, 0, 0, 1572, 0, 0, 0, 1578, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2754, 0, 0, 0, 563, 563, 563, 563, 2600, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 26028, 1922, 587, 587, 587, 0, 0, 0, 0, 647, 0, 0, 0, 0, 0, 0, 743, 541, 541, 541, 541, 541, 541, 2178, 541, 541, 541, 541, 541, 541, 541, 541, 541, 0, 2242, 563, 563, 563, 563, 563, 0, 0, 1594, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2770, 0, 0, 563, 563, 563, 1846, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3085, 563, 3087, 563, 2187, 541, 2189, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, 1821, 541, 1360, 0, 0, 563, 563, 563, 563, 2248, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2305, 563, 563, 563, 563, 563, 563, 563, 563, 563, 0, 587, 587, 994, 587, 587, 587, 563, 2274, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 2894, 563, 587, 2361, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 587, 3121, 587, 587, 587, 587, 587, 587, 587, 587, 563, 563, 541, 563, 587, 563, 587, 1, 2623, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3101, 563, 563, 563, 563, 2651, 0, 0, 0, 0, 0, 0, 587, 587, 587, 587, 587, 587, 587, 587, 587, 2340, 587, 587, 587, 587, 0, 0, 3179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2798, 0, 0, 3245, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 563, 3257, 563, 1134592, 0, 1134592, 0, 0, 0, 1134592, 1135008, 1135008, 0, 0, 0, 0, 0, 1135008, 0, 0, 0, 0, 0, 2478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3180, 0, 0, 3307, 0, 1134592, 0, 1134592, 1134592, 0, 0, 0, 0, 1135203, 1135203, 1135203, 1135203, 1134592, 1135203, 1135203, 1135203, 1135203, 1135203, 1135203, 1135203, 0, 1134592, 1134592, 1134592, 1134592, 1135203, 1134592, 1135203, 1, 0, 0, 2125824, 2125824, 2125824, 2125824, 2125824, 2424832, 2433024, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 988, 2125824, 2125824, 2125824, 2125824, 1147355, 1147355, 1147355, 1147355, 458, 458, 1147355, 458, 458, 458, 458, 458, 458, 458, 458, 1147406, 1147406, 1147406, 1147406, 1147406, 1147406, 1147406, 1147406, 1147406, 1147406, 1147406, 1147406, 1147406, 1147406, 1147406, 1147406, 0, 0, 0, 0, 0, 0, 0, 0, 458, 0, 0, 0, 0, 0, 1147355, 1147355, 1147355, 1147406, 1147406, 1147355, 1147406, 1147406, 1, 12290, 3, 0, 0, 0, 0, 249856, 0, 0, 0, 249856, 0, 0, 0, 0, 0, 0, 0, 69632, 73728, 0, 0, 0, 0, 425, 65536, 0, 1159168, 0, 0, 1159168, 0, 1159168, 1159168, 0, 1159168, 1159168, 0, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 0, 1159168, 1159168, 0, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1159168, 0, 0, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1159168, 1, 12290, 3, 78115, 293, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131072, 131072, 0, 0, 1163264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3170, 0, 913, 2125824, 2125824, 2125824, 2125824, 2125824, 2424832, 2433024, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 2125824, 0, 0, 1453, 2125824, 2125824, 2125824, 2125824, 106496, 0, 106496, 106496, 0, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 0, 0, 0, 106496, 0, 0, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 106496, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2183168, 0, 0, 0, 0, 0, 0, 0, 0, 2134016, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 541, 541, 541, 1275, 541, 541, 0, 0, 0, 3117056, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2979, 0, 0, 0, 0, 3108864, 3198976, 0, 0, 3043328, 0, 3149824, 2936832, 0, 2760704, 0, 2437120, 0, 0, 0, 0, 0, 0, 2107, 0, 0, 0, 0, 0, 0, 0, 0, 0, 365, 0, 293, 0, 0, 0, 0, 0, 0, 0, 0, 2875392, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2834432\n];\n\nXQueryParser.EXPECTED =\n[ 1039, 1047, 1048, 1046, 1042, 1052, 1056, 1060, 1064, 1068, 1446, 1074, 2948, 2053, 1092, 1446, 2490, 1670, 1213, 1080, 1084, 1085, 1446, 1089, 1446, 1446, 2818, 1098, 1103, 1108, 1187, 1181, 1181, 1114, 1118, 1446, 1933, 1123, 1446, 1136, 1098, 1098, 1204, 1108, 1108, 1171, 1181, 1181, 1130, 1134, 1446, 1446, 1140, 1446, 1147, 1098, 1152, 1108, 1108, 1109, 1181, 1181, 1182, 1158, 1446, 1446, 1238, 1668, 1098, 1148, 1108, 1108, 1206, 1181, 1181, 1165, 1446, 3130, 2162, 1098, 1099, 1108, 1177, 1181, 1215, 1219, 2143, 1136, 1098, 1186, 1110, 1181, 1191, 3130, 2153, 1099, 1108, 1180, 1217, 2659, 2819, 1197, 1173, 1201, 1104, 1235, 1210, 1224, 1154, 1228, 1232, 1168, 1243, 1247, 1251, 1255, 1259, 1261, 1266, 1262, 1270, 1274, 1278, 1282, 1286, 1290, 1220, 1295, 1890, 1296, 1446, 1446, 1446, 1446, 1375, 2489, 1446, 1446, 1446, 2385, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1076, 1446, 1446, 1446, 1446, 2986, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1300, 1304, 1305, 1309, 1405, 1315, 1318, 1322, 1326, 1330, 1446, 1446, 1804, 1334, 2315, 1338, 2350, 1142, 1143, 1342, 1346, 1446, 1446, 2834, 1352, 1362, 1369, 1446, 1126, 1446, 2386, 1379, 1446, 1384, 1390, 1446, 2987, 2588, 1396, 2688, 1457, 1446, 1518, 1446, 1446, 2269, 1446, 1446, 1446, 1402, 1446, 1441, 1897, 1409, 1413, 1446, 1447, 1419, 1446, 1447, 1419, 1446, 1446, 1193, 1446, 2988, 3136, 2482, 1446, 2617, 1425, 1446, 1448, 1431, 1446, 1918, 1446, 2648, 1436, 1457, 1348, 1457, 1380, 1440, 1446, 1445, 3050, 1452, 1446, 1456, 1311, 1446, 1916, 2325, 1463, 2125, 1347, 1472, 2317, 1909, 1478, 3010, 2343, 2076, 2746, 2758, 1482, 2765, 2077, 1799, 1486, 2744, 1493, 1358, 1446, 1446, 2131, 1446, 2559, 1386, 1365, 1497, 1501, 1505, 1509, 1515, 2369, 1569, 2450, 1522, 2538, 1526, 1530, 1536, 2479, 2088, 1457, 1971, 1540, 1544, 1548, 1552, 1557, 1446, 2103, 1446, 1532, 1446, 2479, 2082, 1563, 1568, 2137, 1573, 1577, 3026, 1446, 1446, 2116, 1446, 1446, 3027, 1446, 1586, 1938, 1584, 2123, 1647, 1590, 1432, 1594, 1446, 2517, 1600, 1446, 2517, 1600, 1446, 2872, 1606, 1612, 1616, 1620, 1626, 1446, 1239, 1633, 1446, 1596, 1640, 3118, 2782, 1645, 1651, 1863, 1446, 1863, 1446, 1602, 1446, 2675, 2173, 1655, 2685, 1559, 1866, 2685, 3124, 1659, 1665, 2904, 2903, 3055, 2673, 1674, 1678, 3047, 2266, 2239, 1682, 1686, 1690, 1694, 1698, 2892, 1702, 1715, 1719, 1723, 1727, 1731, 1446, 2332, 1773, 1737, 1744, 1748, 1751, 1755, 1758, 1446, 1772, 2979, 1777, 1781, 2506, 1788, 1792, 1635, 1636, 1446, 2668, 2874, 1796, 1808, 2784, 1815, 1819, 1823, 2304, 1828, 1446, 2430, 1446, 1446, 2334, 1853, 2583, 1834, 1843, 1446, 2069, 1446, 1446, 1954, 1446, 1446, 2070, 1446, 1446, 1622, 1608, 1847, 1851, 1857, 1641, 1871, 1446, 2225, 1956, 1446, 2225, 1956, 1446, 2374, 1885, 1876, 1811, 1446, 1883, 1446, 1947, 1889, 1446, 1511, 1446, 1291, 2287, 1894, 1901, 1906, 1446, 1906, 1446, 1913, 1446, 1740, 1922, 1446, 1932, 1733, 1446, 1932, 1830, 1094, 1732, 1446, 1937, 2066, 2439, 2671, 1945, 1942, 2455, 1489, 2323, 1951, 1709, 1711, 1629, 1161, 1962, 1968, 1977, 1980, 1984, 1446, 1119, 1994, 1999, 2003, 2007, 2011, 2015, 2019, 2023, 1986, 1872, 2093, 1928, 2028, 2032, 2036, 1802, 2040, 1446, 1446, 2044, 1580, 2050, 2059, 2063, 2074, 2046, 1446, 2024, 2081, 1446, 2086, 1446, 1446, 1988, 2092, 2097, 2109, 2113, 1446, 2120, 1446, 1446, 2129, 1446, 1558, 2135, 1446, 1446, 2141, 2535, 2866, 2147, 1446, 1990, 1446, 1446, 3096, 1446, 1446, 3096, 1446, 1446, 1466, 2151, 2157, 2204, 1458, 2161, 1446, 2914, 1446, 1446, 1764, 1446, 3053, 2166, 2170, 1446, 2182, 1446, 2187, 1446, 2916, 1957, 2192, 2202, 2305, 1446, 2210, 2496, 1824, 3112, 2217, 1761, 1459, 1558, 2224, 2229, 2841, 2969, 2682, 2815, 2233, 2248, 2236, 2243, 1837, 1839, 2247, 2252, 2100, 1446, 1446, 1446, 1446, 2918, 1766, 2256, 2260, 2273, 2277, 2281, 2284, 1446, 2889, 1902, 2985, 2524, 2433, 2299, 2576, 2212, 2213, 2303, 1415, 1457, 2309, 1958, 2321, 2329, 1446, 2976, 1446, 1398, 1446, 1553, 2338, 2342, 2751, 1446, 2347, 2503, 2354, 2358, 1558, 2363, 1446, 1995, 2368, 1446, 1421, 2364, 2373, 2733, 2378, 2383, 2390, 3044, 1446, 2715, 1446, 1446, 1860, 1446, 1446, 1860, 2719, 2733, 2397, 2176, 2401, 1946, 2461, 1446, 1446, 2405, 1446, 1473, 2717, 2413, 2417, 2427, 2437, 3061, 1446, 2105, 1446, 1973, 2407, 2443, 2447, 2454, 2459, 2379, 1446, 2465, 2472, 2476, 2486, 2511, 2494, 2701, 2409, 2500, 2510, 2516, 2521, 2528, 2220, 2532, 2542, 2546, 2198, 2312, 2550, 2554, 2563, 2567, 2571, 2575, 1446, 2580, 2592, 2596, 2600, 2604, 2608, 2612, 2616, 1446, 2621, 2393, 1372, 2628, 2632, 2636, 2640, 2652, 3103, 1446, 2708, 2468, 2656, 2665, 2679, 2692, 1558, 2699, 1446, 2705, 1446, 2998, 2712, 1446, 2723, 2624, 1768, 1879, 3159, 1446, 2205, 2727, 1446, 1468, 2732, 1446, 2206, 2982, 1446, 3004, 2737, 2741, 3109, 2750, 1446, 2755, 1446, 1446, 2762, 1446, 1446, 2762, 2769, 3037, 2775, 2420, 2779, 1446, 2788, 1446, 1446, 2795, 1446, 1427, 2801, 3020, 2805, 2646, 1446, 2812, 1446, 2809, 1446, 3067, 2853, 2823, 2643, 2183, 2827, 2863, 2512, 2832, 2838, 1707, 1070, 2359, 2845, 2851, 2857, 1964, 1474, 3084, 2557, 2878, 2955, 3090, 2882, 2293, 2295, 2886, 2896, 2900, 2908, 2912, 1446, 1446, 1446, 2922, 2926, 2930, 2934, 2938, 2942, 2946, 1446, 2055, 2952, 1355, 2791, 2178, 2959, 1867, 2963, 1784, 2967, 1446, 2973, 2423, 2992, 2996, 3002, 1446, 2728, 1446, 1446, 3008, 1446, 3014, 3018, 1446, 3024, 2188, 3031, 3147, 1446, 1446, 2694, 1446, 1446, 2847, 1446, 1446, 2695, 3035, 1446, 3041, 3078, 3141, 3059, 1446, 1446, 3065, 1446, 1446, 3065, 1446, 1446, 3071, 1446, 3075, 1925, 3153, 1446, 1446, 3082, 1446, 1564, 3088, 1446, 1661, 3094, 3100, 2195, 3116, 1446, 3122, 1446, 3128, 1446, 3134, 1705, 3140, 2586, 2797, 1446, 3145, 2771, 1392, 3151, 1446, 3157, 2290, 2828, 2661, 2869, 2422, 3106, 2860, 2263, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1446, 1473, 3163, 3166, 3170, 3182, 3186, 3182, 3189, 3181, 3182, 3182, 3182, 3182, 3177, 3173, 3193, 3182, 3197, 3201, 3204, 3210, 3214, 3216, 3206, 3220, 3224, 3228, 3232, 3235, 3239, 3243, 3729, 3929, 3929, 3246, 3929, 3929, 5383, 3929, 3929, 3300, 3929, 3261, 3562, 3273, 4078, 3734, 3929, 3929, 3929, 3277, 3287, 3294, 4847, 3929, 3250, 3929, 3929, 3344, 3929, 4873, 4873, 4873, 4873, 3266, 4873, 4873, 3564, 3564, 3567, 3564, 3564, 3564, 3564, 3267, 3256, 3305, 3562, 3568, 3335, 4081, 3929, 3929, 3929, 3323, 4919, 3377, 4693, 3929, 3252, 3722, 3750, 3365, 3315, 3269, 3334, 4080, 3732, 3929, 3929, 3559, 4873, 5799, 4692, 3929, 3929, 3688, 3929, 3929, 3560, 4873, 4873, 4873, 4195, 4873, 4873, 4873, 4874, 3564, 3267, 3264, 3331, 3339, 3929, 3342, 3929, 3738, 3256, 3367, 3317, 3321, 3560, 4873, 3564, 3309, 3256, 3256, 3365, 3371, 3564, 3564, 3564, 3567, 3256, 3256, 3256, 3256, 3327, 4195, 3564, 3564, 3564, 3310, 3365, 3359, 3929, 3929, 3813, 3929, 3564, 3564, 3564, 3364, 3929, 5741, 3559, 4873, 4194, 3564, 3564, 3268, 3256, 4193, 4873, 3266, 3564, 3310, 3256, 3256, 3256, 3366, 3348, 3929, 3929, 3929, 3505, 3383, 3256, 3373, 3766, 3256, 3384, 3929, 4872, 4874, 3564, 3268, 3256, 3257, 3373, 4694, 3929, 3929, 3929, 3355, 3566, 3256, 3321, 4194, 3565, 3311, 3560, 3563, 3384, 3561, 3319, 3360, 3388, 3390, 4109, 3394, 3401, 3405, 3429, 3429, 3429, 3429, 3424, 3430, 3412, 3416, 3420, 3428, 3434, 3438, 3442, 3397, 3446, 3450, 3453, 3457, 3460, 3463, 3465, 3469, 3473, 3408, 3477, 3481, 3485, 3696, 3498, 4473, 3929, 3929, 3929, 3512, 3511, 3929, 3929, 3929, 3517, 4964, 4966, 3929, 3523, 3527, 3929, 3929, 3929, 3752, 3534, 3543, 3929, 3929, 3850, 3854, 3578, 3582, 3586, 3589, 3590, 3594, 3597, 3601, 3604, 3608, 3611, 3614, 3618, 3622, 3626, 4965, 3648, 3636, 5178, 3647, 5820, 3654, 4257, 3659, 3929, 3669, 4219, 3694, 3703, 3929, 5714, 3525, 3929, 3929, 3929, 3770, 3790, 3929, 5539, 3707, 3929, 3342, 5695, 3904, 3929, 3289, 3290, 3906, 3929, 4658, 4464, 5227, 4306, 3936, 3718, 3726, 3743, 3929, 3375, 3631, 3929, 3548, 5050, 5064, 3749, 3929, 3929, 3929, 3836, 3758, 3298, 3929, 3929, 3915, 3927, 4893, 3528, 3929, 3929, 3921, 4548, 5744, 4281, 3929, 3929, 3932, 5019, 3929, 5587, 5178, 3929, 3553, 3557, 3572, 5826, 3929, 3929, 4530, 3789, 3794, 3929, 3929, 3972, 4899, 3798, 3806, 3929, 3929, 3972, 5040, 3817, 3826, 3929, 3929, 3972, 5490, 3785, 3929, 3929, 3929, 3869, 4728, 4203, 3770, 3790, 4142, 3929, 3929, 3929, 3894, 4001, 3929, 3929, 3929, 3929, 3252, 3798, 4127, 4203, 3850, 3854, 4139, 3744, 3929, 3929, 3929, 3844, 5313, 5832, 4137, 4141, 3929, 3650, 3929, 3929, 4854, 4858, 4140, 3929, 3929, 3929, 3930, 5557, 3873, 3929, 3929, 3883, 3929, 5107, 3929, 5107, 4780, 3929, 4781, 5020, 3929, 3929, 3738, 5109, 3929, 3290, 3904, 3940, 3947, 3946, 3942, 3951, 3955, 3956, 3956, 3960, 3962, 3963, 3962, 3967, 3971, 3929, 3929, 4017, 4021, 4708, 3978, 3988, 3929, 3683, 3781, 3802, 3995, 4392, 3929, 5597, 5363, 3530, 3929, 4135, 4005, 4013, 3929, 3929, 4065, 4070, 4026, 3929, 3929, 4026, 3375, 3929, 3929, 4049, 4056, 4576, 3997, 5403, 5596, 3929, 3856, 4795, 3529, 3929, 3929, 3929, 3931, 4061, 3929, 3929, 3929, 3972, 4199, 3911, 3929, 3929, 3929, 3974, 5170, 3929, 3929, 4704, 3929, 4075, 5320, 4248, 5165, 3855, 4657, 4085, 3929, 3690, 4699, 5178, 3978, 3251, 3929, 3929, 4101, 3929, 5319, 4247, 5772, 5010, 4113, 3981, 3929, 3929, 4164, 4148, 4148, 4120, 3929, 3929, 4165, 4115, 4709, 4132, 3929, 3929, 4247, 4459, 5170, 3929, 3929, 4706, 3879, 4572, 4576, 5321, 4249, 4655, 3929, 3929, 4274, 3929, 3972, 4146, 4150, 3929, 3735, 3929, 3735, 4154, 4158, 3929, 3929, 4396, 3929, 3929, 3982, 3929, 3929, 3929, 4029, 4107, 3929, 4706, 3929, 4366, 4574, 4181, 5320, 5850, 4644, 4180, 5319, 4886, 4217, 4208, 4673, 3929, 3929, 4424, 5855, 3279, 5321, 4215, 3929, 3766, 4873, 4873, 3563, 3564, 4228, 3929, 4451, 4182, 4233, 4305, 4240, 4273, 4435, 4246, 4434, 4245, 4708, 4241, 3929, 3699, 4502, 3698, 4255, 5609, 4272, 5609, 4272, 3699, 5199, 5610, 4273, 4253, 3281, 4246, 4270, 3929, 3809, 3929, 4549, 3737, 3929, 3896, 3929, 5021, 3770, 4271, 3771, 4182, 5163, 5161, 3929, 3283, 5762, 3710, 4279, 4279, 4211, 4127, 4128, 4405, 3712, 4286, 3929, 3929, 3929, 4052, 3929, 5548, 3754, 4301, 3929, 3842, 3574, 4534, 4651, 5125, 3745, 4537, 4310, 4314, 4318, 4319, 4323, 4327, 4333, 4334, 4331, 4338, 4339, 4339, 4340, 3929, 3844, 4827, 3929, 3846, 3929, 3929, 4905, 3929, 3376, 5780, 4202, 3929, 3929, 3929, 4235, 4524, 5352, 5187, 4364, 4473, 3342, 4273, 3929, 3888, 5737, 4840, 4356, 4374, 4378, 4842, 5051, 4864, 3929, 4387, 4491, 3929, 4413, 3929, 3892, 5107, 3929, 3665, 3929, 3929, 4681, 3640, 4265, 4472, 3929, 4802, 3929, 4518, 3670, 4266, 4421, 3929, 4204, 4203, 3929, 4718, 4428, 4432, 3929, 3929, 3929, 4451, 4440, 4445, 3929, 3929, 4450, 4541, 4470, 3929, 3343, 3929, 3897, 3929, 4294, 3929, 4296, 3929, 5616, 3929, 5461, 4463, 3929, 5347, 4362, 5468, 4800, 3929, 3929, 4457, 4461, 5243, 3929, 4484, 3929, 3931, 5074, 3929, 3972, 4166, 4116, 3929, 3929, 3929, 4035, 4737, 3929, 3929, 3929, 4505, 3929, 5347, 4495, 3929, 3972, 5410, 5415, 4015, 4019, 3929, 3929, 4457, 4490, 4499, 3929, 3929, 3929, 4624, 5347, 3929, 4801, 3929, 3997, 3929, 5743, 4160, 3929, 3929, 3929, 4628, 3929, 5704, 4529, 3929, 3998, 5353, 5435, 3929, 5703, 4528, 3929, 4000, 3929, 3929, 3999, 3528, 4505, 5352, 4800, 3929, 4007, 4653, 3929, 4009, 3929, 4642, 5697, 3929, 3929, 3929, 4695, 4052, 3929, 3929, 3929, 4708, 4545, 3929, 3929, 3301, 4450, 3929, 3929, 3929, 4734, 3929, 5303, 3342, 3929, 4030, 4480, 3929, 3929, 3929, 4516, 4994, 3894, 3929, 3895, 3929, 3929, 3351, 3892, 3737, 3735, 3929, 4039, 3929, 3929, 4086, 5090, 3895, 5020, 3895, 3737, 5022, 3736, 3737, 4554, 4556, 3929, 3929, 4638, 4794, 3929, 3929, 4668, 4806, 4689, 3929, 3929, 3929, 4752, 4504, 3929, 3929, 5097, 4566, 4022, 5334, 4383, 5691, 4570, 4582, 4586, 4590, 4594, 4598, 4602, 4605, 4608, 4612, 4614, 4618, 4634, 4632, 4634, 4621, 3929, 3929, 3929, 4757, 4725, 4816, 3929, 4648, 4662, 4666, 5081, 4672, 3929, 5344, 4398, 4352, 4678, 3929, 3929, 4678, 4687, 5178, 3929, 3929, 4745, 4749, 4210, 3929, 4965, 4768, 5739, 3929, 3929, 3322, 5689, 3899, 5181, 4703, 5110, 5214, 4713, 4722, 3929, 4051, 3558, 3929, 4028, 4478, 4500, 3929, 5400, 4741, 3929, 3929, 4780, 3929, 4780, 4762, 3929, 3929, 3929, 4821, 4756, 4761, 3929, 3929, 4818, 4822, 4505, 3863, 3867, 3929, 3341, 3341, 3929, 4766, 4294, 3929, 3899, 3929, 4066, 3929, 3929, 4087, 5091, 3767, 5433, 4817, 4683, 4716, 3929, 5809, 3929, 4091, 4095, 3751, 3972, 4773, 4777, 3929, 4107, 3929, 3929, 4137, 4141, 4786, 4775, 3929, 3929, 4820, 3910, 4788, 4777, 3929, 3929, 4828, 3972, 3322, 4792, 3929, 3929, 4847, 3929, 5432, 4816, 4833, 4799, 3929, 5147, 3929, 3929, 4872, 4873, 4966, 4295, 4304, 4814, 4826, 3929, 3929, 3929, 4871, 4674, 3929, 4708, 3897, 5180, 5433, 4832, 3929, 4159, 3929, 3377, 3299, 3929, 4503, 4708, 3929, 4837, 3929, 3929, 3929, 4913, 5207, 3929, 3929, 3929, 4965, 3929, 5148, 3929, 4008, 3929, 4408, 3929, 4172, 3929, 4172, 3900, 5432, 3628, 3929, 3929, 3929, 4856, 4860, 3844, 5313, 3929, 3929, 4982, 3929, 5086, 3768, 5434, 3630, 3929, 4174, 3929, 4562, 5312, 3929, 3929, 3929, 5003, 4502, 5148, 4878, 4885, 4293, 3929, 3929, 4296, 3929, 4296, 3929, 4229, 5198, 5520, 3928, 3929, 3928, 3897, 4293, 3929, 3898, 3929, 5228, 3899, 3898, 3929, 4296, 3929, 5547, 3519, 4911, 3929, 5584, 4917, 3769, 3929, 3929, 3929, 4240, 4273, 3929, 3779, 3800, 3744, 4923, 4927, 4934, 4935, 4930, 4939, 4943, 4949, 4953, 4945, 4957, 4957, 4958, 4962, 3929, 4247, 4511, 3929, 3972, 5871, 3929, 3983, 3929, 5572, 5591, 3929, 4731, 4359, 5861, 5581, 4990, 3929, 3929, 3929, 5111, 4846, 5503, 4707, 5051, 3929, 4263, 4465, 3929, 4282, 3929, 3929, 3860, 3929, 5742, 3929, 3929, 3737, 3929, 3894, 5322, 3929, 5000, 5007, 3507, 3929, 4290, 3929, 3929, 4449, 3929, 5018, 3929, 3929, 3642, 5026, 3929, 3929, 3929, 5177, 4628, 3929, 3300, 3929, 4346, 3674, 3681, 3547, 3929, 3539, 5030, 5034, 3929, 3929, 3929, 5337, 5040, 3822, 3929, 3929, 3641, 5042, 3929, 3929, 3929, 5368, 3643, 3929, 3929, 3929, 5405, 5793, 3929, 3929, 3929, 5453, 4626, 3377, 5052, 3929, 3929, 3929, 3721, 4501, 4368, 3929, 3546, 3490, 5496, 5308, 5793, 3929, 3929, 5485, 4370, 3929, 3929, 5068, 3972, 5073, 4863, 3929, 3513, 4450, 5122, 3375, 5406, 3842, 3929, 3655, 5793, 3929, 3739, 4707, 5781, 3929, 3990, 3929, 3929, 4006, 3299, 4452, 4369, 3929, 4439, 4444, 3929, 3895, 4547, 3886, 3929, 5078, 3929, 3929, 5048, 5304, 3929, 5095, 3929, 5486, 5051, 4451, 4368, 3929, 4474, 4050, 4057, 4293, 4450, 3929, 3929, 5228, 3929, 5453, 3929, 3929, 5072, 4862, 3929, 5101, 3929, 3512, 5742, 3929, 5241, 5105, 4986, 3751, 5323, 3296, 4502, 4381, 3929, 4486, 4034, 3929, 3684, 3783, 3744, 5062, 3929, 3929, 4209, 3929, 3929, 3929, 3560, 3929, 5118, 3929, 3929, 5111, 4852, 4515, 4382, 5129, 3929, 4502, 4176, 3929, 4350, 5314, 3549, 3929, 5797, 3929, 3929, 3929, 5526, 5795, 3929, 3929, 3929, 5603, 5136, 5144, 5227, 4451, 4236, 3929, 4975, 3676, 5063, 4465, 3744, 4042, 4464, 5152, 3929, 4507, 3865, 3929, 4121, 5622, 4297, 4174, 3342, 5169, 3342, 5169, 4514, 3537, 4561, 4558, 3929, 4559, 4453, 3929, 5213, 4466, 3929, 4520, 3929, 3929, 5170, 4045, 5196, 5187, 5174, 4560, 5185, 4558, 5193, 5203, 5211, 5218, 5221, 5222, 5226, 3929, 3929, 3929, 5725, 3929, 5232, 4690, 3929, 4524, 5352, 3677, 3929, 3929, 3929, 5771, 3929, 5740, 3929, 4274, 4848, 5238, 5247, 5773, 5254, 5251, 4704, 3918, 5260, 5266, 5262, 5268, 5272, 5276, 5280, 5284, 5287, 5291, 5294, 5293, 5298, 5302, 3929, 3929, 3929, 5742, 5425, 3929, 4694, 5050, 3546, 3490, 3494, 3929, 5318, 3929, 5327, 3923, 4464, 4390, 5227, 3929, 5816, 5331, 5341, 3929, 5782, 3744, 3929, 4547, 3770, 3929, 4547, 3929, 3736, 5322, 3929, 5189, 3929, 3929, 5189, 5361, 5367, 3374, 3929, 4693, 3929, 3929, 3829, 3929, 5372, 3929, 5411, 3929, 4704, 4292, 3929, 3892, 3929, 3929, 4517, 5713, 4819, 4170, 3929, 5416, 3991, 3929, 4708, 4852, 3929, 4186, 4190, 3929, 3765, 3775, 3800, 5841, 5084, 3929, 3929, 5111, 5157, 3753, 5377, 5381, 3929, 3929, 5117, 3929, 3929, 5388, 3821, 3929, 4708, 5234, 4550, 3929, 5393, 5392, 3929, 4751, 5041, 3744, 3929, 3929, 5048, 5036, 3929, 5373, 5397, 4693, 3501, 3929, 3929, 3929, 5766, 4862, 3929, 3929, 3929, 5789, 5048, 4769, 3378, 3492, 5429, 4705, 5779, 3929, 4781, 4779, 3929, 4505, 5110, 3876, 3929, 3929, 3929, 5791, 3972, 5439, 3839, 3929, 4815, 3929, 4778, 5514, 5443, 3839, 3929, 4815, 3929, 5108, 5841, 5843, 3929, 3929, 5139, 3929, 5050, 5457, 3492, 4485, 5465, 3770, 3878, 3929, 4821, 3929, 3929, 4417, 3929, 3929, 5472, 5477, 3929, 4881, 3929, 5701, 5473, 5482, 3929, 3929, 5140, 3929, 5478, 3929, 5420, 3877, 3546, 5494, 3714, 3632, 3929, 5514, 5508, 3929, 4907, 5500, 3929, 4890, 4880, 3929, 4193, 4873, 4873, 4195, 5742, 3379, 5773, 3631, 5525, 3929, 3929, 3929, 5870, 5524, 3760, 3896, 3929, 5819, 4519, 5513, 3488, 5530, 5351, 3929, 4708, 4846, 4159, 3929, 3929, 3929, 5155, 5159, 5336, 5518, 3761, 3929, 3929, 5512, 5536, 4519, 4522, 3989, 3929, 3929, 3929, 4913, 5518, 3929, 4964, 4293, 5179, 5352, 3929, 3929, 4125, 3929, 3929, 4247, 4402, 4086, 3353, 3929, 5556, 5570, 3929, 5570, 5578, 3983, 3929, 5573, 3929, 4971, 3751, 3929, 4253, 3929, 4261, 5594, 4522, 3929, 5601, 3984, 3929, 5574, 3929, 4978, 4224, 3929, 3929, 5608, 5571, 5607, 5351, 5349, 3929, 3929, 3929, 5206, 4827, 3929, 3929, 4897, 4901, 5733, 5834, 3662, 4782, 5757, 3879, 5132, 5614, 5467, 5620, 5626, 5630, 5634, 5638, 5642, 5646, 5650, 5654, 5658, 5662, 5666, 5670, 5673, 5677, 5681, 5685, 3929, 3929, 5256, 4275, 5756, 3929, 3972, 3929, 4996, 3929, 5561, 5708, 5718, 3929, 5722, 5729, 3929, 3888, 3998, 5749, 3929, 3929, 3929, 5311, 3929, 5731, 5753, 5459, 3929, 5014, 4985, 3929, 4344, 4461, 3929, 3875, 5420, 3929, 3878, 3929, 3929, 3929, 3736, 4071, 4506, 3929, 3766, 4521, 4967, 3929, 3929, 3929, 5387, 3820, 5761, 4485, 3929, 3929, 5424, 4691, 5113, 3998, 3929, 3929, 5435, 3873, 3929, 5112, 5770, 4234, 5849, 3929, 3929, 3929, 5447, 3929, 5732, 5805, 3929, 3972, 4093, 4097, 3929, 3905, 3929, 4408, 3670, 5786, 3929, 3929, 3929, 5447, 4693, 4517, 5803, 5807, 3929, 5046, 5056, 3929, 4434, 4245, 3929, 3770, 5321, 3929, 3649, 3929, 3929, 4977, 4223, 3929, 5830, 3929, 3929, 5450, 5042, 4423, 5838, 3929, 3929, 5507, 4159, 4423, 5838, 4248, 5847, 4578, 5805, 3929, 4548, 3929, 3929, 5813, 4423, 5854, 3929, 3929, 5552, 5542, 5859, 3929, 3929, 3929, 5564, 3929, 5786, 4235, 3929, 3929, 5566, 4810, 4103, 5807, 3990, 3929, 5059, 5357, 3929, 4549, 3929, 3929, 4549, 5416, 3929, 4674, 3929, 4868, 5532, 3929, 3929, 3929, 5710, 3929, 3831, 3998, 3929, 3929, 5712, 4818, 3973, 5866, 3929, 3929, 5739, 3929, 3972, 5865, 3929, 3929, 5745, 3929, 4964, 3929, 5180, 4523, 5824, 3832, 3929, 3929, 3929, 5777, 5545, 4965, 3929, 4409, 3929, 3675, 3738, 3973, 3547, 3929, 3929, 5841, 3929, 6277, 6502, 5875, 6282, 5878, 6547, 6266, 5881, 6546, 5889, 6232, 5882, 6232, 5892, 6221, 6267, 5888, 5883, 5884, 6232, 6232, 6232, 6232, 6414, 5887, 5883, 6232, 5891, 6232, 6232, 5894, 6232, 6232, 5922, 5937, 5949, 5938, 5939, 5949, 5944, 5950, 5944, 5944, 5940, 5944, 5941, 5952, 5941, 5944, 5946, 5945, 5946, 5946, 5946, 5946, 5947, 5941, 5948, 5952, 5948, 5944, 5942, 5954, 5956, 5958, 5962, 5960, 5959, 5964, 5966, 5967, 5971, 5967, 5968, 5967, 5969, 5974, 5973, 5976, 5978, 6293, 5998, 5875, 6282, 5896, 6871, 6437, 6282, 6321, 6282, 6282, 6282, 5917, 6456, 6456, 6456, 6456, 5991, 5906, 6379, 6455, 5990, 6019, 5991, 5904, 5904, 5904, 6456, 6456, 5926, 5899, 6456, 6456, 5997, 6282, 6408, 6410, 6282, 5932, 6282, 5933, 6464, 6024, 6282, 6282, 6379, 5924, 6282, 6282, 5924, 6282, 6362, 6010, 5984, 6282, 6003, 6282, 6362, 6282, 6282, 6282, 6004, 6456, 5906, 6455, 5990, 5904, 5902, 6456, 6456, 6456, 5906, 6457, 6019, 6019, 5904, 5904, 6456, 6456, 6282, 6282, 6282, 5980, 5917, 6456, 6456, 6456, 6455, 5905, 6456, 6445, 5926, 5926, 5926, 5926, 6032, 6032, 6008, 5932, 6282, 6282, 6282, 6434, 6024, 6282, 6019, 5904, 6456, 6282, 5896, 6873, 6282, 6282, 6282, 6474, 5903, 6457, 6019, 5904, 6456, 6229, 5904, 6456, 6456, 6456, 6018, 6457, 6019, 5991, 5905, 5906, 6282, 6282, 6282, 5984, 6282, 6282, 6282, 5925, 6543, 5905, 6456, 6456, 6456, 6282, 5905, 6229, 5905, 6229, 5905, 6282, 6650, 6437, 6043, 6515, 6056, 6672, 6088, 6052, 6515, 6520, 6054, 6060, 6058, 6515, 6515, 6083, 6528, 6101, 6761, 6518, 6521, 6516, 6517, 6063, 6065, 6068, 6061, 6057, 6515, 6515, 6519, 6515, 6070, 6072, 6066, 6515, 6515, 6515, 6515, 6125, 6522, 6074, 6515, 6515, 6076, 6515, 6523, 6079, 6082, 6515, 6081, 6055, 6091, 6089, 6090, 6093, 6114, 6092, 6113, 6114, 6114, 6114, 6114, 6115, 6117, 6116, 6117, 6117, 6118, 6119, 6120, 6121, 6121, 6095, 6097, 6099, 6122, 6123, 6124, 6524, 5900, 6515, 6518, 6103, 6108, 6110, 6104, 6105, 6109, 6106, 6112, 6121, 6127, 6129, 6282, 5899, 6282, 5925, 6463, 6321, 6282, 6294, 6006, 6378, 6282, 6508, 6282, 6449, 6646, 6218, 6604, 6282, 6524, 6291, 6282, 6774, 6282, 6270, 6282, 6282, 6282, 6000, 6000, 6027, 6161, 6282, 6282, 5895, 6375, 6282, 6312, 6230, 6366, 6265, 5876, 6282, 6282, 6282, 6015, 6406, 6282, 6284, 6027, 6027, 6137, 6282, 6282, 6379, 6281, 6372, 6028, 6159, 6282, 5899, 6282, 6282, 6282, 6573, 6282, 6282, 6467, 6282, 6311, 6312, 6372, 6282, 6282, 6282, 6019, 6019, 5904, 5904, 5904, 5904, 5905, 6456, 6456, 6031, 6154, 6158, 6282, 6149, 6273, 6282, 6163, 6282, 6677, 6280, 6166, 6279, 6682, 6685, 6501, 6173, 6175, 6178, 6178, 6178, 6178, 6176, 6181, 6180, 6181, 6181, 6183, 6181, 6185, 6187, 6188, 6188, 6188, 6194, 6193, 6194, 6193, 6193, 6189, 6191, 6190, 6190, 6196, 6196, 6198, 6203, 6202, 6204, 6208, 6203, 6205, 6199, 6200, 6210, 6206, 6212, 6282, 6282, 5896, 6282, 6282, 6282, 6512, 6282, 6150, 6135, 6320, 6500, 6163, 6282, 6282, 6282, 6026, 6282, 6026, 6166, 6282, 6282, 6282, 6027, 6221, 6282, 6505, 6282, 6282, 6282, 6032, 6238, 6282, 6241, 6282, 5899, 6451, 6282, 5913, 6669, 6401, 6238, 6282, 6282, 6282, 6037, 6245, 6282, 6282, 6282, 6040, 6282, 6282, 6225, 6248, 6282, 6282, 5916, 6722, 6377, 6247, 6249, 6282, 6282, 5924, 6370, 6252, 6253, 6282, 6282, 5932, 6282, 6282, 6530, 5924, 6254, 6282, 6282, 6254, 6282, 6322, 6228, 6282, 5933, 6378, 6282, 6378, 6282, 6452, 6282, 6432, 6317, 6282, 5917, 6086, 6725, 6727, 6216, 6086, 6726, 6450, 6231, 5926, 5933, 6008, 6008, 6008, 6282, 6282, 6282, 5918, 6282, 6282, 6282, 5923, 6309, 6683, 6282, 6282, 6282, 6148, 6216, 6308, 6310, 6282, 6282, 6282, 6149, 6282, 5903, 6397, 6605, 6282, 6282, 5933, 5933, 5933, 6780, 6282, 6282, 6282, 6229, 6282, 6282, 6282, 5933, 5924, 6316, 5917, 6723, 6377, 5916, 6722, 6323, 6448, 6454, 6216, 6332, 6436, 6683, 6282, 5917, 6328, 6465, 6450, 6217, 6231, 6160, 6436, 6683, 6328, 6448, 6454, 6216, 6610, 6436, 6683, 6282, 6221, 6602, 6310, 6282, 5984, 5899, 5925, 6229, 6435, 6500, 6281, 6722, 6013, 6465, 6450, 6160, 6603, 6683, 6282, 6282, 6231, 6218, 6310, 6282, 5984, 6282, 6283, 6043, 5914, 6282, 5933, 6328, 6465, 6450, 6647, 6604, 6282, 6000, 6282, 6282, 6283, 6277, 6707, 6733, 6282, 6722, 6465, 6230, 6396, 6282, 6282, 6282, 6235, 6686, 6282, 6708, 6281, 6282, 6000, 6437, 6362, 6338, 6279, 6282, 6282, 6283, 6444, 6145, 6683, 6282, 6282, 5933, 6003, 6282, 6282, 6282, 6006, 6375, 6465, 6708, 6282, 6005, 6282, 6282, 6287, 6289, 6282, 6548, 6282, 6282, 5933, 6282, 6282, 6282, 6137, 6282, 6282, 6020, 6282, 6375, 6282, 6282, 6282, 6281, 6471, 6218, 6683, 6282, 6282, 6282, 6370, 5984, 6282, 6010, 6795, 5984, 5899, 6282, 6282, 6661, 6282, 6000, 6137, 6282, 6282, 6282, 6282, 5896, 5914, 6704, 6273, 5928, 6340, 6344, 6503, 6348, 6349, 6349, 6350, 6355, 6352, 6349, 6349, 6349, 6349, 6354, 6355, 6355, 6355, 6356, 6357, 6357, 6357, 6357, 6357, 6358, 6359, 6359, 6359, 6359, 6383, 6360, 6382, 6382, 6382, 6361, 6282, 6282, 6282, 6283, 6043, 5903, 5897, 6485, 6376, 6395, 6425, 6282, 6282, 6282, 6293, 6291, 6338, 6282, 6282, 6282, 6284, 6282, 6282, 6345, 6282, 6282, 6291, 6282, 6282, 6282, 6230, 5876, 6282, 6407, 6282, 6282, 6282, 6286, 6282, 6282, 6037, 6411, 6417, 6282, 6282, 5979, 5903, 6470, 6313, 6647, 6281, 6282, 6282, 6408, 6416, 6418, 6282, 6282, 5979, 6525, 6458, 6342, 6422, 6282, 6282, 6282, 6288, 6282, 6664, 6731, 6282, 6012, 6000, 6282, 6012, 6335, 6310, 5985, 6504, 6282, 6282, 6273, 6470, 6372, 6273, 6504, 6385, 6282, 6282, 6412, 6257, 6598, 6600, 6282, 6411, 6413, 6597, 6599, 6599, 6282, 6282, 6282, 6291, 6410, 6282, 6322, 6451, 5926, 5926, 6008, 6008, 6008, 5932, 6236, 6282, 6282, 6282, 6292, 5982, 6282, 6283, 6442, 6050, 6013, 6609, 6259, 6424, 6310, 6282, 5919, 5920, 6282, 6282, 6011, 5916, 6282, 6664, 6282, 6282, 6023, 6437, 6459, 5983, 6013, 6594, 6700, 6437, 6282, 6424, 6437, 6282, 6282, 6235, 6480, 6481, 6282, 6282, 6133, 6282, 6282, 6485, 6376, 6647, 6282, 6016, 6282, 6282, 5933, 6330, 6454, 6217, 6683, 6282, 6282, 6484, 5917, 5929, 6011, 6608, 6259, 6425, 6282, 6486, 5983, 6013, 6594, 6786, 6437, 6282, 6282, 6282, 6294, 6282, 6283, 6484, 5917, 5983, 6013, 6531, 6471, 6282, 6282, 6146, 6683, 6282, 6282, 6155, 6282, 6282, 6385, 6282, 6322, 6282, 6282, 6275, 6493, 5917, 5983, 6324, 6259, 6729, 6282, 6019, 6019, 6019, 5991, 5904, 6277, 5903, 6531, 6011, 6148, 6282, 6282, 6282, 6234, 6531, 6282, 6282, 6282, 6322, 6282, 6133, 6372, 6505, 6282, 6230, 6282, 6282, 6171, 6756, 6531, 6046, 6834, 6437, 6282, 6282, 6285, 6530, 5924, 6282, 6684, 6282, 6149, 6282, 6282, 6282, 6325, 6285, 6530, 6045, 6159, 6024, 6046, 6386, 6282, 6282, 6282, 6372, 6282, 6294, 6282, 6530, 6464, 6386, 6282, 6282, 6215, 6224, 5933, 5924, 6410, 6282, 6040, 6282, 6482, 6282, 6282, 6282, 6531, 6536, 6024, 6282, 6282, 6282, 6370, 5987, 6282, 6535, 6282, 6282, 6227, 6282, 6282, 6282, 6378, 6378, 6378, 6282, 6452, 5994, 6282, 6282, 6282, 6394, 6282, 6282, 6282, 6404, 6539, 6333, 6683, 6282, 6020, 6282, 6282, 6282, 6341, 6282, 6570, 6300, 6569, 6301, 6370, 6545, 6300, 6302, 6303, 6303, 6303, 6303, 6303, 6304, 6551, 6554, 6552, 6561, 6552, 6555, 6563, 6564, 6563, 6563, 6563, 6563, 6564, 6556, 6557, 6557, 6557, 6557, 6558, 6372, 6273, 6282, 6282, 6243, 6282, 6509, 6566, 6282, 6282, 6271, 6213, 6282, 6283, 6568, 6282, 6021, 6041, 6282, 6027, 6282, 6321, 6282, 6006, 6282, 6282, 6027, 6462, 6282, 6282, 6282, 6572, 6282, 6168, 6282, 6575, 6510, 6282, 6029, 6282, 6282, 6282, 6588, 5907, 5909, 5911, 6282, 6036, 6282, 6282, 6388, 6407, 5908, 5910, 6282, 6282, 6272, 6282, 6526, 6282, 5916, 6322, 6282, 6378, 6282, 6020, 6282, 6278, 6282, 6282, 6394, 5924, 6278, 6282, 6283, 6502, 6365, 6282, 6579, 6282, 6282, 6275, 6525, 5914, 5992, 6371, 6048, 6365, 6367, 6369, 6282, 6282, 6277, 6531, 6046, 6275, 6583, 5993, 6047, 6256, 6256, 6366, 6368, 6282, 6282, 6452, 6000, 6282, 6282, 6282, 6408, 6282, 6027, 6282, 6372, 6526, 6282, 5899, 6539, 6664, 6682, 6282, 6282, 6282, 6146, 6282, 6482, 6282, 6006, 6451, 6282, 6282, 6282, 5985, 6458, 6342, 6313, 6136, 6152, 6282, 6037, 6378, 6282, 6282, 6282, 6421, 6584, 6020, 6437, 6683, 6282, 6027, 6321, 6282, 6451, 6646, 6152, 6282, 6282, 6282, 6410, 6282, 6282, 6282, 6375, 6282, 6000, 6526, 6322, 6533, 6682, 6282, 6408, 6282, 6282, 6282, 6505, 6282, 6282, 6278, 6282, 6282, 6282, 6143, 6371, 6472, 6282, 6282, 6282, 6423, 6539, 6437, 6683, 6282, 6040, 6148, 6040, 6149, 6273, 6229, 6682, 6282, 6470, 6282, 6282, 6283, 6282, 6282, 6282, 6524, 6548, 5933, 6282, 5933, 6282, 6434, 6410, 6282, 6282, 6434, 6537, 6282, 6664, 6491, 6866, 5876, 6482, 6491, 6282, 6282, 6283, 6410, 6282, 6427, 6282, 6282, 5980, 6011, 6276, 6037, 6285, 6038, 6590, 6783, 6607, 6612, 6620, 6619, 6620, 6620, 6616, 6620, 6620, 6618, 6622, 6620, 6614, 6613, 6624, 6627, 6626, 6627, 6627, 6628, 6630, 6630, 6634, 6630, 6632, 6631, 6630, 6630, 6630, 6636, 6638, 6638, 6637, 6637, 6640, 6641, 6282, 6132, 6282, 6282, 5895, 5924, 5984, 6282, 6640, 6637, 6640, 6640, 6640, 6640, 6505, 5903, 6644, 6331, 6649, 6282, 6282, 6229, 5879, 6282, 6527, 6653, 6148, 6282, 6137, 5924, 6282, 6282, 6282, 6230, 6281, 6282, 6282, 6306, 6402, 6433, 6346, 6656, 6658, 6549, 6282, 6282, 6283, 6475, 6423, 6282, 6282, 6282, 6437, 6682, 5912, 6668, 6400, 6282, 6157, 6282, 6282, 5896, 6451, 5980, 5917, 6029, 6221, 6281, 6282, 6282, 6524, 6282, 6282, 6282, 5930, 6664, 6282, 6264, 6683, 6694, 6282, 6282, 6282, 6452, 6282, 6282, 6282, 6285, 5897, 6453, 6654, 6282, 6346, 6295, 6282, 6282, 6283, 6582, 6297, 6282, 6681, 6282, 6164, 6024, 6282, 6133, 6451, 6282, 5988, 6281, 6285, 5980, 6458, 6371, 6263, 6647, 6281, 6282, 6676, 6282, 6676, 6514, 5903, 6680, 6465, 6489, 5995, 6282, 6282, 6283, 6496, 6085, 6282, 6513, 6525, 6679, 6688, 6688, 6399, 6713, 6281, 6282, 6286, 6282, 6037, 6282, 6282, 6282, 5899, 6691, 6497, 6724, 6488, 6734, 6282, 6282, 6282, 6498, 6282, 6282, 6282, 6255, 6282, 6283, 6691, 6696, 6724, 6488, 6698, 6331, 6222, 6282, 6282, 6282, 6431, 6296, 6282, 6282, 6282, 6499, 6282, 6282, 5903, 6464, 6231, 6734, 6696, 6134, 6733, 6281, 6693, 6282, 6282, 6434, 6282, 6282, 6282, 6277, 6525, 6531, 6471, 6218, 6231, 6490, 6282, 6282, 6282, 6504, 6548, 6282, 6283, 6278, 6282, 6275, 6710, 6733, 6282, 6169, 6282, 6282, 6509, 6003, 6712, 6282, 6282, 6282, 6508, 5899, 6702, 6490, 6282, 6282, 6283, 6861, 6854, 6033, 6858, 6646, 6218, 6604, 6282, 6282, 6282, 6577, 6286, 6282, 6394, 6282, 6229, 6019, 6019, 6019, 6019, 5904, 6286, 6282, 6137, 6282, 6229, 6282, 6292, 6229, 6282, 6282, 6372, 6505, 6282, 6437, 6683, 6282, 6229, 6146, 6265, 6282, 6283, 6525, 5927, 6539, 6729, 6683, 6282, 6282, 6650, 6282, 6282, 6283, 6863, 6364, 6024, 6282, 6282, 6283, 6869, 6282, 6362, 6282, 6362, 6363, 6010, 6592, 5925, 6719, 6591, 6593, 6718, 6721, 5934, 5934, 5935, 6469, 6736, 5934, 5934, 5934, 6736, 6738, 6742, 6740, 6739, 6744, 6746, 6751, 6751, 6752, 6753, 6747, 6748, 6748, 6748, 6749, 6751, 6751, 6751, 6753, 6753, 6753, 6753, 6758, 6754, 6755, 6282, 6282, 6285, 6282, 6282, 6282, 6014, 6760, 5981, 6007, 6728, 6282, 6763, 6282, 6282, 6285, 6496, 6531, 6282, 6283, 6768, 6770, 6282, 6282, 6282, 6539, 6392, 6282, 6282, 6392, 6027, 6156, 6282, 6282, 6293, 6586, 6282, 6373, 6281, 6285, 6507, 5903, 6470, 6326, 6505, 6659, 6282, 6234, 6229, 5879, 6283, 6496, 6703, 6776, 6704, 6777, 6282, 6282, 6282, 6548, 6282, 5918, 6025, 6282, 6282, 6026, 6282, 6286, 6505, 6394, 6282, 6291, 6370, 6282, 6370, 6282, 6496, 6085, 6831, 6147, 6603, 6683, 6282, 6380, 6282, 6282, 6370, 6282, 6282, 6282, 6003, 6282, 6294, 6336, 6000, 6282, 6239, 6846, 6282, 6260, 6282, 6282, 6282, 6642, 6379, 6282, 6505, 6336, 6283, 6702, 6782, 6319, 6218, 6604, 6282, 6785, 5999, 6282, 6269, 6663, 6282, 6140, 6282, 6282, 6393, 6282, 5982, 6724, 6319, 6218, 6604, 6539, 6310, 6282, 6282, 6375, 6370, 6375, 6788, 6320, 6310, 6000, 6000, 6282, 6282, 6375, 6548, 6282, 6282, 6282, 6275, 6084, 6447, 6282, 6788, 6429, 6683, 6282, 6282, 6664, 6683, 6282, 6273, 6541, 6148, 6282, 6394, 6000, 6282, 6274, 6282, 6003, 6318, 6429, 6683, 6282, 6275, 5898, 5915, 6282, 6282, 6370, 6370, 6370, 6664, 6282, 6683, 6282, 6410, 6282, 6699, 6282, 6275, 5901, 5982, 6724, 6291, 6282, 6282, 6531, 6689, 6282, 6282, 6220, 6282, 6537, 6282, 6282, 6282, 6664, 6146, 6282, 6282, 6434, 6281, 6282, 6282, 6282, 6020, 6282, 6006, 6410, 6408, 6282, 6027, 6282, 6282, 6250, 6843, 6434, 6410, 6282, 6434, 6410, 6282, 6408, 6282, 6322, 6282, 6410, 6410, 6027, 6282, 6275, 6702, 6231, 6490, 6146, 6282, 6146, 6282, 6282, 6282, 6671, 6146, 6410, 6408, 6408, 6409, 6409, 6409, 6409, 6409, 6282, 6282, 6282, 6682, 6282, 6282, 6285, 6039, 6216, 6221, 6281, 6286, 6282, 6282, 6790, 6543, 6282, 6505, 6003, 6282, 6559, 6282, 6282, 6559, 6508, 6792, 6282, 6077, 6139, 6282, 6282, 6379, 6374, 6793, 6806, 6798, 6798, 6801, 6799, 6798, 6799, 6798, 6797, 6803, 6808, 6807, 6808, 6805, 6808, 6809, 6810, 6813, 6814, 6815, 6816, 6815, 6818, 6811, 6813, 6811, 6813, 6820, 6822, 6822, 6821, 6821, 6824, 6824, 6824, 6824, 6821, 6824, 6824, 6828, 6825, 6826, 6282, 6282, 6282, 6683, 6282, 6282, 6689, 6439, 6282, 6277, 6715, 6282, 6282, 6282, 6510, 6035, 6282, 6282, 6282, 6684, 6282, 6282, 6282, 6233, 6282, 6716, 6282, 6580, 6419, 6282, 6836, 6282, 6281, 6282, 6282, 6283, 6293, 6337, 6282, 6838, 6840, 6282, 6282, 6666, 6282, 6143, 6292, 6282, 6282, 6292, 6282, 6282, 6282, 6378, 6845, 6282, 6282, 6845, 6282, 6487, 6282, 6282, 6391, 6391, 6651, 6282, 6282, 6282, 6730, 6512, 6282, 6282, 6282, 6830, 6853, 5931, 6141, 6428, 6602, 6604, 6282, 6282, 6409, 6410, 6282, 6852, 6854, 6856, 6450, 6002, 6282, 6001, 6003, 6282, 6645, 6231, 6281, 6282, 6282, 6674, 6282, 6167, 6282, 6282, 6000, 6282, 6000, 6034, 6282, 6282, 6282, 6848, 6282, 6394, 6683, 6282, 6282, 5933, 6003, 5933, 6003, 6282, 6830, 6645, 6231, 6222, 6487, 6282, 6024, 6282, 6282, 6693, 6282, 6282, 6282, 6464, 6861, 6854, 6009, 6377, 6525, 5931, 6011, 6465, 6282, 6830, 5885, 6282, 6282, 6702, 5931, 6319, 6436, 6683, 5916, 6282, 6282, 5925, 6282, 6282, 6448, 6282, 6282, 6931, 6282, 6282, 6451, 6282, 6282, 6282, 6860, 6044, 6011, 6465, 6449, 6647, 6310, 6282, 6282, 6142, 6436, 6683, 6282, 6282, 6732, 5924, 5984, 6861, 5983, 6377, 6454, 5982, 6321, 6282, 6294, 6138, 6282, 6461, 6151, 6437, 6282, 6282, 6732, 6772, 6860, 5983, 6465, 6151, 6437, 6282, 6865, 6282, 6282, 6282, 6860, 6337, 6437, 6282, 6282, 6466, 6282, 6144, 6436, 6282, 6282, 6282, 6868, 6219, 6282, 6282, 6282, 6468, 6282, 6282, 6732, 6282, 5916, 6262, 6299, 6282, 5918, 5918, 5918, 6378, 6282, 6282, 6526, 6282, 6148, 6282, 6283, 6293, 6586, 6292, 6502, 6437, 6282, 6282, 6282, 6294, 6282, 6292, 6294, 6282, 6282, 6474, 5980, 6293, 6291, 6282, 6282, 6292, 6502, 6282, 6278, 6294, 6282, 6278, 6282, 6282, 6765, 6282, 6229, 6362, 6282, 6230, 6320, 6500, 6282, 6505, 6282, 6292, 6502, 6282, 6505, 6233, 6282, 6282, 6293, 6282, 6282, 6282, 6474, 6478, 6291, 6278, 6282, 6282, 6292, 6531, 6536, 6875, 6255, 6282, 6282, 6476, 6282, 6006, 6255, 6282, 6006, 6390, 6282, 6314, 6049, 6282, 6877, 6878, 6881, 6375, 6880, 5930, 6282, 6532, 6542, 6883, 6596, 6258, 6885, 6596, 6595, 6595, 6886, 6889, 6595, 6888, 6890, 6889, 6892, 6897, 6893, 6894, 6895, 6899, 6900, 6905, 6905, 6901, 6902, 6912, 6903, 6902, 6906, 6905, 6906, 6905, 6906, 6907, 6909, 6908, 6910, 6914, 6908, 6908, 6922, 6922, 6921, 6922, 6923, 6916, 6917, 6918, 6920, 6926, 6925, 6928, 6460, 6371, 6282, 6282, 6482, 5932, 6321, 6285, 6282, 6282, 6494, 6371, 6930, 6282, 6282, 6282, 6505, 6494, 6371, 6130, 6282, 6282, 6282, 6505, 6506, 6282, 6282, 6282, 6312, 6933, 6282, 6505, 6935, 6282, 6282, 6937, 6282, 6282, 6767, 6769, 6290, 6282, 6282, 6282, 6505, 6692, 6011, 6313, 6291, 6233, 6282, 6282, 6508, 6282, 6282, 6282, 5916, 6030, 6282, 6423, 6170, 6282, 6282, 6170, 6011, 6372, 6282, 5916, 6282, 6282, 5915, 6451, 6440, 6282, 6282, 5918, 6322, 6283, 6939, 6446, 6705, 6447, 6291, 6282, 6282, 6294, 6282, 6282, 6282, 6438, 6282, 6282, 6511, 6282, 6282, 6282, 6842, 6149, 6282, 6149, 6282, 6282, 6779, 6007, 6728, 6310, 6282, 6282, 6319, 6310, 6282, 6282, 6363, 6282, 6692, 6011, 6372, 5916, 6282, 5915, 6282, 6282, 6511, 6268, 6286, 6282, 5924, 6282, 6282, 6833, 6282, 6279, 6398, 6282, 6282, 6014, 6282, 6282, 6282, 6601, 6282, 6439, 5933, 6133, 6282, 6148, 6282, 6255, 6282, 5914, 5931, 6705, 6282, 6282, 6850, 6282, 6850, 6282, 6372, 6282, 6372, 6282, 6149, 6282, 6505, 5914, 5931, 6291, 6282, 6282, 5982, 6585, 6282, 6282, 6660, 6291, 6043, 5914, 6291, 6282, 6282, 6283, 6043, 5899, 6282, 6282, 1048576, 1073741824, 0x80000000, 1075838976, 2097152, 0x80000000, 4194560, 4196352, -2143289344, -2143289344, 4194304, 0x80000000, 37748736, 541065216, 541065216, -2143289344, 4198144, 4196352, 276901888, 8540160, 4194304, 1, 4, 16, 64, 0, 48, 64, 32, 64, 64, 96, 0, 59, 140224, 5505024, -1887436800, 0, 63, 64, 128, 0, 64, 256, 0, 110, 110, 8425488, 4194304, 1024, 0, 128, 128, 512, 512, 1024, 1024, 2048, 0, 256, 256, 257, 37748736, 742391808, 742391808, 775946240, -1371537408, 775946240, 4718592, 775946240, 775946240, 171966464, 171966464, 775946240, 239075328, -1405091840, -1371537408, 239075328, 171966464, 64, 4718592, 2097216, 4720640, 541589504, 4194368, 4194368, 541065280, 541589504, 4194400, -2143289280, 4194368, -2143285440, -2143285408, -2143285408, -2109730976, 775946336, 776470528, -2143285408, 776470528, 775946304, 775946304, -1908404384, 775946304, -1908404384, 2, 8, 32, 128, 1024, 4096, 0, 260, 8392704, 0, 1856, 64, 524288, 64, 896, 8192, 67108864, 0x80000000, 96, 262144, 262144, 8192, 0, 288, 8388608, 0, 384, 0, 512, 2048, 2048, 4096, 4096, 8192, 8192, 16384, 0, 520, 520, 96, 524288, 524288, 0, 2432, 2048, 268435456, 0, 24576, 0, 32768, 32768, 65536, 1048576, 128, 2048, 12288, 0, 12289, 0, 16384, 16384, 32768, 0, 1864, 2, 16, 1024, 98304, 131072, 262144, 1048576, 512, 5120, 2, 536936448, 80, 528, 528, 2097168, 2097168, 268435472, 524304, 1048592, 2097168, 24, 560, 48, 2097680, 1048592, 3145744, 1048592, 20, 560, 48, 3146256, 2097552, 3146256, 28, 16, 8192, 2, 2098064, 163577856, 17, 21, 112, 128, 3584, 8192, 2228784, -161430188, -161430188, -161429680, -161430188, -161429676, -161430188, -161298576, -160299088, -161298576, -161298572, -160774288, -160299084, 146804757, 146812949, 146862101, 146863389, 146863389, 148960541, -161429740, -161429676, 146863421, 148960541, 146863389, -161429676, -160905388, -161429676, -161429676, -161429675, -161349072, -161349072, -161347728, -161347728, -161298572, -161298572, -160774284, -161298572, 16, 262160, -18860267, -160774284, -18729163, 0, 58368, 159383552, 0, 65536, 2097152, 8388608, 33554432, 0, 66048, 0, 77824, 524288, 33554432, 1024, 262144, 2097152, 16777216, 67108864, 0, 131072, 524288, 134217728, 0x80000000, 1, 32768, 196608, 0, 131328, 131072, 16777216, 100663296, -1073741824, 164096, 0, 131584, 2621440, 0, 139264, 0, 150528, 0, 235712, 16777216, 1073774592, 1226014816, 100665360, -2046818288, 100665360, 100665360, -2044196848, 1091799136, 1091799136, 1091803360, 1091799136, 1158908000, 1158908001, 1192462432, 1192462448, 1192462448, 1870638912, 1870655296, 1870638912, 1200851056, 1200851056, 1091799393, 1870655296, 1870655296, 1870655312, 1870655316, 1870655312, 1870655312, 1870638928, 1870655316, 1870655316, 1870655317, 1870655316, 1879043952, 1870655348, 1870655316, 1879027568, 1879043952, 1879043956, 0, 284672, 229440, 1048576, 2097152, 67108864, 134217728, 8, 4194304, 16777216, 0x80000000, 1224736768, 0, 503616, 2048, 100663296, 0, 524288, 2097152, 4194304, 4194304, 0, 40, 0, 44, -2046820352, 0, 605503, 231488, 1090519040, 1157627904, 1191182336, 9437184, 231744, 520000, 7864320, 1862270976, 0, 867391, 1862270976, 1862270976, 16252928, 0, 1048576, 4194304, 25165824, 25165824, 33554432, 8192, 98304, 1048576, 8388608, 134217728, 268435456, 4194432, 3145728, 0, 24, 0, 29, 0, 32, 1, 2, 2, 4, 0, 0x80000000, 0x80000000, 0, 0, 1, 0, 2, 0, 3, 240, 19456, 262144, 0, 4, 8, 0, 6, 0, 7, 150994944, 0, 1049088, 1049088, 12845065, 12845065, 147193865, 128, 6144, 4194304, 251658240, 536870912, 1073741824, 32768, 131072, 1048576, 4096, 83886080, 117440512, 0, 3145728, 16777216, 134217728, 0, 2048, 8192, 229376, 0, 2304, 1536, 8192, 1536, 65536, 4194304, 67108864, 536870912, 9216, 33554432, 262144, 134217728, 1073741824, 50331649, 9476, 512, 8192, 134218240, 1050624, 0, 5242880, 1275208192, 4194312, 4194312, 4194344, 4194312, 541065224, 4203820, -869654016, -869654016, 1279402504, 1279402504, 2143549415, 2143549415, 2143549423, 0, 8388608, 4096, 4194304, 8388608, 16777216, 33554432, -1946157056, 0, 8192, 131072, 0, 1792, 0, 1024, 8192, 65536, 0, 1536, 0x80000000, 2143549423, 2143549423, 2143549415, 1, 16777216, 268435456, 512, 139264, 2760704, -872415232, 0, 19947520, 0, 33554432, 67108864, 1073741824, 1073741824, 262144, 7340032, -2030043136, 0, 331776, 300, 4203520, 4333568, 1275068416, 0, 16777216, 16777216, 0, 999, 259072, 4194304, 4194432, 999, 29619200, 2113929216, 0, 58720256, 1007, 1007, 0, 67108864, 402653184, 536870912, 2048, 1048576, 16777216, 536870912, 300, 0, 83886080, 0, 2097152, 134217728, 536870912, 0, 49152, 0, 57344, 102, 384, 6, 96, 128, 3072, 16384, 65536, 524288, 1048576, 0, 4096, 262144, 524288, 96, 96, 64, 384, 512, 4096, 65536, 131072, 1024, 65536, 262144, 131072, 32768, 256, 384, 8192, 33554432, 0x80000000, 1, 6, 8, 8388608, 96, 384, 104, 104, 0, 134217728, 6, 32, 256, 512, 65536, 7340032, 50331648, 0, 8396800, 4, 32, 384, 4, 64, 1024, 2097152, 268435456, 1073741824, 8, 262144, 512, 0, 8, 8, 16, 0, 9, 0, 12, 0, 15, 16, 16, 17, 20, 16, 20, 48, 16, 28, 0, 16, 32, 0, 21, 53, 4, 256, 1024, 524288, 536870912, 256, 65536, 16777216, 1073741824, 2048, 524288, 32, 4100, 1024, 134217728, 1049088, 270532608, 2097152, 2097152, 0, 23, 5505537, 5587457, 5591557, 147202057, 5587457, 13894153, -1881791493, -1881791493, 0, 134218752, 5587465, 5587457, 13894153, 13894153, 81003049, 4456448, 8388608, 5505024, 0, 134348800, 134348800, 82432, 0, 142606336, 5, 86528, 41, 75497472, 81920, 0, 184549376, 2, 56, 64, 2048, 262144, 536870912, 2048, 134217728, -2113929216, 16777216, 1073743872, 268435968, 229376, 25165824, 92274688, 25165824, 100663296, 402653184, 1610612736, 0, 100663296, 134217728, 805306368, 1073741824, 8388608, 268567040, 16384, 229376, 4194304, 117440512, 2113544, 68423701, -2079059883, -2079059947, 85200917, 68423701, 68423765, 68489237, 68423701, 68423701, 72618005, 68423701, 68425749, 68423703, 85200919, 69488664, 69488664, 70537244, 70537245, 70537245, -2076946339, -2076946403, 70537245, 70537309, 70539293, -2022351745, -2022351617, -2022351745, -2022351617, -2022351617, 0, 243269632, 256, 32768, 1048576, 33554432, 134217728, -2113929216, 0, 268435456, 49152, 266240, 1048576, 67108864, -2080374784, -2080374784, 268288, 0, 301989888, 0, 318767104, 282624, 0, 536870912, 28, 3145728, 192, 351232, 7340032, 5, 16, 1049104, 12, 3145728, 13, 0, 1073741825, 192, 3072, 20480, 0, 1073741824, 0, 262144, 2621440, -1073741824, 20480, 65536, 268435456, 14, 32, 512, 131072, 268435456, 192, 1024, 64, 32768, 33554432, 268435456, 4, 128, 3840, 16384, 262144, 128, 2097152, 1073741824, 4, 2097152, 4, 50331648, 67108864, 128, 50331648, 1073741824, 128, 268435968, 268435968, 268436032, 256, 1536, 2048, 16384, 98304, 393216, 524288, 268435456, 536870912, 9216, 0, 4194304, 50331648, 0x80000000, 256, 536871168, -1879046336, -1879046334, -1879046326, -1879046334, 1073744256, -1879046334, -1879046326, -1845491902, -1878784182, 268444480, 268436288, 268436288, 268436289, 268444480, 268444480, 2100318149, 2100318149, 2100326341, 0, 1090519040, 2100326341, 2100326341, 1, 16, 536936448, 576, 0, 832, 8192, 1, 4036, 19939328, 2080374784, 0, 1, 1024, 768, 8192, 16384, 19922944, 2080374784, 1, 128, 4096, 3584, 16384, 524288, 8, 33554432, 402653184, 2048, 3145728, 128, 131072, 268500992, 4243456, 4096, 1048588, 0, 1258292224, 1124073472, 1124073472, 1124073488, 1124073474, 1124073472, 1392574464, 1124073472, 1073754113, 12289, 1124073472, 12289, 12289, 1098920193, 1132474625, 1098920209, 1132474625, 1132474625, 1124085761, 1124085761, 1124085777, 1258304513, 1124085761, 1400975617, 2132360255, 2132622399, 2132360255, 2132622399, 2132622399, 2141011263, 0, 2140749119, 2141011263, 2, 16384, 3145728, 12545, 25165824, 268435456, 12305, 13313, 12561, 0, 78081, 327155712, 605247, 1058013184, 1073741824, 867647, 1066401792, 0, 1, 12288, 256, 8388608, 1, 30, 32, 1024, 2048, 339968, 327680, 524288, 1, 14, 16, 14, 1024, 16384, 4194304, 134217728, 1, 12, 1024, 8, 134217728, 8, 536870912, 9437184, 0, 68157440, 137363456, 0, 137363456, 66, 66, 100680704, 25165824, 26214400, 92274688, 25165952, 93323264, 92274688, 92274688, 92274720, 93323264, 25165890, 100721928, 100721928, 100787464, 100721664, 100721664, 100853000, 100721928, 125977600, 125846528, 125846528, 125846560, 125977600, 125977600, 127026176, 281843, 281843, 1330419, 281843, 126895104, 125846528, 1330419, 1330419, 72633587, 5524723, 72633587, 92556531, 93605107, 93605107, 5524723, 5524723, 39079155, 97799411, 127290611, 127290611, 131484915, 0, 17408, 33554432, 1073741824, 58624, 0, 124160, 189696, 148480, 50331648, 2, 112\n];\n\nXQueryParser.TOKEN =\n[\n  \"(0)\",\n  \"PragmaContents\",\n  \"DirCommentContents\",\n  \"DirPIContents\",\n  \"CDataSection\",\n  \"Wildcard\",\n  \"EQName\",\n  \"URILiteral\",\n  \"IntegerLiteral\",\n  \"DecimalLiteral\",\n  \"DoubleLiteral\",\n  \"StringLiteral\",\n  \"PredefinedEntityRef\",\n  \"'\\\"\\\"'\",\n  \"EscapeApos\",\n  \"ElementContentChar\",\n  \"QuotAttrContentChar\",\n  \"AposAttrContentChar\",\n  \"PITarget\",\n  \"NCName\",\n  \"QName\",\n  \"S\",\n  \"S\",\n  \"CharRef\",\n  \"CommentContents\",\n  \"EOF\",\n  \"'!'\",\n  \"'!='\",\n  \"'\\\"'\",\n  \"'#'\",\n  \"'#)'\",\n  \"'$'\",\n  \"'%'\",\n  \"''''\",\n  \"'('\",\n  \"'(#'\",\n  \"'(:'\",\n  \"')'\",\n  \"'*'\",\n  \"'*'\",\n  \"'+'\",\n  \"','\",\n  \"'-'\",\n  \"'-->'\",\n  \"'.'\",\n  \"'..'\",\n  \"'/'\",\n  \"'//'\",\n  \"'/>'\",\n  \"':'\",\n  \"':)'\",\n  \"'::'\",\n  \"':='\",\n  \"';'\",\n  \"'<'\",\n  \"'<!--'\",\n  \"'</'\",\n  \"'<<'\",\n  \"'<='\",\n  \"'<?'\",\n  \"'='\",\n  \"'>'\",\n  \"'>='\",\n  \"'>>'\",\n  \"'?'\",\n  \"'?>'\",\n  \"'@'\",\n  \"'NaN'\",\n  \"'['\",\n  \"']'\",\n  \"'after'\",\n  \"'all'\",\n  \"'allowing'\",\n  \"'ancestor'\",\n  \"'ancestor-or-self'\",\n  \"'and'\",\n  \"'any'\",\n  \"'append'\",\n  \"'array'\",\n  \"'as'\",\n  \"'ascending'\",\n  \"'at'\",\n  \"'attribute'\",\n  \"'base-uri'\",\n  \"'before'\",\n  \"'boundary-space'\",\n  \"'break'\",\n  \"'by'\",\n  \"'case'\",\n  \"'cast'\",\n  \"'castable'\",\n  \"'catch'\",\n  \"'check'\",\n  \"'child'\",\n  \"'collation'\",\n  \"'collection'\",\n  \"'comment'\",\n  \"'constraint'\",\n  \"'construction'\",\n  \"'contains'\",\n  \"'content'\",\n  \"'context'\",\n  \"'continue'\",\n  \"'copy'\",\n  \"'copy-namespaces'\",\n  \"'count'\",\n  \"'decimal-format'\",\n  \"'decimal-separator'\",\n  \"'declare'\",\n  \"'default'\",\n  \"'delete'\",\n  \"'descendant'\",\n  \"'descendant-or-self'\",\n  \"'descending'\",\n  \"'diacritics'\",\n  \"'different'\",\n  \"'digit'\",\n  \"'distance'\",\n  \"'div'\",\n  \"'document'\",\n  \"'document-node'\",\n  \"'element'\",\n  \"'else'\",\n  \"'empty'\",\n  \"'empty-sequence'\",\n  \"'encoding'\",\n  \"'end'\",\n  \"'entire'\",\n  \"'eq'\",\n  \"'every'\",\n  \"'exactly'\",\n  \"'except'\",\n  \"'exit'\",\n  \"'external'\",\n  \"'first'\",\n  \"'following'\",\n  \"'following-sibling'\",\n  \"'for'\",\n  \"'foreach'\",\n  \"'foreign'\",\n  \"'from'\",\n  \"'ft-option'\",\n  \"'ftand'\",\n  \"'ftnot'\",\n  \"'ftor'\",\n  \"'function'\",\n  \"'ge'\",\n  \"'greatest'\",\n  \"'group'\",\n  \"'grouping-separator'\",\n  \"'gt'\",\n  \"'idiv'\",\n  \"'if'\",\n  \"'import'\",\n  \"'in'\",\n  \"'index'\",\n  \"'infinity'\",\n  \"'inherit'\",\n  \"'insensitive'\",\n  \"'insert'\",\n  \"'instance'\",\n  \"'integrity'\",\n  \"'intersect'\",\n  \"'into'\",\n  \"'is'\",\n  \"'item'\",\n  \"'json'\",\n  \"'json-item'\",\n  \"'key'\",\n  \"'language'\",\n  \"'last'\",\n  \"'lax'\",\n  \"'le'\",\n  \"'least'\",\n  \"'let'\",\n  \"'levels'\",\n  \"'loop'\",\n  \"'lowercase'\",\n  \"'lt'\",\n  \"'minus-sign'\",\n  \"'mod'\",\n  \"'modify'\",\n  \"'module'\",\n  \"'most'\",\n  \"'namespace'\",\n  \"'namespace-node'\",\n  \"'ne'\",\n  \"'next'\",\n  \"'no'\",\n  \"'no-inherit'\",\n  \"'no-preserve'\",\n  \"'node'\",\n  \"'nodes'\",\n  \"'not'\",\n  \"'object'\",\n  \"'occurs'\",\n  \"'of'\",\n  \"'on'\",\n  \"'only'\",\n  \"'option'\",\n  \"'or'\",\n  \"'order'\",\n  \"'ordered'\",\n  \"'ordering'\",\n  \"'paragraph'\",\n  \"'paragraphs'\",\n  \"'parent'\",\n  \"'pattern-separator'\",\n  \"'per-mille'\",\n  \"'percent'\",\n  \"'phrase'\",\n  \"'position'\",\n  \"'preceding'\",\n  \"'preceding-sibling'\",\n  \"'preserve'\",\n  \"'previous'\",\n  \"'processing-instruction'\",\n  \"'relationship'\",\n  \"'rename'\",\n  \"'replace'\",\n  \"'return'\",\n  \"'returning'\",\n  \"'revalidation'\",\n  \"'same'\",\n  \"'satisfies'\",\n  \"'schema'\",\n  \"'schema-attribute'\",\n  \"'schema-element'\",\n  \"'score'\",\n  \"'self'\",\n  \"'sensitive'\",\n  \"'sentence'\",\n  \"'sentences'\",\n  \"'skip'\",\n  \"'sliding'\",\n  \"'some'\",\n  \"'stable'\",\n  \"'start'\",\n  \"'stemming'\",\n  \"'stop'\",\n  \"'strict'\",\n  \"'strip'\",\n  \"'structured-item'\",\n  \"'switch'\",\n  \"'text'\",\n  \"'then'\",\n  \"'thesaurus'\",\n  \"'times'\",\n  \"'to'\",\n  \"'treat'\",\n  \"'try'\",\n  \"'tumbling'\",\n  \"'type'\",\n  \"'typeswitch'\",\n  \"'union'\",\n  \"'unique'\",\n  \"'unordered'\",\n  \"'updating'\",\n  \"'uppercase'\",\n  \"'using'\",\n  \"'validate'\",\n  \"'value'\",\n  \"'variable'\",\n  \"'version'\",\n  \"'weight'\",\n  \"'when'\",\n  \"'where'\",\n  \"'while'\",\n  \"'wildcards'\",\n  \"'window'\",\n  \"'with'\",\n  \"'without'\",\n  \"'word'\",\n  \"'words'\",\n  \"'xquery'\",\n  \"'zero-digit'\",\n  \"'{'\",\n  \"'{{'\",\n  \"'{|'\",\n  \"'|'\",\n  \"'||'\",\n  \"'|}'\",\n  \"'}'\",\n  \"'}}'\"\n];\n\n},\n{}],\n11:[function(require,module,exports){\n'use strict';\n\nexports.TreeOps = {\n    flatten: function(node){\n        var that = this;\n        var value = '';\n        if(!node) {\n            throw new Error('Invalid node found');\n        } else if (node.value === undefined) {\n            node.children.forEach(function(child){\n                value += that.flatten(child);\n            });\n        } else {\n            value += node.value;\n        }\n        return value;\n    },\n    \n    concat: function(obj1, obj2, copy){\n        var result = copy ? {} : obj1;\n        if(copy){\n            Object.keys(obj1).forEach(function(key){\n                result[key] = obj1[key];\n            });\n        }\n        var keys = Object.keys(obj2);\n        keys.forEach(function(key){\n            result[key] = obj2[key];\n        });\n        return result;\n    },\n    \n    removeParentPtr: function(ast){\n        if(ast.getParent !== undefined) {\n            delete ast.getParent;\n        }\n        for(var i in ast.children) {\n            var child = ast.children[i];\n            this.removeParentPtr(child);\n        }\n    },\n    \n    inRange: function(p, pos, exclusive){\n        if(p && p.sl <= pos.line && pos.line <= p.el) {\n            if(p.sl < pos.line && pos.line < p.el) {\n                return true;\n            } else if(p.sl === pos.line && pos.line < p.el) {\n                return p.sc <= pos.col;\n            } else if(p.sl === pos.line && p.el === pos.line) {\n                return p.sc <= pos.col && pos.col <= p.ec + (exclusive ? 1 : 0);\n            } else if(p.sl < pos.line && p.el === pos.line) {\n                return pos.col <= p.ec + (exclusive ? 1 : 0);\n            }\n        }\n    },\n    \n    findNode: function(ast, pos) {\n        if(!ast) {\n            return;\n        }\n        var p = ast.pos;\n        if(this.inRange(p, pos) === true) {\n            for(var i in ast.children) {\n                var child = ast.children[i];\n                var n = this.findNode(child, pos);\n                if(n !== undefined) {\n                    return n;\n                }\n            }\n            return ast;\n        } else {\n            return;\n        }\n    },\n    \n    astAsXML: function(node, indent){\n        var result =  '';\n        indent = indent ? indent : '';\n        if(node.value) {\n            result += (indent + '<' + node.name + '>' + node.value + '</' + node.name + '>\\n');\n        }\n        result += indent + '<' + node.name + '>\\n';\n        var that = this;\n        node.children.forEach(function(child){\n            result += that.astAsXML(child, indent + '  ');\n        });\n        result += indent + '</' + node.name + '>\\n';\n        return result;\n    }\n};\n},\n{}],\n12:[function(require,module,exports){\n'use strict';\n\nvar JSONiqParser = require('./parsers/JSONiqParser').JSONiqParser;\nvar XQueryParser = require('./parsers/XQueryParser').XQueryParser;\nvar JSONParseTreeHandler = require('./parsers/JSONParseTreeHandler').JSONParseTreeHandler;\nvar Translator = require('./compiler/translator').Translator;\nvar StyleChecker = require('./formatter/style_checker').StyleChecker;\nvar completer = require('../lib/completion/completer');\n    \nvar createStaticContext = exports.createStaticContext = function(){\n    var StaticContext = require('./compiler/static_context').StaticContext;\n    return new StaticContext();\n};\n\nvar defaults = function(current, def){\n    if(!current) {\n        return def;\n    }\n    Object.keys(def).forEach(function(key){\n        if(current[key] === undefined){\n            current[key] = def[key];\n        }\n    });\n    return current;\n};\n\nvar convertPosition = function (code, begin, end) {\n    var before = code.substring(0, begin);\n    var after = code.substring(0, end);\n    var startline = before.split('\\n').length;\n    var startcolumn = begin - before.lastIndexOf('\\n');\n    var endline = after.split('\\n').length;\n    var endcolumn = end - after.lastIndexOf('\\n');\n    var pos = {\n        sl: startline - 1,\n        sc: startcolumn - 1,\n        el: endline - 1,\n        ec: endcolumn - 1\n    };\n    return pos;\n};\n\nexports.XQLint = function (source, opts) {\n\n    opts = opts ? opts : {};\n    opts = defaults(opts, { styleCheck: false });\n\n    var ast;\n    this.getAST = function () {\n        return ast;\n    };\n\n    var markers = [];\n    this.getMarkers = function () {\n        return markers;\n    };\n    \n    this.getMarkers = function(type){\n        var m = [];\n        markers.forEach(function(marker){\n            if(marker.type === type || type === undefined){\n                m.push(marker);\n            }\n        });\n        return m;\n    };\n\n    this.getErrors = function(){\n        return this.getMarkers('error');\n    };\n\n    this.getWarnings = function(){\n        return this.getMarkers('warning');\n    };\n    \n    this.getCompletions = function(pos){\n        return completer.complete(source, ast, sctx, pos);\n    };\n\n    var syntaxError = false;\n    this.hasSyntaxError = function () {\n        return syntaxError;\n    };\n\n    var sctx = opts.staticContext ? opts.staticContext : createStaticContext();\n    var file = opts.fileName ? opts.fileName : '';\n    var isJSONiq = ((file.substring(file.length - '.jq'.length).indexOf('.jq') !== -1) && source.indexOf('xquery version') !== 0) || source.indexOf('jsoniq version') === 0;\n    var h = new JSONParseTreeHandler(source);\n    var parser = isJSONiq ? new JSONiqParser(source, h) : new XQueryParser(source, h);\n    try {\n        parser.parse_XQuery();\n    } catch (e) {\n        if (e instanceof parser.ParseException) {\n            syntaxError = true;\n            h.closeParseTree();\n            var pos = convertPosition(source, e.getBegin(), e.getEnd());\n            var message = parser.getErrorMessage(e);\n            if (pos.sc === pos.ec) {\n                pos.ec++;\n            }\n            markers.push({\n                pos: pos,\n                type: 'error',\n                level: 'error',\n                message: message\n            });\n        } else {\n            throw e;\n        }\n    }\n    ast = h.getParseTree();\n    if(opts.styleCheck) {\n        markers = markers.concat(new StyleChecker(ast, source).getMarkers());\n    }\n    var translator = new Translator(sctx, ast);\n    markers = markers.concat(translator.getMarkers());\n};\n\n},\n{\"../lib/completion/completer\":6,\"./compiler/static_context\":4,\"./compiler/translator\":5,\"./formatter/style_checker\":7,\"./parsers/JSONParseTreeHandler\":8,\"./parsers/JSONiqParser\":9,\"./parsers/XQueryParser\":10}]},{},[12])(12)\n\n});\n\nace.define(\"ace/mode/xquery_worker\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/worker/mirror\",\"ace/mode/xquery/xqlint\"], function(require, exports, module) {\n\"use strict\";\n    \nvar oop = require(\"../lib/oop\");\nvar Mirror = require(\"../worker/mirror\").Mirror;\nvar XQLintLib = require(\"./xquery/xqlint\");\nvar XQLint =  XQLintLib.XQLint;\n\nvar getModuleResolverFromModules = function(modules){\n    return function(uri){\n            var index = modules;\n            var mod = index[uri];\n            var variables = {};\n            var functions = {};\n            mod.functions.forEach(function(fn){\n                functions[uri + '#' + fn.name + '#' + fn.arity] = {\n                    params: []\n                };\n                fn.parameters.forEach(function(param){\n                    functions[uri + '#' + fn.name + '#' + fn.arity].params.push('$' + param.name);\n                });\n            });\n            mod.variables.forEach(function(variable){\n                var name = variable.name.substring(variable.name.indexOf(':') + 1);\n                variables[uri + '#' + name] = { type: 'VarDecl', annotations: [] };\n            });\n            return {\n                variables: variables,\n                functions: functions\n            };\n    };\n};\n\nvar XQueryWorker = exports.XQueryWorker = function(sender) {\n    Mirror.call(this, sender);\n    this.setTimeout(200);\n    this.opts = {\n        styleCheck: false\n    };\n    var that = this;\n\n    this.sender.on(\"complete\", function(e){\n        if(that.xqlint) {\n            var pos = { line: e.data.pos.row, col: e.data.pos.column };\n            var proposals = that.xqlint.getCompletions(pos);\n            that.sender.emit(\"complete\", proposals);\n        }\n    });\n\n    this.sender.on(\"setAvailableModuleNamespaces\", function(e){\n        that.availableModuleNamespaces = e.data;\n    });\n\n    this.sender.on(\"setModuleResolver\", function(e){\n        that.moduleResolver = getModuleResolverFromModules(e.data);\n    });\n};\n\noop.inherits(XQueryWorker, Mirror);\n\n(function() {\n    \n    this.onUpdate = function() {\n        this.sender.emit(\"start\");\n        var value = this.doc.getValue();\n        var sctx = XQLintLib.createStaticContext();\n        if(this.moduleResolver) {\n            sctx.setModuleResolver(this.moduleResolver);\n        }\n        if(this.availableModuleNamespaces) {\n            sctx.availableModuleNamespaces = this.availableModuleNamespaces;\n        }\n        var opts = {\n            styleCheck: this.styleCheck,\n            staticContext: sctx\n        };\n        this.xqlint = new XQLint(value, opts);\n        this.sender.emit(\"markers\", this.xqlint.getMarkers());\n    };\n}).call(XQueryWorker.prototype);\n\n});\n\nace.define(\"ace/lib/es5-shim\",[\"require\",\"exports\",\"module\"], function(require, exports, module) {\n\nfunction Empty() {}\n\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function bind(that) { // .length is 1\n        var target = this;\n        if (typeof target != \"function\") {\n            throw new TypeError(\"Function.prototype.bind called on incompatible \" + target);\n        }\n        var args = slice.call(arguments, 1); // for normal call\n        var bound = function () {\n\n            if (this instanceof bound) {\n\n                var result = target.apply(\n                    this,\n                    args.concat(slice.call(arguments))\n                );\n                if (Object(result) === result) {\n                    return result;\n                }\n                return this;\n\n            } else {\n                return target.apply(\n                    that,\n                    args.concat(slice.call(arguments))\n                );\n\n            }\n\n        };\n        if(target.prototype) {\n            Empty.prototype = target.prototype;\n            bound.prototype = new Empty();\n            Empty.prototype = null;\n        }\n        return bound;\n    };\n}\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar _toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n    defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n    defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n    lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n    lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\nif ([1,2].splice(0).length != 2) {\n    if(function() { // test IE < 9 to splice bug - see issue #138\n        function makeArray(l) {\n            var a = new Array(l+2);\n            a[0] = a[1] = 0;\n            return a;\n        }\n        var array = [], lengthBefore;\n        \n        array.splice.apply(array, makeArray(20));\n        array.splice.apply(array, makeArray(26));\n\n        lengthBefore = array.length; //46\n        array.splice(5, 0, \"XXX\"); // add one element\n\n        lengthBefore + 1 == array.length\n\n        if (lengthBefore + 1 == array.length) {\n            return true;// has right splice implementation without bugs\n        }\n    }()) {//IE 6/7\n        var array_splice = Array.prototype.splice;\n        Array.prototype.splice = function(start, deleteCount) {\n            if (!arguments.length) {\n                return [];\n            } else {\n                return array_splice.apply(this, [\n                    start === void 0 ? 0 : start,\n                    deleteCount === void 0 ? (this.length - start) : deleteCount\n                ].concat(slice.call(arguments, 2)))\n            }\n        };\n    } else {//IE8\n        Array.prototype.splice = function(pos, removeCount){\n            var length = this.length;\n            if (pos > 0) {\n                if (pos > length)\n                    pos = length;\n            } else if (pos == void 0) {\n                pos = 0;\n            } else if (pos < 0) {\n                pos = Math.max(length + pos, 0);\n            }\n\n            if (!(pos+removeCount < length))\n                removeCount = length - pos;\n\n            var removed = this.slice(pos, pos+removeCount);\n            var insert = slice.call(arguments, 2);\n            var add = insert.length;            \n            if (pos === length) {\n                if (add) {\n                    this.push.apply(this, insert);\n                }\n            } else {\n                var remove = Math.min(removeCount, length - pos);\n                var tailOldPos = pos + remove;\n                var tailNewPos = tailOldPos + add - remove;\n                var tailCount = length - tailOldPos;\n                var lengthAfterRemove = length - remove;\n\n                if (tailNewPos < tailOldPos) { // case A\n                    for (var i = 0; i < tailCount; ++i) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } else if (tailNewPos > tailOldPos) { // case B\n                    for (i = tailCount; i--; ) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } // else, add == remove (nothing to do)\n\n                if (add && pos === lengthAfterRemove) {\n                    this.length = lengthAfterRemove; // truncate array\n                    this.push.apply(this, insert);\n                } else {\n                    this.length = lengthAfterRemove + add; // reserves space\n                    for (i = 0; i < add; ++i) {\n                        this[pos+i] = insert[i];\n                    }\n                }\n            }\n            return removed;\n        };\n    }\n}\nif (!Array.isArray) {\n    Array.isArray = function isArray(obj) {\n        return _toString(obj) == \"[object Array]\";\n    };\n}\nvar boxedString = Object(\"a\"),\n    splitString = boxedString[0] != \"a\" || !(0 in boxedString);\n\nif (!Array.prototype.forEach) {\n    Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            thisp = arguments[1],\n            i = -1,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        while (++i < length) {\n            if (i in self) {\n                fun.call(thisp, self[i], i, object);\n            }\n        }\n    };\n}\nif (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            result = Array(length),\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self)\n                result[i] = fun.call(thisp, self[i], i, object);\n        }\n        return result;\n    };\n}\nif (!Array.prototype.filter) {\n    Array.prototype.filter = function filter(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                    object,\n            length = self.length >>> 0,\n            result = [],\n            value,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self) {\n                value = self[i];\n                if (fun.call(thisp, value, i, object)) {\n                    result.push(value);\n                }\n            }\n        }\n        return result;\n    };\n}\nif (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && !fun.call(thisp, self[i], i, object)) {\n                return false;\n            }\n        }\n        return true;\n    };\n}\nif (!Array.prototype.some) {\n    Array.prototype.some = function some(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, object)) {\n                return true;\n            }\n        }\n        return false;\n    };\n}\nif (!Array.prototype.reduce) {\n    Array.prototype.reduce = function reduce(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduce of empty array with no initial value\");\n        }\n\n        var i = 0;\n        var result;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i++];\n                    break;\n                }\n                if (++i >= length) {\n                    throw new TypeError(\"reduce of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        for (; i < length; i++) {\n            if (i in self) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        }\n\n        return result;\n    };\n}\nif (!Array.prototype.reduceRight) {\n    Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduceRight of empty array with no initial value\");\n        }\n\n        var result, i = length - 1;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i--];\n                    break;\n                }\n                if (--i < 0) {\n                    throw new TypeError(\"reduceRight of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        do {\n            if (i in this) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        } while (i--);\n\n        return result;\n    };\n}\nif (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {\n    Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n\n        var i = 0;\n        if (arguments.length > 1) {\n            i = toInteger(arguments[1]);\n        }\n        i = i >= 0 ? i : Math.max(0, length + i);\n        for (; i < length; i++) {\n            if (i in self && self[i] === sought) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {\n    Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n        var i = length - 1;\n        if (arguments.length > 1) {\n            i = Math.min(i, toInteger(arguments[1]));\n        }\n        i = i >= 0 ? i : length - Math.abs(i);\n        for (; i >= 0; i--) {\n            if (i in self && sought === self[i]) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Object.getPrototypeOf) {\n    Object.getPrototypeOf = function getPrototypeOf(object) {\n        return object.__proto__ || (\n            object.constructor ?\n            object.constructor.prototype :\n            prototypeOfObject\n        );\n    };\n}\nif (!Object.getOwnPropertyDescriptor) {\n    var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n                         \"non-object: \";\n    Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT + object);\n        if (!owns(object, property))\n            return;\n\n        var descriptor, getter, setter;\n        descriptor =  { enumerable: true, configurable: true };\n        if (supportsAccessors) {\n            var prototype = object.__proto__;\n            object.__proto__ = prototypeOfObject;\n\n            var getter = lookupGetter(object, property);\n            var setter = lookupSetter(object, property);\n            object.__proto__ = prototype;\n\n            if (getter || setter) {\n                if (getter) descriptor.get = getter;\n                if (setter) descriptor.set = setter;\n                return descriptor;\n            }\n        }\n        descriptor.value = object[property];\n        return descriptor;\n    };\n}\nif (!Object.getOwnPropertyNames) {\n    Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n        return Object.keys(object);\n    };\n}\nif (!Object.create) {\n    var createEmpty;\n    if (Object.prototype.__proto__ === null) {\n        createEmpty = function () {\n            return { \"__proto__\": null };\n        };\n    } else {\n        createEmpty = function () {\n            var empty = {};\n            for (var i in empty)\n                empty[i] = null;\n            empty.constructor =\n            empty.hasOwnProperty =\n            empty.propertyIsEnumerable =\n            empty.isPrototypeOf =\n            empty.toLocaleString =\n            empty.toString =\n            empty.valueOf =\n            empty.__proto__ = null;\n            return empty;\n        }\n    }\n\n    Object.create = function create(prototype, properties) {\n        var object;\n        if (prototype === null) {\n            object = createEmpty();\n        } else {\n            if (typeof prototype != \"object\")\n                throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n            var Type = function () {};\n            Type.prototype = prototype;\n            object = new Type();\n            object.__proto__ = prototype;\n        }\n        if (properties !== void 0)\n            Object.defineProperties(object, properties);\n        return object;\n    };\n}\n\nfunction doesDefinePropertyWork(object) {\n    try {\n        Object.defineProperty(object, \"sentinel\", {});\n        return \"sentinel\" in object;\n    } catch (exception) {\n    }\n}\nif (Object.defineProperty) {\n    var definePropertyWorksOnObject = doesDefinePropertyWork({});\n    var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n        doesDefinePropertyWork(document.createElement(\"div\"));\n    if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n        var definePropertyFallback = Object.defineProperty;\n    }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n    var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n    var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n    var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n                                      \"on this javascript engine\";\n\n    Object.defineProperty = function defineProperty(object, property, descriptor) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n        if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n            throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n        if (definePropertyFallback) {\n            try {\n                return definePropertyFallback.call(Object, object, property, descriptor);\n            } catch (exception) {\n            }\n        }\n        if (owns(descriptor, \"value\")) {\n\n            if (supportsAccessors && (lookupGetter(object, property) ||\n                                      lookupSetter(object, property)))\n            {\n                var prototype = object.__proto__;\n                object.__proto__ = prototypeOfObject;\n                delete object[property];\n                object[property] = descriptor.value;\n                object.__proto__ = prototype;\n            } else {\n                object[property] = descriptor.value;\n            }\n        } else {\n            if (!supportsAccessors)\n                throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n            if (owns(descriptor, \"get\"))\n                defineGetter(object, property, descriptor.get);\n            if (owns(descriptor, \"set\"))\n                defineSetter(object, property, descriptor.set);\n        }\n\n        return object;\n    };\n}\nif (!Object.defineProperties) {\n    Object.defineProperties = function defineProperties(object, properties) {\n        for (var property in properties) {\n            if (owns(properties, property))\n                Object.defineProperty(object, property, properties[property]);\n        }\n        return object;\n    };\n}\nif (!Object.seal) {\n    Object.seal = function seal(object) {\n        return object;\n    };\n}\nif (!Object.freeze) {\n    Object.freeze = function freeze(object) {\n        return object;\n    };\n}\ntry {\n    Object.freeze(function () {});\n} catch (exception) {\n    Object.freeze = (function freeze(freezeObject) {\n        return function freeze(object) {\n            if (typeof object == \"function\") {\n                return object;\n            } else {\n                return freezeObject(object);\n            }\n        };\n    })(Object.freeze);\n}\nif (!Object.preventExtensions) {\n    Object.preventExtensions = function preventExtensions(object) {\n        return object;\n    };\n}\nif (!Object.isSealed) {\n    Object.isSealed = function isSealed(object) {\n        return false;\n    };\n}\nif (!Object.isFrozen) {\n    Object.isFrozen = function isFrozen(object) {\n        return false;\n    };\n}\nif (!Object.isExtensible) {\n    Object.isExtensible = function isExtensible(object) {\n        if (Object(object) === object) {\n            throw new TypeError(); // TODO message\n        }\n        var name = '';\n        while (owns(object, name)) {\n            name += '?';\n        }\n        object[name] = true;\n        var returnValue = owns(object, name);\n        delete object[name];\n        return returnValue;\n    };\n}\nif (!Object.keys) {\n    var hasDontEnumBug = true,\n        dontEnums = [\n            \"toString\",\n            \"toLocaleString\",\n            \"valueOf\",\n            \"hasOwnProperty\",\n            \"isPrototypeOf\",\n            \"propertyIsEnumerable\",\n            \"constructor\"\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    for (var key in {\"toString\": null}) {\n        hasDontEnumBug = false;\n    }\n\n    Object.keys = function keys(object) {\n\n        if (\n            (typeof object != \"object\" && typeof object != \"function\") ||\n            object === null\n        ) {\n            throw new TypeError(\"Object.keys called on a non-object\");\n        }\n\n        var keys = [];\n        for (var name in object) {\n            if (owns(object, name)) {\n                keys.push(name);\n            }\n        }\n\n        if (hasDontEnumBug) {\n            for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n                var dontEnum = dontEnums[i];\n                if (owns(object, dontEnum)) {\n                    keys.push(dontEnum);\n                }\n            }\n        }\n        return keys;\n    };\n\n}\nif (!Date.now) {\n    Date.now = function now() {\n        return new Date().getTime();\n    };\n}\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n    \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n    \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n    ws = \"[\" + ws + \"]\";\n    var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n        trimEndRegexp = new RegExp(ws + ws + \"*$\");\n    String.prototype.trim = function trim() {\n        return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n    };\n}\n\nfunction toInteger(n) {\n    n = +n;\n    if (n !== n) { // isNaN\n        n = 0;\n    } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {\n        n = (n > 0 || -1) * Math.floor(Math.abs(n));\n    }\n    return n;\n}\n\nfunction isPrimitive(input) {\n    var type = typeof input;\n    return (\n        input === null ||\n        type === \"undefined\" ||\n        type === \"boolean\" ||\n        type === \"number\" ||\n        type === \"string\"\n    );\n}\n\nfunction toPrimitive(input) {\n    var val, valueOf, toString;\n    if (isPrimitive(input)) {\n        return input;\n    }\n    valueOf = input.valueOf;\n    if (typeof valueOf === \"function\") {\n        val = valueOf.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    toString = input.toString;\n    if (typeof toString === \"function\") {\n        val = toString.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    throw new TypeError();\n}\nvar toObject = function (o) {\n    if (o == null) { // this matches both null and undefined\n        throw new TypeError(\"can't convert \"+o+\" to object\");\n    }\n    return Object(o);\n};\n\n});\n"
  },
  {
    "path": "browser/plugins/ace/theme-chrome.js",
    "content": "/* ***** BEGIN LICENSE BLOCK *****\n * Distributed under the BSD license:\n *\n * Copyright (c) 2010, Ajax.org B.V.\n * All rights reserved.\n * \n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * 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 *     * Neither the name of Ajax.org B.V. nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n * \n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING 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 * ***** END LICENSE BLOCK ***** */\n\ndefine('ace/theme/chrome', ['require', 'exports', 'module' , 'ace/lib/dom'], function(require, exports, module) {\n\nexports.isDark = false;\nexports.cssClass = \"ace-chrome\";\nexports.cssText = \".ace-chrome .ace_gutter {\\\nbackground: #ebebeb;\\\ncolor: #333;\\\noverflow : hidden;\\\n}\\\n.ace-chrome .ace_print-margin {\\\nwidth: 1px;\\\nbackground: #e8e8e8;\\\n}\\\n.ace-chrome {\\\nbackground-color: #FFFFFF;\\\n}\\\n.ace-chrome .ace_cursor {\\\ncolor: black;\\\n}\\\n.ace-chrome .ace_invisible {\\\ncolor: rgb(191, 191, 191);\\\n}\\\n.ace-chrome .ace_constant.ace_buildin {\\\ncolor: rgb(88, 72, 246);\\\n}\\\n.ace-chrome .ace_constant.ace_language {\\\ncolor: rgb(88, 92, 246);\\\n}\\\n.ace-chrome .ace_constant.ace_library {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-chrome .ace_invalid {\\\nbackground-color: rgb(153, 0, 0);\\\ncolor: white;\\\n}\\\n.ace-chrome .ace_fold {\\\n}\\\n.ace-chrome .ace_support.ace_function {\\\ncolor: rgb(60, 76, 114);\\\n}\\\n.ace-chrome .ace_support.ace_constant {\\\ncolor: rgb(6, 150, 14);\\\n}\\\n.ace-chrome .ace_support.ace_type,\\\n.ace-chrome .ace_support.ace_class\\\n.ace-chrome .ace_support.ace_other {\\\ncolor: rgb(109, 121, 222);\\\n}\\\n.ace-chrome .ace_variable.ace_parameter {\\\nfont-style:italic;\\\ncolor:#FD971F;\\\n}\\\n.ace-chrome .ace_keyword.ace_operator {\\\ncolor: rgb(104, 118, 135);\\\n}\\\n.ace-chrome .ace_comment {\\\ncolor: #236e24;\\\n}\\\n.ace-chrome .ace_comment.ace_doc {\\\ncolor: #236e24;\\\n}\\\n.ace-chrome .ace_comment.ace_doc.ace_tag {\\\ncolor: #236e24;\\\n}\\\n.ace-chrome .ace_constant.ace_numeric {\\\ncolor: rgb(0, 0, 205);\\\n}\\\n.ace-chrome .ace_variable {\\\ncolor: rgb(49, 132, 149);\\\n}\\\n.ace-chrome .ace_xml-pe {\\\ncolor: rgb(104, 104, 91);\\\n}\\\n.ace-chrome .ace_entity.ace_name.ace_function {\\\ncolor: #0000A2;\\\n}\\\n.ace-chrome .ace_heading {\\\ncolor: rgb(12, 7, 255);\\\n}\\\n.ace-chrome .ace_list {\\\ncolor:rgb(185, 6, 144);\\\n}\\\n.ace-chrome .ace_marker-layer .ace_selection {\\\nbackground: rgb(181, 213, 255);\\\n}\\\n.ace-chrome .ace_marker-layer .ace_step {\\\nbackground: rgb(252, 255, 0);\\\n}\\\n.ace-chrome .ace_marker-layer .ace_stack {\\\nbackground: rgb(164, 229, 101);\\\n}\\\n.ace-chrome .ace_marker-layer .ace_bracket {\\\nmargin: -1px 0 0 -1px;\\\nborder: 1px solid rgb(192, 192, 192);\\\n}\\\n.ace-chrome .ace_marker-layer .ace_active-line {\\\nbackground: rgba(0, 0, 0, 0.07);\\\n}\\\n.ace-chrome .ace_gutter-active-line {\\\nbackground-color : #dcdcdc;\\\n}\\\n.ace-chrome .ace_marker-layer .ace_selected-word {\\\nbackground: rgb(250, 250, 255);\\\nborder: 1px solid rgb(200, 200, 250);\\\n}\\\n.ace-chrome .ace_storage,\\\n.ace-chrome .ace_keyword,\\\n.ace-chrome .ace_meta.ace_tag {\\\ncolor: rgb(147, 15, 128);\\\n}\\\n.ace-chrome .ace_string.ace_regex {\\\ncolor: rgb(255, 0, 0)\\\n}\\\n.ace-chrome .ace_string {\\\ncolor: #1A1AA6;\\\n}\\\n.ace-chrome .ace_entity.ace_other.ace_attribute-name {\\\ncolor: #994409;\\\n}\\\n.ace-chrome .ace_indent-guide {\\\nbackground: url(\\\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\\\") right repeat-y;\\\n}\\\n\";\n\nvar dom = require(\"../lib/dom\");\ndom.importCssString(exports.cssText, exports.cssClass);\n});\n"
  },
  {
    "path": "browser/plugins/ace/worker-css.js",
    "content": "\"no use strict\";\n;(function(window) {\nif (typeof window.window != \"undefined\" && window.document) {\n    return;\n}\n\nwindow.console = function() {\n    var msgs = Array.prototype.slice.call(arguments, 0);\n    postMessage({type: \"log\", data: msgs});\n};\nwindow.console.error =\nwindow.console.warn = \nwindow.console.log =\nwindow.console.trace = window.console;\n\nwindow.window = window;\nwindow.ace = window;\n\nwindow.onerror = function(message, file, line, col, err) {\n    console.error(\"Worker \" + err.stack);\n};\n\nwindow.normalizeModule = function(parentId, moduleName) {\n    if (moduleName.indexOf(\"!\") !== -1) {\n        var chunks = moduleName.split(\"!\");\n        return window.normalizeModule(parentId, chunks[0]) + \"!\" + window.normalizeModule(parentId, chunks[1]);\n    }\n    if (moduleName.charAt(0) == \".\") {\n        var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n        moduleName = (base ? base + \"/\" : \"\") + moduleName;\n        \n        while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n            var previous = moduleName;\n            moduleName = moduleName.replace(/^\\.\\//, \"\").replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n        }\n    }\n    \n    return moduleName;\n};\n\nwindow.require = function(parentId, id) {\n    if (!id) {\n        id = parentId\n        parentId = null;\n    }\n    if (!id.charAt)\n        throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");\n\n    id = window.normalizeModule(parentId, id);\n\n    var module = window.require.modules[id];\n    if (module) {\n        if (!module.initialized) {\n            module.initialized = true;\n            module.exports = module.factory().exports;\n        }\n        return module.exports;\n    }\n    \n    var chunks = id.split(\"/\");\n    if (!window.require.tlns)\n        return console.log(\"unable to load \" + id);\n    chunks[0] = window.require.tlns[chunks[0]] || chunks[0];\n    var path = chunks.join(\"/\") + \".js\";\n    \n    window.require.id = id;\n    importScripts(path);\n    return window.require(parentId, id);\n};\nwindow.require.modules = {};\nwindow.require.tlns = {};\n\nwindow.define = function(id, deps, factory) {\n    if (arguments.length == 2) {\n        factory = deps;\n        if (typeof id != \"string\") {\n            deps = id;\n            id = window.require.id;\n        }\n    } else if (arguments.length == 1) {\n        factory = id;\n        deps = []\n        id = window.require.id;\n    }\n\n    if (!deps.length)\n        deps = ['require', 'exports', 'module']\n\n    if (id.indexOf(\"text!\") === 0) \n        return;\n    \n    var req = function(childId) {\n        return window.require(id, childId);\n    };\n\n    window.require.modules[id] = {\n        exports: {},\n        factory: function() {\n            var module = this;\n            var returnExports = factory.apply(this, deps.map(function(dep) {\n              switch(dep) {\n                  case 'require': return req\n                  case 'exports': return module.exports\n                  case 'module':  return module\n                  default:        return req(dep)\n              }\n            }));\n            if (returnExports)\n                module.exports = returnExports;\n            return module;\n        }\n    };\n};\nwindow.define.amd = {}\n\nwindow.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n    require.tlns = topLevelNamespaces;\n}\n\nwindow.initSender = function initSender() {\n\n    var EventEmitter = window.require(\"ace/lib/event_emitter\").EventEmitter;\n    var oop = window.require(\"ace/lib/oop\");\n    \n    var Sender = function() {};\n    \n    (function() {\n        \n        oop.implement(this, EventEmitter);\n                \n        this.callback = function(data, callbackId) {\n            postMessage({\n                type: \"call\",\n                id: callbackId,\n                data: data\n            });\n        };\n    \n        this.emit = function(name, data) {\n            postMessage({\n                type: \"event\",\n                name: name,\n                data: data\n            });\n        };\n        \n    }).call(Sender.prototype);\n    \n    return new Sender();\n}\n\nwindow.main = null;\nwindow.sender = null;\n\nwindow.onmessage = function(e) {\n    var msg = e.data;\n    if (msg.command) {\n        if (main[msg.command])\n            main[msg.command].apply(main, msg.args);\n        else\n            throw new Error(\"Unknown command:\" + msg.command);\n    }\n    else if (msg.init) {        \n        initBaseUrls(msg.tlns);\n        require(\"ace/lib/es5-shim\");\n        sender = initSender();\n        var clazz = require(msg.module)[msg.classname];\n        main = new clazz(sender);\n    } \n    else if (msg.event && sender) {\n        sender._emit(msg.event, msg.data);\n    }\n};\n})(this);// https://github.com/kriskowal/es5-shim\n\ndefine('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) {\n\nfunction Empty() {}\n\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function bind(that) { // .length is 1\n        var target = this;\n        if (typeof target != \"function\") {\n            throw new TypeError(\"Function.prototype.bind called on incompatible \" + target);\n        }\n        var args = slice.call(arguments, 1); // for normal call\n        var bound = function () {\n\n            if (this instanceof bound) {\n\n                var result = target.apply(\n                    this,\n                    args.concat(slice.call(arguments))\n                );\n                if (Object(result) === result) {\n                    return result;\n                }\n                return this;\n\n            } else {\n                return target.apply(\n                    that,\n                    args.concat(slice.call(arguments))\n                );\n\n            }\n\n        };\n        if(target.prototype) {\n            Empty.prototype = target.prototype;\n            bound.prototype = new Empty();\n            Empty.prototype = null;\n        }\n        return bound;\n    };\n}\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar _toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n    defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n    defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n    lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n    lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\nif ([1,2].splice(0).length != 2) {\n    if(function() { // test IE < 9 to splice bug - see issue #138\n        function makeArray(l) {\n            var a = new Array(l+2);\n            a[0] = a[1] = 0;\n            return a;\n        }\n        var array = [], lengthBefore;\n        \n        array.splice.apply(array, makeArray(20));\n        array.splice.apply(array, makeArray(26));\n\n        lengthBefore = array.length; //46\n        array.splice(5, 0, \"XXX\"); // add one element\n\n        lengthBefore + 1 == array.length\n\n        if (lengthBefore + 1 == array.length) {\n            return true;// has right splice implementation without bugs\n        }\n    }()) {//IE 6/7\n        var array_splice = Array.prototype.splice;\n        Array.prototype.splice = function(start, deleteCount) {\n            if (!arguments.length) {\n                return [];\n            } else {\n                return array_splice.apply(this, [\n                    start === void 0 ? 0 : start,\n                    deleteCount === void 0 ? (this.length - start) : deleteCount\n                ].concat(slice.call(arguments, 2)))\n            }\n        };\n    } else {//IE8\n        Array.prototype.splice = function(pos, removeCount){\n            var length = this.length;\n            if (pos > 0) {\n                if (pos > length)\n                    pos = length;\n            } else if (pos == void 0) {\n                pos = 0;\n            } else if (pos < 0) {\n                pos = Math.max(length + pos, 0);\n            }\n\n            if (!(pos+removeCount < length))\n                removeCount = length - pos;\n\n            var removed = this.slice(pos, pos+removeCount);\n            var insert = slice.call(arguments, 2);\n            var add = insert.length;            \n            if (pos === length) {\n                if (add) {\n                    this.push.apply(this, insert);\n                }\n            } else {\n                var remove = Math.min(removeCount, length - pos);\n                var tailOldPos = pos + remove;\n                var tailNewPos = tailOldPos + add - remove;\n                var tailCount = length - tailOldPos;\n                var lengthAfterRemove = length - remove;\n\n                if (tailNewPos < tailOldPos) { // case A\n                    for (var i = 0; i < tailCount; ++i) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } else if (tailNewPos > tailOldPos) { // case B\n                    for (i = tailCount; i--; ) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } // else, add == remove (nothing to do)\n\n                if (add && pos === lengthAfterRemove) {\n                    this.length = lengthAfterRemove; // truncate array\n                    this.push.apply(this, insert);\n                } else {\n                    this.length = lengthAfterRemove + add; // reserves space\n                    for (i = 0; i < add; ++i) {\n                        this[pos+i] = insert[i];\n                    }\n                }\n            }\n            return removed;\n        };\n    }\n}\nif (!Array.isArray) {\n    Array.isArray = function isArray(obj) {\n        return _toString(obj) == \"[object Array]\";\n    };\n}\nvar boxedString = Object(\"a\"),\n    splitString = boxedString[0] != \"a\" || !(0 in boxedString);\n\nif (!Array.prototype.forEach) {\n    Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            thisp = arguments[1],\n            i = -1,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        while (++i < length) {\n            if (i in self) {\n                fun.call(thisp, self[i], i, object);\n            }\n        }\n    };\n}\nif (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            result = Array(length),\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self)\n                result[i] = fun.call(thisp, self[i], i, object);\n        }\n        return result;\n    };\n}\nif (!Array.prototype.filter) {\n    Array.prototype.filter = function filter(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                    object,\n            length = self.length >>> 0,\n            result = [],\n            value,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self) {\n                value = self[i];\n                if (fun.call(thisp, value, i, object)) {\n                    result.push(value);\n                }\n            }\n        }\n        return result;\n    };\n}\nif (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && !fun.call(thisp, self[i], i, object)) {\n                return false;\n            }\n        }\n        return true;\n    };\n}\nif (!Array.prototype.some) {\n    Array.prototype.some = function some(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, object)) {\n                return true;\n            }\n        }\n        return false;\n    };\n}\nif (!Array.prototype.reduce) {\n    Array.prototype.reduce = function reduce(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduce of empty array with no initial value\");\n        }\n\n        var i = 0;\n        var result;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i++];\n                    break;\n                }\n                if (++i >= length) {\n                    throw new TypeError(\"reduce of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        for (; i < length; i++) {\n            if (i in self) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        }\n\n        return result;\n    };\n}\nif (!Array.prototype.reduceRight) {\n    Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduceRight of empty array with no initial value\");\n        }\n\n        var result, i = length - 1;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i--];\n                    break;\n                }\n                if (--i < 0) {\n                    throw new TypeError(\"reduceRight of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        do {\n            if (i in this) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        } while (i--);\n\n        return result;\n    };\n}\nif (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {\n    Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n\n        var i = 0;\n        if (arguments.length > 1) {\n            i = toInteger(arguments[1]);\n        }\n        i = i >= 0 ? i : Math.max(0, length + i);\n        for (; i < length; i++) {\n            if (i in self && self[i] === sought) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {\n    Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n        var i = length - 1;\n        if (arguments.length > 1) {\n            i = Math.min(i, toInteger(arguments[1]));\n        }\n        i = i >= 0 ? i : length - Math.abs(i);\n        for (; i >= 0; i--) {\n            if (i in self && sought === self[i]) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Object.getPrototypeOf) {\n    Object.getPrototypeOf = function getPrototypeOf(object) {\n        return object.__proto__ || (\n            object.constructor ?\n            object.constructor.prototype :\n            prototypeOfObject\n        );\n    };\n}\nif (!Object.getOwnPropertyDescriptor) {\n    var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n                         \"non-object: \";\n    Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT + object);\n        if (!owns(object, property))\n            return;\n\n        var descriptor, getter, setter;\n        descriptor =  { enumerable: true, configurable: true };\n        if (supportsAccessors) {\n            var prototype = object.__proto__;\n            object.__proto__ = prototypeOfObject;\n\n            var getter = lookupGetter(object, property);\n            var setter = lookupSetter(object, property);\n            object.__proto__ = prototype;\n\n            if (getter || setter) {\n                if (getter) descriptor.get = getter;\n                if (setter) descriptor.set = setter;\n                return descriptor;\n            }\n        }\n        descriptor.value = object[property];\n        return descriptor;\n    };\n}\nif (!Object.getOwnPropertyNames) {\n    Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n        return Object.keys(object);\n    };\n}\nif (!Object.create) {\n    var createEmpty;\n    if (Object.prototype.__proto__ === null) {\n        createEmpty = function () {\n            return { \"__proto__\": null };\n        };\n    } else {\n        createEmpty = function () {\n            var empty = {};\n            for (var i in empty)\n                empty[i] = null;\n            empty.constructor =\n            empty.hasOwnProperty =\n            empty.propertyIsEnumerable =\n            empty.isPrototypeOf =\n            empty.toLocaleString =\n            empty.toString =\n            empty.valueOf =\n            empty.__proto__ = null;\n            return empty;\n        }\n    }\n\n    Object.create = function create(prototype, properties) {\n        var object;\n        if (prototype === null) {\n            object = createEmpty();\n        } else {\n            if (typeof prototype != \"object\")\n                throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n            var Type = function () {};\n            Type.prototype = prototype;\n            object = new Type();\n            object.__proto__ = prototype;\n        }\n        if (properties !== void 0)\n            Object.defineProperties(object, properties);\n        return object;\n    };\n}\n\nfunction doesDefinePropertyWork(object) {\n    try {\n        Object.defineProperty(object, \"sentinel\", {});\n        return \"sentinel\" in object;\n    } catch (exception) {\n    }\n}\nif (Object.defineProperty) {\n    var definePropertyWorksOnObject = doesDefinePropertyWork({});\n    var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n        doesDefinePropertyWork(document.createElement(\"div\"));\n    if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n        var definePropertyFallback = Object.defineProperty;\n    }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n    var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n    var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n    var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n                                      \"on this javascript engine\";\n\n    Object.defineProperty = function defineProperty(object, property, descriptor) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n        if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n            throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n        if (definePropertyFallback) {\n            try {\n                return definePropertyFallback.call(Object, object, property, descriptor);\n            } catch (exception) {\n            }\n        }\n        if (owns(descriptor, \"value\")) {\n\n            if (supportsAccessors && (lookupGetter(object, property) ||\n                                      lookupSetter(object, property)))\n            {\n                var prototype = object.__proto__;\n                object.__proto__ = prototypeOfObject;\n                delete object[property];\n                object[property] = descriptor.value;\n                object.__proto__ = prototype;\n            } else {\n                object[property] = descriptor.value;\n            }\n        } else {\n            if (!supportsAccessors)\n                throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n            if (owns(descriptor, \"get\"))\n                defineGetter(object, property, descriptor.get);\n            if (owns(descriptor, \"set\"))\n                defineSetter(object, property, descriptor.set);\n        }\n\n        return object;\n    };\n}\nif (!Object.defineProperties) {\n    Object.defineProperties = function defineProperties(object, properties) {\n        for (var property in properties) {\n            if (owns(properties, property))\n                Object.defineProperty(object, property, properties[property]);\n        }\n        return object;\n    };\n}\nif (!Object.seal) {\n    Object.seal = function seal(object) {\n        return object;\n    };\n}\nif (!Object.freeze) {\n    Object.freeze = function freeze(object) {\n        return object;\n    };\n}\ntry {\n    Object.freeze(function () {});\n} catch (exception) {\n    Object.freeze = (function freeze(freezeObject) {\n        return function freeze(object) {\n            if (typeof object == \"function\") {\n                return object;\n            } else {\n                return freezeObject(object);\n            }\n        };\n    })(Object.freeze);\n}\nif (!Object.preventExtensions) {\n    Object.preventExtensions = function preventExtensions(object) {\n        return object;\n    };\n}\nif (!Object.isSealed) {\n    Object.isSealed = function isSealed(object) {\n        return false;\n    };\n}\nif (!Object.isFrozen) {\n    Object.isFrozen = function isFrozen(object) {\n        return false;\n    };\n}\nif (!Object.isExtensible) {\n    Object.isExtensible = function isExtensible(object) {\n        if (Object(object) === object) {\n            throw new TypeError(); // TODO message\n        }\n        var name = '';\n        while (owns(object, name)) {\n            name += '?';\n        }\n        object[name] = true;\n        var returnValue = owns(object, name);\n        delete object[name];\n        return returnValue;\n    };\n}\nif (!Object.keys) {\n    var hasDontEnumBug = true,\n        dontEnums = [\n            \"toString\",\n            \"toLocaleString\",\n            \"valueOf\",\n            \"hasOwnProperty\",\n            \"isPrototypeOf\",\n            \"propertyIsEnumerable\",\n            \"constructor\"\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    for (var key in {\"toString\": null}) {\n        hasDontEnumBug = false;\n    }\n\n    Object.keys = function keys(object) {\n\n        if (\n            (typeof object != \"object\" && typeof object != \"function\") ||\n            object === null\n        ) {\n            throw new TypeError(\"Object.keys called on a non-object\");\n        }\n\n        var keys = [];\n        for (var name in object) {\n            if (owns(object, name)) {\n                keys.push(name);\n            }\n        }\n\n        if (hasDontEnumBug) {\n            for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n                var dontEnum = dontEnums[i];\n                if (owns(object, dontEnum)) {\n                    keys.push(dontEnum);\n                }\n            }\n        }\n        return keys;\n    };\n\n}\nif (!Date.now) {\n    Date.now = function now() {\n        return new Date().getTime();\n    };\n}\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n    \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n    \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n    ws = \"[\" + ws + \"]\";\n    var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n        trimEndRegexp = new RegExp(ws + ws + \"*$\");\n    String.prototype.trim = function trim() {\n        return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n    };\n}\n\nfunction toInteger(n) {\n    n = +n;\n    if (n !== n) { // isNaN\n        n = 0;\n    } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {\n        n = (n > 0 || -1) * Math.floor(Math.abs(n));\n    }\n    return n;\n}\n\nfunction isPrimitive(input) {\n    var type = typeof input;\n    return (\n        input === null ||\n        type === \"undefined\" ||\n        type === \"boolean\" ||\n        type === \"number\" ||\n        type === \"string\"\n    );\n}\n\nfunction toPrimitive(input) {\n    var val, valueOf, toString;\n    if (isPrimitive(input)) {\n        return input;\n    }\n    valueOf = input.valueOf;\n    if (typeof valueOf === \"function\") {\n        val = valueOf.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    toString = input.toString;\n    if (typeof toString === \"function\") {\n        val = toString.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    throw new TypeError();\n}\nvar toObject = function (o) {\n    if (o == null) { // this matches both null and undefined\n        throw new TypeError(\"can't convert \"+o+\" to object\");\n    }\n    return Object(o);\n};\n\n});\n\ndefine('ace/mode/css_worker', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/lang', 'ace/worker/mirror', 'ace/mode/css/csslint'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar lang = require(\"../lib/lang\");\nvar Mirror = require(\"../worker/mirror\").Mirror;\nvar CSSLint = require(\"./css/csslint\").CSSLint;\n\nvar Worker = exports.Worker = function(sender) {\n    Mirror.call(this, sender);\n    this.setTimeout(400);\n    this.ruleset = null;\n    this.setDisabledRules(\"ids\");\n    this.setInfoRules(\"adjoining-classes|qualified-headings|zero-units|gradients|import|outline-none\");\n};\n\noop.inherits(Worker, Mirror);\n\n(function() {\n    this.setInfoRules = function(ruleNames) {\n        if (typeof ruleNames == \"string\")\n            ruleNames = ruleNames.split(\"|\");\n        this.infoRules = lang.arrayToMap(ruleNames);\n        this.doc.getValue() && this.deferredUpdate.schedule(100);\n    };\n\n    this.setDisabledRules = function(ruleNames) {\n        if (!ruleNames) {\n            this.ruleset = null;\n        } else {\n            if (typeof ruleNames == \"string\")\n                ruleNames = ruleNames.split(\"|\");\n            var all = {};\n\n            CSSLint.getRules().forEach(function(x){\n                all[x.id] = true;\n            });\n            ruleNames.forEach(function(x) {\n                delete all[x];\n            });\n            \n            this.ruleset = all;\n        }\n        this.doc.getValue() && this.deferredUpdate.schedule(100);\n    };\n\n    this.onUpdate = function() {\n        var value = this.doc.getValue();\n        var infoRules = this.infoRules;\n\n        var result = CSSLint.verify(value, this.ruleset);\n        this.sender.emit(\"csslint\", result.messages.map(function(msg) {\n            return {\n                row: msg.line - 1,\n                column: msg.col - 1,\n                text: msg.message,\n                type: infoRules[msg.rule.id] ? \"info\" : msg.type,\n                rule: msg.rule.name\n            }\n        }));\n    };\n\n}).call(Worker.prototype);\n\n});\n\ndefine('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nexports.inherits = (function() {\n    var createObject = Object.create || function(prototype, properties) {\n        var Type = function () {};\n        Type.prototype = prototype;\n        object = new Type();\n        object.__proto__ = prototype;\n        if (typeof properties !== 'undefined' && Object.defineProperties) {\n            Object.defineProperties(object, properties);\n        }\n    };\n    return function(ctor, superCtor) {\n        ctor.super_ = superCtor;\n        ctor.prototype = createObject(superCtor.prototype, {\n            constructor: {\n                value: ctor,\n                enumerable: false,\n                writable: true,\n                configurable: true\n            }\n        });\n    };\n}());\n\nexports.mixin = function(obj, mixin) {\n    for (var key in mixin) {\n        obj[key] = mixin[key];\n    }\n    return obj;\n};\n\nexports.implement = function(proto, mixin) {\n    exports.mixin(proto, mixin);\n};\n\n});\n\ndefine('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nexports.stringReverse = function(string) {\n    return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n    var result = '';\n    while (count > 0) {\n        if (count & 1)\n            result += string;\n\n        if (count >>= 1)\n            string += string;\n    }\n    return result;\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n    return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n    return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n    var copy = {};\n    for (var key in obj) {\n        copy[key] = obj[key];\n    }\n    return copy;\n};\n\nexports.copyArray = function(array){\n    var copy = [];\n    for (var i=0, l=array.length; i<l; i++) {\n        if (array[i] && typeof array[i] == \"object\")\n            copy[i] = this.copyObject( array[i] );\n        else \n            copy[i] = array[i];\n    }\n    return copy;\n};\n\nexports.deepCopy = function (obj) {\n    if (typeof obj !== \"object\" || !obj)\n        return obj;\n    var cons = obj.constructor;\n    if (cons === RegExp)\n        return obj;\n    \n    var copy = cons();\n    for (var key in obj) {\n        if (typeof obj[key] === \"object\") {\n            copy[key] = exports.deepCopy(obj[key]);\n        } else {\n            copy[key] = obj[key];\n        }\n    }\n    return copy;\n};\n\nexports.arrayToMap = function(arr) {\n    var map = {};\n    for (var i=0; i<arr.length; i++) {\n        map[arr[i]] = 1;\n    }\n    return map;\n\n};\n\nexports.createMap = function(props) {\n    var map = Object.create(null);\n    for (var i in props) {\n        map[i] = props[i];\n    }\n    return map;\n};\nexports.arrayRemove = function(array, value) {\n  for (var i = 0; i <= array.length; i++) {\n    if (value === array[i]) {\n      array.splice(i, 1);\n    }\n  }\n};\n\nexports.escapeRegExp = function(str) {\n    return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n};\n\nexports.escapeHTML = function(str) {\n    return str.replace(/&/g, \"&#38;\").replace(/\"/g, \"&#34;\").replace(/'/g, \"&#39;\").replace(/</g, \"&#60;\");\n};\n\nexports.getMatchOffsets = function(string, regExp) {\n    var matches = [];\n\n    string.replace(regExp, function(str) {\n        matches.push({\n            offset: arguments[arguments.length-2],\n            length: str.length\n        });\n    });\n\n    return matches;\n};\nexports.deferredCall = function(fcn) {\n\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var deferred = function(timeout) {\n        deferred.cancel();\n        timer = setTimeout(callback, timeout || 0);\n        return deferred;\n    };\n\n    deferred.schedule = deferred;\n\n    deferred.call = function() {\n        this.cancel();\n        fcn();\n        return deferred;\n    };\n\n    deferred.cancel = function() {\n        clearTimeout(timer);\n        timer = null;\n        return deferred;\n    };\n    \n    deferred.isPending = function() {\n        return timer;\n    };\n\n    return deferred;\n};\n\n\nexports.delayedCall = function(fcn, defaultTimeout) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var _self = function(timeout) {\n        if (timer == null)\n            timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n\n    _self.delay = function(timeout) {\n        timer && clearTimeout(timer);\n        timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n    _self.schedule = _self;\n\n    _self.call = function() {\n        this.cancel();\n        fcn();\n    };\n\n    _self.cancel = function() {\n        timer && clearTimeout(timer);\n        timer = null;\n    };\n\n    _self.isPending = function() {\n        return timer;\n    };\n\n    return _self;\n};\n});\ndefine('ace/worker/mirror', ['require', 'exports', 'module' , 'ace/document', 'ace/lib/lang'], function(require, exports, module) {\n\n\nvar Document = require(\"../document\").Document;\nvar lang = require(\"../lib/lang\");\n    \nvar Mirror = exports.Mirror = function(sender) {\n    this.sender = sender;\n    var doc = this.doc = new Document(\"\");\n    \n    var deferredUpdate = this.deferredUpdate = lang.delayedCall(this.onUpdate.bind(this));\n    \n    var _self = this;\n    sender.on(\"change\", function(e) {\n        doc.applyDeltas(e.data);\n        if (_self.$timeout)\n            return deferredUpdate.schedule(_self.$timeout);\n        _self.onUpdate();\n    });\n};\n\n(function() {\n    \n    this.$timeout = 500;\n    \n    this.setTimeout = function(timeout) {\n        this.$timeout = timeout;\n    };\n    \n    this.setValue = function(value) {\n        this.doc.setValue(value);\n        this.deferredUpdate.schedule(this.$timeout);\n    };\n    \n    this.getValue = function(callbackId) {\n        this.sender.callback(this.doc.getValue(), callbackId);\n    };\n    \n    this.onUpdate = function() {\n    };\n    \n    this.isPending = function() {\n        return this.deferredUpdate.isPending();\n    };\n    \n}).call(Mirror.prototype);\n\n});\n\ndefine('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\nvar Document = function(text) {\n    this.$lines = [];\n    if (text.length == 0) {\n        this.$lines = [\"\"];\n    } else if (Array.isArray(text)) {\n        this._insertLines(0, text);\n    } else {\n        this.insert({row: 0, column:0}, text);\n    }\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setValue = function(text) {\n        var len = this.getLength();\n        this.remove(new Range(0, 0, len, this.getLine(len-1).length));\n        this.insert({row: 0, column:0}, text);\n    };\n    this.getValue = function() {\n        return this.getAllLines().join(this.getNewLineCharacter());\n    };\n    this.createAnchor = function(row, column) {\n        return new Anchor(this, row, column);\n    };\n    if (\"aaa\".split(/a/).length == 0)\n        this.$split = function(text) {\n            return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n        }\n    else\n        this.$split = function(text) {\n            return text.split(/\\r\\n|\\r|\\n/);\n        };\n\n\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n        this.$autoNewLine = match ? match[1] : \"\\n\";\n    };\n    this.getNewLineCharacter = function() {\n        switch (this.$newLineMode) {\n          case \"windows\":\n            return \"\\r\\n\";\n          case \"unix\":\n            return \"\\n\";\n          default:\n            return this.$autoNewLine;\n        }\n    };\n\n    this.$autoNewLine = \"\\n\";\n    this.$newLineMode = \"auto\";\n    this.setNewLineMode = function(newLineMode) {\n        if (this.$newLineMode === newLineMode)\n            return;\n\n        this.$newLineMode = newLineMode;\n    };\n    this.getNewLineMode = function() {\n        return this.$newLineMode;\n    };\n    this.isNewLine = function(text) {\n        return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n    };\n    this.getLine = function(row) {\n        return this.$lines[row] || \"\";\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.$lines.slice(firstRow, lastRow + 1);\n    };\n    this.getAllLines = function() {\n        return this.getLines(0, this.getLength());\n    };\n    this.getLength = function() {\n        return this.$lines.length;\n    };\n    this.getTextRange = function(range) {\n        if (range.start.row == range.end.row) {\n            return this.getLine(range.start.row)\n                .substring(range.start.column, range.end.column);\n        }\n        var lines = this.getLines(range.start.row, range.end.row);\n        lines[0] = (lines[0] || \"\").substring(range.start.column);\n        var l = lines.length - 1;\n        if (range.end.row - range.start.row == l)\n            lines[l] = lines[l].substring(0, range.end.column);\n        return lines.join(this.getNewLineCharacter());\n    };\n\n    this.$clipPosition = function(position) {\n        var length = this.getLength();\n        if (position.row >= length) {\n            position.row = Math.max(0, length - 1);\n            position.column = this.getLine(length-1).length;\n        } else if (position.row < 0)\n            position.row = 0;\n        return position;\n    };\n    this.insert = function(position, text) {\n        if (!text || text.length === 0)\n            return position;\n\n        position = this.$clipPosition(position);\n        if (this.getLength() <= 1)\n            this.$detectNewLine(text);\n\n        var lines = this.$split(text);\n        var firstLine = lines.splice(0, 1)[0];\n        var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];\n\n        position = this.insertInLine(position, firstLine);\n        if (lastLine !== null) {\n            position = this.insertNewLine(position); // terminate first line\n            position = this._insertLines(position.row, lines);\n            position = this.insertInLine(position, lastLine || \"\");\n        }\n        return position;\n    };\n    this.insertLines = function(row, lines) {\n        if (row >= this.getLength())\n            return this.insert({row: row, column: 0}, \"\\n\" + lines.join(\"\\n\"));\n        return this._insertLines(Math.max(row, 0), lines);\n    };\n    this._insertLines = function(row, lines) {\n        if (lines.length == 0)\n            return {row: row, column: 0};\n        if (lines.length > 0xFFFF) {\n            var end = this._insertLines(row, lines.slice(0xFFFF));\n            lines = lines.slice(0, 0xFFFF);\n        }\n\n        var args = [row, 0];\n        args.push.apply(args, lines);\n        this.$lines.splice.apply(this.$lines, args);\n\n        var range = new Range(row, 0, row + lines.length, 0);\n        var delta = {\n            action: \"insertLines\",\n            range: range,\n            lines: lines\n        };\n        this._emit(\"change\", { data: delta });\n        return end || range.end;\n    };\n    this.insertNewLine = function(position) {\n        position = this.$clipPosition(position);\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column);\n        this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));\n\n        var end = {\n            row : position.row + 1,\n            column : 0\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: this.getNewLineCharacter()\n        };\n        this._emit(\"change\", { data: delta });\n\n        return end;\n    };\n    this.insertInLine = function(position, text) {\n        if (text.length == 0)\n            return position;\n\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column) + text\n                + line.substring(position.column);\n\n        var end = {\n            row : position.row,\n            column : position.column + text.length\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: text\n        };\n        this._emit(\"change\", { data: delta });\n\n        return end;\n    };\n    this.remove = function(range) {\n        if (!range instanceof Range)\n            range = Range.fromPoints(range.start, range.end);\n        range.start = this.$clipPosition(range.start);\n        range.end = this.$clipPosition(range.end);\n\n        if (range.isEmpty())\n            return range.start;\n\n        var firstRow = range.start.row;\n        var lastRow = range.end.row;\n\n        if (range.isMultiLine()) {\n            var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;\n            var lastFullRow = lastRow - 1;\n\n            if (range.end.column > 0)\n                this.removeInLine(lastRow, 0, range.end.column);\n\n            if (lastFullRow >= firstFullRow)\n                this._removeLines(firstFullRow, lastFullRow);\n\n            if (firstFullRow != firstRow) {\n                this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);\n                this.removeNewLine(range.start.row);\n            }\n        }\n        else {\n            this.removeInLine(firstRow, range.start.column, range.end.column);\n        }\n        return range.start;\n    };\n    this.removeInLine = function(row, startColumn, endColumn) {\n        if (startColumn == endColumn)\n            return;\n\n        var range = new Range(row, startColumn, row, endColumn);\n        var line = this.getLine(row);\n        var removed = line.substring(startColumn, endColumn);\n        var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);\n        this.$lines.splice(row, 1, newLine);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: removed\n        };\n        this._emit(\"change\", { data: delta });\n        return range.start;\n    };\n    this.removeLines = function(firstRow, lastRow) {\n        if (firstRow < 0 || lastRow >= this.getLength())\n            return this.remove(new Range(firstRow, 0, lastRow + 1, 0));\n        return this._removeLines(firstRow, lastRow);\n    };\n\n    this._removeLines = function(firstRow, lastRow) {\n        var range = new Range(firstRow, 0, lastRow + 1, 0);\n        var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);\n\n        var delta = {\n            action: \"removeLines\",\n            range: range,\n            nl: this.getNewLineCharacter(),\n            lines: removed\n        };\n        this._emit(\"change\", { data: delta });\n        return removed;\n    };\n    this.removeNewLine = function(row) {\n        var firstLine = this.getLine(row);\n        var secondLine = this.getLine(row+1);\n\n        var range = new Range(row, firstLine.length, row+1, 0);\n        var line = firstLine + secondLine;\n\n        this.$lines.splice(row, 2, line);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: this.getNewLineCharacter()\n        };\n        this._emit(\"change\", { data: delta });\n    };\n    this.replace = function(range, text) {\n        if (!range instanceof Range)\n            range = Range.fromPoints(range.start, range.end);\n        if (text.length == 0 && range.isEmpty())\n            return range.start;\n        if (text == this.getTextRange(range))\n            return range.end;\n\n        this.remove(range);\n        if (text) {\n            var end = this.insert(range.start, text);\n        }\n        else {\n            end = range.start;\n        }\n\n        return end;\n    };\n    this.applyDeltas = function(deltas) {\n        for (var i=0; i<deltas.length; i++) {\n            var delta = deltas[i];\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"insertText\")\n                this.insert(range.start, delta.text);\n            else if (delta.action == \"removeLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"removeText\")\n                this.remove(range);\n        }\n    };\n    this.revertDeltas = function(deltas) {\n        for (var i=deltas.length-1; i>=0; i--) {\n            var delta = deltas[i];\n\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"insertText\")\n                this.remove(range);\n            else if (delta.action == \"removeLines\")\n                this._insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"removeText\")\n                this.insert(range.start, delta.text);\n        }\n    };\n    this.indexToPosition = function(index, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        for (var i = startRow || 0, l = lines.length; i < l; i++) {\n            index -= lines[i].length + newlineLength;\n            if (index < 0)\n                return {row: i, column: index + lines[i].length + newlineLength};\n        }\n        return {row: l-1, column: lines[l-1].length};\n    };\n    this.positionToIndex = function(pos, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        var index = 0;\n        var row = Math.min(pos.row, lines.length);\n        for (var i = startRow || 0; i < row; ++i)\n            index += lines[i].length + newlineLength;\n\n        return index + pos.column;\n    };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\ndefine('ace/lib/event_emitter', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nvar EventEmitter = {};\nvar stopPropagation = function() { this.propagationStopped = true; };\nvar preventDefault = function() { this.defaultPrevented = true; };\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n    this._eventRegistry || (this._eventRegistry = {});\n    this._defaultHandlers || (this._defaultHandlers = {});\n\n    var listeners = this._eventRegistry[eventName] || [];\n    var defaultHandler = this._defaultHandlers[eventName];\n    if (!listeners.length && !defaultHandler)\n        return;\n\n    if (typeof e != \"object\" || !e)\n        e = {};\n\n    if (!e.type)\n        e.type = eventName;\n    if (!e.stopPropagation)\n        e.stopPropagation = stopPropagation;\n    if (!e.preventDefault)\n        e.preventDefault = preventDefault;\n\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++) {\n        listeners[i](e, this);\n        if (e.propagationStopped)\n            break;\n    }\n    \n    if (defaultHandler && !e.defaultPrevented)\n        return defaultHandler(e, this);\n};\n\n\nEventEmitter._signal = function(eventName, e) {\n    var listeners = (this._eventRegistry || {})[eventName];\n    if (!listeners)\n        return;\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++)\n        listeners[i](e, this);\n};\n\nEventEmitter.once = function(eventName, callback) {\n    var _self = this;\n    callback && this.addEventListener(eventName, function newCallback() {\n        _self.removeEventListener(eventName, newCallback);\n        callback.apply(null, arguments);\n    });\n};\n\n\nEventEmitter.setDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        handlers = this._defaultHandlers = {_disabled_: {}};\n    \n    if (handlers[eventName]) {\n        var old = handlers[eventName];\n        var disabled = handlers._disabled_[eventName];\n        if (!disabled)\n            handlers._disabled_[eventName] = disabled = [];\n        disabled.push(old);\n        var i = disabled.indexOf(callback);\n        if (i != -1) \n            disabled.splice(i, 1);\n    }\n    handlers[eventName] = callback;\n};\nEventEmitter.removeDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        return;\n    var disabled = handlers._disabled_[eventName];\n    \n    if (handlers[eventName] == callback) {\n        var old = handlers[eventName];\n        if (disabled)\n            this.setDefaultHandler(eventName, disabled.pop());\n    } else if (disabled) {\n        var i = disabled.indexOf(callback);\n        if (i != -1)\n            disabled.splice(i, 1);\n    }\n};\n\nEventEmitter.on =\nEventEmitter.addEventListener = function(eventName, callback, capturing) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        listeners = this._eventRegistry[eventName] = [];\n\n    if (listeners.indexOf(callback) == -1)\n        listeners[capturing ? \"unshift\" : \"push\"](callback);\n    return callback;\n};\n\nEventEmitter.off =\nEventEmitter.removeListener =\nEventEmitter.removeEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        return;\n\n    var index = listeners.indexOf(callback);\n    if (index !== -1)\n        listeners.splice(index, 1);\n};\n\nEventEmitter.removeAllListeners = function(eventName) {\n    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n};\n\nexports.EventEmitter = EventEmitter;\n\n});\n\ndefine('ace/range', ['require', 'exports', 'module' ], function(require, exports, module) {\n\nvar comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n    this.start = {\n        row: startRow,\n        column: startColumn\n    };\n\n    this.end = {\n        row: endRow,\n        column: endColumn\n    };\n};\n\n(function() {\n    this.isEqual = function(range) {\n        return this.start.row === range.start.row &&\n            this.end.row === range.end.row &&\n            this.start.column === range.start.column &&\n            this.end.column === range.end.column;\n    };\n    this.toString = function() {\n        return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n            \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n    };\n\n    this.contains = function(row, column) {\n        return this.compare(row, column) == 0;\n    };\n    this.compareRange = function(range) {\n        var cmp,\n            end = range.end,\n            start = range.start;\n\n        cmp = this.compare(end.row, end.column);\n        if (cmp == 1) {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == 1) {\n                return 2;\n            } else if (cmp == 0) {\n                return 1;\n            } else {\n                return 0;\n            }\n        } else if (cmp == -1) {\n            return -2;\n        } else {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == -1) {\n                return -1;\n            } else if (cmp == 1) {\n                return 42;\n            } else {\n                return 0;\n            }\n        }\n    };\n    this.comparePoint = function(p) {\n        return this.compare(p.row, p.column);\n    };\n    this.containsRange = function(range) {\n        return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n    };\n    this.intersects = function(range) {\n        var cmp = this.compareRange(range);\n        return (cmp == -1 || cmp == 0 || cmp == 1);\n    };\n    this.isEnd = function(row, column) {\n        return this.end.row == row && this.end.column == column;\n    };\n    this.isStart = function(row, column) {\n        return this.start.row == row && this.start.column == column;\n    };\n    this.setStart = function(row, column) {\n        if (typeof row == \"object\") {\n            this.start.column = row.column;\n            this.start.row = row.row;\n        } else {\n            this.start.row = row;\n            this.start.column = column;\n        }\n    };\n    this.setEnd = function(row, column) {\n        if (typeof row == \"object\") {\n            this.end.column = row.column;\n            this.end.row = row.row;\n        } else {\n            this.end.row = row;\n            this.end.column = column;\n        }\n    };\n    this.inside = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column) || this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideStart = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideEnd = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.compare = function(row, column) {\n        if (!this.isMultiLine()) {\n            if (row === this.start.row) {\n                return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n            };\n        }\n\n        if (row < this.start.row)\n            return -1;\n\n        if (row > this.end.row)\n            return 1;\n\n        if (this.start.row === row)\n            return column >= this.start.column ? 0 : -1;\n\n        if (this.end.row === row)\n            return column <= this.end.column ? 0 : 1;\n\n        return 0;\n    };\n    this.compareStart = function(row, column) {\n        if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareEnd = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareInside = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.clipRows = function(firstRow, lastRow) {\n        if (this.end.row > lastRow)\n            var end = {row: lastRow + 1, column: 0};\n        else if (this.end.row < firstRow)\n            var end = {row: firstRow, column: 0};\n\n        if (this.start.row > lastRow)\n            var start = {row: lastRow + 1, column: 0};\n        else if (this.start.row < firstRow)\n            var start = {row: firstRow, column: 0};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n    this.extend = function(row, column) {\n        var cmp = this.compare(row, column);\n\n        if (cmp == 0)\n            return this;\n        else if (cmp == -1)\n            var start = {row: row, column: column};\n        else\n            var end = {row: row, column: column};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n\n    this.isEmpty = function() {\n        return (this.start.row === this.end.row && this.start.column === this.end.column);\n    };\n    this.isMultiLine = function() {\n        return (this.start.row !== this.end.row);\n    };\n    this.clone = function() {\n        return Range.fromPoints(this.start, this.end);\n    };\n    this.collapseRows = function() {\n        if (this.end.column == 0)\n            return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)\n        else\n            return new Range(this.start.row, 0, this.end.row, 0)\n    };\n    this.toScreenRange = function(session) {\n        var screenPosStart = session.documentToScreenPosition(this.start);\n        var screenPosEnd = session.documentToScreenPosition(this.end);\n\n        return new Range(\n            screenPosStart.row, screenPosStart.column,\n            screenPosEnd.row, screenPosEnd.column\n        );\n    };\n    this.moveBy = function(row, column) {\n        this.start.row += row;\n        this.start.column += column;\n        this.end.row += row;\n        this.end.column += column;\n    };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n    return new Range(start.row, start.column, end.row, end.column);\n};\nRange.comparePoints = comparePoints;\n\nRange.comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\n\n\nexports.Range = Range;\n});\n\ndefine('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n    this.$onChange = this.onChange.bind(this);\n    this.attach(doc);\n    \n    if (typeof column == \"undefined\")\n        this.setPosition(row.row, row.column);\n    else\n        this.setPosition(row, column);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.getPosition = function() {\n        return this.$clipPositionToDocument(this.row, this.column);\n    };\n    this.getDocument = function() {\n        return this.document;\n    };\n    this.$insertRight = false;\n    this.onChange = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n\n        if (range.start.row == range.end.row && range.start.row != this.row)\n            return;\n\n        if (range.start.row > this.row)\n            return;\n\n        if (range.start.row == this.row && range.start.column > this.column)\n            return;\n\n        var row = this.row;\n        var column = this.column;\n        var start = range.start;\n        var end = range.end;\n\n        if (delta.action === \"insertText\") {\n            if (start.row === row && start.column <= column) {\n                if (start.column === column && this.$insertRight) {\n                } else if (start.row === end.row) {\n                    column += end.column - start.column;\n                } else {\n                    column -= start.column;\n                    row += end.row - start.row;\n                }\n            } else if (start.row !== end.row && start.row < row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"insertLines\") {\n            if (start.row <= row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"removeText\") {\n            if (start.row === row && start.column < column) {\n                if (end.column >= column)\n                    column = start.column;\n                else\n                    column = Math.max(0, column - (end.column - start.column));\n\n            } else if (start.row !== end.row && start.row < row) {\n                if (end.row === row)\n                    column = Math.max(0, column - end.column) + start.column;\n                row -= (end.row - start.row);\n            } else if (end.row === row) {\n                row -= end.row - start.row;\n                column = Math.max(0, column - end.column) + start.column;\n            }\n        } else if (delta.action == \"removeLines\") {\n            if (start.row <= row) {\n                if (end.row <= row)\n                    row -= end.row - start.row;\n                else {\n                    row = start.row;\n                    column = 0;\n                }\n            }\n        }\n\n        this.setPosition(row, column, true);\n    };\n    this.setPosition = function(row, column, noClip) {\n        var pos;\n        if (noClip) {\n            pos = {\n                row: row,\n                column: column\n            };\n        } else {\n            pos = this.$clipPositionToDocument(row, column);\n        }\n\n        if (this.row == pos.row && this.column == pos.column)\n            return;\n\n        var old = {\n            row: this.row,\n            column: this.column\n        };\n\n        this.row = pos.row;\n        this.column = pos.column;\n        this._emit(\"change\", {\n            old: old,\n            value: pos\n        });\n    };\n    this.detach = function() {\n        this.document.removeEventListener(\"change\", this.$onChange);\n    };\n    this.attach = function(doc) {\n        this.document = doc || this.document;\n        this.document.on(\"change\", this.$onChange);\n    };\n    this.$clipPositionToDocument = function(row, column) {\n        var pos = {};\n\n        if (row >= this.document.getLength()) {\n            pos.row = Math.max(0, this.document.getLength() - 1);\n            pos.column = this.document.getLine(pos.row).length;\n        }\n        else if (row < 0) {\n            pos.row = 0;\n            pos.column = 0;\n        }\n        else {\n            pos.row = row;\n            pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n        }\n\n        if (column < 0)\n            pos.column = 0;\n\n        return pos;\n    };\n\n}).call(Anchor.prototype);\n\n});\ndefine('ace/mode/css/csslint', ['require', 'exports', 'module' ], function(require, exports, module) {\nvar parserlib = {};\n(function(){\nfunction EventTarget(){\n    this._listeners = {};    \n}\n\nEventTarget.prototype = {\n    constructor: EventTarget,\n    addListener: function(type, listener){\n        if (!this._listeners[type]){\n            this._listeners[type] = [];\n        }\n\n        this._listeners[type].push(listener);\n    },    \n    fire: function(event){\n        if (typeof event == \"string\"){\n            event = { type: event };\n        }\n        if (typeof event.target != \"undefined\"){\n            event.target = this;\n        }\n        \n        if (typeof event.type == \"undefined\"){\n            throw new Error(\"Event object missing 'type' property.\");\n        }\n        \n        if (this._listeners[event.type]){\n            var listeners = this._listeners[event.type].concat();\n            for (var i=0, len=listeners.length; i < len; i++){\n                listeners[i].call(this, event);\n            }\n        }            \n    },\n    removeListener: function(type, listener){\n        if (this._listeners[type]){\n            var listeners = this._listeners[type];\n            for (var i=0, len=listeners.length; i < len; i++){\n                if (listeners[i] === listener){\n                    listeners.splice(i, 1);\n                    break;\n                }\n            }\n            \n            \n        }            \n    }\n};\nfunction StringReader(text){\n    this._input = text.replace(/\\n\\r?/g, \"\\n\");\n    this._line = 1;\n    this._col = 1;\n    this._cursor = 0;\n}\n\nStringReader.prototype = {\n    constructor: StringReader,\n    getCol: function(){\n        return this._col;\n    },\n    getLine: function(){\n        return this._line ;\n    },\n    eof: function(){\n        return (this._cursor == this._input.length);\n    },\n    peek: function(count){\n        var c = null;\n        count = (typeof count == \"undefined\" ? 1 : count);\n        if (this._cursor < this._input.length){\n            c = this._input.charAt(this._cursor + count - 1);\n        }\n\n        return c;\n    },\n    read: function(){\n        var c = null;\n        if (this._cursor < this._input.length){\n            if (this._input.charAt(this._cursor) == \"\\n\"){\n                this._line++;\n                this._col=1;\n            } else {\n                this._col++;\n            }\n            c = this._input.charAt(this._cursor++);\n        }\n\n        return c;\n    },\n    mark: function(){\n        this._bookmark = {\n            cursor: this._cursor,\n            line:   this._line,\n            col:    this._col\n        };\n    },\n\n    reset: function(){\n        if (this._bookmark){\n            this._cursor = this._bookmark.cursor;\n            this._line = this._bookmark.line;\n            this._col = this._bookmark.col;\n            delete this._bookmark;\n        }\n    },\n    readTo: function(pattern){\n\n        var buffer = \"\",\n            c;\n        while (buffer.length < pattern.length || buffer.lastIndexOf(pattern) != buffer.length - pattern.length){\n            c = this.read();\n            if (c){\n                buffer += c;\n            } else {\n                throw new Error(\"Expected \\\"\" + pattern + \"\\\" at line \" + this._line  + \", col \" + this._col + \".\");\n            }\n        }\n\n        return buffer;\n\n    },\n    readWhile: function(filter){\n\n        var buffer = \"\",\n            c = this.read();\n\n        while(c !== null && filter(c)){\n            buffer += c;\n            c = this.read();\n        }\n\n        return buffer;\n\n    },\n    readMatch: function(matcher){\n\n        var source = this._input.substring(this._cursor),\n            value = null;\n        if (typeof matcher == \"string\"){\n            if (source.indexOf(matcher) === 0){\n                value = this.readCount(matcher.length);\n            }\n        } else if (matcher instanceof RegExp){\n            if (matcher.test(source)){\n                value = this.readCount(RegExp.lastMatch.length);\n            }\n        }\n\n        return value;\n    },\n    readCount: function(count){\n        var buffer = \"\";\n\n        while(count--){\n            buffer += this.read();\n        }\n\n        return buffer;\n    }\n\n};\nfunction SyntaxError(message, line, col){\n    this.col = col;\n    this.line = line;\n    this.message = message;\n\n}\nSyntaxError.prototype = new Error();\nfunction SyntaxUnit(text, line, col, type){\n    this.col = col;\n    this.line = line;\n    this.text = text;\n    this.type = type;\n}\nSyntaxUnit.fromToken = function(token){\n    return new SyntaxUnit(token.value, token.startLine, token.startCol);\n};\n\nSyntaxUnit.prototype = {\n    constructor: SyntaxUnit,\n    valueOf: function(){\n        return this.toString();\n    },\n    toString: function(){\n        return this.text;\n    }\n\n};\nfunction TokenStreamBase(input, tokenData){\n    this._reader = input ? new StringReader(input.toString()) : null;\n    this._token = null;\n    this._tokenData = tokenData;\n    this._lt = [];\n    this._ltIndex = 0;\n    \n    this._ltIndexCache = [];\n}\nTokenStreamBase.createTokenData = function(tokens){\n\n    var nameMap     = [],\n        typeMap     = {},\n        tokenData     = tokens.concat([]),\n        i            = 0,\n        len            = tokenData.length+1;\n    \n    tokenData.UNKNOWN = -1;\n    tokenData.unshift({name:\"EOF\"});\n\n    for (; i < len; i++){\n        nameMap.push(tokenData[i].name);\n        tokenData[tokenData[i].name] = i;\n        if (tokenData[i].text){\n            typeMap[tokenData[i].text] = i;\n        }\n    }\n    \n    tokenData.name = function(tt){\n        return nameMap[tt];\n    };\n    \n    tokenData.type = function(c){\n        return typeMap[c];\n    };\n    \n    return tokenData;\n};\n\nTokenStreamBase.prototype = {\n    constructor: TokenStreamBase,    \n    match: function(tokenTypes, channel){\n        if (!(tokenTypes instanceof Array)){\n            tokenTypes = [tokenTypes];\n        }\n                \n        var tt  = this.get(channel),\n            i   = 0,\n            len = tokenTypes.length;\n            \n        while(i < len){\n            if (tt == tokenTypes[i++]){\n                return true;\n            }\n        }\n        this.unget();\n        return false;\n    },        \n    mustMatch: function(tokenTypes, channel){\n\n        var token;\n        if (!(tokenTypes instanceof Array)){\n            tokenTypes = [tokenTypes];\n        }\n\n        if (!this.match.apply(this, arguments)){    \n            token = this.LT(1);\n            throw new SyntaxError(\"Expected \" + this._tokenData[tokenTypes[0]].name + \n                \" at line \" + token.startLine + \", col \" + token.startCol + \".\", token.startLine, token.startCol);\n        }\n    },\n    advance: function(tokenTypes, channel){\n        \n        while(this.LA(0) !== 0 && !this.match(tokenTypes, channel)){\n            this.get();\n        }\n\n        return this.LA(0);    \n    },      \n    get: function(channel){\n    \n        var tokenInfo   = this._tokenData,\n            reader      = this._reader,\n            value,\n            i           =0,\n            len         = tokenInfo.length,\n            found       = false,\n            token,\n            info;\n        if (this._lt.length && this._ltIndex >= 0 && this._ltIndex < this._lt.length){  \n                           \n            i++;\n            this._token = this._lt[this._ltIndex++];\n            info = tokenInfo[this._token.type];\n            while((info.channel !== undefined && channel !== info.channel) &&\n                    this._ltIndex < this._lt.length){\n                this._token = this._lt[this._ltIndex++];\n                info = tokenInfo[this._token.type];\n                i++;\n            }\n            if ((info.channel === undefined || channel === info.channel) &&\n                    this._ltIndex <= this._lt.length){\n                this._ltIndexCache.push(i);\n                return this._token.type;\n            }\n        }\n        token = this._getToken();\n        if (token.type > -1 && !tokenInfo[token.type].hide){\n            token.channel = tokenInfo[token.type].channel;\n            this._token = token;\n            this._lt.push(token);\n            this._ltIndexCache.push(this._lt.length - this._ltIndex + i);  \n            if (this._lt.length > 5){\n                this._lt.shift();                \n            }\n            if (this._ltIndexCache.length > 5){\n                this._ltIndexCache.shift();\n            }\n            this._ltIndex = this._lt.length;\n        }\n        info = tokenInfo[token.type];\n        if (info && \n                (info.hide || \n                (info.channel !== undefined && channel !== info.channel))){\n            return this.get(channel);\n        } else {\n            return token.type;\n        }\n    },\n    LA: function(index){\n        var total = index,\n            tt;\n        if (index > 0){\n            if (index > 5){\n                throw new Error(\"Too much lookahead.\");\n            }\n            while(total){\n                tt = this.get();   \n                total--;                            \n            }\n            while(total < index){\n                this.unget();\n                total++;\n            }\n        } else if (index < 0){\n        \n            if(this._lt[this._ltIndex+index]){\n                tt = this._lt[this._ltIndex+index].type;\n            } else {\n                throw new Error(\"Too much lookbehind.\");\n            }\n        \n        } else {\n            tt = this._token.type;\n        }\n        \n        return tt;\n    \n    },    \n    LT: function(index){\n        this.LA(index);\n        return this._lt[this._ltIndex+index-1];    \n    },\n    peek: function(){\n        return this.LA(1);\n    },\n    token: function(){\n        return this._token;\n    },\n    tokenName: function(tokenType){\n        if (tokenType < 0 || tokenType > this._tokenData.length){\n            return \"UNKNOWN_TOKEN\";\n        } else {\n            return this._tokenData[tokenType].name;\n        }\n    },    \n    tokenType: function(tokenName){\n        return this._tokenData[tokenName] || -1;\n    },      \n    unget: function(){\n        if (this._ltIndexCache.length){\n            this._ltIndex -= this._ltIndexCache.pop();//--;\n            this._token = this._lt[this._ltIndex - 1];\n        } else {\n            throw new Error(\"Too much lookahead.\");\n        }\n    }\n\n};\n\n\n\n\nparserlib.util = {\nStringReader: StringReader,\nSyntaxError : SyntaxError,\nSyntaxUnit  : SyntaxUnit,\nEventTarget : EventTarget,\nTokenStreamBase : TokenStreamBase\n};\n})();\n(function(){\nvar EventTarget = parserlib.util.EventTarget,\nTokenStreamBase = parserlib.util.TokenStreamBase,\nStringReader = parserlib.util.StringReader,\nSyntaxError = parserlib.util.SyntaxError,\nSyntaxUnit  = parserlib.util.SyntaxUnit;\n\n\nvar Colors = {\n    aliceblue       :\"#f0f8ff\",\n    antiquewhite    :\"#faebd7\",\n    aqua            :\"#00ffff\",\n    aquamarine      :\"#7fffd4\",\n    azure           :\"#f0ffff\",\n    beige           :\"#f5f5dc\",\n    bisque          :\"#ffe4c4\",\n    black           :\"#000000\",\n    blanchedalmond  :\"#ffebcd\",\n    blue            :\"#0000ff\",\n    blueviolet      :\"#8a2be2\",\n    brown           :\"#a52a2a\",\n    burlywood       :\"#deb887\",\n    cadetblue       :\"#5f9ea0\",\n    chartreuse      :\"#7fff00\",\n    chocolate       :\"#d2691e\",\n    coral           :\"#ff7f50\",\n    cornflowerblue  :\"#6495ed\",\n    cornsilk        :\"#fff8dc\",\n    crimson         :\"#dc143c\",\n    cyan            :\"#00ffff\",\n    darkblue        :\"#00008b\",\n    darkcyan        :\"#008b8b\",\n    darkgoldenrod   :\"#b8860b\",\n    darkgray        :\"#a9a9a9\",\n    darkgreen       :\"#006400\",\n    darkkhaki       :\"#bdb76b\",\n    darkmagenta     :\"#8b008b\",\n    darkolivegreen  :\"#556b2f\",\n    darkorange      :\"#ff8c00\",\n    darkorchid      :\"#9932cc\",\n    darkred         :\"#8b0000\",\n    darksalmon      :\"#e9967a\",\n    darkseagreen    :\"#8fbc8f\",\n    darkslateblue   :\"#483d8b\",\n    darkslategray   :\"#2f4f4f\",\n    darkturquoise   :\"#00ced1\",\n    darkviolet      :\"#9400d3\",\n    deeppink        :\"#ff1493\",\n    deepskyblue     :\"#00bfff\",\n    dimgray         :\"#696969\",\n    dodgerblue      :\"#1e90ff\",\n    firebrick       :\"#b22222\",\n    floralwhite     :\"#fffaf0\",\n    forestgreen     :\"#228b22\",\n    fuchsia         :\"#ff00ff\",\n    gainsboro       :\"#dcdcdc\",\n    ghostwhite      :\"#f8f8ff\",\n    gold            :\"#ffd700\",\n    goldenrod       :\"#daa520\",\n    gray            :\"#808080\",\n    green           :\"#008000\",\n    greenyellow     :\"#adff2f\",\n    honeydew        :\"#f0fff0\",\n    hotpink         :\"#ff69b4\",\n    indianred       :\"#cd5c5c\",\n    indigo          :\"#4b0082\",\n    ivory           :\"#fffff0\",\n    khaki           :\"#f0e68c\",\n    lavender        :\"#e6e6fa\",\n    lavenderblush   :\"#fff0f5\",\n    lawngreen       :\"#7cfc00\",\n    lemonchiffon    :\"#fffacd\",\n    lightblue       :\"#add8e6\",\n    lightcoral      :\"#f08080\",\n    lightcyan       :\"#e0ffff\",\n    lightgoldenrodyellow  :\"#fafad2\",\n    lightgray       :\"#d3d3d3\",\n    lightgreen      :\"#90ee90\",\n    lightpink       :\"#ffb6c1\",\n    lightsalmon     :\"#ffa07a\",\n    lightseagreen   :\"#20b2aa\",\n    lightskyblue    :\"#87cefa\",\n    lightslategray  :\"#778899\",\n    lightsteelblue  :\"#b0c4de\",\n    lightyellow     :\"#ffffe0\",\n    lime            :\"#00ff00\",\n    limegreen       :\"#32cd32\",\n    linen           :\"#faf0e6\",\n    magenta         :\"#ff00ff\",\n    maroon          :\"#800000\",\n    mediumaquamarine:\"#66cdaa\",\n    mediumblue      :\"#0000cd\",\n    mediumorchid    :\"#ba55d3\",\n    mediumpurple    :\"#9370d8\",\n    mediumseagreen  :\"#3cb371\",\n    mediumslateblue :\"#7b68ee\",\n    mediumspringgreen   :\"#00fa9a\",\n    mediumturquoise :\"#48d1cc\",\n    mediumvioletred :\"#c71585\",\n    midnightblue    :\"#191970\",\n    mintcream       :\"#f5fffa\",\n    mistyrose       :\"#ffe4e1\",\n    moccasin        :\"#ffe4b5\",\n    navajowhite     :\"#ffdead\",\n    navy            :\"#000080\",\n    oldlace         :\"#fdf5e6\",\n    olive           :\"#808000\",\n    olivedrab       :\"#6b8e23\",\n    orange          :\"#ffa500\",\n    orangered       :\"#ff4500\",\n    orchid          :\"#da70d6\",\n    palegoldenrod   :\"#eee8aa\",\n    palegreen       :\"#98fb98\",\n    paleturquoise   :\"#afeeee\",\n    palevioletred   :\"#d87093\",\n    papayawhip      :\"#ffefd5\",\n    peachpuff       :\"#ffdab9\",\n    peru            :\"#cd853f\",\n    pink            :\"#ffc0cb\",\n    plum            :\"#dda0dd\",\n    powderblue      :\"#b0e0e6\",\n    purple          :\"#800080\",\n    red             :\"#ff0000\",\n    rosybrown       :\"#bc8f8f\",\n    royalblue       :\"#4169e1\",\n    saddlebrown     :\"#8b4513\",\n    salmon          :\"#fa8072\",\n    sandybrown      :\"#f4a460\",\n    seagreen        :\"#2e8b57\",\n    seashell        :\"#fff5ee\",\n    sienna          :\"#a0522d\",\n    silver          :\"#c0c0c0\",\n    skyblue         :\"#87ceeb\",\n    slateblue       :\"#6a5acd\",\n    slategray       :\"#708090\",\n    snow            :\"#fffafa\",\n    springgreen     :\"#00ff7f\",\n    steelblue       :\"#4682b4\",\n    tan             :\"#d2b48c\",\n    teal            :\"#008080\",\n    thistle         :\"#d8bfd8\",\n    tomato          :\"#ff6347\",\n    turquoise       :\"#40e0d0\",\n    violet          :\"#ee82ee\",\n    wheat           :\"#f5deb3\",\n    white           :\"#ffffff\",\n    whitesmoke      :\"#f5f5f5\",\n    yellow          :\"#ffff00\",\n    yellowgreen     :\"#9acd32\",\n    activeBorder        :\"Active window border.\",\n    activecaption       :\"Active window caption.\",\n    appworkspace        :\"Background color of multiple document interface.\",\n    background          :\"Desktop background.\",\n    buttonface          :\"The face background color for 3-D elements that appear 3-D due to one layer of surrounding border.\",\n    buttonhighlight     :\"The color of the border facing the light source for 3-D elements that appear 3-D due to one layer of surrounding border.\",\n    buttonshadow        :\"The color of the border away from the light source for 3-D elements that appear 3-D due to one layer of surrounding border.\",\n    buttontext          :\"Text on push buttons.\",\n    captiontext         :\"Text in caption, size box, and scrollbar arrow box.\",\n    graytext            :\"Grayed (disabled) text. This color is set to #000 if the current display driver does not support a solid gray color.\",\n    highlight           :\"Item(s) selected in a control.\",\n    highlighttext       :\"Text of item(s) selected in a control.\",\n    inactiveborder      :\"Inactive window border.\",\n    inactivecaption     :\"Inactive window caption.\",\n    inactivecaptiontext :\"Color of text in an inactive caption.\",\n    infobackground      :\"Background color for tooltip controls.\",\n    infotext            :\"Text color for tooltip controls.\",\n    menu                :\"Menu background.\",\n    menutext            :\"Text in menus.\",\n    scrollbar           :\"Scroll bar gray area.\",\n    threeddarkshadow    :\"The color of the darker (generally outer) of the two borders away from the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.\",\n    threedface          :\"The face background color for 3-D elements that appear 3-D due to two concentric layers of surrounding border.\",\n    threedhighlight     :\"The color of the lighter (generally outer) of the two borders facing the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.\",\n    threedlightshadow   :\"The color of the darker (generally inner) of the two borders facing the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.\",\n    threedshadow        :\"The color of the lighter (generally inner) of the two borders away from the light source for 3-D elements that appear 3-D due to two concentric layers of surrounding border.\",\n    window              :\"Window background.\",\n    windowframe         :\"Window frame.\",\n    windowtext          :\"Text in windows.\"\n};\nfunction Combinator(text, line, col){\n    \n    SyntaxUnit.call(this, text, line, col, Parser.COMBINATOR_TYPE);\n    this.type = \"unknown\";\n    if (/^\\s+$/.test(text)){\n        this.type = \"descendant\";\n    } else if (text == \">\"){\n        this.type = \"child\";\n    } else if (text == \"+\"){\n        this.type = \"adjacent-sibling\";\n    } else if (text == \"~\"){\n        this.type = \"sibling\";\n    }\n\n}\n\nCombinator.prototype = new SyntaxUnit();\nCombinator.prototype.constructor = Combinator;\nfunction MediaFeature(name, value){\n    \n    SyntaxUnit.call(this, \"(\" + name + (value !== null ? \":\" + value : \"\") + \")\", name.startLine, name.startCol, Parser.MEDIA_FEATURE_TYPE);\n    this.name = name;\n    this.value = value;\n}\n\nMediaFeature.prototype = new SyntaxUnit();\nMediaFeature.prototype.constructor = MediaFeature;\nfunction MediaQuery(modifier, mediaType, features, line, col){\n    \n    SyntaxUnit.call(this, (modifier ? modifier + \" \": \"\") + (mediaType ? mediaType : \"\") + (mediaType && features.length > 0 ? \" and \" : \"\") + features.join(\" and \"), line, col, Parser.MEDIA_QUERY_TYPE);\n    this.modifier = modifier;\n    this.mediaType = mediaType;\n    this.features = features;\n\n}\n\nMediaQuery.prototype = new SyntaxUnit();\nMediaQuery.prototype.constructor = MediaQuery;\nfunction Parser(options){\n    EventTarget.call(this);\n\n\n    this.options = options || {};\n\n    this._tokenStream = null;\n}\nParser.DEFAULT_TYPE = 0;\nParser.COMBINATOR_TYPE = 1;\nParser.MEDIA_FEATURE_TYPE = 2;\nParser.MEDIA_QUERY_TYPE = 3;\nParser.PROPERTY_NAME_TYPE = 4;\nParser.PROPERTY_VALUE_TYPE = 5;\nParser.PROPERTY_VALUE_PART_TYPE = 6;\nParser.SELECTOR_TYPE = 7;\nParser.SELECTOR_PART_TYPE = 8;\nParser.SELECTOR_SUB_PART_TYPE = 9;\n\nParser.prototype = function(){\n\n    var proto = new EventTarget(),  //new prototype\n        prop,\n        additions =  {\n            constructor: Parser,\n            DEFAULT_TYPE : 0,\n            COMBINATOR_TYPE : 1,\n            MEDIA_FEATURE_TYPE : 2,\n            MEDIA_QUERY_TYPE : 3,\n            PROPERTY_NAME_TYPE : 4,\n            PROPERTY_VALUE_TYPE : 5,\n            PROPERTY_VALUE_PART_TYPE : 6,\n            SELECTOR_TYPE : 7,\n            SELECTOR_PART_TYPE : 8,\n            SELECTOR_SUB_PART_TYPE : 9,            \n        \n            _stylesheet: function(){ \n               \n                var tokenStream = this._tokenStream,\n                    charset     = null,\n                    count,\n                    token,\n                    tt;\n                    \n                this.fire(\"startstylesheet\");\n                this._charset();\n                \n                this._skipCruft();\n                while (tokenStream.peek() == Tokens.IMPORT_SYM){\n                    this._import();\n                    this._skipCruft();\n                }\n                while (tokenStream.peek() == Tokens.NAMESPACE_SYM){\n                    this._namespace();\n                    this._skipCruft();\n                }\n                tt = tokenStream.peek();\n                while(tt > Tokens.EOF){\n                \n                    try {\n                \n                        switch(tt){\n                            case Tokens.MEDIA_SYM:\n                                this._media();\n                                this._skipCruft();\n                                break;\n                            case Tokens.PAGE_SYM:\n                                this._page(); \n                                this._skipCruft();\n                                break;                   \n                            case Tokens.FONT_FACE_SYM:\n                                this._font_face(); \n                                this._skipCruft();\n                                break;  \n                            case Tokens.KEYFRAMES_SYM:\n                                this._keyframes(); \n                                this._skipCruft();\n                                break;                                \n                            case Tokens.UNKNOWN_SYM:  //unknown @ rule\n                                tokenStream.get();\n                                if (!this.options.strict){\n                                    this.fire({\n                                        type:       \"error\",\n                                        error:      null,\n                                        message:    \"Unknown @ rule: \" + tokenStream.LT(0).value + \".\",\n                                        line:       tokenStream.LT(0).startLine,\n                                        col:        tokenStream.LT(0).startCol\n                                    });                          \n                                    count=0;\n                                    while (tokenStream.advance([Tokens.LBRACE, Tokens.RBRACE]) == Tokens.LBRACE){\n                                        count++;    //keep track of nesting depth\n                                    }\n                                    \n                                    while(count){\n                                        tokenStream.advance([Tokens.RBRACE]);\n                                        count--;\n                                    }\n                                    \n                                } else {\n                                    throw new SyntaxError(\"Unknown @ rule.\", tokenStream.LT(0).startLine, tokenStream.LT(0).startCol);\n                                }                                \n                                break;\n                            case Tokens.S:\n                                this._readWhitespace();\n                                break;\n                            default:                            \n                                if(!this._ruleset()){\n                                    switch(tt){\n                                        case Tokens.CHARSET_SYM:\n                                            token = tokenStream.LT(1);\n                                            this._charset(false);\n                                            throw new SyntaxError(\"@charset not allowed here.\", token.startLine, token.startCol);\n                                        case Tokens.IMPORT_SYM:\n                                            token = tokenStream.LT(1);\n                                            this._import(false);\n                                            throw new SyntaxError(\"@import not allowed here.\", token.startLine, token.startCol);\n                                        case Tokens.NAMESPACE_SYM:\n                                            token = tokenStream.LT(1);\n                                            this._namespace(false);\n                                            throw new SyntaxError(\"@namespace not allowed here.\", token.startLine, token.startCol);\n                                        default:\n                                            tokenStream.get();  //get the last token\n                                            this._unexpectedToken(tokenStream.token());\n                                    }\n                                \n                                }\n                        }\n                    } catch(ex) {\n                        if (ex instanceof SyntaxError && !this.options.strict){\n                            this.fire({\n                                type:       \"error\",\n                                error:      ex,\n                                message:    ex.message,\n                                line:       ex.line,\n                                col:        ex.col\n                            });                     \n                        } else {\n                            throw ex;\n                        }\n                    }\n                    \n                    tt = tokenStream.peek();\n                }\n                \n                if (tt != Tokens.EOF){\n                    this._unexpectedToken(tokenStream.token());\n                }\n            \n                this.fire(\"endstylesheet\");\n            },\n            \n            _charset: function(emit){\n                var tokenStream = this._tokenStream,\n                    charset,\n                    token,\n                    line,\n                    col;\n                    \n                if (tokenStream.match(Tokens.CHARSET_SYM)){\n                    line = tokenStream.token().startLine;\n                    col = tokenStream.token().startCol;\n                \n                    this._readWhitespace();\n                    tokenStream.mustMatch(Tokens.STRING);\n                    \n                    token = tokenStream.token();\n                    charset = token.value;\n                    \n                    this._readWhitespace();\n                    tokenStream.mustMatch(Tokens.SEMICOLON);\n                    \n                    if (emit !== false){\n                        this.fire({ \n                            type:   \"charset\",\n                            charset:charset,\n                            line:   line,\n                            col:    col\n                        });\n                    }\n                }            \n            },\n            \n            _import: function(emit){    \n            \n                var tokenStream = this._tokenStream,\n                    tt,\n                    uri,\n                    importToken,\n                    mediaList   = [];\n                tokenStream.mustMatch(Tokens.IMPORT_SYM);\n                importToken = tokenStream.token();\n                this._readWhitespace();\n                \n                tokenStream.mustMatch([Tokens.STRING, Tokens.URI]);\n                uri = tokenStream.token().value.replace(/(?:url\\()?[\"']([^\"']+)[\"']\\)?/, \"$1\");                \n\n                this._readWhitespace();\n                \n                mediaList = this._media_query_list();\n                tokenStream.mustMatch(Tokens.SEMICOLON);\n                this._readWhitespace();\n                \n                if (emit !== false){\n                    this.fire({\n                        type:   \"import\",\n                        uri:    uri,\n                        media:  mediaList,\n                        line:   importToken.startLine,\n                        col:    importToken.startCol\n                    });\n                }\n        \n            },\n            \n            _namespace: function(emit){    \n            \n                var tokenStream = this._tokenStream,\n                    line,\n                    col,\n                    prefix,\n                    uri;\n                tokenStream.mustMatch(Tokens.NAMESPACE_SYM);\n                line = tokenStream.token().startLine;\n                col = tokenStream.token().startCol;\n                this._readWhitespace();\n                if (tokenStream.match(Tokens.IDENT)){\n                    prefix = tokenStream.token().value;\n                    this._readWhitespace();\n                }\n                \n                tokenStream.mustMatch([Tokens.STRING, Tokens.URI]);\n                uri = tokenStream.token().value.replace(/(?:url\\()?[\"']([^\"']+)[\"']\\)?/, \"$1\");                \n\n                this._readWhitespace();\n                tokenStream.mustMatch(Tokens.SEMICOLON);\n                this._readWhitespace();\n                \n                if (emit !== false){\n                    this.fire({\n                        type:   \"namespace\",\n                        prefix: prefix,\n                        uri:    uri,\n                        line:   line,\n                        col:    col\n                    });\n                }\n        \n            },            \n                       \n            _media: function(){\n                var tokenStream     = this._tokenStream,\n                    line,\n                    col,\n                    mediaList;//       = [];\n                tokenStream.mustMatch(Tokens.MEDIA_SYM);\n                line = tokenStream.token().startLine;\n                col = tokenStream.token().startCol;\n                \n                this._readWhitespace();               \n\n                mediaList = this._media_query_list();\n\n                tokenStream.mustMatch(Tokens.LBRACE);\n                this._readWhitespace();\n                \n                this.fire({\n                    type:   \"startmedia\",\n                    media:  mediaList,\n                    line:   line,\n                    col:    col\n                });\n                \n                while(true) {\n                    if (tokenStream.peek() == Tokens.PAGE_SYM){\n                        this._page();\n                    } else if (!this._ruleset()){\n                        break;\n                    }                \n                }\n                \n                tokenStream.mustMatch(Tokens.RBRACE);\n                this._readWhitespace();\n        \n                this.fire({\n                    type:   \"endmedia\",\n                    media:  mediaList,\n                    line:   line,\n                    col:    col\n                });\n            },                           \n            _media_query_list: function(){\n                var tokenStream = this._tokenStream,\n                    mediaList   = [];\n                \n                \n                this._readWhitespace();\n                \n                if (tokenStream.peek() == Tokens.IDENT || tokenStream.peek() == Tokens.LPAREN){\n                    mediaList.push(this._media_query());\n                }\n                \n                while(tokenStream.match(Tokens.COMMA)){\n                    this._readWhitespace();\n                    mediaList.push(this._media_query());\n                }\n                \n                return mediaList;\n            },\n            _media_query: function(){\n                var tokenStream = this._tokenStream,\n                    type        = null,\n                    ident       = null,\n                    token       = null,\n                    expressions = [];\n                    \n                if (tokenStream.match(Tokens.IDENT)){\n                    ident = tokenStream.token().value.toLowerCase();\n                    if (ident != \"only\" && ident != \"not\"){\n                        tokenStream.unget();\n                        ident = null;\n                    } else {\n                        token = tokenStream.token();\n                    }\n                }\n                                \n                this._readWhitespace();\n                \n                if (tokenStream.peek() == Tokens.IDENT){\n                    type = this._media_type();\n                    if (token === null){\n                        token = tokenStream.token();\n                    }\n                } else if (tokenStream.peek() == Tokens.LPAREN){\n                    if (token === null){\n                        token = tokenStream.LT(1);\n                    }\n                    expressions.push(this._media_expression());\n                }                               \n                \n                if (type === null && expressions.length === 0){\n                    return null;\n                } else {                \n                    this._readWhitespace();\n                    while (tokenStream.match(Tokens.IDENT)){\n                        if (tokenStream.token().value.toLowerCase() != \"and\"){\n                            this._unexpectedToken(tokenStream.token());\n                        }\n                        \n                        this._readWhitespace();\n                        expressions.push(this._media_expression());\n                    }\n                }\n\n                return new MediaQuery(ident, type, expressions, token.startLine, token.startCol);\n            },\n            _media_type: function(){\n                return this._media_feature();           \n            },\n            _media_expression: function(){\n                var tokenStream = this._tokenStream,\n                    feature     = null,\n                    token,\n                    expression  = null;\n                \n                tokenStream.mustMatch(Tokens.LPAREN);\n                \n                feature = this._media_feature();\n                this._readWhitespace();\n                \n                if (tokenStream.match(Tokens.COLON)){\n                    this._readWhitespace();\n                    token = tokenStream.LT(1);\n                    expression = this._expression();\n                }\n                \n                tokenStream.mustMatch(Tokens.RPAREN);\n                this._readWhitespace();\n\n                return new MediaFeature(feature, (expression ? new SyntaxUnit(expression, token.startLine, token.startCol) : null));            \n            },\n            _media_feature: function(){\n                var tokenStream = this._tokenStream;\n                    \n                tokenStream.mustMatch(Tokens.IDENT);\n                \n                return SyntaxUnit.fromToken(tokenStream.token());            \n            },\n            _page: function(){            \n                var tokenStream = this._tokenStream,\n                    line,\n                    col,\n                    identifier  = null,\n                    pseudoPage  = null;\n                tokenStream.mustMatch(Tokens.PAGE_SYM);\n                line = tokenStream.token().startLine;\n                col = tokenStream.token().startCol;\n                \n                this._readWhitespace();\n                \n                if (tokenStream.match(Tokens.IDENT)){\n                    identifier = tokenStream.token().value;\n                    if (identifier.toLowerCase() === \"auto\"){\n                        this._unexpectedToken(tokenStream.token());\n                    }\n                }                \n                if (tokenStream.peek() == Tokens.COLON){\n                    pseudoPage = this._pseudo_page();\n                }\n            \n                this._readWhitespace();\n                \n                this.fire({\n                    type:   \"startpage\",\n                    id:     identifier,\n                    pseudo: pseudoPage,\n                    line:   line,\n                    col:    col\n                });                   \n\n                this._readDeclarations(true, true);                \n                \n                this.fire({\n                    type:   \"endpage\",\n                    id:     identifier,\n                    pseudo: pseudoPage,\n                    line:   line,\n                    col:    col\n                });             \n            \n            },\n            _margin: function(){\n                var tokenStream = this._tokenStream,\n                    line,\n                    col,\n                    marginSym   = this._margin_sym();\n\n                if (marginSym){\n                    line = tokenStream.token().startLine;\n                    col = tokenStream.token().startCol;\n                \n                    this.fire({\n                        type: \"startpagemargin\",\n                        margin: marginSym,\n                        line:   line,\n                        col:    col\n                    });    \n                    \n                    this._readDeclarations(true);\n\n                    this.fire({\n                        type: \"endpagemargin\",\n                        margin: marginSym,\n                        line:   line,\n                        col:    col\n                    });    \n                    return true;\n                } else {\n                    return false;\n                }\n            },\n            _margin_sym: function(){\n            \n                var tokenStream = this._tokenStream;\n            \n                if(tokenStream.match([Tokens.TOPLEFTCORNER_SYM, Tokens.TOPLEFT_SYM,\n                        Tokens.TOPCENTER_SYM, Tokens.TOPRIGHT_SYM, Tokens.TOPRIGHTCORNER_SYM,\n                        Tokens.BOTTOMLEFTCORNER_SYM, Tokens.BOTTOMLEFT_SYM, \n                        Tokens.BOTTOMCENTER_SYM, Tokens.BOTTOMRIGHT_SYM,\n                        Tokens.BOTTOMRIGHTCORNER_SYM, Tokens.LEFTTOP_SYM, \n                        Tokens.LEFTMIDDLE_SYM, Tokens.LEFTBOTTOM_SYM, Tokens.RIGHTTOP_SYM,\n                        Tokens.RIGHTMIDDLE_SYM, Tokens.RIGHTBOTTOM_SYM]))\n                {\n                    return SyntaxUnit.fromToken(tokenStream.token());                \n                } else {\n                    return null;\n                }\n            \n            },\n            \n            _pseudo_page: function(){\n        \n                var tokenStream = this._tokenStream;\n                \n                tokenStream.mustMatch(Tokens.COLON);\n                tokenStream.mustMatch(Tokens.IDENT);\n                \n                return tokenStream.token().value;\n            },\n            \n            _font_face: function(){     \n                var tokenStream = this._tokenStream,\n                    line,\n                    col;\n                tokenStream.mustMatch(Tokens.FONT_FACE_SYM);\n                line = tokenStream.token().startLine;\n                col = tokenStream.token().startCol;\n                \n                this._readWhitespace();\n\n                this.fire({\n                    type:   \"startfontface\",\n                    line:   line,\n                    col:    col\n                });                    \n                \n                this._readDeclarations(true);\n                \n                this.fire({\n                    type:   \"endfontface\",\n                    line:   line,\n                    col:    col\n                });              \n            },\n\n            _operator: function(inFunction){    \n                 \n                var tokenStream = this._tokenStream,\n                    token       = null;\n                \n                if (tokenStream.match([Tokens.SLASH, Tokens.COMMA]) ||\n                    (inFunction && tokenStream.match([Tokens.PLUS, Tokens.STAR, Tokens.MINUS]))){\n                    token =  tokenStream.token();\n                    this._readWhitespace();\n                } \n                return token ? PropertyValuePart.fromToken(token) : null;\n                \n            },\n            \n            _combinator: function(){    \n                 \n                var tokenStream = this._tokenStream,\n                    value       = null,\n                    token;\n                \n                if(tokenStream.match([Tokens.PLUS, Tokens.GREATER, Tokens.TILDE])){                \n                    token = tokenStream.token();\n                    value = new Combinator(token.value, token.startLine, token.startCol);\n                    this._readWhitespace();\n                }\n                \n                return value;\n            },\n            \n            _unary_operator: function(){\n                 \n                var tokenStream = this._tokenStream;\n                \n                if (tokenStream.match([Tokens.MINUS, Tokens.PLUS])){\n                    return tokenStream.token().value;\n                } else {\n                    return null;\n                }         \n            },\n            \n            _property: function(){\n                 \n                var tokenStream = this._tokenStream,\n                    value       = null,\n                    hack        = null,\n                    tokenValue,\n                    token,\n                    line,\n                    col;\n                if (tokenStream.peek() == Tokens.STAR && this.options.starHack){\n                    tokenStream.get();\n                    token = tokenStream.token();\n                    hack = token.value;\n                    line = token.startLine;\n                    col = token.startCol;\n                }\n                \n                if(tokenStream.match(Tokens.IDENT)){\n                    token = tokenStream.token();\n                    tokenValue = token.value;\n                    if (tokenValue.charAt(0) == \"_\" && this.options.underscoreHack){\n                        hack = \"_\";\n                        tokenValue = tokenValue.substring(1);\n                    }\n                    \n                    value = new PropertyName(tokenValue, hack, (line||token.startLine), (col||token.startCol));\n                    this._readWhitespace();\n                }\n                \n                return value;\n            },\n            _ruleset: function(){    \n                 \n                var tokenStream = this._tokenStream,\n                    tt,\n                    selectors;\n                try {\n                    selectors = this._selectors_group();\n                } catch (ex){\n                    if (ex instanceof SyntaxError && !this.options.strict){\n                        this.fire({\n                            type:       \"error\",\n                            error:      ex,\n                            message:    ex.message,\n                            line:       ex.line,\n                            col:        ex.col\n                        });                          \n                        tt = tokenStream.advance([Tokens.RBRACE]);\n                        if (tt == Tokens.RBRACE){\n                        } else {\n                            throw ex;\n                        }                        \n                        \n                    } else {\n                        throw ex;\n                    }                \n                    return true;\n                }\n                if (selectors){ \n                                    \n                    this.fire({\n                        type:       \"startrule\",\n                        selectors:  selectors,\n                        line:       selectors[0].line,\n                        col:        selectors[0].col\n                    });                \n                    \n                    this._readDeclarations(true);                \n                    \n                    this.fire({\n                        type:       \"endrule\",\n                        selectors:  selectors,\n                        line:       selectors[0].line,\n                        col:        selectors[0].col\n                    });  \n                    \n                }\n                \n                return selectors;\n                \n            },\n            _selectors_group: function(){           \n                var tokenStream = this._tokenStream,\n                    selectors   = [],\n                    selector;\n                    \n                selector = this._selector();\n                if (selector !== null){\n                \n                    selectors.push(selector);\n                    while(tokenStream.match(Tokens.COMMA)){\n                        this._readWhitespace();\n                        selector = this._selector();\n                        if (selector !== null){\n                            selectors.push(selector);\n                        } else {\n                            this._unexpectedToken(tokenStream.LT(1));\n                        }\n                    }\n                }\n\n                return selectors.length ? selectors : null;\n            },\n            _selector: function(){\n                 \n                var tokenStream = this._tokenStream,\n                    selector    = [],\n                    nextSelector = null,\n                    combinator  = null,\n                    ws          = null;\n                nextSelector = this._simple_selector_sequence();\n                if (nextSelector === null){\n                    return null;\n                }\n                \n                selector.push(nextSelector);\n                \n                do {\n                    combinator = this._combinator();\n                    \n                    if (combinator !== null){\n                        selector.push(combinator);\n                        nextSelector = this._simple_selector_sequence();\n                        if (nextSelector === null){\n                            this._unexpectedToken(tokenStream.LT(1));\n                        } else {\n                            selector.push(nextSelector);\n                        }\n                    } else {\n                        if (this._readWhitespace()){           \n                            ws = new Combinator(tokenStream.token().value, tokenStream.token().startLine, tokenStream.token().startCol);\n                            combinator = this._combinator();\n                            nextSelector = this._simple_selector_sequence();\n                            if (nextSelector === null){                        \n                                if (combinator !== null){\n                                    this._unexpectedToken(tokenStream.LT(1));\n                                }\n                            } else {\n                                \n                                if (combinator !== null){\n                                    selector.push(combinator);\n                                } else {\n                                    selector.push(ws);\n                                }\n                                \n                                selector.push(nextSelector);\n                            }     \n                        } else {\n                            break;\n                        }               \n                    \n                    }\n                } while(true);\n                \n                return new Selector(selector, selector[0].line, selector[0].col);\n            },\n            _simple_selector_sequence: function(){\n                 \n                var tokenStream = this._tokenStream,\n                    elementName = null,\n                    modifiers   = [],\n                    selectorText= \"\",\n                    components  = [\n                        function(){\n                            return tokenStream.match(Tokens.HASH) ?\n                                    new SelectorSubPart(tokenStream.token().value, \"id\", tokenStream.token().startLine, tokenStream.token().startCol) :\n                                    null;\n                        },\n                        this._class,\n                        this._attrib,\n                        this._pseudo,\n                        this._negation\n                    ],\n                    i           = 0,\n                    len         = components.length,\n                    component   = null,\n                    found       = false,\n                    line,\n                    col;\n                line = tokenStream.LT(1).startLine;\n                col = tokenStream.LT(1).startCol;\n                                        \n                elementName = this._type_selector();\n                if (!elementName){\n                    elementName = this._universal();\n                }\n                \n                if (elementName !== null){\n                    selectorText += elementName;\n                }                \n                \n                while(true){\n                    if (tokenStream.peek() === Tokens.S){\n                        break;\n                    }\n                    while(i < len && component === null){\n                        component = components[i++].call(this);\n                    }\n        \n                    if (component === null){\n                        if (selectorText === \"\"){\n                            return null;\n                        } else {\n                            break;\n                        }\n                    } else {\n                        i = 0;\n                        modifiers.push(component);\n                        selectorText += component.toString(); \n                        component = null;\n                    }\n                }\n\n                 \n                return selectorText !== \"\" ?\n                        new SelectorPart(elementName, modifiers, selectorText, line, col) :\n                        null;\n            },            \n            _type_selector: function(){\n                 \n                var tokenStream = this._tokenStream,\n                    ns          = this._namespace_prefix(),\n                    elementName = this._element_name();\n                    \n                if (!elementName){                    \n                    if (ns){\n                        tokenStream.unget();\n                        if (ns.length > 1){\n                            tokenStream.unget();\n                        }\n                    }\n                \n                    return null;\n                } else {     \n                    if (ns){\n                        elementName.text = ns + elementName.text;\n                        elementName.col -= ns.length;\n                    }\n                    return elementName;\n                }\n            },\n            _class: function(){    \n                 \n                var tokenStream = this._tokenStream,\n                    token;\n                \n                if (tokenStream.match(Tokens.DOT)){\n                    tokenStream.mustMatch(Tokens.IDENT);    \n                    token = tokenStream.token();\n                    return new SelectorSubPart(\".\" + token.value, \"class\", token.startLine, token.startCol - 1);        \n                } else {\n                    return null;\n                }\n        \n            },\n            _element_name: function(){    \n                \n                var tokenStream = this._tokenStream,\n                    token;\n                \n                if (tokenStream.match(Tokens.IDENT)){\n                    token = tokenStream.token();\n                    return new SelectorSubPart(token.value, \"elementName\", token.startLine, token.startCol);        \n                \n                } else {\n                    return null;\n                }\n            },\n            _namespace_prefix: function(){\n                var tokenStream = this._tokenStream,\n                    value       = \"\";\n                if (tokenStream.LA(1) === Tokens.PIPE || tokenStream.LA(2) === Tokens.PIPE){\n                        \n                    if(tokenStream.match([Tokens.IDENT, Tokens.STAR])){\n                        value += tokenStream.token().value;\n                    }\n                    \n                    tokenStream.mustMatch(Tokens.PIPE);\n                    value += \"|\";\n                    \n                }\n                \n                return value.length ? value : null;                \n            },\n            _universal: function(){\n                var tokenStream = this._tokenStream,\n                    value       = \"\",\n                    ns;\n                    \n                ns = this._namespace_prefix();\n                if(ns){\n                    value += ns;\n                }\n                \n                if(tokenStream.match(Tokens.STAR)){\n                    value += \"*\";\n                }\n                \n                return value.length ? value : null;\n                \n           },\n            _attrib: function(){\n                 \n                var tokenStream = this._tokenStream,\n                    value       = null,\n                    ns,\n                    token;\n                \n                if (tokenStream.match(Tokens.LBRACKET)){\n                    token = tokenStream.token();\n                    value = token.value;\n                    value += this._readWhitespace();\n                    \n                    ns = this._namespace_prefix();\n                    \n                    if (ns){\n                        value += ns;\n                    }\n                                        \n                    tokenStream.mustMatch(Tokens.IDENT);\n                    value += tokenStream.token().value;                    \n                    value += this._readWhitespace();\n                    \n                    if(tokenStream.match([Tokens.PREFIXMATCH, Tokens.SUFFIXMATCH, Tokens.SUBSTRINGMATCH,\n                            Tokens.EQUALS, Tokens.INCLUDES, Tokens.DASHMATCH])){\n                    \n                        value += tokenStream.token().value;                    \n                        value += this._readWhitespace();\n                        \n                        tokenStream.mustMatch([Tokens.IDENT, Tokens.STRING]);\n                        value += tokenStream.token().value;                    \n                        value += this._readWhitespace();\n                    }\n                    \n                    tokenStream.mustMatch(Tokens.RBRACKET);\n                                        \n                    return new SelectorSubPart(value + \"]\", \"attribute\", token.startLine, token.startCol);\n                } else {\n                    return null;\n                }\n            },\n            _pseudo: function(){   \n            \n                var tokenStream = this._tokenStream,\n                    pseudo      = null,\n                    colons      = \":\",\n                    line,\n                    col;\n                \n                if (tokenStream.match(Tokens.COLON)){\n                \n                    if (tokenStream.match(Tokens.COLON)){\n                        colons += \":\";\n                    }\n                \n                    if (tokenStream.match(Tokens.IDENT)){\n                        pseudo = tokenStream.token().value;\n                        line = tokenStream.token().startLine;\n                        col = tokenStream.token().startCol - colons.length;\n                    } else if (tokenStream.peek() == Tokens.FUNCTION){\n                        line = tokenStream.LT(1).startLine;\n                        col = tokenStream.LT(1).startCol - colons.length;\n                        pseudo = this._functional_pseudo();\n                    }\n                    \n                    if (pseudo){\n                        pseudo = new SelectorSubPart(colons + pseudo, \"pseudo\", line, col);\n                    }\n                }\n        \n                return pseudo;\n            },\n            _functional_pseudo: function(){            \n                \n                var tokenStream = this._tokenStream,\n                    value = null;\n                \n                if(tokenStream.match(Tokens.FUNCTION)){\n                    value = tokenStream.token().value;\n                    value += this._readWhitespace();\n                    value += this._expression();\n                    tokenStream.mustMatch(Tokens.RPAREN);\n                    value += \")\";\n                }\n                \n                return value;\n            },\n            _expression: function(){\n                 \n                var tokenStream = this._tokenStream,\n                    value       = \"\";\n                    \n                while(tokenStream.match([Tokens.PLUS, Tokens.MINUS, Tokens.DIMENSION,\n                        Tokens.NUMBER, Tokens.STRING, Tokens.IDENT, Tokens.LENGTH,\n                        Tokens.FREQ, Tokens.ANGLE, Tokens.TIME,\n                        Tokens.RESOLUTION, Tokens.SLASH])){\n                    \n                    value += tokenStream.token().value;\n                    value += this._readWhitespace();                        \n                }\n                \n                return value.length ? value : null;\n                \n            },\n            _negation: function(){\n\n                var tokenStream = this._tokenStream,\n                    line,\n                    col,\n                    value       = \"\",\n                    arg,\n                    subpart     = null;\n                    \n                if (tokenStream.match(Tokens.NOT)){\n                    value = tokenStream.token().value;\n                    line = tokenStream.token().startLine;\n                    col = tokenStream.token().startCol;\n                    value += this._readWhitespace();\n                    arg = this._negation_arg();\n                    value += arg;\n                    value += this._readWhitespace();\n                    tokenStream.match(Tokens.RPAREN);\n                    value += tokenStream.token().value;\n                    \n                    subpart = new SelectorSubPart(value, \"not\", line, col);\n                    subpart.args.push(arg);\n                }\n                \n                return subpart;\n            },\n            _negation_arg: function(){                       \n                 \n                var tokenStream = this._tokenStream,\n                    args        = [\n                        this._type_selector,\n                        this._universal,\n                        function(){\n                            return tokenStream.match(Tokens.HASH) ?\n                                    new SelectorSubPart(tokenStream.token().value, \"id\", tokenStream.token().startLine, tokenStream.token().startCol) :\n                                    null;                        \n                        },\n                        this._class,\n                        this._attrib,\n                        this._pseudo                    \n                    ],\n                    arg         = null,\n                    i           = 0,\n                    len         = args.length,\n                    elementName,\n                    line,\n                    col,\n                    part;\n                    \n                line = tokenStream.LT(1).startLine;\n                col = tokenStream.LT(1).startCol;\n                \n                while(i < len && arg === null){\n                    \n                    arg = args[i].call(this);\n                    i++;\n                }\n                if (arg === null){\n                    this._unexpectedToken(tokenStream.LT(1));\n                }\n                if (arg.type == \"elementName\"){\n                    part = new SelectorPart(arg, [], arg.toString(), line, col);\n                } else {\n                    part = new SelectorPart(null, [arg], arg.toString(), line, col);\n                }\n                \n                return part;                \n            },\n            \n            _declaration: function(){    \n            \n                var tokenStream = this._tokenStream,\n                    property    = null,\n                    expr        = null,\n                    prio        = null,\n                    error       = null,\n                    invalid     = null,\n                    propertyName= \"\";\n                \n                property = this._property();\n                if (property !== null){\n\n                    tokenStream.mustMatch(Tokens.COLON);\n                    this._readWhitespace();\n                    \n                    expr = this._expr();\n                    if (!expr || expr.length === 0){\n                        this._unexpectedToken(tokenStream.LT(1));\n                    }\n                    \n                    prio = this._prio();\n                    propertyName = property.toString();\n                    if (this.options.starHack && property.hack == \"*\" ||\n                            this.options.underscoreHack && property.hack == \"_\") {\n                         \n                        propertyName = property.text;\n                    }\n                    \n                    try {\n                        this._validateProperty(propertyName, expr);\n                    } catch (ex) {\n                        invalid = ex;\n                    }\n                    \n                    this.fire({\n                        type:       \"property\",\n                        property:   property,\n                        value:      expr,\n                        important:  prio,\n                        line:       property.line,\n                        col:        property.col,\n                        invalid:    invalid\n                    });                      \n                    \n                    return true;\n                } else {\n                    return false;\n                }\n            },\n            \n            _prio: function(){\n                 \n                var tokenStream = this._tokenStream,\n                    result      = tokenStream.match(Tokens.IMPORTANT_SYM);\n                    \n                this._readWhitespace();\n                return result;\n            },\n            \n            _expr: function(inFunction){\n        \n                var tokenStream = this._tokenStream,\n                    values      = [],\n                    value       = null,\n                    operator    = null;\n                    \n                value = this._term();\n                if (value !== null){\n                \n                    values.push(value);\n                    \n                    do {\n                        operator = this._operator(inFunction);\n                        if (operator){\n                            values.push(operator);\n                        } /*else {\n\t\t\t\t\t\t\tvalues.push(new PropertyValue(valueParts, valueParts[0].line, valueParts[0].col));\n\t\t\t\t\t\t\tvalueParts = [];\n\t\t\t\t\t\t}*/\n                        \n                        value = this._term();\n                        \n                        if (value === null){\n                            break;\n                        } else {\n                            values.push(value);\n                        }\n                    } while(true);\n                }\n        \n                return values.length > 0 ? new PropertyValue(values, values[0].line, values[0].col) : null;\n            },\n            \n            _term: function(){                           \n        \n                var tokenStream = this._tokenStream,\n                    unary       = null,\n                    value       = null,\n                    token,\n                    line,\n                    col;\n                unary = this._unary_operator();\n                if (unary !== null){\n                    line = tokenStream.token().startLine;\n                    col = tokenStream.token().startCol;\n                }                \n                if (tokenStream.peek() == Tokens.IE_FUNCTION && this.options.ieFilters){\n                \n                    value = this._ie_function();\n                    if (unary === null){\n                        line = tokenStream.token().startLine;\n                        col = tokenStream.token().startCol;\n                    }\n                } else if (tokenStream.match([Tokens.NUMBER, Tokens.PERCENTAGE, Tokens.LENGTH,\n                        Tokens.ANGLE, Tokens.TIME,\n                        Tokens.FREQ, Tokens.STRING, Tokens.IDENT, Tokens.URI, Tokens.UNICODE_RANGE])){\n                 \n                    value = tokenStream.token().value;\n                    if (unary === null){\n                        line = tokenStream.token().startLine;\n                        col = tokenStream.token().startCol;\n                    }\n                    this._readWhitespace();\n                } else {\n                    token = this._hexcolor();\n                    if (token === null){\n                        if (unary === null){\n                            line = tokenStream.LT(1).startLine;\n                            col = tokenStream.LT(1).startCol;\n                        }                    \n                        if (value === null){\n                            if (tokenStream.LA(3) == Tokens.EQUALS && this.options.ieFilters){\n                                value = this._ie_function();\n                            } else {\n                                value = this._function();\n                            }\n                        }\n                    \n                    } else {\n                        value = token.value;\n                        if (unary === null){\n                            line = token.startLine;\n                            col = token.startCol;\n                        }                    \n                    }\n                \n                }                \n                \n                return value !== null ?\n                        new PropertyValuePart(unary !== null ? unary + value : value, line, col) :\n                        null;\n        \n            },\n            \n            _function: function(){\n                 \n                var tokenStream = this._tokenStream,\n                    functionText = null,\n                    expr        = null,\n                    lt;\n                    \n                if (tokenStream.match(Tokens.FUNCTION)){\n                    functionText = tokenStream.token().value;\n                    this._readWhitespace();\n                    expr = this._expr(true);\n                    functionText += expr;\n                    if (this.options.ieFilters && tokenStream.peek() == Tokens.EQUALS){\n                        do {\n                        \n                            if (this._readWhitespace()){\n                                functionText += tokenStream.token().value;\n                            }\n                            if (tokenStream.LA(0) == Tokens.COMMA){\n                                functionText += tokenStream.token().value;\n                            }\n                        \n                            tokenStream.match(Tokens.IDENT);\n                            functionText += tokenStream.token().value;\n                            \n                            tokenStream.match(Tokens.EQUALS);\n                            functionText += tokenStream.token().value;\n                            lt = tokenStream.peek();\n                            while(lt != Tokens.COMMA && lt != Tokens.S && lt != Tokens.RPAREN){\n                                tokenStream.get();\n                                functionText += tokenStream.token().value;\n                                lt = tokenStream.peek();\n                            }\n                        } while(tokenStream.match([Tokens.COMMA, Tokens.S]));\n                    }\n                    \n                    tokenStream.match(Tokens.RPAREN);    \n                    functionText += \")\";\n                    this._readWhitespace();\n                }                \n                \n                return functionText;\n            }, \n            \n            _ie_function: function(){\n                 \n                var tokenStream = this._tokenStream,\n                    functionText = null,\n                    expr        = null,\n                    lt;\n                if (tokenStream.match([Tokens.IE_FUNCTION, Tokens.FUNCTION])){\n                    functionText = tokenStream.token().value;\n                    \n                    do {\n                    \n                        if (this._readWhitespace()){\n                            functionText += tokenStream.token().value;\n                        }\n                        if (tokenStream.LA(0) == Tokens.COMMA){\n                            functionText += tokenStream.token().value;\n                        }\n                    \n                        tokenStream.match(Tokens.IDENT);\n                        functionText += tokenStream.token().value;\n                        \n                        tokenStream.match(Tokens.EQUALS);\n                        functionText += tokenStream.token().value;\n                        lt = tokenStream.peek();\n                        while(lt != Tokens.COMMA && lt != Tokens.S && lt != Tokens.RPAREN){\n                            tokenStream.get();\n                            functionText += tokenStream.token().value;\n                            lt = tokenStream.peek();\n                        }\n                    } while(tokenStream.match([Tokens.COMMA, Tokens.S]));                    \n                    \n                    tokenStream.match(Tokens.RPAREN);    \n                    functionText += \")\";\n                    this._readWhitespace();\n                }                \n                \n                return functionText;\n            }, \n            \n            _hexcolor: function(){\n                 \n                var tokenStream = this._tokenStream,\n                    token = null,\n                    color;\n                    \n                if(tokenStream.match(Tokens.HASH)){\n                    \n                    token = tokenStream.token();\n                    color = token.value;\n                    if (!/#[a-f0-9]{3,6}/i.test(color)){\n                        throw new SyntaxError(\"Expected a hex color but found '\" + color + \"' at line \" + token.startLine + \", col \" + token.startCol + \".\", token.startLine, token.startCol);\n                    }\n                    this._readWhitespace();\n                }\n                \n                return token;\n            },\n            \n            _keyframes: function(){\n                var tokenStream = this._tokenStream,\n                    token,\n                    tt,\n                    name,\n                    prefix = \"\";            \n                    \n                tokenStream.mustMatch(Tokens.KEYFRAMES_SYM);\n                token = tokenStream.token();\n                if (/^@\\-([^\\-]+)\\-/.test(token.value)) {\n                    prefix = RegExp.$1;\n                }\n                \n                this._readWhitespace();\n                name = this._keyframe_name();\n                \n                this._readWhitespace();\n                tokenStream.mustMatch(Tokens.LBRACE);\n                    \n                this.fire({\n                    type:   \"startkeyframes\",\n                    name:   name,\n                    prefix: prefix,\n                    line:   token.startLine,\n                    col:    token.startCol\n                });                \n                \n                this._readWhitespace();\n                tt = tokenStream.peek();\n                while(tt == Tokens.IDENT || tt == Tokens.PERCENTAGE) {\n                    this._keyframe_rule();\n                    this._readWhitespace();\n                    tt = tokenStream.peek();\n                }           \n                \n                this.fire({\n                    type:   \"endkeyframes\",\n                    name:   name,\n                    prefix: prefix,\n                    line:   token.startLine,\n                    col:    token.startCol\n                });                      \n                    \n                this._readWhitespace();\n                tokenStream.mustMatch(Tokens.RBRACE);                    \n                \n            },\n            \n            _keyframe_name: function(){\n                var tokenStream = this._tokenStream,\n                    token;\n\n                tokenStream.mustMatch([Tokens.IDENT, Tokens.STRING]);\n                return SyntaxUnit.fromToken(tokenStream.token());            \n            },\n            \n            _keyframe_rule: function(){\n                var tokenStream = this._tokenStream,\n                    token,\n                    keyList = this._key_list();\n                                    \n                this.fire({\n                    type:   \"startkeyframerule\",\n                    keys:   keyList,\n                    line:   keyList[0].line,\n                    col:    keyList[0].col\n                });                \n                \n                this._readDeclarations(true);                \n                \n                this.fire({\n                    type:   \"endkeyframerule\",\n                    keys:   keyList,\n                    line:   keyList[0].line,\n                    col:    keyList[0].col\n                });  \n                \n            },\n            \n            _key_list: function(){\n                var tokenStream = this._tokenStream,\n                    token,\n                    key,\n                    keyList = [];\n                keyList.push(this._key());\n                    \n                this._readWhitespace();\n                    \n                while(tokenStream.match(Tokens.COMMA)){\n                    this._readWhitespace();\n                    keyList.push(this._key());\n                    this._readWhitespace();\n                }\n\n                return keyList;\n            },\n                        \n            _key: function(){\n                 \n                var tokenStream = this._tokenStream,\n                    token;\n                    \n                if (tokenStream.match(Tokens.PERCENTAGE)){\n                    return SyntaxUnit.fromToken(tokenStream.token());\n                } else if (tokenStream.match(Tokens.IDENT)){\n                    token = tokenStream.token();                    \n                    \n                    if (/from|to/i.test(token.value)){\n                        return SyntaxUnit.fromToken(token);\n                    }\n                    \n                    tokenStream.unget();\n                }\n                this._unexpectedToken(tokenStream.LT(1));\n            },\n            _skipCruft: function(){\n                while(this._tokenStream.match([Tokens.S, Tokens.CDO, Tokens.CDC])){\n                }\n            },\n            _readDeclarations: function(checkStart, readMargins){\n                var tokenStream = this._tokenStream,\n                    tt;\n                       \n\n                this._readWhitespace();\n                \n                if (checkStart){\n                    tokenStream.mustMatch(Tokens.LBRACE);            \n                }\n                \n                this._readWhitespace();\n\n                try {\n                    \n                    while(true){\n                    \n                        if (tokenStream.match(Tokens.SEMICOLON) || (readMargins && this._margin())){\n                        } else if (this._declaration()){\n                            if (!tokenStream.match(Tokens.SEMICOLON)){\n                                break;\n                            }\n                        } else {\n                            break;\n                        }\n                        this._readWhitespace();\n                    }\n                    \n                    tokenStream.mustMatch(Tokens.RBRACE);\n                    this._readWhitespace();\n                    \n                } catch (ex) {\n                    if (ex instanceof SyntaxError && !this.options.strict){\n                        this.fire({\n                            type:       \"error\",\n                            error:      ex,\n                            message:    ex.message,\n                            line:       ex.line,\n                            col:        ex.col\n                        });                          \n                        tt = tokenStream.advance([Tokens.SEMICOLON, Tokens.RBRACE]);\n                        if (tt == Tokens.SEMICOLON){\n                            this._readDeclarations(false, readMargins);                            \n                        } else if (tt != Tokens.RBRACE){\n                            throw ex;\n                        }                        \n                        \n                    } else {\n                        throw ex;\n                    }\n                }    \n            \n            },      \n            _readWhitespace: function(){\n            \n                var tokenStream = this._tokenStream,\n                    ws = \"\";\n                    \n                while(tokenStream.match(Tokens.S)){\n                    ws += tokenStream.token().value;\n                }\n                \n                return ws;\n            },\n            _unexpectedToken: function(token){\n                throw new SyntaxError(\"Unexpected token '\" + token.value + \"' at line \" + token.startLine + \", col \" + token.startCol + \".\", token.startLine, token.startCol);\n            },\n            _verifyEnd: function(){\n                if (this._tokenStream.LA(1) != Tokens.EOF){\n                    this._unexpectedToken(this._tokenStream.LT(1));\n                }            \n            },\n            _validateProperty: function(property, value){\n                Validation.validate(property, value);\n            },\n            \n            parse: function(input){    \n                this._tokenStream = new TokenStream(input, Tokens);\n                this._stylesheet();\n            },\n            \n            parseStyleSheet: function(input){\n                return this.parse(input);\n            },\n            \n            parseMediaQuery: function(input){\n                this._tokenStream = new TokenStream(input, Tokens);\n                var result = this._media_query();\n                this._verifyEnd();\n                return result;            \n            },             \n            parsePropertyValue: function(input){\n            \n                this._tokenStream = new TokenStream(input, Tokens);\n                this._readWhitespace();\n                \n                var result = this._expr();\n                this._readWhitespace();\n                this._verifyEnd();\n                return result;\n            },\n            parseRule: function(input){\n                this._tokenStream = new TokenStream(input, Tokens);\n                this._readWhitespace();\n                \n                var result = this._ruleset();\n                this._readWhitespace();\n                this._verifyEnd();\n                return result;            \n            },\n            parseSelector: function(input){\n            \n                this._tokenStream = new TokenStream(input, Tokens);\n                this._readWhitespace();\n                \n                var result = this._selector();\n                this._readWhitespace();\n                this._verifyEnd();\n                return result;\n            },\n            parseStyleAttribute: function(input){\n                input += \"}\"; // for error recovery in _readDeclarations()\n                this._tokenStream = new TokenStream(input, Tokens);\n                this._readDeclarations();\n            }\n        };\n    for (prop in additions){\n        if (additions.hasOwnProperty(prop)){\n            proto[prop] = additions[prop];\n        }\n    }   \n    \n    return proto;\n}();\nvar Properties = {\n    \"alignment-adjust\"              : \"auto | baseline | before-edge | text-before-edge | middle | central | after-edge | text-after-edge | ideographic | alphabetic | hanging | mathematical | <percentage> | <length>\",\n    \"alignment-baseline\"            : \"baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical\",\n    \"animation\"                     : 1,\n    \"animation-delay\"               : { multi: \"<time>\", comma: true },\n    \"animation-direction\"           : { multi: \"normal | alternate\", comma: true },\n    \"animation-duration\"            : { multi: \"<time>\", comma: true },\n    \"animation-iteration-count\"     : { multi: \"<number> | infinite\", comma: true },\n    \"animation-name\"                : { multi: \"none | <ident>\", comma: true },\n    \"animation-play-state\"          : { multi: \"running | paused\", comma: true },\n    \"animation-timing-function\"     : 1,\n    \"-moz-animation-delay\"               : { multi: \"<time>\", comma: true },\n    \"-moz-animation-direction\"           : { multi: \"normal | alternate\", comma: true },\n    \"-moz-animation-duration\"            : { multi: \"<time>\", comma: true },\n    \"-moz-animation-iteration-count\"     : { multi: \"<number> | infinite\", comma: true },\n    \"-moz-animation-name\"                : { multi: \"none | <ident>\", comma: true },\n    \"-moz-animation-play-state\"          : { multi: \"running | paused\", comma: true },\n    \n    \"-ms-animation-delay\"               : { multi: \"<time>\", comma: true },\n    \"-ms-animation-direction\"           : { multi: \"normal | alternate\", comma: true },\n    \"-ms-animation-duration\"            : { multi: \"<time>\", comma: true },\n    \"-ms-animation-iteration-count\"     : { multi: \"<number> | infinite\", comma: true },\n    \"-ms-animation-name\"                : { multi: \"none | <ident>\", comma: true },\n    \"-ms-animation-play-state\"          : { multi: \"running | paused\", comma: true },\n    \n    \"-webkit-animation-delay\"               : { multi: \"<time>\", comma: true },\n    \"-webkit-animation-direction\"           : { multi: \"normal | alternate\", comma: true },\n    \"-webkit-animation-duration\"            : { multi: \"<time>\", comma: true },\n    \"-webkit-animation-iteration-count\"     : { multi: \"<number> | infinite\", comma: true },\n    \"-webkit-animation-name\"                : { multi: \"none | <ident>\", comma: true },\n    \"-webkit-animation-play-state\"          : { multi: \"running | paused\", comma: true },\n    \n    \"-o-animation-delay\"               : { multi: \"<time>\", comma: true },\n    \"-o-animation-direction\"           : { multi: \"normal | alternate\", comma: true },\n    \"-o-animation-duration\"            : { multi: \"<time>\", comma: true },\n    \"-o-animation-iteration-count\"     : { multi: \"<number> | infinite\", comma: true },\n    \"-o-animation-name\"                : { multi: \"none | <ident>\", comma: true },\n    \"-o-animation-play-state\"          : { multi: \"running | paused\", comma: true },        \n    \n    \"appearance\"                    : \"icon | window | desktop | workspace | document | tooltip | dialog | button | push-button | hyperlink | radio-button | checkbox | menu-item | tab | menu | menubar | pull-down-menu | pop-up-menu | list-menu | radio-group | checkbox-group | outline-tree | range | field | combo-box | signature | password | normal | none | inherit\",\n    \"azimuth\"                       : function (expression) {\n        var simple      = \"<angle> | leftwards | rightwards | inherit\",\n            direction   = \"left-side | far-left | left | center-left | center | center-right | right | far-right | right-side\",\n            behind      = false,\n            valid       = false,\n            part;\n        \n        if (!ValidationTypes.isAny(expression, simple)) {\n            if (ValidationTypes.isAny(expression, \"behind\")) {\n                behind = true;\n                valid = true;\n            }\n            \n            if (ValidationTypes.isAny(expression, direction)) {\n                valid = true;\n                if (!behind) {\n                    ValidationTypes.isAny(expression, \"behind\");\n                }\n            }\n        }\n        \n        if (expression.hasNext()) {\n            part = expression.next();\n            if (valid) {\n                throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n            } else {\n                throw new ValidationError(\"Expected (<'azimuth'>) but found '\" + part + \"'.\", part.line, part.col);\n            }\n        }        \n    },\n    \"backface-visibility\"           : \"visible | hidden\",\n    \"background\"                    : 1,\n    \"background-attachment\"         : { multi: \"<attachment>\", comma: true },\n    \"background-clip\"               : { multi: \"<box>\", comma: true },\n    \"background-color\"              : \"<color> | inherit\",\n    \"background-image\"              : { multi: \"<bg-image>\", comma: true },\n    \"background-origin\"             : { multi: \"<box>\", comma: true },\n    \"background-position\"           : { multi: \"<bg-position>\", comma: true },\n    \"background-repeat\"             : { multi: \"<repeat-style>\" },\n    \"background-size\"               : { multi: \"<bg-size>\", comma: true },\n    \"baseline-shift\"                : \"baseline | sub | super | <percentage> | <length>\",\n    \"behavior\"                      : 1,\n    \"binding\"                       : 1,\n    \"bleed\"                         : \"<length>\",\n    \"bookmark-label\"                : \"<content> | <attr> | <string>\",\n    \"bookmark-level\"                : \"none | <integer>\",\n    \"bookmark-state\"                : \"open | closed\",\n    \"bookmark-target\"               : \"none | <uri> | <attr>\",\n    \"border\"                        : \"<border-width> || <border-style> || <color>\",\n    \"border-bottom\"                 : \"<border-width> || <border-style> || <color>\",\n    \"border-bottom-color\"           : \"<color>\",\n    \"border-bottom-left-radius\"     :  \"<x-one-radius>\",\n    \"border-bottom-right-radius\"    :  \"<x-one-radius>\",\n    \"border-bottom-style\"           : \"<border-style>\",\n    \"border-bottom-width\"           : \"<border-width>\",\n    \"border-collapse\"               : \"collapse | separate | inherit\",\n    \"border-color\"                  : { multi: \"<color> | inherit\", max: 4 },\n    \"border-image\"                  : 1,\n    \"border-image-outset\"           : { multi: \"<length> | <number>\", max: 4 },\n    \"border-image-repeat\"           : { multi: \"stretch | repeat | round\", max: 2 },\n    \"border-image-slice\"            : function(expression) {\n        \n        var valid   = false,\n            numeric = \"<number> | <percentage>\",\n            fill    = false,\n            count   = 0,\n            max     = 4,\n            part;\n        \n        if (ValidationTypes.isAny(expression, \"fill\")) {\n            fill = true;\n            valid = true;\n        }\n        \n        while (expression.hasNext() && count < max) {\n            valid = ValidationTypes.isAny(expression, numeric);\n            if (!valid) {\n                break;\n            }\n            count++;\n        }\n        \n        \n        if (!fill) {\n            ValidationTypes.isAny(expression, \"fill\");\n        } else {\n            valid = true;\n        }\n        \n        if (expression.hasNext()) {\n            part = expression.next();\n            if (valid) {\n                throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n            } else {\n                throw new ValidationError(\"Expected ([<number> | <percentage>]{1,4} && fill?) but found '\" + part + \"'.\", part.line, part.col);\n            }\n        }         \n    },\n    \"border-image-source\"           : \"<image> | none\",\n    \"border-image-width\"            : { multi: \"<length> | <percentage> | <number> | auto\", max: 4 },\n    \"border-left\"                   : \"<border-width> || <border-style> || <color>\",\n    \"border-left-color\"             : \"<color> | inherit\",\n    \"border-left-style\"             : \"<border-style>\",\n    \"border-left-width\"             : \"<border-width>\",\n    \"border-radius\"                 : function(expression) {\n        \n        var valid   = false,\n            numeric = \"<length> | <percentage>\",\n            slash   = false,\n            fill    = false,\n            count   = 0,\n            max     = 8,\n            part;\n\n        while (expression.hasNext() && count < max) {\n            valid = ValidationTypes.isAny(expression, numeric);\n            if (!valid) {\n            \n                if (expression.peek() == \"/\" && count > 0 && !slash) {\n                    slash = true;\n                    max = count + 5;\n                    expression.next();\n                } else {\n                    break;\n                }\n            }\n            count++;\n        }\n        \n        if (expression.hasNext()) {\n            part = expression.next();\n            if (valid) {\n                throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n            } else {\n                throw new ValidationError(\"Expected (<'border-radius'>) but found '\" + part + \"'.\", part.line, part.col);\n            }\n        }         \n    },\n    \"border-right\"                  : \"<border-width> || <border-style> || <color>\",\n    \"border-right-color\"            : \"<color> | inherit\",\n    \"border-right-style\"            : \"<border-style>\",\n    \"border-right-width\"            : \"<border-width>\",\n    \"border-spacing\"                : { multi: \"<length> | inherit\", max: 2 },\n    \"border-style\"                  : { multi: \"<border-style>\", max: 4 },\n    \"border-top\"                    : \"<border-width> || <border-style> || <color>\",\n    \"border-top-color\"              : \"<color> | inherit\",\n    \"border-top-left-radius\"        : \"<x-one-radius>\",\n    \"border-top-right-radius\"       : \"<x-one-radius>\",\n    \"border-top-style\"              : \"<border-style>\",\n    \"border-top-width\"              : \"<border-width>\",\n    \"border-width\"                  : { multi: \"<border-width>\", max: 4 },\n    \"bottom\"                        : \"<margin-width> | inherit\", \n    \"box-align\"                     : \"start | end | center | baseline | stretch\",        //http://www.w3.org/TR/2009/WD-css3-flexbox-20090723/\n    \"box-decoration-break\"          : \"slice |clone\",\n    \"box-direction\"                 : \"normal | reverse | inherit\",\n    \"box-flex\"                      : \"<number>\",\n    \"box-flex-group\"                : \"<integer>\",\n    \"box-lines\"                     : \"single | multiple\",\n    \"box-ordinal-group\"             : \"<integer>\",\n    \"box-orient\"                    : \"horizontal | vertical | inline-axis | block-axis | inherit\",\n    \"box-pack\"                      : \"start | end | center | justify\",\n    \"box-shadow\"                    : function (expression) {\n        var result      = false,\n            part;\n\n        if (!ValidationTypes.isAny(expression, \"none\")) {\n            Validation.multiProperty(\"<shadow>\", expression, true, Infinity);                       \n        } else {\n            if (expression.hasNext()) {\n                part = expression.next();\n                throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n            }   \n        }\n    },\n    \"box-sizing\"                    : \"content-box | border-box | inherit\",\n    \"break-after\"                   : \"auto | always | avoid | left | right | page | column | avoid-page | avoid-column\",\n    \"break-before\"                  : \"auto | always | avoid | left | right | page | column | avoid-page | avoid-column\",\n    \"break-inside\"                  : \"auto | avoid | avoid-page | avoid-column\",\n    \"caption-side\"                  : \"top | bottom | inherit\",\n    \"clear\"                         : \"none | right | left | both | inherit\",\n    \"clip\"                          : 1,\n    \"color\"                         : \"<color> | inherit\",\n    \"color-profile\"                 : 1,\n    \"column-count\"                  : \"<integer> | auto\",                      //http://www.w3.org/TR/css3-multicol/\n    \"column-fill\"                   : \"auto | balance\",\n    \"column-gap\"                    : \"<length> | normal\",\n    \"column-rule\"                   : \"<border-width> || <border-style> || <color>\",\n    \"column-rule-color\"             : \"<color>\",\n    \"column-rule-style\"             : \"<border-style>\",\n    \"column-rule-width\"             : \"<border-width>\",\n    \"column-span\"                   : \"none | all\",\n    \"column-width\"                  : \"<length> | auto\",\n    \"columns\"                       : 1,\n    \"content\"                       : 1,\n    \"counter-increment\"             : 1,\n    \"counter-reset\"                 : 1,\n    \"crop\"                          : \"<shape> | auto\",\n    \"cue\"                           : \"cue-after | cue-before | inherit\",\n    \"cue-after\"                     : 1,\n    \"cue-before\"                    : 1,\n    \"cursor\"                        : 1,\n    \"direction\"                     : \"ltr | rtl | inherit\",\n    \"display\"                       : \"inline | block | list-item | inline-block | table | inline-table | table-row-group | table-header-group | table-footer-group | table-row | table-column-group | table-column | table-cell | table-caption | box | inline-box | grid | inline-grid | none | inherit | -moz-box | -moz-inline-block | -moz-inline-box | -moz-inline-grid | -moz-inline-stack | -moz-inline-table | -moz-grid | -moz-grid-group | -moz-grid-line | -moz-groupbox | -moz-deck | -moz-popup | -moz-stack | -moz-marker\",\n    \"dominant-baseline\"             : 1,\n    \"drop-initial-after-adjust\"     : \"central | middle | after-edge | text-after-edge | ideographic | alphabetic | mathematical | <percentage> | <length>\",\n    \"drop-initial-after-align\"      : \"baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical\",\n    \"drop-initial-before-adjust\"    : \"before-edge | text-before-edge | central | middle | hanging | mathematical | <percentage> | <length>\",\n    \"drop-initial-before-align\"     : \"caps-height | baseline | use-script | before-edge | text-before-edge | after-edge | text-after-edge | central | middle | ideographic | alphabetic | hanging | mathematical\",\n    \"drop-initial-size\"             : \"auto | line | <length> | <percentage>\",\n    \"drop-initial-value\"            : \"initial | <integer>\",\n    \"elevation\"                     : \"<angle> | below | level | above | higher | lower | inherit\",\n    \"empty-cells\"                   : \"show | hide | inherit\",\n    \"filter\"                        : 1,\n    \"fit\"                           : \"fill | hidden | meet | slice\",\n    \"fit-position\"                  : 1,\n    \"float\"                         : \"left | right | none | inherit\",    \n    \"float-offset\"                  : 1,\n    \"font\"                          : 1,\n    \"font-family\"                   : 1,\n    \"font-size\"                     : \"<absolute-size> | <relative-size> | <length> | <percentage> | inherit\",\n    \"font-size-adjust\"              : \"<number> | none | inherit\",\n    \"font-stretch\"                  : \"normal | ultra-condensed | extra-condensed | condensed | semi-condensed | semi-expanded | expanded | extra-expanded | ultra-expanded | inherit\",\n    \"font-style\"                    : \"normal | italic | oblique | inherit\",\n    \"font-variant\"                  : \"normal | small-caps | inherit\",\n    \"font-weight\"                   : \"normal | bold | bolder | lighter | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 | inherit\",\n    \"grid-cell-stacking\"            : \"columns | rows | layer\",\n    \"grid-column\"                   : 1,\n    \"grid-columns\"                  : 1,\n    \"grid-column-align\"             : \"start | end | center | stretch\",\n    \"grid-column-sizing\"            : 1,\n    \"grid-column-span\"              : \"<integer>\",\n    \"grid-flow\"                     : \"none | rows | columns\",\n    \"grid-layer\"                    : \"<integer>\",\n    \"grid-row\"                      : 1,\n    \"grid-rows\"                     : 1,\n    \"grid-row-align\"                : \"start | end | center | stretch\",\n    \"grid-row-span\"                 : \"<integer>\",\n    \"grid-row-sizing\"               : 1,\n    \"hanging-punctuation\"           : 1,\n    \"height\"                        : \"<margin-width> | inherit\",\n    \"hyphenate-after\"               : \"<integer> | auto\",\n    \"hyphenate-before\"              : \"<integer> | auto\",\n    \"hyphenate-character\"           : \"<string> | auto\",\n    \"hyphenate-lines\"               : \"no-limit | <integer>\",\n    \"hyphenate-resource\"            : 1,\n    \"hyphens\"                       : \"none | manual | auto\",\n    \"icon\"                          : 1,\n    \"image-orientation\"             : \"angle | auto\",\n    \"image-rendering\"               : 1,\n    \"image-resolution\"              : 1,\n    \"inline-box-align\"              : \"initial | last | <integer>\",\n    \"left\"                          : \"<margin-width> | inherit\",\n    \"letter-spacing\"                : \"<length> | normal | inherit\",\n    \"line-height\"                   : \"<number> | <length> | <percentage> | normal | inherit\",\n    \"line-break\"                    : \"auto | loose | normal | strict\",\n    \"line-stacking\"                 : 1,\n    \"line-stacking-ruby\"            : \"exclude-ruby | include-ruby\",\n    \"line-stacking-shift\"           : \"consider-shifts | disregard-shifts\",\n    \"line-stacking-strategy\"        : \"inline-line-height | block-line-height | max-height | grid-height\",\n    \"list-style\"                    : 1,\n    \"list-style-image\"              : \"<uri> | none | inherit\",\n    \"list-style-position\"           : \"inside | outside | inherit\",\n    \"list-style-type\"               : \"disc | circle | square | decimal | decimal-leading-zero | lower-roman | upper-roman | lower-greek | lower-latin | upper-latin | armenian | georgian | lower-alpha | upper-alpha | none | inherit\",\n    \"margin\"                        : { multi: \"<margin-width> | inherit\", max: 4 },\n    \"margin-bottom\"                 : \"<margin-width> | inherit\",\n    \"margin-left\"                   : \"<margin-width> | inherit\",\n    \"margin-right\"                  : \"<margin-width> | inherit\",\n    \"margin-top\"                    : \"<margin-width> | inherit\",\n    \"mark\"                          : 1,\n    \"mark-after\"                    : 1,\n    \"mark-before\"                   : 1,\n    \"marks\"                         : 1,\n    \"marquee-direction\"             : 1,\n    \"marquee-play-count\"            : 1,\n    \"marquee-speed\"                 : 1,\n    \"marquee-style\"                 : 1,\n    \"max-height\"                    : \"<length> | <percentage> | none | inherit\",\n    \"max-width\"                     : \"<length> | <percentage> | none | inherit\",\n    \"min-height\"                    : \"<length> | <percentage> | inherit\",\n    \"min-width\"                     : \"<length> | <percentage> | inherit\",\n    \"move-to\"                       : 1,\n    \"nav-down\"                      : 1,\n    \"nav-index\"                     : 1,\n    \"nav-left\"                      : 1,\n    \"nav-right\"                     : 1,\n    \"nav-up\"                        : 1,\n    \"opacity\"                       : \"<number> | inherit\",\n    \"orphans\"                       : \"<integer> | inherit\",\n    \"outline\"                       : 1,\n    \"outline-color\"                 : \"<color> | invert | inherit\",\n    \"outline-offset\"                : 1,\n    \"outline-style\"                 : \"<border-style> | inherit\",\n    \"outline-width\"                 : \"<border-width> | inherit\",\n    \"overflow\"                      : \"visible | hidden | scroll | auto | inherit\",\n    \"overflow-style\"                : 1,\n    \"overflow-x\"                    : 1,\n    \"overflow-y\"                    : 1,\n    \"padding\"                       : { multi: \"<padding-width> | inherit\", max: 4 },\n    \"padding-bottom\"                : \"<padding-width> | inherit\",\n    \"padding-left\"                  : \"<padding-width> | inherit\",\n    \"padding-right\"                 : \"<padding-width> | inherit\",\n    \"padding-top\"                   : \"<padding-width> | inherit\",\n    \"page\"                          : 1,\n    \"page-break-after\"              : \"auto | always | avoid | left | right | inherit\",\n    \"page-break-before\"             : \"auto | always | avoid | left | right | inherit\",\n    \"page-break-inside\"             : \"auto | avoid | inherit\",\n    \"page-policy\"                   : 1,\n    \"pause\"                         : 1,\n    \"pause-after\"                   : 1,\n    \"pause-before\"                  : 1,\n    \"perspective\"                   : 1,\n    \"perspective-origin\"            : 1,\n    \"phonemes\"                      : 1,\n    \"pitch\"                         : 1,\n    \"pitch-range\"                   : 1,\n    \"play-during\"                   : 1,\n    \"pointer-events\"                : \"auto | none | visiblePainted | visibleFill | visibleStroke | visible | painted | fill | stroke | all | inherit\",\n    \"position\"                      : \"static | relative | absolute | fixed | inherit\",\n    \"presentation-level\"            : 1,\n    \"punctuation-trim\"              : 1,\n    \"quotes\"                        : 1,\n    \"rendering-intent\"              : 1,\n    \"resize\"                        : 1,\n    \"rest\"                          : 1,\n    \"rest-after\"                    : 1,\n    \"rest-before\"                   : 1,\n    \"richness\"                      : 1,\n    \"right\"                         : \"<margin-width> | inherit\",\n    \"rotation\"                      : 1,\n    \"rotation-point\"                : 1,\n    \"ruby-align\"                    : 1,\n    \"ruby-overhang\"                 : 1,\n    \"ruby-position\"                 : 1,\n    \"ruby-span\"                     : 1,\n    \"size\"                          : 1,\n    \"speak\"                         : \"normal | none | spell-out | inherit\",\n    \"speak-header\"                  : \"once | always | inherit\",\n    \"speak-numeral\"                 : \"digits | continuous | inherit\",\n    \"speak-punctuation\"             : \"code | none | inherit\",\n    \"speech-rate\"                   : 1,\n    \"src\"                           : 1,\n    \"stress\"                        : 1,\n    \"string-set\"                    : 1,\n    \n    \"table-layout\"                  : \"auto | fixed | inherit\",\n    \"tab-size\"                      : \"<integer> | <length>\",\n    \"target\"                        : 1,\n    \"target-name\"                   : 1,\n    \"target-new\"                    : 1,\n    \"target-position\"               : 1,\n    \"text-align\"                    : \"left | right | center | justify | inherit\" ,\n    \"text-align-last\"               : 1,\n    \"text-decoration\"               : 1,\n    \"text-emphasis\"                 : 1,\n    \"text-height\"                   : 1,\n    \"text-indent\"                   : \"<length> | <percentage> | inherit\",\n    \"text-justify\"                  : \"auto | none | inter-word | inter-ideograph | inter-cluster | distribute | kashida\",\n    \"text-outline\"                  : 1,\n    \"text-overflow\"                 : 1,\n    \"text-rendering\"                : \"auto | optimizeSpeed | optimizeLegibility | geometricPrecision | inherit\",\n    \"text-shadow\"                   : 1,\n    \"text-transform\"                : \"capitalize | uppercase | lowercase | none | inherit\",\n    \"text-wrap\"                     : \"normal | none | avoid\",\n    \"top\"                           : \"<margin-width> | inherit\",\n    \"transform\"                     : 1,\n    \"transform-origin\"              : 1,\n    \"transform-style\"               : 1,\n    \"transition\"                    : 1,\n    \"transition-delay\"              : 1,\n    \"transition-duration\"           : 1,\n    \"transition-property\"           : 1,\n    \"transition-timing-function\"    : 1,\n    \"unicode-bidi\"                  : \"normal | embed | bidi-override | inherit\",\n    \"user-modify\"                   : \"read-only | read-write | write-only | inherit\",\n    \"user-select\"                   : \"none | text | toggle | element | elements | all | inherit\",\n    \"vertical-align\"                : \"auto | use-script | baseline | sub | super | top | text-top | central | middle | bottom | text-bottom | <percentage> | <length>\",\n    \"visibility\"                    : \"visible | hidden | collapse | inherit\",\n    \"voice-balance\"                 : 1,\n    \"voice-duration\"                : 1,\n    \"voice-family\"                  : 1,\n    \"voice-pitch\"                   : 1,\n    \"voice-pitch-range\"             : 1,\n    \"voice-rate\"                    : 1,\n    \"voice-stress\"                  : 1,\n    \"voice-volume\"                  : 1,\n    \"volume\"                        : 1,\n    \"white-space\"                   : \"normal | pre | nowrap | pre-wrap | pre-line | inherit | -pre-wrap | -o-pre-wrap | -moz-pre-wrap | -hp-pre-wrap\", //http://perishablepress.com/wrapping-content/\n    \"white-space-collapse\"          : 1,\n    \"widows\"                        : \"<integer> | inherit\",\n    \"width\"                         : \"<length> | <percentage> | auto | inherit\" ,\n    \"word-break\"                    : \"normal | keep-all | break-all\",\n    \"word-spacing\"                  : \"<length> | normal | inherit\",\n    \"word-wrap\"                     : 1,\n    \"z-index\"                       : \"<integer> | auto | inherit\",\n    \"zoom\"                          : \"<number> | <percentage> | normal\"\n};\nfunction PropertyName(text, hack, line, col){\n    \n    SyntaxUnit.call(this, text, line, col, Parser.PROPERTY_NAME_TYPE);\n    this.hack = hack;\n\n}\n\nPropertyName.prototype = new SyntaxUnit();\nPropertyName.prototype.constructor = PropertyName;\nPropertyName.prototype.toString = function(){\n    return (this.hack ? this.hack : \"\") + this.text;\n};\nfunction PropertyValue(parts, line, col){\n\n    SyntaxUnit.call(this, parts.join(\" \"), line, col, Parser.PROPERTY_VALUE_TYPE);\n    this.parts = parts;\n    \n}\n\nPropertyValue.prototype = new SyntaxUnit();\nPropertyValue.prototype.constructor = PropertyValue;\nfunction PropertyValueIterator(value){\n    this._i = 0;\n    this._parts = value.parts;\n    this._marks = [];\n    this.value = value;\n    \n}\nPropertyValueIterator.prototype.count = function(){\n    return this._parts.length;\n};\nPropertyValueIterator.prototype.isFirst = function(){\n    return this._i === 0;\n};\nPropertyValueIterator.prototype.hasNext = function(){\n    return (this._i < this._parts.length);\n};\nPropertyValueIterator.prototype.mark = function(){\n    this._marks.push(this._i);\n};\nPropertyValueIterator.prototype.peek = function(count){\n    return this.hasNext() ? this._parts[this._i + (count || 0)] : null;\n};\nPropertyValueIterator.prototype.next = function(){\n    return this.hasNext() ? this._parts[this._i++] : null;\n};\nPropertyValueIterator.prototype.previous = function(){\n    return this._i > 0 ? this._parts[--this._i] : null;\n};\nPropertyValueIterator.prototype.restore = function(){\n    if (this._marks.length){\n        this._i = this._marks.pop();\n    }\n};\nfunction PropertyValuePart(text, line, col){\n\n    SyntaxUnit.call(this, text, line, col, Parser.PROPERTY_VALUE_PART_TYPE);\n    this.type = \"unknown\";\n    \n    var temp;\n    if (/^([+\\-]?[\\d\\.]+)([a-z]+)$/i.test(text)){  //dimension\n        this.type = \"dimension\";\n        this.value = +RegExp.$1;\n        this.units = RegExp.$2;\n        switch(this.units.toLowerCase()){\n        \n            case \"em\":\n            case \"rem\":\n            case \"ex\":\n            case \"px\":\n            case \"cm\":\n            case \"mm\":\n            case \"in\":\n            case \"pt\":\n            case \"pc\":\n            case \"ch\":\n                this.type = \"length\";\n                break;\n                \n            case \"deg\":\n            case \"rad\":\n            case \"grad\":\n                this.type = \"angle\";\n                break;\n            \n            case \"ms\":\n            case \"s\":\n                this.type = \"time\";\n                break;\n            \n            case \"hz\":\n            case \"khz\":\n                this.type = \"frequency\";\n                break;\n            \n            case \"dpi\":\n            case \"dpcm\":\n                this.type = \"resolution\";\n                break;\n                \n        }\n        \n    } else if (/^([+\\-]?[\\d\\.]+)%$/i.test(text)){  //percentage\n        this.type = \"percentage\";\n        this.value = +RegExp.$1;\n    } else if (/^([+\\-]?[\\d\\.]+)%$/i.test(text)){  //percentage\n        this.type = \"percentage\";\n        this.value = +RegExp.$1;\n    } else if (/^([+\\-]?\\d+)$/i.test(text)){  //integer\n        this.type = \"integer\";\n        this.value = +RegExp.$1;\n    } else if (/^([+\\-]?[\\d\\.]+)$/i.test(text)){  //number\n        this.type = \"number\";\n        this.value = +RegExp.$1;\n    \n    } else if (/^#([a-f0-9]{3,6})/i.test(text)){  //hexcolor\n        this.type = \"color\";\n        temp = RegExp.$1;\n        if (temp.length == 3){\n            this.red    = parseInt(temp.charAt(0)+temp.charAt(0),16);\n            this.green  = parseInt(temp.charAt(1)+temp.charAt(1),16);\n            this.blue   = parseInt(temp.charAt(2)+temp.charAt(2),16);            \n        } else {\n            this.red    = parseInt(temp.substring(0,2),16);\n            this.green  = parseInt(temp.substring(2,4),16);\n            this.blue   = parseInt(temp.substring(4,6),16);            \n        }\n    } else if (/^rgb\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)/i.test(text)){ //rgb() color with absolute numbers\n        this.type   = \"color\";\n        this.red    = +RegExp.$1;\n        this.green  = +RegExp.$2;\n        this.blue   = +RegExp.$3;\n    } else if (/^rgb\\(\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*\\)/i.test(text)){ //rgb() color with percentages\n        this.type   = \"color\";\n        this.red    = +RegExp.$1 * 255 / 100;\n        this.green  = +RegExp.$2 * 255 / 100;\n        this.blue   = +RegExp.$3 * 255 / 100;\n    } else if (/^rgba\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*([\\d\\.]+)\\s*\\)/i.test(text)){ //rgba() color with absolute numbers\n        this.type   = \"color\";\n        this.red    = +RegExp.$1;\n        this.green  = +RegExp.$2;\n        this.blue   = +RegExp.$3;\n        this.alpha  = +RegExp.$4;\n    } else if (/^rgba\\(\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*,\\s*([\\d\\.]+)\\s*\\)/i.test(text)){ //rgba() color with percentages\n        this.type   = \"color\";\n        this.red    = +RegExp.$1 * 255 / 100;\n        this.green  = +RegExp.$2 * 255 / 100;\n        this.blue   = +RegExp.$3 * 255 / 100;\n        this.alpha  = +RegExp.$4;        \n    } else if (/^hsl\\(\\s*(\\d+)\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*\\)/i.test(text)){ //hsl()\n        this.type   = \"color\";\n        this.hue    = +RegExp.$1;\n        this.saturation = +RegExp.$2 / 100;\n        this.lightness  = +RegExp.$3 / 100;        \n    } else if (/^hsla\\(\\s*(\\d+)\\s*,\\s*(\\d+)%\\s*,\\s*(\\d+)%\\s*,\\s*([\\d\\.]+)\\s*\\)/i.test(text)){ //hsla() color with percentages\n        this.type   = \"color\";\n        this.hue    = +RegExp.$1;\n        this.saturation = +RegExp.$2 / 100;\n        this.lightness  = +RegExp.$3 / 100;        \n        this.alpha  = +RegExp.$4;        \n    } else if (/^url\\([\"']?([^\\)\"']+)[\"']?\\)/i.test(text)){ //URI\n        this.type   = \"uri\";\n        this.uri    = RegExp.$1;\n    } else if (/^([^\\(]+)\\(/i.test(text)){\n        this.type   = \"function\";\n        this.name   = RegExp.$1;\n        this.value  = text;\n    } else if (/^[\"'][^\"']*[\"']/.test(text)){    //string\n        this.type   = \"string\";\n        this.value  = eval(text);\n    } else if (Colors[text.toLowerCase()]){  //named color\n        this.type   = \"color\";\n        temp        = Colors[text.toLowerCase()].substring(1);\n        this.red    = parseInt(temp.substring(0,2),16);\n        this.green  = parseInt(temp.substring(2,4),16);\n        this.blue   = parseInt(temp.substring(4,6),16);         \n    } else if (/^[\\,\\/]$/.test(text)){\n        this.type   = \"operator\";\n        this.value  = text;\n    } else if (/^[a-z\\-\\u0080-\\uFFFF][a-z0-9\\-\\u0080-\\uFFFF]*$/i.test(text)){\n        this.type   = \"identifier\";\n        this.value  = text;\n    }\n\n}\n\nPropertyValuePart.prototype = new SyntaxUnit();\nPropertyValuePart.prototype.constructor = PropertyValuePart;\nPropertyValuePart.fromToken = function(token){\n    return new PropertyValuePart(token.value, token.startLine, token.startCol);\n};\nvar Pseudos = {\n    \":first-letter\": 1,\n    \":first-line\":   1,\n    \":before\":       1,\n    \":after\":        1\n};\n\nPseudos.ELEMENT = 1;\nPseudos.CLASS = 2;\n\nPseudos.isElement = function(pseudo){\n    return pseudo.indexOf(\"::\") === 0 || Pseudos[pseudo.toLowerCase()] == Pseudos.ELEMENT;\n};\nfunction Selector(parts, line, col){\n    \n    SyntaxUnit.call(this, parts.join(\" \"), line, col, Parser.SELECTOR_TYPE);\n    this.parts = parts;\n    this.specificity = Specificity.calculate(this);\n\n}\n\nSelector.prototype = new SyntaxUnit();\nSelector.prototype.constructor = Selector;\nfunction SelectorPart(elementName, modifiers, text, line, col){\n    \n    SyntaxUnit.call(this, text, line, col, Parser.SELECTOR_PART_TYPE);\n    this.elementName = elementName;\n    this.modifiers = modifiers;\n\n}\n\nSelectorPart.prototype = new SyntaxUnit();\nSelectorPart.prototype.constructor = SelectorPart;\nfunction SelectorSubPart(text, type, line, col){\n    \n    SyntaxUnit.call(this, text, line, col, Parser.SELECTOR_SUB_PART_TYPE);\n    this.type = type;\n    this.args = [];\n\n}\n\nSelectorSubPart.prototype = new SyntaxUnit();\nSelectorSubPart.prototype.constructor = SelectorSubPart;\nfunction Specificity(a, b, c, d){\n    this.a = a;\n    this.b = b;\n    this.c = c;\n    this.d = d;\n}\n\nSpecificity.prototype = {\n    constructor: Specificity,\n    compare: function(other){\n        var comps = [\"a\", \"b\", \"c\", \"d\"],\n            i, len;\n            \n        for (i=0, len=comps.length; i < len; i++){\n            if (this[comps[i]] < other[comps[i]]){\n                return -1;\n            } else if (this[comps[i]] > other[comps[i]]){\n                return 1;\n            }\n        }\n        \n        return 0;\n    },\n    valueOf: function(){\n        return (this.a * 1000) + (this.b * 100) + (this.c * 10) + this.d;\n    },\n    toString: function(){\n        return this.a + \",\" + this.b + \",\" + this.c + \",\" + this.d;\n    }\n\n};\nSpecificity.calculate = function(selector){\n\n    var i, len,\n        part,\n        b=0, c=0, d=0;\n        \n    function updateValues(part){\n    \n        var i, j, len, num,\n            elementName = part.elementName ? part.elementName.text : \"\",\n            modifier;\n    \n        if (elementName && elementName.charAt(elementName.length-1) != \"*\") {\n            d++;\n        }    \n    \n        for (i=0, len=part.modifiers.length; i < len; i++){\n            modifier = part.modifiers[i];\n            switch(modifier.type){\n                case \"class\":\n                case \"attribute\":\n                    c++;\n                    break;\n                    \n                case \"id\":\n                    b++;\n                    break;\n                    \n                case \"pseudo\":\n                    if (Pseudos.isElement(modifier.text)){\n                        d++;\n                    } else {\n                        c++;\n                    }                    \n                    break;\n                    \n                case \"not\":\n                    for (j=0, num=modifier.args.length; j < num; j++){\n                        updateValues(modifier.args[j]);\n                    }\n            }    \n         }\n    }\n    \n    for (i=0, len=selector.parts.length; i < len; i++){\n        part = selector.parts[i];\n        \n        if (part instanceof SelectorPart){\n            updateValues(part);                \n        }\n    }\n    \n    return new Specificity(0, b, c, d);\n};\n\nvar h = /^[0-9a-fA-F]$/,\n    nonascii = /^[\\u0080-\\uFFFF]$/,\n    nl = /\\n|\\r\\n|\\r|\\f/;\n\n\nfunction isHexDigit(c){\n    return c !== null && h.test(c);\n}\n\nfunction isDigit(c){\n    return c !== null && /\\d/.test(c);\n}\n\nfunction isWhitespace(c){\n    return c !== null && /\\s/.test(c);\n}\n\nfunction isNewLine(c){\n    return c !== null && nl.test(c);\n}\n\nfunction isNameStart(c){\n    return c !== null && (/[a-z_\\u0080-\\uFFFF\\\\]/i.test(c));\n}\n\nfunction isNameChar(c){\n    return c !== null && (isNameStart(c) || /[0-9\\-\\\\]/.test(c));\n}\n\nfunction isIdentStart(c){\n    return c !== null && (isNameStart(c) || /\\-\\\\/.test(c));\n}\n\nfunction mix(receiver, supplier){\n\tfor (var prop in supplier){\n\t\tif (supplier.hasOwnProperty(prop)){\n\t\t\treceiver[prop] = supplier[prop];\n\t\t}\n\t}\n\treturn receiver;\n}\nfunction TokenStream(input){\n\tTokenStreamBase.call(this, input, Tokens);\n}\n\nTokenStream.prototype = mix(new TokenStreamBase(), {\n    _getToken: function(channel){\n\n        var c,\n            reader = this._reader,\n            token   = null,\n            startLine   = reader.getLine(),\n            startCol    = reader.getCol();\n\n        c = reader.read();\n\n\n        while(c){\n            switch(c){\n                case \"/\":\n\n                    if(reader.peek() == \"*\"){\n                        token = this.commentToken(c, startLine, startCol);\n                    } else {\n                        token = this.charToken(c, startLine, startCol);\n                    }\n                    break;\n                case \"|\":\n                case \"~\":\n                case \"^\":\n                case \"$\":\n                case \"*\":\n                    if(reader.peek() == \"=\"){\n                        token = this.comparisonToken(c, startLine, startCol);\n                    } else {\n                        token = this.charToken(c, startLine, startCol);\n                    }\n                    break;\n                case \"\\\"\":\n                case \"'\":\n                    token = this.stringToken(c, startLine, startCol);\n                    break;\n                case \"#\":\n                    if (isNameChar(reader.peek())){\n                        token = this.hashToken(c, startLine, startCol);\n                    } else {\n                        token = this.charToken(c, startLine, startCol);\n                    }\n                    break;\n                case \".\":\n                    if (isDigit(reader.peek())){\n                        token = this.numberToken(c, startLine, startCol);\n                    } else {\n                        token = this.charToken(c, startLine, startCol);\n                    }\n                    break;\n                case \"-\":\n                    if (reader.peek() == \"-\"){  //could be closing HTML-style comment\n                        token = this.htmlCommentEndToken(c, startLine, startCol);\n                    } else if (isNameStart(reader.peek())){\n                        token = this.identOrFunctionToken(c, startLine, startCol);\n                    } else {\n                        token = this.charToken(c, startLine, startCol);\n                    }\n                    break;\n                case \"!\":\n                    token = this.importantToken(c, startLine, startCol);\n                    break;\n                case \"@\":\n                    token = this.atRuleToken(c, startLine, startCol);\n                    break;\n                case \":\":\n                    token = this.notToken(c, startLine, startCol);\n                    break;\n                case \"<\":\n                    token = this.htmlCommentStartToken(c, startLine, startCol);\n                    break;\n                case \"U\":\n                case \"u\":\n                    if (reader.peek() == \"+\"){\n                        token = this.unicodeRangeToken(c, startLine, startCol);\n                        break;\n                    }\n                default:\n                    if (isDigit(c)){\n                        token = this.numberToken(c, startLine, startCol);\n                    } else\n                    if (isWhitespace(c)){\n                        token = this.whitespaceToken(c, startLine, startCol);\n                    } else\n                    if (isIdentStart(c)){\n                        token = this.identOrFunctionToken(c, startLine, startCol);\n                    } else\n                    {\n                        token = this.charToken(c, startLine, startCol);\n                    }\n\n\n\n\n\n\n            }\n            break;\n        }\n\n        if (!token && c === null){\n            token = this.createToken(Tokens.EOF,null,startLine,startCol);\n        }\n\n        return token;\n    },\n    createToken: function(tt, value, startLine, startCol, options){\n        var reader = this._reader;\n        options = options || {};\n\n        return {\n            value:      value,\n            type:       tt,\n            channel:    options.channel,\n            hide:       options.hide || false,\n            startLine:  startLine,\n            startCol:   startCol,\n            endLine:    reader.getLine(),\n            endCol:     reader.getCol()\n        };\n    },\n    atRuleToken: function(first, startLine, startCol){\n        var rule    = first,\n            reader  = this._reader,\n            tt      = Tokens.CHAR,\n            valid   = false,\n            ident,\n            c;\n        reader.mark();\n        ident = this.readName();\n        rule = first + ident;\n        tt = Tokens.type(rule.toLowerCase());\n        if (tt == Tokens.CHAR || tt == Tokens.UNKNOWN){\n            if (rule.length > 1){\n                tt = Tokens.UNKNOWN_SYM;                \n            } else {\n                tt = Tokens.CHAR;\n                rule = first;\n                reader.reset();\n            }\n        }\n\n        return this.createToken(tt, rule, startLine, startCol);\n    },\n    charToken: function(c, startLine, startCol){\n        var tt = Tokens.type(c);\n\n        if (tt == -1){\n            tt = Tokens.CHAR;\n        }\n\n        return this.createToken(tt, c, startLine, startCol);\n    },\n    commentToken: function(first, startLine, startCol){\n        var reader  = this._reader,\n            comment = this.readComment(first);\n\n        return this.createToken(Tokens.COMMENT, comment, startLine, startCol);\n    },\n    comparisonToken: function(c, startLine, startCol){\n        var reader  = this._reader,\n            comparison  = c + reader.read(),\n            tt      = Tokens.type(comparison) || Tokens.CHAR;\n\n        return this.createToken(tt, comparison, startLine, startCol);\n    },\n    hashToken: function(first, startLine, startCol){\n        var reader  = this._reader,\n            name    = this.readName(first);\n\n        return this.createToken(Tokens.HASH, name, startLine, startCol);\n    },\n    htmlCommentStartToken: function(first, startLine, startCol){\n        var reader      = this._reader,\n            text        = first;\n\n        reader.mark();\n        text += reader.readCount(3);\n\n        if (text == \"<!--\"){\n            return this.createToken(Tokens.CDO, text, startLine, startCol);\n        } else {\n            reader.reset();\n            return this.charToken(first, startLine, startCol);\n        }\n    },\n    htmlCommentEndToken: function(first, startLine, startCol){\n        var reader      = this._reader,\n            text        = first;\n\n        reader.mark();\n        text += reader.readCount(2);\n\n        if (text == \"-->\"){\n            return this.createToken(Tokens.CDC, text, startLine, startCol);\n        } else {\n            reader.reset();\n            return this.charToken(first, startLine, startCol);\n        }\n    },\n    identOrFunctionToken: function(first, startLine, startCol){\n        var reader  = this._reader,\n            ident   = this.readName(first),\n            tt      = Tokens.IDENT;\n        if (reader.peek() == \"(\"){\n            ident += reader.read();\n            if (ident.toLowerCase() == \"url(\"){\n                tt = Tokens.URI;\n                ident = this.readURI(ident);\n                if (ident.toLowerCase() == \"url(\"){\n                    tt = Tokens.FUNCTION;\n                }\n            } else {\n                tt = Tokens.FUNCTION;\n            }\n        } else if (reader.peek() == \":\"){  //might be an IE function\n            if (ident.toLowerCase() == \"progid\"){\n                ident += reader.readTo(\"(\");\n                tt = Tokens.IE_FUNCTION;\n            }\n        }\n\n        return this.createToken(tt, ident, startLine, startCol);\n    },\n    importantToken: function(first, startLine, startCol){\n        var reader      = this._reader,\n            important   = first,\n            tt          = Tokens.CHAR,\n            temp,\n            c;\n\n        reader.mark();\n        c = reader.read();\n\n        while(c){\n            if (c == \"/\"){\n                if (reader.peek() != \"*\"){\n                    break;\n                } else {\n                    temp = this.readComment(c);\n                    if (temp === \"\"){    //broken!\n                        break;\n                    }\n                }\n            } else if (isWhitespace(c)){\n                important += c + this.readWhitespace();\n            } else if (/i/i.test(c)){\n                temp = reader.readCount(8);\n                if (/mportant/i.test(temp)){\n                    important += c + temp;\n                    tt = Tokens.IMPORTANT_SYM;\n\n                }\n                break;  //we're done\n            } else {\n                break;\n            }\n\n            c = reader.read();\n        }\n\n        if (tt == Tokens.CHAR){\n            reader.reset();\n            return this.charToken(first, startLine, startCol);\n        } else {\n            return this.createToken(tt, important, startLine, startCol);\n        }\n\n\n    },\n    notToken: function(first, startLine, startCol){\n        var reader      = this._reader,\n            text        = first;\n\n        reader.mark();\n        text += reader.readCount(4);\n\n        if (text.toLowerCase() == \":not(\"){\n            return this.createToken(Tokens.NOT, text, startLine, startCol);\n        } else {\n            reader.reset();\n            return this.charToken(first, startLine, startCol);\n        }\n    },\n    numberToken: function(first, startLine, startCol){\n        var reader  = this._reader,\n            value   = this.readNumber(first),\n            ident,\n            tt      = Tokens.NUMBER,\n            c       = reader.peek();\n\n        if (isIdentStart(c)){\n            ident = this.readName(reader.read());\n            value += ident;\n\n            if (/^em$|^ex$|^px$|^gd$|^rem$|^vw$|^vh$|^vm$|^ch$|^cm$|^mm$|^in$|^pt$|^pc$/i.test(ident)){\n                tt = Tokens.LENGTH;\n            } else if (/^deg|^rad$|^grad$/i.test(ident)){\n                tt = Tokens.ANGLE;\n            } else if (/^ms$|^s$/i.test(ident)){\n                tt = Tokens.TIME;\n            } else if (/^hz$|^khz$/i.test(ident)){\n                tt = Tokens.FREQ;\n            } else if (/^dpi$|^dpcm$/i.test(ident)){\n                tt = Tokens.RESOLUTION;\n            } else {\n                tt = Tokens.DIMENSION;\n            }\n\n        } else if (c == \"%\"){\n            value += reader.read();\n            tt = Tokens.PERCENTAGE;\n        }\n\n        return this.createToken(tt, value, startLine, startCol);\n    },\n    stringToken: function(first, startLine, startCol){\n        var delim   = first,\n            string  = first,\n            reader  = this._reader,\n            prev    = first,\n            tt      = Tokens.STRING,\n            c       = reader.read();\n\n        while(c){\n            string += c;\n            if (c == delim && prev != \"\\\\\"){\n                break;\n            }\n            if (isNewLine(reader.peek()) && c != \"\\\\\"){\n                tt = Tokens.INVALID;\n                break;\n            }\n            prev = c;\n            c = reader.read();\n        }\n        if (c === null){\n            tt = Tokens.INVALID;\n        }\n\n        return this.createToken(tt, string, startLine, startCol);\n    },\n\n    unicodeRangeToken: function(first, startLine, startCol){\n        var reader  = this._reader,\n            value   = first,\n            temp,\n            tt      = Tokens.CHAR;\n        if (reader.peek() == \"+\"){\n            reader.mark();\n            value += reader.read();\n            value += this.readUnicodeRangePart(true);\n            if (value.length == 2){\n                reader.reset();\n            } else {\n\n                tt = Tokens.UNICODE_RANGE;\n                if (value.indexOf(\"?\") == -1){\n\n                    if (reader.peek() == \"-\"){\n                        reader.mark();\n                        temp = reader.read();\n                        temp += this.readUnicodeRangePart(false);\n                        if (temp.length == 1){\n                            reader.reset();\n                        } else {\n                            value += temp;\n                        }\n                    }\n\n                }\n            }\n        }\n\n        return this.createToken(tt, value, startLine, startCol);\n    },\n    whitespaceToken: function(first, startLine, startCol){\n        var reader  = this._reader,\n            value   = first + this.readWhitespace();\n        return this.createToken(Tokens.S, value, startLine, startCol);\n    },\n\n    readUnicodeRangePart: function(allowQuestionMark){\n        var reader  = this._reader,\n            part = \"\",\n            c       = reader.peek();\n        while(isHexDigit(c) && part.length < 6){\n            reader.read();\n            part += c;\n            c = reader.peek();\n        }\n        if (allowQuestionMark){\n            while(c == \"?\" && part.length < 6){\n                reader.read();\n                part += c;\n                c = reader.peek();\n            }\n        }\n\n        return part;\n    },\n\n    readWhitespace: function(){\n        var reader  = this._reader,\n            whitespace = \"\",\n            c       = reader.peek();\n\n        while(isWhitespace(c)){\n            reader.read();\n            whitespace += c;\n            c = reader.peek();\n        }\n\n        return whitespace;\n    },\n    readNumber: function(first){\n        var reader  = this._reader,\n            number  = first,\n            hasDot  = (first == \".\"),\n            c       = reader.peek();\n\n\n        while(c){\n            if (isDigit(c)){\n                number += reader.read();\n            } else if (c == \".\"){\n                if (hasDot){\n                    break;\n                } else {\n                    hasDot = true;\n                    number += reader.read();\n                }\n            } else {\n                break;\n            }\n\n            c = reader.peek();\n        }\n\n        return number;\n    },\n    readString: function(){\n        var reader  = this._reader,\n            delim   = reader.read(),\n            string  = delim,\n            prev    = delim,\n            c       = reader.peek();\n\n        while(c){\n            c = reader.read();\n            string += c;\n            if (c == delim && prev != \"\\\\\"){\n                break;\n            }\n            if (isNewLine(reader.peek()) && c != \"\\\\\"){\n                string = \"\";\n                break;\n            }\n            prev = c;\n            c = reader.peek();\n        }\n        if (c === null){\n            string = \"\";\n        }\n\n        return string;\n    },\n    readURI: function(first){\n        var reader  = this._reader,\n            uri     = first,\n            inner   = \"\",\n            c       = reader.peek();\n\n        reader.mark();\n        while(c && isWhitespace(c)){\n            reader.read();\n            c = reader.peek();\n        }\n        if (c == \"'\" || c == \"\\\"\"){\n            inner = this.readString();\n        } else {\n            inner = this.readURL();\n        }\n\n        c = reader.peek();\n        while(c && isWhitespace(c)){\n            reader.read();\n            c = reader.peek();\n        }\n        if (inner === \"\" || c != \")\"){\n            uri = first;\n            reader.reset();\n        } else {\n            uri += inner + reader.read();\n        }\n\n        return uri;\n    },\n    readURL: function(){\n        var reader  = this._reader,\n            url     = \"\",\n            c       = reader.peek();\n        while (/^[!#$%&\\\\*-~]$/.test(c)){\n            url += reader.read();\n            c = reader.peek();\n        }\n\n        return url;\n\n    },\n    readName: function(first){\n        var reader  = this._reader,\n            ident   = first || \"\",\n            c       = reader.peek();\n\n        while(true){\n            if (c == \"\\\\\"){\n                ident += this.readEscape(reader.read());\n                c = reader.peek();\n            } else if(c && isNameChar(c)){\n                ident += reader.read();\n                c = reader.peek();\n            } else {\n                break;\n            }\n        }\n\n        return ident;\n    },\n    \n    readEscape: function(first){\n        var reader  = this._reader,\n            cssEscape = first || \"\",\n            i       = 0,\n            c       = reader.peek();    \n    \n        if (isHexDigit(c)){\n            do {\n                cssEscape += reader.read();\n                c = reader.peek();\n            } while(c && isHexDigit(c) && ++i < 6);\n        }\n        \n        if (cssEscape.length == 3 && /\\s/.test(c) ||\n            cssEscape.length == 7 || cssEscape.length == 1){\n                reader.read();\n        } else {\n            c = \"\";\n        }\n        \n        return cssEscape + c;\n    },\n    \n    readComment: function(first){\n        var reader  = this._reader,\n            comment = first || \"\",\n            c       = reader.read();\n\n        if (c == \"*\"){\n            while(c){\n                comment += c;\n                if (comment.length > 2 && c == \"*\" && reader.peek() == \"/\"){\n                    comment += reader.read();\n                    break;\n                }\n\n                c = reader.read();\n            }\n\n            return comment;\n        } else {\n            return \"\";\n        }\n\n    }\n});\n\n\nvar Tokens  = [\n    { name: \"CDO\"},\n    { name: \"CDC\"},\n    { name: \"S\", whitespace: true/*, channel: \"ws\"*/},\n    { name: \"COMMENT\", comment: true, hide: true, channel: \"comment\" },\n    { name: \"INCLUDES\", text: \"~=\"},\n    { name: \"DASHMATCH\", text: \"|=\"},\n    { name: \"PREFIXMATCH\", text: \"^=\"},\n    { name: \"SUFFIXMATCH\", text: \"$=\"},\n    { name: \"SUBSTRINGMATCH\", text: \"*=\"},\n    { name: \"STRING\"},     \n    { name: \"IDENT\"},\n    { name: \"HASH\"},\n    { name: \"IMPORT_SYM\", text: \"@import\"},\n    { name: \"PAGE_SYM\", text: \"@page\"},\n    { name: \"MEDIA_SYM\", text: \"@media\"},\n    { name: \"FONT_FACE_SYM\", text: \"@font-face\"},\n    { name: \"CHARSET_SYM\", text: \"@charset\"},\n    { name: \"NAMESPACE_SYM\", text: \"@namespace\"},\n    { name: \"UNKNOWN_SYM\" },\n    { name: \"KEYFRAMES_SYM\", text: [ \"@keyframes\", \"@-webkit-keyframes\", \"@-moz-keyframes\", \"@-o-keyframes\" ] },\n    { name: \"IMPORTANT_SYM\"},\n    { name: \"LENGTH\"},\n    { name: \"ANGLE\"},\n    { name: \"TIME\"},\n    { name: \"FREQ\"},\n    { name: \"DIMENSION\"},\n    { name: \"PERCENTAGE\"},\n    { name: \"NUMBER\"},\n    { name: \"URI\"},\n    { name: \"FUNCTION\"},\n    { name: \"UNICODE_RANGE\"},    \n    { name: \"INVALID\"},\n    { name: \"PLUS\", text: \"+\" },\n    { name: \"GREATER\", text: \">\"},\n    { name: \"COMMA\", text: \",\"},\n    { name: \"TILDE\", text: \"~\"},\n    { name: \"NOT\"},        \n    { name: \"TOPLEFTCORNER_SYM\", text: \"@top-left-corner\"},\n    { name: \"TOPLEFT_SYM\", text: \"@top-left\"},\n    { name: \"TOPCENTER_SYM\", text: \"@top-center\"},\n    { name: \"TOPRIGHT_SYM\", text: \"@top-right\"},\n    { name: \"TOPRIGHTCORNER_SYM\", text: \"@top-right-corner\"},\n    { name: \"BOTTOMLEFTCORNER_SYM\", text: \"@bottom-left-corner\"},\n    { name: \"BOTTOMLEFT_SYM\", text: \"@bottom-left\"},\n    { name: \"BOTTOMCENTER_SYM\", text: \"@bottom-center\"},\n    { name: \"BOTTOMRIGHT_SYM\", text: \"@bottom-right\"},\n    { name: \"BOTTOMRIGHTCORNER_SYM\", text: \"@bottom-right-corner\"},\n    { name: \"LEFTTOP_SYM\", text: \"@left-top\"},\n    { name: \"LEFTMIDDLE_SYM\", text: \"@left-middle\"},\n    { name: \"LEFTBOTTOM_SYM\", text: \"@left-bottom\"},\n    { name: \"RIGHTTOP_SYM\", text: \"@right-top\"},\n    { name: \"RIGHTMIDDLE_SYM\", text: \"@right-middle\"},\n    { name: \"RIGHTBOTTOM_SYM\", text: \"@right-bottom\"},\n    { name: \"RESOLUTION\", state: \"media\"},\n    { name: \"IE_FUNCTION\" },\n    { name: \"CHAR\" },\n    {\n        name: \"PIPE\",\n        text: \"|\"\n    },\n    {\n        name: \"SLASH\",\n        text: \"/\"\n    },\n    {\n        name: \"MINUS\",\n        text: \"-\"\n    },\n    {\n        name: \"STAR\",\n        text: \"*\"\n    },\n\n    {\n        name: \"LBRACE\",\n        text: \"{\"\n    },   \n    {\n        name: \"RBRACE\",\n        text: \"}\"\n    },      \n    {\n        name: \"LBRACKET\",\n        text: \"[\"\n    },   \n    {\n        name: \"RBRACKET\",\n        text: \"]\"\n    },    \n    {\n        name: \"EQUALS\",\n        text: \"=\"\n    },\n    {\n        name: \"COLON\",\n        text: \":\"\n    },    \n    {\n        name: \"SEMICOLON\",\n        text: \";\"\n    },    \n \n    {\n        name: \"LPAREN\",\n        text: \"(\"\n    },   \n    {\n        name: \"RPAREN\",\n        text: \")\"\n    },     \n    {\n        name: \"DOT\",\n        text: \".\"\n    }\n];\n\n(function(){\n\n    var nameMap = [],\n        typeMap = {};\n    \n    Tokens.UNKNOWN = -1;\n    Tokens.unshift({name:\"EOF\"});\n    for (var i=0, len = Tokens.length; i < len; i++){\n        nameMap.push(Tokens[i].name);\n        Tokens[Tokens[i].name] = i;\n        if (Tokens[i].text){\n            if (Tokens[i].text instanceof Array){\n                for (var j=0; j < Tokens[i].text.length; j++){\n                    typeMap[Tokens[i].text[j]] = i;\n                }\n            } else {\n                typeMap[Tokens[i].text] = i;\n            }\n        }\n    }\n    \n    Tokens.name = function(tt){\n        return nameMap[tt];\n    };\n    \n    Tokens.type = function(c){\n        return typeMap[c] || -1;\n    };\n\n})();\nvar Validation = {\n\n    validate: function(property, value){\n        var name        = property.toString().toLowerCase(),\n            parts       = value.parts,\n            expression  = new PropertyValueIterator(value),\n            spec        = Properties[name],\n            part,\n            valid,            \n            j, count,\n            msg,\n            types,\n            last,\n            literals,\n            max, multi, group;\n            \n        if (!spec) {\n            if (name.indexOf(\"-\") !== 0){    //vendor prefixed are ok\n                throw new ValidationError(\"Unknown property '\" + property + \"'.\", property.line, property.col);\n            }\n        } else if (typeof spec != \"number\"){\n            if (typeof spec == \"string\"){\n                if (spec.indexOf(\"||\") > -1) {\n                    this.groupProperty(spec, expression);\n                } else {\n                    this.singleProperty(spec, expression, 1);\n                }\n\n            } else if (spec.multi) {\n                this.multiProperty(spec.multi, expression, spec.comma, spec.max || Infinity);\n            } else if (typeof spec == \"function\") {\n                spec(expression);\n            }\n\n        }\n\n    },\n    \n    singleProperty: function(types, expression, max, partial) {\n\n        var result      = false,\n            value       = expression.value,\n            count       = 0,\n            part;\n         \n        while (expression.hasNext() && count < max) {\n            result = ValidationTypes.isAny(expression, types);\n            if (!result) {\n                break;\n            }\n            count++;\n        }\n        \n        if (!result) {\n            if (expression.hasNext() && !expression.isFirst()) {\n                part = expression.peek();\n                throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n            } else {\n                 throw new ValidationError(\"Expected (\" + types + \") but found '\" + value + \"'.\", value.line, value.col);\n            }        \n        } else if (expression.hasNext()) {\n            part = expression.next();\n            throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n        }          \n                 \n    },    \n    \n    multiProperty: function (types, expression, comma, max) {\n\n        var result      = false,\n            value       = expression.value,\n            count       = 0,\n            sep         = false,\n            part;\n            \n        while(expression.hasNext() && !result && count < max) {\n            if (ValidationTypes.isAny(expression, types)) {\n                count++;\n                if (!expression.hasNext()) {\n                    result = true;\n\n                } else if (comma) {\n                    if (expression.peek() == \",\") {\n                        part = expression.next();\n                    } else {\n                        break;\n                    }\n                }\n            } else {\n                break;\n\n            }\n        }\n        \n        if (!result) {\n            if (expression.hasNext() && !expression.isFirst()) {\n                part = expression.peek();\n                throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n            } else {\n                part = expression.previous();\n                if (comma && part == \",\") {\n                    throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col); \n                } else {\n                    throw new ValidationError(\"Expected (\" + types + \") but found '\" + value + \"'.\", value.line, value.col);\n                }\n            }\n        \n        } else if (expression.hasNext()) {\n            part = expression.next();\n            throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n        }  \n\n    },\n    \n    groupProperty: function (types, expression, comma) {\n\n        var result      = false,\n            value       = expression.value,\n            typeCount   = types.split(\"||\").length,\n            groups      = { count: 0 },\n            partial     = false,\n            name,\n            part;\n            \n        while(expression.hasNext() && !result) {\n            name = ValidationTypes.isAnyOfGroup(expression, types);\n            if (name) {\n                if (groups[name]) {\n                    break;\n                } else {\n                    groups[name] = 1;\n                    groups.count++;\n                    partial = true;\n                    \n                    if (groups.count == typeCount || !expression.hasNext()) {\n                        result = true;\n                    }\n                }\n            } else {\n                break;\n            }\n        }\n        \n        if (!result) {        \n            if (partial && expression.hasNext()) {\n                    part = expression.peek();\n                    throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n            } else {\n                throw new ValidationError(\"Expected (\" + types + \") but found '\" + value + \"'.\", value.line, value.col);\n            }\n        } else if (expression.hasNext()) {\n            part = expression.next();\n            throw new ValidationError(\"Expected end of value but found '\" + part + \"'.\", part.line, part.col);\n        }           \n    }\n\n    \n\n};\nfunction ValidationError(message, line, col){\n    this.col = col;\n    this.line = line;\n    this.message = message;\n\n}\nValidationError.prototype = new Error();\nvar ValidationTypes = {\n\n    isLiteral: function (part, literals) {\n        var text = part.text.toString().toLowerCase(),\n            args = literals.split(\" | \"),\n            i, len, found = false;\n        \n        for (i=0,len=args.length; i < len && !found; i++){\n            if (text == args[i].toLowerCase()){\n                found = true;\n            }\n        }\n        \n        return found;    \n    },\n    \n    isSimple: function(type) {\n        return !!this.simple[type];\n    },\n    \n    isComplex: function(type) {\n        return !!this.complex[type];\n    },\n    isAny: function (expression, types) {\n        var args = types.split(\" | \"),\n            i, len, found = false;\n        \n        for (i=0,len=args.length; i < len && !found && expression.hasNext(); i++){\n            found = this.isType(expression, args[i]);\n        }\n        \n        return found;    \n    },\n    isAnyOfGroup: function(expression, types) {\n        var args = types.split(\" || \"),\n            i, len, found = false;\n        \n        for (i=0,len=args.length; i < len && !found; i++){\n            found = this.isType(expression, args[i]);\n        }\n        \n        return found ? args[i-1] : false;\n    },\n    isType: function (expression, type) {\n        var part = expression.peek(),\n            result = false;\n            \n        if (type.charAt(0) != \"<\") {\n            result = this.isLiteral(part, type);\n            if (result) {\n                expression.next();\n            }\n        } else if (this.simple[type]) {\n            result = this.simple[type](part);\n            if (result) {\n                expression.next();\n            }\n        } else {\n            result = this.complex[type](expression);\n        }\n        \n        return result;\n    },\n    \n    \n    \n    simple: {\n\n        \"<absolute-size>\": function(part){\n            return ValidationTypes.isLiteral(part, \"xx-small | x-small | small | medium | large | x-large | xx-large\");\n        },\n        \n        \"<attachment>\": function(part){\n            return ValidationTypes.isLiteral(part, \"scroll | fixed | local\");\n        },\n        \n        \"<attr>\": function(part){\n            return part.type == \"function\" && part.name == \"attr\";\n        },\n                \n        \"<bg-image>\": function(part){\n            return this[\"<image>\"](part) || this[\"<gradient>\"](part) ||  part == \"none\";\n        },        \n        \n        \"<gradient>\": function(part) {\n            return part.type == \"function\" && /^(?:\\-(?:ms|moz|o|webkit)\\-)?(?:repeating\\-)?(?:radial\\-|linear\\-)?gradient/i.test(part);\n        },\n        \n        \"<box>\": function(part){\n            return ValidationTypes.isLiteral(part, \"padding-box | border-box | content-box\");\n        },\n        \n        \"<content>\": function(part){\n            return part.type == \"function\" && part.name == \"content\";\n        },        \n        \n        \"<relative-size>\": function(part){\n            return ValidationTypes.isLiteral(part, \"smaller | larger\");\n        },\n        \"<ident>\": function(part){\n            return part.type == \"identifier\";\n        },\n        \n        \"<length>\": function(part){\n            if (part.type == \"function\" && /^(?:\\-(?:ms|moz|o|webkit)\\-)?calc/i.test(part)){\n                return true;\n            }else{\n                return part.type == \"length\" || part.type == \"number\" || part.type == \"integer\" || part == \"0\";\n            }\n        },\n        \n        \"<color>\": function(part){\n            return part.type == \"color\" || part == \"transparent\";\n        },\n        \n        \"<number>\": function(part){\n            return part.type == \"number\" || this[\"<integer>\"](part);\n        },\n        \n        \"<integer>\": function(part){\n            return part.type == \"integer\";\n        },\n        \n        \"<line>\": function(part){\n            return part.type == \"integer\";\n        },\n        \n        \"<angle>\": function(part){\n            return part.type == \"angle\";\n        },        \n        \n        \"<uri>\": function(part){\n            return part.type == \"uri\";\n        },\n        \n        \"<image>\": function(part){\n            return this[\"<uri>\"](part);\n        },\n        \n        \"<percentage>\": function(part){\n            return part.type == \"percentage\" || part == \"0\";\n        },\n\n        \"<border-width>\": function(part){\n            return this[\"<length>\"](part) || ValidationTypes.isLiteral(part, \"thin | medium | thick\");\n        },\n        \n        \"<border-style>\": function(part){\n            return ValidationTypes.isLiteral(part, \"none | hidden | dotted | dashed | solid | double | groove | ridge | inset | outset\");\n        },\n        \n        \"<margin-width>\": function(part){\n            return this[\"<length>\"](part) || this[\"<percentage>\"](part) || ValidationTypes.isLiteral(part, \"auto\");\n        },\n        \n        \"<padding-width>\": function(part){\n            return this[\"<length>\"](part) || this[\"<percentage>\"](part);\n        },\n        \n        \"<shape>\": function(part){\n            return part.type == \"function\" && (part.name == \"rect\" || part.name == \"inset-rect\");\n        },\n        \n        \"<time>\": function(part) {\n            return part.type == \"time\";\n        }\n    },\n    \n    complex: {\n\n        \"<bg-position>\": function(expression){\n            var types   = this,\n                result  = false,\n                numeric = \"<percentage> | <length>\",\n                xDir    = \"left | right\",\n                yDir    = \"top | bottom\",\n                count = 0,\n                hasNext = function() {\n                    return expression.hasNext() && expression.peek() != \",\";\n                };\n\n            while (expression.peek(count) && expression.peek(count) != \",\") {\n                count++;\n            }\n\n            if (count < 3) {\n                if (ValidationTypes.isAny(expression, xDir + \" | center | \" + numeric)) {\n                        result = true;\n                        ValidationTypes.isAny(expression, yDir + \" | center | \" + numeric);\n                } else if (ValidationTypes.isAny(expression, yDir)) {\n                        result = true;\n                        ValidationTypes.isAny(expression, xDir + \" | center\");\n                }\n            } else {\n                if (ValidationTypes.isAny(expression, xDir)) {\n                    if (ValidationTypes.isAny(expression, yDir)) {\n                        result = true;\n                        ValidationTypes.isAny(expression, numeric);\n                    } else if (ValidationTypes.isAny(expression, numeric)) {\n                        if (ValidationTypes.isAny(expression, yDir)) {\n                            result = true;\n                            ValidationTypes.isAny(expression, numeric);\n                        } else if (ValidationTypes.isAny(expression, \"center\")) {\n                            result = true;\n                        }\n                    }\n                } else if (ValidationTypes.isAny(expression, yDir)) {\n                    if (ValidationTypes.isAny(expression, xDir)) {\n                        result = true;\n                        ValidationTypes.isAny(expression, numeric);\n                    } else if (ValidationTypes.isAny(expression, numeric)) {\n                        if (ValidationTypes.isAny(expression, xDir)) {\n                                result = true;\n                                ValidationTypes.isAny(expression, numeric);\n                        } else if (ValidationTypes.isAny(expression, \"center\")) {\n                            result = true;\n                        }\n                    }\n                } else if (ValidationTypes.isAny(expression, \"center\")) {\n                    if (ValidationTypes.isAny(expression, xDir + \" | \" + yDir)) {\n                        result = true;\n                        ValidationTypes.isAny(expression, numeric);\n                    }\n                }\n            }\n            \n            return result;\n        },\n\n        \"<bg-size>\": function(expression){\n            var types   = this,\n                result  = false,\n                numeric = \"<percentage> | <length> | auto\",\n                part,\n                i, len;      \n      \n            if (ValidationTypes.isAny(expression, \"cover | contain\")) {\n                result = true;\n            } else if (ValidationTypes.isAny(expression, numeric)) {\n                result = true;                \n                ValidationTypes.isAny(expression, numeric);\n            }\n            \n            return result;\n        },\n        \n        \"<repeat-style>\": function(expression){\n            var result  = false,\n                values  = \"repeat | space | round | no-repeat\",\n                part;\n            \n            if (expression.hasNext()){\n                part = expression.next();\n                \n                if (ValidationTypes.isLiteral(part, \"repeat-x | repeat-y\")) {\n                    result = true;                    \n                } else if (ValidationTypes.isLiteral(part, values)) {\n                    result = true;\n\n                    if (expression.hasNext() && ValidationTypes.isLiteral(expression.peek(), values)) {\n                        expression.next();\n                    }\n                }\n            }\n            \n            return result;\n            \n        },\n        \n        \"<shadow>\": function(expression) {\n            var result  = false,\n                count   = 0,\n                inset   = false,\n                color   = false,\n                part;\n                \n            if (expression.hasNext()) {            \n                \n                if (ValidationTypes.isAny(expression, \"inset\")){\n                    inset = true;\n                }\n                \n                if (ValidationTypes.isAny(expression, \"<color>\")) {\n                    color = true;\n                }                \n                \n                while (ValidationTypes.isAny(expression, \"<length>\") && count < 4) {\n                    count++;\n                }\n                \n                \n                if (expression.hasNext()) {\n                    if (!color) {\n                        ValidationTypes.isAny(expression, \"<color>\");\n                    }\n                    \n                    if (!inset) {\n                        ValidationTypes.isAny(expression, \"inset\");\n                    }\n\n                }\n                \n                result = (count >= 2 && count <= 4);\n            \n            }\n            \n            return result;\n        },\n        \n        \"<x-one-radius>\": function(expression) {\n            var result  = false,\n                count   = 0,\n                numeric = \"<length> | <percentage>\",\n                part;\n                \n            if (ValidationTypes.isAny(expression, numeric)){\n                result = true;\n                \n                ValidationTypes.isAny(expression, numeric);\n            }                \n            \n            return result;\n        }\n    }\n};\n\n\n\nparserlib.css = {\nColors              :Colors,\nCombinator          :Combinator,\nParser              :Parser,\nPropertyName        :PropertyName,\nPropertyValue       :PropertyValue,\nPropertyValuePart   :PropertyValuePart,\nMediaFeature        :MediaFeature,\nMediaQuery          :MediaQuery,\nSelector            :Selector,\nSelectorPart        :SelectorPart,\nSelectorSubPart     :SelectorSubPart,\nSpecificity         :Specificity,\nTokenStream         :TokenStream,\nTokens              :Tokens,\nValidationError     :ValidationError\n};\n})();\nvar CSSLint = (function(){\n\n    var rules           = [],\n        formatters      = [],\n        embeddedRuleset = /\\/\\*csslint([^\\*]*)\\*\\//,\n        api             = new parserlib.util.EventTarget();\n\n    api.version = \"0.9.10\";\n    api.addRule = function(rule){\n        rules.push(rule);\n        rules[rule.id] = rule;\n    };\n    api.clearRules = function(){\n        rules = [];\n    };\n    api.getRules = function(){\n        return [].concat(rules).sort(function(a,b){\n            return a.id > b.id ? 1 : 0;\n        });\n    };\n    api.getRuleset = function() {\n        var ruleset = {},\n            i = 0,\n            len = rules.length;\n\n        while (i < len){\n            ruleset[rules[i++].id] = 1;    //by default, everything is a warning\n        }\n\n        return ruleset;\n    };\n    function applyEmbeddedRuleset(text, ruleset){\n        var valueMap,\n            embedded = text && text.match(embeddedRuleset),\n            rules = embedded && embedded[1];\n\n        if (rules) {\n            valueMap = {\n                \"true\": 2,  // true is error\n                \"\": 1,      // blank is warning\n                \"false\": 0, // false is ignore\n\n                \"2\": 2,     // explicit error\n                \"1\": 1,     // explicit warning\n                \"0\": 0      // explicit ignore\n            };\n\n            rules.toLowerCase().split(\",\").forEach(function(rule){\n                var pair = rule.split(\":\"),\n                    property = pair[0] || \"\",\n                    value = pair[1] || \"\";\n\n                ruleset[property.trim()] = valueMap[value.trim()];\n            });\n        }\n\n        return ruleset;\n    }\n    api.addFormatter = function(formatter) {\n        formatters[formatter.id] = formatter;\n    };\n    api.getFormatter = function(formatId){\n        return formatters[formatId];\n    };\n    api.format = function(results, filename, formatId, options) {\n        var formatter = this.getFormatter(formatId),\n            result = null;\n\n        if (formatter){\n            result = formatter.startFormat();\n            result += formatter.formatResults(results, filename, options || {});\n            result += formatter.endFormat();\n        }\n\n        return result;\n    };\n    api.hasFormat = function(formatId){\n        return formatters.hasOwnProperty(formatId);\n    };\n    api.verify = function(text, ruleset){\n\n        var i       = 0,\n            len     = rules.length,\n            reporter,\n            lines,\n            report,\n            parser = new parserlib.css.Parser({ starHack: true, ieFilters: true,\n                                                underscoreHack: true, strict: false });\n        lines = text.replace(/\\n\\r?/g, \"$split$\").split('$split$');\n\n        if (!ruleset){\n            ruleset = this.getRuleset();\n        }\n\n        if (embeddedRuleset.test(text)){\n            ruleset = applyEmbeddedRuleset(text, ruleset);\n        }\n\n        reporter = new Reporter(lines, ruleset);\n\n        ruleset.errors = 2;       //always report parsing errors as errors\n        for (i in ruleset){\n            if(ruleset.hasOwnProperty(i) && ruleset[i]){\n                if (rules[i]){\n                    rules[i].init(parser, reporter);\n                }\n            }\n        }\n        try {\n            parser.parse(text);\n        } catch (ex) {\n            reporter.error(\"Fatal error, cannot continue: \" + ex.message, ex.line, ex.col, {});\n        }\n\n        report = {\n            messages    : reporter.messages,\n            stats       : reporter.stats,\n            ruleset     : reporter.ruleset\n        };\n        report.messages.sort(function (a, b){\n            if (a.rollup && !b.rollup){\n                return 1;\n            } else if (!a.rollup && b.rollup){\n                return -1;\n            } else {\n                return a.line - b.line;\n            }\n        });\n\n        return report;\n    };\n\n    return api;\n\n})();\nfunction Reporter(lines, ruleset){\n    this.messages = [];\n    this.stats = [];\n    this.lines = lines;\n    this.ruleset = ruleset;\n}\n\nReporter.prototype = {\n    constructor: Reporter,\n    error: function(message, line, col, rule){\n        this.messages.push({\n            type    : \"error\",\n            line    : line,\n            col     : col,\n            message : message,\n            evidence: this.lines[line-1],\n            rule    : rule || {}\n        });\n    },\n    warn: function(message, line, col, rule){\n        this.report(message, line, col, rule);\n    },\n    report: function(message, line, col, rule){\n        this.messages.push({\n            type    : this.ruleset[rule.id] == 2 ? \"error\" : \"warning\",\n            line    : line,\n            col     : col,\n            message : message,\n            evidence: this.lines[line-1],\n            rule    : rule\n        });\n    },\n    info: function(message, line, col, rule){\n        this.messages.push({\n            type    : \"info\",\n            line    : line,\n            col     : col,\n            message : message,\n            evidence: this.lines[line-1],\n            rule    : rule\n        });\n    },\n    rollupError: function(message, rule){\n        this.messages.push({\n            type    : \"error\",\n            rollup  : true,\n            message : message,\n            rule    : rule\n        });\n    },\n    rollupWarn: function(message, rule){\n        this.messages.push({\n            type    : \"warning\",\n            rollup  : true,\n            message : message,\n            rule    : rule\n        });\n    },\n    stat: function(name, value){\n        this.stats[name] = value;\n    }\n};\nCSSLint._Reporter = Reporter;\nCSSLint.Util = {\n    mix: function(receiver, supplier){\n        var prop;\n\n        for (prop in supplier){\n            if (supplier.hasOwnProperty(prop)){\n                receiver[prop] = supplier[prop];\n            }\n        }\n\n        return prop;\n    },\n    indexOf: function(values, value){\n        if (values.indexOf){\n            return values.indexOf(value);\n        } else {\n            for (var i=0, len=values.length; i < len; i++){\n                if (values[i] === value){\n                    return i;\n                }\n            }\n            return -1;\n        }\n    },\n    forEach: function(values, func) {\n        if (values.forEach){\n            return values.forEach(func);\n        } else {\n            for (var i=0, len=values.length; i < len; i++){\n                func(values[i], i, values);\n            }\n        }\n    }\n};\nCSSLint.addRule({\n    id: \"adjoining-classes\",\n    name: \"Disallow adjoining classes\",\n    desc: \"Don't use adjoining classes.\",\n    browsers: \"IE6\",\n    init: function(parser, reporter){\n        var rule = this;\n        parser.addListener(\"startrule\", function(event){\n            var selectors = event.selectors,\n                selector,\n                part,\n                modifier,\n                classCount,\n                i, j, k;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n                for (j=0; j < selector.parts.length; j++){\n                    part = selector.parts[j];\n                    if (part.type == parser.SELECTOR_PART_TYPE){\n                        classCount = 0;\n                        for (k=0; k < part.modifiers.length; k++){\n                            modifier = part.modifiers[k];\n                            if (modifier.type == \"class\"){\n                                classCount++;\n                            }\n                            if (classCount > 1){\n                                reporter.report(\"Don't use adjoining classes.\", part.line, part.col, rule);\n                            }\n                        }\n                    }\n                }\n            }\n        });\n    }\n\n});\nCSSLint.addRule({\n    id: \"box-model\",\n    name: \"Beware of broken box size\",\n    desc: \"Don't use width or height when using padding or border.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            widthProperties = {\n                border: 1,\n                \"border-left\": 1,\n                \"border-right\": 1,\n                padding: 1,\n                \"padding-left\": 1,\n                \"padding-right\": 1\n            },\n            heightProperties = {\n                border: 1,\n                \"border-bottom\": 1,\n                \"border-top\": 1,\n                padding: 1,\n                \"padding-bottom\": 1,\n                \"padding-top\": 1\n            },\n            properties,\n            boxSizing = false;\n\n        function startRule(){\n            properties = {};\n            boxSizing = false;\n        }\n\n        function endRule(){\n            var prop, value;\n            \n            if (!boxSizing) {\n                if (properties.height){\n                    for (prop in heightProperties){\n                        if (heightProperties.hasOwnProperty(prop) && properties[prop]){\n                            value = properties[prop].value;\n                            if (!(prop == \"padding\" && value.parts.length === 2 && value.parts[0].value === 0)){\n                                reporter.report(\"Using height with \" + prop + \" can sometimes make elements larger than you expect.\", properties[prop].line, properties[prop].col, rule);\n                            }\n                        }\n                    }\n                }\n\n                if (properties.width){\n                    for (prop in widthProperties){\n                        if (widthProperties.hasOwnProperty(prop) && properties[prop]){\n                            value = properties[prop].value;\n                            \n                            if (!(prop == \"padding\" && value.parts.length === 2 && value.parts[1].value === 0)){\n                                reporter.report(\"Using width with \" + prop + \" can sometimes make elements larger than you expect.\", properties[prop].line, properties[prop].col, rule);\n                            }\n                        }\n                    }\n                }   \n            }     \n        }\n\n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"startpage\", startRule);\n        parser.addListener(\"startpagemargin\", startRule);\n        parser.addListener(\"startkeyframerule\", startRule); \n\n        parser.addListener(\"property\", function(event){\n            var name = event.property.text.toLowerCase();\n            \n            if (heightProperties[name] || widthProperties[name]){\n                if (!/^0\\S*$/.test(event.value) && !(name == \"border\" && event.value == \"none\")){\n                    properties[name] = { line: event.property.line, col: event.property.col, value: event.value };\n                }\n            } else {\n                if (/^(width|height)/i.test(name) && /^(length|percentage)/.test(event.value.parts[0].type)){\n                    properties[name] = 1;\n                } else if (name == \"box-sizing\") {\n                    boxSizing = true;\n                }\n            }\n            \n        });\n\n        parser.addListener(\"endrule\", endRule);\n        parser.addListener(\"endfontface\", endRule);\n        parser.addListener(\"endpage\", endRule);\n        parser.addListener(\"endpagemargin\", endRule);\n        parser.addListener(\"endkeyframerule\", endRule);         \n    }\n\n});\nCSSLint.addRule({\n    id: \"box-sizing\",\n    name: \"Disallow use of box-sizing\",\n    desc: \"The box-sizing properties isn't supported in IE6 and IE7.\",\n    browsers: \"IE6, IE7\",\n    tags: [\"Compatibility\"],\n    init: function(parser, reporter){\n        var rule = this;\n\n        parser.addListener(\"property\", function(event){\n            var name = event.property.text.toLowerCase();\n   \n            if (name == \"box-sizing\"){\n                reporter.report(\"The box-sizing property isn't supported in IE6 and IE7.\", event.line, event.col, rule);\n            }\n        });       \n    }\n\n});\nCSSLint.addRule({\n    id: \"bulletproof-font-face\",\n    name: \"Use the bulletproof @font-face syntax\",\n    desc: \"Use the bulletproof @font-face syntax to avoid 404's in old IE (http://www.fontspring.com/blog/the-new-bulletproof-font-face-syntax).\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            count = 0,\n            fontFaceRule = false,\n            firstSrc     = true,\n            ruleFailed    = false,\n            line, col;\n        parser.addListener(\"startfontface\", function(event){\n            fontFaceRule = true;\n        });\n\n        parser.addListener(\"property\", function(event){\n            if (!fontFaceRule) {\n                return;\n            }\n\n            var propertyName = event.property.toString().toLowerCase(),\n                value        = event.value.toString();\n            line = event.line;\n            col  = event.col;\n            if (propertyName === 'src') {\n                var regex = /^\\s?url\\(['\"].+\\.eot\\?.*['\"]\\)\\s*format\\(['\"]embedded-opentype['\"]\\).*$/i;\n                if (!value.match(regex) && firstSrc) {\n                    ruleFailed = true;\n                    firstSrc = false;\n                } else if (value.match(regex) && !firstSrc) {\n                    ruleFailed = false;\n                }\n            }\n\n\n        });\n        parser.addListener(\"endfontface\", function(event){\n            fontFaceRule = false;\n\n            if (ruleFailed) {\n                reporter.report(\"@font-face declaration doesn't follow the fontspring bulletproof syntax.\", line, col, rule);\n            }\n        });\n    }\n}); \nCSSLint.addRule({\n    id: \"compatible-vendor-prefixes\",\n    name: \"Require compatible vendor prefixes\",\n    desc: \"Include all compatible vendor prefixes to reach a wider range of users.\",\n    browsers: \"All\",\n    init: function (parser, reporter) {\n        var rule = this,\n            compatiblePrefixes,\n            properties,\n            prop,\n            variations,\n            prefixed,\n            i,\n            len,\n            inKeyFrame = false,\n            arrayPush = Array.prototype.push,\n            applyTo = [];\n        compatiblePrefixes = {\n            \"animation\"                  : \"webkit moz\",\n            \"animation-delay\"            : \"webkit moz\",\n            \"animation-direction\"        : \"webkit moz\",\n            \"animation-duration\"         : \"webkit moz\",\n            \"animation-fill-mode\"        : \"webkit moz\",\n            \"animation-iteration-count\"  : \"webkit moz\",\n            \"animation-name\"             : \"webkit moz\",\n            \"animation-play-state\"       : \"webkit moz\",\n            \"animation-timing-function\"  : \"webkit moz\",\n            \"appearance\"                 : \"webkit moz\",\n            \"border-end\"                 : \"webkit moz\",\n            \"border-end-color\"           : \"webkit moz\",\n            \"border-end-style\"           : \"webkit moz\",\n            \"border-end-width\"           : \"webkit moz\",\n            \"border-image\"               : \"webkit moz o\",\n            \"border-radius\"              : \"webkit\",\n            \"border-start\"               : \"webkit moz\",\n            \"border-start-color\"         : \"webkit moz\",\n            \"border-start-style\"         : \"webkit moz\",\n            \"border-start-width\"         : \"webkit moz\",\n            \"box-align\"                  : \"webkit moz ms\",\n            \"box-direction\"              : \"webkit moz ms\",\n            \"box-flex\"                   : \"webkit moz ms\",\n            \"box-lines\"                  : \"webkit ms\",\n            \"box-ordinal-group\"          : \"webkit moz ms\",\n            \"box-orient\"                 : \"webkit moz ms\",\n            \"box-pack\"                   : \"webkit moz ms\",\n            \"box-sizing\"                 : \"webkit moz\",\n            \"box-shadow\"                 : \"webkit moz\",\n            \"column-count\"               : \"webkit moz ms\",\n            \"column-gap\"                 : \"webkit moz ms\",\n            \"column-rule\"                : \"webkit moz ms\",\n            \"column-rule-color\"          : \"webkit moz ms\",\n            \"column-rule-style\"          : \"webkit moz ms\",\n            \"column-rule-width\"          : \"webkit moz ms\",\n            \"column-width\"               : \"webkit moz ms\",\n            \"hyphens\"                    : \"epub moz\",\n            \"line-break\"                 : \"webkit ms\",\n            \"margin-end\"                 : \"webkit moz\",\n            \"margin-start\"               : \"webkit moz\",\n            \"marquee-speed\"              : \"webkit wap\",\n            \"marquee-style\"              : \"webkit wap\",\n            \"padding-end\"                : \"webkit moz\",\n            \"padding-start\"              : \"webkit moz\",\n            \"tab-size\"                   : \"moz o\",\n            \"text-size-adjust\"           : \"webkit ms\",\n            \"transform\"                  : \"webkit moz ms o\",\n            \"transform-origin\"           : \"webkit moz ms o\",\n            \"transition\"                 : \"webkit moz o\",\n            \"transition-delay\"           : \"webkit moz o\",\n            \"transition-duration\"        : \"webkit moz o\",\n            \"transition-property\"        : \"webkit moz o\",\n            \"transition-timing-function\" : \"webkit moz o\",\n            \"user-modify\"                : \"webkit moz\",\n            \"user-select\"                : \"webkit moz ms\",\n            \"word-break\"                 : \"epub ms\",\n            \"writing-mode\"               : \"epub ms\"\n        };\n\n\n        for (prop in compatiblePrefixes) {\n            if (compatiblePrefixes.hasOwnProperty(prop)) {\n                variations = [];\n                prefixed = compatiblePrefixes[prop].split(' ');\n                for (i = 0, len = prefixed.length; i < len; i++) {\n                    variations.push('-' + prefixed[i] + '-' + prop);\n                }\n                compatiblePrefixes[prop] = variations;\n                arrayPush.apply(applyTo, variations);\n            }\n        }\n                \n        parser.addListener(\"startrule\", function () {\n            properties = [];\n        });\n\n        parser.addListener(\"startkeyframes\", function (event) {\n            inKeyFrame = event.prefix || true;\n        });\n\n        parser.addListener(\"endkeyframes\", function (event) {\n            inKeyFrame = false;\n        });\n\n        parser.addListener(\"property\", function (event) {\n            var name = event.property;\n            if (CSSLint.Util.indexOf(applyTo, name.text) > -1) {\n                if (!inKeyFrame || typeof inKeyFrame != \"string\" || \n                        name.text.indexOf(\"-\" + inKeyFrame + \"-\") !== 0) {\n                    properties.push(name);\n                }\n            }\n        });\n\n        parser.addListener(\"endrule\", function (event) {\n            if (!properties.length) {\n                return;\n            }\n\n            var propertyGroups = {},\n                i,\n                len,\n                name,\n                prop,\n                variations,\n                value,\n                full,\n                actual,\n                item,\n                propertiesSpecified;\n\n            for (i = 0, len = properties.length; i < len; i++) {\n                name = properties[i];\n\n                for (prop in compatiblePrefixes) {\n                    if (compatiblePrefixes.hasOwnProperty(prop)) {\n                        variations = compatiblePrefixes[prop];\n                        if (CSSLint.Util.indexOf(variations, name.text) > -1) {\n                            if (!propertyGroups[prop]) {\n                                propertyGroups[prop] = {\n                                    full : variations.slice(0),\n                                    actual : [],\n                                    actualNodes: []\n                                };\n                            }\n                            if (CSSLint.Util.indexOf(propertyGroups[prop].actual, name.text) === -1) {\n                                propertyGroups[prop].actual.push(name.text);\n                                propertyGroups[prop].actualNodes.push(name);\n                            }\n                        }\n                    }\n                }\n            }\n\n            for (prop in propertyGroups) {\n                if (propertyGroups.hasOwnProperty(prop)) {\n                    value = propertyGroups[prop];\n                    full = value.full;\n                    actual = value.actual;\n\n                    if (full.length > actual.length) {\n                        for (i = 0, len = full.length; i < len; i++) {\n                            item = full[i];\n                            if (CSSLint.Util.indexOf(actual, item) === -1) {\n                                propertiesSpecified = (actual.length === 1) ? actual[0] : (actual.length == 2) ? actual.join(\" and \") : actual.join(\", \");\n                                reporter.report(\"The property \" + item + \" is compatible with \" + propertiesSpecified + \" and should be included as well.\", value.actualNodes[0].line, value.actualNodes[0].col, rule); \n                            }\n                        }\n\n                    }\n                }\n            }\n        });\n    }\n});\nCSSLint.addRule({\n    id: \"display-property-grouping\",\n    name: \"Require properties appropriate for display\",\n    desc: \"Certain properties shouldn't be used with certain display property values.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n\n        var propertiesToCheck = {\n                display: 1,\n                \"float\": \"none\",\n                height: 1,\n                width: 1,\n                margin: 1,\n                \"margin-left\": 1,\n                \"margin-right\": 1,\n                \"margin-bottom\": 1,\n                \"margin-top\": 1,\n                padding: 1,\n                \"padding-left\": 1,\n                \"padding-right\": 1,\n                \"padding-bottom\": 1,\n                \"padding-top\": 1,\n                \"vertical-align\": 1\n            },\n            properties;\n\n        function reportProperty(name, display, msg){\n            if (properties[name]){\n                if (typeof propertiesToCheck[name] != \"string\" || properties[name].value.toLowerCase() != propertiesToCheck[name]){\n                    reporter.report(msg || name + \" can't be used with display: \" + display + \".\", properties[name].line, properties[name].col, rule);\n                }\n            }\n        }\n        \n        function startRule(){\n            properties = {};\n        }\n\n        function endRule(){\n\n            var display = properties.display ? properties.display.value : null;\n            if (display){\n                switch(display){\n\n                    case \"inline\":\n                        reportProperty(\"height\", display);\n                        reportProperty(\"width\", display);\n                        reportProperty(\"margin\", display);\n                        reportProperty(\"margin-top\", display);\n                        reportProperty(\"margin-bottom\", display);              \n                        reportProperty(\"float\", display, \"display:inline has no effect on floated elements (but may be used to fix the IE6 double-margin bug).\");\n                        break;\n\n                    case \"block\":\n                        reportProperty(\"vertical-align\", display);\n                        break;\n\n                    case \"inline-block\":\n                        reportProperty(\"float\", display);\n                        break;\n\n                    default:\n                        if (display.indexOf(\"table-\") === 0){\n                            reportProperty(\"margin\", display);\n                            reportProperty(\"margin-left\", display);\n                            reportProperty(\"margin-right\", display);\n                            reportProperty(\"margin-top\", display);\n                            reportProperty(\"margin-bottom\", display);\n                            reportProperty(\"float\", display);\n                        }\n                }\n            }\n          \n        }\n\n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"startkeyframerule\", startRule);\n        parser.addListener(\"startpagemargin\", startRule);\n        parser.addListener(\"startpage\", startRule);\n\n        parser.addListener(\"property\", function(event){\n            var name = event.property.text.toLowerCase();\n\n            if (propertiesToCheck[name]){\n                properties[name] = { value: event.value.text, line: event.property.line, col: event.property.col };                    \n            }\n        });\n\n        parser.addListener(\"endrule\", endRule);\n        parser.addListener(\"endfontface\", endRule);\n        parser.addListener(\"endkeyframerule\", endRule);\n        parser.addListener(\"endpagemargin\", endRule);\n        parser.addListener(\"endpage\", endRule);\n\n    }\n\n});\nCSSLint.addRule({\n    id: \"duplicate-background-images\",\n    name: \"Disallow duplicate background images\",\n    desc: \"Every background-image should be unique. Use a common class for e.g. sprites.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            stack = {};\n\n        parser.addListener(\"property\", function(event){\n            var name = event.property.text,\n                value = event.value,\n                i, len;\n\n            if (name.match(/background/i)) {\n                for (i=0, len=value.parts.length; i < len; i++) {\n                    if (value.parts[i].type == 'uri') {\n                        if (typeof stack[value.parts[i].uri] === 'undefined') {\n                            stack[value.parts[i].uri] = event;\n                        }\n                        else {\n                            reporter.report(\"Background image '\" + value.parts[i].uri + \"' was used multiple times, first declared at line \" + stack[value.parts[i].uri].line + \", col \" + stack[value.parts[i].uri].col + \".\", event.line, event.col, rule);\n                        }\n                    }\n                }\n            }\n        });\n    }\n});\nCSSLint.addRule({\n    id: \"duplicate-properties\",\n    name: \"Disallow duplicate properties\",\n    desc: \"Duplicate properties must appear one after the other.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            properties,\n            lastProperty;            \n            \n        function startRule(event){\n            properties = {};        \n        }\n        \n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"startpage\", startRule);\n        parser.addListener(\"startpagemargin\", startRule);\n        parser.addListener(\"startkeyframerule\", startRule);        \n        \n        parser.addListener(\"property\", function(event){\n            var property = event.property,\n                name = property.text.toLowerCase();\n            \n            if (properties[name] && (lastProperty != name || properties[name] == event.value.text)){\n                reporter.report(\"Duplicate property '\" + event.property + \"' found.\", event.line, event.col, rule);\n            }\n            \n            properties[name] = event.value.text;\n            lastProperty = name;\n                        \n        });\n            \n        \n    }\n\n});\nCSSLint.addRule({\n    id: \"empty-rules\",\n    name: \"Disallow empty rules\",\n    desc: \"Rules without any properties specified should be removed.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            count = 0;\n\n        parser.addListener(\"startrule\", function(){\n            count=0;\n        });\n\n        parser.addListener(\"property\", function(){\n            count++;\n        });\n\n        parser.addListener(\"endrule\", function(event){\n            var selectors = event.selectors;\n            if (count === 0){\n                reporter.report(\"Rule is empty.\", selectors[0].line, selectors[0].col, rule);\n            }\n        });\n    }\n\n});\nCSSLint.addRule({\n    id: \"errors\",\n    name: \"Parsing Errors\",\n    desc: \"This rule looks for recoverable syntax errors.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n\n        parser.addListener(\"error\", function(event){\n            reporter.error(event.message, event.line, event.col, rule);\n        });\n\n    }\n\n});\nCSSLint.addRule({\n    id: \"fallback-colors\",\n    name: \"Require fallback colors\",\n    desc: \"For older browsers that don't support RGBA, HSL, or HSLA, provide a fallback color.\",\n    browsers: \"IE6,IE7,IE8\",\n    init: function(parser, reporter){\n        var rule = this,\n            lastProperty,\n            propertiesToCheck = {\n                color: 1,\n                background: 1,\n                \"border-color\": 1,\n                \"border-top-color\": 1,\n                \"border-right-color\": 1,\n                \"border-bottom-color\": 1,\n                \"border-left-color\": 1,\n                border: 1,\n                \"border-top\": 1,\n                \"border-right\": 1,\n                \"border-bottom\": 1,\n                \"border-left\": 1,\n                \"background-color\": 1\n            },\n            properties;\n        \n        function startRule(event){\n            properties = {};    \n            lastProperty = null;    \n        }\n        \n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"startpage\", startRule);\n        parser.addListener(\"startpagemargin\", startRule);\n        parser.addListener(\"startkeyframerule\", startRule);        \n        \n        parser.addListener(\"property\", function(event){\n            var property = event.property,\n                name = property.text.toLowerCase(),\n                parts = event.value.parts,\n                i = 0, \n                colorType = \"\",\n                len = parts.length;                \n                        \n            if(propertiesToCheck[name]){\n                while(i < len){\n                    if (parts[i].type == \"color\"){\n                        if (\"alpha\" in parts[i] || \"hue\" in parts[i]){\n                            \n                            if (/([^\\)]+)\\(/.test(parts[i])){\n                                colorType = RegExp.$1.toUpperCase();\n                            }\n                            \n                            if (!lastProperty || (lastProperty.property.text.toLowerCase() != name || lastProperty.colorType != \"compat\")){\n                                reporter.report(\"Fallback \" + name + \" (hex or RGB) should precede \" + colorType + \" \" + name + \".\", event.line, event.col, rule);\n                            }\n                        } else {\n                            event.colorType = \"compat\";\n                        }\n                    }\n                    \n                    i++;\n                }\n            }\n\n            lastProperty = event;\n        });        \n         \n    }\n\n});\nCSSLint.addRule({\n    id: \"floats\",\n    name: \"Disallow too many floats\",\n    desc: \"This rule tests if the float property is used too many times\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n        var count = 0;\n        parser.addListener(\"property\", function(event){\n            if (event.property.text.toLowerCase() == \"float\" &&\n                    event.value.text.toLowerCase() != \"none\"){\n                count++;\n            }\n        });\n        parser.addListener(\"endstylesheet\", function(){\n            reporter.stat(\"floats\", count);\n            if (count >= 10){\n                reporter.rollupWarn(\"Too many floats (\" + count + \"), you're probably using them for layout. Consider using a grid system instead.\", rule);\n            }\n        });\n    }\n\n});\nCSSLint.addRule({\n    id: \"font-faces\",\n    name: \"Don't use too many web fonts\",\n    desc: \"Too many different web fonts in the same stylesheet.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            count = 0;\n\n\n        parser.addListener(\"startfontface\", function(){\n            count++;\n        });\n\n        parser.addListener(\"endstylesheet\", function(){\n            if (count > 5){\n                reporter.rollupWarn(\"Too many @font-face declarations (\" + count + \").\", rule);\n            }\n        });\n    }\n\n});\nCSSLint.addRule({\n    id: \"font-sizes\",\n    name: \"Disallow too many font sizes\",\n    desc: \"Checks the number of font-size declarations.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            count = 0;\n        parser.addListener(\"property\", function(event){\n            if (event.property == \"font-size\"){\n                count++;\n            }\n        });\n        parser.addListener(\"endstylesheet\", function(){\n            reporter.stat(\"font-sizes\", count);\n            if (count >= 10){\n                reporter.rollupWarn(\"Too many font-size declarations (\" + count + \"), abstraction needed.\", rule);\n            }\n        });\n    }\n\n});\nCSSLint.addRule({\n    id: \"gradients\",\n    name: \"Require all gradient definitions\",\n    desc: \"When using a vendor-prefixed gradient, make sure to use them all.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            gradients;\n\n        parser.addListener(\"startrule\", function(){\n            gradients = {\n                moz: 0,\n                webkit: 0,\n                oldWebkit: 0,\n                o: 0\n            };\n        });\n\n        parser.addListener(\"property\", function(event){\n\n            if (/\\-(moz|o|webkit)(?:\\-(?:linear|radial))\\-gradient/i.test(event.value)){\n                gradients[RegExp.$1] = 1;\n            } else if (/\\-webkit\\-gradient/i.test(event.value)){\n                gradients.oldWebkit = 1;\n            }\n\n        });\n\n        parser.addListener(\"endrule\", function(event){\n            var missing = [];\n\n            if (!gradients.moz){\n                missing.push(\"Firefox 3.6+\");\n            }\n\n            if (!gradients.webkit){\n                missing.push(\"Webkit (Safari 5+, Chrome)\");\n            }\n            \n            if (!gradients.oldWebkit){\n                missing.push(\"Old Webkit (Safari 4+, Chrome)\");\n            }\n\n            if (!gradients.o){\n                missing.push(\"Opera 11.1+\");\n            }\n\n            if (missing.length && missing.length < 4){            \n                reporter.report(\"Missing vendor-prefixed CSS gradients for \" + missing.join(\", \") + \".\", event.selectors[0].line, event.selectors[0].col, rule); \n            }\n\n        });\n\n    }\n\n});\nCSSLint.addRule({\n    id: \"ids\",\n    name: \"Disallow IDs in selectors\",\n    desc: \"Selectors should not contain IDs.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n        parser.addListener(\"startrule\", function(event){\n            var selectors = event.selectors,\n                selector,\n                part,\n                modifier,\n                idCount,\n                i, j, k;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n                idCount = 0;\n\n                for (j=0; j < selector.parts.length; j++){\n                    part = selector.parts[j];\n                    if (part.type == parser.SELECTOR_PART_TYPE){\n                        for (k=0; k < part.modifiers.length; k++){\n                            modifier = part.modifiers[k];\n                            if (modifier.type == \"id\"){\n                                idCount++;\n                            }\n                        }\n                    }\n                }\n\n                if (idCount == 1){\n                    reporter.report(\"Don't use IDs in selectors.\", selector.line, selector.col, rule);\n                } else if (idCount > 1){\n                    reporter.report(idCount + \" IDs in the selector, really?\", selector.line, selector.col, rule);\n                }\n            }\n\n        });\n    }\n\n});\nCSSLint.addRule({\n    id: \"import\",\n    name: \"Disallow @import\",\n    desc: \"Don't use @import, use <link> instead.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n        \n        parser.addListener(\"import\", function(event){        \n            reporter.report(\"@import prevents parallel downloads, use <link> instead.\", event.line, event.col, rule);\n        });\n\n    }\n\n});\nCSSLint.addRule({\n    id: \"important\",\n    name: \"Disallow !important\",\n    desc: \"Be careful when using !important declaration\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            count = 0;\n        parser.addListener(\"property\", function(event){\n            if (event.important === true){\n                count++;\n                reporter.report(\"Use of !important\", event.line, event.col, rule);\n            }\n        });\n        parser.addListener(\"endstylesheet\", function(){\n            reporter.stat(\"important\", count);\n            if (count >= 10){\n                reporter.rollupWarn(\"Too many !important declarations (\" + count + \"), try to use less than 10 to avoid specificity issues.\", rule);\n            }\n        });\n    }\n\n});\nCSSLint.addRule({\n    id: \"known-properties\",\n    name: \"Require use of known properties\",\n    desc: \"Properties should be known (listed in CSS3 specification) or be a vendor-prefixed property.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n\n        parser.addListener(\"property\", function(event){\n            var name = event.property.text.toLowerCase();\n            if (event.invalid) {\n                reporter.report(event.invalid.message, event.line, event.col, rule);\n            }\n\n        });\n    }\n\n});\nCSSLint.addRule({\n    id: \"outline-none\",\n    name: \"Disallow outline: none\",\n    desc: \"Use of outline: none or outline: 0 should be limited to :focus rules.\",\n    browsers: \"All\",\n    tags: [\"Accessibility\"],\n    init: function(parser, reporter){\n        var rule = this,\n            lastRule;\n\n        function startRule(event){\n            if (event.selectors){\n                lastRule = {\n                    line: event.line,\n                    col: event.col,\n                    selectors: event.selectors,\n                    propCount: 0,\n                    outline: false\n                };\n            } else {\n                lastRule = null;\n            }\n        }\n        \n        function endRule(event){\n            if (lastRule){\n                if (lastRule.outline){\n                    if (lastRule.selectors.toString().toLowerCase().indexOf(\":focus\") == -1){\n                        reporter.report(\"Outlines should only be modified using :focus.\", lastRule.line, lastRule.col, rule);\n                    } else if (lastRule.propCount == 1) {\n                        reporter.report(\"Outlines shouldn't be hidden unless other visual changes are made.\", lastRule.line, lastRule.col, rule);                        \n                    }\n                }\n            }\n        }\n\n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"startpage\", startRule);\n        parser.addListener(\"startpagemargin\", startRule);\n        parser.addListener(\"startkeyframerule\", startRule); \n\n        parser.addListener(\"property\", function(event){\n            var name = event.property.text.toLowerCase(),\n                value = event.value;                \n                \n            if (lastRule){\n                lastRule.propCount++;\n                if (name == \"outline\" && (value == \"none\" || value == \"0\")){\n                    lastRule.outline = true;\n                }            \n            }\n            \n        });\n        \n        parser.addListener(\"endrule\", endRule);\n        parser.addListener(\"endfontface\", endRule);\n        parser.addListener(\"endpage\", endRule);\n        parser.addListener(\"endpagemargin\", endRule);\n        parser.addListener(\"endkeyframerule\", endRule); \n\n    }\n\n});\nCSSLint.addRule({\n    id: \"overqualified-elements\",\n    name: \"Disallow overqualified elements\",\n    desc: \"Don't use classes or IDs with elements (a.foo or a#foo).\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            classes = {};\n            \n        parser.addListener(\"startrule\", function(event){\n            var selectors = event.selectors,\n                selector,\n                part,\n                modifier,\n                i, j, k;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n\n                for (j=0; j < selector.parts.length; j++){\n                    part = selector.parts[j];\n                    if (part.type == parser.SELECTOR_PART_TYPE){\n                        for (k=0; k < part.modifiers.length; k++){\n                            modifier = part.modifiers[k];\n                            if (part.elementName && modifier.type == \"id\"){\n                                reporter.report(\"Element (\" + part + \") is overqualified, just use \" + modifier + \" without element name.\", part.line, part.col, rule);\n                            } else if (modifier.type == \"class\"){\n                                \n                                if (!classes[modifier]){\n                                    classes[modifier] = [];\n                                }\n                                classes[modifier].push({ modifier: modifier, part: part });\n                            }\n                        }\n                    }\n                }\n            }\n        });\n        \n        parser.addListener(\"endstylesheet\", function(){\n        \n            var prop;\n            for (prop in classes){\n                if (classes.hasOwnProperty(prop)){\n                    if (classes[prop].length == 1 && classes[prop][0].part.elementName){\n                        reporter.report(\"Element (\" + classes[prop][0].part + \") is overqualified, just use \" + classes[prop][0].modifier + \" without element name.\", classes[prop][0].part.line, classes[prop][0].part.col, rule);\n                    }\n                }\n            }        \n        });\n    }\n\n});\nCSSLint.addRule({\n    id: \"qualified-headings\",\n    name: \"Disallow qualified headings\",\n    desc: \"Headings should not be qualified (namespaced).\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n\n        parser.addListener(\"startrule\", function(event){\n            var selectors = event.selectors,\n                selector,\n                part,\n                i, j;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n\n                for (j=0; j < selector.parts.length; j++){\n                    part = selector.parts[j];\n                    if (part.type == parser.SELECTOR_PART_TYPE){\n                        if (part.elementName && /h[1-6]/.test(part.elementName.toString()) && j > 0){\n                            reporter.report(\"Heading (\" + part.elementName + \") should not be qualified.\", part.line, part.col, rule);\n                        }\n                    }\n                }\n            }\n        });\n    }\n\n});\nCSSLint.addRule({\n    id: \"regex-selectors\",\n    name: \"Disallow selectors that look like regexs\",\n    desc: \"Selectors that look like regular expressions are slow and should be avoided.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n\n        parser.addListener(\"startrule\", function(event){\n            var selectors = event.selectors,\n                selector,\n                part,\n                modifier,\n                i, j, k;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n                for (j=0; j < selector.parts.length; j++){\n                    part = selector.parts[j];\n                    if (part.type == parser.SELECTOR_PART_TYPE){\n                        for (k=0; k < part.modifiers.length; k++){\n                            modifier = part.modifiers[k];\n                            if (modifier.type == \"attribute\"){\n                                if (/([\\~\\|\\^\\$\\*]=)/.test(modifier)){\n                                    reporter.report(\"Attribute selectors with \" + RegExp.$1 + \" are slow!\", modifier.line, modifier.col, rule);\n                                }\n                            }\n\n                        }\n                    }\n                }\n            }\n        });\n    }\n\n});\nCSSLint.addRule({\n    id: \"rules-count\",\n    name: \"Rules Count\",\n    desc: \"Track how many rules there are.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            count = 0;\n        parser.addListener(\"startrule\", function(){\n            count++;\n        });\n\n        parser.addListener(\"endstylesheet\", function(){\n            reporter.stat(\"rule-count\", count);\n        });\n    }\n\n});\nCSSLint.addRule({\n    id: \"selector-max-approaching\",\n    name: \"Warn when approaching the 4095 selector limit for IE\",\n    desc: \"Will warn when selector count is >= 3800 selectors.\",\n    browsers: \"IE\",\n    init: function(parser, reporter) {\n        var rule = this, count = 0;\n\n        parser.addListener('startrule', function(event) {\n            count += event.selectors.length;\n        });\n\n        parser.addListener(\"endstylesheet\", function() {\n            if (count >= 3800) {\n                reporter.report(\"You have \" + count + \" selectors. Internet Explorer supports a maximum of 4095 selectors per stylesheet. Consider refactoring.\",0,0,rule); \n            }\n        });\n    }\n\n});\nCSSLint.addRule({\n    id: \"selector-max\",\n    name: \"Error when past the 4095 selector limit for IE\",\n    desc: \"Will error when selector count is > 4095.\",\n    browsers: \"IE\",\n    init: function(parser, reporter){\n        var rule = this, count = 0;\n\n        parser.addListener('startrule',function(event) {\n            count += event.selectors.length;\n        });\n\n        parser.addListener(\"endstylesheet\", function() {\n            if (count > 4095) {\n                reporter.report(\"You have \" + count + \" selectors. Internet Explorer supports a maximum of 4095 selectors per stylesheet. Consider refactoring.\",0,0,rule); \n            }\n        });\n    }\n\n});\nCSSLint.addRule({\n    id: \"shorthand\",\n    name: \"Require shorthand properties\",\n    desc: \"Use shorthand properties where possible.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            prop, i, len,\n            propertiesToCheck = {},\n            properties,\n            mapping = {\n                \"margin\": [\n                    \"margin-top\",\n                    \"margin-bottom\",\n                    \"margin-left\",\n                    \"margin-right\"\n                ],\n                \"padding\": [\n                    \"padding-top\",\n                    \"padding-bottom\",\n                    \"padding-left\",\n                    \"padding-right\"\n                ]              \n            };\n        for (prop in mapping){\n            if (mapping.hasOwnProperty(prop)){\n                for (i=0, len=mapping[prop].length; i < len; i++){\n                    propertiesToCheck[mapping[prop][i]] = prop;\n                }\n            }\n        }\n            \n        function startRule(event){\n            properties = {};\n        }\n        function endRule(event){\n            \n            var prop, i, len, total;\n            for (prop in mapping){\n                if (mapping.hasOwnProperty(prop)){\n                    total=0;\n                    \n                    for (i=0, len=mapping[prop].length; i < len; i++){\n                        total += properties[mapping[prop][i]] ? 1 : 0;\n                    }\n                    \n                    if (total == mapping[prop].length){\n                        reporter.report(\"The properties \" + mapping[prop].join(\", \") + \" can be replaced by \" + prop + \".\", event.line, event.col, rule);\n                    }\n                }\n            }\n        }        \n        \n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"property\", function(event){\n            var name = event.property.toString().toLowerCase(),\n                value = event.value.parts[0].value;\n\n            if (propertiesToCheck[name]){\n                properties[name] = 1;\n            }\n        });\n\n        parser.addListener(\"endrule\", endRule);\n        parser.addListener(\"endfontface\", endRule);     \n\n    }\n\n});\nCSSLint.addRule({\n    id: \"star-property-hack\",\n    name: \"Disallow properties with a star prefix\",\n    desc: \"Checks for the star property hack (targets IE6/7)\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n        parser.addListener(\"property\", function(event){\n            var property = event.property;\n\n            if (property.hack == \"*\") {\n                reporter.report(\"Property with star prefix found.\", event.property.line, event.property.col, rule);\n            }\n        });\n    }\n});\nCSSLint.addRule({\n    id: \"text-indent\",\n    name: \"Disallow negative text-indent\",\n    desc: \"Checks for text indent less than -99px\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            textIndent,\n            direction;\n\n\n        function startRule(event){\n            textIndent = false;\n            direction = \"inherit\";\n        }\n        function endRule(event){\n            if (textIndent && direction != \"ltr\"){\n                reporter.report(\"Negative text-indent doesn't work well with RTL. If you use text-indent for image replacement explicitly set direction for that item to ltr.\", textIndent.line, textIndent.col, rule);\n            }\n        }\n\n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"property\", function(event){\n            var name = event.property.toString().toLowerCase(),\n                value = event.value;\n\n            if (name == \"text-indent\" && value.parts[0].value < -99){\n                textIndent = event.property;\n            } else if (name == \"direction\" && value == \"ltr\"){\n                direction = \"ltr\";\n            }\n        });\n\n        parser.addListener(\"endrule\", endRule);\n        parser.addListener(\"endfontface\", endRule);\n\n    }\n\n});\nCSSLint.addRule({\n    id: \"underscore-property-hack\",\n    name: \"Disallow properties with an underscore prefix\",\n    desc: \"Checks for the underscore property hack (targets IE6)\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n        parser.addListener(\"property\", function(event){\n            var property = event.property;\n\n            if (property.hack == \"_\") {\n                reporter.report(\"Property with underscore prefix found.\", event.property.line, event.property.col, rule);\n            }\n        });\n    }\n});\nCSSLint.addRule({\n    id: \"unique-headings\",\n    name: \"Headings should only be defined once\",\n    desc: \"Headings should be defined only once.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n\n        var headings =  {\n                h1: 0,\n                h2: 0,\n                h3: 0,\n                h4: 0,\n                h5: 0,\n                h6: 0\n            };\n\n        parser.addListener(\"startrule\", function(event){\n            var selectors = event.selectors,\n                selector,\n                part,\n                pseudo,\n                i, j;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n                part = selector.parts[selector.parts.length-1];\n\n                if (part.elementName && /(h[1-6])/i.test(part.elementName.toString())){\n                    \n                    for (j=0; j < part.modifiers.length; j++){\n                        if (part.modifiers[j].type == \"pseudo\"){\n                            pseudo = true;\n                            break;\n                        }\n                    }\n                \n                    if (!pseudo){\n                        headings[RegExp.$1]++;\n                        if (headings[RegExp.$1] > 1) {\n                            reporter.report(\"Heading (\" + part.elementName + \") has already been defined.\", part.line, part.col, rule);\n                        }\n                    }\n                }\n            }\n        });\n        \n        parser.addListener(\"endstylesheet\", function(event){\n            var prop,\n                messages = [];\n                \n            for (prop in headings){\n                if (headings.hasOwnProperty(prop)){\n                    if (headings[prop] > 1){\n                        messages.push(headings[prop] + \" \" + prop + \"s\");\n                    }\n                }\n            }\n            \n            if (messages.length){\n                reporter.rollupWarn(\"You have \" + messages.join(\", \") + \" defined in this stylesheet.\", rule);\n            }\n        });        \n    }\n\n});\nCSSLint.addRule({\n    id: \"universal-selector\",\n    name: \"Disallow universal selector\",\n    desc: \"The universal selector (*) is known to be slow.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n\n        parser.addListener(\"startrule\", function(event){\n            var selectors = event.selectors,\n                selector,\n                part,\n                modifier,\n                i, j, k;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n                \n                part = selector.parts[selector.parts.length-1];\n                if (part.elementName == \"*\"){\n                    reporter.report(rule.desc, part.line, part.col, rule);\n                }\n            }\n        });\n    }\n\n});\nCSSLint.addRule({\n    id: \"unqualified-attributes\",\n    name: \"Disallow unqualified attribute selectors\",\n    desc: \"Unqualified attribute selectors are known to be slow.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n\n        parser.addListener(\"startrule\", function(event){\n            \n            var selectors = event.selectors,\n                selector,\n                part,\n                modifier,\n                i, j, k;\n\n            for (i=0; i < selectors.length; i++){\n                selector = selectors[i];\n                \n                part = selector.parts[selector.parts.length-1];\n                if (part.type == parser.SELECTOR_PART_TYPE){\n                    for (k=0; k < part.modifiers.length; k++){\n                        modifier = part.modifiers[k];\n                        if (modifier.type == \"attribute\" && (!part.elementName || part.elementName == \"*\")){\n                            reporter.report(rule.desc, part.line, part.col, rule);                               \n                        }\n                    }\n                }\n                \n            }            \n        });\n    }\n\n});\nCSSLint.addRule({\n    id: \"vendor-prefix\",\n    name: \"Require standard property with vendor prefix\",\n    desc: \"When using a vendor-prefixed property, make sure to include the standard one.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this,\n            properties,\n            num,\n            propertiesToCheck = {\n                \"-webkit-border-radius\": \"border-radius\",\n                \"-webkit-border-top-left-radius\": \"border-top-left-radius\",\n                \"-webkit-border-top-right-radius\": \"border-top-right-radius\",\n                \"-webkit-border-bottom-left-radius\": \"border-bottom-left-radius\",\n                \"-webkit-border-bottom-right-radius\": \"border-bottom-right-radius\",\n                \n                \"-o-border-radius\": \"border-radius\",\n                \"-o-border-top-left-radius\": \"border-top-left-radius\",\n                \"-o-border-top-right-radius\": \"border-top-right-radius\",\n                \"-o-border-bottom-left-radius\": \"border-bottom-left-radius\",\n                \"-o-border-bottom-right-radius\": \"border-bottom-right-radius\",\n                \n                \"-moz-border-radius\": \"border-radius\",\n                \"-moz-border-radius-topleft\": \"border-top-left-radius\",\n                \"-moz-border-radius-topright\": \"border-top-right-radius\",\n                \"-moz-border-radius-bottomleft\": \"border-bottom-left-radius\",\n                \"-moz-border-radius-bottomright\": \"border-bottom-right-radius\",                \n                \n                \"-moz-column-count\": \"column-count\",\n                \"-webkit-column-count\": \"column-count\",\n                \n                \"-moz-column-gap\": \"column-gap\",\n                \"-webkit-column-gap\": \"column-gap\",\n                \n                \"-moz-column-rule\": \"column-rule\",\n                \"-webkit-column-rule\": \"column-rule\",\n                \n                \"-moz-column-rule-style\": \"column-rule-style\",\n                \"-webkit-column-rule-style\": \"column-rule-style\",\n                \n                \"-moz-column-rule-color\": \"column-rule-color\",\n                \"-webkit-column-rule-color\": \"column-rule-color\",\n                \n                \"-moz-column-rule-width\": \"column-rule-width\",\n                \"-webkit-column-rule-width\": \"column-rule-width\",\n                \n                \"-moz-column-width\": \"column-width\",\n                \"-webkit-column-width\": \"column-width\",\n                \n                \"-webkit-column-span\": \"column-span\",\n                \"-webkit-columns\": \"columns\",\n                \n                \"-moz-box-shadow\": \"box-shadow\",\n                \"-webkit-box-shadow\": \"box-shadow\",\n                \n                \"-moz-transform\" : \"transform\",\n                \"-webkit-transform\" : \"transform\",\n                \"-o-transform\" : \"transform\",\n                \"-ms-transform\" : \"transform\",\n                \n                \"-moz-transform-origin\" : \"transform-origin\",\n                \"-webkit-transform-origin\" : \"transform-origin\",\n                \"-o-transform-origin\" : \"transform-origin\",\n                \"-ms-transform-origin\" : \"transform-origin\",\n                \n                \"-moz-box-sizing\" : \"box-sizing\",\n                \"-webkit-box-sizing\" : \"box-sizing\",\n                \n                \"-moz-user-select\" : \"user-select\",\n                \"-khtml-user-select\" : \"user-select\",\n                \"-webkit-user-select\" : \"user-select\"                \n            };\n        function startRule(){\n            properties = {};\n            num=1;        \n        }\n        function endRule(event){\n            var prop,\n                i, len,\n                standard,\n                needed,\n                actual,\n                needsStandard = [];\n\n            for (prop in properties){\n                if (propertiesToCheck[prop]){\n                    needsStandard.push({ actual: prop, needed: propertiesToCheck[prop]});\n                }\n            }\n\n            for (i=0, len=needsStandard.length; i < len; i++){\n                needed = needsStandard[i].needed;\n                actual = needsStandard[i].actual;\n\n                if (!properties[needed]){               \n                    reporter.report(\"Missing standard property '\" + needed + \"' to go along with '\" + actual + \"'.\", properties[actual][0].name.line, properties[actual][0].name.col, rule);\n                } else {\n                    if (properties[needed][0].pos < properties[actual][0].pos){\n                        reporter.report(\"Standard property '\" + needed + \"' should come after vendor-prefixed property '\" + actual + \"'.\", properties[actual][0].name.line, properties[actual][0].name.col, rule);\n                    }\n                }\n            }\n\n        }        \n        \n        parser.addListener(\"startrule\", startRule);\n        parser.addListener(\"startfontface\", startRule);\n        parser.addListener(\"startpage\", startRule);\n        parser.addListener(\"startpagemargin\", startRule);\n        parser.addListener(\"startkeyframerule\", startRule);         \n\n        parser.addListener(\"property\", function(event){\n            var name = event.property.text.toLowerCase();\n\n            if (!properties[name]){\n                properties[name] = [];\n            }\n\n            properties[name].push({ name: event.property, value : event.value, pos:num++ });\n        });\n\n        parser.addListener(\"endrule\", endRule);\n        parser.addListener(\"endfontface\", endRule);\n        parser.addListener(\"endpage\", endRule);\n        parser.addListener(\"endpagemargin\", endRule);\n        parser.addListener(\"endkeyframerule\", endRule);         \n    }\n\n});\nCSSLint.addRule({\n    id: \"zero-units\",\n    name: \"Disallow units for 0 values\",\n    desc: \"You don't need to specify units when a value is 0.\",\n    browsers: \"All\",\n    init: function(parser, reporter){\n        var rule = this;\n        parser.addListener(\"property\", function(event){\n            var parts = event.value.parts,\n                i = 0, \n                len = parts.length;\n\n            while(i < len){\n                if ((parts[i].units || parts[i].type == \"percentage\") && parts[i].value === 0 && parts[i].type != \"time\"){\n                    reporter.report(\"Values of 0 shouldn't have units specified.\", parts[i].line, parts[i].col, rule);\n                }\n                i++;\n            }\n\n        });\n\n    }\n\n});\n(function() {\n    var xmlEscape = function(str) {\n        if (!str || str.constructor !== String) {\n            return \"\";\n        }\n        \n        return str.replace(/[\\\"&><]/g, function(match) {\n            switch (match) {\n                case \"\\\"\":\n                    return \"&quot;\";\n                case \"&\":\n                    return \"&amp;\";\n                case \"<\":\n                    return \"&lt;\";\n                case \">\":\n                    return \"&gt;\";            \n            }\n        });\n    };\n\n    CSSLint.addFormatter({\n        id: \"checkstyle-xml\",\n        name: \"Checkstyle XML format\",\n        startFormat: function(){\n            return \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?><checkstyle>\";\n        },\n        endFormat: function(){\n            return \"</checkstyle>\";\n        },\n        readError: function(filename, message) {\n            return \"<file name=\\\"\" + xmlEscape(filename) + \"\\\"><error line=\\\"0\\\" column=\\\"0\\\" severty=\\\"error\\\" message=\\\"\" + xmlEscape(message) + \"\\\"></error></file>\";\n        },\n        formatResults: function(results, filename, options) {\n            var messages = results.messages,\n                output = [];\n            var generateSource = function(rule) {\n                if (!rule || !('name' in rule)) {\n                    return \"\";\n                }\n                return 'net.csslint.' + rule.name.replace(/\\s/g,'');\n            };\n\n\n\n            if (messages.length > 0) {\n                output.push(\"<file name=\\\"\"+filename+\"\\\">\");\n                CSSLint.Util.forEach(messages, function (message, i) {\n                    if (!message.rollup) {\n                      output.push(\"<error line=\\\"\" + message.line + \"\\\" column=\\\"\" + message.col + \"\\\" severity=\\\"\" + message.type + \"\\\"\" +\n                          \" message=\\\"\" + xmlEscape(message.message) + \"\\\" source=\\\"\" + generateSource(message.rule) +\"\\\"/>\");\n                    }\n                });\n                output.push(\"</file>\");\n            }\n\n            return output.join(\"\");\n        }\n    });\n\n}());\nCSSLint.addFormatter({\n    id: \"compact\",\n    name: \"Compact, 'porcelain' format\",\n    startFormat: function() {\n        return \"\";\n    },\n    endFormat: function() {\n        return \"\";\n    },\n    formatResults: function(results, filename, options) {\n        var messages = results.messages,\n            output = \"\";\n        options = options || {};\n        var capitalize = function(str) {\n            return str.charAt(0).toUpperCase() + str.slice(1);\n        };\n\n        if (messages.length === 0) {\n            return options.quiet ? \"\" : filename + \": Lint Free!\";\n        }\n\n        CSSLint.Util.forEach(messages, function(message, i) {\n            if (message.rollup) {\n                output += filename + \": \" + capitalize(message.type) + \" - \" + message.message + \"\\n\";\n            } else {\n                output += filename + \": \" + \"line \" + message.line + \n                    \", col \" + message.col + \", \" + capitalize(message.type) + \" - \" + message.message + \"\\n\";\n            }\n        });\n    \n        return output;\n    }\n});\nCSSLint.addFormatter({\n    id: \"csslint-xml\",\n    name: \"CSSLint XML format\",\n    startFormat: function(){\n        return \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?><csslint>\";\n    },\n    endFormat: function(){\n        return \"</csslint>\";\n    },\n    formatResults: function(results, filename, options) {\n        var messages = results.messages,\n            output = [];\n        var escapeSpecialCharacters = function(str) {\n            if (!str || str.constructor !== String) {\n                return \"\";\n            }\n            return str.replace(/\\\"/g, \"'\").replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n        };\n\n        if (messages.length > 0) {\n            output.push(\"<file name=\\\"\"+filename+\"\\\">\");\n            CSSLint.Util.forEach(messages, function (message, i) {\n                if (message.rollup) {\n                    output.push(\"<issue severity=\\\"\" + message.type + \"\\\" reason=\\\"\" + escapeSpecialCharacters(message.message) + \"\\\" evidence=\\\"\" + escapeSpecialCharacters(message.evidence) + \"\\\"/>\");\n                } else {\n                    output.push(\"<issue line=\\\"\" + message.line + \"\\\" char=\\\"\" + message.col + \"\\\" severity=\\\"\" + message.type + \"\\\"\" +\n                        \" reason=\\\"\" + escapeSpecialCharacters(message.message) + \"\\\" evidence=\\\"\" + escapeSpecialCharacters(message.evidence) + \"\\\"/>\");\n                }\n            });\n            output.push(\"</file>\");\n        }\n\n        return output.join(\"\");\n    }\n});\nCSSLint.addFormatter({\n    id: \"junit-xml\",\n    name: \"JUNIT XML format\",\n    startFormat: function(){\n        return \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?><testsuites>\";\n    },\n    endFormat: function() {\n        return \"</testsuites>\";\n    },\n    formatResults: function(results, filename, options) {\n\n        var messages = results.messages,\n            output = [],\n            tests = {\n                'error': 0,\n                'failure': 0\n            };\n        var generateSource = function(rule) {\n            if (!rule || !('name' in rule)) {\n                return \"\";\n            }\n            return 'net.csslint.' + rule.name.replace(/\\s/g,'');\n        };\n        var escapeSpecialCharacters = function(str) {\n\n            if (!str || str.constructor !== String) {\n                return \"\";\n            }\n\n            return str.replace(/\\\"/g, \"'\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n\n        };\n\n        if (messages.length > 0) {\n\n            messages.forEach(function (message, i) {\n                var type = message.type === 'warning' ? 'error' : message.type;\n                if (!message.rollup) {\n                    output.push(\"<testcase time=\\\"0\\\" name=\\\"\" + generateSource(message.rule) + \"\\\">\");\n                    output.push(\"<\" + type + \" message=\\\"\" + escapeSpecialCharacters(message.message) + \"\\\"><![CDATA[\" + message.line + ':' + message.col + ':' + escapeSpecialCharacters(message.evidence)  + \"]]></\" + type + \">\");\n                    output.push(\"</testcase>\");\n\n                    tests[type] += 1;\n\n                }\n\n            });\n\n            output.unshift(\"<testsuite time=\\\"0\\\" tests=\\\"\" + messages.length + \"\\\" skipped=\\\"0\\\" errors=\\\"\" + tests.error + \"\\\" failures=\\\"\" + tests.failure + \"\\\" package=\\\"net.csslint\\\" name=\\\"\" + filename + \"\\\">\");\n            output.push(\"</testsuite>\");\n\n        }\n\n        return output.join(\"\");\n\n    }\n});\nCSSLint.addFormatter({\n    id: \"lint-xml\",\n    name: \"Lint XML format\",\n    startFormat: function(){\n        return \"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\"?><lint>\";\n    },\n    endFormat: function(){\n        return \"</lint>\";\n    },\n    formatResults: function(results, filename, options) {\n        var messages = results.messages,\n            output = [];\n        var escapeSpecialCharacters = function(str) {\n            if (!str || str.constructor !== String) {\n                return \"\";\n            }\n            return str.replace(/\\\"/g, \"'\").replace(/&/g, \"&amp;\").replace(/</g, \"&lt;\").replace(/>/g, \"&gt;\");\n        };\n\n        if (messages.length > 0) {\n        \n            output.push(\"<file name=\\\"\"+filename+\"\\\">\");\n            CSSLint.Util.forEach(messages, function (message, i) {\n                if (message.rollup) {\n                    output.push(\"<issue severity=\\\"\" + message.type + \"\\\" reason=\\\"\" + escapeSpecialCharacters(message.message) + \"\\\" evidence=\\\"\" + escapeSpecialCharacters(message.evidence) + \"\\\"/>\");\n                } else {\n                    output.push(\"<issue line=\\\"\" + message.line + \"\\\" char=\\\"\" + message.col + \"\\\" severity=\\\"\" + message.type + \"\\\"\" +\n                        \" reason=\\\"\" + escapeSpecialCharacters(message.message) + \"\\\" evidence=\\\"\" + escapeSpecialCharacters(message.evidence) + \"\\\"/>\");\n                }\n            });\n            output.push(\"</file>\");\n        }\n\n        return output.join(\"\");\n    }\n});\nCSSLint.addFormatter({\n    id: \"text\",\n    name: \"Plain Text\",\n    startFormat: function() {\n        return \"\";\n    },\n    endFormat: function() {\n        return \"\";\n    },\n    formatResults: function(results, filename, options) {\n        var messages = results.messages,\n            output = \"\";\n        options = options || {};\n\n        if (messages.length === 0) {\n            return options.quiet ? \"\" : \"\\n\\ncsslint: No errors in \" + filename + \".\";\n        }\n\n        output = \"\\n\\ncsslint: There are \" + messages.length  +  \" problems in \" + filename + \".\";\n        var pos = filename.lastIndexOf(\"/\"),\n            shortFilename = filename;\n\n        if (pos === -1){\n            pos = filename.lastIndexOf(\"\\\\\");       \n        }\n        if (pos > -1){\n            shortFilename = filename.substring(pos+1);\n        }\n\n        CSSLint.Util.forEach(messages, function (message, i) {\n            output = output + \"\\n\\n\" + shortFilename;\n            if (message.rollup) {\n                output += \"\\n\" + (i+1) + \": \" + message.type;\n                output += \"\\n\" + message.message;\n            } else {\n                output += \"\\n\" + (i+1) + \": \" + message.type + \" at line \" + message.line + \", col \" + message.col;\n                output += \"\\n\" + message.message;\n                output += \"\\n\" + message.evidence;\n            }\n        });\n    \n        return output;\n    }\n});\n\nexports.CSSLint = CSSLint;\n\n});"
  },
  {
    "path": "browser/plugins/ace/worker-json.js",
    "content": "\"no use strict\";\n;(function(window) {\nif (typeof window.window != \"undefined\" && window.document) {\n    return;\n}\n\nwindow.console = function() {\n    var msgs = Array.prototype.slice.call(arguments, 0);\n    postMessage({type: \"log\", data: msgs});\n};\nwindow.console.error =\nwindow.console.warn = \nwindow.console.log =\nwindow.console.trace = window.console;\n\nwindow.window = window;\nwindow.ace = window;\n\nwindow.onerror = function(message, file, line, col, err) {\n    console.error(\"Worker \" + err.stack);\n};\n\nwindow.normalizeModule = function(parentId, moduleName) {\n    if (moduleName.indexOf(\"!\") !== -1) {\n        var chunks = moduleName.split(\"!\");\n        return window.normalizeModule(parentId, chunks[0]) + \"!\" + window.normalizeModule(parentId, chunks[1]);\n    }\n    if (moduleName.charAt(0) == \".\") {\n        var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n        moduleName = (base ? base + \"/\" : \"\") + moduleName;\n        \n        while(moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n            var previous = moduleName;\n            moduleName = moduleName.replace(/^\\.\\//, \"\").replace(/\\/\\.\\//, \"/\").replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n        }\n    }\n    \n    return moduleName;\n};\n\nwindow.require = function(parentId, id) {\n    if (!id) {\n        id = parentId\n        parentId = null;\n    }\n    if (!id.charAt)\n        throw new Error(\"worker.js require() accepts only (parentId, id) as arguments\");\n\n    id = window.normalizeModule(parentId, id);\n\n    var module = window.require.modules[id];\n    if (module) {\n        if (!module.initialized) {\n            module.initialized = true;\n            module.exports = module.factory().exports;\n        }\n        return module.exports;\n    }\n    \n    var chunks = id.split(\"/\");\n    if (!window.require.tlns)\n        return console.log(\"unable to load \" + id);\n    chunks[0] = window.require.tlns[chunks[0]] || chunks[0];\n    var path = chunks.join(\"/\") + \".js\";\n    \n    window.require.id = id;\n    importScripts(path);\n    return window.require(parentId, id);\n};\nwindow.require.modules = {};\nwindow.require.tlns = {};\n\nwindow.define = function(id, deps, factory) {\n    if (arguments.length == 2) {\n        factory = deps;\n        if (typeof id != \"string\") {\n            deps = id;\n            id = window.require.id;\n        }\n    } else if (arguments.length == 1) {\n        factory = id;\n        deps = []\n        id = window.require.id;\n    }\n\n    if (!deps.length)\n        deps = ['require', 'exports', 'module']\n\n    if (id.indexOf(\"text!\") === 0) \n        return;\n    \n    var req = function(childId) {\n        return window.require(id, childId);\n    };\n\n    window.require.modules[id] = {\n        exports: {},\n        factory: function() {\n            var module = this;\n            var returnExports = factory.apply(this, deps.map(function(dep) {\n              switch(dep) {\n                  case 'require': return req\n                  case 'exports': return module.exports\n                  case 'module':  return module\n                  default:        return req(dep)\n              }\n            }));\n            if (returnExports)\n                module.exports = returnExports;\n            return module;\n        }\n    };\n};\nwindow.define.amd = {}\n\nwindow.initBaseUrls  = function initBaseUrls(topLevelNamespaces) {\n    require.tlns = topLevelNamespaces;\n}\n\nwindow.initSender = function initSender() {\n\n    var EventEmitter = window.require(\"ace/lib/event_emitter\").EventEmitter;\n    var oop = window.require(\"ace/lib/oop\");\n    \n    var Sender = function() {};\n    \n    (function() {\n        \n        oop.implement(this, EventEmitter);\n                \n        this.callback = function(data, callbackId) {\n            postMessage({\n                type: \"call\",\n                id: callbackId,\n                data: data\n            });\n        };\n    \n        this.emit = function(name, data) {\n            postMessage({\n                type: \"event\",\n                name: name,\n                data: data\n            });\n        };\n        \n    }).call(Sender.prototype);\n    \n    return new Sender();\n}\n\nwindow.main = null;\nwindow.sender = null;\n\nwindow.onmessage = function(e) {\n    var msg = e.data;\n    if (msg.command) {\n        if (main[msg.command])\n            main[msg.command].apply(main, msg.args);\n        else\n            throw new Error(\"Unknown command:\" + msg.command);\n    }\n    else if (msg.init) {        \n        initBaseUrls(msg.tlns);\n        require(\"ace/lib/es5-shim\");\n        sender = initSender();\n        var clazz = require(msg.module)[msg.classname];\n        main = new clazz(sender);\n    } \n    else if (msg.event && sender) {\n        sender._emit(msg.event, msg.data);\n    }\n};\n})(this);// https://github.com/kriskowal/es5-shim\n\ndefine('ace/lib/es5-shim', ['require', 'exports', 'module' ], function(require, exports, module) {\n\nfunction Empty() {}\n\nif (!Function.prototype.bind) {\n    Function.prototype.bind = function bind(that) { // .length is 1\n        var target = this;\n        if (typeof target != \"function\") {\n            throw new TypeError(\"Function.prototype.bind called on incompatible \" + target);\n        }\n        var args = slice.call(arguments, 1); // for normal call\n        var bound = function () {\n\n            if (this instanceof bound) {\n\n                var result = target.apply(\n                    this,\n                    args.concat(slice.call(arguments))\n                );\n                if (Object(result) === result) {\n                    return result;\n                }\n                return this;\n\n            } else {\n                return target.apply(\n                    that,\n                    args.concat(slice.call(arguments))\n                );\n\n            }\n\n        };\n        if(target.prototype) {\n            Empty.prototype = target.prototype;\n            bound.prototype = new Empty();\n            Empty.prototype = null;\n        }\n        return bound;\n    };\n}\nvar call = Function.prototype.call;\nvar prototypeOfArray = Array.prototype;\nvar prototypeOfObject = Object.prototype;\nvar slice = prototypeOfArray.slice;\nvar _toString = call.bind(prototypeOfObject.toString);\nvar owns = call.bind(prototypeOfObject.hasOwnProperty);\nvar defineGetter;\nvar defineSetter;\nvar lookupGetter;\nvar lookupSetter;\nvar supportsAccessors;\nif ((supportsAccessors = owns(prototypeOfObject, \"__defineGetter__\"))) {\n    defineGetter = call.bind(prototypeOfObject.__defineGetter__);\n    defineSetter = call.bind(prototypeOfObject.__defineSetter__);\n    lookupGetter = call.bind(prototypeOfObject.__lookupGetter__);\n    lookupSetter = call.bind(prototypeOfObject.__lookupSetter__);\n}\nif ([1,2].splice(0).length != 2) {\n    if(function() { // test IE < 9 to splice bug - see issue #138\n        function makeArray(l) {\n            var a = new Array(l+2);\n            a[0] = a[1] = 0;\n            return a;\n        }\n        var array = [], lengthBefore;\n        \n        array.splice.apply(array, makeArray(20));\n        array.splice.apply(array, makeArray(26));\n\n        lengthBefore = array.length; //46\n        array.splice(5, 0, \"XXX\"); // add one element\n\n        lengthBefore + 1 == array.length\n\n        if (lengthBefore + 1 == array.length) {\n            return true;// has right splice implementation without bugs\n        }\n    }()) {//IE 6/7\n        var array_splice = Array.prototype.splice;\n        Array.prototype.splice = function(start, deleteCount) {\n            if (!arguments.length) {\n                return [];\n            } else {\n                return array_splice.apply(this, [\n                    start === void 0 ? 0 : start,\n                    deleteCount === void 0 ? (this.length - start) : deleteCount\n                ].concat(slice.call(arguments, 2)))\n            }\n        };\n    } else {//IE8\n        Array.prototype.splice = function(pos, removeCount){\n            var length = this.length;\n            if (pos > 0) {\n                if (pos > length)\n                    pos = length;\n            } else if (pos == void 0) {\n                pos = 0;\n            } else if (pos < 0) {\n                pos = Math.max(length + pos, 0);\n            }\n\n            if (!(pos+removeCount < length))\n                removeCount = length - pos;\n\n            var removed = this.slice(pos, pos+removeCount);\n            var insert = slice.call(arguments, 2);\n            var add = insert.length;            \n            if (pos === length) {\n                if (add) {\n                    this.push.apply(this, insert);\n                }\n            } else {\n                var remove = Math.min(removeCount, length - pos);\n                var tailOldPos = pos + remove;\n                var tailNewPos = tailOldPos + add - remove;\n                var tailCount = length - tailOldPos;\n                var lengthAfterRemove = length - remove;\n\n                if (tailNewPos < tailOldPos) { // case A\n                    for (var i = 0; i < tailCount; ++i) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } else if (tailNewPos > tailOldPos) { // case B\n                    for (i = tailCount; i--; ) {\n                        this[tailNewPos+i] = this[tailOldPos+i];\n                    }\n                } // else, add == remove (nothing to do)\n\n                if (add && pos === lengthAfterRemove) {\n                    this.length = lengthAfterRemove; // truncate array\n                    this.push.apply(this, insert);\n                } else {\n                    this.length = lengthAfterRemove + add; // reserves space\n                    for (i = 0; i < add; ++i) {\n                        this[pos+i] = insert[i];\n                    }\n                }\n            }\n            return removed;\n        };\n    }\n}\nif (!Array.isArray) {\n    Array.isArray = function isArray(obj) {\n        return _toString(obj) == \"[object Array]\";\n    };\n}\nvar boxedString = Object(\"a\"),\n    splitString = boxedString[0] != \"a\" || !(0 in boxedString);\n\nif (!Array.prototype.forEach) {\n    Array.prototype.forEach = function forEach(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            thisp = arguments[1],\n            i = -1,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(); // TODO message\n        }\n\n        while (++i < length) {\n            if (i in self) {\n                fun.call(thisp, self[i], i, object);\n            }\n        }\n    };\n}\nif (!Array.prototype.map) {\n    Array.prototype.map = function map(fun /*, thisp*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            result = Array(length),\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self)\n                result[i] = fun.call(thisp, self[i], i, object);\n        }\n        return result;\n    };\n}\nif (!Array.prototype.filter) {\n    Array.prototype.filter = function filter(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                    object,\n            length = self.length >>> 0,\n            result = [],\n            value,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self) {\n                value = self[i];\n                if (fun.call(thisp, value, i, object)) {\n                    result.push(value);\n                }\n            }\n        }\n        return result;\n    };\n}\nif (!Array.prototype.every) {\n    Array.prototype.every = function every(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && !fun.call(thisp, self[i], i, object)) {\n                return false;\n            }\n        }\n        return true;\n    };\n}\nif (!Array.prototype.some) {\n    Array.prototype.some = function some(fun /*, thisp */) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0,\n            thisp = arguments[1];\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n\n        for (var i = 0; i < length; i++) {\n            if (i in self && fun.call(thisp, self[i], i, object)) {\n                return true;\n            }\n        }\n        return false;\n    };\n}\nif (!Array.prototype.reduce) {\n    Array.prototype.reduce = function reduce(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduce of empty array with no initial value\");\n        }\n\n        var i = 0;\n        var result;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i++];\n                    break;\n                }\n                if (++i >= length) {\n                    throw new TypeError(\"reduce of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        for (; i < length; i++) {\n            if (i in self) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        }\n\n        return result;\n    };\n}\nif (!Array.prototype.reduceRight) {\n    Array.prototype.reduceRight = function reduceRight(fun /*, initial*/) {\n        var object = toObject(this),\n            self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                object,\n            length = self.length >>> 0;\n        if (_toString(fun) != \"[object Function]\") {\n            throw new TypeError(fun + \" is not a function\");\n        }\n        if (!length && arguments.length == 1) {\n            throw new TypeError(\"reduceRight of empty array with no initial value\");\n        }\n\n        var result, i = length - 1;\n        if (arguments.length >= 2) {\n            result = arguments[1];\n        } else {\n            do {\n                if (i in self) {\n                    result = self[i--];\n                    break;\n                }\n                if (--i < 0) {\n                    throw new TypeError(\"reduceRight of empty array with no initial value\");\n                }\n            } while (true);\n        }\n\n        do {\n            if (i in this) {\n                result = fun.call(void 0, result, self[i], i, object);\n            }\n        } while (i--);\n\n        return result;\n    };\n}\nif (!Array.prototype.indexOf || ([0, 1].indexOf(1, 2) != -1)) {\n    Array.prototype.indexOf = function indexOf(sought /*, fromIndex */ ) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n\n        var i = 0;\n        if (arguments.length > 1) {\n            i = toInteger(arguments[1]);\n        }\n        i = i >= 0 ? i : Math.max(0, length + i);\n        for (; i < length; i++) {\n            if (i in self && self[i] === sought) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Array.prototype.lastIndexOf || ([0, 1].lastIndexOf(0, -3) != -1)) {\n    Array.prototype.lastIndexOf = function lastIndexOf(sought /*, fromIndex */) {\n        var self = splitString && _toString(this) == \"[object String]\" ?\n                this.split(\"\") :\n                toObject(this),\n            length = self.length >>> 0;\n\n        if (!length) {\n            return -1;\n        }\n        var i = length - 1;\n        if (arguments.length > 1) {\n            i = Math.min(i, toInteger(arguments[1]));\n        }\n        i = i >= 0 ? i : length - Math.abs(i);\n        for (; i >= 0; i--) {\n            if (i in self && sought === self[i]) {\n                return i;\n            }\n        }\n        return -1;\n    };\n}\nif (!Object.getPrototypeOf) {\n    Object.getPrototypeOf = function getPrototypeOf(object) {\n        return object.__proto__ || (\n            object.constructor ?\n            object.constructor.prototype :\n            prototypeOfObject\n        );\n    };\n}\nif (!Object.getOwnPropertyDescriptor) {\n    var ERR_NON_OBJECT = \"Object.getOwnPropertyDescriptor called on a \" +\n                         \"non-object: \";\n    Object.getOwnPropertyDescriptor = function getOwnPropertyDescriptor(object, property) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT + object);\n        if (!owns(object, property))\n            return;\n\n        var descriptor, getter, setter;\n        descriptor =  { enumerable: true, configurable: true };\n        if (supportsAccessors) {\n            var prototype = object.__proto__;\n            object.__proto__ = prototypeOfObject;\n\n            var getter = lookupGetter(object, property);\n            var setter = lookupSetter(object, property);\n            object.__proto__ = prototype;\n\n            if (getter || setter) {\n                if (getter) descriptor.get = getter;\n                if (setter) descriptor.set = setter;\n                return descriptor;\n            }\n        }\n        descriptor.value = object[property];\n        return descriptor;\n    };\n}\nif (!Object.getOwnPropertyNames) {\n    Object.getOwnPropertyNames = function getOwnPropertyNames(object) {\n        return Object.keys(object);\n    };\n}\nif (!Object.create) {\n    var createEmpty;\n    if (Object.prototype.__proto__ === null) {\n        createEmpty = function () {\n            return { \"__proto__\": null };\n        };\n    } else {\n        createEmpty = function () {\n            var empty = {};\n            for (var i in empty)\n                empty[i] = null;\n            empty.constructor =\n            empty.hasOwnProperty =\n            empty.propertyIsEnumerable =\n            empty.isPrototypeOf =\n            empty.toLocaleString =\n            empty.toString =\n            empty.valueOf =\n            empty.__proto__ = null;\n            return empty;\n        }\n    }\n\n    Object.create = function create(prototype, properties) {\n        var object;\n        if (prototype === null) {\n            object = createEmpty();\n        } else {\n            if (typeof prototype != \"object\")\n                throw new TypeError(\"typeof prototype[\"+(typeof prototype)+\"] != 'object'\");\n            var Type = function () {};\n            Type.prototype = prototype;\n            object = new Type();\n            object.__proto__ = prototype;\n        }\n        if (properties !== void 0)\n            Object.defineProperties(object, properties);\n        return object;\n    };\n}\n\nfunction doesDefinePropertyWork(object) {\n    try {\n        Object.defineProperty(object, \"sentinel\", {});\n        return \"sentinel\" in object;\n    } catch (exception) {\n    }\n}\nif (Object.defineProperty) {\n    var definePropertyWorksOnObject = doesDefinePropertyWork({});\n    var definePropertyWorksOnDom = typeof document == \"undefined\" ||\n        doesDefinePropertyWork(document.createElement(\"div\"));\n    if (!definePropertyWorksOnObject || !definePropertyWorksOnDom) {\n        var definePropertyFallback = Object.defineProperty;\n    }\n}\n\nif (!Object.defineProperty || definePropertyFallback) {\n    var ERR_NON_OBJECT_DESCRIPTOR = \"Property description must be an object: \";\n    var ERR_NON_OBJECT_TARGET = \"Object.defineProperty called on non-object: \"\n    var ERR_ACCESSORS_NOT_SUPPORTED = \"getters & setters can not be defined \" +\n                                      \"on this javascript engine\";\n\n    Object.defineProperty = function defineProperty(object, property, descriptor) {\n        if ((typeof object != \"object\" && typeof object != \"function\") || object === null)\n            throw new TypeError(ERR_NON_OBJECT_TARGET + object);\n        if ((typeof descriptor != \"object\" && typeof descriptor != \"function\") || descriptor === null)\n            throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR + descriptor);\n        if (definePropertyFallback) {\n            try {\n                return definePropertyFallback.call(Object, object, property, descriptor);\n            } catch (exception) {\n            }\n        }\n        if (owns(descriptor, \"value\")) {\n\n            if (supportsAccessors && (lookupGetter(object, property) ||\n                                      lookupSetter(object, property)))\n            {\n                var prototype = object.__proto__;\n                object.__proto__ = prototypeOfObject;\n                delete object[property];\n                object[property] = descriptor.value;\n                object.__proto__ = prototype;\n            } else {\n                object[property] = descriptor.value;\n            }\n        } else {\n            if (!supportsAccessors)\n                throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);\n            if (owns(descriptor, \"get\"))\n                defineGetter(object, property, descriptor.get);\n            if (owns(descriptor, \"set\"))\n                defineSetter(object, property, descriptor.set);\n        }\n\n        return object;\n    };\n}\nif (!Object.defineProperties) {\n    Object.defineProperties = function defineProperties(object, properties) {\n        for (var property in properties) {\n            if (owns(properties, property))\n                Object.defineProperty(object, property, properties[property]);\n        }\n        return object;\n    };\n}\nif (!Object.seal) {\n    Object.seal = function seal(object) {\n        return object;\n    };\n}\nif (!Object.freeze) {\n    Object.freeze = function freeze(object) {\n        return object;\n    };\n}\ntry {\n    Object.freeze(function () {});\n} catch (exception) {\n    Object.freeze = (function freeze(freezeObject) {\n        return function freeze(object) {\n            if (typeof object == \"function\") {\n                return object;\n            } else {\n                return freezeObject(object);\n            }\n        };\n    })(Object.freeze);\n}\nif (!Object.preventExtensions) {\n    Object.preventExtensions = function preventExtensions(object) {\n        return object;\n    };\n}\nif (!Object.isSealed) {\n    Object.isSealed = function isSealed(object) {\n        return false;\n    };\n}\nif (!Object.isFrozen) {\n    Object.isFrozen = function isFrozen(object) {\n        return false;\n    };\n}\nif (!Object.isExtensible) {\n    Object.isExtensible = function isExtensible(object) {\n        if (Object(object) === object) {\n            throw new TypeError(); // TODO message\n        }\n        var name = '';\n        while (owns(object, name)) {\n            name += '?';\n        }\n        object[name] = true;\n        var returnValue = owns(object, name);\n        delete object[name];\n        return returnValue;\n    };\n}\nif (!Object.keys) {\n    var hasDontEnumBug = true,\n        dontEnums = [\n            \"toString\",\n            \"toLocaleString\",\n            \"valueOf\",\n            \"hasOwnProperty\",\n            \"isPrototypeOf\",\n            \"propertyIsEnumerable\",\n            \"constructor\"\n        ],\n        dontEnumsLength = dontEnums.length;\n\n    for (var key in {\"toString\": null}) {\n        hasDontEnumBug = false;\n    }\n\n    Object.keys = function keys(object) {\n\n        if (\n            (typeof object != \"object\" && typeof object != \"function\") ||\n            object === null\n        ) {\n            throw new TypeError(\"Object.keys called on a non-object\");\n        }\n\n        var keys = [];\n        for (var name in object) {\n            if (owns(object, name)) {\n                keys.push(name);\n            }\n        }\n\n        if (hasDontEnumBug) {\n            for (var i = 0, ii = dontEnumsLength; i < ii; i++) {\n                var dontEnum = dontEnums[i];\n                if (owns(object, dontEnum)) {\n                    keys.push(dontEnum);\n                }\n            }\n        }\n        return keys;\n    };\n\n}\nif (!Date.now) {\n    Date.now = function now() {\n        return new Date().getTime();\n    };\n}\nvar ws = \"\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\" +\n    \"\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\" +\n    \"\\u2029\\uFEFF\";\nif (!String.prototype.trim || ws.trim()) {\n    ws = \"[\" + ws + \"]\";\n    var trimBeginRegexp = new RegExp(\"^\" + ws + ws + \"*\"),\n        trimEndRegexp = new RegExp(ws + ws + \"*$\");\n    String.prototype.trim = function trim() {\n        return String(this).replace(trimBeginRegexp, \"\").replace(trimEndRegexp, \"\");\n    };\n}\n\nfunction toInteger(n) {\n    n = +n;\n    if (n !== n) { // isNaN\n        n = 0;\n    } else if (n !== 0 && n !== (1/0) && n !== -(1/0)) {\n        n = (n > 0 || -1) * Math.floor(Math.abs(n));\n    }\n    return n;\n}\n\nfunction isPrimitive(input) {\n    var type = typeof input;\n    return (\n        input === null ||\n        type === \"undefined\" ||\n        type === \"boolean\" ||\n        type === \"number\" ||\n        type === \"string\"\n    );\n}\n\nfunction toPrimitive(input) {\n    var val, valueOf, toString;\n    if (isPrimitive(input)) {\n        return input;\n    }\n    valueOf = input.valueOf;\n    if (typeof valueOf === \"function\") {\n        val = valueOf.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    toString = input.toString;\n    if (typeof toString === \"function\") {\n        val = toString.call(input);\n        if (isPrimitive(val)) {\n            return val;\n        }\n    }\n    throw new TypeError();\n}\nvar toObject = function (o) {\n    if (o == null) { // this matches both null and undefined\n        throw new TypeError(\"can't convert \"+o+\" to object\");\n    }\n    return Object(o);\n};\n\n});\n\ndefine('ace/mode/json_worker', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/worker/mirror', 'ace/mode/json/json_parse'], function(require, exports, module) {\n\n\nvar oop = require(\"../lib/oop\");\nvar Mirror = require(\"../worker/mirror\").Mirror;\nvar parse = require(\"./json/json_parse\");\n\nvar JsonWorker = exports.JsonWorker = function(sender) {\n    Mirror.call(this, sender);\n    this.setTimeout(200);\n};\n\noop.inherits(JsonWorker, Mirror);\n\n(function() {\n\n    this.onUpdate = function() {\n        var value = this.doc.getValue();\n\n        try {\n            var result = parse(value);\n        } catch (e) {\n            var pos = this.doc.indexToPosition(e.at-1);\n            this.sender.emit(\"error\", {\n                row: pos.row,\n                column: pos.column,\n                text: e.message,\n                type: \"error\"\n            });\n            return;\n        }\n        this.sender.emit(\"ok\");\n    };\n\n}).call(JsonWorker.prototype);\n\n});\n\ndefine('ace/lib/oop', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nexports.inherits = (function() {\n    var createObject = Object.create || function(prototype, properties) {\n        var Type = function () {};\n        Type.prototype = prototype;\n        object = new Type();\n        object.__proto__ = prototype;\n        if (typeof properties !== 'undefined' && Object.defineProperties) {\n            Object.defineProperties(object, properties);\n        }\n    };\n    return function(ctor, superCtor) {\n        ctor.super_ = superCtor;\n        ctor.prototype = createObject(superCtor.prototype, {\n            constructor: {\n                value: ctor,\n                enumerable: false,\n                writable: true,\n                configurable: true\n            }\n        });\n    };\n}());\n\nexports.mixin = function(obj, mixin) {\n    for (var key in mixin) {\n        obj[key] = mixin[key];\n    }\n    return obj;\n};\n\nexports.implement = function(proto, mixin) {\n    exports.mixin(proto, mixin);\n};\n\n});\ndefine('ace/worker/mirror', ['require', 'exports', 'module' , 'ace/document', 'ace/lib/lang'], function(require, exports, module) {\n\n\nvar Document = require(\"../document\").Document;\nvar lang = require(\"../lib/lang\");\n    \nvar Mirror = exports.Mirror = function(sender) {\n    this.sender = sender;\n    var doc = this.doc = new Document(\"\");\n    \n    var deferredUpdate = this.deferredUpdate = lang.delayedCall(this.onUpdate.bind(this));\n    \n    var _self = this;\n    sender.on(\"change\", function(e) {\n        doc.applyDeltas(e.data);\n        if (_self.$timeout)\n            return deferredUpdate.schedule(_self.$timeout);\n        _self.onUpdate();\n    });\n};\n\n(function() {\n    \n    this.$timeout = 500;\n    \n    this.setTimeout = function(timeout) {\n        this.$timeout = timeout;\n    };\n    \n    this.setValue = function(value) {\n        this.doc.setValue(value);\n        this.deferredUpdate.schedule(this.$timeout);\n    };\n    \n    this.getValue = function(callbackId) {\n        this.sender.callback(this.doc.getValue(), callbackId);\n    };\n    \n    this.onUpdate = function() {\n    };\n    \n    this.isPending = function() {\n        return this.deferredUpdate.isPending();\n    };\n    \n}).call(Mirror.prototype);\n\n});\n\ndefine('ace/document', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter', 'ace/range', 'ace/anchor'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\nvar Range = require(\"./range\").Range;\nvar Anchor = require(\"./anchor\").Anchor;\n\nvar Document = function(text) {\n    this.$lines = [];\n    if (text.length == 0) {\n        this.$lines = [\"\"];\n    } else if (Array.isArray(text)) {\n        this._insertLines(0, text);\n    } else {\n        this.insert({row: 0, column:0}, text);\n    }\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.setValue = function(text) {\n        var len = this.getLength();\n        this.remove(new Range(0, 0, len, this.getLine(len-1).length));\n        this.insert({row: 0, column:0}, text);\n    };\n    this.getValue = function() {\n        return this.getAllLines().join(this.getNewLineCharacter());\n    };\n    this.createAnchor = function(row, column) {\n        return new Anchor(this, row, column);\n    };\n    if (\"aaa\".split(/a/).length == 0)\n        this.$split = function(text) {\n            return text.replace(/\\r\\n|\\r/g, \"\\n\").split(\"\\n\");\n        }\n    else\n        this.$split = function(text) {\n            return text.split(/\\r\\n|\\r|\\n/);\n        };\n\n\n    this.$detectNewLine = function(text) {\n        var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n        this.$autoNewLine = match ? match[1] : \"\\n\";\n    };\n    this.getNewLineCharacter = function() {\n        switch (this.$newLineMode) {\n          case \"windows\":\n            return \"\\r\\n\";\n          case \"unix\":\n            return \"\\n\";\n          default:\n            return this.$autoNewLine;\n        }\n    };\n\n    this.$autoNewLine = \"\\n\";\n    this.$newLineMode = \"auto\";\n    this.setNewLineMode = function(newLineMode) {\n        if (this.$newLineMode === newLineMode)\n            return;\n\n        this.$newLineMode = newLineMode;\n    };\n    this.getNewLineMode = function() {\n        return this.$newLineMode;\n    };\n    this.isNewLine = function(text) {\n        return (text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\");\n    };\n    this.getLine = function(row) {\n        return this.$lines[row] || \"\";\n    };\n    this.getLines = function(firstRow, lastRow) {\n        return this.$lines.slice(firstRow, lastRow + 1);\n    };\n    this.getAllLines = function() {\n        return this.getLines(0, this.getLength());\n    };\n    this.getLength = function() {\n        return this.$lines.length;\n    };\n    this.getTextRange = function(range) {\n        if (range.start.row == range.end.row) {\n            return this.getLine(range.start.row)\n                .substring(range.start.column, range.end.column);\n        }\n        var lines = this.getLines(range.start.row, range.end.row);\n        lines[0] = (lines[0] || \"\").substring(range.start.column);\n        var l = lines.length - 1;\n        if (range.end.row - range.start.row == l)\n            lines[l] = lines[l].substring(0, range.end.column);\n        return lines.join(this.getNewLineCharacter());\n    };\n\n    this.$clipPosition = function(position) {\n        var length = this.getLength();\n        if (position.row >= length) {\n            position.row = Math.max(0, length - 1);\n            position.column = this.getLine(length-1).length;\n        } else if (position.row < 0)\n            position.row = 0;\n        return position;\n    };\n    this.insert = function(position, text) {\n        if (!text || text.length === 0)\n            return position;\n\n        position = this.$clipPosition(position);\n        if (this.getLength() <= 1)\n            this.$detectNewLine(text);\n\n        var lines = this.$split(text);\n        var firstLine = lines.splice(0, 1)[0];\n        var lastLine = lines.length == 0 ? null : lines.splice(lines.length - 1, 1)[0];\n\n        position = this.insertInLine(position, firstLine);\n        if (lastLine !== null) {\n            position = this.insertNewLine(position); // terminate first line\n            position = this._insertLines(position.row, lines);\n            position = this.insertInLine(position, lastLine || \"\");\n        }\n        return position;\n    };\n    this.insertLines = function(row, lines) {\n        if (row >= this.getLength())\n            return this.insert({row: row, column: 0}, \"\\n\" + lines.join(\"\\n\"));\n        return this._insertLines(Math.max(row, 0), lines);\n    };\n    this._insertLines = function(row, lines) {\n        if (lines.length == 0)\n            return {row: row, column: 0};\n        if (lines.length > 0xFFFF) {\n            var end = this._insertLines(row, lines.slice(0xFFFF));\n            lines = lines.slice(0, 0xFFFF);\n        }\n\n        var args = [row, 0];\n        args.push.apply(args, lines);\n        this.$lines.splice.apply(this.$lines, args);\n\n        var range = new Range(row, 0, row + lines.length, 0);\n        var delta = {\n            action: \"insertLines\",\n            range: range,\n            lines: lines\n        };\n        this._emit(\"change\", { data: delta });\n        return end || range.end;\n    };\n    this.insertNewLine = function(position) {\n        position = this.$clipPosition(position);\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column);\n        this.$lines.splice(position.row + 1, 0, line.substring(position.column, line.length));\n\n        var end = {\n            row : position.row + 1,\n            column : 0\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: this.getNewLineCharacter()\n        };\n        this._emit(\"change\", { data: delta });\n\n        return end;\n    };\n    this.insertInLine = function(position, text) {\n        if (text.length == 0)\n            return position;\n\n        var line = this.$lines[position.row] || \"\";\n\n        this.$lines[position.row] = line.substring(0, position.column) + text\n                + line.substring(position.column);\n\n        var end = {\n            row : position.row,\n            column : position.column + text.length\n        };\n\n        var delta = {\n            action: \"insertText\",\n            range: Range.fromPoints(position, end),\n            text: text\n        };\n        this._emit(\"change\", { data: delta });\n\n        return end;\n    };\n    this.remove = function(range) {\n        if (!range instanceof Range)\n            range = Range.fromPoints(range.start, range.end);\n        range.start = this.$clipPosition(range.start);\n        range.end = this.$clipPosition(range.end);\n\n        if (range.isEmpty())\n            return range.start;\n\n        var firstRow = range.start.row;\n        var lastRow = range.end.row;\n\n        if (range.isMultiLine()) {\n            var firstFullRow = range.start.column == 0 ? firstRow : firstRow + 1;\n            var lastFullRow = lastRow - 1;\n\n            if (range.end.column > 0)\n                this.removeInLine(lastRow, 0, range.end.column);\n\n            if (lastFullRow >= firstFullRow)\n                this._removeLines(firstFullRow, lastFullRow);\n\n            if (firstFullRow != firstRow) {\n                this.removeInLine(firstRow, range.start.column, this.getLine(firstRow).length);\n                this.removeNewLine(range.start.row);\n            }\n        }\n        else {\n            this.removeInLine(firstRow, range.start.column, range.end.column);\n        }\n        return range.start;\n    };\n    this.removeInLine = function(row, startColumn, endColumn) {\n        if (startColumn == endColumn)\n            return;\n\n        var range = new Range(row, startColumn, row, endColumn);\n        var line = this.getLine(row);\n        var removed = line.substring(startColumn, endColumn);\n        var newLine = line.substring(0, startColumn) + line.substring(endColumn, line.length);\n        this.$lines.splice(row, 1, newLine);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: removed\n        };\n        this._emit(\"change\", { data: delta });\n        return range.start;\n    };\n    this.removeLines = function(firstRow, lastRow) {\n        if (firstRow < 0 || lastRow >= this.getLength())\n            return this.remove(new Range(firstRow, 0, lastRow + 1, 0));\n        return this._removeLines(firstRow, lastRow);\n    };\n\n    this._removeLines = function(firstRow, lastRow) {\n        var range = new Range(firstRow, 0, lastRow + 1, 0);\n        var removed = this.$lines.splice(firstRow, lastRow - firstRow + 1);\n\n        var delta = {\n            action: \"removeLines\",\n            range: range,\n            nl: this.getNewLineCharacter(),\n            lines: removed\n        };\n        this._emit(\"change\", { data: delta });\n        return removed;\n    };\n    this.removeNewLine = function(row) {\n        var firstLine = this.getLine(row);\n        var secondLine = this.getLine(row+1);\n\n        var range = new Range(row, firstLine.length, row+1, 0);\n        var line = firstLine + secondLine;\n\n        this.$lines.splice(row, 2, line);\n\n        var delta = {\n            action: \"removeText\",\n            range: range,\n            text: this.getNewLineCharacter()\n        };\n        this._emit(\"change\", { data: delta });\n    };\n    this.replace = function(range, text) {\n        if (!range instanceof Range)\n            range = Range.fromPoints(range.start, range.end);\n        if (text.length == 0 && range.isEmpty())\n            return range.start;\n        if (text == this.getTextRange(range))\n            return range.end;\n\n        this.remove(range);\n        if (text) {\n            var end = this.insert(range.start, text);\n        }\n        else {\n            end = range.start;\n        }\n\n        return end;\n    };\n    this.applyDeltas = function(deltas) {\n        for (var i=0; i<deltas.length; i++) {\n            var delta = deltas[i];\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this.insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"insertText\")\n                this.insert(range.start, delta.text);\n            else if (delta.action == \"removeLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"removeText\")\n                this.remove(range);\n        }\n    };\n    this.revertDeltas = function(deltas) {\n        for (var i=deltas.length-1; i>=0; i--) {\n            var delta = deltas[i];\n\n            var range = Range.fromPoints(delta.range.start, delta.range.end);\n\n            if (delta.action == \"insertLines\")\n                this._removeLines(range.start.row, range.end.row - 1);\n            else if (delta.action == \"insertText\")\n                this.remove(range);\n            else if (delta.action == \"removeLines\")\n                this._insertLines(range.start.row, delta.lines);\n            else if (delta.action == \"removeText\")\n                this.insert(range.start, delta.text);\n        }\n    };\n    this.indexToPosition = function(index, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        for (var i = startRow || 0, l = lines.length; i < l; i++) {\n            index -= lines[i].length + newlineLength;\n            if (index < 0)\n                return {row: i, column: index + lines[i].length + newlineLength};\n        }\n        return {row: l-1, column: lines[l-1].length};\n    };\n    this.positionToIndex = function(pos, startRow) {\n        var lines = this.$lines || this.getAllLines();\n        var newlineLength = this.getNewLineCharacter().length;\n        var index = 0;\n        var row = Math.min(pos.row, lines.length);\n        for (var i = startRow || 0; i < row; ++i)\n            index += lines[i].length + newlineLength;\n\n        return index + pos.column;\n    };\n\n}).call(Document.prototype);\n\nexports.Document = Document;\n});\n\ndefine('ace/lib/event_emitter', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nvar EventEmitter = {};\nvar stopPropagation = function() { this.propagationStopped = true; };\nvar preventDefault = function() { this.defaultPrevented = true; };\n\nEventEmitter._emit =\nEventEmitter._dispatchEvent = function(eventName, e) {\n    this._eventRegistry || (this._eventRegistry = {});\n    this._defaultHandlers || (this._defaultHandlers = {});\n\n    var listeners = this._eventRegistry[eventName] || [];\n    var defaultHandler = this._defaultHandlers[eventName];\n    if (!listeners.length && !defaultHandler)\n        return;\n\n    if (typeof e != \"object\" || !e)\n        e = {};\n\n    if (!e.type)\n        e.type = eventName;\n    if (!e.stopPropagation)\n        e.stopPropagation = stopPropagation;\n    if (!e.preventDefault)\n        e.preventDefault = preventDefault;\n\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++) {\n        listeners[i](e, this);\n        if (e.propagationStopped)\n            break;\n    }\n    \n    if (defaultHandler && !e.defaultPrevented)\n        return defaultHandler(e, this);\n};\n\n\nEventEmitter._signal = function(eventName, e) {\n    var listeners = (this._eventRegistry || {})[eventName];\n    if (!listeners)\n        return;\n    listeners = listeners.slice();\n    for (var i=0; i<listeners.length; i++)\n        listeners[i](e, this);\n};\n\nEventEmitter.once = function(eventName, callback) {\n    var _self = this;\n    callback && this.addEventListener(eventName, function newCallback() {\n        _self.removeEventListener(eventName, newCallback);\n        callback.apply(null, arguments);\n    });\n};\n\n\nEventEmitter.setDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        handlers = this._defaultHandlers = {_disabled_: {}};\n    \n    if (handlers[eventName]) {\n        var old = handlers[eventName];\n        var disabled = handlers._disabled_[eventName];\n        if (!disabled)\n            handlers._disabled_[eventName] = disabled = [];\n        disabled.push(old);\n        var i = disabled.indexOf(callback);\n        if (i != -1) \n            disabled.splice(i, 1);\n    }\n    handlers[eventName] = callback;\n};\nEventEmitter.removeDefaultHandler = function(eventName, callback) {\n    var handlers = this._defaultHandlers\n    if (!handlers)\n        return;\n    var disabled = handlers._disabled_[eventName];\n    \n    if (handlers[eventName] == callback) {\n        var old = handlers[eventName];\n        if (disabled)\n            this.setDefaultHandler(eventName, disabled.pop());\n    } else if (disabled) {\n        var i = disabled.indexOf(callback);\n        if (i != -1)\n            disabled.splice(i, 1);\n    }\n};\n\nEventEmitter.on =\nEventEmitter.addEventListener = function(eventName, callback, capturing) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        listeners = this._eventRegistry[eventName] = [];\n\n    if (listeners.indexOf(callback) == -1)\n        listeners[capturing ? \"unshift\" : \"push\"](callback);\n    return callback;\n};\n\nEventEmitter.off =\nEventEmitter.removeListener =\nEventEmitter.removeEventListener = function(eventName, callback) {\n    this._eventRegistry = this._eventRegistry || {};\n\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners)\n        return;\n\n    var index = listeners.indexOf(callback);\n    if (index !== -1)\n        listeners.splice(index, 1);\n};\n\nEventEmitter.removeAllListeners = function(eventName) {\n    if (this._eventRegistry) this._eventRegistry[eventName] = [];\n};\n\nexports.EventEmitter = EventEmitter;\n\n});\n\ndefine('ace/range', ['require', 'exports', 'module' ], function(require, exports, module) {\n\nvar comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\nvar Range = function(startRow, startColumn, endRow, endColumn) {\n    this.start = {\n        row: startRow,\n        column: startColumn\n    };\n\n    this.end = {\n        row: endRow,\n        column: endColumn\n    };\n};\n\n(function() {\n    this.isEqual = function(range) {\n        return this.start.row === range.start.row &&\n            this.end.row === range.end.row &&\n            this.start.column === range.start.column &&\n            this.end.column === range.end.column;\n    };\n    this.toString = function() {\n        return (\"Range: [\" + this.start.row + \"/\" + this.start.column +\n            \"] -> [\" + this.end.row + \"/\" + this.end.column + \"]\");\n    };\n\n    this.contains = function(row, column) {\n        return this.compare(row, column) == 0;\n    };\n    this.compareRange = function(range) {\n        var cmp,\n            end = range.end,\n            start = range.start;\n\n        cmp = this.compare(end.row, end.column);\n        if (cmp == 1) {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == 1) {\n                return 2;\n            } else if (cmp == 0) {\n                return 1;\n            } else {\n                return 0;\n            }\n        } else if (cmp == -1) {\n            return -2;\n        } else {\n            cmp = this.compare(start.row, start.column);\n            if (cmp == -1) {\n                return -1;\n            } else if (cmp == 1) {\n                return 42;\n            } else {\n                return 0;\n            }\n        }\n    };\n    this.comparePoint = function(p) {\n        return this.compare(p.row, p.column);\n    };\n    this.containsRange = function(range) {\n        return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;\n    };\n    this.intersects = function(range) {\n        var cmp = this.compareRange(range);\n        return (cmp == -1 || cmp == 0 || cmp == 1);\n    };\n    this.isEnd = function(row, column) {\n        return this.end.row == row && this.end.column == column;\n    };\n    this.isStart = function(row, column) {\n        return this.start.row == row && this.start.column == column;\n    };\n    this.setStart = function(row, column) {\n        if (typeof row == \"object\") {\n            this.start.column = row.column;\n            this.start.row = row.row;\n        } else {\n            this.start.row = row;\n            this.start.column = column;\n        }\n    };\n    this.setEnd = function(row, column) {\n        if (typeof row == \"object\") {\n            this.end.column = row.column;\n            this.end.row = row.row;\n        } else {\n            this.end.row = row;\n            this.end.column = column;\n        }\n    };\n    this.inside = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column) || this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideStart = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isEnd(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.insideEnd = function(row, column) {\n        if (this.compare(row, column) == 0) {\n            if (this.isStart(row, column)) {\n                return false;\n            } else {\n                return true;\n            }\n        }\n        return false;\n    };\n    this.compare = function(row, column) {\n        if (!this.isMultiLine()) {\n            if (row === this.start.row) {\n                return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);\n            };\n        }\n\n        if (row < this.start.row)\n            return -1;\n\n        if (row > this.end.row)\n            return 1;\n\n        if (this.start.row === row)\n            return column >= this.start.column ? 0 : -1;\n\n        if (this.end.row === row)\n            return column <= this.end.column ? 0 : 1;\n\n        return 0;\n    };\n    this.compareStart = function(row, column) {\n        if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareEnd = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.compareInside = function(row, column) {\n        if (this.end.row == row && this.end.column == column) {\n            return 1;\n        } else if (this.start.row == row && this.start.column == column) {\n            return -1;\n        } else {\n            return this.compare(row, column);\n        }\n    };\n    this.clipRows = function(firstRow, lastRow) {\n        if (this.end.row > lastRow)\n            var end = {row: lastRow + 1, column: 0};\n        else if (this.end.row < firstRow)\n            var end = {row: firstRow, column: 0};\n\n        if (this.start.row > lastRow)\n            var start = {row: lastRow + 1, column: 0};\n        else if (this.start.row < firstRow)\n            var start = {row: firstRow, column: 0};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n    this.extend = function(row, column) {\n        var cmp = this.compare(row, column);\n\n        if (cmp == 0)\n            return this;\n        else if (cmp == -1)\n            var start = {row: row, column: column};\n        else\n            var end = {row: row, column: column};\n\n        return Range.fromPoints(start || this.start, end || this.end);\n    };\n\n    this.isEmpty = function() {\n        return (this.start.row === this.end.row && this.start.column === this.end.column);\n    };\n    this.isMultiLine = function() {\n        return (this.start.row !== this.end.row);\n    };\n    this.clone = function() {\n        return Range.fromPoints(this.start, this.end);\n    };\n    this.collapseRows = function() {\n        if (this.end.column == 0)\n            return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0)\n        else\n            return new Range(this.start.row, 0, this.end.row, 0)\n    };\n    this.toScreenRange = function(session) {\n        var screenPosStart = session.documentToScreenPosition(this.start);\n        var screenPosEnd = session.documentToScreenPosition(this.end);\n\n        return new Range(\n            screenPosStart.row, screenPosStart.column,\n            screenPosEnd.row, screenPosEnd.column\n        );\n    };\n    this.moveBy = function(row, column) {\n        this.start.row += row;\n        this.start.column += column;\n        this.end.row += row;\n        this.end.column += column;\n    };\n\n}).call(Range.prototype);\nRange.fromPoints = function(start, end) {\n    return new Range(start.row, start.column, end.row, end.column);\n};\nRange.comparePoints = comparePoints;\n\nRange.comparePoints = function(p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n};\n\n\nexports.Range = Range;\n});\n\ndefine('ace/anchor', ['require', 'exports', 'module' , 'ace/lib/oop', 'ace/lib/event_emitter'], function(require, exports, module) {\n\n\nvar oop = require(\"./lib/oop\");\nvar EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n\nvar Anchor = exports.Anchor = function(doc, row, column) {\n    this.$onChange = this.onChange.bind(this);\n    this.attach(doc);\n    \n    if (typeof column == \"undefined\")\n        this.setPosition(row.row, row.column);\n    else\n        this.setPosition(row, column);\n};\n\n(function() {\n\n    oop.implement(this, EventEmitter);\n    this.getPosition = function() {\n        return this.$clipPositionToDocument(this.row, this.column);\n    };\n    this.getDocument = function() {\n        return this.document;\n    };\n    this.$insertRight = false;\n    this.onChange = function(e) {\n        var delta = e.data;\n        var range = delta.range;\n\n        if (range.start.row == range.end.row && range.start.row != this.row)\n            return;\n\n        if (range.start.row > this.row)\n            return;\n\n        if (range.start.row == this.row && range.start.column > this.column)\n            return;\n\n        var row = this.row;\n        var column = this.column;\n        var start = range.start;\n        var end = range.end;\n\n        if (delta.action === \"insertText\") {\n            if (start.row === row && start.column <= column) {\n                if (start.column === column && this.$insertRight) {\n                } else if (start.row === end.row) {\n                    column += end.column - start.column;\n                } else {\n                    column -= start.column;\n                    row += end.row - start.row;\n                }\n            } else if (start.row !== end.row && start.row < row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"insertLines\") {\n            if (start.row <= row) {\n                row += end.row - start.row;\n            }\n        } else if (delta.action === \"removeText\") {\n            if (start.row === row && start.column < column) {\n                if (end.column >= column)\n                    column = start.column;\n                else\n                    column = Math.max(0, column - (end.column - start.column));\n\n            } else if (start.row !== end.row && start.row < row) {\n                if (end.row === row)\n                    column = Math.max(0, column - end.column) + start.column;\n                row -= (end.row - start.row);\n            } else if (end.row === row) {\n                row -= end.row - start.row;\n                column = Math.max(0, column - end.column) + start.column;\n            }\n        } else if (delta.action == \"removeLines\") {\n            if (start.row <= row) {\n                if (end.row <= row)\n                    row -= end.row - start.row;\n                else {\n                    row = start.row;\n                    column = 0;\n                }\n            }\n        }\n\n        this.setPosition(row, column, true);\n    };\n    this.setPosition = function(row, column, noClip) {\n        var pos;\n        if (noClip) {\n            pos = {\n                row: row,\n                column: column\n            };\n        } else {\n            pos = this.$clipPositionToDocument(row, column);\n        }\n\n        if (this.row == pos.row && this.column == pos.column)\n            return;\n\n        var old = {\n            row: this.row,\n            column: this.column\n        };\n\n        this.row = pos.row;\n        this.column = pos.column;\n        this._emit(\"change\", {\n            old: old,\n            value: pos\n        });\n    };\n    this.detach = function() {\n        this.document.removeEventListener(\"change\", this.$onChange);\n    };\n    this.attach = function(doc) {\n        this.document = doc || this.document;\n        this.document.on(\"change\", this.$onChange);\n    };\n    this.$clipPositionToDocument = function(row, column) {\n        var pos = {};\n\n        if (row >= this.document.getLength()) {\n            pos.row = Math.max(0, this.document.getLength() - 1);\n            pos.column = this.document.getLine(pos.row).length;\n        }\n        else if (row < 0) {\n            pos.row = 0;\n            pos.column = 0;\n        }\n        else {\n            pos.row = row;\n            pos.column = Math.min(this.document.getLine(pos.row).length, Math.max(0, column));\n        }\n\n        if (column < 0)\n            pos.column = 0;\n\n        return pos;\n    };\n\n}).call(Anchor.prototype);\n\n});\n\ndefine('ace/lib/lang', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n\nexports.stringReverse = function(string) {\n    return string.split(\"\").reverse().join(\"\");\n};\n\nexports.stringRepeat = function (string, count) {\n    var result = '';\n    while (count > 0) {\n        if (count & 1)\n            result += string;\n\n        if (count >>= 1)\n            string += string;\n    }\n    return result;\n};\n\nvar trimBeginRegexp = /^\\s\\s*/;\nvar trimEndRegexp = /\\s\\s*$/;\n\nexports.stringTrimLeft = function (string) {\n    return string.replace(trimBeginRegexp, '');\n};\n\nexports.stringTrimRight = function (string) {\n    return string.replace(trimEndRegexp, '');\n};\n\nexports.copyObject = function(obj) {\n    var copy = {};\n    for (var key in obj) {\n        copy[key] = obj[key];\n    }\n    return copy;\n};\n\nexports.copyArray = function(array){\n    var copy = [];\n    for (var i=0, l=array.length; i<l; i++) {\n        if (array[i] && typeof array[i] == \"object\")\n            copy[i] = this.copyObject( array[i] );\n        else \n            copy[i] = array[i];\n    }\n    return copy;\n};\n\nexports.deepCopy = function (obj) {\n    if (typeof obj !== \"object\" || !obj)\n        return obj;\n    var cons = obj.constructor;\n    if (cons === RegExp)\n        return obj;\n    \n    var copy = cons();\n    for (var key in obj) {\n        if (typeof obj[key] === \"object\") {\n            copy[key] = exports.deepCopy(obj[key]);\n        } else {\n            copy[key] = obj[key];\n        }\n    }\n    return copy;\n};\n\nexports.arrayToMap = function(arr) {\n    var map = {};\n    for (var i=0; i<arr.length; i++) {\n        map[arr[i]] = 1;\n    }\n    return map;\n\n};\n\nexports.createMap = function(props) {\n    var map = Object.create(null);\n    for (var i in props) {\n        map[i] = props[i];\n    }\n    return map;\n};\nexports.arrayRemove = function(array, value) {\n  for (var i = 0; i <= array.length; i++) {\n    if (value === array[i]) {\n      array.splice(i, 1);\n    }\n  }\n};\n\nexports.escapeRegExp = function(str) {\n    return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g, '\\\\$1');\n};\n\nexports.escapeHTML = function(str) {\n    return str.replace(/&/g, \"&#38;\").replace(/\"/g, \"&#34;\").replace(/'/g, \"&#39;\").replace(/</g, \"&#60;\");\n};\n\nexports.getMatchOffsets = function(string, regExp) {\n    var matches = [];\n\n    string.replace(regExp, function(str) {\n        matches.push({\n            offset: arguments[arguments.length-2],\n            length: str.length\n        });\n    });\n\n    return matches;\n};\nexports.deferredCall = function(fcn) {\n\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var deferred = function(timeout) {\n        deferred.cancel();\n        timer = setTimeout(callback, timeout || 0);\n        return deferred;\n    };\n\n    deferred.schedule = deferred;\n\n    deferred.call = function() {\n        this.cancel();\n        fcn();\n        return deferred;\n    };\n\n    deferred.cancel = function() {\n        clearTimeout(timer);\n        timer = null;\n        return deferred;\n    };\n    \n    deferred.isPending = function() {\n        return timer;\n    };\n\n    return deferred;\n};\n\n\nexports.delayedCall = function(fcn, defaultTimeout) {\n    var timer = null;\n    var callback = function() {\n        timer = null;\n        fcn();\n    };\n\n    var _self = function(timeout) {\n        if (timer == null)\n            timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n\n    _self.delay = function(timeout) {\n        timer && clearTimeout(timer);\n        timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n    _self.schedule = _self;\n\n    _self.call = function() {\n        this.cancel();\n        fcn();\n    };\n\n    _self.cancel = function() {\n        timer && clearTimeout(timer);\n        timer = null;\n    };\n\n    _self.isPending = function() {\n        return timer;\n    };\n\n    return _self;\n};\n});\n\ndefine('ace/mode/json/json_parse', ['require', 'exports', 'module' ], function(require, exports, module) {\n\n    var at,     // The index of the current character\n        ch,     // The current character\n        escapee = {\n            '\"':  '\"',\n            '\\\\': '\\\\',\n            '/':  '/',\n            b:    '\\b',\n            f:    '\\f',\n            n:    '\\n',\n            r:    '\\r',\n            t:    '\\t'\n        },\n        text,\n\n        error = function (m) {\n\n            throw {\n                name:    'SyntaxError',\n                message: m,\n                at:      at,\n                text:    text\n            };\n        },\n\n        next = function (c) {\n\n            if (c && c !== ch) {\n                error(\"Expected '\" + c + \"' instead of '\" + ch + \"'\");\n            }\n\n            ch = text.charAt(at);\n            at += 1;\n            return ch;\n        },\n\n        number = function () {\n\n            var number,\n                string = '';\n\n            if (ch === '-') {\n                string = '-';\n                next('-');\n            }\n            while (ch >= '0' && ch <= '9') {\n                string += ch;\n                next();\n            }\n            if (ch === '.') {\n                string += '.';\n                while (next() && ch >= '0' && ch <= '9') {\n                    string += ch;\n                }\n            }\n            if (ch === 'e' || ch === 'E') {\n                string += ch;\n                next();\n                if (ch === '-' || ch === '+') {\n                    string += ch;\n                    next();\n                }\n                while (ch >= '0' && ch <= '9') {\n                    string += ch;\n                    next();\n                }\n            }\n            number = +string;\n            if (isNaN(number)) {\n                error(\"Bad number\");\n            } else {\n                return number;\n            }\n        },\n\n        string = function () {\n\n            var hex,\n                i,\n                string = '',\n                uffff;\n\n            if (ch === '\"') {\n                while (next()) {\n                    if (ch === '\"') {\n                        next();\n                        return string;\n                    } else if (ch === '\\\\') {\n                        next();\n                        if (ch === 'u') {\n                            uffff = 0;\n                            for (i = 0; i < 4; i += 1) {\n                                hex = parseInt(next(), 16);\n                                if (!isFinite(hex)) {\n                                    break;\n                                }\n                                uffff = uffff * 16 + hex;\n                            }\n                            string += String.fromCharCode(uffff);\n                        } else if (typeof escapee[ch] === 'string') {\n                            string += escapee[ch];\n                        } else {\n                            break;\n                        }\n                    } else {\n                        string += ch;\n                    }\n                }\n            }\n            error(\"Bad string\");\n        },\n\n        white = function () {\n\n            while (ch && ch <= ' ') {\n                next();\n            }\n        },\n\n        word = function () {\n\n            switch (ch) {\n            case 't':\n                next('t');\n                next('r');\n                next('u');\n                next('e');\n                return true;\n            case 'f':\n                next('f');\n                next('a');\n                next('l');\n                next('s');\n                next('e');\n                return false;\n            case 'n':\n                next('n');\n                next('u');\n                next('l');\n                next('l');\n                return null;\n            }\n            error(\"Unexpected '\" + ch + \"'\");\n        },\n\n        value,  // Place holder for the value function.\n\n        array = function () {\n\n            var array = [];\n\n            if (ch === '[') {\n                next('[');\n                white();\n                if (ch === ']') {\n                    next(']');\n                    return array;   // empty array\n                }\n                while (ch) {\n                    array.push(value());\n                    white();\n                    if (ch === ']') {\n                        next(']');\n                        return array;\n                    }\n                    next(',');\n                    white();\n                }\n            }\n            error(\"Bad array\");\n        },\n\n        object = function () {\n\n            var key,\n                object = {};\n\n            if (ch === '{') {\n                next('{');\n                white();\n                if (ch === '}') {\n                    next('}');\n                    return object;   // empty object\n                }\n                while (ch) {\n                    key = string();\n                    white();\n                    next(':');\n                    if (Object.hasOwnProperty.call(object, key)) {\n                        error('Duplicate key \"' + key + '\"');\n                    }\n                    object[key] = value();\n                    white();\n                    if (ch === '}') {\n                        next('}');\n                        return object;\n                    }\n                    next(',');\n                    white();\n                }\n            }\n            error(\"Bad object\");\n        };\n\n    value = function () {\n\n        white();\n        switch (ch) {\n        case '{':\n            return object();\n        case '[':\n            return array();\n        case '\"':\n            return string();\n        case '-':\n            return number();\n        default:\n            return ch >= '0' && ch <= '9' ? number() : word();\n        }\n    };\n\n    return function (source, reviver) {\n        var result;\n\n        text = source;\n        at = 0;\n        ch = ' ';\n        result = value();\n        white();\n        if (ch) {\n            error(\"Syntax error\");\n        }\n\n        return typeof reviver === 'function' ? function walk(holder, key) {\n            var k, v, value = holder[key];\n            if (value && typeof value === 'object') {\n                for (k in value) {\n                    if (Object.hasOwnProperty.call(value, k)) {\n                        v = walk(value, k);\n                        if (v !== undefined) {\n                            value[k] = v;\n                        } else {\n                            delete value[k];\n                        }\n                    }\n                }\n            }\n            return reviver.call(holder, key, value);\n        }({'': result}, '') : result;\n    };\n});\n"
  },
  {
    "path": "browser/plugins/action_button.plugin.js",
    "content": "E2.p = E2.plugins[\"action_button\"] = function(core, node)\n{\n\tthis.desc = 'Push button that emits true when it is clicked.';\n\t\n\tthis.input_slots = [];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: 'True once each time the button is clicked.', def: false }\n\t];\n\t\n\tthis.node = node;\n\tthis.value = false;\n\tthis.output_value = false;\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = false;\n\tthis.output_value = false;\n};\n\nE2.p.prototype.create_ui = function()\n{\n\tvar inp = makeButton('Click', '', 'fxtrigger');\n\t\n\tinp.click(function(self) { return function(e) \n\t{\n\t\tself.output_value = false;\n\t\tself.value = true;\n\t\tself.updated = true;\n\t}}(this));\n\t\n\treturn inp;\n};\n\nE2.p.prototype.update_state = function()\n{\n\tthis.updated = this.output_value || this.value;\n\tthis.output_value = this.value;\n\tthis.value = false;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.output_value;\n};\n"
  },
  {
    "path": "browser/plugins/add_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"add_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Add two floating point values.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'a', dt: core.datatypes.FLOAT, desc: 'The first operand.', def: 0.0 },\n\t\t{ name: 'b', dt: core.datatypes.FLOAT, desc: 'The second operand.', def: 0.0 } \n\t];\n\t\n\tthis.output_slots = [ \n\t\t{ name: 'result', dt: core.datatypes.FLOAT, desc: 'The result of <b>first</b> + <b>second</b>.', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.input_val = 0.0;\n\tthis.add_val = 0.0;\n\tthis.output_val = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.input_val = data;\n\telse\n\t\tthis.add_val = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.output_val = this.input_val + this.add_val;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.output_val;\n};\n\n"
  },
  {
    "path": "browser/plugins/add_on_trigger_float.plugin.js",
    "content": "(function() {\n\tvar AddOnTriggerFloat = E2.plugins.add_on_trigger_float = function(core, node) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.input_slots = [{\n\t\t\tname: 'trigger',\n\t\t\tdt: E2.dt.BOOL,\n\t\t\tdesc: 'On true, this plugin will output A + B, otherwise A'\n\t\t}, {\n\t\t\tname: 'A',\n\t\t\tdt: E2.dt.FLOAT\n\t\t}, {\n\t\t\tname : 'B',\n\t\t\tdt: E2.dt.FLOAT\n\t\t}]\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'value',\n\t\t\tdt: E2.dt.FLOAT,\n\t\t\tdesc: 'if trigger is true, will output A + B, otherwise A'\n\t\t}]\n\t}\n\n\tAddOnTriggerFloat.prototype = Object.create(Plugin.prototype)\n\n\tAddOnTriggerFloat.prototype.update_output = function(slot) {\n\t\treturn this.inputValues.trigger ? (this.inputValues.A + this.inputValues.B) : this.inputValues.A\n\t}\n})()"
  },
  {
    "path": "browser/plugins/add_on_trigger_vector3.plugin.js",
    "content": "(function() {\n\tvar AddOnTriggerVector3 = E2.plugins.add_on_trigger_vector3 = function(core, node) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.input_slots = [{\n\t\t\tname: 'trigger',\n\t\t\tdt: E2.dt.BOOL,\n\t\t\tdesc: 'On true, this plugin will output A + B, otherwise A'\n\t\t}, {\n\t\t\tname: 'A',\n\t\t\tdt: E2.dt.VECTOR\n\t\t}, {\n\t\t\tname: 'B',\n\t\t\tdt: E2.dt.VECTOR\n\t\t}]\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'value',\n\t\t\tdt: E2.dt.VECTOR,\n\t\t\tdesc: 'if trigger is true, will output A + B, otherwise A'\n\t\t}]\n\n\t\tthis.value = new THREE.Vector3()\n\t}\n\n\tAddOnTriggerVector3.prototype = Object.create(Plugin.prototype)\n\n\tAddOnTriggerVector3.prototype.update_state = function() {\n\t\tthis.value.copy(this.inputValues.A)\n\n\t\tif (this.inputValues.trigger) {\n\t\t\tthis.value.add(this.inputValues.B)\n\t\t}\n\t}\n\n\tAddOnTriggerVector3.prototype.update_output = function(slot) {\n\t\treturn this.value\n\t}\n})()"
  },
  {
    "path": "browser/plugins/ambisonics/README.txt",
    "content": "————————————————————\n\tArchontis Politis, 7/2017\n\tarchontis.politis@gmail.com\n————————————————————\n\nThe ambisonics.umd.js is the bundled version of the browser-based JSAmbisonics Web Audio library found at https://github.com/polarch/JSAmbisonics. A number of Vizor plugins have ben made to expose the functionality of the library inside Vizor. For more details on Ambisonics, 360-audio, ambisonic panning, ambisonic decoding, etc. please check the documentation of the JSAmbisonics library and the referenced conference publication. For a better understanding on their usage see the Vizor graph examples found in /data/graphs/ambisonics.\n\nThe Vizor plugins at the moment are the following:\n\n\"FOAmbisonic encoder\" [audio_ambisonic_foaencoder.json]:\n\nA first-order ambisonic (FOA) encoder that takes a mono input audio stream along with a prescribed direction, and outputs the resulting 4-channel ambisonic audio stream. The direction should be given as a cartesian vector (unit or not).\n\n\"FOAmbisonic mirror\": [audio_ambisonic_foamirror.json]:\n\nA first-order ambisonic (FOA) mirror that takes a 4-channel ambisonic audio stream (FOA) and is able to mirror its spatialization across the principal planes (xy, yz, zx). Check the “mirror_plane” input slot pop-up for which integer you should pass for each mirror plane.\n\n\"FOAmbisonic converter\": [audio_ambisonic_foaconverter.json]:\n\nAmbisonics have a few different format conventions in practice. JSAmbisonics does all the processing using internally the N3D/ACN convention. However it is useful to be able to convert from one convention to another to handle different material. For example most available 360-audio recordings are in the older FOA format of WXYZ (or also called FuMa). The converter plugin can convert other formats to ACN/N3D. An integer should be passed to the “convention” input slot, with “0” being ACN/N3D (used by MPEG-H), “1” being the traditional WXYZ/FuMA (almost all available recordings), and “2” being the ACN/SN3D (used by the AmbiX format, and Youtube).\n\n\"FOAmbisonic rotator\": [audio_ambisonic_foarotator.json]:\n\nAmbisonics can very efficiently rotate the ambisonic recording, e.g. according to the listener’s head orientation if tracked by a VR device, so that the sound scene stays stable when listening to headphones. That can be done with the rotator plugin, by passing a camera rotation vector to the “rotation” input slot.\n\n\"FOAmbisonic decoder\": [audio_ambisonic_foadecoder.json]:\n\nThis plugin should always go to the end of the chain of ambisonic plugins (encoders, mirrors, rotators etc..) since it converts the ambisonic audio stream to binaural for listening with headphones. Specific filters should be passed to the decoder to do that conversion - some examples are included in /data/audio/ambisonics/filters. These should be passed as an audio buffer in the “buffer” input slot. You can use Vizor’s audio buffer loader plugin for that purpose. The output of the decoder can be connected to the normal stereo audio-out plugin of Vizor.\n\n\"FOAmbisonic virtual mic\": [audio_ambisonic_foavmic.json]:\n\nIn Ambisonics there is a way to create an acoustic focus towards a certain direction, called often a virtual microphone. This plugin does that. It takes an ambisonic 4-channel audio stream and outputs a mono stream, the result of the virtual microphone. Its focusing direction can be controlled, and also its shape. Since FOA are quite low resolution, the effect can be quite subtle. For more aggressive focusing one has to use higher-order Ambisonics, such as the included third-order (TOA) plugins. Its look-direction can be controlled with passing a direction vector (unit or not), and its shape by passing an integer to the “mic_type” input slot (0:cardioid, 1:supercardioid, 2:hypercardioid).\n\n\nThe third-order (TOA) plugins work in exactly the same way as the FOA ones, but they require third-order ambisonic streams of 16-channels, they are heavier and much more sharp in spatial resolution. One problem with the TOA plugins is that both recordings and filters are 16-channels, and the Web-Audio buffer loader messes up multichannel files of that many channels. It seems to work ok with 8-channel files though. So a 16-channel file has to be split up into two 8-channel ones and loaded in two parts. A solution has been provided by the \n\n\"TOAmbisonic buffer merger\": [audio_ambisonic_buffermerger.json]\n\nwhich takes two 8-channel audio buffers, loaded normally with Vizor’s audio buffer loader, and combines them to a 16-channel one. That should be done for example to load a 16channel recording for playback with the decoder plugin, for focusing with the virtual microphone plugin, etc. Also the binaural filters that should be passed to the decoder are also 16-channel ones (examples in /data/audio/ambisonics/filters) and they should be loaded in parts, combined and passed to the decoder. Another important point is that Web Audio messes up the channel order of 8-channel files, if they are in OGG format. There is no problem if they are WAV files, but then size can quickly get out of hand with that many channels and no audio compression. This order issue can be fixed for OGG files if the integer “1” is passed to the “filetype” input slot of the merger plugin (or “0” for WAV files).\n\nThe rest of the TOA plugins are:\n\n\"TOAmbisonic encoder\": \t[audio_ambisonic_toaencoder.json]\n\"TOAmbisonic decoder\": \t[audio_ambisonic_toadecoder.json]\n\"TOAmbisonic rotator\": \t[audio_ambisonic_toarotator.json]\n\"TOAmbisonic mirror\": \t\t[audio_ambisonic_toamirror.json]\n\"TOAmbisonic converter\": \t[audio_ambisonic_toaconverter.json]\n\"TOAmbisonic virtual mic\": \t[audio_ambisonic_toavmic.json]\n\n\n\n\n"
  },
  {
    "path": "browser/plugins/ambisonics/ambisonics.umd.js",
    "content": "(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.ambisonics = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = require('babel-runtime/helpers/createClass');\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n////////////////////////////////////////////////////////////////////\n//  Archontis Politis\n//  archontis.politis@aalto.fi\n//  David Poirier-Quinot\n//  davipoir@ircam.fr\n////////////////////////////////////////////////////////////////////\n//\n//  JSAmbisonics a JavaScript library for higher-order Ambisonics\n//  The library implements Web Audio blocks that perform\n//  typical ambisonic processing operations on audio signals.\n//\n////////////////////////////////////////////////////////////////////\n\n//////////////////////////\n/* HOA BINAURAL DECODER */\n//////////////////////////\n\nvar binDecoder = function () {\n    function binDecoder(audioCtx, order) {\n        (0, _classCallCheck3.default)(this, binDecoder);\n\n\n        this.initialized = false;\n\n        this.ctx = audioCtx;\n        this.order = order;\n        this.nCh = (order + 1) * (order + 1);\n        this.decFilters = new Array(this.nCh);\n        this.decFilterNodes = new Array(this.nCh);\n        // input and output nodes\n        this.in = this.ctx.createChannelSplitter(this.nCh);\n        this.out = this.ctx.createChannelMerger(2);\n        this.out.channelCountMode = 'explicit';\n        this.out.channelCount = 1;\n        // downmixing gains for left and right ears\n        this.gainMid = this.ctx.createGain();\n        this.gainSide = this.ctx.createGain();\n        this.invertSide = this.ctx.createGain();\n        this.gainMid.gain.value = 1;\n        this.gainSide.gain.value = 1;\n        this.invertSide.gain.value = -1;\n        // convolver nodes\n        for (var i = 0; i < this.nCh; i++) {\n            this.decFilterNodes[i] = this.ctx.createConvolver();\n            this.decFilterNodes[i].normalize = false;\n        }\n        // initialize convolvers to plain cardioids\n        this.resetFilters();\n        // create audio connections\n        for (var i = 0; i < this.nCh; i++) {\n            this.in.connect(this.decFilterNodes[i], i, 0);\n            var n = Math.floor(Math.sqrt(i));\n            var m = i - n * n - n;\n            if (m >= 0) this.decFilterNodes[i].connect(this.gainMid);else this.decFilterNodes[i].connect(this.gainSide);\n        }\n        this.gainMid.connect(this.out, 0, 0);\n        this.gainSide.connect(this.out, 0, 0);\n\n        this.gainMid.connect(this.out, 0, 1);\n        this.gainSide.connect(this.invertSide, 0, 0);\n        this.invertSide.connect(this.out, 0, 1);\n\n        this.initialized = true;\n    }\n\n    (0, _createClass3.default)(binDecoder, [{\n        key: 'updateFilters',\n        value: function updateFilters(audioBuffer) {\n            // assign filters to convolvers\n            for (var i = 0; i < this.nCh; i++) {\n                this.decFilters[i] = this.ctx.createBuffer(1, audioBuffer.length, audioBuffer.sampleRate);\n                this.decFilters[i].getChannelData(0).set(audioBuffer.getChannelData(i));\n\n                this.decFilterNodes[i].buffer = this.decFilters[i];\n            }\n        }\n    }, {\n        key: 'resetFilters',\n        value: function resetFilters() {\n            // overwrite decoding filters (plain cardioid virtual microphones)\n            var cardGains = new Array(this.nCh);\n            cardGains.fill(0);\n            cardGains[0] = 0.5;\n            cardGains[1] = 0.5 / Math.sqrt(3);\n            for (var i = 0; i < this.nCh; i++) {\n                // ------------------------------------\n                // This works for Chrome and Firefox:\n                // this.decFilters[i] = this.ctx.createBuffer(1, 1, this.ctx.sampleRate);\n                // this.decFilters[i].getChannelData(0).set([cardGains[i]]);\n                // ------------------------------------\n                // Safari forces us to use this:\n                this.decFilters[i] = this.ctx.createBuffer(1, 64, this.ctx.sampleRate);\n                // and will send gorgeous crancky noise bursts for any value below 64\n                for (var j = 0; j < 64; j++) {\n                    this.decFilters[i].getChannelData(0)[j] = 0.0;\n                }\n                this.decFilters[i].getChannelData(0)[0] = cardGains[i];\n                // ------------------------------------\n                this.decFilterNodes[i].buffer = this.decFilters[i];\n            }\n        }\n    }]);\n    return binDecoder;\n}();\n\nexports.default = binDecoder;\n\n},{\"babel-runtime/helpers/classCallCheck\":19,\"babel-runtime/helpers/createClass\":20}],2:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\nexports.fuma2acn = exports.n3d2sn3d = exports.sn3d2n3d = exports.acn2wxyz = exports.wxyz2acn = undefined;\n\nvar _classCallCheck2 = require(\"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n////////////////////////////////////////////////////////////////////\n//  Archontis Politis\n//  archontis.politis@aalto.fi\n//  David Poirier-Quinot\n//  davipoir@ircam.fr\n////////////////////////////////////////////////////////////////////\n//\n//  JSAmbisonics a JavaScript library for higher-order Ambisonics\n//  The library implements Web Audio blocks that perform\n//  typical ambisonic processing operations on audio signals.\n//\n////////////////////////////////////////////////////////////////////\n\n///////////////////////////////////\n/* FOA B-FORMAT TO ACN/N3D CONVERTER */\n///////////////////////////////////\n\nvar wxyz2acn = exports.wxyz2acn = function wxyz2acn(audioCtx) {\n    (0, _classCallCheck3.default)(this, wxyz2acn);\n\n\n    this.ctx = audioCtx;\n    this.in = this.ctx.createChannelSplitter(4);\n    this.out = this.ctx.createChannelMerger(4);\n    this.gains = new Array(4);\n\n    for (var i = 0; i < 4; i++) {\n        this.gains[i] = this.ctx.createGain();\n        if (i == 0) this.gains[i].gain.value = Math.SQRT2;else this.gains[i].gain.value = Math.sqrt(3);\n\n        this.gains[i].connect(this.out, 0, i);\n    }\n    this.in.connect(this.gains[0], 0, 0);\n    this.in.connect(this.gains[3], 1, 0);\n    this.in.connect(this.gains[1], 2, 0);\n    this.in.connect(this.gains[2], 3, 0);\n};\n\n///////////////////////////////////\n/* ACN/N3D TO FOA B-FORMAT CONVERTER */\n///////////////////////////////////\n\n\nvar acn2wxyz = exports.acn2wxyz = function acn2wxyz(audioCtx) {\n    (0, _classCallCheck3.default)(this, acn2wxyz);\n\n\n    this.ctx = audioCtx;\n    this.in = this.ctx.createChannelSplitter(4);\n    this.out = this.ctx.createChannelMerger(4);\n    this.gains = new Array(4);\n\n    for (var i = 0; i < 4; i++) {\n        this.gains[i] = this.ctx.createGain();\n        if (i == 0) this.gains[i].gain.value = Math.SQRT1_2;else this.gains[i].gain.value = 1 / Math.sqrt(3);\n\n        this.gains[i].connect(this.out, 0, i);\n    }\n    this.in.connect(this.gains[0], 0, 0);\n    this.in.connect(this.gains[2], 1, 0);\n    this.in.connect(this.gains[3], 2, 0);\n    this.in.connect(this.gains[1], 3, 0);\n};\n\n///////////////////////////////////\n/* ACN/SN3D TO ACN/N3D CONVERTER */\n///////////////////////////////////\n\n\nvar sn3d2n3d = exports.sn3d2n3d = function sn3d2n3d(audioCtx, order) {\n    (0, _classCallCheck3.default)(this, sn3d2n3d);\n\n\n    this.ctx = audioCtx;\n    this.order = order;\n    this.nCh = (order + 1) * (order + 1);\n    this.in = this.ctx.createChannelSplitter(this.nCh);\n    this.out = this.ctx.createChannelMerger(this.nCh);\n    this.gains = new Array(this.nCh);\n\n    for (var i = 0; i < this.nCh; i++) {\n        var n = Math.floor(Math.sqrt(i));\n\n        this.gains[i] = this.ctx.createGain();\n        this.gains[i].gain.value = Math.sqrt(2 * n + 1);\n\n        this.in.connect(this.gains[i], i, 0);\n        this.gains[i].connect(this.out, 0, i);\n    }\n};\n\n///////////////////////////////////\n/* ACN/N3D TO ACN/SN3D CONVERTER */\n///////////////////////////////////\n\n\nvar n3d2sn3d = exports.n3d2sn3d = function n3d2sn3d(audioCtx, order) {\n    (0, _classCallCheck3.default)(this, n3d2sn3d);\n\n\n    this.ctx = audioCtx;\n    this.order = order;\n    this.nCh = (order + 1) * (order + 1);\n    this.in = this.ctx.createChannelSplitter(this.nCh);\n    this.out = this.ctx.createChannelMerger(this.nCh);\n    this.gains = new Array(this.nCh);\n\n    for (var i = 0; i < this.nCh; i++) {\n        var n = Math.floor(Math.sqrt(i));\n\n        this.gains[i] = this.ctx.createGain();\n        this.gains[i].gain.value = 1 / Math.sqrt(2 * n + 1);\n\n        this.in.connect(this.gains[i], i, 0);\n        this.gains[i].connect(this.out, 0, i);\n    }\n};\n\n///////////////////////////////\n/* FUMA TO ACN/N3D CONVERTER */\n///////////////////////////////\n\n\nvar fuma2acn = exports.fuma2acn = function fuma2acn(audioCtx, order) {\n    (0, _classCallCheck3.default)(this, fuma2acn);\n\n\n    if (order > 3) {\n        console.log(\"FuMa specifiction is supported up to 3rd order\");\n        order = 3;\n    }\n\n    // re-mapping indices from FuMa channels to ACN\n    // var index_fuma2acn = [0, 2, 3, 1, 8, 6, 4, 5, 7, 15, 13, 11, 9, 10, 12, 14];\n    // //                    W  Y  Z  X  V  T  R  S  U  Q   O   M   K  L   N   P\n\n    // gains for each FuMa channel to N3D, after re-mapping channels\n    var gains_fuma2n3d = [Math.sqrt(2), // W\n    Math.sqrt(3), // Y\n    Math.sqrt(3), // Z\n    Math.sqrt(3), // X\n    Math.sqrt(15) / 2, // V\n    Math.sqrt(15) / 2, // T\n    Math.sqrt(5), // R\n    Math.sqrt(15) / 2, // S\n    Math.sqrt(15) / 2, // U\n    Math.sqrt(35 / 8), // Q\n    Math.sqrt(35) / 3, // O\n    Math.sqrt(224 / 45), // M\n    Math.sqrt(7), // K\n    Math.sqrt(224 / 45), // L\n    Math.sqrt(35) / 3, // N\n    Math.sqrt(35 / 8)]; // P\n\n    this.ctx = audioCtx;\n    this.order = order;\n    this.nCh = (order + 1) * (order + 1);\n    this.in = this.ctx.createChannelSplitter(this.nCh);\n    this.out = this.ctx.createChannelMerger(this.nCh);\n    this.gains = [];\n    this.remapArray = [];\n\n    // get channel remapping values order 0-1\n    this.remapArray.push(0, 2, 3, 1); // manually handle until order 1\n\n    // get channel remapping values order 2-N\n    if (order > 1) {\n        var o = 0;\n        var m;\n        for (var i = 0; i < this.nCh; i++) {\n            m = [];\n            if (i >= (o + 1) * (o + 1)) {\n                o += 1;\n                for (var j = (o + 1) * (o + 1); j < (o + 2) * (o + 2); j++) {\n                    if ((j + o % 2) % 2 == 0) {\n                        m.push(j);\n                    } else {\n                        m.unshift(j);\n                    }\n                }\n                this.remapArray = this.remapArray.concat(m);\n            }\n        }\n    }\n\n    // connect inputs/outputs (kept separated for clarity's sake)\n    for (var i = 0; i < this.nCh; i++) {\n        this.gains[i] = this.ctx.createGain();\n        this.gains[i].gain.value = gains_fuma2n3d[i];\n        this.in.connect(this.gains[i], this.remapArray[i], 0);\n        this.gains[i].connect(this.out, 0, i);\n    }\n};\n\n},{\"babel-runtime/helpers/classCallCheck\":19}],3:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _classCallCheck2 = require(\"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = require(\"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n////////////////////////////////////////////////////////////////////\n//  Archontis Politis\n//  archontis.politis@aalto.fi\n//  David Poirier-Quinot\n//  davipoir@ircam.fr\n////////////////////////////////////////////////////////////////////\n//\n//  JSAmbisonics a JavaScript library for higher-order Ambisonics\n//  The library implements Web Audio blocks that perform\n//  typical ambisonic processing operations on audio signals.\n//\n////////////////////////////////////////////////////////////////////\n\n///////////////////////////\n/* HOA AMBISONIC DECODER */\n///////////////////////////\n\nvar utils = require(\"./utils.js\");\n\nvar decoder = function () {\n    function decoder(audioCtx, order) {\n        (0, _classCallCheck3.default)(this, decoder);\n\n\n        // locals\n        this.ctx = audioCtx;\n        this.order = order;\n        this.nCh = (order + 1) * (order + 1);\n        this.nSpk = 0;\n        this._decodingMatrix = [];\n        this._spkSphPosArray = [];\n\n        // Input and output nodes\n        this.in = this.ctx.createChannelSplitter(this.nCh);\n        this.out = this.ctx.createChannelMerger(1); // dummy\n\n        // dummy init array\n        this._spkSphPosArray = this._getDefaultSpkConfig(this.order);\n        this._updateDecodeMtx(this._spkSphPosArray);\n    }\n\n    // spkSphPosArray in spherical coordinates: [ [azim1, elev1, dist1], ... [azimN, elevN, distN] ]\n\n\n    (0, _createClass3.default)(decoder, [{\n        key: \"_updateDecodeMtx\",\n\n\n        // internal method to calculate Ambisonic decoding matrix and define new ambisonic gain nodes and values\n        value: function _updateDecodeMtx(spkSphPosArray) {\n\n            // update output\n            this.nSpk = spkSphPosArray.length;\n            this.out = this.ctx.createChannelMerger(this.nSpk);\n\n            // get decoding matrix\n            this._decodingMatrix = utils.getAmbisonicDecMtx(spkSphPosArray, this.order);\n\n            // assign ambisonic gains to gain matrix + connect new graph\n            this.mtxGain = new Array(this.nCh);\n            for (var i = 0; i < this.nCh; i++) {\n                this.mtxGain[i] = new Array(this.nSpk);\n                for (var j = 0; j < this.nSpk; j++) {\n                    // create / setup gain\n                    var g = this.ctx.createGain();\n                    g.gain.value = this._decodingMatrix[j][i];\n                    // connect graph\n                    this.in.connect(g, i, 0);\n                    g.connect(this.out, 0, j);\n                    // save to local\n                    this.mtxGain[i][j] = g;\n                }\n            }\n        }\n\n        // get default speaker configuration for orders 1, 2, 3\n\n    }, {\n        key: \"_getDefaultSpkConfig\",\n        value: function _getDefaultSpkConfig(order) {\n            var spkSphPosArray = [];\n            switch (order) {\n                case 1:\n                    // default first order: octahedron\n                    spkSphPosArray = [[0, 0, 1], [90, 0, 1], [180, 0, 1], [270, 0, 1], [0, 90, 1], [0, -90, 1]];\n                    break;\n                case 2:\n                    // default second order: icosahedron\n                    spkSphPosArray = [[180.0000, -31.7161, 0.5878], [180.0000, 31.7161, 0.5878], [-121.7161, 0, 0.5878], [121.7161, 0, 0.5878], [-90.0000, -58.2839, 0.5878], [-90.0000, 58.2839, 0.5878], [90.0000, -58.2839, 0.5878], [90.0000, 58.2839, 0.5878], [-58.2839, 0, 0.5878], [58.2839, 0, 0.5878], [0, -31.7161, 0.5878], [0, 31.7161, 0.5878]];\n                    break;\n                case 3:\n                    // default third order: dodecahedron\n                    spkSphPosArray = [[-159.0931, 0, 0.5352], [159.0931, 0, 0.5352], [-135.0000, -35.2644, 0.5352], [-135.0000, 35.2644, 0.5352], [135.0000, -35.2644, 0.5352], [135.0000, 35.2644, 0.5352], [180.0000, -69.0931, 0.5352], [180.0000, 69.0931, 0.5352], [-90.0000, -20.9069, 0.5352], [-90.0000, 20.9069, 0.5352], [90.0000, -20.9069, 0.5352], [90.0000, 20.9069, 0.5352], [0, -69.0931, 0.5352], [0, 69.0931, 0.5352], [-45.0000, -35.2644, 0.5352], [-45.0000, 35.2644, 0.5352], [45.0000, -35.2644, 0.5352], [45.0000, 35.2644, 0.5352], [-20.9069, 0, 0.5352], [20.9069, 0, 0.5352]];\n                    break;\n                default:\n                    console.error(\"unsupported default order:\", order);\n            }\n            return spkSphPosArray;\n        }\n    }, {\n        key: \"speakerPos\",\n        set: function set(spkSphPosArray) {\n            // set default array\n            if (spkSphPosArray === undefined) {\n                spkSphPosArray = this._getDefaultSpkConfig(this.order);\n            }\n            this._spkSphPosArray = spkSphPosArray;\n            // discard old output\n            this.out.disconnect();\n            // update output / decode matrix\n            this._updateDecodeMtx(spkSphPosArray);\n        },\n        get: function get() {\n            return this._spkSphPosArray;\n        }\n    }]);\n    return decoder;\n}();\n\nexports.default = decoder;\n\n},{\"./utils.js\":17,\"babel-runtime/helpers/classCallCheck\":19,\"babel-runtime/helpers/createClass\":20}],4:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = require('babel-runtime/helpers/createClass');\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nrequire('get-float-time-domain-data');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar intensityAnalyser = function () {\n    function intensityAnalyser(audioCtx) {\n        (0, _classCallCheck3.default)(this, intensityAnalyser);\n\n\n        this.ctx = audioCtx;\n        this.fftSize = 2048;\n        // Input and output nodes\n        this.in = this.ctx.createChannelSplitter(4);\n        this.out = this.ctx.createChannelMerger(4);\n        // Gains to go from ACN/N3D to pressure-velocity (WXYZ)\n        this.gains = new Array(3);\n        for (var i = 0; i < 3; i++) {\n            this.gains[i] = this.ctx.createGain();\n            this.gains[i].gain.value = 1 / Math.sqrt(3);\n        }\n        // Initialize analyzer buffers\n        this.analysers = new Array(4);\n        this.analBuffers = new Array(4);\n        for (i = 0; i < 4; i++) {\n            this.analysers[i] = this.ctx.createAnalyser();\n            this.analysers[i].fftSize = this.fftSize;\n            this.analysers[i].smoothingTimeConstant = 0;\n            this.analBuffers[i] = new Float32Array(this.fftSize);\n        }\n        // Create connections\n        this.in.connect(this.out, 0, 0);\n        this.in.connect(this.analysers[0], 0, 0);\n\n        this.in.connect(this.gains[1], 1, 0);\n        this.in.connect(this.gains[2], 2, 0);\n        this.in.connect(this.gains[0], 3, 0);\n        for (i = 0; i < 3; i++) {\n            this.gains[i].connect(this.analysers[i + 1], 0, 0);\n            this.gains[i].connect(this.out, 0, i + 1);\n        }\n    }\n\n    (0, _createClass3.default)(intensityAnalyser, [{\n        key: 'updateBuffers',\n        value: function updateBuffers() {\n            // Get latest time-domain data\n            for (var i = 0; i < 4; i++) {\n                this.analysers[i].getFloatTimeDomainData(this.analBuffers[i]);\n            }\n        }\n    }, {\n        key: 'computeIntensity',\n        value: function computeIntensity() {\n            // Compute correlations and energies of channels\n            var iX = 0;\n            var iY = 0;\n            var iZ = 0;\n            var WW = 0;\n            var XX = 0;\n            var YY = 0;\n            var ZZ = 0;\n            var I, I_norm, E, Psi, azim, elev;\n            // Accumulators for correlations and energies\n            for (var i = 0; i < this.fftSize; i++) {\n\n                iX = iX + this.analBuffers[0][i] * this.analBuffers[1][i];\n                iY = iY + this.analBuffers[0][i] * this.analBuffers[2][i];\n                iZ = iZ + this.analBuffers[0][i] * this.analBuffers[3][i];\n                WW = WW + this.analBuffers[0][i] * this.analBuffers[0][i];\n                XX = XX + this.analBuffers[1][i] * this.analBuffers[1][i];\n                YY = YY + this.analBuffers[2][i] * this.analBuffers[2][i];\n                ZZ = ZZ + this.analBuffers[3][i] * this.analBuffers[3][i];\n            }\n            I = [iX, iY, iZ]; // intensity\n            I_norm = Math.sqrt(I[0] * I[0] + I[1] * I[1] + I[2] * I[2]); // intensity magnitude\n            E = (WW + XX + YY + ZZ) / 2; // energy\n            Psi = 1 - I_norm / (E + 10e-8); // diffuseness\n            azim = Math.atan2(iY, iX) * 180 / Math.PI;\n            elev = Math.atan2(I[2], Math.sqrt(I[0] * I[0] + I[1] * I[1])) * 180 / Math.PI;\n\n            var params = [azim, elev, Psi, E];\n            return params;\n        }\n    }]);\n    return intensityAnalyser;\n}(); ////////////////////////////////////////////////////////////////////\n//  Archontis Politis\n//  archontis.politis@aalto.fi\n//  David Poirier-Quinot\n//  davipoir@ircam.fr\n////////////////////////////////////////////////////////////////////\n//\n//  JSAmbisonics a JavaScript library for higher-order Ambisonics\n//  The library implements Web Audio blocks that perform\n//  typical ambisonic processing operations on audio signals.\n//\n////////////////////////////////////////////////////////////////////\n\n//////////////////////////////////////////\n/* PRESSURE-VELOCITY INTENSITY ANALYZER */\n//////////////////////////////////////////\n\n// for Safari support where audioContext.Analyser.getFloatTimeDomainData is not defined for now\n\n\nexports.default = intensityAnalyser;\n\n},{\"babel-runtime/helpers/classCallCheck\":19,\"babel-runtime/helpers/createClass\":20,\"get-float-time-domain-data\":66}],5:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = require('babel-runtime/helpers/createClass');\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nvar _sphericalHarmonicTransform = require('spherical-harmonic-transform');\n\nvar jshlib = _interopRequireWildcard(_sphericalHarmonicTransform);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar monoEncoder = function () {\n    function monoEncoder(audioCtx, order) {\n        (0, _classCallCheck3.default)(this, monoEncoder);\n\n\n        this.initialized = false;\n\n        this.ctx = audioCtx;\n        this.order = order;\n        this.nCh = (order + 1) * (order + 1);\n        this.azim = 0;\n        this.elev = 0;\n        this.gains = new Array(this.nCh);\n        this.gainNodes = new Array(this.nCh);\n        this.in = this.ctx.createGain();\n        this.in.channelCountMode = 'explicit';\n        this.in.channelCount = 1;\n        this.out = this.ctx.createChannelMerger(this.nCh);\n        // Initialize encoding gains\n        for (var i = 0; i < this.nCh; i++) {\n            this.gainNodes[i] = this.ctx.createGain();\n            this.gainNodes[i].channelCountMode = 'explicit';\n            this.gainNodes[i].channelCount = 1;\n        }\n        this.updateGains();\n        // Make audio connections\n        for (var i = 0; i < this.nCh; i++) {\n            this.in.connect(this.gainNodes[i]);\n            this.gainNodes[i].connect(this.out, 0, i);\n        }\n\n        this.initialized = true;\n    }\n\n    (0, _createClass3.default)(monoEncoder, [{\n        key: 'updateGains',\n        value: function updateGains() {\n            var N = this.order;\n            var g_enc = jshlib.computeRealSH(N, [[this.azim * Math.PI / 180, this.elev * Math.PI / 180]]);\n\n            for (var i = 0; i < this.nCh; i++) {\n                this.gains[i] = g_enc[i][0];\n                this.gainNodes[i].gain.value = this.gains[i];\n            }\n        }\n    }]);\n    return monoEncoder;\n}(); ////////////////////////////////////////////////////////////////////\n//  Archontis Politis\n//  archontis.politis@aalto.fi\n//  David Poirier-Quinot\n//  davipoir@ircam.fr\n////////////////////////////////////////////////////////////////////\n//\n//  JSAmbisonics a JavaScript library for higher-order Ambisonics\n//  The library implements Web Audio blocks that perform\n//  typical ambisonic processing operations on audio signals.\n//\n////////////////////////////////////////////////////////////////////\n\n/////////////////\n/* HOA ENCODER */\n/////////////////\n\nexports.default = monoEncoder;\n\n},{\"babel-runtime/helpers/classCallCheck\":19,\"babel-runtime/helpers/createClass\":20,\"spherical-harmonic-transform\":98}],6:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _classCallCheck2 = require(\"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = require(\"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n////////////////////////////////////////////////////////////////////\n//  Archontis Politis\n//  archontis.politis@aalto.fi\n//  David Poirier-Quinot\n//  davipoir@ircam.fr\n////////////////////////////////////////////////////////////////////\n//\n//  JSAmbisonics a JavaScript library for higher-order Ambisonics\n//  The library implements Web Audio blocks that perform\n//  typical ambisonic processing operations on audio signals.\n//\n////////////////////////////////////////////////////////////////////\n\n///////////////////////\n/* HOA ORDER LIMITER */\n///////////////////////\n\nvar orderLimiter = function () {\n    function orderLimiter(audioCtx, orderIn, orderOut) {\n        (0, _classCallCheck3.default)(this, orderLimiter);\n\n\n        this.ctx = audioCtx;\n        this.orderIn = orderIn;\n        if (orderOut < orderIn) this.orderOut = orderOut;else this.orderOut = orderIn;\n\n        this.nChIn = (this.orderIn + 1) * (this.orderIn + 1);\n        this.nChOut = (this.orderOut + 1) * (this.orderOut + 1);\n        this.in = this.ctx.createChannelSplitter(this.nChIn);\n        this.out = this.ctx.createChannelMerger(this.nChOut);\n\n        for (var i = 0; i < this.nChOut; i++) {\n            this.in.connect(this.out, i, i);\n        }\n    }\n\n    (0, _createClass3.default)(orderLimiter, [{\n        key: \"updateOrder\",\n        value: function updateOrder(orderOut) {\n\n            if (orderOut <= this.orderIn) {\n                this.orderOut = orderOut;\n            } else return;\n\n            this.nChOut = (this.orderOut + 1) * (this.orderOut + 1);\n            this.out.disconnect();\n            this.out = this.ctx.createChannelMerger(this.nChOut);\n\n            for (var i = 0; i < this.nChOut; i++) {\n                this.in.connect(this.out, i, i);\n            }\n        }\n    }]);\n    return orderLimiter;\n}();\n\nexports.default = orderLimiter;\n\n},{\"babel-runtime/helpers/classCallCheck\":19,\"babel-runtime/helpers/createClass\":20}],7:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = require('babel-runtime/helpers/createClass');\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nvar _sphericalHarmonicTransform = require('spherical-harmonic-transform');\n\nvar jshlib = _interopRequireWildcard(_sphericalHarmonicTransform);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar orderWeight = function () {\n    function orderWeight(audioCtx, order) {\n        (0, _classCallCheck3.default)(this, orderWeight);\n\n\n        this.ctx = audioCtx;\n        this.order = order;\n\n        this.nCh = (this.order + 1) * (this.order + 1);\n        this.in = this.ctx.createChannelSplitter(this.nCh);\n        this.out = this.ctx.createChannelMerger(this.nCh);\n\n        this.gains = new Array(this.nCh);\n        this.orderGains = new Array(this.order + 1);\n        this.orderGains.fill(1);\n\n        // initialize gains and connections\n        for (var i = 0; i < this.nCh; i++) {\n            this.gains[i] = this.ctx.createGain();\n\n            this.in.connect(this.gains[i], i, 0);\n            this.gains[i].connect(this.out, 0, i);\n        }\n    }\n\n    (0, _createClass3.default)(orderWeight, [{\n        key: 'updateOrderGains',\n        value: function updateOrderGains() {\n\n            var n;\n            for (var i = 0; i < this.nCh; i++) {\n\n                n = Math.floor(Math.sqrt(i));\n                this.gains[i].gain.value = this.orderGains[n];\n            }\n        }\n    }, {\n        key: 'computeMaxRECoeffs',\n        value: function computeMaxRECoeffs() {\n\n            var N = this.order;\n            this.orderGains[0] = 1;\n            var leg_n_minus1 = 0;\n            var leg_n_minus2 = 0;\n            var leg_n = 0;\n            for (var n = 1; n <= N; n++) {\n                leg_n = jshlib.recurseLegendrePoly(n, [Math.cos(2.406809 / (N + 1.51))], leg_n_minus1, leg_n_minus2);\n                this.orderGains[n] = leg_n[0][0];\n\n                leg_n_minus2 = leg_n_minus1;\n                leg_n_minus1 = leg_n;\n            }\n        }\n    }]);\n    return orderWeight;\n}(); ////////////////////////////////////////////////////////////////////\n//  Archontis Politis\n//  archontis.politis@aalto.fi\n//  David Poirier-Quinot\n//  davipoir@ircam.fr\n////////////////////////////////////////////////////////////////////\n//\n//  JSAmbisonics a JavaScript library for higher-order Ambisonics\n//  The library implements Web Audio blocks that perform\n//  typical ambisonic processing operations on audio signals.\n//\n////////////////////////////////////////////////////////////////////\n\n/////////////////////////\n/* HOA ORDER WEIGHTING */\n/////////////////////////\n\nexports.default = orderWeight;\n\n},{\"babel-runtime/helpers/classCallCheck\":19,\"babel-runtime/helpers/createClass\":20,\"spherical-harmonic-transform\":98}],8:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = require('babel-runtime/helpers/createClass');\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nrequire('get-float-time-domain-data');\n\nvar _numeric = require('numeric');\n\nvar numeric = _interopRequireWildcard(_numeric);\n\nvar _sphericalHarmonicTransform = require('spherical-harmonic-transform');\n\nvar jshlib = _interopRequireWildcard(_sphericalHarmonicTransform);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar utils = require('./utils.js'); ////////////////////////////////////////////////////////////////////\n//  Archontis Politis\n//  archontis.politis@aalto.fi\n//  David Poirier-Quinot\n//  davipoir@ircam.fr\n////////////////////////////////////////////////////////////////////\n//\n//  JSAmbisonics a JavaScript library for higher-order Ambisonics\n//  The library implements Web Audio blocks that perform\n//  typical ambisonic processing operations on audio signals.\n//\n////////////////////////////////////////////////////////////////////\n\n/////////////////////////////////\n/* HOA POWERMAP ANALYZER */\n/////////////////////////////////\n\n////// NOT COMPLETED YET !!! ///////\n\n// for Safari support where audioContext.Analyser.getFloatTimeDomainData is not defined for now\n\n\nvar powermapAnalyser = function () {\n    function powermapAnalyser(audioCtx, order, mode) {\n        (0, _classCallCheck3.default)(this, powermapAnalyser);\n\n\n        this.ctx = audioCtx;\n        this.order = order;\n        this.nCh = (order + 1) * (order + 1);\n        this.fftSize = 2048;\n        this.analysers = new Array(this.nCh);\n        this.analBuffers = new Array(this.nCh);\n        // Input and output nodes\n        this.in = this.ctx.createChannelSplitter(this.nCh);\n        this.out = this.ctx.createChannelMerger(this.nCh);\n        // Initialize analyzer buffers\n        for (var i = 0; i < this.nCh; i++) {\n            this.analysers[i] = this.ctx.createAnalyser();\n            this.analysers[i].fftSize = this.fftSize;\n            this.analysers[i].smoothingTimeConstant = 0;\n            this.analBuffers[i] = new Float32Array(this.fftSize);\n        }\n        // Create connections\n        for (var _i = 0; _i < this.nCh; _i++) {\n            this.in.connect(this.out, _i, _i);\n            this.in.connect(this.analysers[_i], _i, 0);\n        }\n\n        // Initialise t-Design for power map\n        var td_dirs_deg = utils.getTdesign(4 * order);\n        this.td_dirs_rad = utils.deg2rad(td_dirs_deg);\n        // SH sampling matrix\n        this.SHmtx = jshlib.computeRealSH(this.order, this.td_dirs_rad);\n        this.mode = mode;\n        //        this.nCoeffs = (2*this.order+1)*(2*this.order+1)\n        //        this.powerCoeffs = new Array( this.nCoeffs );\n        //        this.powerCoeffs.fill(0);\n        //        // Smoothing coefficient\n        //        this.smoothCoeff = 0.5;\n    }\n\n    (0, _createClass3.default)(powermapAnalyser, [{\n        key: 'updateBuffers',\n        value: function updateBuffers() {\n            // Get latest time-domain data\n            for (var i = 0; i < this.nCh; i++) {\n                this.analysers[i].getFloatTimeDomainData(this.analBuffers[i]);\n            }\n        }\n    }, {\n        key: 'computePowermap',\n        value: function computePowermap() {\n\n            var nDirs = this.td_dirs_rad.length;\n            // reconstruction\n            var data = numeric.dot(numeric.transpose(this.SHmtx), this.analBuffers);\n            // compute directional power\n            var powerValues = new Array(nDirs);\n            // Accumulators for energies\n            for (var i = 0; i < nDirs; i++) {\n                for (var n = 0; n < this.fftSize; n++) {\n                    var tmp_pwr = 0;\n                    tmp_pwr = tmp_pwr + data[i][n] * data[i][n];\n                }\n                var tmp_pwr = tmp_pwr / this.fftSize;\n                powerValues[i] = [this.td_dirs_rad[i][0], this.td_dirs_rad[i][1], tmp_pwr];\n            }\n\n            if (this.mode == 0) return powerValues;else if (this.mode == 1) {\n                // Re-encode directional energy to SH coefficients\n                var powerCoeffs = jshlib.forwardSHT(2 * this.order, powerValues);\n                return powerCoeffs;\n            }\n\n            //        // Smooth coefficients\n            //        for (var i = 0; i < this.nCoeffs; i++) this.powerCoeffs[i] = this.smoothCoeff*this.powerCoeffs[i] + (1-this.smoothCoeff)*powerCoeffs[i];\n            //       \n            //        return this.powerCoeffs;\n        }\n    }]);\n    return powermapAnalyser;\n}();\n\nexports.default = powermapAnalyser;\n\n},{\"./utils.js\":17,\"babel-runtime/helpers/classCallCheck\":19,\"babel-runtime/helpers/createClass\":20,\"get-float-time-domain-data\":66,\"numeric\":67,\"spherical-harmonic-transform\":98}],9:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = require('babel-runtime/helpers/createClass');\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nrequire('get-float-time-domain-data');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar rmsAnalyser = function () {\n    function rmsAnalyser(audioCtx, order) {\n        (0, _classCallCheck3.default)(this, rmsAnalyser);\n\n\n        this.ctx = audioCtx;\n        this.order = order;\n        this.nCh = (order + 1) * (order + 1);\n        this.fftSize = 2048;\n        // Input and output nodes\n        this.in = this.ctx.createChannelSplitter(this.nCh);\n        this.out = this.ctx.createChannelMerger(this.nCh);\n        // Initialize analyzer buffers\n        this.analysers = new Array(this.nCh);\n        this.analBuffers = new Array(this.nCh);\n        for (var i = 0; i < this.nCh; i++) {\n            this.analysers[i] = this.ctx.createAnalyser();\n            this.analysers[i].fftSize = this.fftSize;\n            this.analysers[i].smoothingTimeConstant = 0;\n            this.analBuffers[i] = new Float32Array(this.fftSize);\n            // Create connections\n            this.in.connect(this.analysers[i], i, 0);\n            this.analysers[i].connect(this.out, 0, i);\n        }\n    }\n\n    (0, _createClass3.default)(rmsAnalyser, [{\n        key: 'updateBuffers',\n        value: function updateBuffers() {\n            // Get latest time-domain data\n            for (var i = 0; i < this.nCh; i++) {\n                this.analysers[i].getFloatTimeDomainData(this.analBuffers[i]);\n            }\n        }\n    }, {\n        key: 'computeRMS',\n        value: function computeRMS() {\n\n            var rms_values = new Array(this.nCh);\n            rms_values.fill(0);\n            // Accumulators for energies\n            for (var i = 0; i < this.nCh; i++) {\n                for (var n = 0; n < this.fftSize; n++) {\n                    rms_values[i] = rms_values[i] + this.analBuffers[i][n] * this.analBuffers[i][n];\n                }\n                rms_values[i] = Math.sqrt(rms_values[i] / this.fftSize);\n            }\n            return rms_values;\n        }\n    }]);\n    return rmsAnalyser;\n}(); ////////////////////////////////////////////////////////////////////\n//  Archontis Politis\n//  archontis.politis@aalto.fi\n//  David Poirier-Quinot\n//  davipoir@ircam.fr\n////////////////////////////////////////////////////////////////////\n//\n//  JSAmbisonics a JavaScript library for higher-order Ambisonics\n//  The library implements Web Audio blocks that perform\n//  typical ambisonic processing operations on audio signals.\n//\n////////////////////////////////////////////////////////////////////\n\n//////////////////////////////////////////\n/* RMS AMPLITUDE ANALYZER */\n//////////////////////////////////////////\n\n// for Safari support where audioContext.Analyser.getFloatTimeDomainData is not defined for now\n\n\nexports.default = rmsAnalyser;\n\n},{\"babel-runtime/helpers/classCallCheck\":19,\"babel-runtime/helpers/createClass\":20,\"get-float-time-domain-data\":66}],10:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _classCallCheck2 = require(\"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = require(\"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n////////////////////////////////////////////////////////////////////\n//  Archontis Politis\n//  archontis.politis@aalto.fi\n//  David Poirier-Quinot\n//  davipoir@ircam.fr\n////////////////////////////////////////////////////////////////////\n//\n//  JSAmbisonics a JavaScript library for higher-order Ambisonics\n//  The library implements Web Audio blocks that perform\n//  typical ambisonic processing operations on audio signals.\n//\n////////////////////////////////////////////////////////////////////\n\n/////////////////\n/* HOA MIRROR */\n/////////////////\n\nvar sceneMirror = function () {\n    function sceneMirror(audioCtx, order) {\n        (0, _classCallCheck3.default)(this, sceneMirror);\n\n\n        this.ctx = audioCtx;\n        this.order = order;\n        this.nCh = (order + 1) * (order + 1);\n        this.mirrorPlane = 0;\n        // Input and output nodes\n        this.in = this.ctx.createChannelSplitter(this.nCh);\n        this.out = this.ctx.createChannelMerger(this.nCh);\n        // Initialize mirroring gains to unity (no reflection) and connect\n        this.gains = new Array(this.nCh);\n        for (var q = 0; q < this.nCh; q++) {\n            this.gains[q] = this.ctx.createGain();\n            this.gains[q].gain.value = 1;\n            // Create connections\n            this.in.connect(this.gains[q], q, 0);\n            this.gains[q].connect(this.out, 0, q);\n        }\n    }\n\n    (0, _createClass3.default)(sceneMirror, [{\n        key: \"reset\",\n        value: function reset() {\n\n            for (var q = 0; q < this.nCh; q++) {\n                this.gains[q].gain.value = 1;\n            }\n        }\n    }, {\n        key: \"mirror\",\n        value: function mirror(planeNo) {\n\n            switch (planeNo) {\n                case 0:\n                    this.mirrorPlane = 0;\n                    this.reset();\n                    break;\n                case 1:\n                    // mirroring on yz-plane (front-back)\n                    this.reset();\n                    this.mirrorPlane = 1;\n                    var q;\n                    for (var n = 0; n <= this.order; n++) {\n                        for (var m = -n; m <= n; m++) {\n                            q = n * n + n + m;\n                            if (m < 0 && m % 2 == 0 || m > 0 && m % 2 == 1) this.gains[q].gain.value = -1;\n                        }\n                    }\n                    break;\n                case 2:\n                    // mirroring on xz-plane (left-right)\n                    this.reset();\n                    this.mirrorPlane = 2;\n                    var q;\n                    for (var n = 0; n <= this.order; n++) {\n                        for (var m = -n; m <= n; m++) {\n                            q = n * n + n + m;\n                            if (m < 0) this.gains[q].gain.value = -1;\n                        }\n                    }\n                    break;\n                case 3:\n                    // mirroring on xy-plane (up-down)\n                    this.reset();\n                    this.mirrorPlane = 3;\n                    var q;\n                    for (var n = 0; n <= this.order; n++) {\n                        for (var m = -n; m <= n; m++) {\n                            q = n * n + n + m;\n                            if ((m + n) % 2 == 1) this.gains[q].gain.value = -1;\n                        }\n                    }\n                    break;\n                default:\n                    console.log(\"The mirroring planes can be either 1 (yz), 2 (xz), 3 (xy), or 0 (no mirroring). Value set to 0.\");\n                    this.mirrorPlane = 0;\n                    this.reset();\n            }\n        }\n    }]);\n    return sceneMirror;\n}();\n\nexports.default = sceneMirror;\n\n},{\"babel-runtime/helpers/classCallCheck\":19,\"babel-runtime/helpers/createClass\":20}],11:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = require('babel-runtime/helpers/createClass');\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nvar _sphericalHarmonicTransform = require('spherical-harmonic-transform');\n\nvar jshlib = _interopRequireWildcard(_sphericalHarmonicTransform);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar sceneRotator = function () {\n    function sceneRotator(audioCtx, order) {\n        (0, _classCallCheck3.default)(this, sceneRotator);\n\n\n        this.ctx = audioCtx;\n        this.order = order;\n        this.nCh = (order + 1) * (order + 1);\n        this.yaw = 0;\n        this.pitch = 0;\n        this.roll = 0;\n        this.rotMtx = numeric.identity(this.nCh);\n        this.rotMtxNodes = new Array(this.order);\n        // Input and output nodes\n        this.in = this.ctx.createChannelSplitter(this.nCh);\n        this.out = this.ctx.createChannelMerger(this.nCh);\n\n        // Initialize rotation gains to identity matrix\n        for (var n = 1; n <= this.order; n++) {\n\n            var gains_n = new Array(2 * n + 1);\n            for (var i = 0; i < 2 * n + 1; i++) {\n                gains_n[i] = new Array(2 * n + 1);\n                for (var j = 0; j < 2 * n + 1; j++) {\n                    gains_n[i][j] = this.ctx.createGain();\n                    if (i == j) gains_n[i][j].gain.value = 1;else gains_n[i][j].gain.value = 0;\n                }\n            }\n            this.rotMtxNodes[n - 1] = gains_n;\n        }\n\n        // Create connections\n        this.in.connect(this.out, 0, 0); // zeroth order ch. does not rotate\n\n        var band_idx = 1;\n        for (n = 1; n <= this.order; n++) {\n            for (i = 0; i < 2 * n + 1; i++) {\n                for (j = 0; j < 2 * n + 1; j++) {\n                    this.in.connect(this.rotMtxNodes[n - 1][i][j], band_idx + j, 0);\n                    this.rotMtxNodes[n - 1][i][j].connect(this.out, 0, band_idx + i);\n                }\n            }\n            band_idx = band_idx + 2 * n + 1;\n        }\n    }\n\n    (0, _createClass3.default)(sceneRotator, [{\n        key: 'updateRotMtx',\n        value: function updateRotMtx() {\n\n            var yaw = this.yaw * Math.PI / 180;\n            var pitch = this.pitch * Math.PI / 180;\n            var roll = this.roll * Math.PI / 180;\n\n            this.rotMtx = jshlib.getSHrotMtx(jshlib.yawPitchRoll2Rzyx(yaw, pitch, roll), this.order);\n\n            var band_idx = 1;\n            for (var n = 1; n < this.order + 1; n++) {\n\n                for (var i = 0; i < 2 * n + 1; i++) {\n                    for (var j = 0; j < 2 * n + 1; j++) {\n                        this.rotMtxNodes[n - 1][i][j].gain.value = this.rotMtx[band_idx + i][band_idx + j];\n                    }\n                }\n                band_idx = band_idx + 2 * n + 1;\n            }\n        }\n    }]);\n    return sceneRotator;\n}(); ////////////////////////////////////////////////////////////////////\n//  Archontis Politis\n//  archontis.politis@aalto.fi\n//  David Poirier-Quinot\n//  davipoir@ircam.fr\n////////////////////////////////////////////////////////////////////\n//\n//  JSAmbisonics a JavaScript library for higher-order Ambisonics\n//  The library implements Web Audio blocks that perform\n//  typical ambisonic processing operations on audio signals.\n//\n////////////////////////////////////////////////////////////////////\n\n/////////////////\n/* HOA ROTATOR */\n/////////////////\n\nexports.default = sceneRotator;\n\n},{\"babel-runtime/helpers/classCallCheck\":19,\"babel-runtime/helpers/createClass\":20,\"spherical-harmonic-transform\":98}],12:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _classCallCheck2 = require(\"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = require(\"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nvar _sphericalHarmonicTransform = require(\"spherical-harmonic-transform\");\n\nvar jshlib = _interopRequireWildcard(_sphericalHarmonicTransform);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar virtualMic = function () {\n    function virtualMic(audioCtx, order) {\n        (0, _classCallCheck3.default)(this, virtualMic);\n\n\n        this.initialized = false;\n\n        this.ctx = audioCtx;\n        this.order = order;\n        this.nCh = (order + 1) * (order + 1);\n        this.azim = 0;\n        this.elev = 0;\n        this.vmicGains = new Array(this.nCh);\n        this.vmicGainNodes = new Array(this.nCh);\n        this.vmicCoeffs = new Array(this.order + 1);\n        this.vmicPattern = \"hypercardioid\";\n        this.in = this.ctx.createChannelSplitter(this.nCh);\n        this.out = this.ctx.createGain();\n\n        // Initialize vmic to forward facing hypercardioid\n        for (var i = 0; i < this.nCh; i++) {\n            this.vmicGainNodes[i] = this.ctx.createGain();\n        }\n        this.SHxyz = new Array(this.nCh);\n        this.SHxyz.fill(0);\n        this.updatePattern();\n        this.updateOrientation();\n\n        // Create connections\n        for (i = 0; i < this.nCh; i++) {\n            this.in.connect(this.vmicGainNodes[i], i, 0);\n            this.vmicGainNodes[i].connect(this.out);\n        }\n\n        this.initialized = true;\n    }\n\n    (0, _createClass3.default)(virtualMic, [{\n        key: \"updatePattern\",\n        value: function updatePattern() {\n\n            function computeCardioidCoeffs(N) {\n                var coeffs = new Array(N + 1);\n                for (var n = 0; n <= N; n++) {\n                    coeffs[n] = jshlib.factorial(N) * jshlib.factorial(N) / (jshlib.factorial(N + n + 1) * jshlib.factorial(N - n));\n                }\n                return coeffs;\n            }\n\n            function computeHypercardCoeffs(N) {\n                var coeffs = new Array(N + 1);\n                var nSH = (N + 1) * (N + 1);\n                for (var n = 0; n <= N; n++) {\n                    coeffs[n] = 1 / nSH;\n                }\n                return coeffs;\n            }\n\n            function computeSupercardCoeffs(N) {\n                switch (N) {\n                    case 1:\n                        var coeffs = [0.3660, 0.2113];\n                        break;\n                    case 2:\n                        var coeffs = [0.2362, 0.1562, 0.0590];\n                        break;\n                    case 3:\n                        var coeffs = [0.1768, 0.1281, 0.0633, 0.0175];\n                        break;\n                    case 4:\n                        var coeffs = [0.1414, 0.1087, 0.0623, 0.0247, 0.0054];\n                        break;\n                    default:\n                        console.error(\"Orders should be in the range of 1-4 at the moment.\");\n                        return;\n                }\n                return coeffs;\n            }\n\n            function computeMaxRECoeffs(N) {\n                var coeffs = new Array(N + 1);\n                coeffs[0] = 1;\n                var leg_n_minus1 = 0;\n                var leg_n_minus2 = 0;\n                var leg_n = 0;\n                for (var n = 1; n < N + 1; n++) {\n                    leg_n = jshlib.recurseLegendrePoly(n, [Math.cos(2.406809 / (N + 1.51))], leg_n_minus1, leg_n_minus2);\n                    coeffs[n] = leg_n[0][0];\n\n                    leg_n_minus2 = leg_n_minus1;\n                    leg_n_minus1 = leg_n;\n                }\n                // compute normalization factor\n                var norm = 0;\n                for (var n = 0; n <= N; n++) {\n                    norm += coeffs[n] * (2 * n + 1);\n                }\n                for (var n = 0; n <= N; n++) {\n                    coeffs[n] = coeffs[n] / norm;\n                }\n                return coeffs;\n            }\n\n            switch (this.vmicPattern) {\n                case \"cardioid\":\n                    // higher-order cardioid given by: (1/2)^N * ( 1+cos(theta) )^N\n                    this.vmicCoeffs = computeCardioidCoeffs(this.order);\n                    break;\n                case \"supercardioid\":\n                    // maximum front-back energy ratio\n                    this.vmicCoeffs = computeSupercardCoeffs(this.order);\n                    break;\n                case \"hypercardioid\":\n                    // maximum directivity factor\n                    // (this is the classic plane/wave decomposition beamformer,\n                    // also termed \"regular\" in spherical beamforming literature)\n                    this.vmicCoeffs = computeHypercardCoeffs(this.order);\n                    break;\n                case \"max_rE\":\n                    // quite similar to maximum front-back rejection\n                    this.vmicCoeffs = computeMaxRECoeffs(this.order);\n                    break;\n                default:\n                    this.vmicPattern = \"hypercardioid\";\n                    this.vmicCoeffs = computeHypercardCoeffs(this.order);\n            }\n\n            this.updateGains();\n        }\n    }, {\n        key: \"updateOrientation\",\n        value: function updateOrientation() {\n\n            var azim = this.azim * Math.PI / 180;\n            var elev = this.elev * Math.PI / 180;\n\n            var tempSH = jshlib.computeRealSH(this.order, [[azim, elev]]);\n\n            for (var i = 0; i < this.nCh; i++) {\n                this.SHxyz[i] = tempSH[i][0];\n            }\n\n            this.updateGains();\n        }\n    }, {\n        key: \"updateGains\",\n        value: function updateGains() {\n\n            var q;\n            for (var n = 0; n <= this.order; n++) {\n                for (var m = -n; m <= n; m++) {\n                    q = n * n + n + m;\n                    this.vmicGains[q] = this.vmicCoeffs[n] * this.SHxyz[q];\n                }\n            }\n\n            for (var i = 0; i < this.nCh; i++) {\n                this.vmicGainNodes[i].gain.value = this.vmicGains[i];\n            }\n        }\n    }]);\n    return virtualMic;\n}(); ////////////////////////////////////////////////////////////////////\n//  Archontis Politis\n//  archontis.politis@aalto.fi\n//  David Poirier-Quinot\n//  davipoir@ircam.fr\n////////////////////////////////////////////////////////////////////\n//\n//  JSAmbisonics a JavaScript library for higher-order Ambisonics\n//  The library implements Web Audio blocks that perform\n//  typical ambisonic processing operations on audio signals.\n//\n////////////////////////////////////////////////////////////////////\n\n/////////////////////////////////\n/* HOA VIRTUAL MICROPHONE */\n/////////////////////////////////\n\nexports.default = virtualMic;\n\n},{\"babel-runtime/helpers/classCallCheck\":19,\"babel-runtime/helpers/createClass\":20,\"spherical-harmonic-transform\":98}],13:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _classCallCheck2 = require(\"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = require(\"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n////////////////////////////////////////////////////////////////////\n//  Archontis Politis\n//  archontis.politis@aalto.fi\n//  David Poirier-Quinot\n//  davipoir@ircam.fr\n////////////////////////////////////////////////////////////////////\n//\n//  JSAmbisonics a JavaScript library for higher-order Ambisonics\n//  The library implements Web Audio blocks that perform\n//  typical ambisonic processing operations on audio signals.\n//\n////////////////////////////////////////////////////////////////////\n\n////////////////\n/* HOA LOADER */\n////////////////\n\nvar HOAloader = function () {\n    function HOAloader(context, order, url, callback) {\n        (0, _classCallCheck3.default)(this, HOAloader);\n\n        this.context = context;\n        this.order = order;\n        this.nCh = (order + 1) * (order + 1);\n        this.nChGroups = Math.ceil(this.nCh / 8);\n        this.buffers = new Array();\n        this.loadCount = 0;\n        this.loaded = false;\n        this.onLoad = callback;\n        this.urls = new Array(this.nChGroups);\n\n        var fileExt = url.slice(url.length - 3, url.length);\n        this.fileExt = fileExt;\n\n        for (var i = 0; i < this.nChGroups; i++) {\n\n            if (i == this.nChGroups - 1) {\n                this.urls[i] = url.slice(0, url.length - 4) + \"_\" + pad(i * 8 + 1, 2) + \"-\" + pad(this.nCh, 2) + \"ch.\" + fileExt;\n            } else {\n                this.urls[i] = url.slice(0, url.length - 4) + \"_\" + pad(i * 8 + 1, 2) + \"-\" + pad(i * 8 + 8, 2) + \"ch.\" + fileExt;\n            }\n        }\n\n        function pad(num, size) {\n            return ('000000000' + num).substr(-size);\n        }\n    }\n\n    (0, _createClass3.default)(HOAloader, [{\n        key: \"loadBuffers\",\n        value: function loadBuffers(url, index) {\n            // Load buffer asynchronously\n            var request = new XMLHttpRequest();\n            request.open(\"GET\", url, true);\n            request.responseType = \"arraybuffer\";\n\n            var scope = this;\n\n            request.onload = function () {\n                // Asynchronously decode the audio file data in request.response\n                scope.context.decodeAudioData(request.response, function (buffer) {\n                    if (!buffer) {\n                        alert('error decoding file data: ' + url);\n                        return;\n                    }\n                    scope.buffers[index] = buffer;\n                    scope.loadCount++;\n                    if (scope.loadCount == scope.nChGroups) {\n                        scope.loaded = true;\n                        scope.concatBuffers();\n                        console.log(\"HOAloader: all buffers loaded and concatenated\");\n                        scope.onLoad(scope.concatBuffer);\n                    }\n                }, function (error) {\n                    alert(\"Browser cannot decode audio data:  \" + url + \"\\n\\nError: \" + error + \"\\n\\n(If you re using Safari and get a null error, this is most likely due to Apple's shady plan going on to stop the .ogg format from easing web developer's life :)\");\n                });\n            };\n\n            request.onerror = function () {\n                alert('HOAloader: XHR error');\n            };\n\n            request.send();\n        }\n    }, {\n        key: \"load\",\n        value: function load() {\n            for (var i = 0; i < this.nChGroups; ++i) {\n                this.loadBuffers(this.urls[i], i);\n            }\n        }\n    }, {\n        key: \"concatBuffers\",\n        value: function concatBuffers() {\n\n            if (!this.loaded) return;\n\n            var nCh = this.nCh;\n            var nChGroups = this.nChGroups;\n\n            var length = this.buffers[0].length;\n            this.buffers.forEach(function (b) {\n                length = Math.max(length, b.length);\n            });\n            var srate = this.buffers[0].sampleRate;\n\n            // Detect if the 8-ch audio file is OGG, then remap 8-channel files to the correct\n            // order cause Chrome and Firefox messes it up when loading. Other browsers have not\n            // been tested with OGG files. 8ch Wave files work fine for both browsers.\n            var remap8ChanFile = [1, 2, 3, 4, 5, 6, 7, 8];\n            if (this.fileExt.toLowerCase() == \"ogg\") {\n                console.log(\"Loading of 8chan OGG files [Chrome/Firefox]: remap channels to correct order!\");\n                remap8ChanFile = [1, 3, 2, 7, 8, 5, 6, 4];\n                //remap8ChanFile = [1,3,2,8,6,7,4,5];\n            }\n\n            this.concatBuffer = this.context.createBuffer(nCh, length, srate);\n            for (var i = 0; i < nChGroups; i++) {\n                for (var j = 0; j < this.buffers[i].numberOfChannels; j++) {\n                    this.concatBuffer.getChannelData(i * 8 + j).set(this.buffers[i].getChannelData(remap8ChanFile[j] - 1));\n                }\n            }\n        }\n    }]);\n    return HOAloader;\n}();\n\nexports.default = HOAloader;\n\n},{\"babel-runtime/helpers/classCallCheck\":19,\"babel-runtime/helpers/createClass\":20}],14:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = require('babel-runtime/helpers/createClass');\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nvar _serveSofaHrir = require('serve-sofa-hrir');\n\nvar serveSofaHrir = _interopRequireWildcard(_serveSofaHrir);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar utils = require(\"./utils.js\"); ////////////////////////////////////////////////////////////////////\n//  Archontis Politis (Aalto University)\n//  archontis.politis@aalto.fi\n//  David Poirier-Quinot (IRCAM)\n//  davipoir@ircam.fr\n////////////////////////////////////////////////////////////////////\n//\n//  JSAmbisonics a JavaScript library for higher-order Ambisonics\n//  The library implements Web Audio blocks that perform\n//  typical ambisonic processing operations on audio signals.\n//\n////////////////////////////////////////////////////////////////////\n\n/////////////////\n/* HRIR LOADER */\n/////////////////\n\nvar HRIRloader_ircam = function () {\n    function HRIRloader_ircam(context, order, callback) {\n        (0, _classCallCheck3.default)(this, HRIRloader_ircam);\n\n        this.context = context;\n        this.order = order;\n        this.nCh = (order + 1) * (order + 1);\n\n        // fonction called when filters loaded\n        this.onLoad = callback;\n\n        // instantiate hrtfset from serve-sofa-hrtf lib\n        this.hrtfSet = new serveSofaHrir.HrtfSet({ audioContext: this.context, coordinateSystem: 'sofaSpherical' });\n\n        // define required speakers (hence hrirs) positions based on Ambisonic order\n        this.wishedSpeakerPos = utils.getTdesign(2 * this.order);\n    }\n\n    (0, _createClass3.default)(HRIRloader_ircam, [{\n        key: 'load',\n        value: function load(setUrl) {\n            var _this = this;\n\n            this.hrtfSet.load(setUrl).then(function () {\n\n                // extract hrir buffers of interest from the database\n                var grantedFilterPos = [];\n                _this.hrirBuffer = [];\n                for (var i = 0; i < _this.wishedSpeakerPos.length; i++) {\n                    // get available positions (in the db) nearest from the required speakers positions\n                    grantedFilterPos.push(_this.hrtfSet.nearest(_this.wishedSpeakerPos[i]).position);\n                    // get related hrir\n                    _this.hrirBuffer.push(_this.hrtfSet.nearest(_this.wishedSpeakerPos[i]).fir);\n                }\n\n                // DEBUG //////////////////////////////////////////////////////\n                // compare required vs. present positions in HRIR filter\n                var angularDistDeg = 0;\n                for (var _i = 0; _i < _this.wishedSpeakerPos.length; _i++) {\n                    if (_this.wishedSpeakerPos[_i][0] < 0) _this.wishedSpeakerPos[_i][0] += 360.0;\n                    angularDistDeg += Math.sqrt(Math.pow(_this.wishedSpeakerPos[_i][0] - grantedFilterPos[_i][0], 2) + Math.pow(_this.wishedSpeakerPos[_i][1] - grantedFilterPos[_i][1], 2));\n                    // console.log('asked / granted pos: ', this.wishedSpeakerPos[i], '/', grantedFilterPos[i]);\n                }\n                console.log('summed / average angular dist between asked and present pos:', Math.round(angularDistDeg * 100) / 100, 'deg /', Math.round(angularDistDeg / _this.wishedSpeakerPos.length * 100) / 100, 'deg');\n                // DEBUG END //////////////////////////////////////////////////\n\n                // get decoding matrix\n                _this.decodingMatrix = utils.getAmbisonicDecMtx(grantedFilterPos, _this.order);\n\n                // convert hrir filters to hoa filters\n                _this.hoaBuffer = _this.getHoaFilterFromHrirFilter();\n\n                // pass resulting hoa filters to user callback\n                _this.onLoad(_this.hoaBuffer);\n            });\n        }\n    }, {\n        key: 'getHoaFilterFromHrirFilter',\n        value: function getHoaFilterFromHrirFilter() {\n            // create empty buffer ready to receive hoa filters\n            var hrirBufferLength = this.hrirBuffer[0].length; // assuming they all have the same\n            var hrirBufferSampleRate = this.hrirBuffer[0].sampleRate; // same\n            var hoaBuffer = this.context.createBuffer(this.nCh, hrirBufferLength, hrirBufferSampleRate);\n\n            // sum weighted HRIR over Ambisonic channels to create HOA IRs\n            for (var i = 0; i < this.nCh; i++) {\n                var concatBufferArrayLeft = new Float32Array(hrirBufferLength);\n                for (var j = 0; j < this.hrirBuffer.length; j++) {\n                    for (var k = 0; k < hrirBufferLength; k++) {\n                        concatBufferArrayLeft[k] += this.decodingMatrix[j][i] * this.hrirBuffer[j].getChannelData(0)[k];\n                    }\n                }\n                hoaBuffer.getChannelData(i).set(concatBufferArrayLeft);\n            }\n\n            return hoaBuffer;\n        }\n    }]);\n    return HRIRloader_ircam;\n}();\n\nexports.default = HRIRloader_ircam;\n\n},{\"./utils.js\":17,\"babel-runtime/helpers/classCallCheck\":19,\"babel-runtime/helpers/createClass\":20,\"serve-sofa-hrir\":72}],15:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _classCallCheck2 = require(\"babel-runtime/helpers/classCallCheck\");\n\nvar _classCallCheck3 = _interopRequireDefault(_classCallCheck2);\n\nvar _createClass2 = require(\"babel-runtime/helpers/createClass\");\n\nvar _createClass3 = _interopRequireDefault(_createClass2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n////////////////////////////////////////////////////////////////////\n//  Archontis Politis (Aalto University)\n//  archontis.politis@aalto.fi\n//  David Poirier-Quinot (IRCAM)\n//  davipoir@ircam.fr\n////////////////////////////////////////////////////////////////////\n//\n//  JSAmbisonics a JavaScript library for higher-order Ambisonics\n//  The library implements Web Audio blocks that perform\n//  typical ambisonic processing operations on audio signals.\n//\n////////////////////////////////////////////////////////////////////\n\n/////////////////\n/* HRIR LOADER */\n/////////////////\n\nvar utils = require(\"./utils.js\");\n\nvar HRIRloader_local = function () {\n    function HRIRloader_local(context, order, callback) {\n        (0, _classCallCheck3.default)(this, HRIRloader_local);\n\n        this.context = context;\n        this.order = order;\n        this.nCh = (order + 1) * (order + 1);\n        // function called when filters loaded\n        this.onLoad = callback;\n        // define required virtual speaker positions based on Ambisonic order\n        this.vls_dirs_deg = utils.getTdesign(2 * this.order);\n        this.nVLS = this.vls_dirs_deg.length;\n        // angular resolution for fast lookup to closest HRIR to a given direction\n        this.nearestLookupRes = [5, 5];\n    }\n\n    (0, _createClass3.default)(HRIRloader_local, [{\n        key: \"load\",\n        value: function load(setUrl) {\n\n            var self = this;\n            // setup the request\n            var requestHrir = new XMLHttpRequest();\n            requestHrir.open(\"GET\", setUrl, true);\n            requestHrir.responseType = \"json\";\n            requestHrir.onload = function () {\n                // load useful HRIR stuff from JSON\n                self.parseHrirFromJSON(requestHrir.response);\n                // construct lookup table for fast closest HRIR finding\n                self.nearestLookup = utils.createNearestLookup(self.hrir_dirs_deg, self.nearestLookupRes);\n                // find closest indices to VLS\n                var nearestIdx = utils.findNearest(self.vls_dirs_deg, self.nearestLookup, self.nearestLookupRes);\n                // get closest HRIRs to the VLS design\n                self.nearest_dirs_deg = self.getClosestDirs(nearestIdx, self.hrir_dirs_deg);\n                self.vls_hrirs = self.getClosestHrirFilters(nearestIdx, self.hrirs);\n                // compute ambisonic decoding filters\n                self.computeDecFilters();\n            };\n            requestHrir.send(); // Send the Request and Load the File\n        }\n    }, {\n        key: \"parseHrirFromJSON\",\n        value: function parseHrirFromJSON(hrirSet) {\n            var self = this;\n            this.fs = hrirSet.leaves[6].data[0]; // samplerate of the set\n            this.nHrirs = hrirSet.leaves[4].data.length; // number of HRIR measurements\n            this.nSamples = hrirSet.leaves[8].data[0][1].length; // length of HRIRs\n            // parse azimuth-elevation of HRIRs\n            this.hrir_dirs_deg = [];\n            hrirSet.leaves[4].data.forEach(function (element) {\n                self.hrir_dirs_deg.push([element[0], element[1]]);\n            });\n            // parse HRIR buffers\n            this.hrirs = [];\n            hrirSet.leaves[8].data.forEach(function (element) {\n                var left = new Float64Array(element[0]);\n                var right = new Float64Array(element[1]);\n                self.hrirs.push([left, right]);\n            });\n        }\n    }, {\n        key: \"getClosestDirs\",\n        value: function getClosestDirs(nearestIdx, hrir_dirs_deg) {\n            // getClosestHrirFilters(target_dirs_deg, hrir_dirs_deg, INFO) {\n            var nDirs = nearestIdx.length;\n            var nearest_dirs_deg = [];\n            for (var i = 0; i < nDirs; i++) {\n                // get available positions (in the HRIR set) nearest from the required speakers positions\n                nearest_dirs_deg.push(hrir_dirs_deg[nearestIdx[i]]);\n            }\n            return nearest_dirs_deg;\n            //        if (INFO) {\n            //            // compare required vs. present positions in HRIR filter\n            //            let angularDistDeg = 0;\n            //            for (let i = 0; i < nDirs; i++) {\n            //                if (this.target_dirs_deg[i][0] < 0) this.target_dirs_deg[i][0] += 360.0;\n            //                angularDistDeg += Math.sqrt(\n            //                                            Math.pow(this.target_dirs_deg[i][0] - grantedFilterPos[i][0], 2) +\n            //                                            Math.pow(this.target_dirs_deg[i][1] - grantedFilterPos[i][1], 2));\n            //                // console.log('asked / granted pos: ', this.wishedSpeakerPos[i], '/', grantedFilterPos[i]);\n            //            }\n            //            console.log('summed / average angular dist between target and actual pos:',\n            //                        Math.round(angularDistDeg*100)/100, 'deg /',\n            //                        Math.round( (angularDistDeg/this.wishedSpeakerPos.length) *100)/100, 'deg');\n            //        }\n        }\n    }, {\n        key: \"getClosestHrirFilters\",\n        value: function getClosestHrirFilters(nearestIdx, hrirs) {\n\n            var nDirs = nearestIdx.length;\n            var nearest_hrirs = [];\n            for (var i = 0; i < nDirs; i++) {\n                // get respective hrirs\n                nearest_hrirs.push(hrirs[nearestIdx[i]]);\n            }\n            return nearest_hrirs;\n        }\n    }, {\n        key: \"computeDecFilters\",\n        value: function computeDecFilters() {\n\n            // get decoding matrix\n            this.decodingMatrix = utils.getAmbiBinauralDecMtx(this.nearest_dirs_deg, this.order);\n            // convert hrir filters to hoa filters\n            this.hoaBuffer = this.getHoaFilterFromHrirFilter(this.nCh, this.nSamples, this.fs, this.vls_hrirs, this.decodingMatrix);\n            // pass resulting hoa filters to user callback\n            this.onLoad(this.hoaBuffer);\n        }\n    }, {\n        key: \"getHoaFilterFromHrirFilter\",\n        value: function getHoaFilterFromHrirFilter(nCh, nSamples, sampleRate, hrirs, decodingMatrix) {\n            // create empty buffer ready to receive hoa filters\n            if (nSamples > hrirs[0][0].length) nSamples = hrirs[0][0].length;\n            var hoaBuffer = this.context.createBuffer(nCh, nSamples, sampleRate);\n\n            // sum weighted HRIR over Ambisonic channels to create HOA IRs\n            for (var i = 0; i < nCh; i++) {\n                var concatBufferArrayLeft = new Float32Array(nSamples);\n                for (var j = 0; j < hrirs.length; j++) {\n                    for (var k = 0; k < nSamples; k++) {\n                        concatBufferArrayLeft[k] += decodingMatrix[j][i] * hrirs[j][0][k];\n                    }\n                }\n                hoaBuffer.getChannelData(i).set(concatBufferArrayLeft);\n            }\n            return hoaBuffer;\n        }\n    }]);\n    return HRIRloader_local;\n}();\n\nexports.default = HRIRloader_local;\n\n},{\"./utils.js\":17,\"babel-runtime/helpers/classCallCheck\":19,\"babel-runtime/helpers/createClass\":20}],16:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.utils = exports.converters = exports.HRIRloader_ircam = exports.HRIRloader_local = exports.HOAloader = exports.intensityAnalyser = exports.powermapAnalyser = exports.rmsAnalyser = exports.virtualMic = exports.decoder = exports.binDecoder = exports.sceneMirror = exports.sceneRotator = exports.orderWeight = exports.orderLimiter = exports.monoEncoder = undefined;\n\nvar _ambiMonoEncoder = require('./ambi-monoEncoder');\n\nObject.defineProperty(exports, 'monoEncoder', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_ambiMonoEncoder).default;\n  }\n});\n\nvar _ambiOrderLimiter = require('./ambi-orderLimiter');\n\nObject.defineProperty(exports, 'orderLimiter', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_ambiOrderLimiter).default;\n  }\n});\n\nvar _ambiOrderWeight = require('./ambi-orderWeight');\n\nObject.defineProperty(exports, 'orderWeight', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_ambiOrderWeight).default;\n  }\n});\n\nvar _ambiSceneRotator = require('./ambi-sceneRotator');\n\nObject.defineProperty(exports, 'sceneRotator', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_ambiSceneRotator).default;\n  }\n});\n\nvar _ambiSceneMirror = require('./ambi-sceneMirror');\n\nObject.defineProperty(exports, 'sceneMirror', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_ambiSceneMirror).default;\n  }\n});\n\nvar _ambiBinauralDecoder = require('./ambi-binauralDecoder');\n\nObject.defineProperty(exports, 'binDecoder', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_ambiBinauralDecoder).default;\n  }\n});\n\nvar _ambiDecoder = require('./ambi-decoder');\n\nObject.defineProperty(exports, 'decoder', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_ambiDecoder).default;\n  }\n});\n\nvar _ambiVirtualMic = require('./ambi-virtualMic');\n\nObject.defineProperty(exports, 'virtualMic', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_ambiVirtualMic).default;\n  }\n});\n\nvar _ambiRmsAnalyser = require('./ambi-rmsAnalyser');\n\nObject.defineProperty(exports, 'rmsAnalyser', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_ambiRmsAnalyser).default;\n  }\n});\n\nvar _ambiPowermapAnalyser = require('./ambi-powermapAnalyser');\n\nObject.defineProperty(exports, 'powermapAnalyser', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_ambiPowermapAnalyser).default;\n  }\n});\n\nvar _ambiIntensityAnalyser = require('./ambi-intensityAnalyser');\n\nObject.defineProperty(exports, 'intensityAnalyser', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_ambiIntensityAnalyser).default;\n  }\n});\n\nvar _hoaLoader = require('./hoa-loader');\n\nObject.defineProperty(exports, 'HOAloader', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_hoaLoader).default;\n  }\n});\n\nvar _hrirLoader_local = require('./hrir-loader_local');\n\nObject.defineProperty(exports, 'HRIRloader_local', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_hrirLoader_local).default;\n  }\n});\n\nvar _hrirLoader_ircam = require('./hrir-loader_ircam');\n\nObject.defineProperty(exports, 'HRIRloader_ircam', {\n  enumerable: true,\n  get: function get() {\n    return _interopRequireDefault(_hrirLoader_ircam).default;\n  }\n});\n\nvar _ambiConverters = require('./ambi-converters');\n\nvar _converters = _interopRequireWildcard(_ambiConverters);\n\nvar _utils2 = require('./utils');\n\nvar _utils = _interopRequireWildcard(_utils2);\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar converters = exports.converters = _converters;\n\nvar utils = exports.utils = _utils;\n\n},{\"./ambi-binauralDecoder\":1,\"./ambi-converters\":2,\"./ambi-decoder\":3,\"./ambi-intensityAnalyser\":4,\"./ambi-monoEncoder\":5,\"./ambi-orderLimiter\":6,\"./ambi-orderWeight\":7,\"./ambi-powermapAnalyser\":8,\"./ambi-rmsAnalyser\":9,\"./ambi-sceneMirror\":10,\"./ambi-sceneRotator\":11,\"./ambi-virtualMic\":12,\"./hoa-loader\":13,\"./hrir-loader_ircam\":14,\"./hrir-loader_local\":15,\"./utils\":17}],17:[function(require,module,exports){\n'use strict';Object.defineProperty(exports,\"__esModule\",{value:true});exports.deg2rad=deg2rad;exports.rad2deg=rad2deg;exports.getAmbisonicDecMtx=getAmbisonicDecMtx;exports.createNearestLookup=createNearestLookup;exports.findNearest=findNearest;exports.getTdesign=getTdesign;////////////////////////////////////////////////////////////////////\n//  Archontis Politis\n//  archontis.politis@aalto.fi\n//\n//  David Poirier-Quinot\n//  davipoir@ircam.fr\n//\n////////////////////////////////////////////////////////////////////\n//\n//  JSAmbisonics a JavaScript library for higher-order Ambisonics\n//  The library implements Web Audio blocks that perform\n//  typical ambisonic processing operations on audio signals.\n//\n////////////////////////////////////////////////////////////////////\n///////////\n/* UTILS *////////////\nvar numeric=require('numeric');var jshlib=require('spherical-harmonic-transform');var convexhull=require('convex-hull');function deg2rad(aedArrayIn){// format: [ [azim_1, elev_1, dist_1], ..., [azim_N, elev_N, dist_N] ]\n// or\n//         [ [azim_1, elev_1],         ..., [azim_N, elev_N] ]\nvar aedArrayOut=[];var PI_180=Math.PI/180.0;for(var i=0;i<aedArrayIn.length;i++){if(aedArrayIn[0].length==3)aedArrayOut.push([aedArrayIn[i][0]*PI_180,aedArrayIn[i][1]*PI_180,aedArrayIn[i][2]]);else if(aedArrayIn[0].length==2)aedArrayOut.push([aedArrayIn[i][0]*PI_180,aedArrayIn[i][1]*PI_180]);}return aedArrayOut;}function rad2deg(aedArrayIn){// format: [ [azim_1, elev_1, dist_1], ..., [azim_N, elev_N, dist_N] ]\n// or\n//         [ [azim_1, elev_1],         ..., [azim_N, elev_N] ]\nvar aedArrayOut=[];var PI_180=180.0/Math.PI;for(var i=0;i<aedArrayIn.length;i++){if(aedArrayIn[0].length==3)aedArrayOut.push([aedArrayIn[i][0]*PI_180,aedArrayIn[i][1]*PI_180,aedArrayIn[i][2]]);else if(aedArrayIn[0].length==2)aedArrayOut.push([aedArrayIn[i][0]*PI_180,aedArrayIn[i][1]*PI_180]);}return aedArrayOut;}function getAmbisonicDecMtx(hrtf_dirs_deg,order){// triangulation\nvar hrtf_dirs_rad=deg2rad(hrtf_dirs_deg);var vertices=jshlib.convertSph2Cart(hrtf_dirs_rad);var triplets=convexhull(vertices);var nTri=triplets.length;var nHRTFs=hrtf_dirs_rad.length;// triplet coordinate inversions for VBAP\nvar layoutInvMtx=new Array(nTri);for(var n=0;n<nTri;n++){// get the unit vectors for the current group\nvar tempGroup=new Array(3);for(var i=0;i<3;i++){tempGroup[i]=vertices[triplets[n][i]];}// get inverse mtx of current group\nvar tempInvMtx=numeric.inv(tempGroup);var tempInvVec=[];//vectorize matrix by stacking columns\nfor(var _i=0;_i<3;_i++){for(var j=0;j<3;j++){tempInvVec.push(tempInvMtx[j][_i]);}}layoutInvMtx[n]=tempInvVec;// store the vectorized inverse as a row the output\n}// ALLRAD\n// t-value for the t-design\nvar t=2*order+1;// vbap gains for selected t-design\nvar td_dirs_deg=getTdesign(2*order);var td_dirs_rad=deg2rad(td_dirs_deg);var G_td=vbap3(td_dirs_rad,triplets,layoutInvMtx,nHRTFs);G_td=numeric.transpose(G_td);// spherical harmonic matrix for t-design\nvar Y_td=jshlib.computeRealSH(order,td_dirs_rad);Y_td=numeric.transpose(Y_td);// allrad decoder\nvar nTD=td_dirs_rad.length;var M_dec=numeric.dotMMsmall(G_td,Y_td);M_dec=numeric.mul(1/nTD,M_dec);return M_dec;}var vbap3=function vbap3(dirs_rad,triplets,ls_invMtx,ls_num){var nDirs=dirs_rad.length;var nLS=ls_num;var nTri=triplets.length;function getMinOfArray(numArray){return Math.min.apply(null,numArray);}var gainMtx=new Array(nDirs);var U=jshlib.convertSph2Cart(dirs_rad);for(var ns=0;ns<nDirs;ns++){var u=U[ns];var gains=new Array(nLS);gains.fill(0);for(var i=0;i<nTri;i++){var g_tmp=[];var v_tmp=[ls_invMtx[i][0],ls_invMtx[i][1],ls_invMtx[i][2]];g_tmp[0]=numeric.dotVV(v_tmp,u);v_tmp=[ls_invMtx[i][3],ls_invMtx[i][4],ls_invMtx[i][5]];g_tmp[1]=numeric.dotVV(v_tmp,u);v_tmp=[ls_invMtx[i][6],ls_invMtx[i][7],ls_invMtx[i][8]];g_tmp[2]=numeric.dotVV(v_tmp,u);if(getMinOfArray(g_tmp)>-0.001){var norm_g_tmp=Math.sqrt(numeric.sum(numeric.pow(g_tmp,2)));// normalize gains\nvar g_tmp_normed=numeric.div(g_tmp,norm_g_tmp);for(var j=0;j<3;j++){gains[triplets[i][j]]=g_tmp_normed[j];}break;}}var norm_gains=Math.sqrt(numeric.sum(numeric.pow(gains,2)));// normalize gains\nvar gains_normed=numeric.div(gains,norm_gains);gainMtx[ns]=gains_normed;}return gainMtx;};function createNearestLookup(dirs_deg,ang_res){var nDirs=dirs_deg.length;var dirs_xyz=jshlib.convertSph2Cart(deg2rad(dirs_deg));var nAzi=Math.round(360/ang_res[0])+1;var nEle=Math.round(180/ang_res[1])+1;var azi=new Array(nAzi);azi[0]=-180;for(var i=1;i<nAzi;i++){azi[i]=azi[i-1]+ang_res[0];}var nGrid=nAzi*nEle;var nearestLookup=new Array(nGrid);for(var _i2=0;_i2<nGrid;_i2++){var grid_deg=[[_i2%nAzi*ang_res[0]-180,Math.floor(_i2/nAzi)*ang_res[1]-90]];var grid_xyz=jshlib.convertSph2Cart(deg2rad(grid_deg));var minVal=1000;for(var j=0;j<nDirs;j++){var newMinVal=numeric.sum(numeric.pow(numeric.sub(grid_xyz[0],dirs_xyz[j]),2));if(newMinVal<minVal){nearestLookup[_i2]=j;minVal=newMinVal;}}}return nearestLookup;}function findNearest(dirs_deg,nearestLookup,ang_res){var nDirs=dirs_deg.length;var azim=[];var elev=[];for(var i=0;i<nDirs;i++){azim.push(dirs_deg[i][0]+180);elev.push(dirs_deg[i][1]+90);}var nAzi=Math.round(360/ang_res[0])+1;var aziIndex=numeric.round(numeric.div(numeric.mod(azim,360),ang_res[0]));var elevIndex=numeric.round(numeric.div(elev,ang_res[1]));var gridIndex=numeric.add(numeric.mul(elevIndex,nAzi),aziIndex,1);var nearestIndex=[];for(var _i3=0;_i3<nDirs;_i3++){nearestIndex.push(nearestLookup[gridIndex[_i3]]);}return nearestIndex;}/*\n *  getTdesign returns the spherical coordinates of minimal T-designs\n *\n *  getTdesign returns the unit vectors and the spherical coordinates\n *  of t-designs, which constitute uniform arrangements on the sphere for\n *  which spherical polynomials up to degree t can be integrated exactly by\n *  summation of their values at the points defined by the t-design.\n *  Designs for order up to t=21 are stored and returned. Note that for the\n *  spherical harmonic transform (SHT) of a function of order N, a spherical\n *  t-design of t>=2N should be used (or equivalently N=floor(t/2) ), since\n *  the integral evaluates the product of the spherical function with\n *  spherical harmonics of up to order N. The spherical coordinates are\n *  given in the [azi1 elev1; azi2 elev2; ...; aziQ elevQ] convention.\n *\n *  The designs have been copied from:\n *      http://neilsloane.com/sphdesigns/\n *  and should be referenced as:\n *      \"McLaren's Improved Snub Cube and Other New Spherical Designs in\n *      Three Dimensions\", R. H. Hardin and N. J. A. Sloane, Discrete and\n *      Computational Geometry, 15 (1996), pp. 429-441.\n */function getTdesign(degree){if(degree>21){throw new Error('Designs of order greater than 21 are not implemented');}else if(degree<1){throw new Error('Order should be at least 1');}var speakerPos=[[[0.00,0.00,1.00],[180.00,0.00,1.00]],[[45.00,35.26,1.00],[-45.00,-35.26,1.00],[135.00,-35.26,1.00],[-135.00,35.26,1.00]],[[0.00,0.00,1.00],[180.00,0.00,1.00],[90.00,0.00,1.00],[-90.00,0.00,1.00],[0.00,90.00,1.00],[0.00,-90.00,1.00]],[[0.00,-31.72,1.00],[-58.28,0.00,1.00],[-90.00,58.28,1.00],[0.00,31.72,1.00],[-121.72,0.00,1.00],[90.00,-58.28,1.00],[180.00,-31.72,1.00],[121.72,0.00,1.00],[90.00,58.28,1.00],[180.00,31.72,1.00],[58.28,0.00,1.00],[-90.00,-58.28,1.00]],[[0.00,-31.72,1.00],[-58.28,0.00,1.00],[-90.00,58.28,1.00],[0.00,31.72,1.00],[-121.72,0.00,1.00],[90.00,-58.28,1.00],[180.00,-31.72,1.00],[121.72,0.00,1.00],[90.00,58.28,1.00],[180.00,31.72,1.00],[58.28,0.00,1.00],[-90.00,-58.28,1.00]],[[26.00,15.46,1.00],[-26.00,-15.46,1.00],[17.11,-24.99,1.00],[-17.11,24.99,1.00],[154.00,-15.46,1.00],[-154.00,15.46,1.00],[162.89,24.99,1.00],[-162.89,-24.99,1.00],[72.89,24.99,1.00],[107.11,-24.99,1.00],[116.00,15.46,1.00],[64.00,-15.46,1.00],[-107.11,24.99,1.00],[-72.89,-24.99,1.00],[-64.00,15.46,1.00],[-116.00,-15.46,1.00],[32.25,60.03,1.00],[-147.75,60.03,1.00],[-57.75,60.03,1.00],[122.25,60.03,1.00],[-32.25,-60.03,1.00],[147.75,-60.03,1.00],[57.75,-60.03,1.00],[-122.25,-60.03,1.00]],[[26.00,15.46,1.00],[-26.00,-15.46,1.00],[17.11,-24.99,1.00],[-17.11,24.99,1.00],[154.00,-15.46,1.00],[-154.00,15.46,1.00],[162.89,24.99,1.00],[-162.89,-24.99,1.00],[72.89,24.99,1.00],[107.11,-24.99,1.00],[116.00,15.46,1.00],[64.00,-15.46,1.00],[-107.11,24.99,1.00],[-72.89,-24.99,1.00],[-64.00,15.46,1.00],[-116.00,-15.46,1.00],[32.25,60.03,1.00],[-147.75,60.03,1.00],[-57.75,60.03,1.00],[122.25,60.03,1.00],[-32.25,-60.03,1.00],[147.75,-60.03,1.00],[57.75,-60.03,1.00],[-122.25,-60.03,1.00]],[[-31.11,53.65,1.00],[110.82,30.50,1.00],[148.89,53.65,1.00],[32.21,-17.83,1.00],[69.18,-30.50,1.00],[-32.21,17.83,1.00],[-69.18,30.50,1.00],[-147.79,-17.83,1.00],[-110.82,-30.50,1.00],[147.79,17.83,1.00],[31.11,-53.65,1.00],[-148.89,-53.65,1.00],[-21.25,-47.78,1.00],[-108.20,38.78,1.00],[158.75,-47.78,1.00],[139.77,-14.09,1.00],[-71.80,-38.78,1.00],[-139.77,14.09,1.00],[71.80,38.78,1.00],[-40.23,-14.09,1.00],[108.20,-38.78,1.00],[40.23,14.09,1.00],[21.25,47.78,1.00],[-158.75,47.78,1.00],[106.65,-2.55,1.00],[-2.66,-16.63,1.00],[-73.35,-2.55,1.00],[-98.84,73.16,1.00],[-177.34,16.63,1.00],[98.84,-73.16,1.00],[177.34,-16.63,1.00],[81.16,73.16,1.00],[2.66,16.63,1.00],[-81.16,-73.16,1.00],[-106.65,2.55,1.00],[73.35,2.55,1.00]],[[20.75,-3.55,1.00],[-20.75,3.55,1.00],[-3.80,-20.70,1.00],[3.80,20.70,1.00],[159.25,3.55,1.00],[-159.25,-3.55,1.00],[-176.20,20.70,1.00],[176.20,-20.70,1.00],[93.80,20.70,1.00],[86.20,-20.70,1.00],[110.75,-3.55,1.00],[69.25,3.55,1.00],[-86.20,20.70,1.00],[-93.80,-20.70,1.00],[-69.25,-3.55,1.00],[-110.75,3.55,1.00],[-9.94,68.97,1.00],[170.06,68.97,1.00],[-99.94,68.97,1.00],[80.06,68.97,1.00],[9.94,-68.97,1.00],[-170.06,-68.97,1.00],[99.94,-68.97,1.00],[-80.06,-68.97,1.00],[42.15,17.57,1.00],[-42.15,-17.57,1.00],[23.12,-39.77,1.00],[-23.12,39.77,1.00],[137.85,-17.57,1.00],[-137.85,17.57,1.00],[156.88,39.77,1.00],[-156.88,-39.77,1.00],[66.88,39.77,1.00],[113.12,-39.77,1.00],[132.15,17.57,1.00],[47.85,-17.57,1.00],[-113.12,39.77,1.00],[-66.88,-39.77,1.00],[-47.85,17.57,1.00],[-132.15,-17.57,1.00],[25.26,44.98,1.00],[-154.74,44.98,1.00],[-64.74,44.98,1.00],[115.26,44.98,1.00],[-25.26,-44.98,1.00],[154.74,-44.98,1.00],[64.74,-44.98,1.00],[-115.26,-44.98,1.00]],[[144.09,-21.45,1.00],[-33.81,-48.92,1.00],[-35.91,-21.45,1.00],[-115.87,33.09,1.00],[-146.19,48.92,1.00],[115.87,-33.09,1.00],[146.19,-48.92,1.00],[64.13,33.09,1.00],[33.81,48.92,1.00],[-64.13,-33.09,1.00],[-144.09,21.45,1.00],[35.91,21.45,1.00],[-45.53,1.95,1.00],[177.26,44.44,1.00],[134.47,1.95,1.00],[87.21,-45.49,1.00],[2.74,-44.44,1.00],[-87.21,45.49,1.00],[-2.74,44.44,1.00],[-92.79,-45.49,1.00],[-177.26,-44.44,1.00],[92.79,45.49,1.00],[45.53,-1.95,1.00],[-134.47,-1.95,1.00],[15.59,-73.34,1.00],[-85.40,16.04,1.00],[-164.41,-73.34,1.00],[163.92,4.42,1.00],[-94.60,-16.04,1.00],[-163.92,-4.42,1.00],[94.60,16.04,1.00],[-16.08,4.42,1.00],[85.40,-16.04,1.00],[16.08,-4.42,1.00],[-15.59,73.34,1.00],[164.41,73.34,1.00],[-60.02,25.27,1.00],[151.41,26.86,1.00],[119.98,25.27,1.00],[46.63,-51.57,1.00],[28.59,-26.86,1.00],[-46.63,51.57,1.00],[-28.59,26.86,1.00],[-133.37,-51.57,1.00],[-151.41,-26.86,1.00],[133.37,51.57,1.00],[60.02,-25.27,1.00],[-119.98,-25.27,1.00],[-109.94,6.91,1.00],[172.65,-19.79,1.00],[70.06,6.91,1.00],[-70.44,-68.94,1.00],[7.35,19.79,1.00],[70.44,68.94,1.00],[-7.35,-19.79,1.00],[109.56,-68.94,1.00],[-172.65,19.79,1.00],[-109.56,68.94,1.00],[109.94,-6.91,1.00],[-70.06,-6.91,1.00]],[[132.93,7.69,1.00],[-83.93,-23.73,1.00],[8.47,23.51,1.00],[-113.34,70.42,1.00],[-103.27,-9.90,1.00],[-33.24,-70.75,1.00],[21.86,-26.46,1.00],[-156.54,47.78,1.00],[-64.26,-7.72,1.00],[165.78,44.53,1.00],[-25.20,26.39,1.00],[-97.00,-44.66,1.00],[27.85,9.77,1.00],[153.21,-47.71,1.00],[-155.06,7.45,1.00],[-11.84,-23.59,1.00],[80.54,23.72,1.00],[-42.06,70.44,1.00],[-31.22,-9.84,1.00],[38.84,-70.50,1.00],[93.76,-26.29,1.00],[-84.76,47.61,1.00],[7.76,-7.52,1.00],[-122.28,44.29,1.00],[46.80,26.64,1.00],[-24.77,-44.57,1.00],[99.89,9.91,1.00],[-134.78,-47.96,1.00],[-83.09,7.30,1.00],[60.13,-23.34,1.00],[152.64,23.64,1.00],[29.76,70.68,1.00],[40.78,-9.58,1.00],[110.18,-70.39,1.00],[165.65,-26.43,1.00],[-12.99,47.75,1.00],[79.74,-7.31,1.00],[-50.52,44.26,1.00],[118.92,26.71,1.00],[47.22,-44.31,1.00],[171.93,9.76,1.00],[-62.51,-48.04,1.00],[-11.12,7.44,1.00],[132.02,-23.33,1.00],[-135.36,23.39,1.00],[102.37,70.82,1.00],[112.74,-9.49,1.00],[-178.30,-70.58,1.00],[-122.32,-26.67,1.00],[59.08,48.00,1.00],[151.70,-7.38,1.00],[21.38,44.50,1.00],[-169.01,26.50,1.00],[118.98,-44.25,1.00],[-116.09,9.52,1.00],[9.65,-47.83,1.00],[60.89,7.68,1.00],[-156.02,-23.57,1.00],[-63.46,23.31,1.00],[174.93,70.66,1.00],[-175.29,-9.68,1.00],[-105.95,-70.80,1.00],[-50.19,-26.70,1.00],[131.36,48.01,1.00],[-136.30,-7.64,1.00],[93.56,44.67,1.00],[-97.08,26.30,1.00],[-169.16,-44.46,1.00],[-44.13,9.52,1.00],[81.48,-47.62,1.00]],[[-154.47,7.90,1.00],[162.15,-63.36,1.00],[25.53,7.90,1.00],[-81.26,-25.27,1.00],[17.85,63.36,1.00],[81.26,25.27,1.00],[-17.85,-63.36,1.00],[98.74,-25.27,1.00],[-162.15,63.36,1.00],[-98.74,25.27,1.00],[154.47,-7.90,1.00],[-25.53,-7.90,1.00],[1.30,-10.47,1.00],[-83.01,79.45,1.00],[-178.70,-10.47,1.00],[100.48,1.28,1.00],[-96.99,-79.45,1.00],[-100.48,-1.28,1.00],[96.99,79.45,1.00],[-79.52,1.28,1.00],[83.01,-79.45,1.00],[79.52,-1.28,1.00],[-1.30,10.47,1.00],[178.70,10.47,1.00],[157.24,13.15,1.00],[31.14,-63.89,1.00],[-22.76,13.15,1.00],[-75.78,22.13,1.00],[148.86,63.89,1.00],[75.78,-22.13,1.00],[-148.86,-63.89,1.00],[104.22,22.13,1.00],[-31.14,63.89,1.00],[-104.22,-22.13,1.00],[-157.24,-13.15,1.00],[22.76,-13.15,1.00],[110.44,-60.62,1.00],[-62.18,-9.87,1.00],[-69.56,-60.62,1.00],[-168.88,27.37,1.00],[-117.82,9.87,1.00],[168.88,-27.37,1.00],[117.82,-9.87,1.00],[11.12,27.37,1.00],[62.18,9.87,1.00],[-11.12,-27.37,1.00],[-110.44,60.62,1.00],[69.56,60.62,1.00],[-125.93,-47.40,1.00],[-126.67,-23.40,1.00],[54.07,-47.40,1.00],[-151.65,-33.24,1.00],[-53.33,23.40,1.00],[151.65,33.24,1.00],[53.33,-23.40,1.00],[28.35,-33.24,1.00],[126.67,23.40,1.00],[-28.35,33.24,1.00],[125.93,47.40,1.00],[-54.07,47.40,1.00],[61.41,37.54,1.00],[41.19,22.30,1.00],[-118.59,37.54,1.00],[31.92,44.13,1.00],[138.81,-22.30,1.00],[-31.92,-44.13,1.00],[-138.81,22.30,1.00],[-148.08,44.13,1.00],[-41.19,-22.30,1.00],[148.08,-44.13,1.00],[-61.41,-37.54,1.00],[118.59,-37.54,1.00],[132.92,4.73,1.00],[6.45,-42.74,1.00],[-47.08,4.73,1.00],[-83.07,46.87,1.00],[173.55,42.74,1.00],[83.07,-46.87,1.00],[-173.55,-42.74,1.00],[96.93,46.87,1.00],[-6.45,42.74,1.00],[-96.93,-46.87,1.00],[-132.92,-4.73,1.00],[47.08,-4.73,1.00]],[[-40.36,68.70,1.00],[61.12,65.68,1.00],[141.73,70.75,1.00],[-131.25,72.32,1.00],[-154.88,-12.62,1.00],[-66.20,-9.78,1.00],[26.36,-11.97,1.00],[114.95,-12.58,1.00],[37.02,51.13,1.00],[129.77,51.95,1.00],[-140.63,50.15,1.00],[-56.50,47.88,1.00],[-65.05,12.58,1.00],[25.12,12.62,1.00],[113.80,9.78,1.00],[-153.64,11.97,1.00],[-134.51,-9.73,1.00],[-46.23,-8.37,1.00],[47.91,-9.73,1.00],[141.51,-8.73,1.00],[-17.84,-44.10,1.00],[69.37,-43.27,1.00],[151.22,-42.67,1.00],[-106.78,-40.18,1.00],[-50.23,-51.95,1.00],[39.37,-50.15,1.00],[123.50,-47.88,1.00],[-142.98,-51.13,1.00],[-179.19,-60.75,1.00],[-84.57,-54.07,1.00],[5.39,-58.05,1.00],[89.50,-60.75,1.00],[-145.98,31.02,1.00],[-54.39,26.43,1.00],[28.92,32.51,1.00],[125.34,30.94,1.00],[168.71,-7.06,1.00],[-112.49,-10.38,1.00],[-21.96,-9.60,1.00],[73.11,-8.31,1.00],[95.68,0.04,1.00],[-170.71,2.32,1.00],[-84.32,-0.04,1.00],[9.29,-2.32,1.00],[9.19,-34.33,1.00],[98.21,-37.31,1.00],[-179.20,-40.48,1.00],[-77.81,-31.60,1.00],[-177.08,-21.74,1.00],[-93.77,-18.83,1.00],[-2.72,-19.80,1.00],[90.51,-20.91,1.00],[-106.89,8.31,1.00],[-11.29,7.06,1.00],[67.51,10.38,1.00],[158.04,9.60,1.00],[-118.88,-65.68,1.00],[-38.27,-70.75,1.00],[48.75,-72.32,1.00],[139.64,-68.70,1.00],[-54.66,-30.94,1.00],[34.02,-31.02,1.00],[125.61,-26.43,1.00],[-151.08,-32.51,1.00],[-170.81,34.33,1.00],[-81.79,37.31,1.00],[0.80,40.48,1.00],[102.19,31.60,1.00],[-28.78,42.67,1.00],[73.22,40.18,1.00],[162.16,44.10,1.00],[-110.63,43.27,1.00],[-89.49,20.91,1.00],[2.92,21.74,1.00],[86.23,18.83,1.00],[177.28,19.80,1.00],[133.77,8.37,1.00],[-132.09,9.73,1.00],[-38.49,8.73,1.00],[45.49,9.73,1.00],[-25.60,24.04,1.00],[55.12,30.23,1.00],[149.30,28.05,1.00],[-118.71,26.06,1.00],[0.81,60.75,1.00],[95.43,54.07,1.00],[-174.61,58.05,1.00],[-90.50,60.75,1.00],[-124.88,-30.23,1.00],[-30.70,-28.05,1.00],[61.29,-26.06,1.00],[154.40,-24.04,1.00],[-132.92,-85.60,1.00],[47.08,85.60,1.00]],[[-129.19,8.11,1.00],[169.58,-38.73,1.00],[50.81,8.12,1.00],[-77.27,-50.11,1.00],[10.42,38.73,1.00],[77.30,50.12,1.00],[-10.41,-38.72,1.00],[102.71,-50.11,1.00],[-169.57,38.72,1.00],[-102.71,50.11,1.00],[129.19,-8.11,1.00],[-50.80,-8.11,1.00],[-4.59,-56.01,1.00],[-93.10,33.85,1.00],[175.39,-56.03,1.00],[146.11,-2.57,1.00],[-86.89,-33.86,1.00],[-146.10,2.56,1.00],[86.91,33.86,1.00],[-33.89,-2.57,1.00],[93.10,-33.85,1.00],[33.90,2.58,1.00],[4.60,56.03,1.00],[-175.38,56.01,1.00],[106.57,26.10,1.00],[27.07,-14.82,1.00],[-73.44,26.09,1.00],[-30.20,59.41,1.00],[152.94,14.83,1.00],[30.20,-59.40,1.00],[-152.93,-14.84,1.00],[149.82,59.41,1.00],[-27.06,14.83,1.00],[-149.80,-59.42,1.00],[-106.55,-26.10,1.00],[73.44,-26.09,1.00],[-171.42,77.45,1.00],[91.90,-12.40,1.00],[8.54,77.46,1.00],[-12.40,-1.85,1.00],[88.11,12.41,1.00],[12.41,1.86,1.00],[-88.10,-12.41,1.00],[167.60,-1.86,1.00],[-91.89,12.40,1.00],[-167.59,1.84,1.00],[171.43,-77.46,1.00],[-8.52,-77.45,1.00],[-122.73,-10.44,1.00],[-167.65,-32.13,1.00],[57.27,-10.43,1.00],[-108.80,-55.83,1.00],[-12.35,32.13,1.00],[108.83,55.83,1.00],[12.36,-32.12,1.00],[71.19,-55.82,1.00],[167.66,32.12,1.00],[-71.19,55.82,1.00],[122.74,10.44,1.00],[-57.27,10.44,1.00],[-135.84,-23.05,1.00],[-148.58,-41.32,1.00],[44.16,-23.04,1.00],[-120.66,-39.88,1.00],[-31.41,41.31,1.00],[120.68,39.87,1.00],[31.42,-41.30,1.00],[59.33,-39.86,1.00],[148.60,41.31,1.00],[-59.33,39.87,1.00],[135.85,23.05,1.00],[-44.16,23.05,1.00],[-161.55,20.62,1.00],[130.04,-62.60,1.00],[18.45,20.64,1.00],[-68.35,-17.23,1.00],[49.96,62.61,1.00],[68.36,17.23,1.00],[-49.93,-62.60,1.00],[111.65,-17.22,1.00],[-130.05,62.59,1.00],[-111.64,17.22,1.00],[161.56,-20.63,1.00],[-18.44,-20.62,1.00],[-105.23,-3.38,1.00],[-176.50,-15.21,1.00],[74.77,-3.37,1.00],[-102.64,-74.41,1.00],[-3.50,15.21,1.00],[102.69,74.41,1.00],[3.51,-15.20,1.00],[77.33,-74.40,1.00],[176.51,15.20,1.00],[-77.36,74.40,1.00],[105.24,3.38,1.00],[-74.76,3.37,1.00],[-142.39,25.42,1.00],[142.08,-45.69,1.00],[37.61,25.43,1.00],[-59.02,-33.44,1.00],[37.92,45.69,1.00],[59.04,33.45,1.00],[-37.91,-45.68,1.00],[120.97,-33.44,1.00],[-142.07,45.68,1.00],[-120.96,33.44,1.00],[142.40,-25.43,1.00],[-37.60,-25.42,1.00]],[[-30.60,6.94,1.00],[166.56,58.69,1.00],[149.40,6.96,1.00],[81.95,-30.36,1.00],[13.48,-58.69,1.00],[-81.93,30.36,1.00],[-13.46,58.68,1.00],[-98.06,-30.37,1.00],[-166.54,-58.68,1.00],[98.07,30.37,1.00],[30.62,-6.95,1.00],[-149.38,-6.95,1.00],[106.69,-22.68,1.00],[-23.57,-15.36,1.00],[-73.31,-22.69,1.00],[-145.50,62.10,1.00],[-156.41,15.36,1.00],[145.53,-62.10,1.00],[156.43,-15.35,1.00],[34.47,62.11,1.00],[23.58,15.36,1.00],[-34.46,-62.11,1.00],[-106.67,22.68,1.00],[73.33,22.69,1.00],[166.82,1.39,1.00],[6.09,-76.74,1.00],[-13.19,1.38,1.00],[-88.57,13.18,1.00],[173.99,76.74,1.00],[88.59,-13.18,1.00],[-173.97,-76.73,1.00],[91.43,13.20,1.00],[-6.07,76.73,1.00],[-91.42,-13.20,1.00],[-166.80,-1.38,1.00],[13.20,-1.39,1.00],[-74.67,48.11,1.00],[130.86,10.16,1.00],[105.32,48.13,1.00],[13.34,-40.08,1.00],[49.16,-10.15,1.00],[-13.32,40.07,1.00],[-49.14,10.15,1.00],[-166.67,-40.08,1.00],[-130.84,-10.16,1.00],[166.69,40.08,1.00],[74.70,-48.11,1.00],[-105.31,-48.13,1.00],[-126.99,26.55,1.00],[147.96,-32.57,1.00],[53.00,26.56,1.00],[-50.28,-45.59,1.00],[32.05,32.58,1.00],[50.30,45.59,1.00],[-32.03,-32.58,1.00],[129.71,-45.58,1.00],[-147.94,32.57,1.00],[-129.69,45.58,1.00],[127.02,-26.55,1.00],[-52.98,-26.56,1.00],[-171.93,30.37,1.00],[103.47,-58.68,1.00],[8.07,30.36,1.00],[-59.38,-6.96,1.00],[76.54,58.69,1.00],[59.40,6.95,1.00],[-76.53,-58.69,1.00],[120.62,-6.94,1.00],[-103.44,58.68,1.00],[-120.60,6.95,1.00],[171.94,-30.36,1.00],[-8.05,-30.37,1.00],[40.86,10.16,1.00],[15.32,48.12,1.00],[-139.14,10.16,1.00],[76.68,40.09,1.00],[164.69,-48.12,1.00],[-76.67,-40.09,1.00],[-164.67,48.12,1.00],[-103.31,40.07,1.00],[-15.30,-48.13,1.00],[103.34,-40.07,1.00],[-40.84,-10.16,1.00],[139.16,-10.15,1.00],[103.20,-1.38,1.00],[-1.41,-13.19,1.00],[-76.80,-1.39,1.00],[-96.02,76.73,1.00],[-178.57,13.19,1.00],[96.07,-76.73,1.00],[178.58,-13.19,1.00],[83.94,76.74,1.00],[1.43,13.19,1.00],[-83.95,-76.74,1.00],[-103.18,1.38,1.00],[76.81,1.39,1.00],[37.02,-26.56,1.00],[-39.70,45.58,1.00],[-142.99,-26.56,1.00],[122.05,32.58,1.00],[-140.29,-45.59,1.00],[-122.04,-32.58,1.00],[140.31,45.59,1.00],[-57.95,32.57,1.00],[39.72,-45.58,1.00],[57.97,-32.57,1.00],[-37.00,26.55,1.00],[143.00,26.56,1.00],[163.33,22.69,1.00],[55.55,-62.10,1.00],[-16.67,22.68,1.00],[-66.41,15.35,1.00],[124.49,62.11,1.00],[66.43,-15.35,1.00],[-124.48,-62.11,1.00],[113.58,15.36,1.00],[-55.52,62.10,1.00],[-113.57,-15.36,1.00],[-163.31,-22.68,1.00],[16.69,-22.69,1.00]],[[-10.57,-17.35,1.00],[-120.42,69.76,1.00],[169.43,-17.35,1.00],[107.63,-10.08,1.00],[-59.57,-69.78,1.00],[-107.63,10.08,1.00],[59.57,69.78,1.00],[-72.37,-10.09,1.00],[120.42,-69.76,1.00],[72.37,10.09,1.00],[10.57,17.35,1.00],[-169.43,17.35,1.00],[-30.77,68.25,1.00],[101.53,18.57,1.00],[149.25,68.26,1.00],[18.92,-10.92,1.00],[78.47,-18.56,1.00],[-18.92,10.92,1.00],[-78.47,18.56,1.00],[-161.09,-10.92,1.00],[-101.53,-18.56,1.00],[161.09,10.92,1.00],[30.78,-68.26,1.00],[-149.26,-68.26,1.00],[56.46,41.26,1.00],[46.46,24.54,1.00],[-123.53,41.26,1.00],[32.19,38.80,1.00],[133.53,-24.53,1.00],[-32.19,-38.80,1.00],[-133.53,24.53,1.00],[-147.80,38.80,1.00],[-46.46,-24.54,1.00],[147.80,-38.80,1.00],[-56.46,-41.27,1.00],[123.53,-41.26,1.00],[84.74,27.31,1.00],[27.41,4.68,1.00],[-95.26,27.30,1.00],[10.06,62.23,1.00],[152.59,-4.67,1.00],[-10.06,-62.23,1.00],[-152.59,4.67,1.00],[-169.92,62.23,1.00],[-27.40,-4.68,1.00],[169.92,-62.22,1.00],[-84.74,-27.31,1.00],[95.26,-27.30,1.00],[136.27,-0.73,1.00],[-1.05,-46.27,1.00],[-43.73,-0.74,1.00],[-91.01,43.72,1.00],[-178.94,46.27,1.00],[91.01,-43.72,1.00],[178.94,-46.27,1.00],[88.99,43.73,1.00],[1.05,46.27,1.00],[-88.99,-43.73,1.00],[-136.27,0.73,1.00],[43.73,0.73,1.00],[55.23,10.82,1.00],[13.09,34.07,1.00],[-124.77,10.81,1.00],[71.48,53.80,1.00],[166.91,-34.06,1.00],[-71.48,-53.80,1.00],[-166.90,34.06,1.00],[-108.52,53.79,1.00],[-13.09,-34.06,1.00],[108.52,-53.79,1.00],[-55.23,-10.82,1.00],[124.77,-10.81,1.00],[-105.49,-68.13,1.00],[-111.15,-5.71,1.00],[74.52,-68.12,1.00],[-173.89,-21.04,1.00],[-68.85,5.70,1.00],[173.89,21.04,1.00],[68.85,-5.70,1.00],[6.12,-21.04,1.00],[111.15,5.71,1.00],[-6.12,21.04,1.00],[105.49,68.13,1.00],[-74.52,68.12,1.00],[35.28,-15.18,1.00],[-25.17,51.98,1.00],[-144.72,-15.19,1.00],[108.39,33.88,1.00],[-154.84,-51.99,1.00],[-108.39,-33.88,1.00],[154.84,51.99,1.00],[-71.61,33.87,1.00],[25.17,-51.98,1.00],[71.61,-33.87,1.00],[-35.28,15.18,1.00],[144.72,15.19,1.00],[-125.28,-28.56,1.00],[-146.32,-30.49,1.00],[54.72,-28.55,1.00],[-133.29,-45.82,1.00],[-33.69,30.48,1.00],[133.30,45.82,1.00],[33.68,-30.48,1.00],[46.71,-45.81,1.00],[146.32,30.49,1.00],[-46.71,45.81,1.00],[125.28,28.56,1.00],[-54.72,28.54,1.00],[-144.40,54.71,1.00],[112.38,-28.01,1.00],[35.58,54.72,1.00],[-29.92,-19.65,1.00],[67.62,28.02,1.00],[29.92,19.65,1.00],[-67.62,-28.02,1.00],[150.08,-19.64,1.00],[-112.38,28.01,1.00],[-150.08,19.64,1.00],[144.40,-54.71,1.00],[-35.58,-54.72,1.00],[68.53,-52.85,1.00],[-54.82,12.76,1.00],[-111.46,-52.87,1.00],[164.51,34.19,1.00],[-125.18,-12.77,1.00],[-164.51,-34.19,1.00],[125.18,12.77,1.00],[-15.50,34.19,1.00],[54.82,-12.76,1.00],[15.49,-34.19,1.00],[-68.53,52.85,1.00],[111.47,52.86,1.00],[91.48,-7.37,1.00],[-7.38,-1.47,1.00],[-88.52,-7.38,1.00],[-168.69,82.47,1.00],[-172.62,1.47,1.00],[168.69,-82.47,1.00],[172.62,-1.46,1.00],[11.22,82.48,1.00],[7.38,1.47,1.00],[-11.21,-82.48,1.00],[-91.48,7.37,1.00],[88.52,7.38,1.00]],[[-110.97,-81.34,1.00],[-98.09,-3.09,1.00],[69.03,-81.34,1.00],[-176.88,-8.08,1.00],[-81.91,3.09,1.00],[176.88,8.08,1.00],[81.91,-3.09,1.00],[3.12,-8.08,1.00],[98.09,3.09,1.00],[-3.12,8.08,1.00],[110.97,81.34,1.00],[-69.03,81.34,1.00],[145.76,30.52,1.00],[46.33,-45.41,1.00],[-34.24,30.52,1.00],[-54.51,28.99,1.00],[133.67,45.41,1.00],[54.51,-28.99,1.00],[-133.67,-45.41,1.00],[125.49,28.99,1.00],[-46.33,45.41,1.00],[-125.49,-28.99,1.00],[-145.76,-30.52,1.00],[34.24,-30.52,1.00],[159.58,41.40,1.00],[68.40,-44.67,1.00],[-20.42,41.40,1.00],[-46.75,15.18,1.00],[111.60,44.67,1.00],[46.75,-15.18,1.00],[-111.60,-44.67,1.00],[133.25,15.18,1.00],[-68.40,44.67,1.00],[-133.25,-15.18,1.00],[-159.58,-41.40,1.00],[20.42,-41.40,1.00],[85.43,-37.93,1.00],[-38.02,3.60,1.00],[-94.57,-37.93,1.00],[174.17,51.83,1.00],[-141.98,-3.60,1.00],[-174.17,-51.83,1.00],[141.98,3.60,1.00],[-5.83,51.83,1.00],[38.02,-3.60,1.00],[5.83,-51.83,1.00],[-85.43,37.93,1.00],[94.57,37.93,1.00],[21.18,27.17,1.00],[54.86,56.05,1.00],[-158.82,27.17,1.00],[61.17,18.75,1.00],[125.14,-56.05,1.00],[-61.17,-18.75,1.00],[-125.14,56.05,1.00],[-118.83,18.75,1.00],[-54.86,-56.05,1.00],[118.83,-18.75,1.00],[-21.18,-27.17,1.00],[158.82,-27.17,1.00],[104.66,-9.56,1.00],[-9.88,-14.45,1.00],[-75.34,-9.56,1.00],[-123.65,72.56,1.00],[-170.12,14.45,1.00],[123.65,-72.56,1.00],[170.12,-14.45,1.00],[56.35,72.56,1.00],[9.88,14.45,1.00],[-56.35,-72.56,1.00],[-104.66,9.56,1.00],[75.34,9.56,1.00],[25.94,-16.83,1.00],[-34.66,59.40,1.00],[-154.06,-16.83,1.00],[108.59,24.75,1.00],[-145.34,-59.41,1.00],[-108.59,-24.75,1.00],[145.34,59.41,1.00],[-71.41,24.75,1.00],[34.66,-59.41,1.00],[71.41,-24.75,1.00],[-25.94,16.83,1.00],[154.06,16.83,1.00],[-100.89,26.49,1.00],[153.10,-9.74,1.00],[79.11,26.49,1.00],[-20.77,-61.51,1.00],[26.90,9.74,1.00],[20.77,61.51,1.00],[-26.90,-9.74,1.00],[159.23,-61.51,1.00],[-153.10,9.74,1.00],[-159.23,61.51,1.00],[100.89,-26.49,1.00],[-79.11,-26.49,1.00],[44.31,12.28,1.00],[17.30,44.36,1.00],[-135.69,12.28,1.00],[73.08,43.05,1.00],[162.70,-44.36,1.00],[-73.08,-43.05,1.00],[-162.70,44.36,1.00],[-106.92,43.05,1.00],[-17.30,-44.36,1.00],[106.92,-43.05,1.00],[-44.31,-12.28,1.00],[135.69,-12.28,1.00],[-169.08,-24.53,1.00],[-112.54,-63.29,1.00],[10.92,-24.53,1.00],[-114.93,-9.92,1.00],[-67.46,63.28,1.00],[114.93,9.92,1.00],[67.46,-63.29,1.00],[65.07,-9.92,1.00],[112.54,63.29,1.00],[-65.07,9.92,1.00],[169.08,24.53,1.00],[-10.92,24.53,1.00],[93.20,-57.39,1.00],[-57.43,-1.73,1.00],[-86.80,-57.39,1.00],[-177.95,32.55,1.00],[-122.57,1.73,1.00],[177.95,-32.55,1.00],[122.57,-1.73,1.00],[2.05,32.55,1.00],[57.43,1.73,1.00],[-2.05,-32.55,1.00],[-93.20,57.39,1.00],[86.80,57.39,1.00],[-17.59,3.04,1.00],[170.04,72.16,1.00],[162.41,3.04,1.00],[86.81,-17.56,1.00],[9.96,-72.16,1.00],[-86.81,17.56,1.00],[-9.96,72.16,1.00],[-93.19,-17.56,1.00],[-170.04,-72.16,1.00],[93.19,17.56,1.00],[17.59,-3.04,1.00],[-162.41,-3.04,1.00],[39.38,44.26,1.00],[56.93,33.61,1.00],[-140.62,44.26,1.00],[38.42,27.03,1.00],[123.07,-33.61,1.00],[-38.42,-27.03,1.00],[-123.07,33.61,1.00],[-141.58,27.03,1.00],[-56.93,-33.61,1.00],[141.58,-27.03,1.00],[-39.38,-44.26,1.00],[140.62,-44.26,1.00]],[[165.52,26.52,1.00],[63.39,-60.04,1.00],[-14.48,26.52,1.00],[-62.74,12.93,1.00],[116.61,60.04,1.00],[62.74,-12.93,1.00],[-116.61,-60.04,1.00],[117.26,12.93,1.00],[-63.39,60.04,1.00],[-117.26,-12.93,1.00],[-165.52,-26.52,1.00],[14.48,-26.52,1.00],[-150.22,-21.62,1.00],[-141.41,-53.79,1.00],[29.78,-21.62,1.00],[-114.55,-27.50,1.00],[-38.59,53.79,1.00],[114.55,27.50,1.00],[38.59,-53.79,1.00],[65.45,-27.50,1.00],[141.41,53.79,1.00],[-65.45,27.50,1.00],[150.22,21.62,1.00],[-29.78,21.62,1.00],[-163.47,81.91,1.00],[92.31,-7.75,1.00],[16.53,81.91,1.00],[-7.76,-2.29,1.00],[87.69,7.75,1.00],[7.76,2.29,1.00],[-87.69,-7.75,1.00],[172.24,-2.29,1.00],[-92.31,7.75,1.00],[-172.24,2.29,1.00],[163.47,-81.91,1.00],[-16.53,-81.91,1.00],[-79.91,-73.49,1.00],[-106.27,2.85,1.00],[100.09,-73.49,1.00],[177.03,-16.24,1.00],[-73.73,-2.85,1.00],[-177.03,16.24,1.00],[73.73,2.85,1.00],[-2.97,-16.24,1.00],[106.27,-2.85,1.00],[2.97,16.24,1.00],[79.91,73.49,1.00],[-100.09,73.49,1.00],[-43.19,73.63,1.00],[101.37,11.86,1.00],[136.81,73.63,1.00],[12.09,-11.12,1.00],[78.63,-11.86,1.00],[-12.09,11.12,1.00],[-78.63,11.86,1.00],[-167.91,-11.12,1.00],[-101.37,-11.86,1.00],[167.91,11.12,1.00],[43.19,-73.63,1.00],[-136.81,-73.63,1.00],[109.86,-34.83,1.00],[-36.50,-16.19,1.00],[-70.14,-34.83,1.00],[-153.97,50.53,1.00],[-143.50,16.19,1.00],[153.97,-50.53,1.00],[143.50,-16.19,1.00],[26.03,50.53,1.00],[36.50,16.19,1.00],[-26.03,-50.53,1.00],[-109.86,34.83,1.00],[70.14,34.83,1.00],[-23.31,-6.54,1.00],[-163.84,65.83,1.00],[156.69,-6.54,1.00],[97.12,-23.15,1.00],[-16.16,-65.83,1.00],[-97.12,23.15,1.00],[16.16,65.83,1.00],[-82.88,-23.15,1.00],[163.84,-65.83,1.00],[82.88,23.15,1.00],[23.31,6.54,1.00],[-156.69,6.54,1.00],[-0.87,-31.92,1.00],[-91.40,58.07,1.00],[179.13,-31.92,1.00],[121.93,-0.74,1.00],[-88.60,-58.07,1.00],[-121.93,0.74,1.00],[88.60,58.07,1.00],[-58.07,-0.74,1.00],[91.40,-58.07,1.00],[58.07,0.74,1.00],[0.87,31.92,1.00],[-179.13,31.92,1.00],[163.12,43.35,1.00],[72.90,-44.10,1.00],[-16.88,43.35,1.00],[-45.39,12.19,1.00],[107.10,44.10,1.00],[45.39,-12.19,1.00],[-107.10,-44.10,1.00],[134.61,12.19,1.00],[-72.90,44.10,1.00],[-134.61,-12.19,1.00],[-163.12,-43.35,1.00],[16.88,-43.35,1.00],[-114.23,50.37,1.00],[127.06,-15.17,1.00],[65.77,50.37,1.00],[-18.77,-35.57,1.00],[52.94,15.17,1.00],[18.77,35.57,1.00],[-52.94,-15.17,1.00],[161.23,-35.57,1.00],[-127.06,15.17,1.00],[-161.23,35.57,1.00],[114.23,-50.37,1.00],[-65.77,-50.37,1.00],[54.17,30.16,1.00],[35.63,30.41,1.00],[-125.83,30.16,1.00],[45.21,44.51,1.00],[144.37,-30.41,1.00],[-45.21,-44.51,1.00],[-144.37,30.41,1.00],[-134.79,44.51,1.00],[-35.63,-30.41,1.00],[134.79,-44.51,1.00],[-54.17,-30.16,1.00],[125.83,-30.16,1.00],[126.20,41.73,1.00],[47.86,-26.15,1.00],[-53.80,41.73,1.00],[-33.51,37.03,1.00],[132.14,26.15,1.00],[33.51,-37.03,1.00],[-132.14,-26.15,1.00],[146.49,37.03,1.00],[-47.86,26.15,1.00],[-146.49,-37.03,1.00],[-126.20,-41.73,1.00],[53.80,-41.73,1.00],[-161.75,20.38,1.00],[130.12,-62.91,1.00],[18.25,20.38,1.00],[-68.63,-17.07,1.00],[49.88,62.91,1.00],[68.63,17.07,1.00],[-49.88,-62.91,1.00],[111.37,-17.07,1.00],[-130.12,62.91,1.00],[-111.37,17.07,1.00],[161.75,-20.38,1.00],[-18.25,-20.38,1.00],[2.71,48.49,1.00],[87.60,41.45,1.00],[-177.29,48.49,1.00],[41.48,1.80,1.00],[92.40,-41.45,1.00],[-41.48,-1.80,1.00],[-92.40,41.45,1.00],[-138.52,1.80,1.00],[-87.60,-41.45,1.00],[138.52,-1.80,1.00],[-2.71,-48.49,1.00],[177.29,-48.49,1.00],[-98.15,-27.54,1.00],[-152.22,-7.22,1.00],[81.85,-27.54,1.00],[-164.79,-61.37,1.00],[-27.78,7.22,1.00],[164.79,61.37,1.00],[27.78,-7.22,1.00],[15.21,-61.37,1.00],[152.22,7.22,1.00],[-15.21,61.37,1.00],[98.15,27.54,1.00],[-81.85,27.54,1.00]],[[-40.48,43.36,1.00],[124.51,33.58,1.00],[139.52,43.36,1.00],[38.85,-28.17,1.00],[55.49,-33.58,1.00],[-38.85,28.17,1.00],[-55.49,33.58,1.00],[-141.15,-28.17,1.00],[-124.51,-33.58,1.00],[141.15,28.17,1.00],[40.48,-43.36,1.00],[-139.52,-43.36,1.00],[56.01,17.18,1.00],[20.46,32.29,1.00],[-123.99,17.18,1.00],[61.05,52.38,1.00],[159.54,-32.29,1.00],[-61.05,-52.38,1.00],[-159.54,32.29,1.00],[-118.95,52.38,1.00],[-20.46,-32.29,1.00],[118.95,-52.38,1.00],[-56.01,-17.18,1.00],[123.99,-17.18,1.00],[-179.51,-8.95,1.00],[-93.08,-81.04,1.00],[0.49,-8.95,1.00],[-98.95,-0.48,1.00],[-86.92,81.04,1.00],[98.95,0.48,1.00],[86.92,-81.04,1.00],[81.05,-0.48,1.00],[93.08,81.04,1.00],[-81.05,0.48,1.00],[179.51,8.95,1.00],[-0.49,8.95,1.00],[12.04,-13.56,1.00],[-49.15,71.95,1.00],[-167.96,-13.56,1.00],[103.85,11.70,1.00],[-130.85,-71.95,1.00],[-103.85,-11.70,1.00],[130.85,71.95,1.00],[-76.15,11.70,1.00],[49.15,-71.95,1.00],[76.15,-11.70,1.00],[-12.04,13.56,1.00],[167.96,13.56,1.00],[-13.62,-58.20,1.00],[-98.30,30.80,1.00],[166.38,-58.20,1.00],[148.93,-7.13,1.00],[-81.70,-30.80,1.00],[-148.93,7.13,1.00],[81.70,30.80,1.00],[-31.07,-7.13,1.00],[98.30,-30.80,1.00],[31.07,7.13,1.00],[13.62,58.20,1.00],[-166.38,58.20,1.00],[65.26,-20.55,1.00],[-22.43,23.07,1.00],[-114.74,-20.55,1.00],[131.85,58.26,1.00],[-157.57,-23.07,1.00],[-131.85,-58.26,1.00],[157.57,23.07,1.00],[-48.15,58.26,1.00],[22.43,-23.07,1.00],[48.15,-58.26,1.00],[-65.26,20.55,1.00],[114.74,20.55,1.00],[-135.39,26.50,1.00],[144.63,-39.58,1.00],[44.61,26.50,1.00],[-55.00,-38.94,1.00],[35.37,39.58,1.00],[55.00,38.94,1.00],[-35.37,-39.58,1.00],[125.00,-38.94,1.00],[-144.63,39.58,1.00],[-125.00,38.94,1.00],[135.39,-26.50,1.00],[-44.61,-26.50,1.00],[114.95,-4.75,1.00],[-5.23,-24.86,1.00],[-65.05,-4.75,1.00],[-101.14,64.63,1.00],[-174.77,24.86,1.00],[101.14,-64.63,1.00],[174.77,-24.86,1.00],[78.86,64.63,1.00],[5.23,24.86,1.00],[-78.86,-64.63,1.00],[-114.95,4.75,1.00],[65.05,4.75,1.00],[35.85,52.64,1.00],[65.91,29.46,1.00],[-144.15,52.64,1.00],[31.75,20.82,1.00],[114.09,-29.46,1.00],[-31.75,-20.82,1.00],[-114.09,29.46,1.00],[-148.25,20.82,1.00],[-65.91,-29.46,1.00],[148.25,-20.82,1.00],[-35.85,-52.64,1.00],[144.15,-52.64,1.00],[86.45,11.52,1.00],[11.54,3.48,1.00],[-93.55,11.52,1.00],[16.90,77.95,1.00],[168.46,-3.48,1.00],[-16.90,-77.95,1.00],[-168.46,3.48,1.00],[-163.10,77.95,1.00],[-11.54,-3.48,1.00],[163.10,-77.95,1.00],[-86.45,-11.52,1.00],[93.55,-11.52,1.00],[135.24,4.02,1.00],[5.69,-45.10,1.00],[-44.76,4.02,1.00],[-84.35,44.62,1.00],[174.31,45.10,1.00],[84.35,-44.62,1.00],[-174.31,-45.10,1.00],[95.65,44.62,1.00],[-5.69,45.10,1.00],[-95.65,-44.62,1.00],[-135.24,-4.02,1.00],[44.76,-4.02,1.00],[-129.84,-18.16,1.00],[-156.86,-37.50,1.00],[50.16,-18.16,1.00],[-117.12,-46.85,1.00],[-23.14,37.50,1.00],[117.12,46.85,1.00],[23.14,-37.50,1.00],[62.88,-46.85,1.00],[156.86,37.50,1.00],[-62.88,46.85,1.00],[129.84,18.16,1.00],[-50.16,18.16,1.00],[-74.10,32.87,1.00],[146.10,13.30,1.00],[105.90,32.87,1.00],[22.97,-53.88,1.00],[33.90,-13.30,1.00],[-22.97,53.88,1.00],[-33.90,13.30,1.00],[-157.03,-53.88,1.00],[-146.10,-13.30,1.00],[157.03,53.88,1.00],[74.10,-32.87,1.00],[-105.90,-32.87,1.00],[-119.92,-5.64,1.00],[-173.50,-29.76,1.00],[60.08,-5.64,1.00],[-101.20,-59.60,1.00],[-6.50,29.76,1.00],[101.20,59.60,1.00],[6.50,-29.76,1.00],[78.80,-59.60,1.00],[173.50,29.76,1.00],[-78.80,59.60,1.00],[119.92,5.64,1.00],[-60.08,5.64,1.00],[73.14,16.13,1.00],[16.82,16.18,1.00],[-106.86,16.13,1.00],[45.09,66.83,1.00],[163.18,-16.18,1.00],[-45.09,-66.83,1.00],[-163.18,16.18,1.00],[-134.91,66.83,1.00],[-16.82,-16.18,1.00],[134.91,-66.83,1.00],[-73.14,-16.13,1.00],[106.86,-16.13,1.00],[-11.70,-43.38,1.00],[-102.11,45.38,1.00],[168.30,-43.38,1.00],[133.98,-8.47,1.00],[-77.89,-45.38,1.00],[-133.98,8.47,1.00],[77.89,45.38,1.00],[-46.02,-8.47,1.00],[102.11,-45.38,1.00],[46.02,8.47,1.00],[11.70,43.38,1.00],[-168.30,43.38,1.00],[-24.11,3.73,1.00],[170.94,65.63,1.00],[155.89,3.73,1.00],[85.92,-24.05,1.00],[9.06,-65.63,1.00],[-85.92,24.05,1.00],[-9.06,65.63,1.00],[-94.08,-24.05,1.00],[-170.94,-65.63,1.00],[94.08,24.05,1.00],[24.11,-3.73,1.00],[-155.89,-3.73,1.00]],[[104.60,-3.68,1.00],[-3.81,-14.57,1.00],[-75.40,-3.68,1.00],[-104.32,74.95,1.00],[-176.19,14.57,1.00],[104.32,-74.95,1.00],[176.19,-14.57,1.00],[75.68,74.95,1.00],[3.81,14.57,1.00],[-75.68,-74.95,1.00],[-104.60,3.68,1.00],[75.40,3.68,1.00],[153.77,-30.33,1.00],[-52.93,-50.74,1.00],[-26.23,-30.33,1.00],[-123.11,22.43,1.00],[-127.07,50.74,1.00],[123.11,-22.43,1.00],[127.07,-50.74,1.00],[56.89,22.43,1.00],[52.93,50.74,1.00],[-56.89,-22.43,1.00],[-153.77,30.33,1.00],[26.23,30.33,1.00],[35.99,-39.77,1.00],[-54.77,38.45,1.00],[-144.01,-39.77,1.00],[135.81,26.85,1.00],[-125.23,-38.45,1.00],[-135.81,-26.85,1.00],[125.23,38.45,1.00],[-44.19,26.85,1.00],[54.77,-38.45,1.00],[44.19,-26.85,1.00],[-35.99,39.77,1.00],[144.01,39.77,1.00],[71.82,-25.43,1.00],[-26.58,16.37,1.00],[-108.18,-25.43,1.00],[146.72,59.10,1.00],[-153.42,-16.37,1.00],[-146.72,-59.10,1.00],[153.42,16.37,1.00],[-33.28,59.10,1.00],[26.58,-16.37,1.00],[33.28,-59.10,1.00],[-71.82,25.43,1.00],[108.18,25.43,1.00],[-136.55,26.52,1.00],[144.03,-40.51,1.00],[43.45,26.52,1.00],[-55.50,-37.97,1.00],[35.97,40.51,1.00],[55.50,37.97,1.00],[-35.97,-40.51,1.00],[124.50,-37.97,1.00],[-144.03,40.51,1.00],[-124.50,37.97,1.00],[136.55,-26.52,1.00],[-43.45,-26.52,1.00],[-6.52,-1.08,1.00],[-170.58,83.40,1.00],[173.48,-1.08,1.00],[91.09,-6.52,1.00],[-9.42,-83.40,1.00],[-91.09,6.52,1.00],[9.42,83.40,1.00],[-88.91,-6.52,1.00],[170.58,-83.40,1.00],[88.91,6.52,1.00],[6.52,1.08,1.00],[-173.48,1.08,1.00],[-71.13,40.38,1.00],[138.05,14.26,1.00],[108.87,40.38,1.00],[20.82,-46.12,1.00],[41.95,-14.26,1.00],[-20.82,46.12,1.00],[-41.95,14.26,1.00],[-159.18,-46.12,1.00],[-138.05,-14.26,1.00],[159.18,46.12,1.00],[71.13,-40.38,1.00],[-108.87,-40.38,1.00],[-153.97,-27.97,1.00],[-129.57,-52.52,1.00],[26.03,-27.97,1.00],[-120.59,-22.81,1.00],[-50.43,52.52,1.00],[120.59,22.81,1.00],[50.43,-52.52,1.00],[59.41,-22.81,1.00],[129.57,52.52,1.00],[-59.41,22.81,1.00],[153.97,27.97,1.00],[-26.03,27.97,1.00],[-80.23,13.48,1.00],[166.33,9.49,1.00],[99.77,13.48,1.00],[35.29,-73.41,1.00],[13.67,-9.49,1.00],[-35.29,73.41,1.00],[-13.67,9.49,1.00],[-144.71,-73.41,1.00],[-166.33,-9.49,1.00],[144.71,73.41,1.00],[80.23,-13.48,1.00],[-99.77,-13.48,1.00],[55.43,-9.00,1.00],[-10.89,34.09,1.00],[-124.57,-9.00,1.00],[105.60,54.41,1.00],[-169.11,-34.09,1.00],[-105.60,-54.41,1.00],[169.11,34.09,1.00],[-74.40,54.41,1.00],[10.89,-34.09,1.00],[74.40,-54.41,1.00],[-55.43,9.00,1.00],[124.57,9.00,1.00],[68.32,-7.14,1.00],[-7.68,21.51,1.00],[-111.68,-7.14,1.00],[108.74,67.22,1.00],[-172.32,-21.51,1.00],[-108.74,-67.22,1.00],[172.32,21.51,1.00],[-71.26,67.22,1.00],[7.68,-21.51,1.00],[71.26,-67.22,1.00],[-68.32,7.14,1.00],[111.68,7.14,1.00],[-174.97,36.12,1.00],[96.85,-53.58,1.00],[5.03,36.12,1.00],[-53.77,-4.06,1.00],[83.15,53.58,1.00],[53.77,4.06,1.00],[-83.15,-53.58,1.00],[126.23,-4.06,1.00],[-96.85,53.58,1.00],[-126.23,4.06,1.00],[174.97,-36.12,1.00],[-5.03,-36.12,1.00],[-149.91,16.26,1.00],[149.81,-56.16,1.00],[30.09,16.26,1.00],[-71.37,-28.77,1.00],[30.19,56.16,1.00],[71.37,28.77,1.00],[-30.19,-56.16,1.00],[108.63,-28.77,1.00],[-149.81,56.16,1.00],[-108.63,28.77,1.00],[149.91,-16.26,1.00],[-30.09,-16.26,1.00],[2.52,-51.45,1.00],[-87.99,38.50,1.00],[-177.48,-51.45,1.00],[141.48,1.57,1.00],[-92.01,-38.50,1.00],[-141.48,-1.57,1.00],[92.01,38.50,1.00],[-38.52,1.57,1.00],[87.99,-38.50,1.00],[38.52,-1.57,1.00],[-2.52,51.45,1.00],[177.48,51.45,1.00],[161.12,-9.98,1.00],[-28.54,-68.73,1.00],[-18.88,-9.98,1.00],[-100.54,18.59,1.00],[-151.46,68.73,1.00],[100.54,-18.59,1.00],[151.46,-68.73,1.00],[79.46,18.59,1.00],[28.54,68.73,1.00],[-79.46,-18.59,1.00],[-161.12,9.98,1.00],[18.88,9.98,1.00],[12.84,24.97,1.00],[64.49,62.11,1.00],[-167.16,24.97,1.00],[64.47,11.62,1.00],[115.51,-62.11,1.00],[-64.47,-11.62,1.00],[-115.51,62.11,1.00],[-115.53,11.62,1.00],[-64.49,-62.11,1.00],[115.53,-11.62,1.00],[-12.84,-24.97,1.00],[167.16,-24.97,1.00],[74.13,41.65,1.00],[42.76,11.79,1.00],[-105.87,41.65,1.00],[17.09,45.95,1.00],[137.24,-11.79,1.00],[-17.09,-45.95,1.00],[-137.24,11.79,1.00],[-162.91,45.95,1.00],[-42.76,-11.79,1.00],[162.91,-45.95,1.00],[-74.13,-41.65,1.00],[105.87,-41.65,1.00],[154.04,1.27,1.00],[2.90,-64.01,1.00],[-25.96,1.27,1.00],[-88.59,25.96,1.00],[177.10,64.01,1.00],[88.59,-25.96,1.00],[-177.10,-64.01,1.00],[91.41,25.96,1.00],[-2.90,64.01,1.00],[-91.41,-25.96,1.00],[-154.04,-1.27,1.00],[25.96,-1.27,1.00]],[[24.80,-10.46,1.00],[-23.76,63.21,1.00],[-155.20,-10.46,1.00],[101.50,24.36,1.00],[-156.24,-63.21,1.00],[-101.50,-24.36,1.00],[156.24,63.21,1.00],[-78.50,24.36,1.00],[23.76,-63.21,1.00],[78.50,-24.36,1.00],[-24.80,10.46,1.00],[155.20,10.46,1.00],[-134.64,65.44,1.00],[108.01,-16.98,1.00],[45.36,65.44,1.00],[-17.80,-17.20,1.00],[71.99,16.98,1.00],[17.80,17.20,1.00],[-71.99,-16.98,1.00],[162.20,-17.20,1.00],[-108.01,16.98,1.00],[-162.20,17.20,1.00],[134.64,-65.44,1.00],[-45.36,-65.44,1.00],[177.60,54.85,1.00],[88.31,-35.12,1.00],[-2.40,54.85,1.00],[-35.13,1.38,1.00],[91.69,35.12,1.00],[35.13,-1.38,1.00],[-91.69,-35.12,1.00],[144.87,1.38,1.00],[-88.31,35.12,1.00],[-144.87,-1.38,1.00],[-177.60,-54.85,1.00],[2.40,-54.85,1.00],[157.93,82.01,1.00],[86.98,-7.40,1.00],[-22.07,82.01,1.00],[-7.41,2.99,1.00],[93.02,7.40,1.00],[7.41,-2.99,1.00],[-93.02,-7.40,1.00],[172.59,2.99,1.00],[-86.98,7.40,1.00],[-172.59,-2.99,1.00],[-157.93,-82.01,1.00],[22.07,-82.01,1.00],[42.48,-13.21,1.00],[-19.17,45.89,1.00],[-137.52,-13.21,1.00],[107.66,41.11,1.00],[-160.83,-45.89,1.00],[-107.66,-41.11,1.00],[160.83,45.89,1.00],[-72.34,41.11,1.00],[19.17,-45.89,1.00],[72.34,-41.11,1.00],[-42.48,13.21,1.00],[137.52,13.21,1.00],[28.48,10.90,1.00],[21.99,59.68,1.00],[-151.52,10.90,1.00],[77.65,27.92,1.00],[158.01,-59.68,1.00],[-77.65,-27.92,1.00],[-158.01,59.68,1.00],[-102.35,27.92,1.00],[-21.99,-59.68,1.00],[102.35,-27.92,1.00],[-28.48,-10.90,1.00],[151.52,-10.90,1.00],[-33.79,21.61,1.00],[144.53,50.59,1.00],[146.21,21.61,1.00],[64.51,-31.14,1.00],[35.47,-50.59,1.00],[-64.51,31.14,1.00],[-35.47,50.59,1.00],[-115.49,-31.14,1.00],[-144.53,-50.59,1.00],[115.49,31.14,1.00],[33.79,-21.61,1.00],[-146.21,-21.61,1.00],[-175.53,-31.74,1.00],[-97.19,-57.98,1.00],[4.47,-31.74,1.00],[-121.82,-3.80,1.00],[-82.81,57.98,1.00],[121.82,3.80,1.00],[82.81,-57.98,1.00],[58.18,-3.80,1.00],[97.19,57.98,1.00],[-58.18,3.80,1.00],[175.53,31.74,1.00],[-4.47,31.74,1.00],[89.40,19.43,1.00],[19.43,0.56,1.00],[-90.60,19.43,1.00],[1.69,70.56,1.00],[160.57,-0.56,1.00],[-1.69,-70.56,1.00],[-160.57,0.56,1.00],[-178.31,70.56,1.00],[-19.43,-0.56,1.00],[178.31,-70.56,1.00],[-89.40,-19.43,1.00],[90.60,-19.43,1.00],[-27.28,-27.88,1.00],[-130.91,51.78,1.00],[152.72,-27.88,1.00],[120.76,-23.90,1.00],[-49.09,-51.78,1.00],[-120.76,23.90,1.00],[49.09,51.78,1.00],[-59.24,-23.90,1.00],[130.91,-51.78,1.00],[59.24,23.90,1.00],[27.28,27.88,1.00],[-152.72,27.88,1.00],[139.90,-15.44,1.00],[-23.21,-47.50,1.00],[-40.10,-15.44,1.00],[-109.85,38.38,1.00],[-156.79,47.50,1.00],[109.85,-38.38,1.00],[156.79,-47.50,1.00],[70.15,38.38,1.00],[23.21,47.50,1.00],[-70.15,-38.38,1.00],[-139.90,15.44,1.00],[40.10,15.44,1.00],[-2.17,-43.33,1.00],[-92.29,46.62,1.00],[177.83,-43.33,1.00],[133.35,-1.58,1.00],[-87.71,-46.62,1.00],[-133.35,1.58,1.00],[87.71,46.62,1.00],[-46.65,-1.58,1.00],[92.29,-46.62,1.00],[46.65,1.58,1.00],[2.17,43.33,1.00],[-177.83,43.33,1.00],[41.12,27.96,1.00],[38.91,41.71,1.00],[-138.88,27.96,1.00],[54.83,35.51,1.00],[141.09,-41.71,1.00],[-54.83,-35.51,1.00],[-141.09,41.71,1.00],[-125.17,35.51,1.00],[-38.91,-41.71,1.00],[125.17,-35.51,1.00],[-41.12,-27.96,1.00],[138.88,-27.96,1.00],[-126.67,13.75,1.00],[163.04,-35.46,1.00],[53.33,13.75,1.00],[-67.73,-51.18,1.00],[16.96,35.46,1.00],[67.73,51.18,1.00],[-16.96,-35.46,1.00],[112.27,-51.18,1.00],[-163.04,35.46,1.00],[-112.27,51.18,1.00],[126.67,-13.75,1.00],[-53.33,-13.75,1.00],[6.02,-15.42,1.00],[-69.18,73.47,1.00],[-173.98,-15.42,1.00],[105.51,5.80,1.00],[-110.82,-73.47,1.00],[-105.51,-5.80,1.00],[110.82,73.47,1.00],[-74.49,5.80,1.00],[69.18,-73.47,1.00],[74.49,-5.80,1.00],[-6.02,15.42,1.00],[173.98,15.42,1.00],[160.08,33.45,1.00],[62.71,-51.67,1.00],[-19.92,33.45,1.00],[-54.90,16.52,1.00],[117.29,51.67,1.00],[54.90,-16.52,1.00],[-117.29,-51.67,1.00],[125.10,16.52,1.00],[-62.71,51.67,1.00],[-125.10,-16.52,1.00],[-160.08,-33.45,1.00],[19.92,-33.45,1.00],[80.34,6.51,1.00],[6.61,9.59,1.00],[-99.66,6.51,1.00],[55.76,78.37,1.00],[173.39,-9.59,1.00],[-55.76,-78.37,1.00],[-173.39,9.59,1.00],[-124.24,78.37,1.00],[-6.61,-9.59,1.00],[124.24,-78.37,1.00],[-80.34,-6.51,1.00],[99.66,-6.51,1.00],[6.25,24.64,1.00],[76.64,64.63,1.00],[-173.75,24.64,1.00],[65.23,5.68,1.00],[103.36,-64.63,1.00],[-65.23,-5.68,1.00],[-103.36,64.63,1.00],[-114.77,5.68,1.00],[-76.64,-64.63,1.00],[114.77,-5.68,1.00],[-6.25,-24.64,1.00],[173.75,-24.64,1.00],[51.41,-63.45,1.00],[-68.67,16.19,1.00],[-128.59,-63.45,1.00],[162.69,20.45,1.00],[-111.33,-16.19,1.00],[-162.69,-20.45,1.00],[111.33,16.19,1.00],[-17.31,20.45,1.00],[68.67,-16.19,1.00],[17.31,-20.45,1.00],[-51.41,63.45,1.00],[128.59,63.45,1.00],[-50.60,28.85,1.00],[144.51,33.77,1.00],[129.40,28.85,1.00],[49.04,-42.60,1.00],[35.49,-33.77,1.00],[-49.04,42.60,1.00],[-35.49,33.77,1.00],[-130.96,-42.60,1.00],[-144.51,-33.77,1.00],[130.96,42.60,1.00],[50.60,-28.85,1.00],[-129.40,-28.85,1.00]]];// [dirs(:,1), dirs(:,2)] = cart2sph(vecs(:,1), vecs(:,2), vecs(:,3));\nvar dirs=speakerPos[degree-1];return dirs;}// exports\nmodule.exports.getAmbisonicDecMtx=getAmbisonicDecMtx;module.exports.getTdesign=getTdesign;module.exports.deg2rad=deg2rad;module.exports.rad2deg=rad2deg;module.exports.createNearestLookup=createNearestLookup;module.exports.findNearest=findNearest;\n\n},{\"convex-hull\":38,\"numeric\":67,\"spherical-harmonic-transform\":98}],18:[function(require,module,exports){\nmodule.exports = { \"default\": require(\"core-js/library/fn/object/define-property\"), __esModule: true };\n},{\"core-js/library/fn/object/define-property\":21}],19:[function(require,module,exports){\n\"use strict\";\n\nexports.__esModule = true;\n\nexports.default = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n},{}],20:[function(require,module,exports){\n\"use strict\";\n\nexports.__esModule = true;\n\nvar _defineProperty = require(\"../core-js/object/define-property\");\n\nvar _defineProperty2 = _interopRequireDefault(_defineProperty);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      (0, _defineProperty2.default)(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n}();\n},{\"../core-js/object/define-property\":18}],21:[function(require,module,exports){\nrequire('../../modules/es6.object.define-property');\nvar $Object = require('../../modules/_core').Object;\nmodule.exports = function defineProperty(it, key, desc){\n  return $Object.defineProperty(it, key, desc);\n};\n},{\"../../modules/_core\":24,\"../../modules/es6.object.define-property\":37}],22:[function(require,module,exports){\nmodule.exports = function(it){\n  if(typeof it != 'function')throw TypeError(it + ' is not a function!');\n  return it;\n};\n},{}],23:[function(require,module,exports){\nvar isObject = require('./_is-object');\nmodule.exports = function(it){\n  if(!isObject(it))throw TypeError(it + ' is not an object!');\n  return it;\n};\n},{\"./_is-object\":33}],24:[function(require,module,exports){\nvar core = module.exports = {version: '2.4.0'};\nif(typeof __e == 'number')__e = core; // eslint-disable-line no-undef\n},{}],25:[function(require,module,exports){\n// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function(fn, that, length){\n  aFunction(fn);\n  if(that === undefined)return fn;\n  switch(length){\n    case 1: return function(a){\n      return fn.call(that, a);\n    };\n    case 2: return function(a, b){\n      return fn.call(that, a, b);\n    };\n    case 3: return function(a, b, c){\n      return fn.call(that, a, b, c);\n    };\n  }\n  return function(/* ...args */){\n    return fn.apply(that, arguments);\n  };\n};\n},{\"./_a-function\":22}],26:[function(require,module,exports){\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function(){\n  return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7;\n});\n},{\"./_fails\":29}],27:[function(require,module,exports){\nvar isObject = require('./_is-object')\n  , document = require('./_global').document\n  // in old IE typeof document.createElement is 'object'\n  , is = isObject(document) && isObject(document.createElement);\nmodule.exports = function(it){\n  return is ? document.createElement(it) : {};\n};\n},{\"./_global\":30,\"./_is-object\":33}],28:[function(require,module,exports){\nvar global    = require('./_global')\n  , core      = require('./_core')\n  , ctx       = require('./_ctx')\n  , hide      = require('./_hide')\n  , PROTOTYPE = 'prototype';\n\nvar $export = function(type, name, source){\n  var IS_FORCED = type & $export.F\n    , IS_GLOBAL = type & $export.G\n    , IS_STATIC = type & $export.S\n    , IS_PROTO  = type & $export.P\n    , IS_BIND   = type & $export.B\n    , IS_WRAP   = type & $export.W\n    , exports   = IS_GLOBAL ? core : core[name] || (core[name] = {})\n    , expProto  = exports[PROTOTYPE]\n    , target    = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]\n    , key, own, out;\n  if(IS_GLOBAL)source = name;\n  for(key in source){\n    // contains in native\n    own = !IS_FORCED && target && target[key] !== undefined;\n    if(own && key in exports)continue;\n    // export native or passed\n    out = own ? target[key] : source[key];\n    // prevent global pollution for namespaces\n    exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]\n    // bind timers to global for call from export context\n    : IS_BIND && own ? ctx(out, global)\n    // wrap global constructors for prevent change them in library\n    : IS_WRAP && target[key] == out ? (function(C){\n      var F = function(a, b, c){\n        if(this instanceof C){\n          switch(arguments.length){\n            case 0: return new C;\n            case 1: return new C(a);\n            case 2: return new C(a, b);\n          } return new C(a, b, c);\n        } return C.apply(this, arguments);\n      };\n      F[PROTOTYPE] = C[PROTOTYPE];\n      return F;\n    // make static versions for prototype methods\n    })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n    // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%\n    if(IS_PROTO){\n      (exports.virtual || (exports.virtual = {}))[key] = out;\n      // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%\n      if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out);\n    }\n  }\n};\n// type bitmap\n$export.F = 1;   // forced\n$export.G = 2;   // global\n$export.S = 4;   // static\n$export.P = 8;   // proto\n$export.B = 16;  // bind\n$export.W = 32;  // wrap\n$export.U = 64;  // safe\n$export.R = 128; // real proto method for `library` \nmodule.exports = $export;\n},{\"./_core\":24,\"./_ctx\":25,\"./_global\":30,\"./_hide\":31}],29:[function(require,module,exports){\nmodule.exports = function(exec){\n  try {\n    return !!exec();\n  } catch(e){\n    return true;\n  }\n};\n},{}],30:[function(require,module,exports){\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n  ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();\nif(typeof __g == 'number')__g = global; // eslint-disable-line no-undef\n},{}],31:[function(require,module,exports){\nvar dP         = require('./_object-dp')\n  , createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function(object, key, value){\n  return dP.f(object, key, createDesc(1, value));\n} : function(object, key, value){\n  object[key] = value;\n  return object;\n};\n},{\"./_descriptors\":26,\"./_object-dp\":34,\"./_property-desc\":35}],32:[function(require,module,exports){\nmodule.exports = !require('./_descriptors') && !require('./_fails')(function(){\r\n  return Object.defineProperty(require('./_dom-create')('div'), 'a', {get: function(){ return 7; }}).a != 7;\r\n});\n},{\"./_descriptors\":26,\"./_dom-create\":27,\"./_fails\":29}],33:[function(require,module,exports){\nmodule.exports = function(it){\n  return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n},{}],34:[function(require,module,exports){\nvar anObject       = require('./_an-object')\n  , IE8_DOM_DEFINE = require('./_ie8-dom-define')\n  , toPrimitive    = require('./_to-primitive')\n  , dP             = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes){\n  anObject(O);\n  P = toPrimitive(P, true);\n  anObject(Attributes);\n  if(IE8_DOM_DEFINE)try {\n    return dP(O, P, Attributes);\n  } catch(e){ /* empty */ }\n  if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!');\n  if('value' in Attributes)O[P] = Attributes.value;\n  return O;\n};\n},{\"./_an-object\":23,\"./_descriptors\":26,\"./_ie8-dom-define\":32,\"./_to-primitive\":36}],35:[function(require,module,exports){\nmodule.exports = function(bitmap, value){\n  return {\n    enumerable  : !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable    : !(bitmap & 4),\n    value       : value\n  };\n};\n},{}],36:[function(require,module,exports){\n// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function(it, S){\n  if(!isObject(it))return it;\n  var fn, val;\n  if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;\n  if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val;\n  if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n},{\"./_is-object\":33}],37:[function(require,module,exports){\nvar $export = require('./_export');\r\n// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)\r\n$export($export.S + $export.F * !require('./_descriptors'), 'Object', {defineProperty: require('./_object-dp').f});\n},{\"./_descriptors\":26,\"./_export\":28,\"./_object-dp\":34}],38:[function(require,module,exports){\n\"use strict\"\n\nvar convexHull1d = require('./lib/ch1d')\nvar convexHull2d = require('./lib/ch2d')\nvar convexHullnd = require('./lib/chnd')\n\nmodule.exports = convexHull\n\nfunction convexHull(points) {\n  var n = points.length\n  if(n === 0) {\n    return []\n  } else if(n === 1) {\n    return [[0]]\n  }\n  var d = points[0].length\n  if(d === 0) {\n    return []\n  } else if(d === 1) {\n    return convexHull1d(points)\n  } else if(d === 2) {\n    return convexHull2d(points)\n  }\n  return convexHullnd(points, d)\n}\n},{\"./lib/ch1d\":39,\"./lib/ch2d\":40,\"./lib/chnd\":41}],39:[function(require,module,exports){\n\"use strict\"\n\nmodule.exports = convexHull1d\n\nfunction convexHull1d(points) {\n  var lo = 0\n  var hi = 0\n  for(var i=1; i<points.length; ++i) {\n    if(points[i][0] < points[lo][0]) {\n      lo = i\n    }\n    if(points[i][0] > points[hi][0]) {\n      hi = i\n    }\n  }\n  if(lo < hi) {\n    return [[lo], [hi]]\n  } else if(lo > hi) {\n    return [[hi], [lo]]\n  } else {\n    return [[lo]]\n  }\n}\n},{}],40:[function(require,module,exports){\n'use strict'\n\nmodule.exports = convexHull2D\n\nvar monotoneHull = require('monotone-convex-hull-2d')\n\nfunction convexHull2D(points) {\n  var hull = monotoneHull(points)\n  var h = hull.length\n  if(h <= 2) {\n    return []\n  }\n  var edges = new Array(h)\n  var a = hull[h-1]\n  for(var i=0; i<h; ++i) {\n    var b = hull[i]\n    edges[i] = [a,b]\n    a = b\n  }\n  return edges\n}\n\n},{\"monotone-convex-hull-2d\":59}],41:[function(require,module,exports){\n'use strict'\n\nmodule.exports = convexHullnD\n\nvar ich = require('incremental-convex-hull')\nvar aff = require('affine-hull')\n\nfunction permute(points, front) {\n  var n = points.length\n  var npoints = new Array(n)\n  for(var i=0; i<front.length; ++i) {\n    npoints[i] = points[front[i]]\n  }\n  var ptr = front.length\n  for(var i=0; i<n; ++i) {\n    if(front.indexOf(i) < 0) {\n      npoints[ptr++] = points[i]\n    }\n  }\n  return npoints\n}\n\nfunction invPermute(cells, front) {\n  var nc = cells.length\n  var nf = front.length\n  for(var i=0; i<nc; ++i) {\n    var c = cells[i]\n    for(var j=0; j<c.length; ++j) {\n      var x = c[j]\n      if(x < nf) {\n        c[j] = front[x]\n      } else {\n        x = x - nf\n        for(var k=0; k<nf; ++k) {\n          if(x >= front[k]) {\n            x += 1\n          }\n        }\n        c[j] = x\n      }\n    }\n  }\n  return cells\n}\n\nfunction convexHullnD(points, d) {\n  try {\n    return ich(points, true)\n  } catch(e) {\n    //If point set is degenerate, try to find a basis and rerun it\n    var ah = aff(points)\n    if(ah.length <= d) {\n      //No basis, no try\n      return []\n    }\n    var npoints = permute(points, ah)\n    var nhull   = ich(npoints, true)\n    return invPermute(nhull, ah)\n  }\n}\n},{\"affine-hull\":42,\"incremental-convex-hull\":49}],42:[function(require,module,exports){\n'use strict'\n\nmodule.exports = affineHull\n\nvar orient = require('robust-orientation')\n\nfunction linearlyIndependent(points, d) {\n  var nhull = new Array(d+1)\n  for(var i=0; i<points.length; ++i) {\n    nhull[i] = points[i]\n  }\n  for(var i=0; i<=points.length; ++i) {\n    for(var j=points.length; j<=d; ++j) {\n      var x = new Array(d)\n      for(var k=0; k<d; ++k) {\n        x[k] = Math.pow(j+1-i, k)\n      }\n      nhull[j] = x\n    }\n    var o = orient.apply(void 0, nhull)\n    if(o) {\n      return true\n    }\n  }\n  return false\n}\n\nfunction affineHull(points) {\n  var n = points.length\n  if(n === 0) {\n    return []\n  }\n  if(n === 1) {\n    return [0]\n  }\n  var d = points[0].length\n  var frame = [ points[0] ]\n  var index = [ 0 ]\n  for(var i=1; i<n; ++i) {\n    frame.push(points[i])\n    if(!linearlyIndependent(frame, d)) {\n      frame.pop()\n      continue\n    }\n    index.push(i)\n    if(index.length === d+1) {\n      return index\n    }\n  }\n  return index\n}\n},{\"robust-orientation\":48}],43:[function(require,module,exports){\n\"use strict\"\n\nmodule.exports = fastTwoSum\n\nfunction fastTwoSum(a, b, result) {\n\tvar x = a + b\n\tvar bv = x - a\n\tvar av = x - bv\n\tvar br = b - bv\n\tvar ar = a - av\n\tif(result) {\n\t\tresult[0] = ar + br\n\t\tresult[1] = x\n\t\treturn result\n\t}\n\treturn [ar+br, x]\n}\n},{}],44:[function(require,module,exports){\n\"use strict\"\n\nvar twoProduct = require(\"two-product\")\nvar twoSum = require(\"two-sum\")\n\nmodule.exports = scaleLinearExpansion\n\nfunction scaleLinearExpansion(e, scale) {\n  var n = e.length\n  if(n === 1) {\n    var ts = twoProduct(e[0], scale)\n    if(ts[0]) {\n      return ts\n    }\n    return [ ts[1] ]\n  }\n  var g = new Array(2 * n)\n  var q = [0.1, 0.1]\n  var t = [0.1, 0.1]\n  var count = 0\n  twoProduct(e[0], scale, q)\n  if(q[0]) {\n    g[count++] = q[0]\n  }\n  for(var i=1; i<n; ++i) {\n    twoProduct(e[i], scale, t)\n    var pq = q[1]\n    twoSum(pq, t[0], q)\n    if(q[0]) {\n      g[count++] = q[0]\n    }\n    var a = t[1]\n    var b = q[1]\n    var x = a + b\n    var bv = x - a\n    var y = b - bv\n    q[1] = x\n    if(y) {\n      g[count++] = y\n    }\n  }\n  if(q[1]) {\n    g[count++] = q[1]\n  }\n  if(count === 0) {\n    g[count++] = 0.0\n  }\n  g.length = count\n  return g\n}\n},{\"two-product\":47,\"two-sum\":43}],45:[function(require,module,exports){\n\"use strict\"\n\nmodule.exports = robustSubtract\n\n//Easy case: Add two scalars\nfunction scalarScalar(a, b) {\n  var x = a + b\n  var bv = x - a\n  var av = x - bv\n  var br = b - bv\n  var ar = a - av\n  var y = ar + br\n  if(y) {\n    return [y, x]\n  }\n  return [x]\n}\n\nfunction robustSubtract(e, f) {\n  var ne = e.length|0\n  var nf = f.length|0\n  if(ne === 1 && nf === 1) {\n    return scalarScalar(e[0], -f[0])\n  }\n  var n = ne + nf\n  var g = new Array(n)\n  var count = 0\n  var eptr = 0\n  var fptr = 0\n  var abs = Math.abs\n  var ei = e[eptr]\n  var ea = abs(ei)\n  var fi = -f[fptr]\n  var fa = abs(fi)\n  var a, b\n  if(ea < fa) {\n    b = ei\n    eptr += 1\n    if(eptr < ne) {\n      ei = e[eptr]\n      ea = abs(ei)\n    }\n  } else {\n    b = fi\n    fptr += 1\n    if(fptr < nf) {\n      fi = -f[fptr]\n      fa = abs(fi)\n    }\n  }\n  if((eptr < ne && ea < fa) || (fptr >= nf)) {\n    a = ei\n    eptr += 1\n    if(eptr < ne) {\n      ei = e[eptr]\n      ea = abs(ei)\n    }\n  } else {\n    a = fi\n    fptr += 1\n    if(fptr < nf) {\n      fi = -f[fptr]\n      fa = abs(fi)\n    }\n  }\n  var x = a + b\n  var bv = x - a\n  var y = b - bv\n  var q0 = y\n  var q1 = x\n  var _x, _bv, _av, _br, _ar\n  while(eptr < ne && fptr < nf) {\n    if(ea < fa) {\n      a = ei\n      eptr += 1\n      if(eptr < ne) {\n        ei = e[eptr]\n        ea = abs(ei)\n      }\n    } else {\n      a = fi\n      fptr += 1\n      if(fptr < nf) {\n        fi = -f[fptr]\n        fa = abs(fi)\n      }\n    }\n    b = q0\n    x = a + b\n    bv = x - a\n    y = b - bv\n    if(y) {\n      g[count++] = y\n    }\n    _x = q1 + x\n    _bv = _x - q1\n    _av = _x - _bv\n    _br = x - _bv\n    _ar = q1 - _av\n    q0 = _ar + _br\n    q1 = _x\n  }\n  while(eptr < ne) {\n    a = ei\n    b = q0\n    x = a + b\n    bv = x - a\n    y = b - bv\n    if(y) {\n      g[count++] = y\n    }\n    _x = q1 + x\n    _bv = _x - q1\n    _av = _x - _bv\n    _br = x - _bv\n    _ar = q1 - _av\n    q0 = _ar + _br\n    q1 = _x\n    eptr += 1\n    if(eptr < ne) {\n      ei = e[eptr]\n    }\n  }\n  while(fptr < nf) {\n    a = fi\n    b = q0\n    x = a + b\n    bv = x - a\n    y = b - bv\n    if(y) {\n      g[count++] = y\n    } \n    _x = q1 + x\n    _bv = _x - q1\n    _av = _x - _bv\n    _br = x - _bv\n    _ar = q1 - _av\n    q0 = _ar + _br\n    q1 = _x\n    fptr += 1\n    if(fptr < nf) {\n      fi = -f[fptr]\n    }\n  }\n  if(q0) {\n    g[count++] = q0\n  }\n  if(q1) {\n    g[count++] = q1\n  }\n  if(!count) {\n    g[count++] = 0.0  \n  }\n  g.length = count\n  return g\n}\n},{}],46:[function(require,module,exports){\n\"use strict\"\n\nmodule.exports = linearExpansionSum\n\n//Easy case: Add two scalars\nfunction scalarScalar(a, b) {\n  var x = a + b\n  var bv = x - a\n  var av = x - bv\n  var br = b - bv\n  var ar = a - av\n  var y = ar + br\n  if(y) {\n    return [y, x]\n  }\n  return [x]\n}\n\nfunction linearExpansionSum(e, f) {\n  var ne = e.length|0\n  var nf = f.length|0\n  if(ne === 1 && nf === 1) {\n    return scalarScalar(e[0], f[0])\n  }\n  var n = ne + nf\n  var g = new Array(n)\n  var count = 0\n  var eptr = 0\n  var fptr = 0\n  var abs = Math.abs\n  var ei = e[eptr]\n  var ea = abs(ei)\n  var fi = f[fptr]\n  var fa = abs(fi)\n  var a, b\n  if(ea < fa) {\n    b = ei\n    eptr += 1\n    if(eptr < ne) {\n      ei = e[eptr]\n      ea = abs(ei)\n    }\n  } else {\n    b = fi\n    fptr += 1\n    if(fptr < nf) {\n      fi = f[fptr]\n      fa = abs(fi)\n    }\n  }\n  if((eptr < ne && ea < fa) || (fptr >= nf)) {\n    a = ei\n    eptr += 1\n    if(eptr < ne) {\n      ei = e[eptr]\n      ea = abs(ei)\n    }\n  } else {\n    a = fi\n    fptr += 1\n    if(fptr < nf) {\n      fi = f[fptr]\n      fa = abs(fi)\n    }\n  }\n  var x = a + b\n  var bv = x - a\n  var y = b - bv\n  var q0 = y\n  var q1 = x\n  var _x, _bv, _av, _br, _ar\n  while(eptr < ne && fptr < nf) {\n    if(ea < fa) {\n      a = ei\n      eptr += 1\n      if(eptr < ne) {\n        ei = e[eptr]\n        ea = abs(ei)\n      }\n    } else {\n      a = fi\n      fptr += 1\n      if(fptr < nf) {\n        fi = f[fptr]\n        fa = abs(fi)\n      }\n    }\n    b = q0\n    x = a + b\n    bv = x - a\n    y = b - bv\n    if(y) {\n      g[count++] = y\n    }\n    _x = q1 + x\n    _bv = _x - q1\n    _av = _x - _bv\n    _br = x - _bv\n    _ar = q1 - _av\n    q0 = _ar + _br\n    q1 = _x\n  }\n  while(eptr < ne) {\n    a = ei\n    b = q0\n    x = a + b\n    bv = x - a\n    y = b - bv\n    if(y) {\n      g[count++] = y\n    }\n    _x = q1 + x\n    _bv = _x - q1\n    _av = _x - _bv\n    _br = x - _bv\n    _ar = q1 - _av\n    q0 = _ar + _br\n    q1 = _x\n    eptr += 1\n    if(eptr < ne) {\n      ei = e[eptr]\n    }\n  }\n  while(fptr < nf) {\n    a = fi\n    b = q0\n    x = a + b\n    bv = x - a\n    y = b - bv\n    if(y) {\n      g[count++] = y\n    } \n    _x = q1 + x\n    _bv = _x - q1\n    _av = _x - _bv\n    _br = x - _bv\n    _ar = q1 - _av\n    q0 = _ar + _br\n    q1 = _x\n    fptr += 1\n    if(fptr < nf) {\n      fi = f[fptr]\n    }\n  }\n  if(q0) {\n    g[count++] = q0\n  }\n  if(q1) {\n    g[count++] = q1\n  }\n  if(!count) {\n    g[count++] = 0.0  \n  }\n  g.length = count\n  return g\n}\n},{}],47:[function(require,module,exports){\n\"use strict\"\n\nmodule.exports = twoProduct\n\nvar SPLITTER = +(Math.pow(2, 27) + 1.0)\n\nfunction twoProduct(a, b, result) {\n  var x = a * b\n\n  var c = SPLITTER * a\n  var abig = c - a\n  var ahi = c - abig\n  var alo = a - ahi\n\n  var d = SPLITTER * b\n  var bbig = d - b\n  var bhi = d - bbig\n  var blo = b - bhi\n\n  var err1 = x - (ahi * bhi)\n  var err2 = err1 - (alo * bhi)\n  var err3 = err2 - (ahi * blo)\n\n  var y = alo * blo - err3\n\n  if(result) {\n    result[0] = y\n    result[1] = x\n    return result\n  }\n\n  return [ y, x ]\n}\n},{}],48:[function(require,module,exports){\n\"use strict\"\n\nvar twoProduct = require(\"two-product\")\nvar robustSum = require(\"robust-sum\")\nvar robustScale = require(\"robust-scale\")\nvar robustSubtract = require(\"robust-subtract\")\n\nvar NUM_EXPAND = 5\n\nvar EPSILON     = 1.1102230246251565e-16\nvar ERRBOUND3   = (3.0 + 16.0 * EPSILON) * EPSILON\nvar ERRBOUND4   = (7.0 + 56.0 * EPSILON) * EPSILON\n\nfunction cofactor(m, c) {\n  var result = new Array(m.length-1)\n  for(var i=1; i<m.length; ++i) {\n    var r = result[i-1] = new Array(m.length-1)\n    for(var j=0,k=0; j<m.length; ++j) {\n      if(j === c) {\n        continue\n      }\n      r[k++] = m[i][j]\n    }\n  }\n  return result\n}\n\nfunction matrix(n) {\n  var result = new Array(n)\n  for(var i=0; i<n; ++i) {\n    result[i] = new Array(n)\n    for(var j=0; j<n; ++j) {\n      result[i][j] = [\"m\", j, \"[\", (n-i-1), \"]\"].join(\"\")\n    }\n  }\n  return result\n}\n\nfunction sign(n) {\n  if(n & 1) {\n    return \"-\"\n  }\n  return \"\"\n}\n\nfunction generateSum(expr) {\n  if(expr.length === 1) {\n    return expr[0]\n  } else if(expr.length === 2) {\n    return [\"sum(\", expr[0], \",\", expr[1], \")\"].join(\"\")\n  } else {\n    var m = expr.length>>1\n    return [\"sum(\", generateSum(expr.slice(0, m)), \",\", generateSum(expr.slice(m)), \")\"].join(\"\")\n  }\n}\n\nfunction determinant(m) {\n  if(m.length === 2) {\n    return [[\"sum(prod(\", m[0][0], \",\", m[1][1], \"),prod(-\", m[0][1], \",\", m[1][0], \"))\"].join(\"\")]\n  } else {\n    var expr = []\n    for(var i=0; i<m.length; ++i) {\n      expr.push([\"scale(\", generateSum(determinant(cofactor(m, i))), \",\", sign(i), m[0][i], \")\"].join(\"\"))\n    }\n    return expr\n  }\n}\n\nfunction orientation(n) {\n  var pos = []\n  var neg = []\n  var m = matrix(n)\n  var args = []\n  for(var i=0; i<n; ++i) {\n    if((i&1)===0) {\n      pos.push.apply(pos, determinant(cofactor(m, i)))\n    } else {\n      neg.push.apply(neg, determinant(cofactor(m, i)))\n    }\n    args.push(\"m\" + i)\n  }\n  var posExpr = generateSum(pos)\n  var negExpr = generateSum(neg)\n  var funcName = \"orientation\" + n + \"Exact\"\n  var code = [\"function \", funcName, \"(\", args.join(), \"){var p=\", posExpr, \",n=\", negExpr, \",d=sub(p,n);\\\nreturn d[d.length-1];};return \", funcName].join(\"\")\n  var proc = new Function(\"sum\", \"prod\", \"scale\", \"sub\", code)\n  return proc(robustSum, twoProduct, robustScale, robustSubtract)\n}\n\nvar orientation3Exact = orientation(3)\nvar orientation4Exact = orientation(4)\n\nvar CACHED = [\n  function orientation0() { return 0 },\n  function orientation1() { return 0 },\n  function orientation2(a, b) { \n    return b[0] - a[0]\n  },\n  function orientation3(a, b, c) {\n    var l = (a[1] - c[1]) * (b[0] - c[0])\n    var r = (a[0] - c[0]) * (b[1] - c[1])\n    var det = l - r\n    var s\n    if(l > 0) {\n      if(r <= 0) {\n        return det\n      } else {\n        s = l + r\n      }\n    } else if(l < 0) {\n      if(r >= 0) {\n        return det\n      } else {\n        s = -(l + r)\n      }\n    } else {\n      return det\n    }\n    var tol = ERRBOUND3 * s\n    if(det >= tol || det <= -tol) {\n      return det\n    }\n    return orientation3Exact(a, b, c)\n  },\n  function orientation4(a,b,c,d) {\n    var adx = a[0] - d[0]\n    var bdx = b[0] - d[0]\n    var cdx = c[0] - d[0]\n    var ady = a[1] - d[1]\n    var bdy = b[1] - d[1]\n    var cdy = c[1] - d[1]\n    var adz = a[2] - d[2]\n    var bdz = b[2] - d[2]\n    var cdz = c[2] - d[2]\n    var bdxcdy = bdx * cdy\n    var cdxbdy = cdx * bdy\n    var cdxady = cdx * ady\n    var adxcdy = adx * cdy\n    var adxbdy = adx * bdy\n    var bdxady = bdx * ady\n    var det = adz * (bdxcdy - cdxbdy) \n            + bdz * (cdxady - adxcdy)\n            + cdz * (adxbdy - bdxady)\n    var permanent = (Math.abs(bdxcdy) + Math.abs(cdxbdy)) * Math.abs(adz)\n                  + (Math.abs(cdxady) + Math.abs(adxcdy)) * Math.abs(bdz)\n                  + (Math.abs(adxbdy) + Math.abs(bdxady)) * Math.abs(cdz)\n    var tol = ERRBOUND4 * permanent\n    if ((det > tol) || (-det > tol)) {\n      return det\n    }\n    return orientation4Exact(a,b,c,d)\n  }\n]\n\nfunction slowOrient(args) {\n  var proc = CACHED[args.length]\n  if(!proc) {\n    proc = CACHED[args.length] = orientation(args.length)\n  }\n  return proc.apply(undefined, args)\n}\n\nfunction generateOrientationProc() {\n  while(CACHED.length <= NUM_EXPAND) {\n    CACHED.push(orientation(CACHED.length))\n  }\n  var args = []\n  var procArgs = [\"slow\"]\n  for(var i=0; i<=NUM_EXPAND; ++i) {\n    args.push(\"a\" + i)\n    procArgs.push(\"o\" + i)\n  }\n  var code = [\n    \"function getOrientation(\", args.join(), \"){switch(arguments.length){case 0:case 1:return 0;\"\n  ]\n  for(var i=2; i<=NUM_EXPAND; ++i) {\n    code.push(\"case \", i, \":return o\", i, \"(\", args.slice(0, i).join(), \");\")\n  }\n  code.push(\"}var s=new Array(arguments.length);for(var i=0;i<arguments.length;++i){s[i]=arguments[i]};return slow(s);}return getOrientation\")\n  procArgs.push(code.join(\"\"))\n\n  var proc = Function.apply(undefined, procArgs)\n  module.exports = proc.apply(undefined, [slowOrient].concat(CACHED))\n  for(var i=0; i<=NUM_EXPAND; ++i) {\n    module.exports[i] = CACHED[i]\n  }\n}\n\ngenerateOrientationProc()\n},{\"robust-scale\":44,\"robust-subtract\":45,\"robust-sum\":46,\"two-product\":47}],49:[function(require,module,exports){\n\"use strict\"\n\n//High level idea:\n// 1. Use Clarkson's incremental construction to find convex hull\n// 2. Point location in triangulation by jump and walk\n\nmodule.exports = incrementalConvexHull\n\nvar orient = require(\"robust-orientation\")\nvar compareCell = require(\"simplicial-complex\").compareCells\n\nfunction compareInt(a, b) {\n  return a - b\n}\n\nfunction Simplex(vertices, adjacent, boundary) {\n  this.vertices = vertices\n  this.adjacent = adjacent\n  this.boundary = boundary\n  this.lastVisited = -1\n}\n\nSimplex.prototype.flip = function() {\n  var t = this.vertices[0]\n  this.vertices[0] = this.vertices[1]\n  this.vertices[1] = t\n  var u = this.adjacent[0]\n  this.adjacent[0] = this.adjacent[1]\n  this.adjacent[1] = u\n}\n\nfunction GlueFacet(vertices, cell, index) {\n  this.vertices = vertices\n  this.cell = cell\n  this.index = index\n}\n\nfunction compareGlue(a, b) {\n  return compareCell(a.vertices, b.vertices)\n}\n\nfunction bakeOrient(d) {\n  var code = [\"function orient(){var tuple=this.tuple;return test(\"]\n  for(var i=0; i<=d; ++i) {\n    if(i > 0) {\n      code.push(\",\")\n    }\n    code.push(\"tuple[\", i, \"]\")\n  }\n  code.push(\")}return orient\")\n  var proc = new Function(\"test\", code.join(\"\"))\n  var test = orient[d+1]\n  if(!test) {\n    test = orient\n  }\n  return proc(test)\n}\n\nvar BAKED = []\n\nfunction Triangulation(dimension, vertices, simplices) {\n  this.dimension = dimension\n  this.vertices = vertices\n  this.simplices = simplices\n  this.interior = simplices.filter(function(c) {\n    return !c.boundary\n  })\n\n  this.tuple = new Array(dimension+1)\n  for(var i=0; i<=dimension; ++i) {\n    this.tuple[i] = this.vertices[i]\n  }\n\n  var o = BAKED[dimension]\n  if(!o) {\n    o = BAKED[dimension] = bakeOrient(dimension)\n  }\n  this.orient = o\n}\n\nvar proto = Triangulation.prototype\n\n//Degenerate situation where we are on boundary, but coplanar to face\nproto.handleBoundaryDegeneracy = function(cell, point) {\n  var d = this.dimension\n  var n = this.vertices.length - 1\n  var tuple = this.tuple\n  var verts = this.vertices\n\n  //Dumb solution: Just do dfs from boundary cell until we find any peak, or terminate\n  var toVisit = [ cell ]\n  cell.lastVisited = -n\n  while(toVisit.length > 0) {\n    cell = toVisit.pop()\n    var cellVerts = cell.vertices\n    var cellAdj = cell.adjacent\n    for(var i=0; i<=d; ++i) {\n      var neighbor = cellAdj[i]\n      if(!neighbor.boundary || neighbor.lastVisited <= -n) {\n        continue\n      }\n      var nv = neighbor.vertices\n      for(var j=0; j<=d; ++j) {\n        var vv = nv[j]\n        if(vv < 0) {\n          tuple[j] = point\n        } else {\n          tuple[j] = verts[vv]\n        }\n      }\n      var o = this.orient()\n      if(o > 0) {\n        return neighbor\n      }\n      neighbor.lastVisited = -n\n      if(o === 0) {\n        toVisit.push(neighbor)\n      }\n    }\n  }\n  return null\n}\n\nproto.walk = function(point, random) {\n  //Alias local properties\n  var n = this.vertices.length - 1\n  var d = this.dimension\n  var verts = this.vertices\n  var tuple = this.tuple\n\n  //Compute initial jump cell\n  var initIndex = random ? (this.interior.length * Math.random())|0 : (this.interior.length-1)\n  var cell = this.interior[ initIndex ]\n\n  //Start walking\nouterLoop:\n  while(!cell.boundary) {\n    var cellVerts = cell.vertices\n    var cellAdj = cell.adjacent\n\n    for(var i=0; i<=d; ++i) {\n      tuple[i] = verts[cellVerts[i]]\n    }\n    cell.lastVisited = n\n\n    //Find farthest adjacent cell\n    for(var i=0; i<=d; ++i) {\n      var neighbor = cellAdj[i]\n      if(neighbor.lastVisited >= n) {\n        continue\n      }\n      var prev = tuple[i]\n      tuple[i] = point\n      var o = this.orient()\n      tuple[i] = prev\n      if(o < 0) {\n        cell = neighbor\n        continue outerLoop\n      } else {\n        if(!neighbor.boundary) {\n          neighbor.lastVisited = n\n        } else {\n          neighbor.lastVisited = -n\n        }\n      }\n    }\n    return\n  }\n\n  return cell\n}\n\nproto.addPeaks = function(point, cell) {\n  var n = this.vertices.length - 1\n  var d = this.dimension\n  var verts = this.vertices\n  var tuple = this.tuple\n  var interior = this.interior\n  var simplices = this.simplices\n\n  //Walking finished at boundary, time to add peaks\n  var tovisit = [ cell ]\n\n  //Stretch initial boundary cell into a peak\n  cell.lastVisited = n\n  cell.vertices[cell.vertices.indexOf(-1)] = n\n  cell.boundary = false\n  interior.push(cell)\n\n  //Record a list of all new boundaries created by added peaks so we can glue them together when we are all done\n  var glueFacets = []\n\n  //Do a traversal of the boundary walking outward from starting peak\n  while(tovisit.length > 0) {\n    //Pop off peak and walk over adjacent cells\n    var cell = tovisit.pop()\n    var cellVerts = cell.vertices\n    var cellAdj = cell.adjacent\n    var indexOfN = cellVerts.indexOf(n)\n    if(indexOfN < 0) {\n      continue\n    }\n\n    for(var i=0; i<=d; ++i) {\n      if(i === indexOfN) {\n        continue\n      }\n\n      //For each boundary neighbor of the cell\n      var neighbor = cellAdj[i]\n      if(!neighbor.boundary || neighbor.lastVisited >= n) {\n        continue\n      }\n\n      var nv = neighbor.vertices\n\n      //Test if neighbor is a peak\n      if(neighbor.lastVisited !== -n) {      \n        //Compute orientation of p relative to each boundary peak\n        var indexOfNeg1 = 0\n        for(var j=0; j<=d; ++j) {\n          if(nv[j] < 0) {\n            indexOfNeg1 = j\n            tuple[j] = point\n          } else {\n            tuple[j] = verts[nv[j]]\n          }\n        }\n        var o = this.orient()\n\n        //Test if neighbor cell is also a peak\n        if(o > 0) {\n          nv[indexOfNeg1] = n\n          neighbor.boundary = false\n          interior.push(neighbor)\n          tovisit.push(neighbor)\n          neighbor.lastVisited = n\n          continue\n        } else {\n          neighbor.lastVisited = -n\n        }\n      }\n\n      var na = neighbor.adjacent\n\n      //Otherwise, replace neighbor with new face\n      var vverts = cellVerts.slice()\n      var vadj = cellAdj.slice()\n      var ncell = new Simplex(vverts, vadj, true)\n      simplices.push(ncell)\n\n      //Connect to neighbor\n      var opposite = na.indexOf(cell)\n      if(opposite < 0) {\n        continue\n      }\n      na[opposite] = ncell\n      vadj[indexOfN] = neighbor\n\n      //Connect to cell\n      vverts[i] = -1\n      vadj[i] = cell\n      cellAdj[i] = ncell\n\n      //Flip facet\n      ncell.flip()\n\n      //Add to glue list\n      for(var j=0; j<=d; ++j) {\n        var uu = vverts[j]\n        if(uu < 0 || uu === n) {\n          continue\n        }\n        var nface = new Array(d-1)\n        var nptr = 0\n        for(var k=0; k<=d; ++k) {\n          var vv = vverts[k]\n          if(vv < 0 || k === j) {\n            continue\n          }\n          nface[nptr++] = vv\n        }\n        glueFacets.push(new GlueFacet(nface, ncell, j))\n      }\n    }\n  }\n\n  //Glue boundary facets together\n  glueFacets.sort(compareGlue)\n\n  for(var i=0; i+1<glueFacets.length; i+=2) {\n    var a = glueFacets[i]\n    var b = glueFacets[i+1]\n    var ai = a.index\n    var bi = b.index\n    if(ai < 0 || bi < 0) {\n      continue\n    }\n    a.cell.adjacent[a.index] = b.cell\n    b.cell.adjacent[b.index] = a.cell\n  }\n}\n\nproto.insert = function(point, random) {\n  //Add point\n  var verts = this.vertices\n  verts.push(point)\n\n  var cell = this.walk(point, random)\n  if(!cell) {\n    return\n  }\n\n  //Alias local properties\n  var d = this.dimension\n  var tuple = this.tuple\n\n  //Degenerate case: If point is coplanar to cell, then walk until we find a non-degenerate boundary\n  for(var i=0; i<=d; ++i) {\n    var vv = cell.vertices[i]\n    if(vv < 0) {\n      tuple[i] = point\n    } else {\n      tuple[i] = verts[vv]\n    }\n  }\n  var o = this.orient(tuple)\n  if(o < 0) {\n    return\n  } else if(o === 0) {\n    cell = this.handleBoundaryDegeneracy(cell, point)\n    if(!cell) {\n      return\n    }\n  }\n\n  //Add peaks\n  this.addPeaks(point, cell)\n}\n\n//Extract all boundary cells\nproto.boundary = function() {\n  var d = this.dimension\n  var boundary = []\n  var cells = this.simplices\n  var nc = cells.length\n  for(var i=0; i<nc; ++i) {\n    var c = cells[i]\n    if(c.boundary) {\n      var bcell = new Array(d)\n      var cv = c.vertices\n      var ptr = 0\n      var parity = 0\n      for(var j=0; j<=d; ++j) {\n        if(cv[j] >= 0) {\n          bcell[ptr++] = cv[j]\n        } else {\n          parity = j&1\n        }\n      }\n      if(parity === (d&1)) {\n        var t = bcell[0]\n        bcell[0] = bcell[1]\n        bcell[1] = t\n      }\n      boundary.push(bcell)\n    }\n  }\n  return boundary\n}\n\nfunction incrementalConvexHull(points, randomSearch) {\n  var n = points.length\n  if(n === 0) {\n    throw new Error(\"Must have at least d+1 points\")\n  }\n  var d = points[0].length\n  if(n <= d) {\n    throw new Error(\"Must input at least d+1 points\")\n  }\n\n  //FIXME: This could be degenerate, but need to select d+1 non-coplanar points to bootstrap process\n  var initialSimplex = points.slice(0, d+1)\n\n  //Make sure initial simplex is positively oriented\n  var o = orient.apply(void 0, initialSimplex)\n  if(o === 0) {\n    throw new Error(\"Input not in general position\")\n  }\n  var initialCoords = new Array(d+1)\n  for(var i=0; i<=d; ++i) {\n    initialCoords[i] = i\n  }\n  if(o < 0) {\n    initialCoords[0] = 1\n    initialCoords[1] = 0\n  }\n\n  //Create initial topological index, glue pointers together (kind of messy)\n  var initialCell = new Simplex(initialCoords, new Array(d+1), false)\n  var boundary = initialCell.adjacent\n  var list = new Array(d+2)\n  for(var i=0; i<=d; ++i) {\n    var verts = initialCoords.slice()\n    for(var j=0; j<=d; ++j) {\n      if(j === i) {\n        verts[j] = -1\n      }\n    }\n    var t = verts[0]\n    verts[0] = verts[1]\n    verts[1] = t\n    var cell = new Simplex(verts, new Array(d+1), true)\n    boundary[i] = cell\n    list[i] = cell\n  }\n  list[d+1] = initialCell\n  for(var i=0; i<=d; ++i) {\n    var verts = boundary[i].vertices\n    var adj = boundary[i].adjacent\n    for(var j=0; j<=d; ++j) {\n      var v = verts[j]\n      if(v < 0) {\n        adj[j] = initialCell\n        continue\n      }\n      for(var k=0; k<=d; ++k) {\n        if(boundary[k].vertices.indexOf(v) < 0) {\n          adj[j] = boundary[k]\n        }\n      }\n    }\n  }\n\n  //Initialize triangles\n  var triangles = new Triangulation(d, initialSimplex, list)\n\n  //Insert remaining points\n  var useRandom = !!randomSearch\n  for(var i=d+1; i<n; ++i) {\n    triangles.insert(points[i], useRandom)\n  }\n  \n  //Extract boundary cells\n  return triangles.boundary()\n}\n},{\"robust-orientation\":55,\"simplicial-complex\":58}],50:[function(require,module,exports){\narguments[4][43][0].apply(exports,arguments)\n},{\"dup\":43}],51:[function(require,module,exports){\narguments[4][44][0].apply(exports,arguments)\n},{\"dup\":44,\"two-product\":54,\"two-sum\":50}],52:[function(require,module,exports){\narguments[4][45][0].apply(exports,arguments)\n},{\"dup\":45}],53:[function(require,module,exports){\narguments[4][46][0].apply(exports,arguments)\n},{\"dup\":46}],54:[function(require,module,exports){\narguments[4][47][0].apply(exports,arguments)\n},{\"dup\":47}],55:[function(require,module,exports){\narguments[4][48][0].apply(exports,arguments)\n},{\"dup\":48,\"robust-scale\":51,\"robust-subtract\":52,\"robust-sum\":53,\"two-product\":54}],56:[function(require,module,exports){\n/**\n * Bit twiddling hacks for JavaScript.\n *\n * Author: Mikola Lysenko\n *\n * Ported from Stanford bit twiddling hack library:\n *    http://graphics.stanford.edu/~seander/bithacks.html\n */\n\n\"use strict\"; \"use restrict\";\n\n//Number of bits in an integer\nvar INT_BITS = 32;\n\n//Constants\nexports.INT_BITS  = INT_BITS;\nexports.INT_MAX   =  0x7fffffff;\nexports.INT_MIN   = -1<<(INT_BITS-1);\n\n//Returns -1, 0, +1 depending on sign of x\nexports.sign = function(v) {\n  return (v > 0) - (v < 0);\n}\n\n//Computes absolute value of integer\nexports.abs = function(v) {\n  var mask = v >> (INT_BITS-1);\n  return (v ^ mask) - mask;\n}\n\n//Computes minimum of integers x and y\nexports.min = function(x, y) {\n  return y ^ ((x ^ y) & -(x < y));\n}\n\n//Computes maximum of integers x and y\nexports.max = function(x, y) {\n  return x ^ ((x ^ y) & -(x < y));\n}\n\n//Checks if a number is a power of two\nexports.isPow2 = function(v) {\n  return !(v & (v-1)) && (!!v);\n}\n\n//Computes log base 2 of v\nexports.log2 = function(v) {\n  var r, shift;\n  r =     (v > 0xFFFF) << 4; v >>>= r;\n  shift = (v > 0xFF  ) << 3; v >>>= shift; r |= shift;\n  shift = (v > 0xF   ) << 2; v >>>= shift; r |= shift;\n  shift = (v > 0x3   ) << 1; v >>>= shift; r |= shift;\n  return r | (v >> 1);\n}\n\n//Computes log base 10 of v\nexports.log10 = function(v) {\n  return  (v >= 1000000000) ? 9 : (v >= 100000000) ? 8 : (v >= 10000000) ? 7 :\n          (v >= 1000000) ? 6 : (v >= 100000) ? 5 : (v >= 10000) ? 4 :\n          (v >= 1000) ? 3 : (v >= 100) ? 2 : (v >= 10) ? 1 : 0;\n}\n\n//Counts number of bits\nexports.popCount = function(v) {\n  v = v - ((v >>> 1) & 0x55555555);\n  v = (v & 0x33333333) + ((v >>> 2) & 0x33333333);\n  return ((v + (v >>> 4) & 0xF0F0F0F) * 0x1010101) >>> 24;\n}\n\n//Counts number of trailing zeros\nfunction countTrailingZeros(v) {\n  var c = 32;\n  v &= -v;\n  if (v) c--;\n  if (v & 0x0000FFFF) c -= 16;\n  if (v & 0x00FF00FF) c -= 8;\n  if (v & 0x0F0F0F0F) c -= 4;\n  if (v & 0x33333333) c -= 2;\n  if (v & 0x55555555) c -= 1;\n  return c;\n}\nexports.countTrailingZeros = countTrailingZeros;\n\n//Rounds to next power of 2\nexports.nextPow2 = function(v) {\n  v += v === 0;\n  --v;\n  v |= v >>> 1;\n  v |= v >>> 2;\n  v |= v >>> 4;\n  v |= v >>> 8;\n  v |= v >>> 16;\n  return v + 1;\n}\n\n//Rounds down to previous power of 2\nexports.prevPow2 = function(v) {\n  v |= v >>> 1;\n  v |= v >>> 2;\n  v |= v >>> 4;\n  v |= v >>> 8;\n  v |= v >>> 16;\n  return v - (v>>>1);\n}\n\n//Computes parity of word\nexports.parity = function(v) {\n  v ^= v >>> 16;\n  v ^= v >>> 8;\n  v ^= v >>> 4;\n  v &= 0xf;\n  return (0x6996 >>> v) & 1;\n}\n\nvar REVERSE_TABLE = new Array(256);\n\n(function(tab) {\n  for(var i=0; i<256; ++i) {\n    var v = i, r = i, s = 7;\n    for (v >>>= 1; v; v >>>= 1) {\n      r <<= 1;\n      r |= v & 1;\n      --s;\n    }\n    tab[i] = (r << s) & 0xff;\n  }\n})(REVERSE_TABLE);\n\n//Reverse bits in a 32 bit word\nexports.reverse = function(v) {\n  return  (REVERSE_TABLE[ v         & 0xff] << 24) |\n          (REVERSE_TABLE[(v >>> 8)  & 0xff] << 16) |\n          (REVERSE_TABLE[(v >>> 16) & 0xff] << 8)  |\n           REVERSE_TABLE[(v >>> 24) & 0xff];\n}\n\n//Interleave bits of 2 coordinates with 16 bits.  Useful for fast quadtree codes\nexports.interleave2 = function(x, y) {\n  x &= 0xFFFF;\n  x = (x | (x << 8)) & 0x00FF00FF;\n  x = (x | (x << 4)) & 0x0F0F0F0F;\n  x = (x | (x << 2)) & 0x33333333;\n  x = (x | (x << 1)) & 0x55555555;\n\n  y &= 0xFFFF;\n  y = (y | (y << 8)) & 0x00FF00FF;\n  y = (y | (y << 4)) & 0x0F0F0F0F;\n  y = (y | (y << 2)) & 0x33333333;\n  y = (y | (y << 1)) & 0x55555555;\n\n  return x | (y << 1);\n}\n\n//Extracts the nth interleaved component\nexports.deinterleave2 = function(v, n) {\n  v = (v >>> n) & 0x55555555;\n  v = (v | (v >>> 1))  & 0x33333333;\n  v = (v | (v >>> 2))  & 0x0F0F0F0F;\n  v = (v | (v >>> 4))  & 0x00FF00FF;\n  v = (v | (v >>> 16)) & 0x000FFFF;\n  return (v << 16) >> 16;\n}\n\n\n//Interleave bits of 3 coordinates, each with 10 bits.  Useful for fast octree codes\nexports.interleave3 = function(x, y, z) {\n  x &= 0x3FF;\n  x  = (x | (x<<16)) & 4278190335;\n  x  = (x | (x<<8))  & 251719695;\n  x  = (x | (x<<4))  & 3272356035;\n  x  = (x | (x<<2))  & 1227133513;\n\n  y &= 0x3FF;\n  y  = (y | (y<<16)) & 4278190335;\n  y  = (y | (y<<8))  & 251719695;\n  y  = (y | (y<<4))  & 3272356035;\n  y  = (y | (y<<2))  & 1227133513;\n  x |= (y << 1);\n  \n  z &= 0x3FF;\n  z  = (z | (z<<16)) & 4278190335;\n  z  = (z | (z<<8))  & 251719695;\n  z  = (z | (z<<4))  & 3272356035;\n  z  = (z | (z<<2))  & 1227133513;\n  \n  return x | (z << 2);\n}\n\n//Extracts nth interleaved component of a 3-tuple\nexports.deinterleave3 = function(v, n) {\n  v = (v >>> n)       & 1227133513;\n  v = (v | (v>>>2))   & 3272356035;\n  v = (v | (v>>>4))   & 251719695;\n  v = (v | (v>>>8))   & 4278190335;\n  v = (v | (v>>>16))  & 0x3FF;\n  return (v<<22)>>22;\n}\n\n//Computes next combination in colexicographic order (this is mistakenly called nextPermutation on the bit twiddling hacks page)\nexports.nextCombination = function(v) {\n  var t = v | (v - 1);\n  return (t + 1) | (((~t & -~t) - 1) >>> (countTrailingZeros(v) + 1));\n}\n\n\n},{}],57:[function(require,module,exports){\n\"use strict\"; \"use restrict\";\n\nmodule.exports = UnionFind;\n\nfunction UnionFind(count) {\n  this.roots = new Array(count);\n  this.ranks = new Array(count);\n  \n  for(var i=0; i<count; ++i) {\n    this.roots[i] = i;\n    this.ranks[i] = 0;\n  }\n}\n\nvar proto = UnionFind.prototype\n\nObject.defineProperty(proto, \"length\", {\n  \"get\": function() {\n    return this.roots.length\n  }\n})\n\nproto.makeSet = function() {\n  var n = this.roots.length;\n  this.roots.push(n);\n  this.ranks.push(0);\n  return n;\n}\n\nproto.find = function(x) {\n  var x0 = x\n  var roots = this.roots;\n  while(roots[x] !== x) {\n    x = roots[x]\n  }\n  while(roots[x0] !== x) {\n    var y = roots[x0]\n    roots[x0] = x\n    x0 = y\n  }\n  return x;\n}\n\nproto.link = function(x, y) {\n  var xr = this.find(x)\n    , yr = this.find(y);\n  if(xr === yr) {\n    return;\n  }\n  var ranks = this.ranks\n    , roots = this.roots\n    , xd    = ranks[xr]\n    , yd    = ranks[yr];\n  if(xd < yd) {\n    roots[xr] = yr;\n  } else if(yd < xd) {\n    roots[yr] = xr;\n  } else {\n    roots[yr] = xr;\n    ++ranks[xr];\n  }\n}\n},{}],58:[function(require,module,exports){\n\"use strict\"; \"use restrict\";\n\nvar bits      = require(\"bit-twiddle\")\n  , UnionFind = require(\"union-find\")\n\n//Returns the dimension of a cell complex\nfunction dimension(cells) {\n  var d = 0\n    , max = Math.max\n  for(var i=0, il=cells.length; i<il; ++i) {\n    d = max(d, cells[i].length)\n  }\n  return d-1\n}\nexports.dimension = dimension\n\n//Counts the number of vertices in faces\nfunction countVertices(cells) {\n  var vc = -1\n    , max = Math.max\n  for(var i=0, il=cells.length; i<il; ++i) {\n    var c = cells[i]\n    for(var j=0, jl=c.length; j<jl; ++j) {\n      vc = max(vc, c[j])\n    }\n  }\n  return vc+1\n}\nexports.countVertices = countVertices\n\n//Returns a deep copy of cells\nfunction cloneCells(cells) {\n  var ncells = new Array(cells.length)\n  for(var i=0, il=cells.length; i<il; ++i) {\n    ncells[i] = cells[i].slice(0)\n  }\n  return ncells\n}\nexports.cloneCells = cloneCells\n\n//Ranks a pair of cells up to permutation\nfunction compareCells(a, b) {\n  var n = a.length\n    , t = a.length - b.length\n    , min = Math.min\n  if(t) {\n    return t\n  }\n  switch(n) {\n    case 0:\n      return 0;\n    case 1:\n      return a[0] - b[0];\n    case 2:\n      var d = a[0]+a[1]-b[0]-b[1]\n      if(d) {\n        return d\n      }\n      return min(a[0],a[1]) - min(b[0],b[1])\n    case 3:\n      var l1 = a[0]+a[1]\n        , m1 = b[0]+b[1]\n      d = l1+a[2] - (m1+b[2])\n      if(d) {\n        return d\n      }\n      var l0 = min(a[0], a[1])\n        , m0 = min(b[0], b[1])\n        , d  = min(l0, a[2]) - min(m0, b[2])\n      if(d) {\n        return d\n      }\n      return min(l0+a[2], l1) - min(m0+b[2], m1)\n    \n    //TODO: Maybe optimize n=4 as well?\n    \n    default:\n      var as = a.slice(0)\n      as.sort()\n      var bs = b.slice(0)\n      bs.sort()\n      for(var i=0; i<n; ++i) {\n        t = as[i] - bs[i]\n        if(t) {\n          return t\n        }\n      }\n      return 0\n  }\n}\nexports.compareCells = compareCells\n\nfunction compareZipped(a, b) {\n  return compareCells(a[0], b[0])\n}\n\n//Puts a cell complex into normal order for the purposes of findCell queries\nfunction normalize(cells, attr) {\n  if(attr) {\n    var len = cells.length\n    var zipped = new Array(len)\n    for(var i=0; i<len; ++i) {\n      zipped[i] = [cells[i], attr[i]]\n    }\n    zipped.sort(compareZipped)\n    for(var i=0; i<len; ++i) {\n      cells[i] = zipped[i][0]\n      attr[i] = zipped[i][1]\n    }\n    return cells\n  } else {\n    cells.sort(compareCells)\n    return cells\n  }\n}\nexports.normalize = normalize\n\n//Removes all duplicate cells in the complex\nfunction unique(cells) {\n  if(cells.length === 0) {\n    return []\n  }\n  var ptr = 1\n    , len = cells.length\n  for(var i=1; i<len; ++i) {\n    var a = cells[i]\n    if(compareCells(a, cells[i-1])) {\n      if(i === ptr) {\n        ptr++\n        continue\n      }\n      cells[ptr++] = a\n    }\n  }\n  cells.length = ptr\n  return cells\n}\nexports.unique = unique;\n\n//Finds a cell in a normalized cell complex\nfunction findCell(cells, c) {\n  var lo = 0\n    , hi = cells.length-1\n    , r  = -1\n  while (lo <= hi) {\n    var mid = (lo + hi) >> 1\n      , s   = compareCells(cells[mid], c)\n    if(s <= 0) {\n      if(s === 0) {\n        r = mid\n      }\n      lo = mid + 1\n    } else if(s > 0) {\n      hi = mid - 1\n    }\n  }\n  return r\n}\nexports.findCell = findCell;\n\n//Builds an index for an n-cell.  This is more general than dual, but less efficient\nfunction incidence(from_cells, to_cells) {\n  var index = new Array(from_cells.length)\n  for(var i=0, il=index.length; i<il; ++i) {\n    index[i] = []\n  }\n  var b = []\n  for(var i=0, n=to_cells.length; i<n; ++i) {\n    var c = to_cells[i]\n    var cl = c.length\n    for(var k=1, kn=(1<<cl); k<kn; ++k) {\n      b.length = bits.popCount(k)\n      var l = 0\n      for(var j=0; j<cl; ++j) {\n        if(k & (1<<j)) {\n          b[l++] = c[j]\n        }\n      }\n      var idx=findCell(from_cells, b)\n      if(idx < 0) {\n        continue\n      }\n      while(true) {\n        index[idx++].push(i)\n        if(idx >= from_cells.length || compareCells(from_cells[idx], b) !== 0) {\n          break\n        }\n      }\n    }\n  }\n  return index\n}\nexports.incidence = incidence\n\n//Computes the dual of the mesh.  This is basically an optimized version of buildIndex for the situation where from_cells is just the list of vertices\nfunction dual(cells, vertex_count) {\n  if(!vertex_count) {\n    return incidence(unique(skeleton(cells, 0)), cells, 0)\n  }\n  var res = new Array(vertex_count)\n  for(var i=0; i<vertex_count; ++i) {\n    res[i] = []\n  }\n  for(var i=0, len=cells.length; i<len; ++i) {\n    var c = cells[i]\n    for(var j=0, cl=c.length; j<cl; ++j) {\n      res[c[j]].push(i)\n    }\n  }\n  return res\n}\nexports.dual = dual\n\n//Enumerates all cells in the complex\nfunction explode(cells) {\n  var result = []\n  for(var i=0, il=cells.length; i<il; ++i) {\n    var c = cells[i]\n      , cl = c.length|0\n    for(var j=1, jl=(1<<cl); j<jl; ++j) {\n      var b = []\n      for(var k=0; k<cl; ++k) {\n        if((j >>> k) & 1) {\n          b.push(c[k])\n        }\n      }\n      result.push(b)\n    }\n  }\n  return normalize(result)\n}\nexports.explode = explode\n\n//Enumerates all of the n-cells of a cell complex\nfunction skeleton(cells, n) {\n  if(n < 0) {\n    return []\n  }\n  var result = []\n    , k0     = (1<<(n+1))-1\n  for(var i=0; i<cells.length; ++i) {\n    var c = cells[i]\n    for(var k=k0; k<(1<<c.length); k=bits.nextCombination(k)) {\n      var b = new Array(n+1)\n        , l = 0\n      for(var j=0; j<c.length; ++j) {\n        if(k & (1<<j)) {\n          b[l++] = c[j]\n        }\n      }\n      result.push(b)\n    }\n  }\n  return normalize(result)\n}\nexports.skeleton = skeleton;\n\n//Computes the boundary of all cells, does not remove duplicates\nfunction boundary(cells) {\n  var res = []\n  for(var i=0,il=cells.length; i<il; ++i) {\n    var c = cells[i]\n    for(var j=0,cl=c.length; j<cl; ++j) {\n      var b = new Array(c.length-1)\n      for(var k=0, l=0; k<cl; ++k) {\n        if(k !== j) {\n          b[l++] = c[k]\n        }\n      }\n      res.push(b)\n    }\n  }\n  return normalize(res)\n}\nexports.boundary = boundary;\n\n//Computes connected components for a dense cell complex\nfunction connectedComponents_dense(cells, vertex_count) {\n  var labels = new UnionFind(vertex_count)\n  for(var i=0; i<cells.length; ++i) {\n    var c = cells[i]\n    for(var j=0; j<c.length; ++j) {\n      for(var k=j+1; k<c.length; ++k) {\n        labels.link(c[j], c[k])\n      }\n    }\n  }\n  var components = []\n    , component_labels = labels.ranks\n  for(var i=0; i<component_labels.length; ++i) {\n    component_labels[i] = -1\n  }\n  for(var i=0; i<cells.length; ++i) {\n    var l = labels.find(cells[i][0])\n    if(component_labels[l] < 0) {\n      component_labels[l] = components.length\n      components.push([cells[i].slice(0)])\n    } else {\n      components[component_labels[l]].push(cells[i].slice(0))\n    }\n  }\n  return components\n}\n\n//Computes connected components for a sparse graph\nfunction connectedComponents_sparse(cells) {\n  var vertices  = unique(normalize(skeleton(cells, 0)))\n    , labels    = new UnionFind(vertices.length)\n  for(var i=0; i<cells.length; ++i) {\n    var c = cells[i]\n    for(var j=0; j<c.length; ++j) {\n      var vj = findCell(vertices, [c[j]])\n      for(var k=j+1; k<c.length; ++k) {\n        labels.link(vj, findCell(vertices, [c[k]]))\n      }\n    }\n  }\n  var components        = []\n    , component_labels  = labels.ranks\n  for(var i=0; i<component_labels.length; ++i) {\n    component_labels[i] = -1\n  }\n  for(var i=0; i<cells.length; ++i) {\n    var l = labels.find(findCell(vertices, [cells[i][0]]));\n    if(component_labels[l] < 0) {\n      component_labels[l] = components.length\n      components.push([cells[i].slice(0)])\n    } else {\n      components[component_labels[l]].push(cells[i].slice(0))\n    }\n  }\n  return components\n}\n\n//Computes connected components for a cell complex\nfunction connectedComponents(cells, vertex_count) {\n  if(vertex_count) {\n    return connectedComponents_dense(cells, vertex_count)\n  }\n  return connectedComponents_sparse(cells)\n}\nexports.connectedComponents = connectedComponents\n\n},{\"bit-twiddle\":56,\"union-find\":57}],59:[function(require,module,exports){\n'use strict'\n\nmodule.exports = monotoneConvexHull2D\n\nvar orient = require('robust-orientation')[3]\n\nfunction monotoneConvexHull2D(points) {\n  var n = points.length\n\n  if(n < 3) {\n    var result = new Array(n)\n    for(var i=0; i<n; ++i) {\n      result[i] = i\n    }\n\n    if(n === 2 &&\n       points[0][0] === points[1][0] &&\n       points[0][1] === points[1][1]) {\n      return [0]\n    }\n\n    return result\n  }\n\n  //Sort point indices along x-axis\n  var sorted = new Array(n)\n  for(var i=0; i<n; ++i) {\n    sorted[i] = i\n  }\n  sorted.sort(function(a,b) {\n    var d = points[a][0]-points[b][0]\n    if(d) {\n      return d\n    }\n    return points[a][1] - points[b][1]\n  })\n\n  //Construct upper and lower hulls\n  var lower = [sorted[0], sorted[1]]\n  var upper = [sorted[0], sorted[1]]\n\n  for(var i=2; i<n; ++i) {\n    var idx = sorted[i]\n    var p   = points[idx]\n\n    //Insert into lower list\n    var m = lower.length\n    while(m > 1 && orient(\n        points[lower[m-2]], \n        points[lower[m-1]], \n        p) <= 0) {\n      m -= 1\n      lower.pop()\n    }\n    lower.push(idx)\n\n    //Insert into upper list\n    m = upper.length\n    while(m > 1 && orient(\n        points[upper[m-2]], \n        points[upper[m-1]], \n        p) >= 0) {\n      m -= 1\n      upper.pop()\n    }\n    upper.push(idx)\n  }\n\n  //Merge lists together\n  var result = new Array(upper.length + lower.length - 2)\n  var ptr    = 0\n  for(var i=0, nl=lower.length; i<nl; ++i) {\n    result[ptr++] = lower[i]\n  }\n  for(var j=upper.length-2; j>0; --j) {\n    result[ptr++] = upper[j]\n  }\n\n  //Return result\n  return result\n}\n},{\"robust-orientation\":65}],60:[function(require,module,exports){\narguments[4][43][0].apply(exports,arguments)\n},{\"dup\":43}],61:[function(require,module,exports){\narguments[4][44][0].apply(exports,arguments)\n},{\"dup\":44,\"two-product\":64,\"two-sum\":60}],62:[function(require,module,exports){\narguments[4][45][0].apply(exports,arguments)\n},{\"dup\":45}],63:[function(require,module,exports){\narguments[4][46][0].apply(exports,arguments)\n},{\"dup\":46}],64:[function(require,module,exports){\narguments[4][47][0].apply(exports,arguments)\n},{\"dup\":47}],65:[function(require,module,exports){\narguments[4][48][0].apply(exports,arguments)\n},{\"dup\":48,\"robust-scale\":61,\"robust-subtract\":62,\"robust-sum\":63,\"two-product\":64}],66:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nif (global.AnalyserNode && !global.AnalyserNode.prototype.getFloatTimeDomainData) {\n  var uint8 = new Uint8Array(2048);\n  global.AnalyserNode.prototype.getFloatTimeDomainData = function(array) {\n    this.getByteTimeDomainData(uint8);\n    for (var i = 0, imax = array.length; i < imax; i++) {\n      array[i] = (uint8[i] - 128) * 0.0078125;\n    }\n  };\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{}],67:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nvar numeric = (typeof exports === \"undefined\")?(function numeric() {}):(exports);\nif(typeof global !== \"undefined\") { global.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        if(isFinite(eval('1'+numeric.ops2[k]+'0'))) A = '[Y[0],Y[1],numeric.'+k+'(X,Y[2])]';\n        else A = 'NaN';\n        if(isFinite(eval('0'+numeric.ops2[k]+'1'))) B = '[X[0],X[1],numeric.'+k+'(X[2],Y)]';\n        else B = 'NaN';\n        if(isFinite(eval('1'+numeric.ops2[k]+'0')) && isFinite(eval('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    function heval(y0,y1,k0,k1,x) {\n        var A = k0*2-(y1-y0);\n        var B = -k1*2+(y1-y0);\n        var t = (x+1)*0.5;\n        var s = t*(1-t);\n        return (1-t)*y0+t*y1+A*s*(1-t)+B*s*t;\n    }\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/*\r\nShanti Rao sent me this routine by private email. I had to modify it\r\nslightly to work on Arrays instead of using a Matrix object.\r\nIt is apparently translated from http://stitchpanorama.sourceforge.net/Python/svd.py\r\n*/\r\n\r\nnumeric.svd= function svd(A) {\r\n    var temp;\r\n//Compute the thin SVD from G. H. Golub and C. Reinsch, Numer. Math. 14, 403-420 (1970)\r\n\tvar prec= numeric.epsilon; //Math.pow(2,-52) // assumes double prec\r\n\tvar tolerance= 1.e-64/prec;\r\n\tvar itmax= 50;\r\n\tvar c=0;\r\n\tvar i=0;\r\n\tvar j=0;\r\n\tvar k=0;\r\n\tvar l=0;\r\n\t\r\n\tvar u= numeric.clone(A);\r\n\tvar m= u.length;\r\n\t\r\n\tvar n= u[0].length;\r\n\t\r\n\tif (m < n) throw \"Need more rows than columns\"\r\n\t\r\n\tvar e = new Array(n);\r\n\tvar q = new Array(n);\r\n\tfor (i=0; i<n; i++) e[i] = q[i] = 0.0;\r\n\tvar v = numeric.rep([n,n],0);\r\n//\tv.zero();\r\n\t\r\n \tfunction pythag(a,b)\r\n \t{\r\n\t\ta = Math.abs(a)\r\n\t\tb = Math.abs(b)\r\n\t\tif (a > b)\r\n\t\t\treturn a*Math.sqrt(1.0+(b*b/a/a))\r\n\t\telse if (b == 0.0) \r\n\t\t\treturn a\r\n\t\treturn b*Math.sqrt(1.0+(a*a/b/b))\r\n\t}\r\n\r\n\t//Householder's reduction to bidiagonal form\r\n\r\n\tvar f= 0.0;\r\n\tvar g= 0.0;\r\n\tvar h= 0.0;\r\n\tvar x= 0.0;\r\n\tvar y= 0.0;\r\n\tvar z= 0.0;\r\n\tvar s= 0.0;\r\n\t\r\n\tfor (i=0; i < n; i++)\r\n\t{\t\r\n\t\te[i]= g;\r\n\t\ts= 0.0;\r\n\t\tl= i+1;\r\n\t\tfor (j=i; j < m; j++) \r\n\t\t\ts += (u[j][i]*u[j][i]);\r\n\t\tif (s <= tolerance)\r\n\t\t\tg= 0.0;\r\n\t\telse\r\n\t\t{\t\r\n\t\t\tf= u[i][i];\r\n\t\t\tg= Math.sqrt(s);\r\n\t\t\tif (f >= 0.0) g= -g;\r\n\t\t\th= f*g-s\r\n\t\t\tu[i][i]=f-g;\r\n\t\t\tfor (j=l; j < n; j++)\r\n\t\t\t{\r\n\t\t\t\ts= 0.0\r\n\t\t\t\tfor (k=i; k < m; k++) \r\n\t\t\t\t\ts += u[k][i]*u[k][j]\r\n\t\t\t\tf= s/h\r\n\t\t\t\tfor (k=i; k < m; k++) \r\n\t\t\t\t\tu[k][j]+=f*u[k][i]\r\n\t\t\t}\r\n\t\t}\r\n\t\tq[i]= g\r\n\t\ts= 0.0\r\n\t\tfor (j=l; j < n; j++) \r\n\t\t\ts= s + u[i][j]*u[i][j]\r\n\t\tif (s <= tolerance)\r\n\t\t\tg= 0.0\r\n\t\telse\r\n\t\t{\t\r\n\t\t\tf= u[i][i+1]\r\n\t\t\tg= Math.sqrt(s)\r\n\t\t\tif (f >= 0.0) g= -g\r\n\t\t\th= f*g - s\r\n\t\t\tu[i][i+1] = f-g;\r\n\t\t\tfor (j=l; j < n; j++) e[j]= u[i][j]/h\r\n\t\t\tfor (j=l; j < m; j++)\r\n\t\t\t{\t\r\n\t\t\t\ts=0.0\r\n\t\t\t\tfor (k=l; k < n; k++) \r\n\t\t\t\t\ts += (u[j][k]*u[i][k])\r\n\t\t\t\tfor (k=l; k < n; k++) \r\n\t\t\t\t\tu[j][k]+=s*e[k]\r\n\t\t\t}\t\r\n\t\t}\r\n\t\ty= Math.abs(q[i])+Math.abs(e[i])\r\n\t\tif (y>x) \r\n\t\t\tx=y\r\n\t}\r\n\t\r\n\t// accumulation of right hand gtransformations\r\n\tfor (i=n-1; i != -1; i+= -1)\r\n\t{\t\r\n\t\tif (g != 0.0)\r\n\t\t{\r\n\t\t \th= g*u[i][i+1]\r\n\t\t\tfor (j=l; j < n; j++) \r\n\t\t\t\tv[j][i]=u[i][j]/h\r\n\t\t\tfor (j=l; j < n; j++)\r\n\t\t\t{\t\r\n\t\t\t\ts=0.0\r\n\t\t\t\tfor (k=l; k < n; k++) \r\n\t\t\t\t\ts += u[i][k]*v[k][j]\r\n\t\t\t\tfor (k=l; k < n; k++) \r\n\t\t\t\t\tv[k][j]+=(s*v[k][i])\r\n\t\t\t}\t\r\n\t\t}\r\n\t\tfor (j=l; j < n; j++)\r\n\t\t{\r\n\t\t\tv[i][j] = 0;\r\n\t\t\tv[j][i] = 0;\r\n\t\t}\r\n\t\tv[i][i] = 1;\r\n\t\tg= e[i]\r\n\t\tl= i\r\n\t}\r\n\t\r\n\t// accumulation of left hand transformations\r\n\tfor (i=n-1; i != -1; i+= -1)\r\n\t{\t\r\n\t\tl= i+1\r\n\t\tg= q[i]\r\n\t\tfor (j=l; j < n; j++) \r\n\t\t\tu[i][j] = 0;\r\n\t\tif (g != 0.0)\r\n\t\t{\r\n\t\t\th= u[i][i]*g\r\n\t\t\tfor (j=l; j < n; j++)\r\n\t\t\t{\r\n\t\t\t\ts=0.0\r\n\t\t\t\tfor (k=l; k < m; k++) s += u[k][i]*u[k][j];\r\n\t\t\t\tf= s/h\r\n\t\t\t\tfor (k=i; k < m; k++) u[k][j]+=f*u[k][i];\r\n\t\t\t}\r\n\t\t\tfor (j=i; j < m; j++) u[j][i] = u[j][i]/g;\r\n\t\t}\r\n\t\telse\r\n\t\t\tfor (j=i; j < m; j++) u[j][i] = 0;\r\n\t\tu[i][i] += 1;\r\n\t}\r\n\t\r\n\t// diagonalization of the bidiagonal form\r\n\tprec= prec*x\r\n\tfor (k=n-1; k != -1; k+= -1)\r\n\t{\r\n\t\tfor (var iteration=0; iteration < itmax; iteration++)\r\n\t\t{\t// test f splitting\r\n\t\t\tvar test_convergence = false\r\n\t\t\tfor (l=k; l != -1; l+= -1)\r\n\t\t\t{\t\r\n\t\t\t\tif (Math.abs(e[l]) <= prec)\r\n\t\t\t\t{\ttest_convergence= true\r\n\t\t\t\t\tbreak \r\n\t\t\t\t}\r\n\t\t\t\tif (Math.abs(q[l-1]) <= prec)\r\n\t\t\t\t\tbreak \r\n\t\t\t}\r\n\t\t\tif (!test_convergence)\r\n\t\t\t{\t// cancellation of e[l] if l>0\r\n\t\t\t\tc= 0.0\r\n\t\t\t\ts= 1.0\r\n\t\t\t\tvar l1= l-1\r\n\t\t\t\tfor (i =l; i<k+1; i++)\r\n\t\t\t\t{\t\r\n\t\t\t\t\tf= s*e[i]\r\n\t\t\t\t\te[i]= c*e[i]\r\n\t\t\t\t\tif (Math.abs(f) <= prec)\r\n\t\t\t\t\t\tbreak\r\n\t\t\t\t\tg= q[i]\r\n\t\t\t\t\th= pythag(f,g)\r\n\t\t\t\t\tq[i]= h\r\n\t\t\t\t\tc= g/h\r\n\t\t\t\t\ts= -f/h\r\n\t\t\t\t\tfor (j=0; j < m; j++)\r\n\t\t\t\t\t{\t\r\n\t\t\t\t\t\ty= u[j][l1]\r\n\t\t\t\t\t\tz= u[j][i]\r\n\t\t\t\t\t\tu[j][l1] =  y*c+(z*s)\r\n\t\t\t\t\t\tu[j][i] = -y*s+(z*c)\r\n\t\t\t\t\t} \r\n\t\t\t\t}\t\r\n\t\t\t}\r\n\t\t\t// test f convergence\r\n\t\t\tz= q[k]\r\n\t\t\tif (l== k)\r\n\t\t\t{\t//convergence\r\n\t\t\t\tif (z<0.0)\r\n\t\t\t\t{\t//q[k] is made non-negative\r\n\t\t\t\t\tq[k]= -z\r\n\t\t\t\t\tfor (j=0; j < n; j++)\r\n\t\t\t\t\t\tv[j][k] = -v[j][k]\r\n\t\t\t\t}\r\n\t\t\t\tbreak  //break out of iteration loop and move on to next k value\r\n\t\t\t}\r\n\t\t\tif (iteration >= itmax-1)\r\n\t\t\t\tthrow 'Error: no convergence.'\r\n\t\t\t// shift from bottom 2x2 minor\r\n\t\t\tx= q[l]\r\n\t\t\ty= q[k-1]\r\n\t\t\tg= e[k-1]\r\n\t\t\th= e[k]\r\n\t\t\tf= ((y-z)*(y+z)+(g-h)*(g+h))/(2.0*h*y)\r\n\t\t\tg= pythag(f,1.0)\r\n\t\t\tif (f < 0.0)\r\n\t\t\t\tf= ((x-z)*(x+z)+h*(y/(f-g)-h))/x\r\n\t\t\telse\r\n\t\t\t\tf= ((x-z)*(x+z)+h*(y/(f+g)-h))/x\r\n\t\t\t// next QR transformation\r\n\t\t\tc= 1.0\r\n\t\t\ts= 1.0\r\n\t\t\tfor (i=l+1; i< k+1; i++)\r\n\t\t\t{\t\r\n\t\t\t\tg= e[i]\r\n\t\t\t\ty= q[i]\r\n\t\t\t\th= s*g\r\n\t\t\t\tg= c*g\r\n\t\t\t\tz= pythag(f,h)\r\n\t\t\t\te[i-1]= z\r\n\t\t\t\tc= f/z\r\n\t\t\t\ts= h/z\r\n\t\t\t\tf= x*c+g*s\r\n\t\t\t\tg= -x*s+g*c\r\n\t\t\t\th= y*s\r\n\t\t\t\ty= y*c\r\n\t\t\t\tfor (j=0; j < n; j++)\r\n\t\t\t\t{\t\r\n\t\t\t\t\tx= v[j][i-1]\r\n\t\t\t\t\tz= v[j][i]\r\n\t\t\t\t\tv[j][i-1] = x*c+z*s\r\n\t\t\t\t\tv[j][i] = -x*s+z*c\r\n\t\t\t\t}\r\n\t\t\t\tz= pythag(f,h)\r\n\t\t\t\tq[i-1]= z\r\n\t\t\t\tc= f/z\r\n\t\t\t\ts= h/z\r\n\t\t\t\tf= c*g+s*y\r\n\t\t\t\tx= -s*g+c*y\r\n\t\t\t\tfor (j=0; j < m; j++)\r\n\t\t\t\t{\r\n\t\t\t\t\ty= u[j][i-1]\r\n\t\t\t\t\tz= u[j][i]\r\n\t\t\t\t\tu[j][i-1] = y*c+z*s\r\n\t\t\t\t\tu[j][i] = -y*s+z*c\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\te[l]= 0.0\r\n\t\t\te[k]= f\r\n\t\t\tq[k]= x\r\n\t\t} \r\n\t}\r\n\t\t\r\n\t//vt= transpose(v)\r\n\t//return (u,q,vt)\r\n\tfor (i=0;i<q.length; i++) \r\n\t  if (q[i] < prec) q[i] = 0\r\n\t  \r\n\t//sort eigenvalues\t\r\n\tfor (i=0; i< n; i++)\r\n\t{\t \r\n\t//writeln(q)\r\n\t for (j=i-1; j >= 0; j--)\r\n\t {\r\n\t  if (q[j] < q[i])\r\n\t  {\r\n\t//  writeln(i,'-',j)\r\n\t   c = q[j]\r\n\t   q[j] = q[i]\r\n\t   q[i] = c\r\n\t   for(k=0;k<u.length;k++) { temp = u[k][i]; u[k][i] = u[k][j]; u[k][j] = temp; }\r\n\t   for(k=0;k<v.length;k++) { temp = v[k][i]; v[k][i] = v[k][j]; v[k][j] = temp; }\r\n//\t   u.swapCols(i,j)\r\n//\t   v.swapCols(i,j)\r\n\t   i = j\t   \r\n\t  }\r\n\t }\t\r\n\t}\r\n\t\r\n\treturn {U:u,S:q,V:v}\r\n};\r\n\r\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n\n},{}],68:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.resampleFloat32Array = resampleFloat32Array;\n\nvar _fractionalDelay = require('fractional-delay');\n\nvar _fractionalDelay2 = _interopRequireDefault(_fractionalDelay);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Convert an array, typed or not, to a Float32Array, with possible re-sampling.\n *\n * @param {Object} options\n * @param {Array} options.inputSamples input array\n * @param {Number} options.inputSampleRate in Hertz\n * @param {Number} [options.outputSampleRate=options.inputSampleRate]\n * @returns {Promise.<Float32Array|Error>}\n */\nfunction resampleFloat32Array() {\n  var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n  var promise = new Promise(function (resolve, reject) {\n    var inputSamples = options.inputSamples;\n    var inputSampleRate = options.inputSampleRate;\n\n    var inputDelay = typeof options.inputDelay !== 'undefined' ? options.inputDelay : 0;\n\n    var outputSampleRate = typeof options.outputSampleRate !== 'undefined' ? options.outputSampleRate : inputSampleRate;\n\n    if (inputSampleRate === outputSampleRate && inputDelay === 0) {\n      resolve(new Float32Array(inputSamples));\n    } else {\n      try {\n        var outputSamplesNb = Math.ceil(inputSamples.length * outputSampleRate / inputSampleRate);\n\n        var context = new window.OfflineAudioContext(1, outputSamplesNb, outputSampleRate);\n\n        var inputBuffer = context.createBuffer(1, inputSamples.length, inputSampleRate);\n\n        // create fractional delay\n        var maxDelay = 1.0;\n        var fractionalDelay = new _fractionalDelay2.default(inputSampleRate, maxDelay);\n        fractionalDelay.setDelay(inputDelay / inputSampleRate);\n\n        // create input buffer after applying fractional delay\n        inputBuffer.getChannelData(0).set(fractionalDelay.process(inputSamples));\n\n        var source = context.createBufferSource();\n        source.buffer = inputBuffer;\n        source.connect(context.destination);\n\n        source.start(); // will start with offline context\n\n        context.oncomplete = function (event) {\n          var outputSamples = event.renderedBuffer.getChannelData(0);\n          resolve(outputSamples);\n        };\n\n        context.startRendering();\n      } catch (error) {\n        reject(new Error('Unable to re-sample Float32Array. ' + error.message));\n      }\n    }\n  });\n\n  return promise;\n} /**\n   * @fileOverview Audio utilities\n   * @author Jean-Philippe.Lambert@ircam.fr\n   * @copyright 2016 IRCAM, Paris, France\n   * @license BSD-3-Clause\n   */\n\nexports.default = {\n  resampleFloat32Array: resampleFloat32Array\n};\n},{\"fractional-delay\":80}],69:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.tree = undefined;\nexports.distanceSquared = distanceSquared;\nexports.distance = distance;\n\nvar _kd = require('kd.tree');\n\nvar _kd2 = _interopRequireDefault(_kd);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.tree = _kd2.default;\n\n/**\n * Get the squared distance between to points.\n *\n * (Avoid computing the square-root when unnecessary.)\n *\n * @param {Object} a in cartesian coordinates.\n * @param {Number} a.x\n * @param {Number} a.y\n * @param {Number} a.z\n * @param {Object} b in cartesian coordinates.\n * @param {Number} b.x\n * @param {Number} b.y\n * @param {Number} b.z\n * @returns {Number}\n */\n/**\n * @fileOverview Helpers for k-d tree.\n * @author Jean-Philippe.Lambert@ircam.fr\n * @copyright 2015-2016 IRCAM, Paris, France\n * @license BSD-3-Clause\n */\n\nfunction distanceSquared(a, b) {\n  var x = b.x - a.x;\n  var y = b.y - a.y;\n  var z = b.z - a.z;\n  return x * x + y * y + z * z;\n}\n\n/**\n * Get the distance between to points.\n *\n * @param {Object} a in cartesian coordinates.\n * @param {Number} a.x\n * @param {Number} a.y\n * @param {Number} a.z\n * @param {Object} b in cartesian coordinates.\n * @param {Number} b.x\n * @param {Number} b.y\n * @param {Number} b.z\n * @returns {Number}\n */\nfunction distance(a, b) {\n  return Math.sqrt(this.distanceSquared(a, b));\n}\n\nexports.default = {\n  distance: distance,\n  distanceSquared: distanceSquared,\n  tree: _kd2.default\n};\n},{\"kd.tree\":96}],70:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.sofaCartesianToGl = sofaCartesianToGl;\nexports.glToSofaCartesian = glToSofaCartesian;\nexports.sofaCartesianToSofaSpherical = sofaCartesianToSofaSpherical;\nexports.sofaSphericalToSofaCartesian = sofaSphericalToSofaCartesian;\nexports.sofaSphericalToGl = sofaSphericalToGl;\nexports.glToSofaSpherical = glToSofaSpherical;\nexports.sofaToSofaCartesian = sofaToSofaCartesian;\nexports.spat4CartesianToGl = spat4CartesianToGl;\nexports.glToSpat4Cartesian = glToSpat4Cartesian;\nexports.spat4CartesianToSpat4Spherical = spat4CartesianToSpat4Spherical;\nexports.spat4SphericalToSpat4Cartesian = spat4SphericalToSpat4Cartesian;\nexports.spat4SphericalToGl = spat4SphericalToGl;\nexports.glToSpat4Spherical = glToSpat4Spherical;\nexports.systemType = systemType;\nexports.systemToGl = systemToGl;\nexports.glToSystem = glToSystem;\n\nvar _degree = require('./degree');\n\nvar _degree2 = _interopRequireDefault(_degree);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Coordinates as an array of 3 values:\n * [x, y, z] or [azimuth, elevation, distance], depending on system\n *\n * @typedef {vec3} Coordinates\n */\n\n/**\n * Coordinate system: `gl`, `sofaCartesian`, `sofaSpherical`,\n * `spat4Cartesian`, or `spat4Spherical`.\n *\n * @typedef {String} CoordinateSystem\n */\n\n// ----------------------------- SOFA\n\n/**\n * SOFA cartesian coordinate system: `sofaCartesian`.\n *\n * SOFA distances are in metres.\n *\n * <pre>\n *\n * SOFA          +z  +x             openGL    +y\n *                | /                          |\n *                |/                           |\n *         +y ----o                            o---- +x\n *                                            /\n *                                           /\n *                                          +z\n *\n * SOFA.x = -openGL.z               openGL.x = -SOFA.y\n * SOFA.y = -openGL.x               openGL.y =  SOFA.z\n * SOFA.z =  openGL.y               openGL.z = -SOFA.x\n *\n * </pre>\n *\n * @typedef {Coordinates} SofaCartesian\n */\n\n/**\n * SOFA spherical coordinate system:  `sofaSpherical`.\n *\n * SOFA angles are in degrees.\n *\n * <pre>\n *\n * SOFA.azimuth = atan2(SOFA.y, SOFA.x)\n * SOFA.elevation = atan2(SOFA.z, sqrt(SOFA.x * SOFA.x + SOFA.y * SOFA.y) );\n * SOFA.distance = sqrt(SOFA.x * SOFA.x + SOFA.y * SOFA.y + SOFA.z * SOFA.z)\n *\n * </pre>\n *\n * @typedef {Coordinates} SofaSpherical\n */\n\n/**\n * Convert SOFA cartesian coordinates to openGL.\n *\n * @param {Coordinates} out in-place if out === a.\n * @param {Coordinates} a\n * @returns {Coordinates} out\n */\nfunction sofaCartesianToGl(out, a) {\n  // copy to handle in-place\n  var x = a[0];\n  var y = a[1];\n  var z = a[2];\n\n  out[0] = 0 - y;\n  out[1] = z;\n  out[2] = 0 - x;\n\n  return out;\n}\n\n/**\n * Convert openGL coordinates to SOFA cartesian.\n *\n * @param {Coordinates} out in-place if out === a.\n * @param {Coordinates} a\n * @returns {Coordinates} out\n */\n/**\n * @fileOverview Coordinate systems conversions. openGL, SOFA, and Spat4 (Ircam).\n *\n * @author Jean-Philippe.Lambert@ircam.fr\n * @copyright 2015-2016 IRCAM, Paris, France\n * @license BSD-3-Clause\n */\n\nfunction glToSofaCartesian(out, a) {\n  // copy to handle in-place\n  var x = a[0];\n  var y = a[1];\n  var z = a[2];\n\n  out[0] = 0 - z;\n  out[1] = 0 - x;\n  out[2] = y;\n\n  return out;\n}\n\n/**\n * Convert SOFA cartesian coordinates to SOFA spherical.\n *\n * @param {Coordinates} out in-place if out === a.\n * @param {Coordinates} a\n * @returns {Coordinates} out\n */\nfunction sofaCartesianToSofaSpherical(out, a) {\n  // copy to handle in-place\n  var x = a[0];\n  var y = a[1];\n  var z = a[2];\n\n  var x2y2 = x * x + y * y;\n\n  // from [-180, 180] to [0, 360);\n  out[0] = (_degree2.default.atan2(y, x) + 360) % 360;\n\n  out[1] = _degree2.default.atan2(z, Math.sqrt(x2y2));\n  out[2] = Math.sqrt(x2y2 + z * z);\n\n  return out;\n}\n\n/**\n * Convert SOFA spherical coordinates to SOFA spherical.\n *\n * @param {Coordinates} out in-place if out === a.\n * @param {Coordinates} a\n * @returns {Coordinates} out\n */\nfunction sofaSphericalToSofaCartesian(out, a) {\n  // copy to handle in-place\n  var azimuth = a[0];\n  var elevation = a[1];\n  var distance = a[2];\n\n  var cosE = _degree2.default.cos(elevation);\n  out[0] = distance * cosE * _degree2.default.cos(azimuth); // SOFA.x\n  out[1] = distance * cosE * _degree2.default.sin(azimuth); // SOFA.y\n  out[2] = distance * _degree2.default.sin(elevation); // SOFA.z\n\n  return out;\n}\n\n/**\n * Convert SOFA spherical coordinates to openGL.\n *\n * @param {Coordinates} out in-place if out === a.\n * @param {Coordinates} a\n * @returns {Coordinates} out\n */\nfunction sofaSphericalToGl(out, a) {\n  // copy to handle in-place\n  var azimuth = a[0];\n  var elevation = a[1];\n  var distance = a[2];\n\n  var cosE = _degree2.default.cos(elevation);\n  out[0] = 0 - distance * cosE * _degree2.default.sin(azimuth); // -SOFA.y\n  out[1] = distance * _degree2.default.sin(elevation); // SOFA.z\n  out[2] = 0 - distance * cosE * _degree2.default.cos(azimuth); // -SOFA.x\n\n  return out;\n}\n\n/**\n * Convert openGL coordinates to SOFA spherical.\n *\n * @param {Coordinates} out in-place if out === a.\n * @param {Coordinates} a\n * @returns {Coordinates} out\n */\nfunction glToSofaSpherical(out, a) {\n  // copy to handle in-place\n  // difference to avoid generating -0 out of 0\n  var x = 0 - a[2]; // -openGL.z\n  var y = 0 - a[0]; // -openGL.x\n  var z = a[1]; // openGL.y\n\n  var x2y2 = x * x + y * y;\n\n  // from [-180, 180] to [0, 360);\n  out[0] = (_degree2.default.atan2(y, x) + 360) % 360;\n\n  out[1] = _degree2.default.atan2(z, Math.sqrt(x2y2));\n  out[2] = Math.sqrt(x2y2 + z * z);\n\n  return out;\n}\n\n/**\n * Convert coordinates to SOFA cartesian.\n *\n * @param {Coordinates} out in-place if out === a.\n * @param {Coordinates} a\n * @param {CoordinateSystem} system\n * @returns {Coordinates} out\n * @throws {Error} when the system is unknown.\n */\nfunction sofaToSofaCartesian(out, a, system) {\n  switch (system) {\n    case 'sofaCartesian':\n      out[0] = a[0];\n      out[1] = a[1];\n      out[2] = a[2];\n      break;\n\n    case 'sofaSpherical':\n      sofaSphericalToSofaCartesian(out, a);\n      break;\n\n    default:\n      throw new Error('Bad coordinate system');\n  }\n  return out;\n}\n\n// ---------------- Spat4\n\n/**\n * Spat4 cartesian coordinate system: `spat4Cartesian`.\n *\n * Spat4 distances are in metres.\n *\n * <pre>\n *\n * Spat4         +z  +y             openGL    +y\n *                | /                          |\n *                |/                           |\n *                o---- +x                     o---- +x\n *                                            /\n *                                           /\n *                                         +z\n *\n * Spat4.x =  openGL.x               openGL.x =  Spat4.x\n * Spat4.y = -openGL.z               openGL.y =  Spat4.z\n * Spat4.z =  openGL.y               openGL.z = -Spat4.y\n *\n * </pre>\n *\n * @typedef {Coordinates} Spat4Cartesian\n */\n\n/**\n * Spat4 spherical coordinate system: `spat4Spherical`.\n *\n * Spat4 angles are in degrees.\n *\n * <pre>\n *\n * Spat4.azimuth = atan2(Spat4.x, Spat4.y)\n * Spat4.elevation = atan2(Spat4.z, sqrt(Spat4.x * Spat4.x + Spat4.y * Spat4.y) );\n * Spat4.distance = sqrt(Spat4.x * Spat4.x + Spat4.y * Spat4.y + Spat4.z * Spat4.z)\n *\n * </pre>\n *\n * @typedef {Coordinates} Spat4Spherical\n */\n\n/**\n * Convert Spat4 cartesian coordinates to openGL.\n *\n * @param {Coordinates} out in-place if out === a.\n * @param {Coordinates} a\n * @returns {Coordinates} out\n */\nfunction spat4CartesianToGl(out, a) {\n  // copy to handle in-place\n  var x = a[0];\n  var y = a[1];\n  var z = a[2];\n\n  out[0] = x;\n  out[1] = z;\n  out[2] = 0 - y;\n\n  return out;\n}\n\n/**\n * Convert openGL coordinates to Spat4 cartesian.\n *\n * @param {Coordinates} out in-place if out === a.\n * @param {Coordinates} a\n * @returns {Coordinates} out\n */\nfunction glToSpat4Cartesian(out, a) {\n  // copy to handle in-place\n  var x = a[0];\n  var y = a[1];\n  var z = a[2];\n\n  out[0] = x;\n  out[1] = 0 - z;\n  out[2] = y;\n\n  return out;\n}\n\n/**\n * Convert Spat4 cartesian coordinates to Spat4 spherical.\n *\n * @param {Coordinates} out in-place if out === a.\n * @param {Coordinates} a\n * @returns {Coordinates} out\n */\nfunction spat4CartesianToSpat4Spherical(out, a) {\n  // copy to handle in-place\n  var x = a[0];\n  var y = a[1];\n  var z = a[2];\n\n  var x2y2 = x * x + y * y;\n\n  out[0] = _degree2.default.atan2(x, y);\n  out[1] = _degree2.default.atan2(z, Math.sqrt(x2y2));\n  out[2] = Math.sqrt(x2y2 + z * z);\n\n  return out;\n}\n\n/**\n * Convert Spat4 spherical coordinates to Spat4 spherical.\n *\n * @param {Coordinates} out in-place if out === a.\n * @param {Coordinates} a\n * @returns {Coordinates} out\n */\nfunction spat4SphericalToSpat4Cartesian(out, a) {\n  // copy to handle in-place\n  var azimuth = a[0];\n  var elevation = a[1];\n  var distance = a[2];\n\n  var cosE = _degree2.default.cos(elevation);\n  out[0] = distance * cosE * _degree2.default.sin(azimuth); // Spat4.x\n  out[1] = distance * cosE * _degree2.default.cos(azimuth); // Spat4.y\n  out[2] = distance * _degree2.default.sin(elevation); // Spat4.z\n\n  return out;\n}\n\n/**\n * Convert Spat4 spherical coordinates to openGL.\n *\n * @param {Coordinates} out in-place if out === a.\n * @param {Coordinates} a\n * @returns {Coordinates} out\n */\nfunction spat4SphericalToGl(out, a) {\n  // copy to handle in-place\n  var azimuth = a[0];\n  var elevation = a[1];\n  var distance = a[2];\n\n  var cosE = _degree2.default.cos(elevation);\n  out[0] = distance * cosE * _degree2.default.sin(azimuth); // Spat4.x\n  out[1] = distance * _degree2.default.sin(elevation); // Spat4.z\n  out[2] = 0 - distance * cosE * _degree2.default.cos(azimuth); // -Spat4.y\n\n  return out;\n}\n\n/**\n * Convert openGL coordinates to Spat4 spherical.\n *\n * @param {Coordinates} out in-place if out === a.\n * @param {Coordinates} a\n * @returns {Coordinates} out\n */\nfunction glToSpat4Spherical(out, a) {\n  // copy to handle in-place\n  // difference to avoid generating -0 out of 0\n  var x = a[0]; // openGL.x\n  var y = 0 - a[2]; // -openGL.z\n  var z = a[1]; // openGL.y\n\n  var x2y2 = x * x + y * y;\n\n  out[0] = _degree2.default.atan2(x, y);\n  out[1] = _degree2.default.atan2(z, Math.sqrt(x2y2));\n  out[2] = Math.sqrt(x2y2 + z * z);\n\n  return out;\n}\n\n// ---------------- named coordinate systems\n\n/**\n * Get the coordinate system general type (cartesian or spherical).\n *\n * @param {String} system\n * @returns {String} 'cartesian' or 'spherical', if `system` if of cartesian\n * or spherical type.\n */\nfunction systemType(system) {\n  var type = void 0;\n  if (system === 'sofaCartesian' || system === 'spat4Cartesian' || system === 'gl') {\n    type = 'cartesian';\n  } else if (system === 'sofaSpherical' || system === 'spat4Spherical') {\n    type = 'spherical';\n  } else {\n    throw new Error('Unknown coordinate system type ' + system);\n  }\n  return type;\n}\n\n/**\n * Convert coordinates to openGL.\n *\n * @param {Coordinates} out in-place if out === a.\n * @param {Coordinates} a\n * @param {CoordinateSystem} system\n * @returns {Coordinates} out\n * @throws {Error} when the system is unknown.\n */\nfunction systemToGl(out, a, system) {\n  switch (system) {\n    case 'gl':\n      out[0] = a[0];\n      out[1] = a[1];\n      out[2] = a[2];\n      break;\n\n    case 'sofaCartesian':\n      sofaCartesianToGl(out, a);\n      break;\n\n    case 'sofaSpherical':\n      sofaSphericalToGl(out, a);\n      break;\n\n    case 'spat4Cartesian':\n      spat4CartesianToGl(out, a);\n      break;\n\n    case 'spat4Spherical':\n      spat4SphericalToGl(out, a);\n      break;\n\n    default:\n      throw new Error('Bad coordinate system');\n  }\n  return out;\n}\n\n/**\n * Convert openGL coordinates to other system.\n *\n * @param {Coordinates} out in-place if out === a.\n * @param {Coordinates} a\n * @param {CoordinateSystem} system\n * @returns {Coordinates} out\n * @throws {Error} when the system is unknown.\n */\nfunction glToSystem(out, a, system) {\n  switch (system) {\n    case 'gl':\n      out[0] = a[0];\n      out[1] = a[1];\n      out[2] = a[2];\n      break;\n\n    case 'sofaCartesian':\n      glToSofaCartesian(out, a);\n      break;\n\n    case 'sofaSpherical':\n      glToSofaSpherical(out, a);\n      break;\n\n    case 'spat4Cartesian':\n      glToSpat4Cartesian(out, a);\n      break;\n\n    case 'spat4Spherical':\n      glToSpat4Spherical(out, a);\n      break;\n\n    default:\n      throw new Error('Bad coordinate system');\n  }\n  return out;\n}\n\nexports.default = {\n  glToSofaCartesian: glToSofaCartesian,\n  glToSofaSpherical: glToSofaSpherical,\n  glToSpat4Cartesian: glToSpat4Cartesian,\n  glToSpat4Spherical: glToSpat4Spherical,\n  glToSystem: glToSystem,\n  sofaCartesianToGl: sofaCartesianToGl,\n  sofaCartesianToSofaSpherical: sofaCartesianToSofaSpherical,\n  sofaSphericalToGl: sofaSphericalToGl,\n  sofaSphericalToSofaCartesian: sofaSphericalToSofaCartesian,\n  sofaToSofaCartesian: sofaToSofaCartesian,\n  spat4CartesianToGl: spat4CartesianToGl,\n  spat4CartesianToSpat4Spherical: spat4CartesianToSpat4Spherical,\n  spat4SphericalToGl: spat4SphericalToGl,\n  spat4SphericalToSpat4Cartesian: spat4SphericalToSpat4Cartesian,\n  systemToGl: systemToGl,\n  systemType: systemType\n};\n},{\"./degree\":71}],71:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.toRadian = toRadian;\nexports.fromRadian = fromRadian;\nexports.cos = cos;\nexports.sin = sin;\nexports.atan2 = atan2;\n/**\n * @fileOverview Convert to and from degree\n * @author Jean-Philippe.Lambert@ircam.fr\n * @copyright 2015-2016 IRCAM, Paris, France\n * @license BSD-3-Clause\n */\n\n/**\n * Degree to radian multiplication factor.\n *\n * @type {Number}\n */\nvar toRadianFactor = exports.toRadianFactor = Math.PI / 180;\n\n/**\n * Radian to degree multiplication factor.\n *\n * @type {Number}\n */\nvar fromRadianFactor = exports.fromRadianFactor = 1 / toRadianFactor;\n\n/**\n * Convert an angle in degrees to radians.\n *\n * @param {Number} angle in degrees\n * @returns {Number} angle in radians\n */\nfunction toRadian(angle) {\n  return angle * toRadianFactor;\n}\n\n/**\n * Convert an angle in radians to degrees.\n *\n * @param {Number} angle in radians\n * @returns {Number} angle in degrees\n */\nfunction fromRadian(angle) {\n  return angle * fromRadianFactor;\n}\n\n/**\n * Get the cosinus of an angle in degrees.\n *\n * @param {Number} angle\n * @returns {Number}\n */\nfunction cos(angle) {\n  return Math.cos(angle * toRadianFactor);\n}\n\n/**\n * Get the sinus of an angle in degrees.\n *\n * @param {Number} angle\n * @returns {Number}\n */\nfunction sin(angle) {\n  return Math.sin(angle * toRadianFactor);\n}\n\n/**\n * Get the arc-tangent (2 arguments) of 2 angles in degrees.\n *\n * @param {Number} y\n * @param {Number} x\n * @returns {Number}\n */\nfunction atan2(y, x) {\n  return Math.atan2(y, x) * fromRadianFactor;\n}\n\nexports.default = {\n  atan2: atan2,\n  cos: cos,\n  fromRadian: fromRadian,\n  fromRadianFactor: fromRadianFactor,\n  sin: sin,\n  toRadian: toRadian,\n  toRadianFactor: toRadianFactor\n};\n},{}],72:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ServerDataBase = exports.HrtfSet = undefined;\n\nvar _HrtfSet = require('./sofa/HrtfSet');\n\nvar _HrtfSet2 = _interopRequireDefault(_HrtfSet);\n\nvar _ServerDataBase = require('./sofa/ServerDataBase');\n\nvar _ServerDataBase2 = _interopRequireDefault(_ServerDataBase);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.HrtfSet = _HrtfSet2.default;\nexports.ServerDataBase = _ServerDataBase2.default;\nexports.default = {\n  HrtfSet: _HrtfSet2.default,\n  ServerDataBase: _ServerDataBase2.default\n};\n\n// import audio from './audio';\n// export { audio };\n// import common from './common';\n// export { common };\n// import geometry from './geometry';\n// export { geometry };\n// import info from './info';\n// export { info };\n// import sofa from './sofa';\n// export { sofa };\n\n// export default {\n//   audio,\n//   common,\n//   geometry,\n//   info,\n//   sofa,\n// };\n},{\"./sofa/HrtfSet\":74,\"./sofa/ServerDataBase\":75}],73:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.version = exports.name = exports.license = exports.description = undefined;\n\nvar _package = require('../package.json');\n\nvar _package2 = _interopRequireDefault(_package);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * @module info\n */\n\n/**\n * Short description of the library.\n *\n * @type {String}\n */\nvar description = _package2.default.description;\n\n/**\n * License of the library.\n *\n * @type {String}\n */\n/**\n * @fileOverview Information on the library, from the `package.json` file.\n *\n * @author Jean-Philippe.Lambert@ircam.fr\n * @copyright 2016 IRCAM, Paris, France\n * @license BSD-3-Clause\n */\n\nexports.description = description;\nvar license = _package2.default.license;\n\n/**\n * Name of the library.\n *\n * @type {String}\n */\n\nexports.license = license;\nvar name = _package2.default.name;\n\n/**\n * Semantic version of the library.\n *\n * @type {String}\n */\n\nexports.name = name;\nvar version = _package2.default.version;\nexports.version = version;\nexports.default = {\n  description: description,\n  license: license,\n  name: name,\n  version: version\n};\n},{\"../package.json\":97}],74:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.HrtfSet = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /**\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * @fileOverview Container for HRTF set: load a set from an URL and get\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * filters from corresponding positions.\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      *\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * @author Jean-Philippe.Lambert@ircam.fr\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * @copyright 2015-2016 IRCAM, Paris, France\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * @license BSD-3-Clause\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      */\n\nvar _glMatrix = require('gl-matrix');\n\nvar _glMatrix2 = _interopRequireDefault(_glMatrix);\n\nvar _info = require('../info');\n\nvar _info2 = _interopRequireDefault(_info);\n\nvar _parseDataSet = require('./parseDataSet');\n\nvar _parseSofa = require('./parseSofa');\n\nvar _coordinates = require('../geometry/coordinates');\n\nvar _coordinates2 = _interopRequireDefault(_coordinates);\n\nvar _KdTree = require('../geometry/KdTree');\n\nvar _KdTree2 = _interopRequireDefault(_KdTree);\n\nvar _utilities = require('../audio/utilities');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * Container for HRTF set.\n */\n\nvar HrtfSet = exports.HrtfSet = function () {\n\n  /**\n   * Constructs an HRTF set. Note that the filter positions are applied\n   * during the load of an URL.\n   *\n   * @see {@link HrtfSet#load}\n   *\n   * @param {Object} options\n   * @param {AudioContext} options.audioContext mandatory for the creation\n   * of FIR audio buffers\n   * @param {CoordinateSystem} [options.coordinateSystem='gl']\n   * {@link HrtfSet#coordinateSystem}\n   * @param {CoordinateSystem} [options.filterCoordinateSystem=options.coordinateSystem]\n   * {@link HrtfSet#filterCoordinateSystem}\n   * @param {Array.<Coordinates>} [options.filterPositions=undefined]\n   * {@link HrtfSet#filterPositions}\n   * array of positions to filter. Use undefined to use all positions.\n   * @param {Boolean} [options.filterAfterLoad=false] true to filter after\n   * full load of SOFA file, instead of multiple partial loading.\n   * {@link HrtfSet#filterAfterLoad}\n   */\n\n  function HrtfSet() {\n    var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n    _classCallCheck(this, HrtfSet);\n\n    this._audioContext = options.audioContext;\n\n    this._ready = false;\n\n    this.coordinateSystem = options.coordinateSystem;\n\n    this.filterCoordinateSystem = options.filterCoordinateSystem;\n    this.filterPositions = options.filterPositions;\n\n    this.filterAfterLoad = options.filterAfterLoad;\n  }\n\n  // ------------ accessors\n\n  /**\n   * Set coordinate system for positions.\n   * @param {CoordinateSystem} [system='gl']\n   */\n\n\n  _createClass(HrtfSet, [{\n    key: 'applyFilterPositions',\n\n\n    // ------------- public methods\n\n    /**\n     * Apply filter positions to an existing set of HRTF. (After a successful\n     * load.)\n     *\n     * This is destructive.\n     *\n     * @see {@link HrtfSet#load}\n     */\n    value: function applyFilterPositions() {\n      var _this = this;\n\n      // do not use getter for gl positions\n      var filteredPositions = this._filterPositions.map(function (current) {\n        return _this._kdt.nearest({ x: current[0], y: current[1], z: current[2] }, 1).pop()[0]; // nearest data\n      });\n\n      // filter out duplicates\n      filteredPositions = [].concat(_toConsumableArray(new Set(filteredPositions)));\n\n      this._kdt = _KdTree2.default.tree.createKdTree(filteredPositions, _KdTree2.default.distanceSquared, ['x', 'y', 'z']);\n    }\n\n    /**\n     * Load an URL and generate the corresponding set of IR buffers.\n     *\n     * @param {String} sourceUrl\n     * @returns {Promise.<this|Error>} resolve when the URL sucessfully\n     * loaded.\n     */\n\n  }, {\n    key: 'load',\n    value: function load(sourceUrl) {\n      var _this2 = this;\n\n      var extension = sourceUrl.split('.').pop();\n\n      var url = extension === 'sofa' ? sourceUrl + '.json' : sourceUrl;\n\n      var promise = void 0;\n\n      // need a server for partial downloading (\"sofa\" extension may be naive)\n      var preFilter = typeof this._filterPositions !== 'undefined' && !this.filterAfterLoad && extension === 'sofa';\n      if (preFilter) {\n        promise = Promise.all([this._loadMetaAndPositions(sourceUrl), this._loadDataSet(sourceUrl)]).then(function (indicesAndDataSet) {\n          var indices = indicesAndDataSet[0];\n          var dataSet = indicesAndDataSet[1];\n          return _this2._loadSofaPartial(sourceUrl, indices, dataSet).then(function () {\n            _this2._ready = true;\n            return _this2; // final resolve\n          });\n        }).catch(function () {\n          // when pre-fitering fails, for any reason, try to post-filter\n          // console.log(`Error while partial loading of ${sourceUrl}. `\n          //             + `${error.message}. `\n          //             + `Load full and post-filtering, instead.`);\n          return _this2._loadSofaFull(url).then(function () {\n            _this2.applyFilterPositions();\n            _this2._ready = true;\n            return _this2; // final resolve\n          });\n        });\n      } else {\n          promise = this._loadSofaFull(url).then(function () {\n            if (typeof _this2._filterPositions !== 'undefined' && _this2.filterAfterLoad) {\n              _this2.applyFilterPositions();\n            }\n            _this2._ready = true;\n            return _this2; // final resolve\n          });\n        }\n\n      return promise;\n    }\n\n    /**\n     * Export the current HRTF set as a JSON string.\n     *\n     * When set, `this.filterPositions` reduce the actual number of filter, and\n     * thus the exported set. The coordinate system of the export is\n     * `this.filterCoordinateSystem`.\n     *\n     * @see {@link HrtfSet#filterCoordinateSystem}\n     * @see {@link HrtfSet#filterPositions}\n     *\n     * @returns {String} as a SOFA JSON file.\n     * @throws {Error} when this.filterCoordinateSystem is unknown.\n     */\n\n  }, {\n    key: 'export',\n    value: function _export() {\n      var _this3 = this;\n\n      // in a SOFA file, the source positions are the HrtfSet filter positions.\n\n      // SOFA listener is the reference for HrtfSet filter positions\n      // which is normalised in HrtfSet\n\n      var SourcePosition = void 0;\n      var SourcePositionType = _coordinates2.default.systemType(this.filterCoordinateSystem);\n      switch (SourcePositionType) {\n        case 'cartesian':\n          SourcePosition = this._sofaSourcePosition.map(function (position) {\n            return _coordinates2.default.glToSofaCartesian([], position);\n          });\n          break;\n\n        case 'spherical':\n          SourcePosition = this._sofaSourcePosition.map(function (position) {\n            return _coordinates2.default.glToSofaSpherical([], position);\n          });\n          break;\n\n        default:\n          throw new Error('Bad source position type ' + SourcePositionType + ' ' + 'for export.');\n      }\n\n      var DataIR = this._sofaSourcePosition.map(function (position) {\n        // retrieve fir for each position, without conversion\n        var fir = _this3._kdt.nearest({ x: position[0], y: position[1], z: position[2] }, 1).pop()[0].fir; // nearest data\n        var ir = [];\n        for (var channel = 0; channel < fir.numberOfChannels; ++channel) {\n          // Float32Array to array for stringify\n          ir.push([].concat(_toConsumableArray(fir.getChannelData(channel))));\n        }\n        return ir;\n      });\n\n      return (0, _parseSofa.stringifySofa)({\n        name: this._sofaName,\n        metaData: this._sofaMetaData,\n        ListenerPosition: [0, 0, 0],\n        ListenerPositionType: 'cartesian',\n        ListenerUp: [0, 0, 1],\n        ListenerUpType: 'cartesian',\n        ListenerView: [1, 0, 0],\n        ListenerViewType: 'cartesian',\n        SourcePositionType: SourcePositionType,\n        SourcePosition: SourcePosition,\n        DataSamplingRate: this._audioContext.sampleRate,\n        DataDelay: this._sofaDelay,\n        DataIR: DataIR,\n        RoomVolume: this._sofaRoomVolume\n      });\n    }\n\n    /**\n     * @typedef {Object} HrtfSet.nearestType\n     * @property {Number} distance from the request\n     * @property {AudioBuffer} fir 2-channels impulse response\n     * @property {Number} index original index in the SOFA set\n     * @property {Coordinates} position using coordinateSystem coordinates\n     * system.\n     */\n\n    /**\n     * Get the nearest point in the HRTF set, after a successful load.\n     *\n     * @see {@link HrtfSet#load}\n     *\n     * @param {Coordinates} positionRequest\n     * @returns {HrtfSet.nearestType}\n     */\n\n  }, {\n    key: 'nearest',\n    value: function nearest(positionRequest) {\n      var position = _coordinates2.default.systemToGl([], positionRequest, this.coordinateSystem);\n      var nearest = this._kdt.nearest({\n        x: position[0],\n        y: position[1],\n        z: position[2]\n      }, 1).pop(); // nearest only\n      var data = nearest[0];\n      _coordinates2.default.glToSystem(position, [data.x, data.y, data.z], this.coordinateSystem);\n      return {\n        distance: nearest[1],\n        fir: data.fir,\n        index: data.index,\n        position: position\n      };\n    }\n\n    /**\n     * Get the FIR AudioBuffer that corresponds to the closest position in\n     * the set.\n     * @param {Coordinates} positionRequest\n     * @returns {AudioBuffer}\n     */\n\n  }, {\n    key: 'nearestFir',\n    value: function nearestFir(positionRequest) {\n      return this.nearest(positionRequest).fir;\n    }\n\n    // ----------- private methods\n\n    /**\n     * Creates a kd-tree out of the specified indices, positions, and FIR.\n     *\n     * @private\n     *\n     * @param {Array} indicesPositionsFirs\n     * @returns {this}\n     */\n\n  }, {\n    key: '_createKdTree',\n    value: function _createKdTree(indicesPositionsFirs) {\n      var _this4 = this;\n\n      var positions = indicesPositionsFirs.map(function (value) {\n        var impulseResponses = value[2];\n        var fir = _this4._audioContext.createBuffer(impulseResponses.length, impulseResponses[0].length, _this4._audioContext.sampleRate);\n        impulseResponses.forEach(function (samples, channel) {\n          // do not use copyToChannel because of Safari <= 9\n          fir.getChannelData(channel).set(samples);\n        });\n\n        return {\n          index: value[0],\n          x: value[1][0],\n          y: value[1][1],\n          z: value[1][2],\n          fir: fir\n        };\n      });\n\n      this._sofaSourcePosition = positions.map(function (position) {\n        return [position.x, position.y, position.z];\n      });\n\n      this._kdt = _KdTree2.default.tree.createKdTree(positions, _KdTree2.default.distanceSquared, ['x', 'y', 'z']);\n      return this;\n    }\n\n    /**\n     * Asynchronously create Float32Arrays, with possible re-sampling.\n     *\n     * @private\n     *\n     * @param {Array.<Number>} indices\n     * @param {Array.<Coordinates>} positions\n     * @param {Array.<Float32Array>} firs\n     * @returns {Promise.<Array|Error>}\n     * @throws {Error} assertion that the channel count is 2\n     */\n\n  }, {\n    key: '_generateIndicesPositionsFirs',\n    value: function _generateIndicesPositionsFirs(indices, positions, firs, delays) {\n      var _this5 = this;\n\n      var sofaFirsPromises = firs.map(function (sofaFirChannels, index) {\n        var channelCount = sofaFirChannels.length;\n        if (channelCount !== 2) {\n          throw new Error('Bad number of channels' + (' for IR index ' + indices[index]) + (' (' + channelCount + ' instead of 2)'));\n        }\n\n        /**\n        * input delay can either be [[delayLeft, delayRight]]: unique for all\n        * fir values, or [[dL1, dR1], ..., [dLN, dRN]]: per-position specific,\n        * e.g. for minimum phase firs.\n        */\n        if (delays[0].length !== 2) {\n          throw new Error('Bad delay format' + (' for IR index ' + indices[index]) + (' (first element in Data.Delay is ' + delays[0]) + ' instead of [[delayL, delayR]] )');\n        }\n        var inputDelays = typeof delays[index] !== 'undefined' ? delays[index] : delays[0];\n\n        var sofaFirsChannelsPromises = sofaFirChannels.map(function (fir, index2) {\n          if (inputDelays[index2] < 0) {\n            // accept only positive delays\n            throw new Error('Negative delay detected (not handled at the moment):' + (' delay index ' + indices[index]) + (' channel ' + index2));\n          }\n          return (0, _utilities.resampleFloat32Array)({\n            inputSamples: fir,\n            inputDelay: inputDelays[index2],\n            inputSampleRate: _this5._sofaSampleRate,\n            outputSampleRate: _this5._audioContext.sampleRate\n          });\n        });\n        return Promise.all(sofaFirsChannelsPromises).then(function (firChannels) {\n          return [indices[index], positions[index], firChannels];\n        }).catch(function (error) {\n          // re-throw\n          throw new Error('Unable to re-sample impulse response ' + index + '. ' + error.message);\n        });\n      });\n      return Promise.all(sofaFirsPromises);\n    }\n\n    /**\n     * Try to load a data set from a SOFA URL.\n     *\n     * @private\n     *\n     * @param {String} sourceUrl\n     * @returns {Promise.<Object|Error>}\n     */\n\n  }, {\n    key: '_loadDataSet',\n    value: function _loadDataSet(sourceUrl) {\n      var promise = new Promise(function (resolve, reject) {\n        var ddsUrl = sourceUrl + '.dds';\n        var request = new window.XMLHttpRequest();\n        request.open('GET', ddsUrl);\n        request.onerror = function () {\n          reject(new Error('Unable to GET ' + ddsUrl + ', status ' + request.status + ' ' + ('' + request.responseText)));\n        };\n\n        request.onload = function () {\n          if (request.status < 200 || request.status >= 300) {\n            request.onerror();\n            return;\n          }\n\n          try {\n            var dds = (0, _parseDataSet.parseDataSet)(request.response);\n            resolve(dds);\n          } catch (error) {\n            // re-throw\n            reject(new Error('Unable to parse ' + ddsUrl + '. ' + error.message));\n          }\n        }; // request.onload\n\n        request.send();\n      });\n\n      return promise;\n    }\n\n    /**\n     * Try to load meta-data and positions from a SOFA URL, to get the\n     * indices closest to the filter positions.\n     *\n     * @private\n     *\n     * @param {String} sourceUrl\n     * @returns {Promise.<Array.<Number>|Error>}\n     */\n\n  }, {\n    key: '_loadMetaAndPositions',\n    value: function _loadMetaAndPositions(sourceUrl) {\n      var _this6 = this;\n\n      var promise = new Promise(function (resolve, reject) {\n        var positionsUrl = sourceUrl + '.json?' + 'ListenerPosition,ListenerUp,ListenerView,SourcePosition,' + 'Data.Delay,Data.SamplingRate,' + 'EmitterPosition,ReceiverPosition,RoomVolume'; // meta\n\n        var request = new window.XMLHttpRequest();\n        request.open('GET', positionsUrl);\n        request.onerror = function () {\n          reject(new Error('Unable to GET ' + positionsUrl + ', status ' + request.status + ' ' + ('' + request.responseText)));\n        };\n\n        request.onload = function () {\n          if (request.status < 200 || request.status >= 300) {\n            request.onerror();\n            return;\n          }\n\n          try {\n            (function () {\n              var data = (0, _parseSofa.parseSofa)(request.response);\n              _this6._setMetaData(data, sourceUrl);\n\n              var sourcePositions = _this6._sourcePositionsToGl(data);\n              var hrtfPositions = sourcePositions.map(function (position, index) {\n                return {\n                  x: position[0],\n                  y: position[1],\n                  z: position[2],\n                  index: index\n                };\n              });\n\n              var kdt = _KdTree2.default.tree.createKdTree(hrtfPositions, _KdTree2.default.distanceSquared, ['x', 'y', 'z']);\n\n              var nearestIndices = _this6._filterPositions.map(function (current) {\n                return kdt.nearest({ x: current[0], y: current[1], z: current[2] }, 1).pop()[0] // nearest data\n                .index;\n              });\n\n              // filter out duplicates\n              nearestIndices = [].concat(_toConsumableArray(new Set(nearestIndices)));\n\n              _this6._sofaUrl = sourceUrl;\n              resolve(nearestIndices);\n            })();\n          } catch (error) {\n            // re-throw\n            reject(new Error('Unable to parse ' + positionsUrl + '. ' + error.message));\n          }\n        }; // request.onload\n\n        request.send();\n      });\n\n      return promise;\n    }\n\n    /**\n     * Try to load full SOFA URL.\n     *\n     * @private\n     *\n     * @param {String} url\n     * @returns {Promise.<this|Error>}\n     */\n\n  }, {\n    key: '_loadSofaFull',\n    value: function _loadSofaFull(url) {\n      var _this7 = this;\n\n      var promise = new Promise(function (resolve, reject) {\n        var request = new window.XMLHttpRequest();\n        request.open('GET', url);\n        request.onerror = function () {\n          reject(new Error('Unable to GET ' + url + ', status ' + request.status + ' ' + ('' + request.responseText)));\n        };\n\n        request.onload = function () {\n          if (request.status < 200 || request.status >= 300) {\n            request.onerror();\n            return;\n          }\n\n          try {\n            var data = (0, _parseSofa.parseSofa)(request.response);\n            _this7._setMetaData(data, url);\n            var sourcePositions = _this7._sourcePositionsToGl(data);\n            _this7._generateIndicesPositionsFirs(sourcePositions.map(function (position, index) {\n              return index;\n            }), // full\n            sourcePositions, data['Data.IR'].data, data['Data.Delay'].data).then(function (indicesPositionsFirs) {\n              _this7._createKdTree(indicesPositionsFirs);\n              _this7._sofaUrl = url;\n              resolve(_this7);\n            });\n          } catch (error) {\n            // re-throw\n            reject(new Error('Unable to parse ' + url + '. ' + error.message));\n          }\n        }; // request.onload\n\n        request.send();\n      });\n\n      return promise;\n    }\n\n    /**\n     * Try to load partial data from a SOFA URL.\n     *\n     * @private\n     *\n     * @param {Array.<String>} sourceUrl\n     * @param {Array.<Number>} indices\n     * @param {Object} dataSet\n     * @returns {Promise.<this|Error>}\n     */\n\n  }, {\n    key: '_loadSofaPartial',\n    value: function _loadSofaPartial(sourceUrl, indices, dataSet) {\n      var _this8 = this;\n\n      var urlPromises = indices.map(function (index) {\n        var urlPromise = new Promise(function (resolve, reject) {\n          var positionUrl = sourceUrl + '.json?' + ('SourcePosition[' + index + '][0:1:' + (dataSet.SourcePosition.C - 1) + '],') + ('Data.IR[' + index + '][0:1:' + (dataSet['Data.IR'].R - 1) + ']') + ('[0:1:' + (dataSet['Data.IR'].N - 1) + ']');\n\n          var request = new window.XMLHttpRequest();\n          request.open('GET', positionUrl);\n          request.onerror = function () {\n            reject(new Error('Unable to GET ' + positionUrl + ', status ' + request.status + ' ' + ('' + request.responseText)));\n          };\n\n          request.onload = function () {\n            if (request.status < 200 || request.status >= 300) {\n              request.onerror();\n            }\n\n            try {\n              var data = (0, _parseSofa.parseSofa)(request.response);\n              // (meta-data is already loaded)\n\n              var sourcePositions = _this8._sourcePositionsToGl(data);\n              _this8._generateIndicesPositionsFirs([index], sourcePositions, data['Data.IR'].data, data['Data.Delay'].data).then(function (indicesPositionsFirs) {\n                // One position per URL here\n                // Array made of multiple promises, later\n                resolve(indicesPositionsFirs[0]);\n              });\n            } catch (error) {\n              // re-throw\n              reject(new Error('Unable to parse ' + positionUrl + '. ' + error.message));\n            }\n          }; // request.onload\n\n          request.send();\n        });\n\n        return urlPromise;\n      });\n\n      return Promise.all(urlPromises).then(function (indicesPositionsFirs) {\n        _this8._createKdTree(indicesPositionsFirs);\n        return _this8; // final resolve\n      });\n    }\n\n    /**\n     * Set meta-data, and assert for supported HRTF type.\n     *\n     * @private\n     *\n     * @param {Object} data\n     * @param {String} sourceUrl\n     * @throws {Error} assertion for FIR data.\n     */\n\n  }, {\n    key: '_setMetaData',\n    value: function _setMetaData(data, sourceUrl) {\n      if (typeof data.metaData.DataType !== 'undefined' && data.metaData.DataType !== 'FIR') {\n        throw new Error('According to meta-data, SOFA data type is not FIR');\n      }\n\n      var dateString = new Date().toISOString();\n\n      this._sofaName = typeof data.name !== 'undefined' ? '' + data.name : 'HRTF.sofa';\n\n      this._sofaMetaData = typeof data.metaData !== 'undefined' ? data.metaData : {};\n\n      // append conversion information\n      if (typeof sourceUrl !== 'undefined') {\n        this._sofaMetaData.OriginalUrl = sourceUrl;\n      }\n\n      this._sofaMetaData.Converter = 'Ircam ' + _info2.default.name + ' ' + _info2.default.version + ' ' + 'javascript API ';\n      this._sofaMetaData.DateConverted = dateString;\n\n      this._sofaSampleRate = typeof data['Data.SamplingRate'] !== 'undefined' ? data['Data.SamplingRate'].data[0] : 48000; // Table C.1\n      if (this._sofaSampleRate !== this._audioContext.sampleRate) {\n        this._sofaMetaData.OriginalSampleRate = this._sofaSampleRate;\n      }\n\n      this._sofaDelay = typeof data['Data.Delay'] !== 'undefined' ? data['Data.Delay'].data : [0, 0];\n\n      this._sofaRoomVolume = typeof data.RoomVolume !== 'undefined' ? data.RoomVolume.data[0] : undefined;\n\n      // Convert listener position, up, and view to SOFA cartesian,\n      // to generate a SOFA-to-GL look-at mat4.\n      // Default SOFA type is 'cartesian' (see table D.4A).\n\n      var listenerPosition = _coordinates2.default.sofaToSofaCartesian([], data.ListenerPosition.data[0], (0, _parseSofa.conformSofaCoordinateSystem)(data.ListenerPosition.Type || 'cartesian'));\n\n      var listenerView = _coordinates2.default.sofaToSofaCartesian([], data.ListenerView.data[0], (0, _parseSofa.conformSofaCoordinateSystem)(data.ListenerView.Type || 'cartesian'));\n\n      var listenerUp = _coordinates2.default.sofaToSofaCartesian([], data.ListenerUp.data[0], (0, _parseSofa.conformSofaCoordinateSystem)(data.ListenerUp.Type || 'cartesian'));\n\n      this._sofaToGl = _glMatrix2.default.mat4.lookAt([], listenerPosition, listenerView, listenerUp);\n    }\n\n    /**\n     * Convert to GL coordinates, in-place.\n     *\n     * @private\n     *\n     * @param {Object} data\n     * @returns {Array.<Coordinates>}\n     * @throws {Error}\n     */\n\n  }, {\n    key: '_sourcePositionsToGl',\n    value: function _sourcePositionsToGl(data) {\n      var _this9 = this;\n\n      var sourcePositions = data.SourcePosition.data; // reference\n      var sourceCoordinateSystem = typeof data.SourcePosition.Type !== 'undefined' ? data.SourcePosition.Type : 'spherical'; // default (SOFA Table D.4C)\n      switch (sourceCoordinateSystem) {\n        case 'cartesian':\n          sourcePositions.forEach(function (position) {\n            _glMatrix2.default.vec3.transformMat4(position, position, _this9._sofaToGl);\n          });\n          break;\n\n        case 'spherical':\n          sourcePositions.forEach(function (position) {\n            _coordinates2.default.sofaSphericalToSofaCartesian(position, position); // in-place\n            _glMatrix2.default.vec3.transformMat4(position, position, _this9._sofaToGl);\n          });\n          break;\n\n        default:\n          throw new Error('Bad source position type');\n      }\n\n      return sourcePositions;\n    }\n  }, {\n    key: 'coordinateSystem',\n    set: function set(system) {\n      this._coordinateSystem = typeof system !== 'undefined' ? system : 'gl';\n    }\n\n    /**\n     * Get coordinate system for positions.\n     *\n     * @returns {CoordinateSystem}\n     */\n    ,\n    get: function get() {\n      return this._coordinateSystem;\n    }\n\n    /**\n     * Set coordinate system for filter positions.\n     *\n     * @param {CoordinateSystem} [system] undefined to use coordinateSystem\n     */\n\n  }, {\n    key: 'filterCoordinateSystem',\n    set: function set(system) {\n      this._filterCoordinateSystem = typeof system !== 'undefined' ? system : this.coordinateSystem;\n    }\n\n    /**\n     * Get coordinate system for filter positions.\n     */\n    ,\n    get: function get() {\n      return this._filterCoordinateSystem;\n    }\n\n    /**\n     * Set filter positions.\n     *\n     * @param {Array.<Coordinates>} [positions] undefined for no filtering.\n     */\n\n  }, {\n    key: 'filterPositions',\n    set: function set(positions) {\n      if (typeof positions === 'undefined') {\n        this._filterPositions = undefined;\n      } else {\n        switch (this.filterCoordinateSystem) {\n          case 'gl':\n            this._filterPositions = positions.map(function (current) {\n              return current.slice(0); // copy\n            });\n            break;\n\n          case 'sofaCartesian':\n            this._filterPositions = positions.map(function (current) {\n              return _coordinates2.default.sofaCartesianToGl([], current);\n            });\n            break;\n\n          case 'sofaSpherical':\n            this._filterPositions = positions.map(function (current) {\n              return _coordinates2.default.sofaSphericalToGl([], current);\n            });\n            break;\n\n          default:\n            throw new Error('Bad filter coordinate system');\n        }\n      }\n    }\n\n    /**\n     * Get filter positions.\n     */\n    ,\n    get: function get() {\n      var positions = void 0;\n      if (typeof this._filterPositions !== 'undefined') {\n        switch (this.filterCoordinateSystem) {\n          case 'gl':\n            positions = this._filterPositions.map(function (current) {\n              return current.slice(0); // copy\n            });\n            break;\n\n          case 'sofaCartesian':\n            positions = this._filterPositions.map(function (current) {\n              return _coordinates2.default.glToSofaCartesian([], current);\n            });\n            break;\n\n          case 'sofaSpherical':\n            positions = this._filterPositions.map(function (current) {\n              return _coordinates2.default.glToSofaSpherical([], current);\n            });\n            break;\n\n          default:\n            throw new Error('Bad filter coordinate system');\n        }\n      }\n      return positions;\n    }\n\n    /**\n     * Set post-filtering flag. When false, try to load a partial set of\n     * HRTF.\n     *\n     * @param {Boolean} [post=false]\n     */\n\n  }, {\n    key: 'filterAfterLoad',\n    set: function set(post) {\n      this._filterAfterLoad = typeof post !== 'undefined' ? post : false;\n    }\n\n    /**\n     * Get post-filtering flag. When false, try to load a partial set of\n     * HRTF.\n     *\n     * @returns {Boolean}\n     */\n    ,\n    get: function get() {\n      return this._filterAfterLoad;\n    }\n\n    /**\n     * Test whether an HRTF set is actually loaded.\n     *\n     * @see {@link HrtfSet#load}\n     *\n     * @returns {Boolean} false before any successful load, true after.\n     *\n     */\n\n  }, {\n    key: 'isReady',\n    get: function get() {\n      return this._ready;\n    }\n\n    /**\n     * Get the original name of the HRTF set.\n     *\n     * @returns {String} that is undefined before a successfully load.\n     */\n\n  }, {\n    key: 'sofaName',\n    get: function get() {\n      return this._sofaName;\n    }\n\n    /**\n     * Get the URL used to actually load the HRTF set.\n     *\n     * @returns {String} that is undefined before a successfully load.\n     */\n\n  }, {\n    key: 'sofaUrl',\n    get: function get() {\n      return this._sofaUrl;\n    }\n\n    /**\n     * Get the original sample-rate from the SOFA URL already loaded.\n     *\n     * @returns {Number} that is undefined before a successfully load.\n     */\n\n  }, {\n    key: 'sofaSampleRate',\n    get: function get() {\n      return this._sofaSampleRate;\n    }\n\n    /**\n     * Get the meta-data from the SOFA URL already loaded.\n     *\n     * @returns {Object} that is undefined before a successfully load.\n     */\n\n  }, {\n    key: 'sofaMetaData',\n    get: function get() {\n      return this._sofaMetaData;\n    }\n  }]);\n\n  return HrtfSet;\n}();\n\nexports.default = HrtfSet;\n},{\"../audio/utilities\":68,\"../geometry/KdTree\":69,\"../geometry/coordinates\":70,\"../info\":73,\"./parseDataSet\":76,\"./parseSofa\":77,\"gl-matrix\":86}],75:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.ServerDataBase = undefined;\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /**\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * @fileOverview Access a remote catalogue from a SOFA server, and get URLs\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * with filtering.\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      *\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * @author Jean-Philippe.Lambert@ircam.fr\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * @copyright 2015-2016 IRCAM, Paris, France\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      * @license BSD-3-Clause\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      */\n\nvar _parseXml = require('./parseXml');\n\nvar _parseXml2 = _interopRequireDefault(_parseXml);\n\nvar _parseDataSet = require('./parseDataSet');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * SOFA remote data-base.\n */\n\nvar ServerDataBase = exports.ServerDataBase = function () {\n  /**\n   * This is only a constructor, it does not load any thing.\n   *\n   * @see {@link ServerDataBase#loadCatalogue}\n   *\n   * @param {Object} [options]\n   * @param {String} [options.serverUrl] base URL of server, including\n   * protocol, eg. 'http://bili2.ircam.fr'. Default protocol is `https:` if\n   * `window.location.protocol` is also `https:`, or `http:`, to avoid\n   * mixed contents (that are often blocked).\n   */\n\n  function ServerDataBase() {\n    var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n    _classCallCheck(this, ServerDataBase);\n\n    this._server = options.serverUrl;\n\n    if (typeof this._server === 'undefined') {\n      var protocol = window.location.protocol === 'https:' ? 'https:' : 'http:';\n\n      this._server = protocol + '//bili2.ircam.fr';\n    }\n\n    this._catalogue = {};\n    this._urls = [];\n  }\n\n  /**\n   * Asynchronously load complete catalogue from the server, including the\n   * catalogue links found in any partial catalogue.\n   *\n   * @param {String} [sourceUrl] URL of the root catalogue, including the\n   * server, like 'http://bili2.ircam.fr/catalog.xml'.\n   *  Default is 'catalog.xml' at serverURL supplied at\n   * {@link ServerDataBase#constructor}.\n   * @param {Object} [destination] Catalogue to update. Default is\n   * internal.\n   * @returns {Promise.<String|Error>} The promise will resolve (with\n   * sourceUrl) when every sub-catalogue will successfully load, or will\n   * reject (with an error) as soon as one transfer fails.\n   */\n\n\n  _createClass(ServerDataBase, [{\n    key: 'loadCatalogue',\n    value: function loadCatalogue() {\n      var _this = this;\n\n      var sourceUrl = arguments.length <= 0 || arguments[0] === undefined ? this._server + '/catalog.xml' : arguments[0];\n      var destination = arguments.length <= 1 || arguments[1] === undefined ? this._catalogue : arguments[1];\n\n      var promise = new Promise(function (resolve, reject) {\n        var request = new window.XMLHttpRequest();\n        request.open('GET', sourceUrl);\n        request.onerror = function () {\n          reject(new Error('Unable to GET ' + sourceUrl + ', status ' + request.status + ' ' + ('' + request.responseText)));\n        };\n\n        request.onload = function () {\n          if (request.status < 200 || request.status >= 300) {\n            request.onerror();\n            return;\n          }\n\n          var xml = (0, _parseXml2.default)(request.response);\n          var dataSet = xml.querySelector('dataset');\n\n          // recursive catalogues\n          var catalogueReferences = xml.querySelectorAll('dataset > catalogRef');\n\n          if (catalogueReferences.length === 0) {\n            // end of recursion\n            destination.urls = [];\n            var urls = xml.querySelectorAll('dataset > dataset');\n            for (var ref = 0; ref < urls.length; ++ref) {\n              // data set name already contains a leading slash\n              var url = _this._server + dataSet.getAttribute('name') + '/' + urls[ref].getAttribute('name');\n              _this._urls.push(url);\n              destination.urls.push(url);\n            }\n\n            resolve(sourceUrl);\n          } else {\n            // recursion\n            var promises = [];\n            for (var _ref = 0; _ref < catalogueReferences.length; ++_ref) {\n              var name = catalogueReferences[_ref].getAttribute('name');\n              var recursiveUrl = _this._server + dataSet.getAttribute('name') + '/' + catalogueReferences[_ref].getAttribute('xlink:href');\n              destination[name] = {};\n              promises.push(_this.loadCatalogue(recursiveUrl, destination[name]));\n            }\n\n            Promise.all(promises).then(function () {\n              _this._urls.sort();\n              resolve(sourceUrl);\n            }).catch(function (error) {\n              reject(error);\n            });\n          }\n        }; // request.onload\n\n        request.send();\n      });\n\n      return promise;\n    }\n\n    /**\n     * Get URLs, possibly filtered.\n     *\n     * Any filter can be partial, and is case-insensitive. The result must\n     * match every supplied filter. Undefined filters are not applied. For\n     * any filter, `|` is the or operator.\n     *\n     * @param {Object} [options] optional filters\n     * @param {String} [options.convention] 'HRIR' or 'SOS'\n     * @param {String} [options.dataBase] 'LISTEN', 'BILI', etc.\n     * @param {String} [options.equalisation] 'RAW','COMPENSATED'\n     * @param {String} [options.sampleRate] in Hertz\n     * @param {String} [options.sosOrder] '12order' or '24order'\n     * @param {String} [options.freePattern] any pattern matched\n     * globally. Use separators (spaces, tabs, etc.) to combine multiple\n     * patterns: '44100 listen' will restrict on URLs matching '44100' and\n     * 'listen'; '44100|48000 bili|listen' matches ('44100' or '48000') and\n     * ('bili' or 'listen').\n     * @returns {Array.<String>} URLs that match every filter.\n     */\n\n  }, {\n    key: 'getUrls',\n    value: function getUrls() {\n      var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];\n\n      // the number and the order of the filters in the following array must\n      // match the URL sub-directories\n      var filters = [options.convention, options.dataBase, options.equalisation, options.sampleRate, options.sosOrder];\n\n      // any where in URL\n      // in file name\n      var freePattern = typeof options.freePattern === 'number' ? options.freePattern.toString() : options.freePattern;\n\n      var pattern = filters.reduce(function (global, local) {\n        // partial filter inside slashes\n        return global + '/' + (typeof local !== 'undefined' ? '[^/]*(?:' + local + ')[^/]*' : '[^/]*');\n      }, '');\n\n      var regExp = new RegExp(pattern, 'i');\n\n      var urls = this._urls.filter(function (url) {\n        return regExp.test(url);\n      });\n\n      if (typeof freePattern !== 'undefined') {\n        // split patterns with separators\n        var patterns = freePattern.split(/\\s+/);\n        patterns.forEach(function (current) {\n          regExp = new RegExp(current, 'i');\n\n          urls = urls.filter(function (url) {\n            return regExp.test(url);\n          });\n        });\n      }\n\n      return urls;\n    }\n\n    /**\n     * Get the data-set definitions of a given URL.\n     *\n     * @param {String} sourceUrl is the complete SOFA URL, with the\n     * server, like\n     * 'http://bili2.ircam.fr/SimpleFreeFieldHRIR/BILI/COMPENSATED/44100/IRC_1100_C_HRIR.sofa'\n     *\n     * @returns {Promise.<Object|String>} The promise will resolve after\n     * successfully loading, with definitions as * `{definition: {key: values}}`\n     * objects; the promise will reject is the transfer fails, with an error.\n     */\n\n  }, {\n    key: 'getDataSetDefinitions',\n    value: function getDataSetDefinitions(sourceUrl) {\n      var promise = new Promise(function (resolve, reject) {\n        var url = sourceUrl + '.dds';\n        var request = new window.XMLHttpRequest();\n        request.open('GET', url);\n        request.onerror = function () {\n          reject(new Error('Unable to GET ' + url + ', status ' + request.status + ' ' + ('' + request.responseText)));\n        };\n\n        request.onload = function () {\n          if (request.status < 200 || request.status >= 300) {\n            request.onerror();\n            return;\n          }\n          resolve((0, _parseDataSet.parseDataSet)(request.response));\n        }; // request.onload\n\n        request.send();\n      });\n\n      return promise;\n    }\n\n    /**\n     * Get all source positions of a given URL.\n     *\n     * @param {String} sourceUrl is the complete SOFA URL, with the\n     * server, like\n     * 'http://bili2.ircam.fr/SimpleFreeFieldHRIR/BILI/COMPENSATED/44100/IRC_1100_C_HRIR.sofa'\n     *\n     * @returns {Promise.<Array<Array.<Number>>|Error>} The promise will resolve\n     * after successfully loading, with an array of positions (which are\n     * arrays of 3 numbers); the promise will reject is the transfer fails,\n     * with an error.\n     */\n\n  }, {\n    key: 'getSourcePositions',\n    value: function getSourcePositions(sourceUrl) {\n      var promise = new Promise(function (resolve, reject) {\n        var url = sourceUrl + '.json?SourcePosition';\n\n        var request = new window.XMLHttpRequest();\n        request.open('GET', url);\n        request.onerror = function () {\n          reject(new Error('Unable to GET ' + url + ', status ' + request.status + ' ' + ('' + request.responseText)));\n        };\n\n        request.onload = function () {\n          if (request.status < 200 || request.status >= 300) {\n            request.onerror();\n            return;\n          }\n\n          try {\n            var response = JSON.parse(request.response);\n            if (response.leaves[0].name !== 'SourcePosition') {\n              throw new Error('SourcePosition not found');\n            }\n\n            resolve(response.leaves[0].data);\n          } catch (error) {\n            // re-throw\n            reject(new Error('Unable to parse response from ' + url + '. ' + error.message));\n          }\n        }; // request.onload\n\n        request.send();\n      });\n\n      return promise;\n    }\n  }]);\n\n  return ServerDataBase;\n}();\n\nexports.default = ServerDataBase;\n},{\"./parseDataSet\":76,\"./parseXml\":78}],76:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports._parseDimension = _parseDimension;\nexports._parseDefinition = _parseDefinition;\nexports.parseDataSet = parseDataSet;\n/**\n * @fileOverview Parser for DDS files\n * @author Jean-Philippe.Lambert@ircam.fr\n * @copyright 2015-2016 IRCAM, Paris, France\n * @license BSD-3-Clause\n */\n\n// '[R = 2]'\nvar _dimensionPattern = '\\\\[\\\\s*(\\\\w+)\\\\s*=\\\\s*(\\\\d+)\\\\s*\\\\]';\nvar _dimensionMatch = new RegExp(_dimensionPattern, 'g');\nvar _dimensionSplit = new RegExp(_dimensionPattern);\n\n// 'Float64 ReceiverPosition[R = 2][C = 3][I = 1];'\n//\n// do not re-use dimension pattern (for grouping)\nvar _definitionPattern = '\\\\s*(\\\\w+)\\\\s*([\\\\w.]+)\\\\s*' + '((?:\\\\[[^\\\\]]+\\\\]\\\\s*)+)' + ';\\\\s*';\nvar _definitionMatch = new RegExp(_definitionPattern, 'g');\nvar _definitionSplit = new RegExp(_definitionPattern);\n\n// `Dataset {\n//   Float64 ListenerPosition[I = 1][C = 3];\n//   Float64 ListenerUp[I = 1][C = 3];\n//   Float64 ListenerView[I = 1][C = 3];\n//   Float64 ReceiverPosition[R = 2][C = 3][I = 1];\n//   Float64 SourcePosition[M = 1680][C = 3];\n//   Float64 EmitterPosition[E = 1][C = 3][I = 1];\n//   Float64 Data.SamplingRate[I = 1];\n//   Float64 Data.Delay[I = 1][R = 2];\n//   Float64 Data.IR[M = 1680][R = 2][N = 941];\n//   Float64 RoomVolume[I = 1];\n// } IRC_1100_C_HRIR.sofa;`\n//\n// do not re-use definition pattern (for grouping)\nvar _dataSetPattern = '\\\\s*Dataset\\\\s*\\\\{\\\\s*' + '((?:[^;]+;\\\\s*)*)' + '\\\\s*\\\\}\\\\s*[\\\\w.]+\\\\s*;\\\\s*';\nvar _dataSetSplit = new RegExp(_dataSetPattern);\n\n/**\n * Parses dimension strings into an array of [key, value] pairs.\n *\n * @private\n * @param {String} input is single or multiple dimension\n * @returns {Array.<Array.<String>>} object [key, value] pairs\n *\n * @example\n * _parseDimension('[R = 2]');\n * // [ [ 'R', 2 ] ]\n *\n * _parseDimension('[R = 2][C = 3][I = 1]');\n * // [ [ 'R', 2 ], [ 'C', 3 ], [ 'I', 1 ] ]\n */\nfunction _parseDimension(input) {\n  var parse = [];\n  var inputs = input.match(_dimensionMatch);\n  if (inputs !== null) {\n    inputs.forEach(function (inputSingle) {\n      var parts = _dimensionSplit.exec(inputSingle);\n      if (parts !== null && parts.length > 2) {\n        parse.push([parts[1], Number(parts[2])]);\n      }\n    });\n  }\n  return parse;\n}\n\n/**\n * Parse definition strings into an array of [key, {values}] pairs.\n *\n * @param {String} input is single or multiple definition\n * @returns {Array.<Array<String,Object>>} [key, {values}] pairs\n *\n * @private\n * @example\n * _parseDefinition('Float64 ReceiverPosition[R = 2][C = 3][I = 1];');\n * // [ [ 'ReceiverPosition',\n * //     { type: 'Float64', R: 2, C: 3, I: 1 } ] ]\n *\n * _parseDefinition(\n * `    Float64 ReceiverPosition[R = 2][C = 3][I = 1];\n *      Float64 SourcePosition[M = 1680][C = 3];\n *      Float64 EmitterPosition[E = 1][C = 3][I = 1];`);\n * // [ [ 'ReceiverPosition',\n * //      { type: 'Float64', R: 2, C: 3, I: 1 } ],\n * //   [ 'SourcePosition', { type: 'Float64', M: 1680, C: 3 } ],\n * //   [ 'EmitterPosition',\n * //     { type: 'Float64', E: 1, C: 3, I: 1 } ] ]\n */\nfunction _parseDefinition(input) {\n  var parse = [];\n  var inputs = input.match(_definitionMatch);\n  if (inputs !== null) {\n    inputs.forEach(function (inputSingle) {\n      var parts = _definitionSplit.exec(inputSingle);\n      if (parts !== null && parts.length > 3) {\n        (function () {\n          var current = [];\n          current[0] = parts[2];\n          current[1] = {};\n          current[1].type = parts[1];\n          _parseDimension(parts[3]).forEach(function (dimension) {\n            current[1][dimension[0]] = dimension[1];\n          });\n          parse.push(current);\n        })();\n      }\n    });\n  }\n  return parse;\n}\n\n/**\n * Parse data set meta data into an object of `{definition: {key: values}}` objects.\n *\n * @param {String} input data set DDS-like.\n * @returns {Object} definitions as `{definition: {key: values}}` objects.\n *\n * @example\n * _parseDataSet(\n * `Dataset {\n *      Float64 ReceiverPosition[R = 2][C = 3][I = 1];\n *      Float64 SourcePosition[M = 1680][C = 3];\n *      Float64 EmitterPosition[E = 1][C = 3][I = 1];\n *      Float64 Data.SamplingRate[I = 1];\n * } IRC_1100_C_HRIR.sofa;`);\n * //  { ReceiverPosition: { type: 'Float64', R: 2, C: 3, I: 1 },\n * //    SourcePosition: { type: 'Float64', M: 1680, C: 3 },\n * //    EmitterPosition: { type: 'Float64', E: 1, C: 3, I: 1 }\n * //    'Data.SamplingRate': { type: 'Float64', I: 1 } }\n */\nfunction parseDataSet(input) {\n  var parse = {};\n  var definitions = _dataSetSplit.exec(input);\n  if (definitions !== null && definitions.length > 1) {\n    _parseDefinition(definitions[1]).forEach(function (definition) {\n      parse[definition[0]] = definition[1];\n    });\n  }\n  return parse;\n}\n\nexports.default = parseDataSet;\n},{}],77:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nexports.parseSofa = parseSofa;\nexports.stringifySofa = stringifySofa;\nexports.conformSofaCoordinateSystem = conformSofaCoordinateSystem;\n/**\n * @fileOverview Parser functions for SOFA files\n * @author Jean-Philippe.Lambert@ircam.fr\n * @copyright 2015 IRCAM, Paris, France\n * @license BSD-3-Clause\n */\n\n/**\n * Parses a SOFA JSON string with into an object with `name`, `data` and\n * `metaData` attributes.\n *\n * @see {@link stringifySofa}\n *\n * @param {String} sofaString in SOFA JSON format\n * @returns {Object} with `data` and `metaData` attributes\n * @throws {Error} when the parsing fails\n */\nfunction parseSofa(sofaString) {\n  try {\n    var _ret = function () {\n      var sofa = JSON.parse(sofaString);\n      var sofaSet = {};\n\n      sofaSet.name = sofa.name;\n\n      if (typeof sofa.attributes !== 'undefined') {\n        sofaSet.metaData = {};\n        var metaData = sofa.attributes.find(function (e) {\n          return e.name === 'NC_GLOBAL';\n        });\n        if (typeof metaData !== 'undefined') {\n          metaData.attributes.forEach(function (e) {\n            sofaSet.metaData[e.name] = e.value[0];\n          });\n        }\n      }\n\n      if (typeof sofa.leaves !== 'undefined') {\n        var data = sofa.leaves;\n        data.forEach(function (d) {\n          sofaSet[d.name] = {};\n          d.attributes.forEach(function (a) {\n            sofaSet[d.name][a.name] = a.value[0];\n          });\n          sofaSet[d.name].shape = d.shape;\n          sofaSet[d.name].data = d.data;\n        });\n      }\n\n      return {\n        v: sofaSet\n      };\n    }();\n\n    if ((typeof _ret === 'undefined' ? 'undefined' : _typeof(_ret)) === \"object\") return _ret.v;\n  } catch (error) {\n    throw new Error('Unable to parse SOFA string. ' + error.message);\n  }\n}\n\n/**\n * Generates a SOFA JSON string from an object.\n *\n * Note that the properties differ from either an {@link HrtfSet} and from\n * the result of the parsing of a SOFA JSON. In particular, the listener\n * attributes correspond to the reference for the filters; the source\n * positions are the positions in the data-base.\n *\n * @see {@link parseSofa}\n * @see {@link HrtfSet}\n *\n * @param {Object} sofaSet\n * @param {Coordinates} sofaSet.ListenerPosition\n * @param {CoordinateSystem} sofaSet.ListenerPositionType\n * @param {Coordinates} sofaSet.ListenerUp\n * @param {CoordinateSystem} sofaSet.ListenerUpType\n * @param {Coordinates} sofaSet.ListenerView\n * @param {CoordinateSystem} sofaSet.ListenerViewType\n * @param {Array.<Array.<Number>>} sofaSet.SourcePosition\n * @param {CoordinateSystem} sofaSet.SourcePositionType\n * @param {Number} sofaSet.DataSamplingRate\n * @param {Array.<Array.<Array.<Number>>>} sofaSet.DataIR\n * @param {Array.<Number>} sofaSet.RoomVolume\n * @returns {String} in SOFA JSON format\n * @throws {Error} when the export fails, because of missing data or\n * unknown coordinate system\n */\nfunction stringifySofa(sofaSet) {\n  var sofa = {};\n\n  if (typeof sofaSet.name !== 'undefined') {\n    sofa.name = sofaSet.name;\n  }\n\n  if (typeof sofaSet.metaData !== 'undefined') {\n    sofa.attributes = [];\n    var ncGlobal = {\n      name: 'NC_GLOBAL',\n      attributes: []\n    };\n\n    for (var attribute in sofaSet.metaData) {\n      if (sofaSet.metaData.hasOwnProperty(attribute)) {\n        ncGlobal.attributes.push({\n          name: attribute,\n          value: [sofaSet.metaData[attribute]]\n        });\n      }\n    }\n\n    sofa.attributes.push(ncGlobal);\n  }\n\n  // always the same;\n  var type = 'Float64';\n\n  var attributes = void 0;\n\n  sofa.leaves = [];\n\n  [['ListenerPosition', 'ListenerPositionType'], ['ListenerUp', 'ListenerUpType'], ['ListenerView', 'ListenerViewType']].forEach(function (listenerAttributeAndType) {\n    var listenerAttributeName = listenerAttributeAndType[0];\n    var listenerAttribute = sofaSet[listenerAttributeName];\n    var listenerType = sofaSet[listenerAttributeAndType[1]];\n    if (typeof listenerAttribute !== 'undefined') {\n      switch (listenerType) {\n        case 'cartesian':\n          attributes = [{ name: 'Type', value: ['cartesian'] }, { name: 'Units', value: ['metre, metre, metre'] }];\n          break;\n\n        case 'spherical':\n          attributes = [{ name: 'Type', value: ['spherical'] }, { name: 'Units', value: ['degree, degree, metre'] }];\n          break;\n\n        default:\n          throw new Error('Unknown coordinate system type ' + (listenerType + ' for ' + listenerAttribute));\n      }\n      // in SOFA, everything is contained by an array, even an array.\n      sofa.leaves.push({\n        name: listenerAttributeName,\n        type: type,\n        attributes: attributes,\n        shape: [1, 3],\n        data: [listenerAttribute]\n      });\n    }\n  });\n\n  if (typeof sofaSet.SourcePosition !== 'undefined') {\n    switch (sofaSet.SourcePositionType) {\n      case 'cartesian':\n        attributes = [{ name: 'Type', value: ['cartesian'] }, { name: 'Units', value: ['metre, metre, metre'] }];\n        break;\n\n      case 'spherical':\n        attributes = [{ name: 'Type', value: ['spherical'] }, { name: 'Units', value: ['degree, degree, metre'] }];\n        break;\n\n      default:\n        throw new Error('Unknown coordinate system type ' + ('' + sofaSet.SourcePositionType));\n    }\n    sofa.leaves.push({\n      name: 'SourcePosition',\n      type: type,\n      attributes: attributes,\n      shape: [sofaSet.SourcePosition.length, sofaSet.SourcePosition[0].length],\n      data: sofaSet.SourcePosition\n    });\n  }\n\n  if (typeof sofaSet.DataSamplingRate !== 'undefined') {\n    sofa.leaves.push({\n      name: 'Data.SamplingRate',\n      type: type,\n      attributes: [{ name: 'Unit', value: 'hertz' }],\n      shape: [1],\n      data: [sofaSet.DataSamplingRate]\n    });\n  } else {\n    throw new Error('No data sampling-rate');\n  }\n\n  if (typeof sofaSet.DataDelay !== 'undefined') {\n    sofa.leaves.push({\n      name: 'Data.Delay',\n      type: type,\n      attributes: [],\n      shape: [1, sofaSet.DataDelay.length],\n      data: sofaSet.DataDelay\n    });\n  }\n\n  if (typeof sofaSet.DataIR !== 'undefined') {\n    sofa.leaves.push({\n      name: 'Data.IR',\n      type: type,\n      attributes: [],\n      shape: [sofaSet.DataIR.length, sofaSet.DataIR[0].length, sofaSet.DataIR[0][0].length],\n      data: sofaSet.DataIR\n    });\n  } else {\n    throw new Error('No data IR');\n  }\n\n  if (typeof sofaSet.RoomVolume !== 'undefined') {\n    sofa.leaves.push({\n      name: 'RoomVolume',\n      type: type,\n      attributes: [{ name: 'Units', value: ['cubic metre'] }],\n      shape: [1],\n      data: [sofaSet.RoomVolume]\n    });\n  }\n\n  sofa.nodes = [];\n\n  return JSON.stringify(sofa);\n}\n\n/**\n * Prefix SOFA coordinate system with `sofa`.\n *\n * @param {String} system : either `cartesian` or `spherical`\n * @returns {String} either `sofaCartesian` or `sofaSpherical`\n * @throws {Error} if system is unknown\n */\nfunction conformSofaCoordinateSystem(system) {\n  var type = void 0;\n\n  switch (system) {\n    case 'cartesian':\n      type = 'sofaCartesian';\n      break;\n\n    case 'spherical':\n      type = 'sofaSpherical';\n      break;\n\n    default:\n      throw new Error('Bad SOFA type ' + system);\n  }\n  return type;\n}\n\nexports.default = {\n  parseSofa: parseSofa,\n  conformSofaCoordinateSystem: conformSofaCoordinateSystem\n};\n},{}],78:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n/**\n * @fileOverview Simple XML parser, as a DOM parser.\n * @author Jean-Philippe.Lambert@ircam.fr\n * @copyright 2015-2016 IRCAM, Paris, France\n * @license BSD-3-Clause\n */\n\n/**\n * Parse an XML string into an XMLDocument object, using native browser DOM\n * parser.\n *\n * It requires a browser environment.\n *\n * @function parseXml\n * @param {String} xmlStr full valid XML data.\n * @returns {Object} XMLDocument, DOM-like. (Use any selector.)\n *\n * @example\n * const request = new window.XMLHttpRequest();\n * request.open('GET', 'http://bili2.ircam.fr/catalog.xml');\n * request.onerror =  () => {\n *    throw new Error(`Unable to GET: ${request.status}`);\n * };\n * request.onload = () => {\n *   const xml = parseXml(request.response);\n *   const catalogueReferences = xml.querySelector('dataset > catalogRef');\n *   console.log(catalogueReferences);\n * }\n * request.send();\n */\nvar parseXml = exports.parseXml = void 0;\n\nif (typeof window.DOMParser !== 'undefined') {\n  exports.parseXml = parseXml = function parseXmlDOM(xmlStr) {\n    return new window.DOMParser().parseFromString(xmlStr, 'text/xml');\n  };\n} else if (typeof window.ActiveXObject !== 'undefined' && new window.ActiveXObject('Microsoft.XMLDOM')) {\n  exports.parseXml = parseXml = function parseXmlActiveX(xmlStr) {\n    var xmlDoc = new window.ActiveXObject('Microsoft.XMLDOM');\n    xmlDoc.async = 'false';\n    xmlDoc.loadXML(xmlStr);\n    return xmlDoc;\n  };\n} else {\n  throw new Error('No XML parser found');\n}\n\nexports.default = parseXml;\n},{}],79:[function(require,module,exports){\n/**\n * @fileoverview Fractional delay library\n * @author Arnau Julià <Arnau.Julia@gmail.com>\n * @version 0.1.0\n */\n/**\n * @class FractionalDelay\n * @public\n */\n\"use strict\";\n\nvar _createClass = require(\"babel-runtime/helpers/create-class\")[\"default\"];\n\nvar _classCallCheck = require(\"babel-runtime/helpers/class-call-check\")[\"default\"];\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar FractionalDelay = (function () {\n    /**\n     * Mandatory initialization method.\n     * @public\n     * @param units:Hz sampleRate Sample Rate the apparatus operates on.\n     * @param type:Float units:s min:0.0 default:1 optMaxDelayTime The maximum delay time.\n     * @chainable\n     */\n\n    function FractionalDelay(sampleRate, optMaxDelayTime) {\n        _classCallCheck(this, FractionalDelay);\n\n        // Properties with default values\n        this.delayTime = 0;\n        this.posRead = 0;\n        this.posWrite = 0;\n        this.fracXi1 = 0;\n        this.fracYi1 = 0;\n        this.intDelay = 0;\n        this.fracDelay = 0;\n\n        // Other properties\n        this.a1 = undefined;\n\n        // Save sample rate\n        this.sampleRate = sampleRate;\n        this.maxDelayTime = optMaxDelayTime || 1;\n\n        this.bufferSize = this.maxDelayTime * this.sampleRate;\n        // Check if the bufferSize is not an integer\n        if (this.bufferSize % 1 !== 0) {\n            this.bufferSize = parseInt(this.bufferSize) + 1;\n        }\n        // Create the internal buffer\n        this.buffer = new Float32Array(this.bufferSize);\n    }\n\n    /**\n     * Set delay value\n     * @param delayTime Delay time\n     * @public\n     */\n\n    _createClass(FractionalDelay, [{\n        key: \"setDelay\",\n        value: function setDelay(delayTime) {\n            if (delayTime < this.maxDelayTime) {\n                // Save delay value\n                this.delayTime = delayTime;\n                // Transform time in samples\n                var samplesDelay = delayTime * this.sampleRate;\n                // Get the integer part of samplesDelay\n                this.intDelay = parseInt(samplesDelay);\n                // Get the fractional part of samplesDelay\n                this.fracDelay = samplesDelay - this.intDelay;\n                // Update the value of the pointer\n                this.resample();\n                // If the delay has fractional part, update the Thiran Coefficients\n                if (this.fracDelay !== 0) {\n                    this.updateThiranCoefficient();\n                }\n            } else {\n                throw new Error(\"delayTime > maxDelayTime\");\n            }\n        }\n\n        /**\n         * Update delay value\n         * @public\n         */\n    }, {\n        key: \"getDelay\",\n        value: function getDelay() {\n            return this.delayTime;\n        }\n\n        /**\n         * Process method, where the output is calculated.\n         * @param inputBuffer Input Array\n         * @public\n         */\n    }, {\n        key: \"process\",\n        value: function process(inputBuffer) {\n            // Creates the outputBuffer, with the same length of the input\n            var outputBuffer = new Float32Array(inputBuffer.length);\n\n            // Integer delay process section\n            for (var i = 0; i < inputBuffer.length; i = i + 1) {\n                // Save the input value in the buffer\n                this.buffer[this.posWrite] = inputBuffer[i];\n                // Write the outputBuffer with the [inputValue - delay] sample\n                outputBuffer[i] = this.buffer[this.posRead];\n                // Update the value of posRead and posWrite pointers\n                this.updatePointers();\n            }\n            // No fractional delay\n            if (this.fracDelay === 0) {\n                return outputBuffer;\n            } else {\n                // The fractional delay process section\n                outputBuffer = new Float32Array(this.fractionalThiranProcess(outputBuffer));\n                return outputBuffer;\n            }\n        }\n\n        /**\n         * Update the value of posRead and posWrite pointers inside the circular buffer\n         * @private\n         */\n    }, {\n        key: \"updatePointers\",\n        value: function updatePointers() {\n            // It's a circular buffer, so, when it is at the last position, the pointer return to the first position\n\n            // Update posWrite pointer\n            if (this.posWrite === this.buffer.length - 1) {\n                this.posWrite = 0;\n            } else {\n                this.posWrite = this.posWrite + 1;\n            }\n\n            // Update posRead pointer\n            if (this.posRead === this.buffer.length - 1) {\n                this.posRead = 0;\n            } else {\n                this.posRead = this.posRead + 1;\n            }\n        }\n\n        /**\n         * Update Thiran coefficient (1st order Thiran)\n         * @private\n         */\n    }, {\n        key: \"updateThiranCoefficient\",\n        value: function updateThiranCoefficient() {\n            // Update the coefficient: (1-D)/(1+D) where D is fractional delay\n            this.a1 = (1 - this.fracDelay) / (1 + this.fracDelay);\n        }\n\n        /**\n         * Update the pointer posRead value when the delay value is changed\n         * @private\n         */\n    }, {\n        key: \"resample\",\n        value: function resample() {\n            if (this.posWrite - this.intDelay < 0) {\n                var pos = this.intDelay - this.posWrite;\n                this.posRead = this.buffer.length - pos;\n            } else {\n                this.posRead = this.posWrite - this.intDelay;\n            }\n        }\n\n        /**\n         * Fractional process method.\n         * @private\n         * @param inputBuffer Input Array\n         */\n    }, {\n        key: \"fractionalThiranProcess\",\n        value: function fractionalThiranProcess(inputBuffer) {\n            var outputBuffer = new Float32Array(inputBuffer.length);\n\n            var x, y;\n            var xi1 = this.fracXi1;\n            var yi1 = this.fracYi1;\n\n            for (var i = 0; i < inputBuffer.length; i = i + 1) {\n                // Current input sample\n                x = inputBuffer[i];\n\n                // Calculate the output\n                y = this.a1 * x + xi1 - this.a1 * yi1;\n\n                // Update the memories\n                xi1 = x;\n                yi1 = y;\n                // Save the outputBuffer\n                outputBuffer[i] = y;\n            }\n            // Save memories\n            this.fracXi1 = xi1;\n            this.fracYi1 = yi1;\n\n            return outputBuffer;\n        }\n    }]);\n\n    return FractionalDelay;\n})();\n\nexports[\"default\"] = FractionalDelay;\nmodule.exports = exports[\"default\"];\n\n},{\"babel-runtime/helpers/class-call-check\":82,\"babel-runtime/helpers/create-class\":83}],80:[function(require,module,exports){\nmodule.exports = require('./dist/fractional-delay');\n\n},{\"./dist/fractional-delay\":79}],81:[function(require,module,exports){\narguments[4][18][0].apply(exports,arguments)\n},{\"core-js/library/fn/object/define-property\":84,\"dup\":18}],82:[function(require,module,exports){\n\"use strict\";\n\nexports[\"default\"] = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\nexports.__esModule = true;\n},{}],83:[function(require,module,exports){\n\"use strict\";\n\nvar _Object$defineProperty = require(\"babel-runtime/core-js/object/define-property\")[\"default\"];\n\nexports[\"default\"] = (function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n\n      _Object$defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n})();\n\nexports.__esModule = true;\n},{\"babel-runtime/core-js/object/define-property\":81}],84:[function(require,module,exports){\nvar $ = require('../../modules/$');\nmodule.exports = function defineProperty(it, key, desc){\n  return $.setDesc(it, key, desc);\n};\n},{\"../../modules/$\":85}],85:[function(require,module,exports){\nvar $Object = Object;\nmodule.exports = {\n  create:     $Object.create,\n  getProto:   $Object.getPrototypeOf,\n  isEnum:     {}.propertyIsEnumerable,\n  getDesc:    $Object.getOwnPropertyDescriptor,\n  setDesc:    $Object.defineProperty,\n  setDescs:   $Object.defineProperties,\n  getKeys:    $Object.keys,\n  getNames:   $Object.getOwnPropertyNames,\n  getSymbols: $Object.getOwnPropertySymbols,\n  each:       [].forEach\n};\n},{}],86:[function(require,module,exports){\n/**\n * @fileoverview gl-matrix - High performance matrix and vector operations\n * @author Brandon Jones\n * @author Colin MacKenzie IV\n * @version 2.3.2\n */\n\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n// END HEADER\n\nexports.glMatrix = require(\"./gl-matrix/common.js\");\nexports.mat2 = require(\"./gl-matrix/mat2.js\");\nexports.mat2d = require(\"./gl-matrix/mat2d.js\");\nexports.mat3 = require(\"./gl-matrix/mat3.js\");\nexports.mat4 = require(\"./gl-matrix/mat4.js\");\nexports.quat = require(\"./gl-matrix/quat.js\");\nexports.vec2 = require(\"./gl-matrix/vec2.js\");\nexports.vec3 = require(\"./gl-matrix/vec3.js\");\nexports.vec4 = require(\"./gl-matrix/vec4.js\");\n},{\"./gl-matrix/common.js\":87,\"./gl-matrix/mat2.js\":88,\"./gl-matrix/mat2d.js\":89,\"./gl-matrix/mat3.js\":90,\"./gl-matrix/mat4.js\":91,\"./gl-matrix/quat.js\":92,\"./gl-matrix/vec2.js\":93,\"./gl-matrix/vec3.js\":94,\"./gl-matrix/vec4.js\":95}],87:[function(require,module,exports){\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\n/**\n * @class Common utilities\n * @name glMatrix\n */\nvar glMatrix = {};\n\n// Configuration Constants\nglMatrix.EPSILON = 0.000001;\nglMatrix.ARRAY_TYPE = (typeof Float32Array !== 'undefined') ? Float32Array : Array;\nglMatrix.RANDOM = Math.random;\nglMatrix.ENABLE_SIMD = false;\n\n// Capability detection\nglMatrix.SIMD_AVAILABLE = (glMatrix.ARRAY_TYPE === Float32Array) && ('SIMD' in this);\nglMatrix.USE_SIMD = glMatrix.ENABLE_SIMD && glMatrix.SIMD_AVAILABLE;\n\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Type} type Array type, such as Float32Array or Array\n */\nglMatrix.setMatrixArrayType = function(type) {\n    glMatrix.ARRAY_TYPE = type;\n}\n\nvar degree = Math.PI / 180;\n\n/**\n* Convert Degree To Radian\n*\n* @param {Number} Angle in Degrees\n*/\nglMatrix.toRadian = function(a){\n     return a * degree;\n}\n\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less \n * than or equal to 1.0, and a relative tolerance is used for larger values)\n * \n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\nglMatrix.equals = function(a, b) {\n\treturn Math.abs(a - b) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a), Math.abs(b));\n}\n\nmodule.exports = glMatrix;\n\n},{}],88:[function(require,module,exports){\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\n\n/**\n * @class 2x2 Matrix\n * @name mat2\n */\nvar mat2 = {};\n\n/**\n * Creates a new identity mat2\n *\n * @returns {mat2} a new 2x2 matrix\n */\nmat2.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(4);\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    return out;\n};\n\n/**\n * Creates a new mat2 initialized with values from an existing matrix\n *\n * @param {mat2} a matrix to clone\n * @returns {mat2} a new 2x2 matrix\n */\nmat2.clone = function(a) {\n    var out = new glMatrix.ARRAY_TYPE(4);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n};\n\n/**\n * Copy the values from one mat2 to another\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.copy = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n};\n\n/**\n * Set a mat2 to the identity matrix\n *\n * @param {mat2} out the receiving matrix\n * @returns {mat2} out\n */\nmat2.identity = function(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    return out;\n};\n\n/**\n * Create a new mat2 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m10 Component in column 1, row 0 position (index 2)\n * @param {Number} m11 Component in column 1, row 1 position (index 3)\n * @returns {mat2} out A new 2x2 matrix\n */\nmat2.fromValues = function(m00, m01, m10, m11) {\n    var out = new glMatrix.ARRAY_TYPE(4);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m10;\n    out[3] = m11;\n    return out;\n};\n\n/**\n * Set the components of a mat2 to the given values\n *\n * @param {mat2} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m10 Component in column 1, row 0 position (index 2)\n * @param {Number} m11 Component in column 1, row 1 position (index 3)\n * @returns {mat2} out\n */\nmat2.set = function(out, m00, m01, m10, m11) {\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m10;\n    out[3] = m11;\n    return out;\n};\n\n\n/**\n * Transpose the values of a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.transpose = function(out, a) {\n    // If we are transposing ourselves we can skip a few steps but have to cache some values\n    if (out === a) {\n        var a1 = a[1];\n        out[1] = a[2];\n        out[2] = a1;\n    } else {\n        out[0] = a[0];\n        out[1] = a[2];\n        out[2] = a[1];\n        out[3] = a[3];\n    }\n    \n    return out;\n};\n\n/**\n * Inverts a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.invert = function(out, a) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n\n        // Calculate the determinant\n        det = a0 * a3 - a2 * a1;\n\n    if (!det) {\n        return null;\n    }\n    det = 1.0 / det;\n    \n    out[0] =  a3 * det;\n    out[1] = -a1 * det;\n    out[2] = -a2 * det;\n    out[3] =  a0 * det;\n\n    return out;\n};\n\n/**\n * Calculates the adjugate of a mat2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the source matrix\n * @returns {mat2} out\n */\nmat2.adjoint = function(out, a) {\n    // Caching this value is nessecary if out == a\n    var a0 = a[0];\n    out[0] =  a[3];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    out[3] =  a0;\n\n    return out;\n};\n\n/**\n * Calculates the determinant of a mat2\n *\n * @param {mat2} a the source matrix\n * @returns {Number} determinant of a\n */\nmat2.determinant = function (a) {\n    return a[0] * a[3] - a[2] * a[1];\n};\n\n/**\n * Multiplies two mat2's\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the first operand\n * @param {mat2} b the second operand\n * @returns {mat2} out\n */\nmat2.multiply = function (out, a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n    out[0] = a0 * b0 + a2 * b1;\n    out[1] = a1 * b0 + a3 * b1;\n    out[2] = a0 * b2 + a2 * b3;\n    out[3] = a1 * b2 + a3 * b3;\n    return out;\n};\n\n/**\n * Alias for {@link mat2.multiply}\n * @function\n */\nmat2.mul = mat2.multiply;\n\n/**\n * Rotates a mat2 by the given angle\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2} out\n */\nmat2.rotate = function (out, a, rad) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n        s = Math.sin(rad),\n        c = Math.cos(rad);\n    out[0] = a0 *  c + a2 * s;\n    out[1] = a1 *  c + a3 * s;\n    out[2] = a0 * -s + a2 * c;\n    out[3] = a1 * -s + a3 * c;\n    return out;\n};\n\n/**\n * Scales the mat2 by the dimensions in the given vec2\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the matrix to rotate\n * @param {vec2} v the vec2 to scale the matrix by\n * @returns {mat2} out\n **/\nmat2.scale = function(out, a, v) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n        v0 = v[0], v1 = v[1];\n    out[0] = a0 * v0;\n    out[1] = a1 * v0;\n    out[2] = a2 * v1;\n    out[3] = a3 * v1;\n    return out;\n};\n\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n *     mat2.identity(dest);\n *     mat2.rotate(dest, dest, rad);\n *\n * @param {mat2} out mat2 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2} out\n */\nmat2.fromRotation = function(out, rad) {\n    var s = Math.sin(rad),\n        c = Math.cos(rad);\n    out[0] = c;\n    out[1] = s;\n    out[2] = -s;\n    out[3] = c;\n    return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat2.identity(dest);\n *     mat2.scale(dest, dest, vec);\n *\n * @param {mat2} out mat2 receiving operation result\n * @param {vec2} v Scaling vector\n * @returns {mat2} out\n */\nmat2.fromScaling = function(out, v) {\n    out[0] = v[0];\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = v[1];\n    return out;\n}\n\n/**\n * Returns a string representation of a mat2\n *\n * @param {mat2} mat matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat2.str = function (a) {\n    return 'mat2(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';\n};\n\n/**\n * Returns Frobenius norm of a mat2\n *\n * @param {mat2} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nmat2.frob = function (a) {\n    return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2)))\n};\n\n/**\n * Returns L, D and U matrices (Lower triangular, Diagonal and Upper triangular) by factorizing the input matrix\n * @param {mat2} L the lower triangular matrix \n * @param {mat2} D the diagonal matrix \n * @param {mat2} U the upper triangular matrix \n * @param {mat2} a the input matrix to factorize\n */\n\nmat2.LDU = function (L, D, U, a) { \n    L[2] = a[2]/a[0]; \n    U[0] = a[0]; \n    U[1] = a[1]; \n    U[3] = a[3] - L[2] * U[1]; \n    return [L, D, U];       \n}; \n\n/**\n * Adds two mat2's\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the first operand\n * @param {mat2} b the second operand\n * @returns {mat2} out\n */\nmat2.add = function(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    return out;\n};\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the first operand\n * @param {mat2} b the second operand\n * @returns {mat2} out\n */\nmat2.subtract = function(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    return out;\n};\n\n/**\n * Alias for {@link mat2.subtract}\n * @function\n */\nmat2.sub = mat2.subtract;\n\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {mat2} a The first matrix.\n * @param {mat2} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat2.exactEquals = function (a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n};\n\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {mat2} a The first matrix.\n * @param {mat2} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat2.equals = function (a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n    return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n            Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n            Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n            Math.abs(a3 - b3) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a3), Math.abs(b3)));\n};\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat2} out the receiving matrix\n * @param {mat2} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat2} out\n */\nmat2.multiplyScalar = function(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    return out;\n};\n\n/**\n * Adds two mat2's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat2} out the receiving vector\n * @param {mat2} a the first operand\n * @param {mat2} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat2} out\n */\nmat2.multiplyScalarAndAdd = function(out, a, b, scale) {\n    out[0] = a[0] + (b[0] * scale);\n    out[1] = a[1] + (b[1] * scale);\n    out[2] = a[2] + (b[2] * scale);\n    out[3] = a[3] + (b[3] * scale);\n    return out;\n};\n\nmodule.exports = mat2;\n\n},{\"./common.js\":87}],89:[function(require,module,exports){\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\n\n/**\n * @class 2x3 Matrix\n * @name mat2d\n * \n * @description \n * A mat2d contains six elements defined as:\n * <pre>\n * [a, c, tx,\n *  b, d, ty]\n * </pre>\n * This is a short form for the 3x3 matrix:\n * <pre>\n * [a, c, tx,\n *  b, d, ty,\n *  0, 0, 1]\n * </pre>\n * The last row is ignored so the array is shorter and operations are faster.\n */\nvar mat2d = {};\n\n/**\n * Creates a new identity mat2d\n *\n * @returns {mat2d} a new 2x3 matrix\n */\nmat2d.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(6);\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    out[4] = 0;\n    out[5] = 0;\n    return out;\n};\n\n/**\n * Creates a new mat2d initialized with values from an existing matrix\n *\n * @param {mat2d} a matrix to clone\n * @returns {mat2d} a new 2x3 matrix\n */\nmat2d.clone = function(a) {\n    var out = new glMatrix.ARRAY_TYPE(6);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    return out;\n};\n\n/**\n * Copy the values from one mat2d to another\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the source matrix\n * @returns {mat2d} out\n */\nmat2d.copy = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    return out;\n};\n\n/**\n * Set a mat2d to the identity matrix\n *\n * @param {mat2d} out the receiving matrix\n * @returns {mat2d} out\n */\nmat2d.identity = function(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    out[4] = 0;\n    out[5] = 0;\n    return out;\n};\n\n/**\n * Create a new mat2d with the given values\n *\n * @param {Number} a Component A (index 0)\n * @param {Number} b Component B (index 1)\n * @param {Number} c Component C (index 2)\n * @param {Number} d Component D (index 3)\n * @param {Number} tx Component TX (index 4)\n * @param {Number} ty Component TY (index 5)\n * @returns {mat2d} A new mat2d\n */\nmat2d.fromValues = function(a, b, c, d, tx, ty) {\n    var out = new glMatrix.ARRAY_TYPE(6);\n    out[0] = a;\n    out[1] = b;\n    out[2] = c;\n    out[3] = d;\n    out[4] = tx;\n    out[5] = ty;\n    return out;\n};\n\n/**\n * Set the components of a mat2d to the given values\n *\n * @param {mat2d} out the receiving matrix\n * @param {Number} a Component A (index 0)\n * @param {Number} b Component B (index 1)\n * @param {Number} c Component C (index 2)\n * @param {Number} d Component D (index 3)\n * @param {Number} tx Component TX (index 4)\n * @param {Number} ty Component TY (index 5)\n * @returns {mat2d} out\n */\nmat2d.set = function(out, a, b, c, d, tx, ty) {\n    out[0] = a;\n    out[1] = b;\n    out[2] = c;\n    out[3] = d;\n    out[4] = tx;\n    out[5] = ty;\n    return out;\n};\n\n/**\n * Inverts a mat2d\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the source matrix\n * @returns {mat2d} out\n */\nmat2d.invert = function(out, a) {\n    var aa = a[0], ab = a[1], ac = a[2], ad = a[3],\n        atx = a[4], aty = a[5];\n\n    var det = aa * ad - ab * ac;\n    if(!det){\n        return null;\n    }\n    det = 1.0 / det;\n\n    out[0] = ad * det;\n    out[1] = -ab * det;\n    out[2] = -ac * det;\n    out[3] = aa * det;\n    out[4] = (ac * aty - ad * atx) * det;\n    out[5] = (ab * atx - aa * aty) * det;\n    return out;\n};\n\n/**\n * Calculates the determinant of a mat2d\n *\n * @param {mat2d} a the source matrix\n * @returns {Number} determinant of a\n */\nmat2d.determinant = function (a) {\n    return a[0] * a[3] - a[1] * a[2];\n};\n\n/**\n * Multiplies two mat2d's\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the first operand\n * @param {mat2d} b the second operand\n * @returns {mat2d} out\n */\nmat2d.multiply = function (out, a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5],\n        b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5];\n    out[0] = a0 * b0 + a2 * b1;\n    out[1] = a1 * b0 + a3 * b1;\n    out[2] = a0 * b2 + a2 * b3;\n    out[3] = a1 * b2 + a3 * b3;\n    out[4] = a0 * b4 + a2 * b5 + a4;\n    out[5] = a1 * b4 + a3 * b5 + a5;\n    return out;\n};\n\n/**\n * Alias for {@link mat2d.multiply}\n * @function\n */\nmat2d.mul = mat2d.multiply;\n\n/**\n * Rotates a mat2d by the given angle\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2d} out\n */\nmat2d.rotate = function (out, a, rad) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5],\n        s = Math.sin(rad),\n        c = Math.cos(rad);\n    out[0] = a0 *  c + a2 * s;\n    out[1] = a1 *  c + a3 * s;\n    out[2] = a0 * -s + a2 * c;\n    out[3] = a1 * -s + a3 * c;\n    out[4] = a4;\n    out[5] = a5;\n    return out;\n};\n\n/**\n * Scales the mat2d by the dimensions in the given vec2\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the matrix to translate\n * @param {vec2} v the vec2 to scale the matrix by\n * @returns {mat2d} out\n **/\nmat2d.scale = function(out, a, v) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5],\n        v0 = v[0], v1 = v[1];\n    out[0] = a0 * v0;\n    out[1] = a1 * v0;\n    out[2] = a2 * v1;\n    out[3] = a3 * v1;\n    out[4] = a4;\n    out[5] = a5;\n    return out;\n};\n\n/**\n * Translates the mat2d by the dimensions in the given vec2\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the matrix to translate\n * @param {vec2} v the vec2 to translate the matrix by\n * @returns {mat2d} out\n **/\nmat2d.translate = function(out, a, v) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5],\n        v0 = v[0], v1 = v[1];\n    out[0] = a0;\n    out[1] = a1;\n    out[2] = a2;\n    out[3] = a3;\n    out[4] = a0 * v0 + a2 * v1 + a4;\n    out[5] = a1 * v0 + a3 * v1 + a5;\n    return out;\n};\n\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n *     mat2d.identity(dest);\n *     mat2d.rotate(dest, dest, rad);\n *\n * @param {mat2d} out mat2d receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat2d} out\n */\nmat2d.fromRotation = function(out, rad) {\n    var s = Math.sin(rad), c = Math.cos(rad);\n    out[0] = c;\n    out[1] = s;\n    out[2] = -s;\n    out[3] = c;\n    out[4] = 0;\n    out[5] = 0;\n    return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat2d.identity(dest);\n *     mat2d.scale(dest, dest, vec);\n *\n * @param {mat2d} out mat2d receiving operation result\n * @param {vec2} v Scaling vector\n * @returns {mat2d} out\n */\nmat2d.fromScaling = function(out, v) {\n    out[0] = v[0];\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = v[1];\n    out[4] = 0;\n    out[5] = 0;\n    return out;\n}\n\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat2d.identity(dest);\n *     mat2d.translate(dest, dest, vec);\n *\n * @param {mat2d} out mat2d receiving operation result\n * @param {vec2} v Translation vector\n * @returns {mat2d} out\n */\nmat2d.fromTranslation = function(out, v) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    out[4] = v[0];\n    out[5] = v[1];\n    return out;\n}\n\n/**\n * Returns a string representation of a mat2d\n *\n * @param {mat2d} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat2d.str = function (a) {\n    return 'mat2d(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + \n                    a[3] + ', ' + a[4] + ', ' + a[5] + ')';\n};\n\n/**\n * Returns Frobenius norm of a mat2d\n *\n * @param {mat2d} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nmat2d.frob = function (a) { \n    return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + 1))\n}; \n\n/**\n * Adds two mat2d's\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the first operand\n * @param {mat2d} b the second operand\n * @returns {mat2d} out\n */\nmat2d.add = function(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    out[4] = a[4] + b[4];\n    out[5] = a[5] + b[5];\n    return out;\n};\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the first operand\n * @param {mat2d} b the second operand\n * @returns {mat2d} out\n */\nmat2d.subtract = function(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    out[4] = a[4] - b[4];\n    out[5] = a[5] - b[5];\n    return out;\n};\n\n/**\n * Alias for {@link mat2d.subtract}\n * @function\n */\nmat2d.sub = mat2d.subtract;\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat2d} out the receiving matrix\n * @param {mat2d} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat2d} out\n */\nmat2d.multiplyScalar = function(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    out[4] = a[4] * b;\n    out[5] = a[5] * b;\n    return out;\n};\n\n/**\n * Adds two mat2d's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat2d} out the receiving vector\n * @param {mat2d} a the first operand\n * @param {mat2d} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat2d} out\n */\nmat2d.multiplyScalarAndAdd = function(out, a, b, scale) {\n    out[0] = a[0] + (b[0] * scale);\n    out[1] = a[1] + (b[1] * scale);\n    out[2] = a[2] + (b[2] * scale);\n    out[3] = a[3] + (b[3] * scale);\n    out[4] = a[4] + (b[4] * scale);\n    out[5] = a[5] + (b[5] * scale);\n    return out;\n};\n\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {mat2d} a The first matrix.\n * @param {mat2d} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat2d.exactEquals = function (a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5];\n};\n\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {mat2d} a The first matrix.\n * @param {mat2d} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat2d.equals = function (a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5];\n    return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n            Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n            Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n            Math.abs(a3 - b3) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a3), Math.abs(b3)) &&\n            Math.abs(a4 - b4) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a4), Math.abs(b4)) &&\n            Math.abs(a5 - b5) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a5), Math.abs(b5)));\n};\n\nmodule.exports = mat2d;\n\n},{\"./common.js\":87}],90:[function(require,module,exports){\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\n\n/**\n * @class 3x3 Matrix\n * @name mat3\n */\nvar mat3 = {};\n\n/**\n * Creates a new identity mat3\n *\n * @returns {mat3} a new 3x3 matrix\n */\nmat3.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(9);\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 1;\n    out[5] = 0;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 1;\n    return out;\n};\n\n/**\n * Copies the upper-left 3x3 values into the given mat3.\n *\n * @param {mat3} out the receiving 3x3 matrix\n * @param {mat4} a   the source 4x4 matrix\n * @returns {mat3} out\n */\nmat3.fromMat4 = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[4];\n    out[4] = a[5];\n    out[5] = a[6];\n    out[6] = a[8];\n    out[7] = a[9];\n    out[8] = a[10];\n    return out;\n};\n\n/**\n * Creates a new mat3 initialized with values from an existing matrix\n *\n * @param {mat3} a matrix to clone\n * @returns {mat3} a new 3x3 matrix\n */\nmat3.clone = function(a) {\n    var out = new glMatrix.ARRAY_TYPE(9);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    return out;\n};\n\n/**\n * Copy the values from one mat3 to another\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.copy = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    return out;\n};\n\n/**\n * Create a new mat3 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} A new mat3\n */\nmat3.fromValues = function(m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n    var out = new glMatrix.ARRAY_TYPE(9);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m10;\n    out[4] = m11;\n    out[5] = m12;\n    out[6] = m20;\n    out[7] = m21;\n    out[8] = m22;\n    return out;\n};\n\n/**\n * Set the components of a mat3 to the given values\n *\n * @param {mat3} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m10 Component in column 1, row 0 position (index 3)\n * @param {Number} m11 Component in column 1, row 1 position (index 4)\n * @param {Number} m12 Component in column 1, row 2 position (index 5)\n * @param {Number} m20 Component in column 2, row 0 position (index 6)\n * @param {Number} m21 Component in column 2, row 1 position (index 7)\n * @param {Number} m22 Component in column 2, row 2 position (index 8)\n * @returns {mat3} out\n */\nmat3.set = function(out, m00, m01, m02, m10, m11, m12, m20, m21, m22) {\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m10;\n    out[4] = m11;\n    out[5] = m12;\n    out[6] = m20;\n    out[7] = m21;\n    out[8] = m22;\n    return out;\n};\n\n/**\n * Set a mat3 to the identity matrix\n *\n * @param {mat3} out the receiving matrix\n * @returns {mat3} out\n */\nmat3.identity = function(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 1;\n    out[5] = 0;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 1;\n    return out;\n};\n\n/**\n * Transpose the values of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.transpose = function(out, a) {\n    // If we are transposing ourselves we can skip a few steps but have to cache some values\n    if (out === a) {\n        var a01 = a[1], a02 = a[2], a12 = a[5];\n        out[1] = a[3];\n        out[2] = a[6];\n        out[3] = a01;\n        out[5] = a[7];\n        out[6] = a02;\n        out[7] = a12;\n    } else {\n        out[0] = a[0];\n        out[1] = a[3];\n        out[2] = a[6];\n        out[3] = a[1];\n        out[4] = a[4];\n        out[5] = a[7];\n        out[6] = a[2];\n        out[7] = a[5];\n        out[8] = a[8];\n    }\n    \n    return out;\n};\n\n/**\n * Inverts a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.invert = function(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2],\n        a10 = a[3], a11 = a[4], a12 = a[5],\n        a20 = a[6], a21 = a[7], a22 = a[8],\n\n        b01 = a22 * a11 - a12 * a21,\n        b11 = -a22 * a10 + a12 * a20,\n        b21 = a21 * a10 - a11 * a20,\n\n        // Calculate the determinant\n        det = a00 * b01 + a01 * b11 + a02 * b21;\n\n    if (!det) { \n        return null; \n    }\n    det = 1.0 / det;\n\n    out[0] = b01 * det;\n    out[1] = (-a22 * a01 + a02 * a21) * det;\n    out[2] = (a12 * a01 - a02 * a11) * det;\n    out[3] = b11 * det;\n    out[4] = (a22 * a00 - a02 * a20) * det;\n    out[5] = (-a12 * a00 + a02 * a10) * det;\n    out[6] = b21 * det;\n    out[7] = (-a21 * a00 + a01 * a20) * det;\n    out[8] = (a11 * a00 - a01 * a10) * det;\n    return out;\n};\n\n/**\n * Calculates the adjugate of a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the source matrix\n * @returns {mat3} out\n */\nmat3.adjoint = function(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2],\n        a10 = a[3], a11 = a[4], a12 = a[5],\n        a20 = a[6], a21 = a[7], a22 = a[8];\n\n    out[0] = (a11 * a22 - a12 * a21);\n    out[1] = (a02 * a21 - a01 * a22);\n    out[2] = (a01 * a12 - a02 * a11);\n    out[3] = (a12 * a20 - a10 * a22);\n    out[4] = (a00 * a22 - a02 * a20);\n    out[5] = (a02 * a10 - a00 * a12);\n    out[6] = (a10 * a21 - a11 * a20);\n    out[7] = (a01 * a20 - a00 * a21);\n    out[8] = (a00 * a11 - a01 * a10);\n    return out;\n};\n\n/**\n * Calculates the determinant of a mat3\n *\n * @param {mat3} a the source matrix\n * @returns {Number} determinant of a\n */\nmat3.determinant = function (a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2],\n        a10 = a[3], a11 = a[4], a12 = a[5],\n        a20 = a[6], a21 = a[7], a22 = a[8];\n\n    return a00 * (a22 * a11 - a12 * a21) + a01 * (-a22 * a10 + a12 * a20) + a02 * (a21 * a10 - a11 * a20);\n};\n\n/**\n * Multiplies two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @returns {mat3} out\n */\nmat3.multiply = function (out, a, b) {\n    var a00 = a[0], a01 = a[1], a02 = a[2],\n        a10 = a[3], a11 = a[4], a12 = a[5],\n        a20 = a[6], a21 = a[7], a22 = a[8],\n\n        b00 = b[0], b01 = b[1], b02 = b[2],\n        b10 = b[3], b11 = b[4], b12 = b[5],\n        b20 = b[6], b21 = b[7], b22 = b[8];\n\n    out[0] = b00 * a00 + b01 * a10 + b02 * a20;\n    out[1] = b00 * a01 + b01 * a11 + b02 * a21;\n    out[2] = b00 * a02 + b01 * a12 + b02 * a22;\n\n    out[3] = b10 * a00 + b11 * a10 + b12 * a20;\n    out[4] = b10 * a01 + b11 * a11 + b12 * a21;\n    out[5] = b10 * a02 + b11 * a12 + b12 * a22;\n\n    out[6] = b20 * a00 + b21 * a10 + b22 * a20;\n    out[7] = b20 * a01 + b21 * a11 + b22 * a21;\n    out[8] = b20 * a02 + b21 * a12 + b22 * a22;\n    return out;\n};\n\n/**\n * Alias for {@link mat3.multiply}\n * @function\n */\nmat3.mul = mat3.multiply;\n\n/**\n * Translate a mat3 by the given vector\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to translate\n * @param {vec2} v vector to translate by\n * @returns {mat3} out\n */\nmat3.translate = function(out, a, v) {\n    var a00 = a[0], a01 = a[1], a02 = a[2],\n        a10 = a[3], a11 = a[4], a12 = a[5],\n        a20 = a[6], a21 = a[7], a22 = a[8],\n        x = v[0], y = v[1];\n\n    out[0] = a00;\n    out[1] = a01;\n    out[2] = a02;\n\n    out[3] = a10;\n    out[4] = a11;\n    out[5] = a12;\n\n    out[6] = x * a00 + y * a10 + a20;\n    out[7] = x * a01 + y * a11 + a21;\n    out[8] = x * a02 + y * a12 + a22;\n    return out;\n};\n\n/**\n * Rotates a mat3 by the given angle\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\nmat3.rotate = function (out, a, rad) {\n    var a00 = a[0], a01 = a[1], a02 = a[2],\n        a10 = a[3], a11 = a[4], a12 = a[5],\n        a20 = a[6], a21 = a[7], a22 = a[8],\n\n        s = Math.sin(rad),\n        c = Math.cos(rad);\n\n    out[0] = c * a00 + s * a10;\n    out[1] = c * a01 + s * a11;\n    out[2] = c * a02 + s * a12;\n\n    out[3] = c * a10 - s * a00;\n    out[4] = c * a11 - s * a01;\n    out[5] = c * a12 - s * a02;\n\n    out[6] = a20;\n    out[7] = a21;\n    out[8] = a22;\n    return out;\n};\n\n/**\n * Scales the mat3 by the dimensions in the given vec2\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to rotate\n * @param {vec2} v the vec2 to scale the matrix by\n * @returns {mat3} out\n **/\nmat3.scale = function(out, a, v) {\n    var x = v[0], y = v[1];\n\n    out[0] = x * a[0];\n    out[1] = x * a[1];\n    out[2] = x * a[2];\n\n    out[3] = y * a[3];\n    out[4] = y * a[4];\n    out[5] = y * a[5];\n\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    return out;\n};\n\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.translate(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {vec2} v Translation vector\n * @returns {mat3} out\n */\nmat3.fromTranslation = function(out, v) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 1;\n    out[5] = 0;\n    out[6] = v[0];\n    out[7] = v[1];\n    out[8] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from a given angle\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.rotate(dest, dest, rad);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat3} out\n */\nmat3.fromRotation = function(out, rad) {\n    var s = Math.sin(rad), c = Math.cos(rad);\n\n    out[0] = c;\n    out[1] = s;\n    out[2] = 0;\n\n    out[3] = -s;\n    out[4] = c;\n    out[5] = 0;\n\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat3.identity(dest);\n *     mat3.scale(dest, dest, vec);\n *\n * @param {mat3} out mat3 receiving operation result\n * @param {vec2} v Scaling vector\n * @returns {mat3} out\n */\nmat3.fromScaling = function(out, v) {\n    out[0] = v[0];\n    out[1] = 0;\n    out[2] = 0;\n\n    out[3] = 0;\n    out[4] = v[1];\n    out[5] = 0;\n\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 1;\n    return out;\n}\n\n/**\n * Copies the values from a mat2d into a mat3\n *\n * @param {mat3} out the receiving matrix\n * @param {mat2d} a the matrix to copy\n * @returns {mat3} out\n **/\nmat3.fromMat2d = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = 0;\n\n    out[3] = a[2];\n    out[4] = a[3];\n    out[5] = 0;\n\n    out[6] = a[4];\n    out[7] = a[5];\n    out[8] = 1;\n    return out;\n};\n\n/**\n* Calculates a 3x3 matrix from the given quaternion\n*\n* @param {mat3} out mat3 receiving operation result\n* @param {quat} q Quaternion to create matrix from\n*\n* @returns {mat3} out\n*/\nmat3.fromQuat = function (out, q) {\n    var x = q[0], y = q[1], z = q[2], w = q[3],\n        x2 = x + x,\n        y2 = y + y,\n        z2 = z + z,\n\n        xx = x * x2,\n        yx = y * x2,\n        yy = y * y2,\n        zx = z * x2,\n        zy = z * y2,\n        zz = z * z2,\n        wx = w * x2,\n        wy = w * y2,\n        wz = w * z2;\n\n    out[0] = 1 - yy - zz;\n    out[3] = yx - wz;\n    out[6] = zx + wy;\n\n    out[1] = yx + wz;\n    out[4] = 1 - xx - zz;\n    out[7] = zy - wx;\n\n    out[2] = zx - wy;\n    out[5] = zy + wx;\n    out[8] = 1 - xx - yy;\n\n    return out;\n};\n\n/**\n* Calculates a 3x3 normal matrix (transpose inverse) from the 4x4 matrix\n*\n* @param {mat3} out mat3 receiving operation result\n* @param {mat4} a Mat4 to derive the normal matrix from\n*\n* @returns {mat3} out\n*/\nmat3.normalFromMat4 = function (out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n        a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n        a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n        a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],\n\n        b00 = a00 * a11 - a01 * a10,\n        b01 = a00 * a12 - a02 * a10,\n        b02 = a00 * a13 - a03 * a10,\n        b03 = a01 * a12 - a02 * a11,\n        b04 = a01 * a13 - a03 * a11,\n        b05 = a02 * a13 - a03 * a12,\n        b06 = a20 * a31 - a21 * a30,\n        b07 = a20 * a32 - a22 * a30,\n        b08 = a20 * a33 - a23 * a30,\n        b09 = a21 * a32 - a22 * a31,\n        b10 = a21 * a33 - a23 * a31,\n        b11 = a22 * a33 - a23 * a32,\n\n        // Calculate the determinant\n        det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n    if (!det) { \n        return null; \n    }\n    det = 1.0 / det;\n\n    out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n    out[1] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n    out[2] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n\n    out[3] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n    out[4] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n    out[5] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n\n    out[6] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n    out[7] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n    out[8] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n\n    return out;\n};\n\n/**\n * Returns a string representation of a mat3\n *\n * @param {mat3} mat matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat3.str = function (a) {\n    return 'mat3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + \n                    a[3] + ', ' + a[4] + ', ' + a[5] + ', ' + \n                    a[6] + ', ' + a[7] + ', ' + a[8] + ')';\n};\n\n/**\n * Returns Frobenius norm of a mat3\n *\n * @param {mat3} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nmat3.frob = function (a) {\n    return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2)))\n};\n\n/**\n * Adds two mat3's\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @returns {mat3} out\n */\nmat3.add = function(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    out[4] = a[4] + b[4];\n    out[5] = a[5] + b[5];\n    out[6] = a[6] + b[6];\n    out[7] = a[7] + b[7];\n    out[8] = a[8] + b[8];\n    return out;\n};\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @returns {mat3} out\n */\nmat3.subtract = function(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    out[4] = a[4] - b[4];\n    out[5] = a[5] - b[5];\n    out[6] = a[6] - b[6];\n    out[7] = a[7] - b[7];\n    out[8] = a[8] - b[8];\n    return out;\n};\n\n/**\n * Alias for {@link mat3.subtract}\n * @function\n */\nmat3.sub = mat3.subtract;\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat3} out the receiving matrix\n * @param {mat3} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat3} out\n */\nmat3.multiplyScalar = function(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    out[4] = a[4] * b;\n    out[5] = a[5] * b;\n    out[6] = a[6] * b;\n    out[7] = a[7] * b;\n    out[8] = a[8] * b;\n    return out;\n};\n\n/**\n * Adds two mat3's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat3} out the receiving vector\n * @param {mat3} a the first operand\n * @param {mat3} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat3} out\n */\nmat3.multiplyScalarAndAdd = function(out, a, b, scale) {\n    out[0] = a[0] + (b[0] * scale);\n    out[1] = a[1] + (b[1] * scale);\n    out[2] = a[2] + (b[2] * scale);\n    out[3] = a[3] + (b[3] * scale);\n    out[4] = a[4] + (b[4] * scale);\n    out[5] = a[5] + (b[5] * scale);\n    out[6] = a[6] + (b[6] * scale);\n    out[7] = a[7] + (b[7] * scale);\n    out[8] = a[8] + (b[8] * scale);\n    return out;\n};\n\n/*\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {mat3} a The first matrix.\n * @param {mat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat3.exactEquals = function (a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && \n           a[3] === b[3] && a[4] === b[4] && a[5] === b[5] &&\n           a[6] === b[6] && a[7] === b[7] && a[8] === b[8];\n};\n\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {mat3} a The first matrix.\n * @param {mat3} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat3.equals = function (a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4], a5 = a[5], a6 = a[6], a7 = a[7], a8 = a[8];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3], b4 = b[4], b5 = b[5], b6 = a[6], b7 = b[7], b8 = b[8];\n    return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n            Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n            Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n            Math.abs(a3 - b3) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a3), Math.abs(b3)) &&\n            Math.abs(a4 - b4) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a4), Math.abs(b4)) &&\n            Math.abs(a5 - b5) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a5), Math.abs(b5)) &&\n            Math.abs(a6 - b6) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a6), Math.abs(b6)) &&\n            Math.abs(a7 - b7) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a7), Math.abs(b7)) &&\n            Math.abs(a8 - b8) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a8), Math.abs(b8)));\n};\n\n\nmodule.exports = mat3;\n\n},{\"./common.js\":87}],91:[function(require,module,exports){\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\n\n/**\n * @class 4x4 Matrix\n * @name mat4\n */\nvar mat4 = {\n  scalar: {},\n  SIMD: {},\n};\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\nmat4.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(16);\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n};\n\n/**\n * Creates a new mat4 initialized with values from an existing matrix\n *\n * @param {mat4} a matrix to clone\n * @returns {mat4} a new 4x4 matrix\n */\nmat4.clone = function(a) {\n    var out = new glMatrix.ARRAY_TYPE(16);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    out[9] = a[9];\n    out[10] = a[10];\n    out[11] = a[11];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n};\n\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.copy = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    out[4] = a[4];\n    out[5] = a[5];\n    out[6] = a[6];\n    out[7] = a[7];\n    out[8] = a[8];\n    out[9] = a[9];\n    out[10] = a[10];\n    out[11] = a[11];\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n};\n\n/**\n * Create a new mat4 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} A new mat4\n */\nmat4.fromValues = function(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n    var out = new glMatrix.ARRAY_TYPE(16);\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m03;\n    out[4] = m10;\n    out[5] = m11;\n    out[6] = m12;\n    out[7] = m13;\n    out[8] = m20;\n    out[9] = m21;\n    out[10] = m22;\n    out[11] = m23;\n    out[12] = m30;\n    out[13] = m31;\n    out[14] = m32;\n    out[15] = m33;\n    return out;\n};\n\n/**\n * Set the components of a mat4 to the given values\n *\n * @param {mat4} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} out\n */\nmat4.set = function(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n    out[0] = m00;\n    out[1] = m01;\n    out[2] = m02;\n    out[3] = m03;\n    out[4] = m10;\n    out[5] = m11;\n    out[6] = m12;\n    out[7] = m13;\n    out[8] = m20;\n    out[9] = m21;\n    out[10] = m22;\n    out[11] = m23;\n    out[12] = m30;\n    out[13] = m31;\n    out[14] = m32;\n    out[15] = m33;\n    return out;\n};\n\n\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\nmat4.identity = function(out) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n};\n\n/**\n * Transpose the values of a mat4 not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.scalar.transpose = function(out, a) {\n    // If we are transposing ourselves we can skip a few steps but have to cache some values\n    if (out === a) {\n        var a01 = a[1], a02 = a[2], a03 = a[3],\n            a12 = a[6], a13 = a[7],\n            a23 = a[11];\n\n        out[1] = a[4];\n        out[2] = a[8];\n        out[3] = a[12];\n        out[4] = a01;\n        out[6] = a[9];\n        out[7] = a[13];\n        out[8] = a02;\n        out[9] = a12;\n        out[11] = a[14];\n        out[12] = a03;\n        out[13] = a13;\n        out[14] = a23;\n    } else {\n        out[0] = a[0];\n        out[1] = a[4];\n        out[2] = a[8];\n        out[3] = a[12];\n        out[4] = a[1];\n        out[5] = a[5];\n        out[6] = a[9];\n        out[7] = a[13];\n        out[8] = a[2];\n        out[9] = a[6];\n        out[10] = a[10];\n        out[11] = a[14];\n        out[12] = a[3];\n        out[13] = a[7];\n        out[14] = a[11];\n        out[15] = a[15];\n    }\n\n    return out;\n};\n\n/**\n * Transpose the values of a mat4 using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.SIMD.transpose = function(out, a) {\n    var a0, a1, a2, a3,\n        tmp01, tmp23,\n        out0, out1, out2, out3;\n\n    a0 = SIMD.Float32x4.load(a, 0);\n    a1 = SIMD.Float32x4.load(a, 4);\n    a2 = SIMD.Float32x4.load(a, 8);\n    a3 = SIMD.Float32x4.load(a, 12);\n\n    tmp01 = SIMD.Float32x4.shuffle(a0, a1, 0, 1, 4, 5);\n    tmp23 = SIMD.Float32x4.shuffle(a2, a3, 0, 1, 4, 5);\n    out0  = SIMD.Float32x4.shuffle(tmp01, tmp23, 0, 2, 4, 6);\n    out1  = SIMD.Float32x4.shuffle(tmp01, tmp23, 1, 3, 5, 7);\n    SIMD.Float32x4.store(out, 0,  out0);\n    SIMD.Float32x4.store(out, 4,  out1);\n\n    tmp01 = SIMD.Float32x4.shuffle(a0, a1, 2, 3, 6, 7);\n    tmp23 = SIMD.Float32x4.shuffle(a2, a3, 2, 3, 6, 7);\n    out2  = SIMD.Float32x4.shuffle(tmp01, tmp23, 0, 2, 4, 6);\n    out3  = SIMD.Float32x4.shuffle(tmp01, tmp23, 1, 3, 5, 7);\n    SIMD.Float32x4.store(out, 8,  out2);\n    SIMD.Float32x4.store(out, 12, out3);\n\n    return out;\n};\n\n/**\n * Transpse a mat4 using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.transpose = glMatrix.USE_SIMD ? mat4.SIMD.transpose : mat4.scalar.transpose;\n\n/**\n * Inverts a mat4 not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.scalar.invert = function(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n        a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n        a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n        a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],\n\n        b00 = a00 * a11 - a01 * a10,\n        b01 = a00 * a12 - a02 * a10,\n        b02 = a00 * a13 - a03 * a10,\n        b03 = a01 * a12 - a02 * a11,\n        b04 = a01 * a13 - a03 * a11,\n        b05 = a02 * a13 - a03 * a12,\n        b06 = a20 * a31 - a21 * a30,\n        b07 = a20 * a32 - a22 * a30,\n        b08 = a20 * a33 - a23 * a30,\n        b09 = a21 * a32 - a22 * a31,\n        b10 = a21 * a33 - a23 * a31,\n        b11 = a22 * a33 - a23 * a32,\n\n        // Calculate the determinant\n        det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n    if (!det) {\n        return null;\n    }\n    det = 1.0 / det;\n\n    out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n    out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n    out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n    out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n    out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n    out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n    out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n    out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n    out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n    out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n    out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n    out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n    out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n    out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n    out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n    out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n\n    return out;\n};\n\n/**\n * Inverts a mat4 using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.SIMD.invert = function(out, a) {\n  var row0, row1, row2, row3,\n      tmp1,\n      minor0, minor1, minor2, minor3,\n      det,\n      a0 = SIMD.Float32x4.load(a, 0),\n      a1 = SIMD.Float32x4.load(a, 4),\n      a2 = SIMD.Float32x4.load(a, 8),\n      a3 = SIMD.Float32x4.load(a, 12);\n\n  // Compute matrix adjugate\n  tmp1 = SIMD.Float32x4.shuffle(a0, a1, 0, 1, 4, 5);\n  row1 = SIMD.Float32x4.shuffle(a2, a3, 0, 1, 4, 5);\n  row0 = SIMD.Float32x4.shuffle(tmp1, row1, 0, 2, 4, 6);\n  row1 = SIMD.Float32x4.shuffle(row1, tmp1, 1, 3, 5, 7);\n  tmp1 = SIMD.Float32x4.shuffle(a0, a1, 2, 3, 6, 7);\n  row3 = SIMD.Float32x4.shuffle(a2, a3, 2, 3, 6, 7);\n  row2 = SIMD.Float32x4.shuffle(tmp1, row3, 0, 2, 4, 6);\n  row3 = SIMD.Float32x4.shuffle(row3, tmp1, 1, 3, 5, 7);\n\n  tmp1   = SIMD.Float32x4.mul(row2, row3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor0 = SIMD.Float32x4.mul(row1, tmp1);\n  minor1 = SIMD.Float32x4.mul(row0, tmp1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row1, tmp1), minor0);\n  minor1 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor1);\n  minor1 = SIMD.Float32x4.swizzle(minor1, 2, 3, 0, 1);\n\n  tmp1   = SIMD.Float32x4.mul(row1, row2);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor0 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor0);\n  minor3 = SIMD.Float32x4.mul(row0, tmp1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.sub(minor0, SIMD.Float32x4.mul(row3, tmp1));\n  minor3 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor3);\n  minor3 = SIMD.Float32x4.swizzle(minor3, 2, 3, 0, 1);\n\n  tmp1   = SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(row1, 2, 3, 0, 1), row3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  row2   = SIMD.Float32x4.swizzle(row2, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row2, tmp1), minor0);\n  minor2 = SIMD.Float32x4.mul(row0, tmp1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.sub(minor0, SIMD.Float32x4.mul(row2, tmp1));\n  minor2 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor2);\n  minor2 = SIMD.Float32x4.swizzle(minor2, 2, 3, 0, 1);\n\n  tmp1   = SIMD.Float32x4.mul(row0, row1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor2 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor2);\n  minor3 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row2, tmp1), minor3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor2 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row3, tmp1), minor2);\n  minor3 = SIMD.Float32x4.sub(minor3, SIMD.Float32x4.mul(row2, tmp1));\n\n  tmp1   = SIMD.Float32x4.mul(row0, row3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor1 = SIMD.Float32x4.sub(minor1, SIMD.Float32x4.mul(row2, tmp1));\n  minor2 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row1, tmp1), minor2);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor1 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row2, tmp1), minor1);\n  minor2 = SIMD.Float32x4.sub(minor2, SIMD.Float32x4.mul(row1, tmp1));\n\n  tmp1   = SIMD.Float32x4.mul(row0, row2);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor1 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor1);\n  minor3 = SIMD.Float32x4.sub(minor3, SIMD.Float32x4.mul(row1, tmp1));\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor1 = SIMD.Float32x4.sub(minor1, SIMD.Float32x4.mul(row3, tmp1));\n  minor3 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row1, tmp1), minor3);\n\n  // Compute matrix determinant\n  det   = SIMD.Float32x4.mul(row0, minor0);\n  det   = SIMD.Float32x4.add(SIMD.Float32x4.swizzle(det, 2, 3, 0, 1), det);\n  det   = SIMD.Float32x4.add(SIMD.Float32x4.swizzle(det, 1, 0, 3, 2), det);\n  tmp1  = SIMD.Float32x4.reciprocalApproximation(det);\n  det   = SIMD.Float32x4.sub(\n               SIMD.Float32x4.add(tmp1, tmp1),\n               SIMD.Float32x4.mul(det, SIMD.Float32x4.mul(tmp1, tmp1)));\n  det   = SIMD.Float32x4.swizzle(det, 0, 0, 0, 0);\n  if (!det) {\n      return null;\n  }\n\n  // Compute matrix inverse\n  SIMD.Float32x4.store(out, 0,  SIMD.Float32x4.mul(det, minor0));\n  SIMD.Float32x4.store(out, 4,  SIMD.Float32x4.mul(det, minor1));\n  SIMD.Float32x4.store(out, 8,  SIMD.Float32x4.mul(det, minor2));\n  SIMD.Float32x4.store(out, 12, SIMD.Float32x4.mul(det, minor3));\n  return out;\n}\n\n/**\n * Inverts a mat4 using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.invert = glMatrix.USE_SIMD ? mat4.SIMD.invert : mat4.scalar.invert;\n\n/**\n * Calculates the adjugate of a mat4 not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.scalar.adjoint = function(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n        a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n        a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n        a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n\n    out[0]  =  (a11 * (a22 * a33 - a23 * a32) - a21 * (a12 * a33 - a13 * a32) + a31 * (a12 * a23 - a13 * a22));\n    out[1]  = -(a01 * (a22 * a33 - a23 * a32) - a21 * (a02 * a33 - a03 * a32) + a31 * (a02 * a23 - a03 * a22));\n    out[2]  =  (a01 * (a12 * a33 - a13 * a32) - a11 * (a02 * a33 - a03 * a32) + a31 * (a02 * a13 - a03 * a12));\n    out[3]  = -(a01 * (a12 * a23 - a13 * a22) - a11 * (a02 * a23 - a03 * a22) + a21 * (a02 * a13 - a03 * a12));\n    out[4]  = -(a10 * (a22 * a33 - a23 * a32) - a20 * (a12 * a33 - a13 * a32) + a30 * (a12 * a23 - a13 * a22));\n    out[5]  =  (a00 * (a22 * a33 - a23 * a32) - a20 * (a02 * a33 - a03 * a32) + a30 * (a02 * a23 - a03 * a22));\n    out[6]  = -(a00 * (a12 * a33 - a13 * a32) - a10 * (a02 * a33 - a03 * a32) + a30 * (a02 * a13 - a03 * a12));\n    out[7]  =  (a00 * (a12 * a23 - a13 * a22) - a10 * (a02 * a23 - a03 * a22) + a20 * (a02 * a13 - a03 * a12));\n    out[8]  =  (a10 * (a21 * a33 - a23 * a31) - a20 * (a11 * a33 - a13 * a31) + a30 * (a11 * a23 - a13 * a21));\n    out[9]  = -(a00 * (a21 * a33 - a23 * a31) - a20 * (a01 * a33 - a03 * a31) + a30 * (a01 * a23 - a03 * a21));\n    out[10] =  (a00 * (a11 * a33 - a13 * a31) - a10 * (a01 * a33 - a03 * a31) + a30 * (a01 * a13 - a03 * a11));\n    out[11] = -(a00 * (a11 * a23 - a13 * a21) - a10 * (a01 * a23 - a03 * a21) + a20 * (a01 * a13 - a03 * a11));\n    out[12] = -(a10 * (a21 * a32 - a22 * a31) - a20 * (a11 * a32 - a12 * a31) + a30 * (a11 * a22 - a12 * a21));\n    out[13] =  (a00 * (a21 * a32 - a22 * a31) - a20 * (a01 * a32 - a02 * a31) + a30 * (a01 * a22 - a02 * a21));\n    out[14] = -(a00 * (a11 * a32 - a12 * a31) - a10 * (a01 * a32 - a02 * a31) + a30 * (a01 * a12 - a02 * a11));\n    out[15] =  (a00 * (a11 * a22 - a12 * a21) - a10 * (a01 * a22 - a02 * a21) + a20 * (a01 * a12 - a02 * a11));\n    return out;\n};\n\n/**\n * Calculates the adjugate of a mat4 using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\nmat4.SIMD.adjoint = function(out, a) {\n  var a0, a1, a2, a3;\n  var row0, row1, row2, row3;\n  var tmp1;\n  var minor0, minor1, minor2, minor3;\n\n  var a0 = SIMD.Float32x4.load(a, 0);\n  var a1 = SIMD.Float32x4.load(a, 4);\n  var a2 = SIMD.Float32x4.load(a, 8);\n  var a3 = SIMD.Float32x4.load(a, 12);\n\n  // Transpose the source matrix.  Sort of.  Not a true transpose operation\n  tmp1 = SIMD.Float32x4.shuffle(a0, a1, 0, 1, 4, 5);\n  row1 = SIMD.Float32x4.shuffle(a2, a3, 0, 1, 4, 5);\n  row0 = SIMD.Float32x4.shuffle(tmp1, row1, 0, 2, 4, 6);\n  row1 = SIMD.Float32x4.shuffle(row1, tmp1, 1, 3, 5, 7);\n\n  tmp1 = SIMD.Float32x4.shuffle(a0, a1, 2, 3, 6, 7);\n  row3 = SIMD.Float32x4.shuffle(a2, a3, 2, 3, 6, 7);\n  row2 = SIMD.Float32x4.shuffle(tmp1, row3, 0, 2, 4, 6);\n  row3 = SIMD.Float32x4.shuffle(row3, tmp1, 1, 3, 5, 7);\n\n  tmp1   = SIMD.Float32x4.mul(row2, row3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor0 = SIMD.Float32x4.mul(row1, tmp1);\n  minor1 = SIMD.Float32x4.mul(row0, tmp1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row1, tmp1), minor0);\n  minor1 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor1);\n  minor1 = SIMD.Float32x4.swizzle(minor1, 2, 3, 0, 1);\n\n  tmp1   = SIMD.Float32x4.mul(row1, row2);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor0 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor0);\n  minor3 = SIMD.Float32x4.mul(row0, tmp1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.sub(minor0, SIMD.Float32x4.mul(row3, tmp1));\n  minor3 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor3);\n  minor3 = SIMD.Float32x4.swizzle(minor3, 2, 3, 0, 1);\n\n  tmp1   = SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(row1, 2, 3, 0, 1), row3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  row2   = SIMD.Float32x4.swizzle(row2, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row2, tmp1), minor0);\n  minor2 = SIMD.Float32x4.mul(row0, tmp1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor0 = SIMD.Float32x4.sub(minor0, SIMD.Float32x4.mul(row2, tmp1));\n  minor2 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row0, tmp1), minor2);\n  minor2 = SIMD.Float32x4.swizzle(minor2, 2, 3, 0, 1);\n\n  tmp1   = SIMD.Float32x4.mul(row0, row1);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor2 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor2);\n  minor3 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row2, tmp1), minor3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor2 = SIMD.Float32x4.sub(SIMD.Float32x4.mul(row3, tmp1), minor2);\n  minor3 = SIMD.Float32x4.sub(minor3, SIMD.Float32x4.mul(row2, tmp1));\n\n  tmp1   = SIMD.Float32x4.mul(row0, row3);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor1 = SIMD.Float32x4.sub(minor1, SIMD.Float32x4.mul(row2, tmp1));\n  minor2 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row1, tmp1), minor2);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor1 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row2, tmp1), minor1);\n  minor2 = SIMD.Float32x4.sub(minor2, SIMD.Float32x4.mul(row1, tmp1));\n\n  tmp1   = SIMD.Float32x4.mul(row0, row2);\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 1, 0, 3, 2);\n  minor1 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row3, tmp1), minor1);\n  minor3 = SIMD.Float32x4.sub(minor3, SIMD.Float32x4.mul(row1, tmp1));\n  tmp1   = SIMD.Float32x4.swizzle(tmp1, 2, 3, 0, 1);\n  minor1 = SIMD.Float32x4.sub(minor1, SIMD.Float32x4.mul(row3, tmp1));\n  minor3 = SIMD.Float32x4.add(SIMD.Float32x4.mul(row1, tmp1), minor3);\n\n  SIMD.Float32x4.store(out, 0,  minor0);\n  SIMD.Float32x4.store(out, 4,  minor1);\n  SIMD.Float32x4.store(out, 8,  minor2);\n  SIMD.Float32x4.store(out, 12, minor3);\n  return out;\n};\n\n/**\n * Calculates the adjugate of a mat4 using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the source matrix\n * @returns {mat4} out\n */\n mat4.adjoint = glMatrix.USE_SIMD ? mat4.SIMD.adjoint : mat4.scalar.adjoint;\n\n/**\n * Calculates the determinant of a mat4\n *\n * @param {mat4} a the source matrix\n * @returns {Number} determinant of a\n */\nmat4.determinant = function (a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n        a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n        a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n        a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],\n\n        b00 = a00 * a11 - a01 * a10,\n        b01 = a00 * a12 - a02 * a10,\n        b02 = a00 * a13 - a03 * a10,\n        b03 = a01 * a12 - a02 * a11,\n        b04 = a01 * a13 - a03 * a11,\n        b05 = a02 * a13 - a03 * a12,\n        b06 = a20 * a31 - a21 * a30,\n        b07 = a20 * a32 - a22 * a30,\n        b08 = a20 * a33 - a23 * a30,\n        b09 = a21 * a32 - a22 * a31,\n        b10 = a21 * a33 - a23 * a31,\n        b11 = a22 * a33 - a23 * a32;\n\n    // Calculate the determinant\n    return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n};\n\n/**\n * Multiplies two mat4's explicitly using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand, must be a Float32Array\n * @param {mat4} b the second operand, must be a Float32Array\n * @returns {mat4} out\n */\nmat4.SIMD.multiply = function (out, a, b) {\n    var a0 = SIMD.Float32x4.load(a, 0);\n    var a1 = SIMD.Float32x4.load(a, 4);\n    var a2 = SIMD.Float32x4.load(a, 8);\n    var a3 = SIMD.Float32x4.load(a, 12);\n\n    var b0 = SIMD.Float32x4.load(b, 0);\n    var out0 = SIMD.Float32x4.add(\n                   SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b0, 0, 0, 0, 0), a0),\n                   SIMD.Float32x4.add(\n                       SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b0, 1, 1, 1, 1), a1),\n                       SIMD.Float32x4.add(\n                           SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b0, 2, 2, 2, 2), a2),\n                           SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b0, 3, 3, 3, 3), a3))));\n    SIMD.Float32x4.store(out, 0, out0);\n\n    var b1 = SIMD.Float32x4.load(b, 4);\n    var out1 = SIMD.Float32x4.add(\n                   SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b1, 0, 0, 0, 0), a0),\n                   SIMD.Float32x4.add(\n                       SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b1, 1, 1, 1, 1), a1),\n                       SIMD.Float32x4.add(\n                           SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b1, 2, 2, 2, 2), a2),\n                           SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b1, 3, 3, 3, 3), a3))));\n    SIMD.Float32x4.store(out, 4, out1);\n\n    var b2 = SIMD.Float32x4.load(b, 8);\n    var out2 = SIMD.Float32x4.add(\n                   SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b2, 0, 0, 0, 0), a0),\n                   SIMD.Float32x4.add(\n                       SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b2, 1, 1, 1, 1), a1),\n                       SIMD.Float32x4.add(\n                               SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b2, 2, 2, 2, 2), a2),\n                               SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b2, 3, 3, 3, 3), a3))));\n    SIMD.Float32x4.store(out, 8, out2);\n\n    var b3 = SIMD.Float32x4.load(b, 12);\n    var out3 = SIMD.Float32x4.add(\n                   SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b3, 0, 0, 0, 0), a0),\n                   SIMD.Float32x4.add(\n                        SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b3, 1, 1, 1, 1), a1),\n                        SIMD.Float32x4.add(\n                            SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b3, 2, 2, 2, 2), a2),\n                            SIMD.Float32x4.mul(SIMD.Float32x4.swizzle(b3, 3, 3, 3, 3), a3))));\n    SIMD.Float32x4.store(out, 12, out3);\n\n    return out;\n};\n\n/**\n * Multiplies two mat4's explicitly not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nmat4.scalar.multiply = function (out, a, b) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n        a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n        a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n        a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n\n    // Cache only the current line of the second matrix\n    var b0  = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n    out[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n    out[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n    out[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n    out[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n\n    b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7];\n    out[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n    out[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n    out[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n    out[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n\n    b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11];\n    out[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n    out[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n    out[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n    out[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n\n    b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15];\n    out[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n    out[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n    out[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n    out[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n    return out;\n};\n\n/**\n * Multiplies two mat4's using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nmat4.multiply = glMatrix.USE_SIMD ? mat4.SIMD.multiply : mat4.scalar.multiply;\n\n/**\n * Alias for {@link mat4.multiply}\n * @function\n */\nmat4.mul = mat4.multiply;\n\n/**\n * Translate a mat4 by the given vector not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to translate\n * @param {vec3} v vector to translate by\n * @returns {mat4} out\n */\nmat4.scalar.translate = function (out, a, v) {\n    var x = v[0], y = v[1], z = v[2],\n        a00, a01, a02, a03,\n        a10, a11, a12, a13,\n        a20, a21, a22, a23;\n\n    if (a === out) {\n        out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n        out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n        out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n        out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n    } else {\n        a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3];\n        a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7];\n        a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11];\n\n        out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03;\n        out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13;\n        out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23;\n\n        out[12] = a00 * x + a10 * y + a20 * z + a[12];\n        out[13] = a01 * x + a11 * y + a21 * z + a[13];\n        out[14] = a02 * x + a12 * y + a22 * z + a[14];\n        out[15] = a03 * x + a13 * y + a23 * z + a[15];\n    }\n\n    return out;\n};\n\n/**\n * Translates a mat4 by the given vector using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to translate\n * @param {vec3} v vector to translate by\n * @returns {mat4} out\n */\nmat4.SIMD.translate = function (out, a, v) {\n    var a0 = SIMD.Float32x4.load(a, 0),\n        a1 = SIMD.Float32x4.load(a, 4),\n        a2 = SIMD.Float32x4.load(a, 8),\n        a3 = SIMD.Float32x4.load(a, 12),\n        vec = SIMD.Float32x4(v[0], v[1], v[2] , 0);\n\n    if (a !== out) {\n        out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3];\n        out[4] = a[4]; out[5] = a[5]; out[6] = a[6]; out[7] = a[7];\n        out[8] = a[8]; out[9] = a[9]; out[10] = a[10]; out[11] = a[11];\n    }\n\n    a0 = SIMD.Float32x4.mul(a0, SIMD.Float32x4.swizzle(vec, 0, 0, 0, 0));\n    a1 = SIMD.Float32x4.mul(a1, SIMD.Float32x4.swizzle(vec, 1, 1, 1, 1));\n    a2 = SIMD.Float32x4.mul(a2, SIMD.Float32x4.swizzle(vec, 2, 2, 2, 2));\n\n    var t0 = SIMD.Float32x4.add(a0, SIMD.Float32x4.add(a1, SIMD.Float32x4.add(a2, a3)));\n    SIMD.Float32x4.store(out, 12, t0);\n\n    return out;\n};\n\n/**\n * Translates a mat4 by the given vector using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to translate\n * @param {vec3} v vector to translate by\n * @returns {mat4} out\n */\nmat4.translate = glMatrix.USE_SIMD ? mat4.SIMD.translate : mat4.scalar.translate;\n\n/**\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {vec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\nmat4.scalar.scale = function(out, a, v) {\n    var x = v[0], y = v[1], z = v[2];\n\n    out[0] = a[0] * x;\n    out[1] = a[1] * x;\n    out[2] = a[2] * x;\n    out[3] = a[3] * x;\n    out[4] = a[4] * y;\n    out[5] = a[5] * y;\n    out[6] = a[6] * y;\n    out[7] = a[7] * y;\n    out[8] = a[8] * z;\n    out[9] = a[9] * z;\n    out[10] = a[10] * z;\n    out[11] = a[11] * z;\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n};\n\n/**\n * Scales the mat4 by the dimensions in the given vec3 using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {vec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\nmat4.SIMD.scale = function(out, a, v) {\n    var a0, a1, a2;\n    var vec = SIMD.Float32x4(v[0], v[1], v[2], 0);\n\n    a0 = SIMD.Float32x4.load(a, 0);\n    SIMD.Float32x4.store(\n        out, 0, SIMD.Float32x4.mul(a0, SIMD.Float32x4.swizzle(vec, 0, 0, 0, 0)));\n\n    a1 = SIMD.Float32x4.load(a, 4);\n    SIMD.Float32x4.store(\n        out, 4, SIMD.Float32x4.mul(a1, SIMD.Float32x4.swizzle(vec, 1, 1, 1, 1)));\n\n    a2 = SIMD.Float32x4.load(a, 8);\n    SIMD.Float32x4.store(\n        out, 8, SIMD.Float32x4.mul(a2, SIMD.Float32x4.swizzle(vec, 2, 2, 2, 2)));\n\n    out[12] = a[12];\n    out[13] = a[13];\n    out[14] = a[14];\n    out[15] = a[15];\n    return out;\n};\n\n/**\n * Scales the mat4 by the dimensions in the given vec3 using SIMD if available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {vec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n */\nmat4.scale = glMatrix.USE_SIMD ? mat4.SIMD.scale : mat4.scalar.scale;\n\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {vec3} axis the axis to rotate around\n * @returns {mat4} out\n */\nmat4.rotate = function (out, a, rad, axis) {\n    var x = axis[0], y = axis[1], z = axis[2],\n        len = Math.sqrt(x * x + y * y + z * z),\n        s, c, t,\n        a00, a01, a02, a03,\n        a10, a11, a12, a13,\n        a20, a21, a22, a23,\n        b00, b01, b02,\n        b10, b11, b12,\n        b20, b21, b22;\n\n    if (Math.abs(len) < glMatrix.EPSILON) { return null; }\n\n    len = 1 / len;\n    x *= len;\n    y *= len;\n    z *= len;\n\n    s = Math.sin(rad);\n    c = Math.cos(rad);\n    t = 1 - c;\n\n    a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3];\n    a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7];\n    a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11];\n\n    // Construct the elements of the rotation matrix\n    b00 = x * x * t + c; b01 = y * x * t + z * s; b02 = z * x * t - y * s;\n    b10 = x * y * t - z * s; b11 = y * y * t + c; b12 = z * y * t + x * s;\n    b20 = x * z * t + y * s; b21 = y * z * t - x * s; b22 = z * z * t + c;\n\n    // Perform rotation-specific matrix multiplication\n    out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n    out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n    out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n    out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n    out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n    out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n    out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n    out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n    out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n    out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n    out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n    out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n\n    if (a !== out) { // If the source and destination differ, copy the unchanged last row\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n    return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the X axis not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.scalar.rotateX = function (out, a, rad) {\n    var s = Math.sin(rad),\n        c = Math.cos(rad),\n        a10 = a[4],\n        a11 = a[5],\n        a12 = a[6],\n        a13 = a[7],\n        a20 = a[8],\n        a21 = a[9],\n        a22 = a[10],\n        a23 = a[11];\n\n    if (a !== out) { // If the source and destination differ, copy the unchanged rows\n        out[0]  = a[0];\n        out[1]  = a[1];\n        out[2]  = a[2];\n        out[3]  = a[3];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n\n    // Perform axis-specific matrix multiplication\n    out[4] = a10 * c + a20 * s;\n    out[5] = a11 * c + a21 * s;\n    out[6] = a12 * c + a22 * s;\n    out[7] = a13 * c + a23 * s;\n    out[8] = a20 * c - a10 * s;\n    out[9] = a21 * c - a11 * s;\n    out[10] = a22 * c - a12 * s;\n    out[11] = a23 * c - a13 * s;\n    return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the X axis using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.SIMD.rotateX = function (out, a, rad) {\n    var s = SIMD.Float32x4.splat(Math.sin(rad)),\n        c = SIMD.Float32x4.splat(Math.cos(rad));\n\n    if (a !== out) { // If the source and destination differ, copy the unchanged rows\n      out[0]  = a[0];\n      out[1]  = a[1];\n      out[2]  = a[2];\n      out[3]  = a[3];\n      out[12] = a[12];\n      out[13] = a[13];\n      out[14] = a[14];\n      out[15] = a[15];\n    }\n\n    // Perform axis-specific matrix multiplication\n    var a_1 = SIMD.Float32x4.load(a, 4);\n    var a_2 = SIMD.Float32x4.load(a, 8);\n    SIMD.Float32x4.store(out, 4,\n                         SIMD.Float32x4.add(SIMD.Float32x4.mul(a_1, c), SIMD.Float32x4.mul(a_2, s)));\n    SIMD.Float32x4.store(out, 8,\n                         SIMD.Float32x4.sub(SIMD.Float32x4.mul(a_2, c), SIMD.Float32x4.mul(a_1, s)));\n    return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the X axis using SIMD if availabe and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.rotateX = glMatrix.USE_SIMD ? mat4.SIMD.rotateX : mat4.scalar.rotateX;\n\n/**\n * Rotates a matrix by the given angle around the Y axis not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.scalar.rotateY = function (out, a, rad) {\n    var s = Math.sin(rad),\n        c = Math.cos(rad),\n        a00 = a[0],\n        a01 = a[1],\n        a02 = a[2],\n        a03 = a[3],\n        a20 = a[8],\n        a21 = a[9],\n        a22 = a[10],\n        a23 = a[11];\n\n    if (a !== out) { // If the source and destination differ, copy the unchanged rows\n        out[4]  = a[4];\n        out[5]  = a[5];\n        out[6]  = a[6];\n        out[7]  = a[7];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n\n    // Perform axis-specific matrix multiplication\n    out[0] = a00 * c - a20 * s;\n    out[1] = a01 * c - a21 * s;\n    out[2] = a02 * c - a22 * s;\n    out[3] = a03 * c - a23 * s;\n    out[8] = a00 * s + a20 * c;\n    out[9] = a01 * s + a21 * c;\n    out[10] = a02 * s + a22 * c;\n    out[11] = a03 * s + a23 * c;\n    return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the Y axis using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.SIMD.rotateY = function (out, a, rad) {\n    var s = SIMD.Float32x4.splat(Math.sin(rad)),\n        c = SIMD.Float32x4.splat(Math.cos(rad));\n\n    if (a !== out) { // If the source and destination differ, copy the unchanged rows\n        out[4]  = a[4];\n        out[5]  = a[5];\n        out[6]  = a[6];\n        out[7]  = a[7];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n\n    // Perform axis-specific matrix multiplication\n    var a_0 = SIMD.Float32x4.load(a, 0);\n    var a_2 = SIMD.Float32x4.load(a, 8);\n    SIMD.Float32x4.store(out, 0,\n                         SIMD.Float32x4.sub(SIMD.Float32x4.mul(a_0, c), SIMD.Float32x4.mul(a_2, s)));\n    SIMD.Float32x4.store(out, 8,\n                         SIMD.Float32x4.add(SIMD.Float32x4.mul(a_0, s), SIMD.Float32x4.mul(a_2, c)));\n    return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the Y axis if SIMD available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n mat4.rotateY = glMatrix.USE_SIMD ? mat4.SIMD.rotateY : mat4.scalar.rotateY;\n\n/**\n * Rotates a matrix by the given angle around the Z axis not using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.scalar.rotateZ = function (out, a, rad) {\n    var s = Math.sin(rad),\n        c = Math.cos(rad),\n        a00 = a[0],\n        a01 = a[1],\n        a02 = a[2],\n        a03 = a[3],\n        a10 = a[4],\n        a11 = a[5],\n        a12 = a[6],\n        a13 = a[7];\n\n    if (a !== out) { // If the source and destination differ, copy the unchanged last row\n        out[8]  = a[8];\n        out[9]  = a[9];\n        out[10] = a[10];\n        out[11] = a[11];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n\n    // Perform axis-specific matrix multiplication\n    out[0] = a00 * c + a10 * s;\n    out[1] = a01 * c + a11 * s;\n    out[2] = a02 * c + a12 * s;\n    out[3] = a03 * c + a13 * s;\n    out[4] = a10 * c - a00 * s;\n    out[5] = a11 * c - a01 * s;\n    out[6] = a12 * c - a02 * s;\n    out[7] = a13 * c - a03 * s;\n    return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the Z axis using SIMD\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.SIMD.rotateZ = function (out, a, rad) {\n    var s = SIMD.Float32x4.splat(Math.sin(rad)),\n        c = SIMD.Float32x4.splat(Math.cos(rad));\n\n    if (a !== out) { // If the source and destination differ, copy the unchanged last row\n        out[8]  = a[8];\n        out[9]  = a[9];\n        out[10] = a[10];\n        out[11] = a[11];\n        out[12] = a[12];\n        out[13] = a[13];\n        out[14] = a[14];\n        out[15] = a[15];\n    }\n\n    // Perform axis-specific matrix multiplication\n    var a_0 = SIMD.Float32x4.load(a, 0);\n    var a_1 = SIMD.Float32x4.load(a, 4);\n    SIMD.Float32x4.store(out, 0,\n                         SIMD.Float32x4.add(SIMD.Float32x4.mul(a_0, c), SIMD.Float32x4.mul(a_1, s)));\n    SIMD.Float32x4.store(out, 4,\n                         SIMD.Float32x4.sub(SIMD.Float32x4.mul(a_1, c), SIMD.Float32x4.mul(a_0, s)));\n    return out;\n};\n\n/**\n * Rotates a matrix by the given angle around the Z axis if SIMD available and enabled\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\n mat4.rotateZ = glMatrix.USE_SIMD ? mat4.SIMD.rotateZ : mat4.scalar.rotateZ;\n\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {vec3} v Translation vector\n * @returns {mat4} out\n */\nmat4.fromTranslation = function(out, v) {\n    out[0] = 1;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.scale(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {vec3} v Scaling vector\n * @returns {mat4} out\n */\nmat4.fromScaling = function(out, v) {\n    out[0] = v[0];\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = v[1];\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = v[2];\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from a given angle around a given axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotate(dest, dest, rad, axis);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @param {vec3} axis the axis to rotate around\n * @returns {mat4} out\n */\nmat4.fromRotation = function(out, rad, axis) {\n    var x = axis[0], y = axis[1], z = axis[2],\n        len = Math.sqrt(x * x + y * y + z * z),\n        s, c, t;\n\n    if (Math.abs(len) < glMatrix.EPSILON) { return null; }\n\n    len = 1 / len;\n    x *= len;\n    y *= len;\n    z *= len;\n\n    s = Math.sin(rad);\n    c = Math.cos(rad);\n    t = 1 - c;\n\n    // Perform rotation-specific matrix multiplication\n    out[0] = x * x * t + c;\n    out[1] = y * x * t + z * s;\n    out[2] = z * x * t - y * s;\n    out[3] = 0;\n    out[4] = x * y * t - z * s;\n    out[5] = y * y * t + c;\n    out[6] = z * y * t + x * s;\n    out[7] = 0;\n    out[8] = x * z * t + y * s;\n    out[9] = y * z * t - x * s;\n    out[10] = z * z * t + c;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from the given angle around the X axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateX(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.fromXRotation = function(out, rad) {\n    var s = Math.sin(rad),\n        c = Math.cos(rad);\n\n    // Perform axis-specific matrix multiplication\n    out[0]  = 1;\n    out[1]  = 0;\n    out[2]  = 0;\n    out[3]  = 0;\n    out[4] = 0;\n    out[5] = c;\n    out[6] = s;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = -s;\n    out[10] = c;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from the given angle around the Y axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateY(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.fromYRotation = function(out, rad) {\n    var s = Math.sin(rad),\n        c = Math.cos(rad);\n\n    // Perform axis-specific matrix multiplication\n    out[0]  = c;\n    out[1]  = 0;\n    out[2]  = -s;\n    out[3]  = 0;\n    out[4] = 0;\n    out[5] = 1;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = s;\n    out[9] = 0;\n    out[10] = c;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from the given angle around the Z axis\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.rotateZ(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nmat4.fromZRotation = function(out, rad) {\n    var s = Math.sin(rad),\n        c = Math.cos(rad);\n\n    // Perform axis-specific matrix multiplication\n    out[0]  = c;\n    out[1]  = s;\n    out[2]  = 0;\n    out[3]  = 0;\n    out[4] = -s;\n    out[5] = c;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 1;\n    out[11] = 0;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n    return out;\n}\n\n/**\n * Creates a matrix from a quaternion rotation and vector translation\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     var quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {vec3} v Translation vector\n * @returns {mat4} out\n */\nmat4.fromRotationTranslation = function (out, q, v) {\n    // Quaternion math\n    var x = q[0], y = q[1], z = q[2], w = q[3],\n        x2 = x + x,\n        y2 = y + y,\n        z2 = z + z,\n\n        xx = x * x2,\n        xy = x * y2,\n        xz = x * z2,\n        yy = y * y2,\n        yz = y * z2,\n        zz = z * z2,\n        wx = w * x2,\n        wy = w * y2,\n        wz = w * z2;\n\n    out[0] = 1 - (yy + zz);\n    out[1] = xy + wz;\n    out[2] = xz - wy;\n    out[3] = 0;\n    out[4] = xy - wz;\n    out[5] = 1 - (xx + zz);\n    out[6] = yz + wx;\n    out[7] = 0;\n    out[8] = xz + wy;\n    out[9] = yz - wx;\n    out[10] = 1 - (xx + yy);\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n\n    return out;\n};\n\n/**\n * Returns the translation vector component of a transformation\n *  matrix. If a matrix is built with fromRotationTranslation,\n *  the returned vector will be the same as the translation vector\n *  originally supplied.\n * @param  {vec3} out Vector to receive translation component\n * @param  {mat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\nmat4.getTranslation = function (out, mat) {\n  out[0] = mat[12];\n  out[1] = mat[13];\n  out[2] = mat[14];\n\n  return out;\n};\n\n/**\n * Returns a quaternion representing the rotational component\n *  of a transformation matrix. If a matrix is built with\n *  fromRotationTranslation, the returned quaternion will be the\n *  same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {mat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */\nmat4.getRotation = function (out, mat) {\n  // Algorithm taken from http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n  var trace = mat[0] + mat[5] + mat[10];\n  var S = 0;\n\n  if (trace > 0) { \n    S = Math.sqrt(trace + 1.0) * 2;\n    out[3] = 0.25 * S;\n    out[0] = (mat[6] - mat[9]) / S;\n    out[1] = (mat[8] - mat[2]) / S; \n    out[2] = (mat[1] - mat[4]) / S; \n  } else if ((mat[0] > mat[5])&(mat[0] > mat[10])) { \n    S = Math.sqrt(1.0 + mat[0] - mat[5] - mat[10]) * 2;\n    out[3] = (mat[6] - mat[9]) / S;\n    out[0] = 0.25 * S;\n    out[1] = (mat[1] + mat[4]) / S; \n    out[2] = (mat[8] + mat[2]) / S; \n  } else if (mat[5] > mat[10]) { \n    S = Math.sqrt(1.0 + mat[5] - mat[0] - mat[10]) * 2;\n    out[3] = (mat[8] - mat[2]) / S;\n    out[0] = (mat[1] + mat[4]) / S; \n    out[1] = 0.25 * S;\n    out[2] = (mat[6] + mat[9]) / S; \n  } else { \n    S = Math.sqrt(1.0 + mat[10] - mat[0] - mat[5]) * 2;\n    out[3] = (mat[1] - mat[4]) / S;\n    out[0] = (mat[8] + mat[2]) / S;\n    out[1] = (mat[6] + mat[9]) / S;\n    out[2] = 0.25 * S;\n  }\n\n  return out;\n};\n\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     var quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *     mat4.scale(dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {vec3} v Translation vector\n * @param {vec3} s Scaling vector\n * @returns {mat4} out\n */\nmat4.fromRotationTranslationScale = function (out, q, v, s) {\n    // Quaternion math\n    var x = q[0], y = q[1], z = q[2], w = q[3],\n        x2 = x + x,\n        y2 = y + y,\n        z2 = z + z,\n\n        xx = x * x2,\n        xy = x * y2,\n        xz = x * z2,\n        yy = y * y2,\n        yz = y * z2,\n        zz = z * z2,\n        wx = w * x2,\n        wy = w * y2,\n        wz = w * z2,\n        sx = s[0],\n        sy = s[1],\n        sz = s[2];\n\n    out[0] = (1 - (yy + zz)) * sx;\n    out[1] = (xy + wz) * sx;\n    out[2] = (xz - wy) * sx;\n    out[3] = 0;\n    out[4] = (xy - wz) * sy;\n    out[5] = (1 - (xx + zz)) * sy;\n    out[6] = (yz + wx) * sy;\n    out[7] = 0;\n    out[8] = (xz + wy) * sz;\n    out[9] = (yz - wx) * sz;\n    out[10] = (1 - (xx + yy)) * sz;\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n\n    return out;\n};\n\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n * This is equivalent to (but much faster than):\n *\n *     mat4.identity(dest);\n *     mat4.translate(dest, vec);\n *     mat4.translate(dest, origin);\n *     var quatMat = mat4.create();\n *     quat4.toMat4(quat, quatMat);\n *     mat4.multiply(dest, quatMat);\n *     mat4.scale(dest, scale)\n *     mat4.translate(dest, negativeOrigin);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat4} q Rotation quaternion\n * @param {vec3} v Translation vector\n * @param {vec3} s Scaling vector\n * @param {vec3} o The origin vector around which to scale and rotate\n * @returns {mat4} out\n */\nmat4.fromRotationTranslationScaleOrigin = function (out, q, v, s, o) {\n  // Quaternion math\n  var x = q[0], y = q[1], z = q[2], w = q[3],\n      x2 = x + x,\n      y2 = y + y,\n      z2 = z + z,\n\n      xx = x * x2,\n      xy = x * y2,\n      xz = x * z2,\n      yy = y * y2,\n      yz = y * z2,\n      zz = z * z2,\n      wx = w * x2,\n      wy = w * y2,\n      wz = w * z2,\n\n      sx = s[0],\n      sy = s[1],\n      sz = s[2],\n\n      ox = o[0],\n      oy = o[1],\n      oz = o[2];\n\n  out[0] = (1 - (yy + zz)) * sx;\n  out[1] = (xy + wz) * sx;\n  out[2] = (xz - wy) * sx;\n  out[3] = 0;\n  out[4] = (xy - wz) * sy;\n  out[5] = (1 - (xx + zz)) * sy;\n  out[6] = (yz + wx) * sy;\n  out[7] = 0;\n  out[8] = (xz + wy) * sz;\n  out[9] = (yz - wx) * sz;\n  out[10] = (1 - (xx + yy)) * sz;\n  out[11] = 0;\n  out[12] = v[0] + ox - (out[0] * ox + out[4] * oy + out[8] * oz);\n  out[13] = v[1] + oy - (out[1] * ox + out[5] * oy + out[9] * oz);\n  out[14] = v[2] + oz - (out[2] * ox + out[6] * oy + out[10] * oz);\n  out[15] = 1;\n\n  return out;\n};\n\n/**\n * Calculates a 4x4 matrix from the given quaternion\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat} q Quaternion to create matrix from\n *\n * @returns {mat4} out\n */\nmat4.fromQuat = function (out, q) {\n    var x = q[0], y = q[1], z = q[2], w = q[3],\n        x2 = x + x,\n        y2 = y + y,\n        z2 = z + z,\n\n        xx = x * x2,\n        yx = y * x2,\n        yy = y * y2,\n        zx = z * x2,\n        zy = z * y2,\n        zz = z * z2,\n        wx = w * x2,\n        wy = w * y2,\n        wz = w * z2;\n\n    out[0] = 1 - yy - zz;\n    out[1] = yx + wz;\n    out[2] = zx - wy;\n    out[3] = 0;\n\n    out[4] = yx - wz;\n    out[5] = 1 - xx - zz;\n    out[6] = zy + wx;\n    out[7] = 0;\n\n    out[8] = zx + wy;\n    out[9] = zy - wx;\n    out[10] = 1 - xx - yy;\n    out[11] = 0;\n\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = 0;\n    out[15] = 1;\n\n    return out;\n};\n\n/**\n * Generates a frustum matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Number} left Left bound of the frustum\n * @param {Number} right Right bound of the frustum\n * @param {Number} bottom Bottom bound of the frustum\n * @param {Number} top Top bound of the frustum\n * @param {Number} near Near bound of the frustum\n * @param {Number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.frustum = function (out, left, right, bottom, top, near, far) {\n    var rl = 1 / (right - left),\n        tb = 1 / (top - bottom),\n        nf = 1 / (near - far);\n    out[0] = (near * 2) * rl;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = (near * 2) * tb;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = (right + left) * rl;\n    out[9] = (top + bottom) * tb;\n    out[10] = (far + near) * nf;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = (far * near * 2) * nf;\n    out[15] = 0;\n    return out;\n};\n\n/**\n * Generates a perspective projection matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.perspective = function (out, fovy, aspect, near, far) {\n    var f = 1.0 / Math.tan(fovy / 2),\n        nf = 1 / (near - far);\n    out[0] = f / aspect;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = f;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = (far + near) * nf;\n    out[11] = -1;\n    out[12] = 0;\n    out[13] = 0;\n    out[14] = (2 * far * near) * nf;\n    out[15] = 0;\n    return out;\n};\n\n/**\n * Generates a perspective projection matrix with the given field of view.\n * This is primarily useful for generating projection matrices to be used\n * with the still experiemental WebVR API.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.perspectiveFromFieldOfView = function (out, fov, near, far) {\n    var upTan = Math.tan(fov.upDegrees * Math.PI/180.0),\n        downTan = Math.tan(fov.downDegrees * Math.PI/180.0),\n        leftTan = Math.tan(fov.leftDegrees * Math.PI/180.0),\n        rightTan = Math.tan(fov.rightDegrees * Math.PI/180.0),\n        xScale = 2.0 / (leftTan + rightTan),\n        yScale = 2.0 / (upTan + downTan);\n\n    out[0] = xScale;\n    out[1] = 0.0;\n    out[2] = 0.0;\n    out[3] = 0.0;\n    out[4] = 0.0;\n    out[5] = yScale;\n    out[6] = 0.0;\n    out[7] = 0.0;\n    out[8] = -((leftTan - rightTan) * xScale * 0.5);\n    out[9] = ((upTan - downTan) * yScale * 0.5);\n    out[10] = far / (near - far);\n    out[11] = -1.0;\n    out[12] = 0.0;\n    out[13] = 0.0;\n    out[14] = (far * near) / (near - far);\n    out[15] = 0.0;\n    return out;\n}\n\n/**\n * Generates a orthogonal projection matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nmat4.ortho = function (out, left, right, bottom, top, near, far) {\n    var lr = 1 / (left - right),\n        bt = 1 / (bottom - top),\n        nf = 1 / (near - far);\n    out[0] = -2 * lr;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    out[4] = 0;\n    out[5] = -2 * bt;\n    out[6] = 0;\n    out[7] = 0;\n    out[8] = 0;\n    out[9] = 0;\n    out[10] = 2 * nf;\n    out[11] = 0;\n    out[12] = (left + right) * lr;\n    out[13] = (top + bottom) * bt;\n    out[14] = (far + near) * nf;\n    out[15] = 1;\n    return out;\n};\n\n/**\n * Generates a look-at matrix with the given eye position, focal point, and up axis\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {vec3} eye Position of the viewer\n * @param {vec3} center Point the viewer is looking at\n * @param {vec3} up vec3 pointing up\n * @returns {mat4} out\n */\nmat4.lookAt = function (out, eye, center, up) {\n    var x0, x1, x2, y0, y1, y2, z0, z1, z2, len,\n        eyex = eye[0],\n        eyey = eye[1],\n        eyez = eye[2],\n        upx = up[0],\n        upy = up[1],\n        upz = up[2],\n        centerx = center[0],\n        centery = center[1],\n        centerz = center[2];\n\n    if (Math.abs(eyex - centerx) < glMatrix.EPSILON &&\n        Math.abs(eyey - centery) < glMatrix.EPSILON &&\n        Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n        return mat4.identity(out);\n    }\n\n    z0 = eyex - centerx;\n    z1 = eyey - centery;\n    z2 = eyez - centerz;\n\n    len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);\n    z0 *= len;\n    z1 *= len;\n    z2 *= len;\n\n    x0 = upy * z2 - upz * z1;\n    x1 = upz * z0 - upx * z2;\n    x2 = upx * z1 - upy * z0;\n    len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);\n    if (!len) {\n        x0 = 0;\n        x1 = 0;\n        x2 = 0;\n    } else {\n        len = 1 / len;\n        x0 *= len;\n        x1 *= len;\n        x2 *= len;\n    }\n\n    y0 = z1 * x2 - z2 * x1;\n    y1 = z2 * x0 - z0 * x2;\n    y2 = z0 * x1 - z1 * x0;\n\n    len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);\n    if (!len) {\n        y0 = 0;\n        y1 = 0;\n        y2 = 0;\n    } else {\n        len = 1 / len;\n        y0 *= len;\n        y1 *= len;\n        y2 *= len;\n    }\n\n    out[0] = x0;\n    out[1] = y0;\n    out[2] = z0;\n    out[3] = 0;\n    out[4] = x1;\n    out[5] = y1;\n    out[6] = z1;\n    out[7] = 0;\n    out[8] = x2;\n    out[9] = y2;\n    out[10] = z2;\n    out[11] = 0;\n    out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n    out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n    out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n    out[15] = 1;\n\n    return out;\n};\n\n/**\n * Returns a string representation of a mat4\n *\n * @param {mat4} mat matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nmat4.str = function (a) {\n    return 'mat4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ', ' +\n                    a[4] + ', ' + a[5] + ', ' + a[6] + ', ' + a[7] + ', ' +\n                    a[8] + ', ' + a[9] + ', ' + a[10] + ', ' + a[11] + ', ' +\n                    a[12] + ', ' + a[13] + ', ' + a[14] + ', ' + a[15] + ')';\n};\n\n/**\n * Returns Frobenius norm of a mat4\n *\n * @param {mat4} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nmat4.frob = function (a) {\n    return(Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2) + Math.pow(a[2], 2) + Math.pow(a[3], 2) + Math.pow(a[4], 2) + Math.pow(a[5], 2) + Math.pow(a[6], 2) + Math.pow(a[7], 2) + Math.pow(a[8], 2) + Math.pow(a[9], 2) + Math.pow(a[10], 2) + Math.pow(a[11], 2) + Math.pow(a[12], 2) + Math.pow(a[13], 2) + Math.pow(a[14], 2) + Math.pow(a[15], 2) ))\n};\n\n/**\n * Adds two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nmat4.add = function(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    out[4] = a[4] + b[4];\n    out[5] = a[5] + b[5];\n    out[6] = a[6] + b[6];\n    out[7] = a[7] + b[7];\n    out[8] = a[8] + b[8];\n    out[9] = a[9] + b[9];\n    out[10] = a[10] + b[10];\n    out[11] = a[11] + b[11];\n    out[12] = a[12] + b[12];\n    out[13] = a[13] + b[13];\n    out[14] = a[14] + b[14];\n    out[15] = a[15] + b[15];\n    return out;\n};\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @returns {mat4} out\n */\nmat4.subtract = function(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    out[4] = a[4] - b[4];\n    out[5] = a[5] - b[5];\n    out[6] = a[6] - b[6];\n    out[7] = a[7] - b[7];\n    out[8] = a[8] - b[8];\n    out[9] = a[9] - b[9];\n    out[10] = a[10] - b[10];\n    out[11] = a[11] - b[11];\n    out[12] = a[12] - b[12];\n    out[13] = a[13] - b[13];\n    out[14] = a[14] - b[14];\n    out[15] = a[15] - b[15];\n    return out;\n};\n\n/**\n * Alias for {@link mat4.subtract}\n * @function\n */\nmat4.sub = mat4.subtract;\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat4} out the receiving matrix\n * @param {mat4} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat4} out\n */\nmat4.multiplyScalar = function(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    out[4] = a[4] * b;\n    out[5] = a[5] * b;\n    out[6] = a[6] * b;\n    out[7] = a[7] * b;\n    out[8] = a[8] * b;\n    out[9] = a[9] * b;\n    out[10] = a[10] * b;\n    out[11] = a[11] * b;\n    out[12] = a[12] * b;\n    out[13] = a[13] * b;\n    out[14] = a[14] * b;\n    out[15] = a[15] * b;\n    return out;\n};\n\n/**\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat4} out the receiving vector\n * @param {mat4} a the first operand\n * @param {mat4} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat4} out\n */\nmat4.multiplyScalarAndAdd = function(out, a, b, scale) {\n    out[0] = a[0] + (b[0] * scale);\n    out[1] = a[1] + (b[1] * scale);\n    out[2] = a[2] + (b[2] * scale);\n    out[3] = a[3] + (b[3] * scale);\n    out[4] = a[4] + (b[4] * scale);\n    out[5] = a[5] + (b[5] * scale);\n    out[6] = a[6] + (b[6] * scale);\n    out[7] = a[7] + (b[7] * scale);\n    out[8] = a[8] + (b[8] * scale);\n    out[9] = a[9] + (b[9] * scale);\n    out[10] = a[10] + (b[10] * scale);\n    out[11] = a[11] + (b[11] * scale);\n    out[12] = a[12] + (b[12] * scale);\n    out[13] = a[13] + (b[13] * scale);\n    out[14] = a[14] + (b[14] * scale);\n    out[15] = a[15] + (b[15] * scale);\n    return out;\n};\n\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {mat4} a The first matrix.\n * @param {mat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat4.exactEquals = function (a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && \n           a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && \n           a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] &&\n           a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n};\n\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {mat4} a The first matrix.\n * @param {mat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nmat4.equals = function (a, b) {\n    var a0  = a[0],  a1  = a[1],  a2  = a[2],  a3  = a[3],\n        a4  = a[4],  a5  = a[5],  a6  = a[6],  a7  = a[7], \n        a8  = a[8],  a9  = a[9],  a10 = a[10], a11 = a[11], \n        a12 = a[12], a13 = a[13], a14 = a[14], a15 = a[15];\n\n    var b0  = b[0],  b1  = b[1],  b2  = b[2],  b3  = b[3],\n        b4  = b[4],  b5  = b[5],  b6  = b[6],  b7  = b[7], \n        b8  = b[8],  b9  = b[9],  b10 = b[10], b11 = b[11], \n        b12 = b[12], b13 = b[13], b14 = b[14], b15 = b[15];\n\n    return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n            Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n            Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n            Math.abs(a3 - b3) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a3), Math.abs(b3)) &&\n            Math.abs(a4 - b4) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a4), Math.abs(b4)) &&\n            Math.abs(a5 - b5) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a5), Math.abs(b5)) &&\n            Math.abs(a6 - b6) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a6), Math.abs(b6)) &&\n            Math.abs(a7 - b7) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a7), Math.abs(b7)) &&\n            Math.abs(a8 - b8) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a8), Math.abs(b8)) &&\n            Math.abs(a9 - b9) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a9), Math.abs(b9)) &&\n            Math.abs(a10 - b10) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a10), Math.abs(b10)) &&\n            Math.abs(a11 - b11) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a11), Math.abs(b11)) &&\n            Math.abs(a12 - b12) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a12), Math.abs(b12)) &&\n            Math.abs(a13 - b13) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a13), Math.abs(b13)) &&\n            Math.abs(a14 - b14) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a14), Math.abs(b14)) &&\n            Math.abs(a15 - b15) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a15), Math.abs(b15)));\n};\n\n\n\nmodule.exports = mat4;\n\n},{\"./common.js\":87}],92:[function(require,module,exports){\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\nvar mat3 = require(\"./mat3.js\");\nvar vec3 = require(\"./vec3.js\");\nvar vec4 = require(\"./vec4.js\");\n\n/**\n * @class Quaternion\n * @name quat\n */\nvar quat = {};\n\n/**\n * Creates a new identity quat\n *\n * @returns {quat} a new quaternion\n */\nquat.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(4);\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    return out;\n};\n\n/**\n * Sets a quaternion to represent the shortest rotation from one\n * vector to another.\n *\n * Both vectors are assumed to be unit length.\n *\n * @param {quat} out the receiving quaternion.\n * @param {vec3} a the initial vector\n * @param {vec3} b the destination vector\n * @returns {quat} out\n */\nquat.rotationTo = (function() {\n    var tmpvec3 = vec3.create();\n    var xUnitVec3 = vec3.fromValues(1,0,0);\n    var yUnitVec3 = vec3.fromValues(0,1,0);\n\n    return function(out, a, b) {\n        var dot = vec3.dot(a, b);\n        if (dot < -0.999999) {\n            vec3.cross(tmpvec3, xUnitVec3, a);\n            if (vec3.length(tmpvec3) < 0.000001)\n                vec3.cross(tmpvec3, yUnitVec3, a);\n            vec3.normalize(tmpvec3, tmpvec3);\n            quat.setAxisAngle(out, tmpvec3, Math.PI);\n            return out;\n        } else if (dot > 0.999999) {\n            out[0] = 0;\n            out[1] = 0;\n            out[2] = 0;\n            out[3] = 1;\n            return out;\n        } else {\n            vec3.cross(tmpvec3, a, b);\n            out[0] = tmpvec3[0];\n            out[1] = tmpvec3[1];\n            out[2] = tmpvec3[2];\n            out[3] = 1 + dot;\n            return quat.normalize(out, out);\n        }\n    };\n})();\n\n/**\n * Sets the specified quaternion with values corresponding to the given\n * axes. Each axis is a vec3 and is expected to be unit length and\n * perpendicular to all other specified axes.\n *\n * @param {vec3} view  the vector representing the viewing direction\n * @param {vec3} right the vector representing the local \"right\" direction\n * @param {vec3} up    the vector representing the local \"up\" direction\n * @returns {quat} out\n */\nquat.setAxes = (function() {\n    var matr = mat3.create();\n\n    return function(out, view, right, up) {\n        matr[0] = right[0];\n        matr[3] = right[1];\n        matr[6] = right[2];\n\n        matr[1] = up[0];\n        matr[4] = up[1];\n        matr[7] = up[2];\n\n        matr[2] = -view[0];\n        matr[5] = -view[1];\n        matr[8] = -view[2];\n\n        return quat.normalize(out, quat.fromMat3(out, matr));\n    };\n})();\n\n/**\n * Creates a new quat initialized with values from an existing quaternion\n *\n * @param {quat} a quaternion to clone\n * @returns {quat} a new quaternion\n * @function\n */\nquat.clone = vec4.clone;\n\n/**\n * Creates a new quat initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} a new quaternion\n * @function\n */\nquat.fromValues = vec4.fromValues;\n\n/**\n * Copy the values from one quat to another\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the source quaternion\n * @returns {quat} out\n * @function\n */\nquat.copy = vec4.copy;\n\n/**\n * Set the components of a quat to the given values\n *\n * @param {quat} out the receiving quaternion\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {quat} out\n * @function\n */\nquat.set = vec4.set;\n\n/**\n * Set a quat to the identity quaternion\n *\n * @param {quat} out the receiving quaternion\n * @returns {quat} out\n */\nquat.identity = function(out) {\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 1;\n    return out;\n};\n\n/**\n * Sets a quat from the given angle and rotation axis,\n * then returns it.\n *\n * @param {quat} out the receiving quaternion\n * @param {vec3} axis the axis around which to rotate\n * @param {Number} rad the angle in radians\n * @returns {quat} out\n **/\nquat.setAxisAngle = function(out, axis, rad) {\n    rad = rad * 0.5;\n    var s = Math.sin(rad);\n    out[0] = s * axis[0];\n    out[1] = s * axis[1];\n    out[2] = s * axis[2];\n    out[3] = Math.cos(rad);\n    return out;\n};\n\n/**\n * Gets the rotation axis and angle for a given\n *  quaternion. If a quaternion is created with\n *  setAxisAngle, this method will return the same\n *  values as providied in the original parameter list\n *  OR functionally equivalent values.\n * Example: The quaternion formed by axis [0, 0, 1] and\n *  angle -90 is the same as the quaternion formed by\n *  [0, 0, 1] and 270. This method favors the latter.\n * @param  {vec3} out_axis  Vector receiving the axis of rotation\n * @param  {quat} q     Quaternion to be decomposed\n * @return {Number}     Angle, in radians, of the rotation\n */\nquat.getAxisAngle = function(out_axis, q) {\n    var rad = Math.acos(q[3]) * 2.0;\n    var s = Math.sin(rad / 2.0);\n    if (s != 0.0) {\n        out_axis[0] = q[0] / s;\n        out_axis[1] = q[1] / s;\n        out_axis[2] = q[2] / s;\n    } else {\n        // If s is zero, return any axis (no rotation - axis does not matter)\n        out_axis[0] = 1;\n        out_axis[1] = 0;\n        out_axis[2] = 0;\n    }\n    return rad;\n};\n\n/**\n * Adds two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {quat} out\n * @function\n */\nquat.add = vec4.add;\n\n/**\n * Multiplies two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {quat} out\n */\nquat.multiply = function(out, a, b) {\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n        bx = b[0], by = b[1], bz = b[2], bw = b[3];\n\n    out[0] = ax * bw + aw * bx + ay * bz - az * by;\n    out[1] = ay * bw + aw * by + az * bx - ax * bz;\n    out[2] = az * bw + aw * bz + ax * by - ay * bx;\n    out[3] = aw * bw - ax * bx - ay * by - az * bz;\n    return out;\n};\n\n/**\n * Alias for {@link quat.multiply}\n * @function\n */\nquat.mul = quat.multiply;\n\n/**\n * Scales a quat by a scalar number\n *\n * @param {quat} out the receiving vector\n * @param {quat} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {quat} out\n * @function\n */\nquat.scale = vec4.scale;\n\n/**\n * Rotates a quaternion by the given angle about the X axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nquat.rotateX = function (out, a, rad) {\n    rad *= 0.5; \n\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n        bx = Math.sin(rad), bw = Math.cos(rad);\n\n    out[0] = ax * bw + aw * bx;\n    out[1] = ay * bw + az * bx;\n    out[2] = az * bw - ay * bx;\n    out[3] = aw * bw - ax * bx;\n    return out;\n};\n\n/**\n * Rotates a quaternion by the given angle about the Y axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nquat.rotateY = function (out, a, rad) {\n    rad *= 0.5; \n\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n        by = Math.sin(rad), bw = Math.cos(rad);\n\n    out[0] = ax * bw - az * by;\n    out[1] = ay * bw + aw * by;\n    out[2] = az * bw + ax * by;\n    out[3] = aw * bw - ay * by;\n    return out;\n};\n\n/**\n * Rotates a quaternion by the given angle about the Z axis\n *\n * @param {quat} out quat receiving operation result\n * @param {quat} a quat to rotate\n * @param {number} rad angle (in radians) to rotate\n * @returns {quat} out\n */\nquat.rotateZ = function (out, a, rad) {\n    rad *= 0.5; \n\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n        bz = Math.sin(rad), bw = Math.cos(rad);\n\n    out[0] = ax * bw + ay * bz;\n    out[1] = ay * bw - ax * bz;\n    out[2] = az * bw + aw * bz;\n    out[3] = aw * bw - az * bz;\n    return out;\n};\n\n/**\n * Calculates the W component of a quat from the X, Y, and Z components.\n * Assumes that quaternion is 1 unit in length.\n * Any existing W component will be ignored.\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate W component of\n * @returns {quat} out\n */\nquat.calculateW = function (out, a) {\n    var x = a[0], y = a[1], z = a[2];\n\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    out[3] = Math.sqrt(Math.abs(1.0 - x * x - y * y - z * z));\n    return out;\n};\n\n/**\n * Calculates the dot product of two quat's\n *\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @returns {Number} dot product of a and b\n * @function\n */\nquat.dot = vec4.dot;\n\n/**\n * Performs a linear interpolation between two quat's\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {quat} out\n * @function\n */\nquat.lerp = vec4.lerp;\n\n/**\n * Performs a spherical linear interpolation between two quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {quat} out\n */\nquat.slerp = function (out, a, b, t) {\n    // benchmarks:\n    //    http://jsperf.com/quaternion-slerp-implementations\n\n    var ax = a[0], ay = a[1], az = a[2], aw = a[3],\n        bx = b[0], by = b[1], bz = b[2], bw = b[3];\n\n    var        omega, cosom, sinom, scale0, scale1;\n\n    // calc cosine\n    cosom = ax * bx + ay * by + az * bz + aw * bw;\n    // adjust signs (if necessary)\n    if ( cosom < 0.0 ) {\n        cosom = -cosom;\n        bx = - bx;\n        by = - by;\n        bz = - bz;\n        bw = - bw;\n    }\n    // calculate coefficients\n    if ( (1.0 - cosom) > 0.000001 ) {\n        // standard case (slerp)\n        omega  = Math.acos(cosom);\n        sinom  = Math.sin(omega);\n        scale0 = Math.sin((1.0 - t) * omega) / sinom;\n        scale1 = Math.sin(t * omega) / sinom;\n    } else {        \n        // \"from\" and \"to\" quaternions are very close \n        //  ... so we can do a linear interpolation\n        scale0 = 1.0 - t;\n        scale1 = t;\n    }\n    // calculate final values\n    out[0] = scale0 * ax + scale1 * bx;\n    out[1] = scale0 * ay + scale1 * by;\n    out[2] = scale0 * az + scale1 * bz;\n    out[3] = scale0 * aw + scale1 * bw;\n    \n    return out;\n};\n\n/**\n * Performs a spherical linear interpolation with two control points\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a the first operand\n * @param {quat} b the second operand\n * @param {quat} c the third operand\n * @param {quat} d the fourth operand\n * @param {Number} t interpolation amount\n * @returns {quat} out\n */\nquat.sqlerp = (function () {\n  var temp1 = quat.create();\n  var temp2 = quat.create();\n  \n  return function (out, a, b, c, d, t) {\n    quat.slerp(temp1, a, d, t);\n    quat.slerp(temp2, b, c, t);\n    quat.slerp(out, temp1, temp2, 2 * t * (1 - t));\n    \n    return out;\n  };\n}());\n\n/**\n * Calculates the inverse of a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate inverse of\n * @returns {quat} out\n */\nquat.invert = function(out, a) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3],\n        dot = a0*a0 + a1*a1 + a2*a2 + a3*a3,\n        invDot = dot ? 1.0/dot : 0;\n    \n    // TODO: Would be faster to return [0,0,0,0] immediately if dot == 0\n\n    out[0] = -a0*invDot;\n    out[1] = -a1*invDot;\n    out[2] = -a2*invDot;\n    out[3] = a3*invDot;\n    return out;\n};\n\n/**\n * Calculates the conjugate of a quat\n * If the quaternion is normalized, this function is faster than quat.inverse and produces the same result.\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quat to calculate conjugate of\n * @returns {quat} out\n */\nquat.conjugate = function (out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    out[3] = a[3];\n    return out;\n};\n\n/**\n * Calculates the length of a quat\n *\n * @param {quat} a vector to calculate length of\n * @returns {Number} length of a\n * @function\n */\nquat.length = vec4.length;\n\n/**\n * Alias for {@link quat.length}\n * @function\n */\nquat.len = quat.length;\n\n/**\n * Calculates the squared length of a quat\n *\n * @param {quat} a vector to calculate squared length of\n * @returns {Number} squared length of a\n * @function\n */\nquat.squaredLength = vec4.squaredLength;\n\n/**\n * Alias for {@link quat.squaredLength}\n * @function\n */\nquat.sqrLen = quat.squaredLength;\n\n/**\n * Normalize a quat\n *\n * @param {quat} out the receiving quaternion\n * @param {quat} a quaternion to normalize\n * @returns {quat} out\n * @function\n */\nquat.normalize = vec4.normalize;\n\n/**\n * Creates a quaternion from the given 3x3 rotation matrix.\n *\n * NOTE: The resultant quaternion is not normalized, so you should be sure\n * to renormalize the quaternion yourself where necessary.\n *\n * @param {quat} out the receiving quaternion\n * @param {mat3} m rotation matrix\n * @returns {quat} out\n * @function\n */\nquat.fromMat3 = function(out, m) {\n    // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n    // article \"Quaternion Calculus and Fast Animation\".\n    var fTrace = m[0] + m[4] + m[8];\n    var fRoot;\n\n    if ( fTrace > 0.0 ) {\n        // |w| > 1/2, may as well choose w > 1/2\n        fRoot = Math.sqrt(fTrace + 1.0);  // 2w\n        out[3] = 0.5 * fRoot;\n        fRoot = 0.5/fRoot;  // 1/(4w)\n        out[0] = (m[5]-m[7])*fRoot;\n        out[1] = (m[6]-m[2])*fRoot;\n        out[2] = (m[1]-m[3])*fRoot;\n    } else {\n        // |w| <= 1/2\n        var i = 0;\n        if ( m[4] > m[0] )\n          i = 1;\n        if ( m[8] > m[i*3+i] )\n          i = 2;\n        var j = (i+1)%3;\n        var k = (i+2)%3;\n        \n        fRoot = Math.sqrt(m[i*3+i]-m[j*3+j]-m[k*3+k] + 1.0);\n        out[i] = 0.5 * fRoot;\n        fRoot = 0.5 / fRoot;\n        out[3] = (m[j*3+k] - m[k*3+j]) * fRoot;\n        out[j] = (m[j*3+i] + m[i*3+j]) * fRoot;\n        out[k] = (m[k*3+i] + m[i*3+k]) * fRoot;\n    }\n    \n    return out;\n};\n\n/**\n * Returns a string representation of a quatenion\n *\n * @param {quat} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nquat.str = function (a) {\n    return 'quat(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';\n};\n\n/**\n * Returns whether or not the quaternions have exactly the same elements in the same position (when compared with ===)\n *\n * @param {quat} a The first quaternion.\n * @param {quat} b The second quaternion.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nquat.exactEquals = vec4.exactEquals;\n\n/**\n * Returns whether or not the quaternions have approximately the same elements in the same position.\n *\n * @param {quat} a The first vector.\n * @param {quat} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nquat.equals = vec4.equals;\n\nmodule.exports = quat;\n\n},{\"./common.js\":87,\"./mat3.js\":90,\"./vec3.js\":94,\"./vec4.js\":95}],93:[function(require,module,exports){\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\n\n/**\n * @class 2 Dimensional Vector\n * @name vec2\n */\nvar vec2 = {};\n\n/**\n * Creates a new, empty vec2\n *\n * @returns {vec2} a new 2D vector\n */\nvec2.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(2);\n    out[0] = 0;\n    out[1] = 0;\n    return out;\n};\n\n/**\n * Creates a new vec2 initialized with values from an existing vector\n *\n * @param {vec2} a vector to clone\n * @returns {vec2} a new 2D vector\n */\nvec2.clone = function(a) {\n    var out = new glMatrix.ARRAY_TYPE(2);\n    out[0] = a[0];\n    out[1] = a[1];\n    return out;\n};\n\n/**\n * Creates a new vec2 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} a new 2D vector\n */\nvec2.fromValues = function(x, y) {\n    var out = new glMatrix.ARRAY_TYPE(2);\n    out[0] = x;\n    out[1] = y;\n    return out;\n};\n\n/**\n * Copy the values from one vec2 to another\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the source vector\n * @returns {vec2} out\n */\nvec2.copy = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    return out;\n};\n\n/**\n * Set the components of a vec2 to the given values\n *\n * @param {vec2} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @returns {vec2} out\n */\nvec2.set = function(out, x, y) {\n    out[0] = x;\n    out[1] = y;\n    return out;\n};\n\n/**\n * Adds two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.add = function(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    return out;\n};\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.subtract = function(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    return out;\n};\n\n/**\n * Alias for {@link vec2.subtract}\n * @function\n */\nvec2.sub = vec2.subtract;\n\n/**\n * Multiplies two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.multiply = function(out, a, b) {\n    out[0] = a[0] * b[0];\n    out[1] = a[1] * b[1];\n    return out;\n};\n\n/**\n * Alias for {@link vec2.multiply}\n * @function\n */\nvec2.mul = vec2.multiply;\n\n/**\n * Divides two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.divide = function(out, a, b) {\n    out[0] = a[0] / b[0];\n    out[1] = a[1] / b[1];\n    return out;\n};\n\n/**\n * Alias for {@link vec2.divide}\n * @function\n */\nvec2.div = vec2.divide;\n\n/**\n * Math.ceil the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to ceil\n * @returns {vec2} out\n */\nvec2.ceil = function (out, a) {\n    out[0] = Math.ceil(a[0]);\n    out[1] = Math.ceil(a[1]);\n    return out;\n};\n\n/**\n * Math.floor the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to floor\n * @returns {vec2} out\n */\nvec2.floor = function (out, a) {\n    out[0] = Math.floor(a[0]);\n    out[1] = Math.floor(a[1]);\n    return out;\n};\n\n/**\n * Returns the minimum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.min = function(out, a, b) {\n    out[0] = Math.min(a[0], b[0]);\n    out[1] = Math.min(a[1], b[1]);\n    return out;\n};\n\n/**\n * Returns the maximum of two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec2} out\n */\nvec2.max = function(out, a, b) {\n    out[0] = Math.max(a[0], b[0]);\n    out[1] = Math.max(a[1], b[1]);\n    return out;\n};\n\n/**\n * Math.round the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to round\n * @returns {vec2} out\n */\nvec2.round = function (out, a) {\n    out[0] = Math.round(a[0]);\n    out[1] = Math.round(a[1]);\n    return out;\n};\n\n/**\n * Scales a vec2 by a scalar number\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec2} out\n */\nvec2.scale = function(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    return out;\n};\n\n/**\n * Adds two vec2's after scaling the second operand by a scalar value\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec2} out\n */\nvec2.scaleAndAdd = function(out, a, b, scale) {\n    out[0] = a[0] + (b[0] * scale);\n    out[1] = a[1] + (b[1] * scale);\n    return out;\n};\n\n/**\n * Calculates the euclidian distance between two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} distance between a and b\n */\nvec2.distance = function(a, b) {\n    var x = b[0] - a[0],\n        y = b[1] - a[1];\n    return Math.sqrt(x*x + y*y);\n};\n\n/**\n * Alias for {@link vec2.distance}\n * @function\n */\nvec2.dist = vec2.distance;\n\n/**\n * Calculates the squared euclidian distance between two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} squared distance between a and b\n */\nvec2.squaredDistance = function(a, b) {\n    var x = b[0] - a[0],\n        y = b[1] - a[1];\n    return x*x + y*y;\n};\n\n/**\n * Alias for {@link vec2.squaredDistance}\n * @function\n */\nvec2.sqrDist = vec2.squaredDistance;\n\n/**\n * Calculates the length of a vec2\n *\n * @param {vec2} a vector to calculate length of\n * @returns {Number} length of a\n */\nvec2.length = function (a) {\n    var x = a[0],\n        y = a[1];\n    return Math.sqrt(x*x + y*y);\n};\n\n/**\n * Alias for {@link vec2.length}\n * @function\n */\nvec2.len = vec2.length;\n\n/**\n * Calculates the squared length of a vec2\n *\n * @param {vec2} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nvec2.squaredLength = function (a) {\n    var x = a[0],\n        y = a[1];\n    return x*x + y*y;\n};\n\n/**\n * Alias for {@link vec2.squaredLength}\n * @function\n */\nvec2.sqrLen = vec2.squaredLength;\n\n/**\n * Negates the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to negate\n * @returns {vec2} out\n */\nvec2.negate = function(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    return out;\n};\n\n/**\n * Returns the inverse of the components of a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to invert\n * @returns {vec2} out\n */\nvec2.inverse = function(out, a) {\n  out[0] = 1.0 / a[0];\n  out[1] = 1.0 / a[1];\n  return out;\n};\n\n/**\n * Normalize a vec2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a vector to normalize\n * @returns {vec2} out\n */\nvec2.normalize = function(out, a) {\n    var x = a[0],\n        y = a[1];\n    var len = x*x + y*y;\n    if (len > 0) {\n        //TODO: evaluate use of glm_invsqrt here?\n        len = 1 / Math.sqrt(len);\n        out[0] = a[0] * len;\n        out[1] = a[1] * len;\n    }\n    return out;\n};\n\n/**\n * Calculates the dot product of two vec2's\n *\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {Number} dot product of a and b\n */\nvec2.dot = function (a, b) {\n    return a[0] * b[0] + a[1] * b[1];\n};\n\n/**\n * Computes the cross product of two vec2's\n * Note that the cross product must by definition produce a 3D vector\n *\n * @param {vec3} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @returns {vec3} out\n */\nvec2.cross = function(out, a, b) {\n    var z = a[0] * b[1] - a[1] * b[0];\n    out[0] = out[1] = 0;\n    out[2] = z;\n    return out;\n};\n\n/**\n * Performs a linear interpolation between two vec2's\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the first operand\n * @param {vec2} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec2} out\n */\nvec2.lerp = function (out, a, b, t) {\n    var ax = a[0],\n        ay = a[1];\n    out[0] = ax + t * (b[0] - ax);\n    out[1] = ay + t * (b[1] - ay);\n    return out;\n};\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec2} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec2} out\n */\nvec2.random = function (out, scale) {\n    scale = scale || 1.0;\n    var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n    out[0] = Math.cos(r) * scale;\n    out[1] = Math.sin(r) * scale;\n    return out;\n};\n\n/**\n * Transforms the vec2 with a mat2\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat2} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat2 = function(out, a, m) {\n    var x = a[0],\n        y = a[1];\n    out[0] = m[0] * x + m[2] * y;\n    out[1] = m[1] * x + m[3] * y;\n    return out;\n};\n\n/**\n * Transforms the vec2 with a mat2d\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat2d} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat2d = function(out, a, m) {\n    var x = a[0],\n        y = a[1];\n    out[0] = m[0] * x + m[2] * y + m[4];\n    out[1] = m[1] * x + m[3] * y + m[5];\n    return out;\n};\n\n/**\n * Transforms the vec2 with a mat3\n * 3rd vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat3} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat3 = function(out, a, m) {\n    var x = a[0],\n        y = a[1];\n    out[0] = m[0] * x + m[3] * y + m[6];\n    out[1] = m[1] * x + m[4] * y + m[7];\n    return out;\n};\n\n/**\n * Transforms the vec2 with a mat4\n * 3rd vector component is implicitly '0'\n * 4th vector component is implicitly '1'\n *\n * @param {vec2} out the receiving vector\n * @param {vec2} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec2} out\n */\nvec2.transformMat4 = function(out, a, m) {\n    var x = a[0], \n        y = a[1];\n    out[0] = m[0] * x + m[4] * y + m[12];\n    out[1] = m[1] * x + m[5] * y + m[13];\n    return out;\n};\n\n/**\n * Perform some operation over an array of vec2s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nvec2.forEach = (function() {\n    var vec = vec2.create();\n\n    return function(a, stride, offset, count, fn, arg) {\n        var i, l;\n        if(!stride) {\n            stride = 2;\n        }\n\n        if(!offset) {\n            offset = 0;\n        }\n        \n        if(count) {\n            l = Math.min((count * stride) + offset, a.length);\n        } else {\n            l = a.length;\n        }\n\n        for(i = offset; i < l; i += stride) {\n            vec[0] = a[i]; vec[1] = a[i+1];\n            fn(vec, vec, arg);\n            a[i] = vec[0]; a[i+1] = vec[1];\n        }\n        \n        return a;\n    };\n})();\n\n/**\n * Returns a string representation of a vector\n *\n * @param {vec2} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nvec2.str = function (a) {\n    return 'vec2(' + a[0] + ', ' + a[1] + ')';\n};\n\n/**\n * Returns whether or not the vectors exactly have the same elements in the same position (when compared with ===)\n *\n * @param {vec2} a The first vector.\n * @param {vec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec2.exactEquals = function (a, b) {\n    return a[0] === b[0] && a[1] === b[1];\n};\n\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {vec2} a The first vector.\n * @param {vec2} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec2.equals = function (a, b) {\n    var a0 = a[0], a1 = a[1];\n    var b0 = b[0], b1 = b[1];\n    return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n            Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)));\n};\n\nmodule.exports = vec2;\n\n},{\"./common.js\":87}],94:[function(require,module,exports){\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\n\n/**\n * @class 3 Dimensional Vector\n * @name vec3\n */\nvar vec3 = {};\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\nvec3.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(3);\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n    return out;\n};\n\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {vec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\nvec3.clone = function(a) {\n    var out = new glMatrix.ARRAY_TYPE(3);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    return out;\n};\n\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\nvec3.fromValues = function(x, y, z) {\n    var out = new glMatrix.ARRAY_TYPE(3);\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    return out;\n};\n\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the source vector\n * @returns {vec3} out\n */\nvec3.copy = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    return out;\n};\n\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\nvec3.set = function(out, x, y, z) {\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    return out;\n};\n\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.add = function(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    return out;\n};\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.subtract = function(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    return out;\n};\n\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\nvec3.sub = vec3.subtract;\n\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.multiply = function(out, a, b) {\n    out[0] = a[0] * b[0];\n    out[1] = a[1] * b[1];\n    out[2] = a[2] * b[2];\n    return out;\n};\n\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\nvec3.mul = vec3.multiply;\n\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.divide = function(out, a, b) {\n    out[0] = a[0] / b[0];\n    out[1] = a[1] / b[1];\n    out[2] = a[2] / b[2];\n    return out;\n};\n\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\nvec3.div = vec3.divide;\n\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to ceil\n * @returns {vec3} out\n */\nvec3.ceil = function (out, a) {\n    out[0] = Math.ceil(a[0]);\n    out[1] = Math.ceil(a[1]);\n    out[2] = Math.ceil(a[2]);\n    return out;\n};\n\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to floor\n * @returns {vec3} out\n */\nvec3.floor = function (out, a) {\n    out[0] = Math.floor(a[0]);\n    out[1] = Math.floor(a[1]);\n    out[2] = Math.floor(a[2]);\n    return out;\n};\n\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.min = function(out, a, b) {\n    out[0] = Math.min(a[0], b[0]);\n    out[1] = Math.min(a[1], b[1]);\n    out[2] = Math.min(a[2], b[2]);\n    return out;\n};\n\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.max = function(out, a, b) {\n    out[0] = Math.max(a[0], b[0]);\n    out[1] = Math.max(a[1], b[1]);\n    out[2] = Math.max(a[2], b[2]);\n    return out;\n};\n\n/**\n * Math.round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to round\n * @returns {vec3} out\n */\nvec3.round = function (out, a) {\n    out[0] = Math.round(a[0]);\n    out[1] = Math.round(a[1]);\n    out[2] = Math.round(a[2]);\n    return out;\n};\n\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\nvec3.scale = function(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    return out;\n};\n\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\nvec3.scaleAndAdd = function(out, a, b, scale) {\n    out[0] = a[0] + (b[0] * scale);\n    out[1] = a[1] + (b[1] * scale);\n    out[2] = a[2] + (b[2] * scale);\n    return out;\n};\n\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} distance between a and b\n */\nvec3.distance = function(a, b) {\n    var x = b[0] - a[0],\n        y = b[1] - a[1],\n        z = b[2] - a[2];\n    return Math.sqrt(x*x + y*y + z*z);\n};\n\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\nvec3.dist = vec3.distance;\n\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\nvec3.squaredDistance = function(a, b) {\n    var x = b[0] - a[0],\n        y = b[1] - a[1],\n        z = b[2] - a[2];\n    return x*x + y*y + z*z;\n};\n\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\nvec3.sqrDist = vec3.squaredDistance;\n\n/**\n * Calculates the length of a vec3\n *\n * @param {vec3} a vector to calculate length of\n * @returns {Number} length of a\n */\nvec3.length = function (a) {\n    var x = a[0],\n        y = a[1],\n        z = a[2];\n    return Math.sqrt(x*x + y*y + z*z);\n};\n\n/**\n * Alias for {@link vec3.length}\n * @function\n */\nvec3.len = vec3.length;\n\n/**\n * Calculates the squared length of a vec3\n *\n * @param {vec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nvec3.squaredLength = function (a) {\n    var x = a[0],\n        y = a[1],\n        z = a[2];\n    return x*x + y*y + z*z;\n};\n\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\nvec3.sqrLen = vec3.squaredLength;\n\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to negate\n * @returns {vec3} out\n */\nvec3.negate = function(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    return out;\n};\n\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to invert\n * @returns {vec3} out\n */\nvec3.inverse = function(out, a) {\n  out[0] = 1.0 / a[0];\n  out[1] = 1.0 / a[1];\n  out[2] = 1.0 / a[2];\n  return out;\n};\n\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a vector to normalize\n * @returns {vec3} out\n */\nvec3.normalize = function(out, a) {\n    var x = a[0],\n        y = a[1],\n        z = a[2];\n    var len = x*x + y*y + z*z;\n    if (len > 0) {\n        //TODO: evaluate use of glm_invsqrt here?\n        len = 1 / Math.sqrt(len);\n        out[0] = a[0] * len;\n        out[1] = a[1] * len;\n        out[2] = a[2] * len;\n    }\n    return out;\n};\n\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {Number} dot product of a and b\n */\nvec3.dot = function (a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n};\n\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @returns {vec3} out\n */\nvec3.cross = function(out, a, b) {\n    var ax = a[0], ay = a[1], az = a[2],\n        bx = b[0], by = b[1], bz = b[2];\n\n    out[0] = ay * bz - az * by;\n    out[1] = az * bx - ax * bz;\n    out[2] = ax * by - ay * bx;\n    return out;\n};\n\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec3} out\n */\nvec3.lerp = function (out, a, b, t) {\n    var ax = a[0],\n        ay = a[1],\n        az = a[2];\n    out[0] = ax + t * (b[0] - ax);\n    out[1] = ay + t * (b[1] - ay);\n    out[2] = az + t * (b[2] - az);\n    return out;\n};\n\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {vec3} c the third operand\n * @param {vec3} d the fourth operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec3} out\n */\nvec3.hermite = function (out, a, b, c, d, t) {\n  var factorTimes2 = t * t,\n      factor1 = factorTimes2 * (2 * t - 3) + 1,\n      factor2 = factorTimes2 * (t - 2) + t,\n      factor3 = factorTimes2 * (t - 1),\n      factor4 = factorTimes2 * (3 - 2 * t);\n  \n  out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n  out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n  out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n  \n  return out;\n};\n\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the first operand\n * @param {vec3} b the second operand\n * @param {vec3} c the third operand\n * @param {vec3} d the fourth operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec3} out\n */\nvec3.bezier = function (out, a, b, c, d, t) {\n  var inverseFactor = 1 - t,\n      inverseFactorTimesTwo = inverseFactor * inverseFactor,\n      factorTimes2 = t * t,\n      factor1 = inverseFactorTimesTwo * inverseFactor,\n      factor2 = 3 * t * inverseFactorTimesTwo,\n      factor3 = 3 * factorTimes2 * inverseFactor,\n      factor4 = factorTimes2 * t;\n  \n  out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n  out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n  out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n  \n  return out;\n};\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec3} out\n */\nvec3.random = function (out, scale) {\n    scale = scale || 1.0;\n\n    var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n    var z = (glMatrix.RANDOM() * 2.0) - 1.0;\n    var zScale = Math.sqrt(1.0-z*z) * scale;\n\n    out[0] = Math.cos(r) * zScale;\n    out[1] = Math.sin(r) * zScale;\n    out[2] = z * scale;\n    return out;\n};\n\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec3} out\n */\nvec3.transformMat4 = function(out, a, m) {\n    var x = a[0], y = a[1], z = a[2],\n        w = m[3] * x + m[7] * y + m[11] * z + m[15];\n    w = w || 1.0;\n    out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n    out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n    out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n    return out;\n};\n\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {mat4} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\nvec3.transformMat3 = function(out, a, m) {\n    var x = a[0], y = a[1], z = a[2];\n    out[0] = x * m[0] + y * m[3] + z * m[6];\n    out[1] = x * m[1] + y * m[4] + z * m[7];\n    out[2] = x * m[2] + y * m[5] + z * m[8];\n    return out;\n};\n\n/**\n * Transforms the vec3 with a quat\n *\n * @param {vec3} out the receiving vector\n * @param {vec3} a the vector to transform\n * @param {quat} q quaternion to transform with\n * @returns {vec3} out\n */\nvec3.transformQuat = function(out, a, q) {\n    // benchmarks: http://jsperf.com/quaternion-transform-vec3-implementations\n\n    var x = a[0], y = a[1], z = a[2],\n        qx = q[0], qy = q[1], qz = q[2], qw = q[3],\n\n        // calculate quat * vec\n        ix = qw * x + qy * z - qz * y,\n        iy = qw * y + qz * x - qx * z,\n        iz = qw * z + qx * y - qy * x,\n        iw = -qx * x - qy * y - qz * z;\n\n    // calculate result * inverse quat\n    out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n    out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n    out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n    return out;\n};\n\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {vec3} a The vec3 point to rotate\n * @param {vec3} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @returns {vec3} out\n */\nvec3.rotateX = function(out, a, b, c){\n   var p = [], r=[];\n\t  //Translate point to the origin\n\t  p[0] = a[0] - b[0];\n\t  p[1] = a[1] - b[1];\n  \tp[2] = a[2] - b[2];\n\n\t  //perform rotation\n\t  r[0] = p[0];\n\t  r[1] = p[1]*Math.cos(c) - p[2]*Math.sin(c);\n\t  r[2] = p[1]*Math.sin(c) + p[2]*Math.cos(c);\n\n\t  //translate to correct position\n\t  out[0] = r[0] + b[0];\n\t  out[1] = r[1] + b[1];\n\t  out[2] = r[2] + b[2];\n\n  \treturn out;\n};\n\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {vec3} a The vec3 point to rotate\n * @param {vec3} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @returns {vec3} out\n */\nvec3.rotateY = function(out, a, b, c){\n  \tvar p = [], r=[];\n  \t//Translate point to the origin\n  \tp[0] = a[0] - b[0];\n  \tp[1] = a[1] - b[1];\n  \tp[2] = a[2] - b[2];\n  \n  \t//perform rotation\n  \tr[0] = p[2]*Math.sin(c) + p[0]*Math.cos(c);\n  \tr[1] = p[1];\n  \tr[2] = p[2]*Math.cos(c) - p[0]*Math.sin(c);\n  \n  \t//translate to correct position\n  \tout[0] = r[0] + b[0];\n  \tout[1] = r[1] + b[1];\n  \tout[2] = r[2] + b[2];\n  \n  \treturn out;\n};\n\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {vec3} a The vec3 point to rotate\n * @param {vec3} b The origin of the rotation\n * @param {Number} c The angle of rotation\n * @returns {vec3} out\n */\nvec3.rotateZ = function(out, a, b, c){\n  \tvar p = [], r=[];\n  \t//Translate point to the origin\n  \tp[0] = a[0] - b[0];\n  \tp[1] = a[1] - b[1];\n  \tp[2] = a[2] - b[2];\n  \n  \t//perform rotation\n  \tr[0] = p[0]*Math.cos(c) - p[1]*Math.sin(c);\n  \tr[1] = p[0]*Math.sin(c) + p[1]*Math.cos(c);\n  \tr[2] = p[2];\n  \n  \t//translate to correct position\n  \tout[0] = r[0] + b[0];\n  \tout[1] = r[1] + b[1];\n  \tout[2] = r[2] + b[2];\n  \n  \treturn out;\n};\n\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nvec3.forEach = (function() {\n    var vec = vec3.create();\n\n    return function(a, stride, offset, count, fn, arg) {\n        var i, l;\n        if(!stride) {\n            stride = 3;\n        }\n\n        if(!offset) {\n            offset = 0;\n        }\n        \n        if(count) {\n            l = Math.min((count * stride) + offset, a.length);\n        } else {\n            l = a.length;\n        }\n\n        for(i = offset; i < l; i += stride) {\n            vec[0] = a[i]; vec[1] = a[i+1]; vec[2] = a[i+2];\n            fn(vec, vec, arg);\n            a[i] = vec[0]; a[i+1] = vec[1]; a[i+2] = vec[2];\n        }\n        \n        return a;\n    };\n})();\n\n/**\n * Get the angle between two 3D vectors\n * @param {vec3} a The first operand\n * @param {vec3} b The second operand\n * @returns {Number} The angle in radians\n */\nvec3.angle = function(a, b) {\n   \n    var tempA = vec3.fromValues(a[0], a[1], a[2]);\n    var tempB = vec3.fromValues(b[0], b[1], b[2]);\n \n    vec3.normalize(tempA, tempA);\n    vec3.normalize(tempB, tempB);\n \n    var cosine = vec3.dot(tempA, tempB);\n\n    if(cosine > 1.0){\n        return 0;\n    } else {\n        return Math.acos(cosine);\n    }     \n};\n\n/**\n * Returns a string representation of a vector\n *\n * @param {vec3} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nvec3.str = function (a) {\n    return 'vec3(' + a[0] + ', ' + a[1] + ', ' + a[2] + ')';\n};\n\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {vec3} a The first vector.\n * @param {vec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec3.exactEquals = function (a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n};\n\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {vec3} a The first vector.\n * @param {vec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec3.equals = function (a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2];\n    var b0 = b[0], b1 = b[1], b2 = b[2];\n    return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n            Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n            Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)));\n};\n\nmodule.exports = vec3;\n\n},{\"./common.js\":87}],95:[function(require,module,exports){\n/* Copyright (c) 2015, Brandon Jones, Colin MacKenzie IV.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE. */\n\nvar glMatrix = require(\"./common.js\");\n\n/**\n * @class 4 Dimensional Vector\n * @name vec4\n */\nvar vec4 = {};\n\n/**\n * Creates a new, empty vec4\n *\n * @returns {vec4} a new 4D vector\n */\nvec4.create = function() {\n    var out = new glMatrix.ARRAY_TYPE(4);\n    out[0] = 0;\n    out[1] = 0;\n    out[2] = 0;\n    out[3] = 0;\n    return out;\n};\n\n/**\n * Creates a new vec4 initialized with values from an existing vector\n *\n * @param {vec4} a vector to clone\n * @returns {vec4} a new 4D vector\n */\nvec4.clone = function(a) {\n    var out = new glMatrix.ARRAY_TYPE(4);\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n};\n\n/**\n * Creates a new vec4 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} a new 4D vector\n */\nvec4.fromValues = function(x, y, z, w) {\n    var out = new glMatrix.ARRAY_TYPE(4);\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    out[3] = w;\n    return out;\n};\n\n/**\n * Copy the values from one vec4 to another\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the source vector\n * @returns {vec4} out\n */\nvec4.copy = function(out, a) {\n    out[0] = a[0];\n    out[1] = a[1];\n    out[2] = a[2];\n    out[3] = a[3];\n    return out;\n};\n\n/**\n * Set the components of a vec4 to the given values\n *\n * @param {vec4} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @param {Number} w W component\n * @returns {vec4} out\n */\nvec4.set = function(out, x, y, z, w) {\n    out[0] = x;\n    out[1] = y;\n    out[2] = z;\n    out[3] = w;\n    return out;\n};\n\n/**\n * Adds two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.add = function(out, a, b) {\n    out[0] = a[0] + b[0];\n    out[1] = a[1] + b[1];\n    out[2] = a[2] + b[2];\n    out[3] = a[3] + b[3];\n    return out;\n};\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.subtract = function(out, a, b) {\n    out[0] = a[0] - b[0];\n    out[1] = a[1] - b[1];\n    out[2] = a[2] - b[2];\n    out[3] = a[3] - b[3];\n    return out;\n};\n\n/**\n * Alias for {@link vec4.subtract}\n * @function\n */\nvec4.sub = vec4.subtract;\n\n/**\n * Multiplies two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.multiply = function(out, a, b) {\n    out[0] = a[0] * b[0];\n    out[1] = a[1] * b[1];\n    out[2] = a[2] * b[2];\n    out[3] = a[3] * b[3];\n    return out;\n};\n\n/**\n * Alias for {@link vec4.multiply}\n * @function\n */\nvec4.mul = vec4.multiply;\n\n/**\n * Divides two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.divide = function(out, a, b) {\n    out[0] = a[0] / b[0];\n    out[1] = a[1] / b[1];\n    out[2] = a[2] / b[2];\n    out[3] = a[3] / b[3];\n    return out;\n};\n\n/**\n * Alias for {@link vec4.divide}\n * @function\n */\nvec4.div = vec4.divide;\n\n/**\n * Math.ceil the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to ceil\n * @returns {vec4} out\n */\nvec4.ceil = function (out, a) {\n    out[0] = Math.ceil(a[0]);\n    out[1] = Math.ceil(a[1]);\n    out[2] = Math.ceil(a[2]);\n    out[3] = Math.ceil(a[3]);\n    return out;\n};\n\n/**\n * Math.floor the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to floor\n * @returns {vec4} out\n */\nvec4.floor = function (out, a) {\n    out[0] = Math.floor(a[0]);\n    out[1] = Math.floor(a[1]);\n    out[2] = Math.floor(a[2]);\n    out[3] = Math.floor(a[3]);\n    return out;\n};\n\n/**\n * Returns the minimum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.min = function(out, a, b) {\n    out[0] = Math.min(a[0], b[0]);\n    out[1] = Math.min(a[1], b[1]);\n    out[2] = Math.min(a[2], b[2]);\n    out[3] = Math.min(a[3], b[3]);\n    return out;\n};\n\n/**\n * Returns the maximum of two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {vec4} out\n */\nvec4.max = function(out, a, b) {\n    out[0] = Math.max(a[0], b[0]);\n    out[1] = Math.max(a[1], b[1]);\n    out[2] = Math.max(a[2], b[2]);\n    out[3] = Math.max(a[3], b[3]);\n    return out;\n};\n\n/**\n * Math.round the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to round\n * @returns {vec4} out\n */\nvec4.round = function (out, a) {\n    out[0] = Math.round(a[0]);\n    out[1] = Math.round(a[1]);\n    out[2] = Math.round(a[2]);\n    out[3] = Math.round(a[3]);\n    return out;\n};\n\n/**\n * Scales a vec4 by a scalar number\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec4} out\n */\nvec4.scale = function(out, a, b) {\n    out[0] = a[0] * b;\n    out[1] = a[1] * b;\n    out[2] = a[2] * b;\n    out[3] = a[3] * b;\n    return out;\n};\n\n/**\n * Adds two vec4's after scaling the second operand by a scalar value\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec4} out\n */\nvec4.scaleAndAdd = function(out, a, b, scale) {\n    out[0] = a[0] + (b[0] * scale);\n    out[1] = a[1] + (b[1] * scale);\n    out[2] = a[2] + (b[2] * scale);\n    out[3] = a[3] + (b[3] * scale);\n    return out;\n};\n\n/**\n * Calculates the euclidian distance between two vec4's\n *\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {Number} distance between a and b\n */\nvec4.distance = function(a, b) {\n    var x = b[0] - a[0],\n        y = b[1] - a[1],\n        z = b[2] - a[2],\n        w = b[3] - a[3];\n    return Math.sqrt(x*x + y*y + z*z + w*w);\n};\n\n/**\n * Alias for {@link vec4.distance}\n * @function\n */\nvec4.dist = vec4.distance;\n\n/**\n * Calculates the squared euclidian distance between two vec4's\n *\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {Number} squared distance between a and b\n */\nvec4.squaredDistance = function(a, b) {\n    var x = b[0] - a[0],\n        y = b[1] - a[1],\n        z = b[2] - a[2],\n        w = b[3] - a[3];\n    return x*x + y*y + z*z + w*w;\n};\n\n/**\n * Alias for {@link vec4.squaredDistance}\n * @function\n */\nvec4.sqrDist = vec4.squaredDistance;\n\n/**\n * Calculates the length of a vec4\n *\n * @param {vec4} a vector to calculate length of\n * @returns {Number} length of a\n */\nvec4.length = function (a) {\n    var x = a[0],\n        y = a[1],\n        z = a[2],\n        w = a[3];\n    return Math.sqrt(x*x + y*y + z*z + w*w);\n};\n\n/**\n * Alias for {@link vec4.length}\n * @function\n */\nvec4.len = vec4.length;\n\n/**\n * Calculates the squared length of a vec4\n *\n * @param {vec4} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nvec4.squaredLength = function (a) {\n    var x = a[0],\n        y = a[1],\n        z = a[2],\n        w = a[3];\n    return x*x + y*y + z*z + w*w;\n};\n\n/**\n * Alias for {@link vec4.squaredLength}\n * @function\n */\nvec4.sqrLen = vec4.squaredLength;\n\n/**\n * Negates the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to negate\n * @returns {vec4} out\n */\nvec4.negate = function(out, a) {\n    out[0] = -a[0];\n    out[1] = -a[1];\n    out[2] = -a[2];\n    out[3] = -a[3];\n    return out;\n};\n\n/**\n * Returns the inverse of the components of a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to invert\n * @returns {vec4} out\n */\nvec4.inverse = function(out, a) {\n  out[0] = 1.0 / a[0];\n  out[1] = 1.0 / a[1];\n  out[2] = 1.0 / a[2];\n  out[3] = 1.0 / a[3];\n  return out;\n};\n\n/**\n * Normalize a vec4\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a vector to normalize\n * @returns {vec4} out\n */\nvec4.normalize = function(out, a) {\n    var x = a[0],\n        y = a[1],\n        z = a[2],\n        w = a[3];\n    var len = x*x + y*y + z*z + w*w;\n    if (len > 0) {\n        len = 1 / Math.sqrt(len);\n        out[0] = x * len;\n        out[1] = y * len;\n        out[2] = z * len;\n        out[3] = w * len;\n    }\n    return out;\n};\n\n/**\n * Calculates the dot product of two vec4's\n *\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @returns {Number} dot product of a and b\n */\nvec4.dot = function (a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n};\n\n/**\n * Performs a linear interpolation between two vec4's\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the first operand\n * @param {vec4} b the second operand\n * @param {Number} t interpolation amount between the two inputs\n * @returns {vec4} out\n */\nvec4.lerp = function (out, a, b, t) {\n    var ax = a[0],\n        ay = a[1],\n        az = a[2],\n        aw = a[3];\n    out[0] = ax + t * (b[0] - ax);\n    out[1] = ay + t * (b[1] - ay);\n    out[2] = az + t * (b[2] - az);\n    out[3] = aw + t * (b[3] - aw);\n    return out;\n};\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec4} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If ommitted, a unit vector will be returned\n * @returns {vec4} out\n */\nvec4.random = function (out, scale) {\n    scale = scale || 1.0;\n\n    //TODO: This is a pretty awful way of doing this. Find something better.\n    out[0] = glMatrix.RANDOM();\n    out[1] = glMatrix.RANDOM();\n    out[2] = glMatrix.RANDOM();\n    out[3] = glMatrix.RANDOM();\n    vec4.normalize(out, out);\n    vec4.scale(out, out, scale);\n    return out;\n};\n\n/**\n * Transforms the vec4 with a mat4.\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the vector to transform\n * @param {mat4} m matrix to transform with\n * @returns {vec4} out\n */\nvec4.transformMat4 = function(out, a, m) {\n    var x = a[0], y = a[1], z = a[2], w = a[3];\n    out[0] = m[0] * x + m[4] * y + m[8] * z + m[12] * w;\n    out[1] = m[1] * x + m[5] * y + m[9] * z + m[13] * w;\n    out[2] = m[2] * x + m[6] * y + m[10] * z + m[14] * w;\n    out[3] = m[3] * x + m[7] * y + m[11] * z + m[15] * w;\n    return out;\n};\n\n/**\n * Transforms the vec4 with a quat\n *\n * @param {vec4} out the receiving vector\n * @param {vec4} a the vector to transform\n * @param {quat} q quaternion to transform with\n * @returns {vec4} out\n */\nvec4.transformQuat = function(out, a, q) {\n    var x = a[0], y = a[1], z = a[2],\n        qx = q[0], qy = q[1], qz = q[2], qw = q[3],\n\n        // calculate quat * vec\n        ix = qw * x + qy * z - qz * y,\n        iy = qw * y + qz * x - qx * z,\n        iz = qw * z + qx * y - qy * x,\n        iw = -qx * x - qy * y - qz * z;\n\n    // calculate result * inverse quat\n    out[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n    out[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n    out[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n    out[3] = a[3];\n    return out;\n};\n\n/**\n * Perform some operation over an array of vec4s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nvec4.forEach = (function() {\n    var vec = vec4.create();\n\n    return function(a, stride, offset, count, fn, arg) {\n        var i, l;\n        if(!stride) {\n            stride = 4;\n        }\n\n        if(!offset) {\n            offset = 0;\n        }\n        \n        if(count) {\n            l = Math.min((count * stride) + offset, a.length);\n        } else {\n            l = a.length;\n        }\n\n        for(i = offset; i < l; i += stride) {\n            vec[0] = a[i]; vec[1] = a[i+1]; vec[2] = a[i+2]; vec[3] = a[i+3];\n            fn(vec, vec, arg);\n            a[i] = vec[0]; a[i+1] = vec[1]; a[i+2] = vec[2]; a[i+3] = vec[3];\n        }\n        \n        return a;\n    };\n})();\n\n/**\n * Returns a string representation of a vector\n *\n * @param {vec4} vec vector to represent as a string\n * @returns {String} string representation of the vector\n */\nvec4.str = function (a) {\n    return 'vec4(' + a[0] + ', ' + a[1] + ', ' + a[2] + ', ' + a[3] + ')';\n};\n\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {vec4} a The first vector.\n * @param {vec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec4.exactEquals = function (a, b) {\n    return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3];\n};\n\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {vec4} a The first vector.\n * @param {vec4} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nvec4.equals = function (a, b) {\n    var a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3];\n    var b0 = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n    return (Math.abs(a0 - b0) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a0), Math.abs(b0)) &&\n            Math.abs(a1 - b1) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a1), Math.abs(b1)) &&\n            Math.abs(a2 - b2) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a2), Math.abs(b2)) &&\n            Math.abs(a3 - b3) <= glMatrix.EPSILON*Math.max(1.0, Math.abs(a3), Math.abs(b3)));\n};\n\nmodule.exports = vec4;\n\n},{\"./common.js\":87}],96:[function(require,module,exports){\n/**\n * AUTHOR OF INITIAL JS LIBRARY\n * k-d Tree JavaScript - V 1.0\n *\n * https://github.com/ubilabs/kd-tree-javascript\n *\n * @author Mircea Pricop <pricop@ubilabs.net>, 2012\n * @author Martin Kleppe <kleppe@ubilabs.net>, 2012\n * @author Ubilabs http://ubilabs.net, 2012\n * @license MIT License <http://www.opensource.org/licenses/mit-license.php>\n */\n\n\nfunction Node(obj, dimension, parent) {\n  this.obj = obj;\n  this.left = null;\n  this.right = null;\n  this.parent = parent;\n  this.dimension = dimension;\n}\n\nfunction KdTree(points, metric, dimensions) {\n\n  var self = this;\n  \n  function buildTree(points, depth, parent) {\n    var dim = depth % dimensions.length,\n      median,\n      node;\n\n    if (points.length === 0) {\n      return null;\n    }\n    if (points.length === 1) {\n      return new Node(points[0], dim, parent);\n    }\n\n    points.sort(function (a, b) {\n      return a[dimensions[dim]] - b[dimensions[dim]];\n    });\n\n    median = Math.floor(points.length / 2);\n    node = new Node(points[median], dim, parent);\n    node.left = buildTree(points.slice(0, median), depth + 1, node);\n    node.right = buildTree(points.slice(median + 1), depth + 1, node);\n\n    return node;\n  }\n\n  this.root = buildTree(points, 0, null);\n\n  this.insert = function (point) {\n    function innerSearch(node, parent) {\n\n      if (node === null) {\n        return parent;\n      }\n\n      var dimension = dimensions[node.dimension];\n      if (point[dimension] < node.obj[dimension]) {\n        return innerSearch(node.left, node);\n      } else {\n        return innerSearch(node.right, node);\n      }\n    }\n\n    var insertPosition = innerSearch(this.root, null),\n      newNode,\n      dimension;\n\n    if (insertPosition === null) {\n      this.root = new Node(point, 0, null);\n      return;\n    }\n\n    newNode = new Node(point, (insertPosition.dimension + 1) % dimensions.length, insertPosition);\n    dimension = dimensions[insertPosition.dimension];\n\n    if (point[dimension] < insertPosition.obj[dimension]) {\n      insertPosition.left = newNode;\n    } else {\n      insertPosition.right = newNode;\n    }\n  };\n\n  this.remove = function (point) {\n    var node;\n\n    function nodeSearch(node) {\n      if (node === null) {\n        return null;\n      }\n\n      if (node.obj === point) {\n        return node;\n      }\n\n      var dimension = dimensions[node.dimension];\n\n      if (point[dimension] < node.obj[dimension]) {\n        return nodeSearch(node.left, node);\n      } else {\n        return nodeSearch(node.right, node);\n      }\n    }\n\n    function removeNode(node) {\n      var nextNode,\n        nextObj,\n        pDimension;\n\n      function findMax(node, dim) {\n        var dimension,\n          own,\n          left,\n          right,\n          max;\n\n        if (node === null) {\n          return null;\n        }\n\n        dimension = dimensions[dim];\n        if (node.dimension === dim) {\n          if (node.right !== null) {\n            return findMax(node.right, dim);\n          }\n          return node;\n        }\n\n        own = node.obj[dimension];\n        left = findMax(node.left, dim);\n        right = findMax(node.right, dim);\n        max = node;\n\n        if (left !== null && left.obj[dimension] > own) {\n          max = left;\n        }\n\n        if (right !== null && right.obj[dimension] > max.obj[dimension]) {\n          max = right;\n        }\n        return max;\n      }\n\n      function findMin(node, dim) {\n        var dimension,\n          own,\n          left,\n          right,\n          min;\n\n        if (node === null) {\n          return null;\n        }\n\n        dimension = dimensions[dim];\n\n        if (node.dimension === dim) {\n          if (node.left !== null) {\n            return findMin(node.left, dim);\n          }\n          return node;\n        }\n\n        own = node.obj[dimension];\n        left = findMin(node.left, dim);\n        right = findMin(node.right, dim);\n        min = node;\n\n        if (left !== null && left.obj[dimension] < own) {\n          min = left;\n        }\n        if (right !== null && right.obj[dimension] < min.obj[dimension]) {\n          min = right;\n        }\n        return min;\n      }\n\n      if (node.left === null && node.right === null) {\n        if (node.parent === null) {\n          self.root = null;\n          return;\n        }\n\n        pDimension = dimensions[node.parent.dimension];\n\n        if (node.obj[pDimension] < node.parent.obj[pDimension]) {\n          node.parent.left = null;\n        } else {\n          node.parent.right = null;\n        }\n        return;\n      }\n\n      if (node.left !== null) {\n        nextNode = findMax(node.left, node.dimension);\n      } else {\n        nextNode = findMin(node.right, node.dimension);\n      }\n\n      nextObj = nextNode.obj;\n      removeNode(nextNode);\n      node.obj = nextObj;\n\n    }\n\n    node = nodeSearch(self.root);\n\n    if (node === null) { return; }\n\n    removeNode(node);\n  };\n\n  this.nearest = function (point, maxNodes, maxDistance) {\n    var i,\n      result,\n      bestNodes;\n\n    bestNodes = new BinaryHeap(\n      function (e) { return -e[1]; }\n    );\n\n    function nearestSearch(node) {\n      if(!self.root){\n        return [];\n      }\n      var bestChild,\n        dimension = dimensions[node.dimension],\n        ownDistance = metric(point, node.obj),\n        linearPoint = {},\n        linearDistance,\n        otherChild,\n        i;\n\n      function saveNode(node, distance) {\n        bestNodes.push([node, distance]);\n        if (bestNodes.size() > maxNodes) {\n          bestNodes.pop();\n        }\n      }\n\n      for (i = 0; i < dimensions.length; i += 1) {\n        if (i === node.dimension) {\n          linearPoint[dimensions[i]] = point[dimensions[i]];\n        } else {\n          linearPoint[dimensions[i]] = node.obj[dimensions[i]];\n        }\n      }\n\n      linearDistance = metric(linearPoint, node.obj);\n\n      if (node.right === null && node.left === null) {\n        if (bestNodes.size() < maxNodes || ownDistance < bestNodes.peek()[1]) {\n          saveNode(node, ownDistance);\n        }\n        return;\n      }\n\n      if (node.right === null) {\n        bestChild = node.left;\n      } else if (node.left === null) {\n        bestChild = node.right;\n      } else {\n        if (point[dimension] < node.obj[dimension]) {\n          bestChild = node.left;\n        } else {\n          bestChild = node.right;\n        }\n      }\n\n      nearestSearch(bestChild);\n\n      if (bestNodes.size() < maxNodes || ownDistance < bestNodes.peek()[1]) {\n        saveNode(node, ownDistance);\n      }\n\n      if (bestNodes.size() < maxNodes || Math.abs(linearDistance) < bestNodes.peek()[1]) {\n        if (bestChild === node.left) {\n          otherChild = node.right;\n        } else {\n          otherChild = node.left;\n        }\n        if (otherChild !== null) {\n          nearestSearch(otherChild);\n        }\n      }\n    }\n\n    if (maxDistance) {\n      for (i = 0; i < maxNodes; i += 1) {\n        bestNodes.push([null, maxDistance]);\n      }\n    }\n\n    nearestSearch(self.root);\n\n    result = [];\n\n    for (i = 0; i < maxNodes && i < bestNodes.content.length; i += 1) {\n      if (bestNodes.content[i][0]) {\n        result.push([bestNodes.content[i][0].obj, bestNodes.content[i][1]]);\n      }\n    }\n    return result;\n  };\n\n  this.balanceFactor = function () {\n    function height(node) {\n      if (node === null) {\n        return 0;\n      }\n      return Math.max(height(node.left), height(node.right)) + 1;\n    }\n\n    function count(node) {\n      if (node === null) {\n        return 0;\n      }\n      return count(node.left) + count(node.right) + 1;\n    }\n\n    return height(self.root) / (Math.log(count(self.root)) / Math.log(2));\n  };\n}\n\n// Binary heap implementation from:\n// http://eloquentjavascript.net/appendix2.html\n\nfunction BinaryHeap(scoreFunction){\n  this.content = [];\n  this.scoreFunction = scoreFunction;\n}\n\nBinaryHeap.prototype = {\n  push: function(element) {\n    // Add the new element to the end of the array.\n    this.content.push(element);\n    // Allow it to bubble up.\n    this.bubbleUp(this.content.length - 1);\n  },\n\n  pop: function() {\n    // Store the first element so we can return it later.\n    var result = this.content[0];\n    // Get the element at the end of the array.\n    var end = this.content.pop();\n    // If there are any elements left, put the end element at the\n    // start, and let it sink down.\n    if (this.content.length > 0) {\n      this.content[0] = end;\n      this.sinkDown(0);\n    }\n    return result;\n  },\n\n  peek: function() {\n    return this.content[0];\n  },\n\n  remove: function(node) {\n    var len = this.content.length;\n    // To remove a value, we must search through the array to find\n    // it.\n    for (var i = 0; i < len; i++) {\n      if (this.content[i] == node) {\n        // When it is found, the process seen in 'pop' is repeated\n        // to fill up the hole.\n        var end = this.content.pop();\n        if (i != len - 1) {\n          this.content[i] = end;\n          if (this.scoreFunction(end) < this.scoreFunction(node))\n            this.bubbleUp(i);\n          else\n            this.sinkDown(i);\n        }\n        return;\n      }\n    }\n    throw new Error(\"Node not found.\");\n  },\n\n  size: function() {\n    return this.content.length;\n  },\n\n  bubbleUp: function(n) {\n    // Fetch the element that has to be moved.\n    var element = this.content[n];\n    // When at 0, an element can not go up any further.\n    while (n > 0) {\n      // Compute the parent element's index, and fetch it.\n      var parentN = Math.floor((n + 1) / 2) - 1,\n          parent = this.content[parentN];\n      // Swap the elements if the parent is greater.\n      if (this.scoreFunction(element) < this.scoreFunction(parent)) {\n        this.content[parentN] = element;\n        this.content[n] = parent;\n        // Update 'n' to continue at the new position.\n        n = parentN;\n      }\n      // Found a parent that is less, no need to move it further.\n      else {\n        break;\n      }\n    }\n  },\n\n  sinkDown: function(n) {\n    // Look up the target element and its score.\n    var length = this.content.length,\n        element = this.content[n],\n        elemScore = this.scoreFunction(element);\n\n    while(true) {\n      // Compute the indices of the child elements.\n      var child2N = (n + 1) * 2, child1N = child2N - 1;\n      // This is used to store the new position of the element,\n      // if any.\n      var swap = null;\n      // If the first child exists (is inside the array)...\n      if (child1N < length) {\n        // Look it up and compute its score.\n        var child1 = this.content[child1N],\n            child1Score = this.scoreFunction(child1);\n        // If the score is less than our element's, we need to swap.\n        if (child1Score < elemScore)\n          swap = child1N;\n      }\n      // Do the same checks for the other child.\n      if (child2N < length) {\n        var child2 = this.content[child2N],\n            child2Score = this.scoreFunction(child2);\n        if (child2Score < (swap == null ? elemScore : child1Score)){\n          swap = child2N;\n        }\n      }\n\n      // If the element needs to be moved, swap it, and continue.\n      if (swap != null) {\n        this.content[n] = this.content[swap];\n        this.content[swap] = element;\n        n = swap;\n      }\n      // Otherwise, we are done.\n      else {\n        break;\n      }\n    }\n  }\n};\n\nmodule.exports = {\n  createKdTree: function (points, metric, dimensions) {\n    return new KdTree(points, metric, dimensions)\n  }\n}\n\n},{}],97:[function(require,module,exports){\nmodule.exports={\n  \"name\": \"serve-sofa-hrir\",\n  \"exports\": \"serveSofaHrir\",\n  \"version\": \"0.4.2\",\n  \"description\": \"Utility to fetch and shape sofa formated HRIR from server\",\n  \"main\": \"./dist/\",\n  \"standalone\": \"serveSofaHrir\",\n  \"scripts\": {\n    \"lint\": \"eslint ./src/ ./test/ && jscs --verbose ./src/ ./test/\",\n    \"lint-examples\": \"eslint -c examples/.eslintrc ./examples/*.html\",\n    \"compile\": \"rm -rf ./dist && babel ./src/ --out-dir ./dist/\",\n    \"browserify\": \"browserify ./src/index.js -t [ babelify ] --standalone serveSofaHrir > serveSofaHrir.js\",\n    \"bundle\": \"npm run lint && npm run test && npm run doc && npm run compile && npm run browserify\",\n    \"doc\": \"esdoc -c esdoc.json\",\n    \"test\": \"browserify test/*/*.js -t [ babelify ] --exclude 'test/*/*_listen.js*' --exclude 'test/*/*_issues.js' | tape-run\",\n    \"test-browser\": \"browserify test/*/*.js -t [ babelify ] --exclude 'test/*/*_listen.js*' --exclude 'test/*/*_issues.js' | testling -u\",\n    \"test-listen\": \"browserify test/*/*_listen.js -t [ babelify ] | tape-run\",\n    \"test-issues\": \"browserify test/*/*_issues.js -t [ babelify ] | tape-run\",\n    \"watch\": \"watch 'npm run browserify && echo $( date ): browserified' ./src/\"\n  },\n  \"authors\": [\n    \"Jean-Philippe.Lambert@ircam.fr\",\n    \"Arnau Julià <arnau.julia@gmail.com>\",\n    \"Samuel.Goldszmidt@ircam.fr\",\n    \"David.Poirier-Quinot@ircam.fr\"\n  ],\n  \"license\": \"BSD-3-Clause\",\n  \"dependencies\": {\n    \"gl-matrix\": \"^2.3.1\",\n    \"kd.tree\": \"github:akshaylive/node-kdt#39bc780704a324393bca68a17cf7bc71be8544c6\",\n    \"fractional-delay\": \"git://github.com/Ircam-RnD/fractional-delay.git#gh-pages\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/Ircam-RnD/serveSofaHrir.git\"\n  },\n  \"engines\": {\n    \"node\": \"0.12 || 4\",\n    \"npm\": \">=1.0.0 <3.0.0\"\n  },\n  \"devDependencies\": {\n    \"babel-cli\": \"^6.5.1\",\n    \"babel-eslint\": \"^4.1.8\",\n    \"babel-preset-es2015\": \"^6.5.0\",\n    \"babelify\": \"^7.2.0\",\n    \"blue-tape\": \"^0.1.11\",\n    \"browserify\": \"^12.0.2\",\n    \"esdoc\": \"^0.4.6\",\n    \"eslint\": \"^1.10.3\",\n    \"eslint-config-airbnb\": \"^1.0.2\",\n    \"eslint-plugin-html\": \"^1.4.0\",\n    \"jscs\": \"2.11.0\",\n    \"jscs-jsdoc\": \"^1.3.1\",\n    \"tape\": \"^4.4.0\",\n    \"tape-run\": \"^2.1.2\",\n    \"testling\": \"^1.7.1\",\n    \"watch\": \"^0.17.1\"\n  },\n  \"gitHead\": \"be54feefbc9c9c4226a580e713eaa5805e8ed785\",\n  \"readme\": \"# Binaural #\\n\\nThis library permits to render sources in three-dimensional space with\\nbinaural audio.\\n\\nThis library provides an access to a server, in order to load a set of\\nHead-related transfer functions ([HRTF]). The set of filters applies to any\\nnumber of sources, given their position, and a listener.\\n\\nThis library is compatible with the [Web Audio API]. The novelty of this\\nlibrary is that it permits to use a custom [HRTF] dataset (see\\n[T. Carpentier article]).\\n\\nIt is possible to use it without a server, with a direct URL to an [HRTF]\\nset.\\n\\n## Documentation ##\\n\\nYou can consult the [API documentation] for the complete documentation.\\n\\n### BinauralPanner ###\\n\\nA `BinauralPanner` is a panner for use with the [Web Audio API]. It\\nspatialises multiple audio sources, given a set of head-related transfer\\nfunctions [HRTF]s, and a listener.\\n\\n### ServerDataBase ###\\n\\n**The public server that hosts a database of individual [HRTF]s is available\\nfor beta-testers only and will open to public in 2016.**\\n\\nThe `ServerDataBase` retrieves a catalogue from a [SOFA] server. From the\\ncatalogue, it get URLs matching optional filters: data-base, sample-rate,\\nand any free pattern.\\n\\n### HRTF dataset ###\\n\\nYou can use any [HRTF] data-set that follows the [SOFA] standard, in JSON\\nformat, using finite impulse responses (FIR). Second-order sections (SOS)\\nare not supported, yet. See the [examples HRTF directory] for a few samples.\\n\\n### Coordinate system types ###\\n\\nSee the files in [src/geometry], for conversions:\\n- OpenGL, [SOFA], and Spat4 (Ircam) conventions\\n- cartesian and spherical coordinates\\n- radian and degree angles\\n\\n\\n## Examples ##\\n\\nPlease see the [examples directory] for complete code (on branch\\n`gh-pages`), and the [examples online].\\n\\nSee also the [API documentation] for the complete options.\\n\\n### BinauralPanner ###\\nGiven an audio element, and a global binaural module,\\n\\n```html\\n<html>\\n    <head>\\n        <script src=\\\"../binaural.js\\\"></script>\\n    </head>\\n    <body>\\n        <audio id=\\\"source\\\" src=\\\"./snd/breakbeat.wav\\\" controls loop></audio>\\n    </body>\\n</html>\\n```\\n\\ncreate a source audio node,\\n\\n```js\\nvar audioContext = new AudioContext();\\nvar $mediaElement = document.querySelector('#source');\\nvar player = audioContext.createMediaElementSource($mediaElement);\\n```\\n\\ninstantiate a `BinauralPanner` and connect it.\\n\\n```js\\nvar binauralPanner = new binaural.audio.BinauralPanner({\\n    audioContext,\\n    crossfadeDuration: 0.05, // in seconds\\n    coordinateSystem: 'sofaSpherical', // [azimuth, elevation, distance]\\n    sourceCount: 1,\\n    sourcePositions: [ [0, 0, 1] ], // initial position\\n});\\nbinauralPanner.connectOutputs(audioContext.destination);\\nbinauralPanner.connectInputByIndex(0, player);\\n\\n```\\n\\nLoad an HRTF set (this returns a [Promise]).\\n\\n```js\\nbinauralPanner.loadHrtfSet(url)\\n    .then(function () {\\n        console.log('loaded');\\n    })\\n    .catch(function (error) {\\n        console.log('Error while loading ' + url + error.message);\\n    });\\n```\\n\\nThen, any source can move:\\n\\n```js\\n$azimuth.on(\\\"input\\\", function(event) {\\n    // get current position\\n    var position = binauralPanner.getSourcePositionByIndex(0);\\n\\n    // update azimuth\\n    position[0] = event.target.value;\\n    binauralPanner.setSourcePositionByIndex(0, position);\\n\\n    // update filters\\n    window.requestAnimationFrame(function () {\\n        binauralPanner.update();\\n    });\\n});\\n```\\n\\nNote that a call to the `update` method actually updates the filters.\\n\\n### ServerDataBase ###\\n\\nInstantiate a `ServerDataBase`\\n\\n```js\\nvar serverDataBase = new binaural.sofa.ServerDataBase();\\n```\\n\\nand load the catalogue from the server. This returns a promise.\\n\\n```js\\nvar catalogLoaded = serverDataBase.loadCatalogue();\\n```\\n\\nFind URLs with `HRIR` convention, `COMPENSATED` equalisation, and a\\nsample-rate matching the one of the audio context.\\n\\n```js\\nvar urlsFound = catalogLoaded.then(function () {\\n    var urls = serverDataBase.getUrls({\\n        convention: 'HRIR',\\n        equalisation: 'COMPENSATED',\\n        sampleRate: audioContext.sampleRate,\\n    });\\n    return urls;\\n})\\n.catch(function(error) {\\n    console.log('Error accessing HRTF server. ' + error.message);\\n});\\n```\\n\\nThen, a `BinauralPanner` can load one of these URLs.\\n\\n```js\\nurlsFound.then(function(urls) {\\n    binauralPanner.loadHrtfSet(urls[0])\\n        .then(function () {\\n            console.log('loaded');\\n        })\\n        .catch(function (error) {\\n            console.log('Error while loading ' + url\\n                + error.message);\\n        });\\n});\\n```\\n\\n## Issues ##\\n\\n- re-sampling is broken on full set (Chrome 48 issue): too many parallel\\n  audio contexts?\\n- clicks on Firefox 44-45 (during update of `convolver.buffer`, because\\n  `AudioContext.currentTime` does not advance)\\n- ServerDataBase: avoid server with free pattern filter?\\n\\n## To do ##\\n\\n- attenuation with distance\\n- dry/wet outputs for (shared) reverberation\\n- support for infinite impulse responses, once [IIRFilterNode] is\\n  implemented.\\n\\n## Developers ##\\n\\nThe source code is in the [src directory], in [ES2015] standard. `npm run\\ncompile` with [Babel] to the [dist directory]. Note that there is a\\n[.babelrc] file. `npm run bundle` runs the linters, the tests,\\ngenerates the documentation, and compiles the code.\\n\\nCommit the source files to the branch `develop`, and update the version in\\n[package.json] if this is intended to be a release.\\n\\nOn the `master` branch, merge from the `develop` branch. Generate and\\ncommit the documentation and the distribution files. Put a release tag that\\ncorresponds to the version in [package.json].\\n\\nOn the `gh-pages` branch, merge from the `master` branch. Commit the\\nexamples, and the extra files (audio and HRTF set files).\\n\\n### Style ###\\n\\n`npm run lint` to check that the code conforms with [.eslintrc] and\\n[.jscsrc] files. The rules derive from [AirBnB] with these\\nmajor points:\\n- [ES2015]\\n- no `'use strict'` globally (already there via babel)\\n- enforce curly braces (`if`, `for`, etc.)\\n- allow spaces and new lines, with fewer requirements: use them for clarity\\n\\n### Test ###\\n\\nFor any function or method, there is at least a test. The hierarchy in the\\n[test directory] is the same as in the [src directory].\\n\\n- `npm run test` for all automated tests\\n- `npm run test-listen` for supervised listening tests. The test files must\\n  end with `_listen.js`\\n- `npm run test-issues` for unsolved issues. The issues may depend on the\\n  host: operating system, user-agent, sound-device, sample-rate, etc. The\\n  test files must end with `_issues.js`. Once an issue is solved, the\\n  corresponding tests are added to the automated test set.\\n- `npm run test-browser` starts a server for running the tests in any browser.\\n\\nExamples for specific testing, when developing or resolving an issue:\\n- `browserify test/geometry/test_Listener.js -t babelify | tape-run` in a\\n  headless browser\\n- `browserify test/geometry/test_Listener.js -t babelify | testling -u`\\n  for an URL to open in any browser\\n\\n### Documentation ###\\n\\nDocument any public function and method with [JSDoc], and generate the HTML\\npages with `npm run doc`. At this point, neither\\n[jsdoc](https://www.npmjs.com/package/jsdoc) nor\\n[esdoc](https://www.npmjs.com/package/esdoc) gives perfect\\ntranscription. (See the [jsdoc.json] and [esdoc.json] files.)\\n\\n## License\\n\\nThis module is released under the [BSD-3-Clause] license.\\n\\n## Acknowledgments\\n\\nThis research was developed by both [Acoustic And Cognitive Spaces] and [Analysis of Musical Practices] IRCAM research teams. A previous version was part of the WAVE project, funded by ANR (French National Research Agency). The current version, supporting multiple sources and a listener, HRTFs SOFA format and the access to a HRTF server, is part of the [CoSiMa] project, funded by ANR.The HRTF server and efforts for standardization of the HRTF SOFA format ([AES69 standard]) benefited from the financial support of the [Bili] project (French funding program FUI). \\n\\n[//]: # (Avoid relative links for use with https://github.com/README.md)\\n[//]: # (and http://cdn.rawgit.com/Ircam-RnD/binauralFIR/next-gh-pages/doc/index.html)\\n\\n[//]: # (Use relative links after the release, and drop rawgit.com)\\n[//]: # (next-develop => develop)\\n[//]: # (next-master => master)\\n[//]: # (next-gh-pages => gh-pages)\\n\\n[.babelrc]: https://github.com/Ircam-RnD/binauralFIR/tree/next-develop/.babelrc\\n[.eslintrc]: https://github.com/Ircam-RnD/binauralFIR/tree/next-develop/.eslintrc\\n[.jscsrc]: https://github.com/Ircam-RnD/binauralFIR/tree/next-develop/.jscsrc\\n[Acoustic And Cognitive Spaces]: http://recherche.ircam.fr/equipes/salles/\\n[AirBnB]: https://github.com/airbnb/javascript/\\n[Analysis of Musical Practices]: http://apm.ircam.fr/\\n[API documentation directory]: https://github.com/Ircam-RnD/binauralFIR/tree/next-master/doc/\\n[API documentation]: http://cdn.rawgit.com/Ircam-RnD/binauralFIR/next-master/doc/index.html\\n[Babel]: https://babeljs.io/\\n[BSD-3-Clause]: http://opensource.org/licenses/BSD-3-Clause\\n[CoSiMa]: http://cosima.ircam.fr/\\n[doc directory]:  https://github.com/Ircam-RnD/binauralFIR/tree/next-master/doc/\\n[dist directory]:  https://github.com/Ircam-RnD/binauralFIR/tree/next-master/dist/\\n[documentation]: #documentation\\n[ES2015]: https://babeljs.io/docs/learn-es2015/\\n[esdoc.json]: https://github.com/Ircam-RnD/binauralFIR/tree/next-develop/esdoc.json\\n[examples directory]: https://github.com/Ircam-RnD/binauralFIR/tree/next-gh-pages/examples/\\n[examples HRTF directory]: https://github.com/Ircam-RnD/binauralFIR/tree/next-gh-pages/examples/hrtf/\\n[examples online]: http://cdn.rawgit.com/Ircam-RnD/binauralFIR/next-gh-pages/examples/index.html\\n[HRTF]: http://en.wikipedia.org/wiki/Head-related_transfer_function\\n[IIRFilterNode]: https://webaudio.github.io/web-audio-api/#idl-def-IIRFilterNode\\n[jsdoc.json]: https://github.com/Ircam-RnD/binauralFIR/tree/next-develop/jsdoc.json\\n[JSDoc]: http://usejsdoc.org/\\n[package.json]: https://github.com/Ircam-RnD/binauralFIR/tree/next-develop/package.json\\n[Promise]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\\n[SOFA]: http://www.aes.org/publications/standards/search.cfm?docID=99\\n[src directory]: https://github.com/Ircam-RnD/binauralFIR/tree/next-develop/src/\\n[src/geometry]: https://github.com/Ircam-RnD/binauralFIR/tree/next-develop/src/geometry/\\n[T. Carpentier article]: http://wac.ircam.fr/pdf/demo/wac15_submission_16.pdf\\n[test directory]: https://github.com/Ircam-RnD/binauralFIR/tree/next-develop/test/\\n[Web Audio API]: https://webaudio.github.io/web-audio-api/\\n[AES69 standard]: http://www.aes.org/publications/standards/search.cfm?docID=99\\n[Bili]: http://www.bili-project.org/\",\n  \"readmeFilename\": \"README.md\",\n  \"bugs\": {\n    \"url\": \"https://github.com/Ircam-RnD/serveSofaHrir/issues\"\n  },\n  \"homepage\": \"https://github.com/Ircam-RnD/serveSofaHrir#readme\",\n  \"_id\": \"serve-sofa-hrir@0.4.2\",\n  \"_shasum\": \"1fc3553f492fc678454c725c759c96c94f4bce37\",\n  \"_from\": \"git://github.com/Ircam-RnD/serveSofaHrir.git\",\n  \"_resolved\": \"git://github.com/Ircam-RnD/serveSofaHrir.git#be54feefbc9c9c4226a580e713eaa5805e8ed785\"\n}\n\n},{}],98:[function(require,module,exports){\n////////////////////////////////////////////////////////////////////\n//  Archontis Politis\n//  archontis.politis@aalto.fi\n////////////////////////////////////////////////////////////////////\n//\n//  A JavaScript library that implements \n//  the spherical harmonic transform for real spherical harmonics\n//  and some useful transformations in the spherical harmonic domain\n//\n//  The library uses the numeric.js library for matrix operations\n//  http://www.numericjs.com/\n//\n////////////////////////////////////////////////////////////////////\n\nvar numeric = require('numeric');\n\n\n// forwardSHT implements the forward SHT on data defined over the sphere\nvar forwardSHT = function (N, data, CART_OR_SPH, DIRECT_OR_PINV) {\n    \n    var Ndirs = data.length, Nsh = (N+1)*(N+1);\n    var invY_N;\n    var mag = [,];\n    if (Nsh>Ndirs)  {\n        console.log(\"The SHT degree is too high for the number of data points\")\n    }\n    \n    // Convert cartesian to spherical if needed\n    if (CART_OR_SPH==0) data = convertCart2Sph(data);\n    for (var  i=0; i<data.length; i++) {\n        mag[i] = data[i][2];\n    }\n    // SH sampling matrix\n    Y_N = computeRealSH(N, data);\n    // Direct SHT\n    if (DIRECT_OR_PINV==0) {\n        invY_N = numeric.mul(1/Ndirs,Y_N);\n    }\n    else {\n        invY_N = pinv_direct(numeric.transpose(Y_N));\n    }\n    // Perform SHT\n    var coeffs = numeric.dotMV(invY_N, mag);\n    return coeffs;\n}\n\n// inverseSHT implements the inverse SHT from SH coefficients\nvar inverseSHT = function (coeffs, aziElev) {\n    \n    var aziElevR = aziElev;\n    var N = Math.sqrt(coeffs.length)-1;\n    // SH sampling matrix\n    var Y_N = computeRealSH(N, aziElev);\n    // reconstruction\n    var data = numeric.dotVM(coeffs, Y_N);\n    // gather in data matrix\n    for (var i=0; i<aziElev.length; i++) {\n        aziElevR[i][2] = data[i];\n    }\n    return aziElevR;\n}\n\n// xxxxxxxxxxxxxxxxxx\nvar print2Darray = function (array2D) {\n    for (var q=0; q<array2D.length; q++) console.log(array2D[q]);\n}\n\n// convertCart2Sph converts arrays of cartesian vectors to spherical coordinates\nvar convertCart2Sph = function (xyz, OMIT_MAG) {\n    \n    var azi, elev, r;\n    var aziElevR = new Array(xyz.length);\n    \n    for (var i=0; i<xyz.length; i++) {\n        azi = Math.atan2( xyz[i][1], xyz[i][0] );\n        elev = Math.atan2( xyz[i][2], Math.sqrt(xyz[i][0]*xyz[i][0] + xyz[i][1]*xyz[i][1]) );\n        if (OMIT_MAG==1) {\n            aziElevR[i] = [azi,elev];\n        }\n        else {\n            r = Math.sqrt(xyz[i][0]*xyz[i][0] + xyz[i][1]*xyz[i][1] + xyz[i][2]*xyz[i][2]);\n            aziElevR[i] = [azi,elev,r];\n        }\n    }\n    return aziElevR;\n}\n\n// convertSph2Cart converts arrays of spherical coordinates to cartesian\nvar convertSph2Cart = function (aziElevR) {\n    \n    var x,y,z;\n    var xyz = new Array(aziElevR.length);\n    \n    for (var i=0; i<aziElevR.length; i++) {\n        x = Math.cos(aziElevR[i][0])*Math.cos(aziElevR[i][1]);\n        y = Math.sin(aziElevR[i][0])*Math.cos(aziElevR[i][1]);\n        z = Math.sin(aziElevR[i][1]);\n        if (aziElevR[0].length==2) xyz[i] = [x,y,z];\n        else if (aziElevR[0].length==3) xyz[i] = [aziElevR[i][2]*x,aziElevR[i][2]*y,aziElevR[i][2]*z];\n    }\n    return xyz;\n}\n\n// computeRealSH computes real spherical harmonics up to order N\nvar computeRealSH = function (N, data) {\n    \n    var azi = new Array(data.length);\n    var elev = new Array(data.length);\n    \n    for (var i=0; i<data.length; i++) {\n        azi[i] = data[i][0];\n        elev[i] = data[i][1];\n    }\n    \n    var factorials = new Array(2*N+1);\n    var Ndirs = azi.length;\n    var Nsh = (N+1)*(N+1);\n    var leg_n_minus1 = 0;\n    var leg_n_minus2 = 0;\n    var leg_n;\n    var sinel = numeric.sin(elev);\n    var index_n = 0;\n    var Y_N = new Array(Nsh);\n    var Nn0, Nnm;\n    var cosmazi, sinmazi;\n    \n    // precompute factorials\n    for (var i = 0; i < 2*N+1; i++) factorials[i] = factorial(i);\n    \n    for (var n = 0; n<N+1; n++) {\n        if (n==0) {\n            var temp0 = new Array(azi.length);\n            temp0.fill(1);\n            Y_N[n] = temp0;\n            index_n = 1;\n        }\n        else {\n            leg_n = recurseLegendrePoly(n, sinel, leg_n_minus1, leg_n_minus2);\n            Nn0 = Math.sqrt(2*n+1);\n            for (var m = 0; m<n+1; m++) {\n                if (m==0) Y_N[index_n+n] = numeric.mul(Nn0,leg_n[m]);\n                else {\n                    Nnm = Nn0*Math.sqrt( 2 * factorials[n-m]/factorials[n+m] );\n                    cosmazi = numeric.cos(numeric.mul(m,azi));\n                    sinmazi = numeric.sin(numeric.mul(m,azi));\n                    Y_N[index_n+n-m] = numeric.mul(Nnm, numeric.mul(leg_n[m], sinmazi));\n                    Y_N[index_n+n+m] = numeric.mul(Nnm, numeric.mul(leg_n[m], cosmazi));\n                }\n            }\n            index_n = index_n+2*n+1;\n        }\n        leg_n_minus2 = leg_n_minus1;\n        leg_n_minus1 = leg_n;\n    }\n    \n    return Y_N;\n}\n\n// factorial compute factorial\nvar factorial = function (n) {\n    if (n === 0) return 1;\n    return n * factorial(n - 1);\n}\n\n// recurseLegendrePoly computes associated Legendre functions recursively\nvar recurseLegendrePoly = function (n, x, Pnm_minus1, Pnm_minus2) {\n    \n    var Pnm = new Array(n+1);\n    switch(n) {\n        case 1:\n            var x2 = numeric.mul(x,x);\n            var P10 = x;\n            var P11 = numeric.sqrt(numeric.sub(1,x2));\n            Pnm[0] = P10;\n            Pnm[1] = P11;\n            break;\n        case 2:\n            var x2 = numeric.mul(x,x);\n            var P20 = numeric.mul(3,x2);\n            P20 = numeric.sub(P20,1);\n            P20 = numeric.div(P20,2);\n            var P21 = numeric.sub(1,x2);\n            P21 = numeric.sqrt(P21);\n            P21 = numeric.mul(3,P21);\n            P21 = numeric.mul(P21,x);\n            var P22 = numeric.sub(1,x2);\n            P22 = numeric.mul(3,P22);\n            Pnm[0] = P20;\n            Pnm[1] = P21;\n            Pnm[2] = P22;\n            break;\n        default:\n            var x2 = numeric.mul(x,x);\n            var one_min_x2 = numeric.sub(1,x2);\n            // last term m=n\n            var k = 2*n-1;\n            var dfact_k = 1;\n            if ((k % 2) == 0) {\n                for (var kk=1; kk<k/2+1; kk++) dfact_k = dfact_k*2*kk;\n            }\n            else {\n                for (var kk=1; kk<(k+1)/2+1; kk++) dfact_k = dfact_k*(2*kk-1);\n            }\n            Pnm[n] = numeric.mul(dfact_k, numeric.pow(one_min_x2, n/2));\n            // before last term\n            Pnm[n-1] = numeric.mul(2*n-1, numeric.mul(x, Pnm_minus1[n-1])); // P_{n(n-1)} = (2*n-1)*x*P_{(n-1)(n-1)}\n            // three term recursence for the rest\n            for (var m=0; m<n-1; m++) {\n                var temp1 = numeric.mul( 2*n-1, numeric.mul(x, Pnm_minus1[m]) );\n                var temp2 = numeric.mul( n+m-1, Pnm_minus2[m] );\n                Pnm[m] = numeric.div( numeric.sub(temp1, temp2), n-m); // P_l = ( (2l-1)xP_(l-1) - (l+m-1)P_(l-2) )/(l-m)\n            }\n    }\n    return Pnm;\n}\n\n// pinv_svd computes the pseudo-inverse using SVD\nvar pinv_svd = function (A) {\n    var z = numeric.svd(A), foo = z.S[0];\n    var U = z.U, S = z.S, V = z.V;\n    var m = A.length, n = A[0].length, tol = Math.max(m,n)*numeric.epsilon*foo,M = S.length;\n    var Sinv = new Array(M);\n    for(var i=M-1;i!==-1;i--) { if(S[i]>tol) Sinv[i] = 1/S[i]; else Sinv[i] = 0; }\n    return numeric.dot(numeric.dot(V,numeric.diag(Sinv)),numeric.transpose(U))\n}\n\n// pinv_direct computes the left pseudo-inverse\nvar pinv_direct = function (A) {\n    var AT = numeric.transpose(A);\n    return numeric.dot(numeric.inv(numeric.dot(AT,A)),AT);\n}\n\n// computes rotation matrices for real spherical harmonics\nvar getSHrotMtx = function (Rxyz, L) {\n    \n    var Nsh = (L+1)*(L+1);\n    // allocate total rotation matrix\n    var R = numeric.rep([Nsh,Nsh],0);\n    \n    // initialize zeroth and first band rotation matrices for recursion\n    // Rxyz = [Rxx Rxy Rxz\n    //         Ryx Ryy Ryz\n    //         Rzx Rzy Rzz]\n    //\n    // zeroth-band (l=0) is invariant to rotation\n    R[0][0] = 1;\n    \n    // the first band (l=1) is directly related to the rotation matrix\n    var R_1 = numeric.rep([3,3],0);\n    R_1[0][0] = Rxyz[1][1];\n    R_1[0][1] = Rxyz[1][2];\n    R_1[0][2] = Rxyz[1][0];\n    R_1[1][0] = Rxyz[2][1];\n    R_1[1][1] = Rxyz[2][2];\n    R_1[1][2] = Rxyz[2][0];\n    R_1[2][0] = Rxyz[0][1];\n    R_1[2][1] = Rxyz[0][2];\n    R_1[2][2] = Rxyz[0][0];\n    \n    R = numeric.setBlock(R, [1,1], [3,3], R_1);\n    var R_lm1 = R_1;\n    \n    // compute rotation matrix of each subsequent band recursively\n    var band_idx = 3;\n    for (var l=2; l<L+1; l++) {\n        \n        var R_l = numeric.rep([(2*l+1),(2*l+1)],0);\n        for (var m=-l; m<l+1; m++) {\n            for (var n=-l; n<l+1; n++) {\n                // compute u,v,w terms of Eq.8.1 (Table I)\n                var d, denom, u, v, w;\n                if (m==0) d = 1;\n                else d = 0; // the delta function d_m0\n                if (Math.abs(n)==l) denom = (2*l)*(2*l-1);\n                else denom = (l*l-n*n);\n                \n                u = Math.sqrt((l*l-m*m)/denom);\n                v = Math.sqrt((1+d)*(l+Math.abs(m)-1)*(l+Math.abs(m))/denom)*(1-2*d)*0.5;\n                w = Math.sqrt((l-Math.abs(m)-1)*(l-Math.abs(m))/denom)*(1-d)*(-0.5);\n                \n                // computes Eq.8.1\n                if (u!=0) u = u*U(l,m,n,R_1,R_lm1);\n                if (v!=0) v = v*V(l,m,n,R_1,R_lm1);\n                if (w!=0) w = w*W(l,m,n,R_1,R_lm1);\n                R_l[m+l][n+l] = u + v + w;\n            }\n        }\n        R = numeric.setBlock(R, [band_idx+1,band_idx+1], [band_idx+2*l+1,band_idx+2*l+1], R_l);\n        R_lm1 = R_l;\n        band_idx = band_idx + 2*l+1;\n    }\n    return R;\n}\n\n// functions to compute terms U, V, W of Eq.8.1 (Table II)\nfunction U(l,m,n,R_1,R_lm1) {\n    \n    return P(0,l,m,n,R_1,R_lm1);\n}\n\nfunction V(l,m,n,R_1,R_lm1) {\n    \n    var p0, p1, ret, d;\n    if (m==0) {\n        p0 = P(1,l,1,n,R_1,R_lm1);\n        p1 = P(-1,l,-1,n,R_1,R_lm1);\n        ret = p0+p1;\n    }\n    else if (m>0) {\n        if (m==1) d = 1;\n        else d = 0;\n        p0 = P(1,l,m-1,n,R_1,R_lm1);\n        p1 = P(-1,l,-m+1,n,R_1,R_lm1);\n        ret = p0*Math.sqrt(1+d) - p1*(1-d);\n    }\n    else {\n        if (m==-1) d = 1;\n        else d = 0;\n        p0 = P(1,l,m+1,n,R_1,R_lm1);\n        p1 = P(-1,l,-m-1,n,R_1,R_lm1);\n        ret = p0*(1-d) + p1*Math.sqrt(1+d);\n    }\n    return ret;\n}\n\nfunction W(l,m,n,R_1,R_lm1) {\n    \n    var p0, p1, ret;\n    if (m==0) {\n        console.error(\"should not be called\");\n    }\n    else {\n        if (m>0) {\n            p0 = P(1,l,m+1,n,R_1,R_lm1);\n            p1 = P(-1,l,-m-1,n,R_1,R_lm1);\n            ret = p0 + p1;\n        }\n        else {\n            p0 = P(1,l,m-1,n,R_1,R_lm1);\n            p1 = P(-1,l,-m+1,n,R_1,R_lm1);\n            ret = p0 - p1;\n        }\n    }\n    return ret;\n}\n\n// function to compute term P of U,V,W (Table II)\nfunction P(i,l,a,b,R_1,R_lm1) {\n    \n    var ri1, rim1, ri0, ret;\n    ri1 = R_1[i+1][1+1];\n    rim1 = R_1[i+1][-1+1];\n    ri0 = R_1[i+1][0+1];\n    \n    if (b==-l) {\n        ret = ri1*R_lm1[a+l-1][0] + rim1*R_lm1[a+l-1][2*l-2];\n    }\n    else {\n        if (b==l) ret = ri1*R_lm1[a+l-1][2*l-2] - rim1*R_lm1[a+l-1][0];\n        else ret = ri0*R_lm1[a+l-1][b+l-1];\n    }\n    return ret;\n}\n\n// yawPitchRoll2Rzyx computes the rotation matrix from ZY'X'' rotation angles\nvar yawPitchRoll2Rzyx = function (yaw, pitch, roll) {\n    \n    var Rx, Ry, Rz;\n    if (roll == 0) Rx = [[1,0,0],[0,1,0],[0,0,1]];\n    else Rx = [[1, 0, 0], [0, Math.cos(roll), Math.sin(roll)], [0, -Math.sin(roll), Math.cos(roll)]];\n    if (pitch == 0) Ry = [[1,0,0],[0,1,0],[0,0,1]];\n    else Ry = [[Math.cos(pitch), 0, -Math.sin(pitch)], [0, 1, 0], [Math.sin(pitch), 0, Math.cos(pitch)]];\n    if (yaw == 0) Rz = [[1,0,0],[0,1,0],[0,0,1]];\n    else Rz = [[Math.cos(yaw), Math.sin(yaw), 0], [-Math.sin(yaw), Math.cos(yaw), 0], [0, 0, 1]];\n    \n    var R = numeric.dotMMsmall(Ry,Rz);\n    R = numeric.dotMMsmall(Rx,R);\n    return R;\n}\n\n\n// exports\nmodule.exports.forwardSHT = forwardSHT;\nmodule.exports.inverseSHT = inverseSHT;\nmodule.exports.print2Darray = print2Darray;\nmodule.exports.convertCart2Sph = convertCart2Sph;\nmodule.exports.convertSph2Cart = convertSph2Cart;\nmodule.exports.computeRealSH = computeRealSH;\nmodule.exports.factorial = factorial;\nmodule.exports.recurseLegendrePoly = recurseLegendrePoly;\nmodule.exports.pinv_svd = pinv_svd;\nmodule.exports.pinv_direct = pinv_direct;\nmodule.exports.getSHrotMtx = getSHrotMtx;\nmodule.exports.yawPitchRoll2Rzyx = yawPitchRoll2Rzyx;\n\n},{\"numeric\":67}]},{},[16])(16)\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJkaXN0L2FtYmktYmluYXVyYWxEZWNvZGVyLmpzIiwiZGlzdC9hbWJpLWNvbnZlcnRlcnMuanMiLCJkaXN0L2FtYmktZGVjb2Rlci5qcyIsImRpc3QvYW1iaS1pbnRlbnNpdHlBbmFseXNlci5qcyIsImRpc3QvYW1iaS1tb25vRW5jb2Rlci5qcyIsImRpc3QvYW1iaS1vcmRlckxpbWl0ZXIuanMiLCJkaXN0L2FtYmktb3JkZXJXZWlnaHQuanMiLCJkaXN0L2FtYmktcG93ZXJtYXBBbmFseXNlci5qcyIsImRpc3QvYW1iaS1ybXNBbmFseXNlci5qcyIsImRpc3QvYW1iaS1zY2VuZU1pcnJvci5qcyIsImRpc3QvYW1iaS1zY2VuZVJvdGF0b3IuanMiLCJkaXN0L2FtYmktdmlydHVhbE1pYy5qcyIsImRpc3QvaG9hLWxvYWRlci5qcyIsImRpc3QvaHJpci1sb2FkZXJfaXJjYW0uanMiLCJkaXN0L2hyaXItbG9hZGVyX2xvY2FsLmpzIiwiZGlzdC9pbmRleC5qcyIsImRpc3QvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9jb3JlLWpzL29iamVjdC9kZWZpbmUtcHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9oZWxwZXJzL2NsYXNzQ2FsbENoZWNrLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jcmVhdGVDbGFzcy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYS1mdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jb3JlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19jdHguanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2Rlc2NyaXB0b3JzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19kb20tY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19leHBvcnQuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2ZhaWxzLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19nbG9iYWwuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2hpZGUuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX2llOC1kb20tZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL19pcy1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvYmFiZWwtcnVudGltZS9ub2RlX21vZHVsZXMvY29yZS1qcy9saWJyYXJ5L21vZHVsZXMvX29iamVjdC1kcC5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fcHJvcGVydHktZGVzYy5qcyIsIm5vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwibm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2NvbnZleC1odWxsL2NoLmpzIiwibm9kZV9tb2R1bGVzL2NvbnZleC1odWxsL2xpYi9jaDFkLmpzIiwibm9kZV9tb2R1bGVzL2NvbnZleC1odWxsL2xpYi9jaDJkLmpzIiwibm9kZV9tb2R1bGVzL2NvbnZleC1odWxsL2xpYi9jaG5kLmpzIiwibm9kZV9tb2R1bGVzL2NvbnZleC1odWxsL25vZGVfbW9kdWxlcy9hZmZpbmUtaHVsbC9hZmYuanMiLCJub2RlX21vZHVsZXMvY29udmV4LWh1bGwvbm9kZV9tb2R1bGVzL2FmZmluZS1odWxsL25vZGVfbW9kdWxlcy9yb2J1c3Qtb3JpZW50YXRpb24vbm9kZV9tb2R1bGVzL3JvYnVzdC1zY2FsZS9ub2RlX21vZHVsZXMvdHdvLXN1bS90d28tc3VtLmpzIiwibm9kZV9tb2R1bGVzL2NvbnZleC1odWxsL25vZGVfbW9kdWxlcy9hZmZpbmUtaHVsbC9ub2RlX21vZHVsZXMvcm9idXN0LW9yaWVudGF0aW9uL25vZGVfbW9kdWxlcy9yb2J1c3Qtc2NhbGUvcm9idXN0LXNjYWxlLmpzIiwibm9kZV9tb2R1bGVzL2NvbnZleC1odWxsL25vZGVfbW9kdWxlcy9hZmZpbmUtaHVsbC9ub2RlX21vZHVsZXMvcm9idXN0LW9yaWVudGF0aW9uL25vZGVfbW9kdWxlcy9yb2J1c3Qtc3VidHJhY3Qvcm9idXN0LWRpZmYuanMiLCJub2RlX21vZHVsZXMvY29udmV4LWh1bGwvbm9kZV9tb2R1bGVzL2FmZmluZS1odWxsL25vZGVfbW9kdWxlcy9yb2J1c3Qtb3JpZW50YXRpb24vbm9kZV9tb2R1bGVzL3JvYnVzdC1zdW0vcm9idXN0LXN1bS5qcyIsIm5vZGVfbW9kdWxlcy9jb252ZXgtaHVsbC9ub2RlX21vZHVsZXMvYWZmaW5lLWh1bGwvbm9kZV9tb2R1bGVzL3JvYnVzdC1vcmllbnRhdGlvbi9ub2RlX21vZHVsZXMvdHdvLXByb2R1Y3QvdHdvLXByb2R1Y3QuanMiLCJub2RlX21vZHVsZXMvY29udmV4LWh1bGwvbm9kZV9tb2R1bGVzL2FmZmluZS1odWxsL25vZGVfbW9kdWxlcy9yb2J1c3Qtb3JpZW50YXRpb24vb3JpZW50YXRpb24uanMiLCJub2RlX21vZHVsZXMvY29udmV4LWh1bGwvbm9kZV9tb2R1bGVzL2luY3JlbWVudGFsLWNvbnZleC1odWxsL2ljaC5qcyIsIm5vZGVfbW9kdWxlcy9jb252ZXgtaHVsbC9ub2RlX21vZHVsZXMvaW5jcmVtZW50YWwtY29udmV4LWh1bGwvbm9kZV9tb2R1bGVzL3NpbXBsaWNpYWwtY29tcGxleC9ub2RlX21vZHVsZXMvYml0LXR3aWRkbGUvdHdpZGRsZS5qcyIsIm5vZGVfbW9kdWxlcy9jb252ZXgtaHVsbC9ub2RlX21vZHVsZXMvaW5jcmVtZW50YWwtY29udmV4LWh1bGwvbm9kZV9tb2R1bGVzL3NpbXBsaWNpYWwtY29tcGxleC9ub2RlX21vZHVsZXMvdW5pb24tZmluZC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb252ZXgtaHVsbC9ub2RlX21vZHVsZXMvaW5jcmVtZW50YWwtY29udmV4LWh1bGwvbm9kZV9tb2R1bGVzL3NpbXBsaWNpYWwtY29tcGxleC90b3BvbG9neS5qcyIsIm5vZGVfbW9kdWxlcy9jb252ZXgtaHVsbC9ub2RlX21vZHVsZXMvbW9ub3RvbmUtY29udmV4LWh1bGwtMmQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZ2V0LWZsb2F0LXRpbWUtZG9tYWluLWRhdGEvbGliL2dldC1mbG9hdC10aW1lLWRvbWFpbi1kYXRhLmpzIiwibm9kZV9tb2R1bGVzL251bWVyaWMvbnVtZXJpYy0xLjIuNi5qcyIsIm5vZGVfbW9kdWxlcy9zZXJ2ZS1zb2ZhLWhyaXIvZGlzdC9hdWRpby91dGlsaXRpZXMuanMiLCJub2RlX21vZHVsZXMvc2VydmUtc29mYS1ocmlyL2Rpc3QvZ2VvbWV0cnkvS2RUcmVlLmpzIiwibm9kZV9tb2R1bGVzL3NlcnZlLXNvZmEtaHJpci9kaXN0L2dlb21ldHJ5L2Nvb3JkaW5hdGVzLmpzIiwibm9kZV9tb2R1bGVzL3NlcnZlLXNvZmEtaHJpci9kaXN0L2dlb21ldHJ5L2RlZ3JlZS5qcyIsIm5vZGVfbW9kdWxlcy9zZXJ2ZS1zb2ZhLWhyaXIvZGlzdC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9zZXJ2ZS1zb2ZhLWhyaXIvZGlzdC9pbmZvLmpzIiwibm9kZV9tb2R1bGVzL3NlcnZlLXNvZmEtaHJpci9kaXN0L3NvZmEvSHJ0ZlNldC5qcyIsIm5vZGVfbW9kdWxlcy9zZXJ2ZS1zb2ZhLWhyaXIvZGlzdC9zb2ZhL1NlcnZlckRhdGFCYXNlLmpzIiwibm9kZV9tb2R1bGVzL3NlcnZlLXNvZmEtaHJpci9kaXN0L3NvZmEvcGFyc2VEYXRhU2V0LmpzIiwibm9kZV9tb2R1bGVzL3NlcnZlLXNvZmEtaHJpci9kaXN0L3NvZmEvcGFyc2VTb2ZhLmpzIiwibm9kZV9tb2R1bGVzL3NlcnZlLXNvZmEtaHJpci9kaXN0L3NvZmEvcGFyc2VYbWwuanMiLCJub2RlX21vZHVsZXMvc2VydmUtc29mYS1ocmlyL25vZGVfbW9kdWxlcy9mcmFjdGlvbmFsLWRlbGF5L2Rpc3QvZXM2L2ZyYWN0aW9uYWwtZGVsYXkuanMiLCJub2RlX21vZHVsZXMvc2VydmUtc29mYS1ocmlyL25vZGVfbW9kdWxlcy9mcmFjdGlvbmFsLWRlbGF5L2ZyYWN0aW9uYWwtZGVsYXkuanMiLCJub2RlX21vZHVsZXMvc2VydmUtc29mYS1ocmlyL25vZGVfbW9kdWxlcy9mcmFjdGlvbmFsLWRlbGF5L25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL2hlbHBlcnMvY2xhc3MtY2FsbC1jaGVjay5qcyIsIm5vZGVfbW9kdWxlcy9zZXJ2ZS1zb2ZhLWhyaXIvbm9kZV9tb2R1bGVzL2ZyYWN0aW9uYWwtZGVsYXkvbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvaGVscGVycy9jcmVhdGUtY2xhc3MuanMiLCJub2RlX21vZHVsZXMvc2VydmUtc29mYS1ocmlyL25vZGVfbW9kdWxlcy9mcmFjdGlvbmFsLWRlbGF5L25vZGVfbW9kdWxlcy9iYWJlbC1ydW50aW1lL25vZGVfbW9kdWxlcy9jb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2RlZmluZS1wcm9wZXJ0eS5qcyIsIm5vZGVfbW9kdWxlcy9zZXJ2ZS1zb2ZhLWhyaXIvbm9kZV9tb2R1bGVzL2ZyYWN0aW9uYWwtZGVsYXkvbm9kZV9tb2R1bGVzL2JhYmVsLXJ1bnRpbWUvbm9kZV9tb2R1bGVzL2NvcmUtanMvbGlicmFyeS9tb2R1bGVzLyQuanMiLCJub2RlX21vZHVsZXMvc2VydmUtc29mYS1ocmlyL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvc3JjL2dsLW1hdHJpeC5qcyIsIm5vZGVfbW9kdWxlcy9zZXJ2ZS1zb2ZhLWhyaXIvbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9zcmMvZ2wtbWF0cml4L2NvbW1vbi5qcyIsIm5vZGVfbW9kdWxlcy9zZXJ2ZS1zb2ZhLWhyaXIvbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9zcmMvZ2wtbWF0cml4L21hdDIuanMiLCJub2RlX21vZHVsZXMvc2VydmUtc29mYS1ocmlyL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvc3JjL2dsLW1hdHJpeC9tYXQyZC5qcyIsIm5vZGVfbW9kdWxlcy9zZXJ2ZS1zb2ZhLWhyaXIvbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9zcmMvZ2wtbWF0cml4L21hdDMuanMiLCJub2RlX21vZHVsZXMvc2VydmUtc29mYS1ocmlyL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvc3JjL2dsLW1hdHJpeC9tYXQ0LmpzIiwibm9kZV9tb2R1bGVzL3NlcnZlLXNvZmEtaHJpci9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L3NyYy9nbC1tYXRyaXgvcXVhdC5qcyIsIm5vZGVfbW9kdWxlcy9zZXJ2ZS1zb2ZhLWhyaXIvbm9kZV9tb2R1bGVzL2dsLW1hdHJpeC9zcmMvZ2wtbWF0cml4L3ZlYzIuanMiLCJub2RlX21vZHVsZXMvc2VydmUtc29mYS1ocmlyL25vZGVfbW9kdWxlcy9nbC1tYXRyaXgvc3JjL2dsLW1hdHJpeC92ZWMzLmpzIiwibm9kZV9tb2R1bGVzL3NlcnZlLXNvZmEtaHJpci9ub2RlX21vZHVsZXMvZ2wtbWF0cml4L3NyYy9nbC1tYXRyaXgvdmVjNC5qcyIsIm5vZGVfbW9kdWxlcy9zZXJ2ZS1zb2ZhLWhyaXIvbm9kZV9tb2R1bGVzL2tkLnRyZWUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc2VydmUtc29mYS1ocmlyL3BhY2thZ2UuanNvbiIsIm5vZGVfbW9kdWxlcy9zcGhlcmljYWwtaGFybW9uaWMtdHJhbnNmb3JtL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQ2lCcUIsVTtBQUVqQix3QkFBWSxRQUFaLEVBQXNCLEtBQXRCLEVBQTZCO0FBQUE7OztBQUV6QixhQUFLLFdBQUwsR0FBbUIsS0FBbkI7O0FBRUEsYUFBSyxHQUFMLEdBQVcsUUFBWDtBQUNBLGFBQUssS0FBTCxHQUFhLEtBQWI7QUFDQSxhQUFLLEdBQUwsR0FBVyxDQUFDLFFBQVEsQ0FBVCxLQUFlLFFBQVEsQ0FBdkIsQ0FBWDtBQUNBLGFBQUssVUFBTCxHQUFrQixJQUFJLEtBQUosQ0FBVSxLQUFLLEdBQWYsQ0FBbEI7QUFDQSxhQUFLLGNBQUwsR0FBc0IsSUFBSSxLQUFKLENBQVUsS0FBSyxHQUFmLENBQXRCOztBQUVBLGFBQUssRUFBTCxHQUFVLEtBQUssR0FBTCxDQUFTLHFCQUFULENBQStCLEtBQUssR0FBcEMsQ0FBVjtBQUNBLGFBQUssR0FBTCxHQUFXLEtBQUssR0FBTCxDQUFTLG1CQUFULENBQTZCLENBQTdCLENBQVg7QUFDQSxhQUFLLEdBQUwsQ0FBUyxnQkFBVCxHQUE0QixVQUE1QjtBQUNBLGFBQUssR0FBTCxDQUFTLFlBQVQsR0FBd0IsQ0FBeEI7O0FBRUEsYUFBSyxPQUFMLEdBQWUsS0FBSyxHQUFMLENBQVMsVUFBVCxFQUFmO0FBQ0EsYUFBSyxRQUFMLEdBQWdCLEtBQUssR0FBTCxDQUFTLFVBQVQsRUFBaEI7QUFDQSxhQUFLLFVBQUwsR0FBa0IsS0FBSyxHQUFMLENBQVMsVUFBVCxFQUFsQjtBQUNBLGFBQUssT0FBTCxDQUFhLElBQWIsQ0FBa0IsS0FBbEIsR0FBMEIsQ0FBMUI7QUFDQSxhQUFLLFFBQUwsQ0FBYyxJQUFkLENBQW1CLEtBQW5CLEdBQTJCLENBQTNCO0FBQ0EsYUFBSyxVQUFMLENBQWdCLElBQWhCLENBQXFCLEtBQXJCLEdBQTZCLENBQUMsQ0FBOUI7O0FBRUEsYUFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEtBQUssR0FBekIsRUFBOEIsR0FBOUIsRUFBbUM7QUFDL0IsaUJBQUssY0FBTCxDQUFvQixDQUFwQixJQUF5QixLQUFLLEdBQUwsQ0FBUyxlQUFULEVBQXpCO0FBQ0EsaUJBQUssY0FBTCxDQUFvQixDQUFwQixFQUF1QixTQUF2QixHQUFtQyxLQUFuQztBQUNIOztBQUVELGFBQUssWUFBTDs7QUFFQSxhQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksS0FBSyxHQUF6QixFQUE4QixHQUE5QixFQUFtQztBQUMvQixpQkFBSyxFQUFMLENBQVEsT0FBUixDQUFnQixLQUFLLGNBQUwsQ0FBb0IsQ0FBcEIsQ0FBaEIsRUFBd0MsQ0FBeEMsRUFBMkMsQ0FBM0M7QUFDQSxnQkFBSSxJQUFJLEtBQUssS0FBTCxDQUFXLEtBQUssSUFBTCxDQUFVLENBQVYsQ0FBWCxDQUFSO0FBQ0EsZ0JBQUksSUFBSSxJQUFJLElBQUksQ0FBUixHQUFZLENBQXBCO0FBQ0EsZ0JBQUksS0FBSyxDQUFULEVBQVksS0FBSyxjQUFMLENBQW9CLENBQXBCLEVBQXVCLE9BQXZCLENBQStCLEtBQUssT0FBcEMsRUFBWixLQUNLLEtBQUssY0FBTCxDQUFvQixDQUFwQixFQUF1QixPQUF2QixDQUErQixLQUFLLFFBQXBDO0FBQ1I7QUFDRCxhQUFLLE9BQUwsQ0FBYSxPQUFiLENBQXFCLEtBQUssR0FBMUIsRUFBK0IsQ0FBL0IsRUFBa0MsQ0FBbEM7QUFDQSxhQUFLLFFBQUwsQ0FBYyxPQUFkLENBQXNCLEtBQUssR0FBM0IsRUFBZ0MsQ0FBaEMsRUFBbUMsQ0FBbkM7O0FBRUEsYUFBSyxPQUFMLENBQWEsT0FBYixDQUFxQixLQUFLLEdBQTFCLEVBQStCLENBQS9CLEVBQWtDLENBQWxDO0FBQ0EsYUFBSyxRQUFMLENBQWMsT0FBZCxDQUFzQixLQUFLLFVBQTNCLEVBQXVDLENBQXZDLEVBQTBDLENBQTFDO0FBQ0EsYUFBSyxVQUFMLENBQWdCLE9BQWhCLENBQXdCLEtBQUssR0FBN0IsRUFBa0MsQ0FBbEMsRUFBcUMsQ0FBckM7O0FBRUEsYUFBSyxXQUFMLEdBQW1CLElBQW5CO0FBQ0g7Ozs7c0NBRWEsVyxFQUFhOztBQUV2QixpQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEtBQUssR0FBekIsRUFBOEIsR0FBOUIsRUFBbUM7QUFDL0IscUJBQUssVUFBTCxDQUFnQixDQUFoQixJQUFxQixLQUFLLEdBQUwsQ0FBUyxZQUFULENBQXNCLENBQXRCLEVBQXlCLFlBQVksTUFBckMsRUFBNkMsWUFBWSxVQUF6RCxDQUFyQjtBQUNBLHFCQUFLLFVBQUwsQ0FBZ0IsQ0FBaEIsRUFBbUIsY0FBbkIsQ0FBa0MsQ0FBbEMsRUFBcUMsR0FBckMsQ0FBeUMsWUFBWSxjQUFaLENBQTJCLENBQTNCLENBQXpDOztBQUVBLHFCQUFLLGNBQUwsQ0FBb0IsQ0FBcEIsRUFBdUIsTUFBdkIsR0FBZ0MsS0FBSyxVQUFMLENBQWdCLENBQWhCLENBQWhDO0FBQ0g7QUFDSjs7O3VDQUVjOztBQUVYLGdCQUFJLFlBQVksSUFBSSxLQUFKLENBQVUsS0FBSyxHQUFmLENBQWhCO0FBQ0Esc0JBQVUsSUFBVixDQUFlLENBQWY7QUFDQSxzQkFBVSxDQUFWLElBQWUsR0FBZjtBQUNBLHNCQUFVLENBQVYsSUFBZSxNQUFNLEtBQUssSUFBTCxDQUFVLENBQVYsQ0FBckI7QUFDQSxpQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEtBQUssR0FBekIsRUFBOEIsR0FBOUIsRUFBbUM7Ozs7Ozs7QUFPL0IscUJBQUssVUFBTCxDQUFnQixDQUFoQixJQUFxQixLQUFLLEdBQUwsQ0FBUyxZQUFULENBQXNCLENBQXRCLEVBQXlCLEVBQXpCLEVBQTZCLEtBQUssR0FBTCxDQUFTLFVBQXRDLENBQXJCOztBQUVBLHFCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksRUFBcEIsRUFBd0IsR0FBeEIsRUFBNkI7QUFDekIseUJBQUssVUFBTCxDQUFnQixDQUFoQixFQUFtQixjQUFuQixDQUFrQyxDQUFsQyxFQUFxQyxDQUFyQyxJQUEwQyxHQUExQztBQUNIO0FBQ0QscUJBQUssVUFBTCxDQUFnQixDQUFoQixFQUFtQixjQUFuQixDQUFrQyxDQUFsQyxFQUFxQyxDQUFyQyxJQUEwQyxVQUFVLENBQVYsQ0FBMUM7O0FBRUEscUJBQUssY0FBTCxDQUFvQixDQUFwQixFQUF1QixNQUF2QixHQUFnQyxLQUFLLFVBQUwsQ0FBZ0IsQ0FBaEIsQ0FBaEM7QUFDSDtBQUNKOzs7OztrQkFoRmdCLFU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQ0RSLFEsV0FBQSxRLEdBRVQsa0JBQVksUUFBWixFQUFzQjtBQUFBOzs7QUFFbEIsU0FBSyxHQUFMLEdBQVcsUUFBWDtBQUNBLFNBQUssRUFBTCxHQUFVLEtBQUssR0FBTCxDQUFTLHFCQUFULENBQStCLENBQS9CLENBQVY7QUFDQSxTQUFLLEdBQUwsR0FBVyxLQUFLLEdBQUwsQ0FBUyxtQkFBVCxDQUE2QixDQUE3QixDQUFYO0FBQ0EsU0FBSyxLQUFMLEdBQWEsSUFBSSxLQUFKLENBQVUsQ0FBVixDQUFiOztBQUVBLFNBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxDQUFwQixFQUF1QixHQUF2QixFQUE0QjtBQUN4QixhQUFLLEtBQUwsQ0FBVyxDQUFYLElBQWdCLEtBQUssR0FBTCxDQUFTLFVBQVQsRUFBaEI7QUFDQSxZQUFJLEtBQUssQ0FBVCxFQUFZLEtBQUssS0FBTCxDQUFXLENBQVgsRUFBYyxJQUFkLENBQW1CLEtBQW5CLEdBQTJCLEtBQUssS0FBaEMsQ0FBWixLQUNLLEtBQUssS0FBTCxDQUFXLENBQVgsRUFBYyxJQUFkLENBQW1CLEtBQW5CLEdBQTJCLEtBQUssSUFBTCxDQUFVLENBQVYsQ0FBM0I7O0FBRUwsYUFBSyxLQUFMLENBQVcsQ0FBWCxFQUFjLE9BQWQsQ0FBc0IsS0FBSyxHQUEzQixFQUFnQyxDQUFoQyxFQUFtQyxDQUFuQztBQUNIO0FBQ0QsU0FBSyxFQUFMLENBQVEsT0FBUixDQUFnQixLQUFLLEtBQUwsQ0FBVyxDQUFYLENBQWhCLEVBQStCLENBQS9CLEVBQWtDLENBQWxDO0FBQ0EsU0FBSyxFQUFMLENBQVEsT0FBUixDQUFnQixLQUFLLEtBQUwsQ0FBVyxDQUFYLENBQWhCLEVBQStCLENBQS9CLEVBQWtDLENBQWxDO0FBQ0EsU0FBSyxFQUFMLENBQVEsT0FBUixDQUFnQixLQUFLLEtBQUwsQ0FBVyxDQUFYLENBQWhCLEVBQStCLENBQS9CLEVBQWtDLENBQWxDO0FBQ0EsU0FBSyxFQUFMLENBQVEsT0FBUixDQUFnQixLQUFLLEtBQUwsQ0FBVyxDQUFYLENBQWhCLEVBQStCLENBQS9CLEVBQWtDLENBQWxDO0FBQ0gsQzs7Ozs7OztJQU1RLFEsV0FBQSxRLEdBRVQsa0JBQVksUUFBWixFQUFzQjtBQUFBOzs7QUFFbEIsU0FBSyxHQUFMLEdBQVcsUUFBWDtBQUNBLFNBQUssRUFBTCxHQUFVLEtBQUssR0FBTCxDQUFTLHFCQUFULENBQStCLENBQS9CLENBQVY7QUFDQSxTQUFLLEdBQUwsR0FBVyxLQUFLLEdBQUwsQ0FBUyxtQkFBVCxDQUE2QixDQUE3QixDQUFYO0FBQ0EsU0FBSyxLQUFMLEdBQWEsSUFBSSxLQUFKLENBQVUsQ0FBVixDQUFiOztBQUVBLFNBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxDQUFwQixFQUF1QixHQUF2QixFQUE0QjtBQUN4QixhQUFLLEtBQUwsQ0FBVyxDQUFYLElBQWdCLEtBQUssR0FBTCxDQUFTLFVBQVQsRUFBaEI7QUFDQSxZQUFJLEtBQUssQ0FBVCxFQUFZLEtBQUssS0FBTCxDQUFXLENBQVgsRUFBYyxJQUFkLENBQW1CLEtBQW5CLEdBQTJCLEtBQUssT0FBaEMsQ0FBWixLQUNLLEtBQUssS0FBTCxDQUFXLENBQVgsRUFBYyxJQUFkLENBQW1CLEtBQW5CLEdBQTJCLElBQUksS0FBSyxJQUFMLENBQVUsQ0FBVixDQUEvQjs7QUFFTCxhQUFLLEtBQUwsQ0FBVyxDQUFYLEVBQWMsT0FBZCxDQUFzQixLQUFLLEdBQTNCLEVBQWdDLENBQWhDLEVBQW1DLENBQW5DO0FBQ0g7QUFDRCxTQUFLLEVBQUwsQ0FBUSxPQUFSLENBQWdCLEtBQUssS0FBTCxDQUFXLENBQVgsQ0FBaEIsRUFBK0IsQ0FBL0IsRUFBa0MsQ0FBbEM7QUFDQSxTQUFLLEVBQUwsQ0FBUSxPQUFSLENBQWdCLEtBQUssS0FBTCxDQUFXLENBQVgsQ0FBaEIsRUFBK0IsQ0FBL0IsRUFBa0MsQ0FBbEM7QUFDQSxTQUFLLEVBQUwsQ0FBUSxPQUFSLENBQWdCLEtBQUssS0FBTCxDQUFXLENBQVgsQ0FBaEIsRUFBK0IsQ0FBL0IsRUFBa0MsQ0FBbEM7QUFDQSxTQUFLLEVBQUwsQ0FBUSxPQUFSLENBQWdCLEtBQUssS0FBTCxDQUFXLENBQVgsQ0FBaEIsRUFBK0IsQ0FBL0IsRUFBa0MsQ0FBbEM7QUFDSCxDOzs7Ozs7O0lBT1EsUSxXQUFBLFEsR0FFVCxrQkFBWSxRQUFaLEVBQXNCLEtBQXRCLEVBQTZCO0FBQUE7OztBQUV6QixTQUFLLEdBQUwsR0FBVyxRQUFYO0FBQ0EsU0FBSyxLQUFMLEdBQWEsS0FBYjtBQUNBLFNBQUssR0FBTCxHQUFXLENBQUMsUUFBUSxDQUFULEtBQWUsUUFBUSxDQUF2QixDQUFYO0FBQ0EsU0FBSyxFQUFMLEdBQVUsS0FBSyxHQUFMLENBQVMscUJBQVQsQ0FBK0IsS0FBSyxHQUFwQyxDQUFWO0FBQ0EsU0FBSyxHQUFMLEdBQVcsS0FBSyxHQUFMLENBQVMsbUJBQVQsQ0FBNkIsS0FBSyxHQUFsQyxDQUFYO0FBQ0EsU0FBSyxLQUFMLEdBQWEsSUFBSSxLQUFKLENBQVUsS0FBSyxHQUFmLENBQWI7O0FBRUEsU0FBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEtBQUssR0FBekIsRUFBOEIsR0FBOUIsRUFBbUM7QUFDL0IsWUFBSSxJQUFJLEtBQUssS0FBTCxDQUFXLEtBQUssSUFBTCxDQUFVLENBQVYsQ0FBWCxDQUFSOztBQUVBLGFBQUssS0FBTCxDQUFXLENBQVgsSUFBZ0IsS0FBSyxHQUFMLENBQVMsVUFBVCxFQUFoQjtBQUNBLGFBQUssS0FBTCxDQUFXLENBQVgsRUFBYyxJQUFkLENBQW1CLEtBQW5CLEdBQTJCLEtBQUssSUFBTCxDQUFVLElBQUUsQ0FBRixHQUFJLENBQWQsQ0FBM0I7O0FBRUEsYUFBSyxFQUFMLENBQVEsT0FBUixDQUFnQixLQUFLLEtBQUwsQ0FBVyxDQUFYLENBQWhCLEVBQStCLENBQS9CLEVBQWtDLENBQWxDO0FBQ0EsYUFBSyxLQUFMLENBQVcsQ0FBWCxFQUFjLE9BQWQsQ0FBc0IsS0FBSyxHQUEzQixFQUFnQyxDQUFoQyxFQUFtQyxDQUFuQztBQUNIO0FBQ0osQzs7Ozs7OztJQU1RLFEsV0FBQSxRLEdBRVQsa0JBQVksUUFBWixFQUFzQixLQUF0QixFQUE2QjtBQUFBOzs7QUFFekIsU0FBSyxHQUFMLEdBQVcsUUFBWDtBQUNBLFNBQUssS0FBTCxHQUFhLEtBQWI7QUFDQSxTQUFLLEdBQUwsR0FBVyxDQUFDLFFBQVEsQ0FBVCxLQUFlLFFBQVEsQ0FBdkIsQ0FBWDtBQUNBLFNBQUssRUFBTCxHQUFVLEtBQUssR0FBTCxDQUFTLHFCQUFULENBQStCLEtBQUssR0FBcEMsQ0FBVjtBQUNBLFNBQUssR0FBTCxHQUFXLEtBQUssR0FBTCxDQUFTLG1CQUFULENBQTZCLEtBQUssR0FBbEMsQ0FBWDtBQUNBLFNBQUssS0FBTCxHQUFhLElBQUksS0FBSixDQUFVLEtBQUssR0FBZixDQUFiOztBQUVBLFNBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxLQUFLLEdBQXpCLEVBQThCLEdBQTlCLEVBQW1DO0FBQy9CLFlBQUksSUFBSSxLQUFLLEtBQUwsQ0FBVyxLQUFLLElBQUwsQ0FBVSxDQUFWLENBQVgsQ0FBUjs7QUFFQSxhQUFLLEtBQUwsQ0FBVyxDQUFYLElBQWdCLEtBQUssR0FBTCxDQUFTLFVBQVQsRUFBaEI7QUFDQSxhQUFLLEtBQUwsQ0FBVyxDQUFYLEVBQWMsSUFBZCxDQUFtQixLQUFuQixHQUEyQixJQUFFLEtBQUssSUFBTCxDQUFVLElBQUUsQ0FBRixHQUFJLENBQWQsQ0FBN0I7O0FBRUEsYUFBSyxFQUFMLENBQVEsT0FBUixDQUFnQixLQUFLLEtBQUwsQ0FBVyxDQUFYLENBQWhCLEVBQStCLENBQS9CLEVBQWtDLENBQWxDO0FBQ0EsYUFBSyxLQUFMLENBQVcsQ0FBWCxFQUFjLE9BQWQsQ0FBc0IsS0FBSyxHQUEzQixFQUFnQyxDQUFoQyxFQUFtQyxDQUFuQztBQUNIO0FBQ0osQzs7Ozs7OztJQU9RLFEsV0FBQSxRLEdBRVQsa0JBQVksUUFBWixFQUFzQixLQUF0QixFQUE2QjtBQUFBOzs7QUFFekIsUUFBSSxRQUFNLENBQVYsRUFBYTtBQUNULGdCQUFRLEdBQVIsQ0FBWSxnREFBWjtBQUNBLGdCQUFRLENBQVI7QUFDSDs7Ozs7OztBQU9ELFFBQUksaUJBQWlCLENBQUMsS0FBSyxJQUFMLENBQVUsQ0FBVixDQUFELEU7QUFDQyxTQUFLLElBQUwsQ0FBVSxDQUFWLENBREQsRTtBQUVDLFNBQUssSUFBTCxDQUFVLENBQVYsQ0FGRCxFO0FBR0MsU0FBSyxJQUFMLENBQVUsQ0FBVixDQUhELEU7QUFJQyxTQUFLLElBQUwsQ0FBVSxFQUFWLElBQWMsQ0FKZixFO0FBS0MsU0FBSyxJQUFMLENBQVUsRUFBVixJQUFjLENBTGYsRTtBQU1DLFNBQUssSUFBTCxDQUFVLENBQVYsQ0FORCxFO0FBT0MsU0FBSyxJQUFMLENBQVUsRUFBVixJQUFjLENBUGYsRTtBQVFDLFNBQUssSUFBTCxDQUFVLEVBQVYsSUFBYyxDQVJmLEU7QUFTQyxTQUFLLElBQUwsQ0FBVSxLQUFHLENBQWIsQ0FURCxFO0FBVUMsU0FBSyxJQUFMLENBQVUsRUFBVixJQUFjLENBVmYsRTtBQVdDLFNBQUssSUFBTCxDQUFVLE1BQUksRUFBZCxDQVhELEU7QUFZQyxTQUFLLElBQUwsQ0FBVSxDQUFWLENBWkQsRTtBQWFDLFNBQUssSUFBTCxDQUFVLE1BQUksRUFBZCxDQWJELEU7QUFjQyxTQUFLLElBQUwsQ0FBVSxFQUFWLElBQWMsQ0FkZixFO0FBZUMsU0FBSyxJQUFMLENBQVUsS0FBRyxDQUFiLENBZkQsQ0FBckIsQzs7QUFpQkEsU0FBSyxHQUFMLEdBQVcsUUFBWDtBQUNBLFNBQUssS0FBTCxHQUFhLEtBQWI7QUFDQSxTQUFLLEdBQUwsR0FBVyxDQUFDLFFBQVEsQ0FBVCxLQUFlLFFBQVEsQ0FBdkIsQ0FBWDtBQUNBLFNBQUssRUFBTCxHQUFVLEtBQUssR0FBTCxDQUFTLHFCQUFULENBQStCLEtBQUssR0FBcEMsQ0FBVjtBQUNBLFNBQUssR0FBTCxHQUFXLEtBQUssR0FBTCxDQUFTLG1CQUFULENBQTZCLEtBQUssR0FBbEMsQ0FBWDtBQUNBLFNBQUssS0FBTCxHQUFhLEVBQWI7QUFDQSxTQUFLLFVBQUwsR0FBa0IsRUFBbEI7OztBQUdBLFNBQUssVUFBTCxDQUFnQixJQUFoQixDQUFxQixDQUFyQixFQUF3QixDQUF4QixFQUEyQixDQUEzQixFQUE4QixDQUE5QixFOzs7QUFHQSxRQUFJLFFBQU0sQ0FBVixFQUFhO0FBQ1QsWUFBSSxJQUFJLENBQVI7QUFDQSxZQUFJLENBQUo7QUFDQSxhQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksS0FBSyxHQUF6QixFQUE4QixHQUE5QixFQUFtQztBQUMvQixnQkFBSSxFQUFKO0FBQ0EsZ0JBQUksS0FBSyxDQUFDLElBQUksQ0FBTCxLQUFXLElBQUksQ0FBZixDQUFULEVBQTRCO0FBQ3hCLHFCQUFLLENBQUw7QUFDQSxxQkFBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUwsS0FBVyxJQUFJLENBQWYsQ0FBYixFQUFnQyxJQUFJLENBQUMsSUFBSSxDQUFMLEtBQVcsSUFBSSxDQUFmLENBQXBDLEVBQXVELEdBQXZELEVBQTREO0FBQ3hELHdCQUFLLENBQUMsSUFBSSxJQUFJLENBQVQsSUFBYyxDQUFmLElBQXFCLENBQXpCLEVBQTRCO0FBQUUsMEJBQUUsSUFBRixDQUFPLENBQVA7QUFBVyxxQkFBekMsTUFBK0M7QUFBRSwwQkFBRSxPQUFGLENBQVUsQ0FBVjtBQUFjO0FBQ2xFO0FBQ0QscUJBQUssVUFBTCxHQUFrQixLQUFLLFVBQUwsQ0FBZ0IsTUFBaEIsQ0FBdUIsQ0FBdkIsQ0FBbEI7QUFDSDtBQUNKO0FBQ0o7OztBQUdELFNBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxLQUFLLEdBQXpCLEVBQThCLEdBQTlCLEVBQW1DO0FBQy9CLGFBQUssS0FBTCxDQUFXLENBQVgsSUFBZ0IsS0FBSyxHQUFMLENBQVMsVUFBVCxFQUFoQjtBQUNBLGFBQUssS0FBTCxDQUFXLENBQVgsRUFBYyxJQUFkLENBQW1CLEtBQW5CLEdBQTJCLGVBQWUsQ0FBZixDQUEzQjtBQUNBLGFBQUssRUFBTCxDQUFRLE9BQVIsQ0FBZ0IsS0FBSyxLQUFMLENBQVcsQ0FBWCxDQUFoQixFQUErQixLQUFLLFVBQUwsQ0FBZ0IsQ0FBaEIsQ0FBL0IsRUFBbUQsQ0FBbkQ7QUFDQSxhQUFLLEtBQUwsQ0FBVyxDQUFYLEVBQWMsT0FBZCxDQUFzQixLQUFLLEdBQTNCLEVBQWdDLENBQWhDLEVBQW1DLENBQW5DO0FBQ0g7QUFDSixDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxS0wsSUFBSSxRQUFRLFFBQVEsWUFBUixDQUFaOztJQUVxQixPO0FBRWpCLHFCQUFZLFFBQVosRUFBc0IsS0FBdEIsRUFBNkI7QUFBQTs7OztBQUd6QixhQUFLLEdBQUwsR0FBVyxRQUFYO0FBQ0EsYUFBSyxLQUFMLEdBQWEsS0FBYjtBQUNBLGFBQUssR0FBTCxHQUFXLENBQUMsUUFBUSxDQUFULEtBQWUsUUFBUSxDQUF2QixDQUFYO0FBQ0EsYUFBSyxJQUFMLEdBQVksQ0FBWjtBQUNBLGFBQUssZUFBTCxHQUF1QixFQUF2QjtBQUNBLGFBQUssZUFBTCxHQUF1QixFQUF2Qjs7O0FBR0EsYUFBSyxFQUFMLEdBQVUsS0FBSyxHQUFMLENBQVMscUJBQVQsQ0FBK0IsS0FBSyxHQUFwQyxDQUFWO0FBQ0EsYUFBSyxHQUFMLEdBQVcsS0FBSyxHQUFMLENBQVMsbUJBQVQsQ0FBNkIsQ0FBN0IsQ0FBWCxDOzs7QUFHQSxhQUFLLGVBQUwsR0FBdUIsS0FBSyxvQkFBTCxDQUEwQixLQUFLLEtBQS9CLENBQXZCO0FBQ0EsYUFBSyxnQkFBTCxDQUF1QixLQUFLLGVBQTVCO0FBQ0g7Ozs7Ozs7Ozs7eUNBZ0JnQixjLEVBQWU7OztBQUc1QixpQkFBSyxJQUFMLEdBQVksZUFBZSxNQUEzQjtBQUNBLGlCQUFLLEdBQUwsR0FBVyxLQUFLLEdBQUwsQ0FBUyxtQkFBVCxDQUE2QixLQUFLLElBQWxDLENBQVg7OztBQUdBLGlCQUFLLGVBQUwsR0FBdUIsTUFBTSxrQkFBTixDQUF5QixjQUF6QixFQUF5QyxLQUFLLEtBQTlDLENBQXZCOzs7QUFHQSxpQkFBSyxPQUFMLEdBQWUsSUFBSSxLQUFKLENBQVUsS0FBSyxHQUFmLENBQWY7QUFDQSxpQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEtBQUssR0FBekIsRUFBOEIsR0FBOUIsRUFBbUM7QUFDL0IscUJBQUssT0FBTCxDQUFhLENBQWIsSUFBa0IsSUFBSSxLQUFKLENBQVUsS0FBSyxJQUFmLENBQWxCO0FBQ0EscUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxLQUFLLElBQXpCLEVBQStCLEdBQS9CLEVBQW9DOztBQUVoQyx3QkFBSSxJQUFJLEtBQUssR0FBTCxDQUFTLFVBQVQsRUFBUjtBQUNBLHNCQUFFLElBQUYsQ0FBTyxLQUFQLEdBQWUsS0FBSyxlQUFMLENBQXFCLENBQXJCLEVBQXdCLENBQXhCLENBQWY7O0FBRUEseUJBQUssRUFBTCxDQUFRLE9BQVIsQ0FBZ0IsQ0FBaEIsRUFBbUIsQ0FBbkIsRUFBc0IsQ0FBdEI7QUFDQSxzQkFBRSxPQUFGLENBQVUsS0FBSyxHQUFmLEVBQW9CLENBQXBCLEVBQXVCLENBQXZCOztBQUVBLHlCQUFLLE9BQUwsQ0FBYSxDQUFiLEVBQWdCLENBQWhCLElBQXFCLENBQXJCO0FBQ0g7QUFDSjtBQUNKOzs7Ozs7NkNBR29CLEssRUFBTTtBQUN2QixnQkFBSSxpQkFBaUIsRUFBckI7QUFDQSxvQkFBTyxLQUFQO0FBQ0kscUJBQUssQ0FBTDs7QUFFSSxxQ0FBaUIsQ0FBRSxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxDQUFGLEVBQWEsQ0FBQyxFQUFELEVBQUssQ0FBTCxFQUFRLENBQVIsQ0FBYixFQUF5QixDQUFDLEdBQUQsRUFBTSxDQUFOLEVBQVMsQ0FBVCxDQUF6QixFQUFzQyxDQUFDLEdBQUQsRUFBTSxDQUFOLEVBQVMsQ0FBVCxDQUF0QyxFQUFtRCxDQUFDLENBQUQsRUFBSSxFQUFKLEVBQVEsQ0FBUixDQUFuRCxFQUErRCxDQUFDLENBQUQsRUFBSSxDQUFDLEVBQUwsRUFBUyxDQUFULENBQS9ELENBQWpCO0FBQ0E7QUFDSixxQkFBSyxDQUFMOztBQUVJLHFDQUFpQixDQUNiLENBQUcsUUFBSCxFQUFjLENBQUMsT0FBZixFQUEyQixNQUEzQixDQURhLEVBRWIsQ0FBRyxRQUFILEVBQWUsT0FBZixFQUEyQixNQUEzQixDQUZhLEVBR2IsQ0FBRSxDQUFDLFFBQUgsRUFBcUIsQ0FBckIsRUFBMkIsTUFBM0IsQ0FIYSxFQUliLENBQUcsUUFBSCxFQUFxQixDQUFyQixFQUEyQixNQUEzQixDQUphLEVBS2IsQ0FBRyxDQUFDLE9BQUosRUFBYyxDQUFDLE9BQWYsRUFBMkIsTUFBM0IsQ0FMYSxFQU1iLENBQUcsQ0FBQyxPQUFKLEVBQWUsT0FBZixFQUEyQixNQUEzQixDQU5hLEVBT2IsQ0FBSSxPQUFKLEVBQWMsQ0FBQyxPQUFmLEVBQTJCLE1BQTNCLENBUGEsRUFRYixDQUFJLE9BQUosRUFBZSxPQUFmLEVBQTJCLE1BQTNCLENBUmEsRUFTYixDQUFHLENBQUMsT0FBSixFQUFxQixDQUFyQixFQUEyQixNQUEzQixDQVRhLEVBVWIsQ0FBSSxPQUFKLEVBQXFCLENBQXJCLEVBQTJCLE1BQTNCLENBVmEsRUFXYixDQUFVLENBQVYsRUFBYyxDQUFDLE9BQWYsRUFBMkIsTUFBM0IsQ0FYYSxFQVliLENBQVUsQ0FBVixFQUFlLE9BQWYsRUFBMkIsTUFBM0IsQ0FaYSxDQUFqQjtBQWFBO0FBQ0oscUJBQUssQ0FBTDs7QUFFSSxxQ0FBaUIsQ0FDYixDQUFFLENBQUMsUUFBSCxFQUFxQixDQUFyQixFQUEyQixNQUEzQixDQURhLEVBRWIsQ0FBRyxRQUFILEVBQXFCLENBQXJCLEVBQTJCLE1BQTNCLENBRmEsRUFHYixDQUFFLENBQUMsUUFBSCxFQUFjLENBQUMsT0FBZixFQUEyQixNQUEzQixDQUhhLEVBSWIsQ0FBRSxDQUFDLFFBQUgsRUFBZSxPQUFmLEVBQTJCLE1BQTNCLENBSmEsRUFLYixDQUFHLFFBQUgsRUFBYyxDQUFDLE9BQWYsRUFBMkIsTUFBM0IsQ0FMYSxFQU1iLENBQUcsUUFBSCxFQUFlLE9BQWYsRUFBMkIsTUFBM0IsQ0FOYSxFQU9iLENBQUcsUUFBSCxFQUFjLENBQUMsT0FBZixFQUEyQixNQUEzQixDQVBhLEVBUWIsQ0FBRyxRQUFILEVBQWUsT0FBZixFQUEyQixNQUEzQixDQVJhLEVBU2IsQ0FBRyxDQUFDLE9BQUosRUFBYyxDQUFDLE9BQWYsRUFBMkIsTUFBM0IsQ0FUYSxFQVViLENBQUcsQ0FBQyxPQUFKLEVBQWUsT0FBZixFQUEyQixNQUEzQixDQVZhLEVBV2IsQ0FBSSxPQUFKLEVBQWMsQ0FBQyxPQUFmLEVBQTJCLE1BQTNCLENBWGEsRUFZYixDQUFJLE9BQUosRUFBZSxPQUFmLEVBQTJCLE1BQTNCLENBWmEsRUFhYixDQUFVLENBQVYsRUFBYyxDQUFDLE9BQWYsRUFBMkIsTUFBM0IsQ0FiYSxFQWNiLENBQVUsQ0FBVixFQUFlLE9BQWYsRUFBMkIsTUFBM0IsQ0FkYSxFQWViLENBQUcsQ0FBQyxPQUFKLEVBQWMsQ0FBQyxPQUFmLEVBQTJCLE1BQTNCLENBZmEsRUFnQmIsQ0FBRyxDQUFDLE9BQUosRUFBZSxPQUFmLEVBQTJCLE1BQTNCLENBaEJhLEVBaUJiLENBQUksT0FBSixFQUFjLENBQUMsT0FBZixFQUEyQixNQUEzQixDQWpCYSxFQWtCYixDQUFJLE9BQUosRUFBZSxPQUFmLEVBQTJCLE1BQTNCLENBbEJhLEVBbUJiLENBQUcsQ0FBQyxPQUFKLEVBQXFCLENBQXJCLEVBQTJCLE1BQTNCLENBbkJhLEVBb0JiLENBQUksT0FBSixFQUFxQixDQUFyQixFQUEyQixNQUEzQixDQXBCYSxDQUFqQjtBQXFCQTtBQUNKO0FBQ0ksNEJBQVEsS0FBUixDQUFjLDRCQUFkLEVBQTRDLEtBQTVDO0FBOUNSO0FBZ0RBLG1CQUFPLGNBQVA7QUFDSDs7OzBCQTNGYyxjLEVBQWU7O0FBRTFCLGdCQUFJLG1CQUFtQixTQUF2QixFQUFrQztBQUFFLGlDQUFpQixLQUFLLG9CQUFMLENBQTBCLEtBQUssS0FBL0IsQ0FBakI7QUFBeUQ7QUFDN0YsaUJBQUssZUFBTCxHQUF1QixjQUF2Qjs7QUFFQSxpQkFBSyxHQUFMLENBQVMsVUFBVDs7QUFFQSxpQkFBSyxnQkFBTCxDQUF1QixjQUF2QjtBQUNILFM7NEJBRWU7QUFBRSxtQkFBTyxLQUFLLGVBQVo7QUFBOEI7Ozs7O2tCQWhDL0IsTzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNEckI7Ozs7SUFFcUIsaUI7QUFDakIsK0JBQVksUUFBWixFQUFzQjtBQUFBOzs7QUFFbEIsYUFBSyxHQUFMLEdBQVcsUUFBWDtBQUNBLGFBQUssT0FBTCxHQUFlLElBQWY7O0FBRUEsYUFBSyxFQUFMLEdBQVUsS0FBSyxHQUFMLENBQVMscUJBQVQsQ0FBK0IsQ0FBL0IsQ0FBVjtBQUNBLGFBQUssR0FBTCxHQUFXLEtBQUssR0FBTCxDQUFTLG1CQUFULENBQTZCLENBQTdCLENBQVg7O0FBRUEsYUFBSyxLQUFMLEdBQWEsSUFBSSxLQUFKLENBQVUsQ0FBVixDQUFiO0FBQ0EsYUFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLENBQXBCLEVBQXVCLEdBQXZCLEVBQTRCO0FBQ3hCLGlCQUFLLEtBQUwsQ0FBVyxDQUFYLElBQWdCLEtBQUssR0FBTCxDQUFTLFVBQVQsRUFBaEI7QUFDQSxpQkFBSyxLQUFMLENBQVcsQ0FBWCxFQUFjLElBQWQsQ0FBbUIsS0FBbkIsR0FBMkIsSUFBSSxLQUFLLElBQUwsQ0FBVSxDQUFWLENBQS9CO0FBQ0g7O0FBRUQsYUFBSyxTQUFMLEdBQWlCLElBQUksS0FBSixDQUFVLENBQVYsQ0FBakI7QUFDQSxhQUFLLFdBQUwsR0FBbUIsSUFBSSxLQUFKLENBQVUsQ0FBVixDQUFuQjtBQUNBLGFBQUssSUFBSSxDQUFULEVBQVksSUFBSSxDQUFoQixFQUFtQixHQUFuQixFQUF3QjtBQUNwQixpQkFBSyxTQUFMLENBQWUsQ0FBZixJQUFvQixLQUFLLEdBQUwsQ0FBUyxjQUFULEVBQXBCO0FBQ0EsaUJBQUssU0FBTCxDQUFlLENBQWYsRUFBa0IsT0FBbEIsR0FBNEIsS0FBSyxPQUFqQztBQUNBLGlCQUFLLFNBQUwsQ0FBZSxDQUFmLEVBQWtCLHFCQUFsQixHQUEwQyxDQUExQztBQUNBLGlCQUFLLFdBQUwsQ0FBaUIsQ0FBakIsSUFBc0IsSUFBSSxZQUFKLENBQWlCLEtBQUssT0FBdEIsQ0FBdEI7QUFDSDs7QUFFRCxhQUFLLEVBQUwsQ0FBUSxPQUFSLENBQWdCLEtBQUssR0FBckIsRUFBMEIsQ0FBMUIsRUFBNkIsQ0FBN0I7QUFDQSxhQUFLLEVBQUwsQ0FBUSxPQUFSLENBQWdCLEtBQUssU0FBTCxDQUFlLENBQWYsQ0FBaEIsRUFBbUMsQ0FBbkMsRUFBc0MsQ0FBdEM7O0FBRUEsYUFBSyxFQUFMLENBQVEsT0FBUixDQUFnQixLQUFLLEtBQUwsQ0FBVyxDQUFYLENBQWhCLEVBQStCLENBQS9CLEVBQWtDLENBQWxDO0FBQ0EsYUFBSyxFQUFMLENBQVEsT0FBUixDQUFnQixLQUFLLEtBQUwsQ0FBVyxDQUFYLENBQWhCLEVBQStCLENBQS9CLEVBQWtDLENBQWxDO0FBQ0EsYUFBSyxFQUFMLENBQVEsT0FBUixDQUFnQixLQUFLLEtBQUwsQ0FBVyxDQUFYLENBQWhCLEVBQStCLENBQS9CLEVBQWtDLENBQWxDO0FBQ0EsYUFBSyxJQUFJLENBQVQsRUFBWSxJQUFJLENBQWhCLEVBQW1CLEdBQW5CLEVBQXdCO0FBQ3BCLGlCQUFLLEtBQUwsQ0FBVyxDQUFYLEVBQWMsT0FBZCxDQUFzQixLQUFLLFNBQUwsQ0FBZSxJQUFFLENBQWpCLENBQXRCLEVBQTJDLENBQTNDLEVBQThDLENBQTlDO0FBQ0EsaUJBQUssS0FBTCxDQUFXLENBQVgsRUFBYyxPQUFkLENBQXNCLEtBQUssR0FBM0IsRUFBZ0MsQ0FBaEMsRUFBbUMsSUFBRSxDQUFyQztBQUNIO0FBRUo7Ozs7d0NBRWU7O0FBRVosaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxDQUFwQixFQUF1QixHQUF2QixFQUE0QjtBQUN4QixxQkFBSyxTQUFMLENBQWUsQ0FBZixFQUFrQixzQkFBbEIsQ0FBeUMsS0FBSyxXQUFMLENBQWlCLENBQWpCLENBQXpDO0FBQ0g7QUFDSjs7OzJDQUVrQjs7QUFFZixnQkFBSSxLQUFLLENBQVQ7QUFDQSxnQkFBSSxLQUFLLENBQVQ7QUFDQSxnQkFBSSxLQUFLLENBQVQ7QUFDQSxnQkFBSSxLQUFLLENBQVQ7QUFDQSxnQkFBSSxLQUFLLENBQVQ7QUFDQSxnQkFBSSxLQUFLLENBQVQ7QUFDQSxnQkFBSSxLQUFLLENBQVQ7QUFDQSxnQkFBSSxDQUFKLEVBQU8sTUFBUCxFQUFlLENBQWYsRUFBa0IsR0FBbEIsRUFBdUIsSUFBdkIsRUFBNkIsSUFBN0I7O0FBRUEsaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxLQUFLLE9BQXpCLEVBQWtDLEdBQWxDLEVBQXVDOztBQUVuQyxxQkFBSyxLQUFLLEtBQUssV0FBTCxDQUFpQixDQUFqQixFQUFvQixDQUFwQixJQUF5QixLQUFLLFdBQUwsQ0FBaUIsQ0FBakIsRUFBb0IsQ0FBcEIsQ0FBbkM7QUFDQSxxQkFBSyxLQUFLLEtBQUssV0FBTCxDQUFpQixDQUFqQixFQUFvQixDQUFwQixJQUF5QixLQUFLLFdBQUwsQ0FBaUIsQ0FBakIsRUFBb0IsQ0FBcEIsQ0FBbkM7QUFDQSxxQkFBSyxLQUFLLEtBQUssV0FBTCxDQUFpQixDQUFqQixFQUFvQixDQUFwQixJQUF5QixLQUFLLFdBQUwsQ0FBaUIsQ0FBakIsRUFBb0IsQ0FBcEIsQ0FBbkM7QUFDQSxxQkFBSyxLQUFLLEtBQUssV0FBTCxDQUFpQixDQUFqQixFQUFvQixDQUFwQixJQUF5QixLQUFLLFdBQUwsQ0FBaUIsQ0FBakIsRUFBb0IsQ0FBcEIsQ0FBbkM7QUFDQSxxQkFBSyxLQUFLLEtBQUssV0FBTCxDQUFpQixDQUFqQixFQUFvQixDQUFwQixJQUF5QixLQUFLLFdBQUwsQ0FBaUIsQ0FBakIsRUFBb0IsQ0FBcEIsQ0FBbkM7QUFDQSxxQkFBSyxLQUFLLEtBQUssV0FBTCxDQUFpQixDQUFqQixFQUFvQixDQUFwQixJQUF5QixLQUFLLFdBQUwsQ0FBaUIsQ0FBakIsRUFBb0IsQ0FBcEIsQ0FBbkM7QUFDQSxxQkFBSyxLQUFLLEtBQUssV0FBTCxDQUFpQixDQUFqQixFQUFvQixDQUFwQixJQUF5QixLQUFLLFdBQUwsQ0FBaUIsQ0FBakIsRUFBb0IsQ0FBcEIsQ0FBbkM7QUFDSDtBQUNELGdCQUFJLENBQUMsRUFBRCxFQUFLLEVBQUwsRUFBUyxFQUFULENBQUosQztBQUNBLHFCQUFTLEtBQUssSUFBTCxDQUFVLEVBQUUsQ0FBRixJQUFLLEVBQUUsQ0FBRixDQUFMLEdBQVksRUFBRSxDQUFGLElBQUssRUFBRSxDQUFGLENBQWpCLEdBQXdCLEVBQUUsQ0FBRixJQUFLLEVBQUUsQ0FBRixDQUF2QyxDQUFULEM7QUFDQSxnQkFBSSxDQUFDLEtBQUssRUFBTCxHQUFVLEVBQVYsR0FBZSxFQUFoQixJQUFzQixDQUExQixDO0FBQ0Esa0JBQU0sSUFBSSxVQUFVLElBQUksS0FBZCxDQUFWLEM7QUFDQSxtQkFBTyxLQUFLLEtBQUwsQ0FBVyxFQUFYLEVBQWUsRUFBZixJQUFxQixHQUFyQixHQUEyQixLQUFLLEVBQXZDO0FBQ0EsbUJBQU8sS0FBSyxLQUFMLENBQVcsRUFBRSxDQUFGLENBQVgsRUFBaUIsS0FBSyxJQUFMLENBQVUsRUFBRSxDQUFGLElBQU8sRUFBRSxDQUFGLENBQVAsR0FBYyxFQUFFLENBQUYsSUFBTyxFQUFFLENBQUYsQ0FBL0IsQ0FBakIsSUFBeUQsR0FBekQsR0FBK0QsS0FBSyxFQUEzRTs7QUFFQSxnQkFBSSxTQUFTLENBQUMsSUFBRCxFQUFPLElBQVAsRUFBYSxHQUFiLEVBQWtCLENBQWxCLENBQWI7QUFDQSxtQkFBTyxNQUFQO0FBQ0g7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tCQTFFZ0IsaUI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDSHJCOztJQUFZLE07Ozs7OztJQUVTLFc7QUFFakIseUJBQVksUUFBWixFQUFzQixLQUF0QixFQUE2QjtBQUFBOzs7QUFFekIsYUFBSyxXQUFMLEdBQW1CLEtBQW5COztBQUVBLGFBQUssR0FBTCxHQUFXLFFBQVg7QUFDQSxhQUFLLEtBQUwsR0FBYSxLQUFiO0FBQ0EsYUFBSyxHQUFMLEdBQVcsQ0FBQyxRQUFRLENBQVQsS0FBZSxRQUFRLENBQXZCLENBQVg7QUFDQSxhQUFLLElBQUwsR0FBWSxDQUFaO0FBQ0EsYUFBSyxJQUFMLEdBQVksQ0FBWjtBQUNBLGFBQUssS0FBTCxHQUFhLElBQUksS0FBSixDQUFVLEtBQUssR0FBZixDQUFiO0FBQ0EsYUFBSyxTQUFMLEdBQWlCLElBQUksS0FBSixDQUFVLEtBQUssR0FBZixDQUFqQjtBQUNBLGFBQUssRUFBTCxHQUFVLEtBQUssR0FBTCxDQUFTLFVBQVQsRUFBVjtBQUNBLGFBQUssRUFBTCxDQUFRLGdCQUFSLEdBQTJCLFVBQTNCO0FBQ0EsYUFBSyxFQUFMLENBQVEsWUFBUixHQUF1QixDQUF2QjtBQUNBLGFBQUssR0FBTCxHQUFXLEtBQUssR0FBTCxDQUFTLG1CQUFULENBQTZCLEtBQUssR0FBbEMsQ0FBWDs7QUFFQSxhQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksS0FBSyxHQUF6QixFQUE4QixHQUE5QixFQUFtQztBQUMvQixpQkFBSyxTQUFMLENBQWUsQ0FBZixJQUFvQixLQUFLLEdBQUwsQ0FBUyxVQUFULEVBQXBCO0FBQ0EsaUJBQUssU0FBTCxDQUFlLENBQWYsRUFBa0IsZ0JBQWxCLEdBQXFDLFVBQXJDO0FBQ0EsaUJBQUssU0FBTCxDQUFlLENBQWYsRUFBa0IsWUFBbEIsR0FBaUMsQ0FBakM7QUFDSDtBQUNELGFBQUssV0FBTDs7QUFFQSxhQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksS0FBSyxHQUF6QixFQUE4QixHQUE5QixFQUFtQztBQUMvQixpQkFBSyxFQUFMLENBQVEsT0FBUixDQUFnQixLQUFLLFNBQUwsQ0FBZSxDQUFmLENBQWhCO0FBQ0EsaUJBQUssU0FBTCxDQUFlLENBQWYsRUFBa0IsT0FBbEIsQ0FBMEIsS0FBSyxHQUEvQixFQUFvQyxDQUFwQyxFQUF1QyxDQUF2QztBQUNIOztBQUVELGFBQUssV0FBTCxHQUFtQixJQUFuQjtBQUNIOzs7O3NDQUVhO0FBQ1YsZ0JBQUksSUFBSSxLQUFLLEtBQWI7QUFDQSxnQkFBSSxRQUFRLE9BQU8sYUFBUCxDQUFxQixDQUFyQixFQUF3QixDQUNoQyxDQUFDLEtBQUssSUFBTCxHQUFZLEtBQUssRUFBakIsR0FBc0IsR0FBdkIsRUFBNEIsS0FBSyxJQUFMLEdBQVksS0FBSyxFQUFqQixHQUFzQixHQUFsRCxDQURnQyxDQUF4QixDQUFaOztBQUlBLGlCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksS0FBSyxHQUF6QixFQUE4QixHQUE5QixFQUFtQztBQUMvQixxQkFBSyxLQUFMLENBQVcsQ0FBWCxJQUFnQixNQUFNLENBQU4sRUFBUyxDQUFULENBQWhCO0FBQ0EscUJBQUssU0FBTCxDQUFlLENBQWYsRUFBa0IsSUFBbEIsQ0FBdUIsS0FBdkIsR0FBK0IsS0FBSyxLQUFMLENBQVcsQ0FBWCxDQUEvQjtBQUNIO0FBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tCQTNDZ0IsVzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lDRkEsWTtBQUVqQiwwQkFBWSxRQUFaLEVBQXNCLE9BQXRCLEVBQStCLFFBQS9CLEVBQXlDO0FBQUE7OztBQUVyQyxhQUFLLEdBQUwsR0FBVyxRQUFYO0FBQ0EsYUFBSyxPQUFMLEdBQWUsT0FBZjtBQUNBLFlBQUksV0FBVyxPQUFmLEVBQXdCLEtBQUssUUFBTCxHQUFnQixRQUFoQixDQUF4QixLQUNLLEtBQUssUUFBTCxHQUFnQixPQUFoQjs7QUFFTCxhQUFLLEtBQUwsR0FBYSxDQUFDLEtBQUssT0FBTCxHQUFlLENBQWhCLEtBQXNCLEtBQUssT0FBTCxHQUFlLENBQXJDLENBQWI7QUFDQSxhQUFLLE1BQUwsR0FBYyxDQUFDLEtBQUssUUFBTCxHQUFnQixDQUFqQixLQUF1QixLQUFLLFFBQUwsR0FBZ0IsQ0FBdkMsQ0FBZDtBQUNBLGFBQUssRUFBTCxHQUFVLEtBQUssR0FBTCxDQUFTLHFCQUFULENBQStCLEtBQUssS0FBcEMsQ0FBVjtBQUNBLGFBQUssR0FBTCxHQUFXLEtBQUssR0FBTCxDQUFTLG1CQUFULENBQTZCLEtBQUssTUFBbEMsQ0FBWDs7QUFFQSxhQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksS0FBSyxNQUF6QixFQUFpQyxHQUFqQyxFQUFzQztBQUNsQyxpQkFBSyxFQUFMLENBQVEsT0FBUixDQUFnQixLQUFLLEdBQXJCLEVBQTBCLENBQTFCLEVBQTZCLENBQTdCO0FBQ0g7QUFDSjs7OztvQ0FFVyxRLEVBQVU7O0FBRWxCLGdCQUFJLFlBQVksS0FBSyxPQUFyQixFQUE4QjtBQUMxQixxQkFBSyxRQUFMLEdBQWdCLFFBQWhCO0FBQ0gsYUFGRCxNQUdLOztBQUVMLGlCQUFLLE1BQUwsR0FBYyxDQUFDLEtBQUssUUFBTCxHQUFnQixDQUFqQixLQUF1QixLQUFLLFFBQUwsR0FBZ0IsQ0FBdkMsQ0FBZDtBQUNBLGlCQUFLLEdBQUwsQ0FBUyxVQUFUO0FBQ0EsaUJBQUssR0FBTCxHQUFXLEtBQUssR0FBTCxDQUFTLG1CQUFULENBQTZCLEtBQUssTUFBbEMsQ0FBWDs7QUFFQSxpQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEtBQUssTUFBekIsRUFBaUMsR0FBakMsRUFBc0M7QUFDbEMscUJBQUssRUFBTCxDQUFRLE9BQVIsQ0FBZ0IsS0FBSyxHQUFyQixFQUEwQixDQUExQixFQUE2QixDQUE3QjtBQUNIO0FBQ0o7Ozs7O2tCQWpDZ0IsWTs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNBckI7O0lBQVksTTs7Ozs7O0lBRVMsVztBQUVqQix5QkFBWSxRQUFaLEVBQXNCLEtBQXRCLEVBQTZCO0FBQUE7OztBQUV6QixhQUFLLEdBQUwsR0FBVyxRQUFYO0FBQ0EsYUFBSyxLQUFMLEdBQWEsS0FBYjs7QUFFQSxhQUFLLEdBQUwsR0FBVyxDQUFDLEtBQUssS0FBTCxHQUFhLENBQWQsS0FBb0IsS0FBSyxLQUFMLEdBQWEsQ0FBakMsQ0FBWDtBQUNBLGFBQUssRUFBTCxHQUFVLEtBQUssR0FBTCxDQUFTLHFCQUFULENBQStCLEtBQUssR0FBcEMsQ0FBVjtBQUNBLGFBQUssR0FBTCxHQUFXLEtBQUssR0FBTCxDQUFTLG1CQUFULENBQTZCLEtBQUssR0FBbEMsQ0FBWDs7QUFFQSxhQUFLLEtBQUwsR0FBYSxJQUFJLEtBQUosQ0FBVSxLQUFLLEdBQWYsQ0FBYjtBQUNBLGFBQUssVUFBTCxHQUFrQixJQUFJLEtBQUosQ0FBVSxLQUFLLEtBQUwsR0FBVyxDQUFyQixDQUFsQjtBQUNBLGFBQUssVUFBTCxDQUFnQixJQUFoQixDQUFxQixDQUFyQjs7O0FBR0EsYUFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEtBQUssR0FBekIsRUFBOEIsR0FBOUIsRUFBbUM7QUFDL0IsaUJBQUssS0FBTCxDQUFXLENBQVgsSUFBZ0IsS0FBSyxHQUFMLENBQVMsVUFBVCxFQUFoQjs7QUFFQSxpQkFBSyxFQUFMLENBQVEsT0FBUixDQUFnQixLQUFLLEtBQUwsQ0FBVyxDQUFYLENBQWhCLEVBQStCLENBQS9CLEVBQWtDLENBQWxDO0FBQ0EsaUJBQUssS0FBTCxDQUFXLENBQVgsRUFBYyxPQUFkLENBQXNCLEtBQUssR0FBM0IsRUFBK0IsQ0FBL0IsRUFBaUMsQ0FBakM7QUFDSDtBQUNKOzs7OzJDQUVrQjs7QUFFZixnQkFBSSxDQUFKO0FBQ0EsaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxLQUFLLEdBQXpCLEVBQThCLEdBQTlCLEVBQW1DOztBQUUvQixvQkFBSSxLQUFLLEtBQUwsQ0FBVyxLQUFLLElBQUwsQ0FBVSxDQUFWLENBQVgsQ0FBSjtBQUNBLHFCQUFLLEtBQUwsQ0FBVyxDQUFYLEVBQWMsSUFBZCxDQUFtQixLQUFuQixHQUEyQixLQUFLLFVBQUwsQ0FBZ0IsQ0FBaEIsQ0FBM0I7QUFDSDtBQUNKOzs7NkNBRW9COztBQUVqQixnQkFBSSxJQUFJLEtBQUssS0FBYjtBQUNBLGlCQUFLLFVBQUwsQ0FBZ0IsQ0FBaEIsSUFBcUIsQ0FBckI7QUFDQSxnQkFBSSxlQUFlLENBQW5CO0FBQ0EsZ0JBQUksZUFBZSxDQUFuQjtBQUNBLGdCQUFJLFFBQVEsQ0FBWjtBQUNBLGlCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLEtBQUssQ0FBckIsRUFBd0IsR0FBeEIsRUFBNkI7QUFDekIsd0JBQVEsT0FBTyxtQkFBUCxDQUEyQixDQUEzQixFQUE4QixDQUFDLEtBQUssR0FBTCxDQUFTLFlBQVksSUFBSSxJQUFoQixDQUFULENBQUQsQ0FBOUIsRUFBaUUsWUFBakUsRUFBK0UsWUFBL0UsQ0FBUjtBQUNBLHFCQUFLLFVBQUwsQ0FBZ0IsQ0FBaEIsSUFBcUIsTUFBTSxDQUFOLEVBQVMsQ0FBVCxDQUFyQjs7QUFFQSwrQkFBZSxZQUFmO0FBQ0EsK0JBQWUsS0FBZjtBQUNIO0FBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tCQWhEZ0IsVzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNDckI7O0FBRUE7O0lBQVksTzs7QUFDWjs7SUFBWSxNOzs7Ozs7QUFFWixJQUFJLFFBQVEsUUFBUSxZQUFSLENBQVosQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQUVxQixnQjtBQUNqQiw4QkFBWSxRQUFaLEVBQXNCLEtBQXRCLEVBQTZCLElBQTdCLEVBQW1DO0FBQUE7OztBQUUvQixhQUFLLEdBQUwsR0FBVyxRQUFYO0FBQ0EsYUFBSyxLQUFMLEdBQWEsS0FBYjtBQUNBLGFBQUssR0FBTCxHQUFXLENBQUMsUUFBUSxDQUFULEtBQWUsUUFBUSxDQUF2QixDQUFYO0FBQ0EsYUFBSyxPQUFMLEdBQWUsSUFBZjtBQUNBLGFBQUssU0FBTCxHQUFpQixJQUFJLEtBQUosQ0FBVSxLQUFLLEdBQWYsQ0FBakI7QUFDQSxhQUFLLFdBQUwsR0FBbUIsSUFBSSxLQUFKLENBQVUsS0FBSyxHQUFmLENBQW5COztBQUVBLGFBQUssRUFBTCxHQUFVLEtBQUssR0FBTCxDQUFTLHFCQUFULENBQStCLEtBQUssR0FBcEMsQ0FBVjtBQUNBLGFBQUssR0FBTCxHQUFXLEtBQUssR0FBTCxDQUFTLG1CQUFULENBQTZCLEtBQUssR0FBbEMsQ0FBWDs7QUFFQSxhQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksS0FBSyxHQUF6QixFQUE4QixHQUE5QixFQUFtQztBQUMvQixpQkFBSyxTQUFMLENBQWUsQ0FBZixJQUFvQixLQUFLLEdBQUwsQ0FBUyxjQUFULEVBQXBCO0FBQ0EsaUJBQUssU0FBTCxDQUFlLENBQWYsRUFBa0IsT0FBbEIsR0FBNEIsS0FBSyxPQUFqQztBQUNBLGlCQUFLLFNBQUwsQ0FBZSxDQUFmLEVBQWtCLHFCQUFsQixHQUEwQyxDQUExQztBQUNBLGlCQUFLLFdBQUwsQ0FBaUIsQ0FBakIsSUFBc0IsSUFBSSxZQUFKLENBQWlCLEtBQUssT0FBdEIsQ0FBdEI7QUFDSDs7QUFFRCxhQUFLLElBQUksS0FBSSxDQUFiLEVBQWdCLEtBQUksS0FBSyxHQUF6QixFQUE4QixJQUE5QixFQUFtQztBQUMvQixpQkFBSyxFQUFMLENBQVEsT0FBUixDQUFnQixLQUFLLEdBQXJCLEVBQTBCLEVBQTFCLEVBQTZCLEVBQTdCO0FBQ0EsaUJBQUssRUFBTCxDQUFRLE9BQVIsQ0FBZ0IsS0FBSyxTQUFMLENBQWUsRUFBZixDQUFoQixFQUFtQyxFQUFuQyxFQUFzQyxDQUF0QztBQUNIOzs7QUFHRCxZQUFJLGNBQWMsTUFBTSxVQUFOLENBQWlCLElBQUksS0FBckIsQ0FBbEI7QUFDQSxhQUFLLFdBQUwsR0FBbUIsTUFBTSxPQUFOLENBQWMsV0FBZCxDQUFuQjs7QUFFQSxhQUFLLEtBQUwsR0FBYSxPQUFPLGFBQVAsQ0FBcUIsS0FBSyxLQUExQixFQUFpQyxLQUFLLFdBQXRDLENBQWI7QUFDQSxhQUFLLElBQUwsR0FBWSxJQUFaOzs7Ozs7QUFNSDs7Ozt3Q0FFZTs7QUFFWixpQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEtBQUssR0FBekIsRUFBOEIsR0FBOUIsRUFBbUM7QUFDL0IscUJBQUssU0FBTCxDQUFlLENBQWYsRUFBa0Isc0JBQWxCLENBQXlDLEtBQUssV0FBTCxDQUFpQixDQUFqQixDQUF6QztBQUNIO0FBQ0o7OzswQ0FFaUI7O0FBRWQsZ0JBQUksUUFBUSxLQUFLLFdBQUwsQ0FBaUIsTUFBN0I7O0FBRUEsZ0JBQUksT0FBTyxRQUFRLEdBQVIsQ0FBWSxRQUFRLFNBQVIsQ0FBa0IsS0FBSyxLQUF2QixDQUFaLEVBQTJDLEtBQUssV0FBaEQsQ0FBWDs7QUFFQSxnQkFBSSxjQUFjLElBQUksS0FBSixDQUFVLEtBQVYsQ0FBbEI7O0FBRUEsaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxLQUFwQixFQUEyQixHQUEzQixFQUFnQztBQUM1QixxQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEtBQUssT0FBekIsRUFBa0MsR0FBbEMsRUFBdUM7QUFDbkMsd0JBQUksVUFBVSxDQUFkO0FBQ0EsOEJBQVUsVUFBVSxLQUFLLENBQUwsRUFBUSxDQUFSLElBQWEsS0FBSyxDQUFMLEVBQVEsQ0FBUixDQUFqQztBQUNIO0FBQ0Qsb0JBQUksVUFBVSxVQUFRLEtBQUssT0FBM0I7QUFDQSw0QkFBWSxDQUFaLElBQWlCLENBQUUsS0FBSyxXQUFMLENBQWlCLENBQWpCLEVBQW9CLENBQXBCLENBQUYsRUFBMEIsS0FBSyxXQUFMLENBQWlCLENBQWpCLEVBQW9CLENBQXBCLENBQTFCLEVBQW1ELE9BQW5ELENBQWpCO0FBQ0g7O0FBRUQsZ0JBQUksS0FBSyxJQUFMLElBQWEsQ0FBakIsRUFBb0IsT0FBTyxXQUFQLENBQXBCLEtBQ0ssSUFBSSxLQUFLLElBQUwsSUFBYSxDQUFqQixFQUFvQjs7QUFFckIsb0JBQUksY0FBYyxPQUFPLFVBQVAsQ0FBa0IsSUFBRSxLQUFLLEtBQXpCLEVBQWdDLFdBQWhDLENBQWxCO0FBQ0EsdUJBQU8sV0FBUDtBQUNIOzs7Ozs7QUFNSjs7Ozs7a0JBekVnQixnQjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNUckI7Ozs7SUFFcUIsVztBQUNqQix5QkFBWSxRQUFaLEVBQXNCLEtBQXRCLEVBQTZCO0FBQUE7OztBQUV6QixhQUFLLEdBQUwsR0FBVyxRQUFYO0FBQ0EsYUFBSyxLQUFMLEdBQWEsS0FBYjtBQUNBLGFBQUssR0FBTCxHQUFXLENBQUMsUUFBUSxDQUFULEtBQWUsUUFBUSxDQUF2QixDQUFYO0FBQ0EsYUFBSyxPQUFMLEdBQWUsSUFBZjs7QUFFQSxhQUFLLEVBQUwsR0FBVSxLQUFLLEdBQUwsQ0FBUyxxQkFBVCxDQUErQixLQUFLLEdBQXBDLENBQVY7QUFDQSxhQUFLLEdBQUwsR0FBVyxLQUFLLEdBQUwsQ0FBUyxtQkFBVCxDQUE2QixLQUFLLEdBQWxDLENBQVg7O0FBRUEsYUFBSyxTQUFMLEdBQWlCLElBQUksS0FBSixDQUFVLEtBQUssR0FBZixDQUFqQjtBQUNBLGFBQUssV0FBTCxHQUFtQixJQUFJLEtBQUosQ0FBVSxLQUFLLEdBQWYsQ0FBbkI7QUFDQSxhQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksS0FBSyxHQUF6QixFQUE4QixHQUE5QixFQUFtQztBQUMvQixpQkFBSyxTQUFMLENBQWUsQ0FBZixJQUFvQixLQUFLLEdBQUwsQ0FBUyxjQUFULEVBQXBCO0FBQ0EsaUJBQUssU0FBTCxDQUFlLENBQWYsRUFBa0IsT0FBbEIsR0FBNEIsS0FBSyxPQUFqQztBQUNBLGlCQUFLLFNBQUwsQ0FBZSxDQUFmLEVBQWtCLHFCQUFsQixHQUEwQyxDQUExQztBQUNBLGlCQUFLLFdBQUwsQ0FBaUIsQ0FBakIsSUFBc0IsSUFBSSxZQUFKLENBQWlCLEtBQUssT0FBdEIsQ0FBdEI7O0FBRUEsaUJBQUssRUFBTCxDQUFRLE9BQVIsQ0FBZ0IsS0FBSyxTQUFMLENBQWUsQ0FBZixDQUFoQixFQUFtQyxDQUFuQyxFQUFzQyxDQUF0QztBQUNBLGlCQUFLLFNBQUwsQ0FBZSxDQUFmLEVBQWtCLE9BQWxCLENBQTBCLEtBQUssR0FBL0IsRUFBb0MsQ0FBcEMsRUFBdUMsQ0FBdkM7QUFDSDtBQUVKOzs7O3dDQUVlOztBQUVaLGlCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksS0FBSyxHQUF6QixFQUE4QixHQUE5QixFQUFtQztBQUMvQixxQkFBSyxTQUFMLENBQWUsQ0FBZixFQUFrQixzQkFBbEIsQ0FBeUMsS0FBSyxXQUFMLENBQWlCLENBQWpCLENBQXpDO0FBQ0g7QUFDSjs7O3FDQUVZOztBQUVULGdCQUFJLGFBQWEsSUFBSSxLQUFKLENBQVUsS0FBSyxHQUFmLENBQWpCO0FBQ0EsdUJBQVcsSUFBWCxDQUFnQixDQUFoQjs7QUFFQSxpQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEtBQUssR0FBekIsRUFBOEIsR0FBOUIsRUFBbUM7QUFDL0IscUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxLQUFLLE9BQXpCLEVBQWtDLEdBQWxDLEVBQXVDO0FBQ25DLCtCQUFXLENBQVgsSUFBZ0IsV0FBVyxDQUFYLElBQWdCLEtBQUssV0FBTCxDQUFpQixDQUFqQixFQUFvQixDQUFwQixJQUF5QixLQUFLLFdBQUwsQ0FBaUIsQ0FBakIsRUFBb0IsQ0FBcEIsQ0FBekQ7QUFDSDtBQUNELDJCQUFXLENBQVgsSUFBZ0IsS0FBSyxJQUFMLENBQVcsV0FBVyxDQUFYLElBQWMsS0FBSyxPQUE5QixDQUFoQjtBQUNIO0FBQ0QsbUJBQU8sVUFBUDtBQUNIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztrQkE1Q2dCLFc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQ0hBLFc7QUFFakIseUJBQVksUUFBWixFQUFzQixLQUF0QixFQUE2QjtBQUFBOzs7QUFFekIsYUFBSyxHQUFMLEdBQVcsUUFBWDtBQUNBLGFBQUssS0FBTCxHQUFhLEtBQWI7QUFDQSxhQUFLLEdBQUwsR0FBVyxDQUFDLFFBQVEsQ0FBVCxLQUFlLFFBQVEsQ0FBdkIsQ0FBWDtBQUNBLGFBQUssV0FBTCxHQUFtQixDQUFuQjs7QUFFQSxhQUFLLEVBQUwsR0FBVSxLQUFLLEdBQUwsQ0FBUyxxQkFBVCxDQUErQixLQUFLLEdBQXBDLENBQVY7QUFDQSxhQUFLLEdBQUwsR0FBVyxLQUFLLEdBQUwsQ0FBUyxtQkFBVCxDQUE2QixLQUFLLEdBQWxDLENBQVg7O0FBRUEsYUFBSyxLQUFMLEdBQWEsSUFBSSxLQUFKLENBQVUsS0FBSyxHQUFmLENBQWI7QUFDQSxhQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksS0FBSyxHQUF6QixFQUE4QixHQUE5QixFQUFtQztBQUMvQixpQkFBSyxLQUFMLENBQVcsQ0FBWCxJQUFnQixLQUFLLEdBQUwsQ0FBUyxVQUFULEVBQWhCO0FBQ0EsaUJBQUssS0FBTCxDQUFXLENBQVgsRUFBYyxJQUFkLENBQW1CLEtBQW5CLEdBQTJCLENBQTNCOztBQUVBLGlCQUFLLEVBQUwsQ0FBUSxPQUFSLENBQWdCLEtBQUssS0FBTCxDQUFXLENBQVgsQ0FBaEIsRUFBK0IsQ0FBL0IsRUFBa0MsQ0FBbEM7QUFDQSxpQkFBSyxLQUFMLENBQVcsQ0FBWCxFQUFjLE9BQWQsQ0FBc0IsS0FBSyxHQUEzQixFQUFnQyxDQUFoQyxFQUFtQyxDQUFuQztBQUNIO0FBRUo7Ozs7Z0NBRU87O0FBRUosaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxLQUFLLEdBQXpCLEVBQThCLEdBQTlCLEVBQW1DO0FBQy9CLHFCQUFLLEtBQUwsQ0FBVyxDQUFYLEVBQWMsSUFBZCxDQUFtQixLQUFuQixHQUEyQixDQUEzQjtBQUNIO0FBQ0o7OzsrQkFFTSxPLEVBQVM7O0FBRVosb0JBQU8sT0FBUDtBQUNJLHFCQUFLLENBQUw7QUFDSSx5QkFBSyxXQUFMLEdBQW1CLENBQW5CO0FBQ0EseUJBQUssS0FBTDtBQUNBO0FBQ0oscUJBQUssQ0FBTDs7QUFFSSx5QkFBSyxLQUFMO0FBQ0EseUJBQUssV0FBTCxHQUFtQixDQUFuQjtBQUNBLHdCQUFJLENBQUo7QUFDQSx5QkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixLQUFLLEtBQUssS0FBMUIsRUFBaUMsR0FBakMsRUFBc0M7QUFDbEMsNkJBQUssSUFBSSxJQUFJLENBQUMsQ0FBZCxFQUFpQixLQUFLLENBQXRCLEVBQXlCLEdBQXpCLEVBQThCO0FBQzFCLGdDQUFJLElBQUUsQ0FBRixHQUFJLENBQUosR0FBTSxDQUFWO0FBQ0EsZ0NBQUssSUFBRSxDQUFGLElBQU8sSUFBRSxDQUFGLElBQUssQ0FBYixJQUFrQixJQUFFLENBQUYsSUFBTyxJQUFFLENBQUYsSUFBSyxDQUFsQyxFQUFzQyxLQUFLLEtBQUwsQ0FBVyxDQUFYLEVBQWMsSUFBZCxDQUFtQixLQUFuQixHQUEyQixDQUFDLENBQTVCO0FBQ3pDO0FBQ0o7QUFDRDtBQUNKLHFCQUFLLENBQUw7O0FBRUkseUJBQUssS0FBTDtBQUNBLHlCQUFLLFdBQUwsR0FBbUIsQ0FBbkI7QUFDQSx3QkFBSSxDQUFKO0FBQ0EseUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsS0FBSyxLQUFLLEtBQTFCLEVBQWlDLEdBQWpDLEVBQXNDO0FBQ2xDLDZCQUFLLElBQUksSUFBSSxDQUFDLENBQWQsRUFBaUIsS0FBSyxDQUF0QixFQUF5QixHQUF6QixFQUE4QjtBQUMxQixnQ0FBSSxJQUFFLENBQUYsR0FBSSxDQUFKLEdBQU0sQ0FBVjtBQUNBLGdDQUFJLElBQUUsQ0FBTixFQUFTLEtBQUssS0FBTCxDQUFXLENBQVgsRUFBYyxJQUFkLENBQW1CLEtBQW5CLEdBQTJCLENBQUMsQ0FBNUI7QUFDWjtBQUNKO0FBQ0Q7QUFDSixxQkFBSyxDQUFMOztBQUVJLHlCQUFLLEtBQUw7QUFDQSx5QkFBSyxXQUFMLEdBQW1CLENBQW5CO0FBQ0Esd0JBQUksQ0FBSjtBQUNBLHlCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLEtBQUssS0FBSyxLQUExQixFQUFpQyxHQUFqQyxFQUFzQztBQUNsQyw2QkFBSyxJQUFJLElBQUksQ0FBQyxDQUFkLEVBQWlCLEtBQUssQ0FBdEIsRUFBeUIsR0FBekIsRUFBOEI7QUFDMUIsZ0NBQUksSUFBRSxDQUFGLEdBQUksQ0FBSixHQUFNLENBQVY7QUFDQSxnQ0FBSSxDQUFDLElBQUUsQ0FBSCxJQUFNLENBQU4sSUFBUyxDQUFiLEVBQWdCLEtBQUssS0FBTCxDQUFXLENBQVgsRUFBYyxJQUFkLENBQW1CLEtBQW5CLEdBQTJCLENBQUMsQ0FBNUI7QUFDbkI7QUFDSjtBQUNEO0FBQ0o7QUFDSSw0QkFBUSxHQUFSLENBQVksaUdBQVo7QUFDQSx5QkFBSyxXQUFMLEdBQW1CLENBQW5CO0FBQ0EseUJBQUssS0FBTDtBQTVDUjtBQWdESDs7Ozs7a0JBaEZnQixXOzs7Ozs7Ozs7Ozs7Ozs7OztBQ0FyQjs7SUFBWSxNOzs7Ozs7SUFFUyxZO0FBRWpCLDBCQUFZLFFBQVosRUFBc0IsS0FBdEIsRUFBNkI7QUFBQTs7O0FBRXpCLGFBQUssR0FBTCxHQUFXLFFBQVg7QUFDQSxhQUFLLEtBQUwsR0FBYSxLQUFiO0FBQ0EsYUFBSyxHQUFMLEdBQVcsQ0FBQyxRQUFRLENBQVQsS0FBZSxRQUFRLENBQXZCLENBQVg7QUFDQSxhQUFLLEdBQUwsR0FBVyxDQUFYO0FBQ0EsYUFBSyxLQUFMLEdBQWEsQ0FBYjtBQUNBLGFBQUssSUFBTCxHQUFZLENBQVo7QUFDQSxhQUFLLE1BQUwsR0FBYyxRQUFRLFFBQVIsQ0FBaUIsS0FBSyxHQUF0QixDQUFkO0FBQ0EsYUFBSyxXQUFMLEdBQW1CLElBQUksS0FBSixDQUFVLEtBQUssS0FBZixDQUFuQjs7QUFFQSxhQUFLLEVBQUwsR0FBVSxLQUFLLEdBQUwsQ0FBUyxxQkFBVCxDQUErQixLQUFLLEdBQXBDLENBQVY7QUFDQSxhQUFLLEdBQUwsR0FBVyxLQUFLLEdBQUwsQ0FBUyxtQkFBVCxDQUE2QixLQUFLLEdBQWxDLENBQVg7OztBQUdBLGFBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsS0FBSyxLQUFLLEtBQTFCLEVBQWlDLEdBQWpDLEVBQXNDOztBQUVsQyxnQkFBSSxVQUFVLElBQUksS0FBSixDQUFVLElBQUksQ0FBSixHQUFRLENBQWxCLENBQWQ7QUFDQSxpQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLElBQUksQ0FBSixHQUFRLENBQTVCLEVBQStCLEdBQS9CLEVBQW9DO0FBQ2hDLHdCQUFRLENBQVIsSUFBYSxJQUFJLEtBQUosQ0FBVSxJQUFJLENBQUosR0FBUSxDQUFsQixDQUFiO0FBQ0EscUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxJQUFJLENBQUosR0FBUSxDQUE1QixFQUErQixHQUEvQixFQUFvQztBQUNoQyw0QkFBUSxDQUFSLEVBQVcsQ0FBWCxJQUFnQixLQUFLLEdBQUwsQ0FBUyxVQUFULEVBQWhCO0FBQ0Esd0JBQUksS0FBSyxDQUFULEVBQVksUUFBUSxDQUFSLEVBQVcsQ0FBWCxFQUFjLElBQWQsQ0FBbUIsS0FBbkIsR0FBMkIsQ0FBM0IsQ0FBWixLQUNLLFFBQVEsQ0FBUixFQUFXLENBQVgsRUFBYyxJQUFkLENBQW1CLEtBQW5CLEdBQTJCLENBQTNCO0FBQ1I7QUFDSjtBQUNELGlCQUFLLFdBQUwsQ0FBaUIsSUFBSSxDQUFyQixJQUEwQixPQUExQjtBQUNIOzs7QUFHRCxhQUFLLEVBQUwsQ0FBUSxPQUFSLENBQWdCLEtBQUssR0FBckIsRUFBMEIsQ0FBMUIsRUFBNkIsQ0FBN0IsRTs7QUFFQSxZQUFJLFdBQVcsQ0FBZjtBQUNBLGFBQUssSUFBSSxDQUFULEVBQVksS0FBSyxLQUFLLEtBQXRCLEVBQTZCLEdBQTdCLEVBQWtDO0FBQzlCLGlCQUFLLElBQUksQ0FBVCxFQUFZLElBQUksSUFBSSxDQUFKLEdBQVEsQ0FBeEIsRUFBMkIsR0FBM0IsRUFBZ0M7QUFDNUIscUJBQUssSUFBSSxDQUFULEVBQVksSUFBSSxJQUFJLENBQUosR0FBUSxDQUF4QixFQUEyQixHQUEzQixFQUFnQztBQUM1Qix5QkFBSyxFQUFMLENBQVEsT0FBUixDQUFnQixLQUFLLFdBQUwsQ0FBaUIsSUFBSSxDQUFyQixFQUF3QixDQUF4QixFQUEyQixDQUEzQixDQUFoQixFQUErQyxXQUFXLENBQTFELEVBQTZELENBQTdEO0FBQ0EseUJBQUssV0FBTCxDQUFpQixJQUFJLENBQXJCLEVBQXdCLENBQXhCLEVBQTJCLENBQTNCLEVBQThCLE9BQTlCLENBQXNDLEtBQUssR0FBM0MsRUFBZ0QsQ0FBaEQsRUFBbUQsV0FBVyxDQUE5RDtBQUNIO0FBQ0o7QUFDRCx1QkFBVyxXQUFXLElBQUksQ0FBZixHQUFtQixDQUE5QjtBQUNIO0FBQ0o7Ozs7dUNBRWM7O0FBRVgsZ0JBQUksTUFBTSxLQUFLLEdBQUwsR0FBVyxLQUFLLEVBQWhCLEdBQXFCLEdBQS9CO0FBQ0EsZ0JBQUksUUFBUSxLQUFLLEtBQUwsR0FBYSxLQUFLLEVBQWxCLEdBQXVCLEdBQW5DO0FBQ0EsZ0JBQUksT0FBTyxLQUFLLElBQUwsR0FBWSxLQUFLLEVBQWpCLEdBQXNCLEdBQWpDOztBQUVBLGlCQUFLLE1BQUwsR0FBYyxPQUFPLFdBQVAsQ0FBbUIsT0FBTyxpQkFBUCxDQUF5QixHQUF6QixFQUE4QixLQUE5QixFQUFxQyxJQUFyQyxDQUFuQixFQUErRCxLQUFLLEtBQXBFLENBQWQ7O0FBRUEsZ0JBQUksV0FBVyxDQUFmO0FBQ0EsaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxLQUFLLEtBQUwsR0FBYSxDQUFqQyxFQUFvQyxHQUFwQyxFQUF5Qzs7QUFFckMscUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxJQUFJLENBQUosR0FBUSxDQUE1QixFQUErQixHQUEvQixFQUFvQztBQUNoQyx5QkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLElBQUksQ0FBSixHQUFRLENBQTVCLEVBQStCLEdBQS9CLEVBQW9DO0FBQ2hDLDZCQUFLLFdBQUwsQ0FBaUIsSUFBSSxDQUFyQixFQUF3QixDQUF4QixFQUEyQixDQUEzQixFQUE4QixJQUE5QixDQUFtQyxLQUFuQyxHQUEyQyxLQUFLLE1BQUwsQ0FBWSxXQUFXLENBQXZCLEVBQTBCLFdBQVcsQ0FBckMsQ0FBM0M7QUFDSDtBQUNKO0FBQ0QsMkJBQVcsV0FBVyxJQUFJLENBQWYsR0FBbUIsQ0FBOUI7QUFDSDtBQUNKOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztrQkFoRWdCLFk7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDRnJCOztJQUFZLE07Ozs7OztJQUVTLFU7QUFFakIsd0JBQVksUUFBWixFQUFzQixLQUF0QixFQUE2QjtBQUFBOzs7QUFFekIsYUFBSyxXQUFMLEdBQW1CLEtBQW5COztBQUVBLGFBQUssR0FBTCxHQUFXLFFBQVg7QUFDQSxhQUFLLEtBQUwsR0FBYSxLQUFiO0FBQ0EsYUFBSyxHQUFMLEdBQVcsQ0FBQyxRQUFRLENBQVQsS0FBZSxRQUFRLENBQXZCLENBQVg7QUFDQSxhQUFLLElBQUwsR0FBWSxDQUFaO0FBQ0EsYUFBSyxJQUFMLEdBQVksQ0FBWjtBQUNBLGFBQUssU0FBTCxHQUFpQixJQUFJLEtBQUosQ0FBVSxLQUFLLEdBQWYsQ0FBakI7QUFDQSxhQUFLLGFBQUwsR0FBcUIsSUFBSSxLQUFKLENBQVUsS0FBSyxHQUFmLENBQXJCO0FBQ0EsYUFBSyxVQUFMLEdBQWtCLElBQUksS0FBSixDQUFVLEtBQUssS0FBTCxHQUFhLENBQXZCLENBQWxCO0FBQ0EsYUFBSyxXQUFMLEdBQW1CLGVBQW5CO0FBQ0EsYUFBSyxFQUFMLEdBQVUsS0FBSyxHQUFMLENBQVMscUJBQVQsQ0FBK0IsS0FBSyxHQUFwQyxDQUFWO0FBQ0EsYUFBSyxHQUFMLEdBQVcsS0FBSyxHQUFMLENBQVMsVUFBVCxFQUFYOzs7QUFHQSxhQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksS0FBSyxHQUF6QixFQUE4QixHQUE5QixFQUFtQztBQUMvQixpQkFBSyxhQUFMLENBQW1CLENBQW5CLElBQXdCLEtBQUssR0FBTCxDQUFTLFVBQVQsRUFBeEI7QUFDSDtBQUNELGFBQUssS0FBTCxHQUFhLElBQUksS0FBSixDQUFVLEtBQUssR0FBZixDQUFiO0FBQ0EsYUFBSyxLQUFMLENBQVcsSUFBWCxDQUFnQixDQUFoQjtBQUNBLGFBQUssYUFBTDtBQUNBLGFBQUssaUJBQUw7OztBQUdBLGFBQUssSUFBSSxDQUFULEVBQVksSUFBSSxLQUFLLEdBQXJCLEVBQTBCLEdBQTFCLEVBQStCO0FBQzNCLGlCQUFLLEVBQUwsQ0FBUSxPQUFSLENBQWdCLEtBQUssYUFBTCxDQUFtQixDQUFuQixDQUFoQixFQUF1QyxDQUF2QyxFQUEwQyxDQUExQztBQUNBLGlCQUFLLGFBQUwsQ0FBbUIsQ0FBbkIsRUFBc0IsT0FBdEIsQ0FBOEIsS0FBSyxHQUFuQztBQUNIOztBQUVELGFBQUssV0FBTCxHQUFtQixJQUFuQjtBQUNIOzs7O3dDQUdlOztBQUVaLHFCQUFTLHFCQUFULENBQStCLENBQS9CLEVBQWtDO0FBQzlCLG9CQUFJLFNBQVMsSUFBSSxLQUFKLENBQVUsSUFBSSxDQUFkLENBQWI7QUFDQSxxQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixLQUFLLENBQXJCLEVBQXdCLEdBQXhCLEVBQTZCO0FBQ3pCLDJCQUFPLENBQVAsSUFBWSxPQUFPLFNBQVAsQ0FBaUIsQ0FBakIsSUFBc0IsT0FBTyxTQUFQLENBQWlCLENBQWpCLENBQXRCLElBQTZDLE9BQU8sU0FBUCxDQUFpQixJQUFJLENBQUosR0FBUSxDQUF6QixJQUE4QixPQUFPLFNBQVAsQ0FBaUIsSUFBSSxDQUFyQixDQUEzRSxDQUFaO0FBQ0g7QUFDRCx1QkFBTyxNQUFQO0FBQ0g7O0FBRUQscUJBQVMsc0JBQVQsQ0FBZ0MsQ0FBaEMsRUFBbUM7QUFDL0Isb0JBQUksU0FBUyxJQUFJLEtBQUosQ0FBVSxJQUFJLENBQWQsQ0FBYjtBQUNBLG9CQUFJLE1BQU0sQ0FBQyxJQUFFLENBQUgsS0FBTyxJQUFFLENBQVQsQ0FBVjtBQUNBLHFCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLEtBQUssQ0FBckIsRUFBd0IsR0FBeEIsRUFBNkI7QUFDekIsMkJBQU8sQ0FBUCxJQUFZLElBQUksR0FBaEI7QUFDSDtBQUNELHVCQUFPLE1BQVA7QUFDSDs7QUFFRCxxQkFBUyxzQkFBVCxDQUFnQyxDQUFoQyxFQUFtQztBQUMvQix3QkFBUSxDQUFSO0FBQ0kseUJBQUssQ0FBTDtBQUNJLDRCQUFJLFNBQVMsQ0FBQyxNQUFELEVBQVMsTUFBVCxDQUFiO0FBQ0E7QUFDSix5QkFBSyxDQUFMO0FBQ0ksNEJBQUksU0FBUyxDQUFDLE1BQUQsRUFBUyxNQUFULEVBQWlCLE1BQWpCLENBQWI7QUFDQTtBQUNKLHlCQUFLLENBQUw7QUFDSSw0QkFBSSxTQUFTLENBQUMsTUFBRCxFQUFTLE1BQVQsRUFBaUIsTUFBakIsRUFBeUIsTUFBekIsQ0FBYjtBQUNBO0FBQ0oseUJBQUssQ0FBTDtBQUNJLDRCQUFJLFNBQVMsQ0FBQyxNQUFELEVBQVMsTUFBVCxFQUFpQixNQUFqQixFQUF5QixNQUF6QixFQUFpQyxNQUFqQyxDQUFiO0FBQ0E7QUFDSjtBQUNJLGdDQUFRLEtBQVIsQ0FBYyxxREFBZDtBQUNBO0FBZlI7QUFpQkEsdUJBQU8sTUFBUDtBQUNIOztBQUVELHFCQUFTLGtCQUFULENBQTRCLENBQTVCLEVBQStCO0FBQzNCLG9CQUFJLFNBQVMsSUFBSSxLQUFKLENBQVUsSUFBSSxDQUFkLENBQWI7QUFDQSx1QkFBTyxDQUFQLElBQVksQ0FBWjtBQUNBLG9CQUFJLGVBQWUsQ0FBbkI7QUFDQSxvQkFBSSxlQUFlLENBQW5CO0FBQ0Esb0JBQUksUUFBUSxDQUFaO0FBQ0EscUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxJQUFJLENBQXhCLEVBQTJCLEdBQTNCLEVBQWdDO0FBQzVCLDRCQUFRLE9BQU8sbUJBQVAsQ0FBMkIsQ0FBM0IsRUFBOEIsQ0FBQyxLQUFLLEdBQUwsQ0FBUyxZQUFZLElBQUksSUFBaEIsQ0FBVCxDQUFELENBQTlCLEVBQWlFLFlBQWpFLEVBQStFLFlBQS9FLENBQVI7QUFDQSwyQkFBTyxDQUFQLElBQVksTUFBTSxDQUFOLEVBQVMsQ0FBVCxDQUFaOztBQUVBLG1DQUFlLFlBQWY7QUFDQSxtQ0FBZSxLQUFmO0FBQ0g7O0FBRUQsb0JBQUksT0FBTyxDQUFYO0FBQ0EscUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsS0FBSyxDQUFyQixFQUF3QixHQUF4QixFQUE2QjtBQUN6Qiw0QkFBUSxPQUFPLENBQVAsS0FBYSxJQUFFLENBQUYsR0FBSSxDQUFqQixDQUFSO0FBQ0g7QUFDRCxxQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixLQUFLLENBQXJCLEVBQXdCLEdBQXhCLEVBQTZCO0FBQ3pCLDJCQUFPLENBQVAsSUFBWSxPQUFPLENBQVAsSUFBVSxJQUF0QjtBQUNIO0FBQ0QsdUJBQU8sTUFBUDtBQUNIOztBQUVELG9CQUFRLEtBQUssV0FBYjtBQUNJLHFCQUFLLFVBQUw7O0FBRUkseUJBQUssVUFBTCxHQUFrQixzQkFBc0IsS0FBSyxLQUEzQixDQUFsQjtBQUNBO0FBQ0oscUJBQUssZUFBTDs7QUFFSSx5QkFBSyxVQUFMLEdBQWtCLHVCQUF1QixLQUFLLEtBQTVCLENBQWxCO0FBQ0E7QUFDSixxQkFBSyxlQUFMOzs7O0FBSUkseUJBQUssVUFBTCxHQUFrQix1QkFBdUIsS0FBSyxLQUE1QixDQUFsQjtBQUNBO0FBQ0oscUJBQUssUUFBTDs7QUFFSSx5QkFBSyxVQUFMLEdBQWtCLG1CQUFtQixLQUFLLEtBQXhCLENBQWxCO0FBQ0E7QUFDSjtBQUNJLHlCQUFLLFdBQUwsR0FBbUIsZUFBbkI7QUFDQSx5QkFBSyxVQUFMLEdBQWtCLHVCQUF1QixLQUFLLEtBQTVCLENBQWxCO0FBckJSOztBQXdCQSxpQkFBSyxXQUFMO0FBQ0g7Ozs0Q0FFbUI7O0FBRWhCLGdCQUFJLE9BQU8sS0FBSyxJQUFMLEdBQVksS0FBSyxFQUFqQixHQUFzQixHQUFqQztBQUNBLGdCQUFJLE9BQU8sS0FBSyxJQUFMLEdBQVksS0FBSyxFQUFqQixHQUFzQixHQUFqQzs7QUFFQSxnQkFBSSxTQUFTLE9BQU8sYUFBUCxDQUFxQixLQUFLLEtBQTFCLEVBQWlDLENBQUUsQ0FBQyxJQUFELEVBQU8sSUFBUCxDQUFGLENBQWpDLENBQWI7O0FBRUEsaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxLQUFLLEdBQXpCLEVBQThCLEdBQTlCLEVBQW1DO0FBQy9CLHFCQUFLLEtBQUwsQ0FBVyxDQUFYLElBQWdCLE9BQU8sQ0FBUCxFQUFVLENBQVYsQ0FBaEI7QUFDSDs7QUFFRCxpQkFBSyxXQUFMO0FBQ0g7OztzQ0FFYTs7QUFFVixnQkFBSSxDQUFKO0FBQ0EsaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsS0FBSyxLQUFLLEtBQTFCLEVBQWlDLEdBQWpDLEVBQXNDO0FBQ2xDLHFCQUFLLElBQUksSUFBSSxDQUFDLENBQWQsRUFBaUIsS0FBSyxDQUF0QixFQUF5QixHQUF6QixFQUE4QjtBQUMxQix3QkFBSSxJQUFJLENBQUosR0FBUSxDQUFSLEdBQVksQ0FBaEI7QUFDQSx5QkFBSyxTQUFMLENBQWUsQ0FBZixJQUFvQixLQUFLLFVBQUwsQ0FBZ0IsQ0FBaEIsSUFBcUIsS0FBSyxLQUFMLENBQVcsQ0FBWCxDQUF6QztBQUNIO0FBQ0o7O0FBRUQsaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxLQUFLLEdBQXpCLEVBQThCLEdBQTlCLEVBQW1DO0FBQy9CLHFCQUFLLGFBQUwsQ0FBbUIsQ0FBbkIsRUFBc0IsSUFBdEIsQ0FBMkIsS0FBM0IsR0FBbUMsS0FBSyxTQUFMLENBQWUsQ0FBZixDQUFuQztBQUNIO0FBQ0o7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tCQTNKZ0IsVTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lDRkEsUztBQUNqQix1QkFBWSxPQUFaLEVBQXFCLEtBQXJCLEVBQTRCLEdBQTVCLEVBQWlDLFFBQWpDLEVBQTJDO0FBQUE7O0FBQ3ZDLGFBQUssT0FBTCxHQUFlLE9BQWY7QUFDQSxhQUFLLEtBQUwsR0FBYSxLQUFiO0FBQ0EsYUFBSyxHQUFMLEdBQVcsQ0FBQyxRQUFRLENBQVQsS0FBZSxRQUFRLENBQXZCLENBQVg7QUFDQSxhQUFLLFNBQUwsR0FBaUIsS0FBSyxJQUFMLENBQVUsS0FBSyxHQUFMLEdBQVcsQ0FBckIsQ0FBakI7QUFDQSxhQUFLLE9BQUwsR0FBZSxJQUFJLEtBQUosRUFBZjtBQUNBLGFBQUssU0FBTCxHQUFpQixDQUFqQjtBQUNBLGFBQUssTUFBTCxHQUFjLEtBQWQ7QUFDQSxhQUFLLE1BQUwsR0FBYyxRQUFkO0FBQ0EsYUFBSyxJQUFMLEdBQVksSUFBSSxLQUFKLENBQVUsS0FBSyxTQUFmLENBQVo7O0FBRUEsWUFBSSxVQUFVLElBQUksS0FBSixDQUFVLElBQUksTUFBSixHQUFhLENBQXZCLEVBQTBCLElBQUksTUFBOUIsQ0FBZDtBQUNBLGFBQUssT0FBTCxHQUFlLE9BQWY7O0FBRUEsYUFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEtBQUssU0FBekIsRUFBb0MsR0FBcEMsRUFBeUM7O0FBRXJDLGdCQUFJLEtBQUssS0FBSyxTQUFMLEdBQWlCLENBQTFCLEVBQTZCO0FBQ3pCLHFCQUFLLElBQUwsQ0FBVSxDQUFWLElBQWUsSUFBSSxLQUFKLENBQVUsQ0FBVixFQUFhLElBQUksTUFBSixHQUFhLENBQTFCLElBQStCLEdBQS9CLEdBQXFDLElBQUksSUFBSSxDQUFKLEdBQVEsQ0FBWixFQUFlLENBQWYsQ0FBckMsR0FBeUQsR0FBekQsR0FBK0QsSUFBSSxLQUFLLEdBQVQsRUFBYyxDQUFkLENBQS9ELEdBQWtGLEtBQWxGLEdBQTBGLE9BQXpHO0FBQ0gsYUFGRCxNQUVPO0FBQ0gscUJBQUssSUFBTCxDQUFVLENBQVYsSUFBZSxJQUFJLEtBQUosQ0FBVSxDQUFWLEVBQWEsSUFBSSxNQUFKLEdBQWEsQ0FBMUIsSUFBK0IsR0FBL0IsR0FBcUMsSUFBSSxJQUFJLENBQUosR0FBUSxDQUFaLEVBQWUsQ0FBZixDQUFyQyxHQUF5RCxHQUF6RCxHQUErRCxJQUFJLElBQUksQ0FBSixHQUFRLENBQVosRUFBZSxDQUFmLENBQS9ELEdBQW1GLEtBQW5GLEdBQTJGLE9BQTFHO0FBQ0g7QUFDSjs7QUFFRCxpQkFBUyxHQUFULENBQWEsR0FBYixFQUFrQixJQUFsQixFQUF3QjtBQUNwQixtQkFBTyxDQUFDLGNBQWMsR0FBZixFQUFvQixNQUFwQixDQUEyQixDQUFDLElBQTVCLENBQVA7QUFDSDtBQUVKOzs7O29DQUVXLEcsRUFBSyxLLEVBQU87O0FBRXBCLGdCQUFJLFVBQVUsSUFBSSxjQUFKLEVBQWQ7QUFDQSxvQkFBUSxJQUFSLENBQWEsS0FBYixFQUFvQixHQUFwQixFQUF5QixJQUF6QjtBQUNBLG9CQUFRLFlBQVIsR0FBdUIsYUFBdkI7O0FBRUEsZ0JBQUksUUFBUSxJQUFaOztBQUVBLG9CQUFRLE1BQVIsR0FBaUIsWUFBVzs7QUFFeEIsc0JBQU0sT0FBTixDQUFjLGVBQWQsQ0FDSSxRQUFRLFFBRFosRUFFSSxVQUFTLE1BQVQsRUFBaUI7QUFDYix3QkFBSSxDQUFDLE1BQUwsRUFBYTtBQUNULDhCQUFNLCtCQUErQixHQUFyQztBQUNBO0FBQ0g7QUFDRCwwQkFBTSxPQUFOLENBQWMsS0FBZCxJQUF1QixNQUF2QjtBQUNBLDBCQUFNLFNBQU47QUFDQSx3QkFBSSxNQUFNLFNBQU4sSUFBbUIsTUFBTSxTQUE3QixFQUF3QztBQUNwQyw4QkFBTSxNQUFOLEdBQWUsSUFBZjtBQUNBLDhCQUFNLGFBQU47QUFDQSxnQ0FBUSxHQUFSLENBQVksZ0RBQVo7QUFDQSw4QkFBTSxNQUFOLENBQWEsTUFBTSxZQUFuQjtBQUNIO0FBQ0osaUJBZkwsRUFnQkksVUFBUyxLQUFULEVBQWdCO0FBQ1osMEJBQU0sd0NBQXlDLEdBQXpDLEdBQStDLGFBQS9DLEdBQStELEtBQS9ELEdBQXVFLHNLQUE3RTtBQUNILGlCQWxCTDtBQW9CSCxhQXRCRDs7QUF3QkEsb0JBQVEsT0FBUixHQUFrQixZQUFXO0FBQ3pCLHNCQUFNLHNCQUFOO0FBQ0gsYUFGRDs7QUFJQSxvQkFBUSxJQUFSO0FBQ0g7OzsrQkFFTTtBQUNILGlCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksS0FBSyxTQUF6QixFQUFvQyxFQUFFLENBQXRDO0FBQXlDLHFCQUFLLFdBQUwsQ0FBaUIsS0FBSyxJQUFMLENBQVUsQ0FBVixDQUFqQixFQUErQixDQUEvQjtBQUF6QztBQUNIOzs7d0NBRWU7O0FBRVosZ0JBQUksQ0FBQyxLQUFLLE1BQVYsRUFBa0I7O0FBRWxCLGdCQUFJLE1BQU0sS0FBSyxHQUFmO0FBQ0EsZ0JBQUksWUFBWSxLQUFLLFNBQXJCOztBQUVBLGdCQUFJLFNBQVMsS0FBSyxPQUFMLENBQWEsQ0FBYixFQUFnQixNQUE3QjtBQUNBLGlCQUFLLE9BQUwsQ0FBYSxPQUFiLENBQXNCLFVBQUMsQ0FBRCxFQUFPO0FBQUMseUJBQVMsS0FBSyxHQUFMLENBQVMsTUFBVCxFQUFpQixFQUFFLE1BQW5CLENBQVQ7QUFBb0MsYUFBbEU7QUFDQSxnQkFBSSxRQUFRLEtBQUssT0FBTCxDQUFhLENBQWIsRUFBZ0IsVUFBNUI7Ozs7O0FBS0EsZ0JBQUksaUJBQWlCLENBQUMsQ0FBRCxFQUFHLENBQUgsRUFBSyxDQUFMLEVBQU8sQ0FBUCxFQUFTLENBQVQsRUFBVyxDQUFYLEVBQWEsQ0FBYixFQUFlLENBQWYsQ0FBckI7QUFDQSxnQkFBSSxLQUFLLE9BQUwsQ0FBYSxXQUFiLE1BQThCLEtBQWxDLEVBQXlDO0FBQ3JDLHdCQUFRLEdBQVIsQ0FBWSwrRUFBWjtBQUNBLGlDQUFpQixDQUFDLENBQUQsRUFBRyxDQUFILEVBQUssQ0FBTCxFQUFPLENBQVAsRUFBUyxDQUFULEVBQVcsQ0FBWCxFQUFhLENBQWIsRUFBZSxDQUFmLENBQWpCOztBQUVIOztBQUVELGlCQUFLLFlBQUwsR0FBb0IsS0FBSyxPQUFMLENBQWEsWUFBYixDQUEwQixHQUExQixFQUErQixNQUEvQixFQUF1QyxLQUF2QyxDQUFwQjtBQUNBLGlCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksU0FBcEIsRUFBK0IsR0FBL0IsRUFBb0M7QUFDaEMscUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxLQUFLLE9BQUwsQ0FBYSxDQUFiLEVBQWdCLGdCQUFwQyxFQUFzRCxHQUF0RCxFQUEyRDtBQUN2RCx5QkFBSyxZQUFMLENBQWtCLGNBQWxCLENBQWlDLElBQUksQ0FBSixHQUFRLENBQXpDLEVBQTRDLEdBQTVDLENBQWdELEtBQUssT0FBTCxDQUFhLENBQWIsRUFBZ0IsY0FBaEIsQ0FBK0IsZUFBZSxDQUFmLElBQWtCLENBQWpELENBQWhEO0FBQ0g7QUFDSjtBQUNKOzs7OztrQkFwR2dCLFM7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDQXJCOztJQUFZLGE7Ozs7OztBQUNaLElBQUksUUFBUSxRQUFRLFlBQVIsQ0FBWixDOzs7Ozs7Ozs7Ozs7Ozs7OztJQUVxQixnQjtBQUNqQiw4QkFBWSxPQUFaLEVBQXFCLEtBQXJCLEVBQTRCLFFBQTVCLEVBQXNDO0FBQUE7O0FBQ2xDLGFBQUssT0FBTCxHQUFlLE9BQWY7QUFDQSxhQUFLLEtBQUwsR0FBYSxLQUFiO0FBQ0EsYUFBSyxHQUFMLEdBQVcsQ0FBQyxRQUFRLENBQVQsS0FBZSxRQUFRLENBQXZCLENBQVg7OztBQUdBLGFBQUssTUFBTCxHQUFjLFFBQWQ7OztBQUdBLGFBQUssT0FBTCxHQUFlLElBQUksY0FBYyxPQUFsQixDQUEwQixFQUFFLGNBQWEsS0FBSyxPQUFwQixFQUE2QixrQkFBaUIsZUFBOUMsRUFBMUIsQ0FBZjs7O0FBR0EsYUFBSyxnQkFBTCxHQUF3QixNQUFNLFVBQU4sQ0FBaUIsSUFBRSxLQUFLLEtBQXhCLENBQXhCO0FBQ0g7Ozs7NkJBRUksTSxFQUFRO0FBQUE7O0FBRVQsaUJBQUssT0FBTCxDQUFhLElBQWIsQ0FBa0IsTUFBbEIsRUFBMEIsSUFBMUIsQ0FBZ0MsWUFBTTs7O0FBR2xDLG9CQUFJLG1CQUFtQixFQUF2QjtBQUNBLHNCQUFLLFVBQUwsR0FBa0IsRUFBbEI7QUFDQSxxQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLE1BQUssZ0JBQUwsQ0FBc0IsTUFBMUMsRUFBa0QsR0FBbEQsRUFBdUQ7O0FBRW5ELHFDQUFpQixJQUFqQixDQUFzQixNQUFLLE9BQUwsQ0FBYSxPQUFiLENBQXFCLE1BQUssZ0JBQUwsQ0FBc0IsQ0FBdEIsQ0FBckIsRUFBK0MsUUFBckU7O0FBRUEsMEJBQUssVUFBTCxDQUFnQixJQUFoQixDQUFxQixNQUFLLE9BQUwsQ0FBYSxPQUFiLENBQXFCLE1BQUssZ0JBQUwsQ0FBc0IsQ0FBdEIsQ0FBckIsRUFBK0MsR0FBcEU7QUFDSDs7OztBQUlELG9CQUFJLGlCQUFpQixDQUFyQjtBQUNBLHFCQUFLLElBQUksS0FBSSxDQUFiLEVBQWdCLEtBQUksTUFBSyxnQkFBTCxDQUFzQixNQUExQyxFQUFrRCxJQUFsRCxFQUF1RDtBQUNuRCx3QkFBSSxNQUFLLGdCQUFMLENBQXNCLEVBQXRCLEVBQXlCLENBQXpCLElBQThCLENBQWxDLEVBQXFDLE1BQUssZ0JBQUwsQ0FBc0IsRUFBdEIsRUFBeUIsQ0FBekIsS0FBK0IsS0FBL0I7QUFDckMsc0NBQWtCLEtBQUssSUFBTCxDQUNkLEtBQUssR0FBTCxDQUFTLE1BQUssZ0JBQUwsQ0FBc0IsRUFBdEIsRUFBeUIsQ0FBekIsSUFBOEIsaUJBQWlCLEVBQWpCLEVBQW9CLENBQXBCLENBQXZDLEVBQStELENBQS9ELElBQ0EsS0FBSyxHQUFMLENBQVMsTUFBSyxnQkFBTCxDQUFzQixFQUF0QixFQUF5QixDQUF6QixJQUE4QixpQkFBaUIsRUFBakIsRUFBb0IsQ0FBcEIsQ0FBdkMsRUFBK0QsQ0FBL0QsQ0FGYyxDQUFsQjs7QUFJSDtBQUNELHdCQUFRLEdBQVIsQ0FBWSw4REFBWixFQUNJLEtBQUssS0FBTCxDQUFXLGlCQUFlLEdBQTFCLElBQStCLEdBRG5DLEVBQ3dDLE9BRHhDLEVBRUksS0FBSyxLQUFMLENBQWEsaUJBQWUsTUFBSyxnQkFBTCxDQUFzQixNQUF0QyxHQUErQyxHQUEzRCxJQUFnRSxHQUZwRSxFQUV5RSxLQUZ6RTs7OztBQU1BLHNCQUFLLGNBQUwsR0FBc0IsTUFBTSxrQkFBTixDQUF5QixnQkFBekIsRUFBMkMsTUFBSyxLQUFoRCxDQUF0Qjs7O0FBR0Esc0JBQUssU0FBTCxHQUFpQixNQUFLLDBCQUFMLEVBQWpCOzs7QUFHQSxzQkFBSyxNQUFMLENBQVksTUFBSyxTQUFqQjtBQUNILGFBbkNEO0FBb0NIOzs7cURBRTRCOztBQUV6QixnQkFBSSxtQkFBbUIsS0FBSyxVQUFMLENBQWdCLENBQWhCLEVBQW1CLE1BQTFDLEM7QUFDQSxnQkFBSSx1QkFBdUIsS0FBSyxVQUFMLENBQWdCLENBQWhCLEVBQW1CLFVBQTlDLEM7QUFDQSxnQkFBSSxZQUFZLEtBQUssT0FBTCxDQUFhLFlBQWIsQ0FBMEIsS0FBSyxHQUEvQixFQUFvQyxnQkFBcEMsRUFBc0Qsb0JBQXRELENBQWhCOzs7QUFHQSxpQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEtBQUssR0FBekIsRUFBOEIsR0FBOUIsRUFBbUM7QUFDL0Isb0JBQUksd0JBQXdCLElBQUksWUFBSixDQUFpQixnQkFBakIsQ0FBNUI7QUFDQSxxQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEtBQUssVUFBTCxDQUFnQixNQUFwQyxFQUE0QyxHQUE1QyxFQUFpRDtBQUM3Qyx5QkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLGdCQUFwQixFQUFzQyxHQUF0QyxFQUEyQztBQUN2Qyw4Q0FBc0IsQ0FBdEIsS0FBNEIsS0FBSyxjQUFMLENBQW9CLENBQXBCLEVBQXVCLENBQXZCLElBQTRCLEtBQUssVUFBTCxDQUFnQixDQUFoQixFQUFtQixjQUFuQixDQUFrQyxDQUFsQyxFQUFxQyxDQUFyQyxDQUF4RDtBQUNIO0FBQ0o7QUFDRCwwQkFBVSxjQUFWLENBQXlCLENBQXpCLEVBQTRCLEdBQTVCLENBQWdDLHFCQUFoQztBQUNIOztBQUVELG1CQUFPLFNBQVA7QUFDSDs7Ozs7a0JBMUVnQixnQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDSHJCLElBQUksUUFBUSxRQUFRLFlBQVIsQ0FBWjs7SUFFcUIsZ0I7QUFDakIsOEJBQVksT0FBWixFQUFxQixLQUFyQixFQUE0QixRQUE1QixFQUFzQztBQUFBOztBQUNsQyxhQUFLLE9BQUwsR0FBZSxPQUFmO0FBQ0EsYUFBSyxLQUFMLEdBQWEsS0FBYjtBQUNBLGFBQUssR0FBTCxHQUFXLENBQUMsUUFBUSxDQUFULEtBQWUsUUFBUSxDQUF2QixDQUFYOztBQUVBLGFBQUssTUFBTCxHQUFjLFFBQWQ7O0FBRUEsYUFBSyxZQUFMLEdBQW9CLE1BQU0sVUFBTixDQUFpQixJQUFFLEtBQUssS0FBeEIsQ0FBcEI7QUFDQSxhQUFLLElBQUwsR0FBWSxLQUFLLFlBQUwsQ0FBa0IsTUFBOUI7O0FBRUEsYUFBSyxnQkFBTCxHQUF3QixDQUFDLENBQUQsRUFBRyxDQUFILENBQXhCO0FBQ0g7Ozs7NkJBRUksTSxFQUFROztBQUVULGdCQUFJLE9BQU8sSUFBWDs7QUFFQSxnQkFBSSxjQUFjLElBQUksY0FBSixFQUFsQjtBQUNBLHdCQUFZLElBQVosQ0FBaUIsS0FBakIsRUFBd0IsTUFBeEIsRUFBZ0MsSUFBaEM7QUFDQSx3QkFBWSxZQUFaLEdBQTJCLE1BQTNCO0FBQ0Esd0JBQVksTUFBWixHQUFxQixZQUFXOztBQUU1QixxQkFBSyxpQkFBTCxDQUF1QixZQUFZLFFBQW5DOztBQUVBLHFCQUFLLGFBQUwsR0FBcUIsTUFBTSxtQkFBTixDQUEwQixLQUFLLGFBQS9CLEVBQThDLEtBQUssZ0JBQW5ELENBQXJCOztBQUVBLG9CQUFJLGFBQWEsTUFBTSxXQUFOLENBQWtCLEtBQUssWUFBdkIsRUFBcUMsS0FBSyxhQUExQyxFQUF5RCxLQUFLLGdCQUE5RCxDQUFqQjs7QUFFQSxxQkFBSyxnQkFBTCxHQUF3QixLQUFLLGNBQUwsQ0FBb0IsVUFBcEIsRUFBZ0MsS0FBSyxhQUFyQyxDQUF4QjtBQUNBLHFCQUFLLFNBQUwsR0FBaUIsS0FBSyxxQkFBTCxDQUEyQixVQUEzQixFQUF1QyxLQUFLLEtBQTVDLENBQWpCOztBQUVBLHFCQUFLLGlCQUFMO0FBQ0gsYUFaRDtBQWFBLHdCQUFZLElBQVosRztBQUNIOzs7MENBRWlCLE8sRUFBUztBQUN2QixnQkFBSSxPQUFPLElBQVg7QUFDQSxpQkFBSyxFQUFMLEdBQVUsUUFBUSxNQUFSLENBQWUsQ0FBZixFQUFrQixJQUFsQixDQUF1QixDQUF2QixDQUFWLEM7QUFDQSxpQkFBSyxNQUFMLEdBQWMsUUFBUSxNQUFSLENBQWUsQ0FBZixFQUFrQixJQUFsQixDQUF1QixNQUFyQyxDO0FBQ0EsaUJBQUssUUFBTCxHQUFnQixRQUFRLE1BQVIsQ0FBZSxDQUFmLEVBQWtCLElBQWxCLENBQXVCLENBQXZCLEVBQTBCLENBQTFCLEVBQTZCLE1BQTdDLEM7O0FBRUEsaUJBQUssYUFBTCxHQUFxQixFQUFyQjtBQUNBLG9CQUFRLE1BQVIsQ0FBZSxDQUFmLEVBQWtCLElBQWxCLENBQXVCLE9BQXZCLENBQStCLFVBQVMsT0FBVCxFQUFrQjtBQUNsQixxQkFBSyxhQUFMLENBQW1CLElBQW5CLENBQXdCLENBQUMsUUFBUSxDQUFSLENBQUQsRUFBYSxRQUFRLENBQVIsQ0FBYixDQUF4QjtBQUNDLGFBRmhDOztBQUlBLGlCQUFLLEtBQUwsR0FBYSxFQUFiO0FBQ0Esb0JBQVEsTUFBUixDQUFlLENBQWYsRUFBa0IsSUFBbEIsQ0FBdUIsT0FBdkIsQ0FBK0IsVUFBUyxPQUFULEVBQWtCO0FBQ2xCLG9CQUFJLE9BQU8sSUFBSSxZQUFKLENBQWlCLFFBQVEsQ0FBUixDQUFqQixDQUFYO0FBQ0Esb0JBQUksUUFBUSxJQUFJLFlBQUosQ0FBaUIsUUFBUSxDQUFSLENBQWpCLENBQVo7QUFDQSxxQkFBSyxLQUFMLENBQVcsSUFBWCxDQUFnQixDQUFDLElBQUQsRUFBTyxLQUFQLENBQWhCO0FBQ0MsYUFKaEM7QUFLSDs7O3VDQUVjLFUsRUFBWSxhLEVBQWU7O0FBRXRDLGdCQUFJLFFBQVEsV0FBVyxNQUF2QjtBQUNBLGdCQUFJLG1CQUFtQixFQUF2QjtBQUNBLGlCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksS0FBcEIsRUFBMkIsR0FBM0IsRUFBZ0M7O0FBRTVCLGlDQUFpQixJQUFqQixDQUFzQixjQUFjLFdBQVcsQ0FBWCxDQUFkLENBQXRCO0FBQ0g7QUFDRCxtQkFBTyxnQkFBUDs7Ozs7Ozs7Ozs7Ozs7O0FBZUg7Ozs4Q0FFcUIsVSxFQUFZLEssRUFBTzs7QUFFckMsZ0JBQUksUUFBUSxXQUFXLE1BQXZCO0FBQ0EsZ0JBQUksZ0JBQWdCLEVBQXBCO0FBQ0EsaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxLQUFwQixFQUEyQixHQUEzQixFQUFnQzs7QUFFNUIsOEJBQWMsSUFBZCxDQUFtQixNQUFNLFdBQVcsQ0FBWCxDQUFOLENBQW5CO0FBQ0g7QUFDRCxtQkFBTyxhQUFQO0FBQ0g7Ozs0Q0FFbUI7OztBQUdoQixpQkFBSyxjQUFMLEdBQXNCLE1BQU0scUJBQU4sQ0FBNEIsS0FBSyxnQkFBakMsRUFBbUQsS0FBSyxLQUF4RCxDQUF0Qjs7QUFFQSxpQkFBSyxTQUFMLEdBQWlCLEtBQUssMEJBQUwsQ0FBZ0MsS0FBSyxHQUFyQyxFQUEwQyxLQUFLLFFBQS9DLEVBQXlELEtBQUssRUFBOUQsRUFBa0UsS0FBSyxTQUF2RSxFQUFrRixLQUFLLGNBQXZGLENBQWpCOztBQUVBLGlCQUFLLE1BQUwsQ0FBWSxLQUFLLFNBQWpCO0FBQ0g7OzttREFFMEIsRyxFQUFLLFEsRUFBVSxVLEVBQVksSyxFQUFPLGMsRUFBZ0I7O0FBRXpFLGdCQUFJLFdBQVMsTUFBTSxDQUFOLEVBQVMsQ0FBVCxFQUFZLE1BQXpCLEVBQWlDLFdBQVcsTUFBTSxDQUFOLEVBQVMsQ0FBVCxFQUFZLE1BQXZCO0FBQ2pDLGdCQUFJLFlBQVksS0FBSyxPQUFMLENBQWEsWUFBYixDQUEwQixHQUExQixFQUErQixRQUEvQixFQUF5QyxVQUF6QyxDQUFoQjs7O0FBR0EsaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxHQUFwQixFQUF5QixHQUF6QixFQUE4QjtBQUMxQixvQkFBSSx3QkFBd0IsSUFBSSxZQUFKLENBQWlCLFFBQWpCLENBQTVCO0FBQ0EscUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxNQUFNLE1BQTFCLEVBQWtDLEdBQWxDLEVBQXVDO0FBQ25DLHlCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksUUFBcEIsRUFBOEIsR0FBOUIsRUFBbUM7QUFDL0IsOENBQXNCLENBQXRCLEtBQTRCLGVBQWUsQ0FBZixFQUFrQixDQUFsQixJQUF1QixNQUFNLENBQU4sRUFBUyxDQUFULEVBQVksQ0FBWixDQUFuRDtBQUNIO0FBQ0o7QUFDRCwwQkFBVSxjQUFWLENBQXlCLENBQXpCLEVBQTRCLEdBQTVCLENBQWdDLHFCQUFoQztBQUNIO0FBQ0QsbUJBQU8sU0FBUDtBQUNIOzs7OztrQkF0SGdCLGdCOzs7Ozs7Ozs7Ozs7Ozs7b0RDakJaLE87Ozs7Ozs7OztxREFDQSxPOzs7Ozs7Ozs7b0RBQ0EsTzs7Ozs7Ozs7O3FEQUNBLE87Ozs7Ozs7OztvREFDQSxPOzs7Ozs7Ozs7d0RBQ0EsTzs7Ozs7Ozs7O2dEQUNBLE87Ozs7Ozs7OzttREFDQSxPOzs7Ozs7Ozs7b0RBQ0EsTzs7Ozs7Ozs7O3lEQUNBLE87Ozs7Ozs7OzswREFDQSxPOzs7Ozs7Ozs7OENBRUEsTzs7Ozs7Ozs7O3FEQUNBLE87Ozs7Ozs7OztxREFDQSxPOzs7O0FBRVQ7O0lBQVksVzs7QUFHWjs7SUFBWSxNOzs7Ozs7QUFGTCxJQUFNLGtDQUFhLFdBQW5COztBQUdBLElBQU0sd0JBQVEsTUFBZDs7OzhFQ0NTLE8sQ0FBQSxPLFNBd0JBLE8sQ0FBQSxPLFNBeUJBLGtCLENBQUEsa0IsU0E2RkEsbUIsQ0FBQSxtQixTQTRCQSxXLENBQUEsVyxTQTJDQSxVLENBQUEsVTs7Ozs7Ozs7Ozs7Ozs7OztBQXpOaEIsR0FBSSxTQUFVLFFBQVEsU0FBUixDQUFkLENBQ0EsR0FBSSxRQUFTLFFBQVEsOEJBQVIsQ0FBYixDQUNBLEdBQUksWUFBYSxRQUFRLGFBQVIsQ0FBakIsQ0FFTyxRQUFTLFFBQVQsQ0FBaUIsVUFBakIsQ0FBNkIsQzs7O0FBSWhDLEdBQUksYUFBYyxFQUFsQixDQUNBLEdBQUksUUFBUyxLQUFLLEVBQUwsQ0FBVSxLQUF2QixDQUVBLElBQUssR0FBSSxHQUFJLENBQWIsQ0FBZ0IsRUFBSSxXQUFXLE1BQS9CLENBQXVDLEdBQXZDLENBQTRDLENBQ3hDLEdBQUksV0FBVyxDQUFYLEVBQWMsTUFBZCxFQUF3QixDQUE1QixDQUNBLFlBQVksSUFBWixDQUFpQixDQUNDLFdBQVcsQ0FBWCxFQUFjLENBQWQsRUFBbUIsTUFEcEIsQ0FFQyxXQUFXLENBQVgsRUFBYyxDQUFkLEVBQW1CLE1BRnBCLENBR0MsV0FBVyxDQUFYLEVBQWMsQ0FBZCxDQUhELENBQWpCLEVBREEsSUFNSyxJQUFJLFdBQVcsQ0FBWCxFQUFjLE1BQWQsRUFBd0IsQ0FBNUIsQ0FDTCxZQUFZLElBQVosQ0FBaUIsQ0FDRCxXQUFXLENBQVgsRUFBYyxDQUFkLEVBQW1CLE1BRGxCLENBRUQsV0FBVyxDQUFYLEVBQWMsQ0FBZCxFQUFtQixNQUZsQixDQUFqQixFQUtILENBQ0QsTUFBTyxZQUFQLENBQ0gsQ0FFTSxRQUFTLFFBQVQsQ0FBaUIsVUFBakIsQ0FBNkIsQzs7O0FBSWhDLEdBQUksYUFBYyxFQUFsQixDQUNBLEdBQUksUUFBUyxNQUFRLEtBQUssRUFBMUIsQ0FFQSxJQUFLLEdBQUksR0FBSSxDQUFiLENBQWdCLEVBQUksV0FBVyxNQUEvQixDQUF1QyxHQUF2QyxDQUE0QyxDQUN4QyxHQUFJLFdBQVcsQ0FBWCxFQUFjLE1BQWQsRUFBd0IsQ0FBNUIsQ0FDSSxZQUFZLElBQVosQ0FBaUIsQ0FDQyxXQUFXLENBQVgsRUFBYyxDQUFkLEVBQW1CLE1BRHBCLENBRUMsV0FBVyxDQUFYLEVBQWMsQ0FBZCxFQUFtQixNQUZwQixDQUdDLFdBQVcsQ0FBWCxFQUFjLENBQWQsQ0FIRCxDQUFqQixFQURKLElBTUssSUFBSSxXQUFXLENBQVgsRUFBYyxNQUFkLEVBQXdCLENBQTVCLENBQ0QsWUFBWSxJQUFaLENBQWlCLENBQ0MsV0FBVyxDQUFYLEVBQWMsQ0FBZCxFQUFtQixNQURwQixDQUVDLFdBQVcsQ0FBWCxFQUFjLENBQWQsRUFBbUIsTUFGcEIsQ0FBakIsRUFLUCxDQUNELE1BQU8sWUFBUCxDQUNILENBR00sUUFBUyxtQkFBVCxDQUE0QixhQUE1QixDQUEyQyxLQUEzQyxDQUFrRCxDO0FBR3JELEdBQUksZUFBZ0IsUUFBUSxhQUFSLENBQXBCLENBQ0EsR0FBSSxVQUFXLE9BQU8sZUFBUCxDQUF1QixhQUF2QixDQUFmLENBQ0EsR0FBSSxVQUFXLFdBQVcsUUFBWCxDQUFmLENBQ0EsR0FBSSxNQUFPLFNBQVMsTUFBcEIsQ0FDQSxHQUFJLFFBQVMsY0FBYyxNQUEzQixDO0FBR0EsR0FBSSxjQUFlLEdBQUksTUFBSixDQUFVLElBQVYsQ0FBbkIsQ0FDQSxJQUFLLEdBQUksR0FBRSxDQUFYLENBQWMsRUFBRSxJQUFoQixDQUFzQixHQUF0QixDQUEyQixDO0FBR3ZCLEdBQUksV0FBWSxHQUFJLE1BQUosQ0FBVSxDQUFWLENBQWhCLENBQ0EsSUFBSyxHQUFJLEdBQUUsQ0FBWCxDQUFjLEVBQUUsQ0FBaEIsQ0FBbUIsR0FBbkIsQ0FBd0IsQ0FDcEIsVUFBVSxDQUFWLEVBQWUsU0FBUyxTQUFTLENBQVQsRUFBWSxDQUFaLENBQVQsQ0FBZixDQUNILEM7QUFFRCxHQUFJLFlBQWEsUUFBUSxHQUFSLENBQVksU0FBWixDQUFqQixDQUNBLEdBQUksWUFBYSxFQUFqQixDO0FBQ0EsSUFBSyxHQUFJLElBQUUsQ0FBWCxDQUFjLEdBQUUsQ0FBaEIsQ0FBbUIsSUFBbkIsQ0FBd0IsQ0FDcEIsSUFBSyxHQUFJLEdBQUUsQ0FBWCxDQUFjLEVBQUUsQ0FBaEIsQ0FBbUIsR0FBbkIsQ0FBd0IsQ0FDcEIsV0FBVyxJQUFYLENBQWdCLFdBQVcsQ0FBWCxFQUFjLEVBQWQsQ0FBaEIsRUFDSCxDQUNKLENBQ0QsYUFBYSxDQUFiLEVBQWtCLFVBQWxCLEM7QUFDSCxDOztBQUlELEdBQUksR0FBSSxFQUFFLEtBQUYsQ0FBVSxDQUFsQixDO0FBRUEsR0FBSSxhQUFjLFdBQVcsRUFBRSxLQUFiLENBQWxCLENBQ0EsR0FBSSxhQUFjLFFBQVEsV0FBUixDQUFsQixDQUNBLEdBQUksTUFBTyxNQUFNLFdBQU4sQ0FBbUIsUUFBbkIsQ0FBNkIsWUFBN0IsQ0FBMkMsTUFBM0MsQ0FBWCxDQUNBLEtBQU8sUUFBUSxTQUFSLENBQWtCLElBQWxCLENBQVAsQztBQUdBLEdBQUksTUFBTyxPQUFPLGFBQVAsQ0FBcUIsS0FBckIsQ0FBNEIsV0FBNUIsQ0FBWCxDQUNBLEtBQU8sUUFBUSxTQUFSLENBQWtCLElBQWxCLENBQVAsQztBQUVBLEdBQUksS0FBTSxZQUFZLE1BQXRCLENBQ0EsR0FBSSxPQUFRLFFBQVEsVUFBUixDQUFtQixJQUFuQixDQUF5QixJQUF6QixDQUFaLENBQ0EsTUFBUSxRQUFRLEdBQVIsQ0FBWSxFQUFFLEdBQWQsQ0FBbUIsS0FBbkIsQ0FBUixDQUNBLE1BQU8sTUFBUCxDQUNILENBR0QsR0FBSSxPQUFRLFFBQVIsTUFBUSxDQUFVLFFBQVYsQ0FBb0IsUUFBcEIsQ0FBOEIsU0FBOUIsQ0FBeUMsTUFBekMsQ0FBaUQsQ0FFekQsR0FBSSxPQUFRLFNBQVMsTUFBckIsQ0FDQSxHQUFJLEtBQU0sTUFBVixDQUNBLEdBQUksTUFBTyxTQUFTLE1BQXBCLENBRUEsUUFBUyxjQUFULENBQXVCLFFBQXZCLENBQWlDLENBQzdCLE1BQU8sTUFBSyxHQUFMLENBQVMsS0FBVCxDQUFlLElBQWYsQ0FBcUIsUUFBckIsQ0FBUCxDQUNILENBRUQsR0FBSSxTQUFVLEdBQUksTUFBSixDQUFVLEtBQVYsQ0FBZCxDQUNBLEdBQUksR0FBSSxPQUFPLGVBQVAsQ0FBdUIsUUFBdkIsQ0FBUixDQUVBLElBQUssR0FBSSxJQUFHLENBQVosQ0FBZSxHQUFHLEtBQWxCLENBQXlCLElBQXpCLENBQStCLENBQzNCLEdBQUksR0FBSSxFQUFFLEVBQUYsQ0FBUixDQUNBLEdBQUksT0FBUSxHQUFJLE1BQUosQ0FBVSxHQUFWLENBQVosQ0FDQSxNQUFNLElBQU4sQ0FBVyxDQUFYLEVBRUEsSUFBSyxHQUFJLEdBQUUsQ0FBWCxDQUFjLEVBQUUsSUFBaEIsQ0FBc0IsR0FBdEIsQ0FBMkIsQ0FDdkIsR0FBSSxPQUFRLEVBQVosQ0FDQSxHQUFJLE9BQVEsQ0FBRSxVQUFVLENBQVYsRUFBYSxDQUFiLENBQUYsQ0FBbUIsVUFBVSxDQUFWLEVBQWEsQ0FBYixDQUFuQixDQUFvQyxVQUFVLENBQVYsRUFBYSxDQUFiLENBQXBDLENBQVosQ0FDQSxNQUFNLENBQU4sRUFBVyxRQUFRLEtBQVIsQ0FBZSxLQUFmLENBQXVCLENBQXZCLENBQVgsQ0FDQSxNQUFRLENBQUUsVUFBVSxDQUFWLEVBQWEsQ0FBYixDQUFGLENBQW1CLFVBQVUsQ0FBVixFQUFhLENBQWIsQ0FBbkIsQ0FBb0MsVUFBVSxDQUFWLEVBQWEsQ0FBYixDQUFwQyxDQUFSLENBQ0EsTUFBTSxDQUFOLEVBQVcsUUFBUSxLQUFSLENBQWUsS0FBZixDQUF1QixDQUF2QixDQUFYLENBQ0EsTUFBUSxDQUFFLFVBQVUsQ0FBVixFQUFhLENBQWIsQ0FBRixDQUFtQixVQUFVLENBQVYsRUFBYSxDQUFiLENBQW5CLENBQW9DLFVBQVUsQ0FBVixFQUFhLENBQWIsQ0FBcEMsQ0FBUixDQUNBLE1BQU0sQ0FBTixFQUFXLFFBQVEsS0FBUixDQUFlLEtBQWYsQ0FBdUIsQ0FBdkIsQ0FBWCxDQUNBLEdBQUksY0FBYyxLQUFkLEVBQXVCLENBQUMsS0FBNUIsQ0FBbUMsQ0FFL0IsR0FBSSxZQUFhLEtBQUssSUFBTCxDQUFVLFFBQVEsR0FBUixDQUFZLFFBQVEsR0FBUixDQUFZLEtBQVosQ0FBa0IsQ0FBbEIsQ0FBWixDQUFWLENBQWpCLEM7QUFDQSxHQUFJLGNBQWUsUUFBUSxHQUFSLENBQVksS0FBWixDQUFtQixVQUFuQixDQUFuQixDQUNBLElBQUssR0FBSSxHQUFFLENBQVgsQ0FBYSxFQUFFLENBQWYsQ0FBaUIsR0FBakIsQ0FBc0IsQ0FDbEIsTUFBTyxTQUFTLENBQVQsRUFBWSxDQUFaLENBQVAsRUFBMEIsYUFBYSxDQUFiLENBQTFCLENBQ0gsQ0FDRCxNQUNILENBQ0osQ0FFRCxHQUFJLFlBQWEsS0FBSyxJQUFMLENBQVUsUUFBUSxHQUFSLENBQVksUUFBUSxHQUFSLENBQVksS0FBWixDQUFrQixDQUFsQixDQUFaLENBQVYsQ0FBakIsQztBQUNBLEdBQUksY0FBZSxRQUFRLEdBQVIsQ0FBWSxLQUFaLENBQW1CLFVBQW5CLENBQW5CLENBQ0EsUUFBUSxFQUFSLEVBQWMsWUFBZCxDQUNILENBQ0QsTUFBTyxRQUFQLENBQ0gsQ0ExQ0QsQ0E0Q08sUUFBUyxvQkFBVCxDQUE2QixRQUE3QixDQUF1QyxPQUF2QyxDQUFnRCxDQUVuRCxHQUFJLE9BQVEsU0FBUyxNQUFyQixDQUNBLEdBQUksVUFBVyxPQUFPLGVBQVAsQ0FBdUIsUUFBUSxRQUFSLENBQXZCLENBQWYsQ0FDQSxHQUFJLE1BQU8sS0FBSyxLQUFMLENBQVcsSUFBSSxRQUFRLENBQVIsQ0FBZixFQUE2QixDQUF4QyxDQUNBLEdBQUksTUFBTyxLQUFLLEtBQUwsQ0FBVyxJQUFJLFFBQVEsQ0FBUixDQUFmLEVBQTZCLENBQXhDLENBQ0EsR0FBSSxLQUFNLEdBQUksTUFBSixDQUFVLElBQVYsQ0FBVixDQUNBLElBQUksQ0FBSixFQUFTLENBQUMsR0FBVixDQUNBLElBQUssR0FBSSxHQUFFLENBQVgsQ0FBYyxFQUFFLElBQWhCLENBQXNCLEdBQXRCLENBQTJCLENBQ3ZCLElBQUksQ0FBSixFQUFTLElBQUksRUFBRSxDQUFOLEVBQVcsUUFBUSxDQUFSLENBQXBCLENBQ0gsQ0FDRCxHQUFJLE9BQVEsS0FBSyxJQUFqQixDQUNBLEdBQUksZUFBZ0IsR0FBSSxNQUFKLENBQVUsS0FBVixDQUFwQixDQUNBLElBQUssR0FBSSxLQUFJLENBQWIsQ0FBZ0IsSUFBSSxLQUFwQixDQUEyQixLQUEzQixDQUFnQyxDQUM1QixHQUFJLFVBQVcsQ0FBQyxDQUFHLElBQUUsSUFBSCxDQUFTLFFBQVEsQ0FBUixDQUFULENBQW9CLEdBQXRCLENBQTJCLEtBQUssS0FBTCxDQUFXLElBQUUsSUFBYixFQUFtQixRQUFRLENBQVIsQ0FBbkIsQ0FBOEIsRUFBekQsQ0FBRCxDQUFmLENBQ0EsR0FBSSxVQUFXLE9BQU8sZUFBUCxDQUF1QixRQUFRLFFBQVIsQ0FBdkIsQ0FBZixDQUNBLEdBQUksUUFBUyxJQUFiLENBQ0EsSUFBSyxHQUFJLEdBQUksQ0FBYixDQUFnQixFQUFJLEtBQXBCLENBQTJCLEdBQTNCLENBQWdDLENBQzVCLEdBQUksV0FBWSxRQUFRLEdBQVIsQ0FBWSxRQUFRLEdBQVIsQ0FBWSxRQUFRLEdBQVIsQ0FBWSxTQUFTLENBQVQsQ0FBWixDQUF5QixTQUFTLENBQVQsQ0FBekIsQ0FBWixDQUFrRCxDQUFsRCxDQUFaLENBQWhCLENBQ0EsR0FBSSxVQUFVLE1BQWQsQ0FBc0IsQ0FDbEIsY0FBYyxHQUFkLEVBQW1CLENBQW5CLENBQ0EsT0FBUyxTQUFULENBQ0gsQ0FDSixDQUNKLENBQ0QsTUFBTyxjQUFQLENBQ0gsQ0FFTSxRQUFTLFlBQVQsQ0FBcUIsUUFBckIsQ0FBK0IsYUFBL0IsQ0FBOEMsT0FBOUMsQ0FBdUQsQ0FFMUQsR0FBSSxPQUFRLFNBQVMsTUFBckIsQ0FDQSxHQUFJLE1BQU8sRUFBWCxDQUNBLEdBQUksTUFBTyxFQUFYLENBQ0EsSUFBSyxHQUFJLEdBQUksQ0FBYixDQUFnQixFQUFJLEtBQXBCLENBQTJCLEdBQTNCLENBQWdDLENBQzVCLEtBQUssSUFBTCxDQUFVLFNBQVMsQ0FBVCxFQUFZLENBQVosRUFBZSxHQUF6QixFQUNBLEtBQUssSUFBTCxDQUFVLFNBQVMsQ0FBVCxFQUFZLENBQVosRUFBZSxFQUF6QixFQUNILENBQ0QsR0FBSSxNQUFPLEtBQUssS0FBTCxDQUFXLElBQUksUUFBUSxDQUFSLENBQWYsRUFBNkIsQ0FBeEMsQ0FDQSxHQUFJLFVBQVcsUUFBUSxLQUFSLENBQWUsUUFBUSxHQUFSLENBQWEsUUFBUSxHQUFSLENBQVksSUFBWixDQUFpQixHQUFqQixDQUFiLENBQW9DLFFBQVEsQ0FBUixDQUFwQyxDQUFmLENBQWYsQ0FDQSxHQUFJLFdBQVksUUFBUSxLQUFSLENBQWUsUUFBUSxHQUFSLENBQVksSUFBWixDQUFrQixRQUFRLENBQVIsQ0FBbEIsQ0FBZixDQUFoQixDQUNBLEdBQUksV0FBWSxRQUFRLEdBQVIsQ0FBYSxRQUFRLEdBQVIsQ0FBWSxTQUFaLENBQXNCLElBQXRCLENBQWIsQ0FBMEMsUUFBMUMsQ0FBb0QsQ0FBcEQsQ0FBaEIsQ0FDQSxHQUFJLGNBQWUsRUFBbkIsQ0FDQSxJQUFLLEdBQUksS0FBSSxDQUFiLENBQWdCLElBQUksS0FBcEIsQ0FBMkIsS0FBM0IsQ0FBZ0MsQ0FDNUIsYUFBYSxJQUFiLENBQWtCLGNBQWMsVUFBVSxHQUFWLENBQWQsQ0FBbEIsRUFDSCxDQUNELE1BQU8sYUFBUCxDQUNILEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJNLFFBQVMsV0FBVCxDQUFvQixNQUFwQixDQUE0QixDQUMvQixHQUFJLE9BQVMsRUFBYixDQUFnQixDQUFFLEtBQU0sSUFBSSxNQUFKLENBQVUsc0RBQVYsQ0FBTixDQUEwRSxDQUE1RixJQUNLLElBQUksT0FBUyxDQUFiLENBQWUsQ0FBRSxLQUFNLElBQUksTUFBSixDQUFVLDRCQUFWLENBQU4sQ0FBZ0QsQ0FFdEUsR0FBSSxZQUFhLENBQ0MsQ0FDQyxDQUFDLElBQUQsQ0FBUyxJQUFULENBQWlCLElBQWpCLENBREQsQ0FFQyxDQUFDLE1BQUQsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBRkQsQ0FERCxDQUtDLENBQ0MsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQURELENBRUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FGRCxDQUdDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQUhELENBSUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBSkQsQ0FMRCxDQVdDLENBQ0MsQ0FBQyxJQUFELENBQVMsSUFBVCxDQUFpQixJQUFqQixDQURELENBRUMsQ0FBQyxNQUFELENBQVcsSUFBWCxDQUFtQixJQUFuQixDQUZELENBR0MsQ0FBQyxLQUFELENBQVMsSUFBVCxDQUFpQixJQUFqQixDQUhELENBSUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBSkQsQ0FLQyxDQUFDLElBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBTEQsQ0FNQyxDQUFDLElBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FORCxDQVhELENBbUJDLENBQ0MsQ0FBQyxJQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBREQsQ0FFQyxDQUFDLENBQUMsS0FBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0FGRCxDQUdDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQUhELENBSUMsQ0FBQyxJQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQUpELENBS0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBTEQsQ0FNQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FORCxDQU9DLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQVBELENBUUMsQ0FBQyxNQUFELENBQVcsSUFBWCxDQUFtQixJQUFuQixDQVJELENBU0MsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQVRELENBVUMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQVZELENBV0MsQ0FBQyxLQUFELENBQVMsSUFBVCxDQUFpQixJQUFqQixDQVhELENBWUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FaRCxDQW5CRCxDQWlDQyxDQUNDLENBQUMsSUFBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQURELENBRUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBRkQsQ0FHQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FIRCxDQUlDLENBQUMsSUFBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FKRCxDQUtDLENBQUMsQ0FBQyxNQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQUxELENBTUMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBTkQsQ0FPQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FQRCxDQVFDLENBQUMsTUFBRCxDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0FSRCxDQVNDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FURCxDQVVDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FWRCxDQVdDLENBQUMsS0FBRCxDQUFTLElBQVQsQ0FBaUIsSUFBakIsQ0FYRCxDQVlDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBWkQsQ0FqQ0QsQ0ErQ0MsQ0FDQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBREQsQ0FFQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQUZELENBR0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBSEQsQ0FJQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FKRCxDQUtDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQUxELENBTUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBTkQsQ0FPQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBUEQsQ0FRQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQVJELENBU0MsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQVRELENBVUMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBVkQsQ0FXQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBWEQsQ0FZQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FaRCxDQWFDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWJELENBY0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FkRCxDQWVDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWZELENBZ0JDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBaEJELENBaUJDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FqQkQsQ0FrQkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBbEJELENBbUJDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQW5CRCxDQW9CQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBcEJELENBcUJDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBckJELENBc0JDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXRCRCxDQXVCQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0F2QkQsQ0F3QkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F4QkQsQ0EvQ0QsQ0F5RUMsQ0FDQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBREQsQ0FFQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQUZELENBR0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBSEQsQ0FJQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FKRCxDQUtDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQUxELENBTUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBTkQsQ0FPQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBUEQsQ0FRQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQVJELENBU0MsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQVRELENBVUMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBVkQsQ0FXQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBWEQsQ0FZQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FaRCxDQWFDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWJELENBY0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FkRCxDQWVDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWZELENBZ0JDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBaEJELENBaUJDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FqQkQsQ0FrQkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBbEJELENBbUJDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQW5CRCxDQW9CQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBcEJELENBcUJDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBckJELENBc0JDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXRCRCxDQXVCQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0F2QkQsQ0F3QkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F4QkQsQ0F6RUQsQ0FtR0MsQ0FDQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FERCxDQUVDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FGRCxDQUdDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FIRCxDQUlDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQUpELENBS0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBTEQsQ0FNQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FORCxDQU9DLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQVBELENBUUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FSRCxDQVNDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBVEQsQ0FVQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBVkQsQ0FXQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FYRCxDQVlDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBWkQsQ0FhQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWJELENBY0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBZEQsQ0FlQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FmRCxDQWdCQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FoQkQsQ0FpQkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FqQkQsQ0FrQkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBbEJELENBbUJDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FuQkQsQ0FvQkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FwQkQsQ0FxQkMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBckJELENBc0JDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0F0QkQsQ0F1QkMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXZCRCxDQXdCQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F4QkQsQ0F5QkMsQ0FBQyxNQUFELENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBekJELENBMEJDLENBQUMsQ0FBQyxJQUFGLENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBMUJELENBMkJDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBM0JELENBNEJDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTVCRCxDQTZCQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E3QkQsQ0E4QkMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBOUJELENBK0JDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQS9CRCxDQWdDQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBaENELENBaUNDLENBQUMsSUFBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FqQ0QsQ0FrQ0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FsQ0QsQ0FtQ0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBbkNELENBb0NDLENBQUMsS0FBRCxDQUFTLElBQVQsQ0FBaUIsSUFBakIsQ0FwQ0QsQ0FuR0QsQ0F5SUMsQ0FDQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLElBQVYsQ0FBaUIsSUFBakIsQ0FERCxDQUVDLENBQUMsQ0FBQyxLQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQUZELENBR0MsQ0FBQyxDQUFDLElBQUYsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FIRCxDQUlDLENBQUMsSUFBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FKRCxDQUtDLENBQUMsTUFBRCxDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0FMRCxDQU1DLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBTkQsQ0FPQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FQRCxDQVFDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQVJELENBU0MsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQVRELENBVUMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBVkQsQ0FXQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0FYRCxDQVlDLENBQUMsS0FBRCxDQUFTLElBQVQsQ0FBaUIsSUFBakIsQ0FaRCxDQWFDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWJELENBY0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FkRCxDQWVDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBZkQsQ0FnQkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBaEJELENBaUJDLENBQUMsQ0FBQyxJQUFGLENBQVMsS0FBVCxDQUFpQixJQUFqQixDQWpCRCxDQWtCQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBbEJELENBbUJDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQW5CRCxDQW9CQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBcEJELENBcUJDLENBQUMsSUFBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXJCRCxDQXNCQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXRCRCxDQXVCQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0F2QkQsQ0F3QkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F4QkQsQ0F5QkMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXpCRCxDQTBCQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTFCRCxDQTJCQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0EzQkQsQ0E0QkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBNUJELENBNkJDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTdCRCxDQThCQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E5QkQsQ0ErQkMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQS9CRCxDQWdDQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWhDRCxDQWlDQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBakNELENBa0NDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWxDRCxDQW1DQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBbkNELENBb0NDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXBDRCxDQXFDQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FyQ0QsQ0FzQ0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F0Q0QsQ0F1Q0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBdkNELENBd0NDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBeENELENBeUNDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0F6Q0QsQ0EwQ0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBMUNELENBMkNDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTNDRCxDQTRDQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBNUNELENBNkNDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBN0NELENBOENDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTlDRCxDQStDQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0EvQ0QsQ0FnREMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FoREQsQ0F6SUQsQ0EyTEMsQ0FDQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FERCxDQUVDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBRkQsQ0FHQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQUhELENBSUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBSkQsQ0FLQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FMRCxDQU1DLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQU5ELENBT0MsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBUEQsQ0FRQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBUkQsQ0FTQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBVEQsQ0FVQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQVZELENBV0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBWEQsQ0FZQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBWkQsQ0FhQyxDQUFDLENBQUMsS0FBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0FiRCxDQWNDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FkRCxDQWVDLENBQUMsTUFBRCxDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0FmRCxDQWdCQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FoQkQsQ0FpQkMsQ0FBQyxJQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBakJELENBa0JDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWxCRCxDQW1CQyxDQUFDLENBQUMsSUFBRixDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FuQkQsQ0FvQkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FwQkQsQ0FxQkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FyQkQsQ0FzQkMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXRCRCxDQXVCQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLElBQVYsQ0FBaUIsSUFBakIsQ0F2QkQsQ0F3QkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0F4QkQsQ0F5QkMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBekJELENBMEJDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTFCRCxDQTJCQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTNCRCxDQTRCQyxDQUFDLE1BQUQsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBNUJELENBNkJDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBN0JELENBOEJDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBOUJELENBK0JDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0EvQkQsQ0FnQ0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBaENELENBaUNDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQWpDRCxDQWtDQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLElBQVYsQ0FBaUIsSUFBakIsQ0FsQ0QsQ0FtQ0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBbkNELENBb0NDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FwQ0QsQ0FxQ0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBckNELENBc0NDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F0Q0QsQ0F1Q0MsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXZDRCxDQXdDQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0F4Q0QsQ0F5Q0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBekNELENBMENDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTFDRCxDQTJDQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0EzQ0QsQ0E0Q0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E1Q0QsQ0E2Q0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E3Q0QsQ0E4Q0MsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTlDRCxDQStDQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0EvQ0QsQ0FnREMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FoREQsQ0FpREMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBakRELENBa0RDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWxERCxDQW1EQyxDQUFDLEtBQUQsQ0FBUyxJQUFULENBQWlCLElBQWpCLENBbkRELENBb0RDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBcERELENBcURDLENBQUMsSUFBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FyREQsQ0FzREMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXRERCxDQXVEQyxDQUFDLENBQUMsSUFBRixDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXZERCxDQXdEQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F4REQsQ0F5REMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBekRELENBMERDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTFERCxDQTJEQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0EzREQsQ0E0REMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0E1REQsQ0EzTEQsQ0F5UEMsQ0FDQyxDQUFDLE1BQUQsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBREQsQ0FFQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQUZELENBR0MsQ0FBQyxJQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQUhELENBSUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBSkQsQ0FLQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQUxELENBTUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FORCxDQU9DLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQVBELENBUUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBUkQsQ0FTQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQVRELENBVUMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQVZELENBV0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBWEQsQ0FZQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQVpELENBYUMsQ0FBQyxLQUFELENBQVMsSUFBVCxDQUFpQixJQUFqQixDQWJELENBY0MsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBZEQsQ0FlQyxDQUFDLENBQUMsTUFBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0FmRCxDQWdCQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWhCRCxDQWlCQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBakJELENBa0JDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWxCRCxDQW1CQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQW5CRCxDQW9CQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FwQkQsQ0FxQkMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBckJELENBc0JDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXRCRCxDQXVCQyxDQUFDLElBQUQsQ0FBUyxDQUFDLElBQVYsQ0FBaUIsSUFBakIsQ0F2QkQsQ0F3QkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBeEJELENBeUJDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0F6QkQsQ0EwQkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0ExQkQsQ0EyQkMsQ0FBQyxLQUFELENBQVMsSUFBVCxDQUFpQixJQUFqQixDQTNCRCxDQTRCQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTVCRCxDQTZCQyxDQUFDLENBQUMsS0FBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0E3QkQsQ0E4QkMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBOUJELENBK0JDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0EvQkQsQ0FnQ0MsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQWhDRCxDQWlDQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLElBQVYsQ0FBaUIsSUFBakIsQ0FqQ0QsQ0FrQ0MsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBbENELENBbUNDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQW5DRCxDQW9DQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FwQ0QsQ0FxQ0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxJQUFWLENBQWlCLElBQWpCLENBckNELENBc0NDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXRDRCxDQXVDQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBdkNELENBd0NDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXhDRCxDQXlDQyxDQUFDLE1BQUQsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBekNELENBMENDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBMUNELENBMkNDLENBQUMsQ0FBQyxLQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQTNDRCxDQTRDQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E1Q0QsQ0E2Q0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBN0NELENBOENDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E5Q0QsQ0ErQ0MsQ0FBQyxNQUFELENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBL0NELENBZ0RDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBaERELENBaURDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBakRELENBa0RDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FsREQsQ0FtREMsQ0FBQyxNQUFELENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBbkRELENBb0RDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FwREQsQ0FxREMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBckRELENBc0RDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXRERCxDQXVEQyxDQUFDLENBQUMsTUFBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0F2REQsQ0F3REMsQ0FBQyxJQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBeERELENBeURDLENBQUMsS0FBRCxDQUFTLElBQVQsQ0FBaUIsSUFBakIsQ0F6REQsQ0EwREMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0ExREQsQ0EyREMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBM0RELENBNERDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E1REQsQ0E2REMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0E3REQsQ0E4REMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E5REQsQ0ErREMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0EvREQsQ0FnRUMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWhFRCxDQWlFQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQWpFRCxDQWtFQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBbEVELENBbUVDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQW5FRCxDQW9FQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXBFRCxDQXFFQyxDQUFDLENBQUMsS0FBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0FyRUQsQ0FzRUMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBdEVELENBelBELENBaVVDLENBQ0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBREQsQ0FFQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FGRCxDQUdDLENBQUMsS0FBRCxDQUFTLElBQVQsQ0FBaUIsSUFBakIsQ0FIRCxDQUlDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBSkQsQ0FLQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBTEQsQ0FNQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBTkQsQ0FPQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQVBELENBUUMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBUkQsQ0FTQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FURCxDQVVDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQVZELENBV0MsQ0FBQyxNQUFELENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBWEQsQ0FZQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQVpELENBYUMsQ0FBQyxJQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBYkQsQ0FjQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FkRCxDQWVDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBZkQsQ0FnQkMsQ0FBQyxNQUFELENBQVcsSUFBWCxDQUFtQixJQUFuQixDQWhCRCxDQWlCQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWpCRCxDQWtCQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQWxCRCxDQW1CQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBbkJELENBb0JDLENBQUMsQ0FBQyxLQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQXBCRCxDQXFCQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FyQkQsQ0FzQkMsQ0FBQyxLQUFELENBQVMsQ0FBQyxJQUFWLENBQWlCLElBQWpCLENBdEJELENBdUJDLENBQUMsQ0FBQyxJQUFGLENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXZCRCxDQXdCQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBeEJELENBeUJDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F6QkQsQ0EwQkMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBMUJELENBMkJDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTNCRCxDQTRCQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E1QkQsQ0E2QkMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTdCRCxDQThCQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0E5QkQsQ0ErQkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0EvQkQsQ0FnQ0MsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWhDRCxDQWlDQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FqQ0QsQ0FrQ0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FsQ0QsQ0FtQ0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FuQ0QsQ0FvQ0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBcENELENBcUNDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXJDRCxDQXNDQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQXRDRCxDQXVDQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXZDRCxDQXdDQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F4Q0QsQ0F5Q0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBekNELENBMENDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTFDRCxDQTJDQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0EzQ0QsQ0E0Q0MsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQTVDRCxDQTZDQyxDQUFDLEtBQUQsQ0FBUyxJQUFULENBQWlCLElBQWpCLENBN0NELENBOENDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBOUNELENBK0NDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQS9DRCxDQWdEQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBaERELENBaURDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBakRELENBa0RDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBbERELENBbURDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQW5ERCxDQW9EQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXBERCxDQXFEQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FyREQsQ0FzREMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXRERCxDQXVEQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0F2REQsQ0F3REMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBeERELENBeURDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F6REQsQ0EwREMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBMURELENBMkRDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0EzREQsQ0E0REMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBNURELENBNkRDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0E3REQsQ0E4REMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQTlERCxDQStEQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0EvREQsQ0FnRUMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQWhFRCxDQWlFQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FqRUQsQ0FrRUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FsRUQsQ0FtRUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBbkVELENBb0VDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXBFRCxDQXFFQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXJFRCxDQXNFQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F0RUQsQ0F1RUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F2RUQsQ0F3RUMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBeEVELENBeUVDLENBQUMsTUFBRCxDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0F6RUQsQ0EwRUMsQ0FBQyxJQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBMUVELENBMkVDLENBQUMsQ0FBQyxLQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQTNFRCxDQTRFQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E1RUQsQ0E2RUMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTdFRCxDQThFQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0E5RUQsQ0ErRUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0EvRUQsQ0FnRkMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQWhGRCxDQWlGQyxDQUFDLENBQUMsSUFBRixDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FqRkQsQ0FrRkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FsRkQsQ0FtRkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0FuRkQsQ0FvRkMsQ0FBQyxLQUFELENBQVMsQ0FBQyxJQUFWLENBQWlCLElBQWpCLENBcEZELENBalVELENBdVpDLENBQ0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBREQsQ0FFQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBRkQsQ0FHQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBSEQsQ0FJQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FKRCxDQUtDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBTEQsQ0FNQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQU5ELENBT0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBUEQsQ0FRQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FSRCxDQVNDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FURCxDQVVDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FWRCxDQVdDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQVhELENBWUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBWkQsQ0FhQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FiRCxDQWNDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FkRCxDQWVDLENBQUMsTUFBRCxDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0FmRCxDQWdCQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FoQkQsQ0FpQkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0FqQkQsQ0FrQkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0FsQkQsQ0FtQkMsQ0FBQyxLQUFELENBQVMsQ0FBQyxJQUFWLENBQWlCLElBQWpCLENBbkJELENBb0JDLENBQUMsTUFBRCxDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQXBCRCxDQXFCQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXJCRCxDQXNCQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0F0QkQsQ0F1QkMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBdkJELENBd0JDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBeEJELENBeUJDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBekJELENBMEJDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQTFCRCxDQTJCQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0EzQkQsQ0E0QkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E1QkQsQ0E2QkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E3QkQsQ0E4QkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E5QkQsQ0ErQkMsQ0FBQyxJQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBL0JELENBZ0NDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQWhDRCxDQWlDQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FqQ0QsQ0FrQ0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBbENELENBbUNDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FuQ0QsQ0FvQ0MsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXBDRCxDQXFDQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0FyQ0QsQ0FzQ0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F0Q0QsQ0F1Q0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0F2Q0QsQ0F3Q0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxJQUFWLENBQWlCLElBQWpCLENBeENELENBeUNDLENBQUMsS0FBRCxDQUFTLElBQVQsQ0FBaUIsSUFBakIsQ0F6Q0QsQ0EwQ0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBMUNELENBMkNDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBM0NELENBNENDLENBQUMsSUFBRCxDQUFTLENBQUMsSUFBVixDQUFpQixJQUFqQixDQTVDRCxDQTZDQyxDQUFDLElBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0E3Q0QsQ0E4Q0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBOUNELENBK0NDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBL0NELENBZ0RDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBaERELENBaURDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBakRELENBa0RDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBbERELENBbURDLENBQUMsQ0FBQyxJQUFGLENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBbkRELENBb0RDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXBERCxDQXFEQyxDQUFDLENBQUMsTUFBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0FyREQsQ0FzREMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBdERELENBdURDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0F2REQsQ0F3REMsQ0FBQyxNQUFELENBQVcsSUFBWCxDQUFtQixJQUFuQixDQXhERCxDQXlEQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXpERCxDQTBEQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTFERCxDQTJEQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0EzREQsQ0E0REMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBNURELENBNkRDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBN0RELENBOERDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQTlERCxDQStEQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0EvREQsQ0FnRUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FoRUQsQ0FpRUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBakVELENBa0VDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWxFRCxDQW1FQyxDQUFDLElBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBbkVELENBb0VDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FwRUQsQ0FxRUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBckVELENBc0VDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0F0RUQsQ0F1RUMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXZFRCxDQXdFQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F4RUQsQ0F5RUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBekVELENBMEVDLENBQUMsSUFBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0ExRUQsQ0EyRUMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQTNFRCxDQTRFQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBNUVELENBNkVDLENBQUMsTUFBRCxDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0E3RUQsQ0E4RUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBOUVELENBK0VDLENBQUMsQ0FBQyxLQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQS9FRCxDQWdGQyxDQUFDLEtBQUQsQ0FBUyxJQUFULENBQWlCLElBQWpCLENBaEZELENBaUZDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWpGRCxDQWtGQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBbEZELENBbUZDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FuRkQsQ0FvRkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBcEZELENBcUZDLENBQUMsSUFBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FyRkQsQ0FzRkMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXRGRCxDQXVGQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F2RkQsQ0F3RkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBeEZELENBeUZDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBekZELENBMEZDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBMUZELENBMkZDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQTNGRCxDQTRGQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E1RkQsQ0E2RkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E3RkQsQ0E4RkMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQTlGRCxDQXZaRCxDQXVmQyxDQUNDLENBQUMsQ0FBQyxNQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQURELENBRUMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBRkQsQ0FHQyxDQUFDLEtBQUQsQ0FBUyxJQUFULENBQWlCLElBQWpCLENBSEQsQ0FJQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQUpELENBS0MsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQUxELENBTUMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQU5ELENBT0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FQRCxDQVFDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQVJELENBU0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBVEQsQ0FVQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FWRCxDQVdDLENBQUMsTUFBRCxDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQVhELENBWUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0FaRCxDQWFDLENBQUMsQ0FBQyxJQUFGLENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBYkQsQ0FjQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FkRCxDQWVDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWZELENBZ0JDLENBQUMsTUFBRCxDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQWhCRCxDQWlCQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWpCRCxDQWtCQyxDQUFDLENBQUMsTUFBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0FsQkQsQ0FtQkMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQW5CRCxDQW9CQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQXBCRCxDQXFCQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FyQkQsQ0FzQkMsQ0FBQyxLQUFELENBQVMsSUFBVCxDQUFpQixJQUFqQixDQXRCRCxDQXVCQyxDQUFDLElBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBdkJELENBd0JDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXhCRCxDQXlCQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBekJELENBMEJDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQTFCRCxDQTJCQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0EzQkQsQ0E0QkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBNUJELENBNkJDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E3QkQsQ0E4QkMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBOUJELENBK0JDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBL0JELENBZ0NDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FoQ0QsQ0FpQ0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBakNELENBa0NDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBbENELENBbUNDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBbkNELENBb0NDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXBDRCxDQXFDQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FyQ0QsQ0FzQ0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBdENELENBdUNDLENBQUMsSUFBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0F2Q0QsQ0F3Q0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0F4Q0QsQ0F5Q0MsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXpDRCxDQTBDQyxDQUFDLEtBQUQsQ0FBUyxJQUFULENBQWlCLElBQWpCLENBMUNELENBMkNDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBM0NELENBNENDLENBQUMsTUFBRCxDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQTVDRCxDQTZDQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E3Q0QsQ0E4Q0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBOUNELENBK0NDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQS9DRCxDQWdEQyxDQUFDLENBQUMsSUFBRixDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQWhERCxDQWlEQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWpERCxDQWtEQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWxERCxDQW1EQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FuREQsQ0FvREMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FwREQsQ0FxREMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBckRELENBc0RDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F0REQsQ0F1REMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBdkRELENBd0RDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXhERCxDQXlEQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBekRELENBMERDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTFERCxDQTJEQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBM0RELENBNERDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTVERCxDQTZEQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTdERCxDQThEQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTlERCxDQStEQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0EvREQsQ0FnRUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FoRUQsQ0FpRUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBakVELENBa0VDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FsRUQsQ0FtRUMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBbkVELENBb0VDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXBFRCxDQXFFQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBckVELENBc0VDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXRFRCxDQXVFQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBdkVELENBd0VDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXhFRCxDQXlFQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F6RUQsQ0EwRUMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBMUVELENBMkVDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0EzRUQsQ0E0RUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E1RUQsQ0E2RUMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQTdFRCxDQThFQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBOUVELENBK0VDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBL0VELENBZ0ZDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWhGRCxDQWlGQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FqRkQsQ0FrRkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBbEZELENBbUZDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQW5GRCxDQW9GQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXBGRCxDQXFGQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQXJGRCxDQXNGQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXRGRCxDQXVGQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLElBQVYsQ0FBaUIsSUFBakIsQ0F2RkQsQ0F3RkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F4RkQsQ0F5RkMsQ0FBQyxDQUFDLElBQUYsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBekZELENBMEZDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0ExRkQsQ0EyRkMsQ0FBQyxJQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBM0ZELENBNEZDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQTVGRCxDQTZGQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBN0ZELENBOEZDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTlGRCxDQStGQyxDQUFDLE1BQUQsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBL0ZELENBZ0dDLENBQUMsQ0FBQyxLQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQWhHRCxDQWlHQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FqR0QsQ0FrR0MsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBbEdELENBbUdDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FuR0QsQ0FvR0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FwR0QsQ0FxR0MsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXJHRCxDQXNHQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBdEdELENBdUdDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBdkdELENBd0dDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXhHRCxDQXlHQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F6R0QsQ0EwR0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBMUdELENBMkdDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTNHRCxDQTRHQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTVHRCxDQXZmRCxDQXFtQkMsQ0FDQyxDQUFDLENBQUMsS0FBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0FERCxDQUVDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FGRCxDQUdDLENBQUMsTUFBRCxDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0FIRCxDQUlDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQUpELENBS0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBTEQsQ0FNQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FORCxDQU9DLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQVBELENBUUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FSRCxDQVNDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBVEQsQ0FVQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBVkQsQ0FXQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLElBQVYsQ0FBaUIsSUFBakIsQ0FYRCxDQVlDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBWkQsQ0FhQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FiRCxDQWNDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBZEQsQ0FlQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWZELENBZ0JDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWhCRCxDQWlCQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FqQkQsQ0FrQkMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBbEJELENBbUJDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQW5CRCxDQW9CQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBcEJELENBcUJDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FyQkQsQ0FzQkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F0QkQsQ0F1QkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBdkJELENBd0JDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0F4QkQsQ0F5QkMsQ0FBQyxNQUFELENBQVcsSUFBWCxDQUFtQixJQUFuQixDQXpCRCxDQTBCQyxDQUFDLElBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0ExQkQsQ0EyQkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBM0JELENBNEJDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTVCRCxDQTZCQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBN0JELENBOEJDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQTlCRCxDQStCQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQS9CRCxDQWdDQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBaENELENBaUNDLENBQUMsQ0FBQyxJQUFGLENBQVMsS0FBVCxDQUFpQixJQUFqQixDQWpDRCxDQWtDQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWxDRCxDQW1DQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQW5DRCxDQW9DQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLElBQVYsQ0FBaUIsSUFBakIsQ0FwQ0QsQ0FxQ0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBckNELENBc0NDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F0Q0QsQ0F1Q0MsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXZDRCxDQXdDQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0F4Q0QsQ0F5Q0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBekNELENBMENDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTFDRCxDQTJDQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0EzQ0QsQ0E0Q0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E1Q0QsQ0E2Q0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E3Q0QsQ0E4Q0MsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTlDRCxDQStDQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0EvQ0QsQ0FnREMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FoREQsQ0FpREMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBakRELENBa0RDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWxERCxDQW1EQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBbkRELENBb0RDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBcERELENBcURDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FyREQsQ0FzREMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXRERCxDQXVEQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXZERCxDQXdEQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F4REQsQ0F5REMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBekRELENBMERDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTFERCxDQTJEQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0EzREQsQ0E0REMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E1REQsQ0E2REMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBN0RELENBOERDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTlERCxDQStEQyxDQUFDLElBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBL0RELENBZ0VDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBaEVELENBaUVDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FqRUQsQ0FrRUMsQ0FBQyxLQUFELENBQVMsSUFBVCxDQUFpQixJQUFqQixDQWxFRCxDQW1FQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQW5FRCxDQW9FQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0FwRUQsQ0FxRUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBckVELENBc0VDLENBQUMsQ0FBQyxNQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQXRFRCxDQXVFQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F2RUQsQ0F3RUMsQ0FBQyxDQUFDLElBQUYsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0F4RUQsQ0F5RUMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXpFRCxDQTBFQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBMUVELENBMkVDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTNFRCxDQTRFQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBNUVELENBNkVDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTdFRCxDQThFQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTlFRCxDQStFQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0EvRUQsQ0FnRkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBaEZELENBaUZDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBakZELENBa0ZDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWxGRCxDQW1GQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQW5GRCxDQW9GQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FwRkQsQ0FxRkMsQ0FBQyxNQUFELENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBckZELENBc0ZDLENBQUMsQ0FBQyxJQUFGLENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBdEZELENBdUZDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBdkZELENBd0ZDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXhGRCxDQXlGQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F6RkQsQ0EwRkMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBMUZELENBMkZDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTNGRCxDQTRGQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBNUZELENBNkZDLENBQUMsSUFBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0E3RkQsQ0E4RkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E5RkQsQ0ErRkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBL0ZELENBZ0dDLENBQUMsS0FBRCxDQUFTLElBQVQsQ0FBaUIsSUFBakIsQ0FoR0QsQ0FpR0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBakdELENBa0dDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWxHRCxDQW1HQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQW5HRCxDQW9HQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBcEdELENBcUdDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBckdELENBc0dDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBdEdELENBdUdDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F2R0QsQ0F3R0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBeEdELENBeUdDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXpHRCxDQTBHQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0ExR0QsQ0EyR0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBM0dELENBNEdDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E1R0QsQ0E2R0MsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTdHRCxDQThHQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0E5R0QsQ0ErR0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBL0dELENBZ0hDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWhIRCxDQWlIQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBakhELENBa0hDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQWxIRCxDQW1IQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQW5IRCxDQW9IQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBcEhELENBcUhDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXJIRCxDQXNIQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXRIRCxDQXVIQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXZIRCxDQXdIQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0F4SEQsQ0FybUJELENBK3RCQyxDQUNDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBREQsQ0FFQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FGRCxDQUdDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQUhELENBSUMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBSkQsQ0FLQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQUxELENBTUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBTkQsQ0FPQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBUEQsQ0FRQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQVJELENBU0MsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBVEQsQ0FVQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBVkQsQ0FXQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBWEQsQ0FZQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FaRCxDQWFDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWJELENBY0MsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWRELENBZUMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWZELENBZ0JDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQWhCRCxDQWlCQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FqQkQsQ0FrQkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBbEJELENBbUJDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQW5CRCxDQW9CQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXBCRCxDQXFCQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXJCRCxDQXNCQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBdEJELENBdUJDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXZCRCxDQXdCQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXhCRCxDQXlCQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBekJELENBMEJDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0ExQkQsQ0EyQkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBM0JELENBNEJDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0E1QkQsQ0E2QkMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBN0JELENBOEJDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBOUJELENBK0JDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQS9CRCxDQWdDQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FoQ0QsQ0FpQ0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FqQ0QsQ0FrQ0MsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBbENELENBbUNDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBbkNELENBb0NDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXBDRCxDQXFDQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBckNELENBc0NDLENBQUMsS0FBRCxDQUFTLElBQVQsQ0FBaUIsSUFBakIsQ0F0Q0QsQ0F1Q0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBdkNELENBd0NDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0F4Q0QsQ0F5Q0MsQ0FBQyxNQUFELENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBekNELENBMENDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBMUNELENBMkNDLENBQUMsQ0FBQyxNQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQTNDRCxDQTRDQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E1Q0QsQ0E2Q0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0E3Q0QsQ0E4Q0MsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBOUNELENBK0NDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBL0NELENBZ0RDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQWhERCxDQWlEQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0FqREQsQ0FrREMsQ0FBQyxDQUFDLElBQUYsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FsREQsQ0FtREMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0FuREQsQ0FvREMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBcERELENBcURDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXJERCxDQXNEQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0F0REQsQ0F1REMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBdkRELENBd0RDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0F4REQsQ0F5REMsQ0FBQyxJQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXpERCxDQTBEQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTFERCxDQTJEQyxDQUFDLENBQUMsTUFBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0EzREQsQ0E0REMsQ0FBQyxLQUFELENBQVMsSUFBVCxDQUFpQixJQUFqQixDQTVERCxDQTZEQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBN0RELENBOERDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0E5REQsQ0ErREMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBL0RELENBZ0VDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FoRUQsQ0FpRUMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBakVELENBa0VDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBbEVELENBbUVDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQW5FRCxDQW9FQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FwRUQsQ0FxRUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FyRUQsQ0FzRUMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBdEVELENBdUVDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBdkVELENBd0VDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXhFRCxDQXlFQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXpFRCxDQTBFQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQTFFRCxDQTJFQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0EzRUQsQ0E0RUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E1RUQsQ0E2RUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBN0VELENBOEVDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E5RUQsQ0ErRUMsQ0FBQyxLQUFELENBQVMsQ0FBQyxJQUFWLENBQWlCLElBQWpCLENBL0VELENBZ0ZDLENBQUMsSUFBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQWhGRCxDQWlGQyxDQUFDLE1BQUQsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBakZELENBa0ZDLENBQUMsQ0FBQyxJQUFGLENBQVMsS0FBVCxDQUFpQixJQUFqQixDQWxGRCxDQW1GQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBbkZELENBb0ZDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXBGRCxDQXFGQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FyRkQsQ0FzRkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBdEZELENBdUZDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBdkZELENBd0ZDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F4RkQsQ0F5RkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F6RkQsQ0EwRkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0ExRkQsQ0EyRkMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTNGRCxDQTRGQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E1RkQsQ0E2RkMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBN0ZELENBOEZDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQTlGRCxDQStGQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0EvRkQsQ0FnR0MsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWhHRCxDQWlHQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWpHRCxDQWtHQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWxHRCxDQW1HQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FuR0QsQ0FvR0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FwR0QsQ0FxR0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBckdELENBc0dDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F0R0QsQ0F1R0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBdkdELENBd0dDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXhHRCxDQXlHQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBekdELENBMEdDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTFHRCxDQTJHQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBM0dELENBNEdDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTVHRCxDQTZHQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E3R0QsQ0E4R0MsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBOUdELENBK0dDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0EvR0QsQ0FnSEMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FoSEQsQ0FpSEMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQWpIRCxDQWtIQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBbEhELENBbUhDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBbkhELENBb0hDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXBIRCxDQXFIQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FySEQsQ0FzSEMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBdEhELENBdUhDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXZIRCxDQXdIQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXhIRCxDQXlIQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0F6SEQsQ0EwSEMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBMUhELENBMkhDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBM0hELENBNEhDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E1SEQsQ0E2SEMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E3SEQsQ0E4SEMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E5SEQsQ0ErSEMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQS9IRCxDQWdJQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FoSUQsQ0FpSUMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBaklELENBa0lDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQWxJRCxDQW1JQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FuSUQsQ0FvSUMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXBJRCxDQXFJQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLElBQVYsQ0FBaUIsSUFBakIsQ0FySUQsQ0FzSUMsQ0FBQyxDQUFDLElBQUYsQ0FBUyxDQUFDLElBQVYsQ0FBaUIsSUFBakIsQ0F0SUQsQ0F1SUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0F2SUQsQ0F3SUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBeElELENBeUlDLENBQUMsQ0FBQyxNQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQXpJRCxDQTBJQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0ExSUQsQ0EySUMsQ0FBQyxNQUFELENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBM0lELENBNElDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0E1SUQsQ0E2SUMsQ0FBQyxJQUFELENBQVMsSUFBVCxDQUFpQixJQUFqQixDQTdJRCxDQThJQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTlJRCxDQStJQyxDQUFDLENBQUMsS0FBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0EvSUQsQ0FnSkMsQ0FBQyxLQUFELENBQVMsSUFBVCxDQUFpQixJQUFqQixDQWhKRCxDQS90QkQsQ0FpM0JDLENBQ0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FERCxDQUVDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBRkQsQ0FHQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FIRCxDQUlDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBSkQsQ0FLQyxDQUFDLENBQUMsS0FBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0FMRCxDQU1DLENBQUMsTUFBRCxDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0FORCxDQU9DLENBQUMsS0FBRCxDQUFTLENBQUMsSUFBVixDQUFpQixJQUFqQixDQVBELENBUUMsQ0FBQyxJQUFELENBQVMsQ0FBQyxJQUFWLENBQWlCLElBQWpCLENBUkQsQ0FTQyxDQUFDLEtBQUQsQ0FBUyxJQUFULENBQWlCLElBQWpCLENBVEQsQ0FVQyxDQUFDLENBQUMsSUFBRixDQUFTLElBQVQsQ0FBaUIsSUFBakIsQ0FWRCxDQVdDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FYRCxDQVlDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQVpELENBYUMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWJELENBY0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBZEQsQ0FlQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FmRCxDQWdCQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FoQkQsQ0FpQkMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWpCRCxDQWtCQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FsQkQsQ0FtQkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FuQkQsQ0FvQkMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXBCRCxDQXFCQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FyQkQsQ0FzQkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F0QkQsQ0F1QkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F2QkQsQ0F3QkMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBeEJELENBeUJDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F6QkQsQ0EwQkMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBMUJELENBMkJDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTNCRCxDQTRCQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E1QkQsQ0E2QkMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTdCRCxDQThCQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0E5QkQsQ0ErQkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0EvQkQsQ0FnQ0MsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWhDRCxDQWlDQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FqQ0QsQ0FrQ0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FsQ0QsQ0FtQ0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FuQ0QsQ0FvQ0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBcENELENBcUNDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXJDRCxDQXNDQyxDQUFDLENBQUMsS0FBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0F0Q0QsQ0F1Q0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F2Q0QsQ0F3Q0MsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXhDRCxDQXlDQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQXpDRCxDQTBDQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTFDRCxDQTJDQyxDQUFDLE1BQUQsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBM0NELENBNENDLENBQUMsQ0FBQyxJQUFGLENBQVMsS0FBVCxDQUFpQixJQUFqQixDQTVDRCxDQTZDQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLElBQVYsQ0FBaUIsSUFBakIsQ0E3Q0QsQ0E4Q0MsQ0FBQyxJQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBOUNELENBK0NDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQS9DRCxDQWdEQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBaERELENBaURDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FqREQsQ0FrREMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQWxERCxDQW1EQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FuREQsQ0FvREMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXBERCxDQXFEQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FyREQsQ0FzREMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F0REQsQ0F1REMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBdkRELENBd0RDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXhERCxDQXlEQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXpERCxDQTBEQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0ExREQsQ0EyREMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0EzREQsQ0E0REMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBNURELENBNkRDLENBQUMsTUFBRCxDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQTdERCxDQThEQyxDQUFDLENBQUMsSUFBRixDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQTlERCxDQStEQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQS9ERCxDQWdFQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FoRUQsQ0FpRUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBakVELENBa0VDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWxFRCxDQW1FQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FuRUQsQ0FvRUMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXBFRCxDQXFFQyxDQUFDLElBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBckVELENBc0VDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBdEVELENBdUVDLENBQUMsQ0FBQyxNQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQXZFRCxDQXdFQyxDQUFDLEtBQUQsQ0FBUyxJQUFULENBQWlCLElBQWpCLENBeEVELENBeUVDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXpFRCxDQTBFQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0ExRUQsQ0EyRUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0EzRUQsQ0E0RUMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTVFRCxDQTZFQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTdFRCxDQThFQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTlFRCxDQStFQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBL0VELENBZ0ZDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWhGRCxDQWlGQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FqRkQsQ0FrRkMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBbEZELENBbUZDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQW5GRCxDQW9GQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBcEZELENBcUZDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXJGRCxDQXNGQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0F0RkQsQ0F1RkMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXZGRCxDQXdGQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXhGRCxDQXlGQyxDQUFDLEtBQUQsQ0FBUyxJQUFULENBQWlCLElBQWpCLENBekZELENBMEZDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0ExRkQsQ0EyRkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0EzRkQsQ0E0RkMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBNUZELENBNkZDLENBQUMsQ0FBQyxNQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQTdGRCxDQThGQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E5RkQsQ0ErRkMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBL0ZELENBZ0dDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBaEdELENBaUdDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FqR0QsQ0FrR0MsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQWxHRCxDQW1HQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FuR0QsQ0FvR0MsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXBHRCxDQXFHQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FyR0QsQ0FzR0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F0R0QsQ0F1R0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBdkdELENBd0dDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXhHRCxDQXlHQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXpHRCxDQTBHQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0ExR0QsQ0EyR0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0EzR0QsQ0E0R0MsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBNUdELENBNkdDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBN0dELENBOEdDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBOUdELENBK0dDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQS9HRCxDQWdIQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQWhIRCxDQWlIQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FqSEQsQ0FrSEMsQ0FBQyxNQUFELENBQVcsSUFBWCxDQUFtQixJQUFuQixDQWxIRCxDQW1IQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FuSEQsQ0FvSEMsQ0FBQyxLQUFELENBQVMsQ0FBQyxJQUFWLENBQWlCLElBQWpCLENBcEhELENBcUhDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FySEQsQ0FzSEMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBdEhELENBdUhDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F2SEQsQ0F3SEMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBeEhELENBeUhDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXpIRCxDQTBIQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQTFIRCxDQTJIQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTNIRCxDQTRIQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E1SEQsQ0E2SEMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBN0hELENBOEhDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTlIRCxDQStIQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0EvSEQsQ0FnSUMsQ0FBQyxJQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQWhJRCxDQWlJQyxDQUFDLEtBQUQsQ0FBUyxJQUFULENBQWlCLElBQWpCLENBaklELENBa0lDLENBQUMsQ0FBQyxJQUFGLENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBbElELENBbUlDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQW5JRCxDQW9JQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBcElELENBcUlDLENBQUMsQ0FBQyxLQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQXJJRCxDQXNJQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBdElELENBdUlDLENBQUMsTUFBRCxDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0F2SUQsQ0F3SUMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBeElELENBeUlDLENBQUMsSUFBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXpJRCxDQTBJQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0ExSUQsQ0EySUMsQ0FBQyxDQUFDLElBQUYsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBM0lELENBNElDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBNUlELENBNklDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBN0lELENBOElDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0E5SUQsQ0ErSUMsQ0FBQyxLQUFELENBQVMsQ0FBQyxJQUFWLENBQWlCLElBQWpCLENBL0lELENBZ0pDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBaEpELENBaUpDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FqSkQsQ0FrSkMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQWxKRCxDQW1KQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FuSkQsQ0FvSkMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXBKRCxDQXFKQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FySkQsQ0FzSkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F0SkQsQ0F1SkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBdkpELENBd0pDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXhKRCxDQXlKQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXpKRCxDQTBKQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0ExSkQsQ0EySkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0EzSkQsQ0E0SkMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBNUpELENBajNCRCxDQStnQ0MsQ0FDQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBREQsQ0FFQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FGRCxDQUdDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQUhELENBSUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBSkQsQ0FLQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBTEQsQ0FNQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FORCxDQU9DLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBUEQsQ0FRQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBUkQsQ0FTQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FURCxDQVVDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBVkQsQ0FXQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQVhELENBWUMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBWkQsQ0FhQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWJELENBY0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FkRCxDQWVDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQWZELENBZ0JDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBaEJELENBaUJDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWpCRCxDQWtCQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBbEJELENBbUJDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQW5CRCxDQW9CQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FwQkQsQ0FxQkMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXJCRCxDQXNCQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F0QkQsQ0F1QkMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXZCRCxDQXdCQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F4QkQsQ0F5QkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBekJELENBMEJDLENBQUMsS0FBRCxDQUFTLENBQUMsSUFBVixDQUFpQixJQUFqQixDQTFCRCxDQTJCQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBM0JELENBNEJDLENBQUMsQ0FBQyxJQUFGLENBQVMsQ0FBQyxJQUFWLENBQWlCLElBQWpCLENBNUJELENBNkJDLENBQUMsS0FBRCxDQUFTLElBQVQsQ0FBaUIsSUFBakIsQ0E3QkQsQ0E4QkMsQ0FBQyxJQUFELENBQVMsSUFBVCxDQUFpQixJQUFqQixDQTlCRCxDQStCQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQS9CRCxDQWdDQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0FoQ0QsQ0FpQ0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBakNELENBa0NDLENBQUMsQ0FBQyxNQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQWxDRCxDQW1DQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FuQ0QsQ0FvQ0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FwQ0QsQ0FxQ0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FyQ0QsQ0FzQ0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBdENELENBdUNDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXZDRCxDQXdDQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F4Q0QsQ0F5Q0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0F6Q0QsQ0EwQ0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBMUNELENBMkNDLENBQUMsS0FBRCxDQUFTLElBQVQsQ0FBaUIsSUFBakIsQ0EzQ0QsQ0E0Q0MsQ0FBQyxDQUFDLElBQUYsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0E1Q0QsQ0E2Q0MsQ0FBQyxNQUFELENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBN0NELENBOENDLENBQUMsSUFBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0E5Q0QsQ0ErQ0MsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQS9DRCxDQWdEQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FoREQsQ0FpREMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBakRELENBa0RDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FsREQsQ0FtREMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQW5ERCxDQW9EQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FwREQsQ0FxREMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBckRELENBc0RDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXRERCxDQXVEQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F2REQsQ0F3REMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F4REQsQ0F5REMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F6REQsQ0EwREMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTFERCxDQTJEQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0EzREQsQ0E0REMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E1REQsQ0E2REMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBN0RELENBOERDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBOURELENBK0RDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBL0RELENBZ0VDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWhFRCxDQWlFQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FqRUQsQ0FrRUMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBbEVELENBbUVDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQW5FRCxDQW9FQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBcEVELENBcUVDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FyRUQsQ0FzRUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F0RUQsQ0F1RUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBdkVELENBd0VDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0F4RUQsQ0F5RUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0F6RUQsQ0EwRUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBMUVELENBMkVDLENBQUMsTUFBRCxDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQTNFRCxDQTRFQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0E1RUQsQ0E2RUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E3RUQsQ0E4RUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBOUVELENBK0VDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0EvRUQsQ0FnRkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FoRkQsQ0FpRkMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBakZELENBa0ZDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FsRkQsQ0FtRkMsQ0FBQyxLQUFELENBQVMsSUFBVCxDQUFpQixJQUFqQixDQW5GRCxDQW9GQyxDQUFDLENBQUMsTUFBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0FwRkQsQ0FxRkMsQ0FBQyxDQUFDLElBQUYsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FyRkQsQ0FzRkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBdEZELENBdUZDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXZGRCxDQXdGQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0F4RkQsQ0F5RkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F6RkQsQ0EwRkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBMUZELENBMkZDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0EzRkQsQ0E0RkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0E1RkQsQ0E2RkMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBN0ZELENBOEZDLENBQUMsS0FBRCxDQUFTLElBQVQsQ0FBaUIsSUFBakIsQ0E5RkQsQ0ErRkMsQ0FBQyxJQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQS9GRCxDQWdHQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FoR0QsQ0FpR0MsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWpHRCxDQWtHQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FsR0QsQ0FtR0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBbkdELENBb0dDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXBHRCxDQXFHQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBckdELENBc0dDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXRHRCxDQXVHQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXZHRCxDQXdHQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBeEdELENBeUdDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXpHRCxDQTBHQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTFHRCxDQTJHQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTNHRCxDQTRHQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0E1R0QsQ0E2R0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBN0dELENBOEdDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTlHRCxDQStHQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBL0dELENBZ0hDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBaEhELENBaUhDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FqSEQsQ0FrSEMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQWxIRCxDQW1IQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQW5IRCxDQW9IQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FwSEQsQ0FxSEMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBckhELENBc0hDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXRIRCxDQXVIQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F2SEQsQ0F3SEMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F4SEQsQ0F5SEMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXpIRCxDQTBIQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBMUhELENBMkhDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTNIRCxDQTRIQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBNUhELENBNkhDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTdIRCxDQThIQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTlIRCxDQStIQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0EvSEQsQ0FnSUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBaElELENBaUlDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBaklELENBa0lDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWxJRCxDQW1JQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQW5JRCxDQW9JQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FwSUQsQ0FxSUMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXJJRCxDQXNJQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0F0SUQsQ0F1SUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBdklELENBd0lDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXhJRCxDQXlJQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBeklELENBMElDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQTFJRCxDQTJJQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTNJRCxDQTRJQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBNUlELENBNklDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTdJRCxDQThJQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTlJRCxDQStJQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQS9JRCxDQWdKQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FoSkQsQ0FpSkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBakpELENBa0pDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWxKRCxDQW1KQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBbkpELENBb0pDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBcEpELENBcUpDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FySkQsQ0FzSkMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXRKRCxDQXVKQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXZKRCxDQXdKQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F4SkQsQ0F5SkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBekpELENBMEpDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTFKRCxDQTJKQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0EzSkQsQ0E0SkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E1SkQsQ0E2SkMsQ0FBQyxJQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQTdKRCxDQThKQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBOUpELENBK0pDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQS9KRCxDQWdLQyxDQUFDLEtBQUQsQ0FBUyxJQUFULENBQWlCLElBQWpCLENBaEtELENBaUtDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQWpLRCxDQWtLQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQWxLRCxDQW1LQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FuS0QsQ0FvS0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBcEtELENBcUtDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBcktELENBc0tDLENBQUMsTUFBRCxDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQXRLRCxDQXVLQyxDQUFDLENBQUMsSUFBRixDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXZLRCxDQXdLQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F4S0QsQ0F5S0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F6S0QsQ0EwS0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0ExS0QsQ0EyS0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBM0tELENBNEtDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBNUtELENBNktDLENBQUMsQ0FBQyxLQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQTdLRCxDQThLQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBOUtELENBK0tDLENBQUMsS0FBRCxDQUFTLENBQUMsSUFBVixDQUFpQixJQUFqQixDQS9LRCxDQWdMQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FoTEQsQ0FpTEMsQ0FBQyxNQUFELENBQVcsSUFBWCxDQUFtQixJQUFuQixDQWpMRCxDQWtMQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FsTEQsQ0FtTEMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQW5MRCxDQW9MQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FwTEQsQ0EvZ0NELENBcXNDQyxDQUNDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQURELENBRUMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQUZELENBR0MsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQUhELENBSUMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBSkQsQ0FLQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FMRCxDQU1DLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQU5ELENBT0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBUEQsQ0FRQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQVJELENBU0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FURCxDQVVDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FWRCxDQVdDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQVhELENBWUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FaRCxDQWFDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FiRCxDQWNDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FkRCxDQWVDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWZELENBZ0JDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FoQkQsQ0FpQkMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBakJELENBa0JDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBbEJELENBbUJDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQW5CRCxDQW9CQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FwQkQsQ0FxQkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FyQkQsQ0FzQkMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBdEJELENBdUJDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBdkJELENBd0JDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXhCRCxDQXlCQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQXpCRCxDQTBCQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTFCRCxDQTJCQyxDQUFDLElBQUQsQ0FBUyxDQUFDLElBQVYsQ0FBaUIsSUFBakIsQ0EzQkQsQ0E0QkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0E1QkQsQ0E2QkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBN0JELENBOEJDLENBQUMsS0FBRCxDQUFTLElBQVQsQ0FBaUIsSUFBakIsQ0E5QkQsQ0ErQkMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBL0JELENBZ0NDLENBQUMsS0FBRCxDQUFTLENBQUMsSUFBVixDQUFpQixJQUFqQixDQWhDRCxDQWlDQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBakNELENBa0NDLENBQUMsQ0FBQyxLQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQWxDRCxDQW1DQyxDQUFDLE1BQUQsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBbkNELENBb0NDLENBQUMsQ0FBQyxJQUFGLENBQVMsSUFBVCxDQUFpQixJQUFqQixDQXBDRCxDQXFDQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FyQ0QsQ0FzQ0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBdENELENBdUNDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBdkNELENBd0NDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F4Q0QsQ0F5Q0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F6Q0QsQ0EwQ0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0ExQ0QsQ0EyQ0MsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTNDRCxDQTRDQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E1Q0QsQ0E2Q0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBN0NELENBOENDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQTlDRCxDQStDQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0EvQ0QsQ0FnREMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWhERCxDQWlEQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWpERCxDQWtEQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FsREQsQ0FtREMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBbkRELENBb0RDLENBQUMsTUFBRCxDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQXBERCxDQXFEQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXJERCxDQXNEQyxDQUFDLENBQUMsTUFBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0F0REQsQ0F1REMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXZERCxDQXdEQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQXhERCxDQXlEQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0F6REQsQ0EwREMsQ0FBQyxLQUFELENBQVMsSUFBVCxDQUFpQixJQUFqQixDQTFERCxDQTJEQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBM0RELENBNERDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTVERCxDQTZEQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0E3REQsQ0E4REMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBOURELENBK0RDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBL0RELENBZ0VDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FoRUQsQ0FpRUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FqRUQsQ0FrRUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FsRUQsQ0FtRUMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQW5FRCxDQW9FQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FwRUQsQ0FxRUMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBckVELENBc0VDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXRFRCxDQXVFQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F2RUQsQ0F3RUMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXhFRCxDQXlFQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F6RUQsQ0EwRUMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBMUVELENBMkVDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0EzRUQsQ0E0RUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E1RUQsQ0E2RUMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQTdFRCxDQThFQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBOUVELENBK0VDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBL0VELENBZ0ZDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWhGRCxDQWlGQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FqRkQsQ0FrRkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBbEZELENBbUZDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQW5GRCxDQW9GQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXBGRCxDQXFGQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0FyRkQsQ0FzRkMsQ0FBQyxDQUFDLElBQUYsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0F0RkQsQ0F1RkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0F2RkQsQ0F3RkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBeEZELENBeUZDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXpGRCxDQTBGQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0ExRkQsQ0EyRkMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBM0ZELENBNEZDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0E1RkQsQ0E2RkMsQ0FBQyxJQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQTdGRCxDQThGQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTlGRCxDQStGQyxDQUFDLENBQUMsTUFBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0EvRkQsQ0FnR0MsQ0FBQyxLQUFELENBQVMsSUFBVCxDQUFpQixJQUFqQixDQWhHRCxDQWlHQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBakdELENBa0dDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FsR0QsQ0FtR0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBbkdELENBb0dDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FwR0QsQ0FxR0MsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBckdELENBc0dDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBdEdELENBdUdDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXZHRCxDQXdHQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F4R0QsQ0F5R0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F6R0QsQ0EwR0MsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBMUdELENBMkdDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBM0dELENBNEdDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTVHRCxDQTZHQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBN0dELENBOEdDLENBQUMsS0FBRCxDQUFTLElBQVQsQ0FBaUIsSUFBakIsQ0E5R0QsQ0ErR0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBL0dELENBZ0hDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FoSEQsQ0FpSEMsQ0FBQyxNQUFELENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBakhELENBa0hDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBbEhELENBbUhDLENBQUMsQ0FBQyxNQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQW5IRCxDQW9IQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FwSEQsQ0FxSEMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0FySEQsQ0FzSEMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBdEhELENBdUhDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBdkhELENBd0hDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXhIRCxDQXlIQyxDQUFDLE1BQUQsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBekhELENBMEhDLENBQUMsSUFBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQTFIRCxDQTJIQyxDQUFDLENBQUMsS0FBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0EzSEQsQ0E0SEMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBNUhELENBNkhDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E3SEQsQ0E4SEMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBOUhELENBK0hDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBL0hELENBZ0lDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FoSUQsQ0FpSUMsQ0FBQyxDQUFDLElBQUYsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBaklELENBa0lDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBbElELENBbUlDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBbklELENBb0lDLENBQUMsS0FBRCxDQUFTLENBQUMsSUFBVixDQUFpQixJQUFqQixDQXBJRCxDQXFJQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXJJRCxDQXNJQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXRJRCxDQXVJQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0F2SUQsQ0F3SUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F4SUQsQ0F5SUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBeklELENBMElDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0ExSUQsQ0EySUMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBM0lELENBNElDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQTVJRCxDQTZJQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBN0lELENBOElDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTlJRCxDQStJQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBL0lELENBZ0pDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWhKRCxDQWlKQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FqSkQsQ0FrSkMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWxKRCxDQW1KQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBbkpELENBb0pDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXBKRCxDQXFKQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FySkQsQ0FzSkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBdEpELENBdUpDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXZKRCxDQXdKQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXhKRCxDQXlKQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXpKRCxDQTBKQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBMUpELENBMkpDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQTNKRCxDQTRKQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTVKRCxDQTZKQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQTdKRCxDQThKQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTlKRCxDQStKQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLElBQVYsQ0FBaUIsSUFBakIsQ0EvSkQsQ0FnS0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FoS0QsQ0FpS0MsQ0FBQyxDQUFDLElBQUYsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBaktELENBa0tDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FsS0QsQ0FtS0MsQ0FBQyxJQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBbktELENBb0tDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXBLRCxDQXFLQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBcktELENBc0tDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXRLRCxDQXVLQyxDQUFDLE1BQUQsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBdktELENBd0tDLENBQUMsQ0FBQyxLQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQXhLRCxDQXlLQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBektELENBMEtDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0ExS0QsQ0EyS0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBM0tELENBNEtDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0E1S0QsQ0E2S0MsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBN0tELENBOEtDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBOUtELENBK0tDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQS9LRCxDQWdMQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FoTEQsQ0FpTEMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FqTEQsQ0FrTEMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBbExELENBbUxDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBbkxELENBb0xDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXBMRCxDQXFMQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXJMRCxDQXNMQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F0TEQsQ0F1TEMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBdkxELENBd0xDLENBQUMsTUFBRCxDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQXhMRCxDQXlMQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXpMRCxDQTBMQyxDQUFDLENBQUMsTUFBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0ExTEQsQ0EyTEMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQTNMRCxDQTRMQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQTVMRCxDQTZMQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E3TEQsQ0E4TEMsQ0FBQyxLQUFELENBQVMsSUFBVCxDQUFpQixJQUFqQixDQTlMRCxDQStMQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBL0xELENBZ01DLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWhNRCxDQWlNQyxDQUFDLENBQUMsS0FBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0FqTUQsQ0FrTUMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWxNRCxDQW1NQyxDQUFDLE1BQUQsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBbk1ELENBb01DLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXBNRCxDQXFNQyxDQUFDLElBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FyTUQsQ0FzTUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBdE1ELENBdU1DLENBQUMsQ0FBQyxJQUFGLENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXZNRCxDQXdNQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXhNRCxDQXlNQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXpNRCxDQTBNQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBMU1ELENBMk1DLENBQUMsS0FBRCxDQUFTLENBQUMsSUFBVixDQUFpQixJQUFqQixDQTNNRCxDQTRNQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQTVNRCxDQXJzQ0QsQ0FtNUNDLENBQ0MsQ0FBQyxNQUFELENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBREQsQ0FFQyxDQUFDLENBQUMsSUFBRixDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQUZELENBR0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0FIRCxDQUlDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQUpELENBS0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBTEQsQ0FNQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FORCxDQU9DLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQVBELENBUUMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQVJELENBU0MsQ0FBQyxJQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQVRELENBVUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FWRCxDQVdDLENBQUMsQ0FBQyxNQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQVhELENBWUMsQ0FBQyxLQUFELENBQVMsSUFBVCxDQUFpQixJQUFqQixDQVpELENBYUMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBYkQsQ0FjQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWRELENBZUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FmRCxDQWdCQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FoQkQsQ0FpQkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBakJELENBa0JDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWxCRCxDQW1CQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FuQkQsQ0FvQkMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXBCRCxDQXFCQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBckJELENBc0JDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBdEJELENBdUJDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXZCRCxDQXdCQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBeEJELENBeUJDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXpCRCxDQTBCQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0ExQkQsQ0EyQkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0EzQkQsQ0E0QkMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTVCRCxDQTZCQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTdCRCxDQThCQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTlCRCxDQStCQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBL0JELENBZ0NDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWhDRCxDQWlDQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FqQ0QsQ0FrQ0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBbENELENBbUNDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQW5DRCxDQW9DQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBcENELENBcUNDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXJDRCxDQXNDQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F0Q0QsQ0F1Q0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F2Q0QsQ0F3Q0MsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXhDRCxDQXlDQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXpDRCxDQTBDQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTFDRCxDQTJDQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBM0NELENBNENDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTVDRCxDQTZDQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0E3Q0QsQ0E4Q0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBOUNELENBK0NDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQS9DRCxDQWdEQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBaERELENBaURDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWpERCxDQWtEQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FsREQsQ0FtREMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQW5ERCxDQW9EQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXBERCxDQXFEQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBckRELENBc0RDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0F0REQsQ0F1REMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F2REQsQ0F3REMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBeERELENBeURDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXpERCxDQTBEQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0ExREQsQ0EyREMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBM0RELENBNERDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBNURELENBNkRDLENBQUMsQ0FBQyxJQUFGLENBQVMsQ0FBQyxJQUFWLENBQWlCLElBQWpCLENBN0RELENBOERDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTlERCxDQStEQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0EvREQsQ0FnRUMsQ0FBQyxLQUFELENBQVMsQ0FBQyxJQUFWLENBQWlCLElBQWpCLENBaEVELENBaUVDLENBQUMsQ0FBQyxJQUFGLENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBakVELENBa0VDLENBQUMsQ0FBQyxLQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQWxFRCxDQW1FQyxDQUFDLElBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBbkVELENBb0VDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBcEVELENBcUVDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXJFRCxDQXNFQyxDQUFDLEtBQUQsQ0FBUyxJQUFULENBQWlCLElBQWpCLENBdEVELENBdUVDLENBQUMsSUFBRCxDQUFTLElBQVQsQ0FBaUIsSUFBakIsQ0F2RUQsQ0F3RUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBeEVELENBeUVDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXpFRCxDQTBFQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBMUVELENBMkVDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0EzRUQsQ0E0RUMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBNUVELENBNkVDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQTdFRCxDQThFQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E5RUQsQ0ErRUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBL0VELENBZ0ZDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBaEZELENBaUZDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBakZELENBa0ZDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FsRkQsQ0FtRkMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBbkZELENBb0ZDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBcEZELENBcUZDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBckZELENBc0ZDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBdEZELENBdUZDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXZGRCxDQXdGQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXhGRCxDQXlGQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F6RkQsQ0EwRkMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTFGRCxDQTJGQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0EzRkQsQ0E0RkMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBNUZELENBNkZDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E3RkQsQ0E4RkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBOUZELENBK0ZDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0EvRkQsQ0FnR0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBaEdELENBaUdDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWpHRCxDQWtHQyxDQUFDLE1BQUQsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBbEdELENBbUdDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FuR0QsQ0FvR0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBcEdELENBcUdDLENBQUMsS0FBRCxDQUFTLENBQUMsSUFBVixDQUFpQixJQUFqQixDQXJHRCxDQXNHQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F0R0QsQ0F1R0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBdkdELENBd0dDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBeEdELENBeUdDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBekdELENBMEdDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0ExR0QsQ0EyR0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBM0dELENBNEdDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBNUdELENBNkdDLENBQUMsS0FBRCxDQUFTLENBQUMsSUFBVixDQUFpQixJQUFqQixDQTdHRCxDQThHQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E5R0QsQ0ErR0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0EvR0QsQ0FnSEMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWhIRCxDQWlIQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWpIRCxDQWtIQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWxIRCxDQW1IQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBbkhELENBb0hDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXBIRCxDQXFIQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FySEQsQ0FzSEMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBdEhELENBdUhDLENBQUMsQ0FBQyxLQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQXZIRCxDQXdIQyxDQUFDLE1BQUQsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBeEhELENBeUhDLENBQUMsS0FBRCxDQUFTLENBQUMsSUFBVixDQUFpQixJQUFqQixDQXpIRCxDQTBIQyxDQUFDLENBQUMsSUFBRixDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0ExSEQsQ0EySEMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0EzSEQsQ0E0SEMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTVIRCxDQTZIQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTdIRCxDQThIQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTlIRCxDQStIQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBL0hELENBZ0lDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWhJRCxDQWlJQyxDQUFDLElBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FqSUQsQ0FrSUMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBbElELENBbUlDLENBQUMsQ0FBQyxLQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQW5JRCxDQW9JQyxDQUFDLE1BQUQsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBcElELENBcUlDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXJJRCxDQXNJQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0F0SUQsQ0F1SUMsQ0FBQyxJQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXZJRCxDQXdJQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQXhJRCxDQXlJQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBeklELENBMElDLENBQUMsS0FBRCxDQUFTLElBQVQsQ0FBaUIsSUFBakIsQ0ExSUQsQ0EySUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0EzSUQsQ0E0SUMsQ0FBQyxNQUFELENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBNUlELENBNklDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTdJRCxDQThJQyxDQUFDLENBQUMsTUFBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0E5SUQsQ0ErSUMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBL0lELENBZ0pDLENBQUMsQ0FBQyxJQUFGLENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBaEpELENBaUpDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWpKRCxDQWtKQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FsSkQsQ0FtSkMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQW5KRCxDQW9KQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXBKRCxDQXFKQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBckpELENBc0pDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0F0SkQsQ0F1SkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F2SkQsQ0F3SkMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBeEpELENBeUpDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXpKRCxDQTBKQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0ExSkQsQ0EySkMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBM0pELENBNEpDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBNUpELENBNkpDLENBQUMsSUFBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQTdKRCxDQThKQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E5SkQsQ0ErSkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0EvSkQsQ0FnS0MsQ0FBQyxNQUFELENBQVcsSUFBWCxDQUFtQixJQUFuQixDQWhLRCxDQWlLQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWpLRCxDQWtLQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQWxLRCxDQW1LQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBbktELENBb0tDLENBQUMsQ0FBQyxLQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQXBLRCxDQXFLQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FyS0QsQ0FzS0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxJQUFWLENBQWlCLElBQWpCLENBdEtELENBdUtDLENBQUMsQ0FBQyxJQUFGLENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXZLRCxDQXdLQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBeEtELENBeUtDLENBQUMsTUFBRCxDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQXpLRCxDQTBLQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTFLRCxDQTJLQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQTNLRCxDQTRLQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E1S0QsQ0E2S0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBN0tELENBOEtDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTlLRCxDQStLQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0EvS0QsQ0FnTEMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQWhMRCxDQWlMQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBakxELENBa0xDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBbExELENBbUxDLENBQUMsQ0FBQyxNQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQW5MRCxDQW9MQyxDQUFDLEtBQUQsQ0FBUyxJQUFULENBQWlCLElBQWpCLENBcExELENBcUxDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FyTEQsQ0FzTEMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXRMRCxDQXVMQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F2TEQsQ0F3TEMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXhMRCxDQXlMQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F6TEQsQ0EwTEMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0ExTEQsQ0EyTEMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBM0xELENBNExDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTVMRCxDQTZMQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTdMRCxDQThMQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E5TEQsQ0ErTEMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0EvTEQsQ0FnTUMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBaE1ELENBaU1DLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FqTUQsQ0FrTUMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQWxNRCxDQW1NQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FuTUQsQ0FvTUMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXBNRCxDQXFNQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FyTUQsQ0FzTUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F0TUQsQ0F1TUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBdk1ELENBd01DLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXhNRCxDQXlNQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXpNRCxDQTBNQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0ExTUQsQ0EyTUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0EzTUQsQ0E0TUMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBNU1ELENBNk1DLENBQUMsTUFBRCxDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0E3TUQsQ0E4TUMsQ0FBQyxJQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBOU1ELENBK01DLENBQUMsQ0FBQyxLQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQS9NRCxDQWdOQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FoTkQsQ0FpTkMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWpORCxDQWtOQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FsTkQsQ0FtTkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FuTkQsQ0FvTkMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXBORCxDQXFOQyxDQUFDLENBQUMsSUFBRixDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FyTkQsQ0FzTkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F0TkQsQ0F1TkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0F2TkQsQ0F3TkMsQ0FBQyxLQUFELENBQVMsQ0FBQyxJQUFWLENBQWlCLElBQWpCLENBeE5ELENBbjVDRCxDQTZtREMsQ0FDQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FERCxDQUVDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQUZELENBR0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FIRCxDQUlDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FKRCxDQUtDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBTEQsQ0FNQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQU5ELENBT0MsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQVBELENBUUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBUkQsQ0FTQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FURCxDQVVDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQVZELENBV0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBWEQsQ0FZQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBWkQsQ0FhQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FiRCxDQWNDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWRELENBZUMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQWZELENBZ0JDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBaEJELENBaUJDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FqQkQsQ0FrQkMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQWxCRCxDQW1CQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQW5CRCxDQW9CQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FwQkQsQ0FxQkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBckJELENBc0JDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXRCRCxDQXVCQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F2QkQsQ0F3QkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F4QkQsQ0F5QkMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXpCRCxDQTBCQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0ExQkQsQ0EyQkMsQ0FBQyxDQUFDLElBQUYsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBM0JELENBNEJDLENBQUMsQ0FBQyxLQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQTVCRCxDQTZCQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBN0JELENBOEJDLENBQUMsS0FBRCxDQUFTLENBQUMsSUFBVixDQUFpQixJQUFqQixDQTlCRCxDQStCQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQS9CRCxDQWdDQyxDQUFDLE1BQUQsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBaENELENBaUNDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWpDRCxDQWtDQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQWxDRCxDQW1DQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQW5DRCxDQW9DQyxDQUFDLElBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FwQ0QsQ0FxQ0MsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXJDRCxDQXNDQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLElBQVYsQ0FBaUIsSUFBakIsQ0F0Q0QsQ0F1Q0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBdkNELENBd0NDLENBQUMsQ0FBQyxJQUFGLENBQVMsSUFBVCxDQUFpQixJQUFqQixDQXhDRCxDQXlDQyxDQUFDLEtBQUQsQ0FBUyxJQUFULENBQWlCLElBQWpCLENBekNELENBMENDLENBQUMsSUFBRCxDQUFTLENBQUMsSUFBVixDQUFpQixJQUFqQixDQTFDRCxDQTJDQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQTNDRCxDQTRDQyxDQUFDLE1BQUQsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBNUNELENBNkNDLENBQUMsQ0FBQyxLQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQTdDRCxDQThDQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQTlDRCxDQStDQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQS9DRCxDQWdEQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FoREQsQ0FpREMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBakRELENBa0RDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWxERCxDQW1EQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQW5ERCxDQW9EQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBcERELENBcURDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBckRELENBc0RDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBdERELENBdURDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F2REQsQ0F3REMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBeERELENBeURDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXpERCxDQTBEQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0ExREQsQ0EyREMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBM0RELENBNERDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E1REQsQ0E2REMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQTdERCxDQThEQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBOURELENBK0RDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQS9ERCxDQWdFQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBaEVELENBaUVDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWpFRCxDQWtFQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWxFRCxDQW1FQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FuRUQsQ0FvRUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBcEVELENBcUVDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBckVELENBc0VDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXRFRCxDQXVFQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXZFRCxDQXdFQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F4RUQsQ0F5RUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBekVELENBMEVDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0ExRUQsQ0EyRUMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTNFRCxDQTRFQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0E1RUQsQ0E2RUMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBN0VELENBOEVDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTlFRCxDQStFQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0EvRUQsQ0FnRkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FoRkQsQ0FpRkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FqRkQsQ0FrRkMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQWxGRCxDQW1GQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FuRkQsQ0FvRkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FwRkQsQ0FxRkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FyRkQsQ0FzRkMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F0RkQsQ0F1RkMsQ0FBQyxJQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBdkZELENBd0ZDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBeEZELENBeUZDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXpGRCxDQTBGQyxDQUFDLE1BQUQsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBMUZELENBMkZDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQTNGRCxDQTRGQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLElBQVYsQ0FBaUIsSUFBakIsQ0E1RkQsQ0E2RkMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQTdGRCxDQThGQyxDQUFDLENBQUMsS0FBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0E5RkQsQ0ErRkMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQS9GRCxDQWdHQyxDQUFDLENBQUMsSUFBRixDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FoR0QsQ0FpR0MsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQWpHRCxDQWtHQyxDQUFDLEtBQUQsQ0FBUyxJQUFULENBQWlCLElBQWpCLENBbEdELENBbUdDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQW5HRCxDQW9HQyxDQUFDLElBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBcEdELENBcUdDLENBQUMsTUFBRCxDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQXJHRCxDQXNHQyxDQUFDLENBQUMsSUFBRixDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXRHRCxDQXVHQyxDQUFDLENBQUMsTUFBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0F2R0QsQ0F3R0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBeEdELENBeUdDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBekdELENBMEdDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTFHRCxDQTJHQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTNHRCxDQTRHQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0E1R0QsQ0E2R0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E3R0QsQ0E4R0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBOUdELENBK0dDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQS9HRCxDQWdIQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FoSEQsQ0FpSEMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FqSEQsQ0FrSEMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBbEhELENBbUhDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FuSEQsQ0FvSEMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FwSEQsQ0FxSEMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBckhELENBc0hDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0F0SEQsQ0F1SEMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQXZIRCxDQXdIQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F4SEQsQ0F5SEMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBekhELENBMEhDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBMUhELENBMkhDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBM0hELENBNEhDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTVIRCxDQTZIQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0E3SEQsQ0E4SEMsQ0FBQyxNQUFELENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBOUhELENBK0hDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQS9IRCxDQWdJQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBaElELENBaUlDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FqSUQsQ0FrSUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FsSUQsQ0FtSUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBbklELENBb0lDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FwSUQsQ0FxSUMsQ0FBQyxDQUFDLElBQUYsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FySUQsQ0FzSUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBdElELENBdUlDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXZJRCxDQXdJQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0F4SUQsQ0F5SUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F6SUQsQ0EwSUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBMUlELENBMklDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0EzSUQsQ0E0SUMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLElBQVosQ0FBbUIsSUFBbkIsQ0E1SUQsQ0E2SUMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBN0lELENBOElDLENBQUMsS0FBRCxDQUFTLElBQVQsQ0FBaUIsSUFBakIsQ0E5SUQsQ0ErSUMsQ0FBQyxJQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQS9JRCxDQWdKQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FoSkQsQ0FpSkMsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQWpKRCxDQWtKQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBbEpELENBbUpDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQW5KRCxDQW9KQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBcEpELENBcUpDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXJKRCxDQXNKQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXRKRCxDQXVKQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F2SkQsQ0F3SkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBeEpELENBeUpDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBekpELENBMEpDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTFKRCxDQTJKQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTNKRCxDQTRKQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E1SkQsQ0E2SkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBN0pELENBOEpDLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTlKRCxDQStKQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBL0pELENBZ0tDLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBaEtELENBaUtDLENBQUMsS0FBRCxDQUFTLEtBQVQsQ0FBaUIsSUFBakIsQ0FqS0QsQ0FrS0MsQ0FBQyxLQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQWxLRCxDQW1LQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQW5LRCxDQW9LQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FwS0QsQ0FxS0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBcktELENBc0tDLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXRLRCxDQXVLQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F2S0QsQ0F3S0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F4S0QsQ0F5S0MsQ0FBQyxJQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBektELENBMEtDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTFLRCxDQTJLQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTNLRCxDQTRLQyxDQUFDLE1BQUQsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBNUtELENBNktDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBN0tELENBOEtDLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxJQUFaLENBQW1CLElBQW5CLENBOUtELENBK0tDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0EvS0QsQ0FnTEMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBaExELENBaUxDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQWpMRCxDQWtMQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLElBQVYsQ0FBaUIsSUFBakIsQ0FsTEQsQ0FtTEMsQ0FBQyxDQUFDLElBQUYsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBbkxELENBb0xDLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FwTEQsQ0FxTEMsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXJMRCxDQXNMQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0F0TEQsQ0F1TEMsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBdkxELENBd0xDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXhMRCxDQXlMQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBekxELENBMExDLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQTFMRCxDQTJMQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTNMRCxDQTRMQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBNUxELENBNkxDLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTdMRCxDQThMQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTlMRCxDQStMQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQS9MRCxDQWdNQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FoTUQsQ0FpTUMsQ0FBQyxLQUFELENBQVMsSUFBVCxDQUFpQixJQUFqQixDQWpNRCxDQWtNQyxDQUFDLElBQUQsQ0FBUyxJQUFULENBQWlCLElBQWpCLENBbE1ELENBbU1DLENBQUMsQ0FBQyxLQUFGLENBQVcsSUFBWCxDQUFtQixJQUFuQixDQW5NRCxDQW9NQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBcE1ELENBcU1DLENBQUMsTUFBRCxDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQXJNRCxDQXNNQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQXRNRCxDQXVNQyxDQUFDLENBQUMsTUFBRixDQUFXLElBQVgsQ0FBbUIsSUFBbkIsQ0F2TUQsQ0F3TUMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBeE1ELENBeU1DLENBQUMsQ0FBQyxJQUFGLENBQVMsQ0FBQyxJQUFWLENBQWlCLElBQWpCLENBek1ELENBME1DLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTFNRCxDQTJNQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQTNNRCxDQTRNQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLElBQVYsQ0FBaUIsSUFBakIsQ0E1TUQsQ0E2TUMsQ0FBQyxJQUFELENBQVMsS0FBVCxDQUFpQixJQUFqQixDQTdNRCxDQThNQyxDQUFDLEtBQUQsQ0FBUyxLQUFULENBQWlCLElBQWpCLENBOU1ELENBK01DLENBQUMsQ0FBQyxNQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQS9NRCxDQWdOQyxDQUFDLEtBQUQsQ0FBUyxJQUFULENBQWlCLElBQWpCLENBaE5ELENBaU5DLENBQUMsTUFBRCxDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQWpORCxDQWtOQyxDQUFDLENBQUMsS0FBRixDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQWxORCxDQW1OQyxDQUFDLENBQUMsTUFBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FuTkQsQ0FvTkMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxJQUFYLENBQW1CLElBQW5CLENBcE5ELENBcU5DLENBQUMsQ0FBQyxLQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBck5ELENBc05DLENBQUMsTUFBRCxDQUFXLENBQUMsSUFBWixDQUFtQixJQUFuQixDQXRORCxDQXVOQyxDQUFDLENBQUMsSUFBRixDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQXZORCxDQXdOQyxDQUFDLE1BQUQsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0F4TkQsQ0F5TkMsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBek5ELENBME5DLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTFORCxDQTJOQyxDQUFDLENBQUMsTUFBRixDQUFXLENBQUMsS0FBWixDQUFxQixJQUFyQixDQTNORCxDQTROQyxDQUFDLE1BQUQsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBNU5ELENBNk5DLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBN05ELENBOE5DLENBQUMsQ0FBQyxNQUFGLENBQVcsQ0FBQyxLQUFaLENBQXFCLElBQXJCLENBOU5ELENBK05DLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0EvTkQsQ0FnT0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBaE9ELENBaU9DLENBQUMsS0FBRCxDQUFTLENBQUMsS0FBVixDQUFtQixJQUFuQixDQWpPRCxDQWtPQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0FsT0QsQ0FtT0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBbk9ELENBb09DLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0FwT0QsQ0FxT0MsQ0FBQyxDQUFDLEtBQUYsQ0FBVyxLQUFYLENBQW1CLElBQW5CLENBck9ELENBc09DLENBQUMsTUFBRCxDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0F0T0QsQ0F1T0MsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQXZPRCxDQXdPQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0F4T0QsQ0F5T0MsQ0FBQyxLQUFELENBQVMsQ0FBQyxLQUFWLENBQW1CLElBQW5CLENBek9ELENBME9DLENBQUMsQ0FBQyxLQUFGLENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTFPRCxDQTJPQyxDQUFDLENBQUMsS0FBRixDQUFXLEtBQVgsQ0FBbUIsSUFBbkIsQ0EzT0QsQ0E0T0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E1T0QsQ0E2T0MsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0E3T0QsQ0E4T0MsQ0FBQyxNQUFELENBQVcsS0FBWCxDQUFtQixJQUFuQixDQTlPRCxDQStPQyxDQUFDLEtBQUQsQ0FBUyxDQUFDLEtBQVYsQ0FBbUIsSUFBbkIsQ0EvT0QsQ0FnUEMsQ0FBQyxDQUFDLE1BQUYsQ0FBVyxDQUFDLEtBQVosQ0FBcUIsSUFBckIsQ0FoUEQsQ0E3bURELENBQWpCLEM7QUFrMkRBLEdBQUksTUFBTyxXQUFXLE9BQU8sQ0FBbEIsQ0FBWCxDQUNBLE1BQU8sS0FBUCxDQUNILEM7QUFHRCxPQUFPLE9BQVAsQ0FBZSxrQkFBZixDQUFvQyxrQkFBcEMsQ0FDQSxPQUFPLE9BQVAsQ0FBZSxVQUFmLENBQTRCLFVBQTVCLENBQ0EsT0FBTyxPQUFQLENBQWUsT0FBZixDQUF5QixPQUF6QixDQUNBLE9BQU8sT0FBUCxDQUFlLE9BQWYsQ0FBeUIsT0FBekIsQ0FDQSxPQUFPLE9BQVAsQ0FBZSxtQkFBZixDQUFxQyxtQkFBckMsQ0FDQSxPQUFPLE9BQVAsQ0FBZSxXQUFmLENBQTZCLFdBQTdCOzs7QUM1bEVBOztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7OztBQzdiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7Ozs7O0FDaEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN4MElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdmhCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdjRCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUMzQ3FCLGVBQWU7Ozs7Ozs7OztBQVFyQixhQVJNLGVBQWUsQ0FRcEIsVUFBVSxFQUFFLGVBQWUsRUFBRTs4QkFSeEIsZUFBZTs7O0FBVTVCLFlBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0FBQ25CLFlBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLFlBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLFlBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLFlBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ2pCLFlBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBQ2xCLFlBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDOzs7QUFHbkIsWUFBSSxDQUFDLEVBQUUsR0FBRyxTQUFTLENBQUM7OztBQUdwQixZQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztBQUM3QixZQUFJLENBQUMsWUFBWSxHQUFHLGVBQWUsSUFBSSxDQUFDLENBQUM7O0FBRXpDLFlBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDOztBQUV0RCxZQUFJLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRTtBQUMzQixnQkFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNuRDs7QUFFRCxZQUFJLENBQUMsTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztLQUNuRDs7Ozs7Ozs7aUJBaENnQixlQUFlOztlQXVDeEIsa0JBQUMsU0FBUyxFQUFFO0FBQ2hCLGdCQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFOztBQUUvQixvQkFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7O0FBRTNCLG9CQUFJLFlBQVksR0FBRyxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQzs7QUFFL0Msb0JBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDOztBQUV2QyxvQkFBSSxDQUFDLFNBQVMsR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQzs7QUFFOUMsb0JBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQzs7QUFFaEIsb0JBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxDQUFDLEVBQUU7QUFDdEIsd0JBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2lCQUNsQzthQUNKLE1BQU07QUFDSCxzQkFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO2FBQy9DO1NBQ0o7Ozs7Ozs7O2VBTU8sb0JBQUc7QUFDUCxtQkFBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQ3pCOzs7Ozs7Ozs7ZUFPTSxpQkFBQyxXQUFXLEVBQUU7O0FBRWpCLGdCQUFJLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7OztBQUd4RCxpQkFBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7O0FBRS9DLG9CQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7O0FBRTVDLDRCQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7O0FBRTVDLG9CQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDekI7O0FBRUQsZ0JBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxDQUFDLEVBQUU7QUFDdEIsdUJBQU8sWUFBWSxDQUFDO2FBQ3ZCLE1BQU07O0FBRUgsNEJBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztBQUM1RSx1QkFBTyxZQUFZLENBQUM7YUFDdkI7U0FDSjs7Ozs7Ozs7ZUFNYSwwQkFBRzs7OztBQUliLGdCQUFJLElBQUksQ0FBQyxRQUFRLEtBQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxBQUFDLEVBQUU7QUFDNUMsb0JBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO2FBQ3JCLE1BQU07QUFDSCxvQkFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQzthQUNyQzs7O0FBR0QsZ0JBQUksSUFBSSxDQUFDLE9BQU8sS0FBTSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEFBQUMsRUFBRTtBQUMzQyxvQkFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUM7YUFDcEIsTUFBTTtBQUNILG9CQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO2FBQ25DO1NBQ0o7Ozs7Ozs7O2VBTXNCLG1DQUFHOztBQUV0QixnQkFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFBLElBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUEsQUFBQyxDQUFDO1NBQ3pEOzs7Ozs7OztlQU1PLG9CQUFHO0FBQ1AsZ0JBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRTtBQUNuQyxvQkFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO0FBQ3hDLG9CQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQzthQUMzQyxNQUFNO0FBQ0gsb0JBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO2FBQ2hEO1NBQ0o7Ozs7Ozs7OztlQU9zQixpQ0FBQyxXQUFXLEVBQUU7QUFDakMsZ0JBQUksWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQzs7QUFFeEQsZ0JBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNULGdCQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO0FBQ3ZCLGdCQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDOztBQUV2QixpQkFBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7O0FBRS9DLGlCQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7QUFHbkIsaUJBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUM7OztBQUd0QyxtQkFBRyxHQUFHLENBQUMsQ0FBQztBQUNSLG1CQUFHLEdBQUcsQ0FBQyxDQUFDOztBQUVSLDRCQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBRXZCOztBQUVELGdCQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztBQUNuQixnQkFBSSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7O0FBRW5CLG1CQUFPLFlBQVksQ0FBQztTQUN2Qjs7O1dBM0tnQixlQUFlOzs7cUJBQWYsZUFBZTs7OztBQ1RwQztBQUNBOzs7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcGJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcmRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxdUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeGxCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM2tCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6d0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ptQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6Y0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gIEFyY2hvbnRpcyBQb2xpdGlzXG4vLyAgYXJjaG9udGlzLnBvbGl0aXNAYWFsdG8uZmlcbi8vICBEYXZpZCBQb2lyaWVyLVF1aW5vdFxuLy8gIGRhdmlwb2lyQGlyY2FtLmZyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy9cbi8vICBKU0FtYmlzb25pY3MgYSBKYXZhU2NyaXB0IGxpYnJhcnkgZm9yIGhpZ2hlci1vcmRlciBBbWJpc29uaWNzXG4vLyAgVGhlIGxpYnJhcnkgaW1wbGVtZW50cyBXZWIgQXVkaW8gYmxvY2tzIHRoYXQgcGVyZm9ybVxuLy8gIHR5cGljYWwgYW1iaXNvbmljIHByb2Nlc3Npbmcgb3BlcmF0aW9ucyBvbiBhdWRpbyBzaWduYWxzLlxuLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vKiBIT0EgQklOQVVSQUwgREVDT0RFUiAqL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgYmluRGVjb2RlciB7XG5cbiAgICBjb25zdHJ1Y3RvcihhdWRpb0N0eCwgb3JkZXIpIHtcblxuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5jdHggPSBhdWRpb0N0eDtcbiAgICAgICAgdGhpcy5vcmRlciA9IG9yZGVyO1xuICAgICAgICB0aGlzLm5DaCA9IChvcmRlciArIDEpICogKG9yZGVyICsgMSk7XG4gICAgICAgIHRoaXMuZGVjRmlsdGVycyA9IG5ldyBBcnJheSh0aGlzLm5DaCk7XG4gICAgICAgIHRoaXMuZGVjRmlsdGVyTm9kZXMgPSBuZXcgQXJyYXkodGhpcy5uQ2gpO1xuICAgICAgICAvLyBpbnB1dCBhbmQgb3V0cHV0IG5vZGVzXG4gICAgICAgIHRoaXMuaW4gPSB0aGlzLmN0eC5jcmVhdGVDaGFubmVsU3BsaXR0ZXIodGhpcy5uQ2gpO1xuICAgICAgICB0aGlzLm91dCA9IHRoaXMuY3R4LmNyZWF0ZUNoYW5uZWxNZXJnZXIoMik7XG4gICAgICAgIHRoaXMub3V0LmNoYW5uZWxDb3VudE1vZGUgPSAnZXhwbGljaXQnO1xuICAgICAgICB0aGlzLm91dC5jaGFubmVsQ291bnQgPSAxO1xuICAgICAgICAvLyBkb3dubWl4aW5nIGdhaW5zIGZvciBsZWZ0IGFuZCByaWdodCBlYXJzXG4gICAgICAgIHRoaXMuZ2Fpbk1pZCA9IHRoaXMuY3R4LmNyZWF0ZUdhaW4oKTtcbiAgICAgICAgdGhpcy5nYWluU2lkZSA9IHRoaXMuY3R4LmNyZWF0ZUdhaW4oKTtcbiAgICAgICAgdGhpcy5pbnZlcnRTaWRlID0gdGhpcy5jdHguY3JlYXRlR2FpbigpO1xuICAgICAgICB0aGlzLmdhaW5NaWQuZ2Fpbi52YWx1ZSA9IDE7XG4gICAgICAgIHRoaXMuZ2FpblNpZGUuZ2Fpbi52YWx1ZSA9IDE7XG4gICAgICAgIHRoaXMuaW52ZXJ0U2lkZS5nYWluLnZhbHVlID0gLTE7XG4gICAgICAgIC8vIGNvbnZvbHZlciBub2Rlc1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubkNoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuZGVjRmlsdGVyTm9kZXNbaV0gPSB0aGlzLmN0eC5jcmVhdGVDb252b2x2ZXIoKTtcbiAgICAgICAgICAgIHRoaXMuZGVjRmlsdGVyTm9kZXNbaV0ubm9ybWFsaXplID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gaW5pdGlhbGl6ZSBjb252b2x2ZXJzIHRvIHBsYWluIGNhcmRpb2lkc1xuICAgICAgICB0aGlzLnJlc2V0RmlsdGVycygpO1xuICAgICAgICAvLyBjcmVhdGUgYXVkaW8gY29ubmVjdGlvbnNcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm5DaDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmluLmNvbm5lY3QodGhpcy5kZWNGaWx0ZXJOb2Rlc1tpXSwgaSwgMCk7XG4gICAgICAgICAgICB2YXIgbiA9IE1hdGguZmxvb3IoTWF0aC5zcXJ0KGkpKTtcbiAgICAgICAgICAgIHZhciBtID0gaSAtIG4gKiBuIC0gbjtcbiAgICAgICAgICAgIGlmIChtID49IDApIHRoaXMuZGVjRmlsdGVyTm9kZXNbaV0uY29ubmVjdCh0aGlzLmdhaW5NaWQpO1xuICAgICAgICAgICAgZWxzZSB0aGlzLmRlY0ZpbHRlck5vZGVzW2ldLmNvbm5lY3QodGhpcy5nYWluU2lkZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5nYWluTWlkLmNvbm5lY3QodGhpcy5vdXQsIDAsIDApO1xuICAgICAgICB0aGlzLmdhaW5TaWRlLmNvbm5lY3QodGhpcy5vdXQsIDAsIDApO1xuXG4gICAgICAgIHRoaXMuZ2Fpbk1pZC5jb25uZWN0KHRoaXMub3V0LCAwLCAxKTtcbiAgICAgICAgdGhpcy5nYWluU2lkZS5jb25uZWN0KHRoaXMuaW52ZXJ0U2lkZSwgMCwgMCk7XG4gICAgICAgIHRoaXMuaW52ZXJ0U2lkZS5jb25uZWN0KHRoaXMub3V0LCAwLCAxKTtcblxuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB1cGRhdGVGaWx0ZXJzKGF1ZGlvQnVmZmVyKSB7XG4gICAgICAgIC8vIGFzc2lnbiBmaWx0ZXJzIHRvIGNvbnZvbHZlcnNcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm5DaDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmRlY0ZpbHRlcnNbaV0gPSB0aGlzLmN0eC5jcmVhdGVCdWZmZXIoMSwgYXVkaW9CdWZmZXIubGVuZ3RoLCBhdWRpb0J1ZmZlci5zYW1wbGVSYXRlKTtcbiAgICAgICAgICAgIHRoaXMuZGVjRmlsdGVyc1tpXS5nZXRDaGFubmVsRGF0YSgwKS5zZXQoYXVkaW9CdWZmZXIuZ2V0Q2hhbm5lbERhdGEoaSkpO1xuXG4gICAgICAgICAgICB0aGlzLmRlY0ZpbHRlck5vZGVzW2ldLmJ1ZmZlciA9IHRoaXMuZGVjRmlsdGVyc1tpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0RmlsdGVycygpIHtcbiAgICAgICAgLy8gb3ZlcndyaXRlIGRlY29kaW5nIGZpbHRlcnMgKHBsYWluIGNhcmRpb2lkIHZpcnR1YWwgbWljcm9waG9uZXMpXG4gICAgICAgIHZhciBjYXJkR2FpbnMgPSBuZXcgQXJyYXkodGhpcy5uQ2gpO1xuICAgICAgICBjYXJkR2FpbnMuZmlsbCgwKTtcbiAgICAgICAgY2FyZEdhaW5zWzBdID0gMC41O1xuICAgICAgICBjYXJkR2FpbnNbMV0gPSAwLjUgLyBNYXRoLnNxcnQoMyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5uQ2g7IGkrKykge1xuICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgICAgICAvLyBUaGlzIHdvcmtzIGZvciBDaHJvbWUgYW5kIEZpcmVmb3g6XG4gICAgICAgICAgICAvLyB0aGlzLmRlY0ZpbHRlcnNbaV0gPSB0aGlzLmN0eC5jcmVhdGVCdWZmZXIoMSwgMSwgdGhpcy5jdHguc2FtcGxlUmF0ZSk7XG4gICAgICAgICAgICAvLyB0aGlzLmRlY0ZpbHRlcnNbaV0uZ2V0Q2hhbm5lbERhdGEoMCkuc2V0KFtjYXJkR2FpbnNbaV1dKTtcbiAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAgICAgLy8gU2FmYXJpIGZvcmNlcyB1cyB0byB1c2UgdGhpczpcbiAgICAgICAgICAgIHRoaXMuZGVjRmlsdGVyc1tpXSA9IHRoaXMuY3R4LmNyZWF0ZUJ1ZmZlcigxLCA2NCwgdGhpcy5jdHguc2FtcGxlUmF0ZSk7XG4gICAgICAgICAgICAvLyBhbmQgd2lsbCBzZW5kIGdvcmdlb3VzIGNyYW5ja3kgbm9pc2UgYnVyc3RzIGZvciBhbnkgdmFsdWUgYmVsb3cgNjRcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgNjQ7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVjRmlsdGVyc1tpXS5nZXRDaGFubmVsRGF0YSgwKVtqXSA9IDAuMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGVjRmlsdGVyc1tpXS5nZXRDaGFubmVsRGF0YSgwKVswXSA9IGNhcmRHYWluc1tpXTtcbiAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAgICAgdGhpcy5kZWNGaWx0ZXJOb2Rlc1tpXS5idWZmZXIgPSB0aGlzLmRlY0ZpbHRlcnNbaV07XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gIEFyY2hvbnRpcyBQb2xpdGlzXG4vLyAgYXJjaG9udGlzLnBvbGl0aXNAYWFsdG8uZmlcbi8vICBEYXZpZCBQb2lyaWVyLVF1aW5vdFxuLy8gIGRhdmlwb2lyQGlyY2FtLmZyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy9cbi8vICBKU0FtYmlzb25pY3MgYSBKYXZhU2NyaXB0IGxpYnJhcnkgZm9yIGhpZ2hlci1vcmRlciBBbWJpc29uaWNzXG4vLyAgVGhlIGxpYnJhcnkgaW1wbGVtZW50cyBXZWIgQXVkaW8gYmxvY2tzIHRoYXQgcGVyZm9ybVxuLy8gIHR5cGljYWwgYW1iaXNvbmljIHByb2Nlc3Npbmcgb3BlcmF0aW9ucyBvbiBhdWRpbyBzaWduYWxzLlxuLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vKiBGT0EgQi1GT1JNQVQgVE8gQUNOL04zRCBDT05WRVJURVIgKi9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5leHBvcnQgY2xhc3Mgd3h5ejJhY24ge1xuXG4gICAgY29uc3RydWN0b3IoYXVkaW9DdHgpIHtcblxuICAgICAgICB0aGlzLmN0eCA9IGF1ZGlvQ3R4O1xuICAgICAgICB0aGlzLmluID0gdGhpcy5jdHguY3JlYXRlQ2hhbm5lbFNwbGl0dGVyKDQpO1xuICAgICAgICB0aGlzLm91dCA9IHRoaXMuY3R4LmNyZWF0ZUNoYW5uZWxNZXJnZXIoNCk7XG4gICAgICAgIHRoaXMuZ2FpbnMgPSBuZXcgQXJyYXkoNCk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuZ2FpbnNbaV0gPSB0aGlzLmN0eC5jcmVhdGVHYWluKCk7XG4gICAgICAgICAgICBpZiAoaSA9PSAwKSB0aGlzLmdhaW5zW2ldLmdhaW4udmFsdWUgPSBNYXRoLlNRUlQyO1xuICAgICAgICAgICAgZWxzZSB0aGlzLmdhaW5zW2ldLmdhaW4udmFsdWUgPSBNYXRoLnNxcnQoMyk7XG5cbiAgICAgICAgICAgIHRoaXMuZ2FpbnNbaV0uY29ubmVjdCh0aGlzLm91dCwgMCwgaSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pbi5jb25uZWN0KHRoaXMuZ2FpbnNbMF0sIDAsIDApO1xuICAgICAgICB0aGlzLmluLmNvbm5lY3QodGhpcy5nYWluc1szXSwgMSwgMCk7XG4gICAgICAgIHRoaXMuaW4uY29ubmVjdCh0aGlzLmdhaW5zWzFdLCAyLCAwKTtcbiAgICAgICAgdGhpcy5pbi5jb25uZWN0KHRoaXMuZ2FpbnNbMl0sIDMsIDApO1xuICAgIH1cbn1cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8qIEFDTi9OM0QgVE8gRk9BIEItRk9STUFUIENPTlZFUlRFUiAqL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmV4cG9ydCBjbGFzcyBhY24yd3h5eiB7XG5cbiAgICBjb25zdHJ1Y3RvcihhdWRpb0N0eCkge1xuXG4gICAgICAgIHRoaXMuY3R4ID0gYXVkaW9DdHg7XG4gICAgICAgIHRoaXMuaW4gPSB0aGlzLmN0eC5jcmVhdGVDaGFubmVsU3BsaXR0ZXIoNCk7XG4gICAgICAgIHRoaXMub3V0ID0gdGhpcy5jdHguY3JlYXRlQ2hhbm5lbE1lcmdlcig0KTtcbiAgICAgICAgdGhpcy5nYWlucyA9IG5ldyBBcnJheSg0KTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5nYWluc1tpXSA9IHRoaXMuY3R4LmNyZWF0ZUdhaW4oKTtcbiAgICAgICAgICAgIGlmIChpID09IDApIHRoaXMuZ2FpbnNbaV0uZ2Fpbi52YWx1ZSA9IE1hdGguU1FSVDFfMjtcbiAgICAgICAgICAgIGVsc2UgdGhpcy5nYWluc1tpXS5nYWluLnZhbHVlID0gMSAvIE1hdGguc3FydCgzKTtcblxuICAgICAgICAgICAgdGhpcy5nYWluc1tpXS5jb25uZWN0KHRoaXMub3V0LCAwLCBpKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluLmNvbm5lY3QodGhpcy5nYWluc1swXSwgMCwgMCk7XG4gICAgICAgIHRoaXMuaW4uY29ubmVjdCh0aGlzLmdhaW5zWzJdLCAxLCAwKTtcbiAgICAgICAgdGhpcy5pbi5jb25uZWN0KHRoaXMuZ2FpbnNbM10sIDIsIDApO1xuICAgICAgICB0aGlzLmluLmNvbm5lY3QodGhpcy5nYWluc1sxXSwgMywgMCk7XG4gICAgfVxufVxuXG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vKiBBQ04vU04zRCBUTyBBQ04vTjNEIENPTlZFUlRFUiAqL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmV4cG9ydCBjbGFzcyBzbjNkMm4zZCB7XG4gICAgXG4gICAgY29uc3RydWN0b3IoYXVkaW9DdHgsIG9yZGVyKSB7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmN0eCA9IGF1ZGlvQ3R4O1xuICAgICAgICB0aGlzLm9yZGVyID0gb3JkZXI7XG4gICAgICAgIHRoaXMubkNoID0gKG9yZGVyICsgMSkgKiAob3JkZXIgKyAxKTtcbiAgICAgICAgdGhpcy5pbiA9IHRoaXMuY3R4LmNyZWF0ZUNoYW5uZWxTcGxpdHRlcih0aGlzLm5DaCk7XG4gICAgICAgIHRoaXMub3V0ID0gdGhpcy5jdHguY3JlYXRlQ2hhbm5lbE1lcmdlcih0aGlzLm5DaCk7XG4gICAgICAgIHRoaXMuZ2FpbnMgPSBuZXcgQXJyYXkodGhpcy5uQ2gpO1xuICAgICAgICBcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm5DaDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbiA9IE1hdGguZmxvb3IoTWF0aC5zcXJ0KGkpKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5nYWluc1tpXSA9IHRoaXMuY3R4LmNyZWF0ZUdhaW4oKTtcbiAgICAgICAgICAgIHRoaXMuZ2FpbnNbaV0uZ2Fpbi52YWx1ZSA9IE1hdGguc3FydCgyKm4rMSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHRoaXMuaW4uY29ubmVjdCh0aGlzLmdhaW5zW2ldLCBpLCAwKTtcbiAgICAgICAgICAgIHRoaXMuZ2FpbnNbaV0uY29ubmVjdCh0aGlzLm91dCwgMCwgaSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vKiBBQ04vTjNEIFRPIEFDTi9TTjNEIENPTlZFUlRFUiAqL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbmV4cG9ydCBjbGFzcyBuM2Qyc24zZCB7XG4gICAgXG4gICAgY29uc3RydWN0b3IoYXVkaW9DdHgsIG9yZGVyKSB7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmN0eCA9IGF1ZGlvQ3R4O1xuICAgICAgICB0aGlzLm9yZGVyID0gb3JkZXI7XG4gICAgICAgIHRoaXMubkNoID0gKG9yZGVyICsgMSkgKiAob3JkZXIgKyAxKTtcbiAgICAgICAgdGhpcy5pbiA9IHRoaXMuY3R4LmNyZWF0ZUNoYW5uZWxTcGxpdHRlcih0aGlzLm5DaCk7XG4gICAgICAgIHRoaXMub3V0ID0gdGhpcy5jdHguY3JlYXRlQ2hhbm5lbE1lcmdlcih0aGlzLm5DaCk7XG4gICAgICAgIHRoaXMuZ2FpbnMgPSBuZXcgQXJyYXkodGhpcy5uQ2gpO1xuICAgICAgICBcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm5DaDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgbiA9IE1hdGguZmxvb3IoTWF0aC5zcXJ0KGkpKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5nYWluc1tpXSA9IHRoaXMuY3R4LmNyZWF0ZUdhaW4oKTtcbiAgICAgICAgICAgIHRoaXMuZ2FpbnNbaV0uZ2Fpbi52YWx1ZSA9IDEvTWF0aC5zcXJ0KDIqbisxKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5pbi5jb25uZWN0KHRoaXMuZ2FpbnNbaV0sIGksIDApO1xuICAgICAgICAgICAgdGhpcy5nYWluc1tpXS5jb25uZWN0KHRoaXMub3V0LCAwLCBpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vKiBGVU1BIFRPIEFDTi9OM0QgQ09OVkVSVEVSICovXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5leHBvcnQgY2xhc3MgZnVtYTJhY24ge1xuXG4gICAgY29uc3RydWN0b3IoYXVkaW9DdHgsIG9yZGVyKSB7XG4gICAgICAgIFxuICAgICAgICBpZiAob3JkZXI+Mykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJGdU1hIHNwZWNpZmljdGlvbiBpcyBzdXBwb3J0ZWQgdXAgdG8gM3JkIG9yZGVyXCIpO1xuICAgICAgICAgICAgb3JkZXIgPSAzO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyByZS1tYXBwaW5nIGluZGljZXMgZnJvbSBGdU1hIGNoYW5uZWxzIHRvIEFDTlxuICAgICAgICAvLyB2YXIgaW5kZXhfZnVtYTJhY24gPSBbMCwgMiwgMywgMSwgOCwgNiwgNCwgNSwgNywgMTUsIDEzLCAxMSwgOSwgMTAsIDEyLCAxNF07XG4gICAgICAgIC8vIC8vICAgICAgICAgICAgICAgICAgICBXICBZICBaICBYICBWICBUICBSICBTICBVICBRICAgTyAgIE0gICBLICBMICAgTiAgIFBcbiAgICAgICAgXG4gICAgICAgIC8vIGdhaW5zIGZvciBlYWNoIEZ1TWEgY2hhbm5lbCB0byBOM0QsIGFmdGVyIHJlLW1hcHBpbmcgY2hhbm5lbHNcbiAgICAgICAgdmFyIGdhaW5zX2Z1bWEybjNkID0gW01hdGguc3FydCgyKSwgICAgIC8vIFdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguc3FydCgzKSwgICAgIC8vIFlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguc3FydCgzKSwgICAgIC8vIFpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguc3FydCgzKSwgICAgIC8vIFhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguc3FydCgxNSkvMiwgIC8vIFZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguc3FydCgxNSkvMiwgIC8vIFRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguc3FydCg1KSwgICAgIC8vIFJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguc3FydCgxNSkvMiwgIC8vIFNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguc3FydCgxNSkvMiwgIC8vIFVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguc3FydCgzNS84KSwgIC8vIFFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguc3FydCgzNSkvMywgIC8vIE9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguc3FydCgyMjQvNDUpLC8vIE1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguc3FydCg3KSwgICAgIC8vIEtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguc3FydCgyMjQvNDUpLC8vIExcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguc3FydCgzNSkvMywgIC8vIE5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGguc3FydCgzNS84KV0gIC8vIFBcbiAgICAgICAgXG4gICAgICAgIHRoaXMuY3R4ID0gYXVkaW9DdHg7XG4gICAgICAgIHRoaXMub3JkZXIgPSBvcmRlcjtcbiAgICAgICAgdGhpcy5uQ2ggPSAob3JkZXIgKyAxKSAqIChvcmRlciArIDEpO1xuICAgICAgICB0aGlzLmluID0gdGhpcy5jdHguY3JlYXRlQ2hhbm5lbFNwbGl0dGVyKHRoaXMubkNoKTtcbiAgICAgICAgdGhpcy5vdXQgPSB0aGlzLmN0eC5jcmVhdGVDaGFubmVsTWVyZ2VyKHRoaXMubkNoKTtcbiAgICAgICAgdGhpcy5nYWlucyA9IFtdO1xuICAgICAgICB0aGlzLnJlbWFwQXJyYXkgPSBbXTtcblxuICAgICAgICAvLyBnZXQgY2hhbm5lbCByZW1hcHBpbmcgdmFsdWVzIG9yZGVyIDAtMVxuICAgICAgICB0aGlzLnJlbWFwQXJyYXkucHVzaCgwLCAyLCAzLCAxKTsgLy8gbWFudWFsbHkgaGFuZGxlIHVudGlsIG9yZGVyIDFcblxuICAgICAgICAvLyBnZXQgY2hhbm5lbCByZW1hcHBpbmcgdmFsdWVzIG9yZGVyIDItTlxuICAgICAgICBpZiAob3JkZXI+MSkge1xuICAgICAgICAgICAgdmFyIG8gPSAwO1xuICAgICAgICAgICAgdmFyIG07XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubkNoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBtID0gW107XG4gICAgICAgICAgICAgICAgaWYgKGkgPj0gKG8gKyAxKSAqIChvICsgMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbyArPSAxO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gKG8gKyAxKSAqIChvICsgMSk7IGogPCAobyArIDIpICogKG8gKyAyKTsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChqICsgbyAlIDIpICUgMikgPT0gMCkgeyBtLnB1c2goaikgfSBlbHNlIHsgbS51bnNoaWZ0KGopIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbWFwQXJyYXkgPSB0aGlzLnJlbWFwQXJyYXkuY29uY2F0KG0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbm5lY3QgaW5wdXRzL291dHB1dHMgKGtlcHQgc2VwYXJhdGVkIGZvciBjbGFyaXR5J3Mgc2FrZSlcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm5DaDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmdhaW5zW2ldID0gdGhpcy5jdHguY3JlYXRlR2FpbigpO1xuICAgICAgICAgICAgdGhpcy5nYWluc1tpXS5nYWluLnZhbHVlID0gZ2FpbnNfZnVtYTJuM2RbaV07XG4gICAgICAgICAgICB0aGlzLmluLmNvbm5lY3QodGhpcy5nYWluc1tpXSwgdGhpcy5yZW1hcEFycmF5W2ldLCAwKTtcbiAgICAgICAgICAgIHRoaXMuZ2FpbnNbaV0uY29ubmVjdCh0aGlzLm91dCwgMCwgaSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gIEFyY2hvbnRpcyBQb2xpdGlzXG4vLyAgYXJjaG9udGlzLnBvbGl0aXNAYWFsdG8uZmlcbi8vICBEYXZpZCBQb2lyaWVyLVF1aW5vdFxuLy8gIGRhdmlwb2lyQGlyY2FtLmZyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy9cbi8vICBKU0FtYmlzb25pY3MgYSBKYXZhU2NyaXB0IGxpYnJhcnkgZm9yIGhpZ2hlci1vcmRlciBBbWJpc29uaWNzXG4vLyAgVGhlIGxpYnJhcnkgaW1wbGVtZW50cyBXZWIgQXVkaW8gYmxvY2tzIHRoYXQgcGVyZm9ybVxuLy8gIHR5cGljYWwgYW1iaXNvbmljIHByb2Nlc3Npbmcgb3BlcmF0aW9ucyBvbiBhdWRpbyBzaWduYWxzLlxuLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLyogSE9BIEFNQklTT05JQyBERUNPREVSICovXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxudmFyIHV0aWxzID0gcmVxdWlyZShcIi4vdXRpbHMuanNcIik7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGRlY29kZXIge1xuXG4gICAgY29uc3RydWN0b3IoYXVkaW9DdHgsIG9yZGVyKSB7XG5cbiAgICAgICAgLy8gbG9jYWxzXG4gICAgICAgIHRoaXMuY3R4ID0gYXVkaW9DdHg7XG4gICAgICAgIHRoaXMub3JkZXIgPSBvcmRlcjtcbiAgICAgICAgdGhpcy5uQ2ggPSAob3JkZXIgKyAxKSAqIChvcmRlciArIDEpO1xuICAgICAgICB0aGlzLm5TcGsgPSAwO1xuICAgICAgICB0aGlzLl9kZWNvZGluZ01hdHJpeCA9IFtdO1xuICAgICAgICB0aGlzLl9zcGtTcGhQb3NBcnJheSA9IFtdO1xuXG4gICAgICAgIC8vIElucHV0IGFuZCBvdXRwdXQgbm9kZXNcbiAgICAgICAgdGhpcy5pbiA9IHRoaXMuY3R4LmNyZWF0ZUNoYW5uZWxTcGxpdHRlcih0aGlzLm5DaCk7XG4gICAgICAgIHRoaXMub3V0ID0gdGhpcy5jdHguY3JlYXRlQ2hhbm5lbE1lcmdlcigxKTsgLy8gZHVtbXlcblxuICAgICAgICAvLyBkdW1teSBpbml0IGFycmF5XG4gICAgICAgIHRoaXMuX3Nwa1NwaFBvc0FycmF5ID0gdGhpcy5fZ2V0RGVmYXVsdFNwa0NvbmZpZyh0aGlzLm9yZGVyKTtcbiAgICAgICAgdGhpcy5fdXBkYXRlRGVjb2RlTXR4KCB0aGlzLl9zcGtTcGhQb3NBcnJheSApO1xuICAgIH1cblxuICAgIC8vIHNwa1NwaFBvc0FycmF5IGluIHNwaGVyaWNhbCBjb29yZGluYXRlczogWyBbYXppbTEsIGVsZXYxLCBkaXN0MV0sIC4uLiBbYXppbU4sIGVsZXZOLCBkaXN0Tl0gXVxuICAgIHNldCBzcGVha2VyUG9zKHNwa1NwaFBvc0FycmF5KXtcbiAgICAgICAgLy8gc2V0IGRlZmF1bHQgYXJyYXlcbiAgICAgICAgaWYoIHNwa1NwaFBvc0FycmF5ID09PSB1bmRlZmluZWQgKXsgc3BrU3BoUG9zQXJyYXkgPSB0aGlzLl9nZXREZWZhdWx0U3BrQ29uZmlnKHRoaXMub3JkZXIpOyB9XG4gICAgICAgIHRoaXMuX3Nwa1NwaFBvc0FycmF5ID0gc3BrU3BoUG9zQXJyYXk7XG4gICAgICAgIC8vIGRpc2NhcmQgb2xkIG91dHB1dFxuICAgICAgICB0aGlzLm91dC5kaXNjb25uZWN0KCk7XG4gICAgICAgIC8vIHVwZGF0ZSBvdXRwdXQgLyBkZWNvZGUgbWF0cml4IFxuICAgICAgICB0aGlzLl91cGRhdGVEZWNvZGVNdHgoIHNwa1NwaFBvc0FycmF5ICk7XG4gICAgfVxuXG4gICAgZ2V0IHNwZWFrZXJQb3MoKXsgcmV0dXJuIHRoaXMuX3Nwa1NwaFBvc0FycmF5OyB9XG5cbiAgICAvLyBpbnRlcm5hbCBtZXRob2QgdG8gY2FsY3VsYXRlIEFtYmlzb25pYyBkZWNvZGluZyBtYXRyaXggYW5kIGRlZmluZSBuZXcgYW1iaXNvbmljIGdhaW4gbm9kZXMgYW5kIHZhbHVlc1xuICAgIF91cGRhdGVEZWNvZGVNdHgoc3BrU3BoUG9zQXJyYXkpe1xuICAgICAgICBcbiAgICAgICAgLy8gdXBkYXRlIG91dHB1dFxuICAgICAgICB0aGlzLm5TcGsgPSBzcGtTcGhQb3NBcnJheS5sZW5ndGg7XG4gICAgICAgIHRoaXMub3V0ID0gdGhpcy5jdHguY3JlYXRlQ2hhbm5lbE1lcmdlcih0aGlzLm5TcGspO1xuXG4gICAgICAgIC8vIGdldCBkZWNvZGluZyBtYXRyaXhcbiAgICAgICAgdGhpcy5fZGVjb2RpbmdNYXRyaXggPSB1dGlscy5nZXRBbWJpc29uaWNEZWNNdHgoc3BrU3BoUG9zQXJyYXksIHRoaXMub3JkZXIpO1xuXG4gICAgICAgIC8vIGFzc2lnbiBhbWJpc29uaWMgZ2FpbnMgdG8gZ2FpbiBtYXRyaXggKyBjb25uZWN0IG5ldyBncmFwaFxuICAgICAgICB0aGlzLm10eEdhaW4gPSBuZXcgQXJyYXkodGhpcy5uQ2gpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubkNoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMubXR4R2FpbltpXSA9IG5ldyBBcnJheSh0aGlzLm5TcGspO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLm5TcGs7IGorKykge1xuICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSAvIHNldHVwIGdhaW5cbiAgICAgICAgICAgICAgICBsZXQgZyA9IHRoaXMuY3R4LmNyZWF0ZUdhaW4oKTtcbiAgICAgICAgICAgICAgICBnLmdhaW4udmFsdWUgPSB0aGlzLl9kZWNvZGluZ01hdHJpeFtqXVtpXTtcbiAgICAgICAgICAgICAgICAvLyBjb25uZWN0IGdyYXBoXG4gICAgICAgICAgICAgICAgdGhpcy5pbi5jb25uZWN0KGcsIGksIDApO1xuICAgICAgICAgICAgICAgIGcuY29ubmVjdCh0aGlzLm91dCwgMCwgaik7XG4gICAgICAgICAgICAgICAgLy8gc2F2ZSB0byBsb2NhbFxuICAgICAgICAgICAgICAgIHRoaXMubXR4R2FpbltpXVtqXSA9IGc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBnZXQgZGVmYXVsdCBzcGVha2VyIGNvbmZpZ3VyYXRpb24gZm9yIG9yZGVycyAxLCAyLCAzXG4gICAgX2dldERlZmF1bHRTcGtDb25maWcob3JkZXIpe1xuICAgICAgICBsZXQgc3BrU3BoUG9zQXJyYXkgPSBbXTtcbiAgICAgICAgc3dpdGNoKG9yZGVyKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBmaXJzdCBvcmRlcjogb2N0YWhlZHJvblxuICAgICAgICAgICAgICAgIHNwa1NwaFBvc0FycmF5ID0gWyBbMCwgMCwgMV0sIFs5MCwgMCwgMV0sIFsxODAsIDAsIDFdLCBbMjcwLCAwLCAxXSwgWzAsIDkwLCAxXSwgWzAsIC05MCwgMV0gXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHNlY29uZCBvcmRlcjogaWNvc2FoZWRyb25cbiAgICAgICAgICAgICAgICBzcGtTcGhQb3NBcnJheSA9IFtcbiAgICAgICAgICAgICAgICAgICAgWyAgMTgwLjAwMDAsICAtMzEuNzE2MSwgICAgMC41ODc4XSxcbiAgICAgICAgICAgICAgICAgICAgWyAgMTgwLjAwMDAsICAgMzEuNzE2MSwgICAgMC41ODc4XSxcbiAgICAgICAgICAgICAgICAgICAgWyAtMTIxLjcxNjEsICAgICAgICAgMCwgICAgMC41ODc4XSxcbiAgICAgICAgICAgICAgICAgICAgWyAgMTIxLjcxNjEsICAgICAgICAgMCwgICAgMC41ODc4XSxcbiAgICAgICAgICAgICAgICAgICAgWyAgLTkwLjAwMDAsICAtNTguMjgzOSwgICAgMC41ODc4XSxcbiAgICAgICAgICAgICAgICAgICAgWyAgLTkwLjAwMDAsICAgNTguMjgzOSwgICAgMC41ODc4XSxcbiAgICAgICAgICAgICAgICAgICAgWyAgIDkwLjAwMDAsICAtNTguMjgzOSwgICAgMC41ODc4XSxcbiAgICAgICAgICAgICAgICAgICAgWyAgIDkwLjAwMDAsICAgNTguMjgzOSwgICAgMC41ODc4XSxcbiAgICAgICAgICAgICAgICAgICAgWyAgLTU4LjI4MzksICAgICAgICAgMCwgICAgMC41ODc4XSxcbiAgICAgICAgICAgICAgICAgICAgWyAgIDU4LjI4MzksICAgICAgICAgMCwgICAgMC41ODc4XSxcbiAgICAgICAgICAgICAgICAgICAgWyAgICAgICAgIDAsICAtMzEuNzE2MSwgICAgMC41ODc4XSxcbiAgICAgICAgICAgICAgICAgICAgWyAgICAgICAgIDAsICAgMzEuNzE2MSwgICAgMC41ODc4XV07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0aGlyZCBvcmRlcjogZG9kZWNhaGVkcm9uXG4gICAgICAgICAgICAgICAgc3BrU3BoUG9zQXJyYXkgPSBbXG4gICAgICAgICAgICAgICAgICAgIFsgLTE1OS4wOTMxLCAgICAgICAgIDAsICAgIDAuNTM1Ml0sXG4gICAgICAgICAgICAgICAgICAgIFsgIDE1OS4wOTMxLCAgICAgICAgIDAsICAgIDAuNTM1Ml0sXG4gICAgICAgICAgICAgICAgICAgIFsgLTEzNS4wMDAwLCAgLTM1LjI2NDQsICAgIDAuNTM1Ml0sXG4gICAgICAgICAgICAgICAgICAgIFsgLTEzNS4wMDAwLCAgIDM1LjI2NDQsICAgIDAuNTM1Ml0sXG4gICAgICAgICAgICAgICAgICAgIFsgIDEzNS4wMDAwLCAgLTM1LjI2NDQsICAgIDAuNTM1Ml0sXG4gICAgICAgICAgICAgICAgICAgIFsgIDEzNS4wMDAwLCAgIDM1LjI2NDQsICAgIDAuNTM1Ml0sXG4gICAgICAgICAgICAgICAgICAgIFsgIDE4MC4wMDAwLCAgLTY5LjA5MzEsICAgIDAuNTM1Ml0sXG4gICAgICAgICAgICAgICAgICAgIFsgIDE4MC4wMDAwLCAgIDY5LjA5MzEsICAgIDAuNTM1Ml0sXG4gICAgICAgICAgICAgICAgICAgIFsgIC05MC4wMDAwLCAgLTIwLjkwNjksICAgIDAuNTM1Ml0sXG4gICAgICAgICAgICAgICAgICAgIFsgIC05MC4wMDAwLCAgIDIwLjkwNjksICAgIDAuNTM1Ml0sXG4gICAgICAgICAgICAgICAgICAgIFsgICA5MC4wMDAwLCAgLTIwLjkwNjksICAgIDAuNTM1Ml0sXG4gICAgICAgICAgICAgICAgICAgIFsgICA5MC4wMDAwLCAgIDIwLjkwNjksICAgIDAuNTM1Ml0sXG4gICAgICAgICAgICAgICAgICAgIFsgICAgICAgICAwLCAgLTY5LjA5MzEsICAgIDAuNTM1Ml0sXG4gICAgICAgICAgICAgICAgICAgIFsgICAgICAgICAwLCAgIDY5LjA5MzEsICAgIDAuNTM1Ml0sXG4gICAgICAgICAgICAgICAgICAgIFsgIC00NS4wMDAwLCAgLTM1LjI2NDQsICAgIDAuNTM1Ml0sXG4gICAgICAgICAgICAgICAgICAgIFsgIC00NS4wMDAwLCAgIDM1LjI2NDQsICAgIDAuNTM1Ml0sXG4gICAgICAgICAgICAgICAgICAgIFsgICA0NS4wMDAwLCAgLTM1LjI2NDQsICAgIDAuNTM1Ml0sXG4gICAgICAgICAgICAgICAgICAgIFsgICA0NS4wMDAwLCAgIDM1LjI2NDQsICAgIDAuNTM1Ml0sXG4gICAgICAgICAgICAgICAgICAgIFsgIC0yMC45MDY5LCAgICAgICAgIDAsICAgIDAuNTM1Ml0sXG4gICAgICAgICAgICAgICAgICAgIFsgICAyMC45MDY5LCAgICAgICAgIDAsICAgIDAuNTM1Ml1dO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwidW5zdXBwb3J0ZWQgZGVmYXVsdCBvcmRlcjpcIiwgb3JkZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzcGtTcGhQb3NBcnJheVxuICAgIH1cbn1cbiIsIi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyAgQXJjaG9udGlzIFBvbGl0aXNcbi8vICBhcmNob250aXMucG9saXRpc0BhYWx0by5maVxuLy8gIERhdmlkIFBvaXJpZXItUXVpbm90XG4vLyAgZGF2aXBvaXJAaXJjYW0uZnJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vL1xuLy8gIEpTQW1iaXNvbmljcyBhIEphdmFTY3JpcHQgbGlicmFyeSBmb3IgaGlnaGVyLW9yZGVyIEFtYmlzb25pY3Ncbi8vICBUaGUgbGlicmFyeSBpbXBsZW1lbnRzIFdlYiBBdWRpbyBibG9ja3MgdGhhdCBwZXJmb3JtXG4vLyAgdHlwaWNhbCBhbWJpc29uaWMgcHJvY2Vzc2luZyBvcGVyYXRpb25zIG9uIGF1ZGlvIHNpZ25hbHMuXG4vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vKiBQUkVTU1VSRS1WRUxPQ0lUWSBJTlRFTlNJVFkgQU5BTFlaRVIgKi9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vLyBmb3IgU2FmYXJpIHN1cHBvcnQgd2hlcmUgYXVkaW9Db250ZXh0LkFuYWx5c2VyLmdldEZsb2F0VGltZURvbWFpbkRhdGEgaXMgbm90IGRlZmluZWQgZm9yIG5vd1xuaW1wb3J0ICdnZXQtZmxvYXQtdGltZS1kb21haW4tZGF0YSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIGludGVuc2l0eUFuYWx5c2VyIHtcbiAgICBjb25zdHJ1Y3RvcihhdWRpb0N0eCkge1xuXG4gICAgICAgIHRoaXMuY3R4ID0gYXVkaW9DdHg7XG4gICAgICAgIHRoaXMuZmZ0U2l6ZSA9IDIwNDg7XG4gICAgICAgIC8vIElucHV0IGFuZCBvdXRwdXQgbm9kZXNcbiAgICAgICAgdGhpcy5pbiA9IHRoaXMuY3R4LmNyZWF0ZUNoYW5uZWxTcGxpdHRlcig0KTtcbiAgICAgICAgdGhpcy5vdXQgPSB0aGlzLmN0eC5jcmVhdGVDaGFubmVsTWVyZ2VyKDQpO1xuICAgICAgICAvLyBHYWlucyB0byBnbyBmcm9tIEFDTi9OM0QgdG8gcHJlc3N1cmUtdmVsb2NpdHkgKFdYWVopXG4gICAgICAgIHRoaXMuZ2FpbnMgPSBuZXcgQXJyYXkoMyk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmdhaW5zW2ldID0gdGhpcy5jdHguY3JlYXRlR2FpbigpO1xuICAgICAgICAgICAgdGhpcy5nYWluc1tpXS5nYWluLnZhbHVlID0gMSAvIE1hdGguc3FydCgzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbml0aWFsaXplIGFuYWx5emVyIGJ1ZmZlcnNcbiAgICAgICAgdGhpcy5hbmFseXNlcnMgPSBuZXcgQXJyYXkoNCk7XG4gICAgICAgIHRoaXMuYW5hbEJ1ZmZlcnMgPSBuZXcgQXJyYXkoNCk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuYW5hbHlzZXJzW2ldID0gdGhpcy5jdHguY3JlYXRlQW5hbHlzZXIoKTtcbiAgICAgICAgICAgIHRoaXMuYW5hbHlzZXJzW2ldLmZmdFNpemUgPSB0aGlzLmZmdFNpemU7XG4gICAgICAgICAgICB0aGlzLmFuYWx5c2Vyc1tpXS5zbW9vdGhpbmdUaW1lQ29uc3RhbnQgPSAwO1xuICAgICAgICAgICAgdGhpcy5hbmFsQnVmZmVyc1tpXSA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5mZnRTaXplKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDcmVhdGUgY29ubmVjdGlvbnNcbiAgICAgICAgdGhpcy5pbi5jb25uZWN0KHRoaXMub3V0LCAwLCAwKTtcbiAgICAgICAgdGhpcy5pbi5jb25uZWN0KHRoaXMuYW5hbHlzZXJzWzBdLCAwLCAwKTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuaW4uY29ubmVjdCh0aGlzLmdhaW5zWzFdLCAxLCAwKTtcbiAgICAgICAgdGhpcy5pbi5jb25uZWN0KHRoaXMuZ2FpbnNbMl0sIDIsIDApO1xuICAgICAgICB0aGlzLmluLmNvbm5lY3QodGhpcy5nYWluc1swXSwgMywgMCk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuZ2FpbnNbaV0uY29ubmVjdCh0aGlzLmFuYWx5c2Vyc1tpKzFdLCAwLCAwKTtcbiAgICAgICAgICAgIHRoaXMuZ2FpbnNbaV0uY29ubmVjdCh0aGlzLm91dCwgMCwgaSsxKTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgdXBkYXRlQnVmZmVycygpIHtcbiAgICAgICAgLy8gR2V0IGxhdGVzdCB0aW1lLWRvbWFpbiBkYXRhXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmFuYWx5c2Vyc1tpXS5nZXRGbG9hdFRpbWVEb21haW5EYXRhKHRoaXMuYW5hbEJ1ZmZlcnNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcHV0ZUludGVuc2l0eSgpIHtcbiAgICAgICAgLy8gQ29tcHV0ZSBjb3JyZWxhdGlvbnMgYW5kIGVuZXJnaWVzIG9mIGNoYW5uZWxzXG4gICAgICAgIHZhciBpWCA9IDA7XG4gICAgICAgIHZhciBpWSA9IDA7XG4gICAgICAgIHZhciBpWiA9IDA7XG4gICAgICAgIHZhciBXVyA9IDA7XG4gICAgICAgIHZhciBYWCA9IDA7XG4gICAgICAgIHZhciBZWSA9IDA7XG4gICAgICAgIHZhciBaWiA9IDA7XG4gICAgICAgIHZhciBJLCBJX25vcm0sIEUsIFBzaSwgYXppbSwgZWxldjtcbiAgICAgICAgLy8gQWNjdW11bGF0b3JzIGZvciBjb3JyZWxhdGlvbnMgYW5kIGVuZXJnaWVzXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5mZnRTaXplOyBpKyspIHtcblxuICAgICAgICAgICAgaVggPSBpWCArIHRoaXMuYW5hbEJ1ZmZlcnNbMF1baV0gKiB0aGlzLmFuYWxCdWZmZXJzWzFdW2ldO1xuICAgICAgICAgICAgaVkgPSBpWSArIHRoaXMuYW5hbEJ1ZmZlcnNbMF1baV0gKiB0aGlzLmFuYWxCdWZmZXJzWzJdW2ldO1xuICAgICAgICAgICAgaVogPSBpWiArIHRoaXMuYW5hbEJ1ZmZlcnNbMF1baV0gKiB0aGlzLmFuYWxCdWZmZXJzWzNdW2ldO1xuICAgICAgICAgICAgV1cgPSBXVyArIHRoaXMuYW5hbEJ1ZmZlcnNbMF1baV0gKiB0aGlzLmFuYWxCdWZmZXJzWzBdW2ldO1xuICAgICAgICAgICAgWFggPSBYWCArIHRoaXMuYW5hbEJ1ZmZlcnNbMV1baV0gKiB0aGlzLmFuYWxCdWZmZXJzWzFdW2ldO1xuICAgICAgICAgICAgWVkgPSBZWSArIHRoaXMuYW5hbEJ1ZmZlcnNbMl1baV0gKiB0aGlzLmFuYWxCdWZmZXJzWzJdW2ldO1xuICAgICAgICAgICAgWlogPSBaWiArIHRoaXMuYW5hbEJ1ZmZlcnNbM11baV0gKiB0aGlzLmFuYWxCdWZmZXJzWzNdW2ldO1xuICAgICAgICB9XG4gICAgICAgIEkgPSBbaVgsIGlZLCBpWl07IC8vIGludGVuc2l0eVxuICAgICAgICBJX25vcm0gPSBNYXRoLnNxcnQoSVswXSpJWzBdICsgSVsxXSpJWzFdICsgSVsyXSpJWzJdKTsgLy8gaW50ZW5zaXR5IG1hZ25pdHVkZVxuICAgICAgICBFID0gKFdXICsgWFggKyBZWSArIFpaKSAvIDI7IC8vIGVuZXJneVxuICAgICAgICBQc2kgPSAxIC0gSV9ub3JtIC8gKEUgKyAxMGUtOCk7IC8vIGRpZmZ1c2VuZXNzXG4gICAgICAgIGF6aW0gPSBNYXRoLmF0YW4yKGlZLCBpWCkgKiAxODAgLyBNYXRoLlBJO1xuICAgICAgICBlbGV2ID0gTWF0aC5hdGFuMihJWzJdLCBNYXRoLnNxcnQoSVswXSAqIElbMF0gKyBJWzFdICogSVsxXSkpICogMTgwIC8gTWF0aC5QSTtcblxuICAgICAgICB2YXIgcGFyYW1zID0gW2F6aW0sIGVsZXYsIFBzaSwgRV07XG4gICAgICAgIHJldHVybiBwYXJhbXM7XG4gICAgfVxufVxuIiwiLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vICBBcmNob250aXMgUG9saXRpc1xuLy8gIGFyY2hvbnRpcy5wb2xpdGlzQGFhbHRvLmZpXG4vLyAgRGF2aWQgUG9pcmllci1RdWlub3Rcbi8vICBkYXZpcG9pckBpcmNhbS5mclxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vXG4vLyAgSlNBbWJpc29uaWNzIGEgSmF2YVNjcmlwdCBsaWJyYXJ5IGZvciBoaWdoZXItb3JkZXIgQW1iaXNvbmljc1xuLy8gIFRoZSBsaWJyYXJ5IGltcGxlbWVudHMgV2ViIEF1ZGlvIGJsb2NrcyB0aGF0IHBlcmZvcm1cbi8vICB0eXBpY2FsIGFtYmlzb25pYyBwcm9jZXNzaW5nIG9wZXJhdGlvbnMgb24gYXVkaW8gc2lnbmFscy5cbi8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vLy8vLy8vLy8vLy8vLy8vL1xuLyogSE9BIEVOQ09ERVIgKi9cbi8vLy8vLy8vLy8vLy8vLy8vXG5cbmltcG9ydCAqIGFzIGpzaGxpYiBmcm9tICdzcGhlcmljYWwtaGFybW9uaWMtdHJhbnNmb3JtJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgbW9ub0VuY29kZXIge1xuXG4gICAgY29uc3RydWN0b3IoYXVkaW9DdHgsIG9yZGVyKSB7XG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMuY3R4ID0gYXVkaW9DdHg7XG4gICAgICAgIHRoaXMub3JkZXIgPSBvcmRlcjtcbiAgICAgICAgdGhpcy5uQ2ggPSAob3JkZXIgKyAxKSAqIChvcmRlciArIDEpO1xuICAgICAgICB0aGlzLmF6aW0gPSAwO1xuICAgICAgICB0aGlzLmVsZXYgPSAwO1xuICAgICAgICB0aGlzLmdhaW5zID0gbmV3IEFycmF5KHRoaXMubkNoKTtcbiAgICAgICAgdGhpcy5nYWluTm9kZXMgPSBuZXcgQXJyYXkodGhpcy5uQ2gpO1xuICAgICAgICB0aGlzLmluID0gdGhpcy5jdHguY3JlYXRlR2FpbigpO1xuICAgICAgICB0aGlzLmluLmNoYW5uZWxDb3VudE1vZGUgPSAnZXhwbGljaXQnO1xuICAgICAgICB0aGlzLmluLmNoYW5uZWxDb3VudCA9IDE7XG4gICAgICAgIHRoaXMub3V0ID0gdGhpcy5jdHguY3JlYXRlQ2hhbm5lbE1lcmdlcih0aGlzLm5DaCk7XG4gICAgICAgIC8vIEluaXRpYWxpemUgZW5jb2RpbmcgZ2FpbnNcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm5DaDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmdhaW5Ob2Rlc1tpXSA9IHRoaXMuY3R4LmNyZWF0ZUdhaW4oKTtcbiAgICAgICAgICAgIHRoaXMuZ2Fpbk5vZGVzW2ldLmNoYW5uZWxDb3VudE1vZGUgPSAnZXhwbGljaXQnO1xuICAgICAgICAgICAgdGhpcy5nYWluTm9kZXNbaV0uY2hhbm5lbENvdW50ID0gMTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVwZGF0ZUdhaW5zKCk7XG4gICAgICAgIC8vIE1ha2UgYXVkaW8gY29ubmVjdGlvbnNcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm5DaDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmluLmNvbm5lY3QodGhpcy5nYWluTm9kZXNbaV0pO1xuICAgICAgICAgICAgdGhpcy5nYWluTm9kZXNbaV0uY29ubmVjdCh0aGlzLm91dCwgMCwgaSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB1cGRhdGVHYWlucygpIHtcbiAgICAgICAgdmFyIE4gPSB0aGlzLm9yZGVyO1xuICAgICAgICB2YXIgZ19lbmMgPSBqc2hsaWIuY29tcHV0ZVJlYWxTSChOLCBbXG4gICAgICAgICAgICBbdGhpcy5hemltICogTWF0aC5QSSAvIDE4MCwgdGhpcy5lbGV2ICogTWF0aC5QSSAvIDE4MF1cbiAgICAgICAgXSk7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm5DaDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmdhaW5zW2ldID0gZ19lbmNbaV1bMF07XG4gICAgICAgICAgICB0aGlzLmdhaW5Ob2Rlc1tpXS5nYWluLnZhbHVlID0gdGhpcy5nYWluc1tpXTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyAgQXJjaG9udGlzIFBvbGl0aXNcbi8vICBhcmNob250aXMucG9saXRpc0BhYWx0by5maVxuLy8gIERhdmlkIFBvaXJpZXItUXVpbm90XG4vLyAgZGF2aXBvaXJAaXJjYW0uZnJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vL1xuLy8gIEpTQW1iaXNvbmljcyBhIEphdmFTY3JpcHQgbGlicmFyeSBmb3IgaGlnaGVyLW9yZGVyIEFtYmlzb25pY3Ncbi8vICBUaGUgbGlicmFyeSBpbXBsZW1lbnRzIFdlYiBBdWRpbyBibG9ja3MgdGhhdCBwZXJmb3JtXG4vLyAgdHlwaWNhbCBhbWJpc29uaWMgcHJvY2Vzc2luZyBvcGVyYXRpb25zIG9uIGF1ZGlvIHNpZ25hbHMuXG4vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8qIEhPQSBPUkRFUiBMSU1JVEVSICovXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBvcmRlckxpbWl0ZXIge1xuXG4gICAgY29uc3RydWN0b3IoYXVkaW9DdHgsIG9yZGVySW4sIG9yZGVyT3V0KSB7XG5cbiAgICAgICAgdGhpcy5jdHggPSBhdWRpb0N0eDtcbiAgICAgICAgdGhpcy5vcmRlckluID0gb3JkZXJJbjtcbiAgICAgICAgaWYgKG9yZGVyT3V0IDwgb3JkZXJJbikgdGhpcy5vcmRlck91dCA9IG9yZGVyT3V0O1xuICAgICAgICBlbHNlIHRoaXMub3JkZXJPdXQgPSBvcmRlckluO1xuXG4gICAgICAgIHRoaXMubkNoSW4gPSAodGhpcy5vcmRlckluICsgMSkgKiAodGhpcy5vcmRlckluICsgMSk7XG4gICAgICAgIHRoaXMubkNoT3V0ID0gKHRoaXMub3JkZXJPdXQgKyAxKSAqICh0aGlzLm9yZGVyT3V0ICsgMSk7XG4gICAgICAgIHRoaXMuaW4gPSB0aGlzLmN0eC5jcmVhdGVDaGFubmVsU3BsaXR0ZXIodGhpcy5uQ2hJbik7XG4gICAgICAgIHRoaXMub3V0ID0gdGhpcy5jdHguY3JlYXRlQ2hhbm5lbE1lcmdlcih0aGlzLm5DaE91dCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5DaE91dDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmluLmNvbm5lY3QodGhpcy5vdXQsIGksIGkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXBkYXRlT3JkZXIob3JkZXJPdXQpIHtcblxuICAgICAgICBpZiAob3JkZXJPdXQgPD0gdGhpcy5vcmRlckluKSB7XG4gICAgICAgICAgICB0aGlzLm9yZGVyT3V0ID0gb3JkZXJPdXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5uQ2hPdXQgPSAodGhpcy5vcmRlck91dCArIDEpICogKHRoaXMub3JkZXJPdXQgKyAxKTtcbiAgICAgICAgdGhpcy5vdXQuZGlzY29ubmVjdCgpO1xuICAgICAgICB0aGlzLm91dCA9IHRoaXMuY3R4LmNyZWF0ZUNoYW5uZWxNZXJnZXIodGhpcy5uQ2hPdXQpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uQ2hPdXQ7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5pbi5jb25uZWN0KHRoaXMub3V0LCBpLCBpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyAgQXJjaG9udGlzIFBvbGl0aXNcbi8vICBhcmNob250aXMucG9saXRpc0BhYWx0by5maVxuLy8gIERhdmlkIFBvaXJpZXItUXVpbm90XG4vLyAgZGF2aXBvaXJAaXJjYW0uZnJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vL1xuLy8gIEpTQW1iaXNvbmljcyBhIEphdmFTY3JpcHQgbGlicmFyeSBmb3IgaGlnaGVyLW9yZGVyIEFtYmlzb25pY3Ncbi8vICBUaGUgbGlicmFyeSBpbXBsZW1lbnRzIFdlYiBBdWRpbyBibG9ja3MgdGhhdCBwZXJmb3JtXG4vLyAgdHlwaWNhbCBhbWJpc29uaWMgcHJvY2Vzc2luZyBvcGVyYXRpb25zIG9uIGF1ZGlvIHNpZ25hbHMuXG4vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLyogSE9BIE9SREVSIFdFSUdIVElORyAqL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG5pbXBvcnQgKiBhcyBqc2hsaWIgZnJvbSAnc3BoZXJpY2FsLWhhcm1vbmljLXRyYW5zZm9ybSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIG9yZGVyV2VpZ2h0IHtcblxuICAgIGNvbnN0cnVjdG9yKGF1ZGlvQ3R4LCBvcmRlcikge1xuXG4gICAgICAgIHRoaXMuY3R4ID0gYXVkaW9DdHg7XG4gICAgICAgIHRoaXMub3JkZXIgPSBvcmRlcjtcbiAgICAgICAgXG4gICAgICAgIHRoaXMubkNoID0gKHRoaXMub3JkZXIgKyAxKSAqICh0aGlzLm9yZGVyICsgMSk7XG4gICAgICAgIHRoaXMuaW4gPSB0aGlzLmN0eC5jcmVhdGVDaGFubmVsU3BsaXR0ZXIodGhpcy5uQ2gpO1xuICAgICAgICB0aGlzLm91dCA9IHRoaXMuY3R4LmNyZWF0ZUNoYW5uZWxNZXJnZXIodGhpcy5uQ2gpO1xuICAgICAgICBcbiAgICAgICAgdGhpcy5nYWlucyA9IG5ldyBBcnJheSh0aGlzLm5DaCk7XG4gICAgICAgIHRoaXMub3JkZXJHYWlucyA9IG5ldyBBcnJheSh0aGlzLm9yZGVyKzEpXG4gICAgICAgIHRoaXMub3JkZXJHYWlucy5maWxsKDEpO1xuXG4gICAgICAgIC8vIGluaXRpYWxpemUgZ2FpbnMgYW5kIGNvbm5lY3Rpb25zXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5uQ2g7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5nYWluc1tpXSA9IHRoaXMuY3R4LmNyZWF0ZUdhaW4oKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5pbi5jb25uZWN0KHRoaXMuZ2FpbnNbaV0sIGksIDApO1xuICAgICAgICAgICAgdGhpcy5nYWluc1tpXS5jb25uZWN0KHRoaXMub3V0LDAsaSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVPcmRlckdhaW5zKCkge1xuXG4gICAgICAgIHZhciBuO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubkNoOyBpKyspIHtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbiA9IE1hdGguZmxvb3IoTWF0aC5zcXJ0KGkpKTtcbiAgICAgICAgICAgIHRoaXMuZ2FpbnNbaV0uZ2Fpbi52YWx1ZSA9IHRoaXMub3JkZXJHYWluc1tuXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBjb21wdXRlTWF4UkVDb2VmZnMoKSB7XG4gICAgICAgIFxuICAgICAgICB2YXIgTiA9IHRoaXMub3JkZXI7XG4gICAgICAgIHRoaXMub3JkZXJHYWluc1swXSA9IDE7XG4gICAgICAgIHZhciBsZWdfbl9taW51czEgPSAwO1xuICAgICAgICB2YXIgbGVnX25fbWludXMyID0gMDtcbiAgICAgICAgdmFyIGxlZ19uID0gMDtcbiAgICAgICAgZm9yICh2YXIgbiA9IDE7IG4gPD0gTjsgbisrKSB7XG4gICAgICAgICAgICBsZWdfbiA9IGpzaGxpYi5yZWN1cnNlTGVnZW5kcmVQb2x5KG4sIFtNYXRoLmNvcygyLjQwNjgwOSAvIChOICsgMS41MSkpXSwgbGVnX25fbWludXMxLCBsZWdfbl9taW51czIpO1xuICAgICAgICAgICAgdGhpcy5vcmRlckdhaW5zW25dID0gbGVnX25bMF1bMF07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxlZ19uX21pbnVzMiA9IGxlZ19uX21pbnVzMTtcbiAgICAgICAgICAgIGxlZ19uX21pbnVzMSA9IGxlZ19uO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vICBBcmNob250aXMgUG9saXRpc1xuLy8gIGFyY2hvbnRpcy5wb2xpdGlzQGFhbHRvLmZpXG4vLyAgRGF2aWQgUG9pcmllci1RdWlub3Rcbi8vICBkYXZpcG9pckBpcmNhbS5mclxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vXG4vLyAgSlNBbWJpc29uaWNzIGEgSmF2YVNjcmlwdCBsaWJyYXJ5IGZvciBoaWdoZXItb3JkZXIgQW1iaXNvbmljc1xuLy8gIFRoZSBsaWJyYXJ5IGltcGxlbWVudHMgV2ViIEF1ZGlvIGJsb2NrcyB0aGF0IHBlcmZvcm1cbi8vICB0eXBpY2FsIGFtYmlzb25pYyBwcm9jZXNzaW5nIG9wZXJhdGlvbnMgb24gYXVkaW8gc2lnbmFscy5cbi8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8qIEhPQSBQT1dFUk1BUCBBTkFMWVpFUiAqL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8vLy8vLyBOT1QgQ09NUExFVEVEIFlFVCAhISEgLy8vLy8vL1xuXG4vLyBmb3IgU2FmYXJpIHN1cHBvcnQgd2hlcmUgYXVkaW9Db250ZXh0LkFuYWx5c2VyLmdldEZsb2F0VGltZURvbWFpbkRhdGEgaXMgbm90IGRlZmluZWQgZm9yIG5vd1xuaW1wb3J0ICdnZXQtZmxvYXQtdGltZS1kb21haW4tZGF0YSc7XG5cbmltcG9ydCAqIGFzIG51bWVyaWMgZnJvbSAnbnVtZXJpYyc7XG5pbXBvcnQgKiBhcyBqc2hsaWIgZnJvbSAnc3BoZXJpY2FsLWhhcm1vbmljLXRyYW5zZm9ybSc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMuanMnKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgcG93ZXJtYXBBbmFseXNlciB7XG4gICAgY29uc3RydWN0b3IoYXVkaW9DdHgsIG9yZGVyLCBtb2RlKSB7XG5cbiAgICAgICAgdGhpcy5jdHggPSBhdWRpb0N0eDtcbiAgICAgICAgdGhpcy5vcmRlciA9IG9yZGVyO1xuICAgICAgICB0aGlzLm5DaCA9IChvcmRlciArIDEpICogKG9yZGVyICsgMSk7XG4gICAgICAgIHRoaXMuZmZ0U2l6ZSA9IDIwNDg7XG4gICAgICAgIHRoaXMuYW5hbHlzZXJzID0gbmV3IEFycmF5KHRoaXMubkNoKTtcbiAgICAgICAgdGhpcy5hbmFsQnVmZmVycyA9IG5ldyBBcnJheSh0aGlzLm5DaCk7XG4gICAgICAgIC8vIElucHV0IGFuZCBvdXRwdXQgbm9kZXNcbiAgICAgICAgdGhpcy5pbiA9IHRoaXMuY3R4LmNyZWF0ZUNoYW5uZWxTcGxpdHRlcih0aGlzLm5DaCk7XG4gICAgICAgIHRoaXMub3V0ID0gdGhpcy5jdHguY3JlYXRlQ2hhbm5lbE1lcmdlcih0aGlzLm5DaCk7XG4gICAgICAgIC8vIEluaXRpYWxpemUgYW5hbHl6ZXIgYnVmZmVyc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubkNoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuYW5hbHlzZXJzW2ldID0gdGhpcy5jdHguY3JlYXRlQW5hbHlzZXIoKTtcbiAgICAgICAgICAgIHRoaXMuYW5hbHlzZXJzW2ldLmZmdFNpemUgPSB0aGlzLmZmdFNpemU7XG4gICAgICAgICAgICB0aGlzLmFuYWx5c2Vyc1tpXS5zbW9vdGhpbmdUaW1lQ29uc3RhbnQgPSAwO1xuICAgICAgICAgICAgdGhpcy5hbmFsQnVmZmVyc1tpXSA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5mZnRTaXplKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDcmVhdGUgY29ubmVjdGlvbnNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5DaDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmluLmNvbm5lY3QodGhpcy5vdXQsIGksIGkpO1xuICAgICAgICAgICAgdGhpcy5pbi5jb25uZWN0KHRoaXMuYW5hbHlzZXJzW2ldLCBpLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gSW5pdGlhbGlzZSB0LURlc2lnbiBmb3IgcG93ZXIgbWFwXG4gICAgICAgIHZhciB0ZF9kaXJzX2RlZyA9IHV0aWxzLmdldFRkZXNpZ24oNCAqIG9yZGVyKTtcbiAgICAgICAgdGhpcy50ZF9kaXJzX3JhZCA9IHV0aWxzLmRlZzJyYWQodGRfZGlyc19kZWcpO1xuICAgICAgICAvLyBTSCBzYW1wbGluZyBtYXRyaXhcbiAgICAgICAgdGhpcy5TSG10eCA9IGpzaGxpYi5jb21wdXRlUmVhbFNIKHRoaXMub3JkZXIsIHRoaXMudGRfZGlyc19yYWQpO1xuICAgICAgICB0aGlzLm1vZGUgPSBtb2RlO1xuLy8gICAgICAgIHRoaXMubkNvZWZmcyA9ICgyKnRoaXMub3JkZXIrMSkqKDIqdGhpcy5vcmRlcisxKVxuLy8gICAgICAgIHRoaXMucG93ZXJDb2VmZnMgPSBuZXcgQXJyYXkoIHRoaXMubkNvZWZmcyApO1xuLy8gICAgICAgIHRoaXMucG93ZXJDb2VmZnMuZmlsbCgwKTtcbi8vICAgICAgICAvLyBTbW9vdGhpbmcgY29lZmZpY2llbnRcbi8vICAgICAgICB0aGlzLnNtb290aENvZWZmID0gMC41O1xuICAgIH1cblxuICAgIHVwZGF0ZUJ1ZmZlcnMoKSB7XG4gICAgICAgIC8vIEdldCBsYXRlc3QgdGltZS1kb21haW4gZGF0YVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubkNoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuYW5hbHlzZXJzW2ldLmdldEZsb2F0VGltZURvbWFpbkRhdGEodGhpcy5hbmFsQnVmZmVyc1tpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgY29tcHV0ZVBvd2VybWFwKCkge1xuICAgICAgICBcbiAgICAgICAgdmFyIG5EaXJzID0gdGhpcy50ZF9kaXJzX3JhZC5sZW5ndGg7XG4gICAgICAgIC8vIHJlY29uc3RydWN0aW9uXG4gICAgICAgIHZhciBkYXRhID0gbnVtZXJpYy5kb3QobnVtZXJpYy50cmFuc3Bvc2UodGhpcy5TSG10eCksIHRoaXMuYW5hbEJ1ZmZlcnMpO1xuICAgICAgICAvLyBjb21wdXRlIGRpcmVjdGlvbmFsIHBvd2VyXG4gICAgICAgIHZhciBwb3dlclZhbHVlcyA9IG5ldyBBcnJheShuRGlycyk7XG4gICAgICAgIC8vIEFjY3VtdWxhdG9ycyBmb3IgZW5lcmdpZXNcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuRGlyczsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHRoaXMuZmZ0U2l6ZTsgbisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRtcF9wd3IgPSAwO1xuICAgICAgICAgICAgICAgIHRtcF9wd3IgPSB0bXBfcHdyICsgZGF0YVtpXVtuXSAqIGRhdGFbaV1bbl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgdG1wX3B3ciA9IHRtcF9wd3IvdGhpcy5mZnRTaXplO1xuICAgICAgICAgICAgcG93ZXJWYWx1ZXNbaV0gPSBbIHRoaXMudGRfZGlyc19yYWRbaV1bMF0sIHRoaXMudGRfZGlyc19yYWRbaV1bMV0gLCB0bXBfcHdyIF07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmICh0aGlzLm1vZGUgPT0gMCkgcmV0dXJuIHBvd2VyVmFsdWVzO1xuICAgICAgICBlbHNlIGlmICh0aGlzLm1vZGUgPT0gMSkge1xuICAgICAgICAgICAgLy8gUmUtZW5jb2RlIGRpcmVjdGlvbmFsIGVuZXJneSB0byBTSCBjb2VmZmljaWVudHNcbiAgICAgICAgICAgIHZhciBwb3dlckNvZWZmcyA9IGpzaGxpYi5mb3J3YXJkU0hUKDIqdGhpcy5vcmRlciwgcG93ZXJWYWx1ZXMpO1xuICAgICAgICAgICAgcmV0dXJuIHBvd2VyQ29lZmZzO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyAgICAgICAgLy8gU21vb3RoIGNvZWZmaWNpZW50c1xuLy8gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5uQ29lZmZzOyBpKyspIHRoaXMucG93ZXJDb2VmZnNbaV0gPSB0aGlzLnNtb290aENvZWZmKnRoaXMucG93ZXJDb2VmZnNbaV0gKyAoMS10aGlzLnNtb290aENvZWZmKSpwb3dlckNvZWZmc1tpXTtcbi8vICAgICAgICBcbi8vICAgICAgICByZXR1cm4gdGhpcy5wb3dlckNvZWZmcztcbiAgICB9XG5cbn1cbiIsIi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyAgQXJjaG9udGlzIFBvbGl0aXNcbi8vICBhcmNob250aXMucG9saXRpc0BhYWx0by5maVxuLy8gIERhdmlkIFBvaXJpZXItUXVpbm90XG4vLyAgZGF2aXBvaXJAaXJjYW0uZnJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vL1xuLy8gIEpTQW1iaXNvbmljcyBhIEphdmFTY3JpcHQgbGlicmFyeSBmb3IgaGlnaGVyLW9yZGVyIEFtYmlzb25pY3Ncbi8vICBUaGUgbGlicmFyeSBpbXBsZW1lbnRzIFdlYiBBdWRpbyBibG9ja3MgdGhhdCBwZXJmb3JtXG4vLyAgdHlwaWNhbCBhbWJpc29uaWMgcHJvY2Vzc2luZyBvcGVyYXRpb25zIG9uIGF1ZGlvIHNpZ25hbHMuXG4vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vKiBSTVMgQU1QTElUVURFIEFOQUxZWkVSICovXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLy8gZm9yIFNhZmFyaSBzdXBwb3J0IHdoZXJlIGF1ZGlvQ29udGV4dC5BbmFseXNlci5nZXRGbG9hdFRpbWVEb21haW5EYXRhIGlzIG5vdCBkZWZpbmVkIGZvciBub3dcbmltcG9ydCAnZ2V0LWZsb2F0LXRpbWUtZG9tYWluLWRhdGEnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBybXNBbmFseXNlciB7XG4gICAgY29uc3RydWN0b3IoYXVkaW9DdHgsIG9yZGVyKSB7XG5cbiAgICAgICAgdGhpcy5jdHggPSBhdWRpb0N0eDtcbiAgICAgICAgdGhpcy5vcmRlciA9IG9yZGVyO1xuICAgICAgICB0aGlzLm5DaCA9IChvcmRlciArIDEpICogKG9yZGVyICsgMSk7XG4gICAgICAgIHRoaXMuZmZ0U2l6ZSA9IDIwNDg7XG4gICAgICAgIC8vIElucHV0IGFuZCBvdXRwdXQgbm9kZXNcbiAgICAgICAgdGhpcy5pbiA9IHRoaXMuY3R4LmNyZWF0ZUNoYW5uZWxTcGxpdHRlcih0aGlzLm5DaCk7XG4gICAgICAgIHRoaXMub3V0ID0gdGhpcy5jdHguY3JlYXRlQ2hhbm5lbE1lcmdlcih0aGlzLm5DaCk7XG4gICAgICAgIC8vIEluaXRpYWxpemUgYW5hbHl6ZXIgYnVmZmVyc1xuICAgICAgICB0aGlzLmFuYWx5c2VycyA9IG5ldyBBcnJheSh0aGlzLm5DaCk7XG4gICAgICAgIHRoaXMuYW5hbEJ1ZmZlcnMgPSBuZXcgQXJyYXkodGhpcy5uQ2gpO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubkNoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuYW5hbHlzZXJzW2ldID0gdGhpcy5jdHguY3JlYXRlQW5hbHlzZXIoKTtcbiAgICAgICAgICAgIHRoaXMuYW5hbHlzZXJzW2ldLmZmdFNpemUgPSB0aGlzLmZmdFNpemU7XG4gICAgICAgICAgICB0aGlzLmFuYWx5c2Vyc1tpXS5zbW9vdGhpbmdUaW1lQ29uc3RhbnQgPSAwO1xuICAgICAgICAgICAgdGhpcy5hbmFsQnVmZmVyc1tpXSA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5mZnRTaXplKTtcbiAgICAgICAgICAgIC8vIENyZWF0ZSBjb25uZWN0aW9uc1xuICAgICAgICAgICAgdGhpcy5pbi5jb25uZWN0KHRoaXMuYW5hbHlzZXJzW2ldLCBpLCAwKTtcbiAgICAgICAgICAgIHRoaXMuYW5hbHlzZXJzW2ldLmNvbm5lY3QodGhpcy5vdXQsIDAsIGkpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICB1cGRhdGVCdWZmZXJzKCkge1xuICAgICAgICAvLyBHZXQgbGF0ZXN0IHRpbWUtZG9tYWluIGRhdGFcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5DaDsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmFuYWx5c2Vyc1tpXS5nZXRGbG9hdFRpbWVEb21haW5EYXRhKHRoaXMuYW5hbEJ1ZmZlcnNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29tcHV0ZVJNUygpIHtcbiAgICAgICAgXG4gICAgICAgIHZhciBybXNfdmFsdWVzID0gbmV3IEFycmF5KHRoaXMubkNoKTtcbiAgICAgICAgcm1zX3ZhbHVlcy5maWxsKDApO1xuICAgICAgICAvLyBBY2N1bXVsYXRvcnMgZm9yIGVuZXJnaWVzXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5uQ2g7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCB0aGlzLmZmdFNpemU7IG4rKykge1xuICAgICAgICAgICAgICAgIHJtc192YWx1ZXNbaV0gPSBybXNfdmFsdWVzW2ldICsgdGhpcy5hbmFsQnVmZmVyc1tpXVtuXSAqIHRoaXMuYW5hbEJ1ZmZlcnNbaV1bbl07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBybXNfdmFsdWVzW2ldID0gTWF0aC5zcXJ0KCBybXNfdmFsdWVzW2ldL3RoaXMuZmZ0U2l6ZSApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBybXNfdmFsdWVzO1xuICAgIH1cbn1cbiIsIi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyAgQXJjaG9udGlzIFBvbGl0aXNcbi8vICBhcmNob250aXMucG9saXRpc0BhYWx0by5maVxuLy8gIERhdmlkIFBvaXJpZXItUXVpbm90XG4vLyAgZGF2aXBvaXJAaXJjYW0uZnJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vL1xuLy8gIEpTQW1iaXNvbmljcyBhIEphdmFTY3JpcHQgbGlicmFyeSBmb3IgaGlnaGVyLW9yZGVyIEFtYmlzb25pY3Ncbi8vICBUaGUgbGlicmFyeSBpbXBsZW1lbnRzIFdlYiBBdWRpbyBibG9ja3MgdGhhdCBwZXJmb3JtXG4vLyAgdHlwaWNhbCBhbWJpc29uaWMgcHJvY2Vzc2luZyBvcGVyYXRpb25zIG9uIGF1ZGlvIHNpZ25hbHMuXG4vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLy8vLy8vLy8vLy8vLy8vLy9cbi8qIEhPQSBNSVJST1IgKi9cbi8vLy8vLy8vLy8vLy8vLy8vXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIHNjZW5lTWlycm9yIHtcblxuICAgIGNvbnN0cnVjdG9yKGF1ZGlvQ3R4LCBvcmRlcikge1xuXG4gICAgICAgIHRoaXMuY3R4ID0gYXVkaW9DdHg7XG4gICAgICAgIHRoaXMub3JkZXIgPSBvcmRlcjtcbiAgICAgICAgdGhpcy5uQ2ggPSAob3JkZXIgKyAxKSAqIChvcmRlciArIDEpO1xuICAgICAgICB0aGlzLm1pcnJvclBsYW5lID0gMDtcbiAgICAgICAgLy8gSW5wdXQgYW5kIG91dHB1dCBub2Rlc1xuICAgICAgICB0aGlzLmluID0gdGhpcy5jdHguY3JlYXRlQ2hhbm5lbFNwbGl0dGVyKHRoaXMubkNoKTtcbiAgICAgICAgdGhpcy5vdXQgPSB0aGlzLmN0eC5jcmVhdGVDaGFubmVsTWVyZ2VyKHRoaXMubkNoKTtcbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBtaXJyb3JpbmcgZ2FpbnMgdG8gdW5pdHkgKG5vIHJlZmxlY3Rpb24pIGFuZCBjb25uZWN0XG4gICAgICAgIHRoaXMuZ2FpbnMgPSBuZXcgQXJyYXkodGhpcy5uQ2gpO1xuICAgICAgICBmb3IgKHZhciBxID0gMDsgcSA8IHRoaXMubkNoOyBxKyspIHtcbiAgICAgICAgICAgIHRoaXMuZ2FpbnNbcV0gPSB0aGlzLmN0eC5jcmVhdGVHYWluKCk7XG4gICAgICAgICAgICB0aGlzLmdhaW5zW3FdLmdhaW4udmFsdWUgPSAxO1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGNvbm5lY3Rpb25zXG4gICAgICAgICAgICB0aGlzLmluLmNvbm5lY3QodGhpcy5nYWluc1txXSwgcSwgMCk7XG4gICAgICAgICAgICB0aGlzLmdhaW5zW3FdLmNvbm5lY3QodGhpcy5vdXQsIDAsIHEpO1xuICAgICAgICB9XG5cbiAgICB9XG4gICAgXG4gICAgcmVzZXQoKSB7XG4gICAgICAgIFxuICAgICAgICBmb3IgKHZhciBxID0gMDsgcSA8IHRoaXMubkNoOyBxKyspIHtcbiAgICAgICAgICAgIHRoaXMuZ2FpbnNbcV0uZ2Fpbi52YWx1ZSA9IDE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBtaXJyb3IocGxhbmVObykge1xuICAgICAgICBcbiAgICAgICAgc3dpdGNoKHBsYW5lTm8pIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICB0aGlzLm1pcnJvclBsYW5lID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgLy8gbWlycm9yaW5nIG9uIHl6LXBsYW5lIChmcm9udC1iYWNrKVxuICAgICAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1pcnJvclBsYW5lID0gMTtcbiAgICAgICAgICAgICAgICB2YXIgcTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8PSB0aGlzLm9yZGVyOyBuKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbSA9IC1uOyBtIDw9IG47IG0rKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcSA9IG4qbituK207XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG08MCAmJiBtJTI9PTApfHwobT4wICYmIG0lMj09MSkpIHRoaXMuZ2FpbnNbcV0uZ2Fpbi52YWx1ZSA9IC0xO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgIC8vIG1pcnJvcmluZyBvbiB4ei1wbGFuZSAobGVmdC1yaWdodClcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5taXJyb3JQbGFuZSA9IDI7XG4gICAgICAgICAgICAgICAgdmFyIHE7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPD0gdGhpcy5vcmRlcjsgbisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIG0gPSAtbjsgbSA8PSBuOyBtKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHEgPSBuKm4rbittO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG08MCkgdGhpcy5nYWluc1txXS5nYWluLnZhbHVlID0gLTE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgLy8gbWlycm9yaW5nIG9uIHh5LXBsYW5lICh1cC1kb3duKVxuICAgICAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1pcnJvclBsYW5lID0gMztcbiAgICAgICAgICAgICAgICB2YXIgcTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8PSB0aGlzLm9yZGVyOyBuKyspIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgbSA9IC1uOyBtIDw9IG47IG0rKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcSA9IG4qbituK207XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG0rbiklMj09MSkgdGhpcy5nYWluc1txXS5nYWluLnZhbHVlID0gLTE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGhlIG1pcnJvcmluZyBwbGFuZXMgY2FuIGJlIGVpdGhlciAxICh5eiksIDIgKHh6KSwgMyAoeHkpLCBvciAwIChubyBtaXJyb3JpbmcpLiBWYWx1ZSBzZXQgdG8gMC5cIilcbiAgICAgICAgICAgICAgICB0aGlzLm1pcnJvclBsYW5lID0gMDtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIH1cbiAgICAgICAgXG5cbiAgICB9XG5cbn1cbiIsIi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyAgQXJjaG9udGlzIFBvbGl0aXNcbi8vICBhcmNob250aXMucG9saXRpc0BhYWx0by5maVxuLy8gIERhdmlkIFBvaXJpZXItUXVpbm90XG4vLyAgZGF2aXBvaXJAaXJjYW0uZnJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vL1xuLy8gIEpTQW1iaXNvbmljcyBhIEphdmFTY3JpcHQgbGlicmFyeSBmb3IgaGlnaGVyLW9yZGVyIEFtYmlzb25pY3Ncbi8vICBUaGUgbGlicmFyeSBpbXBsZW1lbnRzIFdlYiBBdWRpbyBibG9ja3MgdGhhdCBwZXJmb3JtXG4vLyAgdHlwaWNhbCBhbWJpc29uaWMgcHJvY2Vzc2luZyBvcGVyYXRpb25zIG9uIGF1ZGlvIHNpZ25hbHMuXG4vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLy8vLy8vLy8vLy8vLy8vLy9cbi8qIEhPQSBST1RBVE9SICovXG4vLy8vLy8vLy8vLy8vLy8vL1xuXG5pbXBvcnQgKiBhcyBqc2hsaWIgZnJvbSAnc3BoZXJpY2FsLWhhcm1vbmljLXRyYW5zZm9ybSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIHNjZW5lUm90YXRvciB7XG5cbiAgICBjb25zdHJ1Y3RvcihhdWRpb0N0eCwgb3JkZXIpIHtcblxuICAgICAgICB0aGlzLmN0eCA9IGF1ZGlvQ3R4O1xuICAgICAgICB0aGlzLm9yZGVyID0gb3JkZXI7XG4gICAgICAgIHRoaXMubkNoID0gKG9yZGVyICsgMSkgKiAob3JkZXIgKyAxKTtcbiAgICAgICAgdGhpcy55YXcgPSAwO1xuICAgICAgICB0aGlzLnBpdGNoID0gMDtcbiAgICAgICAgdGhpcy5yb2xsID0gMDtcbiAgICAgICAgdGhpcy5yb3RNdHggPSBudW1lcmljLmlkZW50aXR5KHRoaXMubkNoKTtcbiAgICAgICAgdGhpcy5yb3RNdHhOb2RlcyA9IG5ldyBBcnJheSh0aGlzLm9yZGVyKTtcbiAgICAgICAgLy8gSW5wdXQgYW5kIG91dHB1dCBub2Rlc1xuICAgICAgICB0aGlzLmluID0gdGhpcy5jdHguY3JlYXRlQ2hhbm5lbFNwbGl0dGVyKHRoaXMubkNoKTtcbiAgICAgICAgdGhpcy5vdXQgPSB0aGlzLmN0eC5jcmVhdGVDaGFubmVsTWVyZ2VyKHRoaXMubkNoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEluaXRpYWxpemUgcm90YXRpb24gZ2FpbnMgdG8gaWRlbnRpdHkgbWF0cml4XG4gICAgICAgIGZvciAodmFyIG4gPSAxOyBuIDw9IHRoaXMub3JkZXI7IG4rKykge1xuICAgICAgICAgICAgXG4gICAgICAgICAgICB2YXIgZ2FpbnNfbiA9IG5ldyBBcnJheSgyICogbiArIDEpO1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyICogbiArIDE7IGkrKykge1xuICAgICAgICAgICAgICAgIGdhaW5zX25baV0gPSBuZXcgQXJyYXkoMiAqIG4gKyAxKTtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDIgKiBuICsgMTsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGdhaW5zX25baV1bal0gPSB0aGlzLmN0eC5jcmVhdGVHYWluKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09IGopIGdhaW5zX25baV1bal0uZ2Fpbi52YWx1ZSA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgZ2FpbnNfbltpXVtqXS5nYWluLnZhbHVlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJvdE10eE5vZGVzW24gLSAxXSA9IGdhaW5zX247XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIENyZWF0ZSBjb25uZWN0aW9uc1xuICAgICAgICB0aGlzLmluLmNvbm5lY3QodGhpcy5vdXQsIDAsIDApOyAvLyB6ZXJvdGggb3JkZXIgY2guIGRvZXMgbm90IHJvdGF0ZVxuICAgICAgICBcbiAgICAgICAgdmFyIGJhbmRfaWR4ID0gMTtcbiAgICAgICAgZm9yIChuID0gMTsgbiA8PSB0aGlzLm9yZGVyOyBuKyspIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyICogbiArIDE7IGkrKykge1xuICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCAyICogbiArIDE7IGorKykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluLmNvbm5lY3QodGhpcy5yb3RNdHhOb2Rlc1tuIC0gMV1baV1bal0sIGJhbmRfaWR4ICsgaiwgMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm90TXR4Tm9kZXNbbiAtIDFdW2ldW2pdLmNvbm5lY3QodGhpcy5vdXQsIDAsIGJhbmRfaWR4ICsgaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmFuZF9pZHggPSBiYW5kX2lkeCArIDIgKiBuICsgMTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVJvdE10eCgpIHtcblxuICAgICAgICB2YXIgeWF3ID0gdGhpcy55YXcgKiBNYXRoLlBJIC8gMTgwO1xuICAgICAgICB2YXIgcGl0Y2ggPSB0aGlzLnBpdGNoICogTWF0aC5QSSAvIDE4MDtcbiAgICAgICAgdmFyIHJvbGwgPSB0aGlzLnJvbGwgKiBNYXRoLlBJIC8gMTgwO1xuXG4gICAgICAgIHRoaXMucm90TXR4ID0ganNobGliLmdldFNIcm90TXR4KGpzaGxpYi55YXdQaXRjaFJvbGwyUnp5eCh5YXcsIHBpdGNoLCByb2xsKSwgdGhpcy5vcmRlcik7XG5cbiAgICAgICAgdmFyIGJhbmRfaWR4ID0gMTtcbiAgICAgICAgZm9yIChsZXQgbiA9IDE7IG4gPCB0aGlzLm9yZGVyICsgMTsgbisrKSB7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMiAqIG4gKyAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDIgKiBuICsgMTsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucm90TXR4Tm9kZXNbbiAtIDFdW2ldW2pdLmdhaW4udmFsdWUgPSB0aGlzLnJvdE10eFtiYW5kX2lkeCArIGldW2JhbmRfaWR4ICsgal07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYmFuZF9pZHggPSBiYW5kX2lkeCArIDIgKiBuICsgMTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyAgQXJjaG9udGlzIFBvbGl0aXNcbi8vICBhcmNob250aXMucG9saXRpc0BhYWx0by5maVxuLy8gIERhdmlkIFBvaXJpZXItUXVpbm90XG4vLyAgZGF2aXBvaXJAaXJjYW0uZnJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vL1xuLy8gIEpTQW1iaXNvbmljcyBhIEphdmFTY3JpcHQgbGlicmFyeSBmb3IgaGlnaGVyLW9yZGVyIEFtYmlzb25pY3Ncbi8vICBUaGUgbGlicmFyeSBpbXBsZW1lbnRzIFdlYiBBdWRpbyBibG9ja3MgdGhhdCBwZXJmb3JtXG4vLyAgdHlwaWNhbCBhbWJpc29uaWMgcHJvY2Vzc2luZyBvcGVyYXRpb25zIG9uIGF1ZGlvIHNpZ25hbHMuXG4vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vKiBIT0EgVklSVFVBTCBNSUNST1BIT05FICovXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuaW1wb3J0ICogYXMganNobGliIGZyb20gJ3NwaGVyaWNhbC1oYXJtb25pYy10cmFuc2Zvcm0nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyB2aXJ0dWFsTWljIHtcblxuICAgIGNvbnN0cnVjdG9yKGF1ZGlvQ3R4LCBvcmRlcikge1xuXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmN0eCA9IGF1ZGlvQ3R4O1xuICAgICAgICB0aGlzLm9yZGVyID0gb3JkZXI7XG4gICAgICAgIHRoaXMubkNoID0gKG9yZGVyICsgMSkgKiAob3JkZXIgKyAxKTtcbiAgICAgICAgdGhpcy5hemltID0gMDtcbiAgICAgICAgdGhpcy5lbGV2ID0gMDtcbiAgICAgICAgdGhpcy52bWljR2FpbnMgPSBuZXcgQXJyYXkodGhpcy5uQ2gpO1xuICAgICAgICB0aGlzLnZtaWNHYWluTm9kZXMgPSBuZXcgQXJyYXkodGhpcy5uQ2gpO1xuICAgICAgICB0aGlzLnZtaWNDb2VmZnMgPSBuZXcgQXJyYXkodGhpcy5vcmRlciArIDEpO1xuICAgICAgICB0aGlzLnZtaWNQYXR0ZXJuID0gXCJoeXBlcmNhcmRpb2lkXCI7XG4gICAgICAgIHRoaXMuaW4gPSB0aGlzLmN0eC5jcmVhdGVDaGFubmVsU3BsaXR0ZXIodGhpcy5uQ2gpO1xuICAgICAgICB0aGlzLm91dCA9IHRoaXMuY3R4LmNyZWF0ZUdhaW4oKTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHZtaWMgdG8gZm9yd2FyZCBmYWNpbmcgaHlwZXJjYXJkaW9pZFxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubkNoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMudm1pY0dhaW5Ob2Rlc1tpXSA9IHRoaXMuY3R4LmNyZWF0ZUdhaW4oKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLlNIeHl6ID0gbmV3IEFycmF5KHRoaXMubkNoKTtcbiAgICAgICAgdGhpcy5TSHh5ei5maWxsKDApO1xuICAgICAgICB0aGlzLnVwZGF0ZVBhdHRlcm4oKTtcbiAgICAgICAgdGhpcy51cGRhdGVPcmllbnRhdGlvbigpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBjb25uZWN0aW9uc1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGhpcy5uQ2g7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5pbi5jb25uZWN0KHRoaXMudm1pY0dhaW5Ob2Rlc1tpXSwgaSwgMCk7XG4gICAgICAgICAgICB0aGlzLnZtaWNHYWluTm9kZXNbaV0uY29ubmVjdCh0aGlzLm91dCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9XG5cblxuICAgIHVwZGF0ZVBhdHRlcm4oKSB7XG5cbiAgICAgICAgZnVuY3Rpb24gY29tcHV0ZUNhcmRpb2lkQ29lZmZzKE4pIHtcbiAgICAgICAgICAgIHZhciBjb2VmZnMgPSBuZXcgQXJyYXkoTiArIDEpO1xuICAgICAgICAgICAgZm9yICh2YXIgbiA9IDA7IG4gPD0gTjsgbisrKSB7XG4gICAgICAgICAgICAgICAgY29lZmZzW25dID0ganNobGliLmZhY3RvcmlhbChOKSAqIGpzaGxpYi5mYWN0b3JpYWwoTikgLyAoanNobGliLmZhY3RvcmlhbChOICsgbiArIDEpICoganNobGliLmZhY3RvcmlhbChOIC0gbikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvZWZmcztcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNvbXB1dGVIeXBlcmNhcmRDb2VmZnMoTikge1xuICAgICAgICAgICAgdmFyIGNvZWZmcyA9IG5ldyBBcnJheShOICsgMSk7XG4gICAgICAgICAgICB2YXIgblNIID0gKE4rMSkqKE4rMSk7XG4gICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8PSBOOyBuKyspIHtcbiAgICAgICAgICAgICAgICBjb2VmZnNbbl0gPSAxIC8gblNIO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvZWZmcztcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNvbXB1dGVTdXBlcmNhcmRDb2VmZnMoTikge1xuICAgICAgICAgICAgc3dpdGNoIChOKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAxOlxuICAgICAgICAgICAgICAgICAgICB2YXIgY29lZmZzID0gWzAuMzY2MCwgMC4yMTEzXTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICB2YXIgY29lZmZzID0gWzAuMjM2MiwgMC4xNTYyLCAwLjA1OTBdO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgIHZhciBjb2VmZnMgPSBbMC4xNzY4LCAwLjEyODEsIDAuMDYzMywgMC4wMTc1XTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSA0OlxuICAgICAgICAgICAgICAgICAgICB2YXIgY29lZmZzID0gWzAuMTQxNCwgMC4xMDg3LCAwLjA2MjMsIDAuMDI0NywgMC4wMDU0XTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk9yZGVycyBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIG9mIDEtNCBhdCB0aGUgbW9tZW50LlwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvZWZmcztcbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNvbXB1dGVNYXhSRUNvZWZmcyhOKSB7XG4gICAgICAgICAgICB2YXIgY29lZmZzID0gbmV3IEFycmF5KE4gKyAxKTtcbiAgICAgICAgICAgIGNvZWZmc1swXSA9IDE7XG4gICAgICAgICAgICB2YXIgbGVnX25fbWludXMxID0gMDtcbiAgICAgICAgICAgIHZhciBsZWdfbl9taW51czIgPSAwO1xuICAgICAgICAgICAgdmFyIGxlZ19uID0gMDtcbiAgICAgICAgICAgIGZvciAodmFyIG4gPSAxOyBuIDwgTiArIDE7IG4rKykge1xuICAgICAgICAgICAgICAgIGxlZ19uID0ganNobGliLnJlY3Vyc2VMZWdlbmRyZVBvbHkobiwgW01hdGguY29zKDIuNDA2ODA5IC8gKE4gKyAxLjUxKSldLCBsZWdfbl9taW51czEsIGxlZ19uX21pbnVzMik7XG4gICAgICAgICAgICAgICAgY29lZmZzW25dID0gbGVnX25bMF1bMF07XG5cbiAgICAgICAgICAgICAgICBsZWdfbl9taW51czIgPSBsZWdfbl9taW51czE7XG4gICAgICAgICAgICAgICAgbGVnX25fbWludXMxID0gbGVnX247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb21wdXRlIG5vcm1hbGl6YXRpb24gZmFjdG9yXG4gICAgICAgICAgICB2YXIgbm9ybSA9IDA7XG4gICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8PSBOOyBuKyspIHtcbiAgICAgICAgICAgICAgICBub3JtICs9IGNvZWZmc1tuXSAqICgyKm4rMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKHZhciBuID0gMDsgbiA8PSBOOyBuKyspIHtcbiAgICAgICAgICAgICAgICBjb2VmZnNbbl0gPSBjb2VmZnNbbl0vbm9ybTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb2VmZnM7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHRoaXMudm1pY1BhdHRlcm4pIHtcbiAgICAgICAgICAgIGNhc2UgXCJjYXJkaW9pZFwiOlxuICAgICAgICAgICAgICAgIC8vIGhpZ2hlci1vcmRlciBjYXJkaW9pZCBnaXZlbiBieTogKDEvMileTiAqICggMStjb3ModGhldGEpICleTlxuICAgICAgICAgICAgICAgIHRoaXMudm1pY0NvZWZmcyA9IGNvbXB1dGVDYXJkaW9pZENvZWZmcyh0aGlzLm9yZGVyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJzdXBlcmNhcmRpb2lkXCI6XG4gICAgICAgICAgICAgICAgLy8gbWF4aW11bSBmcm9udC1iYWNrIGVuZXJneSByYXRpb1xuICAgICAgICAgICAgICAgIHRoaXMudm1pY0NvZWZmcyA9IGNvbXB1dGVTdXBlcmNhcmRDb2VmZnModGhpcy5vcmRlcik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFwiaHlwZXJjYXJkaW9pZFwiOlxuICAgICAgICAgICAgICAgIC8vIG1heGltdW0gZGlyZWN0aXZpdHkgZmFjdG9yXG4gICAgICAgICAgICAgICAgLy8gKHRoaXMgaXMgdGhlIGNsYXNzaWMgcGxhbmUvd2F2ZSBkZWNvbXBvc2l0aW9uIGJlYW1mb3JtZXIsXG4gICAgICAgICAgICAgICAgLy8gYWxzbyB0ZXJtZWQgXCJyZWd1bGFyXCIgaW4gc3BoZXJpY2FsIGJlYW1mb3JtaW5nIGxpdGVyYXR1cmUpXG4gICAgICAgICAgICAgICAgdGhpcy52bWljQ29lZmZzID0gY29tcHV0ZUh5cGVyY2FyZENvZWZmcyh0aGlzLm9yZGVyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJtYXhfckVcIjpcbiAgICAgICAgICAgICAgICAvLyBxdWl0ZSBzaW1pbGFyIHRvIG1heGltdW0gZnJvbnQtYmFjayByZWplY3Rpb25cbiAgICAgICAgICAgICAgICB0aGlzLnZtaWNDb2VmZnMgPSBjb21wdXRlTWF4UkVDb2VmZnModGhpcy5vcmRlcik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRoaXMudm1pY1BhdHRlcm4gPSBcImh5cGVyY2FyZGlvaWRcIjtcbiAgICAgICAgICAgICAgICB0aGlzLnZtaWNDb2VmZnMgPSBjb21wdXRlSHlwZXJjYXJkQ29lZmZzKHRoaXMub3JkZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVHYWlucygpO1xuICAgIH1cblxuICAgIHVwZGF0ZU9yaWVudGF0aW9uKCkge1xuXG4gICAgICAgIHZhciBhemltID0gdGhpcy5hemltICogTWF0aC5QSSAvIDE4MDtcbiAgICAgICAgdmFyIGVsZXYgPSB0aGlzLmVsZXYgKiBNYXRoLlBJIC8gMTgwO1xuXG4gICAgICAgIHZhciB0ZW1wU0ggPSBqc2hsaWIuY29tcHV0ZVJlYWxTSCh0aGlzLm9yZGVyLCBbIFthemltLCBlbGV2XSBdKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubkNoOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMuU0h4eXpbaV0gPSB0ZW1wU0hbaV1bMF07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZUdhaW5zKCk7XG4gICAgfVxuXG4gICAgdXBkYXRlR2FpbnMoKSB7XG5cbiAgICAgICAgdmFyIHE7XG4gICAgICAgIGZvciAodmFyIG4gPSAwOyBuIDw9IHRoaXMub3JkZXI7IG4rKykge1xuICAgICAgICAgICAgZm9yICh2YXIgbSA9IC1uOyBtIDw9IG47IG0rKykge1xuICAgICAgICAgICAgICAgIHEgPSBuICogbiArIG4gKyBtO1xuICAgICAgICAgICAgICAgIHRoaXMudm1pY0dhaW5zW3FdID0gdGhpcy52bWljQ29lZmZzW25dICogdGhpcy5TSHh5eltxXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5uQ2g7IGkrKykge1xuICAgICAgICAgICAgdGhpcy52bWljR2Fpbk5vZGVzW2ldLmdhaW4udmFsdWUgPSB0aGlzLnZtaWNHYWluc1tpXTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyAgQXJjaG9udGlzIFBvbGl0aXNcbi8vICBhcmNob250aXMucG9saXRpc0BhYWx0by5maVxuLy8gIERhdmlkIFBvaXJpZXItUXVpbm90XG4vLyAgZGF2aXBvaXJAaXJjYW0uZnJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vL1xuLy8gIEpTQW1iaXNvbmljcyBhIEphdmFTY3JpcHQgbGlicmFyeSBmb3IgaGlnaGVyLW9yZGVyIEFtYmlzb25pY3Ncbi8vICBUaGUgbGlicmFyeSBpbXBsZW1lbnRzIFdlYiBBdWRpbyBibG9ja3MgdGhhdCBwZXJmb3JtXG4vLyAgdHlwaWNhbCBhbWJpc29uaWMgcHJvY2Vzc2luZyBvcGVyYXRpb25zIG9uIGF1ZGlvIHNpZ25hbHMuXG4vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLy8vLy8vLy8vLy8vLy8vL1xuLyogSE9BIExPQURFUiAqL1xuLy8vLy8vLy8vLy8vLy8vL1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIT0Fsb2FkZXIge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQsIG9yZGVyLCB1cmwsIGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMub3JkZXIgPSBvcmRlcjtcbiAgICAgICAgdGhpcy5uQ2ggPSAob3JkZXIgKyAxKSAqIChvcmRlciArIDEpO1xuICAgICAgICB0aGlzLm5DaEdyb3VwcyA9IE1hdGguY2VpbCh0aGlzLm5DaCAvIDgpO1xuICAgICAgICB0aGlzLmJ1ZmZlcnMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgdGhpcy5sb2FkQ291bnQgPSAwO1xuICAgICAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uTG9hZCA9IGNhbGxiYWNrO1xuICAgICAgICB0aGlzLnVybHMgPSBuZXcgQXJyYXkodGhpcy5uQ2hHcm91cHMpO1xuXG4gICAgICAgIHZhciBmaWxlRXh0ID0gdXJsLnNsaWNlKHVybC5sZW5ndGggLSAzLCB1cmwubGVuZ3RoKTtcbiAgICAgICAgdGhpcy5maWxlRXh0ID0gZmlsZUV4dDtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubkNoR3JvdXBzOyBpKyspIHtcblxuICAgICAgICAgICAgaWYgKGkgPT0gdGhpcy5uQ2hHcm91cHMgLSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cmxzW2ldID0gdXJsLnNsaWNlKDAsIHVybC5sZW5ndGggLSA0KSArIFwiX1wiICsgcGFkKGkgKiA4ICsgMSwgMikgKyBcIi1cIiArIHBhZCh0aGlzLm5DaCwgMikgKyBcImNoLlwiICsgZmlsZUV4dDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cmxzW2ldID0gdXJsLnNsaWNlKDAsIHVybC5sZW5ndGggLSA0KSArIFwiX1wiICsgcGFkKGkgKiA4ICsgMSwgMikgKyBcIi1cIiArIHBhZChpICogOCArIDgsIDIpICsgXCJjaC5cIiArIGZpbGVFeHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBwYWQobnVtLCBzaXplKSB7XG4gICAgICAgICAgICByZXR1cm4gKCcwMDAwMDAwMDAnICsgbnVtKS5zdWJzdHIoLXNpemUpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBsb2FkQnVmZmVycyh1cmwsIGluZGV4KSB7XG4gICAgICAgIC8vIExvYWQgYnVmZmVyIGFzeW5jaHJvbm91c2x5XG4gICAgICAgIHZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHJlcXVlc3Qub3BlbihcIkdFVFwiLCB1cmwsIHRydWUpO1xuICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IFwiYXJyYXlidWZmZXJcIjtcblxuICAgICAgICB2YXIgc2NvcGUgPSB0aGlzO1xuXG4gICAgICAgIHJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAvLyBBc3luY2hyb25vdXNseSBkZWNvZGUgdGhlIGF1ZGlvIGZpbGUgZGF0YSBpbiByZXF1ZXN0LnJlc3BvbnNlXG4gICAgICAgICAgICBzY29wZS5jb250ZXh0LmRlY29kZUF1ZGlvRGF0YShcbiAgICAgICAgICAgICAgICByZXF1ZXN0LnJlc3BvbnNlLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1ZmZlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoJ2Vycm9yIGRlY29kaW5nIGZpbGUgZGF0YTogJyArIHVybCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2NvcGUuYnVmZmVyc1tpbmRleF0gPSBidWZmZXI7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlLmxvYWRDb3VudCsrO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUubG9hZENvdW50ID09IHNjb3BlLm5DaEdyb3Vwcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlLmNvbmNhdEJ1ZmZlcnMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiSE9BbG9hZGVyOiBhbGwgYnVmZmVycyBsb2FkZWQgYW5kIGNvbmNhdGVuYXRlZFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGUub25Mb2FkKHNjb3BlLmNvbmNhdEJ1ZmZlcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGFsZXJ0KFwiQnJvd3NlciBjYW5ub3QgZGVjb2RlIGF1ZGlvIGRhdGE6ICBcIiArICB1cmwgKyBcIlxcblxcbkVycm9yOiBcIiArIGVycm9yICsgXCJcXG5cXG4oSWYgeW91IHJlIHVzaW5nIFNhZmFyaSBhbmQgZ2V0IGEgbnVsbCBlcnJvciwgdGhpcyBpcyBtb3N0IGxpa2VseSBkdWUgdG8gQXBwbGUncyBzaGFkeSBwbGFuIGdvaW5nIG9uIHRvIHN0b3AgdGhlIC5vZ2cgZm9ybWF0IGZyb20gZWFzaW5nIHdlYiBkZXZlbG9wZXIncyBsaWZlIDopXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGFsZXJ0KCdIT0Fsb2FkZXI6IFhIUiBlcnJvcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVxdWVzdC5zZW5kKCk7XG4gICAgfVxuXG4gICAgbG9hZCgpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm5DaEdyb3VwczsgKytpKSB0aGlzLmxvYWRCdWZmZXJzKHRoaXMudXJsc1tpXSwgaSk7XG4gICAgfVxuXG4gICAgY29uY2F0QnVmZmVycygpIHtcblxuICAgICAgICBpZiAoIXRoaXMubG9hZGVkKSByZXR1cm47XG5cbiAgICAgICAgdmFyIG5DaCA9IHRoaXMubkNoO1xuICAgICAgICB2YXIgbkNoR3JvdXBzID0gdGhpcy5uQ2hHcm91cHM7XG5cbiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuYnVmZmVyc1swXS5sZW5ndGg7XG4gICAgICAgIHRoaXMuYnVmZmVycy5mb3JFYWNoKCAoYikgPT4ge2xlbmd0aCA9IE1hdGgubWF4KGxlbmd0aCwgYi5sZW5ndGgpfSk7XG4gICAgICAgIHZhciBzcmF0ZSA9IHRoaXMuYnVmZmVyc1swXS5zYW1wbGVSYXRlO1xuICAgICAgICBcbiAgICAgICAgLy8gRGV0ZWN0IGlmIHRoZSA4LWNoIGF1ZGlvIGZpbGUgaXMgT0dHLCB0aGVuIHJlbWFwIDgtY2hhbm5lbCBmaWxlcyB0byB0aGUgY29ycmVjdFxuICAgICAgICAvLyBvcmRlciBjYXVzZSBDaHJvbWUgYW5kIEZpcmVmb3ggbWVzc2VzIGl0IHVwIHdoZW4gbG9hZGluZy4gT3RoZXIgYnJvd3NlcnMgaGF2ZSBub3RcbiAgICAgICAgLy8gYmVlbiB0ZXN0ZWQgd2l0aCBPR0cgZmlsZXMuIDhjaCBXYXZlIGZpbGVzIHdvcmsgZmluZSBmb3IgYm90aCBicm93c2Vycy5cbiAgICAgICAgdmFyIHJlbWFwOENoYW5GaWxlID0gWzEsMiwzLDQsNSw2LDcsOF07XG4gICAgICAgIGlmICh0aGlzLmZpbGVFeHQudG9Mb3dlckNhc2UoKSA9PSBcIm9nZ1wiKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkxvYWRpbmcgb2YgOGNoYW4gT0dHIGZpbGVzIFtDaHJvbWUvRmlyZWZveF06IHJlbWFwIGNoYW5uZWxzIHRvIGNvcnJlY3Qgb3JkZXIhXCIpXG4gICAgICAgICAgICByZW1hcDhDaGFuRmlsZSA9IFsxLDMsMiw3LDgsNSw2LDRdO1xuICAgICAgICAgICAgLy9yZW1hcDhDaGFuRmlsZSA9IFsxLDMsMiw4LDYsNyw0LDVdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25jYXRCdWZmZXIgPSB0aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyKG5DaCwgbGVuZ3RoLCBzcmF0ZSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbkNoR3JvdXBzOyBpKyspIHtcbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgdGhpcy5idWZmZXJzW2ldLm51bWJlck9mQ2hhbm5lbHM7IGorKykge1xuICAgICAgICAgICAgICAgIHRoaXMuY29uY2F0QnVmZmVyLmdldENoYW5uZWxEYXRhKGkgKiA4ICsgaikuc2V0KHRoaXMuYnVmZmVyc1tpXS5nZXRDaGFubmVsRGF0YShyZW1hcDhDaGFuRmlsZVtqXS0xKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy8gIEFyY2hvbnRpcyBQb2xpdGlzIChBYWx0byBVbml2ZXJzaXR5KVxuLy8gIGFyY2hvbnRpcy5wb2xpdGlzQGFhbHRvLmZpXG4vLyAgRGF2aWQgUG9pcmllci1RdWlub3QgKElSQ0FNKVxuLy8gIGRhdmlwb2lyQGlyY2FtLmZyXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuLy9cbi8vICBKU0FtYmlzb25pY3MgYSBKYXZhU2NyaXB0IGxpYnJhcnkgZm9yIGhpZ2hlci1vcmRlciBBbWJpc29uaWNzXG4vLyAgVGhlIGxpYnJhcnkgaW1wbGVtZW50cyBXZWIgQXVkaW8gYmxvY2tzIHRoYXQgcGVyZm9ybVxuLy8gIHR5cGljYWwgYW1iaXNvbmljIHByb2Nlc3Npbmcgb3BlcmF0aW9ucyBvbiBhdWRpbyBzaWduYWxzLlxuLy9cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbi8vLy8vLy8vLy8vLy8vLy8vXG4vKiBIUklSIExPQURFUiAqL1xuLy8vLy8vLy8vLy8vLy8vLy9cblxuaW1wb3J0ICogYXMgc2VydmVTb2ZhSHJpciBmcm9tICdzZXJ2ZS1zb2ZhLWhyaXInO1xudmFyIHV0aWxzID0gcmVxdWlyZShcIi4vdXRpbHMuanNcIik7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhSSVJsb2FkZXJfaXJjYW0ge1xuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQsIG9yZGVyLCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICAgICAgICB0aGlzLm9yZGVyID0gb3JkZXI7XG4gICAgICAgIHRoaXMubkNoID0gKG9yZGVyICsgMSkgKiAob3JkZXIgKyAxKTtcblxuICAgICAgICAvLyBmb25jdGlvbiBjYWxsZWQgd2hlbiBmaWx0ZXJzIGxvYWRlZFxuICAgICAgICB0aGlzLm9uTG9hZCA9IGNhbGxiYWNrO1xuXG4gICAgICAgIC8vIGluc3RhbnRpYXRlIGhydGZzZXQgZnJvbSBzZXJ2ZS1zb2ZhLWhydGYgbGliXG4gICAgICAgIHRoaXMuaHJ0ZlNldCA9IG5ldyBzZXJ2ZVNvZmFIcmlyLkhydGZTZXQoeyBhdWRpb0NvbnRleHQ6dGhpcy5jb250ZXh0LCBjb29yZGluYXRlU3lzdGVtOidzb2ZhU3BoZXJpY2FsJyB9KTtcblxuICAgICAgICAvLyBkZWZpbmUgcmVxdWlyZWQgc3BlYWtlcnMgKGhlbmNlIGhyaXJzKSBwb3NpdGlvbnMgYmFzZWQgb24gQW1iaXNvbmljIG9yZGVyXG4gICAgICAgIHRoaXMud2lzaGVkU3BlYWtlclBvcyA9IHV0aWxzLmdldFRkZXNpZ24oMip0aGlzLm9yZGVyKTtcbiAgICB9XG5cbiAgICBsb2FkKHNldFVybCkge1xuXG4gICAgICAgIHRoaXMuaHJ0ZlNldC5sb2FkKHNldFVybCkudGhlbiggKCkgPT4ge1xuXG4gICAgICAgICAgICAvLyBleHRyYWN0IGhyaXIgYnVmZmVycyBvZiBpbnRlcmVzdCBmcm9tIHRoZSBkYXRhYmFzZVxuICAgICAgICAgICAgbGV0IGdyYW50ZWRGaWx0ZXJQb3MgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuaHJpckJ1ZmZlciA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLndpc2hlZFNwZWFrZXJQb3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBnZXQgYXZhaWxhYmxlIHBvc2l0aW9ucyAoaW4gdGhlIGRiKSBuZWFyZXN0IGZyb20gdGhlIHJlcXVpcmVkIHNwZWFrZXJzIHBvc2l0aW9uc1xuICAgICAgICAgICAgICAgIGdyYW50ZWRGaWx0ZXJQb3MucHVzaCh0aGlzLmhydGZTZXQubmVhcmVzdCh0aGlzLndpc2hlZFNwZWFrZXJQb3NbaV0pLnBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICAvLyBnZXQgcmVsYXRlZCBocmlyXG4gICAgICAgICAgICAgICAgdGhpcy5ocmlyQnVmZmVyLnB1c2godGhpcy5ocnRmU2V0Lm5lYXJlc3QodGhpcy53aXNoZWRTcGVha2VyUG9zW2ldKS5maXIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBERUJVRyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgICAgIC8vIGNvbXBhcmUgcmVxdWlyZWQgdnMuIHByZXNlbnQgcG9zaXRpb25zIGluIEhSSVIgZmlsdGVyXG4gICAgICAgICAgICBsZXQgYW5ndWxhckRpc3REZWcgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLndpc2hlZFNwZWFrZXJQb3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy53aXNoZWRTcGVha2VyUG9zW2ldWzBdIDwgMCkgdGhpcy53aXNoZWRTcGVha2VyUG9zW2ldWzBdICs9IDM2MC4wO1xuICAgICAgICAgICAgICAgIGFuZ3VsYXJEaXN0RGVnICs9IE1hdGguc3FydChcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5wb3codGhpcy53aXNoZWRTcGVha2VyUG9zW2ldWzBdIC0gZ3JhbnRlZEZpbHRlclBvc1tpXVswXSwgMikgK1xuICAgICAgICAgICAgICAgICAgICBNYXRoLnBvdyh0aGlzLndpc2hlZFNwZWFrZXJQb3NbaV1bMV0gLSBncmFudGVkRmlsdGVyUG9zW2ldWzFdLCAyKSk7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2Fza2VkIC8gZ3JhbnRlZCBwb3M6ICcsIHRoaXMud2lzaGVkU3BlYWtlclBvc1tpXSwgJy8nLCBncmFudGVkRmlsdGVyUG9zW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzdW1tZWQgLyBhdmVyYWdlIGFuZ3VsYXIgZGlzdCBiZXR3ZWVuIGFza2VkIGFuZCBwcmVzZW50IHBvczonLFxuICAgICAgICAgICAgICAgIE1hdGgucm91bmQoYW5ndWxhckRpc3REZWcqMTAwKS8xMDAsICdkZWcgLycsXG4gICAgICAgICAgICAgICAgTWF0aC5yb3VuZCggKGFuZ3VsYXJEaXN0RGVnL3RoaXMud2lzaGVkU3BlYWtlclBvcy5sZW5ndGgpICoxMDApLzEwMCwgJ2RlZycpO1xuICAgICAgICAgICAgLy8gREVCVUcgRU5EIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgICAgICAgICAgIC8vIGdldCBkZWNvZGluZyBtYXRyaXhcbiAgICAgICAgICAgIHRoaXMuZGVjb2RpbmdNYXRyaXggPSB1dGlscy5nZXRBbWJpc29uaWNEZWNNdHgoZ3JhbnRlZEZpbHRlclBvcywgdGhpcy5vcmRlcik7XG5cbiAgICAgICAgICAgIC8vIGNvbnZlcnQgaHJpciBmaWx0ZXJzIHRvIGhvYSBmaWx0ZXJzXG4gICAgICAgICAgICB0aGlzLmhvYUJ1ZmZlciA9IHRoaXMuZ2V0SG9hRmlsdGVyRnJvbUhyaXJGaWx0ZXIoKTtcblxuICAgICAgICAgICAgLy8gcGFzcyByZXN1bHRpbmcgaG9hIGZpbHRlcnMgdG8gdXNlciBjYWxsYmFja1xuICAgICAgICAgICAgdGhpcy5vbkxvYWQodGhpcy5ob2FCdWZmZXIpO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIGdldEhvYUZpbHRlckZyb21IcmlyRmlsdGVyKCkge1xuICAgICAgICAvLyBjcmVhdGUgZW1wdHkgYnVmZmVyIHJlYWR5IHRvIHJlY2VpdmUgaG9hIGZpbHRlcnNcbiAgICAgICAgbGV0IGhyaXJCdWZmZXJMZW5ndGggPSB0aGlzLmhyaXJCdWZmZXJbMF0ubGVuZ3RoOyAvLyBhc3N1bWluZyB0aGV5IGFsbCBoYXZlIHRoZSBzYW1lXG4gICAgICAgIGxldCBocmlyQnVmZmVyU2FtcGxlUmF0ZSA9IHRoaXMuaHJpckJ1ZmZlclswXS5zYW1wbGVSYXRlOyAvLyBzYW1lXG4gICAgICAgIGxldCBob2FCdWZmZXIgPSB0aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyKHRoaXMubkNoLCBocmlyQnVmZmVyTGVuZ3RoLCBocmlyQnVmZmVyU2FtcGxlUmF0ZSk7XG5cbiAgICAgICAgLy8gc3VtIHdlaWdodGVkIEhSSVIgb3ZlciBBbWJpc29uaWMgY2hhbm5lbHMgdG8gY3JlYXRlIEhPQSBJUnNcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5DaDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY29uY2F0QnVmZmVyQXJyYXlMZWZ0ID0gbmV3IEZsb2F0MzJBcnJheShocmlyQnVmZmVyTGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgdGhpcy5ocmlyQnVmZmVyLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBocmlyQnVmZmVyTGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uY2F0QnVmZmVyQXJyYXlMZWZ0W2tdICs9IHRoaXMuZGVjb2RpbmdNYXRyaXhbal1baV0gKiB0aGlzLmhyaXJCdWZmZXJbal0uZ2V0Q2hhbm5lbERhdGEoMClba107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaG9hQnVmZmVyLmdldENoYW5uZWxEYXRhKGkpLnNldChjb25jYXRCdWZmZXJBcnJheUxlZnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhvYUJ1ZmZlcjtcbiAgICB9XG5cbn1cbiIsIi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyAgQXJjaG9udGlzIFBvbGl0aXMgKEFhbHRvIFVuaXZlcnNpdHkpXG4vLyAgYXJjaG9udGlzLnBvbGl0aXNAYWFsdG8uZmlcbi8vICBEYXZpZCBQb2lyaWVyLVF1aW5vdCAoSVJDQU0pXG4vLyAgZGF2aXBvaXJAaXJjYW0uZnJcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vL1xuLy8gIEpTQW1iaXNvbmljcyBhIEphdmFTY3JpcHQgbGlicmFyeSBmb3IgaGlnaGVyLW9yZGVyIEFtYmlzb25pY3Ncbi8vICBUaGUgbGlicmFyeSBpbXBsZW1lbnRzIFdlYiBBdWRpbyBibG9ja3MgdGhhdCBwZXJmb3JtXG4vLyAgdHlwaWNhbCBhbWJpc29uaWMgcHJvY2Vzc2luZyBvcGVyYXRpb25zIG9uIGF1ZGlvIHNpZ25hbHMuXG4vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxuLy8vLy8vLy8vLy8vLy8vLy9cbi8qIEhSSVIgTE9BREVSICovXG4vLy8vLy8vLy8vLy8vLy8vL1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKFwiLi91dGlscy5qc1wiKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSFJJUmxvYWRlcl9sb2NhbCB7XG4gICAgY29uc3RydWN0b3IoY29udGV4dCwgb3JkZXIsIGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgICAgIHRoaXMub3JkZXIgPSBvcmRlcjtcbiAgICAgICAgdGhpcy5uQ2ggPSAob3JkZXIgKyAxKSAqIChvcmRlciArIDEpO1xuICAgICAgICAvLyBmdW5jdGlvbiBjYWxsZWQgd2hlbiBmaWx0ZXJzIGxvYWRlZFxuICAgICAgICB0aGlzLm9uTG9hZCA9IGNhbGxiYWNrO1xuICAgICAgICAvLyBkZWZpbmUgcmVxdWlyZWQgdmlydHVhbCBzcGVha2VyIHBvc2l0aW9ucyBiYXNlZCBvbiBBbWJpc29uaWMgb3JkZXJcbiAgICAgICAgdGhpcy52bHNfZGlyc19kZWcgPSB1dGlscy5nZXRUZGVzaWduKDIqdGhpcy5vcmRlcik7XG4gICAgICAgIHRoaXMublZMUyA9IHRoaXMudmxzX2RpcnNfZGVnLmxlbmd0aDtcbiAgICAgICAgLy8gYW5ndWxhciByZXNvbHV0aW9uIGZvciBmYXN0IGxvb2t1cCB0byBjbG9zZXN0IEhSSVIgdG8gYSBnaXZlbiBkaXJlY3Rpb25cbiAgICAgICAgdGhpcy5uZWFyZXN0TG9va3VwUmVzID0gWzUsNV07XG4gICAgfVxuXG4gICAgbG9hZChzZXRVcmwpIHtcbiAgICAgXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgLy8gc2V0dXAgdGhlIHJlcXVlc3RcbiAgICAgICAgdmFyIHJlcXVlc3RIcmlyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHJlcXVlc3RIcmlyLm9wZW4oXCJHRVRcIiwgc2V0VXJsLCB0cnVlKTtcbiAgICAgICAgcmVxdWVzdEhyaXIucmVzcG9uc2VUeXBlID0gXCJqc29uXCI7XG4gICAgICAgIHJlcXVlc3RIcmlyLm9ubG9hZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgLy8gbG9hZCB1c2VmdWwgSFJJUiBzdHVmZiBmcm9tIEpTT05cbiAgICAgICAgICAgIHNlbGYucGFyc2VIcmlyRnJvbUpTT04ocmVxdWVzdEhyaXIucmVzcG9uc2UpO1xuICAgICAgICAgICAgLy8gY29uc3RydWN0IGxvb2t1cCB0YWJsZSBmb3IgZmFzdCBjbG9zZXN0IEhSSVIgZmluZGluZ1xuICAgICAgICAgICAgc2VsZi5uZWFyZXN0TG9va3VwID0gdXRpbHMuY3JlYXRlTmVhcmVzdExvb2t1cChzZWxmLmhyaXJfZGlyc19kZWcsIHNlbGYubmVhcmVzdExvb2t1cFJlcyk7XG4gICAgICAgICAgICAvLyBmaW5kIGNsb3Nlc3QgaW5kaWNlcyB0byBWTFNcbiAgICAgICAgICAgIGxldCBuZWFyZXN0SWR4ID0gdXRpbHMuZmluZE5lYXJlc3Qoc2VsZi52bHNfZGlyc19kZWcsIHNlbGYubmVhcmVzdExvb2t1cCwgc2VsZi5uZWFyZXN0TG9va3VwUmVzKTtcbiAgICAgICAgICAgIC8vIGdldCBjbG9zZXN0IEhSSVJzIHRvIHRoZSBWTFMgZGVzaWduXG4gICAgICAgICAgICBzZWxmLm5lYXJlc3RfZGlyc19kZWcgPSBzZWxmLmdldENsb3Nlc3REaXJzKG5lYXJlc3RJZHgsIHNlbGYuaHJpcl9kaXJzX2RlZyk7XG4gICAgICAgICAgICBzZWxmLnZsc19ocmlycyA9IHNlbGYuZ2V0Q2xvc2VzdEhyaXJGaWx0ZXJzKG5lYXJlc3RJZHgsIHNlbGYuaHJpcnMpO1xuICAgICAgICAgICAgLy8gY29tcHV0ZSBhbWJpc29uaWMgZGVjb2RpbmcgZmlsdGVyc1xuICAgICAgICAgICAgc2VsZi5jb21wdXRlRGVjRmlsdGVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJlcXVlc3RIcmlyLnNlbmQoKTsgLy8gU2VuZCB0aGUgUmVxdWVzdCBhbmQgTG9hZCB0aGUgRmlsZVxuICAgIH1cbiAgICBcbiAgICBwYXJzZUhyaXJGcm9tSlNPTihocmlyU2V0KSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy5mcyA9IGhyaXJTZXQubGVhdmVzWzZdLmRhdGFbMF07ICAgICAgICAgICAgICAgICAgICAvLyBzYW1wbGVyYXRlIG9mIHRoZSBzZXRcbiAgICAgICAgdGhpcy5uSHJpcnMgPSBocmlyU2V0LmxlYXZlc1s0XS5kYXRhLmxlbmd0aDsgICAgICAgICAgICAvLyBudW1iZXIgb2YgSFJJUiBtZWFzdXJlbWVudHNcbiAgICAgICAgdGhpcy5uU2FtcGxlcyA9IGhyaXJTZXQubGVhdmVzWzhdLmRhdGFbMF1bMV0ubGVuZ3RoOyAgICAvLyBsZW5ndGggb2YgSFJJUnNcbiAgICAgICAgLy8gcGFyc2UgYXppbXV0aC1lbGV2YXRpb24gb2YgSFJJUnNcbiAgICAgICAgdGhpcy5ocmlyX2RpcnNfZGVnID0gW107XG4gICAgICAgIGhyaXJTZXQubGVhdmVzWzRdLmRhdGEuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhyaXJfZGlyc19kZWcucHVzaChbZWxlbWVudFswXSwgZWxlbWVudFsxXV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIC8vIHBhcnNlIEhSSVIgYnVmZmVyc1xuICAgICAgICB0aGlzLmhyaXJzID0gW107XG4gICAgICAgIGhyaXJTZXQubGVhdmVzWzhdLmRhdGEuZm9yRWFjaChmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGVmdCA9IG5ldyBGbG9hdDY0QXJyYXkoZWxlbWVudFswXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmlnaHQgPSBuZXcgRmxvYXQ2NEFycmF5KGVsZW1lbnRbMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ocmlycy5wdXNoKFtsZWZ0LCByaWdodF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICB9XG4gICAgXG4gICAgZ2V0Q2xvc2VzdERpcnMobmVhcmVzdElkeCwgaHJpcl9kaXJzX2RlZykge1xuICAgIC8vIGdldENsb3Nlc3RIcmlyRmlsdGVycyh0YXJnZXRfZGlyc19kZWcsIGhyaXJfZGlyc19kZWcsIElORk8pIHtcbiAgICAgICAgdmFyIG5EaXJzID0gbmVhcmVzdElkeC5sZW5ndGg7XG4gICAgICAgIHZhciBuZWFyZXN0X2RpcnNfZGVnID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbkRpcnM7IGkrKykge1xuICAgICAgICAgICAgLy8gZ2V0IGF2YWlsYWJsZSBwb3NpdGlvbnMgKGluIHRoZSBIUklSIHNldCkgbmVhcmVzdCBmcm9tIHRoZSByZXF1aXJlZCBzcGVha2VycyBwb3NpdGlvbnNcbiAgICAgICAgICAgIG5lYXJlc3RfZGlyc19kZWcucHVzaChocmlyX2RpcnNfZGVnW25lYXJlc3RJZHhbaV1dKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmVhcmVzdF9kaXJzX2RlZztcbiAgICAgICAgLy8gICAgICAgIGlmIChJTkZPKSB7XG4gICAgICAgIC8vICAgICAgICAgICAgLy8gY29tcGFyZSByZXF1aXJlZCB2cy4gcHJlc2VudCBwb3NpdGlvbnMgaW4gSFJJUiBmaWx0ZXJcbiAgICAgICAgLy8gICAgICAgICAgICBsZXQgYW5ndWxhckRpc3REZWcgPSAwO1xuICAgICAgICAvLyAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbkRpcnM7IGkrKykge1xuICAgICAgICAvLyAgICAgICAgICAgICAgICBpZiAodGhpcy50YXJnZXRfZGlyc19kZWdbaV1bMF0gPCAwKSB0aGlzLnRhcmdldF9kaXJzX2RlZ1tpXVswXSArPSAzNjAuMDtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgYW5ndWxhckRpc3REZWcgKz0gTWF0aC5zcXJ0KFxuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5wb3codGhpcy50YXJnZXRfZGlyc19kZWdbaV1bMF0gLSBncmFudGVkRmlsdGVyUG9zW2ldWzBdLCAyKSArXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnBvdyh0aGlzLnRhcmdldF9kaXJzX2RlZ1tpXVsxXSAtIGdyYW50ZWRGaWx0ZXJQb3NbaV1bMV0sIDIpKTtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2Fza2VkIC8gZ3JhbnRlZCBwb3M6ICcsIHRoaXMud2lzaGVkU3BlYWtlclBvc1tpXSwgJy8nLCBncmFudGVkRmlsdGVyUG9zW2ldKTtcbiAgICAgICAgLy8gICAgICAgICAgICB9XG4gICAgICAgIC8vICAgICAgICAgICAgY29uc29sZS5sb2coJ3N1bW1lZCAvIGF2ZXJhZ2UgYW5ndWxhciBkaXN0IGJldHdlZW4gdGFyZ2V0IGFuZCBhY3R1YWwgcG9zOicsXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZChhbmd1bGFyRGlzdERlZyoxMDApLzEwMCwgJ2RlZyAvJyxcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnJvdW5kKCAoYW5ndWxhckRpc3REZWcvdGhpcy53aXNoZWRTcGVha2VyUG9zLmxlbmd0aCkgKjEwMCkvMTAwLCAnZGVnJyk7XG4gICAgICAgIC8vICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIGdldENsb3Nlc3RIcmlyRmlsdGVycyhuZWFyZXN0SWR4LCBocmlycykge1xuICAgIFxuICAgICAgICB2YXIgbkRpcnMgPSBuZWFyZXN0SWR4Lmxlbmd0aDtcbiAgICAgICAgdmFyIG5lYXJlc3RfaHJpcnMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuRGlyczsgaSsrKSB7XG4gICAgICAgICAgICAvLyBnZXQgcmVzcGVjdGl2ZSBocmlyc1xuICAgICAgICAgICAgbmVhcmVzdF9ocmlycy5wdXNoKGhyaXJzW25lYXJlc3RJZHhbaV1dKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmVhcmVzdF9ocmlycztcbiAgICB9XG4gICAgXG4gICAgY29tcHV0ZURlY0ZpbHRlcnMoKSB7XG5cbiAgICAgICAgLy8gZ2V0IGRlY29kaW5nIG1hdHJpeFxuICAgICAgICB0aGlzLmRlY29kaW5nTWF0cml4ID0gdXRpbHMuZ2V0QW1iaUJpbmF1cmFsRGVjTXR4KHRoaXMubmVhcmVzdF9kaXJzX2RlZywgdGhpcy5vcmRlcik7XG4gICAgICAgIC8vIGNvbnZlcnQgaHJpciBmaWx0ZXJzIHRvIGhvYSBmaWx0ZXJzXG4gICAgICAgIHRoaXMuaG9hQnVmZmVyID0gdGhpcy5nZXRIb2FGaWx0ZXJGcm9tSHJpckZpbHRlcih0aGlzLm5DaCwgdGhpcy5uU2FtcGxlcywgdGhpcy5mcywgdGhpcy52bHNfaHJpcnMsIHRoaXMuZGVjb2RpbmdNYXRyaXgpO1xuICAgICAgICAvLyBwYXNzIHJlc3VsdGluZyBob2EgZmlsdGVycyB0byB1c2VyIGNhbGxiYWNrXG4gICAgICAgIHRoaXMub25Mb2FkKHRoaXMuaG9hQnVmZmVyKTtcbiAgICB9XG5cbiAgICBnZXRIb2FGaWx0ZXJGcm9tSHJpckZpbHRlcihuQ2gsIG5TYW1wbGVzLCBzYW1wbGVSYXRlLCBocmlycywgZGVjb2RpbmdNYXRyaXgpIHtcbiAgICAgICAgLy8gY3JlYXRlIGVtcHR5IGJ1ZmZlciByZWFkeSB0byByZWNlaXZlIGhvYSBmaWx0ZXJzXG4gICAgICAgIGlmIChuU2FtcGxlcz5ocmlyc1swXVswXS5sZW5ndGgpIG5TYW1wbGVzID0gaHJpcnNbMF1bMF0ubGVuZ3RoO1xuICAgICAgICBsZXQgaG9hQnVmZmVyID0gdGhpcy5jb250ZXh0LmNyZWF0ZUJ1ZmZlcihuQ2gsIG5TYW1wbGVzLCBzYW1wbGVSYXRlKTtcblxuICAgICAgICAvLyBzdW0gd2VpZ2h0ZWQgSFJJUiBvdmVyIEFtYmlzb25pYyBjaGFubmVscyB0byBjcmVhdGUgSE9BIElSc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5DaDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY29uY2F0QnVmZmVyQXJyYXlMZWZ0ID0gbmV3IEZsb2F0MzJBcnJheShuU2FtcGxlcyk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGhyaXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBuU2FtcGxlczsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmNhdEJ1ZmZlckFycmF5TGVmdFtrXSArPSBkZWNvZGluZ01hdHJpeFtqXVtpXSAqIGhyaXJzW2pdWzBdW2tdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGhvYUJ1ZmZlci5nZXRDaGFubmVsRGF0YShpKS5zZXQoY29uY2F0QnVmZmVyQXJyYXlMZWZ0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaG9hQnVmZmVyO1xuICAgIH1cblxufVxuIiwiXG4vLyBleHBvc2UgZm9yIHBsdWdpbnNcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbW9ub0VuY29kZXIgfSBmcm9tICcuL2FtYmktbW9ub0VuY29kZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBvcmRlckxpbWl0ZXIgfSBmcm9tICcuL2FtYmktb3JkZXJMaW1pdGVyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgb3JkZXJXZWlnaHQgfSBmcm9tICcuL2FtYmktb3JkZXJXZWlnaHQnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzY2VuZVJvdGF0b3IgfSBmcm9tICcuL2FtYmktc2NlbmVSb3RhdG9yJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc2NlbmVNaXJyb3IgfSBmcm9tICcuL2FtYmktc2NlbmVNaXJyb3InO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBiaW5EZWNvZGVyfSBmcm9tICcuL2FtYmktYmluYXVyYWxEZWNvZGVyJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZGVjb2Rlcn0gZnJvbSAnLi9hbWJpLWRlY29kZXInO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2aXJ0dWFsTWljIH0gZnJvbSAnLi9hbWJpLXZpcnR1YWxNaWMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBybXNBbmFseXNlciB9IGZyb20gJy4vYW1iaS1ybXNBbmFseXNlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHBvd2VybWFwQW5hbHlzZXIgfSBmcm9tICcuL2FtYmktcG93ZXJtYXBBbmFseXNlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGludGVuc2l0eUFuYWx5c2VyfSBmcm9tICcuL2FtYmktaW50ZW5zaXR5QW5hbHlzZXInO1xuXG5leHBvcnQgeyBkZWZhdWx0IGFzIEhPQWxvYWRlciB9IGZyb20gJy4vaG9hLWxvYWRlcic7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEhSSVJsb2FkZXJfbG9jYWwgfSBmcm9tICcuL2hyaXItbG9hZGVyX2xvY2FsJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSFJJUmxvYWRlcl9pcmNhbSB9IGZyb20gJy4vaHJpci1sb2FkZXJfaXJjYW0nO1xuXG5pbXBvcnQgKiBhcyBfY29udmVydGVycyBmcm9tICcuL2FtYmktY29udmVydGVycyc7XG5leHBvcnQgY29uc3QgY29udmVydGVycyA9IF9jb252ZXJ0ZXJzO1xuXG5pbXBvcnQgKiBhcyBfdXRpbHMgZnJvbSAnLi91dGlscyc7XG5leHBvcnQgY29uc3QgdXRpbHMgPSBfdXRpbHM7XG5cbiIsIi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyAgQXJjaG9udGlzIFBvbGl0aXNcbi8vICBhcmNob250aXMucG9saXRpc0BhYWx0by5maVxuLy9cbi8vICBEYXZpZCBQb2lyaWVyLVF1aW5vdFxuLy8gIGRhdmlwb2lyQGlyY2FtLmZyXG4vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vXG4vLyAgSlNBbWJpc29uaWNzIGEgSmF2YVNjcmlwdCBsaWJyYXJ5IGZvciBoaWdoZXItb3JkZXIgQW1iaXNvbmljc1xuLy8gIFRoZSBsaWJyYXJ5IGltcGxlbWVudHMgV2ViIEF1ZGlvIGJsb2NrcyB0aGF0IHBlcmZvcm1cbi8vICB0eXBpY2FsIGFtYmlzb25pYyBwcm9jZXNzaW5nIG9wZXJhdGlvbnMgb24gYXVkaW8gc2lnbmFscy5cbi8vXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL1xuXG4vLy8vLy8vLy8vL1xuLyogVVRJTFMgKi9cbi8vLy8vLy8vLy8vXG5cbnZhciBudW1lcmljID0gcmVxdWlyZSgnbnVtZXJpYycpO1xudmFyIGpzaGxpYiA9IHJlcXVpcmUoJ3NwaGVyaWNhbC1oYXJtb25pYy10cmFuc2Zvcm0nKTtcbnZhciBjb252ZXhodWxsID0gcmVxdWlyZSgnY29udmV4LWh1bGwnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGRlZzJyYWQoYWVkQXJyYXlJbikge1xuICAgIC8vIGZvcm1hdDogWyBbYXppbV8xLCBlbGV2XzEsIGRpc3RfMV0sIC4uLiwgW2F6aW1fTiwgZWxldl9OLCBkaXN0X05dIF1cbiAgICAvLyBvclxuICAgIC8vICAgICAgICAgWyBbYXppbV8xLCBlbGV2XzFdLCAgICAgICAgIC4uLiwgW2F6aW1fTiwgZWxldl9OXSBdXG4gICAgdmFyIGFlZEFycmF5T3V0ID0gW107XG4gICAgdmFyIFBJXzE4MCA9IE1hdGguUEkgLyAxODAuMDtcbiAgICBcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFlZEFycmF5SW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGFlZEFycmF5SW5bMF0ubGVuZ3RoID09IDMpXG4gICAgICAgIGFlZEFycmF5T3V0LnB1c2goW1xuICAgICAgICAgICAgICAgICAgICAgICAgICBhZWRBcnJheUluW2ldWzBdICogUElfMTgwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhZWRBcnJheUluW2ldWzFdICogUElfMTgwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhZWRBcnJheUluW2ldWzJdXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICBlbHNlIGlmIChhZWRBcnJheUluWzBdLmxlbmd0aCA9PSAyKVxuICAgICAgICBhZWRBcnJheU91dC5wdXNoKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFlZEFycmF5SW5baV1bMF0gKiBQSV8xODAsXG4gICAgICAgICAgICAgICAgICAgICAgICBhZWRBcnJheUluW2ldWzFdICogUElfMTgwLFxuICAgICAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgIFxuICAgIH1cbiAgICByZXR1cm4gYWVkQXJyYXlPdXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByYWQyZGVnKGFlZEFycmF5SW4pIHtcbiAgICAvLyBmb3JtYXQ6IFsgW2F6aW1fMSwgZWxldl8xLCBkaXN0XzFdLCAuLi4sIFthemltX04sIGVsZXZfTiwgZGlzdF9OXSBdXG4gICAgLy8gb3JcbiAgICAvLyAgICAgICAgIFsgW2F6aW1fMSwgZWxldl8xXSwgICAgICAgICAuLi4sIFthemltX04sIGVsZXZfTl0gXVxuICAgIHZhciBhZWRBcnJheU91dCA9IFtdO1xuICAgIHZhciBQSV8xODAgPSAxODAuMCAvIE1hdGguUEk7XG4gICAgXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhZWRBcnJheUluLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChhZWRBcnJheUluWzBdLmxlbmd0aCA9PSAzKVxuICAgICAgICAgICAgYWVkQXJyYXlPdXQucHVzaChbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZWRBcnJheUluW2ldWzBdICogUElfMTgwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVkQXJyYXlJbltpXVsxXSAqIFBJXzE4MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFlZEFycmF5SW5baV1bMl1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICBlbHNlIGlmIChhZWRBcnJheUluWzBdLmxlbmd0aCA9PSAyKVxuICAgICAgICAgICAgYWVkQXJyYXlPdXQucHVzaChbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZWRBcnJheUluW2ldWzBdICogUElfMTgwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWVkQXJyYXlJbltpXVsxXSAqIFBJXzE4MCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICBcbiAgICB9XG4gICAgcmV0dXJuIGFlZEFycmF5T3V0O1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRBbWJpc29uaWNEZWNNdHgoaHJ0Zl9kaXJzX2RlZywgb3JkZXIpIHtcblxuICAgIC8vIHRyaWFuZ3VsYXRpb25cbiAgICB2YXIgaHJ0Zl9kaXJzX3JhZCA9IGRlZzJyYWQoaHJ0Zl9kaXJzX2RlZyk7XG4gICAgdmFyIHZlcnRpY2VzID0ganNobGliLmNvbnZlcnRTcGgyQ2FydChocnRmX2RpcnNfcmFkKTtcbiAgICB2YXIgdHJpcGxldHMgPSBjb252ZXhodWxsKHZlcnRpY2VzKTtcbiAgICB2YXIgblRyaSA9IHRyaXBsZXRzLmxlbmd0aDtcbiAgICB2YXIgbkhSVEZzID0gaHJ0Zl9kaXJzX3JhZC5sZW5ndGg7XG4gICAgXG4gICAgLy8gdHJpcGxldCBjb29yZGluYXRlIGludmVyc2lvbnMgZm9yIFZCQVBcbiAgICB2YXIgbGF5b3V0SW52TXR4ID0gbmV3IEFycmF5KG5UcmkpO1xuICAgIGZvciAobGV0IG49MDsgbjxuVHJpOyBuKyspIHtcbiAgICAgICAgXG4gICAgICAgIC8vIGdldCB0aGUgdW5pdCB2ZWN0b3JzIGZvciB0aGUgY3VycmVudCBncm91cFxuICAgICAgICBsZXQgdGVtcEdyb3VwID0gbmV3IEFycmF5KDMpO1xuICAgICAgICBmb3IgKGxldCBpPTA7IGk8MzsgaSsrKSB7XG4gICAgICAgICAgICB0ZW1wR3JvdXBbaV0gPSB2ZXJ0aWNlc1t0cmlwbGV0c1tuXVtpXV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gZ2V0IGludmVyc2UgbXR4IG9mIGN1cnJlbnQgZ3JvdXBcbiAgICAgICAgbGV0IHRlbXBJbnZNdHggPSBudW1lcmljLmludih0ZW1wR3JvdXApO1xuICAgICAgICBsZXQgdGVtcEludlZlYyA9IFtdOyAvL3ZlY3Rvcml6ZSBtYXRyaXggYnkgc3RhY2tpbmcgY29sdW1uc1xuICAgICAgICBmb3IgKGxldCBpPTA7IGk8MzsgaSsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBqPTA7IGo8MzsgaisrKSB7XG4gICAgICAgICAgICAgICAgdGVtcEludlZlYy5wdXNoKHRlbXBJbnZNdHhbal1baV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxheW91dEludk10eFtuXSA9IHRlbXBJbnZWZWM7IC8vIHN0b3JlIHRoZSB2ZWN0b3JpemVkIGludmVyc2UgYXMgYSByb3cgdGhlIG91dHB1dFxuICAgIH1cblxuICAgIC8vIEFMTFJBRFxuICAgIC8vIHQtdmFsdWUgZm9yIHRoZSB0LWRlc2lnblxuICAgIHZhciB0ID0gMipvcmRlciArIDE7XG4gICAgLy8gdmJhcCBnYWlucyBmb3Igc2VsZWN0ZWQgdC1kZXNpZ25cbiAgICB2YXIgdGRfZGlyc19kZWcgPSBnZXRUZGVzaWduKDIqb3JkZXIpO1xuICAgIHZhciB0ZF9kaXJzX3JhZCA9IGRlZzJyYWQodGRfZGlyc19kZWcpO1xuICAgIHZhciBHX3RkID0gdmJhcDModGRfZGlyc19yYWQsIHRyaXBsZXRzLCBsYXlvdXRJbnZNdHgsIG5IUlRGcyk7XG4gICAgR190ZCA9IG51bWVyaWMudHJhbnNwb3NlKEdfdGQpO1xuXG4gICAgLy8gc3BoZXJpY2FsIGhhcm1vbmljIG1hdHJpeCBmb3IgdC1kZXNpZ25cbiAgICB2YXIgWV90ZCA9IGpzaGxpYi5jb21wdXRlUmVhbFNIKG9yZGVyLCB0ZF9kaXJzX3JhZCk7XG4gICAgWV90ZCA9IG51bWVyaWMudHJhbnNwb3NlKFlfdGQpO1xuICAgIC8vIGFsbHJhZCBkZWNvZGVyXG4gICAgdmFyIG5URCA9IHRkX2RpcnNfcmFkLmxlbmd0aDtcbiAgICB2YXIgTV9kZWMgPSBudW1lcmljLmRvdE1Nc21hbGwoR190ZCwgWV90ZCk7XG4gICAgTV9kZWMgPSBudW1lcmljLm11bCgxL25URCwgTV9kZWMpO1xuICAgIHJldHVybiBNX2RlYztcbn1cblxuXG52YXIgdmJhcDMgPSBmdW5jdGlvbiAoZGlyc19yYWQsIHRyaXBsZXRzLCBsc19pbnZNdHgsIGxzX251bSkge1xuICAgIFxuICAgIHZhciBuRGlycyA9IGRpcnNfcmFkLmxlbmd0aDtcbiAgICB2YXIgbkxTID0gbHNfbnVtO1xuICAgIHZhciBuVHJpID0gdHJpcGxldHMubGVuZ3RoO1xuICAgIFxuICAgIGZ1bmN0aW9uIGdldE1pbk9mQXJyYXkobnVtQXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIE1hdGgubWluLmFwcGx5KG51bGwsIG51bUFycmF5KTtcbiAgICB9XG4gICAgXG4gICAgdmFyIGdhaW5NdHggPSBuZXcgQXJyYXkobkRpcnMpO1xuICAgIHZhciBVID0ganNobGliLmNvbnZlcnRTcGgyQ2FydChkaXJzX3JhZCk7XG4gICAgXG4gICAgZm9yIChsZXQgbnM9MDsgbnM8bkRpcnM7IG5zKyspIHtcbiAgICAgICAgbGV0IHUgPSBVW25zXTtcbiAgICAgICAgbGV0IGdhaW5zID0gbmV3IEFycmF5KG5MUyk7XG4gICAgICAgIGdhaW5zLmZpbGwoMCk7XG5cbiAgICAgICAgZm9yIChsZXQgaT0wOyBpPG5Ucmk7IGkrKykge1xuICAgICAgICAgICAgbGV0IGdfdG1wID0gW107XG4gICAgICAgICAgICBsZXQgdl90bXAgPSBbIGxzX2ludk10eFtpXVswXSwgbHNfaW52TXR4W2ldWzFdLCBsc19pbnZNdHhbaV1bMl0gXTtcbiAgICAgICAgICAgIGdfdG1wWzBdID0gbnVtZXJpYy5kb3RWViggdl90bXAgLCB1ICk7XG4gICAgICAgICAgICB2X3RtcCA9IFsgbHNfaW52TXR4W2ldWzNdLCBsc19pbnZNdHhbaV1bNF0sIGxzX2ludk10eFtpXVs1XSBdO1xuICAgICAgICAgICAgZ190bXBbMV0gPSBudW1lcmljLmRvdFZWKCB2X3RtcCAsIHUgKTtcbiAgICAgICAgICAgIHZfdG1wID0gWyBsc19pbnZNdHhbaV1bNl0sIGxzX2ludk10eFtpXVs3XSwgbHNfaW52TXR4W2ldWzhdIF07XG4gICAgICAgICAgICBnX3RtcFsyXSA9IG51bWVyaWMuZG90VlYoIHZfdG1wICwgdSApO1xuICAgICAgICAgICAgaWYgKGdldE1pbk9mQXJyYXkoZ190bXApID4gLTAuMDAxKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgbm9ybV9nX3RtcCA9IE1hdGguc3FydChudW1lcmljLnN1bShudW1lcmljLnBvdyhnX3RtcCwyKSkpOyAvLyBub3JtYWxpemUgZ2FpbnNcbiAgICAgICAgICAgICAgICBsZXQgZ190bXBfbm9ybWVkID0gbnVtZXJpYy5kaXYoZ190bXAsIG5vcm1fZ190bXApO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGo9MDtqPDM7aisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGdhaW5zWyB0cmlwbGV0c1tpXVtqXSBdID0gZ190bXBfbm9ybWVkW2pdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBub3JtX2dhaW5zID0gTWF0aC5zcXJ0KG51bWVyaWMuc3VtKG51bWVyaWMucG93KGdhaW5zLDIpKSk7IC8vIG5vcm1hbGl6ZSBnYWluc1xuICAgICAgICBsZXQgZ2FpbnNfbm9ybWVkID0gbnVtZXJpYy5kaXYoZ2FpbnMsIG5vcm1fZ2FpbnMpO1xuICAgICAgICBnYWluTXR4W25zXSA9IGdhaW5zX25vcm1lZDtcbiAgICB9XG4gICAgcmV0dXJuIGdhaW5NdHg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOZWFyZXN0TG9va3VwKGRpcnNfZGVnLCBhbmdfcmVzKSB7XG4gICAgXG4gICAgdmFyIG5EaXJzID0gZGlyc19kZWcubGVuZ3RoO1xuICAgIHZhciBkaXJzX3h5eiA9IGpzaGxpYi5jb252ZXJ0U3BoMkNhcnQoZGVnMnJhZChkaXJzX2RlZykpO1xuICAgIHZhciBuQXppID0gTWF0aC5yb3VuZCgzNjAvYW5nX3Jlc1swXSkgKyAxO1xuICAgIHZhciBuRWxlID0gTWF0aC5yb3VuZCgxODAvYW5nX3Jlc1sxXSkgKyAxO1xuICAgIHZhciBhemkgPSBuZXcgQXJyYXkobkF6aSk7XG4gICAgYXppWzBdID0gLTE4MDtcbiAgICBmb3IgKGxldCBpPTE7IGk8bkF6aTsgaSsrKSB7XG4gICAgICAgIGF6aVtpXSA9IGF6aVtpLTFdICsgYW5nX3Jlc1swXTtcbiAgICB9XG4gICAgdmFyIG5HcmlkID0gbkF6aSpuRWxlO1xuICAgIHZhciBuZWFyZXN0TG9va3VwID0gbmV3IEFycmF5KG5HcmlkKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5HcmlkOyBpKyspIHtcbiAgICAgICAgbGV0IGdyaWRfZGVnID0gW1sgKGklbkF6aSkqYW5nX3Jlc1swXS0xODAsIE1hdGguZmxvb3IoaS9uQXppKSphbmdfcmVzWzFdLTkwIF1dO1xuICAgICAgICBsZXQgZ3JpZF94eXogPSBqc2hsaWIuY29udmVydFNwaDJDYXJ0KGRlZzJyYWQoZ3JpZF9kZWcpKTtcbiAgICAgICAgbGV0IG1pblZhbCA9IDEwMDA7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbkRpcnM7IGorKykge1xuICAgICAgICAgICAgbGV0IG5ld01pblZhbCA9IG51bWVyaWMuc3VtKG51bWVyaWMucG93KG51bWVyaWMuc3ViKGdyaWRfeHl6WzBdLCBkaXJzX3h5eltqXSksMikpO1xuICAgICAgICAgICAgaWYgKG5ld01pblZhbDxtaW5WYWwpIHtcbiAgICAgICAgICAgICAgICBuZWFyZXN0TG9va3VwW2ldID0gajtcbiAgICAgICAgICAgICAgICBtaW5WYWwgPSBuZXdNaW5WYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5lYXJlc3RMb29rdXA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTmVhcmVzdChkaXJzX2RlZywgbmVhcmVzdExvb2t1cCwgYW5nX3Jlcykge1xuICAgIFxuICAgIHZhciBuRGlycyA9IGRpcnNfZGVnLmxlbmd0aDtcbiAgICB2YXIgYXppbSA9IFtdO1xuICAgIHZhciBlbGV2ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuRGlyczsgaSsrKSB7XG4gICAgICAgIGF6aW0ucHVzaChkaXJzX2RlZ1tpXVswXSsxODApO1xuICAgICAgICBlbGV2LnB1c2goZGlyc19kZWdbaV1bMV0rOTApO1xuICAgIH1cbiAgICB2YXIgbkF6aSA9IE1hdGgucm91bmQoMzYwL2FuZ19yZXNbMF0pICsgMTtcbiAgICB2YXIgYXppSW5kZXggPSBudW1lcmljLnJvdW5kKCBudW1lcmljLmRpdiggbnVtZXJpYy5tb2QoYXppbSwzNjApLCBhbmdfcmVzWzBdKSApO1xuICAgIHZhciBlbGV2SW5kZXggPSBudW1lcmljLnJvdW5kKCBudW1lcmljLmRpdihlbGV2LCBhbmdfcmVzWzFdKSApO1xuICAgIHZhciBncmlkSW5kZXggPSBudW1lcmljLmFkZCggbnVtZXJpYy5tdWwoZWxldkluZGV4LG5BemkpLCBhemlJbmRleCwgMSk7XG4gICAgdmFyIG5lYXJlc3RJbmRleCA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbkRpcnM7IGkrKykge1xuICAgICAgICBuZWFyZXN0SW5kZXgucHVzaChuZWFyZXN0TG9va3VwW2dyaWRJbmRleFtpXV0pO1xuICAgIH1cbiAgICByZXR1cm4gbmVhcmVzdEluZGV4O1xufVxuXG5cbi8qXG4gKiAgZ2V0VGRlc2lnbiByZXR1cm5zIHRoZSBzcGhlcmljYWwgY29vcmRpbmF0ZXMgb2YgbWluaW1hbCBULWRlc2lnbnNcbiAqXG4gKiAgZ2V0VGRlc2lnbiByZXR1cm5zIHRoZSB1bml0IHZlY3RvcnMgYW5kIHRoZSBzcGhlcmljYWwgY29vcmRpbmF0ZXNcbiAqICBvZiB0LWRlc2lnbnMsIHdoaWNoIGNvbnN0aXR1dGUgdW5pZm9ybSBhcnJhbmdlbWVudHMgb24gdGhlIHNwaGVyZSBmb3JcbiAqICB3aGljaCBzcGhlcmljYWwgcG9seW5vbWlhbHMgdXAgdG8gZGVncmVlIHQgY2FuIGJlIGludGVncmF0ZWQgZXhhY3RseSBieVxuICogIHN1bW1hdGlvbiBvZiB0aGVpciB2YWx1ZXMgYXQgdGhlIHBvaW50cyBkZWZpbmVkIGJ5IHRoZSB0LWRlc2lnbi5cbiAqICBEZXNpZ25zIGZvciBvcmRlciB1cCB0byB0PTIxIGFyZSBzdG9yZWQgYW5kIHJldHVybmVkLiBOb3RlIHRoYXQgZm9yIHRoZVxuICogIHNwaGVyaWNhbCBoYXJtb25pYyB0cmFuc2Zvcm0gKFNIVCkgb2YgYSBmdW5jdGlvbiBvZiBvcmRlciBOLCBhIHNwaGVyaWNhbFxuICogIHQtZGVzaWduIG9mIHQ+PTJOIHNob3VsZCBiZSB1c2VkIChvciBlcXVpdmFsZW50bHkgTj1mbG9vcih0LzIpICksIHNpbmNlXG4gKiAgdGhlIGludGVncmFsIGV2YWx1YXRlcyB0aGUgcHJvZHVjdCBvZiB0aGUgc3BoZXJpY2FsIGZ1bmN0aW9uIHdpdGhcbiAqICBzcGhlcmljYWwgaGFybW9uaWNzIG9mIHVwIHRvIG9yZGVyIE4uIFRoZSBzcGhlcmljYWwgY29vcmRpbmF0ZXMgYXJlXG4gKiAgZ2l2ZW4gaW4gdGhlIFthemkxIGVsZXYxOyBhemkyIGVsZXYyOyAuLi47IGF6aVEgZWxldlFdIGNvbnZlbnRpb24uXG4gKlxuICogIFRoZSBkZXNpZ25zIGhhdmUgYmVlbiBjb3BpZWQgZnJvbTpcbiAqICAgICAgaHR0cDovL25laWxzbG9hbmUuY29tL3NwaGRlc2lnbnMvXG4gKiAgYW5kIHNob3VsZCBiZSByZWZlcmVuY2VkIGFzOlxuICogICAgICBcIk1jTGFyZW4ncyBJbXByb3ZlZCBTbnViIEN1YmUgYW5kIE90aGVyIE5ldyBTcGhlcmljYWwgRGVzaWducyBpblxuICogICAgICBUaHJlZSBEaW1lbnNpb25zXCIsIFIuIEguIEhhcmRpbiBhbmQgTi4gSi4gQS4gU2xvYW5lLCBEaXNjcmV0ZSBhbmRcbiAqICAgICAgQ29tcHV0YXRpb25hbCBHZW9tZXRyeSwgMTUgKDE5OTYpLCBwcC4gNDI5LTQ0MS5cbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGRlc2lnbihkZWdyZWUpIHtcbiAgICBpZiAoZGVncmVlID4gMjEpeyB0aHJvdyBuZXcgRXJyb3IoJ0Rlc2lnbnMgb2Ygb3JkZXIgZ3JlYXRlciB0aGFuIDIxIGFyZSBub3QgaW1wbGVtZW50ZWQnKTsgfVxuICAgIGVsc2UgaWYgKGRlZ3JlZSA8IDEpeyB0aHJvdyBuZXcgRXJyb3IoJ09yZGVyIHNob3VsZCBiZSBhdCBsZWFzdCAxJyk7IH1cbiAgICBcbiAgICB2YXIgc3BlYWtlclBvcyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgIFswLjAwLCAgIDAuMDAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxODAuMDAsICAgMC4wMCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgIFs0NS4wMCwgIDM1LjI2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNDUuMDAsICAgLTM1LjI2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTM1LjAwLCAgIC0zNS4yNiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMzUuMDAsICAzNS4yNiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgWzAuMDAsICAgMC4wMCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE4MC4wMCwgICAwLjAwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbOTAuMDAsICAwLjAwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTkwLjAwLCAgIDAuMDAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFswLjAwLCAgIDkwLjAwLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFswLjAwLCAgIC05MC4wMCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgIFswLjAwLCAgIC0zMS43MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy01OC4yOCwgICAwLjAwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTkwLjAwLCAgIDU4LjI4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFswLjAwLCAgIDMxLjcyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTIxLjcyLCAgMC4wMCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzkwLjAwLCAgLTU4LjI4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTgwLjAwLCAgIC0zMS43MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEyMS43MiwgICAwLjAwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbOTAuMDAsICA1OC4yOCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTgwLjAwLCAgIDMxLjcyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs1OC4yOCwgIDAuMDAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstOTAuMDAsICAgLTU4LjI4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgWzAuMDAsICAgLTMxLjcyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTU4LjI4LCAgIDAuMDAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstOTAuMDAsICAgNTguMjgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzAuMDAsICAgMzEuNzIsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMjEuNzIsICAwLjAwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbOTAuMDAsICAtNTguMjgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxODAuMDAsICAgLTMxLjcyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTIxLjcyLCAgIDAuMDAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5MC4wMCwgIDU4LjI4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxODAuMDAsICAgMzEuNzIsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzU4LjI4LCAgMC4wMCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy05MC4wMCwgICAtNTguMjgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICBbMjYuMDAsICAxNS40NiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTI2LjAwLCAgIC0xNS40NiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE3LjExLCAgLTI0Ljk5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3LjExLCAgIDI0Ljk5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTQuMDAsICAgLTE1LjQ2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE1NC4wMCwgIDE1LjQ2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNjIuODksICAgMjQuOTksICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNjIuODksICAtMjQuOTksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3Mi44OSwgIDI0Ljk5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMDcuMTEsICAgLTI0Ljk5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTE2LjAwLCAgIDE1LjQ2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs2NC4wMCwgIC0xNS40NiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMDcuMTEsICAyNC45OSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTcyLjg5LCAgIC0yNC45OSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy02NC4wMCwgICAxNS40NiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTExNi4wMCwgIC0xNS40NiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzMyLjI1LCAgNjAuMDMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDcuNzUsICA2MC4wMywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTU3Ljc1LCAgIDYwLjAzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMjIuMjUsICAgNjAuMDMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zMi4yNSwgICAtNjAuMDMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNDcuNzUsICAgLTYwLjAzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNTcuNzUsICAtNjAuMDMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTIyLjI1LCAgLTYwLjAzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgWzI2LjAwLCAgMTUuNDYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yNi4wMCwgICAtMTUuNDYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNy4xMSwgIC0yNC45OSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNy4xMSwgICAyNC45OSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTU0LjAwLCAgIC0xNS40NiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNTQuMDAsICAxNS40NiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTYyLjg5LCAgIDI0Ljk5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTYyLjg5LCAgLTI0Ljk5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNzIuODksICAyNC45OSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTA3LjExLCAgIC0yNC45OSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzExNi4wMCwgICAxNS40NiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNjQuMDAsICAtMTUuNDYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTA3LjExLCAgMjQuOTksICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy03Mi44OSwgICAtMjQuOTksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNjQuMDAsICAgMTUuNDYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMTYuMDAsICAtMTUuNDYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFszMi4yNSwgIDYwLjAzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTQ3Ljc1LCAgNjAuMDMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy01Ny43NSwgICA2MC4wMywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTIyLjI1LCAgIDYwLjAzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMzIuMjUsICAgLTYwLjAzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTQ3Ljc1LCAgIC02MC4wMywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzU3Ljc1LCAgLTYwLjAzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEyMi4yNSwgIC02MC4wMywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgIFstMzEuMTEsICAgNTMuNjUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzExMC44MiwgICAzMC41MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTQ4Ljg5LCAgIDUzLjY1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFszMi4yMSwgIC0xNy44MywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzY5LjE4LCAgLTMwLjUwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTMyLjIxLCAgIDE3LjgzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNjkuMTgsICAgMzAuNTAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDcuNzksICAtMTcuODMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTEwLjgyLCAgLTMwLjUwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTQ3Ljc5LCAgIDE3LjgzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFszMS4xMSwgIC01My42NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDguODksICAtNTMuNjUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMjEuMjUsICAgLTQ3Ljc4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEwOC4yMCwgIDM4Ljc4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTguNzUsICAgLTQ3Ljc4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTM5Ljc3LCAgIC0xNC4wOSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy03MS44MCwgICAtMzguNzgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTM5Ljc3LCAgMTQuMDksICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzcxLjgwLCAgMzguNzgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy00MC4yMywgICAtMTQuMDksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMDguMjAsICAgLTM4Ljc4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNDAuMjMsICAxNC4wOSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMjEuMjUsICA0Ny43OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE1OC43NSwgIDQ3Ljc4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMDYuNjUsICAgLTIuNTUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yLjY2LCAgLTE2LjYzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTczLjM1LCAgIC0yLjU1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstOTguODQsICAgNzMuMTYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNzcuMzQsICAxNi42MywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbOTguODQsICAtNzMuMTYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNzcuMzQsICAgLTE2LjYzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbODEuMTYsICA3My4xNiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMi42NiwgICAxNi42MywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTgxLjE2LCAgIC03My4xNiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMDYuNjUsICAyLjU1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNzMuMzUsICAyLjU1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgWzIwLjc1LCAgLTMuNTUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yMC43NSwgICAzLjU1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTMuODAsICAtMjAuNzAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFszLjgwLCAgIDIwLjcwLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTkuMjUsICAgMy41NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNTkuMjUsICAtMy41NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3Ni4yMCwgIDIwLjcwLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNzYuMjAsICAgLTIwLjcwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbOTMuODAsICAyMC43MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbODYuMjAsICAtMjAuNzAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMTAuNzUsICAgLTMuNTUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzY5LjI1LCAgMy41NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy04Ni4yMCwgICAyMC43MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTkzLjgwLCAgIC0yMC43MCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy02OS4yNSwgICAtMy41NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTExMC43NSwgIDMuNTUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstOS45NCwgIDY4Ljk3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNzAuMDYsICAgNjguOTcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy05OS45NCwgICA2OC45NywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbODAuMDYsICA2OC45NywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbOS45NCwgICAtNjguOTcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTcwLjA2LCAgLTY4Ljk3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbOTkuOTQsICAtNjguOTcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstODAuMDYsICAgLTY4Ljk3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNDIuMTUsICAxNy41NywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTQyLjE1LCAgIC0xNy41NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzIzLjEyLCAgLTM5Ljc3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTIzLjEyLCAgIDM5Ljc3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMzcuODUsICAgLTE3LjU3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzNy44NSwgIDE3LjU3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTYuODgsICAgMzkuNzcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNTYuODgsICAtMzkuNzcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs2Ni44OCwgIDM5Ljc3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMTMuMTIsICAgLTM5Ljc3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTMyLjE1LCAgIDE3LjU3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs0Ny44NSwgIC0xNy41NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMTMuMTIsICAzOS43NywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTY2Ljg4LCAgIC0zOS43NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy00Ny44NSwgICAxNy41NywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzMi4xNSwgIC0xNy41NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzI1LjI2LCAgNDQuOTgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNTQuNzQsICA0NC45OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTY0Ljc0LCAgIDQ0Ljk4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMTUuMjYsICAgNDQuOTgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yNS4yNiwgICAtNDQuOTgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTQuNzQsICAgLTQ0Ljk4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNjQuNzQsICAtNDQuOTgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTE1LjI2LCAgLTQ0Ljk4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgWzE0NC4wOSwgICAtMjEuNDUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMzMuODEsICAgLTQ4LjkyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTM1LjkxLCAgIC0yMS40NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMTUuODcsICAzMy4wOSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE0Ni4xOSwgIDQ4LjkyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMTUuODcsICAgLTMzLjA5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTQ2LjE5LCAgIC00OC45MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzY0LjEzLCAgMzMuMDksICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzMzLjgxLCAgNDguOTIsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy02NC4xMywgICAtMzMuMDksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTQ0LjA5LCAgMjEuNDUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzM1LjkxLCAgMjEuNDUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy00NS41MywgICAxLjk1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTc3LjI2LCAgIDQ0LjQ0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMzQuNDcsICAgMS45NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzg3LjIxLCAgLTQ1LjQ5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMi43NCwgICAtNDQuNDQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstODcuMjEsICAgNDUuNDksICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yLjc0LCAgNDQuNDQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy05Mi43OSwgICAtNDUuNDksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTc3LjI2LCAgLTQ0LjQ0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbOTIuNzksICA0NS40OSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNDUuNTMsICAtMS45NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzNC40NywgIC0xLjk1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNS41OSwgIC03My4zNCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy04NS40MCwgICAxNi4wNCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE2NC40MSwgIC03My4zNCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2My45MiwgICA0LjQyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTk0LjYwLCAgIC0xNi4wNCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNjMuOTIsICAtNC40MiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbOTQuNjAsICAxNi4wNCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE2LjA4LCAgIDQuNDIsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs4NS40MCwgIC0xNi4wNCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2LjA4LCAgLTQuNDIsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNS41OSwgICA3My4zNCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTY0LjQxLCAgIDczLjM0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNjAuMDIsICAgMjUuMjcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE1MS40MSwgICAyNi44NiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTE5Ljk4LCAgIDI1LjI3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs0Ni42MywgIC01MS41NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzI4LjU5LCAgLTI2Ljg2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTQ2LjYzLCAgIDUxLjU3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMjguNTksICAgMjYuODYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMzMuMzcsICAtNTEuNTcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTUxLjQxLCAgLTI2Ljg2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTMzLjM3LCAgIDUxLjU3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs2MC4wMiwgIC0yNS4yNywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMTkuOTgsICAtMjUuMjcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTA5Ljk0LCAgNi45MSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE3Mi42NSwgICAtMTkuNzksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3MC4wNiwgIDYuOTEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNzAuNDQsICAgLTY4Ljk0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNy4zNSwgICAxOS43OSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNzAuNDQsICA2OC45NCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTcuMzUsICAtMTkuNzksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMDkuNTYsICAgLTY4Ljk0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3Mi42NSwgIDE5Ljc5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTA5LjU2LCAgNjguOTQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEwOS45NCwgICAtNi45MSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTcwLjA2LCAgIC02LjkxLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICBbMTMyLjkzLCAgIDcuNjksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstODMuOTMsICAgLTIzLjczLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbOC40NywgICAyMy41MSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTExMy4zNCwgIDcwLjQyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTAzLjI3LCAgLTkuOTAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zMy4yNCwgICAtNzAuNzUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsyMS44NiwgIC0yNi40NiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNTYuNTQsICA0Ny43OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTY0LjI2LCAgIC03LjcyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNjUuNzgsICAgNDQuNTMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yNS4yMCwgICAyNi4zOSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTk3LjAwLCAgIC00NC42NiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzI3Ljg1LCAgOS43NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE1My4yMSwgICAtNDcuNzEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTU1LjA2LCAgNy40NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMS44NCwgICAtMjMuNTksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs4MC41NCwgIDIzLjcyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNDIuMDYsICAgNzAuNDQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zMS4yMiwgICAtOS44NCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMzguODQsICAtNzAuNTAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5My43NiwgIC0yNi4yOSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy04NC43NiwgICA0Ny42MSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNy43NiwgICAtNy41MiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEyMi4yOCwgIDQ0LjI5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs0Ni44MCwgIDI2LjY0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMjQuNzcsICAgLTQ0LjU3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbOTkuODksICA5LjkxLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzNC43OCwgIC00Ny45NiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy04My4wOSwgICA3LjMwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNjAuMTMsICAtMjMuMzQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTIuNjQsICAgMjMuNjQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzI5Ljc2LCAgNzAuNjgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzQwLjc4LCAgLTkuNTgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzExMC4xOCwgICAtNzAuMzksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNjUuNjUsICAgLTI2LjQzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEyLjk5LCAgIDQ3Ljc1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3OS43NCwgIC03LjMxLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNTAuNTIsICAgNDQuMjYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzExOC45MiwgICAyNi43MSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNDcuMjIsICAtNDQuMzEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNzEuOTMsICAgOS43NiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy02Mi41MSwgICAtNDguMDQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTEuMTIsICAgNy40NCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEzMi4wMiwgICAtMjMuMzMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTM1LjM2LCAgMjMuMzksICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEwMi4zNywgICA3MC44MiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTEyLjc0LCAgIC05LjQ5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTc4LjMwLCAgLTcwLjU4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEyMi4zMiwgIC0yNi42NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzU5LjA4LCAgNDguMDAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE1MS43MCwgICAtNy4zOCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMjEuMzgsICA0NC41MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE2OS4wMSwgIDI2LjUwLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMTguOTgsICAgLTQ0LjI1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTExNi4wOSwgIDkuNTIsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5LjY1LCAgIC00Ny44MywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzYwLjg5LCAgNy42OCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNTYuMDIsICAtMjMuNTcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNjMuNDYsICAgMjMuMzEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE3NC45MywgICA3MC42NiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3NS4yOSwgIC05LjY4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTA1Ljk1LCAgLTcwLjgwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTUwLjE5LCAgIC0yNi43MCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEzMS4zNiwgICA0OC4wMSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzNi4zMCwgIC03LjY0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5My41NiwgIDQ0LjY3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstOTcuMDgsICAgMjYuMzAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNjkuMTYsICAtNDQuNDYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNDQuMTMsICAgOS41MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzgxLjQ4LCAgLTQ3LjYyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNTQuNDcsICA3LjkwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTYyLjE1LCAgIC02My4zNiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzI1LjUzLCAgNy45MCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy04MS4yNiwgICAtMjUuMjcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNy44NSwgIDYzLjM2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs4MS4yNiwgIDI1LjI3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTcuODUsICAgLTYzLjM2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbOTguNzQsICAtMjUuMjcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTYyLjE1LCAgNjMuMzYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy05OC43NCwgICAyNS4yNywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTU0LjQ3LCAgIC03LjkwLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMjUuNTMsICAgLTcuOTAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEuMzAsICAgLTEwLjQ3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTgzLjAxLCAgIDc5LjQ1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTc4LjcwLCAgLTEwLjQ3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTAwLjQ4LCAgIDEuMjgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstOTYuOTksICAgLTc5LjQ1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEwMC40OCwgIC0xLjI4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5Ni45OSwgIDc5LjQ1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNzkuNTIsICAgMS4yOCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzgzLjAxLCAgLTc5LjQ1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNzkuNTIsICAtMS4yOCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEuMzAsICAxMC40NywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTc4LjcwLCAgIDEwLjQ3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTcuMjQsICAgMTMuMTUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzMxLjE0LCAgLTYzLjg5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTIyLjc2LCAgIDEzLjE1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNzUuNzgsICAgMjIuMTMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE0OC44NiwgICA2My44OSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNzUuNzgsICAtMjIuMTMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTQ4Ljg2LCAgLTYzLjg5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTA0LjIyLCAgIDIyLjEzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMzEuMTQsICAgNjMuODksICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMDQuMjIsICAtMjIuMTMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTU3LjI0LCAgLTEzLjE1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMjIuNzYsICAtMTMuMTUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMTAuNDQsICAgLTYwLjYyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTYyLjE4LCAgIC05Ljg3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNjkuNTYsICAgLTYwLjYyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE2OC44OCwgIDI3LjM3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTE3LjgyLCAgOS44NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2OC44OCwgICAtMjcuMzcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMTcuODIsICAgLTkuODcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzExLjEyLCAgMjcuMzcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzYyLjE4LCAgOS44NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMS4xMiwgICAtMjcuMzcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTEwLjQ0LCAgNjAuNjIsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzY5LjU2LCAgNjAuNjIsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMjUuOTMsICAtNDcuNDAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTI2LjY3LCAgLTIzLjQwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNTQuMDcsICAtNDcuNDAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTUxLjY1LCAgLTMzLjI0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTUzLjMzLCAgIDIzLjQwLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTEuNjUsICAgMzMuMjQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzUzLjMzLCAgLTIzLjQwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMjguMzUsICAtMzMuMjQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMjYuNjcsICAgMjMuNDAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yOC4zNSwgICAzMy4yNCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTI1LjkzLCAgIDQ3LjQwLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNTQuMDcsICAgNDcuNDAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzYxLjQxLCAgMzcuNTQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzQxLjE5LCAgMjIuMzAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMTguNTksICAzNy41NCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMzEuOTIsICA0NC4xMywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTM4LjgxLCAgIC0yMi4zMCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zMS45MiwgICAtNDQuMTMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTM4LjgxLCAgMjIuMzAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDguMDgsICA0NC4xMywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTQxLjE5LCAgIC0yMi4zMCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE0OC4wOCwgICAtNDQuMTMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNjEuNDEsICAgLTM3LjU0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTE4LjU5LCAgIC0zNy41NCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEzMi45MiwgICA0LjczLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNi40NSwgICAtNDIuNzQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNDcuMDgsICAgNC43MywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy04My4wNywgICA0Ni44NywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTczLjU1LCAgIDQyLjc0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs4My4wNywgIC00Ni44NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNzMuNTUsICAtNDIuNzQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5Ni45MywgIDQ2Ljg3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNi40NSwgIDQyLjc0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstOTYuOTMsICAgLTQ2Ljg3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzMi45MiwgIC00LjczLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs0Ny4wOCwgIC00LjczLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICBbLTQwLjM2LCAgIDY4LjcwLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs2MS4xMiwgIDY1LjY4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNDEuNzMsICAgNzAuNzUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMzEuMjUsICA3Mi4zMiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE1NC44OCwgIC0xMi42MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy02Ni4yMCwgICAtOS43OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMjYuMzYsICAtMTEuOTcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMTQuOTUsICAgLTEyLjU4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMzcuMDIsICA1MS4xMywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTI5Ljc3LCAgIDUxLjk1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTQwLjYzLCAgNTAuMTUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy01Ni41MCwgICA0Ny44OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTY1LjA1LCAgIDEyLjU4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsyNS4xMiwgIDEyLjYyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMTMuODAsICAgOS43OCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNTMuNjQsICAxMS45NywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzNC41MSwgIC05LjczLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNDYuMjMsICAgLTguMzcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzQ3LjkxLCAgLTkuNzMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE0MS41MSwgICAtOC43MywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3Ljg0LCAgIC00NC4xMCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzY5LjM3LCAgLTQzLjI3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTUxLjIyLCAgIC00Mi42NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMDYuNzgsICAtNDAuMTgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNTAuMjMsICAgLTUxLjk1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMzkuMzcsICAtNTAuMTUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMjMuNTAsICAgLTQ3Ljg4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE0Mi45OCwgIC01MS4xMywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNzkuMTksICAtNjAuNzUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstODQuNTcsICAgLTU0LjA3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNS4zOSwgICAtNTguMDUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs4OS41MCwgIC02MC43NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDUuOTgsICAzMS4wMiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTU0LjM5LCAgIDI2LjQzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsyOC45MiwgIDMyLjUxLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMjUuMzQsICAgMzAuOTQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2OC43MSwgICAtNy4wNiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTExMi40OSwgIC0xMC4zOCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yMS45NiwgICAtOS42MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNzMuMTEsICAtOC4zMSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbOTUuNjgsICAwLjA0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3MC43MSwgIDIuMzIsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstODQuMzIsICAgLTAuMDQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzkuMjksICAgLTIuMzIsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzkuMTksICAgLTM0LjMzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbOTguMjEsICAtMzcuMzEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTc5LjIwLCAgLTQwLjQ4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTc3LjgxLCAgIC0zMS42MCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNzcuMDgsICAtMjEuNzQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstOTMuNzcsICAgLTE4LjgzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTIuNzIsICAtMTkuODAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5MC41MSwgIC0yMC45MSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMDYuODksICA4LjMxLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTExLjI5LCAgIDcuMDYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs2Ny41MSwgIDEwLjM4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTguMDQsICAgOS42MCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMTguODgsICAtNjUuNjgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMzguMjcsICAgLTcwLjc1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNDguNzUsICAtNzIuMzIsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMzkuNjQsICAgLTY4LjcwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTU0LjY2LCAgIC0zMC45NCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzM0LjAyLCAgLTMxLjAyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTI1LjYxLCAgIC0yNi40MywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNTEuMDgsICAtMzIuNTEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTcwLjgxLCAgMzQuMzMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy04MS43OSwgICAzNy4zMSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMC44MCwgICA0MC40OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTAyLjE5LCAgIDMxLjYwLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMjguNzgsICAgNDIuNjcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzczLjIyLCAgNDAuMTgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2Mi4xNiwgICA0NC4xMCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTExMC42MywgIDQzLjI3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstODkuNDksICAgMjAuOTEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzIuOTIsICAgMjEuNzQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzg2LjIzLCAgMTguODMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE3Ny4yOCwgICAxOS44MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTMzLjc3LCAgIDguMzcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTMyLjA5LCAgOS43MywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zOC40OSwgICA4LjczLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNDUuNDksICA5LjczLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTI1LjYwLCAgIDI0LjA0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs1NS4xMiwgIDMwLjIzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNDkuMzAsICAgMjguMDUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMTguNzEsICAyNi4wNiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMC44MSwgICA2MC43NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbOTUuNDMsICA1NC4wNywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3NC42MSwgIDU4LjA1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstOTAuNTAsICAgNjAuNzUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMjQuODgsICAtMzAuMjMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMzAuNzAsICAgLTI4LjA1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNjEuMjksICAtMjYuMDYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTQuNDAsICAgLTI0LjA0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzMi45MiwgIC04NS42MCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzQ3LjA4LCAgODUuNjAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTI5LjE5LCAgOC4xMSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2OS41OCwgICAtMzguNzMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs1MC44MSwgIDguMTIsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNzcuMjcsICAgLTUwLjExLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTAuNDIsICAzOC43MywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNzcuMzAsICA1MC4xMiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEwLjQxLCAgIC0zOC43MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEwMi43MSwgICAtNTAuMTEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTY5LjU3LCAgMzguNzIsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMDIuNzEsICA1MC4xMSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTI5LjE5LCAgIC04LjExLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNTAuODAsICAgLTguMTEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy00LjU5LCAgLTU2LjAxLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTkzLjEwLCAgIDMzLjg1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNzUuMzksICAgLTU2LjAzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTQ2LjExLCAgIC0yLjU3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstODYuODksICAgLTMzLjg2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE0Ni4xMCwgIDIuNTYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs4Ni45MSwgIDMzLjg2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMzMuODksICAgLTIuNTcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzkzLjEwLCAgLTMzLjg1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMzMuOTAsICAyLjU4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNC42MCwgICA1Ni4wMywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3NS4zOCwgIDU2LjAxLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMDYuNTcsICAgMjYuMTAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzI3LjA3LCAgLTE0LjgyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTczLjQ0LCAgIDI2LjA5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMzAuMjAsICAgNTkuNDEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE1Mi45NCwgICAxNC44MywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMzAuMjAsICAtNTkuNDAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTUyLjkzLCAgLTE0Ljg0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTQ5LjgyLCAgIDU5LjQxLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMjcuMDYsICAgMTQuODMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDkuODAsICAtNTkuNDIsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTA2LjU1LCAgLTI2LjEwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNzMuNDQsICAtMjYuMDksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTcxLjQyLCAgNzcuNDUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzkxLjkwLCAgLTEyLjQwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbOC41NCwgICA3Ny40NiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEyLjQwLCAgIC0xLjg1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs4OC4xMSwgIDEyLjQxLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMi40MSwgIDEuODYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstODguMTAsICAgLTEyLjQxLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTY3LjYwLCAgIC0xLjg2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstOTEuODksICAgMTIuNDAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNjcuNTksICAxLjg0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTcxLjQzLCAgIC03Ny40NiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy04LjUyLCAgLTc3LjQ1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEyMi43MywgIC0xMC40NCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNjcuNjUsICAtMzIuMTMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs1Ny4yNywgIC0xMC40MywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMDguODAsICAtNTUuODMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTIuMzUsICAgMzIuMTMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEwOC44MywgICA1NS44MywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTIuMzYsICAtMzIuMTIsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3MS4xOSwgIC01NS44MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2Ny42NiwgICAzMi4xMiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTcxLjE5LCAgIDU1LjgyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMjIuNzQsICAgMTAuNDQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy01Ny4yNywgICAxMC40NCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzNS44NCwgIC0yMy4wNSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDguNTgsICAtNDEuMzIsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs0NC4xNiwgIC0yMy4wNCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMjAuNjYsICAtMzkuODgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMzEuNDEsICAgNDEuMzEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEyMC42OCwgICAzOS44NywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMzEuNDIsICAtNDEuMzAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs1OS4zMywgIC0zOS44NiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE0OC42MCwgICA0MS4zMSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTU5LjMzLCAgIDM5Ljg3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMzUuODUsICAgMjMuMDUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy00NC4xNiwgICAyMy4wNSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE2MS41NSwgIDIwLjYyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMzAuMDQsICAgLTYyLjYwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTguNDUsICAyMC42NCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTY4LjM1LCAgIC0xNy4yMywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzQ5Ljk2LCAgNjIuNjEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzY4LjM2LCAgMTcuMjMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy00OS45MywgICAtNjIuNjAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMTEuNjUsICAgLTE3LjIyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzMC4wNSwgIDYyLjU5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTExLjY0LCAgMTcuMjIsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2MS41NiwgICAtMjAuNjMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTguNDQsICAgLTIwLjYyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEwNS4yMywgIC0zLjM4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTc2LjUwLCAgLTE1LjIxLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNzQuNzcsICAtMy4zNywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEwMi42NCwgIC03NC40MSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zLjUwLCAgMTUuMjEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEwMi42OSwgICA3NC40MSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMy41MSwgICAtMTUuMjAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3Ny4zMywgIC03NC40MCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE3Ni41MSwgICAxNS4yMCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTc3LjM2LCAgIDc0LjQwLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMDUuMjQsICAgMy4zOCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy03NC43NiwgICAzLjM3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE0Mi4zOSwgIDI1LjQyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNDIuMDgsICAgLTQ1LjY5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMzcuNjEsICAyNS40MywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTU5LjAyLCAgIC0zMy40NCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzM3LjkyLCAgNDUuNjksICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzU5LjA0LCAgMzMuNDUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zNy45MSwgICAtNDUuNjgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMjAuOTcsICAgLTMzLjQ0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE0Mi4wNywgIDQ1LjY4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTIwLjk2LCAgMzMuNDQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE0Mi40MCwgICAtMjUuNDMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMzcuNjAsICAgLTI1LjQyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zMC42MCwgICA2Ljk0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTY2LjU2LCAgIDU4LjY5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNDkuNDAsICAgNi45NiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzgxLjk1LCAgLTMwLjM2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTMuNDgsICAtNTguNjksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstODEuOTMsICAgMzAuMzYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMy40NiwgICA1OC42OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTk4LjA2LCAgIC0zMC4zNywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNjYuNTQsICAtNTguNjgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5OC4wNywgIDMwLjM3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFszMC42MiwgIC02Ljk1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTQ5LjM4LCAgLTYuOTUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEwNi42OSwgICAtMjIuNjgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMjMuNTcsICAgLTE1LjM2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTczLjMxLCAgIC0yMi42OSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDUuNTAsICA2Mi4xMCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE1Ni40MSwgIDE1LjM2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNDUuNTMsICAgLTYyLjEwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTU2LjQzLCAgIC0xNS4zNSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzM0LjQ3LCAgNjIuMTEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzIzLjU4LCAgMTUuMzYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zNC40NiwgICAtNjIuMTEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTA2LjY3LCAgMjIuNjgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzczLjMzLCAgMjIuNjksICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2Ni44MiwgICAxLjM5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNi4wOSwgICAtNzYuNzQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTMuMTksICAgMS4zOCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy04OC41NywgICAxMy4xOCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTczLjk5LCAgIDc2Ljc0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs4OC41OSwgIC0xMy4xOCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNzMuOTcsICAtNzYuNzMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5MS40MywgIDEzLjIwLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNi4wNywgIDc2LjczLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstOTEuNDIsICAgLTEzLjIwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE2Ni44MCwgIC0xLjM4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMy4yMCwgIC0xLjM5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNzQuNjcsICAgNDguMTEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEzMC44NiwgICAxMC4xNiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTA1LjMyLCAgIDQ4LjEzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMy4zNCwgIC00MC4wOCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzQ5LjE2LCAgLTEwLjE1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzLjMyLCAgIDQwLjA3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNDkuMTQsICAgMTAuMTUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNjYuNjcsICAtNDAuMDgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTMwLjg0LCAgLTEwLjE2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTY2LjY5LCAgIDQwLjA4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3NC43MCwgIC00OC4xMSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMDUuMzEsICAtNDguMTMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTI2Ljk5LCAgMjYuNTUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE0Ny45NiwgICAtMzIuNTcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs1My4wMCwgIDI2LjU2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNTAuMjgsICAgLTQ1LjU5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMzIuMDUsICAzMi41OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNTAuMzAsICA0NS41OSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTMyLjAzLCAgIC0zMi41OCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEyOS43MSwgICAtNDUuNTgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTQ3Ljk0LCAgMzIuNTcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMjkuNjksICA0NS41OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTI3LjAyLCAgIC0yNi41NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy01Mi45OCwgICAtMjYuNTYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTcxLjkzLCAgMzAuMzcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEwMy40NywgICAtNTguNjgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs4LjA3LCAgIDMwLjM2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNTkuMzgsICAgLTYuOTYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzc2LjU0LCAgNTguNjksICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzU5LjQwLCAgNi45NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy03Ni41MywgICAtNTguNjksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMjAuNjIsICAgLTYuOTQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMDMuNDQsICA1OC42OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEyMC42MCwgIDYuOTUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNzEuOTQsICAgLTMwLjM2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTguMDUsICAtMzAuMzcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs0MC44NiwgIDEwLjE2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNS4zMiwgIDQ4LjEyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTM5LjE0LCAgMTAuMTYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzc2LjY4LCAgNDAuMDksICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2NC42OSwgICAtNDguMTIsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNzYuNjcsICAgLTQwLjA5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE2NC42NywgIDQ4LjEyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTAzLjMxLCAgNDAuMDcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNS4zMCwgICAtNDguMTMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMDMuMzQsICAgLTQwLjA3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTQwLjg0LCAgIC0xMC4xNiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEzOS4xNiwgICAtMTAuMTUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMDMuMjAsICAgLTEuMzgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xLjQxLCAgLTEzLjE5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTc2LjgwLCAgIC0xLjM5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstOTYuMDIsICAgNzYuNzMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNzguNTcsICAxMy4xOSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbOTYuMDcsICAtNzYuNzMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNzguNTgsICAgLTEzLjE5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbODMuOTQsICA3Ni43NCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMS40MywgICAxMy4xOSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTgzLjk1LCAgIC03Ni43NCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMDMuMTgsICAxLjM4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNzYuODEsICAxLjM5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMzcuMDIsICAtMjYuNTYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMzkuNzAsICAgNDUuNTgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDIuOTksICAtMjYuNTYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMjIuMDUsICAgMzIuNTgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDAuMjksICAtNDUuNTksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTIyLjA0LCAgLTMyLjU4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTQwLjMxLCAgIDQ1LjU5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNTcuOTUsICAgMzIuNTcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzM5LjcyLCAgLTQ1LjU4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNTcuOTcsICAtMzIuNTcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMzcuMDAsICAgMjYuNTUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE0My4wMCwgICAyNi41NiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTYzLjMzLCAgIDIyLjY5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs1NS41NSwgIC02Mi4xMCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNi42NywgICAyMi42OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTY2LjQxLCAgIDE1LjM1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMjQuNDksICAgNjIuMTEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzY2LjQzLCAgLTE1LjM1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEyNC40OCwgIC02Mi4xMSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzExMy41OCwgICAxNS4zNiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTU1LjUyLCAgIDYyLjEwLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTEzLjU3LCAgLTE1LjM2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE2My4zMSwgIC0yMi42OCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2LjY5LCAgLTIyLjY5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMC41NywgICAtMTcuMzUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTIwLjQyLCAgNjkuNzYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2OS40MywgICAtMTcuMzUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMDcuNjMsICAgLTEwLjA4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTU5LjU3LCAgIC02OS43OCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMDcuNjMsICAxMC4wOCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNTkuNTcsICA2OS43OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTcyLjM3LCAgIC0xMC4wOSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEyMC40MiwgICAtNjkuNzYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3Mi4zNywgIDEwLjA5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMC41NywgIDE3LjM1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTY5LjQzLCAgMTcuMzUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zMC43NywgICA2OC4yNSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTAxLjUzLCAgIDE4LjU3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNDkuMjUsICAgNjguMjYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE4LjkyLCAgLTEwLjkyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNzguNDcsICAtMTguNTYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTguOTIsICAgMTAuOTIsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy03OC40NywgICAxOC41NiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE2MS4wOSwgIC0xMC45MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMDEuNTMsICAtMTguNTYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNjEuMDksICAgMTAuOTIsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzMwLjc4LCAgLTY4LjI2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE0OS4yNiwgIC02OC4yNiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzU2LjQ2LCAgNDEuMjYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzQ2LjQ2LCAgMjQuNTQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMjMuNTMsICA0MS4yNiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMzIuMTksICAzOC44MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTMzLjUzLCAgIC0yNC41MywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zMi4xOSwgICAtMzguODAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTMzLjUzLCAgMjQuNTMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDcuODAsICAzOC44MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTQ2LjQ2LCAgIC0yNC41NCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE0Ny44MCwgICAtMzguODAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNTYuNDYsICAgLTQxLjI3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTIzLjUzLCAgIC00MS4yNiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzg0Ljc0LCAgMjcuMzEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzI3LjQxLCAgNC42OCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy05NS4yNiwgICAyNy4zMCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTAuMDYsICA2Mi4yMywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTUyLjU5LCAgIC00LjY3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTAuMDYsICAgLTYyLjIzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE1Mi41OSwgIDQuNjcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTY5LjkyLCAgNjIuMjMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yNy40MCwgICAtNC42OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTY5LjkyLCAgIC02Mi4yMiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy04NC43NCwgICAtMjcuMzEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5NS4yNiwgIC0yNy4zMCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEzNi4yNywgICAtMC43MywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEuMDUsICAtNDYuMjcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNDMuNzMsICAgLTAuNzQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy05MS4wMSwgICA0My43MiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3OC45NCwgIDQ2LjI3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5MS4wMSwgIC00My43MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE3OC45NCwgICAtNDYuMjcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs4OC45OSwgIDQzLjczLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxLjA1LCAgIDQ2LjI3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstODguOTksICAgLTQzLjczLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzNi4yNywgIDAuNzMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs0My43MywgIDAuNzMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs1NS4yMywgIDEwLjgyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMy4wOSwgIDM0LjA3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTI0Ljc3LCAgMTAuODEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzcxLjQ4LCAgNTMuODAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2Ni45MSwgICAtMzQuMDYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNzEuNDgsICAgLTUzLjgwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE2Ni45MCwgIDM0LjA2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTA4LjUyLCAgNTMuNzksICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMy4wOSwgICAtMzQuMDYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMDguNTIsICAgLTUzLjc5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTU1LjIzLCAgIC0xMC44MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEyNC43NywgICAtMTAuODEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTA1LjQ5LCAgLTY4LjEzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTExMS4xNSwgIC01LjcxLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3NC41MiwgIC02OC4xMiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNzMuODksICAtMjEuMDQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNjguODUsICAgNS43MCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE3My44OSwgICAyMS4wNCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNjguODUsICAtNS43MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNi4xMiwgICAtMjEuMDQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMTEuMTUsICAgNS43MSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy02LjEyLCAgMjEuMDQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEwNS40OSwgICA2OC4xMywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTc0LjUyLCAgIDY4LjEyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFszNS4yOCwgIC0xNS4xOCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yNS4xNywgICA1MS45OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE0NC43MiwgIC0xNS4xOSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEwOC4zOSwgICAzMy44OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE1NC44NCwgIC01MS45OSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMDguMzksICAtMzMuODgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTQuODQsICAgNTEuOTksICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy03MS42MSwgICAzMy44NywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMjUuMTcsICAtNTEuOTgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3MS42MSwgIC0zMy44NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zNS4yOCwgICAxNS4xOCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTQ0LjcyLCAgIDE1LjE5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTI1LjI4LCAgLTI4LjU2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE0Ni4zMiwgIC0zMC40OSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzU0LjcyLCAgLTI4LjU1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzMy4yOSwgIC00NS44MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zMy42OSwgICAzMC40OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTMzLjMwLCAgIDQ1LjgyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFszMy42OCwgIC0zMC40OCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzQ2LjcxLCAgLTQ1LjgxLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTQ2LjMyLCAgIDMwLjQ5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNDYuNzEsICAgNDUuODEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEyNS4yOCwgICAyOC41NiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTU0LjcyLCAgIDI4LjU0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTQ0LjQwLCAgNTQuNzEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzExMi4zOCwgICAtMjguMDEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFszNS41OCwgIDU0LjcyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMjkuOTIsICAgLTE5LjY1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNjcuNjIsICAyOC4wMiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMjkuOTIsICAxOS42NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTY3LjYyLCAgIC0yOC4wMiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE1MC4wOCwgICAtMTkuNjQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTEyLjM4LCAgMjguMDEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNTAuMDgsICAxOS42NCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTQ0LjQwLCAgIC01NC43MSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zNS41OCwgICAtNTQuNzIsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs2OC41MywgIC01Mi44NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy01NC44MiwgICAxMi43NiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTExMS40NiwgIC01Mi44NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2NC41MSwgICAzNC4xOSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEyNS4xOCwgIC0xMi43NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNjQuNTEsICAtMzQuMTksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMjUuMTgsICAgMTIuNzcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNS41MCwgICAzNC4xOSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNTQuODIsICAtMTIuNzYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNS40OSwgIC0zNC4xOSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy02OC41MywgICA1Mi44NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTExLjQ3LCAgIDUyLjg2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5MS40OCwgIC03LjM3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNy4zOCwgIC0xLjQ3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstODguNTIsICAgLTcuMzgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNjguNjksICA4Mi40NywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3Mi42MiwgIDEuNDcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNjguNjksICAgLTgyLjQ3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTcyLjYyLCAgIC0xLjQ2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMS4yMiwgIDgyLjQ4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3LjM4LCAgIDEuNDcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTEuMjEsICAgLTgyLjQ4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTkxLjQ4LCAgIDcuMzcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs4OC41MiwgIDcuMzgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICBbLTExMC45NywgIC04MS4zNCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy05OC4wOSwgICAtMy4wOSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNjkuMDMsICAtODEuMzQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTc2Ljg4LCAgLTguMDgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy04MS45MSwgICAzLjA5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTc2Ljg4LCAgIDguMDgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs4MS45MSwgIC0zLjA5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFszLjEyLCAgIC04LjA4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5OC4wOSwgIDMuMDksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMy4xMiwgIDguMDgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMTAuOTcsICAgODEuMzQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy02OS4wMywgICA4MS4zNCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTQ1Ljc2LCAgIDMwLjUyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs0Ni4zMywgIC00NS40MSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zNC4yNCwgICAzMC41MiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTU0LjUxLCAgIDI4Ljk5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMzMuNjcsICAgNDUuNDEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzU0LjUxLCAgLTI4Ljk5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzMy42NywgIC00NS40MSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEyNS40OSwgICAyOC45OSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTQ2LjMzLCAgIDQ1LjQxLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTI1LjQ5LCAgLTI4Ljk5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE0NS43NiwgIC0zMC41MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzM0LjI0LCAgLTMwLjUyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTU5LjU4LCAgIDQxLjQwLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs2OC40MCwgIC00NC42NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yMC40MiwgICA0MS40MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTQ2Ljc1LCAgIDE1LjE4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMTEuNjAsICAgNDQuNjcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzQ2Ljc1LCAgLTE1LjE4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTExMS42MCwgIC00NC42NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEzMy4yNSwgICAxNS4xOCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTY4LjQwLCAgIDQ0LjY3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTMzLjI1LCAgLTE1LjE4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE1OS41OCwgIC00MS40MCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzIwLjQyLCAgLTQxLjQwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbODUuNDMsICAtMzcuOTMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMzguMDIsICAgMy42MCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy05NC41NywgICAtMzcuOTMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNzQuMTcsICAgNTEuODMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDEuOTgsICAtMy42MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3NC4xNywgIC01MS44MywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE0MS45OCwgICAzLjYwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTUuODMsICA1MS44MywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMzguMDIsICAtMy42MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNS44MywgICAtNTEuODMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstODUuNDMsICAgMzcuOTMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzk0LjU3LCAgMzcuOTMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzIxLjE4LCAgMjcuMTcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzU0Ljg2LCAgNTYuMDUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNTguODIsICAyNy4xNywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNjEuMTcsICAxOC43NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTI1LjE0LCAgIC01Ni4wNSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy02MS4xNywgICAtMTguNzUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTI1LjE0LCAgNTYuMDUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMTguODMsICAxOC43NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTU0Ljg2LCAgIC01Ni4wNSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzExOC44MywgICAtMTguNzUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMjEuMTgsICAgLTI3LjE3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTU4LjgyLCAgIC0yNy4xNywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEwNC42NiwgICAtOS41NiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTkuODgsICAtMTQuNDUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNzUuMzQsICAgLTkuNTYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMjMuNjUsICA3Mi41NiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3MC4xMiwgIDE0LjQ1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMjMuNjUsICAgLTcyLjU2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTcwLjEyLCAgIC0xNC40NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzU2LjM1LCAgNzIuNTYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzkuODgsICAgMTQuNDUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy01Ni4zNSwgICAtNzIuNTYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTA0LjY2LCAgOS41NiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzc1LjM0LCAgOS41NiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzI1Ljk0LCAgLTE2LjgzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTM0LjY2LCAgIDU5LjQwLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTU0LjA2LCAgLTE2LjgzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTA4LjU5LCAgIDI0Ljc1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTQ1LjM0LCAgLTU5LjQxLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEwOC41OSwgIC0yNC43NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE0NS4zNCwgICA1OS40MSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTcxLjQxLCAgIDI0Ljc1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFszNC42NiwgIC01OS40MSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzcxLjQxLCAgLTI0Ljc1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTI1Ljk0LCAgIDE2LjgzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTQuMDYsICAgMTYuODMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMDAuODksICAyNi40OSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTUzLjEwLCAgIC05Ljc0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3OS4xMSwgIDI2LjQ5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMjAuNzcsICAgLTYxLjUxLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMjYuOTAsICA5Ljc0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMjAuNzcsICA2MS41MSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTI2LjkwLCAgIC05Ljc0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTkuMjMsICAgLTYxLjUxLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE1My4xMCwgIDkuNzQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTU5LjIzLCAgNjEuNTEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEwMC44OSwgICAtMjYuNDksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNzkuMTEsICAgLTI2LjQ5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNDQuMzEsICAxMi4yOCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTcuMzAsICA0NC4zNiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzNS42OSwgIDEyLjI4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3My4wOCwgIDQzLjA1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNjIuNzAsICAgLTQ0LjM2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTczLjA4LCAgIC00My4wNSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNjIuNzAsICA0NC4zNiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEwNi45MiwgIDQzLjA1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTcuMzAsICAgLTQ0LjM2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTA2LjkyLCAgIC00My4wNSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy00NC4zMSwgICAtMTIuMjgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMzUuNjksICAgLTEyLjI4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE2OS4wOCwgIC0yNC41MywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMTIuNTQsICAtNjMuMjksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMC45MiwgIC0yNC41MywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMTQuOTMsICAtOS45MiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTY3LjQ2LCAgIDYzLjI4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMTQuOTMsICAgOS45MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzY3LjQ2LCAgLTYzLjI5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNjUuMDcsICAtOS45MiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTEyLjU0LCAgIDYzLjI5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNjUuMDcsICAgOS45MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2OS4wOCwgICAyNC41MywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEwLjkyLCAgIDI0LjUzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5My4yMCwgIC01Ny4zOSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy01Ny40MywgICAtMS43MywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTg2LjgwLCAgIC01Ny4zOSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNzcuOTUsICAzMi41NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEyMi41NywgIDEuNzMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNzcuOTUsICAgLTMyLjU1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTIyLjU3LCAgIC0xLjczLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsyLjA1LCAgIDMyLjU1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs1Ny40MywgIDEuNzMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMi4wNSwgIC0zMi41NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy05My4yMCwgICA1Ny4zOSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbODYuODAsICA1Ny4zOSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3LjU5LCAgIDMuMDQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNzAuMDQsICAgNzIuMTYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2Mi40MSwgICAzLjA0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbODYuODEsICAtMTcuNTYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5Ljk2LCAgIC03Mi4xNiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy04Ni44MSwgICAxNy41NiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTkuOTYsICA3Mi4xNiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTkzLjE5LCAgIC0xNy41NiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNzAuMDQsICAtNzIuMTYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5My4xOSwgIDE3LjU2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNy41OSwgIC0zLjA0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTYyLjQxLCAgLTMuMDQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzM5LjM4LCAgNDQuMjYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzU2LjkzLCAgMzMuNjEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDAuNjIsICA0NC4yNiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMzguNDIsICAyNy4wMywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTIzLjA3LCAgIC0zMy42MSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zOC40MiwgICAtMjcuMDMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTIzLjA3LCAgMzMuNjEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDEuNTgsICAyNy4wMywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTU2LjkzLCAgIC0zMy42MSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE0MS41OCwgICAtMjcuMDMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMzkuMzgsICAgLTQ0LjI2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTQwLjYyLCAgIC00NC4yNiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNjUuNTIsICAgMjYuNTIsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzYzLjM5LCAgLTYwLjA0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE0LjQ4LCAgIDI2LjUyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNjIuNzQsICAgMTIuOTMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzExNi42MSwgICA2MC4wNCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNjIuNzQsICAtMTIuOTMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTE2LjYxLCAgLTYwLjA0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTE3LjI2LCAgIDEyLjkzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNjMuMzksICAgNjAuMDQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMTcuMjYsICAtMTIuOTMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTY1LjUyLCAgLTI2LjUyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTQuNDgsICAtMjYuNTIsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTUwLjIyLCAgLTIxLjYyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE0MS40MSwgIC01My43OSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzI5Ljc4LCAgLTIxLjYyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTExNC41NSwgIC0yNy41MCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zOC41OSwgICA1My43OSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTE0LjU1LCAgIDI3LjUwLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFszOC41OSwgIC01My43OSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzY1LjQ1LCAgLTI3LjUwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTQxLjQxLCAgIDUzLjc5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNjUuNDUsICAgMjcuNTAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE1MC4yMiwgICAyMS42MiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTI5Ljc4LCAgIDIxLjYyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTYzLjQ3LCAgODEuOTEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzkyLjMxLCAgLTcuNzUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2LjUzLCAgODEuOTEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy03Ljc2LCAgLTIuMjksICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzg3LjY5LCAgNy43NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzcuNzYsICAgMi4yOSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy04Ny42OSwgICAtNy43NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTcyLjI0LCAgIC0yLjI5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstOTIuMzEsICAgNy43NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNzIuMjQsICAyLjI5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTYzLjQ3LCAgIC04MS45MSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNi41MywgICAtODEuOTEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNzkuOTEsICAgLTczLjQ5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEwNi4yNywgIDIuODUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMDAuMDksICAgLTczLjQ5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTc3LjAzLCAgIC0xNi4yNCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy03My43MywgICAtMi44NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3Ny4wMywgIDE2LjI0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3My43MywgIDIuODUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMi45NywgIC0xNi4yNCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEwNi4yNywgICAtMi44NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMi45NywgICAxNi4yNCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNzkuOTEsICA3My40OSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEwMC4wOSwgIDczLjQ5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNDMuMTksICAgNzMuNjMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEwMS4zNywgICAxMS44NiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTM2LjgxLCAgIDczLjYzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMi4wOSwgIC0xMS4xMiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzc4LjYzLCAgLTExLjg2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEyLjA5LCAgIDExLjEyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNzguNjMsICAgMTEuODYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNjcuOTEsICAtMTEuMTIsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTAxLjM3LCAgLTExLjg2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTY3LjkxLCAgIDExLjEyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs0My4xOSwgIC03My42MywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMzYuODEsICAtNzMuNjMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMDkuODYsICAgLTM0LjgzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTM2LjUwLCAgIC0xNi4xOSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy03MC4xNCwgICAtMzQuODMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTUzLjk3LCAgNTAuNTMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDMuNTAsICAxNi4xOSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTUzLjk3LCAgIC01MC41MywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE0My41MCwgICAtMTYuMTksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsyNi4wMywgIDUwLjUzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFszNi41MCwgIDE2LjE5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMjYuMDMsICAgLTUwLjUzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEwOS44NiwgIDM0LjgzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3MC4xNCwgIDM0LjgzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMjMuMzEsICAgLTYuNTQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNjMuODQsICA2NS44MywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTU2LjY5LCAgIC02LjU0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5Ny4xMiwgIC0yMy4xNSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNi4xNiwgICAtNjUuODMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstOTcuMTIsICAgMjMuMTUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2LjE2LCAgNjUuODMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy04Mi44OCwgICAtMjMuMTUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNjMuODQsICAgLTY1LjgzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbODIuODgsICAyMy4xNSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMjMuMzEsICA2LjU0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE1Ni42OSwgIDYuNTQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMC44NywgIC0zMS45MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy05MS40MCwgICA1OC4wNywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTc5LjEzLCAgIC0zMS45MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEyMS45MywgICAtMC43NCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTg4LjYwLCAgIC01OC4wNywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMjEuOTMsICAwLjc0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbODguNjAsICA1OC4wNywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTU4LjA3LCAgIC0wLjc0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5MS40MCwgIC01OC4wNywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzU4LjA3LCAgMC43NCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzAuODcsICAgMzEuOTIsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNzkuMTMsICAzMS45MiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTYzLjEyLCAgIDQzLjM1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3Mi45MCwgIC00NC4xMCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNi44OCwgICA0My4zNSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTQ1LjM5LCAgIDEyLjE5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMDcuMTAsICAgNDQuMTAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzQ1LjM5LCAgLTEyLjE5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEwNy4xMCwgIC00NC4xMCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEzNC42MSwgICAxMi4xOSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTcyLjkwLCAgIDQ0LjEwLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTM0LjYxLCAgLTEyLjE5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE2My4xMiwgIC00My4zNSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2Ljg4LCAgLTQzLjM1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTExNC4yMywgIDUwLjM3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMjcuMDYsICAgLTE1LjE3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNjUuNzcsICA1MC4zNywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE4Ljc3LCAgIC0zNS41NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzUyLjk0LCAgMTUuMTcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE4Ljc3LCAgMzUuNTcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy01Mi45NCwgICAtMTUuMTcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNjEuMjMsICAgLTM1LjU3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEyNy4wNiwgIDE1LjE3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTYxLjIzLCAgMzUuNTcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzExNC4yMywgICAtNTAuMzcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNjUuNzcsICAgLTUwLjM3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNTQuMTcsICAzMC4xNiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMzUuNjMsICAzMC40MSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEyNS44MywgIDMwLjE2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs0NS4yMSwgIDQ0LjUxLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNDQuMzcsICAgLTMwLjQxLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTQ1LjIxLCAgIC00NC41MSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDQuMzcsICAzMC40MSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzNC43OSwgIDQ0LjUxLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMzUuNjMsICAgLTMwLjQxLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTM0Ljc5LCAgIC00NC41MSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy01NC4xNywgICAtMzAuMTYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMjUuODMsICAgLTMwLjE2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTI2LjIwLCAgIDQxLjczLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs0Ny44NiwgIC0yNi4xNSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy01My44MCwgICA0MS43MywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTMzLjUxLCAgIDM3LjAzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMzIuMTQsICAgMjYuMTUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzMzLjUxLCAgLTM3LjAzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzMi4xNCwgIC0yNi4xNSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE0Ni40OSwgICAzNy4wMywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTQ3Ljg2LCAgIDI2LjE1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTQ2LjQ5LCAgLTM3LjAzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEyNi4yMCwgIC00MS43MywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzUzLjgwLCAgLTQxLjczLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE2MS43NSwgIDIwLjM4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMzAuMTIsICAgLTYyLjkxLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTguMjUsICAyMC4zOCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTY4LjYzLCAgIC0xNy4wNywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzQ5Ljg4LCAgNjIuOTEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzY4LjYzLCAgMTcuMDcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy00OS44OCwgICAtNjIuOTEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMTEuMzcsICAgLTE3LjA3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzMC4xMiwgIDYyLjkxLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTExLjM3LCAgMTcuMDcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2MS43NSwgICAtMjAuMzgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTguMjUsICAgLTIwLjM4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMi43MSwgICA0OC40OSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbODcuNjAsICA0MS40NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3Ny4yOSwgIDQ4LjQ5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs0MS40OCwgIDEuODAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5Mi40MCwgIC00MS40NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy00MS40OCwgICAtMS44MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTkyLjQwLCAgIDQxLjQ1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTM4LjUyLCAgMS44MCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy04Ny42MCwgICAtNDEuNDUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMzguNTIsICAgLTEuODAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yLjcxLCAgLTQ4LjQ5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTc3LjI5LCAgIC00OC40OSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy05OC4xNSwgICAtMjcuNTQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTUyLjIyLCAgLTcuMjIsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzgxLjg1LCAgLTI3LjU0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE2NC43OSwgIC02MS4zNywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yNy43OCwgICA3LjIyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTY0Ljc5LCAgIDYxLjM3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsyNy43OCwgIC03LjIyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNS4yMSwgIC02MS4zNywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE1Mi4yMiwgICA3LjIyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE1LjIxLCAgIDYxLjM3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5OC4xNSwgIDI3LjU0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstODEuODUsICAgMjcuNTQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgIFstNDAuNDgsICAgNDMuMzYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEyNC41MSwgICAzMy41OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTM5LjUyLCAgIDQzLjM2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFszOC44NSwgIC0yOC4xNywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzU1LjQ5LCAgLTMzLjU4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTM4Ljg1LCAgIDI4LjE3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNTUuNDksICAgMzMuNTgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDEuMTUsICAtMjguMTcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTI0LjUxLCAgLTMzLjU4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTQxLjE1LCAgIDI4LjE3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs0MC40OCwgIC00My4zNiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMzkuNTIsICAtNDMuMzYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs1Ni4wMSwgIDE3LjE4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsyMC40NiwgIDMyLjI5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTIzLjk5LCAgMTcuMTgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzYxLjA1LCAgNTIuMzgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE1OS41NCwgICAtMzIuMjksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNjEuMDUsICAgLTUyLjM4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE1OS41NCwgIDMyLjI5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTE4Ljk1LCAgNTIuMzgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yMC40NiwgICAtMzIuMjksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMTguOTUsICAgLTUyLjM4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTU2LjAxLCAgIC0xNy4xOCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEyMy45OSwgICAtMTcuMTgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTc5LjUxLCAgLTguOTUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy05My4wOCwgICAtODEuMDQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFswLjQ5LCAgIC04Ljk1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstOTguOTUsICAgLTAuNDgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy04Ni45MiwgICA4MS4wNCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbOTguOTUsICAwLjQ4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbODYuOTIsICAtODEuMDQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs4MS4wNSwgIC0wLjQ4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5My4wOCwgIDgxLjA0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstODEuMDUsICAgMC40OCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE3OS41MSwgICA4Ljk1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTAuNDksICA4Ljk1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTIuMDQsICAtMTMuNTYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNDkuMTUsICAgNzEuOTUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNjcuOTYsICAtMTMuNTYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMDMuODUsICAgMTEuNzAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMzAuODUsICAtNzEuOTUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTAzLjg1LCAgLTExLjcwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTMwLjg1LCAgIDcxLjk1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNzYuMTUsICAgMTEuNzAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzQ5LjE1LCAgLTcxLjk1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNzYuMTUsICAtMTEuNzAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTIuMDQsICAgMTMuNTYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2Ny45NiwgICAxMy41NiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzLjYyLCAgIC01OC4yMCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy05OC4zMCwgICAzMC44MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTY2LjM4LCAgIC01OC4yMCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE0OC45MywgICAtNy4xMywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTgxLjcwLCAgIC0zMC44MCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDguOTMsICA3LjEzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbODEuNzAsICAzMC44MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTMxLjA3LCAgIC03LjEzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5OC4zMCwgIC0zMC44MCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzMxLjA3LCAgNy4xMywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEzLjYyLCAgNTguMjAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNjYuMzgsICA1OC4yMCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNjUuMjYsICAtMjAuNTUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMjIuNDMsICAgMjMuMDcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMTQuNzQsICAtMjAuNTUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMzEuODUsICAgNTguMjYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNTcuNTcsICAtMjMuMDcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTMxLjg1LCAgLTU4LjI2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTU3LjU3LCAgIDIzLjA3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNDguMTUsICAgNTguMjYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzIyLjQzLCAgLTIzLjA3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNDguMTUsICAtNTguMjYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNjUuMjYsICAgMjAuNTUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzExNC43NCwgICAyMC41NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzNS4zOSwgIDI2LjUwLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNDQuNjMsICAgLTM5LjU4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNDQuNjEsICAyNi41MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTU1LjAwLCAgIC0zOC45NCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzM1LjM3LCAgMzkuNTgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzU1LjAwLCAgMzguOTQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zNS4zNywgICAtMzkuNTgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMjUuMDAsICAgLTM4Ljk0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE0NC42MywgIDM5LjU4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTI1LjAwLCAgMzguOTQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEzNS4zOSwgICAtMjYuNTAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNDQuNjEsICAgLTI2LjUwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTE0Ljk1LCAgIC00Ljc1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNS4yMywgIC0yNC44NiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy02NS4wNSwgICAtNC43NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEwMS4xNCwgIDY0LjYzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTc0Ljc3LCAgMjQuODYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEwMS4xNCwgICAtNjQuNjMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNzQuNzcsICAgLTI0Ljg2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNzguODYsICA2NC42MywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNS4yMywgICAyNC44NiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTc4Ljg2LCAgIC02NC42MywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMTQuOTUsICA0Ljc1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNjUuMDUsICA0Ljc1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMzUuODUsICA1Mi42NCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNjUuOTEsICAyOS40NiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE0NC4xNSwgIDUyLjY0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFszMS43NSwgIDIwLjgyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMTQuMDksICAgLTI5LjQ2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTMxLjc1LCAgIC0yMC44MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMTQuMDksICAyOS40NiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE0OC4yNSwgIDIwLjgyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNjUuOTEsICAgLTI5LjQ2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTQ4LjI1LCAgIC0yMC44MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zNS44NSwgICAtNTIuNjQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNDQuMTUsICAgLTUyLjY0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbODYuNDUsICAxMS41MiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTEuNTQsICAzLjQ4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTkzLjU1LCAgIDExLjUyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNi45MCwgIDc3Ljk1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNjguNDYsICAgLTMuNDgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNi45MCwgICAtNzcuOTUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTY4LjQ2LCAgMy40OCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNjMuMTAsICA3Ny45NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTExLjU0LCAgIC0zLjQ4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNjMuMTAsICAgLTc3Ljk1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTg2LjQ1LCAgIC0xMS41MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzkzLjU1LCAgLTExLjUyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTM1LjI0LCAgIDQuMDIsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs1LjY5LCAgIC00NS4xMCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy00NC43NiwgICA0LjAyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTg0LjM1LCAgIDQ0LjYyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNzQuMzEsICAgNDUuMTAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzg0LjM1LCAgLTQ0LjYyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3NC4zMSwgIC00NS4xMCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzk1LjY1LCAgNDQuNjIsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy01LjY5LCAgNDUuMTAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy05NS42NSwgICAtNDQuNjIsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTM1LjI0LCAgLTQuMDIsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzQ0Ljc2LCAgLTQuMDIsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMjkuODQsICAtMTguMTYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTU2Ljg2LCAgLTM3LjUwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNTAuMTYsICAtMTguMTYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTE3LjEyLCAgLTQ2Ljg1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTIzLjE0LCAgIDM3LjUwLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMTcuMTIsICAgNDYuODUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzIzLjE0LCAgLTM3LjUwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNjIuODgsICAtNDYuODUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTYuODYsICAgMzcuNTAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy02Mi44OCwgICA0Ni44NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTI5Ljg0LCAgIDE4LjE2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNTAuMTYsICAgMTguMTYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy03NC4xMCwgICAzMi44NywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTQ2LjEwLCAgIDEzLjMwLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMDUuOTAsICAgMzIuODcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzIyLjk3LCAgLTUzLjg4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMzMuOTAsICAtMTMuMzAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMjIuOTcsICAgNTMuODgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zMy45MCwgICAxMy4zMCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE1Ny4wMywgIC01My44OCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDYuMTAsICAtMTMuMzAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTcuMDMsICAgNTMuODgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzc0LjEwLCAgLTMyLjg3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEwNS45MCwgIC0zMi44NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMTkuOTIsICAtNS42NCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3My41MCwgIC0yOS43NiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzYwLjA4LCAgLTUuNjQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMDEuMjAsICAtNTkuNjAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNi41MCwgIDI5Ljc2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMDEuMjAsICAgNTkuNjAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzYuNTAsICAgLTI5Ljc2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNzguODAsICAtNTkuNjAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNzMuNTAsICAgMjkuNzYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy03OC44MCwgICA1OS42MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTE5LjkyLCAgIDUuNjQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNjAuMDgsICAgNS42NCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzczLjE0LCAgMTYuMTMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2LjgyLCAgMTYuMTgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMDYuODYsICAxNi4xMywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNDUuMDksICA2Ni44MywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTYzLjE4LCAgIC0xNi4xOCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy00NS4wOSwgICAtNjYuODMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTYzLjE4LCAgMTYuMTgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMzQuOTEsICA2Ni44MywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE2LjgyLCAgIC0xNi4xOCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEzNC45MSwgICAtNjYuODMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNzMuMTQsICAgLTE2LjEzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTA2Ljg2LCAgIC0xNi4xMywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMS43MCwgICAtNDMuMzgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTAyLjExLCAgNDUuMzgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2OC4zMCwgICAtNDMuMzgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMzMuOTgsICAgLTguNDcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy03Ny44OSwgICAtNDUuMzgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTMzLjk4LCAgOC40NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzc3Ljg5LCAgNDUuMzgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy00Ni4wMiwgICAtOC40NywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTAyLjExLCAgIC00NS4zOCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzQ2LjAyLCAgOC40NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzExLjcwLCAgNDMuMzgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNjguMzAsICA0My4zOCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTI0LjExLCAgIDMuNzMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNzAuOTQsICAgNjUuNjMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE1NS44OSwgICAzLjczLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbODUuOTIsICAtMjQuMDUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5LjA2LCAgIC02NS42MywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy04NS45MiwgICAyNC4wNSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTkuMDYsICA2NS42MywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTk0LjA4LCAgIC0yNC4wNSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNzAuOTQsICAtNjUuNjMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5NC4wOCwgIDI0LjA1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsyNC4xMSwgIC0zLjczLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTU1Ljg5LCAgLTMuNzMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMDQuNjAsICAgLTMuNjgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zLjgxLCAgLTE0LjU3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTc1LjQwLCAgIC0zLjY4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTA0LjMyLCAgNzQuOTUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNzYuMTksICAxNC41NywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTA0LjMyLCAgIC03NC45NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE3Ni4xOSwgICAtMTQuNTcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3NS42OCwgIDc0Ljk1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFszLjgxLCAgIDE0LjU3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNzUuNjgsICAgLTc0Ljk1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEwNC42MCwgIDMuNjgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3NS40MCwgIDMuNjgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTMuNzcsICAgLTMwLjMzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTUyLjkzLCAgIC01MC43NCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yNi4yMywgICAtMzAuMzMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTIzLjExLCAgMjIuNDMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMjcuMDcsICA1MC43NCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTIzLjExLCAgIC0yMi40MywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEyNy4wNywgICAtNTAuNzQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs1Ni44OSwgIDIyLjQzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs1Mi45MywgIDUwLjc0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNTYuODksICAgLTIyLjQzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE1My43NywgIDMwLjMzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsyNi4yMywgIDMwLjMzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFszNS45OSwgIC0zOS43NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy01NC43NywgICAzOC40NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE0NC4wMSwgIC0zOS43NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEzNS44MSwgICAyNi44NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEyNS4yMywgIC0zOC40NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMzUuODEsICAtMjYuODUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMjUuMjMsICAgMzguNDUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy00NC4xOSwgICAyNi44NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNTQuNzcsICAtMzguNDUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs0NC4xOSwgIC0yNi44NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zNS45OSwgICAzOS43NywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTQ0LjAxLCAgIDM5Ljc3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3MS44MiwgIC0yNS40MywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yNi41OCwgICAxNi4zNywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEwOC4xOCwgIC0yNS40MywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE0Ni43MiwgICA1OS4xMCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE1My40MiwgIC0xNi4zNywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDYuNzIsICAtNTkuMTAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTMuNDIsICAgMTYuMzcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zMy4yOCwgICA1OS4xMCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMjYuNTgsICAtMTYuMzcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFszMy4yOCwgIC01OS4xMCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy03MS44MiwgICAyNS40MywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTA4LjE4LCAgIDI1LjQzLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTM2LjU1LCAgMjYuNTIsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE0NC4wMywgICAtNDAuNTEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs0My40NSwgIDI2LjUyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNTUuNTAsICAgLTM3Ljk3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMzUuOTcsICA0MC41MSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNTUuNTAsICAzNy45NywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTM1Ljk3LCAgIC00MC41MSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEyNC41MCwgICAtMzcuOTcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTQ0LjAzLCAgNDAuNTEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMjQuNTAsICAzNy45NywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTM2LjU1LCAgIC0yNi41MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy00My40NSwgICAtMjYuNTIsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNi41MiwgIC0xLjA4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTcwLjU4LCAgODMuNDAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE3My40OCwgICAtMS4wOCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbOTEuMDksICAtNi41MiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTkuNDIsICAtODMuNDAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstOTEuMDksICAgNi41MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzkuNDIsICAgODMuNDAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy04OC45MSwgICAtNi41MiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTcwLjU4LCAgIC04My40MCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzg4LjkxLCAgNi41MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzYuNTIsICAgMS4wOCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNzMuNDgsICAxLjA4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTcxLjEzLCAgIDQwLjM4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMzguMDUsICAgMTQuMjYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEwOC44NywgICA0MC4zOCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMjAuODIsICAtNDYuMTIsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs0MS45NSwgIC0xNC4yNiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yMC44MiwgICA0Ni4xMiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTQxLjk1LCAgIDE0LjI2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTU5LjE4LCAgLTQ2LjEyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzOC4wNSwgIC0xNC4yNiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE1OS4xOCwgICA0Ni4xMiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNzEuMTMsICAtNDAuMzgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTA4Ljg3LCAgLTQwLjM4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE1My45NywgIC0yNy45NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMjkuNTcsICAtNTIuNTIsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsyNi4wMywgIC0yNy45NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMjAuNTksICAtMjIuODEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNTAuNDMsICAgNTIuNTIsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEyMC41OSwgICAyMi44MSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNTAuNDMsICAtNTIuNTIsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs1OS40MSwgIC0yMi44MSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEyOS41NywgICA1Mi41MiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTU5LjQxLCAgIDIyLjgxLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTMuOTcsICAgMjcuOTcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yNi4wMywgICAyNy45NywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTgwLjIzLCAgIDEzLjQ4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNjYuMzMsICAgOS40OSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzk5Ljc3LCAgMTMuNDgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzM1LjI5LCAgLTczLjQxLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTMuNjcsICAtOS40OSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTM1LjI5LCAgIDczLjQxLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTMuNjcsICAgOS40OSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDQuNzEsICAtNzMuNDEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTY2LjMzLCAgLTkuNDksICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE0NC43MSwgICA3My40MSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbODAuMjMsICAtMTMuNDgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstOTkuNzcsICAgLTEzLjQ4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNTUuNDMsICAtOS4wMCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEwLjg5LCAgIDM0LjA5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTI0LjU3LCAgLTkuMDAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEwNS42MCwgICA1NC40MSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE2OS4xMSwgIC0zNC4wOSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMDUuNjAsICAtNTQuNDEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNjkuMTEsICAgMzQuMDksICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy03NC40MCwgICA1NC40MSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTAuODksICAtMzQuMDksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3NC40MCwgIC01NC40MSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy01NS40MywgICA5LjAwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTI0LjU3LCAgIDkuMDAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs2OC4zMiwgIC03LjE0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNy42OCwgIDIxLjUxLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTExLjY4LCAgLTcuMTQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEwOC43NCwgICA2Ny4yMiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3Mi4zMiwgIC0yMS41MSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMDguNzQsICAtNjcuMjIsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNzIuMzIsICAgMjEuNTEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy03MS4yNiwgICA2Ny4yMiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNy42OCwgICAtMjEuNTEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3MS4yNiwgIC02Ny4yMiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy02OC4zMiwgICA3LjE0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTExLjY4LCAgIDcuMTQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTc0Ljk3LCAgMzYuMTIsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzk2Ljg1LCAgLTUzLjU4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNS4wMywgICAzNi4xMiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTUzLjc3LCAgIC00LjA2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs4My4xNSwgIDUzLjU4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs1My43NywgIDQuMDYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstODMuMTUsICAgLTUzLjU4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTI2LjIzLCAgIC00LjA2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstOTYuODUsICAgNTMuNTgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMjYuMjMsICA0LjA2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTc0Ljk3LCAgIC0zNi4xMiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy01LjAzLCAgLTM2LjEyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE0OS45MSwgIDE2LjI2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNDkuODEsICAgLTU2LjE2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMzAuMDksICAxNi4yNiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTcxLjM3LCAgIC0yOC43NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzMwLjE5LCAgNTYuMTYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzcxLjM3LCAgMjguNzcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zMC4xOSwgICAtNTYuMTYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMDguNjMsICAgLTI4Ljc3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE0OS44MSwgIDU2LjE2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTA4LjYzLCAgMjguNzcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE0OS45MSwgICAtMTYuMjYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMzAuMDksICAgLTE2LjI2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMi41MiwgICAtNTEuNDUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstODcuOTksICAgMzguNTAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNzcuNDgsICAtNTEuNDUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNDEuNDgsICAgMS41NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy05Mi4wMSwgICAtMzguNTAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTQxLjQ4LCAgLTEuNTcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzkyLjAxLCAgMzguNTAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0zOC41MiwgICAxLjU3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbODcuOTksICAtMzguNTAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFszOC41MiwgIC0xLjU3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMi41MiwgIDUxLjQ1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNzcuNDgsICAgNTEuNDUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2MS4xMiwgICAtOS45OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTI4LjU0LCAgIC02OC43MywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xOC44OCwgICAtOS45OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEwMC41NCwgIDE4LjU5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTUxLjQ2LCAgNjguNzMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEwMC41NCwgICAtMTguNTksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTEuNDYsICAgLTY4LjczLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNzkuNDYsICAxOC41OSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMjguNTQsICA2OC43MywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTc5LjQ2LCAgIC0xOC41OSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNjEuMTIsICA5Ljk4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTguODgsICA5Ljk4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTIuODQsICAyNC45NywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNjQuNDksICA2Mi4xMSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE2Ny4xNiwgIDI0Ljk3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs2NC40NywgIDExLjYyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMTUuNTEsICAgLTYyLjExLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTY0LjQ3LCAgIC0xMS42MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMTUuNTEsICA2Mi4xMSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTExNS41MywgIDExLjYyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNjQuNDksICAgLTYyLjExLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTE1LjUzLCAgIC0xMS42MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMi44NCwgICAtMjQuOTcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNjcuMTYsICAgLTI0Ljk3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNzQuMTMsICA0MS42NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNDIuNzYsICAxMS43OSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEwNS44NywgIDQxLjY1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNy4wOSwgIDQ1Ljk1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMzcuMjQsICAgLTExLjc5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3LjA5LCAgIC00NS45NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMzcuMjQsICAxMS43OSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE2Mi45MSwgIDQ1Ljk1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNDIuNzYsICAgLTExLjc5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTYyLjkxLCAgIC00NS45NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy03NC4xMywgICAtNDEuNjUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMDUuODcsICAgLTQxLjY1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTU0LjA0LCAgIDEuMjcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsyLjkwLCAgIC02NC4wMSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yNS45NiwgICAxLjI3LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTg4LjU5LCAgIDI1Ljk2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNzcuMTAsICAgNjQuMDEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzg4LjU5LCAgLTI1Ljk2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3Ny4xMCwgIC02NC4wMSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzkxLjQxLCAgMjUuOTYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yLjkwLCAgNjQuMDEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy05MS40MSwgICAtMjUuOTYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTU0LjA0LCAgLTEuMjcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzI1Ljk2LCAgLTEuMjcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgIFsyNC44MCwgIC0xMC40NiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yMy43NiwgICA2My4yMSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE1NS4yMCwgIC0xMC40NiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEwMS41MCwgICAyNC4zNiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE1Ni4yNCwgIC02My4yMSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMDEuNTAsICAtMjQuMzYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTYuMjQsICAgNjMuMjEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy03OC41MCwgICAyNC4zNiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMjMuNzYsICAtNjMuMjEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3OC41MCwgIC0yNC4zNiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yNC44MCwgICAxMC40NiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTU1LjIwLCAgIDEwLjQ2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTM0LjY0LCAgNjUuNDQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEwOC4wMSwgICAtMTYuOTgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs0NS4zNiwgIDY1LjQ0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTcuODAsICAgLTE3LjIwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNzEuOTksICAxNi45OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTcuODAsICAxNy4yMCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTcxLjk5LCAgIC0xNi45OCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2Mi4yMCwgICAtMTcuMjAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTA4LjAxLCAgMTYuOTgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNjIuMjAsICAxNy4yMCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTM0LjY0LCAgIC02NS40NCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy00NS4zNiwgICAtNjUuNDQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNzcuNjAsICAgNTQuODUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzg4LjMxLCAgLTM1LjEyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTIuNDAsICA1NC44NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTM1LjEzLCAgIDEuMzgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5MS42OSwgIDM1LjEyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFszNS4xMywgIC0xLjM4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstOTEuNjksICAgLTM1LjEyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTQ0Ljg3LCAgIDEuMzgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstODguMzEsICAgMzUuMTIsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDQuODcsICAtMS4zOCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3Ny42MCwgIC01NC44NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzIuNDAsICAgLTU0Ljg1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTU3LjkzLCAgIDgyLjAxLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs4Ni45OCwgIC03LjQwLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMjIuMDcsICAgODIuMDEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy03LjQxLCAgMi45OSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzkzLjAyLCAgNy40MCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzcuNDEsICAgLTIuOTksICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy05My4wMiwgICAtNy40MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTcyLjU5LCAgIDIuOTksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstODYuOTgsICAgNy40MCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNzIuNTksICAtMi45OSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE1Ny45MywgIC04Mi4wMSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzIyLjA3LCAgLTgyLjAxLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNDIuNDgsICAtMTMuMjEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTkuMTcsICAgNDUuODksICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMzcuNTIsICAtMTMuMjEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMDcuNjYsICAgNDEuMTEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNjAuODMsICAtNDUuODksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTA3LjY2LCAgLTQxLjExLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTYwLjgzLCAgIDQ1Ljg5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNzIuMzQsICAgNDEuMTEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE5LjE3LCAgLTQ1Ljg5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNzIuMzQsICAtNDEuMTEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNDIuNDgsICAgMTMuMjEsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEzNy41MiwgICAxMy4yMSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMjguNDgsICAxMC45MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMjEuOTksICA1OS42OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE1MS41MiwgIDEwLjkwLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3Ny42NSwgIDI3LjkyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTguMDEsICAgLTU5LjY4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTc3LjY1LCAgIC0yNy45MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNTguMDEsICA1OS42OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEwMi4zNSwgIDI3LjkyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMjEuOTksICAgLTU5LjY4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTAyLjM1LCAgIC0yNy45MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0yOC40OCwgICAtMTAuOTAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTEuNTIsICAgLTEwLjkwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTMzLjc5LCAgIDIxLjYxLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNDQuNTMsICAgNTAuNTksICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE0Ni4yMSwgICAyMS42MSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNjQuNTEsICAtMzEuMTQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFszNS40NywgIC01MC41OSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy02NC41MSwgICAzMS4xNCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTM1LjQ3LCAgIDUwLjU5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTE1LjQ5LCAgLTMxLjE0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE0NC41MywgIC01MC41OSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzExNS40OSwgICAzMS4xNCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMzMuNzksICAtMjEuNjEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTQ2LjIxLCAgLTIxLjYxLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3NS41MywgIC0zMS43NCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy05Ny4xOSwgICAtNTcuOTgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs0LjQ3LCAgIC0zMS43NCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMjEuODIsICAtMy44MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTgyLjgxLCAgIDU3Ljk4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMjEuODIsICAgMy44MCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzgyLjgxLCAgLTU3Ljk4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNTguMTgsICAtMy44MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbOTcuMTksICA1Ny45OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTU4LjE4LCAgIDMuODAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNzUuNTMsICAgMzEuNzQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy00LjQ3LCAgMzEuNzQsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzg5LjQwLCAgMTkuNDMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE5LjQzLCAgMC41NiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy05MC42MCwgICAxOS40MywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMS42OSwgICA3MC41NiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTYwLjU3LCAgIC0wLjU2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMS42OSwgIC03MC41NiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNjAuNTcsICAwLjU2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3OC4zMSwgIDcwLjU2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTkuNDMsICAgLTAuNTYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE3OC4zMSwgICAtNzAuNTYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstODkuNDAsICAgLTE5LjQzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbOTAuNjAsICAtMTkuNDMsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMjcuMjgsICAgLTI3Ljg4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzMC45MSwgIDUxLjc4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNTIuNzIsICAgLTI3Ljg4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTIwLjc2LCAgIC0yMy45MCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy00OS4wOSwgICAtNTEuNzgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTIwLjc2LCAgMjMuOTAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzQ5LjA5LCAgNTEuNzgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy01OS4yNCwgICAtMjMuOTAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMzAuOTEsICAgLTUxLjc4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNTkuMjQsICAyMy45MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMjcuMjgsICAyNy44OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE1Mi43MiwgIDI3Ljg4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMzkuOTAsICAgLTE1LjQ0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTIzLjIxLCAgIC00Ny41MCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy00MC4xMCwgICAtMTUuNDQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTA5Ljg1LCAgMzguMzgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNTYuNzksICA0Ny41MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTA5Ljg1LCAgIC0zOC4zOCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE1Ni43OSwgICAtNDcuNTAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs3MC4xNSwgIDM4LjM4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsyMy4yMSwgIDQ3LjUwLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNzAuMTUsICAgLTM4LjM4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzOS45MCwgIDE1LjQ0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs0MC4xMCwgIDE1LjQ0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMi4xNywgIC00My4zMywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy05Mi4yOSwgICA0Ni42MiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTc3LjgzLCAgIC00My4zMywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEzMy4zNSwgICAtMS41OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTg3LjcxLCAgIC00Ni42MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMzMuMzUsICAxLjU4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbODcuNzEsICA0Ni42MiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTQ2LjY1LCAgIC0xLjU4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs5Mi4yOSwgIC00Ni42MiwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzQ2LjY1LCAgMS41OCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzIuMTcsICAgNDMuMzMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNzcuODMsICA0My4zMywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNDEuMTIsICAyNy45NiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMzguOTEsICA0MS43MSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEzOC44OCwgIDI3Ljk2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs1NC44MywgIDM1LjUxLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNDEuMDksICAgLTQxLjcxLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTU0LjgzLCAgIC0zNS41MSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNDEuMDksICA0MS43MSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEyNS4xNywgIDM1LjUxLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMzguOTEsICAgLTQxLjcxLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTI1LjE3LCAgIC0zNS41MSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy00MS4xMiwgICAtMjcuOTYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMzguODgsICAgLTI3Ljk2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTEyNi42NywgIDEzLjc1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNjMuMDQsICAgLTM1LjQ2LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNTMuMzMsICAxMy43NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTY3LjczLCAgIC01MS4xOCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE2Ljk2LCAgMzUuNDYsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzY3LjczLCAgNTEuMTgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNi45NiwgICAtMzUuNDYsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMTIuMjcsICAgLTUxLjE4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE2My4wNCwgIDM1LjQ2LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTEyLjI3LCAgNTEuMTgsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEyNi42NywgICAtMTMuNzUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNTMuMzMsICAgLTEzLjc1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNi4wMiwgICAtMTUuNDIsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNjkuMTgsICAgNzMuNDcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xNzMuOTgsICAtMTUuNDIsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMDUuNTEsICAgNS44MCwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMTAuODIsICAtNzMuNDcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTA1LjUxLCAgLTUuODAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzExMC44MiwgICA3My40NywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTc0LjQ5LCAgIDUuODAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs2OS4xOCwgIC03My40NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzc0LjQ5LCAgLTUuODAsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy02LjAyLCAgMTUuNDIsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE3My45OCwgICAxNS40MiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTYwLjA4LCAgIDMzLjQ1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs2Mi43MSwgIC01MS42NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xOS45MiwgICAzMy40NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTU0LjkwLCAgIDE2LjUyLCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMTcuMjksICAgNTEuNjcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzU0LjkwLCAgLTE2LjUyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTExNy4yOSwgIC01MS42NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEyNS4xMCwgICAxNi41MiwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTYyLjcxLCAgIDUxLjY3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTI1LjEwLCAgLTE2LjUyLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE2MC4wOCwgIC0zMy40NSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzE5LjkyLCAgLTMzLjQ1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbODAuMzQsICA2LjUxLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNi42MSwgICA5LjU5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTk5LjY2LCAgIDYuNTEsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs1NS43NiwgIDc4LjM3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNzMuMzksICAgLTkuNTksICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy01NS43NiwgICAtNzguMzcsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTczLjM5LCAgOS41OSwgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMjQuMjQsICA3OC4zNywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTYuNjEsICAtOS41OSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTI0LjI0LCAgIC03OC4zNywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy04MC4zNCwgICAtNi41MSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbOTkuNjYsICAtNi41MSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNi4yNSwgICAyNC42NCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNzYuNjQsICA2NC42MywgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE3My43NSwgIDI0LjY0LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFs2NS4yMywgIDUuNjgsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxMDMuMzYsICAgLTY0LjYzLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTY1LjIzLCAgIC01LjY4LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTAzLjM2LCAgNjQuNjMsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMTQuNzcsICA1LjY4LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTc2LjY0LCAgIC02NC42MywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzExNC43NywgICAtNS42OCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTYuMjUsICAtMjQuNjQsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNzMuNzUsICAgLTI0LjY0LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNTEuNDEsICAtNjMuNDUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNjguNjcsICAgMTYuMTksICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMjguNTksICAtNjMuNDUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNjIuNjksICAgMjAuNDUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy0xMTEuMzMsICAtMTYuMTksICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTYyLjY5LCAgLTIwLjQ1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTExLjMzLCAgIDE2LjE5LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTcuMzEsICAgMjAuNDUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzY4LjY3LCAgLTE2LjE5LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbMTcuMzEsICAtMjAuNDUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstNTEuNDEsICAgNjMuNDUsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEyOC41OSwgICA2My40NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTUwLjYwLCAgIDI4Ljg1LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFsxNDQuNTEsICAgMzMuNzcsICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEyOS40MCwgICAyOC44NSwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNDkuMDQsICAtNDIuNjAsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFszNS40OSwgIC0zMy43NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWy00OS4wNCwgICA0Mi42MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTM1LjQ5LCAgIDMzLjc3LCAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTMwLjk2LCAgLTQyLjYwLCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbLTE0NC41MSwgIC0zMy43NywgICAxLjAwXSxcbiAgICAgICAgICAgICAgICAgICAgICAgWzEzMC45NiwgICA0Mi42MCwgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBbNTAuNjAsICAtMjguODUsICAgMS4wMF0sXG4gICAgICAgICAgICAgICAgICAgICAgIFstMTI5LjQwLCAgLTI4Ljg1LCAgIDEuMDBdLFxuICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICBcbiAgICAvLyBbZGlycyg6LDEpLCBkaXJzKDosMildID0gY2FydDJzcGgodmVjcyg6LDEpLCB2ZWNzKDosMiksIHZlY3MoOiwzKSk7XG4gICAgdmFyIGRpcnMgPSBzcGVha2VyUG9zW2RlZ3JlZS0xXTtcbiAgICByZXR1cm4gZGlyc1xufVxuXG4vLyBleHBvcnRzXG5tb2R1bGUuZXhwb3J0cy5nZXRBbWJpc29uaWNEZWNNdHggPSBnZXRBbWJpc29uaWNEZWNNdHg7XG5tb2R1bGUuZXhwb3J0cy5nZXRUZGVzaWduID0gZ2V0VGRlc2lnbjtcbm1vZHVsZS5leHBvcnRzLmRlZzJyYWQgPSBkZWcycmFkO1xubW9kdWxlLmV4cG9ydHMucmFkMmRlZyA9IHJhZDJkZWc7XG5tb2R1bGUuZXhwb3J0cy5jcmVhdGVOZWFyZXN0TG9va3VwID0gY3JlYXRlTmVhcmVzdExvb2t1cDtcbm1vZHVsZS5leHBvcnRzLmZpbmROZWFyZXN0ID0gZmluZE5lYXJlc3Q7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHsgXCJkZWZhdWx0XCI6IHJlcXVpcmUoXCJjb3JlLWpzL2xpYnJhcnkvZm4vb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKSwgX19lc01vZHVsZTogdHJ1ZSB9OyIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTsiLCJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0cy5fX2VzTW9kdWxlID0gdHJ1ZTtcblxudmFyIF9kZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCIuLi9jb3JlLWpzL29iamVjdC9kZWZpbmUtcHJvcGVydHlcIik7XG5cbnZhciBfZGVmaW5lUHJvcGVydHkyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGVmaW5lUHJvcGVydHkpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLmRlZmF1bHQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07XG4gICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgICBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7XG4gICAgICBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlO1xuICAgICAgKDAsIF9kZWZpbmVQcm9wZXJ0eTIuZGVmYXVsdCkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfTtcbn0oKTsiLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgJE9iamVjdCA9IHJlcXVpcmUoJy4uLy4uL21vZHVsZXMvX2NvcmUnKS5PYmplY3Q7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGRlZmluZVByb3BlcnR5KGl0LCBrZXksIGRlc2Mpe1xuICByZXR1cm4gJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBkZXNjKTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKXRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgZnVuY3Rpb24hJyk7XG4gIHJldHVybiBpdDtcbn07IiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgaWYoIWlzT2JqZWN0KGl0KSl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhbiBvYmplY3QhJyk7XG4gIHJldHVybiBpdDtcbn07IiwidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHt2ZXJzaW9uOiAnMi40LjAnfTtcbmlmKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpX19lID0gY29yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZiIsIi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4sIHRoYXQsIGxlbmd0aCl7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmKHRoYXQgPT09IHVuZGVmaW5lZClyZXR1cm4gZm47XG4gIHN3aXRjaChsZW5ndGgpe1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uKGEpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbihhLCBiKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24oYSwgYiwgYyl7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbigvKiAuLi5hcmdzICovKXtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07IiwiLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbigpe1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAnYScsIHtnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiA3OyB9fSkuYSAhPSA3O1xufSk7IiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0JylcbiAgLCBkb2N1bWVudCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50XG4gIC8vIGluIG9sZCBJRSB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCBpcyAnb2JqZWN0J1xuICAsIGlzID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBpcyA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXQpIDoge307XG59OyIsInZhciBnbG9iYWwgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGNvcmUgICAgICA9IHJlcXVpcmUoJy4vX2NvcmUnKVxuICAsIGN0eCAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgaGlkZSAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgUFJPVE9UWVBFID0gJ3Byb3RvdHlwZSc7XG5cbnZhciAkZXhwb3J0ID0gZnVuY3Rpb24odHlwZSwgbmFtZSwgc291cmNlKXtcbiAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkZcbiAgICAsIElTX0dMT0JBTCA9IHR5cGUgJiAkZXhwb3J0LkdcbiAgICAsIElTX1NUQVRJQyA9IHR5cGUgJiAkZXhwb3J0LlNcbiAgICAsIElTX1BST1RPICA9IHR5cGUgJiAkZXhwb3J0LlBcbiAgICAsIElTX0JJTkQgICA9IHR5cGUgJiAkZXhwb3J0LkJcbiAgICAsIElTX1dSQVAgICA9IHR5cGUgJiAkZXhwb3J0LldcbiAgICAsIGV4cG9ydHMgICA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pXG4gICAgLCBleHBQcm90byAgPSBleHBvcnRzW1BST1RPVFlQRV1cbiAgICAsIHRhcmdldCAgICA9IElTX0dMT0JBTCA/IGdsb2JhbCA6IElTX1NUQVRJQyA/IGdsb2JhbFtuYW1lXSA6IChnbG9iYWxbbmFtZV0gfHwge30pW1BST1RPVFlQRV1cbiAgICAsIGtleSwgb3duLCBvdXQ7XG4gIGlmKElTX0dMT0JBTClzb3VyY2UgPSBuYW1lO1xuICBmb3Ioa2V5IGluIHNvdXJjZSl7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICBpZihvd24gJiYga2V5IGluIGV4cG9ydHMpY29udGludWU7XG4gICAgLy8gZXhwb3J0IG5hdGl2ZSBvciBwYXNzZWRcbiAgICBvdXQgPSBvd24gPyB0YXJnZXRba2V5XSA6IHNvdXJjZVtrZXldO1xuICAgIC8vIHByZXZlbnQgZ2xvYmFsIHBvbGx1dGlvbiBmb3IgbmFtZXNwYWNlc1xuICAgIGV4cG9ydHNba2V5XSA9IElTX0dMT0JBTCAmJiB0eXBlb2YgdGFyZ2V0W2tleV0gIT0gJ2Z1bmN0aW9uJyA/IHNvdXJjZVtrZXldXG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICA6IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKVxuICAgIC8vIHdyYXAgZ2xvYmFsIGNvbnN0cnVjdG9ycyBmb3IgcHJldmVudCBjaGFuZ2UgdGhlbSBpbiBsaWJyYXJ5XG4gICAgOiBJU19XUkFQICYmIHRhcmdldFtrZXldID09IG91dCA/IChmdW5jdGlvbihDKXtcbiAgICAgIHZhciBGID0gZnVuY3Rpb24oYSwgYiwgYyl7XG4gICAgICAgIGlmKHRoaXMgaW5zdGFuY2VvZiBDKXtcbiAgICAgICAgICBzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7XG4gICAgICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgQztcbiAgICAgICAgICAgIGNhc2UgMTogcmV0dXJuIG5ldyBDKGEpO1xuICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gbmV3IEMoYSwgYik7XG4gICAgICAgICAgfSByZXR1cm4gbmV3IEMoYSwgYiwgYyk7XG4gICAgICAgIH0gcmV0dXJuIEMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIH07XG4gICAgICBGW1BST1RPVFlQRV0gPSBDW1BST1RPVFlQRV07XG4gICAgICByZXR1cm4gRjtcbiAgICAvLyBtYWtlIHN0YXRpYyB2ZXJzaW9ucyBmb3IgcHJvdG90eXBlIG1ldGhvZHNcbiAgICB9KShvdXQpIDogSVNfUFJPVE8gJiYgdHlwZW9mIG91dCA9PSAnZnVuY3Rpb24nID8gY3R4KEZ1bmN0aW9uLmNhbGwsIG91dCkgOiBvdXQ7XG4gICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLm1ldGhvZHMuJU5BTUUlXG4gICAgaWYoSVNfUFJPVE8pe1xuICAgICAgKGV4cG9ydHMudmlydHVhbCB8fCAoZXhwb3J0cy52aXJ0dWFsID0ge30pKVtrZXldID0gb3V0O1xuICAgICAgLy8gZXhwb3J0IHByb3RvIG1ldGhvZHMgdG8gY29yZS4lQ09OU1RSVUNUT1IlLnByb3RvdHlwZS4lTkFNRSVcbiAgICAgIGlmKHR5cGUgJiAkZXhwb3J0LlIgJiYgZXhwUHJvdG8gJiYgIWV4cFByb3RvW2tleV0paGlkZShleHBQcm90bywga2V5LCBvdXQpO1xuICAgIH1cbiAgfVxufTtcbi8vIHR5cGUgYml0bWFwXG4kZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuJGV4cG9ydC5HID0gMjsgICAvLyBnbG9iYWxcbiRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG4kZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG4kZXhwb3J0LkIgPSAxNjsgIC8vIGJpbmRcbiRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuJGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG4kZXhwb3J0LlIgPSAxMjg7IC8vIHJlYWwgcHJvdG8gbWV0aG9kIGZvciBgbGlicmFyeWAgXG5tb2R1bGUuZXhwb3J0cyA9ICRleHBvcnQ7IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjKXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gISFleGVjKCk7XG4gIH0gY2F0Y2goZSl7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn07IiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbnZhciBnbG9iYWwgPSBtb2R1bGUuZXhwb3J0cyA9IHR5cGVvZiB3aW5kb3cgIT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lk1hdGggPT0gTWF0aFxuICA/IHdpbmRvdyA6IHR5cGVvZiBzZWxmICE9ICd1bmRlZmluZWQnICYmIHNlbGYuTWF0aCA9PSBNYXRoID8gc2VsZiA6IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7XG5pZih0eXBlb2YgX19nID09ICdudW1iZXInKV9fZyA9IGdsb2JhbDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZiIsInZhciBkUCAgICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZnVuY3Rpb24ob2JqZWN0LCBrZXksIHZhbHVlKXtcbiAgcmV0dXJuIGRQLmYob2JqZWN0LCBrZXksIGNyZWF0ZURlc2MoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuICBvYmplY3Rba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gb2JqZWN0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9ICFyZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uKCl7XHJcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2RpdicpLCAnYScsIHtnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiA3OyB9fSkuYSAhPSA3O1xyXG59KTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07IiwidmFyIGFuT2JqZWN0ICAgICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4vX2llOC1kb20tZGVmaW5lJylcbiAgLCB0b1ByaW1pdGl2ZSAgICA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpXG4gICwgZFAgICAgICAgICAgICAgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbmV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKXtcbiAgYW5PYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgYW5PYmplY3QoQXR0cmlidXRlcyk7XG4gIGlmKElFOF9ET01fREVGSU5FKXRyeSB7XG4gICAgcmV0dXJuIGRQKE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoKGUpeyAvKiBlbXB0eSAqLyB9XG4gIGlmKCdnZXQnIGluIEF0dHJpYnV0ZXMgfHwgJ3NldCcgaW4gQXR0cmlidXRlcyl0aHJvdyBUeXBlRXJyb3IoJ0FjY2Vzc29ycyBub3Qgc3VwcG9ydGVkIScpO1xuICBpZigndmFsdWUnIGluIEF0dHJpYnV0ZXMpT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gIHJldHVybiBPO1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGJpdG1hcCwgdmFsdWUpe1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGUgIDogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGUgICAgOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlICAgICAgIDogdmFsdWVcbiAgfTtcbn07IiwiLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbi8vIGluc3RlYWQgb2YgdGhlIEVTNiBzcGVjIHZlcnNpb24sIHdlIGRpZG4ndCBpbXBsZW1lbnQgQEB0b1ByaW1pdGl2ZSBjYXNlXG4vLyBhbmQgdGhlIHNlY29uZCBhcmd1bWVudCAtIGZsYWcgLSBwcmVmZXJyZWQgdHlwZSBpcyBhIHN0cmluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgUyl7XG4gIGlmKCFpc09iamVjdChpdCkpcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICBpZih0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIGlmKCFTICYmIHR5cGVvZiAoZm4gPSBpdC50b1N0cmluZykgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKXJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07IiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcclxuLy8gMTkuMS4yLjQgLyAxNS4yLjMuNiBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcclxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSwgJ09iamVjdCcsIHtkZWZpbmVQcm9wZXJ0eTogcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZn0pOyIsIlwidXNlIHN0cmljdFwiXG5cbnZhciBjb252ZXhIdWxsMWQgPSByZXF1aXJlKCcuL2xpYi9jaDFkJylcbnZhciBjb252ZXhIdWxsMmQgPSByZXF1aXJlKCcuL2xpYi9jaDJkJylcbnZhciBjb252ZXhIdWxsbmQgPSByZXF1aXJlKCcuL2xpYi9jaG5kJylcblxubW9kdWxlLmV4cG9ydHMgPSBjb252ZXhIdWxsXG5cbmZ1bmN0aW9uIGNvbnZleEh1bGwocG9pbnRzKSB7XG4gIHZhciBuID0gcG9pbnRzLmxlbmd0aFxuICBpZihuID09PSAwKSB7XG4gICAgcmV0dXJuIFtdXG4gIH0gZWxzZSBpZihuID09PSAxKSB7XG4gICAgcmV0dXJuIFtbMF1dXG4gIH1cbiAgdmFyIGQgPSBwb2ludHNbMF0ubGVuZ3RoXG4gIGlmKGQgPT09IDApIHtcbiAgICByZXR1cm4gW11cbiAgfSBlbHNlIGlmKGQgPT09IDEpIHtcbiAgICByZXR1cm4gY29udmV4SHVsbDFkKHBvaW50cylcbiAgfSBlbHNlIGlmKGQgPT09IDIpIHtcbiAgICByZXR1cm4gY29udmV4SHVsbDJkKHBvaW50cylcbiAgfVxuICByZXR1cm4gY29udmV4SHVsbG5kKHBvaW50cywgZClcbn0iLCJcInVzZSBzdHJpY3RcIlxuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZleEh1bGwxZFxuXG5mdW5jdGlvbiBjb252ZXhIdWxsMWQocG9pbnRzKSB7XG4gIHZhciBsbyA9IDBcbiAgdmFyIGhpID0gMFxuICBmb3IodmFyIGk9MTsgaTxwb2ludHMubGVuZ3RoOyArK2kpIHtcbiAgICBpZihwb2ludHNbaV1bMF0gPCBwb2ludHNbbG9dWzBdKSB7XG4gICAgICBsbyA9IGlcbiAgICB9XG4gICAgaWYocG9pbnRzW2ldWzBdID4gcG9pbnRzW2hpXVswXSkge1xuICAgICAgaGkgPSBpXG4gICAgfVxuICB9XG4gIGlmKGxvIDwgaGkpIHtcbiAgICByZXR1cm4gW1tsb10sIFtoaV1dXG4gIH0gZWxzZSBpZihsbyA+IGhpKSB7XG4gICAgcmV0dXJuIFtbaGldLCBbbG9dXVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBbW2xvXV1cbiAgfVxufSIsIid1c2Ugc3RyaWN0J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNvbnZleEh1bGwyRFxuXG52YXIgbW9ub3RvbmVIdWxsID0gcmVxdWlyZSgnbW9ub3RvbmUtY29udmV4LWh1bGwtMmQnKVxuXG5mdW5jdGlvbiBjb252ZXhIdWxsMkQocG9pbnRzKSB7XG4gIHZhciBodWxsID0gbW9ub3RvbmVIdWxsKHBvaW50cylcbiAgdmFyIGggPSBodWxsLmxlbmd0aFxuICBpZihoIDw9IDIpIHtcbiAgICByZXR1cm4gW11cbiAgfVxuICB2YXIgZWRnZXMgPSBuZXcgQXJyYXkoaClcbiAgdmFyIGEgPSBodWxsW2gtMV1cbiAgZm9yKHZhciBpPTA7IGk8aDsgKytpKSB7XG4gICAgdmFyIGIgPSBodWxsW2ldXG4gICAgZWRnZXNbaV0gPSBbYSxiXVxuICAgIGEgPSBiXG4gIH1cbiAgcmV0dXJuIGVkZ2VzXG59XG4iLCIndXNlIHN0cmljdCdcblxubW9kdWxlLmV4cG9ydHMgPSBjb252ZXhIdWxsbkRcblxudmFyIGljaCA9IHJlcXVpcmUoJ2luY3JlbWVudGFsLWNvbnZleC1odWxsJylcbnZhciBhZmYgPSByZXF1aXJlKCdhZmZpbmUtaHVsbCcpXG5cbmZ1bmN0aW9uIHBlcm11dGUocG9pbnRzLCBmcm9udCkge1xuICB2YXIgbiA9IHBvaW50cy5sZW5ndGhcbiAgdmFyIG5wb2ludHMgPSBuZXcgQXJyYXkobilcbiAgZm9yKHZhciBpPTA7IGk8ZnJvbnQubGVuZ3RoOyArK2kpIHtcbiAgICBucG9pbnRzW2ldID0gcG9pbnRzW2Zyb250W2ldXVxuICB9XG4gIHZhciBwdHIgPSBmcm9udC5sZW5ndGhcbiAgZm9yKHZhciBpPTA7IGk8bjsgKytpKSB7XG4gICAgaWYoZnJvbnQuaW5kZXhPZihpKSA8IDApIHtcbiAgICAgIG5wb2ludHNbcHRyKytdID0gcG9pbnRzW2ldXG4gICAgfVxuICB9XG4gIHJldHVybiBucG9pbnRzXG59XG5cbmZ1bmN0aW9uIGludlBlcm11dGUoY2VsbHMsIGZyb250KSB7XG4gIHZhciBuYyA9IGNlbGxzLmxlbmd0aFxuICB2YXIgbmYgPSBmcm9udC5sZW5ndGhcbiAgZm9yKHZhciBpPTA7IGk8bmM7ICsraSkge1xuICAgIHZhciBjID0gY2VsbHNbaV1cbiAgICBmb3IodmFyIGo9MDsgajxjLmxlbmd0aDsgKytqKSB7XG4gICAgICB2YXIgeCA9IGNbal1cbiAgICAgIGlmKHggPCBuZikge1xuICAgICAgICBjW2pdID0gZnJvbnRbeF1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHggPSB4IC0gbmZcbiAgICAgICAgZm9yKHZhciBrPTA7IGs8bmY7ICsraykge1xuICAgICAgICAgIGlmKHggPj0gZnJvbnRba10pIHtcbiAgICAgICAgICAgIHggKz0gMVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjW2pdID0geFxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY2VsbHNcbn1cblxuZnVuY3Rpb24gY29udmV4SHVsbG5EKHBvaW50cywgZCkge1xuICB0cnkge1xuICAgIHJldHVybiBpY2gocG9pbnRzLCB0cnVlKVxuICB9IGNhdGNoKGUpIHtcbiAgICAvL0lmIHBvaW50IHNldCBpcyBkZWdlbmVyYXRlLCB0cnkgdG8gZmluZCBhIGJhc2lzIGFuZCByZXJ1biBpdFxuICAgIHZhciBhaCA9IGFmZihwb2ludHMpXG4gICAgaWYoYWgubGVuZ3RoIDw9IGQpIHtcbiAgICAgIC8vTm8gYmFzaXMsIG5vIHRyeVxuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICAgIHZhciBucG9pbnRzID0gcGVybXV0ZShwb2ludHMsIGFoKVxuICAgIHZhciBuaHVsbCAgID0gaWNoKG5wb2ludHMsIHRydWUpXG4gICAgcmV0dXJuIGludlBlcm11dGUobmh1bGwsIGFoKVxuICB9XG59IiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gYWZmaW5lSHVsbFxuXG52YXIgb3JpZW50ID0gcmVxdWlyZSgncm9idXN0LW9yaWVudGF0aW9uJylcblxuZnVuY3Rpb24gbGluZWFybHlJbmRlcGVuZGVudChwb2ludHMsIGQpIHtcbiAgdmFyIG5odWxsID0gbmV3IEFycmF5KGQrMSlcbiAgZm9yKHZhciBpPTA7IGk8cG9pbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgbmh1bGxbaV0gPSBwb2ludHNbaV1cbiAgfVxuICBmb3IodmFyIGk9MDsgaTw9cG9pbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgZm9yKHZhciBqPXBvaW50cy5sZW5ndGg7IGo8PWQ7ICsraikge1xuICAgICAgdmFyIHggPSBuZXcgQXJyYXkoZClcbiAgICAgIGZvcih2YXIgaz0wOyBrPGQ7ICsraykge1xuICAgICAgICB4W2tdID0gTWF0aC5wb3coaisxLWksIGspXG4gICAgICB9XG4gICAgICBuaHVsbFtqXSA9IHhcbiAgICB9XG4gICAgdmFyIG8gPSBvcmllbnQuYXBwbHkodm9pZCAwLCBuaHVsbClcbiAgICBpZihvKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZnVuY3Rpb24gYWZmaW5lSHVsbChwb2ludHMpIHtcbiAgdmFyIG4gPSBwb2ludHMubGVuZ3RoXG4gIGlmKG4gPT09IDApIHtcbiAgICByZXR1cm4gW11cbiAgfVxuICBpZihuID09PSAxKSB7XG4gICAgcmV0dXJuIFswXVxuICB9XG4gIHZhciBkID0gcG9pbnRzWzBdLmxlbmd0aFxuICB2YXIgZnJhbWUgPSBbIHBvaW50c1swXSBdXG4gIHZhciBpbmRleCA9IFsgMCBdXG4gIGZvcih2YXIgaT0xOyBpPG47ICsraSkge1xuICAgIGZyYW1lLnB1c2gocG9pbnRzW2ldKVxuICAgIGlmKCFsaW5lYXJseUluZGVwZW5kZW50KGZyYW1lLCBkKSkge1xuICAgICAgZnJhbWUucG9wKClcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGluZGV4LnB1c2goaSlcbiAgICBpZihpbmRleC5sZW5ndGggPT09IGQrMSkge1xuICAgICAgcmV0dXJuIGluZGV4XG4gICAgfVxuICB9XG4gIHJldHVybiBpbmRleFxufSIsIlwidXNlIHN0cmljdFwiXG5cbm1vZHVsZS5leHBvcnRzID0gZmFzdFR3b1N1bVxuXG5mdW5jdGlvbiBmYXN0VHdvU3VtKGEsIGIsIHJlc3VsdCkge1xuXHR2YXIgeCA9IGEgKyBiXG5cdHZhciBidiA9IHggLSBhXG5cdHZhciBhdiA9IHggLSBidlxuXHR2YXIgYnIgPSBiIC0gYnZcblx0dmFyIGFyID0gYSAtIGF2XG5cdGlmKHJlc3VsdCkge1xuXHRcdHJlc3VsdFswXSA9IGFyICsgYnJcblx0XHRyZXN1bHRbMV0gPSB4XG5cdFx0cmV0dXJuIHJlc3VsdFxuXHR9XG5cdHJldHVybiBbYXIrYnIsIHhdXG59IiwiXCJ1c2Ugc3RyaWN0XCJcblxudmFyIHR3b1Byb2R1Y3QgPSByZXF1aXJlKFwidHdvLXByb2R1Y3RcIilcbnZhciB0d29TdW0gPSByZXF1aXJlKFwidHdvLXN1bVwiKVxuXG5tb2R1bGUuZXhwb3J0cyA9IHNjYWxlTGluZWFyRXhwYW5zaW9uXG5cbmZ1bmN0aW9uIHNjYWxlTGluZWFyRXhwYW5zaW9uKGUsIHNjYWxlKSB7XG4gIHZhciBuID0gZS5sZW5ndGhcbiAgaWYobiA9PT0gMSkge1xuICAgIHZhciB0cyA9IHR3b1Byb2R1Y3QoZVswXSwgc2NhbGUpXG4gICAgaWYodHNbMF0pIHtcbiAgICAgIHJldHVybiB0c1xuICAgIH1cbiAgICByZXR1cm4gWyB0c1sxXSBdXG4gIH1cbiAgdmFyIGcgPSBuZXcgQXJyYXkoMiAqIG4pXG4gIHZhciBxID0gWzAuMSwgMC4xXVxuICB2YXIgdCA9IFswLjEsIDAuMV1cbiAgdmFyIGNvdW50ID0gMFxuICB0d29Qcm9kdWN0KGVbMF0sIHNjYWxlLCBxKVxuICBpZihxWzBdKSB7XG4gICAgZ1tjb3VudCsrXSA9IHFbMF1cbiAgfVxuICBmb3IodmFyIGk9MTsgaTxuOyArK2kpIHtcbiAgICB0d29Qcm9kdWN0KGVbaV0sIHNjYWxlLCB0KVxuICAgIHZhciBwcSA9IHFbMV1cbiAgICB0d29TdW0ocHEsIHRbMF0sIHEpXG4gICAgaWYocVswXSkge1xuICAgICAgZ1tjb3VudCsrXSA9IHFbMF1cbiAgICB9XG4gICAgdmFyIGEgPSB0WzFdXG4gICAgdmFyIGIgPSBxWzFdXG4gICAgdmFyIHggPSBhICsgYlxuICAgIHZhciBidiA9IHggLSBhXG4gICAgdmFyIHkgPSBiIC0gYnZcbiAgICBxWzFdID0geFxuICAgIGlmKHkpIHtcbiAgICAgIGdbY291bnQrK10gPSB5XG4gICAgfVxuICB9XG4gIGlmKHFbMV0pIHtcbiAgICBnW2NvdW50KytdID0gcVsxXVxuICB9XG4gIGlmKGNvdW50ID09PSAwKSB7XG4gICAgZ1tjb3VudCsrXSA9IDAuMFxuICB9XG4gIGcubGVuZ3RoID0gY291bnRcbiAgcmV0dXJuIGdcbn0iLCJcInVzZSBzdHJpY3RcIlxuXG5tb2R1bGUuZXhwb3J0cyA9IHJvYnVzdFN1YnRyYWN0XG5cbi8vRWFzeSBjYXNlOiBBZGQgdHdvIHNjYWxhcnNcbmZ1bmN0aW9uIHNjYWxhclNjYWxhcihhLCBiKSB7XG4gIHZhciB4ID0gYSArIGJcbiAgdmFyIGJ2ID0geCAtIGFcbiAgdmFyIGF2ID0geCAtIGJ2XG4gIHZhciBiciA9IGIgLSBidlxuICB2YXIgYXIgPSBhIC0gYXZcbiAgdmFyIHkgPSBhciArIGJyXG4gIGlmKHkpIHtcbiAgICByZXR1cm4gW3ksIHhdXG4gIH1cbiAgcmV0dXJuIFt4XVxufVxuXG5mdW5jdGlvbiByb2J1c3RTdWJ0cmFjdChlLCBmKSB7XG4gIHZhciBuZSA9IGUubGVuZ3RofDBcbiAgdmFyIG5mID0gZi5sZW5ndGh8MFxuICBpZihuZSA9PT0gMSAmJiBuZiA9PT0gMSkge1xuICAgIHJldHVybiBzY2FsYXJTY2FsYXIoZVswXSwgLWZbMF0pXG4gIH1cbiAgdmFyIG4gPSBuZSArIG5mXG4gIHZhciBnID0gbmV3IEFycmF5KG4pXG4gIHZhciBjb3VudCA9IDBcbiAgdmFyIGVwdHIgPSAwXG4gIHZhciBmcHRyID0gMFxuICB2YXIgYWJzID0gTWF0aC5hYnNcbiAgdmFyIGVpID0gZVtlcHRyXVxuICB2YXIgZWEgPSBhYnMoZWkpXG4gIHZhciBmaSA9IC1mW2ZwdHJdXG4gIHZhciBmYSA9IGFicyhmaSlcbiAgdmFyIGEsIGJcbiAgaWYoZWEgPCBmYSkge1xuICAgIGIgPSBlaVxuICAgIGVwdHIgKz0gMVxuICAgIGlmKGVwdHIgPCBuZSkge1xuICAgICAgZWkgPSBlW2VwdHJdXG4gICAgICBlYSA9IGFicyhlaSlcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYiA9IGZpXG4gICAgZnB0ciArPSAxXG4gICAgaWYoZnB0ciA8IG5mKSB7XG4gICAgICBmaSA9IC1mW2ZwdHJdXG4gICAgICBmYSA9IGFicyhmaSlcbiAgICB9XG4gIH1cbiAgaWYoKGVwdHIgPCBuZSAmJiBlYSA8IGZhKSB8fCAoZnB0ciA+PSBuZikpIHtcbiAgICBhID0gZWlcbiAgICBlcHRyICs9IDFcbiAgICBpZihlcHRyIDwgbmUpIHtcbiAgICAgIGVpID0gZVtlcHRyXVxuICAgICAgZWEgPSBhYnMoZWkpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGEgPSBmaVxuICAgIGZwdHIgKz0gMVxuICAgIGlmKGZwdHIgPCBuZikge1xuICAgICAgZmkgPSAtZltmcHRyXVxuICAgICAgZmEgPSBhYnMoZmkpXG4gICAgfVxuICB9XG4gIHZhciB4ID0gYSArIGJcbiAgdmFyIGJ2ID0geCAtIGFcbiAgdmFyIHkgPSBiIC0gYnZcbiAgdmFyIHEwID0geVxuICB2YXIgcTEgPSB4XG4gIHZhciBfeCwgX2J2LCBfYXYsIF9iciwgX2FyXG4gIHdoaWxlKGVwdHIgPCBuZSAmJiBmcHRyIDwgbmYpIHtcbiAgICBpZihlYSA8IGZhKSB7XG4gICAgICBhID0gZWlcbiAgICAgIGVwdHIgKz0gMVxuICAgICAgaWYoZXB0ciA8IG5lKSB7XG4gICAgICAgIGVpID0gZVtlcHRyXVxuICAgICAgICBlYSA9IGFicyhlaSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYSA9IGZpXG4gICAgICBmcHRyICs9IDFcbiAgICAgIGlmKGZwdHIgPCBuZikge1xuICAgICAgICBmaSA9IC1mW2ZwdHJdXG4gICAgICAgIGZhID0gYWJzKGZpKVxuICAgICAgfVxuICAgIH1cbiAgICBiID0gcTBcbiAgICB4ID0gYSArIGJcbiAgICBidiA9IHggLSBhXG4gICAgeSA9IGIgLSBidlxuICAgIGlmKHkpIHtcbiAgICAgIGdbY291bnQrK10gPSB5XG4gICAgfVxuICAgIF94ID0gcTEgKyB4XG4gICAgX2J2ID0gX3ggLSBxMVxuICAgIF9hdiA9IF94IC0gX2J2XG4gICAgX2JyID0geCAtIF9idlxuICAgIF9hciA9IHExIC0gX2F2XG4gICAgcTAgPSBfYXIgKyBfYnJcbiAgICBxMSA9IF94XG4gIH1cbiAgd2hpbGUoZXB0ciA8IG5lKSB7XG4gICAgYSA9IGVpXG4gICAgYiA9IHEwXG4gICAgeCA9IGEgKyBiXG4gICAgYnYgPSB4IC0gYVxuICAgIHkgPSBiIC0gYnZcbiAgICBpZih5KSB7XG4gICAgICBnW2NvdW50KytdID0geVxuICAgIH1cbiAgICBfeCA9IHExICsgeFxuICAgIF9idiA9IF94IC0gcTFcbiAgICBfYXYgPSBfeCAtIF9idlxuICAgIF9iciA9IHggLSBfYnZcbiAgICBfYXIgPSBxMSAtIF9hdlxuICAgIHEwID0gX2FyICsgX2JyXG4gICAgcTEgPSBfeFxuICAgIGVwdHIgKz0gMVxuICAgIGlmKGVwdHIgPCBuZSkge1xuICAgICAgZWkgPSBlW2VwdHJdXG4gICAgfVxuICB9XG4gIHdoaWxlKGZwdHIgPCBuZikge1xuICAgIGEgPSBmaVxuICAgIGIgPSBxMFxuICAgIHggPSBhICsgYlxuICAgIGJ2ID0geCAtIGFcbiAgICB5ID0gYiAtIGJ2XG4gICAgaWYoeSkge1xuICAgICAgZ1tjb3VudCsrXSA9IHlcbiAgICB9IFxuICAgIF94ID0gcTEgKyB4XG4gICAgX2J2ID0gX3ggLSBxMVxuICAgIF9hdiA9IF94IC0gX2J2XG4gICAgX2JyID0geCAtIF9idlxuICAgIF9hciA9IHExIC0gX2F2XG4gICAgcTAgPSBfYXIgKyBfYnJcbiAgICBxMSA9IF94XG4gICAgZnB0ciArPSAxXG4gICAgaWYoZnB0ciA8IG5mKSB7XG4gICAgICBmaSA9IC1mW2ZwdHJdXG4gICAgfVxuICB9XG4gIGlmKHEwKSB7XG4gICAgZ1tjb3VudCsrXSA9IHEwXG4gIH1cbiAgaWYocTEpIHtcbiAgICBnW2NvdW50KytdID0gcTFcbiAgfVxuICBpZighY291bnQpIHtcbiAgICBnW2NvdW50KytdID0gMC4wICBcbiAgfVxuICBnLmxlbmd0aCA9IGNvdW50XG4gIHJldHVybiBnXG59IiwiXCJ1c2Ugc3RyaWN0XCJcblxubW9kdWxlLmV4cG9ydHMgPSBsaW5lYXJFeHBhbnNpb25TdW1cblxuLy9FYXN5IGNhc2U6IEFkZCB0d28gc2NhbGFyc1xuZnVuY3Rpb24gc2NhbGFyU2NhbGFyKGEsIGIpIHtcbiAgdmFyIHggPSBhICsgYlxuICB2YXIgYnYgPSB4IC0gYVxuICB2YXIgYXYgPSB4IC0gYnZcbiAgdmFyIGJyID0gYiAtIGJ2XG4gIHZhciBhciA9IGEgLSBhdlxuICB2YXIgeSA9IGFyICsgYnJcbiAgaWYoeSkge1xuICAgIHJldHVybiBbeSwgeF1cbiAgfVxuICByZXR1cm4gW3hdXG59XG5cbmZ1bmN0aW9uIGxpbmVhckV4cGFuc2lvblN1bShlLCBmKSB7XG4gIHZhciBuZSA9IGUubGVuZ3RofDBcbiAgdmFyIG5mID0gZi5sZW5ndGh8MFxuICBpZihuZSA9PT0gMSAmJiBuZiA9PT0gMSkge1xuICAgIHJldHVybiBzY2FsYXJTY2FsYXIoZVswXSwgZlswXSlcbiAgfVxuICB2YXIgbiA9IG5lICsgbmZcbiAgdmFyIGcgPSBuZXcgQXJyYXkobilcbiAgdmFyIGNvdW50ID0gMFxuICB2YXIgZXB0ciA9IDBcbiAgdmFyIGZwdHIgPSAwXG4gIHZhciBhYnMgPSBNYXRoLmFic1xuICB2YXIgZWkgPSBlW2VwdHJdXG4gIHZhciBlYSA9IGFicyhlaSlcbiAgdmFyIGZpID0gZltmcHRyXVxuICB2YXIgZmEgPSBhYnMoZmkpXG4gIHZhciBhLCBiXG4gIGlmKGVhIDwgZmEpIHtcbiAgICBiID0gZWlcbiAgICBlcHRyICs9IDFcbiAgICBpZihlcHRyIDwgbmUpIHtcbiAgICAgIGVpID0gZVtlcHRyXVxuICAgICAgZWEgPSBhYnMoZWkpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGIgPSBmaVxuICAgIGZwdHIgKz0gMVxuICAgIGlmKGZwdHIgPCBuZikge1xuICAgICAgZmkgPSBmW2ZwdHJdXG4gICAgICBmYSA9IGFicyhmaSlcbiAgICB9XG4gIH1cbiAgaWYoKGVwdHIgPCBuZSAmJiBlYSA8IGZhKSB8fCAoZnB0ciA+PSBuZikpIHtcbiAgICBhID0gZWlcbiAgICBlcHRyICs9IDFcbiAgICBpZihlcHRyIDwgbmUpIHtcbiAgICAgIGVpID0gZVtlcHRyXVxuICAgICAgZWEgPSBhYnMoZWkpXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGEgPSBmaVxuICAgIGZwdHIgKz0gMVxuICAgIGlmKGZwdHIgPCBuZikge1xuICAgICAgZmkgPSBmW2ZwdHJdXG4gICAgICBmYSA9IGFicyhmaSlcbiAgICB9XG4gIH1cbiAgdmFyIHggPSBhICsgYlxuICB2YXIgYnYgPSB4IC0gYVxuICB2YXIgeSA9IGIgLSBidlxuICB2YXIgcTAgPSB5XG4gIHZhciBxMSA9IHhcbiAgdmFyIF94LCBfYnYsIF9hdiwgX2JyLCBfYXJcbiAgd2hpbGUoZXB0ciA8IG5lICYmIGZwdHIgPCBuZikge1xuICAgIGlmKGVhIDwgZmEpIHtcbiAgICAgIGEgPSBlaVxuICAgICAgZXB0ciArPSAxXG4gICAgICBpZihlcHRyIDwgbmUpIHtcbiAgICAgICAgZWkgPSBlW2VwdHJdXG4gICAgICAgIGVhID0gYWJzKGVpKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhID0gZmlcbiAgICAgIGZwdHIgKz0gMVxuICAgICAgaWYoZnB0ciA8IG5mKSB7XG4gICAgICAgIGZpID0gZltmcHRyXVxuICAgICAgICBmYSA9IGFicyhmaSlcbiAgICAgIH1cbiAgICB9XG4gICAgYiA9IHEwXG4gICAgeCA9IGEgKyBiXG4gICAgYnYgPSB4IC0gYVxuICAgIHkgPSBiIC0gYnZcbiAgICBpZih5KSB7XG4gICAgICBnW2NvdW50KytdID0geVxuICAgIH1cbiAgICBfeCA9IHExICsgeFxuICAgIF9idiA9IF94IC0gcTFcbiAgICBfYXYgPSBfeCAtIF9idlxuICAgIF9iciA9IHggLSBfYnZcbiAgICBfYXIgPSBxMSAtIF9hdlxuICAgIHEwID0gX2FyICsgX2JyXG4gICAgcTEgPSBfeFxuICB9XG4gIHdoaWxlKGVwdHIgPCBuZSkge1xuICAgIGEgPSBlaVxuICAgIGIgPSBxMFxuICAgIHggPSBhICsgYlxuICAgIGJ2ID0geCAtIGFcbiAgICB5ID0gYiAtIGJ2XG4gICAgaWYoeSkge1xuICAgICAgZ1tjb3VudCsrXSA9IHlcbiAgICB9XG4gICAgX3ggPSBxMSArIHhcbiAgICBfYnYgPSBfeCAtIHExXG4gICAgX2F2ID0gX3ggLSBfYnZcbiAgICBfYnIgPSB4IC0gX2J2XG4gICAgX2FyID0gcTEgLSBfYXZcbiAgICBxMCA9IF9hciArIF9iclxuICAgIHExID0gX3hcbiAgICBlcHRyICs9IDFcbiAgICBpZihlcHRyIDwgbmUpIHtcbiAgICAgIGVpID0gZVtlcHRyXVxuICAgIH1cbiAgfVxuICB3aGlsZShmcHRyIDwgbmYpIHtcbiAgICBhID0gZmlcbiAgICBiID0gcTBcbiAgICB4ID0gYSArIGJcbiAgICBidiA9IHggLSBhXG4gICAgeSA9IGIgLSBidlxuICAgIGlmKHkpIHtcbiAgICAgIGdbY291bnQrK10gPSB5XG4gICAgfSBcbiAgICBfeCA9IHExICsgeFxuICAgIF9idiA9IF94IC0gcTFcbiAgICBfYXYgPSBfeCAtIF9idlxuICAgIF9iciA9IHggLSBfYnZcbiAgICBfYXIgPSBxMSAtIF9hdlxuICAgIHEwID0gX2FyICsgX2JyXG4gICAgcTEgPSBfeFxuICAgIGZwdHIgKz0gMVxuICAgIGlmKGZwdHIgPCBuZikge1xuICAgICAgZmkgPSBmW2ZwdHJdXG4gICAgfVxuICB9XG4gIGlmKHEwKSB7XG4gICAgZ1tjb3VudCsrXSA9IHEwXG4gIH1cbiAgaWYocTEpIHtcbiAgICBnW2NvdW50KytdID0gcTFcbiAgfVxuICBpZighY291bnQpIHtcbiAgICBnW2NvdW50KytdID0gMC4wICBcbiAgfVxuICBnLmxlbmd0aCA9IGNvdW50XG4gIHJldHVybiBnXG59IiwiXCJ1c2Ugc3RyaWN0XCJcblxubW9kdWxlLmV4cG9ydHMgPSB0d29Qcm9kdWN0XG5cbnZhciBTUExJVFRFUiA9ICsoTWF0aC5wb3coMiwgMjcpICsgMS4wKVxuXG5mdW5jdGlvbiB0d29Qcm9kdWN0KGEsIGIsIHJlc3VsdCkge1xuICB2YXIgeCA9IGEgKiBiXG5cbiAgdmFyIGMgPSBTUExJVFRFUiAqIGFcbiAgdmFyIGFiaWcgPSBjIC0gYVxuICB2YXIgYWhpID0gYyAtIGFiaWdcbiAgdmFyIGFsbyA9IGEgLSBhaGlcblxuICB2YXIgZCA9IFNQTElUVEVSICogYlxuICB2YXIgYmJpZyA9IGQgLSBiXG4gIHZhciBiaGkgPSBkIC0gYmJpZ1xuICB2YXIgYmxvID0gYiAtIGJoaVxuXG4gIHZhciBlcnIxID0geCAtIChhaGkgKiBiaGkpXG4gIHZhciBlcnIyID0gZXJyMSAtIChhbG8gKiBiaGkpXG4gIHZhciBlcnIzID0gZXJyMiAtIChhaGkgKiBibG8pXG5cbiAgdmFyIHkgPSBhbG8gKiBibG8gLSBlcnIzXG5cbiAgaWYocmVzdWx0KSB7XG4gICAgcmVzdWx0WzBdID0geVxuICAgIHJlc3VsdFsxXSA9IHhcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICByZXR1cm4gWyB5LCB4IF1cbn0iLCJcInVzZSBzdHJpY3RcIlxuXG52YXIgdHdvUHJvZHVjdCA9IHJlcXVpcmUoXCJ0d28tcHJvZHVjdFwiKVxudmFyIHJvYnVzdFN1bSA9IHJlcXVpcmUoXCJyb2J1c3Qtc3VtXCIpXG52YXIgcm9idXN0U2NhbGUgPSByZXF1aXJlKFwicm9idXN0LXNjYWxlXCIpXG52YXIgcm9idXN0U3VidHJhY3QgPSByZXF1aXJlKFwicm9idXN0LXN1YnRyYWN0XCIpXG5cbnZhciBOVU1fRVhQQU5EID0gNVxuXG52YXIgRVBTSUxPTiAgICAgPSAxLjExMDIyMzAyNDYyNTE1NjVlLTE2XG52YXIgRVJSQk9VTkQzICAgPSAoMy4wICsgMTYuMCAqIEVQU0lMT04pICogRVBTSUxPTlxudmFyIEVSUkJPVU5ENCAgID0gKDcuMCArIDU2LjAgKiBFUFNJTE9OKSAqIEVQU0lMT05cblxuZnVuY3Rpb24gY29mYWN0b3IobSwgYykge1xuICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5KG0ubGVuZ3RoLTEpXG4gIGZvcih2YXIgaT0xOyBpPG0ubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgciA9IHJlc3VsdFtpLTFdID0gbmV3IEFycmF5KG0ubGVuZ3RoLTEpXG4gICAgZm9yKHZhciBqPTAsaz0wOyBqPG0ubGVuZ3RoOyArK2opIHtcbiAgICAgIGlmKGogPT09IGMpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIHJbaysrXSA9IG1baV1bal1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBtYXRyaXgobikge1xuICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5KG4pXG4gIGZvcih2YXIgaT0wOyBpPG47ICsraSkge1xuICAgIHJlc3VsdFtpXSA9IG5ldyBBcnJheShuKVxuICAgIGZvcih2YXIgaj0wOyBqPG47ICsraikge1xuICAgICAgcmVzdWx0W2ldW2pdID0gW1wibVwiLCBqLCBcIltcIiwgKG4taS0xKSwgXCJdXCJdLmpvaW4oXCJcIilcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBzaWduKG4pIHtcbiAgaWYobiAmIDEpIHtcbiAgICByZXR1cm4gXCItXCJcbiAgfVxuICByZXR1cm4gXCJcIlxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVN1bShleHByKSB7XG4gIGlmKGV4cHIubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGV4cHJbMF1cbiAgfSBlbHNlIGlmKGV4cHIubGVuZ3RoID09PSAyKSB7XG4gICAgcmV0dXJuIFtcInN1bShcIiwgZXhwclswXSwgXCIsXCIsIGV4cHJbMV0sIFwiKVwiXS5qb2luKFwiXCIpXG4gIH0gZWxzZSB7XG4gICAgdmFyIG0gPSBleHByLmxlbmd0aD4+MVxuICAgIHJldHVybiBbXCJzdW0oXCIsIGdlbmVyYXRlU3VtKGV4cHIuc2xpY2UoMCwgbSkpLCBcIixcIiwgZ2VuZXJhdGVTdW0oZXhwci5zbGljZShtKSksIFwiKVwiXS5qb2luKFwiXCIpXG4gIH1cbn1cblxuZnVuY3Rpb24gZGV0ZXJtaW5hbnQobSkge1xuICBpZihtLmxlbmd0aCA9PT0gMikge1xuICAgIHJldHVybiBbW1wic3VtKHByb2QoXCIsIG1bMF1bMF0sIFwiLFwiLCBtWzFdWzFdLCBcIikscHJvZCgtXCIsIG1bMF1bMV0sIFwiLFwiLCBtWzFdWzBdLCBcIikpXCJdLmpvaW4oXCJcIildXG4gIH0gZWxzZSB7XG4gICAgdmFyIGV4cHIgPSBbXVxuICAgIGZvcih2YXIgaT0wOyBpPG0ubGVuZ3RoOyArK2kpIHtcbiAgICAgIGV4cHIucHVzaChbXCJzY2FsZShcIiwgZ2VuZXJhdGVTdW0oZGV0ZXJtaW5hbnQoY29mYWN0b3IobSwgaSkpKSwgXCIsXCIsIHNpZ24oaSksIG1bMF1baV0sIFwiKVwiXS5qb2luKFwiXCIpKVxuICAgIH1cbiAgICByZXR1cm4gZXhwclxuICB9XG59XG5cbmZ1bmN0aW9uIG9yaWVudGF0aW9uKG4pIHtcbiAgdmFyIHBvcyA9IFtdXG4gIHZhciBuZWcgPSBbXVxuICB2YXIgbSA9IG1hdHJpeChuKVxuICB2YXIgYXJncyA9IFtdXG4gIGZvcih2YXIgaT0wOyBpPG47ICsraSkge1xuICAgIGlmKChpJjEpPT09MCkge1xuICAgICAgcG9zLnB1c2guYXBwbHkocG9zLCBkZXRlcm1pbmFudChjb2ZhY3RvcihtLCBpKSkpXG4gICAgfSBlbHNlIHtcbiAgICAgIG5lZy5wdXNoLmFwcGx5KG5lZywgZGV0ZXJtaW5hbnQoY29mYWN0b3IobSwgaSkpKVxuICAgIH1cbiAgICBhcmdzLnB1c2goXCJtXCIgKyBpKVxuICB9XG4gIHZhciBwb3NFeHByID0gZ2VuZXJhdGVTdW0ocG9zKVxuICB2YXIgbmVnRXhwciA9IGdlbmVyYXRlU3VtKG5lZylcbiAgdmFyIGZ1bmNOYW1lID0gXCJvcmllbnRhdGlvblwiICsgbiArIFwiRXhhY3RcIlxuICB2YXIgY29kZSA9IFtcImZ1bmN0aW9uIFwiLCBmdW5jTmFtZSwgXCIoXCIsIGFyZ3Muam9pbigpLCBcIil7dmFyIHA9XCIsIHBvc0V4cHIsIFwiLG49XCIsIG5lZ0V4cHIsIFwiLGQ9c3ViKHAsbik7XFxcbnJldHVybiBkW2QubGVuZ3RoLTFdO307cmV0dXJuIFwiLCBmdW5jTmFtZV0uam9pbihcIlwiKVxuICB2YXIgcHJvYyA9IG5ldyBGdW5jdGlvbihcInN1bVwiLCBcInByb2RcIiwgXCJzY2FsZVwiLCBcInN1YlwiLCBjb2RlKVxuICByZXR1cm4gcHJvYyhyb2J1c3RTdW0sIHR3b1Byb2R1Y3QsIHJvYnVzdFNjYWxlLCByb2J1c3RTdWJ0cmFjdClcbn1cblxudmFyIG9yaWVudGF0aW9uM0V4YWN0ID0gb3JpZW50YXRpb24oMylcbnZhciBvcmllbnRhdGlvbjRFeGFjdCA9IG9yaWVudGF0aW9uKDQpXG5cbnZhciBDQUNIRUQgPSBbXG4gIGZ1bmN0aW9uIG9yaWVudGF0aW9uMCgpIHsgcmV0dXJuIDAgfSxcbiAgZnVuY3Rpb24gb3JpZW50YXRpb24xKCkgeyByZXR1cm4gMCB9LFxuICBmdW5jdGlvbiBvcmllbnRhdGlvbjIoYSwgYikgeyBcbiAgICByZXR1cm4gYlswXSAtIGFbMF1cbiAgfSxcbiAgZnVuY3Rpb24gb3JpZW50YXRpb24zKGEsIGIsIGMpIHtcbiAgICB2YXIgbCA9IChhWzFdIC0gY1sxXSkgKiAoYlswXSAtIGNbMF0pXG4gICAgdmFyIHIgPSAoYVswXSAtIGNbMF0pICogKGJbMV0gLSBjWzFdKVxuICAgIHZhciBkZXQgPSBsIC0gclxuICAgIHZhciBzXG4gICAgaWYobCA+IDApIHtcbiAgICAgIGlmKHIgPD0gMCkge1xuICAgICAgICByZXR1cm4gZGV0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzID0gbCArIHJcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYobCA8IDApIHtcbiAgICAgIGlmKHIgPj0gMCkge1xuICAgICAgICByZXR1cm4gZGV0XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzID0gLShsICsgcilcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGRldFxuICAgIH1cbiAgICB2YXIgdG9sID0gRVJSQk9VTkQzICogc1xuICAgIGlmKGRldCA+PSB0b2wgfHwgZGV0IDw9IC10b2wpIHtcbiAgICAgIHJldHVybiBkZXRcbiAgICB9XG4gICAgcmV0dXJuIG9yaWVudGF0aW9uM0V4YWN0KGEsIGIsIGMpXG4gIH0sXG4gIGZ1bmN0aW9uIG9yaWVudGF0aW9uNChhLGIsYyxkKSB7XG4gICAgdmFyIGFkeCA9IGFbMF0gLSBkWzBdXG4gICAgdmFyIGJkeCA9IGJbMF0gLSBkWzBdXG4gICAgdmFyIGNkeCA9IGNbMF0gLSBkWzBdXG4gICAgdmFyIGFkeSA9IGFbMV0gLSBkWzFdXG4gICAgdmFyIGJkeSA9IGJbMV0gLSBkWzFdXG4gICAgdmFyIGNkeSA9IGNbMV0gLSBkWzFdXG4gICAgdmFyIGFkeiA9IGFbMl0gLSBkWzJdXG4gICAgdmFyIGJkeiA9IGJbMl0gLSBkWzJdXG4gICAgdmFyIGNkeiA9IGNbMl0gLSBkWzJdXG4gICAgdmFyIGJkeGNkeSA9IGJkeCAqIGNkeVxuICAgIHZhciBjZHhiZHkgPSBjZHggKiBiZHlcbiAgICB2YXIgY2R4YWR5ID0gY2R4ICogYWR5XG4gICAgdmFyIGFkeGNkeSA9IGFkeCAqIGNkeVxuICAgIHZhciBhZHhiZHkgPSBhZHggKiBiZHlcbiAgICB2YXIgYmR4YWR5ID0gYmR4ICogYWR5XG4gICAgdmFyIGRldCA9IGFkeiAqIChiZHhjZHkgLSBjZHhiZHkpIFxuICAgICAgICAgICAgKyBiZHogKiAoY2R4YWR5IC0gYWR4Y2R5KVxuICAgICAgICAgICAgKyBjZHogKiAoYWR4YmR5IC0gYmR4YWR5KVxuICAgIHZhciBwZXJtYW5lbnQgPSAoTWF0aC5hYnMoYmR4Y2R5KSArIE1hdGguYWJzKGNkeGJkeSkpICogTWF0aC5hYnMoYWR6KVxuICAgICAgICAgICAgICAgICAgKyAoTWF0aC5hYnMoY2R4YWR5KSArIE1hdGguYWJzKGFkeGNkeSkpICogTWF0aC5hYnMoYmR6KVxuICAgICAgICAgICAgICAgICAgKyAoTWF0aC5hYnMoYWR4YmR5KSArIE1hdGguYWJzKGJkeGFkeSkpICogTWF0aC5hYnMoY2R6KVxuICAgIHZhciB0b2wgPSBFUlJCT1VORDQgKiBwZXJtYW5lbnRcbiAgICBpZiAoKGRldCA+IHRvbCkgfHwgKC1kZXQgPiB0b2wpKSB7XG4gICAgICByZXR1cm4gZGV0XG4gICAgfVxuICAgIHJldHVybiBvcmllbnRhdGlvbjRFeGFjdChhLGIsYyxkKVxuICB9XG5dXG5cbmZ1bmN0aW9uIHNsb3dPcmllbnQoYXJncykge1xuICB2YXIgcHJvYyA9IENBQ0hFRFthcmdzLmxlbmd0aF1cbiAgaWYoIXByb2MpIHtcbiAgICBwcm9jID0gQ0FDSEVEW2FyZ3MubGVuZ3RoXSA9IG9yaWVudGF0aW9uKGFyZ3MubGVuZ3RoKVxuICB9XG4gIHJldHVybiBwcm9jLmFwcGx5KHVuZGVmaW5lZCwgYXJncylcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVPcmllbnRhdGlvblByb2MoKSB7XG4gIHdoaWxlKENBQ0hFRC5sZW5ndGggPD0gTlVNX0VYUEFORCkge1xuICAgIENBQ0hFRC5wdXNoKG9yaWVudGF0aW9uKENBQ0hFRC5sZW5ndGgpKVxuICB9XG4gIHZhciBhcmdzID0gW11cbiAgdmFyIHByb2NBcmdzID0gW1wic2xvd1wiXVxuICBmb3IodmFyIGk9MDsgaTw9TlVNX0VYUEFORDsgKytpKSB7XG4gICAgYXJncy5wdXNoKFwiYVwiICsgaSlcbiAgICBwcm9jQXJncy5wdXNoKFwib1wiICsgaSlcbiAgfVxuICB2YXIgY29kZSA9IFtcbiAgICBcImZ1bmN0aW9uIGdldE9yaWVudGF0aW9uKFwiLCBhcmdzLmpvaW4oKSwgXCIpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6Y2FzZSAxOnJldHVybiAwO1wiXG4gIF1cbiAgZm9yKHZhciBpPTI7IGk8PU5VTV9FWFBBTkQ7ICsraSkge1xuICAgIGNvZGUucHVzaChcImNhc2UgXCIsIGksIFwiOnJldHVybiBvXCIsIGksIFwiKFwiLCBhcmdzLnNsaWNlKDAsIGkpLmpvaW4oKSwgXCIpO1wiKVxuICB9XG4gIGNvZGUucHVzaChcIn12YXIgcz1uZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7Zm9yKHZhciBpPTA7aTxhcmd1bWVudHMubGVuZ3RoOysraSl7c1tpXT1hcmd1bWVudHNbaV19O3JldHVybiBzbG93KHMpO31yZXR1cm4gZ2V0T3JpZW50YXRpb25cIilcbiAgcHJvY0FyZ3MucHVzaChjb2RlLmpvaW4oXCJcIikpXG5cbiAgdmFyIHByb2MgPSBGdW5jdGlvbi5hcHBseSh1bmRlZmluZWQsIHByb2NBcmdzKVxuICBtb2R1bGUuZXhwb3J0cyA9IHByb2MuYXBwbHkodW5kZWZpbmVkLCBbc2xvd09yaWVudF0uY29uY2F0KENBQ0hFRCkpXG4gIGZvcih2YXIgaT0wOyBpPD1OVU1fRVhQQU5EOyArK2kpIHtcbiAgICBtb2R1bGUuZXhwb3J0c1tpXSA9IENBQ0hFRFtpXVxuICB9XG59XG5cbmdlbmVyYXRlT3JpZW50YXRpb25Qcm9jKCkiLCJcInVzZSBzdHJpY3RcIlxuXG4vL0hpZ2ggbGV2ZWwgaWRlYTpcbi8vIDEuIFVzZSBDbGFya3NvbidzIGluY3JlbWVudGFsIGNvbnN0cnVjdGlvbiB0byBmaW5kIGNvbnZleCBodWxsXG4vLyAyLiBQb2ludCBsb2NhdGlvbiBpbiB0cmlhbmd1bGF0aW9uIGJ5IGp1bXAgYW5kIHdhbGtcblxubW9kdWxlLmV4cG9ydHMgPSBpbmNyZW1lbnRhbENvbnZleEh1bGxcblxudmFyIG9yaWVudCA9IHJlcXVpcmUoXCJyb2J1c3Qtb3JpZW50YXRpb25cIilcbnZhciBjb21wYXJlQ2VsbCA9IHJlcXVpcmUoXCJzaW1wbGljaWFsLWNvbXBsZXhcIikuY29tcGFyZUNlbGxzXG5cbmZ1bmN0aW9uIGNvbXBhcmVJbnQoYSwgYikge1xuICByZXR1cm4gYSAtIGJcbn1cblxuZnVuY3Rpb24gU2ltcGxleCh2ZXJ0aWNlcywgYWRqYWNlbnQsIGJvdW5kYXJ5KSB7XG4gIHRoaXMudmVydGljZXMgPSB2ZXJ0aWNlc1xuICB0aGlzLmFkamFjZW50ID0gYWRqYWNlbnRcbiAgdGhpcy5ib3VuZGFyeSA9IGJvdW5kYXJ5XG4gIHRoaXMubGFzdFZpc2l0ZWQgPSAtMVxufVxuXG5TaW1wbGV4LnByb3RvdHlwZS5mbGlwID0gZnVuY3Rpb24oKSB7XG4gIHZhciB0ID0gdGhpcy52ZXJ0aWNlc1swXVxuICB0aGlzLnZlcnRpY2VzWzBdID0gdGhpcy52ZXJ0aWNlc1sxXVxuICB0aGlzLnZlcnRpY2VzWzFdID0gdFxuICB2YXIgdSA9IHRoaXMuYWRqYWNlbnRbMF1cbiAgdGhpcy5hZGphY2VudFswXSA9IHRoaXMuYWRqYWNlbnRbMV1cbiAgdGhpcy5hZGphY2VudFsxXSA9IHVcbn1cblxuZnVuY3Rpb24gR2x1ZUZhY2V0KHZlcnRpY2VzLCBjZWxsLCBpbmRleCkge1xuICB0aGlzLnZlcnRpY2VzID0gdmVydGljZXNcbiAgdGhpcy5jZWxsID0gY2VsbFxuICB0aGlzLmluZGV4ID0gaW5kZXhcbn1cblxuZnVuY3Rpb24gY29tcGFyZUdsdWUoYSwgYikge1xuICByZXR1cm4gY29tcGFyZUNlbGwoYS52ZXJ0aWNlcywgYi52ZXJ0aWNlcylcbn1cblxuZnVuY3Rpb24gYmFrZU9yaWVudChkKSB7XG4gIHZhciBjb2RlID0gW1wiZnVuY3Rpb24gb3JpZW50KCl7dmFyIHR1cGxlPXRoaXMudHVwbGU7cmV0dXJuIHRlc3QoXCJdXG4gIGZvcih2YXIgaT0wOyBpPD1kOyArK2kpIHtcbiAgICBpZihpID4gMCkge1xuICAgICAgY29kZS5wdXNoKFwiLFwiKVxuICAgIH1cbiAgICBjb2RlLnB1c2goXCJ0dXBsZVtcIiwgaSwgXCJdXCIpXG4gIH1cbiAgY29kZS5wdXNoKFwiKX1yZXR1cm4gb3JpZW50XCIpXG4gIHZhciBwcm9jID0gbmV3IEZ1bmN0aW9uKFwidGVzdFwiLCBjb2RlLmpvaW4oXCJcIikpXG4gIHZhciB0ZXN0ID0gb3JpZW50W2QrMV1cbiAgaWYoIXRlc3QpIHtcbiAgICB0ZXN0ID0gb3JpZW50XG4gIH1cbiAgcmV0dXJuIHByb2ModGVzdClcbn1cblxudmFyIEJBS0VEID0gW11cblxuZnVuY3Rpb24gVHJpYW5ndWxhdGlvbihkaW1lbnNpb24sIHZlcnRpY2VzLCBzaW1wbGljZXMpIHtcbiAgdGhpcy5kaW1lbnNpb24gPSBkaW1lbnNpb25cbiAgdGhpcy52ZXJ0aWNlcyA9IHZlcnRpY2VzXG4gIHRoaXMuc2ltcGxpY2VzID0gc2ltcGxpY2VzXG4gIHRoaXMuaW50ZXJpb3IgPSBzaW1wbGljZXMuZmlsdGVyKGZ1bmN0aW9uKGMpIHtcbiAgICByZXR1cm4gIWMuYm91bmRhcnlcbiAgfSlcblxuICB0aGlzLnR1cGxlID0gbmV3IEFycmF5KGRpbWVuc2lvbisxKVxuICBmb3IodmFyIGk9MDsgaTw9ZGltZW5zaW9uOyArK2kpIHtcbiAgICB0aGlzLnR1cGxlW2ldID0gdGhpcy52ZXJ0aWNlc1tpXVxuICB9XG5cbiAgdmFyIG8gPSBCQUtFRFtkaW1lbnNpb25dXG4gIGlmKCFvKSB7XG4gICAgbyA9IEJBS0VEW2RpbWVuc2lvbl0gPSBiYWtlT3JpZW50KGRpbWVuc2lvbilcbiAgfVxuICB0aGlzLm9yaWVudCA9IG9cbn1cblxudmFyIHByb3RvID0gVHJpYW5ndWxhdGlvbi5wcm90b3R5cGVcblxuLy9EZWdlbmVyYXRlIHNpdHVhdGlvbiB3aGVyZSB3ZSBhcmUgb24gYm91bmRhcnksIGJ1dCBjb3BsYW5hciB0byBmYWNlXG5wcm90by5oYW5kbGVCb3VuZGFyeURlZ2VuZXJhY3kgPSBmdW5jdGlvbihjZWxsLCBwb2ludCkge1xuICB2YXIgZCA9IHRoaXMuZGltZW5zaW9uXG4gIHZhciBuID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGggLSAxXG4gIHZhciB0dXBsZSA9IHRoaXMudHVwbGVcbiAgdmFyIHZlcnRzID0gdGhpcy52ZXJ0aWNlc1xuXG4gIC8vRHVtYiBzb2x1dGlvbjogSnVzdCBkbyBkZnMgZnJvbSBib3VuZGFyeSBjZWxsIHVudGlsIHdlIGZpbmQgYW55IHBlYWssIG9yIHRlcm1pbmF0ZVxuICB2YXIgdG9WaXNpdCA9IFsgY2VsbCBdXG4gIGNlbGwubGFzdFZpc2l0ZWQgPSAtblxuICB3aGlsZSh0b1Zpc2l0Lmxlbmd0aCA+IDApIHtcbiAgICBjZWxsID0gdG9WaXNpdC5wb3AoKVxuICAgIHZhciBjZWxsVmVydHMgPSBjZWxsLnZlcnRpY2VzXG4gICAgdmFyIGNlbGxBZGogPSBjZWxsLmFkamFjZW50XG4gICAgZm9yKHZhciBpPTA7IGk8PWQ7ICsraSkge1xuICAgICAgdmFyIG5laWdoYm9yID0gY2VsbEFkaltpXVxuICAgICAgaWYoIW5laWdoYm9yLmJvdW5kYXJ5IHx8IG5laWdoYm9yLmxhc3RWaXNpdGVkIDw9IC1uKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICB2YXIgbnYgPSBuZWlnaGJvci52ZXJ0aWNlc1xuICAgICAgZm9yKHZhciBqPTA7IGo8PWQ7ICsraikge1xuICAgICAgICB2YXIgdnYgPSBudltqXVxuICAgICAgICBpZih2diA8IDApIHtcbiAgICAgICAgICB0dXBsZVtqXSA9IHBvaW50XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHVwbGVbal0gPSB2ZXJ0c1t2dl1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdmFyIG8gPSB0aGlzLm9yaWVudCgpXG4gICAgICBpZihvID4gMCkge1xuICAgICAgICByZXR1cm4gbmVpZ2hib3JcbiAgICAgIH1cbiAgICAgIG5laWdoYm9yLmxhc3RWaXNpdGVkID0gLW5cbiAgICAgIGlmKG8gPT09IDApIHtcbiAgICAgICAgdG9WaXNpdC5wdXNoKG5laWdoYm9yKVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbFxufVxuXG5wcm90by53YWxrID0gZnVuY3Rpb24ocG9pbnQsIHJhbmRvbSkge1xuICAvL0FsaWFzIGxvY2FsIHByb3BlcnRpZXNcbiAgdmFyIG4gPSB0aGlzLnZlcnRpY2VzLmxlbmd0aCAtIDFcbiAgdmFyIGQgPSB0aGlzLmRpbWVuc2lvblxuICB2YXIgdmVydHMgPSB0aGlzLnZlcnRpY2VzXG4gIHZhciB0dXBsZSA9IHRoaXMudHVwbGVcblxuICAvL0NvbXB1dGUgaW5pdGlhbCBqdW1wIGNlbGxcbiAgdmFyIGluaXRJbmRleCA9IHJhbmRvbSA/ICh0aGlzLmludGVyaW9yLmxlbmd0aCAqIE1hdGgucmFuZG9tKCkpfDAgOiAodGhpcy5pbnRlcmlvci5sZW5ndGgtMSlcbiAgdmFyIGNlbGwgPSB0aGlzLmludGVyaW9yWyBpbml0SW5kZXggXVxuXG4gIC8vU3RhcnQgd2Fsa2luZ1xub3V0ZXJMb29wOlxuICB3aGlsZSghY2VsbC5ib3VuZGFyeSkge1xuICAgIHZhciBjZWxsVmVydHMgPSBjZWxsLnZlcnRpY2VzXG4gICAgdmFyIGNlbGxBZGogPSBjZWxsLmFkamFjZW50XG5cbiAgICBmb3IodmFyIGk9MDsgaTw9ZDsgKytpKSB7XG4gICAgICB0dXBsZVtpXSA9IHZlcnRzW2NlbGxWZXJ0c1tpXV1cbiAgICB9XG4gICAgY2VsbC5sYXN0VmlzaXRlZCA9IG5cblxuICAgIC8vRmluZCBmYXJ0aGVzdCBhZGphY2VudCBjZWxsXG4gICAgZm9yKHZhciBpPTA7IGk8PWQ7ICsraSkge1xuICAgICAgdmFyIG5laWdoYm9yID0gY2VsbEFkaltpXVxuICAgICAgaWYobmVpZ2hib3IubGFzdFZpc2l0ZWQgPj0gbikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgdmFyIHByZXYgPSB0dXBsZVtpXVxuICAgICAgdHVwbGVbaV0gPSBwb2ludFxuICAgICAgdmFyIG8gPSB0aGlzLm9yaWVudCgpXG4gICAgICB0dXBsZVtpXSA9IHByZXZcbiAgICAgIGlmKG8gPCAwKSB7XG4gICAgICAgIGNlbGwgPSBuZWlnaGJvclxuICAgICAgICBjb250aW51ZSBvdXRlckxvb3BcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmKCFuZWlnaGJvci5ib3VuZGFyeSkge1xuICAgICAgICAgIG5laWdoYm9yLmxhc3RWaXNpdGVkID0gblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5laWdoYm9yLmxhc3RWaXNpdGVkID0gLW5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm5cbiAgfVxuXG4gIHJldHVybiBjZWxsXG59XG5cbnByb3RvLmFkZFBlYWtzID0gZnVuY3Rpb24ocG9pbnQsIGNlbGwpIHtcbiAgdmFyIG4gPSB0aGlzLnZlcnRpY2VzLmxlbmd0aCAtIDFcbiAgdmFyIGQgPSB0aGlzLmRpbWVuc2lvblxuICB2YXIgdmVydHMgPSB0aGlzLnZlcnRpY2VzXG4gIHZhciB0dXBsZSA9IHRoaXMudHVwbGVcbiAgdmFyIGludGVyaW9yID0gdGhpcy5pbnRlcmlvclxuICB2YXIgc2ltcGxpY2VzID0gdGhpcy5zaW1wbGljZXNcblxuICAvL1dhbGtpbmcgZmluaXNoZWQgYXQgYm91bmRhcnksIHRpbWUgdG8gYWRkIHBlYWtzXG4gIHZhciB0b3Zpc2l0ID0gWyBjZWxsIF1cblxuICAvL1N0cmV0Y2ggaW5pdGlhbCBib3VuZGFyeSBjZWxsIGludG8gYSBwZWFrXG4gIGNlbGwubGFzdFZpc2l0ZWQgPSBuXG4gIGNlbGwudmVydGljZXNbY2VsbC52ZXJ0aWNlcy5pbmRleE9mKC0xKV0gPSBuXG4gIGNlbGwuYm91bmRhcnkgPSBmYWxzZVxuICBpbnRlcmlvci5wdXNoKGNlbGwpXG5cbiAgLy9SZWNvcmQgYSBsaXN0IG9mIGFsbCBuZXcgYm91bmRhcmllcyBjcmVhdGVkIGJ5IGFkZGVkIHBlYWtzIHNvIHdlIGNhbiBnbHVlIHRoZW0gdG9nZXRoZXIgd2hlbiB3ZSBhcmUgYWxsIGRvbmVcbiAgdmFyIGdsdWVGYWNldHMgPSBbXVxuXG4gIC8vRG8gYSB0cmF2ZXJzYWwgb2YgdGhlIGJvdW5kYXJ5IHdhbGtpbmcgb3V0d2FyZCBmcm9tIHN0YXJ0aW5nIHBlYWtcbiAgd2hpbGUodG92aXNpdC5sZW5ndGggPiAwKSB7XG4gICAgLy9Qb3Agb2ZmIHBlYWsgYW5kIHdhbGsgb3ZlciBhZGphY2VudCBjZWxsc1xuICAgIHZhciBjZWxsID0gdG92aXNpdC5wb3AoKVxuICAgIHZhciBjZWxsVmVydHMgPSBjZWxsLnZlcnRpY2VzXG4gICAgdmFyIGNlbGxBZGogPSBjZWxsLmFkamFjZW50XG4gICAgdmFyIGluZGV4T2ZOID0gY2VsbFZlcnRzLmluZGV4T2YobilcbiAgICBpZihpbmRleE9mTiA8IDApIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuXG4gICAgZm9yKHZhciBpPTA7IGk8PWQ7ICsraSkge1xuICAgICAgaWYoaSA9PT0gaW5kZXhPZk4pIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy9Gb3IgZWFjaCBib3VuZGFyeSBuZWlnaGJvciBvZiB0aGUgY2VsbFxuICAgICAgdmFyIG5laWdoYm9yID0gY2VsbEFkaltpXVxuICAgICAgaWYoIW5laWdoYm9yLmJvdW5kYXJ5IHx8IG5laWdoYm9yLmxhc3RWaXNpdGVkID49IG4pIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgdmFyIG52ID0gbmVpZ2hib3IudmVydGljZXNcblxuICAgICAgLy9UZXN0IGlmIG5laWdoYm9yIGlzIGEgcGVha1xuICAgICAgaWYobmVpZ2hib3IubGFzdFZpc2l0ZWQgIT09IC1uKSB7ICAgICAgXG4gICAgICAgIC8vQ29tcHV0ZSBvcmllbnRhdGlvbiBvZiBwIHJlbGF0aXZlIHRvIGVhY2ggYm91bmRhcnkgcGVha1xuICAgICAgICB2YXIgaW5kZXhPZk5lZzEgPSAwXG4gICAgICAgIGZvcih2YXIgaj0wOyBqPD1kOyArK2opIHtcbiAgICAgICAgICBpZihudltqXSA8IDApIHtcbiAgICAgICAgICAgIGluZGV4T2ZOZWcxID0galxuICAgICAgICAgICAgdHVwbGVbal0gPSBwb2ludFxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0dXBsZVtqXSA9IHZlcnRzW252W2pdXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB2YXIgbyA9IHRoaXMub3JpZW50KClcblxuICAgICAgICAvL1Rlc3QgaWYgbmVpZ2hib3IgY2VsbCBpcyBhbHNvIGEgcGVha1xuICAgICAgICBpZihvID4gMCkge1xuICAgICAgICAgIG52W2luZGV4T2ZOZWcxXSA9IG5cbiAgICAgICAgICBuZWlnaGJvci5ib3VuZGFyeSA9IGZhbHNlXG4gICAgICAgICAgaW50ZXJpb3IucHVzaChuZWlnaGJvcilcbiAgICAgICAgICB0b3Zpc2l0LnB1c2gobmVpZ2hib3IpXG4gICAgICAgICAgbmVpZ2hib3IubGFzdFZpc2l0ZWQgPSBuXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZWlnaGJvci5sYXN0VmlzaXRlZCA9IC1uXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIG5hID0gbmVpZ2hib3IuYWRqYWNlbnRcblxuICAgICAgLy9PdGhlcndpc2UsIHJlcGxhY2UgbmVpZ2hib3Igd2l0aCBuZXcgZmFjZVxuICAgICAgdmFyIHZ2ZXJ0cyA9IGNlbGxWZXJ0cy5zbGljZSgpXG4gICAgICB2YXIgdmFkaiA9IGNlbGxBZGouc2xpY2UoKVxuICAgICAgdmFyIG5jZWxsID0gbmV3IFNpbXBsZXgodnZlcnRzLCB2YWRqLCB0cnVlKVxuICAgICAgc2ltcGxpY2VzLnB1c2gobmNlbGwpXG5cbiAgICAgIC8vQ29ubmVjdCB0byBuZWlnaGJvclxuICAgICAgdmFyIG9wcG9zaXRlID0gbmEuaW5kZXhPZihjZWxsKVxuICAgICAgaWYob3Bwb3NpdGUgPCAwKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBuYVtvcHBvc2l0ZV0gPSBuY2VsbFxuICAgICAgdmFkaltpbmRleE9mTl0gPSBuZWlnaGJvclxuXG4gICAgICAvL0Nvbm5lY3QgdG8gY2VsbFxuICAgICAgdnZlcnRzW2ldID0gLTFcbiAgICAgIHZhZGpbaV0gPSBjZWxsXG4gICAgICBjZWxsQWRqW2ldID0gbmNlbGxcblxuICAgICAgLy9GbGlwIGZhY2V0XG4gICAgICBuY2VsbC5mbGlwKClcblxuICAgICAgLy9BZGQgdG8gZ2x1ZSBsaXN0XG4gICAgICBmb3IodmFyIGo9MDsgajw9ZDsgKytqKSB7XG4gICAgICAgIHZhciB1dSA9IHZ2ZXJ0c1tqXVxuICAgICAgICBpZih1dSA8IDAgfHwgdXUgPT09IG4pIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIHZhciBuZmFjZSA9IG5ldyBBcnJheShkLTEpXG4gICAgICAgIHZhciBucHRyID0gMFxuICAgICAgICBmb3IodmFyIGs9MDsgazw9ZDsgKytrKSB7XG4gICAgICAgICAgdmFyIHZ2ID0gdnZlcnRzW2tdXG4gICAgICAgICAgaWYodnYgPCAwIHx8IGsgPT09IGopIHtcbiAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgfVxuICAgICAgICAgIG5mYWNlW25wdHIrK10gPSB2dlxuICAgICAgICB9XG4gICAgICAgIGdsdWVGYWNldHMucHVzaChuZXcgR2x1ZUZhY2V0KG5mYWNlLCBuY2VsbCwgaikpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy9HbHVlIGJvdW5kYXJ5IGZhY2V0cyB0b2dldGhlclxuICBnbHVlRmFjZXRzLnNvcnQoY29tcGFyZUdsdWUpXG5cbiAgZm9yKHZhciBpPTA7IGkrMTxnbHVlRmFjZXRzLmxlbmd0aDsgaSs9Mikge1xuICAgIHZhciBhID0gZ2x1ZUZhY2V0c1tpXVxuICAgIHZhciBiID0gZ2x1ZUZhY2V0c1tpKzFdXG4gICAgdmFyIGFpID0gYS5pbmRleFxuICAgIHZhciBiaSA9IGIuaW5kZXhcbiAgICBpZihhaSA8IDAgfHwgYmkgPCAwKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBhLmNlbGwuYWRqYWNlbnRbYS5pbmRleF0gPSBiLmNlbGxcbiAgICBiLmNlbGwuYWRqYWNlbnRbYi5pbmRleF0gPSBhLmNlbGxcbiAgfVxufVxuXG5wcm90by5pbnNlcnQgPSBmdW5jdGlvbihwb2ludCwgcmFuZG9tKSB7XG4gIC8vQWRkIHBvaW50XG4gIHZhciB2ZXJ0cyA9IHRoaXMudmVydGljZXNcbiAgdmVydHMucHVzaChwb2ludClcblxuICB2YXIgY2VsbCA9IHRoaXMud2Fsayhwb2ludCwgcmFuZG9tKVxuICBpZighY2VsbCkge1xuICAgIHJldHVyblxuICB9XG5cbiAgLy9BbGlhcyBsb2NhbCBwcm9wZXJ0aWVzXG4gIHZhciBkID0gdGhpcy5kaW1lbnNpb25cbiAgdmFyIHR1cGxlID0gdGhpcy50dXBsZVxuXG4gIC8vRGVnZW5lcmF0ZSBjYXNlOiBJZiBwb2ludCBpcyBjb3BsYW5hciB0byBjZWxsLCB0aGVuIHdhbGsgdW50aWwgd2UgZmluZCBhIG5vbi1kZWdlbmVyYXRlIGJvdW5kYXJ5XG4gIGZvcih2YXIgaT0wOyBpPD1kOyArK2kpIHtcbiAgICB2YXIgdnYgPSBjZWxsLnZlcnRpY2VzW2ldXG4gICAgaWYodnYgPCAwKSB7XG4gICAgICB0dXBsZVtpXSA9IHBvaW50XG4gICAgfSBlbHNlIHtcbiAgICAgIHR1cGxlW2ldID0gdmVydHNbdnZdXG4gICAgfVxuICB9XG4gIHZhciBvID0gdGhpcy5vcmllbnQodHVwbGUpXG4gIGlmKG8gPCAwKSB7XG4gICAgcmV0dXJuXG4gIH0gZWxzZSBpZihvID09PSAwKSB7XG4gICAgY2VsbCA9IHRoaXMuaGFuZGxlQm91bmRhcnlEZWdlbmVyYWN5KGNlbGwsIHBvaW50KVxuICAgIGlmKCFjZWxsKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gIH1cblxuICAvL0FkZCBwZWFrc1xuICB0aGlzLmFkZFBlYWtzKHBvaW50LCBjZWxsKVxufVxuXG4vL0V4dHJhY3QgYWxsIGJvdW5kYXJ5IGNlbGxzXG5wcm90by5ib3VuZGFyeSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZCA9IHRoaXMuZGltZW5zaW9uXG4gIHZhciBib3VuZGFyeSA9IFtdXG4gIHZhciBjZWxscyA9IHRoaXMuc2ltcGxpY2VzXG4gIHZhciBuYyA9IGNlbGxzLmxlbmd0aFxuICBmb3IodmFyIGk9MDsgaTxuYzsgKytpKSB7XG4gICAgdmFyIGMgPSBjZWxsc1tpXVxuICAgIGlmKGMuYm91bmRhcnkpIHtcbiAgICAgIHZhciBiY2VsbCA9IG5ldyBBcnJheShkKVxuICAgICAgdmFyIGN2ID0gYy52ZXJ0aWNlc1xuICAgICAgdmFyIHB0ciA9IDBcbiAgICAgIHZhciBwYXJpdHkgPSAwXG4gICAgICBmb3IodmFyIGo9MDsgajw9ZDsgKytqKSB7XG4gICAgICAgIGlmKGN2W2pdID49IDApIHtcbiAgICAgICAgICBiY2VsbFtwdHIrK10gPSBjdltqXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhcml0eSA9IGomMVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZihwYXJpdHkgPT09IChkJjEpKSB7XG4gICAgICAgIHZhciB0ID0gYmNlbGxbMF1cbiAgICAgICAgYmNlbGxbMF0gPSBiY2VsbFsxXVxuICAgICAgICBiY2VsbFsxXSA9IHRcbiAgICAgIH1cbiAgICAgIGJvdW5kYXJ5LnB1c2goYmNlbGwpXG4gICAgfVxuICB9XG4gIHJldHVybiBib3VuZGFyeVxufVxuXG5mdW5jdGlvbiBpbmNyZW1lbnRhbENvbnZleEh1bGwocG9pbnRzLCByYW5kb21TZWFyY2gpIHtcbiAgdmFyIG4gPSBwb2ludHMubGVuZ3RoXG4gIGlmKG4gPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJNdXN0IGhhdmUgYXQgbGVhc3QgZCsxIHBvaW50c1wiKVxuICB9XG4gIHZhciBkID0gcG9pbnRzWzBdLmxlbmd0aFxuICBpZihuIDw9IGQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJNdXN0IGlucHV0IGF0IGxlYXN0IGQrMSBwb2ludHNcIilcbiAgfVxuXG4gIC8vRklYTUU6IFRoaXMgY291bGQgYmUgZGVnZW5lcmF0ZSwgYnV0IG5lZWQgdG8gc2VsZWN0IGQrMSBub24tY29wbGFuYXIgcG9pbnRzIHRvIGJvb3RzdHJhcCBwcm9jZXNzXG4gIHZhciBpbml0aWFsU2ltcGxleCA9IHBvaW50cy5zbGljZSgwLCBkKzEpXG5cbiAgLy9NYWtlIHN1cmUgaW5pdGlhbCBzaW1wbGV4IGlzIHBvc2l0aXZlbHkgb3JpZW50ZWRcbiAgdmFyIG8gPSBvcmllbnQuYXBwbHkodm9pZCAwLCBpbml0aWFsU2ltcGxleClcbiAgaWYobyA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIklucHV0IG5vdCBpbiBnZW5lcmFsIHBvc2l0aW9uXCIpXG4gIH1cbiAgdmFyIGluaXRpYWxDb29yZHMgPSBuZXcgQXJyYXkoZCsxKVxuICBmb3IodmFyIGk9MDsgaTw9ZDsgKytpKSB7XG4gICAgaW5pdGlhbENvb3Jkc1tpXSA9IGlcbiAgfVxuICBpZihvIDwgMCkge1xuICAgIGluaXRpYWxDb29yZHNbMF0gPSAxXG4gICAgaW5pdGlhbENvb3Jkc1sxXSA9IDBcbiAgfVxuXG4gIC8vQ3JlYXRlIGluaXRpYWwgdG9wb2xvZ2ljYWwgaW5kZXgsIGdsdWUgcG9pbnRlcnMgdG9nZXRoZXIgKGtpbmQgb2YgbWVzc3kpXG4gIHZhciBpbml0aWFsQ2VsbCA9IG5ldyBTaW1wbGV4KGluaXRpYWxDb29yZHMsIG5ldyBBcnJheShkKzEpLCBmYWxzZSlcbiAgdmFyIGJvdW5kYXJ5ID0gaW5pdGlhbENlbGwuYWRqYWNlbnRcbiAgdmFyIGxpc3QgPSBuZXcgQXJyYXkoZCsyKVxuICBmb3IodmFyIGk9MDsgaTw9ZDsgKytpKSB7XG4gICAgdmFyIHZlcnRzID0gaW5pdGlhbENvb3Jkcy5zbGljZSgpXG4gICAgZm9yKHZhciBqPTA7IGo8PWQ7ICsraikge1xuICAgICAgaWYoaiA9PT0gaSkge1xuICAgICAgICB2ZXJ0c1tqXSA9IC0xXG4gICAgICB9XG4gICAgfVxuICAgIHZhciB0ID0gdmVydHNbMF1cbiAgICB2ZXJ0c1swXSA9IHZlcnRzWzFdXG4gICAgdmVydHNbMV0gPSB0XG4gICAgdmFyIGNlbGwgPSBuZXcgU2ltcGxleCh2ZXJ0cywgbmV3IEFycmF5KGQrMSksIHRydWUpXG4gICAgYm91bmRhcnlbaV0gPSBjZWxsXG4gICAgbGlzdFtpXSA9IGNlbGxcbiAgfVxuICBsaXN0W2QrMV0gPSBpbml0aWFsQ2VsbFxuICBmb3IodmFyIGk9MDsgaTw9ZDsgKytpKSB7XG4gICAgdmFyIHZlcnRzID0gYm91bmRhcnlbaV0udmVydGljZXNcbiAgICB2YXIgYWRqID0gYm91bmRhcnlbaV0uYWRqYWNlbnRcbiAgICBmb3IodmFyIGo9MDsgajw9ZDsgKytqKSB7XG4gICAgICB2YXIgdiA9IHZlcnRzW2pdXG4gICAgICBpZih2IDwgMCkge1xuICAgICAgICBhZGpbal0gPSBpbml0aWFsQ2VsbFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgZm9yKHZhciBrPTA7IGs8PWQ7ICsraykge1xuICAgICAgICBpZihib3VuZGFyeVtrXS52ZXJ0aWNlcy5pbmRleE9mKHYpIDwgMCkge1xuICAgICAgICAgIGFkaltqXSA9IGJvdW5kYXJ5W2tdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvL0luaXRpYWxpemUgdHJpYW5nbGVzXG4gIHZhciB0cmlhbmdsZXMgPSBuZXcgVHJpYW5ndWxhdGlvbihkLCBpbml0aWFsU2ltcGxleCwgbGlzdClcblxuICAvL0luc2VydCByZW1haW5pbmcgcG9pbnRzXG4gIHZhciB1c2VSYW5kb20gPSAhIXJhbmRvbVNlYXJjaFxuICBmb3IodmFyIGk9ZCsxOyBpPG47ICsraSkge1xuICAgIHRyaWFuZ2xlcy5pbnNlcnQocG9pbnRzW2ldLCB1c2VSYW5kb20pXG4gIH1cbiAgXG4gIC8vRXh0cmFjdCBib3VuZGFyeSBjZWxsc1xuICByZXR1cm4gdHJpYW5nbGVzLmJvdW5kYXJ5KClcbn0iLCIvKipcbiAqIEJpdCB0d2lkZGxpbmcgaGFja3MgZm9yIEphdmFTY3JpcHQuXG4gKlxuICogQXV0aG9yOiBNaWtvbGEgTHlzZW5rb1xuICpcbiAqIFBvcnRlZCBmcm9tIFN0YW5mb3JkIGJpdCB0d2lkZGxpbmcgaGFjayBsaWJyYXJ5OlxuICogICAgaHR0cDovL2dyYXBoaWNzLnN0YW5mb3JkLmVkdS9+c2VhbmRlci9iaXRoYWNrcy5odG1sXG4gKi9cblxuXCJ1c2Ugc3RyaWN0XCI7IFwidXNlIHJlc3RyaWN0XCI7XG5cbi8vTnVtYmVyIG9mIGJpdHMgaW4gYW4gaW50ZWdlclxudmFyIElOVF9CSVRTID0gMzI7XG5cbi8vQ29uc3RhbnRzXG5leHBvcnRzLklOVF9CSVRTICA9IElOVF9CSVRTO1xuZXhwb3J0cy5JTlRfTUFYICAgPSAgMHg3ZmZmZmZmZjtcbmV4cG9ydHMuSU5UX01JTiAgID0gLTE8PChJTlRfQklUUy0xKTtcblxuLy9SZXR1cm5zIC0xLCAwLCArMSBkZXBlbmRpbmcgb24gc2lnbiBvZiB4XG5leHBvcnRzLnNpZ24gPSBmdW5jdGlvbih2KSB7XG4gIHJldHVybiAodiA+IDApIC0gKHYgPCAwKTtcbn1cblxuLy9Db21wdXRlcyBhYnNvbHV0ZSB2YWx1ZSBvZiBpbnRlZ2VyXG5leHBvcnRzLmFicyA9IGZ1bmN0aW9uKHYpIHtcbiAgdmFyIG1hc2sgPSB2ID4+IChJTlRfQklUUy0xKTtcbiAgcmV0dXJuICh2IF4gbWFzaykgLSBtYXNrO1xufVxuXG4vL0NvbXB1dGVzIG1pbmltdW0gb2YgaW50ZWdlcnMgeCBhbmQgeVxuZXhwb3J0cy5taW4gPSBmdW5jdGlvbih4LCB5KSB7XG4gIHJldHVybiB5IF4gKCh4IF4geSkgJiAtKHggPCB5KSk7XG59XG5cbi8vQ29tcHV0ZXMgbWF4aW11bSBvZiBpbnRlZ2VycyB4IGFuZCB5XG5leHBvcnRzLm1heCA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgcmV0dXJuIHggXiAoKHggXiB5KSAmIC0oeCA8IHkpKTtcbn1cblxuLy9DaGVja3MgaWYgYSBudW1iZXIgaXMgYSBwb3dlciBvZiB0d29cbmV4cG9ydHMuaXNQb3cyID0gZnVuY3Rpb24odikge1xuICByZXR1cm4gISh2ICYgKHYtMSkpICYmICghIXYpO1xufVxuXG4vL0NvbXB1dGVzIGxvZyBiYXNlIDIgb2YgdlxuZXhwb3J0cy5sb2cyID0gZnVuY3Rpb24odikge1xuICB2YXIgciwgc2hpZnQ7XG4gIHIgPSAgICAgKHYgPiAweEZGRkYpIDw8IDQ7IHYgPj4+PSByO1xuICBzaGlmdCA9ICh2ID4gMHhGRiAgKSA8PCAzOyB2ID4+Pj0gc2hpZnQ7IHIgfD0gc2hpZnQ7XG4gIHNoaWZ0ID0gKHYgPiAweEYgICApIDw8IDI7IHYgPj4+PSBzaGlmdDsgciB8PSBzaGlmdDtcbiAgc2hpZnQgPSAodiA+IDB4MyAgICkgPDwgMTsgdiA+Pj49IHNoaWZ0OyByIHw9IHNoaWZ0O1xuICByZXR1cm4gciB8ICh2ID4+IDEpO1xufVxuXG4vL0NvbXB1dGVzIGxvZyBiYXNlIDEwIG9mIHZcbmV4cG9ydHMubG9nMTAgPSBmdW5jdGlvbih2KSB7XG4gIHJldHVybiAgKHYgPj0gMTAwMDAwMDAwMCkgPyA5IDogKHYgPj0gMTAwMDAwMDAwKSA/IDggOiAodiA+PSAxMDAwMDAwMCkgPyA3IDpcbiAgICAgICAgICAodiA+PSAxMDAwMDAwKSA/IDYgOiAodiA+PSAxMDAwMDApID8gNSA6ICh2ID49IDEwMDAwKSA/IDQgOlxuICAgICAgICAgICh2ID49IDEwMDApID8gMyA6ICh2ID49IDEwMCkgPyAyIDogKHYgPj0gMTApID8gMSA6IDA7XG59XG5cbi8vQ291bnRzIG51bWJlciBvZiBiaXRzXG5leHBvcnRzLnBvcENvdW50ID0gZnVuY3Rpb24odikge1xuICB2ID0gdiAtICgodiA+Pj4gMSkgJiAweDU1NTU1NTU1KTtcbiAgdiA9ICh2ICYgMHgzMzMzMzMzMykgKyAoKHYgPj4+IDIpICYgMHgzMzMzMzMzMyk7XG4gIHJldHVybiAoKHYgKyAodiA+Pj4gNCkgJiAweEYwRjBGMEYpICogMHgxMDEwMTAxKSA+Pj4gMjQ7XG59XG5cbi8vQ291bnRzIG51bWJlciBvZiB0cmFpbGluZyB6ZXJvc1xuZnVuY3Rpb24gY291bnRUcmFpbGluZ1plcm9zKHYpIHtcbiAgdmFyIGMgPSAzMjtcbiAgdiAmPSAtdjtcbiAgaWYgKHYpIGMtLTtcbiAgaWYgKHYgJiAweDAwMDBGRkZGKSBjIC09IDE2O1xuICBpZiAodiAmIDB4MDBGRjAwRkYpIGMgLT0gODtcbiAgaWYgKHYgJiAweDBGMEYwRjBGKSBjIC09IDQ7XG4gIGlmICh2ICYgMHgzMzMzMzMzMykgYyAtPSAyO1xuICBpZiAodiAmIDB4NTU1NTU1NTUpIGMgLT0gMTtcbiAgcmV0dXJuIGM7XG59XG5leHBvcnRzLmNvdW50VHJhaWxpbmdaZXJvcyA9IGNvdW50VHJhaWxpbmdaZXJvcztcblxuLy9Sb3VuZHMgdG8gbmV4dCBwb3dlciBvZiAyXG5leHBvcnRzLm5leHRQb3cyID0gZnVuY3Rpb24odikge1xuICB2ICs9IHYgPT09IDA7XG4gIC0tdjtcbiAgdiB8PSB2ID4+PiAxO1xuICB2IHw9IHYgPj4+IDI7XG4gIHYgfD0gdiA+Pj4gNDtcbiAgdiB8PSB2ID4+PiA4O1xuICB2IHw9IHYgPj4+IDE2O1xuICByZXR1cm4gdiArIDE7XG59XG5cbi8vUm91bmRzIGRvd24gdG8gcHJldmlvdXMgcG93ZXIgb2YgMlxuZXhwb3J0cy5wcmV2UG93MiA9IGZ1bmN0aW9uKHYpIHtcbiAgdiB8PSB2ID4+PiAxO1xuICB2IHw9IHYgPj4+IDI7XG4gIHYgfD0gdiA+Pj4gNDtcbiAgdiB8PSB2ID4+PiA4O1xuICB2IHw9IHYgPj4+IDE2O1xuICByZXR1cm4gdiAtICh2Pj4+MSk7XG59XG5cbi8vQ29tcHV0ZXMgcGFyaXR5IG9mIHdvcmRcbmV4cG9ydHMucGFyaXR5ID0gZnVuY3Rpb24odikge1xuICB2IF49IHYgPj4+IDE2O1xuICB2IF49IHYgPj4+IDg7XG4gIHYgXj0gdiA+Pj4gNDtcbiAgdiAmPSAweGY7XG4gIHJldHVybiAoMHg2OTk2ID4+PiB2KSAmIDE7XG59XG5cbnZhciBSRVZFUlNFX1RBQkxFID0gbmV3IEFycmF5KDI1Nik7XG5cbihmdW5jdGlvbih0YWIpIHtcbiAgZm9yKHZhciBpPTA7IGk8MjU2OyArK2kpIHtcbiAgICB2YXIgdiA9IGksIHIgPSBpLCBzID0gNztcbiAgICBmb3IgKHYgPj4+PSAxOyB2OyB2ID4+Pj0gMSkge1xuICAgICAgciA8PD0gMTtcbiAgICAgIHIgfD0gdiAmIDE7XG4gICAgICAtLXM7XG4gICAgfVxuICAgIHRhYltpXSA9IChyIDw8IHMpICYgMHhmZjtcbiAgfVxufSkoUkVWRVJTRV9UQUJMRSk7XG5cbi8vUmV2ZXJzZSBiaXRzIGluIGEgMzIgYml0IHdvcmRcbmV4cG9ydHMucmV2ZXJzZSA9IGZ1bmN0aW9uKHYpIHtcbiAgcmV0dXJuICAoUkVWRVJTRV9UQUJMRVsgdiAgICAgICAgICYgMHhmZl0gPDwgMjQpIHxcbiAgICAgICAgICAoUkVWRVJTRV9UQUJMRVsodiA+Pj4gOCkgICYgMHhmZl0gPDwgMTYpIHxcbiAgICAgICAgICAoUkVWRVJTRV9UQUJMRVsodiA+Pj4gMTYpICYgMHhmZl0gPDwgOCkgIHxcbiAgICAgICAgICAgUkVWRVJTRV9UQUJMRVsodiA+Pj4gMjQpICYgMHhmZl07XG59XG5cbi8vSW50ZXJsZWF2ZSBiaXRzIG9mIDIgY29vcmRpbmF0ZXMgd2l0aCAxNiBiaXRzLiAgVXNlZnVsIGZvciBmYXN0IHF1YWR0cmVlIGNvZGVzXG5leHBvcnRzLmludGVybGVhdmUyID0gZnVuY3Rpb24oeCwgeSkge1xuICB4ICY9IDB4RkZGRjtcbiAgeCA9ICh4IHwgKHggPDwgOCkpICYgMHgwMEZGMDBGRjtcbiAgeCA9ICh4IHwgKHggPDwgNCkpICYgMHgwRjBGMEYwRjtcbiAgeCA9ICh4IHwgKHggPDwgMikpICYgMHgzMzMzMzMzMztcbiAgeCA9ICh4IHwgKHggPDwgMSkpICYgMHg1NTU1NTU1NTtcblxuICB5ICY9IDB4RkZGRjtcbiAgeSA9ICh5IHwgKHkgPDwgOCkpICYgMHgwMEZGMDBGRjtcbiAgeSA9ICh5IHwgKHkgPDwgNCkpICYgMHgwRjBGMEYwRjtcbiAgeSA9ICh5IHwgKHkgPDwgMikpICYgMHgzMzMzMzMzMztcbiAgeSA9ICh5IHwgKHkgPDwgMSkpICYgMHg1NTU1NTU1NTtcblxuICByZXR1cm4geCB8ICh5IDw8IDEpO1xufVxuXG4vL0V4dHJhY3RzIHRoZSBudGggaW50ZXJsZWF2ZWQgY29tcG9uZW50XG5leHBvcnRzLmRlaW50ZXJsZWF2ZTIgPSBmdW5jdGlvbih2LCBuKSB7XG4gIHYgPSAodiA+Pj4gbikgJiAweDU1NTU1NTU1O1xuICB2ID0gKHYgfCAodiA+Pj4gMSkpICAmIDB4MzMzMzMzMzM7XG4gIHYgPSAodiB8ICh2ID4+PiAyKSkgICYgMHgwRjBGMEYwRjtcbiAgdiA9ICh2IHwgKHYgPj4+IDQpKSAgJiAweDAwRkYwMEZGO1xuICB2ID0gKHYgfCAodiA+Pj4gMTYpKSAmIDB4MDAwRkZGRjtcbiAgcmV0dXJuICh2IDw8IDE2KSA+PiAxNjtcbn1cblxuXG4vL0ludGVybGVhdmUgYml0cyBvZiAzIGNvb3JkaW5hdGVzLCBlYWNoIHdpdGggMTAgYml0cy4gIFVzZWZ1bCBmb3IgZmFzdCBvY3RyZWUgY29kZXNcbmV4cG9ydHMuaW50ZXJsZWF2ZTMgPSBmdW5jdGlvbih4LCB5LCB6KSB7XG4gIHggJj0gMHgzRkY7XG4gIHggID0gKHggfCAoeDw8MTYpKSAmIDQyNzgxOTAzMzU7XG4gIHggID0gKHggfCAoeDw8OCkpICAmIDI1MTcxOTY5NTtcbiAgeCAgPSAoeCB8ICh4PDw0KSkgICYgMzI3MjM1NjAzNTtcbiAgeCAgPSAoeCB8ICh4PDwyKSkgICYgMTIyNzEzMzUxMztcblxuICB5ICY9IDB4M0ZGO1xuICB5ICA9ICh5IHwgKHk8PDE2KSkgJiA0Mjc4MTkwMzM1O1xuICB5ICA9ICh5IHwgKHk8PDgpKSAgJiAyNTE3MTk2OTU7XG4gIHkgID0gKHkgfCAoeTw8NCkpICAmIDMyNzIzNTYwMzU7XG4gIHkgID0gKHkgfCAoeTw8MikpICAmIDEyMjcxMzM1MTM7XG4gIHggfD0gKHkgPDwgMSk7XG4gIFxuICB6ICY9IDB4M0ZGO1xuICB6ICA9ICh6IHwgKHo8PDE2KSkgJiA0Mjc4MTkwMzM1O1xuICB6ICA9ICh6IHwgKHo8PDgpKSAgJiAyNTE3MTk2OTU7XG4gIHogID0gKHogfCAoejw8NCkpICAmIDMyNzIzNTYwMzU7XG4gIHogID0gKHogfCAoejw8MikpICAmIDEyMjcxMzM1MTM7XG4gIFxuICByZXR1cm4geCB8ICh6IDw8IDIpO1xufVxuXG4vL0V4dHJhY3RzIG50aCBpbnRlcmxlYXZlZCBjb21wb25lbnQgb2YgYSAzLXR1cGxlXG5leHBvcnRzLmRlaW50ZXJsZWF2ZTMgPSBmdW5jdGlvbih2LCBuKSB7XG4gIHYgPSAodiA+Pj4gbikgICAgICAgJiAxMjI3MTMzNTEzO1xuICB2ID0gKHYgfCAodj4+PjIpKSAgICYgMzI3MjM1NjAzNTtcbiAgdiA9ICh2IHwgKHY+Pj40KSkgICAmIDI1MTcxOTY5NTtcbiAgdiA9ICh2IHwgKHY+Pj44KSkgICAmIDQyNzgxOTAzMzU7XG4gIHYgPSAodiB8ICh2Pj4+MTYpKSAgJiAweDNGRjtcbiAgcmV0dXJuICh2PDwyMik+PjIyO1xufVxuXG4vL0NvbXB1dGVzIG5leHQgY29tYmluYXRpb24gaW4gY29sZXhpY29ncmFwaGljIG9yZGVyICh0aGlzIGlzIG1pc3Rha2VubHkgY2FsbGVkIG5leHRQZXJtdXRhdGlvbiBvbiB0aGUgYml0IHR3aWRkbGluZyBoYWNrcyBwYWdlKVxuZXhwb3J0cy5uZXh0Q29tYmluYXRpb24gPSBmdW5jdGlvbih2KSB7XG4gIHZhciB0ID0gdiB8ICh2IC0gMSk7XG4gIHJldHVybiAodCArIDEpIHwgKCgofnQgJiAtfnQpIC0gMSkgPj4+IChjb3VudFRyYWlsaW5nWmVyb3ModikgKyAxKSk7XG59XG5cbiIsIlwidXNlIHN0cmljdFwiOyBcInVzZSByZXN0cmljdFwiO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFVuaW9uRmluZDtcblxuZnVuY3Rpb24gVW5pb25GaW5kKGNvdW50KSB7XG4gIHRoaXMucm9vdHMgPSBuZXcgQXJyYXkoY291bnQpO1xuICB0aGlzLnJhbmtzID0gbmV3IEFycmF5KGNvdW50KTtcbiAgXG4gIGZvcih2YXIgaT0wOyBpPGNvdW50OyArK2kpIHtcbiAgICB0aGlzLnJvb3RzW2ldID0gaTtcbiAgICB0aGlzLnJhbmtzW2ldID0gMDtcbiAgfVxufVxuXG52YXIgcHJvdG8gPSBVbmlvbkZpbmQucHJvdG90eXBlXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShwcm90bywgXCJsZW5ndGhcIiwge1xuICBcImdldFwiOiBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gdGhpcy5yb290cy5sZW5ndGhcbiAgfVxufSlcblxucHJvdG8ubWFrZVNldCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgbiA9IHRoaXMucm9vdHMubGVuZ3RoO1xuICB0aGlzLnJvb3RzLnB1c2gobik7XG4gIHRoaXMucmFua3MucHVzaCgwKTtcbiAgcmV0dXJuIG47XG59XG5cbnByb3RvLmZpbmQgPSBmdW5jdGlvbih4KSB7XG4gIHZhciB4MCA9IHhcbiAgdmFyIHJvb3RzID0gdGhpcy5yb290cztcbiAgd2hpbGUocm9vdHNbeF0gIT09IHgpIHtcbiAgICB4ID0gcm9vdHNbeF1cbiAgfVxuICB3aGlsZShyb290c1t4MF0gIT09IHgpIHtcbiAgICB2YXIgeSA9IHJvb3RzW3gwXVxuICAgIHJvb3RzW3gwXSA9IHhcbiAgICB4MCA9IHlcbiAgfVxuICByZXR1cm4geDtcbn1cblxucHJvdG8ubGluayA9IGZ1bmN0aW9uKHgsIHkpIHtcbiAgdmFyIHhyID0gdGhpcy5maW5kKHgpXG4gICAgLCB5ciA9IHRoaXMuZmluZCh5KTtcbiAgaWYoeHIgPT09IHlyKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciByYW5rcyA9IHRoaXMucmFua3NcbiAgICAsIHJvb3RzID0gdGhpcy5yb290c1xuICAgICwgeGQgICAgPSByYW5rc1t4cl1cbiAgICAsIHlkICAgID0gcmFua3NbeXJdO1xuICBpZih4ZCA8IHlkKSB7XG4gICAgcm9vdHNbeHJdID0geXI7XG4gIH0gZWxzZSBpZih5ZCA8IHhkKSB7XG4gICAgcm9vdHNbeXJdID0geHI7XG4gIH0gZWxzZSB7XG4gICAgcm9vdHNbeXJdID0geHI7XG4gICAgKytyYW5rc1t4cl07XG4gIH1cbn0iLCJcInVzZSBzdHJpY3RcIjsgXCJ1c2UgcmVzdHJpY3RcIjtcblxudmFyIGJpdHMgICAgICA9IHJlcXVpcmUoXCJiaXQtdHdpZGRsZVwiKVxuICAsIFVuaW9uRmluZCA9IHJlcXVpcmUoXCJ1bmlvbi1maW5kXCIpXG5cbi8vUmV0dXJucyB0aGUgZGltZW5zaW9uIG9mIGEgY2VsbCBjb21wbGV4XG5mdW5jdGlvbiBkaW1lbnNpb24oY2VsbHMpIHtcbiAgdmFyIGQgPSAwXG4gICAgLCBtYXggPSBNYXRoLm1heFxuICBmb3IodmFyIGk9MCwgaWw9Y2VsbHMubGVuZ3RoOyBpPGlsOyArK2kpIHtcbiAgICBkID0gbWF4KGQsIGNlbGxzW2ldLmxlbmd0aClcbiAgfVxuICByZXR1cm4gZC0xXG59XG5leHBvcnRzLmRpbWVuc2lvbiA9IGRpbWVuc2lvblxuXG4vL0NvdW50cyB0aGUgbnVtYmVyIG9mIHZlcnRpY2VzIGluIGZhY2VzXG5mdW5jdGlvbiBjb3VudFZlcnRpY2VzKGNlbGxzKSB7XG4gIHZhciB2YyA9IC0xXG4gICAgLCBtYXggPSBNYXRoLm1heFxuICBmb3IodmFyIGk9MCwgaWw9Y2VsbHMubGVuZ3RoOyBpPGlsOyArK2kpIHtcbiAgICB2YXIgYyA9IGNlbGxzW2ldXG4gICAgZm9yKHZhciBqPTAsIGpsPWMubGVuZ3RoOyBqPGpsOyArK2opIHtcbiAgICAgIHZjID0gbWF4KHZjLCBjW2pdKVxuICAgIH1cbiAgfVxuICByZXR1cm4gdmMrMVxufVxuZXhwb3J0cy5jb3VudFZlcnRpY2VzID0gY291bnRWZXJ0aWNlc1xuXG4vL1JldHVybnMgYSBkZWVwIGNvcHkgb2YgY2VsbHNcbmZ1bmN0aW9uIGNsb25lQ2VsbHMoY2VsbHMpIHtcbiAgdmFyIG5jZWxscyA9IG5ldyBBcnJheShjZWxscy5sZW5ndGgpXG4gIGZvcih2YXIgaT0wLCBpbD1jZWxscy5sZW5ndGg7IGk8aWw7ICsraSkge1xuICAgIG5jZWxsc1tpXSA9IGNlbGxzW2ldLnNsaWNlKDApXG4gIH1cbiAgcmV0dXJuIG5jZWxsc1xufVxuZXhwb3J0cy5jbG9uZUNlbGxzID0gY2xvbmVDZWxsc1xuXG4vL1JhbmtzIGEgcGFpciBvZiBjZWxscyB1cCB0byBwZXJtdXRhdGlvblxuZnVuY3Rpb24gY29tcGFyZUNlbGxzKGEsIGIpIHtcbiAgdmFyIG4gPSBhLmxlbmd0aFxuICAgICwgdCA9IGEubGVuZ3RoIC0gYi5sZW5ndGhcbiAgICAsIG1pbiA9IE1hdGgubWluXG4gIGlmKHQpIHtcbiAgICByZXR1cm4gdFxuICB9XG4gIHN3aXRjaChuKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIDA7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIGFbMF0gLSBiWzBdO1xuICAgIGNhc2UgMjpcbiAgICAgIHZhciBkID0gYVswXSthWzFdLWJbMF0tYlsxXVxuICAgICAgaWYoZCkge1xuICAgICAgICByZXR1cm4gZFxuICAgICAgfVxuICAgICAgcmV0dXJuIG1pbihhWzBdLGFbMV0pIC0gbWluKGJbMF0sYlsxXSlcbiAgICBjYXNlIDM6XG4gICAgICB2YXIgbDEgPSBhWzBdK2FbMV1cbiAgICAgICAgLCBtMSA9IGJbMF0rYlsxXVxuICAgICAgZCA9IGwxK2FbMl0gLSAobTErYlsyXSlcbiAgICAgIGlmKGQpIHtcbiAgICAgICAgcmV0dXJuIGRcbiAgICAgIH1cbiAgICAgIHZhciBsMCA9IG1pbihhWzBdLCBhWzFdKVxuICAgICAgICAsIG0wID0gbWluKGJbMF0sIGJbMV0pXG4gICAgICAgICwgZCAgPSBtaW4obDAsIGFbMl0pIC0gbWluKG0wLCBiWzJdKVxuICAgICAgaWYoZCkge1xuICAgICAgICByZXR1cm4gZFxuICAgICAgfVxuICAgICAgcmV0dXJuIG1pbihsMCthWzJdLCBsMSkgLSBtaW4obTArYlsyXSwgbTEpXG4gICAgXG4gICAgLy9UT0RPOiBNYXliZSBvcHRpbWl6ZSBuPTQgYXMgd2VsbD9cbiAgICBcbiAgICBkZWZhdWx0OlxuICAgICAgdmFyIGFzID0gYS5zbGljZSgwKVxuICAgICAgYXMuc29ydCgpXG4gICAgICB2YXIgYnMgPSBiLnNsaWNlKDApXG4gICAgICBicy5zb3J0KClcbiAgICAgIGZvcih2YXIgaT0wOyBpPG47ICsraSkge1xuICAgICAgICB0ID0gYXNbaV0gLSBic1tpXVxuICAgICAgICBpZih0KSB7XG4gICAgICAgICAgcmV0dXJuIHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIDBcbiAgfVxufVxuZXhwb3J0cy5jb21wYXJlQ2VsbHMgPSBjb21wYXJlQ2VsbHNcblxuZnVuY3Rpb24gY29tcGFyZVppcHBlZChhLCBiKSB7XG4gIHJldHVybiBjb21wYXJlQ2VsbHMoYVswXSwgYlswXSlcbn1cblxuLy9QdXRzIGEgY2VsbCBjb21wbGV4IGludG8gbm9ybWFsIG9yZGVyIGZvciB0aGUgcHVycG9zZXMgb2YgZmluZENlbGwgcXVlcmllc1xuZnVuY3Rpb24gbm9ybWFsaXplKGNlbGxzLCBhdHRyKSB7XG4gIGlmKGF0dHIpIHtcbiAgICB2YXIgbGVuID0gY2VsbHMubGVuZ3RoXG4gICAgdmFyIHppcHBlZCA9IG5ldyBBcnJheShsZW4pXG4gICAgZm9yKHZhciBpPTA7IGk8bGVuOyArK2kpIHtcbiAgICAgIHppcHBlZFtpXSA9IFtjZWxsc1tpXSwgYXR0cltpXV1cbiAgICB9XG4gICAgemlwcGVkLnNvcnQoY29tcGFyZVppcHBlZClcbiAgICBmb3IodmFyIGk9MDsgaTxsZW47ICsraSkge1xuICAgICAgY2VsbHNbaV0gPSB6aXBwZWRbaV1bMF1cbiAgICAgIGF0dHJbaV0gPSB6aXBwZWRbaV1bMV1cbiAgICB9XG4gICAgcmV0dXJuIGNlbGxzXG4gIH0gZWxzZSB7XG4gICAgY2VsbHMuc29ydChjb21wYXJlQ2VsbHMpXG4gICAgcmV0dXJuIGNlbGxzXG4gIH1cbn1cbmV4cG9ydHMubm9ybWFsaXplID0gbm9ybWFsaXplXG5cbi8vUmVtb3ZlcyBhbGwgZHVwbGljYXRlIGNlbGxzIGluIHRoZSBjb21wbGV4XG5mdW5jdGlvbiB1bmlxdWUoY2VsbHMpIHtcbiAgaWYoY2VsbHMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdXG4gIH1cbiAgdmFyIHB0ciA9IDFcbiAgICAsIGxlbiA9IGNlbGxzLmxlbmd0aFxuICBmb3IodmFyIGk9MTsgaTxsZW47ICsraSkge1xuICAgIHZhciBhID0gY2VsbHNbaV1cbiAgICBpZihjb21wYXJlQ2VsbHMoYSwgY2VsbHNbaS0xXSkpIHtcbiAgICAgIGlmKGkgPT09IHB0cikge1xuICAgICAgICBwdHIrK1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY2VsbHNbcHRyKytdID0gYVxuICAgIH1cbiAgfVxuICBjZWxscy5sZW5ndGggPSBwdHJcbiAgcmV0dXJuIGNlbGxzXG59XG5leHBvcnRzLnVuaXF1ZSA9IHVuaXF1ZTtcblxuLy9GaW5kcyBhIGNlbGwgaW4gYSBub3JtYWxpemVkIGNlbGwgY29tcGxleFxuZnVuY3Rpb24gZmluZENlbGwoY2VsbHMsIGMpIHtcbiAgdmFyIGxvID0gMFxuICAgICwgaGkgPSBjZWxscy5sZW5ndGgtMVxuICAgICwgciAgPSAtMVxuICB3aGlsZSAobG8gPD0gaGkpIHtcbiAgICB2YXIgbWlkID0gKGxvICsgaGkpID4+IDFcbiAgICAgICwgcyAgID0gY29tcGFyZUNlbGxzKGNlbGxzW21pZF0sIGMpXG4gICAgaWYocyA8PSAwKSB7XG4gICAgICBpZihzID09PSAwKSB7XG4gICAgICAgIHIgPSBtaWRcbiAgICAgIH1cbiAgICAgIGxvID0gbWlkICsgMVxuICAgIH0gZWxzZSBpZihzID4gMCkge1xuICAgICAgaGkgPSBtaWQgLSAxXG4gICAgfVxuICB9XG4gIHJldHVybiByXG59XG5leHBvcnRzLmZpbmRDZWxsID0gZmluZENlbGw7XG5cbi8vQnVpbGRzIGFuIGluZGV4IGZvciBhbiBuLWNlbGwuICBUaGlzIGlzIG1vcmUgZ2VuZXJhbCB0aGFuIGR1YWwsIGJ1dCBsZXNzIGVmZmljaWVudFxuZnVuY3Rpb24gaW5jaWRlbmNlKGZyb21fY2VsbHMsIHRvX2NlbGxzKSB7XG4gIHZhciBpbmRleCA9IG5ldyBBcnJheShmcm9tX2NlbGxzLmxlbmd0aClcbiAgZm9yKHZhciBpPTAsIGlsPWluZGV4Lmxlbmd0aDsgaTxpbDsgKytpKSB7XG4gICAgaW5kZXhbaV0gPSBbXVxuICB9XG4gIHZhciBiID0gW11cbiAgZm9yKHZhciBpPTAsIG49dG9fY2VsbHMubGVuZ3RoOyBpPG47ICsraSkge1xuICAgIHZhciBjID0gdG9fY2VsbHNbaV1cbiAgICB2YXIgY2wgPSBjLmxlbmd0aFxuICAgIGZvcih2YXIgaz0xLCBrbj0oMTw8Y2wpOyBrPGtuOyArK2spIHtcbiAgICAgIGIubGVuZ3RoID0gYml0cy5wb3BDb3VudChrKVxuICAgICAgdmFyIGwgPSAwXG4gICAgICBmb3IodmFyIGo9MDsgajxjbDsgKytqKSB7XG4gICAgICAgIGlmKGsgJiAoMTw8aikpIHtcbiAgICAgICAgICBiW2wrK10gPSBjW2pdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciBpZHg9ZmluZENlbGwoZnJvbV9jZWxscywgYilcbiAgICAgIGlmKGlkeCA8IDApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIHdoaWxlKHRydWUpIHtcbiAgICAgICAgaW5kZXhbaWR4KytdLnB1c2goaSlcbiAgICAgICAgaWYoaWR4ID49IGZyb21fY2VsbHMubGVuZ3RoIHx8IGNvbXBhcmVDZWxscyhmcm9tX2NlbGxzW2lkeF0sIGIpICE9PSAwKSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gaW5kZXhcbn1cbmV4cG9ydHMuaW5jaWRlbmNlID0gaW5jaWRlbmNlXG5cbi8vQ29tcHV0ZXMgdGhlIGR1YWwgb2YgdGhlIG1lc2guICBUaGlzIGlzIGJhc2ljYWxseSBhbiBvcHRpbWl6ZWQgdmVyc2lvbiBvZiBidWlsZEluZGV4IGZvciB0aGUgc2l0dWF0aW9uIHdoZXJlIGZyb21fY2VsbHMgaXMganVzdCB0aGUgbGlzdCBvZiB2ZXJ0aWNlc1xuZnVuY3Rpb24gZHVhbChjZWxscywgdmVydGV4X2NvdW50KSB7XG4gIGlmKCF2ZXJ0ZXhfY291bnQpIHtcbiAgICByZXR1cm4gaW5jaWRlbmNlKHVuaXF1ZShza2VsZXRvbihjZWxscywgMCkpLCBjZWxscywgMClcbiAgfVxuICB2YXIgcmVzID0gbmV3IEFycmF5KHZlcnRleF9jb3VudClcbiAgZm9yKHZhciBpPTA7IGk8dmVydGV4X2NvdW50OyArK2kpIHtcbiAgICByZXNbaV0gPSBbXVxuICB9XG4gIGZvcih2YXIgaT0wLCBsZW49Y2VsbHMubGVuZ3RoOyBpPGxlbjsgKytpKSB7XG4gICAgdmFyIGMgPSBjZWxsc1tpXVxuICAgIGZvcih2YXIgaj0wLCBjbD1jLmxlbmd0aDsgajxjbDsgKytqKSB7XG4gICAgICByZXNbY1tqXV0ucHVzaChpKVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzXG59XG5leHBvcnRzLmR1YWwgPSBkdWFsXG5cbi8vRW51bWVyYXRlcyBhbGwgY2VsbHMgaW4gdGhlIGNvbXBsZXhcbmZ1bmN0aW9uIGV4cGxvZGUoY2VsbHMpIHtcbiAgdmFyIHJlc3VsdCA9IFtdXG4gIGZvcih2YXIgaT0wLCBpbD1jZWxscy5sZW5ndGg7IGk8aWw7ICsraSkge1xuICAgIHZhciBjID0gY2VsbHNbaV1cbiAgICAgICwgY2wgPSBjLmxlbmd0aHwwXG4gICAgZm9yKHZhciBqPTEsIGpsPSgxPDxjbCk7IGo8amw7ICsraikge1xuICAgICAgdmFyIGIgPSBbXVxuICAgICAgZm9yKHZhciBrPTA7IGs8Y2w7ICsraykge1xuICAgICAgICBpZigoaiA+Pj4gaykgJiAxKSB7XG4gICAgICAgICAgYi5wdXNoKGNba10pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlc3VsdC5wdXNoKGIpXG4gICAgfVxuICB9XG4gIHJldHVybiBub3JtYWxpemUocmVzdWx0KVxufVxuZXhwb3J0cy5leHBsb2RlID0gZXhwbG9kZVxuXG4vL0VudW1lcmF0ZXMgYWxsIG9mIHRoZSBuLWNlbGxzIG9mIGEgY2VsbCBjb21wbGV4XG5mdW5jdGlvbiBza2VsZXRvbihjZWxscywgbikge1xuICBpZihuIDwgMCkge1xuICAgIHJldHVybiBbXVxuICB9XG4gIHZhciByZXN1bHQgPSBbXVxuICAgICwgazAgICAgID0gKDE8PChuKzEpKS0xXG4gIGZvcih2YXIgaT0wOyBpPGNlbGxzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGMgPSBjZWxsc1tpXVxuICAgIGZvcih2YXIgaz1rMDsgazwoMTw8Yy5sZW5ndGgpOyBrPWJpdHMubmV4dENvbWJpbmF0aW9uKGspKSB7XG4gICAgICB2YXIgYiA9IG5ldyBBcnJheShuKzEpXG4gICAgICAgICwgbCA9IDBcbiAgICAgIGZvcih2YXIgaj0wOyBqPGMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgaWYoayAmICgxPDxqKSkge1xuICAgICAgICAgIGJbbCsrXSA9IGNbal1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2goYilcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5vcm1hbGl6ZShyZXN1bHQpXG59XG5leHBvcnRzLnNrZWxldG9uID0gc2tlbGV0b247XG5cbi8vQ29tcHV0ZXMgdGhlIGJvdW5kYXJ5IG9mIGFsbCBjZWxscywgZG9lcyBub3QgcmVtb3ZlIGR1cGxpY2F0ZXNcbmZ1bmN0aW9uIGJvdW5kYXJ5KGNlbGxzKSB7XG4gIHZhciByZXMgPSBbXVxuICBmb3IodmFyIGk9MCxpbD1jZWxscy5sZW5ndGg7IGk8aWw7ICsraSkge1xuICAgIHZhciBjID0gY2VsbHNbaV1cbiAgICBmb3IodmFyIGo9MCxjbD1jLmxlbmd0aDsgajxjbDsgKytqKSB7XG4gICAgICB2YXIgYiA9IG5ldyBBcnJheShjLmxlbmd0aC0xKVxuICAgICAgZm9yKHZhciBrPTAsIGw9MDsgazxjbDsgKytrKSB7XG4gICAgICAgIGlmKGsgIT09IGopIHtcbiAgICAgICAgICBiW2wrK10gPSBjW2tdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJlcy5wdXNoKGIpXG4gICAgfVxuICB9XG4gIHJldHVybiBub3JtYWxpemUocmVzKVxufVxuZXhwb3J0cy5ib3VuZGFyeSA9IGJvdW5kYXJ5O1xuXG4vL0NvbXB1dGVzIGNvbm5lY3RlZCBjb21wb25lbnRzIGZvciBhIGRlbnNlIGNlbGwgY29tcGxleFxuZnVuY3Rpb24gY29ubmVjdGVkQ29tcG9uZW50c19kZW5zZShjZWxscywgdmVydGV4X2NvdW50KSB7XG4gIHZhciBsYWJlbHMgPSBuZXcgVW5pb25GaW5kKHZlcnRleF9jb3VudClcbiAgZm9yKHZhciBpPTA7IGk8Y2VsbHMubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYyA9IGNlbGxzW2ldXG4gICAgZm9yKHZhciBqPTA7IGo8Yy5sZW5ndGg7ICsraikge1xuICAgICAgZm9yKHZhciBrPWorMTsgazxjLmxlbmd0aDsgKytrKSB7XG4gICAgICAgIGxhYmVscy5saW5rKGNbal0sIGNba10pXG4gICAgICB9XG4gICAgfVxuICB9XG4gIHZhciBjb21wb25lbnRzID0gW11cbiAgICAsIGNvbXBvbmVudF9sYWJlbHMgPSBsYWJlbHMucmFua3NcbiAgZm9yKHZhciBpPTA7IGk8Y29tcG9uZW50X2xhYmVscy5sZW5ndGg7ICsraSkge1xuICAgIGNvbXBvbmVudF9sYWJlbHNbaV0gPSAtMVxuICB9XG4gIGZvcih2YXIgaT0wOyBpPGNlbGxzLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGwgPSBsYWJlbHMuZmluZChjZWxsc1tpXVswXSlcbiAgICBpZihjb21wb25lbnRfbGFiZWxzW2xdIDwgMCkge1xuICAgICAgY29tcG9uZW50X2xhYmVsc1tsXSA9IGNvbXBvbmVudHMubGVuZ3RoXG4gICAgICBjb21wb25lbnRzLnB1c2goW2NlbGxzW2ldLnNsaWNlKDApXSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29tcG9uZW50c1tjb21wb25lbnRfbGFiZWxzW2xdXS5wdXNoKGNlbGxzW2ldLnNsaWNlKDApKVxuICAgIH1cbiAgfVxuICByZXR1cm4gY29tcG9uZW50c1xufVxuXG4vL0NvbXB1dGVzIGNvbm5lY3RlZCBjb21wb25lbnRzIGZvciBhIHNwYXJzZSBncmFwaFxuZnVuY3Rpb24gY29ubmVjdGVkQ29tcG9uZW50c19zcGFyc2UoY2VsbHMpIHtcbiAgdmFyIHZlcnRpY2VzICA9IHVuaXF1ZShub3JtYWxpemUoc2tlbGV0b24oY2VsbHMsIDApKSlcbiAgICAsIGxhYmVscyAgICA9IG5ldyBVbmlvbkZpbmQodmVydGljZXMubGVuZ3RoKVxuICBmb3IodmFyIGk9MDsgaTxjZWxscy5sZW5ndGg7ICsraSkge1xuICAgIHZhciBjID0gY2VsbHNbaV1cbiAgICBmb3IodmFyIGo9MDsgajxjLmxlbmd0aDsgKytqKSB7XG4gICAgICB2YXIgdmogPSBmaW5kQ2VsbCh2ZXJ0aWNlcywgW2Nbal1dKVxuICAgICAgZm9yKHZhciBrPWorMTsgazxjLmxlbmd0aDsgKytrKSB7XG4gICAgICAgIGxhYmVscy5saW5rKHZqLCBmaW5kQ2VsbCh2ZXJ0aWNlcywgW2Nba11dKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdmFyIGNvbXBvbmVudHMgICAgICAgID0gW11cbiAgICAsIGNvbXBvbmVudF9sYWJlbHMgID0gbGFiZWxzLnJhbmtzXG4gIGZvcih2YXIgaT0wOyBpPGNvbXBvbmVudF9sYWJlbHMubGVuZ3RoOyArK2kpIHtcbiAgICBjb21wb25lbnRfbGFiZWxzW2ldID0gLTFcbiAgfVxuICBmb3IodmFyIGk9MDsgaTxjZWxscy5sZW5ndGg7ICsraSkge1xuICAgIHZhciBsID0gbGFiZWxzLmZpbmQoZmluZENlbGwodmVydGljZXMsIFtjZWxsc1tpXVswXV0pKTtcbiAgICBpZihjb21wb25lbnRfbGFiZWxzW2xdIDwgMCkge1xuICAgICAgY29tcG9uZW50X2xhYmVsc1tsXSA9IGNvbXBvbmVudHMubGVuZ3RoXG4gICAgICBjb21wb25lbnRzLnB1c2goW2NlbGxzW2ldLnNsaWNlKDApXSlcbiAgICB9IGVsc2Uge1xuICAgICAgY29tcG9uZW50c1tjb21wb25lbnRfbGFiZWxzW2xdXS5wdXNoKGNlbGxzW2ldLnNsaWNlKDApKVxuICAgIH1cbiAgfVxuICByZXR1cm4gY29tcG9uZW50c1xufVxuXG4vL0NvbXB1dGVzIGNvbm5lY3RlZCBjb21wb25lbnRzIGZvciBhIGNlbGwgY29tcGxleFxuZnVuY3Rpb24gY29ubmVjdGVkQ29tcG9uZW50cyhjZWxscywgdmVydGV4X2NvdW50KSB7XG4gIGlmKHZlcnRleF9jb3VudCkge1xuICAgIHJldHVybiBjb25uZWN0ZWRDb21wb25lbnRzX2RlbnNlKGNlbGxzLCB2ZXJ0ZXhfY291bnQpXG4gIH1cbiAgcmV0dXJuIGNvbm5lY3RlZENvbXBvbmVudHNfc3BhcnNlKGNlbGxzKVxufVxuZXhwb3J0cy5jb25uZWN0ZWRDb21wb25lbnRzID0gY29ubmVjdGVkQ29tcG9uZW50c1xuIiwiJ3VzZSBzdHJpY3QnXG5cbm1vZHVsZS5leHBvcnRzID0gbW9ub3RvbmVDb252ZXhIdWxsMkRcblxudmFyIG9yaWVudCA9IHJlcXVpcmUoJ3JvYnVzdC1vcmllbnRhdGlvbicpWzNdXG5cbmZ1bmN0aW9uIG1vbm90b25lQ29udmV4SHVsbDJEKHBvaW50cykge1xuICB2YXIgbiA9IHBvaW50cy5sZW5ndGhcblxuICBpZihuIDwgMykge1xuICAgIHZhciByZXN1bHQgPSBuZXcgQXJyYXkobilcbiAgICBmb3IodmFyIGk9MDsgaTxuOyArK2kpIHtcbiAgICAgIHJlc3VsdFtpXSA9IGlcbiAgICB9XG5cbiAgICBpZihuID09PSAyICYmXG4gICAgICAgcG9pbnRzWzBdWzBdID09PSBwb2ludHNbMV1bMF0gJiZcbiAgICAgICBwb2ludHNbMF1bMV0gPT09IHBvaW50c1sxXVsxXSkge1xuICAgICAgcmV0dXJuIFswXVxuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8vU29ydCBwb2ludCBpbmRpY2VzIGFsb25nIHgtYXhpc1xuICB2YXIgc29ydGVkID0gbmV3IEFycmF5KG4pXG4gIGZvcih2YXIgaT0wOyBpPG47ICsraSkge1xuICAgIHNvcnRlZFtpXSA9IGlcbiAgfVxuICBzb3J0ZWQuc29ydChmdW5jdGlvbihhLGIpIHtcbiAgICB2YXIgZCA9IHBvaW50c1thXVswXS1wb2ludHNbYl1bMF1cbiAgICBpZihkKSB7XG4gICAgICByZXR1cm4gZFxuICAgIH1cbiAgICByZXR1cm4gcG9pbnRzW2FdWzFdIC0gcG9pbnRzW2JdWzFdXG4gIH0pXG5cbiAgLy9Db25zdHJ1Y3QgdXBwZXIgYW5kIGxvd2VyIGh1bGxzXG4gIHZhciBsb3dlciA9IFtzb3J0ZWRbMF0sIHNvcnRlZFsxXV1cbiAgdmFyIHVwcGVyID0gW3NvcnRlZFswXSwgc29ydGVkWzFdXVxuXG4gIGZvcih2YXIgaT0yOyBpPG47ICsraSkge1xuICAgIHZhciBpZHggPSBzb3J0ZWRbaV1cbiAgICB2YXIgcCAgID0gcG9pbnRzW2lkeF1cblxuICAgIC8vSW5zZXJ0IGludG8gbG93ZXIgbGlzdFxuICAgIHZhciBtID0gbG93ZXIubGVuZ3RoXG4gICAgd2hpbGUobSA+IDEgJiYgb3JpZW50KFxuICAgICAgICBwb2ludHNbbG93ZXJbbS0yXV0sIFxuICAgICAgICBwb2ludHNbbG93ZXJbbS0xXV0sIFxuICAgICAgICBwKSA8PSAwKSB7XG4gICAgICBtIC09IDFcbiAgICAgIGxvd2VyLnBvcCgpXG4gICAgfVxuICAgIGxvd2VyLnB1c2goaWR4KVxuXG4gICAgLy9JbnNlcnQgaW50byB1cHBlciBsaXN0XG4gICAgbSA9IHVwcGVyLmxlbmd0aFxuICAgIHdoaWxlKG0gPiAxICYmIG9yaWVudChcbiAgICAgICAgcG9pbnRzW3VwcGVyW20tMl1dLCBcbiAgICAgICAgcG9pbnRzW3VwcGVyW20tMV1dLCBcbiAgICAgICAgcCkgPj0gMCkge1xuICAgICAgbSAtPSAxXG4gICAgICB1cHBlci5wb3AoKVxuICAgIH1cbiAgICB1cHBlci5wdXNoKGlkeClcbiAgfVxuXG4gIC8vTWVyZ2UgbGlzdHMgdG9nZXRoZXJcbiAgdmFyIHJlc3VsdCA9IG5ldyBBcnJheSh1cHBlci5sZW5ndGggKyBsb3dlci5sZW5ndGggLSAyKVxuICB2YXIgcHRyICAgID0gMFxuICBmb3IodmFyIGk9MCwgbmw9bG93ZXIubGVuZ3RoOyBpPG5sOyArK2kpIHtcbiAgICByZXN1bHRbcHRyKytdID0gbG93ZXJbaV1cbiAgfVxuICBmb3IodmFyIGo9dXBwZXIubGVuZ3RoLTI7IGo+MDsgLS1qKSB7XG4gICAgcmVzdWx0W3B0cisrXSA9IHVwcGVyW2pdXG4gIH1cblxuICAvL1JldHVybiByZXN1bHRcbiAgcmV0dXJuIHJlc3VsdFxufSIsIlwidXNlIHN0cmljdFwiO1xuXG5pZiAoZ2xvYmFsLkFuYWx5c2VyTm9kZSAmJiAhZ2xvYmFsLkFuYWx5c2VyTm9kZS5wcm90b3R5cGUuZ2V0RmxvYXRUaW1lRG9tYWluRGF0YSkge1xuICB2YXIgdWludDggPSBuZXcgVWludDhBcnJheSgyMDQ4KTtcbiAgZ2xvYmFsLkFuYWx5c2VyTm9kZS5wcm90b3R5cGUuZ2V0RmxvYXRUaW1lRG9tYWluRGF0YSA9IGZ1bmN0aW9uKGFycmF5KSB7XG4gICAgdGhpcy5nZXRCeXRlVGltZURvbWFpbkRhdGEodWludDgpO1xuICAgIGZvciAodmFyIGkgPSAwLCBpbWF4ID0gYXJyYXkubGVuZ3RoOyBpIDwgaW1heDsgaSsrKSB7XG4gICAgICBhcnJheVtpXSA9ICh1aW50OFtpXSAtIDEyOCkgKiAwLjAwNzgxMjU7XG4gICAgfVxuICB9O1xufVxuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBudW1lcmljID0gKHR5cGVvZiBleHBvcnRzID09PSBcInVuZGVmaW5lZFwiKT8oZnVuY3Rpb24gbnVtZXJpYygpIHt9KTooZXhwb3J0cyk7XG5pZih0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiKSB7IGdsb2JhbC5udW1lcmljID0gbnVtZXJpYzsgfVxuXG5udW1lcmljLnZlcnNpb24gPSBcIjEuMi42XCI7XG5cbi8vIDEuIFV0aWxpdHkgZnVuY3Rpb25zXG5udW1lcmljLmJlbmNoID0gZnVuY3Rpb24gYmVuY2ggKGYsaW50ZXJ2YWwpIHtcbiAgICB2YXIgdDEsdDIsbixpO1xuICAgIGlmKHR5cGVvZiBpbnRlcnZhbCA9PT0gXCJ1bmRlZmluZWRcIikgeyBpbnRlcnZhbCA9IDE1OyB9XG4gICAgbiA9IDAuNTtcbiAgICB0MSA9IG5ldyBEYXRlKCk7XG4gICAgd2hpbGUoMSkge1xuICAgICAgICBuKj0yO1xuICAgICAgICBmb3IoaT1uO2k+MztpLT00KSB7IGYoKTsgZigpOyBmKCk7IGYoKTsgfVxuICAgICAgICB3aGlsZShpPjApIHsgZigpOyBpLS07IH1cbiAgICAgICAgdDIgPSBuZXcgRGF0ZSgpO1xuICAgICAgICBpZih0Mi10MSA+IGludGVydmFsKSBicmVhaztcbiAgICB9XG4gICAgZm9yKGk9bjtpPjM7aS09NCkgeyBmKCk7IGYoKTsgZigpOyBmKCk7IH1cbiAgICB3aGlsZShpPjApIHsgZigpOyBpLS07IH1cbiAgICB0MiA9IG5ldyBEYXRlKCk7XG4gICAgcmV0dXJuIDEwMDAqKDMqbi0xKS8odDItdDEpO1xufVxuXG5udW1lcmljLl9teUluZGV4T2YgPSAoZnVuY3Rpb24gX215SW5kZXhPZih3KSB7XG4gICAgdmFyIG4gPSB0aGlzLmxlbmd0aCxrO1xuICAgIGZvcihrPTA7azxuOysraykgaWYodGhpc1trXT09PXcpIHJldHVybiBrO1xuICAgIHJldHVybiAtMTtcbn0pO1xubnVtZXJpYy5teUluZGV4T2YgPSAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpP0FycmF5LnByb3RvdHlwZS5pbmRleE9mOm51bWVyaWMuX215SW5kZXhPZjtcblxubnVtZXJpYy5GdW5jdGlvbiA9IEZ1bmN0aW9uO1xubnVtZXJpYy5wcmVjaXNpb24gPSA0O1xubnVtZXJpYy5sYXJnZUFycmF5ID0gNTA7XG5cbm51bWVyaWMucHJldHR5UHJpbnQgPSBmdW5jdGlvbiBwcmV0dHlQcmludCh4KSB7XG4gICAgZnVuY3Rpb24gZm10bnVtKHgpIHtcbiAgICAgICAgaWYoeCA9PT0gMCkgeyByZXR1cm4gJzAnOyB9XG4gICAgICAgIGlmKGlzTmFOKHgpKSB7IHJldHVybiAnTmFOJzsgfVxuICAgICAgICBpZih4PDApIHsgcmV0dXJuICctJytmbXRudW0oLXgpOyB9XG4gICAgICAgIGlmKGlzRmluaXRlKHgpKSB7XG4gICAgICAgICAgICB2YXIgc2NhbGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHgpIC8gTWF0aC5sb2coMTApKTtcbiAgICAgICAgICAgIHZhciBub3JtYWxpemVkID0geCAvIE1hdGgucG93KDEwLHNjYWxlKTtcbiAgICAgICAgICAgIHZhciBiYXNpYyA9IG5vcm1hbGl6ZWQudG9QcmVjaXNpb24obnVtZXJpYy5wcmVjaXNpb24pO1xuICAgICAgICAgICAgaWYocGFyc2VGbG9hdChiYXNpYykgPT09IDEwKSB7IHNjYWxlKys7IG5vcm1hbGl6ZWQgPSAxOyBiYXNpYyA9IG5vcm1hbGl6ZWQudG9QcmVjaXNpb24obnVtZXJpYy5wcmVjaXNpb24pOyB9XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChiYXNpYykudG9TdHJpbmcoKSsnZScrc2NhbGUudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ0luZmluaXR5JztcbiAgICB9XG4gICAgdmFyIHJldCA9IFtdO1xuICAgIGZ1bmN0aW9uIGZvbyh4KSB7XG4gICAgICAgIHZhciBrO1xuICAgICAgICBpZih0eXBlb2YgeCA9PT0gXCJ1bmRlZmluZWRcIikgeyByZXQucHVzaChBcnJheShudW1lcmljLnByZWNpc2lvbis4KS5qb2luKCcgJykpOyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgaWYodHlwZW9mIHggPT09IFwic3RyaW5nXCIpIHsgcmV0LnB1c2goJ1wiJyt4KydcIicpOyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgaWYodHlwZW9mIHggPT09IFwiYm9vbGVhblwiKSB7IHJldC5wdXNoKHgudG9TdHJpbmcoKSk7IHJldHVybiBmYWxzZTsgfVxuICAgICAgICBpZih0eXBlb2YgeCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgdmFyIGEgPSBmbXRudW0oeCk7XG4gICAgICAgICAgICB2YXIgYiA9IHgudG9QcmVjaXNpb24obnVtZXJpYy5wcmVjaXNpb24pO1xuICAgICAgICAgICAgdmFyIGMgPSBwYXJzZUZsb2F0KHgudG9TdHJpbmcoKSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHZhciBkID0gW2EsYixjLHBhcnNlRmxvYXQoYikudG9TdHJpbmcoKSxwYXJzZUZsb2F0KGMpLnRvU3RyaW5nKCldO1xuICAgICAgICAgICAgZm9yKGs9MTtrPGQubGVuZ3RoO2srKykgeyBpZihkW2tdLmxlbmd0aCA8IGEubGVuZ3RoKSBhID0gZFtrXTsgfVxuICAgICAgICAgICAgcmV0LnB1c2goQXJyYXkobnVtZXJpYy5wcmVjaXNpb24rOC1hLmxlbmd0aCkuam9pbignICcpK2EpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmKHggPT09IG51bGwpIHsgcmV0LnB1c2goXCJudWxsXCIpOyByZXR1cm4gZmFsc2U7IH1cbiAgICAgICAgaWYodHlwZW9mIHggPT09IFwiZnVuY3Rpb25cIikgeyBcbiAgICAgICAgICAgIHJldC5wdXNoKHgudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB2YXIgZmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yKGsgaW4geCkgeyBpZih4Lmhhc093blByb3BlcnR5KGspKSB7IFxuICAgICAgICAgICAgICAgIGlmKGZsYWcpIHJldC5wdXNoKCcsXFxuJyk7XG4gICAgICAgICAgICAgICAgZWxzZSByZXQucHVzaCgnXFxueycpO1xuICAgICAgICAgICAgICAgIGZsYWcgPSB0cnVlOyBcbiAgICAgICAgICAgICAgICByZXQucHVzaChrKTsgXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goJzogXFxuJyk7IFxuICAgICAgICAgICAgICAgIGZvbyh4W2tdKTsgXG4gICAgICAgICAgICB9IH1cbiAgICAgICAgICAgIGlmKGZsYWcpIHJldC5wdXNoKCd9XFxuJyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZih4IGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgIGlmKHgubGVuZ3RoID4gbnVtZXJpYy5sYXJnZUFycmF5KSB7IHJldC5wdXNoKCcuLi5MYXJnZSBBcnJheS4uLicpOyByZXR1cm4gdHJ1ZTsgfVxuICAgICAgICAgICAgdmFyIGZsYWcgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldC5wdXNoKCdbJyk7XG4gICAgICAgICAgICBmb3Ioaz0wO2s8eC5sZW5ndGg7aysrKSB7IGlmKGs+MCkgeyByZXQucHVzaCgnLCcpOyBpZihmbGFnKSByZXQucHVzaCgnXFxuICcpOyB9IGZsYWcgPSBmb28oeFtrXSk7IH1cbiAgICAgICAgICAgIHJldC5wdXNoKCddJyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXQucHVzaCgneycpO1xuICAgICAgICB2YXIgZmxhZyA9IGZhbHNlO1xuICAgICAgICBmb3IoayBpbiB4KSB7IGlmKHguaGFzT3duUHJvcGVydHkoaykpIHsgaWYoZmxhZykgcmV0LnB1c2goJyxcXG4nKTsgZmxhZyA9IHRydWU7IHJldC5wdXNoKGspOyByZXQucHVzaCgnOiBcXG4nKTsgZm9vKHhba10pOyB9IH1cbiAgICAgICAgcmV0LnB1c2goJ30nKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGZvbyh4KTtcbiAgICByZXR1cm4gcmV0LmpvaW4oJycpO1xufVxuXG5udW1lcmljLnBhcnNlRGF0ZSA9IGZ1bmN0aW9uIHBhcnNlRGF0ZShkKSB7XG4gICAgZnVuY3Rpb24gZm9vKGQpIHtcbiAgICAgICAgaWYodHlwZW9mIGQgPT09ICdzdHJpbmcnKSB7IHJldHVybiBEYXRlLnBhcnNlKGQucmVwbGFjZSgvLS9nLCcvJykpOyB9XG4gICAgICAgIGlmKCEoZCBpbnN0YW5jZW9mIEFycmF5KSkgeyB0aHJvdyBuZXcgRXJyb3IoXCJwYXJzZURhdGU6IHBhcmFtZXRlciBtdXN0IGJlIGFycmF5cyBvZiBzdHJpbmdzXCIpOyB9XG4gICAgICAgIHZhciByZXQgPSBbXSxrO1xuICAgICAgICBmb3Ioaz0wO2s8ZC5sZW5ndGg7aysrKSB7IHJldFtrXSA9IGZvbyhkW2tdKTsgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICByZXR1cm4gZm9vKGQpO1xufVxuXG5udW1lcmljLnBhcnNlRmxvYXQgPSBmdW5jdGlvbiBwYXJzZUZsb2F0XyhkKSB7XG4gICAgZnVuY3Rpb24gZm9vKGQpIHtcbiAgICAgICAgaWYodHlwZW9mIGQgPT09ICdzdHJpbmcnKSB7IHJldHVybiBwYXJzZUZsb2F0KGQpOyB9XG4gICAgICAgIGlmKCEoZCBpbnN0YW5jZW9mIEFycmF5KSkgeyB0aHJvdyBuZXcgRXJyb3IoXCJwYXJzZUZsb2F0OiBwYXJhbWV0ZXIgbXVzdCBiZSBhcnJheXMgb2Ygc3RyaW5nc1wiKTsgfVxuICAgICAgICB2YXIgcmV0ID0gW10saztcbiAgICAgICAgZm9yKGs9MDtrPGQubGVuZ3RoO2srKykgeyByZXRba10gPSBmb28oZFtrXSk7IH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG4gICAgcmV0dXJuIGZvbyhkKTtcbn1cblxubnVtZXJpYy5wYXJzZUNTViA9IGZ1bmN0aW9uIHBhcnNlQ1NWKHQpIHtcbiAgICB2YXIgZm9vID0gdC5zcGxpdCgnXFxuJyk7XG4gICAgdmFyIGosaztcbiAgICB2YXIgcmV0ID0gW107XG4gICAgdmFyIHBhdCA9IC8oKFteJ1wiLF0qKXwoJ1teJ10qJyl8KFwiW15cIl0qXCIpKSwvZztcbiAgICB2YXIgcGF0bnVtID0gL15cXHMqKChbKy1dP1swLTldKyhcXC5bMC05XSopPyhlWystXT9bMC05XSspPyl8KFsrLV0/WzAtOV0qKFxcLlswLTldKyk/KGVbKy1dP1swLTldKyk/KSlcXHMqJC87XG4gICAgdmFyIHN0cmlwcGVyID0gZnVuY3Rpb24obikgeyByZXR1cm4gbi5zdWJzdHIoMCxuLmxlbmd0aC0xKTsgfVxuICAgIHZhciBjb3VudCA9IDA7XG4gICAgZm9yKGs9MDtrPGZvby5sZW5ndGg7aysrKSB7XG4gICAgICB2YXIgYmFyID0gKGZvb1trXStcIixcIikubWF0Y2gocGF0KSxiYXo7XG4gICAgICBpZihiYXIubGVuZ3RoPjApIHtcbiAgICAgICAgICByZXRbY291bnRdID0gW107XG4gICAgICAgICAgZm9yKGo9MDtqPGJhci5sZW5ndGg7aisrKSB7XG4gICAgICAgICAgICAgIGJheiA9IHN0cmlwcGVyKGJhcltqXSk7XG4gICAgICAgICAgICAgIGlmKHBhdG51bS50ZXN0KGJheikpIHsgcmV0W2NvdW50XVtqXSA9IHBhcnNlRmxvYXQoYmF6KTsgfVxuICAgICAgICAgICAgICBlbHNlIHJldFtjb3VudF1bal0gPSBiYXo7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvdW50Kys7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59XG5cbm51bWVyaWMudG9DU1YgPSBmdW5jdGlvbiB0b0NTVihBKSB7XG4gICAgdmFyIHMgPSBudW1lcmljLmRpbShBKTtcbiAgICB2YXIgaSxqLG0sbixyb3cscmV0O1xuICAgIG0gPSBzWzBdO1xuICAgIG4gPSBzWzFdO1xuICAgIHJldCA9IFtdO1xuICAgIGZvcihpPTA7aTxtO2krKykge1xuICAgICAgICByb3cgPSBbXTtcbiAgICAgICAgZm9yKGo9MDtqPG07aisrKSB7IHJvd1tqXSA9IEFbaV1bal0udG9TdHJpbmcoKTsgfVxuICAgICAgICByZXRbaV0gPSByb3cuam9pbignLCAnKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldC5qb2luKCdcXG4nKSsnXFxuJztcbn1cblxubnVtZXJpYy5nZXRVUkwgPSBmdW5jdGlvbiBnZXRVUkwodXJsKSB7XG4gICAgdmFyIGNsaWVudCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIGNsaWVudC5vcGVuKFwiR0VUXCIsdXJsLGZhbHNlKTtcbiAgICBjbGllbnQuc2VuZCgpO1xuICAgIHJldHVybiBjbGllbnQ7XG59XG5cbm51bWVyaWMuaW1hZ2VVUkwgPSBmdW5jdGlvbiBpbWFnZVVSTChpbWcpIHtcbiAgICBmdW5jdGlvbiBiYXNlNjQoQSkge1xuICAgICAgICB2YXIgbiA9IEEubGVuZ3RoLCBpLHgseSx6LHAscSxyLHM7XG4gICAgICAgIHZhciBrZXkgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCI7XG4gICAgICAgIHZhciByZXQgPSBcIlwiO1xuICAgICAgICBmb3IoaT0wO2k8bjtpKz0zKSB7XG4gICAgICAgICAgICB4ID0gQVtpXTtcbiAgICAgICAgICAgIHkgPSBBW2krMV07XG4gICAgICAgICAgICB6ID0gQVtpKzJdO1xuICAgICAgICAgICAgcCA9IHggPj4gMjtcbiAgICAgICAgICAgIHEgPSAoKHggJiAzKSA8PCA0KSArICh5ID4+IDQpO1xuICAgICAgICAgICAgciA9ICgoeSAmIDE1KSA8PCAyKSArICh6ID4+IDYpO1xuICAgICAgICAgICAgcyA9IHogJiA2MztcbiAgICAgICAgICAgIGlmKGkrMT49bikgeyByID0gcyA9IDY0OyB9XG4gICAgICAgICAgICBlbHNlIGlmKGkrMj49bikgeyBzID0gNjQ7IH1cbiAgICAgICAgICAgIHJldCArPSBrZXkuY2hhckF0KHApICsga2V5LmNoYXJBdChxKSArIGtleS5jaGFyQXQocikgKyBrZXkuY2hhckF0KHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICBmdW5jdGlvbiBjcmMzMkFycmF5IChhLGZyb20sdG8pIHtcbiAgICAgICAgaWYodHlwZW9mIGZyb20gPT09IFwidW5kZWZpbmVkXCIpIHsgZnJvbSA9IDA7IH1cbiAgICAgICAgaWYodHlwZW9mIHRvID09PSBcInVuZGVmaW5lZFwiKSB7IHRvID0gYS5sZW5ndGg7IH1cbiAgICAgICAgdmFyIHRhYmxlID0gWzB4MDAwMDAwMDAsIDB4NzcwNzMwOTYsIDB4RUUwRTYxMkMsIDB4OTkwOTUxQkEsIDB4MDc2REM0MTksIDB4NzA2QUY0OEYsIDB4RTk2M0E1MzUsIDB4OUU2NDk1QTMsXG4gICAgICAgICAgICAgICAgICAgICAweDBFREI4ODMyLCAweDc5RENCOEE0LCAweEUwRDVFOTFFLCAweDk3RDJEOTg4LCAweDA5QjY0QzJCLCAweDdFQjE3Q0JELCAweEU3QjgyRDA3LCAweDkwQkYxRDkxLCBcbiAgICAgICAgICAgICAgICAgICAgIDB4MURCNzEwNjQsIDB4NkFCMDIwRjIsIDB4RjNCOTcxNDgsIDB4ODRCRTQxREUsIDB4MUFEQUQ0N0QsIDB4NkREREU0RUIsIDB4RjRENEI1NTEsIDB4ODNEMzg1QzcsXG4gICAgICAgICAgICAgICAgICAgICAweDEzNkM5ODU2LCAweDY0NkJBOEMwLCAweEZENjJGOTdBLCAweDhBNjVDOUVDLCAweDE0MDE1QzRGLCAweDYzMDY2Q0Q5LCAweEZBMEYzRDYzLCAweDhEMDgwREY1LCBcbiAgICAgICAgICAgICAgICAgICAgIDB4M0I2RTIwQzgsIDB4NEM2OTEwNUUsIDB4RDU2MDQxRTQsIDB4QTI2NzcxNzIsIDB4M0MwM0U0RDEsIDB4NEIwNEQ0NDcsIDB4RDIwRDg1RkQsIDB4QTUwQUI1NkIsIFxuICAgICAgICAgICAgICAgICAgICAgMHgzNUI1QThGQSwgMHg0MkIyOTg2QywgMHhEQkJCQzlENiwgMHhBQ0JDRjk0MCwgMHgzMkQ4NkNFMywgMHg0NURGNUM3NSwgMHhEQ0Q2MERDRiwgMHhBQkQxM0Q1OSwgXG4gICAgICAgICAgICAgICAgICAgICAweDI2RDkzMEFDLCAweDUxREUwMDNBLCAweEM4RDc1MTgwLCAweEJGRDA2MTE2LCAweDIxQjRGNEI1LCAweDU2QjNDNDIzLCAweENGQkE5NTk5LCAweEI4QkRBNTBGLFxuICAgICAgICAgICAgICAgICAgICAgMHgyODAyQjg5RSwgMHg1RjA1ODgwOCwgMHhDNjBDRDlCMiwgMHhCMTBCRTkyNCwgMHgyRjZGN0M4NywgMHg1ODY4NEMxMSwgMHhDMTYxMURBQiwgMHhCNjY2MkQzRCxcbiAgICAgICAgICAgICAgICAgICAgIDB4NzZEQzQxOTAsIDB4MDFEQjcxMDYsIDB4OThEMjIwQkMsIDB4RUZENTEwMkEsIDB4NzFCMTg1ODksIDB4MDZCNkI1MUYsIDB4OUZCRkU0QTUsIDB4RThCOEQ0MzMsXG4gICAgICAgICAgICAgICAgICAgICAweDc4MDdDOUEyLCAweDBGMDBGOTM0LCAweDk2MDlBODhFLCAweEUxMEU5ODE4LCAweDdGNkEwREJCLCAweDA4NkQzRDJELCAweDkxNjQ2Qzk3LCAweEU2NjM1QzAxLCBcbiAgICAgICAgICAgICAgICAgICAgIDB4NkI2QjUxRjQsIDB4MUM2QzYxNjIsIDB4ODU2NTMwRDgsIDB4RjI2MjAwNEUsIDB4NkMwNjk1RUQsIDB4MUIwMUE1N0IsIDB4ODIwOEY0QzEsIDB4RjUwRkM0NTcsIFxuICAgICAgICAgICAgICAgICAgICAgMHg2NUIwRDlDNiwgMHgxMkI3RTk1MCwgMHg4QkJFQjhFQSwgMHhGQ0I5ODg3QywgMHg2MkREMURERiwgMHgxNURBMkQ0OSwgMHg4Q0QzN0NGMywgMHhGQkQ0NEM2NSwgXG4gICAgICAgICAgICAgICAgICAgICAweDREQjI2MTU4LCAweDNBQjU1MUNFLCAweEEzQkMwMDc0LCAweEQ0QkIzMEUyLCAweDRBREZBNTQxLCAweDNERDg5NUQ3LCAweEE0RDFDNDZELCAweEQzRDZGNEZCLCBcbiAgICAgICAgICAgICAgICAgICAgIDB4NDM2OUU5NkEsIDB4MzQ2RUQ5RkMsIDB4QUQ2Nzg4NDYsIDB4REE2MEI4RDAsIDB4NDQwNDJENzMsIDB4MzMwMzFERTUsIDB4QUEwQTRDNUYsIDB4REQwRDdDQzksIFxuICAgICAgICAgICAgICAgICAgICAgMHg1MDA1NzEzQywgMHgyNzAyNDFBQSwgMHhCRTBCMTAxMCwgMHhDOTBDMjA4NiwgMHg1NzY4QjUyNSwgMHgyMDZGODVCMywgMHhCOTY2RDQwOSwgMHhDRTYxRTQ5RiwgXG4gICAgICAgICAgICAgICAgICAgICAweDVFREVGOTBFLCAweDI5RDlDOTk4LCAweEIwRDA5ODIyLCAweEM3RDdBOEI0LCAweDU5QjMzRDE3LCAweDJFQjQwRDgxLCAweEI3QkQ1QzNCLCAweEMwQkE2Q0FELCBcbiAgICAgICAgICAgICAgICAgICAgIDB4RURCODgzMjAsIDB4OUFCRkIzQjYsIDB4MDNCNkUyMEMsIDB4NzRCMUQyOUEsIDB4RUFENTQ3MzksIDB4OUREMjc3QUYsIDB4MDREQjI2MTUsIDB4NzNEQzE2ODMsIFxuICAgICAgICAgICAgICAgICAgICAgMHhFMzYzMEIxMiwgMHg5NDY0M0I4NCwgMHgwRDZENkEzRSwgMHg3QTZBNUFBOCwgMHhFNDBFQ0YwQiwgMHg5MzA5RkY5RCwgMHgwQTAwQUUyNywgMHg3RDA3OUVCMSwgXG4gICAgICAgICAgICAgICAgICAgICAweEYwMEY5MzQ0LCAweDg3MDhBM0QyLCAweDFFMDFGMjY4LCAweDY5MDZDMkZFLCAweEY3NjI1NzVELCAweDgwNjU2N0NCLCAweDE5NkMzNjcxLCAweDZFNkIwNkU3LCBcbiAgICAgICAgICAgICAgICAgICAgIDB4RkVENDFCNzYsIDB4ODlEMzJCRTAsIDB4MTBEQTdBNUEsIDB4NjdERDRBQ0MsIDB4RjlCOURGNkYsIDB4OEVCRUVGRjksIDB4MTdCN0JFNDMsIDB4NjBCMDhFRDUsIFxuICAgICAgICAgICAgICAgICAgICAgMHhENkQ2QTNFOCwgMHhBMUQxOTM3RSwgMHgzOEQ4QzJDNCwgMHg0RkRGRjI1MiwgMHhEMUJCNjdGMSwgMHhBNkJDNTc2NywgMHgzRkI1MDZERCwgMHg0OEIyMzY0QiwgXG4gICAgICAgICAgICAgICAgICAgICAweEQ4MEQyQkRBLCAweEFGMEExQjRDLCAweDM2MDM0QUY2LCAweDQxMDQ3QTYwLCAweERGNjBFRkMzLCAweEE4NjdERjU1LCAweDMxNkU4RUVGLCAweDQ2NjlCRTc5LCBcbiAgICAgICAgICAgICAgICAgICAgIDB4Q0I2MUIzOEMsIDB4QkM2NjgzMUEsIDB4MjU2RkQyQTAsIDB4NTI2OEUyMzYsIDB4Q0MwQzc3OTUsIDB4QkIwQjQ3MDMsIDB4MjIwMjE2QjksIDB4NTUwNTI2MkYsIFxuICAgICAgICAgICAgICAgICAgICAgMHhDNUJBM0JCRSwgMHhCMkJEMEIyOCwgMHgyQkI0NUE5MiwgMHg1Q0IzNkEwNCwgMHhDMkQ3RkZBNywgMHhCNUQwQ0YzMSwgMHgyQ0Q5OUU4QiwgMHg1QkRFQUUxRCwgXG4gICAgICAgICAgICAgICAgICAgICAweDlCNjRDMkIwLCAweEVDNjNGMjI2LCAweDc1NkFBMzlDLCAweDAyNkQ5MzBBLCAweDlDMDkwNkE5LCAweEVCMEUzNjNGLCAweDcyMDc2Nzg1LCAweDA1MDA1NzEzLCBcbiAgICAgICAgICAgICAgICAgICAgIDB4OTVCRjRBODIsIDB4RTJCODdBMTQsIDB4N0JCMTJCQUUsIDB4MENCNjFCMzgsIDB4OTJEMjhFOUIsIDB4RTVENUJFMEQsIDB4N0NEQ0VGQjcsIDB4MEJEQkRGMjEsIFxuICAgICAgICAgICAgICAgICAgICAgMHg4NkQzRDJENCwgMHhGMUQ0RTI0MiwgMHg2OEREQjNGOCwgMHgxRkRBODM2RSwgMHg4MUJFMTZDRCwgMHhGNkI5MjY1QiwgMHg2RkIwNzdFMSwgMHgxOEI3NDc3NywgXG4gICAgICAgICAgICAgICAgICAgICAweDg4MDg1QUU2LCAweEZGMEY2QTcwLCAweDY2MDYzQkNBLCAweDExMDEwQjVDLCAweDhGNjU5RUZGLCAweEY4NjJBRTY5LCAweDYxNkJGRkQzLCAweDE2NkNDRjQ1LCBcbiAgICAgICAgICAgICAgICAgICAgIDB4QTAwQUUyNzgsIDB4RDcwREQyRUUsIDB4NEUwNDgzNTQsIDB4MzkwM0IzQzIsIDB4QTc2NzI2NjEsIDB4RDA2MDE2RjcsIDB4NDk2OTQ3NEQsIDB4M0U2RTc3REIsIFxuICAgICAgICAgICAgICAgICAgICAgMHhBRUQxNkE0QSwgMHhEOUQ2NUFEQywgMHg0MERGMEI2NiwgMHgzN0Q4M0JGMCwgMHhBOUJDQUU1MywgMHhERUJCOUVDNSwgMHg0N0IyQ0Y3RiwgMHgzMEI1RkZFOSwgXG4gICAgICAgICAgICAgICAgICAgICAweEJEQkRGMjFDLCAweENBQkFDMjhBLCAweDUzQjM5MzMwLCAweDI0QjRBM0E2LCAweEJBRDAzNjA1LCAweENERDcwNjkzLCAweDU0REU1NzI5LCAweDIzRDk2N0JGLCBcbiAgICAgICAgICAgICAgICAgICAgIDB4QjM2NjdBMkUsIDB4QzQ2MTRBQjgsIDB4NUQ2ODFCMDIsIDB4MkE2RjJCOTQsIDB4QjQwQkJFMzcsIDB4QzMwQzhFQTEsIDB4NUEwNURGMUIsIDB4MkQwMkVGOERdO1xuICAgICBcbiAgICAgICAgdmFyIGNyYyA9IC0xLCB5ID0gMCwgbiA9IGEubGVuZ3RoLGk7XG5cbiAgICAgICAgZm9yIChpID0gZnJvbTsgaSA8IHRvOyBpKyspIHtcbiAgICAgICAgICAgIHkgPSAoY3JjIF4gYVtpXSkgJiAweEZGO1xuICAgICAgICAgICAgY3JjID0gKGNyYyA+Pj4gOCkgXiB0YWJsZVt5XTtcbiAgICAgICAgfVxuICAgICBcbiAgICAgICAgcmV0dXJuIGNyYyBeICgtMSk7XG4gICAgfVxuXG4gICAgdmFyIGggPSBpbWdbMF0ubGVuZ3RoLCB3ID0gaW1nWzBdWzBdLmxlbmd0aCwgczEsIHMyLCBuZXh0LGssbGVuZ3RoLGEsYixpLGosYWRsZXIzMixjcmMzMjtcbiAgICB2YXIgc3RyZWFtID0gW1xuICAgICAgICAgICAgICAgICAgMTM3LCA4MCwgNzgsIDcxLCAxMywgMTAsIDI2LCAxMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgMDogUE5HIHNpZ25hdHVyZVxuICAgICAgICAgICAgICAgICAgMCwwLDAsMTMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgODogSUhEUiBDaHVuayBsZW5ndGhcbiAgICAgICAgICAgICAgICAgIDczLCA3MiwgNjgsIDgyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTI6IFwiSUhEUlwiIFxuICAgICAgICAgICAgICAgICAgKHcgPj4gMjQpICYgMjU1LCAodyA+PiAxNikgJiAyNTUsICh3ID4+IDgpICYgMjU1LCB3JjI1NSwgICAvLyAxNjogV2lkdGhcbiAgICAgICAgICAgICAgICAgIChoID4+IDI0KSAmIDI1NSwgKGggPj4gMTYpICYgMjU1LCAoaCA+PiA4KSAmIDI1NSwgaCYyNTUsICAgLy8gMjA6IEhlaWdodFxuICAgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyNDogYml0IGRlcHRoXG4gICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI1OiBSR0JcbiAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMjY6IGRlZmxhdGVcbiAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMjc6IG5vIGZpbHRlclxuICAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyODogbm8gaW50ZXJsYWNlXG4gICAgICAgICAgICAgICAgICAtMSwtMiwtMywtNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI5OiBDUkNcbiAgICAgICAgICAgICAgICAgIC01LC02LC03LC04LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMzM6IElEQVQgQ2h1bmsgbGVuZ3RoXG4gICAgICAgICAgICAgICAgICA3MywgNjgsIDY1LCA4NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDM3OiBcIklEQVRcIlxuICAgICAgICAgICAgICAgICAgLy8gUkZDIDE5NTAgaGVhZGVyIHN0YXJ0cyBoZXJlXG4gICAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDQxOiBSRkMxOTUwIENNRlxuICAgICAgICAgICAgICAgICAgMjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0MjogUkZDMTk1MCBGTEdcbiAgICAgICAgICAgICAgICAgIF07XG4gICAgY3JjMzIgPSBjcmMzMkFycmF5KHN0cmVhbSwxMiwyOSk7XG4gICAgc3RyZWFtWzI5XSA9IChjcmMzMj4+MjQpJjI1NTtcbiAgICBzdHJlYW1bMzBdID0gKGNyYzMyPj4xNikmMjU1O1xuICAgIHN0cmVhbVszMV0gPSAoY3JjMzI+PjgpJjI1NTtcbiAgICBzdHJlYW1bMzJdID0gKGNyYzMyKSYyNTU7XG4gICAgczEgPSAxO1xuICAgIHMyID0gMDtcbiAgICBmb3IoaT0wO2k8aDtpKyspIHtcbiAgICAgICAgaWYoaTxoLTEpIHsgc3RyZWFtLnB1c2goMCk7IH1cbiAgICAgICAgZWxzZSB7IHN0cmVhbS5wdXNoKDEpOyB9XG4gICAgICAgIGEgPSAoMyp3KzErKGk9PT0wKSkmMjU1OyBiID0gKCgzKncrMSsoaT09PTApKT4+OCkmMjU1O1xuICAgICAgICBzdHJlYW0ucHVzaChhKTsgc3RyZWFtLnB1c2goYik7XG4gICAgICAgIHN0cmVhbS5wdXNoKCh+YSkmMjU1KTsgc3RyZWFtLnB1c2goKH5iKSYyNTUpO1xuICAgICAgICBpZihpPT09MCkgc3RyZWFtLnB1c2goMCk7XG4gICAgICAgIGZvcihqPTA7ajx3O2orKykge1xuICAgICAgICAgICAgZm9yKGs9MDtrPDM7aysrKSB7XG4gICAgICAgICAgICAgICAgYSA9IGltZ1trXVtpXVtqXTtcbiAgICAgICAgICAgICAgICBpZihhPjI1NSkgYSA9IDI1NTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmKGE8MCkgYT0wO1xuICAgICAgICAgICAgICAgIGVsc2UgYSA9IE1hdGgucm91bmQoYSk7XG4gICAgICAgICAgICAgICAgczEgPSAoczEgKyBhICklNjU1MjE7XG4gICAgICAgICAgICAgICAgczIgPSAoczIgKyBzMSklNjU1MjE7XG4gICAgICAgICAgICAgICAgc3RyZWFtLnB1c2goYSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc3RyZWFtLnB1c2goMCk7XG4gICAgfVxuICAgIGFkbGVyMzIgPSAoczI8PDE2KStzMTtcbiAgICBzdHJlYW0ucHVzaCgoYWRsZXIzMj4+MjQpJjI1NSk7XG4gICAgc3RyZWFtLnB1c2goKGFkbGVyMzI+PjE2KSYyNTUpO1xuICAgIHN0cmVhbS5wdXNoKChhZGxlcjMyPj44KSYyNTUpO1xuICAgIHN0cmVhbS5wdXNoKChhZGxlcjMyKSYyNTUpO1xuICAgIGxlbmd0aCA9IHN0cmVhbS5sZW5ndGggLSA0MTtcbiAgICBzdHJlYW1bMzNdID0gKGxlbmd0aD4+MjQpJjI1NTtcbiAgICBzdHJlYW1bMzRdID0gKGxlbmd0aD4+MTYpJjI1NTtcbiAgICBzdHJlYW1bMzVdID0gKGxlbmd0aD4+OCkmMjU1O1xuICAgIHN0cmVhbVszNl0gPSAobGVuZ3RoKSYyNTU7XG4gICAgY3JjMzIgPSBjcmMzMkFycmF5KHN0cmVhbSwzNyk7XG4gICAgc3RyZWFtLnB1c2goKGNyYzMyPj4yNCkmMjU1KTtcbiAgICBzdHJlYW0ucHVzaCgoY3JjMzI+PjE2KSYyNTUpO1xuICAgIHN0cmVhbS5wdXNoKChjcmMzMj4+OCkmMjU1KTtcbiAgICBzdHJlYW0ucHVzaCgoY3JjMzIpJjI1NSk7XG4gICAgc3RyZWFtLnB1c2goMCk7XG4gICAgc3RyZWFtLnB1c2goMCk7XG4gICAgc3RyZWFtLnB1c2goMCk7XG4gICAgc3RyZWFtLnB1c2goMCk7XG4vLyAgICBhID0gc3RyZWFtLmxlbmd0aDtcbiAgICBzdHJlYW0ucHVzaCg3Myk7ICAvLyBJXG4gICAgc3RyZWFtLnB1c2goNjkpOyAgLy8gRVxuICAgIHN0cmVhbS5wdXNoKDc4KTsgIC8vIE5cbiAgICBzdHJlYW0ucHVzaCg2OCk7ICAvLyBEXG4gICAgc3RyZWFtLnB1c2goMTc0KTsgLy8gQ1JDMVxuICAgIHN0cmVhbS5wdXNoKDY2KTsgIC8vIENSQzJcbiAgICBzdHJlYW0ucHVzaCg5Nik7ICAvLyBDUkMzXG4gICAgc3RyZWFtLnB1c2goMTMwKTsgLy8gQ1JDNFxuICAgIHJldHVybiAnZGF0YTppbWFnZS9wbmc7YmFzZTY0LCcrYmFzZTY0KHN0cmVhbSk7XG59XG5cbi8vIDIuIExpbmVhciBhbGdlYnJhIHdpdGggQXJyYXlzLlxubnVtZXJpYy5fZGltID0gZnVuY3Rpb24gX2RpbSh4KSB7XG4gICAgdmFyIHJldCA9IFtdO1xuICAgIHdoaWxlKHR5cGVvZiB4ID09PSBcIm9iamVjdFwiKSB7IHJldC5wdXNoKHgubGVuZ3RoKTsgeCA9IHhbMF07IH1cbiAgICByZXR1cm4gcmV0O1xufVxuXG5udW1lcmljLmRpbSA9IGZ1bmN0aW9uIGRpbSh4KSB7XG4gICAgdmFyIHksejtcbiAgICBpZih0eXBlb2YgeCA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICB5ID0geFswXTtcbiAgICAgICAgaWYodHlwZW9mIHkgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIHogPSB5WzBdO1xuICAgICAgICAgICAgaWYodHlwZW9mIHogPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtZXJpYy5fZGltKHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFt4Lmxlbmd0aCx5Lmxlbmd0aF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFt4Lmxlbmd0aF07XG4gICAgfVxuICAgIHJldHVybiBbXTtcbn1cblxubnVtZXJpYy5tYXByZWR1Y2UgPSBmdW5jdGlvbiBtYXByZWR1Y2UoYm9keSxpbml0KSB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uKCd4JywnYWNjdW0nLCdfcycsJ19rJyxcbiAgICAgICAgICAgICdpZih0eXBlb2YgYWNjdW0gPT09IFwidW5kZWZpbmVkXCIpIGFjY3VtID0gJytpbml0Kyc7XFxuJytcbiAgICAgICAgICAgICdpZih0eXBlb2YgeCA9PT0gXCJudW1iZXJcIikgeyB2YXIgeGkgPSB4OyAnK2JvZHkrJzsgcmV0dXJuIGFjY3VtOyB9XFxuJytcbiAgICAgICAgICAgICdpZih0eXBlb2YgX3MgPT09IFwidW5kZWZpbmVkXCIpIF9zID0gbnVtZXJpYy5kaW0oeCk7XFxuJytcbiAgICAgICAgICAgICdpZih0eXBlb2YgX2sgPT09IFwidW5kZWZpbmVkXCIpIF9rID0gMDtcXG4nK1xuICAgICAgICAgICAgJ3ZhciBfbiA9IF9zW19rXTtcXG4nK1xuICAgICAgICAgICAgJ3ZhciBpLHhpO1xcbicrXG4gICAgICAgICAgICAnaWYoX2sgPCBfcy5sZW5ndGgtMSkge1xcbicrXG4gICAgICAgICAgICAnICAgIGZvcihpPV9uLTE7aT49MDtpLS0pIHtcXG4nK1xuICAgICAgICAgICAgJyAgICAgICAgYWNjdW0gPSBhcmd1bWVudHMuY2FsbGVlKHhbaV0sYWNjdW0sX3MsX2srMSk7XFxuJytcbiAgICAgICAgICAgICcgICAgfScrXG4gICAgICAgICAgICAnICAgIHJldHVybiBhY2N1bTtcXG4nK1xuICAgICAgICAgICAgJ31cXG4nK1xuICAgICAgICAgICAgJ2ZvcihpPV9uLTE7aT49MTtpLT0yKSB7IFxcbicrXG4gICAgICAgICAgICAnICAgIHhpID0geFtpXTtcXG4nK1xuICAgICAgICAgICAgJyAgICAnK2JvZHkrJztcXG4nK1xuICAgICAgICAgICAgJyAgICB4aSA9IHhbaS0xXTtcXG4nK1xuICAgICAgICAgICAgJyAgICAnK2JvZHkrJztcXG4nK1xuICAgICAgICAgICAgJ31cXG4nK1xuICAgICAgICAgICAgJ2lmKGkgPT09IDApIHtcXG4nK1xuICAgICAgICAgICAgJyAgICB4aSA9IHhbaV07XFxuJytcbiAgICAgICAgICAgICcgICAgJytib2R5KydcXG4nK1xuICAgICAgICAgICAgJ31cXG4nK1xuICAgICAgICAgICAgJ3JldHVybiBhY2N1bTsnXG4gICAgICAgICAgICApO1xufVxubnVtZXJpYy5tYXByZWR1Y2UyID0gZnVuY3Rpb24gbWFwcmVkdWNlMihib2R5LHNldHVwKSB7XG4gICAgcmV0dXJuIEZ1bmN0aW9uKCd4JyxcbiAgICAgICAgICAgICd2YXIgbiA9IHgubGVuZ3RoO1xcbicrXG4gICAgICAgICAgICAndmFyIGkseGk7XFxuJytzZXR1cCsnO1xcbicrXG4gICAgICAgICAgICAnZm9yKGk9bi0xO2khPT0tMTstLWkpIHsgXFxuJytcbiAgICAgICAgICAgICcgICAgeGkgPSB4W2ldO1xcbicrXG4gICAgICAgICAgICAnICAgICcrYm9keSsnO1xcbicrXG4gICAgICAgICAgICAnfVxcbicrXG4gICAgICAgICAgICAncmV0dXJuIGFjY3VtOydcbiAgICAgICAgICAgICk7XG59XG5cblxubnVtZXJpYy5zYW1lID0gZnVuY3Rpb24gc2FtZSh4LHkpIHtcbiAgICB2YXIgaSxuO1xuICAgIGlmKCEoeCBpbnN0YW5jZW9mIEFycmF5KSB8fCAhKHkgaW5zdGFuY2VvZiBBcnJheSkpIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgbiA9IHgubGVuZ3RoO1xuICAgIGlmKG4gIT09IHkubGVuZ3RoKSB7IHJldHVybiBmYWxzZTsgfVxuICAgIGZvcihpPTA7aTxuO2krKykge1xuICAgICAgICBpZih4W2ldID09PSB5W2ldKSB7IGNvbnRpbnVlOyB9XG4gICAgICAgIGlmKHR5cGVvZiB4W2ldID09PSBcIm9iamVjdFwiKSB7IGlmKCFzYW1lKHhbaV0seVtpXSkpIHJldHVybiBmYWxzZTsgfVxuICAgICAgICBlbHNlIHsgcmV0dXJuIGZhbHNlOyB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5udW1lcmljLnJlcCA9IGZ1bmN0aW9uIHJlcChzLHYsaykge1xuICAgIGlmKHR5cGVvZiBrID09PSBcInVuZGVmaW5lZFwiKSB7IGs9MDsgfVxuICAgIHZhciBuID0gc1trXSwgcmV0ID0gQXJyYXkobiksIGk7XG4gICAgaWYoayA9PT0gcy5sZW5ndGgtMSkge1xuICAgICAgICBmb3IoaT1uLTI7aT49MDtpLT0yKSB7IHJldFtpKzFdID0gdjsgcmV0W2ldID0gdjsgfVxuICAgICAgICBpZihpPT09LTEpIHsgcmV0WzBdID0gdjsgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICBmb3IoaT1uLTE7aT49MDtpLS0pIHsgcmV0W2ldID0gbnVtZXJpYy5yZXAocyx2LGsrMSk7IH1cbiAgICByZXR1cm4gcmV0O1xufVxuXG5cbm51bWVyaWMuZG90TU1zbWFsbCA9IGZ1bmN0aW9uIGRvdE1Nc21hbGwoeCx5KSB7XG4gICAgdmFyIGksaixrLHAscSxyLHJldCxmb28sYmFyLHdvbyxpMCxrMCxwMCxyMDtcbiAgICBwID0geC5sZW5ndGg7IHEgPSB5Lmxlbmd0aDsgciA9IHlbMF0ubGVuZ3RoO1xuICAgIHJldCA9IEFycmF5KHApO1xuICAgIGZvcihpPXAtMTtpPj0wO2ktLSkge1xuICAgICAgICBmb28gPSBBcnJheShyKTtcbiAgICAgICAgYmFyID0geFtpXTtcbiAgICAgICAgZm9yKGs9ci0xO2s+PTA7ay0tKSB7XG4gICAgICAgICAgICB3b28gPSBiYXJbcS0xXSp5W3EtMV1ba107XG4gICAgICAgICAgICBmb3Ioaj1xLTI7aj49MTtqLT0yKSB7XG4gICAgICAgICAgICAgICAgaTAgPSBqLTE7XG4gICAgICAgICAgICAgICAgd29vICs9IGJhcltqXSp5W2pdW2tdICsgYmFyW2kwXSp5W2kwXVtrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKGo9PT0wKSB7IHdvbyArPSBiYXJbMF0qeVswXVtrXTsgfVxuICAgICAgICAgICAgZm9vW2tdID0gd29vO1xuICAgICAgICB9XG4gICAgICAgIHJldFtpXSA9IGZvbztcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cbm51bWVyaWMuX2dldENvbCA9IGZ1bmN0aW9uIF9nZXRDb2woQSxqLHgpIHtcbiAgICB2YXIgbiA9IEEubGVuZ3RoLCBpO1xuICAgIGZvcihpPW4tMTtpPjA7LS1pKSB7XG4gICAgICAgIHhbaV0gPSBBW2ldW2pdO1xuICAgICAgICAtLWk7XG4gICAgICAgIHhbaV0gPSBBW2ldW2pdO1xuICAgIH1cbiAgICBpZihpPT09MCkgeFswXSA9IEFbMF1bal07XG59XG5udW1lcmljLmRvdE1NYmlnID0gZnVuY3Rpb24gZG90TU1iaWcoeCx5KXtcbiAgICB2YXIgZ2MgPSBudW1lcmljLl9nZXRDb2wsIHAgPSB5Lmxlbmd0aCwgdiA9IEFycmF5KHApO1xuICAgIHZhciBtID0geC5sZW5ndGgsIG4gPSB5WzBdLmxlbmd0aCwgQSA9IG5ldyBBcnJheShtKSwgeGo7XG4gICAgdmFyIFZWID0gbnVtZXJpYy5kb3RWVjtcbiAgICB2YXIgaSxqLGssejtcbiAgICAtLXA7XG4gICAgLS1tO1xuICAgIGZvcihpPW07aSE9PS0xOy0taSkgQVtpXSA9IEFycmF5KG4pO1xuICAgIC0tbjtcbiAgICBmb3IoaT1uO2khPT0tMTstLWkpIHtcbiAgICAgICAgZ2MoeSxpLHYpO1xuICAgICAgICBmb3Ioaj1tO2ohPT0tMTstLWopIHtcbiAgICAgICAgICAgIHo9MDtcbiAgICAgICAgICAgIHhqID0geFtqXTtcbiAgICAgICAgICAgIEFbal1baV0gPSBWVih4aix2KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gQTtcbn1cblxubnVtZXJpYy5kb3RNViA9IGZ1bmN0aW9uIGRvdE1WKHgseSkge1xuICAgIHZhciBwID0geC5sZW5ndGgsIHEgPSB5Lmxlbmd0aCxpO1xuICAgIHZhciByZXQgPSBBcnJheShwKSwgZG90VlYgPSBudW1lcmljLmRvdFZWO1xuICAgIGZvcihpPXAtMTtpPj0wO2ktLSkgeyByZXRbaV0gPSBkb3RWVih4W2ldLHkpOyB9XG4gICAgcmV0dXJuIHJldDtcbn1cblxubnVtZXJpYy5kb3RWTSA9IGZ1bmN0aW9uIGRvdFZNKHgseSkge1xuICAgIHZhciBpLGosayxwLHEscixyZXQsZm9vLGJhcix3b28saTAsazAscDAscjAsczEsczIsczMsYmF6LGFjY3VtO1xuICAgIHAgPSB4Lmxlbmd0aDsgcSA9IHlbMF0ubGVuZ3RoO1xuICAgIHJldCA9IEFycmF5KHEpO1xuICAgIGZvcihrPXEtMTtrPj0wO2stLSkge1xuICAgICAgICB3b28gPSB4W3AtMV0qeVtwLTFdW2tdO1xuICAgICAgICBmb3Ioaj1wLTI7aj49MTtqLT0yKSB7XG4gICAgICAgICAgICBpMCA9IGotMTtcbiAgICAgICAgICAgIHdvbyArPSB4W2pdKnlbal1ba10gKyB4W2kwXSp5W2kwXVtrXTtcbiAgICAgICAgfVxuICAgICAgICBpZihqPT09MCkgeyB3b28gKz0geFswXSp5WzBdW2tdOyB9XG4gICAgICAgIHJldFtrXSA9IHdvbztcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cblxubnVtZXJpYy5kb3RWViA9IGZ1bmN0aW9uIGRvdFZWKHgseSkge1xuICAgIHZhciBpLG49eC5sZW5ndGgsaTEscmV0ID0geFtuLTFdKnlbbi0xXTtcbiAgICBmb3IoaT1uLTI7aT49MTtpLT0yKSB7XG4gICAgICAgIGkxID0gaS0xO1xuICAgICAgICByZXQgKz0geFtpXSp5W2ldICsgeFtpMV0qeVtpMV07XG4gICAgfVxuICAgIGlmKGk9PT0wKSB7IHJldCArPSB4WzBdKnlbMF07IH1cbiAgICByZXR1cm4gcmV0O1xufVxuXG5udW1lcmljLmRvdCA9IGZ1bmN0aW9uIGRvdCh4LHkpIHtcbiAgICB2YXIgZCA9IG51bWVyaWMuZGltO1xuICAgIHN3aXRjaChkKHgpLmxlbmd0aCoxMDAwK2QoeSkubGVuZ3RoKSB7XG4gICAgY2FzZSAyMDAyOlxuICAgICAgICBpZih5Lmxlbmd0aCA8IDEwKSByZXR1cm4gbnVtZXJpYy5kb3RNTXNtYWxsKHgseSk7XG4gICAgICAgIGVsc2UgcmV0dXJuIG51bWVyaWMuZG90TU1iaWcoeCx5KTtcbiAgICBjYXNlIDIwMDE6IHJldHVybiBudW1lcmljLmRvdE1WKHgseSk7XG4gICAgY2FzZSAxMDAyOiByZXR1cm4gbnVtZXJpYy5kb3RWTSh4LHkpO1xuICAgIGNhc2UgMTAwMTogcmV0dXJuIG51bWVyaWMuZG90VlYoeCx5KTtcbiAgICBjYXNlIDEwMDA6IHJldHVybiBudW1lcmljLm11bFZTKHgseSk7XG4gICAgY2FzZSAxOiByZXR1cm4gbnVtZXJpYy5tdWxTVih4LHkpO1xuICAgIGNhc2UgMDogcmV0dXJuIHgqeTtcbiAgICBkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoJ251bWVyaWMuZG90IG9ubHkgd29ya3Mgb24gdmVjdG9ycyBhbmQgbWF0cmljZXMnKTtcbiAgICB9XG59XG5cbm51bWVyaWMuZGlhZyA9IGZ1bmN0aW9uIGRpYWcoZCkge1xuICAgIHZhciBpLGkxLGosbiA9IGQubGVuZ3RoLCBBID0gQXJyYXkobiksIEFpO1xuICAgIGZvcihpPW4tMTtpPj0wO2ktLSkge1xuICAgICAgICBBaSA9IEFycmF5KG4pO1xuICAgICAgICBpMSA9IGkrMjtcbiAgICAgICAgZm9yKGo9bi0xO2o+PWkxO2otPTIpIHtcbiAgICAgICAgICAgIEFpW2pdID0gMDtcbiAgICAgICAgICAgIEFpW2otMV0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmKGo+aSkgeyBBaVtqXSA9IDA7IH1cbiAgICAgICAgQWlbaV0gPSBkW2ldO1xuICAgICAgICBmb3Ioaj1pLTE7aj49MTtqLT0yKSB7XG4gICAgICAgICAgICBBaVtqXSA9IDA7XG4gICAgICAgICAgICBBaVtqLTFdID0gMDtcbiAgICAgICAgfVxuICAgICAgICBpZihqPT09MCkgeyBBaVswXSA9IDA7IH1cbiAgICAgICAgQVtpXSA9IEFpO1xuICAgIH1cbiAgICByZXR1cm4gQTtcbn1cbm51bWVyaWMuZ2V0RGlhZyA9IGZ1bmN0aW9uKEEpIHtcbiAgICB2YXIgbiA9IE1hdGgubWluKEEubGVuZ3RoLEFbMF0ubGVuZ3RoKSxpLHJldCA9IEFycmF5KG4pO1xuICAgIGZvcihpPW4tMTtpPj0xOy0taSkge1xuICAgICAgICByZXRbaV0gPSBBW2ldW2ldO1xuICAgICAgICAtLWk7XG4gICAgICAgIHJldFtpXSA9IEFbaV1baV07XG4gICAgfVxuICAgIGlmKGk9PT0wKSB7XG4gICAgICAgIHJldFswXSA9IEFbMF1bMF07XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59XG5cbm51bWVyaWMuaWRlbnRpdHkgPSBmdW5jdGlvbiBpZGVudGl0eShuKSB7IHJldHVybiBudW1lcmljLmRpYWcobnVtZXJpYy5yZXAoW25dLDEpKTsgfVxubnVtZXJpYy5wb2ludHdpc2UgPSBmdW5jdGlvbiBwb2ludHdpc2UocGFyYW1zLGJvZHksc2V0dXApIHtcbiAgICBpZih0eXBlb2Ygc2V0dXAgPT09IFwidW5kZWZpbmVkXCIpIHsgc2V0dXAgPSBcIlwiOyB9XG4gICAgdmFyIGZ1biA9IFtdO1xuICAgIHZhciBrO1xuICAgIHZhciBhdmVjID0gL1xcW2lcXF0kLyxwLHRoZXZlYyA9ICcnO1xuICAgIHZhciBoYXZlcmV0ID0gZmFsc2U7XG4gICAgZm9yKGs9MDtrPHBhcmFtcy5sZW5ndGg7aysrKSB7XG4gICAgICAgIGlmKGF2ZWMudGVzdChwYXJhbXNba10pKSB7XG4gICAgICAgICAgICBwID0gcGFyYW1zW2tdLnN1YnN0cmluZygwLHBhcmFtc1trXS5sZW5ndGgtMyk7XG4gICAgICAgICAgICB0aGV2ZWMgPSBwO1xuICAgICAgICB9IGVsc2UgeyBwID0gcGFyYW1zW2tdOyB9XG4gICAgICAgIGlmKHA9PT0ncmV0JykgaGF2ZXJldCA9IHRydWU7XG4gICAgICAgIGZ1bi5wdXNoKHApO1xuICAgIH1cbiAgICBmdW5bcGFyYW1zLmxlbmd0aF0gPSAnX3MnO1xuICAgIGZ1bltwYXJhbXMubGVuZ3RoKzFdID0gJ19rJztcbiAgICBmdW5bcGFyYW1zLmxlbmd0aCsyXSA9IChcbiAgICAgICAgICAgICdpZih0eXBlb2YgX3MgPT09IFwidW5kZWZpbmVkXCIpIF9zID0gbnVtZXJpYy5kaW0oJyt0aGV2ZWMrJyk7XFxuJytcbiAgICAgICAgICAgICdpZih0eXBlb2YgX2sgPT09IFwidW5kZWZpbmVkXCIpIF9rID0gMDtcXG4nK1xuICAgICAgICAgICAgJ3ZhciBfbiA9IF9zW19rXTtcXG4nK1xuICAgICAgICAgICAgJ3ZhciBpJysoaGF2ZXJldD8nJzonLCByZXQgPSBBcnJheShfbiknKSsnO1xcbicrXG4gICAgICAgICAgICAnaWYoX2sgPCBfcy5sZW5ndGgtMSkge1xcbicrXG4gICAgICAgICAgICAnICAgIGZvcihpPV9uLTE7aT49MDtpLS0pIHJldFtpXSA9IGFyZ3VtZW50cy5jYWxsZWUoJytwYXJhbXMuam9pbignLCcpKycsX3MsX2srMSk7XFxuJytcbiAgICAgICAgICAgICcgICAgcmV0dXJuIHJldDtcXG4nK1xuICAgICAgICAgICAgJ31cXG4nK1xuICAgICAgICAgICAgc2V0dXArJ1xcbicrXG4gICAgICAgICAgICAnZm9yKGk9X24tMTtpIT09LTE7LS1pKSB7XFxuJytcbiAgICAgICAgICAgICcgICAgJytib2R5KydcXG4nK1xuICAgICAgICAgICAgJ31cXG4nK1xuICAgICAgICAgICAgJ3JldHVybiByZXQ7J1xuICAgICAgICAgICAgKTtcbiAgICByZXR1cm4gRnVuY3Rpb24uYXBwbHkobnVsbCxmdW4pO1xufVxubnVtZXJpYy5wb2ludHdpc2UyID0gZnVuY3Rpb24gcG9pbnR3aXNlMihwYXJhbXMsYm9keSxzZXR1cCkge1xuICAgIGlmKHR5cGVvZiBzZXR1cCA9PT0gXCJ1bmRlZmluZWRcIikgeyBzZXR1cCA9IFwiXCI7IH1cbiAgICB2YXIgZnVuID0gW107XG4gICAgdmFyIGs7XG4gICAgdmFyIGF2ZWMgPSAvXFxbaVxcXSQvLHAsdGhldmVjID0gJyc7XG4gICAgdmFyIGhhdmVyZXQgPSBmYWxzZTtcbiAgICBmb3Ioaz0wO2s8cGFyYW1zLmxlbmd0aDtrKyspIHtcbiAgICAgICAgaWYoYXZlYy50ZXN0KHBhcmFtc1trXSkpIHtcbiAgICAgICAgICAgIHAgPSBwYXJhbXNba10uc3Vic3RyaW5nKDAscGFyYW1zW2tdLmxlbmd0aC0zKTtcbiAgICAgICAgICAgIHRoZXZlYyA9IHA7XG4gICAgICAgIH0gZWxzZSB7IHAgPSBwYXJhbXNba107IH1cbiAgICAgICAgaWYocD09PSdyZXQnKSBoYXZlcmV0ID0gdHJ1ZTtcbiAgICAgICAgZnVuLnB1c2gocCk7XG4gICAgfVxuICAgIGZ1bltwYXJhbXMubGVuZ3RoXSA9IChcbiAgICAgICAgICAgICd2YXIgX24gPSAnK3RoZXZlYysnLmxlbmd0aDtcXG4nK1xuICAgICAgICAgICAgJ3ZhciBpJysoaGF2ZXJldD8nJzonLCByZXQgPSBBcnJheShfbiknKSsnO1xcbicrXG4gICAgICAgICAgICBzZXR1cCsnXFxuJytcbiAgICAgICAgICAgICdmb3IoaT1fbi0xO2khPT0tMTstLWkpIHtcXG4nK1xuICAgICAgICAgICAgYm9keSsnXFxuJytcbiAgICAgICAgICAgICd9XFxuJytcbiAgICAgICAgICAgICdyZXR1cm4gcmV0OydcbiAgICAgICAgICAgICk7XG4gICAgcmV0dXJuIEZ1bmN0aW9uLmFwcGx5KG51bGwsZnVuKTtcbn1cbm51bWVyaWMuX2JpZm9yZWFjaCA9IChmdW5jdGlvbiBfYmlmb3JlYWNoKHgseSxzLGssZikge1xuICAgIGlmKGsgPT09IHMubGVuZ3RoLTEpIHsgZih4LHkpOyByZXR1cm47IH1cbiAgICB2YXIgaSxuPXNba107XG4gICAgZm9yKGk9bi0xO2k+PTA7aS0tKSB7IF9iaWZvcmVhY2godHlwZW9mIHg9PT1cIm9iamVjdFwiP3hbaV06eCx0eXBlb2YgeT09PVwib2JqZWN0XCI/eVtpXTp5LHMsaysxLGYpOyB9XG59KTtcbm51bWVyaWMuX2JpZm9yZWFjaDIgPSAoZnVuY3Rpb24gX2JpZm9yZWFjaDIoeCx5LHMsayxmKSB7XG4gICAgaWYoayA9PT0gcy5sZW5ndGgtMSkgeyByZXR1cm4gZih4LHkpOyB9XG4gICAgdmFyIGksbj1zW2tdLHJldCA9IEFycmF5KG4pO1xuICAgIGZvcihpPW4tMTtpPj0wOy0taSkgeyByZXRbaV0gPSBfYmlmb3JlYWNoMih0eXBlb2YgeD09PVwib2JqZWN0XCI/eFtpXTp4LHR5cGVvZiB5PT09XCJvYmplY3RcIj95W2ldOnkscyxrKzEsZik7IH1cbiAgICByZXR1cm4gcmV0O1xufSk7XG5udW1lcmljLl9mb3JlYWNoID0gKGZ1bmN0aW9uIF9mb3JlYWNoKHgscyxrLGYpIHtcbiAgICBpZihrID09PSBzLmxlbmd0aC0xKSB7IGYoeCk7IHJldHVybjsgfVxuICAgIHZhciBpLG49c1trXTtcbiAgICBmb3IoaT1uLTE7aT49MDtpLS0pIHsgX2ZvcmVhY2goeFtpXSxzLGsrMSxmKTsgfVxufSk7XG5udW1lcmljLl9mb3JlYWNoMiA9IChmdW5jdGlvbiBfZm9yZWFjaDIoeCxzLGssZikge1xuICAgIGlmKGsgPT09IHMubGVuZ3RoLTEpIHsgcmV0dXJuIGYoeCk7IH1cbiAgICB2YXIgaSxuPXNba10sIHJldCA9IEFycmF5KG4pO1xuICAgIGZvcihpPW4tMTtpPj0wO2ktLSkgeyByZXRbaV0gPSBfZm9yZWFjaDIoeFtpXSxzLGsrMSxmKTsgfVxuICAgIHJldHVybiByZXQ7XG59KTtcblxuLypudW1lcmljLmFueVYgPSBudW1lcmljLm1hcHJlZHVjZSgnaWYoeGkpIHJldHVybiB0cnVlOycsJ2ZhbHNlJyk7XG5udW1lcmljLmFsbFYgPSBudW1lcmljLm1hcHJlZHVjZSgnaWYoIXhpKSByZXR1cm4gZmFsc2U7JywndHJ1ZScpO1xubnVtZXJpYy5hbnkgPSBmdW5jdGlvbih4KSB7IGlmKHR5cGVvZiB4Lmxlbmd0aCA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHg7IHJldHVybiBudW1lcmljLmFueVYoeCk7IH1cbm51bWVyaWMuYWxsID0gZnVuY3Rpb24oeCkgeyBpZih0eXBlb2YgeC5sZW5ndGggPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiB4OyByZXR1cm4gbnVtZXJpYy5hbGxWKHgpOyB9Ki9cblxubnVtZXJpYy5vcHMyID0ge1xuICAgICAgICBhZGQ6ICcrJyxcbiAgICAgICAgc3ViOiAnLScsXG4gICAgICAgIG11bDogJyonLFxuICAgICAgICBkaXY6ICcvJyxcbiAgICAgICAgbW9kOiAnJScsXG4gICAgICAgIGFuZDogJyYmJyxcbiAgICAgICAgb3I6ICAnfHwnLFxuICAgICAgICBlcTogICc9PT0nLFxuICAgICAgICBuZXE6ICchPT0nLFxuICAgICAgICBsdDogICc8JyxcbiAgICAgICAgZ3Q6ICAnPicsXG4gICAgICAgIGxlcTogJzw9JyxcbiAgICAgICAgZ2VxOiAnPj0nLFxuICAgICAgICBiYW5kOiAnJicsXG4gICAgICAgIGJvcjogJ3wnLFxuICAgICAgICBieG9yOiAnXicsXG4gICAgICAgIGxzaGlmdDogJzw8JyxcbiAgICAgICAgcnNoaWZ0OiAnPj4nLFxuICAgICAgICBycnNoaWZ0OiAnPj4+J1xufTtcbm51bWVyaWMub3BzZXEgPSB7XG4gICAgICAgIGFkZGVxOiAnKz0nLFxuICAgICAgICBzdWJlcTogJy09JyxcbiAgICAgICAgbXVsZXE6ICcqPScsXG4gICAgICAgIGRpdmVxOiAnLz0nLFxuICAgICAgICBtb2RlcTogJyU9JyxcbiAgICAgICAgbHNoaWZ0ZXE6ICc8PD0nLFxuICAgICAgICByc2hpZnRlcTogJz4+PScsXG4gICAgICAgIHJyc2hpZnRlcTogJz4+Pj0nLFxuICAgICAgICBiYW5kZXE6ICcmPScsXG4gICAgICAgIGJvcmVxOiAnfD0nLFxuICAgICAgICBieG9yZXE6ICdePSdcbn07XG5udW1lcmljLm1hdGhmdW5zID0gWydhYnMnLCdhY29zJywnYXNpbicsJ2F0YW4nLCdjZWlsJywnY29zJyxcbiAgICAgICAgICAgICAgICAgICAgJ2V4cCcsJ2Zsb29yJywnbG9nJywncm91bmQnLCdzaW4nLCdzcXJ0JywndGFuJyxcbiAgICAgICAgICAgICAgICAgICAgJ2lzTmFOJywnaXNGaW5pdGUnXTtcbm51bWVyaWMubWF0aGZ1bnMyID0gWydhdGFuMicsJ3BvdycsJ21heCcsJ21pbiddO1xubnVtZXJpYy5vcHMxID0ge1xuICAgICAgICBuZWc6ICctJyxcbiAgICAgICAgbm90OiAnIScsXG4gICAgICAgIGJub3Q6ICd+JyxcbiAgICAgICAgY2xvbmU6ICcnXG59O1xubnVtZXJpYy5tYXByZWR1Y2VycyA9IHtcbiAgICAgICAgYW55OiBbJ2lmKHhpKSByZXR1cm4gdHJ1ZTsnLCd2YXIgYWNjdW0gPSBmYWxzZTsnXSxcbiAgICAgICAgYWxsOiBbJ2lmKCF4aSkgcmV0dXJuIGZhbHNlOycsJ3ZhciBhY2N1bSA9IHRydWU7J10sXG4gICAgICAgIHN1bTogWydhY2N1bSArPSB4aTsnLCd2YXIgYWNjdW0gPSAwOyddLFxuICAgICAgICBwcm9kOiBbJ2FjY3VtICo9IHhpOycsJ3ZhciBhY2N1bSA9IDE7J10sXG4gICAgICAgIG5vcm0yU3F1YXJlZDogWydhY2N1bSArPSB4aSp4aTsnLCd2YXIgYWNjdW0gPSAwOyddLFxuICAgICAgICBub3JtaW5mOiBbJ2FjY3VtID0gbWF4KGFjY3VtLGFicyh4aSkpOycsJ3ZhciBhY2N1bSA9IDAsIG1heCA9IE1hdGgubWF4LCBhYnMgPSBNYXRoLmFiczsnXSxcbiAgICAgICAgbm9ybTE6IFsnYWNjdW0gKz0gYWJzKHhpKScsJ3ZhciBhY2N1bSA9IDAsIGFicyA9IE1hdGguYWJzOyddLFxuICAgICAgICBzdXA6IFsnYWNjdW0gPSBtYXgoYWNjdW0seGkpOycsJ3ZhciBhY2N1bSA9IC1JbmZpbml0eSwgbWF4ID0gTWF0aC5tYXg7J10sXG4gICAgICAgIGluZjogWydhY2N1bSA9IG1pbihhY2N1bSx4aSk7JywndmFyIGFjY3VtID0gSW5maW5pdHksIG1pbiA9IE1hdGgubWluOyddXG59O1xuXG4oZnVuY3Rpb24gKCkge1xuICAgIHZhciBpLG87XG4gICAgZm9yKGk9MDtpPG51bWVyaWMubWF0aGZ1bnMyLmxlbmd0aDsrK2kpIHtcbiAgICAgICAgbyA9IG51bWVyaWMubWF0aGZ1bnMyW2ldO1xuICAgICAgICBudW1lcmljLm9wczJbb10gPSBvO1xuICAgIH1cbiAgICBmb3IoaSBpbiBudW1lcmljLm9wczIpIHtcbiAgICAgICAgaWYobnVtZXJpYy5vcHMyLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICBvID0gbnVtZXJpYy5vcHMyW2ldO1xuICAgICAgICAgICAgdmFyIGNvZGUsIGNvZGVlcSwgc2V0dXAgPSAnJztcbiAgICAgICAgICAgIGlmKG51bWVyaWMubXlJbmRleE9mLmNhbGwobnVtZXJpYy5tYXRoZnVuczIsaSkhPT0tMSkge1xuICAgICAgICAgICAgICAgIHNldHVwID0gJ3ZhciAnK28rJyA9IE1hdGguJytvKyc7XFxuJztcbiAgICAgICAgICAgICAgICBjb2RlID0gZnVuY3Rpb24ocix4LHkpIHsgcmV0dXJuIHIrJyA9ICcrbysnKCcreCsnLCcreSsnKSc7IH07XG4gICAgICAgICAgICAgICAgY29kZWVxID0gZnVuY3Rpb24oeCx5KSB7IHJldHVybiB4KycgPSAnK28rJygnK3grJywnK3krJyknOyB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb2RlID0gZnVuY3Rpb24ocix4LHkpIHsgcmV0dXJuIHIrJyA9ICcreCsnICcrbysnICcreTsgfTtcbiAgICAgICAgICAgICAgICBpZihudW1lcmljLm9wc2VxLmhhc093blByb3BlcnR5KGkrJ2VxJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZWVxID0gZnVuY3Rpb24oeCx5KSB7IHJldHVybiB4KycgJytvKyc9ICcreTsgfTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb2RlZXEgPSBmdW5jdGlvbih4LHkpIHsgcmV0dXJuIHgrJyA9ICcreCsnICcrbysnICcreTsgfTsgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG51bWVyaWNbaSsnVlYnXSA9IG51bWVyaWMucG9pbnR3aXNlMihbJ3hbaV0nLCd5W2ldJ10sY29kZSgncmV0W2ldJywneFtpXScsJ3lbaV0nKSxzZXR1cCk7XG4gICAgICAgICAgICBudW1lcmljW2krJ1NWJ10gPSBudW1lcmljLnBvaW50d2lzZTIoWyd4JywneVtpXSddLGNvZGUoJ3JldFtpXScsJ3gnLCd5W2ldJyksc2V0dXApO1xuICAgICAgICAgICAgbnVtZXJpY1tpKydWUyddID0gbnVtZXJpYy5wb2ludHdpc2UyKFsneFtpXScsJ3knXSxjb2RlKCdyZXRbaV0nLCd4W2ldJywneScpLHNldHVwKTtcbiAgICAgICAgICAgIG51bWVyaWNbaV0gPSBGdW5jdGlvbihcbiAgICAgICAgICAgICAgICAgICAgJ3ZhciBuID0gYXJndW1lbnRzLmxlbmd0aCwgaSwgeCA9IGFyZ3VtZW50c1swXSwgeTtcXG4nK1xuICAgICAgICAgICAgICAgICAgICAndmFyIFZWID0gbnVtZXJpYy4nK2krJ1ZWLCBWUyA9IG51bWVyaWMuJytpKydWUywgU1YgPSBudW1lcmljLicraSsnU1Y7XFxuJytcbiAgICAgICAgICAgICAgICAgICAgJ3ZhciBkaW0gPSBudW1lcmljLmRpbTtcXG4nK1xuICAgICAgICAgICAgICAgICAgICAnZm9yKGk9MTtpIT09bjsrK2kpIHsgXFxuJytcbiAgICAgICAgICAgICAgICAgICAgJyAgeSA9IGFyZ3VtZW50c1tpXTtcXG4nK1xuICAgICAgICAgICAgICAgICAgICAnICBpZih0eXBlb2YgeCA9PT0gXCJvYmplY3RcIikge1xcbicrXG4gICAgICAgICAgICAgICAgICAgICcgICAgICBpZih0eXBlb2YgeSA9PT0gXCJvYmplY3RcIikgeCA9IG51bWVyaWMuX2JpZm9yZWFjaDIoeCx5LGRpbSh4KSwwLFZWKTtcXG4nK1xuICAgICAgICAgICAgICAgICAgICAnICAgICAgZWxzZSB4ID0gbnVtZXJpYy5fYmlmb3JlYWNoMih4LHksZGltKHgpLDAsVlMpO1xcbicrXG4gICAgICAgICAgICAgICAgICAgICcgIH0gZWxzZSBpZih0eXBlb2YgeSA9PT0gXCJvYmplY3RcIikgeCA9IG51bWVyaWMuX2JpZm9yZWFjaDIoeCx5LGRpbSh5KSwwLFNWKTtcXG4nK1xuICAgICAgICAgICAgICAgICAgICAnICBlbHNlICcrY29kZWVxKCd4JywneScpKydcXG4nK1xuICAgICAgICAgICAgICAgICAgICAnfVxcbnJldHVybiB4O1xcbicpO1xuICAgICAgICAgICAgbnVtZXJpY1tvXSA9IG51bWVyaWNbaV07XG4gICAgICAgICAgICBudW1lcmljW2krJ2VxViddID0gbnVtZXJpYy5wb2ludHdpc2UyKFsncmV0W2ldJywneFtpXSddLCBjb2RlZXEoJ3JldFtpXScsJ3hbaV0nKSxzZXR1cCk7XG4gICAgICAgICAgICBudW1lcmljW2krJ2VxUyddID0gbnVtZXJpYy5wb2ludHdpc2UyKFsncmV0W2ldJywneCddLCBjb2RlZXEoJ3JldFtpXScsJ3gnKSxzZXR1cCk7XG4gICAgICAgICAgICBudW1lcmljW2krJ2VxJ10gPSBGdW5jdGlvbihcbiAgICAgICAgICAgICAgICAgICAgJ3ZhciBuID0gYXJndW1lbnRzLmxlbmd0aCwgaSwgeCA9IGFyZ3VtZW50c1swXSwgeTtcXG4nK1xuICAgICAgICAgICAgICAgICAgICAndmFyIFYgPSBudW1lcmljLicraSsnZXFWLCBTID0gbnVtZXJpYy4nK2krJ2VxU1xcbicrXG4gICAgICAgICAgICAgICAgICAgICd2YXIgcyA9IG51bWVyaWMuZGltKHgpO1xcbicrXG4gICAgICAgICAgICAgICAgICAgICdmb3IoaT0xO2khPT1uOysraSkgeyBcXG4nK1xuICAgICAgICAgICAgICAgICAgICAnICB5ID0gYXJndW1lbnRzW2ldO1xcbicrXG4gICAgICAgICAgICAgICAgICAgICcgIGlmKHR5cGVvZiB5ID09PSBcIm9iamVjdFwiKSBudW1lcmljLl9iaWZvcmVhY2goeCx5LHMsMCxWKTtcXG4nK1xuICAgICAgICAgICAgICAgICAgICAnICBlbHNlIG51bWVyaWMuX2JpZm9yZWFjaCh4LHkscywwLFMpO1xcbicrXG4gICAgICAgICAgICAgICAgICAgICd9XFxucmV0dXJuIHg7XFxuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yKGk9MDtpPG51bWVyaWMubWF0aGZ1bnMyLmxlbmd0aDsrK2kpIHtcbiAgICAgICAgbyA9IG51bWVyaWMubWF0aGZ1bnMyW2ldO1xuICAgICAgICBkZWxldGUgbnVtZXJpYy5vcHMyW29dO1xuICAgIH1cbiAgICBmb3IoaT0wO2k8bnVtZXJpYy5tYXRoZnVucy5sZW5ndGg7KytpKSB7XG4gICAgICAgIG8gPSBudW1lcmljLm1hdGhmdW5zW2ldO1xuICAgICAgICBudW1lcmljLm9wczFbb10gPSBvO1xuICAgIH1cbiAgICBmb3IoaSBpbiBudW1lcmljLm9wczEpIHtcbiAgICAgICAgaWYobnVtZXJpYy5vcHMxLmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgICBzZXR1cCA9ICcnO1xuICAgICAgICAgICAgbyA9IG51bWVyaWMub3BzMVtpXTtcbiAgICAgICAgICAgIGlmKG51bWVyaWMubXlJbmRleE9mLmNhbGwobnVtZXJpYy5tYXRoZnVucyxpKSE9PS0xKSB7XG4gICAgICAgICAgICAgICAgaWYoTWF0aC5oYXNPd25Qcm9wZXJ0eShvKSkgc2V0dXAgPSAndmFyICcrbysnID0gTWF0aC4nK28rJztcXG4nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbnVtZXJpY1tpKydlcVYnXSA9IG51bWVyaWMucG9pbnR3aXNlMihbJ3JldFtpXSddLCdyZXRbaV0gPSAnK28rJyhyZXRbaV0pOycsc2V0dXApO1xuICAgICAgICAgICAgbnVtZXJpY1tpKydlcSddID0gRnVuY3Rpb24oJ3gnLFxuICAgICAgICAgICAgICAgICAgICAnaWYodHlwZW9mIHggIT09IFwib2JqZWN0XCIpIHJldHVybiAnK28rJ3hcXG4nK1xuICAgICAgICAgICAgICAgICAgICAndmFyIGk7XFxuJytcbiAgICAgICAgICAgICAgICAgICAgJ3ZhciBWID0gbnVtZXJpYy4nK2krJ2VxVjtcXG4nK1xuICAgICAgICAgICAgICAgICAgICAndmFyIHMgPSBudW1lcmljLmRpbSh4KTtcXG4nK1xuICAgICAgICAgICAgICAgICAgICAnbnVtZXJpYy5fZm9yZWFjaCh4LHMsMCxWKTtcXG4nK1xuICAgICAgICAgICAgICAgICAgICAncmV0dXJuIHg7XFxuJyk7XG4gICAgICAgICAgICBudW1lcmljW2krJ1YnXSA9IG51bWVyaWMucG9pbnR3aXNlMihbJ3hbaV0nXSwncmV0W2ldID0gJytvKycoeFtpXSk7JyxzZXR1cCk7XG4gICAgICAgICAgICBudW1lcmljW2ldID0gRnVuY3Rpb24oJ3gnLFxuICAgICAgICAgICAgICAgICAgICAnaWYodHlwZW9mIHggIT09IFwib2JqZWN0XCIpIHJldHVybiAnK28rJyh4KVxcbicrXG4gICAgICAgICAgICAgICAgICAgICd2YXIgaTtcXG4nK1xuICAgICAgICAgICAgICAgICAgICAndmFyIFYgPSBudW1lcmljLicraSsnVjtcXG4nK1xuICAgICAgICAgICAgICAgICAgICAndmFyIHMgPSBudW1lcmljLmRpbSh4KTtcXG4nK1xuICAgICAgICAgICAgICAgICAgICAncmV0dXJuIG51bWVyaWMuX2ZvcmVhY2gyKHgscywwLFYpO1xcbicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvcihpPTA7aTxudW1lcmljLm1hdGhmdW5zLmxlbmd0aDsrK2kpIHtcbiAgICAgICAgbyA9IG51bWVyaWMubWF0aGZ1bnNbaV07XG4gICAgICAgIGRlbGV0ZSBudW1lcmljLm9wczFbb107XG4gICAgfVxuICAgIGZvcihpIGluIG51bWVyaWMubWFwcmVkdWNlcnMpIHtcbiAgICAgICAgaWYobnVtZXJpYy5tYXByZWR1Y2Vycy5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAgbyA9IG51bWVyaWMubWFwcmVkdWNlcnNbaV07XG4gICAgICAgICAgICBudW1lcmljW2krJ1YnXSA9IG51bWVyaWMubWFwcmVkdWNlMihvWzBdLG9bMV0pO1xuICAgICAgICAgICAgbnVtZXJpY1tpXSA9IEZ1bmN0aW9uKCd4JywncycsJ2snLFxuICAgICAgICAgICAgICAgICAgICBvWzFdK1xuICAgICAgICAgICAgICAgICAgICAnaWYodHlwZW9mIHggIT09IFwib2JqZWN0XCIpIHsnK1xuICAgICAgICAgICAgICAgICAgICAnICAgIHhpID0geDtcXG4nK1xuICAgICAgICAgICAgICAgICAgICBvWzBdKyc7XFxuJytcbiAgICAgICAgICAgICAgICAgICAgJyAgICByZXR1cm4gYWNjdW07XFxuJytcbiAgICAgICAgICAgICAgICAgICAgJ30nK1xuICAgICAgICAgICAgICAgICAgICAnaWYodHlwZW9mIHMgPT09IFwidW5kZWZpbmVkXCIpIHMgPSBudW1lcmljLmRpbSh4KTtcXG4nK1xuICAgICAgICAgICAgICAgICAgICAnaWYodHlwZW9mIGsgPT09IFwidW5kZWZpbmVkXCIpIGsgPSAwO1xcbicrXG4gICAgICAgICAgICAgICAgICAgICdpZihrID09PSBzLmxlbmd0aC0xKSByZXR1cm4gbnVtZXJpYy4nK2krJ1YoeCk7XFxuJytcbiAgICAgICAgICAgICAgICAgICAgJ3ZhciB4aTtcXG4nK1xuICAgICAgICAgICAgICAgICAgICAndmFyIG4gPSB4Lmxlbmd0aCwgaTtcXG4nK1xuICAgICAgICAgICAgICAgICAgICAnZm9yKGk9bi0xO2khPT0tMTstLWkpIHtcXG4nK1xuICAgICAgICAgICAgICAgICAgICAnICAgeGkgPSBhcmd1bWVudHMuY2FsbGVlKHhbaV0pO1xcbicrXG4gICAgICAgICAgICAgICAgICAgIG9bMF0rJztcXG4nK1xuICAgICAgICAgICAgICAgICAgICAnfVxcbicrXG4gICAgICAgICAgICAgICAgICAgICdyZXR1cm4gYWNjdW07XFxuJyk7XG4gICAgICAgIH1cbiAgICB9XG59KCkpO1xuXG5udW1lcmljLnRydW5jVlYgPSBudW1lcmljLnBvaW50d2lzZShbJ3hbaV0nLCd5W2ldJ10sJ3JldFtpXSA9IHJvdW5kKHhbaV0veVtpXSkqeVtpXTsnLCd2YXIgcm91bmQgPSBNYXRoLnJvdW5kOycpO1xubnVtZXJpYy50cnVuY1ZTID0gbnVtZXJpYy5wb2ludHdpc2UoWyd4W2ldJywneSddLCdyZXRbaV0gPSByb3VuZCh4W2ldL3kpKnk7JywndmFyIHJvdW5kID0gTWF0aC5yb3VuZDsnKTtcbm51bWVyaWMudHJ1bmNTViA9IG51bWVyaWMucG9pbnR3aXNlKFsneCcsJ3lbaV0nXSwncmV0W2ldID0gcm91bmQoeC95W2ldKSp5W2ldOycsJ3ZhciByb3VuZCA9IE1hdGgucm91bmQ7Jyk7XG5udW1lcmljLnRydW5jID0gZnVuY3Rpb24gdHJ1bmMoeCx5KSB7XG4gICAgaWYodHlwZW9mIHggPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgaWYodHlwZW9mIHkgPT09IFwib2JqZWN0XCIpIHJldHVybiBudW1lcmljLnRydW5jVlYoeCx5KTtcbiAgICAgICAgcmV0dXJuIG51bWVyaWMudHJ1bmNWUyh4LHkpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHkgPT09IFwib2JqZWN0XCIpIHJldHVybiBudW1lcmljLnRydW5jU1YoeCx5KTtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCh4L3kpKnk7XG59XG5cbm51bWVyaWMuaW52ID0gZnVuY3Rpb24gaW52KHgpIHtcbiAgICB2YXIgcyA9IG51bWVyaWMuZGltKHgpLCBhYnMgPSBNYXRoLmFicywgbSA9IHNbMF0sIG4gPSBzWzFdO1xuICAgIHZhciBBID0gbnVtZXJpYy5jbG9uZSh4KSwgQWksIEFqO1xuICAgIHZhciBJID0gbnVtZXJpYy5pZGVudGl0eShtKSwgSWksIElqO1xuICAgIHZhciBpLGosayx4O1xuICAgIGZvcihqPTA7ajxuOysraikge1xuICAgICAgICB2YXIgaTAgPSAtMTtcbiAgICAgICAgdmFyIHYwID0gLTE7XG4gICAgICAgIGZvcihpPWo7aSE9PW07KytpKSB7IGsgPSBhYnMoQVtpXVtqXSk7IGlmKGs+djApIHsgaTAgPSBpOyB2MCA9IGs7IH0gfVxuICAgICAgICBBaiA9IEFbaTBdOyBBW2kwXSA9IEFbal07IEFbal0gPSBBajtcbiAgICAgICAgSWogPSBJW2kwXTsgSVtpMF0gPSBJW2pdOyBJW2pdID0gSWo7XG4gICAgICAgIHggPSBBaltqXTtcbiAgICAgICAgZm9yKGs9ajtrIT09bjsrK2spICAgIEFqW2tdIC89IHg7IFxuICAgICAgICBmb3Ioaz1uLTE7ayE9PS0xOy0taykgSWpba10gLz0geDtcbiAgICAgICAgZm9yKGk9bS0xO2khPT0tMTstLWkpIHtcbiAgICAgICAgICAgIGlmKGkhPT1qKSB7XG4gICAgICAgICAgICAgICAgQWkgPSBBW2ldO1xuICAgICAgICAgICAgICAgIElpID0gSVtpXTtcbiAgICAgICAgICAgICAgICB4ID0gQWlbal07XG4gICAgICAgICAgICAgICAgZm9yKGs9aisxO2shPT1uOysraykgIEFpW2tdIC09IEFqW2tdKng7XG4gICAgICAgICAgICAgICAgZm9yKGs9bi0xO2s+MDstLWspIHsgSWlba10gLT0gSWpba10qeDsgLS1rOyBJaVtrXSAtPSBJaltrXSp4OyB9XG4gICAgICAgICAgICAgICAgaWYoaz09PTApIElpWzBdIC09IElqWzBdKng7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIEk7XG59XG5cbm51bWVyaWMuZGV0ID0gZnVuY3Rpb24gZGV0KHgpIHtcbiAgICB2YXIgcyA9IG51bWVyaWMuZGltKHgpO1xuICAgIGlmKHMubGVuZ3RoICE9PSAyIHx8IHNbMF0gIT09IHNbMV0pIHsgdGhyb3cgbmV3IEVycm9yKCdudW1lcmljOiBkZXQoKSBvbmx5IHdvcmtzIG9uIHNxdWFyZSBtYXRyaWNlcycpOyB9XG4gICAgdmFyIG4gPSBzWzBdLCByZXQgPSAxLGksaixrLEEgPSBudW1lcmljLmNsb25lKHgpLEFqLEFpLGFscGhhLHRlbXAsazEsazIsazM7XG4gICAgZm9yKGo9MDtqPG4tMTtqKyspIHtcbiAgICAgICAgaz1qO1xuICAgICAgICBmb3IoaT1qKzE7aTxuO2krKykgeyBpZihNYXRoLmFicyhBW2ldW2pdKSA+IE1hdGguYWJzKEFba11bal0pKSB7IGsgPSBpOyB9IH1cbiAgICAgICAgaWYoayAhPT0gaikge1xuICAgICAgICAgICAgdGVtcCA9IEFba107IEFba10gPSBBW2pdOyBBW2pdID0gdGVtcDtcbiAgICAgICAgICAgIHJldCAqPSAtMTtcbiAgICAgICAgfVxuICAgICAgICBBaiA9IEFbal07XG4gICAgICAgIGZvcihpPWorMTtpPG47aSsrKSB7XG4gICAgICAgICAgICBBaSA9IEFbaV07XG4gICAgICAgICAgICBhbHBoYSA9IEFpW2pdL0FqW2pdO1xuICAgICAgICAgICAgZm9yKGs9aisxO2s8bi0xO2srPTIpIHtcbiAgICAgICAgICAgICAgICBrMSA9IGsrMTtcbiAgICAgICAgICAgICAgICBBaVtrXSAtPSBBaltrXSphbHBoYTtcbiAgICAgICAgICAgICAgICBBaVtrMV0gLT0gQWpbazFdKmFscGhhO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYoayE9PW4pIHsgQWlba10gLT0gQWpba10qYWxwaGE7IH1cbiAgICAgICAgfVxuICAgICAgICBpZihBaltqXSA9PT0gMCkgeyByZXR1cm4gMDsgfVxuICAgICAgICByZXQgKj0gQWpbal07XG4gICAgfVxuICAgIHJldHVybiByZXQqQVtqXVtqXTtcbn1cblxubnVtZXJpYy50cmFuc3Bvc2UgPSBmdW5jdGlvbiB0cmFuc3Bvc2UoeCkge1xuICAgIHZhciBpLGosbSA9IHgubGVuZ3RoLG4gPSB4WzBdLmxlbmd0aCwgcmV0PUFycmF5KG4pLEEwLEExLEJqO1xuICAgIGZvcihqPTA7ajxuO2orKykgcmV0W2pdID0gQXJyYXkobSk7XG4gICAgZm9yKGk9bS0xO2k+PTE7aS09Mikge1xuICAgICAgICBBMSA9IHhbaV07XG4gICAgICAgIEEwID0geFtpLTFdO1xuICAgICAgICBmb3Ioaj1uLTE7aj49MTstLWopIHtcbiAgICAgICAgICAgIEJqID0gcmV0W2pdOyBCaltpXSA9IEExW2pdOyBCaltpLTFdID0gQTBbal07XG4gICAgICAgICAgICAtLWo7XG4gICAgICAgICAgICBCaiA9IHJldFtqXTsgQmpbaV0gPSBBMVtqXTsgQmpbaS0xXSA9IEEwW2pdO1xuICAgICAgICB9XG4gICAgICAgIGlmKGo9PT0wKSB7XG4gICAgICAgICAgICBCaiA9IHJldFswXTsgQmpbaV0gPSBBMVswXTsgQmpbaS0xXSA9IEEwWzBdO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmKGk9PT0wKSB7XG4gICAgICAgIEEwID0geFswXTtcbiAgICAgICAgZm9yKGo9bi0xO2o+PTE7LS1qKSB7XG4gICAgICAgICAgICByZXRbal1bMF0gPSBBMFtqXTtcbiAgICAgICAgICAgIC0tajtcbiAgICAgICAgICAgIHJldFtqXVswXSA9IEEwW2pdO1xuICAgICAgICB9XG4gICAgICAgIGlmKGo9PT0wKSB7IHJldFswXVswXSA9IEEwWzBdOyB9XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59XG5udW1lcmljLm5lZ3RyYW5zcG9zZSA9IGZ1bmN0aW9uIG5lZ3RyYW5zcG9zZSh4KSB7XG4gICAgdmFyIGksaixtID0geC5sZW5ndGgsbiA9IHhbMF0ubGVuZ3RoLCByZXQ9QXJyYXkobiksQTAsQTEsQmo7XG4gICAgZm9yKGo9MDtqPG47aisrKSByZXRbal0gPSBBcnJheShtKTtcbiAgICBmb3IoaT1tLTE7aT49MTtpLT0yKSB7XG4gICAgICAgIEExID0geFtpXTtcbiAgICAgICAgQTAgPSB4W2ktMV07XG4gICAgICAgIGZvcihqPW4tMTtqPj0xOy0taikge1xuICAgICAgICAgICAgQmogPSByZXRbal07IEJqW2ldID0gLUExW2pdOyBCaltpLTFdID0gLUEwW2pdO1xuICAgICAgICAgICAgLS1qO1xuICAgICAgICAgICAgQmogPSByZXRbal07IEJqW2ldID0gLUExW2pdOyBCaltpLTFdID0gLUEwW2pdO1xuICAgICAgICB9XG4gICAgICAgIGlmKGo9PT0wKSB7XG4gICAgICAgICAgICBCaiA9IHJldFswXTsgQmpbaV0gPSAtQTFbMF07IEJqW2ktMV0gPSAtQTBbMF07XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYoaT09PTApIHtcbiAgICAgICAgQTAgPSB4WzBdO1xuICAgICAgICBmb3Ioaj1uLTE7aj49MTstLWopIHtcbiAgICAgICAgICAgIHJldFtqXVswXSA9IC1BMFtqXTtcbiAgICAgICAgICAgIC0tajtcbiAgICAgICAgICAgIHJldFtqXVswXSA9IC1BMFtqXTtcbiAgICAgICAgfVxuICAgICAgICBpZihqPT09MCkgeyByZXRbMF1bMF0gPSAtQTBbMF07IH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cblxubnVtZXJpYy5fcmFuZG9tID0gZnVuY3Rpb24gX3JhbmRvbShzLGspIHtcbiAgICB2YXIgaSxuPXNba10scmV0PUFycmF5KG4pLCBybmQ7XG4gICAgaWYoayA9PT0gcy5sZW5ndGgtMSkge1xuICAgICAgICBybmQgPSBNYXRoLnJhbmRvbTtcbiAgICAgICAgZm9yKGk9bi0xO2k+PTE7aS09Mikge1xuICAgICAgICAgICAgcmV0W2ldID0gcm5kKCk7XG4gICAgICAgICAgICByZXRbaS0xXSA9IHJuZCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmKGk9PT0wKSB7IHJldFswXSA9IHJuZCgpOyB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGZvcihpPW4tMTtpPj0wO2ktLSkgcmV0W2ldID0gX3JhbmRvbShzLGsrMSk7XG4gICAgcmV0dXJuIHJldDtcbn1cbm51bWVyaWMucmFuZG9tID0gZnVuY3Rpb24gcmFuZG9tKHMpIHsgcmV0dXJuIG51bWVyaWMuX3JhbmRvbShzLDApOyB9XG5cbm51bWVyaWMubm9ybTIgPSBmdW5jdGlvbiBub3JtMih4KSB7IHJldHVybiBNYXRoLnNxcnQobnVtZXJpYy5ub3JtMlNxdWFyZWQoeCkpOyB9XG5cbm51bWVyaWMubGluc3BhY2UgPSBmdW5jdGlvbiBsaW5zcGFjZShhLGIsbikge1xuICAgIGlmKHR5cGVvZiBuID09PSBcInVuZGVmaW5lZFwiKSBuID0gTWF0aC5tYXgoTWF0aC5yb3VuZChiLWEpKzEsMSk7XG4gICAgaWYobjwyKSB7IHJldHVybiBuPT09MT9bYV06W107IH1cbiAgICB2YXIgaSxyZXQgPSBBcnJheShuKTtcbiAgICBuLS07XG4gICAgZm9yKGk9bjtpPj0wO2ktLSkgeyByZXRbaV0gPSAoaSpiKyhuLWkpKmEpL247IH1cbiAgICByZXR1cm4gcmV0O1xufVxuXG5udW1lcmljLmdldEJsb2NrID0gZnVuY3Rpb24gZ2V0QmxvY2soeCxmcm9tLHRvKSB7XG4gICAgdmFyIHMgPSBudW1lcmljLmRpbSh4KTtcbiAgICBmdW5jdGlvbiBmb28oeCxrKSB7XG4gICAgICAgIHZhciBpLGEgPSBmcm9tW2tdLCBuID0gdG9ba10tYSwgcmV0ID0gQXJyYXkobik7XG4gICAgICAgIGlmKGsgPT09IHMubGVuZ3RoLTEpIHtcbiAgICAgICAgICAgIGZvcihpPW47aT49MDtpLS0pIHsgcmV0W2ldID0geFtpK2FdOyB9XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIGZvcihpPW47aT49MDtpLS0pIHsgcmV0W2ldID0gZm9vKHhbaSthXSxrKzEpOyB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIHJldHVybiBmb28oeCwwKTtcbn1cblxubnVtZXJpYy5zZXRCbG9jayA9IGZ1bmN0aW9uIHNldEJsb2NrKHgsZnJvbSx0byxCKSB7XG4gICAgdmFyIHMgPSBudW1lcmljLmRpbSh4KTtcbiAgICBmdW5jdGlvbiBmb28oeCx5LGspIHtcbiAgICAgICAgdmFyIGksYSA9IGZyb21ba10sIG4gPSB0b1trXS1hO1xuICAgICAgICBpZihrID09PSBzLmxlbmd0aC0xKSB7IGZvcihpPW47aT49MDtpLS0pIHsgeFtpK2FdID0geVtpXTsgfSB9XG4gICAgICAgIGZvcihpPW47aT49MDtpLS0pIHsgZm9vKHhbaSthXSx5W2ldLGsrMSk7IH1cbiAgICB9XG4gICAgZm9vKHgsQiwwKTtcbiAgICByZXR1cm4geDtcbn1cblxubnVtZXJpYy5nZXRSYW5nZSA9IGZ1bmN0aW9uIGdldFJhbmdlKEEsSSxKKSB7XG4gICAgdmFyIG0gPSBJLmxlbmd0aCwgbiA9IEoubGVuZ3RoO1xuICAgIHZhciBpLGo7XG4gICAgdmFyIEIgPSBBcnJheShtKSwgQmksIEFJO1xuICAgIGZvcihpPW0tMTtpIT09LTE7LS1pKSB7XG4gICAgICAgIEJbaV0gPSBBcnJheShuKTtcbiAgICAgICAgQmkgPSBCW2ldO1xuICAgICAgICBBSSA9IEFbSVtpXV07XG4gICAgICAgIGZvcihqPW4tMTtqIT09LTE7LS1qKSBCaVtqXSA9IEFJW0pbal1dO1xuICAgIH1cbiAgICByZXR1cm4gQjtcbn1cblxubnVtZXJpYy5ibG9ja01hdHJpeCA9IGZ1bmN0aW9uIGJsb2NrTWF0cml4KFgpIHtcbiAgICB2YXIgcyA9IG51bWVyaWMuZGltKFgpO1xuICAgIGlmKHMubGVuZ3RoPDQpIHJldHVybiBudW1lcmljLmJsb2NrTWF0cml4KFtYXSk7XG4gICAgdmFyIG09c1swXSxuPXNbMV0sTSxOLGksaixYaWo7XG4gICAgTSA9IDA7IE4gPSAwO1xuICAgIGZvcihpPTA7aTxtOysraSkgTSs9WFtpXVswXS5sZW5ndGg7XG4gICAgZm9yKGo9MDtqPG47KytqKSBOKz1YWzBdW2pdWzBdLmxlbmd0aDtcbiAgICB2YXIgWiA9IEFycmF5KE0pO1xuICAgIGZvcihpPTA7aTxNOysraSkgWltpXSA9IEFycmF5KE4pO1xuICAgIHZhciBJPTAsSixaSSxrLGwsWGlqaztcbiAgICBmb3IoaT0wO2k8bTsrK2kpIHtcbiAgICAgICAgSj1OO1xuICAgICAgICBmb3Ioaj1uLTE7aiE9PS0xOy0taikge1xuICAgICAgICAgICAgWGlqID0gWFtpXVtqXTtcbiAgICAgICAgICAgIEogLT0gWGlqWzBdLmxlbmd0aDtcbiAgICAgICAgICAgIGZvcihrPVhpai5sZW5ndGgtMTtrIT09LTE7LS1rKSB7XG4gICAgICAgICAgICAgICAgWGlqayA9IFhpaltrXTtcbiAgICAgICAgICAgICAgICBaSSA9IFpbSStrXTtcbiAgICAgICAgICAgICAgICBmb3IobCA9IFhpamsubGVuZ3RoLTE7bCE9PS0xOy0tbCkgWklbSitsXSA9IFhpamtbbF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgSSArPSBYW2ldWzBdLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIFo7XG59XG5cbm51bWVyaWMudGVuc29yID0gZnVuY3Rpb24gdGVuc29yKHgseSkge1xuICAgIGlmKHR5cGVvZiB4ID09PSBcIm51bWJlclwiIHx8IHR5cGVvZiB5ID09PSBcIm51bWJlclwiKSByZXR1cm4gbnVtZXJpYy5tdWwoeCx5KTtcbiAgICB2YXIgczEgPSBudW1lcmljLmRpbSh4KSwgczIgPSBudW1lcmljLmRpbSh5KTtcbiAgICBpZihzMS5sZW5ndGggIT09IDEgfHwgczIubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignbnVtZXJpYzogdGVuc29yIHByb2R1Y3QgaXMgb25seSBkZWZpbmVkIGZvciB2ZWN0b3JzJyk7XG4gICAgfVxuICAgIHZhciBtID0gczFbMF0sIG4gPSBzMlswXSwgQSA9IEFycmF5KG0pLCBBaSwgaSxqLHhpO1xuICAgIGZvcihpPW0tMTtpPj0wO2ktLSkge1xuICAgICAgICBBaSA9IEFycmF5KG4pO1xuICAgICAgICB4aSA9IHhbaV07XG4gICAgICAgIGZvcihqPW4tMTtqPj0zOy0taikge1xuICAgICAgICAgICAgQWlbal0gPSB4aSAqIHlbal07XG4gICAgICAgICAgICAtLWo7XG4gICAgICAgICAgICBBaVtqXSA9IHhpICogeVtqXTtcbiAgICAgICAgICAgIC0tajtcbiAgICAgICAgICAgIEFpW2pdID0geGkgKiB5W2pdO1xuICAgICAgICAgICAgLS1qO1xuICAgICAgICAgICAgQWlbal0gPSB4aSAqIHlbal07XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUoaj49MCkgeyBBaVtqXSA9IHhpICogeVtqXTsgLS1qOyB9XG4gICAgICAgIEFbaV0gPSBBaTtcbiAgICB9XG4gICAgcmV0dXJuIEE7XG59XG5cbi8vIDMuIFRoZSBUZW5zb3IgdHlwZSBUXG5udW1lcmljLlQgPSBmdW5jdGlvbiBUKHgseSkgeyB0aGlzLnggPSB4OyB0aGlzLnkgPSB5OyB9XG5udW1lcmljLnQgPSBmdW5jdGlvbiB0KHgseSkgeyByZXR1cm4gbmV3IG51bWVyaWMuVCh4LHkpOyB9XG5cbm51bWVyaWMuVGJpbm9wID0gZnVuY3Rpb24gVGJpbm9wKHJyLHJjLGNyLGNjLHNldHVwKSB7XG4gICAgdmFyIGlvID0gbnVtZXJpYy5pbmRleE9mO1xuICAgIGlmKHR5cGVvZiBzZXR1cCAhPT0gXCJzdHJpbmdcIikge1xuICAgICAgICB2YXIgaztcbiAgICAgICAgc2V0dXAgPSAnJztcbiAgICAgICAgZm9yKGsgaW4gbnVtZXJpYykge1xuICAgICAgICAgICAgaWYobnVtZXJpYy5oYXNPd25Qcm9wZXJ0eShrKSAmJiAocnIuaW5kZXhPZihrKT49MCB8fCByYy5pbmRleE9mKGspPj0wIHx8IGNyLmluZGV4T2Yoayk+PTAgfHwgY2MuaW5kZXhPZihrKT49MCkgJiYgay5sZW5ndGg+MSkge1xuICAgICAgICAgICAgICAgIHNldHVwICs9ICd2YXIgJytrKycgPSBudW1lcmljLicraysnO1xcbic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIEZ1bmN0aW9uKFsneSddLFxuICAgICAgICAgICAgJ3ZhciB4ID0gdGhpcztcXG4nK1xuICAgICAgICAgICAgJ2lmKCEoeSBpbnN0YW5jZW9mIG51bWVyaWMuVCkpIHsgeSA9IG5ldyBudW1lcmljLlQoeSk7IH1cXG4nK1xuICAgICAgICAgICAgc2V0dXArJ1xcbicrXG4gICAgICAgICAgICAnaWYoeC55KSB7JytcbiAgICAgICAgICAgICcgIGlmKHkueSkgeycrXG4gICAgICAgICAgICAnICAgIHJldHVybiBuZXcgbnVtZXJpYy5UKCcrY2MrJyk7XFxuJytcbiAgICAgICAgICAgICcgIH1cXG4nK1xuICAgICAgICAgICAgJyAgcmV0dXJuIG5ldyBudW1lcmljLlQoJytjcisnKTtcXG4nK1xuICAgICAgICAgICAgJ31cXG4nK1xuICAgICAgICAgICAgJ2lmKHkueSkge1xcbicrXG4gICAgICAgICAgICAnICByZXR1cm4gbmV3IG51bWVyaWMuVCgnK3JjKycpO1xcbicrXG4gICAgICAgICAgICAnfVxcbicrXG4gICAgICAgICAgICAncmV0dXJuIG5ldyBudW1lcmljLlQoJytycisnKTtcXG4nXG4gICAgKTtcbn1cblxubnVtZXJpYy5ULnByb3RvdHlwZS5hZGQgPSBudW1lcmljLlRiaW5vcChcbiAgICAgICAgJ2FkZCh4LngseS54KScsXG4gICAgICAgICdhZGQoeC54LHkueCkseS55JyxcbiAgICAgICAgJ2FkZCh4LngseS54KSx4LnknLFxuICAgICAgICAnYWRkKHgueCx5LngpLGFkZCh4LnkseS55KScpO1xubnVtZXJpYy5ULnByb3RvdHlwZS5zdWIgPSBudW1lcmljLlRiaW5vcChcbiAgICAgICAgJ3N1Yih4LngseS54KScsXG4gICAgICAgICdzdWIoeC54LHkueCksbmVnKHkueSknLFxuICAgICAgICAnc3ViKHgueCx5LngpLHgueScsXG4gICAgICAgICdzdWIoeC54LHkueCksc3ViKHgueSx5LnkpJyk7XG5udW1lcmljLlQucHJvdG90eXBlLm11bCA9IG51bWVyaWMuVGJpbm9wKFxuICAgICAgICAnbXVsKHgueCx5LngpJyxcbiAgICAgICAgJ211bCh4LngseS54KSxtdWwoeC54LHkueSknLFxuICAgICAgICAnbXVsKHgueCx5LngpLG11bCh4LnkseS54KScsXG4gICAgICAgICdzdWIobXVsKHgueCx5LngpLG11bCh4LnkseS55KSksYWRkKG11bCh4LngseS55KSxtdWwoeC55LHkueCkpJyk7XG5cbm51bWVyaWMuVC5wcm90b3R5cGUucmVjaXByb2NhbCA9IGZ1bmN0aW9uIHJlY2lwcm9jYWwoKSB7XG4gICAgdmFyIG11bCA9IG51bWVyaWMubXVsLCBkaXYgPSBudW1lcmljLmRpdjtcbiAgICBpZih0aGlzLnkpIHtcbiAgICAgICAgdmFyIGQgPSBudW1lcmljLmFkZChtdWwodGhpcy54LHRoaXMueCksbXVsKHRoaXMueSx0aGlzLnkpKTtcbiAgICAgICAgcmV0dXJuIG5ldyBudW1lcmljLlQoZGl2KHRoaXMueCxkKSxkaXYobnVtZXJpYy5uZWcodGhpcy55KSxkKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVChkaXYoMSx0aGlzLngpKTtcbn1cbm51bWVyaWMuVC5wcm90b3R5cGUuZGl2ID0gZnVuY3Rpb24gZGl2KHkpIHtcbiAgICBpZighKHkgaW5zdGFuY2VvZiBudW1lcmljLlQpKSB5ID0gbmV3IG51bWVyaWMuVCh5KTtcbiAgICBpZih5LnkpIHsgcmV0dXJuIHRoaXMubXVsKHkucmVjaXByb2NhbCgpKTsgfVxuICAgIHZhciBkaXYgPSBudW1lcmljLmRpdjtcbiAgICBpZih0aGlzLnkpIHsgcmV0dXJuIG5ldyBudW1lcmljLlQoZGl2KHRoaXMueCx5LngpLGRpdih0aGlzLnkseS54KSk7IH1cbiAgICByZXR1cm4gbmV3IG51bWVyaWMuVChkaXYodGhpcy54LHkueCkpO1xufVxubnVtZXJpYy5ULnByb3RvdHlwZS5kb3QgPSBudW1lcmljLlRiaW5vcChcbiAgICAgICAgJ2RvdCh4LngseS54KScsXG4gICAgICAgICdkb3QoeC54LHkueCksZG90KHgueCx5LnkpJyxcbiAgICAgICAgJ2RvdCh4LngseS54KSxkb3QoeC55LHkueCknLFxuICAgICAgICAnc3ViKGRvdCh4LngseS54KSxkb3QoeC55LHkueSkpLGFkZChkb3QoeC54LHkueSksZG90KHgueSx5LngpKSdcbiAgICAgICAgKTtcbm51bWVyaWMuVC5wcm90b3R5cGUudHJhbnNwb3NlID0gZnVuY3Rpb24gdHJhbnNwb3NlKCkge1xuICAgIHZhciB0ID0gbnVtZXJpYy50cmFuc3Bvc2UsIHggPSB0aGlzLngsIHkgPSB0aGlzLnk7XG4gICAgaWYoeSkgeyByZXR1cm4gbmV3IG51bWVyaWMuVCh0KHgpLHQoeSkpOyB9XG4gICAgcmV0dXJuIG5ldyBudW1lcmljLlQodCh4KSk7XG59XG5udW1lcmljLlQucHJvdG90eXBlLnRyYW5zanVnYXRlID0gZnVuY3Rpb24gdHJhbnNqdWdhdGUoKSB7XG4gICAgdmFyIHQgPSBudW1lcmljLnRyYW5zcG9zZSwgeCA9IHRoaXMueCwgeSA9IHRoaXMueTtcbiAgICBpZih5KSB7IHJldHVybiBuZXcgbnVtZXJpYy5UKHQoeCksbnVtZXJpYy5uZWd0cmFuc3Bvc2UoeSkpOyB9XG4gICAgcmV0dXJuIG5ldyBudW1lcmljLlQodCh4KSk7XG59XG5udW1lcmljLlR1bm9wID0gZnVuY3Rpb24gVHVub3AocixjLHMpIHtcbiAgICBpZih0eXBlb2YgcyAhPT0gXCJzdHJpbmdcIikgeyBzID0gJyc7IH1cbiAgICByZXR1cm4gRnVuY3Rpb24oXG4gICAgICAgICAgICAndmFyIHggPSB0aGlzO1xcbicrXG4gICAgICAgICAgICBzKydcXG4nK1xuICAgICAgICAgICAgJ2lmKHgueSkgeycrXG4gICAgICAgICAgICAnICAnK2MrJztcXG4nK1xuICAgICAgICAgICAgJ31cXG4nK1xuICAgICAgICAgICAgcisnO1xcbidcbiAgICApO1xufVxuXG5udW1lcmljLlQucHJvdG90eXBlLmV4cCA9IG51bWVyaWMuVHVub3AoXG4gICAgICAgICdyZXR1cm4gbmV3IG51bWVyaWMuVChleCknLFxuICAgICAgICAncmV0dXJuIG5ldyBudW1lcmljLlQobXVsKGNvcyh4LnkpLGV4KSxtdWwoc2luKHgueSksZXgpKScsXG4gICAgICAgICd2YXIgZXggPSBudW1lcmljLmV4cCh4LngpLCBjb3MgPSBudW1lcmljLmNvcywgc2luID0gbnVtZXJpYy5zaW4sIG11bCA9IG51bWVyaWMubXVsOycpO1xubnVtZXJpYy5ULnByb3RvdHlwZS5jb25qID0gbnVtZXJpYy5UdW5vcChcbiAgICAgICAgJ3JldHVybiBuZXcgbnVtZXJpYy5UKHgueCk7JyxcbiAgICAgICAgJ3JldHVybiBuZXcgbnVtZXJpYy5UKHgueCxudW1lcmljLm5lZyh4LnkpKTsnKTtcbm51bWVyaWMuVC5wcm90b3R5cGUubmVnID0gbnVtZXJpYy5UdW5vcChcbiAgICAgICAgJ3JldHVybiBuZXcgbnVtZXJpYy5UKG5lZyh4LngpKTsnLFxuICAgICAgICAncmV0dXJuIG5ldyBudW1lcmljLlQobmVnKHgueCksbmVnKHgueSkpOycsXG4gICAgICAgICd2YXIgbmVnID0gbnVtZXJpYy5uZWc7Jyk7XG5udW1lcmljLlQucHJvdG90eXBlLnNpbiA9IG51bWVyaWMuVHVub3AoXG4gICAgICAgICdyZXR1cm4gbmV3IG51bWVyaWMuVChudW1lcmljLnNpbih4LngpKScsXG4gICAgICAgICdyZXR1cm4geC5leHAoKS5zdWIoeC5uZWcoKS5leHAoKSkuZGl2KG5ldyBudW1lcmljLlQoMCwyKSk7Jyk7XG5udW1lcmljLlQucHJvdG90eXBlLmNvcyA9IG51bWVyaWMuVHVub3AoXG4gICAgICAgICdyZXR1cm4gbmV3IG51bWVyaWMuVChudW1lcmljLmNvcyh4LngpKScsXG4gICAgICAgICdyZXR1cm4geC5leHAoKS5hZGQoeC5uZWcoKS5leHAoKSkuZGl2KDIpOycpO1xubnVtZXJpYy5ULnByb3RvdHlwZS5hYnMgPSBudW1lcmljLlR1bm9wKFxuICAgICAgICAncmV0dXJuIG5ldyBudW1lcmljLlQobnVtZXJpYy5hYnMoeC54KSk7JyxcbiAgICAgICAgJ3JldHVybiBuZXcgbnVtZXJpYy5UKG51bWVyaWMuc3FydChudW1lcmljLmFkZChtdWwoeC54LHgueCksbXVsKHgueSx4LnkpKSkpOycsXG4gICAgICAgICd2YXIgbXVsID0gbnVtZXJpYy5tdWw7Jyk7XG5udW1lcmljLlQucHJvdG90eXBlLmxvZyA9IG51bWVyaWMuVHVub3AoXG4gICAgICAgICdyZXR1cm4gbmV3IG51bWVyaWMuVChudW1lcmljLmxvZyh4LngpKTsnLFxuICAgICAgICAndmFyIHRoZXRhID0gbmV3IG51bWVyaWMuVChudW1lcmljLmF0YW4yKHgueSx4LngpKSwgciA9IHguYWJzKCk7XFxuJytcbiAgICAgICAgJ3JldHVybiBuZXcgbnVtZXJpYy5UKG51bWVyaWMubG9nKHIueCksdGhldGEueCk7Jyk7XG5udW1lcmljLlQucHJvdG90eXBlLm5vcm0yID0gbnVtZXJpYy5UdW5vcChcbiAgICAgICAgJ3JldHVybiBudW1lcmljLm5vcm0yKHgueCk7JyxcbiAgICAgICAgJ3ZhciBmID0gbnVtZXJpYy5ub3JtMlNxdWFyZWQ7XFxuJytcbiAgICAgICAgJ3JldHVybiBNYXRoLnNxcnQoZih4LngpK2YoeC55KSk7Jyk7XG5udW1lcmljLlQucHJvdG90eXBlLmludiA9IGZ1bmN0aW9uIGludigpIHtcbiAgICB2YXIgQSA9IHRoaXM7XG4gICAgaWYodHlwZW9mIEEueSA9PT0gXCJ1bmRlZmluZWRcIikgeyByZXR1cm4gbmV3IG51bWVyaWMuVChudW1lcmljLmludihBLngpKTsgfVxuICAgIHZhciBuID0gQS54Lmxlbmd0aCwgaSwgaiwgaztcbiAgICB2YXIgUnggPSBudW1lcmljLmlkZW50aXR5KG4pLFJ5ID0gbnVtZXJpYy5yZXAoW24sbl0sMCk7XG4gICAgdmFyIEF4ID0gbnVtZXJpYy5jbG9uZShBLngpLCBBeSA9IG51bWVyaWMuY2xvbmUoQS55KTtcbiAgICB2YXIgQWl4LCBBaXksIEFqeCwgQWp5LCBSaXgsIFJpeSwgUmp4LCBSank7XG4gICAgdmFyIGksaixrLGQsZDEsYXgsYXksYngsYnksdGVtcDtcbiAgICBmb3IoaT0wO2k8bjtpKyspIHtcbiAgICAgICAgYXggPSBBeFtpXVtpXTsgYXkgPSBBeVtpXVtpXTtcbiAgICAgICAgZCA9IGF4KmF4K2F5KmF5O1xuICAgICAgICBrID0gaTtcbiAgICAgICAgZm9yKGo9aSsxO2o8bjtqKyspIHtcbiAgICAgICAgICAgIGF4ID0gQXhbal1baV07IGF5ID0gQXlbal1baV07XG4gICAgICAgICAgICBkMSA9IGF4KmF4K2F5KmF5O1xuICAgICAgICAgICAgaWYoZDEgPiBkKSB7IGs9ajsgZCA9IGQxOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYoayE9PWkpIHtcbiAgICAgICAgICAgIHRlbXAgPSBBeFtpXTsgQXhbaV0gPSBBeFtrXTsgQXhba10gPSB0ZW1wO1xuICAgICAgICAgICAgdGVtcCA9IEF5W2ldOyBBeVtpXSA9IEF5W2tdOyBBeVtrXSA9IHRlbXA7XG4gICAgICAgICAgICB0ZW1wID0gUnhbaV07IFJ4W2ldID0gUnhba107IFJ4W2tdID0gdGVtcDtcbiAgICAgICAgICAgIHRlbXAgPSBSeVtpXTsgUnlbaV0gPSBSeVtrXTsgUnlba10gPSB0ZW1wO1xuICAgICAgICB9XG4gICAgICAgIEFpeCA9IEF4W2ldOyBBaXkgPSBBeVtpXTtcbiAgICAgICAgUml4ID0gUnhbaV07IFJpeSA9IFJ5W2ldO1xuICAgICAgICBheCA9IEFpeFtpXTsgYXkgPSBBaXlbaV07XG4gICAgICAgIGZvcihqPWkrMTtqPG47aisrKSB7XG4gICAgICAgICAgICBieCA9IEFpeFtqXTsgYnkgPSBBaXlbal07XG4gICAgICAgICAgICBBaXhbal0gPSAoYngqYXgrYnkqYXkpL2Q7XG4gICAgICAgICAgICBBaXlbal0gPSAoYnkqYXgtYngqYXkpL2Q7XG4gICAgICAgIH1cbiAgICAgICAgZm9yKGo9MDtqPG47aisrKSB7XG4gICAgICAgICAgICBieCA9IFJpeFtqXTsgYnkgPSBSaXlbal07XG4gICAgICAgICAgICBSaXhbal0gPSAoYngqYXgrYnkqYXkpL2Q7XG4gICAgICAgICAgICBSaXlbal0gPSAoYnkqYXgtYngqYXkpL2Q7XG4gICAgICAgIH1cbiAgICAgICAgZm9yKGo9aSsxO2o8bjtqKyspIHtcbiAgICAgICAgICAgIEFqeCA9IEF4W2pdOyBBankgPSBBeVtqXTtcbiAgICAgICAgICAgIFJqeCA9IFJ4W2pdOyBSankgPSBSeVtqXTtcbiAgICAgICAgICAgIGF4ID0gQWp4W2ldOyBheSA9IEFqeVtpXTtcbiAgICAgICAgICAgIGZvcihrPWkrMTtrPG47aysrKSB7XG4gICAgICAgICAgICAgICAgYnggPSBBaXhba107IGJ5ID0gQWl5W2tdO1xuICAgICAgICAgICAgICAgIEFqeFtrXSAtPSBieCpheC1ieSpheTtcbiAgICAgICAgICAgICAgICBBanlba10gLT0gYnkqYXgrYngqYXk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3Ioaz0wO2s8bjtrKyspIHtcbiAgICAgICAgICAgICAgICBieCA9IFJpeFtrXTsgYnkgPSBSaXlba107XG4gICAgICAgICAgICAgICAgUmp4W2tdIC09IGJ4KmF4LWJ5KmF5O1xuICAgICAgICAgICAgICAgIFJqeVtrXSAtPSBieSpheCtieCpheTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IoaT1uLTE7aT4wO2ktLSkge1xuICAgICAgICBSaXggPSBSeFtpXTsgUml5ID0gUnlbaV07XG4gICAgICAgIGZvcihqPWktMTtqPj0wO2otLSkge1xuICAgICAgICAgICAgUmp4ID0gUnhbal07IFJqeSA9IFJ5W2pdO1xuICAgICAgICAgICAgYXggPSBBeFtqXVtpXTsgYXkgPSBBeVtqXVtpXTtcbiAgICAgICAgICAgIGZvcihrPW4tMTtrPj0wO2stLSkge1xuICAgICAgICAgICAgICAgIGJ4ID0gUml4W2tdOyBieSA9IFJpeVtrXTtcbiAgICAgICAgICAgICAgICBSanhba10gLT0gYXgqYnggLSBheSpieTtcbiAgICAgICAgICAgICAgICBSanlba10gLT0gYXgqYnkgKyBheSpieDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IG51bWVyaWMuVChSeCxSeSk7XG59XG5udW1lcmljLlQucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldChpKSB7XG4gICAgdmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIGsgPSAwLCBpaywgbiA9IGkubGVuZ3RoO1xuICAgIGlmKHkpIHtcbiAgICAgICAgd2hpbGUoazxuKSB7XG4gICAgICAgICAgICBpayA9IGlba107XG4gICAgICAgICAgICB4ID0geFtpa107XG4gICAgICAgICAgICB5ID0geVtpa107XG4gICAgICAgICAgICBrKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBudW1lcmljLlQoeCx5KTtcbiAgICB9XG4gICAgd2hpbGUoazxuKSB7XG4gICAgICAgIGlrID0gaVtrXTtcbiAgICAgICAgeCA9IHhbaWtdO1xuICAgICAgICBrKys7XG4gICAgfVxuICAgIHJldHVybiBuZXcgbnVtZXJpYy5UKHgpO1xufVxubnVtZXJpYy5ULnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbiBzZXQoaSx2KSB7XG4gICAgdmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnksIGsgPSAwLCBpaywgbiA9IGkubGVuZ3RoLCB2eCA9IHYueCwgdnkgPSB2Lnk7XG4gICAgaWYobj09PTApIHtcbiAgICAgICAgaWYodnkpIHsgdGhpcy55ID0gdnk7IH1cbiAgICAgICAgZWxzZSBpZih5KSB7IHRoaXMueSA9IHVuZGVmaW5lZDsgfVxuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgaWYodnkpIHtcbiAgICAgICAgaWYoeSkgeyAvKiBvayAqLyB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgeSA9IG51bWVyaWMucmVwKG51bWVyaWMuZGltKHgpLDApO1xuICAgICAgICAgICAgdGhpcy55ID0geTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZShrPG4tMSkge1xuICAgICAgICAgICAgaWsgPSBpW2tdO1xuICAgICAgICAgICAgeCA9IHhbaWtdO1xuICAgICAgICAgICAgeSA9IHlbaWtdO1xuICAgICAgICAgICAgaysrO1xuICAgICAgICB9XG4gICAgICAgIGlrID0gaVtrXTtcbiAgICAgICAgeFtpa10gPSB2eDtcbiAgICAgICAgeVtpa10gPSB2eTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGlmKHkpIHtcbiAgICAgICAgd2hpbGUoazxuLTEpIHtcbiAgICAgICAgICAgIGlrID0gaVtrXTtcbiAgICAgICAgICAgIHggPSB4W2lrXTtcbiAgICAgICAgICAgIHkgPSB5W2lrXTtcbiAgICAgICAgICAgIGsrKztcbiAgICAgICAgfVxuICAgICAgICBpayA9IGlba107XG4gICAgICAgIHhbaWtdID0gdng7XG4gICAgICAgIGlmKHZ4IGluc3RhbmNlb2YgQXJyYXkpIHlbaWtdID0gbnVtZXJpYy5yZXAobnVtZXJpYy5kaW0odngpLDApO1xuICAgICAgICBlbHNlIHlbaWtdID0gMDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHdoaWxlKGs8bi0xKSB7XG4gICAgICAgIGlrID0gaVtrXTtcbiAgICAgICAgeCA9IHhbaWtdO1xuICAgICAgICBrKys7XG4gICAgfVxuICAgIGlrID0gaVtrXTtcbiAgICB4W2lrXSA9IHZ4O1xuICAgIHJldHVybiB0aGlzO1xufVxubnVtZXJpYy5ULnByb3RvdHlwZS5nZXRSb3dzID0gZnVuY3Rpb24gZ2V0Um93cyhpMCxpMSkge1xuICAgIHZhciBuID0gaTEtaTArMSwgajtcbiAgICB2YXIgcnggPSBBcnJheShuKSwgcnksIHggPSB0aGlzLngsIHkgPSB0aGlzLnk7XG4gICAgZm9yKGo9aTA7ajw9aTE7aisrKSB7IHJ4W2otaTBdID0geFtqXTsgfVxuICAgIGlmKHkpIHtcbiAgICAgICAgcnkgPSBBcnJheShuKTtcbiAgICAgICAgZm9yKGo9aTA7ajw9aTE7aisrKSB7IHJ5W2otaTBdID0geVtqXTsgfVxuICAgICAgICByZXR1cm4gbmV3IG51bWVyaWMuVChyeCxyeSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgbnVtZXJpYy5UKHJ4KTtcbn1cbm51bWVyaWMuVC5wcm90b3R5cGUuc2V0Um93cyA9IGZ1bmN0aW9uIHNldFJvd3MoaTAsaTEsQSkge1xuICAgIHZhciBqO1xuICAgIHZhciByeCA9IHRoaXMueCwgcnkgPSB0aGlzLnksIHggPSBBLngsIHkgPSBBLnk7XG4gICAgZm9yKGo9aTA7ajw9aTE7aisrKSB7IHJ4W2pdID0geFtqLWkwXTsgfVxuICAgIGlmKHkpIHtcbiAgICAgICAgaWYoIXJ5KSB7IHJ5ID0gbnVtZXJpYy5yZXAobnVtZXJpYy5kaW0ocngpLDApOyB0aGlzLnkgPSByeTsgfVxuICAgICAgICBmb3Ioaj1pMDtqPD1pMTtqKyspIHsgcnlbal0gPSB5W2otaTBdOyB9XG4gICAgfSBlbHNlIGlmKHJ5KSB7XG4gICAgICAgIGZvcihqPWkwO2o8PWkxO2orKykgeyByeVtqXSA9IG51bWVyaWMucmVwKFt4W2otaTBdLmxlbmd0aF0sMCk7IH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG59XG5udW1lcmljLlQucHJvdG90eXBlLmdldFJvdyA9IGZ1bmN0aW9uIGdldFJvdyhrKSB7XG4gICAgdmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnk7XG4gICAgaWYoeSkgeyByZXR1cm4gbmV3IG51bWVyaWMuVCh4W2tdLHlba10pOyB9XG4gICAgcmV0dXJuIG5ldyBudW1lcmljLlQoeFtrXSk7XG59XG5udW1lcmljLlQucHJvdG90eXBlLnNldFJvdyA9IGZ1bmN0aW9uIHNldFJvdyhpLHYpIHtcbiAgICB2YXIgcnggPSB0aGlzLngsIHJ5ID0gdGhpcy55LCB4ID0gdi54LCB5ID0gdi55O1xuICAgIHJ4W2ldID0geDtcbiAgICBpZih5KSB7XG4gICAgICAgIGlmKCFyeSkgeyByeSA9IG51bWVyaWMucmVwKG51bWVyaWMuZGltKHJ4KSwwKTsgdGhpcy55ID0gcnk7IH1cbiAgICAgICAgcnlbaV0gPSB5O1xuICAgIH0gZWxzZSBpZihyeSkge1xuICAgICAgICByeSA9IG51bWVyaWMucmVwKFt4Lmxlbmd0aF0sMCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xufVxuXG5udW1lcmljLlQucHJvdG90eXBlLmdldEJsb2NrID0gZnVuY3Rpb24gZ2V0QmxvY2soZnJvbSx0bykge1xuICAgIHZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCBiID0gbnVtZXJpYy5nZXRCbG9jaztcbiAgICBpZih5KSB7IHJldHVybiBuZXcgbnVtZXJpYy5UKGIoeCxmcm9tLHRvKSxiKHksZnJvbSx0bykpOyB9XG4gICAgcmV0dXJuIG5ldyBudW1lcmljLlQoYih4LGZyb20sdG8pKTtcbn1cbm51bWVyaWMuVC5wcm90b3R5cGUuc2V0QmxvY2sgPSBmdW5jdGlvbiBzZXRCbG9jayhmcm9tLHRvLEEpIHtcbiAgICBpZighKEEgaW5zdGFuY2VvZiBudW1lcmljLlQpKSBBID0gbmV3IG51bWVyaWMuVChBKTtcbiAgICB2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgYiA9IG51bWVyaWMuc2V0QmxvY2ssIEF4ID0gQS54LCBBeSA9IEEueTtcbiAgICBpZihBeSkge1xuICAgICAgICBpZigheSkgeyB0aGlzLnkgPSBudW1lcmljLnJlcChudW1lcmljLmRpbSh0aGlzKSwwKTsgeSA9IHRoaXMueTsgfVxuICAgICAgICBiKHgsZnJvbSx0byxBeCk7XG4gICAgICAgIGIoeSxmcm9tLHRvLEF5KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGIoeCxmcm9tLHRvLEF4KTtcbiAgICBpZih5KSBiKHksZnJvbSx0byxudW1lcmljLnJlcChudW1lcmljLmRpbShBeCksMCkpO1xufVxubnVtZXJpYy5ULnJlcCA9IGZ1bmN0aW9uIHJlcChzLHYpIHtcbiAgICB2YXIgVCA9IG51bWVyaWMuVDtcbiAgICBpZighKHYgaW5zdGFuY2VvZiBUKSkgdiA9IG5ldyBUKHYpO1xuICAgIHZhciB4ID0gdi54LCB5ID0gdi55LCByID0gbnVtZXJpYy5yZXA7XG4gICAgaWYoeSkgcmV0dXJuIG5ldyBUKHIocyx4KSxyKHMseSkpO1xuICAgIHJldHVybiBuZXcgVChyKHMseCkpO1xufVxubnVtZXJpYy5ULmRpYWcgPSBmdW5jdGlvbiBkaWFnKGQpIHtcbiAgICBpZighKGQgaW5zdGFuY2VvZiBudW1lcmljLlQpKSBkID0gbmV3IG51bWVyaWMuVChkKTtcbiAgICB2YXIgeCA9IGQueCwgeSA9IGQueSwgZGlhZyA9IG51bWVyaWMuZGlhZztcbiAgICBpZih5KSByZXR1cm4gbmV3IG51bWVyaWMuVChkaWFnKHgpLGRpYWcoeSkpO1xuICAgIHJldHVybiBuZXcgbnVtZXJpYy5UKGRpYWcoeCkpO1xufVxubnVtZXJpYy5ULmVpZyA9IGZ1bmN0aW9uIGVpZygpIHtcbiAgICBpZih0aGlzLnkpIHsgdGhyb3cgbmV3IEVycm9yKCdlaWc6IG5vdCBpbXBsZW1lbnRlZCBmb3IgY29tcGxleCBtYXRyaWNlcy4nKTsgfVxuICAgIHJldHVybiBudW1lcmljLmVpZyh0aGlzLngpO1xufVxubnVtZXJpYy5ULmlkZW50aXR5ID0gZnVuY3Rpb24gaWRlbnRpdHkobikgeyByZXR1cm4gbmV3IG51bWVyaWMuVChudW1lcmljLmlkZW50aXR5KG4pKTsgfVxubnVtZXJpYy5ULnByb3RvdHlwZS5nZXREaWFnID0gZnVuY3Rpb24gZ2V0RGlhZygpIHtcbiAgICB2YXIgbiA9IG51bWVyaWM7XG4gICAgdmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnk7XG4gICAgaWYoeSkgeyByZXR1cm4gbmV3IG4uVChuLmdldERpYWcoeCksbi5nZXREaWFnKHkpKTsgfVxuICAgIHJldHVybiBuZXcgbi5UKG4uZ2V0RGlhZyh4KSk7XG59XG5cbi8vIDQuIEVpZ2VudmFsdWVzIG9mIHJlYWwgbWF0cmljZXNcblxubnVtZXJpYy5ob3VzZSA9IGZ1bmN0aW9uIGhvdXNlKHgpIHtcbiAgICB2YXIgdiA9IG51bWVyaWMuY2xvbmUoeCk7XG4gICAgdmFyIHMgPSB4WzBdID49IDAgPyAxIDogLTE7XG4gICAgdmFyIGFscGhhID0gcypudW1lcmljLm5vcm0yKHgpO1xuICAgIHZbMF0gKz0gYWxwaGE7XG4gICAgdmFyIGZvbyA9IG51bWVyaWMubm9ybTIodik7XG4gICAgaWYoZm9vID09PSAwKSB7IC8qIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gKi8gdGhyb3cgbmV3IEVycm9yKCdlaWc6IGludGVybmFsIGVycm9yJyk7IH1cbiAgICByZXR1cm4gbnVtZXJpYy5kaXYodixmb28pO1xufVxuXG5udW1lcmljLnRvVXBwZXJIZXNzZW5iZXJnID0gZnVuY3Rpb24gdG9VcHBlckhlc3NlbmJlcmcobWUpIHtcbiAgICB2YXIgcyA9IG51bWVyaWMuZGltKG1lKTtcbiAgICBpZihzLmxlbmd0aCAhPT0gMiB8fCBzWzBdICE9PSBzWzFdKSB7IHRocm93IG5ldyBFcnJvcignbnVtZXJpYzogdG9VcHBlckhlc3NlbmJlcmcoKSBvbmx5IHdvcmtzIG9uIHNxdWFyZSBtYXRyaWNlcycpOyB9XG4gICAgdmFyIG0gPSBzWzBdLCBpLGosayx4LHYsQSA9IG51bWVyaWMuY2xvbmUobWUpLEIsQyxBaSxDaSxRID0gbnVtZXJpYy5pZGVudGl0eShtKSxRaTtcbiAgICBmb3Ioaj0wO2o8bS0yO2orKykge1xuICAgICAgICB4ID0gQXJyYXkobS1qLTEpO1xuICAgICAgICBmb3IoaT1qKzE7aTxtO2krKykgeyB4W2ktai0xXSA9IEFbaV1bal07IH1cbiAgICAgICAgaWYobnVtZXJpYy5ub3JtMih4KT4wKSB7XG4gICAgICAgICAgICB2ID0gbnVtZXJpYy5ob3VzZSh4KTtcbiAgICAgICAgICAgIEIgPSBudW1lcmljLmdldEJsb2NrKEEsW2orMSxqXSxbbS0xLG0tMV0pO1xuICAgICAgICAgICAgQyA9IG51bWVyaWMudGVuc29yKHYsbnVtZXJpYy5kb3QodixCKSk7XG4gICAgICAgICAgICBmb3IoaT1qKzE7aTxtO2krKykgeyBBaSA9IEFbaV07IENpID0gQ1tpLWotMV07IGZvcihrPWo7azxtO2srKykgQWlba10gLT0gMipDaVtrLWpdOyB9XG4gICAgICAgICAgICBCID0gbnVtZXJpYy5nZXRCbG9jayhBLFswLGorMV0sW20tMSxtLTFdKTtcbiAgICAgICAgICAgIEMgPSBudW1lcmljLnRlbnNvcihudW1lcmljLmRvdChCLHYpLHYpO1xuICAgICAgICAgICAgZm9yKGk9MDtpPG07aSsrKSB7IEFpID0gQVtpXTsgQ2kgPSBDW2ldOyBmb3Ioaz1qKzE7azxtO2srKykgQWlba10gLT0gMipDaVtrLWotMV07IH1cbiAgICAgICAgICAgIEIgPSBBcnJheShtLWotMSk7XG4gICAgICAgICAgICBmb3IoaT1qKzE7aTxtO2krKykgQltpLWotMV0gPSBRW2ldO1xuICAgICAgICAgICAgQyA9IG51bWVyaWMudGVuc29yKHYsbnVtZXJpYy5kb3QodixCKSk7XG4gICAgICAgICAgICBmb3IoaT1qKzE7aTxtO2krKykgeyBRaSA9IFFbaV07IENpID0gQ1tpLWotMV07IGZvcihrPTA7azxtO2srKykgUWlba10gLT0gMipDaVtrXTsgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7SDpBLCBROlF9O1xufVxuXG5udW1lcmljLmVwc2lsb24gPSAyLjIyMDQ0NjA0OTI1MDMxM2UtMTY7XG5cbm51bWVyaWMuUVJGcmFuY2lzID0gZnVuY3Rpb24oSCxtYXhpdGVyKSB7XG4gICAgaWYodHlwZW9mIG1heGl0ZXIgPT09IFwidW5kZWZpbmVkXCIpIHsgbWF4aXRlciA9IDEwMDAwOyB9XG4gICAgSCA9IG51bWVyaWMuY2xvbmUoSCk7XG4gICAgdmFyIEgwID0gbnVtZXJpYy5jbG9uZShIKTtcbiAgICB2YXIgcyA9IG51bWVyaWMuZGltKEgpLG09c1swXSx4LHYsYSxiLGMsZCxkZXQsdHIsIEhsb2MsIFEgPSBudW1lcmljLmlkZW50aXR5KG0pLCBRaSwgSGksIEIsIEMsIENpLGksaixrLGl0ZXI7XG4gICAgaWYobTwzKSB7IHJldHVybiB7UTpRLCBCOlsgWzAsbS0xXSBdfTsgfVxuICAgIHZhciBlcHNpbG9uID0gbnVtZXJpYy5lcHNpbG9uO1xuICAgIGZvcihpdGVyPTA7aXRlcjxtYXhpdGVyO2l0ZXIrKykge1xuICAgICAgICBmb3Ioaj0wO2o8bS0xO2orKykge1xuICAgICAgICAgICAgaWYoTWF0aC5hYnMoSFtqKzFdW2pdKSA8IGVwc2lsb24qKE1hdGguYWJzKEhbal1bal0pK01hdGguYWJzKEhbaisxXVtqKzFdKSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgUUgxID0gbnVtZXJpYy5RUkZyYW5jaXMobnVtZXJpYy5nZXRCbG9jayhILFswLDBdLFtqLGpdKSxtYXhpdGVyKTtcbiAgICAgICAgICAgICAgICB2YXIgUUgyID0gbnVtZXJpYy5RUkZyYW5jaXMobnVtZXJpYy5nZXRCbG9jayhILFtqKzEsaisxXSxbbS0xLG0tMV0pLG1heGl0ZXIpO1xuICAgICAgICAgICAgICAgIEIgPSBBcnJheShqKzEpO1xuICAgICAgICAgICAgICAgIGZvcihpPTA7aTw9ajtpKyspIHsgQltpXSA9IFFbaV07IH1cbiAgICAgICAgICAgICAgICBDID0gbnVtZXJpYy5kb3QoUUgxLlEsQik7XG4gICAgICAgICAgICAgICAgZm9yKGk9MDtpPD1qO2krKykgeyBRW2ldID0gQ1tpXTsgfVxuICAgICAgICAgICAgICAgIEIgPSBBcnJheShtLWotMSk7XG4gICAgICAgICAgICAgICAgZm9yKGk9aisxO2k8bTtpKyspIHsgQltpLWotMV0gPSBRW2ldOyB9XG4gICAgICAgICAgICAgICAgQyA9IG51bWVyaWMuZG90KFFIMi5RLEIpO1xuICAgICAgICAgICAgICAgIGZvcihpPWorMTtpPG07aSsrKSB7IFFbaV0gPSBDW2ktai0xXTsgfVxuICAgICAgICAgICAgICAgIHJldHVybiB7UTpRLEI6UUgxLkIuY29uY2F0KG51bWVyaWMuYWRkKFFIMi5CLGorMSkpfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhID0gSFttLTJdW20tMl07IGIgPSBIW20tMl1bbS0xXTtcbiAgICAgICAgYyA9IEhbbS0xXVttLTJdOyBkID0gSFttLTFdW20tMV07XG4gICAgICAgIHRyID0gYStkO1xuICAgICAgICBkZXQgPSAoYSpkLWIqYyk7XG4gICAgICAgIEhsb2MgPSBudW1lcmljLmdldEJsb2NrKEgsIFswLDBdLCBbMiwyXSk7XG4gICAgICAgIGlmKHRyKnRyPj00KmRldCkge1xuICAgICAgICAgICAgdmFyIHMxLHMyO1xuICAgICAgICAgICAgczEgPSAwLjUqKHRyK01hdGguc3FydCh0cip0ci00KmRldCkpO1xuICAgICAgICAgICAgczIgPSAwLjUqKHRyLU1hdGguc3FydCh0cip0ci00KmRldCkpO1xuICAgICAgICAgICAgSGxvYyA9IG51bWVyaWMuYWRkKG51bWVyaWMuc3ViKG51bWVyaWMuZG90KEhsb2MsSGxvYyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJpYy5tdWwoSGxvYyxzMStzMikpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWMuZGlhZyhudW1lcmljLnJlcChbM10sczEqczIpKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBIbG9jID0gbnVtZXJpYy5hZGQobnVtZXJpYy5zdWIobnVtZXJpYy5kb3QoSGxvYyxIbG9jKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1lcmljLm11bChIbG9jLHRyKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtZXJpYy5kaWFnKG51bWVyaWMucmVwKFszXSxkZXQpKSk7XG4gICAgICAgIH1cbiAgICAgICAgeCA9IFtIbG9jWzBdWzBdLEhsb2NbMV1bMF0sSGxvY1syXVswXV07XG4gICAgICAgIHYgPSBudW1lcmljLmhvdXNlKHgpO1xuICAgICAgICBCID0gW0hbMF0sSFsxXSxIWzJdXTtcbiAgICAgICAgQyA9IG51bWVyaWMudGVuc29yKHYsbnVtZXJpYy5kb3QodixCKSk7XG4gICAgICAgIGZvcihpPTA7aTwzO2krKykgeyBIaSA9IEhbaV07IENpID0gQ1tpXTsgZm9yKGs9MDtrPG07aysrKSBIaVtrXSAtPSAyKkNpW2tdOyB9XG4gICAgICAgIEIgPSBudW1lcmljLmdldEJsb2NrKEgsIFswLDBdLFttLTEsMl0pO1xuICAgICAgICBDID0gbnVtZXJpYy50ZW5zb3IobnVtZXJpYy5kb3QoQix2KSx2KTtcbiAgICAgICAgZm9yKGk9MDtpPG07aSsrKSB7IEhpID0gSFtpXTsgQ2kgPSBDW2ldOyBmb3Ioaz0wO2s8MztrKyspIEhpW2tdIC09IDIqQ2lba107IH1cbiAgICAgICAgQiA9IFtRWzBdLFFbMV0sUVsyXV07XG4gICAgICAgIEMgPSBudW1lcmljLnRlbnNvcih2LG51bWVyaWMuZG90KHYsQikpO1xuICAgICAgICBmb3IoaT0wO2k8MztpKyspIHsgUWkgPSBRW2ldOyBDaSA9IENbaV07IGZvcihrPTA7azxtO2srKykgUWlba10gLT0gMipDaVtrXTsgfVxuICAgICAgICB2YXIgSjtcbiAgICAgICAgZm9yKGo9MDtqPG0tMjtqKyspIHtcbiAgICAgICAgICAgIGZvcihrPWo7azw9aisxO2srKykge1xuICAgICAgICAgICAgICAgIGlmKE1hdGguYWJzKEhbaysxXVtrXSkgPCBlcHNpbG9uKihNYXRoLmFicyhIW2tdW2tdKStNYXRoLmFicyhIW2srMV1baysxXSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBRSDEgPSBudW1lcmljLlFSRnJhbmNpcyhudW1lcmljLmdldEJsb2NrKEgsWzAsMF0sW2ssa10pLG1heGl0ZXIpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgUUgyID0gbnVtZXJpYy5RUkZyYW5jaXMobnVtZXJpYy5nZXRCbG9jayhILFtrKzEsaysxXSxbbS0xLG0tMV0pLG1heGl0ZXIpO1xuICAgICAgICAgICAgICAgICAgICBCID0gQXJyYXkoaysxKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yKGk9MDtpPD1rO2krKykgeyBCW2ldID0gUVtpXTsgfVxuICAgICAgICAgICAgICAgICAgICBDID0gbnVtZXJpYy5kb3QoUUgxLlEsQik7XG4gICAgICAgICAgICAgICAgICAgIGZvcihpPTA7aTw9aztpKyspIHsgUVtpXSA9IENbaV07IH1cbiAgICAgICAgICAgICAgICAgICAgQiA9IEFycmF5KG0tay0xKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yKGk9aysxO2k8bTtpKyspIHsgQltpLWstMV0gPSBRW2ldOyB9XG4gICAgICAgICAgICAgICAgICAgIEMgPSBudW1lcmljLmRvdChRSDIuUSxCKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yKGk9aysxO2k8bTtpKyspIHsgUVtpXSA9IENbaS1rLTFdOyB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7UTpRLEI6UUgxLkIuY29uY2F0KG51bWVyaWMuYWRkKFFIMi5CLGsrMSkpfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBKID0gTWF0aC5taW4obS0xLGorMyk7XG4gICAgICAgICAgICB4ID0gQXJyYXkoSi1qKTtcbiAgICAgICAgICAgIGZvcihpPWorMTtpPD1KO2krKykgeyB4W2ktai0xXSA9IEhbaV1bal07IH1cbiAgICAgICAgICAgIHYgPSBudW1lcmljLmhvdXNlKHgpO1xuICAgICAgICAgICAgQiA9IG51bWVyaWMuZ2V0QmxvY2soSCwgW2orMSxqXSxbSixtLTFdKTtcbiAgICAgICAgICAgIEMgPSBudW1lcmljLnRlbnNvcih2LG51bWVyaWMuZG90KHYsQikpO1xuICAgICAgICAgICAgZm9yKGk9aisxO2k8PUo7aSsrKSB7IEhpID0gSFtpXTsgQ2kgPSBDW2ktai0xXTsgZm9yKGs9ajtrPG07aysrKSBIaVtrXSAtPSAyKkNpW2stal07IH1cbiAgICAgICAgICAgIEIgPSBudW1lcmljLmdldEJsb2NrKEgsIFswLGorMV0sW20tMSxKXSk7XG4gICAgICAgICAgICBDID0gbnVtZXJpYy50ZW5zb3IobnVtZXJpYy5kb3QoQix2KSx2KTtcbiAgICAgICAgICAgIGZvcihpPTA7aTxtO2krKykgeyBIaSA9IEhbaV07IENpID0gQ1tpXTsgZm9yKGs9aisxO2s8PUo7aysrKSBIaVtrXSAtPSAyKkNpW2stai0xXTsgfVxuICAgICAgICAgICAgQiA9IEFycmF5KEotaik7XG4gICAgICAgICAgICBmb3IoaT1qKzE7aTw9SjtpKyspIEJbaS1qLTFdID0gUVtpXTtcbiAgICAgICAgICAgIEMgPSBudW1lcmljLnRlbnNvcih2LG51bWVyaWMuZG90KHYsQikpO1xuICAgICAgICAgICAgZm9yKGk9aisxO2k8PUo7aSsrKSB7IFFpID0gUVtpXTsgQ2kgPSBDW2ktai0xXTsgZm9yKGs9MDtrPG07aysrKSBRaVtrXSAtPSAyKkNpW2tdOyB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdudW1lcmljOiBlaWdlbnZhbHVlIGl0ZXJhdGlvbiBkb2VzIG5vdCBjb252ZXJnZSAtLSBpbmNyZWFzZSBtYXhpdGVyPycpO1xufVxuXG5udW1lcmljLmVpZyA9IGZ1bmN0aW9uIGVpZyhBLG1heGl0ZXIpIHtcbiAgICB2YXIgUUggPSBudW1lcmljLnRvVXBwZXJIZXNzZW5iZXJnKEEpO1xuICAgIHZhciBRQiA9IG51bWVyaWMuUVJGcmFuY2lzKFFILkgsbWF4aXRlcik7XG4gICAgdmFyIFQgPSBudW1lcmljLlQ7XG4gICAgdmFyIG4gPSBBLmxlbmd0aCxpLGssZmxhZyA9IGZhbHNlLEIgPSBRQi5CLEggPSBudW1lcmljLmRvdChRQi5RLG51bWVyaWMuZG90KFFILkgsbnVtZXJpYy50cmFuc3Bvc2UoUUIuUSkpKTtcbiAgICB2YXIgUSA9IG5ldyBUKG51bWVyaWMuZG90KFFCLlEsUUguUSkpLFEwO1xuICAgIHZhciBtID0gQi5sZW5ndGgsajtcbiAgICB2YXIgYSxiLGMsZCxwMSxwMixkaXNjLHgseSxwLHEsbjEsbjI7XG4gICAgdmFyIHNxcnQgPSBNYXRoLnNxcnQ7XG4gICAgZm9yKGs9MDtrPG07aysrKSB7XG4gICAgICAgIGkgPSBCW2tdWzBdO1xuICAgICAgICBpZihpID09PSBCW2tdWzFdKSB7XG4gICAgICAgICAgICAvLyBub3RoaW5nXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBqID0gaSsxO1xuICAgICAgICAgICAgYSA9IEhbaV1baV07XG4gICAgICAgICAgICBiID0gSFtpXVtqXTtcbiAgICAgICAgICAgIGMgPSBIW2pdW2ldO1xuICAgICAgICAgICAgZCA9IEhbal1bal07XG4gICAgICAgICAgICBpZihiID09PSAwICYmIGMgPT09IDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgcDEgPSAtYS1kO1xuICAgICAgICAgICAgcDIgPSBhKmQtYipjO1xuICAgICAgICAgICAgZGlzYyA9IHAxKnAxLTQqcDI7XG4gICAgICAgICAgICBpZihkaXNjPj0wKSB7XG4gICAgICAgICAgICAgICAgaWYocDE8MCkgeCA9IC0wLjUqKHAxLXNxcnQoZGlzYykpO1xuICAgICAgICAgICAgICAgIGVsc2UgICAgIHggPSAtMC41KihwMStzcXJ0KGRpc2MpKTtcbiAgICAgICAgICAgICAgICBuMSA9IChhLXgpKihhLXgpK2IqYjtcbiAgICAgICAgICAgICAgICBuMiA9IGMqYysoZC14KSooZC14KTtcbiAgICAgICAgICAgICAgICBpZihuMT5uMikge1xuICAgICAgICAgICAgICAgICAgICBuMSA9IHNxcnQobjEpO1xuICAgICAgICAgICAgICAgICAgICBwID0gKGEteCkvbjE7XG4gICAgICAgICAgICAgICAgICAgIHEgPSBiL24xO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG4yID0gc3FydChuMik7XG4gICAgICAgICAgICAgICAgICAgIHAgPSBjL24yO1xuICAgICAgICAgICAgICAgICAgICBxID0gKGQteCkvbjI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFEwID0gbmV3IFQoW1txLC1wXSxbcCxxXV0pO1xuICAgICAgICAgICAgICAgIFEuc2V0Um93cyhpLGosUTAuZG90KFEuZ2V0Um93cyhpLGopKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHggPSAtMC41KnAxO1xuICAgICAgICAgICAgICAgIHkgPSAwLjUqc3FydCgtZGlzYyk7XG4gICAgICAgICAgICAgICAgbjEgPSAoYS14KSooYS14KStiKmI7XG4gICAgICAgICAgICAgICAgbjIgPSBjKmMrKGQteCkqKGQteCk7XG4gICAgICAgICAgICAgICAgaWYobjE+bjIpIHtcbiAgICAgICAgICAgICAgICAgICAgbjEgPSBzcXJ0KG4xK3kqeSk7XG4gICAgICAgICAgICAgICAgICAgIHAgPSAoYS14KS9uMTtcbiAgICAgICAgICAgICAgICAgICAgcSA9IGIvbjE7XG4gICAgICAgICAgICAgICAgICAgIHggPSAwO1xuICAgICAgICAgICAgICAgICAgICB5IC89IG4xO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG4yID0gc3FydChuMit5KnkpO1xuICAgICAgICAgICAgICAgICAgICBwID0gYy9uMjtcbiAgICAgICAgICAgICAgICAgICAgcSA9IChkLXgpL24yO1xuICAgICAgICAgICAgICAgICAgICB4ID0geS9uMjtcbiAgICAgICAgICAgICAgICAgICAgeSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFEwID0gbmV3IFQoW1txLC1wXSxbcCxxXV0sW1t4LHldLFt5LC14XV0pO1xuICAgICAgICAgICAgICAgIFEuc2V0Um93cyhpLGosUTAuZG90KFEuZ2V0Um93cyhpLGopKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgdmFyIFIgPSBRLmRvdChBKS5kb3QoUS50cmFuc2p1Z2F0ZSgpKSwgbiA9IEEubGVuZ3RoLCBFID0gbnVtZXJpYy5ULmlkZW50aXR5KG4pO1xuICAgIGZvcihqPTA7ajxuO2orKykge1xuICAgICAgICBpZihqPjApIHtcbiAgICAgICAgICAgIGZvcihrPWotMTtrPj0wO2stLSkge1xuICAgICAgICAgICAgICAgIHZhciBSayA9IFIuZ2V0KFtrLGtdKSwgUmogPSBSLmdldChbaixqXSk7XG4gICAgICAgICAgICAgICAgaWYobnVtZXJpYy5uZXEoUmsueCxSai54KSB8fCBudW1lcmljLm5lcShSay55LFJqLnkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHggPSBSLmdldFJvdyhrKS5nZXRCbG9jayhba10sW2otMV0pO1xuICAgICAgICAgICAgICAgICAgICB5ID0gRS5nZXRSb3coaikuZ2V0QmxvY2soW2tdLFtqLTFdKTtcbiAgICAgICAgICAgICAgICAgICAgRS5zZXQoW2osa10sKFIuZ2V0KFtrLGpdKS5uZWcoKS5zdWIoeC5kb3QoeSkpKS5kaXYoUmsuc3ViKFJqKSkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIEUuc2V0Um93KGosRS5nZXRSb3coaykpO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yKGo9MDtqPG47aisrKSB7XG4gICAgICAgIHggPSBFLmdldFJvdyhqKTtcbiAgICAgICAgRS5zZXRSb3coaix4LmRpdih4Lm5vcm0yKCkpKTtcbiAgICB9XG4gICAgRSA9IEUudHJhbnNwb3NlKCk7XG4gICAgRSA9IFEudHJhbnNqdWdhdGUoKS5kb3QoRSk7XG4gICAgcmV0dXJuIHsgbGFtYmRhOlIuZ2V0RGlhZygpLCBFOkUgfTtcbn07XG5cbi8vIDUuIENvbXByZXNzZWQgQ29sdW1uIFN0b3JhZ2UgbWF0cmljZXNcbm51bWVyaWMuY2NzU3BhcnNlID0gZnVuY3Rpb24gY2NzU3BhcnNlKEEpIHtcbiAgICB2YXIgbSA9IEEubGVuZ3RoLG4sZm9vLCBpLGosIGNvdW50cyA9IFtdO1xuICAgIGZvcihpPW0tMTtpIT09LTE7LS1pKSB7XG4gICAgICAgIGZvbyA9IEFbaV07XG4gICAgICAgIGZvcihqIGluIGZvbykge1xuICAgICAgICAgICAgaiA9IHBhcnNlSW50KGopO1xuICAgICAgICAgICAgd2hpbGUoaj49Y291bnRzLmxlbmd0aCkgY291bnRzW2NvdW50cy5sZW5ndGhdID0gMDtcbiAgICAgICAgICAgIGlmKGZvb1tqXSE9PTApIGNvdW50c1tqXSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBuID0gY291bnRzLmxlbmd0aDtcbiAgICB2YXIgQWkgPSBBcnJheShuKzEpO1xuICAgIEFpWzBdID0gMDtcbiAgICBmb3IoaT0wO2k8bjsrK2kpIEFpW2krMV0gPSBBaVtpXSArIGNvdW50c1tpXTtcbiAgICB2YXIgQWogPSBBcnJheShBaVtuXSksIEF2ID0gQXJyYXkoQWlbbl0pO1xuICAgIGZvcihpPW0tMTtpIT09LTE7LS1pKSB7XG4gICAgICAgIGZvbyA9IEFbaV07XG4gICAgICAgIGZvcihqIGluIGZvbykge1xuICAgICAgICAgICAgaWYoZm9vW2pdIT09MCkge1xuICAgICAgICAgICAgICAgIGNvdW50c1tqXS0tO1xuICAgICAgICAgICAgICAgIEFqW0FpW2pdK2NvdW50c1tqXV0gPSBpO1xuICAgICAgICAgICAgICAgIEF2W0FpW2pdK2NvdW50c1tqXV0gPSBmb29bal07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtBaSxBaixBdl07XG59XG5udW1lcmljLmNjc0Z1bGwgPSBmdW5jdGlvbiBjY3NGdWxsKEEpIHtcbiAgICB2YXIgQWkgPSBBWzBdLCBBaiA9IEFbMV0sIEF2ID0gQVsyXSwgcyA9IG51bWVyaWMuY2NzRGltKEEpLCBtID0gc1swXSwgbiA9IHNbMV0sIGksaixqMCxqMSxrO1xuICAgIHZhciBCID0gbnVtZXJpYy5yZXAoW20sbl0sMCk7XG4gICAgZm9yKGk9MDtpPG47aSsrKSB7XG4gICAgICAgIGowID0gQWlbaV07XG4gICAgICAgIGoxID0gQWlbaSsxXTtcbiAgICAgICAgZm9yKGo9ajA7ajxqMTsrK2opIHsgQltBaltqXV1baV0gPSBBdltqXTsgfVxuICAgIH1cbiAgICByZXR1cm4gQjtcbn1cbm51bWVyaWMuY2NzVFNvbHZlID0gZnVuY3Rpb24gY2NzVFNvbHZlKEEsYix4LGJqLHhqKSB7XG4gICAgdmFyIEFpID0gQVswXSwgQWogPSBBWzFdLCBBdiA9IEFbMl0sbSA9IEFpLmxlbmd0aC0xLCBtYXggPSBNYXRoLm1heCxuPTA7XG4gICAgaWYodHlwZW9mIGJqID09PSBcInVuZGVmaW5lZFwiKSB4ID0gbnVtZXJpYy5yZXAoW21dLDApO1xuICAgIGlmKHR5cGVvZiBiaiA9PT0gXCJ1bmRlZmluZWRcIikgYmogPSBudW1lcmljLmxpbnNwYWNlKDAseC5sZW5ndGgtMSk7XG4gICAgaWYodHlwZW9mIHhqID09PSBcInVuZGVmaW5lZFwiKSB4aiA9IFtdO1xuICAgIGZ1bmN0aW9uIGRmcyhqKSB7XG4gICAgICAgIHZhciBrO1xuICAgICAgICBpZih4W2pdICE9PSAwKSByZXR1cm47XG4gICAgICAgIHhbal0gPSAxO1xuICAgICAgICBmb3Ioaz1BaVtqXTtrPEFpW2orMV07KytrKSBkZnMoQWpba10pO1xuICAgICAgICB4altuXSA9IGo7XG4gICAgICAgICsrbjtcbiAgICB9XG4gICAgdmFyIGksaixqMCxqMSxrLGwsbDAsbDEsYTtcbiAgICBmb3IoaT1iai5sZW5ndGgtMTtpIT09LTE7LS1pKSB7IGRmcyhialtpXSk7IH1cbiAgICB4ai5sZW5ndGggPSBuO1xuICAgIGZvcihpPXhqLmxlbmd0aC0xO2khPT0tMTstLWkpIHsgeFt4altpXV0gPSAwOyB9XG4gICAgZm9yKGk9YmoubGVuZ3RoLTE7aSE9PS0xOy0taSkgeyBqID0gYmpbaV07IHhbal0gPSBiW2pdOyB9XG4gICAgZm9yKGk9eGoubGVuZ3RoLTE7aSE9PS0xOy0taSkge1xuICAgICAgICBqID0geGpbaV07XG4gICAgICAgIGowID0gQWlbal07XG4gICAgICAgIGoxID0gbWF4KEFpW2orMV0sajApO1xuICAgICAgICBmb3Ioaz1qMDtrIT09ajE7KytrKSB7IGlmKEFqW2tdID09PSBqKSB7IHhbal0gLz0gQXZba107IGJyZWFrOyB9IH1cbiAgICAgICAgYSA9IHhbal07XG4gICAgICAgIGZvcihrPWowO2shPT1qMTsrK2spIHtcbiAgICAgICAgICAgIGwgPSBBaltrXTtcbiAgICAgICAgICAgIGlmKGwgIT09IGopIHhbbF0gLT0gYSpBdltrXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geDtcbn1cbm51bWVyaWMuY2NzREZTID0gZnVuY3Rpb24gY2NzREZTKG4pIHtcbiAgICB0aGlzLmsgPSBBcnJheShuKTtcbiAgICB0aGlzLmsxID0gQXJyYXkobik7XG4gICAgdGhpcy5qID0gQXJyYXkobik7XG59XG5udW1lcmljLmNjc0RGUy5wcm90b3R5cGUuZGZzID0gZnVuY3Rpb24gZGZzKEosQWksQWoseCx4aixQaW52KSB7XG4gICAgdmFyIG0gPSAwLGZvbyxuPXhqLmxlbmd0aDtcbiAgICB2YXIgayA9IHRoaXMuaywgazEgPSB0aGlzLmsxLCBqID0gdGhpcy5qLGttLGsxMTtcbiAgICBpZih4W0pdIT09MCkgcmV0dXJuO1xuICAgIHhbSl0gPSAxO1xuICAgIGpbMF0gPSBKO1xuICAgIGtbMF0gPSBrbSA9IEFpW0pdO1xuICAgIGsxWzBdID0gazExID0gQWlbSisxXTtcbiAgICB3aGlsZSgxKSB7XG4gICAgICAgIGlmKGttID49IGsxMSkge1xuICAgICAgICAgICAgeGpbbl0gPSBqW21dO1xuICAgICAgICAgICAgaWYobT09PTApIHJldHVybjtcbiAgICAgICAgICAgICsrbjtcbiAgICAgICAgICAgIC0tbTtcbiAgICAgICAgICAgIGttID0ga1ttXTtcbiAgICAgICAgICAgIGsxMSA9IGsxW21dO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9vID0gUGludltBaltrbV1dO1xuICAgICAgICAgICAgaWYoeFtmb29dID09PSAwKSB7XG4gICAgICAgICAgICAgICAgeFtmb29dID0gMTtcbiAgICAgICAgICAgICAgICBrW21dID0ga207XG4gICAgICAgICAgICAgICAgKyttO1xuICAgICAgICAgICAgICAgIGpbbV0gPSBmb287XG4gICAgICAgICAgICAgICAga20gPSBBaVtmb29dO1xuICAgICAgICAgICAgICAgIGsxW21dID0gazExID0gQWlbZm9vKzFdO1xuICAgICAgICAgICAgfSBlbHNlICsra207XG4gICAgICAgIH1cbiAgICB9XG59XG5udW1lcmljLmNjc0xQU29sdmUgPSBmdW5jdGlvbiBjY3NMUFNvbHZlKEEsQix4LHhqLEksUGludixkZnMpIHtcbiAgICB2YXIgQWkgPSBBWzBdLCBBaiA9IEFbMV0sIEF2ID0gQVsyXSxtID0gQWkubGVuZ3RoLTEsIG49MDtcbiAgICB2YXIgQmkgPSBCWzBdLCBCaiA9IEJbMV0sIEJ2ID0gQlsyXTtcbiAgICBcbiAgICB2YXIgaSxpMCxpMSxqLEosajAsajEsayxsLGwwLGwxLGE7XG4gICAgaTAgPSBCaVtJXTtcbiAgICBpMSA9IEJpW0krMV07XG4gICAgeGoubGVuZ3RoID0gMDtcbiAgICBmb3IoaT1pMDtpPGkxOysraSkgeyBkZnMuZGZzKFBpbnZbQmpbaV1dLEFpLEFqLHgseGosUGludik7IH1cbiAgICBmb3IoaT14ai5sZW5ndGgtMTtpIT09LTE7LS1pKSB7IHhbeGpbaV1dID0gMDsgfVxuICAgIGZvcihpPWkwO2khPT1pMTsrK2kpIHsgaiA9IFBpbnZbQmpbaV1dOyB4W2pdID0gQnZbaV07IH1cbiAgICBmb3IoaT14ai5sZW5ndGgtMTtpIT09LTE7LS1pKSB7XG4gICAgICAgIGogPSB4altpXTtcbiAgICAgICAgajAgPSBBaVtqXTtcbiAgICAgICAgajEgPSBBaVtqKzFdO1xuICAgICAgICBmb3Ioaz1qMDtrPGoxOysraykgeyBpZihQaW52W0FqW2tdXSA9PT0gaikgeyB4W2pdIC89IEF2W2tdOyBicmVhazsgfSB9XG4gICAgICAgIGEgPSB4W2pdO1xuICAgICAgICBmb3Ioaz1qMDtrPGoxOysraykge1xuICAgICAgICAgICAgbCA9IFBpbnZbQWpba11dO1xuICAgICAgICAgICAgaWYobCAhPT0gaikgeFtsXSAtPSBhKkF2W2tdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB4O1xufVxubnVtZXJpYy5jY3NMVVAxID0gZnVuY3Rpb24gY2NzTFVQMShBLHRocmVzaG9sZCkge1xuICAgIHZhciBtID0gQVswXS5sZW5ndGgtMTtcbiAgICB2YXIgTCA9IFtudW1lcmljLnJlcChbbSsxXSwwKSxbXSxbXV0sIFUgPSBbbnVtZXJpYy5yZXAoW20rMV0sIDApLFtdLFtdXTtcbiAgICB2YXIgTGkgPSBMWzBdLCBMaiA9IExbMV0sIEx2ID0gTFsyXSwgVWkgPSBVWzBdLCBVaiA9IFVbMV0sIFV2ID0gVVsyXTtcbiAgICB2YXIgeCA9IG51bWVyaWMucmVwKFttXSwwKSwgeGogPSBudW1lcmljLnJlcChbbV0sMCk7XG4gICAgdmFyIGksaixrLGowLGoxLGEsZSxjLGQsSztcbiAgICB2YXIgc29sID0gbnVtZXJpYy5jY3NMUFNvbHZlLCBtYXggPSBNYXRoLm1heCwgYWJzID0gTWF0aC5hYnM7XG4gICAgdmFyIFAgPSBudW1lcmljLmxpbnNwYWNlKDAsbS0xKSxQaW52ID0gbnVtZXJpYy5saW5zcGFjZSgwLG0tMSk7XG4gICAgdmFyIGRmcyA9IG5ldyBudW1lcmljLmNjc0RGUyhtKTtcbiAgICBpZih0eXBlb2YgdGhyZXNob2xkID09PSBcInVuZGVmaW5lZFwiKSB7IHRocmVzaG9sZCA9IDE7IH1cbiAgICBmb3IoaT0wO2k8bTsrK2kpIHtcbiAgICAgICAgc29sKEwsQSx4LHhqLGksUGludixkZnMpO1xuICAgICAgICBhID0gLTE7XG4gICAgICAgIGUgPSAtMTtcbiAgICAgICAgZm9yKGo9eGoubGVuZ3RoLTE7aiE9PS0xOy0taikge1xuICAgICAgICAgICAgayA9IHhqW2pdO1xuICAgICAgICAgICAgaWYoayA8PSBpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGMgPSBhYnMoeFtrXSk7XG4gICAgICAgICAgICBpZihjID4gYSkgeyBlID0gazsgYSA9IGM7IH1cbiAgICAgICAgfVxuICAgICAgICBpZihhYnMoeFtpXSk8dGhyZXNob2xkKmEpIHtcbiAgICAgICAgICAgIGogPSBQW2ldO1xuICAgICAgICAgICAgYSA9IFBbZV07XG4gICAgICAgICAgICBQW2ldID0gYTsgUGludlthXSA9IGk7XG4gICAgICAgICAgICBQW2VdID0gajsgUGludltqXSA9IGU7XG4gICAgICAgICAgICBhID0geFtpXTsgeFtpXSA9IHhbZV07IHhbZV0gPSBhO1xuICAgICAgICB9XG4gICAgICAgIGEgPSBMaVtpXTtcbiAgICAgICAgZSA9IFVpW2ldO1xuICAgICAgICBkID0geFtpXTtcbiAgICAgICAgTGpbYV0gPSBQW2ldO1xuICAgICAgICBMdlthXSA9IDE7XG4gICAgICAgICsrYTtcbiAgICAgICAgZm9yKGo9eGoubGVuZ3RoLTE7aiE9PS0xOy0taikge1xuICAgICAgICAgICAgayA9IHhqW2pdO1xuICAgICAgICAgICAgYyA9IHhba107XG4gICAgICAgICAgICB4altqXSA9IDA7XG4gICAgICAgICAgICB4W2tdID0gMDtcbiAgICAgICAgICAgIGlmKGs8PWkpIHsgVWpbZV0gPSBrOyBVdltlXSA9IGM7ICAgKytlOyB9XG4gICAgICAgICAgICBlbHNlICAgICB7IExqW2FdID0gUFtrXTsgTHZbYV0gPSBjL2Q7ICsrYTsgfVxuICAgICAgICB9XG4gICAgICAgIExpW2krMV0gPSBhO1xuICAgICAgICBVaVtpKzFdID0gZTtcbiAgICB9XG4gICAgZm9yKGo9TGoubGVuZ3RoLTE7aiE9PS0xOy0taikgeyBMaltqXSA9IFBpbnZbTGpbal1dOyB9XG4gICAgcmV0dXJuIHtMOkwsIFU6VSwgUDpQLCBQaW52OlBpbnZ9O1xufVxubnVtZXJpYy5jY3NERlMwID0gZnVuY3Rpb24gY2NzREZTMChuKSB7XG4gICAgdGhpcy5rID0gQXJyYXkobik7XG4gICAgdGhpcy5rMSA9IEFycmF5KG4pO1xuICAgIHRoaXMuaiA9IEFycmF5KG4pO1xufVxubnVtZXJpYy5jY3NERlMwLnByb3RvdHlwZS5kZnMgPSBmdW5jdGlvbiBkZnMoSixBaSxBaix4LHhqLFBpbnYsUCkge1xuICAgIHZhciBtID0gMCxmb28sbj14ai5sZW5ndGg7XG4gICAgdmFyIGsgPSB0aGlzLmssIGsxID0gdGhpcy5rMSwgaiA9IHRoaXMuaixrbSxrMTE7XG4gICAgaWYoeFtKXSE9PTApIHJldHVybjtcbiAgICB4W0pdID0gMTtcbiAgICBqWzBdID0gSjtcbiAgICBrWzBdID0ga20gPSBBaVtQaW52W0pdXTtcbiAgICBrMVswXSA9IGsxMSA9IEFpW1BpbnZbSl0rMV07XG4gICAgd2hpbGUoMSkge1xuICAgICAgICBpZihpc05hTihrbSkpIHRocm93IG5ldyBFcnJvcihcIk93IVwiKTtcbiAgICAgICAgaWYoa20gPj0gazExKSB7XG4gICAgICAgICAgICB4altuXSA9IFBpbnZbalttXV07XG4gICAgICAgICAgICBpZihtPT09MCkgcmV0dXJuO1xuICAgICAgICAgICAgKytuO1xuICAgICAgICAgICAgLS1tO1xuICAgICAgICAgICAga20gPSBrW21dO1xuICAgICAgICAgICAgazExID0gazFbbV07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb28gPSBBaltrbV07XG4gICAgICAgICAgICBpZih4W2Zvb10gPT09IDApIHtcbiAgICAgICAgICAgICAgICB4W2Zvb10gPSAxO1xuICAgICAgICAgICAgICAgIGtbbV0gPSBrbTtcbiAgICAgICAgICAgICAgICArK207XG4gICAgICAgICAgICAgICAgalttXSA9IGZvbztcbiAgICAgICAgICAgICAgICBmb28gPSBQaW52W2Zvb107XG4gICAgICAgICAgICAgICAga20gPSBBaVtmb29dO1xuICAgICAgICAgICAgICAgIGsxW21dID0gazExID0gQWlbZm9vKzFdO1xuICAgICAgICAgICAgfSBlbHNlICsra207XG4gICAgICAgIH1cbiAgICB9XG59XG5udW1lcmljLmNjc0xQU29sdmUwID0gZnVuY3Rpb24gY2NzTFBTb2x2ZTAoQSxCLHkseGosSSxQaW52LFAsZGZzKSB7XG4gICAgdmFyIEFpID0gQVswXSwgQWogPSBBWzFdLCBBdiA9IEFbMl0sbSA9IEFpLmxlbmd0aC0xLCBuPTA7XG4gICAgdmFyIEJpID0gQlswXSwgQmogPSBCWzFdLCBCdiA9IEJbMl07XG4gICAgXG4gICAgdmFyIGksaTAsaTEsaixKLGowLGoxLGssbCxsMCxsMSxhO1xuICAgIGkwID0gQmlbSV07XG4gICAgaTEgPSBCaVtJKzFdO1xuICAgIHhqLmxlbmd0aCA9IDA7XG4gICAgZm9yKGk9aTA7aTxpMTsrK2kpIHsgZGZzLmRmcyhCaltpXSxBaSxBaix5LHhqLFBpbnYsUCk7IH1cbiAgICBmb3IoaT14ai5sZW5ndGgtMTtpIT09LTE7LS1pKSB7IGogPSB4altpXTsgeVtQW2pdXSA9IDA7IH1cbiAgICBmb3IoaT1pMDtpIT09aTE7KytpKSB7IGogPSBCaltpXTsgeVtqXSA9IEJ2W2ldOyB9XG4gICAgZm9yKGk9eGoubGVuZ3RoLTE7aSE9PS0xOy0taSkge1xuICAgICAgICBqID0geGpbaV07XG4gICAgICAgIGwgPSBQW2pdO1xuICAgICAgICBqMCA9IEFpW2pdO1xuICAgICAgICBqMSA9IEFpW2orMV07XG4gICAgICAgIGZvcihrPWowO2s8ajE7KytrKSB7IGlmKEFqW2tdID09PSBsKSB7IHlbbF0gLz0gQXZba107IGJyZWFrOyB9IH1cbiAgICAgICAgYSA9IHlbbF07XG4gICAgICAgIGZvcihrPWowO2s8ajE7KytrKSB5W0FqW2tdXSAtPSBhKkF2W2tdO1xuICAgICAgICB5W2xdID0gYTtcbiAgICB9XG59XG5udW1lcmljLmNjc0xVUDAgPSBmdW5jdGlvbiBjY3NMVVAwKEEsdGhyZXNob2xkKSB7XG4gICAgdmFyIG0gPSBBWzBdLmxlbmd0aC0xO1xuICAgIHZhciBMID0gW251bWVyaWMucmVwKFttKzFdLDApLFtdLFtdXSwgVSA9IFtudW1lcmljLnJlcChbbSsxXSwgMCksW10sW11dO1xuICAgIHZhciBMaSA9IExbMF0sIExqID0gTFsxXSwgTHYgPSBMWzJdLCBVaSA9IFVbMF0sIFVqID0gVVsxXSwgVXYgPSBVWzJdO1xuICAgIHZhciB5ID0gbnVtZXJpYy5yZXAoW21dLDApLCB4aiA9IG51bWVyaWMucmVwKFttXSwwKTtcbiAgICB2YXIgaSxqLGssajAsajEsYSxlLGMsZCxLO1xuICAgIHZhciBzb2wgPSBudW1lcmljLmNjc0xQU29sdmUwLCBtYXggPSBNYXRoLm1heCwgYWJzID0gTWF0aC5hYnM7XG4gICAgdmFyIFAgPSBudW1lcmljLmxpbnNwYWNlKDAsbS0xKSxQaW52ID0gbnVtZXJpYy5saW5zcGFjZSgwLG0tMSk7XG4gICAgdmFyIGRmcyA9IG5ldyBudW1lcmljLmNjc0RGUzAobSk7XG4gICAgaWYodHlwZW9mIHRocmVzaG9sZCA9PT0gXCJ1bmRlZmluZWRcIikgeyB0aHJlc2hvbGQgPSAxOyB9XG4gICAgZm9yKGk9MDtpPG07KytpKSB7XG4gICAgICAgIHNvbChMLEEseSx4aixpLFBpbnYsUCxkZnMpO1xuICAgICAgICBhID0gLTE7XG4gICAgICAgIGUgPSAtMTtcbiAgICAgICAgZm9yKGo9eGoubGVuZ3RoLTE7aiE9PS0xOy0taikge1xuICAgICAgICAgICAgayA9IHhqW2pdO1xuICAgICAgICAgICAgaWYoayA8PSBpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGMgPSBhYnMoeVtQW2tdXSk7XG4gICAgICAgICAgICBpZihjID4gYSkgeyBlID0gazsgYSA9IGM7IH1cbiAgICAgICAgfVxuICAgICAgICBpZihhYnMoeVtQW2ldXSk8dGhyZXNob2xkKmEpIHtcbiAgICAgICAgICAgIGogPSBQW2ldO1xuICAgICAgICAgICAgYSA9IFBbZV07XG4gICAgICAgICAgICBQW2ldID0gYTsgUGludlthXSA9IGk7XG4gICAgICAgICAgICBQW2VdID0gajsgUGludltqXSA9IGU7XG4gICAgICAgIH1cbiAgICAgICAgYSA9IExpW2ldO1xuICAgICAgICBlID0gVWlbaV07XG4gICAgICAgIGQgPSB5W1BbaV1dO1xuICAgICAgICBMalthXSA9IFBbaV07XG4gICAgICAgIEx2W2FdID0gMTtcbiAgICAgICAgKythO1xuICAgICAgICBmb3Ioaj14ai5sZW5ndGgtMTtqIT09LTE7LS1qKSB7XG4gICAgICAgICAgICBrID0geGpbal07XG4gICAgICAgICAgICBjID0geVtQW2tdXTtcbiAgICAgICAgICAgIHhqW2pdID0gMDtcbiAgICAgICAgICAgIHlbUFtrXV0gPSAwO1xuICAgICAgICAgICAgaWYoazw9aSkgeyBValtlXSA9IGs7IFV2W2VdID0gYzsgICArK2U7IH1cbiAgICAgICAgICAgIGVsc2UgICAgIHsgTGpbYV0gPSBQW2tdOyBMdlthXSA9IGMvZDsgKythOyB9XG4gICAgICAgIH1cbiAgICAgICAgTGlbaSsxXSA9IGE7XG4gICAgICAgIFVpW2krMV0gPSBlO1xuICAgIH1cbiAgICBmb3Ioaj1Mai5sZW5ndGgtMTtqIT09LTE7LS1qKSB7IExqW2pdID0gUGludltMaltqXV07IH1cbiAgICByZXR1cm4ge0w6TCwgVTpVLCBQOlAsIFBpbnY6UGludn07XG59XG5udW1lcmljLmNjc0xVUCA9IG51bWVyaWMuY2NzTFVQMDtcblxubnVtZXJpYy5jY3NEaW0gPSBmdW5jdGlvbiBjY3NEaW0oQSkgeyByZXR1cm4gW251bWVyaWMuc3VwKEFbMV0pKzEsQVswXS5sZW5ndGgtMV07IH1cbm51bWVyaWMuY2NzR2V0QmxvY2sgPSBmdW5jdGlvbiBjY3NHZXRCbG9jayhBLGksaikge1xuICAgIHZhciBzID0gbnVtZXJpYy5jY3NEaW0oQSksbT1zWzBdLG49c1sxXTtcbiAgICBpZih0eXBlb2YgaSA9PT0gXCJ1bmRlZmluZWRcIikgeyBpID0gbnVtZXJpYy5saW5zcGFjZSgwLG0tMSk7IH1cbiAgICBlbHNlIGlmKHR5cGVvZiBpID09PSBcIm51bWJlclwiKSB7IGkgPSBbaV07IH1cbiAgICBpZih0eXBlb2YgaiA9PT0gXCJ1bmRlZmluZWRcIikgeyBqID0gbnVtZXJpYy5saW5zcGFjZSgwLG4tMSk7IH1cbiAgICBlbHNlIGlmKHR5cGVvZiBqID09PSBcIm51bWJlclwiKSB7IGogPSBbal07IH1cbiAgICB2YXIgcCxwMCxwMSxQID0gaS5sZW5ndGgscSxRID0gai5sZW5ndGgscixqcSxpcDtcbiAgICB2YXIgQmkgPSBudW1lcmljLnJlcChbbl0sMCksIEJqPVtdLCBCdj1bXSwgQiA9IFtCaSxCaixCdl07XG4gICAgdmFyIEFpID0gQVswXSwgQWogPSBBWzFdLCBBdiA9IEFbMl07XG4gICAgdmFyIHggPSBudW1lcmljLnJlcChbbV0sMCksY291bnQ9MCxmbGFncyA9IG51bWVyaWMucmVwKFttXSwwKTtcbiAgICBmb3IocT0wO3E8UTsrK3EpIHtcbiAgICAgICAganEgPSBqW3FdO1xuICAgICAgICB2YXIgcTAgPSBBaVtqcV07XG4gICAgICAgIHZhciBxMSA9IEFpW2pxKzFdO1xuICAgICAgICBmb3IocD1xMDtwPHExOysrcCkge1xuICAgICAgICAgICAgciA9IEFqW3BdO1xuICAgICAgICAgICAgZmxhZ3Nbcl0gPSAxO1xuICAgICAgICAgICAgeFtyXSA9IEF2W3BdO1xuICAgICAgICB9XG4gICAgICAgIGZvcihwPTA7cDxQOysrcCkge1xuICAgICAgICAgICAgaXAgPSBpW3BdO1xuICAgICAgICAgICAgaWYoZmxhZ3NbaXBdKSB7XG4gICAgICAgICAgICAgICAgQmpbY291bnRdID0gcDtcbiAgICAgICAgICAgICAgICBCdltjb3VudF0gPSB4W2lbcF1dO1xuICAgICAgICAgICAgICAgICsrY291bnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yKHA9cTA7cDxxMTsrK3ApIHtcbiAgICAgICAgICAgIHIgPSBBaltwXTtcbiAgICAgICAgICAgIGZsYWdzW3JdID0gMDtcbiAgICAgICAgfVxuICAgICAgICBCaVtxKzFdID0gY291bnQ7XG4gICAgfVxuICAgIHJldHVybiBCO1xufVxuXG5udW1lcmljLmNjc0RvdCA9IGZ1bmN0aW9uIGNjc0RvdChBLEIpIHtcbiAgICB2YXIgQWkgPSBBWzBdLCBBaiA9IEFbMV0sIEF2ID0gQVsyXTtcbiAgICB2YXIgQmkgPSBCWzBdLCBCaiA9IEJbMV0sIEJ2ID0gQlsyXTtcbiAgICB2YXIgc0EgPSBudW1lcmljLmNjc0RpbShBKSwgc0IgPSBudW1lcmljLmNjc0RpbShCKTtcbiAgICB2YXIgbSA9IHNBWzBdLCBuID0gc0FbMV0sIG8gPSBzQlsxXTtcbiAgICB2YXIgeCA9IG51bWVyaWMucmVwKFttXSwwKSwgZmxhZ3MgPSBudW1lcmljLnJlcChbbV0sMCksIHhqID0gQXJyYXkobSk7XG4gICAgdmFyIENpID0gbnVtZXJpYy5yZXAoW29dLDApLCBDaiA9IFtdLCBDdiA9IFtdLCBDID0gW0NpLENqLEN2XTtcbiAgICB2YXIgaSxqLGssajAsajEsaTAsaTEsbCxwLGEsYjtcbiAgICBmb3Ioaz0wO2shPT1vOysraykge1xuICAgICAgICBqMCA9IEJpW2tdO1xuICAgICAgICBqMSA9IEJpW2srMV07XG4gICAgICAgIHAgPSAwO1xuICAgICAgICBmb3Ioaj1qMDtqPGoxOysraikge1xuICAgICAgICAgICAgYSA9IEJqW2pdO1xuICAgICAgICAgICAgYiA9IEJ2W2pdO1xuICAgICAgICAgICAgaTAgPSBBaVthXTtcbiAgICAgICAgICAgIGkxID0gQWlbYSsxXTtcbiAgICAgICAgICAgIGZvcihpPWkwO2k8aTE7KytpKSB7XG4gICAgICAgICAgICAgICAgbCA9IEFqW2ldO1xuICAgICAgICAgICAgICAgIGlmKGZsYWdzW2xdPT09MCkge1xuICAgICAgICAgICAgICAgICAgICB4altwXSA9IGw7XG4gICAgICAgICAgICAgICAgICAgIGZsYWdzW2xdID0gMTtcbiAgICAgICAgICAgICAgICAgICAgcCA9IHArMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgeFtsXSA9IHhbbF0gKyBBdltpXSpiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGowID0gQ2lba107XG4gICAgICAgIGoxID0gajArcDtcbiAgICAgICAgQ2lbaysxXSA9IGoxO1xuICAgICAgICBmb3Ioaj1wLTE7aiE9PS0xOy0taikge1xuICAgICAgICAgICAgYiA9IGowK2o7XG4gICAgICAgICAgICBpID0geGpbal07XG4gICAgICAgICAgICBDaltiXSA9IGk7XG4gICAgICAgICAgICBDdltiXSA9IHhbaV07XG4gICAgICAgICAgICBmbGFnc1tpXSA9IDA7XG4gICAgICAgICAgICB4W2ldID0gMDtcbiAgICAgICAgfVxuICAgICAgICBDaVtrKzFdID0gQ2lba10rcDtcbiAgICB9XG4gICAgcmV0dXJuIEM7XG59XG5cbm51bWVyaWMuY2NzTFVQU29sdmUgPSBmdW5jdGlvbiBjY3NMVVBTb2x2ZShMVVAsQikge1xuICAgIHZhciBMID0gTFVQLkwsIFUgPSBMVVAuVSwgUCA9IExVUC5QO1xuICAgIHZhciBCaSA9IEJbMF07XG4gICAgdmFyIGZsYWcgPSBmYWxzZTtcbiAgICBpZih0eXBlb2YgQmkgIT09IFwib2JqZWN0XCIpIHsgQiA9IFtbMCxCLmxlbmd0aF0sbnVtZXJpYy5saW5zcGFjZSgwLEIubGVuZ3RoLTEpLEJdOyBCaSA9IEJbMF07IGZsYWcgPSB0cnVlOyB9XG4gICAgdmFyIEJqID0gQlsxXSwgQnYgPSBCWzJdO1xuICAgIHZhciBuID0gTFswXS5sZW5ndGgtMSwgbSA9IEJpLmxlbmd0aC0xO1xuICAgIHZhciB4ID0gbnVtZXJpYy5yZXAoW25dLDApLCB4aiA9IEFycmF5KG4pO1xuICAgIHZhciBiID0gbnVtZXJpYy5yZXAoW25dLDApLCBiaiA9IEFycmF5KG4pO1xuICAgIHZhciBYaSA9IG51bWVyaWMucmVwKFttKzFdLDApLCBYaiA9IFtdLCBYdiA9IFtdO1xuICAgIHZhciBzb2wgPSBudW1lcmljLmNjc1RTb2x2ZTtcbiAgICB2YXIgaSxqLGowLGoxLGssSixOPTA7XG4gICAgZm9yKGk9MDtpPG07KytpKSB7XG4gICAgICAgIGsgPSAwO1xuICAgICAgICBqMCA9IEJpW2ldO1xuICAgICAgICBqMSA9IEJpW2krMV07XG4gICAgICAgIGZvcihqPWowO2o8ajE7KytqKSB7IFxuICAgICAgICAgICAgSiA9IExVUC5QaW52W0JqW2pdXTtcbiAgICAgICAgICAgIGJqW2tdID0gSjtcbiAgICAgICAgICAgIGJbSl0gPSBCdltqXTtcbiAgICAgICAgICAgICsraztcbiAgICAgICAgfVxuICAgICAgICBiai5sZW5ndGggPSBrO1xuICAgICAgICBzb2woTCxiLHgsYmoseGopO1xuICAgICAgICBmb3Ioaj1iai5sZW5ndGgtMTtqIT09LTE7LS1qKSBiW2JqW2pdXSA9IDA7XG4gICAgICAgIHNvbChVLHgsYix4aixiaik7XG4gICAgICAgIGlmKGZsYWcpIHJldHVybiBiO1xuICAgICAgICBmb3Ioaj14ai5sZW5ndGgtMTtqIT09LTE7LS1qKSB4W3hqW2pdXSA9IDA7XG4gICAgICAgIGZvcihqPWJqLmxlbmd0aC0xO2ohPT0tMTstLWopIHtcbiAgICAgICAgICAgIEogPSBialtqXTtcbiAgICAgICAgICAgIFhqW05dID0gSjtcbiAgICAgICAgICAgIFh2W05dID0gYltKXTtcbiAgICAgICAgICAgIGJbSl0gPSAwO1xuICAgICAgICAgICAgKytOO1xuICAgICAgICB9XG4gICAgICAgIFhpW2krMV0gPSBOO1xuICAgIH1cbiAgICByZXR1cm4gW1hpLFhqLFh2XTtcbn1cblxubnVtZXJpYy5jY3NiaW5vcCA9IGZ1bmN0aW9uIGNjc2Jpbm9wKGJvZHksc2V0dXApIHtcbiAgICBpZih0eXBlb2Ygc2V0dXAgPT09IFwidW5kZWZpbmVkXCIpIHNldHVwPScnO1xuICAgIHJldHVybiBGdW5jdGlvbignWCcsJ1knLFxuICAgICAgICAgICAgJ3ZhciBYaSA9IFhbMF0sIFhqID0gWFsxXSwgWHYgPSBYWzJdO1xcbicrXG4gICAgICAgICAgICAndmFyIFlpID0gWVswXSwgWWogPSBZWzFdLCBZdiA9IFlbMl07XFxuJytcbiAgICAgICAgICAgICd2YXIgbiA9IFhpLmxlbmd0aC0xLG0gPSBNYXRoLm1heChudW1lcmljLnN1cChYaiksbnVtZXJpYy5zdXAoWWopKSsxO1xcbicrXG4gICAgICAgICAgICAndmFyIFppID0gbnVtZXJpYy5yZXAoW24rMV0sMCksIFpqID0gW10sIFp2ID0gW107XFxuJytcbiAgICAgICAgICAgICd2YXIgeCA9IG51bWVyaWMucmVwKFttXSwwKSx5ID0gbnVtZXJpYy5yZXAoW21dLDApO1xcbicrXG4gICAgICAgICAgICAndmFyIHhrLHlrLHprO1xcbicrXG4gICAgICAgICAgICAndmFyIGksaixqMCxqMSxrLHA9MDtcXG4nK1xuICAgICAgICAgICAgc2V0dXArXG4gICAgICAgICAgICAnZm9yKGk9MDtpPG47KytpKSB7XFxuJytcbiAgICAgICAgICAgICcgIGowID0gWGlbaV07IGoxID0gWGlbaSsxXTtcXG4nK1xuICAgICAgICAgICAgJyAgZm9yKGo9ajA7aiE9PWoxOysraikge1xcbicrXG4gICAgICAgICAgICAnICAgIGsgPSBYaltqXTtcXG4nK1xuICAgICAgICAgICAgJyAgICB4W2tdID0gMTtcXG4nK1xuICAgICAgICAgICAgJyAgICBaaltwXSA9IGs7XFxuJytcbiAgICAgICAgICAgICcgICAgKytwO1xcbicrXG4gICAgICAgICAgICAnICB9XFxuJytcbiAgICAgICAgICAgICcgIGowID0gWWlbaV07IGoxID0gWWlbaSsxXTtcXG4nK1xuICAgICAgICAgICAgJyAgZm9yKGo9ajA7aiE9PWoxOysraikge1xcbicrXG4gICAgICAgICAgICAnICAgIGsgPSBZaltqXTtcXG4nK1xuICAgICAgICAgICAgJyAgICB5W2tdID0gWXZbal07XFxuJytcbiAgICAgICAgICAgICcgICAgaWYoeFtrXSA9PT0gMCkge1xcbicrXG4gICAgICAgICAgICAnICAgICAgWmpbcF0gPSBrO1xcbicrXG4gICAgICAgICAgICAnICAgICAgKytwO1xcbicrXG4gICAgICAgICAgICAnICAgIH1cXG4nK1xuICAgICAgICAgICAgJyAgfVxcbicrXG4gICAgICAgICAgICAnICBaaVtpKzFdID0gcDtcXG4nK1xuICAgICAgICAgICAgJyAgajAgPSBYaVtpXTsgajEgPSBYaVtpKzFdO1xcbicrXG4gICAgICAgICAgICAnICBmb3Ioaj1qMDtqIT09ajE7KytqKSB4W1hqW2pdXSA9IFh2W2pdO1xcbicrXG4gICAgICAgICAgICAnICBqMCA9IFppW2ldOyBqMSA9IFppW2krMV07XFxuJytcbiAgICAgICAgICAgICcgIGZvcihqPWowO2ohPT1qMTsrK2opIHtcXG4nK1xuICAgICAgICAgICAgJyAgICBrID0gWmpbal07XFxuJytcbiAgICAgICAgICAgICcgICAgeGsgPSB4W2tdO1xcbicrXG4gICAgICAgICAgICAnICAgIHlrID0geVtrXTtcXG4nK1xuICAgICAgICAgICAgYm9keSsnXFxuJytcbiAgICAgICAgICAgICcgICAgWnZbal0gPSB6aztcXG4nK1xuICAgICAgICAgICAgJyAgfVxcbicrXG4gICAgICAgICAgICAnICBqMCA9IFhpW2ldOyBqMSA9IFhpW2krMV07XFxuJytcbiAgICAgICAgICAgICcgIGZvcihqPWowO2ohPT1qMTsrK2opIHhbWGpbal1dID0gMDtcXG4nK1xuICAgICAgICAgICAgJyAgajAgPSBZaVtpXTsgajEgPSBZaVtpKzFdO1xcbicrXG4gICAgICAgICAgICAnICBmb3Ioaj1qMDtqIT09ajE7KytqKSB5W1lqW2pdXSA9IDA7XFxuJytcbiAgICAgICAgICAgICd9XFxuJytcbiAgICAgICAgICAgICdyZXR1cm4gW1ppLFpqLFp2XTsnXG4gICAgICAgICAgICApO1xufTtcblxuKGZ1bmN0aW9uKCkge1xuICAgIHZhciBrLEEsQixDO1xuICAgIGZvcihrIGluIG51bWVyaWMub3BzMikge1xuICAgICAgICBpZihpc0Zpbml0ZShldmFsKCcxJytudW1lcmljLm9wczJba10rJzAnKSkpIEEgPSAnW1lbMF0sWVsxXSxudW1lcmljLicraysnKFgsWVsyXSldJztcbiAgICAgICAgZWxzZSBBID0gJ05hTic7XG4gICAgICAgIGlmKGlzRmluaXRlKGV2YWwoJzAnK251bWVyaWMub3BzMltrXSsnMScpKSkgQiA9ICdbWFswXSxYWzFdLG51bWVyaWMuJytrKycoWFsyXSxZKV0nO1xuICAgICAgICBlbHNlIEIgPSAnTmFOJztcbiAgICAgICAgaWYoaXNGaW5pdGUoZXZhbCgnMScrbnVtZXJpYy5vcHMyW2tdKycwJykpICYmIGlzRmluaXRlKGV2YWwoJzAnK251bWVyaWMub3BzMltrXSsnMScpKSkgQyA9ICdudW1lcmljLmNjcycraysnTU0oWCxZKSc7XG4gICAgICAgIGVsc2UgQyA9ICdOYU4nO1xuICAgICAgICBudW1lcmljWydjY3MnK2srJ01NJ10gPSBudW1lcmljLmNjc2Jpbm9wKCd6ayA9IHhrICcrbnVtZXJpYy5vcHMyW2tdKyd5azsnKTtcbiAgICAgICAgbnVtZXJpY1snY2NzJytrXSA9IEZ1bmN0aW9uKCdYJywnWScsXG4gICAgICAgICAgICAgICAgJ2lmKHR5cGVvZiBYID09PSBcIm51bWJlclwiKSByZXR1cm4gJytBKyc7XFxuJytcbiAgICAgICAgICAgICAgICAnaWYodHlwZW9mIFkgPT09IFwibnVtYmVyXCIpIHJldHVybiAnK0IrJztcXG4nK1xuICAgICAgICAgICAgICAgICdyZXR1cm4gJytDKyc7XFxuJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgfVxufSgpKTtcblxubnVtZXJpYy5jY3NTY2F0dGVyID0gZnVuY3Rpb24gY2NzU2NhdHRlcihBKSB7XG4gICAgdmFyIEFpID0gQVswXSwgQWogPSBBWzFdLCBBdiA9IEFbMl07XG4gICAgdmFyIG4gPSBudW1lcmljLnN1cChBaikrMSxtPUFpLmxlbmd0aDtcbiAgICB2YXIgUmkgPSBudW1lcmljLnJlcChbbl0sMCksUmo9QXJyYXkobSksIFJ2ID0gQXJyYXkobSk7XG4gICAgdmFyIGNvdW50cyA9IG51bWVyaWMucmVwKFtuXSwwKSxpO1xuICAgIGZvcihpPTA7aTxtOysraSkgY291bnRzW0FqW2ldXSsrO1xuICAgIGZvcihpPTA7aTxuOysraSkgUmlbaSsxXSA9IFJpW2ldICsgY291bnRzW2ldO1xuICAgIHZhciBwdHIgPSBSaS5zbGljZSgwKSxrLEFpaTtcbiAgICBmb3IoaT0wO2k8bTsrK2kpIHtcbiAgICAgICAgQWlpID0gQWpbaV07XG4gICAgICAgIGsgPSBwdHJbQWlpXTtcbiAgICAgICAgUmpba10gPSBBaVtpXTtcbiAgICAgICAgUnZba10gPSBBdltpXTtcbiAgICAgICAgcHRyW0FpaV09cHRyW0FpaV0rMTtcbiAgICB9XG4gICAgcmV0dXJuIFtSaSxSaixSdl07XG59XG5cbm51bWVyaWMuY2NzR2F0aGVyID0gZnVuY3Rpb24gY2NzR2F0aGVyKEEpIHtcbiAgICB2YXIgQWkgPSBBWzBdLCBBaiA9IEFbMV0sIEF2ID0gQVsyXTtcbiAgICB2YXIgbiA9IEFpLmxlbmd0aC0xLG0gPSBBai5sZW5ndGg7XG4gICAgdmFyIFJpID0gQXJyYXkobSksIFJqID0gQXJyYXkobSksIFJ2ID0gQXJyYXkobSk7XG4gICAgdmFyIGksaixqMCxqMSxwO1xuICAgIHA9MDtcbiAgICBmb3IoaT0wO2k8bjsrK2kpIHtcbiAgICAgICAgajAgPSBBaVtpXTtcbiAgICAgICAgajEgPSBBaVtpKzFdO1xuICAgICAgICBmb3Ioaj1qMDtqIT09ajE7KytqKSB7XG4gICAgICAgICAgICBSaltwXSA9IGk7XG4gICAgICAgICAgICBSaVtwXSA9IEFqW2pdO1xuICAgICAgICAgICAgUnZbcF0gPSBBdltqXTtcbiAgICAgICAgICAgICsrcDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW1JpLFJqLFJ2XTtcbn1cblxuLy8gVGhlIGZvbGxvd2luZyBzcGFyc2UgbGluZWFyIGFsZ2VicmEgcm91dGluZXMgYXJlIGRlcHJlY2F0ZWQuXG5cbm51bWVyaWMuc2RpbSA9IGZ1bmN0aW9uIGRpbShBLHJldCxrKSB7XG4gICAgaWYodHlwZW9mIHJldCA9PT0gXCJ1bmRlZmluZWRcIikgeyByZXQgPSBbXTsgfVxuICAgIGlmKHR5cGVvZiBBICE9PSBcIm9iamVjdFwiKSByZXR1cm4gcmV0O1xuICAgIGlmKHR5cGVvZiBrID09PSBcInVuZGVmaW5lZFwiKSB7IGs9MDsgfVxuICAgIGlmKCEoayBpbiByZXQpKSB7IHJldFtrXSA9IDA7IH1cbiAgICBpZihBLmxlbmd0aCA+IHJldFtrXSkgcmV0W2tdID0gQS5sZW5ndGg7XG4gICAgdmFyIGk7XG4gICAgZm9yKGkgaW4gQSkge1xuICAgICAgICBpZihBLmhhc093blByb3BlcnR5KGkpKSBkaW0oQVtpXSxyZXQsaysxKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn07XG5cbm51bWVyaWMuc2Nsb25lID0gZnVuY3Rpb24gY2xvbmUoQSxrLG4pIHtcbiAgICBpZih0eXBlb2YgayA9PT0gXCJ1bmRlZmluZWRcIikgeyBrPTA7IH1cbiAgICBpZih0eXBlb2YgbiA9PT0gXCJ1bmRlZmluZWRcIikgeyBuID0gbnVtZXJpYy5zZGltKEEpLmxlbmd0aDsgfVxuICAgIHZhciBpLHJldCA9IEFycmF5KEEubGVuZ3RoKTtcbiAgICBpZihrID09PSBuLTEpIHtcbiAgICAgICAgZm9yKGkgaW4gQSkgeyBpZihBLmhhc093blByb3BlcnR5KGkpKSByZXRbaV0gPSBBW2ldOyB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGZvcihpIGluIEEpIHtcbiAgICAgICAgaWYoQS5oYXNPd25Qcm9wZXJ0eShpKSkgcmV0W2ldID0gY2xvbmUoQVtpXSxrKzEsbik7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59XG5cbm51bWVyaWMuc2RpYWcgPSBmdW5jdGlvbiBkaWFnKGQpIHtcbiAgICB2YXIgbiA9IGQubGVuZ3RoLGkscmV0ID0gQXJyYXkobiksaTEsaTIsaTM7XG4gICAgZm9yKGk9bi0xO2k+PTE7aS09Mikge1xuICAgICAgICBpMSA9IGktMTtcbiAgICAgICAgcmV0W2ldID0gW107IHJldFtpXVtpXSA9IGRbaV07XG4gICAgICAgIHJldFtpMV0gPSBbXTsgcmV0W2kxXVtpMV0gPSBkW2kxXTtcbiAgICB9XG4gICAgaWYoaT09PTApIHsgcmV0WzBdID0gW107IHJldFswXVswXSA9IGRbaV07IH1cbiAgICByZXR1cm4gcmV0O1xufVxuXG5udW1lcmljLnNpZGVudGl0eSA9IGZ1bmN0aW9uIGlkZW50aXR5KG4pIHsgcmV0dXJuIG51bWVyaWMuc2RpYWcobnVtZXJpYy5yZXAoW25dLDEpKTsgfVxuXG5udW1lcmljLnN0cmFuc3Bvc2UgPSBmdW5jdGlvbiB0cmFuc3Bvc2UoQSkge1xuICAgIHZhciByZXQgPSBbXSwgbiA9IEEubGVuZ3RoLCBpLGosQWk7XG4gICAgZm9yKGkgaW4gQSkge1xuICAgICAgICBpZighKEEuaGFzT3duUHJvcGVydHkoaSkpKSBjb250aW51ZTtcbiAgICAgICAgQWkgPSBBW2ldO1xuICAgICAgICBmb3IoaiBpbiBBaSkge1xuICAgICAgICAgICAgaWYoIShBaS5oYXNPd25Qcm9wZXJ0eShqKSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYodHlwZW9mIHJldFtqXSAhPT0gXCJvYmplY3RcIikgeyByZXRbal0gPSBbXTsgfVxuICAgICAgICAgICAgcmV0W2pdW2ldID0gQWlbal07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cblxubnVtZXJpYy5zTFVQID0gZnVuY3Rpb24gTFVQKEEsdG9sKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGZ1bmN0aW9uIG51bWVyaWMuc0xVUCBoYWQgYSBidWcgaW4gaXQgYW5kIGhhcyBiZWVuIHJlbW92ZWQuIFBsZWFzZSB1c2UgdGhlIG5ldyBudW1lcmljLmNjc0xVUCBmdW5jdGlvbiBpbnN0ZWFkLlwiKTtcbn07XG5cbm51bWVyaWMuc2RvdE1NID0gZnVuY3Rpb24gZG90TU0oQSxCKSB7XG4gICAgdmFyIHAgPSBBLmxlbmd0aCwgcSA9IEIubGVuZ3RoLCBCVCA9IG51bWVyaWMuc3RyYW5zcG9zZShCKSwgciA9IEJULmxlbmd0aCwgQWksIEJUaztcbiAgICB2YXIgaSxqLGssYWNjdW07XG4gICAgdmFyIHJldCA9IEFycmF5KHApLHJldGk7XG4gICAgZm9yKGk9cC0xO2k+PTA7aS0tKSB7XG4gICAgICAgIHJldGkgPSBbXTtcbiAgICAgICAgQWkgPSBBW2ldO1xuICAgICAgICBmb3Ioaz1yLTE7az49MDtrLS0pIHtcbiAgICAgICAgICAgIGFjY3VtID0gMDtcbiAgICAgICAgICAgIEJUayA9IEJUW2tdO1xuICAgICAgICAgICAgZm9yKGogaW4gQWkpIHtcbiAgICAgICAgICAgICAgICBpZighKEFpLmhhc093blByb3BlcnR5KGopKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYoaiBpbiBCVGspIHsgYWNjdW0gKz0gQWlbal0qQlRrW2pdOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZihhY2N1bSkgcmV0aVtrXSA9IGFjY3VtO1xuICAgICAgICB9XG4gICAgICAgIHJldFtpXSA9IHJldGk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG59XG5cbm51bWVyaWMuc2RvdE1WID0gZnVuY3Rpb24gZG90TVYoQSx4KSB7XG4gICAgdmFyIHAgPSBBLmxlbmd0aCwgQWksIGksajtcbiAgICB2YXIgcmV0ID0gQXJyYXkocCksIGFjY3VtO1xuICAgIGZvcihpPXAtMTtpPj0wO2ktLSkge1xuICAgICAgICBBaSA9IEFbaV07XG4gICAgICAgIGFjY3VtID0gMDtcbiAgICAgICAgZm9yKGogaW4gQWkpIHtcbiAgICAgICAgICAgIGlmKCEoQWkuaGFzT3duUHJvcGVydHkoaikpKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmKHhbal0pIGFjY3VtICs9IEFpW2pdKnhbal07XG4gICAgICAgIH1cbiAgICAgICAgaWYoYWNjdW0pIHJldFtpXSA9IGFjY3VtO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufVxuXG5udW1lcmljLnNkb3RWTSA9IGZ1bmN0aW9uIGRvdE1WKHgsQSkge1xuICAgIHZhciBpLGosQWksYWxwaGE7XG4gICAgdmFyIHJldCA9IFtdLCBhY2N1bTtcbiAgICBmb3IoaSBpbiB4KSB7XG4gICAgICAgIGlmKCF4Lmhhc093blByb3BlcnR5KGkpKSBjb250aW51ZTtcbiAgICAgICAgQWkgPSBBW2ldO1xuICAgICAgICBhbHBoYSA9IHhbaV07XG4gICAgICAgIGZvcihqIGluIEFpKSB7XG4gICAgICAgICAgICBpZighQWkuaGFzT3duUHJvcGVydHkoaikpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYoIXJldFtqXSkgeyByZXRbal0gPSAwOyB9XG4gICAgICAgICAgICByZXRbal0gKz0gYWxwaGEqQWlbal07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cblxubnVtZXJpYy5zZG90VlYgPSBmdW5jdGlvbiBkb3RWVih4LHkpIHtcbiAgICB2YXIgaSxyZXQ9MDtcbiAgICBmb3IoaSBpbiB4KSB7IGlmKHhbaV0gJiYgeVtpXSkgcmV0Kz0geFtpXSp5W2ldOyB9XG4gICAgcmV0dXJuIHJldDtcbn1cblxubnVtZXJpYy5zZG90ID0gZnVuY3Rpb24gZG90KEEsQikge1xuICAgIHZhciBtID0gbnVtZXJpYy5zZGltKEEpLmxlbmd0aCwgbiA9IG51bWVyaWMuc2RpbShCKS5sZW5ndGg7XG4gICAgdmFyIGsgPSBtKjEwMDArbjtcbiAgICBzd2l0Y2goaykge1xuICAgIGNhc2UgMDogcmV0dXJuIEEqQjtcbiAgICBjYXNlIDEwMDE6IHJldHVybiBudW1lcmljLnNkb3RWVihBLEIpO1xuICAgIGNhc2UgMjAwMTogcmV0dXJuIG51bWVyaWMuc2RvdE1WKEEsQik7XG4gICAgY2FzZSAxMDAyOiByZXR1cm4gbnVtZXJpYy5zZG90Vk0oQSxCKTtcbiAgICBjYXNlIDIwMDI6IHJldHVybiBudW1lcmljLnNkb3RNTShBLEIpO1xuICAgIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcignbnVtZXJpYy5zZG90IG5vdCBpbXBsZW1lbnRlZCBmb3IgdGVuc29ycyBvZiBvcmRlciAnK20rJyBhbmQgJytuKTtcbiAgICB9XG59XG5cbm51bWVyaWMuc3NjYXR0ZXIgPSBmdW5jdGlvbiBzY2F0dGVyKFYpIHtcbiAgICB2YXIgbiA9IFZbMF0ubGVuZ3RoLCBWaWosIGksIGosIG0gPSBWLmxlbmd0aCwgQSA9IFtdLCBBajtcbiAgICBmb3IoaT1uLTE7aT49MDstLWkpIHtcbiAgICAgICAgaWYoIVZbbS0xXVtpXSkgY29udGludWU7XG4gICAgICAgIEFqID0gQTtcbiAgICAgICAgZm9yKGo9MDtqPG0tMjtqKyspIHtcbiAgICAgICAgICAgIFZpaiA9IFZbal1baV07XG4gICAgICAgICAgICBpZighQWpbVmlqXSkgQWpbVmlqXSA9IFtdO1xuICAgICAgICAgICAgQWogPSBBaltWaWpdO1xuICAgICAgICB9XG4gICAgICAgIEFqW1Zbal1baV1dID0gVltqKzFdW2ldO1xuICAgIH1cbiAgICByZXR1cm4gQTtcbn1cblxubnVtZXJpYy5zZ2F0aGVyID0gZnVuY3Rpb24gZ2F0aGVyKEEscmV0LGspIHtcbiAgICBpZih0eXBlb2YgcmV0ID09PSBcInVuZGVmaW5lZFwiKSByZXQgPSBbXTtcbiAgICBpZih0eXBlb2YgayA9PT0gXCJ1bmRlZmluZWRcIikgayA9IFtdO1xuICAgIHZhciBuLGksQWk7XG4gICAgbiA9IGsubGVuZ3RoO1xuICAgIGZvcihpIGluIEEpIHtcbiAgICAgICAgaWYoQS5oYXNPd25Qcm9wZXJ0eShpKSkge1xuICAgICAgICAgICAga1tuXSA9IHBhcnNlSW50KGkpO1xuICAgICAgICAgICAgQWkgPSBBW2ldO1xuICAgICAgICAgICAgaWYodHlwZW9mIEFpID09PSBcIm51bWJlclwiKSB7XG4gICAgICAgICAgICAgICAgaWYoQWkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYocmV0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGk9bisxO2k+PTA7LS1pKSByZXRbaV0gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IoaT1uO2k+PTA7LS1pKSByZXRbaV0ucHVzaChrW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0W24rMV0ucHVzaChBaSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGdhdGhlcihBaSxyZXQsayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYoay5sZW5ndGg+bikgay5wb3AoKTtcbiAgICByZXR1cm4gcmV0O1xufVxuXG4vLyA2LiBDb29yZGluYXRlIG1hdHJpY2VzXG5udW1lcmljLmNMVSA9IGZ1bmN0aW9uIExVKEEpIHtcbiAgICB2YXIgSSA9IEFbMF0sIEogPSBBWzFdLCBWID0gQVsyXTtcbiAgICB2YXIgcCA9IEkubGVuZ3RoLCBtPTAsIGksaixrLGEsYixjO1xuICAgIGZvcihpPTA7aTxwO2krKykgaWYoSVtpXT5tKSBtPUlbaV07XG4gICAgbSsrO1xuICAgIHZhciBMID0gQXJyYXkobSksIFUgPSBBcnJheShtKSwgbGVmdCA9IG51bWVyaWMucmVwKFttXSxJbmZpbml0eSksIHJpZ2h0ID0gbnVtZXJpYy5yZXAoW21dLC1JbmZpbml0eSk7XG4gICAgdmFyIFVpLCBVaixhbHBoYTtcbiAgICBmb3Ioaz0wO2s8cDtrKyspIHtcbiAgICAgICAgaSA9IElba107XG4gICAgICAgIGogPSBKW2tdO1xuICAgICAgICBpZihqPGxlZnRbaV0pIGxlZnRbaV0gPSBqO1xuICAgICAgICBpZihqPnJpZ2h0W2ldKSByaWdodFtpXSA9IGo7XG4gICAgfVxuICAgIGZvcihpPTA7aTxtLTE7aSsrKSB7IGlmKHJpZ2h0W2ldID4gcmlnaHRbaSsxXSkgcmlnaHRbaSsxXSA9IHJpZ2h0W2ldOyB9XG4gICAgZm9yKGk9bS0xO2k+PTE7aS0tKSB7IGlmKGxlZnRbaV08bGVmdFtpLTFdKSBsZWZ0W2ktMV0gPSBsZWZ0W2ldOyB9XG4gICAgdmFyIGNvdW50TCA9IDAsIGNvdW50VSA9IDA7XG4gICAgZm9yKGk9MDtpPG07aSsrKSB7XG4gICAgICAgIFVbaV0gPSBudW1lcmljLnJlcChbcmlnaHRbaV0tbGVmdFtpXSsxXSwwKTtcbiAgICAgICAgTFtpXSA9IG51bWVyaWMucmVwKFtpLWxlZnRbaV1dLDApO1xuICAgICAgICBjb3VudEwgKz0gaS1sZWZ0W2ldKzE7XG4gICAgICAgIGNvdW50VSArPSByaWdodFtpXS1pKzE7XG4gICAgfVxuICAgIGZvcihrPTA7azxwO2srKykgeyBpID0gSVtrXTsgVVtpXVtKW2tdLWxlZnRbaV1dID0gVltrXTsgfVxuICAgIGZvcihpPTA7aTxtLTE7aSsrKSB7XG4gICAgICAgIGEgPSBpLWxlZnRbaV07XG4gICAgICAgIFVpID0gVVtpXTtcbiAgICAgICAgZm9yKGo9aSsxO2xlZnRbal08PWkgJiYgajxtO2orKykge1xuICAgICAgICAgICAgYiA9IGktbGVmdFtqXTtcbiAgICAgICAgICAgIGMgPSByaWdodFtpXS1pO1xuICAgICAgICAgICAgVWogPSBVW2pdO1xuICAgICAgICAgICAgYWxwaGEgPSBValtiXS9VaVthXTtcbiAgICAgICAgICAgIGlmKGFscGhhKSB7XG4gICAgICAgICAgICAgICAgZm9yKGs9MTtrPD1jO2srKykgeyBValtrK2JdIC09IGFscGhhKlVpW2srYV07IH1cbiAgICAgICAgICAgICAgICBMW2pdW2ktbGVmdFtqXV0gPSBhbHBoYTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgVWkgPSBbXSwgVWogPSBbXSwgVXYgPSBbXSwgTGkgPSBbXSwgTGogPSBbXSwgTHYgPSBbXTtcbiAgICB2YXIgcCxxLGZvbztcbiAgICBwPTA7IHE9MDtcbiAgICBmb3IoaT0wO2k8bTtpKyspIHtcbiAgICAgICAgYSA9IGxlZnRbaV07XG4gICAgICAgIGIgPSByaWdodFtpXTtcbiAgICAgICAgZm9vID0gVVtpXTtcbiAgICAgICAgZm9yKGo9aTtqPD1iO2orKykge1xuICAgICAgICAgICAgaWYoZm9vW2otYV0pIHtcbiAgICAgICAgICAgICAgICBVaVtwXSA9IGk7XG4gICAgICAgICAgICAgICAgVWpbcF0gPSBqO1xuICAgICAgICAgICAgICAgIFV2W3BdID0gZm9vW2otYV07XG4gICAgICAgICAgICAgICAgcCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvbyA9IExbaV07XG4gICAgICAgIGZvcihqPWE7ajxpO2orKykge1xuICAgICAgICAgICAgaWYoZm9vW2otYV0pIHtcbiAgICAgICAgICAgICAgICBMaVtxXSA9IGk7XG4gICAgICAgICAgICAgICAgTGpbcV0gPSBqO1xuICAgICAgICAgICAgICAgIEx2W3FdID0gZm9vW2otYV07XG4gICAgICAgICAgICAgICAgcSsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIExpW3FdID0gaTtcbiAgICAgICAgTGpbcV0gPSBpO1xuICAgICAgICBMdltxXSA9IDE7XG4gICAgICAgIHErKztcbiAgICB9XG4gICAgcmV0dXJuIHtVOltVaSxVaixVdl0sIEw6W0xpLExqLEx2XX07XG59O1xuXG5udW1lcmljLmNMVXNvbHZlID0gZnVuY3Rpb24gTFVzb2x2ZShsdSxiKSB7XG4gICAgdmFyIEwgPSBsdS5MLCBVID0gbHUuVSwgcmV0ID0gbnVtZXJpYy5jbG9uZShiKTtcbiAgICB2YXIgTGkgPSBMWzBdLCBMaiA9IExbMV0sIEx2ID0gTFsyXTtcbiAgICB2YXIgVWkgPSBVWzBdLCBVaiA9IFVbMV0sIFV2ID0gVVsyXTtcbiAgICB2YXIgcCA9IFVpLmxlbmd0aCwgcSA9IExpLmxlbmd0aDtcbiAgICB2YXIgbSA9IHJldC5sZW5ndGgsaSxqLGs7XG4gICAgayA9IDA7XG4gICAgZm9yKGk9MDtpPG07aSsrKSB7XG4gICAgICAgIHdoaWxlKExqW2tdIDwgaSkge1xuICAgICAgICAgICAgcmV0W2ldIC09IEx2W2tdKnJldFtMaltrXV07XG4gICAgICAgICAgICBrKys7XG4gICAgICAgIH1cbiAgICAgICAgaysrO1xuICAgIH1cbiAgICBrID0gcC0xO1xuICAgIGZvcihpPW0tMTtpPj0wO2ktLSkge1xuICAgICAgICB3aGlsZShValtrXSA+IGkpIHtcbiAgICAgICAgICAgIHJldFtpXSAtPSBVdltrXSpyZXRbVWpba11dO1xuICAgICAgICAgICAgay0tO1xuICAgICAgICB9XG4gICAgICAgIHJldFtpXSAvPSBVdltrXTtcbiAgICAgICAgay0tO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufTtcblxubnVtZXJpYy5jZ3JpZCA9IGZ1bmN0aW9uIGdyaWQobixzaGFwZSkge1xuICAgIGlmKHR5cGVvZiBuID09PSBcIm51bWJlclwiKSBuID0gW24sbl07XG4gICAgdmFyIHJldCA9IG51bWVyaWMucmVwKG4sLTEpO1xuICAgIHZhciBpLGosY291bnQ7XG4gICAgaWYodHlwZW9mIHNoYXBlICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgc3dpdGNoKHNoYXBlKSB7XG4gICAgICAgIGNhc2UgJ0wnOlxuICAgICAgICAgICAgc2hhcGUgPSBmdW5jdGlvbihpLGopIHsgcmV0dXJuIChpPj1uWzBdLzIgfHwgajxuWzFdLzIpOyB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHNoYXBlID0gZnVuY3Rpb24oaSxqKSB7IHJldHVybiB0cnVlOyB9O1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY291bnQ9MDtcbiAgICBmb3IoaT0xO2k8blswXS0xO2krKykgZm9yKGo9MTtqPG5bMV0tMTtqKyspIFxuICAgICAgICBpZihzaGFwZShpLGopKSB7XG4gICAgICAgICAgICByZXRbaV1bal0gPSBjb3VudDtcbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgIH1cbiAgICByZXR1cm4gcmV0O1xufVxuXG5udW1lcmljLmNkZWxzcSA9IGZ1bmN0aW9uIGRlbHNxKGcpIHtcbiAgICB2YXIgZGlyID0gW1stMSwwXSxbMCwtMV0sWzAsMV0sWzEsMF1dO1xuICAgIHZhciBzID0gbnVtZXJpYy5kaW0oZyksIG0gPSBzWzBdLCBuID0gc1sxXSwgaSxqLGsscCxxO1xuICAgIHZhciBMaSA9IFtdLCBMaiA9IFtdLCBMdiA9IFtdO1xuICAgIGZvcihpPTE7aTxtLTE7aSsrKSBmb3Ioaj0xO2o8bi0xO2orKykge1xuICAgICAgICBpZihnW2ldW2pdPDApIGNvbnRpbnVlO1xuICAgICAgICBmb3Ioaz0wO2s8NDtrKyspIHtcbiAgICAgICAgICAgIHAgPSBpK2RpcltrXVswXTtcbiAgICAgICAgICAgIHEgPSBqK2RpcltrXVsxXTtcbiAgICAgICAgICAgIGlmKGdbcF1bcV08MCkgY29udGludWU7XG4gICAgICAgICAgICBMaS5wdXNoKGdbaV1bal0pO1xuICAgICAgICAgICAgTGoucHVzaChnW3BdW3FdKTtcbiAgICAgICAgICAgIEx2LnB1c2goLTEpO1xuICAgICAgICB9XG4gICAgICAgIExpLnB1c2goZ1tpXVtqXSk7XG4gICAgICAgIExqLnB1c2goZ1tpXVtqXSk7XG4gICAgICAgIEx2LnB1c2goNCk7XG4gICAgfVxuICAgIHJldHVybiBbTGksTGosTHZdO1xufVxuXG5udW1lcmljLmNkb3RNViA9IGZ1bmN0aW9uIGRvdE1WKEEseCkge1xuICAgIHZhciByZXQsIEFpID0gQVswXSwgQWogPSBBWzFdLCBBdiA9IEFbMl0sayxwPUFpLmxlbmd0aCxOO1xuICAgIE49MDtcbiAgICBmb3Ioaz0wO2s8cDtrKyspIHsgaWYoQWlba10+TikgTiA9IEFpW2tdOyB9XG4gICAgTisrO1xuICAgIHJldCA9IG51bWVyaWMucmVwKFtOXSwwKTtcbiAgICBmb3Ioaz0wO2s8cDtrKyspIHsgcmV0W0FpW2tdXSs9QXZba10qeFtBaltrXV07IH1cbiAgICByZXR1cm4gcmV0O1xufVxuXG4vLyA3LiBTcGxpbmVzXG5cbm51bWVyaWMuU3BsaW5lID0gZnVuY3Rpb24gU3BsaW5lKHgseWwseXIsa2wsa3IpIHsgdGhpcy54ID0geDsgdGhpcy55bCA9IHlsOyB0aGlzLnlyID0geXI7IHRoaXMua2wgPSBrbDsgdGhpcy5rciA9IGtyOyB9XG5udW1lcmljLlNwbGluZS5wcm90b3R5cGUuX2F0ID0gZnVuY3Rpb24gX2F0KHgxLHApIHtcbiAgICB2YXIgeCA9IHRoaXMueDtcbiAgICB2YXIgeWwgPSB0aGlzLnlsO1xuICAgIHZhciB5ciA9IHRoaXMueXI7XG4gICAgdmFyIGtsID0gdGhpcy5rbDtcbiAgICB2YXIga3IgPSB0aGlzLmtyO1xuICAgIHZhciB4MSxhLGIsdDtcbiAgICB2YXIgYWRkID0gbnVtZXJpYy5hZGQsIHN1YiA9IG51bWVyaWMuc3ViLCBtdWwgPSBudW1lcmljLm11bDtcbiAgICBhID0gc3ViKG11bChrbFtwXSx4W3ArMV0teFtwXSksc3ViKHlyW3ArMV0seWxbcF0pKTtcbiAgICBiID0gYWRkKG11bChrcltwKzFdLHhbcF0teFtwKzFdKSxzdWIoeXJbcCsxXSx5bFtwXSkpO1xuICAgIHQgPSAoeDEteFtwXSkvKHhbcCsxXS14W3BdKTtcbiAgICB2YXIgcyA9IHQqKDEtdCk7XG4gICAgcmV0dXJuIGFkZChhZGQoYWRkKG11bCgxLXQseWxbcF0pLG11bCh0LHlyW3ArMV0pKSxtdWwoYSxzKigxLXQpKSksbXVsKGIscyp0KSk7XG59XG5udW1lcmljLlNwbGluZS5wcm90b3R5cGUuYXQgPSBmdW5jdGlvbiBhdCh4MCkge1xuICAgIGlmKHR5cGVvZiB4MCA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICB2YXIgeCA9IHRoaXMueDtcbiAgICAgICAgdmFyIG4gPSB4Lmxlbmd0aDtcbiAgICAgICAgdmFyIHAscSxtaWQsZmxvb3IgPSBNYXRoLmZsb29yLGEsYix0O1xuICAgICAgICBwID0gMDtcbiAgICAgICAgcSA9IG4tMTtcbiAgICAgICAgd2hpbGUocS1wPjEpIHtcbiAgICAgICAgICAgIG1pZCA9IGZsb29yKChwK3EpLzIpO1xuICAgICAgICAgICAgaWYoeFttaWRdIDw9IHgwKSBwID0gbWlkO1xuICAgICAgICAgICAgZWxzZSBxID0gbWlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9hdCh4MCxwKTtcbiAgICB9XG4gICAgdmFyIG4gPSB4MC5sZW5ndGgsIGksIHJldCA9IEFycmF5KG4pO1xuICAgIGZvcihpPW4tMTtpIT09LTE7LS1pKSByZXRbaV0gPSB0aGlzLmF0KHgwW2ldKTtcbiAgICByZXR1cm4gcmV0O1xufVxubnVtZXJpYy5TcGxpbmUucHJvdG90eXBlLmRpZmYgPSBmdW5jdGlvbiBkaWZmKCkge1xuICAgIHZhciB4ID0gdGhpcy54O1xuICAgIHZhciB5bCA9IHRoaXMueWw7XG4gICAgdmFyIHlyID0gdGhpcy55cjtcbiAgICB2YXIga2wgPSB0aGlzLmtsO1xuICAgIHZhciBrciA9IHRoaXMua3I7XG4gICAgdmFyIG4gPSB5bC5sZW5ndGg7XG4gICAgdmFyIGksZHgsZHk7XG4gICAgdmFyIHpsID0ga2wsIHpyID0ga3IsIHBsID0gQXJyYXkobiksIHByID0gQXJyYXkobik7XG4gICAgdmFyIGFkZCA9IG51bWVyaWMuYWRkLCBtdWwgPSBudW1lcmljLm11bCwgZGl2ID0gbnVtZXJpYy5kaXYsIHN1YiA9IG51bWVyaWMuc3ViO1xuICAgIGZvcihpPW4tMTtpIT09LTE7LS1pKSB7XG4gICAgICAgIGR4ID0geFtpKzFdLXhbaV07XG4gICAgICAgIGR5ID0gc3ViKHlyW2krMV0seWxbaV0pO1xuICAgICAgICBwbFtpXSA9IGRpdihhZGQobXVsKGR5LCA2KSxtdWwoa2xbaV0sLTQqZHgpLG11bChrcltpKzFdLC0yKmR4KSksZHgqZHgpO1xuICAgICAgICBwcltpKzFdID0gZGl2KGFkZChtdWwoZHksLTYpLG11bChrbFtpXSwgMipkeCksbXVsKGtyW2krMV0sIDQqZHgpKSxkeCpkeCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgbnVtZXJpYy5TcGxpbmUoeCx6bCx6cixwbCxwcik7XG59XG5udW1lcmljLlNwbGluZS5wcm90b3R5cGUucm9vdHMgPSBmdW5jdGlvbiByb290cygpIHtcbiAgICBmdW5jdGlvbiBzcXIoeCkgeyByZXR1cm4geCp4OyB9XG4gICAgZnVuY3Rpb24gaGV2YWwoeTAseTEsazAsazEseCkge1xuICAgICAgICB2YXIgQSA9IGswKjItKHkxLXkwKTtcbiAgICAgICAgdmFyIEIgPSAtazEqMisoeTEteTApO1xuICAgICAgICB2YXIgdCA9ICh4KzEpKjAuNTtcbiAgICAgICAgdmFyIHMgPSB0KigxLXQpO1xuICAgICAgICByZXR1cm4gKDEtdCkqeTArdCp5MStBKnMqKDEtdCkrQipzKnQ7XG4gICAgfVxuICAgIHZhciByZXQgPSBbXTtcbiAgICB2YXIgeCA9IHRoaXMueCwgeWwgPSB0aGlzLnlsLCB5ciA9IHRoaXMueXIsIGtsID0gdGhpcy5rbCwga3IgPSB0aGlzLmtyO1xuICAgIGlmKHR5cGVvZiB5bFswXSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICB5bCA9IFt5bF07XG4gICAgICAgIHlyID0gW3lyXTtcbiAgICAgICAga2wgPSBba2xdO1xuICAgICAgICBrciA9IFtrcl07XG4gICAgfVxuICAgIHZhciBtID0geWwubGVuZ3RoLG49eC5sZW5ndGgtMSxpLGosayx5LHMsdDtcbiAgICB2YXIgYWksYmksY2ksZGksIHJldCA9IEFycmF5KG0pLHJpLGswLGsxLHkwLHkxLEEsQixELGR4LGN4LHN0b3BzLHowLHoxLHptLHQwLHQxLHRtO1xuICAgIHZhciBzcXJ0ID0gTWF0aC5zcXJ0O1xuICAgIGZvcihpPTA7aSE9PW07KytpKSB7XG4gICAgICAgIGFpID0geWxbaV07XG4gICAgICAgIGJpID0geXJbaV07XG4gICAgICAgIGNpID0ga2xbaV07XG4gICAgICAgIGRpID0ga3JbaV07XG4gICAgICAgIHJpID0gW107XG4gICAgICAgIGZvcihqPTA7aiE9PW47aisrKSB7XG4gICAgICAgICAgICBpZihqPjAgJiYgYmlbal0qYWlbal08MCkgcmkucHVzaCh4W2pdKTtcbiAgICAgICAgICAgIGR4ID0gKHhbaisxXS14W2pdKTtcbiAgICAgICAgICAgIGN4ID0geFtqXTtcbiAgICAgICAgICAgIHkwID0gYWlbal07XG4gICAgICAgICAgICB5MSA9IGJpW2orMV07XG4gICAgICAgICAgICBrMCA9IGNpW2pdL2R4O1xuICAgICAgICAgICAgazEgPSBkaVtqKzFdL2R4O1xuICAgICAgICAgICAgRCA9IHNxcihrMC1rMSszKih5MC15MSkpICsgMTIqazEqeTA7XG4gICAgICAgICAgICBBID0gazErMyp5MCsyKmswLTMqeTE7XG4gICAgICAgICAgICBCID0gMyooazErazArMiooeTAteTEpKTtcbiAgICAgICAgICAgIGlmKEQ8PTApIHtcbiAgICAgICAgICAgICAgICB6MCA9IEEvQjtcbiAgICAgICAgICAgICAgICBpZih6MD54W2pdICYmIHowPHhbaisxXSkgc3RvcHMgPSBbeFtqXSx6MCx4W2orMV1dO1xuICAgICAgICAgICAgICAgIGVsc2Ugc3RvcHMgPSBbeFtqXSx4W2orMV1dO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB6MCA9IChBLXNxcnQoRCkpL0I7XG4gICAgICAgICAgICAgICAgejEgPSAoQStzcXJ0KEQpKS9CO1xuICAgICAgICAgICAgICAgIHN0b3BzID0gW3hbal1dO1xuICAgICAgICAgICAgICAgIGlmKHowPnhbal0gJiYgejA8eFtqKzFdKSBzdG9wcy5wdXNoKHowKTtcbiAgICAgICAgICAgICAgICBpZih6MT54W2pdICYmIHoxPHhbaisxXSkgc3RvcHMucHVzaCh6MSk7XG4gICAgICAgICAgICAgICAgc3RvcHMucHVzaCh4W2orMV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdDAgPSBzdG9wc1swXTtcbiAgICAgICAgICAgIHowID0gdGhpcy5fYXQodDAsaik7XG4gICAgICAgICAgICBmb3Ioaz0wO2s8c3RvcHMubGVuZ3RoLTE7aysrKSB7XG4gICAgICAgICAgICAgICAgdDEgPSBzdG9wc1trKzFdO1xuICAgICAgICAgICAgICAgIHoxID0gdGhpcy5fYXQodDEsaik7XG4gICAgICAgICAgICAgICAgaWYoejAgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmkucHVzaCh0MCk7IFxuICAgICAgICAgICAgICAgICAgICB0MCA9IHQxO1xuICAgICAgICAgICAgICAgICAgICB6MCA9IHoxO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYoejEgPT09IDAgfHwgejAqejE+MCkge1xuICAgICAgICAgICAgICAgICAgICB0MCA9IHQxO1xuICAgICAgICAgICAgICAgICAgICB6MCA9IHoxO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHNpZGUgPSAwO1xuICAgICAgICAgICAgICAgIHdoaWxlKDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdG0gPSAoejAqdDEtejEqdDApLyh6MC16MSk7XG4gICAgICAgICAgICAgICAgICAgIGlmKHRtIDw9IHQwIHx8IHRtID49IHQxKSB7IGJyZWFrOyB9XG4gICAgICAgICAgICAgICAgICAgIHptID0gdGhpcy5fYXQodG0saik7XG4gICAgICAgICAgICAgICAgICAgIGlmKHptKnoxPjApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQxID0gdG07XG4gICAgICAgICAgICAgICAgICAgICAgICB6MSA9IHptO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2lkZSA9PT0gLTEpIHowKj0wLjU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWRlID0gLTE7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZih6bSp6MD4wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0MCA9IHRtO1xuICAgICAgICAgICAgICAgICAgICAgICAgejAgPSB6bTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNpZGUgPT09IDEpIHoxKj0wLjU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByaS5wdXNoKHRtKTtcbiAgICAgICAgICAgICAgICB0MCA9IHN0b3BzW2srMV07XG4gICAgICAgICAgICAgICAgejAgPSB0aGlzLl9hdCh0MCwgaik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZih6MSA9PT0gMCkgcmkucHVzaCh0MSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0W2ldID0gcmk7XG4gICAgfVxuICAgIGlmKHR5cGVvZiB0aGlzLnlsWzBdID09PSBcIm51bWJlclwiKSByZXR1cm4gcmV0WzBdO1xuICAgIHJldHVybiByZXQ7XG59XG5udW1lcmljLnNwbGluZSA9IGZ1bmN0aW9uIHNwbGluZSh4LHksazEsa24pIHtcbiAgICB2YXIgbiA9IHgubGVuZ3RoLCBiID0gW10sIGR4ID0gW10sIGR5ID0gW107XG4gICAgdmFyIGk7XG4gICAgdmFyIHN1YiA9IG51bWVyaWMuc3ViLG11bCA9IG51bWVyaWMubXVsLGFkZCA9IG51bWVyaWMuYWRkO1xuICAgIGZvcihpPW4tMjtpPj0wO2ktLSkgeyBkeFtpXSA9IHhbaSsxXS14W2ldOyBkeVtpXSA9IHN1Yih5W2krMV0seVtpXSk7IH1cbiAgICBpZih0eXBlb2YgazEgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIGtuID09PSBcInN0cmluZ1wiKSB7IFxuICAgICAgICBrMSA9IGtuID0gXCJwZXJpb2RpY1wiO1xuICAgIH1cbiAgICAvLyBCdWlsZCBzcGFyc2UgdHJpZGlhZ29uYWwgc3lzdGVtXG4gICAgdmFyIFQgPSBbW10sW10sW11dO1xuICAgIHN3aXRjaCh0eXBlb2YgazEpIHtcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICAgIGJbMF0gPSBtdWwoMy8oZHhbMF0qZHhbMF0pLGR5WzBdKTtcbiAgICAgICAgVFswXS5wdXNoKDAsMCk7XG4gICAgICAgIFRbMV0ucHVzaCgwLDEpO1xuICAgICAgICBUWzJdLnB1c2goMi9keFswXSwxL2R4WzBdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgICBiWzBdID0gYWRkKG11bCgzLyhkeFtuLTJdKmR4W24tMl0pLGR5W24tMl0pLG11bCgzLyhkeFswXSpkeFswXSksZHlbMF0pKTtcbiAgICAgICAgVFswXS5wdXNoKDAsMCwwKTtcbiAgICAgICAgVFsxXS5wdXNoKG4tMiwwLDEpO1xuICAgICAgICBUWzJdLnB1c2goMS9keFtuLTJdLDIvZHhbbi0yXSsyL2R4WzBdLDEvZHhbMF0pO1xuICAgICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgICBiWzBdID0gazE7XG4gICAgICAgIFRbMF0ucHVzaCgwKTtcbiAgICAgICAgVFsxXS5wdXNoKDApO1xuICAgICAgICBUWzJdLnB1c2goMSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBmb3IoaT0xO2k8bi0xO2krKykge1xuICAgICAgICBiW2ldID0gYWRkKG11bCgzLyhkeFtpLTFdKmR4W2ktMV0pLGR5W2ktMV0pLG11bCgzLyhkeFtpXSpkeFtpXSksZHlbaV0pKTtcbiAgICAgICAgVFswXS5wdXNoKGksaSxpKTtcbiAgICAgICAgVFsxXS5wdXNoKGktMSxpLGkrMSk7XG4gICAgICAgIFRbMl0ucHVzaCgxL2R4W2ktMV0sMi9keFtpLTFdKzIvZHhbaV0sMS9keFtpXSk7XG4gICAgfVxuICAgIHN3aXRjaCh0eXBlb2Yga24pIHtcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICAgIGJbbi0xXSA9IG11bCgzLyhkeFtuLTJdKmR4W24tMl0pLGR5W24tMl0pO1xuICAgICAgICBUWzBdLnB1c2gobi0xLG4tMSk7XG4gICAgICAgIFRbMV0ucHVzaChuLTIsbi0xKTtcbiAgICAgICAgVFsyXS5wdXNoKDEvZHhbbi0yXSwyL2R4W24tMl0pO1xuICAgICAgICBicmVhaztcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgIFRbMV1bVFsxXS5sZW5ndGgtMV0gPSAwO1xuICAgICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgICBiW24tMV0gPSBrbjtcbiAgICAgICAgVFswXS5wdXNoKG4tMSk7XG4gICAgICAgIFRbMV0ucHVzaChuLTEpO1xuICAgICAgICBUWzJdLnB1c2goMSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZih0eXBlb2YgYlswXSAhPT0gXCJudW1iZXJcIikgYiA9IG51bWVyaWMudHJhbnNwb3NlKGIpO1xuICAgIGVsc2UgYiA9IFtiXTtcbiAgICB2YXIgayA9IEFycmF5KGIubGVuZ3RoKTtcbiAgICBpZih0eXBlb2YgazEgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgZm9yKGk9ay5sZW5ndGgtMTtpIT09LTE7LS1pKSB7XG4gICAgICAgICAgICBrW2ldID0gbnVtZXJpYy5jY3NMVVBTb2x2ZShudW1lcmljLmNjc0xVUChudW1lcmljLmNjc1NjYXR0ZXIoVCkpLGJbaV0pO1xuICAgICAgICAgICAga1tpXVtuLTFdID0ga1tpXVswXTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcihpPWsubGVuZ3RoLTE7aSE9PS0xOy0taSkge1xuICAgICAgICAgICAga1tpXSA9IG51bWVyaWMuY0xVc29sdmUobnVtZXJpYy5jTFUoVCksYltpXSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYodHlwZW9mIHlbMF0gPT09IFwibnVtYmVyXCIpIGsgPSBrWzBdO1xuICAgIGVsc2UgayA9IG51bWVyaWMudHJhbnNwb3NlKGspO1xuICAgIHJldHVybiBuZXcgbnVtZXJpYy5TcGxpbmUoeCx5LHksayxrKTtcbn1cblxuLy8gOC4gRkZUXG5udW1lcmljLmZmdHBvdzIgPSBmdW5jdGlvbiBmZnRwb3cyKHgseSkge1xuICAgIHZhciBuID0geC5sZW5ndGg7XG4gICAgaWYobiA9PT0gMSkgcmV0dXJuO1xuICAgIHZhciBjb3MgPSBNYXRoLmNvcywgc2luID0gTWF0aC5zaW4sIGksajtcbiAgICB2YXIgeGUgPSBBcnJheShuLzIpLCB5ZSA9IEFycmF5KG4vMiksIHhvID0gQXJyYXkobi8yKSwgeW8gPSBBcnJheShuLzIpO1xuICAgIGogPSBuLzI7XG4gICAgZm9yKGk9bi0xO2khPT0tMTstLWkpIHtcbiAgICAgICAgLS1qO1xuICAgICAgICB4b1tqXSA9IHhbaV07XG4gICAgICAgIHlvW2pdID0geVtpXTtcbiAgICAgICAgLS1pO1xuICAgICAgICB4ZVtqXSA9IHhbaV07XG4gICAgICAgIHllW2pdID0geVtpXTtcbiAgICB9XG4gICAgZmZ0cG93Mih4ZSx5ZSk7XG4gICAgZmZ0cG93Mih4byx5byk7XG4gICAgaiA9IG4vMjtcbiAgICB2YXIgdCxrID0gKC02LjI4MzE4NTMwNzE3OTU4NjQ3NjkyNTI4Njc2NjU1OTAwNTc2ODM5NDMzODc5ODc1MDIxMTY0MTkvbiksY2ksc2k7XG4gICAgZm9yKGk9bi0xO2khPT0tMTstLWkpIHtcbiAgICAgICAgLS1qO1xuICAgICAgICBpZihqID09PSAtMSkgaiA9IG4vMi0xO1xuICAgICAgICB0ID0gayppO1xuICAgICAgICBjaSA9IGNvcyh0KTtcbiAgICAgICAgc2kgPSBzaW4odCk7XG4gICAgICAgIHhbaV0gPSB4ZVtqXSArIGNpKnhvW2pdIC0gc2kqeW9bal07XG4gICAgICAgIHlbaV0gPSB5ZVtqXSArIGNpKnlvW2pdICsgc2kqeG9bal07XG4gICAgfVxufVxubnVtZXJpYy5faWZmdHBvdzIgPSBmdW5jdGlvbiBfaWZmdHBvdzIoeCx5KSB7XG4gICAgdmFyIG4gPSB4Lmxlbmd0aDtcbiAgICBpZihuID09PSAxKSByZXR1cm47XG4gICAgdmFyIGNvcyA9IE1hdGguY29zLCBzaW4gPSBNYXRoLnNpbiwgaSxqO1xuICAgIHZhciB4ZSA9IEFycmF5KG4vMiksIHllID0gQXJyYXkobi8yKSwgeG8gPSBBcnJheShuLzIpLCB5byA9IEFycmF5KG4vMik7XG4gICAgaiA9IG4vMjtcbiAgICBmb3IoaT1uLTE7aSE9PS0xOy0taSkge1xuICAgICAgICAtLWo7XG4gICAgICAgIHhvW2pdID0geFtpXTtcbiAgICAgICAgeW9bal0gPSB5W2ldO1xuICAgICAgICAtLWk7XG4gICAgICAgIHhlW2pdID0geFtpXTtcbiAgICAgICAgeWVbal0gPSB5W2ldO1xuICAgIH1cbiAgICBfaWZmdHBvdzIoeGUseWUpO1xuICAgIF9pZmZ0cG93Mih4byx5byk7XG4gICAgaiA9IG4vMjtcbiAgICB2YXIgdCxrID0gKDYuMjgzMTg1MzA3MTc5NTg2NDc2OTI1Mjg2NzY2NTU5MDA1NzY4Mzk0MzM4Nzk4NzUwMjExNjQxOS9uKSxjaSxzaTtcbiAgICBmb3IoaT1uLTE7aSE9PS0xOy0taSkge1xuICAgICAgICAtLWo7XG4gICAgICAgIGlmKGogPT09IC0xKSBqID0gbi8yLTE7XG4gICAgICAgIHQgPSBrKmk7XG4gICAgICAgIGNpID0gY29zKHQpO1xuICAgICAgICBzaSA9IHNpbih0KTtcbiAgICAgICAgeFtpXSA9IHhlW2pdICsgY2kqeG9bal0gLSBzaSp5b1tqXTtcbiAgICAgICAgeVtpXSA9IHllW2pdICsgY2kqeW9bal0gKyBzaSp4b1tqXTtcbiAgICB9XG59XG5udW1lcmljLmlmZnRwb3cyID0gZnVuY3Rpb24gaWZmdHBvdzIoeCx5KSB7XG4gICAgbnVtZXJpYy5faWZmdHBvdzIoeCx5KTtcbiAgICBudW1lcmljLmRpdmVxKHgseC5sZW5ndGgpO1xuICAgIG51bWVyaWMuZGl2ZXEoeSx5Lmxlbmd0aCk7XG59XG5udW1lcmljLmNvbnZwb3cyID0gZnVuY3Rpb24gY29udnBvdzIoYXgsYXksYngsYnkpIHtcbiAgICBudW1lcmljLmZmdHBvdzIoYXgsYXkpO1xuICAgIG51bWVyaWMuZmZ0cG93MihieCxieSk7XG4gICAgdmFyIGksbiA9IGF4Lmxlbmd0aCxheGksYnhpLGF5aSxieWk7XG4gICAgZm9yKGk9bi0xO2khPT0tMTstLWkpIHtcbiAgICAgICAgYXhpID0gYXhbaV07IGF5aSA9IGF5W2ldOyBieGkgPSBieFtpXTsgYnlpID0gYnlbaV07XG4gICAgICAgIGF4W2ldID0gYXhpKmJ4aS1heWkqYnlpO1xuICAgICAgICBheVtpXSA9IGF4aSpieWkrYXlpKmJ4aTtcbiAgICB9XG4gICAgbnVtZXJpYy5pZmZ0cG93MihheCxheSk7XG59XG5udW1lcmljLlQucHJvdG90eXBlLmZmdCA9IGZ1bmN0aW9uIGZmdCgpIHtcbiAgICB2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueTtcbiAgICB2YXIgbiA9IHgubGVuZ3RoLCBsb2cgPSBNYXRoLmxvZywgbG9nMiA9IGxvZygyKSxcbiAgICAgICAgcCA9IE1hdGguY2VpbChsb2coMipuLTEpL2xvZzIpLCBtID0gTWF0aC5wb3coMixwKTtcbiAgICB2YXIgY3ggPSBudW1lcmljLnJlcChbbV0sMCksIGN5ID0gbnVtZXJpYy5yZXAoW21dLDApLCBjb3MgPSBNYXRoLmNvcywgc2luID0gTWF0aC5zaW47XG4gICAgdmFyIGssIGMgPSAoLTMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NTAyODg0MTk3MTY5Mzk5Mzc1MTA1ODIwL24pLHQ7XG4gICAgdmFyIGEgPSBudW1lcmljLnJlcChbbV0sMCksIGIgPSBudW1lcmljLnJlcChbbV0sMCksbmhhbGYgPSBNYXRoLmZsb29yKG4vMik7XG4gICAgZm9yKGs9MDtrPG47aysrKSBhW2tdID0geFtrXTtcbiAgICBpZih0eXBlb2YgeSAhPT0gXCJ1bmRlZmluZWRcIikgZm9yKGs9MDtrPG47aysrKSBiW2tdID0geVtrXTtcbiAgICBjeFswXSA9IDE7XG4gICAgZm9yKGs9MTtrPD1tLzI7aysrKSB7XG4gICAgICAgIHQgPSBjKmsqaztcbiAgICAgICAgY3hba10gPSBjb3ModCk7XG4gICAgICAgIGN5W2tdID0gc2luKHQpO1xuICAgICAgICBjeFttLWtdID0gY29zKHQpO1xuICAgICAgICBjeVttLWtdID0gc2luKHQpXG4gICAgfVxuICAgIHZhciBYID0gbmV3IG51bWVyaWMuVChhLGIpLCBZID0gbmV3IG51bWVyaWMuVChjeCxjeSk7XG4gICAgWCA9IFgubXVsKFkpO1xuICAgIG51bWVyaWMuY29udnBvdzIoWC54LFgueSxudW1lcmljLmNsb25lKFkueCksbnVtZXJpYy5uZWcoWS55KSk7XG4gICAgWCA9IFgubXVsKFkpO1xuICAgIFgueC5sZW5ndGggPSBuO1xuICAgIFgueS5sZW5ndGggPSBuO1xuICAgIHJldHVybiBYO1xufVxubnVtZXJpYy5ULnByb3RvdHlwZS5pZmZ0ID0gZnVuY3Rpb24gaWZmdCgpIHtcbiAgICB2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueTtcbiAgICB2YXIgbiA9IHgubGVuZ3RoLCBsb2cgPSBNYXRoLmxvZywgbG9nMiA9IGxvZygyKSxcbiAgICAgICAgcCA9IE1hdGguY2VpbChsb2coMipuLTEpL2xvZzIpLCBtID0gTWF0aC5wb3coMixwKTtcbiAgICB2YXIgY3ggPSBudW1lcmljLnJlcChbbV0sMCksIGN5ID0gbnVtZXJpYy5yZXAoW21dLDApLCBjb3MgPSBNYXRoLmNvcywgc2luID0gTWF0aC5zaW47XG4gICAgdmFyIGssIGMgPSAoMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1MDI4ODQxOTcxNjkzOTkzNzUxMDU4MjAvbiksdDtcbiAgICB2YXIgYSA9IG51bWVyaWMucmVwKFttXSwwKSwgYiA9IG51bWVyaWMucmVwKFttXSwwKSxuaGFsZiA9IE1hdGguZmxvb3Iobi8yKTtcbiAgICBmb3Ioaz0wO2s8bjtrKyspIGFba10gPSB4W2tdO1xuICAgIGlmKHR5cGVvZiB5ICE9PSBcInVuZGVmaW5lZFwiKSBmb3Ioaz0wO2s8bjtrKyspIGJba10gPSB5W2tdO1xuICAgIGN4WzBdID0gMTtcbiAgICBmb3Ioaz0xO2s8PW0vMjtrKyspIHtcbiAgICAgICAgdCA9IGMqayprO1xuICAgICAgICBjeFtrXSA9IGNvcyh0KTtcbiAgICAgICAgY3lba10gPSBzaW4odCk7XG4gICAgICAgIGN4W20ta10gPSBjb3ModCk7XG4gICAgICAgIGN5W20ta10gPSBzaW4odClcbiAgICB9XG4gICAgdmFyIFggPSBuZXcgbnVtZXJpYy5UKGEsYiksIFkgPSBuZXcgbnVtZXJpYy5UKGN4LGN5KTtcbiAgICBYID0gWC5tdWwoWSk7XG4gICAgbnVtZXJpYy5jb252cG93MihYLngsWC55LG51bWVyaWMuY2xvbmUoWS54KSxudW1lcmljLm5lZyhZLnkpKTtcbiAgICBYID0gWC5tdWwoWSk7XG4gICAgWC54Lmxlbmd0aCA9IG47XG4gICAgWC55Lmxlbmd0aCA9IG47XG4gICAgcmV0dXJuIFguZGl2KG4pO1xufVxuXG4vLzkuIFVuY29uc3RyYWluZWQgb3B0aW1pemF0aW9uXG5udW1lcmljLmdyYWRpZW50ID0gZnVuY3Rpb24gZ3JhZGllbnQoZix4KSB7XG4gICAgdmFyIG4gPSB4Lmxlbmd0aDtcbiAgICB2YXIgZjAgPSBmKHgpO1xuICAgIGlmKGlzTmFOKGYwKSkgdGhyb3cgbmV3IEVycm9yKCdncmFkaWVudDogZih4KSBpcyBhIE5hTiEnKTtcbiAgICB2YXIgbWF4ID0gTWF0aC5tYXg7XG4gICAgdmFyIGkseDAgPSBudW1lcmljLmNsb25lKHgpLGYxLGYyLCBKID0gQXJyYXkobik7XG4gICAgdmFyIGRpdiA9IG51bWVyaWMuZGl2LCBzdWIgPSBudW1lcmljLnN1YixlcnJlc3Qscm91bmRvZmYsbWF4ID0gTWF0aC5tYXgsZXBzID0gMWUtMyxhYnMgPSBNYXRoLmFicywgbWluID0gTWF0aC5taW47XG4gICAgdmFyIHQwLHQxLHQyLGl0PTAsZDEsZDIsTjtcbiAgICBmb3IoaT0wO2k8bjtpKyspIHtcbiAgICAgICAgdmFyIGggPSBtYXgoMWUtNipmMCwxZS04KTtcbiAgICAgICAgd2hpbGUoMSkge1xuICAgICAgICAgICAgKytpdDtcbiAgICAgICAgICAgIGlmKGl0PjIwKSB7IHRocm93IG5ldyBFcnJvcihcIk51bWVyaWNhbCBncmFkaWVudCBmYWlsc1wiKTsgfVxuICAgICAgICAgICAgeDBbaV0gPSB4W2ldK2g7XG4gICAgICAgICAgICBmMSA9IGYoeDApO1xuICAgICAgICAgICAgeDBbaV0gPSB4W2ldLWg7XG4gICAgICAgICAgICBmMiA9IGYoeDApO1xuICAgICAgICAgICAgeDBbaV0gPSB4W2ldO1xuICAgICAgICAgICAgaWYoaXNOYU4oZjEpIHx8IGlzTmFOKGYyKSkgeyBoLz0xNjsgY29udGludWU7IH1cbiAgICAgICAgICAgIEpbaV0gPSAoZjEtZjIpLygyKmgpO1xuICAgICAgICAgICAgdDAgPSB4W2ldLWg7XG4gICAgICAgICAgICB0MSA9IHhbaV07XG4gICAgICAgICAgICB0MiA9IHhbaV0raDtcbiAgICAgICAgICAgIGQxID0gKGYxLWYwKS9oO1xuICAgICAgICAgICAgZDIgPSAoZjAtZjIpL2g7XG4gICAgICAgICAgICBOID0gbWF4KGFicyhKW2ldKSxhYnMoZjApLGFicyhmMSksYWJzKGYyKSxhYnModDApLGFicyh0MSksYWJzKHQyKSwxZS04KTtcbiAgICAgICAgICAgIGVycmVzdCA9IG1pbihtYXgoYWJzKGQxLUpbaV0pLGFicyhkMi1KW2ldKSxhYnMoZDEtZDIpKS9OLGgvTik7XG4gICAgICAgICAgICBpZihlcnJlc3Q+ZXBzKSB7IGgvPTE2OyB9XG4gICAgICAgICAgICBlbHNlIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gSjtcbn1cblxubnVtZXJpYy51bmNtaW4gPSBmdW5jdGlvbiB1bmNtaW4oZix4MCx0b2wsZ3JhZGllbnQsbWF4aXQsY2FsbGJhY2ssb3B0aW9ucykge1xuICAgIHZhciBncmFkID0gbnVtZXJpYy5ncmFkaWVudDtcbiAgICBpZih0eXBlb2Ygb3B0aW9ucyA9PT0gXCJ1bmRlZmluZWRcIikgeyBvcHRpb25zID0ge307IH1cbiAgICBpZih0eXBlb2YgdG9sID09PSBcInVuZGVmaW5lZFwiKSB7IHRvbCA9IDFlLTg7IH1cbiAgICBpZih0eXBlb2YgZ3JhZGllbnQgPT09IFwidW5kZWZpbmVkXCIpIHsgZ3JhZGllbnQgPSBmdW5jdGlvbih4KSB7IHJldHVybiBncmFkKGYseCk7IH07IH1cbiAgICBpZih0eXBlb2YgbWF4aXQgPT09IFwidW5kZWZpbmVkXCIpIG1heGl0ID0gMTAwMDtcbiAgICB4MCA9IG51bWVyaWMuY2xvbmUoeDApO1xuICAgIHZhciBuID0geDAubGVuZ3RoO1xuICAgIHZhciBmMCA9IGYoeDApLGYxLGRmMDtcbiAgICBpZihpc05hTihmMCkpIHRocm93IG5ldyBFcnJvcigndW5jbWluOiBmKHgwKSBpcyBhIE5hTiEnKTtcbiAgICB2YXIgbWF4ID0gTWF0aC5tYXgsIG5vcm0yID0gbnVtZXJpYy5ub3JtMjtcbiAgICB0b2wgPSBtYXgodG9sLG51bWVyaWMuZXBzaWxvbik7XG4gICAgdmFyIHN0ZXAsZzAsZzEsSDEgPSBvcHRpb25zLkhpbnYgfHwgbnVtZXJpYy5pZGVudGl0eShuKTtcbiAgICB2YXIgZG90ID0gbnVtZXJpYy5kb3QsIGludiA9IG51bWVyaWMuaW52LCBzdWIgPSBudW1lcmljLnN1YiwgYWRkID0gbnVtZXJpYy5hZGQsIHRlbiA9IG51bWVyaWMudGVuc29yLCBkaXYgPSBudW1lcmljLmRpdiwgbXVsID0gbnVtZXJpYy5tdWw7XG4gICAgdmFyIGFsbCA9IG51bWVyaWMuYWxsLCBpc2Zpbml0ZSA9IG51bWVyaWMuaXNGaW5pdGUsIG5lZyA9IG51bWVyaWMubmVnO1xuICAgIHZhciBpdD0wLGkscyx4MSx5LEh5LEhzLHlzLGkwLHQsbnN0ZXAsdDEsdDI7XG4gICAgdmFyIG1zZyA9IFwiXCI7XG4gICAgZzAgPSBncmFkaWVudCh4MCk7XG4gICAgd2hpbGUoaXQ8bWF4aXQpIHtcbiAgICAgICAgaWYodHlwZW9mIGNhbGxiYWNrID09PSBcImZ1bmN0aW9uXCIpIHsgaWYoY2FsbGJhY2soaXQseDAsZjAsZzAsSDEpKSB7IG1zZyA9IFwiQ2FsbGJhY2sgcmV0dXJuZWQgdHJ1ZVwiOyBicmVhazsgfSB9XG4gICAgICAgIGlmKCFhbGwoaXNmaW5pdGUoZzApKSkgeyBtc2cgPSBcIkdyYWRpZW50IGhhcyBJbmZpbml0eSBvciBOYU5cIjsgYnJlYWs7IH1cbiAgICAgICAgc3RlcCA9IG5lZyhkb3QoSDEsZzApKTtcbiAgICAgICAgaWYoIWFsbChpc2Zpbml0ZShzdGVwKSkpIHsgbXNnID0gXCJTZWFyY2ggZGlyZWN0aW9uIGhhcyBJbmZpbml0eSBvciBOYU5cIjsgYnJlYWs7IH1cbiAgICAgICAgbnN0ZXAgPSBub3JtMihzdGVwKTtcbiAgICAgICAgaWYobnN0ZXAgPCB0b2wpIHsgbXNnPVwiTmV3dG9uIHN0ZXAgc21hbGxlciB0aGFuIHRvbFwiOyBicmVhazsgfVxuICAgICAgICB0ID0gMTtcbiAgICAgICAgZGYwID0gZG90KGcwLHN0ZXApO1xuICAgICAgICAvLyBsaW5lIHNlYXJjaFxuICAgICAgICB4MSA9IHgwO1xuICAgICAgICB3aGlsZShpdCA8IG1heGl0KSB7XG4gICAgICAgICAgICBpZih0Km5zdGVwIDwgdG9sKSB7IGJyZWFrOyB9XG4gICAgICAgICAgICBzID0gbXVsKHN0ZXAsdCk7XG4gICAgICAgICAgICB4MSA9IGFkZCh4MCxzKTtcbiAgICAgICAgICAgIGYxID0gZih4MSk7XG4gICAgICAgICAgICBpZihmMS1mMCA+PSAwLjEqdCpkZjAgfHwgaXNOYU4oZjEpKSB7XG4gICAgICAgICAgICAgICAgdCAqPSAwLjU7XG4gICAgICAgICAgICAgICAgKytpdDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmKHQqbnN0ZXAgPCB0b2wpIHsgbXNnID0gXCJMaW5lIHNlYXJjaCBzdGVwIHNpemUgc21hbGxlciB0aGFuIHRvbFwiOyBicmVhazsgfVxuICAgICAgICBpZihpdCA9PT0gbWF4aXQpIHsgbXNnID0gXCJtYXhpdCByZWFjaGVkIGR1cmluZyBsaW5lIHNlYXJjaFwiOyBicmVhazsgfVxuICAgICAgICBnMSA9IGdyYWRpZW50KHgxKTtcbiAgICAgICAgeSA9IHN1YihnMSxnMCk7XG4gICAgICAgIHlzID0gZG90KHkscyk7XG4gICAgICAgIEh5ID0gZG90KEgxLHkpO1xuICAgICAgICBIMSA9IHN1YihhZGQoSDEsXG4gICAgICAgICAgICAgICAgbXVsKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHlzK2RvdCh5LEh5KSkvKHlzKnlzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbihzLHMpICAgICkpLFxuICAgICAgICAgICAgICAgIGRpdihhZGQodGVuKEh5LHMpLHRlbihzLEh5KSkseXMpKTtcbiAgICAgICAgeDAgPSB4MTtcbiAgICAgICAgZjAgPSBmMTtcbiAgICAgICAgZzAgPSBnMTtcbiAgICAgICAgKytpdDtcbiAgICB9XG4gICAgcmV0dXJuIHtzb2x1dGlvbjogeDAsIGY6IGYwLCBncmFkaWVudDogZzAsIGludkhlc3NpYW46IEgxLCBpdGVyYXRpb25zOml0LCBtZXNzYWdlOiBtc2d9O1xufVxuXG4vLyAxMC4gT2RlIHNvbHZlciAoRG9ybWFuZC1QcmluY2UpXG5udW1lcmljLkRvcHJpID0gZnVuY3Rpb24gRG9wcmkoeCx5LGYseW1pZCxpdGVyYXRpb25zLG1zZyxldmVudHMpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG4gICAgdGhpcy5mID0gZjtcbiAgICB0aGlzLnltaWQgPSB5bWlkO1xuICAgIHRoaXMuaXRlcmF0aW9ucyA9IGl0ZXJhdGlvbnM7XG4gICAgdGhpcy5ldmVudHMgPSBldmVudHM7XG4gICAgdGhpcy5tZXNzYWdlID0gbXNnO1xufVxubnVtZXJpYy5Eb3ByaS5wcm90b3R5cGUuX2F0ID0gZnVuY3Rpb24gX2F0KHhpLGopIHtcbiAgICBmdW5jdGlvbiBzcXIoeCkgeyByZXR1cm4geCp4OyB9XG4gICAgdmFyIHNvbCA9IHRoaXM7XG4gICAgdmFyIHhzID0gc29sLng7XG4gICAgdmFyIHlzID0gc29sLnk7XG4gICAgdmFyIGsxID0gc29sLmY7XG4gICAgdmFyIHltaWQgPSBzb2wueW1pZDtcbiAgICB2YXIgbiA9IHhzLmxlbmd0aDtcbiAgICB2YXIgeDAseDEseGgseTAseTEseWgseGk7XG4gICAgdmFyIGZsb29yID0gTWF0aC5mbG9vcixoO1xuICAgIHZhciBjID0gMC41O1xuICAgIHZhciBhZGQgPSBudW1lcmljLmFkZCwgbXVsID0gbnVtZXJpYy5tdWwsc3ViID0gbnVtZXJpYy5zdWIsIHAscSx3O1xuICAgIHgwID0geHNbal07XG4gICAgeDEgPSB4c1tqKzFdO1xuICAgIHkwID0geXNbal07XG4gICAgeTEgPSB5c1tqKzFdO1xuICAgIGggID0geDEteDA7XG4gICAgeGggPSB4MCtjKmg7XG4gICAgeWggPSB5bWlkW2pdO1xuICAgIHAgPSBzdWIoazFbaiAgXSxtdWwoeTAsMS8oeDAteGgpKzIvKHgwLXgxKSkpO1xuICAgIHEgPSBzdWIoazFbaisxXSxtdWwoeTEsMS8oeDEteGgpKzIvKHgxLXgwKSkpO1xuICAgIHcgPSBbc3FyKHhpIC0geDEpICogKHhpIC0geGgpIC8gc3FyKHgwIC0geDEpIC8gKHgwIC0geGgpLFxuICAgICAgICAgc3FyKHhpIC0geDApICogc3FyKHhpIC0geDEpIC8gc3FyKHgwIC0geGgpIC8gc3FyKHgxIC0geGgpLFxuICAgICAgICAgc3FyKHhpIC0geDApICogKHhpIC0geGgpIC8gc3FyKHgxIC0geDApIC8gKHgxIC0geGgpLFxuICAgICAgICAgKHhpIC0geDApICogc3FyKHhpIC0geDEpICogKHhpIC0geGgpIC8gc3FyKHgwLXgxKSAvICh4MCAtIHhoKSxcbiAgICAgICAgICh4aSAtIHgxKSAqIHNxcih4aSAtIHgwKSAqICh4aSAtIHhoKSAvIHNxcih4MC14MSkgLyAoeDEgLSB4aCldO1xuICAgIHJldHVybiBhZGQoYWRkKGFkZChhZGQobXVsKHkwLHdbMF0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsKHloLHdbMV0pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bCh5MSx3WzJdKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBtdWwoIHAsd1szXSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsKCBxLHdbNF0pKTtcbn1cbm51bWVyaWMuRG9wcmkucHJvdG90eXBlLmF0ID0gZnVuY3Rpb24gYXQoeCkge1xuICAgIHZhciBpLGosayxmbG9vciA9IE1hdGguZmxvb3I7XG4gICAgaWYodHlwZW9mIHggIT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgdmFyIG4gPSB4Lmxlbmd0aCwgcmV0ID0gQXJyYXkobik7XG4gICAgICAgIGZvcihpPW4tMTtpIT09LTE7LS1pKSB7XG4gICAgICAgICAgICByZXRbaV0gPSB0aGlzLmF0KHhbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIHZhciB4MCA9IHRoaXMueDtcbiAgICBpID0gMDsgaiA9IHgwLmxlbmd0aC0xO1xuICAgIHdoaWxlKGotaT4xKSB7XG4gICAgICAgIGsgPSBmbG9vcigwLjUqKGkraikpO1xuICAgICAgICBpZih4MFtrXSA8PSB4KSBpID0gaztcbiAgICAgICAgZWxzZSBqID0gaztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2F0KHgsaSk7XG59XG5cbm51bWVyaWMuZG9wcmkgPSBmdW5jdGlvbiBkb3ByaSh4MCx4MSx5MCxmLHRvbCxtYXhpdCxldmVudCkge1xuICAgIGlmKHR5cGVvZiB0b2wgPT09IFwidW5kZWZpbmVkXCIpIHsgdG9sID0gMWUtNjsgfVxuICAgIGlmKHR5cGVvZiBtYXhpdCA9PT0gXCJ1bmRlZmluZWRcIikgeyBtYXhpdCA9IDEwMDA7IH1cbiAgICB2YXIgeHMgPSBbeDBdLCB5cyA9IFt5MF0sIGsxID0gW2YoeDAseTApXSwgazIsazMsazQsazUsazYsazcsIHltaWQgPSBbXTtcbiAgICB2YXIgQTIgPSAxLzU7XG4gICAgdmFyIEEzID0gWzMvNDAsOS80MF07XG4gICAgdmFyIEE0ID0gWzQ0LzQ1LC01Ni8xNSwzMi85XTtcbiAgICB2YXIgQTUgPSBbMTkzNzIvNjU2MSwtMjUzNjAvMjE4Nyw2NDQ0OC82NTYxLC0yMTIvNzI5XTtcbiAgICB2YXIgQTYgPSBbOTAxNy8zMTY4LC0zNTUvMzMsNDY3MzIvNTI0Nyw0OS8xNzYsLTUxMDMvMTg2NTZdO1xuICAgIHZhciBiID0gWzM1LzM4NCwwLDUwMC8xMTEzLDEyNS8xOTIsLTIxODcvNjc4NCwxMS84NF07XG4gICAgdmFyIGJtID0gWzAuNSo2MDI1MTkyNzQzLzMwMDg1NTUzMTUyLFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAwLjUqNTEyNTIyOTI5MjUvNjU0MDA4MjE1OTgsXG4gICAgICAgICAgICAgIDAuNSotMjY5MTg2ODkyNS80NTEyODMyOTcyOCxcbiAgICAgICAgICAgICAgMC41KjE4Nzk0MDM3MjA2Ny8xNTk0NTM0MzE3MDU2LFxuICAgICAgICAgICAgICAwLjUqLTE3NzYwOTQzMzEvMTk3NDM2NDQyNTYsXG4gICAgICAgICAgICAgIDAuNSoxMTIzNzA5OS8yMzUwNDMzODRdO1xuICAgIHZhciBjID0gWzEvNSwzLzEwLDQvNSw4LzksMSwxXTtcbiAgICB2YXIgZSA9IFstNzEvNTc2MDAsMCw3MS8xNjY5NSwtNzEvMTkyMCwxNzI1My8zMzkyMDAsLTIyLzUyNSwxLzQwXTtcbiAgICB2YXIgaSA9IDAsZXIsajtcbiAgICB2YXIgaCA9ICh4MS14MCkvMTA7XG4gICAgdmFyIGl0ID0gMDtcbiAgICB2YXIgYWRkID0gbnVtZXJpYy5hZGQsIG11bCA9IG51bWVyaWMubXVsLCB5MSxlcmluZjtcbiAgICB2YXIgbWF4ID0gTWF0aC5tYXgsIG1pbiA9IE1hdGgubWluLCBhYnMgPSBNYXRoLmFicywgbm9ybWluZiA9IG51bWVyaWMubm9ybWluZixwb3cgPSBNYXRoLnBvdztcbiAgICB2YXIgYW55ID0gbnVtZXJpYy5hbnksIGx0ID0gbnVtZXJpYy5sdCwgYW5kID0gbnVtZXJpYy5hbmQsIHN1YiA9IG51bWVyaWMuc3ViO1xuICAgIHZhciBlMCwgZTEsIGV2O1xuICAgIHZhciByZXQgPSBuZXcgbnVtZXJpYy5Eb3ByaSh4cyx5cyxrMSx5bWlkLC0xLFwiXCIpO1xuICAgIGlmKHR5cGVvZiBldmVudCA9PT0gXCJmdW5jdGlvblwiKSBlMCA9IGV2ZW50KHgwLHkwKTtcbiAgICB3aGlsZSh4MDx4MSAmJiBpdDxtYXhpdCkge1xuICAgICAgICArK2l0O1xuICAgICAgICBpZih4MCtoPngxKSBoID0geDEteDA7XG4gICAgICAgIGsyID0gZih4MCtjWzBdKmgsICAgICAgICAgICAgICAgIGFkZCh5MCxtdWwoICAgQTIqaCxrMVtpXSkpKTtcbiAgICAgICAgazMgPSBmKHgwK2NbMV0qaCwgICAgICAgICAgICBhZGQoYWRkKHkwLG11bChBM1swXSpoLGsxW2ldKSksbXVsKEEzWzFdKmgsazIpKSk7XG4gICAgICAgIGs0ID0gZih4MCtjWzJdKmgsICAgICAgICBhZGQoYWRkKGFkZCh5MCxtdWwoQTRbMF0qaCxrMVtpXSkpLG11bChBNFsxXSpoLGsyKSksbXVsKEE0WzJdKmgsazMpKSk7XG4gICAgICAgIGs1ID0gZih4MCtjWzNdKmgsICAgIGFkZChhZGQoYWRkKGFkZCh5MCxtdWwoQTVbMF0qaCxrMVtpXSkpLG11bChBNVsxXSpoLGsyKSksbXVsKEE1WzJdKmgsazMpKSxtdWwoQTVbM10qaCxrNCkpKTtcbiAgICAgICAgazYgPSBmKHgwK2NbNF0qaCxhZGQoYWRkKGFkZChhZGQoYWRkKHkwLG11bChBNlswXSpoLGsxW2ldKSksbXVsKEE2WzFdKmgsazIpKSxtdWwoQTZbMl0qaCxrMykpLG11bChBNlszXSpoLGs0KSksbXVsKEE2WzRdKmgsazUpKSk7XG4gICAgICAgIHkxID0gYWRkKGFkZChhZGQoYWRkKGFkZCh5MCxtdWwoazFbaV0saCpiWzBdKSksbXVsKGszLGgqYlsyXSkpLG11bChrNCxoKmJbM10pKSxtdWwoazUsaCpiWzRdKSksbXVsKGs2LGgqYls1XSkpO1xuICAgICAgICBrNyA9IGYoeDAraCx5MSk7XG4gICAgICAgIGVyID0gYWRkKGFkZChhZGQoYWRkKGFkZChtdWwoazFbaV0saCplWzBdKSxtdWwoazMsaCplWzJdKSksbXVsKGs0LGgqZVszXSkpLG11bChrNSxoKmVbNF0pKSxtdWwoazYsaCplWzVdKSksbXVsKGs3LGgqZVs2XSkpO1xuICAgICAgICBpZih0eXBlb2YgZXIgPT09IFwibnVtYmVyXCIpIGVyaW5mID0gYWJzKGVyKTtcbiAgICAgICAgZWxzZSBlcmluZiA9IG5vcm1pbmYoZXIpO1xuICAgICAgICBpZihlcmluZiA+IHRvbCkgeyAvLyByZWplY3RcbiAgICAgICAgICAgIGggPSAwLjIqaCpwb3codG9sL2VyaW5mLDAuMjUpO1xuICAgICAgICAgICAgaWYoeDAraCA9PT0geDApIHtcbiAgICAgICAgICAgICAgICByZXQubXNnID0gXCJTdGVwIHNpemUgYmVjYW1lIHRvbyBzbWFsbFwiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgeW1pZFtpXSA9IGFkZChhZGQoYWRkKGFkZChhZGQoYWRkKHkwLFxuICAgICAgICAgICAgICAgIG11bChrMVtpXSxoKmJtWzBdKSksXG4gICAgICAgICAgICAgICAgbXVsKGszICAgLGgqYm1bMl0pKSxcbiAgICAgICAgICAgICAgICBtdWwoazQgICAsaCpibVszXSkpLFxuICAgICAgICAgICAgICAgIG11bChrNSAgICxoKmJtWzRdKSksXG4gICAgICAgICAgICAgICAgbXVsKGs2ICAgLGgqYm1bNV0pKSxcbiAgICAgICAgICAgICAgICBtdWwoazcgICAsaCpibVs2XSkpO1xuICAgICAgICArK2k7XG4gICAgICAgIHhzW2ldID0geDAraDtcbiAgICAgICAgeXNbaV0gPSB5MTtcbiAgICAgICAgazFbaV0gPSBrNztcbiAgICAgICAgaWYodHlwZW9mIGV2ZW50ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIHZhciB5aSx4bCA9IHgwLHhyID0geDArMC41KmgseGk7XG4gICAgICAgICAgICBlMSA9IGV2ZW50KHhyLHltaWRbaS0xXSk7XG4gICAgICAgICAgICBldiA9IGFuZChsdChlMCwwKSxsdCgwLGUxKSk7XG4gICAgICAgICAgICBpZighYW55KGV2KSkgeyB4bCA9IHhyOyB4ciA9IHgwK2g7IGUwID0gZTE7IGUxID0gZXZlbnQoeHIseTEpOyBldiA9IGFuZChsdChlMCwwKSxsdCgwLGUxKSk7IH1cbiAgICAgICAgICAgIGlmKGFueShldikpIHtcbiAgICAgICAgICAgICAgICB2YXIgeGMsIHljLCBlbixlaTtcbiAgICAgICAgICAgICAgICB2YXIgc2lkZT0wLCBzbCA9IDEuMCwgc3IgPSAxLjA7XG4gICAgICAgICAgICAgICAgd2hpbGUoMSkge1xuICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YgZTAgPT09IFwibnVtYmVyXCIpIHhpID0gKHNyKmUxKnhsLXNsKmUwKnhyKS8oc3IqZTEtc2wqZTApO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHhpID0geHI7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3Ioaj1lMC5sZW5ndGgtMTtqIT09LTE7LS1qKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZTBbal08MCAmJiBlMVtqXT4wKSB4aSA9IG1pbih4aSwoc3IqZTFbal0qeGwtc2wqZTBbal0qeHIpLyhzciplMVtqXS1zbCplMFtqXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmKHhpIDw9IHhsIHx8IHhpID49IHhyKSBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgeWkgPSByZXQuX2F0KHhpLCBpLTEpO1xuICAgICAgICAgICAgICAgICAgICBlaSA9IGV2ZW50KHhpLHlpKTtcbiAgICAgICAgICAgICAgICAgICAgZW4gPSBhbmQobHQoZTAsMCksbHQoMCxlaSkpO1xuICAgICAgICAgICAgICAgICAgICBpZihhbnkoZW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4ciA9IHhpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZTEgPSBlaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ID0gZW47XG4gICAgICAgICAgICAgICAgICAgICAgICBzciA9IDEuMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNpZGUgPT09IC0xKSBzbCAqPSAwLjU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHNsID0gMS4wO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2lkZSA9IC0xO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgeGwgPSB4aTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUwID0gZWk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzbCA9IDEuMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNpZGUgPT09IDEpIHNyICo9IDAuNTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugc3IgPSAxLjA7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaWRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB5MSA9IHJldC5fYXQoMC41Kih4MCt4aSksaS0xKTtcbiAgICAgICAgICAgICAgICByZXQuZltpXSA9IGYoeGkseWkpO1xuICAgICAgICAgICAgICAgIHJldC54W2ldID0geGk7XG4gICAgICAgICAgICAgICAgcmV0LnlbaV0gPSB5aTtcbiAgICAgICAgICAgICAgICByZXQueW1pZFtpLTFdID0geTE7XG4gICAgICAgICAgICAgICAgcmV0LmV2ZW50cyA9IGV2O1xuICAgICAgICAgICAgICAgIHJldC5pdGVyYXRpb25zID0gaXQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB4MCArPSBoO1xuICAgICAgICB5MCA9IHkxO1xuICAgICAgICBlMCA9IGUxO1xuICAgICAgICBoID0gbWluKDAuOCpoKnBvdyh0b2wvZXJpbmYsMC4yNSksNCpoKTtcbiAgICB9XG4gICAgcmV0Lml0ZXJhdGlvbnMgPSBpdDtcbiAgICByZXR1cm4gcmV0O1xufVxuXG4vLyAxMS4gQXggPSBiXG5udW1lcmljLkxVID0gZnVuY3Rpb24oQSwgZmFzdCkge1xuICBmYXN0ID0gZmFzdCB8fCBmYWxzZTtcblxuICB2YXIgYWJzID0gTWF0aC5hYnM7XG4gIHZhciBpLCBqLCBrLCBhYnNBamssIEFraywgQWssIFBrLCBBaTtcbiAgdmFyIG1heDtcbiAgdmFyIG4gPSBBLmxlbmd0aCwgbjEgPSBuLTE7XG4gIHZhciBQID0gbmV3IEFycmF5KG4pO1xuICBpZighZmFzdCkgQSA9IG51bWVyaWMuY2xvbmUoQSk7XG5cbiAgZm9yIChrID0gMDsgayA8IG47ICsraykge1xuICAgIFBrID0gaztcbiAgICBBayA9IEFba107XG4gICAgbWF4ID0gYWJzKEFrW2tdKTtcbiAgICBmb3IgKGogPSBrICsgMTsgaiA8IG47ICsraikge1xuICAgICAgYWJzQWprID0gYWJzKEFbal1ba10pO1xuICAgICAgaWYgKG1heCA8IGFic0Fqaykge1xuICAgICAgICBtYXggPSBhYnNBams7XG4gICAgICAgIFBrID0gajtcbiAgICAgIH1cbiAgICB9XG4gICAgUFtrXSA9IFBrO1xuXG4gICAgaWYgKFBrICE9IGspIHtcbiAgICAgIEFba10gPSBBW1BrXTtcbiAgICAgIEFbUGtdID0gQWs7XG4gICAgICBBayA9IEFba107XG4gICAgfVxuXG4gICAgQWtrID0gQWtba107XG5cbiAgICBmb3IgKGkgPSBrICsgMTsgaSA8IG47ICsraSkge1xuICAgICAgQVtpXVtrXSAvPSBBa2s7XG4gICAgfVxuXG4gICAgZm9yIChpID0gayArIDE7IGkgPCBuOyArK2kpIHtcbiAgICAgIEFpID0gQVtpXTtcbiAgICAgIGZvciAoaiA9IGsgKyAxOyBqIDwgbjE7ICsraikge1xuICAgICAgICBBaVtqXSAtPSBBaVtrXSAqIEFrW2pdO1xuICAgICAgICArK2o7XG4gICAgICAgIEFpW2pdIC09IEFpW2tdICogQWtbal07XG4gICAgICB9XG4gICAgICBpZihqPT09bjEpIEFpW2pdIC09IEFpW2tdICogQWtbal07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBMVTogQSxcbiAgICBQOiAgUFxuICB9O1xufVxuXG5udW1lcmljLkxVc29sdmUgPSBmdW5jdGlvbiBMVXNvbHZlKExVUCwgYikge1xuICB2YXIgaSwgajtcbiAgdmFyIExVID0gTFVQLkxVO1xuICB2YXIgbiAgID0gTFUubGVuZ3RoO1xuICB2YXIgeCA9IG51bWVyaWMuY2xvbmUoYik7XG4gIHZhciBQICAgPSBMVVAuUDtcbiAgdmFyIFBpLCBMVWksIExVaWksIHRtcDtcblxuICBmb3IgKGk9bi0xO2khPT0tMTstLWkpIHhbaV0gPSBiW2ldO1xuICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgUGkgPSBQW2ldO1xuICAgIGlmIChQW2ldICE9PSBpKSB7XG4gICAgICB0bXAgPSB4W2ldO1xuICAgICAgeFtpXSA9IHhbUGldO1xuICAgICAgeFtQaV0gPSB0bXA7XG4gICAgfVxuXG4gICAgTFVpID0gTFVbaV07XG4gICAgZm9yIChqID0gMDsgaiA8IGk7ICsraikge1xuICAgICAgeFtpXSAtPSB4W2pdICogTFVpW2pdO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoaSA9IG4gLSAxOyBpID49IDA7IC0taSkge1xuICAgIExVaSA9IExVW2ldO1xuICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgbjsgKytqKSB7XG4gICAgICB4W2ldIC09IHhbal0gKiBMVWlbal07XG4gICAgfVxuXG4gICAgeFtpXSAvPSBMVWlbaV07XG4gIH1cblxuICByZXR1cm4geDtcbn1cblxubnVtZXJpYy5zb2x2ZSA9IGZ1bmN0aW9uIHNvbHZlKEEsYixmYXN0KSB7IHJldHVybiBudW1lcmljLkxVc29sdmUobnVtZXJpYy5MVShBLGZhc3QpLCBiKTsgfVxuXG4vLyAxMi4gTGluZWFyIHByb2dyYW1taW5nXG5udW1lcmljLmVjaGVsb25pemUgPSBmdW5jdGlvbiBlY2hlbG9uaXplKEEpIHtcbiAgICB2YXIgcyA9IG51bWVyaWMuZGltKEEpLCBtID0gc1swXSwgbiA9IHNbMV07XG4gICAgdmFyIEkgPSBudW1lcmljLmlkZW50aXR5KG0pO1xuICAgIHZhciBQID0gQXJyYXkobSk7XG4gICAgdmFyIGksaixrLGwsQWksSWksWixhO1xuICAgIHZhciBhYnMgPSBNYXRoLmFicztcbiAgICB2YXIgZGl2ZXEgPSBudW1lcmljLmRpdmVxO1xuICAgIEEgPSBudW1lcmljLmNsb25lKEEpO1xuICAgIGZvcihpPTA7aTxtOysraSkge1xuICAgICAgICBrID0gMDtcbiAgICAgICAgQWkgPSBBW2ldO1xuICAgICAgICBJaSA9IElbaV07XG4gICAgICAgIGZvcihqPTE7ajxuOysraikgaWYoYWJzKEFpW2tdKTxhYnMoQWlbal0pKSBrPWo7XG4gICAgICAgIFBbaV0gPSBrO1xuICAgICAgICBkaXZlcShJaSxBaVtrXSk7XG4gICAgICAgIGRpdmVxKEFpLEFpW2tdKTtcbiAgICAgICAgZm9yKGo9MDtqPG07KytqKSBpZihqIT09aSkge1xuICAgICAgICAgICAgWiA9IEFbal07IGEgPSBaW2tdO1xuICAgICAgICAgICAgZm9yKGw9bi0xO2whPT0tMTstLWwpIFpbbF0gLT0gQWlbbF0qYTtcbiAgICAgICAgICAgIFogPSBJW2pdO1xuICAgICAgICAgICAgZm9yKGw9bS0xO2whPT0tMTstLWwpIFpbbF0gLT0gSWlbbF0qYTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge0k6SSwgQTpBLCBQOlB9O1xufVxuXG5udW1lcmljLl9fc29sdmVMUCA9IGZ1bmN0aW9uIF9fc29sdmVMUChjLEEsYix0b2wsbWF4aXQseCxmbGFnKSB7XG4gICAgdmFyIHN1bSA9IG51bWVyaWMuc3VtLCBsb2cgPSBudW1lcmljLmxvZywgbXVsID0gbnVtZXJpYy5tdWwsIHN1YiA9IG51bWVyaWMuc3ViLCBkb3QgPSBudW1lcmljLmRvdCwgZGl2ID0gbnVtZXJpYy5kaXYsIGFkZCA9IG51bWVyaWMuYWRkO1xuICAgIHZhciBtID0gYy5sZW5ndGgsIG4gPSBiLmxlbmd0aCx5O1xuICAgIHZhciB1bmJvdW5kZWQgPSBmYWxzZSwgY2IsaTA9MDtcbiAgICB2YXIgYWxwaGEgPSAxLjA7XG4gICAgdmFyIGYwLGRmMCxBVCA9IG51bWVyaWMudHJhbnNwb3NlKEEpLCBzdmQgPSBudW1lcmljLnN2ZCx0cmFuc3Bvc2UgPSBudW1lcmljLnRyYW5zcG9zZSxsZXEgPSBudW1lcmljLmxlcSwgc3FydCA9IE1hdGguc3FydCwgYWJzID0gTWF0aC5hYnM7XG4gICAgdmFyIG11bGVxID0gbnVtZXJpYy5tdWxlcTtcbiAgICB2YXIgbm9ybSA9IG51bWVyaWMubm9ybWluZiwgYW55ID0gbnVtZXJpYy5hbnksbWluID0gTWF0aC5taW47XG4gICAgdmFyIGFsbCA9IG51bWVyaWMuYWxsLCBndCA9IG51bWVyaWMuZ3Q7XG4gICAgdmFyIHAgPSBBcnJheShtKSwgQTAgPSBBcnJheShuKSxlPW51bWVyaWMucmVwKFtuXSwxKSwgSDtcbiAgICB2YXIgc29sdmUgPSBudW1lcmljLnNvbHZlLCB6ID0gc3ViKGIsZG90KEEseCkpLGNvdW50O1xuICAgIHZhciBkb3RjYyA9IGRvdChjLGMpO1xuICAgIHZhciBnO1xuICAgIGZvcihjb3VudD1pMDtjb3VudDxtYXhpdDsrK2NvdW50KSB7XG4gICAgICAgIHZhciBpLGosZDtcbiAgICAgICAgZm9yKGk9bi0xO2khPT0tMTstLWkpIEEwW2ldID0gZGl2KEFbaV0seltpXSk7XG4gICAgICAgIHZhciBBMSA9IHRyYW5zcG9zZShBMCk7XG4gICAgICAgIGZvcihpPW0tMTtpIT09LTE7LS1pKSBwW2ldID0gKC8qeFtpXSsqL3N1bShBMVtpXSkpO1xuICAgICAgICBhbHBoYSA9IDAuMjUqYWJzKGRvdGNjL2RvdChjLHApKTtcbiAgICAgICAgdmFyIGExID0gMTAwKnNxcnQoZG90Y2MvZG90KHAscCkpO1xuICAgICAgICBpZighaXNGaW5pdGUoYWxwaGEpIHx8IGFscGhhPmExKSBhbHBoYSA9IGExO1xuICAgICAgICBnID0gYWRkKGMsbXVsKGFscGhhLHApKTtcbiAgICAgICAgSCA9IGRvdChBMSxBMCk7XG4gICAgICAgIGZvcihpPW0tMTtpIT09LTE7LS1pKSBIW2ldW2ldICs9IDE7XG4gICAgICAgIGQgPSBzb2x2ZShILGRpdihnLGFscGhhKSx0cnVlKTtcbiAgICAgICAgdmFyIHQwID0gZGl2KHosZG90KEEsZCkpO1xuICAgICAgICB2YXIgdCA9IDEuMDtcbiAgICAgICAgZm9yKGk9bi0xO2khPT0tMTstLWkpIGlmKHQwW2ldPDApIHQgPSBtaW4odCwtMC45OTkqdDBbaV0pO1xuICAgICAgICB5ID0gc3ViKHgsbXVsKGQsdCkpO1xuICAgICAgICB6ID0gc3ViKGIsZG90KEEseSkpO1xuICAgICAgICBpZighYWxsKGd0KHosMCkpKSByZXR1cm4geyBzb2x1dGlvbjogeCwgbWVzc2FnZTogXCJcIiwgaXRlcmF0aW9uczogY291bnQgfTtcbiAgICAgICAgeCA9IHk7XG4gICAgICAgIGlmKGFscGhhPHRvbCkgcmV0dXJuIHsgc29sdXRpb246IHksIG1lc3NhZ2U6IFwiXCIsIGl0ZXJhdGlvbnM6IGNvdW50IH07XG4gICAgICAgIGlmKGZsYWcpIHtcbiAgICAgICAgICAgIHZhciBzID0gZG90KGMsZyksIEFnID0gZG90KEEsZyk7XG4gICAgICAgICAgICB1bmJvdW5kZWQgPSB0cnVlO1xuICAgICAgICAgICAgZm9yKGk9bi0xO2khPT0tMTstLWkpIGlmKHMqQWdbaV08MCkgeyB1bmJvdW5kZWQgPSBmYWxzZTsgYnJlYWs7IH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmKHhbbS0xXT49MCkgdW5ib3VuZGVkID0gZmFsc2U7XG4gICAgICAgICAgICBlbHNlIHVuYm91bmRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYodW5ib3VuZGVkKSByZXR1cm4geyBzb2x1dGlvbjogeSwgbWVzc2FnZTogXCJVbmJvdW5kZWRcIiwgaXRlcmF0aW9uczogY291bnQgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgc29sdXRpb246IHgsIG1lc3NhZ2U6IFwibWF4aW11bSBpdGVyYXRpb24gY291bnQgZXhjZWVkZWRcIiwgaXRlcmF0aW9uczpjb3VudCB9O1xufVxuXG5udW1lcmljLl9zb2x2ZUxQID0gZnVuY3Rpb24gX3NvbHZlTFAoYyxBLGIsdG9sLG1heGl0KSB7XG4gICAgdmFyIG0gPSBjLmxlbmd0aCwgbiA9IGIubGVuZ3RoLHk7XG4gICAgdmFyIHN1bSA9IG51bWVyaWMuc3VtLCBsb2cgPSBudW1lcmljLmxvZywgbXVsID0gbnVtZXJpYy5tdWwsIHN1YiA9IG51bWVyaWMuc3ViLCBkb3QgPSBudW1lcmljLmRvdCwgZGl2ID0gbnVtZXJpYy5kaXYsIGFkZCA9IG51bWVyaWMuYWRkO1xuICAgIHZhciBjMCA9IG51bWVyaWMucmVwKFttXSwwKS5jb25jYXQoWzFdKTtcbiAgICB2YXIgSiA9IG51bWVyaWMucmVwKFtuLDFdLC0xKTtcbiAgICB2YXIgQTAgPSBudW1lcmljLmJsb2NrTWF0cml4KFtbQSAgICAgICAgICAgICAgICAgICAsICAgSiAgXV0pO1xuICAgIHZhciBiMCA9IGI7XG4gICAgdmFyIHkgPSBudW1lcmljLnJlcChbbV0sMCkuY29uY2F0KE1hdGgubWF4KDAsbnVtZXJpYy5zdXAobnVtZXJpYy5uZWcoYikpKSsxKTtcbiAgICB2YXIgeDAgPSBudW1lcmljLl9fc29sdmVMUChjMCxBMCxiMCx0b2wsbWF4aXQseSxmYWxzZSk7XG4gICAgdmFyIHggPSBudW1lcmljLmNsb25lKHgwLnNvbHV0aW9uKTtcbiAgICB4Lmxlbmd0aCA9IG07XG4gICAgdmFyIGZvbyA9IG51bWVyaWMuaW5mKHN1YihiLGRvdChBLHgpKSk7XG4gICAgaWYoZm9vPDApIHsgcmV0dXJuIHsgc29sdXRpb246IE5hTiwgbWVzc2FnZTogXCJJbmZlYXNpYmxlXCIsIGl0ZXJhdGlvbnM6IHgwLml0ZXJhdGlvbnMgfTsgfVxuICAgIHZhciByZXQgPSBudW1lcmljLl9fc29sdmVMUChjLCBBLCBiLCB0b2wsIG1heGl0LXgwLml0ZXJhdGlvbnMsIHgsIHRydWUpO1xuICAgIHJldC5pdGVyYXRpb25zICs9IHgwLml0ZXJhdGlvbnM7XG4gICAgcmV0dXJuIHJldDtcbn07XG5cbm51bWVyaWMuc29sdmVMUCA9IGZ1bmN0aW9uIHNvbHZlTFAoYyxBLGIsQWVxLGJlcSx0b2wsbWF4aXQpIHtcbiAgICBpZih0eXBlb2YgbWF4aXQgPT09IFwidW5kZWZpbmVkXCIpIG1heGl0ID0gMTAwMDtcbiAgICBpZih0eXBlb2YgdG9sID09PSBcInVuZGVmaW5lZFwiKSB0b2wgPSBudW1lcmljLmVwc2lsb247XG4gICAgaWYodHlwZW9mIEFlcSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIG51bWVyaWMuX3NvbHZlTFAoYyxBLGIsdG9sLG1heGl0KTtcbiAgICB2YXIgbSA9IEFlcS5sZW5ndGgsIG4gPSBBZXFbMF0ubGVuZ3RoLCBvID0gQS5sZW5ndGg7XG4gICAgdmFyIEIgPSBudW1lcmljLmVjaGVsb25pemUoQWVxKTtcbiAgICB2YXIgZmxhZ3MgPSBudW1lcmljLnJlcChbbl0sMCk7XG4gICAgdmFyIFAgPSBCLlA7XG4gICAgdmFyIFEgPSBbXTtcbiAgICB2YXIgaTtcbiAgICBmb3IoaT1QLmxlbmd0aC0xO2khPT0tMTstLWkpIGZsYWdzW1BbaV1dID0gMTtcbiAgICBmb3IoaT1uLTE7aSE9PS0xOy0taSkgaWYoZmxhZ3NbaV09PT0wKSBRLnB1c2goaSk7XG4gICAgdmFyIGcgPSBudW1lcmljLmdldFJhbmdlO1xuICAgIHZhciBJID0gbnVtZXJpYy5saW5zcGFjZSgwLG0tMSksIEogPSBudW1lcmljLmxpbnNwYWNlKDAsby0xKTtcbiAgICB2YXIgQWVxMiA9IGcoQWVxLEksUSksIEExID0gZyhBLEosUCksIEEyID0gZyhBLEosUSksIGRvdCA9IG51bWVyaWMuZG90LCBzdWIgPSBudW1lcmljLnN1YjtcbiAgICB2YXIgQTMgPSBkb3QoQTEsQi5JKTtcbiAgICB2YXIgQTQgPSBzdWIoQTIsZG90KEEzLEFlcTIpKSwgYjQgPSBzdWIoYixkb3QoQTMsYmVxKSk7XG4gICAgdmFyIGMxID0gQXJyYXkoUC5sZW5ndGgpLCBjMiA9IEFycmF5KFEubGVuZ3RoKTtcbiAgICBmb3IoaT1QLmxlbmd0aC0xO2khPT0tMTstLWkpIGMxW2ldID0gY1tQW2ldXTtcbiAgICBmb3IoaT1RLmxlbmd0aC0xO2khPT0tMTstLWkpIGMyW2ldID0gY1tRW2ldXTtcbiAgICB2YXIgYzQgPSBzdWIoYzIsZG90KGMxLGRvdChCLkksQWVxMikpKTtcbiAgICB2YXIgUyA9IG51bWVyaWMuX3NvbHZlTFAoYzQsQTQsYjQsdG9sLG1heGl0KTtcbiAgICB2YXIgeDIgPSBTLnNvbHV0aW9uO1xuICAgIGlmKHgyIT09eDIpIHJldHVybiBTO1xuICAgIHZhciB4MSA9IGRvdChCLkksc3ViKGJlcSxkb3QoQWVxMix4MikpKTtcbiAgICB2YXIgeCA9IEFycmF5KGMubGVuZ3RoKTtcbiAgICBmb3IoaT1QLmxlbmd0aC0xO2khPT0tMTstLWkpIHhbUFtpXV0gPSB4MVtpXTtcbiAgICBmb3IoaT1RLmxlbmd0aC0xO2khPT0tMTstLWkpIHhbUVtpXV0gPSB4MltpXTtcbiAgICByZXR1cm4geyBzb2x1dGlvbjogeCwgbWVzc2FnZTpTLm1lc3NhZ2UsIGl0ZXJhdGlvbnM6IFMuaXRlcmF0aW9ucyB9O1xufVxuXG5udW1lcmljLk1QU3RvTFAgPSBmdW5jdGlvbiBNUFN0b0xQKE1QUykge1xuICAgIGlmKE1QUyBpbnN0YW5jZW9mIFN0cmluZykgeyBNUFMuc3BsaXQoJ1xcbicpOyB9XG4gICAgdmFyIHN0YXRlID0gMDtcbiAgICB2YXIgc3RhdGVzID0gWydJbml0aWFsIHN0YXRlJywnTkFNRScsJ1JPV1MnLCdDT0xVTU5TJywnUkhTJywnQk9VTkRTJywnRU5EQVRBJ107XG4gICAgdmFyIG4gPSBNUFMubGVuZ3RoO1xuICAgIHZhciBpLGoseixOPTAscm93cyA9IHt9LCBzaWduID0gW10sIHJsID0gMCwgdmFycyA9IHt9LCBudiA9IDA7XG4gICAgdmFyIG5hbWU7XG4gICAgdmFyIGMgPSBbXSwgQSA9IFtdLCBiID0gW107XG4gICAgZnVuY3Rpb24gZXJyKGUpIHsgdGhyb3cgbmV3IEVycm9yKCdNUFN0b0xQOiAnK2UrJ1xcbkxpbmUgJytpKyc6ICcrTVBTW2ldKydcXG5DdXJyZW50IHN0YXRlOiAnK3N0YXRlc1tzdGF0ZV0rJ1xcbicpOyB9XG4gICAgZm9yKGk9MDtpPG47KytpKSB7XG4gICAgICAgIHogPSBNUFNbaV07XG4gICAgICAgIHZhciB3MCA9IHoubWF0Y2goL1xcUyovZyk7XG4gICAgICAgIHZhciB3ID0gW107XG4gICAgICAgIGZvcihqPTA7ajx3MC5sZW5ndGg7KytqKSBpZih3MFtqXSE9PVwiXCIpIHcucHVzaCh3MFtqXSk7XG4gICAgICAgIGlmKHcubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgZm9yKGo9MDtqPHN0YXRlcy5sZW5ndGg7KytqKSBpZih6LnN1YnN0cigwLHN0YXRlc1tqXS5sZW5ndGgpID09PSBzdGF0ZXNbal0pIGJyZWFrO1xuICAgICAgICBpZihqPHN0YXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHN0YXRlID0gajtcbiAgICAgICAgICAgIGlmKGo9PT0xKSB7IG5hbWUgPSB3WzFdOyB9XG4gICAgICAgICAgICBpZihqPT09NikgcmV0dXJuIHsgbmFtZTpuYW1lLCBjOmMsIEE6bnVtZXJpYy50cmFuc3Bvc2UoQSksIGI6Yiwgcm93czpyb3dzLCB2YXJzOnZhcnMgfTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaChzdGF0ZSkge1xuICAgICAgICBjYXNlIDA6IGNhc2UgMTogZXJyKCdVbmV4cGVjdGVkIGxpbmUnKTtcbiAgICAgICAgY2FzZSAyOiBcbiAgICAgICAgICAgIHN3aXRjaCh3WzBdKSB7XG4gICAgICAgICAgICBjYXNlICdOJzogaWYoTj09PTApIE4gPSB3WzFdOyBlbHNlIGVycignVHdvIG9yIG1vcmUgTiByb3dzJyk7IGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnTCc6IHJvd3Nbd1sxXV0gPSBybDsgc2lnbltybF0gPSAxOyBiW3JsXSA9IDA7ICsrcmw7IGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRyc6IHJvd3Nbd1sxXV0gPSBybDsgc2lnbltybF0gPSAtMTtiW3JsXSA9IDA7ICsrcmw7IGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnRSc6IHJvd3Nbd1sxXV0gPSBybDsgc2lnbltybF0gPSAwO2JbcmxdID0gMDsgKytybDsgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiBlcnIoJ1BhcnNlIGVycm9yICcrbnVtZXJpYy5wcmV0dHlQcmludCh3KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgaWYoIXZhcnMuaGFzT3duUHJvcGVydHkod1swXSkpIHsgdmFyc1t3WzBdXSA9IG52OyBjW252XSA9IDA7IEFbbnZdID0gbnVtZXJpYy5yZXAoW3JsXSwwKTsgKytudjsgfVxuICAgICAgICAgICAgdmFyIHAgPSB2YXJzW3dbMF1dO1xuICAgICAgICAgICAgZm9yKGo9MTtqPHcubGVuZ3RoO2orPTIpIHtcbiAgICAgICAgICAgICAgICBpZih3W2pdID09PSBOKSB7IGNbcF0gPSBwYXJzZUZsb2F0KHdbaisxXSk7IGNvbnRpbnVlOyB9XG4gICAgICAgICAgICAgICAgdmFyIHEgPSByb3dzW3dbal1dO1xuICAgICAgICAgICAgICAgIEFbcF1bcV0gPSAoc2lnbltxXTwwPy0xOjEpKnBhcnNlRmxvYXQod1tqKzFdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICBmb3Ioaj0xO2o8dy5sZW5ndGg7ais9MikgYltyb3dzW3dbal1dXSA9IChzaWduW3Jvd3Nbd1tqXV1dPDA/LTE6MSkqcGFyc2VGbG9hdCh3W2orMV0pO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTogLypGSVhNRSovIGJyZWFrO1xuICAgICAgICBjYXNlIDY6IGVycignSW50ZXJuYWwgZXJyb3InKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlcnIoJ1JlYWNoZWQgZW5kIG9mIGZpbGUgd2l0aG91dCBFTkRBVEEnKTtcbn1cbi8vIHNlZWRyYW5kb20uanMgdmVyc2lvbiAyLjAuXG4vLyBBdXRob3I6IERhdmlkIEJhdSA0LzIvMjAxMVxuLy9cbi8vIERlZmluZXMgYSBtZXRob2QgTWF0aC5zZWVkcmFuZG9tKCkgdGhhdCwgd2hlbiBjYWxsZWQsIHN1YnN0aXR1dGVzXG4vLyBhbiBleHBsaWNpdGx5IHNlZWRlZCBSQzQtYmFzZWQgYWxnb3JpdGhtIGZvciBNYXRoLnJhbmRvbSgpLiAgQWxzb1xuLy8gc3VwcG9ydHMgYXV0b21hdGljIHNlZWRpbmcgZnJvbSBsb2NhbCBvciBuZXR3b3JrIHNvdXJjZXMgb2YgZW50cm9weS5cbi8vXG4vLyBVc2FnZTpcbi8vXG4vLyAgIDxzY3JpcHQgc3JjPWh0dHA6Ly9kYXZpZGJhdS5jb20vZW5jb2RlL3NlZWRyYW5kb20tbWluLmpzPjwvc2NyaXB0PlxuLy9cbi8vICAgTWF0aC5zZWVkcmFuZG9tKCd5aXBlZScpOyBTZXRzIE1hdGgucmFuZG9tIHRvIGEgZnVuY3Rpb24gdGhhdCBpc1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkIHVzaW5nIHRoZSBnaXZlbiBleHBsaWNpdCBzZWVkLlxuLy9cbi8vICAgTWF0aC5zZWVkcmFuZG9tKCk7ICAgICAgICBTZXRzIE1hdGgucmFuZG9tIHRvIGEgZnVuY3Rpb24gdGhhdCBpc1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZWRlZCB1c2luZyB0aGUgY3VycmVudCB0aW1lLCBkb20gc3RhdGUsXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG90aGVyIGFjY3VtdWxhdGVkIGxvY2FsIGVudHJvcHkuXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGdlbmVyYXRlZCBzZWVkIHN0cmluZyBpcyByZXR1cm5lZC5cbi8vXG4vLyAgIE1hdGguc2VlZHJhbmRvbSgneW93emEnLCB0cnVlKTtcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWVkcyB1c2luZyB0aGUgZ2l2ZW4gZXhwbGljaXQgc2VlZCBtaXhlZFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZ2V0aGVyIHdpdGggYWNjdW11bGF0ZWQgZW50cm9weS5cbi8vXG4vLyAgIDxzY3JpcHQgc3JjPVwiaHR0cDovL2JpdC5seS9zcmFuZG9tLTUxMlwiPjwvc2NyaXB0PlxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZWRzIHVzaW5nIHBoeXNpY2FsIHJhbmRvbSBiaXRzIGRvd25sb2FkZWRcbi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHJhbmRvbS5vcmcuXG4vL1xuLy8gICA8c2NyaXB0IHNyYz1cImh0dHBzOi8vanNvbmxpYi5hcHBzcG90LmNvbS91cmFuZG9tP2NhbGxiYWNrPU1hdGguc2VlZHJhbmRvbVwiPlxuLy8gICA8L3NjcmlwdD4gICAgICAgICAgICAgICAgIFNlZWRzIHVzaW5nIHVyYW5kb20gYml0cyBmcm9tIGNhbGwuanNvbmxpYi5jb20sXG4vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggaXMgZmFzdGVyIHRoYW4gcmFuZG9tLm9yZy5cbi8vXG4vLyBFeGFtcGxlczpcbi8vXG4vLyAgIE1hdGguc2VlZHJhbmRvbShcImhlbGxvXCIpOyAgICAgICAgICAgIC8vIFVzZSBcImhlbGxvXCIgYXMgdGhlIHNlZWQuXG4vLyAgIGRvY3VtZW50LndyaXRlKE1hdGgucmFuZG9tKCkpOyAgICAgICAvLyBBbHdheXMgMC41NDYzNjYzNzY4MTQwNzM0XG4vLyAgIGRvY3VtZW50LndyaXRlKE1hdGgucmFuZG9tKCkpOyAgICAgICAvLyBBbHdheXMgMC40Mzk3Mzc5Mzc3MDU5MjIzNFxuLy8gICB2YXIgcm5nMSA9IE1hdGgucmFuZG9tOyAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhlIGN1cnJlbnQgcHJuZy5cbi8vXG4vLyAgIHZhciBhdXRvc2VlZCA9IE1hdGguc2VlZHJhbmRvbSgpOyAgICAvLyBOZXcgcHJuZyB3aXRoIGFuIGF1dG9tYXRpYyBzZWVkLlxuLy8gICBkb2N1bWVudC53cml0ZShNYXRoLnJhbmRvbSgpKTsgICAgICAgLy8gUHJldHR5IG11Y2ggdW5wcmVkaWN0YWJsZS5cbi8vXG4vLyAgIE1hdGgucmFuZG9tID0gcm5nMTsgICAgICAgICAgICAgICAgICAvLyBDb250aW51ZSBcImhlbGxvXCIgcHJuZyBzZXF1ZW5jZS5cbi8vICAgZG9jdW1lbnQud3JpdGUoTWF0aC5yYW5kb20oKSk7ICAgICAgIC8vIEFsd2F5cyAwLjU1NDc2OTQzMjQ3MzQ1NVxuLy9cbi8vICAgTWF0aC5zZWVkcmFuZG9tKGF1dG9zZWVkKTsgICAgICAgICAgIC8vIFJlc3RhcnQgYXQgdGhlIHByZXZpb3VzIHNlZWQuXG4vLyAgIGRvY3VtZW50LndyaXRlKE1hdGgucmFuZG9tKCkpOyAgICAgICAvLyBSZXBlYXQgdGhlICd1bnByZWRpY3RhYmxlJyB2YWx1ZS5cbi8vXG4vLyBOb3Rlczpcbi8vXG4vLyBFYWNoIHRpbWUgc2VlZHJhbmRvbSgnYXJnJykgaXMgY2FsbGVkLCBlbnRyb3B5IGZyb20gdGhlIHBhc3NlZCBzZWVkXG4vLyBpcyBhY2N1bXVsYXRlZCBpbiBhIHBvb2wgdG8gaGVscCBnZW5lcmF0ZSBmdXR1cmUgc2VlZHMgZm9yIHRoZVxuLy8gemVyby1hcmd1bWVudCBmb3JtIG9mIE1hdGguc2VlZHJhbmRvbSwgc28gZW50cm9weSBjYW4gYmUgaW5qZWN0ZWQgb3ZlclxuLy8gdGltZSBieSBjYWxsaW5nIHNlZWRyYW5kb20gd2l0aCBleHBsaWNpdCBkYXRhIHJlcGVhdGVkbHkuXG4vL1xuLy8gT24gc3BlZWQgLSBUaGlzIGphdmFzY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgTWF0aC5yYW5kb20oKSBpcyBhYm91dFxuLy8gMy0xMHggc2xvd2VyIHRoYW4gdGhlIGJ1aWx0LWluIE1hdGgucmFuZG9tKCkgYmVjYXVzZSBpdCBpcyBub3QgbmF0aXZlXG4vLyBjb2RlLCBidXQgdGhpcyBpcyB0eXBpY2FsbHkgZmFzdCBlbm91Z2ggYW55d2F5LiAgU2VlZGluZyBpcyBtb3JlIGV4cGVuc2l2ZSxcbi8vIGVzcGVjaWFsbHkgaWYgeW91IHVzZSBhdXRvLXNlZWRpbmcuICBTb21lIGRldGFpbHMgKHRpbWluZ3Mgb24gQ2hyb21lIDQpOlxuLy9cbi8vIE91ciBNYXRoLnJhbmRvbSgpICAgICAgICAgICAgLSBhdmcgbGVzcyB0aGFuIDAuMDAyIG1pbGxpc2Vjb25kcyBwZXIgY2FsbFxuLy8gc2VlZHJhbmRvbSgnZXhwbGljaXQnKSAgICAgICAtIGF2ZyBsZXNzIHRoYW4gMC41IG1pbGxpc2Vjb25kcyBwZXIgY2FsbFxuLy8gc2VlZHJhbmRvbSgnZXhwbGljaXQnLCB0cnVlKSAtIGF2ZyBsZXNzIHRoYW4gMiBtaWxsaXNlY29uZHMgcGVyIGNhbGxcbi8vIHNlZWRyYW5kb20oKSAgICAgICAgICAgICAgICAgLSBhdmcgYWJvdXQgMzggbWlsbGlzZWNvbmRzIHBlciBjYWxsXG4vL1xuLy8gTElDRU5TRSAoQlNEKTpcbi8vXG4vLyBDb3B5cmlnaHQgMjAxMCBEYXZpZCBCYXUsIGFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0XG4vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDpcbi8vIFxuLy8gICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodFxuLy8gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuXG4vL1xuLy8gICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodFxuLy8gICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlXG4vLyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uXG4vLyBcbi8vICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGlzIG1vZHVsZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5XG4vLyAgICAgIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlXG4vLyAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLlxuLy8gXG4vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTXG4vLyBcIkFTIElTXCIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UXG4vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Jcbi8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUXG4vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxcbi8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Rcbi8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLFxuLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZXG4vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUXG4vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Vcbi8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuXG4vL1xuLyoqXG4gKiBBbGwgY29kZSBpcyBpbiBhbiBhbm9ueW1vdXMgY2xvc3VyZSB0byBrZWVwIHRoZSBnbG9iYWwgbmFtZXNwYWNlIGNsZWFuLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyPX0gb3ZlcmZsb3cgXG4gKiBAcGFyYW0ge251bWJlcj19IHN0YXJ0ZGVub21cbiAqL1xuXG4vLyBQYXRjaGVkIGJ5IFNlYiBzbyB0aGF0IHNlZWRyYW5kb20uanMgZG9lcyBub3QgcG9sbHV0ZSB0aGUgTWF0aCBvYmplY3QuXG4vLyBNeSB0ZXN0cyBzdWdnZXN0IHRoYXQgZG9pbmcgTWF0aC50cm91YmxlID0gMSBtYWtlcyBNYXRoIGxvb2t1cHMgYWJvdXQgNSVcbi8vIHNsb3dlci5cbm51bWVyaWMuc2VlZHJhbmRvbSA9IHsgcG93Ok1hdGgucG93LCByYW5kb206TWF0aC5yYW5kb20gfTtcblxuKGZ1bmN0aW9uIChwb29sLCBtYXRoLCB3aWR0aCwgY2h1bmtzLCBzaWduaWZpY2FuY2UsIG92ZXJmbG93LCBzdGFydGRlbm9tKSB7XG5cblxuLy9cbi8vIHNlZWRyYW5kb20oKVxuLy8gVGhpcyBpcyB0aGUgc2VlZHJhbmRvbSBmdW5jdGlvbiBkZXNjcmliZWQgYWJvdmUuXG4vL1xubWF0aFsnc2VlZHJhbmRvbSddID0gZnVuY3Rpb24gc2VlZHJhbmRvbShzZWVkLCB1c2VfZW50cm9weSkge1xuICB2YXIga2V5ID0gW107XG4gIHZhciBhcmM0O1xuXG4gIC8vIEZsYXR0ZW4gdGhlIHNlZWQgc3RyaW5nIG9yIGJ1aWxkIG9uZSBmcm9tIGxvY2FsIGVudHJvcHkgaWYgbmVlZGVkLlxuICBzZWVkID0gbWl4a2V5KGZsYXR0ZW4oXG4gICAgdXNlX2VudHJvcHkgPyBbc2VlZCwgcG9vbF0gOlxuICAgIGFyZ3VtZW50cy5sZW5ndGggPyBzZWVkIDpcbiAgICBbbmV3IERhdGUoKS5nZXRUaW1lKCksIHBvb2wsIHdpbmRvd10sIDMpLCBrZXkpO1xuXG4gIC8vIFVzZSB0aGUgc2VlZCB0byBpbml0aWFsaXplIGFuIEFSQzQgZ2VuZXJhdG9yLlxuICBhcmM0ID0gbmV3IEFSQzQoa2V5KTtcblxuICAvLyBNaXggdGhlIHJhbmRvbW5lc3MgaW50byBhY2N1bXVsYXRlZCBlbnRyb3B5LlxuICBtaXhrZXkoYXJjNC5TLCBwb29sKTtcblxuICAvLyBPdmVycmlkZSBNYXRoLnJhbmRvbVxuXG4gIC8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHJhbmRvbSBkb3VibGUgaW4gWzAsIDEpIHRoYXQgY29udGFpbnNcbiAgLy8gcmFuZG9tbmVzcyBpbiBldmVyeSBiaXQgb2YgdGhlIG1hbnRpc3NhIG9mIHRoZSBJRUVFIDc1NCB2YWx1ZS5cblxuICBtYXRoWydyYW5kb20nXSA9IGZ1bmN0aW9uIHJhbmRvbSgpIHsgIC8vIENsb3N1cmUgdG8gcmV0dXJuIGEgcmFuZG9tIGRvdWJsZTpcbiAgICB2YXIgbiA9IGFyYzQuZyhjaHVua3MpOyAgICAgICAgICAgICAvLyBTdGFydCB3aXRoIGEgbnVtZXJhdG9yIG4gPCAyIF4gNDhcbiAgICB2YXIgZCA9IHN0YXJ0ZGVub207ICAgICAgICAgICAgICAgICAvLyAgIGFuZCBkZW5vbWluYXRvciBkID0gMiBeIDQ4LlxuICAgIHZhciB4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgYW5kIG5vICdleHRyYSBsYXN0IGJ5dGUnLlxuICAgIHdoaWxlIChuIDwgc2lnbmlmaWNhbmNlKSB7ICAgICAgICAgIC8vIEZpbGwgdXAgYWxsIHNpZ25pZmljYW50IGRpZ2l0cyBieVxuICAgICAgbiA9IChuICsgeCkgKiB3aWR0aDsgICAgICAgICAgICAgIC8vICAgc2hpZnRpbmcgbnVtZXJhdG9yIGFuZFxuICAgICAgZCAqPSB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgIC8vICAgZGVub21pbmF0b3IgYW5kIGdlbmVyYXRpbmcgYVxuICAgICAgeCA9IGFyYzQuZygxKTsgICAgICAgICAgICAgICAgICAgIC8vICAgbmV3IGxlYXN0LXNpZ25pZmljYW50LWJ5dGUuXG4gICAgfVxuICAgIHdoaWxlIChuID49IG92ZXJmbG93KSB7ICAgICAgICAgICAgIC8vIFRvIGF2b2lkIHJvdW5kaW5nIHVwLCBiZWZvcmUgYWRkaW5nXG4gICAgICBuIC89IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBsYXN0IGJ5dGUsIHNoaWZ0IGV2ZXJ5dGhpbmdcbiAgICAgIGQgLz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIHJpZ2h0IHVzaW5nIGludGVnZXIgbWF0aCB1bnRpbFxuICAgICAgeCA+Pj49IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgd2UgaGF2ZSBleGFjdGx5IHRoZSBkZXNpcmVkIGJpdHMuXG4gICAgfVxuICAgIHJldHVybiAobiArIHgpIC8gZDsgICAgICAgICAgICAgICAgIC8vIEZvcm0gdGhlIG51bWJlciB3aXRoaW4gWzAsIDEpLlxuICB9O1xuXG4gIC8vIFJldHVybiB0aGUgc2VlZCB0aGF0IHdhcyB1c2VkXG4gIHJldHVybiBzZWVkO1xufTtcblxuLy9cbi8vIEFSQzRcbi8vXG4vLyBBbiBBUkM0IGltcGxlbWVudGF0aW9uLiAgVGhlIGNvbnN0cnVjdG9yIHRha2VzIGEga2V5IGluIHRoZSBmb3JtIG9mXG4vLyBhbiBhcnJheSBvZiBhdCBtb3N0ICh3aWR0aCkgaW50ZWdlcnMgdGhhdCBzaG91bGQgYmUgMCA8PSB4IDwgKHdpZHRoKS5cbi8vXG4vLyBUaGUgZyhjb3VudCkgbWV0aG9kIHJldHVybnMgYSBwc2V1ZG9yYW5kb20gaW50ZWdlciB0aGF0IGNvbmNhdGVuYXRlc1xuLy8gdGhlIG5leHQgKGNvdW50KSBvdXRwdXRzIGZyb20gQVJDNC4gIEl0cyByZXR1cm4gdmFsdWUgaXMgYSBudW1iZXIgeFxuLy8gdGhhdCBpcyBpbiB0aGUgcmFuZ2UgMCA8PSB4IDwgKHdpZHRoIF4gY291bnQpLlxuLy9cbi8qKiBAY29uc3RydWN0b3IgKi9cbmZ1bmN0aW9uIEFSQzQoa2V5KSB7XG4gIHZhciB0LCB1LCBtZSA9IHRoaXMsIGtleWxlbiA9IGtleS5sZW5ndGg7XG4gIHZhciBpID0gMCwgaiA9IG1lLmkgPSBtZS5qID0gbWUubSA9IDA7XG4gIG1lLlMgPSBbXTtcbiAgbWUuYyA9IFtdO1xuXG4gIC8vIFRoZSBlbXB0eSBrZXkgW10gaXMgdHJlYXRlZCBhcyBbMF0uXG4gIGlmICgha2V5bGVuKSB7IGtleSA9IFtrZXlsZW4rK107IH1cblxuICAvLyBTZXQgdXAgUyB1c2luZyB0aGUgc3RhbmRhcmQga2V5IHNjaGVkdWxpbmcgYWxnb3JpdGhtLlxuICB3aGlsZSAoaSA8IHdpZHRoKSB7IG1lLlNbaV0gPSBpKys7IH1cbiAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpKyspIHtcbiAgICB0ID0gbWUuU1tpXTtcbiAgICBqID0gbG93Yml0cyhqICsgdCArIGtleVtpICUga2V5bGVuXSk7XG4gICAgdSA9IG1lLlNbal07XG4gICAgbWUuU1tpXSA9IHU7XG4gICAgbWUuU1tqXSA9IHQ7XG4gIH1cblxuICAvLyBUaGUgXCJnXCIgbWV0aG9kIHJldHVybnMgdGhlIG5leHQgKGNvdW50KSBvdXRwdXRzIGFzIG9uZSBudW1iZXIuXG4gIG1lLmcgPSBmdW5jdGlvbiBnZXRuZXh0KGNvdW50KSB7XG4gICAgdmFyIHMgPSBtZS5TO1xuICAgIHZhciBpID0gbG93Yml0cyhtZS5pICsgMSk7IHZhciB0ID0gc1tpXTtcbiAgICB2YXIgaiA9IGxvd2JpdHMobWUuaiArIHQpOyB2YXIgdSA9IHNbal07XG4gICAgc1tpXSA9IHU7XG4gICAgc1tqXSA9IHQ7XG4gICAgdmFyIHIgPSBzW2xvd2JpdHModCArIHUpXTtcbiAgICB3aGlsZSAoLS1jb3VudCkge1xuICAgICAgaSA9IGxvd2JpdHMoaSArIDEpOyB0ID0gc1tpXTtcbiAgICAgIGogPSBsb3diaXRzKGogKyB0KTsgdSA9IHNbal07XG4gICAgICBzW2ldID0gdTtcbiAgICAgIHNbal0gPSB0O1xuICAgICAgciA9IHIgKiB3aWR0aCArIHNbbG93Yml0cyh0ICsgdSldO1xuICAgIH1cbiAgICBtZS5pID0gaTtcbiAgICBtZS5qID0gajtcbiAgICByZXR1cm4gcjtcbiAgfTtcbiAgLy8gRm9yIHJvYnVzdCB1bnByZWRpY3RhYmlsaXR5IGRpc2NhcmQgYW4gaW5pdGlhbCBiYXRjaCBvZiB2YWx1ZXMuXG4gIC8vIFNlZSBodHRwOi8vd3d3LnJzYS5jb20vcnNhbGFicy9ub2RlLmFzcD9pZD0yMDA5XG4gIG1lLmcod2lkdGgpO1xufVxuXG4vL1xuLy8gZmxhdHRlbigpXG4vLyBDb252ZXJ0cyBhbiBvYmplY3QgdHJlZSB0byBuZXN0ZWQgYXJyYXlzIG9mIHN0cmluZ3MuXG4vL1xuLyoqIEBwYXJhbSB7T2JqZWN0PX0gcmVzdWx0IFxuICAqIEBwYXJhbSB7c3RyaW5nPX0gcHJvcFxuICAqIEBwYXJhbSB7c3RyaW5nPX0gdHlwICovXG5mdW5jdGlvbiBmbGF0dGVuKG9iaiwgZGVwdGgsIHJlc3VsdCwgcHJvcCwgdHlwKSB7XG4gIHJlc3VsdCA9IFtdO1xuICB0eXAgPSB0eXBlb2Yob2JqKTtcbiAgaWYgKGRlcHRoICYmIHR5cCA9PSAnb2JqZWN0Jykge1xuICAgIGZvciAocHJvcCBpbiBvYmopIHtcbiAgICAgIGlmIChwcm9wLmluZGV4T2YoJ1MnKSA8IDUpIHsgICAgLy8gQXZvaWQgRkYzIGJ1ZyAobG9jYWwvc2Vzc2lvblN0b3JhZ2UpXG4gICAgICAgIHRyeSB7IHJlc3VsdC5wdXNoKGZsYXR0ZW4ob2JqW3Byb3BdLCBkZXB0aCAtIDEpKTsgfSBjYXRjaCAoZSkge31cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIChyZXN1bHQubGVuZ3RoID8gcmVzdWx0IDogb2JqICsgKHR5cCAhPSAnc3RyaW5nJyA/ICdcXDAnIDogJycpKTtcbn1cblxuLy9cbi8vIG1peGtleSgpXG4vLyBNaXhlcyBhIHN0cmluZyBzZWVkIGludG8gYSBrZXkgdGhhdCBpcyBhbiBhcnJheSBvZiBpbnRlZ2VycywgYW5kXG4vLyByZXR1cm5zIGEgc2hvcnRlbmVkIHN0cmluZyBzZWVkIHRoYXQgaXMgZXF1aXZhbGVudCB0byB0aGUgcmVzdWx0IGtleS5cbi8vXG4vKiogQHBhcmFtIHtudW1iZXI9fSBzbWVhciBcbiAgKiBAcGFyYW0ge251bWJlcj19IGogKi9cbmZ1bmN0aW9uIG1peGtleShzZWVkLCBrZXksIHNtZWFyLCBqKSB7XG4gIHNlZWQgKz0gJyc7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgc2VlZCBpcyBhIHN0cmluZ1xuICBzbWVhciA9IDA7XG4gIGZvciAoaiA9IDA7IGogPCBzZWVkLmxlbmd0aDsgaisrKSB7XG4gICAga2V5W2xvd2JpdHMoaildID1cbiAgICAgIGxvd2JpdHMoKHNtZWFyIF49IGtleVtsb3diaXRzKGopXSAqIDE5KSArIHNlZWQuY2hhckNvZGVBdChqKSk7XG4gIH1cbiAgc2VlZCA9ICcnO1xuICBmb3IgKGogaW4ga2V5KSB7IHNlZWQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShrZXlbal0pOyB9XG4gIHJldHVybiBzZWVkO1xufVxuXG4vL1xuLy8gbG93Yml0cygpXG4vLyBBIHF1aWNrIFwibiBtb2Qgd2lkdGhcIiBmb3Igd2lkdGggYSBwb3dlciBvZiAyLlxuLy9cbmZ1bmN0aW9uIGxvd2JpdHMobikgeyByZXR1cm4gbiAmICh3aWR0aCAtIDEpOyB9XG5cbi8vXG4vLyBUaGUgZm9sbG93aW5nIGNvbnN0YW50cyBhcmUgcmVsYXRlZCB0byBJRUVFIDc1NCBsaW1pdHMuXG4vL1xuc3RhcnRkZW5vbSA9IG1hdGgucG93KHdpZHRoLCBjaHVua3MpO1xuc2lnbmlmaWNhbmNlID0gbWF0aC5wb3coMiwgc2lnbmlmaWNhbmNlKTtcbm92ZXJmbG93ID0gc2lnbmlmaWNhbmNlICogMjtcblxuLy9cbi8vIFdoZW4gc2VlZHJhbmRvbS5qcyBpcyBsb2FkZWQsIHdlIGltbWVkaWF0ZWx5IG1peCBhIGZldyBiaXRzXG4vLyBmcm9tIHRoZSBidWlsdC1pbiBSTkcgaW50byB0aGUgZW50cm9weSBwb29sLiAgQmVjYXVzZSB3ZSBkb1xuLy8gbm90IHdhbnQgdG8gaW50ZWZlcmUgd2l0aCBkZXRlcm1pbnN0aWMgUFJORyBzdGF0ZSBsYXRlcixcbi8vIHNlZWRyYW5kb20gd2lsbCBub3QgY2FsbCBtYXRoLnJhbmRvbSBvbiBpdHMgb3duIGFnYWluIGFmdGVyXG4vLyBpbml0aWFsaXphdGlvbi5cbi8vXG5taXhrZXkobWF0aC5yYW5kb20oKSwgcG9vbCk7XG5cbi8vIEVuZCBhbm9ueW1vdXMgc2NvcGUsIGFuZCBwYXNzIGluaXRpYWwgdmFsdWVzLlxufShcbiAgW10sICAgLy8gcG9vbDogZW50cm9weSBwb29sIHN0YXJ0cyBlbXB0eVxuICBudW1lcmljLnNlZWRyYW5kb20sIC8vIG1hdGg6IHBhY2thZ2UgY29udGFpbmluZyByYW5kb20sIHBvdywgYW5kIHNlZWRyYW5kb21cbiAgMjU2LCAgLy8gd2lkdGg6IGVhY2ggUkM0IG91dHB1dCBpcyAwIDw9IHggPCAyNTZcbiAgNiwgICAgLy8gY2h1bmtzOiBhdCBsZWFzdCBzaXggUkM0IG91dHB1dHMgZm9yIGVhY2ggZG91YmxlXG4gIDUyICAgIC8vIHNpZ25pZmljYW5jZTogdGhlcmUgYXJlIDUyIHNpZ25pZmljYW50IGRpZ2l0cyBpbiBhIGRvdWJsZVxuICApKTtcbi8qIFRoaXMgZmlsZSBpcyBhIHNsaWdodGx5IG1vZGlmaWVkIHZlcnNpb24gb2YgcXVhZHByb2cuanMgZnJvbSBBbGJlcnRvIFNhbnRpbmkuXG4gKiBJdCBoYXMgYmVlbiBzbGlnaHRseSBtb2RpZmllZCBieSBTw6liYXN0aWVuIExvaXNlbCB0byBtYWtlIHN1cmUgdGhhdCBpdCBoYW5kbGVzXG4gKiAwLWJhc2VkIEFycmF5cyBpbnN0ZWFkIG9mIDEtYmFzZWQgQXJyYXlzLlxuICogTGljZW5zZSBpcyBpbiByZXNvdXJjZXMvTElDRU5TRS5xdWFkcHJvZyAqL1xuKGZ1bmN0aW9uKGV4cG9ydHMpIHtcblxuZnVuY3Rpb24gYmFzZTB0bzEoQSkge1xuICAgIGlmKHR5cGVvZiBBICE9PSBcIm9iamVjdFwiKSB7IHJldHVybiBBOyB9XG4gICAgdmFyIHJldCA9IFtdLCBpLG49QS5sZW5ndGg7XG4gICAgZm9yKGk9MDtpPG47aSsrKSByZXRbaSsxXSA9IGJhc2UwdG8xKEFbaV0pO1xuICAgIHJldHVybiByZXQ7XG59XG5mdW5jdGlvbiBiYXNlMXRvMChBKSB7XG4gICAgaWYodHlwZW9mIEEgIT09IFwib2JqZWN0XCIpIHsgcmV0dXJuIEE7IH1cbiAgICB2YXIgcmV0ID0gW10sIGksbj1BLmxlbmd0aDtcbiAgICBmb3IoaT0xO2k8bjtpKyspIHJldFtpLTFdID0gYmFzZTF0bzAoQVtpXSk7XG4gICAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZHBvcmkoYSwgbGRhLCBuKSB7XG4gICAgdmFyIGksIGosIGssIGtwMSwgdDtcblxuICAgIGZvciAoayA9IDE7IGsgPD0gbjsgayA9IGsgKyAxKSB7XG4gICAgICAgIGFba11ba10gPSAxIC8gYVtrXVtrXTtcbiAgICAgICAgdCA9IC1hW2tdW2tdO1xuICAgICAgICAvL34gZHNjYWwoayAtIDEsIHQsIGFbMV1ba10sIDEpO1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgazsgaSA9IGkgKyAxKSB7XG4gICAgICAgICAgICBhW2ldW2tdID0gdCAqIGFbaV1ba107XG4gICAgICAgIH1cblxuICAgICAgICBrcDEgPSBrICsgMTtcbiAgICAgICAgaWYgKG4gPCBrcDEpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaiA9IGtwMTsgaiA8PSBuOyBqID0gaiArIDEpIHtcbiAgICAgICAgICAgIHQgPSBhW2tdW2pdO1xuICAgICAgICAgICAgYVtrXVtqXSA9IDA7XG4gICAgICAgICAgICAvL34gZGF4cHkoaywgdCwgYVsxXVtrXSwgMSwgYVsxXVtqXSwgMSk7XG4gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IGs7IGkgPSBpICsgMSkge1xuICAgICAgICAgICAgICAgIGFbaV1bal0gPSBhW2ldW2pdICsgKHQgKiBhW2ldW2tdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5mdW5jdGlvbiBkcG9zbChhLCBsZGEsIG4sIGIpIHtcbiAgICB2YXIgaSwgaywga2IsIHQ7XG5cbiAgICBmb3IgKGsgPSAxOyBrIDw9IG47IGsgPSBrICsgMSkge1xuICAgICAgICAvL34gdCA9IGRkb3QoayAtIDEsIGFbMV1ba10sIDEsIGJbMV0sIDEpO1xuICAgICAgICB0ID0gMDtcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IGs7IGkgPSBpICsgMSkge1xuICAgICAgICAgICAgdCA9IHQgKyAoYVtpXVtrXSAqIGJbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgYltrXSA9IChiW2tdIC0gdCkgLyBhW2tdW2tdO1xuICAgIH1cblxuICAgIGZvciAoa2IgPSAxOyBrYiA8PSBuOyBrYiA9IGtiICsgMSkge1xuICAgICAgICBrID0gbiArIDEgLSBrYjtcbiAgICAgICAgYltrXSA9IGJba10gLyBhW2tdW2tdO1xuICAgICAgICB0ID0gLWJba107XG4gICAgICAgIC8vfiBkYXhweShrIC0gMSwgdCwgYVsxXVtrXSwgMSwgYlsxXSwgMSk7XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPCBrOyBpID0gaSArIDEpIHtcbiAgICAgICAgICAgIGJbaV0gPSBiW2ldICsgKHQgKiBhW2ldW2tdKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gZHBvZmEoYSwgbGRhLCBuLCBpbmZvKSB7XG4gICAgdmFyIGksIGosIGptMSwgaywgdCwgcztcblxuICAgIGZvciAoaiA9IDE7IGogPD0gbjsgaiA9IGogKyAxKSB7XG4gICAgICAgIGluZm9bMV0gPSBqO1xuICAgICAgICBzID0gMDtcbiAgICAgICAgam0xID0gaiAtIDE7XG4gICAgICAgIGlmIChqbTEgPCAxKSB7XG4gICAgICAgICAgICBzID0gYVtqXVtqXSAtIHM7XG4gICAgICAgICAgICBpZiAocyA8PSAwKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhW2pdW2pdID0gTWF0aC5zcXJ0KHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChrID0gMTsgayA8PSBqbTE7IGsgPSBrICsgMSkge1xuICAgICAgICAgICAgICAgIC8vfiB0ID0gYVtrXVtqXSAtIGRkb3QoayAtIDEsIGFbMV1ba10sIDEsIGFbMV1bal0sIDEpO1xuICAgICAgICAgICAgICAgIHQgPSBhW2tdW2pdO1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBrOyBpID0gaSArIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdCA9IHQgLSAoYVtpXVtqXSAqIGFbaV1ba10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0ID0gdCAvIGFba11ba107XG4gICAgICAgICAgICAgICAgYVtrXVtqXSA9IHQ7XG4gICAgICAgICAgICAgICAgcyA9IHMgKyB0ICogdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHMgPSBhW2pdW2pdIC0gcztcbiAgICAgICAgICAgIGlmIChzIDw9IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFbal1bal0gPSBNYXRoLnNxcnQocyk7XG4gICAgICAgIH1cbiAgICAgICAgaW5mb1sxXSA9IDA7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBxcGdlbjIoZG1hdCwgZHZlYywgZmRkbWF0LCBuLCBzb2wsIGNydmFsLCBhbWF0LFxuICAgIGJ2ZWMsIGZkYW1hdCwgcSwgbWVxLCBpYWN0LCBuYWN0LCBpdGVyLCB3b3JrLCBpZXJyKSB7XG5cbiAgICB2YXIgaSwgaiwgbCwgbDEsIGluZm8sIGl0MSwgaXd6diwgaXdydiwgaXdybSwgaXdzdiwgaXd1diwgbnZsLCByLCBpd25idixcbiAgICAgICAgdGVtcCwgc3VtLCB0MSwgdHQsIGdjLCBncywgbnUsXG4gICAgICAgIHQxaW5mLCB0Mm1pbixcbiAgICAgICAgdnNtYWxsLCB0bXBhLCB0bXBiLFxuICAgICAgICBnbztcblxuICAgIHIgPSBNYXRoLm1pbihuLCBxKTtcbiAgICBsID0gMiAqIG4gKyAociAqIChyICsgNSkpIC8gMiArIDIgKiBxICsgMTtcblxuICAgIHZzbWFsbCA9IDEuMGUtNjA7XG4gICAgZG8ge1xuICAgICAgICB2c21hbGwgPSB2c21hbGwgKyB2c21hbGw7XG4gICAgICAgIHRtcGEgPSAxICsgMC4xICogdnNtYWxsO1xuICAgICAgICB0bXBiID0gMSArIDAuMiAqIHZzbWFsbDtcbiAgICB9IHdoaWxlICh0bXBhIDw9IDEgfHwgdG1wYiA8PSAxKTtcblxuICAgIGZvciAoaSA9IDE7IGkgPD0gbjsgaSA9IGkgKyAxKSB7XG4gICAgICAgIHdvcmtbaV0gPSBkdmVjW2ldO1xuICAgIH1cbiAgICBmb3IgKGkgPSBuICsgMTsgaSA8PSBsOyBpID0gaSArIDEpIHtcbiAgICAgICAgd29ya1tpXSA9IDA7XG4gICAgfVxuICAgIGZvciAoaSA9IDE7IGkgPD0gcTsgaSA9IGkgKyAxKSB7XG4gICAgICAgIGlhY3RbaV0gPSAwO1xuICAgIH1cblxuICAgIGluZm8gPSBbXTtcblxuICAgIGlmIChpZXJyWzFdID09PSAwKSB7XG4gICAgICAgIGRwb2ZhKGRtYXQsIGZkZG1hdCwgbiwgaW5mbyk7XG4gICAgICAgIGlmIChpbmZvWzFdICE9PSAwKSB7XG4gICAgICAgICAgICBpZXJyWzFdID0gMjtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkcG9zbChkbWF0LCBmZGRtYXQsIG4sIGR2ZWMpO1xuICAgICAgICBkcG9yaShkbWF0LCBmZGRtYXQsIG4pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGZvciAoaiA9IDE7IGogPD0gbjsgaiA9IGogKyAxKSB7XG4gICAgICAgICAgICBzb2xbal0gPSAwO1xuICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBqOyBpID0gaSArIDEpIHtcbiAgICAgICAgICAgICAgICBzb2xbal0gPSBzb2xbal0gKyBkbWF0W2ldW2pdICogZHZlY1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGogPSAxOyBqIDw9IG47IGogPSBqICsgMSkge1xuICAgICAgICAgICAgZHZlY1tqXSA9IDA7XG4gICAgICAgICAgICBmb3IgKGkgPSBqOyBpIDw9IG47IGkgPSBpICsgMSkge1xuICAgICAgICAgICAgICAgIGR2ZWNbal0gPSBkdmVjW2pdICsgZG1hdFtqXVtpXSAqIHNvbFtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNydmFsWzFdID0gMDtcbiAgICBmb3IgKGogPSAxOyBqIDw9IG47IGogPSBqICsgMSkge1xuICAgICAgICBzb2xbal0gPSBkdmVjW2pdO1xuICAgICAgICBjcnZhbFsxXSA9IGNydmFsWzFdICsgd29ya1tqXSAqIHNvbFtqXTtcbiAgICAgICAgd29ya1tqXSA9IDA7XG4gICAgICAgIGZvciAoaSA9IGogKyAxOyBpIDw9IG47IGkgPSBpICsgMSkge1xuICAgICAgICAgICAgZG1hdFtpXVtqXSA9IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY3J2YWxbMV0gPSAtY3J2YWxbMV0gLyAyO1xuICAgIGllcnJbMV0gPSAwO1xuXG4gICAgaXd6diA9IG47XG4gICAgaXdydiA9IGl3enYgKyBuO1xuICAgIGl3dXYgPSBpd3J2ICsgcjtcbiAgICBpd3JtID0gaXd1diArIHIgKyAxO1xuICAgIGl3c3YgPSBpd3JtICsgKHIgKiAociArIDEpKSAvIDI7XG4gICAgaXduYnYgPSBpd3N2ICsgcTtcblxuICAgIGZvciAoaSA9IDE7IGkgPD0gcTsgaSA9IGkgKyAxKSB7XG4gICAgICAgIHN1bSA9IDA7XG4gICAgICAgIGZvciAoaiA9IDE7IGogPD0gbjsgaiA9IGogKyAxKSB7XG4gICAgICAgICAgICBzdW0gPSBzdW0gKyBhbWF0W2pdW2ldICogYW1hdFtqXVtpXTtcbiAgICAgICAgfVxuICAgICAgICB3b3JrW2l3bmJ2ICsgaV0gPSBNYXRoLnNxcnQoc3VtKTtcbiAgICB9XG4gICAgbmFjdCA9IDA7XG4gICAgaXRlclsxXSA9IDA7XG4gICAgaXRlclsyXSA9IDA7XG5cbiAgICBmdW5jdGlvbiBmbl9nb3RvXzUwKCkge1xuICAgICAgICBpdGVyWzFdID0gaXRlclsxXSArIDE7XG5cbiAgICAgICAgbCA9IGl3c3Y7XG4gICAgICAgIGZvciAoaSA9IDE7IGkgPD0gcTsgaSA9IGkgKyAxKSB7XG4gICAgICAgICAgICBsID0gbCArIDE7XG4gICAgICAgICAgICBzdW0gPSAtYnZlY1tpXTtcbiAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPD0gbjsgaiA9IGogKyAxKSB7XG4gICAgICAgICAgICAgICAgc3VtID0gc3VtICsgYW1hdFtqXVtpXSAqIHNvbFtqXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChNYXRoLmFicyhzdW0pIDwgdnNtYWxsKSB7XG4gICAgICAgICAgICAgICAgc3VtID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpID4gbWVxKSB7XG4gICAgICAgICAgICAgICAgd29ya1tsXSA9IHN1bTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgd29ya1tsXSA9IC1NYXRoLmFicyhzdW0pO1xuICAgICAgICAgICAgICAgIGlmIChzdW0gPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPD0gbjsgaiA9IGogKyAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbWF0W2pdW2ldID0gLWFtYXRbal1baV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnZlY1tpXSA9IC1idmVjW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbmFjdDsgaSA9IGkgKyAxKSB7XG4gICAgICAgICAgICB3b3JrW2l3c3YgKyBpYWN0W2ldXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBudmwgPSAwO1xuICAgICAgICB0ZW1wID0gMDtcbiAgICAgICAgZm9yIChpID0gMTsgaSA8PSBxOyBpID0gaSArIDEpIHtcbiAgICAgICAgICAgIGlmICh3b3JrW2l3c3YgKyBpXSA8IHRlbXAgKiB3b3JrW2l3bmJ2ICsgaV0pIHtcbiAgICAgICAgICAgICAgICBudmwgPSBpO1xuICAgICAgICAgICAgICAgIHRlbXAgPSB3b3JrW2l3c3YgKyBpXSAvIHdvcmtbaXduYnYgKyBpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAobnZsID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gOTk5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZm5fZ290b181NSgpIHtcbiAgICAgICAgZm9yIChpID0gMTsgaSA8PSBuOyBpID0gaSArIDEpIHtcbiAgICAgICAgICAgIHN1bSA9IDA7XG4gICAgICAgICAgICBmb3IgKGogPSAxOyBqIDw9IG47IGogPSBqICsgMSkge1xuICAgICAgICAgICAgICAgIHN1bSA9IHN1bSArIGRtYXRbal1baV0gKiBhbWF0W2pdW252bF07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3b3JrW2ldID0gc3VtO1xuICAgICAgICB9XG5cbiAgICAgICAgbDEgPSBpd3p2O1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG47IGkgPSBpICsgMSkge1xuICAgICAgICAgICAgd29ya1tsMSArIGldID0gMDtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGogPSBuYWN0ICsgMTsgaiA8PSBuOyBqID0gaiArIDEpIHtcbiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbjsgaSA9IGkgKyAxKSB7XG4gICAgICAgICAgICAgICAgd29ya1tsMSArIGldID0gd29ya1tsMSArIGldICsgZG1hdFtpXVtqXSAqIHdvcmtbal07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0MWluZiA9IHRydWU7XG4gICAgICAgIGZvciAoaSA9IG5hY3Q7IGkgPj0gMTsgaSA9IGkgLSAxKSB7XG4gICAgICAgICAgICBzdW0gPSB3b3JrW2ldO1xuICAgICAgICAgICAgbCA9IGl3cm0gKyAoaSAqIChpICsgMykpIC8gMjtcbiAgICAgICAgICAgIGwxID0gbCAtIGk7XG4gICAgICAgICAgICBmb3IgKGogPSBpICsgMTsgaiA8PSBuYWN0OyBqID0gaiArIDEpIHtcbiAgICAgICAgICAgICAgICBzdW0gPSBzdW0gLSB3b3JrW2xdICogd29ya1tpd3J2ICsgal07XG4gICAgICAgICAgICAgICAgbCA9IGwgKyBqO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3VtID0gc3VtIC8gd29ya1tsMV07XG4gICAgICAgICAgICB3b3JrW2l3cnYgKyBpXSA9IHN1bTtcbiAgICAgICAgICAgIGlmIChpYWN0W2ldIDwgbWVxKSB7XG4gICAgICAgICAgICAgICAgLy8gY29udGludWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3VtIDwgMCkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdDFpbmYgPSBmYWxzZTtcbiAgICAgICAgICAgIGl0MSA9IGk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXQxaW5mKSB7XG4gICAgICAgICAgICB0MSA9IHdvcmtbaXd1diArIGl0MV0gLyB3b3JrW2l3cnYgKyBpdDFdO1xuICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBuYWN0OyBpID0gaSArIDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoaWFjdFtpXSA8IG1lcSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh3b3JrW2l3cnYgKyBpXSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0ZW1wID0gd29ya1tpd3V2ICsgaV0gLyB3b3JrW2l3cnYgKyBpXTtcbiAgICAgICAgICAgICAgICBpZiAodGVtcCA8IHQxKSB7XG4gICAgICAgICAgICAgICAgICAgIHQxID0gdGVtcDtcbiAgICAgICAgICAgICAgICAgICAgaXQxID0gaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzdW0gPSAwO1xuICAgICAgICBmb3IgKGkgPSBpd3p2ICsgMTsgaSA8PSBpd3p2ICsgbjsgaSA9IGkgKyAxKSB7XG4gICAgICAgICAgICBzdW0gPSBzdW0gKyB3b3JrW2ldICogd29ya1tpXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoTWF0aC5hYnMoc3VtKSA8PSB2c21hbGwpIHtcbiAgICAgICAgICAgIGlmICh0MWluZikge1xuICAgICAgICAgICAgICAgIGllcnJbMV0gPSAxO1xuICAgICAgICAgICAgICAgIC8vIEdPVE8gOTk5XG4gICAgICAgICAgICAgICAgcmV0dXJuIDk5OTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBuYWN0OyBpID0gaSArIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya1tpd3V2ICsgaV0gPSB3b3JrW2l3dXYgKyBpXSAtIHQxICogd29ya1tpd3J2ICsgaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHdvcmtbaXd1diArIG5hY3QgKyAxXSA9IHdvcmtbaXd1diArIG5hY3QgKyAxXSArIHQxO1xuICAgICAgICAgICAgICAgIC8vIEdPVE8gNzAwXG4gICAgICAgICAgICAgICAgcmV0dXJuIDcwMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1bSA9IDA7XG4gICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG47IGkgPSBpICsgMSkge1xuICAgICAgICAgICAgICAgIHN1bSA9IHN1bSArIHdvcmtbaXd6diArIGldICogYW1hdFtpXVtudmxdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHQgPSAtd29ya1tpd3N2ICsgbnZsXSAvIHN1bTtcbiAgICAgICAgICAgIHQybWluID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICghdDFpbmYpIHtcbiAgICAgICAgICAgICAgICBpZiAodDEgPCB0dCkge1xuICAgICAgICAgICAgICAgICAgICB0dCA9IHQxO1xuICAgICAgICAgICAgICAgICAgICB0Mm1pbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBuOyBpID0gaSArIDEpIHtcbiAgICAgICAgICAgICAgICBzb2xbaV0gPSBzb2xbaV0gKyB0dCAqIHdvcmtbaXd6diArIGldO1xuICAgICAgICAgICAgICAgIGlmIChNYXRoLmFicyhzb2xbaV0pIDwgdnNtYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNvbFtpXSA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjcnZhbFsxXSA9IGNydmFsWzFdICsgdHQgKiBzdW0gKiAodHQgLyAyICsgd29ya1tpd3V2ICsgbmFjdCArIDFdKTtcbiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbmFjdDsgaSA9IGkgKyAxKSB7XG4gICAgICAgICAgICAgICAgd29ya1tpd3V2ICsgaV0gPSB3b3JrW2l3dXYgKyBpXSAtIHR0ICogd29ya1tpd3J2ICsgaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3b3JrW2l3dXYgKyBuYWN0ICsgMV0gPSB3b3JrW2l3dXYgKyBuYWN0ICsgMV0gKyB0dDtcblxuICAgICAgICAgICAgaWYgKHQybWluKSB7XG4gICAgICAgICAgICAgICAgbmFjdCA9IG5hY3QgKyAxO1xuICAgICAgICAgICAgICAgIGlhY3RbbmFjdF0gPSBudmw7XG5cbiAgICAgICAgICAgICAgICBsID0gaXdybSArICgobmFjdCAtIDEpICogbmFjdCkgLyAyICsgMTtcbiAgICAgICAgICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG5hY3QgLSAxOyBpID0gaSArIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya1tsXSA9IHdvcmtbaV07XG4gICAgICAgICAgICAgICAgICAgIGwgPSBsICsgMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobmFjdCA9PT0gbikge1xuICAgICAgICAgICAgICAgICAgICB3b3JrW2xdID0gd29ya1tuXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBuOyBpID49IG5hY3QgKyAxOyBpID0gaSAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JrW2ldID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBnYyA9IE1hdGgubWF4KE1hdGguYWJzKHdvcmtbaSAtIDFdKSwgTWF0aC5hYnMod29ya1tpXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3MgPSBNYXRoLm1pbihNYXRoLmFicyh3b3JrW2kgLSAxXSksIE1hdGguYWJzKHdvcmtbaV0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3b3JrW2kgLSAxXSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IE1hdGguYWJzKGdjICogTWF0aC5zcXJ0KDEgKyBncyAqIGdzIC8gKGdjICogZ2MpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAtTWF0aC5hYnMoZ2MgKiBNYXRoLnNxcnQoMSArIGdzICogZ3MgLyAoZ2MgKiBnYykpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGdjID0gd29ya1tpIC0gMV0gLyB0ZW1wO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3MgPSB3b3JrW2ldIC8gdGVtcDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdjID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2MgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrW2kgLSAxXSA9IGdzICogdGVtcDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAxOyBqIDw9IG47IGogPSBqICsgMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wID0gZG1hdFtqXVtpIC0gMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtYXRbal1baSAtIDFdID0gZG1hdFtqXVtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG1hdFtqXVtpXSA9IHRlbXA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrW2kgLSAxXSA9IHRlbXA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnUgPSBncyAvICgxICsgZ2MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDE7IGogPD0gbjsgaiA9IGogKyAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSBnYyAqIGRtYXRbal1baSAtIDFdICsgZ3MgKiBkbWF0W2pdW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbWF0W2pdW2ldID0gbnUgKiAoZG1hdFtqXVtpIC0gMV0gKyB0ZW1wKSAtIGRtYXRbal1baV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtYXRbal1baSAtIDFdID0gdGVtcDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB3b3JrW2xdID0gd29ya1tuYWN0XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN1bSA9IC1idmVjW252bF07XG4gICAgICAgICAgICAgICAgZm9yIChqID0gMTsgaiA8PSBuOyBqID0gaiArIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgc3VtID0gc3VtICsgc29sW2pdICogYW1hdFtqXVtudmxdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobnZsID4gbWVxKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtbaXdzdiArIG52bF0gPSBzdW07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya1tpd3N2ICsgbnZsXSA9IC1NYXRoLmFicyhzdW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3VtID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMTsgaiA8PSBuOyBqID0gaiArIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbWF0W2pdW252bF0gPSAtYW1hdFtqXVtudmxdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnZlY1tudmxdID0gLWJ2ZWNbbnZsXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBHT1RPIDcwMFxuICAgICAgICAgICAgICAgIHJldHVybiA3MDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmbl9nb3RvXzc5NygpIHtcbiAgICAgICAgbCA9IGl3cm0gKyAoaXQxICogKGl0MSArIDEpKSAvIDIgKyAxO1xuICAgICAgICBsMSA9IGwgKyBpdDE7XG4gICAgICAgIGlmICh3b3JrW2wxXSA9PT0gMCkge1xuICAgICAgICAgICAgLy8gR09UTyA3OThcbiAgICAgICAgICAgIHJldHVybiA3OTg7XG4gICAgICAgIH1cbiAgICAgICAgZ2MgPSBNYXRoLm1heChNYXRoLmFicyh3b3JrW2wxIC0gMV0pLCBNYXRoLmFicyh3b3JrW2wxXSkpO1xuICAgICAgICBncyA9IE1hdGgubWluKE1hdGguYWJzKHdvcmtbbDEgLSAxXSksIE1hdGguYWJzKHdvcmtbbDFdKSk7XG4gICAgICAgIGlmICh3b3JrW2wxIC0gMV0gPj0gMCkge1xuICAgICAgICAgICAgdGVtcCA9IE1hdGguYWJzKGdjICogTWF0aC5zcXJ0KDEgKyBncyAqIGdzIC8gKGdjICogZ2MpKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0ZW1wID0gLU1hdGguYWJzKGdjICogTWF0aC5zcXJ0KDEgKyBncyAqIGdzIC8gKGdjICogZ2MpKSk7XG4gICAgICAgIH1cbiAgICAgICAgZ2MgPSB3b3JrW2wxIC0gMV0gLyB0ZW1wO1xuICAgICAgICBncyA9IHdvcmtbbDFdIC8gdGVtcDtcblxuICAgICAgICBpZiAoZ2MgPT09IDEpIHtcbiAgICAgICAgICAgIC8vIEdPVE8gNzk4XG4gICAgICAgICAgICByZXR1cm4gNzk4O1xuICAgICAgICB9XG4gICAgICAgIGlmIChnYyA9PT0gMCkge1xuICAgICAgICAgICAgZm9yIChpID0gaXQxICsgMTsgaSA8PSBuYWN0OyBpID0gaSArIDEpIHtcbiAgICAgICAgICAgICAgICB0ZW1wID0gd29ya1tsMSAtIDFdO1xuICAgICAgICAgICAgICAgIHdvcmtbbDEgLSAxXSA9IHdvcmtbbDFdO1xuICAgICAgICAgICAgICAgIHdvcmtbbDFdID0gdGVtcDtcbiAgICAgICAgICAgICAgICBsMSA9IGwxICsgaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbjsgaSA9IGkgKyAxKSB7XG4gICAgICAgICAgICAgICAgdGVtcCA9IGRtYXRbaV1baXQxXTtcbiAgICAgICAgICAgICAgICBkbWF0W2ldW2l0MV0gPSBkbWF0W2ldW2l0MSArIDFdO1xuICAgICAgICAgICAgICAgIGRtYXRbaV1baXQxICsgMV0gPSB0ZW1wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbnUgPSBncyAvICgxICsgZ2MpO1xuICAgICAgICAgICAgZm9yIChpID0gaXQxICsgMTsgaSA8PSBuYWN0OyBpID0gaSArIDEpIHtcbiAgICAgICAgICAgICAgICB0ZW1wID0gZ2MgKiB3b3JrW2wxIC0gMV0gKyBncyAqIHdvcmtbbDFdO1xuICAgICAgICAgICAgICAgIHdvcmtbbDFdID0gbnUgKiAod29ya1tsMSAtIDFdICsgdGVtcCkgLSB3b3JrW2wxXTtcbiAgICAgICAgICAgICAgICB3b3JrW2wxIC0gMV0gPSB0ZW1wO1xuICAgICAgICAgICAgICAgIGwxID0gbDEgKyBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBuOyBpID0gaSArIDEpIHtcbiAgICAgICAgICAgICAgICB0ZW1wID0gZ2MgKiBkbWF0W2ldW2l0MV0gKyBncyAqIGRtYXRbaV1baXQxICsgMV07XG4gICAgICAgICAgICAgICAgZG1hdFtpXVtpdDEgKyAxXSA9IG51ICogKGRtYXRbaV1baXQxXSArIHRlbXApIC0gZG1hdFtpXVtpdDEgKyAxXTtcbiAgICAgICAgICAgICAgICBkbWF0W2ldW2l0MV0gPSB0ZW1wO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZm5fZ290b183OTgoKSB7XG4gICAgICAgIGwxID0gbCAtIGl0MTtcbiAgICAgICAgZm9yIChpID0gMTsgaSA8PSBpdDE7IGkgPSBpICsgMSkge1xuICAgICAgICAgICAgd29ya1tsMV0gPSB3b3JrW2xdO1xuICAgICAgICAgICAgbCA9IGwgKyAxO1xuICAgICAgICAgICAgbDEgPSBsMSArIDE7XG4gICAgICAgIH1cblxuICAgICAgICB3b3JrW2l3dXYgKyBpdDFdID0gd29ya1tpd3V2ICsgaXQxICsgMV07XG4gICAgICAgIGlhY3RbaXQxXSA9IGlhY3RbaXQxICsgMV07XG4gICAgICAgIGl0MSA9IGl0MSArIDE7XG4gICAgICAgIGlmIChpdDEgPCBuYWN0KSB7XG4gICAgICAgICAgICAvLyBHT1RPIDc5N1xuICAgICAgICAgICAgcmV0dXJuIDc5NztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGZuX2dvdG9fNzk5KCkge1xuICAgICAgICB3b3JrW2l3dXYgKyBuYWN0XSA9IHdvcmtbaXd1diArIG5hY3QgKyAxXTtcbiAgICAgICAgd29ya1tpd3V2ICsgbmFjdCArIDFdID0gMDtcbiAgICAgICAgaWFjdFtuYWN0XSA9IDA7XG4gICAgICAgIG5hY3QgPSBuYWN0IC0gMTtcbiAgICAgICAgaXRlclsyXSA9IGl0ZXJbMl0gKyAxO1xuXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGdvID0gMDtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBnbyA9IGZuX2dvdG9fNTAoKTtcbiAgICAgICAgaWYgKGdvID09PSA5OTkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICAgICAgZ28gPSBmbl9nb3RvXzU1KCk7XG4gICAgICAgICAgICBpZiAoZ28gPT09IDApIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChnbyA9PT0gOTk5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdvID09PSA3MDApIHtcbiAgICAgICAgICAgICAgICBpZiAoaXQxID09PSBuYWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZuX2dvdG9fNzk5KCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZuX2dvdG9fNzk3KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBnbyA9IGZuX2dvdG9fNzk4KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ28gIT09IDc5Nykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZuX2dvdG9fNzk5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG59XG5cbmZ1bmN0aW9uIHNvbHZlUVAoRG1hdCwgZHZlYywgQW1hdCwgYnZlYywgbWVxLCBmYWN0b3JpemVkKSB7XG4gICAgRG1hdCA9IGJhc2UwdG8xKERtYXQpO1xuICAgIGR2ZWMgPSBiYXNlMHRvMShkdmVjKTtcbiAgICBBbWF0ID0gYmFzZTB0bzEoQW1hdCk7XG4gICAgdmFyIGksIG4sIHEsXG4gICAgICAgIG5hY3QsIHIsXG4gICAgICAgIGNydmFsID0gW10sIGlhY3QgPSBbXSwgc29sID0gW10sIHdvcmsgPSBbXSwgaXRlciA9IFtdLFxuICAgICAgICBtZXNzYWdlO1xuXG4gICAgbWVxID0gbWVxIHx8IDA7XG4gICAgZmFjdG9yaXplZCA9IGZhY3Rvcml6ZWQgPyBiYXNlMHRvMShmYWN0b3JpemVkKSA6IFt1bmRlZmluZWQsIDBdO1xuICAgIGJ2ZWMgPSBidmVjID8gYmFzZTB0bzEoYnZlYykgOiBbXTtcblxuICAgIC8vIEluIEZvcnRyYW4gdGhlIGFycmF5IGluZGV4IHN0YXJ0cyBmcm9tIDFcbiAgICBuID0gRG1hdC5sZW5ndGggLSAxO1xuICAgIHEgPSBBbWF0WzFdLmxlbmd0aCAtIDE7XG5cbiAgICBpZiAoIWJ2ZWMpIHtcbiAgICAgICAgZm9yIChpID0gMTsgaSA8PSBxOyBpID0gaSArIDEpIHtcbiAgICAgICAgICAgIGJ2ZWNbaV0gPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoaSA9IDE7IGkgPD0gcTsgaSA9IGkgKyAxKSB7XG4gICAgICAgIGlhY3RbaV0gPSAwO1xuICAgIH1cbiAgICBuYWN0ID0gMDtcbiAgICByID0gTWF0aC5taW4obiwgcSk7XG4gICAgZm9yIChpID0gMTsgaSA8PSBuOyBpID0gaSArIDEpIHtcbiAgICAgICAgc29sW2ldID0gMDtcbiAgICB9XG4gICAgY3J2YWxbMV0gPSAwO1xuICAgIGZvciAoaSA9IDE7IGkgPD0gKDIgKiBuICsgKHIgKiAociArIDUpKSAvIDIgKyAyICogcSArIDEpOyBpID0gaSArIDEpIHtcbiAgICAgICAgd29ya1tpXSA9IDA7XG4gICAgfVxuICAgIGZvciAoaSA9IDE7IGkgPD0gMjsgaSA9IGkgKyAxKSB7XG4gICAgICAgIGl0ZXJbaV0gPSAwO1xuICAgIH1cblxuICAgIHFwZ2VuMihEbWF0LCBkdmVjLCBuLCBuLCBzb2wsIGNydmFsLCBBbWF0LFxuICAgICAgICBidmVjLCBuLCBxLCBtZXEsIGlhY3QsIG5hY3QsIGl0ZXIsIHdvcmssIGZhY3Rvcml6ZWQpO1xuXG4gICAgbWVzc2FnZSA9IFwiXCI7XG4gICAgaWYgKGZhY3Rvcml6ZWRbMV0gPT09IDEpIHtcbiAgICAgICAgbWVzc2FnZSA9IFwiY29uc3RyYWludHMgYXJlIGluY29uc2lzdGVudCwgbm8gc29sdXRpb24hXCI7XG4gICAgfVxuICAgIGlmIChmYWN0b3JpemVkWzFdID09PSAyKSB7XG4gICAgICAgIG1lc3NhZ2UgPSBcIm1hdHJpeCBEIGluIHF1YWRyYXRpYyBmdW5jdGlvbiBpcyBub3QgcG9zaXRpdmUgZGVmaW5pdGUhXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgc29sdXRpb246IGJhc2UxdG8wKHNvbCksXG4gICAgICAgIHZhbHVlOiBiYXNlMXRvMChjcnZhbCksXG4gICAgICAgIHVuY29uc3RyYWluZWRfc29sdXRpb246IGJhc2UxdG8wKGR2ZWMpLFxuICAgICAgICBpdGVyYXRpb25zOiBiYXNlMXRvMChpdGVyKSxcbiAgICAgICAgaWFjdDogYmFzZTF0bzAoaWFjdCksXG4gICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2VcbiAgICB9O1xufVxuZXhwb3J0cy5zb2x2ZVFQID0gc29sdmVRUDtcbn0obnVtZXJpYykpO1xuLypcclxuU2hhbnRpIFJhbyBzZW50IG1lIHRoaXMgcm91dGluZSBieSBwcml2YXRlIGVtYWlsLiBJIGhhZCB0byBtb2RpZnkgaXRcclxuc2xpZ2h0bHkgdG8gd29yayBvbiBBcnJheXMgaW5zdGVhZCBvZiB1c2luZyBhIE1hdHJpeCBvYmplY3QuXHJcbkl0IGlzIGFwcGFyZW50bHkgdHJhbnNsYXRlZCBmcm9tIGh0dHA6Ly9zdGl0Y2hwYW5vcmFtYS5zb3VyY2Vmb3JnZS5uZXQvUHl0aG9uL3N2ZC5weVxyXG4qL1xyXG5cclxubnVtZXJpYy5zdmQ9IGZ1bmN0aW9uIHN2ZChBKSB7XHJcbiAgICB2YXIgdGVtcDtcclxuLy9Db21wdXRlIHRoZSB0aGluIFNWRCBmcm9tIEcuIEguIEdvbHViIGFuZCBDLiBSZWluc2NoLCBOdW1lci4gTWF0aC4gMTQsIDQwMy00MjAgKDE5NzApXHJcblx0dmFyIHByZWM9IG51bWVyaWMuZXBzaWxvbjsgLy9NYXRoLnBvdygyLC01MikgLy8gYXNzdW1lcyBkb3VibGUgcHJlY1xyXG5cdHZhciB0b2xlcmFuY2U9IDEuZS02NC9wcmVjO1xyXG5cdHZhciBpdG1heD0gNTA7XHJcblx0dmFyIGM9MDtcclxuXHR2YXIgaT0wO1xyXG5cdHZhciBqPTA7XHJcblx0dmFyIGs9MDtcclxuXHR2YXIgbD0wO1xyXG5cdFxyXG5cdHZhciB1PSBudW1lcmljLmNsb25lKEEpO1xyXG5cdHZhciBtPSB1Lmxlbmd0aDtcclxuXHRcclxuXHR2YXIgbj0gdVswXS5sZW5ndGg7XHJcblx0XHJcblx0aWYgKG0gPCBuKSB0aHJvdyBcIk5lZWQgbW9yZSByb3dzIHRoYW4gY29sdW1uc1wiXHJcblx0XHJcblx0dmFyIGUgPSBuZXcgQXJyYXkobik7XHJcblx0dmFyIHEgPSBuZXcgQXJyYXkobik7XHJcblx0Zm9yIChpPTA7IGk8bjsgaSsrKSBlW2ldID0gcVtpXSA9IDAuMDtcclxuXHR2YXIgdiA9IG51bWVyaWMucmVwKFtuLG5dLDApO1xyXG4vL1x0di56ZXJvKCk7XHJcblx0XHJcbiBcdGZ1bmN0aW9uIHB5dGhhZyhhLGIpXHJcbiBcdHtcclxuXHRcdGEgPSBNYXRoLmFicyhhKVxyXG5cdFx0YiA9IE1hdGguYWJzKGIpXHJcblx0XHRpZiAoYSA+IGIpXHJcblx0XHRcdHJldHVybiBhKk1hdGguc3FydCgxLjArKGIqYi9hL2EpKVxyXG5cdFx0ZWxzZSBpZiAoYiA9PSAwLjApIFxyXG5cdFx0XHRyZXR1cm4gYVxyXG5cdFx0cmV0dXJuIGIqTWF0aC5zcXJ0KDEuMCsoYSphL2IvYikpXHJcblx0fVxyXG5cclxuXHQvL0hvdXNlaG9sZGVyJ3MgcmVkdWN0aW9uIHRvIGJpZGlhZ29uYWwgZm9ybVxyXG5cclxuXHR2YXIgZj0gMC4wO1xyXG5cdHZhciBnPSAwLjA7XHJcblx0dmFyIGg9IDAuMDtcclxuXHR2YXIgeD0gMC4wO1xyXG5cdHZhciB5PSAwLjA7XHJcblx0dmFyIHo9IDAuMDtcclxuXHR2YXIgcz0gMC4wO1xyXG5cdFxyXG5cdGZvciAoaT0wOyBpIDwgbjsgaSsrKVxyXG5cdHtcdFxyXG5cdFx0ZVtpXT0gZztcclxuXHRcdHM9IDAuMDtcclxuXHRcdGw9IGkrMTtcclxuXHRcdGZvciAoaj1pOyBqIDwgbTsgaisrKSBcclxuXHRcdFx0cyArPSAodVtqXVtpXSp1W2pdW2ldKTtcclxuXHRcdGlmIChzIDw9IHRvbGVyYW5jZSlcclxuXHRcdFx0Zz0gMC4wO1xyXG5cdFx0ZWxzZVxyXG5cdFx0e1x0XHJcblx0XHRcdGY9IHVbaV1baV07XHJcblx0XHRcdGc9IE1hdGguc3FydChzKTtcclxuXHRcdFx0aWYgKGYgPj0gMC4wKSBnPSAtZztcclxuXHRcdFx0aD0gZipnLXNcclxuXHRcdFx0dVtpXVtpXT1mLWc7XHJcblx0XHRcdGZvciAoaj1sOyBqIDwgbjsgaisrKVxyXG5cdFx0XHR7XHJcblx0XHRcdFx0cz0gMC4wXHJcblx0XHRcdFx0Zm9yIChrPWk7IGsgPCBtOyBrKyspIFxyXG5cdFx0XHRcdFx0cyArPSB1W2tdW2ldKnVba11bal1cclxuXHRcdFx0XHRmPSBzL2hcclxuXHRcdFx0XHRmb3IgKGs9aTsgayA8IG07IGsrKykgXHJcblx0XHRcdFx0XHR1W2tdW2pdKz1mKnVba11baV1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0cVtpXT0gZ1xyXG5cdFx0cz0gMC4wXHJcblx0XHRmb3IgKGo9bDsgaiA8IG47IGorKykgXHJcblx0XHRcdHM9IHMgKyB1W2ldW2pdKnVbaV1bal1cclxuXHRcdGlmIChzIDw9IHRvbGVyYW5jZSlcclxuXHRcdFx0Zz0gMC4wXHJcblx0XHRlbHNlXHJcblx0XHR7XHRcclxuXHRcdFx0Zj0gdVtpXVtpKzFdXHJcblx0XHRcdGc9IE1hdGguc3FydChzKVxyXG5cdFx0XHRpZiAoZiA+PSAwLjApIGc9IC1nXHJcblx0XHRcdGg9IGYqZyAtIHNcclxuXHRcdFx0dVtpXVtpKzFdID0gZi1nO1xyXG5cdFx0XHRmb3IgKGo9bDsgaiA8IG47IGorKykgZVtqXT0gdVtpXVtqXS9oXHJcblx0XHRcdGZvciAoaj1sOyBqIDwgbTsgaisrKVxyXG5cdFx0XHR7XHRcclxuXHRcdFx0XHRzPTAuMFxyXG5cdFx0XHRcdGZvciAoaz1sOyBrIDwgbjsgaysrKSBcclxuXHRcdFx0XHRcdHMgKz0gKHVbal1ba10qdVtpXVtrXSlcclxuXHRcdFx0XHRmb3IgKGs9bDsgayA8IG47IGsrKykgXHJcblx0XHRcdFx0XHR1W2pdW2tdKz1zKmVba11cclxuXHRcdFx0fVx0XHJcblx0XHR9XHJcblx0XHR5PSBNYXRoLmFicyhxW2ldKStNYXRoLmFicyhlW2ldKVxyXG5cdFx0aWYgKHk+eCkgXHJcblx0XHRcdHg9eVxyXG5cdH1cclxuXHRcclxuXHQvLyBhY2N1bXVsYXRpb24gb2YgcmlnaHQgaGFuZCBndHJhbnNmb3JtYXRpb25zXHJcblx0Zm9yIChpPW4tMTsgaSAhPSAtMTsgaSs9IC0xKVxyXG5cdHtcdFxyXG5cdFx0aWYgKGcgIT0gMC4wKVxyXG5cdFx0e1xyXG5cdFx0IFx0aD0gZyp1W2ldW2krMV1cclxuXHRcdFx0Zm9yIChqPWw7IGogPCBuOyBqKyspIFxyXG5cdFx0XHRcdHZbal1baV09dVtpXVtqXS9oXHJcblx0XHRcdGZvciAoaj1sOyBqIDwgbjsgaisrKVxyXG5cdFx0XHR7XHRcclxuXHRcdFx0XHRzPTAuMFxyXG5cdFx0XHRcdGZvciAoaz1sOyBrIDwgbjsgaysrKSBcclxuXHRcdFx0XHRcdHMgKz0gdVtpXVtrXSp2W2tdW2pdXHJcblx0XHRcdFx0Zm9yIChrPWw7IGsgPCBuOyBrKyspIFxyXG5cdFx0XHRcdFx0dltrXVtqXSs9KHMqdltrXVtpXSlcclxuXHRcdFx0fVx0XHJcblx0XHR9XHJcblx0XHRmb3IgKGo9bDsgaiA8IG47IGorKylcclxuXHRcdHtcclxuXHRcdFx0dltpXVtqXSA9IDA7XHJcblx0XHRcdHZbal1baV0gPSAwO1xyXG5cdFx0fVxyXG5cdFx0dltpXVtpXSA9IDE7XHJcblx0XHRnPSBlW2ldXHJcblx0XHRsPSBpXHJcblx0fVxyXG5cdFxyXG5cdC8vIGFjY3VtdWxhdGlvbiBvZiBsZWZ0IGhhbmQgdHJhbnNmb3JtYXRpb25zXHJcblx0Zm9yIChpPW4tMTsgaSAhPSAtMTsgaSs9IC0xKVxyXG5cdHtcdFxyXG5cdFx0bD0gaSsxXHJcblx0XHRnPSBxW2ldXHJcblx0XHRmb3IgKGo9bDsgaiA8IG47IGorKykgXHJcblx0XHRcdHVbaV1bal0gPSAwO1xyXG5cdFx0aWYgKGcgIT0gMC4wKVxyXG5cdFx0e1xyXG5cdFx0XHRoPSB1W2ldW2ldKmdcclxuXHRcdFx0Zm9yIChqPWw7IGogPCBuOyBqKyspXHJcblx0XHRcdHtcclxuXHRcdFx0XHRzPTAuMFxyXG5cdFx0XHRcdGZvciAoaz1sOyBrIDwgbTsgaysrKSBzICs9IHVba11baV0qdVtrXVtqXTtcclxuXHRcdFx0XHRmPSBzL2hcclxuXHRcdFx0XHRmb3IgKGs9aTsgayA8IG07IGsrKykgdVtrXVtqXSs9Zip1W2tdW2ldO1xyXG5cdFx0XHR9XHJcblx0XHRcdGZvciAoaj1pOyBqIDwgbTsgaisrKSB1W2pdW2ldID0gdVtqXVtpXS9nO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZVxyXG5cdFx0XHRmb3IgKGo9aTsgaiA8IG07IGorKykgdVtqXVtpXSA9IDA7XHJcblx0XHR1W2ldW2ldICs9IDE7XHJcblx0fVxyXG5cdFxyXG5cdC8vIGRpYWdvbmFsaXphdGlvbiBvZiB0aGUgYmlkaWFnb25hbCBmb3JtXHJcblx0cHJlYz0gcHJlYyp4XHJcblx0Zm9yIChrPW4tMTsgayAhPSAtMTsgays9IC0xKVxyXG5cdHtcclxuXHRcdGZvciAodmFyIGl0ZXJhdGlvbj0wOyBpdGVyYXRpb24gPCBpdG1heDsgaXRlcmF0aW9uKyspXHJcblx0XHR7XHQvLyB0ZXN0IGYgc3BsaXR0aW5nXHJcblx0XHRcdHZhciB0ZXN0X2NvbnZlcmdlbmNlID0gZmFsc2VcclxuXHRcdFx0Zm9yIChsPWs7IGwgIT0gLTE7IGwrPSAtMSlcclxuXHRcdFx0e1x0XHJcblx0XHRcdFx0aWYgKE1hdGguYWJzKGVbbF0pIDw9IHByZWMpXHJcblx0XHRcdFx0e1x0dGVzdF9jb252ZXJnZW5jZT0gdHJ1ZVxyXG5cdFx0XHRcdFx0YnJlYWsgXHJcblx0XHRcdFx0fVxyXG5cdFx0XHRcdGlmIChNYXRoLmFicyhxW2wtMV0pIDw9IHByZWMpXHJcblx0XHRcdFx0XHRicmVhayBcclxuXHRcdFx0fVxyXG5cdFx0XHRpZiAoIXRlc3RfY29udmVyZ2VuY2UpXHJcblx0XHRcdHtcdC8vIGNhbmNlbGxhdGlvbiBvZiBlW2xdIGlmIGw+MFxyXG5cdFx0XHRcdGM9IDAuMFxyXG5cdFx0XHRcdHM9IDEuMFxyXG5cdFx0XHRcdHZhciBsMT0gbC0xXHJcblx0XHRcdFx0Zm9yIChpID1sOyBpPGsrMTsgaSsrKVxyXG5cdFx0XHRcdHtcdFxyXG5cdFx0XHRcdFx0Zj0gcyplW2ldXHJcblx0XHRcdFx0XHRlW2ldPSBjKmVbaV1cclxuXHRcdFx0XHRcdGlmIChNYXRoLmFicyhmKSA8PSBwcmVjKVxyXG5cdFx0XHRcdFx0XHRicmVha1xyXG5cdFx0XHRcdFx0Zz0gcVtpXVxyXG5cdFx0XHRcdFx0aD0gcHl0aGFnKGYsZylcclxuXHRcdFx0XHRcdHFbaV09IGhcclxuXHRcdFx0XHRcdGM9IGcvaFxyXG5cdFx0XHRcdFx0cz0gLWYvaFxyXG5cdFx0XHRcdFx0Zm9yIChqPTA7IGogPCBtOyBqKyspXHJcblx0XHRcdFx0XHR7XHRcclxuXHRcdFx0XHRcdFx0eT0gdVtqXVtsMV1cclxuXHRcdFx0XHRcdFx0ej0gdVtqXVtpXVxyXG5cdFx0XHRcdFx0XHR1W2pdW2wxXSA9ICB5KmMrKHoqcylcclxuXHRcdFx0XHRcdFx0dVtqXVtpXSA9IC15KnMrKHoqYylcclxuXHRcdFx0XHRcdH0gXHJcblx0XHRcdFx0fVx0XHJcblx0XHRcdH1cclxuXHRcdFx0Ly8gdGVzdCBmIGNvbnZlcmdlbmNlXHJcblx0XHRcdHo9IHFba11cclxuXHRcdFx0aWYgKGw9PSBrKVxyXG5cdFx0XHR7XHQvL2NvbnZlcmdlbmNlXHJcblx0XHRcdFx0aWYgKHo8MC4wKVxyXG5cdFx0XHRcdHtcdC8vcVtrXSBpcyBtYWRlIG5vbi1uZWdhdGl2ZVxyXG5cdFx0XHRcdFx0cVtrXT0gLXpcclxuXHRcdFx0XHRcdGZvciAoaj0wOyBqIDwgbjsgaisrKVxyXG5cdFx0XHRcdFx0XHR2W2pdW2tdID0gLXZbal1ba11cclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0YnJlYWsgIC8vYnJlYWsgb3V0IG9mIGl0ZXJhdGlvbiBsb29wIGFuZCBtb3ZlIG9uIHRvIG5leHQgayB2YWx1ZVxyXG5cdFx0XHR9XHJcblx0XHRcdGlmIChpdGVyYXRpb24gPj0gaXRtYXgtMSlcclxuXHRcdFx0XHR0aHJvdyAnRXJyb3I6IG5vIGNvbnZlcmdlbmNlLidcclxuXHRcdFx0Ly8gc2hpZnQgZnJvbSBib3R0b20gMngyIG1pbm9yXHJcblx0XHRcdHg9IHFbbF1cclxuXHRcdFx0eT0gcVtrLTFdXHJcblx0XHRcdGc9IGVbay0xXVxyXG5cdFx0XHRoPSBlW2tdXHJcblx0XHRcdGY9ICgoeS16KSooeSt6KSsoZy1oKSooZytoKSkvKDIuMCpoKnkpXHJcblx0XHRcdGc9IHB5dGhhZyhmLDEuMClcclxuXHRcdFx0aWYgKGYgPCAwLjApXHJcblx0XHRcdFx0Zj0gKCh4LXopKih4K3opK2gqKHkvKGYtZyktaCkpL3hcclxuXHRcdFx0ZWxzZVxyXG5cdFx0XHRcdGY9ICgoeC16KSooeCt6KStoKih5LyhmK2cpLWgpKS94XHJcblx0XHRcdC8vIG5leHQgUVIgdHJhbnNmb3JtYXRpb25cclxuXHRcdFx0Yz0gMS4wXHJcblx0XHRcdHM9IDEuMFxyXG5cdFx0XHRmb3IgKGk9bCsxOyBpPCBrKzE7IGkrKylcclxuXHRcdFx0e1x0XHJcblx0XHRcdFx0Zz0gZVtpXVxyXG5cdFx0XHRcdHk9IHFbaV1cclxuXHRcdFx0XHRoPSBzKmdcclxuXHRcdFx0XHRnPSBjKmdcclxuXHRcdFx0XHR6PSBweXRoYWcoZixoKVxyXG5cdFx0XHRcdGVbaS0xXT0gelxyXG5cdFx0XHRcdGM9IGYvelxyXG5cdFx0XHRcdHM9IGgvelxyXG5cdFx0XHRcdGY9IHgqYytnKnNcclxuXHRcdFx0XHRnPSAteCpzK2cqY1xyXG5cdFx0XHRcdGg9IHkqc1xyXG5cdFx0XHRcdHk9IHkqY1xyXG5cdFx0XHRcdGZvciAoaj0wOyBqIDwgbjsgaisrKVxyXG5cdFx0XHRcdHtcdFxyXG5cdFx0XHRcdFx0eD0gdltqXVtpLTFdXHJcblx0XHRcdFx0XHR6PSB2W2pdW2ldXHJcblx0XHRcdFx0XHR2W2pdW2ktMV0gPSB4KmMreipzXHJcblx0XHRcdFx0XHR2W2pdW2ldID0gLXgqcyt6KmNcclxuXHRcdFx0XHR9XHJcblx0XHRcdFx0ej0gcHl0aGFnKGYsaClcclxuXHRcdFx0XHRxW2ktMV09IHpcclxuXHRcdFx0XHRjPSBmL3pcclxuXHRcdFx0XHRzPSBoL3pcclxuXHRcdFx0XHRmPSBjKmcrcyp5XHJcblx0XHRcdFx0eD0gLXMqZytjKnlcclxuXHRcdFx0XHRmb3IgKGo9MDsgaiA8IG07IGorKylcclxuXHRcdFx0XHR7XHJcblx0XHRcdFx0XHR5PSB1W2pdW2ktMV1cclxuXHRcdFx0XHRcdHo9IHVbal1baV1cclxuXHRcdFx0XHRcdHVbal1baS0xXSA9IHkqYyt6KnNcclxuXHRcdFx0XHRcdHVbal1baV0gPSAteSpzK3oqY1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0XHRlW2xdPSAwLjBcclxuXHRcdFx0ZVtrXT0gZlxyXG5cdFx0XHRxW2tdPSB4XHJcblx0XHR9IFxyXG5cdH1cclxuXHRcdFxyXG5cdC8vdnQ9IHRyYW5zcG9zZSh2KVxyXG5cdC8vcmV0dXJuICh1LHEsdnQpXHJcblx0Zm9yIChpPTA7aTxxLmxlbmd0aDsgaSsrKSBcclxuXHQgIGlmIChxW2ldIDwgcHJlYykgcVtpXSA9IDBcclxuXHQgIFxyXG5cdC8vc29ydCBlaWdlbnZhbHVlc1x0XHJcblx0Zm9yIChpPTA7IGk8IG47IGkrKylcclxuXHR7XHQgXHJcblx0Ly93cml0ZWxuKHEpXHJcblx0IGZvciAoaj1pLTE7IGogPj0gMDsgai0tKVxyXG5cdCB7XHJcblx0ICBpZiAocVtqXSA8IHFbaV0pXHJcblx0ICB7XHJcblx0Ly8gIHdyaXRlbG4oaSwnLScsailcclxuXHQgICBjID0gcVtqXVxyXG5cdCAgIHFbal0gPSBxW2ldXHJcblx0ICAgcVtpXSA9IGNcclxuXHQgICBmb3Ioaz0wO2s8dS5sZW5ndGg7aysrKSB7IHRlbXAgPSB1W2tdW2ldOyB1W2tdW2ldID0gdVtrXVtqXTsgdVtrXVtqXSA9IHRlbXA7IH1cclxuXHQgICBmb3Ioaz0wO2s8di5sZW5ndGg7aysrKSB7IHRlbXAgPSB2W2tdW2ldOyB2W2tdW2ldID0gdltrXVtqXTsgdltrXVtqXSA9IHRlbXA7IH1cclxuLy9cdCAgIHUuc3dhcENvbHMoaSxqKVxyXG4vL1x0ICAgdi5zd2FwQ29scyhpLGopXHJcblx0ICAgaSA9IGpcdCAgIFxyXG5cdCAgfVxyXG5cdCB9XHRcclxuXHR9XHJcblx0XHJcblx0cmV0dXJuIHtVOnUsUzpxLFY6dn1cclxufTtcclxuXHJcbiIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMucmVzYW1wbGVGbG9hdDMyQXJyYXkgPSByZXNhbXBsZUZsb2F0MzJBcnJheTtcblxudmFyIF9mcmFjdGlvbmFsRGVsYXkgPSByZXF1aXJlKCdmcmFjdGlvbmFsLWRlbGF5Jyk7XG5cbnZhciBfZnJhY3Rpb25hbERlbGF5MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2ZyYWN0aW9uYWxEZWxheSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogQ29udmVydCBhbiBhcnJheSwgdHlwZWQgb3Igbm90LCB0byBhIEZsb2F0MzJBcnJheSwgd2l0aCBwb3NzaWJsZSByZS1zYW1wbGluZy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQHBhcmFtIHtBcnJheX0gb3B0aW9ucy5pbnB1dFNhbXBsZXMgaW5wdXQgYXJyYXlcbiAqIEBwYXJhbSB7TnVtYmVyfSBvcHRpb25zLmlucHV0U2FtcGxlUmF0ZSBpbiBIZXJ0elxuICogQHBhcmFtIHtOdW1iZXJ9IFtvcHRpb25zLm91dHB1dFNhbXBsZVJhdGU9b3B0aW9ucy5pbnB1dFNhbXBsZVJhdGVdXG4gKiBAcmV0dXJucyB7UHJvbWlzZS48RmxvYXQzMkFycmF5fEVycm9yPn1cbiAqL1xuZnVuY3Rpb24gcmVzYW1wbGVGbG9hdDMyQXJyYXkoKSB7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07XG5cbiAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgdmFyIGlucHV0U2FtcGxlcyA9IG9wdGlvbnMuaW5wdXRTYW1wbGVzO1xuICAgIHZhciBpbnB1dFNhbXBsZVJhdGUgPSBvcHRpb25zLmlucHV0U2FtcGxlUmF0ZTtcblxuICAgIHZhciBpbnB1dERlbGF5ID0gdHlwZW9mIG9wdGlvbnMuaW5wdXREZWxheSAhPT0gJ3VuZGVmaW5lZCcgPyBvcHRpb25zLmlucHV0RGVsYXkgOiAwO1xuXG4gICAgdmFyIG91dHB1dFNhbXBsZVJhdGUgPSB0eXBlb2Ygb3B0aW9ucy5vdXRwdXRTYW1wbGVSYXRlICE9PSAndW5kZWZpbmVkJyA/IG9wdGlvbnMub3V0cHV0U2FtcGxlUmF0ZSA6IGlucHV0U2FtcGxlUmF0ZTtcblxuICAgIGlmIChpbnB1dFNhbXBsZVJhdGUgPT09IG91dHB1dFNhbXBsZVJhdGUgJiYgaW5wdXREZWxheSA9PT0gMCkge1xuICAgICAgcmVzb2x2ZShuZXcgRmxvYXQzMkFycmF5KGlucHV0U2FtcGxlcykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgb3V0cHV0U2FtcGxlc05iID0gTWF0aC5jZWlsKGlucHV0U2FtcGxlcy5sZW5ndGggKiBvdXRwdXRTYW1wbGVSYXRlIC8gaW5wdXRTYW1wbGVSYXRlKTtcblxuICAgICAgICB2YXIgY29udGV4dCA9IG5ldyB3aW5kb3cuT2ZmbGluZUF1ZGlvQ29udGV4dCgxLCBvdXRwdXRTYW1wbGVzTmIsIG91dHB1dFNhbXBsZVJhdGUpO1xuXG4gICAgICAgIHZhciBpbnB1dEJ1ZmZlciA9IGNvbnRleHQuY3JlYXRlQnVmZmVyKDEsIGlucHV0U2FtcGxlcy5sZW5ndGgsIGlucHV0U2FtcGxlUmF0ZSk7XG5cbiAgICAgICAgLy8gY3JlYXRlIGZyYWN0aW9uYWwgZGVsYXlcbiAgICAgICAgdmFyIG1heERlbGF5ID0gMS4wO1xuICAgICAgICB2YXIgZnJhY3Rpb25hbERlbGF5ID0gbmV3IF9mcmFjdGlvbmFsRGVsYXkyLmRlZmF1bHQoaW5wdXRTYW1wbGVSYXRlLCBtYXhEZWxheSk7XG4gICAgICAgIGZyYWN0aW9uYWxEZWxheS5zZXREZWxheShpbnB1dERlbGF5IC8gaW5wdXRTYW1wbGVSYXRlKTtcblxuICAgICAgICAvLyBjcmVhdGUgaW5wdXQgYnVmZmVyIGFmdGVyIGFwcGx5aW5nIGZyYWN0aW9uYWwgZGVsYXlcbiAgICAgICAgaW5wdXRCdWZmZXIuZ2V0Q2hhbm5lbERhdGEoMCkuc2V0KGZyYWN0aW9uYWxEZWxheS5wcm9jZXNzKGlucHV0U2FtcGxlcykpO1xuXG4gICAgICAgIHZhciBzb3VyY2UgPSBjb250ZXh0LmNyZWF0ZUJ1ZmZlclNvdXJjZSgpO1xuICAgICAgICBzb3VyY2UuYnVmZmVyID0gaW5wdXRCdWZmZXI7XG4gICAgICAgIHNvdXJjZS5jb25uZWN0KGNvbnRleHQuZGVzdGluYXRpb24pO1xuXG4gICAgICAgIHNvdXJjZS5zdGFydCgpOyAvLyB3aWxsIHN0YXJ0IHdpdGggb2ZmbGluZSBjb250ZXh0XG5cbiAgICAgICAgY29udGV4dC5vbmNvbXBsZXRlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgdmFyIG91dHB1dFNhbXBsZXMgPSBldmVudC5yZW5kZXJlZEJ1ZmZlci5nZXRDaGFubmVsRGF0YSgwKTtcbiAgICAgICAgICByZXNvbHZlKG91dHB1dFNhbXBsZXMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnRleHQuc3RhcnRSZW5kZXJpbmcoKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1VuYWJsZSB0byByZS1zYW1wbGUgRmxvYXQzMkFycmF5LiAnICsgZXJyb3IubWVzc2FnZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHByb21pc2U7XG59IC8qKlxuICAgKiBAZmlsZU92ZXJ2aWV3IEF1ZGlvIHV0aWxpdGllc1xuICAgKiBAYXV0aG9yIEplYW4tUGhpbGlwcGUuTGFtYmVydEBpcmNhbS5mclxuICAgKiBAY29weXJpZ2h0IDIwMTYgSVJDQU0sIFBhcmlzLCBGcmFuY2VcbiAgICogQGxpY2Vuc2UgQlNELTMtQ2xhdXNlXG4gICAqL1xuXG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIHJlc2FtcGxlRmxvYXQzMkFycmF5OiByZXNhbXBsZUZsb2F0MzJBcnJheVxufTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLnRyZWUgPSB1bmRlZmluZWQ7XG5leHBvcnRzLmRpc3RhbmNlU3F1YXJlZCA9IGRpc3RhbmNlU3F1YXJlZDtcbmV4cG9ydHMuZGlzdGFuY2UgPSBkaXN0YW5jZTtcblxudmFyIF9rZCA9IHJlcXVpcmUoJ2tkLnRyZWUnKTtcblxudmFyIF9rZDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9rZCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmV4cG9ydHMudHJlZSA9IF9rZDIuZGVmYXVsdDtcblxuLyoqXG4gKiBHZXQgdGhlIHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiB0byBwb2ludHMuXG4gKlxuICogKEF2b2lkIGNvbXB1dGluZyB0aGUgc3F1YXJlLXJvb3Qgd2hlbiB1bm5lY2Vzc2FyeS4pXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGEgaW4gY2FydGVzaWFuIGNvb3JkaW5hdGVzLlxuICogQHBhcmFtIHtOdW1iZXJ9IGEueFxuICogQHBhcmFtIHtOdW1iZXJ9IGEueVxuICogQHBhcmFtIHtOdW1iZXJ9IGEuelxuICogQHBhcmFtIHtPYmplY3R9IGIgaW4gY2FydGVzaWFuIGNvb3JkaW5hdGVzLlxuICogQHBhcmFtIHtOdW1iZXJ9IGIueFxuICogQHBhcmFtIHtOdW1iZXJ9IGIueVxuICogQHBhcmFtIHtOdW1iZXJ9IGIuelxuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IEhlbHBlcnMgZm9yIGstZCB0cmVlLlxuICogQGF1dGhvciBKZWFuLVBoaWxpcHBlLkxhbWJlcnRAaXJjYW0uZnJcbiAqIEBjb3B5cmlnaHQgMjAxNS0yMDE2IElSQ0FNLCBQYXJpcywgRnJhbmNlXG4gKiBAbGljZW5zZSBCU0QtMy1DbGF1c2VcbiAqL1xuXG5mdW5jdGlvbiBkaXN0YW5jZVNxdWFyZWQoYSwgYikge1xuICB2YXIgeCA9IGIueCAtIGEueDtcbiAgdmFyIHkgPSBiLnkgLSBhLnk7XG4gIHZhciB6ID0gYi56IC0gYS56O1xuICByZXR1cm4geCAqIHggKyB5ICogeSArIHogKiB6O1xufVxuXG4vKipcbiAqIEdldCB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0byBwb2ludHMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGEgaW4gY2FydGVzaWFuIGNvb3JkaW5hdGVzLlxuICogQHBhcmFtIHtOdW1iZXJ9IGEueFxuICogQHBhcmFtIHtOdW1iZXJ9IGEueVxuICogQHBhcmFtIHtOdW1iZXJ9IGEuelxuICogQHBhcmFtIHtPYmplY3R9IGIgaW4gY2FydGVzaWFuIGNvb3JkaW5hdGVzLlxuICogQHBhcmFtIHtOdW1iZXJ9IGIueFxuICogQHBhcmFtIHtOdW1iZXJ9IGIueVxuICogQHBhcmFtIHtOdW1iZXJ9IGIuelxuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikge1xuICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VTcXVhcmVkKGEsIGIpKTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICBkaXN0YW5jZTogZGlzdGFuY2UsXG4gIGRpc3RhbmNlU3F1YXJlZDogZGlzdGFuY2VTcXVhcmVkLFxuICB0cmVlOiBfa2QyLmRlZmF1bHRcbn07IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5zb2ZhQ2FydGVzaWFuVG9HbCA9IHNvZmFDYXJ0ZXNpYW5Ub0dsO1xuZXhwb3J0cy5nbFRvU29mYUNhcnRlc2lhbiA9IGdsVG9Tb2ZhQ2FydGVzaWFuO1xuZXhwb3J0cy5zb2ZhQ2FydGVzaWFuVG9Tb2ZhU3BoZXJpY2FsID0gc29mYUNhcnRlc2lhblRvU29mYVNwaGVyaWNhbDtcbmV4cG9ydHMuc29mYVNwaGVyaWNhbFRvU29mYUNhcnRlc2lhbiA9IHNvZmFTcGhlcmljYWxUb1NvZmFDYXJ0ZXNpYW47XG5leHBvcnRzLnNvZmFTcGhlcmljYWxUb0dsID0gc29mYVNwaGVyaWNhbFRvR2w7XG5leHBvcnRzLmdsVG9Tb2ZhU3BoZXJpY2FsID0gZ2xUb1NvZmFTcGhlcmljYWw7XG5leHBvcnRzLnNvZmFUb1NvZmFDYXJ0ZXNpYW4gPSBzb2ZhVG9Tb2ZhQ2FydGVzaWFuO1xuZXhwb3J0cy5zcGF0NENhcnRlc2lhblRvR2wgPSBzcGF0NENhcnRlc2lhblRvR2w7XG5leHBvcnRzLmdsVG9TcGF0NENhcnRlc2lhbiA9IGdsVG9TcGF0NENhcnRlc2lhbjtcbmV4cG9ydHMuc3BhdDRDYXJ0ZXNpYW5Ub1NwYXQ0U3BoZXJpY2FsID0gc3BhdDRDYXJ0ZXNpYW5Ub1NwYXQ0U3BoZXJpY2FsO1xuZXhwb3J0cy5zcGF0NFNwaGVyaWNhbFRvU3BhdDRDYXJ0ZXNpYW4gPSBzcGF0NFNwaGVyaWNhbFRvU3BhdDRDYXJ0ZXNpYW47XG5leHBvcnRzLnNwYXQ0U3BoZXJpY2FsVG9HbCA9IHNwYXQ0U3BoZXJpY2FsVG9HbDtcbmV4cG9ydHMuZ2xUb1NwYXQ0U3BoZXJpY2FsID0gZ2xUb1NwYXQ0U3BoZXJpY2FsO1xuZXhwb3J0cy5zeXN0ZW1UeXBlID0gc3lzdGVtVHlwZTtcbmV4cG9ydHMuc3lzdGVtVG9HbCA9IHN5c3RlbVRvR2w7XG5leHBvcnRzLmdsVG9TeXN0ZW0gPSBnbFRvU3lzdGVtO1xuXG52YXIgX2RlZ3JlZSA9IHJlcXVpcmUoJy4vZGVncmVlJyk7XG5cbnZhciBfZGVncmVlMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2RlZ3JlZSk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogQ29vcmRpbmF0ZXMgYXMgYW4gYXJyYXkgb2YgMyB2YWx1ZXM6XG4gKiBbeCwgeSwgel0gb3IgW2F6aW11dGgsIGVsZXZhdGlvbiwgZGlzdGFuY2VdLCBkZXBlbmRpbmcgb24gc3lzdGVtXG4gKlxuICogQHR5cGVkZWYge3ZlYzN9IENvb3JkaW5hdGVzXG4gKi9cblxuLyoqXG4gKiBDb29yZGluYXRlIHN5c3RlbTogYGdsYCwgYHNvZmFDYXJ0ZXNpYW5gLCBgc29mYVNwaGVyaWNhbGAsXG4gKiBgc3BhdDRDYXJ0ZXNpYW5gLCBvciBgc3BhdDRTcGhlcmljYWxgLlxuICpcbiAqIEB0eXBlZGVmIHtTdHJpbmd9IENvb3JkaW5hdGVTeXN0ZW1cbiAqL1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTT0ZBXG5cbi8qKlxuICogU09GQSBjYXJ0ZXNpYW4gY29vcmRpbmF0ZSBzeXN0ZW06IGBzb2ZhQ2FydGVzaWFuYC5cbiAqXG4gKiBTT0ZBIGRpc3RhbmNlcyBhcmUgaW4gbWV0cmVzLlxuICpcbiAqIDxwcmU+XG4gKlxuICogU09GQSAgICAgICAgICAreiAgK3ggICAgICAgICAgICAgb3BlbkdMICAgICt5XG4gKiAgICAgICAgICAgICAgICB8IC8gICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgIHwvICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICogICAgICAgICAreSAtLS0tbyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvLS0tLSAreFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK3pcbiAqXG4gKiBTT0ZBLnggPSAtb3BlbkdMLnogICAgICAgICAgICAgICBvcGVuR0wueCA9IC1TT0ZBLnlcbiAqIFNPRkEueSA9IC1vcGVuR0wueCAgICAgICAgICAgICAgIG9wZW5HTC55ID0gIFNPRkEuelxuICogU09GQS56ID0gIG9wZW5HTC55ICAgICAgICAgICAgICAgb3BlbkdMLnogPSAtU09GQS54XG4gKlxuICogPC9wcmU+XG4gKlxuICogQHR5cGVkZWYge0Nvb3JkaW5hdGVzfSBTb2ZhQ2FydGVzaWFuXG4gKi9cblxuLyoqXG4gKiBTT0ZBIHNwaGVyaWNhbCBjb29yZGluYXRlIHN5c3RlbTogIGBzb2ZhU3BoZXJpY2FsYC5cbiAqXG4gKiBTT0ZBIGFuZ2xlcyBhcmUgaW4gZGVncmVlcy5cbiAqXG4gKiA8cHJlPlxuICpcbiAqIFNPRkEuYXppbXV0aCA9IGF0YW4yKFNPRkEueSwgU09GQS54KVxuICogU09GQS5lbGV2YXRpb24gPSBhdGFuMihTT0ZBLnosIHNxcnQoU09GQS54ICogU09GQS54ICsgU09GQS55ICogU09GQS55KSApO1xuICogU09GQS5kaXN0YW5jZSA9IHNxcnQoU09GQS54ICogU09GQS54ICsgU09GQS55ICogU09GQS55ICsgU09GQS56ICogU09GQS56KVxuICpcbiAqIDwvcHJlPlxuICpcbiAqIEB0eXBlZGVmIHtDb29yZGluYXRlc30gU29mYVNwaGVyaWNhbFxuICovXG5cbi8qKlxuICogQ29udmVydCBTT0ZBIGNhcnRlc2lhbiBjb29yZGluYXRlcyB0byBvcGVuR0wuXG4gKlxuICogQHBhcmFtIHtDb29yZGluYXRlc30gb3V0IGluLXBsYWNlIGlmIG91dCA9PT0gYS5cbiAqIEBwYXJhbSB7Q29vcmRpbmF0ZXN9IGFcbiAqIEByZXR1cm5zIHtDb29yZGluYXRlc30gb3V0XG4gKi9cbmZ1bmN0aW9uIHNvZmFDYXJ0ZXNpYW5Ub0dsKG91dCwgYSkge1xuICAvLyBjb3B5IHRvIGhhbmRsZSBpbi1wbGFjZVxuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuXG4gIG91dFswXSA9IDAgLSB5O1xuICBvdXRbMV0gPSB6O1xuICBvdXRbMl0gPSAwIC0geDtcblxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENvbnZlcnQgb3BlbkdMIGNvb3JkaW5hdGVzIHRvIFNPRkEgY2FydGVzaWFuLlxuICpcbiAqIEBwYXJhbSB7Q29vcmRpbmF0ZXN9IG91dCBpbi1wbGFjZSBpZiBvdXQgPT09IGEuXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdGVzfSBhXG4gKiBAcmV0dXJucyB7Q29vcmRpbmF0ZXN9IG91dFxuICovXG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgQ29vcmRpbmF0ZSBzeXN0ZW1zIGNvbnZlcnNpb25zLiBvcGVuR0wsIFNPRkEsIGFuZCBTcGF0NCAoSXJjYW0pLlxuICpcbiAqIEBhdXRob3IgSmVhbi1QaGlsaXBwZS5MYW1iZXJ0QGlyY2FtLmZyXG4gKiBAY29weXJpZ2h0IDIwMTUtMjAxNiBJUkNBTSwgUGFyaXMsIEZyYW5jZVxuICogQGxpY2Vuc2UgQlNELTMtQ2xhdXNlXG4gKi9cblxuZnVuY3Rpb24gZ2xUb1NvZmFDYXJ0ZXNpYW4ob3V0LCBhKSB7XG4gIC8vIGNvcHkgdG8gaGFuZGxlIGluLXBsYWNlXG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG5cbiAgb3V0WzBdID0gMCAtIHo7XG4gIG91dFsxXSA9IDAgLSB4O1xuICBvdXRbMl0gPSB5O1xuXG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ29udmVydCBTT0ZBIGNhcnRlc2lhbiBjb29yZGluYXRlcyB0byBTT0ZBIHNwaGVyaWNhbC5cbiAqXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdGVzfSBvdXQgaW4tcGxhY2UgaWYgb3V0ID09PSBhLlxuICogQHBhcmFtIHtDb29yZGluYXRlc30gYVxuICogQHJldHVybnMge0Nvb3JkaW5hdGVzfSBvdXRcbiAqL1xuZnVuY3Rpb24gc29mYUNhcnRlc2lhblRvU29mYVNwaGVyaWNhbChvdXQsIGEpIHtcbiAgLy8gY29weSB0byBoYW5kbGUgaW4tcGxhY2VcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcblxuICB2YXIgeDJ5MiA9IHggKiB4ICsgeSAqIHk7XG5cbiAgLy8gZnJvbSBbLTE4MCwgMTgwXSB0byBbMCwgMzYwKTtcbiAgb3V0WzBdID0gKF9kZWdyZWUyLmRlZmF1bHQuYXRhbjIoeSwgeCkgKyAzNjApICUgMzYwO1xuXG4gIG91dFsxXSA9IF9kZWdyZWUyLmRlZmF1bHQuYXRhbjIoeiwgTWF0aC5zcXJ0KHgyeTIpKTtcbiAgb3V0WzJdID0gTWF0aC5zcXJ0KHgyeTIgKyB6ICogeik7XG5cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IFNPRkEgc3BoZXJpY2FsIGNvb3JkaW5hdGVzIHRvIFNPRkEgc3BoZXJpY2FsLlxuICpcbiAqIEBwYXJhbSB7Q29vcmRpbmF0ZXN9IG91dCBpbi1wbGFjZSBpZiBvdXQgPT09IGEuXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdGVzfSBhXG4gKiBAcmV0dXJucyB7Q29vcmRpbmF0ZXN9IG91dFxuICovXG5mdW5jdGlvbiBzb2ZhU3BoZXJpY2FsVG9Tb2ZhQ2FydGVzaWFuKG91dCwgYSkge1xuICAvLyBjb3B5IHRvIGhhbmRsZSBpbi1wbGFjZVxuICB2YXIgYXppbXV0aCA9IGFbMF07XG4gIHZhciBlbGV2YXRpb24gPSBhWzFdO1xuICB2YXIgZGlzdGFuY2UgPSBhWzJdO1xuXG4gIHZhciBjb3NFID0gX2RlZ3JlZTIuZGVmYXVsdC5jb3MoZWxldmF0aW9uKTtcbiAgb3V0WzBdID0gZGlzdGFuY2UgKiBjb3NFICogX2RlZ3JlZTIuZGVmYXVsdC5jb3MoYXppbXV0aCk7IC8vIFNPRkEueFxuICBvdXRbMV0gPSBkaXN0YW5jZSAqIGNvc0UgKiBfZGVncmVlMi5kZWZhdWx0LnNpbihhemltdXRoKTsgLy8gU09GQS55XG4gIG91dFsyXSA9IGRpc3RhbmNlICogX2RlZ3JlZTIuZGVmYXVsdC5zaW4oZWxldmF0aW9uKTsgLy8gU09GQS56XG5cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IFNPRkEgc3BoZXJpY2FsIGNvb3JkaW5hdGVzIHRvIG9wZW5HTC5cbiAqXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdGVzfSBvdXQgaW4tcGxhY2UgaWYgb3V0ID09PSBhLlxuICogQHBhcmFtIHtDb29yZGluYXRlc30gYVxuICogQHJldHVybnMge0Nvb3JkaW5hdGVzfSBvdXRcbiAqL1xuZnVuY3Rpb24gc29mYVNwaGVyaWNhbFRvR2wob3V0LCBhKSB7XG4gIC8vIGNvcHkgdG8gaGFuZGxlIGluLXBsYWNlXG4gIHZhciBhemltdXRoID0gYVswXTtcbiAgdmFyIGVsZXZhdGlvbiA9IGFbMV07XG4gIHZhciBkaXN0YW5jZSA9IGFbMl07XG5cbiAgdmFyIGNvc0UgPSBfZGVncmVlMi5kZWZhdWx0LmNvcyhlbGV2YXRpb24pO1xuICBvdXRbMF0gPSAwIC0gZGlzdGFuY2UgKiBjb3NFICogX2RlZ3JlZTIuZGVmYXVsdC5zaW4oYXppbXV0aCk7IC8vIC1TT0ZBLnlcbiAgb3V0WzFdID0gZGlzdGFuY2UgKiBfZGVncmVlMi5kZWZhdWx0LnNpbihlbGV2YXRpb24pOyAvLyBTT0ZBLnpcbiAgb3V0WzJdID0gMCAtIGRpc3RhbmNlICogY29zRSAqIF9kZWdyZWUyLmRlZmF1bHQuY29zKGF6aW11dGgpOyAvLyAtU09GQS54XG5cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IG9wZW5HTCBjb29yZGluYXRlcyB0byBTT0ZBIHNwaGVyaWNhbC5cbiAqXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdGVzfSBvdXQgaW4tcGxhY2UgaWYgb3V0ID09PSBhLlxuICogQHBhcmFtIHtDb29yZGluYXRlc30gYVxuICogQHJldHVybnMge0Nvb3JkaW5hdGVzfSBvdXRcbiAqL1xuZnVuY3Rpb24gZ2xUb1NvZmFTcGhlcmljYWwob3V0LCBhKSB7XG4gIC8vIGNvcHkgdG8gaGFuZGxlIGluLXBsYWNlXG4gIC8vIGRpZmZlcmVuY2UgdG8gYXZvaWQgZ2VuZXJhdGluZyAtMCBvdXQgb2YgMFxuICB2YXIgeCA9IDAgLSBhWzJdOyAvLyAtb3BlbkdMLnpcbiAgdmFyIHkgPSAwIC0gYVswXTsgLy8gLW9wZW5HTC54XG4gIHZhciB6ID0gYVsxXTsgLy8gb3BlbkdMLnlcblxuICB2YXIgeDJ5MiA9IHggKiB4ICsgeSAqIHk7XG5cbiAgLy8gZnJvbSBbLTE4MCwgMTgwXSB0byBbMCwgMzYwKTtcbiAgb3V0WzBdID0gKF9kZWdyZWUyLmRlZmF1bHQuYXRhbjIoeSwgeCkgKyAzNjApICUgMzYwO1xuXG4gIG91dFsxXSA9IF9kZWdyZWUyLmRlZmF1bHQuYXRhbjIoeiwgTWF0aC5zcXJ0KHgyeTIpKTtcbiAgb3V0WzJdID0gTWF0aC5zcXJ0KHgyeTIgKyB6ICogeik7XG5cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGNvb3JkaW5hdGVzIHRvIFNPRkEgY2FydGVzaWFuLlxuICpcbiAqIEBwYXJhbSB7Q29vcmRpbmF0ZXN9IG91dCBpbi1wbGFjZSBpZiBvdXQgPT09IGEuXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdGVzfSBhXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdGVTeXN0ZW19IHN5c3RlbVxuICogQHJldHVybnMge0Nvb3JkaW5hdGVzfSBvdXRcbiAqIEB0aHJvd3Mge0Vycm9yfSB3aGVuIHRoZSBzeXN0ZW0gaXMgdW5rbm93bi5cbiAqL1xuZnVuY3Rpb24gc29mYVRvU29mYUNhcnRlc2lhbihvdXQsIGEsIHN5c3RlbSkge1xuICBzd2l0Y2ggKHN5c3RlbSkge1xuICAgIGNhc2UgJ3NvZmFDYXJ0ZXNpYW4nOlxuICAgICAgb3V0WzBdID0gYVswXTtcbiAgICAgIG91dFsxXSA9IGFbMV07XG4gICAgICBvdXRbMl0gPSBhWzJdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzb2ZhU3BoZXJpY2FsJzpcbiAgICAgIHNvZmFTcGhlcmljYWxUb1NvZmFDYXJ0ZXNpYW4ob3V0LCBhKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcignQmFkIGNvb3JkaW5hdGUgc3lzdGVtJyk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLSBTcGF0NFxuXG4vKipcbiAqIFNwYXQ0IGNhcnRlc2lhbiBjb29yZGluYXRlIHN5c3RlbTogYHNwYXQ0Q2FydGVzaWFuYC5cbiAqXG4gKiBTcGF0NCBkaXN0YW5jZXMgYXJlIGluIG1ldHJlcy5cbiAqXG4gKiA8cHJlPlxuICpcbiAqIFNwYXQ0ICAgICAgICAgK3ogICt5ICAgICAgICAgICAgIG9wZW5HTCAgICAreVxuICogICAgICAgICAgICAgICAgfCAvICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gKiAgICAgICAgICAgICAgICB8LyAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAqICAgICAgICAgICAgICAgIG8tLS0tICt4ICAgICAgICAgICAgICAgICAgICAgby0tLS0gK3hcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgK3pcbiAqXG4gKiBTcGF0NC54ID0gIG9wZW5HTC54ICAgICAgICAgICAgICAgb3BlbkdMLnggPSAgU3BhdDQueFxuICogU3BhdDQueSA9IC1vcGVuR0wueiAgICAgICAgICAgICAgIG9wZW5HTC55ID0gIFNwYXQ0LnpcbiAqIFNwYXQ0LnogPSAgb3BlbkdMLnkgICAgICAgICAgICAgICBvcGVuR0wueiA9IC1TcGF0NC55XG4gKlxuICogPC9wcmU+XG4gKlxuICogQHR5cGVkZWYge0Nvb3JkaW5hdGVzfSBTcGF0NENhcnRlc2lhblxuICovXG5cbi8qKlxuICogU3BhdDQgc3BoZXJpY2FsIGNvb3JkaW5hdGUgc3lzdGVtOiBgc3BhdDRTcGhlcmljYWxgLlxuICpcbiAqIFNwYXQ0IGFuZ2xlcyBhcmUgaW4gZGVncmVlcy5cbiAqXG4gKiA8cHJlPlxuICpcbiAqIFNwYXQ0LmF6aW11dGggPSBhdGFuMihTcGF0NC54LCBTcGF0NC55KVxuICogU3BhdDQuZWxldmF0aW9uID0gYXRhbjIoU3BhdDQueiwgc3FydChTcGF0NC54ICogU3BhdDQueCArIFNwYXQ0LnkgKiBTcGF0NC55KSApO1xuICogU3BhdDQuZGlzdGFuY2UgPSBzcXJ0KFNwYXQ0LnggKiBTcGF0NC54ICsgU3BhdDQueSAqIFNwYXQ0LnkgKyBTcGF0NC56ICogU3BhdDQueilcbiAqXG4gKiA8L3ByZT5cbiAqXG4gKiBAdHlwZWRlZiB7Q29vcmRpbmF0ZXN9IFNwYXQ0U3BoZXJpY2FsXG4gKi9cblxuLyoqXG4gKiBDb252ZXJ0IFNwYXQ0IGNhcnRlc2lhbiBjb29yZGluYXRlcyB0byBvcGVuR0wuXG4gKlxuICogQHBhcmFtIHtDb29yZGluYXRlc30gb3V0IGluLXBsYWNlIGlmIG91dCA9PT0gYS5cbiAqIEBwYXJhbSB7Q29vcmRpbmF0ZXN9IGFcbiAqIEByZXR1cm5zIHtDb29yZGluYXRlc30gb3V0XG4gKi9cbmZ1bmN0aW9uIHNwYXQ0Q2FydGVzaWFuVG9HbChvdXQsIGEpIHtcbiAgLy8gY29weSB0byBoYW5kbGUgaW4tcGxhY2VcbiAgdmFyIHggPSBhWzBdO1xuICB2YXIgeSA9IGFbMV07XG4gIHZhciB6ID0gYVsyXTtcblxuICBvdXRbMF0gPSB4O1xuICBvdXRbMV0gPSB6O1xuICBvdXRbMl0gPSAwIC0geTtcblxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENvbnZlcnQgb3BlbkdMIGNvb3JkaW5hdGVzIHRvIFNwYXQ0IGNhcnRlc2lhbi5cbiAqXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdGVzfSBvdXQgaW4tcGxhY2UgaWYgb3V0ID09PSBhLlxuICogQHBhcmFtIHtDb29yZGluYXRlc30gYVxuICogQHJldHVybnMge0Nvb3JkaW5hdGVzfSBvdXRcbiAqL1xuZnVuY3Rpb24gZ2xUb1NwYXQ0Q2FydGVzaWFuKG91dCwgYSkge1xuICAvLyBjb3B5IHRvIGhhbmRsZSBpbi1wbGFjZVxuICB2YXIgeCA9IGFbMF07XG4gIHZhciB5ID0gYVsxXTtcbiAgdmFyIHogPSBhWzJdO1xuXG4gIG91dFswXSA9IHg7XG4gIG91dFsxXSA9IDAgLSB6O1xuICBvdXRbMl0gPSB5O1xuXG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ29udmVydCBTcGF0NCBjYXJ0ZXNpYW4gY29vcmRpbmF0ZXMgdG8gU3BhdDQgc3BoZXJpY2FsLlxuICpcbiAqIEBwYXJhbSB7Q29vcmRpbmF0ZXN9IG91dCBpbi1wbGFjZSBpZiBvdXQgPT09IGEuXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdGVzfSBhXG4gKiBAcmV0dXJucyB7Q29vcmRpbmF0ZXN9IG91dFxuICovXG5mdW5jdGlvbiBzcGF0NENhcnRlc2lhblRvU3BhdDRTcGhlcmljYWwob3V0LCBhKSB7XG4gIC8vIGNvcHkgdG8gaGFuZGxlIGluLXBsYWNlXG4gIHZhciB4ID0gYVswXTtcbiAgdmFyIHkgPSBhWzFdO1xuICB2YXIgeiA9IGFbMl07XG5cbiAgdmFyIHgyeTIgPSB4ICogeCArIHkgKiB5O1xuXG4gIG91dFswXSA9IF9kZWdyZWUyLmRlZmF1bHQuYXRhbjIoeCwgeSk7XG4gIG91dFsxXSA9IF9kZWdyZWUyLmRlZmF1bHQuYXRhbjIoeiwgTWF0aC5zcXJ0KHgyeTIpKTtcbiAgb3V0WzJdID0gTWF0aC5zcXJ0KHgyeTIgKyB6ICogeik7XG5cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IFNwYXQ0IHNwaGVyaWNhbCBjb29yZGluYXRlcyB0byBTcGF0NCBzcGhlcmljYWwuXG4gKlxuICogQHBhcmFtIHtDb29yZGluYXRlc30gb3V0IGluLXBsYWNlIGlmIG91dCA9PT0gYS5cbiAqIEBwYXJhbSB7Q29vcmRpbmF0ZXN9IGFcbiAqIEByZXR1cm5zIHtDb29yZGluYXRlc30gb3V0XG4gKi9cbmZ1bmN0aW9uIHNwYXQ0U3BoZXJpY2FsVG9TcGF0NENhcnRlc2lhbihvdXQsIGEpIHtcbiAgLy8gY29weSB0byBoYW5kbGUgaW4tcGxhY2VcbiAgdmFyIGF6aW11dGggPSBhWzBdO1xuICB2YXIgZWxldmF0aW9uID0gYVsxXTtcbiAgdmFyIGRpc3RhbmNlID0gYVsyXTtcblxuICB2YXIgY29zRSA9IF9kZWdyZWUyLmRlZmF1bHQuY29zKGVsZXZhdGlvbik7XG4gIG91dFswXSA9IGRpc3RhbmNlICogY29zRSAqIF9kZWdyZWUyLmRlZmF1bHQuc2luKGF6aW11dGgpOyAvLyBTcGF0NC54XG4gIG91dFsxXSA9IGRpc3RhbmNlICogY29zRSAqIF9kZWdyZWUyLmRlZmF1bHQuY29zKGF6aW11dGgpOyAvLyBTcGF0NC55XG4gIG91dFsyXSA9IGRpc3RhbmNlICogX2RlZ3JlZTIuZGVmYXVsdC5zaW4oZWxldmF0aW9uKTsgLy8gU3BhdDQuelxuXG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ29udmVydCBTcGF0NCBzcGhlcmljYWwgY29vcmRpbmF0ZXMgdG8gb3BlbkdMLlxuICpcbiAqIEBwYXJhbSB7Q29vcmRpbmF0ZXN9IG91dCBpbi1wbGFjZSBpZiBvdXQgPT09IGEuXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdGVzfSBhXG4gKiBAcmV0dXJucyB7Q29vcmRpbmF0ZXN9IG91dFxuICovXG5mdW5jdGlvbiBzcGF0NFNwaGVyaWNhbFRvR2wob3V0LCBhKSB7XG4gIC8vIGNvcHkgdG8gaGFuZGxlIGluLXBsYWNlXG4gIHZhciBhemltdXRoID0gYVswXTtcbiAgdmFyIGVsZXZhdGlvbiA9IGFbMV07XG4gIHZhciBkaXN0YW5jZSA9IGFbMl07XG5cbiAgdmFyIGNvc0UgPSBfZGVncmVlMi5kZWZhdWx0LmNvcyhlbGV2YXRpb24pO1xuICBvdXRbMF0gPSBkaXN0YW5jZSAqIGNvc0UgKiBfZGVncmVlMi5kZWZhdWx0LnNpbihhemltdXRoKTsgLy8gU3BhdDQueFxuICBvdXRbMV0gPSBkaXN0YW5jZSAqIF9kZWdyZWUyLmRlZmF1bHQuc2luKGVsZXZhdGlvbik7IC8vIFNwYXQ0LnpcbiAgb3V0WzJdID0gMCAtIGRpc3RhbmNlICogY29zRSAqIF9kZWdyZWUyLmRlZmF1bHQuY29zKGF6aW11dGgpOyAvLyAtU3BhdDQueVxuXG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ29udmVydCBvcGVuR0wgY29vcmRpbmF0ZXMgdG8gU3BhdDQgc3BoZXJpY2FsLlxuICpcbiAqIEBwYXJhbSB7Q29vcmRpbmF0ZXN9IG91dCBpbi1wbGFjZSBpZiBvdXQgPT09IGEuXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdGVzfSBhXG4gKiBAcmV0dXJucyB7Q29vcmRpbmF0ZXN9IG91dFxuICovXG5mdW5jdGlvbiBnbFRvU3BhdDRTcGhlcmljYWwob3V0LCBhKSB7XG4gIC8vIGNvcHkgdG8gaGFuZGxlIGluLXBsYWNlXG4gIC8vIGRpZmZlcmVuY2UgdG8gYXZvaWQgZ2VuZXJhdGluZyAtMCBvdXQgb2YgMFxuICB2YXIgeCA9IGFbMF07IC8vIG9wZW5HTC54XG4gIHZhciB5ID0gMCAtIGFbMl07IC8vIC1vcGVuR0wuelxuICB2YXIgeiA9IGFbMV07IC8vIG9wZW5HTC55XG5cbiAgdmFyIHgyeTIgPSB4ICogeCArIHkgKiB5O1xuXG4gIG91dFswXSA9IF9kZWdyZWUyLmRlZmF1bHQuYXRhbjIoeCwgeSk7XG4gIG91dFsxXSA9IF9kZWdyZWUyLmRlZmF1bHQuYXRhbjIoeiwgTWF0aC5zcXJ0KHgyeTIpKTtcbiAgb3V0WzJdID0gTWF0aC5zcXJ0KHgyeTIgKyB6ICogeik7XG5cbiAgcmV0dXJuIG91dDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLSBuYW1lZCBjb29yZGluYXRlIHN5c3RlbXNcblxuLyoqXG4gKiBHZXQgdGhlIGNvb3JkaW5hdGUgc3lzdGVtIGdlbmVyYWwgdHlwZSAoY2FydGVzaWFuIG9yIHNwaGVyaWNhbCkuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN5c3RlbVxuICogQHJldHVybnMge1N0cmluZ30gJ2NhcnRlc2lhbicgb3IgJ3NwaGVyaWNhbCcsIGlmIGBzeXN0ZW1gIGlmIG9mIGNhcnRlc2lhblxuICogb3Igc3BoZXJpY2FsIHR5cGUuXG4gKi9cbmZ1bmN0aW9uIHN5c3RlbVR5cGUoc3lzdGVtKSB7XG4gIHZhciB0eXBlID0gdm9pZCAwO1xuICBpZiAoc3lzdGVtID09PSAnc29mYUNhcnRlc2lhbicgfHwgc3lzdGVtID09PSAnc3BhdDRDYXJ0ZXNpYW4nIHx8IHN5c3RlbSA9PT0gJ2dsJykge1xuICAgIHR5cGUgPSAnY2FydGVzaWFuJztcbiAgfSBlbHNlIGlmIChzeXN0ZW0gPT09ICdzb2ZhU3BoZXJpY2FsJyB8fCBzeXN0ZW0gPT09ICdzcGF0NFNwaGVyaWNhbCcpIHtcbiAgICB0eXBlID0gJ3NwaGVyaWNhbCc7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGNvb3JkaW5hdGUgc3lzdGVtIHR5cGUgJyArIHN5c3RlbSk7XG4gIH1cbiAgcmV0dXJuIHR5cGU7XG59XG5cbi8qKlxuICogQ29udmVydCBjb29yZGluYXRlcyB0byBvcGVuR0wuXG4gKlxuICogQHBhcmFtIHtDb29yZGluYXRlc30gb3V0IGluLXBsYWNlIGlmIG91dCA9PT0gYS5cbiAqIEBwYXJhbSB7Q29vcmRpbmF0ZXN9IGFcbiAqIEBwYXJhbSB7Q29vcmRpbmF0ZVN5c3RlbX0gc3lzdGVtXG4gKiBAcmV0dXJucyB7Q29vcmRpbmF0ZXN9IG91dFxuICogQHRocm93cyB7RXJyb3J9IHdoZW4gdGhlIHN5c3RlbSBpcyB1bmtub3duLlxuICovXG5mdW5jdGlvbiBzeXN0ZW1Ub0dsKG91dCwgYSwgc3lzdGVtKSB7XG4gIHN3aXRjaCAoc3lzdGVtKSB7XG4gICAgY2FzZSAnZ2wnOlxuICAgICAgb3V0WzBdID0gYVswXTtcbiAgICAgIG91dFsxXSA9IGFbMV07XG4gICAgICBvdXRbMl0gPSBhWzJdO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzb2ZhQ2FydGVzaWFuJzpcbiAgICAgIHNvZmFDYXJ0ZXNpYW5Ub0dsKG91dCwgYSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NvZmFTcGhlcmljYWwnOlxuICAgICAgc29mYVNwaGVyaWNhbFRvR2wob3V0LCBhKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc3BhdDRDYXJ0ZXNpYW4nOlxuICAgICAgc3BhdDRDYXJ0ZXNpYW5Ub0dsKG91dCwgYSk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NwYXQ0U3BoZXJpY2FsJzpcbiAgICAgIHNwYXQ0U3BoZXJpY2FsVG9HbChvdXQsIGEpO1xuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWQgY29vcmRpbmF0ZSBzeXN0ZW0nKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENvbnZlcnQgb3BlbkdMIGNvb3JkaW5hdGVzIHRvIG90aGVyIHN5c3RlbS5cbiAqXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdGVzfSBvdXQgaW4tcGxhY2UgaWYgb3V0ID09PSBhLlxuICogQHBhcmFtIHtDb29yZGluYXRlc30gYVxuICogQHBhcmFtIHtDb29yZGluYXRlU3lzdGVtfSBzeXN0ZW1cbiAqIEByZXR1cm5zIHtDb29yZGluYXRlc30gb3V0XG4gKiBAdGhyb3dzIHtFcnJvcn0gd2hlbiB0aGUgc3lzdGVtIGlzIHVua25vd24uXG4gKi9cbmZ1bmN0aW9uIGdsVG9TeXN0ZW0ob3V0LCBhLCBzeXN0ZW0pIHtcbiAgc3dpdGNoIChzeXN0ZW0pIHtcbiAgICBjYXNlICdnbCc6XG4gICAgICBvdXRbMF0gPSBhWzBdO1xuICAgICAgb3V0WzFdID0gYVsxXTtcbiAgICAgIG91dFsyXSA9IGFbMl07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3NvZmFDYXJ0ZXNpYW4nOlxuICAgICAgZ2xUb1NvZmFDYXJ0ZXNpYW4ob3V0LCBhKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc29mYVNwaGVyaWNhbCc6XG4gICAgICBnbFRvU29mYVNwaGVyaWNhbChvdXQsIGEpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzcGF0NENhcnRlc2lhbic6XG4gICAgICBnbFRvU3BhdDRDYXJ0ZXNpYW4ob3V0LCBhKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc3BhdDRTcGhlcmljYWwnOlxuICAgICAgZ2xUb1NwYXQ0U3BoZXJpY2FsKG91dCwgYSk7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhZCBjb29yZGluYXRlIHN5c3RlbScpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgZ2xUb1NvZmFDYXJ0ZXNpYW46IGdsVG9Tb2ZhQ2FydGVzaWFuLFxuICBnbFRvU29mYVNwaGVyaWNhbDogZ2xUb1NvZmFTcGhlcmljYWwsXG4gIGdsVG9TcGF0NENhcnRlc2lhbjogZ2xUb1NwYXQ0Q2FydGVzaWFuLFxuICBnbFRvU3BhdDRTcGhlcmljYWw6IGdsVG9TcGF0NFNwaGVyaWNhbCxcbiAgZ2xUb1N5c3RlbTogZ2xUb1N5c3RlbSxcbiAgc29mYUNhcnRlc2lhblRvR2w6IHNvZmFDYXJ0ZXNpYW5Ub0dsLFxuICBzb2ZhQ2FydGVzaWFuVG9Tb2ZhU3BoZXJpY2FsOiBzb2ZhQ2FydGVzaWFuVG9Tb2ZhU3BoZXJpY2FsLFxuICBzb2ZhU3BoZXJpY2FsVG9HbDogc29mYVNwaGVyaWNhbFRvR2wsXG4gIHNvZmFTcGhlcmljYWxUb1NvZmFDYXJ0ZXNpYW46IHNvZmFTcGhlcmljYWxUb1NvZmFDYXJ0ZXNpYW4sXG4gIHNvZmFUb1NvZmFDYXJ0ZXNpYW46IHNvZmFUb1NvZmFDYXJ0ZXNpYW4sXG4gIHNwYXQ0Q2FydGVzaWFuVG9HbDogc3BhdDRDYXJ0ZXNpYW5Ub0dsLFxuICBzcGF0NENhcnRlc2lhblRvU3BhdDRTcGhlcmljYWw6IHNwYXQ0Q2FydGVzaWFuVG9TcGF0NFNwaGVyaWNhbCxcbiAgc3BhdDRTcGhlcmljYWxUb0dsOiBzcGF0NFNwaGVyaWNhbFRvR2wsXG4gIHNwYXQ0U3BoZXJpY2FsVG9TcGF0NENhcnRlc2lhbjogc3BhdDRTcGhlcmljYWxUb1NwYXQ0Q2FydGVzaWFuLFxuICBzeXN0ZW1Ub0dsOiBzeXN0ZW1Ub0dsLFxuICBzeXN0ZW1UeXBlOiBzeXN0ZW1UeXBlXG59OyIsIlwidXNlIHN0cmljdFwiO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy50b1JhZGlhbiA9IHRvUmFkaWFuO1xuZXhwb3J0cy5mcm9tUmFkaWFuID0gZnJvbVJhZGlhbjtcbmV4cG9ydHMuY29zID0gY29zO1xuZXhwb3J0cy5zaW4gPSBzaW47XG5leHBvcnRzLmF0YW4yID0gYXRhbjI7XG4vKipcbiAqIEBmaWxlT3ZlcnZpZXcgQ29udmVydCB0byBhbmQgZnJvbSBkZWdyZWVcbiAqIEBhdXRob3IgSmVhbi1QaGlsaXBwZS5MYW1iZXJ0QGlyY2FtLmZyXG4gKiBAY29weXJpZ2h0IDIwMTUtMjAxNiBJUkNBTSwgUGFyaXMsIEZyYW5jZVxuICogQGxpY2Vuc2UgQlNELTMtQ2xhdXNlXG4gKi9cblxuLyoqXG4gKiBEZWdyZWUgdG8gcmFkaWFuIG11bHRpcGxpY2F0aW9uIGZhY3Rvci5cbiAqXG4gKiBAdHlwZSB7TnVtYmVyfVxuICovXG52YXIgdG9SYWRpYW5GYWN0b3IgPSBleHBvcnRzLnRvUmFkaWFuRmFjdG9yID0gTWF0aC5QSSAvIDE4MDtcblxuLyoqXG4gKiBSYWRpYW4gdG8gZGVncmVlIG11bHRpcGxpY2F0aW9uIGZhY3Rvci5cbiAqXG4gKiBAdHlwZSB7TnVtYmVyfVxuICovXG52YXIgZnJvbVJhZGlhbkZhY3RvciA9IGV4cG9ydHMuZnJvbVJhZGlhbkZhY3RvciA9IDEgLyB0b1JhZGlhbkZhY3RvcjtcblxuLyoqXG4gKiBDb252ZXJ0IGFuIGFuZ2xlIGluIGRlZ3JlZXMgdG8gcmFkaWFucy5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gYW5nbGUgaW4gZGVncmVlc1xuICogQHJldHVybnMge051bWJlcn0gYW5nbGUgaW4gcmFkaWFuc1xuICovXG5mdW5jdGlvbiB0b1JhZGlhbihhbmdsZSkge1xuICByZXR1cm4gYW5nbGUgKiB0b1JhZGlhbkZhY3Rvcjtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGFuIGFuZ2xlIGluIHJhZGlhbnMgdG8gZGVncmVlcy5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gYW5nbGUgaW4gcmFkaWFuc1xuICogQHJldHVybnMge051bWJlcn0gYW5nbGUgaW4gZGVncmVlc1xuICovXG5mdW5jdGlvbiBmcm9tUmFkaWFuKGFuZ2xlKSB7XG4gIHJldHVybiBhbmdsZSAqIGZyb21SYWRpYW5GYWN0b3I7XG59XG5cbi8qKlxuICogR2V0IHRoZSBjb3NpbnVzIG9mIGFuIGFuZ2xlIGluIGRlZ3JlZXMuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGFuZ2xlXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICovXG5mdW5jdGlvbiBjb3MoYW5nbGUpIHtcbiAgcmV0dXJuIE1hdGguY29zKGFuZ2xlICogdG9SYWRpYW5GYWN0b3IpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgc2ludXMgb2YgYW4gYW5nbGUgaW4gZGVncmVlcy5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gYW5nbGVcbiAqIEByZXR1cm5zIHtOdW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIHNpbihhbmdsZSkge1xuICByZXR1cm4gTWF0aC5zaW4oYW5nbGUgKiB0b1JhZGlhbkZhY3Rvcik7XG59XG5cbi8qKlxuICogR2V0IHRoZSBhcmMtdGFuZ2VudCAoMiBhcmd1bWVudHMpIG9mIDIgYW5nbGVzIGluIGRlZ3JlZXMuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHlcbiAqIEBwYXJhbSB7TnVtYmVyfSB4XG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICovXG5mdW5jdGlvbiBhdGFuMih5LCB4KSB7XG4gIHJldHVybiBNYXRoLmF0YW4yKHksIHgpICogZnJvbVJhZGlhbkZhY3Rvcjtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0ge1xuICBhdGFuMjogYXRhbjIsXG4gIGNvczogY29zLFxuICBmcm9tUmFkaWFuOiBmcm9tUmFkaWFuLFxuICBmcm9tUmFkaWFuRmFjdG9yOiBmcm9tUmFkaWFuRmFjdG9yLFxuICBzaW46IHNpbixcbiAgdG9SYWRpYW46IHRvUmFkaWFuLFxuICB0b1JhZGlhbkZhY3RvcjogdG9SYWRpYW5GYWN0b3Jcbn07IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5TZXJ2ZXJEYXRhQmFzZSA9IGV4cG9ydHMuSHJ0ZlNldCA9IHVuZGVmaW5lZDtcblxudmFyIF9IcnRmU2V0ID0gcmVxdWlyZSgnLi9zb2ZhL0hydGZTZXQnKTtcblxudmFyIF9IcnRmU2V0MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX0hydGZTZXQpO1xuXG52YXIgX1NlcnZlckRhdGFCYXNlID0gcmVxdWlyZSgnLi9zb2ZhL1NlcnZlckRhdGFCYXNlJyk7XG5cbnZhciBfU2VydmVyRGF0YUJhc2UyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfU2VydmVyRGF0YUJhc2UpO1xuXG5mdW5jdGlvbiBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KG9iaikgeyByZXR1cm4gb2JqICYmIG9iai5fX2VzTW9kdWxlID8gb2JqIDogeyBkZWZhdWx0OiBvYmogfTsgfVxuXG5leHBvcnRzLkhydGZTZXQgPSBfSHJ0ZlNldDIuZGVmYXVsdDtcbmV4cG9ydHMuU2VydmVyRGF0YUJhc2UgPSBfU2VydmVyRGF0YUJhc2UyLmRlZmF1bHQ7XG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIEhydGZTZXQ6IF9IcnRmU2V0Mi5kZWZhdWx0LFxuICBTZXJ2ZXJEYXRhQmFzZTogX1NlcnZlckRhdGFCYXNlMi5kZWZhdWx0XG59O1xuXG4vLyBpbXBvcnQgYXVkaW8gZnJvbSAnLi9hdWRpbyc7XG4vLyBleHBvcnQgeyBhdWRpbyB9O1xuLy8gaW1wb3J0IGNvbW1vbiBmcm9tICcuL2NvbW1vbic7XG4vLyBleHBvcnQgeyBjb21tb24gfTtcbi8vIGltcG9ydCBnZW9tZXRyeSBmcm9tICcuL2dlb21ldHJ5Jztcbi8vIGV4cG9ydCB7IGdlb21ldHJ5IH07XG4vLyBpbXBvcnQgaW5mbyBmcm9tICcuL2luZm8nO1xuLy8gZXhwb3J0IHsgaW5mbyB9O1xuLy8gaW1wb3J0IHNvZmEgZnJvbSAnLi9zb2ZhJztcbi8vIGV4cG9ydCB7IHNvZmEgfTtcblxuLy8gZXhwb3J0IGRlZmF1bHQge1xuLy8gICBhdWRpbyxcbi8vICAgY29tbW9uLFxuLy8gICBnZW9tZXRyeSxcbi8vICAgaW5mbyxcbi8vICAgc29mYSxcbi8vIH07IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy52ZXJzaW9uID0gZXhwb3J0cy5uYW1lID0gZXhwb3J0cy5saWNlbnNlID0gZXhwb3J0cy5kZXNjcmlwdGlvbiA9IHVuZGVmaW5lZDtcblxudmFyIF9wYWNrYWdlID0gcmVxdWlyZSgnLi4vcGFja2FnZS5qc29uJyk7XG5cbnZhciBfcGFja2FnZTIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9wYWNrYWdlKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuLyoqXG4gKiBAbW9kdWxlIGluZm9cbiAqL1xuXG4vKipcbiAqIFNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBsaWJyYXJ5LlxuICpcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKi9cbnZhciBkZXNjcmlwdGlvbiA9IF9wYWNrYWdlMi5kZWZhdWx0LmRlc2NyaXB0aW9uO1xuXG4vKipcbiAqIExpY2Vuc2Ugb2YgdGhlIGxpYnJhcnkuXG4gKlxuICogQHR5cGUge1N0cmluZ31cbiAqL1xuLyoqXG4gKiBAZmlsZU92ZXJ2aWV3IEluZm9ybWF0aW9uIG9uIHRoZSBsaWJyYXJ5LCBmcm9tIHRoZSBgcGFja2FnZS5qc29uYCBmaWxlLlxuICpcbiAqIEBhdXRob3IgSmVhbi1QaGlsaXBwZS5MYW1iZXJ0QGlyY2FtLmZyXG4gKiBAY29weXJpZ2h0IDIwMTYgSVJDQU0sIFBhcmlzLCBGcmFuY2VcbiAqIEBsaWNlbnNlIEJTRC0zLUNsYXVzZVxuICovXG5cbmV4cG9ydHMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbnZhciBsaWNlbnNlID0gX3BhY2thZ2UyLmRlZmF1bHQubGljZW5zZTtcblxuLyoqXG4gKiBOYW1lIG9mIHRoZSBsaWJyYXJ5LlxuICpcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKi9cblxuZXhwb3J0cy5saWNlbnNlID0gbGljZW5zZTtcbnZhciBuYW1lID0gX3BhY2thZ2UyLmRlZmF1bHQubmFtZTtcblxuLyoqXG4gKiBTZW1hbnRpYyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5LlxuICpcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKi9cblxuZXhwb3J0cy5uYW1lID0gbmFtZTtcbnZhciB2ZXJzaW9uID0gX3BhY2thZ2UyLmRlZmF1bHQudmVyc2lvbjtcbmV4cG9ydHMudmVyc2lvbiA9IHZlcnNpb247XG5leHBvcnRzLmRlZmF1bHQgPSB7XG4gIGRlc2NyaXB0aW9uOiBkZXNjcmlwdGlvbixcbiAgbGljZW5zZTogbGljZW5zZSxcbiAgbmFtZTogbmFtZSxcbiAgdmVyc2lvbjogdmVyc2lvblxufTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLkhydGZTZXQgPSB1bmRlZmluZWQ7XG5cbnZhciBfY3JlYXRlQ2xhc3MgPSBmdW5jdGlvbiAoKSB7IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfSByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIGRlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTsgcmV0dXJuIENvbnN0cnVjdG9yOyB9OyB9KCk7IC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBmaWxlT3ZlcnZpZXcgQ29udGFpbmVyIGZvciBIUlRGIHNldDogbG9hZCBhIHNldCBmcm9tIGFuIFVSTCBhbmQgZ2V0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZmlsdGVycyBmcm9tIGNvcnJlc3BvbmRpbmcgcG9zaXRpb25zLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQGF1dGhvciBKZWFuLVBoaWxpcHBlLkxhbWJlcnRAaXJjYW0uZnJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAY29weXJpZ2h0IDIwMTUtMjAxNiBJUkNBTSwgUGFyaXMsIEZyYW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBsaWNlbnNlIEJTRC0zLUNsYXVzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG52YXIgX2dsTWF0cml4ID0gcmVxdWlyZSgnZ2wtbWF0cml4Jyk7XG5cbnZhciBfZ2xNYXRyaXgyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZ2xNYXRyaXgpO1xuXG52YXIgX2luZm8gPSByZXF1aXJlKCcuLi9pbmZvJyk7XG5cbnZhciBfaW5mbzIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9pbmZvKTtcblxudmFyIF9wYXJzZURhdGFTZXQgPSByZXF1aXJlKCcuL3BhcnNlRGF0YVNldCcpO1xuXG52YXIgX3BhcnNlU29mYSA9IHJlcXVpcmUoJy4vcGFyc2VTb2ZhJyk7XG5cbnZhciBfY29vcmRpbmF0ZXMgPSByZXF1aXJlKCcuLi9nZW9tZXRyeS9jb29yZGluYXRlcycpO1xuXG52YXIgX2Nvb3JkaW5hdGVzMiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Nvb3JkaW5hdGVzKTtcblxudmFyIF9LZFRyZWUgPSByZXF1aXJlKCcuLi9nZW9tZXRyeS9LZFRyZWUnKTtcblxudmFyIF9LZFRyZWUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfS2RUcmVlKTtcblxudmFyIF91dGlsaXRpZXMgPSByZXF1aXJlKCcuLi9hdWRpby91dGlsaXRpZXMnKTtcblxuZnVuY3Rpb24gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChvYmopIHsgcmV0dXJuIG9iaiAmJiBvYmouX19lc01vZHVsZSA/IG9iaiA6IHsgZGVmYXVsdDogb2JqIH07IH1cblxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSBlbHNlIHsgcmV0dXJuIEFycmF5LmZyb20oYXJyKTsgfSB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbi8qKlxuICogQ29udGFpbmVyIGZvciBIUlRGIHNldC5cbiAqL1xuXG52YXIgSHJ0ZlNldCA9IGV4cG9ydHMuSHJ0ZlNldCA9IGZ1bmN0aW9uICgpIHtcblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhbiBIUlRGIHNldC4gTm90ZSB0aGF0IHRoZSBmaWx0ZXIgcG9zaXRpb25zIGFyZSBhcHBsaWVkXG4gICAqIGR1cmluZyB0aGUgbG9hZCBvZiBhbiBVUkwuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIEhydGZTZXQjbG9hZH1cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnNcbiAgICogQHBhcmFtIHtBdWRpb0NvbnRleHR9IG9wdGlvbnMuYXVkaW9Db250ZXh0IG1hbmRhdG9yeSBmb3IgdGhlIGNyZWF0aW9uXG4gICAqIG9mIEZJUiBhdWRpbyBidWZmZXJzXG4gICAqIEBwYXJhbSB7Q29vcmRpbmF0ZVN5c3RlbX0gW29wdGlvbnMuY29vcmRpbmF0ZVN5c3RlbT0nZ2wnXVxuICAgKiB7QGxpbmsgSHJ0ZlNldCNjb29yZGluYXRlU3lzdGVtfVxuICAgKiBAcGFyYW0ge0Nvb3JkaW5hdGVTeXN0ZW19IFtvcHRpb25zLmZpbHRlckNvb3JkaW5hdGVTeXN0ZW09b3B0aW9ucy5jb29yZGluYXRlU3lzdGVtXVxuICAgKiB7QGxpbmsgSHJ0ZlNldCNmaWx0ZXJDb29yZGluYXRlU3lzdGVtfVxuICAgKiBAcGFyYW0ge0FycmF5LjxDb29yZGluYXRlcz59IFtvcHRpb25zLmZpbHRlclBvc2l0aW9ucz11bmRlZmluZWRdXG4gICAqIHtAbGluayBIcnRmU2V0I2ZpbHRlclBvc2l0aW9uc31cbiAgICogYXJyYXkgb2YgcG9zaXRpb25zIHRvIGZpbHRlci4gVXNlIHVuZGVmaW5lZCB0byB1c2UgYWxsIHBvc2l0aW9ucy5cbiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5maWx0ZXJBZnRlckxvYWQ9ZmFsc2VdIHRydWUgdG8gZmlsdGVyIGFmdGVyXG4gICAqIGZ1bGwgbG9hZCBvZiBTT0ZBIGZpbGUsIGluc3RlYWQgb2YgbXVsdGlwbGUgcGFydGlhbCBsb2FkaW5nLlxuICAgKiB7QGxpbmsgSHJ0ZlNldCNmaWx0ZXJBZnRlckxvYWR9XG4gICAqL1xuXG4gIGZ1bmN0aW9uIEhydGZTZXQoKSB7XG4gICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoIDw9IDAgfHwgYXJndW1lbnRzWzBdID09PSB1bmRlZmluZWQgPyB7fSA6IGFyZ3VtZW50c1swXTtcblxuICAgIF9jbGFzc0NhbGxDaGVjayh0aGlzLCBIcnRmU2V0KTtcblxuICAgIHRoaXMuX2F1ZGlvQ29udGV4dCA9IG9wdGlvbnMuYXVkaW9Db250ZXh0O1xuXG4gICAgdGhpcy5fcmVhZHkgPSBmYWxzZTtcblxuICAgIHRoaXMuY29vcmRpbmF0ZVN5c3RlbSA9IG9wdGlvbnMuY29vcmRpbmF0ZVN5c3RlbTtcblxuICAgIHRoaXMuZmlsdGVyQ29vcmRpbmF0ZVN5c3RlbSA9IG9wdGlvbnMuZmlsdGVyQ29vcmRpbmF0ZVN5c3RlbTtcbiAgICB0aGlzLmZpbHRlclBvc2l0aW9ucyA9IG9wdGlvbnMuZmlsdGVyUG9zaXRpb25zO1xuXG4gICAgdGhpcy5maWx0ZXJBZnRlckxvYWQgPSBvcHRpb25zLmZpbHRlckFmdGVyTG9hZDtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLSBhY2Nlc3NvcnNcblxuICAvKipcbiAgICogU2V0IGNvb3JkaW5hdGUgc3lzdGVtIGZvciBwb3NpdGlvbnMuXG4gICAqIEBwYXJhbSB7Q29vcmRpbmF0ZVN5c3RlbX0gW3N5c3RlbT0nZ2wnXVxuICAgKi9cblxuXG4gIF9jcmVhdGVDbGFzcyhIcnRmU2V0LCBbe1xuICAgIGtleTogJ2FwcGx5RmlsdGVyUG9zaXRpb25zJyxcblxuXG4gICAgLy8gLS0tLS0tLS0tLS0tLSBwdWJsaWMgbWV0aG9kc1xuXG4gICAgLyoqXG4gICAgICogQXBwbHkgZmlsdGVyIHBvc2l0aW9ucyB0byBhbiBleGlzdGluZyBzZXQgb2YgSFJURi4gKEFmdGVyIGEgc3VjY2Vzc2Z1bFxuICAgICAqIGxvYWQuKVxuICAgICAqXG4gICAgICogVGhpcyBpcyBkZXN0cnVjdGl2ZS5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIEhydGZTZXQjbG9hZH1cbiAgICAgKi9cbiAgICB2YWx1ZTogZnVuY3Rpb24gYXBwbHlGaWx0ZXJQb3NpdGlvbnMoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAvLyBkbyBub3QgdXNlIGdldHRlciBmb3IgZ2wgcG9zaXRpb25zXG4gICAgICB2YXIgZmlsdGVyZWRQb3NpdGlvbnMgPSB0aGlzLl9maWx0ZXJQb3NpdGlvbnMubWFwKGZ1bmN0aW9uIChjdXJyZW50KSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5fa2R0Lm5lYXJlc3QoeyB4OiBjdXJyZW50WzBdLCB5OiBjdXJyZW50WzFdLCB6OiBjdXJyZW50WzJdIH0sIDEpLnBvcCgpWzBdOyAvLyBuZWFyZXN0IGRhdGFcbiAgICAgIH0pO1xuXG4gICAgICAvLyBmaWx0ZXIgb3V0IGR1cGxpY2F0ZXNcbiAgICAgIGZpbHRlcmVkUG9zaXRpb25zID0gW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheShuZXcgU2V0KGZpbHRlcmVkUG9zaXRpb25zKSkpO1xuXG4gICAgICB0aGlzLl9rZHQgPSBfS2RUcmVlMi5kZWZhdWx0LnRyZWUuY3JlYXRlS2RUcmVlKGZpbHRlcmVkUG9zaXRpb25zLCBfS2RUcmVlMi5kZWZhdWx0LmRpc3RhbmNlU3F1YXJlZCwgWyd4JywgJ3knLCAneiddKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGFuIFVSTCBhbmQgZ2VuZXJhdGUgdGhlIGNvcnJlc3BvbmRpbmcgc2V0IG9mIElSIGJ1ZmZlcnMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc291cmNlVXJsXG4gICAgICogQHJldHVybnMge1Byb21pc2UuPHRoaXN8RXJyb3I+fSByZXNvbHZlIHdoZW4gdGhlIFVSTCBzdWNlc3NmdWxseVxuICAgICAqIGxvYWRlZC5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbG9hZCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxvYWQoc291cmNlVXJsKSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIGV4dGVuc2lvbiA9IHNvdXJjZVVybC5zcGxpdCgnLicpLnBvcCgpO1xuXG4gICAgICB2YXIgdXJsID0gZXh0ZW5zaW9uID09PSAnc29mYScgPyBzb3VyY2VVcmwgKyAnLmpzb24nIDogc291cmNlVXJsO1xuXG4gICAgICB2YXIgcHJvbWlzZSA9IHZvaWQgMDtcblxuICAgICAgLy8gbmVlZCBhIHNlcnZlciBmb3IgcGFydGlhbCBkb3dubG9hZGluZyAoXCJzb2ZhXCIgZXh0ZW5zaW9uIG1heSBiZSBuYWl2ZSlcbiAgICAgIHZhciBwcmVGaWx0ZXIgPSB0eXBlb2YgdGhpcy5fZmlsdGVyUG9zaXRpb25zICE9PSAndW5kZWZpbmVkJyAmJiAhdGhpcy5maWx0ZXJBZnRlckxvYWQgJiYgZXh0ZW5zaW9uID09PSAnc29mYSc7XG4gICAgICBpZiAocHJlRmlsdGVyKSB7XG4gICAgICAgIHByb21pc2UgPSBQcm9taXNlLmFsbChbdGhpcy5fbG9hZE1ldGFBbmRQb3NpdGlvbnMoc291cmNlVXJsKSwgdGhpcy5fbG9hZERhdGFTZXQoc291cmNlVXJsKV0pLnRoZW4oZnVuY3Rpb24gKGluZGljZXNBbmREYXRhU2V0KSB7XG4gICAgICAgICAgdmFyIGluZGljZXMgPSBpbmRpY2VzQW5kRGF0YVNldFswXTtcbiAgICAgICAgICB2YXIgZGF0YVNldCA9IGluZGljZXNBbmREYXRhU2V0WzFdO1xuICAgICAgICAgIHJldHVybiBfdGhpczIuX2xvYWRTb2ZhUGFydGlhbChzb3VyY2VVcmwsIGluZGljZXMsIGRhdGFTZXQpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMyLl9yZWFkeSA9IHRydWU7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMyOyAvLyBmaW5hbCByZXNvbHZlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyB3aGVuIHByZS1maXRlcmluZyBmYWlscywgZm9yIGFueSByZWFzb24sIHRyeSB0byBwb3N0LWZpbHRlclxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGBFcnJvciB3aGlsZSBwYXJ0aWFsIGxvYWRpbmcgb2YgJHtzb3VyY2VVcmx9LiBgXG4gICAgICAgICAgLy8gICAgICAgICAgICAgKyBgJHtlcnJvci5tZXNzYWdlfS4gYFxuICAgICAgICAgIC8vICAgICAgICAgICAgICsgYExvYWQgZnVsbCBhbmQgcG9zdC1maWx0ZXJpbmcsIGluc3RlYWQuYCk7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMi5fbG9hZFNvZmFGdWxsKHVybCkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBfdGhpczIuYXBwbHlGaWx0ZXJQb3NpdGlvbnMoKTtcbiAgICAgICAgICAgIF90aGlzMi5fcmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMjsgLy8gZmluYWwgcmVzb2x2ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcHJvbWlzZSA9IHRoaXMuX2xvYWRTb2ZhRnVsbCh1cmwpLnRoZW4oZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBfdGhpczIuX2ZpbHRlclBvc2l0aW9ucyAhPT0gJ3VuZGVmaW5lZCcgJiYgX3RoaXMyLmZpbHRlckFmdGVyTG9hZCkge1xuICAgICAgICAgICAgICBfdGhpczIuYXBwbHlGaWx0ZXJQb3NpdGlvbnMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF90aGlzMi5fcmVhZHkgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuIF90aGlzMjsgLy8gZmluYWwgcmVzb2x2ZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4cG9ydCB0aGUgY3VycmVudCBIUlRGIHNldCBhcyBhIEpTT04gc3RyaW5nLlxuICAgICAqXG4gICAgICogV2hlbiBzZXQsIGB0aGlzLmZpbHRlclBvc2l0aW9uc2AgcmVkdWNlIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGZpbHRlciwgYW5kXG4gICAgICogdGh1cyB0aGUgZXhwb3J0ZWQgc2V0LiBUaGUgY29vcmRpbmF0ZSBzeXN0ZW0gb2YgdGhlIGV4cG9ydCBpc1xuICAgICAqIGB0aGlzLmZpbHRlckNvb3JkaW5hdGVTeXN0ZW1gLlxuICAgICAqXG4gICAgICogQHNlZSB7QGxpbmsgSHJ0ZlNldCNmaWx0ZXJDb29yZGluYXRlU3lzdGVtfVxuICAgICAqIEBzZWUge0BsaW5rIEhydGZTZXQjZmlsdGVyUG9zaXRpb25zfVxuICAgICAqXG4gICAgICogQHJldHVybnMge1N0cmluZ30gYXMgYSBTT0ZBIEpTT04gZmlsZS5cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gd2hlbiB0aGlzLmZpbHRlckNvb3JkaW5hdGVTeXN0ZW0gaXMgdW5rbm93bi5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZXhwb3J0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2V4cG9ydCgpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICAvLyBpbiBhIFNPRkEgZmlsZSwgdGhlIHNvdXJjZSBwb3NpdGlvbnMgYXJlIHRoZSBIcnRmU2V0IGZpbHRlciBwb3NpdGlvbnMuXG5cbiAgICAgIC8vIFNPRkEgbGlzdGVuZXIgaXMgdGhlIHJlZmVyZW5jZSBmb3IgSHJ0ZlNldCBmaWx0ZXIgcG9zaXRpb25zXG4gICAgICAvLyB3aGljaCBpcyBub3JtYWxpc2VkIGluIEhydGZTZXRcblxuICAgICAgdmFyIFNvdXJjZVBvc2l0aW9uID0gdm9pZCAwO1xuICAgICAgdmFyIFNvdXJjZVBvc2l0aW9uVHlwZSA9IF9jb29yZGluYXRlczIuZGVmYXVsdC5zeXN0ZW1UeXBlKHRoaXMuZmlsdGVyQ29vcmRpbmF0ZVN5c3RlbSk7XG4gICAgICBzd2l0Y2ggKFNvdXJjZVBvc2l0aW9uVHlwZSkge1xuICAgICAgICBjYXNlICdjYXJ0ZXNpYW4nOlxuICAgICAgICAgIFNvdXJjZVBvc2l0aW9uID0gdGhpcy5fc29mYVNvdXJjZVBvc2l0aW9uLm1hcChmdW5jdGlvbiAocG9zaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBfY29vcmRpbmF0ZXMyLmRlZmF1bHQuZ2xUb1NvZmFDYXJ0ZXNpYW4oW10sIHBvc2l0aW9uKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdzcGhlcmljYWwnOlxuICAgICAgICAgIFNvdXJjZVBvc2l0aW9uID0gdGhpcy5fc29mYVNvdXJjZVBvc2l0aW9uLm1hcChmdW5jdGlvbiAocG9zaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBfY29vcmRpbmF0ZXMyLmRlZmF1bHQuZ2xUb1NvZmFTcGhlcmljYWwoW10sIHBvc2l0aW9uKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmFkIHNvdXJjZSBwb3NpdGlvbiB0eXBlICcgKyBTb3VyY2VQb3NpdGlvblR5cGUgKyAnICcgKyAnZm9yIGV4cG9ydC4nKTtcbiAgICAgIH1cblxuICAgICAgdmFyIERhdGFJUiA9IHRoaXMuX3NvZmFTb3VyY2VQb3NpdGlvbi5tYXAoZnVuY3Rpb24gKHBvc2l0aW9uKSB7XG4gICAgICAgIC8vIHJldHJpZXZlIGZpciBmb3IgZWFjaCBwb3NpdGlvbiwgd2l0aG91dCBjb252ZXJzaW9uXG4gICAgICAgIHZhciBmaXIgPSBfdGhpczMuX2tkdC5uZWFyZXN0KHsgeDogcG9zaXRpb25bMF0sIHk6IHBvc2l0aW9uWzFdLCB6OiBwb3NpdGlvblsyXSB9LCAxKS5wb3AoKVswXS5maXI7IC8vIG5lYXJlc3QgZGF0YVxuICAgICAgICB2YXIgaXIgPSBbXTtcbiAgICAgICAgZm9yICh2YXIgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBmaXIubnVtYmVyT2ZDaGFubmVsczsgKytjaGFubmVsKSB7XG4gICAgICAgICAgLy8gRmxvYXQzMkFycmF5IHRvIGFycmF5IGZvciBzdHJpbmdpZnlcbiAgICAgICAgICBpci5wdXNoKFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkoZmlyLmdldENoYW5uZWxEYXRhKGNoYW5uZWwpKSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpcjtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gKDAsIF9wYXJzZVNvZmEuc3RyaW5naWZ5U29mYSkoe1xuICAgICAgICBuYW1lOiB0aGlzLl9zb2ZhTmFtZSxcbiAgICAgICAgbWV0YURhdGE6IHRoaXMuX3NvZmFNZXRhRGF0YSxcbiAgICAgICAgTGlzdGVuZXJQb3NpdGlvbjogWzAsIDAsIDBdLFxuICAgICAgICBMaXN0ZW5lclBvc2l0aW9uVHlwZTogJ2NhcnRlc2lhbicsXG4gICAgICAgIExpc3RlbmVyVXA6IFswLCAwLCAxXSxcbiAgICAgICAgTGlzdGVuZXJVcFR5cGU6ICdjYXJ0ZXNpYW4nLFxuICAgICAgICBMaXN0ZW5lclZpZXc6IFsxLCAwLCAwXSxcbiAgICAgICAgTGlzdGVuZXJWaWV3VHlwZTogJ2NhcnRlc2lhbicsXG4gICAgICAgIFNvdXJjZVBvc2l0aW9uVHlwZTogU291cmNlUG9zaXRpb25UeXBlLFxuICAgICAgICBTb3VyY2VQb3NpdGlvbjogU291cmNlUG9zaXRpb24sXG4gICAgICAgIERhdGFTYW1wbGluZ1JhdGU6IHRoaXMuX2F1ZGlvQ29udGV4dC5zYW1wbGVSYXRlLFxuICAgICAgICBEYXRhRGVsYXk6IHRoaXMuX3NvZmFEZWxheSxcbiAgICAgICAgRGF0YUlSOiBEYXRhSVIsXG4gICAgICAgIFJvb21Wb2x1bWU6IHRoaXMuX3NvZmFSb29tVm9sdW1lXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIcnRmU2V0Lm5lYXJlc3RUeXBlXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IGRpc3RhbmNlIGZyb20gdGhlIHJlcXVlc3RcbiAgICAgKiBAcHJvcGVydHkge0F1ZGlvQnVmZmVyfSBmaXIgMi1jaGFubmVscyBpbXB1bHNlIHJlc3BvbnNlXG4gICAgICogQHByb3BlcnR5IHtOdW1iZXJ9IGluZGV4IG9yaWdpbmFsIGluZGV4IGluIHRoZSBTT0ZBIHNldFxuICAgICAqIEBwcm9wZXJ0eSB7Q29vcmRpbmF0ZXN9IHBvc2l0aW9uIHVzaW5nIGNvb3JkaW5hdGVTeXN0ZW0gY29vcmRpbmF0ZXNcbiAgICAgKiBzeXN0ZW0uXG4gICAgICovXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG5lYXJlc3QgcG9pbnQgaW4gdGhlIEhSVEYgc2V0LCBhZnRlciBhIHN1Y2Nlc3NmdWwgbG9hZC5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIEhydGZTZXQjbG9hZH1cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Q29vcmRpbmF0ZXN9IHBvc2l0aW9uUmVxdWVzdFxuICAgICAqIEByZXR1cm5zIHtIcnRmU2V0Lm5lYXJlc3RUeXBlfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICduZWFyZXN0JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gbmVhcmVzdChwb3NpdGlvblJlcXVlc3QpIHtcbiAgICAgIHZhciBwb3NpdGlvbiA9IF9jb29yZGluYXRlczIuZGVmYXVsdC5zeXN0ZW1Ub0dsKFtdLCBwb3NpdGlvblJlcXVlc3QsIHRoaXMuY29vcmRpbmF0ZVN5c3RlbSk7XG4gICAgICB2YXIgbmVhcmVzdCA9IHRoaXMuX2tkdC5uZWFyZXN0KHtcbiAgICAgICAgeDogcG9zaXRpb25bMF0sXG4gICAgICAgIHk6IHBvc2l0aW9uWzFdLFxuICAgICAgICB6OiBwb3NpdGlvblsyXVxuICAgICAgfSwgMSkucG9wKCk7IC8vIG5lYXJlc3Qgb25seVxuICAgICAgdmFyIGRhdGEgPSBuZWFyZXN0WzBdO1xuICAgICAgX2Nvb3JkaW5hdGVzMi5kZWZhdWx0LmdsVG9TeXN0ZW0ocG9zaXRpb24sIFtkYXRhLngsIGRhdGEueSwgZGF0YS56XSwgdGhpcy5jb29yZGluYXRlU3lzdGVtKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRpc3RhbmNlOiBuZWFyZXN0WzFdLFxuICAgICAgICBmaXI6IGRhdGEuZmlyLFxuICAgICAgICBpbmRleDogZGF0YS5pbmRleCxcbiAgICAgICAgcG9zaXRpb246IHBvc2l0aW9uXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgRklSIEF1ZGlvQnVmZmVyIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGNsb3Nlc3QgcG9zaXRpb24gaW5cbiAgICAgKiB0aGUgc2V0LlxuICAgICAqIEBwYXJhbSB7Q29vcmRpbmF0ZXN9IHBvc2l0aW9uUmVxdWVzdFxuICAgICAqIEByZXR1cm5zIHtBdWRpb0J1ZmZlcn1cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnbmVhcmVzdEZpcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIG5lYXJlc3RGaXIocG9zaXRpb25SZXF1ZXN0KSB7XG4gICAgICByZXR1cm4gdGhpcy5uZWFyZXN0KHBvc2l0aW9uUmVxdWVzdCkuZmlyO1xuICAgIH1cblxuICAgIC8vIC0tLS0tLS0tLS0tIHByaXZhdGUgbWV0aG9kc1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGtkLXRyZWUgb3V0IG9mIHRoZSBzcGVjaWZpZWQgaW5kaWNlcywgcG9zaXRpb25zLCBhbmQgRklSLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGluZGljZXNQb3NpdGlvbnNGaXJzXG4gICAgICogQHJldHVybnMge3RoaXN9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ19jcmVhdGVLZFRyZWUnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfY3JlYXRlS2RUcmVlKGluZGljZXNQb3NpdGlvbnNGaXJzKSB7XG4gICAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgICAgdmFyIHBvc2l0aW9ucyA9IGluZGljZXNQb3NpdGlvbnNGaXJzLm1hcChmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgdmFyIGltcHVsc2VSZXNwb25zZXMgPSB2YWx1ZVsyXTtcbiAgICAgICAgdmFyIGZpciA9IF90aGlzNC5fYXVkaW9Db250ZXh0LmNyZWF0ZUJ1ZmZlcihpbXB1bHNlUmVzcG9uc2VzLmxlbmd0aCwgaW1wdWxzZVJlc3BvbnNlc1swXS5sZW5ndGgsIF90aGlzNC5fYXVkaW9Db250ZXh0LnNhbXBsZVJhdGUpO1xuICAgICAgICBpbXB1bHNlUmVzcG9uc2VzLmZvckVhY2goZnVuY3Rpb24gKHNhbXBsZXMsIGNoYW5uZWwpIHtcbiAgICAgICAgICAvLyBkbyBub3QgdXNlIGNvcHlUb0NoYW5uZWwgYmVjYXVzZSBvZiBTYWZhcmkgPD0gOVxuICAgICAgICAgIGZpci5nZXRDaGFubmVsRGF0YShjaGFubmVsKS5zZXQoc2FtcGxlcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaW5kZXg6IHZhbHVlWzBdLFxuICAgICAgICAgIHg6IHZhbHVlWzFdWzBdLFxuICAgICAgICAgIHk6IHZhbHVlWzFdWzFdLFxuICAgICAgICAgIHo6IHZhbHVlWzFdWzJdLFxuICAgICAgICAgIGZpcjogZmlyXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5fc29mYVNvdXJjZVBvc2l0aW9uID0gcG9zaXRpb25zLm1hcChmdW5jdGlvbiAocG9zaXRpb24pIHtcbiAgICAgICAgcmV0dXJuIFtwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBwb3NpdGlvbi56XTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9rZHQgPSBfS2RUcmVlMi5kZWZhdWx0LnRyZWUuY3JlYXRlS2RUcmVlKHBvc2l0aW9ucywgX0tkVHJlZTIuZGVmYXVsdC5kaXN0YW5jZVNxdWFyZWQsIFsneCcsICd5JywgJ3onXSk7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBc3luY2hyb25vdXNseSBjcmVhdGUgRmxvYXQzMkFycmF5cywgd2l0aCBwb3NzaWJsZSByZS1zYW1wbGluZy5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxOdW1iZXI+fSBpbmRpY2VzXG4gICAgICogQHBhcmFtIHtBcnJheS48Q29vcmRpbmF0ZXM+fSBwb3NpdGlvbnNcbiAgICAgKiBAcGFyYW0ge0FycmF5LjxGbG9hdDMyQXJyYXk+fSBmaXJzXG4gICAgICogQHJldHVybnMge1Byb21pc2UuPEFycmF5fEVycm9yPn1cbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gYXNzZXJ0aW9uIHRoYXQgdGhlIGNoYW5uZWwgY291bnQgaXMgMlxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdfZ2VuZXJhdGVJbmRpY2VzUG9zaXRpb25zRmlycycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZW5lcmF0ZUluZGljZXNQb3NpdGlvbnNGaXJzKGluZGljZXMsIHBvc2l0aW9ucywgZmlycywgZGVsYXlzKSB7XG4gICAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgICAgdmFyIHNvZmFGaXJzUHJvbWlzZXMgPSBmaXJzLm1hcChmdW5jdGlvbiAoc29mYUZpckNoYW5uZWxzLCBpbmRleCkge1xuICAgICAgICB2YXIgY2hhbm5lbENvdW50ID0gc29mYUZpckNoYW5uZWxzLmxlbmd0aDtcbiAgICAgICAgaWYgKGNoYW5uZWxDb3VudCAhPT0gMikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmFkIG51bWJlciBvZiBjaGFubmVscycgKyAoJyBmb3IgSVIgaW5kZXggJyArIGluZGljZXNbaW5kZXhdKSArICgnICgnICsgY2hhbm5lbENvdW50ICsgJyBpbnN0ZWFkIG9mIDIpJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICogaW5wdXQgZGVsYXkgY2FuIGVpdGhlciBiZSBbW2RlbGF5TGVmdCwgZGVsYXlSaWdodF1dOiB1bmlxdWUgZm9yIGFsbFxuICAgICAgICAqIGZpciB2YWx1ZXMsIG9yIFtbZEwxLCBkUjFdLCAuLi4sIFtkTE4sIGRSTl1dOiBwZXItcG9zaXRpb24gc3BlY2lmaWMsXG4gICAgICAgICogZS5nLiBmb3IgbWluaW11bSBwaGFzZSBmaXJzLlxuICAgICAgICAqL1xuICAgICAgICBpZiAoZGVsYXlzWzBdLmxlbmd0aCAhPT0gMikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmFkIGRlbGF5IGZvcm1hdCcgKyAoJyBmb3IgSVIgaW5kZXggJyArIGluZGljZXNbaW5kZXhdKSArICgnIChmaXJzdCBlbGVtZW50IGluIERhdGEuRGVsYXkgaXMgJyArIGRlbGF5c1swXSkgKyAnIGluc3RlYWQgb2YgW1tkZWxheUwsIGRlbGF5Ul1dICknKTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgaW5wdXREZWxheXMgPSB0eXBlb2YgZGVsYXlzW2luZGV4XSAhPT0gJ3VuZGVmaW5lZCcgPyBkZWxheXNbaW5kZXhdIDogZGVsYXlzWzBdO1xuXG4gICAgICAgIHZhciBzb2ZhRmlyc0NoYW5uZWxzUHJvbWlzZXMgPSBzb2ZhRmlyQ2hhbm5lbHMubWFwKGZ1bmN0aW9uIChmaXIsIGluZGV4Mikge1xuICAgICAgICAgIGlmIChpbnB1dERlbGF5c1tpbmRleDJdIDwgMCkge1xuICAgICAgICAgICAgLy8gYWNjZXB0IG9ubHkgcG9zaXRpdmUgZGVsYXlzXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05lZ2F0aXZlIGRlbGF5IGRldGVjdGVkIChub3QgaGFuZGxlZCBhdCB0aGUgbW9tZW50KTonICsgKCcgZGVsYXkgaW5kZXggJyArIGluZGljZXNbaW5kZXhdKSArICgnIGNoYW5uZWwgJyArIGluZGV4MikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gKDAsIF91dGlsaXRpZXMucmVzYW1wbGVGbG9hdDMyQXJyYXkpKHtcbiAgICAgICAgICAgIGlucHV0U2FtcGxlczogZmlyLFxuICAgICAgICAgICAgaW5wdXREZWxheTogaW5wdXREZWxheXNbaW5kZXgyXSxcbiAgICAgICAgICAgIGlucHV0U2FtcGxlUmF0ZTogX3RoaXM1Ll9zb2ZhU2FtcGxlUmF0ZSxcbiAgICAgICAgICAgIG91dHB1dFNhbXBsZVJhdGU6IF90aGlzNS5fYXVkaW9Db250ZXh0LnNhbXBsZVJhdGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChzb2ZhRmlyc0NoYW5uZWxzUHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKGZpckNoYW5uZWxzKSB7XG4gICAgICAgICAgcmV0dXJuIFtpbmRpY2VzW2luZGV4XSwgcG9zaXRpb25zW2luZGV4XSwgZmlyQ2hhbm5lbHNdO1xuICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAvLyByZS10aHJvd1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHJlLXNhbXBsZSBpbXB1bHNlIHJlc3BvbnNlICcgKyBpbmRleCArICcuICcgKyBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChzb2ZhRmlyc1Byb21pc2VzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUcnkgdG8gbG9hZCBhIGRhdGEgc2V0IGZyb20gYSBTT0ZBIFVSTC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc291cmNlVXJsXG4gICAgICogQHJldHVybnMge1Byb21pc2UuPE9iamVjdHxFcnJvcj59XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ19sb2FkRGF0YVNldCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9sb2FkRGF0YVNldChzb3VyY2VVcmwpIHtcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgZGRzVXJsID0gc291cmNlVXJsICsgJy5kZHMnO1xuICAgICAgICB2YXIgcmVxdWVzdCA9IG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgcmVxdWVzdC5vcGVuKCdHRVQnLCBkZHNVcmwpO1xuICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignVW5hYmxlIHRvIEdFVCAnICsgZGRzVXJsICsgJywgc3RhdHVzICcgKyByZXF1ZXN0LnN0YXR1cyArICcgJyArICgnJyArIHJlcXVlc3QucmVzcG9uc2VUZXh0KSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA8IDIwMCB8fCByZXF1ZXN0LnN0YXR1cyA+PSAzMDApIHtcbiAgICAgICAgICAgIHJlcXVlc3Qub25lcnJvcigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgZGRzID0gKDAsIF9wYXJzZURhdGFTZXQucGFyc2VEYXRhU2V0KShyZXF1ZXN0LnJlc3BvbnNlKTtcbiAgICAgICAgICAgIHJlc29sdmUoZGRzKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gcmUtdGhyb3dcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1VuYWJsZSB0byBwYXJzZSAnICsgZGRzVXJsICsgJy4gJyArIGVycm9yLm1lc3NhZ2UpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07IC8vIHJlcXVlc3Qub25sb2FkXG5cbiAgICAgICAgcmVxdWVzdC5zZW5kKCk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJ5IHRvIGxvYWQgbWV0YS1kYXRhIGFuZCBwb3NpdGlvbnMgZnJvbSBhIFNPRkEgVVJMLCB0byBnZXQgdGhlXG4gICAgICogaW5kaWNlcyBjbG9zZXN0IHRvIHRoZSBmaWx0ZXIgcG9zaXRpb25zLlxuICAgICAqXG4gICAgICogQHByaXZhdGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzb3VyY2VVcmxcbiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZS48QXJyYXkuPE51bWJlcj58RXJyb3I+fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdfbG9hZE1ldGFBbmRQb3NpdGlvbnMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfbG9hZE1ldGFBbmRQb3NpdGlvbnMoc291cmNlVXJsKSB7XG4gICAgICB2YXIgX3RoaXM2ID0gdGhpcztcblxuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciBwb3NpdGlvbnNVcmwgPSBzb3VyY2VVcmwgKyAnLmpzb24/JyArICdMaXN0ZW5lclBvc2l0aW9uLExpc3RlbmVyVXAsTGlzdGVuZXJWaWV3LFNvdXJjZVBvc2l0aW9uLCcgKyAnRGF0YS5EZWxheSxEYXRhLlNhbXBsaW5nUmF0ZSwnICsgJ0VtaXR0ZXJQb3NpdGlvbixSZWNlaXZlclBvc2l0aW9uLFJvb21Wb2x1bWUnOyAvLyBtZXRhXG5cbiAgICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHJlcXVlc3Qub3BlbignR0VUJywgcG9zaXRpb25zVXJsKTtcbiAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1VuYWJsZSB0byBHRVQgJyArIHBvc2l0aW9uc1VybCArICcsIHN0YXR1cyAnICsgcmVxdWVzdC5zdGF0dXMgKyAnICcgKyAoJycgKyByZXF1ZXN0LnJlc3BvbnNlVGV4dCkpKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXF1ZXN0Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPCAyMDAgfHwgcmVxdWVzdC5zdGF0dXMgPj0gMzAwKSB7XG4gICAgICAgICAgICByZXF1ZXN0Lm9uZXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgdmFyIGRhdGEgPSAoMCwgX3BhcnNlU29mYS5wYXJzZVNvZmEpKHJlcXVlc3QucmVzcG9uc2UpO1xuICAgICAgICAgICAgICBfdGhpczYuX3NldE1ldGFEYXRhKGRhdGEsIHNvdXJjZVVybCk7XG5cbiAgICAgICAgICAgICAgdmFyIHNvdXJjZVBvc2l0aW9ucyA9IF90aGlzNi5fc291cmNlUG9zaXRpb25zVG9HbChkYXRhKTtcbiAgICAgICAgICAgICAgdmFyIGhydGZQb3NpdGlvbnMgPSBzb3VyY2VQb3NpdGlvbnMubWFwKGZ1bmN0aW9uIChwb3NpdGlvbiwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgeDogcG9zaXRpb25bMF0sXG4gICAgICAgICAgICAgICAgICB5OiBwb3NpdGlvblsxXSxcbiAgICAgICAgICAgICAgICAgIHo6IHBvc2l0aW9uWzJdLFxuICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgdmFyIGtkdCA9IF9LZFRyZWUyLmRlZmF1bHQudHJlZS5jcmVhdGVLZFRyZWUoaHJ0ZlBvc2l0aW9ucywgX0tkVHJlZTIuZGVmYXVsdC5kaXN0YW5jZVNxdWFyZWQsIFsneCcsICd5JywgJ3onXSk7XG5cbiAgICAgICAgICAgICAgdmFyIG5lYXJlc3RJbmRpY2VzID0gX3RoaXM2Ll9maWx0ZXJQb3NpdGlvbnMubWFwKGZ1bmN0aW9uIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGtkdC5uZWFyZXN0KHsgeDogY3VycmVudFswXSwgeTogY3VycmVudFsxXSwgejogY3VycmVudFsyXSB9LCAxKS5wb3AoKVswXSAvLyBuZWFyZXN0IGRhdGFcbiAgICAgICAgICAgICAgICAuaW5kZXg7XG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIC8vIGZpbHRlciBvdXQgZHVwbGljYXRlc1xuICAgICAgICAgICAgICBuZWFyZXN0SW5kaWNlcyA9IFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkobmV3IFNldChuZWFyZXN0SW5kaWNlcykpKTtcblxuICAgICAgICAgICAgICBfdGhpczYuX3NvZmFVcmwgPSBzb3VyY2VVcmw7XG4gICAgICAgICAgICAgIHJlc29sdmUobmVhcmVzdEluZGljZXMpO1xuICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gcmUtdGhyb3dcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1VuYWJsZSB0byBwYXJzZSAnICsgcG9zaXRpb25zVXJsICsgJy4gJyArIGVycm9yLm1lc3NhZ2UpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07IC8vIHJlcXVlc3Qub25sb2FkXG5cbiAgICAgICAgcmVxdWVzdC5zZW5kKCk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJ5IHRvIGxvYWQgZnVsbCBTT0ZBIFVSTC5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsXG4gICAgICogQHJldHVybnMge1Byb21pc2UuPHRoaXN8RXJyb3I+fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdfbG9hZFNvZmFGdWxsJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2xvYWRTb2ZhRnVsbCh1cmwpIHtcbiAgICAgIHZhciBfdGhpczcgPSB0aGlzO1xuXG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHJlcXVlc3Qub3BlbignR0VUJywgdXJsKTtcbiAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1VuYWJsZSB0byBHRVQgJyArIHVybCArICcsIHN0YXR1cyAnICsgcmVxdWVzdC5zdGF0dXMgKyAnICcgKyAoJycgKyByZXF1ZXN0LnJlc3BvbnNlVGV4dCkpKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXF1ZXN0Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPCAyMDAgfHwgcmVxdWVzdC5zdGF0dXMgPj0gMzAwKSB7XG4gICAgICAgICAgICByZXF1ZXN0Lm9uZXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIGRhdGEgPSAoMCwgX3BhcnNlU29mYS5wYXJzZVNvZmEpKHJlcXVlc3QucmVzcG9uc2UpO1xuICAgICAgICAgICAgX3RoaXM3Ll9zZXRNZXRhRGF0YShkYXRhLCB1cmwpO1xuICAgICAgICAgICAgdmFyIHNvdXJjZVBvc2l0aW9ucyA9IF90aGlzNy5fc291cmNlUG9zaXRpb25zVG9HbChkYXRhKTtcbiAgICAgICAgICAgIF90aGlzNy5fZ2VuZXJhdGVJbmRpY2VzUG9zaXRpb25zRmlycyhzb3VyY2VQb3NpdGlvbnMubWFwKGZ1bmN0aW9uIChwb3NpdGlvbiwgaW5kZXgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGluZGV4O1xuICAgICAgICAgICAgfSksIC8vIGZ1bGxcbiAgICAgICAgICAgIHNvdXJjZVBvc2l0aW9ucywgZGF0YVsnRGF0YS5JUiddLmRhdGEsIGRhdGFbJ0RhdGEuRGVsYXknXS5kYXRhKS50aGVuKGZ1bmN0aW9uIChpbmRpY2VzUG9zaXRpb25zRmlycykge1xuICAgICAgICAgICAgICBfdGhpczcuX2NyZWF0ZUtkVHJlZShpbmRpY2VzUG9zaXRpb25zRmlycyk7XG4gICAgICAgICAgICAgIF90aGlzNy5fc29mYVVybCA9IHVybDtcbiAgICAgICAgICAgICAgcmVzb2x2ZShfdGhpczcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIHJlLXRocm93XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdVbmFibGUgdG8gcGFyc2UgJyArIHVybCArICcuICcgKyBlcnJvci5tZXNzYWdlKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9OyAvLyByZXF1ZXN0Lm9ubG9hZFxuXG4gICAgICAgIHJlcXVlc3Quc2VuZCgpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRyeSB0byBsb2FkIHBhcnRpYWwgZGF0YSBmcm9tIGEgU09GQSBVUkwuXG4gICAgICpcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtBcnJheS48U3RyaW5nPn0gc291cmNlVXJsXG4gICAgICogQHBhcmFtIHtBcnJheS48TnVtYmVyPn0gaW5kaWNlc1xuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkYXRhU2V0XG4gICAgICogQHJldHVybnMge1Byb21pc2UuPHRoaXN8RXJyb3I+fVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdfbG9hZFNvZmFQYXJ0aWFsJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2xvYWRTb2ZhUGFydGlhbChzb3VyY2VVcmwsIGluZGljZXMsIGRhdGFTZXQpIHtcbiAgICAgIHZhciBfdGhpczggPSB0aGlzO1xuXG4gICAgICB2YXIgdXJsUHJvbWlzZXMgPSBpbmRpY2VzLm1hcChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgdmFyIHVybFByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgICAgdmFyIHBvc2l0aW9uVXJsID0gc291cmNlVXJsICsgJy5qc29uPycgKyAoJ1NvdXJjZVBvc2l0aW9uWycgKyBpbmRleCArICddWzA6MTonICsgKGRhdGFTZXQuU291cmNlUG9zaXRpb24uQyAtIDEpICsgJ10sJykgKyAoJ0RhdGEuSVJbJyArIGluZGV4ICsgJ11bMDoxOicgKyAoZGF0YVNldFsnRGF0YS5JUiddLlIgLSAxKSArICddJykgKyAoJ1swOjE6JyArIChkYXRhU2V0WydEYXRhLklSJ10uTiAtIDEpICsgJ10nKTtcblxuICAgICAgICAgIHZhciByZXF1ZXN0ID0gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgIHJlcXVlc3Qub3BlbignR0VUJywgcG9zaXRpb25VcmwpO1xuICAgICAgICAgIHJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1VuYWJsZSB0byBHRVQgJyArIHBvc2l0aW9uVXJsICsgJywgc3RhdHVzICcgKyByZXF1ZXN0LnN0YXR1cyArICcgJyArICgnJyArIHJlcXVlc3QucmVzcG9uc2VUZXh0KSkpO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICByZXF1ZXN0Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA8IDIwMCB8fCByZXF1ZXN0LnN0YXR1cyA+PSAzMDApIHtcbiAgICAgICAgICAgICAgcmVxdWVzdC5vbmVycm9yKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHZhciBkYXRhID0gKDAsIF9wYXJzZVNvZmEucGFyc2VTb2ZhKShyZXF1ZXN0LnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgLy8gKG1ldGEtZGF0YSBpcyBhbHJlYWR5IGxvYWRlZClcblxuICAgICAgICAgICAgICB2YXIgc291cmNlUG9zaXRpb25zID0gX3RoaXM4Ll9zb3VyY2VQb3NpdGlvbnNUb0dsKGRhdGEpO1xuICAgICAgICAgICAgICBfdGhpczguX2dlbmVyYXRlSW5kaWNlc1Bvc2l0aW9uc0ZpcnMoW2luZGV4XSwgc291cmNlUG9zaXRpb25zLCBkYXRhWydEYXRhLklSJ10uZGF0YSwgZGF0YVsnRGF0YS5EZWxheSddLmRhdGEpLnRoZW4oZnVuY3Rpb24gKGluZGljZXNQb3NpdGlvbnNGaXJzKSB7XG4gICAgICAgICAgICAgICAgLy8gT25lIHBvc2l0aW9uIHBlciBVUkwgaGVyZVxuICAgICAgICAgICAgICAgIC8vIEFycmF5IG1hZGUgb2YgbXVsdGlwbGUgcHJvbWlzZXMsIGxhdGVyXG4gICAgICAgICAgICAgICAgcmVzb2x2ZShpbmRpY2VzUG9zaXRpb25zRmlyc1swXSk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgLy8gcmUtdGhyb3dcbiAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignVW5hYmxlIHRvIHBhcnNlICcgKyBwb3NpdGlvblVybCArICcuICcgKyBlcnJvci5tZXNzYWdlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTsgLy8gcmVxdWVzdC5vbmxvYWRcblxuICAgICAgICAgIHJlcXVlc3Quc2VuZCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdXJsUHJvbWlzZTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwodXJsUHJvbWlzZXMpLnRoZW4oZnVuY3Rpb24gKGluZGljZXNQb3NpdGlvbnNGaXJzKSB7XG4gICAgICAgIF90aGlzOC5fY3JlYXRlS2RUcmVlKGluZGljZXNQb3NpdGlvbnNGaXJzKTtcbiAgICAgICAgcmV0dXJuIF90aGlzODsgLy8gZmluYWwgcmVzb2x2ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IG1ldGEtZGF0YSwgYW5kIGFzc2VydCBmb3Igc3VwcG9ydGVkIEhSVEYgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzb3VyY2VVcmxcbiAgICAgKiBAdGhyb3dzIHtFcnJvcn0gYXNzZXJ0aW9uIGZvciBGSVIgZGF0YS5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnX3NldE1ldGFEYXRhJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gX3NldE1ldGFEYXRhKGRhdGEsIHNvdXJjZVVybCkge1xuICAgICAgaWYgKHR5cGVvZiBkYXRhLm1ldGFEYXRhLkRhdGFUeXBlICE9PSAndW5kZWZpbmVkJyAmJiBkYXRhLm1ldGFEYXRhLkRhdGFUeXBlICE9PSAnRklSJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FjY29yZGluZyB0byBtZXRhLWRhdGEsIFNPRkEgZGF0YSB0eXBlIGlzIG5vdCBGSVInKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGRhdGVTdHJpbmcgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG5cbiAgICAgIHRoaXMuX3NvZmFOYW1lID0gdHlwZW9mIGRhdGEubmFtZSAhPT0gJ3VuZGVmaW5lZCcgPyAnJyArIGRhdGEubmFtZSA6ICdIUlRGLnNvZmEnO1xuXG4gICAgICB0aGlzLl9zb2ZhTWV0YURhdGEgPSB0eXBlb2YgZGF0YS5tZXRhRGF0YSAhPT0gJ3VuZGVmaW5lZCcgPyBkYXRhLm1ldGFEYXRhIDoge307XG5cbiAgICAgIC8vIGFwcGVuZCBjb252ZXJzaW9uIGluZm9ybWF0aW9uXG4gICAgICBpZiAodHlwZW9mIHNvdXJjZVVybCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhpcy5fc29mYU1ldGFEYXRhLk9yaWdpbmFsVXJsID0gc291cmNlVXJsO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zb2ZhTWV0YURhdGEuQ29udmVydGVyID0gJ0lyY2FtICcgKyBfaW5mbzIuZGVmYXVsdC5uYW1lICsgJyAnICsgX2luZm8yLmRlZmF1bHQudmVyc2lvbiArICcgJyArICdqYXZhc2NyaXB0IEFQSSAnO1xuICAgICAgdGhpcy5fc29mYU1ldGFEYXRhLkRhdGVDb252ZXJ0ZWQgPSBkYXRlU3RyaW5nO1xuXG4gICAgICB0aGlzLl9zb2ZhU2FtcGxlUmF0ZSA9IHR5cGVvZiBkYXRhWydEYXRhLlNhbXBsaW5nUmF0ZSddICE9PSAndW5kZWZpbmVkJyA/IGRhdGFbJ0RhdGEuU2FtcGxpbmdSYXRlJ10uZGF0YVswXSA6IDQ4MDAwOyAvLyBUYWJsZSBDLjFcbiAgICAgIGlmICh0aGlzLl9zb2ZhU2FtcGxlUmF0ZSAhPT0gdGhpcy5fYXVkaW9Db250ZXh0LnNhbXBsZVJhdGUpIHtcbiAgICAgICAgdGhpcy5fc29mYU1ldGFEYXRhLk9yaWdpbmFsU2FtcGxlUmF0ZSA9IHRoaXMuX3NvZmFTYW1wbGVSYXRlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9zb2ZhRGVsYXkgPSB0eXBlb2YgZGF0YVsnRGF0YS5EZWxheSddICE9PSAndW5kZWZpbmVkJyA/IGRhdGFbJ0RhdGEuRGVsYXknXS5kYXRhIDogWzAsIDBdO1xuXG4gICAgICB0aGlzLl9zb2ZhUm9vbVZvbHVtZSA9IHR5cGVvZiBkYXRhLlJvb21Wb2x1bWUgIT09ICd1bmRlZmluZWQnID8gZGF0YS5Sb29tVm9sdW1lLmRhdGFbMF0gOiB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIENvbnZlcnQgbGlzdGVuZXIgcG9zaXRpb24sIHVwLCBhbmQgdmlldyB0byBTT0ZBIGNhcnRlc2lhbixcbiAgICAgIC8vIHRvIGdlbmVyYXRlIGEgU09GQS10by1HTCBsb29rLWF0IG1hdDQuXG4gICAgICAvLyBEZWZhdWx0IFNPRkEgdHlwZSBpcyAnY2FydGVzaWFuJyAoc2VlIHRhYmxlIEQuNEEpLlxuXG4gICAgICB2YXIgbGlzdGVuZXJQb3NpdGlvbiA9IF9jb29yZGluYXRlczIuZGVmYXVsdC5zb2ZhVG9Tb2ZhQ2FydGVzaWFuKFtdLCBkYXRhLkxpc3RlbmVyUG9zaXRpb24uZGF0YVswXSwgKDAsIF9wYXJzZVNvZmEuY29uZm9ybVNvZmFDb29yZGluYXRlU3lzdGVtKShkYXRhLkxpc3RlbmVyUG9zaXRpb24uVHlwZSB8fCAnY2FydGVzaWFuJykpO1xuXG4gICAgICB2YXIgbGlzdGVuZXJWaWV3ID0gX2Nvb3JkaW5hdGVzMi5kZWZhdWx0LnNvZmFUb1NvZmFDYXJ0ZXNpYW4oW10sIGRhdGEuTGlzdGVuZXJWaWV3LmRhdGFbMF0sICgwLCBfcGFyc2VTb2ZhLmNvbmZvcm1Tb2ZhQ29vcmRpbmF0ZVN5c3RlbSkoZGF0YS5MaXN0ZW5lclZpZXcuVHlwZSB8fCAnY2FydGVzaWFuJykpO1xuXG4gICAgICB2YXIgbGlzdGVuZXJVcCA9IF9jb29yZGluYXRlczIuZGVmYXVsdC5zb2ZhVG9Tb2ZhQ2FydGVzaWFuKFtdLCBkYXRhLkxpc3RlbmVyVXAuZGF0YVswXSwgKDAsIF9wYXJzZVNvZmEuY29uZm9ybVNvZmFDb29yZGluYXRlU3lzdGVtKShkYXRhLkxpc3RlbmVyVXAuVHlwZSB8fCAnY2FydGVzaWFuJykpO1xuXG4gICAgICB0aGlzLl9zb2ZhVG9HbCA9IF9nbE1hdHJpeDIuZGVmYXVsdC5tYXQ0Lmxvb2tBdChbXSwgbGlzdGVuZXJQb3NpdGlvbiwgbGlzdGVuZXJWaWV3LCBsaXN0ZW5lclVwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IHRvIEdMIGNvb3JkaW5hdGVzLCBpbi1wbGFjZS5cbiAgICAgKlxuICAgICAqIEBwcml2YXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVxuICAgICAqIEByZXR1cm5zIHtBcnJheS48Q29vcmRpbmF0ZXM+fVxuICAgICAqIEB0aHJvd3Mge0Vycm9yfVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdfc291cmNlUG9zaXRpb25zVG9HbCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9zb3VyY2VQb3NpdGlvbnNUb0dsKGRhdGEpIHtcbiAgICAgIHZhciBfdGhpczkgPSB0aGlzO1xuXG4gICAgICB2YXIgc291cmNlUG9zaXRpb25zID0gZGF0YS5Tb3VyY2VQb3NpdGlvbi5kYXRhOyAvLyByZWZlcmVuY2VcbiAgICAgIHZhciBzb3VyY2VDb29yZGluYXRlU3lzdGVtID0gdHlwZW9mIGRhdGEuU291cmNlUG9zaXRpb24uVHlwZSAhPT0gJ3VuZGVmaW5lZCcgPyBkYXRhLlNvdXJjZVBvc2l0aW9uLlR5cGUgOiAnc3BoZXJpY2FsJzsgLy8gZGVmYXVsdCAoU09GQSBUYWJsZSBELjRDKVxuICAgICAgc3dpdGNoIChzb3VyY2VDb29yZGluYXRlU3lzdGVtKSB7XG4gICAgICAgIGNhc2UgJ2NhcnRlc2lhbic6XG4gICAgICAgICAgc291cmNlUG9zaXRpb25zLmZvckVhY2goZnVuY3Rpb24gKHBvc2l0aW9uKSB7XG4gICAgICAgICAgICBfZ2xNYXRyaXgyLmRlZmF1bHQudmVjMy50cmFuc2Zvcm1NYXQ0KHBvc2l0aW9uLCBwb3NpdGlvbiwgX3RoaXM5Ll9zb2ZhVG9HbCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnc3BoZXJpY2FsJzpcbiAgICAgICAgICBzb3VyY2VQb3NpdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAocG9zaXRpb24pIHtcbiAgICAgICAgICAgIF9jb29yZGluYXRlczIuZGVmYXVsdC5zb2ZhU3BoZXJpY2FsVG9Tb2ZhQ2FydGVzaWFuKHBvc2l0aW9uLCBwb3NpdGlvbik7IC8vIGluLXBsYWNlXG4gICAgICAgICAgICBfZ2xNYXRyaXgyLmRlZmF1bHQudmVjMy50cmFuc2Zvcm1NYXQ0KHBvc2l0aW9uLCBwb3NpdGlvbiwgX3RoaXM5Ll9zb2ZhVG9HbCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhZCBzb3VyY2UgcG9zaXRpb24gdHlwZScpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gc291cmNlUG9zaXRpb25zO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2Nvb3JkaW5hdGVTeXN0ZW0nLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHN5c3RlbSkge1xuICAgICAgdGhpcy5fY29vcmRpbmF0ZVN5c3RlbSA9IHR5cGVvZiBzeXN0ZW0gIT09ICd1bmRlZmluZWQnID8gc3lzdGVtIDogJ2dsJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY29vcmRpbmF0ZSBzeXN0ZW0gZm9yIHBvc2l0aW9ucy5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtDb29yZGluYXRlU3lzdGVtfVxuICAgICAqL1xuICAgICxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jb29yZGluYXRlU3lzdGVtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBjb29yZGluYXRlIHN5c3RlbSBmb3IgZmlsdGVyIHBvc2l0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Q29vcmRpbmF0ZVN5c3RlbX0gW3N5c3RlbV0gdW5kZWZpbmVkIHRvIHVzZSBjb29yZGluYXRlU3lzdGVtXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2ZpbHRlckNvb3JkaW5hdGVTeXN0ZW0nLFxuICAgIHNldDogZnVuY3Rpb24gc2V0KHN5c3RlbSkge1xuICAgICAgdGhpcy5fZmlsdGVyQ29vcmRpbmF0ZVN5c3RlbSA9IHR5cGVvZiBzeXN0ZW0gIT09ICd1bmRlZmluZWQnID8gc3lzdGVtIDogdGhpcy5jb29yZGluYXRlU3lzdGVtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBjb29yZGluYXRlIHN5c3RlbSBmb3IgZmlsdGVyIHBvc2l0aW9ucy5cbiAgICAgKi9cbiAgICAsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZmlsdGVyQ29vcmRpbmF0ZVN5c3RlbTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgZmlsdGVyIHBvc2l0aW9ucy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7QXJyYXkuPENvb3JkaW5hdGVzPn0gW3Bvc2l0aW9uc10gdW5kZWZpbmVkIGZvciBubyBmaWx0ZXJpbmcuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2ZpbHRlclBvc2l0aW9ucycsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQocG9zaXRpb25zKSB7XG4gICAgICBpZiAodHlwZW9mIHBvc2l0aW9ucyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhpcy5fZmlsdGVyUG9zaXRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmZpbHRlckNvb3JkaW5hdGVTeXN0ZW0pIHtcbiAgICAgICAgICBjYXNlICdnbCc6XG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJQb3NpdGlvbnMgPSBwb3NpdGlvbnMubWFwKGZ1bmN0aW9uIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgIHJldHVybiBjdXJyZW50LnNsaWNlKDApOyAvLyBjb3B5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnc29mYUNhcnRlc2lhbic6XG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJQb3NpdGlvbnMgPSBwb3NpdGlvbnMubWFwKGZ1bmN0aW9uIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgIHJldHVybiBfY29vcmRpbmF0ZXMyLmRlZmF1bHQuc29mYUNhcnRlc2lhblRvR2woW10sIGN1cnJlbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ3NvZmFTcGhlcmljYWwnOlxuICAgICAgICAgICAgdGhpcy5fZmlsdGVyUG9zaXRpb25zID0gcG9zaXRpb25zLm1hcChmdW5jdGlvbiAoY3VycmVudCkge1xuICAgICAgICAgICAgICByZXR1cm4gX2Nvb3JkaW5hdGVzMi5kZWZhdWx0LnNvZmFTcGhlcmljYWxUb0dsKFtdLCBjdXJyZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWQgZmlsdGVyIGNvb3JkaW5hdGUgc3lzdGVtJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgZmlsdGVyIHBvc2l0aW9ucy5cbiAgICAgKi9cbiAgICAsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICB2YXIgcG9zaXRpb25zID0gdm9pZCAwO1xuICAgICAgaWYgKHR5cGVvZiB0aGlzLl9maWx0ZXJQb3NpdGlvbnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5maWx0ZXJDb29yZGluYXRlU3lzdGVtKSB7XG4gICAgICAgICAgY2FzZSAnZ2wnOlxuICAgICAgICAgICAgcG9zaXRpb25zID0gdGhpcy5fZmlsdGVyUG9zaXRpb25zLm1hcChmdW5jdGlvbiAoY3VycmVudCkge1xuICAgICAgICAgICAgICByZXR1cm4gY3VycmVudC5zbGljZSgwKTsgLy8gY29weVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ3NvZmFDYXJ0ZXNpYW4nOlxuICAgICAgICAgICAgcG9zaXRpb25zID0gdGhpcy5fZmlsdGVyUG9zaXRpb25zLm1hcChmdW5jdGlvbiAoY3VycmVudCkge1xuICAgICAgICAgICAgICByZXR1cm4gX2Nvb3JkaW5hdGVzMi5kZWZhdWx0LmdsVG9Tb2ZhQ2FydGVzaWFuKFtdLCBjdXJyZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdzb2ZhU3BoZXJpY2FsJzpcbiAgICAgICAgICAgIHBvc2l0aW9ucyA9IHRoaXMuX2ZpbHRlclBvc2l0aW9ucy5tYXAoZnVuY3Rpb24gKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF9jb29yZGluYXRlczIuZGVmYXVsdC5nbFRvU29mYVNwaGVyaWNhbChbXSwgY3VycmVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQmFkIGZpbHRlciBjb29yZGluYXRlIHN5c3RlbScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcG9zaXRpb25zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBwb3N0LWZpbHRlcmluZyBmbGFnLiBXaGVuIGZhbHNlLCB0cnkgdG8gbG9hZCBhIHBhcnRpYWwgc2V0IG9mXG4gICAgICogSFJURi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW3Bvc3Q9ZmFsc2VdXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ2ZpbHRlckFmdGVyTG9hZCcsXG4gICAgc2V0OiBmdW5jdGlvbiBzZXQocG9zdCkge1xuICAgICAgdGhpcy5fZmlsdGVyQWZ0ZXJMb2FkID0gdHlwZW9mIHBvc3QgIT09ICd1bmRlZmluZWQnID8gcG9zdCA6IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBwb3N0LWZpbHRlcmluZyBmbGFnLiBXaGVuIGZhbHNlLCB0cnkgdG8gbG9hZCBhIHBhcnRpYWwgc2V0IG9mXG4gICAgICogSFJURi5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufVxuICAgICAqL1xuICAgICxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJBZnRlckxvYWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGVzdCB3aGV0aGVyIGFuIEhSVEYgc2V0IGlzIGFjdHVhbGx5IGxvYWRlZC5cbiAgICAgKlxuICAgICAqIEBzZWUge0BsaW5rIEhydGZTZXQjbG9hZH1cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBmYWxzZSBiZWZvcmUgYW55IHN1Y2Nlc3NmdWwgbG9hZCwgdHJ1ZSBhZnRlci5cbiAgICAgKlxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdpc1JlYWR5JyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWFkeTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG9yaWdpbmFsIG5hbWUgb2YgdGhlIEhSVEYgc2V0LlxuICAgICAqXG4gICAgICogQHJldHVybnMge1N0cmluZ30gdGhhdCBpcyB1bmRlZmluZWQgYmVmb3JlIGEgc3VjY2Vzc2Z1bGx5IGxvYWQuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3NvZmFOYW1lJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zb2ZhTmFtZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIFVSTCB1c2VkIHRvIGFjdHVhbGx5IGxvYWQgdGhlIEhSVEYgc2V0LlxuICAgICAqXG4gICAgICogQHJldHVybnMge1N0cmluZ30gdGhhdCBpcyB1bmRlZmluZWQgYmVmb3JlIGEgc3VjY2Vzc2Z1bGx5IGxvYWQuXG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3NvZmFVcmwnLFxuICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NvZmFVcmw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBvcmlnaW5hbCBzYW1wbGUtcmF0ZSBmcm9tIHRoZSBTT0ZBIFVSTCBhbHJlYWR5IGxvYWRlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtOdW1iZXJ9IHRoYXQgaXMgdW5kZWZpbmVkIGJlZm9yZSBhIHN1Y2Nlc3NmdWxseSBsb2FkLlxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdzb2ZhU2FtcGxlUmF0ZScsXG4gICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc29mYVNhbXBsZVJhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtZXRhLWRhdGEgZnJvbSB0aGUgU09GQSBVUkwgYWxyZWFkeSBsb2FkZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSB0aGF0IGlzIHVuZGVmaW5lZCBiZWZvcmUgYSBzdWNjZXNzZnVsbHkgbG9hZC5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnc29mYU1ldGFEYXRhJyxcbiAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zb2ZhTWV0YURhdGE7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIEhydGZTZXQ7XG59KCk7XG5cbmV4cG9ydHMuZGVmYXVsdCA9IEhydGZTZXQ7IiwiJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgdmFsdWU6IHRydWVcbn0pO1xuZXhwb3J0cy5TZXJ2ZXJEYXRhQmFzZSA9IHVuZGVmaW5lZDtcblxudmFyIF9jcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHsgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTsgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOyBkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSA9IHRydWU7IGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTsgfSB9IHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7IGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH07IH0oKTsgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQGZpbGVPdmVydmlldyBBY2Nlc3MgYSByZW1vdGUgY2F0YWxvZ3VlIGZyb20gYSBTT0ZBIHNlcnZlciwgYW5kIGdldCBVUkxzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd2l0aCBmaWx0ZXJpbmcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAYXV0aG9yIEplYW4tUGhpbGlwcGUuTGFtYmVydEBpcmNhbS5mclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBjb3B5cmlnaHQgMjAxNS0yMDE2IElSQ0FNLCBQYXJpcywgRnJhbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQGxpY2Vuc2UgQlNELTMtQ2xhdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbnZhciBfcGFyc2VYbWwgPSByZXF1aXJlKCcuL3BhcnNlWG1sJyk7XG5cbnZhciBfcGFyc2VYbWwyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfcGFyc2VYbWwpO1xuXG52YXIgX3BhcnNlRGF0YVNldCA9IHJlcXVpcmUoJy4vcGFyc2VEYXRhU2V0Jyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbmZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHsgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHsgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTsgfSB9XG5cbi8qKlxuICogU09GQSByZW1vdGUgZGF0YS1iYXNlLlxuICovXG5cbnZhciBTZXJ2ZXJEYXRhQmFzZSA9IGV4cG9ydHMuU2VydmVyRGF0YUJhc2UgPSBmdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBUaGlzIGlzIG9ubHkgYSBjb25zdHJ1Y3RvciwgaXQgZG9lcyBub3QgbG9hZCBhbnkgdGhpbmcuXG4gICAqXG4gICAqIEBzZWUge0BsaW5rIFNlcnZlckRhdGFCYXNlI2xvYWRDYXRhbG9ndWV9XG4gICAqXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLnNlcnZlclVybF0gYmFzZSBVUkwgb2Ygc2VydmVyLCBpbmNsdWRpbmdcbiAgICogcHJvdG9jb2wsIGVnLiAnaHR0cDovL2JpbGkyLmlyY2FtLmZyJy4gRGVmYXVsdCBwcm90b2NvbCBpcyBgaHR0cHM6YCBpZlxuICAgKiBgd2luZG93LmxvY2F0aW9uLnByb3RvY29sYCBpcyBhbHNvIGBodHRwczpgLCBvciBgaHR0cDpgLCB0byBhdm9pZFxuICAgKiBtaXhlZCBjb250ZW50cyAodGhhdCBhcmUgb2Z0ZW4gYmxvY2tlZCkuXG4gICAqL1xuXG4gIGZ1bmN0aW9uIFNlcnZlckRhdGFCYXNlKCkge1xuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07XG5cbiAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgU2VydmVyRGF0YUJhc2UpO1xuXG4gICAgdGhpcy5fc2VydmVyID0gb3B0aW9ucy5zZXJ2ZXJVcmw7XG5cbiAgICBpZiAodHlwZW9mIHRoaXMuX3NlcnZlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBwcm90b2NvbCA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnaHR0cHM6JyA6ICdodHRwOic7XG5cbiAgICAgIHRoaXMuX3NlcnZlciA9IHByb3RvY29sICsgJy8vYmlsaTIuaXJjYW0uZnInO1xuICAgIH1cblxuICAgIHRoaXMuX2NhdGFsb2d1ZSA9IHt9O1xuICAgIHRoaXMuX3VybHMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSBsb2FkIGNvbXBsZXRlIGNhdGFsb2d1ZSBmcm9tIHRoZSBzZXJ2ZXIsIGluY2x1ZGluZyB0aGVcbiAgICogY2F0YWxvZ3VlIGxpbmtzIGZvdW5kIGluIGFueSBwYXJ0aWFsIGNhdGFsb2d1ZS5cbiAgICpcbiAgICogQHBhcmFtIHtTdHJpbmd9IFtzb3VyY2VVcmxdIFVSTCBvZiB0aGUgcm9vdCBjYXRhbG9ndWUsIGluY2x1ZGluZyB0aGVcbiAgICogc2VydmVyLCBsaWtlICdodHRwOi8vYmlsaTIuaXJjYW0uZnIvY2F0YWxvZy54bWwnLlxuICAgKiAgRGVmYXVsdCBpcyAnY2F0YWxvZy54bWwnIGF0IHNlcnZlclVSTCBzdXBwbGllZCBhdFxuICAgKiB7QGxpbmsgU2VydmVyRGF0YUJhc2UjY29uc3RydWN0b3J9LlxuICAgKiBAcGFyYW0ge09iamVjdH0gW2Rlc3RpbmF0aW9uXSBDYXRhbG9ndWUgdG8gdXBkYXRlLiBEZWZhdWx0IGlzXG4gICAqIGludGVybmFsLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZS48U3RyaW5nfEVycm9yPn0gVGhlIHByb21pc2Ugd2lsbCByZXNvbHZlICh3aXRoXG4gICAqIHNvdXJjZVVybCkgd2hlbiBldmVyeSBzdWItY2F0YWxvZ3VlIHdpbGwgc3VjY2Vzc2Z1bGx5IGxvYWQsIG9yIHdpbGxcbiAgICogcmVqZWN0ICh3aXRoIGFuIGVycm9yKSBhcyBzb29uIGFzIG9uZSB0cmFuc2ZlciBmYWlscy5cbiAgICovXG5cblxuICBfY3JlYXRlQ2xhc3MoU2VydmVyRGF0YUJhc2UsIFt7XG4gICAga2V5OiAnbG9hZENhdGFsb2d1ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGxvYWRDYXRhbG9ndWUoKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICB2YXIgc291cmNlVXJsID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8gdGhpcy5fc2VydmVyICsgJy9jYXRhbG9nLnhtbCcgOiBhcmd1bWVudHNbMF07XG4gICAgICB2YXIgZGVzdGluYXRpb24gPSBhcmd1bWVudHMubGVuZ3RoIDw9IDEgfHwgYXJndW1lbnRzWzFdID09PSB1bmRlZmluZWQgPyB0aGlzLl9jYXRhbG9ndWUgOiBhcmd1bWVudHNbMV07XG5cbiAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICB2YXIgcmVxdWVzdCA9IG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcbiAgICAgICAgcmVxdWVzdC5vcGVuKCdHRVQnLCBzb3VyY2VVcmwpO1xuICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcignVW5hYmxlIHRvIEdFVCAnICsgc291cmNlVXJsICsgJywgc3RhdHVzICcgKyByZXF1ZXN0LnN0YXR1cyArICcgJyArICgnJyArIHJlcXVlc3QucmVzcG9uc2VUZXh0KSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA8IDIwMCB8fCByZXF1ZXN0LnN0YXR1cyA+PSAzMDApIHtcbiAgICAgICAgICAgIHJlcXVlc3Qub25lcnJvcigpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciB4bWwgPSAoMCwgX3BhcnNlWG1sMi5kZWZhdWx0KShyZXF1ZXN0LnJlc3BvbnNlKTtcbiAgICAgICAgICB2YXIgZGF0YVNldCA9IHhtbC5xdWVyeVNlbGVjdG9yKCdkYXRhc2V0Jyk7XG5cbiAgICAgICAgICAvLyByZWN1cnNpdmUgY2F0YWxvZ3Vlc1xuICAgICAgICAgIHZhciBjYXRhbG9ndWVSZWZlcmVuY2VzID0geG1sLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RhdGFzZXQgPiBjYXRhbG9nUmVmJyk7XG5cbiAgICAgICAgICBpZiAoY2F0YWxvZ3VlUmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIGVuZCBvZiByZWN1cnNpb25cbiAgICAgICAgICAgIGRlc3RpbmF0aW9uLnVybHMgPSBbXTtcbiAgICAgICAgICAgIHZhciB1cmxzID0geG1sLnF1ZXJ5U2VsZWN0b3JBbGwoJ2RhdGFzZXQgPiBkYXRhc2V0Jyk7XG4gICAgICAgICAgICBmb3IgKHZhciByZWYgPSAwOyByZWYgPCB1cmxzLmxlbmd0aDsgKytyZWYpIHtcbiAgICAgICAgICAgICAgLy8gZGF0YSBzZXQgbmFtZSBhbHJlYWR5IGNvbnRhaW5zIGEgbGVhZGluZyBzbGFzaFxuICAgICAgICAgICAgICB2YXIgdXJsID0gX3RoaXMuX3NlcnZlciArIGRhdGFTZXQuZ2V0QXR0cmlidXRlKCduYW1lJykgKyAnLycgKyB1cmxzW3JlZl0uZ2V0QXR0cmlidXRlKCduYW1lJyk7XG4gICAgICAgICAgICAgIF90aGlzLl91cmxzLnB1c2godXJsKTtcbiAgICAgICAgICAgICAgZGVzdGluYXRpb24udXJscy5wdXNoKHVybCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUoc291cmNlVXJsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gcmVjdXJzaW9uXG4gICAgICAgICAgICB2YXIgcHJvbWlzZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAodmFyIF9yZWYgPSAwOyBfcmVmIDwgY2F0YWxvZ3VlUmVmZXJlbmNlcy5sZW5ndGg7ICsrX3JlZikge1xuICAgICAgICAgICAgICB2YXIgbmFtZSA9IGNhdGFsb2d1ZVJlZmVyZW5jZXNbX3JlZl0uZ2V0QXR0cmlidXRlKCduYW1lJyk7XG4gICAgICAgICAgICAgIHZhciByZWN1cnNpdmVVcmwgPSBfdGhpcy5fc2VydmVyICsgZGF0YVNldC5nZXRBdHRyaWJ1dGUoJ25hbWUnKSArICcvJyArIGNhdGFsb2d1ZVJlZmVyZW5jZXNbX3JlZl0uZ2V0QXR0cmlidXRlKCd4bGluazpocmVmJyk7XG4gICAgICAgICAgICAgIGRlc3RpbmF0aW9uW25hbWVdID0ge307XG4gICAgICAgICAgICAgIHByb21pc2VzLnB1c2goX3RoaXMubG9hZENhdGFsb2d1ZShyZWN1cnNpdmVVcmwsIGRlc3RpbmF0aW9uW25hbWVdKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgX3RoaXMuX3VybHMuc29ydCgpO1xuICAgICAgICAgICAgICByZXNvbHZlKHNvdXJjZVVybCk7XG4gICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfTsgLy8gcmVxdWVzdC5vbmxvYWRcblxuICAgICAgICByZXF1ZXN0LnNlbmQoKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgVVJMcywgcG9zc2libHkgZmlsdGVyZWQuXG4gICAgICpcbiAgICAgKiBBbnkgZmlsdGVyIGNhbiBiZSBwYXJ0aWFsLCBhbmQgaXMgY2FzZS1pbnNlbnNpdGl2ZS4gVGhlIHJlc3VsdCBtdXN0XG4gICAgICogbWF0Y2ggZXZlcnkgc3VwcGxpZWQgZmlsdGVyLiBVbmRlZmluZWQgZmlsdGVycyBhcmUgbm90IGFwcGxpZWQuIEZvclxuICAgICAqIGFueSBmaWx0ZXIsIGB8YCBpcyB0aGUgb3Igb3BlcmF0b3IuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnNdIG9wdGlvbmFsIGZpbHRlcnNcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMuY29udmVudGlvbl0gJ0hSSVInIG9yICdTT1MnXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmRhdGFCYXNlXSAnTElTVEVOJywgJ0JJTEknLCBldGMuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IFtvcHRpb25zLmVxdWFsaXNhdGlvbl0gJ1JBVycsJ0NPTVBFTlNBVEVEJ1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zYW1wbGVSYXRlXSBpbiBIZXJ0elxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5zb3NPcmRlcl0gJzEyb3JkZXInIG9yICcyNG9yZGVyJ1xuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbb3B0aW9ucy5mcmVlUGF0dGVybl0gYW55IHBhdHRlcm4gbWF0Y2hlZFxuICAgICAqIGdsb2JhbGx5LiBVc2Ugc2VwYXJhdG9ycyAoc3BhY2VzLCB0YWJzLCBldGMuKSB0byBjb21iaW5lIG11bHRpcGxlXG4gICAgICogcGF0dGVybnM6ICc0NDEwMCBsaXN0ZW4nIHdpbGwgcmVzdHJpY3Qgb24gVVJMcyBtYXRjaGluZyAnNDQxMDAnIGFuZFxuICAgICAqICdsaXN0ZW4nOyAnNDQxMDB8NDgwMDAgYmlsaXxsaXN0ZW4nIG1hdGNoZXMgKCc0NDEwMCcgb3IgJzQ4MDAwJykgYW5kXG4gICAgICogKCdiaWxpJyBvciAnbGlzdGVuJykuXG4gICAgICogQHJldHVybnMge0FycmF5LjxTdHJpbmc+fSBVUkxzIHRoYXQgbWF0Y2ggZXZlcnkgZmlsdGVyLlxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdnZXRVcmxzJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VXJscygpIHtcbiAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA8PSAwIHx8IGFyZ3VtZW50c1swXSA9PT0gdW5kZWZpbmVkID8ge30gOiBhcmd1bWVudHNbMF07XG5cbiAgICAgIC8vIHRoZSBudW1iZXIgYW5kIHRoZSBvcmRlciBvZiB0aGUgZmlsdGVycyBpbiB0aGUgZm9sbG93aW5nIGFycmF5IG11c3RcbiAgICAgIC8vIG1hdGNoIHRoZSBVUkwgc3ViLWRpcmVjdG9yaWVzXG4gICAgICB2YXIgZmlsdGVycyA9IFtvcHRpb25zLmNvbnZlbnRpb24sIG9wdGlvbnMuZGF0YUJhc2UsIG9wdGlvbnMuZXF1YWxpc2F0aW9uLCBvcHRpb25zLnNhbXBsZVJhdGUsIG9wdGlvbnMuc29zT3JkZXJdO1xuXG4gICAgICAvLyBhbnkgd2hlcmUgaW4gVVJMXG4gICAgICAvLyBpbiBmaWxlIG5hbWVcbiAgICAgIHZhciBmcmVlUGF0dGVybiA9IHR5cGVvZiBvcHRpb25zLmZyZWVQYXR0ZXJuID09PSAnbnVtYmVyJyA/IG9wdGlvbnMuZnJlZVBhdHRlcm4udG9TdHJpbmcoKSA6IG9wdGlvbnMuZnJlZVBhdHRlcm47XG5cbiAgICAgIHZhciBwYXR0ZXJuID0gZmlsdGVycy5yZWR1Y2UoZnVuY3Rpb24gKGdsb2JhbCwgbG9jYWwpIHtcbiAgICAgICAgLy8gcGFydGlhbCBmaWx0ZXIgaW5zaWRlIHNsYXNoZXNcbiAgICAgICAgcmV0dXJuIGdsb2JhbCArICcvJyArICh0eXBlb2YgbG9jYWwgIT09ICd1bmRlZmluZWQnID8gJ1teL10qKD86JyArIGxvY2FsICsgJylbXi9dKicgOiAnW14vXSonKTtcbiAgICAgIH0sICcnKTtcblxuICAgICAgdmFyIHJlZ0V4cCA9IG5ldyBSZWdFeHAocGF0dGVybiwgJ2knKTtcblxuICAgICAgdmFyIHVybHMgPSB0aGlzLl91cmxzLmZpbHRlcihmdW5jdGlvbiAodXJsKSB7XG4gICAgICAgIHJldHVybiByZWdFeHAudGVzdCh1cmwpO1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh0eXBlb2YgZnJlZVBhdHRlcm4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIHNwbGl0IHBhdHRlcm5zIHdpdGggc2VwYXJhdG9yc1xuICAgICAgICB2YXIgcGF0dGVybnMgPSBmcmVlUGF0dGVybi5zcGxpdCgvXFxzKy8pO1xuICAgICAgICBwYXR0ZXJucy5mb3JFYWNoKGZ1bmN0aW9uIChjdXJyZW50KSB7XG4gICAgICAgICAgcmVnRXhwID0gbmV3IFJlZ0V4cChjdXJyZW50LCAnaScpO1xuXG4gICAgICAgICAgdXJscyA9IHVybHMuZmlsdGVyKGZ1bmN0aW9uICh1cmwpIHtcbiAgICAgICAgICAgIHJldHVybiByZWdFeHAudGVzdCh1cmwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHVybHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBkYXRhLXNldCBkZWZpbml0aW9ucyBvZiBhIGdpdmVuIFVSTC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBzb3VyY2VVcmwgaXMgdGhlIGNvbXBsZXRlIFNPRkEgVVJMLCB3aXRoIHRoZVxuICAgICAqIHNlcnZlciwgbGlrZVxuICAgICAqICdodHRwOi8vYmlsaTIuaXJjYW0uZnIvU2ltcGxlRnJlZUZpZWxkSFJJUi9CSUxJL0NPTVBFTlNBVEVELzQ0MTAwL0lSQ18xMTAwX0NfSFJJUi5zb2ZhJ1xuICAgICAqXG4gICAgICogQHJldHVybnMge1Byb21pc2UuPE9iamVjdHxTdHJpbmc+fSBUaGUgcHJvbWlzZSB3aWxsIHJlc29sdmUgYWZ0ZXJcbiAgICAgKiBzdWNjZXNzZnVsbHkgbG9hZGluZywgd2l0aCBkZWZpbml0aW9ucyBhcyAqIGB7ZGVmaW5pdGlvbjoge2tleTogdmFsdWVzfX1gXG4gICAgICogb2JqZWN0czsgdGhlIHByb21pc2Ugd2lsbCByZWplY3QgaXMgdGhlIHRyYW5zZmVyIGZhaWxzLCB3aXRoIGFuIGVycm9yLlxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdnZXREYXRhU2V0RGVmaW5pdGlvbnMnLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBnZXREYXRhU2V0RGVmaW5pdGlvbnMoc291cmNlVXJsKSB7XG4gICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIHVybCA9IHNvdXJjZVVybCArICcuZGRzJztcbiAgICAgICAgdmFyIHJlcXVlc3QgPSBuZXcgd2luZG93LlhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHJlcXVlc3Qub3BlbignR0VUJywgdXJsKTtcbiAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ1VuYWJsZSB0byBHRVQgJyArIHVybCArICcsIHN0YXR1cyAnICsgcmVxdWVzdC5zdGF0dXMgKyAnICcgKyAoJycgKyByZXF1ZXN0LnJlc3BvbnNlVGV4dCkpKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXF1ZXN0Lm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPCAyMDAgfHwgcmVxdWVzdC5zdGF0dXMgPj0gMzAwKSB7XG4gICAgICAgICAgICByZXF1ZXN0Lm9uZXJyb3IoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZSgoMCwgX3BhcnNlRGF0YVNldC5wYXJzZURhdGFTZXQpKHJlcXVlc3QucmVzcG9uc2UpKTtcbiAgICAgICAgfTsgLy8gcmVxdWVzdC5vbmxvYWRcblxuICAgICAgICByZXF1ZXN0LnNlbmQoKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYWxsIHNvdXJjZSBwb3NpdGlvbnMgb2YgYSBnaXZlbiBVUkwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gc291cmNlVXJsIGlzIHRoZSBjb21wbGV0ZSBTT0ZBIFVSTCwgd2l0aCB0aGVcbiAgICAgKiBzZXJ2ZXIsIGxpa2VcbiAgICAgKiAnaHR0cDovL2JpbGkyLmlyY2FtLmZyL1NpbXBsZUZyZWVGaWVsZEhSSVIvQklMSS9DT01QRU5TQVRFRC80NDEwMC9JUkNfMTEwMF9DX0hSSVIuc29mYSdcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtQcm9taXNlLjxBcnJheTxBcnJheS48TnVtYmVyPj58RXJyb3I+fSBUaGUgcHJvbWlzZSB3aWxsIHJlc29sdmVcbiAgICAgKiBhZnRlciBzdWNjZXNzZnVsbHkgbG9hZGluZywgd2l0aCBhbiBhcnJheSBvZiBwb3NpdGlvbnMgKHdoaWNoIGFyZVxuICAgICAqIGFycmF5cyBvZiAzIG51bWJlcnMpOyB0aGUgcHJvbWlzZSB3aWxsIHJlamVjdCBpcyB0aGUgdHJhbnNmZXIgZmFpbHMsXG4gICAgICogd2l0aCBhbiBlcnJvci5cbiAgICAgKi9cblxuICB9LCB7XG4gICAga2V5OiAnZ2V0U291cmNlUG9zaXRpb25zJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0U291cmNlUG9zaXRpb25zKHNvdXJjZVVybCkge1xuICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIHZhciB1cmwgPSBzb3VyY2VVcmwgKyAnLmpzb24/U291cmNlUG9zaXRpb24nO1xuXG4gICAgICAgIHZhciByZXF1ZXN0ID0gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICByZXF1ZXN0Lm9wZW4oJ0dFVCcsIHVybCk7XG4gICAgICAgIHJlcXVlc3Qub25lcnJvciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdVbmFibGUgdG8gR0VUICcgKyB1cmwgKyAnLCBzdGF0dXMgJyArIHJlcXVlc3Quc3RhdHVzICsgJyAnICsgKCcnICsgcmVxdWVzdC5yZXNwb25zZVRleHQpKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmVxdWVzdC5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgaWYgKHJlcXVlc3Quc3RhdHVzIDwgMjAwIHx8IHJlcXVlc3Quc3RhdHVzID49IDMwMCkge1xuICAgICAgICAgICAgcmVxdWVzdC5vbmVycm9yKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciByZXNwb25zZSA9IEpTT04ucGFyc2UocmVxdWVzdC5yZXNwb25zZSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UubGVhdmVzWzBdLm5hbWUgIT09ICdTb3VyY2VQb3NpdGlvbicpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTb3VyY2VQb3NpdGlvbiBub3QgZm91bmQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzb2x2ZShyZXNwb25zZS5sZWF2ZXNbMF0uZGF0YSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIHJlLXRocm93XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKCdVbmFibGUgdG8gcGFyc2UgcmVzcG9uc2UgZnJvbSAnICsgdXJsICsgJy4gJyArIGVycm9yLm1lc3NhZ2UpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07IC8vIHJlcXVlc3Qub25sb2FkXG5cbiAgICAgICAgcmVxdWVzdC5zZW5kKCk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuICB9XSk7XG5cbiAgcmV0dXJuIFNlcnZlckRhdGFCYXNlO1xufSgpO1xuXG5leHBvcnRzLmRlZmF1bHQgPSBTZXJ2ZXJEYXRhQmFzZTsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLl9wYXJzZURpbWVuc2lvbiA9IF9wYXJzZURpbWVuc2lvbjtcbmV4cG9ydHMuX3BhcnNlRGVmaW5pdGlvbiA9IF9wYXJzZURlZmluaXRpb247XG5leHBvcnRzLnBhcnNlRGF0YVNldCA9IHBhcnNlRGF0YVNldDtcbi8qKlxuICogQGZpbGVPdmVydmlldyBQYXJzZXIgZm9yIEREUyBmaWxlc1xuICogQGF1dGhvciBKZWFuLVBoaWxpcHBlLkxhbWJlcnRAaXJjYW0uZnJcbiAqIEBjb3B5cmlnaHQgMjAxNS0yMDE2IElSQ0FNLCBQYXJpcywgRnJhbmNlXG4gKiBAbGljZW5zZSBCU0QtMy1DbGF1c2VcbiAqL1xuXG4vLyAnW1IgPSAyXSdcbnZhciBfZGltZW5zaW9uUGF0dGVybiA9ICdcXFxcW1xcXFxzKihcXFxcdyspXFxcXHMqPVxcXFxzKihcXFxcZCspXFxcXHMqXFxcXF0nO1xudmFyIF9kaW1lbnNpb25NYXRjaCA9IG5ldyBSZWdFeHAoX2RpbWVuc2lvblBhdHRlcm4sICdnJyk7XG52YXIgX2RpbWVuc2lvblNwbGl0ID0gbmV3IFJlZ0V4cChfZGltZW5zaW9uUGF0dGVybik7XG5cbi8vICdGbG9hdDY0IFJlY2VpdmVyUG9zaXRpb25bUiA9IDJdW0MgPSAzXVtJID0gMV07J1xuLy9cbi8vIGRvIG5vdCByZS11c2UgZGltZW5zaW9uIHBhdHRlcm4gKGZvciBncm91cGluZylcbnZhciBfZGVmaW5pdGlvblBhdHRlcm4gPSAnXFxcXHMqKFxcXFx3KylcXFxccyooW1xcXFx3Ll0rKVxcXFxzKicgKyAnKCg/OlxcXFxbW15cXFxcXV0rXFxcXF1cXFxccyopKyknICsgJztcXFxccyonO1xudmFyIF9kZWZpbml0aW9uTWF0Y2ggPSBuZXcgUmVnRXhwKF9kZWZpbml0aW9uUGF0dGVybiwgJ2cnKTtcbnZhciBfZGVmaW5pdGlvblNwbGl0ID0gbmV3IFJlZ0V4cChfZGVmaW5pdGlvblBhdHRlcm4pO1xuXG4vLyBgRGF0YXNldCB7XG4vLyAgIEZsb2F0NjQgTGlzdGVuZXJQb3NpdGlvbltJID0gMV1bQyA9IDNdO1xuLy8gICBGbG9hdDY0IExpc3RlbmVyVXBbSSA9IDFdW0MgPSAzXTtcbi8vICAgRmxvYXQ2NCBMaXN0ZW5lclZpZXdbSSA9IDFdW0MgPSAzXTtcbi8vICAgRmxvYXQ2NCBSZWNlaXZlclBvc2l0aW9uW1IgPSAyXVtDID0gM11bSSA9IDFdO1xuLy8gICBGbG9hdDY0IFNvdXJjZVBvc2l0aW9uW00gPSAxNjgwXVtDID0gM107XG4vLyAgIEZsb2F0NjQgRW1pdHRlclBvc2l0aW9uW0UgPSAxXVtDID0gM11bSSA9IDFdO1xuLy8gICBGbG9hdDY0IERhdGEuU2FtcGxpbmdSYXRlW0kgPSAxXTtcbi8vICAgRmxvYXQ2NCBEYXRhLkRlbGF5W0kgPSAxXVtSID0gMl07XG4vLyAgIEZsb2F0NjQgRGF0YS5JUltNID0gMTY4MF1bUiA9IDJdW04gPSA5NDFdO1xuLy8gICBGbG9hdDY0IFJvb21Wb2x1bWVbSSA9IDFdO1xuLy8gfSBJUkNfMTEwMF9DX0hSSVIuc29mYTtgXG4vL1xuLy8gZG8gbm90IHJlLXVzZSBkZWZpbml0aW9uIHBhdHRlcm4gKGZvciBncm91cGluZylcbnZhciBfZGF0YVNldFBhdHRlcm4gPSAnXFxcXHMqRGF0YXNldFxcXFxzKlxcXFx7XFxcXHMqJyArICcoKD86W147XSs7XFxcXHMqKSopJyArICdcXFxccypcXFxcfVxcXFxzKltcXFxcdy5dK1xcXFxzKjtcXFxccyonO1xudmFyIF9kYXRhU2V0U3BsaXQgPSBuZXcgUmVnRXhwKF9kYXRhU2V0UGF0dGVybik7XG5cbi8qKlxuICogUGFyc2VzIGRpbWVuc2lvbiBzdHJpbmdzIGludG8gYW4gYXJyYXkgb2YgW2tleSwgdmFsdWVdIHBhaXJzLlxuICpcbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gaW5wdXQgaXMgc2luZ2xlIG9yIG11bHRpcGxlIGRpbWVuc2lvblxuICogQHJldHVybnMge0FycmF5LjxBcnJheS48U3RyaW5nPj59IG9iamVjdCBba2V5LCB2YWx1ZV0gcGFpcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogX3BhcnNlRGltZW5zaW9uKCdbUiA9IDJdJyk7XG4gKiAvLyBbIFsgJ1InLCAyIF0gXVxuICpcbiAqIF9wYXJzZURpbWVuc2lvbignW1IgPSAyXVtDID0gM11bSSA9IDFdJyk7XG4gKiAvLyBbIFsgJ1InLCAyIF0sIFsgJ0MnLCAzIF0sIFsgJ0knLCAxIF0gXVxuICovXG5mdW5jdGlvbiBfcGFyc2VEaW1lbnNpb24oaW5wdXQpIHtcbiAgdmFyIHBhcnNlID0gW107XG4gIHZhciBpbnB1dHMgPSBpbnB1dC5tYXRjaChfZGltZW5zaW9uTWF0Y2gpO1xuICBpZiAoaW5wdXRzICE9PSBudWxsKSB7XG4gICAgaW5wdXRzLmZvckVhY2goZnVuY3Rpb24gKGlucHV0U2luZ2xlKSB7XG4gICAgICB2YXIgcGFydHMgPSBfZGltZW5zaW9uU3BsaXQuZXhlYyhpbnB1dFNpbmdsZSk7XG4gICAgICBpZiAocGFydHMgIT09IG51bGwgJiYgcGFydHMubGVuZ3RoID4gMikge1xuICAgICAgICBwYXJzZS5wdXNoKFtwYXJ0c1sxXSwgTnVtYmVyKHBhcnRzWzJdKV0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiBwYXJzZTtcbn1cblxuLyoqXG4gKiBQYXJzZSBkZWZpbml0aW9uIHN0cmluZ3MgaW50byBhbiBhcnJheSBvZiBba2V5LCB7dmFsdWVzfV0gcGFpcnMuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGlucHV0IGlzIHNpbmdsZSBvciBtdWx0aXBsZSBkZWZpbml0aW9uXG4gKiBAcmV0dXJucyB7QXJyYXkuPEFycmF5PFN0cmluZyxPYmplY3Q+Pn0gW2tleSwge3ZhbHVlc31dIHBhaXJzXG4gKlxuICogQHByaXZhdGVcbiAqIEBleGFtcGxlXG4gKiBfcGFyc2VEZWZpbml0aW9uKCdGbG9hdDY0IFJlY2VpdmVyUG9zaXRpb25bUiA9IDJdW0MgPSAzXVtJID0gMV07Jyk7XG4gKiAvLyBbIFsgJ1JlY2VpdmVyUG9zaXRpb24nLFxuICogLy8gICAgIHsgdHlwZTogJ0Zsb2F0NjQnLCBSOiAyLCBDOiAzLCBJOiAxIH0gXSBdXG4gKlxuICogX3BhcnNlRGVmaW5pdGlvbihcbiAqIGAgICAgRmxvYXQ2NCBSZWNlaXZlclBvc2l0aW9uW1IgPSAyXVtDID0gM11bSSA9IDFdO1xuICogICAgICBGbG9hdDY0IFNvdXJjZVBvc2l0aW9uW00gPSAxNjgwXVtDID0gM107XG4gKiAgICAgIEZsb2F0NjQgRW1pdHRlclBvc2l0aW9uW0UgPSAxXVtDID0gM11bSSA9IDFdO2ApO1xuICogLy8gWyBbICdSZWNlaXZlclBvc2l0aW9uJyxcbiAqIC8vICAgICAgeyB0eXBlOiAnRmxvYXQ2NCcsIFI6IDIsIEM6IDMsIEk6IDEgfSBdLFxuICogLy8gICBbICdTb3VyY2VQb3NpdGlvbicsIHsgdHlwZTogJ0Zsb2F0NjQnLCBNOiAxNjgwLCBDOiAzIH0gXSxcbiAqIC8vICAgWyAnRW1pdHRlclBvc2l0aW9uJyxcbiAqIC8vICAgICB7IHR5cGU6ICdGbG9hdDY0JywgRTogMSwgQzogMywgSTogMSB9IF0gXVxuICovXG5mdW5jdGlvbiBfcGFyc2VEZWZpbml0aW9uKGlucHV0KSB7XG4gIHZhciBwYXJzZSA9IFtdO1xuICB2YXIgaW5wdXRzID0gaW5wdXQubWF0Y2goX2RlZmluaXRpb25NYXRjaCk7XG4gIGlmIChpbnB1dHMgIT09IG51bGwpIHtcbiAgICBpbnB1dHMuZm9yRWFjaChmdW5jdGlvbiAoaW5wdXRTaW5nbGUpIHtcbiAgICAgIHZhciBwYXJ0cyA9IF9kZWZpbml0aW9uU3BsaXQuZXhlYyhpbnB1dFNpbmdsZSk7XG4gICAgICBpZiAocGFydHMgIT09IG51bGwgJiYgcGFydHMubGVuZ3RoID4gMykge1xuICAgICAgICAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHZhciBjdXJyZW50ID0gW107XG4gICAgICAgICAgY3VycmVudFswXSA9IHBhcnRzWzJdO1xuICAgICAgICAgIGN1cnJlbnRbMV0gPSB7fTtcbiAgICAgICAgICBjdXJyZW50WzFdLnR5cGUgPSBwYXJ0c1sxXTtcbiAgICAgICAgICBfcGFyc2VEaW1lbnNpb24ocGFydHNbM10pLmZvckVhY2goZnVuY3Rpb24gKGRpbWVuc2lvbikge1xuICAgICAgICAgICAgY3VycmVudFsxXVtkaW1lbnNpb25bMF1dID0gZGltZW5zaW9uWzFdO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBhcnNlLnB1c2goY3VycmVudCk7XG4gICAgICAgIH0pKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlO1xufVxuXG4vKipcbiAqIFBhcnNlIGRhdGEgc2V0IG1ldGEgZGF0YSBpbnRvIGFuIG9iamVjdCBvZiBge2RlZmluaXRpb246IHtrZXk6IHZhbHVlc319YCBvYmplY3RzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBpbnB1dCBkYXRhIHNldCBERFMtbGlrZS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IGRlZmluaXRpb25zIGFzIGB7ZGVmaW5pdGlvbjoge2tleTogdmFsdWVzfX1gIG9iamVjdHMuXG4gKlxuICogQGV4YW1wbGVcbiAqIF9wYXJzZURhdGFTZXQoXG4gKiBgRGF0YXNldCB7XG4gKiAgICAgIEZsb2F0NjQgUmVjZWl2ZXJQb3NpdGlvbltSID0gMl1bQyA9IDNdW0kgPSAxXTtcbiAqICAgICAgRmxvYXQ2NCBTb3VyY2VQb3NpdGlvbltNID0gMTY4MF1bQyA9IDNdO1xuICogICAgICBGbG9hdDY0IEVtaXR0ZXJQb3NpdGlvbltFID0gMV1bQyA9IDNdW0kgPSAxXTtcbiAqICAgICAgRmxvYXQ2NCBEYXRhLlNhbXBsaW5nUmF0ZVtJID0gMV07XG4gKiB9IElSQ18xMTAwX0NfSFJJUi5zb2ZhO2ApO1xuICogLy8gIHsgUmVjZWl2ZXJQb3NpdGlvbjogeyB0eXBlOiAnRmxvYXQ2NCcsIFI6IDIsIEM6IDMsIEk6IDEgfSxcbiAqIC8vICAgIFNvdXJjZVBvc2l0aW9uOiB7IHR5cGU6ICdGbG9hdDY0JywgTTogMTY4MCwgQzogMyB9LFxuICogLy8gICAgRW1pdHRlclBvc2l0aW9uOiB7IHR5cGU6ICdGbG9hdDY0JywgRTogMSwgQzogMywgSTogMSB9XG4gKiAvLyAgICAnRGF0YS5TYW1wbGluZ1JhdGUnOiB7IHR5cGU6ICdGbG9hdDY0JywgSTogMSB9IH1cbiAqL1xuZnVuY3Rpb24gcGFyc2VEYXRhU2V0KGlucHV0KSB7XG4gIHZhciBwYXJzZSA9IHt9O1xuICB2YXIgZGVmaW5pdGlvbnMgPSBfZGF0YVNldFNwbGl0LmV4ZWMoaW5wdXQpO1xuICBpZiAoZGVmaW5pdGlvbnMgIT09IG51bGwgJiYgZGVmaW5pdGlvbnMubGVuZ3RoID4gMSkge1xuICAgIF9wYXJzZURlZmluaXRpb24oZGVmaW5pdGlvbnNbMV0pLmZvckVhY2goZnVuY3Rpb24gKGRlZmluaXRpb24pIHtcbiAgICAgIHBhcnNlW2RlZmluaXRpb25bMF1dID0gZGVmaW5pdGlvblsxXTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gcGFyc2U7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHBhcnNlRGF0YVNldDsiLCIndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICB2YWx1ZTogdHJ1ZVxufSk7XG5cbnZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIgPyBmdW5jdGlvbiAob2JqKSB7IHJldHVybiB0eXBlb2Ygb2JqOyB9IDogZnVuY3Rpb24gKG9iaikgeyByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG5leHBvcnRzLnBhcnNlU29mYSA9IHBhcnNlU29mYTtcbmV4cG9ydHMuc3RyaW5naWZ5U29mYSA9IHN0cmluZ2lmeVNvZmE7XG5leHBvcnRzLmNvbmZvcm1Tb2ZhQ29vcmRpbmF0ZVN5c3RlbSA9IGNvbmZvcm1Tb2ZhQ29vcmRpbmF0ZVN5c3RlbTtcbi8qKlxuICogQGZpbGVPdmVydmlldyBQYXJzZXIgZnVuY3Rpb25zIGZvciBTT0ZBIGZpbGVzXG4gKiBAYXV0aG9yIEplYW4tUGhpbGlwcGUuTGFtYmVydEBpcmNhbS5mclxuICogQGNvcHlyaWdodCAyMDE1IElSQ0FNLCBQYXJpcywgRnJhbmNlXG4gKiBAbGljZW5zZSBCU0QtMy1DbGF1c2VcbiAqL1xuXG4vKipcbiAqIFBhcnNlcyBhIFNPRkEgSlNPTiBzdHJpbmcgd2l0aCBpbnRvIGFuIG9iamVjdCB3aXRoIGBuYW1lYCwgYGRhdGFgIGFuZFxuICogYG1ldGFEYXRhYCBhdHRyaWJ1dGVzLlxuICpcbiAqIEBzZWUge0BsaW5rIHN0cmluZ2lmeVNvZmF9XG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHNvZmFTdHJpbmcgaW4gU09GQSBKU09OIGZvcm1hdFxuICogQHJldHVybnMge09iamVjdH0gd2l0aCBgZGF0YWAgYW5kIGBtZXRhRGF0YWAgYXR0cmlidXRlc1xuICogQHRocm93cyB7RXJyb3J9IHdoZW4gdGhlIHBhcnNpbmcgZmFpbHNcbiAqL1xuZnVuY3Rpb24gcGFyc2VTb2ZhKHNvZmFTdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICB2YXIgX3JldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBzb2ZhID0gSlNPTi5wYXJzZShzb2ZhU3RyaW5nKTtcbiAgICAgIHZhciBzb2ZhU2V0ID0ge307XG5cbiAgICAgIHNvZmFTZXQubmFtZSA9IHNvZmEubmFtZTtcblxuICAgICAgaWYgKHR5cGVvZiBzb2ZhLmF0dHJpYnV0ZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNvZmFTZXQubWV0YURhdGEgPSB7fTtcbiAgICAgICAgdmFyIG1ldGFEYXRhID0gc29mYS5hdHRyaWJ1dGVzLmZpbmQoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICByZXR1cm4gZS5uYW1lID09PSAnTkNfR0xPQkFMJztcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0eXBlb2YgbWV0YURhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgbWV0YURhdGEuYXR0cmlidXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBzb2ZhU2V0Lm1ldGFEYXRhW2UubmFtZV0gPSBlLnZhbHVlWzBdO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc29mYS5sZWF2ZXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHZhciBkYXRhID0gc29mYS5sZWF2ZXM7XG4gICAgICAgIGRhdGEuZm9yRWFjaChmdW5jdGlvbiAoZCkge1xuICAgICAgICAgIHNvZmFTZXRbZC5uYW1lXSA9IHt9O1xuICAgICAgICAgIGQuYXR0cmlidXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChhKSB7XG4gICAgICAgICAgICBzb2ZhU2V0W2QubmFtZV1bYS5uYW1lXSA9IGEudmFsdWVbMF07XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgc29mYVNldFtkLm5hbWVdLnNoYXBlID0gZC5zaGFwZTtcbiAgICAgICAgICBzb2ZhU2V0W2QubmFtZV0uZGF0YSA9IGQuZGF0YTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHY6IHNvZmFTZXRcbiAgICAgIH07XG4gICAgfSgpO1xuXG4gICAgaWYgKCh0eXBlb2YgX3JldCA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YoX3JldCkpID09PSBcIm9iamVjdFwiKSByZXR1cm4gX3JldC52O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHBhcnNlIFNPRkEgc3RyaW5nLiAnICsgZXJyb3IubWVzc2FnZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBTT0ZBIEpTT04gc3RyaW5nIGZyb20gYW4gb2JqZWN0LlxuICpcbiAqIE5vdGUgdGhhdCB0aGUgcHJvcGVydGllcyBkaWZmZXIgZnJvbSBlaXRoZXIgYW4ge0BsaW5rIEhydGZTZXR9IGFuZCBmcm9tXG4gKiB0aGUgcmVzdWx0IG9mIHRoZSBwYXJzaW5nIG9mIGEgU09GQSBKU09OLiBJbiBwYXJ0aWN1bGFyLCB0aGUgbGlzdGVuZXJcbiAqIGF0dHJpYnV0ZXMgY29ycmVzcG9uZCB0byB0aGUgcmVmZXJlbmNlIGZvciB0aGUgZmlsdGVyczsgdGhlIHNvdXJjZVxuICogcG9zaXRpb25zIGFyZSB0aGUgcG9zaXRpb25zIGluIHRoZSBkYXRhLWJhc2UuXG4gKlxuICogQHNlZSB7QGxpbmsgcGFyc2VTb2ZhfVxuICogQHNlZSB7QGxpbmsgSHJ0ZlNldH1cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc29mYVNldFxuICogQHBhcmFtIHtDb29yZGluYXRlc30gc29mYVNldC5MaXN0ZW5lclBvc2l0aW9uXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdGVTeXN0ZW19IHNvZmFTZXQuTGlzdGVuZXJQb3NpdGlvblR5cGVcbiAqIEBwYXJhbSB7Q29vcmRpbmF0ZXN9IHNvZmFTZXQuTGlzdGVuZXJVcFxuICogQHBhcmFtIHtDb29yZGluYXRlU3lzdGVtfSBzb2ZhU2V0Lkxpc3RlbmVyVXBUeXBlXG4gKiBAcGFyYW0ge0Nvb3JkaW5hdGVzfSBzb2ZhU2V0Lkxpc3RlbmVyVmlld1xuICogQHBhcmFtIHtDb29yZGluYXRlU3lzdGVtfSBzb2ZhU2V0Lkxpc3RlbmVyVmlld1R5cGVcbiAqIEBwYXJhbSB7QXJyYXkuPEFycmF5LjxOdW1iZXI+Pn0gc29mYVNldC5Tb3VyY2VQb3NpdGlvblxuICogQHBhcmFtIHtDb29yZGluYXRlU3lzdGVtfSBzb2ZhU2V0LlNvdXJjZVBvc2l0aW9uVHlwZVxuICogQHBhcmFtIHtOdW1iZXJ9IHNvZmFTZXQuRGF0YVNhbXBsaW5nUmF0ZVxuICogQHBhcmFtIHtBcnJheS48QXJyYXkuPEFycmF5LjxOdW1iZXI+Pj59IHNvZmFTZXQuRGF0YUlSXG4gKiBAcGFyYW0ge0FycmF5LjxOdW1iZXI+fSBzb2ZhU2V0LlJvb21Wb2x1bWVcbiAqIEByZXR1cm5zIHtTdHJpbmd9IGluIFNPRkEgSlNPTiBmb3JtYXRcbiAqIEB0aHJvd3Mge0Vycm9yfSB3aGVuIHRoZSBleHBvcnQgZmFpbHMsIGJlY2F1c2Ugb2YgbWlzc2luZyBkYXRhIG9yXG4gKiB1bmtub3duIGNvb3JkaW5hdGUgc3lzdGVtXG4gKi9cbmZ1bmN0aW9uIHN0cmluZ2lmeVNvZmEoc29mYVNldCkge1xuICB2YXIgc29mYSA9IHt9O1xuXG4gIGlmICh0eXBlb2Ygc29mYVNldC5uYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgIHNvZmEubmFtZSA9IHNvZmFTZXQubmFtZTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc29mYVNldC5tZXRhRGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzb2ZhLmF0dHJpYnV0ZXMgPSBbXTtcbiAgICB2YXIgbmNHbG9iYWwgPSB7XG4gICAgICBuYW1lOiAnTkNfR0xPQkFMJyxcbiAgICAgIGF0dHJpYnV0ZXM6IFtdXG4gICAgfTtcblxuICAgIGZvciAodmFyIGF0dHJpYnV0ZSBpbiBzb2ZhU2V0Lm1ldGFEYXRhKSB7XG4gICAgICBpZiAoc29mYVNldC5tZXRhRGF0YS5oYXNPd25Qcm9wZXJ0eShhdHRyaWJ1dGUpKSB7XG4gICAgICAgIG5jR2xvYmFsLmF0dHJpYnV0ZXMucHVzaCh7XG4gICAgICAgICAgbmFtZTogYXR0cmlidXRlLFxuICAgICAgICAgIHZhbHVlOiBbc29mYVNldC5tZXRhRGF0YVthdHRyaWJ1dGVdXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzb2ZhLmF0dHJpYnV0ZXMucHVzaChuY0dsb2JhbCk7XG4gIH1cblxuICAvLyBhbHdheXMgdGhlIHNhbWU7XG4gIHZhciB0eXBlID0gJ0Zsb2F0NjQnO1xuXG4gIHZhciBhdHRyaWJ1dGVzID0gdm9pZCAwO1xuXG4gIHNvZmEubGVhdmVzID0gW107XG5cbiAgW1snTGlzdGVuZXJQb3NpdGlvbicsICdMaXN0ZW5lclBvc2l0aW9uVHlwZSddLCBbJ0xpc3RlbmVyVXAnLCAnTGlzdGVuZXJVcFR5cGUnXSwgWydMaXN0ZW5lclZpZXcnLCAnTGlzdGVuZXJWaWV3VHlwZSddXS5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0ZW5lckF0dHJpYnV0ZUFuZFR5cGUpIHtcbiAgICB2YXIgbGlzdGVuZXJBdHRyaWJ1dGVOYW1lID0gbGlzdGVuZXJBdHRyaWJ1dGVBbmRUeXBlWzBdO1xuICAgIHZhciBsaXN0ZW5lckF0dHJpYnV0ZSA9IHNvZmFTZXRbbGlzdGVuZXJBdHRyaWJ1dGVOYW1lXTtcbiAgICB2YXIgbGlzdGVuZXJUeXBlID0gc29mYVNldFtsaXN0ZW5lckF0dHJpYnV0ZUFuZFR5cGVbMV1dO1xuICAgIGlmICh0eXBlb2YgbGlzdGVuZXJBdHRyaWJ1dGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBzd2l0Y2ggKGxpc3RlbmVyVHlwZSkge1xuICAgICAgICBjYXNlICdjYXJ0ZXNpYW4nOlxuICAgICAgICAgIGF0dHJpYnV0ZXMgPSBbeyBuYW1lOiAnVHlwZScsIHZhbHVlOiBbJ2NhcnRlc2lhbiddIH0sIHsgbmFtZTogJ1VuaXRzJywgdmFsdWU6IFsnbWV0cmUsIG1ldHJlLCBtZXRyZSddIH1dO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3NwaGVyaWNhbCc6XG4gICAgICAgICAgYXR0cmlidXRlcyA9IFt7IG5hbWU6ICdUeXBlJywgdmFsdWU6IFsnc3BoZXJpY2FsJ10gfSwgeyBuYW1lOiAnVW5pdHMnLCB2YWx1ZTogWydkZWdyZWUsIGRlZ3JlZSwgbWV0cmUnXSB9XTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBjb29yZGluYXRlIHN5c3RlbSB0eXBlICcgKyAobGlzdGVuZXJUeXBlICsgJyBmb3IgJyArIGxpc3RlbmVyQXR0cmlidXRlKSk7XG4gICAgICB9XG4gICAgICAvLyBpbiBTT0ZBLCBldmVyeXRoaW5nIGlzIGNvbnRhaW5lZCBieSBhbiBhcnJheSwgZXZlbiBhbiBhcnJheS5cbiAgICAgIHNvZmEubGVhdmVzLnB1c2goe1xuICAgICAgICBuYW1lOiBsaXN0ZW5lckF0dHJpYnV0ZU5hbWUsXG4gICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXMsXG4gICAgICAgIHNoYXBlOiBbMSwgM10sXG4gICAgICAgIGRhdGE6IFtsaXN0ZW5lckF0dHJpYnV0ZV1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHR5cGVvZiBzb2ZhU2V0LlNvdXJjZVBvc2l0aW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgIHN3aXRjaCAoc29mYVNldC5Tb3VyY2VQb3NpdGlvblR5cGUpIHtcbiAgICAgIGNhc2UgJ2NhcnRlc2lhbic6XG4gICAgICAgIGF0dHJpYnV0ZXMgPSBbeyBuYW1lOiAnVHlwZScsIHZhbHVlOiBbJ2NhcnRlc2lhbiddIH0sIHsgbmFtZTogJ1VuaXRzJywgdmFsdWU6IFsnbWV0cmUsIG1ldHJlLCBtZXRyZSddIH1dO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnc3BoZXJpY2FsJzpcbiAgICAgICAgYXR0cmlidXRlcyA9IFt7IG5hbWU6ICdUeXBlJywgdmFsdWU6IFsnc3BoZXJpY2FsJ10gfSwgeyBuYW1lOiAnVW5pdHMnLCB2YWx1ZTogWydkZWdyZWUsIGRlZ3JlZSwgbWV0cmUnXSB9XTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBjb29yZGluYXRlIHN5c3RlbSB0eXBlICcgKyAoJycgKyBzb2ZhU2V0LlNvdXJjZVBvc2l0aW9uVHlwZSkpO1xuICAgIH1cbiAgICBzb2ZhLmxlYXZlcy5wdXNoKHtcbiAgICAgIG5hbWU6ICdTb3VyY2VQb3NpdGlvbicsXG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgYXR0cmlidXRlczogYXR0cmlidXRlcyxcbiAgICAgIHNoYXBlOiBbc29mYVNldC5Tb3VyY2VQb3NpdGlvbi5sZW5ndGgsIHNvZmFTZXQuU291cmNlUG9zaXRpb25bMF0ubGVuZ3RoXSxcbiAgICAgIGRhdGE6IHNvZmFTZXQuU291cmNlUG9zaXRpb25cbiAgICB9KTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc29mYVNldC5EYXRhU2FtcGxpbmdSYXRlICE9PSAndW5kZWZpbmVkJykge1xuICAgIHNvZmEubGVhdmVzLnB1c2goe1xuICAgICAgbmFtZTogJ0RhdGEuU2FtcGxpbmdSYXRlJyxcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBhdHRyaWJ1dGVzOiBbeyBuYW1lOiAnVW5pdCcsIHZhbHVlOiAnaGVydHonIH1dLFxuICAgICAgc2hhcGU6IFsxXSxcbiAgICAgIGRhdGE6IFtzb2ZhU2V0LkRhdGFTYW1wbGluZ1JhdGVdXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdObyBkYXRhIHNhbXBsaW5nLXJhdGUnKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc29mYVNldC5EYXRhRGVsYXkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgc29mYS5sZWF2ZXMucHVzaCh7XG4gICAgICBuYW1lOiAnRGF0YS5EZWxheScsXG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgYXR0cmlidXRlczogW10sXG4gICAgICBzaGFwZTogWzEsIHNvZmFTZXQuRGF0YURlbGF5Lmxlbmd0aF0sXG4gICAgICBkYXRhOiBzb2ZhU2V0LkRhdGFEZWxheVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBzb2ZhU2V0LkRhdGFJUiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBzb2ZhLmxlYXZlcy5wdXNoKHtcbiAgICAgIG5hbWU6ICdEYXRhLklSJyxcbiAgICAgIHR5cGU6IHR5cGUsXG4gICAgICBhdHRyaWJ1dGVzOiBbXSxcbiAgICAgIHNoYXBlOiBbc29mYVNldC5EYXRhSVIubGVuZ3RoLCBzb2ZhU2V0LkRhdGFJUlswXS5sZW5ndGgsIHNvZmFTZXQuRGF0YUlSWzBdWzBdLmxlbmd0aF0sXG4gICAgICBkYXRhOiBzb2ZhU2V0LkRhdGFJUlxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignTm8gZGF0YSBJUicpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBzb2ZhU2V0LlJvb21Wb2x1bWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgc29mYS5sZWF2ZXMucHVzaCh7XG4gICAgICBuYW1lOiAnUm9vbVZvbHVtZScsXG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgYXR0cmlidXRlczogW3sgbmFtZTogJ1VuaXRzJywgdmFsdWU6IFsnY3ViaWMgbWV0cmUnXSB9XSxcbiAgICAgIHNoYXBlOiBbMV0sXG4gICAgICBkYXRhOiBbc29mYVNldC5Sb29tVm9sdW1lXVxuICAgIH0pO1xuICB9XG5cbiAgc29mYS5ub2RlcyA9IFtdO1xuXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShzb2ZhKTtcbn1cblxuLyoqXG4gKiBQcmVmaXggU09GQSBjb29yZGluYXRlIHN5c3RlbSB3aXRoIGBzb2ZhYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3lzdGVtIDogZWl0aGVyIGBjYXJ0ZXNpYW5gIG9yIGBzcGhlcmljYWxgXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBlaXRoZXIgYHNvZmFDYXJ0ZXNpYW5gIG9yIGBzb2ZhU3BoZXJpY2FsYFxuICogQHRocm93cyB7RXJyb3J9IGlmIHN5c3RlbSBpcyB1bmtub3duXG4gKi9cbmZ1bmN0aW9uIGNvbmZvcm1Tb2ZhQ29vcmRpbmF0ZVN5c3RlbShzeXN0ZW0pIHtcbiAgdmFyIHR5cGUgPSB2b2lkIDA7XG5cbiAgc3dpdGNoIChzeXN0ZW0pIHtcbiAgICBjYXNlICdjYXJ0ZXNpYW4nOlxuICAgICAgdHlwZSA9ICdzb2ZhQ2FydGVzaWFuJztcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnc3BoZXJpY2FsJzpcbiAgICAgIHR5cGUgPSAnc29mYVNwaGVyaWNhbCc7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0JhZCBTT0ZBIHR5cGUgJyArIHN5c3RlbSk7XG4gIH1cbiAgcmV0dXJuIHR5cGU7XG59XG5cbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgcGFyc2VTb2ZhOiBwYXJzZVNvZmEsXG4gIGNvbmZvcm1Tb2ZhQ29vcmRpbmF0ZVN5c3RlbTogY29uZm9ybVNvZmFDb29yZGluYXRlU3lzdGVtXG59OyIsIid1c2Ugc3RyaWN0JztcblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbi8qKlxuICogQGZpbGVPdmVydmlldyBTaW1wbGUgWE1MIHBhcnNlciwgYXMgYSBET00gcGFyc2VyLlxuICogQGF1dGhvciBKZWFuLVBoaWxpcHBlLkxhbWJlcnRAaXJjYW0uZnJcbiAqIEBjb3B5cmlnaHQgMjAxNS0yMDE2IElSQ0FNLCBQYXJpcywgRnJhbmNlXG4gKiBAbGljZW5zZSBCU0QtMy1DbGF1c2VcbiAqL1xuXG4vKipcbiAqIFBhcnNlIGFuIFhNTCBzdHJpbmcgaW50byBhbiBYTUxEb2N1bWVudCBvYmplY3QsIHVzaW5nIG5hdGl2ZSBicm93c2VyIERPTVxuICogcGFyc2VyLlxuICpcbiAqIEl0IHJlcXVpcmVzIGEgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAqXG4gKiBAZnVuY3Rpb24gcGFyc2VYbWxcbiAqIEBwYXJhbSB7U3RyaW5nfSB4bWxTdHIgZnVsbCB2YWxpZCBYTUwgZGF0YS5cbiAqIEByZXR1cm5zIHtPYmplY3R9IFhNTERvY3VtZW50LCBET00tbGlrZS4gKFVzZSBhbnkgc2VsZWN0b3IuKVxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCByZXF1ZXN0ID0gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuICogcmVxdWVzdC5vcGVuKCdHRVQnLCAnaHR0cDovL2JpbGkyLmlyY2FtLmZyL2NhdGFsb2cueG1sJyk7XG4gKiByZXF1ZXN0Lm9uZXJyb3IgPSAgKCkgPT4ge1xuICogICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gR0VUOiAke3JlcXVlc3Quc3RhdHVzfWApO1xuICogfTtcbiAqIHJlcXVlc3Qub25sb2FkID0gKCkgPT4ge1xuICogICBjb25zdCB4bWwgPSBwYXJzZVhtbChyZXF1ZXN0LnJlc3BvbnNlKTtcbiAqICAgY29uc3QgY2F0YWxvZ3VlUmVmZXJlbmNlcyA9IHhtbC5xdWVyeVNlbGVjdG9yKCdkYXRhc2V0ID4gY2F0YWxvZ1JlZicpO1xuICogICBjb25zb2xlLmxvZyhjYXRhbG9ndWVSZWZlcmVuY2VzKTtcbiAqIH1cbiAqIHJlcXVlc3Quc2VuZCgpO1xuICovXG52YXIgcGFyc2VYbWwgPSBleHBvcnRzLnBhcnNlWG1sID0gdm9pZCAwO1xuXG5pZiAodHlwZW9mIHdpbmRvdy5ET01QYXJzZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gIGV4cG9ydHMucGFyc2VYbWwgPSBwYXJzZVhtbCA9IGZ1bmN0aW9uIHBhcnNlWG1sRE9NKHhtbFN0cikge1xuICAgIHJldHVybiBuZXcgd2luZG93LkRPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyh4bWxTdHIsICd0ZXh0L3htbCcpO1xuICB9O1xufSBlbHNlIGlmICh0eXBlb2Ygd2luZG93LkFjdGl2ZVhPYmplY3QgIT09ICd1bmRlZmluZWQnICYmIG5ldyB3aW5kb3cuQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTERPTScpKSB7XG4gIGV4cG9ydHMucGFyc2VYbWwgPSBwYXJzZVhtbCA9IGZ1bmN0aW9uIHBhcnNlWG1sQWN0aXZlWCh4bWxTdHIpIHtcbiAgICB2YXIgeG1sRG9jID0gbmV3IHdpbmRvdy5BY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MRE9NJyk7XG4gICAgeG1sRG9jLmFzeW5jID0gJ2ZhbHNlJztcbiAgICB4bWxEb2MubG9hZFhNTCh4bWxTdHIpO1xuICAgIHJldHVybiB4bWxEb2M7XG4gIH07XG59IGVsc2Uge1xuICB0aHJvdyBuZXcgRXJyb3IoJ05vIFhNTCBwYXJzZXIgZm91bmQnKTtcbn1cblxuZXhwb3J0cy5kZWZhdWx0ID0gcGFyc2VYbWw7IiwiLyoqXG4gKiBAZmlsZW92ZXJ2aWV3IEZyYWN0aW9uYWwgZGVsYXkgbGlicmFyeVxuICogQGF1dGhvciBBcm5hdSBKdWxpw6AgPEFybmF1Lkp1bGlhQGdtYWlsLmNvbT5cbiAqIEB2ZXJzaW9uIDAuMS4wXG4gKi9cbi8qKlxuICogQGNsYXNzIEZyYWN0aW9uYWxEZWxheVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGcmFjdGlvbmFsRGVsYXkge1xuICAgIC8qKlxuICAgICAqIE1hbmRhdG9yeSBpbml0aWFsaXphdGlvbiBtZXRob2QuXG4gICAgICogQHB1YmxpY1xuICAgICAqIEBwYXJhbSB1bml0czpIeiBzYW1wbGVSYXRlIFNhbXBsZSBSYXRlIHRoZSBhcHBhcmF0dXMgb3BlcmF0ZXMgb24uXG4gICAgICogQHBhcmFtIHR5cGU6RmxvYXQgdW5pdHM6cyBtaW46MC4wIGRlZmF1bHQ6MSBvcHRNYXhEZWxheVRpbWUgVGhlIG1heGltdW0gZGVsYXkgdGltZS5cbiAgICAgKiBAY2hhaW5hYmxlXG4gICAgICovXG4gICAgY29uc3RydWN0b3Ioc2FtcGxlUmF0ZSwgb3B0TWF4RGVsYXlUaW1lKSB7XG4gICAgICAgIC8vIFByb3BlcnRpZXMgd2l0aCBkZWZhdWx0IHZhbHVlc1xuICAgICAgICB0aGlzLmRlbGF5VGltZSA9IDA7XG4gICAgICAgIHRoaXMucG9zUmVhZCA9IDA7XG4gICAgICAgIHRoaXMucG9zV3JpdGUgPSAwO1xuICAgICAgICB0aGlzLmZyYWNYaTEgPSAwO1xuICAgICAgICB0aGlzLmZyYWNZaTEgPSAwO1xuICAgICAgICB0aGlzLmludERlbGF5ID0gMDtcbiAgICAgICAgdGhpcy5mcmFjRGVsYXkgPSAwO1xuXG4gICAgICAgIC8vIE90aGVyIHByb3BlcnRpZXNcbiAgICAgICAgdGhpcy5hMSA9IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBTYXZlIHNhbXBsZSByYXRlXG4gICAgICAgIHRoaXMuc2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7XG4gICAgICAgIHRoaXMubWF4RGVsYXlUaW1lID0gb3B0TWF4RGVsYXlUaW1lIHx8IDE7XG5cbiAgICAgICAgdGhpcy5idWZmZXJTaXplID0gdGhpcy5tYXhEZWxheVRpbWUgKiB0aGlzLnNhbXBsZVJhdGU7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBidWZmZXJTaXplIGlzIG5vdCBhbiBpbnRlZ2VyXG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlclNpemUgJSAxICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmJ1ZmZlclNpemUgPSBwYXJzZUludCh0aGlzLmJ1ZmZlclNpemUpICsgMTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDcmVhdGUgdGhlIGludGVybmFsIGJ1ZmZlclxuICAgICAgICB0aGlzLmJ1ZmZlciA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5idWZmZXJTaXplKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgZGVsYXkgdmFsdWVcbiAgICAgKiBAcGFyYW0gZGVsYXlUaW1lIERlbGF5IHRpbWVcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgc2V0RGVsYXkoZGVsYXlUaW1lKSB7XG4gICAgICAgIGlmIChkZWxheVRpbWUgPCB0aGlzLm1heERlbGF5VGltZSkge1xuICAgICAgICAgICAgLy8gU2F2ZSBkZWxheSB2YWx1ZVxuICAgICAgICAgICAgdGhpcy5kZWxheVRpbWUgPSBkZWxheVRpbWU7XG4gICAgICAgICAgICAvLyBUcmFuc2Zvcm0gdGltZSBpbiBzYW1wbGVzXG4gICAgICAgICAgICB2YXIgc2FtcGxlc0RlbGF5ID0gZGVsYXlUaW1lICogdGhpcy5zYW1wbGVSYXRlO1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBpbnRlZ2VyIHBhcnQgb2Ygc2FtcGxlc0RlbGF5XG4gICAgICAgICAgICB0aGlzLmludERlbGF5ID0gcGFyc2VJbnQoc2FtcGxlc0RlbGF5KTtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgZnJhY3Rpb25hbCBwYXJ0IG9mIHNhbXBsZXNEZWxheVxuICAgICAgICAgICAgdGhpcy5mcmFjRGVsYXkgPSBzYW1wbGVzRGVsYXkgLSB0aGlzLmludERlbGF5O1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgcG9pbnRlclxuICAgICAgICAgICAgdGhpcy5yZXNhbXBsZSgpO1xuICAgICAgICAgICAgLy8gSWYgdGhlIGRlbGF5IGhhcyBmcmFjdGlvbmFsIHBhcnQsIHVwZGF0ZSB0aGUgVGhpcmFuIENvZWZmaWNpZW50c1xuICAgICAgICAgICAgaWYgKHRoaXMuZnJhY0RlbGF5ICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVUaGlyYW5Db2VmZmljaWVudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZGVsYXlUaW1lID4gbWF4RGVsYXlUaW1lXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGRlbGF5IHZhbHVlXG4gICAgICogQHB1YmxpY1xuICAgICAqL1xuICAgIGdldERlbGF5KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kZWxheVRpbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJvY2VzcyBtZXRob2QsIHdoZXJlIHRoZSBvdXRwdXQgaXMgY2FsY3VsYXRlZC5cbiAgICAgKiBAcGFyYW0gaW5wdXRCdWZmZXIgSW5wdXQgQXJyYXlcbiAgICAgKiBAcHVibGljXG4gICAgICovXG4gICAgcHJvY2VzcyhpbnB1dEJ1ZmZlcikge1xuICAgICAgICAvLyBDcmVhdGVzIHRoZSBvdXRwdXRCdWZmZXIsIHdpdGggdGhlIHNhbWUgbGVuZ3RoIG9mIHRoZSBpbnB1dFxuICAgICAgICB2YXIgb3V0cHV0QnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheShpbnB1dEJ1ZmZlci5sZW5ndGgpO1xuXG4gICAgICAgIC8vIEludGVnZXIgZGVsYXkgcHJvY2VzcyBzZWN0aW9uXG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5wdXRCdWZmZXIubGVuZ3RoOyBpID0gaSArIDEpIHtcbiAgICAgICAgICAgIC8vIFNhdmUgdGhlIGlucHV0IHZhbHVlIGluIHRoZSBidWZmZXJcbiAgICAgICAgICAgIHRoaXMuYnVmZmVyW3RoaXMucG9zV3JpdGVdID0gaW5wdXRCdWZmZXJbaV07XG4gICAgICAgICAgICAvLyBXcml0ZSB0aGUgb3V0cHV0QnVmZmVyIHdpdGggdGhlIFtpbnB1dFZhbHVlIC0gZGVsYXldIHNhbXBsZVxuICAgICAgICAgICAgb3V0cHV0QnVmZmVyW2ldID0gdGhpcy5idWZmZXJbdGhpcy5wb3NSZWFkXTtcbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgdmFsdWUgb2YgcG9zUmVhZCBhbmQgcG9zV3JpdGUgcG9pbnRlcnNcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUG9pbnRlcnMoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBObyBmcmFjdGlvbmFsIGRlbGF5XG4gICAgICAgIGlmICh0aGlzLmZyYWNEZWxheSA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dEJ1ZmZlcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFRoZSBmcmFjdGlvbmFsIGRlbGF5IHByb2Nlc3Mgc2VjdGlvblxuICAgICAgICAgICAgb3V0cHV0QnVmZmVyID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLmZyYWN0aW9uYWxUaGlyYW5Qcm9jZXNzKG91dHB1dEJ1ZmZlcikpO1xuICAgICAgICAgICAgcmV0dXJuIG91dHB1dEJ1ZmZlcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgdmFsdWUgb2YgcG9zUmVhZCBhbmQgcG9zV3JpdGUgcG9pbnRlcnMgaW5zaWRlIHRoZSBjaXJjdWxhciBidWZmZXJcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHVwZGF0ZVBvaW50ZXJzKCkge1xuICAgICAgICAvLyBJdCdzIGEgY2lyY3VsYXIgYnVmZmVyLCBzbywgd2hlbiBpdCBpcyBhdCB0aGUgbGFzdCBwb3NpdGlvbiwgdGhlIHBvaW50ZXIgcmV0dXJuIHRvIHRoZSBmaXJzdCBwb3NpdGlvblxuXG4gICAgICAgIC8vIFVwZGF0ZSBwb3NXcml0ZSBwb2ludGVyXG4gICAgICAgIGlmICh0aGlzLnBvc1dyaXRlID09PSAodGhpcy5idWZmZXIubGVuZ3RoIC0gMSkpIHtcbiAgICAgICAgICAgIHRoaXMucG9zV3JpdGUgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wb3NXcml0ZSA9IHRoaXMucG9zV3JpdGUgKyAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIHBvc1JlYWQgcG9pbnRlclxuICAgICAgICBpZiAodGhpcy5wb3NSZWFkID09PSAodGhpcy5idWZmZXIubGVuZ3RoIC0gMSkpIHtcbiAgICAgICAgICAgIHRoaXMucG9zUmVhZCA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBvc1JlYWQgPSB0aGlzLnBvc1JlYWQgKyAxO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIFRoaXJhbiBjb2VmZmljaWVudCAoMXN0IG9yZGVyIFRoaXJhbilcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHVwZGF0ZVRoaXJhbkNvZWZmaWNpZW50KCkge1xuICAgICAgICAvLyBVcGRhdGUgdGhlIGNvZWZmaWNpZW50OiAoMS1EKS8oMStEKSB3aGVyZSBEIGlzIGZyYWN0aW9uYWwgZGVsYXlcbiAgICAgICAgdGhpcy5hMSA9ICgxIC0gdGhpcy5mcmFjRGVsYXkpIC8gKDEgKyB0aGlzLmZyYWNEZWxheSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBwb2ludGVyIHBvc1JlYWQgdmFsdWUgd2hlbiB0aGUgZGVsYXkgdmFsdWUgaXMgY2hhbmdlZFxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgcmVzYW1wbGUoKSB7XG4gICAgICAgIGlmICh0aGlzLnBvc1dyaXRlIC0gdGhpcy5pbnREZWxheSA8IDApIHtcbiAgICAgICAgICAgIHZhciBwb3MgPSB0aGlzLmludERlbGF5IC0gdGhpcy5wb3NXcml0ZTtcbiAgICAgICAgICAgIHRoaXMucG9zUmVhZCA9IHRoaXMuYnVmZmVyLmxlbmd0aCAtIHBvcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucG9zUmVhZCA9IHRoaXMucG9zV3JpdGUgLSB0aGlzLmludERlbGF5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRnJhY3Rpb25hbCBwcm9jZXNzIG1ldGhvZC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSBpbnB1dEJ1ZmZlciBJbnB1dCBBcnJheVxuICAgICAqL1xuICAgIGZyYWN0aW9uYWxUaGlyYW5Qcm9jZXNzKGlucHV0QnVmZmVyKSB7XG4gICAgICAgIHZhciBvdXRwdXRCdWZmZXIgPSBuZXcgRmxvYXQzMkFycmF5KGlucHV0QnVmZmVyLmxlbmd0aCk7XG5cbiAgICAgICAgdmFyIHgsIHk7XG4gICAgICAgIHZhciB4aTEgPSB0aGlzLmZyYWNYaTE7XG4gICAgICAgIHZhciB5aTEgPSB0aGlzLmZyYWNZaTE7XG5cbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dEJ1ZmZlci5sZW5ndGg7IGkgPSBpICsgMSkge1xuICAgICAgICAgICAgLy8gQ3VycmVudCBpbnB1dCBzYW1wbGVcbiAgICAgICAgICAgIHggPSBpbnB1dEJ1ZmZlcltpXTtcblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBvdXRwdXRcbiAgICAgICAgICAgIHkgPSB0aGlzLmExICogeCArIHhpMSAtIHRoaXMuYTEgKiB5aTE7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbWVtb3JpZXNcbiAgICAgICAgICAgIHhpMSA9IHg7XG4gICAgICAgICAgICB5aTEgPSB5O1xuICAgICAgICAgICAgLy8gU2F2ZSB0aGUgb3V0cHV0QnVmZmVyXG4gICAgICAgICAgICBvdXRwdXRCdWZmZXJbaV0gPSB5O1xuXG4gICAgICAgIH1cbiAgICAgICAgLy8gU2F2ZSBtZW1vcmllc1xuICAgICAgICB0aGlzLmZyYWNYaTEgPSB4aTE7XG4gICAgICAgIHRoaXMuZnJhY1lpMSA9IHlpMTtcblxuICAgICAgICByZXR1cm4gb3V0cHV0QnVmZmVyO1xuICAgIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9kaXN0L2ZyYWN0aW9uYWwtZGVsYXknKTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5leHBvcnRzW1wiZGVmYXVsdFwiXSA9IGZ1bmN0aW9uIChpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDb25zdHJ1Y3RvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpO1xuICB9XG59O1xuXG5leHBvcnRzLl9fZXNNb2R1bGUgPSB0cnVlOyIsIlwidXNlIHN0cmljdFwiO1xuXG52YXIgX09iamVjdCRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoXCJiYWJlbC1ydW50aW1lL2NvcmUtanMvb2JqZWN0L2RlZmluZS1wcm9wZXJ0eVwiKVtcImRlZmF1bHRcIl07XG5cbmV4cG9ydHNbXCJkZWZhdWx0XCJdID0gKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG5cbiAgICAgIF9PYmplY3QkZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfTtcbn0pKCk7XG5cbmV4cG9ydHMuX19lc01vZHVsZSA9IHRydWU7IiwidmFyICQgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzLyQnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoaXQsIGtleSwgZGVzYyl7XG4gIHJldHVybiAkLnNldERlc2MoaXQsIGtleSwgZGVzYyk7XG59OyIsInZhciAkT2JqZWN0ID0gT2JqZWN0O1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNyZWF0ZTogICAgICRPYmplY3QuY3JlYXRlLFxuICBnZXRQcm90bzogICAkT2JqZWN0LmdldFByb3RvdHlwZU9mLFxuICBpc0VudW06ICAgICB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZSxcbiAgZ2V0RGVzYzogICAgJE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIHNldERlc2M6ICAgICRPYmplY3QuZGVmaW5lUHJvcGVydHksXG4gIHNldERlc2NzOiAgICRPYmplY3QuZGVmaW5lUHJvcGVydGllcyxcbiAgZ2V0S2V5czogICAgJE9iamVjdC5rZXlzLFxuICBnZXROYW1lczogICAkT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMsXG4gIGdldFN5bWJvbHM6ICRPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzLFxuICBlYWNoOiAgICAgICBbXS5mb3JFYWNoXG59OyIsIi8qKlxuICogQGZpbGVvdmVydmlldyBnbC1tYXRyaXggLSBIaWdoIHBlcmZvcm1hbmNlIG1hdHJpeCBhbmQgdmVjdG9yIG9wZXJhdGlvbnNcbiAqIEBhdXRob3IgQnJhbmRvbiBKb25lc1xuICogQGF1dGhvciBDb2xpbiBNYWNLZW56aWUgSVZcbiAqIEB2ZXJzaW9uIDIuMy4yXG4gKi9cblxuLyogQ29weXJpZ2h0IChjKSAyMDE1LCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS4gKi9cbi8vIEVORCBIRUFERVJcblxuZXhwb3J0cy5nbE1hdHJpeCA9IHJlcXVpcmUoXCIuL2dsLW1hdHJpeC9jb21tb24uanNcIik7XG5leHBvcnRzLm1hdDIgPSByZXF1aXJlKFwiLi9nbC1tYXRyaXgvbWF0Mi5qc1wiKTtcbmV4cG9ydHMubWF0MmQgPSByZXF1aXJlKFwiLi9nbC1tYXRyaXgvbWF0MmQuanNcIik7XG5leHBvcnRzLm1hdDMgPSByZXF1aXJlKFwiLi9nbC1tYXRyaXgvbWF0My5qc1wiKTtcbmV4cG9ydHMubWF0NCA9IHJlcXVpcmUoXCIuL2dsLW1hdHJpeC9tYXQ0LmpzXCIpO1xuZXhwb3J0cy5xdWF0ID0gcmVxdWlyZShcIi4vZ2wtbWF0cml4L3F1YXQuanNcIik7XG5leHBvcnRzLnZlYzIgPSByZXF1aXJlKFwiLi9nbC1tYXRyaXgvdmVjMi5qc1wiKTtcbmV4cG9ydHMudmVjMyA9IHJlcXVpcmUoXCIuL2dsLW1hdHJpeC92ZWMzLmpzXCIpO1xuZXhwb3J0cy52ZWM0ID0gcmVxdWlyZShcIi4vZ2wtbWF0cml4L3ZlYzQuanNcIik7IiwiLyogQ29weXJpZ2h0IChjKSAyMDE1LCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS4gKi9cblxuLyoqXG4gKiBAY2xhc3MgQ29tbW9uIHV0aWxpdGllc1xuICogQG5hbWUgZ2xNYXRyaXhcbiAqL1xudmFyIGdsTWF0cml4ID0ge307XG5cbi8vIENvbmZpZ3VyYXRpb24gQ29uc3RhbnRzXG5nbE1hdHJpeC5FUFNJTE9OID0gMC4wMDAwMDE7XG5nbE1hdHJpeC5BUlJBWV9UWVBFID0gKHR5cGVvZiBGbG9hdDMyQXJyYXkgIT09ICd1bmRlZmluZWQnKSA/IEZsb2F0MzJBcnJheSA6IEFycmF5O1xuZ2xNYXRyaXguUkFORE9NID0gTWF0aC5yYW5kb207XG5nbE1hdHJpeC5FTkFCTEVfU0lNRCA9IGZhbHNlO1xuXG4vLyBDYXBhYmlsaXR5IGRldGVjdGlvblxuZ2xNYXRyaXguU0lNRF9BVkFJTEFCTEUgPSAoZ2xNYXRyaXguQVJSQVlfVFlQRSA9PT0gRmxvYXQzMkFycmF5KSAmJiAoJ1NJTUQnIGluIHRoaXMpO1xuZ2xNYXRyaXguVVNFX1NJTUQgPSBnbE1hdHJpeC5FTkFCTEVfU0lNRCAmJiBnbE1hdHJpeC5TSU1EX0FWQUlMQUJMRTtcblxuLyoqXG4gKiBTZXRzIHRoZSB0eXBlIG9mIGFycmF5IHVzZWQgd2hlbiBjcmVhdGluZyBuZXcgdmVjdG9ycyBhbmQgbWF0cmljZXNcbiAqXG4gKiBAcGFyYW0ge1R5cGV9IHR5cGUgQXJyYXkgdHlwZSwgc3VjaCBhcyBGbG9hdDMyQXJyYXkgb3IgQXJyYXlcbiAqL1xuZ2xNYXRyaXguc2V0TWF0cml4QXJyYXlUeXBlID0gZnVuY3Rpb24odHlwZSkge1xuICAgIGdsTWF0cml4LkFSUkFZX1RZUEUgPSB0eXBlO1xufVxuXG52YXIgZGVncmVlID0gTWF0aC5QSSAvIDE4MDtcblxuLyoqXG4qIENvbnZlcnQgRGVncmVlIFRvIFJhZGlhblxuKlxuKiBAcGFyYW0ge051bWJlcn0gQW5nbGUgaW4gRGVncmVlc1xuKi9cbmdsTWF0cml4LnRvUmFkaWFuID0gZnVuY3Rpb24oYSl7XG4gICAgIHJldHVybiBhICogZGVncmVlO1xufVxuXG4vKipcbiAqIFRlc3RzIHdoZXRoZXIgb3Igbm90IHRoZSBhcmd1bWVudHMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIHZhbHVlLCB3aXRoaW4gYW4gYWJzb2x1dGVcbiAqIG9yIHJlbGF0aXZlIHRvbGVyYW5jZSBvZiBnbE1hdHJpeC5FUFNJTE9OIChhbiBhYnNvbHV0ZSB0b2xlcmFuY2UgaXMgdXNlZCBmb3IgdmFsdWVzIGxlc3MgXG4gKiB0aGFuIG9yIGVxdWFsIHRvIDEuMCwgYW5kIGEgcmVsYXRpdmUgdG9sZXJhbmNlIGlzIHVzZWQgZm9yIGxhcmdlciB2YWx1ZXMpXG4gKiBcbiAqIEBwYXJhbSB7TnVtYmVyfSBhIFRoZSBmaXJzdCBudW1iZXIgdG8gdGVzdC5cbiAqIEBwYXJhbSB7TnVtYmVyfSBiIFRoZSBzZWNvbmQgbnVtYmVyIHRvIHRlc3QuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbnVtYmVycyBhcmUgYXBwcm94aW1hdGVseSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5nbE1hdHJpeC5lcXVhbHMgPSBmdW5jdGlvbihhLCBiKSB7XG5cdHJldHVybiBNYXRoLmFicyhhIC0gYikgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEpLCBNYXRoLmFicyhiKSk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZ2xNYXRyaXg7XG4iLCIvKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEJyYW5kb24gSm9uZXMsIENvbGluIE1hY0tlbnppZSBJVi5cblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuVEhFIFNPRlRXQVJFLiAqL1xuXG52YXIgZ2xNYXRyaXggPSByZXF1aXJlKFwiLi9jb21tb24uanNcIik7XG5cbi8qKlxuICogQGNsYXNzIDJ4MiBNYXRyaXhcbiAqIEBuYW1lIG1hdDJcbiAqL1xudmFyIG1hdDIgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDJcbiAqXG4gKiBAcmV0dXJucyB7bWF0Mn0gYSBuZXcgMngyIG1hdHJpeFxuICovXG5tYXQyLmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgbWF0MiBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gYSBtYXRyaXggdG8gY2xvbmVcbiAqIEByZXR1cm5zIHttYXQyfSBhIG5ldyAyeDIgbWF0cml4XG4gKi9cbm1hdDIuY2xvbmUgPSBmdW5jdGlvbihhKSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIG1hdDIgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xubWF0Mi5jb3B5ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgYSBtYXQyIHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLmlkZW50aXR5ID0gZnVuY3Rpb24ob3V0KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgbWF0MiB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbTAwIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDAgcG9zaXRpb24gKGluZGV4IDApXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXG4gKiBAcGFyYW0ge051bWJlcn0gbTEwIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDAgcG9zaXRpb24gKGluZGV4IDIpXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDMpXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0IEEgbmV3IDJ4MiBtYXRyaXhcbiAqL1xubWF0Mi5mcm9tVmFsdWVzID0gZnVuY3Rpb24obTAwLCBtMDEsIG0xMCwgbTExKSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IG0wMDtcbiAgICBvdXRbMV0gPSBtMDE7XG4gICAgb3V0WzJdID0gbTEwO1xuICAgIG91dFszXSA9IG0xMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSBtYXQyIHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMCBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAwKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0wMSBDb21wb25lbnQgaW4gY29sdW1uIDAsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAxKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMCBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAyKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0xMSBDb21wb25lbnQgaW4gY29sdW1uIDEsIHJvdyAxIHBvc2l0aW9uIChpbmRleCAzKVxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLnNldCA9IGZ1bmN0aW9uKG91dCwgbTAwLCBtMDEsIG0xMCwgbTExKSB7XG4gICAgb3V0WzBdID0gbTAwO1xuICAgIG91dFsxXSA9IG0wMTtcbiAgICBvdXRbMl0gPSBtMTA7XG4gICAgb3V0WzNdID0gbTExO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG5cbi8qKlxuICogVHJhbnNwb3NlIHRoZSB2YWx1ZXMgb2YgYSBtYXQyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLnRyYW5zcG9zZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIC8vIElmIHdlIGFyZSB0cmFuc3Bvc2luZyBvdXJzZWx2ZXMgd2UgY2FuIHNraXAgYSBmZXcgc3RlcHMgYnV0IGhhdmUgdG8gY2FjaGUgc29tZSB2YWx1ZXNcbiAgICBpZiAob3V0ID09PSBhKSB7XG4gICAgICAgIHZhciBhMSA9IGFbMV07XG4gICAgICAgIG91dFsxXSA9IGFbMl07XG4gICAgICAgIG91dFsyXSA9IGExO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG91dFswXSA9IGFbMF07XG4gICAgICAgIG91dFsxXSA9IGFbMl07XG4gICAgICAgIG91dFsyXSA9IGFbMV07XG4gICAgICAgIG91dFszXSA9IGFbM107XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEludmVydHMgYSBtYXQyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLmludmVydCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM10sXG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICAgICAgICBkZXQgPSBhMCAqIGEzIC0gYTIgKiBhMTtcblxuICAgIGlmICghZGV0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBkZXQgPSAxLjAgLyBkZXQ7XG4gICAgXG4gICAgb3V0WzBdID0gIGEzICogZGV0O1xuICAgIG91dFsxXSA9IC1hMSAqIGRldDtcbiAgICBvdXRbMl0gPSAtYTIgKiBkZXQ7XG4gICAgb3V0WzNdID0gIGEwICogZGV0O1xuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgYWRqdWdhdGUgb2YgYSBtYXQyXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLmFkam9pbnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICAvLyBDYWNoaW5nIHRoaXMgdmFsdWUgaXMgbmVzc2VjYXJ5IGlmIG91dCA9PSBhXG4gICAgdmFyIGEwID0gYVswXTtcbiAgICBvdXRbMF0gPSAgYVszXTtcbiAgICBvdXRbMV0gPSAtYVsxXTtcbiAgICBvdXRbMl0gPSAtYVsyXTtcbiAgICBvdXRbM10gPSAgYTA7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRldGVybWluYW50IG9mIGFcbiAqL1xubWF0Mi5kZXRlcm1pbmFudCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuIGFbMF0gKiBhWzNdIC0gYVsyXSAqIGFbMV07XG59O1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDInc1xuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xubWF0Mi5tdWx0aXBseSA9IGZ1bmN0aW9uIChvdXQsIGEsIGIpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdO1xuICAgIHZhciBiMCA9IGJbMF0sIGIxID0gYlsxXSwgYjIgPSBiWzJdLCBiMyA9IGJbM107XG4gICAgb3V0WzBdID0gYTAgKiBiMCArIGEyICogYjE7XG4gICAgb3V0WzFdID0gYTEgKiBiMCArIGEzICogYjE7XG4gICAgb3V0WzJdID0gYTAgKiBiMiArIGEyICogYjM7XG4gICAgb3V0WzNdID0gYTEgKiBiMiArIGEzICogYjM7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQyLm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cbm1hdDIubXVsID0gbWF0Mi5tdWx0aXBseTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0MiBieSB0aGUgZ2l2ZW4gYW5nbGVcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyfSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLnJvdGF0ZSA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM10sXG4gICAgICAgIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgICBjID0gTWF0aC5jb3MocmFkKTtcbiAgICBvdXRbMF0gPSBhMCAqICBjICsgYTIgKiBzO1xuICAgIG91dFsxXSA9IGExICogIGMgKyBhMyAqIHM7XG4gICAgb3V0WzJdID0gYTAgKiAtcyArIGEyICogYztcbiAgICBvdXRbM10gPSBhMSAqIC1zICsgYTMgKiBjO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNjYWxlcyB0aGUgbWF0MiBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7dmVjMn0gdiB0aGUgdmVjMiB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKiovXG5tYXQyLnNjYWxlID0gZnVuY3Rpb24ob3V0LCBhLCB2KSB7XG4gICAgdmFyIGEwID0gYVswXSwgYTEgPSBhWzFdLCBhMiA9IGFbMl0sIGEzID0gYVszXSxcbiAgICAgICAgdjAgPSB2WzBdLCB2MSA9IHZbMV07XG4gICAgb3V0WzBdID0gYTAgKiB2MDtcbiAgICBvdXRbMV0gPSBhMSAqIHYwO1xuICAgIG91dFsyXSA9IGEyICogdjE7XG4gICAgb3V0WzNdID0gYTMgKiB2MTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBnaXZlbiBhbmdsZVxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDIuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0Mi5yb3RhdGUoZGVzdCwgZGVzdCwgcmFkKTtcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG91dCBtYXQyIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLmZyb21Sb3RhdGlvbiA9IGZ1bmN0aW9uKG91dCwgcmFkKSB7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgICBjID0gTWF0aC5jb3MocmFkKTtcbiAgICBvdXRbMF0gPSBjO1xuICAgIG91dFsxXSA9IHM7XG4gICAgb3V0WzJdID0gLXM7XG4gICAgb3V0WzNdID0gYztcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciBzY2FsaW5nXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0Mi5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQyLnNjYWxlKGRlc3QsIGRlc3QsIHZlYyk7XG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgbWF0MiByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHt2ZWMyfSB2IFNjYWxpbmcgdmVjdG9yXG4gKiBAcmV0dXJucyB7bWF0Mn0gb3V0XG4gKi9cbm1hdDIuZnJvbVNjYWxpbmcgPSBmdW5jdGlvbihvdXQsIHYpIHtcbiAgICBvdXRbMF0gPSB2WzBdO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSB2WzFdO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDJcbiAqXG4gKiBAcGFyYW0ge21hdDJ9IG1hdCBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxuICovXG5tYXQyLnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICdtYXQyKCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcsICcgKyBhWzNdICsgJyknO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cbiAqL1xubWF0Mi5mcm9iID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4oTWF0aC5zcXJ0KE1hdGgucG93KGFbMF0sIDIpICsgTWF0aC5wb3coYVsxXSwgMikgKyBNYXRoLnBvdyhhWzJdLCAyKSArIE1hdGgucG93KGFbM10sIDIpKSlcbn07XG5cbi8qKlxuICogUmV0dXJucyBMLCBEIGFuZCBVIG1hdHJpY2VzIChMb3dlciB0cmlhbmd1bGFyLCBEaWFnb25hbCBhbmQgVXBwZXIgdHJpYW5ndWxhcikgYnkgZmFjdG9yaXppbmcgdGhlIGlucHV0IG1hdHJpeFxuICogQHBhcmFtIHttYXQyfSBMIHRoZSBsb3dlciB0cmlhbmd1bGFyIG1hdHJpeCBcbiAqIEBwYXJhbSB7bWF0Mn0gRCB0aGUgZGlhZ29uYWwgbWF0cml4IFxuICogQHBhcmFtIHttYXQyfSBVIHRoZSB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeCBcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgaW5wdXQgbWF0cml4IHRvIGZhY3Rvcml6ZVxuICovXG5cbm1hdDIuTERVID0gZnVuY3Rpb24gKEwsIEQsIFUsIGEpIHsgXG4gICAgTFsyXSA9IGFbMl0vYVswXTsgXG4gICAgVVswXSA9IGFbMF07IFxuICAgIFVbMV0gPSBhWzFdOyBcbiAgICBVWzNdID0gYVszXSAtIExbMl0gKiBVWzFdOyBcbiAgICByZXR1cm4gW0wsIEQsIFVdOyAgICAgICBcbn07IFxuXG4vKipcbiAqIEFkZHMgdHdvIG1hdDInc1xuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xubWF0Mi5hZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTdWJ0cmFjdHMgbWF0cml4IGIgZnJvbSBtYXRyaXggYVxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0Mn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xubWF0Mi5zdWJ0cmFjdCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICAgIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICAgIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0Mi5zdWJ0cmFjdH1cbiAqIEBmdW5jdGlvblxuICovXG5tYXQyLnN1YiA9IG1hdDIuc3VidHJhY3Q7XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gYSBUaGUgZmlyc3QgbWF0cml4LlxuICogQHBhcmFtIHttYXQyfSBiIFRoZSBzZWNvbmQgbWF0cml4LlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5tYXQyLmV4YWN0RXF1YWxzID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl0gJiYgYVszXSA9PT0gYlszXTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gYSBUaGUgZmlyc3QgbWF0cml4LlxuICogQHBhcmFtIHttYXQyfSBiIFRoZSBzZWNvbmQgbWF0cml4LlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5tYXQyLmVxdWFscyA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIGEwID0gYVswXSwgYTEgPSBhWzFdLCBhMiA9IGFbMl0sIGEzID0gYVszXTtcbiAgICB2YXIgYjAgPSBiWzBdLCBiMSA9IGJbMV0sIGIyID0gYlsyXSwgYjMgPSBiWzNdO1xuICAgIHJldHVybiAoTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTMgLSBiMykgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKSk7XG59O1xuXG4vKipcbiAqIE11bHRpcGx5IGVhY2ggZWxlbWVudCBvZiB0aGUgbWF0cml4IGJ5IGEgc2NhbGFyLlxuICpcbiAqIEBwYXJhbSB7bWF0Mn0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJ9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBtYXRyaXgncyBlbGVtZW50cyBieVxuICogQHJldHVybnMge21hdDJ9IG91dFxuICovXG5tYXQyLm11bHRpcGx5U2NhbGFyID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAqIGI7XG4gICAgb3V0WzFdID0gYVsxXSAqIGI7XG4gICAgb3V0WzJdID0gYVsyXSAqIGI7XG4gICAgb3V0WzNdID0gYVszXSAqIGI7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWRkcyB0d28gbWF0MidzIGFmdGVyIG11bHRpcGx5aW5nIGVhY2ggZWxlbWVudCBvZiB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWUuXG4gKlxuICogQHBhcmFtIHttYXQyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7bWF0Mn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHttYXQyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYidzIGVsZW1lbnRzIGJ5IGJlZm9yZSBhZGRpbmdcbiAqIEByZXR1cm5zIHttYXQyfSBvdXRcbiAqL1xubWF0Mi5tdWx0aXBseVNjYWxhckFuZEFkZCA9IGZ1bmN0aW9uKG91dCwgYSwgYiwgc2NhbGUpIHtcbiAgICBvdXRbMF0gPSBhWzBdICsgKGJbMF0gKiBzY2FsZSk7XG4gICAgb3V0WzFdID0gYVsxXSArIChiWzFdICogc2NhbGUpO1xuICAgIG91dFsyXSA9IGFbMl0gKyAoYlsyXSAqIHNjYWxlKTtcbiAgICBvdXRbM10gPSBhWzNdICsgKGJbM10gKiBzY2FsZSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gbWF0MjtcbiIsIi8qIENvcHlyaWdodCAoYykgMjAxNSwgQnJhbmRvbiBKb25lcywgQ29saW4gTWFjS2VuemllIElWLlxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG5hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG5USEUgU09GVFdBUkUuICovXG5cbnZhciBnbE1hdHJpeCA9IHJlcXVpcmUoXCIuL2NvbW1vbi5qc1wiKTtcblxuLyoqXG4gKiBAY2xhc3MgMngzIE1hdHJpeFxuICogQG5hbWUgbWF0MmRcbiAqIFxuICogQGRlc2NyaXB0aW9uIFxuICogQSBtYXQyZCBjb250YWlucyBzaXggZWxlbWVudHMgZGVmaW5lZCBhczpcbiAqIDxwcmU+XG4gKiBbYSwgYywgdHgsXG4gKiAgYiwgZCwgdHldXG4gKiA8L3ByZT5cbiAqIFRoaXMgaXMgYSBzaG9ydCBmb3JtIGZvciB0aGUgM3gzIG1hdHJpeDpcbiAqIDxwcmU+XG4gKiBbYSwgYywgdHgsXG4gKiAgYiwgZCwgdHksXG4gKiAgMCwgMCwgMV1cbiAqIDwvcHJlPlxuICogVGhlIGxhc3Qgcm93IGlzIGlnbm9yZWQgc28gdGhlIGFycmF5IGlzIHNob3J0ZXIgYW5kIG9wZXJhdGlvbnMgYXJlIGZhc3Rlci5cbiAqL1xudmFyIG1hdDJkID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBtYXQyZFxuICpcbiAqIEByZXR1cm5zIHttYXQyZH0gYSBuZXcgMngzIG1hdHJpeFxuICovXG5tYXQyZC5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNik7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMTtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBtYXQyZCBpbml0aWFsaXplZCB3aXRoIHZhbHVlcyBmcm9tIGFuIGV4aXN0aW5nIG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IGEgbWF0cml4IHRvIGNsb25lXG4gKiBAcmV0dXJucyB7bWF0MmR9IGEgbmV3IDJ4MyBtYXRyaXhcbiAqL1xubWF0MmQuY2xvbmUgPSBmdW5jdGlvbihhKSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDYpO1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgb3V0WzRdID0gYVs0XTtcbiAgICBvdXRbNV0gPSBhWzVdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSBtYXQyZCB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5tYXQyZC5jb3B5ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICBvdXRbNF0gPSBhWzRdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2V0IGEgbWF0MmQgdG8gdGhlIGlkZW50aXR5IG1hdHJpeFxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xubWF0MmQuaWRlbnRpdHkgPSBmdW5jdGlvbihvdXQpIHtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAxO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgbWF0MmQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IGEgQ29tcG9uZW50IEEgKGluZGV4IDApXG4gKiBAcGFyYW0ge051bWJlcn0gYiBDb21wb25lbnQgQiAoaW5kZXggMSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBjIENvbXBvbmVudCBDIChpbmRleCAyKVxuICogQHBhcmFtIHtOdW1iZXJ9IGQgQ29tcG9uZW50IEQgKGluZGV4IDMpXG4gKiBAcGFyYW0ge051bWJlcn0gdHggQ29tcG9uZW50IFRYIChpbmRleCA0KVxuICogQHBhcmFtIHtOdW1iZXJ9IHR5IENvbXBvbmVudCBUWSAoaW5kZXggNSlcbiAqIEByZXR1cm5zIHttYXQyZH0gQSBuZXcgbWF0MmRcbiAqL1xubWF0MmQuZnJvbVZhbHVlcyA9IGZ1bmN0aW9uKGEsIGIsIGMsIGQsIHR4LCB0eSkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg2KTtcbiAgICBvdXRbMF0gPSBhO1xuICAgIG91dFsxXSA9IGI7XG4gICAgb3V0WzJdID0gYztcbiAgICBvdXRbM10gPSBkO1xuICAgIG91dFs0XSA9IHR4O1xuICAgIG91dFs1XSA9IHR5O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIG1hdDJkIHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7TnVtYmVyfSBhIENvbXBvbmVudCBBIChpbmRleCAwKVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgQ29tcG9uZW50IEIgKGluZGV4IDEpXG4gKiBAcGFyYW0ge051bWJlcn0gYyBDb21wb25lbnQgQyAoaW5kZXggMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBkIENvbXBvbmVudCBEIChpbmRleCAzKVxuICogQHBhcmFtIHtOdW1iZXJ9IHR4IENvbXBvbmVudCBUWCAoaW5kZXggNClcbiAqIEBwYXJhbSB7TnVtYmVyfSB0eSBDb21wb25lbnQgVFkgKGluZGV4IDUpXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5tYXQyZC5zZXQgPSBmdW5jdGlvbihvdXQsIGEsIGIsIGMsIGQsIHR4LCB0eSkge1xuICAgIG91dFswXSA9IGE7XG4gICAgb3V0WzFdID0gYjtcbiAgICBvdXRbMl0gPSBjO1xuICAgIG91dFszXSA9IGQ7XG4gICAgb3V0WzRdID0gdHg7XG4gICAgb3V0WzVdID0gdHk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogSW52ZXJ0cyBhIG1hdDJkXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5tYXQyZC5pbnZlcnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgYWEgPSBhWzBdLCBhYiA9IGFbMV0sIGFjID0gYVsyXSwgYWQgPSBhWzNdLFxuICAgICAgICBhdHggPSBhWzRdLCBhdHkgPSBhWzVdO1xuXG4gICAgdmFyIGRldCA9IGFhICogYWQgLSBhYiAqIGFjO1xuICAgIGlmKCFkZXQpe1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZGV0ID0gMS4wIC8gZGV0O1xuXG4gICAgb3V0WzBdID0gYWQgKiBkZXQ7XG4gICAgb3V0WzFdID0gLWFiICogZGV0O1xuICAgIG91dFsyXSA9IC1hYyAqIGRldDtcbiAgICBvdXRbM10gPSBhYSAqIGRldDtcbiAgICBvdXRbNF0gPSAoYWMgKiBhdHkgLSBhZCAqIGF0eCkgKiBkZXQ7XG4gICAgb3V0WzVdID0gKGFiICogYXR4IC0gYWEgKiBhdHkpICogZGV0O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0MmRcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkZXRlcm1pbmFudCBvZiBhXG4gKi9cbm1hdDJkLmRldGVybWluYW50ID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gYVswXSAqIGFbM10gLSBhWzFdICogYVsyXTtcbn07XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gbWF0MmQnc1xuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHttYXQyZH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cbm1hdDJkLm11bHRpcGx5ID0gZnVuY3Rpb24gKG91dCwgYSwgYikge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM10sIGE0ID0gYVs0XSwgYTUgPSBhWzVdLFxuICAgICAgICBiMCA9IGJbMF0sIGIxID0gYlsxXSwgYjIgPSBiWzJdLCBiMyA9IGJbM10sIGI0ID0gYls0XSwgYjUgPSBiWzVdO1xuICAgIG91dFswXSA9IGEwICogYjAgKyBhMiAqIGIxO1xuICAgIG91dFsxXSA9IGExICogYjAgKyBhMyAqIGIxO1xuICAgIG91dFsyXSA9IGEwICogYjIgKyBhMiAqIGIzO1xuICAgIG91dFszXSA9IGExICogYjIgKyBhMyAqIGIzO1xuICAgIG91dFs0XSA9IGEwICogYjQgKyBhMiAqIGI1ICsgYTQ7XG4gICAgb3V0WzVdID0gYTEgKiBiNCArIGEzICogYjUgKyBhNTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDJkLm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cbm1hdDJkLm11bCA9IG1hdDJkLm11bHRpcGx5O1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXQyZCBieSB0aGUgZ2l2ZW4gYW5nbGVcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5tYXQyZC5yb3RhdGUgPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLCBhNCA9IGFbNF0sIGE1ID0gYVs1XSxcbiAgICAgICAgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuICAgIG91dFswXSA9IGEwICogIGMgKyBhMiAqIHM7XG4gICAgb3V0WzFdID0gYTEgKiAgYyArIGEzICogcztcbiAgICBvdXRbMl0gPSBhMCAqIC1zICsgYTIgKiBjO1xuICAgIG91dFszXSA9IGExICogLXMgKyBhMyAqIGM7XG4gICAgb3V0WzRdID0gYTQ7XG4gICAgb3V0WzVdID0gYTU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2NhbGVzIHRoZSBtYXQyZCBieSB0aGUgZGltZW5zaW9ucyBpbiB0aGUgZ2l2ZW4gdmVjMlxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxuICogQHBhcmFtIHt2ZWMyfSB2IHRoZSB2ZWMyIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKiovXG5tYXQyZC5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgdikge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM10sIGE0ID0gYVs0XSwgYTUgPSBhWzVdLFxuICAgICAgICB2MCA9IHZbMF0sIHYxID0gdlsxXTtcbiAgICBvdXRbMF0gPSBhMCAqIHYwO1xuICAgIG91dFsxXSA9IGExICogdjA7XG4gICAgb3V0WzJdID0gYTIgKiB2MTtcbiAgICBvdXRbM10gPSBhMyAqIHYxO1xuICAgIG91dFs0XSA9IGE0O1xuICAgIG91dFs1XSA9IGE1O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zbGF0ZXMgdGhlIG1hdDJkIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge3ZlYzJ9IHYgdGhlIHZlYzIgdG8gdHJhbnNsYXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKiovXG5tYXQyZC50cmFuc2xhdGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLCBhNCA9IGFbNF0sIGE1ID0gYVs1XSxcbiAgICAgICAgdjAgPSB2WzBdLCB2MSA9IHZbMV07XG4gICAgb3V0WzBdID0gYTA7XG4gICAgb3V0WzFdID0gYTE7XG4gICAgb3V0WzJdID0gYTI7XG4gICAgb3V0WzNdID0gYTM7XG4gICAgb3V0WzRdID0gYTAgKiB2MCArIGEyICogdjEgKyBhNDtcbiAgICBvdXRbNV0gPSBhMSAqIHYwICsgYTMgKiB2MSArIGE1O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIGdpdmVuIGFuZ2xlXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0MmQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0MmQucm90YXRlKGRlc3QsIGRlc3QsIHJhZCk7XG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IG1hdDJkIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xubWF0MmQuZnJvbVJvdGF0aW9uID0gZnVuY3Rpb24ob3V0LCByYWQpIHtcbiAgICB2YXIgcyA9IE1hdGguc2luKHJhZCksIGMgPSBNYXRoLmNvcyhyYWQpO1xuICAgIG91dFswXSA9IGM7XG4gICAgb3V0WzFdID0gcztcbiAgICBvdXRbMl0gPSAtcztcbiAgICBvdXRbM10gPSBjO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMDtcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciBzY2FsaW5nXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0MmQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0MmQuc2NhbGUoZGVzdCwgZGVzdCwgdmVjKTtcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgbWF0MmQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7dmVjMn0gdiBTY2FsaW5nIHZlY3RvclxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xubWF0MmQuZnJvbVNjYWxpbmcgPSBmdW5jdGlvbihvdXQsIHYpIHtcbiAgICBvdXRbMF0gPSB2WzBdO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSB2WzFdO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMDtcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciB0cmFuc2xhdGlvblxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDJkLmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDJkLnRyYW5zbGF0ZShkZXN0LCBkZXN0LCB2ZWMpO1xuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCBtYXQyZCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHt2ZWMyfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xubWF0MmQuZnJvbVRyYW5zbGF0aW9uID0gZnVuY3Rpb24ob3V0LCB2KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMTtcbiAgICBvdXRbNF0gPSB2WzBdO1xuICAgIG91dFs1XSA9IHZbMV07XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgbWF0MmRcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBhIG1hdHJpeCB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWF0cml4XG4gKi9cbm1hdDJkLnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICdtYXQyZCgnICsgYVswXSArICcsICcgKyBhWzFdICsgJywgJyArIGFbMl0gKyAnLCAnICsgXG4gICAgICAgICAgICAgICAgICAgIGFbM10gKyAnLCAnICsgYVs0XSArICcsICcgKyBhWzVdICsgJyknO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0MmRcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBtYXRyaXggdG8gY2FsY3VsYXRlIEZyb2Jlbml1cyBub3JtIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBGcm9iZW5pdXMgbm9ybVxuICovXG5tYXQyZC5mcm9iID0gZnVuY3Rpb24gKGEpIHsgXG4gICAgcmV0dXJuKE1hdGguc3FydChNYXRoLnBvdyhhWzBdLCAyKSArIE1hdGgucG93KGFbMV0sIDIpICsgTWF0aC5wb3coYVsyXSwgMikgKyBNYXRoLnBvdyhhWzNdLCAyKSArIE1hdGgucG93KGFbNF0sIDIpICsgTWF0aC5wb3coYVs1XSwgMikgKyAxKSlcbn07IFxuXG4vKipcbiAqIEFkZHMgdHdvIG1hdDJkJ3NcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0MmR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7bWF0MmR9IG91dFxuICovXG5tYXQyZC5hZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgICBvdXRbNF0gPSBhWzRdICsgYls0XTtcbiAgICBvdXRbNV0gPSBhWzVdICsgYls1XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTdWJ0cmFjdHMgbWF0cml4IGIgZnJvbSBtYXRyaXggYVxuICpcbiAqIEBwYXJhbSB7bWF0MmR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQyZH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHttYXQyZH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cbm1hdDJkLnN1YnRyYWN0ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gICAgb3V0WzNdID0gYVszXSAtIGJbM107XG4gICAgb3V0WzRdID0gYVs0XSAtIGJbNF07XG4gICAgb3V0WzVdID0gYVs1XSAtIGJbNV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQyZC5zdWJ0cmFjdH1cbiAqIEBmdW5jdGlvblxuICovXG5tYXQyZC5zdWIgPSBtYXQyZC5zdWJ0cmFjdDtcblxuLyoqXG4gKiBNdWx0aXBseSBlYWNoIGVsZW1lbnQgb2YgdGhlIG1hdHJpeCBieSBhIHNjYWxhci5cbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSBtYXRyaXgncyBlbGVtZW50cyBieVxuICogQHJldHVybnMge21hdDJkfSBvdXRcbiAqL1xubWF0MmQubXVsdGlwbHlTY2FsYXIgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICogYjtcbiAgICBvdXRbMV0gPSBhWzFdICogYjtcbiAgICBvdXRbMl0gPSBhWzJdICogYjtcbiAgICBvdXRbM10gPSBhWzNdICogYjtcbiAgICBvdXRbNF0gPSBhWzRdICogYjtcbiAgICBvdXRbNV0gPSBhWzVdICogYjtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBZGRzIHR3byBtYXQyZCdzIGFmdGVyIG11bHRpcGx5aW5nIGVhY2ggZWxlbWVudCBvZiB0aGUgc2Vjb25kIG9wZXJhbmQgYnkgYSBzY2FsYXIgdmFsdWUuXG4gKlxuICogQHBhcmFtIHttYXQyZH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge21hdDJkfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge21hdDJkfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHNjYWxlIHRoZSBhbW91bnQgdG8gc2NhbGUgYidzIGVsZW1lbnRzIGJ5IGJlZm9yZSBhZGRpbmdcbiAqIEByZXR1cm5zIHttYXQyZH0gb3V0XG4gKi9cbm1hdDJkLm11bHRpcGx5U2NhbGFyQW5kQWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiLCBzY2FsZSkge1xuICAgIG91dFswXSA9IGFbMF0gKyAoYlswXSAqIHNjYWxlKTtcbiAgICBvdXRbMV0gPSBhWzFdICsgKGJbMV0gKiBzY2FsZSk7XG4gICAgb3V0WzJdID0gYVsyXSArIChiWzJdICogc2NhbGUpO1xuICAgIG91dFszXSA9IGFbM10gKyAoYlszXSAqIHNjYWxlKTtcbiAgICBvdXRbNF0gPSBhWzRdICsgKGJbNF0gKiBzY2FsZSk7XG4gICAgb3V0WzVdID0gYVs1XSArIChiWzVdICogc2NhbGUpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcbiAqXG4gKiBAcGFyYW0ge21hdDJkfSBhIFRoZSBmaXJzdCBtYXRyaXguXG4gKiBAcGFyYW0ge21hdDJkfSBiIFRoZSBzZWNvbmQgbWF0cml4LlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5tYXQyZC5leGFjdEVxdWFscyA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGFbMF0gPT09IGJbMF0gJiYgYVsxXSA9PT0gYlsxXSAmJiBhWzJdID09PSBiWzJdICYmIGFbM10gPT09IGJbM10gJiYgYVs0XSA9PT0gYls0XSAmJiBhWzVdID09PSBiWzVdO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIHttYXQyZH0gYSBUaGUgZmlyc3QgbWF0cml4LlxuICogQHBhcmFtIHttYXQyZH0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xubWF0MmQuZXF1YWxzID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLCBhNCA9IGFbNF0sIGE1ID0gYVs1XTtcbiAgICB2YXIgYjAgPSBiWzBdLCBiMSA9IGJbMV0sIGIyID0gYlsyXSwgYjMgPSBiWzNdLCBiNCA9IGJbNF0sIGI1ID0gYls1XTtcbiAgICByZXR1cm4gKE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGE0IC0gYjQpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNCksIE1hdGguYWJzKGI0KSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGE1IC0gYjUpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNSksIE1hdGguYWJzKGI1KSkpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBtYXQyZDtcbiIsIi8qIENvcHlyaWdodCAoYykgMjAxNSwgQnJhbmRvbiBKb25lcywgQ29saW4gTWFjS2VuemllIElWLlxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG5hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG5USEUgU09GVFdBUkUuICovXG5cbnZhciBnbE1hdHJpeCA9IHJlcXVpcmUoXCIuL2NvbW1vbi5qc1wiKTtcblxuLyoqXG4gKiBAY2xhc3MgM3gzIE1hdHJpeFxuICogQG5hbWUgbWF0M1xuICovXG52YXIgbWF0MyA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgaWRlbnRpdHkgbWF0M1xuICpcbiAqIEByZXR1cm5zIHttYXQzfSBhIG5ldyAzeDMgbWF0cml4XG4gKi9cbm1hdDMuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDkpO1xuICAgIG91dFswXSA9IDE7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMTtcbiAgICBvdXRbNV0gPSAwO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENvcGllcyB0aGUgdXBwZXItbGVmdCAzeDMgdmFsdWVzIGludG8gdGhlIGdpdmVuIG1hdDMuXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyAzeDMgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgICB0aGUgc291cmNlIDR4NCBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My5mcm9tTWF0NCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbNF07XG4gICAgb3V0WzRdID0gYVs1XTtcbiAgICBvdXRbNV0gPSBhWzZdO1xuICAgIG91dFs2XSA9IGFbOF07XG4gICAgb3V0WzddID0gYVs5XTtcbiAgICBvdXRbOF0gPSBhWzEwXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDMgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDN9IGEgbWF0cml4IHRvIGNsb25lXG4gKiBAcmV0dXJucyB7bWF0M30gYSBuZXcgM3gzIG1hdHJpeFxuICovXG5tYXQzLmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg5KTtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0MyB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLmNvcHkgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBuZXcgbWF0MyB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbTAwIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDAgcG9zaXRpb24gKGluZGV4IDApXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXG4gKiBAcGFyYW0ge051bWJlcn0gbTAyIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDIgcG9zaXRpb24gKGluZGV4IDIpXG4gKiBAcGFyYW0ge051bWJlcn0gbTEwIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDAgcG9zaXRpb24gKGluZGV4IDMpXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDQpXG4gKiBAcGFyYW0ge051bWJlcn0gbTEyIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDIgcG9zaXRpb24gKGluZGV4IDUpXG4gKiBAcGFyYW0ge051bWJlcn0gbTIwIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDAgcG9zaXRpb24gKGluZGV4IDYpXG4gKiBAcGFyYW0ge051bWJlcn0gbTIxIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDEgcG9zaXRpb24gKGluZGV4IDcpXG4gKiBAcGFyYW0ge051bWJlcn0gbTIyIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDIgcG9zaXRpb24gKGluZGV4IDgpXG4gKiBAcmV0dXJucyB7bWF0M30gQSBuZXcgbWF0M1xuICovXG5tYXQzLmZyb21WYWx1ZXMgPSBmdW5jdGlvbihtMDAsIG0wMSwgbTAyLCBtMTAsIG0xMSwgbTEyLCBtMjAsIG0yMSwgbTIyKSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDkpO1xuICAgIG91dFswXSA9IG0wMDtcbiAgICBvdXRbMV0gPSBtMDE7XG4gICAgb3V0WzJdID0gbTAyO1xuICAgIG91dFszXSA9IG0xMDtcbiAgICBvdXRbNF0gPSBtMTE7XG4gICAgb3V0WzVdID0gbTEyO1xuICAgIG91dFs2XSA9IG0yMDtcbiAgICBvdXRbN10gPSBtMjE7XG4gICAgb3V0WzhdID0gbTIyO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIG1hdDMgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge051bWJlcn0gbTAwIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDAgcG9zaXRpb24gKGluZGV4IDApXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXG4gKiBAcGFyYW0ge051bWJlcn0gbTAyIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDIgcG9zaXRpb24gKGluZGV4IDIpXG4gKiBAcGFyYW0ge051bWJlcn0gbTEwIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDAgcG9zaXRpb24gKGluZGV4IDMpXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDQpXG4gKiBAcGFyYW0ge051bWJlcn0gbTEyIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDIgcG9zaXRpb24gKGluZGV4IDUpXG4gKiBAcGFyYW0ge051bWJlcn0gbTIwIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDAgcG9zaXRpb24gKGluZGV4IDYpXG4gKiBAcGFyYW0ge051bWJlcn0gbTIxIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDEgcG9zaXRpb24gKGluZGV4IDcpXG4gKiBAcGFyYW0ge051bWJlcn0gbTIyIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDIgcG9zaXRpb24gKGluZGV4IDgpXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMuc2V0ID0gZnVuY3Rpb24ob3V0LCBtMDAsIG0wMSwgbTAyLCBtMTAsIG0xMSwgbTEyLCBtMjAsIG0yMSwgbTIyKSB7XG4gICAgb3V0WzBdID0gbTAwO1xuICAgIG91dFsxXSA9IG0wMTtcbiAgICBvdXRbMl0gPSBtMDI7XG4gICAgb3V0WzNdID0gbTEwO1xuICAgIG91dFs0XSA9IG0xMTtcbiAgICBvdXRbNV0gPSBtMTI7XG4gICAgb3V0WzZdID0gbTIwO1xuICAgIG91dFs3XSA9IG0yMTtcbiAgICBvdXRbOF0gPSBtMjI7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2V0IGEgbWF0MyB0byB0aGUgaWRlbnRpdHkgbWF0cml4XG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My5pZGVudGl0eSA9IGZ1bmN0aW9uKG91dCkge1xuICAgIG91dFswXSA9IDE7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMTtcbiAgICBvdXRbNV0gPSAwO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zcG9zZSB0aGUgdmFsdWVzIG9mIGEgbWF0M1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My50cmFuc3Bvc2UgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICAvLyBJZiB3ZSBhcmUgdHJhbnNwb3Npbmcgb3Vyc2VsdmVzIHdlIGNhbiBza2lwIGEgZmV3IHN0ZXBzIGJ1dCBoYXZlIHRvIGNhY2hlIHNvbWUgdmFsdWVzXG4gICAgaWYgKG91dCA9PT0gYSkge1xuICAgICAgICB2YXIgYTAxID0gYVsxXSwgYTAyID0gYVsyXSwgYTEyID0gYVs1XTtcbiAgICAgICAgb3V0WzFdID0gYVszXTtcbiAgICAgICAgb3V0WzJdID0gYVs2XTtcbiAgICAgICAgb3V0WzNdID0gYTAxO1xuICAgICAgICBvdXRbNV0gPSBhWzddO1xuICAgICAgICBvdXRbNl0gPSBhMDI7XG4gICAgICAgIG91dFs3XSA9IGExMjtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvdXRbMF0gPSBhWzBdO1xuICAgICAgICBvdXRbMV0gPSBhWzNdO1xuICAgICAgICBvdXRbMl0gPSBhWzZdO1xuICAgICAgICBvdXRbM10gPSBhWzFdO1xuICAgICAgICBvdXRbNF0gPSBhWzRdO1xuICAgICAgICBvdXRbNV0gPSBhWzddO1xuICAgICAgICBvdXRbNl0gPSBhWzJdO1xuICAgICAgICBvdXRbN10gPSBhWzVdO1xuICAgICAgICBvdXRbOF0gPSBhWzhdO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBJbnZlcnRzIGEgbWF0M1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My5pbnZlcnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSxcbiAgICAgICAgYTEwID0gYVszXSwgYTExID0gYVs0XSwgYTEyID0gYVs1XSxcbiAgICAgICAgYTIwID0gYVs2XSwgYTIxID0gYVs3XSwgYTIyID0gYVs4XSxcblxuICAgICAgICBiMDEgPSBhMjIgKiBhMTEgLSBhMTIgKiBhMjEsXG4gICAgICAgIGIxMSA9IC1hMjIgKiBhMTAgKyBhMTIgKiBhMjAsXG4gICAgICAgIGIyMSA9IGEyMSAqIGExMCAtIGExMSAqIGEyMCxcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG4gICAgICAgIGRldCA9IGEwMCAqIGIwMSArIGEwMSAqIGIxMSArIGEwMiAqIGIyMTtcblxuICAgIGlmICghZGV0KSB7IFxuICAgICAgICByZXR1cm4gbnVsbDsgXG4gICAgfVxuICAgIGRldCA9IDEuMCAvIGRldDtcblxuICAgIG91dFswXSA9IGIwMSAqIGRldDtcbiAgICBvdXRbMV0gPSAoLWEyMiAqIGEwMSArIGEwMiAqIGEyMSkgKiBkZXQ7XG4gICAgb3V0WzJdID0gKGExMiAqIGEwMSAtIGEwMiAqIGExMSkgKiBkZXQ7XG4gICAgb3V0WzNdID0gYjExICogZGV0O1xuICAgIG91dFs0XSA9IChhMjIgKiBhMDAgLSBhMDIgKiBhMjApICogZGV0O1xuICAgIG91dFs1XSA9ICgtYTEyICogYTAwICsgYTAyICogYTEwKSAqIGRldDtcbiAgICBvdXRbNl0gPSBiMjEgKiBkZXQ7XG4gICAgb3V0WzddID0gKC1hMjEgKiBhMDAgKyBhMDEgKiBhMjApICogZGV0O1xuICAgIG91dFs4XSA9IChhMTEgKiBhMDAgLSBhMDEgKiBhMTApICogZGV0O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGFkanVnYXRlIG9mIGEgbWF0M1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My5hZGpvaW50ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sXG4gICAgICAgIGExMCA9IGFbM10sIGExMSA9IGFbNF0sIGExMiA9IGFbNV0sXG4gICAgICAgIGEyMCA9IGFbNl0sIGEyMSA9IGFbN10sIGEyMiA9IGFbOF07XG5cbiAgICBvdXRbMF0gPSAoYTExICogYTIyIC0gYTEyICogYTIxKTtcbiAgICBvdXRbMV0gPSAoYTAyICogYTIxIC0gYTAxICogYTIyKTtcbiAgICBvdXRbMl0gPSAoYTAxICogYTEyIC0gYTAyICogYTExKTtcbiAgICBvdXRbM10gPSAoYTEyICogYTIwIC0gYTEwICogYTIyKTtcbiAgICBvdXRbNF0gPSAoYTAwICogYTIyIC0gYTAyICogYTIwKTtcbiAgICBvdXRbNV0gPSAoYTAyICogYTEwIC0gYTAwICogYTEyKTtcbiAgICBvdXRbNl0gPSAoYTEwICogYTIxIC0gYTExICogYTIwKTtcbiAgICBvdXRbN10gPSAoYTAxICogYTIwIC0gYTAwICogYTIxKTtcbiAgICBvdXRbOF0gPSAoYTAwICogYTExIC0gYTAxICogYTEwKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkZXRlcm1pbmFudCBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRldGVybWluYW50IG9mIGFcbiAqL1xubWF0My5kZXRlcm1pbmFudCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sXG4gICAgICAgIGExMCA9IGFbM10sIGExMSA9IGFbNF0sIGExMiA9IGFbNV0sXG4gICAgICAgIGEyMCA9IGFbNl0sIGEyMSA9IGFbN10sIGEyMiA9IGFbOF07XG5cbiAgICByZXR1cm4gYTAwICogKGEyMiAqIGExMSAtIGExMiAqIGEyMSkgKyBhMDEgKiAoLWEyMiAqIGExMCArIGExMiAqIGEyMCkgKyBhMDIgKiAoYTIxICogYTEwIC0gYTExICogYTIwKTtcbn07XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gbWF0MydzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHttYXQzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLm11bHRpcGx5ID0gZnVuY3Rpb24gKG91dCwgYSwgYikge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLFxuICAgICAgICBhMTAgPSBhWzNdLCBhMTEgPSBhWzRdLCBhMTIgPSBhWzVdLFxuICAgICAgICBhMjAgPSBhWzZdLCBhMjEgPSBhWzddLCBhMjIgPSBhWzhdLFxuXG4gICAgICAgIGIwMCA9IGJbMF0sIGIwMSA9IGJbMV0sIGIwMiA9IGJbMl0sXG4gICAgICAgIGIxMCA9IGJbM10sIGIxMSA9IGJbNF0sIGIxMiA9IGJbNV0sXG4gICAgICAgIGIyMCA9IGJbNl0sIGIyMSA9IGJbN10sIGIyMiA9IGJbOF07XG5cbiAgICBvdXRbMF0gPSBiMDAgKiBhMDAgKyBiMDEgKiBhMTAgKyBiMDIgKiBhMjA7XG4gICAgb3V0WzFdID0gYjAwICogYTAxICsgYjAxICogYTExICsgYjAyICogYTIxO1xuICAgIG91dFsyXSA9IGIwMCAqIGEwMiArIGIwMSAqIGExMiArIGIwMiAqIGEyMjtcblxuICAgIG91dFszXSA9IGIxMCAqIGEwMCArIGIxMSAqIGExMCArIGIxMiAqIGEyMDtcbiAgICBvdXRbNF0gPSBiMTAgKiBhMDEgKyBiMTEgKiBhMTEgKyBiMTIgKiBhMjE7XG4gICAgb3V0WzVdID0gYjEwICogYTAyICsgYjExICogYTEyICsgYjEyICogYTIyO1xuXG4gICAgb3V0WzZdID0gYjIwICogYTAwICsgYjIxICogYTEwICsgYjIyICogYTIwO1xuICAgIG91dFs3XSA9IGIyMCAqIGEwMSArIGIyMSAqIGExMSArIGIyMiAqIGEyMTtcbiAgICBvdXRbOF0gPSBiMjAgKiBhMDIgKyBiMjEgKiBhMTIgKyBiMjIgKiBhMjI7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBtYXQzLm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cbm1hdDMubXVsID0gbWF0My5tdWx0aXBseTtcblxuLyoqXG4gKiBUcmFuc2xhdGUgYSBtYXQzIGJ5IHRoZSBnaXZlbiB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge3ZlYzJ9IHYgdmVjdG9yIHRvIHRyYW5zbGF0ZSBieVxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKG91dCwgYSwgdikge1xuICAgIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLFxuICAgICAgICBhMTAgPSBhWzNdLCBhMTEgPSBhWzRdLCBhMTIgPSBhWzVdLFxuICAgICAgICBhMjAgPSBhWzZdLCBhMjEgPSBhWzddLCBhMjIgPSBhWzhdLFxuICAgICAgICB4ID0gdlswXSwgeSA9IHZbMV07XG5cbiAgICBvdXRbMF0gPSBhMDA7XG4gICAgb3V0WzFdID0gYTAxO1xuICAgIG91dFsyXSA9IGEwMjtcblxuICAgIG91dFszXSA9IGExMDtcbiAgICBvdXRbNF0gPSBhMTE7XG4gICAgb3V0WzVdID0gYTEyO1xuXG4gICAgb3V0WzZdID0geCAqIGEwMCArIHkgKiBhMTAgKyBhMjA7XG4gICAgb3V0WzddID0geCAqIGEwMSArIHkgKiBhMTEgKyBhMjE7XG4gICAgb3V0WzhdID0geCAqIGEwMiArIHkgKiBhMTIgKyBhMjI7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUm90YXRlcyBhIG1hdDMgYnkgdGhlIGdpdmVuIGFuZ2xlXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My5yb3RhdGUgPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSxcbiAgICAgICAgYTEwID0gYVszXSwgYTExID0gYVs0XSwgYTEyID0gYVs1XSxcbiAgICAgICAgYTIwID0gYVs2XSwgYTIxID0gYVs3XSwgYTIyID0gYVs4XSxcblxuICAgICAgICBzID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgICAgYyA9IE1hdGguY29zKHJhZCk7XG5cbiAgICBvdXRbMF0gPSBjICogYTAwICsgcyAqIGExMDtcbiAgICBvdXRbMV0gPSBjICogYTAxICsgcyAqIGExMTtcbiAgICBvdXRbMl0gPSBjICogYTAyICsgcyAqIGExMjtcblxuICAgIG91dFszXSA9IGMgKiBhMTAgLSBzICogYTAwO1xuICAgIG91dFs0XSA9IGMgKiBhMTEgLSBzICogYTAxO1xuICAgIG91dFs1XSA9IGMgKiBhMTIgLSBzICogYTAyO1xuXG4gICAgb3V0WzZdID0gYTIwO1xuICAgIG91dFs3XSA9IGEyMTtcbiAgICBvdXRbOF0gPSBhMjI7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2NhbGVzIHRoZSBtYXQzIGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMyXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHt2ZWMyfSB2IHRoZSB2ZWMyIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqKi9cbm1hdDMuc2NhbGUgPSBmdW5jdGlvbihvdXQsIGEsIHYpIHtcbiAgICB2YXIgeCA9IHZbMF0sIHkgPSB2WzFdO1xuXG4gICAgb3V0WzBdID0geCAqIGFbMF07XG4gICAgb3V0WzFdID0geCAqIGFbMV07XG4gICAgb3V0WzJdID0geCAqIGFbMl07XG5cbiAgICBvdXRbM10gPSB5ICogYVszXTtcbiAgICBvdXRbNF0gPSB5ICogYVs0XTtcbiAgICBvdXRbNV0gPSB5ICogYVs1XTtcblxuICAgIG91dFs2XSA9IGFbNl07XG4gICAgb3V0WzddID0gYVs3XTtcbiAgICBvdXRbOF0gPSBhWzhdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHZlY3RvciB0cmFuc2xhdGlvblxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDMuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0My50cmFuc2xhdGUoZGVzdCwgZGVzdCwgdmVjKTtcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge3ZlYzJ9IHYgVHJhbnNsYXRpb24gdmVjdG9yXG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMuZnJvbVRyYW5zbGF0aW9uID0gZnVuY3Rpb24ob3V0LCB2KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAxO1xuICAgIG91dFs1XSA9IDA7XG4gICAgb3V0WzZdID0gdlswXTtcbiAgICBvdXRbN10gPSB2WzFdO1xuICAgIG91dFs4XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBnaXZlbiBhbmdsZVxuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDMuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0My5yb3RhdGUoZGVzdCwgZGVzdCwgcmFkKTtcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCBtYXQzIHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLmZyb21Sb3RhdGlvbiA9IGZ1bmN0aW9uKG91dCwgcmFkKSB7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpLCBjID0gTWF0aC5jb3MocmFkKTtcblxuICAgIG91dFswXSA9IGM7XG4gICAgb3V0WzFdID0gcztcbiAgICBvdXRbMl0gPSAwO1xuXG4gICAgb3V0WzNdID0gLXM7XG4gICAgb3V0WzRdID0gYztcbiAgICBvdXRbNV0gPSAwO1xuXG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3Igc2NhbGluZ1xuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDMuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0My5zY2FsZShkZXN0LCBkZXN0LCB2ZWMpO1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IG1hdDMgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7dmVjMn0gdiBTY2FsaW5nIHZlY3RvclxuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLmZyb21TY2FsaW5nID0gZnVuY3Rpb24ob3V0LCB2KSB7XG4gICAgb3V0WzBdID0gdlswXTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG5cbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IHZbMV07XG4gICAgb3V0WzVdID0gMDtcblxuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ29waWVzIHRoZSB2YWx1ZXMgZnJvbSBhIG1hdDJkIGludG8gYSBtYXQzXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0MmR9IGEgdGhlIG1hdHJpeCB0byBjb3B5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKiovXG5tYXQzLmZyb21NYXQyZCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSAwO1xuXG4gICAgb3V0WzNdID0gYVsyXTtcbiAgICBvdXRbNF0gPSBhWzNdO1xuICAgIG91dFs1XSA9IDA7XG5cbiAgICBvdXRbNl0gPSBhWzRdO1xuICAgIG91dFs3XSA9IGFbNV07XG4gICAgb3V0WzhdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4qIENhbGN1bGF0ZXMgYSAzeDMgbWF0cml4IGZyb20gdGhlIGdpdmVuIHF1YXRlcm5pb25cbipcbiogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuKiBAcGFyYW0ge3F1YXR9IHEgUXVhdGVybmlvbiB0byBjcmVhdGUgbWF0cml4IGZyb21cbipcbiogQHJldHVybnMge21hdDN9IG91dFxuKi9cbm1hdDMuZnJvbVF1YXQgPSBmdW5jdGlvbiAob3V0LCBxKSB7XG4gICAgdmFyIHggPSBxWzBdLCB5ID0gcVsxXSwgeiA9IHFbMl0sIHcgPSBxWzNdLFxuICAgICAgICB4MiA9IHggKyB4LFxuICAgICAgICB5MiA9IHkgKyB5LFxuICAgICAgICB6MiA9IHogKyB6LFxuXG4gICAgICAgIHh4ID0geCAqIHgyLFxuICAgICAgICB5eCA9IHkgKiB4MixcbiAgICAgICAgeXkgPSB5ICogeTIsXG4gICAgICAgIHp4ID0geiAqIHgyLFxuICAgICAgICB6eSA9IHogKiB5MixcbiAgICAgICAgenogPSB6ICogejIsXG4gICAgICAgIHd4ID0gdyAqIHgyLFxuICAgICAgICB3eSA9IHcgKiB5MixcbiAgICAgICAgd3ogPSB3ICogejI7XG5cbiAgICBvdXRbMF0gPSAxIC0geXkgLSB6ejtcbiAgICBvdXRbM10gPSB5eCAtIHd6O1xuICAgIG91dFs2XSA9IHp4ICsgd3k7XG5cbiAgICBvdXRbMV0gPSB5eCArIHd6O1xuICAgIG91dFs0XSA9IDEgLSB4eCAtIHp6O1xuICAgIG91dFs3XSA9IHp5IC0gd3g7XG5cbiAgICBvdXRbMl0gPSB6eCAtIHd5O1xuICAgIG91dFs1XSA9IHp5ICsgd3g7XG4gICAgb3V0WzhdID0gMSAtIHh4IC0geXk7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4qIENhbGN1bGF0ZXMgYSAzeDMgbm9ybWFsIG1hdHJpeCAodHJhbnNwb3NlIGludmVyc2UpIGZyb20gdGhlIDR4NCBtYXRyaXhcbipcbiogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuKiBAcGFyYW0ge21hdDR9IGEgTWF0NCB0byBkZXJpdmUgdGhlIG5vcm1hbCBtYXRyaXggZnJvbVxuKlxuKiBAcmV0dXJucyB7bWF0M30gb3V0XG4qL1xubWF0My5ub3JtYWxGcm9tTWF0NCA9IGZ1bmN0aW9uIChvdXQsIGEpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSwgYTAzID0gYVszXSxcbiAgICAgICAgYTEwID0gYVs0XSwgYTExID0gYVs1XSwgYTEyID0gYVs2XSwgYTEzID0gYVs3XSxcbiAgICAgICAgYTIwID0gYVs4XSwgYTIxID0gYVs5XSwgYTIyID0gYVsxMF0sIGEyMyA9IGFbMTFdLFxuICAgICAgICBhMzAgPSBhWzEyXSwgYTMxID0gYVsxM10sIGEzMiA9IGFbMTRdLCBhMzMgPSBhWzE1XSxcblxuICAgICAgICBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTAsXG4gICAgICAgIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMCxcbiAgICAgICAgYjAyID0gYTAwICogYTEzIC0gYTAzICogYTEwLFxuICAgICAgICBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTEsXG4gICAgICAgIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMSxcbiAgICAgICAgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyLFxuICAgICAgICBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzAsXG4gICAgICAgIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMCxcbiAgICAgICAgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwLFxuICAgICAgICBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzEsXG4gICAgICAgIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMSxcbiAgICAgICAgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyLFxuXG4gICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcbiAgICAgICAgZGV0ID0gYjAwICogYjExIC0gYjAxICogYjEwICsgYjAyICogYjA5ICsgYjAzICogYjA4IC0gYjA0ICogYjA3ICsgYjA1ICogYjA2O1xuXG4gICAgaWYgKCFkZXQpIHsgXG4gICAgICAgIHJldHVybiBudWxsOyBcbiAgICB9XG4gICAgZGV0ID0gMS4wIC8gZGV0O1xuXG4gICAgb3V0WzBdID0gKGExMSAqIGIxMSAtIGExMiAqIGIxMCArIGExMyAqIGIwOSkgKiBkZXQ7XG4gICAgb3V0WzFdID0gKGExMiAqIGIwOCAtIGExMCAqIGIxMSAtIGExMyAqIGIwNykgKiBkZXQ7XG4gICAgb3V0WzJdID0gKGExMCAqIGIxMCAtIGExMSAqIGIwOCArIGExMyAqIGIwNikgKiBkZXQ7XG5cbiAgICBvdXRbM10gPSAoYTAyICogYjEwIC0gYTAxICogYjExIC0gYTAzICogYjA5KSAqIGRldDtcbiAgICBvdXRbNF0gPSAoYTAwICogYjExIC0gYTAyICogYjA4ICsgYTAzICogYjA3KSAqIGRldDtcbiAgICBvdXRbNV0gPSAoYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2KSAqIGRldDtcblxuICAgIG91dFs2XSA9IChhMzEgKiBiMDUgLSBhMzIgKiBiMDQgKyBhMzMgKiBiMDMpICogZGV0O1xuICAgIG91dFs3XSA9IChhMzIgKiBiMDIgLSBhMzAgKiBiMDUgLSBhMzMgKiBiMDEpICogZGV0O1xuICAgIG91dFs4XSA9IChhMzAgKiBiMDQgLSBhMzEgKiBiMDIgKyBhMzMgKiBiMDApICogZGV0O1xuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDNcbiAqXG4gKiBAcGFyYW0ge21hdDN9IG1hdCBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxuICovXG5tYXQzLnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICdtYXQzKCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcsICcgKyBcbiAgICAgICAgICAgICAgICAgICAgYVszXSArICcsICcgKyBhWzRdICsgJywgJyArIGFbNV0gKyAnLCAnICsgXG4gICAgICAgICAgICAgICAgICAgIGFbNl0gKyAnLCAnICsgYVs3XSArICcsICcgKyBhWzhdICsgJyknO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0M1xuICpcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cbiAqL1xubWF0My5mcm9iID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4oTWF0aC5zcXJ0KE1hdGgucG93KGFbMF0sIDIpICsgTWF0aC5wb3coYVsxXSwgMikgKyBNYXRoLnBvdyhhWzJdLCAyKSArIE1hdGgucG93KGFbM10sIDIpICsgTWF0aC5wb3coYVs0XSwgMikgKyBNYXRoLnBvdyhhWzVdLCAyKSArIE1hdGgucG93KGFbNl0sIDIpICsgTWF0aC5wb3coYVs3XSwgMikgKyBNYXRoLnBvdyhhWzhdLCAyKSkpXG59O1xuXG4vKipcbiAqIEFkZHMgdHdvIG1hdDMnc1xuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0M30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My5hZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgICBvdXRbNF0gPSBhWzRdICsgYls0XTtcbiAgICBvdXRbNV0gPSBhWzVdICsgYls1XTtcbiAgICBvdXRbNl0gPSBhWzZdICsgYls2XTtcbiAgICBvdXRbN10gPSBhWzddICsgYls3XTtcbiAgICBvdXRbOF0gPSBhWzhdICsgYls4XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTdWJ0cmFjdHMgbWF0cml4IGIgZnJvbSBtYXRyaXggYVxuICpcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0M30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xubWF0My5zdWJ0cmFjdCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICAgIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICAgIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICAgIG91dFs0XSA9IGFbNF0gLSBiWzRdO1xuICAgIG91dFs1XSA9IGFbNV0gLSBiWzVdO1xuICAgIG91dFs2XSA9IGFbNl0gLSBiWzZdO1xuICAgIG91dFs3XSA9IGFbN10gLSBiWzddO1xuICAgIG91dFs4XSA9IGFbOF0gLSBiWzhdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0My5zdWJ0cmFjdH1cbiAqIEBmdW5jdGlvblxuICovXG5tYXQzLnN1YiA9IG1hdDMuc3VidHJhY3Q7XG5cbi8qKlxuICogTXVsdGlwbHkgZWFjaCBlbGVtZW50IG9mIHRoZSBtYXRyaXggYnkgYSBzY2FsYXIuXG4gKlxuICogQHBhcmFtIHttYXQzfSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0M30gYSB0aGUgbWF0cml4IHRvIHNjYWxlXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIG1hdHJpeCdzIGVsZW1lbnRzIGJ5XG4gKiBAcmV0dXJucyB7bWF0M30gb3V0XG4gKi9cbm1hdDMubXVsdGlwbHlTY2FsYXIgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICogYjtcbiAgICBvdXRbMV0gPSBhWzFdICogYjtcbiAgICBvdXRbMl0gPSBhWzJdICogYjtcbiAgICBvdXRbM10gPSBhWzNdICogYjtcbiAgICBvdXRbNF0gPSBhWzRdICogYjtcbiAgICBvdXRbNV0gPSBhWzVdICogYjtcbiAgICBvdXRbNl0gPSBhWzZdICogYjtcbiAgICBvdXRbN10gPSBhWzddICogYjtcbiAgICBvdXRbOF0gPSBhWzhdICogYjtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBZGRzIHR3byBtYXQzJ3MgYWZ0ZXIgbXVsdGlwbHlpbmcgZWFjaCBlbGVtZW50IG9mIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge21hdDN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHttYXQzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge21hdDN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiJ3MgZWxlbWVudHMgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge21hdDN9IG91dFxuICovXG5tYXQzLm11bHRpcGx5U2NhbGFyQW5kQWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiLCBzY2FsZSkge1xuICAgIG91dFswXSA9IGFbMF0gKyAoYlswXSAqIHNjYWxlKTtcbiAgICBvdXRbMV0gPSBhWzFdICsgKGJbMV0gKiBzY2FsZSk7XG4gICAgb3V0WzJdID0gYVsyXSArIChiWzJdICogc2NhbGUpO1xuICAgIG91dFszXSA9IGFbM10gKyAoYlszXSAqIHNjYWxlKTtcbiAgICBvdXRbNF0gPSBhWzRdICsgKGJbNF0gKiBzY2FsZSk7XG4gICAgb3V0WzVdID0gYVs1XSArIChiWzVdICogc2NhbGUpO1xuICAgIG91dFs2XSA9IGFbNl0gKyAoYls2XSAqIHNjYWxlKTtcbiAgICBvdXRbN10gPSBhWzddICsgKGJbN10gKiBzY2FsZSk7XG4gICAgb3V0WzhdID0gYVs4XSArIChiWzhdICogc2NhbGUpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgbWF0cmljZXMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7bWF0M30gYSBUaGUgZmlyc3QgbWF0cml4LlxuICogQHBhcmFtIHttYXQzfSBiIFRoZSBzZWNvbmQgbWF0cml4LlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIG1hdHJpY2VzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5tYXQzLmV4YWN0RXF1YWxzID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl0gJiYgXG4gICAgICAgICAgIGFbM10gPT09IGJbM10gJiYgYVs0XSA9PT0gYls0XSAmJiBhWzVdID09PSBiWzVdICYmXG4gICAgICAgICAgIGFbNl0gPT09IGJbNl0gJiYgYVs3XSA9PT0gYls3XSAmJiBhWzhdID09PSBiWzhdO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24uXG4gKlxuICogQHBhcmFtIHttYXQzfSBhIFRoZSBmaXJzdCBtYXRyaXguXG4gKiBAcGFyYW0ge21hdDN9IGIgVGhlIHNlY29uZCBtYXRyaXguXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbm1hdDMuZXF1YWxzID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXSwgYTMgPSBhWzNdLCBhNCA9IGFbNF0sIGE1ID0gYVs1XSwgYTYgPSBhWzZdLCBhNyA9IGFbN10sIGE4ID0gYVs4XTtcbiAgICB2YXIgYjAgPSBiWzBdLCBiMSA9IGJbMV0sIGIyID0gYlsyXSwgYjMgPSBiWzNdLCBiNCA9IGJbNF0sIGI1ID0gYls1XSwgYjYgPSBhWzZdLCBiNyA9IGJbN10sIGI4ID0gYls4XTtcbiAgICByZXR1cm4gKE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGEzIC0gYjMpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMyksIE1hdGguYWJzKGIzKSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGE0IC0gYjQpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNCksIE1hdGguYWJzKGI0KSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGE1IC0gYjUpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNSksIE1hdGguYWJzKGI1KSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGE2IC0gYjYpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNiksIE1hdGguYWJzKGI2KSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGE3IC0gYjcpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhNyksIE1hdGguYWJzKGI3KSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGE4IC0gYjgpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhOCksIE1hdGguYWJzKGI4KSkpO1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IG1hdDM7XG4iLCIvKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEJyYW5kb24gSm9uZXMsIENvbGluIE1hY0tlbnppZSBJVi5cblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuVEhFIFNPRlRXQVJFLiAqL1xuXG52YXIgZ2xNYXRyaXggPSByZXF1aXJlKFwiLi9jb21tb24uanNcIik7XG5cbi8qKlxuICogQGNsYXNzIDR4NCBNYXRyaXhcbiAqIEBuYW1lIG1hdDRcbiAqL1xudmFyIG1hdDQgPSB7XG4gIHNjYWxhcjoge30sXG4gIFNJTUQ6IHt9LFxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGlkZW50aXR5IG1hdDRcbiAqXG4gKiBAcmV0dXJucyB7bWF0NH0gYSBuZXcgNHg0IG1hdHJpeFxuICovXG5tYXQ0LmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgxNik7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDE7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gMTtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IG1hdDQgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDR9IGEgbWF0cml4IHRvIGNsb25lXG4gKiBAcmV0dXJucyB7bWF0NH0gYSBuZXcgNHg0IG1hdHJpeFxuICovXG5tYXQ0LmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgxNik7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICBvdXRbNF0gPSBhWzRdO1xuICAgIG91dFs1XSA9IGFbNV07XG4gICAgb3V0WzZdID0gYVs2XTtcbiAgICBvdXRbN10gPSBhWzddO1xuICAgIG91dFs4XSA9IGFbOF07XG4gICAgb3V0WzldID0gYVs5XTtcbiAgICBvdXRbMTBdID0gYVsxMF07XG4gICAgb3V0WzExXSA9IGFbMTFdO1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0NCB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmNvcHkgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIG91dFs0XSA9IGFbNF07XG4gICAgb3V0WzVdID0gYVs1XTtcbiAgICBvdXRbNl0gPSBhWzZdO1xuICAgIG91dFs3XSA9IGFbN107XG4gICAgb3V0WzhdID0gYVs4XTtcbiAgICBvdXRbOV0gPSBhWzldO1xuICAgIG91dFsxMF0gPSBhWzEwXTtcbiAgICBvdXRbMTFdID0gYVsxMV07XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBtYXQ0IHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDAgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDEgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDIgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMDMgQ29tcG9uZW50IGluIGNvbHVtbiAwLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggMylcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTAgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggNClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTEgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggNSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTIgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggNilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMTMgQ29tcG9uZW50IGluIGNvbHVtbiAxLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggNylcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjAgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggOClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjEgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggOSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMjIgQ29tcG9uZW50IGluIGNvbHVtbiAyLCByb3cgMiBwb3NpdGlvbiAoaW5kZXggMTApXG4gKiBAcGFyYW0ge051bWJlcn0gbTIzIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDMgcG9zaXRpb24gKGluZGV4IDExKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMCBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAwIHBvc2l0aW9uIChpbmRleCAxMilcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMzEgQ29tcG9uZW50IGluIGNvbHVtbiAzLCByb3cgMSBwb3NpdGlvbiAoaW5kZXggMTMpXG4gKiBAcGFyYW0ge051bWJlcn0gbTMyIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDIgcG9zaXRpb24gKGluZGV4IDE0KVxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMyBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAxNSlcbiAqIEByZXR1cm5zIHttYXQ0fSBBIG5ldyBtYXQ0XG4gKi9cbm1hdDQuZnJvbVZhbHVlcyA9IGZ1bmN0aW9uKG0wMCwgbTAxLCBtMDIsIG0wMywgbTEwLCBtMTEsIG0xMiwgbTEzLCBtMjAsIG0yMSwgbTIyLCBtMjMsIG0zMCwgbTMxLCBtMzIsIG0zMykge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgxNik7XG4gICAgb3V0WzBdID0gbTAwO1xuICAgIG91dFsxXSA9IG0wMTtcbiAgICBvdXRbMl0gPSBtMDI7XG4gICAgb3V0WzNdID0gbTAzO1xuICAgIG91dFs0XSA9IG0xMDtcbiAgICBvdXRbNV0gPSBtMTE7XG4gICAgb3V0WzZdID0gbTEyO1xuICAgIG91dFs3XSA9IG0xMztcbiAgICBvdXRbOF0gPSBtMjA7XG4gICAgb3V0WzldID0gbTIxO1xuICAgIG91dFsxMF0gPSBtMjI7XG4gICAgb3V0WzExXSA9IG0yMztcbiAgICBvdXRbMTJdID0gbTMwO1xuICAgIG91dFsxM10gPSBtMzE7XG4gICAgb3V0WzE0XSA9IG0zMjtcbiAgICBvdXRbMTVdID0gbTMzO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIG1hdDQgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge051bWJlcn0gbTAwIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDAgcG9zaXRpb24gKGluZGV4IDApXG4gKiBAcGFyYW0ge051bWJlcn0gbTAxIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDEgcG9zaXRpb24gKGluZGV4IDEpXG4gKiBAcGFyYW0ge051bWJlcn0gbTAyIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDIgcG9zaXRpb24gKGluZGV4IDIpXG4gKiBAcGFyYW0ge051bWJlcn0gbTAzIENvbXBvbmVudCBpbiBjb2x1bW4gMCwgcm93IDMgcG9zaXRpb24gKGluZGV4IDMpXG4gKiBAcGFyYW0ge051bWJlcn0gbTEwIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDAgcG9zaXRpb24gKGluZGV4IDQpXG4gKiBAcGFyYW0ge051bWJlcn0gbTExIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDEgcG9zaXRpb24gKGluZGV4IDUpXG4gKiBAcGFyYW0ge051bWJlcn0gbTEyIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDIgcG9zaXRpb24gKGluZGV4IDYpXG4gKiBAcGFyYW0ge051bWJlcn0gbTEzIENvbXBvbmVudCBpbiBjb2x1bW4gMSwgcm93IDMgcG9zaXRpb24gKGluZGV4IDcpXG4gKiBAcGFyYW0ge051bWJlcn0gbTIwIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDAgcG9zaXRpb24gKGluZGV4IDgpXG4gKiBAcGFyYW0ge051bWJlcn0gbTIxIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDEgcG9zaXRpb24gKGluZGV4IDkpXG4gKiBAcGFyYW0ge051bWJlcn0gbTIyIENvbXBvbmVudCBpbiBjb2x1bW4gMiwgcm93IDIgcG9zaXRpb24gKGluZGV4IDEwKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0yMyBDb21wb25lbnQgaW4gY29sdW1uIDIsIHJvdyAzIHBvc2l0aW9uIChpbmRleCAxMSlcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMzAgQ29tcG9uZW50IGluIGNvbHVtbiAzLCByb3cgMCBwb3NpdGlvbiAoaW5kZXggMTIpXG4gKiBAcGFyYW0ge051bWJlcn0gbTMxIENvbXBvbmVudCBpbiBjb2x1bW4gMywgcm93IDEgcG9zaXRpb24gKGluZGV4IDEzKVxuICogQHBhcmFtIHtOdW1iZXJ9IG0zMiBDb21wb25lbnQgaW4gY29sdW1uIDMsIHJvdyAyIHBvc2l0aW9uIChpbmRleCAxNClcbiAqIEBwYXJhbSB7TnVtYmVyfSBtMzMgQ29tcG9uZW50IGluIGNvbHVtbiAzLCByb3cgMyBwb3NpdGlvbiAoaW5kZXggMTUpXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuc2V0ID0gZnVuY3Rpb24ob3V0LCBtMDAsIG0wMSwgbTAyLCBtMDMsIG0xMCwgbTExLCBtMTIsIG0xMywgbTIwLCBtMjEsIG0yMiwgbTIzLCBtMzAsIG0zMSwgbTMyLCBtMzMpIHtcbiAgICBvdXRbMF0gPSBtMDA7XG4gICAgb3V0WzFdID0gbTAxO1xuICAgIG91dFsyXSA9IG0wMjtcbiAgICBvdXRbM10gPSBtMDM7XG4gICAgb3V0WzRdID0gbTEwO1xuICAgIG91dFs1XSA9IG0xMTtcbiAgICBvdXRbNl0gPSBtMTI7XG4gICAgb3V0WzddID0gbTEzO1xuICAgIG91dFs4XSA9IG0yMDtcbiAgICBvdXRbOV0gPSBtMjE7XG4gICAgb3V0WzEwXSA9IG0yMjtcbiAgICBvdXRbMTFdID0gbTIzO1xuICAgIG91dFsxMl0gPSBtMzA7XG4gICAgb3V0WzEzXSA9IG0zMTtcbiAgICBvdXRbMTRdID0gbTMyO1xuICAgIG91dFsxNV0gPSBtMzM7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cblxuLyoqXG4gKiBTZXQgYSBtYXQ0IHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmlkZW50aXR5ID0gZnVuY3Rpb24ob3V0KSB7XG4gICAgb3V0WzBdID0gMTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDE7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gMTtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc3Bvc2UgdGhlIHZhbHVlcyBvZiBhIG1hdDQgbm90IHVzaW5nIFNJTURcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuc2NhbGFyLnRyYW5zcG9zZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIC8vIElmIHdlIGFyZSB0cmFuc3Bvc2luZyBvdXJzZWx2ZXMgd2UgY2FuIHNraXAgYSBmZXcgc3RlcHMgYnV0IGhhdmUgdG8gY2FjaGUgc29tZSB2YWx1ZXNcbiAgICBpZiAob3V0ID09PSBhKSB7XG4gICAgICAgIHZhciBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdLFxuICAgICAgICAgICAgYTEyID0gYVs2XSwgYTEzID0gYVs3XSxcbiAgICAgICAgICAgIGEyMyA9IGFbMTFdO1xuXG4gICAgICAgIG91dFsxXSA9IGFbNF07XG4gICAgICAgIG91dFsyXSA9IGFbOF07XG4gICAgICAgIG91dFszXSA9IGFbMTJdO1xuICAgICAgICBvdXRbNF0gPSBhMDE7XG4gICAgICAgIG91dFs2XSA9IGFbOV07XG4gICAgICAgIG91dFs3XSA9IGFbMTNdO1xuICAgICAgICBvdXRbOF0gPSBhMDI7XG4gICAgICAgIG91dFs5XSA9IGExMjtcbiAgICAgICAgb3V0WzExXSA9IGFbMTRdO1xuICAgICAgICBvdXRbMTJdID0gYTAzO1xuICAgICAgICBvdXRbMTNdID0gYTEzO1xuICAgICAgICBvdXRbMTRdID0gYTIzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG91dFswXSA9IGFbMF07XG4gICAgICAgIG91dFsxXSA9IGFbNF07XG4gICAgICAgIG91dFsyXSA9IGFbOF07XG4gICAgICAgIG91dFszXSA9IGFbMTJdO1xuICAgICAgICBvdXRbNF0gPSBhWzFdO1xuICAgICAgICBvdXRbNV0gPSBhWzVdO1xuICAgICAgICBvdXRbNl0gPSBhWzldO1xuICAgICAgICBvdXRbN10gPSBhWzEzXTtcbiAgICAgICAgb3V0WzhdID0gYVsyXTtcbiAgICAgICAgb3V0WzldID0gYVs2XTtcbiAgICAgICAgb3V0WzEwXSA9IGFbMTBdO1xuICAgICAgICBvdXRbMTFdID0gYVsxNF07XG4gICAgICAgIG91dFsxMl0gPSBhWzNdO1xuICAgICAgICBvdXRbMTNdID0gYVs3XTtcbiAgICAgICAgb3V0WzE0XSA9IGFbMTFdO1xuICAgICAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNwb3NlIHRoZSB2YWx1ZXMgb2YgYSBtYXQ0IHVzaW5nIFNJTURcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuU0lNRC50cmFuc3Bvc2UgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgYTAsIGExLCBhMiwgYTMsXG4gICAgICAgIHRtcDAxLCB0bXAyMyxcbiAgICAgICAgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MztcblxuICAgIGEwID0gU0lNRC5GbG9hdDMyeDQubG9hZChhLCAwKTtcbiAgICBhMSA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgNCk7XG4gICAgYTIgPSBTSU1ELkZsb2F0MzJ4NC5sb2FkKGEsIDgpO1xuICAgIGEzID0gU0lNRC5GbG9hdDMyeDQubG9hZChhLCAxMik7XG5cbiAgICB0bXAwMSA9IFNJTUQuRmxvYXQzMng0LnNodWZmbGUoYTAsIGExLCAwLCAxLCA0LCA1KTtcbiAgICB0bXAyMyA9IFNJTUQuRmxvYXQzMng0LnNodWZmbGUoYTIsIGEzLCAwLCAxLCA0LCA1KTtcbiAgICBvdXQwICA9IFNJTUQuRmxvYXQzMng0LnNodWZmbGUodG1wMDEsIHRtcDIzLCAwLCAyLCA0LCA2KTtcbiAgICBvdXQxICA9IFNJTUQuRmxvYXQzMng0LnNodWZmbGUodG1wMDEsIHRtcDIzLCAxLCAzLCA1LCA3KTtcbiAgICBTSU1ELkZsb2F0MzJ4NC5zdG9yZShvdXQsIDAsICBvdXQwKTtcbiAgICBTSU1ELkZsb2F0MzJ4NC5zdG9yZShvdXQsIDQsICBvdXQxKTtcblxuICAgIHRtcDAxID0gU0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShhMCwgYTEsIDIsIDMsIDYsIDcpO1xuICAgIHRtcDIzID0gU0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShhMiwgYTMsIDIsIDMsIDYsIDcpO1xuICAgIG91dDIgID0gU0lNRC5GbG9hdDMyeDQuc2h1ZmZsZSh0bXAwMSwgdG1wMjMsIDAsIDIsIDQsIDYpO1xuICAgIG91dDMgID0gU0lNRC5GbG9hdDMyeDQuc2h1ZmZsZSh0bXAwMSwgdG1wMjMsIDEsIDMsIDUsIDcpO1xuICAgIFNJTUQuRmxvYXQzMng0LnN0b3JlKG91dCwgOCwgIG91dDIpO1xuICAgIFNJTUQuRmxvYXQzMng0LnN0b3JlKG91dCwgMTIsIG91dDMpO1xuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNwc2UgYSBtYXQ0IHVzaW5nIFNJTUQgaWYgYXZhaWxhYmxlIGFuZCBlbmFibGVkXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LnRyYW5zcG9zZSA9IGdsTWF0cml4LlVTRV9TSU1EID8gbWF0NC5TSU1ELnRyYW5zcG9zZSA6IG1hdDQuc2NhbGFyLnRyYW5zcG9zZTtcblxuLyoqXG4gKiBJbnZlcnRzIGEgbWF0NCBub3QgdXNpbmcgU0lNRFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5zY2FsYXIuaW52ZXJ0ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGEwMyA9IGFbM10sXG4gICAgICAgIGExMCA9IGFbNF0sIGExMSA9IGFbNV0sIGExMiA9IGFbNl0sIGExMyA9IGFbN10sXG4gICAgICAgIGEyMCA9IGFbOF0sIGEyMSA9IGFbOV0sIGEyMiA9IGFbMTBdLCBhMjMgPSBhWzExXSxcbiAgICAgICAgYTMwID0gYVsxMl0sIGEzMSA9IGFbMTNdLCBhMzIgPSBhWzE0XSwgYTMzID0gYVsxNV0sXG5cbiAgICAgICAgYjAwID0gYTAwICogYTExIC0gYTAxICogYTEwLFxuICAgICAgICBiMDEgPSBhMDAgKiBhMTIgLSBhMDIgKiBhMTAsXG4gICAgICAgIGIwMiA9IGEwMCAqIGExMyAtIGEwMyAqIGExMCxcbiAgICAgICAgYjAzID0gYTAxICogYTEyIC0gYTAyICogYTExLFxuICAgICAgICBiMDQgPSBhMDEgKiBhMTMgLSBhMDMgKiBhMTEsXG4gICAgICAgIGIwNSA9IGEwMiAqIGExMyAtIGEwMyAqIGExMixcbiAgICAgICAgYjA2ID0gYTIwICogYTMxIC0gYTIxICogYTMwLFxuICAgICAgICBiMDcgPSBhMjAgKiBhMzIgLSBhMjIgKiBhMzAsXG4gICAgICAgIGIwOCA9IGEyMCAqIGEzMyAtIGEyMyAqIGEzMCxcbiAgICAgICAgYjA5ID0gYTIxICogYTMyIC0gYTIyICogYTMxLFxuICAgICAgICBiMTAgPSBhMjEgKiBhMzMgLSBhMjMgKiBhMzEsXG4gICAgICAgIGIxMSA9IGEyMiAqIGEzMyAtIGEyMyAqIGEzMixcblxuICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG4gICAgICAgIGRldCA9IGIwMCAqIGIxMSAtIGIwMSAqIGIxMCArIGIwMiAqIGIwOSArIGIwMyAqIGIwOCAtIGIwNCAqIGIwNyArIGIwNSAqIGIwNjtcblxuICAgIGlmICghZGV0KSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBkZXQgPSAxLjAgLyBkZXQ7XG5cbiAgICBvdXRbMF0gPSAoYTExICogYjExIC0gYTEyICogYjEwICsgYTEzICogYjA5KSAqIGRldDtcbiAgICBvdXRbMV0gPSAoYTAyICogYjEwIC0gYTAxICogYjExIC0gYTAzICogYjA5KSAqIGRldDtcbiAgICBvdXRbMl0gPSAoYTMxICogYjA1IC0gYTMyICogYjA0ICsgYTMzICogYjAzKSAqIGRldDtcbiAgICBvdXRbM10gPSAoYTIyICogYjA0IC0gYTIxICogYjA1IC0gYTIzICogYjAzKSAqIGRldDtcbiAgICBvdXRbNF0gPSAoYTEyICogYjA4IC0gYTEwICogYjExIC0gYTEzICogYjA3KSAqIGRldDtcbiAgICBvdXRbNV0gPSAoYTAwICogYjExIC0gYTAyICogYjA4ICsgYTAzICogYjA3KSAqIGRldDtcbiAgICBvdXRbNl0gPSAoYTMyICogYjAyIC0gYTMwICogYjA1IC0gYTMzICogYjAxKSAqIGRldDtcbiAgICBvdXRbN10gPSAoYTIwICogYjA1IC0gYTIyICogYjAyICsgYTIzICogYjAxKSAqIGRldDtcbiAgICBvdXRbOF0gPSAoYTEwICogYjEwIC0gYTExICogYjA4ICsgYTEzICogYjA2KSAqIGRldDtcbiAgICBvdXRbOV0gPSAoYTAxICogYjA4IC0gYTAwICogYjEwIC0gYTAzICogYjA2KSAqIGRldDtcbiAgICBvdXRbMTBdID0gKGEzMCAqIGIwNCAtIGEzMSAqIGIwMiArIGEzMyAqIGIwMCkgKiBkZXQ7XG4gICAgb3V0WzExXSA9IChhMjEgKiBiMDIgLSBhMjAgKiBiMDQgLSBhMjMgKiBiMDApICogZGV0O1xuICAgIG91dFsxMl0gPSAoYTExICogYjA3IC0gYTEwICogYjA5IC0gYTEyICogYjA2KSAqIGRldDtcbiAgICBvdXRbMTNdID0gKGEwMCAqIGIwOSAtIGEwMSAqIGIwNyArIGEwMiAqIGIwNikgKiBkZXQ7XG4gICAgb3V0WzE0XSA9IChhMzEgKiBiMDEgLSBhMzAgKiBiMDMgLSBhMzIgKiBiMDApICogZGV0O1xuICAgIG91dFsxNV0gPSAoYTIwICogYjAzIC0gYTIxICogYjAxICsgYTIyICogYjAwKSAqIGRldDtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEludmVydHMgYSBtYXQ0IHVzaW5nIFNJTURcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuU0lNRC5pbnZlcnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgdmFyIHJvdzAsIHJvdzEsIHJvdzIsIHJvdzMsXG4gICAgICB0bXAxLFxuICAgICAgbWlub3IwLCBtaW5vcjEsIG1pbm9yMiwgbWlub3IzLFxuICAgICAgZGV0LFxuICAgICAgYTAgPSBTSU1ELkZsb2F0MzJ4NC5sb2FkKGEsIDApLFxuICAgICAgYTEgPSBTSU1ELkZsb2F0MzJ4NC5sb2FkKGEsIDQpLFxuICAgICAgYTIgPSBTSU1ELkZsb2F0MzJ4NC5sb2FkKGEsIDgpLFxuICAgICAgYTMgPSBTSU1ELkZsb2F0MzJ4NC5sb2FkKGEsIDEyKTtcblxuICAvLyBDb21wdXRlIG1hdHJpeCBhZGp1Z2F0ZVxuICB0bXAxID0gU0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShhMCwgYTEsIDAsIDEsIDQsIDUpO1xuICByb3cxID0gU0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShhMiwgYTMsIDAsIDEsIDQsIDUpO1xuICByb3cwID0gU0lNRC5GbG9hdDMyeDQuc2h1ZmZsZSh0bXAxLCByb3cxLCAwLCAyLCA0LCA2KTtcbiAgcm93MSA9IFNJTUQuRmxvYXQzMng0LnNodWZmbGUocm93MSwgdG1wMSwgMSwgMywgNSwgNyk7XG4gIHRtcDEgPSBTSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKGEwLCBhMSwgMiwgMywgNiwgNyk7XG4gIHJvdzMgPSBTSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKGEyLCBhMywgMiwgMywgNiwgNyk7XG4gIHJvdzIgPSBTSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKHRtcDEsIHJvdzMsIDAsIDIsIDQsIDYpO1xuICByb3czID0gU0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShyb3czLCB0bXAxLCAxLCAzLCA1LCA3KTtcblxuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5tdWwocm93Miwgcm93Myk7XG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodG1wMSwgMSwgMCwgMywgMik7XG4gIG1pbm9yMCA9IFNJTUQuRmxvYXQzMng0Lm11bChyb3cxLCB0bXAxKTtcbiAgbWlub3IxID0gU0lNRC5GbG9hdDMyeDQubXVsKHJvdzAsIHRtcDEpO1xuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHRtcDEsIDIsIDMsIDAsIDEpO1xuICBtaW5vcjAgPSBTSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKHJvdzEsIHRtcDEpLCBtaW5vcjApO1xuICBtaW5vcjEgPSBTSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKHJvdzAsIHRtcDEpLCBtaW5vcjEpO1xuICBtaW5vcjEgPSBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKG1pbm9yMSwgMiwgMywgMCwgMSk7XG5cbiAgdG1wMSAgID0gU0lNRC5GbG9hdDMyeDQubXVsKHJvdzEsIHJvdzIpO1xuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHRtcDEsIDEsIDAsIDMsIDIpO1xuICBtaW5vcjAgPSBTSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKHJvdzMsIHRtcDEpLCBtaW5vcjApO1xuICBtaW5vcjMgPSBTSU1ELkZsb2F0MzJ4NC5tdWwocm93MCwgdG1wMSk7XG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodG1wMSwgMiwgMywgMCwgMSk7XG4gIG1pbm9yMCA9IFNJTUQuRmxvYXQzMng0LnN1YihtaW5vcjAsIFNJTUQuRmxvYXQzMng0Lm11bChyb3czLCB0bXAxKSk7XG4gIG1pbm9yMyA9IFNJTUQuRmxvYXQzMng0LnN1YihTSU1ELkZsb2F0MzJ4NC5tdWwocm93MCwgdG1wMSksIG1pbm9yMyk7XG4gIG1pbm9yMyA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUobWlub3IzLCAyLCAzLCAwLCAxKTtcblxuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5tdWwoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShyb3cxLCAyLCAzLCAwLCAxKSwgcm93Myk7XG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodG1wMSwgMSwgMCwgMywgMik7XG4gIHJvdzIgICA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUocm93MiwgMiwgMywgMCwgMSk7XG4gIG1pbm9yMCA9IFNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwocm93MiwgdG1wMSksIG1pbm9yMCk7XG4gIG1pbm9yMiA9IFNJTUQuRmxvYXQzMng0Lm11bChyb3cwLCB0bXAxKTtcbiAgdG1wMSAgID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZSh0bXAxLCAyLCAzLCAwLCAxKTtcbiAgbWlub3IwID0gU0lNRC5GbG9hdDMyeDQuc3ViKG1pbm9yMCwgU0lNRC5GbG9hdDMyeDQubXVsKHJvdzIsIHRtcDEpKTtcbiAgbWlub3IyID0gU0lNRC5GbG9hdDMyeDQuc3ViKFNJTUQuRmxvYXQzMng0Lm11bChyb3cwLCB0bXAxKSwgbWlub3IyKTtcbiAgbWlub3IyID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZShtaW5vcjIsIDIsIDMsIDAsIDEpO1xuXG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0Lm11bChyb3cwLCByb3cxKTtcbiAgdG1wMSAgID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZSh0bXAxLCAxLCAwLCAzLCAyKTtcbiAgbWlub3IyID0gU0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChyb3czLCB0bXAxKSwgbWlub3IyKTtcbiAgbWlub3IzID0gU0lNRC5GbG9hdDMyeDQuc3ViKFNJTUQuRmxvYXQzMng0Lm11bChyb3cyLCB0bXAxKSwgbWlub3IzKTtcbiAgdG1wMSAgID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZSh0bXAxLCAyLCAzLCAwLCAxKTtcbiAgbWlub3IyID0gU0lNRC5GbG9hdDMyeDQuc3ViKFNJTUQuRmxvYXQzMng0Lm11bChyb3czLCB0bXAxKSwgbWlub3IyKTtcbiAgbWlub3IzID0gU0lNRC5GbG9hdDMyeDQuc3ViKG1pbm9yMywgU0lNRC5GbG9hdDMyeDQubXVsKHJvdzIsIHRtcDEpKTtcblxuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5tdWwocm93MCwgcm93Myk7XG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodG1wMSwgMSwgMCwgMywgMik7XG4gIG1pbm9yMSA9IFNJTUQuRmxvYXQzMng0LnN1YihtaW5vcjEsIFNJTUQuRmxvYXQzMng0Lm11bChyb3cyLCB0bXAxKSk7XG4gIG1pbm9yMiA9IFNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwocm93MSwgdG1wMSksIG1pbm9yMik7XG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodG1wMSwgMiwgMywgMCwgMSk7XG4gIG1pbm9yMSA9IFNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwocm93MiwgdG1wMSksIG1pbm9yMSk7XG4gIG1pbm9yMiA9IFNJTUQuRmxvYXQzMng0LnN1YihtaW5vcjIsIFNJTUQuRmxvYXQzMng0Lm11bChyb3cxLCB0bXAxKSk7XG5cbiAgdG1wMSAgID0gU0lNRC5GbG9hdDMyeDQubXVsKHJvdzAsIHJvdzIpO1xuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHRtcDEsIDEsIDAsIDMsIDIpO1xuICBtaW5vcjEgPSBTSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKHJvdzMsIHRtcDEpLCBtaW5vcjEpO1xuICBtaW5vcjMgPSBTSU1ELkZsb2F0MzJ4NC5zdWIobWlub3IzLCBTSU1ELkZsb2F0MzJ4NC5tdWwocm93MSwgdG1wMSkpO1xuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHRtcDEsIDIsIDMsIDAsIDEpO1xuICBtaW5vcjEgPSBTSU1ELkZsb2F0MzJ4NC5zdWIobWlub3IxLCBTSU1ELkZsb2F0MzJ4NC5tdWwocm93MywgdG1wMSkpO1xuICBtaW5vcjMgPSBTSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKHJvdzEsIHRtcDEpLCBtaW5vcjMpO1xuXG4gIC8vIENvbXB1dGUgbWF0cml4IGRldGVybWluYW50XG4gIGRldCAgID0gU0lNRC5GbG9hdDMyeDQubXVsKHJvdzAsIG1pbm9yMCk7XG4gIGRldCAgID0gU0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUoZGV0LCAyLCAzLCAwLCAxKSwgZGV0KTtcbiAgZGV0ICAgPSBTSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShkZXQsIDEsIDAsIDMsIDIpLCBkZXQpO1xuICB0bXAxICA9IFNJTUQuRmxvYXQzMng0LnJlY2lwcm9jYWxBcHByb3hpbWF0aW9uKGRldCk7XG4gIGRldCAgID0gU0lNRC5GbG9hdDMyeDQuc3ViKFxuICAgICAgICAgICAgICAgU0lNRC5GbG9hdDMyeDQuYWRkKHRtcDEsIHRtcDEpLFxuICAgICAgICAgICAgICAgU0lNRC5GbG9hdDMyeDQubXVsKGRldCwgU0lNRC5GbG9hdDMyeDQubXVsKHRtcDEsIHRtcDEpKSk7XG4gIGRldCAgID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZShkZXQsIDAsIDAsIDAsIDApO1xuICBpZiAoIWRldCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBDb21wdXRlIG1hdHJpeCBpbnZlcnNlXG4gIFNJTUQuRmxvYXQzMng0LnN0b3JlKG91dCwgMCwgIFNJTUQuRmxvYXQzMng0Lm11bChkZXQsIG1pbm9yMCkpO1xuICBTSU1ELkZsb2F0MzJ4NC5zdG9yZShvdXQsIDQsICBTSU1ELkZsb2F0MzJ4NC5tdWwoZGV0LCBtaW5vcjEpKTtcbiAgU0lNRC5GbG9hdDMyeDQuc3RvcmUob3V0LCA4LCAgU0lNRC5GbG9hdDMyeDQubXVsKGRldCwgbWlub3IyKSk7XG4gIFNJTUQuRmxvYXQzMng0LnN0b3JlKG91dCwgMTIsIFNJTUQuRmxvYXQzMng0Lm11bChkZXQsIG1pbm9yMykpO1xuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIEludmVydHMgYSBtYXQ0IHVzaW5nIFNJTUQgaWYgYXZhaWxhYmxlIGFuZCBlbmFibGVkXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmludmVydCA9IGdsTWF0cml4LlVTRV9TSU1EID8gbWF0NC5TSU1ELmludmVydCA6IG1hdDQuc2NhbGFyLmludmVydDtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBhZGp1Z2F0ZSBvZiBhIG1hdDQgbm90IHVzaW5nIFNJTURcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuc2NhbGFyLmFkam9pbnQgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSwgYTAzID0gYVszXSxcbiAgICAgICAgYTEwID0gYVs0XSwgYTExID0gYVs1XSwgYTEyID0gYVs2XSwgYTEzID0gYVs3XSxcbiAgICAgICAgYTIwID0gYVs4XSwgYTIxID0gYVs5XSwgYTIyID0gYVsxMF0sIGEyMyA9IGFbMTFdLFxuICAgICAgICBhMzAgPSBhWzEyXSwgYTMxID0gYVsxM10sIGEzMiA9IGFbMTRdLCBhMzMgPSBhWzE1XTtcblxuICAgIG91dFswXSAgPSAgKGExMSAqIChhMjIgKiBhMzMgLSBhMjMgKiBhMzIpIC0gYTIxICogKGExMiAqIGEzMyAtIGExMyAqIGEzMikgKyBhMzEgKiAoYTEyICogYTIzIC0gYTEzICogYTIyKSk7XG4gICAgb3V0WzFdICA9IC0oYTAxICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjEgKiAoYTAyICogYTMzIC0gYTAzICogYTMyKSArIGEzMSAqIChhMDIgKiBhMjMgLSBhMDMgKiBhMjIpKTtcbiAgICBvdXRbMl0gID0gIChhMDEgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSAtIGExMSAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMxICogKGEwMiAqIGExMyAtIGEwMyAqIGExMikpO1xuICAgIG91dFszXSAgPSAtKGEwMSAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpIC0gYTExICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMikgKyBhMjEgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKSk7XG4gICAgb3V0WzRdICA9IC0oYTEwICogKGEyMiAqIGEzMyAtIGEyMyAqIGEzMikgLSBhMjAgKiAoYTEyICogYTMzIC0gYTEzICogYTMyKSArIGEzMCAqIChhMTIgKiBhMjMgLSBhMTMgKiBhMjIpKTtcbiAgICBvdXRbNV0gID0gIChhMDAgKiAoYTIyICogYTMzIC0gYTIzICogYTMyKSAtIGEyMCAqIChhMDIgKiBhMzMgLSBhMDMgKiBhMzIpICsgYTMwICogKGEwMiAqIGEyMyAtIGEwMyAqIGEyMikpO1xuICAgIG91dFs2XSAgPSAtKGEwMCAqIChhMTIgKiBhMzMgLSBhMTMgKiBhMzIpIC0gYTEwICogKGEwMiAqIGEzMyAtIGEwMyAqIGEzMikgKyBhMzAgKiAoYTAyICogYTEzIC0gYTAzICogYTEyKSk7XG4gICAgb3V0WzddICA9ICAoYTAwICogKGExMiAqIGEyMyAtIGExMyAqIGEyMikgLSBhMTAgKiAoYTAyICogYTIzIC0gYTAzICogYTIyKSArIGEyMCAqIChhMDIgKiBhMTMgLSBhMDMgKiBhMTIpKTtcbiAgICBvdXRbOF0gID0gIChhMTAgKiAoYTIxICogYTMzIC0gYTIzICogYTMxKSAtIGEyMCAqIChhMTEgKiBhMzMgLSBhMTMgKiBhMzEpICsgYTMwICogKGExMSAqIGEyMyAtIGExMyAqIGEyMSkpO1xuICAgIG91dFs5XSAgPSAtKGEwMCAqIChhMjEgKiBhMzMgLSBhMjMgKiBhMzEpIC0gYTIwICogKGEwMSAqIGEzMyAtIGEwMyAqIGEzMSkgKyBhMzAgKiAoYTAxICogYTIzIC0gYTAzICogYTIxKSk7XG4gICAgb3V0WzEwXSA9ICAoYTAwICogKGExMSAqIGEzMyAtIGExMyAqIGEzMSkgLSBhMTAgKiAoYTAxICogYTMzIC0gYTAzICogYTMxKSArIGEzMCAqIChhMDEgKiBhMTMgLSBhMDMgKiBhMTEpKTtcbiAgICBvdXRbMTFdID0gLShhMDAgKiAoYTExICogYTIzIC0gYTEzICogYTIxKSAtIGExMCAqIChhMDEgKiBhMjMgLSBhMDMgKiBhMjEpICsgYTIwICogKGEwMSAqIGExMyAtIGEwMyAqIGExMSkpO1xuICAgIG91dFsxMl0gPSAtKGExMCAqIChhMjEgKiBhMzIgLSBhMjIgKiBhMzEpIC0gYTIwICogKGExMSAqIGEzMiAtIGExMiAqIGEzMSkgKyBhMzAgKiAoYTExICogYTIyIC0gYTEyICogYTIxKSk7XG4gICAgb3V0WzEzXSA9ICAoYTAwICogKGEyMSAqIGEzMiAtIGEyMiAqIGEzMSkgLSBhMjAgKiAoYTAxICogYTMyIC0gYTAyICogYTMxKSArIGEzMCAqIChhMDEgKiBhMjIgLSBhMDIgKiBhMjEpKTtcbiAgICBvdXRbMTRdID0gLShhMDAgKiAoYTExICogYTMyIC0gYTEyICogYTMxKSAtIGExMCAqIChhMDEgKiBhMzIgLSBhMDIgKiBhMzEpICsgYTMwICogKGEwMSAqIGExMiAtIGEwMiAqIGExMSkpO1xuICAgIG91dFsxNV0gPSAgKGEwMCAqIChhMTEgKiBhMjIgLSBhMTIgKiBhMjEpIC0gYTEwICogKGEwMSAqIGEyMiAtIGEwMiAqIGEyMSkgKyBhMjAgKiAoYTAxICogYTEyIC0gYTAyICogYTExKSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgYWRqdWdhdGUgb2YgYSBtYXQ0IHVzaW5nIFNJTURcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBzb3VyY2UgbWF0cml4XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuU0lNRC5hZGpvaW50ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gIHZhciBhMCwgYTEsIGEyLCBhMztcbiAgdmFyIHJvdzAsIHJvdzEsIHJvdzIsIHJvdzM7XG4gIHZhciB0bXAxO1xuICB2YXIgbWlub3IwLCBtaW5vcjEsIG1pbm9yMiwgbWlub3IzO1xuXG4gIHZhciBhMCA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgMCk7XG4gIHZhciBhMSA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgNCk7XG4gIHZhciBhMiA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgOCk7XG4gIHZhciBhMyA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgMTIpO1xuXG4gIC8vIFRyYW5zcG9zZSB0aGUgc291cmNlIG1hdHJpeC4gIFNvcnQgb2YuICBOb3QgYSB0cnVlIHRyYW5zcG9zZSBvcGVyYXRpb25cbiAgdG1wMSA9IFNJTUQuRmxvYXQzMng0LnNodWZmbGUoYTAsIGExLCAwLCAxLCA0LCA1KTtcbiAgcm93MSA9IFNJTUQuRmxvYXQzMng0LnNodWZmbGUoYTIsIGEzLCAwLCAxLCA0LCA1KTtcbiAgcm93MCA9IFNJTUQuRmxvYXQzMng0LnNodWZmbGUodG1wMSwgcm93MSwgMCwgMiwgNCwgNik7XG4gIHJvdzEgPSBTSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKHJvdzEsIHRtcDEsIDEsIDMsIDUsIDcpO1xuXG4gIHRtcDEgPSBTSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKGEwLCBhMSwgMiwgMywgNiwgNyk7XG4gIHJvdzMgPSBTSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKGEyLCBhMywgMiwgMywgNiwgNyk7XG4gIHJvdzIgPSBTSU1ELkZsb2F0MzJ4NC5zaHVmZmxlKHRtcDEsIHJvdzMsIDAsIDIsIDQsIDYpO1xuICByb3czID0gU0lNRC5GbG9hdDMyeDQuc2h1ZmZsZShyb3czLCB0bXAxLCAxLCAzLCA1LCA3KTtcblxuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5tdWwocm93Miwgcm93Myk7XG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodG1wMSwgMSwgMCwgMywgMik7XG4gIG1pbm9yMCA9IFNJTUQuRmxvYXQzMng0Lm11bChyb3cxLCB0bXAxKTtcbiAgbWlub3IxID0gU0lNRC5GbG9hdDMyeDQubXVsKHJvdzAsIHRtcDEpO1xuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHRtcDEsIDIsIDMsIDAsIDEpO1xuICBtaW5vcjAgPSBTSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKHJvdzEsIHRtcDEpLCBtaW5vcjApO1xuICBtaW5vcjEgPSBTSU1ELkZsb2F0MzJ4NC5zdWIoU0lNRC5GbG9hdDMyeDQubXVsKHJvdzAsIHRtcDEpLCBtaW5vcjEpO1xuICBtaW5vcjEgPSBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKG1pbm9yMSwgMiwgMywgMCwgMSk7XG5cbiAgdG1wMSAgID0gU0lNRC5GbG9hdDMyeDQubXVsKHJvdzEsIHJvdzIpO1xuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHRtcDEsIDEsIDAsIDMsIDIpO1xuICBtaW5vcjAgPSBTSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKHJvdzMsIHRtcDEpLCBtaW5vcjApO1xuICBtaW5vcjMgPSBTSU1ELkZsb2F0MzJ4NC5tdWwocm93MCwgdG1wMSk7XG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodG1wMSwgMiwgMywgMCwgMSk7XG4gIG1pbm9yMCA9IFNJTUQuRmxvYXQzMng0LnN1YihtaW5vcjAsIFNJTUQuRmxvYXQzMng0Lm11bChyb3czLCB0bXAxKSk7XG4gIG1pbm9yMyA9IFNJTUQuRmxvYXQzMng0LnN1YihTSU1ELkZsb2F0MzJ4NC5tdWwocm93MCwgdG1wMSksIG1pbm9yMyk7XG4gIG1pbm9yMyA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUobWlub3IzLCAyLCAzLCAwLCAxKTtcblxuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5tdWwoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShyb3cxLCAyLCAzLCAwLCAxKSwgcm93Myk7XG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodG1wMSwgMSwgMCwgMywgMik7XG4gIHJvdzIgICA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUocm93MiwgMiwgMywgMCwgMSk7XG4gIG1pbm9yMCA9IFNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwocm93MiwgdG1wMSksIG1pbm9yMCk7XG4gIG1pbm9yMiA9IFNJTUQuRmxvYXQzMng0Lm11bChyb3cwLCB0bXAxKTtcbiAgdG1wMSAgID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZSh0bXAxLCAyLCAzLCAwLCAxKTtcbiAgbWlub3IwID0gU0lNRC5GbG9hdDMyeDQuc3ViKG1pbm9yMCwgU0lNRC5GbG9hdDMyeDQubXVsKHJvdzIsIHRtcDEpKTtcbiAgbWlub3IyID0gU0lNRC5GbG9hdDMyeDQuc3ViKFNJTUQuRmxvYXQzMng0Lm11bChyb3cwLCB0bXAxKSwgbWlub3IyKTtcbiAgbWlub3IyID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZShtaW5vcjIsIDIsIDMsIDAsIDEpO1xuXG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0Lm11bChyb3cwLCByb3cxKTtcbiAgdG1wMSAgID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZSh0bXAxLCAxLCAwLCAzLCAyKTtcbiAgbWlub3IyID0gU0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChyb3czLCB0bXAxKSwgbWlub3IyKTtcbiAgbWlub3IzID0gU0lNRC5GbG9hdDMyeDQuc3ViKFNJTUQuRmxvYXQzMng0Lm11bChyb3cyLCB0bXAxKSwgbWlub3IzKTtcbiAgdG1wMSAgID0gU0lNRC5GbG9hdDMyeDQuc3dpenpsZSh0bXAxLCAyLCAzLCAwLCAxKTtcbiAgbWlub3IyID0gU0lNRC5GbG9hdDMyeDQuc3ViKFNJTUQuRmxvYXQzMng0Lm11bChyb3czLCB0bXAxKSwgbWlub3IyKTtcbiAgbWlub3IzID0gU0lNRC5GbG9hdDMyeDQuc3ViKG1pbm9yMywgU0lNRC5GbG9hdDMyeDQubXVsKHJvdzIsIHRtcDEpKTtcblxuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5tdWwocm93MCwgcm93Myk7XG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodG1wMSwgMSwgMCwgMywgMik7XG4gIG1pbm9yMSA9IFNJTUQuRmxvYXQzMng0LnN1YihtaW5vcjEsIFNJTUQuRmxvYXQzMng0Lm11bChyb3cyLCB0bXAxKSk7XG4gIG1pbm9yMiA9IFNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwocm93MSwgdG1wMSksIG1pbm9yMik7XG4gIHRtcDEgICA9IFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodG1wMSwgMiwgMywgMCwgMSk7XG4gIG1pbm9yMSA9IFNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwocm93MiwgdG1wMSksIG1pbm9yMSk7XG4gIG1pbm9yMiA9IFNJTUQuRmxvYXQzMng0LnN1YihtaW5vcjIsIFNJTUQuRmxvYXQzMng0Lm11bChyb3cxLCB0bXAxKSk7XG5cbiAgdG1wMSAgID0gU0lNRC5GbG9hdDMyeDQubXVsKHJvdzAsIHJvdzIpO1xuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHRtcDEsIDEsIDAsIDMsIDIpO1xuICBtaW5vcjEgPSBTSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKHJvdzMsIHRtcDEpLCBtaW5vcjEpO1xuICBtaW5vcjMgPSBTSU1ELkZsb2F0MzJ4NC5zdWIobWlub3IzLCBTSU1ELkZsb2F0MzJ4NC5tdWwocm93MSwgdG1wMSkpO1xuICB0bXAxICAgPSBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHRtcDEsIDIsIDMsIDAsIDEpO1xuICBtaW5vcjEgPSBTSU1ELkZsb2F0MzJ4NC5zdWIobWlub3IxLCBTSU1ELkZsb2F0MzJ4NC5tdWwocm93MywgdG1wMSkpO1xuICBtaW5vcjMgPSBTSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKHJvdzEsIHRtcDEpLCBtaW5vcjMpO1xuXG4gIFNJTUQuRmxvYXQzMng0LnN0b3JlKG91dCwgMCwgIG1pbm9yMCk7XG4gIFNJTUQuRmxvYXQzMng0LnN0b3JlKG91dCwgNCwgIG1pbm9yMSk7XG4gIFNJTUQuRmxvYXQzMng0LnN0b3JlKG91dCwgOCwgIG1pbm9yMik7XG4gIFNJTUQuRmxvYXQzMng0LnN0b3JlKG91dCwgMTIsIG1pbm9yMyk7XG4gIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGFkanVnYXRlIG9mIGEgbWF0NCB1c2luZyBTSU1EIGlmIGF2YWlsYWJsZSBhbmQgZW5hYmxlZFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuIG1hdDQuYWRqb2ludCA9IGdsTWF0cml4LlVTRV9TSU1EID8gbWF0NC5TSU1ELmFkam9pbnQgOiBtYXQ0LnNjYWxhci5hZGpvaW50O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRldGVybWluYW50IG9mIGEgbWF0NFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge051bWJlcn0gZGV0ZXJtaW5hbnQgb2YgYVxuICovXG5tYXQ0LmRldGVybWluYW50ID0gZnVuY3Rpb24gKGEpIHtcbiAgICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXSwgYTAzID0gYVszXSxcbiAgICAgICAgYTEwID0gYVs0XSwgYTExID0gYVs1XSwgYTEyID0gYVs2XSwgYTEzID0gYVs3XSxcbiAgICAgICAgYTIwID0gYVs4XSwgYTIxID0gYVs5XSwgYTIyID0gYVsxMF0sIGEyMyA9IGFbMTFdLFxuICAgICAgICBhMzAgPSBhWzEyXSwgYTMxID0gYVsxM10sIGEzMiA9IGFbMTRdLCBhMzMgPSBhWzE1XSxcblxuICAgICAgICBiMDAgPSBhMDAgKiBhMTEgLSBhMDEgKiBhMTAsXG4gICAgICAgIGIwMSA9IGEwMCAqIGExMiAtIGEwMiAqIGExMCxcbiAgICAgICAgYjAyID0gYTAwICogYTEzIC0gYTAzICogYTEwLFxuICAgICAgICBiMDMgPSBhMDEgKiBhMTIgLSBhMDIgKiBhMTEsXG4gICAgICAgIGIwNCA9IGEwMSAqIGExMyAtIGEwMyAqIGExMSxcbiAgICAgICAgYjA1ID0gYTAyICogYTEzIC0gYTAzICogYTEyLFxuICAgICAgICBiMDYgPSBhMjAgKiBhMzEgLSBhMjEgKiBhMzAsXG4gICAgICAgIGIwNyA9IGEyMCAqIGEzMiAtIGEyMiAqIGEzMCxcbiAgICAgICAgYjA4ID0gYTIwICogYTMzIC0gYTIzICogYTMwLFxuICAgICAgICBiMDkgPSBhMjEgKiBhMzIgLSBhMjIgKiBhMzEsXG4gICAgICAgIGIxMCA9IGEyMSAqIGEzMyAtIGEyMyAqIGEzMSxcbiAgICAgICAgYjExID0gYTIyICogYTMzIC0gYTIzICogYTMyO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHRoZSBkZXRlcm1pbmFudFxuICAgIHJldHVybiBiMDAgKiBiMTEgLSBiMDEgKiBiMTAgKyBiMDIgKiBiMDkgKyBiMDMgKiBiMDggLSBiMDQgKiBiMDcgKyBiMDUgKiBiMDY7XG59O1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDQncyBleHBsaWNpdGx5IHVzaW5nIFNJTURcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kLCBtdXN0IGJlIGEgRmxvYXQzMkFycmF5XG4gKiBAcGFyYW0ge21hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kLCBtdXN0IGJlIGEgRmxvYXQzMkFycmF5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuU0lNRC5tdWx0aXBseSA9IGZ1bmN0aW9uIChvdXQsIGEsIGIpIHtcbiAgICB2YXIgYTAgPSBTSU1ELkZsb2F0MzJ4NC5sb2FkKGEsIDApO1xuICAgIHZhciBhMSA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgNCk7XG4gICAgdmFyIGEyID0gU0lNRC5GbG9hdDMyeDQubG9hZChhLCA4KTtcbiAgICB2YXIgYTMgPSBTSU1ELkZsb2F0MzJ4NC5sb2FkKGEsIDEyKTtcblxuICAgIHZhciBiMCA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYiwgMCk7XG4gICAgdmFyIG91dDAgPSBTSU1ELkZsb2F0MzJ4NC5hZGQoXG4gICAgICAgICAgICAgICAgICAgU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUoYjAsIDAsIDAsIDAsIDApLCBhMCksXG4gICAgICAgICAgICAgICAgICAgU0lNRC5GbG9hdDMyeDQuYWRkKFxuICAgICAgICAgICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5tdWwoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShiMCwgMSwgMSwgMSwgMSksIGExKSxcbiAgICAgICAgICAgICAgICAgICAgICAgU0lNRC5GbG9hdDMyeDQuYWRkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUoYjAsIDIsIDIsIDIsIDIpLCBhMiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5tdWwoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShiMCwgMywgMywgMywgMyksIGEzKSkpKTtcbiAgICBTSU1ELkZsb2F0MzJ4NC5zdG9yZShvdXQsIDAsIG91dDApO1xuXG4gICAgdmFyIGIxID0gU0lNRC5GbG9hdDMyeDQubG9hZChiLCA0KTtcbiAgICB2YXIgb3V0MSA9IFNJTUQuRmxvYXQzMng0LmFkZChcbiAgICAgICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5tdWwoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShiMSwgMCwgMCwgMCwgMCksIGEwKSxcbiAgICAgICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5hZGQoXG4gICAgICAgICAgICAgICAgICAgICAgIFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGIxLCAxLCAxLCAxLCAxKSwgYTEpLFxuICAgICAgICAgICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5hZGQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5tdWwoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShiMSwgMiwgMiwgMiwgMiksIGEyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGIxLCAzLCAzLCAzLCAzKSwgYTMpKSkpO1xuICAgIFNJTUQuRmxvYXQzMng0LnN0b3JlKG91dCwgNCwgb3V0MSk7XG5cbiAgICB2YXIgYjIgPSBTSU1ELkZsb2F0MzJ4NC5sb2FkKGIsIDgpO1xuICAgIHZhciBvdXQyID0gU0lNRC5GbG9hdDMyeDQuYWRkKFxuICAgICAgICAgICAgICAgICAgIFNJTUQuRmxvYXQzMng0Lm11bChTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKGIyLCAwLCAwLCAwLCAwKSwgYTApLFxuICAgICAgICAgICAgICAgICAgIFNJTUQuRmxvYXQzMng0LmFkZChcbiAgICAgICAgICAgICAgICAgICAgICAgU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUoYjIsIDEsIDEsIDEsIDEpLCBhMSksXG4gICAgICAgICAgICAgICAgICAgICAgIFNJTUQuRmxvYXQzMng0LmFkZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5tdWwoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShiMiwgMiwgMiwgMiwgMiksIGEyKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5tdWwoU0lNRC5GbG9hdDMyeDQuc3dpenpsZShiMiwgMywgMywgMywgMyksIGEzKSkpKTtcbiAgICBTSU1ELkZsb2F0MzJ4NC5zdG9yZShvdXQsIDgsIG91dDIpO1xuXG4gICAgdmFyIGIzID0gU0lNRC5GbG9hdDMyeDQubG9hZChiLCAxMik7XG4gICAgdmFyIG91dDMgPSBTSU1ELkZsb2F0MzJ4NC5hZGQoXG4gICAgICAgICAgICAgICAgICAgU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUoYjMsIDAsIDAsIDAsIDApLCBhMCksXG4gICAgICAgICAgICAgICAgICAgU0lNRC5GbG9hdDMyeDQuYWRkKFxuICAgICAgICAgICAgICAgICAgICAgICAgU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUoYjMsIDEsIDEsIDEsIDEpLCBhMSksXG4gICAgICAgICAgICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5hZGQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUoYjMsIDIsIDIsIDIsIDIpLCBhMiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgU0lNRC5GbG9hdDMyeDQubXVsKFNJTUQuRmxvYXQzMng0LnN3aXp6bGUoYjMsIDMsIDMsIDMsIDMpLCBhMykpKSk7XG4gICAgU0lNRC5GbG9hdDMyeDQuc3RvcmUob3V0LCAxMiwgb3V0Myk7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byBtYXQ0J3MgZXhwbGljaXRseSBub3QgdXNpbmcgU0lNRFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5zY2FsYXIubXVsdGlwbHkgPSBmdW5jdGlvbiAob3V0LCBhLCBiKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGEwMyA9IGFbM10sXG4gICAgICAgIGExMCA9IGFbNF0sIGExMSA9IGFbNV0sIGExMiA9IGFbNl0sIGExMyA9IGFbN10sXG4gICAgICAgIGEyMCA9IGFbOF0sIGEyMSA9IGFbOV0sIGEyMiA9IGFbMTBdLCBhMjMgPSBhWzExXSxcbiAgICAgICAgYTMwID0gYVsxMl0sIGEzMSA9IGFbMTNdLCBhMzIgPSBhWzE0XSwgYTMzID0gYVsxNV07XG5cbiAgICAvLyBDYWNoZSBvbmx5IHRoZSBjdXJyZW50IGxpbmUgb2YgdGhlIHNlY29uZCBtYXRyaXhcbiAgICB2YXIgYjAgID0gYlswXSwgYjEgPSBiWzFdLCBiMiA9IGJbMl0sIGIzID0gYlszXTtcbiAgICBvdXRbMF0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzFdID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxO1xuICAgIG91dFsyXSA9IGIwKmEwMiArIGIxKmExMiArIGIyKmEyMiArIGIzKmEzMjtcbiAgICBvdXRbM10gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbNF07IGIxID0gYls1XTsgYjIgPSBiWzZdOyBiMyA9IGJbN107XG4gICAgb3V0WzRdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFs1XSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbNl0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjIgKyBiMyphMzI7XG4gICAgb3V0WzddID0gYjAqYTAzICsgYjEqYTEzICsgYjIqYTIzICsgYjMqYTMzO1xuXG4gICAgYjAgPSBiWzhdOyBiMSA9IGJbOV07IGIyID0gYlsxMF07IGIzID0gYlsxMV07XG4gICAgb3V0WzhdID0gYjAqYTAwICsgYjEqYTEwICsgYjIqYTIwICsgYjMqYTMwO1xuICAgIG91dFs5XSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbMTBdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFsxMV0gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbMTJdOyBiMSA9IGJbMTNdOyBiMiA9IGJbMTRdOyBiMyA9IGJbMTVdO1xuICAgIG91dFsxMl0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzEzXSA9IGIwKmEwMSArIGIxKmExMSArIGIyKmEyMSArIGIzKmEzMTtcbiAgICBvdXRbMTRdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFsxNV0gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gbWF0NCdzIHVzaW5nIFNJTUQgaWYgYXZhaWxhYmxlIGFuZCBlbmFibGVkXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHttYXQ0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0Lm11bHRpcGx5ID0gZ2xNYXRyaXguVVNFX1NJTUQgPyBtYXQ0LlNJTUQubXVsdGlwbHkgOiBtYXQ0LnNjYWxhci5tdWx0aXBseTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIG1hdDQubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xubWF0NC5tdWwgPSBtYXQ0Lm11bHRpcGx5O1xuXG4vKipcbiAqIFRyYW5zbGF0ZSBhIG1hdDQgYnkgdGhlIGdpdmVuIHZlY3RvciBub3QgdXNpbmcgU0lNRFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byB0cmFuc2xhdGVcbiAqIEBwYXJhbSB7dmVjM30gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuc2NhbGFyLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uIChvdXQsIGEsIHYpIHtcbiAgICB2YXIgeCA9IHZbMF0sIHkgPSB2WzFdLCB6ID0gdlsyXSxcbiAgICAgICAgYTAwLCBhMDEsIGEwMiwgYTAzLFxuICAgICAgICBhMTAsIGExMSwgYTEyLCBhMTMsXG4gICAgICAgIGEyMCwgYTIxLCBhMjIsIGEyMztcblxuICAgIGlmIChhID09PSBvdXQpIHtcbiAgICAgICAgb3V0WzEyXSA9IGFbMF0gKiB4ICsgYVs0XSAqIHkgKyBhWzhdICogeiArIGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYVsxXSAqIHggKyBhWzVdICogeSArIGFbOV0gKiB6ICsgYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhWzJdICogeCArIGFbNl0gKiB5ICsgYVsxMF0gKiB6ICsgYVsxNF07XG4gICAgICAgIG91dFsxNV0gPSBhWzNdICogeCArIGFbN10gKiB5ICsgYVsxMV0gKiB6ICsgYVsxNV07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYTAwID0gYVswXTsgYTAxID0gYVsxXTsgYTAyID0gYVsyXTsgYTAzID0gYVszXTtcbiAgICAgICAgYTEwID0gYVs0XTsgYTExID0gYVs1XTsgYTEyID0gYVs2XTsgYTEzID0gYVs3XTtcbiAgICAgICAgYTIwID0gYVs4XTsgYTIxID0gYVs5XTsgYTIyID0gYVsxMF07IGEyMyA9IGFbMTFdO1xuXG4gICAgICAgIG91dFswXSA9IGEwMDsgb3V0WzFdID0gYTAxOyBvdXRbMl0gPSBhMDI7IG91dFszXSA9IGEwMztcbiAgICAgICAgb3V0WzRdID0gYTEwOyBvdXRbNV0gPSBhMTE7IG91dFs2XSA9IGExMjsgb3V0WzddID0gYTEzO1xuICAgICAgICBvdXRbOF0gPSBhMjA7IG91dFs5XSA9IGEyMTsgb3V0WzEwXSA9IGEyMjsgb3V0WzExXSA9IGEyMztcblxuICAgICAgICBvdXRbMTJdID0gYTAwICogeCArIGExMCAqIHkgKyBhMjAgKiB6ICsgYVsxMl07XG4gICAgICAgIG91dFsxM10gPSBhMDEgKiB4ICsgYTExICogeSArIGEyMSAqIHogKyBhWzEzXTtcbiAgICAgICAgb3V0WzE0XSA9IGEwMiAqIHggKyBhMTIgKiB5ICsgYTIyICogeiArIGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYTAzICogeCArIGExMyAqIHkgKyBhMjMgKiB6ICsgYVsxNV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNsYXRlcyBhIG1hdDQgYnkgdGhlIGdpdmVuIHZlY3RvciB1c2luZyBTSU1EXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHRyYW5zbGF0ZVxuICogQHBhcmFtIHt2ZWMzfSB2IHZlY3RvciB0byB0cmFuc2xhdGUgYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5TSU1ELnRyYW5zbGF0ZSA9IGZ1bmN0aW9uIChvdXQsIGEsIHYpIHtcbiAgICB2YXIgYTAgPSBTSU1ELkZsb2F0MzJ4NC5sb2FkKGEsIDApLFxuICAgICAgICBhMSA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgNCksXG4gICAgICAgIGEyID0gU0lNRC5GbG9hdDMyeDQubG9hZChhLCA4KSxcbiAgICAgICAgYTMgPSBTSU1ELkZsb2F0MzJ4NC5sb2FkKGEsIDEyKSxcbiAgICAgICAgdmVjID0gU0lNRC5GbG9hdDMyeDQodlswXSwgdlsxXSwgdlsyXSAsIDApO1xuXG4gICAgaWYgKGEgIT09IG91dCkge1xuICAgICAgICBvdXRbMF0gPSBhWzBdOyBvdXRbMV0gPSBhWzFdOyBvdXRbMl0gPSBhWzJdOyBvdXRbM10gPSBhWzNdO1xuICAgICAgICBvdXRbNF0gPSBhWzRdOyBvdXRbNV0gPSBhWzVdOyBvdXRbNl0gPSBhWzZdOyBvdXRbN10gPSBhWzddO1xuICAgICAgICBvdXRbOF0gPSBhWzhdOyBvdXRbOV0gPSBhWzldOyBvdXRbMTBdID0gYVsxMF07IG91dFsxMV0gPSBhWzExXTtcbiAgICB9XG5cbiAgICBhMCA9IFNJTUQuRmxvYXQzMng0Lm11bChhMCwgU0lNRC5GbG9hdDMyeDQuc3dpenpsZSh2ZWMsIDAsIDAsIDAsIDApKTtcbiAgICBhMSA9IFNJTUQuRmxvYXQzMng0Lm11bChhMSwgU0lNRC5GbG9hdDMyeDQuc3dpenpsZSh2ZWMsIDEsIDEsIDEsIDEpKTtcbiAgICBhMiA9IFNJTUQuRmxvYXQzMng0Lm11bChhMiwgU0lNRC5GbG9hdDMyeDQuc3dpenpsZSh2ZWMsIDIsIDIsIDIsIDIpKTtcblxuICAgIHZhciB0MCA9IFNJTUQuRmxvYXQzMng0LmFkZChhMCwgU0lNRC5GbG9hdDMyeDQuYWRkKGExLCBTSU1ELkZsb2F0MzJ4NC5hZGQoYTIsIGEzKSkpO1xuICAgIFNJTUQuRmxvYXQzMng0LnN0b3JlKG91dCwgMTIsIHQwKTtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zbGF0ZXMgYSBtYXQ0IGJ5IHRoZSBnaXZlbiB2ZWN0b3IgdXNpbmcgU0lNRCBpZiBhdmFpbGFibGUgYW5kIGVuYWJsZWRcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gdHJhbnNsYXRlXG4gKiBAcGFyYW0ge3ZlYzN9IHYgdmVjdG9yIHRvIHRyYW5zbGF0ZSBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LnRyYW5zbGF0ZSA9IGdsTWF0cml4LlVTRV9TSU1EID8gbWF0NC5TSU1ELnRyYW5zbGF0ZSA6IG1hdDQuc2NhbGFyLnRyYW5zbGF0ZTtcblxuLyoqXG4gKiBTY2FsZXMgdGhlIG1hdDQgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzMgbm90IHVzaW5nIHZlY3Rvcml6YXRpb25cbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcbiAqIEBwYXJhbSB7dmVjM30gdiB0aGUgdmVjMyB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKiovXG5tYXQ0LnNjYWxhci5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgdikge1xuICAgIHZhciB4ID0gdlswXSwgeSA9IHZbMV0sIHogPSB2WzJdO1xuXG4gICAgb3V0WzBdID0gYVswXSAqIHg7XG4gICAgb3V0WzFdID0gYVsxXSAqIHg7XG4gICAgb3V0WzJdID0gYVsyXSAqIHg7XG4gICAgb3V0WzNdID0gYVszXSAqIHg7XG4gICAgb3V0WzRdID0gYVs0XSAqIHk7XG4gICAgb3V0WzVdID0gYVs1XSAqIHk7XG4gICAgb3V0WzZdID0gYVs2XSAqIHk7XG4gICAgb3V0WzddID0gYVs3XSAqIHk7XG4gICAgb3V0WzhdID0gYVs4XSAqIHo7XG4gICAgb3V0WzldID0gYVs5XSAqIHo7XG4gICAgb3V0WzEwXSA9IGFbMTBdICogejtcbiAgICBvdXRbMTFdID0gYVsxMV0gKiB6O1xuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTY2FsZXMgdGhlIG1hdDQgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzMgdXNpbmcgdmVjdG9yaXphdGlvblxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byBzY2FsZVxuICogQHBhcmFtIHt2ZWMzfSB2IHRoZSB2ZWMzIHRvIHNjYWxlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqKi9cbm1hdDQuU0lNRC5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgdikge1xuICAgIHZhciBhMCwgYTEsIGEyO1xuICAgIHZhciB2ZWMgPSBTSU1ELkZsb2F0MzJ4NCh2WzBdLCB2WzFdLCB2WzJdLCAwKTtcblxuICAgIGEwID0gU0lNRC5GbG9hdDMyeDQubG9hZChhLCAwKTtcbiAgICBTSU1ELkZsb2F0MzJ4NC5zdG9yZShcbiAgICAgICAgb3V0LCAwLCBTSU1ELkZsb2F0MzJ4NC5tdWwoYTAsIFNJTUQuRmxvYXQzMng0LnN3aXp6bGUodmVjLCAwLCAwLCAwLCAwKSkpO1xuXG4gICAgYTEgPSBTSU1ELkZsb2F0MzJ4NC5sb2FkKGEsIDQpO1xuICAgIFNJTUQuRmxvYXQzMng0LnN0b3JlKFxuICAgICAgICBvdXQsIDQsIFNJTUQuRmxvYXQzMng0Lm11bChhMSwgU0lNRC5GbG9hdDMyeDQuc3dpenpsZSh2ZWMsIDEsIDEsIDEsIDEpKSk7XG5cbiAgICBhMiA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgOCk7XG4gICAgU0lNRC5GbG9hdDMyeDQuc3RvcmUoXG4gICAgICAgIG91dCwgOCwgU0lNRC5GbG9hdDMyeDQubXVsKGEyLCBTSU1ELkZsb2F0MzJ4NC5zd2l6emxlKHZlYywgMiwgMiwgMiwgMikpKTtcblxuICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM107XG4gICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTY2FsZXMgdGhlIG1hdDQgYnkgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGdpdmVuIHZlYzMgdXNpbmcgU0lNRCBpZiBhdmFpbGFibGUgYW5kIGVuYWJsZWRcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gc2NhbGVcbiAqIEBwYXJhbSB7dmVjM30gdiB0aGUgdmVjMyB0byBzY2FsZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuc2NhbGUgPSBnbE1hdHJpeC5VU0VfU0lNRCA/IG1hdDQuU0lNRC5zY2FsZSA6IG1hdDQuc2NhbGFyLnNjYWxlO1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXQ0IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIGdpdmVuIGF4aXNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHBhcmFtIHt2ZWMzfSBheGlzIHRoZSBheGlzIHRvIHJvdGF0ZSBhcm91bmRcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5yb3RhdGUgPSBmdW5jdGlvbiAob3V0LCBhLCByYWQsIGF4aXMpIHtcbiAgICB2YXIgeCA9IGF4aXNbMF0sIHkgPSBheGlzWzFdLCB6ID0gYXhpc1syXSxcbiAgICAgICAgbGVuID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkgKyB6ICogeiksXG4gICAgICAgIHMsIGMsIHQsXG4gICAgICAgIGEwMCwgYTAxLCBhMDIsIGEwMyxcbiAgICAgICAgYTEwLCBhMTEsIGExMiwgYTEzLFxuICAgICAgICBhMjAsIGEyMSwgYTIyLCBhMjMsXG4gICAgICAgIGIwMCwgYjAxLCBiMDIsXG4gICAgICAgIGIxMCwgYjExLCBiMTIsXG4gICAgICAgIGIyMCwgYjIxLCBiMjI7XG5cbiAgICBpZiAoTWF0aC5hYnMobGVuKSA8IGdsTWF0cml4LkVQU0lMT04pIHsgcmV0dXJuIG51bGw7IH1cblxuICAgIGxlbiA9IDEgLyBsZW47XG4gICAgeCAqPSBsZW47XG4gICAgeSAqPSBsZW47XG4gICAgeiAqPSBsZW47XG5cbiAgICBzID0gTWF0aC5zaW4ocmFkKTtcbiAgICBjID0gTWF0aC5jb3MocmFkKTtcbiAgICB0ID0gMSAtIGM7XG5cbiAgICBhMDAgPSBhWzBdOyBhMDEgPSBhWzFdOyBhMDIgPSBhWzJdOyBhMDMgPSBhWzNdO1xuICAgIGExMCA9IGFbNF07IGExMSA9IGFbNV07IGExMiA9IGFbNl07IGExMyA9IGFbN107XG4gICAgYTIwID0gYVs4XTsgYTIxID0gYVs5XTsgYTIyID0gYVsxMF07IGEyMyA9IGFbMTFdO1xuXG4gICAgLy8gQ29uc3RydWN0IHRoZSBlbGVtZW50cyBvZiB0aGUgcm90YXRpb24gbWF0cml4XG4gICAgYjAwID0geCAqIHggKiB0ICsgYzsgYjAxID0geSAqIHggKiB0ICsgeiAqIHM7IGIwMiA9IHogKiB4ICogdCAtIHkgKiBzO1xuICAgIGIxMCA9IHggKiB5ICogdCAtIHogKiBzOyBiMTEgPSB5ICogeSAqIHQgKyBjOyBiMTIgPSB6ICogeSAqIHQgKyB4ICogcztcbiAgICBiMjAgPSB4ICogeiAqIHQgKyB5ICogczsgYjIxID0geSAqIHogKiB0IC0geCAqIHM7IGIyMiA9IHogKiB6ICogdCArIGM7XG5cbiAgICAvLyBQZXJmb3JtIHJvdGF0aW9uLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuICAgIG91dFswXSA9IGEwMCAqIGIwMCArIGExMCAqIGIwMSArIGEyMCAqIGIwMjtcbiAgICBvdXRbMV0gPSBhMDEgKiBiMDAgKyBhMTEgKiBiMDEgKyBhMjEgKiBiMDI7XG4gICAgb3V0WzJdID0gYTAyICogYjAwICsgYTEyICogYjAxICsgYTIyICogYjAyO1xuICAgIG91dFszXSA9IGEwMyAqIGIwMCArIGExMyAqIGIwMSArIGEyMyAqIGIwMjtcbiAgICBvdXRbNF0gPSBhMDAgKiBiMTAgKyBhMTAgKiBiMTEgKyBhMjAgKiBiMTI7XG4gICAgb3V0WzVdID0gYTAxICogYjEwICsgYTExICogYjExICsgYTIxICogYjEyO1xuICAgIG91dFs2XSA9IGEwMiAqIGIxMCArIGExMiAqIGIxMSArIGEyMiAqIGIxMjtcbiAgICBvdXRbN10gPSBhMDMgKiBiMTAgKyBhMTMgKiBiMTEgKyBhMjMgKiBiMTI7XG4gICAgb3V0WzhdID0gYTAwICogYjIwICsgYTEwICogYjIxICsgYTIwICogYjIyO1xuICAgIG91dFs5XSA9IGEwMSAqIGIyMCArIGExMSAqIGIyMSArIGEyMSAqIGIyMjtcbiAgICBvdXRbMTBdID0gYTAyICogYjIwICsgYTEyICogYjIxICsgYTIyICogYjIyO1xuICAgIG91dFsxMV0gPSBhMDMgKiBiMjAgKyBhMTMgKiBiMjEgKyBhMjMgKiBiMjI7XG5cbiAgICBpZiAoYSAhPT0gb3V0KSB7IC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIGxhc3Qgcm93XG4gICAgICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUm90YXRlcyBhIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBYIGF4aXMgbm90IHVzaW5nIFNJTURcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LnNjYWxhci5yb3RhdGVYID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkKSB7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgICBjID0gTWF0aC5jb3MocmFkKSxcbiAgICAgICAgYTEwID0gYVs0XSxcbiAgICAgICAgYTExID0gYVs1XSxcbiAgICAgICAgYTEyID0gYVs2XSxcbiAgICAgICAgYTEzID0gYVs3XSxcbiAgICAgICAgYTIwID0gYVs4XSxcbiAgICAgICAgYTIxID0gYVs5XSxcbiAgICAgICAgYTIyID0gYVsxMF0sXG4gICAgICAgIGEyMyA9IGFbMTFdO1xuXG4gICAgaWYgKGEgIT09IG91dCkgeyAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCByb3dzXG4gICAgICAgIG91dFswXSAgPSBhWzBdO1xuICAgICAgICBvdXRbMV0gID0gYVsxXTtcbiAgICAgICAgb3V0WzJdICA9IGFbMl07XG4gICAgICAgIG91dFszXSAgPSBhWzNdO1xuICAgICAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICAgICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuICAgIG91dFs0XSA9IGExMCAqIGMgKyBhMjAgKiBzO1xuICAgIG91dFs1XSA9IGExMSAqIGMgKyBhMjEgKiBzO1xuICAgIG91dFs2XSA9IGExMiAqIGMgKyBhMjIgKiBzO1xuICAgIG91dFs3XSA9IGExMyAqIGMgKyBhMjMgKiBzO1xuICAgIG91dFs4XSA9IGEyMCAqIGMgLSBhMTAgKiBzO1xuICAgIG91dFs5XSA9IGEyMSAqIGMgLSBhMTEgKiBzO1xuICAgIG91dFsxMF0gPSBhMjIgKiBjIC0gYTEyICogcztcbiAgICBvdXRbMTFdID0gYTIzICogYyAtIGExMyAqIHM7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUm90YXRlcyBhIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBYIGF4aXMgdXNpbmcgU0lNRFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuU0lNRC5yb3RhdGVYID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkKSB7XG4gICAgdmFyIHMgPSBTSU1ELkZsb2F0MzJ4NC5zcGxhdChNYXRoLnNpbihyYWQpKSxcbiAgICAgICAgYyA9IFNJTUQuRmxvYXQzMng0LnNwbGF0KE1hdGguY29zKHJhZCkpO1xuXG4gICAgaWYgKGEgIT09IG91dCkgeyAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCByb3dzXG4gICAgICBvdXRbMF0gID0gYVswXTtcbiAgICAgIG91dFsxXSAgPSBhWzFdO1xuICAgICAgb3V0WzJdICA9IGFbMl07XG4gICAgICBvdXRbM10gID0gYVszXTtcbiAgICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICB9XG5cbiAgICAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gICAgdmFyIGFfMSA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgNCk7XG4gICAgdmFyIGFfMiA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgOCk7XG4gICAgU0lNRC5GbG9hdDMyeDQuc3RvcmUob3V0LCA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgIFNJTUQuRmxvYXQzMng0LmFkZChTSU1ELkZsb2F0MzJ4NC5tdWwoYV8xLCBjKSwgU0lNRC5GbG9hdDMyeDQubXVsKGFfMiwgcykpKTtcbiAgICBTSU1ELkZsb2F0MzJ4NC5zdG9yZShvdXQsIDgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgU0lNRC5GbG9hdDMyeDQuc3ViKFNJTUQuRmxvYXQzMng0Lm11bChhXzIsIGMpLCBTSU1ELkZsb2F0MzJ4NC5tdWwoYV8xLCBzKSkpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXRyaXggYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWCBheGlzIHVzaW5nIFNJTUQgaWYgYXZhaWxhYmUgYW5kIGVuYWJsZWRcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBtYXRyaXggdG8gcm90YXRlXG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LnJvdGF0ZVggPSBnbE1hdHJpeC5VU0VfU0lNRCA/IG1hdDQuU0lNRC5yb3RhdGVYIDogbWF0NC5zY2FsYXIucm90YXRlWDtcblxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFkgYXhpcyBub3QgdXNpbmcgU0lNRFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuc2NhbGFyLnJvdGF0ZVkgPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICB2YXIgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpLFxuICAgICAgICBhMDAgPSBhWzBdLFxuICAgICAgICBhMDEgPSBhWzFdLFxuICAgICAgICBhMDIgPSBhWzJdLFxuICAgICAgICBhMDMgPSBhWzNdLFxuICAgICAgICBhMjAgPSBhWzhdLFxuICAgICAgICBhMjEgPSBhWzldLFxuICAgICAgICBhMjIgPSBhWzEwXSxcbiAgICAgICAgYTIzID0gYVsxMV07XG5cbiAgICBpZiAoYSAhPT0gb3V0KSB7IC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIHJvd3NcbiAgICAgICAgb3V0WzRdICA9IGFbNF07XG4gICAgICAgIG91dFs1XSAgPSBhWzVdO1xuICAgICAgICBvdXRbNl0gID0gYVs2XTtcbiAgICAgICAgb3V0WzddICA9IGFbN107XG4gICAgICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICB9XG5cbiAgICAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gICAgb3V0WzBdID0gYTAwICogYyAtIGEyMCAqIHM7XG4gICAgb3V0WzFdID0gYTAxICogYyAtIGEyMSAqIHM7XG4gICAgb3V0WzJdID0gYTAyICogYyAtIGEyMiAqIHM7XG4gICAgb3V0WzNdID0gYTAzICogYyAtIGEyMyAqIHM7XG4gICAgb3V0WzhdID0gYTAwICogcyArIGEyMCAqIGM7XG4gICAgb3V0WzldID0gYTAxICogcyArIGEyMSAqIGM7XG4gICAgb3V0WzEwXSA9IGEwMiAqIHMgKyBhMjIgKiBjO1xuICAgIG91dFsxMV0gPSBhMDMgKiBzICsgYTIzICogYztcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFkgYXhpcyB1c2luZyBTSU1EXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5TSU1ELnJvdGF0ZVkgPSBmdW5jdGlvbiAob3V0LCBhLCByYWQpIHtcbiAgICB2YXIgcyA9IFNJTUQuRmxvYXQzMng0LnNwbGF0KE1hdGguc2luKHJhZCkpLFxuICAgICAgICBjID0gU0lNRC5GbG9hdDMyeDQuc3BsYXQoTWF0aC5jb3MocmFkKSk7XG5cbiAgICBpZiAoYSAhPT0gb3V0KSB7IC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIHJvd3NcbiAgICAgICAgb3V0WzRdICA9IGFbNF07XG4gICAgICAgIG91dFs1XSAgPSBhWzVdO1xuICAgICAgICBvdXRbNl0gID0gYVs2XTtcbiAgICAgICAgb3V0WzddICA9IGFbN107XG4gICAgICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICB9XG5cbiAgICAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gICAgdmFyIGFfMCA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgMCk7XG4gICAgdmFyIGFfMiA9IFNJTUQuRmxvYXQzMng0LmxvYWQoYSwgOCk7XG4gICAgU0lNRC5GbG9hdDMyeDQuc3RvcmUob3V0LCAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgIFNJTUQuRmxvYXQzMng0LnN1YihTSU1ELkZsb2F0MzJ4NC5tdWwoYV8wLCBjKSwgU0lNRC5GbG9hdDMyeDQubXVsKGFfMiwgcykpKTtcbiAgICBTSU1ELkZsb2F0MzJ4NC5zdG9yZShvdXQsIDgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgU0lNRC5GbG9hdDMyeDQuYWRkKFNJTUQuRmxvYXQzMng0Lm11bChhXzAsIHMpLCBTSU1ELkZsb2F0MzJ4NC5tdWwoYV8yLCBjKSkpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXRyaXggYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWSBheGlzIGlmIFNJTUQgYXZhaWxhYmxlIGFuZCBlbmFibGVkXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuIG1hdDQucm90YXRlWSA9IGdsTWF0cml4LlVTRV9TSU1EID8gbWF0NC5TSU1ELnJvdGF0ZVkgOiBtYXQ0LnNjYWxhci5yb3RhdGVZO1xuXG4vKipcbiAqIFJvdGF0ZXMgYSBtYXRyaXggYnkgdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWiBheGlzIG5vdCB1c2luZyBTSU1EXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5zY2FsYXIucm90YXRlWiA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHZhciBzID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgICAgYyA9IE1hdGguY29zKHJhZCksXG4gICAgICAgIGEwMCA9IGFbMF0sXG4gICAgICAgIGEwMSA9IGFbMV0sXG4gICAgICAgIGEwMiA9IGFbMl0sXG4gICAgICAgIGEwMyA9IGFbM10sXG4gICAgICAgIGExMCA9IGFbNF0sXG4gICAgICAgIGExMSA9IGFbNV0sXG4gICAgICAgIGExMiA9IGFbNl0sXG4gICAgICAgIGExMyA9IGFbN107XG5cbiAgICBpZiAoYSAhPT0gb3V0KSB7IC8vIElmIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRpZmZlciwgY29weSB0aGUgdW5jaGFuZ2VkIGxhc3Qgcm93XG4gICAgICAgIG91dFs4XSAgPSBhWzhdO1xuICAgICAgICBvdXRbOV0gID0gYVs5XTtcbiAgICAgICAgb3V0WzEwXSA9IGFbMTBdO1xuICAgICAgICBvdXRbMTFdID0gYVsxMV07XG4gICAgICAgIG91dFsxMl0gPSBhWzEyXTtcbiAgICAgICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgICAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgICAgIG91dFsxNV0gPSBhWzE1XTtcbiAgICB9XG5cbiAgICAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gICAgb3V0WzBdID0gYTAwICogYyArIGExMCAqIHM7XG4gICAgb3V0WzFdID0gYTAxICogYyArIGExMSAqIHM7XG4gICAgb3V0WzJdID0gYTAyICogYyArIGExMiAqIHM7XG4gICAgb3V0WzNdID0gYTAzICogYyArIGExMyAqIHM7XG4gICAgb3V0WzRdID0gYTEwICogYyAtIGEwMCAqIHM7XG4gICAgb3V0WzVdID0gYTExICogYyAtIGEwMSAqIHM7XG4gICAgb3V0WzZdID0gYTEyICogYyAtIGEwMiAqIHM7XG4gICAgb3V0WzddID0gYTEzICogYyAtIGEwMyAqIHM7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUm90YXRlcyBhIG1hdHJpeCBieSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBaIGF4aXMgdXNpbmcgU0lNRFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuU0lNRC5yb3RhdGVaID0gZnVuY3Rpb24gKG91dCwgYSwgcmFkKSB7XG4gICAgdmFyIHMgPSBTSU1ELkZsb2F0MzJ4NC5zcGxhdChNYXRoLnNpbihyYWQpKSxcbiAgICAgICAgYyA9IFNJTUQuRmxvYXQzMng0LnNwbGF0KE1hdGguY29zKHJhZCkpO1xuXG4gICAgaWYgKGEgIT09IG91dCkgeyAvLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkaWZmZXIsIGNvcHkgdGhlIHVuY2hhbmdlZCBsYXN0IHJvd1xuICAgICAgICBvdXRbOF0gID0gYVs4XTtcbiAgICAgICAgb3V0WzldICA9IGFbOV07XG4gICAgICAgIG91dFsxMF0gPSBhWzEwXTtcbiAgICAgICAgb3V0WzExXSA9IGFbMTFdO1xuICAgICAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICAgICAgb3V0WzE0XSA9IGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgfVxuXG4gICAgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuICAgIHZhciBhXzAgPSBTSU1ELkZsb2F0MzJ4NC5sb2FkKGEsIDApO1xuICAgIHZhciBhXzEgPSBTSU1ELkZsb2F0MzJ4NC5sb2FkKGEsIDQpO1xuICAgIFNJTUQuRmxvYXQzMng0LnN0b3JlKG91dCwgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICBTSU1ELkZsb2F0MzJ4NC5hZGQoU0lNRC5GbG9hdDMyeDQubXVsKGFfMCwgYyksIFNJTUQuRmxvYXQzMng0Lm11bChhXzEsIHMpKSk7XG4gICAgU0lNRC5GbG9hdDMyeDQuc3RvcmUob3V0LCA0LFxuICAgICAgICAgICAgICAgICAgICAgICAgIFNJTUQuRmxvYXQzMng0LnN1YihTSU1ELkZsb2F0MzJ4NC5tdWwoYV8xLCBjKSwgU0lNRC5GbG9hdDMyeDQubXVsKGFfMCwgcykpKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgbWF0cml4IGJ5IHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFogYXhpcyBpZiBTSU1EIGF2YWlsYWJsZSBhbmQgZW5hYmxlZFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byByb3RhdGVcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbiBtYXQ0LnJvdGF0ZVogPSBnbE1hdHJpeC5VU0VfU0lNRCA/IG1hdDQuU0lNRC5yb3RhdGVaIDogbWF0NC5zY2FsYXIucm90YXRlWjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3IgdHJhbnNsYXRpb25cbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIGRlc3QsIHZlYyk7XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHt2ZWMzfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmZyb21UcmFuc2xhdGlvbiA9IGZ1bmN0aW9uKG91dCwgdikge1xuICAgIG91dFswXSA9IDE7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSAxO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAwO1xuICAgIG91dFs5XSA9IDA7XG4gICAgb3V0WzEwXSA9IDE7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IHZbMF07XG4gICAgb3V0WzEzXSA9IHZbMV07XG4gICAgb3V0WzE0XSA9IHZbMl07XG4gICAgb3V0WzE1XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSB2ZWN0b3Igc2NhbGluZ1xuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC5zY2FsZShkZXN0LCBkZXN0LCB2ZWMpO1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7dmVjM30gdiBTY2FsaW5nIHZlY3RvclxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmZyb21TY2FsaW5nID0gZnVuY3Rpb24ob3V0LCB2KSB7XG4gICAgb3V0WzBdID0gdlswXTtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IHZbMV07XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gdlsyXTtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIGdpdmVuIGFuZ2xlIGFyb3VuZCBhIGdpdmVuIGF4aXNcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDQucm90YXRlKGRlc3QsIGRlc3QsIHJhZCwgYXhpcyk7XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEBwYXJhbSB7dmVjM30gYXhpcyB0aGUgYXhpcyB0byByb3RhdGUgYXJvdW5kXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuZnJvbVJvdGF0aW9uID0gZnVuY3Rpb24ob3V0LCByYWQsIGF4aXMpIHtcbiAgICB2YXIgeCA9IGF4aXNbMF0sIHkgPSBheGlzWzFdLCB6ID0gYXhpc1syXSxcbiAgICAgICAgbGVuID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkgKyB6ICogeiksXG4gICAgICAgIHMsIGMsIHQ7XG5cbiAgICBpZiAoTWF0aC5hYnMobGVuKSA8IGdsTWF0cml4LkVQU0lMT04pIHsgcmV0dXJuIG51bGw7IH1cblxuICAgIGxlbiA9IDEgLyBsZW47XG4gICAgeCAqPSBsZW47XG4gICAgeSAqPSBsZW47XG4gICAgeiAqPSBsZW47XG5cbiAgICBzID0gTWF0aC5zaW4ocmFkKTtcbiAgICBjID0gTWF0aC5jb3MocmFkKTtcbiAgICB0ID0gMSAtIGM7XG5cbiAgICAvLyBQZXJmb3JtIHJvdGF0aW9uLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuICAgIG91dFswXSA9IHggKiB4ICogdCArIGM7XG4gICAgb3V0WzFdID0geSAqIHggKiB0ICsgeiAqIHM7XG4gICAgb3V0WzJdID0geiAqIHggKiB0IC0geSAqIHM7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSB4ICogeSAqIHQgLSB6ICogcztcbiAgICBvdXRbNV0gPSB5ICogeSAqIHQgKyBjO1xuICAgIG91dFs2XSA9IHogKiB5ICogdCArIHggKiBzO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0geCAqIHogKiB0ICsgeSAqIHM7XG4gICAgb3V0WzldID0geSAqIHogKiB0IC0geCAqIHM7XG4gICAgb3V0WzEwXSA9IHogKiB6ICogdCArIGM7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9IDA7XG4gICAgb3V0WzE1XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gdGhlIGdpdmVuIGFuZ2xlIGFyb3VuZCB0aGUgWCBheGlzXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnJvdGF0ZVgoZGVzdCwgZGVzdCwgcmFkKTtcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IHJlY2VpdmluZyBvcGVyYXRpb24gcmVzdWx0XG4gKiBAcGFyYW0ge051bWJlcn0gcmFkIHRoZSBhbmdsZSB0byByb3RhdGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmZyb21YUm90YXRpb24gPSBmdW5jdGlvbihvdXQsIHJhZCkge1xuICAgIHZhciBzID0gTWF0aC5zaW4ocmFkKSxcbiAgICAgICAgYyA9IE1hdGguY29zKHJhZCk7XG5cbiAgICAvLyBQZXJmb3JtIGF4aXMtc3BlY2lmaWMgbWF0cml4IG11bHRpcGxpY2F0aW9uXG4gICAgb3V0WzBdICA9IDE7XG4gICAgb3V0WzFdICA9IDA7XG4gICAgb3V0WzJdICA9IDA7XG4gICAgb3V0WzNdICA9IDA7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSBjO1xuICAgIG91dFs2XSA9IHM7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAwO1xuICAgIG91dFs5XSA9IC1zO1xuICAgIG91dFsxMF0gPSBjO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAwO1xuICAgIG91dFsxNV0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG1hdHJpeCBmcm9tIHRoZSBnaXZlbiBhbmdsZSBhcm91bmQgdGhlIFkgYXhpc1xuICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIChidXQgbXVjaCBmYXN0ZXIgdGhhbik6XG4gKlxuICogICAgIG1hdDQuaWRlbnRpdHkoZGVzdCk7XG4gKiAgICAgbWF0NC5yb3RhdGVZKGRlc3QsIGRlc3QsIHJhZCk7XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgdG8gcm90YXRlIHRoZSBtYXRyaXggYnlcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5mcm9tWVJvdGF0aW9uID0gZnVuY3Rpb24ob3V0LCByYWQpIHtcbiAgICB2YXIgcyA9IE1hdGguc2luKHJhZCksXG4gICAgICAgIGMgPSBNYXRoLmNvcyhyYWQpO1xuXG4gICAgLy8gUGVyZm9ybSBheGlzLXNwZWNpZmljIG1hdHJpeCBtdWx0aXBsaWNhdGlvblxuICAgIG91dFswXSAgPSBjO1xuICAgIG91dFsxXSAgPSAwO1xuICAgIG91dFsyXSAgPSAtcztcbiAgICBvdXRbM10gID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IDE7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IHM7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gYztcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gMDtcbiAgICBvdXRbMTVdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gYW5nbGUgYXJvdW5kIHRoZSBaIGF4aXNcbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDQucm90YXRlWihkZXN0LCBkZXN0LCByYWQpO1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7TnVtYmVyfSByYWQgdGhlIGFuZ2xlIHRvIHJvdGF0ZSB0aGUgbWF0cml4IGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuZnJvbVpSb3RhdGlvbiA9IGZ1bmN0aW9uKG91dCwgcmFkKSB7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQpLFxuICAgICAgICBjID0gTWF0aC5jb3MocmFkKTtcblxuICAgIC8vIFBlcmZvcm0gYXhpcy1zcGVjaWZpYyBtYXRyaXggbXVsdGlwbGljYXRpb25cbiAgICBvdXRbMF0gID0gYztcbiAgICBvdXRbMV0gID0gcztcbiAgICBvdXRbMl0gID0gMDtcbiAgICBvdXRbM10gID0gMDtcbiAgICBvdXRbNF0gPSAtcztcbiAgICBvdXRbNV0gPSBjO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAwO1xuICAgIG91dFs5XSA9IDA7XG4gICAgb3V0WzEwXSA9IDE7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9IDA7XG4gICAgb3V0WzE1XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBxdWF0ZXJuaW9uIHJvdGF0aW9uIGFuZCB2ZWN0b3IgdHJhbnNsYXRpb25cbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIHZlYyk7XG4gKiAgICAgdmFyIHF1YXRNYXQgPSBtYXQ0LmNyZWF0ZSgpO1xuICogICAgIHF1YXQ0LnRvTWF0NChxdWF0LCBxdWF0TWF0KTtcbiAqICAgICBtYXQ0Lm11bHRpcGx5KGRlc3QsIHF1YXRNYXQpO1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7cXVhdDR9IHEgUm90YXRpb24gcXVhdGVybmlvblxuICogQHBhcmFtIHt2ZWMzfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uID0gZnVuY3Rpb24gKG91dCwgcSwgdikge1xuICAgIC8vIFF1YXRlcm5pb24gbWF0aFxuICAgIHZhciB4ID0gcVswXSwgeSA9IHFbMV0sIHogPSBxWzJdLCB3ID0gcVszXSxcbiAgICAgICAgeDIgPSB4ICsgeCxcbiAgICAgICAgeTIgPSB5ICsgeSxcbiAgICAgICAgejIgPSB6ICsgeixcblxuICAgICAgICB4eCA9IHggKiB4MixcbiAgICAgICAgeHkgPSB4ICogeTIsXG4gICAgICAgIHh6ID0geCAqIHoyLFxuICAgICAgICB5eSA9IHkgKiB5MixcbiAgICAgICAgeXogPSB5ICogejIsXG4gICAgICAgIHp6ID0geiAqIHoyLFxuICAgICAgICB3eCA9IHcgKiB4MixcbiAgICAgICAgd3kgPSB3ICogeTIsXG4gICAgICAgIHd6ID0gdyAqIHoyO1xuXG4gICAgb3V0WzBdID0gMSAtICh5eSArIHp6KTtcbiAgICBvdXRbMV0gPSB4eSArIHd6O1xuICAgIG91dFsyXSA9IHh6IC0gd3k7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSB4eSAtIHd6O1xuICAgIG91dFs1XSA9IDEgLSAoeHggKyB6eik7XG4gICAgb3V0WzZdID0geXogKyB3eDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IHh6ICsgd3k7XG4gICAgb3V0WzldID0geXogLSB3eDtcbiAgICBvdXRbMTBdID0gMSAtICh4eCArIHl5KTtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gdlswXTtcbiAgICBvdXRbMTNdID0gdlsxXTtcbiAgICBvdXRbMTRdID0gdlsyXTtcbiAgICBvdXRbMTVdID0gMTtcblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHRyYW5zbGF0aW9uIHZlY3RvciBjb21wb25lbnQgb2YgYSB0cmFuc2Zvcm1hdGlvblxuICogIG1hdHJpeC4gSWYgYSBtYXRyaXggaXMgYnVpbHQgd2l0aCBmcm9tUm90YXRpb25UcmFuc2xhdGlvbixcbiAqICB0aGUgcmV0dXJuZWQgdmVjdG9yIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlIHRyYW5zbGF0aW9uIHZlY3RvclxuICogIG9yaWdpbmFsbHkgc3VwcGxpZWQuXG4gKiBAcGFyYW0gIHt2ZWMzfSBvdXQgVmVjdG9yIHRvIHJlY2VpdmUgdHJhbnNsYXRpb24gY29tcG9uZW50XG4gKiBAcGFyYW0gIHttYXQ0fSBtYXQgTWF0cml4IHRvIGJlIGRlY29tcG9zZWQgKGlucHV0KVxuICogQHJldHVybiB7dmVjM30gb3V0XG4gKi9cbm1hdDQuZ2V0VHJhbnNsYXRpb24gPSBmdW5jdGlvbiAob3V0LCBtYXQpIHtcbiAgb3V0WzBdID0gbWF0WzEyXTtcbiAgb3V0WzFdID0gbWF0WzEzXTtcbiAgb3V0WzJdID0gbWF0WzE0XTtcblxuICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgcXVhdGVybmlvbiByZXByZXNlbnRpbmcgdGhlIHJvdGF0aW9uYWwgY29tcG9uZW50XG4gKiAgb2YgYSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXguIElmIGEgbWF0cml4IGlzIGJ1aWx0IHdpdGhcbiAqICBmcm9tUm90YXRpb25UcmFuc2xhdGlvbiwgdGhlIHJldHVybmVkIHF1YXRlcm5pb24gd2lsbCBiZSB0aGVcbiAqICBzYW1lIGFzIHRoZSBxdWF0ZXJuaW9uIG9yaWdpbmFsbHkgc3VwcGxpZWQuXG4gKiBAcGFyYW0ge3F1YXR9IG91dCBRdWF0ZXJuaW9uIHRvIHJlY2VpdmUgdGhlIHJvdGF0aW9uIGNvbXBvbmVudFxuICogQHBhcmFtIHttYXQ0fSBtYXQgTWF0cml4IHRvIGJlIGRlY29tcG9zZWQgKGlucHV0KVxuICogQHJldHVybiB7cXVhdH0gb3V0XG4gKi9cbm1hdDQuZ2V0Um90YXRpb24gPSBmdW5jdGlvbiAob3V0LCBtYXQpIHtcbiAgLy8gQWxnb3JpdGhtIHRha2VuIGZyb20gaHR0cDovL3d3dy5ldWNsaWRlYW5zcGFjZS5jb20vbWF0aHMvZ2VvbWV0cnkvcm90YXRpb25zL2NvbnZlcnNpb25zL21hdHJpeFRvUXVhdGVybmlvbi9pbmRleC5odG1cbiAgdmFyIHRyYWNlID0gbWF0WzBdICsgbWF0WzVdICsgbWF0WzEwXTtcbiAgdmFyIFMgPSAwO1xuXG4gIGlmICh0cmFjZSA+IDApIHsgXG4gICAgUyA9IE1hdGguc3FydCh0cmFjZSArIDEuMCkgKiAyO1xuICAgIG91dFszXSA9IDAuMjUgKiBTO1xuICAgIG91dFswXSA9IChtYXRbNl0gLSBtYXRbOV0pIC8gUztcbiAgICBvdXRbMV0gPSAobWF0WzhdIC0gbWF0WzJdKSAvIFM7IFxuICAgIG91dFsyXSA9IChtYXRbMV0gLSBtYXRbNF0pIC8gUzsgXG4gIH0gZWxzZSBpZiAoKG1hdFswXSA+IG1hdFs1XSkmKG1hdFswXSA+IG1hdFsxMF0pKSB7IFxuICAgIFMgPSBNYXRoLnNxcnQoMS4wICsgbWF0WzBdIC0gbWF0WzVdIC0gbWF0WzEwXSkgKiAyO1xuICAgIG91dFszXSA9IChtYXRbNl0gLSBtYXRbOV0pIC8gUztcbiAgICBvdXRbMF0gPSAwLjI1ICogUztcbiAgICBvdXRbMV0gPSAobWF0WzFdICsgbWF0WzRdKSAvIFM7IFxuICAgIG91dFsyXSA9IChtYXRbOF0gKyBtYXRbMl0pIC8gUzsgXG4gIH0gZWxzZSBpZiAobWF0WzVdID4gbWF0WzEwXSkgeyBcbiAgICBTID0gTWF0aC5zcXJ0KDEuMCArIG1hdFs1XSAtIG1hdFswXSAtIG1hdFsxMF0pICogMjtcbiAgICBvdXRbM10gPSAobWF0WzhdIC0gbWF0WzJdKSAvIFM7XG4gICAgb3V0WzBdID0gKG1hdFsxXSArIG1hdFs0XSkgLyBTOyBcbiAgICBvdXRbMV0gPSAwLjI1ICogUztcbiAgICBvdXRbMl0gPSAobWF0WzZdICsgbWF0WzldKSAvIFM7IFxuICB9IGVsc2UgeyBcbiAgICBTID0gTWF0aC5zcXJ0KDEuMCArIG1hdFsxMF0gLSBtYXRbMF0gLSBtYXRbNV0pICogMjtcbiAgICBvdXRbM10gPSAobWF0WzFdIC0gbWF0WzRdKSAvIFM7XG4gICAgb3V0WzBdID0gKG1hdFs4XSArIG1hdFsyXSkgLyBTO1xuICAgIG91dFsxXSA9IChtYXRbNl0gKyBtYXRbOV0pIC8gUztcbiAgICBvdXRbMl0gPSAwLjI1ICogUztcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBtYXRyaXggZnJvbSBhIHF1YXRlcm5pb24gcm90YXRpb24sIHZlY3RvciB0cmFuc2xhdGlvbiBhbmQgdmVjdG9yIHNjYWxlXG4gKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGJ1dCBtdWNoIGZhc3RlciB0aGFuKTpcbiAqXG4gKiAgICAgbWF0NC5pZGVudGl0eShkZXN0KTtcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCB2ZWMpO1xuICogICAgIHZhciBxdWF0TWF0ID0gbWF0NC5jcmVhdGUoKTtcbiAqICAgICBxdWF0NC50b01hdDQocXVhdCwgcXVhdE1hdCk7XG4gKiAgICAgbWF0NC5tdWx0aXBseShkZXN0LCBxdWF0TWF0KTtcbiAqICAgICBtYXQ0LnNjYWxlKGRlc3QsIHNjYWxlKVxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7cXVhdDR9IHEgUm90YXRpb24gcXVhdGVybmlvblxuICogQHBhcmFtIHt2ZWMzfSB2IFRyYW5zbGF0aW9uIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBzIFNjYWxpbmcgdmVjdG9yXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQuZnJvbVJvdGF0aW9uVHJhbnNsYXRpb25TY2FsZSA9IGZ1bmN0aW9uIChvdXQsIHEsIHYsIHMpIHtcbiAgICAvLyBRdWF0ZXJuaW9uIG1hdGhcbiAgICB2YXIgeCA9IHFbMF0sIHkgPSBxWzFdLCB6ID0gcVsyXSwgdyA9IHFbM10sXG4gICAgICAgIHgyID0geCArIHgsXG4gICAgICAgIHkyID0geSArIHksXG4gICAgICAgIHoyID0geiArIHosXG5cbiAgICAgICAgeHggPSB4ICogeDIsXG4gICAgICAgIHh5ID0geCAqIHkyLFxuICAgICAgICB4eiA9IHggKiB6MixcbiAgICAgICAgeXkgPSB5ICogeTIsXG4gICAgICAgIHl6ID0geSAqIHoyLFxuICAgICAgICB6eiA9IHogKiB6MixcbiAgICAgICAgd3ggPSB3ICogeDIsXG4gICAgICAgIHd5ID0gdyAqIHkyLFxuICAgICAgICB3eiA9IHcgKiB6MixcbiAgICAgICAgc3ggPSBzWzBdLFxuICAgICAgICBzeSA9IHNbMV0sXG4gICAgICAgIHN6ID0gc1syXTtcblxuICAgIG91dFswXSA9ICgxIC0gKHl5ICsgenopKSAqIHN4O1xuICAgIG91dFsxXSA9ICh4eSArIHd6KSAqIHN4O1xuICAgIG91dFsyXSA9ICh4eiAtIHd5KSAqIHN4O1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gKHh5IC0gd3opICogc3k7XG4gICAgb3V0WzVdID0gKDEgLSAoeHggKyB6eikpICogc3k7XG4gICAgb3V0WzZdID0gKHl6ICsgd3gpICogc3k7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAoeHogKyB3eSkgKiBzejtcbiAgICBvdXRbOV0gPSAoeXogLSB3eCkgKiBzejtcbiAgICBvdXRbMTBdID0gKDEgLSAoeHggKyB5eSkpICogc3o7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IHZbMF07XG4gICAgb3V0WzEzXSA9IHZbMV07XG4gICAgb3V0WzE0XSA9IHZbMl07XG4gICAgb3V0WzE1XSA9IDE7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbWF0cml4IGZyb20gYSBxdWF0ZXJuaW9uIHJvdGF0aW9uLCB2ZWN0b3IgdHJhbnNsYXRpb24gYW5kIHZlY3RvciBzY2FsZSwgcm90YXRpbmcgYW5kIHNjYWxpbmcgYXJvdW5kIHRoZSBnaXZlbiBvcmlnaW5cbiAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byAoYnV0IG11Y2ggZmFzdGVyIHRoYW4pOlxuICpcbiAqICAgICBtYXQ0LmlkZW50aXR5KGRlc3QpO1xuICogICAgIG1hdDQudHJhbnNsYXRlKGRlc3QsIHZlYyk7XG4gKiAgICAgbWF0NC50cmFuc2xhdGUoZGVzdCwgb3JpZ2luKTtcbiAqICAgICB2YXIgcXVhdE1hdCA9IG1hdDQuY3JlYXRlKCk7XG4gKiAgICAgcXVhdDQudG9NYXQ0KHF1YXQsIHF1YXRNYXQpO1xuICogICAgIG1hdDQubXVsdGlwbHkoZGVzdCwgcXVhdE1hdCk7XG4gKiAgICAgbWF0NC5zY2FsZShkZXN0LCBzY2FsZSlcbiAqICAgICBtYXQ0LnRyYW5zbGF0ZShkZXN0LCBuZWdhdGl2ZU9yaWdpbik7XG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgbWF0NCByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuICogQHBhcmFtIHtxdWF0NH0gcSBSb3RhdGlvbiBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3ZlYzN9IHYgVHJhbnNsYXRpb24gdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IHMgU2NhbGluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gbyBUaGUgb3JpZ2luIHZlY3RvciBhcm91bmQgd2hpY2ggdG8gc2NhbGUgYW5kIHJvdGF0ZVxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0LmZyb21Sb3RhdGlvblRyYW5zbGF0aW9uU2NhbGVPcmlnaW4gPSBmdW5jdGlvbiAob3V0LCBxLCB2LCBzLCBvKSB7XG4gIC8vIFF1YXRlcm5pb24gbWF0aFxuICB2YXIgeCA9IHFbMF0sIHkgPSBxWzFdLCB6ID0gcVsyXSwgdyA9IHFbM10sXG4gICAgICB4MiA9IHggKyB4LFxuICAgICAgeTIgPSB5ICsgeSxcbiAgICAgIHoyID0geiArIHosXG5cbiAgICAgIHh4ID0geCAqIHgyLFxuICAgICAgeHkgPSB4ICogeTIsXG4gICAgICB4eiA9IHggKiB6MixcbiAgICAgIHl5ID0geSAqIHkyLFxuICAgICAgeXogPSB5ICogejIsXG4gICAgICB6eiA9IHogKiB6MixcbiAgICAgIHd4ID0gdyAqIHgyLFxuICAgICAgd3kgPSB3ICogeTIsXG4gICAgICB3eiA9IHcgKiB6MixcblxuICAgICAgc3ggPSBzWzBdLFxuICAgICAgc3kgPSBzWzFdLFxuICAgICAgc3ogPSBzWzJdLFxuXG4gICAgICBveCA9IG9bMF0sXG4gICAgICBveSA9IG9bMV0sXG4gICAgICBveiA9IG9bMl07XG5cbiAgb3V0WzBdID0gKDEgLSAoeXkgKyB6eikpICogc3g7XG4gIG91dFsxXSA9ICh4eSArIHd6KSAqIHN4O1xuICBvdXRbMl0gPSAoeHogLSB3eSkgKiBzeDtcbiAgb3V0WzNdID0gMDtcbiAgb3V0WzRdID0gKHh5IC0gd3opICogc3k7XG4gIG91dFs1XSA9ICgxIC0gKHh4ICsgenopKSAqIHN5O1xuICBvdXRbNl0gPSAoeXogKyB3eCkgKiBzeTtcbiAgb3V0WzddID0gMDtcbiAgb3V0WzhdID0gKHh6ICsgd3kpICogc3o7XG4gIG91dFs5XSA9ICh5eiAtIHd4KSAqIHN6O1xuICBvdXRbMTBdID0gKDEgLSAoeHggKyB5eSkpICogc3o7XG4gIG91dFsxMV0gPSAwO1xuICBvdXRbMTJdID0gdlswXSArIG94IC0gKG91dFswXSAqIG94ICsgb3V0WzRdICogb3kgKyBvdXRbOF0gKiBveik7XG4gIG91dFsxM10gPSB2WzFdICsgb3kgLSAob3V0WzFdICogb3ggKyBvdXRbNV0gKiBveSArIG91dFs5XSAqIG96KTtcbiAgb3V0WzE0XSA9IHZbMl0gKyBveiAtIChvdXRbMl0gKiBveCArIG91dFs2XSAqIG95ICsgb3V0WzEwXSAqIG96KTtcbiAgb3V0WzE1XSA9IDE7XG5cbiAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBhIDR4NCBtYXRyaXggZnJvbSB0aGUgZ2l2ZW4gcXVhdGVybmlvblxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7cXVhdH0gcSBRdWF0ZXJuaW9uIHRvIGNyZWF0ZSBtYXRyaXggZnJvbVxuICpcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5mcm9tUXVhdCA9IGZ1bmN0aW9uIChvdXQsIHEpIHtcbiAgICB2YXIgeCA9IHFbMF0sIHkgPSBxWzFdLCB6ID0gcVsyXSwgdyA9IHFbM10sXG4gICAgICAgIHgyID0geCArIHgsXG4gICAgICAgIHkyID0geSArIHksXG4gICAgICAgIHoyID0geiArIHosXG5cbiAgICAgICAgeHggPSB4ICogeDIsXG4gICAgICAgIHl4ID0geSAqIHgyLFxuICAgICAgICB5eSA9IHkgKiB5MixcbiAgICAgICAgenggPSB6ICogeDIsXG4gICAgICAgIHp5ID0geiAqIHkyLFxuICAgICAgICB6eiA9IHogKiB6MixcbiAgICAgICAgd3ggPSB3ICogeDIsXG4gICAgICAgIHd5ID0gdyAqIHkyLFxuICAgICAgICB3eiA9IHcgKiB6MjtcblxuICAgIG91dFswXSA9IDEgLSB5eSAtIHp6O1xuICAgIG91dFsxXSA9IHl4ICsgd3o7XG4gICAgb3V0WzJdID0genggLSB3eTtcbiAgICBvdXRbM10gPSAwO1xuXG4gICAgb3V0WzRdID0geXggLSB3ejtcbiAgICBvdXRbNV0gPSAxIC0geHggLSB6ejtcbiAgICBvdXRbNl0gPSB6eSArIHd4O1xuICAgIG91dFs3XSA9IDA7XG5cbiAgICBvdXRbOF0gPSB6eCArIHd5O1xuICAgIG91dFs5XSA9IHp5IC0gd3g7XG4gICAgb3V0WzEwXSA9IDEgLSB4eCAtIHl5O1xuICAgIG91dFsxMV0gPSAwO1xuXG4gICAgb3V0WzEyXSA9IDA7XG4gICAgb3V0WzEzXSA9IDA7XG4gICAgb3V0WzE0XSA9IDA7XG4gICAgb3V0WzE1XSA9IDE7XG5cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSBmcnVzdHVtIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge051bWJlcn0gbGVmdCBMZWZ0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge051bWJlcn0gcmlnaHQgUmlnaHQgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7TnVtYmVyfSBib3R0b20gQm90dG9tIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge051bWJlcn0gdG9wIFRvcCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtOdW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtOdW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5mcnVzdHVtID0gZnVuY3Rpb24gKG91dCwgbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIpIHtcbiAgICB2YXIgcmwgPSAxIC8gKHJpZ2h0IC0gbGVmdCksXG4gICAgICAgIHRiID0gMSAvICh0b3AgLSBib3R0b20pLFxuICAgICAgICBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gICAgb3V0WzBdID0gKG5lYXIgKiAyKSAqIHJsO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gKG5lYXIgKiAyKSAqIHRiO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAocmlnaHQgKyBsZWZ0KSAqIHJsO1xuICAgIG91dFs5XSA9ICh0b3AgKyBib3R0b20pICogdGI7XG4gICAgb3V0WzEwXSA9IChmYXIgKyBuZWFyKSAqIG5mO1xuICAgIG91dFsxMV0gPSAtMTtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gKGZhciAqIG5lYXIgKiAyKSAqIG5mO1xuICAgIG91dFsxNV0gPSAwO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7bnVtYmVyfSBmb3Z5IFZlcnRpY2FsIGZpZWxkIG9mIHZpZXcgaW4gcmFkaWFuc1xuICogQHBhcmFtIHtudW1iZXJ9IGFzcGVjdCBBc3BlY3QgcmF0aW8uIHR5cGljYWxseSB2aWV3cG9ydCB3aWR0aC9oZWlnaHRcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQucGVyc3BlY3RpdmUgPSBmdW5jdGlvbiAob3V0LCBmb3Z5LCBhc3BlY3QsIG5lYXIsIGZhcikge1xuICAgIHZhciBmID0gMS4wIC8gTWF0aC50YW4oZm92eSAvIDIpLFxuICAgICAgICBuZiA9IDEgLyAobmVhciAtIGZhcik7XG4gICAgb3V0WzBdID0gZiAvIGFzcGVjdDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMDtcbiAgICBvdXRbNF0gPSAwO1xuICAgIG91dFs1XSA9IGY7XG4gICAgb3V0WzZdID0gMDtcbiAgICBvdXRbN10gPSAwO1xuICAgIG91dFs4XSA9IDA7XG4gICAgb3V0WzldID0gMDtcbiAgICBvdXRbMTBdID0gKGZhciArIG5lYXIpICogbmY7XG4gICAgb3V0WzExXSA9IC0xO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAoMiAqIGZhciAqIG5lYXIpICogbmY7XG4gICAgb3V0WzE1XSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gZmllbGQgb2Ygdmlldy5cbiAqIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgZ2VuZXJhdGluZyBwcm9qZWN0aW9uIG1hdHJpY2VzIHRvIGJlIHVzZWRcbiAqIHdpdGggdGhlIHN0aWxsIGV4cGVyaWVtZW50YWwgV2ViVlIgQVBJLlxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7T2JqZWN0fSBmb3YgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyB2YWx1ZXM6IHVwRGVncmVlcywgZG93bkRlZ3JlZXMsIGxlZnREZWdyZWVzLCByaWdodERlZ3JlZXNcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQucGVyc3BlY3RpdmVGcm9tRmllbGRPZlZpZXcgPSBmdW5jdGlvbiAob3V0LCBmb3YsIG5lYXIsIGZhcikge1xuICAgIHZhciB1cFRhbiA9IE1hdGgudGFuKGZvdi51cERlZ3JlZXMgKiBNYXRoLlBJLzE4MC4wKSxcbiAgICAgICAgZG93blRhbiA9IE1hdGgudGFuKGZvdi5kb3duRGVncmVlcyAqIE1hdGguUEkvMTgwLjApLFxuICAgICAgICBsZWZ0VGFuID0gTWF0aC50YW4oZm92LmxlZnREZWdyZWVzICogTWF0aC5QSS8xODAuMCksXG4gICAgICAgIHJpZ2h0VGFuID0gTWF0aC50YW4oZm92LnJpZ2h0RGVncmVlcyAqIE1hdGguUEkvMTgwLjApLFxuICAgICAgICB4U2NhbGUgPSAyLjAgLyAobGVmdFRhbiArIHJpZ2h0VGFuKSxcbiAgICAgICAgeVNjYWxlID0gMi4wIC8gKHVwVGFuICsgZG93blRhbik7XG5cbiAgICBvdXRbMF0gPSB4U2NhbGU7XG4gICAgb3V0WzFdID0gMC4wO1xuICAgIG91dFsyXSA9IDAuMDtcbiAgICBvdXRbM10gPSAwLjA7XG4gICAgb3V0WzRdID0gMC4wO1xuICAgIG91dFs1XSA9IHlTY2FsZTtcbiAgICBvdXRbNl0gPSAwLjA7XG4gICAgb3V0WzddID0gMC4wO1xuICAgIG91dFs4XSA9IC0oKGxlZnRUYW4gLSByaWdodFRhbikgKiB4U2NhbGUgKiAwLjUpO1xuICAgIG91dFs5XSA9ICgodXBUYW4gLSBkb3duVGFuKSAqIHlTY2FsZSAqIDAuNSk7XG4gICAgb3V0WzEwXSA9IGZhciAvIChuZWFyIC0gZmFyKTtcbiAgICBvdXRbMTFdID0gLTEuMDtcbiAgICBvdXRbMTJdID0gMC4wO1xuICAgIG91dFsxM10gPSAwLjA7XG4gICAgb3V0WzE0XSA9IChmYXIgKiBuZWFyKSAvIChuZWFyIC0gZmFyKTtcbiAgICBvdXRbMTVdID0gMC4wO1xuICAgIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgb3J0aG9nb25hbCBwcm9qZWN0aW9uIG1hdHJpeCB3aXRoIHRoZSBnaXZlbiBib3VuZHNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge251bWJlcn0gbGVmdCBMZWZ0IGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gcmlnaHQgUmlnaHQgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSBib3R0b20gQm90dG9tIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcGFyYW0ge251bWJlcn0gdG9wIFRvcCBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IG5lYXIgTmVhciBib3VuZCBvZiB0aGUgZnJ1c3R1bVxuICogQHBhcmFtIHtudW1iZXJ9IGZhciBGYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5vcnRobyA9IGZ1bmN0aW9uIChvdXQsIGxlZnQsIHJpZ2h0LCBib3R0b20sIHRvcCwgbmVhciwgZmFyKSB7XG4gICAgdmFyIGxyID0gMSAvIChsZWZ0IC0gcmlnaHQpLFxuICAgICAgICBidCA9IDEgLyAoYm90dG9tIC0gdG9wKSxcbiAgICAgICAgbmYgPSAxIC8gKG5lYXIgLSBmYXIpO1xuICAgIG91dFswXSA9IC0yICogbHI7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSAtMiAqIGJ0O1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAwO1xuICAgIG91dFs5XSA9IDA7XG4gICAgb3V0WzEwXSA9IDIgKiBuZjtcbiAgICBvdXRbMTFdID0gMDtcbiAgICBvdXRbMTJdID0gKGxlZnQgKyByaWdodCkgKiBscjtcbiAgICBvdXRbMTNdID0gKHRvcCArIGJvdHRvbSkgKiBidDtcbiAgICBvdXRbMTRdID0gKGZhciArIG5lYXIpICogbmY7XG4gICAgb3V0WzE1XSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgbG9vay1hdCBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gZXllIHBvc2l0aW9uLCBmb2NhbCBwb2ludCwgYW5kIHVwIGF4aXNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge3ZlYzN9IGV5ZSBQb3NpdGlvbiBvZiB0aGUgdmlld2VyXG4gKiBAcGFyYW0ge3ZlYzN9IGNlbnRlciBQb2ludCB0aGUgdmlld2VyIGlzIGxvb2tpbmcgYXRcbiAqIEBwYXJhbSB7dmVjM30gdXAgdmVjMyBwb2ludGluZyB1cFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0Lmxvb2tBdCA9IGZ1bmN0aW9uIChvdXQsIGV5ZSwgY2VudGVyLCB1cCkge1xuICAgIHZhciB4MCwgeDEsIHgyLCB5MCwgeTEsIHkyLCB6MCwgejEsIHoyLCBsZW4sXG4gICAgICAgIGV5ZXggPSBleWVbMF0sXG4gICAgICAgIGV5ZXkgPSBleWVbMV0sXG4gICAgICAgIGV5ZXogPSBleWVbMl0sXG4gICAgICAgIHVweCA9IHVwWzBdLFxuICAgICAgICB1cHkgPSB1cFsxXSxcbiAgICAgICAgdXB6ID0gdXBbMl0sXG4gICAgICAgIGNlbnRlcnggPSBjZW50ZXJbMF0sXG4gICAgICAgIGNlbnRlcnkgPSBjZW50ZXJbMV0sXG4gICAgICAgIGNlbnRlcnogPSBjZW50ZXJbMl07XG5cbiAgICBpZiAoTWF0aC5hYnMoZXlleCAtIGNlbnRlcngpIDwgZ2xNYXRyaXguRVBTSUxPTiAmJlxuICAgICAgICBNYXRoLmFicyhleWV5IC0gY2VudGVyeSkgPCBnbE1hdHJpeC5FUFNJTE9OICYmXG4gICAgICAgIE1hdGguYWJzKGV5ZXogLSBjZW50ZXJ6KSA8IGdsTWF0cml4LkVQU0lMT04pIHtcbiAgICAgICAgcmV0dXJuIG1hdDQuaWRlbnRpdHkob3V0KTtcbiAgICB9XG5cbiAgICB6MCA9IGV5ZXggLSBjZW50ZXJ4O1xuICAgIHoxID0gZXlleSAtIGNlbnRlcnk7XG4gICAgejIgPSBleWV6IC0gY2VudGVyejtcblxuICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQoejAgKiB6MCArIHoxICogejEgKyB6MiAqIHoyKTtcbiAgICB6MCAqPSBsZW47XG4gICAgejEgKj0gbGVuO1xuICAgIHoyICo9IGxlbjtcblxuICAgIHgwID0gdXB5ICogejIgLSB1cHogKiB6MTtcbiAgICB4MSA9IHVweiAqIHowIC0gdXB4ICogejI7XG4gICAgeDIgPSB1cHggKiB6MSAtIHVweSAqIHowO1xuICAgIGxlbiA9IE1hdGguc3FydCh4MCAqIHgwICsgeDEgKiB4MSArIHgyICogeDIpO1xuICAgIGlmICghbGVuKSB7XG4gICAgICAgIHgwID0gMDtcbiAgICAgICAgeDEgPSAwO1xuICAgICAgICB4MiA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGVuID0gMSAvIGxlbjtcbiAgICAgICAgeDAgKj0gbGVuO1xuICAgICAgICB4MSAqPSBsZW47XG4gICAgICAgIHgyICo9IGxlbjtcbiAgICB9XG5cbiAgICB5MCA9IHoxICogeDIgLSB6MiAqIHgxO1xuICAgIHkxID0gejIgKiB4MCAtIHowICogeDI7XG4gICAgeTIgPSB6MCAqIHgxIC0gejEgKiB4MDtcblxuICAgIGxlbiA9IE1hdGguc3FydCh5MCAqIHkwICsgeTEgKiB5MSArIHkyICogeTIpO1xuICAgIGlmICghbGVuKSB7XG4gICAgICAgIHkwID0gMDtcbiAgICAgICAgeTEgPSAwO1xuICAgICAgICB5MiA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGVuID0gMSAvIGxlbjtcbiAgICAgICAgeTAgKj0gbGVuO1xuICAgICAgICB5MSAqPSBsZW47XG4gICAgICAgIHkyICo9IGxlbjtcbiAgICB9XG5cbiAgICBvdXRbMF0gPSB4MDtcbiAgICBvdXRbMV0gPSB5MDtcbiAgICBvdXRbMl0gPSB6MDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IHgxO1xuICAgIG91dFs1XSA9IHkxO1xuICAgIG91dFs2XSA9IHoxO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0geDI7XG4gICAgb3V0WzldID0geTI7XG4gICAgb3V0WzEwXSA9IHoyO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAtKHgwICogZXlleCArIHgxICogZXlleSArIHgyICogZXlleik7XG4gICAgb3V0WzEzXSA9IC0oeTAgKiBleWV4ICsgeTEgKiBleWV5ICsgeTIgKiBleWV6KTtcbiAgICBvdXRbMTRdID0gLSh6MCAqIGV5ZXggKyB6MSAqIGV5ZXkgKyB6MiAqIGV5ZXopO1xuICAgIG91dFsxNV0gPSAxO1xuXG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1hdDRcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG1hdCBtYXRyaXggdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1hdHJpeFxuICovXG5tYXQ0LnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICdtYXQ0KCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnLCAnICsgYVsyXSArICcsICcgKyBhWzNdICsgJywgJyArXG4gICAgICAgICAgICAgICAgICAgIGFbNF0gKyAnLCAnICsgYVs1XSArICcsICcgKyBhWzZdICsgJywgJyArIGFbN10gKyAnLCAnICtcbiAgICAgICAgICAgICAgICAgICAgYVs4XSArICcsICcgKyBhWzldICsgJywgJyArIGFbMTBdICsgJywgJyArIGFbMTFdICsgJywgJyArXG4gICAgICAgICAgICAgICAgICAgIGFbMTJdICsgJywgJyArIGFbMTNdICsgJywgJyArIGFbMTRdICsgJywgJyArIGFbMTVdICsgJyknO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIEZyb2Jlbml1cyBub3JtIG9mIGEgbWF0NFxuICpcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIGNhbGN1bGF0ZSBGcm9iZW5pdXMgbm9ybSBvZlxuICogQHJldHVybnMge051bWJlcn0gRnJvYmVuaXVzIG5vcm1cbiAqL1xubWF0NC5mcm9iID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4oTWF0aC5zcXJ0KE1hdGgucG93KGFbMF0sIDIpICsgTWF0aC5wb3coYVsxXSwgMikgKyBNYXRoLnBvdyhhWzJdLCAyKSArIE1hdGgucG93KGFbM10sIDIpICsgTWF0aC5wb3coYVs0XSwgMikgKyBNYXRoLnBvdyhhWzVdLCAyKSArIE1hdGgucG93KGFbNl0sIDIpICsgTWF0aC5wb3coYVs3XSwgMikgKyBNYXRoLnBvdyhhWzhdLCAyKSArIE1hdGgucG93KGFbOV0sIDIpICsgTWF0aC5wb3coYVsxMF0sIDIpICsgTWF0aC5wb3coYVsxMV0sIDIpICsgTWF0aC5wb3coYVsxMl0sIDIpICsgTWF0aC5wb3coYVsxM10sIDIpICsgTWF0aC5wb3coYVsxNF0sIDIpICsgTWF0aC5wb3coYVsxNV0sIDIpICkpXG59O1xuXG4vKipcbiAqIEFkZHMgdHdvIG1hdDQnc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5hZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgICBvdXRbNF0gPSBhWzRdICsgYls0XTtcbiAgICBvdXRbNV0gPSBhWzVdICsgYls1XTtcbiAgICBvdXRbNl0gPSBhWzZdICsgYls2XTtcbiAgICBvdXRbN10gPSBhWzddICsgYls3XTtcbiAgICBvdXRbOF0gPSBhWzhdICsgYls4XTtcbiAgICBvdXRbOV0gPSBhWzldICsgYls5XTtcbiAgICBvdXRbMTBdID0gYVsxMF0gKyBiWzEwXTtcbiAgICBvdXRbMTFdID0gYVsxMV0gKyBiWzExXTtcbiAgICBvdXRbMTJdID0gYVsxMl0gKyBiWzEyXTtcbiAgICBvdXRbMTNdID0gYVsxM10gKyBiWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF0gKyBiWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV0gKyBiWzE1XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTdWJ0cmFjdHMgbWF0cml4IGIgZnJvbSBtYXRyaXggYVxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xubWF0NC5zdWJ0cmFjdCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICAgIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICAgIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICAgIG91dFs0XSA9IGFbNF0gLSBiWzRdO1xuICAgIG91dFs1XSA9IGFbNV0gLSBiWzVdO1xuICAgIG91dFs2XSA9IGFbNl0gLSBiWzZdO1xuICAgIG91dFs3XSA9IGFbN10gLSBiWzddO1xuICAgIG91dFs4XSA9IGFbOF0gLSBiWzhdO1xuICAgIG91dFs5XSA9IGFbOV0gLSBiWzldO1xuICAgIG91dFsxMF0gPSBhWzEwXSAtIGJbMTBdO1xuICAgIG91dFsxMV0gPSBhWzExXSAtIGJbMTFdO1xuICAgIG91dFsxMl0gPSBhWzEyXSAtIGJbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXSAtIGJbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XSAtIGJbMTRdO1xuICAgIG91dFsxNV0gPSBhWzE1XSAtIGJbMTVdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgbWF0NC5zdWJ0cmFjdH1cbiAqIEBmdW5jdGlvblxuICovXG5tYXQ0LnN1YiA9IG1hdDQuc3VidHJhY3Q7XG5cbi8qKlxuICogTXVsdGlwbHkgZWFjaCBlbGVtZW50IG9mIHRoZSBtYXRyaXggYnkgYSBzY2FsYXIuXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHNjYWxlXG4gKiBAcGFyYW0ge051bWJlcn0gYiBhbW91bnQgdG8gc2NhbGUgdGhlIG1hdHJpeCdzIGVsZW1lbnRzIGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbm1hdDQubXVsdGlwbHlTY2FsYXIgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICogYjtcbiAgICBvdXRbMV0gPSBhWzFdICogYjtcbiAgICBvdXRbMl0gPSBhWzJdICogYjtcbiAgICBvdXRbM10gPSBhWzNdICogYjtcbiAgICBvdXRbNF0gPSBhWzRdICogYjtcbiAgICBvdXRbNV0gPSBhWzVdICogYjtcbiAgICBvdXRbNl0gPSBhWzZdICogYjtcbiAgICBvdXRbN10gPSBhWzddICogYjtcbiAgICBvdXRbOF0gPSBhWzhdICogYjtcbiAgICBvdXRbOV0gPSBhWzldICogYjtcbiAgICBvdXRbMTBdID0gYVsxMF0gKiBiO1xuICAgIG91dFsxMV0gPSBhWzExXSAqIGI7XG4gICAgb3V0WzEyXSA9IGFbMTJdICogYjtcbiAgICBvdXRbMTNdID0gYVsxM10gKiBiO1xuICAgIG91dFsxNF0gPSBhWzE0XSAqIGI7XG4gICAgb3V0WzE1XSA9IGFbMTVdICogYjtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBZGRzIHR3byBtYXQ0J3MgYWZ0ZXIgbXVsdGlwbHlpbmcgZWFjaCBlbGVtZW50IG9mIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHttYXQ0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge21hdDR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gc2NhbGUgdGhlIGFtb3VudCB0byBzY2FsZSBiJ3MgZWxlbWVudHMgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5tYXQ0Lm11bHRpcGx5U2NhbGFyQW5kQWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiLCBzY2FsZSkge1xuICAgIG91dFswXSA9IGFbMF0gKyAoYlswXSAqIHNjYWxlKTtcbiAgICBvdXRbMV0gPSBhWzFdICsgKGJbMV0gKiBzY2FsZSk7XG4gICAgb3V0WzJdID0gYVsyXSArIChiWzJdICogc2NhbGUpO1xuICAgIG91dFszXSA9IGFbM10gKyAoYlszXSAqIHNjYWxlKTtcbiAgICBvdXRbNF0gPSBhWzRdICsgKGJbNF0gKiBzY2FsZSk7XG4gICAgb3V0WzVdID0gYVs1XSArIChiWzVdICogc2NhbGUpO1xuICAgIG91dFs2XSA9IGFbNl0gKyAoYls2XSAqIHNjYWxlKTtcbiAgICBvdXRbN10gPSBhWzddICsgKGJbN10gKiBzY2FsZSk7XG4gICAgb3V0WzhdID0gYVs4XSArIChiWzhdICogc2NhbGUpO1xuICAgIG91dFs5XSA9IGFbOV0gKyAoYls5XSAqIHNjYWxlKTtcbiAgICBvdXRbMTBdID0gYVsxMF0gKyAoYlsxMF0gKiBzY2FsZSk7XG4gICAgb3V0WzExXSA9IGFbMTFdICsgKGJbMTFdICogc2NhbGUpO1xuICAgIG91dFsxMl0gPSBhWzEyXSArIChiWzEyXSAqIHNjYWxlKTtcbiAgICBvdXRbMTNdID0gYVsxM10gKyAoYlsxM10gKiBzY2FsZSk7XG4gICAgb3V0WzE0XSA9IGFbMTRdICsgKGJbMTRdICogc2NhbGUpO1xuICAgIG91dFsxNV0gPSBhWzE1XSArIChiWzE1XSAqIHNjYWxlKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSBtYXRyaWNlcyBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgZWxlbWVudHMgaW4gdGhlIHNhbWUgcG9zaXRpb24gKHdoZW4gY29tcGFyZWQgd2l0aCA9PT0pXG4gKlxuICogQHBhcmFtIHttYXQ0fSBhIFRoZSBmaXJzdCBtYXRyaXguXG4gKiBAcGFyYW0ge21hdDR9IGIgVGhlIHNlY29uZCBtYXRyaXguXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgbWF0cmljZXMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbm1hdDQuZXhhY3RFcXVhbHMgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdICYmIFxuICAgICAgICAgICBhWzRdID09PSBiWzRdICYmIGFbNV0gPT09IGJbNV0gJiYgYVs2XSA9PT0gYls2XSAmJiBhWzddID09PSBiWzddICYmIFxuICAgICAgICAgICBhWzhdID09PSBiWzhdICYmIGFbOV0gPT09IGJbOV0gJiYgYVsxMF0gPT09IGJbMTBdICYmIGFbMTFdID09PSBiWzExXSAmJlxuICAgICAgICAgICBhWzEyXSA9PT0gYlsxMl0gJiYgYVsxM10gPT09IGJbMTNdICYmIGFbMTRdID09PSBiWzE0XSAmJiBhWzE1XSA9PT0gYlsxNV07XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIG1hdHJpY2VzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0ge21hdDR9IGEgVGhlIGZpcnN0IG1hdHJpeC5cbiAqIEBwYXJhbSB7bWF0NH0gYiBUaGUgc2Vjb25kIG1hdHJpeC5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSBtYXRyaWNlcyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xubWF0NC5lcXVhbHMgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgIHZhciBhMCAgPSBhWzBdLCAgYTEgID0gYVsxXSwgIGEyICA9IGFbMl0sICBhMyAgPSBhWzNdLFxuICAgICAgICBhNCAgPSBhWzRdLCAgYTUgID0gYVs1XSwgIGE2ICA9IGFbNl0sICBhNyAgPSBhWzddLCBcbiAgICAgICAgYTggID0gYVs4XSwgIGE5ICA9IGFbOV0sICBhMTAgPSBhWzEwXSwgYTExID0gYVsxMV0sIFxuICAgICAgICBhMTIgPSBhWzEyXSwgYTEzID0gYVsxM10sIGExNCA9IGFbMTRdLCBhMTUgPSBhWzE1XTtcblxuICAgIHZhciBiMCAgPSBiWzBdLCAgYjEgID0gYlsxXSwgIGIyICA9IGJbMl0sICBiMyAgPSBiWzNdLFxuICAgICAgICBiNCAgPSBiWzRdLCAgYjUgID0gYls1XSwgIGI2ICA9IGJbNl0sICBiNyAgPSBiWzddLCBcbiAgICAgICAgYjggID0gYls4XSwgIGI5ICA9IGJbOV0sICBiMTAgPSBiWzEwXSwgYjExID0gYlsxMV0sIFxuICAgICAgICBiMTIgPSBiWzEyXSwgYjEzID0gYlsxM10sIGIxNCA9IGJbMTRdLCBiMTUgPSBiWzE1XTtcblxuICAgIHJldHVybiAoTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTMgLSBiMykgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTQgLSBiNCkgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE0KSwgTWF0aC5hYnMoYjQpKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTUgLSBiNSkgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE1KSwgTWF0aC5hYnMoYjUpKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTYgLSBiNikgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE2KSwgTWF0aC5hYnMoYjYpKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTcgLSBiNykgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE3KSwgTWF0aC5hYnMoYjcpKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTggLSBiOCkgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE4KSwgTWF0aC5hYnMoYjgpKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTkgLSBiOSkgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGE5KSwgTWF0aC5hYnMoYjkpKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTEwIC0gYjEwKSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEwKSwgTWF0aC5hYnMoYjEwKSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGExMSAtIGIxMSkgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExMSksIE1hdGguYWJzKGIxMSkpICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhMTIgLSBiMTIpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTIpLCBNYXRoLmFicyhiMTIpKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTEzIC0gYjEzKSA8PSBnbE1hdHJpeC5FUFNJTE9OKk1hdGgubWF4KDEuMCwgTWF0aC5hYnMoYTEzKSwgTWF0aC5hYnMoYjEzKSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGExNCAtIGIxNCkgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExNCksIE1hdGguYWJzKGIxNCkpICYmXG4gICAgICAgICAgICBNYXRoLmFicyhhMTUgLSBiMTUpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMTUpLCBNYXRoLmFicyhiMTUpKSk7XG59O1xuXG5cblxubW9kdWxlLmV4cG9ydHMgPSBtYXQ0O1xuIiwiLyogQ29weXJpZ2h0IChjKSAyMDE1LCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS4gKi9cblxudmFyIGdsTWF0cml4ID0gcmVxdWlyZShcIi4vY29tbW9uLmpzXCIpO1xudmFyIG1hdDMgPSByZXF1aXJlKFwiLi9tYXQzLmpzXCIpO1xudmFyIHZlYzMgPSByZXF1aXJlKFwiLi92ZWMzLmpzXCIpO1xudmFyIHZlYzQgPSByZXF1aXJlKFwiLi92ZWM0LmpzXCIpO1xuXG4vKipcbiAqIEBjbGFzcyBRdWF0ZXJuaW9uXG4gKiBAbmFtZSBxdWF0XG4gKi9cbnZhciBxdWF0ID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBpZGVudGl0eSBxdWF0XG4gKlxuICogQHJldHVybnMge3F1YXR9IGEgbmV3IHF1YXRlcm5pb25cbiAqL1xucXVhdC5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoNCk7XG4gICAgb3V0WzBdID0gMDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgb3V0WzNdID0gMTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXRzIGEgcXVhdGVybmlvbiB0byByZXByZXNlbnQgdGhlIHNob3J0ZXN0IHJvdGF0aW9uIGZyb20gb25lXG4gKiB2ZWN0b3IgdG8gYW5vdGhlci5cbiAqXG4gKiBCb3RoIHZlY3RvcnMgYXJlIGFzc3VtZWQgdG8gYmUgdW5pdCBsZW5ndGguXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uLlxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBpbml0aWFsIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBkZXN0aW5hdGlvbiB2ZWN0b3JcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xucXVhdC5yb3RhdGlvblRvID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciB0bXB2ZWMzID0gdmVjMy5jcmVhdGUoKTtcbiAgICB2YXIgeFVuaXRWZWMzID0gdmVjMy5mcm9tVmFsdWVzKDEsMCwwKTtcbiAgICB2YXIgeVVuaXRWZWMzID0gdmVjMy5mcm9tVmFsdWVzKDAsMSwwKTtcblxuICAgIHJldHVybiBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICAgICAgdmFyIGRvdCA9IHZlYzMuZG90KGEsIGIpO1xuICAgICAgICBpZiAoZG90IDwgLTAuOTk5OTk5KSB7XG4gICAgICAgICAgICB2ZWMzLmNyb3NzKHRtcHZlYzMsIHhVbml0VmVjMywgYSk7XG4gICAgICAgICAgICBpZiAodmVjMy5sZW5ndGgodG1wdmVjMykgPCAwLjAwMDAwMSlcbiAgICAgICAgICAgICAgICB2ZWMzLmNyb3NzKHRtcHZlYzMsIHlVbml0VmVjMywgYSk7XG4gICAgICAgICAgICB2ZWMzLm5vcm1hbGl6ZSh0bXB2ZWMzLCB0bXB2ZWMzKTtcbiAgICAgICAgICAgIHF1YXQuc2V0QXhpc0FuZ2xlKG91dCwgdG1wdmVjMywgTWF0aC5QSSk7XG4gICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9IGVsc2UgaWYgKGRvdCA+IDAuOTk5OTk5KSB7XG4gICAgICAgICAgICBvdXRbMF0gPSAwO1xuICAgICAgICAgICAgb3V0WzFdID0gMDtcbiAgICAgICAgICAgIG91dFsyXSA9IDA7XG4gICAgICAgICAgICBvdXRbM10gPSAxO1xuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZlYzMuY3Jvc3ModG1wdmVjMywgYSwgYik7XG4gICAgICAgICAgICBvdXRbMF0gPSB0bXB2ZWMzWzBdO1xuICAgICAgICAgICAgb3V0WzFdID0gdG1wdmVjM1sxXTtcbiAgICAgICAgICAgIG91dFsyXSA9IHRtcHZlYzNbMl07XG4gICAgICAgICAgICBvdXRbM10gPSAxICsgZG90O1xuICAgICAgICAgICAgcmV0dXJuIHF1YXQubm9ybWFsaXplKG91dCwgb3V0KTtcbiAgICAgICAgfVxuICAgIH07XG59KSgpO1xuXG4vKipcbiAqIFNldHMgdGhlIHNwZWNpZmllZCBxdWF0ZXJuaW9uIHdpdGggdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuXG4gKiBheGVzLiBFYWNoIGF4aXMgaXMgYSB2ZWMzIGFuZCBpcyBleHBlY3RlZCB0byBiZSB1bml0IGxlbmd0aCBhbmRcbiAqIHBlcnBlbmRpY3VsYXIgdG8gYWxsIG90aGVyIHNwZWNpZmllZCBheGVzLlxuICpcbiAqIEBwYXJhbSB7dmVjM30gdmlldyAgdGhlIHZlY3RvciByZXByZXNlbnRpbmcgdGhlIHZpZXdpbmcgZGlyZWN0aW9uXG4gKiBAcGFyYW0ge3ZlYzN9IHJpZ2h0IHRoZSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSBsb2NhbCBcInJpZ2h0XCIgZGlyZWN0aW9uXG4gKiBAcGFyYW0ge3ZlYzN9IHVwICAgIHRoZSB2ZWN0b3IgcmVwcmVzZW50aW5nIHRoZSBsb2NhbCBcInVwXCIgZGlyZWN0aW9uXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQuc2V0QXhlcyA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgbWF0ciA9IG1hdDMuY3JlYXRlKCk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24ob3V0LCB2aWV3LCByaWdodCwgdXApIHtcbiAgICAgICAgbWF0clswXSA9IHJpZ2h0WzBdO1xuICAgICAgICBtYXRyWzNdID0gcmlnaHRbMV07XG4gICAgICAgIG1hdHJbNl0gPSByaWdodFsyXTtcblxuICAgICAgICBtYXRyWzFdID0gdXBbMF07XG4gICAgICAgIG1hdHJbNF0gPSB1cFsxXTtcbiAgICAgICAgbWF0cls3XSA9IHVwWzJdO1xuXG4gICAgICAgIG1hdHJbMl0gPSAtdmlld1swXTtcbiAgICAgICAgbWF0cls1XSA9IC12aWV3WzFdO1xuICAgICAgICBtYXRyWzhdID0gLXZpZXdbMl07XG5cbiAgICAgICAgcmV0dXJuIHF1YXQubm9ybWFsaXplKG91dCwgcXVhdC5mcm9tTWF0MyhvdXQsIG1hdHIpKTtcbiAgICB9O1xufSkoKTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHF1YXQgaW5pdGlhbGl6ZWQgd2l0aCB2YWx1ZXMgZnJvbSBhbiBleGlzdGluZyBxdWF0ZXJuaW9uXG4gKlxuICogQHBhcmFtIHtxdWF0fSBhIHF1YXRlcm5pb24gdG8gY2xvbmVcbiAqIEByZXR1cm5zIHtxdWF0fSBhIG5ldyBxdWF0ZXJuaW9uXG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5jbG9uZSA9IHZlYzQuY2xvbmU7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBxdWF0IGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHogWiBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB3IFcgY29tcG9uZW50XG4gKiBAcmV0dXJucyB7cXVhdH0gYSBuZXcgcXVhdGVybmlvblxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQuZnJvbVZhbHVlcyA9IHZlYzQuZnJvbVZhbHVlcztcblxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgcXVhdCB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3F1YXR9IGEgdGhlIHNvdXJjZSBxdWF0ZXJuaW9uXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5jb3B5ID0gdmVjNC5jb3B5O1xuXG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHF1YXQgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5xdWF0LnNldCA9IHZlYzQuc2V0O1xuXG4vKipcbiAqIFNldCBhIHF1YXQgdG8gdGhlIGlkZW50aXR5IHF1YXRlcm5pb25cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xucXVhdC5pZGVudGl0eSA9IGZ1bmN0aW9uKG91dCkge1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDE7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2V0cyBhIHF1YXQgZnJvbSB0aGUgZ2l2ZW4gYW5nbGUgYW5kIHJvdGF0aW9uIGF4aXMsXG4gKiB0aGVuIHJldHVybnMgaXQuXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3ZlYzN9IGF4aXMgdGhlIGF4aXMgYXJvdW5kIHdoaWNoIHRvIHJvdGF0ZVxuICogQHBhcmFtIHtOdW1iZXJ9IHJhZCB0aGUgYW5nbGUgaW4gcmFkaWFuc1xuICogQHJldHVybnMge3F1YXR9IG91dFxuICoqL1xucXVhdC5zZXRBeGlzQW5nbGUgPSBmdW5jdGlvbihvdXQsIGF4aXMsIHJhZCkge1xuICAgIHJhZCA9IHJhZCAqIDAuNTtcbiAgICB2YXIgcyA9IE1hdGguc2luKHJhZCk7XG4gICAgb3V0WzBdID0gcyAqIGF4aXNbMF07XG4gICAgb3V0WzFdID0gcyAqIGF4aXNbMV07XG4gICAgb3V0WzJdID0gcyAqIGF4aXNbMl07XG4gICAgb3V0WzNdID0gTWF0aC5jb3MocmFkKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSByb3RhdGlvbiBheGlzIGFuZCBhbmdsZSBmb3IgYSBnaXZlblxuICogIHF1YXRlcm5pb24uIElmIGEgcXVhdGVybmlvbiBpcyBjcmVhdGVkIHdpdGhcbiAqICBzZXRBeGlzQW5nbGUsIHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBzYW1lXG4gKiAgdmFsdWVzIGFzIHByb3ZpZGllZCBpbiB0aGUgb3JpZ2luYWwgcGFyYW1ldGVyIGxpc3RcbiAqICBPUiBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB2YWx1ZXMuXG4gKiBFeGFtcGxlOiBUaGUgcXVhdGVybmlvbiBmb3JtZWQgYnkgYXhpcyBbMCwgMCwgMV0gYW5kXG4gKiAgYW5nbGUgLTkwIGlzIHRoZSBzYW1lIGFzIHRoZSBxdWF0ZXJuaW9uIGZvcm1lZCBieVxuICogIFswLCAwLCAxXSBhbmQgMjcwLiBUaGlzIG1ldGhvZCBmYXZvcnMgdGhlIGxhdHRlci5cbiAqIEBwYXJhbSAge3ZlYzN9IG91dF9heGlzICBWZWN0b3IgcmVjZWl2aW5nIHRoZSBheGlzIG9mIHJvdGF0aW9uXG4gKiBAcGFyYW0gIHtxdWF0fSBxICAgICBRdWF0ZXJuaW9uIHRvIGJlIGRlY29tcG9zZWRcbiAqIEByZXR1cm4ge051bWJlcn0gICAgIEFuZ2xlLCBpbiByYWRpYW5zLCBvZiB0aGUgcm90YXRpb25cbiAqL1xucXVhdC5nZXRBeGlzQW5nbGUgPSBmdW5jdGlvbihvdXRfYXhpcywgcSkge1xuICAgIHZhciByYWQgPSBNYXRoLmFjb3MocVszXSkgKiAyLjA7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihyYWQgLyAyLjApO1xuICAgIGlmIChzICE9IDAuMCkge1xuICAgICAgICBvdXRfYXhpc1swXSA9IHFbMF0gLyBzO1xuICAgICAgICBvdXRfYXhpc1sxXSA9IHFbMV0gLyBzO1xuICAgICAgICBvdXRfYXhpc1syXSA9IHFbMl0gLyBzO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIHMgaXMgemVybywgcmV0dXJuIGFueSBheGlzIChubyByb3RhdGlvbiAtIGF4aXMgZG9lcyBub3QgbWF0dGVyKVxuICAgICAgICBvdXRfYXhpc1swXSA9IDE7XG4gICAgICAgIG91dF9heGlzWzFdID0gMDtcbiAgICAgICAgb3V0X2F4aXNbMl0gPSAwO1xuICAgIH1cbiAgICByZXR1cm4gcmFkO1xufTtcblxuLyoqXG4gKiBBZGRzIHR3byBxdWF0J3NcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7cXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtxdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3F1YXR9IG91dFxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQuYWRkID0gdmVjNC5hZGQ7XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gcXVhdCdzXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3F1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7cXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xucXVhdC5tdWx0aXBseSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIHZhciBheCA9IGFbMF0sIGF5ID0gYVsxXSwgYXogPSBhWzJdLCBhdyA9IGFbM10sXG4gICAgICAgIGJ4ID0gYlswXSwgYnkgPSBiWzFdLCBieiA9IGJbMl0sIGJ3ID0gYlszXTtcblxuICAgIG91dFswXSA9IGF4ICogYncgKyBhdyAqIGJ4ICsgYXkgKiBieiAtIGF6ICogYnk7XG4gICAgb3V0WzFdID0gYXkgKiBidyArIGF3ICogYnkgKyBheiAqIGJ4IC0gYXggKiBiejtcbiAgICBvdXRbMl0gPSBheiAqIGJ3ICsgYXcgKiBieiArIGF4ICogYnkgLSBheSAqIGJ4O1xuICAgIG91dFszXSA9IGF3ICogYncgLSBheCAqIGJ4IC0gYXkgKiBieSAtIGF6ICogYno7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayBxdWF0Lm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQubXVsID0gcXVhdC5tdWx0aXBseTtcblxuLyoqXG4gKiBTY2FsZXMgYSBxdWF0IGJ5IGEgc2NhbGFyIG51bWJlclxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3F1YXR9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5xdWF0LnNjYWxlID0gdmVjNC5zY2FsZTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgcXVhdGVybmlvbiBieSB0aGUgZ2l2ZW4gYW5nbGUgYWJvdXQgdGhlIFggYXhpc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHF1YXQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHJhZCBhbmdsZSAoaW4gcmFkaWFucykgdG8gcm90YXRlXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQucm90YXRlWCA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHJhZCAqPSAwLjU7IFxuXG4gICAgdmFyIGF4ID0gYVswXSwgYXkgPSBhWzFdLCBheiA9IGFbMl0sIGF3ID0gYVszXSxcbiAgICAgICAgYnggPSBNYXRoLnNpbihyYWQpLCBidyA9IE1hdGguY29zKHJhZCk7XG5cbiAgICBvdXRbMF0gPSBheCAqIGJ3ICsgYXcgKiBieDtcbiAgICBvdXRbMV0gPSBheSAqIGJ3ICsgYXogKiBieDtcbiAgICBvdXRbMl0gPSBheiAqIGJ3IC0gYXkgKiBieDtcbiAgICBvdXRbM10gPSBhdyAqIGJ3IC0gYXggKiBieDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgcXVhdGVybmlvbiBieSB0aGUgZ2l2ZW4gYW5nbGUgYWJvdXQgdGhlIFkgYXhpc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHF1YXQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHJhZCBhbmdsZSAoaW4gcmFkaWFucykgdG8gcm90YXRlXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQucm90YXRlWSA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHJhZCAqPSAwLjU7IFxuXG4gICAgdmFyIGF4ID0gYVswXSwgYXkgPSBhWzFdLCBheiA9IGFbMl0sIGF3ID0gYVszXSxcbiAgICAgICAgYnkgPSBNYXRoLnNpbihyYWQpLCBidyA9IE1hdGguY29zKHJhZCk7XG5cbiAgICBvdXRbMF0gPSBheCAqIGJ3IC0gYXogKiBieTtcbiAgICBvdXRbMV0gPSBheSAqIGJ3ICsgYXcgKiBieTtcbiAgICBvdXRbMl0gPSBheiAqIGJ3ICsgYXggKiBieTtcbiAgICBvdXRbM10gPSBhdyAqIGJ3IC0gYXkgKiBieTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSb3RhdGVzIGEgcXVhdGVybmlvbiBieSB0aGUgZ2l2ZW4gYW5nbGUgYWJvdXQgdGhlIFogYXhpc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHF1YXQgcmVjZWl2aW5nIG9wZXJhdGlvbiByZXN1bHRcbiAqIEBwYXJhbSB7cXVhdH0gYSBxdWF0IHRvIHJvdGF0ZVxuICogQHBhcmFtIHtudW1iZXJ9IHJhZCBhbmdsZSAoaW4gcmFkaWFucykgdG8gcm90YXRlXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQucm90YXRlWiA9IGZ1bmN0aW9uIChvdXQsIGEsIHJhZCkge1xuICAgIHJhZCAqPSAwLjU7IFxuXG4gICAgdmFyIGF4ID0gYVswXSwgYXkgPSBhWzFdLCBheiA9IGFbMl0sIGF3ID0gYVszXSxcbiAgICAgICAgYnogPSBNYXRoLnNpbihyYWQpLCBidyA9IE1hdGguY29zKHJhZCk7XG5cbiAgICBvdXRbMF0gPSBheCAqIGJ3ICsgYXkgKiBiejtcbiAgICBvdXRbMV0gPSBheSAqIGJ3IC0gYXggKiBiejtcbiAgICBvdXRbMl0gPSBheiAqIGJ3ICsgYXcgKiBiejtcbiAgICBvdXRbM10gPSBhdyAqIGJ3IC0gYXogKiBiejtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBXIGNvbXBvbmVudCBvZiBhIHF1YXQgZnJvbSB0aGUgWCwgWSwgYW5kIFogY29tcG9uZW50cy5cbiAqIEFzc3VtZXMgdGhhdCBxdWF0ZXJuaW9uIGlzIDEgdW5pdCBpbiBsZW5ndGguXG4gKiBBbnkgZXhpc3RpbmcgVyBjb21wb25lbnQgd2lsbCBiZSBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHF1YXQgdG8gY2FsY3VsYXRlIFcgY29tcG9uZW50IG9mXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQuY2FsY3VsYXRlVyA9IGZ1bmN0aW9uIChvdXQsIGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sIHkgPSBhWzFdLCB6ID0gYVsyXTtcblxuICAgIG91dFswXSA9IHg7XG4gICAgb3V0WzFdID0geTtcbiAgICBvdXRbMl0gPSB6O1xuICAgIG91dFszXSA9IE1hdGguc3FydChNYXRoLmFicygxLjAgLSB4ICogeCAtIHkgKiB5IC0geiAqIHopKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gcXVhdCdzXG4gKlxuICogQHBhcmFtIHtxdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3F1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkb3QgcHJvZHVjdCBvZiBhIGFuZCBiXG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5kb3QgPSB2ZWM0LmRvdDtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHF1YXQnc1xuICpcbiAqIEBwYXJhbSB7cXVhdH0gb3V0IHRoZSByZWNlaXZpbmcgcXVhdGVybmlvblxuICogQHBhcmFtIHtxdWF0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3F1YXR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5sZXJwID0gdmVjNC5sZXJwO1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgc3BoZXJpY2FsIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdHdvIHF1YXRcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7cXVhdH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHtxdWF0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LnNsZXJwID0gZnVuY3Rpb24gKG91dCwgYSwgYiwgdCkge1xuICAgIC8vIGJlbmNobWFya3M6XG4gICAgLy8gICAgaHR0cDovL2pzcGVyZi5jb20vcXVhdGVybmlvbi1zbGVycC1pbXBsZW1lbnRhdGlvbnNcblxuICAgIHZhciBheCA9IGFbMF0sIGF5ID0gYVsxXSwgYXogPSBhWzJdLCBhdyA9IGFbM10sXG4gICAgICAgIGJ4ID0gYlswXSwgYnkgPSBiWzFdLCBieiA9IGJbMl0sIGJ3ID0gYlszXTtcblxuICAgIHZhciAgICAgICAgb21lZ2EsIGNvc29tLCBzaW5vbSwgc2NhbGUwLCBzY2FsZTE7XG5cbiAgICAvLyBjYWxjIGNvc2luZVxuICAgIGNvc29tID0gYXggKiBieCArIGF5ICogYnkgKyBheiAqIGJ6ICsgYXcgKiBidztcbiAgICAvLyBhZGp1c3Qgc2lnbnMgKGlmIG5lY2Vzc2FyeSlcbiAgICBpZiAoIGNvc29tIDwgMC4wICkge1xuICAgICAgICBjb3NvbSA9IC1jb3NvbTtcbiAgICAgICAgYnggPSAtIGJ4O1xuICAgICAgICBieSA9IC0gYnk7XG4gICAgICAgIGJ6ID0gLSBiejtcbiAgICAgICAgYncgPSAtIGJ3O1xuICAgIH1cbiAgICAvLyBjYWxjdWxhdGUgY29lZmZpY2llbnRzXG4gICAgaWYgKCAoMS4wIC0gY29zb20pID4gMC4wMDAwMDEgKSB7XG4gICAgICAgIC8vIHN0YW5kYXJkIGNhc2UgKHNsZXJwKVxuICAgICAgICBvbWVnYSAgPSBNYXRoLmFjb3MoY29zb20pO1xuICAgICAgICBzaW5vbSAgPSBNYXRoLnNpbihvbWVnYSk7XG4gICAgICAgIHNjYWxlMCA9IE1hdGguc2luKCgxLjAgLSB0KSAqIG9tZWdhKSAvIHNpbm9tO1xuICAgICAgICBzY2FsZTEgPSBNYXRoLnNpbih0ICogb21lZ2EpIC8gc2lub207XG4gICAgfSBlbHNlIHsgICAgICAgIFxuICAgICAgICAvLyBcImZyb21cIiBhbmQgXCJ0b1wiIHF1YXRlcm5pb25zIGFyZSB2ZXJ5IGNsb3NlIFxuICAgICAgICAvLyAgLi4uIHNvIHdlIGNhbiBkbyBhIGxpbmVhciBpbnRlcnBvbGF0aW9uXG4gICAgICAgIHNjYWxlMCA9IDEuMCAtIHQ7XG4gICAgICAgIHNjYWxlMSA9IHQ7XG4gICAgfVxuICAgIC8vIGNhbGN1bGF0ZSBmaW5hbCB2YWx1ZXNcbiAgICBvdXRbMF0gPSBzY2FsZTAgKiBheCArIHNjYWxlMSAqIGJ4O1xuICAgIG91dFsxXSA9IHNjYWxlMCAqIGF5ICsgc2NhbGUxICogYnk7XG4gICAgb3V0WzJdID0gc2NhbGUwICogYXogKyBzY2FsZTEgKiBiejtcbiAgICBvdXRbM10gPSBzY2FsZTAgKiBhdyArIHNjYWxlMSAqIGJ3O1xuICAgIFxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgc3BoZXJpY2FsIGxpbmVhciBpbnRlcnBvbGF0aW9uIHdpdGggdHdvIGNvbnRyb2wgcG9pbnRzXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3F1YXR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7cXVhdH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7cXVhdH0gYyB0aGUgdGhpcmQgb3BlcmFuZFxuICogQHBhcmFtIHtxdWF0fSBkIHRoZSBmb3VydGggb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnRcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqL1xucXVhdC5zcWxlcnAgPSAoZnVuY3Rpb24gKCkge1xuICB2YXIgdGVtcDEgPSBxdWF0LmNyZWF0ZSgpO1xuICB2YXIgdGVtcDIgPSBxdWF0LmNyZWF0ZSgpO1xuICBcbiAgcmV0dXJuIGZ1bmN0aW9uIChvdXQsIGEsIGIsIGMsIGQsIHQpIHtcbiAgICBxdWF0LnNsZXJwKHRlbXAxLCBhLCBkLCB0KTtcbiAgICBxdWF0LnNsZXJwKHRlbXAyLCBiLCBjLCB0KTtcbiAgICBxdWF0LnNsZXJwKG91dCwgdGVtcDEsIHRlbXAyLCAyICogdCAqICgxIC0gdCkpO1xuICAgIFxuICAgIHJldHVybiBvdXQ7XG4gIH07XG59KCkpO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGludmVyc2Ugb2YgYSBxdWF0XG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3F1YXR9IGEgcXVhdCB0byBjYWxjdWxhdGUgaW52ZXJzZSBvZlxuICogQHJldHVybnMge3F1YXR9IG91dFxuICovXG5xdWF0LmludmVydCA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciBhMCA9IGFbMF0sIGExID0gYVsxXSwgYTIgPSBhWzJdLCBhMyA9IGFbM10sXG4gICAgICAgIGRvdCA9IGEwKmEwICsgYTEqYTEgKyBhMiphMiArIGEzKmEzLFxuICAgICAgICBpbnZEb3QgPSBkb3QgPyAxLjAvZG90IDogMDtcbiAgICBcbiAgICAvLyBUT0RPOiBXb3VsZCBiZSBmYXN0ZXIgdG8gcmV0dXJuIFswLDAsMCwwXSBpbW1lZGlhdGVseSBpZiBkb3QgPT0gMFxuXG4gICAgb3V0WzBdID0gLWEwKmludkRvdDtcbiAgICBvdXRbMV0gPSAtYTEqaW52RG90O1xuICAgIG91dFsyXSA9IC1hMippbnZEb3Q7XG4gICAgb3V0WzNdID0gYTMqaW52RG90O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGNvbmp1Z2F0ZSBvZiBhIHF1YXRcbiAqIElmIHRoZSBxdWF0ZXJuaW9uIGlzIG5vcm1hbGl6ZWQsIHRoaXMgZnVuY3Rpb24gaXMgZmFzdGVyIHRoYW4gcXVhdC5pbnZlcnNlIGFuZCBwcm9kdWNlcyB0aGUgc2FtZSByZXN1bHQuXG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3F1YXR9IGEgcXVhdCB0byBjYWxjdWxhdGUgY29uanVnYXRlIG9mXG4gKiBAcmV0dXJucyB7cXVhdH0gb3V0XG4gKi9cbnF1YXQuY29uanVnYXRlID0gZnVuY3Rpb24gKG91dCwgYSkge1xuICAgIG91dFswXSA9IC1hWzBdO1xuICAgIG91dFsxXSA9IC1hWzFdO1xuICAgIG91dFsyXSA9IC1hWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgcXVhdFxuICpcbiAqIEBwYXJhbSB7cXVhdH0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gbGVuZ3RoIG9mIGFcbiAqIEBmdW5jdGlvblxuICovXG5xdWF0Lmxlbmd0aCA9IHZlYzQubGVuZ3RoO1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgcXVhdC5sZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xucXVhdC5sZW4gPSBxdWF0Lmxlbmd0aDtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHF1YXRcbiAqXG4gKiBAcGFyYW0ge3F1YXR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxuICogQGZ1bmN0aW9uXG4gKi9cbnF1YXQuc3F1YXJlZExlbmd0aCA9IHZlYzQuc3F1YXJlZExlbmd0aDtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHF1YXQuc3F1YXJlZExlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG5xdWF0LnNxckxlbiA9IHF1YXQuc3F1YXJlZExlbmd0aDtcblxuLyoqXG4gKiBOb3JtYWxpemUgYSBxdWF0XG4gKlxuICogQHBhcmFtIHtxdWF0fSBvdXQgdGhlIHJlY2VpdmluZyBxdWF0ZXJuaW9uXG4gKiBAcGFyYW0ge3F1YXR9IGEgcXVhdGVybmlvbiB0byBub3JtYWxpemVcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5xdWF0Lm5vcm1hbGl6ZSA9IHZlYzQubm9ybWFsaXplO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBxdWF0ZXJuaW9uIGZyb20gdGhlIGdpdmVuIDN4MyByb3RhdGlvbiBtYXRyaXguXG4gKlxuICogTk9URTogVGhlIHJlc3VsdGFudCBxdWF0ZXJuaW9uIGlzIG5vdCBub3JtYWxpemVkLCBzbyB5b3Ugc2hvdWxkIGJlIHN1cmVcbiAqIHRvIHJlbm9ybWFsaXplIHRoZSBxdWF0ZXJuaW9uIHlvdXJzZWxmIHdoZXJlIG5lY2Vzc2FyeS5cbiAqXG4gKiBAcGFyYW0ge3F1YXR9IG91dCB0aGUgcmVjZWl2aW5nIHF1YXRlcm5pb25cbiAqIEBwYXJhbSB7bWF0M30gbSByb3RhdGlvbiBtYXRyaXhcbiAqIEByZXR1cm5zIHtxdWF0fSBvdXRcbiAqIEBmdW5jdGlvblxuICovXG5xdWF0LmZyb21NYXQzID0gZnVuY3Rpb24ob3V0LCBtKSB7XG4gICAgLy8gQWxnb3JpdGhtIGluIEtlbiBTaG9lbWFrZSdzIGFydGljbGUgaW4gMTk4NyBTSUdHUkFQSCBjb3Vyc2Ugbm90ZXNcbiAgICAvLyBhcnRpY2xlIFwiUXVhdGVybmlvbiBDYWxjdWx1cyBhbmQgRmFzdCBBbmltYXRpb25cIi5cbiAgICB2YXIgZlRyYWNlID0gbVswXSArIG1bNF0gKyBtWzhdO1xuICAgIHZhciBmUm9vdDtcblxuICAgIGlmICggZlRyYWNlID4gMC4wICkge1xuICAgICAgICAvLyB8d3wgPiAxLzIsIG1heSBhcyB3ZWxsIGNob29zZSB3ID4gMS8yXG4gICAgICAgIGZSb290ID0gTWF0aC5zcXJ0KGZUcmFjZSArIDEuMCk7ICAvLyAyd1xuICAgICAgICBvdXRbM10gPSAwLjUgKiBmUm9vdDtcbiAgICAgICAgZlJvb3QgPSAwLjUvZlJvb3Q7ICAvLyAxLyg0dylcbiAgICAgICAgb3V0WzBdID0gKG1bNV0tbVs3XSkqZlJvb3Q7XG4gICAgICAgIG91dFsxXSA9IChtWzZdLW1bMl0pKmZSb290O1xuICAgICAgICBvdXRbMl0gPSAobVsxXS1tWzNdKSpmUm9vdDtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyB8d3wgPD0gMS8yXG4gICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgaWYgKCBtWzRdID4gbVswXSApXG4gICAgICAgICAgaSA9IDE7XG4gICAgICAgIGlmICggbVs4XSA+IG1baSozK2ldIClcbiAgICAgICAgICBpID0gMjtcbiAgICAgICAgdmFyIGogPSAoaSsxKSUzO1xuICAgICAgICB2YXIgayA9IChpKzIpJTM7XG4gICAgICAgIFxuICAgICAgICBmUm9vdCA9IE1hdGguc3FydChtW2kqMytpXS1tW2oqMytqXS1tW2sqMytrXSArIDEuMCk7XG4gICAgICAgIG91dFtpXSA9IDAuNSAqIGZSb290O1xuICAgICAgICBmUm9vdCA9IDAuNSAvIGZSb290O1xuICAgICAgICBvdXRbM10gPSAobVtqKjMra10gLSBtW2sqMytqXSkgKiBmUm9vdDtcbiAgICAgICAgb3V0W2pdID0gKG1baiozK2ldICsgbVtpKjMral0pICogZlJvb3Q7XG4gICAgICAgIG91dFtrXSA9IChtW2sqMytpXSArIG1baSozK2tdKSAqIGZSb290O1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgcXVhdGVuaW9uXG4gKlxuICogQHBhcmFtIHtxdWF0fSB2ZWMgdmVjdG9yIHRvIHJlcHJlc2VudCBhcyBhIHN0cmluZ1xuICogQHJldHVybnMge1N0cmluZ30gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2ZWN0b3JcbiAqL1xucXVhdC5zdHIgPSBmdW5jdGlvbiAoYSkge1xuICAgIHJldHVybiAncXVhdCgnICsgYVswXSArICcsICcgKyBhWzFdICsgJywgJyArIGFbMl0gKyAnLCAnICsgYVszXSArICcpJztcbn07XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcXVhdGVybmlvbnMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7cXVhdH0gYSBUaGUgZmlyc3QgcXVhdGVybmlvbi5cbiAqIEBwYXJhbSB7cXVhdH0gYiBUaGUgc2Vjb25kIHF1YXRlcm5pb24uXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiB0aGUgdmVjdG9ycyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xucXVhdC5leGFjdEVxdWFscyA9IHZlYzQuZXhhY3RFcXVhbHM7XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgcXVhdGVybmlvbnMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxuICpcbiAqIEBwYXJhbSB7cXVhdH0gYSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHtxdWF0fSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbnF1YXQuZXF1YWxzID0gdmVjNC5lcXVhbHM7XG5cbm1vZHVsZS5leHBvcnRzID0gcXVhdDtcbiIsIi8qIENvcHlyaWdodCAoYykgMjAxNSwgQnJhbmRvbiBKb25lcywgQ29saW4gTWFjS2VuemllIElWLlxuXG5QZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG5vZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG5pbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG50byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG5jb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG5cblRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG5hbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cblxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG5GSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG5PVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG5USEUgU09GVFdBUkUuICovXG5cbnZhciBnbE1hdHJpeCA9IHJlcXVpcmUoXCIuL2NvbW1vbi5qc1wiKTtcblxuLyoqXG4gKiBAY2xhc3MgMiBEaW1lbnNpb25hbCBWZWN0b3JcbiAqIEBuYW1lIHZlYzJcbiAqL1xudmFyIHZlYzIgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB2ZWMyXG4gKlxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG52ZWMyLmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgyKTtcbiAgICBvdXRbMF0gPSAwO1xuICAgIG91dFsxXSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMyIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBjbG9uZVxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG52ZWMyLmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgyKTtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMyIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzJ9IGEgbmV3IDJEIHZlY3RvclxuICovXG52ZWMyLmZyb21WYWx1ZXMgPSBmdW5jdGlvbih4LCB5KSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDIpO1xuICAgIG91dFswXSA9IHg7XG4gICAgb3V0WzFdID0geTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgdmVjMiB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgc291cmNlIHZlY3RvclxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLmNvcHkgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMiB0byB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSB4IFggY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geSBZIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnNldCA9IGZ1bmN0aW9uKG91dCwgeCwgeSkge1xuICAgIG91dFswXSA9IHg7XG4gICAgb3V0WzFdID0geTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBZGRzIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIuYWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSArIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSArIGJbMV07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogU3VidHJhY3RzIHZlY3RvciBiIGZyb20gdmVjdG9yIGFcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIuc3VidHJhY3QgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdIC0gYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdIC0gYlsxXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzIuc3VidHJhY3R9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5zdWIgPSB2ZWMyLnN1YnRyYWN0O1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5tdWx0aXBseSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKiBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gKiBiWzFdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5tdWx0aXBseX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWMyLm11bCA9IHZlYzIubXVsdGlwbHk7XG5cbi8qKlxuICogRGl2aWRlcyB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLmRpdmlkZSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gLyBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gLyBiWzFdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5kaXZpZGV9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5kaXYgPSB2ZWMyLmRpdmlkZTtcblxuLyoqXG4gKiBNYXRoLmNlaWwgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB2ZWN0b3IgdG8gY2VpbFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLmNlaWwgPSBmdW5jdGlvbiAob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gTWF0aC5jZWlsKGFbMF0pO1xuICAgIG91dFsxXSA9IE1hdGguY2VpbChhWzFdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBNYXRoLmZsb29yIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIGZsb29yXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIuZmxvb3IgPSBmdW5jdGlvbiAob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gTWF0aC5mbG9vcihhWzBdKTtcbiAgICBvdXRbMV0gPSBNYXRoLmZsb29yKGFbMV0pO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1pbmltdW0gb2YgdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5taW4gPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBNYXRoLm1pbihhWzBdLCBiWzBdKTtcbiAgICBvdXRbMV0gPSBNYXRoLm1pbihhWzFdLCBiWzFdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIubWF4ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gTWF0aC5tYXgoYVswXSwgYlswXSk7XG4gICAgb3V0WzFdID0gTWF0aC5tYXgoYVsxXSwgYlsxXSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogTWF0aC5yb3VuZCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byByb3VuZFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnJvdW5kID0gZnVuY3Rpb24gKG91dCwgYSkge1xuICAgIG91dFswXSA9IE1hdGgucm91bmQoYVswXSk7XG4gICAgb3V0WzFdID0gTWF0aC5yb3VuZChhWzFdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTY2FsZXMgYSB2ZWMyIGJ5IGEgc2NhbGFyIG51bWJlclxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKiBiO1xuICAgIG91dFsxXSA9IGFbMV0gKiBiO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFkZHMgdHdvIHZlYzIncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnNjYWxlQW5kQWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiLCBzY2FsZSkge1xuICAgIG91dFswXSA9IGFbMF0gKyAoYlswXSAqIHNjYWxlKTtcbiAgICBvdXRbMV0gPSBhWzFdICsgKGJbMV0gKiBzY2FsZSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZXVjbGlkaWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlYzInc1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZGlzdGFuY2UgYmV0d2VlbiBhIGFuZCBiXG4gKi9cbnZlYzIuZGlzdGFuY2UgPSBmdW5jdGlvbihhLCBiKSB7XG4gICAgdmFyIHggPSBiWzBdIC0gYVswXSxcbiAgICAgICAgeSA9IGJbMV0gLSBhWzFdO1xuICAgIHJldHVybiBNYXRoLnNxcnQoeCp4ICsgeSp5KTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLmRpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzIuZGlzdCA9IHZlYzIuZGlzdGFuY2U7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG52ZWMyLnNxdWFyZWREaXN0YW5jZSA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgICB5ID0gYlsxXSAtIGFbMV07XG4gICAgcmV0dXJuIHgqeCArIHkqeTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnNxdWFyZWREaXN0YW5jZX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWMyLnNxckRpc3QgPSB2ZWMyLnNxdWFyZWREaXN0YW5jZTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgYSB2ZWMyXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBjYWxjdWxhdGUgbGVuZ3RoIG9mXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBsZW5ndGggb2YgYVxuICovXG52ZWMyLmxlbmd0aCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHgqeCArIHkqeSk7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMi5sZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5sZW4gPSB2ZWMyLmxlbmd0aDtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxuICovXG52ZWMyLnNxdWFyZWRMZW5ndGggPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV07XG4gICAgcmV0dXJuIHgqeCArIHkqeTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMyLnNxdWFyZWRMZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5zcXJMZW4gPSB2ZWMyLnNxdWFyZWRMZW5ndGg7XG5cbi8qKlxuICogTmVnYXRlcyB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzJcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHZlY3RvciB0byBuZWdhdGVcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi5uZWdhdGUgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSAtYVswXTtcbiAgICBvdXRbMV0gPSAtYVsxXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbnZlcnNlIG9mIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIGludmVydFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLmludmVyc2UgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgb3V0WzBdID0gMS4wIC8gYVswXTtcbiAgb3V0WzFdID0gMS4wIC8gYVsxXTtcbiAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogTm9ybWFsaXplIGEgdmVjMlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdmVjdG9yIHRvIG5vcm1hbGl6ZVxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV07XG4gICAgdmFyIGxlbiA9IHgqeCArIHkqeTtcbiAgICBpZiAobGVuID4gMCkge1xuICAgICAgICAvL1RPRE86IGV2YWx1YXRlIHVzZSBvZiBnbG1faW52c3FydCBoZXJlP1xuICAgICAgICBsZW4gPSAxIC8gTWF0aC5zcXJ0KGxlbik7XG4gICAgICAgIG91dFswXSA9IGFbMF0gKiBsZW47XG4gICAgICAgIG91dFsxXSA9IGFbMV0gKiBsZW47XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGRvdCBwcm9kdWN0IG9mIHR3byB2ZWMyJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjMn0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRvdCBwcm9kdWN0IG9mIGEgYW5kIGJcbiAqL1xudmVjMi5kb3QgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdO1xufTtcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgY3Jvc3MgcHJvZHVjdCBvZiB0d28gdmVjMidzXG4gKiBOb3RlIHRoYXQgdGhlIGNyb3NzIHByb2R1Y3QgbXVzdCBieSBkZWZpbml0aW9uIHByb2R1Y2UgYSAzRCB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzJ9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzIuY3Jvc3MgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICB2YXIgeiA9IGFbMF0gKiBiWzFdIC0gYVsxXSAqIGJbMF07XG4gICAgb3V0WzBdID0gb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSB6O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjMidzXG4gKlxuICogQHBhcmFtIHt2ZWMyfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjMn0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMyfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLmxlcnAgPSBmdW5jdGlvbiAob3V0LCBhLCBiLCB0KSB7XG4gICAgdmFyIGF4ID0gYVswXSxcbiAgICAgICAgYXkgPSBhWzFdO1xuICAgIG91dFswXSA9IGF4ICsgdCAqIChiWzBdIC0gYXgpO1xuICAgIG91dFsxXSA9IGF5ICsgdCAqIChiWzFdIC0gYXkpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHJhbmRvbSB2ZWN0b3Igd2l0aCB0aGUgZ2l2ZW4gc2NhbGVcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IFtzY2FsZV0gTGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yLiBJZiBvbW1pdHRlZCwgYSB1bml0IHZlY3RvciB3aWxsIGJlIHJldHVybmVkXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIucmFuZG9tID0gZnVuY3Rpb24gKG91dCwgc2NhbGUpIHtcbiAgICBzY2FsZSA9IHNjYWxlIHx8IDEuMDtcbiAgICB2YXIgciA9IGdsTWF0cml4LlJBTkRPTSgpICogMi4wICogTWF0aC5QSTtcbiAgICBvdXRbMF0gPSBNYXRoLmNvcyhyKSAqIHNjYWxlO1xuICAgIG91dFsxXSA9IE1hdGguc2luKHIpICogc2NhbGU7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0MlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0Mn0gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi50cmFuc2Zvcm1NYXQyID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bMl0gKiB5O1xuICAgIG91dFsxXSA9IG1bMV0gKiB4ICsgbVszXSAqIHk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMiB3aXRoIGEgbWF0MmRcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge21hdDJkfSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzJ9IG91dFxuICovXG52ZWMyLnRyYW5zZm9ybU1hdDJkID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bMl0gKiB5ICsgbVs0XTtcbiAgICBvdXRbMV0gPSBtWzFdICogeCArIG1bM10gKiB5ICsgbVs1XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQzXG4gKiAzcmQgdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcxJ1xuICpcbiAqIEBwYXJhbSB7dmVjMn0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzJ9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7bWF0M30gbSBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMyfSBvdXRcbiAqL1xudmVjMi50cmFuc2Zvcm1NYXQzID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXTtcbiAgICBvdXRbMF0gPSBtWzBdICogeCArIG1bM10gKiB5ICsgbVs2XTtcbiAgICBvdXRbMV0gPSBtWzFdICogeCArIG1bNF0gKiB5ICsgbVs3XTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMyIHdpdGggYSBtYXQ0XG4gKiAzcmQgdmVjdG9yIGNvbXBvbmVudCBpcyBpbXBsaWNpdGx5ICcwJ1xuICogNHRoIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMyfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge21hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjMn0gb3V0XG4gKi9cbnZlYzIudHJhbnNmb3JtTWF0NCA9IGZ1bmN0aW9uKG91dCwgYSwgbSkge1xuICAgIHZhciB4ID0gYVswXSwgXG4gICAgICAgIHkgPSBhWzFdO1xuICAgIG91dFswXSA9IG1bMF0gKiB4ICsgbVs0XSAqIHkgKyBtWzEyXTtcbiAgICBvdXRbMV0gPSBtWzFdICogeCArIG1bNV0gKiB5ICsgbVsxM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzJzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzIuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWMycyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxuICogQHJldHVybnMge0FycmF5fSBhXG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMi5mb3JFYWNoID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ZWMgPSB2ZWMyLmNyZWF0ZSgpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGEsIHN0cmlkZSwgb2Zmc2V0LCBjb3VudCwgZm4sIGFyZykge1xuICAgICAgICB2YXIgaSwgbDtcbiAgICAgICAgaWYoIXN0cmlkZSkge1xuICAgICAgICAgICAgc3RyaWRlID0gMjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFvZmZzZXQpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmKGNvdW50KSB7XG4gICAgICAgICAgICBsID0gTWF0aC5taW4oKGNvdW50ICogc3RyaWRlKSArIG9mZnNldCwgYS5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbCA9IGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yKGkgPSBvZmZzZXQ7IGkgPCBsOyBpICs9IHN0cmlkZSkge1xuICAgICAgICAgICAgdmVjWzBdID0gYVtpXTsgdmVjWzFdID0gYVtpKzFdO1xuICAgICAgICAgICAgZm4odmVjLCB2ZWMsIGFyZyk7XG4gICAgICAgICAgICBhW2ldID0gdmVjWzBdOyBhW2krMV0gPSB2ZWNbMV07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBhO1xuICAgIH07XG59KSgpO1xuXG4vKipcbiAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB2ZWN0b3JcbiAqXG4gKiBAcGFyYW0ge3ZlYzJ9IHZlYyB2ZWN0b3IgdG8gcmVwcmVzZW50IGFzIGEgc3RyaW5nXG4gKiBAcmV0dXJucyB7U3RyaW5nfSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZlY3RvclxuICovXG52ZWMyLnN0ciA9IGZ1bmN0aW9uIChhKSB7XG4gICAgcmV0dXJuICd2ZWMyKCcgKyBhWzBdICsgJywgJyArIGFbMV0gKyAnKSc7XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgZXhhY3RseSBoYXZlIHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7dmVjMn0gYSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHt2ZWMyfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbnZlYzIuZXhhY3RFcXVhbHMgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV07XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxuICpcbiAqIEBwYXJhbSB7dmVjMn0gYSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHt2ZWMyfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbnZlYzIuZXF1YWxzID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV07XG4gICAgdmFyIGIwID0gYlswXSwgYjEgPSBiWzFdO1xuICAgIHJldHVybiAoTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHZlYzI7XG4iLCIvKiBDb3B5cmlnaHQgKGMpIDIwMTUsIEJyYW5kb24gSm9uZXMsIENvbGluIE1hY0tlbnppZSBJVi5cblxuUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxub2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xudG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG5mdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuXG5UaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG5cblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG5BVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG5MSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuVEhFIFNPRlRXQVJFLiAqL1xuXG52YXIgZ2xNYXRyaXggPSByZXF1aXJlKFwiLi9jb21tb24uanNcIik7XG5cbi8qKlxuICogQGNsYXNzIDMgRGltZW5zaW9uYWwgVmVjdG9yXG4gKiBAbmFtZSB2ZWMzXG4gKi9cbnZhciB2ZWMzID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgdmVjM1xuICpcbiAqIEByZXR1cm5zIHt2ZWMzfSBhIG5ldyAzRCB2ZWN0b3JcbiAqL1xudmVjMy5jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgb3V0ID0gbmV3IGdsTWF0cml4LkFSUkFZX1RZUEUoMyk7XG4gICAgb3V0WzBdID0gMDtcbiAgICBvdXRbMV0gPSAwO1xuICAgIG91dFsyXSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWMzIGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBjbG9uZVxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxuICovXG52ZWMzLmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSgzKTtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHZlYzMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzN9IGEgbmV3IDNEIHZlY3RvclxuICovXG52ZWMzLmZyb21WYWx1ZXMgPSBmdW5jdGlvbih4LCB5LCB6KSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDMpO1xuICAgIG91dFswXSA9IHg7XG4gICAgb3V0WzFdID0geTtcbiAgICBvdXRbMl0gPSB6O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENvcHkgdGhlIHZhbHVlcyBmcm9tIG9uZSB2ZWMzIHRvIGFub3RoZXJcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBzb3VyY2UgdmVjdG9yXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMuY29weSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzMgdG8gdGhlIGdpdmVuIHZhbHVlc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMuc2V0ID0gZnVuY3Rpb24ob3V0LCB4LCB5LCB6KSB7XG4gICAgb3V0WzBdID0geDtcbiAgICBvdXRbMV0gPSB5O1xuICAgIG91dFsyXSA9IHo7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWRkcyB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLmFkZCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKyBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gKyBiWzFdO1xuICAgIG91dFsyXSA9IGFbMl0gKyBiWzJdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFN1YnRyYWN0cyB2ZWN0b3IgYiBmcm9tIHZlY3RvciBhXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnN1YnRyYWN0ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAtIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAtIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSAtIGJbMl07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLnN1YnRyYWN0fVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuc3ViID0gdmVjMy5zdWJ0cmFjdDtcblxuLyoqXG4gKiBNdWx0aXBsaWVzIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMubXVsdGlwbHkgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICogYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdICogYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdICogYlsyXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMubXVsdGlwbHl9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMy5tdWwgPSB2ZWMzLm11bHRpcGx5O1xuXG4vKipcbiAqIERpdmlkZXMgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5kaXZpZGUgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdIC8gYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdIC8gYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdIC8gYlsyXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuZGl2aWRlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuZGl2ID0gdmVjMy5kaXZpZGU7XG5cbi8qKlxuICogTWF0aC5jZWlsIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjM1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIGNlaWxcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5jZWlsID0gZnVuY3Rpb24gKG91dCwgYSkge1xuICAgIG91dFswXSA9IE1hdGguY2VpbChhWzBdKTtcbiAgICBvdXRbMV0gPSBNYXRoLmNlaWwoYVsxXSk7XG4gICAgb3V0WzJdID0gTWF0aC5jZWlsKGFbMl0pO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIE1hdGguZmxvb3IgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB2ZWN0b3IgdG8gZmxvb3JcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5mbG9vciA9IGZ1bmN0aW9uIChvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBNYXRoLmZsb29yKGFbMF0pO1xuICAgIG91dFsxXSA9IE1hdGguZmxvb3IoYVsxXSk7XG4gICAgb3V0WzJdID0gTWF0aC5mbG9vcihhWzJdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtaW5pbXVtIG9mIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMubWluID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gTWF0aC5taW4oYVswXSwgYlswXSk7XG4gICAgb3V0WzFdID0gTWF0aC5taW4oYVsxXSwgYlsxXSk7XG4gICAgb3V0WzJdID0gTWF0aC5taW4oYVsyXSwgYlsyXSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWF4aW11bSBvZiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLm1heCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IE1hdGgubWF4KGFbMF0sIGJbMF0pO1xuICAgIG91dFsxXSA9IE1hdGgubWF4KGFbMV0sIGJbMV0pO1xuICAgIG91dFsyXSA9IE1hdGgubWF4KGFbMl0sIGJbMl0pO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIE1hdGgucm91bmQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB2ZWN0b3IgdG8gcm91bmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5yb3VuZCA9IGZ1bmN0aW9uIChvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBNYXRoLnJvdW5kKGFbMF0pO1xuICAgIG91dFsxXSA9IE1hdGgucm91bmQoYVsxXSk7XG4gICAgb3V0WzJdID0gTWF0aC5yb3VuZChhWzJdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTY2FsZXMgYSB2ZWMzIGJ5IGEgc2NhbGFyIG51bWJlclxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKiBiO1xuICAgIG91dFsxXSA9IGFbMV0gKiBiO1xuICAgIG91dFsyXSA9IGFbMl0gKiBiO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFkZHMgdHdvIHZlYzMncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnNjYWxlQW5kQWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiLCBzY2FsZSkge1xuICAgIG91dFswXSA9IGFbMF0gKyAoYlswXSAqIHNjYWxlKTtcbiAgICBvdXRbMV0gPSBhWzFdICsgKGJbMV0gKiBzY2FsZSk7XG4gICAgb3V0WzJdID0gYVsyXSArIChiWzJdICogc2NhbGUpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGV1Y2xpZGlhbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG52ZWMzLmRpc3RhbmNlID0gZnVuY3Rpb24oYSwgYikge1xuICAgIHZhciB4ID0gYlswXSAtIGFbMF0sXG4gICAgICAgIHkgPSBiWzFdIC0gYVsxXSxcbiAgICAgICAgeiA9IGJbMl0gLSBhWzJdO1xuICAgIHJldHVybiBNYXRoLnNxcnQoeCp4ICsgeSp5ICsgeip6KTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWMzLmRpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuZGlzdCA9IHZlYzMuZGlzdGFuY2U7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjMydzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG52ZWMzLnNxdWFyZWREaXN0YW5jZSA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgICB5ID0gYlsxXSAtIGFbMV0sXG4gICAgICAgIHogPSBiWzJdIC0gYVsyXTtcbiAgICByZXR1cm4geCp4ICsgeSp5ICsgeip6O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzMuc3F1YXJlZERpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuc3FyRGlzdCA9IHZlYzMuc3F1YXJlZERpc3RhbmNlO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBsZW5ndGggb2ZcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IGxlbmd0aCBvZiBhXG4gKi9cbnZlYzMubGVuZ3RoID0gZnVuY3Rpb24gKGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHgqeCArIHkqeSArIHoqeik7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5sZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjMy5sZW4gPSB2ZWMzLmxlbmd0aDtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxuICovXG52ZWMzLnNxdWFyZWRMZW5ndGggPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV0sXG4gICAgICAgIHogPSBhWzJdO1xuICAgIHJldHVybiB4KnggKyB5KnkgKyB6Kno7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjMy5zcXVhcmVkTGVuZ3RofVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuc3FyTGVuID0gdmVjMy5zcXVhcmVkTGVuZ3RoO1xuXG4vKipcbiAqIE5lZ2F0ZXMgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWMzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB2ZWN0b3IgdG8gbmVnYXRlXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMubmVnYXRlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gLWFbMF07XG4gICAgb3V0WzFdID0gLWFbMV07XG4gICAgb3V0WzJdID0gLWFbMl07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgaW52ZXJzZSBvZiB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBpbnZlcnRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5pbnZlcnNlID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gIG91dFswXSA9IDEuMCAvIGFbMF07XG4gIG91dFsxXSA9IDEuMCAvIGFbMV07XG4gIG91dFsyXSA9IDEuMCAvIGFbMl07XG4gIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBhIHZlYzNcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHZlY3RvciB0byBub3JtYWxpemVcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5ub3JtYWxpemUgPSBmdW5jdGlvbihvdXQsIGEpIHtcbiAgICB2YXIgeCA9IGFbMF0sXG4gICAgICAgIHkgPSBhWzFdLFxuICAgICAgICB6ID0gYVsyXTtcbiAgICB2YXIgbGVuID0geCp4ICsgeSp5ICsgeip6O1xuICAgIGlmIChsZW4gPiAwKSB7XG4gICAgICAgIC8vVE9ETzogZXZhbHVhdGUgdXNlIG9mIGdsbV9pbnZzcXJ0IGhlcmU/XG4gICAgICAgIGxlbiA9IDEgLyBNYXRoLnNxcnQobGVuKTtcbiAgICAgICAgb3V0WzBdID0gYVswXSAqIGxlbjtcbiAgICAgICAgb3V0WzFdID0gYVsxXSAqIGxlbjtcbiAgICAgICAgb3V0WzJdID0gYVsyXSAqIGxlbjtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge051bWJlcn0gZG90IHByb2R1Y3Qgb2YgYSBhbmQgYlxuICovXG52ZWMzLmRvdCA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgcmV0dXJuIGFbMF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXTtcbn07XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGNyb3NzIHByb2R1Y3Qgb2YgdHdvIHZlYzMnc1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5jcm9zcyA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIHZhciBheCA9IGFbMF0sIGF5ID0gYVsxXSwgYXogPSBhWzJdLFxuICAgICAgICBieCA9IGJbMF0sIGJ5ID0gYlsxXSwgYnogPSBiWzJdO1xuXG4gICAgb3V0WzBdID0gYXkgKiBieiAtIGF6ICogYnk7XG4gICAgb3V0WzFdID0gYXogKiBieCAtIGF4ICogYno7XG4gICAgb3V0WzJdID0gYXggKiBieSAtIGF5ICogYng7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHR3byB2ZWMzJ3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMubGVycCA9IGZ1bmN0aW9uIChvdXQsIGEsIGIsIHQpIHtcbiAgICB2YXIgYXggPSBhWzBdLFxuICAgICAgICBheSA9IGFbMV0sXG4gICAgICAgIGF6ID0gYVsyXTtcbiAgICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgICBvdXRbMV0gPSBheSArIHQgKiAoYlsxXSAtIGF5KTtcbiAgICBvdXRbMl0gPSBheiArIHQgKiAoYlsyXSAtIGF6KTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIGhlcm1pdGUgaW50ZXJwb2xhdGlvbiB3aXRoIHR3byBjb250cm9sIHBvaW50c1xuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYyB0aGUgdGhpcmQgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBkIHRoZSBmb3VydGggb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLmhlcm1pdGUgPSBmdW5jdGlvbiAob3V0LCBhLCBiLCBjLCBkLCB0KSB7XG4gIHZhciBmYWN0b3JUaW1lczIgPSB0ICogdCxcbiAgICAgIGZhY3RvcjEgPSBmYWN0b3JUaW1lczIgKiAoMiAqIHQgLSAzKSArIDEsXG4gICAgICBmYWN0b3IyID0gZmFjdG9yVGltZXMyICogKHQgLSAyKSArIHQsXG4gICAgICBmYWN0b3IzID0gZmFjdG9yVGltZXMyICogKHQgLSAxKSxcbiAgICAgIGZhY3RvcjQgPSBmYWN0b3JUaW1lczIgKiAoMyAtIDIgKiB0KTtcbiAgXG4gIG91dFswXSA9IGFbMF0gKiBmYWN0b3IxICsgYlswXSAqIGZhY3RvcjIgKyBjWzBdICogZmFjdG9yMyArIGRbMF0gKiBmYWN0b3I0O1xuICBvdXRbMV0gPSBhWzFdICogZmFjdG9yMSArIGJbMV0gKiBmYWN0b3IyICsgY1sxXSAqIGZhY3RvcjMgKyBkWzFdICogZmFjdG9yNDtcbiAgb3V0WzJdID0gYVsyXSAqIGZhY3RvcjEgKyBiWzJdICogZmFjdG9yMiArIGNbMl0gKiBmYWN0b3IzICsgZFsyXSAqIGZhY3RvcjQ7XG4gIFxuICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIGJlemllciBpbnRlcnBvbGF0aW9uIHdpdGggdHdvIGNvbnRyb2wgcG9pbnRzXG4gKlxuICogQHBhcmFtIHt2ZWMzfSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjM30gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWMzfSBjIHRoZSB0aGlyZCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzN9IGQgdGhlIGZvdXJ0aCBvcGVyYW5kXG4gKiBAcGFyYW0ge051bWJlcn0gdCBpbnRlcnBvbGF0aW9uIGFtb3VudCBiZXR3ZWVuIHRoZSB0d28gaW5wdXRzXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMuYmV6aWVyID0gZnVuY3Rpb24gKG91dCwgYSwgYiwgYywgZCwgdCkge1xuICB2YXIgaW52ZXJzZUZhY3RvciA9IDEgLSB0LFxuICAgICAgaW52ZXJzZUZhY3RvclRpbWVzVHdvID0gaW52ZXJzZUZhY3RvciAqIGludmVyc2VGYWN0b3IsXG4gICAgICBmYWN0b3JUaW1lczIgPSB0ICogdCxcbiAgICAgIGZhY3RvcjEgPSBpbnZlcnNlRmFjdG9yVGltZXNUd28gKiBpbnZlcnNlRmFjdG9yLFxuICAgICAgZmFjdG9yMiA9IDMgKiB0ICogaW52ZXJzZUZhY3RvclRpbWVzVHdvLFxuICAgICAgZmFjdG9yMyA9IDMgKiBmYWN0b3JUaW1lczIgKiBpbnZlcnNlRmFjdG9yLFxuICAgICAgZmFjdG9yNCA9IGZhY3RvclRpbWVzMiAqIHQ7XG4gIFxuICBvdXRbMF0gPSBhWzBdICogZmFjdG9yMSArIGJbMF0gKiBmYWN0b3IyICsgY1swXSAqIGZhY3RvcjMgKyBkWzBdICogZmFjdG9yNDtcbiAgb3V0WzFdID0gYVsxXSAqIGZhY3RvcjEgKyBiWzFdICogZmFjdG9yMiArIGNbMV0gKiBmYWN0b3IzICsgZFsxXSAqIGZhY3RvcjQ7XG4gIG91dFsyXSA9IGFbMl0gKiBmYWN0b3IxICsgYlsyXSAqIGZhY3RvcjIgKyBjWzJdICogZmFjdG9yMyArIGRbMl0gKiBmYWN0b3I0O1xuICBcbiAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgcmFuZG9tIHZlY3RvciB3aXRoIHRoZSBnaXZlbiBzY2FsZVxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge051bWJlcn0gW3NjYWxlXSBMZW5ndGggb2YgdGhlIHJlc3VsdGluZyB2ZWN0b3IuIElmIG9tbWl0dGVkLCBhIHVuaXQgdmVjdG9yIHdpbGwgYmUgcmV0dXJuZWRcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5yYW5kb20gPSBmdW5jdGlvbiAob3V0LCBzY2FsZSkge1xuICAgIHNjYWxlID0gc2NhbGUgfHwgMS4wO1xuXG4gICAgdmFyIHIgPSBnbE1hdHJpeC5SQU5ET00oKSAqIDIuMCAqIE1hdGguUEk7XG4gICAgdmFyIHogPSAoZ2xNYXRyaXguUkFORE9NKCkgKiAyLjApIC0gMS4wO1xuICAgIHZhciB6U2NhbGUgPSBNYXRoLnNxcnQoMS4wLXoqeikgKiBzY2FsZTtcblxuICAgIG91dFswXSA9IE1hdGguY29zKHIpICogelNjYWxlO1xuICAgIG91dFsxXSA9IE1hdGguc2luKHIpICogelNjYWxlO1xuICAgIG91dFsyXSA9IHogKiBzY2FsZTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRoZSB2ZWMzIHdpdGggYSBtYXQ0LlxuICogNHRoIHZlY3RvciBjb21wb25lbnQgaXMgaW1wbGljaXRseSAnMSdcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge21hdDR9IG0gbWF0cml4IHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMudHJhbnNmb3JtTWF0NCA9IGZ1bmN0aW9uKG91dCwgYSwgbSkge1xuICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sIHogPSBhWzJdLFxuICAgICAgICB3ID0gbVszXSAqIHggKyBtWzddICogeSArIG1bMTFdICogeiArIG1bMTVdO1xuICAgIHcgPSB3IHx8IDEuMDtcbiAgICBvdXRbMF0gPSAobVswXSAqIHggKyBtWzRdICogeSArIG1bOF0gKiB6ICsgbVsxMl0pIC8gdztcbiAgICBvdXRbMV0gPSAobVsxXSAqIHggKyBtWzVdICogeSArIG1bOV0gKiB6ICsgbVsxM10pIC8gdztcbiAgICBvdXRbMl0gPSAobVsyXSAqIHggKyBtWzZdICogeSArIG1bMTBdICogeiArIG1bMTRdKSAvIHc7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMyB3aXRoIGEgbWF0My5cbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWMzfSBhIHRoZSB2ZWN0b3IgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge21hdDR9IG0gdGhlIDN4MyBtYXRyaXggdG8gdHJhbnNmb3JtIHdpdGhcbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy50cmFuc2Zvcm1NYXQzID0gZnVuY3Rpb24ob3V0LCBhLCBtKSB7XG4gICAgdmFyIHggPSBhWzBdLCB5ID0gYVsxXSwgeiA9IGFbMl07XG4gICAgb3V0WzBdID0geCAqIG1bMF0gKyB5ICogbVszXSArIHogKiBtWzZdO1xuICAgIG91dFsxXSA9IHggKiBtWzFdICsgeSAqIG1bNF0gKyB6ICogbVs3XTtcbiAgICBvdXRbMl0gPSB4ICogbVsyXSArIHkgKiBtWzVdICsgeiAqIG1bOF07XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjMyB3aXRoIGEgcXVhdFxuICpcbiAqIEBwYXJhbSB7dmVjM30gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzN9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7cXVhdH0gcSBxdWF0ZXJuaW9uIHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjM30gb3V0XG4gKi9cbnZlYzMudHJhbnNmb3JtUXVhdCA9IGZ1bmN0aW9uKG91dCwgYSwgcSkge1xuICAgIC8vIGJlbmNobWFya3M6IGh0dHA6Ly9qc3BlcmYuY29tL3F1YXRlcm5pb24tdHJhbnNmb3JtLXZlYzMtaW1wbGVtZW50YXRpb25zXG5cbiAgICB2YXIgeCA9IGFbMF0sIHkgPSBhWzFdLCB6ID0gYVsyXSxcbiAgICAgICAgcXggPSBxWzBdLCBxeSA9IHFbMV0sIHF6ID0gcVsyXSwgcXcgPSBxWzNdLFxuXG4gICAgICAgIC8vIGNhbGN1bGF0ZSBxdWF0ICogdmVjXG4gICAgICAgIGl4ID0gcXcgKiB4ICsgcXkgKiB6IC0gcXogKiB5LFxuICAgICAgICBpeSA9IHF3ICogeSArIHF6ICogeCAtIHF4ICogeixcbiAgICAgICAgaXogPSBxdyAqIHogKyBxeCAqIHkgLSBxeSAqIHgsXG4gICAgICAgIGl3ID0gLXF4ICogeCAtIHF5ICogeSAtIHF6ICogejtcblxuICAgIC8vIGNhbGN1bGF0ZSByZXN1bHQgKiBpbnZlcnNlIHF1YXRcbiAgICBvdXRbMF0gPSBpeCAqIHF3ICsgaXcgKiAtcXggKyBpeSAqIC1xeiAtIGl6ICogLXF5O1xuICAgIG91dFsxXSA9IGl5ICogcXcgKyBpdyAqIC1xeSArIGl6ICogLXF4IC0gaXggKiAtcXo7XG4gICAgb3V0WzJdID0gaXogKiBxdyArIGl3ICogLXF6ICsgaXggKiAtcXkgLSBpeSAqIC1xeDtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBSb3RhdGUgYSAzRCB2ZWN0b3IgYXJvdW5kIHRoZSB4LWF4aXNcbiAqIEBwYXJhbSB7dmVjM30gb3V0IFRoZSByZWNlaXZpbmcgdmVjM1xuICogQHBhcmFtIHt2ZWMzfSBhIFRoZSB2ZWMzIHBvaW50IHRvIHJvdGF0ZVxuICogQHBhcmFtIHt2ZWMzfSBiIFRoZSBvcmlnaW4gb2YgdGhlIHJvdGF0aW9uXG4gKiBAcGFyYW0ge051bWJlcn0gYyBUaGUgYW5nbGUgb2Ygcm90YXRpb25cbiAqIEByZXR1cm5zIHt2ZWMzfSBvdXRcbiAqL1xudmVjMy5yb3RhdGVYID0gZnVuY3Rpb24ob3V0LCBhLCBiLCBjKXtcbiAgIHZhciBwID0gW10sIHI9W107XG5cdCAgLy9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuXHQgIHBbMF0gPSBhWzBdIC0gYlswXTtcblx0ICBwWzFdID0gYVsxXSAtIGJbMV07XG4gIFx0cFsyXSA9IGFbMl0gLSBiWzJdO1xuXG5cdCAgLy9wZXJmb3JtIHJvdGF0aW9uXG5cdCAgclswXSA9IHBbMF07XG5cdCAgclsxXSA9IHBbMV0qTWF0aC5jb3MoYykgLSBwWzJdKk1hdGguc2luKGMpO1xuXHQgIHJbMl0gPSBwWzFdKk1hdGguc2luKGMpICsgcFsyXSpNYXRoLmNvcyhjKTtcblxuXHQgIC8vdHJhbnNsYXRlIHRvIGNvcnJlY3QgcG9zaXRpb25cblx0ICBvdXRbMF0gPSByWzBdICsgYlswXTtcblx0ICBvdXRbMV0gPSByWzFdICsgYlsxXTtcblx0ICBvdXRbMl0gPSByWzJdICsgYlsyXTtcblxuICBcdHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHktYXhpc1xuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge3ZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSBjIFRoZSBhbmdsZSBvZiByb3RhdGlvblxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnJvdGF0ZVkgPSBmdW5jdGlvbihvdXQsIGEsIGIsIGMpe1xuICBcdHZhciBwID0gW10sIHI9W107XG4gIFx0Ly9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuICBcdHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgXHRwWzFdID0gYVsxXSAtIGJbMV07XG4gIFx0cFsyXSA9IGFbMl0gLSBiWzJdO1xuICBcbiAgXHQvL3BlcmZvcm0gcm90YXRpb25cbiAgXHRyWzBdID0gcFsyXSpNYXRoLnNpbihjKSArIHBbMF0qTWF0aC5jb3MoYyk7XG4gIFx0clsxXSA9IHBbMV07XG4gIFx0clsyXSA9IHBbMl0qTWF0aC5jb3MoYykgLSBwWzBdKk1hdGguc2luKGMpO1xuICBcbiAgXHQvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG4gIFx0b3V0WzBdID0gclswXSArIGJbMF07XG4gIFx0b3V0WzFdID0gclsxXSArIGJbMV07XG4gIFx0b3V0WzJdID0gclsyXSArIGJbMl07XG4gIFxuICBcdHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJvdGF0ZSBhIDNEIHZlY3RvciBhcm91bmQgdGhlIHotYXhpc1xuICogQHBhcmFtIHt2ZWMzfSBvdXQgVGhlIHJlY2VpdmluZyB2ZWMzXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIHZlYzMgcG9pbnQgdG8gcm90YXRlXG4gKiBAcGFyYW0ge3ZlYzN9IGIgVGhlIG9yaWdpbiBvZiB0aGUgcm90YXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSBjIFRoZSBhbmdsZSBvZiByb3RhdGlvblxuICogQHJldHVybnMge3ZlYzN9IG91dFxuICovXG52ZWMzLnJvdGF0ZVogPSBmdW5jdGlvbihvdXQsIGEsIGIsIGMpe1xuICBcdHZhciBwID0gW10sIHI9W107XG4gIFx0Ly9UcmFuc2xhdGUgcG9pbnQgdG8gdGhlIG9yaWdpblxuICBcdHBbMF0gPSBhWzBdIC0gYlswXTtcbiAgXHRwWzFdID0gYVsxXSAtIGJbMV07XG4gIFx0cFsyXSA9IGFbMl0gLSBiWzJdO1xuICBcbiAgXHQvL3BlcmZvcm0gcm90YXRpb25cbiAgXHRyWzBdID0gcFswXSpNYXRoLmNvcyhjKSAtIHBbMV0qTWF0aC5zaW4oYyk7XG4gIFx0clsxXSA9IHBbMF0qTWF0aC5zaW4oYykgKyBwWzFdKk1hdGguY29zKGMpO1xuICBcdHJbMl0gPSBwWzJdO1xuICBcbiAgXHQvL3RyYW5zbGF0ZSB0byBjb3JyZWN0IHBvc2l0aW9uXG4gIFx0b3V0WzBdID0gclswXSArIGJbMF07XG4gIFx0b3V0WzFdID0gclsxXSArIGJbMV07XG4gIFx0b3V0WzJdID0gclsyXSArIGJbMl07XG4gIFxuICBcdHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFBlcmZvcm0gc29tZSBvcGVyYXRpb24gb3ZlciBhbiBhcnJheSBvZiB2ZWMzcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhIHRoZSBhcnJheSBvZiB2ZWN0b3JzIHRvIGl0ZXJhdGUgb3ZlclxuICogQHBhcmFtIHtOdW1iZXJ9IHN0cmlkZSBOdW1iZXIgb2YgZWxlbWVudHMgYmV0d2VlbiB0aGUgc3RhcnQgb2YgZWFjaCB2ZWMzLiBJZiAwIGFzc3VtZXMgdGlnaHRseSBwYWNrZWRcbiAqIEBwYXJhbSB7TnVtYmVyfSBvZmZzZXQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7TnVtYmVyfSBjb3VudCBOdW1iZXIgb2YgdmVjM3MgdG8gaXRlcmF0ZSBvdmVyLiBJZiAwIGl0ZXJhdGVzIG92ZXIgZW50aXJlIGFycmF5XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBGdW5jdGlvbiB0byBjYWxsIGZvciBlYWNoIHZlY3RvciBpbiB0aGUgYXJyYXlcbiAqIEBwYXJhbSB7T2JqZWN0fSBbYXJnXSBhZGRpdGlvbmFsIGFyZ3VtZW50IHRvIHBhc3MgdG8gZm5cbiAqIEByZXR1cm5zIHtBcnJheX0gYVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzMuZm9yRWFjaCA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgdmVjID0gdmVjMy5jcmVhdGUoKTtcblxuICAgIHJldHVybiBmdW5jdGlvbihhLCBzdHJpZGUsIG9mZnNldCwgY291bnQsIGZuLCBhcmcpIHtcbiAgICAgICAgdmFyIGksIGw7XG4gICAgICAgIGlmKCFzdHJpZGUpIHtcbiAgICAgICAgICAgIHN0cmlkZSA9IDM7XG4gICAgICAgIH1cblxuICAgICAgICBpZighb2Zmc2V0KSB7XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZihjb3VudCkge1xuICAgICAgICAgICAgbCA9IE1hdGgubWluKChjb3VudCAqIHN0cmlkZSkgKyBvZmZzZXQsIGEubGVuZ3RoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGwgPSBhLmxlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvcihpID0gb2Zmc2V0OyBpIDwgbDsgaSArPSBzdHJpZGUpIHtcbiAgICAgICAgICAgIHZlY1swXSA9IGFbaV07IHZlY1sxXSA9IGFbaSsxXTsgdmVjWzJdID0gYVtpKzJdO1xuICAgICAgICAgICAgZm4odmVjLCB2ZWMsIGFyZyk7XG4gICAgICAgICAgICBhW2ldID0gdmVjWzBdOyBhW2krMV0gPSB2ZWNbMV07IGFbaSsyXSA9IHZlY1syXTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfTtcbn0pKCk7XG5cbi8qKlxuICogR2V0IHRoZSBhbmdsZSBiZXR3ZWVuIHR3byAzRCB2ZWN0b3JzXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjM30gYiBUaGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFRoZSBhbmdsZSBpbiByYWRpYW5zXG4gKi9cbnZlYzMuYW5nbGUgPSBmdW5jdGlvbihhLCBiKSB7XG4gICBcbiAgICB2YXIgdGVtcEEgPSB2ZWMzLmZyb21WYWx1ZXMoYVswXSwgYVsxXSwgYVsyXSk7XG4gICAgdmFyIHRlbXBCID0gdmVjMy5mcm9tVmFsdWVzKGJbMF0sIGJbMV0sIGJbMl0pO1xuIFxuICAgIHZlYzMubm9ybWFsaXplKHRlbXBBLCB0ZW1wQSk7XG4gICAgdmVjMy5ub3JtYWxpemUodGVtcEIsIHRlbXBCKTtcbiBcbiAgICB2YXIgY29zaW5lID0gdmVjMy5kb3QodGVtcEEsIHRlbXBCKTtcblxuICAgIGlmKGNvc2luZSA+IDEuMCl7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBNYXRoLmFjb3MoY29zaW5lKTtcbiAgICB9ICAgICBcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7dmVjM30gdmVjIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXG4gKi9cbnZlYzMuc3RyID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gJ3ZlYzMoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJyknO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgZXhhY3RseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbiAod2hlbiBjb21wYXJlZCB3aXRoID09PSlcbiAqXG4gKiBAcGFyYW0ge3ZlYzN9IGEgVGhlIGZpcnN0IHZlY3Rvci5cbiAqIEBwYXJhbSB7dmVjM30gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG52ZWMzLmV4YWN0RXF1YWxzID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYVswXSA9PT0gYlswXSAmJiBhWzFdID09PSBiWzFdICYmIGFbMl0gPT09IGJbMl07XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBhcHByb3hpbWF0ZWx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uLlxuICpcbiAqIEBwYXJhbSB7dmVjM30gYSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHt2ZWMzfSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbnZlYzMuZXF1YWxzID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICB2YXIgYTAgPSBhWzBdLCBhMSA9IGFbMV0sIGEyID0gYVsyXTtcbiAgICB2YXIgYjAgPSBiWzBdLCBiMSA9IGJbMV0sIGIyID0gYlsyXTtcbiAgICByZXR1cm4gKE1hdGguYWJzKGEwIC0gYjApIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMCksIE1hdGguYWJzKGIwKSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGExIC0gYjEpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMSksIE1hdGguYWJzKGIxKSkgJiZcbiAgICAgICAgICAgIE1hdGguYWJzKGEyIC0gYjIpIDw9IGdsTWF0cml4LkVQU0lMT04qTWF0aC5tYXgoMS4wLCBNYXRoLmFicyhhMiksIE1hdGguYWJzKGIyKSkpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB2ZWMzO1xuIiwiLyogQ29weXJpZ2h0IChjKSAyMDE1LCBCcmFuZG9uIEpvbmVzLCBDb2xpbiBNYWNLZW56aWUgSVYuXG5cblBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcblxuVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuXG5USEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG5JTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cblRIRSBTT0ZUV0FSRS4gKi9cblxudmFyIGdsTWF0cml4ID0gcmVxdWlyZShcIi4vY29tbW9uLmpzXCIpO1xuXG4vKipcbiAqIEBjbGFzcyA0IERpbWVuc2lvbmFsIFZlY3RvclxuICogQG5hbWUgdmVjNFxuICovXG52YXIgdmVjNCA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IHZlYzRcbiAqXG4gKiBAcmV0dXJucyB7dmVjNH0gYSBuZXcgNEQgdmVjdG9yXG4gKi9cbnZlYzQuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IDA7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2ZWM0IGluaXRpYWxpemVkIHdpdGggdmFsdWVzIGZyb20gYW4gZXhpc3RpbmcgdmVjdG9yXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBjbG9uZVxuICogQHJldHVybnMge3ZlYzR9IGEgbmV3IDREIHZlY3RvclxuICovXG52ZWM0LmNsb25lID0gZnVuY3Rpb24oYSkge1xuICAgIHZhciBvdXQgPSBuZXcgZ2xNYXRyaXguQVJSQVlfVFlQRSg0KTtcbiAgICBvdXRbMF0gPSBhWzBdO1xuICAgIG91dFsxXSA9IGFbMV07XG4gICAgb3V0WzJdID0gYVsyXTtcbiAgICBvdXRbM10gPSBhWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgdmVjNCBpbml0aWFsaXplZCB3aXRoIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge051bWJlcn0geCBYIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHkgWSBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB6IFogY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0gdyBXIGNvbXBvbmVudFxuICogQHJldHVybnMge3ZlYzR9IGEgbmV3IDREIHZlY3RvclxuICovXG52ZWM0LmZyb21WYWx1ZXMgPSBmdW5jdGlvbih4LCB5LCB6LCB3KSB7XG4gICAgdmFyIG91dCA9IG5ldyBnbE1hdHJpeC5BUlJBWV9UWVBFKDQpO1xuICAgIG91dFswXSA9IHg7XG4gICAgb3V0WzFdID0geTtcbiAgICBvdXRbMl0gPSB6O1xuICAgIG91dFszXSA9IHc7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQ29weSB0aGUgdmFsdWVzIGZyb20gb25lIHZlYzQgdG8gYW5vdGhlclxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIHNvdXJjZSB2ZWN0b3JcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5jb3B5ID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gYVswXTtcbiAgICBvdXRbMV0gPSBhWzFdO1xuICAgIG91dFsyXSA9IGFbMl07XG4gICAgb3V0WzNdID0gYVszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0IHRvIHRoZSBnaXZlbiB2YWx1ZXNcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHtOdW1iZXJ9IHggWCBjb21wb25lbnRcbiAqIEBwYXJhbSB7TnVtYmVyfSB5IFkgY29tcG9uZW50XG4gKiBAcGFyYW0ge051bWJlcn0geiBaIGNvbXBvbmVudFxuICogQHBhcmFtIHtOdW1iZXJ9IHcgVyBjb21wb25lbnRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5zZXQgPSBmdW5jdGlvbihvdXQsIHgsIHksIHosIHcpIHtcbiAgICBvdXRbMF0gPSB4O1xuICAgIG91dFsxXSA9IHk7XG4gICAgb3V0WzJdID0gejtcbiAgICBvdXRbM10gPSB3O1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFkZHMgdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5hZGQgPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBhWzBdICsgYlswXTtcbiAgICBvdXRbMV0gPSBhWzFdICsgYlsxXTtcbiAgICBvdXRbMl0gPSBhWzJdICsgYlsyXTtcbiAgICBvdXRbM10gPSBhWzNdICsgYlszXTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTdWJ0cmFjdHMgdmVjdG9yIGIgZnJvbSB2ZWN0b3IgYVxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5zdWJ0cmFjdCA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gLSBiWzBdO1xuICAgIG91dFsxXSA9IGFbMV0gLSBiWzFdO1xuICAgIG91dFsyXSA9IGFbMl0gLSBiWzJdO1xuICAgIG91dFszXSA9IGFbM10gLSBiWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5zdWJ0cmFjdH1cbiAqIEBmdW5jdGlvblxuICovXG52ZWM0LnN1YiA9IHZlYzQuc3VidHJhY3Q7XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0Lm11bHRpcGx5ID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAqIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAqIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSAqIGJbMl07XG4gICAgb3V0WzNdID0gYVszXSAqIGJbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0Lm11bHRpcGx5fVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzQubXVsID0gdmVjNC5tdWx0aXBseTtcblxuLyoqXG4gKiBEaXZpZGVzIHR3byB2ZWM0J3NcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQuZGl2aWRlID0gZnVuY3Rpb24ob3V0LCBhLCBiKSB7XG4gICAgb3V0WzBdID0gYVswXSAvIGJbMF07XG4gICAgb3V0WzFdID0gYVsxXSAvIGJbMV07XG4gICAgb3V0WzJdID0gYVsyXSAvIGJbMl07XG4gICAgb3V0WzNdID0gYVszXSAvIGJbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LmRpdmlkZX1cbiAqIEBmdW5jdGlvblxuICovXG52ZWM0LmRpdiA9IHZlYzQuZGl2aWRlO1xuXG4vKipcbiAqIE1hdGguY2VpbCB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBjZWlsXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQuY2VpbCA9IGZ1bmN0aW9uIChvdXQsIGEpIHtcbiAgICBvdXRbMF0gPSBNYXRoLmNlaWwoYVswXSk7XG4gICAgb3V0WzFdID0gTWF0aC5jZWlsKGFbMV0pO1xuICAgIG91dFsyXSA9IE1hdGguY2VpbChhWzJdKTtcbiAgICBvdXRbM10gPSBNYXRoLmNlaWwoYVszXSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogTWF0aC5mbG9vciB0aGUgY29tcG9uZW50cyBvZiBhIHZlYzRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IG91dCB0aGUgcmVjZWl2aW5nIHZlY3RvclxuICogQHBhcmFtIHt2ZWM0fSBhIHZlY3RvciB0byBmbG9vclxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0LmZsb29yID0gZnVuY3Rpb24gKG91dCwgYSkge1xuICAgIG91dFswXSA9IE1hdGguZmxvb3IoYVswXSk7XG4gICAgb3V0WzFdID0gTWF0aC5mbG9vcihhWzFdKTtcbiAgICBvdXRbMl0gPSBNYXRoLmZsb29yKGFbMl0pO1xuICAgIG91dFszXSA9IE1hdGguZmxvb3IoYVszXSk7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbWluaW11bSBvZiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0Lm1pbiA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IE1hdGgubWluKGFbMF0sIGJbMF0pO1xuICAgIG91dFsxXSA9IE1hdGgubWluKGFbMV0sIGJbMV0pO1xuICAgIG91dFsyXSA9IE1hdGgubWluKGFbMl0sIGJbMl0pO1xuICAgIG91dFszXSA9IE1hdGgubWluKGFbM10sIGJbM10pO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1heGltdW0gb2YgdHdvIHZlYzQnc1xuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5tYXggPSBmdW5jdGlvbihvdXQsIGEsIGIpIHtcbiAgICBvdXRbMF0gPSBNYXRoLm1heChhWzBdLCBiWzBdKTtcbiAgICBvdXRbMV0gPSBNYXRoLm1heChhWzFdLCBiWzFdKTtcbiAgICBvdXRbMl0gPSBNYXRoLm1heChhWzJdLCBiWzJdKTtcbiAgICBvdXRbM10gPSBNYXRoLm1heChhWzNdLCBiWzNdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBNYXRoLnJvdW5kIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIHJvdW5kXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQucm91bmQgPSBmdW5jdGlvbiAob3V0LCBhKSB7XG4gICAgb3V0WzBdID0gTWF0aC5yb3VuZChhWzBdKTtcbiAgICBvdXRbMV0gPSBNYXRoLnJvdW5kKGFbMV0pO1xuICAgIG91dFsyXSA9IE1hdGgucm91bmQoYVsyXSk7XG4gICAgb3V0WzNdID0gTWF0aC5yb3VuZChhWzNdKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBTY2FsZXMgYSB2ZWM0IGJ5IGEgc2NhbGFyIG51bWJlclxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIHZlY3RvciB0byBzY2FsZVxuICogQHBhcmFtIHtOdW1iZXJ9IGIgYW1vdW50IHRvIHNjYWxlIHRoZSB2ZWN0b3IgYnlcbiAqIEByZXR1cm5zIHt2ZWM0fSBvdXRcbiAqL1xudmVjNC5zY2FsZSA9IGZ1bmN0aW9uKG91dCwgYSwgYikge1xuICAgIG91dFswXSA9IGFbMF0gKiBiO1xuICAgIG91dFsxXSA9IGFbMV0gKiBiO1xuICAgIG91dFsyXSA9IGFbMl0gKiBiO1xuICAgIG91dFszXSA9IGFbM10gKiBiO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIEFkZHMgdHdvIHZlYzQncyBhZnRlciBzY2FsaW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBieSBhIHNjYWxhciB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7dmVjNH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEBwYXJhbSB7TnVtYmVyfSBzY2FsZSB0aGUgYW1vdW50IHRvIHNjYWxlIGIgYnkgYmVmb3JlIGFkZGluZ1xuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0LnNjYWxlQW5kQWRkID0gZnVuY3Rpb24ob3V0LCBhLCBiLCBzY2FsZSkge1xuICAgIG91dFswXSA9IGFbMF0gKyAoYlswXSAqIHNjYWxlKTtcbiAgICBvdXRbMV0gPSBhWzFdICsgKGJbMV0gKiBzY2FsZSk7XG4gICAgb3V0WzJdID0gYVsyXSArIChiWzJdICogc2NhbGUpO1xuICAgIG91dFszXSA9IGFbM10gKyAoYlszXSAqIHNjYWxlKTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkaXN0YW5jZSBiZXR3ZWVuIGEgYW5kIGJcbiAqL1xudmVjNC5kaXN0YW5jZSA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgICB5ID0gYlsxXSAtIGFbMV0sXG4gICAgICAgIHogPSBiWzJdIC0gYVsyXSxcbiAgICAgICAgdyA9IGJbM10gLSBhWzNdO1xuICAgIHJldHVybiBNYXRoLnNxcnQoeCp4ICsgeSp5ICsgeip6ICsgdyp3KTtcbn07XG5cbi8qKlxuICogQWxpYXMgZm9yIHtAbGluayB2ZWM0LmRpc3RhbmNlfVxuICogQGZ1bmN0aW9uXG4gKi9cbnZlYzQuZGlzdCA9IHZlYzQuZGlzdGFuY2U7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgc3F1YXJlZCBldWNsaWRpYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gYSBhbmQgYlxuICovXG52ZWM0LnNxdWFyZWREaXN0YW5jZSA9IGZ1bmN0aW9uKGEsIGIpIHtcbiAgICB2YXIgeCA9IGJbMF0gLSBhWzBdLFxuICAgICAgICB5ID0gYlsxXSAtIGFbMV0sXG4gICAgICAgIHogPSBiWzJdIC0gYVsyXSxcbiAgICAgICAgdyA9IGJbM10gLSBhWzNdO1xuICAgIHJldHVybiB4KnggKyB5KnkgKyB6KnogKyB3Knc7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5zcXVhcmVkRGlzdGFuY2V9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjNC5zcXJEaXN0ID0gdmVjNC5zcXVhcmVkRGlzdGFuY2U7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgbGVuZ3RoIG9mIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gYSB2ZWN0b3IgdG8gY2FsY3VsYXRlIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gbGVuZ3RoIG9mIGFcbiAqL1xudmVjNC5sZW5ndGggPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV0sXG4gICAgICAgIHogPSBhWzJdLFxuICAgICAgICB3ID0gYVszXTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KHgqeCArIHkqeSArIHoqeiArIHcqdyk7XG59O1xuXG4vKipcbiAqIEFsaWFzIGZvciB7QGxpbmsgdmVjNC5sZW5ndGh9XG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjNC5sZW4gPSB2ZWM0Lmxlbmd0aDtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBzcXVhcmVkIGxlbmd0aCBvZiBhIHZlYzRcbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIGNhbGN1bGF0ZSBzcXVhcmVkIGxlbmd0aCBvZlxuICogQHJldHVybnMge051bWJlcn0gc3F1YXJlZCBsZW5ndGggb2YgYVxuICovXG52ZWM0LnNxdWFyZWRMZW5ndGggPSBmdW5jdGlvbiAoYSkge1xuICAgIHZhciB4ID0gYVswXSxcbiAgICAgICAgeSA9IGFbMV0sXG4gICAgICAgIHogPSBhWzJdLFxuICAgICAgICB3ID0gYVszXTtcbiAgICByZXR1cm4geCp4ICsgeSp5ICsgeip6ICsgdyp3O1xufTtcblxuLyoqXG4gKiBBbGlhcyBmb3Ige0BsaW5rIHZlYzQuc3F1YXJlZExlbmd0aH1cbiAqIEBmdW5jdGlvblxuICovXG52ZWM0LnNxckxlbiA9IHZlYzQuc3F1YXJlZExlbmd0aDtcblxuLyoqXG4gKiBOZWdhdGVzIHRoZSBjb21wb25lbnRzIG9mIGEgdmVjNFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdmVjdG9yIHRvIG5lZ2F0ZVxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0Lm5lZ2F0ZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICAgIG91dFswXSA9IC1hWzBdO1xuICAgIG91dFsxXSA9IC1hWzFdO1xuICAgIG91dFsyXSA9IC1hWzJdO1xuICAgIG91dFszXSA9IC1hWzNdO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGludmVyc2Ugb2YgdGhlIGNvbXBvbmVudHMgb2YgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB2ZWN0b3IgdG8gaW52ZXJ0XG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQuaW52ZXJzZSA9IGZ1bmN0aW9uKG91dCwgYSkge1xuICBvdXRbMF0gPSAxLjAgLyBhWzBdO1xuICBvdXRbMV0gPSAxLjAgLyBhWzFdO1xuICBvdXRbMl0gPSAxLjAgLyBhWzJdO1xuICBvdXRbM10gPSAxLjAgLyBhWzNdO1xuICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBOb3JtYWxpemUgYSB2ZWM0XG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB2ZWN0b3IgdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQubm9ybWFsaXplID0gZnVuY3Rpb24ob3V0LCBhKSB7XG4gICAgdmFyIHggPSBhWzBdLFxuICAgICAgICB5ID0gYVsxXSxcbiAgICAgICAgeiA9IGFbMl0sXG4gICAgICAgIHcgPSBhWzNdO1xuICAgIHZhciBsZW4gPSB4KnggKyB5KnkgKyB6KnogKyB3Knc7XG4gICAgaWYgKGxlbiA+IDApIHtcbiAgICAgICAgbGVuID0gMSAvIE1hdGguc3FydChsZW4pO1xuICAgICAgICBvdXRbMF0gPSB4ICogbGVuO1xuICAgICAgICBvdXRbMV0gPSB5ICogbGVuO1xuICAgICAgICBvdXRbMl0gPSB6ICogbGVuO1xuICAgICAgICBvdXRbM10gPSB3ICogbGVuO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBhIHRoZSBmaXJzdCBvcGVyYW5kXG4gKiBAcGFyYW0ge3ZlYzR9IGIgdGhlIHNlY29uZCBvcGVyYW5kXG4gKiBAcmV0dXJucyB7TnVtYmVyfSBkb3QgcHJvZHVjdCBvZiBhIGFuZCBiXG4gKi9cbnZlYzQuZG90ID0gZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdICsgYVszXSAqIGJbM107XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIGEgbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gdmVjNCdzXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgZmlyc3Qgb3BlcmFuZFxuICogQHBhcmFtIHt2ZWM0fSBiIHRoZSBzZWNvbmQgb3BlcmFuZFxuICogQHBhcmFtIHtOdW1iZXJ9IHQgaW50ZXJwb2xhdGlvbiBhbW91bnQgYmV0d2VlbiB0aGUgdHdvIGlucHV0c1xuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0LmxlcnAgPSBmdW5jdGlvbiAob3V0LCBhLCBiLCB0KSB7XG4gICAgdmFyIGF4ID0gYVswXSxcbiAgICAgICAgYXkgPSBhWzFdLFxuICAgICAgICBheiA9IGFbMl0sXG4gICAgICAgIGF3ID0gYVszXTtcbiAgICBvdXRbMF0gPSBheCArIHQgKiAoYlswXSAtIGF4KTtcbiAgICBvdXRbMV0gPSBheSArIHQgKiAoYlsxXSAtIGF5KTtcbiAgICBvdXRbMl0gPSBheiArIHQgKiAoYlsyXSAtIGF6KTtcbiAgICBvdXRbM10gPSBhdyArIHQgKiAoYlszXSAtIGF3KTtcbiAgICByZXR1cm4gb3V0O1xufTtcblxuLyoqXG4gKiBHZW5lcmF0ZXMgYSByYW5kb20gdmVjdG9yIHdpdGggdGhlIGdpdmVuIHNjYWxlXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7TnVtYmVyfSBbc2NhbGVdIExlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHZlY3Rvci4gSWYgb21taXR0ZWQsIGEgdW5pdCB2ZWN0b3Igd2lsbCBiZSByZXR1cm5lZFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0LnJhbmRvbSA9IGZ1bmN0aW9uIChvdXQsIHNjYWxlKSB7XG4gICAgc2NhbGUgPSBzY2FsZSB8fCAxLjA7XG5cbiAgICAvL1RPRE86IFRoaXMgaXMgYSBwcmV0dHkgYXdmdWwgd2F5IG9mIGRvaW5nIHRoaXMuIEZpbmQgc29tZXRoaW5nIGJldHRlci5cbiAgICBvdXRbMF0gPSBnbE1hdHJpeC5SQU5ET00oKTtcbiAgICBvdXRbMV0gPSBnbE1hdHJpeC5SQU5ET00oKTtcbiAgICBvdXRbMl0gPSBnbE1hdHJpeC5SQU5ET00oKTtcbiAgICBvdXRbM10gPSBnbE1hdHJpeC5SQU5ET00oKTtcbiAgICB2ZWM0Lm5vcm1hbGl6ZShvdXQsIG91dCk7XG4gICAgdmVjNC5zY2FsZShvdXQsIG91dCwgc2NhbGUpO1xuICAgIHJldHVybiBvdXQ7XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgdGhlIHZlYzQgd2l0aCBhIG1hdDQuXG4gKlxuICogQHBhcmFtIHt2ZWM0fSBvdXQgdGhlIHJlY2VpdmluZyB2ZWN0b3JcbiAqIEBwYXJhbSB7dmVjNH0gYSB0aGUgdmVjdG9yIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHttYXQ0fSBtIG1hdHJpeCB0byB0cmFuc2Zvcm0gd2l0aFxuICogQHJldHVybnMge3ZlYzR9IG91dFxuICovXG52ZWM0LnRyYW5zZm9ybU1hdDQgPSBmdW5jdGlvbihvdXQsIGEsIG0pIHtcbiAgICB2YXIgeCA9IGFbMF0sIHkgPSBhWzFdLCB6ID0gYVsyXSwgdyA9IGFbM107XG4gICAgb3V0WzBdID0gbVswXSAqIHggKyBtWzRdICogeSArIG1bOF0gKiB6ICsgbVsxMl0gKiB3O1xuICAgIG91dFsxXSA9IG1bMV0gKiB4ICsgbVs1XSAqIHkgKyBtWzldICogeiArIG1bMTNdICogdztcbiAgICBvdXRbMl0gPSBtWzJdICogeCArIG1bNl0gKiB5ICsgbVsxMF0gKiB6ICsgbVsxNF0gKiB3O1xuICAgIG91dFszXSA9IG1bM10gKiB4ICsgbVs3XSAqIHkgKyBtWzExXSAqIHogKyBtWzE1XSAqIHc7XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogVHJhbnNmb3JtcyB0aGUgdmVjNCB3aXRoIGEgcXVhdFxuICpcbiAqIEBwYXJhbSB7dmVjNH0gb3V0IHRoZSByZWNlaXZpbmcgdmVjdG9yXG4gKiBAcGFyYW0ge3ZlYzR9IGEgdGhlIHZlY3RvciB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7cXVhdH0gcSBxdWF0ZXJuaW9uIHRvIHRyYW5zZm9ybSB3aXRoXG4gKiBAcmV0dXJucyB7dmVjNH0gb3V0XG4gKi9cbnZlYzQudHJhbnNmb3JtUXVhdCA9IGZ1bmN0aW9uKG91dCwgYSwgcSkge1xuICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sIHogPSBhWzJdLFxuICAgICAgICBxeCA9IHFbMF0sIHF5ID0gcVsxXSwgcXogPSBxWzJdLCBxdyA9IHFbM10sXG5cbiAgICAgICAgLy8gY2FsY3VsYXRlIHF1YXQgKiB2ZWNcbiAgICAgICAgaXggPSBxdyAqIHggKyBxeSAqIHogLSBxeiAqIHksXG4gICAgICAgIGl5ID0gcXcgKiB5ICsgcXogKiB4IC0gcXggKiB6LFxuICAgICAgICBpeiA9IHF3ICogeiArIHF4ICogeSAtIHF5ICogeCxcbiAgICAgICAgaXcgPSAtcXggKiB4IC0gcXkgKiB5IC0gcXogKiB6O1xuXG4gICAgLy8gY2FsY3VsYXRlIHJlc3VsdCAqIGludmVyc2UgcXVhdFxuICAgIG91dFswXSA9IGl4ICogcXcgKyBpdyAqIC1xeCArIGl5ICogLXF6IC0gaXogKiAtcXk7XG4gICAgb3V0WzFdID0gaXkgKiBxdyArIGl3ICogLXF5ICsgaXogKiAtcXggLSBpeCAqIC1xejtcbiAgICBvdXRbMl0gPSBpeiAqIHF3ICsgaXcgKiAtcXogKyBpeCAqIC1xeSAtIGl5ICogLXF4O1xuICAgIG91dFszXSA9IGFbM107XG4gICAgcmV0dXJuIG91dDtcbn07XG5cbi8qKlxuICogUGVyZm9ybSBzb21lIG9wZXJhdGlvbiBvdmVyIGFuIGFycmF5IG9mIHZlYzRzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGEgdGhlIGFycmF5IG9mIHZlY3RvcnMgdG8gaXRlcmF0ZSBvdmVyXG4gKiBAcGFyYW0ge051bWJlcn0gc3RyaWRlIE51bWJlciBvZiBlbGVtZW50cyBiZXR3ZWVuIHRoZSBzdGFydCBvZiBlYWNoIHZlYzQuIElmIDAgYXNzdW1lcyB0aWdodGx5IHBhY2tlZFxuICogQHBhcmFtIHtOdW1iZXJ9IG9mZnNldCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gc2tpcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheVxuICogQHBhcmFtIHtOdW1iZXJ9IGNvdW50IE51bWJlciBvZiB2ZWM0cyB0byBpdGVyYXRlIG92ZXIuIElmIDAgaXRlcmF0ZXMgb3ZlciBlbnRpcmUgYXJyYXlcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIEZ1bmN0aW9uIHRvIGNhbGwgZm9yIGVhY2ggdmVjdG9yIGluIHRoZSBhcnJheVxuICogQHBhcmFtIHtPYmplY3R9IFthcmddIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gcGFzcyB0byBmblxuICogQHJldHVybnMge0FycmF5fSBhXG4gKiBAZnVuY3Rpb25cbiAqL1xudmVjNC5mb3JFYWNoID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciB2ZWMgPSB2ZWM0LmNyZWF0ZSgpO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGEsIHN0cmlkZSwgb2Zmc2V0LCBjb3VudCwgZm4sIGFyZykge1xuICAgICAgICB2YXIgaSwgbDtcbiAgICAgICAgaWYoIXN0cmlkZSkge1xuICAgICAgICAgICAgc3RyaWRlID0gNDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKCFvZmZzZXQpIHtcbiAgICAgICAgICAgIG9mZnNldCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmKGNvdW50KSB7XG4gICAgICAgICAgICBsID0gTWF0aC5taW4oKGNvdW50ICogc3RyaWRlKSArIG9mZnNldCwgYS5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbCA9IGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yKGkgPSBvZmZzZXQ7IGkgPCBsOyBpICs9IHN0cmlkZSkge1xuICAgICAgICAgICAgdmVjWzBdID0gYVtpXTsgdmVjWzFdID0gYVtpKzFdOyB2ZWNbMl0gPSBhW2krMl07IHZlY1szXSA9IGFbaSszXTtcbiAgICAgICAgICAgIGZuKHZlYywgdmVjLCBhcmcpO1xuICAgICAgICAgICAgYVtpXSA9IHZlY1swXTsgYVtpKzFdID0gdmVjWzFdOyBhW2krMl0gPSB2ZWNbMl07IGFbaSszXSA9IHZlY1szXTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGE7XG4gICAgfTtcbn0pKCk7XG5cbi8qKlxuICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7dmVjNH0gdmVjIHZlY3RvciB0byByZXByZXNlbnQgYXMgYSBzdHJpbmdcbiAqIEByZXR1cm5zIHtTdHJpbmd9IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmVjdG9yXG4gKi9cbnZlYzQuc3RyID0gZnVuY3Rpb24gKGEpIHtcbiAgICByZXR1cm4gJ3ZlYzQoJyArIGFbMF0gKyAnLCAnICsgYVsxXSArICcsICcgKyBhWzJdICsgJywgJyArIGFbM10gKyAnKSc7XG59O1xuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHZlY3RvcnMgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIGVsZW1lbnRzIGluIHRoZSBzYW1lIHBvc2l0aW9uICh3aGVuIGNvbXBhcmVkIHdpdGggPT09KVxuICpcbiAqIEBwYXJhbSB7dmVjNH0gYSBUaGUgZmlyc3QgdmVjdG9yLlxuICogQHBhcmFtIHt2ZWM0fSBiIFRoZSBzZWNvbmQgdmVjdG9yLlxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgdGhlIHZlY3RvcnMgYXJlIGVxdWFsLCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbnZlYzQuZXhhY3RFcXVhbHMgPSBmdW5jdGlvbiAoYSwgYikge1xuICAgIHJldHVybiBhWzBdID09PSBiWzBdICYmIGFbMV0gPT09IGJbMV0gJiYgYVsyXSA9PT0gYlsyXSAmJiBhWzNdID09PSBiWzNdO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB2ZWN0b3JzIGhhdmUgYXBwcm94aW1hdGVseSB0aGUgc2FtZSBlbGVtZW50cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi5cbiAqXG4gKiBAcGFyYW0ge3ZlYzR9IGEgVGhlIGZpcnN0IHZlY3Rvci5cbiAqIEBwYXJhbSB7dmVjNH0gYiBUaGUgc2Vjb25kIHZlY3Rvci5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIHRoZSB2ZWN0b3JzIGFyZSBlcXVhbCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG52ZWM0LmVxdWFscyA9IGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIGEwID0gYVswXSwgYTEgPSBhWzFdLCBhMiA9IGFbMl0sIGEzID0gYVszXTtcbiAgICB2YXIgYjAgPSBiWzBdLCBiMSA9IGJbMV0sIGIyID0gYlsyXSwgYjMgPSBiWzNdO1xuICAgIHJldHVybiAoTWF0aC5hYnMoYTAgLSBiMCkgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEwKSwgTWF0aC5hYnMoYjApKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTEgLSBiMSkgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGExKSwgTWF0aC5hYnMoYjEpKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTIgLSBiMikgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEyKSwgTWF0aC5hYnMoYjIpKSAmJlxuICAgICAgICAgICAgTWF0aC5hYnMoYTMgLSBiMykgPD0gZ2xNYXRyaXguRVBTSUxPTipNYXRoLm1heCgxLjAsIE1hdGguYWJzKGEzKSwgTWF0aC5hYnMoYjMpKSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHZlYzQ7XG4iLCIvKipcbiAqIEFVVEhPUiBPRiBJTklUSUFMIEpTIExJQlJBUllcbiAqIGstZCBUcmVlIEphdmFTY3JpcHQgLSBWIDEuMFxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS91YmlsYWJzL2tkLXRyZWUtamF2YXNjcmlwdFxuICpcbiAqIEBhdXRob3IgTWlyY2VhIFByaWNvcCA8cHJpY29wQHViaWxhYnMubmV0PiwgMjAxMlxuICogQGF1dGhvciBNYXJ0aW4gS2xlcHBlIDxrbGVwcGVAdWJpbGFicy5uZXQ+LCAyMDEyXG4gKiBAYXV0aG9yIFViaWxhYnMgaHR0cDovL3ViaWxhYnMubmV0LCAyMDEyXG4gKiBAbGljZW5zZSBNSVQgTGljZW5zZSA8aHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHA+XG4gKi9cblxuXG5mdW5jdGlvbiBOb2RlKG9iaiwgZGltZW5zaW9uLCBwYXJlbnQpIHtcbiAgdGhpcy5vYmogPSBvYmo7XG4gIHRoaXMubGVmdCA9IG51bGw7XG4gIHRoaXMucmlnaHQgPSBudWxsO1xuICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgdGhpcy5kaW1lbnNpb24gPSBkaW1lbnNpb247XG59XG5cbmZ1bmN0aW9uIEtkVHJlZShwb2ludHMsIG1ldHJpYywgZGltZW5zaW9ucykge1xuXG4gIHZhciBzZWxmID0gdGhpcztcbiAgXG4gIGZ1bmN0aW9uIGJ1aWxkVHJlZShwb2ludHMsIGRlcHRoLCBwYXJlbnQpIHtcbiAgICB2YXIgZGltID0gZGVwdGggJSBkaW1lbnNpb25zLmxlbmd0aCxcbiAgICAgIG1lZGlhbixcbiAgICAgIG5vZGU7XG5cbiAgICBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChwb2ludHMubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gbmV3IE5vZGUocG9pbnRzWzBdLCBkaW0sIHBhcmVudCk7XG4gICAgfVxuXG4gICAgcG9pbnRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIHJldHVybiBhW2RpbWVuc2lvbnNbZGltXV0gLSBiW2RpbWVuc2lvbnNbZGltXV07XG4gICAgfSk7XG5cbiAgICBtZWRpYW4gPSBNYXRoLmZsb29yKHBvaW50cy5sZW5ndGggLyAyKTtcbiAgICBub2RlID0gbmV3IE5vZGUocG9pbnRzW21lZGlhbl0sIGRpbSwgcGFyZW50KTtcbiAgICBub2RlLmxlZnQgPSBidWlsZFRyZWUocG9pbnRzLnNsaWNlKDAsIG1lZGlhbiksIGRlcHRoICsgMSwgbm9kZSk7XG4gICAgbm9kZS5yaWdodCA9IGJ1aWxkVHJlZShwb2ludHMuc2xpY2UobWVkaWFuICsgMSksIGRlcHRoICsgMSwgbm9kZSk7XG5cbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHRoaXMucm9vdCA9IGJ1aWxkVHJlZShwb2ludHMsIDAsIG51bGwpO1xuXG4gIHRoaXMuaW5zZXJ0ID0gZnVuY3Rpb24gKHBvaW50KSB7XG4gICAgZnVuY3Rpb24gaW5uZXJTZWFyY2gobm9kZSwgcGFyZW50KSB7XG5cbiAgICAgIGlmIChub2RlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgICB9XG5cbiAgICAgIHZhciBkaW1lbnNpb24gPSBkaW1lbnNpb25zW25vZGUuZGltZW5zaW9uXTtcbiAgICAgIGlmIChwb2ludFtkaW1lbnNpb25dIDwgbm9kZS5vYmpbZGltZW5zaW9uXSkge1xuICAgICAgICByZXR1cm4gaW5uZXJTZWFyY2gobm9kZS5sZWZ0LCBub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBpbm5lclNlYXJjaChub2RlLnJpZ2h0LCBub2RlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgaW5zZXJ0UG9zaXRpb24gPSBpbm5lclNlYXJjaCh0aGlzLnJvb3QsIG51bGwpLFxuICAgICAgbmV3Tm9kZSxcbiAgICAgIGRpbWVuc2lvbjtcblxuICAgIGlmIChpbnNlcnRQb3NpdGlvbiA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5yb290ID0gbmV3IE5vZGUocG9pbnQsIDAsIG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5ld05vZGUgPSBuZXcgTm9kZShwb2ludCwgKGluc2VydFBvc2l0aW9uLmRpbWVuc2lvbiArIDEpICUgZGltZW5zaW9ucy5sZW5ndGgsIGluc2VydFBvc2l0aW9uKTtcbiAgICBkaW1lbnNpb24gPSBkaW1lbnNpb25zW2luc2VydFBvc2l0aW9uLmRpbWVuc2lvbl07XG5cbiAgICBpZiAocG9pbnRbZGltZW5zaW9uXSA8IGluc2VydFBvc2l0aW9uLm9ialtkaW1lbnNpb25dKSB7XG4gICAgICBpbnNlcnRQb3NpdGlvbi5sZWZ0ID0gbmV3Tm9kZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5zZXJ0UG9zaXRpb24ucmlnaHQgPSBuZXdOb2RlO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLnJlbW92ZSA9IGZ1bmN0aW9uIChwb2ludCkge1xuICAgIHZhciBub2RlO1xuXG4gICAgZnVuY3Rpb24gbm9kZVNlYXJjaChub2RlKSB7XG4gICAgICBpZiAobm9kZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUub2JqID09PSBwb2ludCkge1xuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgIH1cblxuICAgICAgdmFyIGRpbWVuc2lvbiA9IGRpbWVuc2lvbnNbbm9kZS5kaW1lbnNpb25dO1xuXG4gICAgICBpZiAocG9pbnRbZGltZW5zaW9uXSA8IG5vZGUub2JqW2RpbWVuc2lvbl0pIHtcbiAgICAgICAgcmV0dXJuIG5vZGVTZWFyY2gobm9kZS5sZWZ0LCBub2RlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBub2RlU2VhcmNoKG5vZGUucmlnaHQsIG5vZGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbW92ZU5vZGUobm9kZSkge1xuICAgICAgdmFyIG5leHROb2RlLFxuICAgICAgICBuZXh0T2JqLFxuICAgICAgICBwRGltZW5zaW9uO1xuXG4gICAgICBmdW5jdGlvbiBmaW5kTWF4KG5vZGUsIGRpbSkge1xuICAgICAgICB2YXIgZGltZW5zaW9uLFxuICAgICAgICAgIG93bixcbiAgICAgICAgICBsZWZ0LFxuICAgICAgICAgIHJpZ2h0LFxuICAgICAgICAgIG1heDtcblxuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZGltZW5zaW9uID0gZGltZW5zaW9uc1tkaW1dO1xuICAgICAgICBpZiAobm9kZS5kaW1lbnNpb24gPT09IGRpbSkge1xuICAgICAgICAgIGlmIChub2RlLnJpZ2h0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZmluZE1heChub2RlLnJpZ2h0LCBkaW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG93biA9IG5vZGUub2JqW2RpbWVuc2lvbl07XG4gICAgICAgIGxlZnQgPSBmaW5kTWF4KG5vZGUubGVmdCwgZGltKTtcbiAgICAgICAgcmlnaHQgPSBmaW5kTWF4KG5vZGUucmlnaHQsIGRpbSk7XG4gICAgICAgIG1heCA9IG5vZGU7XG5cbiAgICAgICAgaWYgKGxlZnQgIT09IG51bGwgJiYgbGVmdC5vYmpbZGltZW5zaW9uXSA+IG93bikge1xuICAgICAgICAgIG1heCA9IGxlZnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmlnaHQgIT09IG51bGwgJiYgcmlnaHQub2JqW2RpbWVuc2lvbl0gPiBtYXgub2JqW2RpbWVuc2lvbl0pIHtcbiAgICAgICAgICBtYXggPSByaWdodDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWF4O1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBmaW5kTWluKG5vZGUsIGRpbSkge1xuICAgICAgICB2YXIgZGltZW5zaW9uLFxuICAgICAgICAgIG93bixcbiAgICAgICAgICBsZWZ0LFxuICAgICAgICAgIHJpZ2h0LFxuICAgICAgICAgIG1pbjtcblxuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZGltZW5zaW9uID0gZGltZW5zaW9uc1tkaW1dO1xuXG4gICAgICAgIGlmIChub2RlLmRpbWVuc2lvbiA9PT0gZGltKSB7XG4gICAgICAgICAgaWYgKG5vZGUubGVmdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbmRNaW4obm9kZS5sZWZ0LCBkaW0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuXG4gICAgICAgIG93biA9IG5vZGUub2JqW2RpbWVuc2lvbl07XG4gICAgICAgIGxlZnQgPSBmaW5kTWluKG5vZGUubGVmdCwgZGltKTtcbiAgICAgICAgcmlnaHQgPSBmaW5kTWluKG5vZGUucmlnaHQsIGRpbSk7XG4gICAgICAgIG1pbiA9IG5vZGU7XG5cbiAgICAgICAgaWYgKGxlZnQgIT09IG51bGwgJiYgbGVmdC5vYmpbZGltZW5zaW9uXSA8IG93bikge1xuICAgICAgICAgIG1pbiA9IGxlZnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJpZ2h0ICE9PSBudWxsICYmIHJpZ2h0Lm9ialtkaW1lbnNpb25dIDwgbWluLm9ialtkaW1lbnNpb25dKSB7XG4gICAgICAgICAgbWluID0gcmlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1pbjtcbiAgICAgIH1cblxuICAgICAgaWYgKG5vZGUubGVmdCA9PT0gbnVsbCAmJiBub2RlLnJpZ2h0ID09PSBudWxsKSB7XG4gICAgICAgIGlmIChub2RlLnBhcmVudCA9PT0gbnVsbCkge1xuICAgICAgICAgIHNlbGYucm9vdCA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcERpbWVuc2lvbiA9IGRpbWVuc2lvbnNbbm9kZS5wYXJlbnQuZGltZW5zaW9uXTtcblxuICAgICAgICBpZiAobm9kZS5vYmpbcERpbWVuc2lvbl0gPCBub2RlLnBhcmVudC5vYmpbcERpbWVuc2lvbl0pIHtcbiAgICAgICAgICBub2RlLnBhcmVudC5sZWZ0ID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBub2RlLnBhcmVudC5yaWdodCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAobm9kZS5sZWZ0ICE9PSBudWxsKSB7XG4gICAgICAgIG5leHROb2RlID0gZmluZE1heChub2RlLmxlZnQsIG5vZGUuZGltZW5zaW9uKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5leHROb2RlID0gZmluZE1pbihub2RlLnJpZ2h0LCBub2RlLmRpbWVuc2lvbik7XG4gICAgICB9XG5cbiAgICAgIG5leHRPYmogPSBuZXh0Tm9kZS5vYmo7XG4gICAgICByZW1vdmVOb2RlKG5leHROb2RlKTtcbiAgICAgIG5vZGUub2JqID0gbmV4dE9iajtcblxuICAgIH1cblxuICAgIG5vZGUgPSBub2RlU2VhcmNoKHNlbGYucm9vdCk7XG5cbiAgICBpZiAobm9kZSA9PT0gbnVsbCkgeyByZXR1cm47IH1cblxuICAgIHJlbW92ZU5vZGUobm9kZSk7XG4gIH07XG5cbiAgdGhpcy5uZWFyZXN0ID0gZnVuY3Rpb24gKHBvaW50LCBtYXhOb2RlcywgbWF4RGlzdGFuY2UpIHtcbiAgICB2YXIgaSxcbiAgICAgIHJlc3VsdCxcbiAgICAgIGJlc3ROb2RlcztcblxuICAgIGJlc3ROb2RlcyA9IG5ldyBCaW5hcnlIZWFwKFxuICAgICAgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIC1lWzFdOyB9XG4gICAgKTtcblxuICAgIGZ1bmN0aW9uIG5lYXJlc3RTZWFyY2gobm9kZSkge1xuICAgICAgaWYoIXNlbGYucm9vdCl7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIHZhciBiZXN0Q2hpbGQsXG4gICAgICAgIGRpbWVuc2lvbiA9IGRpbWVuc2lvbnNbbm9kZS5kaW1lbnNpb25dLFxuICAgICAgICBvd25EaXN0YW5jZSA9IG1ldHJpYyhwb2ludCwgbm9kZS5vYmopLFxuICAgICAgICBsaW5lYXJQb2ludCA9IHt9LFxuICAgICAgICBsaW5lYXJEaXN0YW5jZSxcbiAgICAgICAgb3RoZXJDaGlsZCxcbiAgICAgICAgaTtcblxuICAgICAgZnVuY3Rpb24gc2F2ZU5vZGUobm9kZSwgZGlzdGFuY2UpIHtcbiAgICAgICAgYmVzdE5vZGVzLnB1c2goW25vZGUsIGRpc3RhbmNlXSk7XG4gICAgICAgIGlmIChiZXN0Tm9kZXMuc2l6ZSgpID4gbWF4Tm9kZXMpIHtcbiAgICAgICAgICBiZXN0Tm9kZXMucG9wKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChpID0gMDsgaSA8IGRpbWVuc2lvbnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgaWYgKGkgPT09IG5vZGUuZGltZW5zaW9uKSB7XG4gICAgICAgICAgbGluZWFyUG9pbnRbZGltZW5zaW9uc1tpXV0gPSBwb2ludFtkaW1lbnNpb25zW2ldXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsaW5lYXJQb2ludFtkaW1lbnNpb25zW2ldXSA9IG5vZGUub2JqW2RpbWVuc2lvbnNbaV1dO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxpbmVhckRpc3RhbmNlID0gbWV0cmljKGxpbmVhclBvaW50LCBub2RlLm9iaik7XG5cbiAgICAgIGlmIChub2RlLnJpZ2h0ID09PSBudWxsICYmIG5vZGUubGVmdCA9PT0gbnVsbCkge1xuICAgICAgICBpZiAoYmVzdE5vZGVzLnNpemUoKSA8IG1heE5vZGVzIHx8IG93bkRpc3RhbmNlIDwgYmVzdE5vZGVzLnBlZWsoKVsxXSkge1xuICAgICAgICAgIHNhdmVOb2RlKG5vZGUsIG93bkRpc3RhbmNlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChub2RlLnJpZ2h0ID09PSBudWxsKSB7XG4gICAgICAgIGJlc3RDaGlsZCA9IG5vZGUubGVmdDtcbiAgICAgIH0gZWxzZSBpZiAobm9kZS5sZWZ0ID09PSBudWxsKSB7XG4gICAgICAgIGJlc3RDaGlsZCA9IG5vZGUucmlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocG9pbnRbZGltZW5zaW9uXSA8IG5vZGUub2JqW2RpbWVuc2lvbl0pIHtcbiAgICAgICAgICBiZXN0Q2hpbGQgPSBub2RlLmxlZnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYmVzdENoaWxkID0gbm9kZS5yaWdodDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBuZWFyZXN0U2VhcmNoKGJlc3RDaGlsZCk7XG5cbiAgICAgIGlmIChiZXN0Tm9kZXMuc2l6ZSgpIDwgbWF4Tm9kZXMgfHwgb3duRGlzdGFuY2UgPCBiZXN0Tm9kZXMucGVlaygpWzFdKSB7XG4gICAgICAgIHNhdmVOb2RlKG5vZGUsIG93bkRpc3RhbmNlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJlc3ROb2Rlcy5zaXplKCkgPCBtYXhOb2RlcyB8fCBNYXRoLmFicyhsaW5lYXJEaXN0YW5jZSkgPCBiZXN0Tm9kZXMucGVlaygpWzFdKSB7XG4gICAgICAgIGlmIChiZXN0Q2hpbGQgPT09IG5vZGUubGVmdCkge1xuICAgICAgICAgIG90aGVyQ2hpbGQgPSBub2RlLnJpZ2h0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG90aGVyQ2hpbGQgPSBub2RlLmxlZnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG90aGVyQ2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICBuZWFyZXN0U2VhcmNoKG90aGVyQ2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1heERpc3RhbmNlKSB7XG4gICAgICBmb3IgKGkgPSAwOyBpIDwgbWF4Tm9kZXM7IGkgKz0gMSkge1xuICAgICAgICBiZXN0Tm9kZXMucHVzaChbbnVsbCwgbWF4RGlzdGFuY2VdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBuZWFyZXN0U2VhcmNoKHNlbGYucm9vdCk7XG5cbiAgICByZXN1bHQgPSBbXTtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBtYXhOb2RlcyAmJiBpIDwgYmVzdE5vZGVzLmNvbnRlbnQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlmIChiZXN0Tm9kZXMuY29udGVudFtpXVswXSkge1xuICAgICAgICByZXN1bHQucHVzaChbYmVzdE5vZGVzLmNvbnRlbnRbaV1bMF0ub2JqLCBiZXN0Tm9kZXMuY29udGVudFtpXVsxXV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIHRoaXMuYmFsYW5jZUZhY3RvciA9IGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBoZWlnaHQobm9kZSkge1xuICAgICAgaWYgKG5vZGUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gTWF0aC5tYXgoaGVpZ2h0KG5vZGUubGVmdCksIGhlaWdodChub2RlLnJpZ2h0KSkgKyAxO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvdW50KG5vZGUpIHtcbiAgICAgIGlmIChub2RlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvdW50KG5vZGUubGVmdCkgKyBjb3VudChub2RlLnJpZ2h0KSArIDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlaWdodChzZWxmLnJvb3QpIC8gKE1hdGgubG9nKGNvdW50KHNlbGYucm9vdCkpIC8gTWF0aC5sb2coMikpO1xuICB9O1xufVxuXG4vLyBCaW5hcnkgaGVhcCBpbXBsZW1lbnRhdGlvbiBmcm9tOlxuLy8gaHR0cDovL2Vsb3F1ZW50amF2YXNjcmlwdC5uZXQvYXBwZW5kaXgyLmh0bWxcblxuZnVuY3Rpb24gQmluYXJ5SGVhcChzY29yZUZ1bmN0aW9uKXtcbiAgdGhpcy5jb250ZW50ID0gW107XG4gIHRoaXMuc2NvcmVGdW5jdGlvbiA9IHNjb3JlRnVuY3Rpb247XG59XG5cbkJpbmFyeUhlYXAucHJvdG90eXBlID0ge1xuICBwdXNoOiBmdW5jdGlvbihlbGVtZW50KSB7XG4gICAgLy8gQWRkIHRoZSBuZXcgZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoZSBhcnJheS5cbiAgICB0aGlzLmNvbnRlbnQucHVzaChlbGVtZW50KTtcbiAgICAvLyBBbGxvdyBpdCB0byBidWJibGUgdXAuXG4gICAgdGhpcy5idWJibGVVcCh0aGlzLmNvbnRlbnQubGVuZ3RoIC0gMSk7XG4gIH0sXG5cbiAgcG9wOiBmdW5jdGlvbigpIHtcbiAgICAvLyBTdG9yZSB0aGUgZmlyc3QgZWxlbWVudCBzbyB3ZSBjYW4gcmV0dXJuIGl0IGxhdGVyLlxuICAgIHZhciByZXN1bHQgPSB0aGlzLmNvbnRlbnRbMF07XG4gICAgLy8gR2V0IHRoZSBlbGVtZW50IGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5LlxuICAgIHZhciBlbmQgPSB0aGlzLmNvbnRlbnQucG9wKCk7XG4gICAgLy8gSWYgdGhlcmUgYXJlIGFueSBlbGVtZW50cyBsZWZ0LCBwdXQgdGhlIGVuZCBlbGVtZW50IGF0IHRoZVxuICAgIC8vIHN0YXJ0LCBhbmQgbGV0IGl0IHNpbmsgZG93bi5cbiAgICBpZiAodGhpcy5jb250ZW50Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuY29udGVudFswXSA9IGVuZDtcbiAgICAgIHRoaXMuc2lua0Rvd24oMCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sXG5cbiAgcGVlazogZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udGVudFswXTtcbiAgfSxcblxuICByZW1vdmU6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICB2YXIgbGVuID0gdGhpcy5jb250ZW50Lmxlbmd0aDtcbiAgICAvLyBUbyByZW1vdmUgYSB2YWx1ZSwgd2UgbXVzdCBzZWFyY2ggdGhyb3VnaCB0aGUgYXJyYXkgdG8gZmluZFxuICAgIC8vIGl0LlxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnRbaV0gPT0gbm9kZSkge1xuICAgICAgICAvLyBXaGVuIGl0IGlzIGZvdW5kLCB0aGUgcHJvY2VzcyBzZWVuIGluICdwb3AnIGlzIHJlcGVhdGVkXG4gICAgICAgIC8vIHRvIGZpbGwgdXAgdGhlIGhvbGUuXG4gICAgICAgIHZhciBlbmQgPSB0aGlzLmNvbnRlbnQucG9wKCk7XG4gICAgICAgIGlmIChpICE9IGxlbiAtIDEpIHtcbiAgICAgICAgICB0aGlzLmNvbnRlbnRbaV0gPSBlbmQ7XG4gICAgICAgICAgaWYgKHRoaXMuc2NvcmVGdW5jdGlvbihlbmQpIDwgdGhpcy5zY29yZUZ1bmN0aW9uKG5vZGUpKVxuICAgICAgICAgICAgdGhpcy5idWJibGVVcChpKTtcbiAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB0aGlzLnNpbmtEb3duKGkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBub3QgZm91bmQuXCIpO1xuICB9LFxuXG4gIHNpemU6IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLmNvbnRlbnQubGVuZ3RoO1xuICB9LFxuXG4gIGJ1YmJsZVVwOiBmdW5jdGlvbihuKSB7XG4gICAgLy8gRmV0Y2ggdGhlIGVsZW1lbnQgdGhhdCBoYXMgdG8gYmUgbW92ZWQuXG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLmNvbnRlbnRbbl07XG4gICAgLy8gV2hlbiBhdCAwLCBhbiBlbGVtZW50IGNhbiBub3QgZ28gdXAgYW55IGZ1cnRoZXIuXG4gICAgd2hpbGUgKG4gPiAwKSB7XG4gICAgICAvLyBDb21wdXRlIHRoZSBwYXJlbnQgZWxlbWVudCdzIGluZGV4LCBhbmQgZmV0Y2ggaXQuXG4gICAgICB2YXIgcGFyZW50TiA9IE1hdGguZmxvb3IoKG4gKyAxKSAvIDIpIC0gMSxcbiAgICAgICAgICBwYXJlbnQgPSB0aGlzLmNvbnRlbnRbcGFyZW50Tl07XG4gICAgICAvLyBTd2FwIHRoZSBlbGVtZW50cyBpZiB0aGUgcGFyZW50IGlzIGdyZWF0ZXIuXG4gICAgICBpZiAodGhpcy5zY29yZUZ1bmN0aW9uKGVsZW1lbnQpIDwgdGhpcy5zY29yZUZ1bmN0aW9uKHBhcmVudCkpIHtcbiAgICAgICAgdGhpcy5jb250ZW50W3BhcmVudE5dID0gZWxlbWVudDtcbiAgICAgICAgdGhpcy5jb250ZW50W25dID0gcGFyZW50O1xuICAgICAgICAvLyBVcGRhdGUgJ24nIHRvIGNvbnRpbnVlIGF0IHRoZSBuZXcgcG9zaXRpb24uXG4gICAgICAgIG4gPSBwYXJlbnROO1xuICAgICAgfVxuICAgICAgLy8gRm91bmQgYSBwYXJlbnQgdGhhdCBpcyBsZXNzLCBubyBuZWVkIHRvIG1vdmUgaXQgZnVydGhlci5cbiAgICAgIGVsc2Uge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH0sXG5cbiAgc2lua0Rvd246IGZ1bmN0aW9uKG4pIHtcbiAgICAvLyBMb29rIHVwIHRoZSB0YXJnZXQgZWxlbWVudCBhbmQgaXRzIHNjb3JlLlxuICAgIHZhciBsZW5ndGggPSB0aGlzLmNvbnRlbnQubGVuZ3RoLFxuICAgICAgICBlbGVtZW50ID0gdGhpcy5jb250ZW50W25dLFxuICAgICAgICBlbGVtU2NvcmUgPSB0aGlzLnNjb3JlRnVuY3Rpb24oZWxlbWVudCk7XG5cbiAgICB3aGlsZSh0cnVlKSB7XG4gICAgICAvLyBDb21wdXRlIHRoZSBpbmRpY2VzIG9mIHRoZSBjaGlsZCBlbGVtZW50cy5cbiAgICAgIHZhciBjaGlsZDJOID0gKG4gKyAxKSAqIDIsIGNoaWxkMU4gPSBjaGlsZDJOIC0gMTtcbiAgICAgIC8vIFRoaXMgaXMgdXNlZCB0byBzdG9yZSB0aGUgbmV3IHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50LFxuICAgICAgLy8gaWYgYW55LlxuICAgICAgdmFyIHN3YXAgPSBudWxsO1xuICAgICAgLy8gSWYgdGhlIGZpcnN0IGNoaWxkIGV4aXN0cyAoaXMgaW5zaWRlIHRoZSBhcnJheSkuLi5cbiAgICAgIGlmIChjaGlsZDFOIDwgbGVuZ3RoKSB7XG4gICAgICAgIC8vIExvb2sgaXQgdXAgYW5kIGNvbXB1dGUgaXRzIHNjb3JlLlxuICAgICAgICB2YXIgY2hpbGQxID0gdGhpcy5jb250ZW50W2NoaWxkMU5dLFxuICAgICAgICAgICAgY2hpbGQxU2NvcmUgPSB0aGlzLnNjb3JlRnVuY3Rpb24oY2hpbGQxKTtcbiAgICAgICAgLy8gSWYgdGhlIHNjb3JlIGlzIGxlc3MgdGhhbiBvdXIgZWxlbWVudCdzLCB3ZSBuZWVkIHRvIHN3YXAuXG4gICAgICAgIGlmIChjaGlsZDFTY29yZSA8IGVsZW1TY29yZSlcbiAgICAgICAgICBzd2FwID0gY2hpbGQxTjtcbiAgICAgIH1cbiAgICAgIC8vIERvIHRoZSBzYW1lIGNoZWNrcyBmb3IgdGhlIG90aGVyIGNoaWxkLlxuICAgICAgaWYgKGNoaWxkMk4gPCBsZW5ndGgpIHtcbiAgICAgICAgdmFyIGNoaWxkMiA9IHRoaXMuY29udGVudFtjaGlsZDJOXSxcbiAgICAgICAgICAgIGNoaWxkMlNjb3JlID0gdGhpcy5zY29yZUZ1bmN0aW9uKGNoaWxkMik7XG4gICAgICAgIGlmIChjaGlsZDJTY29yZSA8IChzd2FwID09IG51bGwgPyBlbGVtU2NvcmUgOiBjaGlsZDFTY29yZSkpe1xuICAgICAgICAgIHN3YXAgPSBjaGlsZDJOO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBlbGVtZW50IG5lZWRzIHRvIGJlIG1vdmVkLCBzd2FwIGl0LCBhbmQgY29udGludWUuXG4gICAgICBpZiAoc3dhcCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuY29udGVudFtuXSA9IHRoaXMuY29udGVudFtzd2FwXTtcbiAgICAgICAgdGhpcy5jb250ZW50W3N3YXBdID0gZWxlbWVudDtcbiAgICAgICAgbiA9IHN3YXA7XG4gICAgICB9XG4gICAgICAvLyBPdGhlcndpc2UsIHdlIGFyZSBkb25lLlxuICAgICAgZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGNyZWF0ZUtkVHJlZTogZnVuY3Rpb24gKHBvaW50cywgbWV0cmljLCBkaW1lbnNpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBLZFRyZWUocG9pbnRzLCBtZXRyaWMsIGRpbWVuc2lvbnMpXG4gIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzPXtcbiAgXCJuYW1lXCI6IFwic2VydmUtc29mYS1ocmlyXCIsXG4gIFwiZXhwb3J0c1wiOiBcInNlcnZlU29mYUhyaXJcIixcbiAgXCJ2ZXJzaW9uXCI6IFwiMC40LjJcIixcbiAgXCJkZXNjcmlwdGlvblwiOiBcIlV0aWxpdHkgdG8gZmV0Y2ggYW5kIHNoYXBlIHNvZmEgZm9ybWF0ZWQgSFJJUiBmcm9tIHNlcnZlclwiLFxuICBcIm1haW5cIjogXCIuL2Rpc3QvXCIsXG4gIFwic3RhbmRhbG9uZVwiOiBcInNlcnZlU29mYUhyaXJcIixcbiAgXCJzY3JpcHRzXCI6IHtcbiAgICBcImxpbnRcIjogXCJlc2xpbnQgLi9zcmMvIC4vdGVzdC8gJiYganNjcyAtLXZlcmJvc2UgLi9zcmMvIC4vdGVzdC9cIixcbiAgICBcImxpbnQtZXhhbXBsZXNcIjogXCJlc2xpbnQgLWMgZXhhbXBsZXMvLmVzbGludHJjIC4vZXhhbXBsZXMvKi5odG1sXCIsXG4gICAgXCJjb21waWxlXCI6IFwicm0gLXJmIC4vZGlzdCAmJiBiYWJlbCAuL3NyYy8gLS1vdXQtZGlyIC4vZGlzdC9cIixcbiAgICBcImJyb3dzZXJpZnlcIjogXCJicm93c2VyaWZ5IC4vc3JjL2luZGV4LmpzIC10IFsgYmFiZWxpZnkgXSAtLXN0YW5kYWxvbmUgc2VydmVTb2ZhSHJpciA+IHNlcnZlU29mYUhyaXIuanNcIixcbiAgICBcImJ1bmRsZVwiOiBcIm5wbSBydW4gbGludCAmJiBucG0gcnVuIHRlc3QgJiYgbnBtIHJ1biBkb2MgJiYgbnBtIHJ1biBjb21waWxlICYmIG5wbSBydW4gYnJvd3NlcmlmeVwiLFxuICAgIFwiZG9jXCI6IFwiZXNkb2MgLWMgZXNkb2MuanNvblwiLFxuICAgIFwidGVzdFwiOiBcImJyb3dzZXJpZnkgdGVzdC8qLyouanMgLXQgWyBiYWJlbGlmeSBdIC0tZXhjbHVkZSAndGVzdC8qLypfbGlzdGVuLmpzKicgLS1leGNsdWRlICd0ZXN0LyovKl9pc3N1ZXMuanMnIHwgdGFwZS1ydW5cIixcbiAgICBcInRlc3QtYnJvd3NlclwiOiBcImJyb3dzZXJpZnkgdGVzdC8qLyouanMgLXQgWyBiYWJlbGlmeSBdIC0tZXhjbHVkZSAndGVzdC8qLypfbGlzdGVuLmpzKicgLS1leGNsdWRlICd0ZXN0LyovKl9pc3N1ZXMuanMnIHwgdGVzdGxpbmcgLXVcIixcbiAgICBcInRlc3QtbGlzdGVuXCI6IFwiYnJvd3NlcmlmeSB0ZXN0LyovKl9saXN0ZW4uanMgLXQgWyBiYWJlbGlmeSBdIHwgdGFwZS1ydW5cIixcbiAgICBcInRlc3QtaXNzdWVzXCI6IFwiYnJvd3NlcmlmeSB0ZXN0LyovKl9pc3N1ZXMuanMgLXQgWyBiYWJlbGlmeSBdIHwgdGFwZS1ydW5cIixcbiAgICBcIndhdGNoXCI6IFwid2F0Y2ggJ25wbSBydW4gYnJvd3NlcmlmeSAmJiBlY2hvICQoIGRhdGUgKTogYnJvd3NlcmlmaWVkJyAuL3NyYy9cIlxuICB9LFxuICBcImF1dGhvcnNcIjogW1xuICAgIFwiSmVhbi1QaGlsaXBwZS5MYW1iZXJ0QGlyY2FtLmZyXCIsXG4gICAgXCJBcm5hdSBKdWxpw6AgPGFybmF1Lmp1bGlhQGdtYWlsLmNvbT5cIixcbiAgICBcIlNhbXVlbC5Hb2xkc3ptaWR0QGlyY2FtLmZyXCIsXG4gICAgXCJEYXZpZC5Qb2lyaWVyLVF1aW5vdEBpcmNhbS5mclwiXG4gIF0sXG4gIFwibGljZW5zZVwiOiBcIkJTRC0zLUNsYXVzZVwiLFxuICBcImRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJnbC1tYXRyaXhcIjogXCJeMi4zLjFcIixcbiAgICBcImtkLnRyZWVcIjogXCJnaXRodWI6YWtzaGF5bGl2ZS9ub2RlLWtkdCMzOWJjNzgwNzA0YTMyNDM5M2JjYTY4YTE3Y2Y3YmM3MWJlODU0NGM2XCIsXG4gICAgXCJmcmFjdGlvbmFsLWRlbGF5XCI6IFwiZ2l0Oi8vZ2l0aHViLmNvbS9JcmNhbS1SbkQvZnJhY3Rpb25hbC1kZWxheS5naXQjZ2gtcGFnZXNcIlxuICB9LFxuICBcInJlcG9zaXRvcnlcIjoge1xuICAgIFwidHlwZVwiOiBcImdpdFwiLFxuICAgIFwidXJsXCI6IFwiZ2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9JcmNhbS1SbkQvc2VydmVTb2ZhSHJpci5naXRcIlxuICB9LFxuICBcImVuZ2luZXNcIjoge1xuICAgIFwibm9kZVwiOiBcIjAuMTIgfHwgNFwiLFxuICAgIFwibnBtXCI6IFwiPj0xLjAuMCA8My4wLjBcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJiYWJlbC1jbGlcIjogXCJeNi41LjFcIixcbiAgICBcImJhYmVsLWVzbGludFwiOiBcIl40LjEuOFwiLFxuICAgIFwiYmFiZWwtcHJlc2V0LWVzMjAxNVwiOiBcIl42LjUuMFwiLFxuICAgIFwiYmFiZWxpZnlcIjogXCJeNy4yLjBcIixcbiAgICBcImJsdWUtdGFwZVwiOiBcIl4wLjEuMTFcIixcbiAgICBcImJyb3dzZXJpZnlcIjogXCJeMTIuMC4yXCIsXG4gICAgXCJlc2RvY1wiOiBcIl4wLjQuNlwiLFxuICAgIFwiZXNsaW50XCI6IFwiXjEuMTAuM1wiLFxuICAgIFwiZXNsaW50LWNvbmZpZy1haXJibmJcIjogXCJeMS4wLjJcIixcbiAgICBcImVzbGludC1wbHVnaW4taHRtbFwiOiBcIl4xLjQuMFwiLFxuICAgIFwianNjc1wiOiBcIjIuMTEuMFwiLFxuICAgIFwianNjcy1qc2RvY1wiOiBcIl4xLjMuMVwiLFxuICAgIFwidGFwZVwiOiBcIl40LjQuMFwiLFxuICAgIFwidGFwZS1ydW5cIjogXCJeMi4xLjJcIixcbiAgICBcInRlc3RsaW5nXCI6IFwiXjEuNy4xXCIsXG4gICAgXCJ3YXRjaFwiOiBcIl4wLjE3LjFcIlxuICB9LFxuICBcImdpdEhlYWRcIjogXCJiZTU0ZmVlZmJjOWM5YzQyMjZhNTgwZTcxM2VhYTU4MDVlOGVkNzg1XCIsXG4gIFwicmVhZG1lXCI6IFwiIyBCaW5hdXJhbCAjXFxuXFxuVGhpcyBsaWJyYXJ5IHBlcm1pdHMgdG8gcmVuZGVyIHNvdXJjZXMgaW4gdGhyZWUtZGltZW5zaW9uYWwgc3BhY2Ugd2l0aFxcbmJpbmF1cmFsIGF1ZGlvLlxcblxcblRoaXMgbGlicmFyeSBwcm92aWRlcyBhbiBhY2Nlc3MgdG8gYSBzZXJ2ZXIsIGluIG9yZGVyIHRvIGxvYWQgYSBzZXQgb2ZcXG5IZWFkLXJlbGF0ZWQgdHJhbnNmZXIgZnVuY3Rpb25zIChbSFJURl0pLiBUaGUgc2V0IG9mIGZpbHRlcnMgYXBwbGllcyB0byBhbnlcXG5udW1iZXIgb2Ygc291cmNlcywgZ2l2ZW4gdGhlaXIgcG9zaXRpb24sIGFuZCBhIGxpc3RlbmVyLlxcblxcblRoaXMgbGlicmFyeSBpcyBjb21wYXRpYmxlIHdpdGggdGhlIFtXZWIgQXVkaW8gQVBJXS4gVGhlIG5vdmVsdHkgb2YgdGhpc1xcbmxpYnJhcnkgaXMgdGhhdCBpdCBwZXJtaXRzIHRvIHVzZSBhIGN1c3RvbSBbSFJURl0gZGF0YXNldCAoc2VlXFxuW1QuIENhcnBlbnRpZXIgYXJ0aWNsZV0pLlxcblxcbkl0IGlzIHBvc3NpYmxlIHRvIHVzZSBpdCB3aXRob3V0IGEgc2VydmVyLCB3aXRoIGEgZGlyZWN0IFVSTCB0byBhbiBbSFJURl1cXG5zZXQuXFxuXFxuIyMgRG9jdW1lbnRhdGlvbiAjI1xcblxcbllvdSBjYW4gY29uc3VsdCB0aGUgW0FQSSBkb2N1bWVudGF0aW9uXSBmb3IgdGhlIGNvbXBsZXRlIGRvY3VtZW50YXRpb24uXFxuXFxuIyMjIEJpbmF1cmFsUGFubmVyICMjI1xcblxcbkEgYEJpbmF1cmFsUGFubmVyYCBpcyBhIHBhbm5lciBmb3IgdXNlIHdpdGggdGhlIFtXZWIgQXVkaW8gQVBJXS4gSXRcXG5zcGF0aWFsaXNlcyBtdWx0aXBsZSBhdWRpbyBzb3VyY2VzLCBnaXZlbiBhIHNldCBvZiBoZWFkLXJlbGF0ZWQgdHJhbnNmZXJcXG5mdW5jdGlvbnMgW0hSVEZdcywgYW5kIGEgbGlzdGVuZXIuXFxuXFxuIyMjIFNlcnZlckRhdGFCYXNlICMjI1xcblxcbioqVGhlIHB1YmxpYyBzZXJ2ZXIgdGhhdCBob3N0cyBhIGRhdGFiYXNlIG9mIGluZGl2aWR1YWwgW0hSVEZdcyBpcyBhdmFpbGFibGVcXG5mb3IgYmV0YS10ZXN0ZXJzIG9ubHkgYW5kIHdpbGwgb3BlbiB0byBwdWJsaWMgaW4gMjAxNi4qKlxcblxcblRoZSBgU2VydmVyRGF0YUJhc2VgIHJldHJpZXZlcyBhIGNhdGFsb2d1ZSBmcm9tIGEgW1NPRkFdIHNlcnZlci4gRnJvbSB0aGVcXG5jYXRhbG9ndWUsIGl0IGdldCBVUkxzIG1hdGNoaW5nIG9wdGlvbmFsIGZpbHRlcnM6IGRhdGEtYmFzZSwgc2FtcGxlLXJhdGUsXFxuYW5kIGFueSBmcmVlIHBhdHRlcm4uXFxuXFxuIyMjIEhSVEYgZGF0YXNldCAjIyNcXG5cXG5Zb3UgY2FuIHVzZSBhbnkgW0hSVEZdIGRhdGEtc2V0IHRoYXQgZm9sbG93cyB0aGUgW1NPRkFdIHN0YW5kYXJkLCBpbiBKU09OXFxuZm9ybWF0LCB1c2luZyBmaW5pdGUgaW1wdWxzZSByZXNwb25zZXMgKEZJUikuIFNlY29uZC1vcmRlciBzZWN0aW9ucyAoU09TKVxcbmFyZSBub3Qgc3VwcG9ydGVkLCB5ZXQuIFNlZSB0aGUgW2V4YW1wbGVzIEhSVEYgZGlyZWN0b3J5XSBmb3IgYSBmZXcgc2FtcGxlcy5cXG5cXG4jIyMgQ29vcmRpbmF0ZSBzeXN0ZW0gdHlwZXMgIyMjXFxuXFxuU2VlIHRoZSBmaWxlcyBpbiBbc3JjL2dlb21ldHJ5XSwgZm9yIGNvbnZlcnNpb25zOlxcbi0gT3BlbkdMLCBbU09GQV0sIGFuZCBTcGF0NCAoSXJjYW0pIGNvbnZlbnRpb25zXFxuLSBjYXJ0ZXNpYW4gYW5kIHNwaGVyaWNhbCBjb29yZGluYXRlc1xcbi0gcmFkaWFuIGFuZCBkZWdyZWUgYW5nbGVzXFxuXFxuXFxuIyMgRXhhbXBsZXMgIyNcXG5cXG5QbGVhc2Ugc2VlIHRoZSBbZXhhbXBsZXMgZGlyZWN0b3J5XSBmb3IgY29tcGxldGUgY29kZSAob24gYnJhbmNoXFxuYGdoLXBhZ2VzYCksIGFuZCB0aGUgW2V4YW1wbGVzIG9ubGluZV0uXFxuXFxuU2VlIGFsc28gdGhlIFtBUEkgZG9jdW1lbnRhdGlvbl0gZm9yIHRoZSBjb21wbGV0ZSBvcHRpb25zLlxcblxcbiMjIyBCaW5hdXJhbFBhbm5lciAjIyNcXG5HaXZlbiBhbiBhdWRpbyBlbGVtZW50LCBhbmQgYSBnbG9iYWwgYmluYXVyYWwgbW9kdWxlLFxcblxcbmBgYGh0bWxcXG48aHRtbD5cXG4gICAgPGhlYWQ+XFxuICAgICAgICA8c2NyaXB0IHNyYz1cXFwiLi4vYmluYXVyYWwuanNcXFwiPjwvc2NyaXB0PlxcbiAgICA8L2hlYWQ+XFxuICAgIDxib2R5PlxcbiAgICAgICAgPGF1ZGlvIGlkPVxcXCJzb3VyY2VcXFwiIHNyYz1cXFwiLi9zbmQvYnJlYWtiZWF0LndhdlxcXCIgY29udHJvbHMgbG9vcD48L2F1ZGlvPlxcbiAgICA8L2JvZHk+XFxuPC9odG1sPlxcbmBgYFxcblxcbmNyZWF0ZSBhIHNvdXJjZSBhdWRpbyBub2RlLFxcblxcbmBgYGpzXFxudmFyIGF1ZGlvQ29udGV4dCA9IG5ldyBBdWRpb0NvbnRleHQoKTtcXG52YXIgJG1lZGlhRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzb3VyY2UnKTtcXG52YXIgcGxheWVyID0gYXVkaW9Db250ZXh0LmNyZWF0ZU1lZGlhRWxlbWVudFNvdXJjZSgkbWVkaWFFbGVtZW50KTtcXG5gYGBcXG5cXG5pbnN0YW50aWF0ZSBhIGBCaW5hdXJhbFBhbm5lcmAgYW5kIGNvbm5lY3QgaXQuXFxuXFxuYGBganNcXG52YXIgYmluYXVyYWxQYW5uZXIgPSBuZXcgYmluYXVyYWwuYXVkaW8uQmluYXVyYWxQYW5uZXIoe1xcbiAgICBhdWRpb0NvbnRleHQsXFxuICAgIGNyb3NzZmFkZUR1cmF0aW9uOiAwLjA1LCAvLyBpbiBzZWNvbmRzXFxuICAgIGNvb3JkaW5hdGVTeXN0ZW06ICdzb2ZhU3BoZXJpY2FsJywgLy8gW2F6aW11dGgsIGVsZXZhdGlvbiwgZGlzdGFuY2VdXFxuICAgIHNvdXJjZUNvdW50OiAxLFxcbiAgICBzb3VyY2VQb3NpdGlvbnM6IFsgWzAsIDAsIDFdIF0sIC8vIGluaXRpYWwgcG9zaXRpb25cXG59KTtcXG5iaW5hdXJhbFBhbm5lci5jb25uZWN0T3V0cHV0cyhhdWRpb0NvbnRleHQuZGVzdGluYXRpb24pO1xcbmJpbmF1cmFsUGFubmVyLmNvbm5lY3RJbnB1dEJ5SW5kZXgoMCwgcGxheWVyKTtcXG5cXG5gYGBcXG5cXG5Mb2FkIGFuIEhSVEYgc2V0ICh0aGlzIHJldHVybnMgYSBbUHJvbWlzZV0pLlxcblxcbmBgYGpzXFxuYmluYXVyYWxQYW5uZXIubG9hZEhydGZTZXQodXJsKVxcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XFxuICAgICAgICBjb25zb2xlLmxvZygnbG9hZGVkJyk7XFxuICAgIH0pXFxuICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcXG4gICAgICAgIGNvbnNvbGUubG9nKCdFcnJvciB3aGlsZSBsb2FkaW5nICcgKyB1cmwgKyBlcnJvci5tZXNzYWdlKTtcXG4gICAgfSk7XFxuYGBgXFxuXFxuVGhlbiwgYW55IHNvdXJjZSBjYW4gbW92ZTpcXG5cXG5gYGBqc1xcbiRhemltdXRoLm9uKFxcXCJpbnB1dFxcXCIsIGZ1bmN0aW9uKGV2ZW50KSB7XFxuICAgIC8vIGdldCBjdXJyZW50IHBvc2l0aW9uXFxuICAgIHZhciBwb3NpdGlvbiA9IGJpbmF1cmFsUGFubmVyLmdldFNvdXJjZVBvc2l0aW9uQnlJbmRleCgwKTtcXG5cXG4gICAgLy8gdXBkYXRlIGF6aW11dGhcXG4gICAgcG9zaXRpb25bMF0gPSBldmVudC50YXJnZXQudmFsdWU7XFxuICAgIGJpbmF1cmFsUGFubmVyLnNldFNvdXJjZVBvc2l0aW9uQnlJbmRleCgwLCBwb3NpdGlvbik7XFxuXFxuICAgIC8vIHVwZGF0ZSBmaWx0ZXJzXFxuICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xcbiAgICAgICAgYmluYXVyYWxQYW5uZXIudXBkYXRlKCk7XFxuICAgIH0pO1xcbn0pO1xcbmBgYFxcblxcbk5vdGUgdGhhdCBhIGNhbGwgdG8gdGhlIGB1cGRhdGVgIG1ldGhvZCBhY3R1YWxseSB1cGRhdGVzIHRoZSBmaWx0ZXJzLlxcblxcbiMjIyBTZXJ2ZXJEYXRhQmFzZSAjIyNcXG5cXG5JbnN0YW50aWF0ZSBhIGBTZXJ2ZXJEYXRhQmFzZWBcXG5cXG5gYGBqc1xcbnZhciBzZXJ2ZXJEYXRhQmFzZSA9IG5ldyBiaW5hdXJhbC5zb2ZhLlNlcnZlckRhdGFCYXNlKCk7XFxuYGBgXFxuXFxuYW5kIGxvYWQgdGhlIGNhdGFsb2d1ZSBmcm9tIHRoZSBzZXJ2ZXIuIFRoaXMgcmV0dXJucyBhIHByb21pc2UuXFxuXFxuYGBganNcXG52YXIgY2F0YWxvZ0xvYWRlZCA9IHNlcnZlckRhdGFCYXNlLmxvYWRDYXRhbG9ndWUoKTtcXG5gYGBcXG5cXG5GaW5kIFVSTHMgd2l0aCBgSFJJUmAgY29udmVudGlvbiwgYENPTVBFTlNBVEVEYCBlcXVhbGlzYXRpb24sIGFuZCBhXFxuc2FtcGxlLXJhdGUgbWF0Y2hpbmcgdGhlIG9uZSBvZiB0aGUgYXVkaW8gY29udGV4dC5cXG5cXG5gYGBqc1xcbnZhciB1cmxzRm91bmQgPSBjYXRhbG9nTG9hZGVkLnRoZW4oZnVuY3Rpb24gKCkge1xcbiAgICB2YXIgdXJscyA9IHNlcnZlckRhdGFCYXNlLmdldFVybHMoe1xcbiAgICAgICAgY29udmVudGlvbjogJ0hSSVInLFxcbiAgICAgICAgZXF1YWxpc2F0aW9uOiAnQ09NUEVOU0FURUQnLFxcbiAgICAgICAgc2FtcGxlUmF0ZTogYXVkaW9Db250ZXh0LnNhbXBsZVJhdGUsXFxuICAgIH0pO1xcbiAgICByZXR1cm4gdXJscztcXG59KVxcbi5jYXRjaChmdW5jdGlvbihlcnJvcikge1xcbiAgICBjb25zb2xlLmxvZygnRXJyb3IgYWNjZXNzaW5nIEhSVEYgc2VydmVyLiAnICsgZXJyb3IubWVzc2FnZSk7XFxufSk7XFxuYGBgXFxuXFxuVGhlbiwgYSBgQmluYXVyYWxQYW5uZXJgIGNhbiBsb2FkIG9uZSBvZiB0aGVzZSBVUkxzLlxcblxcbmBgYGpzXFxudXJsc0ZvdW5kLnRoZW4oZnVuY3Rpb24odXJscykge1xcbiAgICBiaW5hdXJhbFBhbm5lci5sb2FkSHJ0ZlNldCh1cmxzWzBdKVxcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkge1xcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdsb2FkZWQnKTtcXG4gICAgICAgIH0pXFxuICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XFxuICAgICAgICAgICAgY29uc29sZS5sb2coJ0Vycm9yIHdoaWxlIGxvYWRpbmcgJyArIHVybFxcbiAgICAgICAgICAgICAgICArIGVycm9yLm1lc3NhZ2UpO1xcbiAgICAgICAgfSk7XFxufSk7XFxuYGBgXFxuXFxuIyMgSXNzdWVzICMjXFxuXFxuLSByZS1zYW1wbGluZyBpcyBicm9rZW4gb24gZnVsbCBzZXQgKENocm9tZSA0OCBpc3N1ZSk6IHRvbyBtYW55IHBhcmFsbGVsXFxuICBhdWRpbyBjb250ZXh0cz9cXG4tIGNsaWNrcyBvbiBGaXJlZm94IDQ0LTQ1IChkdXJpbmcgdXBkYXRlIG9mIGBjb252b2x2ZXIuYnVmZmVyYCwgYmVjYXVzZVxcbiAgYEF1ZGlvQ29udGV4dC5jdXJyZW50VGltZWAgZG9lcyBub3QgYWR2YW5jZSlcXG4tIFNlcnZlckRhdGFCYXNlOiBhdm9pZCBzZXJ2ZXIgd2l0aCBmcmVlIHBhdHRlcm4gZmlsdGVyP1xcblxcbiMjIFRvIGRvICMjXFxuXFxuLSBhdHRlbnVhdGlvbiB3aXRoIGRpc3RhbmNlXFxuLSBkcnkvd2V0IG91dHB1dHMgZm9yIChzaGFyZWQpIHJldmVyYmVyYXRpb25cXG4tIHN1cHBvcnQgZm9yIGluZmluaXRlIGltcHVsc2UgcmVzcG9uc2VzLCBvbmNlIFtJSVJGaWx0ZXJOb2RlXSBpc1xcbiAgaW1wbGVtZW50ZWQuXFxuXFxuIyMgRGV2ZWxvcGVycyAjI1xcblxcblRoZSBzb3VyY2UgY29kZSBpcyBpbiB0aGUgW3NyYyBkaXJlY3RvcnldLCBpbiBbRVMyMDE1XSBzdGFuZGFyZC4gYG5wbSBydW5cXG5jb21waWxlYCB3aXRoIFtCYWJlbF0gdG8gdGhlIFtkaXN0IGRpcmVjdG9yeV0uIE5vdGUgdGhhdCB0aGVyZSBpcyBhXFxuWy5iYWJlbHJjXSBmaWxlLiBgbnBtIHJ1biBidW5kbGVgIHJ1bnMgdGhlIGxpbnRlcnMsIHRoZSB0ZXN0cyxcXG5nZW5lcmF0ZXMgdGhlIGRvY3VtZW50YXRpb24sIGFuZCBjb21waWxlcyB0aGUgY29kZS5cXG5cXG5Db21taXQgdGhlIHNvdXJjZSBmaWxlcyB0byB0aGUgYnJhbmNoIGBkZXZlbG9wYCwgYW5kIHVwZGF0ZSB0aGUgdmVyc2lvbiBpblxcbltwYWNrYWdlLmpzb25dIGlmIHRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgYSByZWxlYXNlLlxcblxcbk9uIHRoZSBgbWFzdGVyYCBicmFuY2gsIG1lcmdlIGZyb20gdGhlIGBkZXZlbG9wYCBicmFuY2guIEdlbmVyYXRlIGFuZFxcbmNvbW1pdCB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIGRpc3RyaWJ1dGlvbiBmaWxlcy4gUHV0IGEgcmVsZWFzZSB0YWcgdGhhdFxcbmNvcnJlc3BvbmRzIHRvIHRoZSB2ZXJzaW9uIGluIFtwYWNrYWdlLmpzb25dLlxcblxcbk9uIHRoZSBgZ2gtcGFnZXNgIGJyYW5jaCwgbWVyZ2UgZnJvbSB0aGUgYG1hc3RlcmAgYnJhbmNoLiBDb21taXQgdGhlXFxuZXhhbXBsZXMsIGFuZCB0aGUgZXh0cmEgZmlsZXMgKGF1ZGlvIGFuZCBIUlRGIHNldCBmaWxlcykuXFxuXFxuIyMjIFN0eWxlICMjI1xcblxcbmBucG0gcnVuIGxpbnRgIHRvIGNoZWNrIHRoYXQgdGhlIGNvZGUgY29uZm9ybXMgd2l0aCBbLmVzbGludHJjXSBhbmRcXG5bLmpzY3NyY10gZmlsZXMuIFRoZSBydWxlcyBkZXJpdmUgZnJvbSBbQWlyQm5CXSB3aXRoIHRoZXNlXFxubWFqb3IgcG9pbnRzOlxcbi0gW0VTMjAxNV1cXG4tIG5vIGAndXNlIHN0cmljdCdgIGdsb2JhbGx5IChhbHJlYWR5IHRoZXJlIHZpYSBiYWJlbClcXG4tIGVuZm9yY2UgY3VybHkgYnJhY2VzIChgaWZgLCBgZm9yYCwgZXRjLilcXG4tIGFsbG93IHNwYWNlcyBhbmQgbmV3IGxpbmVzLCB3aXRoIGZld2VyIHJlcXVpcmVtZW50czogdXNlIHRoZW0gZm9yIGNsYXJpdHlcXG5cXG4jIyMgVGVzdCAjIyNcXG5cXG5Gb3IgYW55IGZ1bmN0aW9uIG9yIG1ldGhvZCwgdGhlcmUgaXMgYXQgbGVhc3QgYSB0ZXN0LiBUaGUgaGllcmFyY2h5IGluIHRoZVxcblt0ZXN0IGRpcmVjdG9yeV0gaXMgdGhlIHNhbWUgYXMgaW4gdGhlIFtzcmMgZGlyZWN0b3J5XS5cXG5cXG4tIGBucG0gcnVuIHRlc3RgIGZvciBhbGwgYXV0b21hdGVkIHRlc3RzXFxuLSBgbnBtIHJ1biB0ZXN0LWxpc3RlbmAgZm9yIHN1cGVydmlzZWQgbGlzdGVuaW5nIHRlc3RzLiBUaGUgdGVzdCBmaWxlcyBtdXN0XFxuICBlbmQgd2l0aCBgX2xpc3Rlbi5qc2BcXG4tIGBucG0gcnVuIHRlc3QtaXNzdWVzYCBmb3IgdW5zb2x2ZWQgaXNzdWVzLiBUaGUgaXNzdWVzIG1heSBkZXBlbmQgb24gdGhlXFxuICBob3N0OiBvcGVyYXRpbmcgc3lzdGVtLCB1c2VyLWFnZW50LCBzb3VuZC1kZXZpY2UsIHNhbXBsZS1yYXRlLCBldGMuIFRoZVxcbiAgdGVzdCBmaWxlcyBtdXN0IGVuZCB3aXRoIGBfaXNzdWVzLmpzYC4gT25jZSBhbiBpc3N1ZSBpcyBzb2x2ZWQsIHRoZVxcbiAgY29ycmVzcG9uZGluZyB0ZXN0cyBhcmUgYWRkZWQgdG8gdGhlIGF1dG9tYXRlZCB0ZXN0IHNldC5cXG4tIGBucG0gcnVuIHRlc3QtYnJvd3NlcmAgc3RhcnRzIGEgc2VydmVyIGZvciBydW5uaW5nIHRoZSB0ZXN0cyBpbiBhbnkgYnJvd3Nlci5cXG5cXG5FeGFtcGxlcyBmb3Igc3BlY2lmaWMgdGVzdGluZywgd2hlbiBkZXZlbG9waW5nIG9yIHJlc29sdmluZyBhbiBpc3N1ZTpcXG4tIGBicm93c2VyaWZ5IHRlc3QvZ2VvbWV0cnkvdGVzdF9MaXN0ZW5lci5qcyAtdCBiYWJlbGlmeSB8IHRhcGUtcnVuYCBpbiBhXFxuICBoZWFkbGVzcyBicm93c2VyXFxuLSBgYnJvd3NlcmlmeSB0ZXN0L2dlb21ldHJ5L3Rlc3RfTGlzdGVuZXIuanMgLXQgYmFiZWxpZnkgfCB0ZXN0bGluZyAtdWBcXG4gIGZvciBhbiBVUkwgdG8gb3BlbiBpbiBhbnkgYnJvd3NlclxcblxcbiMjIyBEb2N1bWVudGF0aW9uICMjI1xcblxcbkRvY3VtZW50IGFueSBwdWJsaWMgZnVuY3Rpb24gYW5kIG1ldGhvZCB3aXRoIFtKU0RvY10sIGFuZCBnZW5lcmF0ZSB0aGUgSFRNTFxcbnBhZ2VzIHdpdGggYG5wbSBydW4gZG9jYC4gQXQgdGhpcyBwb2ludCwgbmVpdGhlclxcbltqc2RvY10oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvanNkb2MpIG5vclxcbltlc2RvY10oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvZXNkb2MpIGdpdmVzIHBlcmZlY3RcXG50cmFuc2NyaXB0aW9uLiAoU2VlIHRoZSBbanNkb2MuanNvbl0gYW5kIFtlc2RvYy5qc29uXSBmaWxlcy4pXFxuXFxuIyMgTGljZW5zZVxcblxcblRoaXMgbW9kdWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBbQlNELTMtQ2xhdXNlXSBsaWNlbnNlLlxcblxcbiMjIEFja25vd2xlZGdtZW50c1xcblxcblRoaXMgcmVzZWFyY2ggd2FzIGRldmVsb3BlZCBieSBib3RoIFtBY291c3RpYyBBbmQgQ29nbml0aXZlIFNwYWNlc10gYW5kIFtBbmFseXNpcyBvZiBNdXNpY2FsIFByYWN0aWNlc10gSVJDQU0gcmVzZWFyY2ggdGVhbXMuIEEgcHJldmlvdXMgdmVyc2lvbiB3YXMgcGFydCBvZiB0aGUgV0FWRSBwcm9qZWN0LCBmdW5kZWQgYnkgQU5SIChGcmVuY2ggTmF0aW9uYWwgUmVzZWFyY2ggQWdlbmN5KS4gVGhlIGN1cnJlbnQgdmVyc2lvbiwgc3VwcG9ydGluZyBtdWx0aXBsZSBzb3VyY2VzIGFuZCBhIGxpc3RlbmVyLCBIUlRGcyBTT0ZBIGZvcm1hdCBhbmQgdGhlIGFjY2VzcyB0byBhIEhSVEYgc2VydmVyLCBpcyBwYXJ0IG9mIHRoZSBbQ29TaU1hXSBwcm9qZWN0LCBmdW5kZWQgYnkgQU5SLlRoZSBIUlRGIHNlcnZlciBhbmQgZWZmb3J0cyBmb3Igc3RhbmRhcmRpemF0aW9uIG9mIHRoZSBIUlRGIFNPRkEgZm9ybWF0IChbQUVTNjkgc3RhbmRhcmRdKSBiZW5lZml0ZWQgZnJvbSB0aGUgZmluYW5jaWFsIHN1cHBvcnQgb2YgdGhlIFtCaWxpXSBwcm9qZWN0IChGcmVuY2ggZnVuZGluZyBwcm9ncmFtIEZVSSkuIFxcblxcblsvL106ICMgKEF2b2lkIHJlbGF0aXZlIGxpbmtzIGZvciB1c2Ugd2l0aCBodHRwczovL2dpdGh1Yi5jb20vUkVBRE1FLm1kKVxcblsvL106ICMgKGFuZCBodHRwOi8vY2RuLnJhd2dpdC5jb20vSXJjYW0tUm5EL2JpbmF1cmFsRklSL25leHQtZ2gtcGFnZXMvZG9jL2luZGV4Lmh0bWwpXFxuXFxuWy8vXTogIyAoVXNlIHJlbGF0aXZlIGxpbmtzIGFmdGVyIHRoZSByZWxlYXNlLCBhbmQgZHJvcCByYXdnaXQuY29tKVxcblsvL106ICMgKG5leHQtZGV2ZWxvcCA9PiBkZXZlbG9wKVxcblsvL106ICMgKG5leHQtbWFzdGVyID0+IG1hc3RlcilcXG5bLy9dOiAjIChuZXh0LWdoLXBhZ2VzID0+IGdoLXBhZ2VzKVxcblxcblsuYmFiZWxyY106IGh0dHBzOi8vZ2l0aHViLmNvbS9JcmNhbS1SbkQvYmluYXVyYWxGSVIvdHJlZS9uZXh0LWRldmVsb3AvLmJhYmVscmNcXG5bLmVzbGludHJjXTogaHR0cHM6Ly9naXRodWIuY29tL0lyY2FtLVJuRC9iaW5hdXJhbEZJUi90cmVlL25leHQtZGV2ZWxvcC8uZXNsaW50cmNcXG5bLmpzY3NyY106IGh0dHBzOi8vZ2l0aHViLmNvbS9JcmNhbS1SbkQvYmluYXVyYWxGSVIvdHJlZS9uZXh0LWRldmVsb3AvLmpzY3NyY1xcbltBY291c3RpYyBBbmQgQ29nbml0aXZlIFNwYWNlc106IGh0dHA6Ly9yZWNoZXJjaGUuaXJjYW0uZnIvZXF1aXBlcy9zYWxsZXMvXFxuW0FpckJuQl06IGh0dHBzOi8vZ2l0aHViLmNvbS9haXJibmIvamF2YXNjcmlwdC9cXG5bQW5hbHlzaXMgb2YgTXVzaWNhbCBQcmFjdGljZXNdOiBodHRwOi8vYXBtLmlyY2FtLmZyL1xcbltBUEkgZG9jdW1lbnRhdGlvbiBkaXJlY3RvcnldOiBodHRwczovL2dpdGh1Yi5jb20vSXJjYW0tUm5EL2JpbmF1cmFsRklSL3RyZWUvbmV4dC1tYXN0ZXIvZG9jL1xcbltBUEkgZG9jdW1lbnRhdGlvbl06IGh0dHA6Ly9jZG4ucmF3Z2l0LmNvbS9JcmNhbS1SbkQvYmluYXVyYWxGSVIvbmV4dC1tYXN0ZXIvZG9jL2luZGV4Lmh0bWxcXG5bQmFiZWxdOiBodHRwczovL2JhYmVsanMuaW8vXFxuW0JTRC0zLUNsYXVzZV06IGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9CU0QtMy1DbGF1c2VcXG5bQ29TaU1hXTogaHR0cDovL2Nvc2ltYS5pcmNhbS5mci9cXG5bZG9jIGRpcmVjdG9yeV06ICBodHRwczovL2dpdGh1Yi5jb20vSXJjYW0tUm5EL2JpbmF1cmFsRklSL3RyZWUvbmV4dC1tYXN0ZXIvZG9jL1xcbltkaXN0IGRpcmVjdG9yeV06ICBodHRwczovL2dpdGh1Yi5jb20vSXJjYW0tUm5EL2JpbmF1cmFsRklSL3RyZWUvbmV4dC1tYXN0ZXIvZGlzdC9cXG5bZG9jdW1lbnRhdGlvbl06ICNkb2N1bWVudGF0aW9uXFxuW0VTMjAxNV06IGh0dHBzOi8vYmFiZWxqcy5pby9kb2NzL2xlYXJuLWVzMjAxNS9cXG5bZXNkb2MuanNvbl06IGh0dHBzOi8vZ2l0aHViLmNvbS9JcmNhbS1SbkQvYmluYXVyYWxGSVIvdHJlZS9uZXh0LWRldmVsb3AvZXNkb2MuanNvblxcbltleGFtcGxlcyBkaXJlY3RvcnldOiBodHRwczovL2dpdGh1Yi5jb20vSXJjYW0tUm5EL2JpbmF1cmFsRklSL3RyZWUvbmV4dC1naC1wYWdlcy9leGFtcGxlcy9cXG5bZXhhbXBsZXMgSFJURiBkaXJlY3RvcnldOiBodHRwczovL2dpdGh1Yi5jb20vSXJjYW0tUm5EL2JpbmF1cmFsRklSL3RyZWUvbmV4dC1naC1wYWdlcy9leGFtcGxlcy9ocnRmL1xcbltleGFtcGxlcyBvbmxpbmVdOiBodHRwOi8vY2RuLnJhd2dpdC5jb20vSXJjYW0tUm5EL2JpbmF1cmFsRklSL25leHQtZ2gtcGFnZXMvZXhhbXBsZXMvaW5kZXguaHRtbFxcbltIUlRGXTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IZWFkLXJlbGF0ZWRfdHJhbnNmZXJfZnVuY3Rpb25cXG5bSUlSRmlsdGVyTm9kZV06IGh0dHBzOi8vd2ViYXVkaW8uZ2l0aHViLmlvL3dlYi1hdWRpby1hcGkvI2lkbC1kZWYtSUlSRmlsdGVyTm9kZVxcbltqc2RvYy5qc29uXTogaHR0cHM6Ly9naXRodWIuY29tL0lyY2FtLVJuRC9iaW5hdXJhbEZJUi90cmVlL25leHQtZGV2ZWxvcC9qc2RvYy5qc29uXFxuW0pTRG9jXTogaHR0cDovL3VzZWpzZG9jLm9yZy9cXG5bcGFja2FnZS5qc29uXTogaHR0cHM6Ly9naXRodWIuY29tL0lyY2FtLVJuRC9iaW5hdXJhbEZJUi90cmVlL25leHQtZGV2ZWxvcC9wYWNrYWdlLmpzb25cXG5bUHJvbWlzZV06IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb21pc2VcXG5bU09GQV06IGh0dHA6Ly93d3cuYWVzLm9yZy9wdWJsaWNhdGlvbnMvc3RhbmRhcmRzL3NlYXJjaC5jZm0/ZG9jSUQ9OTlcXG5bc3JjIGRpcmVjdG9yeV06IGh0dHBzOi8vZ2l0aHViLmNvbS9JcmNhbS1SbkQvYmluYXVyYWxGSVIvdHJlZS9uZXh0LWRldmVsb3Avc3JjL1xcbltzcmMvZ2VvbWV0cnldOiBodHRwczovL2dpdGh1Yi5jb20vSXJjYW0tUm5EL2JpbmF1cmFsRklSL3RyZWUvbmV4dC1kZXZlbG9wL3NyYy9nZW9tZXRyeS9cXG5bVC4gQ2FycGVudGllciBhcnRpY2xlXTogaHR0cDovL3dhYy5pcmNhbS5mci9wZGYvZGVtby93YWMxNV9zdWJtaXNzaW9uXzE2LnBkZlxcblt0ZXN0IGRpcmVjdG9yeV06IGh0dHBzOi8vZ2l0aHViLmNvbS9JcmNhbS1SbkQvYmluYXVyYWxGSVIvdHJlZS9uZXh0LWRldmVsb3AvdGVzdC9cXG5bV2ViIEF1ZGlvIEFQSV06IGh0dHBzOi8vd2ViYXVkaW8uZ2l0aHViLmlvL3dlYi1hdWRpby1hcGkvXFxuW0FFUzY5IHN0YW5kYXJkXTogaHR0cDovL3d3dy5hZXMub3JnL3B1YmxpY2F0aW9ucy9zdGFuZGFyZHMvc2VhcmNoLmNmbT9kb2NJRD05OVxcbltCaWxpXTogaHR0cDovL3d3dy5iaWxpLXByb2plY3Qub3JnL1wiLFxuICBcInJlYWRtZUZpbGVuYW1lXCI6IFwiUkVBRE1FLm1kXCIsXG4gIFwiYnVnc1wiOiB7XG4gICAgXCJ1cmxcIjogXCJodHRwczovL2dpdGh1Yi5jb20vSXJjYW0tUm5EL3NlcnZlU29mYUhyaXIvaXNzdWVzXCJcbiAgfSxcbiAgXCJob21lcGFnZVwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9JcmNhbS1SbkQvc2VydmVTb2ZhSHJpciNyZWFkbWVcIixcbiAgXCJfaWRcIjogXCJzZXJ2ZS1zb2ZhLWhyaXJAMC40LjJcIixcbiAgXCJfc2hhc3VtXCI6IFwiMWZjMzU1M2Y0OTJmYzY3ODQ1NGM3MjVjNzU5Yzk2Yzk0ZjRiY2UzN1wiLFxuICBcIl9mcm9tXCI6IFwiZ2l0Oi8vZ2l0aHViLmNvbS9JcmNhbS1SbkQvc2VydmVTb2ZhSHJpci5naXRcIixcbiAgXCJfcmVzb2x2ZWRcIjogXCJnaXQ6Ly9naXRodWIuY29tL0lyY2FtLVJuRC9zZXJ2ZVNvZmFIcmlyLmdpdCNiZTU0ZmVlZmJjOWM5YzQyMjZhNTgwZTcxM2VhYTU4MDVlOGVkNzg1XCJcbn1cbiIsIi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4vLyAgQXJjaG9udGlzIFBvbGl0aXNcbi8vICBhcmNob250aXMucG9saXRpc0BhYWx0by5maVxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbi8vXG4vLyAgQSBKYXZhU2NyaXB0IGxpYnJhcnkgdGhhdCBpbXBsZW1lbnRzIFxuLy8gIHRoZSBzcGhlcmljYWwgaGFybW9uaWMgdHJhbnNmb3JtIGZvciByZWFsIHNwaGVyaWNhbCBoYXJtb25pY3Ncbi8vICBhbmQgc29tZSB1c2VmdWwgdHJhbnNmb3JtYXRpb25zIGluIHRoZSBzcGhlcmljYWwgaGFybW9uaWMgZG9tYWluXG4vL1xuLy8gIFRoZSBsaWJyYXJ5IHVzZXMgdGhlIG51bWVyaWMuanMgbGlicmFyeSBmb3IgbWF0cml4IG9wZXJhdGlvbnNcbi8vICBodHRwOi8vd3d3Lm51bWVyaWNqcy5jb20vXG4vL1xuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cblxudmFyIG51bWVyaWMgPSByZXF1aXJlKCdudW1lcmljJyk7XG5cblxuLy8gZm9yd2FyZFNIVCBpbXBsZW1lbnRzIHRoZSBmb3J3YXJkIFNIVCBvbiBkYXRhIGRlZmluZWQgb3ZlciB0aGUgc3BoZXJlXG52YXIgZm9yd2FyZFNIVCA9IGZ1bmN0aW9uIChOLCBkYXRhLCBDQVJUX09SX1NQSCwgRElSRUNUX09SX1BJTlYpIHtcbiAgICBcbiAgICB2YXIgTmRpcnMgPSBkYXRhLmxlbmd0aCwgTnNoID0gKE4rMSkqKE4rMSk7XG4gICAgdmFyIGludllfTjtcbiAgICB2YXIgbWFnID0gWyxdO1xuICAgIGlmIChOc2g+TmRpcnMpICB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiVGhlIFNIVCBkZWdyZWUgaXMgdG9vIGhpZ2ggZm9yIHRoZSBudW1iZXIgb2YgZGF0YSBwb2ludHNcIilcbiAgICB9XG4gICAgXG4gICAgLy8gQ29udmVydCBjYXJ0ZXNpYW4gdG8gc3BoZXJpY2FsIGlmIG5lZWRlZFxuICAgIGlmIChDQVJUX09SX1NQSD09MCkgZGF0YSA9IGNvbnZlcnRDYXJ0MlNwaChkYXRhKTtcbiAgICBmb3IgKHZhciAgaT0wOyBpPGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbWFnW2ldID0gZGF0YVtpXVsyXTtcbiAgICB9XG4gICAgLy8gU0ggc2FtcGxpbmcgbWF0cml4XG4gICAgWV9OID0gY29tcHV0ZVJlYWxTSChOLCBkYXRhKTtcbiAgICAvLyBEaXJlY3QgU0hUXG4gICAgaWYgKERJUkVDVF9PUl9QSU5WPT0wKSB7XG4gICAgICAgIGludllfTiA9IG51bWVyaWMubXVsKDEvTmRpcnMsWV9OKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGludllfTiA9IHBpbnZfZGlyZWN0KG51bWVyaWMudHJhbnNwb3NlKFlfTikpO1xuICAgIH1cbiAgICAvLyBQZXJmb3JtIFNIVFxuICAgIHZhciBjb2VmZnMgPSBudW1lcmljLmRvdE1WKGludllfTiwgbWFnKTtcbiAgICByZXR1cm4gY29lZmZzO1xufVxuXG4vLyBpbnZlcnNlU0hUIGltcGxlbWVudHMgdGhlIGludmVyc2UgU0hUIGZyb20gU0ggY29lZmZpY2llbnRzXG52YXIgaW52ZXJzZVNIVCA9IGZ1bmN0aW9uIChjb2VmZnMsIGF6aUVsZXYpIHtcbiAgICBcbiAgICB2YXIgYXppRWxldlIgPSBhemlFbGV2O1xuICAgIHZhciBOID0gTWF0aC5zcXJ0KGNvZWZmcy5sZW5ndGgpLTE7XG4gICAgLy8gU0ggc2FtcGxpbmcgbWF0cml4XG4gICAgdmFyIFlfTiA9IGNvbXB1dGVSZWFsU0goTiwgYXppRWxldik7XG4gICAgLy8gcmVjb25zdHJ1Y3Rpb25cbiAgICB2YXIgZGF0YSA9IG51bWVyaWMuZG90Vk0oY29lZmZzLCBZX04pO1xuICAgIC8vIGdhdGhlciBpbiBkYXRhIG1hdHJpeFxuICAgIGZvciAodmFyIGk9MDsgaTxhemlFbGV2Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGF6aUVsZXZSW2ldWzJdID0gZGF0YVtpXTtcbiAgICB9XG4gICAgcmV0dXJuIGF6aUVsZXZSO1xufVxuXG4vLyB4eHh4eHh4eHh4eHh4eHh4eHhcbnZhciBwcmludDJEYXJyYXkgPSBmdW5jdGlvbiAoYXJyYXkyRCkge1xuICAgIGZvciAodmFyIHE9MDsgcTxhcnJheTJELmxlbmd0aDsgcSsrKSBjb25zb2xlLmxvZyhhcnJheTJEW3FdKTtcbn1cblxuLy8gY29udmVydENhcnQyU3BoIGNvbnZlcnRzIGFycmF5cyBvZiBjYXJ0ZXNpYW4gdmVjdG9ycyB0byBzcGhlcmljYWwgY29vcmRpbmF0ZXNcbnZhciBjb252ZXJ0Q2FydDJTcGggPSBmdW5jdGlvbiAoeHl6LCBPTUlUX01BRykge1xuICAgIFxuICAgIHZhciBhemksIGVsZXYsIHI7XG4gICAgdmFyIGF6aUVsZXZSID0gbmV3IEFycmF5KHh5ei5sZW5ndGgpO1xuICAgIFxuICAgIGZvciAodmFyIGk9MDsgaTx4eXoubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXppID0gTWF0aC5hdGFuMiggeHl6W2ldWzFdLCB4eXpbaV1bMF0gKTtcbiAgICAgICAgZWxldiA9IE1hdGguYXRhbjIoIHh5eltpXVsyXSwgTWF0aC5zcXJ0KHh5eltpXVswXSp4eXpbaV1bMF0gKyB4eXpbaV1bMV0qeHl6W2ldWzFdKSApO1xuICAgICAgICBpZiAoT01JVF9NQUc9PTEpIHtcbiAgICAgICAgICAgIGF6aUVsZXZSW2ldID0gW2F6aSxlbGV2XTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHIgPSBNYXRoLnNxcnQoeHl6W2ldWzBdKnh5eltpXVswXSArIHh5eltpXVsxXSp4eXpbaV1bMV0gKyB4eXpbaV1bMl0qeHl6W2ldWzJdKTtcbiAgICAgICAgICAgIGF6aUVsZXZSW2ldID0gW2F6aSxlbGV2LHJdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhemlFbGV2Ujtcbn1cblxuLy8gY29udmVydFNwaDJDYXJ0IGNvbnZlcnRzIGFycmF5cyBvZiBzcGhlcmljYWwgY29vcmRpbmF0ZXMgdG8gY2FydGVzaWFuXG52YXIgY29udmVydFNwaDJDYXJ0ID0gZnVuY3Rpb24gKGF6aUVsZXZSKSB7XG4gICAgXG4gICAgdmFyIHgseSx6O1xuICAgIHZhciB4eXogPSBuZXcgQXJyYXkoYXppRWxldlIubGVuZ3RoKTtcbiAgICBcbiAgICBmb3IgKHZhciBpPTA7IGk8YXppRWxldlIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgeCA9IE1hdGguY29zKGF6aUVsZXZSW2ldWzBdKSpNYXRoLmNvcyhhemlFbGV2UltpXVsxXSk7XG4gICAgICAgIHkgPSBNYXRoLnNpbihhemlFbGV2UltpXVswXSkqTWF0aC5jb3MoYXppRWxldlJbaV1bMV0pO1xuICAgICAgICB6ID0gTWF0aC5zaW4oYXppRWxldlJbaV1bMV0pO1xuICAgICAgICBpZiAoYXppRWxldlJbMF0ubGVuZ3RoPT0yKSB4eXpbaV0gPSBbeCx5LHpdO1xuICAgICAgICBlbHNlIGlmIChhemlFbGV2UlswXS5sZW5ndGg9PTMpIHh5eltpXSA9IFthemlFbGV2UltpXVsyXSp4LGF6aUVsZXZSW2ldWzJdKnksYXppRWxldlJbaV1bMl0qel07XG4gICAgfVxuICAgIHJldHVybiB4eXo7XG59XG5cbi8vIGNvbXB1dGVSZWFsU0ggY29tcHV0ZXMgcmVhbCBzcGhlcmljYWwgaGFybW9uaWNzIHVwIHRvIG9yZGVyIE5cbnZhciBjb21wdXRlUmVhbFNIID0gZnVuY3Rpb24gKE4sIGRhdGEpIHtcbiAgICBcbiAgICB2YXIgYXppID0gbmV3IEFycmF5KGRhdGEubGVuZ3RoKTtcbiAgICB2YXIgZWxldiA9IG5ldyBBcnJheShkYXRhLmxlbmd0aCk7XG4gICAgXG4gICAgZm9yICh2YXIgaT0wOyBpPGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXppW2ldID0gZGF0YVtpXVswXTtcbiAgICAgICAgZWxldltpXSA9IGRhdGFbaV1bMV07XG4gICAgfVxuICAgIFxuICAgIHZhciBmYWN0b3JpYWxzID0gbmV3IEFycmF5KDIqTisxKTtcbiAgICB2YXIgTmRpcnMgPSBhemkubGVuZ3RoO1xuICAgIHZhciBOc2ggPSAoTisxKSooTisxKTtcbiAgICB2YXIgbGVnX25fbWludXMxID0gMDtcbiAgICB2YXIgbGVnX25fbWludXMyID0gMDtcbiAgICB2YXIgbGVnX247XG4gICAgdmFyIHNpbmVsID0gbnVtZXJpYy5zaW4oZWxldik7XG4gICAgdmFyIGluZGV4X24gPSAwO1xuICAgIHZhciBZX04gPSBuZXcgQXJyYXkoTnNoKTtcbiAgICB2YXIgTm4wLCBObm07XG4gICAgdmFyIGNvc21hemksIHNpbm1hemk7XG4gICAgXG4gICAgLy8gcHJlY29tcHV0ZSBmYWN0b3JpYWxzXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyKk4rMTsgaSsrKSBmYWN0b3JpYWxzW2ldID0gZmFjdG9yaWFsKGkpO1xuICAgIFxuICAgIGZvciAodmFyIG4gPSAwOyBuPE4rMTsgbisrKSB7XG4gICAgICAgIGlmIChuPT0wKSB7XG4gICAgICAgICAgICB2YXIgdGVtcDAgPSBuZXcgQXJyYXkoYXppLmxlbmd0aCk7XG4gICAgICAgICAgICB0ZW1wMC5maWxsKDEpO1xuICAgICAgICAgICAgWV9OW25dID0gdGVtcDA7XG4gICAgICAgICAgICBpbmRleF9uID0gMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxlZ19uID0gcmVjdXJzZUxlZ2VuZHJlUG9seShuLCBzaW5lbCwgbGVnX25fbWludXMxLCBsZWdfbl9taW51czIpO1xuICAgICAgICAgICAgTm4wID0gTWF0aC5zcXJ0KDIqbisxKTtcbiAgICAgICAgICAgIGZvciAodmFyIG0gPSAwOyBtPG4rMTsgbSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKG09PTApIFlfTltpbmRleF9uK25dID0gbnVtZXJpYy5tdWwoTm4wLGxlZ19uW21dKTtcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgTm5tID0gTm4wKk1hdGguc3FydCggMiAqIGZhY3RvcmlhbHNbbi1tXS9mYWN0b3JpYWxzW24rbV0gKTtcbiAgICAgICAgICAgICAgICAgICAgY29zbWF6aSA9IG51bWVyaWMuY29zKG51bWVyaWMubXVsKG0sYXppKSk7XG4gICAgICAgICAgICAgICAgICAgIHNpbm1hemkgPSBudW1lcmljLnNpbihudW1lcmljLm11bChtLGF6aSkpO1xuICAgICAgICAgICAgICAgICAgICBZX05baW5kZXhfbituLW1dID0gbnVtZXJpYy5tdWwoTm5tLCBudW1lcmljLm11bChsZWdfblttXSwgc2lubWF6aSkpO1xuICAgICAgICAgICAgICAgICAgICBZX05baW5kZXhfbituK21dID0gbnVtZXJpYy5tdWwoTm5tLCBudW1lcmljLm11bChsZWdfblttXSwgY29zbWF6aSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluZGV4X24gPSBpbmRleF9uKzIqbisxO1xuICAgICAgICB9XG4gICAgICAgIGxlZ19uX21pbnVzMiA9IGxlZ19uX21pbnVzMTtcbiAgICAgICAgbGVnX25fbWludXMxID0gbGVnX247XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBZX047XG59XG5cbi8vIGZhY3RvcmlhbCBjb21wdXRlIGZhY3RvcmlhbFxudmFyIGZhY3RvcmlhbCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgaWYgKG4gPT09IDApIHJldHVybiAxO1xuICAgIHJldHVybiBuICogZmFjdG9yaWFsKG4gLSAxKTtcbn1cblxuLy8gcmVjdXJzZUxlZ2VuZHJlUG9seSBjb21wdXRlcyBhc3NvY2lhdGVkIExlZ2VuZHJlIGZ1bmN0aW9ucyByZWN1cnNpdmVseVxudmFyIHJlY3Vyc2VMZWdlbmRyZVBvbHkgPSBmdW5jdGlvbiAobiwgeCwgUG5tX21pbnVzMSwgUG5tX21pbnVzMikge1xuICAgIFxuICAgIHZhciBQbm0gPSBuZXcgQXJyYXkobisxKTtcbiAgICBzd2l0Y2gobikge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICB2YXIgeDIgPSBudW1lcmljLm11bCh4LHgpO1xuICAgICAgICAgICAgdmFyIFAxMCA9IHg7XG4gICAgICAgICAgICB2YXIgUDExID0gbnVtZXJpYy5zcXJ0KG51bWVyaWMuc3ViKDEseDIpKTtcbiAgICAgICAgICAgIFBubVswXSA9IFAxMDtcbiAgICAgICAgICAgIFBubVsxXSA9IFAxMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgICB2YXIgeDIgPSBudW1lcmljLm11bCh4LHgpO1xuICAgICAgICAgICAgdmFyIFAyMCA9IG51bWVyaWMubXVsKDMseDIpO1xuICAgICAgICAgICAgUDIwID0gbnVtZXJpYy5zdWIoUDIwLDEpO1xuICAgICAgICAgICAgUDIwID0gbnVtZXJpYy5kaXYoUDIwLDIpO1xuICAgICAgICAgICAgdmFyIFAyMSA9IG51bWVyaWMuc3ViKDEseDIpO1xuICAgICAgICAgICAgUDIxID0gbnVtZXJpYy5zcXJ0KFAyMSk7XG4gICAgICAgICAgICBQMjEgPSBudW1lcmljLm11bCgzLFAyMSk7XG4gICAgICAgICAgICBQMjEgPSBudW1lcmljLm11bChQMjEseCk7XG4gICAgICAgICAgICB2YXIgUDIyID0gbnVtZXJpYy5zdWIoMSx4Mik7XG4gICAgICAgICAgICBQMjIgPSBudW1lcmljLm11bCgzLFAyMik7XG4gICAgICAgICAgICBQbm1bMF0gPSBQMjA7XG4gICAgICAgICAgICBQbm1bMV0gPSBQMjE7XG4gICAgICAgICAgICBQbm1bMl0gPSBQMjI7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHZhciB4MiA9IG51bWVyaWMubXVsKHgseCk7XG4gICAgICAgICAgICB2YXIgb25lX21pbl94MiA9IG51bWVyaWMuc3ViKDEseDIpO1xuICAgICAgICAgICAgLy8gbGFzdCB0ZXJtIG09blxuICAgICAgICAgICAgdmFyIGsgPSAyKm4tMTtcbiAgICAgICAgICAgIHZhciBkZmFjdF9rID0gMTtcbiAgICAgICAgICAgIGlmICgoayAlIDIpID09IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBraz0xOyBrazxrLzIrMTsga2srKykgZGZhY3RfayA9IGRmYWN0X2sqMipraztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGtrPTE7IGtrPChrKzEpLzIrMTsga2srKykgZGZhY3RfayA9IGRmYWN0X2sqKDIqa2stMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBQbm1bbl0gPSBudW1lcmljLm11bChkZmFjdF9rLCBudW1lcmljLnBvdyhvbmVfbWluX3gyLCBuLzIpKTtcbiAgICAgICAgICAgIC8vIGJlZm9yZSBsYXN0IHRlcm1cbiAgICAgICAgICAgIFBubVtuLTFdID0gbnVtZXJpYy5tdWwoMipuLTEsIG51bWVyaWMubXVsKHgsIFBubV9taW51czFbbi0xXSkpOyAvLyBQX3tuKG4tMSl9ID0gKDIqbi0xKSp4KlBfeyhuLTEpKG4tMSl9XG4gICAgICAgICAgICAvLyB0aHJlZSB0ZXJtIHJlY3Vyc2VuY2UgZm9yIHRoZSByZXN0XG4gICAgICAgICAgICBmb3IgKHZhciBtPTA7IG08bi0xOyBtKyspIHtcbiAgICAgICAgICAgICAgICB2YXIgdGVtcDEgPSBudW1lcmljLm11bCggMipuLTEsIG51bWVyaWMubXVsKHgsIFBubV9taW51czFbbV0pICk7XG4gICAgICAgICAgICAgICAgdmFyIHRlbXAyID0gbnVtZXJpYy5tdWwoIG4rbS0xLCBQbm1fbWludXMyW21dICk7XG4gICAgICAgICAgICAgICAgUG5tW21dID0gbnVtZXJpYy5kaXYoIG51bWVyaWMuc3ViKHRlbXAxLCB0ZW1wMiksIG4tbSk7IC8vIFBfbCA9ICggKDJsLTEpeFBfKGwtMSkgLSAobCttLTEpUF8obC0yKSApLyhsLW0pXG4gICAgICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBQbm07XG59XG5cbi8vIHBpbnZfc3ZkIGNvbXB1dGVzIHRoZSBwc2V1ZG8taW52ZXJzZSB1c2luZyBTVkRcbnZhciBwaW52X3N2ZCA9IGZ1bmN0aW9uIChBKSB7XG4gICAgdmFyIHogPSBudW1lcmljLnN2ZChBKSwgZm9vID0gei5TWzBdO1xuICAgIHZhciBVID0gei5VLCBTID0gei5TLCBWID0gei5WO1xuICAgIHZhciBtID0gQS5sZW5ndGgsIG4gPSBBWzBdLmxlbmd0aCwgdG9sID0gTWF0aC5tYXgobSxuKSpudW1lcmljLmVwc2lsb24qZm9vLE0gPSBTLmxlbmd0aDtcbiAgICB2YXIgU2ludiA9IG5ldyBBcnJheShNKTtcbiAgICBmb3IodmFyIGk9TS0xO2khPT0tMTtpLS0pIHsgaWYoU1tpXT50b2wpIFNpbnZbaV0gPSAxL1NbaV07IGVsc2UgU2ludltpXSA9IDA7IH1cbiAgICByZXR1cm4gbnVtZXJpYy5kb3QobnVtZXJpYy5kb3QoVixudW1lcmljLmRpYWcoU2ludikpLG51bWVyaWMudHJhbnNwb3NlKFUpKVxufVxuXG4vLyBwaW52X2RpcmVjdCBjb21wdXRlcyB0aGUgbGVmdCBwc2V1ZG8taW52ZXJzZVxudmFyIHBpbnZfZGlyZWN0ID0gZnVuY3Rpb24gKEEpIHtcbiAgICB2YXIgQVQgPSBudW1lcmljLnRyYW5zcG9zZShBKTtcbiAgICByZXR1cm4gbnVtZXJpYy5kb3QobnVtZXJpYy5pbnYobnVtZXJpYy5kb3QoQVQsQSkpLEFUKTtcbn1cblxuLy8gY29tcHV0ZXMgcm90YXRpb24gbWF0cmljZXMgZm9yIHJlYWwgc3BoZXJpY2FsIGhhcm1vbmljc1xudmFyIGdldFNIcm90TXR4ID0gZnVuY3Rpb24gKFJ4eXosIEwpIHtcbiAgICBcbiAgICB2YXIgTnNoID0gKEwrMSkqKEwrMSk7XG4gICAgLy8gYWxsb2NhdGUgdG90YWwgcm90YXRpb24gbWF0cml4XG4gICAgdmFyIFIgPSBudW1lcmljLnJlcChbTnNoLE5zaF0sMCk7XG4gICAgXG4gICAgLy8gaW5pdGlhbGl6ZSB6ZXJvdGggYW5kIGZpcnN0IGJhbmQgcm90YXRpb24gbWF0cmljZXMgZm9yIHJlY3Vyc2lvblxuICAgIC8vIFJ4eXogPSBbUnh4IFJ4eSBSeHpcbiAgICAvLyAgICAgICAgIFJ5eCBSeXkgUnl6XG4gICAgLy8gICAgICAgICBSenggUnp5IFJ6el1cbiAgICAvL1xuICAgIC8vIHplcm90aC1iYW5kIChsPTApIGlzIGludmFyaWFudCB0byByb3RhdGlvblxuICAgIFJbMF1bMF0gPSAxO1xuICAgIFxuICAgIC8vIHRoZSBmaXJzdCBiYW5kIChsPTEpIGlzIGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIHJvdGF0aW9uIG1hdHJpeFxuICAgIHZhciBSXzEgPSBudW1lcmljLnJlcChbMywzXSwwKTtcbiAgICBSXzFbMF1bMF0gPSBSeHl6WzFdWzFdO1xuICAgIFJfMVswXVsxXSA9IFJ4eXpbMV1bMl07XG4gICAgUl8xWzBdWzJdID0gUnh5elsxXVswXTtcbiAgICBSXzFbMV1bMF0gPSBSeHl6WzJdWzFdO1xuICAgIFJfMVsxXVsxXSA9IFJ4eXpbMl1bMl07XG4gICAgUl8xWzFdWzJdID0gUnh5elsyXVswXTtcbiAgICBSXzFbMl1bMF0gPSBSeHl6WzBdWzFdO1xuICAgIFJfMVsyXVsxXSA9IFJ4eXpbMF1bMl07XG4gICAgUl8xWzJdWzJdID0gUnh5elswXVswXTtcbiAgICBcbiAgICBSID0gbnVtZXJpYy5zZXRCbG9jayhSLCBbMSwxXSwgWzMsM10sIFJfMSk7XG4gICAgdmFyIFJfbG0xID0gUl8xO1xuICAgIFxuICAgIC8vIGNvbXB1dGUgcm90YXRpb24gbWF0cml4IG9mIGVhY2ggc3Vic2VxdWVudCBiYW5kIHJlY3Vyc2l2ZWx5XG4gICAgdmFyIGJhbmRfaWR4ID0gMztcbiAgICBmb3IgKHZhciBsPTI7IGw8TCsxOyBsKyspIHtcbiAgICAgICAgXG4gICAgICAgIHZhciBSX2wgPSBudW1lcmljLnJlcChbKDIqbCsxKSwoMipsKzEpXSwwKTtcbiAgICAgICAgZm9yICh2YXIgbT0tbDsgbTxsKzE7IG0rKykge1xuICAgICAgICAgICAgZm9yICh2YXIgbj0tbDsgbjxsKzE7IG4rKykge1xuICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgdSx2LHcgdGVybXMgb2YgRXEuOC4xIChUYWJsZSBJKVxuICAgICAgICAgICAgICAgIHZhciBkLCBkZW5vbSwgdSwgdiwgdztcbiAgICAgICAgICAgICAgICBpZiAobT09MCkgZCA9IDE7XG4gICAgICAgICAgICAgICAgZWxzZSBkID0gMDsgLy8gdGhlIGRlbHRhIGZ1bmN0aW9uIGRfbTBcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMobik9PWwpIGRlbm9tID0gKDIqbCkqKDIqbC0xKTtcbiAgICAgICAgICAgICAgICBlbHNlIGRlbm9tID0gKGwqbC1uKm4pO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHUgPSBNYXRoLnNxcnQoKGwqbC1tKm0pL2Rlbm9tKTtcbiAgICAgICAgICAgICAgICB2ID0gTWF0aC5zcXJ0KCgxK2QpKihsK01hdGguYWJzKG0pLTEpKihsK01hdGguYWJzKG0pKS9kZW5vbSkqKDEtMipkKSowLjU7XG4gICAgICAgICAgICAgICAgdyA9IE1hdGguc3FydCgobC1NYXRoLmFicyhtKS0xKSoobC1NYXRoLmFicyhtKSkvZGVub20pKigxLWQpKigtMC41KTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBjb21wdXRlcyBFcS44LjFcbiAgICAgICAgICAgICAgICBpZiAodSE9MCkgdSA9IHUqVShsLG0sbixSXzEsUl9sbTEpO1xuICAgICAgICAgICAgICAgIGlmICh2IT0wKSB2ID0gdipWKGwsbSxuLFJfMSxSX2xtMSk7XG4gICAgICAgICAgICAgICAgaWYgKHchPTApIHcgPSB3KlcobCxtLG4sUl8xLFJfbG0xKTtcbiAgICAgICAgICAgICAgICBSX2xbbStsXVtuK2xdID0gdSArIHYgKyB3O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFIgPSBudW1lcmljLnNldEJsb2NrKFIsIFtiYW5kX2lkeCsxLGJhbmRfaWR4KzFdLCBbYmFuZF9pZHgrMipsKzEsYmFuZF9pZHgrMipsKzFdLCBSX2wpO1xuICAgICAgICBSX2xtMSA9IFJfbDtcbiAgICAgICAgYmFuZF9pZHggPSBiYW5kX2lkeCArIDIqbCsxO1xuICAgIH1cbiAgICByZXR1cm4gUjtcbn1cblxuLy8gZnVuY3Rpb25zIHRvIGNvbXB1dGUgdGVybXMgVSwgViwgVyBvZiBFcS44LjEgKFRhYmxlIElJKVxuZnVuY3Rpb24gVShsLG0sbixSXzEsUl9sbTEpIHtcbiAgICBcbiAgICByZXR1cm4gUCgwLGwsbSxuLFJfMSxSX2xtMSk7XG59XG5cbmZ1bmN0aW9uIFYobCxtLG4sUl8xLFJfbG0xKSB7XG4gICAgXG4gICAgdmFyIHAwLCBwMSwgcmV0LCBkO1xuICAgIGlmIChtPT0wKSB7XG4gICAgICAgIHAwID0gUCgxLGwsMSxuLFJfMSxSX2xtMSk7XG4gICAgICAgIHAxID0gUCgtMSxsLC0xLG4sUl8xLFJfbG0xKTtcbiAgICAgICAgcmV0ID0gcDArcDE7XG4gICAgfVxuICAgIGVsc2UgaWYgKG0+MCkge1xuICAgICAgICBpZiAobT09MSkgZCA9IDE7XG4gICAgICAgIGVsc2UgZCA9IDA7XG4gICAgICAgIHAwID0gUCgxLGwsbS0xLG4sUl8xLFJfbG0xKTtcbiAgICAgICAgcDEgPSBQKC0xLGwsLW0rMSxuLFJfMSxSX2xtMSk7XG4gICAgICAgIHJldCA9IHAwKk1hdGguc3FydCgxK2QpIC0gcDEqKDEtZCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAobT09LTEpIGQgPSAxO1xuICAgICAgICBlbHNlIGQgPSAwO1xuICAgICAgICBwMCA9IFAoMSxsLG0rMSxuLFJfMSxSX2xtMSk7XG4gICAgICAgIHAxID0gUCgtMSxsLC1tLTEsbixSXzEsUl9sbTEpO1xuICAgICAgICByZXQgPSBwMCooMS1kKSArIHAxKk1hdGguc3FydCgxK2QpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBXKGwsbSxuLFJfMSxSX2xtMSkge1xuICAgIFxuICAgIHZhciBwMCwgcDEsIHJldDtcbiAgICBpZiAobT09MCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwic2hvdWxkIG5vdCBiZSBjYWxsZWRcIik7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAobT4wKSB7XG4gICAgICAgICAgICBwMCA9IFAoMSxsLG0rMSxuLFJfMSxSX2xtMSk7XG4gICAgICAgICAgICBwMSA9IFAoLTEsbCwtbS0xLG4sUl8xLFJfbG0xKTtcbiAgICAgICAgICAgIHJldCA9IHAwICsgcDE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwMCA9IFAoMSxsLG0tMSxuLFJfMSxSX2xtMSk7XG4gICAgICAgICAgICBwMSA9IFAoLTEsbCwtbSsxLG4sUl8xLFJfbG0xKTtcbiAgICAgICAgICAgIHJldCA9IHAwIC0gcDE7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cblxuLy8gZnVuY3Rpb24gdG8gY29tcHV0ZSB0ZXJtIFAgb2YgVSxWLFcgKFRhYmxlIElJKVxuZnVuY3Rpb24gUChpLGwsYSxiLFJfMSxSX2xtMSkge1xuICAgIFxuICAgIHZhciByaTEsIHJpbTEsIHJpMCwgcmV0O1xuICAgIHJpMSA9IFJfMVtpKzFdWzErMV07XG4gICAgcmltMSA9IFJfMVtpKzFdWy0xKzFdO1xuICAgIHJpMCA9IFJfMVtpKzFdWzArMV07XG4gICAgXG4gICAgaWYgKGI9PS1sKSB7XG4gICAgICAgIHJldCA9IHJpMSpSX2xtMVthK2wtMV1bMF0gKyByaW0xKlJfbG0xW2ErbC0xXVsyKmwtMl07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBpZiAoYj09bCkgcmV0ID0gcmkxKlJfbG0xW2ErbC0xXVsyKmwtMl0gLSByaW0xKlJfbG0xW2ErbC0xXVswXTtcbiAgICAgICAgZWxzZSByZXQgPSByaTAqUl9sbTFbYStsLTFdW2IrbC0xXTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbn1cblxuLy8geWF3UGl0Y2hSb2xsMlJ6eXggY29tcHV0ZXMgdGhlIHJvdGF0aW9uIG1hdHJpeCBmcm9tIFpZJ1gnJyByb3RhdGlvbiBhbmdsZXNcbnZhciB5YXdQaXRjaFJvbGwyUnp5eCA9IGZ1bmN0aW9uICh5YXcsIHBpdGNoLCByb2xsKSB7XG4gICAgXG4gICAgdmFyIFJ4LCBSeSwgUno7XG4gICAgaWYgKHJvbGwgPT0gMCkgUnggPSBbWzEsMCwwXSxbMCwxLDBdLFswLDAsMV1dO1xuICAgIGVsc2UgUnggPSBbWzEsIDAsIDBdLCBbMCwgTWF0aC5jb3Mocm9sbCksIE1hdGguc2luKHJvbGwpXSwgWzAsIC1NYXRoLnNpbihyb2xsKSwgTWF0aC5jb3Mocm9sbCldXTtcbiAgICBpZiAocGl0Y2ggPT0gMCkgUnkgPSBbWzEsMCwwXSxbMCwxLDBdLFswLDAsMV1dO1xuICAgIGVsc2UgUnkgPSBbW01hdGguY29zKHBpdGNoKSwgMCwgLU1hdGguc2luKHBpdGNoKV0sIFswLCAxLCAwXSwgW01hdGguc2luKHBpdGNoKSwgMCwgTWF0aC5jb3MocGl0Y2gpXV07XG4gICAgaWYgKHlhdyA9PSAwKSBSeiA9IFtbMSwwLDBdLFswLDEsMF0sWzAsMCwxXV07XG4gICAgZWxzZSBSeiA9IFtbTWF0aC5jb3MoeWF3KSwgTWF0aC5zaW4oeWF3KSwgMF0sIFstTWF0aC5zaW4oeWF3KSwgTWF0aC5jb3MoeWF3KSwgMF0sIFswLCAwLCAxXV07XG4gICAgXG4gICAgdmFyIFIgPSBudW1lcmljLmRvdE1Nc21hbGwoUnksUnopO1xuICAgIFIgPSBudW1lcmljLmRvdE1Nc21hbGwoUngsUik7XG4gICAgcmV0dXJuIFI7XG59XG5cblxuLy8gZXhwb3J0c1xubW9kdWxlLmV4cG9ydHMuZm9yd2FyZFNIVCA9IGZvcndhcmRTSFQ7XG5tb2R1bGUuZXhwb3J0cy5pbnZlcnNlU0hUID0gaW52ZXJzZVNIVDtcbm1vZHVsZS5leHBvcnRzLnByaW50MkRhcnJheSA9IHByaW50MkRhcnJheTtcbm1vZHVsZS5leHBvcnRzLmNvbnZlcnRDYXJ0MlNwaCA9IGNvbnZlcnRDYXJ0MlNwaDtcbm1vZHVsZS5leHBvcnRzLmNvbnZlcnRTcGgyQ2FydCA9IGNvbnZlcnRTcGgyQ2FydDtcbm1vZHVsZS5leHBvcnRzLmNvbXB1dGVSZWFsU0ggPSBjb21wdXRlUmVhbFNIO1xubW9kdWxlLmV4cG9ydHMuZmFjdG9yaWFsID0gZmFjdG9yaWFsO1xubW9kdWxlLmV4cG9ydHMucmVjdXJzZUxlZ2VuZHJlUG9seSA9IHJlY3Vyc2VMZWdlbmRyZVBvbHk7XG5tb2R1bGUuZXhwb3J0cy5waW52X3N2ZCA9IHBpbnZfc3ZkO1xubW9kdWxlLmV4cG9ydHMucGludl9kaXJlY3QgPSBwaW52X2RpcmVjdDtcbm1vZHVsZS5leHBvcnRzLmdldFNIcm90TXR4ID0gZ2V0U0hyb3RNdHg7XG5tb2R1bGUuZXhwb3J0cy55YXdQaXRjaFJvbGwyUnp5eCA9IHlhd1BpdGNoUm9sbDJSenl4O1xuIl19\n"
  },
  {
    "path": "browser/plugins/and_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"and_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emit true if and only if both inputs are true and false otherwise.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'a', dt: core.datatypes.BOOL, desc: 'The first operand.', def: false },\n\t\t{ name: 'b', dt: core.datatypes.BOOL, desc: 'The second operand.', def: false } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: 'Emits true if <b>first</b> <i>and</i> <b>second</b> are true, and false otherwise.', def: false }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.conds = [ false, false ];\n\tthis.state = false;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.conds[slot.index] = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.state = this.conds[0] && this.conds[1];\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.state;\n};\n"
  },
  {
    "path": "browser/plugins/animate_float_on_trigger.plugin.js",
    "content": "(function() {\n\n\tvar AnimateFloatOnTrigger = E2.plugins.animate_float_on_trigger = function (core, node) {\n\t\tAbstractAnimateValueOnTriggerPlugin.apply(this, [core, node, E2.dt.FLOAT, function (a, b, f) {\n\t\t\treturn a + (b - a) * f\n\t\t}])\n\t}\n\n\tAnimateFloatOnTrigger.prototype = Object.create(AbstractAnimateValueOnTriggerPlugin.prototype)\n})()"
  },
  {
    "path": "browser/plugins/animate_vector3_on_trigger.plugin.js",
    "content": "(function() {\n\n\tvar AnimateVector3OnTrigger = E2.plugins.animate_vector3_on_trigger = function(core, node) {\n\t\tAbstractAnimateValueOnTriggerPlugin.apply(this, [core, node, E2.dt.VECTOR, function(a, b, f) {\n\t\t\treturn new THREE.Vector3(a.x, a.y, a.z).lerp(b, f)\n\t\t}])\n\t}\n\n\tAnimateVector3OnTrigger.prototype = Object.create(AbstractAnimateValueOnTriggerPlugin.prototype)\n\n})()\n"
  },
  {
    "path": "browser/plugins/annotation.plugin.js",
    "content": "(function(){\n\nvar Annotation = E2.plugins.annotation = function Annotation() {\n\tAbstractTextAreaPlugin.apply(this, arguments)\n\tthis.desc = 'Add textual hints to the graph.'\n\tthis.undoName = 'Annotation'\n\tthis.input_slots = []\n\tthis.output_slots = []\n}\n\nAnnotation.prototype = Object.create(AbstractTextAreaPlugin.prototype)\nAnnotation.prototype.constructor = Annotation\n\n})()\n"
  },
  {
    "path": "browser/plugins/array_blend_modulator_float.plugin.js",
    "content": "(function() {\n\tvar ArrayBlendFloat = E2.plugins.array_blend_modulator_float = function(core, node) {\n\t\tAbstractArrayBlendModulatorPlugin.apply(this, [core, node, E2.dt.FLOAT, function(a, b, f) {\n\t\t\treturn a + (b - a) * f\n\t\t}])\n\t}\n\n\tArrayBlendFloat.prototype = Object.create(AbstractArrayBlendModulatorPlugin.prototype)\n})()\n"
  },
  {
    "path": "browser/plugins/array_blend_modulator_vector3.plugin.js",
    "content": "(function() {\n\tvar ArrayBlendVector3 = E2.plugins.array_blend_modulator_vector3 = function(core, node) {\n\t\tAbstractArrayBlendModulatorPlugin.apply(this, [core, node, E2.dt.VECTOR, function(a, b, f) {\n\t\t\treturn new THREE.Vector3(a.x, a.y, a.z).lerp(b, f)\n\t\t}])\n\t}\n\n\tArrayBlendVector3.prototype = Object.create(AbstractArrayBlendModulatorPlugin.prototype)\n})()\n"
  },
  {
    "path": "browser/plugins/array_clear.plugin.js",
    "content": "var ArrayClearPlugin = E2.plugins.array_clear = function ArrayClearPlugin(core, node) {\n\tPlugin.apply(this, arguments)\n\n\tthis.desc = 'Empties given array'\n\n\tthis.input_slots = [\n\t\t{\tname: 'array',\n\t\t\tdt: E2.dt.ANY,\n\t\t\tarray: true,\n\t\t\tdesc: 'Optional array to change',\n\t\t\tdef: []\n\t\t},\n\t\t{\tname: 'clear',\n\t\t\tdt: core.datatypes.BOOL,\n\t\t\tdesc: 'A true signal here clears the array'\n\t\t},\n\t]\n\n\tthis.output_slots = [ {\n\t\t\tname: 'array',\n\t\t\tdt: E2.dt.ANY,\n\t\t\tarray: true,\n\t\t}\n\t]\n\n\tthis.lsg = new LinkedSlotGroup(core, node, \n\t\t[this.input_slots[0]],\n\t\t[this.output_slots[0]])\n\n\tthis.array = []\n\tthis.index = 0\n}\n\nArrayClearPlugin.prototype = Object.create(Plugin.prototype)\n\nArrayClearPlugin.prototype.reset = function() {}\n\nArrayClearPlugin.prototype.update_input = function(slot, data) {\n\tif (slot.index === 0) {\n\t\tthis.array = data ? data : this.array\n\t} else if (slot.index === 1) {\n\t\tif (data === true)\n\t\t\tthis.array = []\n\t}\n}\n\nArrayClearPlugin.prototype.update_output = function() {\n\treturn this.array\n}\n\nArrayClearPlugin.prototype.state_changed = function(ui) {\n\tif (ui)\n\t\treturn;\n\n\tthis.array = []\n\t\n\tthis.lsg.infer_dt()\n} \n"
  },
  {
    "path": "browser/plugins/array_function.plugin.js",
    "content": "(function() {\nvar ArrayFunctionPlugin = E2.plugins.array_function = function(core) {\n\tSubGraphPlugin.apply(this, arguments)\n\n\tthis.desc = 'Creates an array with the nested patch. '+\n\t\t'A local variable called <b>index<\\/b> is available to the patch in each iteration. '+\n\t\t'Each iteration should output its result to the <b>item<\\/b> local variable. '\n\n\tthis.input_slots = [{\n\t\tname: 'length', \n\t\tdt: core.datatypes.FLOAT, \n\t\tdesc: 'The length of the array to create.', \n\t\tdef: 0 \n\t}]\n\n\tthis.output_slots = [{\n\t\tname: 'array',\n\t\tarray: true, \n\t\tdt: core.datatypes.ANY, \n\t\tdesc: 'The array created by the function.',\n\t\tdef: 0\n\t}]\n\n\tthis.state = {\n\t\tinput_sids: {},\n\t\toutput_sids: {},\n\t\talways_update: true\n\t}\n\n\tthis.always_update = true\n\t\n\tthis.array = []\n}\n\nArrayFunctionPlugin.prototype = Object.create(SubGraphPlugin.prototype)\nArrayFunctionPlugin.prototype.constructor = ArrayFunctionPlugin\n\nArrayFunctionPlugin.prototype.drilldown = function() {\n\treturn NodeUI.drilldown(this);\n}\n\nArrayFunctionPlugin.prototype.update_input = function(slot, data) {\n\tif (!slot.dynamic) {\n\t\tif (slot.name === 'length') {\n\t\t\tthis.length = Math.floor(data)\n\t\t\tthis.array.length = this.length\n\t\t\tthis.refreshGraph()\n\t\t}\n\t} else {\n\t\tthis.input_nodes[slot.uid].plugin.input_updated(data)\n\t}\n}\n\nArrayFunctionPlugin.prototype.update_state = function(updateContext) {\n\tthis.updated = false\n\tthis.updated_sids.length = 0\n\n\tif (!this.graph)\n\t\treturn;\n\n\tvar updated = false\n\tthis.array = []\n\n\tfor(var i = 0; i < this.length; i++) {\n\t\tif (this.graph.copies[i].update(updateContext))\n\t\t\tupdated = true\n\n\t\tthis.array[i] = this.graph.copies[i].variables.read('item')\n\t}\n\n\tthis.updated = true\n\n\tthis.lastUpdateContext = updateContext\n\n\tif (updated && this === E2.app.player.core.active_graph)\n\t\tE2.app.updateCanvas(false)\n}\n\nArrayFunctionPlugin.prototype.variable_dt_changed = function(dt) {\n\tthis.output_slots[0].dt = dt\n\tthis.updated = true\n}\n\nArrayFunctionPlugin.prototype.update_output = function(slot) {\n\treturn this.array\n}\n\nArrayFunctionPlugin.prototype.refreshGraph = function() {\n\tif (!this.length)\n\t\treturn this.graph.clearCopies()\n\n\twhile(this.graph.copies.length < this.length) {\n\t\tvar graph = this.graph.makeCopy()\n\t\tgraph.variables.set_datatype('index', E2.core.datatypes.FLOAT)\n\t\tgraph.variables.write('index', this.graph.copies.length)\n\t\n\t\t// update graph once, for it to be immediately usable in the array\n\t\tif (this.lastUpdateContext)\n\t\t\tgraph.update(this.lastUpdateContext)\n\t}\n\n\twhile(this.graph.copies.length > this.length) {\n\t\tvar last = this.graph.copies.length - 1\n\t\tthis.graph.copies[last].destroy()\n\t\tthis.graph.copies.splice(last, 1)\n\t}\n}\n\nArrayFunctionPlugin.prototype.state_changed = function(ui) {\n\tvar core = this.core\n\tvar node = this.parent_node\n\n\tif (ui)\n\t\treturn\n\n\tthis.setupProxies()\n\n\tthis.length = 0\n\tthis.array = []\n\n\tthis.graph.variables.lock(this, 'item')\n\tthis.graph.variables.lock(this, 'index')\n\n\tthis.graph.variables.set_datatype('index', E2.core.datatypes.FLOAT)\n\n\tvar vdt = this.graph.variables.variables.item.dt\n\tif (vdt.id !== E2.dt.ANY.id)\n\t\tthis.graph.variables.set_datatype('item', vdt)\n}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/array_get.plugin.js",
    "content": "var ArrayGetPlugin = E2.plugins.array_get = function ArrayGetPlugin(core, node) {\n\tPlugin.apply(this, arguments)\n\n\tthis.input_slots = [\n\t\t{\n\t\t\tname: 'array',\n\t\t\tdt: E2.dt.ANY,\n\t\t\tarray: true,\n\t\t\tdesc: 'Optional array to change',\n\t\t\tdef: []\n\t\t},\n\t\t{\n\t\t\tname: 'index',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 0,\n\t\t\tdesc: 'Index for object in array'\n\t\t}\n\t]\n\n\tthis.output_slots = [ {\n\t\t\tname: 'item',\n\t\t\tdt: core.datatypes.ANY\n\t\t}\n\t]\n\n\tthis.lsg = new LinkedSlotGroup(core, node,\n\t\t[this.input_slots[0]], [this.output_slots[0]])\n\n\tthis.array = []\n}\n\nArrayGetPlugin.prototype = Object.create(Plugin.prototype)\n\nArrayGetPlugin.prototype.reset = function() {\n\tthis.item = this.lsg.infer_dt()\n\tthis.output_slots[0].array = false\n}\n\nArrayGetPlugin.prototype.connection_changed = function(on, conn, slot) {\n\tif (this.lsg.connection_changed(on, conn, slot))\n\t\tthis.array = this.lsg.core.get_default_value(this.lsg.dt)\n\n\tthis.output_slots[0].array = false\n}\n\nArrayGetPlugin.prototype.update_input = function(slot, data) {\n\tif (slot.index === 0) {\n\t\tif (data && data.length)\n\t\t\tthis.array = data\n\t} else if (slot.index === 1) {\n\t\tthis.item = this.array[data]\n\t}\n}\n\nArrayGetPlugin.prototype.update_output = function() {\n\treturn this.item\n}\n\nArrayGetPlugin.prototype.state_changed = function(ui) {\n\tif (ui)\n\t\treturn;\n\n\tthis.array = []\n\t\n\tthis.lsg.infer_dt()\n\tthis.output_slots[0].array = false\n} \n"
  },
  {
    "path": "browser/plugins/array_length.plugin.js",
    "content": "var ArrayLengthPlugin = E2.plugins.array_length = function ArrayLengthPlugin(core) {\n\tthis.input_slots = [\n\t\t{\n\t\t\tname: 'array',\n\t\t\tdt: E2.dt.ANY,\n\t\t\tarray: true,\n\t\t\tdef: []\n\t\t},\n\t]\n\n\tthis.output_slots = [ {\n\t\t\tname: 'length',\n\t\t\tdt: core.datatypes.FLOAT\n\t\t}\n\t]\n\n\tthis.length = 0\n}\n\nArrayLengthPlugin.prototype.connection_changed = function(on, conn, slot) {\n\tif (slot.type !== E2.slot_type.input)\n\t\treturn;\n\n\tif (on)\n\t\tthis.input_slots[0].dt = conn.src_slot.dt\n\telse\n\t\tthis.input_slots[0].dt = E2.dt.ANY\n}\n\nArrayLengthPlugin.prototype.reset = function() {\n\tthis.length = 0\n}\n\nArrayLengthPlugin.prototype.update_input = function(slot, data) {\n\tthis.length = data ? data.length : 0\n}\n\nArrayLengthPlugin.prototype.update_output = function() {\n\treturn this.length\n}\n"
  },
  {
    "path": "browser/plugins/array_remove.plugin.js",
    "content": "var ArrayRemovePlugin = E2.plugins.array_remove = function ArrayRemovePlugin(core, node) {\n\tPlugin.apply(this, arguments)\n\n\tthis.input_slots = [\n\t\t{\n\t\t\tname: 'array',\n\t\t\tdt: E2.dt.ANY,\n\t\t\tarray: true,\n\t\t\tdesc: 'Optional array to change',\n\t\t\tdef: []\n\t\t},\n\t\t{\n\t\t\tname: 'index',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 0,\n\t\t\tdesc: 'Index for object in array'\n\t\t}\n\t]\n\n\tthis.output_slots = [ {\n\t\t\tname: 'array',\n\t\t\tdt: E2.dt.ANY,\n\t\t\tarray: true,\n\t\t}\n\t]\n\n\tthis.lsg = new LinkedSlotGroup(core, node, [this.input_slots[0]], [this.output_slots[0]])\n\n\tthis.array = []\n}\n\nArrayRemovePlugin.prototype = Object.create(Plugin.prototype)\n\nArrayRemovePlugin.prototype.reset = function() {\n\tthis.array = this.lsg.infer_dt()\n}\n\nArrayRemovePlugin.prototype.connection_changed = function(on, conn, slot) {\n\tconsole.log('ArrayRemovePlugin.connection_changed')\n\tif (this.lsg.connection_changed(on, conn, slot))\n\t\tthis.array = this.lsg.core.get_default_value(this.lsg.dt)\n}\n\nArrayRemovePlugin.prototype.update_input = function(slot, data) {\n\tconsole.log('ArrayRemovePlugin.update_input', slot.index, data)\n\tif (slot.index === 0) {\n\t\tif (data && data.length)\n\t\t\tthis.array = data\n\t} else if (slot.index === 1) {\n\t\tthis.array.splice(data, 1)\n\t}\n}\n\nArrayRemovePlugin.prototype.update_output = function() {\n\treturn this.array\n}\n\nArrayRemovePlugin.prototype.state_changed = function(ui) {\n\tif (ui)\n\t\treturn;\n\n\tthis.array = []\n\t\n\tthis.lsg.infer_dt()\n} \n"
  },
  {
    "path": "browser/plugins/array_set.plugin.js",
    "content": "var ArraySetPlugin = E2.plugins.array_set = function ArraySetPlugin(core, node) {\n\tPlugin.apply(this, arguments)\n\n\tthis.input_slots = [\n\t\t{\tname: 'array',\n\t\t\tdt: E2.dt.ANY,\n\t\t\tarray: true,\n\t\t\tdesc: 'Optional array to change',\n\t\t\tdef: []\n\t\t},\n\t\t{\tname: 'index',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 0,\n\t\t\tdesc: 'Index for object in array'\n\t\t},\n\t\t{\tname: 'item',\n\t\t\tdt: core.datatypes.ANY,\n\t\t\tdesc: 'Item to set in array at index'\n\t\t},\n\t]\n\n\tthis.output_slots = [ {\n\t\t\tname: 'array',\n\t\t\tdt: E2.dt.ANY,\n\t\t\tarray: true,\n\t\t}\n\t]\n\n\tthis.lsg = new LinkedSlotGroup(core, node, \n\t\t[this.input_slots[0]],\n\t\t[this.output_slots[0]])\n\n\tthis.array = []\n\tthis.index = 0\n}\n\nArraySetPlugin.prototype = Object.create(Plugin.prototype)\n\nArraySetPlugin.prototype.reset = function() {\n\tthis.index = 0\n}\n\nArraySetPlugin.prototype.connection_changed = function(on, conn, slot) {\n\tif (slot.name === 'item') {\n\t\tslot.dt = conn.src_slot.dt\n\t\treturn this.lsg.set_dt(conn.src_slot.dt)\n\t}\n\n\tif (this.lsg.connection_changed(on, conn, slot))\n\t\tthis.array = []\n}\n\nArraySetPlugin.prototype.update_input = function(slot, data) {\n\tif (!data)\n\t\treturn;\n\n\tconsole.log('Set update_input', slot.name, data, this.array.length)\n\n\tif (slot.name === 'array') {\n\t\tthis.array = data ? data : this.array\n\t} else if (slot.name === 'index') {\n\t\tconsole.log('set index to', data)\n\t\tthis.index = data\n\t} else {\n\t\tconsole.log('ArraySetPlugin.update_input', this.index, data.length ? data[0] : data, this.array)\n\t\tthis.array[this.index] = data.constructor === Array ? data[0] : data\n\t}\n}\n\nArraySetPlugin.prototype.update_output = function() {\n\treturn this.array\n}\n\nArraySetPlugin.prototype.state_changed = function(ui) {\n\tif (ui)\n\t\treturn;\n\n\tthis.array = []\n\t\n\tthis.lsg.infer_dt()\n} \n"
  },
  {
    "path": "browser/plugins/array_switch_modulator.plugin.js",
    "content": "/*\n\n\"Make an Array plugin with dynamic number of ANY datatype inputs, \n and an index input that changes the current output value of the plugin.\n\ninputs: number, 0, 1, 2, 3, ... \noutputs: output, length\nEg. feed in 8 images, and alternate between the images with number\"\n\nhttps://github.com/vizorvr/vizor-create/issues/31\n\n*/\n\n(function() {\n\nvar ArraySwitch = E2.plugins.array_switch_modulator = function ArraySwitch(core, node) {\n\tvar that = this\n\t\n\tthis.desc = 'Revolver style array switch. Set up n inputs, then choose which one to output.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'number', dt: E2.dt.FLOAT, desc: 'Input number to select for output.', def: 0 }\n\t]\n\t\n\tthis.output_slots = [\n\t\t{ name: 'value', dt: E2.dt.ANY, desc: 'Emits the selected input.' },\n\t\t{ name: 'length', dt: E2.dt.FLOAT, desc: 'Emits the number of inputs = the length of the array.' }\n\t]\n\n\tthis.core = core\n\tthis.node = node\n\tthis.lsg = new LinkedSlotGroup(core, node, [], [this.output_slots[0]])\n\n\tthis.number = 0\n\tthis.values = []\n\n\tthis.node.on('slotAdded', function() {\n\t\tthat.dynInputs = node.getDynamicInputSlots()\n\t\tthat.updated = true\n\t})\n\n\tthis.node.on('slotRemoved', function() {\n\t\tthat.dynInputs = node.getDynamicInputSlots()\n\t\tthat.updated = true\n\t})\n}\n\nArraySwitch.prototype.create_ui = function() {\n\tvar that = this\n\tvar layout = make('div')\n\tvar removeButton = makeButton('Remove', 'Click to remove the last input.')\n\tvar addButton = makeButton('Add', 'Click to add another input.')\n\t\n\tremoveButton.css('width', '65px')\n\taddButton.css({ 'width': '65px', 'margin-top': '5px' })\n\t\n\taddButton.click(function() {\n\t\tE2.app.graphApi.addSlot(that.node.parent_graph, that.node, {\n\t\t\ttype: E2.slot_type.input,\n\t\t\tname: that.dynInputs.length + '',\n\t\t\tdt: that.lsg.dt\n\t\t})\n\t})\n\n\tremoveButton.click(function() {\n\t\tvar inputs = that.dynInputs\n\t\tif (!inputs)\n\t\t\treturn\n\n\t\tvar suid = inputs[inputs.length - 1].uid\n\t\tE2.app.graphApi.removeSlot(that.node.parent_graph, that.node, suid)\n\t})\n\n\tlayout.append(removeButton, '<br />', addButton);\n\t\n\treturn layout\n}\n\nArraySwitch.prototype.update_input = function(slot, data) {\n\tif (slot.uid === undefined) {\n\t\tif (slot.index === 0) {\n\t\t\tvar n = Math.floor(data)\n\t\t\tif (this.number !== n) {\n\t\t\t\tthis.number = n\n\t\t\t}\n\n\t\t\tfor (var i=0; i < this.dynInputs.length; i++)\n\t\t\t\tthis.dynInputs[i].inactive = (i !== this.number)\n\n\t\t\treturn\n\t\t}\n\t} else { // dynamic slot\n\t\tthis.values[slot.index] = data\n\t}\n}\n\nArraySwitch.prototype.update_state = function() {\n\tif (this.number >= this.values.length) {\n\t\tthis.updated = (this.value !== undefined)\n\t\tthis.value = undefined\n\t\treturn\n\t}\n\n\tif (this.value !== this.values[this.number]) {\n\t\tthis.value = this.values[this.number]\n\t\tthis.updated = true\n\t}\n\telse {\n\t\tthis.updated = false\n\t}\n}\n\nArraySwitch.prototype.update_output = function(slot) {\n\tif (slot.index === 1)\n\t\treturn this.dynInputs.length\n\n\tif (this.value !== undefined)\n\t\treturn this.value\n\n\tvar def = this.core.get_default_value(this.lsg.dt)\n\n\treturn def\n}\n\nArraySwitch.prototype.connection_changed = function(on, conn, slot) {\n\tif (this.lsg.connection_changed(on, conn, slot))\n\t\tthis.value = this.lsg.core.get_default_value(this.lsg.dt)\n}\n\nArraySwitch.prototype.state_changed = function(ui) {\n\tif (!ui) {\n\t\tvar slots = this.dynInputs = this.node.getDynamicInputSlots()\n\n\t\tfor(var i = 0, len = slots.length; i < len; i++) {\n\t\t\tthis.lsg.add_dyn_slot(slots[i])\n\t\t\tslots[i].inactive = false\n\t\t}\n\t\t\n\t\tthis.number = 0\n\t\tthis.value = this.lsg.infer_dt()\n\t}\n};\n\n\n})();\n\n"
  },
  {
    "path": "browser/plugins/aspect_ratio_generator.plugin.js",
    "content": "E2.p = E2.plugins[\"aspect_ratio_generator\"] = function(core, node)\n{\n\tthis.desc = 'Emits current renderer aspect ratio (width / height).';\n\t\n\tthis.input_slots = [];\n\t\n\tthis.output_slots = [ { name: 'aspect', dt: core.datatypes.FLOAT, desc: 'The current renderer aspect ratio.' } ];\n\t\n\tthis.core = core;\n\tthis.canvas = E2.dom.webgl_canvas[0];\n\tthis.delegate = this._onResize.bind(this);\n\t\n\tthis.core.on('resize', this.delegate);\n};\n\nE2.p.prototype.reset = function()\n{\n};\n\nE2.p.prototype.destroy = function(slot)\n{\n\tthis.core.off('resize', this.delegate);\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.canvas.width / this.canvas.height;\n};\n\nE2.p.prototype._onResize = function()\n{\n\tthis.updated = true;\n};\n"
  },
  {
    "path": "browser/plugins/atan2_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"atan2_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Atan2(x, y).';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'x value', dt: core.datatypes.FLOAT, desc: 'X value.', def: 0.0 },\n\t\t{ name: 'y value', dt: core.datatypes.FLOAT, desc: 'Y value.', def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'result', dt: core.datatypes.FLOAT, desc: 'atan(<b>x</b>,<b>y</b>).', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.x_value = 0.0;\n\tthis.y_value = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n  if (slot.index === 0)\n\t  this.x_value = data;\n  else\n    this.y_value = data;\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n  this.value = Math.atan2(this.x_value, this.y_value);\n\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/atan_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"atan_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Atan(x).';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'x value', dt: core.datatypes.FLOAT, desc: 'X value.', def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'result', dt: core.datatypes.FLOAT, desc: 'atan(<b>x</b>).', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n  this.value = Math.atan(data);\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/audio_ambisonic_buffermerger.plugin.js",
    "content": "(function(){\r\n\r\nvar AmbisonicBufferMerger = E2.plugins.audio_ambisonic_buffermerger = function(core, node) {\r\n    Plugin.apply(this, arguments)\r\n\r\n    // Describe plugin and inputs/outputs\r\n    var self = this;\r\n    this.desc = 'Decode an ambisonic spherical recording to headphones.';\r\n    this.input_slots = [\r\n                    { name: 'buffer1',\r\n                    dt: core.datatypes.OBJECT,\r\n                    desc: 'The first 8ch audio buffer.',\r\n                    def: null },\r\n                    { name: 'buffer2',\r\n                    dt: core.datatypes.OBJECT,\r\n                    desc: 'The second 8ch audio buffer.',\r\n                    def: null },\r\n                    { name: 'filetype',\r\n                    dt: core.datatypes.FLOAT,\r\n                    desc: 'Audio file format: 0:WAV, 1:OGG.',\r\n                    def: null }\r\n                        ];\r\n    this.output_slots = [\r\n                { name: 'buffer12',\r\n                  dt: core.datatypes.OBJECT,\r\n                  desc: 'The 16ch combined buffer.' }\r\n                ];\r\n\r\n    // internal vars\r\n    this.context = core.audioContext;\r\n    this.filetype = null;\r\n    this.buffer1 = null;\r\n    this.buffer2 = null;\r\n    this.buffer12 = null;\r\n \r\n    this.first = true;\r\n};\r\n\r\nAmbisonicBufferMerger.prototype = Object.create(Plugin.prototype);\r\n\r\n\r\nAmbisonicBufferMerger.prototype.reset = function() {\r\n    this.first = true;\r\n};\r\n \r\n \r\nAmbisonicBufferMerger.prototype.update_input = function(slot, data) {\r\n    switch(slot.name) {\r\n        case 'buffer1':\r\n            this.buffer1 = data;\r\n            if (data && this.buffer2) {\r\n                this.buffer12 = this.mergeBuffers(data, this.buffer2, this.filetype);\r\n                console.log('Buffer 1 updated.');\r\n            }\r\n            break;\r\n        case 'buffer2':\r\n            this.buffer2 = data;\r\n            if (data && this.buffer1) {\r\n                this.buffer12 = this.mergeBuffers(this.buffer1, data, this.filetype);\r\n                console.log('Buffer 2 updated.');\r\n            }\r\n            break;\r\n        case 'filetype':\r\n            switch(data) {\r\n                case 0:\r\n                    this.filetype = \"wav\";\r\n                    console.log('Channel mapping during loading set for WAV files.');\r\n                    break;\r\n                case 1:\r\n                    this.filetype = \"ogg\";\r\n                    console.log('Channel mapping during loading set for OGG files.');\r\n                }\r\n    }\r\n};\r\n \r\n \r\nAmbisonicBufferMerger.prototype.update_output = function(slot) {\r\n    return this.buffer12;\r\n};\r\n \r\nAmbisonicBufferMerger.prototype.update_state = function() {\r\n    this.first = false;\r\n};\r\n\r\nAmbisonicBufferMerger.prototype.mergeBuffers = function(buffer1, buffer2, filetype) {\r\n    var srate1 = buffer1.sampleRate;\r\n    var srate2 = buffer2.sampleRate;\r\n    if (srate1 == srate2) {\r\n        var nCh1 = buffer1.numberOfChannels;\r\n        var nCh2 = buffer2.numberOfChannels;\r\n        var length = buffer1.length;\r\n        length = Math.max(length, buffer2.length);\r\n \r\n        // If the 8-ch audio file is OGG, then remap 8-channel files to the correct\r\n        // order cause Chrome and Firefox messes it up when loading. Other browsers have not\r\n        // been tested with OGG files. 8ch Wave files work fine for both browsers.\r\n        var remap8ChanFile = [1,2,3,4,5,6,7,8];\r\n        if (filetype == \"wav\") {\r\n             console.log(\"WAV file channel mapping: [1,2,3,4,5,6,7,8]\");\r\n        } // normal for wav\r\n        else if (filetype == \"ogg\") {\r\n             console.log(\"OFF file channel mapping: [1,3,2,7,8,5,6,4]\");\r\n             remap8ChanFile = [1,3,2,7,8,5,6,4];\r\n             //remap8ChanFile = [1,3,2,8,6,7,4,5];\r\n        }\r\n \r\n        var buffer12 = this.context.createBuffer(nCh1+nCh2, length, srate1);\r\n        for (var j = 0; j < nCh1; j++) {\r\n            buffer12.getChannelData(j).set(buffer1.getChannelData(remap8ChanFile[j]-1));\r\n        }\r\n        for (var j = 0; j < nCh2; j++) {\r\n            buffer12.getChannelData(nCh1+j).set(buffer2.getChannelData(remap8ChanFile[j]-1));\r\n        }\r\n        return buffer12;\r\n    }\r\n};\r\n \r\n})();\r\n \r\n"
  },
  {
    "path": "browser/plugins/audio_ambisonic_foaconverter.plugin.js",
    "content": "(function(){\r\n\r\nvar AmbisonicConverterPlugin = E2.plugins.audio_ambisonic_foaconverter = function(core, node) {\r\n    Plugin.apply(this, arguments)\r\n\r\n    // Describe plugin and inputs/outputs\r\n    var self = this;\r\n    this.desc = 'Decode an ambisonic spherical recording to headphones.';\r\n    this.input_slots = [\r\n                    { name: 'audio_in',\r\n                    dt: core.datatypes.OBJECT,\r\n                    desc: 'A 4-channel B-format audio stream to convert.',\r\n                    def: null },\r\n                    { name: 'convention',\r\n                    dt: core.datatypes.FLOAT,\r\n                    desc: 'Ambisonic convention: 0:ACN/N3D, 1:WXYZ/FuMa, 2:ACN/SN3D, .',\r\n                    def: null }\r\n                     ];\r\n    this.output_slots = [\r\n                { name: 'audio_out',\r\n                  dt: core.datatypes.OBJECT,\r\n                  desc: 'A converted 4-channel B-format audio stream.' }\r\n                ];\r\n    // Load external library\r\n    core.add_aux_script('ambisonics/ambisonics.umd.js')\r\n    .then(function() {\r\n\r\n        // Initialize ambisonic nodes\r\n        console.log(ambisonics);\r\n        self.converter_node1 = core.audioContext ? new ambisonics.converters.wxyz2acn(core.audioContext) : null;\r\n        self.converter_node2 = core.audioContext ? new ambisonics.converters.sn3d2n3d(core.audioContext, 1) : null;\r\n          \r\n    })\r\n    .catch(function(err) {\r\n        console.error(err.stack)\r\n    });\r\n\r\n    // internal vars\r\n    this.src = null;\r\n    this.convention = 0;\r\n    this.conventionChanged = true;\r\n    this.out_node = null;\r\n \r\n    this.first = true;\r\n\r\n};\r\n \r\nAmbisonicConverterPlugin.prototype = Object.create(Plugin.prototype);\r\n\r\n\r\nAmbisonicConverterPlugin.prototype.reset = function() {\r\n    this.first = true;\r\n};\r\n \r\n \r\nAmbisonicConverterPlugin.prototype.update_input = function(slot, data) {\r\n    switch(slot.name) {\r\n        case 'audio_in':\r\n            if (this.src) this.src.disconnect(0);\r\n            this.src = data;\r\n            this.update_connections();\r\n        case 'convention':\r\n            if (data!=this.convention) {\r\n                switch(data) {\r\n                    case 0:\r\n                        this.convention = 0;\r\n                        this.conventionChanged = true;\r\n                        break;\r\n                    case 1:\r\n                        this.convention = 1;\r\n                        this.conventionChanged = true;\r\n                        break;\r\n                    case 2:\r\n                        this.convention = 2;\r\n                        this.conventionChanged = true;\r\n                }\r\n            }\r\n    }\r\n};\r\n \r\n \r\nAmbisonicConverterPlugin.prototype.update_output = function(slot) {\r\n    return this.out_node;\r\n};\r\n \r\n \r\nAmbisonicConverterPlugin.prototype.update_state = function() {\r\n    this.first = false;\r\n    if (this.src) {\r\n        if (this.conventionChanged) {\r\n            this.update_connections();\r\n            this.connectionChanged = false;\r\n        }\r\n    }\r\n};\r\n \r\nAmbisonicConverterPlugin.prototype.update_connections = function() {\r\n    this.src.disconnect(0);\r\n    switch(this.convention) {\r\n        case 0:\r\n            this.out_node = this.src;\r\n            console.log('Ambiconverter: Convention ACN/N3D (MPEG-H)')\r\n            break;\r\n        case 1:\r\n            this.src.connect(this.converter_node1.in);\r\n            this.out_node = this.converter_node1.out;\r\n            this.out_node.player = this.src.player;\r\n            console.log('Ambiconverter: Convention WXYZ/FuMa (traditional, Soundfield)')\r\n            break;\r\n        case 2:\r\n            this.src.connect(this.converter_node2.in);\r\n            this.out_node = this.converter_node2.out;\r\n            this.out_node.player = this.src.player;\r\n            console.log('Ambiconverter: Convention ACN/SN3D (ambiX, Youtube)')\r\n    }\r\n};\r\n \r\n})();\r\n \r\n"
  },
  {
    "path": "browser/plugins/audio_ambisonic_foadecoder.plugin.js",
    "content": "(function(){\r\n\r\nvar AmbisonicDecoderPlugin = E2.plugins.audio_ambisonic_foadecoder = function(core, node) {\r\n    Plugin.apply(this, arguments)\r\n\r\n    // Describe plugin and inputs/outputs\r\n    var self = this;\r\n    this.desc = 'Decode an ambisonic spherical recording to headphones.';\r\n    this.input_slots = [\r\n                    { name: 'audio_in',\r\n                    dt: core.datatypes.OBJECT,\r\n                    desc: 'A 4-channel B-format audio stream to decode.',\r\n                    def: null },\r\n                    { name: 'buffer',\r\n                    dt: core.datatypes.OBJECT,\r\n                    desc: 'A 4-channel audio buffer containing binaural decoding filters.',\r\n                    def: null }\r\n                     ];\r\n    this.output_slots = [\r\n                { name: 'audio_out',\r\n                  dt: core.datatypes.OBJECT,\r\n                  desc: 'A 2-channel binaural audio stream for headphones.' }\r\n                ];\r\n    // Load external library\r\n    core.add_aux_script('ambisonics/ambisonics.umd.js')\r\n    .then(function() {\r\n\r\n        // Initialize ambisonic nodes\r\n        console.log(ambisonics);\r\n        self.decoder_node = core.audioContext ? new ambisonics.binDecoder(core.audioContext, 1) : null;\r\n    })\r\n    .catch(function(err) {\r\n        console.error(err.stack)\r\n    });\r\n\r\n    // internal vars\r\n    this.src = null;\r\n    this.buffer = null;\r\n \r\n    this.first = true;\r\n\r\n};\r\n\r\nAmbisonicDecoderPlugin.prototype = Object.create(Plugin.prototype);\r\n\r\n\r\nAmbisonicDecoderPlugin.prototype.reset = function() {\r\n    this.first = true;\r\n};\r\n \r\n \r\nAmbisonicDecoderPlugin.prototype.update_input = function(slot, data) {\r\n    switch(slot.name) {\r\n        case 'audio_in':\r\n            if (this.src) this.src.disconnect(0);\r\n            this.src = data;\r\n            if (data) {\r\n                this.src.connect(this.decoder_node.in);\r\n                this.decoder_node.out.player = data.player;\r\n            }\r\n            break;\r\n        case 'buffer':\r\n            this.buffer = data;\r\n            if (data) {\r\n                this.decoder_node.updateFilters(data);\r\n                console.log('AmbiDecoder: Decoding filters updated');\r\n            }\r\n    }\r\n};\r\n \r\n \r\nAmbisonicDecoderPlugin.prototype.update_output = function(slot) {\r\n    return this.decoder_node.out;\r\n};\r\n \r\n \r\nAmbisonicDecoderPlugin.prototype.update_state = function() {\r\n    this.first = false;\r\n};\r\n \r\n})();\r\n \r\n"
  },
  {
    "path": "browser/plugins/audio_ambisonic_foaencoder.plugin.js",
    "content": "(function(){\r\n\r\nvar AmbisonicEncoderPlugin = E2.plugins.audio_ambisonic_foaencoder = function(core, node) {\r\n    Plugin.apply(this, arguments)\r\n\r\n    // Describe plugin and inputs/outputs\r\n    var self = this;\r\n    this.desc = 'Encode a monophonic sound to an ambisonic 4-channel B-format stream.';\r\n    this.input_slots = [\r\n                    { name: 'audio_in',\r\n                    dt: core.datatypes.OBJECT,\r\n                    desc: 'A mono audio stream to encode.',\r\n                    def: null },\r\n                    { name: 'direction',\r\n                    dt: core.datatypes.VECTOR,\r\n                    desc: 'Direction vector.',\r\n                    def: core.renderer.vector_origin }\r\n                     ];\r\n    this.output_slots = [\r\n                { name: 'audio_out',\r\n                  dt: core.datatypes.OBJECT,\r\n                  desc: 'A 4-channel FOA audio stream.' }\r\n                ];\r\n    // Load external library\r\n    core.add_aux_script('ambisonics/ambisonics.umd.js')\r\n    .then(function() {\r\n\r\n        // Initialize ambisonic nodes\r\n        console.log(ambisonics);\r\n        self.encoder_node = core.audioContext ? new ambisonics.monoEncoder(core.audioContext, 1) : null;\r\n    })\r\n    .catch(function(err) {\r\n        console.error(err.stack)\r\n    });\r\n\r\n    // internal vars\r\n    this.src = null;\r\n    this.direction = null;\r\n    this.first = true;\r\n\r\n};\r\n \r\nAmbisonicEncoderPlugin.prototype = Object.create(Plugin.prototype);\r\n\r\n \r\nAmbisonicEncoderPlugin.prototype.reset = function() {\r\n    this.first = true;\r\n};\r\n \r\n \r\nAmbisonicEncoderPlugin.prototype.update_input = function(slot, data) {\r\n    switch(slot.name) {\r\n        case 'audio_in':\r\n            if (this.src) this.src.disconnect(0);\r\n            this.src = data;\r\n            if (data) {\r\n                this.src.connect(this.encoder_node.in);\r\n                this.encoder_node.out.player = this.src.player;\r\n            }\r\n            break;\r\n        case 'direction':\r\n                this.direction = data;\r\n                if (data) this.direction.normalize();\r\n    }\r\n};\r\n \r\n \r\nAmbisonicEncoderPlugin.prototype.update_output = function(slot) {\r\n    return this.encoder_node.out;\r\n};\r\n \r\n \r\nAmbisonicEncoderPlugin.prototype.update_state = function() {\r\n    var self = this;\r\n    function cart2sph() {\r\n        var azim, elev, azimElev;\r\n        azim = Math.atan2(self.direction.y, self.direction.x)*180/Math.PI;\r\n        elev = Math.atan2(self.direction.z, Math.sqrt(self.direction.y*self.direction.y + self.direction.x*self.direction.x))*180/Math.PI;\r\n        azimElev = [azim, elev];\r\n//        console.log(azimElev)\r\n        return azimElev;\r\n    }\r\n    if (this.direction !== null) {\r\n        var azimElev = cart2sph();\r\n        this.encoder_node.azim = azimElev[0];\r\n        this.encoder_node.elev = azimElev[1];\r\n        this.encoder_node.updateGains();\r\n    }\r\n    this.first = false;\r\n};\r\n \r\n})();\r\n \r\n"
  },
  {
    "path": "browser/plugins/audio_ambisonic_foamirror.plugin.js",
    "content": "(function(){\r\n\r\nvar AmbisonicMirrorPlugin = E2.plugins.audio_ambisonic_foamirror = function(core, node) {\r\n    Plugin.apply(this, arguments)\r\n\r\n    // Describe plugin and inputs/outputs\r\n    var self = this;\r\n    this.desc = 'Mirror an ambisonic spherical recording across the principal planes.';\r\n    this.input_slots = [\r\n                    { name: 'audio_in',\r\n                    dt: core.datatypes.OBJECT,\r\n                    desc: 'A 4-channel B-format audio stream.',\r\n                    def: null },\r\n                    { name: 'mirror_plane',\r\n                    dt: core.datatypes.FLOAT,\r\n                    desc: 'Plane to mirror: 0:None, 1:Front-Back, 2:Left-Right, 3:Up-Down.',\r\n                    def: null }\r\n                     ];\r\n    this.output_slots = [\r\n                { name: 'audio_out',\r\n                  dt: core.datatypes.OBJECT,\r\n                  desc: 'A mirrored 4-channel B-format audio stream.' }\r\n                ];\r\n    // Load external library\r\n    core.add_aux_script('ambisonics/ambisonics.umd.js')\r\n    .then(function() {\r\n        // Initialize ambisonic nodes\r\n        console.log(ambisonics);\r\n        self.mirror_node = core.audioContext ? new ambisonics.sceneMirror(core.audioContext, 1) : null;\r\n    })\r\n    .catch(function(err) {\r\n        console.error(err.stack)\r\n    });\r\n\r\n    // internal vars\r\n    this.src = null;\r\n    this.mirror_plane = 0;\r\n \r\n    this.first = true;\r\n\r\n};\r\n \r\nAmbisonicMirrorPlugin.prototype = Object.create(Plugin.prototype);\r\n\r\n\r\nAmbisonicMirrorPlugin.prototype.reset = function() {\r\n    this.first = true;\r\n};\r\n \r\n \r\nAmbisonicMirrorPlugin.prototype.update_input = function(slot, data) {\r\n    switch(slot.name) {\r\n        case 'audio_in':\r\n            if (this.src) this.src.disconnect(0);\r\n            this.src = data;\r\n            if (data) {\r\n                this.src.connect(this.mirror_node.in);\r\n                this.mirror_node.out.player = data.player;\r\n            }\r\n            break;\r\n        case 'mirror_plane':\r\n                switch(data) {\r\n                    case 0:\r\n                        this.mirror_plane = 0;\r\n                        break;\r\n                    case 1:\r\n                        this.mirror_plane = 1;\r\n                        break;\r\n                    case 2:\r\n                        this.mirror_plane = 2;\r\n                        break;\r\n                    case 3:\r\n                        this.mirror_plane = 3;\r\n\r\n                }\r\n    }\r\n};\r\n \r\n \r\nAmbisonicMirrorPlugin.prototype.update_output = function(slot) {\r\n    return this.mirror_node.out;\r\n};\r\n \r\n \r\nAmbisonicMirrorPlugin.prototype.update_state = function() {\r\n    if (this.mirror_plane!=this.mirror_node.mirrorPlane) {\r\n        this.mirror_node.mirror(this.mirror_plane);\r\n            switch(this.mirror_plane) {\r\n                case 0:\r\n                console.log('AmbiMirror: No mirroring');\r\n                break;\r\n                case 1:\r\n                console.log('AmbiMirror: Front-back mirroring');\r\n                break;\r\n                case 2:\r\n                console.log('AmbiMirror: Left-right mirroring');\r\n                break;\r\n                case 3:\r\n                console.log('AmbiMirror: Up-down mirroring');\r\n        }\r\n \r\n    }\r\n    this.first = false;\r\n};\r\n \r\n})();\r\n \r\n"
  },
  {
    "path": "browser/plugins/audio_ambisonic_foarotator.plugin.js",
    "content": "(function(){\r\n\r\nvar AmbisonicRotatorPlugin = E2.plugins.audio_ambisonic_foarotator = function(core, node) {\r\n    Plugin.apply(this, arguments)\r\n\r\n    // Describe plugin and inputs/outputs\r\n    var self = this;\r\n    this.desc = 'Rotate an ambisonic spherical recording.';\r\n    this.input_slots = [\r\n                    { name: 'audio_in',\r\n                    dt: core.datatypes.OBJECT,\r\n                    desc: 'A 4-channel B-format audio stream to rotate.',\r\n                    def: null },\r\n                    { name: 'rotation',\r\n                    dt: core.datatypes.VECTOR,\r\n                    desc: 'Head/camera rotation.',\r\n                    def: core.renderer.vector_origin }\r\n                     ];\r\n    this.output_slots = [\r\n                { name: 'audio_out',\r\n                  dt: core.datatypes.OBJECT,\r\n                  desc: 'A rotated 4-channel B-format audio stream.' }\r\n                ];\r\n    // Load external library\r\n    core.add_aux_script('ambisonics/ambisonics.umd.js')\r\n    .then(function() {\r\n\r\n        // Initialize ambisonic nodes\r\n        console.log(ambisonics);\r\n        self.rotator_node = core.audioContext ? new ambisonics.sceneRotator(core.audioContext, 1) : null;\r\n    })\r\n    .catch(function(err) {\r\n        console.error(err.stack)\r\n    });\r\n\r\n    // internal vars\r\n    this.src = null;\r\n    this.rotation = new THREE.Vector3(0, 0, 0);\r\n \r\n    this.first = true;\r\n\r\n};\r\n \r\nAmbisonicRotatorPlugin.prototype = Object.create(Plugin.prototype);\r\n\r\n\r\nAmbisonicRotatorPlugin.prototype.reset = function() {\r\n    this.first = true;\r\n};\r\n \r\n \r\nAmbisonicRotatorPlugin.prototype.update_input = function(slot, data) {\r\n    switch(slot.name) {\r\n        case 'audio_in':\r\n            if (this.src) this.src.disconnect(0);\r\n            this.src = data;\r\n            if (data) {\r\n                this.src.connect(this.rotator_node.in);\r\n                this.rotator_node.out.player = data.player;\r\n            }\r\n            break;\r\n        case 'rotation':\r\n            if (data) this.rotation = data;\r\n    }\r\n};\r\n \r\n \r\nAmbisonicRotatorPlugin.prototype.update_output = function(slot) {\r\n    return this.rotator_node.out;\r\n};\r\n \r\n \r\nAmbisonicRotatorPlugin.prototype.update_state = function() {\r\n    var self = this;\r\n    function getCamera2AmbisonicRot() {\r\n        var yaw, pitch, roll, rotAngles;\r\n        yaw = self.rotation.y*180/Math.PI;\r\n        pitch = -self.rotation.x*180/Math.PI;\r\n        roll = -self.rotation.z*180/Math.PI;\r\n        rotAngles = [yaw, pitch, roll];\r\n        //        console.log(rotAngles)\r\n        return rotAngles;\r\n    }\r\n    if (this.rotation !== null) {\r\n        var rotAngles = getCamera2AmbisonicRot();\r\n        this.rotator_node.yaw = rotAngles[0];\r\n        this.rotator_node.pitch = rotAngles[1];\r\n        this.rotator_node.roll = rotAngles[2];\r\n        this.rotator_node.updateRotMtx();\r\n    }\r\n    this.first = false;\r\n};\r\n \r\n})();\r\n \r\n"
  },
  {
    "path": "browser/plugins/audio_ambisonic_foavmic.plugin.js",
    "content": "(function(){\r\n\r\nvar AmbisonicVmicPlugin = E2.plugins.audio_ambisonic_foavmic = function(core, node) {\r\n    Plugin.apply(this, arguments)\r\n\r\n    // Describe plugin and inputs/outputs\r\n    var self = this;\r\n    this.desc = 'Mirror an ambisonic spherical recording across the principal planes.';\r\n    this.input_slots = [\r\n                    { name: 'audio_in',\r\n                    dt: core.datatypes.OBJECT,\r\n                    desc: 'A 4-channel B-format audio stream.',\r\n                    def: null },\r\n                    { name: 'direction',\r\n                    dt: core.datatypes.VECTOR,\r\n                    desc: 'Orientation vector of virtual microphone.',\r\n                    def: core.renderer.vector_origin },\r\n                    { name: 'mic_type',\r\n                    dt: core.datatypes.FLOAT,\r\n                    desc: 'Type of virtual microphone: 0:Cardioid, 1:Supercardioid, 2:Hypercardioid.',\r\n                    def: null }\r\n                     ];\r\n    this.output_slots = [\r\n                { name: 'audio_out',\r\n                  dt: core.datatypes.OBJECT,\r\n                  desc: 'A monophonic virtual microphone audio stream.' }\r\n                ];\r\n    // Load external library\r\n    core.add_aux_script('ambisonics/ambisonics.umd.js')\r\n    .then(function() {\r\n        // Initialize ambisonic nodes\r\n        console.log(ambisonics);\r\n        self.vmic_node = core.audioContext ? new ambisonics.virtualMic(core.audioContext, 1) : null;\r\n    })\r\n    .catch(function(err) {\r\n        console.error(err.stack)\r\n    });\r\n\r\n    // internal vars\r\n    this.src = null;\r\n    this.direction = null;\r\n    this.mic_type = null;\r\n \r\n    this.first = true;\r\n\r\n};\r\n \r\nAmbisonicVmicPlugin.prototype = Object.create(Plugin.prototype);\r\n\r\n\r\nAmbisonicVmicPlugin.prototype.reset = function() {\r\n    this.first = true;\r\n};\r\n \r\n \r\nAmbisonicVmicPlugin.prototype.update_input = function(slot, data) {\r\n    switch(slot.name) {\r\n        case 'audio_in':\r\n            if (this.src) this.src.disconnect(0);\r\n            this.src = data;\r\n            if (data) {\r\n                this.src.connect(this.vmic_node.in);\r\n                this.vmic_node.out.player = data.player;\r\n            }\r\n            break;\r\n        case 'direction':\r\n            this.direction = data;\r\n            if (data) this.direction.normalize();\r\n            break;\r\n        case 'mic_type':\r\n                switch(data) {\r\n                    case 0:\r\n                        this.mic_type = \"cardioid\";\r\n                        break;\r\n                    case 1:\r\n                        this.mic_type = \"supercardioid\";\r\n                        break;\r\n                    case 2:\r\n                        this.mic_type = \"hypercardioid\";\r\n                }\r\n    }\r\n};\r\n \r\n \r\nAmbisonicVmicPlugin.prototype.update_output = function(slot) {\r\n    return this.vmic_node.out;\r\n};\r\n \r\n \r\nAmbisonicVmicPlugin.prototype.update_state = function() {\r\n    if (this.mic_type!=this.vmic_node.vmicPattern) {\r\n        this.vmic_node.vmicPattern = this.mic_type;\r\n        this.vmic_node.updatePattern();\r\n            switch(this.mic_type) {\r\n                case \"cardioid\":\r\n                console.log('AmbiVmic: Cardioid');\r\n                break;\r\n                case \"supercardioid\":\r\n                console.log('AmbiVmic: Supercardioid');\r\n                break;\r\n                case \"hypercardioid\":\r\n                console.log('AmbiVmic: Hypercardioid');\r\n        }\r\n    }\r\n \r\n    var self = this;\r\n    function cart2sph() {\r\n        var azim, elev, azimElev;\r\n        azim = Math.atan2(self.direction.y, self.direction.x)*180/Math.PI;\r\n        elev = Math.atan2(self.direction.z, Math.sqrt(self.direction.y*self.direction.y + self.direction.x*self.direction.x))*180/Math.PI;\r\n        azimElev = [azim, elev];\r\n        //        console.log(azimElev)\r\n        return azimElev;\r\n    }\r\n    if (this.direction !== null) {\r\n        var azimElev = cart2sph();\r\n        this.vmic_node.azim = azimElev[0];\r\n        this.vmic_node.elev = azimElev[1];\r\n        this.vmic_node.updateOrientation();\r\n    }\r\n \r\n this.first = false;\r\n};\r\n \r\n})();\r\n \r\n"
  },
  {
    "path": "browser/plugins/audio_ambisonic_toaconverter.plugin.js",
    "content": "(function(){\r\n\r\nvar AmbisonicConverterPlugin = E2.plugins.audio_ambisonic_toaconverter = function(core, node) {\r\n    Plugin.apply(this, arguments)\r\n\r\n    // Describe plugin and inputs/outputs\r\n    var self = this;\r\n    this.desc = 'Decode an ambisonic spherical recording to headphones.';\r\n    this.input_slots = [\r\n                    { name: 'audio_in',\r\n                    dt: core.datatypes.OBJECT,\r\n                    desc: 'A 16-channel TOA audio stream to convert.',\r\n                    def: null },\r\n                    { name: 'convention',\r\n                    dt: core.datatypes.FLOAT,\r\n                    desc: 'Ambisonic convention: 0:ACN/N3D, 1:FuMa, 2:ACN/SN3D, .',\r\n                    def: null }\r\n                     ];\r\n    this.output_slots = [\r\n                { name: 'audio_out',\r\n                  dt: core.datatypes.OBJECT,\r\n                  desc: 'A converted 16-channel TOA audio stream.' }\r\n                ];\r\n    // Load external library\r\n    core.add_aux_script('ambisonics/ambisonics.umd.js')\r\n    .then(function() {\r\n\r\n        // Initialize ambisonic nodes\r\n        console.log(ambisonics);\r\n        self.converter_node1 = core.audioContext ? new ambisonics.converters.fuma2acn(core.audioContext, 3) : null;\r\n        self.converter_node2 = core.audioContext ? new ambisonics.converters.sn3d2n3d(core.audioContext, 3) : null;\r\n          \r\n    })\r\n    .catch(function(err) {\r\n        console.error(err.stack)\r\n    });\r\n\r\n    // internal vars\r\n    this.src = null;\r\n    this.convention = 0;\r\n    this.conventionChanged = true;\r\n    this.out_node = null;\r\n \r\n    this.first = true;\r\n\r\n};\r\n \r\nAmbisonicConverterPlugin.prototype = Object.create(Plugin.prototype);\r\n\r\n\r\nAmbisonicConverterPlugin.prototype.reset = function() {\r\n    this.first = true;\r\n};\r\n \r\n \r\nAmbisonicConverterPlugin.prototype.update_input = function(slot, data) {\r\n    switch(slot.name) {\r\n        case 'audio_in':\r\n            if (this.src) this.src.disconnect(0);\r\n            this.src = data;\r\n            this.update_connections();\r\n        case 'convention':\r\n            if (data!=this.convention) {\r\n                this.conventionChanged = true;\r\n                switch(data) {\r\n                    case 0:\r\n                        this.convention = 0;\r\n                        break;\r\n                    case 1:\r\n                        this.convention = 1;\r\n                        break;\r\n                    case 2:\r\n                        this.convention = 2;\r\n                }\r\n            }\r\n    }\r\n};\r\n \r\n \r\nAmbisonicConverterPlugin.prototype.update_output = function(slot) {\r\n    return this.out_node;\r\n};\r\n \r\n \r\nAmbisonicConverterPlugin.prototype.update_state = function() {\r\n    this.first = false;\r\n    if (this.src) {\r\n        if (this.conventionChanged) {\r\n            this.update_connections();\r\n            this.connectionChanged = false;\r\n        }\r\n    }\r\n};\r\n \r\nAmbisonicConverterPlugin.prototype.update_connections = function() {\r\n    this.src.disconnect(0);\r\n    switch(this.convention) {\r\n        case 0:\r\n            this.out_node = this.src;\r\n            console.log('Ambiconverter: Convention ACN/N3D (MPEG-H)')\r\n            break;\r\n        case 1:\r\n            this.src.connect(this.converter_node1.in);\r\n            this.out_node = this.converter_node1.out;\r\n            this.out_node.player = this.src.player;\r\n            console.log('Ambiconverter: Convention Furse-Malham (almost deprecated)')\r\n            break;\r\n        case 2:\r\n            this.src.connect(this.converter_node2.in);\r\n            this.out_node = this.converter_node2.out;\r\n            this.out_node.player = this.src.player;\r\n            console.log('Ambiconverter: Convention ACN/SN3D (ambiX, Youtube)')\r\n    }\r\n};\r\n \r\n})();\r\n "
  },
  {
    "path": "browser/plugins/audio_ambisonic_toadecoder.plugin.js",
    "content": "(function(){\r\n\r\nvar AmbisonicDecoderPlugin = E2.plugins.audio_ambisonic_toadecoder = function(core, node) {\r\n    Plugin.apply(this, arguments)\r\n\r\n    // Describe plugin and inputs/outputs\r\n    var self = this;\r\n    this.desc = 'Decode an ambisonic spherical recording to headphones.';\r\n    this.input_slots = [\r\n                    { name: 'audio_in',\r\n                    dt: core.datatypes.OBJECT,\r\n                    desc: 'A 16-channel TOA audio stream to decode.',\r\n                    def: null },\r\n                    { name: 'buffer',\r\n                    dt: core.datatypes.OBJECT,\r\n                    desc: 'A 16-channel audio buffer containing binaural decoding filters.',\r\n                    def: null }\r\n                     ];\r\n    this.output_slots = [\r\n                { name: 'audio_out',\r\n                  dt: core.datatypes.OBJECT,\r\n                  desc: 'A 2-channel binaural audio stream for headphones.' }\r\n                ];\r\n    // Load external library\r\n    core.add_aux_script('ambisonics/ambisonics.umd.js')\r\n    .then(function() {\r\n\r\n        // Initialize ambisonic nodes\r\n        console.log(ambisonics);\r\n        self.decoder_node = core.audioContext ? new ambisonics.binDecoder(core.audioContext, 3) : null;\r\n    })\r\n    .catch(function(err) {\r\n        console.error(err.stack)\r\n    });\r\n\r\n    // internal vars\r\n    this.src = null;\r\n    this.buffer = null;\r\n \r\n    this.first = true;\r\n\r\n};\r\n\r\nAmbisonicDecoderPlugin.prototype = Object.create(Plugin.prototype);\r\n\r\n\r\nAmbisonicDecoderPlugin.prototype.reset = function() {\r\n    this.first = true;\r\n};\r\n \r\n \r\nAmbisonicDecoderPlugin.prototype.update_input = function(slot, data) {\r\n    switch(slot.name) {\r\n        case 'audio_in':\r\n            if (this.src) this.src.disconnect(0);\r\n            this.src = data;\r\n            if (data) {\r\n                this.src.connect(this.decoder_node.in);\r\n                this.decoder_node.out.player = data.player;\r\n            }\r\n            break;\r\n        case 'buffer':\r\n            this.buffer = data;\r\n            if (data) {\r\n                this.decoder_node.updateFilters(data);\r\n                console.log('AmbiDecoder: Decoding filters updated');\r\n            }\r\n    }\r\n};\r\n \r\n \r\nAmbisonicDecoderPlugin.prototype.update_output = function(slot) {\r\n    return this.decoder_node.out;\r\n};\r\n \r\n \r\nAmbisonicDecoderPlugin.prototype.update_state = function() {\r\n    this.first = false;\r\n};\r\n \r\n})();\r\n "
  },
  {
    "path": "browser/plugins/audio_ambisonic_toaencoder.plugin.js",
    "content": "(function(){\r\n\r\nvar AmbisonicEncoderPlugin = E2.plugins.audio_ambisonic_toaencoder = function(core, node) {\r\n    Plugin.apply(this, arguments)\r\n\r\n    // Describe plugin and inputs/outputs\r\n    var self = this;\r\n    this.desc = 'Encode a monophonic sound to an ambisonic 4-channel B-format stream.';\r\n    this.input_slots = [\r\n                    { name: 'audio_in',\r\n                    dt: core.datatypes.OBJECT,\r\n                    desc: 'A mono audio stream to encode.',\r\n                    def: null },\r\n                    { name: 'direction',\r\n                    dt: core.datatypes.VECTOR,\r\n                    desc: 'Direction vector.',\r\n                    def: core.renderer.vector_origin }\r\n                     ];\r\n    this.output_slots = [\r\n                { name: 'audio_out',\r\n                  dt: core.datatypes.OBJECT,\r\n                  desc: 'A 16-channel TOA audio stream.' }\r\n                ];\r\n    // Load external library\r\n    core.add_aux_script('ambisonics/ambisonics.umd.js')\r\n    .then(function() {\r\n\r\n        // Initialize ambisonic nodes\r\n        console.log(ambisonics);\r\n        self.encoder_node = core.audioContext ? new ambisonics.monoEncoder(core.audioContext, 3) : null;\r\n    })\r\n    .catch(function(err) {\r\n        console.error(err.stack)\r\n    });\r\n\r\n    // internal vars\r\n    this.src = null;\r\n    this.direction = null;\r\n \r\n    this.first = true;\r\n\r\n};\r\n \r\nAmbisonicEncoderPlugin.prototype = Object.create(Plugin.prototype);\r\n\r\n\r\nAmbisonicEncoderPlugin.prototype.reset = function() {\r\n    this.first = true;\r\n};\r\n \r\n \r\nAmbisonicEncoderPlugin.prototype.update_input = function(slot, data) {\r\n    switch(slot.name) {\r\n        case 'audio_in':\r\n            if (this.src) this.src.disconnect(0);\r\n            this.src = data;\r\n            if (data) {\r\n                this.src.connect(this.encoder_node.in);\r\n                this.encoder_node.out.player = this.src.player;\r\n            }\r\n            break;\r\n        case 'direction':\r\n            this.direction = data;\r\n            if (data) this.direction.normalize();\r\n    }\r\n};\r\n \r\n \r\nAmbisonicEncoderPlugin.prototype.update_output = function(slot) {\r\n    return this.encoder_node.out;\r\n};\r\n \r\n \r\nAmbisonicEncoderPlugin.prototype.update_state = function() {\r\n\r\n    function cart2sph(dir_vec) {\r\n        var azim, elev, azimElev;\r\n        azim = Math.atan2(dir_vec.y, dir_vec.x)*180/Math.PI;\r\n        elev = Math.atan2(dir_vec.z, Math.sqrt(dir_vec.y*dir_vec.y + dir_vec.x*dir_vec.x))*180/Math.PI;\r\n        azimElev = [azim, elev];\r\n//        console.log(azimElev)\r\n        return azimElev;\r\n    }\r\n    if (this.direction !== null) {\r\n        var azimElev = cart2sph(this.direction);\r\n        this.encoder_node.azim = azimElev[0];\r\n        this.encoder_node.elev = azimElev[1];\r\n        this.encoder_node.updateGains();\r\n    }\r\n    this.first = false;\r\n};\r\n\r\n})();\r\n \r\n"
  },
  {
    "path": "browser/plugins/audio_ambisonic_toamirror.plugin.js",
    "content": "(function(){\r\n\r\nvar AmbisonicMirrorPlugin = E2.plugins.audio_ambisonic_toamirror = function(core, node) {\r\n    Plugin.apply(this, arguments)\r\n\r\n    // Describe plugin and inputs/outputs\r\n    var self = this;\r\n    this.desc = 'Mirror an ambisonic spherical recording across the principal planes.';\r\n    this.input_slots = [\r\n                    { name: 'audio_in',\r\n                    dt: core.datatypes.OBJECT,\r\n                    desc: 'A 16-channel TOA audio stream.',\r\n                    def: null },\r\n                    { name: 'mirror_plane',\r\n                    dt: core.datatypes.FLOAT,\r\n                    desc: 'Plane to mirror: 0:None, 1:Front-Back, 2:Left-Right, 3:Up-Down.',\r\n                    def: null }\r\n                     ];\r\n    this.output_slots = [\r\n                { name: 'audio_out',\r\n                  dt: core.datatypes.OBJECT,\r\n                  desc: 'A mirrored 16-channel TOA audio stream.' }\r\n                ];\r\n    // Load external library\r\n    core.add_aux_script('ambisonics/ambisonics.umd.js')\r\n    .then(function() {\r\n        // Initialize ambisonic nodes\r\n        console.log(ambisonics);\r\n        self.mirror_node = core.audioContext ? new ambisonics.sceneMirror(core.audioContext, 3) : null;\r\n    })\r\n    .catch(function(err) {\r\n        console.error(err.stack)\r\n    });\r\n\r\n    // internal vars\r\n    this.src = null;\r\n    this.mirror_plane = 0;\r\n \r\n    this.first = true;\r\n\r\n};\r\n \r\nAmbisonicMirrorPlugin.prototype = Object.create(Plugin.prototype);\r\n\r\n\r\nAmbisonicMirrorPlugin.prototype.reset = function() {\r\n    this.first = true;\r\n};\r\n \r\n \r\nAmbisonicMirrorPlugin.prototype.update_input = function(slot, data) {\r\n    switch(slot.name) {\r\n        case 'audio_in':\r\n            if (this.src) this.src.disconnect(0);\r\n            this.src = data;\r\n            if (data) {\r\n                this.src.connect(this.mirror_node.in);\r\n                this.mirror_node.out.player = data.player;\r\n            }\r\n            break;\r\n        case 'mirror_plane':\r\n                switch(data) {\r\n                    case 0:\r\n                        this.mirror_plane = 0;\r\n                        break;\r\n                    case 1:\r\n                        this.mirror_plane = 1;\r\n                        break;\r\n                    case 2:\r\n                        this.mirror_plane = 2;\r\n                        break;\r\n                    case 3:\r\n                        this.mirror_plane = 3;\r\n\r\n                }\r\n    }\r\n};\r\n \r\n \r\nAmbisonicMirrorPlugin.prototype.update_output = function(slot) {\r\n    return this.mirror_node.out;\r\n};\r\n \r\n \r\nAmbisonicMirrorPlugin.prototype.update_state = function() {\r\n    if (this.mirror_plane!=this.mirror_node.mirrorPlane) {\r\n        this.mirror_node.mirror(this.mirror_plane);\r\n            switch(this.mirror_plane) {\r\n                case 0:\r\n                console.log('AmbiMirror: No mirroring');\r\n                break;\r\n                case 1:\r\n                console.log('AmbiMirror: Front-back mirroring');\r\n                break;\r\n                case 2:\r\n                console.log('AmbiMirror: Left-right mirroring');\r\n                break;\r\n                case 3:\r\n                console.log('AmbiMirror: Up-down mirroring');\r\n        }\r\n \r\n    }\r\n    this.first = false;\r\n};\r\n \r\n})();\r\n "
  },
  {
    "path": "browser/plugins/audio_ambisonic_toarotator.plugin.js",
    "content": "(function(){\r\n\r\nvar AmbisonicRotatorPlugin = E2.plugins.audio_ambisonic_toarotator = function(core, node) {\r\n    Plugin.apply(this, arguments)\r\n\r\n    // Describe plugin and inputs/outputs\r\n    var self = this;\r\n    this.desc = 'Rotate an ambisonic spherical recording.';\r\n    this.input_slots = [\r\n                    { name: 'audio_in',\r\n                    dt: core.datatypes.OBJECT,\r\n                    desc: 'A 16-channel TOA audio stream to rotate.',\r\n                    def: null },\r\n                    { name: 'rotation',\r\n                    dt: core.datatypes.VECTOR,\r\n                    desc: 'Head/camera rotation.',\r\n                    def: core.renderer.vector_origin }\r\n                     ];\r\n    this.output_slots = [\r\n                { name: 'audio_out',\r\n                  dt: core.datatypes.OBJECT,\r\n                  desc: 'A rotated 16-channel TOA audio stream.' }\r\n                ];\r\n    // Load external library\r\n    core.add_aux_script('ambisonics/ambisonics.umd.js')\r\n    .then(function() {\r\n\r\n        // Initialize ambisonic nodes\r\n        console.log(ambisonics);\r\n        self.rotator_node = core.audioContext ? new ambisonics.sceneRotator(core.audioContext, 3) : null;\r\n    })\r\n    .catch(function(err) {\r\n        console.error(err.stack)\r\n    });\r\n\r\n    // internal vars\r\n    this.src = null;\r\n    this.rotation = new THREE.Vector3(0, 0, 0);\r\n \r\n    this.first = true;\r\n\r\n};\r\n \r\nAmbisonicRotatorPlugin.prototype = Object.create(Plugin.prototype);\r\n\r\n\r\nAmbisonicRotatorPlugin.prototype.reset = function() {\r\n    this.first = true;\r\n};\r\n \r\n \r\nAmbisonicRotatorPlugin.prototype.update_input = function(slot, data) {\r\n    switch(slot.name) {\r\n        case 'audio_in':\r\n            if (this.src) this.src.disconnect(0);\r\n            this.src = data;\r\n            if (data) {\r\n                this.src.connect(this.rotator_node.in);\r\n                this.rotator_node.out.player = data.player;\r\n            }\r\n            break;\r\n        case 'rotation':\r\n            if (data) this.rotation = data;\r\n    }\r\n};\r\n \r\n \r\nAmbisonicRotatorPlugin.prototype.update_output = function(slot) {\r\n    return this.rotator_node.out;\r\n};\r\n \r\n \r\nAmbisonicRotatorPlugin.prototype.update_state = function() {\r\n    var self = this;\r\n    function getCamera2AmbisonicRot() {\r\n        var yaw, pitch, roll, rotAngles;\r\n        yaw = self.rotation.y*180/Math.PI;\r\n        pitch = -self.rotation.x*180/Math.PI;\r\n        roll = -self.rotation.z*180/Math.PI;\r\n        rotAngles = [yaw, pitch, roll];\r\n        //        console.log(rotAngles)\r\n        return rotAngles;\r\n    }\r\n    if (this.rotation !== null) {\r\n        var rotAngles = getCamera2AmbisonicRot();\r\n        this.rotator_node.yaw = rotAngles[0];\r\n        this.rotator_node.pitch = rotAngles[1];\r\n        this.rotator_node.roll = rotAngles[2];\r\n        this.rotator_node.updateRotMtx();\r\n    }\r\n    this.first = false;\r\n};\r\n \r\n})();\r\n "
  },
  {
    "path": "browser/plugins/audio_ambisonic_toavmic.plugin.js",
    "content": "(function(){\r\n\r\nvar AmbisonicVmicPlugin = E2.plugins.audio_ambisonic_toavmic = function(core, node) {\r\n    Plugin.apply(this, arguments)\r\n\r\n    // Describe plugin and inputs/outputs\r\n    var self = this;\r\n    this.desc = 'Mirror an ambisonic spherical recording across the principal planes.';\r\n    this.input_slots = [\r\n                    { name: 'audio_in',\r\n                    dt: core.datatypes.OBJECT,\r\n                    desc: 'A 16-channel HOA audio stream.',\r\n                    def: null },\r\n                    { name: 'direction',\r\n                    dt: core.datatypes.VECTOR,\r\n                    desc: 'Orientation vector of virtual microphone.',\r\n                    def: core.renderer.vector_origin },\r\n                    { name: 'mic_type',\r\n                    dt: core.datatypes.FLOAT,\r\n                    desc: 'Type of virtual microphone: 0:Cardioid, 1:Supercardioid, 2:Hypercardioid, 3:max-rE.',\r\n                    def: null }\r\n                     ];\r\n    this.output_slots = [\r\n                { name: 'audio_out',\r\n                  dt: core.datatypes.OBJECT,\r\n                  desc: 'A monophonic virtual microphone audio stream.' }\r\n                ];\r\n    // Load external library\r\n    core.add_aux_script('ambisonics/ambisonics.umd.js')\r\n    .then(function() {\r\n        // Initialize ambisonic nodes\r\n        console.log(ambisonics);\r\n        self.vmic_node = core.audioContext ? new ambisonics.virtualMic(core.audioContext, 3) : null;\r\n    })\r\n    .catch(function(err) {\r\n        console.error(err.stack)\r\n    });\r\n\r\n    // internal vars\r\n    this.src = null;\r\n    this.direction = null;\r\n    this.mic_type = null;\r\n \r\n    this.first = true;\r\n\r\n};\r\n \r\nAmbisonicVmicPlugin.prototype = Object.create(Plugin.prototype);\r\n\r\n\r\nAmbisonicVmicPlugin.prototype.reset = function() {\r\n    this.first = true;\r\n};\r\n \r\n \r\nAmbisonicVmicPlugin.prototype.update_input = function(slot, data) {\r\n    switch(slot.name) {\r\n        case 'audio_in':\r\n            if (this.src) this.src.disconnect(0);\r\n            this.src = data;\r\n            if (data) {\r\n                this.src.connect(this.vmic_node.in);\r\n                this.vmic_node.out.player = data.player;\r\n            }\r\n            break;\r\n        case 'direction':\r\n            this.direction = data;\r\n            if (data) this.direction.normalize();\r\n            break;\r\n        case 'mic_type':\r\n                switch(data) {\r\n                    case 0:\r\n                        this.mic_type = \"cardioid\";\r\n                        break;\r\n                    case 1:\r\n                        this.mic_type = \"supercardioid\";\r\n                        break;\r\n                    case 2:\r\n                        this.mic_type = \"hypercardioid\";\r\n                        break;\r\n                    case 3:\r\n                        this.mic_type = \"max-rE\";\r\n                }\r\n    }\r\n};\r\n \r\n \r\nAmbisonicVmicPlugin.prototype.update_output = function(slot) {\r\n    return this.vmic_node.out;\r\n};\r\n \r\n \r\nAmbisonicVmicPlugin.prototype.update_state = function() {\r\n    if (this.mic_type!=this.vmic_node.vmicPattern) {\r\n        this.vmic_node.vmicPattern = this.mic_type;\r\n        this.vmic_node.updatePattern();\r\n            switch(this.mic_type) {\r\n                case \"cardioid\":\r\n                    console.log('AmbiVmic: Cardioid');\r\n                    break;\r\n                case \"supercardioid\":\r\n                    console.log('AmbiVmic: Supercardioid');\r\n                    break;\r\n                case \"hypercardioid\":\r\n                    console.log('AmbiVmic: Hypercardioid');\r\n                    break;\r\n                case \"max-rE\":\r\n                    console.log('AmbiVmic: maximum energy vector');\r\n        }\r\n    }\r\n \r\n    var self = this;\r\n    function cart2sph() {\r\n        var azim, elev, azimElev;\r\n        azim = Math.atan2(self.direction.y, self.direction.x)*180/Math.PI;\r\n        elev = Math.atan2(self.direction.z, Math.sqrt(self.direction.y*self.direction.y + self.direction.x*self.direction.x))*180/Math.PI;\r\n        azimElev = [azim, elev];\r\n        //        console.log(azimElev)\r\n        return azimElev;\r\n    }\r\n    if (this.direction !== null) {\r\n        var azimElev = cart2sph();\r\n        this.vmic_node.azim = azimElev[0];\r\n        this.vmic_node.elev = azimElev[1];\r\n        this.vmic_node.updateOrientation();\r\n    }\r\n \r\n this.first = false;\r\n};\r\n \r\n})();\r\n \r\n"
  },
  {
    "path": "browser/plugins/audio_analyse_modulator.plugin.js",
    "content": "E2.p = E2.plugins.audio_analyse_modulator = function(core) {\n\tthis.desc = 'Frequency and time domain audio analysis.'\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'source', dt: core.datatypes.OBJECT, desc: 'An audio source to analyse.', def: null },\n\t\t{ name: 'bin-count', dt: core.datatypes.FLOAT, desc: 'Number of FFT bins. Will be made power-of-two and clamped to 8-2048.', def: 32 },\n\t\t{ name: 'multiplier', dt: core.datatypes.FLOAT, desc: 'Multiplier for each bin value', def: 1.0 },\n\t\t{ name: 'smoothing', dt: core.datatypes.FLOAT, desc: 'Amount of FFT smoothing between frames', min: 0, max: 1, def: 0.9 }\n\t]\n\t\n\tthis.output_slots = [\n\t\t{ name: 'source', dt: core.datatypes.OBJECT, desc: 'The unmodified supplied source.', def: null },\n\t\t{ name: 'fft-bins', dt: core.datatypes.ARRAY, desc: 'The FFT bins.', def: null }\n\t]\n\t\n\tthis.analyser_node = core.audioContext ? core.audioContext.createAnalyser() : null\n\t\n\tthis.always_update = true\n\n\tthis.src = null\n\tthis.fft_bins = null\n\tthis.array = new ArrayBuffer(128)\n\tthis.array.datatype = 6\n\tthis.array.stride = 4\n\tthis.first = true\n\n\tthis.smoothing = 0.9\n}\n\nE2.p.prototype.reset = function() {\n\tthis.first = true\n}\n\nE2.p.prototype.update_input = function(slot, data) {\n\tif (slot.name === 'source') {\n\t\tif (this.src)\n\t\t\tthis.src.disconnect(0)\n\t\t\n\t\tthis.src = data\n\t\t\n\t\tif (data) {\n\t\t\tdata.connect(this.analyser_node)\n\t\t\tthis.analyser_node.player = data.player\n\t\t}\t\t\n\t} else if (slot.name === 'multiplier') {\n\t\tthis.multiplier = data\n\t} else if (slot.name === 'smoothing') {\n\t\tthis.smoothing = data\n\t} else if (slot.name === 'bin-count') {\n\t\tthis.fft_bins = data\n\n\t\tthis.array = new ArrayBuffer(this.fft_bins * 2)\n\t\tthis.array.datatype = 6\n\t\tthis.array.stride = 4\n\t\tthis.data = new Float32Array(this.array)\n\t\tmsg('FFT bins = ' + this.fft_bins)\n\t}\n}\n\nE2.p.prototype.update_state = function() {\n\tif (!this.analyser_node)\n\t\treturn;\n\n\tif ((this.analyser_node.frequencyBinCount !== this.fft_bins) || this.first) {\n\t\tthis.analyser_node.fftSize = this.fft_bins || 128\n\t\tthis.first = false\n\t}\n\n\tthis.analyser_node.smoothingTimeConstant = this.smoothing\n\n\tthis.analyser_node.getFloatFrequencyData(this.data)\n\tvar data = this.data\n\n\tfor(var i=0; i < this.fft_bins * 4; i++) {\n\t\tdata[i] = Math.pow(10, (data[i] / 20)) * this.multiplier\n\t}\n\n}\n\nE2.p.prototype.update_output = function(slot) {\n\tif (slot.index === 0)\n\t\treturn this.analyser_node\n\n\tthis.updated = true\n\n\treturn this.array\n}\n"
  },
  {
    "path": "browser/plugins/audio_buffer_source_modulator.plugin.js",
    "content": "E2.p = E2.plugins.audio_buffer_source_modulator = function(core, node) {\n\tthis.desc = 'Create a playable audio source from a buffer of audio data.'\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'buffer', dt: core.datatypes.OBJECT, desc: 'An audio buffer to create a playable source from.', def: null },\n\t\t{ name: 'play', dt: core.datatypes.BOOL, desc: 'Start or stop playback.', def: false },\n\t\t{ name: 'loop', dt: core.datatypes.BOOL, desc: 'Looping playback.', def: false },\n\t\t{ name: 'loop-start', dt: core.datatypes.FLOAT, desc: 'Start of loop (in seconds).', def: 0.0 },\n\t\t{ name: 'loop-end', dt: core.datatypes.FLOAT, desc: 'End of loop (in seconds).', def: 0.0 }\n\t]\n\t\n\tthis.output_slots = [\n\t\t{ name: 'source', dt: core.datatypes.OBJECT, desc: 'A playable audio source', def: null }\n\t]\n\t\n\tthis.core = core\n\tthis.node = node\n\tthis.audioSource = null\n\tthis.playing = false\n\tthis.should_play = false\n\tthis.loop = false\n\tthis.loop_start = 0.0\n\tthis.loop_end = 0.0\n\tthis.time = null\n\tthis.state = 0\n\t\n\tthis.update_source()\n}\n\nE2.p.prototype.reset = function() {\n}\n\nE2.p.prototype.play = function() {\n\tif (this.audioSource && !this.playing) {\n\t\tthis.should_play = true\n\t\tthis.updated = true\n\t}\n}\n\nE2.p.prototype.pause = function() {\n\tif (this.audioSource && this.playing) {\n\t\tthis.playing = false\n\t\tthis.should_play = true\n\t\tthis.stop_playback()\n\t\tthis.time = this.audioSource.currentTime\n\t\tthis.audioSource = null\n\t}\n}\n\nE2.p.prototype.stop = function() {\n\tif (this.playing) {\n\t\tthis.playing = this.should_play = false\n\t\tthis.stop_playback()\n\t\tthis.audioSource = null\n\t}\n\t\n\tthis.time = 0.0\n}\n\nE2.p.prototype.connection_changed = function(on, conn, slot) {\n\tif (slot.index === 0) {\n\t\tif (!on && this.playing && this.node.outputs.length < 1) {\n\t\t\tthis.stop_playback()\n\t\t\tthis.audioSource = null\n\t\t\tthis.playing = false\n\t\t}\n\t}\t\t\n}\n\nE2.p.prototype.update_input = function(slot, data) {\n\tif (slot.index === 0) {\n\t\tif (this.buffer === data)\n\t\t\treturn\n\n\t\tif (data && data.toString() !== '[object AudioBuffer]') {\n\t\t\tmsg('ERROR: Can\\'t create audio source from buffer: The supplied object isn\\'t a valid AudioBuffer object.')\n\t\t\treturn\n\t\t}\n\t\n\t\tif (this.playing) {\n\t\t\tif (this.audioSource)\n\t\t\t\tthis.stop_playback()\n\t\t\t\n\t\t\tthis.playing = false\n\t\t}\n\t\t\n\t\tthis.buffer = data\n\t\tthis.changed = true\n\t}\n\telse if (slot.index === 1) {\n\t\tif (this.should_play === data)\n\t\t\treturn\n\n\t\tthis.should_play = data\n\t\tthis.changed = true\n\t}\n\telse if (slot.index === 2) {\n\t\tthis.loop = data\n\t}\n\telse if (slot.index === 3) {\n\t\tthis.loop_start = data\n\t}\n\telse if (slot.index === 4) {\n\t\tthis.loop_end = data\n\t}\n}\t\n\nE2.p.prototype.start_playback = function() {\n\tif (this.audioSource && this.audioSource.buffer !== null && this.state === 0) {\n\t\tthis.audioSource.start()\n\t\tthis.state++\n\t}\n}\n\nE2.p.prototype.stop_playback = function() {\n\tif (this.audioSource && this.state === 1) {\n\t\tthis.audioSource.stop(0)\n\t\tthis.state--\n\t}\n}\n\nE2.p.prototype.update_source = function() {\n\tif (!this.core.audioContext) {\n\t\tthis.audioSource = null\n\t\treturn\n\t}\n\t\n\tthis.audioSource = this.core.audioContext.createBufferSource()\n\tthis.audioSource.player = this\n\tthis.state = 0\n\t\n\tif (this.buffer && this.playing)\n\t\tthis.audioSource.buffer = this.buffer\n}\n\nE2.p.prototype.update_state = function() {\n\tif (this.changed) {\n\t\tif (this.playing !== this.should_play) {\n\t\t\tif (this.audioSource) {\n\t\t\t\tif (this.playing && !this.should_play)\n\t\t\t\t\tthis.stop_playback()\n\t\t\t}\n\t\t\n\t\t\tthis.playing = this.should_play\n\t\t\tthis.update_source()\n\t\t}\n\n\t\tthis.changed = false\n\t}\n\n\tif (this.audioSource) {\n\t\tif (this.audioSource.loop !== this.loop)\n\t\t\tthis.audioSource.loop = this.loop\n\t\t\n\t\tif (this.audioSource.loopStart !== this.loop_start)\n\t\t\tthis.audioSource.loopStart = this.loop_start\n\t\t\n\t\tif (this.audioSource.loopEnd !== this.loop_end)\n\t\t\tthis.audioSource.loopEnd = this.loop_end\n\t\t\n\t\tif (this.time !== null) {\n\t\t\tthis.audioSource.currentTime = this.time\n\t\t\tthis.time = null\n\t\t}\n\t}\n}\n\nE2.p.prototype.update_output = function(slot) {\n\treturn this.audioSource\n}\n"
  },
  {
    "path": "browser/plugins/audio_delay_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"audio_delay_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Delay audio data.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'source', dt: core.datatypes.OBJECT, desc: 'An audio source to delay.', def: null },\n\t\t{ name: 'delay', dt: core.datatypes.FLOAT, desc: 'Delay time (in seconds).', def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'source', dt: core.datatypes.OBJECT, desc: 'A delayed audio source', def: null }\n\t];\n\t\n\tthis.delay_node = core.audioContext ? core.audioContext.createDelay(20.0) : null;\n\tthis.src = null;\n\tthis.delay = null;\n\tthis.first = true;\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.first = true;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t{\n\t\tif(this.src)\n\t\t\tthis.src.disconnect(0);\n\t\t\n\t\tthis.src = data;\n\t\t\n\t\tif(data)\n\t\t{\n\t\t\tdata.connect(this.delay_node);\n\t\t\tthis.delay_node.player = data.player;\n\t\t}\t\t\n\t}\n\telse\n\t{\n\t\tthis.delay = data > 20.0 ? 20.0 : data;\n\t}\n};\n\nE2.p.prototype.update_state = function()\n{\n\tif((this.delay_node.delayTime.value !== this.delay) || this.first)\n\t{\n\t\tthis.delay_node.delayTime.value = this.delay !== null ? this.delay : 0.0;\n\t\tthis.first = false;\n\t}\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.delay_node;\n};\n"
  },
  {
    "path": "browser/plugins/audio_gain_modulator.plugin.js",
    "content": "(function(){\n\nvar AudioGainModulator = E2.plugins.audio_gain_modulator = function(core, node) {\n\tvar that = this\n\n\tthis.desc = '(De)amplify or mix audio data.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'gain', dt: core.datatypes.FLOAT, desc: 'Amplification scalar.', def: null }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'source', dt: core.datatypes.OBJECT, desc: 'A (de)amplified audio source', def: null }\n\t];\n\t\n\tthis.state = {}\n\t\n\tthis.core = core;\n\tthis.node = node;\n\tthis.gain_node = core.audioContext ? core.audioContext.createGain() : null;\n\tthis.lsg = new LinkedSlotGroup(core, node, [], []);\n\tthis.srcs = [];\n\tthis.gain = null;\n\tthis.first = true;\n\n\tthis.node.on('slotAdded', function() {\n\t\tthat.dynInputs = node.getDynamicInputSlots()\n\t\tthat.updated = true\n\t})\n\n\tthis.node.on('slotRemoved', function() {\n\t\tthat.dynInputs = node.getDynamicInputSlots()\n\t\tthat.updated = true\n\t})\n\n}\n\nAudioGainModulator.prototype.reset = function() {\n\tthis.first = true;\n}\n\nAudioGainModulator.prototype.create_ui = function() {\n\tvar that = this\n\n\tvar layout = make('div')\n\tvar inp_add = makeButton('+', 'Click to add another input.')\n\tvar inp_rem = makeButton('-', 'Click to remove the last input.')\n\t\n\tinp_add.css({'width': '20px', 'float': 'left'})\n\tinp_rem.css({'width': '20px', 'float': 'right', 'margin-left': '5px'})\n\t\n\tinp_add.click(function() {\n\t\tE2.app.graphApi.addSlot(that.node.parent_graph, that.node, {\n\t\t\ttype: E2.slot_type.input,\n\t\t\tname: that.dynInputs.length + '',\n\t\t\tdt: that.core.datatypes.OBJECT\n\t\t})\n\t})\n\t\n\tinp_rem.click(function() {\n\t\tvar inputs = that.dynInputs\n\t\tif (!inputs)\n\t\t\treturn\n\n\t\tvar suid = inputs[inputs.length - 1].uid\n\t\tE2.app.graphApi.removeSlot(that.node.parent_graph, that.node, suid)\n\t})\n\n\tlayout.append(inp_add, '<br />', inp_rem)\n\t\n\treturn layout;\n}\n\nAudioGainModulator.prototype.update_input = function(slot, data)\n{\n\tif(slot.uid !== undefined)\n\t{\n\t\tif (this.srcs[slot.index] === data)\n\t\t\treturn;\n\n\t\tif (this.srcs[slot.index])\n\t\t\tthis.srcs[slot.index].disconnect(0);\n\t\t\n\t\tif (data && data.connect) {\n\t\t\tthis.srcs[slot.index] = data\n\t\t\tdata.connect(this.gain_node)\n\t\t\tthis.gain_node.player = data.player\n\t\t}\n\t}\n\telse if(slot.index === 0)\n\t{\n\t\tthis.gain = data;\n\t}\n};\n\nAudioGainModulator.prototype.update_state = function()\n{\n\tif((this.gain_node.gain.value !== this.gain) || this.first)\n\t{\n\t\tthis.gain_node.gain.value = this.gain !== null ? this.gain : 1.0;\n\t\tthis.first = false;\n\t}\n};\n\nAudioGainModulator.prototype.update_output = function(slot)\n{\n\treturn this.gain_node;\n};\n\nAudioGainModulator.prototype.state_changed = function(ui)\n{\n\tif(!ui) {\n\t\tthis.dynInputs = this.node.getDynamicInputSlots()\n\t\tfor(var i = 0, len = this.dynInputs.length; i < len; i++) {\n\t\t\tthis.lsg.add_dyn_slot(this.dynInputs[i])\n\t\t}\n\t}\n};\n\n\n})();\n\n"
  },
  {
    "path": "browser/plugins/audio_get_current_time_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"audio_get_current_time_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Get the current playback time of the supplied audio sample in seconds.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'audio', dt: core.datatypes.AUDIO, desc: 'Input audio sample.', def: null }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'time', dt: core.datatypes.FLOAT, desc: 'Current playback time.', def: 0 }\n\t];\n\t\n\t// We want to continuously emit time, even when the source isn't changing.\n\tthis.always_update = true;\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.time = 0.0;\n\tthis.audio = null;\n};\n\nE2.p.prototype.update_state = function()\n{\n\tthis.time = this.audio ? this.audio.currentTime : 0.0;\n \tthis.updated = true;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.audio = data;\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.time;\n};\n"
  },
  {
    "path": "browser/plugins/audio_get_duration_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"audio_get_duration_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Get the duration of the supplied audio sample in seconds.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'audio', dt: core.datatypes.AUDIO, desc: 'Input audio sample.', def: null }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'duration', dt: core.datatypes.FLOAT, desc: 'Duration in seconds.', def: 0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.duration = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.duration = data ? data.duration : 0.0;\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.duration;\n};\n"
  },
  {
    "path": "browser/plugins/audio_oneshot_on_trigger.plugin.js",
    "content": "(function() {\n\nvar AudioOneShotPlayer = E2.plugins.audio_oneshot_on_trigger = function(core) {\n\tthis.desc = 'Trigger playback of a one-shot audio sample.'\n\t\n\tthis.core = core\n\n\tthis.input_slots = [ \n\t\t{ name: 'buffer', dt: core.datatypes.OBJECT, desc: 'An audio buffer to create a playable source from.', def: null },\n\t\t{ name: 'trigger', dt: core.datatypes.BOOL, desc: 'Play the sound.', def: false }\n\t]\n\n\tthis.output_slots = []\n\n\tthis.shouldPlay = false\n}\n\nAudioOneShotPlayer.prototype.update_input = function(slot, data) {\n\tif (slot.index === 0) {\n\t\tif (this.buffer === data)\n\t\t\treturn\n\n\t\tif (data && data.toString() !== '[object AudioBuffer]')\n\t\t\treturn msg('ERROR: Can\\'t create audio source from buffer: The supplied object isn\\'t a valid AudioBuffer object.')\n\t\n\t\tthis.buffer = data\n\t} else if (slot.index === 1) {\n\t\tthis.shouldPlay = data\n\t}\n}\t\n\nAudioOneShotPlayer.prototype.playSound = function() {\n\tif (!this.core.audioContext)\n\t\treturn\n\n\tvar source = this.core.audioContext.createBufferSource()\n\tsource.buffer = this.buffer\n\tsource.connect(this.core.audioContext.destination)\n\tsource.start()\n}\n\nAudioOneShotPlayer.prototype.update_state = function() {\n\tif (this.shouldPlay && this.buffer) {\n\t\tthis.playSound()\n\t\tthis.shouldPlay = false\n\t}\n}\n\n})()\n"
  },
  {
    "path": "browser/plugins/audio_player.plugin.js",
    "content": "E2.p = E2.plugins.audio_player = function(core, node) {\n\tthis.desc = 'Play an audio stream. Playback loops.'\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'audio', dt: core.datatypes.AUDIO, desc: 'The audio stream to play.', def: null },\n\t\t{ name: 'play', dt: core.datatypes.BOOL, desc: 'Send true to start playback and false to stop.', def: true },\n\t\t{ name: 'mute', dt: core.datatypes.BOOL, desc: 'Send true to mute playback and false to reenable audio.', def: false },\n\t\t{ name: 'volume', dt: core.datatypes.FLOAT, desc: 'Set playback volume.', lo: 0.0, hi: 0.0, def: 0.5 },\n\t\t{ name: 'time', dt: core.datatypes.FLOAT, desc: 'Set playback time.', def: null }\n\t]\n\t\n\tthis.output_slots = [\n\t]\n\t\n\tthis.audio = null\n\tthis.playing = false\n\tthis.should_play = false\n\tthis.muted = false\n\tthis.volume = 0.5\n\tthis.time = null\n}\n\nE2.p.prototype.play = function() {\n\tif (this.audio && !this.playing && this.should_play) {\n\t\tthis.playing = this.should_play = true\n\t\tthis.audio.play()\n\t}\n}\n\nE2.p.prototype.pause = function() {\n\tif(this.audio && this.playing) {\n\t\tthis.playing = false\n\t\tthis.should_play = true\n\t\tthis.audio.pause()\n\t}\n}\n\nE2.p.prototype.stop = function() {\n\tif (this.audio) {\n\t\tif (this.playing) {\n\t\t\tthis.playing = this.should_play = false\n\t\t\tthis.audio.pause()\n\t\t}\n\t\t\n\t\tif (this.audio.readyState > 2)\n\t\t\tthis.audio.currentTime = 0\n\t}\n}\n\nE2.p.prototype.update_input = function(slot, data) {\n\tif (slot.index === 0) {\n\t\tif (!data) {\n\t\t\tif (this.audio) {\n\t\t\t\tthis.audio.pause()\n\t\t\t\tdelete this.audio\n\t\t\t}\n\t\t}\n\t\t\n\t\tthis.audio = data\n\t\tthis.playing = false\n\t}\n\telse if (slot.index === 1)\n\t\tthis.should_play = data\n\telse if (slot.index === 2)\n\t\tthis.muted = data\n\telse if (slot.index === 3)\n\t\tthis.volume = data < 0.0 ? 0.0 : data > 1.0 ? 1.0 : data\n\telse if (slot.index === 4)\n\t\tthis.time = data\n}\n\nE2.p.prototype.update_state = function() {\n\tvar audio = this.audio\n\t\n\tif (this.playing !== this.should_play) {\n\t\tif (audio) {\n\t\t\tif (this.should_play) {\n\t\t\t\taudio.play()\n\t\t\t} else {\n\t\t\t\taudio.pause()\n\t\t\t\taudio.currentTime = 0\n\t\t\t}\n\t\t\t\n\t\t\tthis.playing = this.should_play\n\t\t}\n\t}\n\t\n\tif (!this.playing)\n\t\treturn\n\n\tif (audio) {\n\t\taudio.muted = this.muted\n\t\taudio.volume = this.volume\t\n\n\t\tif(this.time !== null && this.audio.readyState > 2) {\n\t\t\taudio.currentTime = this.time ? this.time : 0\n\t\t\tthis.time = null\n\t\t}\n\t}\n\n\tthis.updated = true\n}\n"
  },
  {
    "path": "browser/plugins/audio_source_player.plugin.js",
    "content": "(function() {\n\nvar AudioSourcePlayerPlugin = E2.plugins.audio_source_player = function(core, node) {\n\tthis.desc = 'Plays a supplied audio source.'\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'source', dt: core.datatypes.OBJECT,\n\t\t\tdesc: 'The audio source to play.', def: null }\n\t]\n\t\n\tthis.output_slots = []\n\t\n\tthis.core = core\n\tthis.node = node\n\tthis.audioSource = null\n\n\tvar that = this\n}\n\nAudioSourcePlayerPlugin.prototype.connection_changed = function(on, conn, slot) {\n\tif (!on && this.audioSource) {\n\t\tthis.audioSource.player.stop_playback()\n\t\tthis.audioSource = null\n\t}\t\t\n}\n\nAudioSourcePlayerPlugin.prototype.update_input = function(slot, data) {\n\tif (slot.index === 0) {\n\t\tif (data && !data.context) {\n\t\t\tmsg('ERROR: Can\\'t play audio source.')\n\t\t\treturn\n\t\t}\n\t\t\n\t\tif (!data && this.audioSource && this.audioSource.buffer)\n\t\t\treturn this.audioSource.player.stop_playback()\n\n\t\tif (this.audioSource && this.audioSource !== data)\n\t\t\tthis.audioSource.player.stop_playback()\n\t\t\n\t\tif (this.core.audioContext && data) {\n\t\t\tdata.connect(this.core.audioContext.destination)\n\t\t\t\n\t\t\tif (data.player)\n\t\t\t\tdata.player.start_playback()\n\t\t}\n\n\t\tthis.audioSource = data\n\t}\n}\n\nAudioSourcePlayerPlugin.prototype.update_state = function() {\n\tthis.updated = true\n}\n\n})()\n"
  },
  {
    "path": "browser/plugins/audio_spatial_listener.plugin.js",
    "content": "(function() {\n\nvar SpatialListener = E2.plugins.audio_spatial_listener = function(core, node) \n{\n\tthis.desc = 'Spatial Listener.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'position', dt: core.datatypes.VECTOR, desc: 'Position.', def: core.renderer.vector_origin },\n\t\t{ name: 'forward', dt: core.datatypes.VECTOR, desc: 'Forward Vector.', def: core.renderer.vector_origin },\n\t\t{ name: 'up', dt: core.datatypes.VECTOR, desc: 'Up Vector.', def: new THREE.Vector3(0,1,0) /* whatever */ } \n\t];\n\t\n\tthis.output_slots = [];\n\t\n\tthis.position = null;\n\tthis.forward = null;\n\tthis.up = null;\n\n\tthis.audioContext = core.audioContext;\n\tthis.first = true;\n}\n\nSpatialListener.prototype.reset = function()\n{\n\tthis.first = true;\n}\n\nSpatialListener.prototype.update_input = function(slot, data)\n{\n\tswitch( slot.index ) {\n\t\tcase 0: this.position = data;\tbreak;\n\t\tcase 1:\tthis.forward = data;\tbreak;\n\t\tcase 2:\tthis.up = data;\t\t\tbreak;\n\t}\n}\n\nSpatialListener.prototype.update_state = function(uc)\n{\n\tvar listener = this.audioContext.listener;\n\n\tif( this.position !== null ) {\n\t\tlistener.setPosition(this.position.x,this.position.y,this.position.z);\n\t}\n\n\tif( this.forward !== null && this.up !== null) {\n\t\tlistener.setOrientation(\n\t\t\tthis.forward.x,this.forward.y,this.forward.z,\n\t\t\tthis.up.x,this.up.y,this.up.z\n\t\t);\n\t}\t\n\n\tthis.first = false;\n}\n\nSpatialListener.prototype.update_output = function(slot)\n{\n\tthis.updated = true;\n}\n\n})();\n"
  },
  {
    "path": "browser/plugins/audio_spatial_panner.plugin.js",
    "content": "(function() {\n\nvar SpatialPanner = E2.plugins.audio_spatial_panner = function(core, node) \n{\n\tthis.desc = 'Spatial Panner.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'source', dt: core.datatypes.OBJECT, desc: 'An audio source to spatialize.', def: null },\n\t\t{ name: 'position', dt: core.datatypes.VECTOR, desc: 'Position.', def: core.renderer.vector_origin },\n\t\t{ name: 'orientation', dt: core.datatypes.VECTOR, desc: 'Orientation.', def: core.renderer.vector_origin },\n\t\t{ name: 'coneInnerAngle', dt: core.datatypes.FLOAT, desc: 'Cone Inner Angle.', def: 360 }, \t\n\t\t{ name: 'coneOuterAngle', dt: core.datatypes.FLOAT, desc: 'Cone Outer Angle.', def: 360 },\n\t\t{ name: 'coneOuterGain', dt: core.datatypes.FLOAT, desc: 'Cone Outer Gain.', def: 0 },\n\t\t{ name: 'refDistance', dt: core.datatypes.FLOAT, desc: 'Reference Distance.', def: 1 },\n\t\t{ name: 'maxDistance', dt: core.datatypes.FLOAT, desc: 'Maximum Distance.', def: 10000 },\n\t\t{ name: 'rolloff', dt: core.datatypes.FLOAT, desc: 'Rolloff Factor.', def: 1 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'source', dt: core.datatypes.OBJECT, desc: 'A spatialized audio source', def: null },\n\t];\n\t\n\tthis.panner = core.audioContext ? core.audioContext.createPanner() : null;\n\tthis.audioContext = core.audioContext;\n\tthis.src = null;\n\tthis.position = null;\n\tthis.orientation = null;\n\n\tthis.coneInnerAngle = null;\n\tthis.coneOuterAngle = null;\n\tthis.coneOuterGain = null;\n\n\tthis.refDistance = null;\n\tthis.maxDistance = null;\n\tthis.rolloff = null;\n\n\tthis.distanceModel = 'linear';\n\n\tthis.first = true;\n}\n\nSpatialPanner.prototype.reset = function()\n{\n\tthis.first = true;\n}\n\n/*\nSpatialPanner.prototype.create_ui = function()\n{\n\tvar layout = make('div')\n\tvar inp = $('<select />', { selectedIndex: 0 });\n\tvar create = function(val, txt) { $('<option />', { value: val, text: txt }).appendTo(inp) };\n\n\tcreate(\"linear\", 'Linear');\n\tcreate(\"inverse\", 'Inverse');\n\tcreate(\"exponential\", 'Exponential');\n\n\tinp.change(function(self) { return function() \n\t{\n\t\tself.undoableSetState('type', inp.val(), self.distanceModel)\n\t}}(this));\n\n\tlayout.append('Distance Model<br />');\n\n\tlayout.append(inp);\n\n\treturn layout;\n};\n*/\n\nSpatialPanner.prototype.update_input = function(slot, data)\n{\n\tswitch(slot.index) {\n\t\tcase 0:\t{\n\t\t\tif(this.src && this.src.disconnect)\n\t\t\t\tthis.src.disconnect(0);\n\n\t\t\tif(this.src = data)\t{\n\t\t\t\tif(data.connect)\n\t\t\t\t\tdata.connect(this.panner);\n\n\t\t\t\tthis.panner.player = data.player;\n\t\t\t}\t\t\n\t\t} break;\n\n\t\tcase 1:\tthis.position = data; \t\tbreak;\n\t\tcase 2:\tthis.orientation = data;\tbreak;\n\t\tcase 3: this.coneInnerAngle = data; break;\n\t\tcase 4: this.coneOuterAngle = data; break;\n\t\tcase 5: this.coneOuterGain = data;\tbreak;\n\t\tcase 6: this.refDistance = data;\tbreak;\n\t\tcase 7: this.maxDistance = data;\tbreak;\n\t\tcase 8: this.rolloff = data;\t\tbreak;\n\t}\n}\n\nSpatialPanner.prototype.update_state = function(uc)\n{\n\tif( this.position !== null ) \n\t\tthis.panner.setPosition( this.position.x, this.position.y, this.position.z );\n\n\tif( this.orientation !== null )\n\t\tthis.panner.setOrientation( this.orientation.x, this.orientation.y, this.orientation.z );\n\n\tif( this.coneInnerAngle !== null )\n\t\tthis.panner.coneInnerAngle = this.coneInnerAngle;\n\n\tif( this.coneOuterAngle !== null )\n\t\tthis.panner.coneOuterAngle = this.coneOuterAngle;\n\n\tif( this.coneOuterGain !== null )\n\t\tthis.panner.coneOuterGain = this.coneOuterGain;\n\n\tif( this.refDistance !== null )\n\t\tthis.panner.refDistance = this.refDistance;\n\n\tif( this.maxDistance !== null )\n\t\tthis.panner.maxDistance = this.maxDistance;\n\n\tif( this.rolloff !== null )\n\t\tthis.panner.rolloffFactor = this.rolloff;\n\n\tthis.first = false;\n}\n\nSpatialPanner.prototype.update_output = function()\n{\n\treturn this.panner;\n}\n\n})();\n"
  },
  {
    "path": "browser/plugins/bool_display.plugin.js",
    "content": "E2.p = E2.plugins[\"bool_display\"] = function(core, node)\n{\n\tthis.desc = 'Displays the text \\'True\\' or \\'False\\' depending on the state of the supplied bool or \\'-\\', if no data is being received.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: 'The input boolean to display.', def: null }\n\t];\n\t\n\tthis.output_slots = [];\n\t\n\tthis.label = null;\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.update_value(null);\n}\n\nE2.p.prototype.create_ui = function()\n{\n\tthis.label = make('div');\n\tthis.label.css('text-align', 'right'); \n\tthis.update_value(null);\n\t\n\treturn this.label;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.update_value(data);\n};\n\nE2.p.prototype.update_value = function(value)\n{\t\n\tif(this.label)\n\t\tthis.label.text(value === null ? '-' : value ? 'True' : 'False');\n};\n"
  },
  {
    "path": "browser/plugins/camera_forward_vector.plugin.js",
    "content": "(function() {\n\tvar CameraForwardVector = E2.plugins.camera_forward_vector = function(core, node) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'Extract the forward vector from a camera'\n\n\t\tthis.input_slots = [{\n\t\t\tname: 'camera',\n\t\t\tdt: core.datatypes.CAMERA\n\t\t}]\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'forward',\n\t\t\tdt: core.datatypes.VECTOR\n\t\t}]\n\n\t\tthis.forward = new THREE.Vector3(0, 0, -1)\n\t}\n\n\tCameraForwardVector.prototype = Object.create(Plugin.prototype)\n\n\tCameraForwardVector.prototype.reset = function() {\n\t\tPlugin.prototype.reset.apply(this, arguments)\n\t}\n\n\tCameraForwardVector.prototype.update_input = function(slot, data) {\n\t\tif (data) {\n\t\t\tthis.forward.set(0, 0, -1)\n\t\t\tthis.forward.applyMatrix4(data.matrixWorld)\n\t\t\tthis.forward.sub(new THREE.Vector3().setFromMatrixPosition(data.matrixWorld))\n\t\t}\n\t\telse {\n\t\t\tthis.forward.set(0,0,-1)\n\t\t}\n\t}\n\n\tCameraForwardVector.prototype.update_output = function(slot) {\n\t\treturn this.forward\n\t}\n\n})()"
  },
  {
    "path": "browser/plugins/ceiling_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"ceiling_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Round <b>value</b> to the closest higher interger.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Value to be rounded.', def: 0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'result', dt: core.datatypes.FLOAT, desc: 'The rounded result.', def: 0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.value = Math.ceil(data);\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/change_trigger.plugin.js",
    "content": "var ValueChangePlugin = E2.plugins.change_trigger = function ValueChangePlugin(core, node) {\n\tPlugin.apply(this, arguments)\n\n\tthis.desc = 'Triggers the output once when input changes'\n\n\tthis.input_slots = [\n\t\t{\n\t\t\tname: 'value',\n\t\t\tdt: core.datatypes.ANY,\n\t\t\tdesc: 'Item to watch'\n\t\t},\n\t]\n\n\tthis.output_slots = [ {\n\t\t\tname: 'bool',\n\t\t\tdt: core.datatypes.BOOL,\n\t\t\tdesc: 'Triggered for one frame when input value changes'\n\t\t}\n\t]\n\n\tthis.value = null\n\tthis.changed = false\n}\n\nValueChangePlugin.prototype = Object.create(Plugin.prototype)\n\nValueChangePlugin.prototype.reset = function() {\n\tthis.changed = false\n}\n\nValueChangePlugin.prototype.update_input = function(slot, data) {\n\tif (data === this.value)\n\t\treturn;\n\n\tthis.value = data\n\tthis.node.queued_update = 1\n}\n\nValueChangePlugin.prototype.update_state = function() {\n\tthis.changed = this.value !== this.previousValue\n\tthis.previousValue = this.value\n}\n\nValueChangePlugin.prototype.update_output = function() {\n\treturn this.changed\n}\n"
  },
  {
    "path": "browser/plugins/clamp_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"clamp_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emit a float <b>value</b> no less than <b>min</b> and no greater than <b>max</b>.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Value to be clipped.', def: 0.0 },\n\t\t{ name: 'min', dt: core.datatypes.FLOAT, desc: 'Minimum output value.', def: 0.0 },\n\t\t{ name: 'max', dt: core.datatypes.FLOAT, desc: 'Maximum output value.', def: 1.0 } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'result', dt: core.datatypes.FLOAT, desc: 'Emits <b>min</b> <= <b>value</b> >= <b>max</b>.', def: 0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.input_val = 0.0;\n\tthis.min_value = 0.0;\n\tthis.max_value = 1.0;\n\tthis.output_val = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.input_val = data;\n\telse if(slot.index === 1)\n\t\tthis.min_value = data;\n\telse\n\t\tthis.max_value = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tvar l = this.min_value,\n\t    h = this.max_value,\n\t    i = this.input_val;\n\t\n\tif(l > h)\n\t{\n\t\tvar t = l;\n\t\t\n\t\tl = h;\n\t\th = t;\n\t}\n\t\n\tthis.output_val = i < l ? l : i > h ? h : i;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.output_val;\n};\n"
  },
  {
    "path": "browser/plugins/clamped_accumulate_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"clamped_accumulate_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Every input <b>value</b> is accumulated in an internal buffer. The buffer value is not permitted to be smaller then <b>min</b> or larger than <b>max</b>.';\n\t\n\tthis.input_slots = \n\t[\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'A small value to be accumulated in an internal buffer.', def: 0.0 },\n\t\t{ name: 'min', dt: core.datatypes.FLOAT, desc: 'Minimum internal buffer value.', def: 0.0 },\n\t\t{ name: 'max', dt: core.datatypes.FLOAT, desc: 'Maximum internal buffer value.', def: 1.0 },\n\t\t{ name: 'reset', dt: core.datatypes.FLOAT, desc: 'Send a value to this slot to reset the accumulator to that value.', def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'The current value of the accumulation buffer.', def: 0 }\n\t];\n\t\n\tthis.state = { value: 0.0 };\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.updated = true;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t{\n\t\tthis.value = data;\n\t\tthis.state.value += this.value;\n\t\tthis.state.value = this.state.value < this.lo ? this.lo : this.state.value > this.hi ? this.hi : this.state.value;\n\t}\n\tif(slot.index === 1)\n\t\tthis.lo = data;\n\tif(slot.index === 2)\n\t\tthis.hi = data;\n\tif(slot.index === 3)\n\t\tthis.state.value = data < this.lo ? this.lo : data > this.hi ? this.hi : data;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.state.value;\n};\t\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.value = 0.0;\n\t\tthis.lo = 0.0;\n\t\tthis.hi = 1.0;\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/clock_generator.plugin.js",
    "content": "E2.p = E2.plugins[\"clock_generator\"] = function(core, node)\n{\n\tthis.desc = 'Emits current absolute time in seconds.';\n\t\n\tthis.input_slots = [];\n\t\n\tthis.output_slots = [ \n\t\t{ name: 'seconds', dt: core.datatypes.FLOAT, desc: 'Current absolute time.' }\n\t];\n\t\n\tthis.core = core;\n};\n\nE2.p.prototype.update_state = function(updateContext)\n{\n\tthis.abs_t = updateContext.abs_t\n\tthis.updated = true;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.abs_t;\n};\n"
  },
  {
    "path": "browser/plugins/color_add_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"color_add_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Adds a constant value to all components of a color. Each channel is clipped to the range 0;1.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'color', dt: core.datatypes.COLOR, desc: 'Input color.', def: core.renderer.color_white },\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Value to be added to the R, G and B channels.', def: 0.0 } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'color', dt: core.datatypes.COLOR, desc: 'Output color: R+V, G+V, B+V' }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.color = new THREE.Color(1, 1, 1)\n\tthis.output_color = new THREE.Color(1, 1, 1)\n\tthis.value = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.color = data;\n\telse\n\t\tthis.value = data;\n};\n\nE2.p.prototype.update_state = function()\n{\n\tthis.output_color.r = this.color.r + this.value\n\tthis.output_color.g = this.color.g + this.value\n\tthis.output_color.b = this.color.b + this.value\n};\n\nE2.p.prototype.update_output = function()\n{\n\treturn this.output_color;\n};\n"
  },
  {
    "path": "browser/plugins/color_blend_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"color_blend_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Color x-fader. Perform linear blend between two colors.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'color A', dt: core.datatypes.COLOR, desc: 'First color operand.', def: core.renderer.color_black },\n\t\t{ name: 'color B', dt: core.datatypes.COLOR, desc: 'Second color operand.', def: core.renderer.color_black }, \n\t\t{ name: 'mix', dt: core.datatypes.FLOAT, desc: '0: Emit pure color A\\n1: Emit pure color B', lo: 0, hi: 1, def: 0.5 } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'color', dt: core.datatypes.COLOR, desc: 'Linear mix of color A and B:\\n\\nA * (1 - mix) + B * mix' }\n\t];\n};\n\nE2.p.prototype.reset = function() {\n\tthis.output_color = new THREE.Color(1, 1, 1)\n}\n\nE2.p.prototype.update_input = function(slot, data) {\n\tif(slot.index === 0)\n\t\tthis.color_a = data\n\telse if(slot.index === 1)\n\t\tthis.color_b = data\n\telse\n\t\tthis.mix = data\n}\n\nE2.p.prototype.update_state = function()\n{\n\tvar mix = this.mix;\n\tvar inv_mix = 1.0 - mix;\n\tvar ca = this.color_a;\n\tvar cb = this.color_b;\n\tvar oc = this.output_color;\n\t\n\toc.r = (ca.r * mix) + (cb.r * inv_mix)\n\toc.g = (ca.g * mix) + (cb.g * inv_mix)\n\toc.b = (ca.b * mix) + (cb.b * inv_mix)\n};\n\nE2.p.prototype.update_output = function() {\n\treturn this.output_color;\n}\n\nE2.p.prototype.state_changed = function(ui) {\n\tif(!ui) {\n\t\tthis.color_a = new THREE.Color(0, 0, 0)\n\t\tthis.color_b = new THREE.Color(0, 0, 0)\n\t\tthis.output_color = new THREE.Color(0, 0, 0)\n\t\tthis.mix = 0.5;\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/color_display.plugin.js",
    "content": "E2.p = E2.plugins[\"color_display\"] = function(core, node)\n{\n\tthis.desc = 'Displays the supplied color in a rectangle on the plugin.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'color', dt: core.datatypes.COLOR, desc: 'Input color to be displayed.', def: core.renderer.color_white }\n\t];\n\t\n\tthis.output_slots = [];\n\tthis.color = new THREE.Color(1,1,1)\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.color = new THREE.Color(1,1,1)\n};\n\nE2.p.prototype.css = function()\n{\n\tvar obj = {}\n\tvar c = this.color;\n\t\n\tobj['background-color'] = 'rgb(' + Math.round(c.r * 255.0) + ', ' + Math.round(c.g * 255.0) + ', ' + Math.round(c.b * 255.0) + ')';\n\treturn obj;\n};\n\nE2.p.prototype.create_ui = function()\n{\n\tvar bg = make('span');\n\tthis.label = make('span');\n\n\tbg.css({ 'background': 'url(\\'images/checkerboard.png\\')', 'border': '1px #aaa solid' });\n\tthis.label.html('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;') \n\tthis.label.css(this.css());\n\t\n\tbg.append(this.label);\n\treturn bg;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.color = data\n\n\tif(this.label)\n\t\tthis.label.css(this.css());\n};\n"
  },
  {
    "path": "browser/plugins/color_multiply_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"color_multiply_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Scale the RGB components of a color by a supplied factor.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'color', dt: core.datatypes.COLOR, desc: 'Color to be modulated.', def: core.renderer.color_white },\n\t\t{ name: 'factor', dt: core.datatypes.FLOAT, desc: 'Factor to scale the RGB components of the supplied color with.', def: 1.0 } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'color', dt: core.datatypes.COLOR, desc: 'Output color: R * V, G * V, B * V, A' }\n\t];\n};\n\nE2.p.prototype.reset = function() {\n\tthis.color = new THREE.Color(1, 1, 1)\n\tthis.output_color = new THREE.Color(1, 1, 1)\n\tthis.factor = 1.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.color = data;\n\telse\n\t\tthis.factor = data;\n};\n\nE2.p.prototype.update_state = function()\n{\n\tvar c = this.color;\n\tvar oc = this.output_color;\n\tvar f = this.factor;\n\t\n\tvar r = c.r * f;\n\tvar g = c.g * f;\n\tvar b = c.b * f;\n\n\toc.r = r < 0.0 ? 0.0 : r > 1.0 ? 1.0 : r;\n\toc.g = g < 0.0 ? 0.0 : g > 1.0 ? 1.0 : g;\n\toc.b = b < 0.0 ? 0.0 : b > 1.0 ? 1.0 : b;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.output_color;\n};\n"
  },
  {
    "path": "browser/plugins/color_picker.plugin.js",
    "content": "(function() {\n\nvar clamp = THREE.Math.clamp\n\nvar ColorPicker = function(core) {\n\n\tPlugin.apply(this, arguments)\n\tthis.desc = 'Provides an intuitive way of picking arbitrary colors via a hue slider and saturation/value selection area.';\n\tthis.input_slots = [];\n\n\tthis.output_slots = [\n\t\t{\n\t\t\tname: 'color',\n\t\t\tdt: core.datatypes.COLOR,\n\t\t\tdesc: 'The selected color.',\n\t\t\tdef: new THREE.Color(1,1,1)\n\t\t}\n\t];\n\n\tthis.state = { hue: 0.0, sat: 0.0, lum: 1.0 };\n\t// note: .lum above is used as B/V so model is actually HSV\n\t// note: .hue above is inverted (1.0 - hue) and therefore goes clockwise - #990\n\t// \t\t http://codeitdown.com/hsl-hsb-hsv-color/\n\n\tthis.ui = null;\n\tthis.color = new THREE.Color(1,1,1);\n\tthis.updated = false;\t// update_state\n};\n\nColorPicker.prototype = Object.create(Plugin.prototype)\n\n// sets the referenced color from the current state\nColorPicker.prototype.setFromState = function(/* @var THREE.Color */ color) {\n\tvar hue, sat, lum, val;\n\n\t// this.state has HSV, THREE.Color needs HSL\n\tval = clamp(this.state.lum, 0.0, 1.0)\n\n\t// hue is inverted (#990)\n\thue = clamp(1.0 - this.state.hue, 0.0, 1.0)\n\n\tlum = 0.5 * val * (2 - this.state.sat);\n\tlum = clamp(lum, 0.0, 1.0)\n\n\tvar tl = clamp(lum, 0.00001, 0.999999)\t// avoid division by zero below\n\n\tsat = val * this.state.sat / (1 - Math.abs(2 * tl - 1));\n\tsat = clamp(sat, 0.0, 1.0)\n\n\tcolor.setHSL(hue, sat, lum);\n\treturn color;\n}\n\nColorPicker.prototype.makeStateFromThisColor = function() {\n\t// modify this.color (rgb), and convert from HSL to this.state (HSV)\n\tvar hsl = this.color.getHSL();\n\tvar sat, val, hue, lum;\t\t// clamp everything\n\n\thue = clamp(hsl.h, 0.0, 1.0)\n\tlum = clamp(hsl.l, 0.0, 1.0)\n\n\tval = 0.5 * (2 * lum + hsl.s * (1 - Math.abs(2 * lum - 1)))\n\tval = clamp(val, 0.0, 1.0)\n\tvar tempVal = (val === 0.0) ? 0.000001 : val;\t// avoid division by zero\n\n\tsat = 2 * (val - lum) /  tempVal ;\n\tsat = clamp(sat, 0.0, 1.0)\n\n\tthis.state.sat = sat;\n\tthis.state.lum = val;\t// !\n\tif (sat > 0.0)\n\t\tthis.state.hue = 1.0 - hue;\t\t// note hue is inverted\n}\n\nColorPicker.prototype.create_ui = function() {\n\tvar $container = this.c = make('div');\n\tvar $svSurface = this.i = make('img');\n\tvar $svPicker = this.s = make('img');\n\tvar $hueSurface = this.h = make('img');\n\tvar $huePicker = this.hs = make('img');\n\n\tthis.indicator = {\n\t\t// dom elements\n\t\t'Hex' : null,\n\t\t'R' : null,\n\t\t'G' : null,\n\t\t'B' : null\n\t};\n\n\tvar ww = 178;\t// container width\n\tvar hh = 120;\n\tvar ch = hh + 24;\t// container height = picker + hue\n\tthis.picker_height = 0.0 + hh;\n\tthis.picker_width = 0.0 + ww;\n\t$container.css({\n\t\t'height': '' + ch + 'px',\n\t\t'width': '' + ww + 'px',\n\t\t'position': 'relative'\n\t});\n\n\t$hueSurface.attr('src', '/images/color_picker/hue_h.svg');\n\t$huePicker.attr('src', '/images/color_picker/hue-select_h.svg');\n\t$svSurface.attr('src', '/images/color_picker/picker.png');\n\t$svPicker.attr('src', '/images/color_picker/select.gif');\n\n\t$hueSurface.attr('preserveAspectRatio', 'xMidYMid none');\n\t// hue image\n\t$hueSurface.css({\n\t\t'width': ''+ww+'px',\n\t\t'border': '0',\n\t\t'border-radius': '2px',\n\t\t'z-index': '100',\n\t\t'position': 'absolute',\n\t\t'top' : ''+(hh+4)+'px',\n\t\t'left': '0'\n\t});\n\n\t$huePicker.css({\n\t\t'position': 'absolute',\n\t\t'left': '0px',\n\t\t'top': ''+(hh+3)+'px',\n\t\t'height': '20px',\n\t\t'width': '5px',\n\t\t'z-index': '101'\n\t});\n\n\t$svPicker.css({\n\t\t'width': '11px',\n\t\t'height': '11px',\n\t\t'z-index': '101',\n\t\t'position': 'absolute'\n\t});\n\n\t// big image (saturation + value)\n\t$svSurface.css({\n\t\t'width': ''+ww+'px',\n\t\t'height': ''+hh+'px',\n\t\t'border': '0',\n\t\t'border-radius': '2px',\n\t\t'z-index': '100'\n\t});\n\t$svSurface.attr({\n\t\t'width': ww,\n\t\t'height': hh\n\t});\n\n\t$container.append($svSurface);\n\t$container.append($svPicker);\n\t$container.append($hueSurface);\n\t$container.append($huePicker);\n\n\tvar t = this.ui_createValuesIndicator($container);\n\tthis.ui = jQuery('<div></div>').append($container,t);\n\n\tthis.ui_enableInteraction($container[0], $svSurface[0], $svPicker[0], $hueSurface[0], $huePicker[0])\n\n\treturn this.ui;\n};\n\nColorPicker.prototype.updateRGBValue = function() {\n\tthis.setFromState(this.color);\n\tthis.updated = true;\n};\n\nColorPicker.prototype.updatePicker = function(c, s) {\n\tvar left = Math.round(this.state.sat * this.picker_width) - 6;\n\tvar top = Math.round((1.0 - this.state.lum) * this.picker_height) - 6;\n\ts.css('left', left);\n\ts.css('top', top );\n};\n\nColorPicker.prototype.updateHue = function(i, h, hs) {\n\tvar cc = new THREE.Color()\n\tvar hue = 1.0 - this.state.hue;\n\tcc.setHSL(hue, 1.0, 0.5);\t// peg to max brightness\n\n\tif(i)\n\t\ti.css('background-color', '#' + cc.getHexString())\n\n\tif(h && hs) {\n\t\t// horizontal\n\t\ths.css('left', Math.round(( (hue) * this.picker_width) - 2));\n\t}\n};\n\n// creates the HexRGB widget\nColorPicker.prototype.ui_createValuesIndicator = function(/* @var jQuery */ c) {\n\tvar $t = jQuery('<table></table>');\n\tvar $row1 = jQuery('<tr></tr>');\n\tvar row2 = [];\n\tvar i = this.indicator;\n\tObject.keys(i).forEach(function(key){\n\t\ti[key] = jQuery('<td>-</td>');\n\t\t$row1.append(i[key]);\n\t\trow2.push('<th>'+key+'</th>');\n\t});\n\tvar $row2 = jQuery('<tr>'+ row2.join('') + '</tr>');\n\t$t.append($row1, $row2);\n\ti._oldcolor = new THREE.Color(0,0,0);\n\ti.update = function(c){\n\t\tif (this._oldcolor.equals(c)) return;\t// nothing to update\n\t\tthis._oldcolor = c.clone();\n\t\tthis.Hex.html(c.getHexString());\n\t\tthis.R.html(Math.round(255 * c.r));\n\t\tthis.G.html(Math.round(255 * c.g));\n\t\tthis.B.html(Math.round(255 * c.b));\n\t\t// three.color has no alpha\n\t}.bind(i);\n\treturn $t;\n}\n\nColorPicker.prototype.ui_enableInteraction = function(containerNode, svSurfaceNode, svPickerNode, hueSurfaceNode, huePickerNode) {\n\tvar that = this\n\n\tfunction beginModifyState() {\n\t\tthat.beginBatchModifyState()\n\t}\n\n\tfunction endModifyState () {\n\t\treturn that.endBatchModifyState('Pick color')\n\t}\n\n\tfunction moveValue(val) {\n\t\tthat.state.lum = val;\n\t\tthat.state_changed(that.ui)\n\t}\n\n\tfunction moveSaturation(sat) {\n\t\tthat.state.sat = sat;\n\t\tthat.state_changed(that.ui)\n\t}\n\n\tfunction moveHue(hue) {\n\t\tthat.state.hue = 1.0 - hue\t// #990\n\t\tthat.state_changed(that.ui)\n\t}\n\n\t// sat/val\n\tvar opts = {\n\t\tmin : 0.0,\n\t\tmax : 1.0,\n\t\tstep : 0.001,\n\t\tgetValue : function() { return that.state.sat },\n\t\tisSurface : true,\n\t\tcssCursor : 'crosshair',\n\t\torientation : 'horizontal'\n\t}\n\n\t// two for the area (x/y) and two for the picker within the area (x/y)\n\tuiMakeDragToAdjust(svSurfaceNode, beginModifyState, moveSaturation, endModifyState, opts)\n\topts.surfaceDomNode = svSurfaceNode\n\tuiMakeDragToAdjust(svPickerNode, beginModifyState, moveSaturation, endModifyState, opts)\n\tdelete opts.surfaceDomNode\n\n\topts.getValue = function() { return that.state.lum }\n\topts.orientation = 'vertical'\n\topts.min = 1.0\n\topts.max = 0.0\n\tuiMakeDragToAdjust(svSurfaceNode, beginModifyState, moveValue, endModifyState, opts)\n\topts.surfaceDomNode = svSurfaceNode\n\tuiMakeDragToAdjust(svPickerNode, beginModifyState, moveValue, endModifyState, opts)\n\n\t// hue\n\topts = {\n\t\tmin : 0.00001,\n\t\tmax : 0.99999,\n\t\tstep : 0.001,\n\t\tgetValue : function() { return that.state.hue },\n\t\tisSurface: true,\n\t\tcssCursor: 'crosshair',\n\t\torientation: 'horizontal'\n\t}\n\t// one for surface, one for indicator\n\tuiMakeDragToAdjust(hueSurfaceNode, beginModifyState, moveHue, endModifyState, opts)\n\topts.surfaceDomNode = hueSurfaceNode\n\tuiMakeDragToAdjust(huePickerNode, beginModifyState, moveHue, endModifyState, opts)\n\n\t// indicator rgb\n\tvar getComponent = function (which) {\n\t\treturn function(){ return that.color[which] }\n\t}\n\n\tvar setComponent = function(which) {\n\t\treturn function(v) {\n\t\t\tthat.color[which] = v;\n\t\t\tthat.makeStateFromThisColor()\n\t\t\tthat.state_changed(that.ui)\n\t\t}\n\t}\n\n\tvar options = {\n\t\tmin : 0.00001,\n\t\tmax : 1,\n\t\tstep : 0.002,\n\t\tcssCursor : 'ns-resize',\n\n\t\tallowTextInput : true,\n\t\ttextInputParentNode : containerNode,\n\t\tparseTextInput : function(value) {\n\t\t\tvar v = parseFloat(value)\n\t\t\tif (isNaN(v)) return false\n\t\t\tif (!isFinite(v)) return false\n\t\t\treturn v/255\n\t\t}\n\t}\n\n\tuiMakeDragToAdjust(\n\t\tthis.indicator.R[0],\n\t\tbeginModifyState,\n\t\tsetComponent('r'),\n\t\tendModifyState,\n\t\t_.extend(options, {getValue: getComponent('r')} )\n\t);\n\n\tuiMakeDragToAdjust(\n\t\tthis.indicator.G[0],\n\t\tbeginModifyState,\n\t\tsetComponent('g'),\n\t\tendModifyState,\n\t\t_.extend(options, {getValue: getComponent('g')} )\n\t);\n\n\tuiMakeDragToAdjust(\n\t\tthis.indicator.B[0],\n\t\tbeginModifyState,\n\t\tsetComponent('b'),\n\t\tendModifyState,\n\t\t_.extend(options, {getValue: getComponent('b')} )\n\t);\n\n\t// indicator hex\n\tthis.indicator.Hex.on('dblclick', function(e){\n\t\tuiEnterValueControl(that.indicator.Hex[0], containerNode, function(hex) {\t// child, parent, handler\n\t\t\tvar pad = '000000'\n\t\t\thex = hex.toString().replace('#','').toUpperCase()\n\t\t\tif (hex.length === 3) {\n\t\t\t\tvar old = hex\n\t\t\t\thex = old.substring(0,1) + old.substring(0,1) +\n\t\t\t\t\t  old.substring(1,2) + old.substring(1,2) +\n\t\t\t\t\t  old.substring(2,3) + old.substring(2,3)\n\t\t\t} else {\n\t\t\t\thex = '' + hex + pad.substring(0, pad.length - hex.length)\n\t\t\t\thex = hex.substring(0,6)\n\t\t\t}\n\t\t\tif (hex.length !== 6) return false\n\t\t\tvar isOk = /^[0-9A-F]{6}$/i.test(hex)\n\t\t\tif (!isOk) return false\n\t\t\tbeginModifyState()\n\t\t\tthat.color.setHex('0x'+hex)\n\t\t\tthat.makeStateFromThisColor()\n\t\t\tthat.state_changed(that.ui)\n\t\t\tendModifyState()\n\t\t})\n\t})\n}\n\n// === common methods ===\n\nColorPicker.prototype.reset = function() {};\n\nColorPicker.prototype.update_state = function() {\n}\n\nColorPicker.prototype.update_output = function() {\n\treturn this.color;\n};\n\nColorPicker.prototype.state_changed = function(/* @var jQuery */ ui) {\n\tthis.updateRGBValue();\n\tif(ui) {\n\t\tthis.updateHue(this.i, this.h, this.hs);\n\t\tthis.updatePicker(ui, this.s);\n\t\tthis.indicator.update(this.color);\n\t}\n};\n\nE2.plugins.color_picker = ColorPicker\n\n})();"
  },
  {
    "path": "browser/plugins/concatenate_matrix_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"concatenate_matrix_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Combine two matrices. Order is significant.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'a', dt: core.datatypes.MATRIX, desc: 'The first matrix operand.',\n\t\t\tdef: core.renderer.matrix_identity },\n\t\t{ name: 'b', dt: core.datatypes.MATRIX, desc: 'The second matrix operand.',\n\t\t\tdef: core.renderer.matrix_identity }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'matrix', dt: core.datatypes.MATRIX, desc: 'Emits <b>first</b> * <b>second</b>.' }\n\t];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.matrices[slot.index] = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tvar m = this.matrices;\n\t\n\tif(m[0] === null || m[1] === null)\n\t\treturn;\n\t\n\tthis.matrix.multiplyMatrices(m[0], m[1])\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.matrix;\n};\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.matrices = [ new THREE.Matrix4(), new THREE.Matrix4() ];\n\t\tthis.matrix = THREE.Matrix4();\n\n\t\tthis.matrices[0].identity()\n\t\tthis.matrices[1].identity()\n\t\tthis.matrix.identity()\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/const_float_generator.plugin.js",
    "content": "(function(){\nvar Const = E2.plugins.const_float_generator = function(core, node) {\n\tPlugin.apply(this, arguments)\n\n\tthis.desc = 'Emits a float constant specified in an input field. If an invalid string in entered, the field is reset to the previous value.';\n\t\n\tthis.input_slots = [];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'The currently entered value.', def: 1 }\n\t];\n\t\n\tthis.state = { val: 1.0 };\n};\nConst.prototype = Object.create(Plugin.prototype)\n\nConst.prototype.reset = function() {}\n\nConst.prototype.create_ui = function() {\n\tvar that = this\n\tvar inp = this.$input = \n\t\t$('<input type=\"number\" step=\"0.1\" value=\"1.0\" style=\"width: 50px;\" />')\n\t\n\tinp.css('border', '1px solid #999')\n\tinp.on('change', function() {\n\t\tvar oldValue = that.state.val\n\t\tvar newValue = that.state.val\n\n\t\ttry { \n\t\t\tvar v = parseFloat(inp.val())\n\t\t\tif (!isNaN(v))\n\t\t\t\tnewValue = v\n\t\t} catch(e) {\n\t\t\treturn;\n\t\t}\n\n\t\tthat.undoableSetState('val', newValue, oldValue)\n\t})\n\n\tthis.etf = new ExpandableTextfield(this.node, inp, 7)\n\n\tthis.ui = inp\n\n\tthis.node.on('pluginStateChanged', this.updateUi.bind(this))\n\n\treturn this.ui\n}\n\nConst.prototype.update_output = function() {\n\treturn this.state.val\n}\n\nConst.prototype.state_changed = function(ui) {\n\tif (ui)\n\t\tthis.updateUi()\n}\n\nConst.prototype.updateUi = function() {\n\tif (!this.ui)\n\t\treturn;\n\n\tthis.ui.val('' + this.state.val)\n}\n\n\n})()"
  },
  {
    "path": "browser/plugins/const_text_generator.plugin.js",
    "content": "(function(){\n\nvar Text = E2.plugins.const_text_generator = function Text() {\n\tAbstractTextAreaPlugin.apply(this, arguments)\n\tthis.undoName = 'Text'\n}\n\nText.prototype = Object.create(AbstractTextAreaPlugin.prototype)\nText.prototype.constructor = Text\n\n})()\n"
  },
  {
    "path": "browser/plugins/convert_bool_float_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"convert_bool_float_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Convert a bool to a float. True emits 1 and false 0.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: 'Input boolean to be converted.', def: false } \n\t];\n\t\n\tthis.output_slots = [ \n\t\t { name: 'value', dt: core.datatypes.FLOAT, desc: 'Emits 0 when the input is false and 1 otherwise.', lo: 0.0, hi: 1.0, def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.value = data ? 1.0 : 0.0;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/convert_color_hsl_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"convert_color_hsl_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Create an RGB color from hue, saturation and luminosity.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'color', dt: core.datatypes.COLOR, desc: 'The corresponding RGBA color.', def: core.renderer.color_black } \n\t];\n\t\n\tthis.output_slots = [ \n\t\t{ name: 'hue', dt: core.datatypes.FLOAT, desc: 'The hue of the input <b>color</b>.', lo: 0, hi: 1, def: 0.0 },\n\t\t{ name: 'saturation', dt: core.datatypes.FLOAT, desc: 'The saturation (color intensity) of the input <b>color</b>.', lo: 0, hi: 1, def: 0.0 },\n\t\t{ name: 'luminosity', dt: core.datatypes.FLOAT, desc: 'The luminosity (brightness) of the input <b>color</b>.', lo: 0, hi: 1, def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.hsl = [1, 1, 1, 1];\n\tthis.color = new THREE.Color(1,1,1)\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.color = data;\n};\n\nE2.p.prototype.update_state = function()\n{\n\tvar color = this.color;\n\t\n\tthis.hsl[0] = this.hsl[1] = this.hsl[2] = 0.0;\n\t\n\tvar hi = Math.max(Math.max(color.r, color.g), color.b);\n\tvar lo = Math.min(Math.min(color.r, color.g), color.b);\n\n\tvar l = (lo + hi) * 0.5;\n\t\n\tif(l <= 0.0)\n\t\treturn;\n\t\t\n\tvar diff = hi - lo;\n\tvar s = diff;\n\t\n\tthis.hsl[2] = l;\n\n\tif(s > 0.0)\n\t\ts /= (l <= 0.5) ? (lo + hi) : (2.0 - hi - lo);\n\telse\n\t\treturn;\n\t\n\tvar r = (hi - color.r) / diff; \n\tvar g = (hi - color.g) / diff; \n\tvar b = (hi - color.b) / diff;\n\tvar h = 0.0;\n\t\n\tif(color.r === hi)\n\t\th = (color.g === lo ? 5.0 + b : 1.0 - g);\n\telse if(color.g === hi)\n\t\th = (color.b === lo ? 1.0 + r : 3.0 - b);\n\telse\n\t\th = (color.r === lo ? 3.0 + g : 5.0 - r);\n\t\t\n\tthis.hsl[0] = h / 6.0;\n\tthis.hsl[1] = s;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.hsl[slot.index];\n};\n"
  },
  {
    "path": "browser/plugins/convert_color_rgb_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"convert_color_rgb_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Convert a color to its individual RGB components so they can be individually manipulated.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'color', dt: core.datatypes.COLOR, desc: 'Input color to be split.', def: core.renderer.color_white } \n\t];\n\t\n\tthis.output_slots = [ \n\t\t { name: 'red', dt: core.datatypes.FLOAT, desc: 'Red channel value.', def: 1.0 },\n\t\t { name: 'green', dt: core.datatypes.FLOAT, desc: 'Green channel value.', def: 1.0 },\n\t\t { name: 'blue', dt: core.datatypes.FLOAT, desc: 'Blue channel value.', def: 1.0 },\n\t];\n};\n\nE2.p.prototype.reset = function() {\n\tthis.color = new THREE.Color(1,1,1)\n};\n\nE2.p.prototype.update_input = function(slot, data) {\n\tthis.color = data;\n};\n\nE2.p.prototype.update_output = function(slot) {\n\tif (slot.index === 0)\n\t\treturn this.color.r\n\tif (slot.index === 1)\n\t\treturn this.color.g\n\tif (slot.index === 2)\n\t\treturn this.color.b\n};\n"
  },
  {
    "path": "browser/plugins/convert_float_bool_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"convert_float_bool_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Convert a float to a boolean. 0 is false, everything else is true.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Input float to be converted.', def: 0.0 } \n\t];\n\t\n\tthis.output_slots = [ \n\t\t { name: 'bool', dt: core.datatypes.BOOL, desc: 'Emits false when the input value is zero and true otherwise.', def: false }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = false;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.value = data === 0.0 ? false : true;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/convert_hsl_color_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"convert_hsl_color_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Create an RGB color from hue, saturation and luminosity.';\n\t\n\tthis.input_slots = [\n\t\t { name: 'hue', dt: core.datatypes.FLOAT, desc: 'The hue of the output color.', lo: 0, hi: 1, def: 1.0 },\n\t\t { name: 'saturation', dt: core.datatypes.FLOAT, desc: 'The saturation (color intensity) of the output color.', lo: 0, hi: 1, def: 1.0 },\n\t\t { name: 'luminosity', dt: core.datatypes.FLOAT, desc: 'The luminosity (brightness) of the output color.', lo: 0, hi: 1, def: 1.0 }\n\t];\n\t\n\tthis.output_slots = [ \n\t\t{ name: 'color', dt: core.datatypes.COLOR, desc: 'The corresponding RGB color.', def: core.renderer.color_white } \n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.hsl = [1, 1, 1];\n\tthis.color = new THREE.Color(1,1,1)\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.hsl[slot.index] = data < 0.0 ? 0.0 : data > 1.0 ? 1.0 : data;\n};\n\nE2.p.prototype.update_state = function()\n{\n\tvar s = this.hsl[1];\n\tvar l = this.hsl[2];\n\tvar sc = [];\n\t\n\tif(s === 0.0) {\n\t\tsc[0] = sc[1] = sc[2] = l;\n\t\treturn;\n\t}\n\t\n\tvar h = this.hsl[0];\n\tvar t2 = ((l <= 0.5) ? l * (1.0 + s) : l + s - (l * s));\n\tvar t1 = 2.0 * l - t2;\t\t\n\tvar t3 = [h + 1.0 / 3.0, h, h - 1.0 / 3.0];\n\t\n\tfor(var i = 0; i < 3; i++)\n\t{\n\t\tif(t3[i] < 0.0)\n\t\t\tt3[i] += 1.0;\n\t\tif(t3[i] > 1.0)\n\t\t\tt3[i] -= 1.0;\n\t\t\n\t\tvar t3v = t3[i];\n\t\t\t\t\t\n\t\tif(6.0 * t3v < 1.0)\n\t\t\tsc[i] = t1 + (t2-t1) * t3v * 6.0;\n\t\telse if(2.0 * t3v < 1.0)\n\t\t\tsc[i] = t2;\n\t\telse if(3.0 * t3v < 2.0)\n\t\t\tsc[i] = (t1 + (t2 - t1) * ((2.0 / 3.0) - t3v) * 6.0);\n\t\telse\n\t\t\tsc[i] = t1;\n\t}\n\n\tthis.color.setRGB(sc[0], sc[1], sc[2])\n};\n\nE2.p.prototype.update_output = function()\n{\n\treturn this.color;\n};\n"
  },
  {
    "path": "browser/plugins/convert_oscilator_unit_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"convert_oscilator_unit_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Rescales and offsets a number in the range -1;1 to the range 0;1.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'The input value.', lo: -1, hi: 1, def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'The output value: (I + 1) / 2', lo: 0, hi: 1, def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tvar v = (data + 1.0) * 0.5;\n\t\n\tthis.value = v < 0.0 ? 0.0 : v > 1.0 ? 1.0 : v;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/convert_rgb_color_modulator.plugin.js",
    "content": "(function() {\n\n\tConvertRGBColorModulator = E2.plugins.convert_rgb_color_modulator = function(core) {\n\t\tthis.desc = 'Creates a new color from individual RGB components.'\n\t\t\n\t\tthis.input_slots = [\n\t\t\t { name: 'red', dt: core.datatypes.FLOAT, desc: 'Red channel value.', lo: 0, hi: 1, def: 1.0 },\n\t\t\t { name: 'green', dt: core.datatypes.FLOAT, desc: 'Green channel value.', lo: 0, hi: 1, def: 1.0 },\n\t\t\t { name: 'blue', dt: core.datatypes.FLOAT, desc: 'Blue channel value.', lo: 0, hi: 1, def: 1.0 }\n\t\t]\n\t\t\n\t\tthis.output_slots = [ \n\t\t\t{ name: 'color', dt: core.datatypes.COLOR, desc: 'The output color', def: new THREE.Color(0xffffff) }\n\t\t]\n\t}\n\n\tConvertRGBColorModulator.prototype.reset = function() {\n\t\tthis.color = new THREE.Color(0xffffff)\n\t}\n\n\tConvertRGBColorModulator.prototype.update_input = function(slot, data) {\n\t\tif (slot.index === 0)\n\t\t\tthis.color.r =data\n\t\tif (slot.index === 1)\n\t\t\tthis.color.g = data\n\t\tif (slot.index === 2)\n\t\t\tthis.color.b = data\n\t}\n\n\tConvertRGBColorModulator.prototype.update_output = function() {\n\t\treturn this.color\n\t}\n\n})()"
  },
  {
    "path": "browser/plugins/convert_string_float_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"convert_string_float_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Convert a string to a float.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'text', dt: core.datatypes.TEXT, desc: 'Input string to be converted.', def: '0.0' } \n\t];\n\t\n\tthis.output_slots = [ \n\t\t { name: 'value', dt: core.datatypes.FLOAT, desc: 'The parsed float value of the input string or 0', def: 0 }\n\t];\n\n\tthis.value = 0.0;\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = false;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.value = 0.0;\n\n\ttry\n\t{\n\t\tthis.value = parseFloat(data);\n\t}\n\tcatch(e)\n\t{\n\t}\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/convert_vector_xyz_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"convert_vector_xyz_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Decompose a vector to its individual XYZ components so they can be manipulated individually.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'vector', dt: core.datatypes.VECTOR, desc: 'Input vector.', def: new THREE.Vector3() }\n\t];\n\t\n\tthis.output_slots = [\n\t\t { name: 'x', dt: core.datatypes.FLOAT, desc: 'The x-component.', def: 0.0 },\n\t\t { name: 'y', dt: core.datatypes.FLOAT, desc: 'The y-component.', def: 0.0 },\n\t\t { name: 'z', dt: core.datatypes.FLOAT, desc: 'The z-component.', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = new THREE.Vector3();\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.value = data;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\tif (slot.index === 0) {\n\t\treturn this.value.x\n\t}\n\telse if (slot.index === 1) {\n\t\treturn this.value.y\n\t}\n\telse {\n\t\treturn this.value.z\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/cos_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"cos_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Cos(x).';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Input value.', def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'result', dt: core.datatypes.FLOAT, desc: 'cos(<b>value</b>).', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.value = Math.cos(data);\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/cosine_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"cosine_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Cosine oscilator. A <b>time</b> value incrementing by one unit per second will yield a 1Hz output signal.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'time', dt: core.datatypes.FLOAT, desc: 'Time in seconds', def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Emits cos(<b>time</b> * 2pi)', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.time = 0.0;\n\tthis.result = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.time = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.result = Math.cos(this.time * 2.0 * Math.PI);\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.result;\n};\n"
  },
  {
    "path": "browser/plugins/crypto_cw_get_balances.plugin.js",
    "content": "E2.p = E2.plugins[\"crypto_cw_get_balances\"] = function(core, node)\n{\n\tthis.desc = 'Obtain information about the current balances of a CounterWallet address.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'address', dt: core.datatypes.TEXT, desc: 'Address of the wallet to query.', def: '' }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'balances', dt: core.datatypes.OBJECT, desc: 'The CounterWallet response.' }\n\t];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t{\n\t\tthis.address = data;\n\t\t\n\t\tif(this.address === '')\n\t\t\treturn;\n\t\t\n\t\tvar req = '{\"jsonrpc\":\"2.0\",\"id\":0,\"method\":\"proxy_to_counterpartyd\",\"params\":{\"method\":\"get_balances\", \"params\":{\"filters\":{\"field\":\"address\",\"op\":\"==\",\"value\":\"' + this.address + '\"}}}}';\n\t\n\t\t$.ajax({\n\t\t\turl: 'https://counterwallet.io/_api',\n\t\t\ttype: 'POST',\n\t\t\tdata: req,\n\t\t\tcache: false,\n\t\t\tsuccess: function(self) { return function(response)\n\t\t\t{\n\t\t\t\tself.balances = response;\n\t\t\t\tself.updated = true;\n\t\t\t}}(this)\t\n\t\t});\n\t}\n};\n\nE2.p.prototype.update_state = function()\n{\n\tif(this.address === '')\n\t\tthis.balances = {};\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.balances;\n};\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.balances = {};\n\t\tthis.address = '';\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/crypto_dw_get_balances.plugin.js",
    "content": "E2.p = E2.plugins[\"crypto_dw_get_balances\"] = function(core, node)\n{\n\tthis.desc = 'Obtain information about the current balances of a DogeWallet address.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'address', dt: core.datatypes.TEXT, desc: 'Address of the wallet to query.', def: '' }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'balances', dt: core.datatypes.OBJECT, desc: 'The DogeWallet response.' }\n\t];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.address = data;\n};\n\nE2.p.prototype.update_state = function()\n{\n\tif(this.address === '')\n\t{\n\t\tthis.balances = {};\n\t\treturn;\n\t}\n\n\tvar req = '{\"jsonrpc\":\"2.0\",\"id\":0,\"method\":\"get_normalized_balances\",\"params\":{\"addresses\":[\"' + this.address + '\"]}}';\n\t\n\t$.ajax({\n\t\turl: 'https://wallet.dogeparty.io/_api',\n\t\ttype: 'POST',\n\t\tdata: req,\n\t\tcache: false,\n\t\tsuccess: function(self) { return function(response)\n\t\t{\n\t\t\tself.balances = response;\n\t\t\tself.updated = true;\n\t\t}}(this)\t\n\t});\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.balances;\n};\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.balances = {};\n\t\tthis.address = '';\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/csg/csg.js",
    "content": "// Constructive Solid Geometry (CSG) is a modeling technique that uses Boolean\n// operations like union and intersection to combine 3D solids. This library\n// implements CSG operations on meshes elegantly and concisely using BSP trees,\n// and is meant to serve as an easily understandable implementation of the\n// algorithm. All edge cases involving overlapping coplanar polygons in both\n// solids are correctly handled.\n// \n// Example usage:\n// \n//     var cube = CSG.cube();\n//     var sphere = CSG.sphere({ radius: 1.3 });\n//     var polygons = cube.subtract(sphere).toPolygons();\n// \n// ## Implementation Details\n// \n// All CSG operations are implemented in terms of two functions, `clipTo()` and\n// `invert()`, which remove parts of a BSP tree inside another BSP tree and swap\n// solid and empty space, respectively. To find the union of `a` and `b`, we\n// want to remove everything in `a` inside `b` and everything in `b` inside `a`,\n// then combine polygons from `a` and `b` into one solid:\n// \n//     a.clipTo(b);\n//     b.clipTo(a);\n//     a.build(b.allPolygons());\n// \n// The only tricky part is handling overlapping coplanar polygons in both trees.\n// The code above keeps both copies, but we need to keep them in one tree and\n// remove them in the other tree. To remove them from `b` we can clip the\n// inverse of `b` against `a`. The code for union now looks like this:\n// \n//     a.clipTo(b);\n//     b.clipTo(a);\n//     b.invert();\n//     b.clipTo(a);\n//     b.invert();\n//     a.build(b.allPolygons());\n// \n// Subtraction and intersection naturally follow from set operations. If\n// union is `A | B`, subtraction is `A - B = ~(~A | B)` and intersection is\n// `A & B = ~(~A | ~B)` where `~` is the complement operator.\n// \n// ## License\n// \n// Copyright (c) 2011 Evan Wallace (http://madebyevan.com/), under the MIT license.\n\n// # class CSG\n\n// Holds a binary space partition tree representing a 3D solid. Two solids can\n// be combined using the `union()`, `subtract()`, and `intersect()` methods.\n\nCSG = function() {\n  this.polygons = [];\n};\n\n// Construct a CSG solid from a list of `CSG.Polygon` instances.\nCSG.fromPolygons = function(polygons) {\n  var csg = new CSG();\n  csg.polygons = polygons;\n  return csg;\n};\n\nCSG.prototype = {\n  clone: function() {\n    var csg = new CSG();\n    csg.polygons = this.polygons.map(function(p) { return p.clone(); });\n    return csg;\n  },\n\n  toPolygons: function() {\n    return this.polygons;\n  },\n\n  // Return a new CSG solid representing space in either this solid or in the\n  // solid `csg`. Neither this solid nor the solid `csg` are modified.\n  // \n  //     A.union(B)\n  // \n  //     +-------+            +-------+\n  //     |       |            |       |\n  //     |   A   |            |       |\n  //     |    +--+----+   =   |       +----+\n  //     +----+--+    |       +----+       |\n  //          |   B   |            |       |\n  //          |       |            |       |\n  //          +-------+            +-------+\n  // \n  union: function(csg) {\n    var a = new CSG.Node(this.clone().polygons);\n    var b = new CSG.Node(csg.clone().polygons);\n    a.clipTo(b);\n    b.clipTo(a);\n    b.invert();\n    b.clipTo(a);\n    b.invert();\n    a.build(b.allPolygons());\n    return CSG.fromPolygons(a.allPolygons());\n  },\n\n  // Return a new CSG solid representing space in this solid but not in the\n  // solid `csg`. Neither this solid nor the solid `csg` are modified.\n  // \n  //     A.subtract(B)\n  // \n  //     +-------+            +-------+\n  //     |       |            |       |\n  //     |   A   |            |       |\n  //     |    +--+----+   =   |    +--+\n  //     +----+--+    |       +----+\n  //          |   B   |\n  //          |       |\n  //          +-------+\n  // \n  subtract: function(csg) {\n    var a = new CSG.Node(this.clone().polygons);\n    var b = new CSG.Node(csg.clone().polygons);\n    a.invert();\n    a.clipTo(b);\n    b.clipTo(a);\n    b.invert();\n    b.clipTo(a);\n    b.invert();\n    a.build(b.allPolygons());\n    a.invert();\n    return CSG.fromPolygons(a.allPolygons());\n  },\n\n  // Return a new CSG solid representing space both this solid and in the\n  // solid `csg`. Neither this solid nor the solid `csg` are modified.\n  // \n  //     A.intersect(B)\n  // \n  //     +-------+\n  //     |       |\n  //     |   A   |\n  //     |    +--+----+   =   +--+\n  //     +----+--+    |       +--+\n  //          |   B   |\n  //          |       |\n  //          +-------+\n  // \n  intersect: function(csg) {\n    var a = new CSG.Node(this.clone().polygons);\n    var b = new CSG.Node(csg.clone().polygons);\n    a.invert();\n    b.clipTo(a);\n    b.invert();\n    a.clipTo(b);\n    b.clipTo(a);\n    a.build(b.allPolygons());\n    a.invert();\n    return CSG.fromPolygons(a.allPolygons());\n  },\n\n  // Return a new CSG solid with solid and empty space switched. This solid is\n  // not modified.\n  inverse: function() {\n    var csg = this.clone();\n    csg.polygons.map(function(p) { p.flip(); });\n    return csg;\n  }\n};\n\n// Construct an axis-aligned solid cuboid. Optional parameters are `center` and\n// `radius`, which default to `[0, 0, 0]` and `[1, 1, 1]`. The radius can be\n// specified using a single number or a list of three numbers, one for each axis.\n// \n// Example code:\n// \n//     var cube = CSG.cube({\n//       center: [0, 0, 0],\n//       radius: 1\n//     });\nCSG.cube = function(options) {\n  options = options || {};\n  var c = new CSG.Vector(options.center || [0, 0, 0]);\n  var r = !options.radius ? [1, 1, 1] : options.radius.length ?\n           options.radius : [options.radius, options.radius, options.radius];\n  return CSG.fromPolygons([\n    [[0, 4, 6, 2], [-1, 0, 0]],\n    [[1, 3, 7, 5], [+1, 0, 0]],\n    [[0, 1, 5, 4], [0, -1, 0]],\n    [[2, 6, 7, 3], [0, +1, 0]],\n    [[0, 2, 3, 1], [0, 0, -1]],\n    [[4, 5, 7, 6], [0, 0, +1]]\n  ].map(function(info) {\n    return new CSG.Polygon(info[0].map(function(i) {\n      var pos = new CSG.Vector(\n        c.x + r[0] * (2 * !!(i & 1) - 1),\n        c.y + r[1] * (2 * !!(i & 2) - 1),\n        c.z + r[2] * (2 * !!(i & 4) - 1)\n      );\n      return new CSG.Vertex(pos, new CSG.Vector(info[1]));\n    }));\n  }));\n};\n\n// Construct a solid sphere. Optional parameters are `center`, `radius`,\n// `slices`, and `stacks`, which default to `[0, 0, 0]`, `1`, `16`, and `8`.\n// The `slices` and `stacks` parameters control the tessellation along the\n// longitude and latitude directions.\n// \n// Example usage:\n// \n//     var sphere = CSG.sphere({\n//       center: [0, 0, 0],\n//       radius: 1,\n//       slices: 16,\n//       stacks: 8\n//     });\nCSG.sphere = function(options) {\n  options = options || {};\n  var c = new CSG.Vector(options.center || [0, 0, 0]);\n  var r = options.radius || 1;\n  var slices = options.slices || 16;\n  var stacks = options.stacks || 8;\n  var polygons = [], vertices;\n  function vertex(theta, phi) {\n    theta *= Math.PI * 2;\n    phi *= Math.PI;\n    var dir = new CSG.Vector(\n      Math.cos(theta) * Math.sin(phi),\n      Math.cos(phi),\n      Math.sin(theta) * Math.sin(phi)\n    );\n    vertices.push(new CSG.Vertex(c.plus(dir.times(r)), dir));\n  }\n  for (var i = 0; i < slices; i++) {\n    for (var j = 0; j < stacks; j++) {\n      vertices = [];\n      vertex(i / slices, j / stacks);\n      if (j > 0) vertex((i + 1) / slices, j / stacks);\n      if (j < stacks - 1) vertex((i + 1) / slices, (j + 1) / stacks);\n      vertex(i / slices, (j + 1) / stacks);\n      polygons.push(new CSG.Polygon(vertices));\n    }\n  }\n  return CSG.fromPolygons(polygons);\n};\n\n// Construct a solid cylinder. Optional parameters are `start`, `end`,\n// `radius`, and `slices`, which default to `[0, -1, 0]`, `[0, 1, 0]`, `1`, and\n// `16`. The `slices` parameter controls the tessellation.\n// \n// Example usage:\n// \n//     var cylinder = CSG.cylinder({\n//       start: [0, -1, 0],\n//       end: [0, 1, 0],\n//       radius: 1,\n//       slices: 16\n//     });\nCSG.cylinder = function(options) {\n  options = options || {};\n  var s = new CSG.Vector(options.start || [0, -1, 0]);\n  var e = new CSG.Vector(options.end || [0, 1, 0]);\n  var ray = e.minus(s);\n  var r = options.radius || 1;\n  var slices = options.slices || 16;\n  var axisZ = ray.unit(), isY = (Math.abs(axisZ.y) > 0.5);\n  var axisX = new CSG.Vector(isY, !isY, 0).cross(axisZ).unit();\n  var axisY = axisX.cross(axisZ).unit();\n  var start = new CSG.Vertex(s, axisZ.negated());\n  var end = new CSG.Vertex(e, axisZ.unit());\n  var polygons = [];\n  function point(stack, slice, normalBlend) {\n    var angle = slice * Math.PI * 2;\n    var out = axisX.times(Math.cos(angle)).plus(axisY.times(Math.sin(angle)));\n    var pos = s.plus(ray.times(stack)).plus(out.times(r));\n    var normal = out.times(1 - Math.abs(normalBlend)).plus(axisZ.times(normalBlend));\n    return new CSG.Vertex(pos, normal);\n  }\n  for (var i = 0; i < slices; i++) {\n    var t0 = i / slices, t1 = (i + 1) / slices;\n    polygons.push(new CSG.Polygon([start, point(0, t0, -1), point(0, t1, -1)]));\n    polygons.push(new CSG.Polygon([point(0, t1, 0), point(0, t0, 0), point(1, t0, 0), point(1, t1, 0)]));\n    polygons.push(new CSG.Polygon([end, point(1, t1, 1), point(1, t0, 1)]));\n  }\n  return CSG.fromPolygons(polygons);\n};\n\n// # class Vector\n\n// Represents a 3D vector.\n// \n// Example usage:\n// \n//     new CSG.Vector(1, 2, 3);\n//     new CSG.Vector([1, 2, 3]);\n//     new CSG.Vector({ x: 1, y: 2, z: 3 });\n\nCSG.Vector = function(x, y, z) {\n  if (arguments.length == 3) {\n    this.x = x;\n    this.y = y;\n    this.z = z;\n  } else if ('x' in x) {\n    this.x = x.x;\n    this.y = x.y;\n    this.z = x.z;\n  } else {\n    this.x = x[0];\n    this.y = x[1];\n    this.z = x[2];\n  }\n};\n\nCSG.Vector.prototype = {\n  clone: function() {\n    return new CSG.Vector(this.x, this.y, this.z);\n  },\n\n  negated: function() {\n    return new CSG.Vector(-this.x, -this.y, -this.z);\n  },\n\n  plus: function(a) {\n    return new CSG.Vector(this.x + a.x, this.y + a.y, this.z + a.z);\n  },\n\n  minus: function(a) {\n    return new CSG.Vector(this.x - a.x, this.y - a.y, this.z - a.z);\n  },\n\n  times: function(a) {\n    return new CSG.Vector(this.x * a, this.y * a, this.z * a);\n  },\n\n  dividedBy: function(a) {\n    return new CSG.Vector(this.x / a, this.y / a, this.z / a);\n  },\n\n  dot: function(a) {\n    return this.x * a.x + this.y * a.y + this.z * a.z;\n  },\n\n  lerp: function(a, t) {\n    return this.plus(a.minus(this).times(t));\n  },\n\n  length: function() {\n    return Math.sqrt(this.dot(this));\n  },\n\n  unit: function() {\n    return this.dividedBy(this.length());\n  },\n\n  cross: function(a) {\n    return new CSG.Vector(\n      this.y * a.z - this.z * a.y,\n      this.z * a.x - this.x * a.z,\n      this.x * a.y - this.y * a.x\n    );\n  }\n};\n\n// # class Vertex\n\n// Represents a vertex of a polygon. Use your own vertex class instead of this\n// one to provide additional features like texture coordinates and vertex\n// colors. Custom vertex classes need to provide a `pos` property and `clone()`,\n// `flip()`, and `interpolate()` methods that behave analogous to the ones\n// defined by `CSG.Vertex`. This class provides `normal` so convenience\n// functions like `CSG.sphere()` can return a smooth vertex normal, but `normal`\n// is not used anywhere else.\n\nCSG.Vertex = function(pos, normal) {\n  this.pos = new CSG.Vector(pos);\n  this.normal = new CSG.Vector(normal);\n};\n\nCSG.Vertex.prototype = {\n  clone: function() {\n    return new CSG.Vertex(this.pos.clone(), this.normal.clone());\n  },\n\n  // Invert all orientation-specific data (e.g. vertex normal). Called when the\n  // orientation of a polygon is flipped.\n  flip: function() {\n    this.normal = this.normal.negated();\n  },\n\n  // Create a new vertex between this vertex and `other` by linearly\n  // interpolating all properties using a parameter of `t`. Subclasses should\n  // override this to interpolate additional properties.\n  interpolate: function(other, t) {\n    return new CSG.Vertex(\n      this.pos.lerp(other.pos, t),\n      this.normal.lerp(other.normal, t)\n    );\n  }\n};\n\n// # class Plane\n\n// Represents a plane in 3D space.\n\nCSG.Plane = function(normal, w) {\n  this.normal = normal;\n  this.w = w;\n};\n\n// `CSG.Plane.EPSILON` is the tolerance used by `splitPolygon()` to decide if a\n// point is on the plane.\nCSG.Plane.EPSILON = 1e-5;\n\nCSG.Plane.fromPoints = function(a, b, c) {\n  var n = b.minus(a).cross(c.minus(a)).unit();\n  return new CSG.Plane(n, n.dot(a));\n};\n\nCSG.Plane.prototype = {\n  clone: function() {\n    return new CSG.Plane(this.normal.clone(), this.w);\n  },\n\n  flip: function() {\n    this.normal = this.normal.negated();\n    this.w = -this.w;\n  },\n\n  // Split `polygon` by this plane if needed, then put the polygon or polygon\n  // fragments in the appropriate lists. Coplanar polygons go into either\n  // `coplanarFront` or `coplanarBack` depending on their orientation with\n  // respect to this plane. Polygons in front or in back of this plane go into\n  // either `front` or `back`.\n  splitPolygon: function(polygon, coplanarFront, coplanarBack, front, back) {\n    var COPLANAR = 0;\n    var FRONT = 1;\n    var BACK = 2;\n    var SPANNING = 3;\n\n    // Classify each point as well as the entire polygon into one of the above\n    // four classes.\n    var polygonType = 0;\n    var types = [];\n    for (var i = 0; i < polygon.vertices.length; i++) {\n      var t = this.normal.dot(polygon.vertices[i].pos) - this.w;\n      var type = (t < -CSG.Plane.EPSILON) ? BACK : (t > CSG.Plane.EPSILON) ? FRONT : COPLANAR;\n      polygonType |= type;\n      types.push(type);\n    }\n\n    // Put the polygon in the correct list, splitting it when necessary.\n    switch (polygonType) {\n      case COPLANAR:\n        (this.normal.dot(polygon.plane.normal) > 0 ? coplanarFront : coplanarBack).push(polygon);\n        break;\n      case FRONT:\n        front.push(polygon);\n        break;\n      case BACK:\n        back.push(polygon);\n        break;\n      case SPANNING:\n        var f = [], b = [];\n        for (var i = 0; i < polygon.vertices.length; i++) {\n          var j = (i + 1) % polygon.vertices.length;\n          var ti = types[i], tj = types[j];\n          var vi = polygon.vertices[i], vj = polygon.vertices[j];\n          if (ti != BACK) f.push(vi);\n          if (ti != FRONT) b.push(ti != BACK ? vi.clone() : vi);\n          if ((ti | tj) == SPANNING) {\n            var t = (this.w - this.normal.dot(vi.pos)) / this.normal.dot(vj.pos.minus(vi.pos));\n            var v = vi.interpolate(vj, t);\n            f.push(v);\n            b.push(v.clone());\n          }\n        }\n        if (f.length >= 3) front.push(new CSG.Polygon(f, polygon.shared));\n        if (b.length >= 3) back.push(new CSG.Polygon(b, polygon.shared));\n        break;\n    }\n  }\n};\n\n// # class Polygon\n\n// Represents a convex polygon. The vertices used to initialize a polygon must\n// be coplanar and form a convex loop. They do not have to be `CSG.Vertex`\n// instances but they must behave similarly (duck typing can be used for\n// customization).\n// \n// Each convex polygon has a `shared` property, which is shared between all\n// polygons that are clones of each other or were split from the same polygon.\n// This can be used to define per-polygon properties (such as surface color).\n\nCSG.Polygon = function(vertices, shared) {\n  this.vertices = vertices;\n  this.shared = shared;\n  this.plane = CSG.Plane.fromPoints(vertices[0].pos, vertices[1].pos, vertices[2].pos);\n};\n\nCSG.Polygon.prototype = {\n  clone: function() {\n    var vertices = this.vertices.map(function(v) { return v.clone(); });\n    return new CSG.Polygon(vertices, this.shared);\n  },\n\n  flip: function() {\n    this.vertices.reverse().map(function(v) { v.flip(); });\n    this.plane.flip();\n  }\n};\n\n// # class Node\n\n// Holds a node in a BSP tree. A BSP tree is built from a collection of polygons\n// by picking a polygon to split along. That polygon (and all other coplanar\n// polygons) are added directly to that node and the other polygons are added to\n// the front and/or back subtrees. This is not a leafy BSP tree since there is\n// no distinction between internal and leaf nodes.\n\nCSG.Node = function(polygons) {\n  this.plane = null;\n  this.front = null;\n  this.back = null;\n  this.polygons = [];\n  if (polygons) this.build(polygons);\n};\n\nCSG.Node.prototype = {\n  clone: function() {\n    var node = new CSG.Node();\n    node.plane = this.plane && this.plane.clone();\n    node.front = this.front && this.front.clone();\n    node.back = this.back && this.back.clone();\n    node.polygons = this.polygons.map(function(p) { return p.clone(); });\n    return node;\n  },\n\n  // Convert solid space to empty space and empty space to solid space.\n  invert: function() {\n    for (var i = 0; i < this.polygons.length; i++) {\n      this.polygons[i].flip();\n    }\n    this.plane.flip();\n    if (this.front) this.front.invert();\n    if (this.back) this.back.invert();\n    var temp = this.front;\n    this.front = this.back;\n    this.back = temp;\n  },\n\n  // Recursively remove all polygons in `polygons` that are inside this BSP\n  // tree.\n  clipPolygons: function(polygons) {\n    if (!this.plane) return polygons.slice();\n    var front = [], back = [];\n    for (var i = 0; i < polygons.length; i++) {\n      this.plane.splitPolygon(polygons[i], front, back, front, back);\n    }\n    if (this.front) front = this.front.clipPolygons(front);\n    if (this.back) back = this.back.clipPolygons(back);\n    else back = [];\n    return front.concat(back);\n  },\n\n  // Remove all polygons in this BSP tree that are inside the other BSP tree\n  // `bsp`.\n  clipTo: function(bsp) {\n    this.polygons = bsp.clipPolygons(this.polygons);\n    if (this.front) this.front.clipTo(bsp);\n    if (this.back) this.back.clipTo(bsp);\n  },\n\n  // Return a list of all polygons in this BSP tree.\n  allPolygons: function() {\n    var polygons = this.polygons.slice();\n    if (this.front) polygons = polygons.concat(this.front.allPolygons());\n    if (this.back) polygons = polygons.concat(this.back.allPolygons());\n    return polygons;\n  },\n\n  // Build a BSP tree out of `polygons`. When called on an existing tree, the\n  // new polygons are filtered down to the bottom of the tree and become new\n  // nodes there. Each set of polygons is partitioned using the first polygon\n  // (no heuristic is used to pick a good split).\n  build: function(polygons) {\n    if (!polygons.length) return;\n    if (!this.plane) this.plane = polygons[0].plane.clone();\n    var front = [], back = [];\n    for (var i = 0; i < polygons.length; i++) {\n      this.plane.splitPolygon(polygons[i], this.polygons, this.polygons, front, back);\n    }\n    if (front.length) {\n      if (!this.front) this.front = new CSG.Node();\n      this.front.build(front);\n    }\n    if (back.length) {\n      if (!this.back) this.back = new CSG.Node();\n      this.back.build(back);\n    }\n  }\n};\n"
  },
  {
    "path": "browser/plugins/cubemap_assembler.plugin.js",
    "content": "(function() {\n\tvar CubemapAssembler = E2.plugins.cubemap_assembler = function(core, node) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.input_slots = [{\n\t\t\tname: \"positive x\", dt: E2.dt.TEXTURE,\n\t\t\tdesc: \"Positive X texture face\"\n\t\t},{\n\t\t\tname: \"negative x\", dt: E2.dt.TEXTURE,\n\t\t\tdesc: \"Negative X texture face\"\n\t\t},{\n\t\t\tname: \"positive y\", dt: E2.dt.TEXTURE,\n\t\t\tdesc: \"Positive Y texture face\"\n\t\t},{\n\t\t\tname: \"negative y\", dt: E2.dt.TEXTURE,\n\t\t\tdesc: \"Negative Y texture face\"\n\t\t},{\n\t\t\tname: \"positive z\", dt: E2.dt.TEXTURE,\n\t\t\tdesc: \"Positive Z texture face\"\n\t\t},{\n\t\t\tname: \"negative z\", dt: E2.dt.TEXTURE,\n\t\t\tdesc: \"Negative Z texture face\"\n\t\t}]\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'cube texture',\n\t\t\tdt: E2.dt.CUBETEXTURE\n\t\t}]\n\t}\n\n\tCubemapAssembler.prototype = Object.create(Plugin.prototype)\n\n\tCubemapAssembler.prototype.reset = function() {\n\t}\n\n\tCubemapAssembler.prototype.update_input = function() {\n\t\tthis.cubemapDirty = true\n\t}\n\n\tCubemapAssembler.prototype.update_state = function() {\n\t\tif (this.cubemapDirty) {\n\t\t\tvar deftex = E2.core.assetLoader.defaultTexture\n\t\t\tvar textures = [\n\t\t\t\t(this.inputValues['positive x'] || deftex).image, (this.inputValues['negative x'] || deftex).image,\n\t\t\t\t(this.inputValues['positive y'] || deftex).image, (this.inputValues['negative y'] || deftex).image,\n\t\t\t\t(this.inputValues['positive z'] || deftex).image, (this.inputValues['negative z'] || deftex).image]\n\n\t\t\tthis.cubemap = new THREE.CubeTexture(textures)\n\t\t\tthis.cubemap.needsUpdate = true\n\t\t\tthis.cubemap.format = THREE.RGBFormat\n\t\t\tthis.cubemapDirty = false\n\t\t}\n\t}\n\n\tCubemapAssembler.prototype.update_output = function() {\n\t\treturn this.cubemap\n\t}\n})()"
  },
  {
    "path": "browser/plugins/curve_interpolate_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"curve_interpolate_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Interpolates the keypoints of a curve JSON object over time and loops if the bounds of the keypoints are exceeded.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'curve', dt: core.datatypes.OBJECT, desc: 'The curve object to interpolate.', def: null },\n\t\t{ name: 'time', dt: core.datatypes.FLOAT, desc: 'The time to use for interpolation.', def: 0.0 } \n\t];\n\t\n\tthis.output_slots = [ \n\t\t{ name: 'position', dt: core.datatypes.VECTOR, desc: 'The interpolated position.', def: [0.0, 0.0, 0.0] }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.curve = null;\n\tthis.time = 0.0;\n\tthis.vector = [0.0, 0.0, 0.0]\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t{\n\t\tvar bad = 'The supplied curve object is invalid: ';\n\t\t\n\t\tthis.curve = null;\n\t\tvar props = ['count', 'x', 'y', 'z'];\n\t\t\n\t\tfor(var i = 0; i < props.length; i++)\n\t\t{\n\t\t\tif(!data.hasOwnProperty(props[i]))\n\t\t\t{\n\t\t\t\tmsg(bad + 'No \"' + props[i] + '\" property');\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t\n\t\tprops = ['x', 'y', 'z'];\n\t\t\n\t\tfor(var i = 0; i < props.length; i++)\n\t\t{\n\t\t\tif(Object.prototype.toString.call(data[props[i]]) !== '[object Array]')\n\t\t\t{\n\t\t\t\tmsg(bad + 'The \"' + props[i] + '\" property is not an array');\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t\n\t\tthis.curve = data;\n\t}\n\telse\n\t\tthis.time = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tif(!this.curve)\n\t{\n\t\tthis.x = this.y = this.z = 0.0;\n\t\treturn;\n\t}\n\t\n\tvar l = this.curve.count - 1;\n\tvar i0 = Math.floor(this.time) % l;\n\tvar i1 = (i0 + 1) % l;\n\tvar i2 = (i0 + 2) % l;\n\tvar i3 = (i0 + 3) % l;\n\tvar t = (this.time % l) - i0;\n\tvar it = 1.0 - t;\n\tvar xs = this.curve.x;\n\tvar ys = this.curve.y;\n\tvar zs = this.curve.z;\n\t\n\tvar d1 = (xs[i2] - xs[i0]) * 0.5;\n\tvar d2 = (xs[i3] - xs[i1]) * 0.5;\n\t\n\tthis.vector[0] = xs[i1] + (d1 * t) + (((3.0 * (xs[i2] - xs[i1])) - (2.0 * d1) - d2) * t * t) + ((d1 + d2 + (2.0 * (-xs[i2] + xs[i1]))) * t * t * t);\n\td1 = (ys[i2] - ys[i0]) * 0.5;\n\td2 = (ys[i3] - ys[i1]) * 0.5;\n\tthis.vector[1] = ys[i1] + (d1 * t) + (((3.0 * (ys[i2] - ys[i1])) - (2.0 * d1) - d2) * t * t) + ((d1 + d2 + (2.0 * (-ys[i2] + ys[i1]))) * t * t * t);\n\td1 = (zs[i2] - zs[i0]) * 0.5;\n\td2 = (zs[i3] - zs[i1]) * 0.5;\n\tthis.vector[2] = zs[i1] + (d1 * t) + (((3.0 * (zs[i2] - zs[i1])) - (2.0 * d1) - d2) * t * t) + ((d1 + d2 + (2.0 * (-zs[i2] + zs[i1]))) * t * t * t);\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.vector;\n};\n\n"
  },
  {
    "path": "browser/plugins/data_info_display.plugin.js",
    "content": "E2.p = E2.plugins[\"data_info_display\"] = function(core, node)\n{\n\tthis.desc = 'Displays metrics about the input value and its type.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'any', dt: core.datatypes.ANY, desc: 'Input value to be analyzed.', def: null }\n\t];\n\t\n\tthis.output_slots = [];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.update_value(null);\n}\n\nE2.p.prototype.create_ui = function()\n{\n\tthis.label = make('pre');\n\tthis.update_value(null);\n\t\n\treturn this.label;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.update_value(data);\n};\n\nE2.p.prototype.update_value = function(value)\n{\n\tif(this.label)\n\t{\n\t\tvar typeOf = function(obj)\n\t\t{\n\t\t\ttype = typeof(obj);\n\t\t\t\n\t\t\treturn type === 'object' && !obj ? 'null' : type;\n\t\t};\n\n\t\tvar introspect = function(name, obj, indent, level)\n\t\t{\n\t\t\tindent = indent || '  ';\n\t\t\t\n\t\t\tif(typeOf(level) !== 'number')\n\t\t\t\tlevel = 1;\n\t\t\t\n\t\t\tvar objType = typeOf(obj);\n\t\t\t\n\t\t\tif(objType === 'function')\n\t\t\t\treturn '';\n\t\t\t\n\t\t\tvar result = indent + name + '(' + objType + ') :';\n\t\t\t\n\t\t\tif(objType === \"object\")\n\t\t\t{\n\t\t\t\tif(level > 0)\n\t\t\t\t{\n\t\t\t\t\tindent += '  ';\n\t\t\t\t\t\n\t\t\t\t\tfor(prop in obj)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar prop = introspect(prop, obj[prop], indent, level - 1);\n\t\t\t\t\t\t\n\t\t\t\t\t\tresult += \"\\n\" + prop;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn result;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\treturn result + ' ...';\n\t\t\t} \n\t\t\telse if(objType === 'null')\n\t\t\t\treturn result + ' null';\n\t\n\t\t\treturn result + ' ' + obj;\n\t\t};\n\t\t\n\t\tthis.label[0].innerHTML = introspect('', value);\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/delta_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"delta_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits the derivative of the incoming <b>value</b>.';\n\t\n\tthis.input_slots = \n\t[ \n\t\t{ name: 'reset', dt: core.datatypes.BOOL, desc: 'Send true to this slot to clear the internal state.', def: false },\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Input value.', def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'delta', dt: core.datatypes.FLOAT, desc: 'The delta value from the last frame update.', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.input_val = 0.0;\n\tthis.last_val = 0.0;\n\tthis.output_val = 0.0;\n\tthis.clear = false;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.clear = data;\n\telse if(slot.index === 1)\n\t\tthis.input_val = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tif(this.clear)\n\t{\n\t\tthis.output_val = 0.0;\n\t\tthis.clear = false;\n\t}\n\telse\n\t\tthis.output_val = this.input_val - this.last_val;\n\n\tthis.last_val = this.input_val;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.output_val;\n};\n"
  },
  {
    "path": "browser/plugins/delta_t_generator.plugin.js",
    "content": "E2.p = E2.plugins[\"delta_t_generator\"] = function(core, node)\n{\n\tthis.desc = 'Emits the current frame delta time in seconds.';\n\t\n\tthis.input_slots = [];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'seconds', dt: core.datatypes.FLOAT, desc: 'Last frame delta time in seconds.' }\n\t];\n\t\n\tthis.core = core;\n};\n\nE2.p.prototype.update_state = function(updateContext)\n{\n\tthis.delta_t = updateContext.delta_t\n\t// Ensure that we continously update\n\tthis.updated = true;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.delta_t;\n};\n"
  },
  {
    "path": "browser/plugins/divide_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"divide_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Divides <b>value</b> by <b>scalar</b> and emits the result.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Input value to be divided.', def: 0.0 },\n\t\t{ name: 'scalar', dt: core.datatypes.FLOAT, desc: 'Factor to divide <b>value</b> by.', def: 1.0 } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'result', dt: core.datatypes.FLOAT, desc: 'Emits <b>value</b> / <b>scalar</b>.', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0.0;\n\tthis.scalar = 1.0;\n\tthis.result = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.value = data;\n\telse\n\t\tthis.scalar = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.result = this.value / this.scalar;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.result;\n};\n"
  },
  {
    "path": "browser/plugins/entity.plugin.js",
    "content": "(function() {\n\nvar EntityPlugin = E2.plugins.entity = function() {\n\tAbstractEntityPlugin.apply(this, arguments)\n\tthis.desc = '3D Entity Patch'\n}\n\nEntityPlugin.prototype = Object.create(AbstractEntityPlugin.prototype)\n\n})()\n"
  },
  {
    "path": "browser/plugins/entity_component.plugin.js",
    "content": "(function() {\n\nvar EntityComponentPlugin = E2.plugins.entity_component = function(core) {\n\tAbstractGraphPlugin.apply(this, arguments)\n\n\tthis.desc = 'Entity Component Patch. Contains a behavior for a 3D Entity.'\n}\n\nEntityComponentPlugin.prototype = Object.create(AbstractGraphPlugin.prototype)\n\n})()"
  },
  {
    "path": "browser/plugins/envelope/envelopeEditor.js",
    "content": "(function() {\n\nfunction EnvelopeEditor() {\n\tEventEmitter.call(this)\n\n\tthis._data = [ [0, 0.5], [1, 0.5] ]\n\tthis._width = 300\n\tthis._height = 150\n\n\tthis._id = Math.floor(Math.random() * 10000)\n\n\tthis._dataToPoints()\n}\n\nEnvelopeEditor.prototype = Object.create(EventEmitter.prototype)\n\nEnvelopeEditor.prototype._dataToPoints = function() {\n\tthis._points = this._data.map(function(point) {\n\t\treturn [\n\t\t\tMath.floor(point[0] * this._width),\n\t\t\tthis._height - Math.floor(point[1] * this._height)\n\t\t]\n\t}.bind(this))\n}\n\nEnvelopeEditor.prototype._pointsToData = function() {\n\tthis._data = this._points.map(function(point) {\n\t\treturn [\n\t\t\tpoint[0] / this._width,\n\t\t\t(this._height - point[1]) / this._height\n\t\t]\n\t}.bind(this))\n}\n\nEnvelopeEditor.prototype.data = function(d) {\n\tthis._data = d\n\tthis._dataToPoints()\n\treturn this\n}\n\nEnvelopeEditor.prototype.onChanged = function() {\n\tthis._pointsToData()\n\tthis.emit('changed', this._data)\n}\n\nEnvelopeEditor.prototype.destroy = function() {\n\tthis._$el.empty().remove()\n}\n\nEnvelopeEditor.prototype.render = function($out) {\n\tvar that = this\n\tvar width = this._width, height = this._height\n\tvar dragged = null\n\tvar deleting = false\n\n\tthis._$el = $out\n\n\tvar line = d3.svg.line()\n\n\tvar svg = d3.select($out[0]).append('svg')\n\t\t.attr('width', width)\n\t\t.attr('height', height)\n\t\t.attr('tabindex', 1)\n\n\tsvg.append('rect')\n\t\t.attr('width', width)\n\t\t.attr('height', height)\n\t\t.on('mousedown', svgMouseDown)\n\n\tvar $path = svg.append('path')\n\n\tfunction redraw() {\n\t\t$path\n\t\t\t.datum(that._points)\n\t\t\t.attr('class', 'line')\n\n\t\tif (svg.node().focus)\n\t\t\tsvg.node().focus()\n\n\t\tsvg.select('path').attr('d', line)\n\n\t\tvar circle = svg.selectAll('circle')\n\t\t.data(that._points, function(d) {\n\t\t\treturn d\n\t\t})\n\n\t\tcircle.enter().append('circle')\n\t\t.attr('r', 1e-6)\n\t\t.on('mousedown', function(d) {\n\t\t\ttrackMouseMovement()\n\t\t\tdragged = d\n\t\t\tdeleting = true\n\t\t\tredraw()\n\t\t})\n\t\t.transition()\n\t\t.duration(750)\n\t\t.ease('elastic')\n\t\t.attr('r', 6.5)\n\n\t\tcircle\n\t\t.attr('cx', function(d) { return d[0] })\n\t\t.attr('cy', function(d) { return d[1] })\n\n\t\tcircle.exit().remove()\n\n\t\tif (d3.event) {\n\t\t\td3.event.preventDefault()\n\t\t\td3.event.stopPropagation()\n\t\t}\n\t}\n\n\tfunction trackMouseMovement() {\n\t\td3.select(window)\n\t\t\t.on('mousemove.'+that._id, mousemove)\n\t\t\t.on('mouseup.'+that._id, mouseup)\n\t}\n\n\tfunction svgMouseDown() {\n\t\ttrackMouseMovement()\n\t\tvar x = d3.mouse(svg.node())[0]\n\t\tvar prevCircle\n\n\t\tthat._points.forEach(function(cxy, i) {\n\t\t\tif (cxy[0] < x)\n\t\t\t\tprevCircle = i\n\t\t})\n\n\t\tthat._points.splice(prevCircle+1, 0, dragged = d3.mouse(svg.node()))\n\n\t\tredraw()\n\t}\n\n\tfunction allowed(direction) {\n\t\tvar x = dragged[0]\n\t\tvar ci = that._points.indexOf(dragged)\n\t\tvar limit = 0\n\n\t\tif (ci === 0 || ci === (that._points.length- 1 ))\n\t\t\treturn false\n\n\t\tif (direction > 0)\n\t\t\tlimit = width\n\n\t\tif (that._points[ci + direction])\n\t\t\tlimit = that._points[ci + direction][0]\n\n\t\treturn (direction === 1 && x < limit) ||\n\t\t\t(direction === -1 && x > limit)\n\t}\n\n\tfunction sign(i) {\n\t\treturn i > 0 ? 1 : - 1\n\t}\n\n\tfunction mousemove() {\n\t\tif (!dragged)\n\t\t\treturn\n\n\t\tvar m = d3.mouse(svg.node())\n\n\t\tdeleting = false\n\n\t\tvar direction = sign(m[0] - dragged[0])\n\n\t\tif (direction !== 0 && !allowed(direction))\n\t\t\tm[0] = dragged[0]\n\n\t\tdragged[0] = Math.max(0, Math.min(width, m[0]))\n\t\tdragged[1] = Math.max(0, Math.min(height, m[1]))\n\n\t\tredraw()\n\t}\n\n\tfunction mouseup() {\n\t\td3.select(window)\n\t\t\t.on('mousemove.'+that._id, null)\n\t\t\t.on('mouseup.'+that._id, null)\n\n\t\tif (!dragged)\n\t\t\treturn\n\n\t\tif (deleting) {\n\t\t\tthat._points = that._points.filter(function(pt) {\n\t\t\t\treturn pt[0] !== dragged[0] &&\n\t\t\t\t\tpt[1] !== dragged[1]\n\t\t\t})\n\n\t\t\tdeleting = false\n\t\t}\n\n\t\tthat.onChanged()\n\n\t\tdragged = null\n\t}\n\n\tthis.redraw = redraw\n\n\tredraw()\n\n\treturn this\n}\n\nE2.EnvelopeEditor = EnvelopeEditor\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = EnvelopeEditor\n\n})()\n"
  },
  {
    "path": "browser/plugins/envelope_modulator.plugin.js",
    "content": "(function() {\n\nvar EnvelopePlugin = E2.plugins.envelope_modulator = function EnvelopePlugin(core, node) {\n\tPlugin.apply(this, arguments)\n\n\tthis.desc = 'Envelope modulator'\n\t\n\tthis.input_slots = [\n\t\t{ name: 'x', dt: core.datatypes.FLOAT, desc: 'X value to pick Y with', def: 0 }\n\t]\n\n\tthis.output_slots = [\n\t\t{ name: 'y', dt: core.datatypes.FLOAT, desc: 'The value at x', def: 0 }\n\t]\n\n\tthis.x = this.value = 0.0\n\n\tthis.state = { points: [ [0, 0], [1, 1] ]  } // default line bottom left to top right\n\n\tthis.node = node\n\tthis._core = core\n\n\tthis.loaded = false\n}\n\nEnvelopePlugin.prototype = Object.create(Plugin.prototype)\n\nEnvelopePlugin.prototype.create_ui = function() {\n\tvar that = this\n\n\tif (this._$ui)\n\t\treturn this._$ui\n\n\tvar $ui = this._$ui = $('<div class=\"envelope-editor\">')\n\n\tthis._loadScripts(function() {\n\t\tthat._loaded = true\n\t\tthat._redrawEditor()\n\n\t\tthat.node.on('pluginStateChanged', function() {\n\t\t\tthat.dirty = that.updated = true\n\t\t\tthat._editor\n\t\t\t\t.data(that.state.points)\n\t\t\t\t.redraw()\n\t\t})\n\t})\n\n\treturn $ui\n}\n\nEnvelopePlugin.prototype.update_input = function(slot, data) {\n\tthis.x = data % 1.0\n}\n\nEnvelopePlugin.prototype.update_state = function() {\n\tvar l, r, lx = 0.0, rx = 1.0\n\tvar x = this.x\n\n\tfor (var i=0; i < this.state.points.length; i++) {\n\t\tvar pt = this.state.points[i]\n\n\t\tif (pt[0] === x) {\n\t\t\tl = r = pt[1]\n\t\t\tbreak;\n\t\t}\n\n\t\tif (pt[0] < x) {\n\t\t\tlx = pt[0]\n\t\t\tl = pt[1]\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (pt[0] > x) {\n\t\t\trx = pt[0]\n\t\t\tr = pt[1]\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tthis.value = ((x-lx) * (r-l) / (rx-lx)) + l\n}\n\nEnvelopePlugin.prototype.update_output = function(slot) {\n\treturn this.value\n}\n\nEnvelopePlugin.prototype.state_changed = function(ui) {\n\tif (ui) {\n\t\tif (!this._loaded)\n\t\t\treturn;\n\n\t}\n}\n\nEnvelopePlugin.prototype._redrawEditor = function() {\n\tvar that = this\n\n\tif (this._editor)\n\t\tthis._editor.destroy()\n\n\tthis._editor = new E2.EnvelopeEditor()\n\n\tthis._editor\n\t\t.data(that.state.points)\n\t\t.render(this._$ui)\n\t\t.on('changed', function(d) {\n\t\t\tthat.undoableSetState('points', d, that.state.points)\n\t\t})\n\n}\n\nEnvelopePlugin.prototype._loadScripts = function(cb) {\n\tvar that = this\n\tthis._core.add_aux_script('d3/d3.v3.min.js', function() {\n\t\tthat._core.add_aux_script('envelope/envelopeEditor.js', cb)\n\t})\n}\n\n\n}) ();\n"
  },
  {
    "path": "browser/plugins/equals_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"equals_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits true if <b>value</b> equals <b>reference</b> and false otherwise.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'value', dt: core.datatypes.ANY, desc: 'Input value.', def: null },\n\t\t{ name: 'reference', dt: core.datatypes.ANY, desc: 'Reference value to comprate <b>value</b> to.', def: null } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: 'True if <b>value</b> equals <b>reference</b> and false otherwise.', def: false }\n\t];\n\n\tthis.lsg = new LinkedSlotGroup(core, node, [this.input_slots[0], this.input_slots[1]], []);\n\tthis.value = null;\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.ref = null;\n\tthis.state = false;\n};\n\nE2.p.prototype.connection_changed = function(on, conn, slot)\n{\n\tif(this.lsg.connection_changed(on, conn, slot))\n\t\tthis.value = this.ref = this.lsg.core.get_default_value(this.lsg.dt);\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.value = data;\n\telse\n\t\tthis.ref = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.state = (this.value === null || this.ref === null) ? false : this.value === this.ref;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.state;\n};\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t\tthis.value = this.lsg.infer_dt();\n};\n"
  },
  {
    "path": "browser/plugins/exp_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"exp_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Exp(x).';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Input value.', def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'result', dt: core.datatypes.FLOAT, desc: 'exp(<b>value</b>).', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.value = Math.exp(data);\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/float_display.plugin.js",
    "content": "(function() {\n\nvar FloatDisplay = E2.plugins.float_display = function(core, node) {\n\tthis.desc = 'Display the supplied float value on the plugin surface.'\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'float', dt: core.datatypes.FLOAT, desc: 'Input value to be displayed.', def: null }\n\t]\n\t\n\tthis.output_slots = []\n}\n\nFloatDisplay.prototype.reset = function() {\n\tthis.update_value(null)\n}\n\nFloatDisplay.prototype.create_ui = function() {\n\tthis.label = make('div')\n\tthis.label.css('text-align', 'right') \n\tthis.update_value(this.inputValues ? this.inputValues['float'] : null)\n\t\n\treturn this.label\n}\n\nFloatDisplay.prototype.update_input = function(slot, data) {\n\tthis.update_value(data)\n}\n\nFloatDisplay.prototype.update_value = function(value) {\n\tif(this.label)\n\t\tthis.label[0].innerHTML = value === null ? '-' : value.toFixed(2)\n\telse\n\t\tthis.value = value\n}\n\n})()\n"
  },
  {
    "path": "browser/plugins/floor_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"floor_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Round <b>value</b> to the closest lower interger.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Value to be rounded.', def: 0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'result', dt: core.datatypes.FLOAT, desc: 'The rounded result.', def: 0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.value = Math.floor(data);\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/format_string_float.plugin.js",
    "content": "(function() {\n\tvar FormatStringFloat = E2.plugins.format_string_float = function(core) {\n\t\tthis.desc = 'Formats a float as a string.'\n\t\t\n\t\tthis.input_slots = [\n\t\t\t{ name: 'float', dt: core.datatypes.FLOAT, desc: 'Input float to be formatted.', def: 0.0 },\n\t\t\t{ name: 'decimals', dt: core.datatypes.FLOAT, desc: 'Number of decimals to output.', def: 4 } \n\t\t]\n\t\t\n\t\tthis.output_slots = [ \n\t\t\t { name: 'text', dt: core.datatypes.TEXT, desc: 'The input float as a string.', def: '0.0' }\n\t\t]\n\t}\n\n\tFormatStringFloat.prototype.reset = function() {\n\t\tthis.value = 0.0\n\t\tthis.d_count = 4\n\t\tthis.result = '0.0'\n\t}\n\n\tFormatStringFloat.prototype.update_input = function(slot, data) {\n\t\tif (slot.index === 0)\n\t\t\tthis.value = data\n\t\telse\n\t\t\tthis.d_count = Math.round(data)\n\t}\n\n\tFormatStringFloat.prototype.update_state = function() {\n\t\tthis.result = this.value.toFixed(this.d_count)\n\t}\n\n\tFormatStringFloat.prototype.update_output = function() {\n\t\treturn this.result\n\t}\n\n})()\n"
  },
  {
    "path": "browser/plugins/from_mesh_custom_shader.plugin.js",
    "content": "(function() {\n\nvar FromMeshCustomShader = E2.plugins.from_mesh_custom_shader = function(core, node) {\n\tPlugin.apply(this, arguments)\n\t\n\tvar that = this\n\t\n\tthis.desc = 'Auto-generate a shader embedding user-defined main bodies tailored to correctly and optimally render the supplied mesh.'\n\t\n\tthis.input_slots = [\n\t\t { name: 'mesh', dt: core.datatypes.MESH, desc: 'Mesh to adapt the shader to.', def: null },\n\t\t { name: 'material', dt: core.datatypes.MATERIAL, desc: 'The surface material.', def: null }\n\t]\n\t\n\tthis.output_slots = [ \n\t\t{ name: 'shader', dt: core.datatypes.SHADER, desc: 'The resulting shader.' } \n\t]\n\t\n\tthis.state = { \n\t\tvs_src: '',\n\t\tps_src: ''\n\t}\n\n\tthis.core = core\n\tthis.node = node\n\tthis.gl = core.renderer.context\n\tthis.shader = null\n\tthis.slot_data = {}\n\n\tthis.node.on('slotAdded', function(slot) {\n\t\tthat.slot_data[slot.uid] = that.core.get_default_value(E2.slot_type.input, slot.dt)\n\t\tthat.updated = that.dirty = true\n\t\tthat._refreshEditor()\n\t})\n\n\tthis.node.on('slotRemoved', function() {\n\t\tthat.updated = that.dirty = true\n\t\tthat._refreshEditor()\n\t})\n}\n\nFromMeshCustomShader.prototype = Object.create(Plugin.prototype)\n\nFromMeshCustomShader.prototype._refreshEditor = function() {\n\tvar that = this\n\tif (this._editors) {\n\t\t_.each(this._editors, function(ed, which) {\n\t\t\ted.setInputs(that.node.getDynamicInputSlots())\n\t\t})\n\t}\n}\n\nFromMeshCustomShader.prototype.destroy_ui = function() {\n\tvar that = this\n\t_.each(this._editors, function(ed, key) {\n\t\tif (ed.close) {\n\t\t\ted.close()\n\t\t\tdelete that._editors[key]\n\t\t}\n\t})\n}\n\nFromMeshCustomShader.prototype.create_ui = function() {\n\tvar that = this\n\tvar layout = make('div')\n\tvar vertexButton = makeButton('Vertex', 'Click to edit the vertex shader source.')\n\tvar pixelButton = makeButton('Pixel', 'Click to edit the pixel shader source.')\n\n\tthis._editors = {}\n\n\tfunction removeSlot(slotId) {\n\t\tE2.app.graphApi.removeSlot(that.node.parent_graph, that.node, slotId)\n\t}\n\n\tfunction addSlot(name, dt) {\n\t\tE2.app.graphApi.addSlot(that.node.parent_graph, that.node, {\n\t\t\ttype: E2.slot_type.input,\n\t\t\tname: name,\n\t\t\tdt: dt\n\t\t})\n\t}\n\n\tvertexButton.css('width', '55px')\n\tpixelButton.css({ 'width': '55px', 'margin-top': '5px' })\n\n\tfunction createEditor(which, stateKey) {\n\t\tif (that._editors[which]) {\n\t\t\tthat._editors[which].show()\n\t\t\treturn\n\t\t}\n\n\t\tvar title = [which, 'shader'].join(' ')\n\n\t\tthat._editors[which] = E2.ShaderEditor\n\t\t\t.open(title, that.state[stateKey], that.node.getDynamicInputSlots())\n\t\t\t.on('closed', function() {\n\t\t\t\tdelete that._editors[which]\n\t\t\t})\n\t\t\t.on('inputRemoved', function(slotUid, name) {\n\t\t\t\tremoveSlot(slotUid, name)\n\t\t\t})\n\t\t\t.on('inputAdded', function(inputName, dt) {\n\t\t\t\taddSlot(inputName, dt)\n\t\t\t})\n\t\t\t.on('build', function() {\n\t\t\t\tthat.updated = that.dirty = true\n\t\t\t})\n\t\t\t.on('changed', function(v) {\n\t\t\t\tif (v === that.state[stateKey])\n\t\t\t\t\treturn;\n\n\t\t\t\tthat.undoableSetState(stateKey, v, that.state[stateKey])\n\t\t\t})\n\n\t\tthat._editors[which].stateKey = stateKey \n\t\tthat._editors[which]._ace \n\t}\n\n\tvertexButton.click(function() {\n\t\tcreateEditor('vertex', 'vs_src')\n\t})\n\n\tpixelButton.click(function() {\n\t\tcreateEditor('pixel', 'ps_src')\n\t})\n\t\n\tlayout.append(vertexButton, '<br />', pixelButton);\n\n\treturn layout\n}\n\nFromMeshCustomShader.prototype.connection_changed = function(on, conn, slot) {\n\tif (!on && slot.type === E2.slot_type.input) {\n\t\tif(slot.index === 0)\n\t\t\tthis.shader = null\n\t}\n}\n\nFromMeshCustomShader.prototype.rebuild_shader = function() {\n\tvar u_vs = [];\n\tvar u_ps = [];\n\tvar st = this.state;\n\tvar gl = this.gl;\n\tvar dts = this.core.datatypes;\n\tvar that = this;\n\tvar slots, slot\n\n\tslots = this.node.getDynamicInputSlots()\n\tfor(var i=0; i < slots.length; i++) {\n\t\tvar dt = ''\n\t\tslot = slots[i]\n\t\tvar dtid = slot.dt.id\n\t\t\n\t\tif(dtid === dts.FLOAT.id)\n\t\t\tdt = 'float'\n\t\telse if(dtid === dts.TEXTURE.id)\n\t\t\tdt = 'sampler2D'\n\t\telse if(dtid === dts.COLOR.id)\n\t\t\tdt = 'vec4'\n\t\telse if(dtid === dts.MATRIX.id)\n\t\t\tdt = 'mat4'\n\t\telse if(dtid === dts.VECTOR.id)\n\t\t\tdt = 'vec3'\n\n\t\tvar uniform = 'uniform ' + dt + ' ' + slot.name + ';'\n\t\tu_vs.push(uniform)\n\t\tu_ps.push(uniform)\n\t}\n\n\tfunction onCompiled(which) {\n\t\treturn function(err) {\n\t\t\tthat.updated = that.dirty = false;\n\n\t\t\tif (!that._editors || !that._editors[which])\n\t\t\t\treturn;\n\n\t\t\tvar ace = that._editors[which].getAce()\n\t\t\tace.getSession().clearAnnotations()\n\n\t\t\tif (!err)\n\t\t\t\treturn;\n\n\t\t\tace.getSession().setAnnotations(err)\n\t\t}\n\t}\n\n\tthis.shader = ComposeShader(null, \n\t\tthis.mesh, this.material,\n\t\tu_vs, u_ps,\n\t\tst.vs_src,\n\t\tst.ps_src,\n\t\tonCompiled('vertex'),\n\t\tonCompiled('pixel'));\n\n\tif (this.shader.linked) {\n\t\tslots = this.node.getDynamicInputSlots()\n\t\tfor(i=0; i < slots.length; i++) {\n\t\t\tslot = slots[i]\n\t\t\tslot.uniform = gl.getUniformLocation(this.shader.program, slot.name)\n\t\t}\n\t\n\t\tthis.shader.apply_uniforms_custom = function() {\n\t\t\tvar tex_slot = 1\n\t\t\tvar sd = that.slot_data\n\t\t\tvar dts = that.core.datatypes\n\t\t\n\t\t\tslots = that.node.getDynamicInputSlots()\n\n\t\t\tfor(var i=0; i < slots.length; i++) {\n\t\t\t\tvar slot = slots[i]\n\n\t\t\t\tif (!slot.uniform || sd[slot.uid] === undefined || sd[slot.uid] === null)\n\t\t\t\t\tcontinue\n\t\t\t\t\n\t\t\t\tvar dtid = slot.dt.id\n\n\t\t\t\tif (dtid === dts.FLOAT.id)\n\t\t\t\t\tgl.uniform1f(slot.uniform, sd[slot.uid])\n\t\t\t\telse if(dtid === dts.TEXTURE.id) {\n\t\t\t\t\tgl.uniform1i(slot.uniform, tex_slot)\n\t\t\t\t\tsd[slot.uid].enable(gl.TEXTURE0 + tex_slot)\n\t\t\t\t\ttex_slot++\n\t\t\t\t}\n\t\t\t\telse if(dtid === dts.COLOR.id)\n\t\t\t\t\tgl.uniform4fv(slot.uniform, sd[slot.uid])\n\t\t\t\telse if(dtid === dts.MATRIX.id)\n\t\t\t\t\tgl.uniformMatrix4fv(slot.uniform, false, sd[slot.uid])\n\t\t\t\telse if(dtid === dts.VECTOR.id)\n\t\t\t\t\tgl.uniform3fv(slot.uniform, sd[slot.uid])\n\t\t\t}\n\t\t}\n\t}\n\t\n\tif (st.vs_src === '')\n\t\tst.vs_src = this.shader.vs_c_src\n\n\tif (st.ps_src === '')\n\t\tst.ps_src = this.shader.ps_c_src\n}\n\nFromMeshCustomShader.prototype.update_input = function(slot, data)\n{\n\tif(slot.uid === undefined)\n\t{\n\t\tif(slot.index === 0)\n\t\t{\n\t\t\tif(this.mesh !== data)\n\t\t\t{\n\t\t\t\tthis.mesh = data;\n\t\t\t\tthis.dirty = true;\n\t\t\t}\n\t\t}\n\t\telse if(slot.index === 1)\n\t\t{\n\t\t\tthis.material = data;\n\t\t}\n\t}\n\telse\n\t{\n\t\tthis.slot_data[slot.uid] = data;\n\t}\n};\n\nFromMeshCustomShader.prototype.update_state = function()\n{\n\tif(!this.mesh)\n\t\treturn;\n\t\n\tvar caps = Material.get_caps_hash(this.mesh, this.material);\n\n\tif(!this.dirty && this.caps_hash === caps)\n\t{\n\t\tif (this.shader)\n\t\t\tthis.shader.material = this.material;\n\t\treturn;\n\t}\n\t\n\tif(this.dirty || this.caps_hash !== caps)\t\n\t\tthis.rebuild_shader();\n\n\tthis.caps_hash = caps;\n\tthis.updated = true;\n\tthis.dirty = false;\n};\n\nFromMeshCustomShader.prototype.update_output = function(slot)\n{\n\treturn this.shader;\n};\n\nFromMeshCustomShader.prototype.state_changed = function(ui) {\n\tif(!ui) {\n\t\tthis.mesh = null\n\t\tthis.material = null\n\t\tthis.caps_mask = ''\n\t\tthis.dirty = false\n\t} else {\n\t\tthis.core.add_aux_script('ace/src-noconflict/ace.js')\n\t}\n}\n\n})();\n\n"
  },
  {
    "path": "browser/plugins/from_mesh_shader.plugin.js",
    "content": "E2.p = E2.plugins[\"from_mesh_shader\"] = function(core, node)\n{\n\tthis.desc = 'Auto-generate a shader tailored to correctly and optimally render the supplied mesh.';\n\t\n\tthis.input_slots = [\n\t\t { name: 'mesh', dt: core.datatypes.MESH, desc: 'Mesh to adapt the shader to.', def: null },\n\t\t { name: 'material', dt: core.datatypes.MATERIAL, desc: 'The surface material.', def: null }\n\t];\n\t\n\tthis.output_slots = [ \n\t\t{ name: 'shader', dt: core.datatypes.SHADER, desc: 'The resulting shader.' } \n\t];\n\t\n\tthis.shader = null;\n};\n\nE2.p.prototype.connection_changed = function(on, conn, slot)\n{\n\tif(!on && slot.type === E2.slot_type.input)\n\t{\n\t\tif(slot.index === 0)\n\t\t\tthis.shader = null;\n\t}\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t{\n\t\tif(this.mesh !== data)\n\t\t{\n\t\t\tthis.mesh = data;\n\t\t\tthis.dirty = true;\n\t\t}\n\t}\n\telse if(slot.index === 1)\n\t{\n\t\tthis.material = data;\n\t}\n};\n\nE2.p.prototype.update_state = function()\n{\n\tif(!this.mesh)\n\t\treturn;\n\t\n\tvar caps = Material.get_caps_hash(this.mesh, this.material);\n\n\tif(!this.dirty && this.caps_hash === caps)\n\t{\n\t\tthis.shader.material = this.material;\n\t\treturn;\n\t}\n\t\n\tif(this.dirty || this.caps_hash !== caps)\n\t{\n\t\tmsg('Recomposing shader with caps: ' + caps);\n\t\tthis.shader = ComposeShader(null, this.mesh, this.material, null, null, null, null);\n\t}\n\n\tthis.caps_hash = caps;\n\tthis.updated = true;\n\tthis.dirty = false;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.shader;\n};\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.mesh = null;\n\t\tthis.material = null;\n\t\tthis.caps_hash = '';\n\t\tthis.dirty = true;\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/ga_pageview.plugin.js",
    "content": "(function() {\n\nfunction GAPageViewPlugin(core, node) {\n  Plugin.apply(this, arguments)\n  this.desc = 'Reports a page view (as a hash under the experience URL) to GA any time the input changes. Sets `page` first, then calls `pageview`.'\n  this.input_slots = [{\n    name: 'hash',\n    dt: core.datatypes.TEXT,\n    desc: 'The location hash to report to GA.'\n  }]\n  this.output_slots = []\n  this.currentPage = null\n}\nGAPageViewPlugin.prototype = Object.create(Plugin.prototype)\nGAPageViewPlugin.prototype.update_input = function(slot, data) {\n  if (!data || typeof ga === 'undefined')\n    return\n\n  var locationHash = '#' + data\n\n  if (this.currentPage === locationHash)\n    return\n\n  this.currentPage = locationHash\n\n  ga('clientTracker.set', 'page', window.location.pathname + locationHash)\n  ga('clientTracker.send', 'pageview')\n}\n\nE2.plugins.ga_pageview = GAPageViewPlugin\n\n})()\n"
  },
  {
    "path": "browser/plugins/gamepad_generator.plugin.js",
    "content": "(function() {\nvar GamePadGenerator = E2.plugins.gamepad_generator = function(core, node) {\n\tfunction createButton(name, isFloat) {\n\t\treturn {\n\t\t\tname: name,\n\t\t\tdt: isFloat ? core.datatypes.FLOAT : core.datatypes.BOOL,\n\t\t\tdesc: name,\n\t\t\tdef: isFloat ? 0.0 : false\n\t\t}\n\t}\n\n\tthis._core = core\n\n\tthis.desc = 'Buttons and axes from HTML5 standard gamepad'\n\n\tthis.vibrate = false\n\n\tthis.input_slots = [{\n\t\tname: 'pad number',\n\t\tdt: core.datatypes.FLOAT,\n\t\tdesc: 'Gamepad number',\n\t\tdef: 0\n\t}]\n\n\tthis.output_slots = [\n\t\tcreateButton('button 0'),\n\t\tcreateButton('button 1'),\n\t\tcreateButton('button 2'),\n\t\tcreateButton('button 3'),\n\n\t\tcreateButton('left bumper'),\n\t\tcreateButton('right bumper'),\n\t\tcreateButton('left trigger', true),\n\t\tcreateButton('right trigger', true),\n\n\t\tcreateButton('select'),\n\t\tcreateButton('start'), // 9\n\n\t\tcreateButton('left stick button'),\n\t\tcreateButton('right stick button'), \n\n\t\tcreateButton('D-pad top'),\n\t\tcreateButton('D-pad bottom'),\n\t\tcreateButton('D-pad left'),\n\t\tcreateButton('D-pad right'),\n\n\t\tcreateButton('extra'), // 16 - xbox 360 button\n\n\t\tcreateButton('left stick X', true),\n\t\tcreateButton('left stick Y', true),\n\t\tcreateButton('right stick X', true),\n\t\tcreateButton('right stick Y', true)\n\t]\n\n\tthis._gamepadIndex = 0\n\tthis.always_update = true\n}\n\nGamePadGenerator.prototype.reset = function() {\n\tthis.updated = true\n}\n\nGamePadGenerator.prototype.update_input = function(slot, data) {\n\tif (slot.name === 'pad number') {\n\t\tthis._gamepadIndex = data\n\t\treturn;\n\t}\n}\n\nGamePadGenerator.prototype.update_state = function() {\n\tthis.gamepads = navigator.getGamepads()\n\tvar pad = this.gamepad = this.gamepads[this._gamepadIndex]\n\n\tif (!pad) {\n\t\treturn;\n\t}\n\n\tthis.updated = true\n}\n\nGamePadGenerator.prototype.update_output = function(slot) {\n\tfunction buttonPressed(b) {\n\t\tif (typeof(b) === 'object')\n\t\t\treturn b.pressed\n\n\t\treturn b === 1.0\n\t}\n\n\tif (!this.gamepad)\n\t\treturn 0.0\n\n\tif (!this.gamepad.buttons[slot.index])\n\t\treturn null;\n\n\t// float\n\tif (this.output_slots[slot.index].dt.id === this._core.datatypes.FLOAT.id)\n\t\treturn this.gamepad.buttons[slot.index].value\n\n\t// bool\n\treturn buttonPressed(this.gamepad.buttons[slot.index])\n}\n\n})()"
  },
  {
    "path": "browser/plugins/get_matrix_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"get_matrix_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Get matrix component.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'matrix', dt: core.datatypes.MATRIX, desc: 'Matrix to get component of.', def: core.renderer.matrix_identity },\n\t\t{ name: 'row', dt: core.datatypes.FLOAT, desc: 'Row to get.', def: 0 },\n\t\t{ name: 'column', dt: core.datatypes.FLOAT, desc: 'Column to get.', def: 0 },\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'matrix', dt: core.datatypes.MATRIX, desc: 'The input matrix.' },\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'The value.', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.matrix = data;\n\telse if(slot.index === 1)\n\t\tthis.row = data < 0 ? 0 : data > 3 ? 3 : data;\n\telse if(slot.index === 2)\n\t\tthis.column = data < 0 ? 0 : data > 3 ? 3 : data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.value = this.matrix[(this.row * 4) + this.column];\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\tif(slot.index === 0)\n\t\treturn this.matrix;\n\t\n\treturn this.value;\n};\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.matrix = mat4.create();\n\n\t\tmat4.identity(this.matrix);\n\t\tthis.row = 0;\n\t\tthis.column = 0;\n\t\tthis.value = 0.0;\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/google_analytics.plugin.js",
    "content": "(function() {\n\nfunction GoogleAnalyticsPlugin(core, node) {\n  Plugin.apply(this, arguments)\n  this.desc = 'Lets you track views and Vizor events in your own Google Analytics property.'\n  this.input_slots = [{\n    name: 'trackingId',\n    dt: core.datatypes.TEXT,\n    desc: 'Google Analytics property Tracking ID'\n  }]\n  this.output_slots = []\n  this.state = { trackingId: null }\n  this.currentId = null\n}\nGoogleAnalyticsPlugin.prototype = Object.create(Plugin.prototype)\nGoogleAnalyticsPlugin.prototype.update_input = function(slot, data) {\n  this.state.trackingId = data\n}\nGoogleAnalyticsPlugin.prototype.update_state = function() {\n  this._createTracker()\n}\nGoogleAnalyticsPlugin.prototype._createTracker = function() {\n  if (!this.state.trackingId\n    || this.currentId === this.state.trackingId\n    || typeof ga === 'undefined')\n    return\n\n  ga('create', this.state.trackingId, 'auto', 'clientTracker')\n  this.currentId = this.state.trackingId\n}\nGoogleAnalyticsPlugin.prototype.state_changed = function(ui) {\n  if (!ui)\n    return\n\n  this._createTracker()\n}\n\nE2.plugins.google_analytics = GoogleAnalyticsPlugin\n\n})()\n"
  },
  {
    "path": "browser/plugins/graph.plugin.js",
    "content": "(function() {\n\nvar GraphPlugin = E2.plugins.graph = function(core) {\n\tAbstractGraphPlugin.apply(this, arguments)\n}\n\nGraphPlugin.prototype = Object.create(AbstractGraphPlugin.prototype)\n\n})()"
  },
  {
    "path": "browser/plugins/grid_mesh_generator.plugin.js",
    "content": "E2.p = E2.plugins[\"grid_mesh_generator\"] = function(core, node)\n{\n\tthis.desc = 'Create a planar grid mesh in the XY-plane of unit size.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'x res', dt: core.datatypes.FLOAT, desc: 'X resolution.', lo: 2, hi: 250, def: 10 },\n\t\t{ name: 'y res', dt: core.datatypes.FLOAT, desc: 'Y resolution.', lo: 2, hi: 250, def: 10 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'mesh', dt: core.datatypes.MESH, desc: 'Grid mesh.' }\n\t];\n\t\n\tthis.gl = core.renderer.context;\n\tthis.state = { x_res: 10, y_res: 10 };\n\tthis.mesh = null;\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.updated = true;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tvar v = Math.floor(data);\n\t\n\tif(v < 2)\n\t\treturn;\n\t\n\tv = v > 250 ? 250 : v;\n\t\n\tif(slot.index === 0 && this.state.x_res !== v)\n\t{\n\t\tthis.state.x_res = v;\n\t\tthis.dirty = true;\n\t}\n\telse if(slot.index === 1 && this.state.y_res !== v)\n\t{\n\t\tthis.state.y_res = v;\n\t\tthis.dirty = true;\n\t}\n};\n\nE2.p.prototype.update_state = function()\n{\n\tif(this.dirty)\n\t\tthis.generate_mesh();\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.mesh;\n};\n\nE2.p.prototype.generate_mesh = function()\n{\n\tvar gl = this.gl;\n\t\n\tthis.mesh = new Mesh(gl, gl.LINES, null);\n\t\n\tvar v_data = [];\n\t\n\tfor(var y = 0; y < this.state.y_res + 1; y++)\n\t{\n\t\tvar ofs = (y / (this.state.y_res / 2.0)) - 1.0;\n\t\t\n\t\tv_data.push(-1.0);\t\t\n\t\tv_data.push(ofs);\t\t\n\t\tv_data.push(0.0);\t\t\n\t\tv_data.push(1.0);\t\t\n\t\tv_data.push(ofs);\t\t\n\t\tv_data.push(0.0);\t\t\n\t}\n\n\tfor(var x = 0; x < this.state.x_res + 1; x++)\n\t{\n\t\tvar ofs = (x / (this.state.x_res / 2.0)) - 1.0;\n\t\t\n\t\tv_data.push(ofs);\t\t\n\t\tv_data.push(-1.0);\t\t\n\t\tv_data.push(0.0);\t\t\n\t\tv_data.push(ofs);\t\t\n\t\tv_data.push(1.0);\t\t\n\t\tv_data.push(0.0);\t\t\n\t}\n\n\t(this.mesh.vertex_buffers['VERTEX'] = new VertexBuffer(gl, VertexBuffer.vertex_type.VERTEX)).bind_data(v_data);\n\tthis.mesh.generate_shader();\n\tthis.dirty = false;\n};\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t\tthis.generate_mesh();\n};\n"
  },
  {
    "path": "browser/plugins/gte_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"gte_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits true if the supplied <b>value</b> is larger than or equal to <b>reference</b> and false otherwise.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Input value to be compared.', def: 0.0 },\n\t\t{ name: 'reference', dt: core.datatypes.FLOAT, desc: 'Reference to compare <b>value</b> to.', def: 0.0 } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: 'Emits true if <b>value</b> is larger than or equal to <b>reference</b>.', def: false }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0.0;\n\tthis.ref = 0.0;\n\tthis.state = null;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.value = data;\n\telse\n\t\tthis.ref = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tvar nst = this.value >= this.ref;\n\t\n\tif(nst !== this.state)\n\t\tthis.state = nst;\n\telse\n\t\tthis.updated = false;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.state;\n};\n"
  },
  {
    "path": "browser/plugins/if_else_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"if_else_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits <b>true value</b> if <b>condition</b> is true and <b>false value</b> otherwise. The output only updates when the <b>condition</b> or relavant input value does. Any incoming data-flow to the value slot excluded by <b>condition</b> does not result in data emission.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'condition', dt: core.datatypes.BOOL, desc: 'Send true to route <b>true value</b> to the output and false to route <b>false value</b>.', def: false },\n\t\t{ name: 'true value', dt: core.datatypes.ANY, desc: 'Value to be send to output if <b>condition</b> is true', def: null } ,\n\t\t{ name: 'false value', dt: core.datatypes.ANY, desc: 'Value to be send to output if <b>condition</b> is false', def: null  }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'value', dt: core.datatypes.ANY, desc: 'Emits <b>true value</b> if <b>condition</b> is true and <b>false value</b> otherwise.', def: 'False value' }\n\t];\n\t\n\tthis.lsg = new LinkedSlotGroup(core, node, [this.input_slots[1], this.input_slots[2]], [this.output_slots[0]]);\n\tthis.yes = this.no = null;\n\tthis.initial_run = true;\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.initial_run = true;\n\tdelete this.input_slots[1].inactive;\n\tdelete this.input_slots[2].inactive;\n}\n\nE2.p.prototype.connection_changed = function(on, conn, slot)\n{\n\tif(this.lsg.connection_changed(on, conn, slot))\n\t\tthis.yes = this.no = this.lsg.core.get_default_value(this.lsg.dt);\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t{\n\t\tthis.condition = data;\n\t\t\n\t\tif(!this.initial_run)\n\t\t{\n\t\t\tdelete this.input_slots[this.condition ? 1 : 2].inactive;\n\t\t\tthis.input_slots[this.condition ? 2 : 1].inactive = true;\n\t\t}\n\t\telse\n\t\t\tthis.initial_run = false;\n\t}\n\telse if(slot.index === 1)\n\t\tthis.yes = data;\n\telse\n\t\tthis.no = data;\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.condition ? this.yes : this.no;\n};\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t\tthis.yes = this.no = this.lsg.infer_dt();\n};\n"
  },
  {
    "path": "browser/plugins/if_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"if_modulator\"] = function(core, node) {\n\tthis.desc = 'Allows <b>value</b> though if <b>condition</b> is true and inhibits futher data-flow otherwise.'\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'condition', dt: core.datatypes.BOOL, desc: 'Condition that, if true, allows <b>value</b> to be emitted.', def: false },\n\t\t{ name: 'value', dt: core.datatypes.ANY, desc: 'Value to be emitted if <b>condition</b> is true.', def: null } \n\t]\n\t\n\tthis.output_slots = [\n\t\t{ name: 'value', dt: core.datatypes.ANY, desc: 'Emits <b>value</b> if <b>condition</b> is true and nothing otherwise.' }\n\t]\n\n\tthis.lsg = new LinkedSlotGroup(core, node, [this.input_slots[1]], [this.output_slots[0]])\n\tthis.value = null\n}\n\nE2.p.prototype.connection_changed = function(on, conn, slot) {\n\tif (this.lsg.connection_changed(on, conn, slot))\n\t\tthis.value = this.lsg.core.get_default_value(this.lsg.dt)\n}\n\nE2.p.prototype.update_input = function(slot, data) {\n\tif (slot.index === 0) {\n\t\tthis.condition = data\n\t\t\n\t\tif (this.condition)\n\t\t\tdelete this.input_slots[1].inactive\n\t\telse\n\t\t\tthis.input_slots[1].inactive = true\n\t} else {\n\t\tthis.value = data\n\t}\n}\n\nE2.p.prototype.update_output = function(slot) {\n\tif (this.input_slots[1].inactive)\n\t\treturn null\n\n\treturn this.value\n}\n\nE2.p.prototype.state_changed = function(ui) {\n\tif (!ui)\n\t\tthis.value = this.lsg.infer_dt()\n}\n"
  },
  {
    "path": "browser/plugins/initialise_generator.plugin.js",
    "content": "E2.p = E2.plugins[\"initialise_generator\"] = function(core, node)\n{\n\tthis.desc = 'Emits true the first frame after playback is started, then false for one frame and stop emitting. Can be used to run initialisation logic on the first frame of playback only.';\n\t\n\tthis.input_slots = [];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: 'Emits true on first frame of playback, then false for one frame, then stops emitting.' }\n\t];\n\t\n\tthis.core = core;\n\tthis.st = [false, false];\n\tthis.val = false;\n};\n\nE2.p.prototype.stop = function()\n{\n\tthis.st[0] = this.st[1] = true;\n};\n\nE2.p.prototype.update_state = function()\n{\n\tthis.val = this.st[0] && this.st[1];\n\t\n\tthis.updated = this.st[0];\n\tthis.st[0] = this.st[1];\n\tthis.st[1] = false;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.val;\n};\n"
  },
  {
    "path": "browser/plugins/input_proxy.plugin.js",
    "content": "(function(){\n\nvar InputProxy = E2.plugins.input_proxy = function(core, node) {\n\tthis.desc = 'Create a new type-less slot to route data into the current graph from its parent. When connected to a slot, it will assume its type until disconnected. Renaming this plugin will rename the corresponding parent slot.';\n\t\n\tthis.input_slots = []\n\tthis.output_slots = []\n\t\n\tnode.add_slot(E2.slot_type.output, {\n\t\tname: 'input',\n\t\tdt: core.datatypes.ANY,\n\t\tdesc: 'Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.'\n\t})\n\n\tthis.core = core;\n\tthis.node = node;\n\tthis.data = null;\n\n\tif (!node.title)\n\t\tnode.title = 'input'\n}\n\nInputProxy.prototype.reset = function() {\n\tthis.updated = true;\n}\n\nInputProxy.prototype.input_updated = function(data) {\n\tthis.data = data;\n\tthis.updated = true;\n}\n\nInputProxy.prototype.connection_changed = function(on, conn, slot) {\n\tvar plg = this.node.parent_graph.plugin;\n\n\tif (plg)\n\t\tplg.proxy_connection_changed(on,\n\t\t\tthis.node,\n\t\t\tconn.dst_node,\n\t\t\tslot,\n\t\t\tconn.dst_slot)\n}\n\nInputProxy.prototype.update_output = function() {\n\treturn this.data;\n}\n\nInputProxy.prototype.state_changed = function(ui) {\n\n}\n\n})();\n"
  },
  {
    "path": "browser/plugins/inputs_to_array.plugin.js",
    "content": "(function() {\n\nvar InputsToArray = E2.plugins.inputs_to_array = function InputsToArray(core, node) {\n\tvar that = this\n\t\n\tthis.desc = 'Combine all the input slots into an output array of the same datatype'\n\n\tthis.input_slots = []\n\t\n\tthis.output_slots = [\n\t\t{\n\t\t\tname: 'array',\n\t\t\tdt: E2.dt.ANY,\n\t\t\tarray: true,\n\t\t\tdesc: 'The array.'\n\t\t},\n\t\t{\n\t\t\tname: 'length',\n\t\t\tdt: E2.dt.FLOAT,\n\t\t\tdesc: 'The number of inputs ie. the length of the array.'\n\t\t}\n\t]\n\n\tthis.core = core\n\tthis.node = node\n\tthis.lsg = new AutoSlotGroup(core, node, [], [this.output_slots[0]])\n\n\t// the output is always an array, regardless of whether inputs are\n\tthis.lsg.forceOutputArrayness(true)\n\n\tthis.array = []\n\n\tthis.node.on('slotAdded', function() {\n\t\tthat.dynInputs = node.getDynamicInputSlots()\n\t\tthat.updated = true\n\t})\n\n\tthis.node.on('slotRemoved', function() {\n\t\tthat.dynInputs = node.getDynamicInputSlots()\n\t\tthat.updated = true\n\t})\n}\n\nInputsToArray.prototype.update_input = function(slot, data) {\n\tif (data === null || data === undefined)\n\t\tthis.array.splice(slot.index, 1)\n\telse if (data instanceof Array)\n\t\tthis.array[slot.index] = data[0]\n\telse\n\t\tthis.array[slot.index] = data\n}\n\nInputsToArray.prototype.update_output = function(slot) {\n\tif (slot.index === 1)\n\t\treturn this.dynInputs.length - 1\n\n\treturn this.array\n}\n\nInputsToArray.prototype.connection_changed = function(on, conn, slot) {\n\tif (this.lsg.connection_changed(on, conn, slot))\n\t\tthis.lsg.infer_dt()\n\n\tthis.updated = true\n}\n\nInputsToArray.prototype.state_changed = function(ui) {\n\tif (!ui) {\n\t\tthis.dynInputs = this.node.getDynamicInputSlots()\n\n\t\tif (!this.dynInputs.length) {\n\t\t\tthis.node.add_slot(E2.slot_type.input, {\n\t\t\t\tname: '0',\n\t\t\t\tdt: E2.dt.ANY,\n\t\t\t\tarray: false\n\t\t\t})\n\t\n\t\t\tthis.dynInputs = this.node.getDynamicInputSlots()\n\t\t}\n\n\t\tfor(var i = 0, len = this.dynInputs.length; i < len; i++) {\n\t\t\tthis.lsg.add_dyn_slot(this.dynInputs[i])\n\t\t}\n\n\t\tthis.lsg.infer_dt()\n\t}\n}\n\n})();\n"
  },
  {
    "path": "browser/plugins/invert_matrix_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"invert_matrix_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits the inverse of the supplied <b>matrix</b>.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'matrix', dt: core.datatypes.MATRIX, desc: 'The input matrix to be inverted.', def: core.renderer.matrix_identity }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'inverse', dt: core.datatypes.MATRIX, desc: 'Emits the inverse of the input <b>matrix</b>.', def: core.renderer.matrix_identity }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.matrix = mat4.create();\n\tthis.inverse = mat4.create();\n\n\tmat4.identity(this.matrix);\n\tmat4.identity(this.inverse);\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.matrix = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tmat4.inverse(this.matrix, this.inverse);\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.inverse;\n};\n"
  },
  {
    "path": "browser/plugins/is_in_vr.plugin.js",
    "content": "(function() {\n\tvar IsInVRPlugin = E2.plugins.is_in_vr = function(core, node) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'Outputs true if the graph is currently viewed in VR'\n\n\t\tthis.input_slots = []\n\n\t\tthis.output_slots = [{\n\t\t\t\tname: 'fullscreen',\n\t\t\t\tdt: E2.dt.BOOL,\n\t\t\t\tdesc: 'true if in fullscreen, false if not'\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'stereo',\n\t\t\t\tdt: E2.dt.BOOL,\n\t\t\t\tdesc: 'true if in stereo, false if not'\n\t\t\t}]\n\n\t\tthis.outputs = {}\n\t}\n\n\tIsInVRPlugin.prototype = Object.create(Plugin.prototype)\n\n\tIsInVRPlugin.prototype.update_state = function() {\n\t\tvar isFullscreen = E2.util.isFullscreen()\n\t\tvar isStereo = E2.core.webVRManager.isVRMode()\n\n\t\tthis.outputs.fullscreen = isFullscreen\n\t\tthis.outputs.stereo = isStereo\n\t}\n\n\tIsInVRPlugin.prototype.update_output = function(slot) {\n\t\treturn this.outputs[slot.name]\n\t}\n\n\tIsInVRPlugin.prototype.state_changed = function(ui) {\n\t\tif (!ui) {\n\t\t\tfunction refreshCallback(e) {\n\t\t\t\t// from webvr-manager:\n\t\t\t\tvar Modes = {\n\t\t\t\t\tUNKNOWN: 0,\n\t\t\t\t\t// Not fullscreen, just tracking.\n\t\t\t\t\tNORMAL: 1,\n\t\t\t\t\t// Magic window immersive mode.\n\t\t\t\t\tMAGIC_WINDOW: 2,\n\t\t\t\t\t// Full screen split screen VR mode.\n\t\t\t\t\tVR: 3,\n\t\t\t\t};\n\n\t\t\t\tthis.outputs.stereo = e.detail.mode === Modes.VR\n\t\t\t\tthis.outputs.fullscreen = e.detail.mode !== Modes.NORMAL\n\n\t\t\t\tthis.updated = true\n\t\t\t}\n\n\t\t\tthis.modeChangeListener = refreshCallback.bind(this)\n\n\t\t\tdocument.body.addEventListener('vrManagerModeChanged',\n\t\t\t\tthis.modeChangeListener);\n\t\t}\n\t}\n\n\tIsInVRPlugin.prototype.destroy = function() {\n\t\tdocument.body.removeEventListener('vrManagerModeChanged',\n\t\t\tthis.modeChangeListener)\n\t}\n\n})()\n"
  },
  {
    "path": "browser/plugins/key_press_generator.plugin.js",
    "content": "(function(){\nvar Keypress = E2.plugins[\"key_press_generator\"] = function(core, node)\n{\n\tPlugin.apply(this, arguments)\n\tthis.desc = 'Emits true on the next update after the key matching the set filter has been pressed and false once after it has been released.';\n\t\n\tthis.input_slots = [];\n\t\n\tthis.output_slots = [ \n\t\t{ name: 'signal', dt: core.datatypes.BOOL, desc: 'Emits true once when the set key is pressed.' }\n\t];\t\n\t\n\tthis.state = { key: 0, type: 0 };\n};\nKeypress.prototype = Object.create(Plugin.prototype)\n\nKeypress.prototype.update_output = function(slot)\n{\n\treturn this.key_state;\n};\n\nKeypress.prototype.create_ui = function()\n{\n\tvar that = this\n\tvar items = [\n\t\t[-1, '[Pick a key]'],\n\t\t[8, 'Backspace'], [9, 'Tab'], [13, 'Enter'],\n\t\t[32, 'Space'],\n\t\t[33, 'Page up'], [34, 'Page down'], [35, 'End'],\n\t\t[36, 'Home'], [37, 'Left arrow'], [38, 'Up arrow'],\n\t\t[39, 'Right arrow'], [40, 'Down arrow'], [45, 'Insert'], [46, 'Delete'],\n\t\t[48, '0'], [49, '1'], [50, '2'],\n\t\t[51, '3'], [52, '4'], [53, '5'],\n\t\t[54, '6'], [55, '7'], [56, '8'],\n\t\t[57, '9'], \n\t\t[65, 'a'],\n\t\t[66, 'b'], [67, 'c'], [68, 'd'],\n\t\t[69, 'e'], [70, 'f'], [71, 'g'],\n\t\t[72, 'h'], [73, 'i'], [74, 'j'],\n\t\t[75, 'k'], [76, 'l'], [77, 'm'],\n\t\t[78, 'n'], [79, 'o'], [80, 'p'],\n\t\t[81, 'q'], [82, 'r'], [83, 's'],\n\t\t[84, 't'], [85, 'u'], [86, 'v'],\n\t\t[87, 'w'], [88, 'x'], [89, 'y'],\n\t\t[90, 'z']\n\t];\n\t\n\tvar dom = make('div');\n\tvar inp = $('<select id=\"key\" title=\"Select key\" />', { selectedIndex: 0 });\n\tvar inp_type = $('<select id=\"o_type\" title=\"Select output signal type\" />', { selectedIndex: 0 });\n\t\n\tfor(var i = 0, len = items.length; i < len; i++)\n\t{\n\t\tvar item = items[i];\n\t\t$('<option />', { value: item[0], text: item[1] }).appendTo(inp);\n\t}\n\t \n\t$('<option />', { value: 0, text: 'Impulse' }).appendTo(inp_type);\n\t$('<option />', { value: 1, text: 'Continuous' }).appendTo(inp_type);\n\t\n\tinp.change(function() {\n\t\tthat.undoableSetState('key', parseInt(inp.val()), that.state.key)\n\t})\n\t\n\tinp_type.change(function() {\n\t\tthat.undoableSetState('type', parseInt(inp_type.val()), that.state.type)\n\t})\n\n\tinp.css('width', '100px');\n\tinp_type.css('width', '100px');\n\t\n\tdom.append(inp);\n\tdom.append(make('br'));\n\tdom.append(inp_type);\n\t\n\treturn dom;\n};\n\nKeypress.prototype.key_down = function(self) { return function(e) {\n\tif (E2.util.isTextInputInFocus(e))\n\t\treturn;\n\n\tif(e.originalEvent.keyCode !== self.state.key)\n\t\treturn;\n\t\n\tself.key_state = true;\n\tself.updated = true;\n}};\n\nKeypress.prototype.key_up = function(self) { return function(e) {\n\tif (E2.util.isTextInputInFocus(e))\n\t\treturn;\n\n\tif(e.originalEvent.keyCode !== self.state.key)\n\t\treturn;\n\t\n\tself.key_state = false;\n\tself.updated = true;\n}};\n\nKeypress.prototype.reset_keystate = function()\n{\n\tthis.last_state = this.key_state = false;\n};\n\nKeypress.prototype.update_state = function()\n{\n\tif(this.state.type === 0 && this.key_state === this.last_state)\n\t\tthis.updated = false;\n\t\n\tthis.last_state = this.key_state;\n};\n\nKeypress.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.reset_keystate();\n\t\t$(document).keydown(this.key_down(this));\n\t\t$(document).keyup(this.key_up(this));\n\t}\n\telse\n\t{\n\t\tui.find('#key').val(this.state.key);\n\t\tui.find('#o_type').val(this.state.type);\n\t}\n};\n})()"
  },
  {
    "path": "browser/plugins/knob_float_generator.plugin.js",
    "content": "(function() {\nvar knobImgWidth = 44\nvar knobImgHalfWidth = 22\nvar knobCssTransform = 'translate(-'+ knobImgHalfWidth +'px,-'+knobImgHalfWidth+'px) scale(0.5) rotate('\nvar knobRotationMin = 30.0;\nvar knobRotationRange = 300.0;\n\nvar Knob = E2.plugins.knob_float_generator = function(core, node) {\n\tPlugin.apply(this, arguments)\n\n\tthis.desc = 'Emits a user controllable float value between 0 and 1.'\n\t\n\tthis.input_slots = []\n\t\n\tthis.output_slots = [\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Emits the current value when the knob is adjusted.', lo: 0, hi: 1, def: 0 }\n\t]\n\n\tthis.state = { val: 0.0 }\n\tthis.knob = null\n}\n\nKnob.prototype = Object.create(Plugin.prototype)\n\nKnob.prototype.reset = function() {}\n\nKnob.prototype.setRotation = function() {\n\tvar rotation = knobRotationMin + Math.floor(this.state.val * knobRotationRange);\n\tvar transform = knobCssTransform + rotation + 'deg)'\n\t\n\tthis.knob.css({\n\t\t'-webkit-transform': transform,\n\t\t'-moz-transform': transform,\n\t\t'transform':  transform\n\t})\n}\n\nKnob.prototype.create_ui = function() {\n\tvar that = this\n\tvar $container = make('div');\n\n\tthis.readout = make('span')\n\tthis.knob = make('div')\n\n\t// sized at 2x and scaled down for smoother svg display\n\tthis.knob\n\t\t.css({\n\t\t\t'width': (2 * knobImgWidth) + 'px',\n\t\t\t'height': (2 * knobImgWidth) + 'px'\n\t\t})\n\n\tthis.readout\n\t\t.css({\n\t\t\t'height': ( knobImgWidth-2) + 'px',\n\t\t\t'width': ( knobImgWidth-2) + 'px',\n\t\t\t'line-height': (knobImgWidth) + 'px'\n\t\t})\n\n\t$container.append(this.knob, this.readout)\n\n\tvar oldValue = that.state.val\n\tvar onEnd = function() {\n\t\tthat.undoableSetState('val', that.state.val, oldValue)\n\t}\n\tvar onChange = function(v) {\n\t\tthat.state.val = v\n\t\tthat.update_ui()\n\t\tthat.updated = true\n\t}\n\tvar onStart = function() {\n\t\toldValue = that.state.val\n\t}\n\n\tthis.ui = this.knob\n\n\tvar opts = {\n\t\tcssCursor: 'ns-resize',\n\t\tgetValue : function() {return that.state.val},\n\t\tmin : 0.0,\n\t\tmax : 1.0,\n\t\tstep : 0.01\n\t}\n\tuiMakeDragToAdjust(this.knob[0]\t, onStart, onChange, onEnd, opts)\n\tuiMakeDragToAdjust(this.readout[0], onStart, onChange, onEnd, opts)\n\n\tthis.node.on('pluginStateChanged', this.update_ui.bind(this))\n\tthis.update_ui();\n\n\treturn $container\n}\n\nKnob.prototype.update_output = function() {\n\treturn this.state.val\n}\n\nKnob.prototype.updateReadout = function() {\n\tthis.readout.text(this.state.val.toFixed(2))\n}\n\nKnob.prototype.update_ui = function() {\n\tif (this.ui) {\n\t\tthis.setRotation()\n\t\tthis.updateReadout()\n\t}\n}\n\n})()"
  },
  {
    "path": "browser/plugins/label_generator.plugin.js",
    "content": "(function() {\nvar Label = E2.plugins.label_generator = function(core, node) {\n\tPlugin.apply(this, arguments)\n\tthis.desc = 'Emits a string specified in an input field.';\n\t\n\tthis.input_slots = [];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'value', dt: core.datatypes.TEXT, desc: 'The currently entered text.' }\n\t];\n\t\n\tthis.state = { text: '' };\n\tthis.core = core;\n\tthis.node = node;\n};\nLabel.prototype = Object.create(Plugin.prototype)\n\nLabel.prototype.reset = function()\n{\n}\n\nLabel.prototype.create_ui = function()\n{\n\tvar inp = $('<input type=\"text\" value=\"1.0\" style=\"width: 50px;\" />');\n\t\n\tinp.css('border', '1px solid #999');\n\tinp.change(function(self) { return function()\n\t{\n\t\tself.undoableSetState('text', inp.val(), self.state.text)\n\t}}(this));\n\t\n\tthis.etf = new ExpandableTextfield(this.node, inp, 7);\n\treturn inp;\n};\n\nLabel.prototype.update_output = function(slot)\n{\n\treturn this.state.text;\n};\n\nLabel.prototype.state_changed = function(ui)\n{\n\tif(ui)\n\t\tui.val('' + this.state.text);\n};\n\n})();\n\n"
  },
  {
    "path": "browser/plugins/led_display.plugin.js",
    "content": "E2.p = E2.plugins[\"led_display\"] = function(core, node)\n{\n\tthis.desc = 'Displays the supplied normalised float value as a red LED, with a 8 bit color granularity.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'float', dt: core.datatypes.FLOAT, desc: 'Normalised input value.', lo: 0, hi: 1, def: 0 }\n\t];\n\t\n\tthis.output_slots = [];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.update_value(0);\n};\n\nE2.p.prototype.create_ui = function()\n{\n\tthis.label = make('span');\n\t\n\tthis.label.html('&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;') \n\tthis.update_value(0);\n\t\n\treturn this.label;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.update_value(data < 0.0 ? 0.0 : data > 1.0 ? 1.0 : data);\n};\n\nE2.p.prototype.update_value = function(value)\n{\n\tif(this.label)\n\t\tthis.label.css('background-color', 'rgb(' + Math.round(value * 255.0) + ', 40, 40)');\n};\n"
  },
  {
    "path": "browser/plugins/less_than_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"less_than_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits true if the supplied <b>value</b> is less than <b>reference</b> and false otherwise.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Input value to compare.', def: 0.0 },\n\t\t{ name: 'reference', dt: core.datatypes.FLOAT, desc: 'Reference to compare <b>value</b> to.', def: 0.0 } \n\t];\n\t\n\tthis.output_slots = [ { name: 'bool', dt: core.datatypes.BOOL, desc: 'Emits true if <b>value</b> is less than <b>reference</b> and false otherwise.', def: false } ];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0.0;\n\tthis.ref = 0.0;\n\tthis.state = null;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.value = data;\n\telse\n\t\tthis.ref = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tvar nst = this.value < this.ref;\n\t\n\tif(nst !== this.state)\n\t\tthis.state = nst;\n\telse\n\t\tthis.updated = false;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.state;\n};\n"
  },
  {
    "path": "browser/plugins/load_graph.plugin.js",
    "content": "(function() {\n\nvar prevGraph\n\nvar LoadGraph = E2.plugins['load_graph'] = function(core, node) {\n\tthis.desc = 'Instructs the player to play the graph (replacing the current graph) when enabled'\n\n\tthis.input_slots = [{\n\t\t\tname: 'back key', dt: core.datatypes.FLOAT,\n\t\t\tdesc: 'If set, pressing this key will load the previous graph (space=32)',\n\t\t\tdef: null\n\t\t}, {\n\t\t\tname: 'graph', dt: core.datatypes.OBJECT,\n\t\t\tdesc: 'Graph to play', def: null\n\t\t}]\n\t\n\tthis._keyCode = this._graph = null\n\tthis.output_slots = []\n}\n\nLoadGraph.prototype.update_input = function(slot, data) {\n\tvar that = this\n\n\tfunction goToGraph() {\n\t\tif (!prevGraph) {\n\t\t\tprevGraph = E2.app.player.core.serialise()\n\t\t}\n\n\t\tfunction onKeyPress(e) {\n\t\t\tif (e.keyCode !== that._keyCode)\n\t\t\t\treturn;\n\n\t\t\t$(window).off('keypress', onKeyPress)\n\n\t\t\tE2.app.player.stop()\n\t\t\tE2.app.player.load_from_json(prevGraph)\n\t\t\tE2.app.player.play()\n\t\t}\n\n\t\tif (that._keyCode)\n\t\t\t$(window).on('keypress', onKeyPress)\n\n\t\t// play graph\n\t\tE2.app.player.stop()\n\t\tE2.app.player.load_from_object(that._graph)\n\t\tE2.app.player.play()\n\t}\n\n\tswitch(slot.index) {\n\t\tcase 0:\n\t\t\tthis._keyCode = Math.floor(data)\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tif (!data || !Object.keys(data).length)\n\t\t\t\treturn;\n\t\t\tthis._graph = data\n\t\t\tgoToGraph()\n\t\t\tbreak;\n\t}\n}\n\n})()\n"
  },
  {
    "path": "browser/plugins/load_graph_on_trigger.plugin.js",
    "content": "(function() {\n\nvar LoadGraphOnTrigger = E2.plugins.load_graph_on_trigger = function(core) {\n\tPlugin.apply(this, arguments)\n\n\tthis.desc = 'Loads and plays the Vizor file (replacing the current one) on trigger'\n\n\tthis.input_slots = [{\n\t\tname: 'trigger', \n\t\tdt: core.datatypes.BOOL,\n\t\tdesc: 'When trigger is true, the URL will be loaded in the player',\n\t\tdef: null\n\t}, {\n\t\tname: 'url',\n\t\tdt: core.datatypes.TEXT,\n\t\tdesc: 'Relative URL to published Vizor file, eg. /fthr/moon',\n\t\tdef: null\n\t}]\n\n\tthis.output_slots = []\n}\n\nLoadGraphOnTrigger.prototype = Object.create(Plugin.prototype)\n\nLoadGraphOnTrigger.prototype.update_state = function() {\n\tif (this.inputValues.trigger && this.inputValues.url) {\n\t\tvar givenUrlParts = this.inputValues.url.split('/')\n\t\tvar graphPath = '/' + givenUrlParts.splice(-2, 2).join('/')\n\n\t\t// in the editor\n\t\tif (E2.app && E2.app.navigateToPublishedGraph)\n\t\t\treturn E2.app.navigateToPublishedGraph(graphPath)\n\n\t\t// in the player\n\t\tvar graphUrl = '/data/graph' + graphPath + '.min.json'\n\t\tE2.app.player.load_from_url(graphUrl, function() {\n\t\t\thistory.pushState({}, '', graphPath)\n\t\t\tE2.app.player.play()\n\t\t})\n\t}\n}\n\n})()"
  },
  {
    "path": "browser/plugins/log_display.plugin.js",
    "content": "E2.p = E2.plugins[\"log_display\"] = function(core, node)\n{\n\tthis.desc = 'Pipes the supplied text to the browser console log.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'text', dt: core.datatypes.TEXT, desc: 'Input text to be logged in the browsers console.', def: null }\n\t];\n\t\n\tthis.output_slots = [];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(data)\n\t\tconsole.log(data);\n};\n"
  },
  {
    "path": "browser/plugins/log_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"log_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Log(x).';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Input value.', def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'result', dt: core.datatypes.FLOAT, desc: 'log(<b>value</b>).', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.value = Math.log(data);\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/loop.plugin.js",
    "content": "(function() {\nvar LoopPlugin = E2.plugins.loop = function(core) {\n\tSubGraphPlugin.apply(this, arguments)\n\n\tthis.desc = 'Encapsulate a nested graph into- and out of which arbitrary data can be routed and run the enclosed logic once per loop iteration. The loop counter is made available to enclosing logic as a local variable with the name <b>index<\\/b>.';\n\n\tthis.input_slots = [\n\t\t{ name: 'first', dt: core.datatypes.FLOAT, desc: 'The start index.', def: 0 },\n\t\t{ name: 'last', dt: core.datatypes.FLOAT, desc: 'The end index.', def: 0 },\n\t\t{ name: 'step', dt: core.datatypes.FLOAT, desc: 'Loop index increment.', def: 1 }\n\t]\n\n\tthis.output_slots = [\n\t]\n\n\tthis.state = { input_sids: {}, output_sids: {}, always_update: true };\n}\n\nLoopPlugin.prototype = Object.create(SubGraphPlugin.prototype)\nLoopPlugin.prototype.constructor = LoopPlugin\n\nLoopPlugin.prototype.open_inspector = function(self)\n{\n\tvar diag = make('div');\n\tvar always_upd = $('<input id=\"always_upd\" type=\"checkbox\" title=\"If false, this graph is updated only when one of its inputs updates.\" />');\n\tvar upd_lbl = $('<label for=\"always_upd\"><span><svg class=\"icon-checked\">'\n\t\t\t\t  + '<use xlink:href=\"#icon-checked\"></use></svg></span>Always update</div>');\n\tvar r1 = make('div');\n\n\tvar lbl_css = {\n\t\t'font-size': '14px',\n\t\t'float': 'left',\n\t\t'padding': '8px 0px 2px 2px'\n\t};\n\n\tvar inp_css = {\n\t\t'float': 'right',\n\t\t'margin': '2px',\n\t\t'padding': '2px',\n\t\t'width': '13px',\n\t\t'margin-top': '8px'\n\t};\n\n\tdiag.css({\n\t\t'margin': '0px',\n\t\t'padding': '2px'\n\t});\n\n\tr1.css('clear', 'both');\n\tr1.addClass('clearfix')\n\talways_upd.css(inp_css);\n\tupd_lbl.css(lbl_css);\n\n\talways_upd.css({ 'width': '13px', 'margin-top': '8px' })\n\talways_upd.attr('checked', self.state.always_update);\n\n\tr1.append(always_upd);\n\tr1.append(upd_lbl);\n\n\tdiag.append(r1);\n\n\tvar store_state = function(self, always_upd) { return function(e)\n\t{\n\t\tself.state.always_update = always_upd.is(\":checked\");\n\t}};\n\n\tself.core.create_dialog(diag, 'Edit Preferences.', 460, 250, store_state(self, always_upd));\n};\n\n\nLoopPlugin.prototype.drilldown = function() {\n\treturn NodeUI.drilldown(this);\n};\n\n/*\nLoopPlugin.prototype.create_ui = function()\n{\n\tvar ui = make('div');\n\tvar inp_edit = makeButton('Edit', 'Open this loop for editing.');\n\n\tinp_edit.click(this.drilldown.bind(this));\n\n\tui.append(inp_edit);\n\n\treturn ui;\n};\n*/\n\nLoopPlugin.prototype.update_input = function(slot, data)\n{\n\tif(slot.uid === undefined)\n\t{\n\t\tif(slot.index === 0)\n\t\t\tthis.first = Math.floor(data);\n\t\telse if(slot.index === 1)\n\t\t\tthis.last = Math.floor(data);\n\t\telse\n\t\t{\n\t\t\tthis.step = Math.abs(data);\n\t\t\tthis.step = this.step < 1.0 ? 1 : Math.floor(this.step);\n\t\t}\n\t}\n\telse\n\t{\n\t\tthis.input_nodes[slot.uid].plugin.input_updated(data)\n\t}\n};\n\nLoopPlugin.prototype.update_state = function(updateContext)\n{\n\tthis.updated = false;\n\tthis.updated_sids.length = 0;\n\n\tif(this.first > this.last)\n\t{\n\t\tvar t = this.first;\n\n\t\tthis.first = this.last;\n\t\tthis.last = t;\n\t}\n\n\tif(this.graph && this.step > 0)\n\t{\n\t\tvar updated = false;\n\n\t\tfor(var cnt = this.first; cnt < this.last; cnt += this.step)\n\t\t{\n\t\t\tthis.graph.variables.write('index', cnt);\n\t\t\tthis.graph.reset();\n\n\t\t\tif(this.graph.update(updateContext))\n\t\t\t\tupdated = true;\n\t\t}\n\n\t\tif(updated && this === E2.app.player.core.active_graph)\n\t\t\tE2.app.updateCanvas(false);\n\t}\n};\n\nLoopPlugin.prototype.variable_dt_changed = function() {}\n\nLoopPlugin.prototype.state_changed = function(ui)\n{\n\tvar core = this.core;\n\tvar node = this.parent_node;\n\tvar self = this;\n\n\t// Only rebuild the node lists during post-load patch up of the graph,\n\t// during which 'ui' will be null. Otherwise the lists would have been rebuilt\n\t// every time we switch to the graph containing this node in the editor.\n\tif(ui)\n\t{\n\t\treturn\n\t}\n\n\tthis.setupProxies()\n\n\tthis.first = 0;\n\tthis.last = 0;\n\tthis.step = 1;\n\n\tthis.graph.variables.lock(this, 'index');\n\tvar rdt = this.graph.variables.variables['index'].dt;\n\n\tif (rdt.id === this.core.datatypes.ANY.id)\n\t\tthis.graph.variables.set_datatype('index', core.datatypes.FLOAT);\n};\n\n})()\n"
  },
  {
    "path": "browser/plugins/lowpass_filter_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"lowpass_filter_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Perform simple 1st-order lowpass filtering of the supplied value.\\n\\n<b>Caution:</b> Do not use this plugin to filter infrequently updated values. This plugin expects continuous input every frame; if necessary, a clock or another cheap continuous float provider can be multiplied by zero and added to the lowpass input to drive updates.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Input value. Must be updated every frame for correct operation of the filter.', def: 0.0 },\n\t\t{ name: 'amount', dt: core.datatypes.FLOAT, desc: 'Filter amount. Zero is pure passthrough, 0.999 maximum filtering.', lo: 0, hi: 0.999, def: 0.9 } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'result', dt: core.datatypes.FLOAT, desc: 'The smoothed output value', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.input_val = data;\n\telse\n\t\tthis.amount = data < 0.0 ? 0.0 : data > 0.999 ? 0.999 : data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.output_val = (this.input_val * (1.0 - this.amount)) + (this.last_val * this.amount);\n\tthis.last_val = this.output_val; \n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.output_val;\n};\t\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.input_val = 0.0;\n\t\tthis.amount = 0.9;\n\t\tthis.output_val = 0.0;\n\t\tthis.last_val = 0.0;\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/lte_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"lte_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits true if the supplied <b>value</b> is less than or equal to <b>reference</b> and false otherwise.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Input value to be compared.', def: 0.0 },\n\t\t{ name: 'reference', dt: core.datatypes.FLOAT, desc: 'Reference to compare <b>value</b> to.', def: 0.0 } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: 'Emits true if <b>value</b> is less than or equal to <b>reference</b>.', def: false }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0.0;\n\tthis.ref = 0.0;\n\tthis.state = null;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.value = data;\n\telse\n\t\tthis.ref = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tvar nst = this.value <= this.ref;\n\t\n\tif(nst !== this.state)\n\t\tthis.state = nst;\n\telse\n\t\tthis.updated = false;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.state;\n};\n"
  },
  {
    "path": "browser/plugins/matrix_clone_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"matrix_clone_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Makes a physical copy of the input matrix reference, to allow side-effect free transform chain branching.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'matrix', dt: core.datatypes.MATRIX, desc: 'Input matrix reference.', def: core.renderer.matrix_identity }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'matrix', dt: core.datatypes.MATRIX, desc: 'The cloned matrix.' }\n\t];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.matrix = mat4.create(data);\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.matrix;\n};\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.matrix = mat4.create();\n\t\t\n\t\tmat4.identity(this.matrix);\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/matrix_display.plugin.js",
    "content": "E2.p = E2.plugins[\"matrix_display\"] = function(core, node)\n{\n\tthis.desc = 'Displays the supplied matrix as a 4x4 grid of values.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'matrix', dt: core.datatypes.MATRIX, desc: 'The input matrix to be displayed.', def: null }\n\t];\n\t\n\tthis.output_slots = [];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.cell_vals = ['-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-', '-'];\n\tthis.update_values();\n};\n\nE2.p.prototype.create_ui = function()\n{\n\tvar table = make('table');\n\tvar css = { 'text-align': 'right', 'padding-left': '10px' };\n\t\n\tthis.columns = [];\n\t\n\tfor(var r = 0; r < 4; r++)\n\t{\n\t\tvar row = make('tr');\n\t\t\n\t\tfor(var c = 0; c < 4; c++)\n\t\t{\n\t\t\tvar col = make('td');\n\t\t\n\t\t\tcol.text('-');\n\t\t\tcol.css(css);\n\t\t\tthis.columns.push(col[0]);\n\t\t\n\t\t\trow.append(col);\n\t\t}\n\t\t\n\t\ttable.append(row);\n\t}\t\t\n\n\treturn table;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(!data)\n\t{\n\t\tthis.reset();\n\t\treturn;\n\t}\n\t\n\tvar ofs = 0;\n\t\n\tfor(var i = 0; i < 16; i++)\n\t\tthis.cell_vals[i] = data[i].toFixed(2);\n\n\tthis.update_values();\n};\n\nE2.p.prototype.update_values = function()\n{\n\tif(!this.columns)\n\t\treturn;\n\t\n\tfor(var i = 0; i < 16; i++)\n\t\tthis.columns[i].innerHTML = this.cell_vals[i];\n};\n"
  },
  {
    "path": "browser/plugins/max_modulator.plugin.js",
    "content": "E2.p = E2.plugins.max_modulator = function(core, node) {\n\tthis.desc = 'Emit the greater of the two input values.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'a', dt: core.datatypes.FLOAT, desc: 'The first input value', def: 0.0 },\n\t\t{ name: 'b', dt: core.datatypes.FLOAT, desc: 'The second input value', def: 0.0 } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'max', dt: core.datatypes.FLOAT, desc: 'The larger of the two supplied values.', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.val_a = 0.0;\n\tthis.val_b = 0.0;\n\tthis.output_val = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.val_a = data;\n\telse\n\t\tthis.val_b = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.output_val = Math.max(this.val_a, this.val_b);\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.output_val;\n};\t\n"
  },
  {
    "path": "browser/plugins/member_array_length_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"member_array_length_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits the length of an array member of the supplied object.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'object', dt: core.datatypes.OBJECT, desc: 'Input object containing an array.', def: null },\n\t\t{ name: 'member', dt: core.datatypes.TEXT, desc: 'Name of the array to emit the length of.', def: null }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'length', dt: core.datatypes.FLOAT, desc: 'The length of the specified array or 0.', def: 0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.len = 0;\n\tthis.object = null;\n\tthis.array_name = null;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.object = data;\n\telse if(slot.index === 1)\n\t\tthis.array_name = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.len = 0;\n\t\n\tif(this.object === null || this.array_name === null)\n\t\treturn;\n\t\n\tif(!this.object.hasOwnProperty(this.array_name))\n\t{\n\t\tmsg('ERROR: Cannot index unknown array \"' + this.array_name + '\".');\n\t\treturn;\n\t}\n\t\n\tvar a = this.object[this.array_name];\n\t\n\tif(Object.prototype.toString.call(a) !== '[object Array]')\n\t{\n\t\tmsg('ERROR: Object member \"' + this.array_name + '\" is not an array.');\n\t\treturn;\n\t}\n\t\n\tthis.len = a.length;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.len;\n};\n"
  },
  {
    "path": "browser/plugins/member_to_bool_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"member_to_bool_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits a boolean representation of specified member of the supplied object.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'object', dt: core.datatypes.OBJECT, desc: 'Input object.', def: null },\n\t\t{ name: 'member', dt: core.datatypes.TEXT, desc: 'Name of the member to be converted.', def: null }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: 'The boolean representation of the specified member.', def: 'Empty array' }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = false;\n\tthis.object = null;\n\tthis.member = null;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.object = data;\n\telse if(slot.index === 1)\n\t\tthis.member = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tif(this.object === null || this.member === null)\n\t\treturn;\n\t\n\tif(!this.object.hasOwnProperty(this.member))\n\t{\n\t\tmsg('ERROR: Cannot convert unknown member \"' + this.member + '\".');\n\t\treturn;\n\t}\n\t\n\tthis.value = this.object[this.member] ? true: false;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/member_to_float_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"member_to_float_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits a float representation of specified member of the supplied object.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'object', dt: core.datatypes.OBJECT, desc: 'Input object.', def: null },\n\t\t{ name: 'member', dt: core.datatypes.TEXT, desc: 'Name of the member to be converted.', def: null }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'The float representation of the specified member.', def: 'Empty array' }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0;\n\tthis.object = null;\n\tthis.member = null;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.object = data;\n\telse if(slot.index === 1)\n\t\tthis.member = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tif(this.object === null || this.member === null)\n\t\treturn;\n\t\n\tif(!this.object.hasOwnProperty(this.member))\n\t{\n\t\tmsg('ERROR: Cannot convert unknown member \"' + this.member + '\".');\n\t\treturn;\n\t}\n\t\n\tvar d = this.object[this.member];\n\t\n\tif(isNaN(d))\n\t{\n\t\tmsg('ERROR: The member \"' + this.member + '\" is not a float.');\n\t\treturn;\n\t}\n\t\n\tthis.value = parseFloat(d);\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/member_to_object_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"member_to_object_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits an object representation of specified member of the supplied object.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'object', dt: core.datatypes.OBJECT, desc: 'Input object.', def: null },\n\t\t{ name: 'member', dt: core.datatypes.TEXT, desc: 'Name of the member to be converted.', def: null }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'object', dt: core.datatypes.OBJECT, desc: 'The object representation of the specified member.', def: 'Empty array' }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = {};\n\tthis.object = null;\n\tthis.member = null;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.object = data;\n\telse if(slot.index === 1)\n\t\tthis.member = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tif(this.object === null || this.member === null)\n\t\treturn;\n\t\n\tif(!this.object.hasOwnProperty(this.member))\n\t{\n\t\tmsg('ERROR: Cannot convert unknown member \"' + this.member + '\".');\n\t\treturn;\n\t}\n\t\n\tvar d = this.object[this.member];\n\t\n\tif(d === null || typeof(d) !== 'object')\n\t{\n\t\tmsg('ERROR: The member \"' + this.member + '\" is not an object.');\n\t\treturn;\n\t}\n\t\n\tthis.value = d;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/member_to_string_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"member_to_string_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits a string representation of specified member of the supplied object.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'object', dt: core.datatypes.OBJECT, desc: 'Input object.', def: null },\n\t\t{ name: 'member', dt: core.datatypes.TEXT, desc: 'Name of the member to be converted.', def: null }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'text', dt: core.datatypes.TEXT, desc: 'The string representation of the specified member.', def: 'Empty array' }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = '';\n\tthis.object = null;\n\tthis.member = null;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.object = data;\n\telse if(slot.index === 1)\n\t\tthis.member = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tif(this.object === null || this.member === null)\n\t\treturn;\n\t\n\tif(!this.object.hasOwnProperty(this.member))\n\t{\n\t\tmsg('ERROR: Cannot convert unknown member \"' + this.member + '\".');\n\t\treturn;\n\t}\n\t\n\tthis.value = this.object[this.member].toString();\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/member_to_typed_array_modulator.plugin.js",
    "content": "(function(){\nvar MemberToTypedArray = E2.plugins[\"member_to_typed_array_modulator\"] = function(core, node)\n{\n\tPlugin.apply(this, arguments)\n\tthis.desc = 'Emits an typed array representation of specified member of the supplied object.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'object', dt: core.datatypes.OBJECT, desc: 'Input object.', def: null },\n\t\t{ name: 'member', dt: core.datatypes.TEXT, desc: 'Name of the member to be converted.', def: null }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'array', dt: core.datatypes.ARRAY, desc: 'The typed array representation of the specified member.', def: 'Empty array' }\n\t];\n\n\tthis.state = { datatype: 6 }; // Default float32\n};\n\nMemberToTypedArray.prototype = Object.create(Plugin.prototype)\n\nMemberToTypedArray.prototype.reset = function()\n{\n\tthis.array = new ArrayBuffer(0);\n\tthis.object = null;\n\tthis.member = null;\n};\n\nMemberToTypedArray.prototype.create_ui = function()\n{\n\tvar inp = $('<select />', { selectedIndex: 1 });\n\t\n\t$('<option />', { value: 0, text: 'Int8' }).appendTo(inp);\n\t$('<option />', { value: 1, text: 'Uint8' }).appendTo(inp);\n\t$('<option />', { value: 2, text: 'Int16' }).appendTo(inp);\n\t$('<option />', { value: 3, text: 'Uint16' }).appendTo(inp);\n\t$('<option />', { value: 4, text: 'Int32' }).appendTo(inp);\n\t$('<option />', { value: 5, text: 'Uint32' }).appendTo(inp);\n\t$('<option />', { value: 6, text: 'Float32' }).appendTo(inp);\n\t\n\tinp.change(function(self) { return function() \n\t{\n\t\tself.undoableSetState('datatype', parseInt(inp.val()), self.state.datatype)\n\t}}(this));\n\t\n\treturn inp;\n};\n\nMemberToTypedArray.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.object = data;\n\telse if(slot.index === 1)\n\t\tthis.member = data;\n};\t\n\nMemberToTypedArray.prototype.update_state = function()\n{\n\tif(this.object === null || this.member === null)\n\t\treturn;\n\t\n\tif(!this.object.hasOwnProperty(this.member))\n\t{\n\t\tmsg('ERROR: Cannot convert unknown member \"' + this.member + '\".');\n\t\treturn;\n\t}\n\t\n\tvar d = this.object[this.member];\n\t\n\tif(Object.prototype.toString.call(d).toLowerCase() !== '[object array]')\n\t{\n\t\tmsg('ERROR: The member \"' + this.member + '\" is not an array.');\n\t\treturn;\n\t}\n\t\n\tswitch(this.state.datatype)\n\t{\n\t\tcase 0: this.array = new Int8Array(d); break;\n\t\tcase 1: this.array = new Uint8Array(d); break;\n\t\tcase 2: this.array = new Int16Array(d); break;\n\t\tcase 3: this.array = new Uint16Array(d); break;\n\t\tcase 4: this.array = new Int32Array(d); break;\n\t\tcase 5: this.array = new Uint32Array(d); break;\n\t\tcase 6: this.array = new Float32Array(d); break;\n\t}\n\t\n\tthis.array = this.array.buffer; // Grrr..\n\tthis.array.datatype = this.state.datatype;\n\tthis.array.stride = [1, 1, 2, 2, 4, 4, 4][this.state.datatype];\n};\n\nMemberToTypedArray.prototype.update_output = function(slot)\n{\n\treturn this.array;\n};\n\nMemberToTypedArray.prototype.state_changed = function(ui)\n{\n\tif(ui)\n\t\tui.val('' + this.state.datatype);\n};\n})();"
  },
  {
    "path": "browser/plugins/mesh_get_primitive_count.plugin.js",
    "content": "E2.p = E2.plugins[\"mesh_get_primitive_count\"] = function(core, node)\n{\n\tthis.desc = 'Gets the number of primitives in the supplied mesh.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'mesh', dt: core.datatypes.MESH, desc: 'Input mesh.', def: null }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'mesh', dt: core.datatypes.MESH, desc: 'The input mesh.' },\n\t\t{ name: 'prim count', dt: core.datatypes.FLOAT, desc: 'The number of primitives in the specified mesh.' }\n\t];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.mesh = data;\n};\n\nE2.p.prototype.update_state = function()\n{\n\tif(!this.mesh)\n\t{\n\t\tthis.count = 0;\n\t\treturn;\n\t}\n\t\n\tthis.count = this.mesh.index_buffer ? this.mesh.index_buffer.count : this.mesh.vertex_buffers['VERTEX'].count;\n\tthis.count /= this.mesh.get_stride();\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\tif(slot.index === 0)\n\t\treturn this.mesh;\n\t\n\treturn this.count;\n};\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.mesh = null;\n\t\tthis.count = 0;\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/mesh_set_max_primitive_count.plugin.js",
    "content": "E2.p = E2.plugins[\"mesh_set_max_primitive_count\"] = function(core, node)\n{\n\tthis.desc = 'Sets the maximumber number of primitives in the supplied mesh to render.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'mesh', dt: core.datatypes.MESH, desc: 'Input mesh.', def: null },\n\t\t{ name: 'max', dt: core.datatypes.FLOAT, desc: 'Maximum number of primitives to draw (-1 = all).', def: -1 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'mesh', dt: core.datatypes.MESH, desc: 'The input mesh.' }\n\t];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.mesh = data;\n\telse\n\t\tthis.max_count = data === -1 ? null : data;\n};\n\nE2.p.prototype.update_state = function()\n{\n\tif(!this.mesh)\n\t\treturn;\n\t\n\tthis.mesh.max_prims = this.max_count;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.mesh;\n};\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.mesh = null;\n\t\tthis.max_count = null;\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/min_modulator.plugin.js",
    "content": "E2.p = E2.plugins.min_modulator = function(core, node)\n{\n\tthis.desc = 'Emit the lesser of the two input values.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'a', dt: core.datatypes.FLOAT, desc: 'The first input value', def: 0.0 },\n\t\t{ name: 'b', dt: core.datatypes.FLOAT, desc: 'The second input value', def: 0.0 } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'min', dt: core.datatypes.FLOAT, desc: 'The smaller of the two supplied values.', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.val_a = 0.0;\n\tthis.val_b = 0.0;\n\tthis.output_val = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.val_a = data;\n\telse\n\t\tthis.val_b = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.output_val = Math.min(this.val_a, this.val_b);\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.output_val;\n};\n"
  },
  {
    "path": "browser/plugins/modulate_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"modulate_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Modulate <b>value</b> such that the result will always be never be negative and less than or equal to <b>limit</b>.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Input value to be modulated.', def: 0.0 },\n\t\t{ name: 'limit', dt: core.datatypes.FLOAT, desc: 'Divisor.', lo: '>0', def: 1.0 } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'result', dt: core.datatypes.FLOAT, desc: 'Emits the remainder of <b>value</b> divided by <b>limit</b>', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.input_val = 0.0;\n\tthis.limit_val = 1.0;\n\tthis.output_val = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.input_val = data;\n\telse\n\t\tthis.limit_val = data == 0.0 ? 1.0 : data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.output_val = this.input_val % this.limit_val;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.output_val;\n};\n"
  },
  {
    "path": "browser/plugins/module_player/pt.js",
    "content": "/*\n  amiga protracker module player for web audio api\n  (c) 2012-2014 firehawk/tda  (firehawk@haxor.fi)\n  \n  originally hacked together in a weekend, so please excuse\n  me for the spaghetti code. :)\n\n  feel free to use this player in your website/demo/whatever\n  if you find it useful. drop me an email if you do.\n\n  AMIGAAAAAAAAH!!\n\n  all code licensed under MIT license:\n  http://opensource.org/licenses/MIT\n\n  kinda sorta changelog:\n  (jan 2014)\n  - disabled ee0 filter command for tracks with over 4 channels to\n    make mod.dope play correctly\n  (oct 2013)\n  - added support for firefox 24\n  (apr 2013)\n  - changed the logic for pattern break/jump. mod.pattern_skank now\n    plays correctly.\n  (feb 2013)\n  - fixed NaN samples with mod.fractured and mod.multicolour (thanks Aegis!)\n  (jan 2013)\n  - fixed vibrato amplitude (was half of what it should be, apparently)\n  - fixed to work on safari again (thanks Matt Diamond @ stackoverflow.com)\n  (dec 2012)\n  - replaced effect switch-statement with jumptables\n  - fixed clicks (bad loops, empty samples)\n  - fixed playback bug with sample-only rows\n  - added amiga 500 lowpass filters (not 100% authentic, though)\n  - added compressor to output\n  - latest safari has broken web audio so chrome-only for now\n  (aug 2012)\n  - first version written from scratch\n\n  todo:\n  - pattern looping is way broken in mod.black_queen\n  - i think mod.a_rambo_rules doesn't play right, either?\n  - properly test EEx delay pattern\n  - implement the rest of the effects\n  - optimize for more speed!! SPEEEED!!\n    * switch to fixed point sample pointers, Math.floor() is _slow_ on iOS\n*/\n\n// constructor for protracker player object\nfunction Protracker()\n{\n  var i, t;\n\n  this.initialize();\n  this.clearsong();\n\n  this.url=\"\";\n  this.loading=false;\n  this.ready=false;\n  this.playing=false;\n  this.buffer=0;\n  this.mixerNode=0;\n  this.paused=false;\n  this.repeat=false;\n  this.separation=true;\n\n  this.palclock=true;\n  \n  this.autostart=false;\n\n  this.onReady=function(){};\n  this.onPlay=function(){};\n  this.onStop=function(){};\n\n  // paula period values\n  this.baseperiodtable=new Array(\n    856,808,762,720,678,640,604,570,538,508,480,453,\n    428,404,381,360,339,320,302,285,269,254,240,226,\n    214,202,190,180,170,160,151,143,135,127,120,113);\n\n  // finetune multipliers\n  this.finetunetable=new Array();\n  for(t=0;t<16;t++) this.finetunetable[t]=Math.pow(2, (t-8)/12/8);\n  \n  // calc tables for vibrato waveforms\n  this.vibratotable=new Array();\n  for(t=0;t<4;t++) {\n    this.vibratotable[t]=new Array();\n    for(i=0;i<64;i++) {\n      switch(t) {\n        case 0:\n          this.vibratotable[t][i]=127*Math.sin(Math.PI*2*(i/64));\n          break;\n        case 1:\n          this.vibratotable[t][i]=127-4*i;\n          break;\n        case 2:\n          this.vibratotable[t][i]=(i<32)?127:-127;\n          break;\n        case 3:\n          this.vibratotable[t][i]=(1-2*Math.random())*127;\n          break;\n      }\n    }\n  }\n\n  // effect jumptables\n  this.effects_t0 = new Array(\n    this.effect_t0_0, this.effect_t0_1, this.effect_t0_2, this.effect_t0_3, this.effect_t0_4, this.effect_t0_5, this.effect_t0_6, this.effect_t0_7,\n    this.effect_t0_8, this.effect_t0_9, this.effect_t0_a, this.effect_t0_b, this.effect_t0_c, this.effect_t0_d, this.effect_t0_e, this.effect_t0_f);\n  this.effects_t0_e = new Array(\n    this.effect_t0_e0, this.effect_t0_e1, this.effect_t0_e2, this.effect_t0_e3, this.effect_t0_e4, this.effect_t0_e5, this.effect_t0_e6, this.effect_t0_e7,\n    this.effect_t0_e8, this.effect_t0_e9, this.effect_t0_ea, this.effect_t0_eb, this.effect_t0_ec, this.effect_t0_ed, this.effect_t0_ee, this.effect_t0_ef);\n  this.effects_t1 = new Array(\n    this.effect_t1_0, this.effect_t1_1, this.effect_t1_2, this.effect_t1_3, this.effect_t1_4, this.effect_t1_5, this.effect_t1_6, this.effect_t1_7,\n    this.effect_t1_8, this.effect_t1_9, this.effect_t1_a, this.effect_t1_b, this.effect_t1_c, this.effect_t1_d, this.effect_t1_e, this.effect_t1_f);\n  this.effects_t1_e = new Array(\n    this.effect_t1_e0, this.effect_t1_e1, this.effect_t1_e2, this.effect_t1_e3, this.effect_t1_e4, this.effect_t1_e5, this.effect_t1_e6, this.effect_t1_e7,\n    this.effect_t1_e8, this.effect_t1_e9, this.effect_t1_ea, this.effect_t1_eb, this.effect_t1_ec, this.effect_t1_ed, this.effect_t1_ee, this.effect_t1_ef);\n\n  this.context = null;\n  this.samplerate=44100;\n  this.bufferlen=2048;\n}\n\n\n\n// create the web audio context\nProtracker.prototype.createContext = function()\n{\n  if ( typeof AudioContext !== 'undefined') {\n    this.context = new AudioContext();\n  } else {\n    this.context = new webkitAudioContext();\n  }\n  this.samplerate=this.context.sampleRate;\n  this.bufferlen=(this.samplerate > 44100) ? 4096 : 2048; \n\n  // fixed filter at 6kHz\n  this.filterNode=this.context.createBiquadFilter();\n  this.filterNode.frequency.value=6000\n\n  // \"LED filter\" at 3.5kHz - off by default\n  this.lowpassNode=this.context.createBiquadFilter();\n  this.lowpassNode.frequency.value=28867;\n\n  // mixer\n  if ( typeof this.context.createJavaScriptNode === 'function') {\n    this.mixerNode=this.context.createJavaScriptNode(this.bufferlen, 1, 2);\n  } else {\n    this.mixerNode=this.context.createScriptProcessor(this.bufferlen, 1, 2);\n  }\n  this.mixerNode.module=this;\n  this.mixerNode.onaudioprocess=Protracker.prototype.mix;\n\n  // compressor for a bit of volume boost, helps with multich tunes\n  this.compressorNode=this.context.createDynamicsCompressor();\n\n  // patch up some cables :)  \n  this.mixerNode.connect(this.filterNode);\n  this.filterNode.connect(this.lowpassNode);\n  this.lowpassNode.connect(this.compressorNode);\n  this.compressorNode.connect(this.context.destination);\n}\n\n\n\n// play loaded and parsed module with webaudio context\nProtracker.prototype.play = function()\n{\n  if (this.context==null) this.createContext();\n  \n  if (!this.ready) return false;\n  if (this.paused) {\n    this.paused=false;\n    return true;\n  }\n  this.paused=false;\n  this.initialize();\n  this.flags=1+2;\n  this.playing=true;\n  this.onPlay();\n  return true;\n}\n\n\n\n// pause playback\nProtracker.prototype.pause = function()\n{\n  if (!this.paused) {\n    this.paused=true;\n  } else {\n    this.paused=false;\n  }\n}\n\n\n\n// stop playback and release webaudio node\nProtracker.prototype.stop = function()\n{\n  this.playing=false;\n  this.onStop();\n}\n\n\n\n// jump positions forward/back\nProtracker.prototype.jump = function(step)\n{\n  this.tick=0;\n  this.row=0;\n  this.position+=step;\n  this.flags=1+2;  \n  if (this.position<0) this.position=0;\n  if (this.position >= this.songlen) this.stop();\n}\n\n\n\n// set whether module repeats after songlen\nProtracker.prototype.setrepeat = function(rep)\n{\n  this.repeat=rep;\n}\n\n\n\n// set stereo separation mode (false=paula, true=betterpaula)\nProtracker.prototype.setseparation = function(sep)\n{\n  this.separation=sep;\n}\n\n\n\n// set amiga video standard (false=NTSC, true=PAL)\nProtracker.prototype.setamigatype = function(clock)\n{\n  this.palclock=clock;\n}\n\n\n\n// set autostart to play immediately after loading\nProtracker.prototype.setautostart = function(st)\n{\n  this.autostart=st;\n}\n\n\n\n// clear song data\nProtracker.prototype.clearsong = function()\n{  \n  this.title=\"\";\n  this.signature=\"\";\n  this.songlen=1;\n  this.repeatpos=0;\n  this.patterntable=new ArrayBuffer(128);\n  for(i=0;i<128;i++) this.patterntable[i]=0;\n\n  this.channels=4;\n\n  this.sample=new Array();\n  this.samples=31;\n  for(i=0;i<31;i++) {\n    this.sample[i]=new Object();\n    this.sample[i].name=\"\";\n    this.sample[i].length=0;\n    this.sample[i].finetune=0;\n    this.sample[i].volume=64;\n    this.sample[i].loopstart=0;\n    this.sample[i].looplength=0;\n    this.sample[i].data=0;\n  }\n\n  this.patterns=0;\n  this.pattern=new Array();\n  this.note=new Array();\n  \n  this.looprow=0;\n  this.loopstart=0;\n  this.loopcount=0;\n  \n  this.patterndelay=0;\n  this.patternwait=0;\n}\n\n\n// initialize all player variables\nProtracker.prototype.initialize = function()\n{\n  this.tick=0;\n  this.position=0;\n  this.row=0;\n  this.offset=0;\n  this.flags=0;\n\n  this.speed=6;\n  this.bpm=125;\n  this.breakrow=0;\n  this.patternjump=0;\n  this.patterndelay=0;\n  this.patternwait=0;\n  \n  this.channel=new Array();\n  for(i=0;i<this.channels;i++) {\n    this.channel[i]=new Object();\n    this.channel[i].sample=0;\n    this.channel[i].period=214;\n    this.channel[i].voiceperiod=214;\n    this.channel[i].note=24;    \n    this.channel[i].volume=64;\n    this.channel[i].command=0;\n    this.channel[i].data=0;\n    this.channel[i].samplepos=0;\n    this.channel[i].samplespeed=0;\n    this.channel[i].flags=0;\n    this.channel[i].noteon=0;\n    this.channel[i].slidespeed=0;\n    this.channel[i].slideto=214;\n    this.channel[i].slidetospeed=0;\n    this.channel[i].arpeggio=0;\n\n    this.channel[i].semitone=12;\n    this.channel[i].vibratospeed=0\n    this.channel[i].vibratodepth=0\n    this.channel[i].vibratopos=0;\n    this.channel[i].vibratowave=0;\n  }\n  this.vu=new Array();\n}\n\n\n\n// load module from url into local buffer\nProtracker.prototype.load = function(url)\n{\n    this.url=url;\n    this.clearsong();\n    \n    var request = new XMLHttpRequest();\n    request.open(\"GET\", this.url, true);\n    request.responseType = \"arraybuffer\";\n    this.request = request;\n    this.loading=true;\n    var asset = this;\n    request.onload = function() {\n        asset.buffer=new Uint8Array(request.response);\n        asset.parse();\n        if (asset.autostart) asset.play();\n    }\n    request.send();  \n}\n\n\n\n// parse the module from local buffer\nProtracker.prototype.parse = function()\n{\n  var i,j,c;\n  \n  if (!this.buffer) return false;\n  \n  for(i=0;i<4;i++) this.signature+=String.fromCharCode(this.buffer[1080+i]);\n  switch (this.signature) {\n    case \"M.K.\":\n    case \"M!K!\":\n    case \"4CHN\":\n    case \"FLT4\":\n      break;\n\n    case \"6CHN\":\n      this.channels=6;\n      break;\n      \n    case \"8CHN\":\n    case \"FLT8\":\n      this.channels=8;\n      break;\n\n    case \"28CH\":\n      this.channels=28;\n      break;\n    \n    default:\n      return false;\n  }\n  this.vu=new Array();\n  for(i=0;i<this.channels;i++) this.vu[i]=0.0;\n  \n  i=0;\n  while(this.buffer[i] && i<20)\n    this.title=this.title+String.fromCharCode(this.buffer[i++]);\n\n  for(i=0;i<this.samples;i++) {\n    var st=20+i*30;\n    j=0;\n    while(this.buffer[st+j] && j<22) { \n      this.sample[i].name+=\n        ((this.buffer[st+j]>0x1f) && (this.buffer[st+j]<0x7f)) ? \n        (String.fromCharCode(this.buffer[st+j])) :\n        (\" \");\n      j++;\n    }\n    this.sample[i].length=2*(this.buffer[st+22]*256 + this.buffer[st+23]);\n    this.sample[i].finetune=this.buffer[st+24];\n    if (this.sample[i].finetune > 7) this.sample[i].finetune=this.sample[i].finetune-16;\n    this.sample[i].volume=this.buffer[st+25];\n    this.sample[i].loopstart=2*(this.buffer[st+26]*256 + this.buffer[st+27]);\n    this.sample[i].looplength=2*(this.buffer[st+28]*256 + this.buffer[st+29]);\n    if (this.sample[i].looplength==2) this.sample[i].looplength=0;\n    if (this.sample[i].loopstart>this.sample[i].length) {\n      this.sample[i].loopstart=0;\n      this.sample[i].looplength=0;\n    }\n  }\n\n  this.songlen=this.buffer[950];\n  if (this.buffer[951] != 127) this.repeatpos=this.buffer[951];\n  for(i=0;i<128;i++) {\n    this.patterntable[i]=this.buffer[952+i];\n    if (this.patterntable[i] > this.patterns) this.patterns=this.patterntable[i];\n  }\n  this.patterns+=1;\n  var patlen=4*64*this.channels;\n\n  this.pattern=new Array();\n  this.note=new Array();\n  for(i=0;i<this.patterns;i++) {\n    this.pattern[i]=new Uint8Array(patlen);\n    this.note[i]=new Uint8Array(this.channels*64);\n    for(j=0;j<patlen;j++) this.pattern[i][j]=this.buffer[1084+i*patlen+j];\n    for(j=0;j<64;j++) for(c=0;c<this.channels;c++) {\n      this.note[i][j*this.channels+c]=0;\n      var n=(this.pattern[i][j*4*this.channels+c*4]&0x0f)<<8 | this.pattern[i][j*4*this.channels+c*4+1];\n      for(var np=0; np<this.baseperiodtable.length; np++)\n        if (n==this.baseperiodtable[np]) this.note[i][j*this.channels+c]=np;\n    }        \n  }\n  \n  var sst=1084+this.patterns*patlen;\n  for(i=0;i<this.samples;i++) {\n    this.sample[i].data=new Float32Array(this.sample[i].length);\n    for(j=0;j<this.sample[i].length;j++) {\n      var q=this.buffer[sst+j];\n      if (q<128) {\n        q=q/128.0;\n      } else {\n        q=((q-128)/128.0)-1.0;\n      }\n      \n      this.sample[i].data[j]=q;\n    }\n    sst+=this.sample[i].length;\n  }\n\n  this.ready=true;\n  this.loading=false;\n  this.buffer=0;\n\n  if (this.context) this.lowpassNode.frequency.value=28867;\n\n  this.onReady();\n  return true;\n}\n\n\n\n// advance player\nProtracker.prototype.advance=function(mod) {\n  var spd=(((mod.samplerate*60)/mod.bpm)/4)/6;\n\n  // advance player\n  if (mod.offset>spd) { mod.tick++; mod.offset=0; mod.flags|=1; }\n  if (mod.tick>=mod.speed) {\n\n    if (mod.patterndelay) { // delay pattern\n      if (mod.tick < ((mod.patternwait+1)*mod.speed)) {\n        mod.patternwait++;\n      } else {\n        mod.row++; mod.tick=0; mod.flags|=2; mod.patterndelay=0;\n      }\n    }\n    else {\n\n      if (mod.flags&(16+32+64)) {\n        if (mod.flags&64) { // loop pattern?\n          mod.row=mod.looprow;\n          mod.flags&=0xa1;\n          mod.flags|=2;\n        }\n        else {\n          if (mod.flags&16) { // pattern jump/break?\n            //console.log(\"break to pattern \" + mod.patternjump + \" row \"+mod.breakrow);\n            mod.position=mod.patternjump;\n            mod.row=mod.breakrow;\n            mod.patternjump=0;\n            mod.breakrow=0;\n            mod.flags&=0xe1;\n            mod.flags|=2;\n          }\n        }\n        mod.tick=0;\n      } else {\n        mod.row++; mod.tick=0; mod.flags|=2;\n      }\n    }\n  }\n  if (mod.row>=64) { mod.position++; mod.row=0; mod.flags|=4; }\n  if (mod.position>=mod.songlen) {\n    if (mod.repeat) {\n      mod.position=0;\n    } else {\n      mod.stop();\n    }\n    return;\n  }\n}\n\n\n\n// mix an audio buffer with data\nProtracker.prototype.mix = function(ape) {\n  var f;\n  var p, pp, n, nn;\n  var mod;\n  if (ape.srcElement) {\n    mod=ape.srcElement.module;\n  } else {\n    mod=this.module;\n  }\n  outp=new Array();\n\n  var bufs=new Array(ape.outputBuffer.getChannelData(0), ape.outputBuffer.getChannelData(1));\n  var buflen=ape.outputBuffer.length;\n  for(var s=0;s<buflen;s++)\n  {\n    outp[0]=0.0;\n    outp[1]=0.0;\n\n    if (!mod.paused && mod.playing)\n    {\n      mod.advance(mod);\n\n      var och=0;\n      for(var ch=0;ch<mod.channels;ch++)\n      {\n        // calculate playback position\n        p=mod.patterntable[mod.position];\n        pp=mod.row*4*mod.channels + ch*4;\n        if (mod.flags&2) { // new row\n          mod.channel[ch].command=mod.pattern[p][pp+2]&0x0f;\n          mod.channel[ch].data=mod.pattern[p][pp+3];\n\n          if (!(mod.channel[ch].command==0x0e && (mod.channel[ch].data&0xf0)==0xd0)) {\n            n=(mod.pattern[p][pp]&0x0f)<<8 | mod.pattern[p][pp+1];\n            if (n) {\n              // noteon, except if command=3 (porta to note)\n              if ((mod.channel[ch].command != 0x03) && (mod.channel[ch].command != 0x05)) {\n                mod.channel[ch].period=n;\n                mod.channel[ch].samplepos=0;\n                if (mod.channel[ch].vibratowave>3) mod.channel[ch].vibratopos=0;\n                mod.channel[ch].flags|=3; // recalc speed\n                mod.channel[ch].noteon=1;\n              } else {\n                mod.channel[ch].slideto=n;\n              }\n            }\n            nn=mod.pattern[p][pp+0]&0xf0 | mod.pattern[p][pp+2]>>4;\n            if (nn) {\n              mod.channel[ch].sample=nn-1;\n              mod.channel[ch].volume=mod.sample[nn-1].volume;\n              if (!n && (mod.channel[ch].samplepos > mod.sample[nn-1].length)) mod.channel[ch].samplepos=0;\n            }\n          }\n        }\n        mod.channel[ch].voiceperiod=mod.channel[ch].period;\n        \n        // kill empty samples\n        if (!mod.sample[mod.channel[ch].sample].length) mod.channel[ch].noteon=0;\n\n        // effects        \n        if (mod.flags&1) {\n          if (!mod.tick) {\n            // process only on tick 0\n            mod.effects_t0[mod.channel[ch].command](mod, ch);\n          } else {\n            mod.effects_t1[mod.channel[ch].command](mod, ch);    \n          }\n        }\n\n        // recalc note number from period\n        if (mod.channel[ch].flags&2) {\n          for(var np=0; np<mod.baseperiodtable.length; np++)\n            if (mod.baseperiodtable[np]>=mod.channel[ch].period) mod.channel[ch].note=np;\n          mod.channel[ch].semitone=7;\n          if (mod.channel[ch].period>=120)\n            mod.channel[ch].semitone=mod.baseperiodtable[mod.channel[ch].note]-mod.baseperiodtable[mod.channel[ch].note+1];\n        }\n\n        // recalc sample speed and apply finetune\n        if ((mod.channel[ch].flags&1 || mod.flags&2) && mod.channel[ch].voiceperiod)\n          mod.channel[ch].samplespeed=\n            (mod.palclock ? 7093789.2 : 7159090.5)/(mod.channel[ch].voiceperiod*2) * mod.finetunetable[mod.sample[mod.channel[ch].sample].finetune+8] / mod.samplerate;\n        \n        // advance vibrato on each new tick\n        if (mod.flags&1) {\n          mod.channel[ch].vibratopos+=mod.channel[ch].vibratospeed;\n          mod.channel[ch].vibratopos&=0x3f;\n        }\n\n        // mix channel to output        \n        och=och^(ch&1);\n        f=0.0;\n        if (mod.channel[ch].noteon) {\n          if (mod.sample[mod.channel[ch].sample].length > mod.channel[ch].samplepos)\n            f=(1.0/mod.channels) *\n              (mod.sample[mod.channel[ch].sample].data[Math.floor(mod.channel[ch].samplepos)]*mod.channel[ch].volume)/64.0;\n          outp[och]+=f;\n          mod.channel[ch].samplepos+=mod.channel[ch].samplespeed;\n        }\n        if (s==0) mod.vu[ch]=Math.abs(f);\n\n        // loop or end samples\n        if (mod.channel[ch].noteon) {\n          if (mod.sample[mod.channel[ch].sample].loopstart || mod.sample[mod.channel[ch].sample].looplength) {\n            if (mod.channel[ch].samplepos >= (mod.sample[mod.channel[ch].sample].loopstart+mod.sample[mod.channel[ch].sample].looplength)) {\n              mod.channel[ch].samplepos=mod.sample[mod.channel[ch].sample].loopstart;\n            }\n          } else {\n            if (mod.channel[ch].samplepos >= mod.sample[mod.channel[ch].sample].length) {\n              mod.channel[ch].noteon=0;\n            }\n          }\n        }\n\n        // clear channel flags\n        mod.channel[ch].flags=0;\n      } \n      mod.offset++;\n      mod.flags&=0x70;      \n    }\n    \n    // a more headphone-friendly stereo separation (aka. betterpaula)\n    if (mod.separation) {\n      t=outp[0];\n      outp[0]=outp[0]*0.6 + outp[1]*0.4;\n      outp[1]=outp[1]*0.6 + t*0.4;\n    }\n    bufs[0][s]=outp[0];\n    bufs[1][s]=outp[1];\n  }\n}\n\n\n\n//\n// tick 0 effect functions\n//\nProtracker.prototype.effect_t0_0=function(mod, ch) { // 0 arpeggio\n  mod.channel[ch].arpeggio=mod.channel[ch].data;\n}\nProtracker.prototype.effect_t0_1=function(mod, ch) { // 1 slide up\n  if (mod.channel[ch].data) mod.channel[ch].slidespeed=mod.channel[ch].data;\n}\nProtracker.prototype.effect_t0_2=function(mod, ch) { // 2 slide down\n  if (mod.channel[ch].data) mod.channel[ch].slidespeed=mod.channel[ch].data;\n}\nProtracker.prototype.effect_t0_3=function(mod, ch) { // 3 slide to note\n  if (mod.channel[ch].data) mod.channel[ch].slidetospeed=mod.channel[ch].data;\n}\nProtracker.prototype.effect_t0_4=function(mod, ch) { // 4 vibrato\n  if (mod.channel[ch].data&0x0f && mod.channel[ch].data&0xf0) {\n    mod.channel[ch].vibratodepth=(mod.channel[ch].data&0x0f);\n    mod.channel[ch].vibratospeed=(mod.channel[ch].data&0xf0)>>4;\n  }\n  mod.channel[ch].voiceperiod+=\n    (mod.channel[ch].vibratodepth/32)*mod.channel[ch].semitone*(mod.vibratotable[mod.channel[ch].vibratowave&3][mod.channel[ch].vibratopos]/127);        \n  mod.channel[ch].flags|=1;\n}\nProtracker.prototype.effect_t0_5=function(mod, ch) { // 5\n}\nProtracker.prototype.effect_t0_6=function(mod, ch) { // 6\n}\nProtracker.prototype.effect_t0_7=function(mod, ch) { // 7\n}\nProtracker.prototype.effect_t0_8=function(mod, ch) { // 8\n}\nProtracker.prototype.effect_t0_9=function(mod, ch) { // 9 set sample offset\n  mod.channel[ch].samplepos=mod.channel[ch].data*256;\n}\nProtracker.prototype.effect_t0_a=function(mod, ch) { // a\n}\nProtracker.prototype.effect_t0_b=function(mod, ch) { // b pattern jump\n  mod.breakrow=0;\n  mod.patternjump=mod.channel[ch].data;\n  mod.flags|=16;\n}\nProtracker.prototype.effect_t0_c=function(mod, ch) { // c set volume\n  mod.channel[ch].volume=mod.channel[ch].data;\n}\nProtracker.prototype.effect_t0_d=function(mod, ch) { // d pattern break\n  mod.breakrow=((mod.channel[ch].data&0xf0)>>4)*10 + (mod.channel[ch].data&0x0f);\n  if (!(mod.flags&16)) mod.patternjump=mod.position+1;\n  mod.flags|=16;  \n}\nProtracker.prototype.effect_t0_e=function(mod, ch) { // e\n  var i=(mod.channel[ch].data&0xf0)>>4;\n  mod.effects_t0_e[i](mod, ch);\n}\nProtracker.prototype.effect_t0_f=function(mod, ch) { // f set speed\n  if (mod.channel[ch].data > 32) {\n    mod.bpm=mod.channel[ch].data;\n  } else {\n    if (mod.channel[ch].data) mod.speed=mod.channel[ch].data;\n  }\n}\n\n\n\n//\n// tick 0 effect e functions\n//\nProtracker.prototype.effect_t0_e0=function(mod, ch) { // e0 filter on/off\n  if (mod.channels > 4) return; // use only for 4ch amiga tunes\n  if (mod.channel[ch].data&0x0f) {\n    mod.lowpassNode.frequency.value=4280; // 3500Hz is \"historical\", i guess?\n  } else {\n    mod.lowpassNode.frequency.value=28867;\n  }\n}\nProtracker.prototype.effect_t0_e1=function(mod, ch) { // e1 fine slide up\n  mod.channel[ch].period-=mod.channel[ch].data&0x0f;\n  if (mod.channel[ch].period < 113) mod.channel[ch].period=113;\n}\nProtracker.prototype.effect_t0_e2=function(mod, ch) { // e2 fine slide down\n  mod.channel[ch].period+=mod.channel[ch].data&0x0f;\n  if (mod.channel[ch].period > 856) mod.channel[ch].period=856;\n  mod.channel[ch].flags|=1;\n}\nProtracker.prototype.effect_t0_e3=function(mod, ch) { // e3 set glissando\n}\nProtracker.prototype.effect_t0_e4=function(mod, ch) { // e4 set vibrato waveform\n  mod.channel[ch].vibratowave=mod.channel[ch].data&0x07;\n}\nProtracker.prototype.effect_t0_e5=function(mod, ch) { // e5 set finetune\n}\nProtracker.prototype.effect_t0_e6=function(mod, ch) { // e6 loop pattern\n  if (mod.channel[ch].data&0x0f) {\n    if (mod.loopcount) {\n      mod.loopcount--;\n    } else {\n      mod.loopcount=mod.channel[ch].data&0x0f;\n    }\n    if (mod.loopcount) mod.flags|=64;\n  } else {\n    mod.looprow=mod.row;\n  }\n}\nProtracker.prototype.effect_t0_e7=function(mod, ch) { // e7\n}\nProtracker.prototype.effect_t0_e8=function(mod, ch) { // e8\n}\nProtracker.prototype.effect_t0_e9=function(mod, ch) { // e9\n}\nProtracker.prototype.effect_t0_ea=function(mod, ch) { // ea fine volslide up\n  mod.channel[ch].volume+=mod.channel[ch].data&0x0f;\n  if (mod.channel[ch].volume > 64) mod.channel[ch].volume=64;\n}\nProtracker.prototype.effect_t0_eb=function(mod, ch) { // eb fine volslide down\n  mod.channel[ch].volume-=mod.channel[ch].data&0x0f;\n  if (mod.channel[ch].volume < 0) mod.channel[ch].volume=0;\n}\nProtracker.prototype.effect_t0_ec=function(mod, ch) { // ec\n}\nProtracker.prototype.effect_t0_ed=function(mod, ch) { // ed delay sample\n  if (mod.tick==(mod.channel[ch].data&0x0f)) {\n    // start note\n    var p=mod.patterntable[mod.position];\n    var pp=mod.row*4*mod.channels + ch*4;            \n    n=(mod.pattern[p][pp]&0x0f)<<8 | mod.pattern[p][pp+1];\n    if (n) {\n      mod.channel[ch].period=n;\n      mod.channel[ch].voiceperiod=mod.channel[ch].period;      \n      mod.channel[ch].samplepos=0;\n      if (mod.channel[ch].vibratowave>3) mod.channel[ch].vibratopos=0;\n      mod.channel[ch].flags|=3; // recalc speed\n      mod.channel[ch].noteon=1;\n    }\n    n=mod.pattern[p][pp+0]&0xf0 | mod.pattern[p][pp+2]>>4;\n    if (n) {\n      mod.channel[ch].sample=n-1;\n      mod.channel[ch].volume=mod.sample[n-1].volume;\n    }\n  }\n}\nProtracker.prototype.effect_t0_ee=function(mod, ch) { // ee delay pattern\n  mod.patterndelay=mod.channel[ch].data&0x0f;\n  mod.patternwait=0;\n}\nProtracker.prototype.effect_t0_ef=function(mod, ch) { // ef\n}\n\n\n\n//\n// tick 1+ effect functions\n//\nProtracker.prototype.effect_t1_0=function(mod, ch) { // 0 arpeggio\n  if (mod.channel[ch].data) {\n    var apn=mod.channel[ch].note;\n    if ((mod.tick%3)==1) apn+=mod.channel[ch].arpeggio>>4;\n    if ((mod.tick%3)==2) apn+=mod.channel[ch].arpeggio&0x0f;\n    if (apn>=0 && apn <= mod.baseperiodtable.length)\n      mod.channel[ch].voiceperiod = mod.baseperiodtable[apn];\n    mod.channel[ch].flags|=1;\n  }\n}\nProtracker.prototype.effect_t1_1=function(mod, ch) { // 1 slide up\n  mod.channel[ch].period-=mod.channel[ch].slidespeed;\n  if (mod.channel[ch].period<113) mod.channel[ch].period=113;\n  mod.channel[ch].flags|=3; // recalc speed\n}\nProtracker.prototype.effect_t1_2=function(mod, ch) { // 2 slide down\n  mod.channel[ch].period+=mod.channel[ch].slidespeed;\n  if (mod.channel[ch].period>856) mod.channel[ch].period=856;\n  mod.channel[ch].flags|=3; // recalc speed                \n}\nProtracker.prototype.effect_t1_3=function(mod, ch) { // 3 slide to note\n  if (mod.channel[ch].period < mod.channel[ch].slideto) {\n    mod.channel[ch].period+=mod.channel[ch].slidetospeed;\n    if (mod.channel[ch].period > mod.channel[ch].slideto)\n      mod.channel[ch].period=mod.channel[ch].slideto;\n  }\n  if (mod.channel[ch].period > mod.channel[ch].slideto) {\n    mod.channel[ch].period-=mod.channel[ch].slidetospeed;\n    if (mod.channel[ch].period<mod.channel[ch].slideto)\n      mod.channel[ch].period=mod.channel[ch].slideto;\n  }\n  mod.channel[ch].flags|=3; // recalc speed\n}\nProtracker.prototype.effect_t1_4=function(mod, ch) { // 4 vibrato\n  mod.channel[ch].voiceperiod+=\n    (mod.channel[ch].vibratodepth/16)*mod.channel[ch].semitone*(mod.vibratotable[mod.channel[ch].vibratowave&3][mod.channel[ch].vibratopos]/127);\n  mod.channel[ch].flags|=1;\n}\nProtracker.prototype.effect_t1_5=function(mod, ch) { // 5 volslide + slide to note\n  mod.effect_t1_3(mod, ch); // slide to note\n  mod.effect_t1_a(mod, ch); // volslide\n}\nProtracker.prototype.effect_t1_6=function(mod, ch) { // 6 volslide + vibrato\n  mod.effect_t1_4(mod, ch); // vibrato\n  mod.effect_t1_a(mod, ch); // volslide\n}\nProtracker.prototype.effect_t1_7=function(mod, ch) { // 7\n}\nProtracker.prototype.effect_t1_8=function(mod, ch) { // 8\n}\nProtracker.prototype.effect_t1_9=function(mod, ch) { // 9 set sample offset\n}\nProtracker.prototype.effect_t1_a=function(mod, ch) { // a volume slide\n  if (!(mod.channel[ch].data&0x0f)) {\n    // y is zero, slide up\n    mod.channel[ch].volume+=(mod.channel[ch].data>>4);\n    if (mod.channel[ch].volume>64) mod.channel[ch].volume=64;\n  }\n  if (!(mod.channel[ch].data&0xf0)) {\n    // x is zero, slide down\n    mod.channel[ch].volume-=(mod.channel[ch].data&0x0f);\n    if (mod.channel[ch].volume<0) mod.channel[ch].volume=0;                  \n  }\n}\nProtracker.prototype.effect_t1_b=function(mod, ch) { // b pattern jump\n}\nProtracker.prototype.effect_t1_c=function(mod, ch) { // c set volume\n}\nProtracker.prototype.effect_t1_d=function(mod, ch) { // d pattern break\n}\nProtracker.prototype.effect_t1_e=function(mod, ch) { // e\n  var i=(mod.channel[ch].data&0xf0)>>4;\n  mod.effects_t1_e[i](mod, ch);\n}\nProtracker.prototype.effect_t1_f=function(mod, ch) { // f\n}\n\n\n\n//\n// tick 1+ effect e functions\n//\nProtracker.prototype.effect_t1_e0=function(mod, ch) { // e0\n}\nProtracker.prototype.effect_t1_e1=function(mod, ch) { // e1\n}\nProtracker.prototype.effect_t1_e2=function(mod, ch) { // e2\n}\nProtracker.prototype.effect_t1_e3=function(mod, ch) { // e3\n}\nProtracker.prototype.effect_t1_e4=function(mod, ch) { // e4\n}\nProtracker.prototype.effect_t1_e5=function(mod, ch) { // e5\n}\nProtracker.prototype.effect_t1_e6=function(mod, ch) { // e6\n}\nProtracker.prototype.effect_t1_e7=function(mod, ch) { // e7\n}\nProtracker.prototype.effect_t1_e8=function(mod, ch) { // e8\n}\nProtracker.prototype.effect_t1_e9=function(mod, ch) { // e9 retrig sample\n  if (mod.tick%(mod.channel[ch].data&0x0f)==0)\n    mod.channel[ch].samplepos=0;\n}\nProtracker.prototype.effect_t1_ea=function(mod, ch) { // ea\n}\nProtracker.prototype.effect_t1_eb=function(mod, ch) { // eb\n}\nProtracker.prototype.effect_t1_ec=function(mod, ch) { // ec cut sample\n  if (mod.tick==(mod.channel[ch].data&0x0f))\n    mod.channel[ch].volume=0;\n}\nProtracker.prototype.effect_t1_ed=function(mod, ch) { // ed delay sample\n  mod.effect_t0_ed(mod, ch);\n}\nProtracker.prototype.effect_t1_ee=function(mod, ch) { // ee\n}\nProtracker.prototype.effect_t1_ef=function(mod, ch) { // ef\n}\n"
  },
  {
    "path": "browser/plugins/module_player.plugin.js",
    "content": "E2.p = E2.plugins[\"module_player\"] = function(core, node)\n{\n\tthis.desc = 'Play a protracker-compatible .mod file using library by firehawk/tda (firehawk@haxor.fi).';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'url', dt: core.datatypes.TEXT, desc: 'The url of the module to play.', def: null },\n\t\t{ name: 'play', dt: core.datatypes.BOOL, desc: 'Send true to start playback and false to stop.', def: false },\n\t];\n\t\n\tthis.output_slots = [\n\t]\n\t\n\tcore.add_aux_script('module_player/pt.js', function(self) { return function()\n\t{\n\t\tself.player = new Protracker();\n\t}}(this));\n\n\tthis.audio = null;\n\tthis.playing = false;\n\tthis.should_play = false;\n};\n\nE2.p.prototype.play = function()\n{\n\tif(this.audio && !this.playing && this.should_play)\n\t{\n\t\tthis.playing = this.should_play = true;\n\t\tthis.player.play();\n\t}\n};\n\nE2.p.prototype.pause = function()\n{\n\tif(this.player && this.playing)\n\t{\n\t\tthis.playing = false;\n\t\tthis.should_play = true;\n\t\tthis.player.pause();\n\t}\n};\n\nE2.p.prototype.stop = function()\n{\n\tif(this.player)\n\t{\n\t\tif(this.playing)\n\t\t{\n\t\t\tthis.playing = this.should_play = false;\n\t\t\tthis.player.stop();\n\t\t}\n\t}\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t{\n\t\tthis.player.load(data);\n\t\tthis.playing = false;\n\t}\n\telse if(slot.index === 1)\n\t\tthis.should_play = data;\n};\n\nE2.p.prototype.update_state = function()\n{\n\tvar player = this.player;\n\t\n\tif(!this.player || !this.player.ready)\n\t\treturn;\n\t\n\tif(this.playing !== this.should_play)\n\t{\n\t\tif(this.should_play)\n\t\t\tplayer.play();\n\t\telse\n\t\t\tplayer.pause();\n\t\t\n\t\tthis.playing = this.should_play;\n\t}\n\t\n\tif(!this.playing)\n\t\treturn;\n\n\tthis.updated = true;\n};\n"
  },
  {
    "path": "browser/plugins/more_than_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"more_than_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits true if the supplied <b>value</b> is larger than <b>reference</b> and false otherwise.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Input value to be compared.', def: 0.0 },\n\t\t{ name: 'reference', dt: core.datatypes.FLOAT, desc: 'Reference to compare <b>value</b> to.', def: 0.0 } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: 'Emits true if <b>value</b> is larger than <b>reference</b>.', def: false }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0.0;\n\tthis.ref = 0.0;\n\tthis.state = null;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.value = data;\n\telse\n\t\tthis.ref = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tvar nst = this.value > this.ref;\n\t\n\tif(nst !== this.state)\n\t\tthis.state = nst;\n\telse\n\t\tthis.updated = false;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.state;\n};\n"
  },
  {
    "path": "browser/plugins/mouse_button_generator.plugin.js",
    "content": "(function() {\n\nvar MouseButtons = E2.plugins.mouse_button_generator = function(core) {\n\tthis.desc = 'Emits the current mouse button state.'\n\t\n\tthis.input_slots = []\n\t\n\tthis.output_slots = [ \n\t\t{ name: 'Left', dt: core.datatypes.BOOL, desc: 'True if the left mouse button is pressed and false otherwise.', def: false },\n\t\t{ name: 'Middle', dt: core.datatypes.BOOL, desc: 'True if the middle mouse button is pressed and false otherwise.', def: false },\n\t\t{ name: 'Right', dt: core.datatypes.BOOL, desc: 'True if the right mouse button is pressed and false otherwise.', def: false }\n\t]\n}\n\nMouseButtons.prototype.update_output = function(slot) {\n\treturn this.buttons[slot.index]\n}\n\nMouseButtons.prototype.mouse_down = function(e) {\n\te.preventDefault()\n\tthis.buttons[e.which - 1] = true\n\tthis.updated = true\n}\n\nMouseButtons.prototype.mouse_up = function(e) {\n\tthis.buttons[e.which - 1] = false\n\tthis.updated = true\n}\n\nMouseButtons.prototype.state_changed = function(ui) {\n\tif (!ui) {\n\t\tthis.buttons = []\n\t\tthis.buttons[0] = this.buttons[1] = this.buttons[2] = false\n\n\t\tE2.dom.webgl_canvas.on('mousedown', this.mouse_down.bind(this))\n\t\tE2.dom.webgl_canvas.on('mouseup', this.mouse_up.bind(this))\n\t}\n}\n\n})()\n"
  },
  {
    "path": "browser/plugins/mouse_position_generator.plugin.js",
    "content": "E2.p = E2.plugins[\"mouse_position_generator\"] = function(core, node)\n{\n\tthis.desc = 'Emits the current mouse position in clip space mapped to the canvas.';\n\t\n\tthis.input_slots = [];\n\t\n\tthis.output_slots = [ \n\t\t{ name: 'x', dt: core.datatypes.FLOAT, desc: '-1 at left edge of canvas and 1 at the right edge. Can be both smaller than -1 and larger than 1 if the mouse is outside the canvas bounds.', def: 0.0 },\n\t\t{ name: 'y', dt: core.datatypes.FLOAT, desc: '-1 at top edge of canvas and 1 at the bottom edge. Can be both smaller than -1 and larger than 1 if the mouse is outside the canvas bounds.', def: 0.0 } \n\t];\t\n\t\n\tthis.renderer = core.renderer;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\tif(slot.index === 0)\n\t\treturn this.x;\n\t\n\treturn this.y;\n};\n\nE2.p.prototype.mouse_moved = function(self) { return function(e)\n{\n\tvar wgl_c = E2.dom.webgl_canvas[0]; \n\tvar fs = self.renderer.fullscreen;\n\tvar w = fs ? wgl_c.clientWidth : wgl_c.width;\n\tvar h = fs ? wgl_c.clientHeight : wgl_c.height;\n\t\n\tself.x = (((e.pageX - wgl_c.offsetLeft) / w) * 2.0) - 1.0;\n\tself.y = ((1.0 - ((e.pageY - wgl_c.offsetTop) / h)) * 2.0) - 1.0;\n\tself.updated = true;\n}};\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.x = this.y = 0.0;\n\t\t$(document).mousemove(this.mouse_moved(this));\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/mouse_wheel_generator.plugin.js",
    "content": "E2.p = E2.plugins[\"mouse_wheel_generator\"] = function(core, node)\n{\n\tthis.desc = 'Emits the current mouse wheel state.';\n\t\n\tthis.input_slots = [];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'delta', dt: core.datatypes.FLOAT, desc: 'The delta mouse wheel movement.', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.delta;\n};\n\nE2.p.prototype.mouse_wheel = function(e)\n{\n\tvar delta = e.originalEvent.wheelDelta\n\tthis.delta = -delta;\n\tthis.updated = true;\n};\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.delta = 0.0;\n\t\tE2.dom.webgl_canvas.bind('mousewheel', this.mouse_wheel.bind(this));\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/multiply_modulator.plugin.js",
    "content": "(function() {\n\n\tvar MultiplyModulator = E2.plugins.multiply_modulator = function(core, node) {\n\t\tthis.desc = 'Multiplies the two supplied values and emits the result.'\n\t\t\n\t\tthis.input_slots = [ \n\t\t\t{ name: 'a', dt: core.datatypes.FLOAT,\n\t\t\t\tdesc: 'The first operand.', def: 0.0 },\n\t\t\t{ name: 'b', dt: core.datatypes.FLOAT,\n\t\t\t\tdesc: 'The second operand.', def: 1.0 } \n\t\t]\n\t\t\n\t\tthis.output_slots = [{\n\t\t\tname: 'result', dt: core.datatypes.FLOAT,\n\t\t\tdesc: 'The product of the two supplied values.',\n\t\t\tdef: 0.0\n\t\t}]\n\t}\n\n\tMultiplyModulator.prototype.reset = function() {\n\t\tthis.vals = [0.0, 1.0]\n\t\tthis.outputVal = 0.0\n\t}\n\n\tMultiplyModulator.prototype.update_input = function(slot, data) {\n\t\tthis.vals[slot.index] = data\n\t}\t\n\n\tMultiplyModulator.prototype.update_state = function() {\n\t\tthis.outputVal = this.vals[0] * this.vals[1]\n\t}\n\n\tMultiplyModulator.prototype.update_output = function(slot) {\n\t\treturn this.outputVal;\n\t}\n\n})();\n"
  },
  {
    "path": "browser/plugins/nand_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"nand_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits false when both inputs are true and false otherwise.';\n\tthis.input_slots = [ \n\t\t{ name: 'a', dt: core.datatypes.BOOL, desc: 'The first operand.', def: false },\n\t\t{ name: 'b', dt: core.datatypes.BOOL, desc: 'The second operand.', def: false } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: 'Emits false if <b>first</b> and <b>second</b> are true and false otherwise.', def: false }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.conds = [ false, false ];\n\tthis.state = false;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.conds[slot.index] = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.state = !(this.conds[0] && this.conds[1]);\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.state;\n};\n"
  },
  {
    "path": "browser/plugins/ne_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"ne_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits true if the supplied <b>value</b> is not equal to <b>reference</b> and false otherwise.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Input value to be compared.', def: 0.0 },\n\t\t{ name: 'reference', dt: core.datatypes.FLOAT, desc: 'Reference to compare <b>value</b> to.', def: 0.0 } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: 'Emits true if <b>value</b> is not equal to <b>reference</b>.', def: false }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0.0;\n\tthis.ref = 0.0;\n\tthis.state = null;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.value = data;\n\telse\n\t\tthis.ref = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tvar nst = this.value != this.ref;\n\t\n\tif(nst !== this.state)\n\t\tthis.state = nst;\n\telse\n\t\tthis.updated = false;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.state;\n};\n"
  },
  {
    "path": "browser/plugins/near_eq_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"near_eq_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits true if the difference between <b>value</b> and <b>reference</b> is less than or equal to <b>proximity</b>.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Input value to be compared.', def: 0.0 },\n\t\t{ name: 'proximity', dt: core.datatypes.FLOAT, desc: 'Proximity value for comparison.', def: 0.0 },\n\t\t{ name: 'reference', dt: core.datatypes.FLOAT, desc: 'Reference to compare <b>value</b> to.', def: 0.0 } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: this.desc, def: false }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0.0;\n\tthis.proximity = 0.0;\n\tthis.ref = 0.0;\n\tthis.state = null;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.value = data;\n\telse if(slot.index === 1)\n\t\tthis.proximity = data;\n\telse\n\t\tthis.ref = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tvar nst = Math.abs(this.value - this.ref) <= this.proximity;\n\t\n\tif(nst !== this.state)\n\t\tthis.state = nst;\n\telse\n\t\tthis.updated = false;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.state;\n};\n"
  },
  {
    "path": "browser/plugins/negate_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"negate_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits the sign inverted input value.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Input value to be negated.', def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: '-value', dt: core.datatypes.FLOAT, desc: 'The sign-inverted input value.', def: -0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.value = -data;\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/not_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"not_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits true if the input is false and vice versa.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: 'Input boolean to be inverted.', def: false }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: 'Truth-inverted input value.', def: true }\n\t];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.input = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.output = !this.input;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.output;\n};\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(ui)\n\t{\n\t\tthis.input = false;\n\t\tthis.output = true;\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/object_add.plugin.js",
    "content": "E2.p = E2.plugins[\"object_add\"] = function(core, node)\n{\n\tthis.desc = 'Object composition';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'object', dt: core.datatypes.OBJECT, desc: 'Optional existing object'},\n\t\t{ name: 'key', dt: core.datatypes.TEXT, desc: 'The key'},\n\t\t{ name: 'value', dt: core.datatypes.ANY, desc: 'The value: A float, text or object.'} \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'object', dt: core.datatypes.OBJECT, desc: 'The created object' }\n\t];\n\n\tthis._object = {};\n}\n\nE2.p.prototype.reset = function()\n{\n\tthis._key = null;\n\tthis._object = {};\n}\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tswitch(slot.index) {\n\t\tcase 0:\n\t\t\tvar previousValue = this._object[this._key];\n\t\t\tthis._object = data || {};\n\t\t\tif (previousValue && this._key) {\n\t\t\t\tthis._object[this._key] = previousValue;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tthis._key = data;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tthis._object[this._key] = data;\n\t\t\tbreak;\n\t}\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this._object;\n};\n"
  },
  {
    "path": "browser/plugins/object_display.plugin.js",
    "content": "E2.p = E2.plugins[\"object_display\"] = function(core, node)\n{\n\tthis.desc = 'Displays Objects and Arrays.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'object', dt: core.datatypes.OBJECT, desc: 'Input object to be analyzed.', def: null }\n\t];\n\t\n\tthis.output_slots = [];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.update_value(null);\n}\n\nE2.p.prototype.create_ui = function()\n{\n\tthis.label = make('pre');\n\tthis.update_value(null);\n\t\n\treturn this.label;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.update_value(data);\n};\n\nE2.p.prototype.update_value = function(value)\n{\n\tif (this.label)\n\t{\n\t\ttry\n\t\t{\n\t\t\tthis.label.html(JSON.stringify(value, null, '  '));\n\t\t}\n\t\tcatch(e)\n\t\t{\n\t\t\tthis.label.html(e);\n\t\t}\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/object_stringify.plugin.js",
    "content": "E2.p = E2.plugins[\"object_stringify\"] = function(core, node)\n{\n\tthis.desc = 'Serialize object to JSON (stringify)';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'object', dt: core.datatypes.OBJECT, desc: 'Object to serialize'},\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'json', dt: core.datatypes.TEXT, desc: 'The serialized object' }\n\t];\n}\n\nE2.p.prototype.reset = function()\n{\n\tthis._json = '';\n}\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tswitch(slot.index)\n\t{\n\t\tcase 0:\n\t\t\tthis._json = JSON.stringify(data);\n\t\t\tbreak;\n\t}\n}\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this._json;\n}\n"
  },
  {
    "path": "browser/plugins/on_three_object_raydown.plugin.js",
    "content": "(function() {\n\tvar OnThreeObjectRayDown = E2.plugins.on_three_object_raydown = function() {\n\t\tAbstractObjectRayPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'Emits an impulse or continuous signal when the ray is down on the selected object (button is pressed). ' +\n\t\t\t'The name in the pulldown refers to the name of a Mesh patch.'\n\t}\n\n\tOnThreeObjectRayDown.prototype = Object.create(AbstractObjectRayPlugin.prototype)\n\n\tOnThreeObjectRayDown.prototype.onRayDown = function() {\n\t\tthis.triggerState = true\n\t\tthis.updated = true\n\t\tthis.node.queued_update = 1\n\n\t\tE2.track({\n\t\t\tevent: 'raydown',\n\t\t\titem: this.targetNode.uid\n\t\t})\n\t}\n\n\tOnThreeObjectRayDown.prototype.onRayOut = function() {\n\t\tthis.triggerState = false\n\t\tthis.updated = true\n\t\tthis.node.queued_update = 1\n\t}\n})()\n"
  },
  {
    "path": "browser/plugins/on_three_object_rayout.plugin.js",
    "content": "(function() {\n\tvar OnThreeObjectRayOut = E2.plugins.on_three_object_rayout = function() {\n\t\tAbstractObjectRayPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'Emits an impulse or continuous signal when the viewer\\'s ray leaves the selected object. ' +\n\t\t\t'The name in the pulldown refers to the name of a Mesh patch.'\n\n\t\tthis.triggerState = true\n\t}\n\n\tOnThreeObjectRayOut.prototype = Object.create(AbstractObjectRayPlugin.prototype)\n\n\tOnThreeObjectRayOut.prototype.onRayOver = function() {\n\t\tthis.triggerState = false\n\t\tthis.updated = true\n\t\tthis.node.queued_update = 1\n\t}\n\n\tOnThreeObjectRayOut.prototype.onRayOut = function() {\n\t\tthis.triggerState = true\n\t\tthis.updated = true\n\t\tthis.node.queued_update = 1\n\t}\n\n})()\n"
  },
  {
    "path": "browser/plugins/on_three_object_rayover.plugin.js",
    "content": "(function() {\n\tvar OnThreeObjectRayOver = E2.plugins.on_three_object_rayover = function() {\n\t\tAbstractObjectRayPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'Emits an impulse or continuous signal when the viewer\\'s ray is over the object. ' +\n\t\t\t'The name in the pulldown refers to the name of a Mesh patch.'\n\t}\n\n\tOnThreeObjectRayOver.prototype = Object.create(AbstractObjectRayPlugin.prototype)\n\n\tOnThreeObjectRayOver.prototype.onRayOver = function() {\n\t\tthis.focused = true\n\t\tthis.triggerState = true\n\t\tthis.updated = true\n\t\tthis.node.queued_update = 1\n\t}\n\n\tOnThreeObjectRayOver.prototype.onRayOut = function() {\n\t\tthis.focused = false\n\t\tthis.triggerState = false\n\t\tthis.updated = true\n\t\tthis.node.queued_update = 1\n\t}\n\n\n})()\n"
  },
  {
    "path": "browser/plugins/on_three_object_rayup.plugin.js",
    "content": "(function() {\n\tvar OnThreeObjectRayUp = E2.plugins.on_three_object_rayup = function() {\n\t\tAbstractObjectRayPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'Emits an impulse or continuous signal when the input ray is up on the selected object. ' +\n\t\t\t'The name in the pulldown refers to the name of a Mesh patch.'\n\t}\n\n\tOnThreeObjectRayUp.prototype = Object.create(AbstractObjectRayPlugin.prototype)\n\n\tOnThreeObjectRayUp.prototype.onRayUp = function() {\n\t\tthis.triggerState = true\n\t\tthis.updated = true\n\t\tthis.node.queued_update = 1\n\n\t\tE2.track({\n\t\t\tevent: 'rayup',\n\t\t\titem: this.targetNode.uid\n\t\t})\n\t}\n\n\tOnThreeObjectRayUp.prototype.update_output = function() {\n\t\treturn this.triggerState\n\t}\n\n})()\n"
  },
  {
    "path": "browser/plugins/open_url_on_trigger.plugin.js",
    "content": "(function() {\n\nvar OpenUrlOnTrigger = E2.plugins.open_url_on_trigger = function(core) {\n\tPlugin.apply(this, arguments)\n\n\tthis.desc = 'Navigates to the URL (away from experience) on trigger'\n\n\tthis.input_slots = [{\n\t\tname: 'trigger', \n\t\tdt: core.datatypes.BOOL,\n\t\tdesc: 'When trigger is true, the URL will be loaded in the browser',\n\t\tdef: null\n\t}, {\n\t\tname: 'url',\n\t\tdt: core.datatypes.TEXT,\n\t\tdesc: 'Absolute URL to navigate to, eg. http://vizor.io/',\n\t\tdef: null\n\t}]\n\n\tthis.output_slots = []\n}\n\nOpenUrlOnTrigger.prototype = Object.create(Plugin.prototype)\n\nOpenUrlOnTrigger.prototype.update_state = function() {\n\tif (this.inputValues.trigger && this.inputValues.url)\n\t\twindow.location.href = this.inputValues.url\n}\n\n})()"
  },
  {
    "path": "browser/plugins/or_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"or_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits true if either input value is true and false otherwise.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'a', dt: core.datatypes.BOOL, desc: 'The first operand.', def: false },\n\t\t{ name: 'b', dt: core.datatypes.BOOL, desc: 'The second operand.', def: false } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: 'Emits true if <b>first</b> <i>or</i> <b>second</b> are true and false otherwise.', def: false }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.conds = [ false, false ];\n\tthis.state = false;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.conds[slot.index] = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.state = this.conds[0] || this.conds[1];\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.state;\n};\t\n"
  },
  {
    "path": "browser/plugins/osc/osc-proxy.js",
    "content": "OscProxy = (function() {\n\tif (typeof(OscProxy) !== 'undefined')\n\t\treturn OscProxy;\n\n\tvar _listeners = {};\n\tvar _state = 'disconnected';\n\tvar wsPort = 8000;\n\n\tfunction connect() {\n\t\tif (_state === 'connected' || _state === 'connecting')\n\t\t\treturn;\n\n\t\t_state = 'connecting';\n\n\t\tvar ws = new WebSocket('ws://'+window.location.hostname+':'+wsPort+'/__osc-proxy');\n\t\tws.onopen = function()\n\t\t{\n\t\t\tconsole.log('OscProxy connected');\n\t\t\t_state = 'connected';\n\t\t};\n\n\t\tws.onclose = function()\n\t\t{\n\t\t\tconsole.warn('OscProxy disconnected!');\n\t\t\t_state = 'disconnected';\n\t\t};\n\n\t\tws.onmessage = function(evt)\n\t\t{\n\t\t\tvar oscMessage = JSON.parse(evt.data);\n\n\t\t\tif (_listeners[oscMessage.address])\n\t\t\t\t_listeners[oscMessage.address](oscMessage.args);\n\n\t\t\tif (_listeners['*'])\n\t\t\t\t_listeners['*'](oscMessage.address, oscMessage.args);\n\t\t};\n\t};\n\n\tconnect();\n\n\treturn {\n\t\tlisten: function(address, fn)\n\t\t{\n\t\t\t_listeners[address] = fn;\n\t\t}\n\t};\n\n})();\n"
  },
  {
    "path": "browser/plugins/osc_float.plugin.js",
    "content": "E2.p = E2.plugins[\"osc_float\"] = function(core, node)\n{\n\tthis.desc = 'Emits float value sent via OSC to address.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'address', dt: core.datatypes.TEXT, desc: 'OSC address to listen to, eg. \"/1/rotary23\"', def: null }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Float value from OSC message', def: 0.0 }\n\t];\n\t\n\tcore.add_aux_script('osc/osc-proxy.js');\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(!data)\n\t\treturn; // TODO Should stop any existing listener.\n\t\t\n\tvar self = this;\n\n\t// TODO: How are existing listeners discarded?\n\tOscProxy.listen(data, function(args)\n\t{\n\t\tself.updated = true;\n\t\tself.value = args[0].value;\n\t});\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0.0;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/osc_receiver.plugin.js",
    "content": "E2.p = E2.plugins[\"osc_receiver\"] = function(core, node)\n{\n\tthis.desc = 'Emits all messages received via OSC.';\n\n\tthis.input_slots = [];\n\tthis.output_slots = [\n\t\t{ name: 'address', dt: core.datatypes.TEXT, desc: 'Recipient address' },\n\t\t{ name: 'message', dt: core.datatypes.OBJECT, desc: 'Actual OSC message' }\n\t];\n\t\n\tcore.add_aux_script('osc/osc-proxy.js');\n};\n\nE2.p.prototype.play = function()\n{\n\tvar self = this;\n\t\n\tOscProxy.listen('*', function(address, message)\n\t{\n\t\tself.updated = true;\n\t\tself._address = address;\n\t\tself._message = message;\n\t});\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis._address = this._message = null;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\tif(slot.index === 0)\n\t\treturn this._address;\n\n\treturn this._message;\n};\n"
  },
  {
    "path": "browser/plugins/osc_xy_float.plugin.js",
    "content": "E2.p = E2.plugins[\"osc_xy_float\"] = function(core, node)\n{\n\tthis.desc = 'Emits two float values sent via OSC to address.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'address', dt: core.datatypes.TEXT, desc: 'OSC address to listen to, eg. \"/1/xy1\"', def: null }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'x', dt: core.datatypes.FLOAT, desc: 'First float value from OSC message' },\n\t\t{ name: 'y', dt: core.datatypes.FLOAT, desc: 'Second float value from OSC message' }\n\t];\n\t\n\tcore.add_aux_script('osc/osc-proxy.js');\n\t\n\tthis.node = node;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(data === null)\n\t\treturn;\n\t\t\n\tvar self = this;\n\n\tOscProxy.listen(data, function(args)\n\t{\n\t\tself.updated = true;\n\t\tself.x = args[0].value;\n\t\tself.y = args[1].value;\n\t});\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.x = this.y = 0.0;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\tif (slot.index === 0)\n\t\treturn this.x;\n\n\treturn this.y;\n};\n"
  },
  {
    "path": "browser/plugins/osc_xyz_float.plugin.js",
    "content": "E2.p = E2.plugins[\"osc_xyz_float\"] = function(core, node)\n{\n\tthis.desc = 'Emits three float values sent via OSC to address.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'address', dt: core.datatypes.TEXT, desc: 'OSC address to listen to, eg. \"/accxyz\"', def: \"/accxyz\" }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'x', dt: core.datatypes.FLOAT, desc: 'First float value from OSC message' },\n\t\t{ name: 'y', dt: core.datatypes.FLOAT, desc: 'Second float value from OSC message' },\n\t\t{ name: 'z', dt: core.datatypes.FLOAT, desc: 'Third float value from OSC message' }\n\t];\n\t\n\tcore.add_aux_script('osc/osc-proxy.js');\n\t\n\tthis.node = node;\n};\n\nE2.p.prototype.update_input = function(slot, data) {\n\tif(data === null)\n\t\treturn;\n\t\t\n\tvar self = this;\n\n\tOscProxy.listen(data, function(args) {\n\t\tself.updated = true;\n\t\tself.x = args[0].value;\n\t\tself.y = args[1].value;\n\t\tself.z = args[2].value;\n\t});\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.x = this.y = this.z = 0.0;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\tif (slot.index === 0)\n\t\treturn this.x;\n\n\tif (slot.index === 1)\n\t\treturn this.y;\n\n\treturn this.z;\n};\n"
  },
  {
    "path": "browser/plugins/output_proxy.plugin.js",
    "content": "E2.p = E2.plugins.output_proxy = function(core, node)\n{\n\tthis.desc = 'Create a new type-less slot to route data out of the current graph to its parent. When connected to a slot, it will assume its type until disconnected. Renaming this plugin will rename the corresponding parent slot.';\n\t\n\tthis.input_slots = [];\n\t\n\tthis.output_slots = [];\n\n\tnode.add_slot(E2.slot_type.input, {\n\t\tname: 'output',\n\t\tdt: core.datatypes.ANY,\n\t\tdesc: 'Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.',\n\t\tdef: null\n\t})\n\t\n\tthis.core = core;\n\tthis.node = node;\n\tthis.data = null;\n\tthis.changed = false;\n\t\n\tif (!node.title)\n\t\tnode.title = 'output'\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.updated = true;\n};\n\nE2.p.prototype.connection_changed = function(on, conn, slot) {\n\tvar plg = this.node.parent_graph.plugin\n\t\n\tif (plg)\n\t\tplg.proxy_connection_changed(on,\n\t\t\tthis.node,\n\t\t\tconn.src_node,\n\t\t\tslot,\n\t\t\tconn.src_slot)\n}\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tvar node = this.node;\n\t\n\tthis.data = data;\n\tthis.changed = true;\n\n\tif(node.parent_graph.plugin) {\n\t\tvar p = node.parent_graph.plugin;\n\t\t\n\t\tp.updated_sids.push(p.state.output_sids[node.uid])\n\t\tp.updated = true;\n\t}\n};\n\nE2.p.prototype.state_changed = function(ui)\n{\n\n};\n"
  },
  {
    "path": "browser/plugins/parse_json_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"parse_json_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits an object representation of the supplied JSON string.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'json', dt: core.datatypes.TEXT, desc: 'Input string to be parsed.', def: null }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'object', dt: core.datatypes.OBJECT, desc: 'The object representation of the supplied json.', def: 'Empty object' }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.obj = {};\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(!data)\n\t{\n\t\tthis.obj = {};\n\t\treturn;\n\t}\n\t\n\ttry\n\t{\n\t\tthis.obj = JSON.parse(data);\n\t}\n\tcatch(e)\n\t{\n\t\tmsg('ERROR: Failed to parse JSON: ' + e.message);\n\t\tthis.obj = {};\n\t}\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.obj;\n};\n"
  },
  {
    "path": "browser/plugins/perspective_camera.plugin.js",
    "content": "E2.p = E2.plugins[\"perspective_camera\"] = function(core, node)\n{\n\tthis.desc = 'Create a new perspective (3D) camera.'\n\t\n\tthis.input_slots = [\n\t\t{ name: 'FOV', dt: core.datatypes.FLOAT, desc: 'Field of view in degrees.', def: 45.0 },\n\t\t{ name: 'near', dt: core.datatypes.FLOAT, desc: 'Depth of the near clipping plane.', def: 0.01 },\n\t\t{ name: 'far', dt: core.datatypes.FLOAT, desc: 'Depth of the far clipping plane.', def: 1000.0 },\n\t\t{ name: 'position', dt: core.datatypes.VECTOR, desc: 'Camera position.', def: [0,0,2] },\n\t\t{ name: 'rotation', dt: core.datatypes.VECTOR, desc: 'Camera rotation.', def: [0,0,0] },\n\t\t{ name: 'aspect ratio', dt: core.datatypes.FLOAT, desc: 'Aspect Ratio'}\n\t]\n\t\n\tthis.output_slots = [\n\t\t{ name: 'camera', dt: core.datatypes.CAMERA, desc: 'The resulting camera.' }\n\t]\n}\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0) // fov\n\t\tthis.camera.fov = data\n\telse if(slot.index === 1) // near\n\t\tthis.camera.near = data\n\telse if(slot.index === 2) // far\n\t\tthis.camera.far = data\n\telse if(slot.index === 3) // position\n\t\tthis.camera.position.set(data.x, data.y, data.z)\n\telse if(slot.index === 4) // rotation\n\t\tthis.camera.rotation.set(data.x, data.y, data.z)\n\telse if(slot.index === 5) // aspect ratio\n\t\tthis.camera.aspectRatio = data\n\n\tthis.camera.updateProjectionMatrix()\n}\n\nE2.p.prototype.update_state = function()\n{\n}\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.camera\n}\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.camera = new THREE.PerspectiveCamera(45.0, 1.0, 0.1, 100.0)\n\t\tthis.camera.position.set(0.0, 0.0, -2.0)\n\t\tthis.camera.rotation.set(0.0, 0.0, 0.0)\n\t}\n}\n"
  },
  {
    "path": "browser/plugins/photosphere_orientation_reader.plugin.js",
    "content": "(function() {\n\tvar PhotosphereOrientationReader = E2.plugins.photosphere_orientation_reader = function(core, node) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.input_slots = [{\n\t\t\tname: 'texture',\n\t\t\tdt: E2.dt.TEXTURE\n\t\t}]\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'rotation',\n\t\t\tdt: E2.dt.VECTOR\n\t\t}]\n\n\t\tthis.defaultRotation = new THREE.Vector3()\n\t}\n\n\tPhotosphereOrientationReader.prototype = Object.create(Plugin.prototype)\n\n\tPhotosphereOrientationReader.prototype.reset = function() {\n\n\t}\n\n\tPhotosphereOrientationReader.prototype.update_output = function(slot) {\n\t\treturn this.rotation\n\t}\n\n\tPhotosphereOrientationReader.prototype.update_input = function(slot, data) {\n\t\tif (data.vizorMetadata) {\n\t\t\tvar pitch = data.vizorMetadata.pitch\n\t\t\tvar heading = data.vizorMetadata.heading\n\t\t\tvar roll = data.vizorMetadata.roll\n\n\t\t\tthis.rotation = new THREE.Vector3(pitch / 180 * Math.PI, heading / 180 * Math.PI, -roll / 180 * Math.PI)\n\n\t\t\t//this.rotation = new THREE.Euler().setFromQuaternion(\n\t\t\t//\tnew THREE.Quaternion().setFromEuler(\n\t\t\t//\t\tnew THREE.Euler(pitch / 180 * Math.PI, heading / 180 * Math.PI, -roll / 180 * Math.PI, \"YXZ\")), \"YZX\")\n\n\t\t\t//console.log('orientation x', this.rotation.x, 'y', this.rotation.y, 'z', this.rotation.z, '[', pitch, heading, roll, ']')\n\t\t}\n\t\telse {\n\t\t\tthis.rotation = this.defaultRotation\n\t\t}\n\t}\n\n})()"
  },
  {
    "path": "browser/plugins/pi_generator.plugin.js",
    "content": "E2.p = E2.plugins[\"pi_generator\"] = function(core, node)\n{\n\tthis.desc = 'Emits the constant ∏ (pi).';\n\t\n\tthis.input_slots = [];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'pi', dt: core.datatypes.FLOAT, desc: 'The constant ∏ (pi).' }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn Math.PI;\n};\n"
  },
  {
    "path": "browser/plugins/planar_projection_matrix.plugin.js",
    "content": "E2.p = E2.plugins[\"planar_projection_matrix\"] = function(core, node)\n{\n\tthis.desc = 'Create a matrix that represent a planar projection.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'plane offset', dt: core.datatypes.FLOAT, desc: 'Plane offset from the origin.', def: [0, 0, 0] },\n\t\t{ name: 'plane normal', dt: core.datatypes.VECTOR, desc: 'Plane orientation.', def: [0, 0, -1] },\n\t\t{ name: 'light pos', dt: core.datatypes.VECTOR, desc: 'Light position in world space.', def: [0, 0, -2] },\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'matrix', dt: core.datatypes.MATRIX, desc: 'The resulting projection matrix.', def: core.renderer.matrix_identity }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.plane_offset = 0;\n\tthis.plane_normal = [0, 0, -1];\n\tthis.light_pos = [0, 0, -2];\n\tthis.matrix = mat4.create();\n\n\tmat4.identity(this.matrix);\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.plane_offset = data;\n\telse if(slot.index === 1)\n\t\tthis.plane_normal = data;\n\telse if(slot.index === 1)\n\t\tthis.light_pos = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tvar n = this.plane_normal;\n\tvar l = this.light_pos;\n\tvar m = this.matrix;\n\tvar d = this.plane_offset;\t\n\tvar di = n[0] * l[0] + n[1] * l[1] + n[2] * l[2];\n\n\tdi = di > 0 ? 1.0 / di : 1.0;\n\n\tm[0] = 1.0 - n[0] * l[0] * di;\n\tm[4] = -n[0] * l[1] * di;\n\tm[8] = -n[0] * l[2] * di;\n\n\tm[1] = -n[1] * l[0] * di;\n\tm[5] = -1.0 - n[1] * l[1] * di;\n\tm[9] = -n[1] * l[2] * di;\n\n\tm[2] = -n[2] * l[0] * di;\n\tm[6] = -n[2] * l[2] * di;\n\tm[10] = 1.0 - n[2] * l[2] * di;\n\t\n\tm[2] = d * l[0] * di;\n\tm[6] = d * l[1] * di;\n\tm[10] = 1.0 - l[2] * di;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.matrix;\n};\n"
  },
  {
    "path": "browser/plugins/plot_display.plugin.js",
    "content": "E2.p = E2.plugins[\"plot_display\"] = function(core, node)\n{\n\tthis.desc = 'Displays the supplied coordiate on a XY plot.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'x', dt: core.datatypes.FLOAT, desc: 'The location on the x-axis.', lo: 0, hi: 1, def: 0.0 },\n\t\t{ name: 'y', dt: core.datatypes.FLOAT, desc: 'The location on the y-axis.', lo: 0, hi: 1, def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.coord = [0.0, 0.0];\n\tthis.update_values();\n};\n\nE2.p.prototype.create_ui = function()\n{\n\tvar plot = make('div');\n\t\n\tplot.css({\n\t\t'width': '64px',\n\t\t'height': '64px',\n\t\t'background': 'url(\\'images/plot_display/bg.png\\')',\n\t\t'z-index': '1000',\n\t\t'position': 'relative'\n\t});\n\t\n\tvar point = this.coord_div = make('div');\n\t\n\tpoint.css({\n\t\t'width': '7px',\n\t\t'height': '7px',\n\t\t'background': 'url(\\'images/plot_display/point.png\\')',\n\t\t'z-index': '1001',\n\t\t'position': 'absolute'\n\t});\n\t\n\tplot.append(point);\n\tthis.reset();\n\treturn plot;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.coord[slot.index] = data < 0.0 ? 0.0 : data > 1.0 ? 1.0 : data;\n\tthis.update_values();\n};\n\nE2.p.prototype.update_values = function()\n{\n\tif(!this.coord_div)\n\t\treturn;\n\t\n\tthis.coord_div.css({\n\t\t'left': Math.round(this.coord[0] * 55.0), \n\t\t'top': Math.round(55.0 - (this.coord[1] * 55.0)) + 2\n\t});\n};\n"
  },
  {
    "path": "browser/plugins/plugins.json",
    "content": "{\n    \"VALUES\": {\n        \"Action Button\": \"action_button\",\n        \"Color picker\": \"color_picker\",\n        \"Code Editor\": \"text_editor_generator\",\n        \"Number\": \"const_float_generator\",\n        \"Knob\": \"knob_float_generator\",\n        \"Label\": \"label_generator\",\n        \"Pi\": \"pi_generator\",\n        \"Random\": \"random_float_generator\",\n        \"Slider\": \"slider_float_generator\",\n        \"Text\": \"const_text_generator\",\n        \"Boolean toggle\": \"toggle_button\",\n        \"Object composition\": \"object_add\",\n        \"Line Envelope\": \"envelope_modulator\"\n    },\n\n    \"MATH\": {\n        \"Absolute\": \"absolute_modulator\",\n        \"Cos\": \"cos_modulator\",\n        \"Exp\": \"exp_modulator\",\n        \"Log\": \"log_modulator\",\n        \"Max\": \"max_modulator\",\n        \"Min\": \"min_modulator\",\n        \"Sin\": \"sin_modulator\",\n        \"Sqrt\": \"sqrt_modulator\",\n        \"Tan\": \"tan_modulator\",\n        \"Atan\": \"atan_modulator\",\n        \"Atan2\": \"atan2_modulator\",\n        \"Ceiling\": \"ceiling_modulator\",\n        \"Floor\": \"floor_modulator\",\n        \"Round\": \"round_modulator\",\n        \"Accumulate\": \"accumulate_modulator\",\n        \"Clamped accumulate\": \"clamped_accumulate_modulator\",\n        \"Delta\": \"delta_modulator\",\n        \"Add number\": \"add_modulator\",\n        \"Clamp\": \"clamp_modulator\",\n        \"Divide\": \"divide_modulator\",\n        \"Mod\": \"modulate_modulator\",\n        \"Multiply number\": \"multiply_modulator\",\n        \"Negate\": \"negate_modulator\",\n        \"Subtract\": \"subtract_modulator\",\n        \"Lowpass Filter\": \"lowpass_filter_modulator\",\n        \"Sample and hold\": \"sample_and_hold_modulator\",\n        \"Add number conditionally\": \"add_on_trigger_float\"\n    },\n\n    \"LOGIC\": {\n        \"If\": \"if_modulator\",\n        \"If ... Else\": \"if_else_modulator\",\n        \"Equals\": \"equals_modulator\",\n        \"Not equal\": \"ne_modulator\",\n        \"Less than\": \"less_than_modulator\",\n        \"Less than or equal\": \"lte_modulator\",\n        \"More than\": \"more_than_modulator\",\n        \"More than or equal\": \"gte_modulator\",\n        \"Nearly equal\": \"near_eq_modulator\",\n        \"And\": \"and_modulator\",\n        \"Nand\": \"nand_modulator\",\n        \"Not\": \"not_modulator\",\n        \"Or\": \"or_modulator\",\n        \"Xor\": \"xor_modulator\",\n        \"Switch\": \"switch_modulator\",\n        \"Index Revolver Switch\": \"array_switch_modulator\",\n        \"Trigger Revolver Switch\": \"trigger_revolver\",\n        \"Boolean toggle Modulator\": \"toggle_modulator\",\n        \"Trigger On Change\": \"change_trigger\"\n    },\n\n    \"LOAD CONTENT\": {\n        \"Texture\": \"url_texture_generator\",\n        \"Cubemap\": \"url_cubemap_generator\",\n        \"Stereo Cubemap\": \"url_stereo_cubemap_generator\",\n        \"Stereo Lat Long Map\": \"url_stereo_latlongmap_generator\",\n        \"3D model\": \"three_loader_model\",\n        \"Array\": \"url_array_generator\",\n        \"Audio file loader\": \"url_audio_generator\",\n        \"Audio buffer loader\": \"url_audio_buffer_generator\",\n        \"JSON\": \"url_json_generator\",\n        \"Video\": \"url_video_generator\",\n\n        \"Deprecated: Stereo Cubemap\": \"stereo_cube_map\"\n    },\n\n    \"RENDERING BASICS\": {\n        \"Render To Screen\": \"three_webgl_renderer\",\n        \"Render To Texture\": \"three_webgl_texture_renderer\",\n        \"Scene\": \"three_scene\",\n        \"Environment Settings\": \"three_environment_settings\"\n    },\n\n    \"ANALYTICS\": {\n      \"Google Analytics Tracking Property\": \"google_analytics\",\n      \"Google Analytics Page view\": \"ga_pageview\"\n    },\n\n    \"3D GEOMETRY AND MESH TOOLS\": {\n        \"Box\": \"three_geometry_box\",\n        \"Circle\": \"three_geometry_circle\",\n        \"Cylinder\": \"three_geometry_cylinder\",\n        \"Dodecahedron\": \"three_geometry_dodecahedron\",\n        \"Sphere\": \"three_geometry_sphere\",\n        \"Plane\": \"three_geometry_plane\",\n        \"Ring\": \"three_geometry_ring\",\n        \"Torus\": \"three_geometry_torus\",\n        \"Procedural Ground\": \"three_procedural_ground\",\n        \"Mesh\": \"three_mesh\",\n        \"Point Cloud Mesh\": \"three_point_cloud_mesh\",\n        \"3D Geometry Loader\": \"three_loader_model\",\n        \"Particle Emitter\": \"three_particle_emitter\",\n        \"3D Model Loader\": \"three_loader_scene\",\n        \"Mesh Attributes\": \"three_object3d_attribute_extractor\",\n        \"Bounding Box Extractor\": \"three_object3d_bbox_extractor\",\n        \"Line Segments\": \"three_line_segments\",\n        \"Vector Line\": \"three_meshline_mesh\",\n        \"3D Object Group\": \"three_group\"\n    },\n\n    \"MATERIALS AND LIGHTS\": {\n        \"Basic Material\": \"three_material\",\n        \"Depth Material\": \"three_material_depth\",\n        \"Lambert Material\": \"three_material_lambert\",\n        \"Phong Material\": \"three_material_phong\",\n        \"Standard Material\": \"three_material_standard\",\n\n        \"Shader\": \"three_material_shader\",\n        \"Point Cloud Material\": \"three_point_cloud_material\",\n        \"Material Modifier\": \"three_material_modifier\",\n        \"UV Modifier\": \"three_uv_modifier\",\n        \"Line Material\": \"three_line_material\",\n        \"Vector Line Material\": \"three_meshline_material\",\n        \"Cubemap Material\": \"three_cube_material\",\n        \"Material Extractor\": \"three_material_extractor\",\n\n        \"Hemisphere Light\": \"three_hemisphere_light\",\n        \"Directional Light\": \"three_directional_light\",\n\n        \"Point Light\": \"three_point_light\",\n        \"Spot Light\": \"three_spot_light\",\n\n        \"Ambient Light\": \"three_ambient_light\"\n    },\n\n    \"INTERACTION STUFF\": {\n        \"Gaze Clicker\": \"three_gaze_clicker\",\n        \"Clickable Object\": \"three_clickable_object\",\n\n        \"Ray Over Object\": \"on_three_object_rayover\",\n        \"Ray Out of Object\": \"on_three_object_rayout\",\n        \"Ray Down on Object\": \"on_three_object_raydown\",\n        \"Ray Up from Object\": \"on_three_object_rayup\"\n    },\n\n    \"STATE AND STRUCTURE\": {\n        \"Annotation\": \"annotation\",\n\n        \"Is In VR\": \"is_in_vr\",\n\n        \"Read Variable\": \"variable_local_read\",\n        \"Write Variable\": \"variable_local_write\",\n        \"Write Variable on Trigger\": \"variable_local_write_conditional\",\n\n        \"Input proxy\": \"input_proxy\",\n        \"Output proxy\": \"output_proxy\",\n\n        \"Nested Patch\": \"graph\",\n\n        \"Loop\": \"loop\",\n        \"Array Function\": \"array_function\"\n    },\n\n    \"ENTITIES / COMPONENTS\": {\n        \"Entity\": \"entity\",\n        \"360 Photo Entity\": \"threesixty_photo_entity\",\n\n        \"Component for Entity\": \"entity_component\"\n    },\n\n    \"CAMERAS\": {\n        \"VR Camera\": \"three_vr_camera\",\n        \"Orbit Camera\": \"three_orbit_camera\",\n        \"Perspective Camera\": \"three_perspective_camera\",\n        \"Screen Space Transform Extractor\": \"three_screen_space_transform_extractor\",\n        \"Viewport Size\": \"viewport_size_generator\",\n        \"Camera Forward Vector\": \"camera_forward_vector\"\n    },\n\n    \"AUDIO\": {\n        \"One-shot audio player\": \"audio_oneshot_on_trigger\",\n        \"Audio player\": \"audio_player\",\n        \"Audio source player\": \"audio_source_player\",\n        \"Analyse\": \"audio_analyse_modulator\",\n        \"Audio source from buffer\": \"audio_buffer_source_modulator\",\n        \"Delay\": \"audio_delay_modulator\",\n        \"Current time\": \"audio_get_current_time_modulator\",\n        \"Duration\": \"audio_get_duration_modulator\",\n        \"Module player\": \"module_player\",\n        \"Gain (mix)\": \"audio_gain_modulator\",\n        \"FOAmbisonic encoder\": \"audio_ambisonic_foaencoder\",\n        \"FOAmbisonic decoder\": \"audio_ambisonic_foadecoder\",\n        \"FOAmbisonic rotator\": \"audio_ambisonic_foarotator\",\n        \"FOAmbisonic mirror\": \"audio_ambisonic_foamirror\",\n        \"FOAmbisonic converter\": \"audio_ambisonic_foaconverter\",\n        \"FOAmbisonic virtual mic\": \"audio_ambisonic_foavmic\",\n        \"TOAmbisonic encoder\": \"audio_ambisonic_toaencoder\",\n        \"TOAmbisonic decoder\": \"audio_ambisonic_toadecoder\",\n        \"TOAmbisonic rotator\": \"audio_ambisonic_toarotator\",\n        \"TOAmbisonic mirror\": \"audio_ambisonic_toamirror\",\n        \"TOAmbisonic buffer merger\": \"audio_ambisonic_buffermerger\",\n        \"TOAmbisonic converter\": \"audio_ambisonic_toaconverter\",\n        \"TOAmbisonic virtual mic\": \"audio_ambisonic_toavmic\"  \n  },\n\n    \"DEBUG TOOLS\": {\n        \"Bool\": \"bool_display\",\n        \"Color\": \"color_display\",\n        \"Data info\": \"data_info_display\",\n        \"Float\": \"float_display\",\n        \"Led\": \"led_display\",\n        \"Log\": \"log_display\",\n        \"Matrix\": \"matrix_display\",\n        \"Plot\": \"plot_display\",\n        \"Text\": \"text_display\",\n        \"Object\": \"object_display\",\n        \"Vector\": \"vector_display\"\n    },\n\n    \"GRAPH CONTROL\": {\n        \"Stop playback\": \"stop_emitter\",\n        \"Navigate to URL on Trigger\": \"open_url_on_trigger\",\n        \"Load File on Trigger\": \"load_graph_on_trigger\",\n        \"Initialise\": \"initialise_generator\"\n    },\n\n    \"INPUT METHODS\": {\n        \"Key press\": \"key_press_generator\",\n        \"Touching\": \"touching_generator\",\n        \"Touch Start\": \"touch_start_generator\",\n        \"Touch End\": \"touch_end_generator\",\n        \"Mouse buttons\": \"mouse_button_generator\",\n        \"Mouse position\": \"mouse_position_generator\",\n        \"Mouse wheel\": \"mouse_wheel_generator\",\n        \"XBOX 360 Gamepad\": \"gamepad_generator\",\n        \"HTC Vive Controller\": \"vive_controller\"\n    },\n\n    \"TEXT TOOLS\": {\n        \"Experimental: Text Geometry\": \"three_text_geometry\",\n        \"From text\": \"texture_from_text_generator\",\n        \"Concatenate\": \"string_concatenate_modulator\",\n        \"Parse JSON\": \"parse_json_modulator\"\n    },\n\n    \"CLOCKS\": {\n        \"Clock\": \"clock_generator\",\n        \"Delta time\": \"delta_t_generator\"\n    },\n\n    \"ARRAYS & OBJECTS\": {\n        \"Inputs to Array\": \"inputs_to_array\",\n        \"Array Set\": \"array_set\",\n        \"Array Get\": \"array_get\",\n        \"Array Remove\": \"array_remove\",\n        \"Array Clear\": \"array_clear\",\n        \"Array Length\": \"array_length\",\n        \"Object array length\": \"member_array_length_modulator\",\n        \"Object member to bool\": \"member_to_bool_modulator\",\n        \"Object member to float\": \"member_to_float_modulator\",\n        \"Object member to object\": \"member_to_object_modulator\",\n        \"Object member to string\": \"member_to_string_modulator\",\n        \"Object member to typed array\": \"member_to_typed_array_modulator\"\n    },\n\n    \"TYPED ARRAYS\": {\n        \"Typed array\": \"typed_array_generator\",\n        \"Typed array item to bool\": \"typed_array_item_to_bool_modulator\",\n        \"Typed array item to float\": \"typed_array_item_to_float_modulator\",\n        \"Typed array item to object\": \"typed_array_item_to_object_modulator\",\n        \"Typed array item to string\": \"typed_array_item_to_string_modulator\",\n        \"Typed array item to typed array\": \"typed_array_item_to_typed_array_modulator\",\n        \"Typed array to texture\": \"typed_array_to_texture_modulator\",\n        \"Get typed array\": \"typed_array_get_modulator\",\n        \"Get typed array as\": \"typed_array_get_as_modulator\",\n        \"Typed array Length\": \"typed_array_length_modulator\",\n        \"Set typed array\": \"typed_array_set_modulator\",\n        \"Set typed array as\": \"typed_array_set_as_modulator\"\n    },\n\n    \"COLOR MODULATORS\": {\n        \"Add color\": \"color_add_modulator\",\n        \"Blend color\": \"color_blend_modulator\",\n        \"Multiply color\": \"color_multiply_modulator\"\n    },\n\n    \"CONVERTERS\": {\n        \"Color to HSL\": \"convert_color_hsl_modulator\",\n        \"Color to RGB\": \"convert_color_rgb_modulator\",\n        \"HSL to Color\": \"convert_hsl_color_modulator\",\n        \"RGB to Color\": \"convert_rgb_color_modulator\",\n        \"Float as string\": \"format_string_float\",\n        \"Bool to Float\": \"convert_bool_float_modulator\",\n        \"Float to Bool\": \"convert_float_bool_modulator\",\n        \"Oscilator to unit\": \"convert_oscilator_unit_modulator\",\n        \"String to float\": \"convert_string_float_modulator\",\n        \"Vector to XYZ\": \"convert_vector_xyz_modulator\",\n        \"Vector to screenspace\": \"vector_to_screenspace\",\n        \"XYZ to Vector\": \"vector\",\n        \"Object to JSON\": \"object_stringify\"\n    },\n\n    \"VECTOR MATH\": {\n        \"Add Vectors\": \"vector_add\",\n        \"Subtract Vectors\": \"vector_subtract\",\n        \"Multiply Vectors\": \"vector_multiply\",\n        \"Magnitude/Length\": \"vector_magnitude\",\n        \"Distance of Vectors\": \"vector_distance\",\n        \"Cross\": \"vector_cross\",\n        \"Dot\": \"vector_dot\",\n        \"Normalize\": \"vector_normalize\",\n        \"Scale\": \"vector_scale\",\n        \"Transform\": \"vector_transform\",\n        \"Add Vectors Conditionally\": \"add_on_trigger_vector3\",\n        \"Rotation from Direction\": \"rotation_from_direction\"\n    },\n\n    \"OSCILLATORS\": {\n        \"Cosine\": \"cosine_modulator\",\n        \"Sawtooth\": \"sawtooth_modulator\",\n        \"Sine\": \"sine_modulator\",\n        \"Square\": \"square_modulator\",\n        \"Triangle\": \"triangle_modulator\",\n        \"In Tweens\": \"tween_in_modulator\",\n        \"Out Tweens\": \"tween_out_modulator\"\n    },\n\n    \"EVENTS\": {\n        \"Emit Single Runtime Event\": \"runtime_event_write\",\n        \"Emit Continuous Runtime Events\": \"runtime_event_write_continuous\",\n        \"On Runtime Event\": \"runtime_event_read\"\n    },\n\n    \"VIDEO\": {\n        \"Duration\": \"video_get_duration_modulator\",\n        \"Video player\": \"video_player\",\n        \"Current time\": \"video_get_current_time_modulator\"\n    },\n\n    \"ANIMATION\": {\n        \"Animate Float on Trigger\": \"animate_float_on_trigger\",\n        \"Animate Vector3 on Trigger\": \"animate_vector3_on_trigger\",\n        \"Animate Between Input Floats\": \"array_blend_modulator_float\",\n        \"Animate Between Input Vector3s\": \"array_blend_modulator_vector3\"\n    },\n\n    \"EXPERIMENTAL\": {\n        \"Radial Point Geometry\": \"radial_point_geometry\",\n        \"Cubemap Assembler\": \"cubemap_assembler\",\n        \"Stereo Cube Map (old)\": \"stereo_cube_map\",\n        \"Photosphere Orientation\": \"photosphere_orientation_reader\",\n        \"Spatial Audio Listener\": \"audio_spatial_listener\",\n        \"Spatial Audio Panner\": \"audio_spatial_panner\",\n        \"Streamr Client\": \"streamr_client\"\n    }\n\n}\n"
  },
  {
    "path": "browser/plugins/radial_point_geometry.plugin.js",
    "content": "(function() {\n\tvar RadialPointGeometry = E2.plugins.radial_point_geometry = function(core, node) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.input_slots = [ {\n\t\t\tname: 'point count',\n\t\t\tdt: E2.dt.FLOAT,\n\t\t\tdef: 36\n\t\t},\n\t\t{\n\t\t\tname: 'sectors',\n\t\t\tdt: E2.dt.FLOAT,\n\t\t\tdef: 6\n\t\t}, {\n\t\t\tname: 'depth',\n\t\t\tdt: E2.dt.FLOAT,\n\t\t\tdef: 6\n\t\t}, {\n\t\t\tname: 'distance',\n\t\t\tdt: E2.dt.FLOAT,\n\t\t\tdef: 1\n\t\t}, {\n\t\t\tname: 'spacing',\n\t\t\tdt: E2.dt.FLOAT,\n\t\t\tdef: 0.25\n\t\t}, {\n\t\t\tname: 'layer spacing',\n\t\t\tdt: E2.dt.FLOAT,\n\t\t\tdef: 0.25\n\t\t}, {\n\t\t\tname: 'layerRotation',\n\t\t\tdt: E2.dt.FLOAT,\n\t\t\tdef: 0.1\n\t\t}]\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'geometry',\n\t\t\tdt: E2.dt.GEOMETRY\n\t\t}]\n\t}\n\n\tRadialPointGeometry.prototype = Object.create(Plugin.prototype)\n\n\tRadialPointGeometry.prototype.update_input = function(slot, data) {\n\t\tthis.updated = true\n\t}\n\n\tRadialPointGeometry.prototype.update_state = function() {\n\t\t// ideally we'd reuse the geometry, however for now\n\t\t// this geometry can't be used inside an array_function\n\t\t// unless we regenerate the geometry in update_state()\n\t\tthis.geometry = new THREE.Geometry()\n\n\t\tvar dotsPerLayer = this.inputValues.sectors * this.inputValues.depth\n\t\tvar layerSpacing = this.inputValues['layer spacing']\n\n\t\tfor (var i = 0, len = this.inputValues['point count']; i < len; ++i) {\n\t\t\tvar angle = (i % dotsPerLayer) / this.inputValues.sectors * Math.PI * 2\n\n\t\t\tvar layer1 = Math.floor((i % dotsPerLayer) / this.inputValues.sectors)\n\n\t\t\tvar layer2 = Math.floor(i / dotsPerLayer)\n\n\t\t\tangle += layer2 * this.inputValues.layerRotation\n\n\t\t\tvar d = this.inputValues.distance + (this.inputValues.spacing * layer1)\n\t\t\tvar h = layer2 * layerSpacing\n\n\t\t\tvar x = Math.cos(angle) * d\n\t\t\tvar y = -Math.sin(angle) * d\n\t\t\tvar z = h\n\t\t\tvar p = new THREE.Vector3(x, y, z)\n\n\t\t\tthis.geometry.vertices.push(p)\n\t\t}\n\t}\n\n\tRadialPointGeometry.prototype.update_output = function() {\n\t\treturn this.geometry\n\t}\n})()"
  },
  {
    "path": "browser/plugins/random_float_generator.plugin.js",
    "content": "E2.p = E2.plugins[\"random_float_generator\"] = function(core, node)\n{\n\tthis.desc = 'Emits a random float constant in a specified range.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'min', dt: core.datatypes.FLOAT, desc: 'Minimum output value.', def: 0.0 },\n\t\t{ name: 'max', dt: core.datatypes.FLOAT, desc: 'Maximum output value.', def: 1.0 } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Random output value between <b>min</b> and <b>max</b>.' }\n\t];\n\t\n\tthis.always_update = true;\n\t\n\tthis.lo = 0.0;\n\tthis.hi = 1.0;\n\tthis.value = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.lo = data;\n\telse if(slot.index === 1)\n\t\tthis.hi = data;\n};\n\nE2.p.prototype.update_state = function()\n{\n\tvar l = this.lo;\n\tvar h = this.hi;\n\t\n\tif(l > h)\n\t{\n\t\tvar t = l;\n\t\t\n\t\tl = h;\n\t\th = t;\n\t}\n\t\n\tthis.value = l + (Math.random() * (h - l));\n\tthis.updated = true;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/record_framebuffer.plugin.js",
    "content": "E2.p = E2.plugins[\"record_framebuffer\"] = function(core, node)\n{\n\tthis.desc = 'Grab the current framebuffer and transmit frame size and RGB data to a specified recording server.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'record', dt: core.datatypes.BOOL, desc: 'Switch recording on or off.', def: false },\n\t\t{ name: 'texture', dt: core.datatypes.TEXTURE, desc: 'The texture output of a graph.', def: null }\n\t];\n\t\n\tthis.output_slots = [];\n\t\n\tthis.gl = core.renderer.context;\n\tthis.url = 'http://' + window.location.host + '/fd/frame';\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.texture = null;\n\tthis.img_data = null;\n\tthis.conv_data = null;\n\tthis.xhr = null;\n}\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.record = data;\n\telse if(slot.index === 1)\n\t\tthis.texture = data;\n};\n\nE2.p.prototype.update_state = function()\n{\n\tif(!this.record || !this.url || !this.texture || !this.texture.framebuffer)\n\t\treturn;\n\t\n\tvar gl = this.gl;\n\tvar w = this.texture.width;\n\tvar h = this.texture.height;\n\tvar size = w * h * 4;\n\t\n\tif(!this.img_data || this.img_data.byteLength !== size)\n\t{\n\t\tthis.img_data = new Uint8Array(size);\n\t\tthis.conv_data = new Uint8Array(w * h * 3);\n\t\tthis.xhr = new XMLHttpRequest();\n\t}\n\t\n\tgl.bindFramebuffer(gl.FRAMEBUFFER, this.texture.framebuffer);\n\tgl.readPixels(0, 0, w, h, gl.RGBA, gl.UNSIGNED_BYTE, this.img_data);\n\tgl.bindFramebuffer(gl.FRAMEBUFFER, null);\n\n\tvar id = this.img_data;\n\tvar cd = this.conv_data;\n\t\n\tfor(var i = 0, o = 0; i < w * h * 3; i += 3, o += 4)\n\t{\n\t\tcd[i+2] = id[o];\n\t\tcd[i+1] = id[o+1];\n\t\tcd[i] = id[o+2];\n\t}\n\t\n\tthis.xhr.open('POST', this.url + '?width=' + w + '&height=' + h, false);\n\tthis.xhr.setRequestHeader('Content-Type', 'application/octet-stream');\n\tthis.xhr.send(this.conv_data);\n};\n"
  },
  {
    "path": "browser/plugins/reset_framebuffer_recorder.plugin.js",
    "content": "E2.p = E2.plugins[\"reset_framebuffer_recorder\"] = function(core, node)\n{\n\tthis.desc = 'Instruct the specified framedump server to clear its cache and start recording at from zero.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'reset', dt: core.datatypes.BOOL, desc: 'Send true to this slot to reset the specified server.', def: false }\n\t];\n\t\n\tthis.output_slots = [];\n\tthis.url = 'http://' + window.location.host + '/fd/reset';\n\tthis.clear = false;\n};\n\nE2.p.prototype.reset = function()\n{\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.clear = data;\n};\n\nE2.p.prototype.update_state = function()\n{\n\tif(!this.clear)\n\t\treturn;\n\n\t$.get(this.url)\n\t\t.done(function()\n\t\t{\n\t\t\tmsg('Framdumping reset to frame 0');\n\t\t})\n\t\t.fail(function()\n\t\t{\n\t\t\tmsg('ERROR: Failed to reset the speficied framedumping server: ' + this.url);\n\t\t});\n\t\n\tthis.clear = false;\n};\n"
  },
  {
    "path": "browser/plugins/rotation_from_direction.plugin.js",
    "content": "(function() {\n\tvar RotationFromDirection = E2.plugins.rotation_from_direction = function(core, node) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.input_slots = [{\n\t\t\tname: 'direction',\n\t\t\tdt: E2.dt.VECTOR\n\t\t}]\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'rotation',\n\t\t\tdt: E2.dt.VECTOR\n\t\t}]\n\n\t\tthis.defaultRotation = new THREE.Vector3()\n\t}\n\n\tRotationFromDirection.prototype = Object.create(Plugin.prototype)\n\n\tRotationFromDirection.prototype.reset = function() {\n\n\t\tthis.rotation = this.defaultRotation.clone()\n\n\t}\n\n\tRotationFromDirection.prototype.update_input = function(slot, data) {\n\t\tif (data) {\n\t\t\tvar fwd = data.clone()\n\t\t\tfwd.normalize()\n\t\t\tfwd.multiplyScalar(-1)\n\n\t\t\tvar up = new THREE.Vector3(0, 1, 0)\n\n\t\t\tvar right = new THREE.Vector3().crossVectors(fwd, up)\n\t\t\tright.normalize()\n\t\t\tup.crossVectors(right, fwd)\n\t\t\t//up.normalize()\n\n\t\t\tvar mtx = new THREE.Matrix4().makeBasis(right, up, fwd)\n\n\t\t\tthis.rotation.copy(new THREE.Euler().setFromRotationMatrix(mtx,\"YXZ\").toVector3())\n\t\t}\n\t\telse {\n\t\t\tthis.rotation = this.defaultRotation.clone()\n\t\t}\n\t}\n\n\tRotationFromDirection.prototype.update_output = function(slot) {\n\t\treturn this.rotation\n\t}\n\n\tRotationFromDirection.prototype.state_changed = function(ui) {\n\t\tif (ui)\n\t\t\treturn;\n\t}\n\n})()"
  },
  {
    "path": "browser/plugins/rotation_matrix.plugin.js",
    "content": "E2.p = E2.plugins[\"rotation_matrix\"] = function(core, node)\n{\n\tthis.desc = 'Create a matrix that performs a rotation around an arbitrary axis.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'angle', dt: core.datatypes.FLOAT, desc: 'Number of degrees to rotate.', lo: -360, hi: 360, def: 0.0 },\n\t\t{ name: 'axis', dt: core.datatypes.VECTOR, desc: 'Normalized vector describing the axis around which the rotation is performed.', def: [0, 0, 1] }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'matrix', dt: core.datatypes.MATRIX, desc: 'The resulting rotation matrix.', def: core.renderer.metrix_identity }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.angle = 0.0;\n\tthis.axis = [0.0, 0.0, 1.0];\n\tthis.matrix = mat4.create();\n\n\tmat4.identity(this.matrix);\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.angle = ((data % 360) / 180.0) * Math.PI;\n\telse\n\t\tthis.axis = data;\n};\n\nE2.p.prototype.update_state = function()\n{\n\tmat4.identity(this.matrix);\n\tmat4.rotate(this.matrix, this.angle, this.axis);\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.matrix;\n};\n"
  },
  {
    "path": "browser/plugins/rotation_xyz_matrix.plugin.js",
    "content": "E2.p = E2.plugins[\"rotation_xyz_matrix\"] = function(core, node)\n{\n\tthis.desc = 'Create a matrix that rotates individually around the X, Y and Z axis.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'x', dt: core.datatypes.FLOAT, desc: 'Number of degrees to rotate around the X-axis.', lo: -360, hi: 360, def: 0.0 },\n\t\t{ name: 'y', dt: core.datatypes.FLOAT, desc: 'Number of degrees to rotate around the Y-axis.', lo: -360, hi: 360, def: 0.0 },\n\t\t{ name: 'z', dt: core.datatypes.FLOAT, desc: 'Number of degrees to rotate around the Z-axis.', lo: -360, hi: 360, def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'matrix', dt: core.datatypes.MATRIX, desc: 'The resulting rotation matrix.', def: core.renderer.matrix_identity }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.angles = [0.0, 0.0, 0.0];\n\tthis.matrix = mat4.create();\n\n\tmat4.identity(this.matrix);\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.angles[slot.index] = ((data % 360) / 180.0) * Math.PI;\n};\n\nE2.p.prototype.update_state = function()\n{\n\tmat4.identity(this.matrix);\n\tmat4.rotateX(this.matrix, this.angles[0]);\n\tmat4.rotateY(this.matrix, this.angles[1]);\n\tmat4.rotateZ(this.matrix, this.angles[2]);\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.matrix;\n};\n"
  },
  {
    "path": "browser/plugins/round_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"round_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits the input <b>value</b> rounded to the nearest integer.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'The input value to be rounded.', def: 0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'result', dt: core.datatypes.FLOAT, desc: 'The rounded integer.', def: 0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.value = Math.round(data);\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/runtime_event_read.plugin.js",
    "content": "(function() {\n\nfunction RunTimeEventReadPlugin(core, node) {\n\tthis.input_slots = [{\n\t\tname: 'eventName',\n\t\tdt: E2.dt.TEXT\n\t}]\n\n\tthis.output_slots = [\n\t\t{\n\t\t\tname: 'triggered',\n\t\t\tdt: E2.dt.BOOL\n\t\t},\n\t\t{\n\t\t\tname: 'data',\n\t\t\tdt: E2.dt.ANY\n\t\t}\n\t]\n\n\tthis.node = node\n\n\tthis.value = null\n\tthis.frames = 0\n\tthis.triggered = false\n\tthis._handleMessageBound = this._handleMessage.bind(this)\n\n\tthis.lsg = new LinkedSlotGroup(core, node, \n\t\t[], [this.output_slots[0]])\n}\n\nRunTimeEventReadPlugin.prototype.connection_changed = function(on, conn, slot) {\n\tif (this.lsg.connection_changed(on, conn, slot))\n\t\tthis.value = this.lsg.core.get_default_value(this.lsg.dt)\n\n\tthis.output_slots[0].array = false\n}\n\nRunTimeEventReadPlugin.prototype._handleMessage = function(messageData) {\n\tthis.value = messageData\n\tthis.frames = 0\n\tthis.triggered = true\n\tthis.node.queued_update = 1\n\tthis.updated = true\n}\n\nRunTimeEventReadPlugin.prototype.update_input = function(slot, data) {\n\tif (slot.name === 'eventName') {\n\t\tif (this.eventName) {\n\t\t\tE2.core.runtimeEvents.off(this.eventName,\n\t\t\t\tthis._handleMessageBound)\n\t\t}\n\n\t\tthis.eventName = data\n\n\t\tE2.core.runtimeEvents.on(this.eventName,\n\t\t\tthis._handleMessageBound)\n\t}\n}\n\nRunTimeEventReadPlugin.prototype.update_state = function() {\n\tif (this.frames++ > 0) {\n\t\tthis.triggered = false\n\t\tthis.value = this.lsg.core.get_default_value(this.lsg.dt)\n\t}\n}\n\nRunTimeEventReadPlugin.prototype.update_output = function(slot) {\n\tif (slot.index === 0)\n\t\treturn this.triggered\n\n\treturn this.value\n}\n\nRunTimeEventReadPlugin.prototype.state_changed = function() {\n\tthis.lsg.infer_dt()\n\tthis.value = this.lsg.core.get_default_value(this.lsg.dt)\n}\n\nE2.plugins.runtime_event_read = RunTimeEventReadPlugin\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/runtime_event_write.plugin.js",
    "content": "(function() {\n\nfunction RunTimeEventWritePlugin() {\n\tthis.input_slots = [{\n\t\tname: 'emit',\n\t\tdt: E2.dt.BOOL,\n\t\tdesc: 'disable / enable emitting',\n\t\tdef: true\n\t},\n\t{\n\t\tname: 'eventName',\n\t\tdt: E2.dt.TEXT\n\t},\n\t{\n\t\tname: 'data',\n\t\tdt: E2.dt.ANY\n\t}]\n\t\n\tthis.output_slots = []\n\n\tthis.desc = 'Emit a single runtime event when the data-input changes ' +\n\t\t\t\t'behaviour can be controlled by the emit-input. When emit becomes ' +\n\t\t\t\t'true, any data not yet sent will be emitted.'\n}\n\nRunTimeEventWritePlugin.prototype.update_input = function(slot, data) {\n\tif (slot.name === 'emit') {\n\t\tthis.emitActive = data\n\t}\n\n\tif (slot.name === 'eventName') {\n\t\tthis.eventName = data\n\t}\n\n\tif (slot.name === 'data') {\n\t\tthis.value = data\n\t}\n\n\tthis.hasNewData = true\n}\n\nRunTimeEventWritePlugin.prototype.update_state = function() {\n\tif (this.hasNewData && this.eventName && this.value !== undefined && this.emitActive) {\n\t\tE2.core.runtimeEvents.emit(this.eventName, this.value)\n\n\t\tthis.hasNewData = false\n\t}\n}\n\nE2.plugins.runtime_event_write = RunTimeEventWritePlugin\n\n})()"
  },
  {
    "path": "browser/plugins/runtime_event_write_continuous.plugin.js",
    "content": "(function() {\n\n\tfunction RunTimeEventWriteContinuousPlugin() {\n\t\tthis.input_slots = [{\n\t\t\tname: 'emit',\n\t\t\tdt: E2.dt.BOOL,\n\t\t\tdesc: 'disable / enable emitting',\n\t\t\tdef: true\n\t\t},\n\t\t{\n\t\t\tname: 'eventName',\n\t\t\tdt: E2.dt.TEXT\n\t\t},\n\t\t{\n\t\t\tname: 'data',\n\t\t\tdt: E2.dt.ANY\n\t\t}]\n\n\t\tthis.output_slots = []\n\n\t\tthis.desc = 'Emit one event on every frame for as long as ' +\n\t\t\t\t\t'the emit-input remaing true.'\n\t}\n\n\tRunTimeEventWriteContinuousPlugin.prototype.update_input = function(slot, data) {\n\t\tif (slot.name === 'emit') {\n\t\t\tthis.emitActive = data\n\t\t}\n\n\t\tif (slot.name === 'eventName') {\n\t\t\tthis.eventName = data\n\t\t}\n\n\t\tif (slot.name === 'data') {\n\t\t\tthis.value = data\n\t\t}\n\t}\n\n\tRunTimeEventWriteContinuousPlugin.prototype.update_state = function() {\n\t\tif (this.eventName && this.value && this.emitActive) {\n\t\t\tE2.core.runtimeEvents.emit(this.eventName, this.value)\n\t\t}\n\t}\n\n\tE2.plugins.runtime_event_write_continuous = RunTimeEventWriteContinuousPlugin\n\n})()"
  },
  {
    "path": "browser/plugins/sample_and_hold_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"sample_and_hold_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits the input value when \\'sample\\' is true and emits the last sampled value otherwise. Emits zero by default.';\n\t\n\tthis.input_slots = \n\t[ \n\t\t{ name: 'sample', dt: core.datatypes.BOOL, desc: 'Sending true to this slot updated the output value to match the input value, false inhibits input sampling.', def: true },\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'The input value.', def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'The output value.', def: 0.0 }\n\t];\n\t\n\tthis.state = { value: 0.0 };\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.has_updated = false;\n\tthis.updated = true;\n\tthis.last_state = true;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.sample = data;\n\telse\n\t\tthis.buffer = data;\n};\n\nE2.p.prototype.update_state = function()\n{\n\tif(this.sample)\n\t\tthis.state.value = this.buffer;\n\telse if(this.has_updated)\n\t\tthis.updated = false;\n\n\tif(!this.sample && this.last_state)\n\t{\n\t\tthis.last_state = this.sample;\n\t\tthis.has_updated = false;\n\t}\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\tthis.has_updated = true;\n\treturn this.state.value;\n};\t\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.state.value = 0.0;\n\t\tthis.buffer = 0.0;\n\t\tthis.sample = true;\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/sawtooth_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"sawtooth_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Sawtooth oscilator. A <b>time</b> value incrementing by one unit per second will yield a 1Hz output signal.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'time', dt: core.datatypes.FLOAT, desc: 'Time in seconds.', def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Emits ((<b>time</b> % 1) - 0.5) * 2.', lo: -1, hi: 1, def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.time = 0.0;\n\tthis.result = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.time = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.result = ((this.time % 1.0) - 0.5) * 2.0;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.result;\n};\n"
  },
  {
    "path": "browser/plugins/scale_matrix.plugin.js",
    "content": "E2.p = E2.plugins[\"scale_matrix\"] = function(core, node)\n{\n\tthis.desc = 'Create a matrix that scales by the supplied factors for each axis.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'vector', dt: core.datatypes.VECTOR, desc: 'Factors to scale each axis by.', def: [1, 1, 1] }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'matrix', dt: core.datatypes.MATRIX , desc: 'The resulting scale matrix.', def: core.renderer.matrix_identity }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.matrix = mat4.create();\n\tmat4.identity(this.matrix);\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tmat4.identity(this.matrix);\n\tmat4.scale(this.matrix, data);\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.matrix;\n};\n"
  },
  {
    "path": "browser/plugins/scene_get_bounding_box.plugin.js",
    "content": "E2.p = E2.plugins[\"scene_get_bounding_box\"] = function(core, node)\n{\n\tthis.desc = 'Extract the <b>min</b> and <b>max</b> AABB vectors from a supplied <b>scene</b> for use in debugging, camera calibration or other calculations.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'scene', dt: core.datatypes.SCENE, desc: 'The input scene.', def: null }\n\t];\n\t\n\tthis.output_slots = \n\t[ \n\t\t{ name: 'min', dt: core.datatypes.VECTOR, desc: 'The lowest <b>scene</b> extent.', def: core.renderer.vector_origin }, \n\t\t{ name: 'max', dt: core.datatypes.VECTOR, desc: 'The highest <b>scene</b> extent.', def: core.renderer.vector_origin } \n\t];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.scene = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tif(this.scene)\n\t{\n\t\tvar bb = this.scene.bounding_box;\n\t\n\t\tthis.lo = bb.lo;\n\t\tthis.hi = bb.hi;\n\t}\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn (slot.index === 0) ? this.lo : this.hi;\n};\t\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.scene = null;\n\t\tthis.lo = [0.0, 0.0, 0.0];\n\t\tthis.hi = [0.0, 0.0, 0.0];\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/scene_get_mesh_by_index.plugin.js",
    "content": "E2.p = E2.plugins[\"scene_get_mesh_by_index\"] = function(core, node)\n{\n\tthis.desc = 'Extract a single <b>mesh</b> from a <b>scene</b> by <b>index</b> so it can be rendered individually.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'scene', dt: core.datatypes.SCENE, desc: 'The scene to extract a mesh reference from.', def: null },\n\t\t{ name: 'index', dt: core.datatypes.FLOAT, desc: 'The desired mesh index.', def: 0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'mesh', dt: core.datatypes.MESH, desc: 'The extracted mesh reference.' }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.changed = true;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.scene = data;\n\telse if(slot.index === 1)\n\t\tthis.index = Math.floor(data < 0 ? -data : data);\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tif(this.scene)\n\t{\n\t\tvar meshes = this.scene.meshes;\n\t\tvar count = meshes.length;\n\t\t\n\t\tif(count < 1)\n\t\t\treturn;\n\t\t\n\t\tvar m = meshes[this.index % count];\n\t\t\n\t\tif(m !== this.mesh)\n\t\t{\n\t\t\tthis.mesh = m;\n\t\t\treturn;\n\t\t}\n\t}\n\n\tif(!this.changed)\n\t\tthis.updated = false;\n\t\t\n\tthis.changed = false;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.mesh;\n};\t\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.scene = null;\n\t\tthis.index = 0;\n\t\tthis.mesh = null;\n\t\tthis.changed = true;\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/scene_get_mesh_count.plugin.js",
    "content": "E2.p = E2.plugins[\"scene_get_mesh_count\"] = function(core, node)\n{\n\tthis.desc = 'Emits the number of meshes in the supplied <b>scene</b>. Note that the maximum index is one less than the mesh <b>count</b>.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'scene', dt: core.datatypes.SCENE, desc: 'The scene to obtain the mesh count from.', def: null }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'count', dt: core.datatypes.FLOAT, desc: 'The number of meshes in the supplied <b>scene</b>. Note that mesh indices are zero-index, so the highest mesh index in a scene is count - 1.', def: 0 }\n\t];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.scene = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.count = this.scene ? this.scene.meshes.length : 0;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.count;\n};\t\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.scene = null;\n\t\tthis.count = 0;\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/scene_lighting.plugin.js",
    "content": "(function() {\n\tvar SceneLightingPlugin = E2.plugins.scene_lighting = function(core) {\n\t\tThreeObject3DPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'Scene Lighting'\n\n\t\tthis.params = {\n\t\t\tintensity: 1.0,\n\t\t\tlightColor: new THREE.Color(0x147DCC),\n\t\t\tgroundColor: new THREE.Color(0x666739),\n\t\t\tskyColor: new THREE.Color(0),\n\t\t}\n\n\t\tthis.input_slots = [\n\t\t\t{ name: 'intensity', dt: core.datatypes.FLOAT, def: this.params.intensity },\n\t\t\t{ name: 'directional light color', dt: core.datatypes.COLOR, def: this.params.lightColor },\n\t\t\t{ name: 'sky light color', dt: core.datatypes.COLOR, def: this.params.skyColor },\n\t\t\t{ name: 'ground light color', dt: core.datatypes.COLOR, def: this.params.groundColor },\n\t\t\t{ name: 'shadow radius', dt: core.datatypes.FLOAT, def: 1 },\n\t\t\t{ name: 'shadow darkness', dt: core.datatypes.FLOAT, def: 1}\n\t\t].concat(this.input_slots)\n\n\t\tthis.always_update = true\n\t}\n\n\tSceneLightingPlugin.prototype = Object.create(ThreeObject3DPlugin.prototype)\n\n\tSceneLightingPlugin.prototype.reset = function() {\n\t\tThreeObject3DPlugin.prototype.reset.apply(this)\n\n\t\tif (!this.hemisphereLight) {\n\t\t\tthis.hemisphereLight = new THREE.HemisphereLight(this.params.skyColor, this.params.groundColor)\n\t\t\tthis.directionalLight = new THREE.DirectionalLight(this.params.lightColor, this.params.intensity)\n\n\t\t\tthis.directionalLight.intensity = this.inputValues.intensity\n\t\t\tthis.directionalLight.shadow.radius = this.inputValues['shadow radius']\n\t\t\tthis.directionalLight.shadow.darkness = this.inputValues['shadow darkness']\n\n\t\t\tthis.hemisphereLight.add(this.directionalLight)\n\n\t\t\tthis.setObject3D(this.hemisphereLight)\n\t\t}\n\t}\n\n\tSceneLightingPlugin.prototype.update_state = function() {\n\t\tThreeObject3DPlugin.prototype.update_state.apply(this, arguments)\n\n\t\tthis.object3d.updateMatrixWorld()\n\t\tvar directionVector = new THREE.Vector3(0, -1, 0)\n\t\tdirectionVector.applyMatrix4(this.directionalLight.matrixWorld)\n\t\tthis.directionalLight.target.position.copy(directionVector)\n\t\tthis.directionalLight.target.updateMatrixWorld()\n\t}\n\n\tSceneLightingPlugin.prototype.update_input = function(slot, data) {\n\t\tif(slot.name === 'directional light color') {\n\t\t\tthis.directionalLight.color.copy(data)\n\t\t}\n\t\telse if (slot.name === 'ground light color') {\n\t\t\tthis.hemisphereLight.groundColor.copy(data)\n\t\t}\n\t\telse if (slot.name === 'sky light color') {\n\t\t\tthis.hemisphereLight.color.copy(data)\n\t\t}\n\t\telse if (slot.name === 'intensity') {\n\t\t\tthis.directionalLight.intensity = data\n\t\t}\n\t\telse if (slot.name === 'shadow radius') {\n\t\t\tthis.directionalLight.shadow.radius = data\n\t\t}\n\t\telse if (slot.name === 'shadow darkness') {\n\t\t\tthis.directionalLight.shadow.darkness = data\n\t\t}\n\t\telse {\n\t\t\tThreeObject3DPlugin.prototype.update_input.apply(this, arguments)\n\t\t}\n\t}\n\n\tSceneLightingPlugin.prototype.update_output = function() {\n\t\treturn this.object3d\n\t}\n\n\t// disable scaling, it doesn't make sense for lights\n\tSceneLightingPlugin.prototype.canEditScale = function() {\n\t\treturn false\n\t}\n})()\n"
  },
  {
    "path": "browser/plugins/scene_renderer_emitter.plugin.js",
    "content": "E2.p = E2.plugins[\"scene_renderer_emitter\"] = function(core, node) {\n\tthis.desc = 'Render the supplied <b>scene</b>. If no <b>shader</b> is specified, the internal shaders of the scene meshes are used.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'scene', dt: core.datatypes.SCENE, desc: 'The scene to be rendered.', def: null },\n\t\t{ name: 'material', dt: core.datatypes.MATERIAL, desc: 'If a material is specified, internal shaders are generated to render each scene mesh using this material as an overload.', def: null },\n\t\t{ name: 'camera', dt: core.datatypes.CAMERA, desc: 'The camera to use for rendering.', def: null },\n\t\t{ name: 'transform', dt: core.datatypes.MATRIX, desc: 'The scene transform to use for rendering.', def: core.renderer.matrix_identity },\n\t\t{ name: 'inv. transform', dt: core.datatypes.BOOL, desc: 'Send true to this slot to apply <b>transform</b> in inverse order when rendering instances.', def: false }\n\t];\n\t\n\tthis.output_slots = [];\n\t\n\tthis.gl = core.renderer.context;\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.scene = null;\n\tthis.shader = null;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t{\n\t\tif(data !== this.scene)\n\t\t{\n\t\t\tthis.scene = data;\n\t\t\n\t\t\tif(!this.ext_camera)\n\t\t\t\tthis.camera = this.scene.create_autofit_camera();\n\t\t}\n\n\t\tthis.material_dirty = true;\n\t}\n\telse if(slot.index === 1)\n\t{\n\t\tthis.material = data;\n\t\t\n\t\tif(!data)\n\t\t{\n\t\t\tthis.material_caps = '';\n\t\t\treturn;\t\n\t\t}\n\t\t\n\t\tvar caps = Material.get_caps_hash(null, data);\n\t\t\n\t\tif(this.material_caps !== caps)\n\t\t{\n\t\t\tthis.material_caps = caps;\n\t\t\tthis.material_dirty = true;\n\t\t}\n\t}\n\telse if(slot.index === 2)\n\t{\n\t\tthis.camera = data;\n\t\tthis.ext_camera = data ? true : false;\n\t\t\n\t\tif(!this.ext_camera && this.scene)\n\t\t\tthis.camera = this.scene.create_autofit_camera();\n\t}\n\telse if(slot.index === 3)\n\t\tthis.transform = data;\n};\n\nE2.p.prototype.connection_changed = function(on, conn, slot)\n{\n\tif(!on)\n\t{\n\t\tif(slot.index === 0)\n\t\t{\n\t\t\tthis.material_dirty = true;\n\t\t}\n\t\telse if(slot.index === 1)\n\t\t{\n\t\t\tthis.material = null;\n\t\t\tthis.material_caps = '';\n\t\t\tthis.overload_shaders = null;\n\t\t}\n\t}\n};\n\nE2.p.prototype.update_state = function()\n{\n\tif(this.scene)\n\t{\n\t\tif(this.material_dirty && this.material)\n\t\t{\n\t\t\tthis.overload_shaders = this.scene.build_overload_shaders(this.material)\n\t\t\tthis.material_dirty = false;\n\t\t}\n\t\t\n\t\tthis.transform.invert = this.inv_transform;\n\t\tthis.scene.render(this.gl, this.camera, this.transform, this.overload_shaders, this.material);\n\t}\n};\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.material = null;\n\t\tthis.material_caps = '';\n\t\tthis.material_dirty = false;\n\t\tthis.overload_shaders = null;\n\t\tthis.camera = new Camera();\n\t\tthis.transform = mat4.create();\n\n\t\tmat4.identity(this.transform);\n\t\tthis.ext_camera = false;\n\t\tthis.inv_transform = false;\n\t}\n};\n\n"
  },
  {
    "path": "browser/plugins/set_matrix_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"set_matrix_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Set matrix component.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'matrix', dt: core.datatypes.MATRIX, desc: 'Matrix to set component of.', def: core.renderer.matrix_identity },\n\t\t{ name: 'row', dt: core.datatypes.FLOAT, desc: 'Row to set.', def: 0 },\n\t\t{ name: 'column', dt: core.datatypes.FLOAT, desc: 'Column to set.', def: 0 },\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'The value to set.', def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'matrix', dt: core.datatypes.MATRIX, desc: 'Modulated matrix.' }\n\t];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.matrix = data;\n\telse if(slot.index === 1)\n\t\tthis.row = data < 0 ? 0 : data > 3 ? 3 : data;\n\telse if(slot.index === 2)\n\t\tthis.column = data < 0 ? 0 : data > 3 ? 3 : data;\n\telse if(slot.index === 3)\n\t\tthis.value = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.matrix[(this.row * 4) + this.column] = this.value;\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.matrix;\n};\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.matrix = mat4.create();\n\t\tthis.row = 0;\n\t\tthis.column = 0;\n\t\tthis.value = 0.0;\n\t\t\n\t\tmat4.identity(this.matrix);\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/sin_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"sin_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Sin(x).';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Input value.', def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'result', dt: core.datatypes.FLOAT, desc: 'sin(<b>value</b>).', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.value = Math.sin(data);\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/sine_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"sine_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Sine oscilator. A <b>time</b> value incrementing by one per second will yield a 1Hz output signal.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'time', dt: core.datatypes.FLOAT, desc: 'Time in seconds.', def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Emits sin(<b>time</b> * 2pi).', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.time = 0.0;\n\tthis.result = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.time = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.result = Math.sin(this.time * 2.0 * Math.PI);\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.result;\n};\n"
  },
  {
    "path": "browser/plugins/slider_float_generator.plugin.js",
    "content": "(function(){\n\nfunction formatVal(val) {\n\t// format\n\tvar aval = Math.abs(val)\n\tif (aval < 1000) return val.toFixed(3)\n\telse if (aval < 10000) return val.toFixed(2)\n\telse if (aval < 100000) return val.toFixed(1)\n\treturn val.toFixed(0)\n}\n\nvar Slider = E2.plugins.slider_float_generator = function(core, node) {\n\tPlugin.apply(this, arguments)\n\n\tthis.desc = 'Emits a user controllable float value between two specified values.'\n\t\n\tthis.input_slots = []\n\t\n\tthis.output_slots = [\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Emits the current value when the slider is adjusted.', def: 0 }\n\t]\n\t\n\tthis.state = { val: 0.0, min: 0.0, max: 1.0 }\n\t\n\tthis.node = node\n\tthis.v_col = null\n\tthis.slider = null\n\tthis.handle = null\n\tthis.pos = 0\n\n\tthis.node.on('pluginStateChanged', this.updateUi.bind(this))\n}\n\nSlider.prototype = Object.create(Plugin.prototype)\n\nSlider.prototype.reset = function() {}\n\nSlider.prototype.create_ui = function() {\n\tvar that = this\n\n\tvar svg = '<svg><use xlink:href=\"#vp-circle\"></use></svg>'\n\tvar html = '<table class=\"slider-table\">'+\n\t\t'<tr>'+\n\t\t\t'<td colspan=\"3\" class=\"sliderContainer\">'+svg+'<input class=\"slider\" type=\"range\" step=\"0.001\">'+svg+'</td>'+\n\t\t'</tr>'+\n\t\t'<tr class=\"\">'+\n\t\t\t'<td style=\"width: 50px;\"><input class=\"min\" type=\"number\" step=\"0.2\" /></td>'+\n\t\t\t'<td class=\"slider-value\" style=\"text-align:center;\"><span>0.0</span></td>'+\n\t\t\t'<td style=\"width: 50px;\"><input class=\"max\" type=\"number\" step=\"0.2\" /></td>'+\n\t\t'</tr>'+\n\t\t'</table>'\n\n\tvar $el = $(html)\n\n\tvar $min = this.$min = $el.find('input.min')\n\tvar $max = this.$max = $el.find('input.max')\n\tvar $slider = this.$slider = $el.find('input.slider')\n\tthis.$display = $el.find('td.slider-value span')\n\n\tvar originalValue = this.state.val\n\n\tthis.$display.on('dblclick', function(){\n\t\toriginalValue = that.state.val\n\t\tuiEnterValueControl(this, this.parentNode, function(v){\n\t\t\t$slider.val(v)\n\t\t\t$slider.trigger('input')\n\t\t\t$slider.trigger('mouseup')\n\t\t})\n\t})\n\n\n\t$slider.on('input', function() {\n\t\tvar val = parseFloat($slider.val())\n\t\tthat.$display.html(formatVal(val))\n\t\tthat.transientSetState('val', val)\n\t\treturn true;\n\t})\n\n\t$slider.on('mousedown', function() {\n\t\toriginalValue = that.state.val\n\t})\n\n\t$slider.on('mouseup', function() {\n\t\tvar sliderValue = parseFloat($slider.val())\n\t\tif (originalValue !== sliderValue)\n\t\t\tthat.undoableSetState('val', sliderValue, originalValue)\n\t})\n\n\t$min.on('change', function() {\n\t\tthat.undoableSetState('min', parseFloat($min.val()), that.state.min)\n\t})\n\n\t$max.on('change', function() {\n\t\tthat.undoableSetState('max', parseFloat($max.val()), that.state.max)\n\t})\n\n\tthis.updateUi()\n\n\treturn $el\n}\n\nSlider.prototype.updateUi = function() {\n\tif (!this.$slider)\n\t\treturn;\n\tthis.$slider.val(this.state.val)\n\tthis.$display.html(formatVal(this.state.val))\n\tthis.$min.val(this.state.min)\n\tthis.$max.val(this.state.max)\n\n\tif (this.state.max < this.state.min) {\n\t\tvar m = this.state.max\n\t\tthis.state.max = this.state.min\n\t\tthis.state.min = m\n\t\tthis.$max.val(this.state.max)\n\t\tthis.$min.val(this.state.min)\n\t}\n\n\tthis.$slider.prop('step', (this.state.max - this.state.min) / 1000)\n\tthis.$slider.prop('max', this.state.max)\n\tthis.$slider.prop('min', this.state.min)\n}\n\nSlider.prototype.update_output = function() {\n\treturn this.state.val\n}\n})();\n\n\n"
  },
  {
    "path": "browser/plugins/socket.io/socket.io-1.3.7.js",
    "content": "!function(e){if(\"object\"==typeof exports&&\"undefined\"!=typeof module)module.exports=e();else if(\"function\"==typeof define&&define.amd)define([],e);else{var f;\"undefined\"!=typeof window?f=window:\"undefined\"!=typeof global?f=global:\"undefined\"!=typeof self&&(f=self),f.io=e()}}(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error(\"Cannot find module '\"+o+\"'\")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.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(_dereq_,module,exports){module.exports=_dereq_(\"./lib/\")},{\"./lib/\":2}],2:[function(_dereq_,module,exports){var url=_dereq_(\"./url\");var parser=_dereq_(\"socket.io-parser\");var Manager=_dereq_(\"./manager\");var debug=_dereq_(\"debug\")(\"socket.io-client\");module.exports=exports=lookup;var cache=exports.managers={};function lookup(uri,opts){if(typeof uri==\"object\"){opts=uri;uri=undefined}opts=opts||{};var parsed=url(uri);var source=parsed.source;var id=parsed.id;var io;if(opts.forceNew||opts[\"force new connection\"]||false===opts.multiplex){debug(\"ignoring socket cache for %s\",source);io=Manager(source,opts)}else{if(!cache[id]){debug(\"new io instance for %s\",source);cache[id]=Manager(source,opts)}io=cache[id]}return io.socket(parsed.path)}exports.protocol=parser.protocol;exports.connect=lookup;exports.Manager=_dereq_(\"./manager\");exports.Socket=_dereq_(\"./socket\")},{\"./manager\":3,\"./socket\":5,\"./url\":6,debug:10,\"socket.io-parser\":44}],3:[function(_dereq_,module,exports){var url=_dereq_(\"./url\");var eio=_dereq_(\"engine.io-client\");var Socket=_dereq_(\"./socket\");var Emitter=_dereq_(\"component-emitter\");var parser=_dereq_(\"socket.io-parser\");var on=_dereq_(\"./on\");var bind=_dereq_(\"component-bind\");var object=_dereq_(\"object-component\");var debug=_dereq_(\"debug\")(\"socket.io-client:manager\");var indexOf=_dereq_(\"indexof\");var Backoff=_dereq_(\"backo2\");module.exports=Manager;function Manager(uri,opts){if(!(this instanceof Manager))return new Manager(uri,opts);if(uri&&\"object\"==typeof uri){opts=uri;uri=undefined}opts=opts||{};opts.path=opts.path||\"/socket.io\";this.nsps={};this.subs=[];this.opts=opts;this.reconnection(opts.reconnection!==false);this.reconnectionAttempts(opts.reconnectionAttempts||Infinity);this.reconnectionDelay(opts.reconnectionDelay||1e3);this.reconnectionDelayMax(opts.reconnectionDelayMax||5e3);this.randomizationFactor(opts.randomizationFactor||.5);this.backoff=new Backoff({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()});this.timeout(null==opts.timeout?2e4:opts.timeout);this.readyState=\"closed\";this.uri=uri;this.connected=[];this.encoding=false;this.packetBuffer=[];this.encoder=new parser.Encoder;this.decoder=new parser.Decoder;this.autoConnect=opts.autoConnect!==false;if(this.autoConnect)this.open()}Manager.prototype.emitAll=function(){this.emit.apply(this,arguments);for(var nsp in this.nsps){this.nsps[nsp].emit.apply(this.nsps[nsp],arguments)}};Manager.prototype.updateSocketIds=function(){for(var nsp in this.nsps){this.nsps[nsp].id=this.engine.id}};Emitter(Manager.prototype);Manager.prototype.reconnection=function(v){if(!arguments.length)return this._reconnection;this._reconnection=!!v;return this};Manager.prototype.reconnectionAttempts=function(v){if(!arguments.length)return this._reconnectionAttempts;this._reconnectionAttempts=v;return this};Manager.prototype.reconnectionDelay=function(v){if(!arguments.length)return this._reconnectionDelay;this._reconnectionDelay=v;this.backoff&&this.backoff.setMin(v);return this};Manager.prototype.randomizationFactor=function(v){if(!arguments.length)return this._randomizationFactor;this._randomizationFactor=v;this.backoff&&this.backoff.setJitter(v);return this};Manager.prototype.reconnectionDelayMax=function(v){if(!arguments.length)return this._reconnectionDelayMax;this._reconnectionDelayMax=v;this.backoff&&this.backoff.setMax(v);return this};Manager.prototype.timeout=function(v){if(!arguments.length)return this._timeout;this._timeout=v;return this};Manager.prototype.maybeReconnectOnOpen=function(){if(!this.reconnecting&&this._reconnection&&this.backoff.attempts===0){this.reconnect()}};Manager.prototype.open=Manager.prototype.connect=function(fn){debug(\"readyState %s\",this.readyState);if(~this.readyState.indexOf(\"open\"))return this;debug(\"opening %s\",this.uri);this.engine=eio(this.uri,this.opts);var socket=this.engine;var self=this;this.readyState=\"opening\";this.skipReconnect=false;var openSub=on(socket,\"open\",function(){self.onopen();fn&&fn()});var errorSub=on(socket,\"error\",function(data){debug(\"connect_error\");self.cleanup();self.readyState=\"closed\";self.emitAll(\"connect_error\",data);if(fn){var err=new Error(\"Connection error\");err.data=data;fn(err)}else{self.maybeReconnectOnOpen()}});if(false!==this._timeout){var timeout=this._timeout;debug(\"connect attempt will timeout after %d\",timeout);var timer=setTimeout(function(){debug(\"connect attempt timed out after %d\",timeout);openSub.destroy();socket.close();socket.emit(\"error\",\"timeout\");self.emitAll(\"connect_timeout\",timeout)},timeout);this.subs.push({destroy:function(){clearTimeout(timer)}})}this.subs.push(openSub);this.subs.push(errorSub);return this};Manager.prototype.onopen=function(){debug(\"open\");this.cleanup();this.readyState=\"open\";this.emit(\"open\");var socket=this.engine;this.subs.push(on(socket,\"data\",bind(this,\"ondata\")));this.subs.push(on(this.decoder,\"decoded\",bind(this,\"ondecoded\")));this.subs.push(on(socket,\"error\",bind(this,\"onerror\")));this.subs.push(on(socket,\"close\",bind(this,\"onclose\")))};Manager.prototype.ondata=function(data){this.decoder.add(data)};Manager.prototype.ondecoded=function(packet){this.emit(\"packet\",packet)};Manager.prototype.onerror=function(err){debug(\"error\",err);this.emitAll(\"error\",err)};Manager.prototype.socket=function(nsp){var socket=this.nsps[nsp];if(!socket){socket=new Socket(this,nsp);this.nsps[nsp]=socket;var self=this;socket.on(\"connect\",function(){socket.id=self.engine.id;if(!~indexOf(self.connected,socket)){self.connected.push(socket)}})}return socket};Manager.prototype.destroy=function(socket){var index=indexOf(this.connected,socket);if(~index)this.connected.splice(index,1);if(this.connected.length)return;this.close()};Manager.prototype.packet=function(packet){debug(\"writing packet %j\",packet);var self=this;if(!self.encoding){self.encoding=true;this.encoder.encode(packet,function(encodedPackets){for(var i=0;i<encodedPackets.length;i++){self.engine.write(encodedPackets[i])}self.encoding=false;self.processPacketQueue()})}else{self.packetBuffer.push(packet)}};Manager.prototype.processPacketQueue=function(){if(this.packetBuffer.length>0&&!this.encoding){var pack=this.packetBuffer.shift();this.packet(pack)}};Manager.prototype.cleanup=function(){var sub;while(sub=this.subs.shift())sub.destroy();this.packetBuffer=[];this.encoding=false;this.decoder.destroy()};Manager.prototype.close=Manager.prototype.disconnect=function(){this.skipReconnect=true;this.backoff.reset();this.readyState=\"closed\";this.engine&&this.engine.close()};Manager.prototype.onclose=function(reason){debug(\"close\");this.cleanup();this.backoff.reset();this.readyState=\"closed\";this.emit(\"close\",reason);if(this._reconnection&&!this.skipReconnect){this.reconnect()}};Manager.prototype.reconnect=function(){if(this.reconnecting||this.skipReconnect)return this;var self=this;if(this.backoff.attempts>=this._reconnectionAttempts){debug(\"reconnect failed\");this.backoff.reset();this.emitAll(\"reconnect_failed\");this.reconnecting=false}else{var delay=this.backoff.duration();debug(\"will wait %dms before reconnect attempt\",delay);this.reconnecting=true;var timer=setTimeout(function(){if(self.skipReconnect)return;debug(\"attempting reconnect\");self.emitAll(\"reconnect_attempt\",self.backoff.attempts);self.emitAll(\"reconnecting\",self.backoff.attempts);if(self.skipReconnect)return;self.open(function(err){if(err){debug(\"reconnect attempt error\");self.reconnecting=false;self.reconnect();self.emitAll(\"reconnect_error\",err.data)}else{debug(\"reconnect success\");self.onreconnect()}})},delay);this.subs.push({destroy:function(){clearTimeout(timer)}})}};Manager.prototype.onreconnect=function(){var attempt=this.backoff.attempts;this.reconnecting=false;this.backoff.reset();this.updateSocketIds();this.emitAll(\"reconnect\",attempt)}},{\"./on\":4,\"./socket\":5,\"./url\":6,backo2:7,\"component-bind\":8,\"component-emitter\":9,debug:10,\"engine.io-client\":11,indexof:40,\"object-component\":41,\"socket.io-parser\":44}],4:[function(_dereq_,module,exports){module.exports=on;function on(obj,ev,fn){obj.on(ev,fn);return{destroy:function(){obj.removeListener(ev,fn)}}}},{}],5:[function(_dereq_,module,exports){var parser=_dereq_(\"socket.io-parser\");var Emitter=_dereq_(\"component-emitter\");var toArray=_dereq_(\"to-array\");var on=_dereq_(\"./on\");var bind=_dereq_(\"component-bind\");var debug=_dereq_(\"debug\")(\"socket.io-client:socket\");var hasBin=_dereq_(\"has-binary\");module.exports=exports=Socket;var events={connect:1,connect_error:1,connect_timeout:1,disconnect:1,error:1,reconnect:1,reconnect_attempt:1,reconnect_failed:1,reconnect_error:1,reconnecting:1};var emit=Emitter.prototype.emit;function Socket(io,nsp){this.io=io;this.nsp=nsp;this.json=this;this.ids=0;this.acks={};if(this.io.autoConnect)this.open();this.receiveBuffer=[];this.sendBuffer=[];this.connected=false;this.disconnected=true}Emitter(Socket.prototype);Socket.prototype.subEvents=function(){if(this.subs)return;var io=this.io;this.subs=[on(io,\"open\",bind(this,\"onopen\")),on(io,\"packet\",bind(this,\"onpacket\")),on(io,\"close\",bind(this,\"onclose\"))]};Socket.prototype.open=Socket.prototype.connect=function(){if(this.connected)return this;this.subEvents();this.io.open();if(\"open\"==this.io.readyState)this.onopen();return this};Socket.prototype.send=function(){var args=toArray(arguments);args.unshift(\"message\");this.emit.apply(this,args);return this};Socket.prototype.emit=function(ev){if(events.hasOwnProperty(ev)){emit.apply(this,arguments);return this}var args=toArray(arguments);var parserType=parser.EVENT;if(hasBin(args)){parserType=parser.BINARY_EVENT}var packet={type:parserType,data:args};if(\"function\"==typeof args[args.length-1]){debug(\"emitting packet with ack id %d\",this.ids);this.acks[this.ids]=args.pop();packet.id=this.ids++}if(this.connected){this.packet(packet)}else{this.sendBuffer.push(packet)}return this};Socket.prototype.packet=function(packet){packet.nsp=this.nsp;this.io.packet(packet)};Socket.prototype.onopen=function(){debug(\"transport is open - connecting\");if(\"/\"!=this.nsp){this.packet({type:parser.CONNECT})}};Socket.prototype.onclose=function(reason){debug(\"close (%s)\",reason);this.connected=false;this.disconnected=true;delete this.id;this.emit(\"disconnect\",reason)};Socket.prototype.onpacket=function(packet){if(packet.nsp!=this.nsp)return;switch(packet.type){case parser.CONNECT:this.onconnect();break;case parser.EVENT:this.onevent(packet);break;case parser.BINARY_EVENT:this.onevent(packet);break;case parser.ACK:this.onack(packet);break;case parser.BINARY_ACK:this.onack(packet);break;case parser.DISCONNECT:this.ondisconnect();break;case parser.ERROR:this.emit(\"error\",packet.data);break}};Socket.prototype.onevent=function(packet){var args=packet.data||[];debug(\"emitting event %j\",args);if(null!=packet.id){debug(\"attaching ack callback to event\");args.push(this.ack(packet.id))}if(this.connected){emit.apply(this,args)}else{this.receiveBuffer.push(args)}};Socket.prototype.ack=function(id){var self=this;var sent=false;return function(){if(sent)return;sent=true;var args=toArray(arguments);debug(\"sending ack %j\",args);var type=hasBin(args)?parser.BINARY_ACK:parser.ACK;self.packet({type:type,id:id,data:args})}};Socket.prototype.onack=function(packet){debug(\"calling ack %s with %j\",packet.id,packet.data);var fn=this.acks[packet.id];fn.apply(this,packet.data);delete this.acks[packet.id]};Socket.prototype.onconnect=function(){this.connected=true;this.disconnected=false;this.emit(\"connect\");this.emitBuffered()};Socket.prototype.emitBuffered=function(){var i;for(i=0;i<this.receiveBuffer.length;i++){emit.apply(this,this.receiveBuffer[i])}this.receiveBuffer=[];for(i=0;i<this.sendBuffer.length;i++){this.packet(this.sendBuffer[i])}this.sendBuffer=[]};Socket.prototype.ondisconnect=function(){debug(\"server disconnect (%s)\",this.nsp);this.destroy();this.onclose(\"io server disconnect\")};Socket.prototype.destroy=function(){if(this.subs){for(var i=0;i<this.subs.length;i++){this.subs[i].destroy()}this.subs=null}this.io.destroy(this)};Socket.prototype.close=Socket.prototype.disconnect=function(){if(this.connected){debug(\"performing disconnect (%s)\",this.nsp);this.packet({type:parser.DISCONNECT})}this.destroy();if(this.connected){this.onclose(\"io client disconnect\")}return this}},{\"./on\":4,\"component-bind\":8,\"component-emitter\":9,debug:10,\"has-binary\":36,\"socket.io-parser\":44,\"to-array\":48}],6:[function(_dereq_,module,exports){(function(global){var parseuri=_dereq_(\"parseuri\");var debug=_dereq_(\"debug\")(\"socket.io-client:url\");module.exports=url;function url(uri,loc){var obj=uri;var loc=loc||global.location;if(null==uri)uri=loc.protocol+\"//\"+loc.host;if(\"string\"==typeof uri){if(\"/\"==uri.charAt(0)){if(\"/\"==uri.charAt(1)){uri=loc.protocol+uri}else{uri=loc.hostname+uri}}if(!/^(https?|wss?):\\/\\//.test(uri)){debug(\"protocol-less url %s\",uri);if(\"undefined\"!=typeof loc){uri=loc.protocol+\"//\"+uri}else{uri=\"https://\"+uri}}debug(\"parse %s\",uri);obj=parseuri(uri)}if(!obj.port){if(/^(http|ws)$/.test(obj.protocol)){obj.port=\"80\"}else if(/^(http|ws)s$/.test(obj.protocol)){obj.port=\"443\"}}obj.path=obj.path||\"/\";obj.id=obj.protocol+\"://\"+obj.host+\":\"+obj.port;obj.href=obj.protocol+\"://\"+obj.host+(loc&&loc.port==obj.port?\"\":\":\"+obj.port);return obj}}).call(this,typeof self!==\"undefined\"?self:typeof window!==\"undefined\"?window:{})},{debug:10,parseuri:42}],7:[function(_dereq_,module,exports){module.exports=Backoff;function Backoff(opts){opts=opts||{};this.ms=opts.min||100;this.max=opts.max||1e4;this.factor=opts.factor||2;this.jitter=opts.jitter>0&&opts.jitter<=1?opts.jitter:0;this.attempts=0}Backoff.prototype.duration=function(){var ms=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var rand=Math.random();var deviation=Math.floor(rand*this.jitter*ms);ms=(Math.floor(rand*10)&1)==0?ms-deviation:ms+deviation}return Math.min(ms,this.max)|0};Backoff.prototype.reset=function(){this.attempts=0};Backoff.prototype.setMin=function(min){this.ms=min};Backoff.prototype.setMax=function(max){this.max=max};Backoff.prototype.setJitter=function(jitter){this.jitter=jitter}},{}],8:[function(_dereq_,module,exports){var slice=[].slice;module.exports=function(obj,fn){if(\"string\"==typeof fn)fn=obj[fn];if(\"function\"!=typeof fn)throw new Error(\"bind() requires a function\");var args=slice.call(arguments,2);return function(){return fn.apply(obj,args.concat(slice.call(arguments)))}}},{}],9:[function(_dereq_,module,exports){module.exports=Emitter;function Emitter(obj){if(obj)return mixin(obj)}function mixin(obj){for(var key in Emitter.prototype){obj[key]=Emitter.prototype[key]}return obj}Emitter.prototype.on=Emitter.prototype.addEventListener=function(event,fn){this._callbacks=this._callbacks||{};(this._callbacks[event]=this._callbacks[event]||[]).push(fn);return this};Emitter.prototype.once=function(event,fn){var self=this;this._callbacks=this._callbacks||{};function on(){self.off(event,on);fn.apply(this,arguments)}on.fn=fn;this.on(event,on);return this};Emitter.prototype.off=Emitter.prototype.removeListener=Emitter.prototype.removeAllListeners=Emitter.prototype.removeEventListener=function(event,fn){this._callbacks=this._callbacks||{};if(0==arguments.length){this._callbacks={};return this}var callbacks=this._callbacks[event];if(!callbacks)return this;if(1==arguments.length){delete this._callbacks[event];return this}var cb;for(var i=0;i<callbacks.length;i++){cb=callbacks[i];if(cb===fn||cb.fn===fn){callbacks.splice(i,1);break}}return this};Emitter.prototype.emit=function(event){this._callbacks=this._callbacks||{};var args=[].slice.call(arguments,1),callbacks=this._callbacks[event];if(callbacks){callbacks=callbacks.slice(0);for(var i=0,len=callbacks.length;i<len;++i){callbacks[i].apply(this,args)}}return this};Emitter.prototype.listeners=function(event){this._callbacks=this._callbacks||{};return this._callbacks[event]||[]};Emitter.prototype.hasListeners=function(event){return!!this.listeners(event).length}},{}],10:[function(_dereq_,module,exports){module.exports=debug;function debug(name){if(!debug.enabled(name))return function(){};return function(fmt){fmt=coerce(fmt);var curr=new Date;var ms=curr-(debug[name]||curr);debug[name]=curr;fmt=name+\" \"+fmt+\" +\"+debug.humanize(ms);window.console&&console.log&&Function.prototype.apply.call(console.log,console,arguments)}}debug.names=[];debug.skips=[];debug.enable=function(name){try{localStorage.debug=name}catch(e){}var split=(name||\"\").split(/[\\s,]+/),len=split.length;for(var i=0;i<len;i++){name=split[i].replace(\"*\",\".*?\");if(name[0]===\"-\"){debug.skips.push(new RegExp(\"^\"+name.substr(1)+\"$\"))}else{debug.names.push(new RegExp(\"^\"+name+\"$\"))}}};debug.disable=function(){debug.enable(\"\")};debug.humanize=function(ms){var sec=1e3,min=60*1e3,hour=60*min;if(ms>=hour)return(ms/hour).toFixed(1)+\"h\";if(ms>=min)return(ms/min).toFixed(1)+\"m\";if(ms>=sec)return(ms/sec|0)+\"s\";return ms+\"ms\"};debug.enabled=function(name){for(var i=0,len=debug.skips.length;i<len;i++){if(debug.skips[i].test(name)){return false}}for(var i=0,len=debug.names.length;i<len;i++){if(debug.names[i].test(name)){return true}}return false};function coerce(val){if(val instanceof Error)return val.stack||val.message;return val}try{if(window.localStorage)debug.enable(localStorage.debug)}catch(e){}},{}],11:[function(_dereq_,module,exports){module.exports=_dereq_(\"./lib/\")},{\"./lib/\":12}],12:[function(_dereq_,module,exports){module.exports=_dereq_(\"./socket\");module.exports.parser=_dereq_(\"engine.io-parser\")},{\"./socket\":13,\"engine.io-parser\":25}],13:[function(_dereq_,module,exports){(function(global){var transports=_dereq_(\"./transports\");var Emitter=_dereq_(\"component-emitter\");var debug=_dereq_(\"debug\")(\"engine.io-client:socket\");var index=_dereq_(\"indexof\");var parser=_dereq_(\"engine.io-parser\");var parseuri=_dereq_(\"parseuri\");var parsejson=_dereq_(\"parsejson\");var parseqs=_dereq_(\"parseqs\");module.exports=Socket;function noop(){}function Socket(uri,opts){if(!(this instanceof Socket))return new Socket(uri,opts);opts=opts||{};if(uri&&\"object\"==typeof uri){opts=uri;uri=null}if(uri){uri=parseuri(uri);opts.host=uri.host;opts.secure=uri.protocol==\"https\"||uri.protocol==\"wss\";opts.port=uri.port;if(uri.query)opts.query=uri.query}this.secure=null!=opts.secure?opts.secure:global.location&&\"https:\"==location.protocol;if(opts.host){var pieces=opts.host.split(\":\");opts.hostname=pieces.shift();if(pieces.length){opts.port=pieces.pop()}else if(!opts.port){opts.port=this.secure?\"443\":\"80\"}}this.agent=opts.agent||false;this.hostname=opts.hostname||(global.location?location.hostname:\"localhost\");this.port=opts.port||(global.location&&location.port?location.port:this.secure?443:80);this.query=opts.query||{};if(\"string\"==typeof this.query)this.query=parseqs.decode(this.query);this.upgrade=false!==opts.upgrade;this.path=(opts.path||\"/engine.io\").replace(/\\/$/,\"\")+\"/\";this.forceJSONP=!!opts.forceJSONP;this.jsonp=false!==opts.jsonp;this.forceBase64=!!opts.forceBase64;this.enablesXDR=!!opts.enablesXDR;this.timestampParam=opts.timestampParam||\"t\";this.timestampRequests=opts.timestampRequests;this.transports=opts.transports||[\"polling\",\"websocket\"];this.readyState=\"\";this.writeBuffer=[];this.callbackBuffer=[];this.policyPort=opts.policyPort||843;this.rememberUpgrade=opts.rememberUpgrade||false;this.binaryType=null;this.onlyBinaryUpgrades=opts.onlyBinaryUpgrades;this.pfx=opts.pfx||null;this.key=opts.key||null;this.passphrase=opts.passphrase||null;this.cert=opts.cert||null;this.ca=opts.ca||null;this.ciphers=opts.ciphers||null;this.rejectUnauthorized=opts.rejectUnauthorized||null;this.open()}Socket.priorWebsocketSuccess=false;Emitter(Socket.prototype);Socket.protocol=parser.protocol;Socket.Socket=Socket;Socket.Transport=_dereq_(\"./transport\");Socket.transports=_dereq_(\"./transports\");Socket.parser=_dereq_(\"engine.io-parser\");Socket.prototype.createTransport=function(name){debug('creating transport \"%s\"',name);var query=clone(this.query);query.EIO=parser.protocol;query.transport=name;if(this.id)query.sid=this.id;var transport=new transports[name]({agent:this.agent,hostname:this.hostname,port:this.port,secure:this.secure,path:this.path,query:query,forceJSONP:this.forceJSONP,jsonp:this.jsonp,forceBase64:this.forceBase64,enablesXDR:this.enablesXDR,timestampRequests:this.timestampRequests,timestampParam:this.timestampParam,policyPort:this.policyPort,socket:this,pfx:this.pfx,key:this.key,passphrase:this.passphrase,cert:this.cert,ca:this.ca,ciphers:this.ciphers,rejectUnauthorized:this.rejectUnauthorized});return transport};function clone(obj){var o={};for(var i in obj){if(obj.hasOwnProperty(i)){o[i]=obj[i]}}return o}Socket.prototype.open=function(){var transport;if(this.rememberUpgrade&&Socket.priorWebsocketSuccess&&this.transports.indexOf(\"websocket\")!=-1){transport=\"websocket\"}else if(0==this.transports.length){var self=this;setTimeout(function(){self.emit(\"error\",\"No transports available\")},0);return}else{transport=this.transports[0]}this.readyState=\"opening\";var transport;try{transport=this.createTransport(transport)}catch(e){this.transports.shift();this.open();return}transport.open();this.setTransport(transport)};Socket.prototype.setTransport=function(transport){debug(\"setting transport %s\",transport.name);var self=this;if(this.transport){debug(\"clearing existing transport %s\",this.transport.name);this.transport.removeAllListeners()}this.transport=transport;transport.on(\"drain\",function(){self.onDrain()}).on(\"packet\",function(packet){self.onPacket(packet)}).on(\"error\",function(e){self.onError(e)}).on(\"close\",function(){self.onClose(\"transport close\")})};Socket.prototype.probe=function(name){debug('probing transport \"%s\"',name);var transport=this.createTransport(name,{probe:1}),failed=false,self=this;Socket.priorWebsocketSuccess=false;function onTransportOpen(){if(self.onlyBinaryUpgrades){var upgradeLosesBinary=!this.supportsBinary&&self.transport.supportsBinary;failed=failed||upgradeLosesBinary}if(failed)return;debug('probe transport \"%s\" opened',name);transport.send([{type:\"ping\",data:\"probe\"}]);transport.once(\"packet\",function(msg){if(failed)return;if(\"pong\"==msg.type&&\"probe\"==msg.data){debug('probe transport \"%s\" pong',name);self.upgrading=true;self.emit(\"upgrading\",transport);if(!transport)return;Socket.priorWebsocketSuccess=\"websocket\"==transport.name;debug('pausing current transport \"%s\"',self.transport.name);self.transport.pause(function(){if(failed)return;if(\"closed\"==self.readyState)return;debug(\"changing transport and sending upgrade packet\");cleanup();self.setTransport(transport);transport.send([{type:\"upgrade\"}]);self.emit(\"upgrade\",transport);transport=null;self.upgrading=false;self.flush()})}else{debug('probe transport \"%s\" failed',name);var err=new Error(\"probe error\");err.transport=transport.name;self.emit(\"upgradeError\",err)}})}function freezeTransport(){if(failed)return;failed=true;cleanup();transport.close();transport=null}function onerror(err){var error=new Error(\"probe error: \"+err);error.transport=transport.name;freezeTransport();debug('probe transport \"%s\" failed because of error: %s',name,err);self.emit(\"upgradeError\",error)}function onTransportClose(){onerror(\"transport closed\")}function onclose(){onerror(\"socket closed\")}function onupgrade(to){if(transport&&to.name!=transport.name){debug('\"%s\" works - aborting \"%s\"',to.name,transport.name);freezeTransport()}}function cleanup(){transport.removeListener(\"open\",onTransportOpen);transport.removeListener(\"error\",onerror);transport.removeListener(\"close\",onTransportClose);self.removeListener(\"close\",onclose);self.removeListener(\"upgrading\",onupgrade)}transport.once(\"open\",onTransportOpen);transport.once(\"error\",onerror);transport.once(\"close\",onTransportClose);this.once(\"close\",onclose);this.once(\"upgrading\",onupgrade);transport.open()};Socket.prototype.onOpen=function(){debug(\"socket open\");this.readyState=\"open\";Socket.priorWebsocketSuccess=\"websocket\"==this.transport.name;this.emit(\"open\");this.flush();if(\"open\"==this.readyState&&this.upgrade&&this.transport.pause){debug(\"starting upgrade probes\");for(var i=0,l=this.upgrades.length;i<l;i++){this.probe(this.upgrades[i])}}};Socket.prototype.onPacket=function(packet){if(\"opening\"==this.readyState||\"open\"==this.readyState){debug('socket receive: type \"%s\", data \"%s\"',packet.type,packet.data);this.emit(\"packet\",packet);this.emit(\"heartbeat\");switch(packet.type){case\"open\":this.onHandshake(parsejson(packet.data));break;case\"pong\":this.setPing();break;case\"error\":var err=new Error(\"server error\");err.code=packet.data;this.emit(\"error\",err);break;case\"message\":this.emit(\"data\",packet.data);this.emit(\"message\",packet.data);break}}else{debug('packet received with socket readyState \"%s\"',this.readyState)}};Socket.prototype.onHandshake=function(data){this.emit(\"handshake\",data);this.id=data.sid;this.transport.query.sid=data.sid;this.upgrades=this.filterUpgrades(data.upgrades);this.pingInterval=data.pingInterval;this.pingTimeout=data.pingTimeout;this.onOpen();if(\"closed\"==this.readyState)return;this.setPing();this.removeListener(\"heartbeat\",this.onHeartbeat);this.on(\"heartbeat\",this.onHeartbeat)};Socket.prototype.onHeartbeat=function(timeout){clearTimeout(this.pingTimeoutTimer);var self=this;self.pingTimeoutTimer=setTimeout(function(){if(\"closed\"==self.readyState)return;self.onClose(\"ping timeout\")},timeout||self.pingInterval+self.pingTimeout)};Socket.prototype.setPing=function(){var self=this;clearTimeout(self.pingIntervalTimer);self.pingIntervalTimer=setTimeout(function(){debug(\"writing ping packet - expecting pong within %sms\",self.pingTimeout);self.ping();self.onHeartbeat(self.pingTimeout)},self.pingInterval)};Socket.prototype.ping=function(){this.sendPacket(\"ping\")};Socket.prototype.onDrain=function(){for(var i=0;i<this.prevBufferLen;i++){if(this.callbackBuffer[i]){this.callbackBuffer[i]()}}this.writeBuffer.splice(0,this.prevBufferLen);this.callbackBuffer.splice(0,this.prevBufferLen);this.prevBufferLen=0;if(this.writeBuffer.length==0){this.emit(\"drain\")}else{this.flush()}};Socket.prototype.flush=function(){if(\"closed\"!=this.readyState&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length){debug(\"flushing %d packets in socket\",this.writeBuffer.length);this.transport.send(this.writeBuffer);this.prevBufferLen=this.writeBuffer.length;this.emit(\"flush\")}};Socket.prototype.write=Socket.prototype.send=function(msg,fn){this.sendPacket(\"message\",msg,fn);return this};Socket.prototype.sendPacket=function(type,data,fn){if(\"closing\"==this.readyState||\"closed\"==this.readyState){return}var packet={type:type,data:data};this.emit(\"packetCreate\",packet);this.writeBuffer.push(packet);this.callbackBuffer.push(fn);this.flush()};Socket.prototype.close=function(){if(\"opening\"==this.readyState||\"open\"==this.readyState){this.readyState=\"closing\";var self=this;function close(){self.onClose(\"forced close\");debug(\"socket closing - telling transport to close\");self.transport.close()}function cleanupAndClose(){self.removeListener(\"upgrade\",cleanupAndClose);self.removeListener(\"upgradeError\",cleanupAndClose);close()}function waitForUpgrade(){self.once(\"upgrade\",cleanupAndClose);self.once(\"upgradeError\",cleanupAndClose)}if(this.writeBuffer.length){this.once(\"drain\",function(){if(this.upgrading){waitForUpgrade()}else{close()}})}else if(this.upgrading){waitForUpgrade()}else{close()}}return this};Socket.prototype.onError=function(err){debug(\"socket error %j\",err);Socket.priorWebsocketSuccess=false;this.emit(\"error\",err);this.onClose(\"transport error\",err)};Socket.prototype.onClose=function(reason,desc){if(\"opening\"==this.readyState||\"open\"==this.readyState||\"closing\"==this.readyState){debug('socket close with reason: \"%s\"',reason);var self=this;clearTimeout(this.pingIntervalTimer);clearTimeout(this.pingTimeoutTimer);setTimeout(function(){self.writeBuffer=[];self.callbackBuffer=[];self.prevBufferLen=0},0);this.transport.removeAllListeners(\"close\");this.transport.close();this.transport.removeAllListeners();this.readyState=\"closed\";this.id=null;this.emit(\"close\",reason,desc)}};Socket.prototype.filterUpgrades=function(upgrades){var filteredUpgrades=[];for(var i=0,j=upgrades.length;i<j;i++){if(~index(this.transports,upgrades[i]))filteredUpgrades.push(upgrades[i])}return filteredUpgrades}}).call(this,typeof self!==\"undefined\"?self:typeof window!==\"undefined\"?window:{})},{\"./transport\":14,\"./transports\":15,\"component-emitter\":9,debug:22,\"engine.io-parser\":25,indexof:40,parsejson:32,parseqs:33,parseuri:34}],14:[function(_dereq_,module,exports){var parser=_dereq_(\"engine.io-parser\");var Emitter=_dereq_(\"component-emitter\");module.exports=Transport;function Transport(opts){this.path=opts.path;this.hostname=opts.hostname;this.port=opts.port;this.secure=opts.secure;this.query=opts.query;this.timestampParam=opts.timestampParam;this.timestampRequests=opts.timestampRequests;this.readyState=\"\";this.agent=opts.agent||false;this.socket=opts.socket;this.enablesXDR=opts.enablesXDR;this.pfx=opts.pfx;this.key=opts.key;this.passphrase=opts.passphrase;this.cert=opts.cert;this.ca=opts.ca;this.ciphers=opts.ciphers;this.rejectUnauthorized=opts.rejectUnauthorized}Emitter(Transport.prototype);Transport.timestamps=0;Transport.prototype.onError=function(msg,desc){var err=new Error(msg);err.type=\"TransportError\";err.description=desc;this.emit(\"error\",err);return this};Transport.prototype.open=function(){if(\"closed\"==this.readyState||\"\"==this.readyState){this.readyState=\"opening\";this.doOpen()}return this};Transport.prototype.close=function(){if(\"opening\"==this.readyState||\"open\"==this.readyState){this.doClose();this.onClose()}return this};Transport.prototype.send=function(packets){if(\"open\"==this.readyState){this.write(packets)}else{throw new Error(\"Transport not open\")}};Transport.prototype.onOpen=function(){this.readyState=\"open\";this.writable=true;this.emit(\"open\")};Transport.prototype.onData=function(data){var packet=parser.decodePacket(data,this.socket.binaryType);this.onPacket(packet)};Transport.prototype.onPacket=function(packet){this.emit(\"packet\",packet)};Transport.prototype.onClose=function(){this.readyState=\"closed\";this.emit(\"close\")}},{\"component-emitter\":9,\"engine.io-parser\":25}],15:[function(_dereq_,module,exports){(function(global){var XMLHttpRequest=_dereq_(\"xmlhttprequest\");var XHR=_dereq_(\"./polling-xhr\");var JSONP=_dereq_(\"./polling-jsonp\");var websocket=_dereq_(\"./websocket\");exports.polling=polling;exports.websocket=websocket;function polling(opts){var xhr;var xd=false;var xs=false;var jsonp=false!==opts.jsonp;if(global.location){var isSSL=\"https:\"==location.protocol;var port=location.port;if(!port){port=isSSL?443:80}xd=opts.hostname!=location.hostname||port!=opts.port;xs=opts.secure!=isSSL}opts.xdomain=xd;opts.xscheme=xs;xhr=new XMLHttpRequest(opts);if(\"open\"in xhr&&!opts.forceJSONP){return new XHR(opts)}else{if(!jsonp)throw new Error(\"JSONP disabled\");return new JSONP(opts)}}}).call(this,typeof self!==\"undefined\"?self:typeof window!==\"undefined\"?window:{})},{\"./polling-jsonp\":16,\"./polling-xhr\":17,\"./websocket\":19,xmlhttprequest:20}],16:[function(_dereq_,module,exports){(function(global){var Polling=_dereq_(\"./polling\");var inherit=_dereq_(\"component-inherit\");module.exports=JSONPPolling;var rNewline=/\\n/g;var rEscapedNewline=/\\\\n/g;var callbacks;var index=0;function empty(){}function JSONPPolling(opts){Polling.call(this,opts);\nthis.query=this.query||{};if(!callbacks){if(!global.___eio)global.___eio=[];callbacks=global.___eio}this.index=callbacks.length;var self=this;callbacks.push(function(msg){self.onData(msg)});this.query.j=this.index;if(global.document&&global.addEventListener){global.addEventListener(\"beforeunload\",function(){if(self.script)self.script.onerror=empty},false)}}inherit(JSONPPolling,Polling);JSONPPolling.prototype.supportsBinary=false;JSONPPolling.prototype.doClose=function(){if(this.script){this.script.parentNode.removeChild(this.script);this.script=null}if(this.form){this.form.parentNode.removeChild(this.form);this.form=null;this.iframe=null}Polling.prototype.doClose.call(this)};JSONPPolling.prototype.doPoll=function(){var self=this;var script=document.createElement(\"script\");if(this.script){this.script.parentNode.removeChild(this.script);this.script=null}script.async=true;script.src=this.uri();script.onerror=function(e){self.onError(\"jsonp poll error\",e)};var insertAt=document.getElementsByTagName(\"script\")[0];insertAt.parentNode.insertBefore(script,insertAt);this.script=script;var isUAgecko=\"undefined\"!=typeof navigator&&/gecko/i.test(navigator.userAgent);if(isUAgecko){setTimeout(function(){var iframe=document.createElement(\"iframe\");document.body.appendChild(iframe);document.body.removeChild(iframe)},100)}};JSONPPolling.prototype.doWrite=function(data,fn){var self=this;if(!this.form){var form=document.createElement(\"form\");var area=document.createElement(\"textarea\");var id=this.iframeId=\"eio_iframe_\"+this.index;var iframe;form.className=\"socketio\";form.style.position=\"absolute\";form.style.top=\"-1000px\";form.style.left=\"-1000px\";form.target=id;form.method=\"POST\";form.setAttribute(\"accept-charset\",\"utf-8\");area.name=\"d\";form.appendChild(area);document.body.appendChild(form);this.form=form;this.area=area}this.form.action=this.uri();function complete(){initIframe();fn()}function initIframe(){if(self.iframe){try{self.form.removeChild(self.iframe)}catch(e){self.onError(\"jsonp polling iframe removal error\",e)}}try{var html='<iframe src=\"javascript:0\" name=\"'+self.iframeId+'\">';iframe=document.createElement(html)}catch(e){iframe=document.createElement(\"iframe\");iframe.name=self.iframeId;iframe.src=\"javascript:0\"}iframe.id=self.iframeId;self.form.appendChild(iframe);self.iframe=iframe}initIframe();data=data.replace(rEscapedNewline,\"\\\\\\n\");this.area.value=data.replace(rNewline,\"\\\\n\");try{this.form.submit()}catch(e){}if(this.iframe.attachEvent){this.iframe.onreadystatechange=function(){if(self.iframe.readyState==\"complete\"){complete()}}}else{this.iframe.onload=complete}}}).call(this,typeof self!==\"undefined\"?self:typeof window!==\"undefined\"?window:{})},{\"./polling\":18,\"component-inherit\":21}],17:[function(_dereq_,module,exports){(function(global){var XMLHttpRequest=_dereq_(\"xmlhttprequest\");var Polling=_dereq_(\"./polling\");var Emitter=_dereq_(\"component-emitter\");var inherit=_dereq_(\"component-inherit\");var debug=_dereq_(\"debug\")(\"engine.io-client:polling-xhr\");module.exports=XHR;module.exports.Request=Request;function empty(){}function XHR(opts){Polling.call(this,opts);if(global.location){var isSSL=\"https:\"==location.protocol;var port=location.port;if(!port){port=isSSL?443:80}this.xd=opts.hostname!=global.location.hostname||port!=opts.port;this.xs=opts.secure!=isSSL}}inherit(XHR,Polling);XHR.prototype.supportsBinary=true;XHR.prototype.request=function(opts){opts=opts||{};opts.uri=this.uri();opts.xd=this.xd;opts.xs=this.xs;opts.agent=this.agent||false;opts.supportsBinary=this.supportsBinary;opts.enablesXDR=this.enablesXDR;opts.pfx=this.pfx;opts.key=this.key;opts.passphrase=this.passphrase;opts.cert=this.cert;opts.ca=this.ca;opts.ciphers=this.ciphers;opts.rejectUnauthorized=this.rejectUnauthorized;return new Request(opts)};XHR.prototype.doWrite=function(data,fn){var isBinary=typeof data!==\"string\"&&data!==undefined;var req=this.request({method:\"POST\",data:data,isBinary:isBinary});var self=this;req.on(\"success\",fn);req.on(\"error\",function(err){self.onError(\"xhr post error\",err)});this.sendXhr=req};XHR.prototype.doPoll=function(){debug(\"xhr poll\");var req=this.request();var self=this;req.on(\"data\",function(data){self.onData(data)});req.on(\"error\",function(err){self.onError(\"xhr poll error\",err)});this.pollXhr=req};function Request(opts){this.method=opts.method||\"GET\";this.uri=opts.uri;this.xd=!!opts.xd;this.xs=!!opts.xs;this.async=false!==opts.async;this.data=undefined!=opts.data?opts.data:null;this.agent=opts.agent;this.isBinary=opts.isBinary;this.supportsBinary=opts.supportsBinary;this.enablesXDR=opts.enablesXDR;this.pfx=opts.pfx;this.key=opts.key;this.passphrase=opts.passphrase;this.cert=opts.cert;this.ca=opts.ca;this.ciphers=opts.ciphers;this.rejectUnauthorized=opts.rejectUnauthorized;this.create()}Emitter(Request.prototype);Request.prototype.create=function(){var opts={agent:this.agent,xdomain:this.xd,xscheme:this.xs,enablesXDR:this.enablesXDR};opts.pfx=this.pfx;opts.key=this.key;opts.passphrase=this.passphrase;opts.cert=this.cert;opts.ca=this.ca;opts.ciphers=this.ciphers;opts.rejectUnauthorized=this.rejectUnauthorized;var xhr=this.xhr=new XMLHttpRequest(opts);var self=this;try{debug(\"xhr open %s: %s\",this.method,this.uri);xhr.open(this.method,this.uri,this.async);if(this.supportsBinary){xhr.responseType=\"arraybuffer\"}if(\"POST\"==this.method){try{if(this.isBinary){xhr.setRequestHeader(\"Content-type\",\"application/octet-stream\")}else{xhr.setRequestHeader(\"Content-type\",\"text/plain;charset=UTF-8\")}}catch(e){}}if(\"withCredentials\"in xhr){xhr.withCredentials=true}if(this.hasXDR()){xhr.onload=function(){self.onLoad()};xhr.onerror=function(){self.onError(xhr.responseText)}}else{xhr.onreadystatechange=function(){if(4!=xhr.readyState)return;if(200==xhr.status||1223==xhr.status){self.onLoad()}else{setTimeout(function(){self.onError(xhr.status)},0)}}}debug(\"xhr data %s\",this.data);xhr.send(this.data)}catch(e){setTimeout(function(){self.onError(e)},0);return}if(global.document){this.index=Request.requestsCount++;Request.requests[this.index]=this}};Request.prototype.onSuccess=function(){this.emit(\"success\");this.cleanup()};Request.prototype.onData=function(data){this.emit(\"data\",data);this.onSuccess()};Request.prototype.onError=function(err){this.emit(\"error\",err);this.cleanup(true)};Request.prototype.cleanup=function(fromError){if(\"undefined\"==typeof this.xhr||null===this.xhr){return}if(this.hasXDR()){this.xhr.onload=this.xhr.onerror=empty}else{this.xhr.onreadystatechange=empty}if(fromError){try{this.xhr.abort()}catch(e){}}if(global.document){delete Request.requests[this.index]}this.xhr=null};Request.prototype.onLoad=function(){var data;try{var contentType;try{contentType=this.xhr.getResponseHeader(\"Content-Type\").split(\";\")[0]}catch(e){}if(contentType===\"application/octet-stream\"){data=this.xhr.response}else{if(!this.supportsBinary){data=this.xhr.responseText}else{data=\"ok\"}}}catch(e){this.onError(e)}if(null!=data){this.onData(data)}};Request.prototype.hasXDR=function(){return\"undefined\"!==typeof global.XDomainRequest&&!this.xs&&this.enablesXDR};Request.prototype.abort=function(){this.cleanup()};if(global.document){Request.requestsCount=0;Request.requests={};if(global.attachEvent){global.attachEvent(\"onunload\",unloadHandler)}else if(global.addEventListener){global.addEventListener(\"beforeunload\",unloadHandler,false)}}function unloadHandler(){for(var i in Request.requests){if(Request.requests.hasOwnProperty(i)){Request.requests[i].abort()}}}}).call(this,typeof self!==\"undefined\"?self:typeof window!==\"undefined\"?window:{})},{\"./polling\":18,\"component-emitter\":9,\"component-inherit\":21,debug:22,xmlhttprequest:20}],18:[function(_dereq_,module,exports){var Transport=_dereq_(\"../transport\");var parseqs=_dereq_(\"parseqs\");var parser=_dereq_(\"engine.io-parser\");var inherit=_dereq_(\"component-inherit\");var debug=_dereq_(\"debug\")(\"engine.io-client:polling\");module.exports=Polling;var hasXHR2=function(){var XMLHttpRequest=_dereq_(\"xmlhttprequest\");var xhr=new XMLHttpRequest({xdomain:false});return null!=xhr.responseType}();function Polling(opts){var forceBase64=opts&&opts.forceBase64;if(!hasXHR2||forceBase64){this.supportsBinary=false}Transport.call(this,opts)}inherit(Polling,Transport);Polling.prototype.name=\"polling\";Polling.prototype.doOpen=function(){this.poll()};Polling.prototype.pause=function(onPause){var pending=0;var self=this;this.readyState=\"pausing\";function pause(){debug(\"paused\");self.readyState=\"paused\";onPause()}if(this.polling||!this.writable){var total=0;if(this.polling){debug(\"we are currently polling - waiting to pause\");total++;this.once(\"pollComplete\",function(){debug(\"pre-pause polling complete\");--total||pause()})}if(!this.writable){debug(\"we are currently writing - waiting to pause\");total++;this.once(\"drain\",function(){debug(\"pre-pause writing complete\");--total||pause()})}}else{pause()}};Polling.prototype.poll=function(){debug(\"polling\");this.polling=true;this.doPoll();this.emit(\"poll\")};Polling.prototype.onData=function(data){var self=this;debug(\"polling got data %s\",data);var callback=function(packet,index,total){if(\"opening\"==self.readyState){self.onOpen()}if(\"close\"==packet.type){self.onClose();return false}self.onPacket(packet)};parser.decodePayload(data,this.socket.binaryType,callback);if(\"closed\"!=this.readyState){this.polling=false;this.emit(\"pollComplete\");if(\"open\"==this.readyState){this.poll()}else{debug('ignoring poll - transport state \"%s\"',this.readyState)}}};Polling.prototype.doClose=function(){var self=this;function close(){debug(\"writing close packet\");self.write([{type:\"close\"}])}if(\"open\"==this.readyState){debug(\"transport open - closing\");close()}else{debug(\"transport not open - deferring close\");this.once(\"open\",close)}};Polling.prototype.write=function(packets){var self=this;this.writable=false;var callbackfn=function(){self.writable=true;self.emit(\"drain\")};var self=this;parser.encodePayload(packets,this.supportsBinary,function(data){self.doWrite(data,callbackfn)})};Polling.prototype.uri=function(){var query=this.query||{};var schema=this.secure?\"https\":\"http\";var port=\"\";if(false!==this.timestampRequests){query[this.timestampParam]=+new Date+\"-\"+Transport.timestamps++}if(!this.supportsBinary&&!query.sid){query.b64=1}query=parseqs.encode(query);if(this.port&&(\"https\"==schema&&this.port!=443||\"http\"==schema&&this.port!=80)){port=\":\"+this.port}if(query.length){query=\"?\"+query}return schema+\"://\"+this.hostname+port+this.path+query}},{\"../transport\":14,\"component-inherit\":21,debug:22,\"engine.io-parser\":25,parseqs:33,xmlhttprequest:20}],19:[function(_dereq_,module,exports){var Transport=_dereq_(\"../transport\");var parser=_dereq_(\"engine.io-parser\");var parseqs=_dereq_(\"parseqs\");var inherit=_dereq_(\"component-inherit\");var debug=_dereq_(\"debug\")(\"engine.io-client:websocket\");var WebSocket=_dereq_(\"ws\");module.exports=WS;function WS(opts){var forceBase64=opts&&opts.forceBase64;if(forceBase64){this.supportsBinary=false}Transport.call(this,opts)}inherit(WS,Transport);WS.prototype.name=\"websocket\";WS.prototype.supportsBinary=true;WS.prototype.doOpen=function(){if(!this.check()){return}var self=this;var uri=this.uri();var protocols=void 0;var opts={agent:this.agent};opts.pfx=this.pfx;opts.key=this.key;opts.passphrase=this.passphrase;opts.cert=this.cert;opts.ca=this.ca;opts.ciphers=this.ciphers;opts.rejectUnauthorized=this.rejectUnauthorized;this.ws=new WebSocket(uri,protocols,opts);if(this.ws.binaryType===undefined){this.supportsBinary=false}this.ws.binaryType=\"arraybuffer\";this.addEventListeners()};WS.prototype.addEventListeners=function(){var self=this;this.ws.onopen=function(){self.onOpen()};this.ws.onclose=function(){self.onClose()};this.ws.onmessage=function(ev){self.onData(ev.data)};this.ws.onerror=function(e){self.onError(\"websocket error\",e)}};if(\"undefined\"!=typeof navigator&&/iPad|iPhone|iPod/i.test(navigator.userAgent)){WS.prototype.onData=function(data){var self=this;setTimeout(function(){Transport.prototype.onData.call(self,data)},0)}}WS.prototype.write=function(packets){var self=this;this.writable=false;for(var i=0,l=packets.length;i<l;i++){parser.encodePacket(packets[i],this.supportsBinary,function(data){try{self.ws.send(data)}catch(e){debug(\"websocket closed before onclose event\")}})}function ondrain(){self.writable=true;self.emit(\"drain\")}setTimeout(ondrain,0)};WS.prototype.onClose=function(){Transport.prototype.onClose.call(this)};WS.prototype.doClose=function(){if(typeof this.ws!==\"undefined\"){this.ws.close()}};WS.prototype.uri=function(){var query=this.query||{};var schema=this.secure?\"wss\":\"ws\";var port=\"\";if(this.port&&(\"wss\"==schema&&this.port!=443||\"ws\"==schema&&this.port!=80)){port=\":\"+this.port}if(this.timestampRequests){query[this.timestampParam]=+new Date}if(!this.supportsBinary){query.b64=1}query=parseqs.encode(query);if(query.length){query=\"?\"+query}return schema+\"://\"+this.hostname+port+this.path+query};WS.prototype.check=function(){return!!WebSocket&&!(\"__initialize\"in WebSocket&&this.name===WS.prototype.name)}},{\"../transport\":14,\"component-inherit\":21,debug:22,\"engine.io-parser\":25,parseqs:33,ws:35}],20:[function(_dereq_,module,exports){var hasCORS=_dereq_(\"has-cors\");module.exports=function(opts){var xdomain=opts.xdomain;var xscheme=opts.xscheme;var enablesXDR=opts.enablesXDR;try{if(\"undefined\"!=typeof XMLHttpRequest&&(!xdomain||hasCORS)){return new XMLHttpRequest}}catch(e){}try{if(\"undefined\"!=typeof XDomainRequest&&!xscheme&&enablesXDR){return new XDomainRequest}}catch(e){}if(!xdomain){try{return new ActiveXObject(\"Microsoft.XMLHTTP\")}catch(e){}}}},{\"has-cors\":38}],21:[function(_dereq_,module,exports){module.exports=function(a,b){var fn=function(){};fn.prototype=b.prototype;a.prototype=new fn;a.prototype.constructor=a}},{}],22:[function(_dereq_,module,exports){exports=module.exports=_dereq_(\"./debug\");exports.log=log;exports.formatArgs=formatArgs;exports.save=save;exports.load=load;exports.useColors=useColors;exports.colors=[\"lightseagreen\",\"forestgreen\",\"goldenrod\",\"dodgerblue\",\"darkorchid\",\"crimson\"];function useColors(){return\"WebkitAppearance\"in document.documentElement.style||window.console&&(console.firebug||console.exception&&console.table)||navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)&&parseInt(RegExp.$1,10)>=31}exports.formatters.j=function(v){return JSON.stringify(v)};function formatArgs(){var args=arguments;var useColors=this.useColors;args[0]=(useColors?\"%c\":\"\")+this.namespace+(useColors?\" %c\":\" \")+args[0]+(useColors?\"%c \":\" \")+\"+\"+exports.humanize(this.diff);if(!useColors)return args;var c=\"color: \"+this.color;args=[args[0],c,\"color: inherit\"].concat(Array.prototype.slice.call(args,1));var index=0;var lastC=0;args[0].replace(/%[a-z%]/g,function(match){if(\"%%\"===match)return;index++;if(\"%c\"===match){lastC=index}});args.splice(lastC,0,c);return args}function log(){return\"object\"==typeof console&&\"function\"==typeof console.log&&Function.prototype.apply.call(console.log,console,arguments)}function save(namespaces){try{if(null==namespaces){localStorage.removeItem(\"debug\")}else{localStorage.debug=namespaces}}catch(e){}}function load(){var r;try{r=localStorage.debug}catch(e){}return r}exports.enable(load())},{\"./debug\":23}],23:[function(_dereq_,module,exports){exports=module.exports=debug;exports.coerce=coerce;exports.disable=disable;exports.enable=enable;exports.enabled=enabled;exports.humanize=_dereq_(\"ms\");exports.names=[];exports.skips=[];exports.formatters={};var prevColor=0;var prevTime;function selectColor(){return exports.colors[prevColor++%exports.colors.length]}function debug(namespace){function disabled(){}disabled.enabled=false;function enabled(){var self=enabled;var curr=+new Date;var ms=curr-(prevTime||curr);self.diff=ms;self.prev=prevTime;self.curr=curr;prevTime=curr;if(null==self.useColors)self.useColors=exports.useColors();if(null==self.color&&self.useColors)self.color=selectColor();var args=Array.prototype.slice.call(arguments);args[0]=exports.coerce(args[0]);if(\"string\"!==typeof args[0]){args=[\"%o\"].concat(args)}var index=0;args[0]=args[0].replace(/%([a-z%])/g,function(match,format){if(match===\"%%\")return match;index++;var formatter=exports.formatters[format];if(\"function\"===typeof formatter){var val=args[index];match=formatter.call(self,val);args.splice(index,1);index--}return match});if(\"function\"===typeof exports.formatArgs){args=exports.formatArgs.apply(self,args)}var logFn=enabled.log||exports.log||console.log.bind(console);logFn.apply(self,args)}enabled.enabled=true;var fn=exports.enabled(namespace)?enabled:disabled;fn.namespace=namespace;return fn}function enable(namespaces){exports.save(namespaces);var split=(namespaces||\"\").split(/[\\s,]+/);var len=split.length;for(var i=0;i<len;i++){if(!split[i])continue;namespaces=split[i].replace(/\\*/g,\".*?\");if(namespaces[0]===\"-\"){exports.skips.push(new RegExp(\"^\"+namespaces.substr(1)+\"$\"))}else{exports.names.push(new RegExp(\"^\"+namespaces+\"$\"))}}}function disable(){exports.enable(\"\")}function enabled(name){var i,len;for(i=0,len=exports.skips.length;i<len;i++){if(exports.skips[i].test(name)){return false}}for(i=0,len=exports.names.length;i<len;i++){if(exports.names[i].test(name)){return true}}return false}function coerce(val){if(val instanceof Error)return val.stack||val.message;return val}},{ms:24}],24:[function(_dereq_,module,exports){var s=1e3;var m=s*60;var h=m*60;var d=h*24;var y=d*365.25;module.exports=function(val,options){options=options||{};if(\"string\"==typeof val)return parse(val);return options.long?long(val):short(val)};function parse(str){var match=/^((?:\\d+)?\\.?\\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i.exec(str);if(!match)return;var n=parseFloat(match[1]);var type=(match[2]||\"ms\").toLowerCase();switch(type){case\"years\":case\"year\":case\"y\":return n*y;case\"days\":case\"day\":case\"d\":return n*d;case\"hours\":case\"hour\":case\"h\":return n*h;case\"minutes\":case\"minute\":case\"m\":return n*m;case\"seconds\":case\"second\":case\"s\":return n*s;case\"ms\":return n}}function short(ms){if(ms>=d)return Math.round(ms/d)+\"d\";if(ms>=h)return Math.round(ms/h)+\"h\";if(ms>=m)return Math.round(ms/m)+\"m\";if(ms>=s)return Math.round(ms/s)+\"s\";return ms+\"ms\"}function long(ms){return plural(ms,d,\"day\")||plural(ms,h,\"hour\")||plural(ms,m,\"minute\")||plural(ms,s,\"second\")||ms+\" ms\"}function plural(ms,n,name){if(ms<n)return;if(ms<n*1.5)return Math.floor(ms/n)+\" \"+name;return Math.ceil(ms/n)+\" \"+name+\"s\"}},{}],25:[function(_dereq_,module,exports){(function(global){var keys=_dereq_(\"./keys\");var hasBinary=_dereq_(\"has-binary\");var sliceBuffer=_dereq_(\"arraybuffer.slice\");var base64encoder=_dereq_(\"base64-arraybuffer\");var after=_dereq_(\"after\");var utf8=_dereq_(\"utf8\");var isAndroid=navigator.userAgent.match(/Android/i);var isPhantomJS=/PhantomJS/i.test(navigator.userAgent);var dontSendBlobs=isAndroid||isPhantomJS;exports.protocol=3;var packets=exports.packets={open:0,close:1,ping:2,pong:3,message:4,upgrade:5,noop:6};var packetslist=keys(packets);var err={type:\"error\",data:\"parser error\"};var Blob=_dereq_(\"blob\");exports.encodePacket=function(packet,supportsBinary,utf8encode,callback){if(\"function\"==typeof supportsBinary){callback=supportsBinary;supportsBinary=false}if(\"function\"==typeof utf8encode){callback=utf8encode;utf8encode=null}var data=packet.data===undefined?undefined:packet.data.buffer||packet.data;if(global.ArrayBuffer&&data instanceof ArrayBuffer){return encodeArrayBuffer(packet,supportsBinary,callback)}else if(Blob&&data instanceof global.Blob){return encodeBlob(packet,supportsBinary,callback)}if(data&&data.base64){return encodeBase64Object(packet,callback)}var encoded=packets[packet.type];if(undefined!==packet.data){encoded+=utf8encode?utf8.encode(String(packet.data)):String(packet.data)}return callback(\"\"+encoded)};function encodeBase64Object(packet,callback){var message=\"b\"+exports.packets[packet.type]+packet.data.data;return callback(message)}function encodeArrayBuffer(packet,supportsBinary,callback){if(!supportsBinary){return exports.encodeBase64Packet(packet,callback)}var data=packet.data;var contentArray=new Uint8Array(data);var resultBuffer=new Uint8Array(1+data.byteLength);resultBuffer[0]=packets[packet.type];for(var i=0;i<contentArray.length;i++){resultBuffer[i+1]=contentArray[i]}return callback(resultBuffer.buffer)}function encodeBlobAsArrayBuffer(packet,supportsBinary,callback){if(!supportsBinary){return exports.encodeBase64Packet(packet,callback)}var fr=new FileReader;fr.onload=function(){packet.data=fr.result;exports.encodePacket(packet,supportsBinary,true,callback)};return fr.readAsArrayBuffer(packet.data)}function encodeBlob(packet,supportsBinary,callback){if(!supportsBinary){return exports.encodeBase64Packet(packet,callback)}if(dontSendBlobs){return encodeBlobAsArrayBuffer(packet,supportsBinary,callback)}var length=new Uint8Array(1);length[0]=packets[packet.type];var blob=new Blob([length.buffer,packet.data]);return callback(blob)}exports.encodeBase64Packet=function(packet,callback){var message=\"b\"+exports.packets[packet.type];if(Blob&&packet.data instanceof Blob){var fr=new FileReader;fr.onload=function(){var b64=fr.result.split(\",\")[1];callback(message+b64)};return fr.readAsDataURL(packet.data)}var b64data;try{b64data=String.fromCharCode.apply(null,new Uint8Array(packet.data))}catch(e){var typed=new Uint8Array(packet.data);var basic=new Array(typed.length);for(var i=0;i<typed.length;i++){basic[i]=typed[i]}b64data=String.fromCharCode.apply(null,basic)}message+=global.btoa(b64data);return callback(message)};exports.decodePacket=function(data,binaryType,utf8decode){if(typeof data==\"string\"||data===undefined){if(data.charAt(0)==\"b\"){return exports.decodeBase64Packet(data.substr(1),binaryType)}if(utf8decode){try{data=utf8.decode(data)}catch(e){return err}}var type=data.charAt(0);if(Number(type)!=type||!packetslist[type]){return err}if(data.length>1){return{type:packetslist[type],data:data.substring(1)}}else{return{type:packetslist[type]}}}var asArray=new Uint8Array(data);var type=asArray[0];var rest=sliceBuffer(data,1);if(Blob&&binaryType===\"blob\"){rest=new Blob([rest])}return{type:packetslist[type],data:rest}};exports.decodeBase64Packet=function(msg,binaryType){var type=packetslist[msg.charAt(0)];if(!global.ArrayBuffer){return{type:type,data:{base64:true,data:msg.substr(1)}}}var data=base64encoder.decode(msg.substr(1));if(binaryType===\"blob\"&&Blob){data=new Blob([data])}return{type:type,data:data}};exports.encodePayload=function(packets,supportsBinary,callback){if(typeof supportsBinary==\"function\"){callback=supportsBinary;supportsBinary=null}var isBinary=hasBinary(packets);if(supportsBinary&&isBinary){if(Blob&&!dontSendBlobs){return exports.encodePayloadAsBlob(packets,callback)}return exports.encodePayloadAsArrayBuffer(packets,callback)}if(!packets.length){return callback(\"0:\")}function setLengthHeader(message){return message.length+\":\"+message}function encodeOne(packet,doneCallback){exports.encodePacket(packet,!isBinary?false:supportsBinary,true,function(message){doneCallback(null,setLengthHeader(message))})}map(packets,encodeOne,function(err,results){return callback(results.join(\"\"))})};function map(ary,each,done){var result=new Array(ary.length);var next=after(ary.length,done);var eachWithIndex=function(i,el,cb){each(el,function(error,msg){result[i]=msg;cb(error,result)})};for(var i=0;i<ary.length;i++){eachWithIndex(i,ary[i],next)}}exports.decodePayload=function(data,binaryType,callback){if(typeof data!=\"string\"){return exports.decodePayloadAsBinary(data,binaryType,callback)}if(typeof binaryType===\"function\"){callback=binaryType;binaryType=null}var packet;if(data==\"\"){return callback(err,0,1)}var length=\"\",n,msg;for(var i=0,l=data.length;i<l;i++){var chr=data.charAt(i);if(\":\"!=chr){length+=chr}else{if(\"\"==length||length!=(n=Number(length))){return callback(err,0,1)}msg=data.substr(i+1,n);if(length!=msg.length){return callback(err,0,1)}if(msg.length){packet=exports.decodePacket(msg,binaryType,true);if(err.type==packet.type&&err.data==packet.data){return callback(err,0,1)}var ret=callback(packet,i+n,l);if(false===ret)return}i+=n;length=\"\"}}if(length!=\"\"){return callback(err,0,1)}};exports.encodePayloadAsArrayBuffer=function(packets,callback){if(!packets.length){return callback(new ArrayBuffer(0))}function encodeOne(packet,doneCallback){exports.encodePacket(packet,true,true,function(data){return doneCallback(null,data)})}map(packets,encodeOne,function(err,encodedPackets){var totalLength=encodedPackets.reduce(function(acc,p){var len;if(typeof p===\"string\"){len=p.length}else{len=p.byteLength}return acc+len.toString().length+len+2},0);var resultArray=new Uint8Array(totalLength);var bufferIndex=0;encodedPackets.forEach(function(p){var isString=typeof p===\"string\";var ab=p;if(isString){var view=new Uint8Array(p.length);for(var i=0;i<p.length;i++){view[i]=p.charCodeAt(i)}ab=view.buffer}if(isString){resultArray[bufferIndex++]=0}else{resultArray[bufferIndex++]=1}var lenStr=ab.byteLength.toString();for(var i=0;i<lenStr.length;i++){resultArray[bufferIndex++]=parseInt(lenStr[i])}resultArray[bufferIndex++]=255;var view=new Uint8Array(ab);for(var i=0;i<view.length;i++){resultArray[bufferIndex++]=view[i]}});return callback(resultArray.buffer)})};exports.encodePayloadAsBlob=function(packets,callback){function encodeOne(packet,doneCallback){exports.encodePacket(packet,true,true,function(encoded){var binaryIdentifier=new Uint8Array(1);binaryIdentifier[0]=1;if(typeof encoded===\"string\"){var view=new Uint8Array(encoded.length);for(var i=0;i<encoded.length;i++){view[i]=encoded.charCodeAt(i)}encoded=view.buffer;binaryIdentifier[0]=0}var len=encoded instanceof ArrayBuffer?encoded.byteLength:encoded.size;var lenStr=len.toString();var lengthAry=new Uint8Array(lenStr.length+1);for(var i=0;i<lenStr.length;i++){lengthAry[i]=parseInt(lenStr[i])}lengthAry[lenStr.length]=255;if(Blob){var blob=new Blob([binaryIdentifier.buffer,lengthAry.buffer,encoded]);doneCallback(null,blob)}})}map(packets,encodeOne,function(err,results){return callback(new Blob(results))})};exports.decodePayloadAsBinary=function(data,binaryType,callback){if(typeof binaryType===\"function\"){callback=binaryType;binaryType=null}var bufferTail=data;var buffers=[];var numberTooLong=false;while(bufferTail.byteLength>0){var tailArray=new Uint8Array(bufferTail);var isString=tailArray[0]===0;var msgLength=\"\";for(var i=1;;i++){if(tailArray[i]==255)break;if(msgLength.length>310){numberTooLong=true;break}msgLength+=tailArray[i]}if(numberTooLong)return callback(err,0,1);bufferTail=sliceBuffer(bufferTail,2+msgLength.length);msgLength=parseInt(msgLength);var msg=sliceBuffer(bufferTail,0,msgLength);if(isString){try{msg=String.fromCharCode.apply(null,new Uint8Array(msg))}catch(e){var typed=new Uint8Array(msg);msg=\"\";for(var i=0;i<typed.length;i++){msg+=String.fromCharCode(typed[i])}}}buffers.push(msg);bufferTail=sliceBuffer(bufferTail,msgLength)}var total=buffers.length;buffers.forEach(function(buffer,i){callback(exports.decodePacket(buffer,binaryType,true),i,total)})}}).call(this,typeof self!==\"undefined\"?self:typeof window!==\"undefined\"?window:{})},{\"./keys\":26,after:27,\"arraybuffer.slice\":28,\"base64-arraybuffer\":29,blob:30,\"has-binary\":36,utf8:31}],26:[function(_dereq_,module,exports){module.exports=Object.keys||function keys(obj){var arr=[];var has=Object.prototype.hasOwnProperty;for(var i in obj){if(has.call(obj,i)){arr.push(i)}}return arr}},{}],27:[function(_dereq_,module,exports){module.exports=after;function after(count,callback,err_cb){var bail=false;err_cb=err_cb||noop;proxy.count=count;return count===0?callback():proxy;function proxy(err,result){if(proxy.count<=0){throw new Error(\"after called too many times\")}--proxy.count;if(err){bail=true;callback(err);callback=err_cb}else if(proxy.count===0&&!bail){callback(null,result)}}}function noop(){}},{}],28:[function(_dereq_,module,exports){module.exports=function(arraybuffer,start,end){var bytes=arraybuffer.byteLength;start=start||0;end=end||bytes;if(arraybuffer.slice){return arraybuffer.slice(start,end)}if(start<0){start+=bytes}if(end<0){end+=bytes}if(end>bytes){end=bytes}if(start>=bytes||start>=end||bytes===0){return new ArrayBuffer(0)}var abv=new Uint8Array(arraybuffer);var result=new Uint8Array(end-start);for(var i=start,ii=0;i<end;i++,ii++){result[ii]=abv[i]}return result.buffer}},{}],29:[function(_dereq_,module,exports){(function(chars){\"use strict\";exports.encode=function(arraybuffer){var bytes=new Uint8Array(arraybuffer),i,len=bytes.length,base64=\"\";for(i=0;i<len;i+=3){base64+=chars[bytes[i]>>2];base64+=chars[(bytes[i]&3)<<4|bytes[i+1]>>4];base64+=chars[(bytes[i+1]&15)<<2|bytes[i+2]>>6];base64+=chars[bytes[i+2]&63]}if(len%3===2){base64=base64.substring(0,base64.length-1)+\"=\"}else if(len%3===1){base64=base64.substring(0,base64.length-2)+\"==\"}return base64};exports.decode=function(base64){var bufferLength=base64.length*.75,len=base64.length,i,p=0,encoded1,encoded2,encoded3,encoded4;if(base64[base64.length-1]===\"=\"){bufferLength--;if(base64[base64.length-2]===\"=\"){bufferLength--}}var arraybuffer=new ArrayBuffer(bufferLength),bytes=new Uint8Array(arraybuffer);for(i=0;i<len;i+=4){encoded1=chars.indexOf(base64[i]);encoded2=chars.indexOf(base64[i+1]);encoded3=chars.indexOf(base64[i+2]);encoded4=chars.indexOf(base64[i+3]);bytes[p++]=encoded1<<2|encoded2>>4;bytes[p++]=(encoded2&15)<<4|encoded3>>2;bytes[p++]=(encoded3&3)<<6|encoded4&63}return arraybuffer}})(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\")},{}],30:[function(_dereq_,module,exports){(function(global){var BlobBuilder=global.BlobBuilder||global.WebKitBlobBuilder||global.MSBlobBuilder||global.MozBlobBuilder;var blobSupported=function(){try{var a=new Blob([\"hi\"]);return a.size===2}catch(e){return false}}();var blobSupportsArrayBufferView=blobSupported&&function(){try{var b=new Blob([new Uint8Array([1,2])]);return b.size===2}catch(e){return false}}();var blobBuilderSupported=BlobBuilder&&BlobBuilder.prototype.append&&BlobBuilder.prototype.getBlob;function mapArrayBufferViews(ary){for(var i=0;i<ary.length;i++){var chunk=ary[i];if(chunk.buffer instanceof ArrayBuffer){var buf=chunk.buffer;if(chunk.byteLength!==buf.byteLength){var copy=new Uint8Array(chunk.byteLength);copy.set(new Uint8Array(buf,chunk.byteOffset,chunk.byteLength));buf=copy.buffer}ary[i]=buf}}}function BlobBuilderConstructor(ary,options){options=options||{};var bb=new BlobBuilder;mapArrayBufferViews(ary);for(var i=0;i<ary.length;i++){bb.append(ary[i])}return options.type?bb.getBlob(options.type):bb.getBlob()}function BlobConstructor(ary,options){mapArrayBufferViews(ary);return new Blob(ary,options||{})}module.exports=function(){if(blobSupported){return blobSupportsArrayBufferView?global.Blob:BlobConstructor}else if(blobBuilderSupported){return BlobBuilderConstructor}else{return undefined}}()}).call(this,typeof self!==\"undefined\"?self:typeof window!==\"undefined\"?window:{})},{}],31:[function(_dereq_,module,exports){(function(global){(function(root){var freeExports=typeof exports==\"object\"&&exports;var freeModule=typeof module==\"object\"&&module&&module.exports==freeExports&&module;var freeGlobal=typeof global==\"object\"&&global;if(freeGlobal.global===freeGlobal||freeGlobal.window===freeGlobal){root=freeGlobal}var stringFromCharCode=String.fromCharCode;function ucs2decode(string){var output=[];var counter=0;var length=string.length;var value;var extra;while(counter<length){value=string.charCodeAt(counter++);if(value>=55296&&value<=56319&&counter<length){extra=string.charCodeAt(counter++);if((extra&64512)==56320){output.push(((value&1023)<<10)+(extra&1023)+65536)}else{output.push(value);counter--}}else{output.push(value)}}return output}function ucs2encode(array){var length=array.length;var index=-1;var value;var output=\"\";while(++index<length){value=array[index];if(value>65535){value-=65536;output+=stringFromCharCode(value>>>10&1023|55296);value=56320|value&1023}output+=stringFromCharCode(value)}return output}function checkScalarValue(codePoint){if(codePoint>=55296&&codePoint<=57343){throw Error(\"Lone surrogate U+\"+codePoint.toString(16).toUpperCase()+\" is not a scalar value\")\n}}function createByte(codePoint,shift){return stringFromCharCode(codePoint>>shift&63|128)}function encodeCodePoint(codePoint){if((codePoint&4294967168)==0){return stringFromCharCode(codePoint)}var symbol=\"\";if((codePoint&4294965248)==0){symbol=stringFromCharCode(codePoint>>6&31|192)}else if((codePoint&4294901760)==0){checkScalarValue(codePoint);symbol=stringFromCharCode(codePoint>>12&15|224);symbol+=createByte(codePoint,6)}else if((codePoint&4292870144)==0){symbol=stringFromCharCode(codePoint>>18&7|240);symbol+=createByte(codePoint,12);symbol+=createByte(codePoint,6)}symbol+=stringFromCharCode(codePoint&63|128);return symbol}function utf8encode(string){var codePoints=ucs2decode(string);var length=codePoints.length;var index=-1;var codePoint;var byteString=\"\";while(++index<length){codePoint=codePoints[index];byteString+=encodeCodePoint(codePoint)}return byteString}function readContinuationByte(){if(byteIndex>=byteCount){throw Error(\"Invalid byte index\")}var continuationByte=byteArray[byteIndex]&255;byteIndex++;if((continuationByte&192)==128){return continuationByte&63}throw Error(\"Invalid continuation byte\")}function decodeSymbol(){var byte1;var byte2;var byte3;var byte4;var codePoint;if(byteIndex>byteCount){throw Error(\"Invalid byte index\")}if(byteIndex==byteCount){return false}byte1=byteArray[byteIndex]&255;byteIndex++;if((byte1&128)==0){return byte1}if((byte1&224)==192){var byte2=readContinuationByte();codePoint=(byte1&31)<<6|byte2;if(codePoint>=128){return codePoint}else{throw Error(\"Invalid continuation byte\")}}if((byte1&240)==224){byte2=readContinuationByte();byte3=readContinuationByte();codePoint=(byte1&15)<<12|byte2<<6|byte3;if(codePoint>=2048){checkScalarValue(codePoint);return codePoint}else{throw Error(\"Invalid continuation byte\")}}if((byte1&248)==240){byte2=readContinuationByte();byte3=readContinuationByte();byte4=readContinuationByte();codePoint=(byte1&15)<<18|byte2<<12|byte3<<6|byte4;if(codePoint>=65536&&codePoint<=1114111){return codePoint}}throw Error(\"Invalid UTF-8 detected\")}var byteArray;var byteCount;var byteIndex;function utf8decode(byteString){byteArray=ucs2decode(byteString);byteCount=byteArray.length;byteIndex=0;var codePoints=[];var tmp;while((tmp=decodeSymbol())!==false){codePoints.push(tmp)}return ucs2encode(codePoints)}var utf8={version:\"2.0.0\",encode:utf8encode,decode:utf8decode};if(typeof define==\"function\"&&typeof define.amd==\"object\"&&define.amd){define(function(){return utf8})}else if(freeExports&&!freeExports.nodeType){if(freeModule){freeModule.exports=utf8}else{var object={};var hasOwnProperty=object.hasOwnProperty;for(var key in utf8){hasOwnProperty.call(utf8,key)&&(freeExports[key]=utf8[key])}}}else{root.utf8=utf8}})(this)}).call(this,typeof self!==\"undefined\"?self:typeof window!==\"undefined\"?window:{})},{}],32:[function(_dereq_,module,exports){(function(global){var rvalidchars=/^[\\],:{}\\s]*$/;var rvalidescape=/\\\\(?:[\"\\\\\\/bfnrt]|u[0-9a-fA-F]{4})/g;var rvalidtokens=/\"[^\"\\\\\\n\\r]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?/g;var rvalidbraces=/(?:^|:|,)(?:\\s*\\[)+/g;var rtrimLeft=/^\\s+/;var rtrimRight=/\\s+$/;module.exports=function parsejson(data){if(\"string\"!=typeof data||!data){return null}data=data.replace(rtrimLeft,\"\").replace(rtrimRight,\"\");if(global.JSON&&JSON.parse){return JSON.parse(data)}if(rvalidchars.test(data.replace(rvalidescape,\"@\").replace(rvalidtokens,\"]\").replace(rvalidbraces,\"\"))){return new Function(\"return \"+data)()}}}).call(this,typeof self!==\"undefined\"?self:typeof window!==\"undefined\"?window:{})},{}],33:[function(_dereq_,module,exports){exports.encode=function(obj){var str=\"\";for(var i in obj){if(obj.hasOwnProperty(i)){if(str.length)str+=\"&\";str+=encodeURIComponent(i)+\"=\"+encodeURIComponent(obj[i])}}return str};exports.decode=function(qs){var qry={};var pairs=qs.split(\"&\");for(var i=0,l=pairs.length;i<l;i++){var pair=pairs[i].split(\"=\");qry[decodeURIComponent(pair[0])]=decodeURIComponent(pair[1])}return qry}},{}],34:[function(_dereq_,module,exports){var re=/^(?:(?![^:@]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;var parts=[\"source\",\"protocol\",\"authority\",\"userInfo\",\"user\",\"password\",\"host\",\"port\",\"relative\",\"path\",\"directory\",\"file\",\"query\",\"anchor\"];module.exports=function parseuri(str){var src=str,b=str.indexOf(\"[\"),e=str.indexOf(\"]\");if(b!=-1&&e!=-1){str=str.substring(0,b)+str.substring(b,e).replace(/:/g,\";\")+str.substring(e,str.length)}var m=re.exec(str||\"\"),uri={},i=14;while(i--){uri[parts[i]]=m[i]||\"\"}if(b!=-1&&e!=-1){uri.source=src;uri.host=uri.host.substring(1,uri.host.length-1).replace(/;/g,\":\");uri.authority=uri.authority.replace(\"[\",\"\").replace(\"]\",\"\").replace(/;/g,\":\");uri.ipv6uri=true}return uri}},{}],35:[function(_dereq_,module,exports){var global=function(){return this}();var WebSocket=global.WebSocket||global.MozWebSocket;module.exports=WebSocket?ws:null;function ws(uri,protocols,opts){var instance;if(protocols){instance=new WebSocket(uri,protocols)}else{instance=new WebSocket(uri)}return instance}if(WebSocket)ws.prototype=WebSocket.prototype},{}],36:[function(_dereq_,module,exports){(function(global){var isArray=_dereq_(\"isarray\");module.exports=hasBinary;function hasBinary(data){function _hasBinary(obj){if(!obj)return false;if(global.Buffer&&global.Buffer.isBuffer(obj)||global.ArrayBuffer&&obj instanceof ArrayBuffer||global.Blob&&obj instanceof Blob||global.File&&obj instanceof File){return true}if(isArray(obj)){for(var i=0;i<obj.length;i++){if(_hasBinary(obj[i])){return true}}}else if(obj&&\"object\"==typeof obj){if(obj.toJSON){obj=obj.toJSON()}for(var key in obj){if(Object.prototype.hasOwnProperty.call(obj,key)&&_hasBinary(obj[key])){return true}}}return false}return _hasBinary(data)}}).call(this,typeof self!==\"undefined\"?self:typeof window!==\"undefined\"?window:{})},{isarray:37}],37:[function(_dereq_,module,exports){module.exports=Array.isArray||function(arr){return Object.prototype.toString.call(arr)==\"[object Array]\"}},{}],38:[function(_dereq_,module,exports){var global=_dereq_(\"global\");try{module.exports=\"XMLHttpRequest\"in global&&\"withCredentials\"in new global.XMLHttpRequest}catch(err){module.exports=false}},{global:39}],39:[function(_dereq_,module,exports){module.exports=function(){return this}()},{}],40:[function(_dereq_,module,exports){var indexOf=[].indexOf;module.exports=function(arr,obj){if(indexOf)return arr.indexOf(obj);for(var i=0;i<arr.length;++i){if(arr[i]===obj)return i}return-1}},{}],41:[function(_dereq_,module,exports){var has=Object.prototype.hasOwnProperty;exports.keys=Object.keys||function(obj){var keys=[];for(var key in obj){if(has.call(obj,key)){keys.push(key)}}return keys};exports.values=function(obj){var vals=[];for(var key in obj){if(has.call(obj,key)){vals.push(obj[key])}}return vals};exports.merge=function(a,b){for(var key in b){if(has.call(b,key)){a[key]=b[key]}}return a};exports.length=function(obj){return exports.keys(obj).length};exports.isEmpty=function(obj){return 0==exports.length(obj)}},{}],42:[function(_dereq_,module,exports){var re=/^(?:(?![^:@]+:[^:@\\/]*@)(http|https|ws|wss):\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/;var parts=[\"source\",\"protocol\",\"authority\",\"userInfo\",\"user\",\"password\",\"host\",\"port\",\"relative\",\"path\",\"directory\",\"file\",\"query\",\"anchor\"];module.exports=function parseuri(str){var m=re.exec(str||\"\"),uri={},i=14;while(i--){uri[parts[i]]=m[i]||\"\"}return uri}},{}],43:[function(_dereq_,module,exports){(function(global){var isArray=_dereq_(\"isarray\");var isBuf=_dereq_(\"./is-buffer\");exports.deconstructPacket=function(packet){var buffers=[];var packetData=packet.data;function _deconstructPacket(data){if(!data)return data;if(isBuf(data)){var placeholder={_placeholder:true,num:buffers.length};buffers.push(data);return placeholder}else if(isArray(data)){var newData=new Array(data.length);for(var i=0;i<data.length;i++){newData[i]=_deconstructPacket(data[i])}return newData}else if(\"object\"==typeof data&&!(data instanceof Date)){var newData={};for(var key in data){newData[key]=_deconstructPacket(data[key])}return newData}return data}var pack=packet;pack.data=_deconstructPacket(packetData);pack.attachments=buffers.length;return{packet:pack,buffers:buffers}};exports.reconstructPacket=function(packet,buffers){var curPlaceHolder=0;function _reconstructPacket(data){if(data&&data._placeholder){var buf=buffers[data.num];return buf}else if(isArray(data)){for(var i=0;i<data.length;i++){data[i]=_reconstructPacket(data[i])}return data}else if(data&&\"object\"==typeof data){for(var key in data){data[key]=_reconstructPacket(data[key])}return data}return data}packet.data=_reconstructPacket(packet.data);packet.attachments=undefined;return packet};exports.removeBlobs=function(data,callback){function _removeBlobs(obj,curKey,containingObject){if(!obj)return obj;if(global.Blob&&obj instanceof Blob||global.File&&obj instanceof File){pendingBlobs++;var fileReader=new FileReader;fileReader.onload=function(){if(containingObject){containingObject[curKey]=this.result}else{bloblessData=this.result}if(!--pendingBlobs){callback(bloblessData)}};fileReader.readAsArrayBuffer(obj)}else if(isArray(obj)){for(var i=0;i<obj.length;i++){_removeBlobs(obj[i],i,obj)}}else if(obj&&\"object\"==typeof obj&&!isBuf(obj)){for(var key in obj){_removeBlobs(obj[key],key,obj)}}}var pendingBlobs=0;var bloblessData=data;_removeBlobs(bloblessData);if(!pendingBlobs){callback(bloblessData)}}}).call(this,typeof self!==\"undefined\"?self:typeof window!==\"undefined\"?window:{})},{\"./is-buffer\":45,isarray:46}],44:[function(_dereq_,module,exports){var debug=_dereq_(\"debug\")(\"socket.io-parser\");var json=_dereq_(\"json3\");var isArray=_dereq_(\"isarray\");var Emitter=_dereq_(\"component-emitter\");var binary=_dereq_(\"./binary\");var isBuf=_dereq_(\"./is-buffer\");exports.protocol=4;exports.types=[\"CONNECT\",\"DISCONNECT\",\"EVENT\",\"BINARY_EVENT\",\"ACK\",\"BINARY_ACK\",\"ERROR\"];exports.CONNECT=0;exports.DISCONNECT=1;exports.EVENT=2;exports.ACK=3;exports.ERROR=4;exports.BINARY_EVENT=5;exports.BINARY_ACK=6;exports.Encoder=Encoder;exports.Decoder=Decoder;function Encoder(){}Encoder.prototype.encode=function(obj,callback){debug(\"encoding packet %j\",obj);if(exports.BINARY_EVENT==obj.type||exports.BINARY_ACK==obj.type){encodeAsBinary(obj,callback)}else{var encoding=encodeAsString(obj);callback([encoding])}};function encodeAsString(obj){var str=\"\";var nsp=false;str+=obj.type;if(exports.BINARY_EVENT==obj.type||exports.BINARY_ACK==obj.type){str+=obj.attachments;str+=\"-\"}if(obj.nsp&&\"/\"!=obj.nsp){nsp=true;str+=obj.nsp}if(null!=obj.id){if(nsp){str+=\",\";nsp=false}str+=obj.id}if(null!=obj.data){if(nsp)str+=\",\";str+=json.stringify(obj.data)}debug(\"encoded %j as %s\",obj,str);return str}function encodeAsBinary(obj,callback){function writeEncoding(bloblessData){var deconstruction=binary.deconstructPacket(bloblessData);var pack=encodeAsString(deconstruction.packet);var buffers=deconstruction.buffers;buffers.unshift(pack);callback(buffers)}binary.removeBlobs(obj,writeEncoding)}function Decoder(){this.reconstructor=null}Emitter(Decoder.prototype);Decoder.prototype.add=function(obj){var packet;if(\"string\"==typeof obj){packet=decodeString(obj);if(exports.BINARY_EVENT==packet.type||exports.BINARY_ACK==packet.type){this.reconstructor=new BinaryReconstructor(packet);if(this.reconstructor.reconPack.attachments===0){this.emit(\"decoded\",packet)}}else{this.emit(\"decoded\",packet)}}else if(isBuf(obj)||obj.base64){if(!this.reconstructor){throw new Error(\"got binary data when not reconstructing a packet\")}else{packet=this.reconstructor.takeBinaryData(obj);if(packet){this.reconstructor=null;this.emit(\"decoded\",packet)}}}else{throw new Error(\"Unknown type: \"+obj)}};function decodeString(str){var p={};var i=0;p.type=Number(str.charAt(0));if(null==exports.types[p.type])return error();if(exports.BINARY_EVENT==p.type||exports.BINARY_ACK==p.type){var buf=\"\";while(str.charAt(++i)!=\"-\"){buf+=str.charAt(i);if(i==str.length)break}if(buf!=Number(buf)||str.charAt(i)!=\"-\"){throw new Error(\"Illegal attachments\")}p.attachments=Number(buf)}if(\"/\"==str.charAt(i+1)){p.nsp=\"\";while(++i){var c=str.charAt(i);if(\",\"==c)break;p.nsp+=c;if(i==str.length)break}}else{p.nsp=\"/\"}var next=str.charAt(i+1);if(\"\"!==next&&Number(next)==next){p.id=\"\";while(++i){var c=str.charAt(i);if(null==c||Number(c)!=c){--i;break}p.id+=str.charAt(i);if(i==str.length)break}p.id=Number(p.id)}if(str.charAt(++i)){try{p.data=json.parse(str.substr(i))}catch(e){return error()}}debug(\"decoded %s as %j\",str,p);return p}Decoder.prototype.destroy=function(){if(this.reconstructor){this.reconstructor.finishedReconstruction()}};function BinaryReconstructor(packet){this.reconPack=packet;this.buffers=[]}BinaryReconstructor.prototype.takeBinaryData=function(binData){this.buffers.push(binData);if(this.buffers.length==this.reconPack.attachments){var packet=binary.reconstructPacket(this.reconPack,this.buffers);this.finishedReconstruction();return packet}return null};BinaryReconstructor.prototype.finishedReconstruction=function(){this.reconPack=null;this.buffers=[]};function error(data){return{type:exports.ERROR,data:\"parser error\"}}},{\"./binary\":43,\"./is-buffer\":45,\"component-emitter\":9,debug:10,isarray:46,json3:47}],45:[function(_dereq_,module,exports){(function(global){module.exports=isBuf;function isBuf(obj){return global.Buffer&&global.Buffer.isBuffer(obj)||global.ArrayBuffer&&obj instanceof ArrayBuffer}}).call(this,typeof self!==\"undefined\"?self:typeof window!==\"undefined\"?window:{})},{}],46:[function(_dereq_,module,exports){module.exports=_dereq_(37)},{}],47:[function(_dereq_,module,exports){(function(window){var getClass={}.toString,isProperty,forEach,undef;var isLoader=typeof define===\"function\"&&define.amd;var nativeJSON=typeof JSON==\"object\"&&JSON;var JSON3=typeof exports==\"object\"&&exports&&!exports.nodeType&&exports;if(JSON3&&nativeJSON){JSON3.stringify=nativeJSON.stringify;JSON3.parse=nativeJSON.parse}else{JSON3=window.JSON=nativeJSON||{}}var isExtended=new Date(-0xc782b5b800cec);try{isExtended=isExtended.getUTCFullYear()==-109252&&isExtended.getUTCMonth()===0&&isExtended.getUTCDate()===1&&isExtended.getUTCHours()==10&&isExtended.getUTCMinutes()==37&&isExtended.getUTCSeconds()==6&&isExtended.getUTCMilliseconds()==708}catch(exception){}function has(name){if(has[name]!==undef){return has[name]}var isSupported;if(name==\"bug-string-char-index\"){isSupported=\"a\"[0]!=\"a\"}else if(name==\"json\"){isSupported=has(\"json-stringify\")&&has(\"json-parse\")}else{var value,serialized='{\"a\":[1,true,false,null,\"\\\\u0000\\\\b\\\\n\\\\f\\\\r\\\\t\"]}';if(name==\"json-stringify\"){var stringify=JSON3.stringify,stringifySupported=typeof stringify==\"function\"&&isExtended;if(stringifySupported){(value=function(){return 1}).toJSON=value;try{stringifySupported=stringify(0)===\"0\"&&stringify(new Number)===\"0\"&&stringify(new String)=='\"\"'&&stringify(getClass)===undef&&stringify(undef)===undef&&stringify()===undef&&stringify(value)===\"1\"&&stringify([value])==\"[1]\"&&stringify([undef])==\"[null]\"&&stringify(null)==\"null\"&&stringify([undef,getClass,null])==\"[null,null,null]\"&&stringify({a:[value,true,false,null,\"\\x00\\b\\n\\f\\r\t\"]})==serialized&&stringify(null,value)===\"1\"&&stringify([1,2],null,1)==\"[\\n 1,\\n 2\\n]\"&&stringify(new Date(-864e13))=='\"-271821-04-20T00:00:00.000Z\"'&&stringify(new Date(864e13))=='\"+275760-09-13T00:00:00.000Z\"'&&stringify(new Date(-621987552e5))=='\"-000001-01-01T00:00:00.000Z\"'&&stringify(new Date(-1))=='\"1969-12-31T23:59:59.999Z\"'}catch(exception){stringifySupported=false}}isSupported=stringifySupported}if(name==\"json-parse\"){var parse=JSON3.parse;if(typeof parse==\"function\"){try{if(parse(\"0\")===0&&!parse(false)){value=parse(serialized);var parseSupported=value[\"a\"].length==5&&value[\"a\"][0]===1;if(parseSupported){try{parseSupported=!parse('\"\t\"')}catch(exception){}if(parseSupported){try{parseSupported=parse(\"01\")!==1}catch(exception){}}if(parseSupported){try{parseSupported=parse(\"1.\")!==1}catch(exception){}}}}}catch(exception){parseSupported=false}}isSupported=parseSupported}}return has[name]=!!isSupported}if(!has(\"json\")){var functionClass=\"[object Function]\";var dateClass=\"[object Date]\";var numberClass=\"[object Number]\";var stringClass=\"[object String]\";var arrayClass=\"[object Array]\";var booleanClass=\"[object Boolean]\";var charIndexBuggy=has(\"bug-string-char-index\");if(!isExtended){var floor=Math.floor;var Months=[0,31,59,90,120,151,181,212,243,273,304,334];var getDay=function(year,month){return Months[month]+365*(year-1970)+floor((year-1969+(month=+(month>1)))/4)-floor((year-1901+month)/100)+floor((year-1601+month)/400)}}if(!(isProperty={}.hasOwnProperty)){isProperty=function(property){var members={},constructor;if((members.__proto__=null,members.__proto__={toString:1},members).toString!=getClass){isProperty=function(property){var original=this.__proto__,result=property in(this.__proto__=null,this);this.__proto__=original;return result}}else{constructor=members.constructor;isProperty=function(property){var parent=(this.constructor||constructor).prototype;return property in this&&!(property in parent&&this[property]===parent[property])}}members=null;return isProperty.call(this,property)}}var PrimitiveTypes={\"boolean\":1,number:1,string:1,undefined:1};var isHostType=function(object,property){var type=typeof object[property];return type==\"object\"?!!object[property]:!PrimitiveTypes[type]};forEach=function(object,callback){var size=0,Properties,members,property;(Properties=function(){this.valueOf=0}).prototype.valueOf=0;members=new Properties;for(property in members){if(isProperty.call(members,property)){size++}}Properties=members=null;if(!size){members=[\"valueOf\",\"toString\",\"toLocaleString\",\"propertyIsEnumerable\",\"isPrototypeOf\",\"hasOwnProperty\",\"constructor\"];forEach=function(object,callback){var isFunction=getClass.call(object)==functionClass,property,length;var hasProperty=!isFunction&&typeof object.constructor!=\"function\"&&isHostType(object,\"hasOwnProperty\")?object.hasOwnProperty:isProperty;for(property in object){if(!(isFunction&&property==\"prototype\")&&hasProperty.call(object,property)){callback(property)}}for(length=members.length;property=members[--length];hasProperty.call(object,property)&&callback(property));}}else if(size==2){forEach=function(object,callback){var members={},isFunction=getClass.call(object)==functionClass,property;for(property in object){if(!(isFunction&&property==\"prototype\")&&!isProperty.call(members,property)&&(members[property]=1)&&isProperty.call(object,property)){callback(property)}}}}else{forEach=function(object,callback){var isFunction=getClass.call(object)==functionClass,property,isConstructor;for(property in object){if(!(isFunction&&property==\"prototype\")&&isProperty.call(object,property)&&!(isConstructor=property===\"constructor\")){callback(property)}}if(isConstructor||isProperty.call(object,property=\"constructor\")){callback(property)}}}return forEach(object,callback)};if(!has(\"json-stringify\")){var Escapes={92:\"\\\\\\\\\",34:'\\\\\"',8:\"\\\\b\",12:\"\\\\f\",10:\"\\\\n\",13:\"\\\\r\",9:\"\\\\t\"};var leadingZeroes=\"000000\";var toPaddedString=function(width,value){return(leadingZeroes+(value||0)).slice(-width)};var unicodePrefix=\"\\\\u00\";var quote=function(value){var result='\"',index=0,length=value.length,isLarge=length>10&&charIndexBuggy,symbols;if(isLarge){symbols=value.split(\"\")}for(;index<length;index++){var charCode=value.charCodeAt(index);switch(charCode){case 8:case 9:case 10:case 12:case 13:case 34:case 92:result+=Escapes[charCode];break;default:if(charCode<32){result+=unicodePrefix+toPaddedString(2,charCode.toString(16));break}result+=isLarge?symbols[index]:charIndexBuggy?value.charAt(index):value[index]}}return result+'\"'};var serialize=function(property,object,callback,properties,whitespace,indentation,stack){var value,className,year,month,date,time,hours,minutes,seconds,milliseconds,results,element,index,length,prefix,result;try{value=object[property]}catch(exception){}if(typeof value==\"object\"&&value){className=getClass.call(value);if(className==dateClass&&!isProperty.call(value,\"toJSON\")){if(value>-1/0&&value<1/0){if(getDay){date=floor(value/864e5);for(year=floor(date/365.2425)+1970-1;getDay(year+1,0)<=date;year++);for(month=floor((date-getDay(year,0))/30.42);getDay(year,month+1)<=date;month++);date=1+date-getDay(year,month);time=(value%864e5+864e5)%864e5;hours=floor(time/36e5)%24;minutes=floor(time/6e4)%60;seconds=floor(time/1e3)%60;milliseconds=time%1e3}else{year=value.getUTCFullYear();month=value.getUTCMonth();date=value.getUTCDate();hours=value.getUTCHours();minutes=value.getUTCMinutes();seconds=value.getUTCSeconds();milliseconds=value.getUTCMilliseconds()}value=(year<=0||year>=1e4?(year<0?\"-\":\"+\")+toPaddedString(6,year<0?-year:year):toPaddedString(4,year))+\"-\"+toPaddedString(2,month+1)+\"-\"+toPaddedString(2,date)+\"T\"+toPaddedString(2,hours)+\":\"+toPaddedString(2,minutes)+\":\"+toPaddedString(2,seconds)+\".\"+toPaddedString(3,milliseconds)+\"Z\"}else{value=null}}else if(typeof value.toJSON==\"function\"&&(className!=numberClass&&className!=stringClass&&className!=arrayClass||isProperty.call(value,\"toJSON\"))){value=value.toJSON(property)}}if(callback){value=callback.call(object,property,value)}if(value===null){return\"null\"}className=getClass.call(value);if(className==booleanClass){return\"\"+value}else if(className==numberClass){return value>-1/0&&value<1/0?\"\"+value:\"null\"}else if(className==stringClass){return quote(\"\"+value)}if(typeof value==\"object\"){for(length=stack.length;length--;){if(stack[length]===value){throw TypeError()}}stack.push(value);results=[];prefix=indentation;indentation+=whitespace;if(className==arrayClass){for(index=0,length=value.length;index<length;index++){element=serialize(index,value,callback,properties,whitespace,indentation,stack);results.push(element===undef?\"null\":element)}result=results.length?whitespace?\"[\\n\"+indentation+results.join(\",\\n\"+indentation)+\"\\n\"+prefix+\"]\":\"[\"+results.join(\",\")+\"]\":\"[]\"}else{forEach(properties||value,function(property){var element=serialize(property,value,callback,properties,whitespace,indentation,stack);if(element!==undef){results.push(quote(property)+\":\"+(whitespace?\" \":\"\")+element)}});result=results.length?whitespace?\"{\\n\"+indentation+results.join(\",\\n\"+indentation)+\"\\n\"+prefix+\"}\":\"{\"+results.join(\",\")+\"}\":\"{}\"}stack.pop();return result}};JSON3.stringify=function(source,filter,width){var whitespace,callback,properties,className;if(typeof filter==\"function\"||typeof filter==\"object\"&&filter){if((className=getClass.call(filter))==functionClass){callback=filter}else if(className==arrayClass){properties={};for(var index=0,length=filter.length,value;index<length;value=filter[index++],(className=getClass.call(value),className==stringClass||className==numberClass)&&(properties[value]=1));}}if(width){if((className=getClass.call(width))==numberClass){if((width-=width%1)>0){for(whitespace=\"\",width>10&&(width=10);whitespace.length<width;whitespace+=\" \");}}else if(className==stringClass){whitespace=width.length<=10?width:width.slice(0,10)}}return serialize(\"\",(value={},value[\"\"]=source,value),callback,properties,whitespace,\"\",[])}}if(!has(\"json-parse\")){var fromCharCode=String.fromCharCode;var Unescapes={92:\"\\\\\",34:'\"',47:\"/\",98:\"\\b\",116:\"\t\",110:\"\\n\",102:\"\\f\",114:\"\\r\"};var Index,Source;var abort=function(){Index=Source=null;throw SyntaxError()};var lex=function(){var source=Source,length=source.length,value,begin,position,isSigned,charCode;while(Index<length){charCode=source.charCodeAt(Index);switch(charCode){case 9:case 10:case 13:case 32:Index++;break;case 123:case 125:case 91:case 93:case 58:case 44:value=charIndexBuggy?source.charAt(Index):source[Index];Index++;return value;case 34:for(value=\"@\",Index++;Index<length;){charCode=source.charCodeAt(Index);if(charCode<32){abort()}else if(charCode==92){charCode=source.charCodeAt(++Index);switch(charCode){case 92:case 34:case 47:case 98:case 116:case 110:case 102:case 114:value+=Unescapes[charCode];Index++;break;case 117:begin=++Index;for(position=Index+4;Index<position;Index++){charCode=source.charCodeAt(Index);if(!(charCode>=48&&charCode<=57||charCode>=97&&charCode<=102||charCode>=65&&charCode<=70)){abort()}}value+=fromCharCode(\"0x\"+source.slice(begin,Index));break;default:abort()}}else{if(charCode==34){break}charCode=source.charCodeAt(Index);begin=Index;while(charCode>=32&&charCode!=92&&charCode!=34){charCode=source.charCodeAt(++Index)}value+=source.slice(begin,Index)}}if(source.charCodeAt(Index)==34){Index++;return value}abort();default:begin=Index;if(charCode==45){isSigned=true;charCode=source.charCodeAt(++Index)}if(charCode>=48&&charCode<=57){if(charCode==48&&(charCode=source.charCodeAt(Index+1),charCode>=48&&charCode<=57)){abort()}isSigned=false;for(;Index<length&&(charCode=source.charCodeAt(Index),charCode>=48&&charCode<=57);Index++);if(source.charCodeAt(Index)==46){position=++Index;for(;position<length&&(charCode=source.charCodeAt(position),charCode>=48&&charCode<=57);position++);if(position==Index){abort()}Index=position}charCode=source.charCodeAt(Index);if(charCode==101||charCode==69){charCode=source.charCodeAt(++Index);if(charCode==43||charCode==45){Index++}for(position=Index;position<length&&(charCode=source.charCodeAt(position),charCode>=48&&charCode<=57);position++);if(position==Index){abort()}Index=position}return+source.slice(begin,Index)}if(isSigned){abort()}if(source.slice(Index,Index+4)==\"true\"){Index+=4;return true}else if(source.slice(Index,Index+5)==\"false\"){Index+=5;return false}else if(source.slice(Index,Index+4)==\"null\"){Index+=4;return null}abort()}}return\"$\"};var get=function(value){var results,hasMembers;if(value==\"$\"){abort()}if(typeof value==\"string\"){if((charIndexBuggy?value.charAt(0):value[0])==\"@\"){return value.slice(1)}if(value==\"[\"){results=[];for(;;hasMembers||(hasMembers=true)){value=lex();if(value==\"]\"){break}if(hasMembers){if(value==\",\"){value=lex();if(value==\"]\"){abort()}}else{abort()}}if(value==\",\"){abort()}results.push(get(value))}return results}else if(value==\"{\"){results={};for(;;hasMembers||(hasMembers=true)){value=lex();if(value==\"}\"){break}if(hasMembers){if(value==\",\"){value=lex();if(value==\"}\"){abort()}}else{abort()}}if(value==\",\"||typeof value!=\"string\"||(charIndexBuggy?value.charAt(0):value[0])!=\"@\"||lex()!=\":\"){abort()}results[value.slice(1)]=get(lex())}return results}abort()}return value};var update=function(source,property,callback){var element=walk(source,property,callback);if(element===undef){delete source[property]}else{source[property]=element}};var walk=function(source,property,callback){var value=source[property],length;if(typeof value==\"object\"&&value){if(getClass.call(value)==arrayClass){for(length=value.length;length--;){update(value,length,callback)}}else{forEach(value,function(property){update(value,property,callback)})}}return callback.call(source,property,value)};JSON3.parse=function(source,callback){var result,value;Index=0;Source=\"\"+source;result=get(lex());if(lex()!=\"$\"){abort()}Index=Source=null;return callback&&getClass.call(callback)==functionClass?walk((value={},value[\"\"]=result,value),\"\",callback):result}}}if(isLoader){define(function(){return JSON3})}})(this)},{}],48:[function(_dereq_,module,exports){module.exports=toArray;function toArray(list,index){var array=[];index=index||0;for(var i=index||0;i<list.length;i++){array[i-index]=list[i]}return array}},{}]},{},[1])(1)});"
  },
  {
    "path": "browser/plugins/sqrt_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"sqrt_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Sqrt(x).';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Input value.', def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'result', dt: core.datatypes.FLOAT, desc: 'sqrt(<b>value</b>).', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.value = Math.sqrt(data);\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/square_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"square_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Square oscilator. A <b>time</b> value incrementing by one unit per second will yield a 1Hz output signal.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'time', dt: core.datatypes.FLOAT, desc: 'Time in seconds.', def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Emits 1 if <b>time</b> % 1 is less than 0.5 and -1 otherwise.', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.time = 0.0;\n\tthis.result = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.time = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.result = this.time % 1.0 < 0.5 ? 1.0 : -1.0;\n\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.result;\n};\n"
  },
  {
    "path": "browser/plugins/stereo_cube_map.plugin.js",
    "content": "(function() {\n\tvar StereoCubeMapPlugin = E2.plugins.stereo_cube_map = function (core, node) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'Stereo Cube Map'\n\n\t\tthis.input_slots = [\n\t\t\t{\n\t\t\t\tname: 'url',\n\t\t\t\tdt: core.datatypes.TEXT,\n\t\t\t\tdef: ''\n\t\t\t}\n\t\t]\n\n\t\tthis.output_slots = [\n\t\t\t{\n\t\t\t\tname: 'cube',\n\t\t\t\tdt: core.datatypes.OBJECT3D,\n\t\t\t\tarray: true\n\t\t\t}\n\t\t]\n\n\t\tvar deftex = E2.core.assetLoader.loadingTexture.image\n\n\t\tvar defTexture = new THREE.CubeTexture([deftex, deftex, deftex, deftex, deftex, deftex])\n\t\tdefTexture.needsUpdate = true\n\n\n\t\tvar defShader = THREE.ShaderLib['cube']\n\t\tdefShader.uniforms['tCube'].value = defTexture\n\n\t\tvar defMaterial = new THREE.ShaderMaterial({\n\t\t\tfragmentShader: defShader.fragmentShader,\n\t\t\tvertexShader: defShader.vertexShader,\n\t\t\tuniforms: defShader.uniforms,\n\t\t\tdepthWrite: false,\n\t\t\tside: THREE.BackSide\n\t\t})\n\n\t\tthis.defaultObj = new THREE.Mesh(\n\t\t\tnew THREE.BoxGeometry(50, 50, 50),\n\t\t\tdefMaterial)\n\t\t\n\t\tthis.leftChannel = 1\n\t\tthis.rightChannel = 2\n\t\tthis.monoChannel = 3\n\n\t}\n\n\tStereoCubeMapPlugin.prototype = Object.create(Plugin.prototype)\n\n\tStereoCubeMapPlugin.prototype.loadTextures = function() {\n\t\tvar textures = []\n\n\t\tif (!this.url)\n\t\t\treturn;\n\n\t\tvar loader = new THREE.ImageLoader( THREE.DefaultLoadingManager );\n\t\tloader.setCrossOrigin( '' );\n\n\t\tvar that = this\n\n\t\tloader.load( this.url, function ( img ) {\n\t\t\tvar imageWidth = img.width\n\t\t\tvar imageHeight = img.height\n\n\t\t\tvar tiles = 12\n\n\t\t\tvar tileWidth = imageWidth / tiles\n\t\t\tvar tileHeight = imageHeight\n\n\t\t\tfor (var i = 0; i < tiles; ++i) {\n\t\t\t\tvar tileCanvas = document.createElement('canvas')\n\t\t\t\ttileCanvas.width = tileWidth\n\t\t\t\ttileCanvas.height = tileHeight\n\n\t\t\t\tvar ctx = tileCanvas.getContext('2d')\n\t\t\t\tctx.drawImage(img, i * tileWidth, 0, tileWidth, tileHeight, 0, 0, tileWidth, tileHeight)\n\n\t\t\t\ttextures.push(tileCanvas)\n\t\t\t}\n\n\t\t\t// left eye\n\t\t\tvar leftTexture = new THREE.CubeTexture(textures.splice(0, 6))\n\t\t\tleftTexture.needsUpdate = true\n\n\t\t\tvar shader = THREE.ShaderLib['cube']\n\n\t\t\tvar leftUniforms = {\n\t\t\t\t\"tCube\": { type: \"t\", value: leftTexture },\n\t\t\t\t\"tFlip\": { type: \"f\", value: 1 } }\n\n\t\t\tvar leftMaterial = new THREE.ShaderMaterial({\n\t\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\tuniforms: leftUniforms,\n\t\t\t\tdepthWrite: false,\n\t\t\t\tside: THREE.DoubleSide\n\t\t\t})\n\n\t\t\tthat.leftObj = new THREE.Mesh(\n\t\t\t\t\tnew THREE.BoxGeometry(50, 50, 50),\n\t\t\t\t\tleftMaterial)\n\n\t\t\tthat.leftObj.layers.set(that.leftChannel)\n\t\t\tthat.leftObj.layers.enable(that.monoChannel)\n\n\t\t\t// right eye\n\t\t\tvar rightTexture = new THREE.CubeTexture(textures.splice(0, 6))\n\t\t\trightTexture.needsUpdate = true\n\n\t\t\tvar rightUniforms = {\n\t\t\t\t\"tCube\": { type: \"t\", value: rightTexture },\n\t\t\t\t\"tFlip\": { type: \"f\", value: 1 } }\n\n\t\t\tvar rightMaterial = new THREE.ShaderMaterial({\n\t\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\tuniforms: rightUniforms,\n\t\t\t\tdepthWrite: false,\n\t\t\t\tside: THREE.DoubleSide\n\t\t\t})\n\n\t\t\tthat.rightObj = new THREE.Mesh(\n\t\t\t\tnew THREE.BoxGeometry(50, 50, 50),\n\t\t\t\trightMaterial)\n\n\t\t\tthat.rightObj.layers.set(that.rightChannel)\n\t\t\tthat.rightObj.layers.enable(that.monoChannel)\n\n\t\t\tthat.updated = true\n\t\t},\n\t\tundefined,\n\t\tfunction(e) {\n\t\t\tconsole.log('failed to load ' + that.url, e)\n\t\t})\n\t}\n\n\tStereoCubeMapPlugin.prototype.reset = function() {\n\n\t}\n\n\tStereoCubeMapPlugin.prototype.update_input = function(slot, data) {\n\t\tif (slot.name === 'url' && this.url !== data) {\n\t\t\tdelete this.leftObj\n\t\t\tdelete this.rightObj\n\n\t\t\tthis.url = data\n\n\t\t\tthis.loadTextures()\n\t\t}\n\t}\n\n\tStereoCubeMapPlugin.prototype.update_output = function() {\n\t\tif (this.leftObj === undefined) {\n\t\t\treturn [this.defaultObj]\n\t\t}\n\n\t\treturn [this.leftObj, this.rightObj]\n\t}\n\n\tStereoCubeMapPlugin.prototype.state_changed = function(ui) {\n\t\tif (!ui) {\n\t\t\tthis.loadTextures()\n\t\t}\n\t}\n})()\n"
  },
  {
    "path": "browser/plugins/stop_emitter.plugin.js",
    "content": "E2.p = E2.plugins[\"stop_emitter\"] = function(core, node)\n{\n\tthis.desc = 'Stops graph playback when a true value is received by the <b>bool</b> slot.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: 'When true is received by this slot, graph playback is stopped.' }\n\t];\n\t\n\tthis.output_slots = [];\n\n\tthis.core = core;\n\tthis.stop_seq = false;\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.stop_seq = false;\n}\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.stop_seq = data;\n};\n\nE2.p.prototype.update_state = function()\n{\n\tif(!this.stop_seq)\n\t\treturn;\n\t\t\n\tif(E2.app.onStopClicked)\n\t\tE2.app.onStopClicked();\n\telse\n\t\tthis.core.player.schedule_stop();\n\t\t\n\tthis.stop_seq = false;\n};\n"
  },
  {
    "path": "browser/plugins/streamr/streamr-client.js",
    "content": "\"use strict\";\n\n(function() {\n\nvar io\nvar debug\nif (typeof window !== 'undefined') {\n\tio = window.io\n\tdebug = (window.debug ? window.debug('StreamrClient') : function() {\n\t\tif (window.consoleLoggingEnabled)\n\t\t\tconsole.log.apply(console, arguments)\n\t})\n}\nelse {\n\tio = require('socket.io-client')\n\tdebug = require('debug')('StreamrClient')\n}\n\nvar STREAM_KEY = \"_S\"\nvar COUNTER_KEY = \"_C\"\nvar TIMESTAMP_KEY = \"_T\"\nvar BYE_KEY = \"_bye\"\nvar SUB_KEY = \"_sub\"\n\nfunction extend(){\n    for(var i=1; i<arguments.length; i++)\n        for(var key in arguments[i])\n            if(arguments[i].hasOwnProperty(key))\n                arguments[0][key] = arguments[i][key];\n    return arguments[0];\n}\n\n/**\n * MicroEvent - to make any js object an event emitter (server or browser)\n * \n * - pure javascript - server compatible, browser compatible\n * - dont rely on the browser doms\n * - super simple - you get it immediatly, no mistery, no magic involved\n *\n * - create a MicroEventDebug with goodies to debug\n *   - make it safer to use\n*/\n\nvar MicroEvent\t= function(){};\nMicroEvent.prototype = {\n\tbind\t: function(event, fct){\n\t\tthis._events = this._events || {};\n\t\tthis._events[event] = this._events[event]\t|| [];\n\t\tthis._events[event].push(fct);\n\t},\n\tunbind\t: function(event, fct){\n\t\tthis._events = this._events || {};\n\t\tif( event in this._events === false  )\treturn;\n\t\tthis._events[event].splice(this._events[event].indexOf(fct), 1);\n\t},\n\ttrigger\t: function(event /* , args... */){\n\t\tthis._events = this._events || {};\n\t\tif( event in this._events === false  )\treturn;\n\t\tfor(var i = 0; i < this._events[event].length; i++){\n\t\t\tthis._events[event][i].apply(this, Array.prototype.slice.call(arguments, 1));\n\t\t}\n\t}\n};\n\n/**\n * mixin will delegate all MicroEvent.js function in the destination object\n *\n * - require('MicroEvent').mixin(Foobar) will make Foobar able to use MicroEvent\n *\n * @param {Object} the object which will support MicroEvent\n*/\nMicroEvent.mixin\t= function(destObject){\n\tvar props\t= ['bind', 'unbind', 'trigger'];\n\tfor(var i = 0; i < props.length; i ++){\n\t\tif( typeof destObject === 'function' ){\n\t\t\tdestObject.prototype[props[i]]\t= MicroEvent.prototype[props[i]];\n\t\t}else{\n\t\t\tdestObject[props[i]] = MicroEvent.prototype[props[i]];\n\t\t}\n\t}\n}\n\nvar subId = 0\nfunction generateSubscriptionId() {\n\tvar id = subId++\n\treturn id.toString()\n};\n\n/**\n * Subscription\n **/\nfunction Subscription(streamId, callback, options) {\n\tif (!streamId)\n\t\tthrow \"No stream id given!\"\n\tif (!callback)\n\t\tthrow \"No callback given!\"\n\n\tvar _this = this\n\t\n\tthis.id = generateSubscriptionId()\n\tthis.streamId = streamId\n\tthis.callback = callback\n\tthis.options = options || {}\n\tthis.queue = []\n\tthis.counter = null\n\tthis.subscribed = false\n\n\t// Check that multiple resend options are not given\n\tvar resendOptionCount = 0\n\tif (this.options.resend_all)\n\t\tresendOptionCount++\n\tif (this.options.resend_from!=null)\n\t\tresendOptionCount++\n\tif (this.options.resend_last!=null)\n\t\tresendOptionCount++\n\tif (this.options.resend_from_time!=null)\n\t\tresendOptionCount++\n\tif (resendOptionCount>1)\n\t\tthrow \"Multiple resend options active! Please use only one: \"+JSON.stringify(options)\n\n\t// Automatically convert Date objects to numbers for resend_from_time\n\tif (this.options.resend_from_time != null \n\t\t&& typeof this.options.resend_from_time !== 'number') {\n\n\t\tif (typeof this.options.resend_from_time.getTime === 'function')\n\t\t\tthis.options.resend_from_time = this.options.resend_from_time.getTime()\n\t\telse throw \"resend_from_time option must be a Date object or a number representing time!\"\n\t}\n\n\t/*** Message handlers ***/\n\n\tthis.bind('subscribed', function(response) {\n\t\tdebug(\"Sub %s subscribed: %s from %d\", _this.id, _this.streamId, response.from)\n\n\t\t_this.subscribed = true\n\n\t\t// If expected counter is not known, set it to whatever the subscribed message says\n\t\tif (response.from != null && _this.counter==null)\n\t\t\t_this.counter = response.from\n\t\t// If there is a mismatch in expected counter, issue a resend\n\t\telse if (response.from != null && response.from > _this.counter) {\n\t\t\tthis.trigger('gap', this.counter, response.from-1)\n\t\t}\n\t\t// This situation should never occur, it is safe to ignore but will result in duplicate messages being sent by the server\n\t\telse if (response.from != null && response.from < _this.counter) {\n\t\t\tdebug(\"Subscribed from a counter less than what was expected! Expected: %d, subscribed from: %d\", _this.counter, response.from)\n\t\t}\n\n\t})\n\n\tthis.bind('unsubscribed', function() {\n\t\tdebug(\"Sub %s unsubscribed: %s\", _this.id, _this.streamId)\n\t\t_this.subscribed = false\n\t\t_this.unsubscribing = false\n\t\t_this.resending = false\n\t})\n\n\tthis.bind('resending', function(response) {\n\t\tdebug(\"Sub %s resending: %s next message set to %d, was: %o\", _this.id, response.channel, response.from, _this.counter)\n\t\t_this.counter = response.from\n\t})\n\n\tthis.bind('no_resend', function(response) {\n\t\tdebug(\"Sub %s no_resend: %s next message set to %d, was: %o\", _this.id, response.channel, response.next, _this.counter)\n\n\t\t_this.counter = response.next\n\t\t_this.resending = false\n\t\t_this.checkQueue()\n\t})\n\n\tthis.bind('resent', function(response) {\n\t\tdebug(\"Sub %s resent: %s from %d to %d\", _this.id, response.channel, response.from, response.to)\n\t\t\n\t\t_this.resending = false\n\t\t_this.checkQueue()\n\t})\n\n\tthis.bind('connected', function() {\n\n\t})\n\n\tthis.bind('disconnected', function() {\n\t\t_this.subscribed = false\n\t\t_this.resending = false\n\t})\n\n}\n\nMicroEvent.mixin(Subscription)\n\nSubscription.prototype.handleMessage = function(message, stream, timestamp, counter, bye) {\n\tif (this.counter === null && counter!==undefined) {\n\t\tdebug(\"Sub %s received message %d but does not know what number to expect\", this.id, counter)\n\t\treturn\n\t}\n\n\t// Update ack counter\n\tif (counter > this.counter) {\n\t\tthis.queue.push({\n\t\t\tmsg: message,\n\t\t\tstr: stream,\n\t\t\tts: timestamp,\n\t\t\tc: counter,\n\t\t\tbye: bye\n\t\t})\n\t\t\n\t\tif (!this.resending) {\n\t\t\tdebug(\"Gap detected, requesting resend for channel %s\", this.streamId)\n\t\t\tthis.trigger('gap', this.counter, counter-1)\n\t\t}\n\t}\n\telse if (counter < this.counter) {\n\t\tdebug(\"Sub %s already received message: %d, expecting: %d\", this.id, counter, this.counter)\n\t}\n\telse {\n\t\tthis.counter = counter + 1\n\n\t\tthis.callback(message, stream, timestamp, counter)\n\n\t\tif (bye)\n\t\t\tthis.trigger('done')\n\t}\n}\n\nSubscription.prototype.checkQueue = function() {\n\tif (this.queue.length) {\n\t\tdebug(\"Attempting to process %d queued messages for stream %s\", this.queue.length, this.streamId)\n\t\t\n\t\tvar i\n\t\tfor (i=0;i<this.queue.length;i++) {\n\t\t\t// If the counter is correct, process the message\n\t\t\tif (this.queue[i].c === this.counter) {\n\t\t\t\tthis.handleMessage(this.queue[i].msg, this.queue[i].str, this.queue[i].ts, this.queue[i].c, this.queue[i].bye)\n\t\t\t}\n\t\t\t// Ignore old messages in the queue\n\t\t\telse if (this.queue[i].c < this.counter)\n\t\t\t\tcontinue\n\t\t\t// Else stop looping\n\t\t\telse if (this.queue[i].c > this.counter)\n\t\t\t\tbreak\n\t\t}\n\t\t\n\t\t// All messages in queue were processed\n\t\tif (i===this.queue.length) {\n\t\t\tthis.queue = []\n\t\t}\n\t\t// Some messages could not be processed, so compact the queue \n\t\t// and request another resend for the gap!\n\t\telse {\n\t\t\tthis.queue.splice(0, i)\n\t\t\tthis.trigger('gap', this.counter, this.queue[0].c-1)\n\t\t}\n\t}\n}\n\nSubscription.prototype.hasResendOptions = function() {\n\treturn this.options.resend_all===true || this.options.resend_from >= 0 || this.options.resend_from_time >= 0 || this.options.resend_last > 0\n}\n\nSubscription.prototype.isSubscribed = function() {\n\treturn this.subscribed\n}\n\n/**\n * StreamClient\n **/\n\nfunction StreamrClient(options) {\n\t// Default options\n\tthis.options = {\n\t\t// The server to connect to\n\t\tserver: \"https://data.streamr.com\",\n\t\t// Automatically connect on first subscribe\n\t\tautoConnect: true,\n\t\t// Automatically disconnect on last unsubscribe\n\t\tautoDisconnect: true,\n\t\t// Allow client socket library to choose appropriate transport\n\t\ttransports: null\n\t}\n\tthis.subsByStream = {}\n\tthis.subById = {}\n\n\tthis.io = io\n\tthis.socket = null\n    this.connected = false\n\n    // Can give server URL as parameter instead of options object\n    if (typeof options === \"string\")\n    \tthis.options.server = options\n    else\n\t\textend(this.options, options || {})\n}\n\nMicroEvent.mixin(StreamrClient)\n\nStreamrClient.prototype._addSubscription = function(sub) {\n\tthis.subById[sub.id] = sub\n\n\tif (!this.subsByStream[sub.streamId])\n\t\tthis.subsByStream[sub.streamId] = [sub]\n\telse this.subsByStream[sub.streamId].push(sub)\n}\n\nStreamrClient.prototype._removeSubscription = function(sub) {\n\tdelete this.subById[sub.id]\n\n\tif (this.subsByStream[sub.streamId]) {\n\t\tthis.subsByStream[sub.streamId] = this.subsByStream[sub.streamId].filter(function(it) {\n\t\t\treturn it !== sub\n\t\t})\n\n\t\tif (this.subsByStream[sub.streamId].length === 0)\n\t\t\tdelete this.subsByStream[sub.streamId]\n\t}\n}\n\nStreamrClient.prototype.getSubscriptions = function(streamId) {\n\treturn this.subsByStream[streamId] || []\n}\n\nStreamrClient.prototype.subscribe = function(streamId, callback, options) {\n\tvar _this = this\n\n\tif (!streamId)\n\t\tthrow \"subscribe: Invalid arguments: stream id is required!\"\n\telse if (typeof streamId !== 'string')\n\t\tthrow \"subscribe: stream id must be a string!\"\n\n\tif (!callback)\n\t\tthrow \"subscribe: Invalid arguments: callback is required!\"\n\n\t// Create the Subscription object and bind handlers\n\tvar sub = new Subscription(streamId, callback, options)\n\tsub.bind('gap', function(from, to) {\n\t\t_this._requestResend(sub, {resend_from: from, resend_to: to})\n\t})\n\tsub.bind('done', function() {\n\t\t_this.unsubscribe(sub)\n\t})\n\n\t// Add to lookups\n\tthis._addSubscription(sub)\n\n\t// If connected, emit a subscribe request\n\tif (this.connected) {\n\t\tthis._resendAndSubscribe(sub)\n\t} else if (this.options.autoConnect) {\n\t\tthis.connect()\n\t}\n\n\treturn sub\n}\n\nStreamrClient.prototype.unsubscribe = function(sub) {\n\tif (!sub || !sub.streamId)\n\t\tthrow \"unsubscribe: please give a Subscription object as an argument!\"\n\n\t// If this is the last subscription for this stream, unsubscribe the client too\n\tif (this.subsByStream[sub.streamId] !== undefined && this.subsByStream[sub.streamId].length === 1 && this.connected && !this.disconnecting && sub.isSubscribed() && !sub.unsubscribing) {\n\t\tsub.unsubscribing = true\n\t\tthis._requestUnsubscribe(sub.streamId)\n\t}\n\t// Else the sub can be cleaned off immediately\n\telse if (!sub.unsubscribing) {\n\t\tthis._removeSubscription(sub)\n\t\tsub.trigger('unsubscribed')\n\t\tthis._checkAutoDisconnect()\n\t}\n}\n\nStreamrClient.prototype.unsubscribeAll = function(streamId) {\n\tvar _this = this\n\tif (!streamId)\n\t\tthrow \"unsubscribeAll: a stream id is required!\"\n\telse if (typeof streamId !== 'string')\n\t\tthrow \"unsubscribe: stream id must be a string!\"\n\n\tif (this.subsByStream[streamId]) {\n\t\t// Copy the list to avoid concurrent modifications\n\t\tvar l = this.subsByStream[streamId].slice()\n\t\tl.forEach(function(sub) {\n\t\t\t_this.unsubscribe(sub)\n\t\t})\n\t}\n}\n\nStreamrClient.prototype.isConnected = function() {\n\treturn this.connected\n}\n\nStreamrClient.prototype.reconnect = function() {\n\treturn this.connect(true)\n}\n\nStreamrClient.prototype.connect = function(reconnect) {\n\tvar _this = this\n\t\n\tif (this.connected) {\n\t\tdebug(\"connect() called while already connected, doing nothing...\")\n\t\treturn\n\t}\n\telse if (this.connecting) {\n\t\tdebug(\"connect() called while connecting, doing nothing...\")\n\t\treturn\n\t}\n\t\n\tdebug(\"Connecting to %s\", this.options.server)\n\tthis.connecting = true\n\tthis.disconnecting = false\n\n\tthis.socket = this.io(this.options.server, {\n\t\tforceNew: true,\n\t\ttransports: this.options.transports\n\t})\n\n\tthis.socket.on('ui', function(data) {\n\t\tif (typeof data == 'string' || data instanceof String) {\n\t\t\tdata = JSON.parse(data)\n\t\t}\n\n\t\t// Delete the internal fields from the msg\n\t\tvar streamId = data[STREAM_KEY]\n\t\tdelete data[STREAM_KEY]\n\t\tvar timestamp = data[TIMESTAMP_KEY]\n\t\tdelete data[TIMESTAMP_KEY]\n\t\tvar counter = data[COUNTER_KEY]\n\t\tdelete data[COUNTER_KEY]\n\t\tvar bye = data[BYE_KEY]\n\t\tdelete data[BYE_KEY]\n\t\tvar sub = data[SUB_KEY]\n\t\tdelete data[SUB_KEY]\n\n\t\t// If the message targets a specific subscription via _sub, only report the message to that\n\t\tif (sub!==undefined) {\n\t\t\t_this.subById[sub].handleMessage(data, streamId, timestamp, counter, bye)\n\t\t}\n\t\telse {\n\t\t\t// Notify the Subscriptions for this stream. If this is not the message each individual Subscription \n\t\t\t// is expecting, they will either ignore it or request resend via gap event.\n\t\t\tvar subs = _this.subsByStream[streamId]\n\n\t\t\tif (subs) {\n\t\t\t\tfor (var i=0;i<subs.length;i++)\n\t\t\t\t\tsubs[i].handleMessage(data, streamId, timestamp, counter, bye)\n\t\t\t}\n\t\t\telse debug('WARN: message received for stream with no subscriptions: %s', streamId)\n\t\t}\n\t})\n\t\n\tthis.socket.on('subscribed', function(response) {\n\t\tif (response.error) {\n\t\t\t_this.handleError(\"Error subscribing to \"+response.channel+\": \"+response.error)\n\t\t}\n\t\telse {\n\t\t\tvar subs = _this.subsByStream[response.channel]\n\t\t\tdelete subs._subscribing\n\n\t\t\tdebug('Client subscribed: %o', response)\n\n\t\t\t// Report subscribed to all non-resending Subscriptions for this stream\n\t\t\tsubs.filter(function(sub) { \n\t\t\t\treturn !sub.resending \n\t\t\t}).forEach(function(sub) {\n\t\t\t\tsub.trigger('subscribed', response)\n\t\t\t})\n\t\t}\n\t})\n\n\tthis.socket.on('unsubscribed', function(response) {\n\t\tdebug(\"Client unsubscribed: %o\", response)\n\n\t\tif (_this.subsByStream[response.channel]) {\n\t\t\t// Copy the list to avoid concurrent modifications\n\t\t\tvar l = _this.subsByStream[response.channel].slice()\n\t\t\tl.forEach(function(sub) {\n\t\t\t\t_this._removeSubscription(sub)\n\t\t\t\tsub.trigger('unsubscribed')\n\t\t\t})\n\t\t}\n\n\t\t_this._checkAutoDisconnect()\n\t})\n\n\t// Route resending state messages to corresponding Subscriptions\n\tthis.socket.on('resending', function(response) {\n\t\t_this.subById[response.sub].trigger('resending', response)\n\t})\n\n\tthis.socket.on('no_resend', function(response) {\n\t\t_this.subById[response.sub].trigger('no_resend', response)\n\t})\n\n\tthis.socket.on('resent', function(response) {\n\t\tif (_this.subById[response.sub])\n\t\t\t_this.subById[response.sub].trigger('resent', response)\n\t\telse debug('resent: Subscription %d is gone already', response.sub)\n\t})\n\t\n\t// On connect/reconnect, send pending subscription requests\n\tthis.socket.on('connect', function() {\n\t\tdebug(\"Connected!\")\n\t\t_this.connected = true\n\t\t_this.connecting = false\n\t\t_this.disconnecting = false\n\t\t_this.trigger('connected')\n\t\t\n\t\tObject.keys(_this.subsByStream).forEach(function(streamId) {\n\t\t\tvar subs = _this.subsByStream[streamId]\n\t\t\tsubs.forEach(function(sub) {\n\t\t\t\tif (!sub.isSubscribed()) {\n\t\t\t\t\t_this._resendAndSubscribe(sub)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t})\n\n\tthis.socket.on('disconnect', function() {\n\t\tdebug(\"Disconnected.\")\n\t\t_this.connected = false\n\t\t_this.connecting = false\n\t\t_this.disconnecting = false\n\t\t_this.trigger('disconnected')\n\n\t\tObject.keys(_this.subsByStream).forEach(function(streamId) {\n\t\t\tvar subs = _this.subsByStream[streamId]\n\t\t\tdelete subs._subscribing\n\t\t\tsubs.forEach(function(sub) {\n\t\t\t\tsub.trigger('disconnected')\n\t\t\t})\n\t\t})\n\t})\n\n\treturn this.subsByStream\n}\n\nStreamrClient.prototype.pause = function() {\n\tthis.socket.disconnect()\n}\n\nStreamrClient.prototype.disconnect = function() {\n\tvar _this = this\n\tthis.connecting = false\n\tthis.disconnecting = true\n\n\tObject.keys(this.subsByStream).forEach(function(streamId) {\n\t\t_this.unsubscribeAll(streamId)\n\t})\n\n\tthis.socket.disconnect()\n}\n\nStreamrClient.prototype._checkAutoDisconnect = function() {\n\t// Disconnect if no longer subscribed to any channels\n\tif (Object.keys(this.subsByStream).length===0 && this.options.autoDisconnect) {\n\t\tdebug(\"Disconnecting due to no longer being subscribed to any channels\")\n\t\tthis.disconnect()\n\t}\n}\n\nStreamrClient.prototype._resendAndSubscribe = function(sub) {\n\tvar _this = this\n\n\tvar from = undefined\n\n\t// Resend from latest received message if messages have already been received\n\tif (sub.counter && (sub.options.resend_all || sub.options.resend_from!=null || sub.options.resend_from_time!=null)) {\n\t\tfrom = sub.counter\n\t}\n\t// If subscription has resend options, do a resend first\n\telse if (sub.hasResendOptions()) {\n\t\tvar onResent = function(response) {\n\t\t\tsub.unbind('resent', this)\n\t\t\tsub.unbind('no_resend', onNoResend)\n\t\t\tfrom = response.to + 1\n\t\t\t_this._requestSubscribe(sub, from)\n\t\t}\n\t\tvar onNoResend = function(response) {\n\t\t\tsub.unbind('resent', onResent)\n\t\t\tsub.unbind('no_resend', this)\n\t\t\tfrom = response.next\n\t\t\t_this._requestSubscribe(sub, from)\n\t\t}\n\t\tsub.bind('resent', onResent)\n\t\tsub.bind('no_resend', onNoResend)\n\n\t\tthis._requestResend(sub)\n\t}\n\n\tif (!sub.resending) {\n\t\t_this._requestSubscribe(sub, from)\n\t}\n}\n\nStreamrClient.prototype._requestSubscribe = function(sub, from) {\n\tvar _this = this\n\tvar subs = _this.subsByStream[sub.streamId]\n\n\tvar subscribedSubs = subs.filter(function(it) {\n\t\treturn it.isSubscribed()\n\t})\n\n\t// If this is the first subscription for this stream, send a subscription request to the server\n\tif (!subs._subscribing && subscribedSubs.length === 0) {\n\t\tvar req = {channel: sub.streamId, from: from}\n\t\tdebug(\"_requestSubscribe: subscribing client: %o\", req)\n\t\tsubs._subscribing = true\n\t\t_this.socket.emit('subscribe', req)\t\n\t}\n\t// If there already is a subscribed subscription for this stream, this new one will just join it immediately\n\telse if (subscribedSubs.length > 0) {\n\t\tif (from === undefined) {\n\t\t\t// Find the max received counter\n\t\t\tvar counters = subscribedSubs.map(function(it) {\n\t\t\t\treturn it.counter\n\t\t\t})\n\t\t\tfrom = Math.max.apply(Math, counters)\n\t\t}\n\n\t\tdebug('_requestSubscribe: another subscription for same stream: %s, insta-subscribing from %d', sub.streamId, from)\n\n\t\tsetTimeout(function() {\n\t\t\tsub.trigger('subscribed', {from: from})\n\t\t}, 0)\n\t}\n}\n\nStreamrClient.prototype._requestUnsubscribe = function(streamId) {\n\tdebug(\"Client unsubscribing from %o\", streamId)\n\tthis.socket.emit('unsubscribe', {channel: streamId})\n}\n\nStreamrClient.prototype._requestResend = function(sub, options) {\n\toptions = options || sub.options\n\n\tsub.resending = true\n\n\tvar request = {}\n\tObject.keys(options).forEach(function(key) {\n\t\trequest[key] = options[key]\n\t})\n\trequest.channel = sub.streamId\n\trequest.sub = sub.id\n\n\tdebug(\"_requestResend: %o\", request)\n\tthis.socket.emit('resend', request)\n}\n\nStreamrClient.prototype.handleError = function(msg) {\n\tdebug(msg)\n\tthis.trigger('error', msg)\n}\n\nif (typeof module !== 'undefined' && module.exports)\n\tmodule.exports = StreamrClient\nelse window.StreamrClient = StreamrClient\n\n})(typeof(exports) !== 'undefined' ? exports : window)"
  },
  {
    "path": "browser/plugins/streamr_client.plugin.js",
    "content": "(function() {\n\nvar StreamrClientPlugin = function(core) {\n\tPlugin.apply(this, arguments)\n\n\tvar that = this\n\n\tthis.desc = 'Client for consuming Streamr.com streams.'\n\n\tthis.input_slots = [{\n\t\tname: 'streamId',\n\t\tdt: E2.dt.TEXT,\n\t\tdesc: 'The ID of the Streamr stream to consume.'\n\t}]\n\n\tthis.output_slots = [{\n\t\tname: 'trigger',\n\t\tdt: E2.dt.BOOL,\n\t\tdesc: 'Triggers (becomes true) for one frame any time a message is received'\n\t}, {\n\t\tname: 'message',\n\t\tdt: E2.dt.OBJECT,\n\t\tdesc: 'A parsed message entry from the stream.'\n\t}]\n\n\tcore.add_aux_script('socket.io/socket.io-1.3.7.js')\n\t.then(function() {\n\t\treturn core.add_aux_script('streamr/streamr-client.js')\n\t})\n\t.then(function() {\n\t\tconsole.log('construct client')\n\t\tthat._streamr = new StreamrClient()\n\t\tthat.subscribe()\n\t})\n\t.catch(function(err) {\n\t\tconsole.error(err.stack)\n\t})\n\n\tthis.message = null\n\tthis.trigger = false\n}\n\nStreamrClientPlugin.prototype = Object.create(Plugin.prototype)\n\nStreamrClientPlugin.prototype.reset = function() {\n\tthis.changed = false\n}\n\nStreamrClientPlugin.prototype.update_input = function() {\n\tconsole.log('update_input')\n\tif (!this.subscription)\n\t\tthis.subscribe()\n}\n\nStreamrClientPlugin.prototype.update_state = function() {\n\tconsole.log('update_state')\n\tconsole.log('update_state()', this.inputValues.streamId, !!this.subscription)\n\n\tif (!this.node.queued_update)\n\t\tthis.trigger = false\n}\n\nStreamrClientPlugin.prototype.update_output = function(slot) {\n\tswitch(slot.name) {\n\t\tcase 'trigger':\n\t\t\treturn this.trigger\n\t\tcase 'message':\n\t\t\treturn this.message\n\t}\n}\n\nStreamrClientPlugin.prototype.subscribe = function() {\n\tvar that = this\n\tconsole.log('subscribe()', this.inputValues.streamId, !!this._streamr)\n\n\tif (!this.inputValues.streamId || !this._streamr)\n\t\treturn;\n\n\tif (this.subscription)\n\t\tthis._streamr.unsubscribe(this.subscription)\n\n\tthis.subscription = this._streamr.subscribe(this.inputValues.streamId,\n\t\tfunction(message, streamId, timestamp, counter) {\n\t\t\tconsole.log('streamr:', message, counter)\n\t\t\tthat.message = message\n\t\t\tthat.trigger = true\n\t\t\tthat.updated = true\n\t\t\tthat.node.queued_update = 1\n\t\t})\n\n\tthis._streamr.connect()\n}\n\nE2.plugins.streamr_client = StreamrClientPlugin\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = StreamrClientPlugin\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/string_concatenate_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"string_concatenate_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Concatenates the two supplied strings.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'a', dt: core.datatypes.TEXT, desc: 'The first string.', def: '' },\n\t\t{ name: 'b', dt: core.datatypes.TEXT, desc: 'The second string.', def: '' } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'result', dt: core.datatypes.TEXT, desc: 'The string representing the combination of <b>first</b> + <b>second</b>.' }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.text_a = '';\n\tthis.text_b = '';\n\tthis.output_val = '';\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.text_a = '' + data;\n\telse\n\t\tthis.text_b = '' + data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.output_val = this.text_a + this.text_b;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.output_val;\n};\n"
  },
  {
    "path": "browser/plugins/subtract_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"subtract_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Subtract the second value from the first and emit the result.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'a', dt: core.datatypes.FLOAT, desc: 'The first operand.', def: 0.0 },\n\t\t{ name: 'b', dt: core.datatypes.FLOAT, desc: 'The second operand.', def: 0.0 } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'result', dt: core.datatypes.FLOAT, desc: 'The result of <b>first</b> - <b>second</b>.', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.input_val = 0.0;\n\tthis.sub_val = 0.0;\n\tthis.output_val = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.input_val = data;\n\telse\n\t\tthis.sub_val = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.output_val = this.input_val - this.sub_val;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.output_val;\n};\n"
  },
  {
    "path": "browser/plugins/switch_modulator.plugin.js",
    "content": "(function() {\n\nvar SwitchModulator = E2.plugins.switch_modulator = function(core, node) {\n\tvar that = this\n\n\tthis.desc = 'Given an <b>index</b>, emit the supplied <b>true</b> value on the output slot matching the index and the <b>false</b> value on all others. If the index is invalid, the <b>false</b> value is emitted on all outputs.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'index', dt: core.datatypes.FLOAT, desc: 'The selected index.', def: -1 },\n\t\t{ name: 'true', dt: core.datatypes.ANY, desc: 'The value to emit on the output slot matching the current index.', def: null },\n\t\t{ name: 'false', dt: core.datatypes.ANY, desc: 'The value to emit on any slot not matching the current index', def: null }\n\t]\n\t\n\tthis.output_slots = []\n\t\n\tthis.state = {}\n\t\n\tthis.core = core\n\tthis.node = node\n\tthis.lsg = new LinkedSlotGroup(core, node,\n\t\t[\tthis.input_slots[1],\n\t\t\tthis.input_slots[2]\n\t\t],\n\t\t[]\n\t)\n\n\tthis.true_value = null\n\tthis.false_value = null\n\n\tthis.node.on('slotAdded', function() {\n\t\tthat.updated = true\n\t})\n\n\tthis.node.on('slotRemoved', function() {\n\t\tthat.updated = true\n\t})\n}\n\nSwitchModulator.prototype.create_ui = function() {\n\tvar that = this\n\tvar layout = make('div')\n\tvar inp_rem = makeButton('Remove', 'Click to remove the last output.')\n\tvar inp_add = makeButton('Add', 'Click to add another output.')\n\t\n\tinp_rem.css('width', '65px')\n\tinp_add.css({ 'width': '65px', 'margin-top': '5px' })\n\t\n\tinp_add.click(function() {\n\t\tE2.app.graphApi.addSlot(that.node.parent_graph, that.node, {\n\t\t\ttype: E2.slot_type.output,\n\t\t\tname: that.dynOutputs.length + '',\n\t\t\tdt: that.core.datatypes.OBJECT\n\t\t})\n\t})\n\t\n\tinp_rem.click(function() {\n\t\tvar outputs = that.dynOutputs\n\t\tif (!outputs)\n\t\t\treturn;\n\t\t\t\n\t\tvar suid = outputs[outputs.length - 1].uid\n\t\tE2.app.graphApi.removeSlot(that.node.parent_graph, that.node, suid)\n\t})\n\n\tlayout.append(inp_rem, '<br />', inp_add);\n\treturn layout;\n}\n\nSwitchModulator.prototype.reset = function() {\n\tthis.index = -1\n}\n\nSwitchModulator.prototype.connection_changed = function(on, conn, slot) {\n\tif (this.lsg.connection_changed(on, conn, slot))\n\t\tthis.true_value = this.false_value = this.lsg.core.get_default_value(this.lsg.dt)\n}\n\nSwitchModulator.prototype.update_input = function(slot, data) {\n\tif(slot.index === 0)\n\t\tthis.index = Math.floor(data)\n\telse if(slot.index === 1)\n\t\tthis.true_value = data\n\telse\n\t\tthis.false_value = data\n}\t\n\nSwitchModulator.prototype.update_output = function(slot) {\n\treturn slot.index === this.index ? this.true_value : this.false_value\n}\n\nSwitchModulator.prototype.state_changed = function(ui) {\n\tif (!ui) {\n\t\tvar slots = this.dynOutputs = this.node.getDynamicOutputSlots()\n\n\t\tfor(var i = 0, len = slots.length; i < len; i++) {\n\t\t\tthis.lsg.add_dyn_slot(\n\t\t\t\tthis.node.find_dynamic_slot(\n\t\t\t\t\tE2.slot_type.output, slots[i].uid\n\t\t\t\t)\n\t\t\t)\n\t\t}\n\t\t\n\t\tthis.index = -1\n\t\tthis.true_value = this.false_value = this.lsg.infer_dt()\n\t}\n}\n\n\n})();\n"
  },
  {
    "path": "browser/plugins/tan_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"tan_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Tan(x).';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Input value.', def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'result', dt: core.datatypes.FLOAT, desc: 'tan(<b>value</b>).', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.value = Math.tan(data);\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/text_display.plugin.js",
    "content": "E2.p = E2.plugins[\"text_display\"] = function(core, node)\n{\n\tthis.desc = 'Display the supplied text value on the plugin surface.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'text', dt: core.datatypes.TEXT, desc: 'Input text to be displayed.', def: '' }\n\t];\n\t\n\tthis.output_slots = [];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.update_value(null);\n}\n\nE2.p.prototype.create_ui = function()\n{\n\tthis.label = make('div');\n\t\n\treturn this.label;\n};\n\nE2.p.prototype.connection_changed = function(on, conn, slot)\n{\n\tif(!on)\n\t\tthis.update_value('');\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.update_value(data);\n};\n\nE2.p.prototype.update_value = function(value)\n{\n\tif(this.label)\n\t\tthis.label[0].innerHTML = value;\n};\n"
  },
  {
    "path": "browser/plugins/text_editor_generator.plugin.js",
    "content": "(function() {\nvar TextEditor = E2.plugins[\"text_editor_generator\"] = function(core, node)\n{\n\tPlugin.apply(this, arguments)\n\tthis.desc = 'Edit a block of text.';\n\t\n\tthis.input_slots = [];\n\tthis.output_slots = [\n\t\t{ name: 'text', dt: core.datatypes.TEXT, desc: 'The currently entered text.', def: 'Empty string' }\n\t];\n\t\n\tthis.state = { text: '{\\n\\n}' };\n\t\n\tthis.core = core;\n};\n\nTextEditor.prototype = Object.create(Plugin.prototype)\n\nTextEditor.prototype.reset = function()\n{\n\tthis.updated = true;\n};\n\nTextEditor.prototype.open_editor = function(self) { return function(e)\n{\n\tvar diag = make('span');\n\tvar src = $('<pre id=\"editor\"></pre>'); \n\t\n\tdiag.css({\n\t\t'margin': '0px',\n\t\t'padding': '2px'\n\t});\n\n\tsrc.css({\n\t\t'margin': '0px',\n\t\t'padding': '0px',\n\t\t'margin-top': '2px',\n\t\t'border': '1px solid #bbb',\n\t\t'width': '755px',\n\t\t'height': '400px',\n\t\t'resize': 'none',\n\t\t'font-size': '12px',\n\t\t'font-family': 'Monospace',\n\t\t'scroll': 'none'\n\t});\n\t\n  \tdiag.append(src);\n\t\n\tvar editor = ace.edit(src[0]);\n\t\n\teditor.setTheme('ace/theme/chrome');\n\teditor.getSession().setUseWrapMode(false);\n\teditor.setBehavioursEnabled(false);\n\teditor.setShowPrintMargin(false);\n\teditor.getSession().setMode('ace/mode/json');\n\teditor.setValue(self.state.text);\n\teditor.gotoLine(2);\n\teditor.session.selection.clearSelection();\n\n\tvar store_state = function(editor, diag) { return function(e)\n\t{\n\t\tif(e && e.target.className === 'ace_text-input')\n\t\t\treturn false;\n\t\t\n\t\tself.undoableSetState('text', editor.getValue(), self.state.text)\n\t}};\n\t\n\tself.core.create_dialog(diag, 'Editor', 760, 150, store_state(editor, diag));\n}};\n\nTextEditor.prototype.create_ui = function()\n{\n\tvar inp = makeButton('Open', 'Click to edit the contents.');\n\t\n\tinp.css('width', '55px');\n\tinp.click(this.open_editor(this));\n\t\n\treturn inp;\n};\n\nTextEditor.prototype.update_output = function(slot)\n{\n\treturn this.state.text;\n};\n\nTextEditor.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t\tthis.core.add_aux_script('ace/ace.js');\n};\n\n})();\n"
  },
  {
    "path": "browser/plugins/texture_from_text_generator.plugin.js",
    "content": "E2.p = E2.plugins[\"texture_from_text_generator\"] = function(core, node)\n{\n\tthis.desc = 'Create a texture of a (2^n closest to the) given size filled with a rendered version of the supplied text.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'text', dt: core.datatypes.TEXT, desc: 'The text to be rendered to <b>texture</b>.', def: 'Lorem ipsum\\nDOLOR SIT AMET' },\n\t\t{ name: 'width', dt: core.datatypes.FLOAT, desc: 'The width of the output <b>texture</b>. Will be rounded to nearest 2^n.', lo: 2, hi: 1024, def: 128 },\n\t\t{ name: 'height', dt: core.datatypes.FLOAT, desc: 'The height of the output <b>texture</b>. Will be rounded to nearest 2^n.', lo: 2, hi: 1024, def: 128 },\n\t\t{ name: 'x', dt: core.datatypes.FLOAT, desc: 'The x position of the text.', def: 10 },\n\t\t{ name: 'y', dt: core.datatypes.FLOAT, desc: 'The y position of the text.', def: 10 },\n\t\t{ name: 'font style', dt: core.datatypes.TEXT, desc: 'The desired font style (CSS standard).', def: 'bold 16px arial' },\n\t\t{ name: 'fill style', dt: core.datatypes.TEXT, desc: 'The desired fill style (CSS standard).', def: '#fff' },\n\t\t{ name: 'stroke style', dt: core.datatypes.TEXT, desc: 'The desired stroke style (CSS standard).', def: 'none' },\n\t\t{ name: 'stroke width', dt: core.datatypes.FLOAT, desc: 'The desired stroke width in pixels.', def: 0 },\n\t\t{ name: 'align', dt: core.datatypes.TEXT, desc: 'Text alignment.', def: 'center' },\n\t\t{ name: 'baseline', dt: core.datatypes.TEXT, desc: 'Text baseline.', def: 'middle' },\n\t\t{ name: 'line height', dt: core.datatypes.FLOAT, desc: 'Line height scalar.', def: 1.2 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'texture', dt: core.datatypes.TEXTURE, desc: 'Output texture containing the rendered text.' }\n\t];\n\t\n\tthis.mesh = null;\n\tthis.canvas2d = $('<canvas style=\"display:none\" width=\"128\" height=\"128\"></canvas>')[0];\n\tthis.context  = this.canvas2d.getContext('2d');\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.updated = true;\n};\n\nE2.p.prototype.sanitize_size = function(n)\n{\n\tvar v =  Math.log(n) / Math.log(2);\t\n\tvar v_int = Math.floor(v);\n\t\n\tif(v_int < 1)\n\t\tv_int = 1;\n\telse if(v_int > 10)\n\t\tv_int = 10;\n\t\n\treturn Math.pow(2, v_int);\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.text = data;\n\telse if(slot.index === 1)\n\t\tthis.width = this.sanitize_size(data);\n\telse if(slot.index === 2)\n\t\tthis.height = this.sanitize_size(data);\n\telse if(slot.index === 3)\n\t\tthis.x = data;\n\telse if(slot.index === 4)\n\t\tthis.y = data;\n\telse if(slot.index === 5)\n\t\tthis.font_style = data;\n\telse if(slot.index === 6)\n\t\tthis.fill_style = data;\n\telse if(slot.index === 7)\n\t\tthis.stroke_style = data;\n\telse if(slot.index === 8)\n\t\tthis.stroke_width = data;\n\telse if(slot.index === 9)\n\t\tthis.align = data;\n\telse if(slot.index === 10)\n\t\tthis.baseline = data;\n\telse if(slot.index === 11)\n\t\tthis.line_height = data;\n};\n\nE2.p.prototype.update_state = function()\n{\n\tvar lines = this.text.split('\\n');\n\tvar cv = this.canvas2d;\n\tvar ctx = this.context;\n\t\n\tcv.width = this.width;\n\tcv.height = this.height;\n\tctx.clearRect(0, 0, this.width, this.height);\n\tctx.fillStyle = this.fill_style;\n\tctx.lineWidth = this.stroke_width;\n\tctx.strokeStyle = this.stroke_style;\n\tctx.font = this.font_style;\n\tctx.textAlign = this.align;\n\tctx.textBaseline = this.baseline;\n\t\n\tvar l_height = ctx.measureText('M').width * this.line_height; // This is very, very silly...\n\t\n\tfor(var i = 0, len = lines.length; i < len; i++)\n\t{\n\t\tvar y = this.y + (i * l_height);\n\t\tvar line = lines[i];\n\t\t\n\t\tctx.strokeText(line, this.x, y);\n\t\tctx.fillText(line, this.x, y);\n\t}\n\t\t\n    this.texture.needsUpdate = true;\n}\n\nE2.p.prototype.update_output = function(slot) {\n\treturn this.texture\n}\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.texture = new THREE.Texture(this.canvas2d);\n\t\tthis.text = '';\n\t\tthis.width = 128;\n\t\tthis.height = 128;\n\t\tthis.x = 10;\n\t\tthis.y = 10;\n\t\tthis.font_style = 'bold 16px arial';\n\t\tthis.fill_style = '#fff';\n\t\tthis.stroke_style = 'none';\n\t\tthis.stroke_width = 0;\n\t\tthis.align = 'center';\n\t\tthis.baseline = 'middle';\n\t\tthis.line_height = 1.2;\n\t}\n}\n"
  },
  {
    "path": "browser/plugins/texture_height_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"texture_height_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits the supplied texture height.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'texture', dt: core.datatypes.TEXTURE, desc: 'The texture to emit the height of.', def: null }\n\t];\n\t\n\tthis.output_slots = [ \n\t\t{ name: 'height', dt: core.datatypes.FLOAT, desc: 'The supplied texture height.' }\n\t];\n\t\n\tthis.height = 0;\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.height = 0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.height = data ? parseInt(data.height, 10) : 0;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.height;\n};\n"
  },
  {
    "path": "browser/plugins/texture_width_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"texture_width_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits the supplied texture width.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'texture', dt: core.datatypes.TEXTURE, desc: 'The texture to emit the width of.', def: null }\n\t];\n\t\n\tthis.output_slots = [ \n\t\t{ name: 'width', dt: core.datatypes.FLOAT, desc: 'The supplied texture width.' }\n\t];\n\t\n\tthis.width = 0;\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.width = 0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.width = data ? parseInt(data.width, 10) : 0;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.width;\n};\n"
  },
  {
    "path": "browser/plugins/three_ambient_light.plugin.js",
    "content": "(function() {\n\tvar ThreeAmbientLightPlugin = E2.plugins.three_ambient_light = function(core) {\n\t\tThreeObject3DPlugin.apply(this, arguments)\n\n\t\tthis.input_slots = [\n\t\t\t{ name: 'color', dt: core.datatypes.COLOR }\n\t\t]\n\n\t\tthis.desc = 'THREE.js Ambient Light'\n\t}\n\n\tThreeAmbientLightPlugin.prototype = Object.create(ThreeObject3DPlugin.prototype)\n\n\tThreeAmbientLightPlugin.prototype.reset = function() {\n\t\tThreeObject3DPlugin.prototype.reset.apply(this)\n\n\t\tthis.setObject3D(new THREE.AmbientLight( 0x777777 )) // soft white light\n\t}\n\n\tThreeAmbientLightPlugin.prototype.update_input = function(slot, data) {\n\t\tif (!this.object3d)\n\t\t\treturn;\n\n\t\tthis.object3d.color = data\n\t}\n\n\t// disable scaling & quaternion, they don't make sense for ambient lights\n\t// (position doesn't either but we'll keep it so that the helper can\n\t// be moved out of the way)\n\tThreeAmbientLightPlugin.prototype.canEditScale = function() {\n\t\treturn false\n\t}\n\n\tThreeAmbientLightPlugin.prototype.canEditQuaternion = function() {\n\t\treturn false\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_clickable_object.plugin.js",
    "content": "(function() {\n\tvar ThreeClickableObject = E2.plugins.three_clickable_object = function(core) {\n\t\tthis.desc = 'Clickable object. When gaze clicking on this object, ' +\n\t\t            '\\'objectClicked\\' events are sent. objectClicked events ' +\n\t\t             'can be received by using the \\'On Runtime Event\\' plugin.'\n\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.input_slots = [\n\t\t\t{name: 'object3d', dt: core.datatypes.OBJECT3D},\n\t\t\t{name: 'eventName', dt: core.datatypes.TEXT, def: 'objectClicked'}\n\t\t]\n\n\t\tthis.output_slots = [\n\t\t\t{name: 'object3d', dt: core.datatypes.OBJECT3D}\n\t\t]\n\n\t\tthis.eventName = 'objectClicked'\n\t}\n\n\tThreeClickableObject.prototype.reset = function() {\n\t\tthis.meshDirty = false\n\t}\n\n\tThreeClickableObject.prototype.update_input = function(slot, data) {\n\t\tswitch(slot.index) {\n\t\tcase 0: // object3d\n\t\t\tthis.object3d = data\n\t\t\tthis.meshDirty = true\n\t\t\tbreak\n\t\tcase 1: // eventName\n\t\t\tthis.eventName = data\n\t\t\tbreak\n\t\tdefault:\n\t\t\tbreak\n\t\t}\n\t}\n\n\tThreeClickableObject.prototype.update_output = function() {\n\t\treturn this.object3d\n\t}\n\n\tThreeClickableObject.prototype.on_click = function() {\n\t\tE2.core.runtimeEvents.emit(this.eventName, this.object3d)\n\t}\n\n\tThreeClickableObject.prototype.update_state = function() {\n\t\tif (!this.meshDirty)\n\t\t\treturn\n\n\t\tif (this.object3d && !this.object3d.clickable) {\n\t\t\tvar clickFun = this.on_click.bind(this)\n\t\t\tthis.object3d.clickable = true\n\t\t\tthis.object3d.onClick = clickFun\n\t\t}\n\n\t\tthis.meshDirty = false\n\t}\n})()"
  },
  {
    "path": "browser/plugins/three_cube_material.plugin.js",
    "content": "(function() {\n\tvar ThreeCubeMaterial = E2.plugins.three_cube_material = function (core) {\n\t\tAbstractThreeMaterialPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'Cube Shader Material. '\n\n\n\t\tvar deftex = E2.core.assetLoader.loadingTexture.image\n\n\t\tvar defTexture = new THREE.CubeTexture([deftex, deftex, deftex, deftex, deftex, deftex])\n\t\tdefTexture.needsUpdate = true\n\n\n\t\tthis.input_slots = [{\n\t\t\tname:   'cube texture',\n\t\t\tdt:     core.datatypes.CUBETEXTURE,\n\t\t\tdesc:   'Cube Texture',\n\t\t\tdef:    defTexture\n\t\t}, {\n\t\t\tname:   'depthWrite',\n\t\t\tdt:     core.datatypes.BOOL,\n\t\t\tdesc:   'enable / disable writing to the depth buffer',\n\t\t\tdef:    false\n\t\t}].concat(this.input_slots)\n\n\t\t// fix up default material inputs\n\t\tfor (var i = 0; i < this.input_slots.length; ++i) {\n\t\t\tif (this.input_slots[i].name === 'side') {\n\t\t\t\t// default side is 'double sided'\n\t\t\t\tthis.input_slots[i].def = 2\n\t\t\t}\n\t\t}\n\n\t\tthis.output_slots = [{\n\t\t\tname:   'material',\n\t\t\tdt:     core.datatypes.MATERIAL,\n\t\t\tdesc:   'Cube Shader Material'\n\t\t}]\n\n\t\tvar defaultUniforms = {\n\t\t\ttCube: { type: 't', value: defTexture },\n\t\t\ttFlip: { type: 'f', value: 1 }\n\t\t}\n\n\t\tvar shader = THREE.ShaderLib.cube\n\n\t\tthis.material = new THREE.ShaderMaterial({\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tuniforms: defaultUniforms,\n\t\t\tdepthWrite: false,\n\t\t\tside: THREE.DoubleSide\n\t\t})\n\t}\n\n\tThreeCubeMaterial.prototype = Object.create(AbstractThreeMaterialPlugin.prototype)\n\n\tThreeCubeMaterial.prototype.update_input = function(slot, data) {\n\t\tif (slot.name === 'cube texture') {\n\t\t\tthis.material.uniforms.tCube.value = data\n\n\t\t\tthis.material.needsUpdate = true\n\t\t}\n\t\telse {\n\t\t\tAbstractThreeMaterialPlugin.prototype.update_input.apply(this, arguments)\n\t\t}\n\t}\n\n})()"
  },
  {
    "path": "browser/plugins/three_directional_light.plugin.js",
    "content": "(function() {\n\tvar ThreeDirectionalLightPlugin = E2.plugins.three_directional_light = function(core) {\n\t\tThreeObject3DPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'THREE.js Directional Light'\n\n\t\tthis.params = {\n\t\t\tcolor: new THREE.Color(0xffffff),\n\t\t\tintensity: 1.0\n\t\t}\n\n\t\tthis.input_slots = [\n\t\t\t{ name: 'intensity', dt: core.datatypes.FLOAT, def: this.params.intensity },\n\t\t\t{ name: 'color', dt: core.datatypes.COLOR, def: this.params.color },\n\t\t\t{ name: 'shadow radius', dt: core.datatypes.FLOAT, def: 1 },\n\t\t\t{ name: 'shadow darkness', dt: core.datatypes.FLOAT, def: 1}\n\t\t].concat(this.input_slots)\n\n\t\tthis.always_update = true\n\t}\n\n\tThreeDirectionalLightPlugin.prototype = Object.create(ThreeObject3DPlugin.prototype)\n\n\tThreeDirectionalLightPlugin.prototype.reset = function() {\n\t\tThreeObject3DPlugin.prototype.reset.apply(this, arguments)\n\n\t\tthis.setObject3D(new THREE.DirectionalLight( 0xffffff, this.params.intensity ))\n\t}\n\n\tThreeDirectionalLightPlugin.prototype.update_state = function() {\n\t\tThreeObject3DPlugin.prototype.update_state.apply(this, arguments)\n\n\t\tthis.object3d.updateMatrixWorld()\n\n\t\tvar directionVector = new THREE.Vector3(0, -1, 0)\n\t\tdirectionVector.applyMatrix4(this.object3d.matrixWorld)\n\t\tthis.object3d.target.position.copy(directionVector)\n\t\tthis.object3d.target.updateMatrixWorld()\n\t}\n\n\tThreeDirectionalLightPlugin.prototype.update_input = function(slot, data) {\n\t\tif (slot.name === 'shadow radius') {\n\t\t\tthis.object3d.shadow.radius = data\n\t\t}\n\t\telse if (slot.name === 'shadow darkness') {\n\t\t\tthis.object3d.shadow.darkness = data\n\t\t}\n\t\telse {\n\t\t\tThreeObject3DPlugin.prototype.update_input.apply(this, arguments)\n\t\t}\n\t}\n\n\t// disable scaling, it doesn't make sense for lights\n\tThreeDirectionalLightPlugin.prototype.canEditScale = function() {\n\t\treturn false\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_environment_settings.plugin.js",
    "content": "(function() {\n\tvar ThreeEnvironmentSettingsPlugin = E2.plugins.three_environment_settings = function (core, node) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'Environment Settings Description'\n\n\t\tthis.input_slots = [{\n\t\t\tname: 'fog color',\n\t\t\tdt: core.datatypes.COLOR,\n\t\t\tdef: new THREE.Color(0xffffff)\n\t\t}, {\n\t\t\tname: 'fog near',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 0.1\n\t\t}, {\n\t\t\tname: 'fog far',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 1000.0\n\t\t}]\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'environment',\n\t\t\tdt: core.datatypes.ENVIRONMENTSETTINGS\n\t\t}]\n\t}\n\n\tThreeEnvironmentSettingsPlugin.prototype = Object.create(Plugin.prototype)\n\n\tThreeEnvironmentSettingsPlugin.prototype.reset = function() {\n\t\tthis.envSettings = new E2.EnvironmentSettings()\n\t}\n\n\tThreeEnvironmentSettingsPlugin.prototype.update_input = function(slot, data) {\n\t\tif (slot.name === 'fog color') {\n\t\t\tthis.envSettings.fog.color = data\n\t\t}\n\t\telse if (slot.name === 'fog near') {\n\t\t\tthis.envSettings.fog.near = data\n\t\t}\n\t\telse if (slot.name === 'fog far') {\n\t\t\tthis.envSettings.fog.far = data\n\t\t}\n\t}\n\n\tThreeEnvironmentSettingsPlugin.prototype.update_output = function() {\n\t\treturn this.envSettings\n\t}\n})()\n"
  },
  {
    "path": "browser/plugins/three_gaze_clicker.plugin.js",
    "content": "(function() {\n\tvar ThreeGazeClicker = E2.plugins.three_gaze_clicker = function(core) {\n\t\tthis.desc = 'Gaze Clicker'\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.core = core\n\n\t\tthis.iconDistance = 0.030\n\n\t\tthis.input_slots = [\n\t\t\t{name: 'camera', dt: core.datatypes.CAMERA},\n\t\t\t{name: 'scene', dt: core.datatypes.SCENE},\n\t\t\t{name: 'delay', dt: core.datatypes.FLOAT, def: 1.0},\n\t\t\t{name: 'show icon', dt: core.datatypes.BOOL, def: true},\n\t\t\t{name: 'eye distance', dt: core.datatypes.FLOAT, def: this.iconDistance,\n\t\t\t desc: 'Eye Distance for Gaze Clicker icon in VR'}\n\t\t]\n\n\t\tthis.output_slots = [\n\t\t\t{name: 'scene', dt: core.datatypes.SCENE},\n\t\t\t{name: 'object', dt: core.datatypes.OBJECT3D}\n\t\t]\n\n\t\tthis.always_update = true\n\t\tthis.showIcon = true\n\t}\n\n\tThreeGazeClicker.prototype = Object.create(Plugin.prototype)\n\n\tThreeGazeClicker.prototype.update_input = function(slot, data) {\n\t\tswitch (slot.index) {\n\t\t\tcase 0: // camera\n\t\t\t\tthis.camera = data\n\t\t\t\tbreak\n\t\t\tcase 1: // scene\n\t\t\t\tthis.scene = data\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\tbreak\n\t\t}\n\t}\n\n\tThreeGazeClicker.prototype.update_output = function(slot) {\n\t\tif (slot.index === 0) {\n\t\t\treturn this.scene\n\t\t}\n\t\telse if (slot.index === 1) {\n\t\t\treturn E2.app.player.rayInput.renderer.getSelectedMesh()\n\t\t}\n\t}\n\n\tThreeGazeClicker.prototype.state_changed = function(ui) {\n\t\tif (ui)\n\t\t\treturn\n\n\t\tthis.rayInput = E2.app.player.rayInput\n\t\tthis.object3d = this.rayInput.getMesh()\n\t}\n\n\tThreeGazeClicker.prototype.update_state = function() {\n\t\tif (!this.scene || !this.camera) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.rayInput.update(this.scene.children[0].children)\n\n\t\tif (this.scene.hasClickableObjects && this.showIcon !== false) {\n\t\t\tif (this.scene.children[1].children.indexOf(this.object3d) < 0) {\n\t\t\t\tthis.scene.children[1].add(this.object3d)\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (this.scene.children[1].children.indexOf(this.object3d) >= 0) {\n\t\t\t\tthis.scene.children[1].remove(this.object3d)\n\t\t\t}\n\t\t}\n\t}\n\n})()"
  },
  {
    "path": "browser/plugins/three_geometry_box.plugin.js",
    "content": "(function() {\n\tvar ThreeBoxGeometryPlugin = E2.plugins.three_geometry_box = function(core) {\n\t\tthis.desc = 'THREE.js Box Geometry'\n\t\t\n\t\tthis.input_slots = [{\n\t\t\tname: 'subdivisions',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 1,\n\t\t\tvalidate: function(v) {return Math.max(0, Math.min(v, 50))}\n\t\t}]\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'geometry',\n\t\t\tdt: core.datatypes.GEOMETRY\n\t\t}]\n\n\t\tthis.subdivisions = 1\n\t}\n\n\tThreeBoxGeometryPlugin.prototype.reset = function() {\n\t\tthis.geometry = new THREE.BufferGeometry().fromGeometry(new THREE.BoxGeometry(1, 1, 1, this.subdivisions, this.subdivisions, this.subdivisions))\n\t}\n\n\tThreeBoxGeometryPlugin.prototype.update_input = function(slot, data) {\n\t\tif (this.subdivisions !== data) {\n\t\t\tthis.subdivisions = data\n\t\t\tthis.geometry = new THREE.BufferGeometry().fromGeometry(new THREE.BoxGeometry(1, 1, 1, this.subdivisions,this.subdivisions,this.subdivisions))\n\t\t}\n\t}\n\n\tThreeBoxGeometryPlugin.prototype.update_output = function() {\n\t\treturn this.geometry\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_geometry_circle.plugin.js",
    "content": "(function() {\n\tvar ThreeCircleGeometryPlugin = E2.plugins.three_geometry_circle = function(core) {\n\t\tthis.desc = 'THREE.js Circle Geometry'\n\t\t\n\t\tthis.input_slots = [\n\t\t\t{ name: 'radius', dt: core.datatypes.FLOAT, def: 5 },\n\t\t\t{ name: 'segments', dt: core.datatypes.FLOAT, def: 8,\n\t\t\t\tvalidate: function(v) {return Math.max(0, Math.min(v, 100))} },\n\t\t\t{ name: 'thetaStart', dt: core.datatypes.FLOAT, def: 0, desc: 'Vertical starting angle' },\n\t\t\t{ name: 'thetaLength', dt: core.datatypes.FLOAT, def: 2 * Math.PI, desc: 'Vertical sweep angle size' },\n\t\t]\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'geometry',\n\t\t\tdt: core.datatypes.GEOMETRY\n\t\t}]\n\t}\n\n\tThreeCircleGeometryPlugin.prototype.reset = function() {\n\t\tPlugin.prototype.reset.call(this)\n\t\tthis.geometry = this.createGeometry()\n\t}\n\n\tThreeCircleGeometryPlugin.prototype.createGeometry = function() {\n\t\tvar geom = new THREE.CircleGeometry(\n\t\t\tthis.inputValues.radius,\n\t\t\tthis.inputValues.segments,\n\t\t\tthis.inputValues.thetaStart,\n\t\t\tthis.inputValues.thetaLength\n\t\t)\n\t\treturn new THREE.BufferGeometry().fromGeometry(geom)\n\t}\n\n\tThreeCircleGeometryPlugin.prototype.update_input = function() {\n\t\tPlugin.prototype.update_input.apply(this, arguments)\n\t\tthis.geometry = this.createGeometry()\n\t}\n\n\tThreeCircleGeometryPlugin.prototype.update_output = function() {\n\t\treturn this.geometry\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_geometry_cylinder.plugin.js",
    "content": "(function() {\n\tvar ThreeCylinderGeometryPlugin = E2.plugins.three_geometry_cylinder = function(core) {\n\t\tthis.desc = 'THREE.js Cylinder Geometry'\n\t\t\n\t\tthis.input_slots = [\n\t\t\t{ name: 'radiusTop', dt: core.datatypes.FLOAT, def: 20 },\n\t\t\t{ name: 'radiusBottom', dt: core.datatypes.FLOAT, def: 20 },\n\t\t\t{ name: 'height', dt: core.datatypes.FLOAT, def: 100 },\n\t\t\t{ name: 'radiusSegments', dt: core.datatypes.FLOAT, def: 8,\n\t\t\t\tvalidate: function(v) {return Math.max(0, Math.min(v, 50))} },\n\t\t\t{ name: 'heightSegments', dt: core.datatypes.FLOAT, def: 1,\n\t\t\t\tvalidate: function(v) {return Math.max(0, Math.min(v, 25))} },\n\t\t\t{ name: 'openEnded', dt: core.datatypes.BOOL, def: false },\n\t\t\t{ name: 'thetaStart', dt: core.datatypes.FLOAT, def: 0, desc: 'Vertical starting angle' },\n\t\t\t{ name: 'thetaLength', dt: core.datatypes.FLOAT, def: 2 * Math.PI, desc: 'Vertical sweep angle size' },\n\t\t]\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'geometry',\n\t\t\tdt: core.datatypes.GEOMETRY\n\t\t}]\n\t}\n\n\tThreeCylinderGeometryPlugin.prototype.reset = function() {\n\t\tPlugin.prototype.reset.call(this)\n\t\tthis.geometry = this.createGeometry()\n\t}\n\n\tThreeCylinderGeometryPlugin.prototype.createGeometry = function() {\n\t\tvar geom = new THREE.CylinderGeometry(\n\t\t\tthis.inputValues.radiusTop,\n\t\t\tthis.inputValues.radiusBottom,\n\t\t\tthis.inputValues.height,\n\t\t\tMath.floor(this.inputValues.radiusSegments),\n\t\t\tMath.floor(this.inputValues.heightSegments),\n\t\t\tthis.inputValues.openEnded,\n\t\t\tthis.inputValues.thetaStart,\n\t\t\tthis.inputValues.thetaLength\n\t\t)\n\n\t\treturn new THREE.BufferGeometry().fromGeometry(geom)\n\t}\n\n\tThreeCylinderGeometryPlugin.prototype.update_input = function() {\n\t\tPlugin.prototype.update_input.apply(this, arguments)\n\t\tthis.geometry = this.createGeometry()\n\t}\n\n\tThreeCylinderGeometryPlugin.prototype.update_output = function() {\n\t\treturn this.geometry\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_geometry_dodecahedron.plugin.js",
    "content": "(function() {\n\tvar ThreeDodecahedronGeometryPlugin = E2.plugins.three_geometry_dodecahedron = function(core) {\n\t\tthis.desc = 'THREE.js Dodecahedron Geometry'\n\t\t\n\t\tthis.input_slots = [\n\t\t\t{   name: 'radius', dt: core.datatypes.FLOAT, def: 5 },\n\t\t\t{   name: 'detail', dt: core.datatypes.FLOAT, def: 2,\n\t\t\t\tvalidate: function(v) {return Math.max(0, Math.min(v, 4))} },\n\t\t]\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'geometry',\n\t\t\tdt: core.datatypes.GEOMETRY\n\t\t}]\n\t}\n\n\tThreeDodecahedronGeometryPlugin.prototype.reset = function() {\n\t\tPlugin.prototype.reset.call(this)\n\t\tthis.geometry = this.createGeometry()\n\t}\n\n\tThreeDodecahedronGeometryPlugin.prototype.createGeometry = function() {\n\t\tvar geom = new THREE.DodecahedronGeometry(\n\t\t\tthis.inputValues.radius,\n\t\t\tMath.floor(this.inputValues.detail)\n\t\t)\n\t\n\t\treturn new THREE.BufferGeometry().fromGeometry(geom)\n\t}\n\n\tThreeDodecahedronGeometryPlugin.prototype.update_input = function() {\n\t\tPlugin.prototype.update_input.apply(this, arguments)\n\t\tthis.geometry = this.createGeometry()\n\t}\n\n\tThreeDodecahedronGeometryPlugin.prototype.update_output = function() {\n\t\treturn this.geometry\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_geometry_plane.plugin.js",
    "content": "(function() {\n\tvar ThreePlaneGeometryPlugin = E2.plugins.three_geometry_plane = function(core) {\n\t\tthis.desc = 'THREE.js Plane Geometry'\n\t\t\n\t\tthis.input_slots = [\n\t\t\t{ name: 'width', dt: core.datatypes.FLOAT, def: 5 },\n\t\t\t{ name: 'height', dt: core.datatypes.FLOAT, def: 5 },\n\t\t\t{ name: 'widthSegments', dt: core.datatypes.FLOAT, def: 1, desc: 'Number of horizontal segments',\n\t\t\t\tvalidate: function(v) {return Math.max(0, Math.min(v, 50))}  },\n\t\t\t{ name: 'heightSegments', dt: core.datatypes.FLOAT, def: 1, desc: 'Number of vertical segments',\n\t\t\t\tvalidate: function(v) {return Math.max(0, Math.min(v, 50))}  },\n\t\t]\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'geometry',\n\t\t\tdt: core.datatypes.GEOMETRY\n\t\t}]\n\t}\n\n\tThreePlaneGeometryPlugin.prototype.reset = function() {\n\t\tPlugin.prototype.reset.call(this)\n\t\tthis.geometry = this.createGeometry()\n\t}\n\n\tThreePlaneGeometryPlugin.prototype.createGeometry = function() {\n\t\tvar geom = new THREE.PlaneGeometry(\n\t\t\tthis.inputValues.width,\n\t\t\tthis.inputValues.height,\n\t\t\tMath.floor(this.inputValues.widthSegments),\n\t\t\tMath.floor(this.inputValues.heightSegments)\n\t\t)\n\n\t\treturn new THREE.BufferGeometry().fromGeometry(geom)\n\t}\n\n\tThreePlaneGeometryPlugin.prototype.update_input = function() {\n\t\tPlugin.prototype.update_input.apply(this, arguments)\n\t\tthis.geometry = this.createGeometry()\n\t}\n\n\tThreePlaneGeometryPlugin.prototype.update_output = function() {\n\t\treturn this.geometry\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_geometry_ring.plugin.js",
    "content": "(function() {\n\tvar ThreeRingGeometryPlugin = E2.plugins.three_geometry_ring = function(core) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'THREE.js Ring Geometry'\n\n\t\tthis.input_slots = [{\n\t\t\tname: 'innerRadius',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 0\n\t\t},\n\t\t{\n\t\t\tname: 'outerRadius',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 1\n\t\t},\n\t\t{\n\t\t\tname: 'thetaSegments',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 8\n\t\t},\n\t\t{\n\t\t\tname: 'phiSegments',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 8\n\t\t},\n\t\t{\n\t\t\tname: 'thetaStart',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 0\n\t\t},\n\t\t{\n\t\t\tname: 'thetaLength',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: Math.PI * 2\n\t\t}]\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'geometry',\n\t\t\tdt: core.datatypes.GEOMETRY\n\t\t}]\n\n\t\tthis.subdivisions = 1\n\n\t\tthis.geometryDirty = true\n\t}\n\n\tThreeRingGeometryPlugin.prototype = Object.create(Plugin.prototype)\n\n\tThreeRingGeometryPlugin.prototype.generateGeometry = function() {\n\t\tthis.geometry = new THREE.BufferGeometry().fromGeometry(\n\t\tnew THREE.RingGeometry(\n\t\t\tthis.inputValues.innerRadius,\n\t\t\tthis.inputValues.outerRadius,\n\t\t\tthis.inputValues.thetaSegments,\n\t\t\tthis.inputValues.phiSegments,\n\t\t\tthis.inputValues.thetaStart,\n\t\t\tthis.inputValues.thetaLength))\n\n\t\tthis.geometryDirty = false\n\t}\n\n\tThreeRingGeometryPlugin.prototype.update_input = function(slot, data) {\n\t\tif (this.inputValues[slot.name] !== data) {\n\t\t\tthis.geometryDirty = true\n\t\t}\n\n\t\tPlugin.prototype.update_input.apply(this, arguments)\n\t}\n\n\tThreeRingGeometryPlugin.prototype.update_state = function() {\n\t\tif (this.geometryDirty) {\n\t\t\tthis.generateGeometry()\n\t\t}\n\t}\n\n\tThreeRingGeometryPlugin.prototype.update_output = function() {\n\t\treturn this.geometry\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_geometry_sphere.plugin.js",
    "content": "(function() {\n\tvar ThreeSphereGeometryPlugin = E2.plugins.three_geometry_sphere = function(core) {\n\t\tthis.desc = 'THREE.js Sphere Geometry'\n\n\t\tthis.input_slots = [\n\t\t\t{\n\t\t\t\tname: 'radius',\n\t\t\t\tdt: core.datatypes.FLOAT,\n\t\t\t\tdef: 1\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'widthSegments',\n\t\t\t\tdt: core.datatypes.FLOAT,\n\t\t\t\tdef: 8,\n\t\t\t\tdesc: 'Number of horizontal segments',\n\t\t\t\tvalidate: function(v) {return Math.max(0, Math.min(v, 50))}\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'heightSegments',\n\t\t\t\tdt: core.datatypes.FLOAT,\n\t\t\t\tdef: 6,\n\t\t\t\tdesc: 'Number of vertical segments',\n\t\t\t\tvalidate: function(v) {return Math.max(0, Math.min(v, 50))}\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'phiStart',\n\t\t\t\tdt: core.datatypes.FLOAT,\n\t\t\t\tdef: 0, desc: 'Horizontal starting angle'\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'phiLength',\n\t\t\t\tdt: core.datatypes.FLOAT,\n\t\t\t\tdef: 2 * Math.PI, desc: 'Horizontal sweep angle size'\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'thetaStart',\n\t\t\t\tdt: core.datatypes.FLOAT,\n\t\t\t\tdef: 0, desc: 'Vertical starting angle'\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'thetaLength',\n\t\t\t\tdt: core.datatypes.FLOAT,\n\t\t\t\tdef: Math.PI,\n\t\t\t\tdesc: 'Vertical sweep angle size'\n\t\t\t}\n\t\t]\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'geometry',\n\t\t\tdt: core.datatypes.GEOMETRY\n\t\t}]\n\t}\n\n\tThreeSphereGeometryPlugin.prototype.reset = function() {\n\t\tPlugin.prototype.reset.call(this)\n\t\tthis.geometry = this.createGeometry()\n\t}\n\n\tThreeSphereGeometryPlugin.prototype.createGeometry = function() {\n\t\treturn new THREE.SphereBufferGeometry(\n\t\t\tthis.inputValues.radius,\n\t\t\tMath.floor(this.inputValues.widthSegments),\n\t\t\tMath.floor(this.inputValues.heightSegments),\n\t\t\tthis.inputValues.phiStart,\n\t\t\tthis.inputValues.phiLength,\n\t\t\tthis.inputValues.thetaStart,\n\t\t\tthis.inputValues.thetaLength\n\t\t)\n\t}\n\n\tThreeSphereGeometryPlugin.prototype.update_input = function() {\n\t\tPlugin.prototype.update_input.apply(this, arguments)\n\t\tthis.geometry = this.createGeometry()\n\t}\n\n\tThreeSphereGeometryPlugin.prototype.update_output = function() {\n\t\treturn this.geometry\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_geometry_torus.plugin.js",
    "content": "(function() {\n\tvar ThreeTorusGeometryPlugin = E2.plugins.three_geometry_torus = function(core) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'THREE.js Torus Geometry'\n\n\t\tthis.input_slots = [{\n\t\t\tname: 'radius',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 1\n\t\t},\n\t\t{\n\t\t\tname: 'tube',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 0.4\n\t\t},\n\t\t{\n\t\t\tname: 'radialSegments',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 8\n\t\t},\n\t\t{\n\t\t\tname: 'tubularSegments',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 6\n\t\t},\n\t\t{\n\t\t\tname: 'arc',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: Math.PI * 2\n\t\t}]\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'geometry',\n\t\t\tdt: core.datatypes.GEOMETRY\n\t\t}]\n\n\t\tthis.subdivisions = 1\n\n\t\tthis.geometryDirty = true\n\t}\n\n\tThreeTorusGeometryPlugin.prototype = Object.create(Plugin.prototype)\n\n\tThreeTorusGeometryPlugin.prototype.generateGeometry = function() {\n\t\tthis.geometry = new THREE.BufferGeometry().fromGeometry(\n\t\t\tnew THREE.TorusGeometry(\n\t\t\t\tthis.inputValues.radius,\n\t\t\t\tthis.inputValues.tube,\n\t\t\t\tMath.floor(this.inputValues.radialSegments),\n\t\t\t\tMath.floor(this.inputValues.tubularSegments),\n\t\t\t\tthis.inputValues.arc))\n\n\t\tthis.geometryDirty = false\n\t}\n\n\tThreeTorusGeometryPlugin.prototype.update_input = function(slot, data) {\n\t\tthis.geometryDirty = true\n\n\t\tPlugin.prototype.update_input.apply(this, arguments)\n\t}\n\n\tThreeTorusGeometryPlugin.prototype.update_state = function() {\n\t\tif (this.geometryDirty) {\n\t\t\tthis.generateGeometry()\n\t\t}\n\t}\n\n\tThreeTorusGeometryPlugin.prototype.update_output = function() {\n\t\treturn this.geometry\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_group.plugin.js",
    "content": "(function() {\n\tvar ThreeGroupPlugin = E2.plugins.three_group = function(core, node) {\n\t\tThreeObject3DPlugin.apply(this, arguments)\n\n\t\tthis.node = node\n\n\t\tthis.desc = 'Group several object3ds together so that they can be manipulated as one'\n\n\t\tthis.input_slots = [].concat(this.input_slots)\n\n\t\tthis.lsg = new AutoSlotGroup(core, node, [], [])\n\t\tthis.lsg.set_dt(core.datatypes.OBJECT3D)\n\n\t\tvar that = this\n\n\t\tthis.node.on('slotAdded', function () {\n\t\t\tthat.dynInputs = node.getDynamicInputSlots()\n\t\t\tthat.updated = true\n\t\t})\n\n\t\tthis.node.on('slotRemoved', function () {\n\t\t\tthat.dynInputs = node.getDynamicInputSlots()\n\t\t\tthat.updated = true\n\t\t})\n\n\t\tthis.lastCenter = new THREE.Vector3()\n\n\t\tthis.setObject3D(new THREE.Group())\n\t\tthis.object3d.name = 'group_plugin'\n\t}\n\n\tThreeGroupPlugin.prototype = Object.create(ThreeObject3DPlugin.prototype)\n\n\tThreeGroupPlugin.prototype.update_input = function(slot, data) {\n\t\tif (slot.dynamic) {\n\t\t\tvar parent = this.object3d.children[slot.index]\n\n\t\t\tif (data) {\n\t\t\t\tif (slot.array) {\n\t\t\t\t\tparent.children = data\n\n\t\t\t\t\tfor (var i = 0; i < data.length; ++i) {\n\t\t\t\t\t\tif (data[i].parent && data[i].parent !== parent) {\n\t\t\t\t\t\t\t// the object is in another scene, remove from there\n\t\t\t\t\t\t\tdata[i].parent.remove(data[i])\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata[i].parent = parent\n\t\t\t\t\t\tdata[i].dispatchEvent({type: 'added'})\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (data.parent && data.parent !== this) {\n\t\t\t\t\t\t// the objects is in another scene, remove from there\n\t\t\t\t\t\tdata.parent.remove(data)\n\t\t\t\t\t}\n\n\t\t\t\t\tparent.children = [data]\n\n\t\t\t\t\tdata.parent = parent\n\t\t\t\t\tdata.dispatchEvent({type: 'added'})\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\twhile (parent.children.length > 0) {\n\t\t\t\t\tparent.remove(parent.children[0])\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.pivotNeedsUpdate = true\n\t\t}\n\t\telse {\n\t\t\tThreeObject3DPlugin.prototype.update_input.apply(this, arguments)\n\t\t}\n\t}\n\n\tThreeGroupPlugin.prototype.update_state = function() {\n\t\tif (this.pivotNeedsUpdate) {\n\t\t\tthis.updatePivot()\n\t\t}\n\n\t\tThreeObject3DPlugin.prototype.update_state.apply(this, arguments)\n\t}\n\n\tThreeGroupPlugin.prototype.connection_changed = function(on, conn, slot) {\n\t\tif (on && slot.dynamic) {\n\t\t\t// ensure there is a sufficient amount of slots\n\t\t\twhile (this.object3d.children.length < this.dynInputs.length) {\n\t\t\t\tthis.object3d.add(new THREE.Group())\n\t\t\t}\n\t\t}\n\n\t\t// disconnect\n\t\tif (!on && slot.type === E2.slot_type.input && slot.dynamic) {\n\t\t\tvar parent = this.object3d.children[slot.index]\n\n\t\t\twhile (parent.children.length > 0) {\n\t\t\t\tparent.remove(parent.children[0])\n\t\t\t}\n\t\t}\n\n\t\t// connect\n\t\telse if (on && slot.type === E2.slot_type.input && slot.dynamic) {\n\t\t\tthis.object3d.children[slot.index].children = []\n\t\t}\n\n\t\tthis.pivotNeedsUpdate = true\n\t}\n\n\tThreeGroupPlugin.prototype.state_changed = function(ui) {\n\t\tif (ui) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.dynInputs = this.node.getDynamicInputSlots()\n\n\t\tif (!this.dynInputs.length) {\n\t\t\tthis.node.add_slot(E2.slot_type.input, {\n\t\t\t\tname: '0',\n\t\t\t\tdt: E2.dt.OBJECT3D,\n\t\t\t\tarray: false\n\t\t\t})\n\n\t\t\tthis.dynInputs = this.node.getDynamicInputSlots()\n\t\t}\n\n\t\tfor(var i = 0, len = this.dynInputs.length; i < len; i++) {\n\t\t\tthis.lsg.add_dyn_slot(this.dynInputs[i])\n\t\t\tthis.object3d.add(new THREE.Group())\n\t\t}\n\n\t\tthis.lsg.infer_dt()\n\t}\n\n\tThreeGroupPlugin.prototype.updatePivot = function() {\n\t\tvar center = new THREE.Vector3()\n\t\tvar count = 0\n\n\t\t// create a pivot centered around positions of meshes\n\t\t// connected to this group node\n\t\tfor (var j = 0; j < this.object3d.children.length; ++j) {\n\t\t\tvar parent = this.object3d.children[j]\n\t\t\tfor (var i = 0; i < parent.children.length; ++i) {\n\t\t\t\tvar obj = parent.children[i]\n\n\t\t\t\tif (obj.backReference) {\n\t\t\t\t\tcenter.x += obj.backReference.state.position.x\n\t\t\t\t\tcenter.y += obj.backReference.state.position.y\n\t\t\t\t\tcenter.z += obj.backReference.state.position.z\n\t\t\t\t\t++count\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (count > 1) {\n\t\t\tcenter.divideScalar(count)\n\t\t}\n\n\t\t// set state directly, this will be recalculated on demand\n\t\t// so no need to create an undo step\n\n\t\tvar quat = new THREE.Quaternion(this.object3d.quaternion._x, this.object3d.quaternion._y, this.object3d.quaternion._z, this.object3d.quaternion._w)\n\t\tvar scale = new THREE.Vector3(this.object3d.scale.x, this.object3d.scale.y, this.object3d.scale.z)\n\n\t\tvar m = new THREE.Matrix4().makeRotationFromQuaternion(quat).scale(scale)\n\n\t\tvar translation = center.clone().sub(this.lastCenter).applyMatrix4(m)\n\t\tthis.pivot.x += translation.x\n\t\tthis.pivot.y += translation.y\n\t\tthis.pivot.z += translation.z\n\n\t\tvar gazeClickerCount = 0\n\n\t\tfunction collectClickers(n) {\n\t\t\tfor (var i = 0; i < n.children.length; ++i) {\n\t\t\t\tvar subTree = n.children[i]\n\n\t\t\t\tif (subTree.gazeClickerCount) {\n\t\t\t\t\tgazeClickerCount += subTree.gazeClickerCount\n\t\t\t\t}\n\t\t\t\telse if (subTree.children.length > 0) {\n\t\t\t\t\tcollectClickers(subTree)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tcollectClickers(this.object3d)\n\n\t\tfor (var i = 0; i < this.object3d.children.length; ++i) {\n\t\t\tvar subTree = this.object3d.children[i]\n\n\t\t\tsubTree.position.x = -center.x\n\t\t\tsubTree.position.y = -center.y\n\t\t\tsubTree.position.z = -center.z\n\t\t}\n\n\t\tthis.object3d.gazeClickerCount = gazeClickerCount\n\n\t\tthis.matrixWorldNeedsUpdate = true\n\n\t\tthis.lastCenter.copy(center)\n\n\t\tthis.pivotNeedsUpdate = false\n\t}\n\n})()\n"
  },
  {
    "path": "browser/plugins/three_hemisphere_light.plugin.js",
    "content": "(function() {\n\tvar ThreeHemisphereLightPlugin = E2.plugins.three_hemisphere_light = function(core) {\n\t\tThreeObject3DPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'THREE.js Hemisphere Light'\n\n\t\tthis.params = {\n\t\t\tskyColor: new THREE.Color(0xffffff),\n\t\t\tgroundColor: new THREE.Color(0x684f40),\n\t\t\tintensity: 1.0\n\t\t}\n\n\t\tthis.input_slots = [\n\t\t\t{ name: 'intensity', dt: core.datatypes.FLOAT, def: this.params.intensity },\n\t\t\t{ name: 'color', dt: core.datatypes.COLOR, def: this.params.skyColor },\n\t\t\t{ name: 'groundColor', dt: core.datatypes.COLOR, def: this.params.groundColor },\n\t\t].concat(this.input_slots)\n\t}\n\n\tThreeHemisphereLightPlugin.prototype = Object.create(ThreeObject3DPlugin.prototype)\n\n\tThreeHemisphereLightPlugin.prototype.reset = function() {\n\t\tThreeObject3DPlugin.prototype.reset.apply(this)\n\n\t\tthis.setObject3D(new THREE.HemisphereLight( this.params.skyColor, this.params.groundColor ))\n\t}\n\n\t// disable scaling and quaternion as hemisphere light only has a colour from above and from below\n\tThreeHemisphereLightPlugin.prototype.canEditQuaternion = function() {\n\t\treturn false\n\t}\n\n\tThreeHemisphereLightPlugin.prototype.canEditScale = function() {\n\t\treturn false\n\t}\n\n})()\n"
  },
  {
    "path": "browser/plugins/three_line_material.plugin.js",
    "content": "(function() {\n\tvar ThreeLineMaterialPlugin = E2.plugins.three_line_material = function(core) {\n\t\tAbstractThreeMaterialPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'THREE.js Line Material'\n\n\t\tthis.input_slots = [\n\t\t\t{\tname: 'color', dt: core.datatypes.COLOR },\n\t\t\t{   name: 'linewidth', dt: core.datatypes.FLOAT, def: 1.0 },\n\t\t\t{\tname: 'fog', dt: core.datatypes.BOOL, def: true,\n\t\t\t\tdesc: 'Define whether the material color is affected by global fog settings.'\n\t\t\t},\n\t\t].concat(this.input_slots)\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'material',\n\t\t\tdt: core.datatypes.MATERIAL\n\t\t}]\n\t}\n\n\tThreeLineMaterialPlugin.prototype = Object.create(AbstractThreeMaterialPlugin.prototype)\n\n\tThreeLineMaterialPlugin.prototype.reset = function() {\n\t\tAbstractThreeMaterialPlugin.prototype.reset.call(this)\n\t\tthis.material = new THREE.LineBasicMaterial()\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_line_segments.plugin.js",
    "content": "(function() {\n\tvar createThreeMeshRoot = function() {\n\t\treturn new THREE.Object3D()\n\t}\n\n\tvar createThreeLineSegments = function(geom, mats) {\n\t\tvar pc = new THREE.LineSegments(geom, mats)\n\t\treturn pc\n\t}\n\n\tvar ThreeLineSegmentsPlugin = E2.plugins.three_line_segments = function(core) {\n\t\tAbstractThreeMeshPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'THREE.js Line Segments'\n\n\t\tthis.createMeshRoot = createThreeMeshRoot\n\t\tthis.createAnimatedMesh = createThreeLineSegments\n\t\tthis.createMesh = createThreeLineSegments\n\t}\n\n\tThreeLineSegmentsPlugin.prototype = Object.create(AbstractThreeMeshPlugin.prototype)\n\n\tThreeLineSegmentsPlugin.prototype.update_input = function(slot, data) {\n\t\tAbstractThreeMeshPlugin.prototype.update_input.apply(this, arguments)\n\t}\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_loader_model.plugin.js",
    "content": "(function() {\n\tfunction progress() {\n\t\tconsole.log('Loading progress', this.state.url, arguments)\n\t}\n\n\tfunction errorHandler(err) {\n\t\tmsg('ERROR: '+err.toString())\n\t}\n\n\tvar ThreeLoaderModelPlugin = E2.plugins.three_loader_model = function(core) {\n\t\tAbstractThreeLoaderObjPlugin.apply(this, arguments)\n\t}\n\n\tThreeLoaderModelPlugin.prototype = Object.create(AbstractThreeLoaderObjPlugin.prototype)\n\n\tThreeLoaderModelPlugin.prototype.getDefaultMaterials = function() {\n\t\treturn [new THREE.MeshBasicMaterial()]\n\t}\n\n\tThreeLoaderModelPlugin.prototype.getDefaultGeometries = function() {\n\t\treturn [new THREE.Geometry()]\n\t}\n\n\tThreeLoaderModelPlugin.prototype.create_ui = function() {\n\t\tvar inp = makeButton('Change', 'No model selected.', 'url')\n\t\tvar that = this\n\t\t\n\t\tinp.click(function() {\n\t\t\tvar oldValue = that.state.url\n\t\t\tvar newValue\n\n\t\t\tFileSelectControl\n\t\t\t\t.createSceneSelector(that.state.url)\n\t\t\t\t.onChange(function(v) {\n\t\t\t\t\tnewValue = that.state.url = v\n\t\t\t\t\tthat.state_changed(null)\n\t\t\t\t\tthat.state_changed(inp)\n\t\t\t\t\tthat.updated = true\n\n\t\t\t\t\tE2.track({\n\t\t\t\t\t\tevent: 'assetChanged',\n\t\t\t\t\t\tplugin: 'ThreeLoaderModelPlugin',\n\t\t\t\t\t\turl: v\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t.on('closed', function() {\n\t\t\t\t\tif (newValue === oldValue)\n\t\t\t\t\t\treturn\n\n\t\t\t\t\tthat.undoableSetState('url', newValue, oldValue)\n\t\t\t\t})\n\t\t})\n\n\t\treturn inp\n\t}\n\n\tThreeLoaderModelPlugin.prototype.update_state = function() {\n\t\tif (!this.dirty)\n\t\t\treturn\n\n\t\tif (!this.state.url)\n\t\t\treturn;\n\n\t\tvar that = this\n\n\t\tthis.geometries = this.getDefaultGeometries()\n\t\tthis.materials = this.getDefaultMaterials()\n\n\t\tconsole.log('ThreeLoaderModelPlugin loading', this.state.url)\n\n\t\tE2.core.assetLoader\n\t\t.loadAsset('model', this.state.url)\n\t\t.then(function(asset) {\n\t\t\tthat.onObjLoaded(asset.geometries, asset.materials)\n\t\t})\n\n\t\tthis.dirty = false\n\t}\n\n\tThreeLoaderModelPlugin.prototype.update_output = function(slot) {\n\t\tif (slot.index === 0) {\n\t\t\treturn this.geometries\n\t\t}\n\t\tif (slot.index === 1) {\n\t\t\treturn this.materials\n\t\t}\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_loader_scene.plugin.js",
    "content": "(function() {\n\tvar ThreeLoaderScenePlugin = E2.plugins.three_loader_scene = function(core) {\n\t\tThreeObject3DPlugin.apply(this, arguments)\n\n\t\tthis.core = core\n\n\t\tthis.desc = '3D Object/Scene loader. Loads .obj, THREE.js .json, and .glTF object hierarchies.'\n\n\t\tthis.urlDirty = true\n\n\t\t// the url this node should be loading\n\t\tthis.state.url = ''\n\n\t\t// the url we've actually loaded (or are loading)\n\t\tthis.loadedUrl = ''\n\n\t\tthis.input_slots = [].concat(this.input_slots)\n\n\t\tthis.defaultObject = new THREE.Object3D(new THREE.BoxGeometry(), new THREE.MeshBasicMaterial({color: 0x777777}))\n\t\tthis.defaultObject.backReference = this\n\n\t\tthis.setObject3D(this.defaultObject)\n\n\t\tTHREE.Loader.Handlers.add(/\\.dds$/i, new THREE.DDSLoader())\n\n\t\tthis.hasAnimation = false\n\n\t\t// a callback to be executed after object has loaded\n\t\t// e.g. we want to scale every object to unit size on initial load\n\t\t// but not when subsequently (re-)loaded, to not override user defiend\n\t\t// scaling\n\t\tthis.postLoadCallback = undefined\n\t}\n\n\tThreeLoaderScenePlugin.prototype = Object.create(ThreeObject3DPlugin.prototype)\n\n\tThreeLoaderScenePlugin.prototype.loadObject = function(url) {\n\t\tvar that = this\n\n\t\tif (url !== this.state.url) {\n\t\t\tthis.undoableSetState('url', url, this.state.url)\n\t\t}\n\n\t\tthis.loadedUrl = url\n\n\t\tthis.setObject3D(this.defaultObject)\n\t\tthis.updated = true\n\n\t\tthis.loader = E2.core.assetLoader.loadAsset('scene', url)\n\n\t\tthis.loader\n\t\t.then(function(asset) {\n\t\t\tthat.setObject3D(asset.clone())\n\t\t\t\n\t\t\tdeepCopyglTFObject(asset, that.object3d)\n\n\t\t\tthat.postLoadFixUp()\n\t\t})\n\t\t.finally(function() {\n\t\t\tdelete that.loader\n\t\t})\n\n\t\treturn this.loader\n\t}\n\n\tThreeLoaderScenePlugin.prototype.create_ui = function() {\n\t\tvar inp = makeButton('Change', 'No model selected.', 'url')\n\t\tvar that = this\n\n\t\tinp.click(function() {\n\t\t\tvar oldValue = that.state.url\n\t\t\tvar newValue\n\n\t\t\tFileSelectControl\n\t\t\t.createSceneSelector(that.state.url)\n\t\t\t.onChange(function(v) {\n\t\t\t\tnewValue = v\n\t\t\t})\n\t\t\t.on('closed', function() {\n\t\t\t\tif (newValue === oldValue || newValue.length === 0)\n\t\t\t\t\treturn\n\n\t\t\t\tE2.app.undoManager.begin('Load Object')\n\n \t\t\t\tthat.loadObject(newValue).then(function() {\n\t\t\t\t\tthat.scaleToUnitSize()\n\n\t\t\t\t\t// apply state to object3d (with an empty updateContext, \n\t\t\t\t\t// Object3D doesn't need this for this purpose)\n\t\t\t\t\tThreeObject3DPlugin.prototype.update_state.apply(that, {})\n\n\t\t\t\t\tthat.updated = true\n\t\t\t\t    \n\t\t\t\t\tE2.track({\n\t\t\t\t\t\tevent: 'assetChanged',\n\t\t\t\t\t\tplugin: 'ThreeLoaderScenePlugin',\n\t\t\t\t\t\turl: newValue\n\t\t\t\t\t})\n\n\t\t\t\t    E2.app.undoManager.end()\n\t\t\t    })\n\t\t\t})\n\t\t})\n\n\t\treturn inp\n\t}\n\n\tThreeLoaderScenePlugin.prototype.scaleToUnitSize = function() {\n\t\tvar bbox = new THREE.Box3()\n\n\t\tthis.object3d.traverse(function (n) {\n\t\t\tif (n.geometry) {\n\t\t\t\tn.geometry.computeBoundingBox()\n\t\t\t\tbbox.expandByPoint(n.geometry.boundingBox.min)\n\t\t\t\tbbox.expandByPoint(n.geometry.boundingBox.max)\n\t\t\t}\n\t\t})\n\n\t\tvar xLen = bbox.max.x - bbox.min.x\n\t\tvar yLen = bbox.max.y - bbox.min.y\n\t\tvar zLen = bbox.max.z - bbox.min.z\n\n\t\tvar scaleFactor = 1\n\n\t\tif (xLen > 0 && xLen > yLen && xLen > zLen) {\n\t\t\t// x longest\n\t\t\tscaleFactor /= xLen\n\t\t}\n\t\telse if (yLen > 0 && yLen > xLen && yLen > zLen) {\n\t\t\t// y longest\n\t\t\tscaleFactor /= yLen\n\t\t}\n\t\telse if (zLen > 0 && zLen > xLen && zLen > yLen) {\n\t\t\t// z longest\n\t\t\tscaleFactor /= zLen\n\t\t}\n\t\t// if none of the above match, there is no valid bounding volume (empty / corrupt model?)\n\t\t\n\t\tthis.undoableSetState('scale', new THREE.Vector3(scaleFactor, scaleFactor, scaleFactor), new THREE.Vector3(this.state.scale.x, this.state.scale.y, this.state.scale.z))\n\n\t\tdelete this.postLoadCallback\n\t}\n\n\tThreeLoaderScenePlugin.prototype.postLoadFixUp = function() {\n\t\tthis.hasAnimation = false\n\t\tthis.always_update = true\n\n\t\tvar that = this\n\n\t\tvar removeObjects = []\n\n\t\tthis.object3d.traverse(function(n) {\n\t\t\t// filter lights and cameras out of the scene\n\n\t\t\tif (n instanceof THREE.Light || n instanceof THREE.Camera /*|| (n instanceof THREE.Object3D && (!n instanceof THREE.Bone) && n.children.length === 0 && !n.geometry)*/) {\n\t\t\t\tremoveObjects.push({parent: n.parent, object: n})\n\t\t\t}\n\n\t\t\tvar geom = n.geometry\n\n\t\t\tif (geom) {\n\t\t\t\tvar bufferGeometryHasVtxNormals =\n\t\t\t\t\t\tgeom instanceof THREE.BufferGeometry &&\n\t\t\t\t\t\tgeom.getAttribute('normal') !== undefined\n\n\t\t\t\tvar normalGeometryHasFaceNormals =\n\t\t\t\t\t\t(geom.faces && geom.faces.length > 0 &&\n\t\t\t\t\t\tgeom.faces[0].normal.lengthSq() !== 0)\n\n\t\t\t\tvar normalGeometryHasVtxNormals =\n\t\t\t\t\t\t(geom.faces && geom.faces.length > 0 &&\n\t\t\t\t\t\tgeom.faces[0].vertexNormals.length > 0)\n\n\t\t\t\tif (!bufferGeometryHasVtxNormals && !normalGeometryHasFaceNormals && !normalGeometryHasVtxNormals) {\n\t\t\t\t\tgeom.computeVertexNormals(true)\n\t\t\t\t}\n\n\t\t\t\tif (geom.animations && geom.animations.length > 0) {\n\t\t\t\t\tn.playAnimation(geom.animations[0].name, 100)\n\t\t\t\t\tn.material.morphTargets = true\n\t\t\t\t\tthat.hasAnimation = true\n\t\t\t\t\tthat.always_update = true\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\tfor (var i = 0; i < removeObjects.length; ++i) {\n\t\t\tremoveObjects[i].parent.remove(removeObjects[i].object)\n\t\t}\n\n\t\tthis.object3d.backReference = this\n\t}\n\n\tThreeLoaderScenePlugin.prototype.update_state = function(updateContext) {\n\t\tif (this.loadedUrl !== this.state.url) {\n\t\t\tvar that = this\n\n\t\t\tvar doLoad = function() {\n\t\t\t\tthat.loadObject(that.state.url).then(function () {\n\t\t\t\t\tif (that.postLoadCallback) {\n\t\t\t\t\t\tthat.postLoadCallback.execute(that)\n\t\t\t\t\t}\n\t\t\t\t\t// apply state to object3d\n\t\t\t\t\tThreeObject3DPlugin.prototype.update_state.apply(that, arguments)\n\t\t\t\t\tthat.updated = true\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif (this.loader) {\n\t\t\t\t// chain to an existing loader, ensuring order\n\t\t\t\tthis.loader.then(doLoad)\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// load straight away\n\t\t\t\tdoLoad()\n\t\t\t}\n\t\t}\n\n\t\tThreeObject3DPlugin.prototype.update_state.apply(this, arguments)\n\n\t\tvar delta = updateContext.delta_t * 0.001\n\n\t\tif (this.object3d && this.hasAnimation) {\n\t\t\tthis.object3d.traverse(function(n) {\n\t\t\t\tif (n instanceof THREE.MorphAnimMesh) {\n\t\t\t\t\tn.updateAnimation(delta)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\tThreeLoaderScenePlugin.prototype.update_output = function(slot) {\n\t\tif (slot.index === 0) {\n\t\t\treturn this.object3d\n\t\t}\n\t}\n\n})()\n"
  },
  {
    "path": "browser/plugins/three_material.plugin.js",
    "content": "(function() {\n\tvar ThreeMeshBasicMaterialPlugin = E2.plugins.three_material = function(core) {\n\t\tAbstractThreeMaterialPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'THREE.js Mesh Basic Material'\n\t\t\n\t\tthis.input_slots = [\n\t\t\t{\tname: 'texture', dt: core.datatypes.TEXTURE },\n\t\t\t{\tname: 'color', dt: core.datatypes.COLOR },\n\t\t\t{\tname: 'wireframe', dt: core.datatypes.BOOL, def: false },\n\t\t\t{\tname: 'fog', dt: core.datatypes.BOOL, def: true,\n\t\t\t\tdesc: 'Define whether the material color is affected by global fog settings.'\n\t\t\t},\n\t\t\t{\tname: 'shading', dt: core.datatypes.FLOAT, def: 2,\n\t\t\t\tdesc: 'Define shading type. 0 = No Shading, '+\n\t\t\t\t\t'1 = Flat Shading, 2 = Smooth Shading.'\n\t\t\t},\n\t\t].concat(this.input_slots)\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'material',\n\t\t\tdt: core.datatypes.MATERIAL\n\t\t}]\n\t}\n\n\tThreeMeshBasicMaterialPlugin.prototype = Object.create(AbstractThreeMaterialPlugin.prototype)\n\n\tThreeMeshBasicMaterialPlugin.prototype.reset = function() {\n\t\tAbstractThreeMaterialPlugin.prototype.reset.call(this)\n\t\tthis.material = new THREE.MeshBasicMaterial()\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_material_depth.plugin.js",
    "content": "(function() {\n\tvar ThreeMeshDepthMaterialPlugin = E2.plugins.three_material_depth = function(core) {\n\t\tAbstractThreeMaterialPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'THREE.js Mesh Depth Material'\n\t\t\n\t\tthis.input_slots = [\n\t\t\t{\tname: 'wireframe', dt: core.datatypes.BOOL, def: false },\n\t\t].concat(this.input_slots)\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'material',\n\t\t\tdt: core.datatypes.MATERIAL\n\t\t}]\n\t}\n\n\tThreeMeshDepthMaterialPlugin.prototype = Object.create(AbstractThreeMaterialPlugin.prototype)\n\n\tThreeMeshDepthMaterialPlugin.prototype.reset = function() {\n\t\tAbstractThreeMaterialPlugin.prototype.reset.call(this)\n\t\tthis.material = new THREE.MeshDepthMaterial()\n\t}\n\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_material_extractor.plugin.js",
    "content": "(function() {\n\tvar ThreeMaterialExtractorPlugin = E2.plugins.three_material_extractor = function(core) {\n\t\tthis.desc = 'THREE.js Material Extractor'\n\n\t\tthis.input_slots = [\n\t\t\t{   name: 'material', dt: core.datatypes.MATERIAL}\n\t\t]\n\n\t\tthis.output_slots = [\n\t\t\t{\tname: 'texture', dt: core.datatypes.TEXTURE },\n\t\t\t{   name: 'lightMap', dt: core.datatypes.TEXTURE },\n\t\t\t{   name: 'bumpMap', dt: core.datatypes.TEXTURE },\n\t\t\t{   name: 'normalMap', dt: core.datatypes.TEXTURE },\n\t\t\t{   name: 'specularMap', dt: core.datatypes.TEXTURE },\n\t\t\t{   name: 'displacementMap', dt: core.datatypes.TEXTURE },\n\t\t\t{   name: 'alphaMap', dt: core.datatypes.TEXTURE },\n\t\t\t{\tname: 'color', dt: core.datatypes.COLOR },\n\t\t\t{\tname: 'wireframe', dt: core.datatypes.BOOL },\n\t\t\t{\tname: 'fog', dt: core.datatypes.BOOL },\n\t\t\t{\tname: 'shading', dt: core.datatypes.FLOAT },\n\t\t\t{\tname: 'opacity', dt: core.datatypes.FLOAT },\n\t\t\t{\tname: 'transparent', dt: core.datatypes.FLOAT },\n\t\t\t{\tname: 'blending', dt: core.datatypes.FLOAT },\n\t\t\t{\tname: 'side', dt: core.datatypes.FLOAT }\n\t\t]\n\t}\n\n\tThreeMaterialExtractorPlugin.prototype = Object.create(Plugin.prototype)\n\n\tThreeMaterialExtractorPlugin.prototype.reset = function() {\n\t}\n\n\tThreeMaterialExtractorPlugin.prototype.update_input = function(slot, data) {\n\t\tthis.material = data\n\t}\n\n\tThreeMaterialExtractorPlugin.prototype.update_output = function(slot) {\n\t\tif (slot.name === 'texture') {\n\t\t\treturn this.material.map\n\t\t}\n\t\telse {\n\t\t\treturn this.material[slot.name]\n\t\t}\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_material_lambert.plugin.js",
    "content": "(function() {\n\tvar ThreeLambertMaterialPlugin = E2.plugins.three_material_lambert = function(core) {\n\t\tAbstractThreeMaterialPlugin.apply(this, arguments)\n\t\t\n\t\tthis.desc = 'THREE.js Lambert Material'\n\t\t\n\t\tthis.input_slots = [\n\t\t\t{\tname: 'texture', dt: core.datatypes.TEXTURE },\n\t\t\t{   name: 'specularMap', dt: core.datatypes.TEXTURE, def: undefined },\n\t\t\t{   name: 'alphaMap', dt: core.datatypes.TEXTURE, def: undefined },\n\t\t\t{\tname: 'color', dt: core.datatypes.COLOR, def: new THREE.Color(0xffffff) },\n\t\t\t{\tname: 'wireframe', dt: core.datatypes.BOOL, def: false },\n\t\t\t{\tname: 'fog', dt: core.datatypes.BOOL, def: true,\n\t\t\t\tdesc: 'Define whether the material color is affected by global fog settings.'\n\t\t\t},\n\t\t\t{\tname: 'shading', dt: core.datatypes.FLOAT, def: 2,\n\t\t\t\tdesc: 'Define shading type. 0 = No Shading, '+\n\t\t\t\t\t'1 = Flat Shading, 2 = Smooth Shading.'\n\t\t\t}\n\t\t].concat(this.input_slots)\n\t}\n\n\tThreeLambertMaterialPlugin.prototype = Object.create(AbstractThreeMaterialPlugin.prototype)\n\n\tThreeLambertMaterialPlugin.prototype.reset = function() {\n\t\tAbstractThreeMaterialPlugin.prototype.reset.call(this)\n\t\tthis.material = new THREE.MeshLambertMaterial()\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_material_modifier.plugin.js",
    "content": "(function() {\n\tvar ThreeMaterialModifier = E2.plugins.three_material_modifier = function(core, node) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.input_slots = [\n\t\t\t{\n\t\t\t\tname: 'material',\n\t\t\t\tdt: core.datatypes.MATERIAL,\n\t\t\t\tarray: true,\n\t\t\t\tdef: [new THREE.MeshBasicMaterial({name: 'default material', color: 0x00FF00})]\n\t\t\t}\n\t\t]\n\n\t\tthis.output_slots = [\n\t\t\t{\n\t\t\t\tname: 'material',\n\t\t\t\tdt: core.datatypes.MATERIAL,\n\t\t\t\tarray: true\n\t\t\t}\n\t\t]\n\n\t\tthis.lsg = new LinkedSlotGroup(core, node, [], [])\n\t\tthis.lsg.set_dt(core.datatypes.MATERIAL)\n\n\t\tvar that = this\n\n\t\tthis.node.on('slotAdded', function () {\n\t\t\tthat.dynInputs = node.getDynamicInputSlots()\n\t\t\tthat.updated = true\n\t\t\tthat.materialSlotsDirty = true\n\t\t})\n\n\t\tthis.node.on('slotRemoved', function () {\n\t\t\tthat.dynInputs = node.getDynamicInputSlots()\n\t\t\tthat.updated = true\n\t\t\tthat.materialSlotsDirty = true\n\t\t})\n\t}\n\n\tThreeMaterialModifier.prototype = Object.create(Plugin.prototype)\n\n\tThreeMaterialModifier.prototype.create_ui = function () {\n\t\tvar that = this\n\t\tvar layout = make('div')\n\t\tvar removeButton = makeButton('Remove', 'Click to remove the last material input.')\n\t\tvar addButton = makeButton('Add Slot', 'Click to add another material input.')\n\n\t\tremoveButton.css('width', '65px')\n\t\taddButton.css({'width': '65px', 'margin-top': '5px'})\n\n\t\taddButton.click(function () {\n\t\t\tE2.app.graphApi.addSlot(that.node.parent_graph, that.node, {\n\t\t\t\ttype: E2.slot_type.input,\n\t\t\t\tname: that.dynInputs.length + '',\n\t\t\t\tdt: E2.dt.MATERIAL\n\t\t\t})\n\t\t})\n\n\t\tremoveButton.click(function () {\n\t\t\tvar inputs = that.dynInputs\n\t\t\tif (!inputs)\n\t\t\t\treturn\n\n\t\t\tvar suid = inputs[inputs.length - 1].uid\n\t\t\tE2.app.graphApi.removeSlot(that.node.parent_graph, that.node, suid)\n\t\t})\n\n\t\tlayout.append(removeButton, '<br />', addButton)\n\n\t\treturn layout\n\t}\n\n\n\tThreeMaterialModifier.prototype.reset = function() {\n\t\tthis.inMaterialArray = []\n\t\tthis.outMaterialArray = []\n\t\tthis.materialOverride = []\n\n\t\tthis.materialSlotsDirty = false\n\t\tthis.materialsDirty = false\n\t}\n\n\tThreeMaterialModifier.prototype.update_input = function(slot, data) {\n\t\tif (!slot.uid && slot.index === 0) {\n\t\t\tif (data && data.length > 0) {\n\t\t\t\tthis.inMaterialArray = data\n\n\t\t\t\tthis.materialNames = []\n\n\t\t\t\t// filter only unique items to materialNames\n\t\t\t\tvar i, j\n\t\t\t\tfor (j = 0; j < data.length; ++j) {\n\t\t\t\t\tvar found = false\n\t\t\t\t\tfor (i = 0; i < this.materialNames.length; ++i) {\n\t\t\t\t\t\tif (data[j].name === this.materialNames[i]) {\n\t\t\t\t\t\t\tfound = true\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (!found) {\n\t\t\t\t\t\tthis.materialNames.push(data[j].name)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.outMaterialArray = []\n\n\t\t\t\tthis.materialSlotsDirty = true\n\t\t\t\tthis.materialsDirty = true\n\t\t\t}\n\t\t}\n\t\telse { // dynamic slot\n\t\t\tif (!data) {\n\t\t\t\tif (this.materialOverride[slot.index]) {\n\t\t\t\t\tdelete this.materialOverride[slot.index]\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.materialOverride[slot.index] = data\n\t\t\t}\n\n\t\t\tthis.materialsDirty = true\n\t\t}\n\t}\n\n\tThreeMaterialModifier.prototype.state_changed = function(ui) {\n\t\tif (ui) {\n\t\t\treturn\n\t\t}\n\n\t\tvar slots = this.dynInputs = this.node.getDynamicInputSlots()\n\t\tfor (var i = 0, len = slots.length; i < len; i++) {\n\t\t\tthis.lsg.add_dyn_slot(slots[i])\n\t\t}\n\t}\n\n\tThreeMaterialModifier.prototype.update_state = function() {\n\t\tif (this.materialSlotsDirty) {\n\t\t\tthis.adjustMaterialSlots()\n\t\t\tthis.materialSlotsDirty = false\n\t\t}\n\n\t\tif (this.materialsDirty) {\n\t\t\tthis.outMaterialArray = []\n\t\t\tfor(var i = 0; i < this.inMaterialArray.length; i++) {\n\t\t\t\tvar n = this.inMaterialArray[i].name\n\t\t\t\tvar overrideIdx = this.materialNames.indexOf(n)\n\t\t\t\tif (overrideIdx >= 0 && this.materialOverride[overrideIdx]) {\n\t\t\t\t\tthis.outMaterialArray.push(this.materialOverride[overrideIdx])\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.outMaterialArray.push(this.inMaterialArray[i])\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.materialsDirty = false\n\t\t}\n\t}\n\n\tThreeMaterialModifier.prototype.update_output = function() {\n\t\treturn this.outMaterialArray\n\t}\n\n\tThreeMaterialModifier.prototype.adjustMaterialSlots = function() {\n\t\tvar slots = this.dynInputs = this.node.getDynamicInputSlots()\n\t\tfor (var i = 0, len = slots.length; i < len; i++) {\n\t\t\tthis.node.rename_slot(\n\t\t\t\tslots[i].type, \n\t\t\t\tslots[i].uid,\n\t\t\t\ti < this.materialNames.length ? this.materialNames[i] : ('input ' + i))\n\t\t}\n\t}\n\n})()"
  },
  {
    "path": "browser/plugins/three_material_phong.plugin.js",
    "content": "(function() {\n\tvar ThreePhongMaterialPlugin = E2.plugins.three_material_phong = function(core) {\n\t\tAbstractThreeMaterialPlugin.apply(this, arguments)\n\t\t\n\t\tthis.desc = 'THREE.js Phong Material'\n\t\t\n\t\tthis.input_slots = [\n\t\t\t{\tname: 'texture', dt: core.datatypes.TEXTURE },\n\t\t\t{   name: 'lightMap', dt: core.datatypes.TEXTURE, def: undefined },\n\t\t\t{   name: 'bumpMap', dt: core.datatypes.TEXTURE, def: undefined },\n\t\t\t{   name: 'normalMap', dt: core.datatypes.TEXTURE, def: undefined },\n\t\t\t{   name: 'specularMap', dt: core.datatypes.TEXTURE, def: undefined },\n\t\t\t{   name: 'displacementMap', dt: core.datatypes.TEXTURE, def: undefined },\n\t\t\t{   name: 'alphaMap', dt: core.datatypes.TEXTURE, def: undefined },\n\t\t\t{\tname: 'color', dt: core.datatypes.COLOR, def: new THREE.Color(0xffffff) },\n\t\t\t{\tname: 'wireframe', dt: core.datatypes.BOOL },\n\t\t\t{\tname: 'fog', dt: core.datatypes.BOOL, def: true,\n\t\t\t\tdesc: 'Define whether the material color is affected by global fog settings.'\n\t\t\t},\n\t\t\t{\tname: 'shading', dt: core.datatypes.FLOAT, def: 2,\n\t\t\t\tdesc: 'Define shading type. 0 = No Shading, '+\n\t\t\t\t\t'1 = Flat Shading, 2 = Smooth Shading.'\n\t\t\t},\n\t\t].concat(this.input_slots).concat([\n\t\t\t{\tname: 'emissiveMap', dt: core.datatypes.TEXTURE, def: undefined },\n\t\t\t{\tname: 'emissive', dt: core.datatypes.COLOR, def: new THREE.Color(0) },\n\t\t\t{\tname: 'specular', dt: core.datatypes.COLOR, def: new THREE.Color(0x111111) },\n\t\t\t{\tname: 'shininess', dt: core.datatypes.FLOAT, def: 30 },\n\t\t\t{\tname: 'metal', dt: core.datatypes.BOOL, def: false },\n\t\t\t{   name: 'lightMapIntensity', dt: core.datatypes.FLOAT, def: 1 },\n\t\t\t{   name: 'normalScale', dt: core.datatypes.VECTOR, def: new THREE.Vector3(1, 1, 1) },\n\t\t\t{   name: 'bumpScale', dt: core.datatypes.FLOAT, def: 1 },\n\t\t\t{   name: 'displacementScale', dt: core.datatypes.FLOAT, def: 1 },\n\t\t\t{   name: 'displacementBias', dt: core.datatypes.FLOAT, def: 1 },\n\t\t\t{   name: 'reflectivity', dt: core.datatypes.FLOAT, def: 1 },\n\t\t\t{   name: 'refractionRatio', dt: core.datatypes.FLOAT, def: 0.98 },\n\t\t\t{   name: 'envMap', dt: core.datatypes.CUBETEXTURE, def: undefined}\n\t\t])\n\t}\n\n\tThreePhongMaterialPlugin.prototype = Object.create(AbstractThreeMaterialPlugin.prototype)\n\n\tThreePhongMaterialPlugin.prototype.reset = function() {\n\t\tAbstractThreeMaterialPlugin.prototype.reset.call(this)\n\t\tthis.material = new THREE.MeshPhongMaterial()\n\t}\n\n\tThreePhongMaterialPlugin.prototype.update_input = function(slot, data) {\n\t\tif (slot.name === 'normalScale' && data !== undefined) {\n\t\t\t// set Vector2 from Vector3\n\t\t\tthis.material.normalScale.set(data.x, data.y)\n\n\t\t\treturn\n\t\t}\n\n\t\tAbstractThreeMaterialPlugin.prototype.update_input.apply(this, arguments)\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_material_shader.plugin.js",
    "content": "(function() {\n\n\tvar ThreeShaderMaterialPlugin = E2.plugins.three_material_shader = function(core, node) {\n\t\tAbstractThreeMaterialPlugin.apply(this, arguments)\n\n\t\tvar that = this\n\n\t\tthis.desc = 'Shader Material'\n\n\t\tthis.input_slots = [\n\t\t\t{   name: 'depthTest', dt: core.datatypes.BOOL, def: true  },\n\t\t\t{   name: 'depthWrite', dt: core.datatypes.BOOL, def: true  }\n\t\t].concat(this.input_slots)\n\n\t\tthis.state = {\n\t\t\tvs_src: '',\n\t\t\tps_src: ''\n\t\t}\n\n\t\tthis.core = core\n\t\tthis.node = node\n\t\tthis.slot_data = {}\n\n\t\tthis.node.on('slotAdded', function(slot) {\n\t\t\tthat.slot_data[slot.uid] = that.core.get_default_value(E2.slot_type.input, slot.dt)\n\t\t\tthat.updated = that.dirty = true\n\t\t\tthat._refreshEditor()\n\t\t})\n\n\t\tthis.node.on('slotRemoved', function() {\n\t\t\tthat.updated = that.dirty = true\n\t\t\tthat._refreshEditor()\n\t\t})\n\n\t\tthis.shader_dirty = true\n\t\tthis.uniforms_dirty = true\n\t}\n\n\tThreeShaderMaterialPlugin.prototype = Object.create(AbstractThreeMaterialPlugin.prototype)\n\n\tThreeShaderMaterialPlugin.prototype._refreshEditor = function() {\n\t\tvar that = this\n\t\tif (this._editors) {\n\t\t\t_.each(this._editors, function(ed, which) {\n\t\t\t\ted.setInputs(that.node.getDynamicInputSlots())\n\t\t\t})\n\t\t}\n\t}\n\n\tThreeShaderMaterialPlugin.prototype.destroy_ui = function() {\n\t\tvar that = this\n\t\t_.each(this._editors, function(ed, key) {\n\t\t\tif (ed.close) {\n\t\t\t\ted.close()\n\t\t\t\tdelete that._editors[key]\n\t\t\t}\n\t\t})\n\t}\n\n\tThreeShaderMaterialPlugin.prototype.create_ui = function() {\n\t\tvar that = this\n\t\tvar layout = make('div')\n\t\tvar vertexButton = makeButton('Vertex', 'Click to edit the vertex shader source.')\n\t\tvar pixelButton = makeButton('Pixel', 'Click to edit the pixel shader source.')\n\n\t\tthis._editors = {}\n\n\t\tfunction removeSlot(slotId) {\n\t\t\tE2.app.graphApi.removeSlot(that.node.parent_graph, that.node, slotId)\n\t\t}\n\n\t\tfunction addSlot(name, dt) {\n\t\t\tE2.app.graphApi.addSlot(that.node.parent_graph, that.node, {\n\t\t\t\ttype: E2.slot_type.input,\n\t\t\t\tname: name,\n\t\t\t\tdt: dt\n\t\t\t})\n\t\t}\n\n\t\tvertexButton.css('width', '55px')\n\t\tpixelButton.css({ 'width': '55px', 'margin-top': '5px' })\n\n\t\tfunction createEditor(which, stateKey) {\n\t\t\tif (that._editors[which]) {\n\t\t\t\tthat._editors[which].show()\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tvar title = [which, 'shader'].join(' ')\n\n\t\t\tthat._editors[which] = E2.ShaderEditor\n\t\t\t.open(title, that.state[stateKey], that.node.getDynamicInputSlots())\n\t\t\t.on('closed', function() {\n\t\t\t\tdelete that._editors[which]\n\t\t\t})\n\t\t\t.on('inputRemoved', function(slotUid, name) {\n\t\t\t\tremoveSlot(slotUid, name)\n\t\t\t})\n\t\t\t.on('inputAdded', function(inputName, dt) {\n\t\t\t\taddSlot(inputName, dt)\n\t\t\t})\n\t\t\t.on('build', function() {\n\t\t\t\tthat.updated = that.shader_dirty = true\n\t\t\t})\n\t\t\t.on('changed', function(v) {\n\t\t\t\tif (v === that.state[stateKey])\n\t\t\t\t\treturn;\n\n\t\t\t\tthat.undoableSetState(stateKey, v, that.state[stateKey])\n\t\t\t})\n\n\t\t\tthat._editors[which].stateKey = stateKey\n\t\t}\n\n\t\tvertexButton.click(function() {\n\t\t\tcreateEditor('vertex', 'vs_src')\n\t\t})\n\n\t\tpixelButton.click(function() {\n\t\t\tcreateEditor('pixel', 'ps_src')\n\t\t})\n\n\t\tlayout.append(vertexButton, '<br />', pixelButton)\n\n\t\treturn layout\n\t}\n\n\tThreeShaderMaterialPlugin.prototype.connection_changed = function(on, conn, slot) {\n\t\tif (!on && slot.type === E2.slot_type.input) {\n\t\t\t//if(slot.index === 0)\n\t\t\tthis.uniforms_dirty = true\n\t\t}\n\t}\n\n\tThreeShaderMaterialPlugin.prototype.update_input = function(slot, data)\n\t{\n\t\tif(slot.uid === undefined)\n\t\t{\n\t\t\tconsole.log('ThreeShaderMaterialPlugin: undefined uid for slot ' + slot.index)\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.slot_data[slot.uid] = data\n\t\t\tthis.uniforms_dirty = true\n\t\t}\n\n\t\tAbstractThreeMaterialPlugin.prototype.update_input.apply(this, arguments)\n\t}\n\n\tThreeShaderMaterialPlugin.prototype.update_state = function()\n\t{\n\t\tif (!this.uniforms_dirty && !this.shader_dirty) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.uniforms_dirty = this.uniforms_dirty || this.shader_dirty\n\n\t\tvar dts = this.core.datatypes\n\n\t\tvar slots, slot\n\n\t\tslots = this.node.getDynamicInputSlots()\n\n\t\tif (this.shader_dirty || !this.material) {\n\t\t\tvar vs_src = this.state.vs_src.slice(0)\n\t\t\tvar ps_src = this.state.ps_src.slice(0)\n\n\t\t\tthis.uniforms = {}\n\n\t\t\tfor(var i=0; i < slots.length; i++) {\n\t\t\t\tvar three_dt = ''\n\t\t\t\tvar shader_dt = ''\n\n\t\t\t\tslot = slots[i]\n\t\t\t\tvar dtid = slot.dt.id\n\n\t\t\t\tif(dtid === dts.FLOAT.id) {\n\t\t\t\t\tthree_dt = 'f'\n\t\t\t\t\tshader_dt = 'float'\n\t\t\t\t}\n\t\t\t\telse if(dtid === dts.TEXTURE.id) {\n\t\t\t\t\tthree_dt = 't'\n\t\t\t\t\tshader_dt = 'sampler2D'\n\t\t\t\t}\n\t\t\t\telse if(dtid === dts.CUBETEXTURE.id) {\n\t\t\t\t\tthree_dt = 't'\n\t\t\t\t\tshader_dt = 'samplerCube'\n\t\t\t\t}\n\t\t\t\telse if(dtid === dts.COLOR.id) {\n\t\t\t\t\tthree_dt = 'v4'\n\t\t\t\t\tshader_dt = 'vec4'\n\t\t\t\t}\n\t\t\t\telse if(dtid === dts.MATRIX.id) {\n\t\t\t\t\tthree_dt = 'm4'\n\t\t\t\t\tshader_dt = 'mat4'\n\t\t\t\t}\n\t\t\t\telse if(dtid === dts.VECTOR.id) {\n\t\t\t\t\tthree_dt = 'v3'\n\t\t\t\t\tshader_dt = 'vec3'\n\t\t\t\t}\n\n\t\t\t\tthis.uniforms[slot.name] = {type: three_dt/*, value: data*/}\n\n\t\t\t\t// add to shader source\n\t\t\t\tvs_src = 'uniform ' + shader_dt + ' ' + slot.name + ';\\n' + vs_src\n\t\t\t\tps_src = 'uniform ' + shader_dt + ' ' + slot.name + ';\\n' + ps_src\n\t\t\t}\n\n\t\t\tthis.material = new THREE.ShaderMaterial( {\n\t\t\t\tuniforms: this.uniforms,\n\t\t\t\tvertexShader: vs_src,\n\t\t\t\tfragmentShader: ps_src\n\t\t\t} )\n\t\t}\n\n\t\tif (this.uniforms_dirty) {\n\t\t\tfor(var i=0; i < slots.length; i++) {\n\t\t\t\tslot = slots[i]\n\t\t\t\tvar dtid = slot.dt.id\n\t\t\t\tvar data = this.slot_data[slot.uid]\n\n\t\t\t\t/*if(dtid === dts.FLOAT.id) {\n\t\t\t\t\t// data as is\n\t\t\t\t}\n\t\t\t\telse if(dtid === dts.TEXTURE.id) {\n\t\t\t\t\t// data as is\n\t\t\t\t}\n\t\t\t\telse*/ if(dtid === dts.COLOR.id) {\n\t\t\t\t\tdata = data ? new THREE.Color(data.x, data.y, data.z, data.w) : new THREE.Color()\n\t\t\t\t}\n\t\t\t\telse if(dtid === dts.MATRIX.id) {\n\t\t\t\t\tdata = data ? new THREE.Matrix4(\n\t\t\t\t\t\tdata[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7],\n\t\t\t\t\t\tdata[8], data[9], data[10], data[11], data[12], data[13], data[14], data[15]) : new THREE.Matrix4()\n\t\t\t\t}\n\t\t\t\telse if(dtid === dts.VECTOR.id) {\n\t\t\t\t\tdata = data ? new THREE.Vector3(data.x, data.y, data.z) : new THREE.Vector3()\n\t\t\t\t}\n\n\t\t\t\tthis.uniforms[slot.name].value = data\n\t\t\t}\n\t\t}\n\n\t\tthis.shader_dirty = false\n\t\tthis.uniforms_dirty = false\n\t}\n\n\tThreeShaderMaterialPlugin.prototype.reset = function() {\n\t\tthis.material = new THREE.ShaderMaterial()\n\n\t\tif (!this.state.vs_src)\n\t\t\tthis.state.vs_src = this.material.vertexShader\n\t\telse\n\t\t\tthis.material.vertexShader = this.state.vs_src\n\n\t\tif (!this.state.ps_src)\n\t\t\tthis.state.ps_src = this.material.fragmentShader\n\t\telse\n\t\t\tthis.material.fragmentShader = this.state.ps_src\n\n\t\tthis.uniforms_dirty = this.shader_dirty = true\n\t}\n\n\tThreeShaderMaterialPlugin.prototype.state_changed = function(ui) {\n\t\tif(!ui) {\n\t\t\t//this.shader_dirty = true\n\t\t} else {\n\t\t\tthis.core.add_aux_script('ace/src-noconflict/ace.js')\n\t\t}\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_material_standard.plugin.js",
    "content": "(function() {\n\tvar ThreeStandardMaterialPlugin = E2.plugins.three_material_standard = function(core) {\n\t\tAbstractThreeMaterialPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'THREE.js Standard Material'\n\n\t\tthis.input_slots = [\n\t\t\t{\tname: 'color', dt: core.datatypes.COLOR, def: new THREE.Color(0xffffff) },\n\t\t\t{\tname: 'roughness', dt: core.datatypes.FLOAT, def: 0.5 },\n\t\t\t{\tname: 'metalness', dt: core.datatypes.FLOAT, def: 0.5 },\n\n\t\t\t{\tname: 'texture', dt: core.datatypes.TEXTURE },\n\t\t\t{   name: 'lightMap', dt: core.datatypes.TEXTURE, def: undefined },\n\t\t\t{   name: 'lightMapIntensity', dt: core.datatypes.FLOAT, def: 1 },\n\n\t\t\t{\tname: 'aoMap', dt: core.datatypes.TEXTURE },\n\t\t\t{\tname: 'aoIntensity', dt: core.datatypes.FLOAT, def: 1.0 },\n\n\t\t\t{\tname: 'emissiveMap', dt: core.datatypes.TEXTURE, def: undefined },\n\t\t\t{\tname: 'emissive', dt: core.datatypes.COLOR, def: new THREE.Color(0) },\n\t\t\t{\tname: 'emissiveIntensity', dt: core.datatypes.FLOAT, def: 1.0 },\n\n\t\t\t{   name: 'bumpMap', dt: core.datatypes.TEXTURE, def: undefined },\n\t\t\t{   name: 'bumpScale', dt: core.datatypes.FLOAT, def: 1 },\n\n\t\t\t{   name: 'normalMap', dt: core.datatypes.TEXTURE, def: undefined },\n\t\t\t{   name: 'normalScale', dt: core.datatypes.VECTOR, def: new THREE.Vector3(1, 1, 1) },\n\n\t\t\t{   name: 'displacementMap', dt: core.datatypes.TEXTURE, def: undefined },\n\t\t\t{   name: 'displacementScale', dt: core.datatypes.FLOAT, def: 1 },\n\t\t\t{   name: 'displacementBias', dt: core.datatypes.FLOAT, def: 1 },\n\n\t\t\t{   name: 'roughnessMap', dt: core.datatypes.TEXTURE, def: undefined },\n\n\t\t\t{   name: 'metalnessMap', dt: core.datatypes.TEXTURE, def: undefined },\n\n\t\t\t{   name: 'alphaMap', dt: core.datatypes.TEXTURE, def: undefined },\n\n\t\t\t{   name: 'envMap', dt: core.datatypes.CUBETEXTURE, def: undefined },\n\t\t\t{   name: 'envMapIntensity', dt: core.datatypes.FLOAT, def: 1 },\n\n\t\t\t{   name: 'refractionRatio', dt: core.datatypes.FLOAT, def: 0.98 },\n\n\t\t\t{\tname: 'wireframe', dt: core.datatypes.BOOL },\n\t\t\t{\tname: 'fog', dt: core.datatypes.BOOL, def: true,\n\t\t\t\tdesc: 'Define whether the material color is affected by global fog settings.'\n\t\t\t},\n\t\t\t{\tname: 'shading', dt: core.datatypes.FLOAT, def: 2,\n\t\t\t\tdesc: 'Define shading type. 0 = No Shading, '+\n\t\t\t\t'1 = Flat Shading, 2 = Smooth Shading.'\n\t\t\t},\n\t\t].concat(this.input_slots)\n\t}\n\n\tThreeStandardMaterialPlugin.prototype = Object.create(AbstractThreeMaterialPlugin.prototype)\n\n\tThreeStandardMaterialPlugin.prototype.reset = function() {\n\t\tAbstractThreeMaterialPlugin.prototype.reset.call(this)\n\t\tthis.material = new THREE.MeshStandardMaterial()\n\t}\n\n\tThreeStandardMaterialPlugin.prototype.update_input = function(slot, data) {\n\t\tif (slot.name === 'normalScale' && data !== undefined) {\n\t\t\t// set Vector2 from Vector3\n\t\t\tthis.material.normalScale.set(data.x, data.y)\n\n\t\t\treturn\n\t\t}\n\n\t\tAbstractThreeMaterialPlugin.prototype.update_input.apply(this, arguments)\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_mesh.plugin.js",
    "content": "(function() {\n\tvar createThreeMeshRoot = function() {\n\t\treturn new THREE.Object3D()\n\t}\n\n\tvar createThreeAnimatedMesh = function(geom, mats) {\n\t\treturn new THREE.MorphAnimMesh(geom, mats)\n\t}\n\n\tvar createThreeMesh = function(geom, mats) {\n\t\treturn new THREE.Mesh(geom, mats)\n\t}\n\n\tvar ThreeMeshPlugin = E2.plugins.three_mesh = function(core) {\n\t\tAbstractThreeMeshPlugin.apply(this, arguments)\n\n\t\tthis.input_slots = [\n\t\t\t{\n\t\t\t\tname: 'object3d',\n\t\t\t\tdt: core.datatypes.OBJECT3D,\n\t\t\t\tdesc: 'Optional existing mesh to modify',\n\t\t\t\tdef: null\n\t\t\t}\n\t\t].concat(this.input_slots).concat([\n\t\t\t{\n\t\t\t\tname: 'animation speed',\n\t\t\t\tdt: core.datatypes.FLOAT,\n\t\t\t\tdesc: 'Animation speed',\n\t\t\t\tdef: 1\n\t\t\t}\n\t\t])\n\n\t\tthis.desc = 'THREE.js Mesh'\n\n\t\tthis.createMeshRoot = createThreeMeshRoot\n\t\tthis.createAnimatedMesh = createThreeAnimatedMesh\n\t\tthis.createMesh = createThreeMesh\n\t}\n\n\tThreeMeshPlugin.prototype = Object.create(AbstractThreeMeshPlugin.prototype)\n\n\tThreeMeshPlugin.prototype.update_input = function (slot, data) {\n\t\tAbstractThreeMeshPlugin.prototype.update_input.apply(this, arguments)\n\n\t\tif (slot.name === 'object3d' && data && this.object3d !== data) {\n\t\t\tthis.setObject3D(data)\n\t\t\tthis.geoms = []\n\t\t\tthis.mats = []\n\t\t\tthis.node.emit('meshChanged')\n\t\t}\n\t}\n\n\tThreeMeshPlugin.prototype.update_state = function (updateContext) {\n\t\tAbstractThreeMeshPlugin.prototype.update_state.apply(this)\n\n\t\tvar delta = updateContext.delta_t * 0.001 * this.inputValues['animation speed']\n\n\t\tif (this.object3d) {\n\t\t\tthis.object3d.traverse(function(n) {\n\t\t\t\tif (n instanceof THREE.MorphAnimMesh) {\n\t\t\t\t\tn.updateAnimation(delta)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_meshline_material.plugin.js",
    "content": "(function() {\nvar ThreeMeshLineMaterialPlugin = E2.plugins.three_meshline_material = function(core) {\n\tAbstractThreeMaterialPlugin.apply(this, arguments)\n\n\tthis.desc = 'THREE.js MeshLine Material'\n\n\tthis.input_slots = [ \n\t\t{ name: 'color',\t\tdt: core.datatypes.COLOR, def: new THREE.Color(0xffffff) },\n\t\t{ name: 'sizeAttenuation',\tdt: core.datatypes.BOOL,  def: true },\n\t\t{ name: 'lineWidth',\t\tdt: core.datatypes.FLOAT, def: 0.01 },\n\t\t{ name: 'near',\t\t\tdt: core.datatypes.FLOAT, def: 0.01 },\n\t\t{ name: 'far',\t\t\tdt: core.datatypes.FLOAT, def: 1000 },\n\t\t{ name: 'wireframe',\t\tdt: core.datatypes.BOOL,  def: false }\n\t].concat(this.input_slots)\n\t\n\tthis.output_slots = [{\n\t\tname: 'material',\n\t\tdt: core.datatypes.MATERIAL\n\t}]\n\t\n\t// Needed for the shader sizeAttenuation\n\tthis.resolution = new THREE.Vector2(1, 1)\n\n\t// Get the parameters from the input_slots\n\tvar params = {}\n\tthis.input_slots.map(function(slot) {\n\t\tparams[slot.name] = slot.def\n\t})\n\tparams.resolution = this.resolution\n\n\tthis.material = new THREE.MeshLineMaterial(params)\n}\n\nThreeMeshLineMaterialPlugin.prototype = Object.create(AbstractThreeMaterialPlugin.prototype)\n\nThreeMeshLineMaterialPlugin.prototype.state_changed = function(ui) {\n\t// if ui is null, first time called, bind the resize\n\tif (!ui) {\n\t\tE2.core.on('resize', this.resize.bind(this))\n\t}\n}\n\nThreeMeshLineMaterialPlugin.prototype.update_input = function(slot, data) {\n\tPlugin.prototype.update_input.apply(this, arguments)\n\n\tif ( slot.name === 'transparent' \n\t  || slot.name === 'wireframe' \n\t  || slot.name === 'side'\n\t  || slot.name === 'blending' ) {\n\t\t// Use the abstract material update method\n\t\tAbstractThreeMaterialPlugin.prototype.update_input.apply(this, arguments)\n\t} else {\n\t\t// Just update the shader directly\n\t\tthis.material.uniforms[slot.name].value = data\n\t}\n}\n\nThreeMeshLineMaterialPlugin.prototype.resize = function() {\n\t// Need to recalculate the resolution\n\tvar canvasArea = E2.app.calculateCanvasArea()\n\tthis.resolution.set(canvasArea.width, canvasArea.height)\n\n\tthis.material.uniforms.resolution.value = this.resolution\n}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_meshline_mesh.plugin.js",
    "content": "(function() {\n\tvar createThreeMeshRoot = function() {\n\t\treturn new THREE.Object3D()\n\t}\n\n\tvar createThreeMeshLineMesh = function(geom, mats) {\n\t\t// Have to convert the bufferGeometry to THREE.Geometry(), as the MeshLine only\n\t\t// accepts THREE.Geometry()\n\t\tvar setGeom;\n\n\t\tif (geom instanceof THREE.Geometry) {\n\t\t\tsetGeom = geom;\n\t\t} else if (geom instanceof THREE.BufferGeometry) {\n\t\t\tsetGeom = new THREE.Geometry().fromBufferGeometry(geom)\n\t\t}\n\n\t\t// Create our meshLine object, which is actually not a Mesh or a object3d, but\n\t\t// only contains a bufferGeometry meshLine.geometry\n\t\tthis.meshLine = new THREE.MeshLine()\n\t\tthis.meshLine.setGeometry(setGeom)\n\n\t\t// We need this for the raycast method to work\n\t\tthis.meshLine.setMatrixWorld(this.object3d.matrixWorld)\n\n\t\t// Create our actual THREE.Mesh that is then added to our scene\n\t\tvar mesh = new THREE.Mesh(this.meshLine.geometry, mats)\n\n\t\t// Override the default raycast\n\t\tvar that = this\n\t\tthis.object3d.raycast = function() { \n\t\t\t// Raycast with the mesh, so it gets added to the intersected objects\n\t\t\t// Not the MeshLine instance\n\t\t\treturn that.meshLine.raycast.apply(mesh, arguments)\n\t\t}\n\n\t\treturn mesh\n\t}\n\n\tvar ThreeMeshLinePlugin = E2.plugins.three_meshline_mesh = function(core) {\n\t\tAbstractThreeMeshPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'THREE.js MeshLine Mesh'\n\n\t\tthis.createMeshRoot = createThreeMeshRoot\n\t\tthis.createAnimatedMesh = createThreeMeshLineMesh\n\t\tthis.createMesh = createThreeMeshLineMesh\n\t}\n\n\tThreeMeshLinePlugin.prototype = Object.create(AbstractThreeMeshPlugin.prototype)\n\n\tThreeMeshLinePlugin.prototype.update_input = function(slot, data) {\n\t\tAbstractThreeMeshPlugin.prototype.update_input.apply(this, arguments)\n\t}\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_object3d_attribute_extractor.plugin.js",
    "content": "(function() {\n\tvar ThreeObject3DAttributeExtractor = E2.plugins.three_object3d_attribute_extractor = function (core) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.input_slots = [{\n\t\t\tname: 'object3d',\n\t\t\tdt: core.datatypes.OBJECT3D,\n\t\t\tdesc: 'mesh to extract attributes from'\n\t\t}]\n\n\t\tthis.output_slots = [\n\t\t\t{ name: 'position', dt: core.datatypes.VECTOR },\n\t\t\t{ name: 'rotation', dt: core.datatypes.VECTOR },\n\t\t\t{ name: 'scale', dt: core.datatypes.VECTOR },\n\t\t\t{ name: 'name', dt: core.datatypes.TEXT }\n\t\t]\n\n\t\tthis.desc = 'Extract position, rotation and scale from a Mesh'\n\n\t\tthis.euler = new THREE.Euler()\n\t}\n\n\tThreeObject3DAttributeExtractor.prototype = Object.create(Plugin.prototype)\n\tThreeObject3DAttributeExtractor.prototype.constructor = Plugin.prototype\n\n\tThreeObject3DAttributeExtractor.prototype.reset = function() {\n\t\tthis.object3d = undefined\n\n\t\tthis.position = new THREE.Vector3(0, 0, 0)\n\t\tthis.rotation = new THREE.Vector3(0, 0, 0)\n\t\tthis.scale = new THREE.Vector3(1, 1, 1)\n\n\t\tthis.name = ''\n\n\t\tthis.meshDirty = false\n\t}\n\n\tThreeObject3DAttributeExtractor.prototype.update_output = function(slot) {\n\t\tif (slot.name === 'position') {\n\t\t\treturn this.position\n\t\t}\n\t\telse if (slot.name === 'rotation') {\n\t\t\treturn this.rotation\n\t\t}\n\t\telse if (slot.name === 'scale') {\n\t\t\treturn this.scale\n\t\t}\n\t\telse if (slot.name === 'name') {\n\t\t\treturn this.name\n\t\t}\n\t}\n\n\tThreeObject3DAttributeExtractor.prototype.update_input = function(slot, data) {\n\t\tthis.object3d = data\n\t\tthis.meshDirty = true\n\t}\n\n\tThreeObject3DAttributeExtractor.prototype.update_state = function() {\n\t\tif (!this.meshDirty) {\n\t\t\treturn\n\t\t}\n\t\tthis.position.copy(this.object3d.position)\n\n\t\tthis.euler.setFromQuaternion(this.object3d.quaternion, \"YZX\")\n\t\tthis.rotation.set(this.euler.x, this.euler.y, this.euler.z)\n\n\t\tthis.scale.copy(this.object3d.scale)\n\n\t\tthis.name = this.object3d.name\n\n\t\tthis.meshDirty = false\n\t}\n})()"
  },
  {
    "path": "browser/plugins/three_object3d_bbox_extractor.plugin.js",
    "content": "(function() {\n\tvar ThreeObject3DBBoxExtractor = E2.plugins.three_object3d_bbox_extractor = function (core) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.input_slots = [{\n\t\t\tname: 'object3d',\n\t\t\tdt: core.datatypes.OBJECT3D,\n\t\t\tdesc: 'mesh to extract bounding box from'\n\t\t}]\n\n\t\tthis.output_slots = [\n\t\t\t{ name: 'min', dt: core.datatypes.VECTOR },\n\t\t\t{ name: 'max', dt: core.datatypes.VECTOR }\n\t\t]\n\n\t\tthis.desc = 'Extract bounding box from Mesh'\n\t}\n\n\tThreeObject3DBBoxExtractor.prototype = Object.create(Plugin.prototype)\n\tThreeObject3DBBoxExtractor.prototype.constructor = Plugin.prototype\n\n\tThreeObject3DBBoxExtractor.prototype.reset = function() {\n\t\tthis.object3d = undefined\n\n\t\tthis.bbox = new THREE.Box3()\n\n\t\tthis.meshDirty = false\n\t}\n\n\tThreeObject3DBBoxExtractor.prototype.update_output = function(slot) {\n\t\tif (slot.name === 'min') {\n\t\t\treturn this.bbox.min\n\t\t}\n\t\telse if (slot.name === 'max') {\n\t\t\treturn this.bbox.max\n\t\t}\n\t}\n\n\tThreeObject3DBBoxExtractor.prototype.update_input = function(slot, data) {\n\t\tthis.object3d = data\n\t\tthis.meshDirty = true\n\t}\n\n\tThreeObject3DBBoxExtractor.prototype.update_state = function() {\n\t\tif (!this.meshDirty) {\n\t\t\treturn\n\t\t}\n\n\t\tif (this.object3d) {\n\t\t\tthis.bbox.setFromObject(this.object3d)\n\t\t}\n\t\telse {\n\t\t\tthis.bbox.makeEmpty()\n\t\t}\n\n\t\tthis.meshDirty = false\n\t}\n})()"
  },
  {
    "path": "browser/plugins/three_orbit_camera.plugin.js",
    "content": "(function() {\n\tvar ThreeOrbitCameraPlugin = E2.plugins.three_orbit_camera = function(core) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'THREE.js Orbit Camera'\n\n\t\tthis.defaultFOV = 90\n\n\t\t// try to find out default fov from the device\n\t\tif (window.HMDVRDevice && window.HMDVRDevice.getEyeParameters) {\n\t\t\tvar eyeParams = window.HMDVRDevice.getEyeParameters()\n\n\t\t\tif (eyeParams.recommendedFieldOfView) {\n\t\t\t\tthis.defaultFOV = eyeParams.recommendedFieldOfView\n\t\t\t}\n\t\t\telse if (eyeParams.leftDegrees && eyeParams.rightDegrees) {\n\t\t\t\tthis.defaultFOV = eyeParams.leftDegrees + eyeParams.rightDegrees\n\t\t\t}\n\t\t}\n\n\t\tthis.input_slots = [\n\t\t\t{ name: 'position', dt: core.datatypes.VECTOR },\n\t\t\t{ name: 'rotation', dt: core.datatypes.VECTOR },\n\t\t\t{ name: 'offset', dt: core.datatypes.VECTOR, def: new THREE.Vector3(2, 2, 2)},\n\t\t\t{ name: 'fov', dt: core.datatypes.FLOAT, def: this.defaultFOV },\n\t\t\t{ name: 'aspectRatio', dt: core.datatypes.FLOAT, def: 1.0},\n\t\t\t{ name: 'near', dt: core.datatypes.FLOAT, def: 0.001 },\n\t\t\t{ name: 'far', dt: core.datatypes.FLOAT, def: 1000.0 }\n\t\t]\n\n\t\tthis.output_slots = [\n\t\t\t{name: 'camera',\tdt: core.datatypes.CAMERA},\n\t\t\t{name: 'position',\tdt: core.datatypes.VECTOR},\n\t\t\t{name: 'rotation',\tdt: core.datatypes.VECTOR}\n\t\t]\n\n\t\tthis.always_update = true\n\t\tthis.dirty = false\n\n\t\tthis.state = {\n\t\t\tposition: {x: 0, y: 0, z:0},\n\n\t\t\t// names with underscores have to match with THREE.Quaternion\n\t\t\t// member variable names because of to/from json serialisation\n\t\t\tquaternion: {_x: 0, _y: 0, _z:0, _w:1}\n\t\t}\n\n\t\tthis.rotationFromGraph = new THREE.Euler()\n\t\tthis.positionFromGraph = new THREE.Vector3()\n\n\t\tthis.outputRotationEuler = new THREE.Euler()\n\t\tthis.outputPosition = new THREE.Vector3()\n\t}\n\n\tThreeOrbitCameraPlugin.prototype = Object.create(Plugin.prototype)\n\n\tThreeOrbitCameraPlugin.prototype.reset = function() {\n\t\tPlugin.prototype.reset.apply(this, arguments)\n\n\t\tthis.domElement = E2.dom.webgl_canvas[0]\n\n\t\tif (!this.dolly) {\n\t\t\tthis.dolly = new THREE.PerspectiveCamera()\n\t\t}\n\n\t\tif (!this.orbitControlCamera) {\n\t\t\tthis.orbitControlCamera = new THREE.PerspectiveCamera(\n\t\t\t\tthis.defaultFOV,\n\t\t\t\tthis.domElement.clientWidth / this.domElement.clientHeight,\n\t\t\t\t0.001,\n\t\t\t\t1000)\n\n\t\t\t// layer is for mono camera only\n\t\t\tthis.orbitControlCamera.layers.enable(3)\n\n\t\t\tthis.dolly.add(this.orbitControlCamera)\n\t\t}\n\n\t\t// create an object3d reference so that the world editor sees the camera\n\t\t// as an object3d\n\t\tthis.object3d = this.dolly\n\t\tthis.object3d.backReference = this\n\n\t\tif (!this.controls) {\n\t\t\tthis.controls = new THREE.OrbitControls(this.orbitControlCamera, this.domElement)\n\t\t}\n\n\t\tthis.object3d.position.set(this.state.position.x, this.state.position.y, this.state.position.z)\n\t\tthis.object3d.quaternion.set(this.state.quaternion._x, this.state.quaternion._y, this.state.quaternion._z, this.state.quaternion._w)\n\n\t\tthis.positionFromGraph.copy(this.inputValues.position)\n\t\tthis.orbitControlCamera.position.copy(this.inputValues.offset)\n\n\t\tthis.controls.update()\n\t}\n\n\tThreeOrbitCameraPlugin.prototype.play = function() {\n\t\tthis.resize()\n\t}\n\n\tThreeOrbitCameraPlugin.prototype.resize = function() {\n\t\tvar isFullscreen = !!(document.mozFullScreenElement || document.webkitFullscreenElement);\n\t\tvar wh = { width: window.innerWidth, height: window.innerHeight }\n\n\t\tif (!isFullscreen) {\n\t\t\twh.width = this.domElement.clientWidth\n\t\t\twh.height = this.domElement.clientHeight\n\n\t\t\tif (typeof(E2.app.calculateCanvasArea) !== 'undefined')\n\t\t\t\twh = E2.app.calculateCanvasArea()\n\t\t}\n\n\t\tthis.orbitControlCamera.aspect = wh.width / wh.height\n\t\tthis.orbitControlCamera.updateProjectionMatrix()\n\t}\n\n\tThreeOrbitCameraPlugin.prototype.update_state = function() {\n\t\tthis.object3d.position.set(\n\t\t\tthis.positionFromGraph.x + this.state.position.x,\n\t\t\tthis.positionFromGraph.y + this.state.position.y,\n\t\t\tthis.positionFromGraph.z + this.state.position.z)\n\n\t\tthis.object3d.quaternion.setFromEuler(this.rotationFromGraph)\n\t\tthis.object3d.quaternion.multiply(this.state.quaternion)\n\n\t\tif (this.dirty)\n\t\t\tthis.orbitControlCamera.updateProjectionMatrix()\n\n\t\tthis.object3d.updateMatrixWorld()\n\n\t\tthis.updated = true\n\t}\n\n\tThreeOrbitCameraPlugin.prototype.update_input = function(slot, data) {\n\t\tif (!this.object3d) {\n\t\t\treturn\n\t\t}\n\n\t\tif (slot.name === 'position') { // position\n\t\t\tthis.positionFromGraph.copy(data)\n\t\t\tthis.dirty = true\n\t\t}\n\t\telse if (slot.name === 'rotation') {\n\t\t\tthis.rotationFromGraph.set(data.x, data.y, data.z)\n\t\t\tthis.dirty = true\n\t\t}\n\t\telse if (slot.name === 'offset') {\n\t\t\tthis.orbitControlCamera.position.copy(data)\n\t\t\tthis.dirty = true\n\t\t}\n\t\telse if (slot.name === 'fov') {\n\t\t\tthis.orbitControlCamera.fov = data\n\t\t\tthis.dirty = true\n\t\t}\n\t\telse if (slot.name === 'aspectRatio') {\n\t\t\tthis.orbitControlCamera.aspect = data\n\t\t\tthis.dirty = true\n\t\t}\n\t\telse if (slot.name === 'near') {\n\t\t\tthis.orbitControlCamera.near = data\n\t\t\tthis.dirty = true\n\t\t}\n\t\telse if (slot.name === 'far') {\n\t\t\tthis.orbitControlCamera.far = data\n\t\t\tthis.dirty = true\n\t\t}\n\t}\n\n\tThreeOrbitCameraPlugin.prototype.update_output = function(slot) {\n\t\tif (slot.index === 0) { // camera\n\t\t\treturn this.orbitControlCamera\n\t\t}\n\t\telse if (slot.index === 1) { // position\n\t\t\tthis.outputPosition.copy(this.orbitControlCamera.position)\n\t\t\tthis.outputPosition.applyMatrix4(this.orbitControlCamera.matrixWorld)\n\t\t\treturn this.outputPosition\n\t\t}\n\t\telse if (slot.index === 2) { // rotation\n\t\t\tvar tempQuaternion = this.orbitControlCamera.quaternion.clone()\n\t\t\ttempQuaternion.multiply(this.object3d.quaternion)\n\t\t\tthis.outputRotationEuler.setFromQuaternion(tempQuaternion, \"YZX\")\n\t\t\treturn this.outputRotationEuler\n\t\t}\n\t}\n\n\tThreeOrbitCameraPlugin.prototype.state_changed = function(ui) {\n\t\tif (!ui) {\n\t\t\tE2.core.on('resize', this.resize.bind(this))\n\t\t}\n\t}\n\n\tThreeOrbitCameraPlugin.prototype.canEditPosition = function() {\n\t\treturn true\n\t}\n\n\tThreeOrbitCameraPlugin.prototype.canEditQuaternion = function() {\n\t\treturn true\n\t}\n\n\tThreeOrbitCameraPlugin.prototype.canEditScale = function() {\n\t\treturn false\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_particle_emitter.plugin.js",
    "content": "(function() {\n\tvar ThreeParticleEmitter = E2.plugins.three_particle_emitter = function(core) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.desc =\n\t\t\t'Particle emitter generating a point cloud that can be' +\n\t\t\t'used in a point cloud'\n\n\t\tthis.input_slots = [{\n\t\t\tname: 'particle count',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 100\n\t\t}, {\n\t\t\tname: 'spawn rate',\n\t\t\tdesc: 'the amount of particles to spawn per second',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 0.1,\n\t\t\tvalidate: function(v) {return v < 0 ? 0 : (v > 1 ? 1 : v)}\n\t\t}, {\n\t\t\tname: 'random seed',\n\t\t\tdesc: 'seed to initialise the random number generator with',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 0\n\t\t}, {\n\t\t\tname: 'direction',\n\t\t\tdt: core.datatypes.VECTOR,\n\t\t\tdef: new THREE.Vector3(0, 1, 0)\n\t\t}, {\n\t\t\tname: 'speed',\n\t\t\tdesc: 'speed along direction',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 1.0\n\t\t}, {\n\t\t\tname: 'spread',\n\t\t\tdesc: 'spread around direction',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 1.0\n\t\t}, {\n\t\t\tname: 'lifetime',\n\t\t\tdesc: 'particle lifetime',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 1.0\n\t\t}, {\n\t\t\tname: 'gravity',\n\t\t\tdesc: 'gravity vector',\n\t\t\tdt: core.datatypes.VECTOR,\n\t\t\tdef: null\n\t\t}, {\n\t\t\tname: 'noise',\n\t\t\tdesc: 'amount of noise to apply to movement',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 0.5\n\t\t}, {\n\t\t\tname: 'geometry',\n\t\t\tdesc: 'emit from this geometry',\n\t\t\tdt: core.datatypes.GEOMETRY,\n\t\t\tdef: 0\n\t\t}]\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'geometry',\n\t\t\tdt: core.datatypes.GEOMETRY\n\t\t}]\n\n\t\tthis.always_update = true\n\t}\n\n\tThreeParticleEmitter.prototype = Object.create(Plugin.prototype)\n\n\tThreeParticleEmitter.prototype.reset = function() {\n\t\tthis.buffersDirty = true\n\t\tthis.positionsDirty = true\n\t\tthis.particleCount = 100\n\t\tthis.spawnRate = 0.1\n\n\t\tthis.direction = new THREE.Vector3()\n\t\tthis.velocity = 1\n\t\tthis.spread = 1\n\t\tthis.lifetime = 1.0\n\n\t\tthis.gravity = null\n\n\t\tthis.rngSeed = 0\n\t}\n\n\tThreeParticleEmitter.prototype.initialiseRandom = function() {\n\t\tthis.random = new Random(Random.engines.mt19937().seed(this.rngSeed))\n\t}\n\n\tThreeParticleEmitter.prototype.createBuffers = function() {\n\t\tif (!this.random) {\n\t\t\tthis.initialiseRandom()\n\t\t}\n\n\t\tthis.geometry = new THREE.Geometry()\n\n\t\tthis.particles = []\n\n\t\tfor (var i = 0; i < this.particleCount; ++i) {\n\t\t\tthis.geometry.vertices.push(new THREE.Vector3())\n\t\t\tthis.particles.push({\n\t\t\t\tposition: new THREE.Vector3(),\n\t\t\t\tvelocity: new THREE.Vector3(),\n\t\t\t\tlifetime: 0.0\n\t\t\t})\n\t\t}\n\n\t\tthis.buffersDirty = false\n\t}\n\n\tThreeParticleEmitter.prototype.updateParticles = function(updateContext) {\n\t\tvar particlesToSpawn =\n\t\t\tthis.particleCount * this.spawnRate * updateContext.delta_t\n\n\t\tvar gravity\n\n\t\tif (this.gravity) {\n\t\t\tgravity = this.gravity.clone()\n\t\t\tgravity.multiplyScalar(updateContext.delta_t)\n\t\t}\n\n\t\tfor (var i = 0; i < this.particles.length; ++i) {\n\t\t\tvar p = this.particles[i]\n\t\t\tif (p.lifetime > 0.0) {\n\t\t\t\tp.position.addScaledVector(p.velocity, updateContext.delta_t * 30) // 30 for backwards compatibility to not break old graphs too much\n\t\t\t\tp.lifetime -= updateContext.delta_t\n\t\t\t\tif (this.gravity) {\n\t\t\t\t\tp.velocity.add(gravity)\n\t\t\t\t}\n\t\t\t\tif (this.noise > 0) {\n\t\t\t\t\tvar noiseMin = -updateContext.delta_t * this.noise\n\t\t\t\t\tvar noiseMax = -noiseMin\n\n\t\t\t\t\tp.velocity.x += this.random.real(noiseMin, noiseMax)\n\t\t\t\t\tp.velocity.y += this.random.real(noiseMin, noiseMax)\n\t\t\t\t\tp.velocity.z += this.random.real(noiseMin, noiseMax)\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (particlesToSpawn >= 0) {\n\t\t\t\tif (this.vertices) {\n\t\t\t\t\tvar ranIdx = this.random.uint32() % this.vertices.length\n\t\t\t\t\tvar vtx = this.vertices[ranIdx]\n\t\t\t\t\tp.position.copy(vtx)\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tp.position.set(0, 0, 0)\n\t\t\t\t}\n\t\t\t\tp.velocity.set(\n\t\t\t\t\tthis.random.real(-1,1) * this.spread,\n\t\t\t\t\tthis.random.real(-1,1) * this.spread,\n\t\t\t\t\tthis.random.real(-1,1) * this.spread)\n\n\t\t\t\tp.velocity.add(this.direction)\n\t\t\t\tp.velocity.multiplyScalar(\n\t\t\t\t\tthis.velocity * (1 + this.random.real(-1, 1) * this.noise))\n\n\t\t\t\tp.lifetime = this.lifetime\n\n\t\t\t\tparticlesToSpawn--\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// temporarily move out of the way\n\t\t\t\t// not ideal as this will expand the bbox,\n\t\t\t\t// however looks better than a blob in world origin\n\t\t\t\tp.position.set(10000, 10000, 10000)\n\t\t\t}\n\n\t\t\tthis.geometry.vertices[i].copy(p.position)\n\t\t}\n\n\t\tthis.geometry.verticesNeedUpdate = true\n\t\tthis.geometry.computeBoundingBox()\n\t\tthis.geometry.computeBoundingSphere()\n\t}\n\n\tThreeParticleEmitter.prototype.update_input = function(slot, data) {\n\t\tif (slot.index === 0) { // particle count\n\t\t\tvar newParticleCount = Math.floor(data)\n\t\t\tif (this.particleCount != newParticleCount || !this.particles) {\n\t\t\t\tthis.particleCount = newParticleCount\n\t\t\t\tthis.buffersDirty = true\n\t\t\t}\n\t\t}\n\t\telse if (slot.index === 1) { // spawn rate\n\t\t\tthis.spawnRate = data\n\t\t}\n\t\telse if (slot.index === 2) { // random seed\n\t\t\tif (this.rngSeed !== data) {\n\t\t\t\tthis.rngSeed = data\n\t\t\t\tthis.initialiseRandom()\n\t\t\t}\n\t\t}\n\t\telse if (slot.index === 3) { // direction\n\t\t\tthis.direction = data\n\t\t}\n\t\telse if (slot.index === 4) { // speed\n\t\t\tthis.velocity = data\n\t\t}\n\t\telse if (slot.index === 5) { // spread\n\t\t\tthis.spread = data\n\t\t}\n\t\telse if (slot.index === 6) { // lifetime\n\t\t\tthis.lifetime = data\n\t\t}\n\t\telse if (slot.index === 7) { // gravity\n\t\t\tthis.gravity = data\n\t\t}\n\t\telse if (slot.index === 8) { // noise\n\t\t\tthis.noise = data\n\t\t}\n\t\telse if (slot.index === 9) { // geometry\n\t\t\tif (data instanceof THREE.BufferGeometry) {\n\t\t\t\tvar tempGeom = new THREE.Geometry()\n\t\t\t\ttempGeom.fromBufferGeometry(data)\n\t\t\t\tthis.vertices = tempGeom.vertices.length > 0 ? tempGeom.vertices : undefined\n\t\t\t}\n\t\t\telse if (data instanceof THREE.Geometry) {\n\t\t\t\tthis.vertices = data.vertices.length > 0 ? data.vertices : undefined\n\t\t\t}\n\t\t\telse // !data\n\t\t\t{\n\t\t\t\tthis.vertices = undefined\n\t\t\t}\n\t\t}\n\t}\n\n\tThreeParticleEmitter.prototype.update_output = function() {\n\t\treturn this.geometry\n\t}\n\n\tThreeParticleEmitter.prototype.update_state = function(updateContext) {\n\t\tif (this.buffersDirty) {\n\t\t\tthis.createBuffers()\n\t\t}\n\n\t\tthis.updateParticles(updateContext)\n\t}\n})()\n"
  },
  {
    "path": "browser/plugins/three_perspective_camera.plugin.js",
    "content": "(function() {\n\tvar ThreePerspectiveCameraPlugin = E2.plugins.three_perspective_camera = function(core) {\n\t\tThreeObject3DPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'THREE.js Perspective Camera'\n\t\t\n\t\tthis.input_slots = [\n\t\t\t{ name: 'fov', dt: core.datatypes.FLOAT, def: 45.0 },\n\t\t\t{ name: 'aspectRatio',\n\t\t\t\tdt: core.datatypes.FLOAT,\n\t\t\t\tdef: 1.0\n\t\t\t},\n\t\t\t{ name: 'near', dt: core.datatypes.FLOAT, def: 1.0 },\n\t\t\t{ name: 'far', dt: core.datatypes.FLOAT, def: 1000.0 },\n\t\t].concat(this.input_slots)\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'camera',\n\t\t\tdt: core.datatypes.CAMERA\n\t\t}]\n\t}\n\n\tThreePerspectiveCameraPlugin.prototype = Object.create(ThreeObject3DPlugin.prototype)\n\n\tThreePerspectiveCameraPlugin.prototype.reset = function() {\n\t\tThreeObject3DPlugin.prototype.reset.apply(this, arguments)\n\n\t\tthis.setObject3D(new THREE.PerspectiveCamera(\n\t\t\t45,\n\t\t\twindow.innerWidth/window.innerHeight,\n\t\t\t0.1,\n\t\t\t1000\n\t\t))\n\n\t\tthis.object3d.position.z = 5\n\t}\n\n\tThreePerspectiveCameraPlugin.prototype.update_input = function(slot, data) {\n\t\tswitch(slot.index) {\n\t\t\tcase 0:\n\t\t\t\tthis.object3d.fov = data\n\t\t\t\tbreak;\n\t\t\tcase 1:\n\t\t\t\tthis.object3d.aspectRatio = data\n\t\t\t\tbreak;\n\t\t\tcase 2: \n\t\t\t\tthis.object3d.near = data\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tthis.object3d.far = data\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn ThreeObject3DPlugin.prototype.update_input.apply(this, arguments)\n\t\t}\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_point_cloud_material.plugin.js",
    "content": "(function() {\n\tvar ThreePointCloudMaterialPlugin = E2.plugins.three_point_cloud_material = function(core) {\n\t\tAbstractThreeMaterialPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'THREE.js Point Cloud Material'\n\n\t\tthis.input_slots = [\n\t\t\t{\tname: 'texture', dt: core.datatypes.TEXTURE },\n\t\t\t{\tname: 'color', dt: core.datatypes.COLOR, def: new THREE.Color(0xffffff) },\n\t\t\t{   name: 'size', dt: core.datatypes.FLOAT, def: 1.0 },\n\t\t\t{   name: 'sizeAttenuation', dt: core.datatypes.FLOAT, def: 1.0 },\n\t\t\t{\tname: 'fog', dt: core.datatypes.BOOL, def: true,\n\t\t\t\tdesc: 'Define whether the material color is affected by global fog settings.'\n\t\t\t},\n\t\t\t{   name: 'depthTest', dt: core.datatypes.BOOL, def: true}\n\t\t].concat(this.input_slots)\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'material',\n\t\t\tdt: core.datatypes.MATERIAL\n\t\t}]\n\t}\n\n\tThreePointCloudMaterialPlugin.prototype = Object.create(AbstractThreeMaterialPlugin.prototype)\n\n\tThreePointCloudMaterialPlugin.prototype.reset = function() {\n\t\tAbstractThreeMaterialPlugin.prototype.reset.call(this)\n\t\tthis.material = new THREE.PointsMaterial()\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_point_cloud_mesh.plugin.js",
    "content": "(function() {\n\tvar createThreeMeshRoot = function() {\n\t\treturn new THREE.Object3D()\n\t}\n\n\tvar createThreePointCloud = function(geom, mats) {\n\t\tvar pc = new THREE.Points(geom, mats)\n\t\treturn pc\n\t}\n\n\tvar ThreePointCloudMeshPlugin = E2.plugins.three_point_cloud_mesh = function(core) {\n\t\tAbstractThreeMeshPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'THREE.js Point Cloud Mesh'\n\n\t\tthis.createMeshRoot = createThreeMeshRoot\n\t\tthis.createAnimatedMesh = createThreePointCloud\n\t\tthis.createMesh = createThreePointCloud\n\t}\n\n\tThreePointCloudMeshPlugin.prototype = Object.create(AbstractThreeMeshPlugin.prototype)\n\n\tThreePointCloudMeshPlugin.prototype.update_input = function(slot, data) {\n\t\tif (slot.index === 1) { // material\n\t\t\tvar enabled = data.transparent ? true : false\n\n\t\t\tif (this.sortParticles !== enabled) {\n\t\t\t\tthis.object3d.traverse(function(object) {\n\t\t\t\t\tif (object instanceof THREE.PointCloud) {\n\t\t\t\t\t\tobject.sortParticles = enabled\n\t\t\t\t\t}\n\t\t\t\t})\n\n\t\t\t\tthis.sortParticles = enabled\n\t\t\t}\n\t\t}\n\n\t\tAbstractThreeMeshPlugin.prototype.update_input.apply(this, arguments)\n\t}\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_point_light.plugin.js",
    "content": "(function() {\n\tvar ThreePointLightPlugin = E2.plugins.three_point_light = function(core) {\n\t\tThreeObject3DPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'THREE.js Point Light'\n\n\t\tthis.params = {\n\t\t\tcolor: new THREE.Color(0xffffff),\n\t\t\tintensity: 1.0,\n\t\t\tdistance: 0.0,\n\t\t\tdecay: 1.0\n\t\t}\n\n\t\tthis.input_slots = [\n\t\t\t{ name: 'intensity', dt: core.datatypes.FLOAT, def: this.params.intensity },\n\t\t\t{ name: 'distance', dt: core.datatypes.FLOAT, def: this.params.distance },\n\t\t\t{ name: 'decay', dt: core.datatypes.FLOAT, def: this.params.decay },\n\t\t\t{ name: 'color', dt: core.datatypes.COLOR, def: this.params.color }\n\t\t].concat(this.input_slots)\n\n\t\t// disable shadows by default for point lights - they're slow\n\t\tthis.input_slots.map(function(input) {\n\t\t\tif (input.name === 'castShadow') {\n\t\t\t\tinput.def = false\n\t\t\t}\n\t\t\telse if (input.name === 'receiveShadow') {\n\t\t\t\tinput.def = false\n\t\t\t}\n\t\t})\n\t}\n\n\tThreePointLightPlugin.prototype = Object.create(ThreeObject3DPlugin.prototype)\n\n\tThreePointLightPlugin.prototype.reset = function() {\n\t\tThreeObject3DPlugin.prototype.reset.apply(this)\n\n\t\tthis.setObject3D(new THREE.PointLight( 0xFFFFFF )) // soft white light\n\t}\n\n\t// disable scaling, it doesn't make sense for lights\n\tThreePointLightPlugin.prototype.canEditScale = function() {\n\t\treturn false\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_procedural_ground.plugin.js",
    "content": "(function() {\n\tvar ThreeProceduralGroundPlugin = E2.plugins.three_procedural_ground = function(core) {\n\t\tThreeObject3DPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'THREE.js Procedural Ground'\n\n\t\tthis.input_slots = [\n\t\t\t{ name: 'x size', dt: core.datatypes.FLOAT, def: 40 },\n\t\t\t{ name: 'y size', dt: core.datatypes.FLOAT, def: 10 },\n\t\t\t{ name: 'z size', dt: core.datatypes.FLOAT, def: 40 },\n\t\t\t{ name: 'seed', dt: core.datatypes.FLOAT, def: 0},\n\t\t\t{ name: 'noise factor', dt: core.datatypes.FLOAT, def: 0.25},\n\t\t\t{ name: 'noise octaves', dt: core.datatypes.FLOAT, def: 3},\n\t\t\t{ name: 'noise scale', dt: core.datatypes.FLOAT, def: 1.0},\n\t\t\t{ name: 'ground height', dt: core.datatypes.FLOAT, def: 0.0},\n\t\t\t{ name: 'rock height', dt: core.datatypes.FLOAT, def: 3.0}\n\t\t].concat(this.input_slots)\n\n\t\tthis.xSize = 20\n\t\tthis.ySize = 20\n\t\tthis.zSize = 20\n\n\t\tthis.rngSeed = 10\n\t\tthis.noiseFactor = 0.25\n\t\tthis.noiseOctaves = 1.0\n\t\tthis.noiseScale = 1.0\n\t\tthis.groundHeight = 0.0\n\t\tthis.rockHeight = 3.0\n\n\t\tthis.dirty = true\n\t}\n\n\tThreeProceduralGroundPlugin.prototype = Object.create(ThreeObject3DPlugin.prototype)\n\n\tThreeProceduralGroundPlugin.prototype.reset = function() {\n\t\tThreeObject3DPlugin.prototype.reset.apply(this, arguments)\n\t\tif (this.dirty)\n\t\t\tthis.generate_mesh()\n\t}\n\n\t// geometry ---\n\n\tThreeProceduralGroundPlugin.prototype.GeometryGenerator = function(parent) {\n\t\t//THREE.Geometry.call(this)\n\t\tthis.type = 'VizorProceduralGround'\n\n\t\tvar i, j\n\n\t\tthat = this\n\n\t\tthis.initialise = function(xSize, ySize, zSize) {\n\t\t\tTHREE.Geometry.call(that)\n\n\t\t\tthat.dynamic = true\n\n\t\t\tthat.xSegments = xSize\n\t\t\tthat.zSegments = zSize\n\n\t\t\tthat.xSize = xSize\n\t\t\tthat.ySize = ySize\n\t\t\tthat.zSize = zSize\n\n\t\t\tfor (j = 0; j < that.zSegments + 1; j++) {\n\t\t\t\tfor (i = 0; i < that.xSegments + 1; i++) {\n\t\t\t\t\tthat.vertices.push(new THREE.Vector3())\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (j = 0; j < that.zSegments; j++) {\n\t\t\t\tfor (i = 0; i < that.xSegments; i++) {\n\t\t\t\t\tthat.faces.push(new THREE.Face3())\n\t\t\t\t\tthat.faceVertexUvs[0].push([0,0,0])\n\n\t\t\t\t\tthat.faces.push(new THREE.Face3())\n\t\t\t\t\tthat.faceVertexUvs[0].push([0,0,0])\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.getNormal = function(vertices, xSegments, i, j, aorb) {\n\t\t\t// calculate a normal from one of two triangles (aorb) in a grid\n\t\t\tvar idxa = j * (xSegments + 1) + i\n\t\t\tvar idxb = j * (xSegments + 1) + i + 1\n\t\t\tvar idxc = (j + 1) * (xSegments + 1) + i\n\t\t\tvar idxd = (j + 1) * (xSegments + 1) + i + 1\n\n\t\t\tvar a = new THREE.Vector3()\n\t\t\tvar b = new THREE.Vector3()\n\n\t\t\tif (aorb == 0) {\n\t\t\t\ta.subVectors(vertices[idxb], vertices[idxa])\n\t\t\t\tb.subVectors(vertices[idxc], vertices[idxa])\n\t\t\t}\n\t\t\telse {\n\t\t\t\ta.subVectors(vertices[idxb], vertices[idxc])\n\t\t\t\tb.subVectors(vertices[idxd], vertices[idxc])\n\t\t\t}\n\n\t\t\ta.normalize()\n\t\t\tb.normalize()\n\n\t\t\tvar normal = new THREE.Vector3()\n\t\t\tnormal.crossVectors(a, b)\n\n\t\t\treturn normal\n\t\t}\n\n\t\tthis.getYPos = function(vertices, xSegments, i, j, aorb) {\n\t\t\t// calculate a normal from one of two triangles (aorb) in a grid\n\t\t\tvar idxa = j * (xSegments + 1) + i\n\t\t\tvar idxb = j * (xSegments + 1) + i + 1\n\t\t\tvar idxc = (j + 1) * (xSegments + 1) + i\n\t\t\tvar idxd = (j + 1) * (xSegments + 1) + i + 1\n\n\t\t\tvar res = 0\n\n\t\t\tif (aorb == 0) {\n\t\t\t\tres = vertices[idxa]['y'] + vertices[idxb]['y'] + vertices[idxc]['y']\n\t\t\t}\n\t\t\telse {\n\t\t\t\tres = vertices[idxb]['y'] + vertices[idxc]['y'] + vertices[idxd]['y']\n\t\t\t}\n\n\t\t\treturn res\n\t\t}\n\n\t\tthis.needsReinitialising = function(xSize, ySize, zSize) {\n\t\t\treturn !(xSize == that.xSize && ySize == that.ySize && zSize == that.zSize)\n\t\t}\n\n\t\tthis.update = function() {\n\t\t\tvar vtxidx = 0\n\n\t\t\tfor (j = 0; j < that.zSegments + 1; j++) {\n\t\t\t\tfor (i = 0 ; i < that.xSegments + 1; i++) {\n\t\t\t\t\t// plane coordinates on [-1, 1]-[1, -1]\n\t\t\t\t\tvar xf = (-0.5 + i * 1.0 / that.xSegments) * 2.0\n\t\t\t\t\tvar zf = (0.5 - j * 1.0 / that.zSegments) * 2.0\n\n\t\t\t\t\t// twist a square plane into a circle\n\t\t\t\t\tvar f = Math.abs(xf) < Math.abs(zf) ? (1 / Math.abs(zf)) : (1 / Math.abs(xf))\n\t\t\t\t\tf = (isNaN(f) || f > 10) ? 10 : f\n\n\t\t\t\t\tvar twistFactor = Math.min(Math.max(0, 1 - f / 10), 1)\n\t\t\t\t\tvar mul = 1 + (Math.sqrt(xf * f * xf * f + zf * f * zf * f) - 1) * twistFactor\n\t\t\t\t\txf /= mul\n\t\t\t\t\tzf /= mul\n\n\t\t\t\t\t// y displacement\n\t\t\t\t\tvar m = Math.abs(xf)\n\t\t\t\t\tvar n = Math.abs(zf)\n\t\t\t\t\tvar nm = Math.sqrt(m * m + n * n)\n\n\t\t\t\t\tnm *= nm\n\n\t\t\t\t\tvar yf = parent.noise.noise2D(i * parent.noiseScale, j * parent.noiseScale, Math.floor(parent.noiseOctaves), that.xSegments) * parent.noiseFactor * nm\n\n\t\t\t\t\t// x, z displacement\n\t\t\t\t\tvar pushOutFactor= 1.0 // + (parent.rng.real(0, 1)) * parent.noiseFactor * m * n\n\t\t\t\t\txf *= pushOutFactor\n\t\t\t\t\tyf *= pushOutFactor\n\t\t\t\t\tzf *= pushOutFactor\n\n\t\t\t\t\t/*\n\t\t\t\t\t // push outmost vertices down for an 'edge' effect\n\t\t\t\t\t if (j === 0 || j === zSegments || i === 0 || i === xSegments) {\n\t\t\t\t\t yf -= 0.25\n\t\t\t\t\t }*/\n\n\t\t\t\t\tthat.vertices[vtxidx]['x'] = xf * that.xSize * 0.5\n\t\t\t\t\tthat.vertices[vtxidx]['y'] = yf * that.ySize * 0.5\n\t\t\t\t\tthat.vertices[vtxidx]['z'] = zf * that.zSize * 0.5\n\n\t\t\t\t\tvtxidx++\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar defaultColor = new THREE.Color()\n\n\t\t\tvtxidx = 0\n\t\t\tvar faceidx = 0\n\t\t\tfor (j = 0; j < that.zSegments; j++) {\n\t\t\t\tfor (i = 0; i < that.xSegments; i++) {\n\t\t\t\t\tvar uva = new THREE.Vector2( i / that.xSegments, 1 - j / that.zSegments )\n\t\t\t\t\tvar uvb = new THREE.Vector2( i / that.xSegments, 1 - ( j + 1 ) / that.zSegments )\n\t\t\t\t\tvar uvc = new THREE.Vector2( ( i + 1 ) / that.xSegments, 1 - ( j + 1 ) / that.zSegments )\n\t\t\t\t\tvar uvd = new THREE.Vector2( ( i + 1 ) / that.xSegments, 1 - j / that.zSegments )\n\n\n\t\t\t\t\tvar normal = that.getNormal(that.vertices, that.xSegments, i, j, 0.0)\n\t\t\t\t\tvar ypos = that.getYPos(that.vertices, that.xSegments, i, j, 0.0)\n\t\t\t\t\tvar materialIndex = ypos < parent.groundHeight ? 2 : (ypos > parent.rockHeight ? 0 : 1)\n\n\t\t\t\t\tthat.faces[faceidx].a = vtxidx\n\t\t\t\t\tthat.faces[faceidx].b = vtxidx + 1\n\t\t\t\t\tthat.faces[faceidx].c = vtxidx + (that.xSegments + 1)\n\t\t\t\t\tthat.faces[faceidx].normal = normal\n\t\t\t\t\tthat.faces[faceidx].color = defaultColor\n\t\t\t\t\tthat.faces[faceidx].vertexNormals = [normal.clone(), normal.clone(), normal.clone()]\n\t\t\t\t\tthat.faces[faceidx].materialIndex = materialIndex\n\n\t\t\t\t\tthat.faceVertexUvs[0][faceidx][0] = uva\n\t\t\t\t\tthat.faceVertexUvs[0][faceidx][1] = uvb\n\t\t\t\t\tthat.faceVertexUvs[0][faceidx][2] = uvc\n\n\t\t\t\t\tfaceidx++\n\n\t\t\t\t\tnormal = that.getNormal(that.vertices, that.xSegments, i, j, 1.0)\n\t\t\t\t\t//ypos = _getYPos(this.vertices, i, j, 1.0)\n\t\t\t\t\t//materialIndex = ypos < parent.groundHeight ? 2 : (ypos > parent.rockHeight ? 0 : 1)\n\n\t\t\t\t\tthat.faces[faceidx].a = vtxidx + (that.xSegments + 1)\n\t\t\t\t\tthat.faces[faceidx].b = vtxidx + 1\n\t\t\t\t\tthat.faces[faceidx].c = vtxidx + (that.xSegments + 2)\n\t\t\t\t\tthat.faces[faceidx].normal = normal\n\t\t\t\t\tthat.faces[faceidx].color = defaultColor\n\t\t\t\t\tthat.faces[faceidx].vertexNormals = [normal.clone(), normal.clone(), normal.clone()]\n\t\t\t\t\tthat.faces[faceidx].materialIndex = materialIndex\n\n\t\t\t\t\tthat.faceVertexUvs[0][faceidx][0] = uvc\n\t\t\t\t\tthat.faceVertexUvs[0][faceidx][1] = uvb\n\t\t\t\t\tthat.faceVertexUvs[0][faceidx][2] = uvd\n\n\t\t\t\t\tvtxidx++\n\t\t\t\t\tfaceidx++\n\t\t\t\t}\n\t\t\t\tvtxidx++\n\t\t\t}\n\n\t\t\tthat.verticesNeedUpdate = true\n\t\t\tthat.normalsNeedUpdate = true\n\t\t\tthat.colorsNeedUpdate = true\n\n\t\t\tparent.dirty = false\n\t\t}\n\t}\n\n\tThreeProceduralGroundPlugin.prototype.GeometryGenerator.prototype = Object.create( THREE.Geometry.prototype )\n\tThreeProceduralGroundPlugin.prototype.GeometryGenerator.prototype.constructor = ThreeProceduralGroundPlugin.prototype.GeometryGenerator\n\n\t// -- geometry\n\n\tThreeProceduralGroundPlugin.prototype.generate_mesh = function() {\n\t\tif (!(this.noise && this.noise.rngSeed == this.rngSeed)) {\n\t\t\tthis.noise = new E2.Noise(2048, this.rngSeed)\n\t\t}\n\n\t\tvar needsReinitialising = !this.geometry || this.geometry.needsReinitialising(this.xSize, this.ySize, this.zSize)\n\n\t\tif (needsReinitialising) {\n\t\t\t// only generate arrays if need to\n\t\t\tthis.geometry = new this.GeometryGenerator(this)\n\t\t\tthis.geometry.initialise(this.xSize, this.ySize, this.zSize)\n\t\t\tthis.material = new THREE.MeshFaceMaterial([new THREE.MeshLambertMaterial({ color: 0xB29E8C }), new THREE.MeshLambertMaterial({ color: 0xCC6D14 }), new THREE.MeshLambertMaterial({ color: 0x6DB273 })])\n\t\t\t//this.material.wireframe = true\n\t\t\tthis.setObject3D(new THREE.Mesh(this.geometry, this.material))\n\t\t}\n\n\t\t// update the actual vertex data\n\t\tthis.geometry.update()\n\n\t\t// back reference for object picking\n\t\tthis.object3d.backReference = this\n\t}\n\n\tThreeProceduralGroundPlugin.prototype.update_input = function(slot, data) {\n\t\tswitch(slot.index) {\n\t\tcase 0: // x size\n\t\t\tthis.xSize = Math.floor(data)\n\t\t\tthis.dirty = true\n\t\t\tbreak;\n\t\tcase 1: // y size\n\t\t\tthis.ySize = Math.floor(data)\n\t\t\tthis.dirty = true\n\t\t\tbreak;\n\t\tcase 2: // z size\n\t\t\tthis.zSize = Math.floor(data)\n\t\t\tthis.dirty = true\n\t\t\tbreak;\n\t\tcase 3: // rng seed\n\t\t\tthis.rngSeed = data\n\t\t\tthis.dirty = true\n\t\t\tbreak;\n\t\tcase 4: // noise factor\n\t\t\tthis.noiseFactor = data\n\t\t\tthis.dirty = true\n\t\t\tbreak;\n\t\tcase 5: // noise octaves\n\t\t\tthis.noiseOctaves = data\n\t\t\tthis.dirty = true\n\t\t\tbreak;\n\t\tcase 6: // noise scale\n\t\t\tthis.noiseScale = data\n\t\t\tthis.dirty = true\n\t\t\tbreak;\n\t\tcase 7: // ground height\n\t\t\tthis.groundHeight = data\n\t\t\tthis.dirty = true\n\t\t\tbreak;\n\t\tcase 8: // rock height\n\t\t\tthis.rockHeight = data\n\t\t\tthis.dirty = true\n\t\t\tbreak;\n\t\tdefault:\n\t\t\treturn ThreeObject3DPlugin.prototype.update_input\n\t\t\t.apply(this, arguments)\n\t\t}\n\t}\n\n\tThreeProceduralGroundPlugin.prototype.state_changed = function(ui)\n\t{\n\t\tif(!ui)\n\t\t\tthis.generate_mesh()\n\t}\n\n\tThreeProceduralGroundPlugin.prototype.update_state = function()\n\t{\n\t\tif (this.dirty)\n\t\t\tthis.generate_mesh()\n\t};\n\n\n})()\n"
  },
  {
    "path": "browser/plugins/three_scene.plugin.js",
    "content": "(function() {\n\tvar ThreeScenePlugin = E2.plugins.three_scene = function (core, node) {\n\t\tthis.desc = 'THREE.js Scene'\n\n\t\tthis.input_slots = [{\n\t\t\tname: 'environment',\n\t\t\tdt: core.datatypes.ENVIRONMENTSETTINGS,\n\t\t\tdef: new E2.EnvironmentSettings()\n\t\t}]\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'scene',\n\t\t\tdt: core.datatypes.SCENE\n\t\t}]\n\n\t\tthis.node = node\n\n\t\tthis.lsg = new AutoSlotGroup(core, node, [], [])\n\t\tthis.lsg.set_dt(core.datatypes.OBJECT3D)\n\n\t\tvar that = this\n\n\t\tthis.node.on('slotAdded', function () {\n\t\t\tthat.dynInputs = node.getDynamicInputSlots()\n\t\t\tthat.updated = true\n\t\t})\n\n\t\tthis.node.on('slotRemoved', function () {\n\t\t\tthat.dynInputs = node.getDynamicInputSlots()\n\t\t\tthat.updated = true\n\t\t})\n\n\t\tthis.clickableObjectsInSlot = []\n\n\t\tthis.createScene()\n\t}\n\n\tThreeScenePlugin.prototype.createScene = function() {\n\t\tthis.scene = new THREE.Scene()\n\t\tthis.scene.backReference = this\n\n\t\tE2.app.player.scene = this.scene\n\n\t\t// add two children:\n\t\t// [0] is the main scene\n\t\tthis.sceneRoot = new THREE.Group()\n\t\tthis.scene.add(this.sceneRoot)\n\n\t\t// [1] is the overlay scene\n\t\tthis.overlayRoot = new THREE.Group()\n\t\tthis.scene.add(this.overlayRoot)\n\t}\n\n\tThreeScenePlugin.prototype.update_meshes = function () {\n\t\tif (this.envSettings) {\n\t\t\tthis.scene.fog = this.envSettings.fog\n\t\t}\n\t\telse {\n\t\t\tthis.scene.fog = null\n\t\t}\n\n\t\t// If lights have changed, we have to set affected materials as needing\n\t\t// to be updated. This would be better done in an analytical manner\n\t\t// and only update the ones that actually need updating; however we'll\n\t\t// just force update everything\n\n\t\tif (this.scene) {\n\t\t\tthis.scene.traverse(function(node) {\n\t\t\t\tif (node.material !== undefined) {\n\t\t\t\t\tnode.material.needsUpdate = true\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\t}\n\n\tThreeScenePlugin.prototype.reset = function () {\n\t}\n\n\tThreeScenePlugin.prototype.update_input = function (slot, data) {\n\t\tvar that = this\n\t\tvar i\n\n\t\tif (slot.dynamic) {\n\t\t\tvar parent = this.scene.children[0].children[slot.index]\n\t\n\t\t\tif (data && (!slot.array || (data.length > 0 && data[0]))) {\n\t\t\t\tif (slot.array) {\n\t\t\t\t\tif (parent.children.length === data.length) {\n\t\t\t\t\t\tvar allUidsMatch = true\n\t\t\t\t\t\tfor (i = 0; i < data.length; ++i) {\n\t\t\t\t\t\t\tif (data[i].uuid !== parent.children[i].uuid) {\n\t\t\t\t\t\t\t\tallUidsMatch = false\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (allUidsMatch) {\n\t\t\t\t\t\t\t// nothing to do\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tparent.children = data\n\n\t\t\t\t\tthis.clickableObjectsInSlot[slot.index] = 0\n\n\t\t\t\t\tfor (i = 0; i < data.length; ++i) {\n\t\t\t\t\t\tif (data[i].parent && data[i].parent !== parent) {\n\t\t\t\t\t\t\t// the object is in another scene, remove from there\n\t\t\t\t\t\t\tdata[i].parent.remove(data[i])\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata[i].parent = parent\n\t\t\t\t\t\tdata[i].dispatchEvent({ type: 'added' })\n\n\t\t\t\t\t\tif (data[i].gazeClickerCount)\n\t\t\t\t\t\t\tthat.clickableObjectsInSlot[slot.index] += data[i].gazeClickerCount\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (parent.children.length === 1 && parent.children[0].uuid === data.uuid) {\n\t\t\t\t\t\t// nothing to do\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tif (data.parent && data.parent !== this) {\n\t\t\t\t\t\t// the objects is in another scene, remove from there\n\t\t\t\t\t\tdata.parent.remove(data)\n\t\t\t\t\t}\n\n\t\t\t\t\tparent.children = [data]\n\n\t\t\t\t\tdata.parent = parent\n\t\t\t\t\tdata.dispatchEvent({ type: 'added' })\n\n\t\t\t\t\tthis.clickableObjectsInSlot[slot.index] = 0\n\n\t\t\t\t\tif (data.gazeClickerCount)\n\t\t\t\t\t\tthat.clickableObjectsInSlot[slot.index] += data.gazeClickerCount\n\t\t\t\t}\n\t\t\t}\n\t\t\telse {\n\t\t\t\twhile (parent.children.length > 0) {\n\t\t\t\t\tparent.remove(parent.children[0])\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.update_meshes()\n\t\n\t\t\tvar totalClickables = 0\n\t\t\tfor (i=0; i < this.clickableObjectsInSlot.length; i++)\n\t\t\t\ttotalClickables += this.clickableObjectsInSlot[i] || 0\n\n\t\t\tthis.scene.hasClickableObjects = totalClickables > 0\n\t\t}\n\t\telse {\n\t\t\t// the only static input slot is environment settings\n\t\t\tthis.envSettings = data\n\t\t}\n\t}\n\n\tThreeScenePlugin.prototype.connection_changed = function(on, conn, slot) {\n\t\tif (on && slot.dynamic) {\n\t\t\t// ensure there is a sufficient amount of slots\n\t\t\tvar mainSceneRoot = this.scene.children[0]\n\t\t\twhile (mainSceneRoot.children.length < this.dynInputs.length) {\n\t\t\t\tmainSceneRoot.add(new THREE.Group())\n\t\t\t}\n\t\t}\n\n\t\t// disconnect\n\t\tif (!on && slot.type === E2.slot_type.input && slot.dynamic) {\n\t\t\tvar parent = this.scene.children[0].children[slot.index]\n\n\t\t\twhile (parent.children.length > 0) {\n\t\t\t\tparent.remove(parent.children[0])\n\t\t\t}\n\t\t}\n\n\t\t// connect\n\t\telse if (on && slot.type === E2.slot_type.input && slot.dynamic) {\n\t\t\tthis.scene.children[0].children[slot.index].children = []\n\t\t}\n\n\t\tthis.update_meshes()\n\t}\n\n\tThreeScenePlugin.prototype.update_output = function () {\n\t\treturn this.scene\n\t}\n\n\tThreeScenePlugin.prototype.state_changed = function (ui) {\n\t\tif (ui)\n\t\t\treturn;\n\n\t\tthis.dynInputs = this.node.getDynamicInputSlots()\n\n\t\tif (!this.dynInputs.length) {\n\t\t\tthis.node.add_slot(E2.slot_type.input, {\n\t\t\t\tname: '0',\n\t\t\t\tdt: E2.dt.OBJECT3D,\n\t\t\t\tarray: false\n\t\t\t})\n\n\t\t\tthis.dynInputs = this.node.getDynamicInputSlots()\n\t\t}\n\n\t\tfor (var i = 0, len = this.dynInputs.length; i < len; i++) {\n\t\t\tthis.lsg.add_dyn_slot(this.dynInputs[i])\n\t\t\tthis.scene.children[0].add(new THREE.Group())\n\t\t}\n\t}\n\n\tThreeScenePlugin.prototype.update_state = function () {\n\t}\n\n})()\n"
  },
  {
    "path": "browser/plugins/three_screen_space_transform_extractor.plugin.js",
    "content": "(function() {\n\tvar ThreeScreenSpaceTransformExtractorPlugin = E2.plugins.three_screen_space_transform_extractor = function(core, node) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'Extract transformation from a vr camera for orienting objects to screen space'\n\n\t\tthis.input_slots = [{\n\t\t\tname: 'camera',\n\t\t\tdt: core.datatypes.CAMERA\n\t\t}]\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'position',\n\t\t\tdt: core.datatypes.VECTOR\n\t\t}, {\n\t\t\tname: 'rotation',\n\t\t\tdt: core.datatypes.VECTOR\n\t\t}, {\n\t\t\tname: 'scale',\n\t\t\tdt: core.datatypes.VECTOR\n\t\t}]\n\t}\n\n\tThreeScreenSpaceTransformExtractorPlugin.prototype = Object.create(Plugin.prototype)\n\n\tThreeScreenSpaceTransformExtractorPlugin.prototype.reset = function() {\n\t\tthis.position = new THREE.Vector3(0, 0, 0)\n\t\tthis.rotation = new THREE.Vector3(1, 1, 1)\n\t\tthis.scale = new THREE.Vector3(1, 1, 1)\n\t}\n\n\tThreeScreenSpaceTransformExtractorPlugin.prototype.update_input = function(slot, data) {\n\t\tif (slot.index === 0) {\n\t\t\tthis.position = data.position.clone()\n\n\t\t\tdata.updateMatrixWorld()\n\t\t\tvar e = data.matrixWorld.elements;\n\n\t\t\tvar fov = (data.fov || 45) / 180 * 3.1415926\n\t\t\tvar s = 1.0 / Math.tan(fov)\n\n\t\t\tthis.position.x -= e[8] * s\n\t\t\tthis.position.y -= e[9] * s\n\t\t\tthis.position.z -= e[10] * s\n\n\t\t\tthis.rotation = data.rotation\n\t\t\tthis.scale = data.scale\n\t\t}\n\t}\n\n\tThreeScreenSpaceTransformExtractorPlugin.prototype.state_changed = function(ui) {\n\t\tif (ui) {\n\t\t\treturn\n\t\t}\n\t}\n\n\tThreeScreenSpaceTransformExtractorPlugin.prototype.update_state = function() {\n\n\t}\n\n\tThreeScreenSpaceTransformExtractorPlugin.prototype.update_output = function(slot) {\n\t\tif (slot.index === 0) {\n\t\t\treturn this.position\n\t\t}\n\t\telse if(slot.index === 1) {\n\t\t\treturn this.rotation\n\t\t}\n\t\telse if(slot.index === 2) {\n\t\t\treturn this.scale\n\t\t}\n\t}\n\n\n})()"
  },
  {
    "path": "browser/plugins/three_spot_light.plugin.js",
    "content": "(function() {\n\tvar ThreeSpotLightPlugin = E2.plugins.three_spot_light = function(core) {\n\t\tThreeObject3DPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'THREE.js Spot Light'\n\n\t\tthis.params = {\n\t\t\tcolor: new THREE.Color(0xffffff),\n\t\t\tintensity: 1.0,\n\t\t\tdistance: 0,\n\t\t\tangle: Math.PI / 3,\n\t\t\texponent: 10,\n\t\t\tdecay: 1\n\t\t}\n\n\t\tthis.input_slots = [\n\t\t\t{ name: 'intensity', dt: core.datatypes.FLOAT, def: this.params.intensity },\n\t\t\t{ name: 'color', dt: core.datatypes.COLOR, def: this.params.color },\n\t\t\t{ name: 'distance', dt: core.datatypes.FLOAT, def: this.params.distance },\n\t\t\t{ name: 'angle', dt: core.datatypes.FLOAT, def: this.params.angle },\n\t\t\t{ name: 'exponent', dt: core.datatypes.FLOAT, def: this.params.exponent },\n\t\t\t{ name: 'decay', dt: core.datatypes.FLOAT, def: this.params.decay }\n\t\t].concat(this.input_slots)\n\t}\n\n\tThreeSpotLightPlugin.prototype = Object.create(ThreeObject3DPlugin.prototype)\n\n\tThreeSpotLightPlugin.prototype.reset = function() {\n\t\tThreeObject3DPlugin.prototype.reset.apply(this)\n\n\t\tthis.setObject3D(new THREE.SpotLight( 0xFFFFFF ))\n\n\t\t// back reference for object picking\n\t\tthis.object3d.backReference = this\n\t}\n\n\t// disable scaling, it doesn't make sense for lights\n\tThreeSpotLightPlugin.prototype.canEditScale = function() {\n\t\treturn false\n\t}\n})()\n"
  },
  {
    "path": "browser/plugins/three_text_geometry.plugin.js",
    "content": "(function() {\n\tvar ThreeTextGeometry = E2.plugins.three_text_geometry = function (core) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.input_slots = [{\n\t\t\tname: 'text',\n\t\t\tdt: E2.dt.TEXT,\n\t\t\tdef: 'hello world'\n\t\t}, {\n\t\t\tname: 'size',\n\t\t\tdt: E2.dt.FLOAT,\n\t\t\tdef: 1\n\t\t}, {\n\t\t\tname: 'segments',\n\t\t\tdt: E2.dt.FLOAT,\n\t\t\tdef: 4/*,\n\t\t\tvalidate: function(v) {return Math.floor(Math.min(Math.max(1, v), 10))}*/\n\t\t}, {\n\t\t\tname: 'line spacing',\n\t\t\tdt: E2.dt.FLOAT,\n\t\t\tdef: 1\n\t\t}, {\n\t\t\tname: 'max line length',\n\t\t\tdt: E2.dt.FLOAT,\n\t\t\tdef: 80\n\t\t}]\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'geometry', dt: core.datatypes.GEOMETRY\n\t\t}]\n\n\t\tthis.fontSelector = new FontSelector()\n\n\t\tthis.state = {\n\t\t\tfontId: this.fontSelector.getByIndex(0).id\n\t\t}\n\n\t\tthis.desc = 'Generate text'\n\t}\n\n\tThreeTextGeometry.prototype = Object.create(Plugin.prototype)\n\tThreeTextGeometry.prototype.constructor = Plugin.prototype\n\n\tThreeTextGeometry.prototype.create_ui = function() {\n\t\tvar $ui = make('div')\n\n\t\tvar that = this\n\n\t\tthis.fontSelector.createUi($ui, function(newFont, newSelection) {\n\t\t\tthat.undoableSetState('fontId', newSelection, that.state.fontId)\n\t\t\tthat.font = newFont\n\t\t})\n\n\t\treturn $ui\n\t}\n\n\tThreeTextGeometry.prototype.reset = function() {\n\t\tthis.geometry = new THREE.Geometry()\n\t\tthis.dirty = true\n\t}\n\n\tThreeTextGeometry.prototype.update_input = function(slot, data) {\n\t\tthis.dirty = true\n\t}\n\n\tThreeTextGeometry.prototype.update_output = function() {\n\t\treturn this.geometry\n\t}\n\n\tThreeTextGeometry.prototype.reconstructGeometry = function() {\n\t\tvar parameters = {\n\t\t\tcurveSegments: this.inputValues.segments,\n\t\t\tsize: this.inputValues.size,\n\t\t}\n\n\t\tvar lines = this.inputValues.text.split('\\n')\n\n\t\tvar shapes = []\n\n\t\tvar lineHeight = this.inputValues['line spacing'] * this.inputValues.size\n\n\t\tthis.geometry = undefined\n\n\t\tvar maxLength = this.inputValues['max line length']\n\n\t\tfor (var i = 0; i < lines.length; ++i) {\n\t\t\tif (lines[i].length > maxLength) {\n\t\t\t\tvar line = lines[i]\n\n\t\t\t\tvar splitAt = line.lastIndexOf(' ', maxLength)\n\n\t\t\t\tif (splitAt === -1) {\n\t\t\t\t\t// try to find after the break point\n\t\t\t\t\tsplitAt = line.indexOf(' ', maxLength)\n\t\t\t\t}\n\n\t\t\t\tif (splitAt > 0) {\n\t\t\t\t\tlines[i] = line.substring(0, splitAt)\n\n\t\t\t\t\tlines.splice(i + 1, 0, line.substring(splitAt + 1))\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar lineShapes = this.font.font.generateShapes(lines[i], parameters.size, parameters.curveSegments)\n\n\t\t\tif (this.geometry) {\n\t\t\t\tvar mtx = new THREE.Matrix4().makeTranslation(0, lineHeight, 0)\n\t\t\t\tthis.geometry.applyMatrix(mtx)\n\n\t\t\t\tthis.geometry.addShapeList( lineShapes );\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.geometry = new THREE.ShapeGeometry(lineShapes)\n\t\t\t}\n\t\t}\n\n\t\tthis.geometry.computeFaceNormals()\n\n\t\tthis.dirty = false\n\n\t\tthis.updated = true\n\t}\n\n\tThreeTextGeometry.prototype.update_state = function() {\n\t\tif (!this.font || !this.font.font || (this.state.fontId !== this.font.font.id)) {\n\t\t\tif (this.loadPromise) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.font = this.fontSelector.getById(this.state.fontId)\n\n\t\t\tif (!this.font.font) {\n\t\t\t\tvar that = this\n\n\t\t\t\tvar dfd = when.defer()\n\n\t\t\t\tvar doLoad = function() {\n\t\t\t\t\tthat.fontSelector.fontLoader.load(that.font.url, function(font) {\n\t\t\t\t\t\tthat.font.font = font\n\t\t\t\t\t\tthat.reconstructGeometry()\n\n\t\t\t\t\t\tdfd.resolve()\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tif (this.loadPromise) {\n\t\t\t\t\tthis.loadPromise.then(doLoad)\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.loadPromise = dfd.promise\n\n\t\t\t\t\tdoLoad()\n\t\t\t\t}\n\n\t\t\t\tthis.loadPromise.then(function() {\n\t\t\t\t\tthat.loadPromise = undefined\n\t\t\t\t})\n\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\telse if (!this.dirty) {\n\t\t\treturn\n\t\t}\n\n\t\tthis.reconstructGeometry()\n\t}\n\n\tThreeTextGeometry.prototype.state_changed = function(ui) {\n\t\tif (ui) {\n\t\t\tthis.fontSelector.initialise(ui, this.state.fontId)\n\t\t\treturn\n\t\t}\n\t}\n})()\n"
  },
  {
    "path": "browser/plugins/three_uv_modifier.plugin.js",
    "content": "(function() {\n\tvar ThreeUVModifierPlugin = E2.plugins.three_uv_modifier = function(core, node) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'Adjust a texture\\'s UV coordinates'\n\n\t\tthis.input_slots = [{\n\t\t\tname: 'texture',\n\t\t\tdt: core.datatypes.TEXTURE,\n\t\t\tdef: new THREE.Texture()\n\t\t}, {\n\t\t\tname: 'u offset',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 0.0\n\t\t},  {\n\t\t\tname: 'v offset',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 0.0\n\t\t}, {\n\t\t\tname: 'u repeat',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 1.0\n\t\t},  {\n\t\t\tname: 'v repeat',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 1.0\n\t\t},  {\n\t\t\tname: 'filter',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 1.0,\n\t\t\tdesc: 'Texture Filter - (0: nearest, 1: linear)'\n\t\t}]\n\n\t\tthis.output_slots = [{\n\t\t\tname: 'texture',\n\t\t\tdt: core.datatypes.TEXTURE\n\t\t}]\n\t}\n\n\tThreeUVModifierPlugin.prototype = Object.create(Plugin.prototype)\n\n\tThreeUVModifierPlugin.prototype.reset = function() {\n\t\tthis.texture = undefined\n\t\tthis.uOffset = 0\n\t\tthis.vOffset = 0\n\t\tthis.uRepeat = 1\n\t\tthis.vRepeat = 1\n\n\t\tthis.dirty = false\n\t}\n\n\tThreeUVModifierPlugin.prototype.update_input = function(slot, data) {\n\t\tif (slot.name === 'texture') { // texture\n\t\t\tif (data) {\n\t\t\t\tthis.texture = data.clone()\n\t\t\t\tthis.dirty = true\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.texture = undefined\n\t\t\t}\n\t\t}\n\t\telse if (slot.name === 'u offset') { // u offset\n\t\t\tthis.uOffset = data\n\t\t\tthis.dirty = true\n\t\t}\n\t\telse if (slot.name === 'v offset') { // v offset\n\t\t\tthis.vOffset = data\n\t\t\tthis.dirty = true\n\t\t}\n\t\telse if (slot.name === 'u repeat') { // u repeat\n\t\t\tthis.uRepeat = data\n\t\t\tthis.dirty = true\n\t\t}\n\t\telse if (slot.name === 'v repeat') { // v repeat\n\t\t\tthis.vRepeat = data\n\t\t\tthis.dirty = true\n\t\t}\n\t\telse if (slot.name === 'filter') { // filter\n\t\t\tthis.filter = data\n\t\t\tthis.dirty = true\n\t\t}\n\t}\n\n\tThreeUVModifierPlugin.prototype.state_changed = function(ui) {\n\t\tif (ui) {\n\t\t\treturn\n\t\t}\n\t}\n\n\tThreeUVModifierPlugin.prototype.update_state = function() {\n\n\t\tif (this.dirty && this.texture) {\n\t\t\tthis.texture.offset.set(this.uOffset, this.vOffset)\n\t\t\tthis.texture.repeat.set(this.uRepeat, this.vRepeat)\n\t\t\tthis.texture.magFilter = this.filter === 0 ? THREE.NearestFilter : THREE.LinearFilter\n\t\t\tthis.texture.needsUpdate = true\n\n\t\t\tthis.dirty = false\n\t\t}\n\t}\n\n\tThreeUVModifierPlugin.prototype.update_output = function() {\n\t\treturn this.texture\n\t}\n\n\n})()"
  },
  {
    "path": "browser/plugins/three_vr_camera.plugin.js",
    "content": "(function() {\n\tvar ThreeVRCameraPlugin = E2.plugins.three_vr_camera = function(core) {\n\t\tvar that = this\n\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'THREE.js VR Camera'\n\t\t\n\t\tthis.findDefaultFov()\n\n\t\tthis.input_slots = [\n\t\t\t{ name: 'position', dt: core.datatypes.VECTOR },\n\t\t\t{ name: 'rotation', dt: core.datatypes.VECTOR },\n\t\t\t{ name: 'fov', dt: core.datatypes.FLOAT, def: this.defaultFOV },\n\t\t\t{ name: 'aspectRatio', dt: core.datatypes.FLOAT, def: 1.0},\n\t\t\t{ name: 'near', dt: core.datatypes.FLOAT, def: 0.01 },\n\t\t\t{ name: 'far', dt: core.datatypes.FLOAT, def: 10000.0 },\n\t\t\t{\n\t\t\t\tname:   'lock transform',\n\t\t\t\tdt:     core.datatypes.BOOL,\n\t\t\t\tdef:    false,\n\t\t\t\tlabel:  'Lock transform',\n\t\t\t\tdesc:   'If enabled, the transform coming from the HMD is ignored'\n\t\t\t}\n\t\t]\n\n\t\tthis.output_slots = [\n\t\t\t{ name: 'camera',\tdt: core.datatypes.CAMERA },\n\t\t\t{ name: 'offset',\tdt: core.datatypes.VECTOR,\n\t\t\t  desc: 'The position offset of the camera.' },\n\t\t\t{ name: 'position',\tdt: core.datatypes.VECTOR,\n\t\t\t  desc: 'The current position of the headset.' },\n\t\t\t{ name: 'rotation',\tdt: core.datatypes.VECTOR }\n\t\t]\n\n\t\tthis.always_update = true\n\t\tthis.dirty = false\n\t\tthis.locked = false\n\n\t\tthis.state = {\n\t\t\tposition: {x: 0, y: 0, z:0},\n\n\t\t\t// names with underscores have to match with THREE.Quaternion\n\t\t\t// member variable names because of to/from json serialisation\n\t\t\tquaternion: {_x: 0, _y: 0, _z:0, _w:1}\n\t\t}\n\n\t\tthis.rotationFromGraph = new THREE.Euler()\n\t\tthis.positionFromGraph = new THREE.Vector3()\n\n\t\tthis.outputRotationEuler = new THREE.Euler()\n\t\tthis.outputPosition = new THREE.Vector3()\n\n\t\tthis.node.on('pluginStateChanged', function() {\n\t\t\tthat.offset.set(that.state.position.x, that.state.position.y, that.state.position.z)\n\t\t})\n\n\t\tE2.app.player.cameraPlugin = this\n\t}\n\n\tThreeVRCameraPlugin.prototype = Object.create(Plugin.prototype)\n\n\tThreeVRCameraPlugin.prototype.findDefaultFov = function() {\n\t\tvar that = this\n\n\t\tthis.defaultFOV = 90\n\n\t\tif (!navigator.getVRDisplays)\n\t\t\treturn;\n\n\t\tnavigator.getVRDisplays()\n\t\t.then(function(vrDisplays) {\n\t\t\tvar displays = vrDisplays.filter(function(display) {\n\t\t\t\treturn display instanceof VRDisplay &&\n\t\t\t\t\tdisplay.capabilities.canPresent\n\t\t\t})\n\n\t\t\tif (displays.length) {\n\t\t\t\tvar eyeParams = displays[0].getEyeParameters('left')\n\t\t\t\tif (eyeParams)\n\t\t\t\t\tthat.defaultFOV = eyeParams.fieldOfView.leftDegrees + eyeParams.fieldOfView.rightDegrees;\n\t\t\t}\n\t\t})\n\n\t}\n\n\tThreeVRCameraPlugin.prototype.reset = function() {\n\t\tPlugin.prototype.reset.apply(this, arguments)\n\n\t\tthis.domElement = E2.dom.webgl_canvas[0]\n\n\t\tif (!this.dolly)\n\t\t\tthis.dolly = new THREE.PerspectiveCamera()\n\n\t\tif (!this.vrControlCamera) {\n\t\t\tthis.vrControlCamera = E2.app.player.vrControlCamera\n\n\t\t\t// layer is for mono camera only\n\t\t\tthis.vrControlCamera.layers.enable(3)\n\n\t\t\tthis.dolly.add(this.vrControlCamera)\n\t\t}\n\n\t\t// create an object3d reference so that the world editor sees the camera\n\t\t// as an object3d\n\t\tthis.object3d = this.dolly\n\t\tthis.object3d.backReference = this\n\n\t\tif (!this.controls) {\n\t\t\tthis.controls = new THREE.VRControls(this.vrControlCamera)\n\t\t}\n\n\t\tthis.object3d.position.set(this.state.position.x, this.state.position.y, this.state.position.z)\n\t\tthis.object3d.quaternion.set(this.state.quaternion._x, this.state.quaternion._y, this.state.quaternion._z, this.state.quaternion._w)\n\n\t\tthis.offset = new THREE.Vector3(this.state.position.x, this.state.position.y, this.state.position.z)\n\t}\n\n\tThreeVRCameraPlugin.prototype.play = function() {\n\t\tthis.resize()\n\t}\n\n\tThreeVRCameraPlugin.prototype.resize = function() {\n\t\tvar isFullscreen = !!(document.mozFullScreenElement || document.webkitFullscreenElement);\n\t\tvar wh = { width: window.innerWidth, height: window.innerHeight }\n\n\t\tif (!isFullscreen) {\n\t\t\twh.width = this.domElement.clientWidth\n\t\t\twh.height = this.domElement.clientHeight\n\n\t\t\tif (typeof(E2.app.calculateCanvasArea) !== 'undefined')\n\t\t\t\twh = E2.app.calculateCanvasArea()\n\t\t}\n\n\t\tthis.vrControlCamera.aspect = wh.width / wh.height\n\t\tthis.vrControlCamera.updateProjectionMatrix()\n\n\t\tvar concatenatedCamera = E2.app.player.concatenatedCamera\n\t\tconcatenatedCamera.aspect = this.vrControlCamera.aspect\n\t\tconcatenatedCamera.projectionMatrix = this.vrControlCamera.projectionMatrix.clone()\n\t}\n\n\tThreeVRCameraPlugin.prototype.update_state = function() {\n\t\tvar concatenatedCamera = E2.app.player.concatenatedCamera\n\t\tvar hmd = E2.core.webVRAdapter.hmd\n\n\t\tthis.object3d.position.set(\n\t\t\tthis.positionFromGraph.x + this.state.position.x,\n\t\t\tthis.positionFromGraph.y + this.state.position.y,\n\t\t\tthis.positionFromGraph.z + this.state.position.z)\n\n\t\tthis.object3d.quaternion.setFromEuler(this.rotationFromGraph)\n\t\tthis.object3d.quaternion.multiply(this.state.quaternion)\n\n\t\tif (this.dirty)\n\t\t\tthis.vrControlCamera.updateProjectionMatrix()\n\n\t\tif (!this.locked)\n\t\t\tthis.controls.update(new THREE.Vector3(), new THREE.Quaternion())\n\n\t\tthis.object3d.updateMatrixWorld()\n\n\t\tconcatenatedCamera.position.copy(this.object3d.position)\n\n\t\tif (hmd && hmd.capabilities.hasPosition) {\n\t\t\tconcatenatedCamera.quaternion.copy(this.object3d.quaternion)\n\t\t} else {\n\t\t\tconcatenatedCamera.quaternion.multiplyQuaternions(\n\t\t\t\tthis.object3d.quaternion,\n\t\t\t\tthis.vrControlCamera.quaternion)\n\t\t}\n\n\t\tconcatenatedCamera.updateMatrixWorld()\n\n\t\tthis.updated = true\n\t}\n\n\tThreeVRCameraPlugin.prototype.update_input = function(slot, data) {\n\t\tif (!this.object3d) {\n\t\t\treturn\n\t\t}\n\n\t\tswitch(slot.index) {\n\t\tcase 0: // position\n\t\t\tthis.positionFromGraph.copy(data)\n\t\t\tthis.dirty = true\n\t\t\tbreak\n\t\tcase 1: // rotation\n\t\t\tthis.rotationFromGraph.set(data.x, data.y, data.z)\n\t\t\tthis.dirty = true\n\t\t\tbreak\n\t\tcase 2: // fov\n\t\t\tthis.vrControlCamera.fov = data\n\t\t\tthis.dirty = true\n\t\t\tbreak\n\t\tcase 3: // aspect ratio\n\t\t\tthis.vrControlCamera.aspect = data\n\t\t\tthis.dirty = true\n\t\t\tbreak\n\t\tcase 4: // near\n\t\t\tthis.vrControlCamera.near = data\n\t\t\tthis.dirty = true\n\t\t\tbreak\n\t\tcase 5: // far\n\t\t\tthis.vrControlCamera.far = data\n\t\t\tthis.dirty = true\n\t\t\tbreak\n\t\tcase 6: // locked transforms\n\t\t\tthis.locked = data\n\t\t\tbreak\n\t\tdefault:\n\t\t\tbreak\n\t\t}\n\t}\n\n\tThreeVRCameraPlugin.prototype.update_output = function(slot) {\n\t\tif (slot.index === 0) { // camera\n\t\t\treturn this.vrControlCamera\n\t\t} else if (slot.index === 1) { // offset\n\t\t\treturn this.offset\n\t\t} else if (slot.index === 2) { // position\n\t\t\treturn E2.app.player.concatenatedCamera.position.clone()\n\t\t}\n\t\telse if (slot.index === 3) { // rotation\n\t\t\tvar tempQuaternion = this.vrControlCamera.quaternion.clone()\n\t\t\ttempQuaternion.multiply(this.object3d.quaternion)\n\t\t\tthis.outputRotationEuler.setFromQuaternion(tempQuaternion, \"YZX\")\n\t\t\treturn this.outputRotationEuler\n\t\t}\n\t}\n\n\tThreeVRCameraPlugin.prototype.state_changed = function(ui) {\n\t\tif (!ui) {\n\t\t\tE2.core.on('resize', this.resize.bind(this))\n\t\t}\n\t}\n\n\tThreeVRCameraPlugin.prototype.canEditPosition = function() {\n\t\treturn true\n\t}\n\n\tThreeVRCameraPlugin.prototype.canEditQuaternion = function() {\n\t\treturn true\n\t}\n\n\tThreeVRCameraPlugin.prototype.canEditScale = function() {\n\t\treturn false\n\t}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/three_webgl_renderer.plugin.js",
    "content": "(function() {\n\tvar ThreeWebGLRendererPlugin = E2.plugins.three_webgl_renderer = function(core) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'THREE.js WebGL renderer'\n\n\t\tthis.input_slots = [\n\t\t\t{\n\t\t\t\tname: 'camera',\n\t\t\t\tdt: core.datatypes.CAMERA,\n\t\t\t\tdesc: 'Camera to use for rendering.'\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'scene',\n\t\t\t\tdt: core.datatypes.SCENE,\n\t\t\t\tdesc: 'Scene to render'\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'bgcolor',\n\t\t\t\tdt: core.datatypes.COLOR,\n\t\t\t\tdesc: 'Background color'\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'shadowsEnabled',\n\t\t\t\tdt: core.datatypes.BOOL,\n\t\t\t\tdesc: 'Master control for whether shadows are rendered',\n\t\t\t\tdef: false\n\t\t\t}\n\t\t]\n\n\t\tthis.output_slots = []\n\n\t\tthis.always_update = true\n\t\tthis.state = { always_update: true }\n\n\t\tthis.clearColor = new THREE.Color(0,0,0)\n\t}\n\n\tThreeWebGLRendererPlugin.prototype = Object.create(Plugin.prototype)\n\n\tThreeWebGLRendererPlugin.prototype.stop = function() {\n\t\tif (this.renderer) {\n\t\t\tthis.renderer.clear()\n\t\t}\n\t}\n\n\tThreeWebGLRendererPlugin.prototype.reset = function() {\n\t\tthis.domElement = E2.dom.webgl_canvas[0]\n\n\t\tconsole.log('reset',\n\t\t\tthis.domElement.clientWidth,\n\t\t\tthis.domElement.clientHeight,\n\t\t\tthis.domElement.clientWidth / this.domElement.clientHeight)\n\n\t\tthis.scene = new THREE.Scene()\n\n\t\tthis.perspectiveCamera = E2.app.player.vrControlCamera\n\t}\n\n\tThreeWebGLRendererPlugin.prototype.update_input = function(slot, data) {\n\t\tswitch(slot.index) {\n\t\t\tcase 0:\n\t\t\t\tthis.perspectiveCamera = data\n\t\t\t\treturn\n\t\t\tcase 1:\n\t\t\t\tthis.scene = data\n\t\t\t\tE2.app.player.scene = this.scene\n\t\t\t\tthis.patchSceneForWorldEditor(this.scene)\n\t\t\t\treturn\n\t\t\tcase 2:\n\t\t\t\tthis.clearColor = new THREE.Color(data.r, data.g, data.b)\n\t\t\t\treturn\n\t\t}\n\n\t\tPlugin.prototype.update_input.apply(this, arguments)\n\t}\n\n\tThreeWebGLRendererPlugin.prototype.update_state = function() {\n\t\t// workaround for having to share the renderer between render to texture & render to screen\n\t\t// tbd: remove once https://github.com/mrdoob/three.js/pull/6723 is merged into a three release\n\n\t\tthis.renderer.setClearColor(this.clearColor)\n\n\t\tif (!this.scene || !this.perspectiveCamera) {\n\t\t\tthis.renderer.clear()\n\t\t\treturn\n\t\t}\n\n\t\t// three.js needs a window.scene\n\t\twindow.scene = this.scene\n\n\t\tthis.renderer.shadowMap.enabled = this.inputValues.shadowsEnabled\n\n\t\tif (this.adapter.isVRMode()) {\n\t\t\t// vr mode doesn't necessarily update the world matrix\n\t\t\t// could be a bug in new version of three.js\n\t\t\tthis.perspectiveCamera.updateMatrixWorld()\n\t\t}\n\n\t\tif (E2.app.worldEditor.isActive())\n\t\t\tE2.app.worldEditor.preRenderUpdate()\n\n\t\tvar activeCamera = this.getActiveCamera()\n\n\t\tTHREE.glTFAnimator.update();\n\t\tTHREE.glTFShaders.update(this.scene, activeCamera);\n\n\t\tthis.adapter.render(this.scene, activeCamera)\n\n\t\tif (E2.app.debugFpsDisplayVisible) {\n\t\t\tthis.stats.begin()\n\n\t\t\tthis.stats.renderOrtho()\n\n\t\t\tthis.stats.end()\n\t\t}\n\n\t}\n\n\tThreeWebGLRendererPlugin.prototype.getActiveCamera = function() {\n\t\tif (E2.app.worldEditor.isActive()) {\n\t\t\t// Render the scene through the world editor camera\n\t\t\treturn E2.app.worldEditor.getCamera()\n\t\t} else {\n\t\t\t// Render the scene through the experience camera\n\t\t\treturn this.perspectiveCamera\n\t\t}\n\t}\n\n\tThreeWebGLRendererPlugin.prototype.play = function() {\n\t\t// one initial resize\n\t\tthis.adapter.resizeToTarget()\n\t}\n\n\tThreeWebGLRendererPlugin.prototype.patchSceneForWorldEditor = function() {\n\t\tif (E2.app.worldEditor.updateScene) {\n\t\t\t// tell the editor about changes in the scene\n\t\t\tE2.app.worldEditor.updateScene(this.scene, this.perspectiveCamera)\n\t\t}\n\t}\n\n\tThreeWebGLRendererPlugin.prototype.onTargetResized = function(s) {\n\t\tfunction updateCamera(camera, s) {\n\t\t\tcamera.aspect = s.width / s.height;\n\t\t\tcamera.updateProjectionMatrix();\n\t\t}\n\t\tif (this.perspectiveCamera)\n\t\t\tupdateCamera(this.perspectiveCamera, s)\n\n\t\tif (E2.app.worldEditor && E2.app.worldEditor.getCamera)\n\t\t\tupdateCamera(E2.app.worldEditor.getCamera(), s)\n\n\t\tthis.renderer.setPixelRatio(s.devicePixelRatio)\n\t\tthis.adapter.effect.setSize(s.width, s.height, false)\n\t}\n\n\tThreeWebGLRendererPlugin.prototype.state_changed = function(ui) {\n\t\tif (ui)\n\t\t\treturn;\n\n\t\tthis.domElement = E2.dom.webgl_canvas[0]\n\t\tthis.renderer = E2.core.renderer\n\n\t\tvar gl = this.domElement.getContext('webgl')\n\t\tvar events = E2.core.webVRAdapter.events\n\n\t\t// this.stats = new WGLUStats(gl)\n\n\t\tthis.adapter = E2.core.webVRAdapter\n\t\tthis.adapter.on(events.targetResized, this.onTargetResized.bind(this))\n\t\tthis.adapter.resizeToTarget()\n\t}\n\n})()\n"
  },
  {
    "path": "browser/plugins/three_webgl_texture_renderer.plugin.js",
    "content": "(function() {\n\tvar ThreeWebGLTextureRendererPlugin = E2.plugins.three_webgl_texture_renderer = function(core) {\n\t\tthis.desc = 'THREE.js WebGL Texture renderer'\n\n\t\tthis.input_slots = [\n\t\t\t{\n\t\t\t\tname: 'camera',\n\t\t\t\tdt: core.datatypes.CAMERA,\n\t\t\t\tdesc: 'Camera to use for rendering.'\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'scene',\n\t\t\t\tdt: core.datatypes.SCENE,\n\t\t\t\tdesc: 'Scene to render'\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'bgcolor',\n\t\t\t\tdt: core.datatypes.COLOR,\n\t\t\t\tdesc: 'Background color'\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'width',\n\t\t\t\tdt: core.datatypes.FLOAT,\n\t\t\t\tdesc: 'texture width',\n\t\t\t\tdef: 256\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'height',\n\t\t\t\tdt: core.datatypes.FLOAT,\n\t\t\t\tdesc: 'texture height',\n\t\t\t\tdef: 256\n\t\t\t}\n\t\t]\n\n\t\tthis.output_slots = [{name: 'texture', dt: core.datatypes.TEXTURE, desc: 'render target texture'}]\n\n\t\tthis.width = 256\n\t\tthis.height = 256\n\t\tthis.texture_dirty = true,\n\n\t\tthis.clearColor = new THREE.Color(0, 0, 0)\n\t}\n\n\tThreeWebGLTextureRendererPlugin.prototype.reset = function() {\n\t\tthis.scene = new THREE.Scene()\n\n\t\tthis.perspectiveCamera = new THREE.PerspectiveCamera(\n\t\t\t90,\n\t\t\t1,\n\t\t\t0.1,\n\t\t\t1000)\n\n\t\tthis.renderer = E2.core.renderer\n\t}\n\n\tThreeWebGLTextureRendererPlugin.prototype.update_input = function(slot, data) {\n\t\tswitch(slot.index) {\n\t\tcase 0: // camera\n\t\t\tthis.perspectiveCamera = data\n\t\t\tbreak\n\t\tcase 1: // scene\n\t\t\tthis.scene = data\n\t\t\tbreak\n\t\tcase 2: // clear color\n\t\t\tthis.clearColor = new THREE.Color(data.r, data.g, data.b)\n\t\t\tbreak\n\t\tcase 3: // width\n\t\t\tthis.width = data\n\t\t\tthis.texture_dirty = true\n\t\t\tbreak\n\t\tcase 4: // height\n\t\t\tthis.height = data\n\t\t\tthis.texture_dirty = true\n\t\t\tbreak\n\t\t}\n\t}\n\n\tThreeWebGLTextureRendererPlugin.prototype.create_texture = function() {\n\t\tthis.texture = new THREE.WebGLRenderTarget(\n\t\t\tthis.width,\n\t\t\tthis.height,\n\t\t\t{ minFilter: THREE.LinearFilter, magFilter: THREE.NearestFilter, format: THREE.RGBFormat } );\n\n\t\tthis.texture_dirty = false\n\t}\n\n\tThreeWebGLTextureRendererPlugin.prototype.update_state = function() {\n\t\tvar renderBufferSize = this.renderer.getSize()\n\n\t\tif (this.texture_dirty) {\n\t\t\tthis.create_texture()\n\t\t}\n\n\t\tthis.renderer.setClearColor(this.clearColor)\n\n\t\tthis.renderer.setRenderTarget(this.texture)\n\n\t\t// We have to reset pixel ratio and viewport size \n\t\t// as the main renderer will override these\n\t\t// We can leave viewport size as the full canvas size \n\t\t// as the main renderer will set this again\n\t\tvar oldPixelRatio = this.renderer.getPixelRatio()\n\t\tthis.renderer.setPixelRatio(1)\n\n\t\tthis.renderer.setViewport(0, 0, renderBufferSize.width, renderBufferSize.height)\n\n     \tif (!this.scene || !this.perspectiveCamera) {\n\t\t\tthis.renderer.clear()\n\t\t\tthis.renderer.setPixelRatio(oldPixelRatio)\n\n\t\t\treturn\n\t\t}\n\n\t\t// Render the scene through the manager.\n\t\tthis.renderer.render(this.scene, this.perspectiveCamera, this.texture)\n\n\t\tthis.renderer.setPixelRatio(oldPixelRatio)\n\n\t\t// set render target to null as otherwise the next renderer will splat over\n\t\t// the render target we just rendered\n\t\tthis.renderer.setRenderTarget(null)\n\t}\n\n\tThreeWebGLTextureRendererPlugin.prototype.state_changed = function(ui) {\n\t\tif (!ui) {\n\t\t\tconsole.log('state_changed')\n\t\t}\n\t}\n\t\n\tThreeWebGLTextureRendererPlugin.prototype.update_output = function() {\n\t\treturn this.texture\n\t}\n\n})()\n"
  },
  {
    "path": "browser/plugins/threesixty_photo_entity.plugin.js",
    "content": "(function() {\n\nvar ThreeSixtyPhotoEntityPlugin = E2.plugins.threesixty_photo_entity = function() {\n\tAbstractEntityPlugin.apply(this, arguments)\n\tthis.desc = '360 Photo Entity Patch'\n}\n\nThreeSixtyPhotoEntityPlugin.prototype = Object.create(AbstractEntityPlugin.prototype)\n\n})()\n"
  },
  {
    "path": "browser/plugins/toggle-button/style.css",
    "content": ".toggle_btn\n{\n\tfont-size:12px;\n\tfont-family: Helvetica, Arial, Sans-serif;\n\tfont-weight:normal;\n\t-moz-border-radius:3px;\n\t-webkit-border-radius:3px;\n\tborder-radius:3px;\n\tborder:1px solid #888;\n\tpadding:3px 4px;\n\ttext-decoration:none;\n\tcolor:#000;\n\tdisplay:inline-block;\n \t-webkit-box-shadow:inset 1px 1px 0px 0px #ffffff;\n \t-moz-box-shadow:inset 1px 1px 0px 0px #ffffff;\n \tbox-shadow:inset 1px 1px 0px 0px #ffffff;\n\tbackground:-moz-linear-gradient(center top, #edfded 100%, #a8b8a8 5%);\n\tbackground:-ms-linear-gradient(top, #edfded 100%, #a8b8a8 5%);\n\tbackground:-webkit-gradient(linear, left top, left bottom, color-stop(100%, #edfded), color-stop(5%, #a8b8a8));\n\tbackground-color:#fdeded !important;\n}\n\n.toggle_btn_off\n{\n\tbackground:-moz-linear-gradient(center top, #fdeded 5%, #b8a8a8 100%) !important;\n\tbackground:-ms-linear-gradient(top, #fdeded 5%, #b8a8a8 100%) !important;\n\tbackground:-webkit-gradient(linear, left top, left bottom, color-stop(5%, #fdeded), color-stop(100%, #b8a8a8)) !important;\n\tbackground-color:#edfded !important;\n}\n\n.toggle_btn:active\n{\n\tposition:relative;\n\ttop:1px;\n}\n"
  },
  {
    "path": "browser/plugins/toggle_button.plugin.js",
    "content": "(function(){\n\nvar Toggle = E2.plugins.toggle_button = function(core, node) {\n\tPlugin.apply(this, arguments)\n\tthis.desc = 'Toggle button that emits true and false as it is clicked.';\n\t\n\tthis.input_slots = []\n\t\n\tthis.output_slots = [\n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: 'True or false is emitted on the next update after the buttons has been clicked.', def: 'False' }\n\t]\n\t\n\tthis.state = { enabled: false }\n\tthis.core = core\n\tthis.node = node\n}\n\nToggle.prototype = Object.create(Plugin.prototype)\n\nToggle.prototype.reset = function() {}\n\nToggle.prototype.create_ui = function() {\n\tvar that = this\n\tvar inp = this.ui = makeButton('Off')\n\t\n\tinp.click(function() {\n\t\tthat.undoableSetState('enabled', !that.state.enabled, that.state.enabled)\n\t})\n\n\tthis.node.on('pluginStateChanged', this.updateUi.bind(this))\n\n\treturn inp\n}\n\nToggle.prototype.update_output = function() {\n\treturn this.state.enabled\n}\n\nToggle.prototype.updateUi = function() {\n\tif (!this.ui)\n\t\treturn \n\n\tvar ui = this.ui\n\n\tui.html(this.state.enabled ? 'On' : 'Off')\n//\tui.addClass('toggle_btn')\n\t\n\tif(!this.state.enabled)\n\t\tui.addClass('state_off').removeClass('state_on')\n\telse\n\t\tui.removeClass('state_off').addClass('state_on')\n}\n\nToggle.prototype.state_changed = function(ui) {\n\tif (ui) {\n\t\tthis.core.add_aux_style('toggle-button/style.css')\n\t\tthis.updateUi()\n\t}\n}\n\n})()\n"
  },
  {
    "path": "browser/plugins/toggle_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"toggle_modulator\"] = function(core, node)\n{\n\tthis.desc = 'For every continous sequence of \\'true\\' values sent to the \\'trigger\\' input slot the emitted value will switch from true to false and visa versa. The initial value is true.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'trigger', dt: core.datatypes.BOOL, desc: 'Every time true is sent one or more times in a row, the emitted value will switch between true and false, starting with true.', def: false }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: 'The current state.', def: true }\n\t];\n\t\n\tthis.state = { value: true };\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(data)\n\t{\n\t\tthis.triggered = true;\n\t\tthis.state.value = !this.state.value;\n\t}\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tif(!this.triggered)\n\t\tthis.updated = false;\n\t\n\tthis.triggered = false;\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.state.value;\n};\t\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.state.value = true;\n\t\tthis.triggered = true;\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/touch_end_generator.plugin.js",
    "content": "(function() {\n\nvar TouchEnd = E2.plugins.touch_end_generator = function(core, node) {\n\tthis.desc = 'When a touch on eg. a mobile device ends, this outputs a boolean true value for one frame.'\n\t\n\tthis.input_slots = []\n\t\n\tthis.output_slots = [{\n\t\tname: 'trigger',\n\t\tdt: core.datatypes.BOOL,\n\t\tdesc: 'True when the touch ends.',\n\t\tdef: false\n\t}]\n\n\tthis.triggered = false\n\tthis.frames = 0\n\n\tthis.endListener = function endListener() {\n\t\tthis.frames = 0\n\t\tthis.triggered = true\n\t\tthis.updated = true\n\t\tnode.queued_update = 1\n\t}.bind(this)\n}\n\nTouchEnd.prototype.update_output = function() {\n\treturn this.triggered\n}\n\nTouchEnd.prototype.update_state = function() {\n\tif (this.frames++ > 0)\n\t\tthis.triggered = false\n}\n\nTouchEnd.prototype.destroy = function() {\n\tE2.dom.webgl_canvas.off('touchend', this.endListener)\n}\n\nTouchEnd.prototype.state_changed = function(ui) {\n\tif (!ui) {\n\t\tE2.dom.webgl_canvas.on('touchend', this.endListener)\n\t}\n}\n\n})()\n"
  },
  {
    "path": "browser/plugins/touch_start_generator.plugin.js",
    "content": "(function() {\n\nvar TouchStart = E2.plugins.touch_start_generator = function(core, node) {\n\tthis.desc = 'When a touch on eg. a mobile device starts, this outputs a boolean true value for one frame.'\n\t\n\tthis.input_slots = []\n\t\n\tthis.output_slots = [{\n\t\tname: 'trigger',\n\t\tdt: core.datatypes.BOOL,\n\t\tdesc: 'True when the touch starts.',\n\t\tdef: false\n\t}]\n\n\tthis.triggered = false\n\tthis.frames = 0\n\n\tthis.startListener = function startListener() {\n\t\tthis.frames = 0\n\t\tthis.triggered = true\n\t\tthis.updated = true\n\t\tnode.queued_update = 1\n\t}.bind(this)\n}\n\nTouchStart.prototype.update_output = function() {\n\treturn this.triggered\n}\n\nTouchStart.prototype.update_state = function() {\n\tif (this.frames++ > 0)\n\t\tthis.triggered = false\n}\n\nTouchStart.prototype.destroy = function() {\n\tE2.dom.webgl_canvas.off('touchstart', this.startListener)\n}\n\nTouchStart.prototype.state_changed = function(ui) {\n\tif (!ui) {\n\t\tE2.dom.webgl_canvas.on('touchstart', this.startListener)\n\t}\n}\n\n})()\n"
  },
  {
    "path": "browser/plugins/touching_generator.plugin.js",
    "content": "(function() {\n\nvar Touching = E2.plugins.touching_generator = function(core) {\n\tthis.desc = 'While touching eg. a mobile device, this outputs a boolean true.'\n\t\n\tthis.input_slots = []\n\t\n\tthis.output_slots = [{\n\t\tname: 'trigger',\n\t\tdt: core.datatypes.BOOL,\n\t\tdesc: 'True while the touch is ongoing.',\n\t\tdef: false\n\t}]\n\n\tthis.touching = false\n\n\tthis.startListener = function startListener() {\n\t\tthis.touching = true\n\t\tthis.updated = true\n\t}.bind(this)\n\n\tthis.endListener = function endListener() {\n\t\tthis.touching = false\n\t\tthis.updated = true\n\t}.bind(this)\n}\n\nTouching.prototype.update_output = function() {\n\treturn this.touching\n}\n\nTouching.prototype.destroy = function() {\n\tE2.dom.webgl_canvas.off('touchstart', this.startListener)\n\tE2.dom.webgl_canvas.off('touchend', this.endListener)\n}\n\nTouching.prototype.state_changed = function(ui) {\n\tif (!ui) {\n\t\tE2.dom.webgl_canvas.on('touchstart', this.startListener)\n\t\tE2.dom.webgl_canvas.on('touchend', this.endListener)\n\t}\n}\n\n})()\n"
  },
  {
    "path": "browser/plugins/translation_matrix.plugin.js",
    "content": "E2.p = E2.plugins[\"translation_matrix\"] = function(core, node)\n{\n\tthis.desc = 'Create a matrix that represent a translation.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'vector', dt: core.datatypes.VECTOR, desc: 'Translation vector.', def: [0, 0, 0] }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'matrix', dt: core.datatypes.MATRIX, desc: 'The resulting translation matrix.', def: core.renderer.matrix_identity }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.matrix = mat4.create();\n\tmat4.identity(this.matrix);\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tvar m = this.matrix;\n\t\n\tm[12] = data[0];\n\tm[13] = data[1];\n\tm[14] = data[2];\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.matrix;\n};\n"
  },
  {
    "path": "browser/plugins/translation_xyz_matrix.plugin.js",
    "content": "E2.p = E2.plugins[\"translation_xyz_matrix\"] = function(core, node)\n{\n\tthis.desc = 'Create a matrix that tranlates along the X, Y and Z axis.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'x', dt: core.datatypes.FLOAT, desc: 'Amount to translate along the X-axis.', def: 0.0 },\n\t\t{ name: 'y', dt: core.datatypes.FLOAT, desc: 'Amount to translate along the Y-axis.', def: 0.0 },\n\t\t{ name: 'z', dt: core.datatypes.FLOAT, desc: 'Amount to translate along the Z-axis.', def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'matrix', dt: core.datatypes.MATRIX, desc: 'The resulting translation matrix.', def: core.renderer.matrix_identity }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.components = [0.0, 0.0, 0.0];\n\tthis.matrix = mat4.create();\n\n\tmat4.identity(this.matrix);\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.components[slot.index] = data;\n};\n\nE2.p.prototype.update_state = function()\n{\n\tvar m = this.matrix;\n\n\tmat4.identity(this.matrix);\n\t\n\tm[12] = this.components[0];\n\tm[13] = this.components[1];\n\tm[14] = this.components[2];\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.matrix;\n};\n"
  },
  {
    "path": "browser/plugins/transpose_matrix_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"transpose_matrix_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits the transposed version of the supplied <b>matrix</b>.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'matrix', dt: core.datatypes.MATRIX, desc: 'The input matrix to be transposed.', def: core.renderer.matrix_identity }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'transposed', dt: core.datatypes.MATRIX, desc: 'Emits the transposed input <b>matrix</b>.', def: core.renderer.matrix_identity }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.matrix = mat4.create();\n\tthis.transposed = mat4.create();\n\n\tmat4.identity(this.matrix);\n\tmat4.identity(this.transposed);\n};\n\nE2.p.prototype.connection_changed = function(on, conn, slot)\n{\n\tif(!on && slot.type === E2.slot_type.input)\n\t{\n\t\tmat4.identity(this.matrix);\n\t\tmat4.identity(this.transposed);\n\t}\n};\t\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.matrix = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tmat4.transpose(this.matrix, this.transposed);\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.transposed;\n};\n"
  },
  {
    "path": "browser/plugins/triangle_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"triangle_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Triangle oscilator. A <b>time</b> value incrementing by one per second will yield a 1Hz output signal.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'time', dt: core.datatypes.FLOAT, desc: 'The current time in seconds.', def: 0.0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'Emits ((0.5 - |(<b>time</b> % 1.0) - 0.5|) - 0.25) * 4.', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.time = 0.0;\n\tthis.result = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.time = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.result = ((0.5 - Math.abs(this.time % 1.0 - 0.5)) - 0.25) * 4.0;\n\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.result;\n};\n"
  },
  {
    "path": "browser/plugins/trigger_revolver.plugin.js",
    "content": "(function() {\n\nvar TriggerRevolver = E2.plugins.trigger_revolver = function TriggerRevolver(core, node) {\n\tvar that = this\n\t\n\tthis.desc = 'Revolver style array switch. Set up n inputs, then choose which one to output.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'trigger', dt: E2.dt.BOOL, desc: 'Select next input.', def: false }\n\t]\n\t\n\tthis.output_slots = [\n\t\t{ name: 'value', dt: E2.dt.ANY, desc: 'Emits the selected input.' },\n\t\t{ name: 'length', dt: E2.dt.FLOAT, desc: 'Emits the number of inputs = the length of the array.' }\n\t]\n\n\tthis.core = core\n\tthis.node = node\n\tthis.lsg = new LinkedSlotGroup(core, node, [], [this.output_slots[0]])\n\n\tthis.number = 0\n\tthis.values = []\n\n\tthis.node.on('slotAdded', function() {\n\t\tthat.dynInputs = node.getDynamicInputSlots()\n\t\tthat.updated = true\n\t})\n\n\tthis.node.on('slotRemoved', function() {\n\t\tthat.dynInputs = node.getDynamicInputSlots()\n\t\tthat.updated = true\n\t})\n}\n\nTriggerRevolver.prototype.create_ui = function() {\n\tvar that = this\n\tvar layout = make('div')\n\tvar removeButton = makeButton('Remove', 'Click to remove the last input.')\n\tvar addButton = makeButton('Add', 'Click to add another input.')\n\t\n\tremoveButton.css('width', '65px')\n\taddButton.css({ 'width': '65px', 'margin-top': '5px' })\n\t\n\taddButton.click(function() {\n\t\tE2.app.graphApi.addSlot(that.node.parent_graph, that.node, {\n\t\t\ttype: E2.slot_type.input,\n\t\t\tname: that.dynInputs.length + '',\n\t\t\tdt: that.lsg.dt\n\t\t})\n\t})\n\n\tremoveButton.click(function() {\n\t\tvar inputs = that.dynInputs\n\t\tif (!inputs)\n\t\t\treturn\n\n\t\tvar suid = inputs[inputs.length - 1].uid\n\t\tE2.app.graphApi.removeSlot(that.node.parent_graph, that.node, suid)\n\t})\n\n\tlayout.append(removeButton, '<br />', addButton);\n\t\n\treturn layout\n}\n\nTriggerRevolver.prototype.update_input = function(slot, data) {\n\tif (slot.uid === undefined) {\n\t\tif (data === true) {\n\t\t\tthis.number = (this.number + 1) % this.dynInputs.length\n\n\t\t\tfor (var i=0; i < this.dynInputs.length; i++)\n\t\t\t\tthis.dynInputs[i].inactive = (i !== this.number)\n\n\t\t\treturn\n\t\t}\n\t} else { // dynamic slot\n\t\tthis.values[slot.index] = data\n\t}\n}\n\nTriggerRevolver.prototype.update_state = function() {\n\tif (this.number >= this.values.length) {\n\t\tthis.updated = (this.value !== undefined)\n\t\tthis.value = undefined\n\t\treturn\n\t}\n\n\tif (this.value !== this.values[this.number]) {\n\t\tthis.value = this.values[this.number]\n\t\tthis.updated = true\n\t}\n\telse {\n\t\tthis.updated = false\n\t}\n}\n\nTriggerRevolver.prototype.update_output = function(slot) {\n\tif (slot.index === 1)\n\t\treturn this.dynInputs.length\n\n\tif (this.value !== undefined)\n\t\treturn this.value\n\n\tvar def = this.core.get_default_value(this.lsg.dt)\n\n\treturn def\n}\n\nTriggerRevolver.prototype.connection_changed = function(on, conn, slot) {\n\tif (this.lsg.connection_changed(on, conn, slot))\n\t\tthis.value = this.lsg.core.get_default_value(this.lsg.dt)\n}\n\nTriggerRevolver.prototype.state_changed = function(ui) {\n\tif (!ui) {\n\t\tvar slots = this.dynInputs = this.node.getDynamicInputSlots()\n\n\t\tfor(var i = 0, len = slots.length; i < len; i++) {\n\t\t\tthis.lsg.add_dyn_slot(slots[i])\n\t\t\tslots[i].inactive = false\n\t\t}\n\t\t\n\t\tthis.number = 0\n\t\tthis.value = this.lsg.infer_dt()\n\t}\n};\n\n\n})();\n\n"
  },
  {
    "path": "browser/plugins/tween_in_modulator.plugin.js",
    "content": "(function(){\nvar TweenIn = E2.plugins[\"tween_in_modulator\"] = function(core, node)\n{\n\tPlugin.apply(this, arguments)\n\tthis.desc = 'Perform tween in over time.';\n\tthis.input_slots = [ { name: 'time', dt: core.datatypes.FLOAT, desc: 'Time ranging from zero to one.', def: 0.0, lo: 0, hi: 1 } ];\n\tthis.output_slots = [ { name: 'result', dt: core.datatypes.FLOAT, desc: 'Emits a tween in over <b>time</b>.', def: 0.0 } ];\n\n\tthis.state = { type: 0 };\n};\nTweenIn.prototype = Object.create(Plugin.prototype)\n\nTweenIn.prototype.create_ui = function()\n{\n\tvar inp = $('<select />', { selectedIndex: 0 });\n\tvar create = function(val, txt) { $('<option />', { value: val, text: txt }).appendTo(inp) };\n\n\tcreate(0, 'Circular');\n\tcreate(1, 'Cubic');\n\tcreate(2, 'Exponential');\n\tcreate(3, 'Quadratic');\n\tcreate(4, 'Quartic');\n\tcreate(5, 'Quintic');\n\tcreate(6, 'Sinusoidal');\n\n\tinp.change(function(self) { return function() \n\t{\n\t\tself.undoableSetState('type', inp.val(), self.state.type)\n\t}}(this));\n\t\n\treturn inp;\n};\n\nTweenIn.prototype.reset = function()\n{\n\tthis.result = 0.0;\n\tthis.time = 0.0;\n};\n\nTweenIn.prototype.update_input = function(slot, data)\n{\n\tthis.time = data < 0.0 ? 0.0 : data > 1.0 ? 1.0 : data;\n};\t\n\nTweenIn.prototype.update_state = function()\n{\n\tvar r = 0, d = this.time;\n\t\n\tswitch(this.state.type)\n\t{\n\t\tcase 0:\n\t\t\tr = 1 - Math.sqrt(1 - d * d);\n\t\t\tbreak;\n\t\n\t\tcase 1:\n\t\t\tr = d * d * d;\n\t\t\tbreak;\n\n\t\tcase 2:\n\t\t\tr = d === 0 ? 0 : Math.pow(1024, d - 1);\n\t\t\tbreak;\n\n\t\tcase 3:\n\t\t\tr = d * d;\n\t\t\tbreak;\n\n\t\tcase 4:\n\t\t\tr = d * d * d * d;\n\t\t\tbreak;\n\n\t\tcase 5:\n\t\t\tr = d * d * d * d * d;\n\t\t\tbreak;\n\n\t\tcase 6:\n\t\t\tr = 1 - Math.cos(d * Math.PI / 2);\n\t\t\tbreak;\n\n\t\tdefault: break;\n\t}\n\t\n\tthis.result = r;\n};\n\nTweenIn.prototype.update_output = function(slot)\n{\n\treturn this.result;\n};\n\nTweenIn.prototype.state_changed = function(ui)\n{\n\tif(ui)\n\t\tui.val('' + this.state.type);\n};\n\n\n})();\n\n"
  },
  {
    "path": "browser/plugins/tween_out_modulator.plugin.js",
    "content": "(function(){\nvar TweenOut = E2.plugins[\"tween_out_modulator\"] = function(core, node)\n{\n\tPlugin.apply(this, arguments)\n\tthis.desc = 'Perform tween out over time.';\n\tthis.input_slots = [ { name: 'time', dt: core.datatypes.FLOAT, desc: 'Time ranging from zero to one.', def: 0.0, lo: 0, hi: 1 } ];\n\tthis.output_slots = [ { name: 'result', dt: core.datatypes.FLOAT, desc: 'Emits a tween out over <b>time</b>.', def: 0.0 } ];\n\n\tthis.state = { type: 0 };\n};\nTweenOut.prototype = Object.create(Plugin.prototype)\n\nTweenOut.prototype.create_ui = function()\n{\n\tvar inp = $('<select />', { selectedIndex: 0 });\n\tvar create = function(val, txt) { $('<option />', { value: val, text: txt }).appendTo(inp) };\n\n\tcreate(0, 'Circular');\n\tcreate(1, 'Cubic');\n\tcreate(2, 'Exponential');\n\tcreate(3, 'Quadratic');\n\tcreate(4, 'Quartic');\n\tcreate(5, 'Quintic');\n\tcreate(6, 'Sinusoidal');\n\n\t \n\tinp.change(function(self) { return function() \n\t{\n\t\tself.undoableSetState('type', inp.val(), self.state.type)\n\t}}(this));\n\t\n\treturn inp;\n};\n\nTweenOut.prototype.reset = function()\n{\n\tthis.result = 0.0;\n\tthis.time = 0.0;\n};\n\nTweenOut.prototype.update_input = function(slot, data)\n{\n\tthis.time = data < 0.0 ? 0.0 : data > 1.0 ? 1.0 : data;\n};\t\n\nTweenOut.prototype.update_state = function()\n{\n\tvar r = 0, d = this.time;\n\t\n\tswitch(this.state.type)\n\t{\n\t\tcase 0:\n\t\t\tr = Math.sqrt(1 - --d * d);\n\t\t\tbreak;\n\t\n\t\tcase 1:\n\t\t\tr = --d * d * d + 1;\n\t\t\tbreak;\n\n\t\tcase 2:\n\t\t\tr = d === 1 ? 1 : 1 - Math.pow(2, -10 * d);\n\t\t\tbreak;\n\n\t\tcase 3:\n\t\t\tr = d * (2.0 - d);\n\t\t\tbreak;\n\n\t\tcase 4:\n\t\t\tr = 1 - --d * d * d * d;\n\t\t\tbreak;\n\n\t\tcase 5:\n\t\t\tr = --d * d * d * d * d + 1;\n\t\t\tbreak;\n\n\t\tcase 6:\n\t\t\tr = Math.sin(d * Math.PI / 2);\n\t\t\tbreak;\n\n\t\tdefault: break;\n\t}\n\t\n\tthis.result = r;\n};\n\nTweenOut.prototype.update_output = function(slot)\n{\n\treturn this.result;\n};\n\nTweenOut.prototype.state_changed = function(ui)\n{\n\tif(ui)\n\t\tui.val('' + this.state.type);\n};\n\n})();\n"
  },
  {
    "path": "browser/plugins/typed_array_generator.plugin.js",
    "content": "E2.p = E2.plugins[\"typed_array_generator\"] = function(core, node)\n{\n\tthis.desc = 'Create a zeroed out array of a given size (in bytes).';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'size', dt: core.datatypes.FLOAT, desc: 'Size if array in number of elements.', def: 0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'array', dt: core.datatypes.ARRAY, desc: 'The resulting array.' }\n\t];\n\n\tthis.state = { datatype: 1 }; // Default uint8\n\t\n\tthis.size = 0;\n\tthis.update_array();\n};\n\nE2.p.prototype.create_ui = function()\n{\n\tvar inp = $('<select />', { selectedIndex: 1 });\n\t\n\t$('<option />', { value: 0, text: 'Int8' }).appendTo(inp);\n\t$('<option />', { value: 1, text: 'Uint8' }).appendTo(inp);\n\t$('<option />', { value: 2, text: 'Int16' }).appendTo(inp);\n\t$('<option />', { value: 3, text: 'Uint16' }).appendTo(inp);\n\t$('<option />', { value: 4, text: 'Int32' }).appendTo(inp);\n\t$('<option />', { value: 5, text: 'Uint32' }).appendTo(inp);\n\t$('<option />', { value: 6, text: 'Float32' }).appendTo(inp);\n\t\n\tinp.change(function(self) { return function() \n\t{\n\t\tself.state.datatype = parseInt(inp.val());\n\t\tself.update_array();\n\t\tself.updated = true;\n\t}}(this));\n\t\n\treturn inp;\n};\n\nE2.p.prototype.update_array = function()\n{\n\tif(this.size === 0)\n\t{\n\t\tthis.array = null;\n\t\treturn;\n\t}\n\t\n\tvar stride = [1, 1, 2, 2, 4, 4, 4][this.state.datatype]; \n\n\tthis.array = new ArrayBuffer(stride * this.size);\n\tthis.array.datatype = this.state.datatype;\n\tthis.array.stride = stride;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.size = Math.floor(data);\n\tthis.update_array();\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.array;\n};\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(ui)\n\t\tui.val('' + this.state.datatype);\n};\n"
  },
  {
    "path": "browser/plugins/typed_array_get_as_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"typed_array_get_as_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Gets an item value from an array.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'array', dt: core.datatypes.ARRAY, desc: 'The array to obtain a value from.', def: null },\n\t\t{ name: 'index', dt: core.datatypes.FLOAT, desc: 'The index of the item to get.', def: 0 }\n\t];\n\t\n\tthis.output_slots = [ \n\t\t{ name: 'array', dt: core.datatypes.ARRAY, desc: 'The modified array.' },\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'The value of the chosen item.' }\n\t];\n\n\tthis.state = { datatype: 1 }; // Default uint8\n\n\tthis.node = node;\n\tthis.reset();\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.array = null;\n\tthis.dv = null;\n\tthis.accessor = null;\n\tthis.index = 0;\n\tthis.value = 0;\n};\n\nE2.p.prototype.create_ui = function()\n{\n\tvar inp = $('<select />', { selectedIndex: 1 });\n\n\t$('<option />', { value: 0, text: 'Int8' }).appendTo(inp);\n\t$('<option />', { value: 1, text: 'Uint8' }).appendTo(inp);\n\t$('<option />', { value: 2, text: 'Int16' }).appendTo(inp);\n\t$('<option />', { value: 3, text: 'Uint16' }).appendTo(inp);\n\t$('<option />', { value: 4, text: 'Int32' }).appendTo(inp);\n\t$('<option />', { value: 5, text: 'Uint32' }).appendTo(inp);\n\t$('<option />', { value: 6, text: 'Float32' }).appendTo(inp);\n\t\n\tinp.change(function(self) { return function() \n\t{\n\t\tself.state.datatype = parseInt(inp.val());\n\t\tself.update_view();\n\t\tself.updated = true;\n\t\tself.node.queued_update = 1;\n\t}}(this));\n\t\n\treturn inp;\n};\n\nE2.p.prototype.update_view = function()\n{\n\tif(!this.array)\n\t{\n\t\tthis.dv = null;\n\t\treturn;\n\t}\n\n\tvar dv = this.dv = new DataView(this.array);\n\n\tthis.accessor = [dv.getInt8,\n\t\t\t dv.getUint8,\n\t\t\t dv.getInt16,\n\t\t\t dv.getUint16,\n\t\t\t dv.getInt32,\n\t\t\t dv.getUint32,\n\t\t\t dv.getFloat32][this.state.datatype].bind(dv);\n\tthis.stride = [1, 1, 2, 2, 4, 4, 4][this.state.datatype];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t{\n\t\tif(this.array !== data)\n\t\t{\n\t\t\tthis.array = data;\n\t\t\tthis.update_view();\n\t\t}\n\t}\n\telse\n\t\tthis.index = Math.floor(data);\n};\n\nE2.p.prototype.update_state = function()\n{\n\tif(!this.dv)\n\t{\n\t\tthis.value = 0;\n\t\treturn;\n\t}\n\t\n\tvar off = this.index * this.stride;\n\t\n\tif(off < 0 || off >= this.array.byteLength)\n\t\treturn;\n\t\n\tthis.value = (this.state.datatype < 2) ? this.accessor(off) : this.accessor(off, true);\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\tif(slot.index === 0)\n\t\treturn this.array;\n\telse\n\t\treturn this.value;\n};\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(ui)\n\t\tui.val('' + this.state.datatype);\n};\n"
  },
  {
    "path": "browser/plugins/typed_array_get_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"typed_array_get_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Gets an item value from an array.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'array', dt: core.datatypes.ARRAY, desc: 'The array to obtain a value from.', def: null },\n\t\t{ name: 'index', dt: core.datatypes.FLOAT, desc: 'The index of the item to get.', def: 0 }\n\t];\n\t\n\tthis.output_slots = [ \n\t\t{ name: 'array', dt: core.datatypes.ARRAY, desc: 'The modified array.' },\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'The value of the chosen item.', def: 0 }\n\t];\n\n\tthis.node = node;\n\tthis.reset();\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.array = null;\n\tthis.dv = null;\n\tthis.accessor = null;\n\tthis.index = 0;\n\tthis.value = 0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t{\n\t\tif(this.array !== data)\n\t\t{\n\t\t\tthis.array = data;\n\t\t\tthis.update_view();\n\t\t}\n\t}\n\telse\n\t\tthis.index = Math.floor(data);\n};\n\nE2.p.prototype.update_view = function()\n{\n\tif(!this.array)\n\t{\n\t\tthis.dv = null;\n\t\treturn;\n\t}\n\t\n\tvar dv = this.dv = new DataView(this.array);\n\n\tthis.accessor = [dv.getInt8,\n\t\t\t dv.getUint8,\n\t\t\t dv.getInt16,\n\t\t\t dv.getUint16,\n\t\t\t dv.getInt32,\n\t\t\t dv.getUint32,\n\t\t\t dv.getFloat32][this.array.datatype].bind(dv);\n};\n\nE2.p.prototype.update_state = function()\n{\n\tif(!this.dv)\n\t{\n\t\tthis.value = 0;\n\t\treturn;\n\t}\n\t\n\tvar off = this.index * this.array.stride;\n\t\n\tif(off < 0 || off >= this.array.byteLength)\n\t\treturn;\n\t\n\tthis.value = (this.array.datatype < 2) ? this.accessor(off) : this.accessor(off, true);\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\tif(slot.index === 0)\n\t\treturn this.array;\n\telse\n\t\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/typed_array_item_to_bool_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"typed_array_item_to_bool_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits a boolean representation of the specified item in the named array member of the supplied object.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'object', dt: core.datatypes.OBJECT, desc: 'Input object.', def: null },\n\t\t{ name: 'member', dt: core.datatypes.TEXT, desc: 'Name of the array to be accessed.', def: null },\n\t\t{ name: 'index', dt: core.datatypes.FLOAT, desc: 'Index of the array item to be converted.', def: 0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: 'The boolean representation of the specified array item.', def: false }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = false;\n\tthis.object = null;\n\tthis.member = null;\n\tthis.index = 0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.object = data;\n\telse if(slot.index === 1)\n\t\tthis.member = data;\n\telse if(slot.index === 2)\n\t{\n\t\tthis.index = Math.floor(data);\n\t\tthis.index = this.index < 0 ? 0 : this.index;\n\t}\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tif(this.object === null || this.member === null)\n\t\treturn;\n\t\n\tif(!this.object.hasOwnProperty(this.member))\n\t{\n\t\tmsg('ERROR: Cannot index unknown array \"' + this.member + '\".');\n\t\treturn;\n\t}\n\t\n\tvar a = this.object[this.member];\n\t\n\tif(Object.prototype.toString.call(a) !== '[object Array]')\n\t{\n\t\tmsg('ERROR: Object member \"' + this.member + '\" is not an array.');\n\t\treturn;\n\t}\n\t\n\tthis.value = a.length > 0 ? (a[this.index % a.length] ? true: false) : false;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/typed_array_item_to_float_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"typed_array_item_to_float_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits a float representation of the specified item in the named array member of the supplied object.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'object', dt: core.datatypes.OBJECT, desc: 'Input object.', def: null },\n\t\t{ name: 'member', dt: core.datatypes.TEXT, desc: 'Name of the array to be accessed.', def: null },\n\t\t{ name: 'index', dt: core.datatypes.FLOAT, desc: 'Index of the array item to be converted.', def: 0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'The float representation of the specified array item.', def: 0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = 0;\n\tthis.object = null;\n\tthis.member = null;\n\tthis.index = 0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.object = data;\n\telse if(slot.index === 1)\n\t\tthis.member = data;\n\telse if(slot.index === 2)\n\t{\n\t\tthis.index = Math.floor(data);\n\t\tthis.index = this.index < 0 ? 0 : this.index;\n\t}\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tif(this.object === null || this.member === null)\n\t\treturn;\n\t\n\tif(!this.object.hasOwnProperty(this.member))\n\t{\n\t\tmsg('ERROR: Cannot convert unknown member \"' + this.member + '\".');\n\t\treturn;\n\t}\n\t\n\tvar a = this.object[this.member];\n\t\n\tif(Object.prototype.toString.call(a) !== '[object Array]')\n\t{\n\t\tmsg('ERROR: Object member \"' + this.member + '\" is not an array.');\n\t\treturn;\n\t}\n\t\n\tif(a.length < 1)\n\t{\n\t\tthis.value = 0;\n\t\treturn;\n\t}\n\t\n\tvar idx = this.index % a.length;\n\tvar d = a[idx];\n\t\n\tif(isNaN(d))\n\t{\n\t\tmsg('ERROR: The item at index ' + idx + ' of \"' + this.member + '\" is not a float.');\n\t\treturn;\n\t}\n\t\n\tthis.value = d;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/typed_array_item_to_object_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"typed_array_item_to_object_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits an object representation of the specified item in the named array member of the supplied object.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'object', dt: core.datatypes.OBJECT, desc: 'Input object.', def: null },\n\t\t{ name: 'member', dt: core.datatypes.TEXT, desc: 'Name of the array to be accessed.', def: null },\n\t\t{ name: 'index', dt: core.datatypes.FLOAT, desc: 'Index of the array item to be converted.', def: 0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'object', dt: core.datatypes.OBJECT, desc: 'The object representation of the specified array item.' }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = {};\n\tthis.object = null;\n\tthis.member = null;\n\tthis.index = 0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.object = data;\n\telse if(slot.index === 1)\n\t\tthis.member = data;\n\telse if(slot.index === 2)\n\t{\n\t\tthis.index = Math.floor(data);\n\t\tthis.index = this.index < 0 ? 0 : this.index;\n\t}\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tif(this.object === null || this.member === null)\n\t\treturn;\n\t\n\tif(!this.object.hasOwnProperty(this.member))\n\t{\n\t\tmsg('ERROR: Cannot convert unknown member \"' + this.member + '\".');\n\t\treturn;\n\t}\n\t\n\tvar a = this.object[this.member];\n\t\n\tif(Object.prototype.toString.call(a) !== '[object Array]')\n\t{\n\t\tmsg('ERROR: Object member \"' + this.member + '\" is not an array.');\n\t\treturn;\n\t}\n\t\n\tvar d = a.length > 0 ? a[this.index % a.length] : null;\n\t\n\tif(d === null || typeof(d) !== 'object')\n\t{\n\t\tmsg('ERROR: The member \"' + this.member + '\" is not an object.');\n\t\treturn;\n\t}\n\t\n\tthis.value = d;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/typed_array_item_to_string_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"typed_array_item_to_string_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits an string representation of the specified item in the named array member of the supplied object.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'object', dt: core.datatypes.OBJECT, desc: 'Input object.', def: null },\n\t\t{ name: 'member', dt: core.datatypes.TEXT, desc: 'Name of the array to be accessed.', def: null },\n\t\t{ name: 'index', dt: core.datatypes.FLOAT, desc: 'Index of the array item to be converted.', def: 0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'text', dt: core.datatypes.TEXT, desc: 'The string representation of the specified array item.' }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.value = '';\n\tthis.object = null;\n\tthis.member = null;\n\tthis.index = 0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.object = data;\n\telse if(slot.index === 1)\n\t\tthis.member = data;\n\telse if(slot.index === 2)\n\t{\n\t\tthis.index = Math.floor(data);\n\t\tthis.index = this.index < 0 ? 0 : this.index;\n\t}\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tif(this.object === null || this.member === null)\n\t\treturn;\n\t\n\tif(!this.object.hasOwnProperty(this.member))\n\t{\n\t\tmsg('ERROR: Cannot convert unknown member \"' + this.member + '\".');\n\t\treturn;\n\t}\n\t\n\tvar a = this.object[this.member];\n\t\n\tif(Object.prototype.toString.call(a) !== '[object Array]')\n\t{\n\t\tmsg('ERROR: Object member \"' + this.member + '\" is not an array.');\n\t\treturn;\n\t}\n\t\n\tthis.value = a.length > 0 ? a[this.index % a.length].toString() : '';\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.value;\n};\n"
  },
  {
    "path": "browser/plugins/typed_array_item_to_typed_array_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"typed_array_item_to_typed_array_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits an typed array representation of the specified item in the named array member of the supplied object.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'object', dt: core.datatypes.OBJECT, desc: 'Input object.', def: null },\n\t\t{ name: 'member', dt: core.datatypes.TEXT, desc: 'Name of the array to be accessed.', def: null },\n\t\t{ name: 'index', dt: core.datatypes.FLOAT, desc: 'Index of the array item to be converted.', def: 0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'array', dt: core.datatypes.ARRAY, desc: 'The string representation of the specified array item.' }\n\t];\n\n\tthis.state = { datatype: 6 }; // Default float32\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.array = new ArrayBuffer(0);\n\tthis.object = null;\n\tthis.member = null;\n\tthis.index = 0;\n};\n\nE2.p.prototype.create_ui = function()\n{\n\tvar inp = $('<select />', { selectedIndex: 1 });\n\t\n\t$('<option />', { value: 0, text: 'Int8' }).appendTo(inp);\n\t$('<option />', { value: 1, text: 'Uint8' }).appendTo(inp);\n\t$('<option />', { value: 2, text: 'Int16' }).appendTo(inp);\n\t$('<option />', { value: 3, text: 'Uint16' }).appendTo(inp);\n\t$('<option />', { value: 4, text: 'Int32' }).appendTo(inp);\n\t$('<option />', { value: 5, text: 'Uint32' }).appendTo(inp);\n\t$('<option />', { value: 6, text: 'Float32' }).appendTo(inp);\n\t\n\tinp.change(function(self) { return function() \n\t{\n\t\tself.state.datatype = parseInt(inp.val());\n\t\tself.updated = true;\n\t}}(this));\n\t\n\treturn inp;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.object = data;\n\telse if(slot.index === 1)\n\t\tthis.member = data;\n\telse if(slot.index === 2)\n\t{\n\t\tthis.index = Math.floor(data);\n\t\tthis.index = this.index < 0 ? 0 : this.index;\n\t}\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tif(this.object === null || this.member === null)\n\t\treturn;\n\t\n\tif(!this.object.hasOwnProperty(this.member))\n\t{\n\t\tmsg('ERROR: Cannot convert unknown member \"' + this.member + '\".');\n\t\treturn;\n\t}\n\t\n\tvar a = this.object[this.member];\n\t\n\tif(Object.prototype.toString.call(a) !== '[object Array]')\n\t{\n\t\tmsg('ERROR: Object member \"' + this.member + '\" is not an array.');\n\t\treturn;\n\t}\n\t\n\tvar d = a.length > 0 ? a[this.index % a.length] : null;\n\t\n\tif(d === null || Object.prototype.toString.call(d).toLowerCase() !== '[object array]')\n\t{\n\t\tmsg('ERROR: The member \"' + this.member + '\" is not an array.');\n\t\treturn;\n\t}\n\t\n\tswitch(this.state.datatype)\n\t{\n\t\tcase 0: this.array = new Int8Array(d); break;\n\t\tcase 1: this.array = new Uint8Array(d); break;\n\t\tcase 2: this.array = new Int16Array(d); break;\n\t\tcase 3: this.array = new Uint16Array(d); break;\n\t\tcase 4: this.array = new Int32Array(d); break;\n\t\tcase 5: this.array = new Uint32Array(d); break;\n\t\tcase 6: this.array = new Float32Array(d); break;\n\t}\n\t\n\tthis.array = this.array.buffer; // Grrr..\n\tthis.array.datatype = this.state.datatype;\n\tthis.array.stride = [1, 1, 2, 2, 4, 4, 4][this.state.datatype];\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.array;\n};\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(ui)\n\t\tui.val('' + this.state.datatype);\n};\n"
  },
  {
    "path": "browser/plugins/typed_array_length_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"typed_array_length_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Gets the length of an array (in bytes).';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'array', dt: core.datatypes.ARRAY, desc: 'The array to obtain the length of.', def: null },\n\t];\n\t\n\tthis.output_slots = [ \n\t\t { name: 'length', dt: core.datatypes.FLOAT, desc: 'The length (in bytes) of the supplied array.' }\n\t];\n\n\tthis.node = node;\n\tthis.reset();\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.array = null;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.array = data;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.array ? this.array.byteLength / this.array.stride : 0;\n};\n\nE2.p.prototype.state_changed = function(ui)\n{\n};\n"
  },
  {
    "path": "browser/plugins/typed_array_set_as_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"typed_array_set_as_modulator\"] = function(core, node) {\n\tthis.desc = 'Sets an item value in an array.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'array', dt: core.datatypes.ARRAY, desc: 'The array to set a value in.', def: null },\n\t\t{ name: 'index', dt: core.datatypes.FLOAT, desc: 'The index of the item to set.', def: 0 },\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'The value to set the item to.', def: 0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'array', dt: core.datatypes.ARRAY, desc: 'The modified array.' }\n\t];\n\t\n\tthis.state = { datatype: 1 }; // Default uint8\n\n\tthis.node = node;\n\tthis.reset();\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.array = null;\n\tthis.dv = null;\n\tthis.accessor = null;\n\tthis.index = 0;\n\tthis.value = 0;\n\tthis.stride = 0;\n};\n\nE2.p.prototype.create_ui = function()\n{\n\tvar inp = $('<select />', { selectedIndex: 1 });\n\t\n\t$('<option />', { value: 0, text: 'Int8' }).appendTo(inp);\n\t$('<option />', { value: 1, text: 'Uint8' }).appendTo(inp);\n\t$('<option />', { value: 2, text: 'Int16' }).appendTo(inp);\n\t$('<option />', { value: 3, text: 'Uint16' }).appendTo(inp);\n\t$('<option />', { value: 4, text: 'Int32' }).appendTo(inp);\n\t$('<option />', { value: 5, text: 'Uint32' }).appendTo(inp);\n\t$('<option />', { value: 6, text: 'Float32' }).appendTo(inp);\n\t\n\tinp.change(function(self) { return function() \n\t{\n\t\tself.state.datatype = parseInt(inp.val());\n\t\tself.update_view();\n\t\tself.updated = true;\n\t\tself.node.queued_update = 1;\n\t}}(this));\n\t\n\treturn inp;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t{\n\t\tif(this.array !== data)\n\t\t{\n\t\t\tthis.array = data;\n\t\t\tthis.update_view();\n\t\t}\n\t}\n\telse if(slot.index === 1)\n\t\tthis.index = Math.floor(data);\n\telse\n\t\tthis.value = this.state.datatype === 6 ? data : Math.floor(data);\n};\n\nE2.p.prototype.update_view = function()\n{\n\tif(!this.array)\n\t{\n\t\tthis.dv = null;\n\t\treturn;\n\t}\n\t\n\tvar dv = this.dv = new DataView(this.array);\n\tthis.stride = [1, 1, 2, 2, 4, 4, 4][this.state.datatype];\n\n\tthis.accessor = [dv.setInt8, \n\t\t\t dv.setUint8,\n\t\t\t dv.setInt16,\n\t\t\t dv.setUint16,\n\t\t\t dv.setInt32,\n\t\t\t dv.setUint32,\n\t\t\t dv.setFloat32][this.state.datatype].bind(dv);\n};\n\nE2.p.prototype.update_state = function()\n{\n\tif(!this.dv)\n\t\treturn;\n\t\n\tvar off = this.index * this.stride;\n\t\n\tif(off < 0 || off >= this.array.byteLength)\n\t\treturn;\n\t\n\tvar dt = this.state.datatype;\n\t\n\tif(dt < 2)\n\t\tthis.accessor(off, Math.floor(this.value));\n\telse\n\t\tthis.accessor(off, dt === 6 ? this.value : Math.floor(this.value), true);\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.array;\n}\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(ui)\n\t\tui.val('' + this.state.datatype);\n};\n"
  },
  {
    "path": "browser/plugins/typed_array_set_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"typed_array_set_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Sets an item value in an array.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'array', dt: core.datatypes.ARRAY, desc: 'The array to set a value in.', def: null },\n\t\t{ name: 'index', dt: core.datatypes.FLOAT, desc: 'The index of the item to set.', def: 0 },\n\t\t{ name: 'value', dt: core.datatypes.FLOAT, desc: 'The value to set the item to.', def: 0 }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'array', dt: core.datatypes.ARRAY, desc: 'The modified array.' }\n\t];\n\t\n\tthis.node = node;\n\tthis.reset();\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.array = null;\n\tthis.dv = null;\n\tthis.accessor = null;\n\tthis.index = 0;\n\tthis.value = 0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t{\n\t\tif(this.array !== data)\n\t\t{\n\t\t\tthis.array = data;\n\t\t\tthis.update_view();\n\t\t}\n\t}\n\telse if(slot.index === 1)\n\t\tthis.index = Math.floor(data);\n\telse\n\t\tthis.value = data;\n};\n\nE2.p.prototype.update_view = function()\n{\n\tif(!this.array)\n\t{\n\t\tthis.dv = null;\n\t\treturn;\n\t}\n\t\n\tvar dv = this.dv = new DataView(this.array);\n\n\tthis.accessor = [dv.setInt8, \n\t\t\t dv.setUint8,\n\t\t\t dv.setInt16,\n\t\t\t dv.setUint16,\n\t\t\t dv.setInt32,\n\t\t\t dv.setUint32,\n\t\t\t dv.setFloat32][this.array.datatype].bind(dv);\n};\n\nE2.p.prototype.update_state = function()\n{\n\tif(!this.dv)\n\t\treturn;\n\t\n\tvar off = this.index * this.array.stride;\n\t\n\tif(off < 0 || off >= this.array.byteLength)\n\t\treturn;\n\t\n\tvar dt = this.array.datatype;\n\t\n\tif(dt < 2)\n\t\tthis.accessor(off, Math.floor(this.value));\n\telse\n\t\tthis.accessor(off, dt === 6 ? this.value : Math.floor(this.value), true);\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.array;\n};\n\n"
  },
  {
    "path": "browser/plugins/typed_array_to_texture_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"typed_array_to_texture_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Converts the supplied array to a texture.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'array', dt: core.datatypes.ARRAY, desc: 'The array to convert.', def: null },\n\t\t{ name: 'width', dt: core.datatypes.FLOAT, desc: 'The desired width of the resulting texture.', def: 0 } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'texture', dt: core.datatypes.TEXTURE, desc: 'The resulting texture.' }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.texture = new THREE.Texture();\n\tthis.array = null;\n\tthis.width = 0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.array = new Uint8Array(data);\n\telse\n\t\tthis.width = Math.floor(data);\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tif(!this.array || !this.width)\n\t\treturn;\n\t\n\tif((this.array.byteLength / 4) % this.width)\n\t{\n\t\tmsg('ERROR: Cannot create texture. The supplied width does not divide evenly into the array size in pixels.');\n\t\treturn;\n\t}\n\t\n\tvar w = this.width;\n\tvar h = (this.array.byteLength / 4) / this.width;\n\t\n\tif(!t.isPow2(w))\n\t{\n\t\tmsg('WARNING: The width (' + w + ') of the texture is not a power of two.');\n\t\treturn;\n\t}\n\t\n\tif(!t.isPow2(h))\n\t{\n\t\tmsg('WARNING: The height (' + h + ') of the texture is not a power of two.');\n\t\treturn;\n\t}\n\t\n\tmsg('Uploading texture from array with size ' + w + 'x' + h);\n\n\tthis.texture = new THREE.DataTexture(this.array, w, h)\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.texture;\n};\n"
  },
  {
    "path": "browser/plugins/url_array_generator.plugin.js",
    "content": "(function() {\nvar UrlArray = E2.plugins[\"url_array_generator\"] = function(core, node)\n{\n\tPlugin.apply(this, arguments)\n\tthis.desc = 'Load arbitrary data packed in an PNG from an URL.';\n\t\n\tthis.input_slots = [];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'array', dt: core.datatypes.ARRAY, desc: 'The loaded array.' }\n\t];\n\t\n\tthis.state = { url: '' };\n\tthis.gl = core.renderer.context;\n\tthis.core = core;\n\tthis.array = null;\n\tthis.dirty = false;\n};\nUrlArray.prototype = Object.create(Plugin.prototype)\n\nUrlArray.prototype.reset = function()\n{\n};\n\nUrlArray.prototype.create_ui = function()\n{\n\tvar inp = makeButton('Source', 'No texture selected.', 'url');\n\tvar that = this;\n\n\tfunction clickHandler() {\n\t\tvar oldValue = that.state.url\n\t\tvar newValue = oldValue\n\n\t\tfunction setValue(v) {\n\t\t\tthat.state.url = newValue = v\n\t\t\tthat.updated = true\n\t\t\tthat.state_changed()\n\t\t}\n\n\t\tFileSelectControl\n\t\t.createTextureSelector(oldValue, function(control) {\n\t\t\tcontrol\t\n\t\t\t.template('texture')\n\t\t\t.selected(oldValue)\n\t\t\t.onChange(setValue.bind(this))\n\t\t\t.buttons({\n\t\t\t\t'Cancel': setValue.bind(this, oldValue),\n\t\t\t\t'Select': setValue.bind(this)\n\t\t\t})\n\t\t\t.on('closed', function() {\n\t\t\t\tif (newValue === oldValue)\n\t\t\t\t\treturn;\n\t\t\t\n\t\t\t\tthat.undoableSetState('url', newValue, oldValue)\n\t\t\t})\n\t\t\t.modal()\n\t\t})\n\t}\n\n\tinp.click(clickHandler)\n\n\treturn inp;\n};\n\nUrlArray.prototype.update_input = function(slot, data)\n{\n\tthis.state.url = data;\n\tthis.state_changed(null);\n};\n\nUrlArray.prototype.update_state = function()\n{\n\tif(!this.dirty)\n\t\treturn;\n\t\t\n\tthis.img = new Image();\n\n\tthis.img.onload = function() {\n\t\tvar canvas = document.createElement('canvas');\n\t\tvar ctx = canvas.getContext('2d');\n\t\t\n\t\tcanvas.width = this.img.width;\n\t\tcanvas.height = this.img.height;\n\t\t\n\t\tctx.imageSmoothingEnabled = false;\n\t\tctx.webkitImageSmoothingEnabled = false;\n\t\tctx.globalCompositeOperation = 'copy';\n\t\t\n\t\tctx.drawImage(this.img, 0, 0);\n\t\n\t\tvar pd = ctx.getImageData(0, 0, this.img.width, this.img.height);\n\t\t\n\t\tthis.array = pd.data.buffer;\n\t\tthis.array.stride = 1;\n\t\tthis.array.datatype = 1;\n\t\tthis.updated = true;\n\n\t\tmsg('INFO: Finished loading data array from ' + this.img.src);\n\t\t\n\t}.bind(this);\n\n\tthis.img.onerror = function(err) {\n\t\tconsole.error(err)\n\t}\n\n\tthis.img.onabort = function() {}\n\n\tthis.img.src = this.state.url;\t\n\tthis.dirty = false;\n};\n\nUrlArray.prototype.update_output = function() {\n\treturn this.array;\n};\n\nUrlArray.prototype.state_changed = function(ui)\n{\n\tif(this.state.url !== '')\n\t{\n\t\tif(ui)\n\t\t\tui.attr('title', this.state.url);\n\t\telse\n\t\t\tthis.dirty = true;\n\t}\n};\n\n})();\n"
  },
  {
    "path": "browser/plugins/url_audio_buffer_generator.plugin.js",
    "content": "(function(){\n\nvar UrlAudioBuffer = E2.plugins.url_audio_buffer_generator = function(core, node) {\n\tPlugin.apply(this, arguments)\n\tthis.desc = 'Load an audio sample from an URL.'\n\n\tthis.input_slots = [\n\t\t{ name: 'url', dt: core.datatypes.TEXT, desc: 'Use this to load from a URL supplied as a string.', def: '' }\n\t]\n\n\tthis.output_slots = [\n\t\t{ name: 'buffer', dt: core.datatypes.OBJECT, desc: 'An audio buffer.' }\n\t]\n\n\tthis.state = { url: null }\n\tthis.core = core\n\tthis.buffer = null\n\tthis.dirty = false\n}\n\nUrlAudioBuffer.prototype = Object.create(Plugin.prototype)\n\nUrlAudioBuffer.prototype.reset = function() {\n\tthis.updated = false\n}\n\nUrlAudioBuffer.prototype.create_ui = function() {\n\tvar inp = makeButton('Source', 'No audio selected.', 'url')\n\tvar that = this\n\n\tinp.click(function() {\n\t\tvar fsc = FileSelectControl.createAudioSelector(that.state.url)\n\t\tfsc.onChange(function(v) {\n\t\t\tvar actualFile = fsc.getFileMetadata(v)\n\t\t\tthat.undoableSetState('url', actualFile.path, that.state.url)\n\t\t})\n\t})\n\n\treturn inp\n}\n\nUrlAudioBuffer.prototype.update_input = function(slot, data) {\n\tthis.state.url = data\n\tthis.state_changed(null)\n}\n\nUrlAudioBuffer.prototype.update_state = function() {\n\tvar that = this\n\n\tif (!this.dirty)\n\t\treturn\n\n\tif (!this.state.url)\n\t\treturn\n\n\tif (this.core.audioContext) {\n\t\tvar noextname = this.state.url.substring(0, this.state.url.lastIndexOf('.'))\n\t\tvar extname = this.state.url.substring(this.state.url.lastIndexOf('.'))\n\n\t\t// force Safari/iOS to use m4a *only if the asset is an ogg*\n\t\t// allows us to switch between ogg for everything else and m4a for Safari\n\t\tif (extname === '.ogg') {\n\t\t\tif (E2.util.isMobile.iOS() || E2.util.isBrowser.Safari()) {\n\t\t\t\tthis.state.url = noextname + '.m4a'\n\t\t\t}\n\t\t}\n\n\t\tE2.core.assetLoader\n\t\t.loadAsset('audiobuffer', this.state.url)\n\t\t.then(function(buffer) {\n\t\t\tif (!buffer)\n\t\t\t\treturn\n\n\t\t\tthat.buffer = buffer\n\t\t\tthat.updated = true\n\t\t})\n\t}\n\telse\n\t\tmsg('ERROR: Cannot create audio buffer. This browser does not support the required API.')\n\n\tthis.dirty = false\n}\n\nUrlAudioBuffer.prototype.update_output = function() {\n\treturn this.buffer\n}\n\nUrlAudioBuffer.prototype.state_changed = function(ui) {\n\tif (this.state.url !== '') {\n\t\tif (ui)\n\t\t\tui.attr('title', this.state.url)\n\t\telse\n\t\t\tthis.dirty = true\n\t}\n}\n\n})()\n"
  },
  {
    "path": "browser/plugins/url_audio_generator.plugin.js",
    "content": "(function(){\nvar UrlAudio = E2.plugins[\"url_audio_generator\"] = function(core, node)\n{\n\tPlugin.apply(this, arguments)\n\tthis.desc = 'Load a sample from an URL. Each sample should be encoded as .wav, .mp3, .mp4 and .ogg, and no extension should be specified. This plugin will load the appropriate filetype for the current execution environment. Hover over the Source button to see the url of the current file.';\n\n\tthis.input_slots = [\n\t\t{ name: 'url', dt: core.datatypes.TEXT, desc: 'Use this to load from a URL supplied as a string.', def: '' }\n\t];\n\t\n\tthis.output_slots = [ \n\t\t{ name: 'audio', dt: core.datatypes.AUDIO, desc: 'An audio stream.' }\n\t];\n\t\n\tthis.state = { url: '' };\n\tthis.core = core;\n\tthis.audio = null;\n\tthis.dirty = false;\n};\nUrlAudio.prototype = Object.create(Plugin.prototype)\n\nUrlAudio.prototype.reset = function()\n{\n};\n\nUrlAudio.prototype.create_ui = function()\n{\n\tvar inp = makeButton('Source', 'No audio selected.', 'url');\n\tvar that = this;\n\n\tfunction clickHandler() {\n\t\tvar oldValue = that.state.url\n\t\tvar newValue = oldValue\n\n\t\tfunction setValue(v) {\n\t\t\tthat.state.url = newValue = v\n\t\t\tthat.updated = true\n\t\t\tthat.state_changed()\n\t\t}\n\n\t\tFileSelectControl\n\t\t.createModelSelector('audio', oldValue, function(control) {\n\t\t\tcontrol\t\n\t\t\t.selected(oldValue)\n\t\t\t.onChange(setValue.bind(this))\n\t\t\t.buttons({\n\t\t\t\t'Cancel': setValue.bind(this, oldValue),\n\t\t\t\t'Select': setValue.bind(this)\n\t\t\t})\n\t\t\t.on('closed', function() {\n\t\t\t\tif (newValue === oldValue)\n\t\t\t\t\treturn;\n\t\t\t\n\t\t\t\tthat.undoableSetState('url', newValue, oldValue)\n\n\t\t\t\tE2.track({\n\t\t\t\t\tevent: 'assetChanged',\n\t\t\t\t\tplugin: 'UrlAudio',\n\t\t\t\t\turl: newValue\n\t\t\t\t})\n\t\t\t})\n\t\t\t.modal()\n\t\t})\n\t}\n\n\tinp.click(clickHandler)\n\treturn inp;\n};\n\nUrlAudio.prototype.update_input = function(slot, data)\n{\n\tthis.state.url = data;\n\tthis.state_changed(null);\n};\n\nUrlAudio.prototype.update_state = function()\n{\n\tvar that = this;\n\n\tif(!this.dirty)\n\t\treturn;\n\t\n\tif (typeof(Audio) === 'undefined')\n\t\treturn msg('Audio: This browser does not support the Audio API.');\n\t\n\tif (this.audio)\n\t{\n\t\tthis.audio.pause();\n\t\tdelete this.audio;\n\t}\n\n\tthis.audio = new Audio();\n\n\tthis.audio.loop = true;\n\tthis.audio.preload = true;\n\n\tif (this.state.url)\n\t{\n\t\tthis.audio.addEventListener('error', function()\n\t\t{\n\t\t\tmsg('ERROR: Audio: Failed to load \\'' + that.state.url + '\\'.');\n\t\t\tthat.state.url = '';\n\t\t\tthat.audio = null;\n\t\t});\n\t\n\t\tmsg('Audio: Loading ' + this.state.url + '.');\n\t\tthis.audio.src = this.state.url;\n\t}\n\t\n\tthis.dirty = false;\n};\n\nUrlAudio.prototype.update_output = function(slot)\n{\n\treturn this.audio;\n};\n\nUrlAudio.prototype.state_changed = function(ui)\n{\n\tif (this.state.url) {\n\t\tif(ui)\n\t\t\tui.attr('title', this.state.url);\n\t\telse\n\t\t\tthis.dirty = true;\n\t}\n};\n})();\n"
  },
  {
    "path": "browser/plugins/url_cubemap_generator.plugin.js",
    "content": "(function() {\n\n\tvar UrlCubeMap = E2.plugins.url_cubemap_generator = function(core, node) {\n\t\tPlugin.apply(this, arguments)\n\t\tthis.desc = 'Load a cubemap. JPEG and PNG supported. Click the Browse button to select an existing image from the library.'\n\n\t\tthis.input_slots = []\n\n\t\tthis.output_slots = [\n\t\t\t{\n\t\t\t\tname: 'texture',\n\t\t\t\tdt: core.datatypes.CUBETEXTURE,\n\t\t\t\tdesc: 'The loaded cubemap.'\n\t\t\t}\n\t\t]\n\n\t\tthis.state = { url: '' }\n\n\t\tvar loadTex = E2.core.assetLoader.loadingTexture.image\n\t\tthis.loadingTexture = new THREE.CubeTexture([\n\t\t\tloadTex, loadTex, loadTex, loadTex, loadTex, loadTex\n\t\t])\n\n\t\tvar defTex = E2.core.assetLoader.defaultTexture.image\n\t\tthis.defaultTexture = new THREE.CubeTexture([\n\t\t\tdefTex, defTex, defTex, defTex, defTex, defTex\n\t\t])\n\n\t\tthis.texture = this.loadingTexture\n\n\t\tthis.dirty = false\n\t\tthis.thumbnail = null\n\t}\n\n\tUrlCubeMap.prototype = Object.create(Plugin.prototype)\n\n\tUrlCubeMap.prototype.create_ui = function() {\n\t\tvar container = make('div')\n\t\tvar inp = NodeUI.makeSpriteSVGButton(\n\t\tNodeUI.makeSpriteSVG('vp-edit-icon', 'cmd_edit_graph'),\n\t\t'No texture selected'\n\t\t);\n\t\tinp.addClass('p_round');\n\n\t\tthis.thumbnail = make('div').addClass('p_thumbnail');\n\n\t\tthis.thumbnail.css({\n\t\t\t'background-image': 'url(\\'images/no_texture.png\\')',\n\t\t\t'background-size': 'cover'\n\t\t})\n\n\t\tvar clickHandler = function() {\n\t\t\tvar that = this;\n\t\t\tvar oldValue = that.state.url\n\t\t\tvar newValue = oldValue\n\n\t\t\tvar setValueFn = function(v) {\n\t\t\t\tthat.state.url = newValue = v\n\t\t\t\tthat.updated = true\n\t\t\t\tthat.state_changed();\n\t\t\t\treturn true;\n\t\t\t};\n\n\t\t\tFileSelectControl\n\t\t\t.createStereoCubeMapSelector(oldValue, function(control) {\n\t\t\t\tcontrol\n\t\t\t\t.template('texture')\n\t\t\t\t.selected(oldValue)\n\t\t\t\t.onChange(setValueFn)\n\t\t\t\t.buttons({\n\t\t\t\t\t'Cancel': setValueFn.bind(this, oldValue),\n\t\t\t\t\t'Select': setValueFn\n\t\t\t\t})\n\t\t\t\t.on('closed', function() {\n\t\t\t\t\tif (newValue === oldValue)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tE2.track({\n\t\t\t\t\t\tevent: 'assetChanged',\n\t\t\t\t\t\tplugin: 'UrlCubeMap',\n\t\t\t\t\t\turl: newValue\n\t\t\t\t\t})\n\n\t\t\t\t\tthat.undoableSetState('url', newValue, oldValue)\n\t\t\t\t})\n\t\t\t\t.modal()\n\t\t\t});\n\n\t\t\treturn false;\n\t\t}.bind(this);\n\n\t\tinp.click(clickHandler)\n\t\tthis.thumbnail.click(clickHandler)\n\n\t\tcontainer.append(this.thumbnail)\n\t\tcontainer.append(inp)\n\n\t\tthis.node.on('pluginStateChanged', this.updateUi.bind(this))\n\n\t\treturn container\n\t}\n\n\tUrlCubeMap.prototype.update_input = function() {}\n\n\tUrlCubeMap.prototype.update_state = function() {\n\t\tif (!this.dirty)\n\t\t\treturn\n\n\t\tvar that = this\n\n\t\tthis.waitingToLoad = true\n\n\t\tthis.leftTexture = this.loadingTexture\n\t\tthis.rightTexture = this.loadingTexture\n\n\t\tE2.core.assetLoader\n\t\t.loadAsset('image', this.state.url)\n\t\t.then(function(img) {\n\t\t\tthat.waitingToLoad = false\n\t\t\tthat.makeTexturesFromImage(img)\n\t\t})\n\t\t.catch(function() {\n\t\t\tthat.texture = that.defaultTexture\n\t\t\tthat.texture.needsUpdate = true\n\t\t\tthat.waitingToLoad = false\n\t\t})\n\t\t.finally(function() {\n\t\t\tthat.updated = true\n\t\t})\n\n\t\tthis.dirty = false\n\t}\n\n\tUrlCubeMap.prototype.makeTexturesFromImage = function(img) {\n\t\tvar imageWidth = img.width\n\t\tvar imageHeight = img.height\n\n\t\tvar tiles = 6\n\n\t\tvar tileWidth = imageHeight\n\t\tvar tileHeight = imageHeight\n\n\t\tvar textures = []\n\n\t\tfor (var i = 0; i < tiles; ++i) {\n\t\t\tvar tileCanvas = document.createElement('canvas')\n\t\t\ttileCanvas.width = tileWidth\n\t\t\ttileCanvas.height = tileHeight\n\n\t\t\tvar ctx = tileCanvas.getContext('2d')\n\t\t\tctx.drawImage(img, i * tileWidth, 0,\n\t\t\ttileWidth, tileHeight, 0, 0, tileWidth, tileHeight)\n\n\t\t\ttextures.push(tileCanvas)\n\t\t}\n\n\t\tvar texture = new THREE.CubeTexture(textures)\n\t\ttexture.format = THREE.RGBFormat\n\t\ttexture.needsUpdate = true\n\n\t\tthis.texture = texture\n\n\t\tthis.updated = true\n\t}\n\n\tUrlCubeMap.prototype.update_output = function(slot) {\n\t\tif (this.waitingToLoad &&\n\t\tthis.texture &&\n\t\tthis.texture.image && this.texture.image.width !== 0)\n\t\t{\n\t\t\t// force an extra update through the graph\n\t\t\t// with a texture that has actual image data\n\t\t\tthis.waitingToLoad = false\n\t\t\tthis.updated = true\n\t\t}\n\n\t\treturn this.texture\n\t}\n\n\tUrlCubeMap.prototype.state_changed = function() {\n\t\tif (!this.state.url)\n\t\t\treturn\n\n\t\tthis.updateUi()\n\n\t\tthis.dirty = true\n\t}\n\n\tUrlCubeMap.prototype.updateUi = function() {\n\t\tif (this.thumbnail)\n\t\t\tthis.thumbnail.css({ 'background-image': 'url(\\'' + this.state.url + '\\')' })\n\t}\n\n})()"
  },
  {
    "path": "browser/plugins/url_json_generator.plugin.js",
    "content": "(function() {\n\nvar UrlJson = E2.plugins[\"url_json_generator\"] = function(core, node) {\n\tPlugin.apply(this, arguments)\n\tthis.desc = 'Load JSON as an object from an URL. Hover over the Source button to see the url of the current file.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'url', dt: core.datatypes.TEXT, desc: 'Use this to load from a URL supplied as a string.', def: '' }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'object', dt: core.datatypes.OBJECT, desc: 'The object if one has been selected.' }\n\t];\n\t\n\tthis.state = { url: '' };\n\tthis.core = core;\n\tthis.object = {};\n\tthis.dirty = false;\n}\nUrlJson.prototype = Object.create(Plugin.prototype)\n\nUrlJson.prototype.create_ui = function() {\n\tvar inp = makeButton('Source', 'No JSON selected.', 'url');\n\tvar that = this;\n\n\tfunction clickHandler() {\n\t\tvar oldValue = that.state.url\n\t\tvar newValue = oldValue\n\n\t\tfunction setValue(v) {\n\t\t\tthat.state.url = newValue = v\n\t\t\tthat.updated = true\n\t\t\tthat.state_changed()\n\t\t}\n\n\t\tFileSelectControl\n\t\t.createModelSelector('json', oldValue, function(control) {\n\t\t\tcontrol\n\t\t\t.selected(oldValue)\n\t\t\t.onChange(setValue.bind(this))\n\t\t\t.buttons({\n\t\t\t\t'Cancel': setValue.bind(this, oldValue),\n\t\t\t\t'Select': setValue.bind(this)\n\t\t\t})\n\t\t\t.on('closed', function() {\n\t\t\t\tif (newValue === oldValue)\n\t\t\t\t\treturn;\n\t\t\t\n\t\t\t\tthat.undoableSetState('url', newValue, oldValue)\n\t\t\t})\n\t\t\t.modal()\n\t\t})\n\t}\n\n\tinp.click(clickHandler)\n\n\treturn inp;\n}\n\nUrlJson.prototype.update_input = function(slot, data) {\n\tif (this.state.url === data)\n\t\treturn;\n\tthis.state.url = data\n\tthis.state_changed()\n}\n\nUrlJson.prototype.update_state = function() {\n\tif(!this.dirty)\n\t\treturn;\n\t\n\tvar self = this;\n\n\tthis.object = {};\n\n\t$.ajax({\n\t\turl: this.state.url, \n\t\tdataType: 'json',\n\t\tsuccess: function(self) { return function(data) \n\t\t{\n\t\t\tself.object = data;\n\t\t\tself.updated = true\n\t\t}}(self),\n\t\terror: function(self) { return function(jqXHR, textStatus, errorThrown)\n\t\t{\n\t\t\tmsg('ERROR: Failed to load JSON \"' + self.state.url + '\": ' + textStatus + ', ' + errorThrown);\n\t\t\tself.state.url = '';\n\t\t\tself.object = {}\n\t\t}}(self)\n\t});\n\t\n\tthis.dirty = false;\n}\n\nUrlJson.prototype.update_output = function(slot) {\n\treturn this.object;\n}\n\nUrlJson.prototype.state_changed = function(ui) {\n\tif (this.state.url !== '') {\n\t\tif (ui)\n\t\t\tui.attr('title', this.state.url)\n\n\t\tthis.dirty = true\n\t} else {\n\t\tthis.object = {}\n\t}\n}\n\n})()\n"
  },
  {
    "path": "browser/plugins/url_stereo_cubemap_generator.plugin.js",
    "content": "(function() {\n\n\tvar UrlStereoCubeMap = E2.plugins.url_stereo_cubemap_generator = function(core, node) {\n\t\tPlugin.apply(this, arguments)\n\t\tthis.desc = 'Load a stereo cubemap. JPEG and PNG supported. Click the Browse button to select an existing image from the library.'\n\t\t\n\t\tthis.input_slots = []\n\n\t\tthis.output_slots = [\n\t\t\t{\n\t\t\t\tname: 'left',\n\t\t\t\tdt: core.datatypes.CUBETEXTURE,\n\t\t\t\tdesc: 'The left side of the loaded stereo cubemap.'\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'right',\n\t\t\t\tdt: core.datatypes.CUBETEXTURE,\n\t\t\t\tdesc: 'The right side of the loaded stereo cubemap.'\n\t\t\t}\n\t\t]\n\t\t\n\t\tthis.state = { url: '' }\n\n\t\tvar loadTex = E2.core.assetLoader.loadingTexture.image\n\t\tthis.loadingTexture = new THREE.CubeTexture([\n\t\t\tloadTex, loadTex, loadTex, loadTex, loadTex, loadTex\n\t\t])\n\n\t\tvar defTex = E2.core.assetLoader.defaultTexture.image\n\t\tthis.defaultTexture = new THREE.CubeTexture([\n\t\t\tdefTex, defTex, defTex, defTex, defTex, defTex\n\t\t])\n\n\t\tthis.leftTexture = this.loadingTexture\n\t\tthis.rightTexture = this.loadingTexture\n\n\t\tthis.dirty = false\n\t\tthis.thumbnail = null\n\t}\n\n\tUrlStereoCubeMap.prototype = Object.create(Plugin.prototype)\n\n\tUrlStereoCubeMap.prototype.create_ui = function() {\n\t\tvar container = make('div')\n\t\tvar inp = NodeUI.makeSpriteSVGButton(\n\t\t\tNodeUI.makeSpriteSVG('vp-edit-icon', 'cmd_edit_graph'),\n\t\t\t'No texture selected'\n\t\t);\n\t\tinp.addClass('p_round');\n\n\t\tthis.thumbnail = make('div').addClass('p_thumbnail');\n\t\t\n\t\tthis.thumbnail.css({\n\t\t\t'background-image': 'url(\\'images/no_texture.png\\')',\n\t\t\t'background-size': 'cover'\n\t\t})\n\n\t\tvar clickHandler = function() {\n\t\t\tvar that = this;\n\t\t\tvar oldValue = that.state.url\n\t\t\tvar newValue = oldValue\n\n\t\t\tvar setValueFn = function(v) {\n\t\t\t\tthat.state.url = newValue = v\n\t\t\t\tthat.updated = true\n\t\t\t\tthat.state_changed();\n\t\t\t\treturn true;\n\t\t\t};\n\n\t\t\tFileSelectControl\n\t\t\t.createStereoCubeMapSelector(oldValue, function(control) {\n\t\t\t\tcontrol\n\t\t\t\t\t.template('texture')\n\t\t\t\t\t.selected(oldValue)\n\t\t\t\t\t.onChange(setValueFn)\n\t\t\t\t\t.buttons({\n\t\t\t\t\t\t'Cancel': setValueFn.bind(this, oldValue),\n\t\t\t\t\t\t'Select': setValueFn\n\t\t\t\t\t})\n\t\t\t\t\t.on('closed', function() {\n\t\t\t\t\t\tif (newValue === oldValue)\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\tE2.track({\n\t\t\t\t\t\t\tevent: 'assetChanged',\n\t\t\t\t\t\t\tplugin: 'UrlStereoCubeMap',\n\t\t\t\t\t\t\turl: newValue\n\t\t\t\t\t\t})\n\t\t\t\t\t\t\n\t\t\t\t\t\tthat.undoableSetState('url', newValue, oldValue)\n\t\t\t\t\t})\n\t\t\t\t\t.modal()\n\t\t\t});\n\n\t\t\treturn false;\n\t\t}.bind(this);\n\n\t\tinp.click(clickHandler)\n\t\tthis.thumbnail.click(clickHandler)\n\t\t\n\t\tcontainer.append(this.thumbnail)\n\t\tcontainer.append(inp)\n\n\t\tthis.node.on('pluginStateChanged', this.updateUi.bind(this))\n\n\t\treturn container\n\t}\n\n\tUrlStereoCubeMap.prototype.update_input = function() {}\n\n\tUrlStereoCubeMap.prototype.update_state = function() {\n\t\tif (!this.dirty)\n\t\t\treturn\n\n\t\tvar that = this\n\n\t\tthis.waitingToLoad = true\n\n\t\tthis.leftTexture = this.loadingTexture\n\t\tthis.rightTexture = this.loadingTexture\n\n\t\tE2.core.assetLoader\n\t\t.loadAsset('image', this.state.url)\n\t\t.then(function(img) {\n\t\t\tthat.waitingToLoad = false\n\t\t\tthat.makeTexturesFromImage(img)\n\t\t})\n\t\t.catch(function() {\n\t\t\tthat.leftTexture = that.defaultTexture\n\t\t\tthat.rightTexture = that.defaultTexture\n\t\t\tthis.leftTexture.needsUpdate = true\n\t\t\tthis.rightTexture.needsUpdate = true\n\t\t\tthat.waitingToLoad = false\n\t\t})\n\t\t.finally(function() {\n\t\t\tthat.updated = true\n\t\t})\n\t\t\n\t\tthis.dirty = false\n\t}\n\n\tUrlStereoCubeMap.prototype.makeTexturesFromImage = function(img) {\n\t\tvar imageWidth = img.width\n\t\tvar imageHeight = img.height\n\n\t\tvar tiles = imageWidth / imageHeight\n\n\t\tvar tileWidth = imageWidth / tiles\n\t\tvar tileHeight = imageHeight\n\n\t\tvar textures = []\n\n\t\tif (VizorUI.isMobile.Android()) {\n\t\t\t// work around a problem on android (only) where drawing directly from an\n\t\t\t// img would create corrupted images\n\t\t\tvar intermediateCanvas = document.createElement('canvas')\n\t\t\tintermediateCanvas.width = img.width\n\t\t\tintermediateCanvas.height = img.height\n\t\t\tintermediateCanvas.getContext('2d').drawImage(img, 0, 0, imageWidth, imageHeight, 0, 0, imageWidth, imageHeight)\n\n\t\t\tfor (var i = 0; i < tiles; ++i) {\n\t\t\t\tvar tileCanvas = document.createElement('canvas')\n\t\t\t\ttileCanvas.width = tileWidth\n\t\t\t\ttileCanvas.height = tileHeight\n\n\t\t\t\tvar ctx = tileCanvas.getContext('2d')\n\t\t\t\tctx.drawImage(intermediateCanvas, i * tileWidth, 0,\n\t\t\t\t\ttileWidth, tileHeight, 0, 0, tileWidth, tileHeight)\n\n\t\t\t\ttextures.push(tileCanvas)\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tfor (var i = 0; i < tiles; ++i) {\n\t\t\t\tvar tileCanvas = document.createElement('canvas')\n\t\t\t\ttileCanvas.width = tileWidth\n\t\t\t\ttileCanvas.height = tileHeight\n\n\t\t\t\tvar ctx = tileCanvas.getContext('2d')\n\t\t\t\tctx.drawImage(img, i * tileWidth, 0,\n\t\t\t\t\ttileWidth, tileHeight, 0, 0, tileWidth, tileHeight)\n\n\t\t\t\ttextures.push(tileCanvas)\n\t\t\t}\n\t\t}\n\n\t\tvar leftTextures = textures.splice(0, 6)\n\t\tvar rightTextures = textures.length >= 6 ? textures.splice(0, 6) : leftTextures\n\n\t\t// left eye\n\t\tvar leftTexture = new THREE.CubeTexture(leftTextures)\n\t\tleftTexture.format = THREE.RGBFormat\n\t\tleftTexture.needsUpdate = true\n\n\t\t// right eye\n\t\tvar rightTexture = new THREE.CubeTexture(rightTextures)\n\t\trightTexture.format = THREE.RGBFormat\n\t\trightTexture.needsUpdate = true\n\n\t\tthis.leftTexture = leftTexture\n\t\tthis.rightTexture = rightTexture\n\n\t\tthis.updated = true\n\t}\n\n\tUrlStereoCubeMap.prototype.update_output = function(slot) {\n\t\tif (this.waitingToLoad &&\n\t\t\tthis.leftTexture && this.rightTexture &&\n\t\t\tthis.leftTexture.image && this.leftTexture.image.width !== 0 &&\n\t\t\tthis.rightTexture.image && this.rightTexture.image.width !== 0)\n\t\t{\n\t\t\t// force an extra update through the graph\n\t\t\t// with a texture that has actual image data\n\t\t\tthis.waitingToLoad = false\n\t\t\tthis.updated = true\n\t\t}\n\n\t\treturn slot.index === 0 ? this.leftTexture : this.rightTexture\n\t}\n\n\tUrlStereoCubeMap.prototype.state_changed = function() {\n\t\tif (!this.state.url)\n\t\t\treturn\n\n\t\tthis.updateUi()\n\n\t\tthis.dirty = true\n\t}\n\n\tUrlStereoCubeMap.prototype.updateUi = function() {\n\t\tif (this.thumbnail)\n\t\t\tthis.thumbnail.css({ 'background-image': 'url(\\'' + this.state.url + '\\')' })\n\t}\n\n})()"
  },
  {
    "path": "browser/plugins/url_stereo_latlongmap_generator.plugin.js",
    "content": "(function() {\n\n\tvar UrlStereoLatLongMap = E2.plugins.url_stereo_latlongmap_generator = function(core, node) {\n\t\tPlugin.apply(this, arguments)\n\t\tthis.desc = 'Load a stereo latlong map from a URL. JPEG and PNG supported. Hover over the Browse button to select an existing image from the library.'\n\n\t\tthis.input_slots = []\n\n\t\tthis.output_slots = [\n\t\t\t{\n\t\t\t\tname: 'left',\n\t\t\t\tdt: core.datatypes.TEXTURE,\n\t\t\t\tdesc: 'The left side of the loaded lat long map.'\n\t\t\t},\n\t\t\t{\n\t\t\t\tname: 'right',\n\t\t\t\tdt: core.datatypes.TEXTURE,\n\t\t\t\tdesc: 'The right side of the loaded lat long map.'\n\t\t\t}\n\t\t]\n\n\t\tthis.state = { url: '' }\n\n\t\tthis.loadingTexture = E2.core.assetLoader.loadingTexture\n\n\t\tthis.leftTexture = this.loadingTexture\n\t\tthis.rightTexture = this.loadingTexture\n\n\t\tthis.dirty = false\n\t\tthis.thumbnail = null\n\t}\n\n\tUrlStereoLatLongMap.prototype = Object.create(Plugin.prototype)\n\n\tUrlStereoLatLongMap.prototype.create_ui = function() {\n\t\tvar container = make('div')\n\t\tvar inp = NodeUI.makeSpriteSVGButton(\n\t\tNodeUI.makeSpriteSVG('vp-edit-icon', 'cmd_edit_graph'),\n\t\t'No texture selected'\n\t\t);\n\t\tinp.addClass('p_round');\n\n\t\tthis.thumbnail = make('div').addClass('p_thumbnail');\n\n\t\tthis.thumbnail.css({\n\t\t\t'background-image': 'url(\\'images/no_texture.png\\')',\n\t\t\t'background-size': 'cover'\n\t\t})\n\n\t\tvar clickHandler = function() {\n\t\t\tvar that = this;\n\t\t\tvar oldValue = that.state.url\n\t\t\tvar newValue = oldValue\n\n\t\t\tvar setValueFn = function(v) {\n\t\t\t\tthat.state.url = newValue = v\n\t\t\t\tthat.updated = true\n\t\t\t\tthat.state_changed();\n\t\t\t\treturn true;\n\t\t\t};\n\n\t\t\tFileSelectControl\n\t\t\t.createTextureSelector(oldValue, function(control) {\n\t\t\t\tcontrol\n\t\t\t\t.template('texture')\n\t\t\t\t.selected(oldValue)\n\t\t\t\t.onChange(setValueFn)\n\t\t\t\t.buttons({\n\t\t\t\t\t'Cancel': setValueFn.bind(this, oldValue),\n\t\t\t\t\t'Select': setValueFn\n\t\t\t\t})\n\t\t\t\t.on('closed', function() {\n\t\t\t\t\tif (newValue === oldValue)\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\tE2.track({\n\t\t\t\t\t\tevent: 'assetChanged',\n\t\t\t\t\t\tplugin: 'UrlStereoLatLongMap',\n\t\t\t\t\t\turl: newValue\n\t\t\t\t\t})\n\n\t\t\t\t\tthat.undoableSetState('url', newValue, oldValue)\n\t\t\t\t})\n\t\t\t\t.modal()\n\t\t\t});\n\n\t\t\treturn false;\n\t\t}.bind(this);\n\n\t\tinp.click(clickHandler)\n\t\tthis.thumbnail.click(clickHandler)\n\n\t\tcontainer.append(this.thumbnail)\n\t\tcontainer.append(inp)\n\n\t\tthis.node.on('pluginStateChanged', this.updateUi.bind(this))\n\n\t\treturn container\n\t}\n\n\tUrlStereoLatLongMap.prototype.update_input = function() {}\n\n\tUrlStereoLatLongMap.prototype.update_state = function() {\n\t\tif (!this.dirty)\n\t\t\treturn\n\n\t\tvar that = this\n\n\t\tthis.waitingToLoad = true\n\n\t\tthis.leftTexture = this.loadingTexture\n\t\tthis.rightTexture = this.loadingTexture\n\n\t\tE2.core.assetLoader\n\t\t.loadAsset('image', this.state.url)\n\t\t.then(function(img) {\n\t\t\tthat.makeTexturesFromImage(img)\n\t\t})\n\t\t.catch(function() {\n\t\t\tthat.leftTexture = that.defaultTexture\n\t\t\tthat.rightTexture = that.defaultTexture\n\t\t\tthat.waitingToLoad = false\n\t\t\tthat.updated = true\n\t\t})\n\n\t\tthis.dirty = false\n\t}\n\n\tUrlStereoLatLongMap.prototype.makeTexturesFromImage = function(img) {\n\t\tvar imageWidth = img.width\n\t\tvar imageHeight = img.height\n\n\t\tvar tiles = 2\n\n\t\tvar tileWidth = imageWidth\n\t\tvar tileHeight = imageHeight / 2\n\n\t\tvar textures = []\n\n\t\tfor (var i = 0; i < tiles; ++i) {\n\t\t\tvar tileCanvas = document.createElement('canvas')\n\t\t\ttileCanvas.width = tileWidth\n\t\t\ttileCanvas.height = tileHeight\n\n\t\t\tvar ctx = tileCanvas.getContext('2d')\n\t\t\tctx.drawImage(img, 0, i * tileHeight,\n\t\t\ttileWidth, tileHeight, 0, 0, tileWidth, tileHeight)\n\n\t\t\ttextures.push(tileCanvas)\n\t\t}\n\n\t\t// left eye\n\t\tthis.leftTexture = new THREE.Texture(textures[0])\n\t\tthis.leftTexture.needsUpdate = true\n\t\t\n\t\t// right eye\n\t\tthis.rightTexture = new THREE.Texture(textures[1])\n\t\tthis.rightTexture.needsUpdate = true\n\n\t\tthis.updated = true\n\t}\n\n\tUrlStereoLatLongMap.prototype.update_output = function(slot) {\n\t\tif (this.waitingToLoad &&\n\t\tthis.leftTexture && this.rightTexture &&\n\t\tthis.leftTexture.image && this.leftTexture.image.width !== 0 &&\n\t\tthis.rightTexture.image && this.rightTexture.image.width !== 0)\n\t\t{\n\t\t\t// force an extra update through the graph\n\t\t\t// with a texture that has actual image data\n\t\t\tthis.waitingToLoad = false\n\t\t\tthis.updated = true\n\t\t}\n\n\t\treturn slot.index === 0 ? this.leftTexture : this.rightTexture\n\t}\n\n\tUrlStereoLatLongMap.prototype.state_changed = function() {\n\t\tif (!this.state.url)\n\t\t\treturn\n\n\t\tthis.updateUi()\n\n\t\tthis.dirty = true\n\t}\n\n\tUrlStereoLatLongMap.prototype.updateUi = function() {\n\t\tif (this.thumbnail)\n\t\t\tthis.thumbnail.css({ 'background-image': 'url(\\'' + this.state.url + '\\')' })\n\t}\n\n})()"
  },
  {
    "path": "browser/plugins/url_texture_generator.plugin.js",
    "content": "(function() {\n\n\tvar UrlTexture = E2.plugins.url_texture_generator = function(core, node) {\n\t\tPlugin.apply(this, arguments)\n\t\tthis.desc = 'Load a texture from a URL. JPEG and PNG supported. Hover over the Browse button to select an existing image from the library.'\n\n\t\tthis.input_slots = []\n\n\t\tthis.output_slots = [\n\t\t\t{ name: 'texture', dt: core.datatypes.TEXTURE, desc: 'The loaded texture.' }\n\t\t]\n\n\t\tthis.state = { url: '', urllow: null }\n\t\tthis.texture = E2.core.assetLoader.defaultTexture\n\t\tthis.dirty = true\n\t\tthis.thumbnail = null\n\t}\n\n\tUrlTexture.prototype = Object.create(Plugin.prototype)\n\n\tUrlTexture.prototype.create_ui = function() {\n\t\tvar container = make('div')\n\t\tvar inp = NodeUI.makeSpriteSVGButton(\n\t\t\tNodeUI.makeSpriteSVG('vp-edit-icon', 'cmd_edit_graph'),\n\t\t\t'No texture selected'\n\t\t);\n\t\tinp.addClass('p_round');\n\n\t\tvar that = this\n\n\t\tthis.thumbnail = make('div').addClass('p_thumbnail');\n\n\t\tthis.thumbnail.css({\n\t\t\t'background-image': 'url(\\'images/no_texture.png\\')',\n\t\t\t'background-size': 'cover'\n\t\t})\n\n\t\tvar clickHandler = function() {\n\t\t\tvar that = this;\n\t\t\tvar oldValue = that.state.url\n\t\t\tvar newValue = oldValue\n\n\t\t\tvar setValueFn = function(v) {\n\t\t\t\tthat.state.url = newValue = v\n\t\t\t\tthat.updated = true\n\t\t\t\tthat.state_changed();\n\t\t\t\treturn true;\n\t\t\t};\n\n\t\t\tFileSelectControl\n\t\t\t.createTextureSelector(oldValue, function(control) {\n\t\t\t\tcontrol\n\t\t\t\t\t.template('texture')\n\t\t\t\t\t.selected(oldValue)\n\t\t\t\t\t.onChange(setValueFn)\n\t\t\t\t\t.buttons({\n\t\t\t\t\t\t'Cancel': setValueFn.bind(this, oldValue),\n\t\t\t\t\t\t'Select': setValueFn\n\t\t\t\t\t})\n\t\t\t\t\t.on('closed', function() {\n\t\t\t\t\t\tif (newValue === oldValue)\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\tE2.track({\n\t\t\t\t\t\t\tevent: 'assetChanged',\n\t\t\t\t\t\t\tplugin: 'UrlTexture',\n\t\t\t\t\t\t\turl: newValue\n\t\t\t\t\t\t})\n\n\t\t\t\t\t\tthat.undoableSetState('url', newValue, oldValue)\n\n\t\t\t\t\t\tthat.dirty = true\n\t\t\t\t\t})\n\t\t\t\t\t.modal()\n\t\t\t});\n\n\t\t\treturn false;\n\t\t}.bind(this);\n\n\t\tinp.click(clickHandler)\n\t\tthis.thumbnail.click(clickHandler)\n\n\t\tcontainer.append(this.thumbnail)\n\t\tcontainer.append(inp)\n\n\t\tthis.node.on('pluginStateChanged', this.updateUi.bind(this))\n\n\t\treturn container\n\t}\n\n\tUrlTexture.prototype.update_input = function() {}\n\n\tUrlTexture.prototype.update_state = function() {\n\t\tif (!this.dirty)\n\t\t\treturn\n\n\t\tif (this.state.url !== '') {\n\t\t\tthis.loadTexture()\n\t\t}\n\t\telse {\n\t\t\tthis.texture = E2.core.assetLoader.defaultTexture\n\t\t}\n\n\t\tthis.dirty = false\n\t}\n\n\tUrlTexture.prototype.loadTexture = function() {\n\t\tvar that = this\n\t\tthis.waitingToLoad = true\n\n\t\tvar urlToLoad = this.state.url\n\n\t\tif (E2.util.isMobile && E2.util.isMobile.iOS() && this.state.urllow) {\n\t\t\turlToLoad = this.state.urllow\n\t\t}\n\n\t\tE2.core.assetLoader\n\t\t.loadAsset('texture', urlToLoad)\n\t\t.then(function(texture) {\n\t\t\tthat.texture = texture\n\t\t\tthat.waitingToLoad = false\n\t\t\tthat.updated = true\n\t\t})\n\t\t.catch(function() {\n\t\t\tthat.texture = E2.core.assetLoader.defaultTexture\n\t\t\tthat.waitingToLoad = false\n\t\t\tthat.updated = true\n\t\t})\n\t}\n\n\tUrlTexture.prototype.update_output = function() {\n\t\tif (this.waitingToLoad && this.texture && this.texture.image && this.texture.image.width !== 0) {\n\t\t\t// force an extra update through the graph with a texture that has\n\t\t\t// actual image data\n\t\t\tthis.waitingToLoad = false\n\t\t\tthis.updated = true\n\t\t}\n\n\t\treturn this.texture\n\t}\n\n\tUrlTexture.prototype.state_changed = function(ui) {\n\t\tif (!this.state.url)\n\t\t\treturn\n\n\t\tvar that = this\n\n\t\tif (!ui)\n\t\t\tthis.loadTexture()\n\n\t\tthis.updateUi()\n\t}\n\n\tUrlTexture.prototype.updateUi = function() {\n\t\tif (this.thumbnail)\n\t\t\tthis.thumbnail.css({ 'background-image': 'url(\\'' + this.state.url + '\\')' })\n\t}\n\n})()\n"
  },
  {
    "path": "browser/plugins/url_video_generator.plugin.js",
    "content": "(function() {\n\nvar UrlVideo = E2.plugins.url_video_generator = function UrlVideo(core, node) {\n\tPlugin.apply(this, arguments)\n\n\tthis.desc = 'Load an Ogg/Theora video.'\n\t\n\tthis.input_slots = [\n\t]\n\t\n\tthis.output_slots = [ \n\t\t{ name: 'video', dt: core.datatypes.VIDEO, desc: 'A video stream.' }\n\t]\n\t\n\tthis.state = { url: '' }\n\tthis.gl = core.renderer.context\n\tthis.core = core\n\tthis.URL_VIDEO_ROOT = 'data/video/'\n\tthis.video = null\n\tthis.dirty = false\n}\n\nUrlVideo.prototype = Object.create(Plugin.prototype)\n\nUrlVideo.prototype.reset = function() {}\n\nUrlVideo.prototype.play = function() {\n\tif (this.video)\n\t\tthis.video.play()\n}\n\nUrlVideo.prototype.create_ui = function() {\n\tvar inp = makeButton('Source', 'No video selected.', 'url')\n\tvar that = this\n\n\tfunction clickHandler() {\n\t\tvar oldValue = that.state.url\n\t\tvar newValue = oldValue\n\n\t\tfunction setValue(v) {\n\t\t\tthat.state.url = newValue = v\n\t\t\tthat.updated = true\n\t\t\tthat.state_changed()\n\t\t}\n\n\t\tFileSelectControl\n\t\t.createModelSelector('video', oldValue, function(control) {\n\t\t\tcontrol\n\t\t\t.selected(oldValue)\n\t\t\t.onChange(setValue.bind(this))\n\t\t\t.buttons({\n\t\t\t\t'Cancel': setValue.bind(this, oldValue),\n\t\t\t\t'Select': setValue.bind(this)\n\t\t\t})\n\t\t\t.on('closed', function() {\n\t\t\t\tif (newValue === oldValue)\n\t\t\t\t\treturn\n\t\t\t\n\t\t\t\tthat.undoableSetState('url', newValue, oldValue)\n\t\t\n\t\t\t\tthat.dirty = true\n\t\t\t})\n\t\t\t.modal()\n\t\t})\n\t}\n\n\tinp.click(clickHandler)\n\n\treturn inp\n}\n\nUrlVideo.prototype.update_state = function() {\n\tif (!this.dirty)\n\t\treturn\n\n\tif (this.state.url)\n\t\treturn this.loadVideo()\n}\n\nUrlVideo.prototype.update_output = function() {\n\treturn this.video\n}\n\nUrlVideo.prototype.state_changed = function(ui) {\n\tif (!this.state.url)\n\t\treturn\n\n\tif (ui)\n\t\treturn ui.attr('title', this.state.url)\n\n\tthis.loadVideo()\n}\n\nUrlVideo.prototype.loadVideo = function() {\n\tvar that = this\n\tif (this.video) {\n\t\tthis.video.pause()\n\t\tdelete this.video\n\t}\n\n\tthis.waitingToLoad = true\n\n\tE2.core.assetLoader\n\t.loadAsset('video', this.state.url)\n\t.then(function(video) {\n\t\tthat.video = video\n\t\tthat.waitingToLoad = false\n\t\tthat.updated = true\n\t})\n\t.catch(function() {\n\t\tthat.video = E2.core.assetLoader.defaultVideo\n\t\tthat.waitingToLoad = false\n\t\tthat.updated = true\n\t})\n\n\tthis.dirty = false\n}\n\n})()\n"
  },
  {
    "path": "browser/plugins/variable_local_read.plugin.js",
    "content": "(function() {\nvar VariableLocalRead = E2.plugins.variable_local_read = function(core, node) {\n\tthis.desc = 'Read from a local variable using the name of the node.'\n\t\n\tthis.input_slots = []\n\tthis.output_slots = []\n\t\n\tthis.core = core\n\tthis.node = node\n\tthis.data = null\n\t\n\tif (!node.title)\n\t\tthis.old_title = node.title = 'Variable ' + (node.parent_graph.variables.count() + 1)\n\telse\n\t\tthis.old_title = node.title\n}\n\nVariableLocalRead.prototype.reset = function() {\n\tthis.updated = true\n}\n\nVariableLocalRead.prototype.destroy = function() {\n\tthis.variables.unlock(this, this.node.title)\n}\n\nVariableLocalRead.prototype.renamed = function() {\n\tthis.variables.unlock(this, this.old_title)\n\tthis.target_reg(this.node.title)\n}\n\nVariableLocalRead.prototype.variable_dt_changed = function(dt, arrayness) {\n\tthis.dt = dt\n\tthis.node.change_slot_datatype(E2.slot_type.output, this.slotId, dt, arrayness)\n}\n\nVariableLocalRead.prototype.variable_updated = function(value) {\n\tthis.updated = true\n\tthis.node.queued_update = 1 // Update next frame too...\n\tthis.data = value\n}\n\nVariableLocalRead.prototype.connection_changed = function(on, conn) {\n\tthis.variables.connection_changed(this.node.title, on)\n\t\n\tif (this.dt.id === E2.dt.ANY.id)\n\t\tthis.variables.set_datatype(this.node.title, conn.dst_slot.dt, conn.dst_slot.array)\n}\n\nVariableLocalRead.prototype.update_output = function() {\n\treturn this.data\n}\n\nVariableLocalRead.prototype.target_reg = function(id) {\n\tthis.variables.lock(this, id, this.node.outputs.length)\n\t\n\tvar r = this.variables.variables[id]\n\n\tthis.dt = r.dt\n\n\tif (r.dt.id !== E2.dt.ANY.id) {\n\t\tthis.variable_dt_changed(r.dt, r.array)\n\t\tthis.data = this.variables.variables[id].value\n\t}\n}\n\nVariableLocalRead.prototype.state_changed = function(ui) {\n\tif (!ui) {\n\t\tvar outputs = this.node.getDynamicOutputSlots()\n\t\tthis.variables = this.node.parent_graph.variables\n\n\t\tif (!outputs.length) {\n\t\t\tthis.node.add_slot(E2.slot_type.output, {\n\t\t\t\tname: 'value',\n\t\t\t\tdt: this.core.datatypes.ANY,\n\t\t\t\tdesc: ''\n\t\t\t})\n\t\n\t\t\toutputs = this.node.getDynamicOutputSlots()\n\t\t}\n\n\t\tthis.dt = outputs[0].dt\n\t\tthis.slotId = outputs[0].uid\n\t\tthis.target_reg(this.node.title)\n\t\n\t\tif (this.dt.id !== E2.dt.ANY.id)\n\t\t\tthis.variables.set_datatype(this.node.title, this.dt, outputs[0].array)\n\t}\n}\n\n})()"
  },
  {
    "path": "browser/plugins/variable_local_write.plugin.js",
    "content": "(function(){\nvar VariableLocalWrite = E2.plugins.variable_local_write = function(core, node) {\n\tthis.desc = 'Write to a local variable using name of the node.'\n\t\n\tthis.input_slots = []\n\tthis.output_slots = []\n\t\n\tthis.core = core\n\tthis.node = node\n\t\n\tif(!node.title)\n\t\tthis.old_title = node.title = 'Variable ' + (node.parent_graph.variables.count() + 1)\n\telse\n\t\tthis.old_title = node.title\n}\n\nVariableLocalWrite.prototype.reset = function() {\n\tthis.updated = true\n}\n\nVariableLocalWrite.prototype.destroy = function() {\n\tthis.variables.unlock(this, this.node.title)\n}\n\nVariableLocalWrite.prototype.variable_dt_changed = function(dt, arrayness) {\n\tthis.node.change_slot_datatype(E2.slot_type.input, this.slotId, dt, arrayness)\n}\n\nVariableLocalWrite.prototype.renamed = function() {\n\tthis.variables.unlock(this, this.old_title)\n\tthis.target_reg(this.node.title)\n}\n\nVariableLocalWrite.prototype.connection_changed = function(on, conn) {\n\tthis.variables.connection_changed(this.node.title, on)\n\n\tif (this.dt.id === E2.dt.ANY.id)\n\t\tthis.variables.set_datatype(this.node.title, conn.src_slot.dt, conn.src_slot.array)\n}\n\nVariableLocalWrite.prototype.update_input = function(slot, data) {\n\tthis.variables.write(this.node.title, data)\n}\n\nVariableLocalWrite.prototype.target_reg = function(id) {\n\tvar dslot = this.node.find_dynamic_slot(E2.slot_type.input, this.slotId)\n\t\n\tthis.variables.lock(this, id, this.node.inputs.length)\n\n\tvar r = this.variables.variables[id]\n\t\n\tif (r.dt.id !== this.core.datatypes.ANY.id)\n\t\tthis.variable_dt_changed(dslot.dt, r.array)\n}\n\nVariableLocalWrite.prototype.state_changed = function(ui) {\n\tif (!ui) {\n\t\tvar inputs = this.node.getDynamicInputSlots()\n\t\tthis.variables = this.node.parent_graph.variables\n\n\t\tif (!inputs.length) {\n\t\t\tthis.node.add_slot(E2.slot_type.input, {\n\t\t\t\tname: 'value',\n\t\t\t\tdt: this.core.datatypes.ANY,\n\t\t\t\tdesc: ''\n\t\t\t})\n\n\t\t\tinputs = this.node.getDynamicInputSlots()\n\t\t}\n\n\t\tthis.dt = inputs[0].dt\n\t\tthis.slotId = inputs[0].uid\n\t\tthis.target_reg(this.node.title)\n\n\t\tif (this.dt.id !== E2.dt.ANY.id)\n\t\t\tthis.variables.set_datatype(this.node.title, this.dt, inputs[0].array)\n\t}\n}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/variable_local_write_conditional.plugin.js",
    "content": "(function(){\nvar VariableLocalWriteConditional = E2.plugins.variable_local_write_conditional = function(core, node) {\n\tthis.desc = 'Write to a local variable using name of the node, if the trigger is true.'\n\t\n\tthis.input_slots = [{\n\t\tname: 'trigger',\n\t\tdt: E2.dt.BOOL,\n\t\tdesc: 'If the trigger is true, will write to the variable. Defaults to false.',\n\t\tdef: false\n\t}]\n\n\tthis.output_slots = []\n\n\tthis.trigger = false\n\t\n\tthis.core = core\n\tthis.node = node\n\tthis.value = null\n\t\n\tif (!node.title)\n\t\tthis.old_title = node.title = 'Variable ' + (node.parent_graph.variables.count() + 1)\n\telse\n\t\tthis.old_title = node.title\n}\n\nVariableLocalWriteConditional.prototype.reset = function() {\n\tthis.updated = true\n\tthis.trigger = false\n\tthis.value = null\n}\n\nVariableLocalWriteConditional.prototype.destroy = function() {\n\tthis.variables.unlock(this, this.node.title)\n}\n\nVariableLocalWriteConditional.prototype.variable_dt_changed = function(dt, arrayness) {\n\tthis.node.change_slot_datatype(E2.slot_type.input, this.slotId, dt, arrayness)\n}\n\nVariableLocalWriteConditional.prototype.renamed = function() {\n\tthis.variables.unlock(this, this.old_title)\n\tthis.target_reg(this.node.title)\n}\n\nVariableLocalWriteConditional.prototype.connection_changed = function(on, conn) {\n\tif (conn.dst_slot.name === 'trigger') {\n\t\treturn;\n\t}\n\n\tthis.variables.connection_changed(this.node.title, on)\n\n\tif (this.dt.id === E2.dt.ANY.id)\n\t\tthis.variables.set_datatype(this.node.title, conn.src_slot.dt, conn.src_slot.array)\n}\n\nVariableLocalWriteConditional.prototype.update_input = function(slot, data) {\n\tif (slot.name === 'trigger')\n\t\tthis.trigger = data\n\telse\n\t\tthis.value = data\n\n\tif (this.trigger && this.value !== null)\n\t\tthis.variables.write(this.node.title, this.value)\n}\n\nVariableLocalWriteConditional.prototype.target_reg = function(id) {\n\tvar dslot = this.node.find_dynamic_slot(E2.slot_type.input, this.slotId)\n\t\n\tthis.variables.lock(this, id, this.node.getSlotConnections(dslot).length)\n\n\tvar r = this.variables.variables[id]\n\t\n\tif (r.dt.id !== this.core.datatypes.ANY.id)\n\t\tthis.variable_dt_changed(dslot.dt, r.array)\n}\n\nVariableLocalWriteConditional.prototype.state_changed = function(ui) {\n\tif (!ui) {\n\t\tvar inputs = this.node.getDynamicInputSlots()\n\t\tthis.variables = this.node.parent_graph.variables\n\n\t\tif (!inputs.length) {\n\t\t\tthis.node.add_slot(E2.slot_type.input, {\n\t\t\t\tname: 'value',\n\t\t\t\tdt: this.core.datatypes.ANY,\n\t\t\t\tdesc: ''\n\t\t\t})\n\n\t\t\tinputs = this.node.getDynamicInputSlots()\n\t\t}\n\n\t\tthis.dt = inputs[0].dt\n\t\tthis.slotId = inputs[0].uid\n\t\tthis.target_reg(this.node.title)\n\n\t\tif (this.dt.id !== E2.dt.ANY.id)\n\t\t\tthis.variables.set_datatype(this.node.title, this.dt, inputs[0].array)\n\t}\n}\n\n})()\n\n"
  },
  {
    "path": "browser/plugins/vector.plugin.js",
    "content": "(function(){\n\t\n\tvar VectorPlugin = E2.plugins.vector = function(core) {\n\t\tthis.desc = 'Create a vector from individual X, Y and Z components.'\n\t\t\n\t\tthis.input_slots = [ \n\t\t\t{ name: 'x', dt: core.datatypes.FLOAT, desc: 'The input x-component.', def: 0.0 },\n\t\t\t{ name: 'y', dt: core.datatypes.FLOAT, desc: 'The input y-component.', def: 0.0 },\n\t\t\t{ name: 'z', dt: core.datatypes.FLOAT, desc: 'The input z-component.', def: 0.0 }\n\t\t]\n\t\t\n\t\tthis.output_slots = [{\n\t\t\t\tname: 'vector',\n\t\t\t\tdt: core.datatypes.VECTOR,\n\t\t\t\tdesc: 'The resulting vector.',\n\t\t\t\tdef: new THREE.Vector3(0,0,0)\n\t\t\t}\n\t\t]\n\t}\n\n\tVectorPlugin.prototype.reset = function() {\n\t\tthis.xyz = new THREE.Vector3(0,0,0)\n\t}\n\n\tVectorPlugin.prototype.update_input = function(slot, data) {\n\t\tif (slot.index === 0)\n\t\t\tthis.xyz.setX(data)\n\t\telse if (slot.index === 1)\n\t\t\tthis.xyz.setY(data)\n\t\telse\n\t\t\tthis.xyz.setZ(data)\n\t}\n\n\tVectorPlugin.prototype.update_output = function() {\n\t\treturn this.xyz\n\t}\n\n\tVectorPlugin.prototype.state_changed = function() {}\n\n})()\n"
  },
  {
    "path": "browser/plugins/vector_add.plugin.js",
    "content": "E2.p = E2.plugins[\"vector_add\"] = function(core, node)\n{\n\tthis.desc = 'Adds the X, Y and Z components of the supplied vectors and emits the result.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'a', dt: core.datatypes.VECTOR, desc: 'The first operand.', def: core.renderer.vector_origin }, \n\t\t{ name: 'b', dt: core.datatypes.VECTOR, desc: 'The second operand.', def: core.renderer.vector_origin } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'vector', dt: core.datatypes.VECTOR, desc: 'Emits Fx + Sx, Fy + Sy, Fz + Sz.', def: core.renderer.vector_origin }\n\t];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.vector_a = data;\n\telse if(slot.index === 1)\n\t\tthis.vector_b = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tvar r = this.result, va = this.vector_a, vb = this.vector_b;\n\tr.set(va.x + vb.x, va.y + vb.y, va.z + vb.z)\n};\n\nE2.p.prototype.update_output = function()\n{\n\treturn this.result;\n};\t\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.vector_a = new THREE.Vector3(0, 0, 0)\n\t\tthis.vector_b = new THREE.Vector3(0, 0, 0)\n\t\tthis.result = new THREE.Vector3(0, 0, 0)\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/vector_cross.plugin.js",
    "content": "E2.p = E2.plugins[\"vector_cross\"] = function(core, node)\n{\n\tthis.desc = 'Emits the cross products of the two supplied vectors.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'a', dt: core.datatypes.VECTOR, desc: 'The first operand.', def: core.renderer.vector_origin }, \n\t\t{ name: 'b', dt: core.datatypes.VECTOR, desc: 'The second operand.', def: core.renderer.vector_origin } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'vector', dt: core.datatypes.VECTOR, desc: 'Emits F cross S.', def: core.renderer.vector_origin }\n\t];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.vector_a = data;\n\telse if(slot.index === 1)\n\t\tthis.vector_b = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.result.crossVectors(this.vector_a, this.vector_b);\n};\n\nE2.p.prototype.update_output = function()\n{\n\treturn this.result;\n};\t\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.vector_a = new THREE.Vector3(0, 0, 0)\n\t\tthis.vector_b = new THREE.Vector3(0, 0, 0)\n\t\tthis.result = new THREE.Vector3(0, 0, 0)\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/vector_display.plugin.js",
    "content": "(function() {\nvar VectorDisplay = E2.plugins.vector_display = function(core) {\n\tthis.desc = 'Displays the supplied vector as a three-cell row of values.'\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'vector', dt: core.datatypes.VECTOR, desc: 'The vector to be displayed.', def: core.renderer.vector_origin }\n\t]\n\t\n\tthis.output_slots = []\n}\n\nVectorDisplay.prototype.reset = function() {\n\tthis.vec = new THREE.Vector3(0, 0, 0)\n\tthis.update_values()\n}\n\nVectorDisplay.prototype.create_ui = function(){\n\tvar table = make('table')\n\tvar row = make('tr')\n\tvar css = { 'text-align': 'right', 'padding-left': '10px' }\n\t\n\tthis.columns = [make('td'), make('td'), make('td')]\n\n\tfor(var i = 0; i < 3; i++) {\n\t\tvar c = this.columns[i]\n\t\t\n\t\tc.text('-')\n\t\tc.css(css)\n\t\trow.append(c)\n\t}\n\t\n\ttable.append(row)\n\n\treturn table\n}\n\nVectorDisplay.prototype.connection_changed = function(on) {\n\tif (!on)\n\t\tthis.reset()\n}\n\nVectorDisplay.prototype.update_input = function(slot, data) {\n\tthis.vec = data\n\tthis.update_values()\n}\n\nVectorDisplay.prototype.update_values = function() {\n\tif (!this.columns)\n\t\treturn\n\t\n\tthis.columns[0].text(this.vec.x)\n\tthis.columns[1].text(this.vec.y)\n\tthis.columns[2].text(this.vec.z)\n}\n})()"
  },
  {
    "path": "browser/plugins/vector_distance.plugin.js",
    "content": "E2.p = E2.plugins[\"vector_distance\"] = function(core, node)\n{\n\tthis.desc = 'Outputs the distance between the supplied A and B vectors.'\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'a', dt: core.datatypes.VECTOR, desc: 'The first operand.', def: core.renderer.vector_origin }, \n\t\t{ name: 'b', dt: core.datatypes.VECTOR, desc: 'The second operand.', def: core.renderer.vector_origin } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'vector', dt: core.datatypes.FLOAT, desc: 'Emits the distance from A to B.', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.vector_a = data;\n\telse if(slot.index === 1)\n\t\tthis.vector_b = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.result = this.vector_a.distanceTo(this.vector_b)\n};\n\nE2.p.prototype.update_output = function()\n{\n\treturn this.result;\n};\t\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.vector_a = new THREE.Vector3(0, 0, 0)\n\t\tthis.vector_b = new THREE.Vector3(0, 0, 0)\n\t\tthis.result = new THREE.Vector3(0, 0, 0)\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/vector_dot.plugin.js",
    "content": "E2.p = E2.plugins[\"vector_dot\"] = function(core, node)\n{\n\tthis.desc = 'Emits the dot products of the two supplied vectors.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'a', dt: core.datatypes.VECTOR, desc: 'The first operand.', def: core.renderer.vector_origin }, \n\t\t{ name: 'b', dt: core.datatypes.VECTOR, desc: 'The second operand.', def: core.renderer.vector_origin } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'float', dt: core.datatypes.FLOAT, desc: 'Emits F dot S.', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.vector_a = data;\n\telse if(slot.index === 1)\n\t\tthis.vector_b = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.result = this.vector_a.dot(this.vector_b);\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.result;\n};\t\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.vector_a = new THREE.Vector3(0, 0, 0)\n\t\tthis.vector_b = new THREE.Vector3(0, 0, 0)\n\t\tthis.result = new THREE.Vector3(0, 0, 0)\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/vector_magnitude.plugin.js",
    "content": "E2.p = E2.plugins[\"vector_magnitude\"] = function(core, node)\n{\n\tthis.desc = 'Emits the magnitude (length) of the supplied vector.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'vector', dt: core.datatypes.VECTOR, desc: 'Input vector to compute the length of.', def: core.renderer.vector_origin }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'mag', dt: core.datatypes.FLOAT, desc: 'Emits the magnitude of the input vector.', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.vector = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tvar x = this.vector.x,\n\t\ty = this.vector.y,\n\t\tz = this.vector.z;\n\n\tthis.mag = Math.sqrt(x*x + y*y + z*z); \n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.mag;\n};\t\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.vector = new THREE.Vector3(0, 0, 0)\n\t\tthis.mag = 0.0;\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/vector_multiply.plugin.js",
    "content": "E2.p = E2.plugins[\"vector_multiply\"] = function(core, node)\n{\n\tthis.desc = 'Multiples the X, Y and Z components of the supplied vectors and emits the result.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'a', dt: core.datatypes.VECTOR, desc: 'The first operand.', def: core.renderer.vector_origin }, \n\t\t{ name: 'b', dt: core.datatypes.VECTOR, desc: 'The second operand.', def: core.renderer.vector_origin } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'vector', dt: core.datatypes.VECTOR, desc: 'Emits Fx * Sx, Fy * Sy, Fz * Sz.', def: core.renderer.vector_origin }\n\t];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.vector_a = data;\n\telse if(slot.index === 1)\n\t\tthis.vector_b = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.result.multiplyVectors(this.vector_a, this.vector_b)\n};\n\nE2.p.prototype.update_output = function()\n{\n\treturn this.result;\n};\t\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.vector_a = new THREE.Vector3(0, 0, 0)\n\t\tthis.vector_b = new THREE.Vector3(0, 0, 0)\n\t\tthis.result = new THREE.Vector3(0, 0, 0)\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/vector_normalize.plugin.js",
    "content": "E2.p = E2.plugins[\"vector_normalize\"] = function(core, node)\n{\n\tthis.desc = 'Emit a normalized version of the supplied vector with a magnitude of 1.';\n\t\n\tthis.input_slots = [\n\t\t{ name: 'vector', dt: core.datatypes.VECTOR, desc: 'The input vector to be normalised.', def: core.renderer.vector_origin }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'vector', dt: core.datatypes.VECTOR, desc: 'Emits the normalised input vector.', def: core.renderer.vector_origin }\n\t];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.vector = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tvar x = this.vector.x, y = this.vector.y, z = this.vectory, sn = this.normalized;\n\tvar len = Math.sqrt(x*x + y*y + z*z);\n\n\tif(!len) \n\t{\n\t\tsn.x = 0;\n\t\tsn.y = 0;\n\t\tsn.z = 0;\n\t} \n\telse if(len === 1) \n\t{\n\t\tsn.x = x;\n\t\tsn.y = y;\n\t\tsn.z = z;\n\t}\n\telse\n\t{\n\t\tlen = 1.0 / len;\n\t\n\t\tsn.x = x * len;\n\t\tsn.y = y * len;\n\t\tsn.z = z * len;\n\t}\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.normalized;\n};\t\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.vector = new THREE.Vector3(0, 0, 0)\n\t\tthis.normalized = new THREE.Vector3(0, 0, 0)\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/vector_scale.plugin.js",
    "content": "E2.p = E2.plugins[\"vector_scale\"] = function(core, node)\n{\n\tthis.desc = 'Scale the X, Y and Z components of the supplied vector by the supplied factor.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'vector', dt: core.datatypes.VECTOR, desc: 'The input vector to be scaled.', def: core.renderer.vector_origin }, \n\t\t{ name: 'scale', dt: core.datatypes.FLOAT, desc: 'The scale factor.', def: 1.0 } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'vector', dt: core.datatypes.VECTOR, desc: 'Emits Vx * s, Vy *s, Vz * s.', def: core.renderer.vector_origin }\n\t];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.vector = data;\n\telse if(slot.index === 1)\n\t\tthis.scale = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tvar s = this.scale, sc = this.scaled, v = this.vector;\n\t\n\tsc.x = v.x * s;\n\tsc.y = v.y * s;\n\tsc.z = v.z * s;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.scaled;\n};\t\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.vector = new THREE.Vector3(0, 0, 0)\n\t\tthis.scaled = new THREE.Vector3(0, 0, 0)\n\t\tthis.scale = 1.0;\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/vector_subtract.plugin.js",
    "content": "E2.p = E2.plugins[\"vector_subtract\"] = function(core, node)\n{\n\tthis.desc = 'Subtracts the X, Y and Z components of the supplied vectors and emits the result.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'a', dt: core.datatypes.VECTOR, desc: 'The first operand.', def: core.renderer.vector_origin }, \n\t\t{ name: 'b', dt: core.datatypes.VECTOR, desc: 'The second operand.', def: core.renderer.vector_origin } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'vector', dt: core.datatypes.VECTOR, desc: 'Emits Fx - Sx, Fy - Sy, Fz - Sz.', def: core.renderer.vector_origin }\n\t];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.vector_a = data;\n\telse if(slot.index === 1)\n\t\tthis.vector_b = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.result.subVectors(this.vector_a, this.vector_b)\n};\n\nE2.p.prototype.update_output = function()\n{\n\treturn this.result;\n};\t\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.vector_a = new THREE.Vector3(0, 0, 0)\n\t\tthis.vector_b = new THREE.Vector3(0, 0, 0)\n\t\tthis.result = new THREE.Vector3(0, 0, 0)\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/vector_to_screenspace.plugin.js",
    "content": "E2.p = E2.plugins[\"vector_to_screenspace\"] = function(core, node)\n{\n\tthis.desc = 'Transform a vector from world to screenspace given a specified camera.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'vector', dt: core.datatypes.VECTOR, desc: 'Input vector (in worldspace) to transform.' },\n\t\t{ name: 'camera', dt: core.datatypes.CAMERA, desc: 'Camera to use for transformation.' }\n\t]\n\t\n\tthis.output_slots = [\n\t\t{ name: 'vector', dt: core.datatypes.VECTOR, desc: 'Emits the transformed input vector.' }\n\t]\n}\n\nE2.p.prototype.update_input = function(slot, data) {\n\tif (slot.index === 0)\n\t\tthis.vector = data\n\telse if (slot.index === 1)\n\t\tthis.camera = data\n}\n\nE2.p.prototype.update_state = function() {\n\tthis.camera.updateMatrixWorld()\n\tthis.camera.updateProjectionMatrix()\n\n\tvar m = new THREE.Matrix4()\n\tthis.camera.matrixWorldInverse.getInverse(this.camera.matrixWorld)\n\tm.multiplyMatrices(this.camera.projectionMatrix, this.camera.matrixWorldInverse)\n\n\tthis.transformed.copy(this.vector)\n\n\tthis.transformed.applyMatrix4(m)\n}\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.transformed\n}\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.vector = new THREE.Vector3()\n\t\tthis.transformed = new THREE.Vector3()\n\t\tthis.camera = new THREE.Camera()\n\t}\n}\n"
  },
  {
    "path": "browser/plugins/vector_transform.plugin.js",
    "content": "E2.p = E2.plugins[\"vector_transform\"] = function(core, node)\n{\n\tthis.desc = 'Transform a vector by the supplied matrix.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'vector', dt: core.datatypes.VECTOR, desc: 'Input vector to transform.' },\n\t\t{ name: 'matrix', dt: core.datatypes.MATRIX, desc: 'Transformation matrix to multiply the vector by.' }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'vector', dt: core.datatypes.VECTOR, desc: 'Emits the transformed input vector.' }\n\t];\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tif(slot.index === 0)\n\t\tthis.vector = data;\n\telse if(slot.index === 1)\n\t\tthis.matrix = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.transformed.copy(this.vector)\n\tthis.transformed.applyMatrix4(this.matrix)\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.transformed;\n};\t\n\nE2.p.prototype.state_changed = function(ui)\n{\n\tif(!ui)\n\t{\n\t\tthis.vector = new THREE.Vector3()\n\t\tthis.transformed = new THREE.Vector3()\n\t\tthis.matrix = new THREE.Matrix4()\n\t\tthis.matrix.identity()\n\t}\n};\n"
  },
  {
    "path": "browser/plugins/video_get_current_time_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"video_get_current_time_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Get the current playback time of the supplied video in seconds.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'video', dt: core.datatypes.VIDEO, desc: 'Input video.', def: null }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'time', dt: core.datatypes.FLOAT, desc: 'Current playback time.', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.time = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.time = data ? data.currentTime : 0.0;\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.time;\n};\n"
  },
  {
    "path": "browser/plugins/video_get_duration_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"video_get_duration_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Get the duration of the supplied video in seconds.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'video', dt: core.datatypes.VIDEO, desc: 'Input video.', def: null }\n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'duration', dt: core.datatypes.FLOAT, desc: 'Duration in seconds.', def: 0.0 }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.duration = 0.0;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.duration = data ? data.duration : 0.0;\n};\t\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.duration;\n};\n"
  },
  {
    "path": "browser/plugins/video_player.plugin.js",
    "content": "(function() {\n\nvar VideoPlayer = E2.plugins.video_player = function(core, node) {\n\tthis.desc = 'Play a video stream. Playback loops by default.'\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'video', dt: core.datatypes.VIDEO, desc: 'The video stream to play.', def: null },\n\t\t{ name: 'play', dt: core.datatypes.BOOL, desc: 'Send true to start playback and false to stop.', def: true },\n\t\t{ name: 'muted', dt: core.datatypes.BOOL, desc: 'Is audio muted?', def: true },\n\t\t{ name: 'volume', dt: core.datatypes.FLOAT, desc: 'Set playback volume.', lo: 0.0, hi: 0.0, def: 0.5 },\n\t\t{ name: 'time', dt: core.datatypes.FLOAT, desc: 'Set playback time.', def: 0.0 }\n\t]\n\t\n\tthis.output_slots = [\n\t\t{ name: 'texture', dt: core.datatypes.TEXTURE, desc: 'The current video frame.' }\n\t]\n\t\n\tthis.core = core\n\tthis.node = node\n\tthis.video = null\n\tthis.playing = false\n\tthis.should_play = false\n\tthis.muted = true\n\tthis.volume = 0.5\n\tthis.time = null\n\tthis.texture = null\n}\n\nVideoPlayer.prototype.play = function() {\n\tif (this.video && !this.playing && this.should_play) {\n\t\tthis.playing = this.should_play = true\n\t\t\n\t\tif (E2.util.isMobile.Android())\n\t\t\treturn;\n\t\t\n\t\tthis.video.play()\n\t}\n}\n\nVideoPlayer.prototype.pause = function() {\n\tif (this.video && this.playing) {\n\t\tthis.playing = false\n\t\tthis.should_play = true\n\t\tthis.video.pause()\n\t}\n}\n\nVideoPlayer.prototype.stop = function() {\n\tif (this.video) {\n\t\tif (this.playing) {\n\t\t\tthis.playing = this.should_play = false\n\t\t\tthis.video.pause()\n\t\t}\n\t\t\n\t\tif (this.video.readyState >= 2)\n\t\t\tthis.video.currentTime = 0\n\t}\n}\n\nVideoPlayer.prototype.update_input = function(slot, data) {\n\tif (slot.index === 0) {\n\t\tthis.video = data\n\t\tthis.texture = null\n\t\tthis.playing = false\n\t}\n\telse if(slot.index === 1)\n\t\tthis.should_play = data\n\telse if(slot.index === 2)\n\t\tthis.muted = data\n\telse if(slot.index === 3)\n\t\tthis.volume = data < 0.0 ? 0.0 : data > 1.0 ? 1.0 : data\n\telse if(slot.index === 4)\n\t\tthis.time = data\n}\n\nVideoPlayer.prototype.update_state = function() {\n\tvar video = this.video\n\t\n\tif (!video || video.readyState < 2)\n\t\treturn\n\t\n\tif (this.playing !== this.should_play) {\n\t\tif (video) {\n\t\t\tif (this.should_play)\n\t\t\t\tthis.play()\n\t\t\telse\n\t\t\t\tthis.pause()\n\t\t}\n\t\t\n\t}\n\t\n\tif (!this.playing)\n\t\treturn\n\n\tif (video) {\n\t\tif (video.videoWidth > 0 && video.videoHeight > 0) {\n\t\t\tif (!this.videoImage || (this.videoImage.width != video.videoWidth || this.videoImage.height != video.videoHeight)) {\n\t\t\t\t// set up texture\n\n\t\t\t\tthis.videoImage = document.createElement('canvas')\n\t\t\t\tthis.videoImage.width = video.videoWidth\n\t\t\t\tthis.videoImage.height = video.videoHeight\n\n\t\t\t\tthis.videoImageContext = this.videoImage.getContext('2d')\n\t\t\t\t// background color if no video present\n\t\t\t\tthis.videoImageContext.fillStyle = '#000000'\n\t\t\t\tthis.videoImageContext.fillRect(0, 0, this.videoImage.width, this.videoImage.height)\n\n\t\t\t\tthis.texture = new THREE.Texture(this.videoImage)\n\n\t\t\t\tthis.texture.minFilter = THREE.LinearFilter\n\t\t\t\tthis.texture.magFilter = THREE.LinearFilter\n\t\t\t}\n\t\t\t\n\t\t\tif (video.readyState === video.HAVE_ENOUGH_DATA && this.texture) {\n\t\t\t\t// update\n\t\t\t\tthis.videoImageContext.drawImage( video, 0, 0 )\n\t\t\t\tthis.texture.needsUpdate = true\n\t\t\t}\n\t\t}\n\t\t\n\t\tvideo.muted = this.muted\n\t\tvideo.volume = this.volume\n\t\t\n\t\tif (this.time && video.readyState >= 2) {\n\t\t\tvideo.currentTime = this.time\n\t\t\tthis.time = null\n\t\t}\n\t}\n\n\tthis.updated = true\n}\n\nVideoPlayer.prototype.update_output = function(slot) {\n\tthis.node.queued_update = 1\n\treturn this.texture ? this.texture : new THREE.Texture()\n}\n\n})()\n"
  },
  {
    "path": "browser/plugins/viewport_size_generator.plugin.js",
    "content": "(function() {\n\tvar ViewportSizeGenerator = E2.plugins.viewport_size_generator = function(core, node) {\n\t\tthis.desc = 'Emits current renderer view size.'\n\n\t\tthis.input_slots = []\n\n\t\tthis.output_slots = [\n\t\t\t{\n\t\t\t\tname: 'width',\n\t\t\t\tdt: core.datatypes.FLOAT,\n\t\t\t\tdesc: 'The current renderer viewport width.'\n\t\t\t}, {\n\t\t\t\tname: 'height',\n\t\t\t\tdt: core.datatypes.FLOAT,\n\t\t\t\tdesc: 'The current renderer viewport height.'\n\t\t\t}\n\t\t]\n\t}\n\n\tViewportSizeGenerator.prototype.update_output = function (slot) {\n\t\tif (slot.name === 'width') {\n\t\t\treturn this.domElement.width\n\t\t}\n\t\telse {\n\t\t\treturn this.domElement.height\n\t\t}\n\t}\n\n\tViewportSizeGenerator.prototype.resize = function () {\n\t\tthis.updated = true\n\t}\n\n\tViewportSizeGenerator.prototype.state_changed = function(ui) {\n\t\tif (!ui) {\n\t\t\tthis.domElement = E2.dom.webgl_canvas[0]\n\t\t\tE2.core.on('resize', this.resize.bind(this))\n\t\t}\n\t}\n\n})()\n"
  },
  {
    "path": "browser/plugins/vive_controller.plugin.js",
    "content": "(function() {\nvar ViveController = E2.plugins.vive_controller = function(core, node) {\n\tfunction createOutput(name, dt) {\n\t\treturn {\n\t\t\tname: name,\n\t\t\tdt: dt,\n\t\t\tdesc: name\n\t\t}\n\t}\n\n\tthis._core = core\n\n\tthis.desc = 'Buttons and axes from HTC Vive Controller'\n\n\tthis.vibrate = false\n\n\tthis.input_slots = [{\n\t\tname: 'pad number',\n\t\tdt: core.datatypes.FLOAT,\n\t\tdesc: 'Gamepad number',\n\t\tdef: 0\n\t},\n\t{\n\t\tname: 'vibrate',\n\t\tdt: core.datatypes.BOOL,\n\t\tdesc: 'Vibrates the gamepad while this is true',\n\t\tdef: false\n\t}]\n\n\tthis.output_slots = [\n\t\tcreateOutput('touchpad down', E2.dt.BOOL),\n\t\tcreateOutput('trigger down', E2.dt.BOOL),\n\t\tcreateOutput('grip down', E2.dt.BOOL),\n\t\tcreateOutput('menu down', E2.dt.BOOL),\n\n\t\tcreateOutput('touchpad x value', E2.dt.FLOAT),\n\t\tcreateOutput('touchpad y value', E2.dt.FLOAT),\n\t\tcreateOutput('trigger value',    E2.dt.FLOAT), \n\n\t\t{\n\t\t\tname: 'position',\n\t\t\tdt: core.datatypes.VECTOR,\n\t\t\tdesc: 'The position of the Vive Controller'\n\t\t},\n\n\t\t{\n\t\t\tname: 'rotation',\n\t\t\tdt: core.datatypes.VECTOR,\n\t\t\tdesc: 'The rotation of the Vive Controller'\n\t\t}\n\t]\n\n\tthis.position = new THREE.Vector3(0, 0, 0)\n\tthis.rotation = new THREE.Euler()\n\tthis.rotationQuaternion = new THREE.Quaternion()\n\n\tthis._gamepadIndex = 0\n\tthis.always_update = true\n}\n\nViveController.prototype.reset = function() {\n\tthis.updated = true\n}\n\nViveController.prototype.update_input = function(slot, data) {\n\tif (slot.name === 'pad number') {\n\t\tthis._gamepadIndex = data\n\t\treturn;\n\t}\n\n\tif (slot.name === 'vibrate')\n\t\tthis.vibrate = data\n}\n\nViveController.prototype.update_state = function() {\n\tthis.gamepads = navigator.getGamepads()\n\tvar pad = this.gamepad = this.gamepads[this._gamepadIndex]\n\n\tif (!pad)\n\t\treturn;\n\n\tif (pad.vibrate)\n\t\tpad.vibrate(this.vibrate ? 100 : 0)\n\n\tthis.updated = true\n\n\tif (!pad.pose)\n\t\treturn\n\n\tthis.position.set(\n\t\tpad.pose.position[0],\n\t\tpad.pose.position[1],\n\t\tpad.pose.position[2])\n\n\tthis.position.add(E2.app.player.cameraPlugin.offset)\n\n\tthis.rotation.setFromQuaternion(\n\t\tthis.rotationQuaternion.fromArray(pad.pose.orientation),\n\t\t'YZX')\n}\n\nViveController.prototype.update_output = function(slot) {\n\tif (!this.gamepad)\n\t\treturn slot.dt.id === E2.dt.FLOAT.id ? 0.0 : false\n\n\tif (slot.name === 'position')\n\t\treturn this.position\n\n\tif (slot.name === 'rotation')\n\t\treturn this.rotation\n\n\tif (slot.name === 'touchpad down')\n\t\treturn this.gamepad.buttons[0].pressed\n\n\tif (slot.name === 'trigger down')\n\t\treturn this.gamepad.buttons[1].pressed\n\n\tif (slot.name === 'grip down')\n\t\treturn this.gamepad.buttons[2].pressed\n\n\tif (slot.name === 'menu down')\n\t\treturn this.gamepad.buttons[3].pressed\n\n\tif (slot.name === 'touchpad x value')\n\t\treturn this.gamepad.axes[0]\n\n\tif (slot.name === 'touchpad y value')\n\t\treturn this.gamepad.axes[1]\n\n\tif (slot.name === 'trigger value')\n\t\treturn this.gamepad.buttons[1].value\n}\n\n})()"
  },
  {
    "path": "browser/plugins/vr_acceleration_generator.plugin.js",
    "content": "E2.p = E2.plugins[\"vr_acceleration_generator\"] = function(core, node)\n{\n\tthis.desc = 'Supplies linear and angular acceleration data from the current VR sensor device.';\n\t\n\tthis.input_slots = [];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'linear', dt: core.datatypes.VECTOR, desc: 'The current linear acceleration of the sensor.', def: [0.0, 0.0, 0.0] },\n\t\t{ name: 'angular', dt: core.datatypes.VECTOR, desc: 'The current angular acceleration of the sensor.', def: [0.0, 0.0, 0.0] }\n\t];\n\t\n\tthis.renderer = core.renderer;\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.updated = true;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\tvar sensor = this.renderer.vr_sensor;\n\t\n\tif(sensor)\n\t{\n\t\tvar s = sensor.getState();\n\t\tvar a = null;\n\t\t\n\t\tif(slot.index === 0)\n\t\t\ta = s.linearAcceleration;\n\t\telse\n\t\t\ta = s.angularAcceleration;\n\t\t\n\t\treturn [a.x, a.y, a.z];\n\t}\n\t\n\treturn [0.0, 0.0, 0.0];\n};\n"
  },
  {
    "path": "browser/plugins/vr_camera_info_generator.plugin.js",
    "content": "E2.p = E2.plugins.vr_camera_info_generator = function(core, node)\n{\n\tthis.desc = 'Supplies left / right FOV and translation of the current VR device camera.';\n\t\n\tthis.input_slots = [];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'left FOV', dt: core.datatypes.FLOAT, desc: 'Left eye FOV.', def: 75 },\n\t\t{ name: 'right FOV', dt: core.datatypes.FLOAT, desc: 'Right eye FOV.', def: 75 },\n\t\t{ name: 'left offset', dt: core.datatypes.FLOAT, desc: 'Left eye translation.', def: 0.0 },\n\t\t{ name: 'right offset', dt: core.datatypes.FLOAT, desc: 'Right eye translation.', def: 0.0 }\n\t];\n\t\n\tthis.renderer = core.renderer;\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.updated = true;\n};\n\nE2.p.prototype.update_output = function(slot) {\n\tvar hmd = this.renderer.vr_hmd;\n\tvar defaultEye = {\n\t\teyeTranslation: 0.0,\n\t\trecommendedFieldOfView: {\n\t\t\tleftDegrees: 75,\n\t\t\trightDegrees: 75\n\t\t}\n\t}\n\tvar eyeL = defaultEye, eyeR = defaultEye\n\t\n\tif (hmd) {\n\t\tif (hmd.getEyeParameters !== undefined) {\n\t\t\teyeL = hmd.getEyeParameters('left')\n\t\t\teyeR = hmd.getEyeParameters('right')\n\t\t} else {\n\t\t\teyeL = {\n\t\t\t\teyeTranslation: hmd.getEyeTranslation('left'),\n\t\t\t\trecommendedFieldOfView: hmd.getRecommendedEyeFieldOfView('left')\n\t\t\t}\n\t\t\teyeR = {\n\t\t\t\teyeTranslation: hmd.getEyeTranslation('right'),\n\t\t\t\trecommendedFieldOfView: hmd.getRecommendedEyeFieldOfView('right')\n\t\t\t}\n\t\t}\n\t}\n\n\tif (slot.index === 0)\n\t\treturn eyeL.recommendedFieldOfView.leftDegrees\n\telse if (slot.index === 1)\n\t\treturn eyeR.recommendedFieldOfView.rightDegrees\n\telse if (slot.index === 2)\n\t\treturn eyeL.eyeTranslation\n\t\t\n\treturn eyeR.getEyeTranslation\n};\n"
  },
  {
    "path": "browser/plugins/vr_hmd_available_generator.plugin.js",
    "content": "E2.p = E2.plugins[\"vr_hmd_available_generator\"] = function(core, node)\n{\n\tthis.desc = 'Emits true if a VR Head Mounted Device is available and false otherwise.';\n\t\n\tthis.input_slots = [];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: 'True if a VR display device is available.' }\n\t];\n\t\n\tthis.renderer = core.renderer;\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.updated = true;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.renderer.vr_hmd ? true : false;\n};\n"
  },
  {
    "path": "browser/plugins/vr_hmd_info_generator.plugin.js",
    "content": "E2.p = E2.plugins[\"vr_hmd_info_generator\"] = function(core, node)\n{\n\tthis.desc = 'Supplies various information about the current VR HMD device.';\n\t\n\tthis.input_slots = [];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'device name', dt: core.datatypes.TEXT, desc: 'The active VR device name.', def: '' },\n\t\t{ name: 'display width', dt: core.datatypes.FLOAT, desc: 'The HMD display width in pixels.', def: 0 },\n\t\t{ name: 'display height', dt: core.datatypes.FLOAT, desc: 'The HMD display height in pixels.', def: 0 },\n\t\t{ name: 'render width', dt: core.datatypes.FLOAT, desc: 'The HMD render target width in pixels.', def: 0 },\n\t\t{ name: 'render height', dt: core.datatypes.FLOAT, desc: 'The HMD render target height in pixels.', def: 0 }\n\t];\n\t\n\tthis.renderer = core.renderer;\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.updated = true;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\tvar hmd = this.renderer.vr_hmd;\n\t\n\tif(slot.index === 0)\n\t\treturn hmd ? hmd.deviceName : '';\n\telse if(slot.index === 1)\n\t\treturn hmd ? hmd.displaySize.width : 0;\n\telse if(slot.index === 2)\n\t\treturn hmd ? hmd.displaySize.height : 0;\n\telse if(slot.index === 3)\n\t\treturn hmd ? hmd.renderTargetSize.width : 0;\n\t\n\treturn hmd ? hmd.renderTargetSize.height : 0;\n};\n"
  },
  {
    "path": "browser/plugins/vr_sensor_available_generator.plugin.js",
    "content": "E2.p = E2.plugins[\"vr_sensor_available_generator\"] = function(core, node)\n{\n\tthis.desc = 'Emits true if a VR position sensor is available and false otherwise.';\n\t\n\tthis.input_slots = [];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: 'True if a VR position sensor is available.' }\n\t];\n\t\n\tthis.renderer = core.renderer;\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.updated = true;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.renderer.vr_sensor ? true : false;\n};\n"
  },
  {
    "path": "browser/plugins/vr_sensor_info_generator.plugin.js",
    "content": "E2.p = E2.plugins[\"vr_sensor_info_generator\"] = function(core, node)\n{\n\tthis.desc = 'Supplies the position and orientation of the current VR HMD.';\n\t\n\tthis.input_slots = [];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'position', dt: core.datatypes.VECTOR, desc: 'The position of the current HMD device.' },\n\t\t{ name: 'orientation', dt: core.datatypes.MATRIX, desc: 'The orientation of the current HMD device.' }\n\t];\n\t\n\tthis.renderer = core.renderer;\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.updated = true;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\tvar sensor = this.renderer.vr_sensor;\n\t\n\tthis.updated = true;\n\n\tif(slot.index === 0)\n\t{\n\t\tif(sensor)\n\t\t{\n\t\t\tvar s = sensor.getState();\n\t\t\t\n\t\t\tif(!s.position)\n\t\t\t\treturn [0.0, 0.0, 0.0];\n\t\t\t\n\t\t\tvar p = s.position;\n\t\t\t\n\t\t\treturn [p.x, p.y, p.z];\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn [0.0, 0.0, 0.0];\n\t\t}\n\n\t}\n\t\n\tif(sensor)\n\t{\n\t\tvar s = sensor.getState();\n\t\t\n\t\tif(!s.orientation)\n\t\t{\n\t\t\tvar m = mat4.create();\n\t\n\t\t\tmat4.identity(m);\n\t\t\treturn m;\n\t\t}\n\t\t\t\t\n\t\tvar o = s.orientation;\n\t\t\n\t\treturn quat4.toMat4(quat4.createFrom(o.x, o.y, o.z, o.w));\n\t}\n\t\n\tvar m = mat4.create();\n\t\n\tmat4.identity(m);\n\treturn m;\n};\n"
  },
  {
    "path": "browser/plugins/vr_velocity_generator.plugin.js",
    "content": "E2.p = E2.plugins[\"vr_velocity_generator\"] = function(core, node)\n{\n\tthis.desc = 'Supplies linear and angular velocity data from the current VR sensor device.';\n\t\n\tthis.input_slots = [];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'linear', dt: core.datatypes.VECTOR, desc: 'The current linear velocity of the sensor.', def: [0.0, 0.0, 0.0] },\n\t\t{ name: 'angular', dt: core.datatypes.VECTOR, desc: 'The current angular velocity of the sensor.', def: [0.0, 0.0, 0.0] }\n\t];\n\t\n\tthis.renderer = core.renderer;\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.updated = true;\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\tvar sensor = this.renderer.vr_sensor;\n\t\n\tif(sensor)\n\t{\n\t\tvar s = sensor.getState();\n\t\tvar v = null;\n\t\t\n\t\tif(slot.index === 0)\n\t\t\tv = s.linearVelocity;\n\t\telse\n\t\t\tv = s.angularVelocity;\n\t\t\n\t\treturn [v.x, v.y, v.z];\n\t}\n\t\n\treturn [0.0, 0.0, 0.0];\n};\n"
  },
  {
    "path": "browser/plugins/wschannel/wschannel.js",
    "content": "\nfunction WebSocketChannel() {\n\tthis._listeners = {};\n\tthis._state = 'disconnected';\n\tthis.ws;\n}\n\nWebSocketChannel.prototype.connect = function()\n{\n\tvar that = this;\n\n\tif (this._state === 'connected' || this._state === 'connecting')\n\t\treturn;\n\n\tthis._state = 'connecting';\n\n\tthis.ws = new WebSocket('ws://'+\n\t\twindow.location.hostname+':'+\n\t\t(window.location.port || 80)+\n\t\t'/__wschannel');\n\n\tthis.ws.onopen = function()\n\t{\n\t\tconsole.log('WsChannel connected');\n\t\tthat._state = 'connected';\n\t};\n\n\tthis.ws.onclose = function()\n\t{\n\t\tconsole.warn('WsChannel disconnected!');\n\t\tthat._state = 'disconnected';\n\t};\n\n\tthis.ws.onmessage = function(evt)\n\t{\n\t\tvar m = JSON.parse(evt.data);\n\t\tconsole.log('IN:', m);\n\n\t\tif (that._listeners['*'])\n\t\t\tthat._listeners['*'](m);\n\n\t\tif (!that._listeners[m.channel])\n\t\t\treturn;\n\n\t\tif (that._listeners[m.channel])\n\t\t\tthat._listeners[m.channel](m);\n\t};\n}\n\nWebSocketChannel.prototype.join = function(channel)\n{\n\tthis.ws.send(JSON.stringify({ kind: 'join', channel: channel }))\n\treturn this\n}\n\nWebSocketChannel.prototype.send = function(channel, data)\n{\n\tif (this._state !== 'connected')\n\t\treturn;\n\n\tif (typeof(data) !== 'object')\n\t{\n\t\tdata = { kind: data };\n\t}\n\n\tdata.channel = channel;\n\n\tthis.ws.send(JSON.stringify(data));\n}\n\nWebSocketChannel.prototype.on = function(channel, fn)\n{\n\tthis._listeners[channel] = fn;\n}\n\nWebSocketChannel.prototype.off = function(channel)\n{\n\tdelete this._listeners[channel];\n}\n\n// connect automatically\n\nconsole.log('Connecting WebSocketChannel');\n\nwindow.wsChannel = new WebSocketChannel();\nwindow.wsChannel.connect();\n"
  },
  {
    "path": "browser/plugins/wschannel_receive.plugin.js",
    "content": "E2.p = E2.plugins[\"wschannel_receive\"] = function(core, node)\n{\n\tthis.desc = 'Emits all messages received via a Web Socket PubSub Channel sent by other peers in that channel.';\n\n\tthis.input_slots = [\n\t\t{ name: 'channelName', dt: core.datatypes.TEXT, desc: 'Channel name' },\n\t];\n\n\tthis.output_slots = [\n\t\t{ name: 'message', dt: core.datatypes.OBJECT, desc: 'Messages received' }\n\t];\n\n\tcore.add_aux_script('wschannel/wschannel.js');\n}\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tvar that = this;\n\n\twsChannel.off(this._channelName);\n\n\tthis._channelName = data;\n\n\twsChannel.join(this._channelName);\n\n\twsChannel.on(this._channelName, function(m)\n\t{\n\t\tthat.updated = true;\n\t\tthat._message = m;\n\t});\n}\n\nE2.p.prototype.reset = function()\n{\n\tthis._message = null;\n}\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this._message;\n}\n"
  },
  {
    "path": "browser/plugins/wschannel_send.plugin.js",
    "content": "E2.p = E2.plugins[\"wschannel_send\"] = function(core, node)\n{\n\tthis.desc = 'Sends messages to Web Socket PubSub Channel for other peers in the channel to receive.';\n\n\tthis.input_slots = [\n\t\t{ name: 'channelName', dt: core.datatypes.TEXT, desc: 'Channel name' },\n\t\t{ name: 'message', dt: core.datatypes.OBJECT, desc: 'Message to send' },\n\t];\n\n\tthis.output_slots = [];\n\n\tcore.add_aux_script('wschannel/wschannel.js');\n}\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tswitch(slot.index) {\n\t\tcase 0:\n\t\t\tthis._channelName = data;\n\t\t\twsChannel.join(this._channelName);\n\t\t\tbreak;\n\t\tcase 1:\n\t\t\tif (this._channelName)\n\t\t\t{\n\t\t\t\twsChannel.send(this._channelName, data);\n\t\t\t}\n\t\t\tbreak;\n\t}\n}\n\nE2.p.prototype.reset = function()\n{\n\tthis._channelName = null;\n}\n"
  },
  {
    "path": "browser/plugins/xor_modulator.plugin.js",
    "content": "E2.p = E2.plugins[\"xor_modulator\"] = function(core, node)\n{\n\tthis.desc = 'Emits true when the values of the two inputs are different and false when they\\'re identical.';\n\t\n\tthis.input_slots = [ \n\t\t{ name: 'a', dt: core.datatypes.BOOL, desc: 'The first operand.', def: false },\n\t\t{ name: 'b', dt: core.datatypes.BOOL, desc: 'The second operand.', def: false } \n\t];\n\t\n\tthis.output_slots = [\n\t\t{ name: 'bool', dt: core.datatypes.BOOL, desc: 'Emits true if <b>first</b> does not equal <b>second</b> and false otherwise.', def: false }\n\t];\n};\n\nE2.p.prototype.reset = function()\n{\n\tthis.conds = [ false, false ];\n\tthis.state = false;\n};\n\nE2.p.prototype.update_input = function(slot, data)\n{\n\tthis.conds[slot.index] = data;\n};\t\n\nE2.p.prototype.update_state = function()\n{\n\tthis.state = this.conds[0] ? !this.conds[1] : this.conds[1];\n};\n\nE2.p.prototype.update_output = function(slot)\n{\n\treturn this.state;\n};\n"
  },
  {
    "path": "browser/postMessage.html",
    "content": "<html>\n\t<head>\n    \t<script type=\"text/javascript\" src=\"/node_modules/jquery/dist/jquery.min.js\"></script>\n    </head>\n\n\t<body style=\"width:800px;margin: 0 auto\">\n\t<h1>postMessage</h1>\n\n\n\t<script src=\"http://vizor.io/scripts/embed.js\" data-vizorurl=\"http://vizor.io/embed/kschzt/postmessage?autoplay=1\" ></script>\n\n\tscale <input id=\"scale\" type=\"range\" min=\"0\" max=\"77\" step=\"0.1\"/>\n\n\t<br>\n\n\t<pre id=\"log\"></pre>\n\n\t<script>\n\t\tvar $log = $('#log')\n\t\tvar $scale = $('#scale')\n\n\t\t// the embed script will create an iframe but right now one isn't available\n\t\t// so we defer setting this until send()\n\t\tvar $vizor = null\n\n\t\tfunction log(message) {\n\t\t\t$log.append(message + '<br>')\n\t\t}\n\n\t\tfunction send(message) {\n\t\t\tif (!$vizor) {\n\t\t\t\t$vizor = $('iframe').first()\n\t\t\t}\n\n\t\t\tlog('OUT: '+ JSON.stringify(message))\n\t\t\t$vizor[0].contentWindow\n\t\t\t\t.postMessage(message, '*')\n\t\t}\n\n\t\t$scale.on('input', function() {\n\t\t\tsend({\n\t\t\t\tcommand: 'setVariable',\n\t\t\t\tname: 'scale',\n\t\t\t\tvalue: $scale.val()\n\t\t\t})\n\t\t\t\n\t\t\tsend({\n\t\t\t\tcommand: 'getVariable',\n\t\t\t\tname: 'scale'\n\t\t\t})\n\t\t})\n\n\t\twindow.addEventListener('message', function(e) {\n\t\t\tlog('IN: ' + JSON.stringify(e.data))\n\t\t}, false)\n\t</script>\n\t</body>\n</html>"
  },
  {
    "path": "browser/scene.json",
    "content": "{\"abs_t\":33.117,\"active_graph\":0,\"graph_uid\":101,\"root\":{\"node_uid\":46,\"uid\":0,\"parent_uid\":-1,\"nodes\":[{\"plugin\":\"graph\",\"uid\":27,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{},\"output_sids\":{}},\"graph\":{\"node_uid\":17,\"uid\":64,\"parent_uid\":0,\"nodes\":[{\"plugin\":\"graph\",\"uid\":0,\"dsid\":6,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"0\":0,\"1\":1,\"2\":2,\"25\":5},\"output_sids\":{\"3\":3}},\"graph\":{\"node_uid\":26,\"uid\":65,\"parent_uid\":64,\"nodes\":[{\"plugin\":\"input_proxy\",\"uid\":0,\"dsid\":27,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":1,\"dsid\":27,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":2,\"dsid\":27,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"output_proxy\",\"uid\":3,\"dsid\":27,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":6,\"uid\":0}]},{\"plugin\":\"perspective_camera\",\"uid\":4},{\"plugin\":\"vector\",\"uid\":5},{\"plugin\":\"rotation_xyz_matrix\",\"uid\":6},{\"plugin\":\"vector_transform\",\"uid\":7},{\"plugin\":\"vector\",\"uid\":21},{\"plugin\":\"vector_transform\",\"uid\":22},{\"plugin\":\"const_float_generator\",\"uid\":23,\"state\":{\"val\":0.5}},{\"plugin\":\"negate_modulator\",\"uid\":24},{\"plugin\":\"input_proxy\",\"uid\":25,\"dsid\":13,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]}],\"conns\":[{\"src_nuid\":4,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":5,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":6,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":7,\"dst_nuid\":4,\"src_slot\":0,\"dst_slot\":3},{\"src_nuid\":21,\"dst_nuid\":22,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":6,\"dst_nuid\":22,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":23,\"dst_nuid\":21,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":22,\"dst_nuid\":4,\"src_slot\":0,\"dst_slot\":4},{\"src_nuid\":0,\"dst_nuid\":6,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":1,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":24,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":2,\"dst_nuid\":24,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":25,\"dst_nuid\":21,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true}]},\"dyn_in\":[{\"dt\":0,\"uid\":0},{\"dt\":0,\"uid\":1},{\"dt\":0,\"uid\":2},{\"dt\":0,\"uid\":5}],\"dyn_out\":[{\"dt\":6,\"uid\":3}]},{\"plugin\":\"slider_float_generator\",\"uid\":1,\"state\":{\"val\":-24,\"min\":-180,\"max\":180}},{\"plugin\":\"slider_float_generator\",\"uid\":2,\"state\":{\"val\":1.9333333333333333,\"min\":0,\"max\":2}},{\"plugin\":\"slider_float_generator\",\"uid\":3,\"state\":{\"val\":5.666666666666666,\"min\":0,\"max\":10}},{\"plugin\":\"slider_float_generator\",\"uid\":4,\"state\":{\"val\":0.8333333333333333,\"min\":0,\"max\":10}},{\"plugin\":\"graph\",\"uid\":5,\"dsid\":2,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"14\":1},\"output_sids\":{}},\"graph\":{\"node_uid\":15,\"uid\":66,\"parent_uid\":64,\"nodes\":[{\"plugin\":\"mesh_renderer_emitter\",\"uid\":0},{\"plugin\":\"flat_shader\",\"uid\":1},{\"plugin\":\"quad_mesh_generator\",\"uid\":10},{\"plugin\":\"graph\",\"uid\":13,\"dsid\":11,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"29\":10},\"output_sids\":{\"9\":0}},\"graph\":{\"node_uid\":30,\"uid\":67,\"parent_uid\":66,\"nodes\":[{\"plugin\":\"material_diffuse_color_modulator\",\"uid\":1},{\"plugin\":\"output_proxy\",\"uid\":9,\"dsid\":17,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":12,\"uid\":0}]},{\"plugin\":\"material_blend_mode_modulator\",\"uid\":10},{\"plugin\":\"material_z_buffer_modulator\",\"uid\":27},{\"plugin\":\"toggle_button\",\"uid\":28,\"state\":{\"enabled\":false}},{\"plugin\":\"input_proxy\",\"uid\":29,\"dsid\":5,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":3,\"uid\":0}]}],\"conns\":[{\"src_nuid\":10,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":1,\"dst_nuid\":9,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":27,\"dst_nuid\":10,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":28,\"dst_nuid\":27,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":29,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true}]},\"dyn_in\":[{\"dt\":3,\"uid\":10}],\"dyn_out\":[{\"dt\":12,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":14,\"dsid\":5,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":3,\"uid\":0}]}],\"conns\":[{\"src_nuid\":1,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":10,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":13,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":0,\"src_dyn\":true},{\"src_nuid\":14,\"dst_nuid\":13,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"dt\":3,\"uid\":1}]},{\"plugin\":\"graph\",\"uid\":6,\"dsid\":1,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"35\":0},\"output_sids\":{}},\"graph\":{\"node_uid\":53,\"uid\":68,\"parent_uid\":64,\"nodes\":[{\"plugin\":\"url_scene_generator\",\"uid\":0,\"state\":{\"url\":\"data/scenes/jugi/scene.json\"}},{\"plugin\":\"scene_get_mesh_by_index\",\"uid\":1,\"open\":false},{\"plugin\":\"mesh_renderer_emitter\",\"uid\":2,\"open\":false},{\"plugin\":\"from_mesh_custom_shader\",\"uid\":3,\"dsid\":6,\"state\":{\"vs_src\":\"highp float rand(vec2 co)\\n{\\n    highp float a = 12.9898;\\n    highp float b = 78.233;\\n    highp float c = 43758.5453;\\n    highp float dt= dot(co.xy ,vec2(a,b));\\n    highp float sn= mod(dt,3.14);\\n    \\n    return fract(sin(sn) * c);\\n}\\n\\nvoid main(void) {\\n    float idx = v_pos.y * 100.0 + v_pos.x;\\n    float amp = rand(v_pos.xy) * amp_multiplier;\\n    vec4 tp = m_mat * vec4(v_pos + vec3(0.0, 0.0, amp), 1.0);\\n\\n    tp = v_mat * tp;\\n    gl_Position = p_mat * tp;\\n    gl_PointSize = size / gl_Position.z;\\n    f_col = d_col;\\n    f_col.a = 1.0 / ((length(gl_Position) * 1.0) + 1.0);\\n    f_norm = n_mat * v_norm;\\n}\",\"ps_src\":\"void main(void) {\\n    vec4 fc = vec4(0.0, 0.0, 0.0, f_col.a);\\n    fc.rgb = f_col.rgb * texture2D(sprite, gl_PointCoord).rgb;\\n    fc.rgb += a_col.rgb;\\n\\n    gl_FragColor = fc;\\n}\",\"changed\":true,\"slot_ids\":{\"time\":{\"id\":0,\"dt\":{\"id\":0,\"name\":\"Float\"},\"uniform\":null},\"sprite\":{\"id\":2,\"dt\":{\"id\":2,\"name\":\"Texture\"},\"uniform\":{}},\"ampsize\":{\"id\":3,\"dt\":{\"id\":0,\"name\":\"Float\"},\"uniform\":null},\"size\":{\"id\":4,\"dt\":{\"id\":0,\"name\":\"Float\"},\"uniform\":{}},\"amp_multiplier\":{\"id\":5,\"dt\":{\"id\":0,\"name\":\"Float\"},\"uniform\":{}}}},\"dyn_in\":[{\"dt\":0,\"uid\":0},{\"dt\":2,\"uid\":2},{\"dt\":0,\"uid\":3},{\"dt\":0,\"uid\":4},{\"dt\":0,\"uid\":5}]},{\"plugin\":\"clock_generator\",\"uid\":4,\"open\":false},{\"plugin\":\"mesh_primtype_modulator\",\"uid\":5,\"open\":false},{\"plugin\":\"mesh_primtype_generator\",\"uid\":6,\"open\":false,\"state\":{\"type\":0}},{\"plugin\":\"url_texture_generator\",\"uid\":7,\"state\":{\"url\":\"data/textures/flare7.png\"}},{\"plugin\":\"graph\",\"uid\":12,\"dsid\":4,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"8\":1,\"9\":2,\"10\":3},\"output_sids\":{\"1\":0}},\"graph\":{\"node_uid\":21,\"uid\":69,\"parent_uid\":68,\"nodes\":[{\"plugin\":\"rotation_xyz_matrix\",\"uid\":0},{\"plugin\":\"output_proxy\",\"uid\":1,\"dsid\":66,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":8,\"dsid\":66,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":9,\"dsid\":66,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":10,\"dsid\":66,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"const_float_generator\",\"uid\":11,\"state\":{\"val\":180}},{\"plugin\":\"const_float_generator\",\"uid\":12,\"state\":{\"val\":360}},{\"plugin\":\"multiply_modulator\",\"uid\":15},{\"plugin\":\"subtract_modulator\",\"uid\":16},{\"plugin\":\"multiply_modulator\",\"uid\":17},{\"plugin\":\"subtract_modulator\",\"uid\":18},{\"plugin\":\"multiply_modulator\",\"uid\":19},{\"plugin\":\"subtract_modulator\",\"uid\":20}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":15,\"dst_nuid\":16,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":17,\"dst_nuid\":18,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":19,\"dst_nuid\":20,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":8,\"dst_nuid\":15,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":9,\"dst_nuid\":17,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":10,\"dst_nuid\":19,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":12,\"dst_nuid\":15,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":12,\"dst_nuid\":17,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":12,\"dst_nuid\":19,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":11,\"dst_nuid\":16,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":11,\"dst_nuid\":18,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":11,\"dst_nuid\":20,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":16,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":18,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":20,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":2}]},\"dyn_in\":[{\"dt\":0,\"uid\":1},{\"dt\":0,\"uid\":2},{\"dt\":0,\"uid\":3}],\"dyn_out\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"knob_float_generator\",\"uid\":13,\"state\":{\"val\":0}},{\"plugin\":\"knob_float_generator\",\"uid\":14,\"state\":{\"val\":0}},{\"plugin\":\"knob_float_generator\",\"uid\":15,\"state\":{\"val\":1}},{\"plugin\":\"graph\",\"uid\":16,\"open\":false,\"dsid\":8,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"13\":5,\"14\":6,\"15\":7},\"output_sids\":{\"2\":1}},\"graph\":{\"node_uid\":16,\"uid\":70,\"parent_uid\":68,\"nodes\":[{\"plugin\":\"scale_matrix\",\"uid\":0},{\"plugin\":\"output_proxy\",\"uid\":2,\"dsid\":65,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"vector\",\"uid\":3},{\"plugin\":\"input_proxy\",\"uid\":13,\"dsid\":65,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":14,\"dsid\":65,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":15,\"dsid\":65,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":3,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":13,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":14,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":15,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true}]},\"dyn_in\":[{\"dt\":0,\"uid\":5},{\"dt\":0,\"uid\":6},{\"dt\":0,\"uid\":7}],\"dyn_out\":[{\"dt\":4,\"uid\":1}]},{\"plugin\":\"graph\",\"uid\":17,\"open\":false,\"dsid\":8,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"13\":5,\"14\":6,\"15\":7},\"output_sids\":{\"2\":1}},\"graph\":{\"node_uid\":17,\"uid\":71,\"parent_uid\":68,\"nodes\":[{\"plugin\":\"output_proxy\",\"uid\":2,\"dsid\":67,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"vector\",\"uid\":3},{\"plugin\":\"input_proxy\",\"uid\":13,\"dsid\":67,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":14,\"dsid\":67,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":15,\"dsid\":67,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"translation_matrix\",\"uid\":16}],\"conns\":[{\"src_nuid\":13,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":14,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":15,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":3,\"dst_nuid\":16,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":16,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"dt\":0,\"uid\":5},{\"dt\":0,\"uid\":6},{\"dt\":0,\"uid\":7}],\"dyn_out\":[{\"dt\":4,\"uid\":1}]},{\"plugin\":\"slider_float_generator\",\"uid\":18,\"state\":{\"val\":0,\"min\":-2,\"max\":2}},{\"plugin\":\"slider_float_generator\",\"uid\":19,\"state\":{\"val\":0,\"min\":-2,\"max\":2}},{\"plugin\":\"slider_float_generator\",\"uid\":20,\"state\":{\"val\":-2,\"min\":-2,\"max\":2}},{\"plugin\":\"graph\",\"uid\":24,\"open\":false,\"dsid\":4,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"3\":1,\"4\":2,\"5\":3},\"output_sids\":{\"2\":0}},\"graph\":{\"node_uid\":6,\"uid\":72,\"parent_uid\":68,\"nodes\":[{\"plugin\":\"concatenate_matrix_modulator\",\"uid\":0},{\"plugin\":\"concatenate_matrix_modulator\",\"uid\":1},{\"plugin\":\"output_proxy\",\"uid\":2,\"dsid\":65,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":3,\"dsid\":65,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":4,\"dsid\":65,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":5,\"dsid\":65,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":4,\"uid\":0}]}],\"conns\":[{\"src_nuid\":1,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":3,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":4,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":5,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true}]},\"dyn_in\":[{\"dt\":4,\"uid\":1},{\"dt\":4,\"uid\":2},{\"dt\":4,\"uid\":3}],\"dyn_out\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":35,\"dsid\":5,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":6,\"uid\":0}]},{\"plugin\":\"slider_float_generator\",\"uid\":36,\"state\":{\"val\":4.3500000000000005,\"min\":3,\"max\":6}},{\"plugin\":\"const_float_generator\",\"uid\":37,\"open\":false,\"state\":{\"val\":1}},{\"plugin\":\"graph\",\"uid\":38,\"open\":false,\"dsid\":20,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"15\":3,\"21\":4,\"22\":5,\"23\":6,\"24\":7,\"25\":8,\"39\":12,\"40\":13,\"41\":14,\"44\":16,\"47\":18,\"49\":19},\"output_sids\":{\"9\":0}},\"graph\":{\"node_uid\":53,\"uid\":73,\"parent_uid\":68,\"nodes\":[{\"plugin\":\"material_diffuse_color_modulator\",\"uid\":1},{\"plugin\":\"material_alpha_clip_modulator\",\"uid\":5},{\"plugin\":\"toggle_button\",\"uid\":6,\"state\":{\"enabled\":false}},{\"plugin\":\"material_texture_modulator\",\"uid\":7},{\"plugin\":\"output_proxy\",\"uid\":9,\"dsid\":34,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":12,\"uid\":0}]},{\"plugin\":\"material_blend_mode_modulator\",\"uid\":10},{\"plugin\":\"input_proxy\",\"uid\":15,\"dsid\":34,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":2,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":21,\"dsid\":28,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":22,\"dsid\":28,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":23,\"dsid\":28,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":24,\"dsid\":28,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":25,\"dsid\":28,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"convert_hsla_color_modulator\",\"uid\":26},{\"plugin\":\"material_z_buffer_modulator\",\"uid\":27},{\"plugin\":\"toggle_button\",\"uid\":28,\"state\":{\"enabled\":true}},{\"plugin\":\"material_double_sided_modulator\",\"uid\":35},{\"plugin\":\"toggle_button\",\"uid\":36,\"state\":{\"enabled\":false}},{\"plugin\":\"material_ambient_color_modulator\",\"uid\":37},{\"plugin\":\"input_proxy\",\"uid\":39,\"dsid\":29,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":40,\"dsid\":29,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":41,\"dsid\":29,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"convert_hsla_color_modulator\",\"uid\":43},{\"plugin\":\"input_proxy\",\"uid\":44,\"dsid\":18,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":12,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":47,\"dsid\":13,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":13,\"uid\":0}]},{\"plugin\":\"material_light_modulator\",\"uid\":48},{\"plugin\":\"input_proxy\",\"uid\":49,\"dsid\":10,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"toggle_button\",\"uid\":50,\"state\":{\"enabled\":false}}],\"conns\":[{\"src_nuid\":1,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":6,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":5,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":7,\"dst_nuid\":9,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":10,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":15,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":25,\"dst_nuid\":10,\"src_slot\":0,\"dst_slot\":1,\"src_dyn\":true},{\"src_nuid\":21,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":22,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":23,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":24,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":3,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":26,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":27,\"dst_nuid\":10,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":28,\"dst_nuid\":27,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":36,\"dst_nuid\":35,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":37,\"dst_nuid\":35,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":39,\"dst_nuid\":43,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":40,\"dst_nuid\":43,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":41,\"dst_nuid\":43,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":43,\"dst_nuid\":37,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":47,\"dst_nuid\":48,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":44,\"dst_nuid\":48,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":48,\"dst_nuid\":37,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":49,\"dst_nuid\":48,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":50,\"dst_nuid\":27,\"src_slot\":0,\"dst_slot\":2},{\"src_nuid\":35,\"dst_nuid\":27,\"src_slot\":0,\"dst_slot\":0}]},\"dyn_in\":[{\"dt\":2,\"uid\":3},{\"dt\":0,\"uid\":4},{\"dt\":0,\"uid\":5},{\"dt\":0,\"uid\":6},{\"dt\":0,\"uid\":7},{\"dt\":0,\"uid\":8},{\"dt\":0,\"uid\":12},{\"dt\":0,\"uid\":13},{\"dt\":0,\"uid\":14},{\"dt\":12,\"uid\":16},{\"dt\":13,\"uid\":18},{\"dt\":0,\"uid\":19}],\"dyn_out\":[{\"dt\":12,\"uid\":0}]},{\"plugin\":\"knob_float_generator\",\"uid\":40,\"state\":{\"val\":0.5699999999999996}},{\"plugin\":\"knob_float_generator\",\"uid\":41,\"state\":{\"val\":1}},{\"plugin\":\"knob_float_generator\",\"uid\":42,\"state\":{\"val\":1}},{\"plugin\":\"knob_float_generator\",\"uid\":43,\"state\":{\"val\":1}},{\"plugin\":\"blend_mode_generator\",\"uid\":44,\"state\":{\"mode\":1}},{\"plugin\":\"knob_float_generator\",\"uid\":46,\"state\":{\"val\":1}},{\"plugin\":\"knob_float_generator\",\"uid\":47,\"state\":{\"val\":1}},{\"plugin\":\"knob_float_generator\",\"uid\":48,\"state\":{\"val\":0}},{\"plugin\":\"slider_float_generator\",\"uid\":49,\"state\":{\"val\":0.6833333333333333,\"min\":0,\"max\":1}},{\"plugin\":\"slider_float_generator\",\"uid\":50,\"state\":{\"val\":8.833333333333332,\"min\":0,\"max\":10}},{\"plugin\":\"graph\",\"uid\":51,\"dsid\":2,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"7\":1},\"output_sids\":{\"6\":0}},\"graph\":{\"node_uid\":9,\"uid\":74,\"parent_uid\":68,\"nodes\":[{\"plugin\":\"delta_t_generator\",\"uid\":0},{\"plugin\":\"accumulate_modulator\",\"uid\":1,\"state\":{\"value\":-0.04544333333333387}},{\"plugin\":\"multiply_modulator\",\"uid\":2},{\"plugin\":\"output_proxy\",\"uid\":6,\"dsid\":9,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":7,\"dsid\":7,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"const_float_generator\",\"uid\":8,\"state\":{\"val\":0}}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":2,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":1,\"dst_nuid\":6,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":7,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":8,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":1}]},\"dyn_in\":[{\"dt\":0,\"uid\":1}],\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"slider_float_generator\",\"uid\":52,\"state\":{\"val\":-0.0033333333333333335,\"min\":0,\"max\":-0.2}}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":1,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":5,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":3,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":24,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":3,\"src_dyn\":true},{\"src_nuid\":4,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":5,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":7,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":6,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":13,\"dst_nuid\":12,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":14,\"dst_nuid\":12,\"src_slot\":0,\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":12,\"dst_nuid\":24,\"src_slot\":0,\"dst_slot\":1,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":16,\"dst_nuid\":24,\"src_slot\":0,\"dst_slot\":2,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":18,\"dst_nuid\":17,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":19,\"dst_nuid\":17,\"src_slot\":0,\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":20,\"dst_nuid\":17,\"src_slot\":0,\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":17,\"dst_nuid\":24,\"src_slot\":0,\"dst_slot\":0,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":35,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":36,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":3,\"dst_dyn\":true},{\"src_nuid\":37,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":40,\"dst_nuid\":38,\"src_slot\":0,\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":41,\"dst_nuid\":38,\"src_slot\":0,\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":42,\"dst_nuid\":38,\"src_slot\":0,\"dst_slot\":3,\"dst_dyn\":true},{\"src_nuid\":43,\"dst_nuid\":38,\"src_slot\":0,\"dst_slot\":4,\"dst_dyn\":true},{\"src_nuid\":44,\"dst_nuid\":38,\"src_slot\":0,\"dst_slot\":5,\"dst_dyn\":true},{\"src_nuid\":48,\"dst_nuid\":38,\"src_slot\":0,\"dst_slot\":8,\"dst_dyn\":true},{\"src_nuid\":47,\"dst_nuid\":38,\"src_slot\":0,\"dst_slot\":7,\"dst_dyn\":true},{\"src_nuid\":46,\"dst_nuid\":38,\"src_slot\":0,\"dst_slot\":6,\"dst_dyn\":true},{\"src_nuid\":38,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":1,\"src_dyn\":true},{\"src_nuid\":49,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":4,\"dst_dyn\":true},{\"src_nuid\":50,\"dst_nuid\":16,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":50,\"dst_nuid\":16,\"src_slot\":0,\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":50,\"dst_nuid\":16,\"src_slot\":0,\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":52,\"dst_nuid\":51,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":51,\"dst_nuid\":12,\"src_slot\":0,\"dst_slot\":2,\"src_dyn\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"dt\":6,\"uid\":0}]},{\"plugin\":\"graph\",\"uid\":7,\"dsid\":4,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"104\":0,\"118\":1,\"132\":2,\"133\":3},\"output_sids\":{}},\"graph\":{\"node_uid\":134,\"uid\":75,\"parent_uid\":64,\"nodes\":[{\"plugin\":\"graph\",\"uid\":0,\"dsid\":7,\"state\":{\"enabled\":false,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"1\":0,\"2\":1,\"10\":2,\"21\":5,\"23\":6},\"output_sids\":{}},\"graph\":{\"node_uid\":27,\"uid\":76,\"parent_uid\":75,\"nodes\":[{\"plugin\":\"scene_renderer_emitter\",\"uid\":0},{\"plugin\":\"input_proxy\",\"uid\":1,\"dsid\":27,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":11,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":2,\"dsid\":27,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":6,\"uid\":0}]},{\"plugin\":\"scale_matrix\",\"uid\":7},{\"plugin\":\"vector\",\"uid\":8},{\"plugin\":\"divide_modulator\",\"uid\":9},{\"plugin\":\"input_proxy\",\"uid\":10,\"dsid\":27,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"max_modulator\",\"uid\":11},{\"plugin\":\"vector_magnitude\",\"uid\":12},{\"plugin\":\"vector_magnitude\",\"uid\":13},{\"plugin\":\"scene_get_bounding_box\",\"uid\":14},{\"plugin\":\"input_proxy\",\"uid\":21,\"dsid\":26,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":23,\"dsid\":23,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":12,\"uid\":0}]},{\"plugin\":\"concatenate_matrix_modulator\",\"uid\":25}],\"conns\":[{\"src_nuid\":1,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":2,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":8,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":9,\"dst_nuid\":8,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":9,\"dst_nuid\":8,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":9,\"dst_nuid\":8,\"src_slot\":0,\"dst_slot\":2},{\"src_nuid\":10,\"dst_nuid\":9,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":11,\"dst_nuid\":9,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":12,\"dst_nuid\":11,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":13,\"dst_nuid\":11,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":14,\"dst_nuid\":13,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":14,\"dst_nuid\":12,\"src_slot\":1,\"dst_slot\":0},{\"src_nuid\":1,\"dst_nuid\":14,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":23,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":7,\"dst_nuid\":25,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":21,\"dst_nuid\":25,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":25,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":3}]},\"dyn_in\":[{\"dt\":11,\"uid\":0},{\"dt\":6,\"uid\":1},{\"dt\":0,\"uid\":2},{\"dt\":4,\"uid\":5},{\"dt\":12,\"uid\":6}]},{\"plugin\":\"url_scene_generator\",\"uid\":1,\"state\":{\"url\":\"data/scenes/landscape/scene.json\"}},{\"plugin\":\"slider_float_generator\",\"uid\":6,\"state\":{\"val\":14.666666666666666,\"min\":0,\"max\":20}},{\"plugin\":\"graph\",\"uid\":81,\"dsid\":18,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"21\":4,\"22\":5,\"23\":6,\"24\":7,\"25\":8,\"34\":10,\"39\":12,\"40\":13,\"41\":14,\"44\":16},\"output_sids\":{\"9\":0}},\"graph\":{\"node_uid\":47,\"uid\":77,\"parent_uid\":75,\"nodes\":[{\"plugin\":\"material_diffuse_color_modulator\",\"uid\":1},{\"plugin\":\"material_alpha_clip_modulator\",\"uid\":5},{\"plugin\":\"toggle_button\",\"uid\":6,\"state\":{\"enabled\":false}},{\"plugin\":\"output_proxy\",\"uid\":9,\"dsid\":42,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":12,\"uid\":0}]},{\"plugin\":\"material_blend_mode_modulator\",\"uid\":10},{\"plugin\":\"input_proxy\",\"uid\":21,\"dsid\":36,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":22,\"dsid\":36,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":23,\"dsid\":36,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":24,\"dsid\":36,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":25,\"dsid\":36,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"convert_hsla_color_modulator\",\"uid\":26},{\"plugin\":\"material_z_buffer_modulator\",\"uid\":27},{\"plugin\":\"toggle_button\",\"uid\":28,\"state\":{\"enabled\":false}},{\"plugin\":\"material_shinyness_modulator\",\"uid\":31},{\"plugin\":\"graph\",\"uid\":32,\"dsid\":3,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"9\":0},\"output_sids\":{\"12\":2}},\"graph\":{\"node_uid\":13,\"uid\":78,\"parent_uid\":77,\"nodes\":[{\"plugin\":\"const_float_generator\",\"uid\":2,\"state\":{\"val\":10}},{\"plugin\":\"subtract_modulator\",\"uid\":3},{\"plugin\":\"absolute_modulator\",\"uid\":4},{\"plugin\":\"multiply_modulator\",\"uid\":5},{\"plugin\":\"add_modulator\",\"uid\":7},{\"plugin\":\"min_modulator\",\"uid\":8},{\"plugin\":\"input_proxy\",\"uid\":9,\"dsid\":34,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"const_float_generator\",\"uid\":11,\"state\":{\"val\":0}},{\"plugin\":\"output_proxy\",\"uid\":12,\"dsid\":34,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":0,\"uid\":0}]}],\"conns\":[{\"src_nuid\":2,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":2,\"dst_nuid\":8,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":3,\"dst_nuid\":4,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":4,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":5,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":8,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":9,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":11,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":11,\"dst_nuid\":8,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":7,\"dst_nuid\":12,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"dt\":0,\"uid\":0}],\"dyn_out\":[{\"dt\":0,\"uid\":2}]},{\"plugin\":\"input_proxy\",\"uid\":34,\"dsid\":30,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"material_double_sided_modulator\",\"uid\":35},{\"plugin\":\"toggle_button\",\"uid\":36,\"state\":{\"enabled\":true}},{\"plugin\":\"material_ambient_color_modulator\",\"uid\":37},{\"plugin\":\"input_proxy\",\"uid\":39,\"dsid\":37,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":40,\"dsid\":37,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":41,\"dsid\":37,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"convert_hsla_color_modulator\",\"uid\":43},{\"plugin\":\"input_proxy\",\"uid\":44,\"dsid\":26,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":12,\"uid\":0}]}],\"conns\":[{\"src_nuid\":1,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":6,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":10,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":25,\"dst_nuid\":10,\"src_slot\":0,\"dst_slot\":1,\"src_dyn\":true},{\"src_nuid\":21,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":22,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":23,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":24,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":3,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":26,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":27,\"dst_nuid\":10,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":28,\"dst_nuid\":27,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":31,\"dst_nuid\":27,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":32,\"dst_nuid\":31,\"src_slot\":0,\"dst_slot\":1,\"src_dyn\":true},{\"src_nuid\":34,\"dst_nuid\":32,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":35,\"dst_nuid\":31,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":36,\"dst_nuid\":35,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":37,\"dst_nuid\":35,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":39,\"dst_nuid\":43,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":40,\"dst_nuid\":43,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":41,\"dst_nuid\":43,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":43,\"dst_nuid\":37,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":44,\"dst_nuid\":37,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":5,\"dst_nuid\":9,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"dt\":0,\"uid\":4},{\"dt\":0,\"uid\":5},{\"dt\":0,\"uid\":6},{\"dt\":0,\"uid\":7},{\"dt\":0,\"uid\":8},{\"dt\":0,\"uid\":10},{\"dt\":0,\"uid\":12},{\"dt\":0,\"uid\":13},{\"dt\":0,\"uid\":14},{\"dt\":12,\"uid\":16}],\"dyn_out\":[{\"dt\":12,\"uid\":0}]},{\"plugin\":\"knob_float_generator\",\"uid\":82,\"state\":{\"val\":0.5799999999999996}},{\"plugin\":\"knob_float_generator\",\"uid\":83,\"state\":{\"val\":0.2199999999999993}},{\"plugin\":\"knob_float_generator\",\"uid\":84,\"state\":{\"val\":0}},{\"plugin\":\"knob_float_generator\",\"uid\":85,\"state\":{\"val\":1}},{\"plugin\":\"blend_mode_generator\",\"uid\":86,\"state\":{\"mode\":4}},{\"plugin\":\"knob_float_generator\",\"uid\":87,\"state\":{\"val\":0.09999999999999999}},{\"plugin\":\"knob_float_generator\",\"uid\":88,\"state\":{\"val\":1}},{\"plugin\":\"knob_float_generator\",\"uid\":89,\"state\":{\"val\":0.7300000000000004}},{\"plugin\":\"knob_float_generator\",\"uid\":90,\"state\":{\"val\":0.029999999999999805}},{\"plugin\":\"input_proxy\",\"uid\":104,\"dsid\":12,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":6,\"uid\":0}]},{\"plugin\":\"graph\",\"uid\":105,\"open\":false,\"dsid\":4,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"8\":1,\"9\":2,\"10\":3},\"output_sids\":{\"1\":0}},\"graph\":{\"node_uid\":21,\"uid\":79,\"parent_uid\":75,\"nodes\":[{\"plugin\":\"rotation_xyz_matrix\",\"uid\":0},{\"plugin\":\"output_proxy\",\"uid\":1,\"dsid\":70,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":8,\"dsid\":70,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":9,\"dsid\":70,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":10,\"dsid\":70,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"const_float_generator\",\"uid\":11,\"state\":{\"val\":180}},{\"plugin\":\"const_float_generator\",\"uid\":12,\"state\":{\"val\":360}},{\"plugin\":\"multiply_modulator\",\"uid\":15},{\"plugin\":\"subtract_modulator\",\"uid\":16},{\"plugin\":\"multiply_modulator\",\"uid\":17},{\"plugin\":\"subtract_modulator\",\"uid\":18},{\"plugin\":\"multiply_modulator\",\"uid\":19},{\"plugin\":\"subtract_modulator\",\"uid\":20}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":15,\"dst_nuid\":16,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":17,\"dst_nuid\":18,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":19,\"dst_nuid\":20,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":8,\"dst_nuid\":15,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":9,\"dst_nuid\":17,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":10,\"dst_nuid\":19,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":12,\"dst_nuid\":15,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":12,\"dst_nuid\":17,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":12,\"dst_nuid\":19,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":11,\"dst_nuid\":16,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":11,\"dst_nuid\":18,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":11,\"dst_nuid\":20,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":16,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":18,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":20,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":2}]},\"dyn_in\":[{\"dt\":0,\"uid\":1},{\"dt\":0,\"uid\":2},{\"dt\":0,\"uid\":3}],\"dyn_out\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"knob_float_generator\",\"uid\":106,\"state\":{\"val\":0}},{\"plugin\":\"knob_float_generator\",\"uid\":107,\"state\":{\"val\":0}},{\"plugin\":\"graph\",\"uid\":109,\"dsid\":8,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"13\":5,\"14\":6,\"15\":7},\"output_sids\":{\"2\":1}},\"graph\":{\"node_uid\":16,\"uid\":80,\"parent_uid\":75,\"nodes\":[{\"plugin\":\"scale_matrix\",\"uid\":0},{\"plugin\":\"output_proxy\",\"uid\":2,\"dsid\":69,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"vector\",\"uid\":3},{\"plugin\":\"input_proxy\",\"uid\":13,\"dsid\":69,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":14,\"dsid\":69,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":15,\"dsid\":69,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":3,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":13,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":14,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":15,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true}]},\"dyn_in\":[{\"dt\":0,\"uid\":5},{\"dt\":0,\"uid\":6},{\"dt\":0,\"uid\":7}],\"dyn_out\":[{\"dt\":4,\"uid\":1}]},{\"plugin\":\"graph\",\"uid\":110,\"dsid\":8,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"13\":5,\"14\":6,\"15\":7},\"output_sids\":{\"2\":1}},\"graph\":{\"node_uid\":17,\"uid\":81,\"parent_uid\":75,\"nodes\":[{\"plugin\":\"output_proxy\",\"uid\":2,\"dsid\":71,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"vector\",\"uid\":3},{\"plugin\":\"input_proxy\",\"uid\":13,\"dsid\":71,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":14,\"dsid\":71,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":15,\"dsid\":71,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"translation_matrix\",\"uid\":16}],\"conns\":[{\"src_nuid\":13,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":14,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":15,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":3,\"dst_nuid\":16,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":16,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"dt\":0,\"uid\":5},{\"dt\":0,\"uid\":6},{\"dt\":0,\"uid\":7}],\"dyn_out\":[{\"dt\":4,\"uid\":1}]},{\"plugin\":\"slider_float_generator\",\"uid\":111,\"state\":{\"val\":0,\"min\":-2,\"max\":2}},{\"plugin\":\"slider_float_generator\",\"uid\":112,\"state\":{\"val\":0,\"min\":-2,\"max\":2}},{\"plugin\":\"slider_float_generator\",\"uid\":113,\"state\":{\"val\":0,\"min\":-2,\"max\":2}},{\"plugin\":\"graph\",\"uid\":114,\"open\":false,\"dsid\":4,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"3\":1,\"4\":2,\"5\":3},\"output_sids\":{\"2\":0}},\"graph\":{\"node_uid\":6,\"uid\":82,\"parent_uid\":75,\"nodes\":[{\"plugin\":\"concatenate_matrix_modulator\",\"uid\":0},{\"plugin\":\"concatenate_matrix_modulator\",\"uid\":1},{\"plugin\":\"output_proxy\",\"uid\":2,\"dsid\":69,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":3,\"dsid\":69,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":4,\"dsid\":69,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":5,\"dsid\":69,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":4,\"uid\":0}]}],\"conns\":[{\"src_nuid\":1,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":3,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":4,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":5,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true}]},\"dyn_in\":[{\"dt\":4,\"uid\":1},{\"dt\":4,\"uid\":2},{\"dt\":4,\"uid\":3}],\"dyn_out\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"slider_float_generator\",\"uid\":115,\"state\":{\"val\":1,\"min\":0,\"max\":10}},{\"plugin\":\"input_proxy\",\"uid\":118,\"dsid\":6,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"url_texture_generator\",\"uid\":119,\"state\":{\"url\":\"data/textures/backdrop_grey2.jpg\"}},{\"plugin\":\"material_texture_modulator\",\"uid\":120,\"open\":false},{\"plugin\":\"from_mesh_custom_shader\",\"uid\":121,\"dsid\":2,\"state\":{\"vs_src\":\"void main(void) {\\n    vec4 tp = m_mat * vec4(v_pos, 1.0);\\n\\n    tp = v_mat * tp;\\n    gl_Position = p_mat * tp;\\n    f_col = d_col;\\n    f_norm = n_mat * v_norm;\\n    f_uv0 = v_uv0;\\n}\",\"ps_src\":\"void main(void) {\\n    float d = clamp((gl_FragCoord.z / gl_FragCoord.w) * fd, 0.0, 1.0);\\n    vec4 fc = vec4(0.0, 0.0, 0.0, f_col.a);\\n    \\n    fc.rgb = f_col.rgb;\\n    fc *= texture2D(d_tex, f_uv0.st);\\n    fc.rgb += a_col.rgb;\\n    fc.rbg = mix(fog_color.rbg, fc.rgb, 1.0 - d);\\n    \\n    gl_FragColor = fc; // vec4(d, d, d, 1.0);\\n}\",\"changed\":true,\"slot_ids\":{\"fog_color\":{\"id\":0,\"dt\":{\"id\":3,\"name\":\"Color\"},\"uniform\":{}},\"fd\":{\"id\":1,\"dt\":{\"id\":0,\"name\":\"Float\"},\"uniform\":{}}}},\"dyn_in\":[{\"dt\":3,\"uid\":0},{\"dt\":0,\"uid\":1}]},{\"plugin\":\"mesh_renderer_emitter\",\"uid\":124},{\"plugin\":\"toggle_button\",\"uid\":130,\"state\":{\"enabled\":false}},{\"plugin\":\"graph\",\"uid\":131,\"dsid\":2,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"8\":1},\"output_sids\":{\"7\":0}},\"graph\":{\"node_uid\":9,\"uid\":83,\"parent_uid\":75,\"nodes\":[{\"plugin\":\"scene_get_mesh_count\",\"uid\":1},{\"plugin\":\"subtract_modulator\",\"uid\":2},{\"plugin\":\"const_float_generator\",\"uid\":3,\"state\":{\"val\":1}},{\"plugin\":\"scene_get_mesh_by_index\",\"uid\":4},{\"plugin\":\"multiply_modulator\",\"uid\":5},{\"plugin\":\"slider_float_generator\",\"uid\":6,\"state\":{\"val\":4.5,\"min\":0,\"max\":5}},{\"plugin\":\"output_proxy\",\"uid\":7,\"dsid\":13,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":9,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":8,\"dsid\":5,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":11,\"uid\":0}]}],\"conns\":[{\"src_nuid\":1,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":3,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":2,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":5,\"dst_nuid\":4,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":6,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":4,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":8,\"dst_nuid\":4,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":8,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true}]},\"dyn_in\":[{\"dt\":11,\"uid\":1}],\"dyn_out\":[{\"dt\":9,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":132,\"dsid\":5,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":3,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":133,\"dsid\":4,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]}],\"conns\":[{\"src_nuid\":1,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":6,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":82,\"dst_nuid\":81,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":83,\"dst_nuid\":81,\"src_slot\":0,\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":84,\"dst_nuid\":81,\"src_slot\":0,\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":85,\"dst_nuid\":81,\"src_slot\":0,\"dst_slot\":3,\"dst_dyn\":true},{\"src_nuid\":86,\"dst_nuid\":81,\"src_slot\":0,\"dst_slot\":4,\"dst_dyn\":true},{\"src_nuid\":87,\"dst_nuid\":81,\"src_slot\":0,\"dst_slot\":5,\"dst_dyn\":true},{\"src_nuid\":90,\"dst_nuid\":81,\"src_slot\":0,\"dst_slot\":8,\"dst_dyn\":true},{\"src_nuid\":89,\"dst_nuid\":81,\"src_slot\":0,\"dst_slot\":7,\"dst_dyn\":true},{\"src_nuid\":88,\"dst_nuid\":81,\"src_slot\":0,\"dst_slot\":6,\"dst_dyn\":true},{\"src_nuid\":81,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":4,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":104,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":106,\"dst_nuid\":105,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":107,\"dst_nuid\":105,\"src_slot\":0,\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":105,\"dst_nuid\":114,\"src_slot\":0,\"dst_slot\":1,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":115,\"dst_nuid\":109,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":115,\"dst_nuid\":109,\"src_slot\":0,\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":115,\"dst_nuid\":109,\"src_slot\":0,\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":109,\"dst_nuid\":114,\"src_slot\":0,\"dst_slot\":2,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":111,\"dst_nuid\":110,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":113,\"dst_nuid\":110,\"src_slot\":0,\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":110,\"dst_nuid\":114,\"src_slot\":0,\"dst_slot\":0,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":114,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":3,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":119,\"dst_nuid\":120,\"src_slot\":0,\"dst_slot\":2},{\"src_nuid\":120,\"dst_nuid\":81,\"src_slot\":0,\"dst_slot\":9,\"dst_dyn\":true},{\"src_nuid\":121,\"dst_nuid\":124,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":130,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":131,\"dst_nuid\":121,\"src_slot\":0,\"dst_slot\":0,\"src_dyn\":true},{\"src_nuid\":131,\"dst_nuid\":124,\"src_slot\":0,\"dst_slot\":0,\"src_dyn\":true},{\"src_nuid\":1,\"dst_nuid\":131,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":81,\"dst_nuid\":121,\"src_slot\":0,\"dst_slot\":1,\"src_dyn\":true},{\"src_nuid\":114,\"dst_nuid\":124,\"src_slot\":0,\"dst_slot\":3,\"src_dyn\":true},{\"src_nuid\":104,\"dst_nuid\":124,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":132,\"dst_nuid\":121,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":133,\"dst_nuid\":121,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":107,\"dst_nuid\":105,\"src_slot\":0,\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":118,\"dst_nuid\":110,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"dt\":6,\"uid\":0},{\"dt\":0,\"uid\":1},{\"dt\":3,\"uid\":2},{\"dt\":0,\"uid\":3}]},{\"plugin\":\"graph\",\"uid\":8,\"dsid\":2,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"35\":0,\"64\":1},\"output_sids\":{}},\"graph\":{\"node_uid\":77,\"uid\":84,\"parent_uid\":64,\"nodes\":[{\"plugin\":\"url_scene_generator\",\"uid\":0,\"state\":{\"url\":\"data/scenes/landscape/scene.json\"}},{\"plugin\":\"scene_get_mesh_by_index\",\"uid\":1,\"open\":false},{\"plugin\":\"mesh_renderer_emitter\",\"uid\":2,\"open\":false},{\"plugin\":\"from_mesh_custom_shader\",\"uid\":3,\"dsid\":6,\"state\":{\"vs_src\":\"highp float rand(vec2 co)\\n{\\n    highp float a = 12.9898;\\n    highp float b = 78.233;\\n    highp float c = 43758.5453;\\n    highp float dt= dot(co.xy ,vec2(a,b));\\n    highp float sn= mod(dt,3.14);\\n    \\n    return fract(sin(sn) * c);\\n}\\n\\nvoid main(void) {\\n    float idx = v_pos.y * 100.0 + v_pos.x;\\n    float amp = rand(v_pos.xy) * amp_multiplier;\\n    vec4 tp = m_mat * vec4(v_pos + vec3(0.0, 0.0, amp), 1.0);\\n\\n    tp = v_mat * tp;\\n    gl_Position = p_mat * tp;\\n    gl_PointSize = size / gl_Position.z;\\n    f_col = d_col;\\n    f_col.a = 1.0 / ((length(gl_Position) * 1.0) + 1.0);\\n    f_norm = n_mat * v_norm;\\n}\",\"ps_src\":\"void main(void) {\\n    vec4 fc = vec4(0.0, 0.0, 0.0, f_col.a);\\n    fc.rgb = f_col.rgb * texture2D(sprite, gl_PointCoord).rgb;\\n    fc.rgb += a_col.rgb;\\n\\n    gl_FragColor = fc;\\n}\",\"changed\":true,\"slot_ids\":{\"time\":{\"id\":0,\"dt\":{\"id\":0,\"name\":\"Float\"},\"uniform\":null},\"sprite\":{\"id\":2,\"dt\":{\"id\":2,\"name\":\"Texture\"},\"uniform\":{}},\"ampsize\":{\"id\":3,\"dt\":{\"id\":0,\"name\":\"Float\"},\"uniform\":null},\"size\":{\"id\":4,\"dt\":{\"id\":0,\"name\":\"Float\"},\"uniform\":{}},\"amp_multiplier\":{\"id\":5,\"dt\":{\"id\":0,\"name\":\"Float\"},\"uniform\":{}}}},\"dyn_in\":[{\"dt\":0,\"uid\":0},{\"dt\":2,\"uid\":2},{\"dt\":0,\"uid\":3},{\"dt\":0,\"uid\":4},{\"dt\":0,\"uid\":5}]},{\"plugin\":\"clock_generator\",\"uid\":4,\"open\":false},{\"plugin\":\"mesh_primtype_modulator\",\"uid\":5,\"open\":false},{\"plugin\":\"mesh_primtype_generator\",\"uid\":6,\"open\":false,\"state\":{\"type\":0}},{\"plugin\":\"url_texture_generator\",\"uid\":7,\"state\":{\"url\":\"data/textures/flare4.png\"}},{\"plugin\":\"graph\",\"uid\":12,\"open\":false,\"dsid\":4,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"8\":1,\"9\":2,\"10\":3},\"output_sids\":{\"1\":0}},\"graph\":{\"node_uid\":21,\"uid\":85,\"parent_uid\":84,\"nodes\":[{\"plugin\":\"rotation_xyz_matrix\",\"uid\":0},{\"plugin\":\"output_proxy\",\"uid\":1,\"dsid\":69,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":8,\"dsid\":69,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":9,\"dsid\":69,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":10,\"dsid\":69,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"const_float_generator\",\"uid\":11,\"state\":{\"val\":180}},{\"plugin\":\"const_float_generator\",\"uid\":12,\"state\":{\"val\":360}},{\"plugin\":\"multiply_modulator\",\"uid\":15},{\"plugin\":\"subtract_modulator\",\"uid\":16},{\"plugin\":\"multiply_modulator\",\"uid\":17},{\"plugin\":\"subtract_modulator\",\"uid\":18},{\"plugin\":\"multiply_modulator\",\"uid\":19},{\"plugin\":\"subtract_modulator\",\"uid\":20}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":15,\"dst_nuid\":16,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":17,\"dst_nuid\":18,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":19,\"dst_nuid\":20,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":8,\"dst_nuid\":15,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":9,\"dst_nuid\":17,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":10,\"dst_nuid\":19,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":12,\"dst_nuid\":15,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":12,\"dst_nuid\":17,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":12,\"dst_nuid\":19,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":11,\"dst_nuid\":16,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":11,\"dst_nuid\":18,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":11,\"dst_nuid\":20,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":16,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":18,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":20,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":2}]},\"dyn_in\":[{\"dt\":0,\"uid\":1},{\"dt\":0,\"uid\":2},{\"dt\":0,\"uid\":3}],\"dyn_out\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"knob_float_generator\",\"uid\":13,\"state\":{\"val\":0}},{\"plugin\":\"knob_float_generator\",\"uid\":14,\"state\":{\"val\":0}},{\"plugin\":\"knob_float_generator\",\"uid\":15,\"state\":{\"val\":0.2900000000000001}},{\"plugin\":\"graph\",\"uid\":16,\"open\":false,\"dsid\":8,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"13\":5,\"14\":6,\"15\":7},\"output_sids\":{\"2\":1}},\"graph\":{\"node_uid\":16,\"uid\":86,\"parent_uid\":84,\"nodes\":[{\"plugin\":\"scale_matrix\",\"uid\":0},{\"plugin\":\"output_proxy\",\"uid\":2,\"dsid\":68,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"vector\",\"uid\":3},{\"plugin\":\"input_proxy\",\"uid\":13,\"dsid\":68,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":14,\"dsid\":68,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":15,\"dsid\":68,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":3,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":13,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":14,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":15,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true}]},\"dyn_in\":[{\"dt\":0,\"uid\":5},{\"dt\":0,\"uid\":6},{\"dt\":0,\"uid\":7}],\"dyn_out\":[{\"dt\":4,\"uid\":1}]},{\"plugin\":\"graph\",\"uid\":17,\"open\":false,\"dsid\":8,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"13\":5,\"14\":6,\"15\":7},\"output_sids\":{\"2\":1}},\"graph\":{\"node_uid\":17,\"uid\":87,\"parent_uid\":84,\"nodes\":[{\"plugin\":\"output_proxy\",\"uid\":2,\"dsid\":70,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"vector\",\"uid\":3},{\"plugin\":\"input_proxy\",\"uid\":13,\"dsid\":70,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":14,\"dsid\":70,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":15,\"dsid\":70,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"translation_matrix\",\"uid\":16}],\"conns\":[{\"src_nuid\":13,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":14,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":15,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":3,\"dst_nuid\":16,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":16,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"dt\":0,\"uid\":5},{\"dt\":0,\"uid\":6},{\"dt\":0,\"uid\":7}],\"dyn_out\":[{\"dt\":4,\"uid\":1}]},{\"plugin\":\"slider_float_generator\",\"uid\":18,\"state\":{\"val\":0,\"min\":-2,\"max\":2}},{\"plugin\":\"slider_float_generator\",\"uid\":19,\"state\":{\"val\":3,\"min\":3,\"max\":6}},{\"plugin\":\"slider_float_generator\",\"uid\":20,\"state\":{\"val\":0,\"min\":-2,\"max\":2}},{\"plugin\":\"graph\",\"uid\":24,\"open\":false,\"dsid\":4,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"3\":1,\"4\":2,\"5\":3},\"output_sids\":{\"2\":0}},\"graph\":{\"node_uid\":6,\"uid\":88,\"parent_uid\":84,\"nodes\":[{\"plugin\":\"concatenate_matrix_modulator\",\"uid\":0},{\"plugin\":\"concatenate_matrix_modulator\",\"uid\":1},{\"plugin\":\"output_proxy\",\"uid\":2,\"dsid\":68,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":3,\"dsid\":68,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":4,\"dsid\":68,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":5,\"dsid\":68,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":4,\"uid\":0}]}],\"conns\":[{\"src_nuid\":1,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":3,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":4,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":5,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true}]},\"dyn_in\":[{\"dt\":4,\"uid\":1},{\"dt\":4,\"uid\":2},{\"dt\":4,\"uid\":3}],\"dyn_out\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":35,\"dsid\":8,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":6,\"uid\":0}]},{\"plugin\":\"slider_float_generator\",\"uid\":36,\"state\":{\"val\":100,\"min\":5,\"max\":100}},{\"plugin\":\"const_float_generator\",\"uid\":37,\"open\":false,\"state\":{\"val\":1}},{\"plugin\":\"graph\",\"uid\":38,\"open\":false,\"dsid\":20,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"15\":3,\"21\":4,\"22\":5,\"23\":6,\"24\":7,\"25\":8,\"39\":12,\"40\":13,\"41\":14,\"44\":16,\"47\":18,\"49\":19},\"output_sids\":{\"9\":0}},\"graph\":{\"node_uid\":53,\"uid\":89,\"parent_uid\":84,\"nodes\":[{\"plugin\":\"material_diffuse_color_modulator\",\"uid\":1},{\"plugin\":\"material_alpha_clip_modulator\",\"uid\":5},{\"plugin\":\"toggle_button\",\"uid\":6,\"state\":{\"enabled\":false}},{\"plugin\":\"material_texture_modulator\",\"uid\":7},{\"plugin\":\"output_proxy\",\"uid\":9,\"dsid\":37,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":12,\"uid\":0}]},{\"plugin\":\"material_blend_mode_modulator\",\"uid\":10},{\"plugin\":\"input_proxy\",\"uid\":15,\"dsid\":37,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":2,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":21,\"dsid\":31,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":22,\"dsid\":31,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":23,\"dsid\":31,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":24,\"dsid\":31,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":25,\"dsid\":31,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"convert_hsla_color_modulator\",\"uid\":26},{\"plugin\":\"material_z_buffer_modulator\",\"uid\":27},{\"plugin\":\"toggle_button\",\"uid\":28,\"state\":{\"enabled\":true}},{\"plugin\":\"material_double_sided_modulator\",\"uid\":35},{\"plugin\":\"toggle_button\",\"uid\":36,\"state\":{\"enabled\":false}},{\"plugin\":\"material_ambient_color_modulator\",\"uid\":37},{\"plugin\":\"input_proxy\",\"uid\":39,\"dsid\":32,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":40,\"dsid\":32,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":41,\"dsid\":32,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"convert_hsla_color_modulator\",\"uid\":43},{\"plugin\":\"input_proxy\",\"uid\":44,\"dsid\":21,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":12,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":47,\"dsid\":16,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":13,\"uid\":0}]},{\"plugin\":\"material_light_modulator\",\"uid\":48},{\"plugin\":\"input_proxy\",\"uid\":49,\"dsid\":13,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"toggle_button\",\"uid\":50,\"state\":{\"enabled\":false}}],\"conns\":[{\"src_nuid\":1,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":6,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":5,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":7,\"dst_nuid\":9,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":10,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":15,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":25,\"dst_nuid\":10,\"src_slot\":0,\"dst_slot\":1,\"src_dyn\":true},{\"src_nuid\":21,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":22,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":23,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":24,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":3,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":26,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":27,\"dst_nuid\":10,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":28,\"dst_nuid\":27,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":36,\"dst_nuid\":35,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":37,\"dst_nuid\":35,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":39,\"dst_nuid\":43,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":40,\"dst_nuid\":43,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":41,\"dst_nuid\":43,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":43,\"dst_nuid\":37,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":47,\"dst_nuid\":48,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":44,\"dst_nuid\":48,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":48,\"dst_nuid\":37,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":49,\"dst_nuid\":48,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":50,\"dst_nuid\":27,\"src_slot\":0,\"dst_slot\":2},{\"src_nuid\":35,\"dst_nuid\":27,\"src_slot\":0,\"dst_slot\":0}]},\"dyn_in\":[{\"dt\":2,\"uid\":3},{\"dt\":0,\"uid\":4},{\"dt\":0,\"uid\":5},{\"dt\":0,\"uid\":6},{\"dt\":0,\"uid\":7},{\"dt\":0,\"uid\":8},{\"dt\":0,\"uid\":12},{\"dt\":0,\"uid\":13},{\"dt\":0,\"uid\":14},{\"dt\":12,\"uid\":16},{\"dt\":13,\"uid\":18},{\"dt\":0,\"uid\":19}],\"dyn_out\":[{\"dt\":12,\"uid\":0}]},{\"plugin\":\"knob_float_generator\",\"uid\":40,\"state\":{\"val\":0.5399999999999995}},{\"plugin\":\"knob_float_generator\",\"uid\":41,\"state\":{\"val\":1}},{\"plugin\":\"knob_float_generator\",\"uid\":42,\"state\":{\"val\":0.24000000000000007}},{\"plugin\":\"knob_float_generator\",\"uid\":43,\"state\":{\"val\":1}},{\"plugin\":\"blend_mode_generator\",\"uid\":44,\"state\":{\"mode\":1}},{\"plugin\":\"knob_float_generator\",\"uid\":46,\"state\":{\"val\":1}},{\"plugin\":\"knob_float_generator\",\"uid\":47,\"state\":{\"val\":1}},{\"plugin\":\"knob_float_generator\",\"uid\":48,\"state\":{\"val\":0}},{\"plugin\":\"slider_float_generator\",\"uid\":49,\"state\":{\"val\":1,\"min\":0,\"max\":10}},{\"plugin\":\"slider_float_generator\",\"uid\":51,\"state\":{\"val\":0,\"min\":0,\"max\":2}},{\"plugin\":\"graph\",\"uid\":56,\"dsid\":5,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"13\":1,\"14\":2,\"15\":3},\"output_sids\":{\"12\":0}},\"graph\":{\"node_uid\":25,\"uid\":90,\"parent_uid\":84,\"nodes\":[{\"plugin\":\"sine_modulator\",\"uid\":1},{\"plugin\":\"subtract_modulator\",\"uid\":4},{\"plugin\":\"convert_oscilator_unit_modulator\",\"uid\":5},{\"plugin\":\"multiply_modulator\",\"uid\":6},{\"plugin\":\"add_modulator\",\"uid\":7},{\"plugin\":\"output_proxy\",\"uid\":12,\"dsid\":13,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":13,\"dsid\":11,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":14,\"dsid\":11,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":15,\"dsid\":11,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"delta_t_generator\",\"uid\":18},{\"plugin\":\"accumulate_modulator\",\"uid\":19,\"state\":{\"value\":1.590516666666654}},{\"plugin\":\"multiply_modulator\",\"uid\":20},{\"plugin\":\"const_float_generator\",\"uid\":24,\"state\":{\"val\":0}}],\"conns\":[{\"src_nuid\":1,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":4,\"dst_nuid\":6,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":5,\"dst_nuid\":6,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":6,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":7,\"dst_nuid\":12,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":14,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":14,\"dst_nuid\":4,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":15,\"dst_nuid\":4,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":18,\"dst_nuid\":20,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":20,\"dst_nuid\":19,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":19,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":13,\"dst_nuid\":20,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":24,\"dst_nuid\":19,\"src_slot\":0,\"dst_slot\":1}]},\"dyn_in\":[{\"dt\":0,\"uid\":1},{\"dt\":0,\"uid\":2},{\"dt\":0,\"uid\":3}],\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"slider_float_generator\",\"uid\":57,\"state\":{\"val\":0.11666666666666667,\"min\":0,\"max\":1}},{\"plugin\":\"const_float_generator\",\"uid\":58,\"state\":{\"val\":0}},{\"plugin\":\"const_float_generator\",\"uid\":59,\"state\":{\"val\":1}},{\"plugin\":\"input_proxy\",\"uid\":64,\"dsid\":6,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"graph\",\"uid\":73,\"dsid\":5,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"13\":1,\"14\":2,\"15\":3},\"output_sids\":{\"12\":0}},\"graph\":{\"node_uid\":25,\"uid\":91,\"parent_uid\":84,\"nodes\":[{\"plugin\":\"sine_modulator\",\"uid\":1},{\"plugin\":\"subtract_modulator\",\"uid\":4},{\"plugin\":\"convert_oscilator_unit_modulator\",\"uid\":5},{\"plugin\":\"multiply_modulator\",\"uid\":6},{\"plugin\":\"add_modulator\",\"uid\":7},{\"plugin\":\"output_proxy\",\"uid\":12,\"dsid\":10,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":13,\"dsid\":8,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":14,\"dsid\":8,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":15,\"dsid\":8,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"delta_t_generator\",\"uid\":18},{\"plugin\":\"accumulate_modulator\",\"uid\":19,\"state\":{\"value\":24.69488333333398}},{\"plugin\":\"multiply_modulator\",\"uid\":20},{\"plugin\":\"tween_in_modulator\",\"uid\":24,\"state\":{\"type\":0}}],\"conns\":[{\"src_nuid\":1,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":4,\"dst_nuid\":6,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":6,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":7,\"dst_nuid\":12,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":14,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":14,\"dst_nuid\":4,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":15,\"dst_nuid\":4,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":18,\"dst_nuid\":20,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":20,\"dst_nuid\":19,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":19,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":13,\"dst_nuid\":20,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":5,\"dst_nuid\":24,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":24,\"dst_nuid\":6,\"src_slot\":0,\"dst_slot\":0}]},\"dyn_in\":[{\"dt\":0,\"uid\":1},{\"dt\":0,\"uid\":2},{\"dt\":0,\"uid\":3}],\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"slider_float_generator\",\"uid\":74,\"state\":{\"val\":0.03333333333333333,\"min\":0,\"max\":1}},{\"plugin\":\"const_float_generator\",\"uid\":75,\"state\":{\"val\":0}},{\"plugin\":\"const_float_generator\",\"uid\":76,\"state\":{\"val\":8}}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":1,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":5,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":3,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":24,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":3,\"src_dyn\":true},{\"src_nuid\":4,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":5,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":7,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":6,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":14,\"dst_nuid\":12,\"src_slot\":0,\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":12,\"dst_nuid\":24,\"src_slot\":0,\"dst_slot\":1,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":16,\"dst_nuid\":24,\"src_slot\":0,\"dst_slot\":2,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":18,\"dst_nuid\":17,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":20,\"dst_nuid\":17,\"src_slot\":0,\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":17,\"dst_nuid\":24,\"src_slot\":0,\"dst_slot\":0,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":35,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":36,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":3,\"dst_dyn\":true},{\"src_nuid\":37,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":40,\"dst_nuid\":38,\"src_slot\":0,\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":41,\"dst_nuid\":38,\"src_slot\":0,\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":42,\"dst_nuid\":38,\"src_slot\":0,\"dst_slot\":3,\"dst_dyn\":true},{\"src_nuid\":43,\"dst_nuid\":38,\"src_slot\":0,\"dst_slot\":4,\"dst_dyn\":true},{\"src_nuid\":44,\"dst_nuid\":38,\"src_slot\":0,\"dst_slot\":5,\"dst_dyn\":true},{\"src_nuid\":48,\"dst_nuid\":38,\"src_slot\":0,\"dst_slot\":8,\"dst_dyn\":true},{\"src_nuid\":47,\"dst_nuid\":38,\"src_slot\":0,\"dst_slot\":7,\"dst_dyn\":true},{\"src_nuid\":46,\"dst_nuid\":38,\"src_slot\":0,\"dst_slot\":6,\"dst_dyn\":true},{\"src_nuid\":38,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":1,\"src_dyn\":true},{\"src_nuid\":49,\"dst_nuid\":16,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":49,\"dst_nuid\":16,\"src_slot\":0,\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":49,\"dst_nuid\":16,\"src_slot\":0,\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":57,\"dst_nuid\":56,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":58,\"dst_nuid\":56,\"src_slot\":0,\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":59,\"dst_nuid\":56,\"src_slot\":0,\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":13,\"dst_nuid\":12,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":15,\"dst_nuid\":12,\"src_slot\":0,\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":64,\"dst_nuid\":17,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":74,\"dst_nuid\":73,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":75,\"dst_nuid\":73,\"src_slot\":0,\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":76,\"dst_nuid\":73,\"src_slot\":0,\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":73,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":4,\"src_dyn\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"dt\":6,\"uid\":0},{\"dt\":0,\"uid\":1}]},{\"plugin\":\"graph\",\"uid\":9,\"dsid\":2,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"7\":1},\"output_sids\":{\"6\":0}},\"graph\":{\"node_uid\":9,\"uid\":92,\"parent_uid\":64,\"nodes\":[{\"plugin\":\"delta_t_generator\",\"uid\":0},{\"plugin\":\"accumulate_modulator\",\"uid\":1,\"state\":{\"value\":0.27265999999999985}},{\"plugin\":\"multiply_modulator\",\"uid\":2},{\"plugin\":\"output_proxy\",\"uid\":6,\"dsid\":14,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":7,\"dsid\":12,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"const_float_generator\",\"uid\":8,\"state\":{\"val\":0}}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":2,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":1,\"dst_nuid\":6,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":7,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":8,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":1}]},\"dyn_in\":[{\"dt\":0,\"uid\":1}],\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"slider_float_generator\",\"uid\":10,\"state\":{\"val\":0.02,\"min\":0,\"max\":0.02}},{\"plugin\":\"color_picker\",\"uid\":11,\"state\":{\"hue\":0.41,\"sat\":0.56,\"lum\":0.21999999999999997}},{\"plugin\":\"knob_float_generator\",\"uid\":12,\"state\":{\"val\":0.07}},{\"plugin\":\"graph\",\"uid\":13,\"dsid\":5,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"13\":1,\"14\":2,\"15\":3},\"output_sids\":{\"12\":0}},\"graph\":{\"node_uid\":26,\"uid\":93,\"parent_uid\":64,\"nodes\":[{\"plugin\":\"subtract_modulator\",\"uid\":4},{\"plugin\":\"convert_oscilator_unit_modulator\",\"uid\":5},{\"plugin\":\"multiply_modulator\",\"uid\":6},{\"plugin\":\"add_modulator\",\"uid\":7},{\"plugin\":\"output_proxy\",\"uid\":12,\"dsid\":14,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":13,\"dsid\":12,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":14,\"dsid\":12,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":15,\"dsid\":12,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"delta_t_generator\",\"uid\":18},{\"plugin\":\"accumulate_modulator\",\"uid\":19,\"state\":{\"value\":1.3633000000000164}},{\"plugin\":\"multiply_modulator\",\"uid\":20},{\"plugin\":\"const_float_generator\",\"uid\":24,\"state\":{\"val\":0}},{\"plugin\":\"sawtooth_modulator\",\"uid\":25}],\"conns\":[{\"src_nuid\":4,\"dst_nuid\":6,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":5,\"dst_nuid\":6,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":6,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":7,\"dst_nuid\":12,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":14,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":14,\"dst_nuid\":4,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":15,\"dst_nuid\":4,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":18,\"dst_nuid\":20,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":20,\"dst_nuid\":19,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":13,\"dst_nuid\":20,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":24,\"dst_nuid\":19,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":19,\"dst_nuid\":25,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":25,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":0}]},\"dyn_in\":[{\"dt\":0,\"uid\":1},{\"dt\":0,\"uid\":2},{\"dt\":0,\"uid\":3}],\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"slider_float_generator\",\"uid\":14,\"state\":{\"val\":0.1,\"min\":0,\"max\":1}},{\"plugin\":\"const_float_generator\",\"uid\":15,\"state\":{\"val\":3}},{\"plugin\":\"const_float_generator\",\"uid\":16,\"state\":{\"val\":6}}],\"conns\":[{\"src_nuid\":1,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":2,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":3,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":4,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":3,\"dst_dyn\":true},{\"src_nuid\":0,\"dst_nuid\":8,\"src_slot\":0,\"dst_slot\":0,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":0,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":0,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":10,\"dst_nuid\":9,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":11,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":11,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":12,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":3,\"dst_dyn\":true},{\"src_nuid\":14,\"dst_nuid\":13,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":15,\"dst_nuid\":13,\"src_slot\":0,\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":16,\"dst_nuid\":13,\"src_slot\":0,\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":13,\"dst_nuid\":8,\"src_slot\":0,\"dst_slot\":1,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":13,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":1,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":0,\"dst_nuid\":6,\"src_slot\":0,\"dst_slot\":0,\"src_dyn\":true,\"dst_dyn\":true}]}},{\"plugin\":\"assets_completed_generator\",\"uid\":29},{\"plugin\":\"assets_failed_generator\",\"uid\":30},{\"plugin\":\"assets_started_generator\",\"uid\":31},{\"plugin\":\"float_display\",\"uid\":32},{\"plugin\":\"float_display\",\"uid\":33},{\"plugin\":\"float_display\",\"uid\":34},{\"plugin\":\"float_display\",\"uid\":35},{\"plugin\":\"add_modulator\",\"uid\":36},{\"plugin\":\"divide_modulator\",\"uid\":37},{\"plugin\":\"max_modulator\",\"uid\":38},{\"plugin\":\"const_float_generator\",\"uid\":39,\"state\":{\"val\":1}},{\"plugin\":\"float_display\",\"uid\":40},{\"plugin\":\"multiply_modulator\",\"uid\":41},{\"plugin\":\"const_float_generator\",\"uid\":42,\"state\":{\"val\":100}},{\"plugin\":\"equals_modulator\",\"uid\":43,\"state\":true},{\"plugin\":\"graph\",\"uid\":44,\"dsid\":2,\"state\":{\"enabled\":false,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"10\":0,\"11\":1},\"output_sids\":{}},\"graph\":{\"node_uid\":12,\"uid\":95,\"parent_uid\":0,\"nodes\":[{\"plugin\":\"const_text_generator\",\"uid\":0,\"state\":{\"text\":\"Loading: \",\"width\":135,\"height\":24}},{\"plugin\":\"format_string_float\",\"uid\":1},{\"plugin\":\"string_concatenate_modulator\",\"uid\":2},{\"plugin\":\"const_text_generator\",\"uid\":3,\"state\":{\"text\":\"%\",\"width\":135,\"height\":24}},{\"plugin\":\"string_concatenate_modulator\",\"uid\":4},{\"plugin\":\"graph\",\"uid\":5,\"dsid\":4,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"6\":1,\"70\":3},\"output_sids\":{}},\"graph\":{\"node_uid\":71,\"uid\":96,\"parent_uid\":95,\"nodes\":[{\"plugin\":\"mesh_renderer_emitter\",\"uid\":0},{\"plugin\":\"quad_mesh_generator\",\"uid\":1},{\"plugin\":\"input_proxy\",\"uid\":6,\"dsid\":42,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":4,\"uid\":0}]},{\"plugin\":\"from_mesh_shader\",\"uid\":22},{\"plugin\":\"texture_from_text_generator\",\"uid\":34},{\"plugin\":\"const_float_generator\",\"uid\":36,\"state\":{\"val\":512}},{\"plugin\":\"const_text_generator\",\"uid\":37,\"state\":{\"text\":\"bold italic 32px georgia\",\"width\":135,\"height\":24}},{\"plugin\":\"const_text_generator\",\"uid\":38,\"state\":{\"text\":\"#fff\",\"width\":135,\"height\":24}},{\"plugin\":\"const_text_generator\",\"uid\":39,\"state\":{\"text\":\"none\",\"width\":135,\"height\":24}},{\"plugin\":\"const_float_generator\",\"uid\":40,\"state\":{\"val\":0}},{\"plugin\":\"const_text_generator\",\"uid\":41,\"state\":{\"text\":\"center\",\"width\":135,\"height\":24}},{\"plugin\":\"const_text_generator\",\"uid\":42,\"state\":{\"text\":\"bottom\",\"width\":135,\"height\":24}},{\"plugin\":\"knob_float_generator\",\"uid\":43,\"state\":{\"val\":0.51}},{\"plugin\":\"knob_float_generator\",\"uid\":44,\"state\":{\"val\":0.4799999999999994}},{\"plugin\":\"multiply_modulator\",\"uid\":45},{\"plugin\":\"multiply_modulator\",\"uid\":46},{\"plugin\":\"graph\",\"uid\":47,\"dsid\":20,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"15\":3,\"21\":4,\"22\":5,\"23\":6,\"24\":7,\"25\":8,\"34\":10,\"39\":12,\"40\":13,\"41\":14,\"44\":16,\"47\":18,\"49\":19},\"output_sids\":{\"9\":0}},\"graph\":{\"node_uid\":53,\"uid\":97,\"parent_uid\":96,\"nodes\":[{\"plugin\":\"material_diffuse_color_modulator\",\"uid\":1},{\"plugin\":\"material_alpha_clip_modulator\",\"uid\":5},{\"plugin\":\"toggle_button\",\"uid\":6,\"state\":{\"enabled\":false}},{\"plugin\":\"material_texture_modulator\",\"uid\":7},{\"plugin\":\"output_proxy\",\"uid\":9,\"dsid\":46,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":12,\"uid\":0}]},{\"plugin\":\"material_blend_mode_modulator\",\"uid\":10},{\"plugin\":\"input_proxy\",\"uid\":15,\"dsid\":46,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":2,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":21,\"dsid\":40,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":22,\"dsid\":40,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":23,\"dsid\":40,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":24,\"dsid\":40,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":25,\"dsid\":40,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"convert_hsla_color_modulator\",\"uid\":26},{\"plugin\":\"material_z_buffer_modulator\",\"uid\":27},{\"plugin\":\"toggle_button\",\"uid\":28,\"state\":{\"enabled\":true}},{\"plugin\":\"material_shinyness_modulator\",\"uid\":31},{\"plugin\":\"input_proxy\",\"uid\":34,\"dsid\":34,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"material_double_sided_modulator\",\"uid\":35},{\"plugin\":\"toggle_button\",\"uid\":36,\"state\":{\"enabled\":false}},{\"plugin\":\"material_ambient_color_modulator\",\"uid\":37},{\"plugin\":\"input_proxy\",\"uid\":39,\"dsid\":41,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":40,\"dsid\":41,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":41,\"dsid\":41,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"convert_hsla_color_modulator\",\"uid\":43},{\"plugin\":\"input_proxy\",\"uid\":44,\"dsid\":30,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":12,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":47,\"dsid\":25,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":13,\"uid\":0}]},{\"plugin\":\"material_light_modulator\",\"uid\":48},{\"plugin\":\"input_proxy\",\"uid\":49,\"dsid\":22,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"toggle_button\",\"uid\":50,\"state\":{\"enabled\":true}},{\"plugin\":\"multiply_modulator\",\"uid\":51},{\"plugin\":\"const_float_generator\",\"uid\":52,\"state\":{\"val\":10}}],\"conns\":[{\"src_nuid\":1,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":6,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":5,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":7,\"dst_nuid\":9,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":10,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":15,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":25,\"dst_nuid\":10,\"src_slot\":0,\"dst_slot\":1,\"src_dyn\":true},{\"src_nuid\":21,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":22,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":23,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":24,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":3,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":26,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":27,\"dst_nuid\":10,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":28,\"dst_nuid\":27,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":31,\"dst_nuid\":27,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":35,\"dst_nuid\":31,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":36,\"dst_nuid\":35,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":37,\"dst_nuid\":35,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":39,\"dst_nuid\":43,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":40,\"dst_nuid\":43,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":41,\"dst_nuid\":43,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":43,\"dst_nuid\":37,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":47,\"dst_nuid\":48,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":44,\"dst_nuid\":48,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":48,\"dst_nuid\":37,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":49,\"dst_nuid\":48,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":50,\"dst_nuid\":27,\"src_slot\":0,\"dst_slot\":2},{\"src_nuid\":34,\"dst_nuid\":51,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":52,\"dst_nuid\":51,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":51,\"dst_nuid\":31,\"src_slot\":0,\"dst_slot\":1}]},\"dyn_in\":[{\"dt\":2,\"uid\":3},{\"dt\":0,\"uid\":4},{\"dt\":0,\"uid\":5},{\"dt\":0,\"uid\":6},{\"dt\":0,\"uid\":7},{\"dt\":0,\"uid\":8},{\"dt\":0,\"uid\":10},{\"dt\":0,\"uid\":12},{\"dt\":0,\"uid\":13},{\"dt\":0,\"uid\":14},{\"dt\":12,\"uid\":16},{\"dt\":13,\"uid\":18},{\"dt\":0,\"uid\":19}],\"dyn_out\":[{\"dt\":12,\"uid\":0}]},{\"plugin\":\"knob_float_generator\",\"uid\":49,\"state\":{\"val\":1}},{\"plugin\":\"knob_float_generator\",\"uid\":50,\"state\":{\"val\":1}},{\"plugin\":\"knob_float_generator\",\"uid\":51,\"state\":{\"val\":1}},{\"plugin\":\"knob_float_generator\",\"uid\":52,\"state\":{\"val\":1}},{\"plugin\":\"blend_mode_generator\",\"uid\":53,\"state\":{\"mode\":4}},{\"plugin\":\"knob_float_generator\",\"uid\":55,\"state\":{\"val\":1}},{\"plugin\":\"knob_float_generator\",\"uid\":56,\"state\":{\"val\":1}},{\"plugin\":\"knob_float_generator\",\"uid\":57,\"state\":{\"val\":0}},{\"plugin\":\"graph\",\"uid\":64,\"dsid\":2,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"2\":0},\"output_sids\":{\"3\":1}},\"graph\":{\"node_uid\":5,\"uid\":98,\"parent_uid\":96,\"nodes\":[{\"plugin\":\"perspective_camera\",\"uid\":0},{\"plugin\":\"vector\",\"uid\":1},{\"plugin\":\"input_proxy\",\"uid\":2,\"dsid\":21,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"output_proxy\",\"uid\":3,\"dsid\":21,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":6,\"uid\":0}]},{\"plugin\":\"const_float_generator\",\"uid\":4,\"state\":{\"val\":0.01}}],\"conns\":[{\"src_nuid\":1,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":3},{\"src_nuid\":0,\"dst_nuid\":3,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":2,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":2,\"src_dyn\":true},{\"src_nuid\":4,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":1}]},\"dyn_in\":[{\"dt\":0,\"uid\":0}],\"dyn_out\":[{\"dt\":6,\"uid\":1}]},{\"plugin\":\"knob_float_generator\",\"uid\":66,\"state\":{\"val\":0.48999999999999977}},{\"plugin\":\"multiply_modulator\",\"uid\":67},{\"plugin\":\"const_float_generator\",\"uid\":68,\"state\":{\"val\":2}},{\"plugin\":\"const_float_generator\",\"uid\":69,\"state\":{\"val\":2}},{\"plugin\":\"input_proxy\",\"uid\":70,\"dsid\":15,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":15,\"uid\":0}]}],\"conns\":[{\"src_nuid\":1,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":6,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":3,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":22,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":1,\"dst_nuid\":22,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":36,\"dst_nuid\":34,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":36,\"dst_nuid\":34,\"src_slot\":0,\"dst_slot\":2},{\"src_nuid\":42,\"dst_nuid\":34,\"src_slot\":0,\"dst_slot\":10},{\"src_nuid\":41,\"dst_nuid\":34,\"src_slot\":0,\"dst_slot\":9},{\"src_nuid\":40,\"dst_nuid\":34,\"src_slot\":0,\"dst_slot\":8},{\"src_nuid\":39,\"dst_nuid\":34,\"src_slot\":0,\"dst_slot\":7},{\"src_nuid\":38,\"dst_nuid\":34,\"src_slot\":0,\"dst_slot\":6},{\"src_nuid\":37,\"dst_nuid\":34,\"src_slot\":0,\"dst_slot\":5},{\"src_nuid\":36,\"dst_nuid\":45,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":36,\"dst_nuid\":46,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":43,\"dst_nuid\":45,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":44,\"dst_nuid\":46,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":45,\"dst_nuid\":34,\"src_slot\":0,\"dst_slot\":3},{\"src_nuid\":46,\"dst_nuid\":34,\"src_slot\":0,\"dst_slot\":4},{\"src_nuid\":49,\"dst_nuid\":47,\"src_slot\":0,\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":50,\"dst_nuid\":47,\"src_slot\":0,\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":51,\"dst_nuid\":47,\"src_slot\":0,\"dst_slot\":3,\"dst_dyn\":true},{\"src_nuid\":52,\"dst_nuid\":47,\"src_slot\":0,\"dst_slot\":4,\"dst_dyn\":true},{\"src_nuid\":53,\"dst_nuid\":47,\"src_slot\":0,\"dst_slot\":5,\"dst_dyn\":true},{\"src_nuid\":57,\"dst_nuid\":47,\"src_slot\":0,\"dst_slot\":9,\"dst_dyn\":true},{\"src_nuid\":56,\"dst_nuid\":47,\"src_slot\":0,\"dst_slot\":8,\"dst_dyn\":true},{\"src_nuid\":55,\"dst_nuid\":47,\"src_slot\":0,\"dst_slot\":7,\"dst_dyn\":true},{\"src_nuid\":34,\"dst_nuid\":47,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":47,\"dst_nuid\":22,\"src_slot\":0,\"dst_slot\":1,\"src_dyn\":true},{\"src_nuid\":64,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":2,\"src_dyn\":true},{\"src_nuid\":66,\"dst_nuid\":67,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":68,\"dst_nuid\":67,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":67,\"dst_nuid\":34,\"src_slot\":0,\"dst_slot\":11},{\"src_nuid\":69,\"dst_nuid\":64,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":70,\"dst_nuid\":34,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true}]},\"dyn_in\":[{\"dt\":4,\"uid\":1},{\"dt\":15,\"uid\":3}]},{\"plugin\":\"const_float_generator\",\"uid\":6,\"state\":{\"val\":2}},{\"plugin\":\"graph\",\"uid\":7,\"dsid\":3,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"0\":0,\"1\":1,\"2\":2},\"output_sids\":{}},\"graph\":{\"node_uid\":35,\"uid\":99,\"parent_uid\":95,\"nodes\":[{\"plugin\":\"input_proxy\",\"uid\":0,\"dsid\":17,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":1,\"dsid\":17,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":2,\"dsid\":17,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"mesh_renderer_emitter\",\"uid\":4},{\"plugin\":\"flat_shader\",\"uid\":5},{\"plugin\":\"quad_mesh_generator\",\"uid\":6},{\"plugin\":\"color_picker\",\"uid\":7,\"state\":{\"hue\":0.39,\"sat\":0.4,\"lum\":0.78}},{\"plugin\":\"graph\",\"uid\":8,\"dsid\":10,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"input_sids\":{\"26\":9},\"output_sids\":{\"9\":0}},\"graph\":{\"node_uid\":29,\"uid\":100,\"parent_uid\":99,\"nodes\":[{\"plugin\":\"material_diffuse_color_modulator\",\"uid\":1},{\"plugin\":\"output_proxy\",\"uid\":9,\"dsid\":30,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"dt\":12,\"uid\":0}]},{\"plugin\":\"material_blend_mode_modulator\",\"uid\":10},{\"plugin\":\"input_proxy\",\"uid\":26,\"dsid\":22,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":3,\"uid\":0}]},{\"plugin\":\"material_z_buffer_modulator\",\"uid\":27},{\"plugin\":\"toggle_button\",\"uid\":28,\"state\":{\"enabled\":false}}],\"conns\":[{\"src_nuid\":10,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":1,\"dst_nuid\":9,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":26,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":1,\"src_dyn\":true},{\"src_nuid\":27,\"dst_nuid\":10,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":28,\"dst_nuid\":27,\"src_slot\":0,\"dst_slot\":1}]},\"dyn_in\":[{\"dt\":3,\"uid\":9}],\"dyn_out\":[{\"dt\":12,\"uid\":0}]},{\"plugin\":\"scale_matrix\",\"uid\":9},{\"plugin\":\"vector\",\"uid\":10},{\"plugin\":\"knob_float_generator\",\"uid\":11,\"state\":{\"val\":0.060000000000000005}},{\"plugin\":\"const_float_generator\",\"uid\":12,\"state\":{\"val\":1}},{\"plugin\":\"subtract_modulator\",\"uid\":15},{\"plugin\":\"if_else_modulator\",\"uid\":16},{\"plugin\":\"equals_modulator\",\"uid\":17},{\"plugin\":\"const_float_generator\",\"uid\":18,\"state\":{\"val\":0}},{\"plugin\":\"divide_modulator\",\"uid\":21},{\"plugin\":\"subtract_modulator\",\"uid\":22},{\"plugin\":\"vector\",\"uid\":23},{\"plugin\":\"concatenate_matrix_modulator\",\"uid\":24},{\"plugin\":\"translation_matrix\",\"uid\":25},{\"plugin\":\"subtract_modulator\",\"uid\":32},{\"plugin\":\"negate_modulator\",\"uid\":33},{\"plugin\":\"const_float_generator\",\"uid\":34,\"state\":{\"val\":-0.1}}],\"conns\":[{\"src_nuid\":5,\"dst_nuid\":4,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":6,\"dst_nuid\":4,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":8,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":0,\"src_dyn\":true},{\"src_nuid\":7,\"dst_nuid\":8,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":false,\"dst_dyn\":true},{\"src_nuid\":10,\"dst_nuid\":9,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":12,\"dst_nuid\":10,\"src_slot\":0,\"dst_slot\":2},{\"src_nuid\":2,\"dst_nuid\":15,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":0,\"dst_nuid\":15,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":15,\"dst_nuid\":17,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":18,\"dst_nuid\":17,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":17,\"dst_nuid\":16,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":12,\"dst_nuid\":16,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":15,\"dst_nuid\":16,\"src_slot\":0,\"dst_slot\":2},{\"src_nuid\":16,\"dst_nuid\":21,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":0,\"dst_nuid\":22,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":22,\"dst_nuid\":21,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":18,\"dst_nuid\":23,\"src_slot\":0,\"dst_slot\":2},{\"src_nuid\":23,\"dst_nuid\":25,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":24,\"dst_nuid\":4,\"src_slot\":0,\"dst_slot\":3},{\"src_nuid\":12,\"dst_nuid\":32,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":21,\"dst_nuid\":32,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":32,\"dst_nuid\":33,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":9,\"dst_nuid\":24,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":25,\"dst_nuid\":24,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":1,\"dst_nuid\":22,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":33,\"dst_nuid\":23,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":21,\"dst_nuid\":10,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":11,\"dst_nuid\":10,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":34,\"dst_nuid\":23,\"src_slot\":0,\"dst_slot\":1}]},\"dyn_in\":[{\"dt\":0,\"uid\":0},{\"dt\":0,\"uid\":1},{\"dt\":0,\"uid\":2}]},{\"plugin\":\"const_float_generator\",\"uid\":8,\"state\":{\"val\":1}},{\"plugin\":\"const_float_generator\",\"uid\":9,\"state\":{\"val\":0}},{\"plugin\":\"input_proxy\",\"uid\":10,\"dsid\":11,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]},{\"plugin\":\"input_proxy\",\"uid\":11,\"dsid\":11,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"dt\":0,\"uid\":0}]}],\"conns\":[{\"src_nuid\":0,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":6,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":1,\"dst_nuid\":2,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":2,\"dst_nuid\":4,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":3,\"dst_nuid\":4,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":4,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":9,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":8,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":11,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"dst_connected\":false,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":10,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true}]},\"dyn_in\":[{\"dt\":0,\"uid\":0},{\"dt\":0,\"uid\":1}]},{\"plugin\":\"not_modulator\",\"uid\":45}],\"conns\":[{\"src_nuid\":29,\"dst_nuid\":33,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":29,\"dst_nuid\":36,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":30,\"dst_nuid\":34,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":30,\"dst_nuid\":36,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":31,\"dst_nuid\":32,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":36,\"dst_nuid\":35,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":37,\"dst_nuid\":41,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":41,\"dst_nuid\":40,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":42,\"dst_nuid\":41,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":36,\"dst_nuid\":37,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":39,\"dst_nuid\":38,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":31,\"dst_nuid\":38,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":38,\"dst_nuid\":37,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":37,\"dst_nuid\":43,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":39,\"dst_nuid\":43,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":37,\"dst_nuid\":44,\"src_slot\":0,\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":41,\"dst_nuid\":44,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":43,\"dst_nuid\":45,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":45,\"dst_nuid\":44,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":43,\"dst_nuid\":27,\"src_slot\":0,\"dst_slot\":0}]}}"
  },
  {
    "path": "browser/scripts/abstractPlugins/abstractAnimateValueOnTriggerPlugin.js",
    "content": "var AbstractAnimateValueOnTriggerPlugin = function(core, node, datatype, lerpFunc) {\n\tPlugin.apply(this, arguments)\n\n\tthis.desc = 'Animate value from startValue to endValue on trigger over time specified by duration'\n\n\tthis.core = core\n\n\tthis.datatype = datatype\n\tthis.lerpFunc = lerpFunc\n\n\tthis.input_slots = [{\n\t\tname: 'trigger', dt: E2.dt.BOOL, def: false,\n\t\tdesc: 'sending a boolean impulse to trigger will start the animation'\n\t}, {\n\t\tname: 'reset', dt: E2.dt.BOOL, def: false,\n\t\tdesc: 'reset value back to start'\n\t}, {\n\t\tname: 'one-shot', dt: E2.dt.BOOL, def: false,\n\t\tdesc: 'if true, only allow the animation to be triggered once (until reset)'\n\t}, {\n\t\tname: 'duration', dt: E2.dt.FLOAT, def: 1,\n\t\tdesc: 'animation duration'\n\t}, {\n\t\tname: 'startValue', dt: this.datatype, def: E2.core.get_default_value(this.datatype),\n\t\tdesc: 'animation start value'\n\t}, {\n\t\tname: 'endValue', dt: this.datatype, def: E2.core.get_default_value(this.datatype),\n\t\tdesc: 'animation end value'\n\t}]\n\n\tthis.output_slots = [{\n\t\tname: 'value', dt: this.datatype,\n\t\tdesc: 'animated value'\n\t}, {\n\t\tname: 'active', dt: E2.dt.BOOL,\n\t\tdesc: 'true while the animation is active'\n\t}]\n\n\tthis.blendFunctions = new BlendFunctions()\n\n\tthis.state = {\n\t\tblendFuncId: this.blendFunctions.getByIndex(0).id\n\t}\n}\n\nAbstractAnimateValueOnTriggerPlugin.prototype = Object.create(Plugin.prototype)\n\nAbstractAnimateValueOnTriggerPlugin.prototype.create_ui = function() {\n\tvar $ui = make('div')\n\n\tvar that = this\n\tthis.blendFunctions.createUi($ui, function(newBlendFunc, newSelection) {\n\t\tthat.undoableSetState('blendFuncId', newSelection, that.state.blendFuncId)\n\n\t\t// cache so that don't need to re-search again\n\t\tthat.blendFunc = newBlendFunc\n\t})\n\n\treturn $ui\n}\n\nAbstractAnimateValueOnTriggerPlugin.prototype.reset = function() {\n\tthis.triggerOnNextUpdate = false\n\tthis.triggered = false\n\tthis.oneShot = false\n\tthis.duration = 1\n\tthis.startTime = 0\n\tthis.startValue = E2.core.get_default_value(this.datatype)\n\tthis.endValue = E2.core.get_default_value(this.datatype)\n\n\tthis.blendFunc = this.blendFunctions.getById(this.state.blendFuncId)\n}\n\nAbstractAnimateValueOnTriggerPlugin.prototype.update_input = function(slot, data) {\n\tif (slot.name === 'trigger' && data && (!this.oneShot || !this.triggered)) {\n\t\tthis.triggerOnNextUpdate = true\n\t}\n\telse if (slot.name === 'reset' && data) {\n\t\tthis.triggerOnNextUpdate = false\n\t\tthis.triggered = false\n\t}\n\telse if (slot.name === 'one-shot') {\n\t\tthis.oneShot = data\n\t}\n\telse if (slot.name === 'duration') {\n\t\tthis.duration = data\n\t}\n\telse if (slot.name === 'startValue') {\n\t\tthis.startValue = data\n\t}\n\telse if (slot.name === 'endValue') {\n\t\tthis.endValue = data\n\t}\n}\n\nAbstractAnimateValueOnTriggerPlugin.prototype.update_output = function(slot) {\n\tif (slot.name === 'value') {\n\t\treturn this.value\n\t}\n\telse if (slot.name === 'active') {\n\t\treturn (this.triggered && this.value < this.endValue)\n\t}\n}\n\nAbstractAnimateValueOnTriggerPlugin.prototype.update_state = function(updateContext) {\n\tthis.abs_t = updateContext.abs_t\n\n\tif (this.triggerOnNextUpdate) {\n\t\tthis.triggered = true\n\t\tthis.startTime = this.abs_t\n\t\tthis.triggerOnNextUpdate = false\n\t}\n\n\tif (!this.triggered) {\n\t\tthis.value = this.lerpFunc(this.startValue, this.endValue, this.blendFunc.func(0))\n\t\tthis.always_update = false\n\t}\n\telse {\n\t\tvar t = this.abs_t - this.startTime\n\t\tif (t <= this.duration && this.duration > 0) {\n\t\t\tthis.value = this.lerpFunc(this.startValue, this.endValue, this.blendFunc.func(t / this.duration))\n\t\t\tthis.updated = true\n\t\t\tthis.always_update = true\n\t\t}\n\t\telse {\n\t\t\tif (this.value !== this.endValue) {\n\t\t\t\tthis.value = this.lerpFunc(this.startValue, this.endValue, this.blendFunc.func(1))\n\t\t\t\tthis.updated = true\n\t\t\t\tthis.always_update = false\n\t\t\t}\n\t\t}\n\t}\n}\n\nAbstractAnimateValueOnTriggerPlugin.prototype.state_changed = function(ui) {\n\tif (ui) {\n\t\tthis.blendFunctions.initialise(ui, this.state.blendFuncId)\n\t}\n}\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = AbstractAnimateValueOnTriggerPlugin\n"
  },
  {
    "path": "browser/scripts/abstractPlugins/abstractArrayBlendModulatorPlugin.js",
    "content": "var AbstractArrayBlendModulatorPlugin = function(core, node, datatype, lerpFunc)\n{\n\tPlugin.apply(this, arguments)\n\n\tthis.datatype = datatype\n\tthis.lerpFunc = lerpFunc\n\n\tvar that = this\n\n\tthis.desc = 'Set up n inputs, then choose which one to output. The output will animate from the previous input to the currently selected one over time duration and using the selected blending function';\n\n\tthis.input_slots = [{\n\t\tname: 'number', dt: E2.dt.FLOAT, def: 0,\n\t\tdesc: 'Input number to select for output.'\n\t}, {\n\t\tname: 'duration', dt: E2.dt.FLOAT, def: 1,\n\t\tdesc: 'Duration of blend animation'\n\t}]\n\n\tthis.output_slots = [\n\t\t{ name: 'value', dt: this.datatype, desc: 'Emits the selected input.' },\n\t\t{ name: 'length', dt: E2.dt.FLOAT, desc: 'Emits the number of inputs = the length of the array.' }\n\t]\n\n\tthis.core = core\n\tthis.node = node\n\tthis.lsg = new AutoSlotGroup(core, node, [], [])\n\tthis.lsg.set_dt(this.datatype)\n\n\tthis.node.on('slotAdded', function() {\n\t\tthat.dynInputs = node.getDynamicInputSlots()\n\t\tthat.updated = true\n\t})\n\n\tthis.node.on('slotRemoved', function() {\n\t\tthat.dynInputs = node.getDynamicInputSlots()\n\t\tthat.updated = true\n\t})\n\n\tthis.blendFunctions = new BlendFunctions()\n\n\tthis.state = {\n\t\tblendFuncId: this.blendFunctions.getByIndex(0).id\n\t}\n\n\tthis.values = []\n}\n\nAbstractArrayBlendModulatorPlugin.prototype = Object.create(Plugin.prototype)\n\nAbstractArrayBlendModulatorPlugin.prototype.create_ui = function() {\n\tvar $ui = make('div')\n\n\tvar that = this\n\n\tthis.blendFunctions.createUi($ui, function(newBlendFunc, newSelection) {\n\t\tthat.undoableSetState('blendFuncId', newSelection, that.state.blendFuncId)\n\n\t\t// cache so that don't need to re-search again\n\t\tthat.blendFunc = newBlendFunc\n\t})\n\n\treturn $ui\n}\n\nAbstractArrayBlendModulatorPlugin.prototype.reset = function() {\n\tthis.triggered = false\n\tthis.oneShot = false\n\tthis.duration = 1\n\tthis.startTime = 0\n\tthis.startValue = E2.core.get_default_value(this.datatype)\n\tthis.endValue = E2.core.get_default_value(this.datatype)\n\tthis.value = E2.core.get_default_value(this.datatype)\n\tthis.nextTargetIndex = 0\n\n\tthis.blendFunc = this.blendFunctions.getById(this.state.blendFuncId)\n\n\tPlugin.prototype.reset.apply(this, arguments)\n}\n\nAbstractArrayBlendModulatorPlugin.prototype.update_input = function(slot, data) {\n\tif (slot.dynamic) {\n\t\tthis.values[slot.index] = data\n\t}\n\telse {\n\t\tif (slot.name === 'number') {\n\t\t\tthis.nextTargetIndex = data\n\t\t}\n\t\telse if (slot.name === 'duration') {\n\t\t\tthis.duration = data\n\t\t}\n\n\t\tPlugin.prototype.update_input.apply(this, arguments)\n\t}\n}\n\nAbstractArrayBlendModulatorPlugin.prototype.connection_changed = function(on, conn, slot) {\n\tif (slot.dynamic && !on) {\n\t\tdelete this.values[slot.index]\n\t}\n}\n\nAbstractArrayBlendModulatorPlugin.prototype.update_output = function(slot) {\n\tif (slot.name === 'value') {\n\t\treturn this.value\n\t}\n\telse if (slot.name === 'length') {\n\t\treturn this.dynInputs.length\n\t}\n}\n\nAbstractArrayBlendModulatorPlugin.prototype.update_state = function(updateContext) {\n\tif (this.nextTargetIndex !== undefined && this.values.length > 0) {\n\t\tthis.nextTargetIndex = Math.min(Math.max(0, Math.floor(this.nextTargetIndex)), this.values.length - 1)\n\n\t\tif (this.values[this.nextTargetIndex] !== this.endValue) {\n\t\t\tthis.startTime = updateContext.abs_t\n\t\t\tthis.startValue = this.value\n\t\t\tthis.endValue = this.nextTargetIndex < this.values.length ? this.values[this.nextTargetIndex] : E2.core.get_default_value(this.datatype)\n\t\t\tthis.triggered = true\n\t\t}\n\t}\n\n\tif (!this.triggered) {\n\t\tthis.value = this.lerpFunc(this.startValue, this.endValue, this.blendFunc.func(0))\n\t\tthis.always_update = false\n\t}\n\telse {\n\t\tvar t = updateContext.abs_t - this.startTime\n\t\tif (t <= this.duration && this.duration > 0) {\n\t\t\tthis.value = this.lerpFunc(this.startValue, this.endValue, this.blendFunc.func(t / this.duration))\n\t\t\tthis.updated = true\n\t\t\tthis.always_update = true\n\t\t}\n\t\telse {\n\t\t\tif (this.value !== this.endValue) {\n\t\t\t\tthis.value = this.lerpFunc(this.startValue, this.endValue, this.blendFunc.func(1))\n\t\t\t\tthis.updated = true\n\t\t\t\tthis.always_update = false\n\t\t\t}\n\t\t}\n\t}\n}\n\nAbstractArrayBlendModulatorPlugin.prototype.state_changed = function(ui) {\n\tif (ui) {\n\t\tthis.blendFunctions.initialise(ui, this.state.blendFuncId)\n\t}\n\n\tthis.dynInputs = this.node.getDynamicInputSlots()\n\n\tif (!this.dynInputs.length) {\n\t\tthis.node.add_slot(E2.slot_type.input, {\n\t\t\tname: '0',\n\t\t\tdt: this.datatype,\n\t\t\tarray: false\n\t\t})\n\n\t\tthis.dynInputs = this.node.getDynamicInputSlots()\n\t}\n}\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = AbstractArrayBlendModulatorPlugin\n\n"
  },
  {
    "path": "browser/scripts/abstractPlugins/abstractEntityPlugin.js",
    "content": "(function() {\n\nfunction AbstractEntityPlugin() {\n\tAbstractGraphPlugin.apply(this, arguments)\n}\n\nAbstractEntityPlugin.prototype = Object.create(AbstractGraphPlugin.prototype)\n\nAbstractEntityPlugin.prototype.getObjectNode = function() {\n\treturn this.graph.findNodeByPlugin('three_mesh')\n}\n\nAbstractEntityPlugin.prototype.getObject3D = function() {\n\tvar meshNode = this.getObjectNode()\n\n\tif (!meshNode)\n\t\treturn\n\n\treturn meshNode.plugin.getObject3D()\n}\n\nwindow.AbstractEntityPlugin = AbstractEntityPlugin\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = AbstractEntityPlugin\n\n})()\n"
  },
  {
    "path": "browser/scripts/abstractPlugins/abstractGraphPlugin.js",
    "content": "(function() {\nvar AbstractGraphPlugin = function() {\n\tSubGraphPlugin.apply(this, arguments)\n\n\tthis.desc = 'Encapsulate a nested graph into- and out of which arbitrary data can be routed and the encapsulated logic. Add input / output proxies inside the graph to feed data in / out of the graph.'\n\t\n\tthis.input_slots = []\n\tthis.output_slots = []\n\n\tthis.state = {\n\t\talways_update:  true,\n\t\tinput_sids:     {},\n\t\toutput_sids:    {}\n\t}\n}\n\nAbstractGraphPlugin.prototype = Object.create(SubGraphPlugin.prototype)\nAbstractGraphPlugin.prototype.constructor = AbstractGraphPlugin\n\nAbstractGraphPlugin.prototype.getInspectorProperties = function() {\n\treturn {\n\t\talways_update : {\n\t\t\tdt : E2.dt.BOOL,\n\t\t\tlabel : 'Always update'\n\t\t}\n\t}\n}\n\nAbstractGraphPlugin.prototype.isEntityPatch = function() {\n\tif (this.id === 'entity')\n\t\treturn true\n\n\tif (this.node.dyn_outputs.length === 1)\n\t\treturn this.node.dyn_outputs[0].dt.id === E2.dt.OBJECT3D.id\n\n\treturn false\n}\n\nAbstractGraphPlugin.prototype.drilldown = function() {\n\treturn NodeUI.drilldown(this);\n}\n\nAbstractGraphPlugin.prototype.update_input = function(slot, data) {\n\tif (slot.uid === undefined) {\n\t\tconsole.log('graph.plugin undefined uid')\n\t} else {\n\t\tthis.input_nodes[slot.uid].plugin.input_updated(data)\n\t}\n}\n\nAbstractGraphPlugin.prototype.update_state = function(updateContext) {\n\tthis.updated = false\n\tthis.updated_sids.length = 0\n\n\tif (this.graph) {\n\t\tif(this.graph.update(updateContext) && this.graph === E2.app.player.core.active_graph)\n\t\t\tE2.app.updateCanvas(false)\n\t}\n}\n\nAbstractGraphPlugin.prototype.state_changed = function(ui) {\n\tvar core = this.core\n\tvar node = this.parent_node\n\tvar self = this\n\t\n\t// Only rebuild the node lists during post-load patch up of the graph, \n\t// during which 'ui' will be null. Otherwise the lists would have been rebuilt \n\t// every time we switch to the graph containing this node in the editor.\n\tif (ui) {\n\t\t// Decorate the auto generated dom base element with an\n\t\t// additional class to allow custom styling.\n\t\tnode.ui.dom.addClass('graph')\n\t\treturn\n\t}\n\t\n\tthis.setupProxies()\n}\n\nwindow.AbstractGraphPlugin = AbstractGraphPlugin\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = AbstractGraphPlugin\n\n})()\n"
  },
  {
    "path": "browser/scripts/abstractPlugins/abstractObjectRayPlugin.js",
    "content": "(function() {\n\tvar meshPlugins = ['three_mesh']\n\n\tfunction findMeshNodes(graph) {\n\t\tvar meshNodes = []\n\n\t\tfunction findInGraph(subgraph) {\n\t\t\tif (!subgraph.nodes)\n\t\t\t\treturn\n\n\t\t\tsubgraph.nodes.map(function(node) {\n\t\t\t\tif (E2.GRAPH_NODES.indexOf(node.plugin.id) > -1)\n\t\t\t\t\treturn findInGraph(node.plugin.graph)\n\n\t\t\t\tif (meshPlugins.indexOf(node.plugin.id) === -1)\n\t\t\t\t\treturn\n\n\t\t\t\tmeshNodes.push(node)\n\t\t\t})\n\t\t}\n\n\t\tfindInGraph(graph)\n\n\t\treturn meshNodes\n\t}\n\n\tfunction findSelectableMeshNodes() {\n\t\tvar titleCounters = {}\n\n\t\treturn findMeshNodes(E2.core.root_graph)\n\t\t.map(function(meshNode) {\n\t\t\tvar title = 'Mesh'\n\n\t\t\tif (meshNode.parent_graph.plugin)\n\t\t\t\ttitle = meshNode.parent_graph.plugin.node.title\n\n\t\t\tif (titleCounters[title])\n\t\t\t\ttitle = title + ' ' + (++titleCounters[title])\n\t\t\telse\n\t\t\t\ttitleCounters[title] = 1\n\n\t\t\treturn {\n\t\t\t\ttitle: title,\n\t\t\t\tnode: meshNode\n\t\t\t}\n\t\t})\n\n\t\treturn selectables\n\t}\n\n\tfunction AbstractObjectRayPlugin(core) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.input_slots = []\n\n\t\tthis.output_slots = [\n\t\t\t{ name: 'trigger', dt: core.datatypes.BOOL }\n\t\t]\n\n\t\tthis.boundOnRayOver = this.onRayOver.bind(this)\n\t\tthis.boundOnRayOut = this.onRayOut.bind(this)\n\t\tthis.boundOnRayUp = this.onRayUp.bind(this)\n\t\tthis.boundOnRayDown = this.onRayDown.bind(this)\n\t\tthis.boundSetupChosenObject = this.setupChosenObject.bind(this)\n\t\tthis.boundOnGraphNodesChanged = this.onGraphNodesChanged.bind(this)\n\n\t\tthis.node.on('pluginStateChanged', this.boundSetupChosenObject)\n\n\t\tthis.state.nodeRef = null\n\n\t\tthis.triggerState = false\n\t\tthis.lastState = false\n\t}\n\n\tAbstractObjectRayPlugin.prototype = Object.create(Plugin.prototype)\n\n\tAbstractObjectRayPlugin.prototype.onRayOver = function() {}\n\tAbstractObjectRayPlugin.prototype.onRayOut = function() {}\n\tAbstractObjectRayPlugin.prototype.onRayUp = function() {}\n\tAbstractObjectRayPlugin.prototype.onRayDown = function() {}\n\n\tAbstractObjectRayPlugin.prototype.reset = function() {\n\t\tthis.graph = this.node.parent_graph\n\t}\n\n\tAbstractObjectRayPlugin.prototype.destroy = function() {\n\t\tthis.clearClickerOnObject()\n\t}\n\n\tAbstractObjectRayPlugin.prototype.installClickerOnObject = function() {\n\t\tif (!this.object3d.gazeClickers)\n\t\t\tthis.object3d.gazeClickers = {}\n\n\t\tif (this.object3d.gazeClickers[this.node.uid])\n\t\t\treturn;\n\n\t\tthis.object3d.gazeClickers[this.node.uid] = true\n\t\tthis.object3d.gazeClickerCount = Object.keys(this.object3d.gazeClickers).length\n\n\t\tE2.app.player.rayInput.add(this.object3d)\n\n\t\tvar obj = this.object3d\n\t\twhile(obj) {\n\t\t\tif (!obj.gazeClickerCount)\n\t\t\t\tobj.gazeClickerCount = 0\n\t\t\tobj.gazeClickerCount++\n\t\t\tobj = obj.parent\n\t\t}\n\n\t\tthis.targetNode.plugin.updated = true\n\n\t\tE2.app.player.scene.hasClickableObjects = true\n\n\t\tE2.core.runtimeEvents.on('rayout:'+this.object3d.uuid, this.boundOnRayOut)\n\t\tE2.core.runtimeEvents.on('rayover:'+this.object3d.uuid, this.boundOnRayOver)\n\t\tE2.core.runtimeEvents.on('raydown:'+this.object3d.uuid, this.boundOnRayDown)\n\t\tE2.core.runtimeEvents.on('rayup:'+this.object3d.uuid, this.boundOnRayUp)\n\t}\n\n\tAbstractObjectRayPlugin.prototype.clearClickerOnObject = function() {\n\t\tif (!this.object3d)\n\t\t\treturn;\n\n\t\tif (!this.object3d.gazeClickers || !this.object3d.gazeClickers[this.node.uid])\n\t\t\treturn;\n\n\t\tE2.app.player.rayInput.remove(this.object3d)\n\n\t\tdelete this.object3d.gazeClickers[this.node.uid]\n\n\t\tthis.object3d.gazeClickerCount = Object.keys(this.object3d.gazeClickers).length\n\n\t\tvar obj = this.object3d.parent\n\t\twhile(obj) {\n\t\t\tobj.gazeClickerCount--\n\t\t\tobj = obj.parent\n\t\t}\n\n\t\tthis.targetNode.plugin.updated = true\n\n\t\tE2.core.runtimeEvents.off('rayout:'+this.object3d.uuid, this.boundOnRayOut)\n\t\tE2.core.runtimeEvents.off('rayover:'+this.object3d.uuid, this.boundOnRayOver)\n\t\tE2.core.runtimeEvents.off('raydown:'+this.object3d.uuid, this.boundOnRayDown)\n\t\tE2.core.runtimeEvents.off('rayup:'+this.object3d.uuid, this.boundOnRayUp)\n\n\t\tthis.object3d = undefined\n\t}\n\n\tAbstractObjectRayPlugin.prototype.setupChosenObject = function() {\n\t\tif (!this.state.nodeRef)\n\t\t\treturn this.clearClickerOnObject()\n\n\t\tvar oref = this.state.nodeRef.split('.')\n\t\tvar guid = oref[0]\n\t\tvar nuid = oref[1]\n\t\tvar graph = Graph.lookup(guid)\n\n\t\tif (!graph) {\n\t\t\tconsole.warn('AbstractObjectRayPlugin.setupChosenObject() could not find Graph', guid)\n\t\t\treturn;\n\t\t}\n\n\t\tvar node = graph.findNodeByUid(nuid)\n\n\t\tif (!node || (this.object3d && this.object3d === node.plugin.object3d))\n\t\t\treturn\n\n\t\tthis.clearClickerOnObject()\n\n\t\tif (this.targetNode)\n\t\t\tthis.targetNode.off('meshChanged', this.boundSetupChosenObject)\n\n\t\tthis.targetNode = node\n\t\tthis.targetNode.on('meshChanged', this.boundSetupChosenObject)\n\n\t\tif (!node.plugin.object3d) // might not have been set up yet, wait for meshChanged\n\t\t\treturn;\n\n\t\tthis.object3d = node.plugin.object3d\n\t\tthis.installClickerOnObject()\n\n\t\t// set the Mesh plugin to updated, to update the Scene as clickable\n\t\tthis.targetNode.plugin.updated = true \n\t}\n\n\tAbstractObjectRayPlugin.prototype.populateObjectSelector = function() {\n\t\tvar that = this\n\n\t\tthat.$selectObject.empty()\n\n\t\t$('<option>', { value: 0, text: 'Select Object' })\n\t\t\t.appendTo(that.$selectObject)\n\n\t\tfindSelectableMeshNodes()\n\t\t.map(function(selectable) {\n\t\t\tvar nodeRef = selectable.node.getFullUid()\n\t\t\t$('<option>', {\n\t\t\t\tvalue: nodeRef,\n\t\t\t\tselected: nodeRef === that.state.nodeRef,\n\t\t\t\ttext: selectable.title\n\t\t\t})\n\t\t\t.appendTo(that.$selectObject)\n\t\t})\n\t}\n\n\tAbstractObjectRayPlugin.prototype.onGraphNodesChanged = function() {\n\t\tthis.populateObjectSelector()\n\t}\n\n\tAbstractObjectRayPlugin.prototype.create_ui = function() {\n\t\tvar that = this\n\n\t\tvar $ui = make('div')\n\n\t\tvar $selectObject = \n\t\t\tthis.$selectObject = $('<select class=\"object-sel\" title=\"Select Object\"/>')\n\n\t\tthis.populateObjectSelector()\n\n\t\t$selectObject.change(function() {\n\t\t\tvar selection = $selectObject.val()\n\t\t\tif (selection === 0)\n\t\t\t\tselection = null\n\t\t\tthat.undoableSetState('nodeRef', selection, that.state.nodeRef)\n\t\t})\n\n\t\t$ui.append(this.$selectObject)\n\n\t\t// if nodes change in this current graph, update selector\n\t\tthis.graph.on('nodeAdded', this.boundOnGraphNodesChanged)\n\t\tthis.graph.on('nodeRemoved', this.boundOnGraphNodesChanged)\n\t\tthis.graph.on('nodeRenamed', this.boundOnGraphNodesChanged)\n\n\t\treturn $ui\n\t}\n\n\tAbstractObjectRayPlugin.prototype.destroy_ui = function() {\n\t\tthis.graph.off('nodeAdded', this.boundOnGraphNodesChanged)\n\t\tthis.graph.off('nodeRemoved', this.boundOnGraphNodesChanged)\n\t\tthis.graph.off('nodeRenamed', this.boundOnGraphNodesChanged)\n\t}\n\n\tAbstractObjectRayPlugin.prototype.update_output = function() {\n\t\treturn this.triggerState\n\t}\n\n\tAbstractObjectRayPlugin.prototype.update_state = function() {\n\t\tif (this.lastState)\n\t\t\tthis.triggerState = false\n\n\t\tthis.lastState = this.triggerState\n\t}\n\n\tAbstractObjectRayPlugin.prototype.state_changed = function(ui) {\n\t\tif (ui) {\n\t\t\tif (this.state.nodeRef)\n\t\t\t\tui.find('.object-sel').val(this.state.nodeRef)\n\t\t} else {\n\t\t\tif (this.state.nodeRef) {\n\t\t\t\tthis.setupChosenObject()\n\t\t\t} else {\n\t\t\t\t// default to containing Entity\n\t\t\t\tif (this.node.parent_graph.plugin instanceof AbstractEntityPlugin) {\n\t\t\t\t\tvar meshNodes = findMeshNodes(this.node.parent_graph)\n\t\t\t\t\tif (!meshNodes.length)\n\t\t\t\t\t\treturn;\n\t\t\t\t\tthis.state.nodeRef = meshNodes[0].getFullUid()\n\t\t\t\t\tthis.setupChosenObject()\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\twindow.AbstractObjectRayPlugin = AbstractObjectRayPlugin\n\n\tif (typeof(module) !== 'undefined')\n\t\tmodule.exports = AbstractObjectRayPlugin\n})();\n\n"
  },
  {
    "path": "browser/scripts/abstractPlugins/abstractTextAreaPlugin.js",
    "content": "function AbstractTextAreaPlugin(core, node) {\n\tPlugin.apply(this, arguments)\n\tthis.desc = 'Enter a constant text string.'\n\n\tthis._uiDetachQueue = []\n\n\tthis.undoName = 'Textarea'\n\tthis.uiMinWidth = 120\n\tthis.uiMinHeight = 80\n\tthis.uiMaxWidth = 550\n\tthis.uiMaxHeight = 440\n\n\tthis.inp = {}\n\n\tthis.input_slots = []\n\tthis.output_slots = [\n\t\t{ name: 'text', dt: core.datatypes.TEXT, desc: 'The currently entered text.', def: 'Empty string' }\n\t]\n\n\tthis.state = { text: '', width: this.uiMinWidth, height: this.uiMinHeight }\n}\n\nAbstractTextAreaPlugin.prototype = Object.create(Plugin.prototype)\nAbstractTextAreaPlugin.prototype.constructor = AbstractTextAreaPlugin\n\nAbstractTextAreaPlugin.prototype.reset = function() {\n\tthis.updated = true\n}\n\nAbstractTextAreaPlugin.prototype.create_ui = function() {\n\tvar that = this\n\tvar clamp = THREE.Math.clamp\n\n\tvar adapter = {\n\t\tget text()  \t{ return that.state.text },\n\t\tset text(str) \t{ return that.state.text = str},\n\t\tget width()  \t{ return that.state.width },\n\t\tset width(px) \t{ return that.state.width = clamp(px, that.uiMinWidth, that.uiMaxWidth) },\n\t\tget height()  \t{ return that.state.height },\n\t\tset height(px) \t{ return that.state.height = clamp(px, that.uiMinHeight, that.uiMaxHeight) }\n\t}\n\n\tvar onChange \t\t= this.updateUi.bind(this)\n\tvar onBeginChange \t= this.beginBatchModifyState.bind(this)\n\tvar onEndChange \t= function() { that.endBatchModifyState(that.undoName) }\n\tthis.ui = new UITextArea(adapter, onBeginChange, onChange, onEndChange)\n\n\tvar inp = this.ui.dom.find('textarea')\n\tvar t = null\n\tinp.on('keyup', function(){\n\t\tif (t) clearTimeout(t)\n\t\tt = setTimeout(function(){that.transientSetState('text', inp.val())}, 300)\n\t})\n\tthis.node.on('pluginStateChanged', this.updateUi.bind(this))\n\n\tvar adjustWidth = function(minWidth) {\n\t\tthat.uiMinWidth = minWidth - 45\n\t\tif (that.uiMinWidth > that.state.width) {\n\t\t\tthat.state.width = that.uiMinWidth\n\t\t\tthat.ui.update()\n\t\t}\n\t}\n\n\t// setup an invisible node UI for a Node of the same plugin kind\n\t// rename it, get the available content area, and size ourselves accordingly\n\tvar onRenamed = function(name){\n\t\tvar nu = new NodeUI(new Node(null, that.id, -1000,-1000))\n\t\tnu.onRenamed(name)\n\t\tadjustWidth(nu.content.width())\n\t\tnu.destroy()\n\t}\n\n\tthat.node.on('renamed', onRenamed)\n\tthis._uiDetachQueue.push(function(){\n\t\tthat.node.removeListener('renamed', onRenamed)\n\t})\n\n\t// listen to when the node UI has been created, in case our width needs adjusting\n\tthis.node.once('uiCreated', function($contentContainer){\n\t\tadjustWidth($contentContainer.width())\n\t})\n\n\treturn this.ui.dom\n}\n\nAbstractTextAreaPlugin.prototype.destroy_ui = function() {\n\tvar q = this._uiDetachQueue\n\tif (q && q.length) {\n\t\tvar removeHandler\n\t\twhile (removeHandler = q.pop()) {\n\t\t\tremoveHandler()\n\t\t}\n\t}\n\tif (this.ui)\n\t\tthis.ui.destroy()\n\n\tthis.ui = null\n}\n\nAbstractTextAreaPlugin.prototype.update_output = function() {\n\treturn this.state.text\n}\n\nAbstractTextAreaPlugin.prototype.state_changed = function() {\n\tthis.updateUi()\n}\n\nAbstractTextAreaPlugin.prototype.updateUi = function() {\n\tif (!this.ui)\n\t\treturn\n\n\tthis.ui.update()\n}\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = AbstractTextAreaPlugin"
  },
  {
    "path": "browser/scripts/abstractPlugins/abstractThreeLoaderObjPlugin.js",
    "content": "function AbstractThreeLoaderObjPlugin(core) {\n\tPlugin.apply(this, arguments)\n\tthis.desc = 'THREE.js OBJ loader'\n\t\n\tthis.dirty = true\n\n\tthis.state = { url: '' }\n\n\tthis.input_slots = []\n\n\tthis.output_slots = [{\n\t\tname: 'geometry',\n\t\tdt: core.datatypes.GEOMETRY,\n\t\tarray: true\n\t},\n\t{\n\t\tname: 'materials',\n\t\tdt: core.datatypes.MATERIAL,\n\t\tarray: true\n\t}]\n\n\tthis.geometries = [new THREE.Geometry()]\n\tthis.materials = [new THREE.MeshBasicMaterial(0xff0000)]\n}\n\nAbstractThreeLoaderObjPlugin.prototype = Object.create(Plugin.prototype)\n\nAbstractThreeLoaderObjPlugin.prototype.update_input = function() {\n\treturn Plugin.prototype.update_input.apply(this, arguments)\n}\n\nAbstractThreeLoaderObjPlugin.prototype.onObjLoaded = function(geoms, mats) {\n\tthis.geometries = geoms\n\tthis.materials = mats\n\n\tfor (var i = 0; i < this.geometries.length; ++i) {\n\t\tvar bufferGeometryHasVtxNormals =\n\t\t\tthis.geometries[i] instanceof THREE.BufferGeometry &&\n\t\t\tthis.geometries[i].getAttribute('normal') !== undefined\n\n\t\tvar normalGeometryHasFaceNormals =\n\t\t\t(this.geometries[i].faces && this.geometries[i].faces.length > 0 &&\n\t\t\tthis.geometries[i].faces[0].normal.lengthSq() !== 0)\n\n\t\tvar normalGeometryHasVtxNormals =\n\t\t\t(this.geometries[i].faces && this.geometries[i].faces.length > 0 &&\n\t\t\tthis.geometries[i].faces[0].vertexNormals.length > 0)\n\t\t\n\t\tif (!bufferGeometryHasVtxNormals && !normalGeometryHasFaceNormals && !normalGeometryHasVtxNormals) {\n\t\t\tthis.geometries[i].computeVertexNormals(true)\n\t\t}\n\t}\n\n\tmsg('Finished loading '+ this.state.url)\n\n\tthis.updated = true\n}\n\nAbstractThreeLoaderObjPlugin.prototype.state_changed = function(ui) {\n\tif (!this.state.url)\n\t\treturn\n\n\tif (ui)\n\t\tui.attr('title', this.state.url)\n\telse\n\t\tthis.dirty = true\n}\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = AbstractThreeLoaderObjPlugin\n\n\n"
  },
  {
    "path": "browser/scripts/abstractPlugins/abstractThreeMaterialPlugin.js",
    "content": "function AbstractThreeMaterialPlugin(core) {\n\tPlugin.apply(this, arguments)\n\n\tthis.input_slots = [\n\t\t{\tname: 'opacity', dt: core.datatypes.FLOAT, def: 1.0,\n\t\t\tdesc: 'Float in the range of 0.0 - 1.0 indicating how transparent the material is. A value of 0.0 indicates fully transparent, 1.0 is fully opaque. If transparent is not set to true for the material, the material will remain fully opaque and this value will only affect its color.'\n\t\t},\n\t\t{\tname: 'transparent', dt: core.datatypes.BOOL, def: false,\n\t\t\tdesc: 'Defines whether this material is transparent. When set to true, the extent to which the material is transparent is controlled by setting opacity.'\n\t\t},\n\t\t{\tname: 'blending', dt: core.datatypes.FLOAT, def: 1.0,\n\t\t\tdesc: 'Which blending to use when displaying objects with this material. Default is Normal. ' +\n\t\t\t\t'0 = No, 1 = Normal, 2 = Additive, 3 = Subtractive, 4 = Multiply, 5 = Custom'\n\t\t},\n\t\t{\tname: 'side', dt: core.datatypes.FLOAT,\n\t\t\tdef: 0,\n\t\t\tdesc: 'Defines which of the face sides will be rendered - front, back or both. ' +\n\t\t\t\t'0 = Front, 1 = Back, 2 = Double Sided'\n\t\t},\n\t]\n\n\tthis.output_slots = [\n\t\t{ name:'material', dt: core.datatypes.MATERIAL }\n\t]\n}\n\nAbstractThreeMaterialPlugin.prototype = Object.create(Plugin.prototype)\n\nAbstractThreeMaterialPlugin.prototype.update_output = function() {\n\treturn this.material\n}\n\nAbstractThreeMaterialPlugin.prototype.update_input = function(slot, data) {\n\tif (slot.name === 'texture')\n\t\tthis.material.map = data\n\telse\n\t\tthis.material[slot.name] = data\n\n\tthis.material.needsUpdate = true\n}\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = AbstractThreeMaterialPlugin\n"
  },
  {
    "path": "browser/scripts/abstractPlugins/abstractThreeMeshPlugin.js",
    "content": "function AbstractThreeMeshPlugin(core) {\n\tThreeObject3DPlugin.apply(this, arguments)\n\n\tthis.desc = 'THREE.js Mesh'\n\n\tthis.input_slots = [\n\t\t{\n\t\t\tname: 'geometry',\n\t\t\tdt: core.datatypes.GEOMETRY,\n\t\t\tarray: true,\n\t\t\tdef: [new THREE.Geometry()]\n\t\t},\n\t\t{\n\t\t\tname: 'material',\n\t\t\tdt: core.datatypes.MATERIAL,\n\t\t\tarray: true,\n\t\t\tdef: [new THREE.MeshBasicMaterial({color: 0x00FF00})]\n\t\t}\n\t].concat(this.input_slots)\n\n\t// meshes are create via a helper object\n\tthis.createMeshRoot = function() {}\n\tthis.createMesh = function() {}\n\tthis.createAnimatedMesh = function() {}\n}\n\nAbstractThreeMeshPlugin.prototype = Object.create(ThreeObject3DPlugin.prototype)\n\nAbstractThreeMeshPlugin.prototype.reset = function() {\n\tThreeObject3DPlugin.prototype.reset.apply(this)\n\n\tthis.setObject3D(this.createMeshRoot())\n\n\tthis.geoms = [new THREE.Geometry()]\n\tthis.mats = [new THREE.MeshBasicMaterial({color: 0x00ff00})]\n\n\tvar mesh = this.createMesh(this.geoms[0], this.mats[0])\n\tthis.object3d.add(mesh)\n\n\t// back reference for object picking\n\tthis.object3d.backReference = this\n}\n\nAbstractThreeMeshPlugin.prototype.update_mesh = function()\n{\n\tvar i\n\tvar mesh\n\n\t// tbd: optimize this so that we don't always reconstruct meshes\n\t// but update the ones we can just update\n\tif (this.geoms_dirty && this.geoms) {\n\t\tthis.always_update = false\n\n\t\t// non-recursive clone of the root, to preserve transform\n\t\tthis.setObject3D(this.object3d.clone(/*recursive = */false))\n\n\t\tfor (i = 0; i < this.geoms.length; ++i) {\n\t\t\tif (this.geoms[i].morphTargets && this.geoms[i].morphTargets.length > 0) {\n\t\t\t\t// clone the material, because we don't want to edit properties on some random material\n\t\t\t\tvar mat = (this.mats && this.mats.length > 0) ? this.mats[i % this.mats.length].clone() : undefined\n\t\t\t\tmesh = this.createAnimatedMesh(this.geoms[i], mat)\n\n\t\t\t\tvar animName = this.geoms[i].animations.length > 0 ? this.geoms[i].animations[0].name : undefined\n\t\t\t\tif (animName) {\n\t\t\t\t\tmesh.playAnimation(animName, 100)\n\t\t\t\t}\n\n\t\t\t\tmesh.material.morphTargets = true\n\t\t\t\tthis.always_update = true\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmesh = this.createMesh(this.geoms[i], this.mats[i % this.mats.length])\n\t\t\t}\n\t\t\tmesh.backReference = this\n\n\t\t\tthis.object3d.add(mesh)\n\t\t}\n\n\t\tthis.geoms_dirty = this.mats_dirty = false\n\n\t\tthis.node.emit('meshChanged')\n\t}\n\n\tif (this.mats_dirty && this.mats && this.mats.length > 0) {\n\t\tfor (i = 0; i < this.object3d.children.length; ++i) {\n\t\t\tif (this.object3d.children[i] instanceof THREE.MorphAnimMesh) {\n\t\t\t\tthis.object3d.children[i].material = this.mats[i % this.mats.length].clone()\n\t\t\t\tthis.object3d.children[i].material.morphTargets = true\n\t\t\t}\n\t\t\telse {\n\t\t\t\tthis.object3d.children[i].material = this.mats[i % this.mats.length]\n\t\t\t}\n\t\t}\n\n\t\tthis.mats_dirty = false\n\t}\n}\n\nAbstractThreeMeshPlugin.prototype.update_input = function(slot, data) {\n\tif (slot.name === 'geometry') { // geometry\n\t\tthis.geoms = data\n\t\tthis.geoms_dirty = true\n\t}\n\telse if (slot.name === 'material') { // material\n\t\tthis.mats = data\n\t\tthis.mats_dirty = true\n\t}\n\telse {\n\t\tThreeObject3DPlugin.prototype.update_input.apply(this, arguments)\n\t}\n}\n\nAbstractThreeMeshPlugin.prototype.update_state = function() {\n\tthis.update_mesh()\n\n\tThreeObject3DPlugin.prototype.update_state.apply(this)\n}\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = AbstractThreeMeshPlugin\n"
  },
  {
    "path": "browser/scripts/account-controller.js",
    "content": "function AccountController() {\n\tEventEmitter.call(this)\n\n\tthis._model = E2.models.user\n\tthis.dom = {\n\t\taccountDropdown : jQuery('#account'),\n\t\tprofilePanel: jQuery('#profileheader'),\n\t\tuserHeader: jQuery('body.bProfile header, body.bUserpage header')\n\t}\n\n\tE2.models.user.on('change', this.renderLoginView.bind(this))\n\tE2.models.user.on('change', this.renderProfileView.bind(this))\n\tE2.models.user.on('change', this.renderHeaderView.bind(this))\n\n\t// bind dropdown\n\tthis._bindModalLinks(this.dom.accountDropdown)\n\n}\n\nAccountController.prototype = Object.create(EventEmitter.prototype)\n\nAccountController.prototype._renderView = function(user, view, container, cb) {\n\tif (!container.length)\n\t\treturn\n\n\tvar data = user.toJSON()\n\n\tvar html = view(data)\n\n\t$('a, button', container).off('.accountController')\n\tcontainer.html(html)\n\n\tif (cb)\n\t\tcb(container, user)\n\n\tthis.emit('redrawn')\n}\n\nAccountController.prototype.renderLoginView = function(user) {\n\tif (!this.dom.accountDropdown.length)\n\t\treturn\n\n\treturn this._renderView(user, \n\t\tE2.views.partials.userpulldown,\n\t\tthis.dom.accountDropdown,\n\t\tthis._bindModalLinks.bind(this)\n\t)\n}\n\nAccountController.prototype.renderHeaderView = function(user) {\n\tif (!this.dom.userHeader.length)\n\t\treturn\n\n\tif (this.dom.userHeader.data('uid') !== user.id)\n\t\treturn\n\n\tvar profile = user.get('profile')\n\n\tthis.dom.userHeader.css({\n\t\t'background-image': 'url('+(profile.header || '')+')'\n\t})\n}\n\nAccountController.prototype.renderProfileView = function(user) {\n\tif (!this.dom.profilePanel.length)\n\t\treturn\n\t\n\treturn this._renderView(user, \n\t\tE2.views.partials.profile,\n\t\tthis.dom.profilePanel\n\t)\n}\n\nAccountController.prototype._bindModalLinks = function(el, dfd) {\n\tvar that = this;\n\n\t$('a, button', el).off('.accountController');\n\n\t$('a.login, #btn-sign-in', el).on('click.accountController', function(evt) {\n\t\tevt.preventDefault();\n\t\tVizorUI.modalClose();\n\t\tthat.openLoginModal(dfd);\n\t\treturn false;\n\t});\n\t\n\t$('a.signup', el).on('click.accountController', function(evt) {\n\t\tevt.preventDefault();\n\t\tVizorUI.modalClose();\n\t\tthat.openSignupModal(dfd);\n\t\treturn false;\n\t});\n\t\n\t$('a.forgot', el).on('click.accountController', function(evt) {\n\t\tevt.preventDefault();\n\t\tVizorUI.modalClose();\n\t\tthat.openForgotPasswordModal(dfd);\n\t\treturn false;\n\t});\n\n\tif (el.length)\n\t\tArray.prototype.forEach.call(el[0].querySelectorAll('[data-hideshow-target]'), VizorUI.hideshow)\n\n}\n\nAccountController.prototype.openLoginModal = function(dfd) {\n\tdfd = dfd || when.defer();\n\tvar loginTemplate = E2.views.partials.account.login;\n\n\tvar data = {profile:this._model.toJSON()}\n\tvar $modal = VizorUI.modalOpen(loginTemplate(data), 'Sign in', 'nopad mLogin');\n\tthis._bindModalLinks($modal, dfd);\n\n\tvar onSuccess = function(response) {\n\t\tvar user = response.data;\n\n\t\tmixpanel.identify(user.username)\n\t\tmixpanel.people.set({\n\t\t\t\"$name\": user.name,\n\t\t\tusername: user.username,\n\t\t\t\"$email\": user.email\n\t\t})\n\n\t\tE2.track({\n\t\t\tevent: 'userSignedIn',\n\t\t\tusername: user.username\n\t\t})\n\n\t\tE2.models.user.set(user)\n\t\tbootbox.hideAll()\n\t\tdfd.resolve(user)\n\t};\n\n\tvar $form = $('#loginForm', $modal);\n\tVizorUI.setupXHRForm($form, onSuccess);\n\n\treturn dfd.promise\n}\n\n\nAccountController.prototype._setupAccountUsernameField = function($input) {\n\tvar currentUsername = (E2.models.user) ? E2.models.user.get('username') : '';\n\treturn VizorUI._setupAccountUsernameField($input, currentUsername);\n}\n\nAccountController.prototype.openSignupModal = function(dfd) {\n\tvar that = this;\n\tvar dfd = dfd || when.defer();\n\tvar signupTemplate = E2.views.partials.account.signup();\n\n\tE2.track({\n\t\tevent: 'signInDialogOpened'\n\t})\n\n\tvar $modal = VizorUI.modalOpen(signupTemplate, 'Sign up', 'nopad mSignup', true, {backdrop:null});\n\n\tthat._bindModalLinks($modal, dfd);\n\n\tvar $form = jQuery('#signupForm', $modal);\n\tvar $usernameField = jQuery('input#username_id', $form);\n\tvar onSuccess = function(response) {\n\t\tvar user = response.data;\n\n\t\tmixpanel.alias(user.username)\n\t\tmixpanel.people.set({\n\t\t\t\"$name\": user.name,\n\t\t\tusername: user.username,\n\t\t\t\"$email\": user.email\n\t\t})\n\n\t\tE2.track({\n\t\t\tevent: 'userSignedUp',\n\t\t\tusername: user.username\n\t\t})\n\n\t\tE2.models.user.set(user);\n\t\tVizorUI.modalClose();\n\t\tVizorUI.modalAlert('Enjoy Patches, ' + user.username + '!', 'Welcome')\n\t\tdfd.resolve()\n\t};\n\n\tVizorUI.setupXHRForm($form, onSuccess);\n\tthis._setupAccountUsernameField($usernameField);\t\t// username check\n\n\treturn dfd.promise;\n}\n\nAccountController.prototype.openForgotPasswordModal = function(dfd) {\n\tdfd = dfd || when.defer();\n\tvar forgotTemplate = E2.views.partials.account.forgotpassword;\n\t\n\tE2.track({\n\t\tevent: 'forgotDialogOpened'\n\t})\n\n\n\tvar data = {\n\t\tmodal:true,\n\t\tloggedIn: false,\n\t\temail: ''\n\t}\n\n\tvar user = E2.models.user.toJSON()\n\tdata.loggedIn = (typeof user.username !== 'undefined') && (user.username !== '')\n\tif ((typeof user.email !== 'undefined') && (user.email !== ''))\n\t\tdata.email = user.email\n\n\tvar $modal = VizorUI.modalOpen(forgotTemplate(data), 'Forgot password', 'nopad mForgotpassword');\n\tthis._bindModalLinks($modal, dfd);\n\tvar $form = $('#forgotPasswordForm');\n\tVizorUI.setupXHRForm($form, function(response) {\n\t\tVizorUI.modalClose();\n\t\tif (response.success) {\n\t\t\tE2.track({ event: 'forgotPasswordReset' })\n\t\t\tVizorUI.modalAlert(response.message, 'Done');\n\t\t}\n\t\tdfd.resolve();\n\t});\n\treturn dfd.promise;\n}\n\nAccountController.prototype.openChangePasswordModal = function(dfd) {\n\tdfd = dfd || when.defer();\n\tvar resetTemplate = E2.views.partials.account.changepassword({modal:true});\n\t\n\tE2.track({ event: 'changePasswordDialogOpened' })\n\n\tvar $modal = VizorUI.modalOpen(resetTemplate, 'Change Password', 'nopad mChangepassword');\n\tthis._bindModalLinks($modal, dfd);\n\t\n\tvar $form = jQuery('#resetPasswordForm', $modal);\n\tvar onSuccess = function(response) {\n\t\tvar user = response.data;\n\t\tVizorUI.modalClose();\n\t\tE2.track({ event: 'passwordChanged', username: user.username })\n\t\tVizorUI.modalAlert('Password for ' + user.username + ' was changed.', 'Done');\n\t\tdfd.resolve();\n\t};\n\tVizorUI.setupXHRForm($form, onSuccess);\n\n\treturn dfd.promise\n}\n\nAccountController.prototype.openAccountModal = function(dfd) {\n\tvar that = this;\n\tdfd = dfd || when.defer();\n\tvar data = {\n\t\tprofile: this._model.toJSON(),\n\t\tmodal: true\n\t}\n\tvar accountTemplate = E2.views.partials.account.account(data);\n\n\tE2.track({ event: 'accountDialogOpened' })\n\n\tvar $modal = VizorUI.modalOpen(accountTemplate, 'Account', 'nopad mAccountdetails', true)\n\n\tjQuery('a#changePasswordLink', $modal).on('click', function(evt) {\n\t\tevt.preventDefault();\n\t\tVizorUI.modalClose();\n\t\tthat.openChangePasswordModal(dfd);\n\t});\n\n\n\tvar onSuccess = function(response) {\n\t\tvar user = response.data;\n\t\tE2.models.user.set(user);\n\t\tE2.track({ event: 'accountUpdated', username: E2.models.user.get('username') })\n\t\tVizorUI.modalClose();\n\t\tVizorUI.modalAlert(response.message, 'Done');\n\t\tdfd.resolve();\n\t};\n\n\tvar $form = jQuery('#accountDetailsForm', $modal);\n\tVizorUI.setupXHRForm($form, onSuccess);\n\treturn dfd.promise\n}\n\nif (typeof(exports) !== 'undefined')\n\texports.AccountController = AccountController;\n"
  },
  {
    "path": "browser/scripts/application.js",
    "content": "(function() {\n\nfunction getChannelFromPath(pathname) {\n\tvar p = pathname.split('/')\n\n\tif (p.length > 2)\n\t\treturn p[1] + '/' + p[2]\n\n\treturn p[1]\n}\n\nfunction isPublishedGraph(path) {\n\treturn path.split('/').length > 1\n}\n\nfunction Application() {\n\tvar that = this;\n\n\tE2.app = this\n\n\tthis.state = {\n\t\tSTOPPED: 0,\n\t\tPLAYING: 1,\n\t\tPAUSED: 2\n\t}\n\n\tthis.canvas = E2.dom.canvas;\n\tthis.breadcrumb = null;\n\tthis.c2d = E2.dom.canvas[0].getContext('2d');\n\tthis.editConn = null;\n\tthis.hover_slot = null;\n\tthis.hover_slot_div = null;\n\tthis.hover_connections = [];\n\tthis.hoverNode = null;\n\tthis.scrollOffset = [0, 0];\n\tthis.selection_start = null;\n\tthis.selection_end = null;\n\tthis.selection_last = null;\n\tthis.selectedNodes = [];\n\tthis.selectedConnections = [];\n\tthis.selection_dom = null;\n\tthis.inDrag = false;\n\tthis.resize_timer = null;\n\tthis.is_osx = /mac os x/.test(navigator.userAgent.toLowerCase());\n\tthis.condensed_view = false;\n\tthis.collapse_log = true;\n\tthis.selection_border_style = '1px solid #09f';\n\tthis.normal_border_style = 'none';\n\tthis.is_panning = false;\n\tthis.noodlesVisible = false\n\tthis.mousePosition = [400,200]\n\tthis.path = getChannelFromPath(window.location.pathname)\n\tthis.dispatcher = new Flux.Dispatcher()\n\tthis.undoManager = new UndoManager()\n\tthis.graphApi = new GraphApi(this.undoManager)\n\n\tthis.graphStore = new GraphStore()\n\tthis.peopleStore = new PeopleStore()\n\n\tthis.peopleManager = new PeopleManager(this.peopleStore, $('#peopleTab'))\n\n\t// Make the UI visible now that we know that we can execute JS\n\t$('.nodisplay').removeClass('nodisplay');\n\n}\n\nApplication.prototype.getNIDFromSlot = function(id) {\n\treturn id.slice(1, id.indexOf('s'));\n}\n\nApplication.prototype.getSIDFromSlot = function(id) {\n\treturn id.slice(id.indexOf('s') + 2, id.length);\n}\n\nApplication.prototype.offsetToCanvasCoord = function(ofs) {\n\tvar o = [ofs.left, ofs.top];\n\tvar co = E2.dom.canvas_parent.offset();\n\tvar so = this.scrollOffset;\n\n\to[0] -= co.left;\n\to[1] -= co.top;\n\n\to[0] += so[0];\n\to[1] += so[1];\n\n\treturn o;\n}\n\nApplication.prototype.getSlotPosition = function(node, slot_div, type, result) {\n\tvar area = node.open ? slot_div : node.ui.dom;\n\tif (!area) return false;\n\tvar areaOffset = area.offset();\n\tif (!areaOffset) return false;\n\tvar o = this.offsetToCanvasCoord(areaOffset);\n\n\tresult[0] = Math.round(type === E2.slot_type.input ? o[0] : o[0] + area.width() + (node.open ? 0 : 5));\n\tresult[1] = Math.round(o[1] + (area.height() / 2));\n}\n\nApplication.prototype.createPlugin = function(id, position) {\n\tposition = position || this.mousePosition\n\n\tfunction _create(name) {\n\t\tvar activeGraph = E2.core.active_graph\n\n\t\tvar node = new Node(activeGraph, id, position[0], position[1]);\n\n\t\tif (E2.GRAPH_NODES.indexOf(id) !== -1) { // is graph?\n\t\t\tnode.plugin.setGraph(new Graph(E2.core, activeGraph))\n\t\t\tnode.plugin.graph.plugin = node.plugin\n\t\t}\n\n\t\tif (name)\n\t\t\tnode.title = name\n\n\t\treturn node\n\t}\n\n\tswitch(id) {\n\t\tcase 'graph':\n\t\t\treturn _create('Nested Patch')\n\t\tcase 'loop':\n\t\t\treturn _create('Loop')\n\t\tcase 'array_function':\n\t\t\treturn _create('Array Function')\n\t\tcase 'spawner':\n\t\t\treturn _create('Spawner')\n\t\tdefault:\n\t\t\treturn _create()\n\t}\n\n}\n\nApplication.prototype.setActiveGraph = function(graph) {\n\tif (E2.core.active_graph === graph && graph.ui)\n\t\treturn;\n\n\tE2.app.dispatcher.dispatch({\n\t\tactionType: 'uiActiveGraphChanged',\n\t\tactiveGraphUid: graph.uid\n\t})\n\n\tthis.onGraphSelected(graph)\n\n\tif (graph.tree_node) {\n\t\tgraph.tree_node.activate()\n\t}\n}\n\nApplication.prototype.instantiatePlugin = function(id, position) {\n\tposition = position || this.mousePosition\n\tvar newX = Math.floor(position[0] + this.scrollOffset[0])\n\tvar newY = Math.floor(position[1] + this.scrollOffset[1])\n\tvar node = this.createPlugin(id, [newX, newY])\n\n\tE2.track({\n\t\tevent: 'nodeAdded',\n\t\tid: id\n\t})\n\n\tthis.graphApi.addNode(E2.core.active_graph, node)\n\treturn node\n}\n\nApplication.prototype.activateHoverSlot = function() {\n\tvar that = this\n\tvar hs = this.hover_slot;\n\n\tif(!hs)\n\t\treturn true;\n\n\t// Mark any attached connection\n\tvar conns = E2.core.active_graph.connections;\n\tvar dirty = false;\n\n\tconns.some(function(c) {\n\t\tif (c.dst_slot === hs || c.src_slot === hs) {\n\t\t\tc.ui.deleting = true;\n\t\t\tthat.hover_connections.push(c);\n\t\t\tdirty = true;\n\n\t\t\tif (hs.type === E2.slot_type.input)\n\t\t\t\treturn true; // Early out if this is an input slot, but continue searching if it's an output slot. There might be multiple connections.\n\t\t}\n\t})\n\n\tif (dirty)\n\t\tthis.updateCanvas(false);\n\treturn true;\n}\n\nApplication.prototype.releaseHoverSlot = function() {\n\tif (this.hover_slot) {\n\t\tthis.setSlotCssClasses(this.hover_slot, this.hover_slot_div);\n\t\tthis.hover_slot_div = null;\n\t\tthis.hover_slot = null;\n\t}\n\n\tthis.releaseHoverConnections();\n\treturn true;\n}\n\nApplication.prototype.setSlotCssClasses = function(slot, slot_div) {\t/* @var slot_div jQuery */\n\tif (typeof slot_div === 'undefined') return false;\n\tif (!slot_div) return false;\n\n\tif (slot_div !== this.hover_slot_div)\n\t\tslot_div.removeClass('p_connecting')\n\n\tslot_div.removeClass('p_compatible')\n\t\t\t.removeClass('p_incompatible');\n\n\tif (slot && slot.is_connected)\n\t\tslot_div.addClass('p_connected')\n\telse\n\t\tslot_div.removeClass('p_connected');\n\n\treturn true;\n}\n\nApplication.prototype.onSlotClicked = function(node, slot, slot_div, type, e) {\n\te.stopPropagation()\n\n\tif(document.activeElement)\n\t\t\tdocument.activeElement.blur();\n\tif (!E2.ui.flags.pressedShift) {\n\t\tvar graph = E2.core.active_graph\n\n\t\tif (type === E2.slot_type.output) {\n\t\t\t// drag new connection from output\n\t\t\tthis.editConn = new EditConnection(\n\t\t\t\tthis.graphApi,\n\t\t\t\tnew Connection(node, null, slot),\n\t\t\t\tslot_div,\n\t\t\t\tnull\n\t\t\t)\n\n\t\t\tslot_div.addClass('p_connecting');\n\t\t\tthis.getSlotPosition(node, slot_div, E2.slot_type.output,\n\t\t\t\tthis.editConn.ui.src_pos);\n\n\t\t\tvar offset = 0;\n\n\t\t\tvar ocs = graph.find_connections_from(node, slot);\n\t\t\tocs.sort(function(a, b) {\n\t\t\t\treturn a.offset < b.offset ? - 1 : a.offset > b.offset ? 1 : 0;\n\t\t\t})\n\n\t\t\tocs.some(function(oc, i) {\n\t\t\t\toc.offset = i;\n\n\t\t\t\tif (oc.offset != i) {\n\t\t\t\t\toffset = i;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\toffset = i + 1;\n\t\t\t});\n\n\t\t\tthis.editConn.offset = offset;\n\n\t\t} else { // drag connection from input\n\t\t\tvar conn = graph.find_connection_to(node, slot);\n\t\t\tif (!conn) {\n\t\t\t\t// new connection from input\n\t\t\t\tthis.editConn = new EditConnection(\n\t\t\t\t\tthis.graphApi,\n\t\t\t\t\tnew Connection(null, node, null, slot),\n\t\t\t\t\tnull,\n\t\t\t\t\tslot_div)\n\n\t\t\t\tthis.editConn.offset = 0;\n\n\t\t\t\tslot_div.addClass('p_connecting');\n\n\t\t\t\tthis.getSlotPosition(node, slot_div, E2.slot_type.input,\n\t\t\t\t\tthis.editConn.ui.src_pos);\n\t\t\t} else {\n\t\t\t\tthis.editConn = new EditConnection(this.graphApi, conn, null, slot_div)\n\t\t\t}\n\n\t\t\tthis.onSlotEntered(node, slot, slot_div);\n\t\t}\n\t} else {\n\t\tthis.removeHoverConnections();\n\t}\n\n\treturn false;\n}\n\nApplication.prototype.onSlotEntered = function(node, slot, slot_div) {\n\tif (this.editConn) {\n\t\tif (this.editConn.hoverSlot(node, slot)) {\t// returns canConnectTo()\n\t\t\tslot_div.removeClass('p_incompatible').addClass('p_compatible');\n\t\t} else {\n\t\t\tslot_div.removeClass('p_compatible').addClass('p_incompatible');\n\t\t}\n\t}\n\n\tthis.hover_slot = slot;\n\tthis.hover_slot_div = slot_div;\n\n\tif (E2.ui.flags.pressedShift)\n\t\tthis.activateHoverSlot()\n\n\treturn true;\n}\n\nApplication.prototype.onSlotExited = function(node, slot, slot_div) {\n\tif (this.editConn) {\n\t\tthis.editConn.blurSlot(slot)\n\t}\n\tthis.setSlotCssClasses(slot, slot_div);\n\tthis.releaseHoverSlot();\n\treturn true;\n}\n\nApplication.prototype.onLocalConnectionChanged = function(connection) {\n\tif (connection.dst_node && connection.dst_node.plugin &&\n\t\tconnection.dst_node.plugin.lsg)\n\t\tconnection.dst_node.plugin.lsg.updateFreeSlots()\n\n\tif (connection.src_node && connection.src_node.plugin &&\n\t\tconnection.src_node.plugin.lsg)\n\t\tconnection.src_node.plugin.lsg.updateFreeSlots()\n}\n\nApplication.prototype.onMouseReleased = function() {\n\tvar changed = false\n\n\t// Creating a connection?\n\tif (this.editConn) {\n\t\tvar ec = this.editConn\n\n\t\tthis.editConn = null\n\n\t\tec.commit()\n\n\t\tif (ec.srcSlotDiv)\n\t\t\tthis.setSlotCssClasses(ec.srcSlot, ec.srcSlotDiv);\n\n\t\tif (ec.dstSlotDiv)\n\t\t\tthis.setSlotCssClasses(ec.dstSlot, ec.dstSlotDiv);\n\n\t\tchanged = true\n\t}\n\n\tif (changed)\n\t\tthis.updateCanvas(true);\n\telse\n\t\tE2.dom.structure.tree.on_mouse_up();\n\n\tthis.releaseHoverSlot()\n}\n\nApplication.prototype.updateCanvas = function(clear) {\n\tvar c = this.c2d\n\tvar canvas = this.canvas[0]\n\n\tif (clear)\n\t\tc.clearRect(0, 0, canvas.width, canvas.height)\n\n\tvar conns = E2.core.active_graph.connections\n\tvar cb = [[], [], [], []]\n\tvar styles = ['#888', '#fd9720', '#09f', E2.erase_color]\n\n\tvar connsLen = conns.length\n\tfor (var i=0; i < connsLen; i++) {\n\t\tvar cui = conns[i].ui\n\t\tif (!cui) {\n\t\t\treturn console.error('Connection', i, 'from',\n\t\t\t\tconns[i].src_node.uid, 'to',\n\t\t\t\tconns[i].dst_node.uid, 'has no UI')\n\t\t}\n\n\t\t// Draw inactive connections first, then connections with data flow,\n\t\t// next selected connections and finally selected connections to\n\t\t// ensure they get rendered on top.\n\t\tcb[cui.deleting ? 3 : cui.selected ? 2 : cui.flow ? 1 : 0].push(cui.parent_conn)\n\t}\n\n\tif (this.editConn)\n\t\tcb[0].push(this.editConn.connection)\n\n\tvar so = this.scrollOffset;\n\n\tc.lineWidth = 2;\n\tc.lineCap = 'square';\n\tc.lineJoin = 'miter';\n\n\tfor(var bin = 0; bin < 4; bin++) {\n\t\tvar b = cb[bin];\n\n\t\tif(b.length > 0) {\n\t\t\tc.strokeStyle = styles[bin];\n\t\t\tc.beginPath();\n\n\t\t\tfor(var i = 0, len = b.length; i < len; i++) {\n\t\t\t\t// Noodles!\n\t\t\t\tvar cn = b[i].ui;\n\t\t\t\tvar x1 = (cn.src_pos[0] - so[0]) + 0.5;\n\t\t\t\tvar y1 = (cn.src_pos[1] - so[1]) + 0.5;\n\t\t\t\tvar x4 = (cn.dst_pos[0] - so[0]) + 0.5;\n\t\t\t\tvar y4 = (cn.dst_pos[1] - so[1]) + 0.5;\n\t\t\t\tvar diffx = Math.max(16, x4 - x1);\n\t\t\t\tvar x2 = x1 + diffx * 0.5;\n\t\t\t\tvar x3 = x4 - diffx * 0.5;\n\n\t\t\t\tc.moveTo(x1, y1);\n\t\t\t\tc.bezierCurveTo(x2, y1, x3, y4, x4, y4);\n\t\t\t}\n\n\t\t\tc.stroke();\n\t\t}\n\t}\n\n\t// Draw selection fence (if any)\n\tif (this.selection_start) {\n\t\tvar ss = this.selection_start;\n\t\tvar se = this.selection_end;\n\t\tvar so = this.scrollOffset;\n\t\tvar s = [ss[0] - so[0], ss[1] - so[1]];\n\t\tvar e = [se[0] - so[0], se[1] - so[1]];\n\n\t\tc.lineWidth = 2;\n\t\tc.strokeStyle = '#09f';\n\t\tc.strokeRect(s[0], s[1], e[0] - s[0], e[1] - s[1]);\n\t}\n}\n\nApplication.prototype.mouseEventPosToCanvasCoord = function(e, result) {\n\tvar cp = E2.dom.canvases[0];\n\n\tresult[0] = (e.pageX - cp.offsetLeft) + this.scrollOffset[0];\n\tresult[1] = (e.pageY - cp.offsetTop) + this.scrollOffset[1];\n}\n\nApplication.prototype.releaseHoverNode = function(release_conns) {\n\tif (this.hoverNode !== null) {\n\t\tthis.hoverNode = null\n\n\t\tif (release_conns)\n\t\t\tthis.releaseHoverConnections()\n\t}\n}\n\nApplication.prototype.clearHoverState = function() {\n\tthis.hover_slot = null;\n\tthis.hover_slot_div = null;\n\tthis.hover_connections = [];\n\tthis.hoverNode = null;\n}\n\nApplication.prototype.clearEditState = function()\n{\n\tthis.editConn = null;\n\tthis.clearHoverState()\n}\n\nApplication.prototype.releaseHoverConnections = function() {\n\tthis.hover_connections.map(function(hc) {\n\t\thc.ui.deleting = false\n\t})\n\n\tthis.hover_connections = []\n\n\tthis.updateCanvas(false)\n}\n\nApplication.prototype.removeHoverConnections = function() {\n\tthis.hover_connections.map(function(connection) {\n\t\tthis.graphApi.disconnect(E2.core.active_graph, connection)\n\t}.bind(this))\n\n\tthis.hover_connections = []\n}\n\nApplication.prototype.deleteSelectedConnections = function() {\n\tthis.selectedConnections.map(function(connection) {\n\t\tthis.graphApi.disconnect(E2.core.active_graph, connection)\n\t}.bind(this))\n\n\tthis.hover_connections = []\n}\n\nApplication.prototype.deleteSelectedNodes = function() {\n\tvar that = this\n\tvar hns = this.selectedNodes\n\tvar ag = E2.core.active_graph\n\n\tthis.undoManager.begin('Delete nodes')\n\n\tthis.releaseHoverNode(false)\n\n\tthis.deleteSelectedConnections()\n\n\thns.forEach(function(n) {\n\t\tthat.graphApi.removeNode(n.parent_graph, n)\n\t})\n\n\tthis.undoManager.end('Delete nodes')\n\n\tthis.clearSelection()\n}\n\nApplication.prototype.onNodeHeaderEntered = function(node) {\n\tthis.hoverNode = node\n}\n\nApplication.prototype.onNodeHeaderExited = function() {\n\tthis.releaseHoverNode(true)\n}\n\nApplication.prototype.onNodeHeaderMousedown = function() {\n\tif (!this.hoverNode)\n\t\treturn;\n\n\tvar isIn = this.isNodeInSelection(this.hoverNode)\n\tvar addNode\n\n\tif (!E2.ui.flags.pressedShift) {\n\t\tif (!isIn) {\n\t\t\tthis.clearSelection()\n\t\t\taddNode = this.hoverNode\n\t\t}\n\t} else {\n\t\tif (isIn)\n\t\t\tthis.deselectNode(this.hoverNode)\n\t\telse\n\t\t\taddNode = this.hoverNode\n\t}\n\n\tif (addNode) {\n\t\tthis.markNodeAsSelected(addNode)\n\t\taddNode.getConnections().map(this.markConnectionAsSelected.bind(this))\n\t}\n}\n\nApplication.prototype.onNodeHeaderClicked = function() {\n}\n\nApplication.prototype.onNodeHeaderDblClicked = function(node) {\n\n}\n\nApplication.prototype.isNodeInSelection = function(node) {\n\treturn this.selectedNodes.indexOf(node) > -1\n}\n\nApplication.prototype.executeNodeDrag = function(nodes, conns, dx, dy) {\n\tvar nl = nodes.length\n\n\tfor(var i=0; i < nl; i++) {\n\t\tvar node = nodes[i]\n\t\tnode.x += dx\n\t\tnode.y += dy\n\n\t\tif (!node.ui)\n\t\t\tcontinue;\n\t\tnode.ui.setPosition(node.x,node.y);\n\t}\n\n\tvar cl = conns.length\n\tvar changed = false // eg. if not active graph\n\n\tif (cl && conns[0].ui) {\n\t\tchanged = true\n\n\t\tfor (var i=0; i < cl; i++) {\n\t\t\tE2.app.redrawConnection(conns[i])\n\t\t}\n\t}\n\n\tif (changed)\n\t\tthis.updateCanvas(true)\n}\n\nApplication.prototype.onNodeDragged = function(node) {\n\tvar nd = node.ui.dom[0]\n\tvar dx = Math.floor(nd.offsetLeft) - Math.floor(node.x)\n\tvar dy = Math.floor(nd.offsetTop) - Math.floor(node.y)\n\n\tif (!dx && !dy)\n\t\treturn;\n\n\tif (!this.inDrag) {\n\t\tthis.inDrag = true\n\n\t\tvar nodes = [ node ]\n\n\t\tif (this.isNodeInSelection(node))\n\t\t\tnodes = this.selectedNodes\n\n\t\tthis._dragInfo = {\n\t\t\toriginal: { x: node.x, y: node.y },\n\t\t\tconnections: nodes.reduce(function(arr, curr) {\n\t\t\t\treturn arr.concat(curr.getConnections())\n\t\t\t}, [])\n\t\t}\n\n\t\tthis.undoManager.begin('Move')\n\n\t\tthis._dragInfo.nodes = nodes\n\t}\n\n\tif (this._dragInfo)\n\t\tthis.executeNodeDrag(this._dragInfo.nodes, this._dragInfo.connections, dx, dy)\n}\n\nApplication.prototype.onNodeDragStopped = function(node) {\n\tthis.onNodeDragged(node)\n\n\tif (!this._dragInfo) {\n\t\tthis.inDrag = false\n\t\treturn;\n\t}\n\n\tvar di = this._dragInfo\n\tvar nd = node.ui.dom[0]\n\tvar dx = nd.offsetLeft - di.original.x\n\tvar dy = nd.offsetTop - di.original.y\n\n\tvar cmd = new E2.commands.graph.Move(\n\t\tE2.core.active_graph,\n\t\tdi.nodes,\n\t\tdx, dy\n\t)\n\n\tthis.undoManager.push(cmd)\n\tthis.undoManager.end()\n\n\tthis._dragInfo = null\n\tthis.inDrag = false\n\n\tE2.app.channel.send({\n\t\tactionType: 'uiNodesMoved',\n\t\tgraphUid: E2.core.active_graph.uid,\n\t\tnodeUids: di.nodes.map(function(n) { return n.uid }),\n\t\tdelta: { x: dx, y: dy }\n\t})\n}\n\nApplication.prototype.redrawConnection = function(connection) {\t/* @TODO: rename this method */\n\tvar cn = connection\n\tif (!cn.ui) {\n\t\tconsole.warn('redrawConnection but no ui for ' + cn.uid);\n\t\treturn;\n\t}\n\tvar cui = cn.ui\n\n\tthis.getSlotPosition(cn.src_node, cui.src_slot_div, E2.slot_type.output, cui.src_pos);\n\tthis.getSlotPosition(cn.dst_node, cui.dst_slot_div, E2.slot_type.input, cui.dst_pos);\n}\n\nApplication.prototype.onCanvasMouseDown = function(e) {\n\tif (e.target.id !== 'canvas')\n\t\treturn;\n\n\te.stopPropagation()\n\te.preventDefault()\n\n\tif (e.which === 1) {\n\t\tthis.selection_start = [0, 0];\n\t\tthis.mouseEventPosToCanvasCoord(e, this.selection_start);\n\t\tthis.selection_end = this.selection_start.slice(0);\n\t\tthis.selection_last = [e.pageX, e.pageY];\n\t\tthis.clearSelection();\n\t\tthis.selection_dom = E2.dom.canvas_parent.find(':input').addClass('noselect'); //.attr('disabled', 'disabled');\n\t} else if (e.which === 2) {\n\t\tthis.is_panning = true;\n\t\tthis.canvas[0].style.cursor = 'move';\n\t\te.preventDefault();\n\t\treturn;\n\t} else {\n\t\tthis.releaseSelection()\n\t\tthis.clearSelection()\n\t\tE2.app.updateCanvas()\n\t}\n\n\tthis.updateCanvas(false)\n}\n\nApplication.prototype.releaseSelection = function() {\n\tthis.selection_start = null;\n\tthis.selection_end = null;\n\tthis.selection_last = null;\n\tE2.ui.state.selectedObjects = this.selectedNodes\n\n\tif(this.selection_dom)\n\t\tthis.selection_dom.removeClass('noselect'); // .removeAttr('disabled');\n\n\tthis.selection_dom = null;\n}\n\nApplication.prototype.onCanvasMouseUp = function(e) {\n\tif (e.which === 2) {\n\t\tthis.is_panning = false;\n\t\tthis.canvas[0].style.cursor = '';\n\t\te.preventDefault();\n\t\treturn;\n\t}\n\n\tif (!this.selection_start)\n\t\treturn;\n\n\tthis.releaseSelection();\n\n\tvar nodes = this.selectedNodes;\n\n\tif (nodes.length) {\n\t\tvar sconns = this.selectedConnections;\n\n\t\tvar insert_all = function(clist) {\n\t\t\tfor(var i = 0, len = clist.length; i < len; i++) {\n\t\t\t\tvar c = clist[i];\n\t\t\t\tvar found = false;\n\n\t\t\t\tfor(var ci = 0, cl = sconns.length; ci < cl; ci++) {\n\t\t\t\t\tif (c === sconns[ci]) {\n\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!found) {\n\t\t\t\t\tc.ui.selected = true;\n\t\t\t\t\tsconns.push(c);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Select all pertinent connections\n\t\tfor(var i = 0, len = nodes.length; i < len; i++) {\n\t\t\tvar n = nodes[i];\n\n\t\t\tinsert_all(n.inputs);\n\t\t\tinsert_all(n.outputs);\n\t\t}\n\t}\n\n\tthis.inDrag = false;\n\tthis.updateCanvas(true);\n\n\t// Clear focus to prevent problems with the user dragging over text areas (bringing them in focus) during selection.\n\tif(document.activeElement)\n\t\t\tdocument.activeElement.blur();\n}\n\nApplication.prototype.onMouseMoved = function(e) {\n\tthis.mousePosition = [e.pageX, e.pageY];\n\n\tif(this.is_panning) {\n\t\tvar cp = E2.dom.canvas_parent\n\n\t\tif(e.movementX) {\n\t\t\tcp.scrollLeft(this.scrollOffset[0]-e.movementX)\n\t\t\tthis.scrollOffset[0] = cp.scrollLeft()\n\t\t}\n\n\t\tif(e.movementY) {\n\t\t\tcp.scrollTop(this.scrollOffset[1]-e.movementY)\n\t\t\tthis.scrollOffset[1] = cp.scrollTop()\n\t\t}\n\n\t\te.preventDefault()\n\t\treturn\n\t} else if(this.editConn) {\n\t\tvar cp = E2.dom.canvas_parent\n\t\tvar pos = cp.position()\n\t\tvar w = cp.width()\n\t\tvar h = cp.height()\n\t\tvar x2 = pos.left + w\n\t\tvar y2 = pos.top + h\n\n\t\tif(e.pageX < pos.left)\n\t\t\tcp.scrollLeft(this.scrollOffset[0] - 20)\n\t\telse if(e.pageX > x2)\n\t\t\tcp.scrollLeft(this.scrollOffset[0] + 20)\n\n\t\tif(e.pageY < pos.top)\n\t\t\tcp.scrollTop(this.scrollOffset[1] - 20)\n\t\telse if(e.pageY > y2)\n\t\t\tcp.scrollTop(this.scrollOffset[1] + 20)\n\n\t\tthis.mouseEventPosToCanvasCoord(e, this.editConn.ui.dst_pos)\n\t\tthis.updateCanvas(true)\n\n\t\treturn\n\t} else if(!this.selection_start) {\n\t\tE2.dom.structure.tree.on_mouse_move(e)\n\t\treturn\n\t}\n\n\tif (this.selection_end)\n\t\treturn this._performSelection(e)\n}\n\nApplication.prototype._performSelection = function(e) {\n\tthis.mouseEventPosToCanvasCoord(e, this.selection_end)\n\n\tvar nodes = E2.core.active_graph.nodes\n\tvar cp = E2.dom.canvas_parent\n\n\tvar ss = this.selection_start.slice(0)\n\tvar se = this.selection_end.slice(0)\n\n\tfor(var i = 0; i < 2; i++) {\n\t\tif (se[i] < ss[i]) {\n\t\t\tvar t = ss[i]\n\t\t\tss[i] = se[i]\n\t\t\tse[i] = t\n\t\t}\n\t}\n\n\tvar sn = this.selectedNodes\n\tvar ns = []\n\n\tfor(var i = 0, len = sn.length; i < len; i++)\n\t\tsn[i].ui.setSelected(false);\n\n\tfor(var i = 0, len = nodes.length; i < len; i++) {\n\t\tvar n = nodes[i]\n\t\tif (n && (typeof n.ui === 'undefined')) continue; // recover, should a node ref ever break..\n\t\tvar nui = n.ui.dom[0]\n\t\tvar p_x = nui.offsetLeft\n\t\tvar p_y = nui.offsetTop\n\t\tvar p_x2 = p_x + nui.clientWidth\n\t\tvar p_y2 = p_y + nui.clientHeight\n\n\t\tif (se[0] < p_x || se[1] < p_y || ss[0] > p_x2 || ss[1] > p_y2)\n\t\t\tcontinue; // No intersection.\n\n\t\tif (!n.ui.selected) \t{\n\t\t\tthis.markNodeAsSelected(n, false)\n\t\t\tns.push(n)\n\t\t}\n\t}\n\n\tfor(var i = 0, len = sn.length; i < len; i++) {\n\t\tvar n = sn[i]\n\n\t\tif (!n.ui.selected) n.ui.setSelected(false);\n\t}\n\n\tthis.selectedNodes = ns\n\n\tvar co = cp.offset();\n\tvar w = cp.width();\n\tvar h = cp.height();\n\tvar dx = e.pageX - this.selection_last[0];\n\tvar dy = e.pageY - this.selection_last[1];\n\n\tif((dx < 0 && e.pageX < co.left + (w * 0.15)) || (dx > 0 && e.pageX > co.left + (w * 0.85)))\n\t\tcp.scrollLeft(this.scrollOffset[0] + dx);\n\n\tif((dy < 0 && e.pageY < co.top + (h * 0.15)) || (dy > 0 && e.pageY > co.top + (h * 0.85)))\n\t\tcp.scrollTop(this.scrollOffset[1] + dy);\n\n\tthis.selection_last[0] = e.pageX;\n\tthis.selection_last[1] = e.pageY;\n\n\tthis.updateCanvas(true);\n}\n\nApplication.prototype.selectionToObject = function(nodes, conns, sx, sy) {\n\tvar d = {}\n\tvar x1 = 9999999.0, y1 = 9999999.0, x2 = 0, y2 = 0;\n\n\tsx = sx || 50\n\tsy = sy || 50\n\n\td.nodes = [];\n\td.conns = [];\n\n\tvar domHasValidDimensions = true\n\n\tfor(var i = 0, len = nodes.length; i < len; i++) {\n\t\tvar n = nodes[i];\n\t\tvar dom = n.ui ? n.ui.dom : null;\n\n\t\tdomHasValidDimensions = domHasValidDimensions && (dom ? true : false)\n\t\tif (domHasValidDimensions && dom.position().left === 0 && dom.position().top === 0 && dom.width() === 0 && dom.height() === 0) {\n\t\t\t// dom is there but not visible (graph is hidden), use default dimensions instead\n\t\t\tdomHasValidDimensions = false\n\t\t}\n\n\t\tvar p, width, height\n\n\t\tif (domHasValidDimensions) {\n\t\t\tp = dom.position()\n\t\t\twidth = dom.width()\n\t\t\theight = dom.height()\n\t\t}\n\t\telse {\n\t\t\t// defaults\n\t\t\tp = { left: n.x, top: n.y }\n\t\t\twidth = 100\n\t\t\theight = 20\n\t\t}\n\n\t\tvar b = [p.left, p.top, p.left + width, p.top + height];\n\n\t\tif (b[0] < x1) x1 = b[0];\n\t\tif (b[1] < y1) y1 = b[1];\n\t\tif (b[2] > x2) x2 = b[2];\n\t\tif (b[3] > y2) y2 = b[3];\n\n\t\td.nodes.push(n.serialise());\n\t}\n\n\tif (domHasValidDimensions) {\n\t\td.x1 = x1 + sx;\n\t\td.y1 = y1 + sy;\n\t\td.x2 = x2 + sx;\n\t\td.y2 = y2 + sy;\n\t}\n\telse {\n\t\td.x1 = x1\n\t\td.y1 = y1\n\t\td.x2 = x2\n\t\td.y2 = y2\n\t}\n\n\tfor(var i = 0, len = conns.length; i < len; i++) {\n\t\tvar c = conns[i];\n\t\td.conns.push(c.serialise())\n\t}\n\n\treturn d\n}\n\nApplication.prototype.stringifyNodesAndConnections = function(nodes, conns, sx, sy) {\n\treturn JSON.stringify(\n\t\tthis.selectionToObject(nodes, conns, sx, sy)\n\t)\n}\n\nApplication.prototype.onDelete = function(e) {\n\tif (!this.isWorldEditorActive() && !this.selectedNodes.length)\n\t\treturn;\n\n\tif (this.isWorldEditorActive()) {\n\t\tif (!this.worldEditor.selectedEntityPatch)\t{\n\t\t\tE2.app.growl('could not delete')\n\t\t\treturn\n\t\t}\n\t\tvar sn = this.worldEditor.selectedEntityNode\n\t\tthis.setActiveGraph(this.worldEditor.selectedEntityPatch.parent_graph)\n\t\tthis.selectedNodes = []\n\t\tthis.selectedConnections = sn.outputs.concat(sn.inputs)\n\t\tthis.markNodeAsSelected(sn)\n\t\tthis.worldEditor.onDelete(this.selectedNodes)\n\t}\n\n\tthis.hoverNode = this.selectedNodes[0]\n\n\tthis.deleteSelectedNodes()\n}\n\nApplication.prototype.stringifySelection = function() {\n\treturn this.stringifyNodesAndConnections(\n\t\tthis.selectedNodes,\n\t\tthis.selectedConnections,\n\t\tthis.scrollOffset[0],\n\t\tthis.scrollOffset[1])\n}\n\nApplication.prototype.onCopy = function(e) {\n\tif (e)\n\t\te.preventDefault()\n\n\tif (this.selectedNodes.length < 1) {\n\t\tmsg('Copy: Nothing selected.')\n\n\t\treturn false\n\t}\n\n\tvar data = this.stringifySelection()\n\n\tthis.clipboard = data\n\n\tif (e && e.clipboardData)\n\t\te.clipboardData.setData('text/plain', data)\n\n\treturn false\n}\n\nApplication.prototype.onCut = function(e) {\n\tif (this.selectedNodes.length > 0) {\n\t\tthis.undoManager.begin('Cut')\n\t\tthis.onCopy(e)\n\t\tthis.onDelete(e)\n\t\tthis.undoManager.end()\n\t}\n}\n\nApplication.prototype.removeEntityFromScene = function(entityName) {\n\tvar node = E2.core.root_graph.findNodeByPlugin(entityName)\n\n\tif (!node)\n\t\treturn\n\n\tthis.graphApi.removeNode(E2.core.root_graph, node)\n}\n\nApplication.prototype.pasteFromClipboard = function() {\n\treturn this.pasteJson(this.clipboard)\n}\n\nApplication.prototype.pasteJson = function(json) {\n\tif (!json)\n\t\treturn;\n\n\tvar doc\n\n\ttry {\n\t\tdoc = JSON.parse(json)\n\t} catch(e) {\n\t\treturn;\n\t}\n\n\treturn this.pasteObject(doc)\n}\n\nApplication.prototype.pasteObject = function(doc) {\n\tthis.clearSelection()\n\n\tif (doc.root)\n\t\tdoc = doc.root\n\n\tvar cp = E2.dom.canvases\n\tvar sx = this.scrollOffset[0]\n\tvar sy = this.scrollOffset[1]\n\n\t// pasted node bbox: doc.x1, doc.y1 - doc.x2, doc.y2\n\n\tvar ox = Math.max(this.mousePosition[0] - cp.position().left + sx, 100)\n\tvar oy = Math.max(this.mousePosition[1] - cp.position().top + sy, 100)\n\n\tif (this.isWorldEditorActive()) {\n\t\treturn this.worldEditor.paste(doc, ox, oy)\n\t} else {\n\t\tvar pasted = this.paste(doc, ox, oy)\n\t\tpasted.nodes.map(this.markNodeAsSelected.bind(this))\n\t\tpasted.connections.map(this.markConnectionAsSelected.bind(this))\n\t\treturn pasted\n\t}\n}\n\nApplication.prototype.paste = function(srcDoc, offsetX, offsetY) {\n\treturn this.pasteInGraph(E2.core.active_graph, srcDoc, offsetX, offsetY)\n}\n\nApplication.prototype.pasteInGraph = function(targetGraph, srcDoc, offsetX, offsetY) {\n\tthis.undoManager.begin('Paste')\n\n\toffsetX = offsetX || 0\n\toffsetY = offsetY || 0\n\n\tvar createdNodes = []\n\tvar createdConnections = []\n\tvar globalUidMap = {}\n\n\tvar leftEdgeFound\n\tvar topEdgeFound\n\n\t// find top left edge offset in patch\n\tfor (var i=0; i < srcDoc.nodes.length; i++) {\n\t\tvar n = srcDoc.nodes[i]\n\t\tif (!leftEdgeFound || n.x < leftEdgeFound)\n\t\t\tleftEdgeFound = n.x\n\t\tif (!topEdgeFound || n.y < topEdgeFound)\n\t\t\ttopEdgeFound = n.y\n\t}\n\n\tfunction placeDocNode(docNode) {\n\t\tdocNode.x = Math.floor((docNode.x - leftEdgeFound) + offsetX)\n\t\tdocNode.y = Math.floor((docNode.y - topEdgeFound) + offsetY)\n\t}\n\n\tfunction mapSlotIds(sids, localUidMap) {\n\t\tvar nsids = {}\n\t\tObject.keys(sids).map(function(oldUid) {\n\t\t\tnsids[localUidMap[oldUid]] = sids[oldUid]\n\t\t})\n\t\treturn nsids\n\t}\n\n\tfunction remapGraph(g, graphNode) {\n\t\tvar graph = _.clone(g)\n\t\tvar localUidMap = {}\n\n\t\tvar newUid = E2.core.get_uid()\n\t\tglobalUidMap[graph.uid] = newUid\n\t\tgraph.uid = newUid\n\n\t\tgraph.nodes.map(function(node) {\n\t\t\tnewUid = E2.core.get_uid()\n\t\t\tglobalUidMap[node.uid] = newUid\n\t\t\tlocalUidMap[node.uid] = newUid\n\t\t\tnode.uid = newUid\n\n\t\t\tif (Node.isGraphPlugin(node.plugin))\n\t\t\t\tnode.graph = remapGraph(node.graph, node)\n\t\t})\n\n\t\tif (graphNode) {\n\t\t\tvar s = graphNode.state\n\n\t\t\tif (s.input_sids)\n\t\t\t\ts.input_sids = mapSlotIds(s.input_sids, localUidMap)\n\n\t\t\tif (s.output_sids)\n\t\t\t\ts.output_sids = mapSlotIds(s.output_sids, localUidMap)\n\t\t}\n\n\t\tgraph.conns.map(function(conn) {\n\t\t\tconn.src_nuid = localUidMap[conn.src_nuid]\n\t\t\tconn.dst_nuid = localUidMap[conn.dst_nuid]\n\t\t\tconn.uid = E2.uid()\n\t\t})\n\n\t\treturn graph\n\t}\n\n\tfunction remapNodeReferences(graph) {\n\t\tgraph.nodes.map(function(node) {\n\t\t\tif (Node.isGraphPlugin(node.plugin))\n\t\t\t\tnode.graph = remapNodeReferences(node.graph)\n\n\t\t\t// eg. gaze clickers refer to the target node with a nodeRef\n\t\t\tif (node.state && node.state.nodeRef) {\n\t\t\t\tvar s = node.state\n\t\t\t\tvar ref = s.nodeRef.split('.')\n\t\t\t\tvar graphUid = ref[0]\n\t\t\t\tvar nodeUid = ref[1]\n\n\t\t\t\tgraphUid = globalUidMap[graphUid]\n\t\t\t\tnodeUid = globalUidMap[nodeUid]\n\n\t\t\t\t// they have not been remapped (copy & paste in existing graph)\n\t\t\t\tif (!graphUid || !nodeUid)\n\t\t\t\t\treturn;\n\n\t\t\t\ts.nodeRef = graphUid + '.' + nodeUid\n\t\t\t}\n\t\t})\n\n\t\treturn graph\n\t}\n\n\t// remap all UID's inside the pasted doc so they are unique in the graph tree.\n\tvar doc = remapGraph(srcDoc)\n\tdoc = remapNodeReferences(doc)\n\n\tfor(var i = 0, len = doc.nodes.length; i < len; i++) {\n\t\tvar docNode = doc.nodes[i]\n\t\tplaceDocNode(docNode)\n\t\tthis.graphApi.addNode(targetGraph, Node.hydrate(targetGraph.uid, docNode))\n\t\tcreatedNodes.push(targetGraph.findNodeByUid(docNode.uid))\n\t}\n\n\tfor(i = 0, len = doc.conns.length; i < len; i++) {\n\t\tvar dc = doc.conns[i]\n\n\t\tif (!dc.dst_nuid || !dc.src_nuid)\n\t\t\tcontinue;\n\n\t\tvar destNode = targetGraph.findNodeByUid(dc.dst_nuid)\n\t\tif (!destNode)\n\t\t\tcontinue;\n\n\t\tvar slot = dc.dst_dyn ?\n\t\t\tdestNode.dyn_inputs[dc.dst_slot] :\n\t\t\tdestNode.findInputSlotByName(dc.dst_slot)\n\n\t\tif (!slot) {\n\t\t\tconsole.warn('Slot not found in', destNode.plugin.id, dc,\n\t\t\t\tdestNode.dyn_inputs)\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (dc.src_nuid === undefined || dc.dst_nuid === undefined) {\n\t\t\t// not a valid connection, clear it and skip it\n\t\t\tif (dc.dst_nuid !== undefined) {\n\t\t\t\tslot.is_connected = false\n\t\t\t\tslot.connected = false\n\t\t\t\tdestNode.inputs_changed = true\n\t\t\t}\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tthis.graphApi.connect(targetGraph, Connection.hydrate(targetGraph, dc))\n\n\t\tcreatedConnections.push(targetGraph.findConnectionByUid(dc.uid))\n\t}\n\n\tthis.undoManager.end()\n\n\treturn {\n\t\tnodes: createdNodes,\n\t\tconnections: createdConnections\n\t}\n}\n\nApplication.prototype.getNodeBoundingBox = function(node) {\n\tvar dom = node.ui ? node.ui.dom : null;\n\tvar pos = { left: node.x, top: node.y }\n\n\tvar width = (dom ? dom.width() : 0)\n\tvar height = (dom ? dom.height() : 0)\n\n\t// default width & height if the graph is not visible\n\tif (width === 0)\n\t\twidth = 200\n\n\tif (height === 0)\n\t\theight = node.open ? 60 : 30\n\n\treturn {\n\t\tx1: pos.left,\n\t\ty1: pos.top,\n\t\tx2: pos.left + width,\n\t\ty2: pos.top + height\n\t}\n}\n\n// find a space for doc in the graph\n// return a {x: ..., y: ...} object with coordinates\n// where the object will fit without overlapping with\n// any pre-existing nodes\nApplication.prototype.findSpaceInGraphFor = function(activeGraph, desiredPlace, leftOfNode) {\n\t// minimum spacing between nodes\n\tvar spacing = { x: 20, y: 10 }\n\tvar box = {\n\t\tx1: desiredPlace.x || 200,\n\t\ty1: desiredPlace.y || 200,\n\t}\n\tbox.x2 = box.x1 + 200\n\tbox.y2 = box.y1 + 30\n\n\t// create sorted array of nodes in y\n\tvar sortedNodes = activeGraph.nodes.slice()\n\tsortedNodes.sort(function(a, b) {\n\t\tvar ay = a.y, by = b.y\n\t\tif (a.open) ay += 30\n\t\tif (b.open) by += 30\n\t\treturn ay - by\n\t})\n\n\t// filter out nodes not connected to leftOfNode\n\tif (leftOfNode) {\n\t\tsortedNodes = sortedNodes.filter(function(node) {\n\t\t\treturn node.outputs.some(function(connection) {\n\t\t\t\treturn connection.dst_node === leftOfNode\n\t\t\t})\n\t\t})\n\t}\n\n\t// find the initial set of bboxes that account for this operation -\n\t// i.e. anything below the pasted node set\n\tvar bboxes = []\n\n\tfor(var i = 0; i < sortedNodes.length; ++i) {\n\t\tvar bbox = this.getNodeBoundingBox(sortedNodes[i])\n\n\t\tif (bbox.y2 + spacing.y < box.y1) {\n\t\t\t// ignore any nodes above our one, they don't matter\n\t\t\tcontinue\n\t\t}\n\t\telse {\n\t\t\tbboxes.push(bbox)\n\t\t}\n\t}\n\n\t// easy case, nothing overlaps\n\tif (bboxes.length === 0) {\n\t\treturn {x: box.x1, y: box.y1}\n\t}\n\n\t// easy case, the next node is outside our bbox vertically\n\tif (bboxes[0].y1 > box.y2 + spacing.y) {\n\t\treturn {x: box.x1, y: box.y1}\n\t}\n\n\t// scan the set of bboxes down to find space for our pasted node(s)\n\n\t// helper function to find space for pasteBbox within\n\t// an area filled with graphNodeBboxes\n\t// returns a {x1, y1, x2, y2} object with an area large\n\t// enough to contain pasteBbox.\n\tfunction autoLayout(pasteBbox, graphNodeBboxes) {\n\t\tfor(var i = 0; i < graphNodeBboxes.length; ++i) {\n\t\t\tif (graphNodeBboxes[i].y1 > pasteBbox.y2 + spacing.y) {\n\t\t\t\t// nothing overlaps anymore - return the current location\n\t\t\t\treturn pasteBbox\n\t\t\t}\n\t\t\telse if (pasteBbox.x1 - spacing.x > graphNodeBboxes[i].x2 || pasteBbox.x2 + spacing.x < graphNodeBboxes[i].x1) {\n\t\t\t\t// ignore any bboxes entirely outside the candidate bbox\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// move the candidate bbox down by offset = height of a node + spacing\n\t\t\t\t// and recurse back into trying to match the new candidate area\n\t\t\t\tvar offset = graphNodeBboxes[i].y2 - pasteBbox.y1 + spacing.y\n\t\t\t\tvar newBboxes = graphNodeBboxes.splice(i + 1)\n\t\t\t\tvar newNodeBbox = {\n\t\t\t\t\t// line up left with box above\n\t\t\t\t\tx1: graphNodeBboxes[i].x1, y1: pasteBbox.y1 + offset,\n\t\t\t\t\tx2: graphNodeBboxes[i].x2, y2: pasteBbox.y2 + offset\n\t\t\t\t}\n\n\t\t\t\treturn autoLayout(newNodeBbox, newBboxes)\n\t\t\t}\n\t\t}\n\n\t\treturn pasteBbox\n\t}\n\n\tbox = autoLayout(box, bboxes)\n\n\treturn { x: box.x1, y: box.y1 }\n}\n\nApplication.prototype.markNodeAsSelected = function(node, addToSelection) {\n\tif (node.ui)\n\t\tnode.ui.setSelected(true)\n\n\tif (addToSelection !== false) {\n\t\tthis.selectedNodes.push(node)\n\t\tE2.ui.state.selectedObjects = this.selectedNodes\n\t}\n\n\tif (!this.isWorldEditorActive() && node.isEntityPatch())\n\t\tthis.worldEditor.selectEntityPatch(node)\n}\n\nApplication.prototype.deselectNode = function(node) {\n\tthis.selectedNodes.splice(this.selectedNodes.indexOf(node), 1)\n\tnode.ui.setSelected(false);\n\tE2.ui.state.selectedObjects = this.selectedNodes\n}\n\nApplication.prototype.markConnectionAsSelected = function(conn) {\n\tif (conn.ui)\n\t\tconn.ui.selected = true\n\tthis.selectedConnections.push(conn)\n}\n\nApplication.prototype.clearSelection = function(alsoClearWorldEditor) {\n\talsoClearWorldEditor = (typeof alsoClearWorldEditor === 'undefined') ? true : !!alsoClearWorldEditor\n\tvar sn = this.selectedNodes;\n\tvar sc = this.selectedConnections;\n\n\tfor(var i = 0, len = sn.length; i < len; i++) {\n\t\tvar nui = sn[i].ui;\n\n\t\tif(nui) {\n\t\t\tnui.setSelected(false);\n\t\t}\n\t}\n\n\tfor(var i = 0, len = sc.length; i < len; i++) {\n\t\tvar cui = sc[i].ui;\n\n\t\tif(cui)\n\t\t\tcui.selected = false;\n\t}\n\n\tthis.clearNodeSelection()\n\n\tif (alsoClearWorldEditor)\n\t\tthis.worldEditor.clearSelection()\n}\n\nApplication.prototype.clearNodeSelection = function() {\n\tthis.selectedNodes = []\n\tthis.selectedConnections = []\n\tE2.ui.state.selectedObjects = this.selectedNodes\n}\n\nApplication.prototype.selectAll = function() {\n\tthis.clearSelection()\n\n\tvar ag = E2.core.active_graph\n\tag.nodes.map(this.markNodeAsSelected.bind(this))\n\tag.connections.map(this.markConnectionAsSelected.bind(this))\n\tthis.updateCanvas(true)\n}\n\n/**\n * Calculate real area left for canvas\n * @return {Object} Canvas area\n */\nApplication.prototype.calculateCanvasArea = function() {\n\tvar width, height\n\tvar isFullscreen = E2.util.isFullscreen()\n\n\tif (!isFullscreen && !this.condensed_view) {\n\t\twidth = $(window).width();\n\t\theight = $(window).height() -\n\t\t\t$('.editor-header').outerHeight(true) - $('#row2').outerHeight(true) - $('.bottom-panel').outerHeight(true);\n\t} else {\n\t\twidth = window.innerWidth\n\t\theight = window.innerHeight\n\t}\n\n\treturn {\n\t\twidth: width,\n\t\theight: height\n\t}\n}\n\nApplication.prototype.onWindowResize = function() {\n\tif (E2.util.isFullscreen())\n\t\treturn\n\n\tvar canvasArea = this.calculateCanvasArea()\n\tvar width = canvasArea.width\n\tvar height = canvasArea.height\n\n\t// Set noodles canvas size\n\tE2.dom.canvas[0].width = width\n\tE2.dom.canvas[0].height = height\n\tE2.dom.canvas.css('width', width)\n\tE2.dom.canvas.css('height', height)\n\n\tthis.updateCanvas(true)\n}\n\nApplication.prototype.toggleNoodles = function() {\n\tthis.noodlesVisible = !this.noodlesVisible;\n\tE2.ui.togglePatchEditor(this.noodlesVisible);\n}\n\nApplication.prototype.canInitiateCameraMove = function(e) {\n\treturn E2.util.isFullscreen() || this.isVRCameraActive() && E2.util.isCanvasInFocus(e)\n}\n\nApplication.prototype.setViewCamera = function(isBirdsEyeCamera) {\n\tthis.worldEditor.selectCamera(isBirdsEyeCamera ? 'birdsEye' : 'vr')\n\n\t// if helper objects are off, and we're in vr camera, disable world editor entirely\n\tif (!this.worldEditor.areEditorHelpersActive() && !isBirdsEyeCamera) {\n\t\tthis.worldEditor.deactivate()\n\t}\n\telse if (!this.worldEditor.isActive()) {\n\t\tthis.worldEditor.activate()\n\t}\n}\n\n// is the VR (experience) camera active AND controllable?\n// i.e. graph is not visible\nApplication.prototype.isVRCameraActive = function() {\n\treturn !this.noodlesVisible && (!E2.app.worldEditor.isActive() || E2.app.worldEditor.cameraSelector.selectedCamera === 'vr')\n}\n\n// is the world editor visible AND controllable\n// i.e. graph is not visible\nApplication.prototype.isWorldEditorActive = function() {\n\treturn !this.noodlesVisible && E2.app.worldEditor.isActive()\n}\n\nApplication.prototype.toggleFullscreen = function() {\n\tvar goingToFullscreen = !E2.util.isFullscreen()\n\tif (goingToFullscreen) {\n\t\tthis.worldEditor.cameraSelector.selectCamera('vr')\n\t\tif (this.worldEditor.isActive()) {\n\t\t\tthis.worldEditor.deactivate()\n\t\t}\n\t}\n\n\tE2.core.webVRAdapter.enterVROrFullscreen()\n}\n\nApplication.prototype.toggleHelperObjects = function() {\n\t// toggle helper objects on & off\n\t// additionally, if helper objects are off, and we're in vr camera, disable world editor entirely\n\tvar helpersActive = !this.worldEditor.areEditorHelpersActive()\n\tthis.worldEditor.setEditorHelpers(helpersActive)\n\n\tif (this.worldEditor.isActive() && !helpersActive && this.worldEditor.cameraSelector.selectedCamera === 'vr') {\n\t\tthis.worldEditor.deactivate()\n\t}\n\telse if (!this.worldEditor.isActive() && helpersActive) {\n\t\t// re-enable world editor if needed\n\t\tthis.worldEditor.activate()\n\t}\n}\n\nApplication.prototype.changeControlState = function() {\n\tvar s = this.player.state;\n\tvar cs = this.player.current_state;\n\n\tif (cs !== s.PLAYING) {\n\t\tE2.dom.playPauseIcon.attr('xlink:href','#icon-play')\n\t\tE2.dom.stop.addClass('disabled')\n\t\tE2.dom.stop.parent().addClass('active')\n\t\tE2.dom.play.parent().removeClass('active')\n\t} else {\n\t\tE2.dom.playPauseIcon.attr('xlink:href','#icon-pause')\n\t\tE2.dom.stop.removeClass('disabled')\n\t\tE2.dom.stop.parent().removeClass('active')\n\t\tE2.dom.play.parent().addClass('active')\n\t}\n}\n\nApplication.prototype.onPlayClicked = function() {\n\tif (this.player.current_state === this.player.state.PLAYING)\n\t\tthis.player.pause()\n\telse\n\t\tthis.player.play()\n}\n\nApplication.prototype.onPauseClicked = function() {\n\tthis.player.pause()\n}\n\nApplication.prototype.onStopClicked = function() {\n\tthis.player.schedule_stop(this.changeControlState.bind(this))\n}\n\nApplication.prototype.onOpenClicked = function() {\n\tvar that = this\n\n\tFileSelectControl\n\t\t.createGraphSelector(null, 'Open', function(path) {\n\t\t\thistory.pushState({\n\t\t\t\tgraph: { path: path }\n\t\t\t}, '', path + '/edit')\n\n\t\t\tthat.path = getChannelFromPath(window.location.pathname)\n\t\t\tthat.midPane.closeAll()\n\n\t\t\tthat.loadGraph('/data/graph'+path+'.json')\n\t\t})\n}\n\nApplication.prototype.navigateToPublishedGraph = function(graphPath, cb) {\n\tvar graphUrl = '/data/graph' + graphPath + '.json'\n\n\tthis.path = graphPath\n\n\tboot.graph = {\n\t\tpath: graphPath,\n\t\turl: graphUrl\n\t}\n\n\thistory.pushState({}, '', graphPath + '/edit')\n\n\tthis.loadGraph(graphUrl).then(cb)\n}\n\nApplication.prototype.loadGraph = function(graphPath) {\n\tvar that = this\n\tvar dfd = when.defer()\n\n\tthis.onStopClicked()\n\tthis.player.on_update()\n\n\tthis.player.load_from_url(graphPath, function() {\n\t\tthat.setupEditorChannel()\n\t\t.then(function() {\n\t\t\tdfd.resolve()\n\t\t})\n\t})\n\n\treturn dfd.promise\n}\n\nApplication.prototype.onSaveAsPatchClicked = function() {\n\tvar graph = this.selectionToObject(this.selectedNodes, this.selectedConnections)\n\tthis.openPatchSaveDialog(JSON.stringify({ root: graph }))\n}\n\nApplication.prototype.openPatchSaveDialog = null;\t// ui replaces this\n\n\nApplication.prototype.onPublishClicked = function() {\n\n\tif (!E2.models.user.get('username')) {\n\t\treturn E2.controllers.account.openLoginModal()\n\t\t\t.then(this.onPublishClicked.bind(this))\n\t}\n\n\tE2.ui.openPublishGraphModal()\n\t.then(function(path) {\n\t\twindow.onbeforeunload = null;\t// override \"you might be leaving work\" prompt (release mode)\n\t\tE2.track({\n\t\t\tevent: 'published',\n\t\t\tpath: path\n\t\t})\n\t\twindow.location.href = path\n\t})\n}\n\nApplication.prototype.onSaveACopyClicked = function() {\n\tthis.openSaveACopyDialog();\n}\n\nApplication.prototype.openSaveACopyDialog = function() {\n\tvar that = this\n\tvar dfd = when.defer()\n\n\tif (!E2.models.user.get('username')) {\n\t\treturn E2.controllers.account.openLoginModal()\n\t\t\t.then(this.openSaveACopyDialog.bind(this))\n\t}\n\n\tE2.ui.updateProgressBar(65);\n\n\t$.get(URL_GRAPHS, function(files) {\n\t\tvar fcs = new FileSelectControl()\n\t\t.frame('save-frame')\n\t\t.template('graph')\n\t\t.header('Save as')\n\t\t.buttons({\n\t\t\t'Cancel': function() {\n\t\t\t\tE2.ui.updateProgressBar(100);\n\t\t\t},\n\t\t\t'Save': function(path, tags) {\n\t\t\t\tif (!path)\n\t\t\t\t\treturn bootbox.alert('Please enter a filename');\n\n\t\t\t\tvar ser = that.player.core.serialise();\n\n\t\t\t\t$.ajax({\n\t\t\t\t\ttype: 'POST',\n\t\t\t\t\turl: URL_GRAPHS,\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tpath: path,\n\t\t\t\t\t\ttags: tags,\n\t\t\t\t\t\tgraph: ser\n\t\t\t\t\t},\n\t\t\t\t\tdataType: 'json',\n\t\t\t\t\tsuccess: function(saved) {\n\t\t\t\t\t\tE2.ui.updateProgressBar(100);\n\t\t\t\t\t\tE2.track({\n\t\t\t\t\t\t\tevent: 'savedACopy',\n\t\t\t\t\t\t\toriginal: path,\n\t\t\t\t\t\t\tcopy: saved.path\n\t\t\t\t\t\t})\n\t\t\t\t\t\tdfd.resolve(saved.path)\n\t\t\t\t\t},\n\t\t\t\t\terror: function(x, t, err) {\n\t\t\t\t\t\tE2.ui.updateProgressBar(100);\n\n\n\t\t\t\t\t\tif (x.status === 401) {\n\t\t\t\t\t\t\treturn dfd.resolve(\n\t\t\t\t\t\t\t\tE2.controllers.account.openLoginModal()\n\t\t\t\t\t\t\t\t\t.then(that.openSaveACopyDialog.bind(that))\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (x.responseText)\n\t\t\t\t\t\t\tbootbox.alert('Save failed: ' + x.responseText);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tbootbox.alert('Save failed: ' + err);\n\n\t\t\t\t\t\tdfd.reject(err)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t\t.files(files)\n\t\t.modal()\n\n\t\treturn fcs\n\t})\n\n\treturn dfd.promise\n}\n\nApplication.prototype.growl = function(message, type, duration, user) {\n\treturn VizorUI.growl(message, type, duration, user)\n}\n\nApplication.prototype.setupStoreListeners = function() {\n\tfunction onGraphChanged() {\n\t\tif (E2.core.active_graph.plugin)\n\t\t\tE2.core.active_graph.plugin.updated = true\n\n\t\tE2.app.updateCanvas(true)\n\t}\n\n\tfunction onNodeAdded(graph, node) {\n\t\tif (graph === E2.core.active_graph) {\n\t\t\tnode.create_ui()\n\n\t\t\tif (node.ui && node.plugin.state_changed)\n\t\t\t\tnode.plugin.state_changed(node.ui.pluginUI)\n\t\t}\n\n\t\tif (node.plugin.isGraph)\n\t\t\tE2.core.rebuild_structure_tree()\n\t}\n\n\tfunction onNodeRemoved(graph, node) {\n\t\tnode.destroy_ui()\n\n\t\tif (node.plugin.isGraph)\n\t\t\tE2.core.rebuild_structure_tree()\n\t}\n\n\tfunction onNodeRenamed(graph, node) {\n\t\t// node ui listens to this too\n\t\tif (node.plugin.isGraph)\n\t\t\tnode.plugin.graph.tree_node.set_title(node.title)\n\n\t\tif (node.plugin.renamed)\n\t\t\tnode.plugin.renamed()\n\t}\n\n\tfunction onConnected(graph, connection) {\n\t\tconnection.patch_up()\n\n\t\tif (graph === E2.core.active_graph) {\n\t\t\tif (!connection.ui)\n\t\t\t\tconnection.create_ui()\n\t\t\tconnection.ui.resolve_slot_divs()\n\t\t}\n\n\t\tconnection.signal_change(true)\n\t}\n\n\tfunction onDisconnected(graph, connection) {\n\t\ttry {\n\t\t\tconnection.signal_change(false)\n\t\t} catch(e) {\n\t\t\tconsole.error(e.stack)\n\t\t}\n\n\t\tconnection.destroy_ui()\n\t}\n\n\tthis.graphStore\n\t.on('snapshotted', function() {\n\t\tE2.core.rebuild_structure_tree()\n\t\tE2.app.onGraphSelected(E2.core.active_graph)\n\t})\n\t.on('changed', onGraphChanged.bind(this))\n\t.on('nodeAdded', onNodeAdded.bind(this))\n\t.on('nodeRemoved', onNodeRemoved.bind(this))\n\t.on('nodeRenamed', onNodeRenamed.bind(this))\n\t.on('connected', onConnected.bind(this))\n\t.on('disconnected', onDisconnected.bind(this))\n\t.on('reordered', function() {\n\t\tE2.core.rebuild_structure_tree()\n\t})\n}\n\nApplication.prototype.onGraphSelected = function(graph) {\n\tvar that = this\n\n\tthis.clearNodeSelection()\n\n\tif (graph === E2.core.active_graph && graph.ui)\n\t\treturn;\n\n\tE2.core.active_graph.destroy_ui()\n\tE2.core.active_graph = graph\n\n\tE2.dom.canvas_parent.scrollTop(0)\n\tE2.dom.canvas_parent.scrollLeft(0)\n\tthis.scrollOffset[0] = this.scrollOffset[1] = 0\n\n\tE2.dom.breadcrumb.children().remove()\n\tE2.ui.buildBreadcrumb(E2.core.active_graph)\n\n\tE2.core.active_graph.create_ui()\n\n\tthis.peopleStore.list().map(function(person) {\n\t\tif (person.uid === that.channel.uid)\n\t\t\treturn\n\n\t\tif (person.activeGraphUid !== E2.core.active_graph.uid)\n\t\t\tthat.mouseCursors[person.uid].hide()\n\t\telse\n\t\t\tthat.mouseCursors[person.uid].show()\n\t})\n\n\tE2.core.active_graph_dirty = true\n\n\tE2.app.updateCanvas(true)\n}\n\nApplication.prototype.setupPeopleEvents = function() {\n\tvar that = this\n\tvar cursors = this.mouseCursors = {}\n\tvar lastMovementTimeouts = this.lastMovementTimeouts = {}\n\n\tthis.peopleStore.on('removed', function(uid) {\n\t\tif (uid === that.channel.uid)\n\t\t\treturn;\n\n\t\tvar $cursor = cursors[uid]\n\n\t\t// this can happen when reconnected and own uid changes\n\t\t// and the previous uid gets a `removed` message.\n\t\tif (!$cursor)\n\t\t\treturn;\n\n\t\t$cursor.remove()\n\t\tdelete cursors[uid]\n\t})\n\n\tthis.peopleStore.on('added', function(person) {\n\t\tif (person.uid === that.channel.uid)\n\t\t\treturn;\n\n\t\tif (cursors[person.uid])\n\t\t\treturn;\n\n\t\tvar $cursor = $('<div>')\n\t\tcursors[person.uid] = $cursor\n\t\tlastMovementTimeouts[person.uid] = undefined\n\n\t\t$cursor.addClass('remote-mouse-pointer')\n\t\t$cursor.addClass('inactive')\n\t\t$cursor.addClass('user-'+person.uid)\n\t\t$cursor.css('background-color', person.color)\n\t\t$cursor.appendTo('body')\n\n\t\tif (person.activeGraphUid !== E2.core.active_graph.uid)\n\t\t\t$cursor.hide()\n\t})\n\n\tthis.peopleStore.on('mouseMoved', function(person) {\n\t\tvar $cursor = cursors[person.uid]\n\t\tvar cp = E2.dom.canvases[0];\n\t\t$cursor.removeClass('inactive outside')\n\n\t\t// Update the user's cursor fade-out timeout\n\t\tclearTimeout(lastMovementTimeouts[person.uid])\n\t\tlastMovementTimeouts[person.uid] = setTimeout(function() {\n\t\t\t$cursor.addClass('inactive')\n\t\t}, 2000);\n\n\t\t// Received x/y are coordinates atop the canvas.\n\t\tvar adjustedX = person.x;\n\t\tvar adjustedY = person.y;\n\t\tvar cursorIsOutsideViewportX = false;\n\t\tvar cursorIsOutsideViewportY = false;\n\n\t\t// Calculate viewport top left and bottom right X/Y\n\t\tvar viewPortLeftX = E2.app.scrollOffset[0];\n\t\tvar viewPortTopY = E2.app.scrollOffset[1];\n\n\t\tvar viewPortBottomY = E2.app.scrollOffset[1] + E2.app.canvas.height();\n\t\tvar viewPortRightX = E2.app.scrollOffset[0] + E2.app.canvas.width();\n\n\t\tif(adjustedX < viewPortLeftX) { // On left of the viewport\n\t\t\tadjustedX = cp.offsetLeft;\n\t\t\tcursorIsOutsideViewportX = true;\n\t\t}\n\t\telse if(adjustedX > viewPortRightX) { // On right side of the viewport\n\t\t\tadjustedX = $(window).width();\n\t\t\tcursorIsOutsideViewportX = true;\n\t\t}\n\n\t\tif(adjustedY < viewPortTopY) { // Above viewport\n\t\t\tadjustedY = cp.offsetTop;\n\t\t\tcursorIsOutsideViewportY = true;\n\t\t}\n\t\telse if(adjustedY > viewPortBottomY) { // Below viewport\n\t\t\tadjustedY = $(window).height();\n\t\t\tcursorIsOutsideViewportY = true;\n\t\t}\n\n\t\tif(cursorIsOutsideViewportX) { // If cursor is outside viewport boundaries, blur the cursor\n\t\t\t$cursor.addClass('outside')\n\t\t}\n\t\telse { // Otherwise, just adjust the received X position for current viewport scrolling so we can get a position relative to the canvas\n\t\t\tadjustedX += cp.offsetLeft - E2.app.scrollOffset[0];\n\t\t}\n\n\t\tif(cursorIsOutsideViewportY) {\n\t\t\t$cursor.addClass('outside')\n\t\t}\n\t\telse {\n\t\t\tadjustedY += cp.offsetTop - E2.app.scrollOffset[1];\n\t\t}\n\n\t\t$cursor.css('left', adjustedX)\n\t\t$cursor.css('top', adjustedY)\n\n\t})\n\n\tthis.peopleStore.on('mouseClicked', function(uid) {\n\t\tvar $cursor = cursors[uid]\n\t\t$cursor.addClass('clicked')\n\n\t\tsetTimeout(function() {\n\t\t\t$cursor.removeClass('clicked')\n\t\t}, 100)\n\n\n\t\tclearTimeout(lastMovementTimeouts[uid])\n\t\tlastMovementTimeouts[uid] = setTimeout(function() {\n\t\t\t$cursor.addClass('inactive')\n\t\t}, 2000);\n\n\t})\n\n\tthis.peopleStore.on('activeGraphChanged', function(person) {\n\t\tif (E2.app.channel.uid === person.uid) // it's me\n\t\t\treturn E2.app.onGraphSelected(Graph.lookup(person.activeGraphUid))\n\n\t\tvar $cursor = cursors[person.uid]\n\t\tif (person.activeGraphUid === E2.core.active_graph.uid)\n\t\t\t$cursor.show()\n\t\telse\n\t\t\t$cursor.hide()\n\t})\n}\n\nApplication.prototype.onNewClicked = function() {\n\twindow.location.href = '/edit';\n}\n\nApplication.prototype.onForkClicked = function() {\n\tthis.channel.fork()\n}\n\nApplication.prototype.setupEditorBindings = function() {\n\tvar that = this\n\n\tif (Vizor.releaseMode) {\n\t\twindow.onbeforeunload = function() {\n\t\t\treturn \"You might be leaving behind unsaved work. Are you sure you want to close the editor?\";\n\t\t}\n\t}\n\n\tE2.core.pluginManager.on('created', this.instantiatePlugin.bind(this))\n\n\tdocument.addEventListener('mouseup', this.onMouseReleased.bind(this))\n\tdocument.addEventListener('mousemove', this.onMouseMoved.bind(this))\n\n\tE2.dom.canvas_parent[0].addEventListener('scroll', function() {\n\t\tthat.scrollOffset = [ E2.dom.canvas_parent.scrollLeft(), E2.dom.canvas_parent.scrollTop() ]\n\t\tvar s = E2.dom.canvas[0].style\n\n\t\ts.left = that.scrollOffset[0] + 'px'\n\t\ts.top = that.scrollOffset[1] + 'px'\n\n\t\tthat.updateCanvas(true)\n\t})\n\n\tE2.dom.canvas_parent[0].addEventListener('mousedown', this.onCanvasMouseDown.bind(this))\n\tdocument.addEventListener('mouseup', this.onCanvasMouseUp.bind(this))\n\n\tvar wasPlayingOnBlur = true\n\tdocument.addEventListener('visibilitychange', function() {\n\t\tif (!document.hidden && wasPlayingOnBlur) {\n\t\t\tthat.player.play()\n\t\t} else {\n\t\t\twasPlayingOnBlur = that.player.state.PLAYING === that.player.current_state\n\t\t\tthat.player.pause()\n\t\t}\n\t})\n\n\twindow.addEventListener('blur', function() {\n\t\tthat.clearEditState()\n\t})\n\n\tdocument.addEventListener('cut', function(e) {\n\t\tif (e && E2.util.isTextInputInFocus(e))\n\t\t\treturn true\n\n\t\tthat.onCut(e)\n\n\t\te.preventDefault()\n\n\t\treturn true\n\t}, true)\n\n\tdocument.addEventListener('copy', function(e) {\n\t\tif (e && E2.util.isTextInputInFocus(e))\n\t\t\treturn true\n\n\t\tthat.onCopy(e)\n\t\treturn true\n\t}, true)\n\n\twindow.addEventListener('paste', function(e) {\n\t\tif (e && E2.util.isTextInputInFocus(e))\n\t\t\treturn true\n\n\t\tvar data = e.clipboardData.getData('text/plain')\n\t\tthat.pasteJson(data)\n\t\te.preventDefault()\n\t\treturn true\n\t}, true)\n\n\tE2.core.on('resize', function() {\n\t\tthat.onWindowResize()\n\t})\n\n\t// close bootboxes on click\n\t$(document).on('click', '.bootbox.modal.in', function(e) {\n\t\tvar $et = $(e.target)\n\t\tif (!$et.parents('.modal-dialog').length)\n\t\t\tbootbox.hideAll()\n\t})\n\n\t$('button#fullscreen').click(function() {\n\t\tE2.app.toggleFullscreen()\n\t});\n\n\t$('button#help').click(function() {\n\t\twindow.open('/help/introduction.html', 'Vizor Help');\n\t});\n\n\t$('.resize-handle').on('mousedown', function(e) {\n\t\tvar $target = $(this).parent()\n\t\tvar oh = $target.height()\n\t\tvar oy = e.pageY\n\t\tvar $doc = $(document)\n\t\tvar changed = false\n\n\t\te.preventDefault()\n\t\te.stopPropagation();\n\n\t\tfunction mouseMoveHandler(e) {\n\t\t\tchanged = true\n\t\t\tvar nh = oh + (e.pageY - oy)\n\t\t\te.preventDefault()\n\t\t\t$target.css('height', nh+'px')\n\t\t\treturn true\n\t\t}\n\n\t\t$doc.on('mousemove', mouseMoveHandler)\n\t\t$doc.one('mouseup', function(e) {\n\t\t\te.preventDefault()\n\t\t\t$doc.off('mousemove', mouseMoveHandler)\n\t\t\tvar uiResized = (typeof uiEvent !== 'undefined') ? uiEvent.resized : 'uiResized'\n\t\t\t$target.trigger(uiResized)\n\t\t})\n\t});\n\n\tE2.dom.viewSourceButton.click(E2.ui.viewSource);\n\n\tE2.dom.saveACopy.click(E2.app.onSaveACopyClicked.bind(E2.app))\n\tE2.dom.saveAsPatch.click(E2.app.onSaveAsPatchClicked.bind(E2.app))\n\tE2.dom.open.click(E2.app.onOpenClicked.bind(E2.app))\n\tE2.dom.btnNew.click(E2.app.onNewClicked.bind(E2.app))\n\tE2.dom.forkButton.click(E2.app.onForkClicked.bind(E2.app))\n\n\tE2.dom.play.click(E2.app.onPlayClicked.bind(E2.app))\n\tE2.dom.pause.click(E2.app.onPauseClicked.bind(E2.app))\n\tE2.dom.stop.click(E2.app.onStopClicked.bind(E2.app))\n\n\tthis.midPane = new E2.MidPane()\n\n\t$('[data-toggle=\"popover\"]').popover({\n\t\t\tcontainer: 'body',\n\t\t\ttrigger: 'hover',\n\t\t\tanimation: false\n\t});\n}\n\n/**\n * Called when Core has been initialized\n * Initializes the Editor Stores and model layer events\n * Then starts the UI layer\n */\nApplication.prototype.onCoreReady = function(loadGraphUrl) {\n\tvar that = this\n\n\tE2.ui.init(E2)\n\n\tthis.midPane = new E2.MidPane()\n\n\tthis.patchManager = new PatchManager()\n\tthis.patchManager.on('open', function(patchMeta, json, targetObject3d) {\n\t\tif (that.isWorldEditorActive()) {\n\t\t\tvar doc\n\n\t\t\ttry {\n\t\t\t\tdoc = JSON.parse(json)\n\t\t\t} catch(e) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthat.worldEditor.onPatchDropped(patchMeta, doc, targetObject3d)\n\t\t} else {\n\t\t\tthat.pasteJson(json)\n\t\t}\n\t})\n\n\tthat.setupPeopleEvents()\n\tthat.setupStoreListeners()\n\tthis.setupEditorBindings()\n\n\tE2.core.on('player:stateChanged', this.changeControlState.bind(this))\n\n\tif (!loadGraphUrl && !boot.hasEdits) {\n\t\tloadGraphUrl = '/data/graphs/default.json'\n\t\tE2.app.snapshotPending = true\n\t}\n\n\tthis.openStartDialog(false, loadGraphUrl)\n}\n\nApplication.prototype.openStartDialog = function(forceShow, loadGraphUrl) {\n\tvar that = this\n\n\tE2.ui.showStartDialog(forceShow)\n\t.then(function(selectedGraphUrl) {\n\t\tif (!selectedGraphUrl)\n\t\t\tselectedGraphUrl = loadGraphUrl\n\n\t\tthat.startWithGraph(selectedGraphUrl)\n\t})\n}\n\nApplication.prototype.startWithGraph = function(selectedGraphUrl) {\n\tvar that = this\n\n\tfunction start() {\n\t\tE2.dom.canvas_parent.toggle(that.noodlesVisible)\n\n\t\tthat.startPlaying()\n\t}\n\n\tif (!selectedGraphUrl)\n\t\treturn that.setupEditorChannel().then(start)\n\n\t// if we have edits coming in at boot,\n\t// or we're already on a channel,\n\t// and switching to a new template,\n\t// create new url and snapshot it\n\tif (boot.hasEdits || (this.channel && this.channel.isOnChannel)) {\n\t\tvar path = this.path = E2.uid()\n\t\tboot = {}\n\t\thistory.pushState({}, '', path)\n\t\tE2.app.snapshotPending = true\n\t}\n\n\tthis.loadGraph(selectedGraphUrl).then(start)\n}\n\nApplication.prototype.startPlaying = function() {\n\tE2.core.rebuild_structure_tree()\n\n\tthis.setActiveGraph(E2.core.active_graph)\n\n\tE2.core.emit('vizorFileLoaded')\n\n\tthis.player.play()\n\n\tthis.onWindowResize()\n\n\tE2.ui.setPageTitle()\n\n\tif (window.location.hash[1] === '/') {\n\t\t// path in graph\n\t\t// only root supported\n\t\tthis.setActiveGraph(E2.core.root_graph)\n\t\tE2.ui.state.mode = 'program'\n\t}\n}\n\n/**\n * Connect to the EditorChannel for this document\n */\nApplication.prototype.setupEditorChannel = function() {\n\tvar dfd = when.defer()\n\tvar that = this\n\n\tfunction joinChannel() {\n\t\tif (isPublishedGraph(that.path)) {\n\t\t\tthat.channel.leave()\n\t\t\treturn dfd.resolve()\n\t\t}\n\n\t\tvar readableName = that.path\n\t\tthat.channel.join(that.path, readableName, function() {\n\t\t\tdfd.resolve()\n\t\t})\n\t}\n\n\tvar wsUrl = this.determineWebSocketEndpoint('/__editorChannel')\n\n\tif (!this.channel) {\n\t\tthis.channel = new E2.EditorChannel()\n\t\tthis.channel.connect(wsUrl)\n\t\tthis.channel.once('ready', function() {\n\t\t\tthat.peopleStore.initialize()\n\t\t\tjoinChannel()\n\t\t\tE2.track({ event: 'editorOpened', path: that.path })\n\t\t})\n\t\tthis.channel.on('reconnected', function() {\n\t\t\tjoinChannel()\n\t\t})\n\t} else\n\t\tjoinChannel()\n\n\tE2.ui.setPageTitle()\n\n\treturn dfd.promise\n}\n\nApplication.prototype.determineWebSocketEndpoint = function(path) {\n\tvar secure = Vizor.useSecureWebSocket || window.location.protocol === 'https:'\n\tvar wsPort = secure ? 443 : (window.location.port || 80)\n\tvar wsHost = window.location.hostname\n\n\tif (Vizor.webSocketHost)\n\t\twsHost = Vizor.webSocketHost\n\n\tif (secure)\n\t\twsPort = 443\n\n\tvar wsUrl = (secure ? 'wss': 'ws') + '://' +\n\twsHost + ':' + wsPort + path\n\n\treturn wsUrl\n}\n\nE2.InitialiseEngi = function(loadGraphUrl) {\n\tE2.dom.editorHeader = $('.editor-header');\n\n\tE2.dom.progressBar = $('#progressbar');\n\n\tE2.dom.btnNew = $('#btn-new');\n\n\tE2.dom.btnAssets = $('#btn-assets');\n\tE2.dom.btnInspector = $('#btn-inspector');\n\tE2.dom.btnPatches = $('#btn-patches');\n\tE2.dom.btnSavePatch = $('#btn-save-patch');\n\n\tE2.dom.btnGraph = $('#btn-graph');\n\tE2.dom.btnEditor = $('#btn-editor');\n\tE2.dom.btnZoomOut = $('#btn-zoom-out');\n\tE2.dom.btnZoom = $('#btn-zoom');\n\tE2.dom.btnZoomIn = $('#btn-zoom-in');\n\tE2.dom.zoomDisplay = $('#current-zoom');\n\tE2.dom.btnChatDisplay = $('#btn-chat-display');\n\n\tE2.dom.btnSignIn = $('#btn-sign-in');\n\tE2.dom.btnAccountMenu = $('#btn-account-top');\n\tE2.dom.userPullDown = $('#userPullDown');\n\n\tE2.dom.breadcrumb = $('#breadcrumb');\n\n\tE2.dom.uiLayer = $('#ui-layer');\n\n\tE2.dom.assetsLib = $('#assets-lib');\n\tE2.dom.assetsToggle = $('#assets-toggle');\n\tE2.dom.assetsClose = $('#assets-close');\n\n\tE2.dom.patchesLib = $('#patches-lib');\n\tE2.dom.patches_list = $('#patches');\n\tE2.dom.objectsList = $('#objects');\n\n\tE2.dom.canvas_parent = $('#canvas_parent');\n\tE2.dom.canvas = $('#canvas');\n\tE2.dom.canvases = $('#canvases');\n\tE2.dom.controls = $('#controls');\n\tE2.dom.webgl_canvas = $('#webgl-canvas');\n\n\tE2.dom.chatWindow = $('#chat-window');\n\tE2.dom.chatTabs = $('#chat-window>.chat-tabs');\n\tE2.dom.chatToggleButton = $('#chat-toggle');\n\tE2.dom.chatClose = $('#chat-close');\n\tE2.dom.chatTabBtn = $('#chatTabBtn');\n\tE2.dom.peopleTabBtn = $('#peopleTabBtn');\n\tE2.dom.chatTab = $('#chatTab');\n\tE2.dom.chat = $('#chat');\n\n\tE2.dom.peopleTab = $('#peopleTab');\n\tE2.dom.patchesToggle = $('#patches-toggle');\n\tE2.dom.patchesClose = $('#patches-close');\n\n\tE2.dom.dbg = $('#dbg');\n\n\tE2.dom.publishButton = $('#btn-publish');\n\tE2.dom.play = $('#play');\n\tE2.dom.play_i = $('i', E2.dom.play);\n\tE2.dom.pause = $('#pause');\n\tE2.dom.stop = $('#stop');\n\tE2.dom.refresh = $('#refresh');\n\tE2.dom.forkButton = $('#fork-button');\n\tE2.dom.viewSourceButton = $('#view-source');\n\tE2.dom.saveACopy = $('.save-copy-button');\n\tE2.dom.saveAsPatch = E2.dom.btnSavePatch;\n\tE2.dom.dl_graph = $('#dl-graph');\n\tE2.dom.open = $('#open');\n\tE2.dom.structure = $('#structure');\n\tE2.dom.info = $('#info');\n\tE2.dom.info._defaultContent = E2.dom.info.html()\n\tE2.dom.tabs = $('#tabs');\n\tE2.dom.graphs_list = $('#graphs-list');\n\tE2.dom.filename_input = $('#filename-input');\n\n\tE2.dom.dragOverlay = $('#drag-overlay');\n\tE2.dom.dropArea = $('#drop-area');\n\tE2.dom.dropUploading = $('#drop-uploading');\n\n\tE2.dom.bottomBar = $('.bottom-panel');\n\n\tE2.dom.btnTimeline = $('#btn-timeline');\n\n\tE2.dom.play = $('#play');\n\tE2.dom.playPauseIcon = $('#play use');\n\tE2.dom.pause = $('#pause');\n\tE2.dom.stop = $('#stop');\n\tE2.dom.fscreen = $('#fullscreen');\n\tE2.dom.vrview = $('#vrview');\n\n\tE2.dom.btnVRCam = $('#btn-vrcam');\n\tE2.dom.btnEditorCam = $('#btn-editorcam');\n\n\tE2.dom.dbg.ajaxError(function(e, jqxhr, settings, ex) {\n\t\tif (settings.dataType === 'script') {\n\t\t\tif (typeof(ex) === 'string') {\n\t\t\t\tmsg(ex);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar m = 'ERROR: Script exception:\\n';\n\n\t\t\tif(ex.fileName)\n\t\t\t\tm += '\\tFilename: ' + ex.fileName;\n\n\t\t\tif(ex.lineNumber)\n\t\t\t\tm += '\\tLine number: ' + ex.lineNumber;\n\n\t\t\tif(ex.message)\n\t\t\t\tm += '\\tMessage: ' + ex.message;\n\n\t\t\tmsg(m)\n\t\t}\n\t})\n\n\tE2.core = new Core()\n\tE2.app = new Application()\n\tE2.ui = new VizorUI();\n\n\tvar player = new Player()\n\n\tE2.treeView = E2.dom.structure.tree = new TreeView(\n\t\tE2.dom.structure,\n\t\tE2.core.root_graph,\n\t\tfunction() { // On item activation\n\t\t\tE2.app.clearEditState()\n\t\t\tE2.app.clearSelection()\n\n\t\t\tif (E2.core.active_graph.isEntityPatch() &&  E2.ui.isInProgramMode())\n\t\t\t\tE2.app.worldEditor.selectEntityPatch(E2.core.active_graph)\n\t\t},\n\t\t// on graph reorder\n\t\tE2.app.graphApi.reorder.bind(E2.app.graphApi)\n\t)\n\n\tE2.app.player = player\n\n\t// Shared gl context for three\n\tvar gl_attributes = {\n\t\talpha: false,\n\t\tdepth: true,\n\t\tstencil: true,\n\t\tantialias: true,\n\t\tpremultipliedAlpha: true,\n\t\tpreserveDrawingBuffer: true\n\t}\n\n\tE2.app.debugFpsDisplayVisible = false\n\tE2.app.worldEditor = new WorldEditor(E2.dom.webgl_canvas[0])\n\n\tE2.core.glContext = E2.dom.webgl_canvas[0].getContext('webgl', gl_attributes) || E2.dom.webgl_canvas[0].getContext('experimental-webgl', gl_attributes)\n\tE2.core.renderer = new THREE.WebGLRenderer({\n\t\tantialias: true,\n\t\tcontext: E2.core.glContext,\n\t\tcanvas: E2.dom.webgl_canvas[0]\n\t})\n\n\tE2.core.webVRAdapter.initialise(E2.dom.webgl_canvas[0], E2.core.renderer)\n\n\tE2.core.on('ready', E2.app.onCoreReady.bind(E2.app, loadGraphUrl))\n\n\twindow.onpopstate = function() {\n\t\twindow.location.href = window.location.href\n\t\treturn\n\t}\n}\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = Application\n\n})()\n"
  },
  {
    "path": "browser/scripts/autoSlotGroup.js",
    "content": "function AutoSlotGroup() {\n\tLinkedSlotGroup.apply(this, arguments)\n}\n\nAutoSlotGroup.prototype = Object.create(LinkedSlotGroup.prototype)\n\nAutoSlotGroup.prototype.updateFreeSlots = function() {\n\tvar that = this\n\tvar dynInputs = this.node.getDynamicInputSlots()\n\n\tfunction addSlot() {\n\t\tE2.app.graphApi.addSlot(that.node.parent_graph, that.node, {\n\t\t\ttype: E2.slot_type.input,\n\t\t\tname: dynInputs.length + '',\n\t\t\tdt: that.dt,\n\t\t\tarray: dynInputs.length > 0 ? dynInputs[0].array : false // take 0th slot arrayness\n\t\t})\n\t}\n\n\tfunction removeSlot() {\n\t\tvar inputs = dynInputs\n\t\tif (!inputs)\n\t\t\treturn\n\n\t\tvar suid = inputs[inputs.length - 1].uid\n\t\tE2.app.graphApi.removeSlot(that.node.parent_graph, that.node, suid)\n\t}\n\n\t// remove slots until there's only one unconnected in the end\n\tvar lastIndex = dynInputs.length - 1\n\n\t// if the last slot is connected, can't remove any slots\n\tif (lastIndex > 0 && !dynInputs[lastIndex].is_connected ) {\n\t\twhile (lastIndex > 0 && !dynInputs[lastIndex - 1].is_connected) {\n\t\t\tremoveSlot()\n\t\t\t--lastIndex\n\t\t}\n\t}\n\telse if (dynInputs.length === 0 || dynInputs[dynInputs.length - 1].is_connected) {\n\t\t// ensure there's at least one free slot in the end\n\t\taddSlot()\n\t}\n}\n\nif (typeof(module) !== 'undefined') {\n\tmodule.exports.AutoSlotGroup = AutoSlotGroup\n}\n"
  },
  {
    "path": "browser/scripts/blendFunctions.js",
    "content": "// functions that map a value [0..1] to [0..1] over various curves\n// id-strings should not be changed as this would break scripts\nvar BlendFunctions = function() {\n\n\tthis.functions = [{\n\t\tid: 'linear-blend',\n\t\tname: 'Linear',\n\t\tfunc: function(d) {return d}\n\t}, {\n\t\tid: 'inverse-blend',\n\t\tname: 'Inverse',\n\t\tfunc: function(d) {return 1-d}\n\t}, {\n\t\tid: 'circular-blend',\n\t\tname: 'Circular',\n\t\tfunc: function(d) {return 1 - Math.sqrt(1 - d * d)}\n\t}, {\n\t\tid: 'cubic-blend',\n\t\tname: 'Cubic',\n\t\tfunc: function(d) {return d * d * d}\n\t}, {\n\t\tid: 'exponential-blend',\n\t\tname: 'Exponential',\n\t\tfunc: function(d) {return d === 0 ? 0 : Math.pow(1024, d - 1)}\n\t}, {\n\t\tid: 'quadratic-blend',\n\t\tname: 'Quadratic',\n\t\tfunc: function(d) {return d * d}\n\t}, {\n\t\tid: 'quartic-blend',\n\t\tname: 'Quartic',\n\t\tfunc: function(d) {return d * d * d * d}\n\t}, {\n\t\tid: 'quintic-blend',\n\t\tname: 'Quintic',\n\t\tfunc: function(d) {return d * d * d * d * d}\n\t}, {\n\t\tid: 'sinusoidal-blend',\n\t\tname: 'Sinusoidal',\n\t\tfunc: function(d) {return  1 - Math.cos(d * Math.PI / 2)}\n\t}, {\n\t\t// https://en.wikipedia.org/wiki/Smoothstep\n\t\tid: 'smoothstep-blend',\n\t\tname: 'Smoothstep',\n\t\tfunc: function(d) {return d * d * (3 - 2 * d)}\n\t}, {\n\t\t// Ken Perlin\n\t\t// http://www.amazon.com/Texturing-Modeling-Third-Procedural-Approach/dp/1558608486\n\t\t// https://en.wikipedia.org/wiki/Smoothstep\n\t\tid: 'smootherstep-blend',\n\t\tname: 'Smootherstep',\n\t\tfunc: function(d) {return d * d * d * (d * (d * 6 - 15) + 10)}\n\t}]\n\n\tthis.getByIndex = function(idx) {\n\t\treturn this.functions[idx]\n\t}\n\n\tthis.getById = function(id) {\n\t\tfor(var i = 0, len = this.functions.length; i < len; ++i) {\n\t\t\tif (this.functions[i].id === id) {\n\t\t\t\treturn this.functions[i]\n\t\t\t}\n\t\t}\n\t}\n\n\tthis.getIndex = function(blendFunc) {\n\t\treturn this.functions.indexOf(blendFunc)\n\t}\n\n\tthis.createUi = function($ui, callback) {\n\t\tvar $selectBlendType = $('<select class=\"blend-type-sel\" title=\"Select Blend Type\"/>')\n\n\t\tfor (var i = 0, len = this.functions.length; i < len; ++i) {\n\t\t\tvar blendFunc = this.functions[i]\n\t\t\t$('<option>', {value: i, text: blendFunc.name}).appendTo($selectBlendType)\n\t\t}\n\n\t\tvar that = this\n\n\t\t$selectBlendType.change(function() {\n\t\t\tvar newBlendFunc = that.getByIndex($selectBlendType.val())\n\t\t\tvar selection = newBlendFunc.id\n\n\t\t\tcallback(newBlendFunc, selection)\n\t\t})\n\n\t\t$ui.append($selectBlendType)\n\t}\n\n\tthis.initialise = function(ui, id) {\n\t\tvar blendFunc = this.getById(id)\n\t\tvar idx = this.getIndex(blendFunc)\n\t\tui.find('.blend-type-sel').val(idx)\n\t}\n\n}\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = BlendFunctions\n"
  },
  {
    "path": "browser/scripts/chat.js",
    "content": "(function() {\n\nvar GLOBAL_CHANNEL_NAME = 'Global'\n\nif (typeof(moment) !== 'undefined' && moment.fn) {\n\tmoment.fn.formatTimeToday = function () {\n\t\tvar now = moment(Date.now())\n\n\t\tif (this.date() === now.date())\n\t\t\treturn this.format(\"h:mm A\")\n\n\t\treturn this.calendar()\n\t}\n}\n\nfunction ChatStore() {\n\tvar that = this\n\tvar lastEditSeen = 0\n\n\tE2.app.dispatcher.register(function(pl) {\n\t\tif (!that.isForMe(pl))\n\t\t\treturn;\n\n\t\tthat.emit('added', pl)\n\n\t\tif (pl.from)\n\t\t\treturn;\n\n\t\tvar message = {\n\t\t\tactionType: 'uiChatMessageAdded',\n\t\t\tchannel: GLOBAL_CHANNEL_NAME,\n\t\t\tfrom: E2.app.channel.uid,\n\t\t\tmessage: pl.message\n\t\t}\n\n\t\tthat.wsChannel.send(GLOBAL_CHANNEL_NAME, message)\n\t})\n\n\tfunction connect() {\n\t\tthat.wsChannel = E2.app.channel.getWsChannel()\n\n\t\tvar joinMessage = {\n\t\t\tkind: 'join',\n\t\t\tlastEditSeen: lastEditSeen,\n\t\t\tchannel: GLOBAL_CHANNEL_NAME,\n\t\t\tlimit: 80\n\t\t}\n\n\t\tthat.wsChannel.ws.send(JSON.stringify(joinMessage))\n\n\t\tthat.wsChannel.on(GLOBAL_CHANNEL_NAME, function(pl) {\n\t\t\tlastEditSeen = pl.id\n\n\t\t\tif (pl.from === E2.app.channel.uid)\n\t\t\t\treturn;\n\n\t\t\tif (pl.kind === 'join')\n\t\t\t\tthat.emit('joined', pl)\n\n\t\t\tif (pl.kind === 'leave')\n\t\t\t\tthat.emit('left', pl)\n\n\t\t\tif (!that.isForMe(pl))\n\t\t\t\treturn;\n\n\t\t\tE2.app.dispatcher.dispatch(pl)\n\t\t})\n\t}\n\n\tconnect()\n\n\tE2.app.channel.on('ready', connect)\n}\n\nChatStore.prototype = Object.create(EventEmitter.prototype)\n\nChatStore.prototype.isForMe = function(pl) {\n\treturn pl.actionType === 'uiChatMessageAdded' &&\n\t\t(!pl.channel || pl.channel === GLOBAL_CHANNEL_NAME)\n}\n\n// ------------------------------\n\nfunction Chat($el, handlebars) {\n\tthis._hbs = handlebars || window.Handlebars\n\tthis.$container = $el;\n\tthis.$messages = $('.messages', this.$container)\n\tthis.$input = $('input', this.$container)\n\n\tE2.app.chatStore.on('added',\n\t\tthis._renderMessage.bind(this))\n}\n\nChat.prototype = Object.create(EventEmitter.prototype)\n\nChat.prototype.start = function() {\n\tthis.setupInput()\n\tthis.scrollDown()\n}\n\nChat.prototype.setupInput = function() {\n\tvar $i = this.$input\n\n\t$i.on('keyup', function(e) {\n\t\tif (e.keyCode !== 13)\n\t\t\treturn true\n\n\t\tvar val = $i.val().trim()\n\t\tif (val.length) {\n\t\t\tE2.app.dispatcher.dispatch({\n\t\t\t\tactionType: 'uiChatMessageAdded',\n\t\t\t\tdate: Date.now(),\n\t\t\t\tcolor: E2.app.peopleStore.me ? E2.app.peopleStore.me.color : '#555',\n\t\t\t\tmessage: $i.val()\n\t\t\t})\n\n\t\t\t$i.val('')\n\t\t}\n\t})\n}\n\nChat.prototype._messageCleaner = function(message) {\n\treturn message\n\t\t.split(' ')\n\t\t.map(function(word) {\n\t\t\tvar oword = word\n\n\t\t\tif (word.indexOf('vizor.io') === -1)\n\t\t\t\treturn word\n\n\t\t\tword = word.replace(/^https?:\\/\\//, '')\n\n\t\t\tvar replaced = word.replace(\n\t\t\t\t/(\\S*)vizor\\.io(\\S*)/,\n\t\t\t\t'<a target=\"_blank\" '+\n\t\t\t\t\t'href=\"http://$1vizor.io$2\">'+\n\t\t\t\t\t\t'$1vizor.io$2</a>')\n\n\t\t\treturn replaced\n\t\t})\n\t\t.join(' ')\n}\n\nChat.prototype._renderMessage = function(message) {\n\tvar $last = this.$messages.find('.message:last')\n\tvar wasScrolledDown = $last.length ? \n\t\tE2.util.isScrolledIntoView($last) : true\n\n\tvar messageTemplate = message.meta ? E2.views.chat.meta : E2.views.chat.message\n\tvar renderable = {\n\t\tcolor: message.color,\n\t\tfrom: message.from ? message.username : (\n\t\t\tE2.models.user.get('username') || \n\t\t\tE2.app.peopleStore.me.username\n\t\t),\n\t\tdate: moment(message.date).formatTimeToday(),\n\t\tmessage: this._messageCleaner(\n\t\t\t$('<span/>').text(message.message).html() // escape \n\t\t)\n\t}\n\n\tvar html = messageTemplate(renderable)\n\tthis.$messages.append(html)\n\n\tif (wasScrolledDown)\n\t\tthis.scrollDown()\n}\n\nChat.prototype.scrollDown = function() {\n\tthis.$messages.scrollTop(\n\t\t$('.messages')[0].scrollHeight + 100\n\t)\n}\n\nif (typeof(exports) !== 'undefined') {\n\texports.ChatStore = ChatStore\n\texports.Chat = Chat\n} else {\n\tE2.Chat = Chat\n\tE2.ChatStore = ChatStore\n}\n\n})();\n"
  },
  {
    "path": "browser/scripts/collapsible-select-control.js",
    "content": "/**\n * Drag and drop an element from the side tab\n * @param  {Event} e         Mousedown event from bind\n */\nfunction dragAndDropMouseDownHandler(e) {\n\tvar uiState = E2.ui.state;\n\tvar chatWindow = E2.dom.chatWindow;\n\tvar chatVisible = uiState.visibility.panel_chat;\n\tvar collapseChat = E2.ui.togglePanelChatCollapsed.bind(E2.ui);\n\tvar patchesLib = E2.dom.patchesLib;\n\tvar patchesVisible = uiState.visibility.panel_patches;\n\tvar collapsePatches = E2.ui.togglePanelPatchesCollapsed.bind(E2.ui);\n\tvar assetsLib = E2.dom.assetsLib;\n\tvar assetsVisible = uiState.visibility.panel_assets;\n\tvar collapseAssets = E2.ui.togglePanelAssetsCollapsed.bind(E2.ui);\n\n\tvar targetObject3d\n\n\tvar mouseMoveBound = false\n\tvar mouseX = 0\n\tvar mouseY = 0\n\tvar scrollInterval\n\tvar scrollBound = false\n\n\tE2.ui.emit('dragStarted', e)\n\n\tvar title = $('span.title', e.currentTarget).text()\n\n\tvar dragPreview = $('<div class=\"plugin-drag-preview\"><div class=\"drag-add-icon\"><svg class='\n\t\t\t\t\t  + '\"icon-drag-add\"><use xlink:href=\"#icon-drag-add\"></use></svg></div>'\n\t\t\t\t\t  + '<span style=\"display: none;\">Drop to create:</span>'+title+'</div>')\n\tvar dragPreviewInDom = false // only append the preview element when moving the mouse cursor while dragging\n\t\n\tvar canvas = $('#canvases')\n\tvar canvasWidth = canvas.width()\n\tvar canvasHeight = canvas.height()\n\tvar canvasX = canvas.position().left\n\tvar canvasY = canvas.position().top\n\tvar cp = E2.dom.canvases\n\tvar scrollHoverAreaSize = 25 // Pixel size for hover area for scrolling around the canvas\n\t\n\tif (patchesVisible) {\n\t\tvar plHeight = patchesLib.outerHeight(true);\n\t\tvar plWidth = patchesLib.outerWidth(true);\n\t\tvar plX = patchesLib.position().left;\n\t\tvar plY = patchesLib.position().top;\n\t}\n\tif (assetsVisible && assetsLib.length) {\n\t\tvar alHeight = assetsLib.outerHeight(true);\n\t\tvar alWidth = assetsLib.outerWidth(true);\n\t\tvar alX = assetsLib.position().left;\n\t\tvar alY = assetsLib.position().top;\n\t}\n\tif (chatVisible) {\n\t\tvar chHeight = chatWindow.outerHeight(true);\n\t\tvar chWidth = chatWindow.outerWidth(true);\n\t\tvar chX = chatWindow.position().left;\n\t\tvar chY = chatWindow.position().top;\n\t}\n\n\t// Handle document scrolling\n\tfunction scrollHandler() {\n\t\tvar dragPreviewWidth = dragPreview.outerWidth()\n\t\tvar dragPreviewHeight = dragPreview.outerHeight()\n\n\t\tvar co = cp.offset()\n\n\t\tif(mouseX - scrollHoverAreaSize < co.left) {\n\t\t\tcp.scrollLeft(cp.scrollLeft() - 20)\n\t\t}\n\n\t\telse if(mouseX + scrollHoverAreaSize > co.left + cp.width()) {\n\t\t\tcp.scrollLeft(cp.scrollLeft() + 20)\n\t\t}\n\n\t\tif(mouseY - scrollHoverAreaSize < co.top) {\n\t\t\tcp.scrollTop(cp.scrollTop() - 20)\n\t\t}\n\n\t\telse if(mouseY + scrollHoverAreaSize > co.top + cp.height()) {\n\t\t\tcp.scrollTop(cp.scrollTop() + 20)\n\t\t}\n\n\t}\n\n\t// Update the preview box position while moving the mouse\n\tfunction updatePreviewPosition(evt) {\n\t\tmouseX = evt.pageX\n\t\tmouseY = evt.pageY\n\n\t\tif (mouseX < (canvasWidth + canvasX) && mouseX > canvasX && mouseY < (canvasHeight + canvasY) && mouseY > canvasY) {\n\t\t\tdragPreview.css({ opacity: 1.0 }).find('span').show()\n\n\t\t\t// Only do scrolling after the user has dragged the object over the\n\t\t\t// canvas area once so it doesn't start scrolling while you're\n\t\t\t// initially holding the mouse button down over the patch list.\n\t\t\tif (!scrollBound) {\n\t\t\t\tscrollBound = true\n\n\t\t\t\tscrollInterval = setInterval(function() {\n\t\t\t\t\tscrollHandler()\n\t\t\t\t}, 10)\n\t\t\t}\n\t\t} else {\n\t\t\tdragPreview.css({ opacity: 0.5 }).find('span').hide()\n\t\t}\n\n\t\tdragPreview.css({ top: mouseY - dragPreview.outerHeight(true) + 8, left: mouseX - (dragPreview.outerWidth(true) / 2) })\n\t}\n\n\t// Add the preview box to the DOM when moving the mouse for the first time away from the box, while holding the mouse button down\n\tvar mouseMoveHandler = function(evt) {\n\t\tif (!dragPreviewInDom) {\n\t\t\t$('.plugin-drag-preview').remove()\n\n\t\t\tdragPreview.appendTo('body')\n\t\t\tdragPreviewInDom = true\n\n\t\t\tE2.dom.editorHeader.addClass('dragging-not-allowed');\n\t\t\tE2.dom.breadcrumb.addClass('dragging-not-allowed');\n\t\t\tE2.dom.assetsLib.addClass('dragging-not-allowed');\n\t\t\tE2.dom.patchesLib.addClass('dragging-not-allowed');\n\t\t\tE2.dom.chatWindow.addClass('dragging-not-allowed');\n\t\t\tE2.dom.bottomBar.addClass('dragging-not-allowed');\n\n\t\t\tmouseMoveBound = true\n\t\t}\n\n\t\tupdatePreviewPosition(evt)\n\n\t\tE2.ui.emit('dragMoved', evt, {\n\t\t\tpath: $(e.currentTarget).data('path'),\n\t\t\ttype: $(e.currentTarget).data('type')\n\t\t})\n\t}\n\n\t// On mouseup unbind everything and destroy the preview box\n\tvar mouseUpHandler = function(evt) {\n\t\tdragPreview.remove()\n\t\tdragPreviewInDom = false\n\t\t$(document).unbind('mousemove', mouseMoveHandler)\n\t\t$(document).unbind('mouseup', mouseUpHandler)\n\t\t$(document).unbind('mousedown', scrollHandler)\n\t\tE2.dom.editorHeader.removeClass('dragging-not-allowed');\n\t\tE2.dom.breadcrumb.removeClass('dragging-not-allowed');\n\t\tE2.dom.assetsLib.removeClass('dragging-not-allowed');\n\t\tE2.dom.patchesLib.removeClass('dragging-not-allowed');\n\t\tE2.dom.chatWindow.removeClass('dragging-not-allowed');\n\t\tE2.dom.bottomBar.removeClass('dragging-not-allowed');\n\n\t\tmouseMoveBound = false\n\t\tscrollBound = false\n\t\tclearInterval(scrollInterval)\n\t\t\n\t\t// Only create new item when released over the canvas and hide floating box if dropped under it;\n\t\tif (E2.app.isWorldEditorActive() ||\n\t\t\t(evt.pageX < (canvasWidth + canvasX) && evt.pageX > canvasX &&\n\t\t\t evt.pageY < (canvasHeight + canvasY) && evt.pageY > canvasY))\n\t\t{\n\t\t\tif (E2.app.isWorldEditorActive())\n\t\t\t\ttargetObject3d = E2.app.worldEditor.getLastDropTarget()\n\n\t\t\te.data.dropSuccessCb({\n\t\t\t\tpath: $(e.currentTarget).data('path'),\n\t\t\t\ttargetObject3d: targetObject3d\n\t\t\t})\n\n\t\t\tif ((patchesVisible) && (evt.pageX < (plWidth + plX) && evt.pageX > plX && evt.pageY < (plHeight + plY) && evt.pageY > plY)) { \n\t\t\t\tcollapsePatches();\n\t\t\t}\n\t\t\t\n\t\t\tif ((assetsVisible) && (evt.pageX < (alWidth + alX) && evt.pageX > alX && evt.pageY < (alHeight + alY) && evt.pageY > alY)) { \n\t\t\t\tcollapseAssets();\n\t\t\t}\n\n\t\t\tif ((chatVisible) && (evt.pageX < (chWidth + chX) && evt.pageX > chX && evt.pageY < (chHeight + chY) && evt.pageY > chY)) { \n\t\t\t\tcollapseChat();\n\t\t\t}\n\t\t}\n\t}\n\n\t// Take care to only bind mouse movement and mouseup once\n\tif (!mouseMoveBound) {\n\t\t$(document).bind('mousemove', mouseMoveHandler)\n\t\t$(document).bind('mouseup', mouseUpHandler)\n\t}\n\n\t// prevent the list from scrolling as mouse is dragged beyond top/bottom when holding item\n\te.preventDefault()\n\te.stopPropagation()\n\n\treturn false\n}\n\nfunction CollapsibleSelectControl(handlebars) {\n\tthis._handlebars = handlebars || Handlebars\n\tthis._cb = function() {}\n\tthis._controlId = 'csc_' + E2.uid()\n\tthis._resultTpl = this._handlebars\n\tthis._filterText = ''\n}\n\nCollapsibleSelectControl.prototype.template = function(template) {\n\tthis._template = template\n\tthis._resultTpl = E2.views.patches.results\n\treturn this\n}\n\nCollapsibleSelectControl.prototype.data = function(d) {\n\tthis._data = {}\n\tthis._items = d\n\n\td.map(function(item) {\n\t\tif (!this._data[item.category])\n\t\t\tthis._data[item.category] = {}\n\t\tthis._data[item.category][item.title] = item\n\t}.bind(this))\n\n\treturn this\n}\n\nCollapsibleSelectControl.prototype.onOpen = function(cb) {\n\tthis._cb = cb\n\treturn this\n}\n\nCollapsibleSelectControl.prototype.focus = function() {\n\t$('input', this._el).focus()\n}\n\nCollapsibleSelectControl.prototype._reset = function() {\n\t$('.panel', this._el).show();\n\t$('table.result', this._el).empty().remove();\n\t$('.patch-result', this._el).empty();\n\tthis._filterText = '';\n\tif (E2.ui)\n\t\tE2.ui.onSearchResultsChange(this._el);\n}\n\nCollapsibleSelectControl.prototype._search = function(text) {\n\tvar that = this\n\n\ttext = text.trim();\n\n\tif (!text) {\n\t\tthis._reset()\n\t\treturn\n\t}\n\n\tif (text === this._filterText) return\n\n\tthis._filterText = text\n\n\t$('.panel', this._el).hide()\n\n\tvar $pr = $('.patch-result', this._el)\n\t\n\tvar data = this._filterData(text)\n\t\n\tvar $result = this._resultTpl(data)\n\t$pr.empty().html($result)\n\n\tvar $lis = $('td', $pr)\n\n\t$lis.dblclick(function(e) {\n\t\tthat._cb({\n\t\t\tpath: $(e.currentTarget).data('path')\n\t\t})\n\t})\n\n\t$lis.bind('mousedown', {\n\t\tdropSuccessCb: this._finishDrop.bind(this)\n\t},\n\tdragAndDropMouseDownHandler)\n\n\tthis._resultEls = $lis\n\n\tif (this._resultEls.length)\n\t\t$(this._resultEls.get(0)).addClass('active')\n\n\tthis._selectedIndex = 0\n\t$pr.parent().scrollTop(0)\n\t\n\tif (E2.ui)\n\t\tE2.ui.onSearchResultsChange(this._el);\n\n}\n\nCollapsibleSelectControl.prototype._finishDrop = function(eventData) {\n\tthis._cb(eventData)\n\n\tE2.ui.emit('dragDropped', eventData)\n}\n\nCollapsibleSelectControl.prototype._filterData = function(text) {\n\tvar that = this\n\treturn this._items.reduce(function(items, item) {\n\t\tvar score = that.scoreResult(text, item.title)\n\n\t\tif (score < text.length)\n\t\t\treturn items;\n\n\t\titems.push({\n\t\t\tscore: score,\n\t\t\ttitle: item.title,\n\t\t\tcategory: item.category,\n\t\t\tpath: item.path\n\t\t})\n\n\t\treturn items;\n\t}, [])\n\t.sort(function(a,b) {\n\t\tvar dif = b.score - a.score;\n\t\tvar ltext = text.toLowerCase();\n\t\tvar aTitle = a.title.toLowerCase();\n\t\tvar bTitle = b.title.toLowerCase();\n\t\tif (ltext === aTitle)\n\t\t\treturn -1\n\t\tif (ltext === bTitle)\n\t\t\treturn 1\n\t\tif (dif === 0) {\n\t\t\tif (a.title < b.title)\n\t\t\t\treturn -1\n\t\t\tif (a.title > b.title)\n\t\t\t\treturn 1\n\t\t}\n\t\treturn dif\n\t})\n\n}\n\nCollapsibleSelectControl.prototype.scoreResult = function(oq, resultStr) {\n\tvar lstr = resultStr.toLowerCase()//.replace(/\\//gim, '')\n\tvar scr = 0\n\toq = oq.toLowerCase()\n\t\n\tif (lstr.indexOf(oq) === 0)\n\t\treturn 1000\n\t\n\tif (lstr.indexOf(oq) > -1)\n\t\treturn 500\n\n\tvar qs = oq.split(' ')\n\n\tfunction countInString(cc, str) {\n\t\tvar count = 0\n\t\tvar pos = str.indexOf(cc)\n\t\twhile (pos !== -1) {\n\t\t\tcount ++\n\t\t\tpos = str.indexOf(cc, pos + 1)\n\t\t}\n\t\treturn count\n\t}\n\n\tfor(var j=0; j < qs.length; j++) {\n\t\tvar q = qs[j]\n\n\t\tfor(var i=0; i < q.length; i++) {\n\t\t\tvar sofar = q.substring(0, q.length-i)\n\n\t\t\tif (lstr.indexOf(sofar) > -1)\n\t\t\t\tscr += 2 * q.length - i\n\n\t\t\tvar qInStr = countInString(q[i], lstr)\n\t\t\tif (qInStr < countInString(q[i], q)) {\n\t\t\t\treturn 0\n\t\t\t}\n\n\t\t\tscr += qInStr\n\t\t}\n\t}\n\n\treturn scr\n}\n\nCollapsibleSelectControl.prototype.render = function(el, templateOptions) {\n\tvar that = this\n\n\tvar templateData = _.extend({\n\t\tsearchPlaceholderText : 'Search'\n\t}, templateOptions)\n\n\t_.extend(templateData, {\n\t\tcontrolId: this._controlId,\n\t\tcategories: this._data\n\t})\n\n\tel = el || $('<div class=\"collapsible-select-control\">').appendTo('body')\n\tel.empty()\n\tthis._el = el\n\n\tel.html(this._template(templateData))\n\n\tvar $input = $('input', el)\n\n\tel.on('hide.bs.collapse', function(e) {\n\t\t$(e.target).prev()\n\t\t\t.removeClass('expanded')\n\t\t\t.addClass('collapsed')\n\t})\n\n\tel.on('show.bs.collapse', function(e) {\n\t\t$(e.target).prev()\n\t\t\t.removeClass('collapsed')\n\t\t\t.addClass('expanded')\n\t})\n\n\t$('li', el).dblclick(function(e) {\n\t\tthat._cb($(e.currentTarget).data('path'))\n\t\t$(window).unbind('mousemove')\n\t})\n\n\t// Drag and drop an element from the list\n\t$('li', el).bind('mousedown', {\n\t\tdropSuccessCb: function(e) {\n\t\t\t$input.blur()\n\t\t\tthat._finishDrop(e)\n\t\t}\n\t}, dragAndDropMouseDownHandler)\n\n\tvar keyTimer\n\n\t$input.on('keyup', function(e) {\n\t\tif (keyTimer)\n\t\t\tclearTimeout(keyTimer)\n\n\t\tif (e.keyCode === 27) {\n\t\t\te.stopPropagation()\n\t\t\treturn $input.blur()\n\t\t}\n\n\t\tif (e.keyCode === 38 || e.keyCode === 40)\n\t\t\treturn;\n\n\t\tkeyTimer = setTimeout(that._search.bind(that, $input.val()), 100)\n\t})\n\n\t$input.on('blur', function(e) {\n\t\tjQuery(e.target).parent().parent().find('td.active').removeClass('active');\n\t\treturn true;\n\t});\n\n\t$input.on('keydown', function(e) {\n\t\tvar res = that._resultEls\n\t\tvar sel = that._selectedIndex\n\t\tvar $sel\n\n\t\tvar filterCodes = [13, 38, 40]\n\n\t\tif (filterCodes.indexOf(e.keyCode) < 0 || !res)\n\t\t\treturn true;\n\n\t\tif (res) {\n\t\t\tres.removeClass('active')\n\t\t\t$sel = $($(res)[that._selectedIndex])\n\t\t}\n\n\t\tswitch(e.keyCode) {\n\t\t\tcase 13: // ok\n\t\t\t\tif ($sel) {\n\t\t\t\t\t$sel.trigger('dblclick')\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t$input.trigger('blur');\n\t\t\t\t\t}, 100);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 38: // up\n\t\t\t\tif (sel > 0)\n\t\t\t\t\tthat._selectedIndex--\n\t\t\t\tbreak;\n\t\t\tcase 40: // down\n\t\t\t\tthat._selectedIndex++\n\t\t\t\tsel++\n\t\t\t\tbreak;\n\t\t}\n\n\t\t// constrain\n\t\tvar $res = $(res);\n\t\tif (that._selectedIndex >= $res.length)\n\t\t\tthat._selectedIndex = $res.length - 1;\n\t\tif (that._selectedIndex < 0)\n\t\t\tthat._selectedIndex = 0;\n\n\t\t$sel = $($res[that._selectedIndex])\n\t\t$sel.addClass('active')\n\n\t\tif ($sel.length > 0) {\n\t\t\tvar selectionPositionTop = $sel.position().top;\n\t\t\tvar selectionHeight = $sel.outerHeight();\n\t\t\tvar $findParent = $sel.parents('.scrollbar');\n\n\t\t\tif ($findParent.length > 0) {\n\t\t\t\tvar parentScrollHeight = $findParent.innerHeight();\n\t\t\t\tvar parentPositionTop = $findParent.position().top;\n\t\t\t\tvar parentScrollTop = $findParent.scrollTop();\n\n\t\t\t\tselectionPositionTop -= parentPositionTop;\n\n\t\t\t\tvar newY;\n\t\t\t\tvar pxAllowance = selectionHeight / 4;\t// consider result visible within reason\n\n\t\t\t\tif (selectionPositionTop + selectionHeight - pxAllowance > parentScrollHeight) { // selected past the bottom\n\t\t\t\t\tnewY = parentScrollTop + selectionHeight;\n\t\t\t\t\t$findParent.scrollTop(newY);\n\t\t\t\t}\n\t\t\t\telse if (selectionPositionTop + pxAllowance <= 0 ) { // selected above scrolltop\n\t\t\t\t\tnewY = parentScrollTop - selectionHeight;\n\t\t\t\t\tif (newY < 0) newY = 0;\n\t\t\t\t\t$findParent.scrollTop(newY);\n\t\t\t\t}\n\t\t\t\t// else no scroll required\n\t\t\t}\n\t\t}\n\t})\n\n\treturn this;\n}\n\nif (typeof module !== 'undefined')\n\tmodule.exports = CollapsibleSelectControl\n"
  },
  {
    "path": "browser/scripts/commands/fork.js",
    "content": "(function() {\n\nfunction getForkName(path) {\n\tvar p = path.split('-').join('/').split('/')\n\tvar name = p[0]\n\t\n\tif (p.length > 1)\n\t\tname = p[0] + '-' + p[1]\n\n\tname = name + '-' + E2.uid()\n\n\treturn name;\n}\n\n\nfunction ForkCommand() {}\n\nForkCommand.prototype.fork = function() {\n\tvar oldPlayerState = E2.app.player.current_state\n\n\tE2.app.player.stop()\n\n\t// dispatch the old graph as a snapshot in the log\n\tE2.app.channel.snapshot()\n\n\tvar oldName = E2.app.path\n\tvar forkName = getForkName(E2.app.path)\n\n\thistory.pushState({}, null, '/' + forkName)\n\tE2.app.path = forkName\n\n\treturn E2.app.setupEditorChannel()\n\t\t.then(function() {\n\t\t\tE2.track({\n\t\t\t\tevent: 'forked',\n\t\t\t\tfromName: oldName,\n\t\t\t\tforkName: forkName \n\t\t\t})\n\n\t\t\tif (oldPlayerState === E2.app.player.state.PLAYING)\n\t\t\t\tE2.app.player.play()\n\t\t})\n}\n\nif (typeof(exports) !== 'undefined')\n\texports.ForkCommand = ForkCommand\nelse\n\twindow.ForkCommand = ForkCommand\n\n})();\n\n"
  },
  {
    "path": "browser/scripts/commands/graphEditCommands.js",
    "content": "(function() {\n\nfunction GraphEditCommand(graph) {\n\tif (!(graph instanceof Graph))\n\t\tthrow new Error('GraphEditCommand requires graph')\n\tthis.graph = graph\n}\n\nGraphEditCommand.prototype.execute = function() {\n\treturn this.redo()\n}\n\n// -------------------------------\n\nfunction removeNode() {\n\tvar sid, connection, slotIndex = 0\n\tvar node = this.node\n\tvar graph = this.graph\n\n\tif (node.plugin.isGraph) {\n\t\tthis.nodeInfo = {\n\t\t\torder: [ // restore in same render order\n\t\t\t\tgraph.nodes.indexOf(node),\n\t\t\t\tgraph.children.indexOf(node)\n\t\t\t]\n\t\t}\n\t} else if (node.parent_graph && node.parent_graph.plugin) {\n\t\tif (node.plugin.id === 'input_proxy') {\n\t\t\tsid = node.parent_graph.plugin.state.input_sids[node.uid]\n\n\t\t\tif (node.parent_graph.plugin.node.inputs.length) {\n\t\t\t\tconnection = node.parent_graph.plugin.node.inputs.filter(function(input) {\n\t\t\t\t\treturn input.dst_slot.uid === sid\n\t\t\t\t})[0]\n\n\t\t\t\tif (connection)\n\t\t\t\t\tslotIndex = connection.dst_slot.index\n\t\t\t}\n\t\t} else if (node.plugin.id === 'output_proxy') {\n\t\t\tsid = node.parent_graph.plugin.state.output_sids[node.uid]\n\n\t\t\tif (node.parent_graph.plugin.node.outputs.length) {\n\t\t\t\tconnection = node.parent_graph.plugin.node.outputs.filter(function(output) {\n\t\t\t\t\treturn output.src_slot.uid === sid\n\t\t\t\t})[0]\n\n\t\t\t\tif (connection)\n\t\t\t\t\tslotIndex = connection.src_slot.index\n\t\t\t}\n\t\t}\n\n\t\tif (sid !== undefined) {\n\t\t\tthis.nodeInfo = {\n\t\t\t\tproxy: {\n\t\t\t\t\tsid: sid,\n\t\t\t\t\tindex: slotIndex,\n\t\t\t\t\tconnection: connection ? connection.serialise() : null\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tE2.app.dispatcher.dispatch({\n\t\tactionType: 'uiNodeRemoved',\n\t\tgraphUid: this.graph.uid,\n\t\tnodeUid: this.node.uid,\n\t\tinfo: this.nodeInfo\n\t})\n}\n\n// -------------------------------------\n\nfunction addNode() {\n\tE2.app.dispatcher.dispatch({\n\t\tactionType: 'uiNodeAdded',\n\t\tgraphUid: this.graph.uid,\n\t\tnode: this.node,\n\t\tinfo: this.nodeInfo\n\t})\n}\n\nfunction AddNode(graph, node) {\n\tGraphEditCommand.apply(this, arguments)\n\tthis.node = node\n\tthis.title = 'Add node ' + node.title\n}\nAddNode.prototype = Object.create(GraphEditCommand.prototype)\nAddNode.prototype.undo = removeNode\nAddNode.prototype.redo = addNode\n\n// -------------------------------\n\nfunction RemoveNode(graph, node) {\n\tGraphEditCommand.apply(this, arguments)\n\tthis.node = node\n\tthis.title = 'Remove node ' + this.node.title\n}\nRemoveNode.prototype = Object.create(GraphEditCommand.prototype)\nRemoveNode.prototype.undo = addNode\nRemoveNode.prototype.redo = removeNode\n\n// -------------------------------\n\nfunction uiSlotRemoved() {\n\tE2.app.dispatcher.dispatch({\n\t\tactionType: 'uiSlotRemoved',\n\t\tgraphUid: this.graph.uid,\n\t\tnodeUid: this.node.uid,\n\t\tslotUid: this.slot.uid\n\t})\n}\nfunction uiSlotAdded() {\n\tE2.app.dispatcher.dispatch({\n\t\tactionType: 'uiSlotAdded',\n\t\tgraphUid: this.graph.uid,\n\t\tnodeUid: this.node.uid,\n\t\tslot: this.slot\n\t})\n}\nfunction AddSlot(graph, node, slot) {\n\tGraphEditCommand.apply(this, arguments)\n\tthis.node = node\n\tthis.slot = slot\n}\nAddSlot.prototype = Object.create(GraphEditCommand.prototype)\nAddSlot.prototype.undo = uiSlotRemoved\nAddSlot.prototype.redo = uiSlotAdded\n\nfunction RemoveSlot(graph, node, slotUid) {\n\tGraphEditCommand.apply(this, arguments)\n\tthis.node = node\n\tthis.slot = node.findSlotByUid(slotUid)\n}\nRemoveSlot.prototype = Object.create(GraphEditCommand.prototype)\nRemoveSlot.prototype.undo = uiSlotAdded\nRemoveSlot.prototype.redo = uiSlotRemoved\n\n// -------------------------------\n\nfunction RenameNode(graph, node, title) {\n\tGraphEditCommand.apply(this, arguments)\n\tthis.node = node\n\tthis.origNodeTitle = node.title\n\tthis.newNodeTitle = title\n\tthis.title = 'Rename node ' + node.title + ' to ' + title\n}\nRenameNode.prototype = Object.create(GraphEditCommand.prototype)\nRenameNode.prototype.undo = function() {\n\tE2.app.dispatcher.dispatch({\n\t\tactionType: 'uiNodeRenamed',\n\t\tgraphUid: this.graph.uid,\n\t\tnodeUid: this.node.uid,\n\t\ttitle: this.origNodeTitle\n\t})\n}\n\nRenameNode.prototype.redo = function() {\n\tE2.app.dispatcher.dispatch({\n\t\tactionType: 'uiNodeRenamed',\n\t\tgraphUid: this.graph.uid,\n\t\tnodeUid: this.node.uid,\n\t\ttitle: this.newNodeTitle\n\t})\n}\n\n\n// -------------------------------\n\nfunction uiDisconnected() {\n\tE2.app.dispatcher.dispatch({\n\t\tactionType: 'uiDisconnected',\n\t\tgraphUid: this.graph.uid,\n\t\tconnectionUid: this.connection.uid\n\t})\n}\n\nfunction uiConnected() {\n\tE2.app.dispatcher.dispatch({\n\t\tactionType: 'uiConnected',\n\t\tgraphUid: this.graph.uid,\n\t\tconnection: this.connection\n\t})\n}\n\nfunction Connect(graph, connection) {\n\tGraphEditCommand.apply(this, arguments)\n\tthis.title = 'Connect'\n\tthis.connection = connection\n}\n\nConnect.prototype = Object.create(GraphEditCommand.prototype)\nConnect.prototype.undo = uiDisconnected\nConnect.prototype.redo = uiConnected\n\n// -------------------------------\n\nfunction Disconnect(graph, connection) {\n\tGraphEditCommand.apply(this, arguments)\n\tthis.title = 'Disconnect'\n\tthis.connection = connection\n}\nDisconnect.prototype = Object.create(GraphEditCommand.prototype)\nDisconnect.prototype.undo = uiConnected\nDisconnect.prototype.redo = uiDisconnected\n\n// -------------------------------\n\nfunction Move(graph, nodes, dx, dy) {\n\tGraphEditCommand.apply(this, arguments)\n\tthis.title = 'Move'\n\tthis.nodes = nodes\n\tthis.delta = { x: dx, y: dy }\n}\nMove.prototype = Object.create(GraphEditCommand.prototype)\n\nMove.prototype.undo = function() {\n\tE2.app.dispatcher.dispatch({\n\t\tactionType: 'uiNodesMoved',\n\t\tgraphUid: this.graph.uid,\n\t\tnodeUids: this.nodes.map(function(n) {\n\t\t\treturn n.uid\n\t\t}),\n\t\tdelta: {\n\t\t\tx: this.delta.x * -1,\n\t\t\ty: this.delta.y * -1\n\t\t}\n\t})\n}\n\nMove.prototype.redo = function() {\n\tE2.app.dispatcher.dispatch({\n\t\tactionType: 'uiNodesMoved',\n\t\tgraphUid: this.graph.uid,\n\t\tnodeUids: this.nodes.map(function(n) {\n\t\t\treturn n.uid\n\t\t}),\n\t\tdelta: this.delta\n\t})\n}\n\n// -------------------------------\n\nfunction Reorder(graph, original, sibling, insertAfter) {\n\tGraphEditCommand.apply(this, arguments)\n\tthis.title = 'Reorder'\n\tthis.original = original\n\tthis.sibling = sibling\n\tthis.insertAfter = insertAfter\n}\nReorder.prototype = Object.create(GraphEditCommand.prototype)\n\nReorder.prototype.undo = function() {\n\tE2.app.dispatcher.dispatch({\n\t\tactionType: 'uiGraphTreeReordered',\n\t\tgraph: this.graph,\n\t\toriginal: this.sibling,\n\t\tsibling: this.original,\n\t\tinsertAfter: this.insertAfter\n\t})\n}\n\nReorder.prototype.redo = function() {\n\tE2.app.dispatcher.dispatch({\n\t\tactionType: 'uiGraphTreeReordered',\n\t\tgraph: this.graph,\n\t\toriginal: this.original,\n\t\tsibling: this.sibling,\n\t\tinsertAfter: this.insertAfter\n\t})\n}\n\n// -------------------------------\n\nfunction ChangePluginState(graph, node, key, oldValue, newValue, title) {\n\tGraphEditCommand.apply(this, arguments)\n\tthis.title = title || 'Value Change to '+newValue+' from '+oldValue\n\tthis.node = node\n\tthis.key = key\n\n\tthis.oldValue = oldValue\n\tthis.newValue = newValue\n}\nChangePluginState.prototype = Object.create(GraphEditCommand.prototype)\n\nChangePluginState.prototype.undo = function() {\n\tE2.app.dispatcher.dispatch({\n\t\tactionType: 'uiPluginStateChanged',\n\t\tgraphUid: this.graph.uid,\n\t\tnodeUid: this.node.uid,\n\t\tkey: this.key,\n\t\tvalue: this.oldValue\n\t})\n}\n\nChangePluginState.prototype.redo = function() {\n\tE2.app.dispatcher.dispatch({\n\t\tactionType: 'uiPluginStateChanged',\n\t\tgraphUid: this.graph.uid,\n\t\tnodeUid: this.node.uid,\n\t\tkey: this.key,\n\t\tvalue: this.newValue\n\t})\n}\n\n// -------------------------------\n\nfunction ChangeInputSlotValue(graph, node, slotName, newValue, oldValue) {\n\tGraphEditCommand.apply(this, arguments)\n\tthis.node = node\n\tthis.slotName = slotName\n\tthis.oldValue = typeof oldValue !== 'undefined' ? oldValue : node.getInputSlotValue(slotName)\n\tthis.newValue = newValue\n\tthis.title = 'Slot Value Changed'\n}\nChangeInputSlotValue.prototype = Object.create(GraphEditCommand.prototype)\n\nChangeInputSlotValue.prototype.undo = function() {\n\tE2.app.dispatcher.dispatch({\n\t\tactionType: 'uiSlotValueChanged',\n\t\tgraphUid: this.graph.uid,\n\t\tnodeUid: this.node.uid,\n\t\tslotName: this.slotName,\n\t\tvalue: this.oldValue\n\t})\n}\n\nChangeInputSlotValue.prototype.redo = function() {\n\tE2.app.dispatcher.dispatch({\n\t\tactionType: 'uiSlotValueChanged',\n\t\tgraphUid: this.graph.uid,\n\t\tnodeUid: this.node.uid,\n\t\tslotName: this.slotName,\n\t\tvalue: this.newValue\n\t})\n}\n\n// -------------------------------\n\nfunction Undoable(graph, node, key, oldValue, newValue, title) {\n\tGraphEditCommand.apply(this, arguments)\n\tthis.node = node\n\tthis.key = key\n\tthis.title = title || 'Value Change'\n\tthis.oldValue = oldValue\n\tthis.newValue = newValue\n\tthis.setterFn = setterFn\n}\n\nUndoable.prototype = Object.create(GraphEditCommand.prototype)\n\nUndoable.prototype.undo = function() {\n\tE2.app.dispatcher.dispatch('pluginStateChanged', \n\t\tthis.graph,\n\t\tthis.node,\n\t\tthis.key,\n\t\tthis.oldValue\n\t)\n\n\tthis.setterFn(this.oldValue)\n}\n\nUndoable.prototype.redo = function() {\n\tE2.app.dispatcher.dispatch('pluginStateChanged', \n\t\tthis.graph,\n\t\tthis.node,\n\t\tthis.key,\n\t\tthis.newValue\n\t)\n\n\tthis.setterFn(this.newValue)\n}\n\n// -------------------------------\n\nif (typeof(E2) !== 'undefined') {\n\tif (!E2.commands)\n\t\tE2.commands = {}\n\tif (!E2.commands.graph)\n\t\tE2.commands.graph = {}\n\n\tE2.commands.Undoable = Undoable\n\n\tE2.commands.graph.AddNode = AddNode\n\tE2.commands.graph.RemoveNode = RemoveNode\n\tE2.commands.graph.AddSlot = AddSlot\n\tE2.commands.graph.RemoveSlot = RemoveSlot\n\tE2.commands.graph.RenameNode = RenameNode\n\tE2.commands.graph.Connect = Connect\n\tE2.commands.graph.Disconnect = Disconnect\n\tE2.commands.graph.Move = Move\n\tE2.commands.graph.Reorder = Reorder\n\n\tE2.commands.graph.ChangePluginState = ChangePluginState\n\tE2.commands.graph.ChangeInputSlotValue = ChangeInputSlotValue\n}\n\nif (typeof(module) !== 'undefined') {\n\tmodule.exports = E2.commands.graph\n}\n\n})()\n"
  },
  {
    "path": "browser/scripts/commands/undoManager.js",
    "content": "(function() {\n\nfunction undoItem(xi) {\n\treturn xi.undo()\n}\n\nfunction redoItem(xi) {\n\treturn xi.redo()\n}\n\nfunction UndoManager() {\n\tthis.undoStack = []\n\tthis.redoStack = []\n\tthis._nestedTransactions = 0\n}\n\nUndoManager.prototype.isUndoable = function() {\n\treturn this.undoStack.length > 0\n}\n\nUndoManager.prototype.isRedoable = function() {\n\treturn this.redoStack.length > 0\n}\n\nUndoManager.prototype.getUndoStack = function() {\n\treturn this.undoStack\n}\n\nUndoManager.prototype.getRedoStack = function() {\n\treturn this.redoStack\n}\n\nUndoManager.prototype.begin = function(title) {\n\tthis._nestedTransactions++\n\n\tif (this._transaction) { // xa already in progress, nop\n\t\treturn;\n\t}\n\n\tvar xa = {\n\t\ttitle: title,\n\t\tundoStack: []\n\t}\n\n\txa.redo = function() {\n\t\txa.undoStack.reverse().map(redoItem)\n\t}\n\n\txa.undo = function() {\n\t\txa.undoStack.reverse().map(undoItem)\n\t}\n\n\tthis._transaction = xa\n}\n\nUndoManager.prototype.end = function() {\n\tif (--this._nestedTransactions > 0)\n\t\treturn;\n\n\tvar xa = this._transaction\n\n\tif (!xa)\n\t\treturn;\n\n\tthis._transaction = null\n\n\tthis.push(xa)\n}\n\nUndoManager.prototype.execute = function(item) {\n\tthis.push(item)\n\treturn item.redo()\n}\n\nUndoManager.prototype.undo = function() {\n\tvar item = this.undoStack.pop()\n\n\tif (!item)\n\t\treturn;\n\n\tthis.redoStack.push(item)\n\n\treturn undoItem(item)\n}\n\nUndoManager.prototype.redo = function() {\n\tvar item = this.redoStack.pop()\n\n\tif (!item)\n\t\treturn;\n\n\tthis.undoStack.push(item)\n\n\treturn redoItem(item)\n}\n\nUndoManager.prototype.push = function(item) {\n\tthis.redoStack = []\n\n\tif (this._transaction)\n\t\treturn this._transaction.undoStack.push(item)\n\n\tthis.undoStack.push(item)\n}\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = UndoManager\nelse\n\twindow.UndoManager = UndoManager\n\n})()"
  },
  {
    "path": "browser/scripts/connection.js",
    "content": "function ConnectionUI(parent_conn) {\n\tthis.src_pos = [0, 0]\n\tthis.dst_pos = [0, 0]\n\tthis.src_slot_div = null\n\tthis.dst_slot_div = null\n\tthis.flow = false\n\tthis.selected = false\n\tthis.deleting = false\n\tthis.parent_conn = parent_conn\n\tthis.color = '#000'\n}\n\nConnectionUI.prototype.resolve_slot_divs = function(and_redraw) {\n\tvar pc = this.parent_conn;\n\tand_redraw = (typeof and_redraw === 'undefined' ) ? true : !!and_redraw;\t// force to bool, default true\n\n\tthis.src_slot_div = pc.src_node.ui.dom.find('#n' + pc.src_node.uid + (pc.src_slot.dynamic ? 'do' + pc.src_slot.uid : 'so' + pc.src_slot.index));\n\tthis.dst_slot_div = pc.dst_node.ui.dom.find('#n' + pc.dst_node.uid + (pc.dst_slot.dynamic ? 'di' + pc.dst_slot.uid : 'si' + pc.dst_slot.index));\n\n\tif (and_redraw)\n\t\tE2.app.redrawConnection(pc)\n}\n\nfunction Connection(src_node, dst_node, src_slot, dst_slot, offset) {\n\tthis.src_node = src_node\n\tthis.dst_node = dst_node\n\tthis.src_slot = src_slot\n\tthis.dst_slot = dst_slot\n\tthis.ui = null\n\tthis.uid = E2.uid()\n\tthis.offset = offset || 0\n}\n\nConnection.prototype.create_ui = function() {\n\tthis.ui = new ConnectionUI(this)\n\treturn this.ui\n}\n\nConnection.prototype.destroy_ui = function() {\n\tthis.ui = null\n}\n\nConnection.prototype.reset = function() {\n\tif (this.ui && this.ui.flow) {\n\t\tthis.ui.flow = false;\n\t\tthis.ui.color = '#000'\n\t}\n}\n\nConnection.prototype.updateInboundNodes = function(node) {\n\tnode.queued_update = 1;\n\t\n\tif (node.plugin.id !== 'input_proxy') {\n\t\tif (Node.isGraphPlugin(node.plugin.id)) {\n\t\t\tnode.plugin.graph.roots.map(this.updateInboundNodes.bind(this))\n\t\t}\n\n\t\tfor(var i = 0, len = node.inputs.length; i < len; i++)\n\t\t\tthis.updateInboundNodes(node.inputs[i].src_node)\n\t} else {\n\t\tvar rp = node.parent_graph.plugin\n\t\t\n\t\tif (rp && rp.parent_node.queued_update < 0)\n\t\t\tthis.updateInboundNodes(rp.parent_node)\n\t}\n}\n\nConnection.prototype.updateOutboundNodes = function(node) {\n\tnode.queued_update = 1\n\t\n\tif (node.plugin.id !== 'output_proxy') {\n\t\tif (E2.GRAPH_NODES.indexOf(node.plugin.id) > -1) {\n\t\t\tnode.plugin.graph.roots.map(this.updateOutboundNodes.bind(this))\n\t\t}\n\n\t\tfor(var i = 0, len = node.outputs.length; i < len; i++)\n\t\t\tthis.updateOutboundNodes(node.outputs[i].dst_node)\n\t} else {\n\t\tvar rp = node.parent_graph.plugin\n\n\t\tif (rp && rp.parent_node.queued_update < 0)\n\t\t\tthis.updateOutboundNodes(rp.parent_node)\n\t}\n}\n\nConnection.prototype.signal_change = function(on) {\n\tvar srcNode = this.src_node\n\t\n\tif (srcNode.plugin.connection_changed) {\n\t\tsrcNode.plugin.connection_changed(on, this, this.src_slot)\n\t}\n\t\n\tvar dstNode = this.dst_node, dstPlugin = dstNode.plugin\n\tdstNode.inputs_changed = true\n\n\tif (!on && dstNode.plugin.update_input) {\n\t\tvar def = this.dst_node.getUiSlotValue(this.dst_slot)\n\t\tdef = clone(def)\n\t\tif (dstPlugin.inputValues)\n\t\t\tdstPlugin.inputValues[this.dst_slot.name] = def\n\t\tdstPlugin.update_input(this.dst_slot, def)\n\t\tdstPlugin.updated = true\n\t}\n\t\n\tif (dstNode.plugin.connection_changed) {\n\t\tdstNode.plugin.connection_changed(on, this, this.dst_slot)\n\t\tdstNode.plugin.updated = true\n\t}\n\t\n\tif (on) {\n\t\tthis.updateInboundNodes(dstNode)\n\t\tthis.updateOutboundNodes(dstNode)\n\t}\n\n};\n\nConnection.prototype.serialise = function() {\n\tvar d = {}\n\n\td.src_nuid = this.src_node.uid\n\td.dst_nuid = this.dst_node.uid\n\td.src_slot = this.src_slot.dynamic ? this.src_slot.index : this.src_slot.name\n\td.dst_slot = this.dst_slot.dynamic ? this.dst_slot.index : this.dst_slot.name\n\td.uid = this.uid\n\t\t\n\tif (this.src_slot.uid !== undefined)\n\t\td.src_dyn = true\n\t\n\tif (this.dst_slot.uid !== undefined)\n\t\td.dst_dyn = true\n\n\tif (this.offset !== 0)\n\t\td.offset = this.offset\n\t\n\treturn d\n}\n\nConnection.prototype.deserialise = function(d) {\n\tthis.src_node = '' + d.src_nuid\n\tthis.dst_node = '' + d.dst_nuid\n\n\tthis.uid = d.uid || E2.uid()\n\n\tthis.src_slot = {\n\t\tdynamic: !!d.src_dyn,\n\t\tis_connected: true\n\t}\n\n\tif (this.src_slot.dynamic) {\n\t\tthis.src_slot.index = d.src_slot\n\t} else {\n\t\t// support old editlogs\n\t\t// can be removed in ~March 2016\n\t\tif (typeof(d.src_slot) === 'number')\n\t\t\tthis.src_slot.index = d.src_slot\n\t\telse\n\t\t\tthis.src_slot.name = d.src_slot\n\t}\n\n\tthis.dst_slot = {\n\t\tdynamic: !!d.dst_dyn,\n\t\tis_connected: true\n\t}\n\n\tif (this.dst_slot.dynamic) {\n\t\tthis.dst_slot.index = d.dst_slot\n\t} else {\n\t\t// support old editlogs\n\t\t// can be removed in ~March 2016\n\t\tif (typeof(d.dst_slot) === 'number')\n\t\t\tthis.dst_slot.index = d.dst_slot\n\t\telse\n\t\t\tthis.dst_slot.name = d.dst_slot\n\t}\n\n\tthis.offset = d.offset ? d.offset : 0\n}\n\nConnection.prototype.patch_up = function(nodes) {\n\tif (this.src_node instanceof Node &&\n\t\tthis.dst_slot.is_connected &&\n\t\tthis.src_slot.is_connected) {\n\t\treturn // already patched up (this may happen eg. on Disconnect undo)\n\t}\n\n\tfunction resolve_node(nuid) {\n\t\tif (nuid instanceof Node)\n\t\t\treturn nuid\n\n\t\tfor(var i = 0, len = nodes.length; i < len; i++) {\n\t\t\tif (nodes[i].uid === nuid)\n\t\t\t\treturn nodes[i]\n\t\t}\n\t\t\n\t\tmsg('ERROR: Failed to resolve node with uid = ' + nuid)\n\t\treturn null\n\t}\n\t\n\tthis.src_node = resolve_node(this.src_node)\n\tthis.dst_node = resolve_node(this.dst_node)\n\t\n\tif (!this.src_node || !this.dst_node) {\n\t\tmsg('ERROR: Source or destination node invalid - dropping connection.')\n\t\tconsole.log('Connection that failed', this)\n\t\treturn false\n\t}\n\n\tvar ss = this.src_slot.dynamic ?\n\t\tthis.src_node.dyn_outputs[this.src_slot.index] :\n\t\t(this.src_slot.name ? // support old editlogs, until 3.2016\n\t\t\tthis.src_node.findOutputSlotByName(this.src_slot.name) :\n\t\t\tthis.src_node.plugin.output_slots[this.src_slot.index])\n\n\tvar ds = this.dst_slot.dynamic ? \n\t\tthis.dst_node.dyn_inputs[this.dst_slot.index] :\n\t\t(this.dst_slot.name ? // support old editlogs, until 3.2016\n\t\t\tthis.dst_node.findInputSlotByName(this.dst_slot.name) :\n\t\t\tthis.dst_node.plugin.input_slots[this.dst_slot.index])\n\t\n\tif (!ss || !ds) {\n\t\tmsg('ERROR: Source or destination slot invalid - dropping connection.')\n\t\tconsole.error('Connection that failed', this)\n\t\treturn false\n\t}\n\n\tthis.src_slot = ss\n\tthis.dst_slot = ds\n\n\tvar any_dt = E2.dt.ANY\n\t\n\tif (this.src_slot.dt.id !== this.dst_slot.dt.id && \n\t\tthis.src_slot.dt.id !== any_dt.id && \n\t\tthis.dst_slot.dt.id !== any_dt.id)\n\t{\n\t\tmsg('ERROR: Connection data type mismatch - dropping connection.')\n\t\tconsole.log('Connection that failed', this)\n\t\treturn false\n\t}\n\t\n\tthis.src_node.addOutput(this)\n\tthis.dst_node.addInput(this)\n\n\tthis.dst_slot.is_connected = this.src_slot.is_connected = true\n\n\treturn true\n}\n\nConnection.hydrate = function(graph, serialisedConnection) {\n\tvar connection = new Connection()\n\tconnection.deserialise(serialisedConnection)\n\tconnection.patch_up(graph.nodes)\n\treturn connection\n}\n\n\nif (typeof(module) !== 'undefined') {\n\tmodule.exports.Connection = Connection\n\tmodule.exports.ConnectionUI = ConnectionUI\n}\n\n"
  },
  {
    "path": "browser/scripts/contextMenu.js",
    "content": "var Menu = function(cm, items, callback) {\n\tthis.cm = cm;\n\tthis.items = items;\n\tthis.callback = callback;\n\tthis.dom = null;\n\tthis.child = null;\n\tthis.selected = null;\n};\n\nMenu.prototype.create = function(parent, position, is_root)\n{\n\tvar ul = $('<ul>');\n\t\n\tul.addClass('menu-panel');\n\tul.css('position', 'absolute');\n\tul.css('z-index', '10000');\n\t\n\tul.bind('contextmenu', function()\n\t{\n\t\treturn false;\n\t});\n\t\n\tif(!is_root)\n\t{\n\t\tul.mouseleave(function(self) { return function(e)\n\t\t{\n\t\t\tself.destroy();\n\t\t}}(self));\n\t}\n\t\n\tfor(var i = 0, len = this.items.length; i < len; i++)\n\t{\n\t\tvar item = this.items[i];\n\t\tvar li = make('li');\n\t\tvar span = make('span');\n\t\t\n\t\tif(item.icon)\n\t\t{\n\t\t\tvar icon = make('span');\n\t\t\t\n\t\t\ticon.addClass('menu-icon')\n\t\t\tli.append(icon.addClass('icon-' + item.icon));\n\t\t}\n\t\t\n\t\tspan.text(item.name);\n\t\t\n\t\tli.append(span);\n\t\t\n\t\tif(item.items)\n\t\t{\n\t\t\tvar $group = make('span');\n\t\t\t\n\t\t\tspan.addClass('menu-lbl menu-lbl-grp');\n\t\t\tli.addClass('menu-grp-item menu-item');\n\t\t\tli.append($group);\n\n\t\t\tli.mouseenter(function(self, $groupElement, li, item) { return function(e)\n\t\t\t{\n\t\t\t\tvar groupOffset = $groupElement.offset();\n\t\t\t\t\n\t\t\t\tself.select(li)\n\t\t\t\tself.child = new Menu(self.cm, item.items, self.callback);\n\t\t\t\tself.child.create(self, [groupOffset.left + 12, groupOffset.top - 14], true);\n\t\t\t}}(this, $group, li, item));\n\n\t\t\tli.mousedown(function(e)\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tspan.addClass('menu-lbl');\n\t\t\tli.addClass('menu-item');\n\t\t\t\n\t\t\tli.mouseenter(function(self, li) { return function(e)\n\t\t\t{\n\t\t\t\tself.select(li);\n\t\t\t}}(this, li));\n\n\t\t\tli.mousedown(function(self, item) { return function(e)\n\t\t\t{\n\t\t\t\tself.cm.hide();\n\t\t\t\tself.callback(item.icon, self.cm.called_pos);\n\t\t\t\te.stopPropagation();\n\t\t\t\treturn false;\n\t\t\t}}(this, item));\n\t\t}\n\t\t\n\t\tul.append(li);\n\t}\n\t\n\tthis.dom = ul;\n\n\t$('body').append(ul);\n\t\n\tvar w = ul[0].clientWidth;\n\tvar h = ul[0].clientHeight;\n\t\n\tvar win = window;\n\t\n\t// Not quite good enough, but passable for now.\n\tif(position[0] + w >= win.innerWidth - 16)\n\t{\n\t\tvar ofs = w + (parent ? parent.dom.width() : 0);\n\t\tposition[0] = position[0] >= ofs ? position[0] - ofs : 0;\n\t}\n\t\t\n\tif(position[1] + h >= win.innerHeight - 16)\n\t\tposition[1] = position[1] >= h ? position[1] - (h - 18) : 0;\n\t\n\tvar s = ul[0].style;\n\t\n\ts.left = '' + Math.round(position[0]) + 'px';\n\ts.top = '' + Math.round(position[1]) + 'px';\n};\n\nMenu.prototype.select = function(elem)\n{\n\tif(this.selected)\n\t\tthis.selected.removeClass('selected')\n\t\n\tif(this.child)\n\t{\n\t\tthis.child.destroy();\n\t\tthis.child = null;\n\t}\n\t\n\telem.addClass('selected')\n\tthis.selected = elem;\n};\n\nMenu.prototype.destroy = function()\n{\n\tif(this.child)\n\t{\n\t\tthis.child.destroy();\n\t\tthis.child = null;\n\t}\n\t\n\tif(this.dom)\n\t{\n\t\tthis.dom.remove();\n\t\tthis.dom = null;\n\t}\n};\n\nfunction ContextMenu(parent, items) {\n\tEventEmitter.call(this)\n\tvar that = this;\n\n\tthis.pos = [0, 0];\n\tthis.called_pos = [0,0];\n\n\tthis.items = items;\n\tthis.callback = function(icon, pos) {\n\t\tthat.emit('created', icon, that.called_pos)\n\t};\n\n\t\n\t$(document).bind('contextmenu', function(e) {\n\t\tif(e.target.id !== 'canvas')\n\t\t\treturn true;\n\n\t\tthat.pos = [e.pageX, e.pageY];\n\t\tthat.called_pos = [e.offsetX, e.offsetY];\t// remembers the offset in the canvas for creating the plugin later\n\t\tthat.show(that.pos);\t\t\t\t\t\t// shows the menu as before\n\t\treturn false;\n\t})\n\n\tparent.mousedown(function() {\n\t\tthat.hide();\n\t\treturn true;\n\t});\n}\n\nContextMenu.prototype = Object.create(EventEmitter.prototype)\n\nContextMenu.prototype.show = function(pos) {\n\tthis.pos = pos;\n\tthis.hide();\n\tthis.menu = new Menu(this, this.items, this.callback);\n\tthis.menu.create(null, pos, true);\n}\n\nContextMenu.prototype.hide = function() {\n\tif(this.menu) {\n\t\tthis.menu.destroy();\n\t\tthis.menu = null;\n\t}\n}"
  },
  {
    "path": "browser/scripts/core.js",
    "content": "/*\nThe MIT License (MIT)\n\nCopyright (c) 2011 Lasse Jul Nielsen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software\nand associated documentation files (the \"Software\"), to deal in the Software without restriction,\nincluding without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,\nand/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,\nsubject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial\nportions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT\nLIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,\nWHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\nif (typeof(E2) === 'undefined')\n\tE2 = {}\n\nif (typeof(module) !== 'undefined') {\n\tvar EventEmitter = require('events').EventEmitter\n}\n\nvar URL_DATA = '/data/'\nvar URL_GRAPHS = '/graph/'\nvar URL_GRAPH_FILES = URL_DATA+'graph/'\n\n// disable DPDB (device database) fetching for WebVR boilerplate because\n// the list in the device database doesn't have Samsung S6 on the list.\nif (typeof(window) !== 'undefined') {\n\twindow.E2 = E2 // global scope so plugins can access it\n\n\twindow.WebVRConfig = window.WebVRConfig || {}\n\twindow.WebVRConfig.NO_DPDB_FETCH = true\n\t//window.WebVRConfig.ENABLE_DEPRECATED_API = true\n\t// These can be used to force VR on desktop\n\t//window.WebVRConfig.FORCE_ENABLE_VR = true\n\t//window.WebVRConfig.FORCE_DISTORTION = true\n}\n\nE2.app = null;\nE2.ui = null;\t// app sets this to a VizorUI instance\nE2.dom = {};\nE2.plugins = {};\nE2.slot_type = { input: 0, output: 1 };\nE2.erase_color = '#ff3b3b';\nE2.COLOR_COMPATIBLE_SLOT = '#080';\n\nE2.WORLD_PATCHES = [\n\t'entity', 'threesixty_photo_entity',\n\t'entity_component'\n]\n\nE2.GRAPH_NODES = [\n\t'graph', 'loop',\n\t'array_function', 'spawner'\n].concat(E2.WORLD_PATCHES)\n\nE2.LOADING_NODES = {\n\t'three_loader_model': 'model',\n\t'three_loader_scene': 'scene',\n\t'url_texture_generator': 'texture',\n\t'url_cubemap_generator': 'image',\n\t'url_stereo_cubemap_generator': 'image',\n\t'url_stereo_latlongmap_generator': 'image',\n\t'url_audio_buffer_generator': 'audiobuffer',\n\t'url_video_generator': 'video',\n\t'url_audio_generator': 'audio',\n\t'url_json_generator': 'json',\n}\n\nE2.dt = {\n\tFLOAT: { id: 0, name: 'Float' },\n\tSHADER: { id: 1, name: 'Shader' },\n\tTEXTURE: { id: 2, name: 'Texture' },\n\tCOLOR: { id: 3, name: 'Color' },\n\tMATRIX: { id: 4, name: 'Matrix' },\n\tVECTOR: { id: 5, name: 'Vector' },\n\tCAMERA: { id: 6, name: 'Camera' },\n\tBOOL: { id: 7, name: 'Boolean' },\n\tANY: { id: 8, name: 'Arbitrary' },\n\tMESH: { id: 9, name: 'Mesh' },\n\tAUDIO: { id: 10, name: 'Audio' },\n\tSCENE: { id: 11, name: 'Scene' },\n\tMATERIAL: { id: 12, name: 'Material' },\n\tLIGHT: { id: 13, name: 'Light' },\n\tDELEGATE: { id: 14, name: 'Delegate' },\n\tTEXT: { id: 15, name: 'Text' },\n\tVIDEO: { id: 16, name: 'Video' },\n\tARRAY: { id: 17, name: 'Typed Array' },\n\tOBJECT: { id: 18, name: 'Object' },\n\n\tGEOMETRY: { id: 19, name: 'Geometry' },\n\tQUATERNION: { id: 20, name: 'Quaternion' },\n\tOBJECT3D: { id: 21, name: 'Object3D' },\n\n\tVECTOR4: { id: 22, name: 'Vector 4' },\n\n\tENVIRONMENTSETTINGS: { id: 23, name: 'Environment Settings' },\n\n\tCUBETEXTURE: { id: 24, name: 'CubeTexture' },\n}\n\nE2.uid = function() {\n\tvar keys = 'abcdefghjkmnpqrstuvwxyz23456789ABCDEFGHJKLMNPQRSTUVWXYZ'\n\tvar uid = ''\n\tfor (var i=0; i < 12; i++) {\n\t\tuid += keys[Math.floor(Math.random() * keys.length)]\n\t}\n\treturn uid\n}\n\nfunction Delegate(delegate, dt, count) {\n\tthis.delegate = delegate;\n\tthis.dt = dt;\n\tthis.count = count;\n}\n\nfunction Core() {\n\tEventEmitter.apply(this, arguments)\n\n\tE2.core = this\n\n\tthis.datatypes = E2.dt\n\n\tthis.renderer = { // compat for old plugins\n\t\tmatrix_identity: new THREE.Matrix4().identity(),\n\t\tvector_origin: new THREE.Vector3(),\n\t\tmaterial_default: new THREE.MeshBasicMaterial(),\n\t\tcolor_white: new THREE.Color(0xffffff),\n\t\tcolor_black: new THREE.Color(0x000000),\n\t\tblend_mode: {\n\t\t\tNORMAL: 1\n\t\t}\n\t}\n\n\tthis._listeners = {};\n\n\tthis.runtimeEvents = new EventEmitter()\n\n\tthis.assetLoader = new AssetLoader()\n\n\t// relay events from AssetLoader\n\tthis.assetLoader.on('progress', function(pct) {\n\t\tif (pct % 10 === 0)\n\t\t\tconsole.log('core progress', pct)\n\t\tE2.core.emit('progress', pct)\n\t})\n\n\tthis.webVRAdapter = new VizorWebVRAdapter()\n\n\tthis.active_graph_dirty = true;\n\n\tthis.active_graph = this.root_graph = null\n\tthis.graphs = []\n\n\tthis.abs_t = 0.0;\n\tthis.delta_t = 0.0;\n\tthis.graph_uid = this.get_uid()\n\tthis.uidCounter = 0\n\n\tthis.pluginManager = new PluginManager(this, '/plugins');\n\n\tthis.pluginManager.on('ready', function() {\n\t\tthis.onPluginsLoaded()\n\t}.bind(this))\n\n\tthis.aux_scripts = {};\n\tthis.aux_styles = {};\n\tthis.resolve_dt = []; // Table for easy reverse lookup of dt reference by id.\n\tthis.audioContext = null;\n\n\tfor(var i in this.datatypes) {\n\t\tvar dt = this.datatypes[i];\n\n\t\tthis.resolve_dt[dt.id] = dt;\n\t}\n\n\tif (Vizor.isEditor || Vizor.hasAudio)\n\t\tthis.createAudioContext()\n}\n\nCore.prototype = Object.create(EventEmitter.prototype)\n\nCore.prototype.createAudioContext = function() {\n\tif (this.audioContext)\n\t\treturn this.audioContext\n\n\t// HTML5 audio context initialisation\n\tif (window.AudioContext)\n\t\tthis.audioContext = new AudioContext()\n\telse if (window.webkitAudioContext)\n\t\tthis.audioContext = new webkitAudioContext()\n\telse\n\t\tmsg('NOTE: This host has no AudioContext support.')\n\n\treturn this.audioContext\n}\n\nCore.prototype.get_uid = function() {\n\treturn E2.uid()\n}\n\nCore.prototype.update = function(abs_t, delta_t)\n{\n\tthis.abs_t = abs_t;\n\tthis.delta_t = delta_t;\n\n\tvar updateContext = {\n\t\tabs_t: this.abs_t,\n\t\tdelta_t: this.delta_t\n\t}\n\n\tthis.root_graph.update(updateContext);\n\n\tvar dirty = this.active_graph_dirty;\n\n\tthis.active_graph_dirty = false;\n\n\treturn dirty; // Did connection state change?\n};\n\n\nCore.prototype.create_dialog = function(diag, title, w, h, done_func, open_func)\n{\n\tvar modal = bootbox.dialog({\n\t\ttitle: title,\n\t\tmessage: diag,\n\t\tbuttons: {'OK': function(){}}\n\t})\n\n\tfunction close()\n\t{\n\t\tmodal.unbind();\n\t\tmodal.remove();\n\t}\n\n\tfunction ok()\n\t{\n\t\tdone_func();\n\t\tmodal.modal('hide');\n\t}\n\n\tmodal.on('show.bs.modal', function()\n\t{\n\t\t$('.modal-dialog', modal).css('width', w + 40).addClass('patch-inspector');\n\t});\n\n\tmodal.on('shown.bs.modal', function()\n\t{\n\t\tif(open_func)\n\t\t\topen_func();\n\t});\n\n\tmodal.on('hidden.bs.modal', close);\n\tmodal.modal({ keyboard: true });\n\n\tmodal.on('keypress', function(e)\n\t{\n\t\tif(e.keyCode === 13)\n\t\t{\n\t\t\tif(e.target.nodeName !== 'TEXTAREA')\n\t\t\t\tok();\n\t\t}\n\t})\n\n\t$('button:last', modal).click(ok);\n};\n\nCore.prototype.get_default_value = function(dt) {\n\tvar dts = this.datatypes;\n\n\tif(dt === dts.FLOAT)\n\t\treturn 0.0;\n\telse if(dt === dts.COLOR)\n\t\treturn new THREE.Color(1, 1, 1, 1)\n\telse if(dt === dts.MATRIX) {\n\t\treturn new THREE.Matrix4()\n\t} else if(dt === dts.VECTOR)\n\t\treturn new THREE.Vector3(0, 0, 0)\n\telse if(dt === dts.CAMERA)\n\t\treturn new THREE.PerspectiveCamera()\n\telse if(dt === dts.BOOL)\n\t\treturn false;\n\telse if(dt === dts.TEXT)\n\t\treturn '';\n\telse if(dt === dts.ARRAY) {\n\t\tvar a = new ArrayBuffer(0);\n\t\ta.stride = a.datatype = 1; // Uint8\n\t\treturn a;\n\t} else if(dt === dts.OBJECT)\n\t\treturn {};\n\n\t// Shaders, textures, materials, scenes, light and delegates and ALL legally defaults to null.\n\treturn null;\n};\n\nCore.prototype.serialise = function() {\n\treturn JSON.stringify(this.serialiseToObject());\n};\n\nCore.prototype.serialiseToObject = function() {\n\tvar d = {};\n\n\td.abs_t = Math.round(this.abs_t * Math.pow(10, 4)) / Math.pow(10, 4);\n\td.active_graph = this.active_graph.uid;\n\td.graph_uid = this.graph_uid;\n\td.root = this.root_graph.serialise();\n\n\treturn d\n};\n\nCore.prototype.deserialiseObject = function(d) {\n\tthis.abs_t = d.abs_t;\n\tthis.delta_t = 0.0;\n\tthis.graph_uid = '' + d.graph_uid;\n\n\tthis.active_graph.destroy_ui()\n\n\tthis.graphs = [];\n\n\tthis.root_graph = new Graph(this, null, null);\n\tthis.root_graph.deserialise(d.root);\n\tthis.graphs.push(this.root_graph);\n\n\tthis.root_graph.patch_up(this.graphs);\n\tthis.root_graph.initialise(this.graphs);\n\n\tthis.active_graph = resolve_graph(this.graphs, ''+d.active_graph);\n\n\tif(!this.active_graph) {\n\t\tmsg('ERROR: The active graph (ID: ' + d.active_graph + ') is invalid. Using the root graph.');\n\t\tthis.active_graph = this.root_graph;\n\t}\n\n\treturn this.root_graph\n}\n\nCore.prototype.deserialise = function(str) {\n\treturn this.deserialiseObject(JSON.parse(str))\n}\n\nCore.prototype.rebuild_structure_tree = function() {\n\tfunction build(graph, name) {\n\t\tvar nodes = graph.nodes;\n\n\t\tif (graph.parent_graph) {\n\t\t\tvar ptn = graph.parent_graph.tree_node;\n\t\t\tvar tnode = new TreeNode(ptn.tree, ptn, name, graph);\n\n\t\t\tptn.children.push(tnode);\n\t\t}\n\n\t\tfor(var i = 0, len = nodes.length; i < len; i++) {\n\t\t\tvar n = nodes[i];\n\n\t\t\tif(n.plugin.isGraph)\n\t\t\t\tbuild(n.plugin.graph, n.get_disp_name());\n\t\t}\n\t}\n\n\tif (!E2.dom.structure)\n\t\treturn;\n\n\tE2.dom.structure.tree.reset();\n\tthis.root_graph.tree_node = E2.dom.structure.tree.root;\n\tE2.dom.structure.tree.root.graph = this.root_graph;\n\tbuild(this.root_graph, 'Root');\n\tE2.dom.structure.tree.root.rebuild_dom();\n};\n\nCore.prototype.add_aux_script = function(script_url, onload) {\n\tvar that = this\n\tvar dfd = when.defer()\n\n\tif (this.aux_scripts.hasOwnProperty(script_url)) {\n\t\tif (onload)\n\t\t\tonload()\n\n\t\tdfd.resolve()\n\t} else {\n\t\tE2.util.loadScript('/plugins/' + script_url, function() {\n\t\t\tthat.aux_scripts[script_url] = true\n\n\t\t\tif (onload)\n\t\t\t\tonload()\n\n\t\t\tdfd.resolve()\n\t\t}, function(err) {\n\t\t\tdfd.reject(err)\n\t\t})\n\t}\n\n\treturn dfd.promise\n};\n\nCore.prototype.add_aux_style = function(style_url) {\n\tif(this.aux_styles.hasOwnProperty(style_url))\n\t\treturn;\n\n\tload_style('/plugins/' + style_url);\n\tthis.aux_styles[style_url] = true;\n}\n\nCore.prototype.onPluginsLoaded = function() {\n\tthis.emit('ready');\n}\n\nif (typeof(module) !== 'undefined') {\n\tmodule.exports = Core\n\tmodule.exports.E2 = E2\n}\n"
  },
  {
    "path": "browser/scripts/datatypes/environmentSettings.js",
    "content": "E2.EnvironmentSettings = function() {\n\tthis.fog = new THREE.Fog()\n\n\tthis.fog.near = 10000\n\tthis.fog.far = 10000\n\tthis.fog.color = new THREE.Color(0x000000)\n}"
  },
  {
    "path": "browser/scripts/documentation/pluginDocsCache.js",
    "content": "function PluginDocsCache() {\n\tthis.cache = {}\n}\n\nfunction PluginDocsLoader(plugin) {\n\tvar url = '/docs/plugins/' + plugin\n\n\tvar xhr = new XMLHttpRequest()\n\txhr.open('GET', url, true)\n\txhr.crossOrigin = 'Anonymous'\n\txhr.responseType = 'text'\n\n\tvar that = this\n\n\txhr.onerror = function() {\n\t\tthat.errorHandler(new Error(this.status))\n\t}\n\n\txhr.onload = function() {\n\t\tif (this.status >= 400)\n\t\t\treturn this.onerror()\n\n\t\tthat.emit('loaded', JSON.parse(this.responseText))\n\t}\n\n\txhr.send()\n}\n\nPluginDocsLoader.prototype = Object.create(E2.Loader.prototype)\n\nPluginDocsCache.prototype.loadDocs = function(plugin) {\n\tvar dfd = when.defer()\n\n\tif (this.cache[plugin]) {\n\t\tdfd.resolve(this.cache[plugin])\n\t}\n\telse {\n\t\tvar loader = new PluginDocsLoader(plugin)\n\n\t\tvar that = this\n\n\t\tloader\n\t\t.on('loaded', function(data) {\n\t\t\tthat.cache[plugin] = data\n\n\t\t\tdfd.resolve(data)\n\t\t})\n\t\t.on('error', function(err) {\n\t\t\tmsg('Plugin docs loading failed for', plugin, err)\n\t\t\tdfd.reject(err)\n\t\t})\n\n\t}\n\n\treturn dfd.promise\n}\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = PluginDocsCache\n"
  },
  {
    "path": "browser/scripts/draggable.js",
    "content": "function draggable_mouseup(data) { return function(e)\n{\n\tdocument.removeEventListener('mouseup', data.mouseup);\n\tdocument.removeEventListener('mousemove', data.mousemove);\n\tdocument.removeEventListener('touchend', data.mouseup);\n\tdocument.removeEventListener('touchmove', data.mousemove);\n\tdata.stop(e);\n\t\n\tif(e.stopPropagation) e.stopPropagation();\n\tif(e.preventDefault) e.preventDefault();\n\treturn false;\n};}\n\nfunction draggable_mousemove(data) { return function(e)\n{\n\tvar t = (e.changedTouches) ? e.changedTouches[0] : e;\n\n\tvar ui = data.ui[0];\n\tvar nx = data.oleft + t.pageX - data.ox;\n\tvar ny = data.otop + t.pageY - data.oy;\n\tvar cp = E2.dom.canvas_parent;\n\tvar co = cp.offset();\n\t\n\tif(t.pageX < co.left)\n\t{\t\n\t\tcp.scrollLeft(cp.scrollLeft() - 20); \n\t\tnx -= 20;\n\t}\n\telse if(t.pageX > co.left + cp.width())\n\t{\t\n\t\tcp.scrollLeft(cp.scrollLeft() + 20); \n\t\tnx += 20;\n\t}\n\t\n\tif(t.pageY < co.top)\n\t{\n\t\tcp.scrollTop(cp.scrollTop() - 20);\n\t\tny -= 20;\n\t}\n\telse if(t.pageY > co.top + cp.height())\n\t{\n\t\tcp.scrollTop(cp.scrollTop() + 20);\n\t\tny += 20;\n\t}\n\n\tnx = nx < 0 ? 0 : nx;\n\tny = ny < 0 ? 0 : ny;\n\t\n\tui.style.left = nx + 'px';\n\tui.style.top = ny + 'px';\n\t\n\tdata.oleft = nx;\n\tdata.otop = ny;\n\tdata.ox = t.pageX;\n\tdata.oy = t.pageY;\n\t\n\tdata.drag(e);\n\t\n\tif(e.stopPropagation) e.stopPropagation();\n\tif(e.preventDefault) e.preventDefault();\n\treturn false;\n};}\n\nfunction draggable_mousedown(ui, drag, stop) { return function(e)\n{\n\tif(!$(e.target).hasClass('t'))\n\t\treturn true;\n\tvar data = \n\t{ \n\t\tui: ui,\n\t\toleft: parseInt(ui[0].style.left) || 0,\n\t\totop: parseInt(ui[0].style.top) || 0,\n\t\tox: e.pageX || e.screenX,\n\t\toy: e.pageY || e.screenY,\n\t\tdrag: drag,\n\t\tstop: stop\n\t};\n\n\tdata.mouseup = draggable_mouseup(data);\n\tdata.mousemove = draggable_mousemove(data);\n\tdocument.addEventListener('mouseup', data.mouseup);\n\tdocument.addEventListener('mousemove', data.mousemove);\n\tdocument.addEventListener('touchend', data.mouseup);\n\tdocument.addEventListener('touchmove', data.mousemove);\n\n\tif(document.activeElement)\n\t\t\tdocument.activeElement.blur();\n\tif(e.stopPropagation) e.stopPropagation();\n\tif(e.preventDefault) e.preventDefault();\n\treturn false;\n};}\n\nfunction make_draggable(ui, drag, stop, attachOnElement)\n{\n\tattachOnElement = attachOnElement[0] || ui[0]\n\tattachOnElement.addEventListener('mousedown', draggable_mousedown(ui, drag, stop));\n\tattachOnElement.addEventListener('touchstart', draggable_mousedown(ui, drag, stop));\n}\n\n"
  },
  {
    "path": "browser/scripts/editConnection.js",
    "content": "function EditConnection(graphApi, connection, sdiv, ddiv) {\n\tthis.offset = 0\n\tthis.graphApi = graphApi\n\tthis.srcNode = connection.src_node\n\tthis.srcSlot = connection.src_slot\n\tthis.srcSlotDiv = sdiv\n\tthis.dstNode = connection.dst_node\n\tthis.dstSlot = connection.dst_slot\n\tthis.dstSlotDiv = ddiv\n\tthis.connection = connection\n\tthis.rightToLeft = !!this.dstNode && !this.srcNode\n\n\tvar c = this.connection\n\tthis.ui = c.ui ? c.ui : c.create_ui()\n}\n\nEditConnection.prototype.hoverSlot = function(node, slot) {\n\tvar can = this.canConnectTo(node, slot)\n\n\tif (!can)\n\t\treturn false\n\n\tif (this.rightToLeft) {\n\t\tthis.srcNode = node\n\t\tthis.srcSlot = slot\n\t} else {\n\t\tthis.dstNode = node\n\t\tthis.dstSlot = slot\n\t}\n\n\treturn can\n}\n\nEditConnection.prototype.blurSlot = function(slot) {\n\tif (this.rightToLeft) {\n\t\tif (slot === this.dstSlot)\n\t\t\treturn\n\n\t\tthis.srcNode = null\n\t\tthis.srcSlot = null\n\t} else {\n\t\tif (slot === this.srcSlot)\n\t\t\treturn\n\n\t\tthis.dstNode = null\n\t\tthis.dstSlot = null\n\t}\n}\n\nEditConnection.prototype.destroy_ui = function() {\n\tthis.connection.destroy_ui()\n}\n\nEditConnection.prototype.canConnectTo = function(node, slot) {\n\tvar adt = slot.dt.id, bdt\n\tvar otherSlot\n\tvar rtl = this.rightToLeft\n\tvar anyDt = E2.dt.ANY.id\n\n\tif (rtl) {\n\t\tbdt = this.dstSlot.dt.id\n\t\totherSlot = this.dstSlot\n\t} else {\n\t\tbdt = this.srcSlot.dt.id\n\t\totherSlot = this.srcSlot\n\t}\n\n\t// Only allow connection if datatypes match and slot is unconnected. \n\t// Don't allow self-connections. There is no complete check for cyclic \n\t// redundacies, though we should probably institute one.\n\tvar a = (adt === bdt || adt === anyDt || bdt === anyDt)\n\n\t// don't allow connections between two ANY slots.\n\tvar b = !(adt === anyDt && bdt === anyDt)\n\t\n\t// dest to source, and source is slot and dest isn't slot\n\tvar c = (rtl &&\n\t\t\t\t(!this.srcSlot || this.srcSlot === slot) &&\n\t\t\t\tthis.dstNode !== node) ||\n\t\t\t(!rtl && \n\t\t\t\t(!this.dstSlot || this.dstSlot === slot) &&\n\t\t\t\tthis.srcNode !== node)\n\n\t// don't allow connections from output to output\n\tvar d = slot.type !== otherSlot.type\n\n\tvar can = a && b && c && d\n\n\tif (can) {\n\t\tthis._lastMatch = [node, slot]\n\t} else {\n\t\tthis._lastMatch = []\n\t}\n\n\treturn can\n}\n\nEditConnection.prototype.isValid = function() {\n\treturn this.canConnectTo(this._lastMatch[0], this._lastMatch[1])\n}\n\nEditConnection.prototype.isConnectable = function() {\n\treturn this.srcNode && this.srcSlot && this.dstNode && this.dstSlot\n}\n\nEditConnection.prototype.commit = function() {\n\tvar disconnected = false \n\n\tif (this.isConnectable() && this.connection.src_slot === this.srcSlot &&\n\t\tthis.connection.dst_slot === this.dstSlot) \n\t\treturn; \n\n\t// connection changed or removed?\n\tif (this.connection.src_slot && this.connection.dst_slot &&\n\t\t(this.srcSlot !== this.connection.src_slot || this.dstSlot !== this.connection.dst_slot)) {\n\t\tthis.graphApi.disconnect(E2.core.active_graph, this.connection)\n\t\tdisconnected = true\n\t}\n\n\tif (!this.isConnectable()) {\n\t\tif (disconnected)\n\t\t\tE2.app.onLocalConnectionChanged(this.connection)\n\t\treturn;\n\t}\n\n\tE2.app.undoManager.begin('Connection')\n\n\t// replace existing connection\n\tif (this.dstSlot.is_connected && this.dstNode.getSlotConnections(this.dstSlot).length) {\n\t\tthis.graphApi.disconnect(E2.core.active_graph, \n\t\t\tthis.dstNode.getSlotConnections(this.dstSlot)[0])\n\t}\n\n\tthis.connection.src_node = this.srcNode\n\tthis.connection.dst_node = this.dstNode\n\tthis.connection.src_slot = this.srcSlot\n\tthis.connection.dst_slot = this.dstSlot\n\tthis.connection.uid = E2.uid()\n\n\tthis.graphApi.connect(\n\t\tE2.core.active_graph,\n\t\tConnection.hydrate(E2.core.active_graph, this.connection.serialise()))\n\n\tE2.app.undoManager.end('Connection')\n\n\tE2.app.onLocalConnectionChanged(this.connection)\n}\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = EditConnection\n"
  },
  {
    "path": "browser/scripts/editorChannel.js",
    "content": "(function() {\n\nvar RECONNECT_INTERVAL = 5 * 1000\nvar KEEPALIVE_INTERVAL = 10 * 1000\n\nfunction hydrate(pl) {\n\tvar m = _.clone(pl)\n\tswitch(m.actionType) {\n\t\tcase 'uiNodeAdded':\n\t\t\tm.node = Node.hydrate(pl.graphUid, pl.node)\n\t\t\tbreak;\n\t\tcase 'uiConnected':\n\t\t\tm.connection = Connection.hydrate(Graph.lookup(pl.graphUid), pl.connection)\n\t\t\tbreak;\n\t}\n\n\treturn m;\n}\n\nfunction dehydrate(m) {\n\tvar pl = _.clone(m)\n\n\tswitch(m.actionType) {\n\t\tcase 'uiNodeAdded':\n\t\t\tpl.node = m.node.serialise()\n\t\t\tbreak;\n\t\tcase 'uiConnected':\n\t\t\tpl.connection = m.connection.serialise()\n\t\t\tbreak;\n\t}\n\n\treturn pl;\n}\n\nfunction isEditAction(m) {\n\tswitch(m.actionType) {\n\t\tcase 'graphSnapshotted':\n\t\tcase 'uiNodeAdded':\n\t\tcase 'uiNodeRemoved':\n\t\tcase 'uiNodeRenamed':\n\t\tcase 'uiSlotAdded':\n\t\tcase 'uiSlotRemoved':\n\t\tcase 'uiNodeOpenStateChanged':\n\t\tcase 'uiNodesMoved':\n\t\tcase 'uiConnected':\n\t\tcase 'uiDisconnected':\n\t\tcase 'uiGraphTreeReordered':\n\t\tcase 'uiPluginTransientStateChanged':\n\t\tcase 'uiPluginStateChanged':\n\t\tcase 'uiSlotValueChanged':\n\t\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nfunction isAcceptedDispatch(m) {\n\tif (isEditAction(m))\n\t\treturn true;\n\n\tswitch(m.actionType) {\n\t\tcase 'uiMouseMoved':\n\t\tcase 'uiMouseClicked':\n\t\tcase 'uiUserIdFollowed':\n\t\tcase 'uiUserIdUnfollowed':\n\t\tcase 'uiActiveGraphChanged':\n\t\t\treturn true;\n\t}\n\n\t// console.warn('NOT ACCEPTED:', m)\n\n\treturn false;\n}\n\nfunction EditorChannel(dispatcher) {\n\tEventEmitter.call(this)\n\n\tthis.isOnChannel = false\n\tthis.lastEditSeen = null\n\n\tthis.queue = []\n\n\tthis._dispatcher = dispatcher || E2.app.dispatcher\n\n\tthis._messageHandlerBound = this._messageHandler.bind(this)\n\n\t// send local dispatches to network\n\tthis._dispatcher.register(this._localDispatchHandler.bind(this))\n}\n\nEditorChannel.prototype = Object.create(EventEmitter.prototype)\n\nEditorChannel.prototype.close = function() {\n\tthis.wsChannel.close()\n}\n\nEditorChannel.prototype.getWsChannel = function() {\n\treturn this.wsChannel\n}\n\nvar reconnecting = false\nEditorChannel.prototype.connect = function(wsUrl, options) {\n\tvar that = this\n\n\tthis.kicked = false\n\tthis.connected = false\n\tthis.forking = false\n\n\tthis.reconnectFn = this.connect.bind(this, wsUrl, options)\n\n\tE2.models.user.once('change', this.onLoginChanged.bind(this))\n\n\t// listen to messages from network\n\tthis.wsChannel = new WebSocketChannel()\n\tthis.wsChannel\n\t\t.connect(wsUrl, options)\n\t\t.once('disconnected', function() {\n\t\t\tif (!that.connected && !reconnecting)\n\t\t\t\treturn;\n\n\t\t\tthat.isOnChannel = false\n\t\t\tthat.connected = false\n\n\t\t\tif (that.kicked === true)\n\t\t\t\treturn that.emit('disconnected')\n\n\t\t\tif (!reconnecting)\n\t\t\t\tE2.app.growl('Disconnected from server. Reconnecting.', 'reconnecting')\n\n\t\t\treconnecting = true\n\n\t\t\tsetTimeout(that.reconnectFn, RECONNECT_INTERVAL)\n\t\t\tthat.pingInterval = clearInterval(that.pingInterval)\n\n\t\t\tthat.emit('disconnected')\n\t\t})\n\t\t.once('ready', function(uid) {\n\t\t\tconsole.log('EditorChannel ready', uid)\n\t\t\tthat.uid = uid\n\n\t\t\tthat.connected = true\n\n\t\t\tthat.pingInterval = setInterval(function() {\n\t\t\t\tthat.sendPayload({\n\t\t\t\t\tchannel: '__internal',\n\t\t\t\t\tactionType: '__ping'\n\t\t\t\t})\n\t\t\t}, KEEPALIVE_INTERVAL)\n\n\t\t\tif (reconnecting) {\n\t\t\t\treconnecting = false\n\t\t\t\tE2.app.growl('Reconnected to server!', 'reconnected')\n\t\t\t\tthat.emit('reconnected')\n\t\t\t}\n\n\t\t\tthat.emit('ready', uid)\n\n\t\t\tthat.wsChannel.on('message', function(m) {\n\t\t\t\tif (m.kind === 'kicked') { // kicked by server\n\t\t\t\t\tE2.app.growl('You have been disconnected by the server: '+ m.reason, 'disconnected', 30000)\n\t\t\t\t\tthat.kicked = true\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (m.kind === 'ack') // acknowledgement by id\n\t\t\t\t\tthat.emit(m.ack, m)\n\n\t\t\t\tif (m.channel !== that.channelName)\n\t\t\t\t\treturn;\n\n\t\t\t\tthat.emit(m.kind, m)\n\t\t\t})\n\n\t\t\tthat.processQueue()\n\t\t})\n\n\treturn this\n}\n\nEditorChannel.prototype.onLoginChanged = function() {\n\tvar that = this\n\tthis.emit('disconnected')\n\tthis.isOnChannel = false\n\tthis.connected = false\n\tthis.close()\n\tthis.wsChannel.once('disconnected', function() {\n\t\tthat.reconnectFn()\n\t})\n}\n\nEditorChannel.prototype.snapshot = function() {\n\tvar graphSer = E2.core.serialise()\n\n\tE2.app.snapshotPending = false\n\n\tthis.send({\n\t\tactionType: 'graphSnapshotted',\n\t\tdata: graphSer\n\t})\n}\n\n/**\n * send local dispatches to network\n * FORK if an important edit (create a new channel with copy)\n */\nEditorChannel.prototype._localDispatchHandler = function _localDispatchHandler(payload) {\n\tif (payload.from)\n\t\treturn\n\n\tif (this.isOnChannel)\n\t\treturn this.send(payload)\n\n\t// not on channel -- fork if important\n\tif (!isEditAction(payload)) // eg. mouseMove\n\t\treturn\n\n\tthis.fork(payload)\n}\n\nEditorChannel.prototype.queuePayload = function(payload) {\n\tthis.queue.push(dehydrate(payload))\n}\n\nEditorChannel.prototype.fork = function(payload) {\n\tvar that = this\n\n\tif (this.forking)\n\t\treturn this.queuePayload(payload)\n\n\tthis.forking = true\n\n\tE2.ui.updateProgressBar(65)\n\n\t// FORK\n\tvar fc = new ForkCommand()\n\tfc.fork()\n\t\t.then(function() {\n\t\t\tE2.ui.updateProgressBar(100)\n\t\t\tE2.app.growl(\"We've made a copy of this for you to edit.\", 'copy', 5000)\n\t\t})\n\t\t.catch(function(err) {\n\t\t\tE2.app.growl('Error while forking: ' + err, 'error')\n\t\t\tthrow err\n\t\t})\n\t\t.finally(function() {\n\t\t\tthat.forking = false\n\n\t\t\t// handle queue formed while forking by\n\t\t\t// redispatching inside application\n\t\t\tvar forkQueue = that.queue.slice()\n\t\t\tthat.queue = []\n\n\t\t\twhile(forkQueue.length) {\n\t\t\t\tvar dispatch = forkQueue.shift()\n\t\t\t\t// re-dispatch queued events after snapshot\n\t\t\t\tE2.app.dispatcher.dispatch(hydrate(dispatch))\n\t\t\t}\n\n\t\t\tE2.core.emit('forked')\n\t\t})\n}\n\nEditorChannel.prototype.leave = function() {\n\tthis.wsChannel.leave(this.channelName)\n\n\tE2.track({\n\t\tevent: 'leftChannel',\n\t\tchannelName: this.channelName\n\t})\n\n\tthis.wsChannel.removeListener(this.channelName, this._messageHandlerBound)\n\n\tthis.isOnChannel = false\n\tthis.lastEditSeen = null\n\tthis.channelName = null\n\n\tthis.emit('leave', { id: this.uid })\n}\n\nEditorChannel.prototype._messageHandler = function _messageHandler(payload) {\n\tif (!isAcceptedDispatch(payload))\n\t\treturn;\n\n\tif (isEditAction(payload))\n\t\tthis.lastEditSeen = payload.id\n\n\tif (payload.from === this.uid)\n\t\treturn;\n\n\tthis._dispatcher.dispatch(hydrate(payload))\n}\n\nEditorChannel.prototype.join = function(channelName, readableName, cb) {\n\tvar that = this\n\n\tif (this.channelName && this.channelName !== channelName) {\n\t\tthis.leave()\n\t}\n\n\tthis.channelName = channelName\n\n\tvar joinMessage = {\n\t\tkind: 'join',\n\t\tchannel: channelName,\n\t\treadableName: readableName,\n\t\tactiveGraphUid: E2.core.active_graph.uid,\n\t\tlastEditSeen: this.lastEditSeen\n\t}\n\n\tthis.wsChannel.ws.send(JSON.stringify(joinMessage))\n\n\tfunction waitForOwnJoin(pl) {\n\t\tif (pl.kind === 'youJoined' && pl.channel === channelName) {\n\t\t\tthat.wsChannel.removeListener(channelName, waitForOwnJoin)\n\n\t\t\tE2.track({\n\t\t\t\tevent: 'joinedChannel',\n\t\t\t\tchannelName: this.channelName\n\t\t\t})\n\n\t\t\tthat.isOnChannel = true\n\n\t\t\tif (cb)\n\t\t\t\tcb()\n\t\t}\n\t}\n\n\tthis.wsChannel.on(channelName, waitForOwnJoin)\n\tthis.wsChannel.on(channelName, this._messageHandlerBound)\n}\n\nEditorChannel.prototype.canSend = function() {\n\treturn !this.forking && this.connected\n}\n\nEditorChannel.prototype.send = function(payload) {\n\tif (!isAcceptedDispatch(payload))\n\t\treturn;\n\n\tif (E2.app.snapshotPending && isEditAction(payload))\n\t\treturn this.snapshot()\n\n\tif (this.canSend() && !this.queue.length)\n\t\treturn this.sendPayload(payload)\n\n\tthis.queuePayload(payload)\n\n\tthis.processQueue()\n}\n\nEditorChannel.prototype.sendPayload = function(payload) {\n\tthis.wsChannel.send(\n\t\tpayload.channel === 'Global' ? payload.channel : this.channelName,\n\t\tdehydrate(payload))\n}\n\nEditorChannel.prototype.processQueue = function() {\n\tif (!this.canSend() || !this.queue.length)\n\t\treturn;\n\n\tvar payload = this.queue.shift()\n\n\tthis.wsChannel.send(\n\t\tpayload.channel === 'Global' ? payload.channel : this.channelName,\n\t\tpayload)\n\n\tthis.processQueue()\n}\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = EditorChannel\nelse\n\tE2.EditorChannel = EditorChannel\n\n})();\n"
  },
  {
    "path": "browser/scripts/embed.js",
    "content": "// each one of these will target its own iframe\n// <iframe src=\"/embed/eesn/flamingofront?autoplay=true&noheader=true\" width=\"800\" height=\"450\" frameborder=\"0\" allowfullscreen></iframe>\n(function(){\n\n\tvar iframeWindow = {}, iframeElement = {}\n\n\tvar getId = function() {\n\t\tvar t = (new Date()).getTime()\n\t\twhile ((new Date()).getTime() === t) {}\n\t\treturn t\n\t}\n\tvar _id = '_v_' + getId()\n\n\tvar getMyRef = function() {\t// where in the document are we\n\t\tvar spanId = _id + 's'\n\t\tdocument.write('<span id=\"' + spanId + '\"></span>')\n\t\tvar span = document.getElementById(spanId)\n\t\tvar script = span.previousElementSibling\n\t\tif (script)\n\t\t\tscript.parentNode.removeChild(span)\n\t\treturn script\n\t}\n\t\n\tvar script = getMyRef()\n\tif (!script) {\n\t\tconsole.error('could not find myself')\n\t\treturn\n\t}\n\n\tvar url = ''\n\tvar u = script.attributes.getNamedItem('data-vizorurl')\n\tif (u) {\n\t\turl = u.value\n\t\tif (!url)\n\t\t\treturn console.error('could not find URL from data-vizorurl')\n\t}\n\telse\n\t\treturn console.error('could not find data-vizorurl')\n\n\t// by here we have our script node and its data-url in url\n\n\tvar n = script.parentNode, r = n.getBoundingClientRect()\n\tvar aspect = 16 / 9\n\tvar desiredAspect = script.attributes.getNamedItem('data-aspect')\n\tif (desiredAspect) {\n\t\tdesiredAspect = parseFloat(desiredAspect.value)\n\t\tif (!isNaN(desiredAspect))\n\t\t\taspect = desiredAspect\n\t}\n\n\tvar iframeWidth = r.width * 0.995\n\tvar iframeHeight = iframeWidth / aspect\n\tvar iframeId = _id + 'i'\n\n\n\twindow.addEventListener('orientationchange', function() {\n\t\tiframeWindow.postMessage({\n\t\t\ttype: 'orientationchange',\n\t\t\torientation: window.orientation\n\t\t}, '*')\n\t\treturn true\n    }, false)\n\n\tvar resizeIframe = function() {\n\t\tvar d = iframeElement.style.display\n\t\tiframeElement.style.display = 'none'\n\t\tvar currentWidth = iframeElement.parentNode.getBoundingClientRect().width * 0.995\n\t\tif (currentWidth !== iframeWidth) {\n\t\t\tiframeWidth = currentWidth\n\t\t\tiframeHeight = iframeWidth / aspect\n\t\t\tiframeElement.width = iframeWidth\n\t\t\tiframeElement.height = iframeHeight\n\t\t}\n\t\tiframeElement.style.display = d\n\t\treturn true\n\t}\n\n\tdocument.write('<iframe id=\"'+iframeId+'\" src=\"'+url+\n\t\t'\" width=\"'+ iframeWidth +'\" height=\"' + iframeHeight +\n\t\t'\" frameborder=\"0\" style=\"box-sizing:border-box;\" allowfullscreen allowvr></iframe>')\n\n\tiframeElement = document.getElementById(iframeId)\n\tiframeWindow = document.getElementById(iframeId).contentWindow\n\n\tresizeIframe()\n\t\n\t// fix resizing issues with android\n\t// android issues orientationchange->resize, ios issues resize->orientationchange\n\twindow.addEventListener('orientationchange', function(){\n\t\tsetTimeout(resizeIframe, 500)\n\t}, true)\n\twindow.addEventListener('resize', resizeIframe)\n\twindow.addEventListener('devicemotion', function(deviceMotion) {\n\t\tvar evtData = {\n\t\t\taccelerationIncludingGravity: {\n\t\t\t\tx: deviceMotion.accelerationIncludingGravity.x,\n\t\t\t\ty: deviceMotion.accelerationIncludingGravity.y,\n\t\t\t\tz: deviceMotion.accelerationIncludingGravity.z\n\t\t\t},\n\t\t\trotationRate: {\n\t\t\t\talpha: deviceMotion.rotationRate.alpha,\n\t\t\t\tbeta: deviceMotion.rotationRate.beta,\n\t\t\t\tgamma: deviceMotion.rotationRate.gamma\n\t\t\t},\n\t\t\ttimeStamp: deviceMotion.timeStamp\n\t\t}\n\t\tiframeWindow.postMessage({\n\t\t\tdevicemotion: evtData,\n\t\t\tdeviceMotionEvent: evtData,\n\t\t\ttype: 'devicemotion'\n\t\t}, '*')\n\t}, false)\n\n\t// log us\n\twindow._v_urls = window._v_urls || []\n\twindow._v_urls.push(url)\n\n\twindow.addEventListener('load', resizeIframe)\n})()"
  },
  {
    "path": "browser/scripts/event-emitter.js",
    "content": "/*!\n * EventEmitter v4.2.11 - git.io/ee\n * Unlicense - http://unlicense.org/\n * Oliver Caldwell - http://oli.me.uk/\n * @preserve\n */\n\n;(function () {\n    'use strict';\n\n    /**\n     * Class for managing events.\n     * Can be extended to provide event functionality in other classes.\n     *\n     * @class EventEmitter Manages event registering and emitting.\n     */\n    function EventEmitter() {}\n\n    // Shortcuts to improve speed and size\n    var proto = EventEmitter.prototype;\n    var exports = this;\n    var originalGlobalValue = exports.EventEmitter;\n\n    /**\n     * Finds the index of the listener for the event in its storage array.\n     *\n     * @param {Function[]} listeners Array of listeners to search through.\n     * @param {Function} listener Method to look for.\n     * @return {Number} Index of the specified listener, -1 if not found\n     * @api private\n     */\n    function indexOfListener(listeners, listener) {\n        var i = listeners.length;\n        while (i--) {\n            if (listeners[i].listener === listener) {\n                return i;\n            }\n        }\n\n        return -1;\n    }\n\n    /**\n     * Alias a method while keeping the context correct, to allow for overwriting of target method.\n     *\n     * @param {String} name The name of the target method.\n     * @return {Function} The aliased method\n     * @api private\n     */\n    function alias(name) {\n        return function aliasClosure() {\n            return this[name].apply(this, arguments);\n        };\n    }\n\n    /**\n     * Returns the listener array for the specified event.\n     * Will initialise the event object and listener arrays if required.\n     * Will return an object if you use a regex search. The object contains keys for each matched event. So /ba[rz]/ might return an object containing bar and baz. But only if you have either defined them with defineEvent or added some listeners to them.\n     * Each property in the object response is an array of listener functions.\n     *\n     * @param {String|RegExp} evt Name of the event to return the listeners from.\n     * @return {Function[]|Object} All listener functions for the event.\n     */\n    proto.getListeners = function getListeners(evt) {\n        var events = this._getEvents();\n        var response;\n        var key;\n\n        // Return a concatenated array of all matching events if\n        // the selector is a regular expression.\n        if (evt instanceof RegExp) {\n            response = {};\n            for (key in events) {\n                if (events.hasOwnProperty(key) && evt.test(key)) {\n                    response[key] = events[key];\n                }\n            }\n        }\n        else {\n            response = events[evt] || (events[evt] = []);\n        }\n\n        return response;\n    };\n\n    /**\n     * Takes a list of listener objects and flattens it into a list of listener functions.\n     *\n     * @param {Object[]} listeners Raw listener objects.\n     * @return {Function[]} Just the listener functions.\n     */\n    proto.flattenListeners = function flattenListeners(listeners) {\n        var flatListeners = [];\n        var i;\n\n        for (i = 0; i < listeners.length; i += 1) {\n            flatListeners.push(listeners[i].listener);\n        }\n\n        return flatListeners;\n    };\n\n    /**\n     * Fetches the requested listeners via getListeners but will always return the results inside an object. This is mainly for internal use but others may find it useful.\n     *\n     * @param {String|RegExp} evt Name of the event to return the listeners from.\n     * @return {Object} All listener functions for an event in an object.\n     */\n    proto.getListenersAsObject = function getListenersAsObject(evt) {\n        var listeners = this.getListeners(evt);\n        var response;\n\n        if (listeners instanceof Array) {\n            response = {};\n            response[evt] = listeners;\n        }\n\n        return response || listeners;\n    };\n\n    /**\n     * Adds a listener function to the specified event.\n     * The listener will not be added if it is a duplicate.\n     * If the listener returns true then it will be removed after it is called.\n     * If you pass a regular expression as the event name then the listener will be added to all events that match it.\n     *\n     * @param {String|RegExp} evt Name of the event to attach the listener to.\n     * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling.\n     * @return {Object} Current instance of EventEmitter for chaining.\n     */\n    proto.addListener = function addListener(evt, listener) {\n        var listeners = this.getListenersAsObject(evt);\n        var listenerIsWrapped = typeof listener === 'object';\n        var key;\n\n        for (key in listeners) {\n            if (listeners.hasOwnProperty(key) && indexOfListener(listeners[key], listener) === -1) {\n                listeners[key].push(listenerIsWrapped ? listener : {\n                    listener: listener,\n                    once: false\n                });\n            }\n        }\n\n        return this;\n    };\n\n    /**\n     * Alias of addListener\n     */\n    proto.on = alias('addListener');\n\n    /**\n     * Semi-alias of addListener. It will add a listener that will be\n     * automatically removed after its first execution.\n     *\n     * @param {String|RegExp} evt Name of the event to attach the listener to.\n     * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling.\n     * @return {Object} Current instance of EventEmitter for chaining.\n     */\n    proto.addOnceListener = function addOnceListener(evt, listener) {\n        return this.addListener(evt, {\n            listener: listener,\n            once: true\n        });\n    };\n\n    /**\n     * Alias of addOnceListener.\n     */\n    proto.once = alias('addOnceListener');\n\n    /**\n     * Defines an event name. This is required if you want to use a regex to add a listener to multiple events at once. If you don't do this then how do you expect it to know what event to add to? Should it just add to every possible match for a regex? No. That is scary and bad.\n     * You need to tell it what event names should be matched by a regex.\n     *\n     * @param {String} evt Name of the event to create.\n     * @return {Object} Current instance of EventEmitter for chaining.\n     */\n    proto.defineEvent = function defineEvent(evt) {\n        this.getListeners(evt);\n        return this;\n    };\n\n    /**\n     * Uses defineEvent to define multiple events.\n     *\n     * @param {String[]} evts An array of event names to define.\n     * @return {Object} Current instance of EventEmitter for chaining.\n     */\n    proto.defineEvents = function defineEvents(evts) {\n        for (var i = 0; i < evts.length; i += 1) {\n            this.defineEvent(evts[i]);\n        }\n        return this;\n    };\n\n    /**\n     * Removes a listener function from the specified event.\n     * When passed a regular expression as the event name, it will remove the listener from all events that match it.\n     *\n     * @param {String|RegExp} evt Name of the event to remove the listener from.\n     * @param {Function} listener Method to remove from the event.\n     * @return {Object} Current instance of EventEmitter for chaining.\n     */\n    proto.removeListener = function removeListener(evt, listener) {\n        var listeners = this.getListenersAsObject(evt);\n        var index;\n        var key;\n\n        for (key in listeners) {\n            if (listeners.hasOwnProperty(key)) {\n                index = indexOfListener(listeners[key], listener);\n\n                if (index !== -1) {\n                    listeners[key].splice(index, 1);\n                }\n            }\n        }\n\n        return this;\n    };\n\n    /**\n     * Alias of removeListener\n     */\n    proto.off = alias('removeListener');\n\n    /**\n     * Adds listeners in bulk using the manipulateListeners method.\n     * If you pass an object as the second argument you can add to multiple events at once. The object should contain key value pairs of events and listeners or listener arrays. You can also pass it an event name and an array of listeners to be added.\n     * You can also pass it a regular expression to add the array of listeners to all events that match it.\n     * Yeah, this function does quite a bit. That's probably a bad thing.\n     *\n     * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to add to multiple events at once.\n     * @param {Function[]} [listeners] An optional array of listener functions to add.\n     * @return {Object} Current instance of EventEmitter for chaining.\n     */\n    proto.addListeners = function addListeners(evt, listeners) {\n        // Pass through to manipulateListeners\n        return this.manipulateListeners(false, evt, listeners);\n    };\n\n    /**\n     * Removes listeners in bulk using the manipulateListeners method.\n     * If you pass an object as the second argument you can remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays.\n     * You can also pass it an event name and an array of listeners to be removed.\n     * You can also pass it a regular expression to remove the listeners from all events that match it.\n     *\n     * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to remove from multiple events at once.\n     * @param {Function[]} [listeners] An optional array of listener functions to remove.\n     * @return {Object} Current instance of EventEmitter for chaining.\n     */\n    proto.removeListeners = function removeListeners(evt, listeners) {\n        // Pass through to manipulateListeners\n        return this.manipulateListeners(true, evt, listeners);\n    };\n\n    /**\n     * Edits listeners in bulk. The addListeners and removeListeners methods both use this to do their job. You should really use those instead, this is a little lower level.\n     * The first argument will determine if the listeners are removed (true) or added (false).\n     * If you pass an object as the second argument you can add/remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays.\n     * You can also pass it an event name and an array of listeners to be added/removed.\n     * You can also pass it a regular expression to manipulate the listeners of all events that match it.\n     *\n     * @param {Boolean} remove True if you want to remove listeners, false if you want to add.\n     * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to add/remove from multiple events at once.\n     * @param {Function[]} [listeners] An optional array of listener functions to add/remove.\n     * @return {Object} Current instance of EventEmitter for chaining.\n     */\n    proto.manipulateListeners = function manipulateListeners(remove, evt, listeners) {\n        var i;\n        var value;\n        var single = remove ? this.removeListener : this.addListener;\n        var multiple = remove ? this.removeListeners : this.addListeners;\n\n        // If evt is an object then pass each of its properties to this method\n        if (typeof evt === 'object' && !(evt instanceof RegExp)) {\n            for (i in evt) {\n                if (evt.hasOwnProperty(i) && (value = evt[i])) {\n                    // Pass the single listener straight through to the singular method\n                    if (typeof value === 'function') {\n                        single.call(this, i, value);\n                    }\n                    else {\n                        // Otherwise pass back to the multiple function\n                        multiple.call(this, i, value);\n                    }\n                }\n            }\n        }\n        else {\n            // So evt must be a string\n            // And listeners must be an array of listeners\n            // Loop over it and pass each one to the multiple method\n            i = listeners.length;\n            while (i--) {\n                single.call(this, evt, listeners[i]);\n            }\n        }\n\n        return this;\n    };\n\n    /**\n     * Removes all listeners from a specified event.\n     * If you do not specify an event then all listeners will be removed.\n     * That means every event will be emptied.\n     * You can also pass a regex to remove all events that match it.\n     *\n     * @param {String|RegExp} [evt] Optional name of the event to remove all listeners for. Will remove from every event if not passed.\n     * @return {Object} Current instance of EventEmitter for chaining.\n     */\n    proto.removeEvent = function removeEvent(evt) {\n        var type = typeof evt;\n        var events = this._getEvents();\n        var key;\n\n        // Remove different things depending on the state of evt\n        if (type === 'string') {\n            // Remove all listeners for the specified event\n            delete events[evt];\n        }\n        else if (evt instanceof RegExp) {\n            // Remove all events matching the regex.\n            for (key in events) {\n                if (events.hasOwnProperty(key) && evt.test(key)) {\n                    delete events[key];\n                }\n            }\n        }\n        else {\n            // Remove all listeners in all events\n            delete this._events;\n        }\n\n        return this;\n    };\n\n    /**\n     * Alias of removeEvent.\n     *\n     * Added to mirror the node API.\n     */\n    proto.removeAllListeners = alias('removeEvent');\n\n    /**\n     * Emits an event of your choice.\n     * When emitted, every listener attached to that event will be executed.\n     * If you pass the optional argument array then those arguments will be passed to every listener upon execution.\n     * Because it uses `apply`, your array of arguments will be passed as if you wrote them out separately.\n     * So they will not arrive within the array on the other side, they will be separate.\n     * You can also pass a regular expression to emit to all events that match it.\n     *\n     * @param {String|RegExp} evt Name of the event to emit and execute listeners for.\n     * @param {Array} [args] Optional array of arguments to be passed to each listener.\n     * @return {Object} Current instance of EventEmitter for chaining.\n     */\n    proto.emitEvent = function emitEvent(evt, args) {\n        var listeners = this.getListenersAsObject(evt);\n        var listener;\n        var i;\n        var key;\n        var response;\n\n        for (key in listeners) {\n            if (listeners.hasOwnProperty(key)) {\n                i = listeners[key].length;\n\n                while (i--) {\n                    // If the listener returns true then it shall be removed from the event\n                    // The function is executed either with a basic call or an apply if there is an args array\n                    listener = listeners[key][i];\n\n                    if (listener.once === true) {\n                        this.removeListener(evt, listener.listener);\n                    }\n\n                    response = listener.listener.apply(this, args || []);\n\n                    if (response === this._getOnceReturnValue()) {\n                        this.removeListener(evt, listener.listener);\n                    }\n                }\n            }\n        }\n\n        return this;\n    };\n\n    /**\n     * Alias of emitEvent\n     */\n    proto.trigger = alias('emitEvent');\n\n    /**\n     * Subtly different from emitEvent in that it will pass its arguments on to the listeners, as opposed to taking a single array of arguments to pass on.\n     * As with emitEvent, you can pass a regex in place of the event name to emit to all events that match it.\n     *\n     * @param {String|RegExp} evt Name of the event to emit and execute listeners for.\n     * @param {...*} Optional additional arguments to be passed to each listener.\n     * @return {Object} Current instance of EventEmitter for chaining.\n     */\n    proto.emit = function emit(evt) {\n        var args = Array.prototype.slice.call(arguments, 1);\n        return this.emitEvent(evt, args);\n    };\n\n    /**\n     * Sets the current value to check against when executing listeners. If a\n     * listeners return value matches the one set here then it will be removed\n     * after execution. This value defaults to true.\n     *\n     * @param {*} value The new value to check for when executing listeners.\n     * @return {Object} Current instance of EventEmitter for chaining.\n     */\n    proto.setOnceReturnValue = function setOnceReturnValue(value) {\n        this._onceReturnValue = value;\n        return this;\n    };\n\n    /**\n     * Fetches the current value to check against when executing listeners. If\n     * the listeners return value matches this one then it should be removed\n     * automatically. It will return true by default.\n     *\n     * @return {*|Boolean} The current value to check for or the default, true.\n     * @api private\n     */\n    proto._getOnceReturnValue = function _getOnceReturnValue() {\n        if (this.hasOwnProperty('_onceReturnValue')) {\n            return this._onceReturnValue;\n        }\n        else {\n            return true;\n        }\n    };\n\n    /**\n     * Fetches the events object and creates one if required.\n     *\n     * @return {Object} The events storage object.\n     * @api private\n     */\n    proto._getEvents = function _getEvents() {\n        return this._events || (this._events = {});\n    };\n\n    /**\n     * Reverts the global {@link EventEmitter} to its previous value and returns a reference to this version.\n     *\n     * @return {Function} Non conflicting EventEmitter class.\n     */\n    EventEmitter.noConflict = function noConflict() {\n        exports.EventEmitter = originalGlobalValue;\n        return EventEmitter;\n    };\n\n    // Expose the class either via AMD, CommonJS or the global object\n    if (typeof define === 'function' && define.amd) {\n        define(function () {\n            return EventEmitter;\n        });\n    }\n    else if (typeof module === 'object' && module.exports){\n        module.exports = EventEmitter;\n    }\n    else {\n        exports.EventEmitter = EventEmitter;\n    }\n}.call(this));\n"
  },
  {
    "path": "browser/scripts/file-select-control.js",
    "content": "function TagControl($input, $fileList) {\n\tvar that = this\n\n\tfunction tagify(input) {\n\t\treturn input.split(' ')\n\t\t.filter(function(val) {\n\t\t\treturn val !== '#' && val.length > 0\n\t\t})\n\t\t.map(function(val) {\n\t\t\tif (!val.length || val[0] === '#')\n\t\t\t\treturn val\n\n\t\t\treturn '#' + val\n\t\t})\n\t}\n\n\t$input.on('keyup', function() {\n\t\tsetTimeout(function() {\n\t\t\tvar tags = tagify($input.val())\n\t\t\t$fileList.filterByTags(tags)\n\t\t\t$input.val(tags.join(' '))\n\t\t}, 0)\n\n\t\treturn true\n\t})\n}\n_.extend(TagControl.prototype, Backbone.Events)\n\nfunction FileSelectControl(handlebars) {\n\tEventEmitter.call(this)\n\n\tvar that = this\n\n\tthis._handlebars = handlebars || window.Handlebars\n\tthis._frame = null\n\tthis._fileList = E2.models.fileList\n\tthis._fileList.on('change:files', this._onFilesChange, this)\n\n\tthis._cb = function() {}\n\tthis._buttons = {\n\t\t'Cancel': this.cancel.bind(this),\n\t\t'Ok': this.close.bind(this)\n\t}\n\n\tthis._template = E2.views.filebrowser.generic\n\tthis._frameTemplate = E2.views.filebrowser.frame;\n\n\t// setup partials\n\t['upload', 'tags'].forEach(function(pname) {\n\t\tthat._handlebars.registerPartial('filebrowser/'+pname, E2.views.filebrowser[pname])\n\t})\n}\n\nFileSelectControl.prototype = Object.create(EventEmitter.prototype)\n\nFileSelectControl.prototype._onFilesChange = function(model) {\n\tif (!this._frame)\n\t\treturn\n\n\t$('.file-selector', this._frame).html(this._renderFiles())\n\tthis._bindTable()\n}\n\nFileSelectControl.prototype.template = function(name) {\n\tthis._template = E2.views.filebrowser[name]\n\treturn this\n}\n\nFileSelectControl.prototype.frame = function(name) {\n\tthis._frameTemplate = E2.views.filebrowser[name]\n\treturn this\n}\n\nFileSelectControl.prototype.url = function(url) {\n\tthis._url = url\n\treturn this\n}\n\nFileSelectControl.prototype.files = function(files) {\n\tvar items = files.map(function(file) {\n\t\tif (typeof(file) === 'string')\n\t\t\treturn { path: file }\n\n\t\treturn file\n\t})\n\n\tthis._fileList.setFiles(items)\n\n\treturn this\n}\n\nFileSelectControl.prototype.getFileMetadata = function(path) {\n\tvar meta \n\n\tthis._fileList.get('files').some(function(file) {\n\t\tif (file.url === path) {\n\t\t\tmeta = file\n\t\t\treturn true\n\t\t}\n\t})\n\n\treturn meta\n}\n\nFileSelectControl.prototype.selected = function(file) {\n\tthis._original = file\n\tthis._selected = file\n\treturn this\n}\n\nFileSelectControl.prototype.onChange = function(cb) {\n\tthis._cb = cb\n\treturn this\n}\n\nFileSelectControl.prototype.buttons = function(buttons) {\n\tthis._buttons = buttons\n\treturn this\n}\n\nFileSelectControl.prototype.header = function(header) {\n\tthis._header = header\n\treturn this\n}\n\nFileSelectControl.prototype.modal = function() {\n\tthis._render()\n\treturn this\n}\n\nFileSelectControl.prototype._renderFiles = function() {\n\tvar that = this\n\tvar files = this._fileList.get('files')\n\tvar html = this._template({\n\t\toriginal: this._original,\n\t\turl: this._url,\n\t\tuser: E2.models.user.toJSON(),\n\t\tfiles: files\n\t\t.map(function(file) {\n\t\t\tif (file._creator)\n\t\t\t\tfile._creator = file._creator.username\n\n\t\t\tif (!file.url)\n\t\t\t\tfile.url = file.path\n\n\t\t\tfile.selected = (file.url === that._selected)\n\t\t\tif (!file.name)\n\t\t\t\tfile.name = file.path.substring(file.path.lastIndexOf('/')+1)\n\t\t\tfile.updatedAt = moment(file.updatedAt).fromNow()\n\t\t\treturn file\n\t\t})\n\t})\n\n\treturn html\n}\n\nFileSelectControl.prototype._render = function() {\n\tvar that = this\n\n\tvar modelName = this._url ? this._url.split('/')[1] : null\n\n\tthis._frame = $(this._frameTemplate({\n\t\toriginal: this._original,\n\t\turl: this._url,\n\t\tmodelName: modelName,\n\t\tuser: E2.models.user.toJSON()\n\t}))\n\n\t$('.file-selector', this._frame).html(this._renderFiles())\n\n\tvar el = bootbox.dialog({\n\t\ttitle: this._header,\n\t\tmessage: this._frame\n\t})\n\n\t$('.modal-dialog').addClass('file-select-dialog')\n\n\tthis._el = el\n\tthis._inputEl = $('#file-url', el)\n\tthis._selectedEl = $('tr.success', el)\n\n\t// add buttons\n\tvar buttonsRow = $('#buttons-row', el)\n\n\tvar keypressFn = this._onKeyPress.bind(this)\n\tel[0].addEventListener('keydown', keypressFn)\n\n\tfunction clickHandler(buttonCb) {\t// #732 return false from your handler to prevent the panel closing\n\t\treturn function(e) {\n\t\t\te.preventDefault()\n\t\t\te.stopPropagation()\n\t\t\tvar okToClose = buttonCb.call(that, that._inputEl.val())\n\t\t\tif (okToClose !== false) {\n\t\t\t\tel[0].removeEventListener('keydown',keypressFn)\n\t\t\t\tthat.close()\n\t\t\t}\n\t\t\treturn false\n\t\t}\n\t}\n\n\tObject.keys(this._buttons).map(function(name) {\n\t\tvar btn = that._buttons[name]\n\t\t$('<td>').append(\n\t\t\t$('<button class=\"btn btn-default\" id=\"fbBtn'+name+'\">'+name+'</button>')\n\t\t\t\t.click(clickHandler(btn))\n\t\t).appendTo(buttonsRow)\n\t})\n\t\n\t$('button:last', el)\n\t\t.removeClass('btn-default')\n\t\t.addClass('btn-primary')\n\n\t// bind file rows and click handlers\n\tthis._bindTable()\n\n\t$('input', el).on('change', this._onChange.bind(this))\n\t$('button.close', el).click(function(e) {\n\t\te.preventDefault()\n\t\te.stopPropagation()\n\t\tthat.cancel()\n\t})\n\n\t// show selected file when modal is opened\n\t$(el).on('shown.bs.modal', function (e) {\n\t\tif (!that._selectedEl.length)\n\t\t\treturn\n\n\t\t$('table', el).scrollTop(0)\n\t\t\t.scrollTop(\n\t\t\t\tthat._selectedEl.position().top\n\t\t\t\t- that._selectedEl.height()\n\t\t\t\t* 10)\n\t})\n\n\t// bind upload form\n\tthis._bindUploadForm()\n\n\treturn this\n}\n\nFileSelectControl.prototype._bindTable = function() {\n\tvar that = this\n\n\t// bind file rows and click handlers\n\tfunction _onClick(e) {\n\t\tvar tr = $(e.target).closest('tr')\n\t\t$('tr.success', that._el).removeClass('success')\n\t\ttr.addClass('success')\n\t\tthat._onSelect(tr)\n\t}\n\n\t$('.file-row', that._el).click(_onClick)\n\t$('.file-row', that._el).dblclick(function(e) {\n\t\t_onClick(e)\n\t\tthat._onChange()\n\t\tthat.ok()\n\t})\n}\n\nFileSelectControl.prototype._bindUploadForm = function() {\n\tvar that = this\n\tvar container = $('#upload', this._el)\n\tvar $form = $('form.fileUploadForm', container)\n\tvar browsebutton = $('.browse-button')\n\tvar fileUploadName = $('#fileUploadName')\n\tvar fileUploadFile = $('#fileUploadFile')\n\t\n\tbrowsebutton.click(function(e) {\n\t\tfileUploadFile.trigger('click')\n\t\treturn false\n\t})\n\t\n\tfileUploadName.click(function() {\n\t\tfileUploadFile.trigger('click')\n\t\treturn false\n\t})\n\t\n\tfileUploadFile.on('change', function() {\n\t\tfileUploadName.val(fileUploadFile.val())\n\t})\n\t\n\tif (!$form)\n\t\treturn\n\n\t$form.on('submit', function(e) {\n\t\te.preventDefault()\n\t\te.stopPropagation()\n\n\t\t$('.progress', container).show()\n\t\tvar $progress = $('.progress-bar', container)\n\n\t\tvar formData = new FormData($form[0])\n\t\t$.ajax({\n\t\t\turl: $form[0].action,\n\t\t\ttype: 'POST',\n\t\t\txhr: function() {\n\t\t\t\tvar xhr = $.ajaxSettings.xhr()\n\t\t\t\txhr.upload.addEventListener('progress', function(evt) {\n\t\t\t\t\tif (evt.lengthComputable)\n\t\t\t\t\t\t$progress.css('width', Math.floor(evt.loaded/evt.total * 100) + '%')\n\t\t\t\t}, false)\n\n\t\t\t\treturn xhr\n\t\t\t},\n\t\t\tsuccess: function(file) {\n\t\t\t\t$progress.removeClass('active')\n\t\t\n\t\t\t\tE2.track({ \n\t\t\t\t\tevent: 'uploaded',\n\t\t\t\t\tmodelName: file.modelName,\n\t\t\t\t\tpath: file.url\n\t\t\t\t})\n\n\t\t\t\t$('#message', container).html('<h4>Uploaded successfully!</h4>')\n\t\t\t\tthat.selected(file.path)\n\t\t\t\tthat._fileList.addFile(file)\n\n\t\t\t\tsetTimeout(function() {\n\t\t\t\t\tthat._onSelect($('tr.file-row:first', that._el))\n\t\t\t\t\t$('.nav-tabs a:first', that._el).tab('show')\n\t\t\t\t}, 1000)\n\t\t\t},\n\t\t\terror: function(err) {\n\t\t\t\t$progress\n\t\t\t\t\t.removeClass('active')\n\t\t\t\t\t.removeClass('progress-bar-info')\n\t\t\t\t\t.addClass('progress-bar-danger')\n\n\t\t\t\t$('#message', container).html('<h4>Upload failed: ' +\n\t\t\t\t\terr.responseJSON ? err.responseJSON.message : err +\n\t\t\t\t\t'</h4>')\n\t\t\t},\n\t\t\tdata: formData,\n\t\t\tcache: false,\n\t\t\tcontentType: false,\n\t\t\tprocessData: false,\n\t\t\tdataType: 'json'\n\t\t})\n\n\t\t$('#message', container).html('<h4>Please wait...</h4>')\n\n\t\treturn false\n\t})\n}\n\nFileSelectControl.prototype._onKeyPress = function(e) {\n\te.stopPropagation()\n\tswitch(e.keyCode) {\n\t\tcase 27:\n\t\t\tthis.cancel()\n\t\t\tbreak\n\t\tcase 13:\n\t\t\te.preventDefault()\n\t\t\tthis.ok()\n\t\t\tbreak\n\t\tcase 38:\n\t\t\te.preventDefault()\n\t\t\tvar prev = this._selectedEl.prev('tr')\n\t\t\tif (prev.length)\n\t\t\t\tthis._onSelect(prev)\n\t\t\tthis._scroll(-1)\n\t\t\tbreak\n\t\tcase 40:\n\t\t\te.preventDefault()\n\t\t\tvar next = this._selectedEl.next('tr')\n\t\t\tif (next.length)\n\t\t\t\tthis._onSelect(next)\n\t\t\tthis._scroll(1)\n\t\t\tbreak\n\t}\n\treturn true\n}\n\nFileSelectControl.prototype._scroll = function(amt) {\n\tif (!this._selectedEl.length)\n\t\treturn\n\n\tvar container = $('.fixed-table-container-inner')\n\tvar threshold = 4 * this._selectedEl.height()\n\tcontainer.scrollTop(this._selectedEl.offset().top - container.offset().top + container.scrollTop() - threshold)\n}\n\nFileSelectControl.prototype._onChange = function() {\n\tthis._cb(this._inputEl.val())\n}\n\nFileSelectControl.prototype._onSelect = function(row) {\n\tvar path = row.data('url')\n\n\tthis._selectedEl.removeClass('success')\n\trow.addClass('success')\n\n\tthis._selectedEl = row\n\tthis._inputEl.val(path)\n\tthis._onChange()\n}\n\nFileSelectControl.prototype.ok = function() {\n\t$('button.btn:last', this._el).click()\n}\n\nFileSelectControl.prototype.cancel = function() {\n\tthis._cb(this._original)\n\tthis.close()\n}\n\nFileSelectControl.prototype.close = function() {\n\tthis._el.modal('hide')\n\tthis.emit('closed')\n}\n\n// ------------------------------------------\n\nfunction createSelector(path, selected, okButton, okFn, cb) {\n\tvar ctl = new FileSelectControl()\n\tvar systemFiles = [], userFiles = []\n\tvar userDfd = when.defer()\n\tvar systemDfd = when.defer()\n\n\tokButton = okButton || 'Ok'\n\tokFn = okFn || function() {}\n\n\tif (selected && selected.indexOf('://') === -1)\n\t\tselected = selected.substring(selected.lastIndexOf('/') + 1)\n\n\tE2.ui.updateProgressBar(65)\n\n\tif (E2.models.user.get('username') !== '') {\n\t\t$.get(path, function(files) {\n\t\t\tuserFiles = files || []\n\t\t\tuserDfd.resolve()\n\t\t})\n\t} else {\n\t\tuserDfd.resolve()\n\t}\n\n\t$.get('/vizor/assets' + path, function(files) {\n\t\tsystemFiles = files || []\n\t\tsystemDfd.resolve()\n\t})\n\n\twhen.all([ userDfd.promise, systemDfd.promise ]).then(function() {\n\t\tE2.ui.updateProgressBar(100)\n\n\t\tvar buttons = {\n\t\t\t'Cancel': function() {}\n\t\t}\n\n\t\tbuttons[okButton] = okFn\n\n\t\tctl\n\t\t\t.url(path)\n\t\t\t.buttons(buttons)\n\t\t\t.files(userFiles.concat(systemFiles))\n\t\t\t.selected(selected)\n\n\t\tcb(ctl)\n\n\t})\n\n\treturn ctl\n}\n\nFileSelectControl.createGraphSelector = function(selected, okButton, okFn)\n{\n\tif (E2.ui.isModalOpen()) return null\n\tvar ctl = new FileSelectControl()\n\n\tokButton = okButton || 'Ok'\n\tokFn = okFn || function() {}\n\n\tif (selected && selected.indexOf('://') === -1)\n\t\tselected = selected.substring(selected.lastIndexOf('/') + 1)\n\n\tE2.ui.updateProgressBar(65)\n\n\t$.get('/graph', function(files) {\n\t\tE2.ui.updateProgressBar(100)\n\n\t\tvar buttons = {\n\t\t\t// 'Copy to clipboard': function(file)\n\t\t\t// {\n\t\t\t// \t$.get('/data/graph'+file+'.json', function(d)\n\t\t\t// \t{\n\t\t\t// \t\tE2.app.fillCopyBuffer(d.root.nodes, d.root.conns, 0, 0)\n\t\t\t// \t})\n\t\t\t// }\n\t\t\t'Cancel': function() {}\n\t\t}\n\n\t\tbuttons[okButton] = okFn\n\n\t\tvar selectedPath\n\n\t\tctl\n\t\t\t.url('/graph')\n\t\t\t.frame('graph-frame')\n\t\t\t.template('graph')\n\t\t\t.buttons(buttons)\n\t\t\t.files(files)\n\t\t\t.selected(selected)\n\t\t\t.onChange(function(path) {\n\t\t\t\t$('.links').show()\n\t\t\t\tselectedPath = path\n\t\t\t})\n\t\t\t.modal()\n\n\t\t$('.links .download').click(function(e) {\n\t\t\te.preventDefault()\n\t\t\te.stopPropagation()\n\t\t\twindow.open('/dl/data/graph'+selectedPath+'.json')\n\t\t})\n\n\t\t$('.links .clipboard').click(function(e) {\n\t\t\te.preventDefault()\n\t\t\te.stopPropagation()\n\t\t\t$.get('/data/graph'+selectedPath+'.json', function(d)\n\t\t\t{\n\t\t\t\tE2.app.fillCopyBuffer(d.root.nodes, d.root.conns, 0, 0)\n\t\t\t\tctl.close()\n\t\t\t})\n\t\t\treturn false\n\t\t})\n\n\t\t$('.links').hide()\n\t})\n\n\treturn ctl\n}\n\nFileSelectControl.createVideoSelector = function(selected, okButton, okFn) {\n\treturn FileSelectControl.createForUrl('/video', selected, okButton, okFn)\n}\n\nFileSelectControl.createJsonSelector = function(selected, okButton, okFn) {\n\treturn FileSelectControl.createForUrl('/json', selected, okButton, okFn)\n}\n\nFileSelectControl.createAudioSelector = function(selected, okButton, okFn) {\n\treturn FileSelectControl.createForUrl('/audio', selected, okButton, okFn)\n}\n\nFileSelectControl.createPatchSelector = function(selected, okButton, okFn) {\n\treturn FileSelectControl.createForUrl('/patch', selected, okButton, okFn)\n}\n\nFileSelectControl.createSceneSelector = function(selected, okButton, okFn) {\n\treturn FileSelectControl.createForUrl('/scene', selected, okButton, okFn)\n}\n\nFileSelectControl.createTextureSelector = function(selected, cb) {\n\treturn createSelector('/image/tag/texture', selected, 'Select', function() {}, cb)\n}\n\nFileSelectControl.createStereoCubeMapSelector = function(selected, cb) {\n\treturn createSelector('/image/tag/stereocubemap', selected, 'Select', function() {}, cb)\n}\n\nFileSelectControl.createModelSelector = function(model, selected, cb) {\n\treturn createSelector('/'+model, selected, 'Select', function() {}, cb)\n}\n\nFileSelectControl.createForUrl = function(path, selected, okButton, okFn) {\n\treturn createSelector(path, selected, okButton, okFn, function(ctl) {\n\t\tctl.modal()\n\t})\n}\n\nif (typeof(exports) !== 'undefined')\n\texports.FileSelectControl = FileSelectControl\n"
  },
  {
    "path": "browser/scripts/fontSelector.js",
    "content": "var FontSelector = function() {\n\tthis.fonts = [\n\t{\n\t\tname: 'Source Sans',\n\t\tid: 'source sans',\n\t\turl: '/data/fonts/Source Sans Pro_Regular.json'\n\t}, {\n\t\tname: 'Source Sans Bold',\n\t\tid: 'source sans bold',\n\t\turl: '/data/fonts/Source Sans Pro_Bold.json'\n\t}, {\n\t\tname: 'Helvetiker',\n\t\tid: 'helvetiker',\n\t\turl: '/data/fonts/helvetiker_regular.typeface.js'\n\t}, {\n\t\tname: 'Helvetiker Bold',\n\t\tid: 'helvetiker bold',\n\t\turl: '/data/fonts/helvetiker_bold.typeface.js'\n\t}]\n\n\tthis.fontLoader = new THREE.FontLoader()\n\n\tthis.getByIndex = function(idx) {\n\t\treturn this.fonts[idx]\n\t}\n\n\tthis.getById = function(id) {\n\t\tfor(var i = 0, len = this.fonts.length; i < len; ++i) {\n\t\t\tif (this.fonts[i].id === id) {\n\t\t\t\treturn this.fonts[i]\n\t\t\t}\n\t\t}\n\t}\n\n\tthis.getIndex = function(font) {\n\t\treturn this.fonts.indexOf(font)\n\t}\n\n\n\tthis.createUi = function($ui, callback) {\n\t\tvar $selectFont = $('<select class=\"font-type-sel\" title=\"Select Font\"/>')\n\n\t\tfor (var i = 0, len = this.fonts.length; i < len; ++i) {\n\t\t\tvar font = this.fonts[i]\n\t\t\t$('<option>', {value: i, text: font.name}).appendTo($selectFont)\n\t\t}\n\n\t\tvar that = this\n\n\t\t$selectFont.change(function() {\n\t\t\tvar newFont = that.getByIndex($selectFont.val())\n\t\t\tvar selection = newFont.id\n\n\t\t\tif (!newFont.font) {\n\t\t\t\tthat.fontLoader.load(newFont.url, function(font) {\n\t\t\t\t\tnewFont.font = font\n\t\t\t\t\tcallback(newFont, selection)\n\t\t\t\t})\n\t\t\t}\n\t\t\telse {\n\t\t\t\tcallback(newFont, selection)\n\t\t\t}\n\t\t})\n\n\t\t$ui.append($selectFont)\n\t}\n\n\tthis.initialise = function(ui, id) {\n\t\tvar font = this.getById(id)\n\t\tvar idx = this.getIndex(font)\n\t\tui.find('.font-type-sel').val(idx)\n\t}\n}\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = FontSelector\n"
  },
  {
    "path": "browser/scripts/glTFUtils.js",
    "content": "function deepCopyglTFObject(sourceRoot, targetRoot) {\n\tfunction remap(source, target, callback) {\n\t\tcallback(source, target)\n\n\t\tfor (var i = 0; i < source.children.length; ++i) {\n\t\t\tremap(source.children[i], target.children[i], callback)\n\t\t}\n\t}\n\n\t// gltf-specific fixup -\n\t// clone material data but clobber textures as we want to share them\n\tremap(sourceRoot, targetRoot, function(source, target) {\n\t\tif (source.material) {\n\t\t\ttarget.material = source.material.clone()\n\n\t\t\tvar sourceUniforms = source.material.uniforms\n\t\t\tvar targetUniforms = target.material.uniforms\n\t\t\tfor(var uniform in sourceUniforms) {\n\t\t\t\tif(sourceUniforms[uniform].type === 't') {\n\t\t\t\t\ttargetUniforms[uniform].value = sourceUniforms[uniform].value\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n\n\t// as we cloned the object above, the shader and animation\n\t// bindings now point to an incorrect object.\n\t// Clone the bindings and rebind to the new object.\n\tTHREE.glTFAnimator.cloneAnimationBindings(sourceRoot, targetRoot)\n\tTHREE.glTFShaders.cloneShaderBindings(sourceRoot, targetRoot)\n}\n"
  },
  {
    "path": "browser/scripts/graph.js",
    "content": "function Graph(core, parent_graph, uid) {\n\tEventEmitter.call(this)\n\n\tthis.nodes = []\n\tthis.connections = []\n\tthis.core = core\n\tthis.variables = new E2.Variables(core)\n\n\tthis.parent_graph = parent_graph\n\tthis.roots = []\n\tthis.children = []\n\n\tthis.uid = (uid !== undefined) ? uid : E2.uid()\n\n\t// eg. array_function; has multiple copies\n\tthis.hasCopies = false \n\tthis.isCopy = false\n\tthis.copies = []\n}\n\nGraph.prototype = Object.create(EventEmitter.prototype)\n\nGraph.prototype.isEntityPatch = function() {\n\tif (!this.plugin)\n\t\treturn false\n\n\tif (this.plugin.id === 'entity')\n\t\treturn true\n\n\tvar node = this.plugin.node\n\treturn node.isEntityPatch()\n}\n\nGraph.prototype.get_node_uid = function() {\n\treturn E2.core.get_uid()\n}\n\nGraph.prototype.makeCopy = function(i) {\n\ti = i || this.copies.length\n\n\tvar graphSer = JSON.stringify(this.serialise())\n\n\tvar graph = new Graph()\n\tgraph.deserialise(JSON.parse(graphSer))\n\tgraph.patch_up([graph, E2.core.root_graph])\n\tgraph.initialise([graph, E2.core.root_graph])\n\n\tgraph.isCopy = true\n\n\tthis.setCopy(i, graph)\n\n\treturn graph\n}\n\nGraph.prototype.setCopy = function(i, graph) {\n\tthis.copies[i] = graph\n\tthis.hasCopies = true\n}\n\nGraph.prototype.clearCopies = function(i) {\n\tthis.copies.length = 0\n\tthis.hasCopies = false\n}\n\nGraph.prototype.removeCopy = function(i) {\n\tthis.copies[i].destroy()\n\n\tthis.copies.splice(i, 1)\n\tthis.hasCopies = this.copies.length > 0\n}\n\nGraph.prototype.destroy = function() {\n\tvar that = this\n\n\tthis.destroy_ui()\n\n\tthis.connections.map(function(c) {\n\t\tthat.disconnect(c)\n\t})\n\n\tthis.nodes.map(function(node) {\n\t\tnode.destroy()\n\t})\n\t\n\tthis.nodes = []\n\n\tthis.connections = []\n}\n\nGraph.prototype.update = function(updateContext) {\n\tvar nodes = this.nodes\n\tvar roots = this.roots\n\tvar children = this.children\n\tvar dirty = false\n\tvar i, len\n\t\n\tfor(i = 0, len = nodes.length; i < len; i++)\n\t\tnodes[i].update_count = 0\n\n\tfor(i = 0, len = roots.length; i < len; i++)\n\t\tdirty = roots[i].update_recursive(updateContext, this.connections) || dirty\n\t\n\t// also update subgraphs that don't have root pullers\n\tfor(i = 0, len = children.length; i < len; i++) {\n\t\tif (children[i].update_count === 0)\n\t\t\tdirty = children[i].update_recursive(updateContext, this.connections) || dirty\n\t}\n\n\tif(dirty && this === E2.app.player.core.active_graph)\n\t\tE2.app.player.core.active_graph_dirty = dirty\n\t\n\tfor(i = 0, len = nodes.length; i < len; i++)\n\t\tnodes[i].plugin.updated = false\n\n\treturn dirty;\n}\n\nGraph.prototype.enum_all = function(nodeCb, connCb) {\n\tif (nodeCb) {\n\t\tvar nodes = this.nodes;\n\t\t    \n\t\tfor(var i = 0, len = nodes.length; i < len; i++)\n\t\t\tnodeCb(nodes[i]);\n\t}\n\n\tif (connCb) {\n\t\tvar conns = this.connections;\n\t    \n\t\tfor(var i = 0, len = conns.length; i < len; i++)\n\t\t\tconnCb(conns[i]);\n\t}\n}\n\nGraph.prototype.reset = function() {\n\tvar nodes = this.nodes, conns = this.connections\n\tvar i, len\n\n\tfor(i = 0, len = nodes.length; i < len; i++)\n\t\tnodes[i].reset()\n    \n\tfor(i = 0, len = conns.length; i < len; i++)\n\t\tconns[i].reset()\n}\n\nGraph.prototype.play = function() {\n\tthis.enum_all(function(n) {\n\t\tif (n.plugin.play) {\n\t\t\tn.plugin.play()\n\t\t}\n\t}, null)\n}\n\nGraph.prototype.pause = function() {\n\tthis.enum_all(function(n) {\n\t\tif (n.plugin.pause)\n\t\t\tn.plugin.pause()\n\t}, null)\n}\n\nGraph.prototype.stop = function() {\n\tthis.enum_all(function(n) {\n\t\tif(n.plugin.stop)\n\t\t\tn.plugin.stop()\n\t}, null)\n}\n\nGraph.prototype.addNode = function(n, info) {\n\tthis.registerNode(n, info ? info.order : null)\n\tthis.emit('nodeAdded', n, info)\n\treturn n\n}\n\nGraph.prototype.registerNode = function(n, order) {\n\tif (!order)\n\t\tthis.nodes.push(n)\n\telse\n\t\tthis.nodes.splice(order[0], 0, n)\n\n\tif (this.nuid_lut)\n\t\tthis.nuid_lut[n.uid] = n\n\t\n\tif (!n.plugin.output_slots.length && !n.dyn_outputs.length)\n\t\tthis.roots.push(n)\n\t\n\tif (n.plugin.isGraph) {\n\t\tif (!order)\n\t\t\tthis.children.push(n)\n\t\telse\n\t\t\tthis.children.splice(order[1], 0, n)\n\n\t\tif (E2.core.graphs.indexOf(n.plugin.graph) === -1)\n\t\t\tE2.core.graphs.push(n.plugin.graph)\n\t}\n\n\treturn n\n}\n\nGraph.prototype.removeNode = function(node) {\n\tfunction nodeFilter(fnode) {\n\t\treturn node !== fnode\n\t}\n\n\tthis.nodes = this.nodes.filter(nodeFilter);\n\t\n\tif (this.nuid_lut)\n\t\tdelete this.nuid_lut[node.uid];\n\t\n\tif (!node.plugin.output_slots.length && !node.dyn_outputs.length) \n\t\tthis.roots = this.roots.filter(nodeFilter);\n\t\n\tif (node.plugin.isGraph) {\n\t\tthis.children = this.children.filter(nodeFilter);\n\t\tE2.core.graphs.splice(E2.core.graphs.indexOf(node.plugin.graph), 1)\n\t}\n\n\tif (node.plugin.stop)\n\t\tnode.plugin.stop()\n\n\tif (node.plugin.destroy)\n\t\tnode.plugin.destroy()\n\n\tthis.emit('nodeRemoved', node)\n\n\treturn node\n}\n\nGraph.prototype.renameNode = function(node, title) {\n\tnode.title = title\n\tthis.emit('nodeRenamed', node)\n\tnode.emit('renamed', node.get_disp_name())\n}\n\nGraph.prototype.addConnection = function(connection) {\n\tthis.connections.push(connection)\n\tconnection.src_node.emit('connected', connection)\n\tconnection.dst_node.emit('connected', connection)\n\treturn connection\n}\n\nGraph.prototype.connect = function(connection) {\n\treturn this.addConnection(connection)\n}\n\nGraph.prototype.disconnect = function(c) {\n\tvar index = this.connections.indexOf(c)\n\n\tif (index !== -1)\n\t\tthis.connections.splice(index, 1)\n\n\tif (c.dst_node) {\n\t\tc.dst_node.removeInput(c)\n\t\tc.dst_node.emit('disconnected', c)\n\t}\n\n\tif (c.src_node) {\n\t\tc.src_node.removeOutput(c)\n\t\tc.src_node.emit('disconnected', c)\n\t}\n}\n\nGraph.prototype.create_ui = function() {\n\tthis.nuid_lut = [];\n\n\tfor(var i = 0, len = this.nodes.length; i < len; i++) {\n\t\tvar n = this.nodes[i];\n\t\tthis.nuid_lut[n.uid] = n;\n\t}\n\n\tthis.enum_all(function(n) {\n\t\tn.create_ui()\n\n\t\tif (n.plugin.state_changed)\n\t\t\tn.plugin.state_changed(n.ui.pluginUI)\n\t},\n\tfunction(c) {\n\t\tc.create_ui()\n\t\tc.ui.resolve_slot_divs()\n\t})\n}\n\nGraph.prototype.destroy_ui = function() {\n\tthis.enum_all(function(n) {\n\t\tn.destroy_ui();\n\t}, function(c) {\n\t\tc.destroy_ui();\n\t});\n\n\tdelete this.nuid_lut;\n}\n\nGraph.prototype.find_connection_to = function(node, slot) {\n\tif (slot.type !== E2.slot_type.input)\n\t\treturn;\n\t\n\tvar uid = node.uid;\n\n\treturn this.connections.filter(function(c) {\n\t\treturn (c.dst_node.uid === uid && c.dst_slot === slot);\n\t})[0];\n}\n\nGraph.prototype.find_connections_from = function(node, slot) {\n\tif(slot.type !== E2.slot_type.output)\n\t\treturn [];\n\t\n\tvar uid = node.uid;\n\t\n\treturn this.connections.filter(function(c)\n\t{\n\t\treturn(c.src_node.uid === uid && c.src_slot === slot);\n\t});\n}\n\nGraph.prototype.serialise = function() {\n\tvar d = {};\n\t\n\td.uid = this.uid;\n\td.parent_uid = this.parent_graph ? this.parent_graph.uid : -1;\n\td.open = this.open;\n\td.nodes = [];\n\td.conns = [];\n\t\n\tthis.enum_all(function(n) {\n\t\t\td.nodes.push(n.serialise())\n\t\t},\n\t\tfunction(c) {\n\t\t\td.conns.push(c.serialise())\n\t\t}\n\t)\n\n\tthis.variables.serialise(d)\n\t\n\treturn d;\n}\n\nGraph.prototype.deserialise = function(d) {\n\tthis.uid = '' + d.uid;\n\tthis.parent_graph = d.parent_uid;\n\t\t\t\n\tthis.nodes = [];\n\tthis.roots = [];\n\tthis.children = [];\n\tthis.open = d.open || false;\n\t\n\tvar i, len\n\n\tfor(i = 0, len = d.nodes.length; i < len; i++) {\n\t\tvar n = new Node()\n\t\t\n\t\tif (n.deserialise(this.uid, d.nodes[i]))\n\t\t\tthis.registerNode(n)\n\t}\n\n\tthis.connections = []\n\n\tfor(i = 0, len = d.conns.length; i < len; i++) {\n\t\tvar c = new Connection()\n\t\tc.deserialise(d.conns[i])\n\t\tthis.connections.push(c)\n\t}\n\t\n\tif (d.registers)\n\t\td.variables = d.registers // backwards compat\n\n\tif (d.variables)\n\t\tthis.variables.deserialise(d.variables)\n}\n\nGraph.prototype.patch_up = function(graphs) {\n\tif (!(this.parent_graph instanceof Graph))\n\t\tthis.parent_graph = Graph.resolve_graph(graphs, this.parent_graph);\n\n\tvar nodes = this.nodes,\n\t    conns = this.connections;\n\t\n\tvar i, len\n\n\tfor(i = 0, len = nodes.length; i < len; i++)\n\t\tnodes[i].patch_up(graphs);\n\n\tvar prune = [];\n\t\n\tfor(i = 0, len = conns.length; i < len; i++) {\n\t\tvar c = conns[i];\n\t\t\n\t\tif(!c.patch_up(this.nodes))\n\t\t\tprune.push(c);\n\t}\n\t\n\tfor(i = 0, len = prune.length; i < len; i++) {\n\t\tvar idx = conns.indexOf(prune[i])\n\t\tif (idx > -1)\n\t\t\tconns.splice(idx, 1)\n\t}\n}\n\nGraph.prototype.initialise = function() {\n\tvar nodes = this.nodes;\n\t\n\tfor(var i = 0, len = nodes.length; i < len; i++)\n\t\tnodes[i].initialise();\n\n\tthis.reset();\n}\n\nGraph.prototype.getTitle = function() {\n\treturn this.title\n}\n\nGraph.prototype.reorder_children = function(original, sibling, insert_after) {\n\tfunction reorder(arr) {\n\t\tvar originalIdx = arr.indexOf(original)\n\t\tif (originalIdx > -1)\n\t\t\tarr.splice(originalIdx, 1);\n\t\t\n\t\tvar i = arr.indexOf(sibling);\n\t\t\n\t\tif (insert_after)\n\t\t\ti++;\n\t\t\n\t\tarr.splice(i, 0, original);\n\t}\n\n\treorder(this.children);\n\treorder(this.nodes);\n};\n\nGraph.prototype.findConnectionByUid = function(cuid) {\n\tvar connection\n\tthis.connections.some(function(c) {\n\t\tif (c.uid === cuid) {\n\t\t\tconnection = c\n\t\t\treturn true\n\t\t}\n\t})\n\n\treturn connection\n}\n\nGraph.prototype.findNodeByUid = function(nuid) {\n\tvar node\n\n\tif (this.nuid_lut) {\n\t\tnode = this.nuid_lut[nuid]\n\t}\n\telse {\n\t\tthis.nodes.some(function(n) {\n\t\t\tif (n.uid === nuid) {\n\t\t\t\tnode = n\n\t\t\t\treturn true\n\t\t\t}\n\t\t})\n\t}\n\n\tif (!node) {\n\t\tmsg('ERROR: Failed to resolve node('+nuid+') in graph(' + this.uid + ')')\n\t\tconsole.log('Graph nodes', this.nodes)\n\t}\n\n\treturn node\n}\n\nGraph.prototype.findNodeByPlugin = function(name) {\n\tvar node\n\n\tthis.nodes.some(function(n) {\n\t\tif (n.plugin.id === name) {\n\t\t\tnode = n\n\t\t\treturn true\n\t\t}\n\t})\n\n\treturn node\n}\n\nGraph.lookup = function(guid) {\n\treturn Graph.resolve_graph(E2.core.graphs, guid)\n}\n\nGraph.resolve_graph = function(graphs, guid) {\n\tfor(var i = 0, len = graphs.length; i < len; i++) {\n\t\tif (graphs[i].uid === guid)\n\t\t\treturn graphs[i]\n\t}\n\n\tif (guid !== -1) {\n\t\tmsg('ERROR: Failed to resolve graph(' + guid + ')')\n\t\tconsole.log('Graphs', graphs)\n\t}\n\t\n\treturn null;\n}\n\nif (typeof(module) !== 'undefined') {\n\tmodule.exports = Graph\n\tvar Connection = require('./connection').Connection\n}\n\n"
  },
  {
    "path": "browser/scripts/graphApi.js",
    "content": "if (typeof(require) === 'function')\n\trequire('./commands/graphEditCommands')\n\nfunction GraphApi(undoManager) {\n\tthis.undoManager = undoManager\n}\n\n/**\n * adds the patchNode to the parent of targetNode,\n * and connect the patchNode to the targetNode.\n * the inputs and outputs must have the same names.\n * used eg. when a component is dropped on an entity\n */\nGraphApi.prototype.autoConnectPatchToNode = function(patchNode, targetNode) {\n\tvar that = this\n\tvar parentPatch = targetNode.parent_graph\n\n\tpatchNode\n\t.getDynamicOutputSlots()\n\t.map(function(output) {\n\t\tvar connection = Connection.hydrate(parentPatch, {\n\t\t\tsrc_nuid: patchNode.uid,\n\t\t\tdst_nuid: targetNode.uid,\n\t\t\tsrc_slot: output.index,\n\t\t\tsrc_dyn: true,\n\t\t\tdst_slot: output.name,\n\t\t\tdst_dyn: false\n\t\t})\n\n\t\tthat.connect(parentPatch, connection)\n\t\tE2.app.onLocalConnectionChanged(connection)\n\t})\n}\n\n\nGraphApi.prototype.addNode = function(graph, node) {\n\tvar cmd = new E2.commands.graph.AddNode(graph, node)\n\treturn this.undoManager.execute(cmd)\n}\n\nGraphApi.prototype.removeNode = function(graph, node) {\n\tvar cmd = new E2.commands.graph.RemoveNode(graph, node)\n\treturn this.undoManager.execute(cmd)\n}\n\nGraphApi.prototype.addSlot = function(graph, node, slot) {\n\treturn this.undoManager.execute(new E2.commands.graph.AddSlot(graph, node, slot))\n}\n\nGraphApi.prototype.removeSlot = function(graph, node, slotUid) {\n\treturn this.undoManager.execute(new E2.commands.graph.RemoveSlot(graph, node, slotUid))\n}\n\nGraphApi.prototype.renameNode = function(graph, node, title) {\n\tvar cmd = new E2.commands.graph.RenameNode(graph, node, title)\n\treturn this.undoManager.execute(cmd)\n}\n\nGraphApi.prototype.connect = function(graph, connection) {\n\tvar cmd = new E2.commands.graph.Connect(graph, connection)\n\treturn this.undoManager.execute(cmd)\n}\n\nGraphApi.prototype.disconnect = function(graph, connection) {\n\tvar cmd = new E2.commands.graph.Disconnect(graph, connection)\n\treturn this.undoManager.execute(cmd)\n}\n\nGraphApi.prototype.move = function(graph, nodes, dx, dy) {\n\tvar cmd = new E2.commands.graph.Move(graph, nodes, dx, dy)\n\treturn this.undoManager.execute(cmd)\n}\n\nGraphApi.prototype.reorder = function(graph, original, sibling, insertAfter) {\n\tvar cmd = new E2.commands.graph.Reorder(graph, original, sibling, insertAfter)\n\treturn this.undoManager.execute(cmd)\n}\n\nGraphApi.prototype.changeInputSlotValue = function(graph, node, slotName, newValue, oldValue) {\n\tvar slot = node.findInputSlotByName(slotName)\n\tif (slot.is_connected)\n\t\treturn;\n\tvar cmd = new E2.commands.graph.ChangeInputSlotValue(graph, node, slotName, newValue, oldValue)\n\treturn this.undoManager.execute(cmd)\n}\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = GraphApi\n"
  },
  {
    "path": "browser/scripts/gridFsClient.js",
    "content": "(function() {\n\nvar statCache = {}\n\nfunction GridFsClient() {}\n\nGridFsClient.prototype.stat = function(path) {\n\tvar dfd = when.defer()\n\n\tif (statCache[path]) {\n\t\tdfd.resolve(statCache[path])\n\t}\n\telse {\n\t\t$.get('/stat' + path, function(data) {\n\t\t\tif (!data.error) {\n\t\t\t\tstatCache[path] = data\n\t\t\t\treturn dfd.resolve(data)\n\t\t\t}\n\n\t\t\tdfd.resolve()\n\t\t})\n\t}\n\n\treturn dfd.promise\n}\n\nE2.GridFsClient = GridFsClient\n\n})()\n"
  },
  {
    "path": "browser/scripts/hardware.js",
    "content": "var hardware = {}\n\nhardware.hmd = null\n\nhardware.getVRDisplays = function() {\n\tif (navigator.getVRDisplays) {\n\t\treturn navigator.getVRDisplays()\n\t\t.then(function(vrDisplays) {\n\t\t\tvar displays = vrDisplays.filter(function(display) {\n\t\t\t\treturn display instanceof VRDisplay &&\n\t\t\t\t\tdisplay.capabilities.canPresent\n\t\t\t})\n\n\t\t\tif (displays.length)\n\t\t\t\thardware.hmd = displays[0]\n\n\t\t\treturn hardware.hmd\n\t\t})\n\t} else {\n\t\treturn when.resolve()\n\t}\n}\n\nhardware.hasVRDisplays = function() {\n\treturn hardware.getVRDisplays()\n\t.then(function(display) {\n\t\treturn !!display\n\t})\n}\n\n// the functions below are required by eg. 0.8\nhardware.sensor = null\n\n// @deprecated\nhardware.ifVR = function(cb) {\n\treturn hardware.hmd || hardware.hasVRDisplays(cb)\n}\n\n// @deprecated\nhardware.detect = function() {\n\treturn hardware.ifVR()\n}\n"
  },
  {
    "path": "browser/scripts/loaders/assetLoader.js",
    "content": "(function() {\n\nif (typeof(module) !== 'undefined') {\n\tEventEmitter = require('events').EventEmitter\n\twhen = require('when')\n\tE2 = require('../core').E2\n}\n\nvar loadingPlugins = E2.LOADING_NODES\n\n// ------------------------------------------------\n\nfunction AssetLoader(loaders) {\n\tEventEmitter.call(this)\n\n\tthis.loadingTexture = THREE.ImageUtils.loadTexture('/data/textures/loadingtex.png')\n\tthis.loadingTexture.wrapS = THREE.RepeatWrapping\n\tthis.loadingTexture.wrapT = THREE.RepeatWrapping\n\n\tthis.defaultTexture = THREE.ImageUtils.loadTexture('/data/textures/defaulttex.png')\n\tthis.defaultTexture.wrapS = THREE.RepeatWrapping\n\tthis.defaultTexture.wrapT = THREE.RepeatWrapping\n\n\tvar defaultLoaders = {\n\t\timage: E2.Loaders.ImageLoader,\n\t\ttexture: E2.Loaders.TextureLoader,\n\t\tmodel: E2.Loaders.ModelLoader,\n\t\tscene: E2.Loaders.SceneLoader,\n\t\taudiobuffer: E2.Loaders.AudioBufferLoader,\n\t\tvideo: E2.Loaders.VideoLoader,\n\t}\n\n\tthis.loaders = loaders || defaultLoaders\n\n\tthis.assetPromises = {}\n\n\tthis.assetsLoaded = 0\n\tthis.assetsFound = 0\n}\n\nAssetLoader.getCDNURL = function(url) {\n\treturn url.replace(/^\\/data/, AssetLoader.getCDNRoot())\n}\n\nAssetLoader.getCDNRoot = function() {\n\treturn typeof(Vizor) !== 'undefined' ? Vizor.cdnRoot : '/data'\n}\n\nAssetLoader.prototype = Object.create(EventEmitter.prototype)\n\n/**\n * load a single asset of type from url, affecting total percentage\n */\nAssetLoader.prototype.loadAsset = function(assetType, assetUrl) {\n\tvar that = this\n\tvar dfd = when.defer()\n\n\t// fetch assets from CDN in production\n\t// MongoDB GridFS in dev/ci\n\tassetUrl = assetUrl.replace(/^\\/data/, AssetLoader.getCDNRoot())\n\n\tif (this.assetPromises[assetUrl]) {\n\t\tvar cache = this.assetPromises[assetUrl]\n\n\t\tif (cache.progress < 1)\n\t\t\treturn cache.promise\n\n\t\tdfd.resolve(this.assetPromises[assetUrl].asset)\n\t} else {\n\t\tif (!this.assetPromises[assetUrl])\n\t\t\tthis.assetsFound++\n\n\t\tthis.assetPromises[assetUrl] = {\n\t\t\tpromise: dfd.promise,\n\t\t\tprogress: 0\n\t\t}\n\n\t\tvar loader = new (this.loaders[assetType])(assetUrl)\n\t\tloader\n\t\t.on('progress', function(assetPct) {\n\t\t\tvar pct = 0\n\n\t\t\tthat.assetPromises[assetUrl].progress = assetPct\n\n\t\t\tObject.keys(that.assetPromises)\n\t\t\t.map(function(assetUrl) {\n\t\t\t\tpct += that.assetPromises[assetUrl].progress\n\t\t\t})\n\n\t\t\tpct = pct / that.assetsFound\n\t\t\tthat.emit('progress', pct * 100)\n\t\t})\n\t\t.on('error', function(err) {\n\t\t\tthat.assetsFound--;\n\t\t\tdelete that.assetPromises[assetUrl]\n\n\t\t\tmsg('ERROR: AssetLoader failed to load ' + assetUrl +': ' + err.status)\n\n\t\t\tdfd.reject(err)\n\t\t})\n\t\t.on('loaded', function(asset) {\n\t\t\tthat.assetsLoaded++\n\t\t\tthat.assetPromises[assetUrl].asset = asset\n\t\t\tthat.assetPromises[assetUrl].progress = 1\n\t\t\tdfd.resolve(asset)\n\t\t})\n\t}\n\n\treturn dfd.promise\n}\n\n/**\n * load all assets for a graph\n */\nAssetLoader.prototype.loadAssetsForGraph = function(graph) {\n\tvar that = this\n\tvar dfd = when.defer()\n\n\tfunction completed() {\n\t\tthat.emit('progress', 100)\n\t\tdfd.resolve()\n\t}\n\n\tvar assets = this.parse(graph)\n\tvar assetTypes = Object.keys(assets)\n\n\t// if there are no assets to load, just resolve the promise\n\tif (!assetTypes.length) {\n\t\tcompleted()\n\t\treturn dfd.promise\n\t}\n\n\twhen.map(assetTypes, function(assetType) {\n\t\tvar typeAssets = assets[assetType]\n\n\t\tif (!typeAssets.length)\n\t\t\treturn\n\n\t\treturn when.map(typeAssets, function(assetUrl) {\n\t\t\tif (!assetUrl)\n\t\t\t\treturn\n\n\t\t\tconsole.log('Loading', assetType, assetUrl)\n\n\t\t\treturn that.loadAsset(assetType, assetUrl)\n\t\t})\n\t})\n\t.catch(function(err) {\n\t\tdfd.reject(err)\n\t})\n\t.finally(function() {\n\t\tcompleted()\n\t})\n\n\treturn dfd.promise\n}\n\nAssetLoader.prototype.parse = function(graph) {\n\tvar assets = {}\n\n\tfunction findInGraph(subgraph) {\n\t\tif (!subgraph.nodes)\n\t\t\treturn\n\n\t\tsubgraph.nodes.map(function(node) {\n\t\t\tif (E2.GRAPH_NODES.indexOf(node.plugin) > -1)\n\t\t\t\treturn findInGraph(node.graph)\n\n\t\t\tvar assetType = loadingPlugins[node.plugin]\n\n\t\t\tif (!assetType)\n\t\t\t\treturn;\n\n\t\t\tif (!assets[assetType])\n\t\t\t\tassets[assetType] = []\n\n\t\t\tvar urlToLoad = node.state.url\n\n\t\t\tif (E2.util.isMobile && E2.util.isMobile.iOS() && node.state.urllow) {\n\t\t\t\turlToLoad = node.state.urllow\n\t\t\t}\n\n\t\t\tassets[assetType].push(urlToLoad)\n\t\t})\n\t}\n\n\tfindInGraph(graph)\n\n\treturn assets\n}\n\nif (typeof(module) !== 'undefined') {\n\tmodule.exports.AssetLoader = AssetLoader\n} else {\n\twindow.AssetLoader = AssetLoader\n}\n\n})()\n"
  },
  {
    "path": "browser/scripts/loaders/audioBufferLoader.js",
    "content": "(function() {\n\nfunction AudioBufferLoader(url) {\n\tE2.Loader.apply(this, arguments)\n\tvar that = this\n\n\tvar xhr = new XMLHttpRequest()\n\txhr.open('GET', url, true)\n\txhr.crossOrigin = 'Anonymous'\n\txhr.responseType = 'arraybuffer'\n\n\txhr.onerror = function() {\n\t\tthat.errorHandler(new Error(this.status))\n\t}\n\n\txhr.onload = function() {\n\t\tif (this.status >= 400)\n\t\t\treturn this.onerror()\n\n\t\tE2.core.audioContext\n\t\t.decodeAudioData(this.response, function(buffer) {\n\t\t\tthat.onLoaded(buffer)\n\t\t}, function() {\n\t\t\tthat.onLoaded()\n\t\t})\n\t}\n\n\txhr.onprogress = function(evt) {\n\t\tif (evt.total)\n\t\t\tthat.emit('progress', evt.loaded / evt.total)\n\t}\n\n\txhr.send()\n}\n\nAudioBufferLoader.prototype = Object.create(E2.Loader.prototype)\n\nAudioBufferLoader.prototype.onLoaded = function(buf) {\n\tthis.emit('loaded', buf)\n}\n\nE2.Loaders.AudioBufferLoader = AudioBufferLoader\n\nif (typeof(module) !== 'undefined') {\n\tmodule.exports.AudioBufferLoader = AudioBufferLoader\n}\n\n})()\n"
  },
  {
    "path": "browser/scripts/loaders/imageLoader.js",
    "content": "(function() {\n\nfunction ImageLoader(url) {\n\tE2.Loader.apply(this, arguments)\n\tvar that = this\n\n\tfunction loadImage(data) {\n\t\tvar dfd = when.defer()\n\n\t\tvar xhr = new XMLHttpRequest()\n\t\txhr.open('GET', url, true)\n\t\txhr.crossOrigin = 'Anonymous'\n\t\txhr.responseType = 'arraybuffer'\n\n\t\txhr.onerror = function() {\n\t\t\tthat.errorHandler(new Error(this.status))\n\t\t}\n\n\t\txhr.onload = function() {\n\t\t\tconsole.time('Parse image')\n\n\t\t\tif (this.status >= 400) {\n\t\t\t\treturn dfd.reject( xhr.onerror())\n\t\t\t}\n\n\t\t\tvar blob = new Blob([this.response])\n\t\t\tvar img = new Image()\n\t\t\timg.src = window.URL.createObjectURL(blob)\n\t\t\timg.onload = function () {\n\t\t\t\tconsole.timeEnd('Parse image')\n\t\t\t\tdata.img = img\n\t\t\t\treturn dfd.resolve(data)\n\t\t\t}\n\t\t}\n\n\t\txhr.onprogress = function(evt) {\n\t\t\tif (evt.total)\n\t\t\t\tthat.emit('progress', evt.loaded / evt.total)\n\t\t}\n\n\t\txhr.send()\n\n\t\treturn dfd.promise\n\t}\n\n\tfunction loadMetadata(data) {\n\t\tvar dfd = when.defer()\n\n\t\tvar metaUrl = '/meta' + url.replace(AssetLoader.getCDNRoot(), '')\n\n\t\tvar xhr = new XMLHttpRequest()\n\t\txhr.open('GET', metaUrl, true)\n\t\txhr.crossOrigin = 'Anonymous'\n\t\txhr.responseType = 'text'\n\n\t\txhr.onerror = function() {\n\t\t\tdfd.reject(that.errorHandler(new Error(this.status)))\n\t\t}\n\n\t\txhr.onload = function() {\n\t\t\tvar result = {}\n\n\t\t\tif (this.status < 400 && this.responseText) {\n\t\t\t\tresult = JSON.parse(this.responseText)\n\t\t\t}\n\n\t\t\tdata.metadata = result\n\t\t\tdfd.resolve(data)\n\t\t}\n\n\t\txhr.send()\n\n\t\treturn dfd.promise\n\t}\n\n\tvar data = {}\n\n\tloadImage(data).then(function(data) {\n\t\treturn loadMetadata(data)\n\t}).then(function(data) {\n\t\treturn that.onImageLoaded(data.img, data.metadata)\n\t})\n}\n\nImageLoader.prototype = Object.create(E2.Loader.prototype)\nImageLoader.prototype.onImageLoaded = function(img) {\n\tthis.emit('loaded', img)\n}\n\nE2.Loaders.ImageLoader = ImageLoader\n\nif (typeof(module) !== 'undefined') {\n\tmodule.exports.ImageLoader = ImageLoader\n}\n\n})()\n"
  },
  {
    "path": "browser/scripts/loaders/loader.js",
    "content": "(function() {\n\nfunction Loader() {\n\tEventEmitter.call(this)\n}\nLoader.prototype = Object.create(EventEmitter.prototype)\n\nLoader.prototype.errorHandler = function(err) {\n\tthis.emit('error', err)\n}\n\nLoader.prototype.progressHandler = function(xhr) {\n\tif (!xhr.total) {\n\t\tlengthKnown = false\n\t\treturn;\n\t}\n\n\tthis.emit('progress', xhr.loaded / xhr.total)\n}\n\nE2.Loader = Loader\nE2.Loaders = {}\n\nif (typeof(module) !== 'undefined') {\n\tmodule.exports.Loader = Loader\n}\n\n})()\n"
  },
  {
    "path": "browser/scripts/loaders/modelLoader.js",
    "content": "(function() {\n\nif (typeof(module) !== 'undefined')\n\tE2.Loader = require('./loader.js').Loader\n\nfunction ModelLoader(url) {\n\tE2.Loader.apply(this, arguments)\n\n\tvar extname = url.substring(url.lastIndexOf('.')).toLowerCase()\n\tswitch(extname) {\n\t\tcase '.obj':\n\t\t\tthis.loadObj(url)\n\t\t\tbreak;\n\t\tcase '.js':\n\t\tcase '.json':\n\t\tcase '.dae':\n\t\tcase '.fbx':\n\t\tcase '.gltf':\n\t\t\tthis.loadObject3D(url)\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tmsg('ERROR: Don`t know how to load', url, extname)\n\t\t\tbreak;\n\t}\n}\n\nModelLoader.prototype = Object.create(E2.Loader.prototype)\n\nModelLoader.prototype.loadObject3D = function(url) {\n\tvar loader = new THREE.JSONLoader()\n\tloader.crossOrigin = 'Anonymous'\n\tloader.load(url,\n\t\tthis.onJsonLoaded.bind(this),\n\t\tthis.progressHandler.bind(this),\n\t\tthis.errorHandler.bind(this)\n\t)\n}\n\nModelLoader.prototype.loadObj = function(url) {\n\tvar that = this\n\tvar mtlUrl = url.replace('.obj', '.mtl')\n\tvar statUrl = '/stat' + mtlUrl.replace(AssetLoader.getCDNRoot(), '')\n\n\t$.get(statUrl, function(data) {\n\t\tif (data.error === undefined) {\n\t\t\t// .mtl exists on server, load .obj and .mtl\n\t\t\tvar mtlLoader = new THREE.MTLLoader()\n\t\t\tmtlLoader.crossOrigin = 'anonymous'\n\t\t\tmtlLoader.setPath('')\n\t\t\tmtlLoader.setBaseUrl(mtlUrl.substring(0, mtlUrl.lastIndexOf('/')+1))\n\t\t\tmtlLoader.load(mtlUrl, function(materials) {\n\t\t\t\tvar objLoader = new THREE.OBJLoader()\n\t\t\t\tobjLoader.crossOrigin = 'anonymous'\n\t\t\t\tobjLoader.setMaterials(materials)\n\t\t\t\tobjLoader.load(url,\n\t\t\t\t\tthat.onObjLoaded.bind(that),\n\t\t\t\t\tthat.progressHandler.bind(that),\n\t\t\t\t\tthat.errorHandler.bind(that))\n\t\t\t}, that.progressHandler.bind(that), that.errorHandler.bind(that))\n\t\t}\n\t\telse {\n\t\t\t// no .mtl on server, load .obj only\n\t\t\tvar loader = new THREE.OBJLoader()\n\t\t\tloader.crossOrigin = 'anonymous'\n\t\t\tloader.load(url,\n\t\t\t\tthat.onObjLoaded.bind(that),\n\t\t\t\tthat.progressHandler.bind(that),\n\t\t\t\tthat.errorHandler.bind(that))\n\t\t}\n\t})\n}\n\nModelLoader.prototype.onObjLoaded = function(geoms, mats) {\n\tthis.emit('loaded', {\n\t\tgeometries: geoms,\n\t\tmaterials: mats\n\t})\n}\n\nModelLoader.prototype.onJsonLoaded = function(geoms, mats) {\n\treturn this.onObjLoaded([geoms], mats)\n}\n\nE2.Loaders.ModelLoader = ModelLoader\n\nif (typeof(module) !== 'undefined') {\n\tmodule.exports.ModelLoader = ModelLoader\n}\n\n})()\n"
  },
  {
    "path": "browser/scripts/loaders/multiObjectLoader.js",
    "content": "// three.js .json loader wrapping functionality of THREE.JSONLoader, THREE.ObjectLoader and THREE.SceneLoader\n// so that one loader can be used to load them all\n\nfunction MultiObjectLoader(manager) {\n\tthis.manager = (manager !== undefined) ? manager : THREE.DefaultLoadingManager\n\n\tthis.objectLoader = new THREE.ObjectLoader(manager)\n\tthis.sceneLoader = new THREE.SceneLoader(manager)\n\tthis.jsonLoader = new THREE.JSONLoader(manager)\n\tif (!window.gltfLoader) {\n\t\twindow.gltfLoader = new THREE.glTFLoader(true)\n\t}\n\tthis.gltfLoader = window.gltfLoader//new THREE.glTFLoader(true)\n\tthis.daeLoader = new THREE.ColladaLoader()\n\tthis.fbxLoader = new THREE.FBXLoader(true, manager)\n\n\tthis.texturePath = ''\n}\n\nMultiObjectLoader.prototype = {\n\tconstructor: MultiObjectLoader,\n\n\tload: function (url, onGeomsMatsLoaded, onObject3DLoaded, onProgress, onError) {\n\t\tvar that = this\n\n\t\tif ( this.texturePath === '' ) {\n\t\t\tthis.setTexturePath(url.substring( 0, url.lastIndexOf( '/' ) + 1 ))\n\t\t}\n\n\t\tif (url.toLowerCase().indexOf('.gltf') !== -1) {\n\t\t\t// gltf\n\t\t\tthis.gltfLoader.load(url, function(data) {\n\t\t\t\tonObject3DLoaded(data)\n\t\t\t})\n\t\t}\n\t\telse if (url.toLowerCase().indexOf('.dae') !== -1) {\n\t\t\tthis.daeLoader.load(url, function(data) {\n\t\t\t\tonObject3DLoaded(data)\n\t\t\t}, onProgress, onError)\n\t\t}\n\t\telse if (url.toLowerCase().indexOf('.fbx') !== -1) {\n\t\t\tthis.fbxLoader.load(url, function(data) {\n\t\t\t\tonObject3DLoaded(data)\n\t\t\t}, onProgress, onError)\n\t\t}\n\t\telse {\n\t\t\tvar loader = new THREE.XHRLoader(this.manager)\n\t\t\t//loader.setCrossOrigin(this.crossOrigin)\n\t\t\tloader.load(url, function(text) {\n\t\t\t\tvar json = JSON.parse(text)\n\t\t\t\tvar metadata = json.metadata\n\n\t\t\t\tif (metadata && (metadata.type === 'object' || metadata.type === 'Object')) {\n\t\t\t\t\t// THREE.ObjectLoader\n\t\t\t\t\tthat.objectLoader.parse(json, onObject3DLoaded)\n\t\t\t\t}\n\t\t\t\telse if (metadata && (metadata.type === 'scene' || metadata.type === 'Scene')) {\n\t\t\t\t\t// THREE.SceneLoader\n\t\t\t\t\tthat.sceneLoader.parse(json, onObject3DLoaded, url)\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// THREE.JSONLoader\n\t\t\t\t\tvar object = that.jsonLoader.parse(json, that.jsonLoader.texturePath)\n\t\t\t\t\tonGeomsMatsLoaded([object.geometry], object.materials)\n\t\t\t\t}\n\t\t\t}, onProgress, onError)\n\n\t\t}\n\t},\n\n\tsetCrossOrigin: function (value) {\n\t\tthis.objectLoader.crossOrigin = value\n\t\tthis.sceneLoader.crossOrigin = value\n\t\tthis.jsonLoader.crossOrigin = value\n\t\tthis.gltfLoader.crossOrigin = value\n\t},\n\n\tsetTexturePath: function (value) {\n\t\tthis.texturePath = value\n\n\t\tthis.objectLoader.texturePath = value\n\t\tthis.jsonLoader.texturePath = value\n\n\t\t// this.sceneLoader has no texturePath\n\t},\n\n\taddGeometryHandler: function (typeID, loaderClass) {\n\t\tthis.sceneLoader.addGeometryHandler(loaderClass)\n\t},\n\n\taddHierarchyHandler: function (typeID, loaderClass) {\n\t\tthis.sceneLoader.addHierarchyHandler(loaderClass)\n\t}\n}"
  },
  {
    "path": "browser/scripts/loaders/sceneLoader.js",
    "content": "(function() {\n\nfunction SceneLoader() {\n\tE2.Loaders.ModelLoader.apply(this, arguments)\n}\nSceneLoader.prototype = Object.create(E2.Loaders.ModelLoader.prototype)\n\nSceneLoader.prototype.loadObject3D = function(url) {\n\tif (!this.loader) {\n\t\tthis.loader = new MultiObjectLoader()\n\t}\n\n\tthis.loader.crossOrigin = 'Anonymous'\n\tthis.loader.load(\n\t\t\turl,\n\t\t\tthis.onObjLoaded.bind(this),\n\t\t\tthis.onHierarchyLoaded.bind(this),\n\t\t\tthis.progressHandler.bind(this),\n\t\t\tthis.errorHandler.bind(this))\n}\n\nSceneLoader.prototype.onHierarchyLoaded = function(scene) {\n\tif (scene.animations) {\n\t\tvar len = scene.animations.length\n\t\tfor (var i = 0; i < len; ++i) {\n\t\t\tvar animation = scene.animations[i]\n\t\t\tanimation.loop = true\n\t\t\tanimation.play()\n\t\t}\n\t}\n\n\tif (scene.scene) {\n\t\tif (scene.scene instanceof THREE.Object3D) {\n\t\t\tthis.object3d = scene.scene\n\t\t}\n\t\telse {\n\t\t\tthis.object3d = new THREE.Object3D()\n\t\t\tthis.object3d.copy(scene.scene, /*recursive = */false)\n\n\t\t\twhile (scene.scene.children.length > 0) {\n\t\t\t\tvar obj = scene.scene.children[0]\n\t\t\t\tscene.scene.remove(obj)\n\t\t\t\tthis.object3d.add(obj)\n\t\t\t}\n\t\t}\n\t}\n\telse {\n\t\tthis.object3d = scene\n\t}\n\n\tthis.emit('loaded', this.object3d)\n}\n\nSceneLoader.prototype.onObjLoaded = function(geoms, mats) {\n\tvar hasMorphAnimations = geoms.length > 0 && geoms[0].morphTargets && geoms[0].morphTargets.length > 0\n\n\tvar createMesh = hasMorphAnimations ?\n\t\t\tfunction(geom, mat) {return new THREE.MorphAnimMesh(geom, mat)}\n\t\t:   function(geom, mat) {return new THREE.Mesh(geom, mat)}\n\n\tif (geoms.length === 1 && mats.length === 1) {\n\t\tthis.object3d = createMesh(geoms[0], mats[0])\n\t}\n\telse if (geoms.length > 1 && mats.length === geoms.length) {\n\t\tthis.object3d = new THREE.Group()\n\n\t\tfor (var i = 0; i < geoms.length; ++i) {\n\t\t\tthis.object3d.add(createMesh(geoms[i], mats[i]))\n\t\t}\n\t}\n\telse if (geoms.length === 1) {\n\t\tthis.object3d = THREE.SceneUtils.createMultiMaterialObject(geoms[0], mats)\n\t}\n\telse {\n\t\tconsole.error('ThreeLoaderScenePlugin: Invalid geometry + material combination', geoms.length, 'geometries', mats.length, 'materials')\n\t}\n\n\tthis.emit('loaded', this.object3d)\n}\n\nE2.Loaders.SceneLoader = SceneLoader\n\nif (typeof(module) !== 'undefined') {\n\tmodule.exports.SceneLoader = SceneLoader\n}\n\n})()\n"
  },
  {
    "path": "browser/scripts/loaders/textureLoader.js",
    "content": "(function() {\n\nfunction TextureLoader() {\n\tE2.Loaders.ImageLoader.apply(this, arguments)\n}\n\nTextureLoader.prototype = Object.create(E2.Loaders.ImageLoader.prototype)\n\nTextureLoader.prototype.onImageLoaded = function(img, metadata) {\n\tvar texture = new THREE.Texture()\n\ttexture.wrapS = THREE.RepeatWrapping\n\ttexture.wrapT = THREE.RepeatWrapping\n\ttexture.image = img\n\ttexture.needsUpdate = true\n\n\ttexture.vizorMetadata = metadata\n\n\tthis.emit('loaded', texture)\n}\n\nE2.Loaders.TextureLoader = TextureLoader\n\nif (typeof(module) !== 'undefined') {\n\tmodule.exports.TextureLoader = TextureLoader\n}\n\n})()\n"
  },
  {
    "path": "browser/scripts/loaders/videoLoader.js",
    "content": "(function() {\n\nfunction VideoLoader(url) {\n\tE2.Loader.apply(this, arguments)\n\tvar that = this\n\n\tfunction loadVideo() {\n\t\tvar dfd = when.defer()\n\n\t\tvar video = document.createElement('video')\n\t\tvideo.crossOrigin = 'Anonymous'\n\t\tvideo.loop = true\n\t\tvideo.preload = 'auto'\n\t\tvideo.controls = false\n\n\t\tvideo.addEventListener('loadstart', function() {\n\t\t\treturn dfd.resolve({\n\t\t\t\tvideo: video\n\t\t\t})\n\t\t})\n\n\t\tvideo.addEventListener('error', function() {\n\t\t\tthat.errorHandler(new Error(this.status))\n\t\t\tvideo = null\n\t\t})\n\n\t\tvideo.src = url\n\n\t\treturn dfd.promise\n\t}\n\n\tloadVideo().then(function(data) {\n\t\treturn that.onVideoLoaded(data.video)\n\t})\n}\n\nVideoLoader.prototype = Object.create(E2.Loader.prototype)\nVideoLoader.prototype.onVideoLoaded = function(video) {\n\tthis.emit('loaded', video)\n}\n\nE2.Loaders.VideoLoader = VideoLoader\n\nif (typeof(module) !== 'undefined') {\n\tmodule.exports.VideoLoader = VideoLoader\n}\n\n})()\n"
  },
  {
    "path": "browser/scripts/mid-pane.js",
    "content": "(function() {\n\nfunction MidPane() {\n\tvar that = this\n\tthis._tabs = []\n\n\tthis._$pane = $('#shader-block')\n\tthis._$tabs = $('ul.nav-tabs', this._$pane)\n\tthis._$tabContent = $('.tab-content', this._$pane)\n\n\tjQuery('div.block-header button').off('.midpane')\n\tjQuery('div.block-header button.close-button', this._$pane).on('click.midpane', this.close.bind(this))\n\tjQuery('div.block-header button.toggle-button', this._$pane).on('click.midpane', function(){\n\t\tthat._$pane.toggleClass('collapsed')\n\t\tjQuery('div.tab-content', that._$pane).toggle()\n\t\treturn false\n\t})\n\t// @todo #761\n}\n\nMidPane.prototype._tabClosed = function(tab) {\n\tthis._tabs = this._tabs.filter(function(t) {\n\t\treturn t.$li !== tab.$li\n\t})\n\n\tif (!this._tabs.length)\n\t\tthis.close()\n\n\ttab.onClose()\n}\n\nMidPane.prototype.show = function() {\n\tif (this._$pane.hasClass('uiopen')) return false\n\tthis._$pane.addClass('uiopen').show()\n\tE2.app.onWindowResize()\n\treturn true\n}\n\nMidPane.prototype.closeAll = function() {\n\tthis._$tabs.empty()\n\tthis._$tabContent.empty()\n\tthis._tabs.forEach(this._tabClosed.bind(this))\n}\n\nMidPane.prototype.close = function() {\n\tthis._$pane.removeClass('uiopen').hide()\n\tE2.app.onWindowResize()\n\treturn true\n}\n\n// @returns tab body after creating tab header and content divs\nMidPane.prototype.newTab = function newTab(name, closeCb) {\n\tvar that = this\n\n\tthis.show()\n\n\tvar id = 'tab-'+Date.now()\n\tvar $li = $('<li>'+\n\t\t'<a href=\"#'+id+'\" role=\"tab\" data-toggle=\"tab\">'+name+\n\t\t\t'<i class=\"fa fa-close fa-sm pull-right tab-close-button\"></i>'+\n\t\t'</a></li>');\n\n\tfunction updateActive() {\n\t\t$('li', that._$pane).removeClass('active')\n\t\t$('li:last', that._$pane).addClass('active')\n\t\t$('.tab-pane', that._$pane).removeClass('active')\n\t\t$('.tab-pane:last', that._$pane).addClass('active')\n\t}\n\n\tfunction closeTab() {\n\t\tif (!$li)\n\t\t\treturn\n\t\t$li.remove()\n\t\t$li = null\n\t\t$tabBody.remove()\n\t\t$content.remove()\n\t\tupdateActive()\n\t\tthat._tabClosed(tab)\n\t}\n\n\tthis._$tabs.append($li)\n\tvar tab = {\n\t\t$li: $li,\n\t\tonClose: closeCb\n\t}\n\tthis._tabs.push(tab)\n\n\tvar $content = $('<div role=\"tabpanel\" class=\"tab-pane\" id=\"'+id+'\">'+\n\t\t'<div class=\"tab-body\"></div>'+\n\t'</div>');\n\n\tthis._$tabContent.append($content)\n\tvar $tabBody = $('.tab-body', $content)\n\n\t$li.find('.tab-close-button').click(closeTab)\n\n\tupdateActive()\n\n\treturn {\n\t\tclose: closeTab,\n\t\tshow: function() {\n\t\t\tthat.show()\n\t\t\t$li.find('a:first').click()\n\t\t},\n\t\tbody: $tabBody\n\t}\n}\n\nE2.MidPane = MidPane;\n\n})();\n\n"
  },
  {
    "path": "browser/scripts/models.js",
    "content": "(function() {\n\twindow.User = Backbone.Model.extend({})\n\n\twindow.FileList = Backbone.Model.extend({\n\t\tinitialize: function() {\n\t\t\tthis._items = []\n\t\t\tthis.set('files', this._items)\n\t\t},\n\n\t\taddFile: function(file) {\n\t\t\tvar files = [file]\n\t\t\tthis._items = files.concat(this.get('files'))\n\t\t\tthis.set('files', this._items)\n\t\t},\n\n\t\tsetFiles: function(files) {\n\t\t\tthis._items = files\n\t\t\tthis.set('files', this._items)\n\t\t},\n\n\t\tfilterByTags: function(tags) {\n\t\t\tif (!tags) {\n\t\t\t\tthis.set('files', this._items)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tvar filtered = this._items.filter(function(file) {\n\t\t\t\treturn tags.every(function(tag) {\n\t\t\t\t\treturn file.tags.indexOf(tag) > -1\n\t\t\t\t})\n\t\t\t})\n\n\t\t\tthis.set('files', filtered)\n\t\t}\n\t})\n})()\n"
  },
  {
    "path": "browser/scripts/movable.js",
    "content": "(function($) {\n\t$.fn.movable = function(options) {\n\tvar $dragEl = $(this)\n\t\n\tif (options && options.handle) {\n\t\t$dragEl = options.handle;\n\t} else {\n\t\t$dragEl.prepend('<div class=\"drag-handle\"></div>');\n\t\t$dragEl = $dragEl.find('.drag-handle');\n\t};\n\n\tvar uimoved = (typeof uiEvent !== 'undefined') ? uiEvent.moved : 'uiMoved';\n\tvar $dragged = $(this);\n\t\t$dragEl\n\t\t\t.on('mousedown touchstart', function(e) {\n\t\t\t\tvar viewport = E2.dom.canvases;\n\t\t\t\tvar x = $dragged.offset().left - e.pageX;\n\t\t\t\tvar\ty = $dragged.offset().top - e.pageY;\n\t\t\t\tvar uiw = viewport.width();\n\t\t\t\tvar uih = viewport.height();\n\t\t\t\tvar co =  viewport.offset();\n\t\t\t\tvar dhw = $dragEl.outerWidth(true);\n\t\t\t\tvar dhh = $dragEl.outerHeight(true);\n\t\t\t\tvar bhh = $dragged.find('.block-header').outerHeight(true);\n\t\t\t\tvar minl = 0;\n\t\t\t\tvar maxl = uiw - dhw;\n\t\t\t\tvar mint = co.top; \n\t\t\t\tvar maxt = co.top + uih - dhh - bhh;\n\t\t\t\tvar newLeft = x;\n\t\t\t\tvar newTop = y;\n\t\t\t\t\n\t\t\t\t$(window)\n\t\t\t\t\t.on('mousemove.movable touchmove.movable', function(e) {\n\t\t\t\t\t\tnewLeft = x + e.pageX;\n\t\t\t\t\t\tnewTop = y + e.pageY;\n\t\t\t\t\t\tif (newLeft < minl)\n\t\t\t\t\t\t\tnewLeft = 0;\n\t\t\t\t\t\tif (newLeft > maxl)\n\t\t\t\t\t\t\tnewLeft = maxl;\n\t\t\t\t\t\tif (newTop < mint)\n\t\t\t\t\t\t\tnewTop = mint;\n\t\t\t\t\t\tif (newTop > maxt)\n\t\t\t\t\t\t\tnewTop = maxt;\n\t\t\t\t\t\t$dragged.css({\n\t\t\t\t\t\t\t\t\t'bottom': 'auto', \n\t\t\t\t\t\t\t\t\t'right': 'auto'\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.offset({\n\t\t\t\t\t\t\t\t\tleft: newLeft,\n\t\t\t\t\t\t\t\t\ttop: newTop\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t})\n\t\t\t\t\t.one('mouseup touchend touchcancel', function() {\n\t\t\t\t\t\t$dragEl.trigger(uimoved);\n\t\t\t\t\t\t$(this).off('mousemove.movable touchmove.movable click.movable');\n\t\t\t\t\t});\n\t\t\t\te.preventDefault();\n\t\t\t\treturn false;\n\t\t\t})\n\t\t\t.one('mouseup touchend touchcancel', function() {\n\t\t\t\t$(this).off('mousemove.movable touchmove.movable click.movable');\n\t\t\t});\n\t\treturn this;\n\t};\n})(jQuery);"
  },
  {
    "path": "browser/scripts/node-ui-enum.js",
    "content": "var uiNodeEventType = {\n\tpositionChanged : 'uiPositionChanged'\n};\n\n/**\n * Below values are arbitrary for the purposes of UI development.\n * They are used to set a default css class for every type of known node.\n */\nvar uiNodeCategory = {\n\tgeneric: \t\t'generic',\t\t//\n\tcompound:\t\t'compound',\t\t// subgraphs\n\tvalue:\t\t\t'value',\t\t// 0.1, true\n\tlogic:\t\t\t'logic',\t\t// && || !\n\tmath:\t\t\t'math',\t\t\t// +, -, atan2\n\ttime: \t\t\t'time',\t\t\t// clocks, etc\n\tconvert: \t\t'convert',\t\t// vec3d > x,y,z, \"string\" > float\n\tloader:\t\t\t'loader',\t\t// loads content\n\tdata:\t\t\t'data',\t\t\t// {json:\"rocks\", since: 2002}\n\ttext:\t\t\t'text',\t\t\t// \"hello world\"\n\tio:\t\t\t\t'io',\t\t\t// ports, proxies, beacons, etc.\n\tinteraction:\t'interaction',\t// e.g. keypress, mouse button\n\trenderer:\t\t'renderer',\t\t//\n\tenvironment:\t'environment',\t// scene, environment, camera\n\tlight:\t\t\t'light',\t\t//\n\tmaterial:\t\t'material',\t\t//\n\ttexture:\t\t'texture',\t\t// bjõõtifül imaajes\n\tgeometry:\t\t'geometry',\t\t// mesh, etc.\n\tmedia:\t\t\t'media',\t\t// audio, video, etc.\n\tmeta:\t\t\t'meta'\t\t\t// annotations, control, player events, anything else about the scene that isn't the scene itself\n};\n\nvar uiNodeCategoryMap = {};\n\n/**\n * Maps plugin ID (e.g. three_scene) to uiNodeCategory\n */\n(function(){\n\tvar c = uiNodeCategory;\n\tuiNodeCategoryMap = {\n\t\t'graph': \t\t\tc.compound,\n\t\t'loop': \t\t\tc.compound,\n\t\t'array_function': \tc.compound,\n\t\t'entity': \t\t\tc.compound,\n\t\t'threesixty_photo_entity':\tc.compound,\n\t\t'entity_component': c.compound,\n\n\t\t'three_scene' : \t\t\t\tc.environment,\n\t\t'three_environment_settings' : \tc.environment,\n\t\t'three_vr_camera'\t\t\t: c.environment,\n\t\t'three_perspective_camera'\t: c.environment,\n\t\t'three_screen_space_transform_extractor'\t: c.environment,\n\t\t'three_webgl_renderer' : \t\tc.renderer,\n\t\t'three_webgl_texture_renderer':\tc.renderer,\n\n\t\t'output_proxy': \t\tc.io,\n\t\t'input_proxy': \t\t\tc.io,\n\t\t'variable_local_read':\tc.io,\n\t\t'variable_local_write':\tc.io,\n\t\t'variable_local_write_conditional':\tc.io,\n\n\t\t'three_mesh'\t: c.geometry,\n\t\t'three_geometry_box'\t: c.geometry,\n\t\t'three_geometry_circle'\t: c.geometry,\n\t\t'three_geometry_cylinder'\t: c.geometry,\n\t\t'three_geometry_dodecahedron'\t: c.geometry,\n\t\t'three_geometry_sphere'\t: c.geometry,\n\t\t'three_geometry_plane'\t: c.geometry,\n\t\t'three_procedural_ground'\t: c.geometry,\n\t\t'three_point_cloud_mesh'\t: c.geometry,\n\t\t'three_particle_emitter'\t: c.geometry,\n\t\t'three_line_segments'\t: c.geometry,\n\t\t'three_object3d_attribute_extractor'\t: c.geometry,\t// position, rotation, scale\n\t\t'stereo_cube_map'\t\t: c.geometry,\n\n\t\t'three_loader_model'\t: c.loader,\n\t\t'three_loader_scene'\t: c.loader,\n\t\t'url_array_generator'\t: c.loader,\n\t\t'url_audio_generator'\t: c.loader,\n\t\t'url_audio_buffer_generator'\t: c.loader,\n\t\t'url_video_generator'\t: c.loader,\n\t\t'url_json_generator'\t: c.loader,\n\n\t\t'three_material' : c.material,\n\t\t'three_material_depth' : c.material,\n        'three_material_lambert' : c.material,\n        'three_material_phong' : c.material,\n        'three_material_shader' : c.material,\n        'three_point_cloud_material' : c.material,\n        'three_material_modifier' : c.material,\n        'three_uv_modifier' : c.material,\n        'three_line_material' : c.material,\n        'three_material_extractor' : c.material,\n\n        'three_ambient_light' :     c.light,\n        'three_directional_light' : c.light,\n        'three_point_light' :       c.light,\n\t\t'three_spot_light' :        c.light,\n\t\t'three_hemisphere_light' :  c.light,\n\n\t\t'url_texture_generator'\t: \tc.texture,\n\n\t\t'action_button' : \t\t\tc.value,\n        'blend_mode_generator' : \tc.value,\n        'color_picker' : \t\t\tc.value,\n        'text_editor_generator' : \tc.value,\n        'const_float_generator' : \tc.value,\n        'knob_float_generator' : \tc.value,\n        'label_generator' : \t\tc.value,\n        'pi_generator' : \t\t\tc.value,\n        'random_float_generator' : \tc.value,\n        'slider_float_generator' : \tc.value,\n        'const_text_generator' : \tc.value,\n        'toggle_button' : \t\t\tc.value,\n        'object_add' : \t\t\t\tc.value,\n        'envelope_modulator' : \t\tc.value,\n\n\n\t\t'absolute_modulator' : c.math,\n        'cos_modulator' \t: c.math,\n        'exp_modulator' \t: c.math,\n        'log_modulator' \t: c.math,\n        'max_modulator' \t: c.math,\n        'min_modulator' \t: c.math,\n        'sin_modulator' \t: c.math,\n        'sqrt_modulator' \t: c.math,\n        'tan_modulator' \t: c.math,\n        'atan_modulator' \t: c.math,\n        'atan2_modulator' \t: c.math,\n        'ceiling_modulator' : c.math,\n        'floor_modulator'\t: c.math,\n        'round_modulator'\t: c.math,\n        'accumulate_modulator' : c.math,\n        'clamped_accumulate_modulator' : c.math,\n        'delta_modulator'\t: c.math,\n        'add_modulator'\t\t: c.math,\n        'clamp_modulator'\t: c.math,\n        'divide_modulator'\t: c.math,\n        'modulate_modulator': c.math,\n        'multiply_modulator': c.math,\n        'negate_modulator'\t: c.math,\n        'subtract_modulator': c.math,\n        'lowpass_filter_modulator' : c.math,\n        'sample_and_hold_modulator' : c.math,\n\n\n\t\t'if_modulator'\t\t: c.logic,\n        'if_else_modulator'\t: c.logic,\n        'equals_modulator'\t: c.logic,\n        'ne_modulator'\t\t: c.logic,\n        'less_than_modulator' : c.logic,\n        'lte_modulator'\t\t: c.logic,\n        'more_than_modulator' : c.logic,\n        'gte_modulator'\t\t: c.logic,\n        'near_eq_modulator'\t: c.logic,\n        'and_modulator'\t\t: c.logic,\n        'nand_modulator'\t: c.logic,\n        'not_modulator'\t\t: c.logic,\n        'or_modulator'\t\t: c.logic,\n        'xor_modulator'\t\t: c.logic,\n        'switch_modulator'\t: c.logic,\n        'array_switch_modulator' : c.logic,\n        'toggle_modulator'\t: c.logic,\n        'change_trigger'\t: c.logic,\n\n        'three_gaze_clicker'\t: c.interaction,\n\t\t'three_clickable_object': c.interaction,\n\t\t'key_press_generator'\t: c.interaction,\n        'touching_generator'\t: c.interaction,\n        'touch_start_generator'\t: c.interaction,\n        'touch_end_generator'\t: c.interaction,\n        'mouse_button_generator': c.interaction,\n        'mouse_position_generator': c.interaction,\n        'mouse_wheel_generator'\t: c.interaction,\n        'gamepad_generator'\t\t: c.interaction,\n        'vive_controller'\t\t: c.interaction,\n\n        'parse_json_modulator'\t: c.data,\n\n\t\t'annotation'\t\t\t\t\t: c.meta,\n\t\t'stop_emitter'\t\t\t\t\t: c.meta,\n        'load_graph'\t\t\t\t\t: c.meta,\n        'initialise_generator'\t\t\t: c.meta,\n        'assets_completed_generator' \t: c.meta,\n        'assets_signal_completed_generator' : c.meta,\n        'assets_failed_generator' \t\t: c.meta,\n        'assets_signal_failed_generator' : c.meta,\n        'assets_started_generator' \t\t: c.meta,\n        'assets_signal_started_generator' : c.meta,\n\t\t\t\t'ga_pageview'\t\t\t\t\t: c.meta,\n\t\t\t\t'google_analytics'\t\t: c.meta,\n\n\t\t'runtime_event_write'\t\t\t: c.meta,\n\t\t'runtime_event_write_continuous': c.meta,\n\t\t'runtime_event_read'\t\t\t: c.meta,\n\n\t\t'audio_player'\t\t\t\t\t: c.media,\n\t\t'audio_source_player'\t\t\t: c.media,\n\t\t'module_player'\t\t\t\t\t: c.media,\n\t\t'video_player'\t\t\t\t\t: c.media,\n\n\t\t'audio_get_current_time_modulator'\t: c.time,\n\t\t'clock_generator'\t\t\t\t\t: c.time,\n\t\t'delta_t_generator'\t\t\t\t\t: c.time,\n\t\t'video_get_current_time_modulator'\t: c.time,\n\n\t\t'texture_from_text_generator'\t\t: c.text,\n\t\t'string_concatenate_modulator'\t\t: c.text\n\n\t\t// everything else is c.generic\n\n\t};\n})();\n\nuiNodeCategoryMap.getCategory = function(plugin_id) {\n\treturn ((typeof uiNodeCategoryMap[plugin_id] !== 'undefined') && (uiNodeCategoryMap[plugin_id])) ?\n\t\t\t\tuiNodeCategoryMap[plugin_id] : uiNodeCategory.generic;\n};\n\n// exceptions to general logic follow\n\nvar uiPluginCategoriesThatMustNotDisplayOutputInHeader = []\nvar uiPluginsThatMustNotDisplayOutputInHeader = [\n\t'envelope_modulator'\n]\n\nvar uiPluginsThatForceDisplayOutputInHeader = [\t// override the logic (e.g. when dynamic slots)\n\t'three_scene'\n]\n\nvar uiPluginCategoriesAutoRenamed = [\n\tuiNodeCategory.value\n]\n\nvar uiPluginsThatNeverDisplayInline = [\n\t'variable_local_write_conditional'\n]\n\nvar uiPluginsThatAlwaysDisplayInline = [\n\t'pi_generator',\n\t'clock_generator',\n\t'delta_t_generator',\n\t'initialise_generator',\n\t'assets_completed_generator',\n\t'assets_failed_generator',\n\t'assets_started_generator',\n\t'mouse_wheel_generator'\n]\n"
  },
  {
    "path": "browser/scripts/node-ui.js",
    "content": "function UIpoint(x,y,z) {\n\tthis.x = x || 0;\n\tthis.y = y || 0;\n\tthis.z = z || 0;\n}\n\nfunction NodeUI(parent_node, x, y, z) {\n\tEventEmitter.call(this);\n\tvar that = this\n\n\tthis.nid = 'n' + parent_node.uid;\n\tthis._id = E2.uid();\n\tthis._destroying = false;\n\tthis._destroyed = false;\n\tthis.flags = {\n\t\t_set\t\t\t\t: false,\n\t\thas_subgraph\t: false,\n\t\thas_plugin_ui \t: false,\n\t\thas_inputs \t\t: false,\n\t\thas_outputs \t: false,\n\t\thas_dynamic_slots : false,\n\t\thas_preferences : false,\n\t\thas_edit \t\t: false,\n\t\tsingle_in \t\t: false,\n\t\tsingle_out \t\t: false\n\t};\n\n\tthis._ttdata = null;\t\t// used for tooltip switching\n\n\t/** @var Node */\n\tthis.parent_node = parent_node;\t\t// the node we represent\n\tthis.selected = false;\n\n\t/* jQueries */\n\tthis.inputCol = null;\n\tthis.outputCol = null;\n\tthis.inlineIn = null;\n\tthis.inlineOut = null;\n\tthis.header = null;\n\tthis.content = null;\n\tthis.pluginContainer = null;\n\tthis.pluginUI = null;\n\n\t// use .setPosition() to modify these\n\tthis.x = x || 0;\n\tthis.y = y || 0;\n\tthis.z = z || 0;\n\tthis.position = new UIpoint(x,y,z);\n\n\tthis.sl = E2.app.scrollOffset[0];\n\tthis.st = E2.app.scrollOffset[1];\n\n\tthis.dom \t\t= make('div');\t// plugins (e.g. subgraph) may attempt to add css classes to this. ideally they shouldn't\n\n\t// INIT TEMPLATE\n\n\tvar viewdata = {\n\t\tinlineIn: \t\tnull,\n\t\tinlineOut: \tnull,\n\t\ttoggle_control: null,\n\t\tedit_control: \tnull,\n\t\tnode_title: \tnull,\n\t\tplugin_inputs: \tnull,\n\t\tplugin_outputs: null,\n\t\tplugin_content : null\n\t};\n\n\tviewdata.node_title = make('span').text(parent_node.get_disp_name()).html();\n\n\t// RENDER THE TEMPLATE\n\n\tvar $dom \t= this.dom;\n\tvar $header, $content, $edit, $toggle;\n\n\tvar handlebar = null;\n\tif (typeof E2.views.patch_editor !== 'undefined') {\n\t\tvar template_name = 'ui_plugin_' + this.parent_node.plugin.id;\n\t\tif (typeof E2.views.patch_editor[template_name] !== 'undefined')\n\t\t\thandlebar = E2.views.patch_editor[template_name];\n\t\telse\n\t\t\thandlebar = E2.views.patch_editor['ui_plugin__default']\n\t}\n\tif (handlebar) {\n\t\t/* @var $dom jQuery */\n\t\t$dom.html(handlebar(viewdata));\n\t\t$header = this.header = $dom.children('.p_header').first();\n\t\t$content = this.content = $dom.children('.p_content').first();\t// normally contains ins, outs, and the plugin ui/content\n\t\t$toggle = $header.find('button.toggle').first();\n\t\t$edit = $header.find('button.edit').first();\n\t\tthis.inlineIn = $header.find('.p_ins').first();\n\t\tthis.inlineOut = $header.find('.p_outs').first();\n\t\tthis.inputCol = $content.find('.p_ins').first();\n\t\tthis.outputCol = $content.find('.p_outs').first();\n\t\tthis.pluginContainer = $dom.find('.p_plugin').first();\n\t} else {\n\t\t// recover\n\t\t$header = this.header \t= make('div');\n\t\t$content = this.content = make('div');\n\t\tthis.inputCol \t\t\t= make('div');\n\t\tthis.pluginContainer \t= make('div');\n\t\tthis.outputCol \t\t= make('div');\n\t\tthis.inlineIn \t\t\t= make('div');\n\t\tthis.inlineOut \t\t= make('div');\n\t\t$toggle = make('button');\n\t\t$edit = make('button');\n\t\t$header.append($toggle, $edit);\n\t\t$dom.append($header.append(this.inlineIn, this.inlineOut), $content.append(this.inputCol, this.pluginContainer, this.outputCol));\n\t}\n\n\t// ATTACH HANDLERS ETC\n\n\tvar plugin = parent_node.plugin;\n\tif (plugin.create_ui) {\n\t\tthis.pluginUI = plugin.create_ui();\n\t\tthis.pluginContainer.append(this.pluginUI);\n\t}\n\telse\n\t\tthis.pluginUI = {}; // We must set a dummy object so plugins can tell why they're being called.\n\n\tif (this.hasSubgraph()) {\t// create a preferences button and wire it up\n\t\tNodeUI.makeSpriteSVGButton(\n\t\t\tNodeUI.makeSpriteSVG('vp-edit-patch-icon', 'cmd_edit_graph'),\n\t\t\t'Edit nested patch',\n\t\t\t$edit\n\t\t);\n\t\t$edit.addClass('p_fade');\n\t\t$edit.click(this.openSubgraph.bind(this));\n\t} else {\n\t\t$edit.remove();\n\t}\n\n\t$toggle.append('<svg class=\"icon-arrow-vertical\"><use xlink:href=\"#icon-arrow-vertical\"/></svg>');\n\t$toggle.addClass('plugin-toggle');\n\t$toggle.click(function() {\n\t\tvar isOpen = !that.parent_node.open\n\n\t\tE2.app.dispatcher.dispatch({\n\t\t\tactionType: 'uiNodeOpenStateChanged',\n\t\t\tgraphUid: that.parent_node.parent_graph.uid,\n\t\t\tnodeUid: that.parent_node.uid,\n\t\t\tisOpen: isOpen\n\t\t})\n\t});\n\n\tvar myCategory = this.getNodeCategory();\n\t$dom.addClass('vp graph-node plugin');\n\t$dom.addClass('p_cat_' + myCategory);\n\t$dom.addClass('p_id_' + this.parent_node.plugin.id);\n\t$dom.attr('id', this.nid);\n\t$dom.data('uiid', this._id).attr('data-uiid', this._id);\n\t$dom.data('nuid', this.parent_node.uid).attr('data-nuid', this.parent_node.uid);\n\t$dom.data('cat', myCategory).attr('data-cat', myCategory);\n\tE2.dom.canvas_parent.append($dom);\n\n\n\t$dom.mousemove(E2.app.onMouseMoved.bind(E2.app)); // Make sure we don't stall during slot connection, when the mouse enters a node.\n\n\t$header.mousedown(E2.app.onNodeHeaderMousedown.bind(E2.app));\n\t$header.click(E2.app.onNodeHeaderClicked.bind(E2.app));\n\t$header.dblclick(this.showRenameControl.bind(this));\n\t$header.mouseenter(E2.app.onNodeHeaderEntered.bind(E2.app, parent_node));\n\t$header.mouseleave(E2.app.onNodeHeaderExited.bind(E2.app));\n\n\tthis.setupDocs();\n\n\t$header.attr('alt', '' + parent_node.uid);\n\tthis.setupTooltips($header);\n\n\tthis.setCssClass();\n\tthis.redrawSlots();\n\n\tthis.parent_node.on('openStateChanged', function(isOpen) {\n\t\tthat.setCssClass();\n\t\tthat.parent_node.update_connections()\n\t\tE2.app.updateCanvas(true)\n\t})\n\n\n\tmake_draggable($dom,\n\t\tE2.app.onNodeDragged.bind(E2.app, parent_node),\n\t\tE2.app.onNodeDragStopped.bind(E2.app, parent_node),\n\t\t$header)\n\n\tthis.update();\t// place in position;\n\tthis.parent_node.on('slotAdded', function(slot){\n\t\tthis.setCssClass();\t// resets this.flags\n\t\tthis.redrawSlots();\n\t}.bind(this));\n\tthis.parent_node.on('slotRemoved', function(slot){\n\t\tthis.setCssClass();\n\t\tthis.redrawSlots();\n\t}.bind(this));\n\tthis.parent_node.on('renamed', this.onRenamed.bind(this));\n\n\tVizorUI.disableContextMenu($dom[0]);\n}\n\nNodeUI.prototype = Object.create(EventEmitter.prototype);\n\nNodeUI.prototype.setupDocs = function() {\n\tvar that = this\n\n\tE2.ui.pluginDocsCache.loadDocs(this.parent_node.plugin.id)\n\t.then(function(docs) {\n\t\t// docs.desc = '...'\n\t\t// docs.inputs = [{name: '...', desc: '...'}, ...]\n\t\t// docs.outputs = [{name: '...', desc: '...'}, ...]\n\n\t\tthat.parent_node.plugin.desc = docs.desc\n\n\t\tfunction slotMatcher(docSlots) {\n\t\t\treturn function (slot) {\n\t\t\t\tfor (var i = 0, len = docSlots.length; i < len; ++i) {\n\t\t\t\t\tif (docSlots[i].name === slot.name) {\n\t\t\t\t\t\tslot.desc = docSlots[i].desc\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconsole.error('no docs for ', that.parent_node.plugin.id, '.', slot.name)\n\t\t\t}\n\t\t}\n\n\t\tthat.parent_node.plugin.input_slots.map(slotMatcher(docs.inputs))\n\t\tthat.parent_node.plugin.output_slots.map(slotMatcher(docs.outputs))\n\t})\n}\n\nNodeUI.prototype.updateTooltipsPosition = function(data) {\t// find any tooltips that have our nodeId and move them accordingly.\n\tvar repositionMyTooltips = function(data) {\n\t\t// data has uiid, dx,dy,and dz;\n\t\tvar uiid = data.uiid;\n\t\tvar $tooltips = jQuery('div.popover')\n\t\t\t\t\t\t\t.filter(function(){\n\t\t\t\t\t\t\t\t\treturn $(this).data('uiid') == data.uiid;\n\t\t\t\t\t\t\t\t});\n\t\tif ($tooltips.length < 1) return true;\n\t\t$tooltips.each(function(){\n\t\t\tvar $tip = jQuery(this);\n\t\t\tvar t_uiid = $tip.data('uiid');\t\t// the tip contains the id of UI that \"owns\" it\n\t\t\tif (!t_uiid) return;\n\t\t\tif (t_uiid !== uiid) return;\t\t// check if this is us by comparing with uuid from arguments\n\t\t\tvar pos = $tip.position();\n\t\t\t$tip.css({\n\t\t\t\ttop: ''+ (pos.top + data.dy) + 'px',\n\t\t\t\tleft: ''+ (pos.left + data.dx) + 'px'\n\t\t\t});\n\t\t});\n\t}\n\trepositionMyTooltips(data);\n\treturn true;\n};\n\nNodeUI.prototype.destroy = function() {\n\tthis._destroying = true;\n\tthis.removeAllListeners();\n\n\tjQuery('div.popover').remove();\t// clean up any tooltips, globally\n\tthis.onHideTooltip(null);\n\n\t// clean up our own dom and remove it\n\t[this.inputCol,\n\t\tthis.outputCol,\n\t\tthis.inlineIn,\n\t\tthis.inlineOut,\n\t\tthis.header,\n\t\tthis.content,\n\t\tthis.pluginContainer,\n\t\tthis.pluginUI\n\t].forEach(\n\t\tfunction(j){\n\t\t\tif (typeof j === 'function') {\n\t\t\t\tj.remove();\n\t\t\t}\n\t\t\tj={};\n\t\t});\n\tthis.dom.remove();\n\tthis._destroyed = true;\n\treturn this;\n}\n\nNodeUI.prototype.onRenamed = function(name) {\n\t$('span.p_title', this.header).text(name)\n\tthis.setCssClass()\n\tNodeUI.redrawActiveGraph();\n}\n\nNodeUI.prototype.openInspector = function() {\n\tif (this.hasPreferences())\n\t\tthis.parent_node.plugin.open_inspector(this.parent_node.plugin);\n\treturn false;\n};\n\nNodeUI.prototype.openSubgraph = function() {\n\tif (this.hasSubgraph())\n\t\tNodeUI.drilldown(this.parent_node);\n\telse console.log('no');\n\treturn false;\n};\n\nNodeUI.prototype.setSelected = function(is_selected) {\n\tthis.selected = is_selected;\n\tthis.setCssClass();\n}\nNodeUI.prototype.isSelected = function() { return !!this.selected; };\n\nNodeUI.prototype.setCssClass = function() {\n\tvar $dom = this.dom;\n\tvar flags = this.getPluginUIFlags(true);\n\n\tif (this.canDisplayInline()) {\n\t\t$dom\n\t\t\t.removeClass('p_expand')\n\t\t\t.removeClass('p_collapse')\n\t\t\t.addClass('p_inline')\n\t} else {\n\t\t$dom\n\t\t\t.removeClass('p_inline')\n\t\t\t.toggleClass('p_expand', this.parent_node.open)\n\t\t\t.toggleClass('p_collapse', !this.parent_node.open)\n\t}\n\n\t$dom\n\t\t.toggleClass('p_has_ins', flags.has_inputs)\n\t\t.toggleClass('p_has_outs', flags.has_outputs)\n\t\t.toggleClass('p_1in', flags.single_in)\n\t\t.toggleClass('p_1out', flags.single_out)\n\t\t.toggleClass('p_header_out', this.canDisplayOutputInHeader())\n\t\t.toggleClass('p_header_in', this.canDisplayInputInHeader())\n\t\t.toggleClass('p_selected', this.isSelected())\n\t\t.toggleClass('p_renamed', this.isRenamed())\n\n\tvar currentWidth = $dom[0].style.width;\n\tif (!currentWidth) currentWidth = 'auto';\n\t$dom.css('width', currentWidth);\t// fix Safari width bug\n\n\treturn this;\n};\n\nNodeUI.prototype.getPluginUIFlags = function(reset) {\n\tif (typeof reset === 'undefined') reset = false;\n\tif (reset) this.flags._set = false;\n\tif (this.flags._set) return this.flags;\n\tthis.flags.has_subgraph \t= this.hasSubgraph();\n\tthis.flags.has_plugin_ui \t= this.hasPluginUI();\n\tthis.flags.has_inputs \t\t= this.hasInputs();\n\tthis.flags.has_outputs \t\t= this.hasOutputs();\n\tthis.flags.has_preferences \t= this.hasPreferences();\n\tthis.flags.has_dynamic_slots = this.hasDynamicSlots();\n\tthis.flags.has_edit \t\t= this.hasEditButton();\n\tthis.flags.single_in \t\t= this.hasOnly1Input();\n\tthis.flags.single_out \t\t= this.hasOnly1Output();\n\tthis.flags._set = true;\n\treturn this.flags;\n};\n\nNodeUI.prototype.canDisplayInputInHeader = function() {\n\treturn false;\n};\n\nNodeUI.prototype.canDisplayOutputInHeader = function() {\n\tvar myCategory = this.getNodeCategory();\n\n\tif (uiPluginsThatForceDisplayOutputInHeader.indexOf(this.parent_node.plugin.id) !== -1)\n\t\treturn true;\n\n\tvar p = this.getPluginUIFlags();\n\tvar can = p.single_out && (!p.has_edit) && (!p.has_dynamic_slots);\t// check !p.has_inputs if stricter\n\tcan = can && !p.has_subgraph;\n\n\tcan = can && (uiPluginCategoriesThatMustNotDisplayOutputInHeader.indexOf(myCategory) === -1);\n\tcan = can && (uiPluginsThatMustNotDisplayOutputInHeader.indexOf(this.parent_node.plugin.id) === -1);\n\n\treturn can;\n};\n\nNodeUI.prototype.canDisplayInline = function() {\n\tvar p = this.getPluginUIFlags();\t// variables used to make a decision.\n\tvar category = this.getNodeCategory();\n\tif (uiPluginsThatNeverDisplayInline.indexOf(this.parent_node.plugin.id) !== -1)\n\t\treturn false\n\n\tvar is_io = (category === uiNodeCategory.io);\n\tvar alwaysInline = (uiPluginsThatAlwaysDisplayInline.indexOf(this.parent_node.plugin.id) > -1)\n\n\tvar can = !p.has_plugin_ui;\n\tcan = can && !p.has_subgraph;\n\tcan = can && (is_io || alwaysInline);\n\tif (is_io) {\n\t\tcan = can && ((p.single_in && !p.has_outputs) ||\n\t\t\t\t(p.single_out && !p.has_inputs) ||\n\t\t\t\t((this.parent_node.dyn_inputs.length === 1) && (!p.has_outputs)) ||\t\t// read var\n\t\t\t\t((this.parent_node.dyn_outputs.length === 1) && (!p.has_inputs)));\t\t// write var\n\t} else {\n\t\tcan = can && ((p.single_in && !p.has_outputs) || (p.single_out && !p.has_inputs));\n\t}\n\n\treturn can;\n};\n\nNodeUI.prototype.getContainerForSlotsOfType = function(isInput, isDynamic) {\n\tvar canDisplayInline = this.canDisplayInline();\n\tvar canDisplayOutputInHeader = this.canDisplayOutputInHeader();\n\tvar canDisplayInputInHeader = this.canDisplayInputInHeader();\n\n\tif (canDisplayInline)\n\t\treturn (isInput) ? this.inlineIn : this.inlineOut;\n\t// else\n\tif (isDynamic)\n\t\treturn (isInput) ? this.inputCol : this.outputCol;\n\t// else static\n\tif (canDisplayOutputInHeader && !isInput)\n\t\treturn this.inlineOut;\n\n\tif (canDisplayInputInHeader && isInput)\n\t\treturn this.inlineIn;\n\n\treturn null;\n}\n\nNodeUI.prototype.redrawSlots = function() {\n\tvar canDisplayInline = this.canDisplayInline();\n\n\tthis.inlineIn.empty();\n\tthis.inlineOut.empty();\n\tthis.inputCol.empty();\n\tthis.outputCol.empty();\n\n\tif (canDisplayInline) {\n\t\tthis.renderSlots(this.inlineIn, this.parent_node.plugin.input_slots, E2.slot_type.input);\n\t\tthis.renderSlots(this.inlineOut, this.parent_node.plugin.output_slots, E2.slot_type.output);\n\t\tthis.renderSlots(this.inlineIn, this.parent_node.dyn_inputs, E2.slot_type.input);\n\t\tthis.renderSlots(this.inlineOut, this.parent_node.dyn_outputs, E2.slot_type.output);\n\t\treturn this;\n\t}\n\t// else...\n\n\t// render inputs\n\tthis.renderSlots(this.inputCol, this.parent_node.plugin.input_slots, E2.slot_type.input);\n\tif(this.parent_node.dyn_inputs)\n\t\tthis.renderSlots(this.inputCol, this.parent_node.dyn_inputs, E2.slot_type.input);\n\n\t// render outputs\n\tif (this.canDisplayOutputInHeader()) {\n\t\tthis.renderSlots(this.inlineOut, this.parent_node.plugin.output_slots, E2.slot_type.output);\n\t\t// just in case\n\t\tif(this.parent_node.dyn_outputs)\n\t\t\tthis.renderSlots(this.outputCol, this.parent_node.dyn_outputs, E2.slot_type.output);\n\t} else {\n\t\tthis.renderSlots(this.outputCol, this.parent_node.plugin.output_slots, E2.slot_type.output);\n\t\tif(this.parent_node.dyn_outputs)\n\t\t\tthis.renderSlots(this.outputCol, this.parent_node.dyn_outputs, E2.slot_type.output);\n\t}\n\n\tNodeUI.redrawActiveGraph();\t// fix #584\n\treturn this;\n};\n\nNodeUI.prototype.hasSubgraph = function() {\n\treturn (typeof this.parent_node.plugin.drilldown === 'function');\n};\n\nNodeUI.prototype.hasDynamicSlots = function() {\n\tvar node = this.parent_node;\n\treturn node.dyn_inputs.length + node.dyn_outputs.length > 0;\n}\n\nNodeUI.prototype.hasInputs = function() {\n\tvar node = this.parent_node;\n\treturn (node.plugin.input_slots.length + node.dyn_inputs.length) > 0;\n};\n\nNodeUI.prototype.hasOutputs = function() {\n\tvar node = this.parent_node;\n\treturn (node.plugin.output_slots.length + node.dyn_outputs.length) > 0;\n};\n\nNodeUI.prototype.hasPluginUI = function() {\n\treturn (typeof this.parent_node.plugin.create_ui === 'function');\n};\n\nNodeUI.prototype.hasPreferences = function() {\n\treturn (typeof this.parent_node.plugin.open_inspector === 'function');\n};\n\n// aliases\nNodeUI.prototype.hasInspector = NodeUI.prototype.hasPreferences;\n\nNodeUI.prototype.hasOnly1Input = function() {\n\tvar node = this.parent_node;\n\treturn (node.plugin.input_slots.length === 1) && (node.dyn_inputs.length === 0);\n};\n\nNodeUI.prototype.hasOnly1Output = function() {\n\tvar node = this.parent_node;\n\treturn (node.plugin.output_slots.length === 1) && (node.dyn_outputs.length === 0);\n};\n\nNodeUI.prototype.hasEditButton = function() {\n\treturn false;\n};\n\nNodeUI.prototype.isRenamed = function() {\n\tvar hasTitle = (this.parent_node.title || false);\n\tvar hasNoSubgraph = !this.hasSubgraph();\n\tvar nodeCategory = this.getNodeCategory();\n\tvar notExempt = uiPluginCategoriesAutoRenamed.indexOf(nodeCategory) === -1;\n\treturn (hasTitle && notExempt && hasNoSubgraph && (this.parent_node.title !== this.parent_node.id));\n};\n\nNodeUI.prototype.hasBeenRenamed = NodeUI.prototype.isRenamed;\n\nNodeUI.prototype.setPosition = function(x, y, z) {\n\tvar data = {\n\t\tuiid: this._id,\n\t\tnid: this.nid,\n\t\tdx: this.position.x,\n\t\tdy: this.position.y,\n\t\tdz: this.position.z\n\t};\n\tif (typeof x !== 'undefined') this.position.x = this.x = x;\n\tif (typeof y !== 'undefined') this.position.y = this.y = y;\n\tif (typeof z !== 'undefined') this.position.z = this.z = z;\n\n\tthis.update();\t// this may adjust position\n\n\tdata.dx = this.position.x - data.dx;\n\tdata.dy = this.position.y - data.dy;\n\tdata.dz = this.position.z - data.dz;\n\tthis.updateTooltipsPosition(data);\n\n\tthis.emit(uiNodeEventType.positionChanged, data);\t// @todo this doesn't always emit?\n};\n\n/**\n *  Stub. For now it just places the UI in position.\n */\nNodeUI.prototype.update = function() {\n\tif (!this.dom) return;\n\tvar s = this.dom[0].style;\n\n\tvar xx = this.position.x;\n\tvar yy = this.position.y;\n\n\t// temporary fix for plugins appearing at -98px top, until VP allows plugins to display at negative positions.\n\tif (xx < 0) this.position.x = this.x = xx = 0;\n\tif (yy < 0) this.position.y = this.y = yy = 0;\n\ts.left = '' + xx + 'px';\n\ts.top = '' + yy + 'px';\n};\n\n\nNodeUI.prototype.showRenameControl = function() {\n\tvar that = this\n\tvar node = this.parent_node;\n\tvar $dom = this.dom;\n\n\tif ($dom.hasClass('p_renaming')) return true;\n\n\tvar input = $('<input class=\"node-title-input\" placeholder=\"Type a title\" />')\n\n\tvar $titleSpan = $dom.find('span.p_title').first();\n\tvar titleOffset = $titleSpan.offset();\n\tvar domOffset = $dom.offset();\n\n\t$dom.addClass('p_renaming');\n\tinput\n\t\t.appendTo($dom.find('.p_wrap'))\n\t\t.addClass('p_rename')\n\t\t.css({\n\t\t\twidth:  '' + $titleSpan.innerWidth() - 10 + 'px',\n\t\t\tleft: '' + (10 + titleOffset.left - domOffset.left) + 'px'\n\t\t})\n\t\t.val(node.get_disp_name())\n\t\t.keydown(function(e){\n\t\t\tvar code = e.keyCode || e.which\n\t\t\tif(code === 13) {\n\t\t\t\tvar name = $(e.target).val().replace(/^\\s+|\\s+$/g,'') // remove extra spaces\n\t\t\t\tjQuery(e.target).trigger('blur');\n\n\t\t\t\tif (!name) {\n\t\t\t\t\tif (E2.GRAPH_NODES.indexOf(node.plugin.id) > -1) {\n\t\t\t\t\t\t// TODO: for patches get the name of the patch.\n\t\t\t\t\t\tname = false;\t// do not rename node for now\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tname = node.id\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (name) {\n\t\t\t\t\tE2.app.graphApi.renameNode(E2.core.active_graph, node, name);\n\t\t\t\t}\n\n\t\t\t}\n\t\t\treturn true;\n\t\t})\n\t\t.keyup(function(e) {\n\n\t\t\tvar code = e.keyCode || e.which\n\t\t\tif(code === 27) {\n\t\t\t\tjQuery(e.target).trigger('blur');\n\t\t\t}\n\t\t\treturn true;\n\n\t\t})\n\t\t.select()\n\t\t.bind('blur', function() {\n\t\t\t$(this).remove();\t// this = input\n\t\t\t$dom.removeClass('p_renaming');\n\t\t})\n\t\t.focus()\n};\n\n// returns one of uiNodeCategory values for this.parent_node\nNodeUI.prototype.getNodeCategory = function() {\n\treturn uiNodeCategoryMap.getCategory(this.parent_node.plugin.id);\n};\n\nNodeUI.prototype.getDisplayName = function() {\n\treturn this.parent_node.get_disp_name();\n};\n\n\nNodeUI.prototype.onShowTooltip = function(e) {\n\tvar that = this\t\t// NodeUI\n\n\tif(E2.app.inDrag)\n\t\treturn false;\n\n\tvar $elem = $(e.currentTarget);\n\n\tif (!this._ttdata) this._ttdata = {\n\t\t_tooltipElem : null,\n\t\t_tooltipTimer : null,\n\t\t_tooltipHideTimer : null\n\t};\n\tvar data = this._ttdata;\n\n\tvar tokens = $elem.attr('alt').split('_');\n\n\tvar core = E2.core;\n\tvar node = E2.core.active_graph.nuid_lut[tokens[0]];\n\tvar txt = '';\n\tvar readmore= '';\n\n\tif(tokens.length < 2) // Node?\n\t{\n\t\tvar p_name = core.pluginManager.keybyid[node.plugin.id];\n\n\t\ttxt += '<b>' + p_name + '</b><br/><br/>' + node.plugin.desc;\n\t}\n\telse // Slot\n\t{\n\t\tvar plugin = node.plugin;\n\t\tvar slot = null;\n\n\t\tvar isDynamic = tokens[1][0] === 'd';\n\t\tvar isInput = tokens[1][1] === 'i';\n\t\tvar isOutput = !isInput;\n\n\t\tif(isDynamic)\n\t\t\tslot = node.findSlotByUid(tokens[2])\n\t\telse\n\t\t\tslot = (isInput ? plugin.input_slots : plugin.output_slots)[parseInt(tokens[2], 10)];\n\n\t\ttxt = '<b>Type:</b> ' + slot.dt.name;\n\n\t\tif ( (isOutput && this.hasOnly1Output()) || (isInput && this.canDisplayInline()) ) {\n\t\t\ttxt += '<br><b>Name:</b> ' + slot.name;\n\t\t}\n\n\t\tvar currentValue = this.parent_node.getUiSlotValue(slot)\n\t\tif ((!slot.is_connected) &&\n\t\t\t(currentValue !== null) &&\n\t\t\t(typeof slot.def !== 'undefined') &&\n\t\t\t(currentValue !== slot.def)\n\t\t\t&& !(currentValue instanceof Object))  {\n\t\t\ttxt += '<br><b>Current value:</b> ' + currentValue;\n\t\t}\n\n\t\tif (slot.array)\n\t\t\ttxt += '<br><b>Array:</b> yes';\n\n\t\tif (slot.inactive)\n\t\t\ttxt += '<br><b>Inactive:</b> yes';\n\n\t\tif(slot.lo !== undefined || slot.hi !== undefined)\n\t\t\ttxt += '<br><b>Range:</b> ' + (slot.lo !== undefined ? 'min. ' + slot.lo : '') + (slot.hi !== undefined ? (slot.lo !== undefined ? ', ' : '') + 'max. ' + slot.hi : '')\n\n\t\tif (slot.def !== undefined) {\n\t\t\ttxt += '<br><b>Default:</b> '\n\n\t\t\tif (slot.def === null)\n\t\t\t\ttxt += 'Nothing'\n\t\t\telse\n\t\t\t\ttxt += slot.def\n\t\t}\n\n\t\ttxt += '<br /><br />';\n\n\t\tif (readmore) {\n\t\t\treadmore = '<div class=\"readmore\">' + readmore + '</div>'\n\t\t}\n\n\t\tif(slot.desc)\n\t\t\ttxt += slot.desc.replace(/\\n/g, '<br/>');\n\t}\n\n\n\tvar popovers = jQuery('body div.popover');\n\tvar timeout = (popovers.length > 0) ? 300 : 2000;\n\n\tif (data._tooltipTimer) clearTimeout(data._tooltipTimer);\n\tif (data._tooltipElem) {\n\t\tdata._tooltipElem.popover('destroy');\n\t\tdata._tooltipElem = null;\n\t\tclearTimeout(data._tooltipHideTimer);\n\t}\n\n\tvar uiid = this._id;\n\tdata._tooltipTimer = setTimeout(function() {\n\t\tif (E2.app.inDrag)\n\t\t\treturn;\n\n\t\t$elem.popover('destroy');\n\t\tpopovers.remove();\n\n\t\t$elem.popover({\n\t\t\ttitle: txt,\n\t\t\tcontent: readmore,\n\t\t\tcontainer: 'body',\n\t\t\tanimation: false,\n\t\t\ttrigger: 'manual',\n\t\t\tplacement: 'top',\n\t\t\thtml: true,\n\t\t\ttemplate: '<div class=\"popover\" role=\"tooltip\" data-uiid=\"'+uiid+'\"><div class=\"arrow\"></div><div class=\"popover-title\"></div><div class=\"popover-content\"></div></div>'\n\t\t})\n\t\t.popover('show');\n\n\t\tdata._tooltipElem = $elem;\n\t\tdata._tooltipHideTimer = setTimeout(that.onHideTooltip.bind(that), 30000);\n\n\t}, timeout);\n\n\treturn true;\n\n};\n\nNodeUI.prototype.onHideTooltip = function(e) {\t// this = $(element that has popovers)\n\tvar data = this._ttdata;\n\tif (!data) return true;\n\n\tclearTimeout(data._tooltipTimer)\n\tclearTimeout(data._tooltipHideTimer)\n\tvar killTooltip = function() {\n\t\tif (data._tooltipElem) {\n\t\t\tdata._tooltipElem.popover('destroy');\n\t\t\tdata._tooltipElem = null;\n\t\t}\n\t};\n\tif (this._destroying)\n\t\tkillTooltip()\n\telse\n\t\tsetTimeout(killTooltip, 50);\t// note this timeout must be less than the least in onShowToolTip\n\n\treturn (E2.app.inDrag)\n};\n\n/**** \"static\" *****/\n\n// helpers\n/**\n * @returns jQuery\n */\nNodeUI.makeSpriteSVG = function(xlink, className) {\n\treturn $('<svg class=\"' + className + '\"><use xlink:href=\"#'+ xlink +'\"/></svg>');\n};\n/**\n * @returns jQuery\n */\nNodeUI.makeSpriteSVGButton = function($svg, alt_text, $have_button) {\n\tif (typeof $have_button === 'undefined') $have_button = makeButton(null, '');\n\treturn $have_button\n\t\t.attr('title', (alt_text || ''))\n\t\t.removeClass('btn')\n\t\t.addClass('vp svg')\n\t\t.append($svg);\n};\n\n\n// sets up tooltip event listeners for a dom element that represents a node or slot\nNodeUI.prototype.setupTooltips = function($element) {\n\tvar uiId = $element.data('uiid');\n\tif ((typeof uiId === 'undefined') || (!uiId)) {\n\t\t$element.attr('data-uiid', this._id).data('uiid', this._id);\n\t}\n\t$element.hover(this.onShowTooltip.bind(this), this.onHideTooltip.bind(this));\n\treturn $element;\n};\n\nNodeUI.prototype.createSlot = function(container, s, type) {\n\tvar $div = make('div');\n\tvar isDefaultValue = this.parent_node.getUiSlotValue(s) === s.def\n\tvar node = this.parent_node;\n\tvar nid = this.nid;\n\n\tvar isInput = (type === E2.slot_type.input);\n\tvar isDynamic = (typeof s.uid !== 'undefined')\n\tvar isConnected = (typeof s.is_connected !== 'undefined') && s.is_connected;\n\n\tvar sid;\n\tif (isDynamic)\n\t\tsid = nid + (isInput ? 'di' : 'do') + s.uid;\n\telse\n\t\tsid = nid + (isInput ? 'si' : 'so') + s.index;\n\t$div.attr('id',sid);\n\n\t$div.addClass('pl_slot p_slot');\n\t$div.addClass( (isInput) ? 'p_in' : 'p_out' );\n\tif (isDynamic) $div.addClass('p_dynamic');\n\tif (isConnected) $div.addClass('p_connected');\n\n\tvar $status = make('span');\t// contains the two svg-s, on and off, loaded from sprite already in the document.\n\tvar $label = make('label')\n\tif (isInput) {\n\t\t$div.append($status, $label);\n\t} else {\n\t\t$div.append($label, $status);\n\t}\n\t$status.addClass('status');\n\t$status.append(NodeUI.makeSpriteSVG('vp-port-connected', 'p_conn_status p_on'));\n\t$status.append(NodeUI.makeSpriteSVG('vp-port-unconnected', 'p_conn_status p_off'));\n\n\tcontainer.append($div);\n\t$div.mouseenter(E2.app.onSlotEntered.bind(E2.app, node, s, $div));\n\t$div.mouseleave(E2.app.onSlotExited.bind(E2.app, node, s, $div));\n\t$div.mousedown(E2.app.onSlotClicked.bind(E2.app, node, s, $div, type));\n\n\tvar altSid = '' + node.uid;\n\n\taltSid += '_' + (s.uid !== undefined ? 'd' : 's');\n\taltSid += type === E2.slot_type.input ? 'i' : 'o';\n\taltSid += '_' + (s.uid !== undefined ? s.uid : s.index);\n\n\t$div.attr('alt', altSid);\n\n\tvar suid = s.uid || '';\n\t// some more metadata\n\tvar is_dyn = isDynamic.toString();\n\t$div.data('nid', this.nid).attr('data-nid', this.nid);\n\t$div.data('sid', suid).attr('data-sid', suid);\n\t$div.data('dyn', is_dyn).attr('data-dyn', is_dyn);\n\t$div.data('type', type).attr('data-type', type);\n\tthis.setupTooltips($div);\n\n\tvar setSlotLabel = function(slot, value){\n\t\tif (slot !== s) return\n\t\tvar isOverride   = (!slot.is_connected) && (typeof slot.def !== 'undefined') && (value !== null) && (value !== slot.def)\n\t\tif (isOverride)\n\t\t\t$label.html(s.name + '*')\n\t\telse\n\t\t\t$label.html(s.name)\n\t}\n\n\tthis.parent_node.on('uiSlotValueChanged', setSlotLabel)\n\tsetSlotLabel(s, this.parent_node.getUiSlotValue(s))\n\n\treturn $div;\n};\n\nNodeUI.prototype.renameSlot = function(slot, name, suid, slot_type) {\n\tif (!slot) return false;\t// don't know what we're doing\n\n\tvar is_inp = slot.type === E2.slot_type.input;\n\tvar seek = (is_inp) ? [this.inputCol, this.inlineIn] : [this.outputCol, this.inlineOut];\n\n\tvar did_rename = false;\n\tseek.forEach(function($j){\n\t\tvar slots = $j.find('div.p_slot');\n\t\tslots.filter(function(){\n\t\t\treturn (jQuery(this).data('sid') === slot.uid);\n\t\t})\n\t\t.each(function(){\n\t\t\tjQuery(this).find('label').html(name);\n\t\t\tdid_rename = true;\n\t\t});\n\t});\n\n\treturn did_rename;\n};\n\nNodeUI.prototype.renderSlots = function(container, slots, type) {\n\tfor(var i = 0, len = slots.length; i < len; i++) {\n\t\tif (slots[i].patchable !== false)\n\t\t\tthis.createSlot(container, slots[i], type);\n\t}\n};\n\n// open nested graph for editing\nNodeUI.drilldown = function(node) {\t// taken from nested graph plugin\n\tvar p = node.plugin;\n\tif(p.graph) {\n\t\tvar ptn = p.graph.parent_graph.tree_node\n\n\t\tif(!ptn.open) {\n\t\t\tptn.graph.open = true\n\t\t\tptn.rebuild_dom()\n\t\t}\n\n\t\tE2.app.setActiveGraph(p.graph)\n\t}\n\treturn false;\n};\n\n/**\n * forces all connections to resolve their slot divs and redraws the canvas.\n * expensive and heavy-handed. use as a last resort. (gm)\n * @return boolean if updateCanvas was called\n */\nNodeUI.redrawActiveGraph = function() {\n\tvar changed = false;\n\tif (!E2.core.active_graph) return false;\n\tE2.core.active_graph.connections.forEach(function(c){\n\t\tif (c.ui) {\n\t\t\tc.ui.resolve_slot_divs(false);\n\t\t\tE2.app.redrawConnection(c);\n\t\t\tchanged = true;\n\t\t}\n\t});\n\n\tif (changed) {\n\t\tE2.app.updateCanvas(true);\n\t}\n\tE2.ui.state.selectedObjects = E2.ui.state.selectedObjects;\t// force refresh\n\treturn changed;\n};\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = NodeUI\n"
  },
  {
    "path": "browser/scripts/node.js",
    "content": "/**\n * a Node in a patching graph\n * @emits openStateChanged, pluginStateChanged, slotAdded, slotRemoved, uiSlotValueChanged\n * @constructor\n */\nfunction Node(parent_graph, plugin_id, x, y) {\n\tEventEmitter.call(this)\n\n\tthis.x = 0;\n\tthis.y = 0;\n\tthis.inputs = []\n\tthis.outputs = []\n\tthis.queued_update = -1\n\tthis.dyn_inputs = []\n\tthis.dyn_outputs = []\n\n\tthis.uiSlotValues = {}\n\n\tthis.uid = E2.uid()\n\n\tif (plugin_id) { // Don't initialise if we're loading.\n\t\tthis.parent_graph = parent_graph;\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.ui = null;\n\t\tthis.id = E2.core.pluginManager.keybyid[plugin_id];\n\t\tthis.update_count = 0;\n\t\tthis.title = null;\n\t\tthis.inputs_changed = false;\n\t\tthis.open = true;\n\n\t\tthis.set_plugin(E2.core.pluginManager.create(plugin_id, this))\n\t}\n}\n\nNode.prototype = Object.create(EventEmitter.prototype)\n\nNode.prototype.isEntityPatch = function() {\n\treturn !!this.plugin.isEntityPatch && this.plugin.isEntityPatch()\n}\n\nNode.prototype.getConnections = function() {\n\treturn this.inputs.concat(this.outputs)\n}\n\nNode.prototype.getDynamicInputSlots = function() {\n\treturn this.dyn_inputs;\n}\n\nNode.prototype.getDynamicOutputSlots = function() {\n\treturn this.dyn_outputs;\n}\n\nNode.prototype.set_plugin = function(plugin) {\n\tthis.plugin = plugin;\n\tthis.plugin.updated = true;\n\n\tthis.plugin.inputValues = {}\n\n\tvar usedSlotNames = []\n\t\n\tfunction init_slot(slot, index, type) {\n\t\tslot.type = type;\n\t\tslot.index = index;\n\n\t\tif (usedSlotNames.indexOf(''+type+slot.name) > -1)\n\t\t\tthrow new Error('Double slot name '+slot.name+' in '+plugin.id)\n\n\t\tusedSlotNames.push(''+type+slot.name)\n\n\t\tif (!slot.dt)\n\t\t\tmsg('ERROR: The slot \\'' + slot.name + '\\' does not declare a datatype.');\n\t}\n\n\t// Decorate the slots with their index to make this immediately resolvable\n\t// from a slot reference, allowing for faster code elsewhere.\n\t// Additionally tagged with the type (0 = input, 1 = output) for similar reasons.\n\tfor(var i = 0, len = plugin.input_slots.length; i < len; i++)\n\t\tinit_slot(plugin.input_slots[i], i, E2.slot_type.input);\n\t\n\tfor(var i = 0, len = plugin.output_slots.length; i < len; i++)\n\t\tinit_slot(plugin.output_slots[i], i, E2.slot_type.output);\n\n\t// back reference for object picking\n\tthis.plugin.parentNode = this\n}\n\nNode.prototype.setOpenState = function(isOpen) {\n\tthis.open = isOpen\n\tthis.emit('openStateChanged', isOpen)\n}\n\t\nNode.prototype.create_ui = function() {\n\tthis.ui = new NodeUI(this, this.x, this.y)\n\tthis.emit('uiCreated', this.ui.content, this)\n}\n\nNode.prototype.destroy_ui = function() {\n\tif (!this.ui)\n\t\treturn;\n\n\tif (this.ui.destroy)\n\t\tthis.ui.destroy()\n\n\tthis.ui = null\n\n\tif (this.plugin.destroy_ui)\n\t\tthis.plugin.destroy_ui()\n}\n\nNode.prototype.getFullUid = function() {\n\treturn this.parent_graph.uid + '.' + this.uid\n}\n\nNode.prototype.destroy = function()\n{\n\tvar graph = this.parent_graph;\n\tvar index = graph.nodes.indexOf(this);\n\tvar pending = [];\n\t\n\tif (this.plugin.destroy)\n\t\tthis.plugin.destroy();\n\t\n\tif (index !== -1)\n\t\tgraph.nodes.splice(index, 1);\n\t\n\tpending.push.apply(pending, this.inputs);\n\tpending.push.apply(pending, this.outputs);\n\t\n\tfor(var i = 0, len = pending.length; i < len; i++)\n\t\tgraph.disconnect(pending[i]);\n\t\n\tthis.destroy_ui();\n};\n\nNode.prototype.get_disp_name = function() {\n\treturn !this.title ? this.id : this.title;\n}\n\nNode.prototype.reset = function() {\n\tvar p = this.plugin\n\n\tp.inputValues = {}\n\n\tif (p.input_slots) {\n\t\tp.input_slots.map(function(slot) {\n\t\t\tvar def = slot.def !== undefined ? slot.def : E2.core.get_default_value(slot.dt)\n\t\t\tp.inputValues[slot.name] = def\n\t\t})\n\t}\n\n\tif (p.reset)\n\t\tp.reset()\n\n\tfor(var slotName in this.uiSlotValues) {\n\t\tif (!this.uiSlotValues.hasOwnProperty(slotName))\n\t\t\tcontinue\n\n\t\tthis.setInputSlotValue(slotName, this.uiSlotValues[slotName])\n\t}\n\n\tp.updated = true\n}\n\nNode.prototype.geometry_updated = function() {\n\tif (this.outputs.length < 1)\n\t\treturn\n\t\n\tfor(var i = 0, len = this.outputs.length; i < len; i++) {\n\t\tvar c = this.outputs[i]\n\t\t\n\t\tE2.app.getSlotPosition(c.src_node, c.ui.src_slot_div,\n\t\t\tE2.slot_type.output, c.ui.src_pos)\n\t}\n\t\n\tE2.app.updateCanvas(true)\n}\n\nNode.prototype.add_slot = function(slot_type, def) {\n\tvar is_inp = slot_type === E2.slot_type.input;\n\tvar slots = is_inp ? this.dyn_inputs : this.dyn_outputs;\n\n\tif (def.uid === undefined || def.uid === null)\n\t\tdef.uid = E2.uid()\n\n\tif (!def.dt) {\n\t\tmsg('ERROR: No datatype given for slot')\n\t\tconsole.trace('No datatype given for slot')\n\t\treturn false\n\t}\n\n\tif (!def.name) {\n\t\tmsg('ERROR: No name given for slot')\n\t\tconsole.trace('No name given for slot')\n\t\treturn false\n\t}\n\n\tdef.dynamic = true\n\tdef.type = slot_type\n\n\tif (def.index === undefined)\n\t\tdef.index = slots.length\n\n\tslots.splice(def.index, 0, def);\n\n\tfor(var i = 0, len = slots.length; i < len; i++) {\n\t\tslots[i].index = i\n\t}\n\n\tthis.emit('slotAdded', def)\n\t\n\treturn def.uid;\n};\n\nNode.prototype.remove_slot = function(slot_type, suid) {\n\tvar is_inp = slot_type === E2.slot_type.input;\n\tvar slots = is_inp ? this.dyn_inputs : this.dyn_outputs;\n\tvar s, i, len;\n\n\tif (!slots.length)\n\t\treturn;\n\t\n\tvar slot = null;\n\tvar idx = -1;\n\n\tfor(i = 0, len = slots.length; i < len; i++) {\n\t\ts = slots[i];\n\n\t\tif (s.uid === suid) {\n\t\t\tslot = s;\n\t\t\tidx = i;\n\n\t\t\tslots.splice(i, 1)\n\t\t\tbreak;\n\t\t}\n\t} \n\n\tif (!slot)\n\t\treturn;\n\t\n\tif (slots.length) {\n\t\t// Patch up cached slot indices.\n\t\tfor(i = 0, len = slots.length; i < len; i++) {\n\t\t\tslots[i].index = i\n\t\t}\n\t}\n\t\n\tif (this.ui) {\n\t\tthis.ui.redrawSlots();\n\t}\n\t\n\tvar att = is_inp ? this.inputs : this.outputs;\n\tvar pending = [];\n\t\n\tfor(i = 0, len = att.length; i < len; i++) {\n\t\tvar c = att[i];\n\t\ts = is_inp ? c.dst_slot : c.src_slot;\n\t\n\t\tif (s === slot) {\n\t\t\tpending.push(c);\n\t\t}\n\t}\n\t\n\tfor(i = 0, len = pending.length; i < len; i++) {\n\t\tthis.parent_graph.disconnect(pending[i]);\n\t}\n\t\t\n\tthis.emit('slotRemoved', slot)\n}\n\nNode.prototype.getSlotConnections = function(slot) {\n\tvar that = this\n\tvar isInput = slot.type === E2.slot_type.input\n\tvar arr = isInput ? this.inputs : this.outputs\n\t\n\treturn arr.filter(function(c) {\n\t\tvar s = isInput ? c.dst_slot : c.src_slot\n\t\treturn s === slot\n\t})\n}\n\nNode.prototype.slotHasConnections = function(slot) {\n\tvar isInput = slot.type === E2.slot_type.input\n\tvar arr = isInput ? this.inputs : this.outputs\n\treturn arr.some(function(c) {\n\t\tvar s = isInput ? c.dst_slot : c.src_slot\n\t\treturn s === slot\n\t})\n}\n\nNode.prototype.setInputSlotValue = function(name, value) {\n\tvar slot = this.findInputSlotByName(name)\n\n\tif (value === slot.def) {\n\t\tdelete this.uiSlotValues[name]\n\t} else {\n\t\tthis.uiSlotValues[name] = value\n\t}\n\n\tthis.plugin.updated = true\n\tthis.plugin.inputValues[name] = value\n\n\tthis.plugin.update_input(slot, value)\n\tthis.emit('uiSlotValueChanged', slot, value)\n}\n\nNode.prototype.getDefaultSlotValue = function(slot) {\n\t// get it by the slot\n\tif (slot.def !== undefined)\n\t\treturn slot.def\n\n\t// ask the core\n\treturn E2.app.player.core.get_default_value(slot.dt)\n}\n\n// if the user has defined a value for an input slot when disconnected returns this value\n// otherwise it returns the default slot value.\nNode.prototype.getUiSlotValue = function(slot) {\n\tvar name = slot.name\n\t// try by editlog\n\tif (this.uiSlotValues &&  this.uiSlotValues[name] !== undefined)\n\t\treturn this.uiSlotValues[name]\n\n\t// else use the slot default\n\treturn this.getDefaultSlotValue(slot)\n}\n\nNode.prototype.getInputSlotValue = function(name) {\n\tif (this.plugin.inputValues &&  this.plugin.inputValues[name] !== undefined)\n\t\treturn this.plugin.inputValues[name]\n\t// else\n\tvar slot = this.findInputSlotByName(name)\n\treturn this.getUiSlotValue(slot)\n}\n\nNode.prototype.findInputSlotByName = function(name) {\n\tvar slot\n\n\tthis.plugin.input_slots.some(function(s) {\n\t\tif (s.name === name) {\n\t\t\tslot = s\n\t\t\treturn true\n\t\t}\n\t})\n\n\tif (!slot && this.dyn_inputs) {\n\t\tthis.dyn_inputs.some(function(s) {\n\t\t\tif (s.name === name) {\n\t\t\t\tslot = s\n\t\t\t\treturn true\n\t\t\t}\n\t\t})\n\t}\n\n\tif (!slot)\n\t\tconsole.error('findInputSlotByName not found', name)\n\n\treturn slot\n}\n\nNode.prototype.findOutputSlotByName = function(name) {\n\tvar slot\n\n\tthis.plugin.output_slots.some(function(s) {\n\t\tif (s.name === name) {\n\t\t\tslot = s\n\t\t\treturn true\n\t\t}\n\t})\n\n\tif (!slot)\n\t\tconsole.error('findOutputSlotByName not found', name)\n\n\treturn slot\n}\n\nNode.prototype.findSlotByUid = function(suid) {\n\tvar slot\n\n\tthis.dyn_inputs.concat(this.dyn_outputs)\n\t.some(function(s) {\n\t\tif (s.uid === suid) {\n\t\t\tslot = s\n\t\t\treturn true\n\t\t}\n\t})\n\n\tif (!slot)\n\t\tconsole.error('Slot not found', suid)\n\n\treturn slot\n}\n\nNode.prototype.find_dynamic_slot = function(slot_type, suid) {\n\tvar slots = (slot_type === E2.slot_type.input) ? this.dyn_inputs : this.dyn_outputs;\n\n\tfor(var i = 0, len = slots.length; i < len; i++) {\n\t\tif (slots[i].uid === suid)\n\t\t\treturn slots[i];\n\t}\n\n\tconsole.error('Slot not found', slot_type, suid)\n}\n\nNode.prototype.rename_slot = function(slot_type, suid, name) {\n\tvar slot = this.find_dynamic_slot(slot_type, suid);\n\tvar renamed = false;\n\tif (slot) {\n\t\tslot.name = name;\n\t\tif (this.ui) {\n\t\t\trenamed = this.ui.renameSlot(slot, name, suid, slot_type);\n\t\t}\n\t}\n\treturn renamed;\n}\n\t\nNode.prototype.change_slot_datatype = function(slot_type, suid, dt, arrayness) {\n\tvar slot = this.find_dynamic_slot(slot_type, suid);\n\n\tslot.array = arrayness\n\t\n\tif (slot.dt.id === dt.id) // Anything to do?\n\t\treturn false;\n\t\n\tif (slot.dt.id !== E2.dt.ANY.id) {\n\t\t// Destroy all attached connections.\n\t\tthis.disconnectSlotConnections(slot)\n\t}\n\t\t\n\tslot.dt = dt;\n\treturn true;\n};\n\nNode.prototype.disconnectSlotConnections = function(slot) {\n\tvar pg = this.parent_graph;\n\tvar conns = slot.type === E2.slot_type.input ? this.inputs : this.outputs\n\tvar pending = []\n\tvar c = null\n\n\tfor(var i = 0, len = conns.length; i < len; i++) {\n\t\tc = conns[i]\n\t\n\t\tif (c.src_slot === slot || c.dst_slot === slot)\n\t\t\tpending.push(c)\n\t}\n\n\tfor(var i = 0, len = pending.length; i < len; i++) {\n\t\tpg.disconnect(pending[i])\n\t}\n}\n\nNode.prototype.addInput = function(newConn) {\n\t// Ensure that the order of inbound connections are stored ordered by the indices\n\t// of the slots they're connected to, so that we process them in this order also.\n\tvar inserted = this.inputs.some(function(ec, i) {\n\t\tif (ec.dst_slot.index > newConn.dst_slot.index) {\n\t\t\tthis.inputs.splice(i, 0, newConn)\n\t\t\treturn true;\n\t\t}\n\t}.bind(this))\n\t\n\tif (!inserted) {\n\t\tthis.inputs.push(newConn)\n\t}\n}\n\nNode.prototype.addOutput = function(conn) {\n\tthis.outputs.push(conn)\n}\n\nNode.prototype.removeOutput = function(conn) {\n\tconn.dst_slot.is_connected = false\n\tthis.outputs.splice(this.outputs.indexOf(conn), 1)\n\t\n\tif (!this.slotHasConnections(conn.src_slot)) {\n\t\tconn.src_slot.is_connected = false\n\n\t\tif (this.ui)\n\t\t\tthis.ui.redrawSlots()\n\t}\n}\n\nNode.prototype.removeInput = function(conn) {\n\tconn.dst_slot.is_connected = false\n\tthis.inputs.splice(this.inputs.indexOf(conn), 1)\n}\n\nNode.prototype.update_connections = function() {\n\tthis.outputs.forEach(function(c) {\n\t\tE2.app.getSlotPosition(c.src_node, c.ui.src_slot_div, E2.slot_type.output, c.ui.src_pos)\n\t})\n\t\n\tthis.inputs.forEach(function(c) {\n\t\tE2.app.getSlotPosition(c.dst_node, c.ui.dst_slot_div, E2.slot_type.input, c.ui.dst_pos)\n\t})\n\t\n\treturn this.inputs.length + this.outputs.length\n}\n\n/**\n * set connection UI flow state to off recursively\n */\nNode.prototype._cascadeFlowOff = function(conn) {\n\tconn.ui.flow = false\n\n\tif (conn.src_node.inputs.length) {\n\t\tfor (var i=0; i < conn.src_node.inputs.length; i++) {\n\t\t\tif (conn.src_node.inputs[i].ui.flow)\n\t\t\t\tthis._cascadeFlowOff(conn.src_node.inputs[i])\n\t\t}\n\t}\n}\n\nNode.prototype._cascadeForceUpdate = function(conn) {\n\tconn.src_node.plugin.updated = true\n\n\tif (conn.src_node.inputs.length) {\n\t\tfor (var i = 0, len = conn.src_node.inputs.length; i < len; i++) {\n\t\t\tthis._cascadeForceUpdate(conn.src_node.inputs[i])\n\t\t}\n\t}\n}\n\nNode.prototype._update_input = function(updateContext, inp, pl, conns, needs_update) {\n\tvar result = { dirty: false, needs_update: needs_update }\n\tvar sn = inp.src_node\n\n\tresult.dirty = sn.update_recursive(updateContext, conns)\n\n\t// TODO: Sampling the output value out here might seem spurious, but isn't:\n\t// Some plugin require the ability to set their updated flag in update_output().\n\t// Ideally, these should be rewritten to not do so, and this state should\n\t// be moved into the clause below to save on function calls.\n\tvar value = sn.plugin.update_output(inp.src_slot)\n\n\tif (value === null) {\n\t\tresult.dirty = false\n\t} else if (sn.plugin.updated &&\n\t\t(!sn.plugin.query_output || sn.plugin.query_output(inp.src_slot))\n\t) {\n\t\tif (inp.dst_slot.array && !inp.src_slot.array) {\n\t\t\tvalue = [value]\n\t\t} else if (!inp.dst_slot.array && inp.src_slot.array) {\n\t\t\tvalue = value[0]\n\t\t}\n\n\t\tvar validValue = inp.dst_slot.validate ? inp.dst_slot.validate(value) : value\n\n\t\t// cache the input value for lookups elsewhere\n\t\tpl.inputValues[inp.dst_slot.name] = validValue\n\n\t\t// tell the plugin the input has changed\n\t\tpl.update_input(inp.dst_slot, validValue)\n\n\t\tpl.updated = true\n\t\tresult.needs_update = true\n\n\t\tif (inp.ui && !inp.ui.flow) {\n\t\t\tresult.dirty = true\n\t\t\tinp.ui.flow = true\n\t\t}\n\t} else if(inp.ui && inp.ui.flow) {\n\t\tinp.ui.flow = false\n\t\tresult.dirty = true\n\t}\n\n\treturn result\n}\n\nNode.prototype.update_recursive = function(updateContext, conns) {\n\tvar dirty = false;\n\n\tif (this.update_count > 0)\n\t\treturn dirty;\n\n\tthis.update_count++;\n\n\tvar inputs = this.inputs;\n\tvar pl = this.plugin;\n\tvar needs_update = this.inputs_changed || pl.updated;\n\n\tvar secondPassUpdateInputs = []\n\n\t// input update step 1: collect inactive inputs before any inputs have been updated\n\t// (which could change the state of activeness on other inputs)\n\tfor (var i = 0, len = inputs.length; i < len; ++i) {\n\t\tvar inp = inputs[i]\n\t\tif (inp.dst_slot.inactive) {\n\t\t\tif (inp.ui && inp.ui.flow) {\n\t\t\t\tthis._cascadeFlowOff(inp)\n\t\t\t\tdirty = true\n\t\t\t}\n\t\t\tsecondPassUpdateInputs.push(inp)\n\t\t}\n\t}\n\n\tvar anyInactive = secondPassUpdateInputs.length > 0\n\n\t// input update step 2: first pass input update: update active inputs\n\tfor (var i = 0, len = inputs.length; i < len; ++i) {\n\t\tvar inp = inputs[i]\n\n\t\tif (anyInactive) {\n\t\t\tif (inp.dst_slot.inactive) {\n\t\t\t\t// skip inactive input\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// skip inputs which were previously inactive\n\t\t\t// these need their updated flags set on and\n\t\t\t// will be updated in step 3 below\n\t\t\tif (secondPassUpdateInputs.indexOf(inp) !== -1) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\tvar result = this._update_input(updateContext, inp, pl, conns, needs_update)\n\n\t\tdirty = dirty || result.dirty\n\t\tneeds_update = needs_update || result.needs_update\n\t}\n\n\t// input update step 3: second pass input update: recheck and update any inputs that were deactivated\n\t// before the first update\n\tfor (var i = 0, len = secondPassUpdateInputs.length; i < len; ++i) {\n\t\tvar inp = secondPassUpdateInputs[i]\n\t\tif (!inp.dst_slot.inactive) {\n\t\t\t// set reactivated inputs as updated so that their values are fetched\n\t\t\tthis._cascadeForceUpdate(inp)\n\t\t\t\n\t\t\tvar result = this._update_input(updateContext, inp, pl, conns, needs_update)\n\n\t\t\tdirty = dirty || result.dirty\n\t\t\tneeds_update = needs_update || result.needs_update\n\t\t}\n\t}\n\n\tif (pl.always_update || (pl.isGraph && pl.state.always_update)) {\n\t\tpl.update_state(updateContext);\n\t} else if(this.queued_update > -1) {\n\t\tif(pl.update_state)\n\t\t\tpl.update_state(updateContext);\n\n\t\tpl.updated = true;\n\t\tthis.queued_update--;\n\t} else if(needs_update || (pl.output_slots.length === 0 && (!this.outputs || this.outputs.length === 0))) {\n\t\tif(pl.update_state)\n\t\t\tpl.update_state(updateContext);\n\t\n\t\tthis.inputs_changed = false;\n\t} else if(pl.input_slots.length === 0 && (!this.inputs || this.inputs.length === 0)) {\n\t\tif(pl.update_state)\n\t\t\tpl.update_state(updateContext);\n\t}\n\t\n\treturn dirty;\n}\n\nNode.prototype.setPluginState = function(key, value) {\n\tthis.plugin.state[key] = value\n\n\tthis.plugin.updated = true\n\tthis.plugin.dirty = true\n\n\tthis.emit('pluginStateChanged', key, value)\n}\n\nNode.prototype.serialise = function(flat) {\n\tvar that = this\n\n\tfunction pack_dt(slots) {\n\t\tfor(var i = 0, len = slots.length; i < len; i++) {\n\t\t\tdelete slots[i].desc;\n\t\t\tslots[i].dt = slots[i].dt.id;\n\t\t}\n\t}\n\n\tvar d = {};\n\t\n\td.plugin = this.plugin.id;\n\td.x = Math.round(this.x);\n\td.y = Math.round(this.y);\n\td.uid = this.uid;\n\t\n\tif (Object.keys(this.uiSlotValues).length)\n\t\td.uiSlotValues = this.uiSlotValues\n\n\tif (!this.open)\n\t\td.open = this.open;\n\t\n\tif (this.plugin.state)\n\t\td.state = this.plugin.state;\n\n\tif (this.title)\n\t\td.title = this.title;\n\t\n\tif (!flat && this.plugin.isGraph)\n\t\td.graph = this.plugin.graph.serialise();\n\t\n\tif (this.dyn_inputs.length || this.dyn_outputs.length) {\n\t\tif (this.dyn_inputs.length) {\n\t\t\td.dyn_in = clone(this.dyn_inputs);\n\t\t\tpack_dt(d.dyn_in);\n\t\t}\n\t\t\n\t\tif (this.dyn_outputs.length) {\n\t\t\td.dyn_out = clone(this.dyn_outputs);\n\t\t\tpack_dt(d.dyn_out);\n\t\t}\n\t}\n\n\treturn d;\n};\n\n// force all uid's and sids into strings. issue #135\nNode.prototype.fixStateSidsIssue135 = function(state) {\n\tfunction stringifySids(sids) {\n\t\tObject.keys(sids).map(function(uid) {\n\t\t\tsids[''+uid] = ''+sids[uid]\n\t\t})\n\t}\n\n\tif (state.input_sids)\n\t\tstringifySids(state.input_sids)\n\n\tif (state.output_sids)\n\t\tstringifySids(state.output_sids)\n}\n\nNode.prototype.deserialise = function(guid, d) {\n\tvar idMap = {\n\t\t'register_local_read': 'variable_local_read',\n\t\t'register_local_write': 'variable_local_write',\n\t\t'on_three_object_gaze_clicked': 'on_three_object_rayup',\n\t\t'on_three_object_gaze_in': 'on_three_object_rayover',\n\t\t'on_three_object_gaze_out': 'on_three_object_rayout'\n\t}\n\n\tif (idMap[d.plugin])\n\t\td.plugin = idMap[d.plugin]\n\n\tthis.parent_graph = guid;\n\tthis.x = d.x;\n\tthis.y = d.y;\n\tthis.id = E2.core.pluginManager.keybyid[d.plugin];\n\tthis.uid = '' + d.uid;\n\tthis.open = d.open !== undefined ? d.open : true;\n\t\n\tthis.title = d.title ? d.title : null;\n\n\t// make object3d patches use `entity` instead\n\tif (d.plugin === 'graph' && d.dyn_out && d.dyn_out.length === 1 &&\n\t\td.dyn_out[0].dt === E2.dt.OBJECT3D.id)\n\t{\n\t\td.plugin = 'entity'\n\t}\n\n\tvar plg = E2.core.pluginManager.create(d.plugin, this)\n\tif (!plg) {\n\t\tmsg('ERROR: Failed to instantiate node of type \\'' + d.plugin + '\\' with title \\'' + this.title + '\\' and UID = ' + this.uid + '.')\n\t\treturn false\n\t}\n\n\tthis.set_plugin(plg)\n\t\n\tif (this.plugin.isGraph) {\n\t\tthis.plugin.setGraph(new Graph(E2.core, null, null))\n\t\tthis.plugin.graph.plugin = this.plugin;\n\t\tthis.plugin.graph.deserialise(d.graph);\n\n\t\tif (E2.core.graphs.indexOf(this.plugin.graph) === -1)\n\t\t\tE2.core.graphs.push(this.plugin.graph);\n\t}\n\t\n\tif (d.state && this.plugin.state) {\n\t\tthis.fixStateSidsIssue135(d.state)\n\n\t\tfor(var key in d.state) {\n\t\t\tif (!d.state.hasOwnProperty(key))\n\t\t\t\tcontinue;\n\n\t\t\tif (key in this.plugin.state)\n\t\t\t\tthis.plugin.state[key] = d.state[key];\n\t\t}\n\t}\n\t\n\tif (d.dyn_in || d.dyn_out) {\n\t\tfunction patch_slot(slots, type) {\n\t\t\tvar rdt = E2.core.resolve_dt;\n\t\t\t\n\t\t\tfor(var i = 0; i < slots.length; i++) {\n\t\t\t\tvar s = slots[i];\n\t\t\t\ts.uid = '' + s.uid;\n\t\t\t\ts.dynamic = true;\n\t\t\t\ts.dt = rdt[s.dt];\n\t\t\t\ts.type = type;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (d.dyn_in) {\n\t\t\tthis.dyn_inputs = d.dyn_in;\n\t\t\tpatch_slot(this.dyn_inputs, E2.slot_type.input);\n\t\t}\n\n\t\tif (d.dyn_out) {\n\t\t\tthis.dyn_outputs = d.dyn_out;\n\t\t\tpatch_slot(this.dyn_outputs, E2.slot_type.output);\n\t\t}\n\t}\n\n\tif (d.uiSlotValues)\n\t\tthis.uiSlotValues = d.uiSlotValues\n\n\treturn true;\n};\n\nNode.prototype.patch_up = function(graphs) {\n\tif (!(this.parent_graph instanceof Graph))\n\t\tthis.parent_graph = Graph.resolve_graph(graphs, this.parent_graph);\n\n\tfunction initStructure(pg, n) {\n\t\tn.parent_graph = pg\n\n\t\tif (!n.plugin.isGraph)\n\t\t\treturn;\n\n\t\tif (n.plugin.graph.uid === undefined)\n\t\t\tn.plugin.graph.uid = E2.core.get_uid()\n\n\t\tn.plugin.graph.parent_graph = pg\n\n\t\tvar nodes = n.plugin.graph.nodes\n\t\t\n\t\tfor(var i = 0, len = nodes.length; i < len; i++)\n\t\t\tinitStructure(n.plugin.graph, nodes[i])\n\t}\n\n\tinitStructure(this.parent_graph, this)\n\t\n\tif (this.plugin.isGraph)\n\t\tthis.plugin.graph.patch_up(graphs)\n}\n\nNode.prototype.initialise = function() {\n\tif (this.plugin.state_changed)\n\t\tthis.plugin.state_changed(null)\n\n\tif (this.plugin.isGraph)\n\t\tthis.plugin.graph.initialise()\n}\n\nNode.prototype.getInspectorStateProps = function() {\n\t// get any state properties my plugin allows ui to access and from each such prop make a proxy\n\tif (typeof this.plugin.getInspectorProperties === 'undefined') return {}\n\tvar that = this, plugin = this.plugin, state = plugin.state\n\tvar props = plugin.getInspectorProperties()\n\tvar ret = {}\n\tObject.keys(props).forEach(function(name){\n\t\tvar prop = props[name]\n\t\tret[name] = {\n\t\t\tdt \t\t: prop.dt,\n\t\t\tlabel \t: prop.label,\n\t\t\tget canEdit() {\n\t\t\t\treturn typeof plugin.undoableSetState === 'function'\n\t\t\t},\n\t\t\tget _value() {\n\t\t\t\treturn state[name]\n\t\t\t},\n\t\t\t// only use this setter for debugging\n\t\t\t// node.plugin.undoableSetState() otherwise\n\t\t\tset _value(v) {\n\t\t\t\treturn that.setPluginState(name, v)\n\t\t\t}\n\t\t}\n\t})\n\treturn ret\n}\n\n/**\n * @param slotNames optional explicit list\n */\nNode.prototype.getInspectorSlotProps = function(slotNames) {\n\tif (!(slotNames instanceof Array)) {\n\t\t// get any slots my plugin allows ui to access and for each such slot make a proxy\n\t\tif (typeof this.plugin.getInspectorSlotNames === 'undefined') return {}\t\t// v1\n\t\tslotNames = slotNames || this.plugin.getInspectorSlotNames()\n\t}\n\n\tvar that = this\n\tvar ret = {}\n\tslotNames.forEach(function(name){\t// non-dynamic, input slots only\n\t\tvar slot = that.findInputSlotByName(name)\n\t\tret[name] = {\n\t\t\tdt \t\t: slot.dt,\n\t\t\tlabel \t: slot.label || slot.name,\n\t\t\tget canEdit() {\n\t\t\t\treturn !slot.is_connected\n\t\t\t},\n\t\t\tget default() {\n\t\t\t\treturn that.getUiSlotValue(slot)\n\t\t\t},\n\t\t\tget _value() {\n\t\t\t\treturn that.getInputSlotValue(name)\n\t\t\t},\n\t\t\t// only use this setter for debugging\n\t\t\t// E2.app.graphApi.changeInputSlotValue() otherwise\n\t\t\tset _value(v) {\n\t\t\t\treturn that.setInputSlotValue(name, v)\n\t\t\t}\n\t\t}\n\t})\n\treturn ret\n}\n\nNode.hydrate = function(guid, json) {\n\tvar node = new Node()\n\tnode.deserialise(guid, json)\n\tnode.patch_up(E2.core.graphs)\n\treturn node\n}\n\nNode.isGraphPlugin = function(pluginId) {\n\treturn (E2.GRAPH_NODES.indexOf(pluginId) > -1)\n}\n\nfunction LinkedSlotGroup(core, parent_node, inputs, outputs) {\n\tthis.core = core;\n\tthis.node = parent_node;\n\tthis.inputs = inputs;\n\tthis.outputs = outputs;\n\tthis.n_connected = 0;\n\tthis.dt = core.datatypes.ANY;\n}\n\nLinkedSlotGroup.prototype.forceOutputArrayness = function(arrayness) {\n\tthis.forcedOutputArrayness = arrayness\n}\n\nLinkedSlotGroup.prototype.setArrayness = function(arrayness) {\n\tfor(var i = 0, len = this.inputs.length; i < len; i++) {\n\t\tthis.inputs[i].array = arrayness\n\t}\n\n\tfor(var i = 0, len = this.outputs.length; i < len; i++) {\n\t\tthis.outputs[i].array = this.forcedOutputArrayness === undefined ? arrayness : this.forcedOutputArrayness\n\t}\n}\n\nLinkedSlotGroup.prototype.set_dt = function(dt) {\n\tthis.dt = dt;\n\t\n\tfor(var i = 0, len = this.inputs.length; i < len; i++)\n\t\tthis.inputs[i].dt = dt\n\n\tfor(var i = 0, len = this.outputs.length; i < len; i++)\n\t\tthis.outputs[i].dt = dt\n}\n\nLinkedSlotGroup.prototype.add_dyn_slot = function(slot) {\n\t(slot.type === E2.slot_type.input ? this.inputs : this.outputs).push(slot);\n}\n\nLinkedSlotGroup.prototype.remove_dyn_slot = function(slot) {\n\tvar inOrOut = (slot.type === E2.slot_type.input ? this.inputs : this.outputs)\n\tvar slotIdx = inOrOut.indexOf(slot)\n\tif (slotIdx > -1)\n\t\tinOrOut.splice(slotIdx, 1);\n}\n\nLinkedSlotGroup.prototype.connection_changed = function(on, conn, slot) {\n\tif (this.inputs.indexOf(slot) === -1 && this.outputs.indexOf(slot) === -1)\n\t\treturn;\n\t\n\tthis.n_connected += on ? 1 : -1;\n\n\tif (on && this.n_connected === 1) {\n\t\tvar otherSlot = (slot.type === E2.slot_type.input) ? conn.src_slot : conn.dst_slot\n\t\tthis.set_dt(otherSlot.dt)\n\n\t\tthis.setArrayness(otherSlot.array)\n\n\t\treturn true;\n\t}\n\t\n\tif(!on && this.n_connected === 0) {\n\t\tthis.set_dt(this.core.datatypes.ANY);\n\n\t\tthis.setArrayness(false)\n\n\t\treturn true;\n\t}\n\t\n\treturn false;\n}\n\nLinkedSlotGroup.prototype.infer_dt = function() {\n\tvar node = this.node;\n\tvar dt = null;\n\tvar any_dt = this.core.datatypes.ANY.id;\n\n\tvar anyConnectionIsArray = false\n\n\tfor(var i = 0, len = node.inputs.length; i < len; i++) {\n\t\tvar c = node.inputs[i];\n\t\t\n\t\tif(this.inputs.indexOf(c.dst_slot) !== -1) {\n\t\t\tdt = c.src_slot.dt.id !== any_dt ? c.src_slot.dt : dt;\n\n\t\t\tif (c.src_slot.array) {\n\t\t\t\tanyConnectionIsArray = true\n\t\t\t}\n\n\t\t\tthis.n_connected++;\n\t\t}\n\t}\n\n\tfor(var i = 0, len = node.outputs.length; i < len; i++) {\n\t\tvar c = node.outputs[i];\n\t\t\n\t\tif(this.outputs.indexOf(c.src_slot) !== -1) {\n\t\t\tdt = c.dst_slot.dt.id !== any_dt ? c.dst_slot.dt : dt;\n\n\t\t\tif (c.dst_slot.array) {\n\t\t\t\tanyConnectionIsArray = true\n\t\t\t}\n\t\t\tthis.n_connected++;\n\t\t}\n\t}\n\n\tthis.setArrayness(anyConnectionIsArray)\n\t\n\tif (dt) {\n\t\tthis.set_dt(dt);\n\t\treturn this.core.get_default_value(dt);\n\t}\n\t\n\treturn null;\n};\n\nLinkedSlotGroup.prototype.updateFreeSlots = function() {}\n\n\nif (typeof(module) !== 'undefined') {\n\tmodule.exports.Node = Node\n\tmodule.exports.LinkedSlotGroup = LinkedSlotGroup\n}\n\n\n"
  },
  {
    "path": "browser/scripts/noise.js",
    "content": "(function() {\n\tvar Noise = E2.Noise = function(size, rngSeed) {\n\t\tthis.seed(size || 256, rngSeed || 0)\n\t}\n\n\tNoise.prototype.seed = function(size, rngSeed) {\n\t\tthis.size = Math.floor(size)\n\t\tthis.rngSeed = rngSeed\n\n\t\tthis.rng = new Random(Random.engines.mt19937().seed(this.rngSeed))\n\n\t\tthis.rns = []\n\n\t\tfor (var i = 0; i < size; i++) {\n\t\t\tthis.rns[i] = this.rng.real(0, 1)\n\t\t}\n\t}\n\n\tNoise.prototype.noise1D = function(n, level) {\n\t\tvar x = this.rns[Math.floor(n % this.size)]\n\t\tvar xplus1 = this.rns[Math.floor((n + 1) % this.size)]\n\n\t\tvar f = n - Math.floor(n)\n\t\tvar smoothstep = f * f * (3 - 2 * f)\n\n\t\tvar res = x + (xplus1 - x) * smoothstep\n\n\t\tif (level > 0) {\n\t\t\tres = res * 0.5 + this.noise1D((n + this.size / (level + 1)) / 2, level - 1)\n\t\t}\n\n\t\treturn res\n\t}\n\n\tNoise.prototype.noise2D = function(n, m, level, stride) {\n\t\tvar xstride = stride || 40\n\n\t\tvar mi = Math.floor(m)\n\t\tvar ni = Math.floor(n)\n\n\t\tvar x1 = this.rns[(mi * xstride + ni) % this.size]\n\t\tvar x1plus1 = this.rns[((mi * xstride + ni) + 1) % this.size]\n\n\t\tvar x2 = this.rns[((mi * xstride + ni) + xstride) % this.size]\n\t\tvar x2plus1 = this.rns[(((mi * xstride + ni) + xstride) + 1) % this.size]\n\n\t\tvar xf = n - ni\n\t\tvar xsmoothstep = xf * xf * (3 - 2 * xf)\n\n\t\tvar yf = m - mi\n\t\tvar ysmoothstep = yf * yf * (3 - 2 * yf)\n\n\t\tvar x1val = x1 + (x1plus1 - x1) * xsmoothstep\n\t\tvar x2val = x2 + (x2plus1 - x2) * xsmoothstep\n\n\t\tvar res = x1val + (x2val - x1val) * ysmoothstep\n\n\t\tif (level > 0) {\n\t\t\tres = res * 0.5 + this.noise2D((n + this.size / (level + 1)) / 2, (m + this.size / (level + 1)) / 2, level - 1, xstride)\n\t\t}\n\n\t\treturn res\n\t}\n})();\n\n"
  },
  {
    "path": "browser/scripts/patchManager.js",
    "content": "\nfunction PatchManager() {\n\tEventEmitter.call(this)\n\n\tthis._patches = []\n\tthis._worldPatches = []\n\tthis._patchesByPath = {}\n\n\tthis.refresh()\n\n\tE2.models.user.on('change', this.refresh.bind(this))\n}\n\nPatchManager.prototype = Object.create(EventEmitter.prototype)\n\nPatchManager.prototype.loadPlugins = function() {\n\tvar that = this\n\tvar dfd = when.defer()\n\n\tvar data = E2.core.pluginsByCategory\n\n\tObject.keys(data).forEach(function(catName) {\n\t\tObject.keys(data[catName]).forEach(function(title) {\n\t\t\tthat.add(catName, title, 'plugin', 'plugin/'+data[catName][title])\n\t\t})\n\t})\n\n\tdfd.resolve()\n\n\treturn dfd.promise\n}\n\nPatchManager.prototype.loadPatches = function() {\n\tvar that = this\n\tvar dfd = when.defer()\n\n\tfunction processPatches(data) {\n\t\tE2.core.patchesList = data\n\n\t\tdata.map(function(patchMeta) {\n\t\t\t// disable Components in production until Components library is ready\n\t\t\t// My Patches will still include them below\n\t\t\tif (Vizor.releaseMode && patchMeta.type === 'entity_component')\n\t\t\t\treturn;\n\n\t\t\tthat.add(patchMeta.category, patchMeta.name, patchMeta.type,\n\t\t\t\tAssetLoader.getCDNURL(patchMeta.url))\n\n\t\t\tif (E2.WORLD_PATCHES.indexOf(patchMeta.type) > -1)\n\t\t\t\tthat.addWorldPatch(patchMeta.type, patchMeta.category, patchMeta.name,\n\t\t\t\t\tAssetLoader.getCDNURL(patchMeta.url))\n\t\t})\n\n\t\tdfd.resolve()\n\t}\n\n\tif (E2.core.patchesList)\n\t\treturn processPatches(E2.core.patchesList)\n\n\t$.ajax({\n\t\turl: '/vizor/patches',\n\t\tcache: true\n\t})\n\t.done(processPatches)\n\t.fail(function() {\n\t\tmsg('ERROR: PatchManager: No patches found.')\n\t\tdfd.reject('ERROR: PatchManager: No patches found.')\n\t})\n\n\treturn dfd.promise\n}\n\nPatchManager.prototype.loadUserPatches = function() {\n\tvar that = this\n\tvar dfd = when.defer()\n\n\tvar username = E2.models.user.get('username')\n\tif (!username) {\n\t\tdfd.resolve()\n\t} else {\n\t\t$.get('/'+username+'/patches', function(patches) {\n\t\t\tvar cat = 'MY PATCHES'\n\n\t\t\tpatches.forEach(function(patch) {\n\t\t\t\tthat.add(cat, patch.name, patch.type, patch.url)\n\n\t\t\t\tif (E2.WORLD_PATCHES.indexOf(patch.type) > -1)\n\t\t\t\t\tthat.addWorldPatch(patch.type, cat, patch.name, patch.url)\n\t\t\t})\n\n\t\t\tdfd.resolve()\n\t\t})\n\t}\n\n\treturn dfd.promise\n}\n\nPatchManager.prototype.refresh = function() {\n\tvar that = this\n\n\tthis._patches = []\n\tthis._worldPatches = []\n\tthis._patchesByPath = {}\n\n\tthis.loadUserPatches()\n\t.then(function() {\n\t\treturn that.loadPatches()\n\t})\n\t.then(function() {\n\t\treturn that.loadPlugins()\n\t})\n\t.then(function() {\n\t\tthat.renderPatches()\n\t\tthat.renderWorldPatches()\n\t})\n}\n\nfunction categorySort(a, b) {\n\tif (a.category === 'MY PATCHES' && b.category === 'MY PATCHES')\n\t\treturn 0 // keep ordered by most-recent\n\n\tif (a.category === 'MY PATCHES')\n\t\treturn -1\n\n\tif (b.category === 'MY PATCHES')\n\t\treturn 1\n\n\tif (a.type === 'plugin' && b.type !== 'plugin')\n\t\treturn 1\n\n\tif (b.type === 'plugin' && a.type !== 'plugin')\n\t\treturn -1\n\n\tvar score = a.category.localeCompare(b.category)\n\n\tif (score === 0)\n\t\treturn a.title.localeCompare(b.title)\n\n\treturn score\n}\n\nPatchManager.prototype.renderPatches = function() {\n\tvar that = this\n\n\tnew CollapsibleSelectControl()\n\t.data(this._patches.sort(categorySort))\n\t.template(E2.views.patches.patches)\n\t.render(E2.dom.patches_list, {\n\t\tsearchPlaceholderText : 'Search patches'\n\t})\n\t.onOpen(function(selection) {\n\t\tif (selection.path.indexOf('plugin/') === 0)\n\t\t\treturn that.openPlugin(selection.path)\n\n\t\tthat.openPatch(selection)\n\t})\n\n\tvar patchSearch = $('#patches-lib .searchbox input')\n\tpatchSearch.focus(E2.ui.onLibSearchClicked.bind(E2.ui))\n}\n\nPatchManager.prototype.renderWorldPatches = function() {\n\tnew CollapsibleSelectControl()\n\t.data(this._worldPatches.sort(categorySort))\n\t.template(E2.views.patches.patches)\n\t.render(E2.dom.objectsList, {\n\t\tsearchPlaceholderText : 'Search world patches'\n\t})\n\t.onOpen(this.openPatch.bind(this))\n\n\tvar objectSearch = $('.searchbox input', E2.dom.objectsList)\n\tobjectSearch.focus(E2.ui.onLibSearchClicked.bind(E2.ui))\n}\n\nPatchManager.prototype.openPatch = function(selection) {\n\tvar that = this\n\tvar targetObject3d = selection.targetObject3d\n\tvar patchMeta = this._patchesByPath[selection.path]\n\n\t$.ajax({\n\t\turl: selection.path,\n\t\tdataType: 'text'\n\t})\n\t.done(function(data) {\n\t\tE2.track({\n\t\t\tevent: 'patchAdded',\n\t\t\ttitle: patchMeta.title,\n\t\t\tcategory: patchMeta.category,\n\t\t\ttype: patchMeta.type,\n\t\t\tpath: patchMeta.path\n\t\t})\n\n\t\tthat.emit('open', patchMeta, data, targetObject3d)\n\t})\n\t.fail(function(_j, _textStatus, _errorThrown) {\n\t\tmsg('ERROR: Failed to load the selected patch.')\n\t\tconsole.error(_errorThrown)\n\t})\n}\n\nPatchManager.prototype.addWorldPatch = function(typeName, category, title, path) {\n\tvar patchMeta = {\n\t\ttype: typeName || 'patch',\n\t\tcategory: category,\n\t\ttitle: title,\n\t\tpath: path\n\t}\n\n\tthis._patchesByPath[path] = patchMeta\n\tthis._worldPatches.push(patchMeta)\n}\n\nPatchManager.prototype.add = function(category, title, type, path) {\n\tif (this._patchesByPath[path])\n\t\treturn;\n\n\tvar patchMeta = {\n\t\ttype: type || 'patch',\n\t\tcategory: category,\n\t\ttitle: title,\n\t\tpath: path\n\t}\n\n\tthis._patchesByPath[path] = patchMeta\n\tthis._patches.push(patchMeta)\n}\n\nPatchManager.prototype.openPlugin = function(path, cb) {\n\tvar id = path.substring('plugin/'.length)\n\tvar canvasX = E2.dom.canvases.position().left\n\tvar mouseX = E2.app.mousePosition[0]\n\tvar canvasY = E2.dom.canvases.position().top\n\tvar mouseY = E2.app.mousePosition[1]\n\n\t// Add the canvas X position to the mouse X position when double clicking from the patch list to avoid spawning plugins under the list\n\tif (canvasX > mouseX)\n\t\tmouseX += canvasX\n\n\tmouseY -= canvasY\n\n\tE2.app.instantiatePlugin(id, [mouseX, mouseY])\n}\n"
  },
  {
    "path": "browser/scripts/peopleManager.js",
    "content": "\nfunction PeopleManager(peopleStore, $el) {\n\tvar that = this\n\n\tthis.peopleStore = peopleStore\n\tthis.$el = $el\n\tthis._template = E2.views.partials.peopleMenu\n\n\tthis.peopleStore.on('added', this.render.bind(this))\n\tthis.peopleStore.on('removed', this.render.bind(this))\n\tthis.peopleStore.on('userUnfollowed', function(person, followee) {\n\t\tif (followee.uid === E2.app.channel.uid)\n\t\t\tE2.app.growl(person.username+' stopped following you', 'unfollowed', 4000, person)\n\n\t\tthat.render()\n\t})\n\tthis.peopleStore.on('userFollowed', function(person, followee) {\n\t\tif (followee.uid === E2.app.channel.uid)\n\t\t\tE2.app.growl(person.username+' started following you', 'followed', 4000, person)\n\n\t\tthat.render()\n\t})\n}\n\nPeopleManager.prototype.render = function() {\n\tvar that = this\n\n\tif (!E2.app.channel.connected)\n\t\treturn;\n\n\tvar people = this.peopleStore.list().map(function(p) {\n\t\tp.followed = (p.uid === that.peopleStore.me.followUid)\n\n\t\tif (p.uid === E2.app.channel.uid)\n\t\t\tp.itsMe = true\n\n\t\treturn p\n\t})\n\n\tvar html = this._template({ people: people })\n\n\tthis.$el.empty().html(html)\n\n\tthis.$el.find('li').click(function(e) {\n\t\tvar $t = $(e.target).closest('li')\n\t\tvar uid = $t.data('uid')\n\n\t\tif (that.peopleStore.me.followUid === uid) {\n\t\t\tE2.app.dispatcher.dispatch({\n\t\t\t\tactionType: 'uiUserIdUnfollowed',\n\t\t\t\tfollowUid: uid\n\t\t\t})\n\t\t} else {\n\t\t\tif (uid === E2.app.channel.uid)\n\t\t\t\treturn;\n\n\t\t\tE2.app.dispatcher.dispatch({\n\t\t\t\tactionType: 'uiUserIdFollowed',\n\t\t\t\tfollowUid: uid\n\t\t\t})\n\t\t}\n\t})\n}\n\n\n"
  },
  {
    "path": "browser/scripts/player-run.js",
    "content": "(function() {\n\nwindow.playVizorFile = function() {\n\treturn E2.app.player.loadAndPlay(readUrl())\n}\n\nfunction readUrl() {\n\tvar $canvas = $('canvas[data-graph-url]')\n\tvar url = $canvas.data('graph-url')\n\treturn url\n}\n\nfunction onCoreReady() {\n\tE2.app.player.on_update()\n\n\tE2.track({\n\t\tevent: 'playerOpened',\n\t\tpath: readUrl()\n\t})\n\n\t$(window).trigger('vizorLoaded')\n\n\tif (Vizor.autoplay)\n\t\twindow.playVizorFile()\n}\n\n$(document).ready(function()  {\n\tCreatePlayer(onCoreReady)\n})\n\n// postMessage API for setting variables in embedded files\nwindow.addEventListener('message', function(e) {\n\tfunction send(message) {\n\t\te.source.postMessage(message, e.origin)\n\t}\n\n\tswitch(e.data.command) {\n\t\tcase 'getVariable':\n\t\t\tsend({\n\t\t\t\tname: e.data.name, \n\t\t\t\tvalue: E2.app.player.getVariableValue(e.data.name)\n\t\t\t})\n\t\t\tbreak;\n\n\t\tcase 'setVariable':\n\t\t\tE2.app.player.setVariableValue(e.data.name, e.data.value)\n\t\t\tbreak;\n\t}\n}, false)\n\n\n})()\n\n"
  },
  {
    "path": "browser/scripts/player.js",
    "content": "function Player() {\n\tthis.state = {\n\t\tSTOPPED: 0,\n\t\tLOADING: 1,\n\t\tREADY: 2,\n\t\tPAUSED: 3,\n\t\tPLAYING: 4\n\t}\n\n\tthis.app = E2.app\n\tthis.core = E2.core\n\n\tthis.interval = null\n\tthis.abs_time = 0.0\n\tthis.last_time = (new Date()).getTime()\n\n\tthis._current_state = this.state.STOPPED\n\tObject.defineProperty(this, 'current_state', {\n\t\tget: function() {\n\t\t\treturn this._current_state\n\t\t},\n\t\tset: function(newState) {\n\t\t\tvar oldState = this._current_state\n\t\t\tthis._current_state = newState\n\t\t\tE2.core.emit('player:stateChanged', newState, oldState)\n\t\t}\n\t})\n\n\tthis.frames = 0\n\tthis.scheduled_stop = null\n\n\tthis.current_state = this.state.STOPPED\n\t\n\tthis.core.active_graph = this.core.root_graph = new Graph(this.core, null, 'root')\n\tthis.core.graphs.push(this.core.root_graph)\n\n\tvar canvas = E2.dom.webgl_canvas[0]\n\tthis.vrControlCamera = new THREE.PerspectiveCamera(\n\t\t\t\t90,\n\t\t\t\tcanvas.clientWidth / canvas.clientHeight,\n\t\t\t\t0.001,\n\t\t\t\t1000)\n\n\tthis.concatenatedCamera = this.vrControlCamera.clone()\n\n\tthis.setupInput()\n\n\tthis.boundOnAnimFrame = this.on_anim_frame.bind(this)\n}\n\nPlayer.prototype.setupInput = function() {\n\tthis.rayInput = new RayInput.default(this.concatenatedCamera, E2.dom.webgl_canvas[0])\n\tthis.rayInput.setSize({ width: 0, height: 0 })\n\t\n\tvar el = document.body\n\n\tthis.rayInput.on('raydown', function(mesh) {\n\t\tif (!mesh || E2.app.worldEditor.isActive())\n\t\t\treturn;\n\n\t\tE2.core.runtimeEvents.emit('raydown:'+mesh.uuid)\n\t})\n\n\tthis.rayInput.on('rayup', function(mesh) {\n\t\tif (!mesh || E2.app.worldEditor.isActive())\n\t\t\treturn;\n\n\t\tE2.core.runtimeEvents.emit('rayup:'+mesh.uuid)\n\n\t})\n\n\tthis.rayInput.on('rayover', function(mesh) {\n\t\tif (!mesh || E2.app.worldEditor.isActive())\n\t\t\treturn;\n\n\t\tel.style.cursor = 'pointer'\n\n\t\tE2.core.runtimeEvents.emit('rayover:'+mesh.uuid)\n\t})\n\n\tthis.rayInput.on('rayout', function(mesh) {\n\t\tif (!mesh || E2.app.worldEditor.isActive())\n\t\t\treturn;\n\n\t\tel.style.cursor = ''\n\n\t\tE2.core.runtimeEvents.emit('rayout:'+mesh.uuid)\n\t})\n\n\tE2.core.on('resize', function(evt) {\n\t\tE2.app.player.rayInput.setSize(evt)\n\t})\n}\n\nPlayer.prototype.play = function() {\n\tif (this.current_state === this.state.PLAYING)\n\t\treturn;\n\n\tthis.core.root_graph.play()\n\tthis.current_state = this.state.PLAYING\n\tthis.last_time = (new Date()).getTime()\n\n\tthis.first_frame = true\n\n\tE2.core.emit('player:playing')\n\n\tif (!this.interval) {\n\t\tthis.interval = E2.util.requestAnimationFrame(this.boundOnAnimFrame)\n\t}\n}\n\nPlayer.prototype.pause = function() {\n\tthis.current_state = this.state.PAUSED\n\t\n\tthis.core.root_graph.pause()\n}\n\nPlayer.prototype.schedule_stop = function(delegate) {\n\tthis.scheduled_stop = delegate\n}\n\nPlayer.prototype.stop = function() {\n\tif (this.interval !== null) {\n\t\tE2.util.cancelAnimationFrame(this.interval)\n\t\tthis.interval = null\n\t}\n\t\n\tthis.core.root_graph.stop()\n\n\tthis.abs_time = 0.0\n\tthis.frames = 0\n\tthis.current_state = this.state.STOPPED\n\tthis.core.abs_t = 0.0\n\n\tthis.core.root_graph.reset()\n\t\n\tif (E2.app && E2.app.updateCanvas)\n\t\tE2.app.updateCanvas(false)\n}\n\nPlayer.prototype.on_anim_frame = function() {\n\tthis.interval = E2.util.requestAnimationFrame(this.boundOnAnimFrame)\n\n\tthis.on_update()\n\n\tif (this.first_frame) {\n\t\tE2.core.emit('player:firstFramePlayed')\n\t\tthis.first_frame = false\n\t}\n}\n\nPlayer.prototype.on_update = function() {\n\tif (this.scheduled_stop) {\n\t\tthis.stop()\n\t\tthis.scheduled_stop()\n\t\tthis.scheduled_stop = null\n\t\treturn\n\t}\n\n\tvar time = this.current_state !== this.state.PAUSED ? Date.now() : this.last_time\n\tvar delta_t = (time - this.last_time) * 0.001\n\t\n\tif (this.core.update(this.abs_time, delta_t) && E2.app.updateCanvas)\n\t\tE2.app.updateCanvas(false)\n\n\tE2.app.worldEditor.update()\n\n\tthis.last_time = time\n\tthis.abs_time += delta_t\n\tthis.frames++\n}\n\nPlayer.prototype.select_active_graph = function() {\n\t// Select the active graph and build its UI, but only if there's an editor present\n\tif (E2.app && E2.app.onGraphSelected)\n\t\tE2.app.onGraphSelected(this.core.active_graph)\n}\n\nPlayer.prototype.load_from_json = function(json, cb) {\n\tthis.load_from_object(JSON.parse(json), cb)\n}\n\nPlayer.prototype.load_from_object = function(obj, cb) {\n\tvar c = this.core\n\tc.deserialiseObject(obj)\n\n\tthis.current_state = this.state.LOADING\n\n\tE2.core.assetLoader\n\t\t.loadAssetsForGraph(obj.root)\n\t\t.then(function() {\n\t\t\tif (cb)\n\t\t\t\tcb()\n\t\t})\n\t\t.catch(function(err) {\n\t\t\tconsole.error('Player preload failed: '+err)\n\n\t\t\tif (cb)\n\t\t\t\tcb(err)\n\t\t})\n\t\t.finally(function() {\n\t\t\tE2.core.emit('assetsLoaded')\n\t\t})\n}\n\nPlayer.prototype.load_from_url = function(url, cb) {\n\tvar that = this\n\n\t$.ajax({\n\t\turl: url,\n\t\tcache: true,\n\t\tdataType: 'text',\n\t\theaders: {},\n\t\tsuccess: function(json) {\n\t\t\tthat.load_from_json(json, cb)\n\t\t}\n\t})\n\n\tthis.current_state = this.state.LOADING\n\n\tE2.core.emit('player:loading')\n}\n\nPlayer.prototype.getVariableValue = function(id) {\n\treturn this.core.root_graph.variables.read(id)\n}\n\nPlayer.prototype.setVariableValue = function(id, value) {\n\tthis.core.root_graph.variables.write(id, value)\n}\n\nPlayer.prototype.add_parameter_listener = function(id, listener) {\n\tvar l = {\n\t\tvariable_dt_changed: function() {},\n\t\tvariable_updated: function(h) { return function(value) { h(value) }}(listener)\n\t}\n\t\n\tthis.core.root_graph.variables.lock(l, id)\n\treturn l\n}\n\nPlayer.prototype.remove_parameter_listener = function(id, listener) {\n\tthis.core.variables.unlock(listener, id)\n}\n\nPlayer.prototype.loadGraph = function(url) {\n\tvar dfd = when.defer()\n\n\t// if there's an existing anim frame request, cancel it\n\t// so that nothing gets rendered until we ask to play() again after loading\n\tif (this.interval !== null) {\n\t\tE2.util.cancelAnimationFrame(this.interval)\n\t\tthis.interval = null\n\t}\n\n\tif (E2.core.audioContext && E2.util.isMobile.iOS()) {\n\t\t// iOS requires a user interaction to play sound. as this is called \n\t\t// on touchstart, create a dummy audio source and play it\n\t\tvar audioSource = E2.core.audioContext.createBufferSource()\n\t\taudioSource.start()\n\t}\n\n\tE2.app.player.load_from_url(url, function(err) {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\n\t\tdfd.resolve()\n\t})\n\n\treturn dfd.promise\n}\n\nPlayer.prototype.loadAndPlay = function(url) {\n\tvar that = this\n\n\treturn this.loadGraph(url)\n\t.catch(function(err) {\n\t\tif (err)\n\t\t\tconsole.error(err.stack)\n\t})\n\t.finally(function() {\n\t\tthat.current_state = that.state.READY\n\n\t\tif (Vizor.hasVideo && VizorUI.isMobile.Android())\n\t\t\treturn\n\n\t\treturn E2.app.player.play()\n\t})\n}\n\nPlayer.prototype.getScreenshot = function(width, height) {\n\twidth = width || 1280\n\theight = height || 720\n\tvar ssr = new ScreenshotRenderer(this.scene, this.vrControlCamera)\n\treturn ssr.capture(width, height)\n}\n\nfunction CreatePlayer(cb) {\n\t$(document).ajaxError(function(e, jqxhr, settings, ex) {\n\t\tif(typeof(ex) === 'string') {\n\t\t\tconsole.log(ex)\n\t\t\treturn\n\t\t}\n\n\t\tvar m = 'ERROR: Script exception:\\n'\n\t\t\n\t\tif(ex.fileName)\n\t\t\tm += '\\tFilename: ' + ex.fileName\n\n\t\tif(ex.lineNumber)\n\t\t\tm += '\\tLine number: ' + ex.lineNumber\n\t\t\n\t\tif(ex.message)\n\t\t\tm += '\\tMessage: ' + ex.message\n\n\t\tconsole.log(m)\n\t})\n\t\n\tE2.core = new Core()\n\t\n\tE2.dom.webgl_canvas = $('#webgl-canvas')\n\n\tif (E2.dom.webgl_canvas.length < 1)\n\t\treturn\n\n\tE2.app = {}\n\tE2.app.player = new Player()\n\tE2.app.worldEditor = {\n\t\tupdate: function() {},\n\t\tisActive: function() {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tE2.app.canInitiateCameraMove = function(e) {\n\t\treturn (e && e.target.tagName === 'CANVAS')  // #790\n\t}\n\n\tWebVRConfig.canInitiateCameraMove = E2.app.canInitiateCameraMove\n\n\t// Shared gl context for three\n\tvar gl_attributes = {\n\t\talpha: false,\n\t\tdepth: true,\n\t\tstencil: true,\n\t\tantialias: true,\n\t\tpremultipliedAlpha: true,\n\t\tpreserveDrawingBuffer: false\n\t}\n\n\tE2.core.glContext = E2.dom.webgl_canvas[0].getContext('webgl', gl_attributes) ||\n\t\tE2.dom.webgl_canvas[0].getContext('experimental-webgl', gl_attributes)\n\t\n\tE2.core.renderer = new THREE.WebGLRenderer({\n\t\tantialias: true,\n\t\tcontext: E2.core.glContext,\n\t\tcanvas: E2.dom.webgl_canvas[0]\n\t})\n\n\tE2.core.webVRAdapter.initialise(E2.dom.webgl_canvas[0], E2.core.renderer)\n\n\tE2.core.on('ready', cb)\n}\n"
  },
  {
    "path": "browser/scripts/plugin-group.js",
    "content": "function PluginGroup(id)\n{\n\tvar self = this;\n\t\n\tthis.id = id;\n\tthis.children = {};\n\tthis.entries = {};\n}\n\t\nPluginGroup.prototype.get_or_create_group = function(id)\n{\n\tvar g = this.children[id];\n\t\n\tif(!g)\n\t{\n\t\tg = new PluginGroup(id);\n\t\tthis.children[id] = g;\n\t}\n\t\n\treturn g;\n};\n\t\nPluginGroup.prototype.add_entry = function(name, id)\n{\n\tvar e = this.entries[name];\n\t\n\tconsole.assert(!e, 'Plugin keys must be unique, but a duplicate instance of the key \"' + id + '\" was found in plugins.json.');\n\tthis.entries[name] = id;\n};\n\t\nPluginGroup.prototype.insert_relative = function(key, id)\n{\n\tvar tokens = key.split('/');\n\t\n\tconsole.assert(tokens.length > 0, 'Plugin key cannot be empty.');\n\t\n\tvar g = this, len = tokens.length - 1;\n\t\n\tfor(var i = 0; i < len; i++)\n\t\tg = g.get_or_create_group(tokens[i]);\n\t\n\tvar key = tokens[len];\n\t\n\tg.add_entry(key, id);\n\t\n\treturn key;\n};\n\t\nPluginGroup.prototype.create_items = function()\n{\n\tvar items = []\n\tvar sorted = sort_dict(this.children);\n\t\n\tfor(var i = 0, len = sorted.length; i < len; i++)\n\t{\n\t\tvar id = sorted[i];\n\t\tvar child = this.children[id];\n\t\t\n\t\titems.push({ name: id, items: child.create_items() });\n\t\t\n\t}\n\t\n\tsorted = sort_dict(this.entries);\n\t\n\tfor(var i = 0, len = sorted.length; i < len; i++)\n\t{\n\t\tvar id = sorted[i];\n\t\tvar entry = this.entries[id];\n\t\t\n\t\titems.push({ name: id, icon: entry });\n\t}\n\t\t\n\treturn items;\n};\n\n"
  },
  {
    "path": "browser/scripts/plugin-manager-bundled.js",
    "content": "function PluginManager() {\n\tEventEmitter.call(this)\n\tthis.keybyid = E2.plugins;\n\tvar that = this\n\tsetTimeout(function() {\n\t\tthat.emit('ready')\n\t}, 0)\n}\n\nPluginManager.prototype = Object.create(EventEmitter.prototype)\n\nPluginManager.prototype.create = function(id, node) {\n\tif (E2.plugins.hasOwnProperty(id)) {\n\t\tvar p = new E2.plugins[id](E2.app.player.core, node);\n\t\tp.id = id;\n\t\treturn p;\n\t}\n\n\tthrow new Error('Failed to resolve plugin with id '+ id);\n}\n\n"
  },
  {
    "path": "browser/scripts/plugin-manager.js",
    "content": "function PluginManager(core, base_url) {\n\tEventEmitter.call(this)\n\n\tvar that = this;\n\n\tthis.base_url = base_url\n\tthis.core = core\n\tthis.keybyid = {}\n\tthis.lid = 1\n\tthis.total = 0\n\tthis.loaded = 0\n\tthis.failed = 0\n\n\tfunction loadPlugins() {\n\t\t$.ajax({\n\t\t\turl: that.base_url + '/plugins.json',\n\t\t\tcache: true,\n\t\t\ttype: 'GET',\n\t\t\tsuccess: function(data) {\n\t\t\t\tE2.core.pluginsByCategory = data\n\n\t\t\t\tvar pg_root = new PluginGroup('root')\n\t\t\t\t\n\t\t\t\t$.each(data, function(category)  {\n\t\t\t\t\tif (!Vizor.releaseMode)\n\t\t\t\t\t\tthat.total += Object.keys(data[category]).length\n\n\t\t\t\t\t$.each(data[category], function(title, id)  {\n\t\t\t\t\t\tvar url = that.base_url + '/' + id + '.plugin.js';\n\t\t\t\t\t\tif (!Vizor.releaseMode)\n\t\t\t\t\t\t\tE2.util.loadScript(url, that.onload.bind(that), that.onerror.bind(that));\n\t\t\t\t\t\tthat.register_plugin(pg_root, category+'/'+title, id);\n\t\t\t\t\t})\n\t\t\t\t})\n\n\t\t\t\tif (E2.app) {\n\t\t\t\t\tthat.context_menu = new ContextMenu(E2.dom.canvas_parent, pg_root.create_items())\n\t\t\t\t\tthat.context_menu.on('created', function(icon, position) {\n\t\t\t\t\t\tthat.emit('created', icon, position)\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tif (Vizor.releaseMode) {\n\t\t\t\t\tthat.total = 1\n\t\t\t\t\tthat.loaded = 1\n\t\t\t\t\tthis.failed = 0\n\t\t\t\t\tthat.update_state()\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\tmsg('PluginMgr: Running in release mode: '+Vizor.releaseMode)\n\n\tloadPlugins()\n}\n\nPluginManager.prototype = Object.create(EventEmitter.prototype)\n\nPluginManager.prototype.register_plugin = function(pg_root, key, id) {\n\tthis.keybyid[id] = pg_root.insert_relative(key, id);\n\t// msg('\\tLoaded ' + id + ' (' + this.lid + ')');\n\tthis.lid++;\n};\n\nPluginManager.prototype.update_state = function() {\n\tif (this.loaded + this.failed === this.total) {\n\t\tthis.emit('ready')\n\t}\n}\n\nPluginManager.prototype.onload = function()\n{\n\tthis.loaded++;\n\tthis.update_state();\n};\n\nPluginManager.prototype.onerror = function()\n{\n\tthis.failed++;\n\tthis.update_state();\n};\n\nPluginManager.prototype.create = function(id, node) \n{\n\tif (E2.plugins.hasOwnProperty(id)) {\n\t\tvar p = new E2.plugins[id](this.core, node);\n\t\tp.id = id;\n\t\treturn p;\n\t}\n\t\t \n\tconsole.assert(false, 'Failed to resolve plugin with id \\'' + id + '\\'. Please check that the right id is specified by the plugin implementation.');\n\n\treturn null;\n};\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = PluginManager\n"
  },
  {
    "path": "browser/scripts/plugin.js",
    "content": "function Plugin(core, node) {\n\tvar that = this\n\tthis.core = core\n\tthis.node = node\n\n\t// though Node.js sets this too,\n\t// this is still needed here\n\t// in case it's referred to in instantiation\n\tthis.inputValues = {}\n\n\tthis.state = {}\n\tthis._oldState = {}\n\n\tif (this.node) {\n\t\tthis.node.on('pluginStateChanged', function() {\n\t\t\tif (that.state_changed && that.node.ui && that.node.ui.pluginUI)\n\t\t\t\tthat.state_changed(that.node.ui.pluginUI)\n\t\t})\n\t}\n\n\tthis.inputValues = {}\n}\n\nPlugin.prototype.undoableSetState = function(key, newValue, oldValue) {\n\tE2.app.undoManager.execute(\n\t\tnew E2.commands.graph.ChangePluginState(\n\t\t\tthis.node.parent_graph,\n\t\t\tthis.node,\n\t\t\tkey,\n\t\t\toldValue,\n\t\t\tnewValue\n\t))\n}\n\nPlugin.prototype.transientSetState = function(key, newValue) {\n\tE2.app.dispatcher.dispatch({\n\t\tactionType: 'uiPluginTransientStateChanged',\n\t\tgraphUid: this.node.parent_graph.uid,\n\t\tnodeUid: this.node.uid,\n\t\tkey: key,\n\t\tvalue: newValue\n\t})\n}\n\n// these two are now in Node.js\n// but stubs are required here for inheritance\nPlugin.prototype.reset = function() {\n}\nPlugin.prototype.update_input = function() {}\n\nPlugin.prototype.beginBatchModifyState = function() {\n\tthis._oldState = _.clone(this.state)\n\treturn true\t// allow use as event handler\n}\n\nPlugin.prototype.endBatchModifyState = function(stepName) {\n\tvar that = this, state = that.state, oldState = that._oldState\n\tif ( !oldState  ||  Object.keys(oldState).length === 0 ) return\n\tE2.app.undoManager.begin(stepName)\n\tObject.keys(state).forEach(function(prop) {\n\t\tif (oldState[prop] !== state[prop] ) {\n\t\t\tthat.undoableSetState(prop, state[prop], oldState[prop])\n\t\t}\n\t})\n\tE2.app.undoManager.end()\n\n\tthis._oldState = {}\n\treturn true\n}\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = Plugin\n"
  },
  {
    "path": "browser/scripts/screenshot/ScreenshotRenderer.js",
    "content": "function ScreenshotRenderer(scene, camera) {\n\tif (!(scene && scene.children.length > 0 && camera && camera.parent && E2.core.renderer)) {\n\t\treturn\n\t}\n\n\t// clone scene without overlays\n\tthis.scene = scene.clone(false)\n\tthis.scene.add(scene.children[0].clone())\n\n\t// clone the camera (we need a clone because we'll override\n\t// the aspect ratio later)\n\tthis.dollyCamera = camera.parent.clone()\n\tthis.camera = this.dollyCamera.children[0]\n\n\tthis.renderer = E2.core.renderer\n}\n\nScreenshotRenderer.prototype.capture = function(width, height) {\n\tif (!this.camera) {\n\t\t// return a dark gray texture as default\n\t\treturn \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAIAAAA\" +\n\t\t\"mkwkpAAAAJklEQVQImS3IMQEAMBCEMHhV598YXZoxbkOt4AQiES6RyOR+EvkARQ0MsXQ\" +\n\t\t\"l4RoAAAAASUVORK5CYII=\"\n\t}\n\n\tvar texture = new THREE.WebGLRenderTarget(width * 2, height * 2, {\n\t\tminFilter: THREE.LinearFilter,\n\t\tmagFilter: THREE.NearestFilter,\n\t\tformat: THREE.RGBFormat } );\n\n\tthis.camera.aspect = width / height\n\tthis.camera.updateProjectionMatrix()\n\n\tvar oldPixelRatio = this.renderer.getPixelRatio()\n\n\tthis.renderer.setPixelRatio(1)\n\tthis.renderer.setClearColor(new THREE.Color(0,0,0))\n\tthis.renderer.setRenderTarget(texture)\n\n\tthis.renderer.shadowMap.enabled = true\n\n\tthis.renderer.clear()\n\tthis.renderer.render(this.scene, this.camera, texture)\n\n\tvar doubleResImgData = new Uint8Array(width * 2 * height * 2 * 4)\n\n\tvar gl = this.renderer.getContext()\n\tgl.readPixels( 0, 0, width * 2, height * 2, gl.RGBA, gl.UNSIGNED_BYTE, doubleResImgData)\n\n\tvar imgData = new Uint8Array(width * height * 4)\n\n\t// scale to half res\n\tfor (var j = 0, j2 = 0; j < height; ++j, j2 += 2) {\n\t\tfor (var i = 0, i2 = 0; i < width; ++i, i2 += 2) {\n\t\t\tfor (var comp = 0; comp < 4; ++comp) {\n\t\t\t\tvar v = (\n\t\t\t\t\tdoubleResImgData[((j2    ) * width * 2 + i2    ) * 4 + comp] +\n\t\t\t\t\tdoubleResImgData[((j2    ) * width * 2 + i2 + 1) * 4 + comp] +\n\t\t\t\t\tdoubleResImgData[((j2 + 1) * width * 2 + i2    ) * 4 + comp] +\n\t\t\t\t\tdoubleResImgData[((j2 + 1) * width * 2 + i2 + 1) * 4 + comp]) / 4\n\n\t\t\t\timgData[(j * width + i) * 4 + comp] = v\n\t\t\t}\n\t\t}\n\t}\n\n\tvar canvas = document.createElement('canvas');\n\tcanvas.width = width;\n\tcanvas.height = height;\n\tvar context = canvas.getContext('2d');\n\n\t// Copy the pixels to a 2D canvas\n\tvar imageData = context.createImageData(width, height);\n\timageData.data.set(imgData);\n\tcontext.putImageData(imageData, 0, 0);\n\n\tthis.renderer.setRenderTarget(null)\n\n\tthis.renderer.setPixelRatio(oldPixelRatio)\n\n\treturn canvas.toDataURL()\n}\n"
  },
  {
    "path": "browser/scripts/shader-editor.js",
    "content": "(function() {\n\nvar TEXT_CONFIRM_REMOVE_INPUT = 'Really remove this input?'\n\nfunction addInputDialog(cb) {\n\tvar validDatatypes = {\n\t\tFLOAT: E2.dt.FLOAT,\n\t\tTEXTURE: E2.dt.TEXTURE,\n\t\tCUBETEXTURE: E2.dt.CUBETEXTURE,\n\t\tCOLOR: E2.dt.COLOR,\n\t\tMATRIX: E2.dt.MATRIX,\n\t\tVECTOR: E2.dt.VECTOR,\n\t}\n\n\treturn function() {\n\t\tvar t = $('<form action=\"#\" class=\"addInputDialog\">'+\n\t\t\t'<label>Name<input type=\"text\" class=\"name form-control\"/><span>(use as variable name in code)</span></label>'+\n\t\t\t'<br/><label>Datatype<select class=\"dt form-control\"/></label></form>')\n\t\t\n\t\tvar $modal, $dtSelect\n\t\tvar name, dt\n\n\t\tfunction destroy() {\n\t\t\t$modal.empty().remove()\n\t\t\tcb(name, dt)\n\t\t}\n\n\t\tfunction ok() {\n\t\t\tname = $modal.find('input.name').val().replace(/[^\\w]/gi, '_')\n\t\t\tdt = E2.dt[$dtSelect.val()]\n\t\t\tdestroy()\n\t\t}\n\n\t\t$modal = bootbox.dialog({\n\t\t\tanimate: false,\n\t\t\ttitle: 'Add Shader input',\n\t\t\tmessage: t,\n\t\t\tcloseButton: false,\n\t\t\tonEscape: destroy,\n\t\t\tbuttons: {\n\t\t\t\tCancel: destroy,\n\t\t\t\tOk: ok\n\t\t \t}\n\t\t})\n\n\t\t$dtSelect = $modal.find('select.dt')\n\t\t_.each(validDatatypes, function(dt, key) {\n\t\t\t$dtSelect.append('<option value=\"'+key+'\">'+dt.name+'</option>')\n\t\t})\n\n\t\t$('input', $modal).focus()\n\n\t\t$('form.addInputDialog', $modal).on('submit', function(e) {\n\t\t\tok()\n\t\t\te.preventDefault()\n\t\t\te.stopPropagation()\n\t\t\treturn false\n\t\t})\n\t}\n}\n\nfunction InputEditor(inputs) {\n\tthis._cb = null\n\tthis._inputs = inputs\n\tEventEmitter.call(this)\n}\nInputEditor.prototype = Object.create(EventEmitter.prototype)\nInputEditor.prototype.render = function($el) {\n\tvar that = this\n\n\t$el.html('<div class=\"inputs\">'+\n\t\t\t'<button class=\"input-add-button input-button btn btn-xs btn-primary\">'+\n\t\t\t'\t\t<i class=\"fa fa-sm fa-plus\"></i>' +\n\t\t\t'\t\t<span>Add new input</span>' +\n\t\t\t'\t</button>' +\n\t\t\t'</div>')\n\n\tvar $inputs = $('.inputs', $el)\n\n\tfunction inputButton(slot) {\n\t\tvar t = '<button title=\"Remove input\" '+\n\t\t\t'class=\"btn btn-xs btn-default input-remove-button input-button\">'+\n\t\t\t'<i class=\"fa fa-sm fa-close\"></i><span>{{glslType}} {{title}}</span></button>';\n\n\t\treturn $(t.replace('{{title}}', slot.name)\n\t\t\t.replace('{{glslType}}', slot.dt.name))\n\t\t\t.click(function(e) {\n\t\t\t\tif (window.confirm(TEXT_CONFIRM_REMOVE_INPUT)) {\n\t\t\t\t\tthat.emit('removed', slot.uid, slot.name)\n\t\t\t\t}\n\t\t\t})\n\t}\n\n\t// add buttons for inputs\n\t$inputs.prepend(this._inputs.map(function(slot, i) {\n\t\treturn inputButton(slot)\n\t}))\n\n\t// 'add input' dialog\n\t$('.input-add-button', $el).click(addInputDialog(function(name, dt) {\n\t\tif (!name)\n\t\t\treturn\n\n\t\tthat.emit('added', name, dt)\n\t}))\n}\n\n// ----------\nfunction createAce(src, elId) {\n\tvar editor = ace.edit(elId)\n\tvar $el = $('#'+elId)\n\n    editor.setTheme('ace/theme/tomorrow_night_eighties');\n    editor.setAutoScrollEditorIntoView(true);\n\teditor.getSession().setUseWrapMode(false)\n\teditor.setBehavioursEnabled(true)\n\teditor.setShowPrintMargin(false)\n\teditor.getSession().setMode('ace/mode/glsl')\n\teditor.setValue(src)\n\teditor.gotoLine(0)\n\teditor.session.selection.clearSelection()\n\n\treturn editor\n}\n\n// ----------\nfunction ShaderEditor(handlebars, src, inputs) {\n\tthis._handlebars = handlebars || window.Handlebars\n\n\tthis._autoBuild = true\n\tthis._src = src\n\tthis._inputs = inputs\n\n\tEventEmitter.call(this)\n}\n\nShaderEditor.prototype = Object.create(EventEmitter.prototype)\n\nShaderEditor.prototype.getAce = function() {\n\treturn this._ace\n}\n\nShaderEditor.prototype.close = function() {\n\tthis._ace.destroy()\n\tthis._$el.empty()\n\tthis.emit('closed')\n}\n\nShaderEditor.prototype.build = function(force) {\n\tif (this._autoBuild || force)\n\t\tthis.emit('build')\n}\n\nShaderEditor.prototype.show = function() {\n\tthis.emit('shown')\n}\n\nShaderEditor.prototype.render = function(title, $dest) {\n\tvar that = this\n\tvar template = E2.views.ui.shader\n\tvar id = 'shader-ace-' + Date.now()\n\n\tvar $html = this._$el = $(template({\n\t\ttitle: title,\n\t\tsrc: this._src,\n\t\tid: id\n\t}))\n\n\tthis._$inputEditor = $('.input-editor', $html)\n\n\tvar $aceParent = $('.shader-ace', $html).parent()\n\n\t$('.auto-build', $html).change(function() {\n\t\tthat._autoBuild = !that._autoBuild\n\t})\n\n\t$('.compile-button', $html).click(that.build.bind(that, true))\n\n\t$dest.append($html)\n\n\tthis._ace = createAce(this._src, id)\n\n\tthis._ace.on('change', function() {\n\t\tthat.emit('changed', that._ace.getValue())\n\t\tthat.build()\n\t})\n\n\tthis._ace.commands.addCommand({\n\t\tname:'build',\n\t\tbindKey: {\n\t\t\twin: 'Alt-enter',\n\t\t\tmac: 'Alt-enter|Command-enter'\n\t\t},\n\t\texec: function() {\n\t\t\tthat.build(true)\n\t\t}\n\t})\n\n\tthis.drawInputs()\n\n\tthat._ace.setOption('minLines', 24);\n\tthat._ace.setOption('maxLines', 40);\n\n\treturn this\n}\n\nShaderEditor.prototype.setInputs = function(inputs) {\n\tthis._inputs = inputs\n\tthis.drawInputs()\n}\n\nShaderEditor.prototype.setValue = function(text) {\n\tthis._ace.setValue(text)\n}\n\nShaderEditor.prototype.drawInputs = function() {\n\tif (!this._$inputEditor)\n\t\treturn;\n\n\tvar that = this\n\n\tthis._$inputEditor.empty()\n\n\tthis._inputEditor = new InputEditor(this._inputs)\n\t\t.on('removed', function(slotId, name) {\n\t\t\tthat.emit('inputRemoved', slotId, name)\n\t\t\tthat.build()\n\t\t})\n\t\t.on('added', function(name, dtid) {\n\t\t\tthat.emit('inputAdded', name, dtid)\n\t\t\tthat.build()\n\t\t})\n\t\t.render(this._$inputEditor)\n}\n\n// ---- static methods\n\nShaderEditor.open = function(name, src, inputs) {\n\tvar editor\n\tvar tab = E2.app.midPane.newTab(name, function() {\n\t\tif (editor)\n\t\t\teditor.close()\n\t})\n\n\teditor = new ShaderEditor(window.Handlebars, src, inputs)\n\n\teditor.render(name, tab.body)\n\n\teditor.on('shown', tab.show)\n\teditor.on('closed', tab.close)\n\n\treturn editor\n};\n\nE2.ShaderEditor = ShaderEditor;\n\n\n\n})()"
  },
  {
    "path": "browser/scripts/site/accountpages.js",
    "content": "(function() {\n\tfunction AccountUI() {\n\t\tthis.init()\n\t}\n\n\tAccountUI.prototype.init = function () {\n\t\tE2.track({event: 'profilePage'})\n\n\t\tif (document.body.classList.contains('bProfile'))\n\t\t\tthis.initProfilePage()\n\n\t}\n\n\tAccountUI.prototype.initProfilePage = function () {\n\t\tvar avatarPreviewImg = document.querySelector('#avatarUploadForm img.avatar')\n\t\tvar headerPreviewDiv = document.querySelector('#headerUploadForm div.user-header')\n\n\t\tthis.initCollapsibleToggles()\n\n\t\tvar passwordInput = document.getElementById('passwordinput')\n\t\tvar passwordForm = passwordInput.form\n\t\tvar passwordMeter = passwordForm.getElementsByTagName('meter')[0]\n\t\tvar strengthFunction = null\t// default strength function\n\t\tthis.passwordStrengthMeter(passwordInput, passwordMeter, strengthFunction)\n\n\t\tE2.models.user.on('change', function (model) {\n\t\t\tvar profile = model.changed.profile\n\t\t\tif (profile) {\n\t\t\t\tavatarPreviewImg.src = profile.avatar || model.get('gravatar')\n\t\t\t\theaderPreviewDiv.style.backgroundImage = \"url(\" + profile.header + \")\"\n\t\t\t}\n\t\t})\n\n\t\tdocument.addEventListener(uiEvent.xhrFormSuccess, function (e) {\n\t\t\tif (!e.detail.response)\n\t\t\t\treturn\n\n\t\t\tvar response = e.detail.response\n\t\t\tif (response.data && response.data.uploaded)\n\t\t\t\tE2.models.user.set(response.data.user)\n\t\t\telse\n\t\t\t\tE2.models.user.set(response.data)\n\t\t})\n\n\t\tvar forgotPasswordLinks = document.querySelectorAll('form a.forgotPassword')\n\t\tArray.prototype.forEach.call(forgotPasswordLinks, function(link) {\n\t\t\tlink.addEventListener('click', function(e){\n\t\t\t\te.preventDefault()\n\t\t\t\te.stopPropagation()\n\t\t\t\tif (E2 && E2.controllers && E2.controllers.account)\n\t\t\t\t\tE2.controllers.account.openForgotPasswordModal()\n\t\t\t\treturn false\n\t\t\t})\n\t\t})\n\n\t\tvar publicPrivateLabel = document.getElementById('publishPublicPrivateLabel')\n\t\tvar publicPrivateCheckbox = document.getElementById('publishDefaultPublicToggle')\n\t\tpublicPrivateCheckbox.addEventListener('change', function (e) {\n\t\t\tpublicPrivateLabel.innerHTML = this.checked ? 'Public' : 'Private'\n\t\t})\n\t\tpublicPrivateLabel.innerHTML = publicPrivateCheckbox.checked ? 'Public' : 'Private'\n\n\t}\n\n\n\t// strengthFunction returns values 0 - 5\n\t// <meter max=\"5\" min=\"0\" low=\"2\" high=\"4\" optimum=\"5\">\n\tAccountUI.prototype.passwordStrengthMeter = function (input, meter, strengthFunction) {\n\t\tstrengthFunction = strengthFunction || function (pw) {\n\t\t\t\tvar min = 5, len = pw.length - min;\n\t\t\t\treturn (len > 5) ? 5 : len;\n\t\t\t}\n\t\tinput.addEventListener('input', function () {\n\t\t\tmeter.value = strengthFunction(this.value)\n\t\t})\n\t}\n\n\tAccountUI.prototype.initCollapsibleToggles = function () {\n\t\tvar toggles = document.querySelectorAll('section.collapsible a.toggle')\n\t\tif (!toggles.length)\n\t\t\treturn\n\n\t\tvar forEach = Array.prototype.forEach\n\t\tvar cancel = function (e) {\n\t\t\te.preventDefault()\n\t\t\te.stopPropagation()\n\t\t\treturn false\n\t\t}\n\t\tforEach.call(toggles, function (a) {\n\t\t\ta.addEventListener('click', function (e) {\n\t\t\t\tvar section = a.parentElement.parentElement\n\t\t\t\tvar isCollapsed = section.classList.contains('collapsed')\n\n\t\t\t\tsection.classList.toggle('collapsed', !isCollapsed)\n\t\t\t\treturn cancel(e)\n\t\t\t})\n\t\t\ta.addEventListener('contextmenu', cancel)\n\t\t})\n\t}\n\n\tdocument.addEventListener('DOMContentLoaded', function () {\n\t\tif (!E2.ui)\n\t\t\tE2.ui = {}\n\n\t\tE2.ui.account = new AccountUI()\n\t})\n})()"
  },
  {
    "path": "browser/scripts/site/userpages.js",
    "content": "var assetUIEvent = {\t// CustomEvent names (dispatched on document)\n\tgraphNew \t\t: 'graph.new',\n\tgraphOpen \t\t: 'graph.open',\n\tgraphEdit \t\t: 'graph.edit',\n\tgraphDuplicate \t: 'graph.duplicate',\n\tgraphMove \t\t: 'graph.move',\n\tgraphDelete \t: 'graph.delete',\n\tgraphPublish \t: 'graph.publish',\n\tgraphDownload \t: 'graph.download',\n\tgraphShare \t\t: 'graph.share',\n\tgraphTogglePrivate : 'graph.toggleprivate'\n\t// projectNew\t\t: 'project.new' etc.\n}\n\nvar userpagesUI = new function() {\n\n\t// transitional\n\tthis.setupCardUI = function(card) {\n\t\tvar $card = jQuery(card)\n\t\tVizorUI.setupAssetCard($card)\n\t\tif (siteUI.isTouchCapable()) {\n\t\t\tvar overlayDiv = card.querySelector('div.overlay')\n\t\t\toverlayDiv.addEventListener('click', VizorUI.touchCardOverlay, true)\t// unbound, this=div\n\t\t}\n\t}\n\n\tthis.init = function () {\n\t\tvar that = this\n\t\tdocument.addEventListener(assetUIEvent.graphOpen, this.handleGraphOpen);\n\n\t\tjQuery('#contentcontainer .asset.card')\n\t\t\t.not('.new')\n\t\t\t.each(function () {\n\t\t\t\tthat.setupCardUI(this)\n\t\t\t})\n\n\t\tdocument.addEventListener(assetUIEvent.graphShare, VizorUI.actionGraphShare)\n\t\tdocument.addEventListener(assetUIEvent.graphDelete, VizorUI.actionGraphDelete)\n\t\tdocument.addEventListener(assetUIEvent.graphTogglePrivate, VizorUI.actionGraphTogglePrivate)\n\n\t\tdocument.addEventListener('changed:profile', this.onProfileChanged.bind(this))\n\t\tdocument.addEventListener('changed:graph', this.onGraphCardChanged.bind(this))\n\n\t\t// login/signup links\n\t\tfunction accountHandler(action) {\n\t\t\treturn function(e) {\n\t\t\t\te.preventDefault()\n\t\t\t\te.stopPropagation()\n\t\t\t\taction()\n\t\t\t\t.then(function(){window.location.reload()})\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t\tjQuery('a#homeSignin').on('click', accountHandler(VizorUI.openLoginModal))\n\t\tjQuery('a#homeSignup').on('click', accountHandler(VizorUI.openSignupModal))\n\n\t\tvar isBrowse = document.body.classList.contains('bBrowse')\n\t\tvar isUserPublic = document.body.classList.contains('bUserpublic')\n\t\tif ((typeof UIPagination !== 'undefined') && (isBrowse || isUserPublic)) {\n\t\t\tUIPagination.bindNextLink(document.querySelector('div.pagination'), this.xhrPaginationCallback.bind(this))\n\t\t}\n\t}\n\n\t// note the buttons are wired directly (for search-engine indexing)\n\tthis.handleGraphOpen = function (e) {\n\t\tif (e && e.detail && e.detail.url) {\n\t\t\te.preventDefault()\n\t\t\te.stopPropagation()\n\t\t\twindow.location.href = e.detail.url\n\t\t}\n\t\treturn false\n\t}\n\n\tthis.onProfileChanged = function (e) {\n\t\tvar profileId = e.detail.id\n\t\tvar profileData = Vizor.pageObjects.getProfile(profileId)\n\t\tif (!profileData)\n\t\t\treturn\n\t\tvar cards = VizorUI.findProfileCards(profileId)\n\t\tif (!cards.length)\n\t\t\treturn\n\n\t\tArray.prototype.forEach.call(cards, function (div) {\n\t\t\tdiv.outerHTML = E2.views.partials.profile(profileData)\n\t\t})\n\t}\n\n\tthis.onGraphCardChanged = function(e) {\n\t\tif (e.detail.key === 'private')\n\t\t\treturn this._onGraphPrivateChanged(e)\n\t}\n\n\t// NB: called by onGraphCardChanged to handle private flag ONLY\n\tthis._onGraphPrivateChanged = function(e) {\n\n\t\tvar qs = 'article[data-objectid=\"' + e.detail.id + '\"]'\n\t\tvar isCardPrivate = e.detail.value\n\n\t\tvar publicList = this.findPublicList()\n\t\tvar privateList = this.findPrivateList()\n\n\t\tvar card\n\t\tvar cardData = Vizor.pageObjects.getGraph(e.detail.id)\n\t\tvar isInPublic = false\n\t\tvar isInPrivate = false\n\n\t\t// at least one list on the page\n\t\tisInPublic = publicList && (card = publicList.querySelector(qs))\n\t\tisInPrivate = privateList && !isInPublic && (card = privateList.querySelector(qs))\n\n\t\tif (!card)\n\t\t\treturn console.error('could not find card?')\n\n\t\tif (isInPublic && isCardPrivate) {\n\t\t\tpublicList.removeChild(card)\n\t\t\tif (privateList)\n\t\t\t\tthis.addCardToList(card, privateList)\n\t\t\telse\n\t\t\t\tVizorUI.growl('Project \"'+ cardData.prettyName +'\" is now private.')\n\n\t\t}\n\t\telse if (isInPrivate && !isCardPrivate) {\n\t\t\tprivateList.removeChild(card)\n\t\t\tif (publicList)\n\t\t\t\tthis.addCardToList(card, publicList)\n\t\t\telse\n\t\t\t\tVizorUI.growl('Project \"'+ cardData.prettyName +'\" is now public.')\n\t\t}\n\t\tif (privateList)\n\t\t\tprivateList.dataset.numitems = this.countCardsInList(privateList)\n\t\tif (publicList)\n\t\t\tpublicList.dataset.numitems = this.countCardsInList(publicList)\n\n\t}\n\n\tthis.findPublicList = function(el) {\n\t\tel = el || document\n\t\treturn el.querySelector('section.list.assets.public')\n\t}\n\n\tthis.findPrivateList = function(el) {\n\t\tel = el || document\n\t\treturn el.querySelector('section.list.assets.private')\n\t}\n\n\t// counts the number of asset cards listed, minus the 'new' card\n\tthis.countCardsInList = function(listEl) {\n\t\treturn this.cardsInList(listEl).length\n\t}\n\n\tthis.cardsInList = function(listEl) {\n\t\treturn listEl.querySelectorAll('article.asset.card:not(.new)')\n\t}\n\n\tthis.addCardToList = function(cardEl, listEl) {\n\t\t// privateList.appendChild(card)\n\n\t\tvar beforeEl\n\t\tvar sortId = cardEl.dataset.sortid\n\t\tif (sortId)\n\t\t\tbeforeEl = this.findPositionForCard(sortId, listEl)\n\n\t\tif (beforeEl)\n\t\t\tlistEl.insertBefore(cardEl, beforeEl)\n\t\telse\n\t\t\tlistEl.appendChild(cardEl)\n\t}\n\n\tthis.findPositionForCard = function(sortId, listEl) {\t// e.g. sortId = graph.updatedTS\n\t\t// in the given listEl, find existingcard for list.insertBefore(card,existingcard)\n\t\t//  it is the element with highest data-sortid not bigger than sortId\n\t\t// NB: does not check if card is already in list!\n\t\t// (assumes list ordered descending)\n\n\t\tvar qs = this.cardsInList(listEl)\n\t\tvar card\n\n\t\tfor (var l=0; l<qs.length; l++) {\n\t\t\tcard = qs[l]\n\t\t\tif (card.dataset.sortid && (card.dataset.sortid <= sortId))\n\t\t\t\tbreak\n\t\t\telse\n\t\t\t\tcard = null\n\t\t}\n\n\t\treturn card\n\t}\n\n\tthis.xhrPaginationCallback = function(response, oldPaginationContainer, display) {\n\t\tvar that = this\n\n\t\tif (!(response && response.data))\n\t\t\treturn console.info('?response', response)\n\n\t\tvar data\n\t\tif (response.data.graphs) {\n\t\t\t// public user page\n\t\t\tdata = response.data.graphs\n\t\t} else {\n\t\t\t// browse\n\t\t\tdata = response.data\n\t\t}\n\t\tvar meta = data.meta\n\t\tvar list = data.list\n\n\t\tif (!(list && meta))\n\t\t\treturn console.info('?list/meta', list, meta)\n\n\t\tvar parent = oldPaginationContainer.parentElement\n\t\tparent.removeChild(oldPaginationContainer)\n\n\t\tvar temp = document.createElement('DIV')\n\n\t\ttemp.innerHTML = E2.views.partials.browse.graphList({list: data, withPagination:true})\n\n\t\t// take scripts out, since they won't execute\n\t\tvar scripts = temp.getElementsByTagName('script')\n\t\twhile (scripts.length)\n\t\t\tscripts[0].parentElement.removeChild(scripts[0])\n\n\t\t// do the UI on the cards\n\t\tvar cards = temp.querySelectorAll('article.card')\n\t\tArray.prototype.forEach.call(cards, function(card){\n\t\t\tif ((card.tagName.toLowerCase() === 'article') && card.classList.contains('card'))\n\t\t\t\tthat.setupCardUI(card)\n\t\t})\n\n\t\tvar firstNewContent = temp.firstChild\n\t\t// append the content to the parent container\n\t\twhile (temp.childNodes.length) {\n\t\t\tparent.parentElement.appendChild(temp.firstChild)\n\t\t}\n\n\t\tif (list.length && Vizor.pageObjects.addGraph) {\n\t\t\tfor (var graph of list) {\n\t\t\t\tVizor.pageObjects.addGraph(graph)\n\t\t\t}\n\t\t}\n\n\t\tvar paginationContainer = parent.parentElement.querySelector('div.pagination')\n\t\tif (paginationContainer) {\n\t\t\tUIPagination.bindNextLink(paginationContainer, this.xhrPaginationCallback.bind(this))\n\t\t\t// seeing we added this, we can take out the previous link\n\t\t\tvar prevLink = paginationContainer.querySelector('a.prev.page')\n\t\t\tif (prevLink) {\n\t\t\t\tprevLink.className = 'scrollto top'\n\t\t\t\tprevLink.innerHTML = '<svg style=\"width:1rem;height:1rem;stroke:black; transform:rotate(180deg)\"><use xlink:href=\"#site-icon-arrow-vertical\"></use></svg>'\n\t\t\t\tprevLink.href = '#top_'\n\t\t\t\tVizorUI.enableScrollToLinks(paginationContainer)\n\t\t\t}\n\t\t}\n\n\t\tif (firstNewContent) {\n\t\t\t// scroll to new content\n\t\t\tsetTimeout(function () {\n\t\t\t\tvar r = firstNewContent.getBoundingClientRect()\n\t\t\t\t$(\"body\").animate({scrollTop: '' + (display.scroll.y + r.top) + 'px'}, 450)\n\t\t\t}, 200)\n\t\t}\n\t}\n}\n\ndocument.addEventListener('DOMContentLoaded', userpagesUI.init.bind(userpagesUI))"
  },
  {
    "path": "browser/scripts/stores/graphStore.js",
    "content": "(function() {\n\nvar assetLoadingPlugins = [\n\t'three_loader_model',\n\t'three_loader_scene',\n\t'url_texture_generator',\n\t'url_audio_buffer_generator',\n\t'url_audio_generator',\n\t'url_json_generator',\n\t'url_video_generator',\n]\n\nfunction mapConnections(node, fn) {\n\tnode.inputs.concat(node.outputs).map(fn)\n}\n\nfunction GraphStore() {\n\tStore.apply(this, arguments)\n\tthis._setupListeners()\n\tthis.storeName = 'graph'\n\n\t// keep track of graph size\n\tthis.stat = {\n\t\tsize: 0,\n\t\tnumAssets: 0\n\t}\n}\n\nGraphStore.prototype = Object.create(Store.prototype)\n\nGraphStore.prototype._setupListeners = function() {\n\tvar that = this\n\n\tfunction applyActionToGraph(graph, payload) {\n\t\tswitch(payload.actionType) {\n\t\t\tcase 'uiGraphTreeReordered':\n\t\t\t\tthat._uiGraphTreeReordered(\n\t\t\t\t\tgraph,\n\t\t\t\t\tpayload.original,\n\t\t\t\t\tpayload.sibling,\n\t\t\t\t\tpayload.insertAfter)\n\t\t\t\tbreak;\n\t\t\tcase 'uiNodeOpenStateChanged':\n\t\t\t\tvar node = graph.findNodeByUid(payload.nodeUid)\n\t\t\t\tnode.setOpenState(payload.isOpen)\n\t\t\t\tbreak;\n\t\t\tcase 'uiNodeAdded':\n\t\t\t\tthat._uiNodeAdded(graph, payload.node, payload.info)\n\t\t\t\tbreak;\n\t\t\tcase 'uiNodeRemoved':\n\t\t\t\tthat._uiNodeRemoved(graph, payload.nodeUid)\n\t\t\t\tbreak;\n\t\t\tcase 'uiSlotAdded':\n\t\t\t\tthat._uiSlotAdded(graph, payload.nodeUid, payload.slot)\n\t\t\t\tbreak;\n\t\t\tcase 'uiSlotRemoved':\n\t\t\t\tthat._uiSlotRemoved(graph, payload.nodeUid, payload.slotUid)\n\t\t\t\tbreak;\n\t\t\tcase 'uiNodeRenamed':\n\t\t\t\tthat._uiNodeRenamed(graph, payload.nodeUid, payload.title)\n\t\t\t\tbreak;\n\t\t\tcase 'uiConnected':\n\t\t\t\tthat._uiConnected(graph, payload.connection)\n\t\t\t\tbreak;\n\t\t\tcase 'uiDisconnected':\n\t\t\t\tthat._uiDisconnected(graph, payload.connectionUid)\n\t\t\t\tbreak;\n\t\t\tcase 'uiNodesMoved':\n\t\t\t\tthat._uiNodesMoved(graph, payload.nodeUids, payload.delta)\n\t\t\t\tbreak;\n\t\t\tcase 'uiPluginTransientStateChanged':\n\t\t\t\tthat._uiPluginTransientStateChanged(\n\t\t\t\t\tgraph,\n\t\t\t\t\tpayload.nodeUid,\n\t\t\t\t\tpayload.key,\n\t\t\t\t\tpayload.value)\n\t\t\t\tbreak;\n\t\t\tcase 'uiPluginStateChanged':\n\t\t\t\tthat._uiPluginStateChanged(\n\t\t\t\t\tgraph,\n\t\t\t\t\tpayload.nodeUid,\n\t\t\t\t\tpayload.key,\n\t\t\t\t\tpayload.value)\n\t\t\t\tbreak;\n\t\t\tcase 'uiSlotValueChanged':\n\t\t\t\tthat._uiSlotValueChanged(\n\t\t\t\t\tgraph,\n\t\t\t\t\tpayload.nodeUid,\n\t\t\t\t\tpayload.slotName,\n\t\t\t\t\tpayload.value)\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tE2.core.on('vizorFileLoaded', this._calculateGraphSize.bind(this))\n\n\tE2.app.dispatcher.register(function receiveFromDispatcher(payload) {\n\t\tif (payload.actionType === 'graphSnapshotted')\n\t\t\treturn this._graphSnapshotted(payload.data)\n\n\t\tif (payload.graphUid === undefined)\n\t\t\treturn;\n\n\t\tvar graph = Graph.lookup(payload.graphUid)\n\t\tif (!graph)\n\t\t\treturn console.error('No graph found for payload guid ', payload.graphUid)\n\n\t\tif (graph.hasCopies) {\n\t\t\tgraph.copies.map(function(graphCopy) {\n\t\t\t\tapplyActionToGraph(graphCopy, payload)\n\t\t\t})\n\t\t}\n\n\t\tapplyActionToGraph(graph, payload)\n\t}.bind(this))\n}\n\nGraphStore.prototype._graphSnapshotted = function(data) {\n\tE2.app.player.load_from_json(data)\n\tthis.emit('snapshotted')\n\tthis.emit('changed')\n}\n\nGraphStore.prototype._uiGraphTreeReordered = function(graph, original, sibling, insertAfter) {\n\tgraph.reorder_children(original, sibling, insertAfter)\n\tthis.emit('reordered', graph)\n\tthis.emit('changed')\n}\n\nGraphStore.prototype._uiNodeAdded = function(graph, node, info) {\n\tgraph.addNode(node, info)\n\n\tnode.reset()\n\tnode.initialise()\n\n\tmapConnections(node, function(conn) {\n\t\tgraph.connect(conn)\n\t})\n\n\tthis.assetsMayHaveChanged(node)\n\n\tthis.emit('nodeAdded', graph, node, info)\n\n\tif (info && info.proxy && info.proxy.connection) {\n\t\tthis._uiConnected(graph.parent_graph,\n\t\t\tConnection.hydrate(graph.parent_graph, info.proxy.connection)\n\t\t)\n\t}\n\n\tthis.emit('changed')\n}\n\nGraphStore.prototype._uiNodeRemoved = function(graph, nodeUid) {\n\tvar node = graph.findNodeByUid(nodeUid)\n\n\tif (!node) {\n\t\tconsole.warn('_uiNodeRemoved: node not found in graph', graph.uid)\n\t\treturn;\n\t}\n\n\tmapConnections(node, graph.disconnect.bind(graph))\n\n\tgraph.removeNode(node)\n\n\tthis.assetsMayHaveChanged(node)\n\n\tthis.emit('nodeRemoved', graph, node)\n\tthis.emit('changed')\n}\n\nGraphStore.prototype._uiNodeRenamed = function(graph, nodeUid, title) {\n\tvar node = graph.findNodeByUid(nodeUid)\n\tgraph.renameNode(node, title)\n\tthis.emit('nodeRenamed', graph, node)\n\tthis.emit('changed')\n}\n\nGraphStore.prototype._uiSlotAdded = function(graph, nodeUid, slot) {\n\tvar node = graph.findNodeByUid(nodeUid)\n\tnode.add_slot(slot.type, slot)\n\n\tif (node.plugin.lsg)\n\t\tnode.plugin.lsg.add_dyn_slot(node.findSlotByUid(slot.uid))\n\n\tthis.emit('slotAdded', graph, node, slot)\n\tthis.emit('changed')\n}\n\nGraphStore.prototype._uiSlotRemoved = function(graph, nodeUid, slotUid) {\n\tvar node = graph.findNodeByUid(nodeUid)\n\tvar slot = node.findSlotByUid(slotUid)\n\n\tnode.remove_slot(slot.type, slot.uid)\n\n\tif (node.plugin.lsg)\n\t\tnode.plugin.lsg.remove_dyn_slot(slot)\n\n\tthis.emit('slotAdded', graph, node, slot)\n\tthis.emit('changed')\n}\n\nGraphStore.prototype._uiConnected = function(graph, connection) {\n\tvar c = connection\n\n\t/*\n\t\tfor dynamic slots, the index could have changed in eg.\n\t\ta redo situation. recalculate the current index in the node\n\t\tby looking up the slot with its uid; issue 195\n\t */\n\tif (c.dst_slot.dynamic) {\n\t\tc.dst_slot.index = c.dst_node.find_dynamic_slot(\n\t\t\tE2.slot_type.input,\n\t\t\tc.dst_slot.uid\n\t\t).index\n\t}\n\n\tif (c.src_slot.dynamic) {\n\t\tc.src_slot.index = c.src_node.find_dynamic_slot(\n\t\t\tE2.slot_type.output,\n\t\t\tc.src_slot.uid\n\t\t).index\n\t}\n\n\tgraph.connect(connection)\n\n\tthis.emit('connected', graph, connection)\n\tthis.emit('changed')\n}\n\nGraphStore.prototype._uiDisconnected = function(graph, connectionUid) {\n\tvar connection = graph.findConnectionByUid(connectionUid)\n\tif (!connection) {\n\t\tmsg('WARN: GraphStore._uiDisconnected: could not find connectionUid '+connectionUid)\n\t\treturn;\n\t}\n\n\tgraph.disconnect(connection)\n\n\tthis.emit('disconnected', graph, connection)\n\tthis.emit('changed')\n}\n\nfunction _gatherConnections(nodes) {\n\treturn nodes.reduce(function(arr, node) {\n\t\treturn arr.concat(node.inputs.concat(node.outputs))\n\t}, [])\n}\n\nGraphStore.prototype.assetsMayHaveChanged = function(node) {\n\tif (assetLoadingPlugins.indexOf(node.plugin.id) === -1)\n\t\treturn;\n\n\tthis._calculateGraphSize()\n}\n\nGraphStore.prototype._calculateGraphSize = function() {\n\tvar that = this\n\n\tif (!E2.core.root_graph || !E2.core.root_graph.nodes.length)\n\t\treturn when.resolve()\n\n\tif (this._statDfd) {\n\t\treturn this._statDfd\n\t\t.then(function() {\n\t\t\tthat._calculateGraphSize()\n\t\t})\n\t}\n\n\tthis._statDfd = new E2.GraphAnalyser(new E2.GridFsClient())\n\t\t.analyseGraph(E2.core.root_graph)\n\t\t.then(function(stat) {\n\t\t\tthat.stat = stat\n\t\t\tthat.emit('changed:size', that.stat.size)\n\t\t})\n\t\t.finally(function() {\n\t\t\tthat._statDfd = null\n\t\t})\n}\n\nGraphStore.prototype.getGraphSize = function() {\n\treturn this.stat\n}\n\nGraphStore.prototype._uiNodesMoved = function(graph, nodeUids, delta) {\n\tvar nodes = nodeUids.map(function(nid) {\n\t\treturn graph.findNodeByUid(nid)\n\t})\n\n\tvar connections = _gatherConnections(nodes)\n\tE2.app.executeNodeDrag(nodes,\n\t\tconnections,\n\t\tdelta.x,\n\t\tdelta.y)\n\n\tthis.emit('changed')\n}\n\nGraphStore.prototype._uiPluginTransientStateChanged = function(graph, nodeUid, key, value) {\n\treturn this._uiPluginStateChanged(graph, nodeUid, key, value)\n}\n\nGraphStore.prototype._uiPluginStateChanged = function(graph, nodeUid, key, value) {\n\tvar node = graph.findNodeByUid(nodeUid)\n\tnode.setPluginState(key, value)\n\tthis.assetsMayHaveChanged(node)\n\tthis.emit('changed')\n}\n\nGraphStore.prototype._uiSlotValueChanged = function(graph, nodeUid, slotName, value) {\n\tvar node = graph.findNodeByUid(nodeUid)\n\tnode.setInputSlotValue(slotName, value)\n\tthis.assetsMayHaveChanged(node)\n\tthis.emit('changed')\n}\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = GraphStore\nelse\n\twindow.GraphStore = GraphStore\n\n})();\n\n"
  },
  {
    "path": "browser/scripts/stores/peopleStore.js",
    "content": "(function() {\n\nif (typeof(module) !== 'undefined') {\n\tStore = require('./store')\n}\n\n/**\n * PeopleStore keeps track of people editing the current document.\n * It knows about their active graph, pointer color, position,\n * and when they click.\n *\n * @fires PeopleStore#userFollowed\n * @fires PeopleStore#activeGraphChanged\n * @fires PeopleStore#mouseClicked\n * @fires PeopleStore#mouseMoved\n * @fires PeopleStore#added\n * @fires PeopleStore#removed\n */\nfunction PeopleStore() {\n\tStore.apply(this, arguments)\n\n\tthis.people = {}\n\tthis.mousePositionLastSentAt = 0\n}\n\nPeopleStore.prototype = Object.create(Store.prototype)\n\nPeopleStore.prototype.initialize = function() {\n\tvar that = this\n\n\tdocument.addEventListener('mousemove', this._mouseMoveHandler.bind(this))\n\tdocument.addEventListener('click', this._mouseClickHandler.bind(this))\n\n\tthis.me = this.people[E2.app.channel.uid] = {\n\t\tuid: E2.app.channel.uid,\n\t\tactiveGraphUid: E2.core.active_graph.uid\n\t}\n\n\tfunction setOwnGraph(graphUid) {\n\t\tthat.me.activeGraphUid = graphUid\n\t\tthat.emit('activeGraphChanged', that.me)\n\t}\n\n\tE2.app.dispatcher.register(function(payload) {\n\t\tvar uid = payload.from || E2.app.channel.uid\n\t\tvar isOwn = uid === E2.app.channel.uid\n\n\t\tif (that.people[uid])\n\t\t\tthat.people[uid].lastSeen = Date.now()\n\n\t\tswitch(payload.actionType) {\n\t\t\tcase 'uiUserIdUnfollowed':\n\t\t\t\tvar person = that.people[uid]\n\t\t\t\tvar target = that.people[payload.followUid]\n\t\t\t\tperson.followUid = null\n\t\t\t\ttarget.followers--\n\t\t\t\tthat.emit('userUnfollowed', person, target)\n\t\t\t\tbreak;\n\t\t\tcase 'uiUserIdFollowed':\n\t\t\t\tvar person = that.people[uid]\n\t\t\t\tvar followee = that.people[payload.followUid]\n\t\t\t\tif (!followee)\n\t\t\t\t\treturn;\n\n\t\t\t\tperson.followUid = payload.followUid\n\n\t\t\t\tfollowee.followers++\n\t\n\t\t\t\tif (isOwn)\n\t\t\t\t\tsetOwnGraph(followee.activeGraphUid)\n\n\t\t\t\tthat.emit('userFollowed', person, followee)\n\n\t\t\t\tbreak\n\n\t\t\tcase 'uiActiveGraphChanged':\n\t\t\t\tthat.people[uid].activeGraphUid = payload.activeGraphUid\n\t\t\t\tthat.emit('activeGraphChanged', that.people[uid])\n\n\t\t\t\tif (isOwn)\n\t\t\t\t\treturn\n\n\t\t\t\t// if I'm following them, change my activeGraph too\n\t\t\t\tif (that.me.followUid === uid)\n\t\t\t\t\tsetOwnGraph(payload.activeGraphUid)\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'uiMouseClicked':\n\t\t\t\tif (isOwn)\n\t\t\t\t\treturn\n\n\t\t\t\tthat.emit('mouseClicked', uid)\n\t\t\t\tbreak;\n\n\t\t\tcase 'uiMouseMoved':\n\t\t\t\tif (isOwn)\n\t\t\t\t\treturn\n\n\t\t\t\tthat.people[uid].x = payload.x\n\t\t\t\tthat.people[uid].y = payload.y\n\n\t\t\t\tthat.emit('mouseMoved', that.people[uid])\n\t\t\t\tbreak;\n\t\t}\n\t})\n\n\tE2.app.channel\n\t.on('disconnected', function() {\n\t\tthat.empty()\n\t})\n\t.on('reconnected', function() {\n\t\tthat.people = {}\n\t\tthat.me = undefined\n\t})\n\t.on('leave', function(m) {\n\t\tvar person = that.people[m.id]\n\t\tif (!person) // haven't seen them yet\n\t\t\treturn;\n\n\t\tif (m.id === E2.app.channel.uid) {\n\t\t\tthat.empty()\n\t\t} else {\n\t\t\tif (person.followUid)\n\t\t\t\tthat.people[person.followUid].followers--;\n\n\t\t\tdelete that.people[m.id]\n\t\t\tthat.emit('removed', m.id)\n\t\t}\n\t})\n\t.on('join', function(m) {\n\t\tif (!that.people[m.id])\n\t\t\tthat.people[m.id] = {}\n\n\t\tthat.people[m.id].uid = m.id\n\t\tthat.people[m.id].username = m.username\n\t\tthat.people[m.id].color = m.color\n\t\tthat.people[m.id].activeGraphUid = m.activeGraphUid\n\t\tthat.people[m.id].followers = m.followers || 0\n\t\tthat.people[m.id].lastSeen = Date.now()\n\n\t\tif (m.id === E2.app.channel.uid)\n\t\t\tthat.me = that.people[m.id]\n\n\t\tthat.emit('added', that.people[m.id])\n\t})\n}\n\nPeopleStore.prototype._mouseClickHandler = function() {\n\tE2.app.dispatcher.dispatch({\n\t\tactionType: 'uiMouseClicked'\n\t})\n}\n\nPeopleStore.prototype._mouseMoveHandler = function(e) {\n\n\tvar x = e.pageX\n\tvar y = e.pageY\n\tvar cp = E2.dom.canvases[0]\n\n\tvar adjustedX = x - cp.offsetLeft\n\tvar adjustedY = y - cp.offsetTop\n\n\t// Limit the broadcasted mouse movement area to the canvas\n\tif (Date.now() - this.mousePositionLastSentAt > 60 && adjustedX > -1 && adjustedY > -1) {\n\t\tE2.app.dispatcher.dispatch({\n\t\t\tactionType: 'uiMouseMoved',\n\t\t\tx: adjustedX + E2.app.scrollOffset[0],\n\t\t\ty: adjustedY + E2.app.scrollOffset[1]\n\t\t})\n\n\t\tthis.mousePositionLastSentAt = Date.now()\n\t}\n\n}\n\n/**\n * Empties the Store\n * @fires PeopleStore#removed\n */\nPeopleStore.prototype.empty = function empty() {\n\tvar that = this\n\n\tthis.list().map(function(person) {\n\t\tif (person.uid !== E2.app.channel.uid) {\n\t\t\tdelete that.people[person.uid]\n\t\t\tthat.emit('removed', person.uid)\n\t\t}\n\t})\n}\n\nPeopleStore.prototype.findByUid = function findByUid(uid) {\n\treturn this.people[uid]\n}\n\nPeopleStore.prototype.list = function list() {\n\tvar that = this\n\treturn Object.keys(this.people).map(function(id) {\n\t\treturn that.people[id]\n\t})\n}\n\nif (typeof(module) !== 'undefined') {\n\tmodule.exports = PeopleStore\n} else\n\twindow.PeopleStore = PeopleStore\n\n})();\n\n"
  },
  {
    "path": "browser/scripts/stores/store.js",
    "content": "(function() {\n\nfunction Store() {\n\tEventEmitter.call(this)\n}\n\nStore.prototype = Object.create(EventEmitter.prototype)\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = Store\nelse\n\twindow.Store = Store\n\n})();\n"
  },
  {
    "path": "browser/scripts/subGraphPlugin.js",
    "content": "/*\n\t- \"input node\" refers to input proxy\n\t- input_nodes is a map of graph node slot uid -> input proxy node\n\t\tinside the graph\n */\nfunction SubGraphPlugin(core, node) {\n\tPlugin.apply(this, arguments)\n\n\tthis.core = core\n\tthis.node = node\n\n\tthis.parent_node = node; // For reverse lookup in the core.\n\tthis.updated_sids = []\n\n\tthis.input_nodes = {}\n\tthis.output_nodes = {}\n\n\tthis.ui = null\n\tthis.isGraph = true\n}\n\nSubGraphPlugin.prototype = Object.create(Plugin.prototype)\nSubGraphPlugin.prototype.constructor = SubGraphPlugin\n\nSubGraphPlugin.prototype.reset = function() {\n\tif (this.graph)\n\t\tthis.graph.reset()\n}\n\nSubGraphPlugin.prototype.play = function() {\n\tif (this.graph)\n\t\tthis.graph.play()\n}\n\nSubGraphPlugin.prototype.pause = function() {\n\tif (this.graph)\n\t\tthis.graph.pause()\n}\n\nSubGraphPlugin.prototype.stop = function() {\n\tif (this.graph)\n\t\tthis.graph.stop()\n}\n\nSubGraphPlugin.prototype.get_dt_name = function(dt) {\n\tif (!dt || !dt.name)\n\t\treturn 'ERROR'\n\n\treturn dt.name\n}\n\nSubGraphPlugin.prototype.dbg = function(str) {\n\tmsg('Graph: ' + str)\n}\n\n// when an external proxy slot is disconnected, clear the datatype of the proxy\nSubGraphPlugin.prototype.onProxySlotDisconnected = function(conn, slot) {\n\tvar internalSlot\n\n\tif (slot.type === E2.slot_type.input) {\n\t\t// inbound connection to external slot for input_proxy was disconnected\n\t\tvar inputProxyNode = this.input_nodes[slot.uid] \n\t\tif (!inputProxyNode)\n\t\t\treturn;\n\t\tinternalSlot = inputProxyNode.dyn_outputs[0] // output slot of input proxy\n\t\tinputProxyNode.plugin.data = this.core.get_default_value(slot.dt)\n\t\tinputProxyNode.reset()\n\t} else {\n\t\t// outbound connection from external slot of output_proxy was disconnected\n\t\tvar node = this.parent_node\n\t\tvar count = 0 // connection count from external output slot\n\t\tfor(var i = 0, len = node.outputs.length; i < len; i++) {\n\t\t\tif (node.outputs[i].src_slot === slot)\n\t\t\t\tcount++\n\t\t}\n\t\t\n\t\tif (count === 0) \n\t\t\tinternalSlot = this.output_nodes[slot.uid].dyn_inputs[0] // input slot of output proxy\n\t}\n\n\tif (internalSlot && !internalSlot.connected) {\n\t\t// reset the external slot to ANY because it was disconnected\n\t\tinternalSlot.dt = slot.dt = this.core.datatypes.ANY\n\t}\n\n}\n\n// outside the graph\nSubGraphPlugin.prototype.connection_changed = function(on, conn, externalSlot) {\n\tvar internalSlot = null\n\tvar core = this.core\n\n\tif (!on) {\n\t\t// something was disconnected from an external slot\n\t\tthis.onProxySlotDisconnected(conn, externalSlot)\n\t} else {\n\t\t// something was connected to an external slot\n\t\tvar proxyNode = null\n\t\t\n\t\tif (externalSlot.type === E2.slot_type.input) {\n\t\t\t// external input slot was connected\n\t\t\t// assume the datatype and arrayness if not already set\n\t\t\tif (externalSlot.dt.id === E2.dt.ANY.id) {\n\t\t\t\texternalSlot.dt = conn.src_slot.dt\n\t\t\t\texternalSlot.array = conn.src_slot.array\n\t\t\t}\n\n\t\t\tproxyNode = this.input_nodes[externalSlot.uid]\n\t\t\tif (!proxyNode)\n\t\t\t\treturn;\n\t\t\tinternalSlot = proxyNode.dyn_outputs[0]\n\n\t\t\t// match internal & external slot arrayness\n\t\t\tinternalSlot.array = externalSlot.array\n\t\t} else {\n\t\t\t// external output slot was connected\n\t\t\t// assume the datatype and arrayness if not already set\n\t\t\tif (externalSlot.dt.id === E2.dt.ANY.id) {\n\t\t\t\texternalSlot.dt = conn.dst_slot.dt\n\t\t\t\texternalSlot.array = conn.dst_slot.array\n\t\t\t}\n\n\t\t\tproxyNode = this.output_nodes[externalSlot.uid]\n\t\t\tif (!proxyNode)\n\t\t\t\treturn;\n\t\t\tinternalSlot = proxyNode.dyn_inputs[0]\n\n\t\t\t// match internal & external slot arrayness\n\t\t\tinternalSlot.array = externalSlot.array\n\t\t}\n\t\t\n\t\tif (internalSlot.dt.id === E2.dt.ANY.id) {\n\t\t\tinternalSlot.dt = externalSlot.dt\n\t\t\tinternalSlot.array = externalSlot.array\n\t\t}\n\n\t\t// force the subgraph to output a valid value the next time it's pulled\n\t\tif (this.graph) {\n\t\t\tthis.graph.enum_all(function(node) {\n\t\t\t\tnode.plugin.updated = true\n\t\t\t})\n\t\t}\n\n\t\tthis.updated = true\n\n\t\tproxyNode.plugin.data = core.get_default_value(externalSlot.dt)\n\t}\n}\n\n// inside the graph\nSubGraphPlugin.prototype.proxy_connection_changed = function(on, proxyNode, otherNode, proxySlot, otherSlot) {\n\tvar that = this\n\tvar core = this.core\n\tvar node = this.parent_node\n\n\tfunction find_sid(nodes, uid) {\n\t\tfor (var n in nodes) {\n\t\t\tif(nodes[n].uid === uid)\n\t\t\t\treturn n\n\t\t}\n\t\t\n\t\tmsg('ERROR: Failed to resolve node(' + uid + ') in graph(' + that.graph.plugin.parent_node.title + ').')\n\t\treturn -1;\n\t}\n\t\n\tfunction isExternalSlotConnected(gslot) {\n\t\tvar i, len\n\t\tif (gslot.type === E2.slot_type.input) {\n\t\t\tfor(i = 0, len = node.inputs.length; i < len; i++) {\n\t\t\t\tif(node.inputs[i].dst_slot === gslot)\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t} else {\n\t\t\tfor(i = 0, len = node.outputs.length; i < len; i++) {\n\t\t\t\tif(node.outputs[i].src_slot === gslot)\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn false\n\t}\n\t\n\tfunction changeSlots(lastRemoved, externalSlot) {\n\t\tproxySlot.connected = true\n\t\t\n\t\tif (on) {\n\t\t\t// something connected to the proxy\n\t\t\t// assume the dt and arrayness of the other end \n\t\t\tif (proxySlot.dt.id === core.datatypes.ANY.id) {\n\t\t\t\tproxySlot.dt = otherSlot.dt\n\t\n\t\t\t\tif (otherSlot.array)\n\t\t\t\t\tproxySlot.array = otherSlot.array\n\t\n\t\t\t\tproxyNode.plugin.data = core.get_default_value(otherSlot.dt)\n\t\t\t\texternalSlot.dt = otherSlot.dt\n\t\t\t\texternalSlot.array = otherSlot.array\n\t\t\t}\n\n\t\t} else if (lastRemoved) {\n\t\t\t// last connection was removed from proxy\n\t\t\tvar parentGraphConnections = node.parent_graph.connections\n\t\t\tvar connected = false\n\t\t\tvar i, len\n\t\t\tvar remoteProxySlot\n\n\t\t\t// is the external slot connected?\n\t\t\tfor(i = 0, len = parentGraphConnections.length; i < len; i++) {\n\t\t\t\tvar c = parentGraphConnections[i]\n\t\t\t\t\n\t\t\t\tif (c.dst_slot === externalSlot || c.src_slot === externalSlot) {\n\t\t\t\t\tconnected = true\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tproxySlot.connected = false\n\n\t\t\tif (!connected) {\n\t\t\t\tproxySlot.dt = externalSlot.dt = core.datatypes.ANY\n\t\t\t}\n\n\t\t\tif (otherNode.plugin.id === 'input_proxy') {\n\t\t\t\tconnected = false\n\n\t\t\t\tfor(i = 0, len = otherNode.outputs.length; i < len; i++) {\n\t\t\t\t\tif (otherNode.outputs[i].src_slot === otherSlot) {\n\t\t\t\t\t\tconnected = true\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tremoteProxySlot = node.find_dynamic_slot(E2.slot_type.input, \n\t\t\t\t\tfind_sid(that.input_nodes, otherNode.uid))\n\t\t\t\t\n\t\t\t\tif (!connected && !isExternalSlotConnected(remoteProxySlot)) {\n\t\t\t\t\totherSlot.dt = remoteProxySlot.dt = core.datatypes.ANY\n\t\t\t\t}\n\t\t\t} else if (otherNode.plugin.id === 'output_proxy') {\n\t\t\t\tremoteProxySlot = node.find_dynamic_slot(E2.slot_type.output, \n\t\t\t\t\tfind_sid(that.output_nodes, otherNode.uid))\n\t\t\t\t\n\t\t\t\tif(!isExternalSlotConnected(rgsl)) {\n\t\t\t\t\totherSlot.dt = remoteProxySlot.dt = core.datatypes.ANY\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tvar lastRemoved\n\n\tif (proxyNode.plugin.id === 'input_proxy') {\n\t\tlastRemoved = proxyNode.outputs.length === 0\n\t\t\n\t\tchangeSlots(lastRemoved,\n\t\t\tnode.find_dynamic_slot(\n\t\t\t\tE2.slot_type.input,\n\t\t\t\tfind_sid(this.input_nodes, proxyNode.uid)\n\t\t))\n\n\t\tthis.dbg('    Output count = ' + proxyNode.outputs.length)\n\t} else { // output proxy\n\t\tlastRemoved = proxyNode.inputs.length === 0\n\t\t\n\t\tchangeSlots(lastRemoved,\n\t\t\tnode.find_dynamic_slot(\n\t\t\t\tE2.slot_type.output,\n\t\t\t\tfind_sid(this.output_nodes, proxyNode.uid)\n\t\t))\n\n\t\tthis.dbg('    Input count = ' + proxyNode.inputs.length)\n\t}\n}\n\nSubGraphPlugin.prototype.update_output = function(slot) {\n\tif (slot.dynamic)\n\t\treturn this.output_nodes[slot.uid].plugin.data\n}\n\nSubGraphPlugin.prototype.query_output = function(slot) {\n\treturn (slot.uid === undefined) || this.updated_sids.indexOf(slot.uid) > -1\n}\n\nSubGraphPlugin.prototype.destroy_slot = function(type, nuid) {\n\tvar slots = (type === E2.slot_type.input) ? this.state.input_sids : this.state.output_sids\n\tvar sid = slots[nuid]\n\t\n\tdelete slots[nuid]\n\n\tthis.parent_node.remove_slot(type, sid)\n}\n\nSubGraphPlugin.prototype.setupProxies = function() {\n\tvar that = this\n\n\tfunction find_node(uid) {\n\t\tvar n = that.graph.findNodeByUid(uid)\n\t\tif (!n)\n\t\t\treturn msg('ERROR: Failed to find registered proxy node(' + uid +\n\t\t\t\t') in graph(' + that.graph.plugin.parent_node.title + ').'); \n\n\t\tvar p = n.plugin\n\t\tp.data = E2.core.get_default_value((p.id === 'input_proxy' ?\n\t\t\tn.dyn_outputs : n.dyn_inputs)[0]\n\t\t.dt)\n\n\t\treturn n\n\t}\n\n\tfor(var uid in this.state.input_sids)\n\t\tthis.input_nodes[this.state.input_sids[uid]] = find_node(uid)\n\n\tfor(var uid in this.state.output_sids)\n\t\tthis.output_nodes[this.state.output_sids[uid]] = find_node(uid)\n}\n\nSubGraphPlugin.prototype.setGraph = function(graph) {\n\tvar that = this\n\tvar node = this.parent_node\n\t\n\tthis.graph = graph\n\n\tthis.graph\n\t.on('nodeAdded', function(addedNode, info) {\n\t\tvar sid\n\t\tvar pid = addedNode.plugin.id\n\t\tvar slotInfo = {\n\t\t\tname: addedNode.title,\n\t\t\tdt: E2.dt.ANY,\n\t\t\tindex: info && info.proxy ? info.proxy.index : null,\n\t\t\tuid: info && info.proxy ? info.proxy.sid : null\n\t\t}\n\n\t\tif (pid === 'input_proxy') {\n\t\t\tsid = node.add_slot(E2.slot_type.input, slotInfo)\n\t\t\tthat.state.input_sids[addedNode.uid] = sid\n\t\t\tthat.input_nodes[sid] = addedNode\n\t\t} else if (pid === 'output_proxy') {\n\t\t\tsid = node.add_slot(E2.slot_type.output, slotInfo)\n\t\t\tthat.state.output_sids[addedNode.uid] = sid\n\t\t\tthat.output_nodes[sid] = addedNode\n\t\t}\n\t})\n\t.on('nodeRemoved', function(removedNode) {\n\t\tvar pid = removedNode.plugin.id\n\t\tif (pid === 'input_proxy')\n\t\t\tthat.destroy_slot(E2.slot_type.input, removedNode.uid)\n\t\telse if (pid === 'output_proxy')\n\t\t\tthat.destroy_slot(E2.slot_type.output, removedNode.uid)\n\t})\n\t.on('nodeRenamed', function(renamedNode) {\n\t\tvar pid = renamedNode.plugin.id\n\t\tif (pid === 'input_proxy')\n\t\t\tnode.rename_slot(E2.slot_type.input, that.state.input_sids[renamedNode.uid], renamedNode.title)\n\t\telse if (pid === 'output_proxy')\n\t\t\tnode.rename_slot(E2.slot_type.output, that.state.output_sids[renamedNode.uid], renamedNode.title)\n\t})\n}\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = SubGraphPlugin\n\n"
  },
  {
    "path": "browser/scripts/textureCache.js",
    "content": "\nfunction TextureCache() {\n\tthis.textures = {}\n\n\tthis.defaultTexture = THREE.ImageUtils.loadTexture('/data/textures/defaulttex.png')\n\tthis.loadingTexture = THREE.ImageUtils.loadTexture('/data/textures/loadingtex.png')\n}\n\nTextureCache.prototype.get = function(url) {\n\tvar ce = this.textures[url]\n\n\tif (ce) {\n\t\tmsg('INFO: Returning cached version of texture \\'' + url + '\\'.')\n\t\tce.count++\n\t\treturn ce.texture\n\t}\n\n\tfunction onLoadFail() {\n\t\t// set image to default texture\n\t\tthis.textures[url].texture.image = this.defaultTexture.image\n\t\tthis.textures[url].texture.needsUpdate = true\n\t}\n\t\n\t// load a texture, set wrap mode to repeat\n\tvar texture = THREE.ImageUtils.loadTexture(url, \n\t\tundefined,\n\t\tundefined,\n\t\tonLoadFail.bind(this))\n\n\ttexture.wrapS = THREE.RepeatWrapping\n\ttexture.wrapT = THREE.RepeatWrapping\n\n\tmsg('INFO: Fetching texture \\'' + url + '\\'.')\n\n\tthis.textures[url] = { count: 0, texture: texture }\n\n\treturn texture\n}\n\nTextureCache.prototype.clear = function() {\n\tthis.textures = {}\n}\n\nTextureCache.prototype.count = function() {\n\tvar c = 0\n\tvar ts = this.textures\n\t\n\tfor (var t in ts) {\n\t\tif (ts.hasOwnProperty(t))\n\t\t\t++c\n\t}\n\t\n\treturn c\n}\n"
  },
  {
    "path": "browser/scripts/threeObject3dPlugin.js",
    "content": "function ThreeObject3DPlugin(core) {\n\tPlugin.apply(this, arguments)\n\n\tthis.desc = 'THREE.js Object3D'\n\n\tthis.input_slots = [\n\t\t{ name: 'position', dt: core.datatypes.VECTOR },\n\t\t{ name: 'rotation', dt: core.datatypes.VECTOR },\n\t\t{ name: 'scale', dt: core.datatypes.VECTOR, def: new THREE.Vector3(1, 1, 1) },\n\n\t\t{ name: 'visible', dt: core.datatypes.BOOL, def: true },\n\t\t{ name: 'castShadow', dt: core.datatypes.BOOL, def: true, label: \"Cast shadow\" },\n\t\t{ name: 'receiveShadow', dt: core.datatypes.BOOL, def: true, label: \"Receive shadows\" },\n\n\t\t{ name: 'name', dt: core.datatypes.TEXT, def: ''},\n\n\t\t{\n\t\t\tname:   'stereo view',\n\t\t\tdt:     core.datatypes.FLOAT,\n\t\t\tdef:    0,\n\t\t\tdesc:   'Affects how this object is rendered in stereo<br/>Stereo View - 0: both eyes, 1: left eye only, 2: right eye only, 3: mono view only'\n\t\t},\n\t\t{\n\t\t\tname:   'lock transform',\n\t\t\tdt:     core.datatypes.BOOL,\n\t\t\tdef:    false,\n\t\t\tlabel:  \"Lock transform controls\",\n\t\t\tdesc:   'if enabled, this object\\'s transform is locked and can\\'t be adjusted in the 3d editor.',\n\t\t\tpatchable: false\n\t\t}\n\t]\n\n\tthis.output_slots = [{\n\t\tname: 'object3d',\n\t\tdt: core.datatypes.OBJECT3D\n\t}]\n\n\tthis.state = {\n\t\tposition: {x: 0, y: 0, z:0},\n\t\tscale: {x: 1, y: 1, z:1},\n\n\t\t// names with underscores have to match with THREE.Quaternion\n\t\t// member variable names because of to/from json serialisation\n\t\tquaternion: {_x: 0, _y: 0, _z:0, _w:1}\n\t}\n\n\tthis.pivot = {x: 0, y: 0, z: 0}\n\n\tthis.lockTransformControls = false\n\n\tthis.graphInputs = {\n\t\tposition: new THREE.Vector3(0, 0, 0),\n\t\tscale: new THREE.Vector3(1, 1, 1),\n\t\tquaternion: new THREE.Quaternion(0, 0, 0, 1)\n\t}\n}\n\nThreeObject3DPlugin.prototype = Object.create(Plugin.prototype)\n\nThreeObject3DPlugin.prototype.reset = function() {\n\tPlugin.prototype.reset.apply(this, arguments)\n\n\tif (!this.object3d)\n\t\tthis.setObject3D(new THREE.Object3D())\n\n\tthis.updateTransforms()\n}\n\nThreeObject3DPlugin.prototype.getObject3D = function() {\n\treturn this.object3d\n}\n\nThreeObject3DPlugin.prototype.setObject3D = function(newObject3d) {\n\tthis.object3d = newObject3d\n\n\tvar that = this\n\tthis.object3d.traverse(function(n) {\n\t\tn.castShadow = that.inputValues.castShadow\n\t\tn.receiveShadow = that.inputValues.receiveShadow\n\t})\n\n\tfunction hierarchyChanged(event) {\n\t\tvar obj = event.target\n\t\tvar castShadow = obj.castShadow\n\t\tvar receiveShadow = obj.receiveShadow\n\n\t\tobj.traverse(function (n) {\n\t\t\tn.castShadow = castShadow\n\t\t\tn.receiveShadow = receiveShadow\n\t\t})\n\t}\n\n\tthis.object3d.addEventListener('added', hierarchyChanged)\n\n\t// back reference for object picking\n\tthis.object3d.backReference = this\n}\n\nThreeObject3DPlugin.prototype.update_input = function(slot, data) {\n\tif (!this.object3d)\n\t\treturn;\n\n\tthis.inputValues[slot.name] = data\n\n\tvar that = this\n\n\tvar handlers = {\n\t\t\"position\": function() {\n\t\t\tthat.graphInputs.position.x = data.x\n\t\t\tthat.graphInputs.position.y = data.y\n\t\t\tthat.graphInputs.position.z = data.z\n\t\t},\n\t\t\"rotation\": function() {\n\t\t\tthat.graphInputs.quaternion.setFromEuler(new THREE.Euler(data.x, data.y, data.z, \"YZX\"))\n\t\t},\n\t\t\"scale\": function() {\n\t\t\tthat.graphInputs.scale.x = data.x\n\t\t\tthat.graphInputs.scale.y = data.y\n\t\t\tthat.graphInputs.scale.z = data.z\n\t\t},\n\t\t\"visible\": function() {\n\t\t\tthat.object3d.visible = data\n\t\t},\n\t\t\"castShadow\": function() {\n\t\t\tthat.object3d.traverse(function (n) {\n\t\t\t\tn.castShadow = data\n\t\t\t})\n\t\t},\n\t\t\"receiveShadow\": function() {\n\t\t\tthat.object3d.traverse(function (n) {\n\t\t\t\tn.receiveShadow = data\n\t\t\t})\n\t\t},\n\t\t\"name\": function() {\n\t\t\tthat.object3d.name = data\n\t\t},\n\t\t\"stereo view\": function() {\n\t\t\tthat.object3d.traverse(function (n) {\n\t\t\t\tn.layers.set(data)\n\t\t\t})\n\t\t},\n\t\t\"lock transform\": function() {\n\t\t\tthat.lockTransformControls = data\n\t\t}\n\t}\n\n\tif (handlers[slot.name]) {\n\t\tif (data !== undefined) {\n\t\t\thandlers[slot.name]()\n\t\t}\n\t}\n\telse {\n\t\tif (this.object3d[slot.name] instanceof THREE.Color) {\n\t\t\tthis.object3d[slot.name].copy(data)\n\t\t}\n\t\telse {\n\t\t\tthis.object3d[slot.name] = data\n\t\t}\n\t}\n}\n\nThreeObject3DPlugin.prototype.update_output = function() {\n\treturn this.object3d\n}\n\nThreeObject3DPlugin.prototype.state_changed = function(ui) {\n\tif (ui) {\n\t\treturn\n\t}\n}\n\nThreeObject3DPlugin.prototype.updateTransforms = function() {\n\tthis.object3d.scale.set(\n\t\tthis.graphInputs.scale.x * this.state.scale.x,\n\t\tthis.graphInputs.scale.y * this.state.scale.y,\n\t\tthis.graphInputs.scale.z * this.state.scale.z)\n\n\tthis.object3d.position.set(\n\t\tthis.graphInputs.position.x + this.state.position.x + this.pivot.x,\n\t\tthis.graphInputs.position.y + this.state.position.y + this.pivot.y,\n\t\tthis.graphInputs.position.z + this.state.position.z + this.pivot.z)\n\n\tthis.object3d.quaternion.set(\n\t\tthis.state.quaternion._x,\n\t\tthis.state.quaternion._y,\n\t\tthis.state.quaternion._z,\n\t\tthis.state.quaternion._w)\n\n\tthis.object3d.quaternion.multiply(this.graphInputs.quaternion)\n}\n\nThreeObject3DPlugin.prototype.update_state = function() {\n\tif (this.object3d.layers !== this.inputValues['stereo view']) {\n\t\tvar that = this\n\t\tthis.object3d.traverse(function(n) {\n\t\t\tn.layers.set(that.inputValues['stereo view'])\n\t\t})\n\t}\n\n\tthis.updateTransforms()\n}\n\nThreeObject3DPlugin.prototype.canEditPosition = function() {\n\treturn !this.lockTransformControls\n}\n\nThreeObject3DPlugin.prototype.canEditQuaternion = function() {\n\treturn !this.lockTransformControls\n}\n\nThreeObject3DPlugin.prototype.canEditScale = function() {\n\treturn !this.lockTransformControls\n}\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = ThreeObject3DPlugin\n"
  },
  {
    "path": "browser/scripts/threesixty.js",
    "content": "if (!E2.ui)\n \tE2.ui = {}\n\nE2.ui.ui360 = new function() {\n\n\tvar that = this\n\tthis.dom = {\n\t\tcontrolsDiv: null\n\t}\n\tvar $body = {},\n\t\t$progress = {}\t// progressbar element\n\n\tthis.minProgress = 0\t// allow half+half progress bar\n\n\tfunction updateProgressBar(percent) {\n\t\t$progress.val(percent)\n\t\tthat.minProgress = percent\n\t}\n\n\tfunction clearBodyClass() {\n\t\t$body.removeClass('dragentered dragover dragover-dropzone uploading error')\n\t}\n\n\t/* lastTarget is set first on dragenter, then\n\t   compared with during dragleave. */\n\tvar lastDragTarget = null;\n\n\n\t/* ERROR HANDLING */\n\tthis.displayError = function(message, details, heading) {\n\t\tif (!(message || details)) return\n\t\theading = heading || 'Error'\n\n\t\t//playerUI.selectStage('errorStage')\n\t\tvar html = E2.views.partials.error({\n\t\t\tmessage: message,\n\t\t\tcode: details\n\t\t})\n\n\t\tconsole.error(message, details)\n\n\t\twindow.Vizor.disableHeaderClick = true\n\n\t\tVizorUI.modalOpen(html, heading, 'error doselect_all', true, {\n\t\t\tcallback: function() {}\n\t\t})\n\t}\n\n\tvar cancelledUploading = function() {\n\t\t// remove fake progress bar\n\t\tif (that.fakeProgressBarId) {\n\t\t\tclearTimeout(that.fakeProgressBarId)\n\t\t}\n\n\t\t// reset progress bar\n\t\tupdateProgressBar(0);\n\t\t$('#threesixty-image-input').val('')\t// force clear\n\n\t\tclearBodyClass()\n\t\tE2.app.player.play()\n\t\twindow.Vizor.disableHeaderClick = false\n\t\treturn false\n\t}\n\n\tfunction errorHandler(message, details){\n\t\tcancelledUploading()\n\t\tthat.displayError(message, details)\n\t}\n\n\t// STEP 4\n\tthis.loadGraphAndPlay = function(asset, data) {\n\t\tif (!asset) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Load from the JSON url in the asset\n\t\tclearBodyClass()\n\n\t\tE2.core.once('player:stateChanged', function(s){\n\t\t\tif (s === E2.app.player.state.PLAYING) {\n\t\t\t\t$body.removeClass('firsttime')\n\t\t\t\tthat.minProgress = 0\n\t\t\t\tplayerUI.headerFadeOut()\n\t\t\t\treturn true\n\t\t\t}\n\t\t\treturn false\n\t\t})\n\n\t\tVizor.shareURL = window.location.origin + asset.path\n\t\tVizor.embedSrc = window.location.origin + '/embed' + asset.path\n\t\tplayerUI.headerEnableAutoFadeout()\n\t\thistory.pushState({}, '', asset.path)\n\n\t\tE2.track({\n\t\t\tevent: 'ThreeSixty Playing Graph',\n\t\t\tpath: asset.path\n\t\t})\n\n\t\t$('#sharebutton').show()\n\t\t$('#edit').show()\n\t}\n\n\t// STEP 3\n\t// POST graph to the server\n\tthis.uploadGraph = function(graphData, callback) {\n\t\tvar p = when.defer()\n\n\t\tclearBodyClass()\n\t\t$body.addClass('uploading')\n\n\t\tE2.track({ event: 'ThreeSixty Uploading Graph' })\n\n\t\tvar previewImage = E2.app.player.getScreenshot(1280, 720)\n\n\t\t$.ajax({\n\t\t\turl: '/graph/v',\n\t\t\ttype: 'POST',\n\t\t\tdata: { \n\t\t\t\tpreviewImage: previewImage,\n\t\t\t\tgraph: graphData\n\t\t\t},\n\t\t\tdataType: 'json',\n\t\t\tsuccess: function(response) {\n\t\t\t\tE2.track({\n\t\t\t\t\tevent: 'ThreeSixty Uploaded Graph', \n\t\t\t\t\tpath: response.path\n\t\t\t\t})\n\n\t\t\t\tcallback(response)\n\n\t\t\t\tp.resolve()\n\t\t\t},\n\t\t\terror: function(err) {\n\t\t\t\tvar errMsg = err.responseJSON ? err.responseJSON.message : err.status\n\n\t\t\t\tE2.track({\n\t\t\t\t\tevent: 'ThreeSixty Error Uploading Graph',\n\t\t\t\t\ttype: 'error',\n\t\t\t\t\terror: errMsg\n\t\t\t\t})\n\n\t\t\t\talert('Sorry, an error occurred while uploading the file.')\n\n\t\t\t\tp.reject('Could not post file', errMsg)\n\t\t\t}\n\t\t})\n\n\t\treturn p.promise\n\t}\n\n\t// STEP 2\n\t// Fetch the 360 template from our server and publish a graph with\n\t// image url from passed in url\n\tthis.publishTemplateWithUrl = function(imageUrl) {\n\t\tvar dfd = when.defer()\n\n\t\tvar templateUrl = \"/patches/_template-360-photo.json\";\n\n\t\t$.ajax({\n\t\t\turl: templateUrl,\n\t\t\ttype: 'GET',\n\t\t\tdataType: 'json',\n\n\t\t\tsuccess: function(graph) {\n\t\t\t\tvar urlReplaced = false;\n\n\t\t\t\t// Go through the graph 'nodes' field and find the URL\n\t\t\t\t// for the 360 template we are replacing\n\t\t\t\tvar nodes = graph.root.nodes;\n\n\t\t\t\tfor (var i=0; i < nodes.length; i++) {\n\t\t\t\t\tvar node = nodes[i];\n\n\t\t\t\t\t// Check if we have the correct node, the 360 graph\n\t\t\t\t\t// has this node generating the texture\n\t\t\t\t\tif (node.plugin === 'url_texture_generator') {\n\t\t\t\t\t\tnode.state.url = imageUrl\n\t\t\t\t\t\turlReplaced = true\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Found the url, generate the graph data and upload\n\t\t\t\tif (urlReplaced === true) {\n\t\t\t\t\tvar name = 'n/a'\n\t\t\t\t\tvar data = {\n\t\t\t\t\t\t'path': name,\n\t\t\t\t\t\t'graph': JSON.stringify(graph)\n\t\t\t\t\t}\n\n\t\t\t\t\tE2.app.player.stop()\n\n\t\t\t\t\tE2.app.player.load_from_object(graph, function() {\n\t\t\t\t\t\tE2.core.once('player:firstFramePlayed', function() {\n\t\t\t\t\t\t\tthat.uploadGraph(data.graph, function(asset) {\n\t\t\t\t\t\t\t\tupdateProgressBar(55)\n\t\t\t\t\t\t\t\tdfd.resolve(asset, data)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t})\n\t\n\t\t\t\t\t\tE2.app.player.play()\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t},\n\n\t\t\terror: function(err) {\n\t\t\t\tvar errMsg = err.responseJSON ? err.responseJSON.message : err.status;\n\t\t\t\tdfd.reject('Could not load data', errMsg)\n\t\t\t}\n\t\t})\n\n\t\treturn dfd.promise\n\t}\n\n\tthis.beforeUpload = function() {\n\t\tE2.app.player.pause()\n\t\twindow.Vizor.disableHeaderClick = true\n\t\t$body.removeClass('firsttime')\n\t}\n\n\tthis.beforeGraphPublish = function() {\n\t\twindow.Vizor.disableHeaderClick = false\n\t}\n\n\t// STEP 1\n\tthis.uploadFile = function(file, modelName) {\n\t\tthis.beforeUpload()\n\t\tvar dfd = when.defer()\n\n\t\tvar fnl = file.name.toLowerCase()\n\t\tvar extname = fnl.substring(fnl.lastIndexOf('.'))\n\n\t\tvar formData = new FormData();\n\t\tformData.append('filename', file.name);\n\t\tformData.append('file', file);\n\n\t\tvar fakeMin = 30\n\t\tvar fakeMax = 50\n\t\tvar fakeInc = (fakeMax - fakeMin) / 1000\n\t\tvar fakeInterval = 1000/60\n\n\t\tvar that = this;\n\n\t\tfunction fakeProgressBar() {\n\t\t\tvar currVal = $progress.val()\n\t\t\tif (currVal < fakeMax) {\n\t\t\t\tupdateProgressBar(currVal + fakeInc)\n\t\t\t\tthat.fakeProgressBarId = setTimeout(fakeProgressBar, fakeInterval)\n\t\t\t}\n\t\t\telse if (that.fakeProgressBarId) {\n\t\t\t\tclearTimeout(that.fakeProgressBarId)\n\t\t\t}\n\t\t}\n\n\t\tvar xhr = $.ajax({\n\t\t\turl: '/uploadAnonymous/' + modelName,\n\t\t\ttype: 'POST',\n\t\t\tdata: formData,\n\t\t\tcache: false,\n\t\t\tcontentType: false,\n\t\t\tprocessData: false,\n\t\t\tdataType: 'json',\n\n\t\t\txhr: function() {\n\t\t\t\tvar xhr = $.ajaxSettings.xhr()\n\t\t\t\t\txhr.upload.addEventListener('loadstart', function(evt) {\n\t\t\t\t\t\tclearBodyClass()\n\t\t\t\t\t\t$body.addClass('uploading')\n\t\t\t\t\t}, false);\n\n\t\t\t\t\txhr.upload.addEventListener('progress', function(evt) {\n\t\t\t\t\t\tif (evt.lengthComputable) {\n\t\t\t\t\t\t\t// Limit this to fakeMin, we continue with the player core progress\n\t\t\t\t\t\t\t// from there\n\t\t\t\t\t\t\tvar percent = Math.floor(evt.loaded/evt.total * 100) * (fakeMin / 100)\n\t\t\t\t\t\t\tupdateProgressBar(percent)\n\n\t\t\t\t\t\t\t// we've gone over 100 already on the upload, start the fake progress\n\t\t\t\t\t\t\tif (percent >= fakeMin) {\n\t\t\t\t\t\t\t\tthat.fakeProgressBarId = setTimeout(fakeProgressBar, fakeInterval)\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}, false);\n\n\t\t\t\t\txhr.upload.addEventListener('load', function(evt) {\n\t\t\t\t\t\tupdateProgressBar(50);\n\t\t\t\t\t}, false);\n\n\t\t\t\treturn xhr;\n\t\t\t},\n\n\t\t\tsuccess: function(uploadedFile) {\n\t\t\t\tdfd.resolve(uploadedFile)\n\t\t\t},\n\n\t\t\terror: function(err, text_status) {\n\t\t\t\tif (text_status === \"abort\") {\n\t\t\t\t\t// http://paulrademacher.com/blog/jquery-gotcha-error-callback-triggered-on-xhr-abort/\n\t\t\t\t\tE2.track({ event: 'ThreeSixty Cancelled Uploading' })\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tvar errMsg = err.responseJSON ? err.responseJSON.message : err.status\n\t\t\t\tcancelledUploading();\n\t\t\n\t\t\t\tE2.track({ \n\t\t\t\t\tevent: 'ThreeSixty Error Uploading', \n\t\t\t\t\ttype: 'error',\n\t\t\t\t\terror: errMsg\n\t\t\t\t})\n\n\t\t\t\tdfd.reject('Could not upload file', errMsg)\n\t\t\t}\n\t\t})\n\t\t$('#cancelbutton')\n\t\t\t.off('click')\n\t\t\t.on('click', function(){\n\n\t\t\t\txhr.abort()\n\t\t\t\tcancelledUploading()\n\t\t\t\treturn false;\n\t\t\t})\n\t\t\n\t\treturn dfd.promise\n\t}\n\n\tthis.fileUploadErrorWrongType = function(filePath) {\n\t\tE2.track({ \n\t\t\tevent: 'ThreeSixty Error Wrong File Type', \n\t\t\ttype: 'error',\n\t\t\tfilePath: filePath,\n\t\t\tfileType: filePath.type\n\t\t})\n\n\t\terrorHandler('File type does not match', 'Accepted file types are .jpg and .jpeg')\n\n\t\treturn false\n\t}\n\n\tthis.fileSelectHandler = function(e) {\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\n\t\t// Either read from the dataTransfer (when drag and dropped)\n\t\t// or from the target.files (when file browsed)\n\n\t\tvar filePath = (e.dataTransfer) ? e.dataTransfer.files : e.target.files\n\n\t\tif (!filePath)\n\t\t\treturn\n\n\t\tfilePath = filePath[0]\n\n\t\tif (filePath && filePath.type.match('image.*') === null) {\n\t\t\tcancelledUploading()\n\t\t\treturn that.fileUploadErrorWrongType(filePath)\n\t\t}\n\n\t\tE2.track({ \n\t\t\tevent: 'ThreeSixty Uploading', \n\t\t\tfilePath: filePath,\n\t\t\tfileType: filePath.type\n\t\t})\n\n\t\tthat\n\t\t\t.uploadFile(filePath, 'image')\n\t\t\t.then(function(uploadedFile) {\n\t\t\t\tE2.track({ \n\t\t\t\t\tevent: 'ThreeSixty Uploaded', \n\t\t\t\t\tfilePath: filePath,\n\t\t\t\t\tuploadedFile: uploadedFile\n\t\t\t\t})\n\n\t\t\t\tif (uploadedFile) {\n\t\t\t\t\tthat.beforeGraphPublish()\n\n\t\t\t\t\t// Get the scaled version of the original image\n\t\t\t\t\tvar imageUrl = uploadedFile.scaled.url;\n\t\t\t\t\treturn that.publishTemplateWithUrl(imageUrl);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treturn when.reject()\n\t\t\t\t}\n\t\t\t})\n\t\t\t.then(that.loadGraphAndPlay)\n\t\t\t.catch(errorHandler)\n\n\t\treturn false\n\t}\n\n\tthis.dragEnterHandler = function(e) {\n\n\t\t$body.addClass('dragentered')\n\n\t\tplayerUI.headerFadeOut(100)\n\n\t\tE2.track({ event:  'ThreeSixty DragEnter' })\n\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\n\t\tlastDragTarget = e.target;\n\t\treturn false;\n\t}\n\n\tthis.dragLeaveHandler = function(e) {\n\t\tE2.track({ event: 'ThreeSixty DragLeave' })\n\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\t\tif(e.target === lastDragTarget) {\n\t\t\t$body.removeClass('dragentered')\n\t\t}\n\t\treturn false;\n\t}\n\n\tthis.attach = function () {\n\t\tvar fileSelectHandler = that.fileSelectHandler\n\t\tvar dragEnterHandler = that.dragEnterHandler\n\t\tvar dragLeaveHandler = that.dragLeaveHandler\n\n\t\t// File drop handler\n\t\tvar drop_zone = document.getElementById('drop-zone');\n\t\tdrop_zone.addEventListener(\"drop\", fileSelectHandler);\n\n\t\t// Needs to be defined also for the 'drop' event handler to work\n\t\tdrop_zone.addEventListener(\"dragover\", function(evt) {\n\t\t\tE2.track({ event: 'ThreeSixty DragOver' })\n\t\t\tevt.stopPropagation();\n\t\t\tevt.preventDefault();\n\t\t});\n\n\t\t// File input picker\n\t\tvar file_input = document.getElementById('threesixty-image-input');\n\t\tfile_input.addEventListener(\"change\", fileSelectHandler);\n\n\t\t// Show the overlay\n\t\twindow.addEventListener(\"dragenter\", dragEnterHandler);\n\n\t\t// Hide the overlay\n\t\twindow.addEventListener(\"dragleave\", dragLeaveHandler);\n\t}\n\n\tthis.addUploadButton = function() {\n\t\tvar data = {\n\t\t\tid: 'uploadbutton',\n\t\t\ttext: 'Upload',\n\t\t\tsvgref: 'vr360-upload-image'\n\t\t}\n\t\tvar button = E2.views.partials.controls.svgButton(data)\n\n\t\tvar handler = function(e) {\n\t\t\te.preventDefault()\n\t\t\t$('#threesixty-image-input').focus().trigger('click')\n\t\t\treturn false\n\t\t}\n\t\tvar btn = $(button)\n\t\tbtn.appendTo(this.dom.controlsDiv)\n\t\tbtn[0].addEventListener('click', handler)\n\t}\n\t\n\tthis.addTOSButton = function() {\n\t\tvar data = {\n\t\t\thref: 'https://site.vizor.io/patches-tos',\n\t\t\tid: 'tosbutton',\n\t\t\ttext: 'Terms',\n\t\t\tsvgref : 'vr360-tos',\n\t\t\ttarget: '_blank'\n\t\t}\n\t\tvar button = E2.views.partials.controls.svgButton(data)\n\t\t$(button).appendTo(this.dom.controlsDiv)\n\t}\n\n\n\tthis.addCancelButton = function() {\n\t\tvar ls = document.getElementById('container360')\n\t\tif (!ls) return\n\n\t\tvar b = document.createElement('button')\n\t\tb.id = 'cancelbutton'\n\t\tb.innerHTML = 'Cancel'\n\t\tls.appendChild(b)\n\t}\n\n\tthis.init = function() {\n\t\t// scoped above\n\t    VizorPlayerUI.headerDefaultFadeoutTimeMs = 3500\n\n\t\tthis.dom.controlsDiv = document.getElementById('topbar').getElementsByTagName('div')[1]\n\n\t\tvar $header = $('header')\n\t\tvar $container360 = $('#container360')\n\t\t$container360.remove()\n\t\t$header.append($container360)\n\n\t\t$body = $('body')\n\t\t$progress = $('#progressbar')\n\n\t\t$body.addClass('firsttime')\n\n\t\tthat.addUploadButton()\n\t\tthat.addCancelButton()\n\t\tthat.addTOSButton()\n\t\tthat.attach()\n\n\t\tif (!window.Vizor) window.Vizor = {}\n\t\twindow.Vizor.hideVRbutton = true\n\t\twindow.Vizor.autoplay = true\n\t\t\n\t\twindow.Vizor.onProgress = function(pct) {\n\t\t\tvar factor = 100 / (100 - that.minProgress)\n\t\t\tvar ret = that.minProgress + pct / factor;\n\t\t\tplayerUI.onProgress(ret)\n\t\t}\n\n\t\twindow.onpopstate = function(event) {\n\t\t\tif (event.state && event.state.initial) \n\t\t\t\twindow.location = window.location\n\t\t}\n\n\t\thistory.replaceState({\n\t\t\tinitial: true\n\t\t}, null)\n\n\t\tif (window.Vizor && (Vizor.graphName === '')) {\n\t\t\tplayerUI.headerDisableAutoFadeout()\n\t\t\t$('#sharebutton').hide()\n\t\t\t$('#edit').hide()\n\t\t}\n\t}\n}\n\n$(window).on('playerUiReady', E2.ui.ui360.init.bind(E2.ui.ui360))\n"
  },
  {
    "path": "browser/scripts/treeview.js",
    "content": "function TreeNode(tree, parent_node, title, graph)\n{\n\tthis.tree = tree;\n\tthis.parent_node = parent_node;\n\tthis.title = title;\n\tthis.graph = graph;\n\tthis.graph.tree_node = this;\n\tthis.children = [];\n\tthis.dom = this.label = null;\n\tthis.selected = false;\n}\n\nTreeNode.prototype.add_child = function(title, graph)\n{\n\tvar tn = new TreeNode(this.tree, this, title, graph);\n\t\n\tthis.children.push(tn);\n\tthis.rebuild_dom();\n\t\n\treturn tn;\n};\n\nTreeNode.prototype.remove = function()\n{\n\tif(!this.parent_node)\n\t\treturn;\n\t\n\tvar pc = this.parent_node.children;\n\t\n\tif(this.dom)\n\t\tthis.dom.remove();\n\t\n\tpc.splice(pc.indexOf(this), 1);\n\n\tthis.graph.tree_node = null;\n};\n\nTreeNode.prototype.remove_children = function(title)\n{\n\tthis.children = [];\n};\n\nTreeNode.prototype.activate = function()\n{\n\tthis.tree.select(this);\n};\n\nTreeNode.prototype.set_title = function(title)\n{\n\tthis.title = title;\n\tthis.rebuild_dom();\n};\n\nTreeNode.prototype.rebuild_dom = function()\n{\n\tvar dom = null;\n\tvar lbl = null;\n\t\t\n\tif((this.children.length > 0 || this.parent_node === null) && this.graph)\n\t{\n\t\tdom = make('ul');\n\t\tdom.addClass('tree-sub');\n\t\t\n\t\tvar handle = $('<div class=\"tree-handle glyphicon glyphicon-chevron-' + (this.graph.open ? 'down' : 'right') + '\"></div>');\n\t\t\n\t\thandle[0].addEventListener('mousedown', function(t_node) { return function()\n\t\t{\n\t\t\tt_node.graph.open = !t_node.graph.open;\n\t\t\tt_node.rebuild_dom();\n\t\t}}(this));\n\t\t\n\t\tdom.append(handle);\n\t\t\n\t\tlbl = $('<span class=\"tree-name\">' + this.title + '</span>');\n\t\t\n\t\tdom.append(lbl);\n\t\t\n\t\tif(this.graph && this.graph.open)\n\t\t{\n\t\t\tvar children = this.children;\n\t\t\t\n\t\t\tfor(var i = 0, len = children.length; i < len; i++)\n\t\t\t{\n\t\t\t\tvar child = children[i];\n\t\t\t\t\n\t\t\t\tchild.rebuild_dom();\n\t\t\t\tdom.append(child.dom);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tdom = make('span');\n\t\tdom.addClass('tree-item');\n\t\tdom.text(this.title);\n\t\tlbl = dom;\n\t}\n\t\n\tlbl[0].addEventListener('mouseover', function(t_node) { return function()\n\t{\n\t\tt_node.tree.on_mouse_over(t_node);\n\t}}(this));\n\n\tlbl[0].addEventListener('mousedown', function(t_node) { return function()\n\t{\n\t\tt_node.tree.select(t_node);\n\t\t\n\t\tif(t_node !== t_node.tree.root && t_node.parent_node.children.length > 1)\n\t\t\tt_node.tree.drag_node = t_node;\n\t}}(this));\n\t\n\tif(this.selected)\n\t\tlbl.addClass('tree-selected');\n\t\n\tif(this.dom)\n\t\tthis.dom.replaceWith(dom);\n\t\n\tthis.dom = dom;\n\tthis.label = lbl;\n};\n\nfunction TreeView(parent, root_graph, on_activate, on_rearrange) {\n\tthis.parent = parent;\n\tthis.on_activate = on_activate;\n\tthis.on_rearrange = on_rearrange;\n\tthis.root = new TreeNode(this, null, 'Root', root_graph);\n\t\n\tthis.reset();\n\n\tif (root_graph) {\n\t\tthis.root.graph = root_graph\n\t\troot_graph.tree_node = this.root\n\t}\n\t\n\tthis.parent.append(this.root.dom);\n}\n\nTreeView.prototype.reset = function() {\n\tthis.root.remove_children();\n\n\tthis.drag_node = null;\n\tthis.drag_dom = null;\n\tthis.drag_tgt = null;\n\tthis.drag_tgt_node = null;\n\tthis.drag_indicator = null;\n\tthis.selected_node = null;\n\tthis.insert_after = false;\n\tthis.root.graph = null;\n\tthis.root.selected = false;\n\t\n\tthis.root.rebuild_dom();\n};\n\nTreeView.prototype.select = function(t_node) {\n\tif (this.selected_node) {\n\t\tthis.selected_node.label.removeClass('tree-active');\n\t\tthis.selected_node.selected = false;\n\t}\n\t\n\tvar parent = t_node;\n\tvar highest_closed = null;\n\t\n\tdo\n\t{\n\t\tif(!parent.graph.open)\n\t\t{\n\t\t\tparent.graph.open = true;\n\t\t\thighest_closed = parent;\n\t\t}\n\t\t\n\t\tparent = parent.parent_node;\n\t}\n\twhile(parent);\n\t\t\n\tif(highest_closed)\n\t\thighest_closed.rebuild_dom();\n\n\tthis.selected_node = t_node;\n\tt_node.selected = true;\n\tt_node.label.addClass('tree-active');\n};\n\nTreeView.prototype.on_mouse_up = function()\n{\n\tif (this.drag_indicator)\n\t\tthis.drag_indicator.remove();\n\t\n \tif (this.drag_dom) {\n\t\tthis.drag_dom.remove();\n\t\tthis.drag_dom = null;\n\t}\n\t\n\tif (this.drag_tgt && this.drag_indicator) {\n\t\tvar p = this.drag_node.dom.parent();\n\t\tvar ofs = p[0].tagName.toString() === 'UL' ? 2 : 0;\n\t\tvar oi = p.children().index(this.drag_node.dom) - ofs;\n\t\tvar pcn = this.drag_node.parent_node.children;\n\t\t\n\t\tthis.drag_node.dom.remove();\n\t\tthis.drag_indicator.replaceWith(this.drag_node.dom);\n\n\t\tvar ni = p.children().index(this.drag_node.dom) - ofs;\n\t\t\n\t\t// With the elements placed correctly, update the children array to match. Ie. move \n\t\t// children[oi] -> children[ni]], maintaing the original order otherwise.\n\t\tif(ni >= pcn.length)\n\t\t{\n\t\t\tvar k = ni - pcn.length;\n\t\t\t\n\t\t\twhile((k--) + 1)\n\t\t\t\tpcn.push(undefined);\n\t\t}\n\t\t\n\t\tpcn.splice(ni, 0, pcn.splice(oi, 1)[0]);\n\t\t\n\t\tif (this.on_rearrange) {\n\t\t\tvar original = this.drag_node.graph.plugin.parent_node;\n\t\t\tvar sibling = this.drag_tgt_node.graph.plugin.parent_node;\n\n\t\t\tthis.on_rearrange(this.drag_node.parent_node.graph,\n\t\t\t\toriginal,\n\t\t\t\tsibling,\n\t\t\t\tthis.insert_after);\n\t\t}\n\t}\n\t\n\tthis.insert_after = false;\n\tthis.drag_indicator = null;\n\tthis.drag_tgt = null;\n\tthis.drag_tgt_node = null;\n\tthis.drag_node = null;\n};\n\nTreeView.prototype.on_mouse_move = function(e)\n{\n\tif(!this.drag_node)\n\t\treturn;\n\t\n\tif(!this.drag_dom)\n\t{\n\t\tvar t_offs = this.drag_node.dom.offset();\n\t\tvar x_dist = e.pageX - t_offs.left;\n\t\tvar y_dist = e.pageY - t_offs.top;\n\t\tvar d = Math.sqrt(Math.pow(x_dist, 2) + Math.pow(y_dist, 2));\n\t\t\n\t\tthis.drag_dom = this.drag_node.dom.clone();\n\t\tvar is_item = this.drag_dom.hasClass('tree-item');\n\t\t\n\t\tif(is_item)\n\t\t{\n\t\t\tvar ul = make('ul');\n\t\t\t\n\t\t\tul.addClass('tree-sub tree-drag tree-drag-item');\n\t\t\tul.append(this.drag_dom);\n\t\t\t\n\t\t\tthis.drag_dom = ul;\n\t\t\t// this.drag_tgt = this.drag_node.dom;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.drag_dom.addClass('tree-drag tree-drag-sub');\n\t\t\t// this.drag_tgt = this.drag_dom;\n\t\t}\n\t\t\n\t\tthis.drag_indicator = this.drag_node.dom.clone();\n\t\tthis.drag_indicator.find('.tree-active').removeClass('tree-active').addClass('tree-dupe');\n\t\tthis.drag_indicator.removeClass('tree-active').addClass('tree-dupe');\n\t\tthis.drag_dom.fadeTo('fast', 0.75);\n\t\t$('body').append(this.drag_dom);\n\t}\n\t\n\tthis.drag_dom.css({\n\t\t'left': e.pageX + 'px',\n\t\t'top': e.pageY + 'px'\n\t});\n\t\n\tvar tgt = this.drag_tgt;\n\t\n\tif(tgt)\n\t{\n\t\tthis.drag_indicator.remove();\n\t\tthis.insert_after = e.pageY >= tgt.offset().top + 16;\n\t\t\n\t\tif(this.insert_after)\n\t\t\tthis.drag_indicator.insertAfter(tgt);\n\t\telse\n\t\t\tthis.drag_indicator.insertBefore(tgt);\n\t}\n};\n\nTreeView.prototype.on_mouse_over = function(t_node)\n{\n\tif(!this.drag_node)\n\t\treturn;\n\t\t\n\tif(this.drag_node === t_node || this.drag_node.parent_node.children.indexOf(t_node) < 0)\n\t\treturn;\n\t\n\tthis.drag_tgt = t_node.dom;\n\tthis.drag_tgt_node = t_node;\n};\n"
  },
  {
    "path": "browser/scripts/ui/pageStore.js",
    "content": "if (typeof VizorUI === 'undefined')\n\tvar VizorUI = {}\n\n/**\n * makes a store from obj\n * aim: get us through until universal ES6 Proxy support\n * writing to obj props results in events dispatched on document\n * writing to obj.prop \t\t=> ('changed:objClass', {id, key:prop, value:v})\n * writing to obj.o.prop \t=> ('changed:objClass', {id, key:o.prop, value:v})\n * writing v{} to obj.o will convert v to substore\n * overwriting obj.prop with another {} preserves this functionality\n * limitations: adding new props to obj will not create setters and/or getters\n * \t\t\t\tdeleting obj props will not emit events\n * @param obj\n * @param objClass e.g. graph,profile,etc - used to name events e.g. changed:graph\n * @param objId id/uniq of object\n */\n\nVizorUI.makeStore = function (obj, objClass, objId) {\n\n\tvar changed = function(className, id, k, v) {\n\t\t// emit changed:objClass, objId, k, v\n\t\t// e.g. changed:graph, {id: '5abc723781273', class: 'graph', key: 'stats.views', value: 4\n\t\t// e.g. changed:graph, 5abc723781273, name, \"boza\"\n\t\tvar detail = {\n\t\t\tid: id,\n\t\t\tclass: className,\n\t\t\tkey: k,\n\t\t\tvalue: v\n\t\t}\n\t\tvar e = new CustomEvent('changed:'+className, {detail:detail})\n\t\tdocument.dispatchEvent(e)\n\t}\n\n\tvar makeObj = function(o, className, id, stack) {\n\n\t\tif (o.__store__)\n\t\t\treturn o\n\n\t\tvar store = {}\n\n\t\tvar etters = function(key, className) {\n\t\t\tvar pushStack = (typeof id !== 'undefined')\n\t\t\tif (pushStack)\n\t\t\t\tstack.push(key)\n\t\t\telse {\n\t\t\t\tid = key\n\t\t\t}\n\n\t\t\tvar stackCopy = []\n\t\t\tstack.forEach(function(v){stackCopy.push(v)})\n\n\t\t\tvar propFQN = stackCopy.join(\".\")\n\t\t\tif ((typeof o[key] === 'object') && o[key] && !o[key].__store__) {\n\t\t\t\t// getters and setters for the whole object\n\t\t\t\to[key] = makeObj(o[key], className, id, stackCopy)\n\t\t\t}\n\n\t\t\t// regular getters and setters\n\t\t\tObject.defineProperty(store, key, {\n\t\t\t\tget: function () {\n\t\t\t\t\treturn o[key]\n\t\t\t\t},\n\t\t\t\tset: function (v) {\n\t\t\t\t\tvar change = (o[key] !== v)\n\n\t\t\t\t\tif (typeof v === 'object')\n\t\t\t\t\t\to[key] = makeObj(v, className, id, stackCopy)\n\t\t\t\t\telse\n\t\t\t\t\t\to[key] = v\n\n\t\t\t\t\tif (change)\n\t\t\t\t\t\tchanged(className, id, propFQN, o[key])\n\n\t\t\t\t\treturn v\n\t\t\t\t},\n\t\t\t\tenumerable: true,\n\t\t\t\tconfigurable: true\n\t\t\t})\n\n\t\t\tif (pushStack)\n\t\t\t\tstack.pop()\n\t\t}\n\n\t\tObject.keys(o).forEach(function (key) {\n\t\t\tif (['_add_','__store__'].indexOf(key) < 0)\n\t\t\t\tetters(key, className)\n\t\t})\n\n\n\t\tstore._add_ = function(key, prop) {\n\t\t\tvar _stack = stack\n\t\t\tvar _id = id\n\t\t\tstack = []\n\t\t\tid = undefined\n\t\t\to[key] = {}\n\t\t\tetters(key, className)\n\t\t\tstore[key] = prop\n\t\t\tstack = _stack\n\t\t\tid = _id\n\t\t}\n\t\tstore.__store__ = true\n\n\t\treturn store\n\t}\n\n\t// obj holds the original data for store\n\t// writing to store writes to obj, and emits an event as described\n\tvar ret = makeObj(obj, objClass, objId, [])\n\treturn ret\n}\n\n\n/**\n * turns objects in window.Vizor.pageObjects {profiles[], graphs[]} into stores that emit events when any of their properties change\n * also turns window.Vizor.pageObjects into a store\n */\nVizorUI.pageStore = function() {\n\tvar page = Vizor.pageObjects\n\tif (!page)\n\t\treturn\n\n\tVizor.pageObjects = null\n\n\t// added via iteration to ensure correct object id-s\n\tvar profiles = page.profiles\n\tpage.profiles = VizorUI.makeStore({}, 'profile')\n\tfor (var k in profiles)\n\t\tpage.profiles._add_(k, profiles[k])\n\n\tvar graphs = page.graphs\n\tpage.graphs = VizorUI.makeStore({}, 'graph')\n\tfor (var k in graphs)\n\t\tpage.graphs._add_(k, graphs[k])\n\n\tpage = VizorUI.makeStore(page, 'pageObjects')\n\n\t// convenience methods\n\tpage.getGraph = function(id) {\n\t\treturn page.graphs[id]\n\t}\n\tpage.getProfile = function(id) {\n\t\treturn page.profiles[id]\n\t}\n\tpage.getGraphOwnerProfile = function(graphId) {\n\t\tvar g = page.graphs[graphId]\n\t\tif (!g)\n\t\t\treturn console.error('graph id '+graphId +' not found on page')\n\n\t\treturn page.profiles[g._creator]\n\t}\n\tpage.deleteGraph = function(graphId) {\n\t\tvar graph = page.getGraph(graphId)\n\t\tif (!graph)\n\t\t\treturn\n\n\t\tvar graphOwner = page.getGraphOwnerProfile(graphId)\n\t\tdelete(page.graphs[graphId])\n\t\tif (graphOwner)\n\t\t\t--graphOwner.stats.projects\n\t}\n\n\tpage.addProfile = function(profile) {\n\t\tprofile = _.cloneDeep(profile)\n\t\tif (profile.id)\n\t\t\tpage.profiles._add_(profile.id, profile)\n\t\telse\n\t\t\tconsole.error('no profile.id', profile)\n\t}\n\n\tpage.addGraph = function(graph) {\t// formerly inside graphCardJS.handlebars\n\t\tif (!graph)\n\t\t\treturn console.info('addGraph but no graph')\n\n\t\tgraph = _.cloneDeep(graph)\n\n\t\tvar key = graph._id || graph.path\n\t\tif (!key)\n\t\t\treturn console.error('no key for graph', graph)\n\n\t\tif (graph._creator) {\n\t\t\tif (!page.profiles[graph._creator])\n\t\t\t\tpage.profiles._add_(graph._creator, {'_id': graph._creator})\n\t\t\tvar profile = graph.profile\n\t\t\tif (profile) {\n\t\t\t\tprofile['_id'] = graph._creator\n\t\t\t\tpage.profiles[profile._id] = profile\n\t\t\t}\n\t\t}\n\n\t\tdelete graph.profile\n\t\tpage.graphs._add_(key, graph)\n\t}\n\n\tVizor.pageObjects = page\n\n}\n\n\nif (typeof(module) !== 'undefined') {\n\tmodule.exports = {\n\t\tpageStore : VizorUI.pageStore,\n\t\tmakeStore : VizorUI.makeStore\n\t}\n} else {\n\tdocument.addEventListener('DOMContentLoaded', VizorUI.pageStore)\n}"
  },
  {
    "path": "browser/scripts/ui/pagination.js",
    "content": "/**\n * helper data preprocessor for Handlebars rendering. see views/partials/pagination.handlebars\n * @param perPage number of results on page\n * @param totalPages number of total pages\n * @param currentPage current page\n * @param totalCount number of results in total\n * @param maxPageLinks maximum number of pages to display e.g. 5  =   4, 5, [6], 7, 8\n * @constructor\n */\nvar UIPagination = function (perPage, totalPages, currentPage, totalCount, baseUrl, maxPageLinks) {\n\tthis.totalPages = totalPages\n\tthis.perPage = perPage\n\tthis.currentPage = currentPage\n\tthis.totalCount = totalCount\n\tthis.maxPageLinks = maxPageLinks || 3\n\tthis.baseUrl = baseUrl || false\n\n\tvar that = this\n\n\tif (perPage > 0) {\n\t\tthis.thisPageCount = perPage\n\t\tif (currentPage === totalPages)\n\t\t\tthis.thisPageCount = totalCount % perPage\n\t} else {\n\t\tthis.thisPageCount = 0\n\t\tthis.totalPages = 0\n\t}\n\n\tvar pages = null\t\t/* num, start, displayStart, displayEnd */\n\tObject.defineProperties(this, {\t// Safari 9.1- has no arrow functions\n\t\tpages: {\n\t\t\tget: function() {return (pages) ? pages : (pages = that.getPages())},\n\t\t\tset: function(v) {return pages = v}\t// allow resetting\n\t\t},\n\t\tdisplayPages: {\n\t\t\tget: function() {return that.getDisplayPages()}\n\t\t},\n\t\tmoreCount : {\n\t\t\tget: function() {return that.totalCount - this.thisPage.displayEnd}\n\t\t},\n\t\t// currentPage starts from 1, (pages[] is 0-based)\n\t\tprevPage : {\n\t\t\tget: function() {return (that.currentPage >= 2) ? this.pages[that.currentPage-2] : null }\n\t\t},\n\t\tnextPage : {\n\t\t\tget: function() {return (that.currentPage < this.pages.length) ? this.pages[that.currentPage] : null }\n\t\t},\n\t\tfirstPage : {\n\t\t\tget: function() {return this.pages[0] }\n\t\t},\n\t\tlastPage : {\n\t\t\tget: function() {return this.pages.slice(-1)[0] }\n\t\t},\n\t\tfirstDisplayPage : {\n\t\t\tget: function() {return this.displayPages[0] }\n\t\t},\n\t\tlastDisplayPage : {\n\t\t\tget: function() {return this.displayPages.slice(-1)[0] }\n\t\t},\n\t\tthisPage : {\n\t\t\tget: function() {return this.pages[that.currentPage-1] }\n\t\t},\n\t\tshouldDisplayFirstPageLink : {\n\t\t\tget: function() {return (this.pages.length && (this.firstDisplayPage.num - this.firstPage.num > 0)) }\n\t\t},\n\t\tshouldDisplayLastPageLink : {\n\t\t\tget: function() {return (this.pages.length && (this.lastPage.num - this.lastDisplayPage.num > 0)) }\n\t\t},\n\t\tshouldDisplayFirstPageEllipsis : {\n\t\t\tget: function() {return (this.pages.length && (this.firstDisplayPage.num - this.firstPage.num > 1)) }\n\t\t},\n\t\tshouldDisplayLastPageEllipsis : {\n\t\t\tget: function() {return (this.pages.length && (this.lastPage.num - this.lastDisplayPage.num > 1)) }\n\t\t}\n\t})\n}\n\n/**\n * create an instance from list.meta as returned by assetService\n * @param meta {totalCount, limit, offset, (page, baseUrl)}\n * @returns {UIPagination}\n */\nUIPagination.fromMeta = function(meta) {\n\tvar totalCount = meta.totalCount\n\tvar limit = meta.limit || 0\n\tvar totalPages = 0\n\tvar currentPage = meta.page || 0\n\n\tif (limit) {\n\t\ttotalPages = Math.ceil(totalCount / limit)\n\t\tif (!currentPage) { // calculate page number from offset\n\t\t\tcurrentPage = Math.floor(1 + meta.offset / limit)\n\t\t}\n\t}\n\treturn new UIPagination(limit, totalPages, currentPage, meta.totalCount, meta.baseUrl)\n}\n\nUIPagination.prototype = Object.create({})\nUIPagination.prototype.constructor = UIPagination\n\n/**\n * produces an array containing link parameters for all pages in this pagination\n * @returns {Array}\n */\nUIPagination.prototype.getPages = function() {\n\tvar ret = []\n\tvar perPage = this.perPage\n\tif (!perPage)\n\t\treturn ret\n\n\tvar totalCount = this.totalCount\n\tvar num, start, end\n\tfor (var i = 0; i < this.totalPages; i++) {\n\t\tnum = i + 1\n\t\tstart = i * perPage\n\t\tend = (i+1) * perPage\n\t\tif (totalCount && end > totalCount)\n\t\t\tend = totalCount\n\n\t\tret.push({\n\t\t\tnum : num,\n\t\t\tstart : start,\n\t\t\tdisplayStart : 1+start,\n\t\t\tdisplayEnd: end\n\t\t})\n\t}\n\treturn ret\n}\n\nUIPagination.prototype.getDisplayPages = function() {\n\tvar pages = this.pages\n\tvar max = this.maxPageLinks\n\n\tif ((max === 0) || (max >= pages.length))\n\t\treturn pages\n\n\t// centre is selected page\n\tvar current = this.currentPage - 1\n\tvar start = current\n\tvar end = current+1\n\tvar fromEnd = true\n\twhile (end - start < max) {\n\t\tif (fromEnd) {\n\t\t\tif (end < pages.length) end++\n\t\t\telse if (start > 0) start--\n\t\t} else {\n\t\t\tif (start > 0) start--\n\t\t\telse if (end < pages.length) end++\n\t\t}\n\t\tfromEnd = !fromEnd\n\t}\n\n\treturn pages.slice(start, end)\n}\n\nUIPagination.readContainer = function(el) {\n\tvar d = el.dataset\n\treturn {\n\t\tcontrol: el,\n\t\ttotalCount: parseInt(d.totalcount),\n\t\tthisPageCount: parseInt(d.thispagecount),\n\t\ttotalPages : parseInt(d.totalpages),\n\t\tperPage : parseInt(d.perpage),\n\t\tcurrentPage: parseInt(d.currentpage),\n\t\tdisplayStart: parseInt(d.displaystart),\n\t\tdisplayEnd: parseInt(d.displayend),\n\t\tbaseUrl: d.baseurl\n\t}\n}\n\n/**\n * loads href from nextLink, passing the loaded content to callback function\n * @param paginationContainer HTMLElement DOM node\n * @param cb function callback\n */\nUIPagination.bindNextLink = function(paginationContainer, cb) {\n\tif (!paginationContainer)\n\t\treturn // nothing to listen for\n\n\tvar nextLink = paginationContainer.querySelector('a.page.next')\n\tif (!(nextLink && nextLink.href))\n\t\treturn true\n\n\tif (!document.body.dataset.originalTitle)\n\t\tdocument.body.dataset.originalTitle = document.title\n\n\n\tfunction loadNext(e) {\n\t\tvar classes = paginationContainer.classList\n\t\tif (classes.contains('loading') || classes.contains('loaded') || classes.contains('error'))\n\t\t\treturn true\n\n\t\te.preventDefault()\n\t\te.stopPropagation()\n\n\t\tvar scroll = {x: window.scrollX, y: window.scrollY}\t\t// current scrollX/Y\n\t\tvar screen = {width: window.innerWidth, height: window.innerHeight}\t\t// includes scrollbars but that's OK\n\t\tvar rect = paginationContainer.getBoundingClientRect()\t// monitored pagination container\n\n\t\t// should hit link\n\t\tclasses.add('loading')\n\t\tvar url = nextLink.href\n\t\tvar nextPageNum = nextLink.dataset.num\n\n\t\t$.get(url)\n\t\t\t.success(function(response){\n\n\t\t\t\tclasses.remove('loading')\n\t\t\t\tclasses.add('loaded')\n\n\t\t\t\twindow.history.replaceState({}, document.title, url)\n\t\t\t\tvar title = document.body.dataset.originalTitle + ' (page '+nextPageNum + ')'\n\t\t\t\ttry {\n\t\t\t\t\tdocument.getElementsByTagName('title')[0].innerHTML = title.replace('<','&lt;').replace('>','&gt;').replace(' & ',' &amp; ')\n\t\t\t\t}\n\t\t\t\tcatch (e) {}\n\t\t\t\tdocument.title = title\n\n\t\t\t\tif (cb) {\n\t\t\t\t\tvar oldData = UIPagination.readContainer(paginationContainer)\n\t\t\t\t\tcb(response, paginationContainer, {scroll:scroll, viewport:screen, containerRect: rect})\n\t\t\t\t}\n\t\t\t})\n\t\t\t.fail(function(err){\n\t\t\t\tclasses.remove('loading')\n\t\t\t\tclasses.add('error')\n\t\t\t\tconsole.error(err)\n\t\t\t})\n\t}\n\n\tnextLink.addEventListener('click', loadNext)\n\tnextLink.dataset.xhrenabled = true\n\n}\n\n/**\n * handles pagination coming into view and clicks the next link automatically if its data-xhrenabled is set to true\n */\nUIPagination.listenForScroll = function(paginationContainer) {\n\n\tif (UIPagination._resetListener)\n\t\tUIPagination._resetListener()\n\n\tif (!paginationContainer)\n\t\treturn // nothing to listen for\n\n\tfunction handler(e) {\n\t\tvar nextLink = paginationContainer.querySelector('a.page.next')\n\t\tif (!(nextLink && nextLink.href))\n\t\t\treturn true\n\n\t\tvar rect = paginationContainer.getBoundingClientRect()\t// monitored pagination container\n\n\t\tif (!nextLink.dataset.xhrenabled)\t// !\n\t\t\treturn true\n\n\t\tif (rect.top < window.innerHeight) {\t// includes scrollbars but that's OK\n\n\t\t\tvar evt = new MouseEvent('click', {\n\t\t\t\tview: window,\n\t\t\t\tbubbles: true,\n\t\t\t\tcancelable: true,\n\t\t\t\tclientX: 5\n\t\t\t})\n\t\t\tnextLink.dispatchEvent(evt)\n\t\t}\n\t\treturn true\n\t}\n\n\t// throttles and calls the handler if it's time\n\tvar oldTimeStamp = 0\n\tvar _t\n\tfunction listener(e) {\n\t\t// throttle this\n\t\tclearTimeout(_t)\n\t\tif (e.timeStamp - oldTimeStamp < 200) {\n\t\t\t_t = setTimeout(function () {\n\t\t\t\thandler.call(this, e)\n\t\t\t}.bind(this), 100)\n\t\t\treturn\n\t\t}\n\t\toldTimeStamp = e.timeStamp\n\t\thandler(e)\n\t}\n\n\tvar _listener = listener.bind(this)\n\twindow.addEventListener('scroll', _listener)\n\twindow.addEventListener('resize', _listener)\n\n\tUIPagination._resetListener = function() {\n\t\twindow.removeEventListener('resize', _listener)\n\t\twindow.removeEventListener('scroll', _listener)\n\t\tUIPagination._resetListener = null\n\t}\n\n\t_listener({timeStamp: new Date().getTime()})\n\n}\n\nif ((typeof module !== 'undefined') && module.exports) {\n\tmodule.exports = UIPagination\n}"
  },
  {
    "path": "browser/scripts/ui/playerUI.js",
    "content": "var have_webgl = (function () {   // http://www.browserleaks.com/webgl#howto-detect-webgl\n    if (!window.WebGLRenderingContext) return false;\n    /* WebGL not supported*/\n    var canvas = document.createElement(\"canvas\"), names = [\"webgl\", \"experimental-webgl\", \"moz-webgl\"], gl = false;\n    for (var i in names) {\n        try {\n            gl = canvas.getContext(names[i]);\n            if (gl && typeof gl.getParameter == \"function\") { /* WebGL is enabled */\n                return names[i];\n                /* or return true; */\n            }\n        } catch (e) {\n        }\n    }\n    return false;\n    /* WebGL is supported, but disabled */\n})();\n\nvar VizorPlayerUI = function() {\n\tvar that = this\n\tthis.eventNames = {\n\t\tcontrolsDisplayed\t: 'controlsDisplayed',\n\t\tcontrolsHidden\t\t: 'controlsHidden',\n\n\t\tvrInstructionsShown : 'vrinstructionsshown',\n\t\tvrInstructionsHidden: 'vrinstructionshidden',\n\t\tloadingProgress\t\t: 'progress',\n\n\t\tplayerStateChanged\t: 'player:stateChanged',\n\t\tplayerPlaying\t\t: 'player:playing'\n    }\n\tvar events = this.eventNames\n\n\tthis.stage = 'beforeLoadingStage'\n\n\tvar qs = document.querySelector.bind(document)\n\tthis.dom = {\n\t\t'playBtn' : \t\tqs('#playButton'),\n\t\t'entervrBtn': \t\tqs('#entervr'),\n\t\t'fullscreenBtn' : \tqs('#fullscreen'),\n\t\t'editBtn':\t\t\tqs('#edit'),\n\t\t'shareBtn':\t\t\tqs('#sharebutton')\n\t}\n\n\t// jQuery\n\tthis.$body = null\n\tthis.$canvas = null\n\tthis.$stage = null\n\tthis.$wrap = null\n\tthis.$header = null\n\tthis.$controls = null\n\n\t// various state\n\tthis.fadingIn = false\n    this.headerIsVisible = true\n    this.fadingOut = false\n    this.overHeader = false\n    this.overControls = false\n    this.headerQueueFadeoutEnabled = true\n\n\tthis.fadeoutTimer = null\n\n    this.vrCameraEnabled = true\n    this.data = {}\n\n    var loadingComplete = false\n\tvar enforceStartMode = Vizor.autoplay && !siteUI.isInIframe()\n\n\tif (typeof(E2) !== 'undefined' && E2.util.isBrowser && \n\t\tE2.util.isBrowser.Carmel && E2.util.isBrowser.Carmel()) \n\t{\n\t\tenforceStartMode = true\n\t\tVizor.startMode = 3\n\t}\n\n    this.onProgress = function(pct) {\n        var progressNode = document.getElementById('progressbar')\n        if (progressNode) progressNode.value = pct\n        if (pct === 100) {\n            // sometimes we're called twice\n            if (loadingComplete)\n            \treturn\n            // loaded all assets\n            that.$body.addClass('assetsLoaded')\n            loadingComplete = true\n        }\n    }\n\n\tthis._stylePlayButton = function() {\n\t\tvar playBtn = this.dom.playBtn\n\t\tif (!playBtn) // tests\n\t\t\treturn\n\n\t\tvar playSpan = playBtn.querySelector('span')\n\t\tvar isReadyStage = this.stage === 'readyStage'\n\n\t\tif (isReadyStage) {\n\t\t\tplaySpan.innerText = 'Start'\n\t\t} else {\n\t\t\tplaySpan.innerText = 'Play'\n\t\t}\n\n\t\tplayBtn.classList.toggle('btn', isReadyStage)\n\t\tplayBtn.classList.toggle('svg', !isReadyStage)\n\n\t\tvar showButton = true\n\t\tif (this.stage === 'playingStage' || this.stage === 'loadingStage')\n\t\t\tshowButton = false\n\n\t\t$(playBtn).toggle(showButton)\n\t}\n\n\tthis.onPlayerStateChanged = function(newState) {\n\t\tvar s = E2.app.player.state\n\t\tvar $wrap = that.$wrap\n\n\t\tthat.$body\n\t\t\t.toggleClass('playing', newState === s.PLAYING)\n\t\t\t.toggleClass('paused', \tnewState === s.PAUSED)\n\t\t\t.toggleClass('stopped', newState === s.STOPPED)\n\t\t\t.toggleClass('loading', newState === s.LOADING)\n\t\t\t.toggleClass('ready',   newState === s.READY)\n\n\t\tthat.setStageFromPlayerState(newState)\n\t\tthat._stylePlayButton()\n\n\t\tif (newState === s.PLAYING) {\n\t\t\tE2.core.webVRAdapter.resizeToTarget()\n\n\t\t\tthat.queueHeaderFadeOut()\n\n\t\t\tif (Vizor.startMode && enforceStartMode) {\n\t\t\t\tenforceStartMode = false\n\t\t\t\tE2.core.webVRAdapter.setMode(Vizor.startMode)\n\t\t\t}\n\n\t\t\tvar bgImage = $wrap[0].style.backgroundImage\n\t\t\tif (bgImage) {\n\t\t\t\t$wrap.attr('data-bgimage', bgImage)\n\t\t\t\t$wrap[0].style.backgroundImage = ''\n\t\t\t}\n\t\t} else {\n\t\t\tif (!Vizor.noHeader)\n\t\t\t\tthat.headerFadeIn()\n\n\t\t\tif (newState !== s.PAUSED) {\n\t\t\t\tvar bgImage = $wrap[0].style.backgroundImage\n\t\t\t\tvar storedImage = $wrap.attr('data-bgimage')\n\t\t\t\tif (storedImage && !bgImage) {\n\t\t\t\t\t$wrap[0].style.backgroundImage = storedImage\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tthis.onPlayerLoaded = function() {\n\t\tvar $canvas = that.$canvas,\n\t\t\t$stage = that.$stage,\n\t\t\t$body = that.$body,\n\t\t\t$wrap = that.$wrap\n\n\t\tE2.core.on(events.playerStateChanged, that.onPlayerStateChanged)\n\n\t\tE2.app.isVRCameraActive = function () {\n\t\t\tif (siteUI && siteUI.lastModalIsOpen) return false\n\t\t\treturn that.vrCameraEnabled && !(that.overHeader || that.overControls)\n\t\t}\n\n\t\tE2.app.calculateCanvasArea = function () {\n\t\t\treturn {\n\t\t\t\twidth: \t$stage.innerWidth(),\n\t\t\t\theight: $stage.innerHeight()\n\t\t\t}\n\t\t}\n\n\t\tthat.enableVRcamera()\n\t\n\t\tthat._stylePlayButton()\n\n\t\t// allow 360 to redirect progressbar entirely\n\t\tE2.core.on(events.loadingProgress, \n\t\t\t(Vizor.onProgress) ? Vizor.onProgress : that.onProgress)\n\n\t\tfunction completeLoading() {\n            if (!that.controlsBound) {\n                that.bindHeaderBehaviour()\n                that.bindButtons()\n                that.controlsBound = true\n            }\n        }\n\n\t\tE2.core.on('assetsLoaded', completeLoading)\n\n\t\t// provisions for chrome/android\n\t\t$(window)\n\t\t\t.on(events.vrInstructionsShown, function () {\n\t\t\t\t$canvas.hide()\n\t\t\t})\n\t\t\t.on(events.vrInstructionsHidden, function () {\n\t\t\t\t$canvas.show()\n\t\t\t})\n\n\t\tif (siteUI.hasOrientationChange && VizorUI.isMobile.any()) {\n\t\t\tfunction allowExtraHeightOnLandscape() {\n\t\t\t\tif (siteUI.isInIframe())\n\t\t\t\t\treturn true\n\t\t\t\t\n\t\t\t\t// provisions for mobile\n\t\t\t\tsetTimeout(function () {\n\t\t\t\t\tvar h = window.innerHeight\n\t\t\t\t\tif (siteUI.isPortraitLike()) {\n\t\t\t\t\t\t$body.css({ height: h + 'px' })\n\t\t\t\t\t\t$wrap.css({ bottom: '0' })\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// allow dragging the body to hide the top bar\n\t\t\t\t\t\t$body.css({ height: (1.1*h) + 'px' })\n\t\t\t\t\t\t$wrap.css({ bottom: (0.1*h) + 'px' })\n\t\t\t\t\t}\n\t\t\t\t}, 750)\n\t\t\t}\n\n\t\t\t$(window).on('orientationchange', allowExtraHeightOnLandscape)\n\n\t\t\tallowExtraHeightOnLandscape()\n\t\t}\n\t}\n\n\tthis.bindButtons = function() {\n\t\tfunction enterFullscreen(e) {\n\t\t\tE2.track({ event: 'enterFullscreen' })\n\t\t\tE2.core.webVRAdapter.enterFullscreen()\n            siteUI.tagBodyClass()\n        }\n\n        function enterVR(e) {\n\t\t\tE2.track({ event: 'enterVR' })\n\n            if (siteUI.isDeviceDesktop() && !E2.core.webVRAdapter.isVRCompatible()) {\n                // display \"view in VR\" sign\n                return that.displayVRPlayerUrl(that.data.shareURL)\n            }\n\n\t\t\tE2.core.webVRAdapter.enterVR()\n            siteUI.tagBodyClass()\n        }\n\n\t\tfunction share(e) {\n\t\t\te.preventDefault()\n\t\t\tvar data = {\n\t\t\t\torigin\t: Vizor.origin,\n\t\t\t\tembedOrigin: Vizor.embedOrigin,\n\t\t\t\tshareURL : Vizor.shareURL,\n\t\t\t\tembedSrc : Vizor.embedSrc\n\t\t\t}\n\t\t\tthat.suspendVRcamera()\n\t\t\tthat.headerFadeOut(200)\n\t\t\tVizorUI.graphShareDialog(data, {onEscape: that.enableVRcamera})\n\t\t\t\n\t\t\treturn false\n\t\t}\n\n\t\tfunction edit(e) {\n\t\t\tvar editUrl = '/' +\n\t\t\t\twindow.location.href\n\t\t\t\t.split('?')[0]\n\t\t\t\t.split('/')\n\t\t\t\t.join(' ')\n\t\t\t\t.trim()\n\t\t\t\t.split(' ')\n\t\t\t\t.slice(-2)\n\t\t\t\t.concat('edit')\n\t\t\t\t.join('/')\n\n\t\t\twindow.location = editUrl\n\t\t}\n\n\t\t$('#fullscreen, #entervr, #sharebutton, #edit').off('click')\n\t\t$('#edit').click(edit)\n        $('#fullscreen').on('click', enterFullscreen)\n        $('#entervr').on('click', enterVR)\n\t\t$('#sharebutton').on('click', share)\n\n\t\tvar firstMouseDown = true\n\n\t\tthat.$canvas.on('mousedown touchstart', function() {\n\t\t\tif (firstMouseDown) {\n\t\t\t\tfirstMouseDown = false\n\t\t\t\tE2.track({ event: 'mouseDownInPlayer' })\n\t\t\t}\n\t\t})\n\t}\n\n\tthis.bindHeaderBehaviour = function() {\n\t\tvar $body = that.$body,\n\t\t\t$controls = that.$controls,\n\t\t\t$header = that.$header\n\n\t\t// display the header temporarily, and for longer if over header\n\t\tfunction headerHandler(e) {\n\t\t\tif (['INPUT','TEXTAREA','BUTTON', 'SVG', 'USE'].indexOf(e.target.tagName) > -1 ) return true\n\t\t\tif (siteUI.isInVR() || siteUI.isDragging) return true\n\t\t\tif (siteUI.isModalOpen()) return true\n\t\t\tif (window.Vizor && (window.Vizor.disableHeaderClick || window.Vizor.noHeader )) return true\n\n\t\t\tif (e.defaultPrevented)\n\t\t\t\treturn true\n\n\t\t\tif (!that.headerIsVisible) {\n\t\t\t\tif (e.touches) {\n\t\t\t\t\te.stopPropagation()\n\t\t\t\t\te.preventDefault()\n\t\t\t\t}\n\t\t\t\tthat.headerFadeIn()\n\t\t\t\tthat.queueHeaderFadeOut()\n\t\t\t} else {\n\t\t\t\tthat.queueHeaderFadeOut(100, true)  // give any button some time to react\n\t\t\t}\n\n\t\t\treturn true\n\t\t}\n\n\t\tdocument.body.addEventListener('touchend', headerHandler)\n\t\tdocument.body.addEventListener('mouseup', headerHandler)\n\n\t\t// track mouse hover on header\n\t\t$controls\n\t\t\t.on('mouseenter', function () {\n\t\t\t\tthat.overControls = true\n\t\t\t\tif (!siteUI.isDragging) {\n\t\t\t\t\tthat.clearFadeoutTimer()\n\t\t\t\t\tthat.headerFadeIn()\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('mouseleave', function () {\n\t\t\t\tthat.overControls = false\n\t\t\t\tthat.queueHeaderFadeOut()\n\t\t\t})\n\n\t\t$(window)\n\t\t\t.on(events.vrInstructionsShown, function () {\n\t\t\t\t$header.hide()\n\t\t\t\tthat.fadingIn = that.fadingOut = false\n\t\t\t})\n\t\t\t.on(events.vrInstructionsHidden, function () {\n\t\t\t\tthat.fadingIn = that.fadingOut = false\n\t\t\t\tif (siteUI.isPortraitLike()) {\n\t\t\t\t\tthat.headerFadeIn()\n\t\t\t\t\tthat.queueHeaderFadeOut()\n\t\t\t\t}\n\t\t\t})\n\n\t\tfunction onVRModeChanged(mode) {\n\t\t\tsiteUI.tagBodyClass()\n\t\t\tif (mode !== 3) {\n\t\t\t\tthat.overHeader = false\n\t\t\t\tthat.overControls = false\n\t\t\t\tthat.fadingOut = false\n\t\t\t\tthat.fadingIn = false\n\t\t\t}\n\t\t\tvar modes = E2.core.webVRAdapter.modes\n\t\t\tswitch (mode) {\n\t\t\t\tcase modes.VR:\n\t\t\t\t\tif (that.headerIsVisible)\n\t\t\t\t\t\tthat.headerFadeOut(10)\n\t\t\t\t\tbreak\n\t\t\t\tcase modes.MAGIC_WINDOW:\n\t\t\t\t\tif (that.headerIsVisible)\n\t\t\t\t\t\tthat.headerFadeOut()\n\t\t\t\t\tbreak\n\t\t\t\tcase modes.NORMAL:\n\t\t\t\t\tthat.headerFadeIn()\n\t\t\t\t\tthat.queueHeaderFadeOut()\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\tvar w = E2.core.webVRAdapter\n\t\tw.on(w.events.modeChanged, onVRModeChanged)\n\n\t\tsetTimeout(function () {\n\t\t\tif (VizorUI.isMobile.any() && !siteUI.isPortraitLike())\n\t\t\t\tthat.headerFadeOut()\n\t\t\telse\n\t\t\t\tthat.queueHeaderFadeOut()\n\t\t}, 300)\n\t}\n\n    this.init = function () {\n\t\tvar that = this\n\t\tvar events = this.eventNames\n\n\t\tif (!window.WebVRConfig)\n\t\t\twindow.WebVRConfig = {}\n\t\t\n\t\tthis.controlsBound = false\n\t\tthis.$body = $(document.body)\n\t\tthis.$canvas = $('#webgl-canvas')\n\t\tthis.$stage = $('#playingStage')\n\t\tthis.$wrap = $('#playerWrap')\n\t\tthis.$header = $('#topbar')\n\t\tthis.$controls = this.$header.find('div.controls').first()\n\n\t\tvar $body = this.$body,\n\t\t\t$canvas = this.$canvas,\n\t\t\t$header = this.$header\n\n\t\tsiteUI.disableForceTouch()\n\t\tVizorUI.replaceSVGButtons($header)\n\n\t\t$(window).on('unload', function () {})    // fix iOS frame js issues\n\n\t\tif (Vizor.isEmbedded && (!siteUI.isDeviceDesktop()) && !siteUI.isInIframe()) {\n\t\t\t$('button#fullscreen').hide()\n\t\t}\n\n        $('#playButton').on('click', that.onPlayButtonClicked.bind(that))\n\n        if (Vizor.autoplay)\n            $body.addClass('autoplay')\n        else\n            $body.addClass('paused')\n\n    \tthis.headerIsVisible = !Vizor.noHeader\n\n        if (!Vizor.noHeader)\n\t        this.headerFadeIn()\n    }\n}\n\n// can be overridden (threesixty.js)\nVizorPlayerUI.headerDefaultFadeoutTimeMs = 2500\n\nVizorPlayerUI.prototype.displayVRPlayerUrl = function() {\n\tvar url = (window.Vizor && Vizor.shareURL) ? Vizor.shareURL : window.location.href\n\tvar niceurl = url.replace(/^(http)s?:\\/\\//i, '')\n\tthis.headerFadeOut()\n\treturn VizorUI.modalOpen(\"<a href='\" + url + \"'>\" + niceurl + \"</a>\", 'View in VR on your phone', 'viewinvr')\n}\n\nVizorPlayerUI.prototype.onPlayButtonClicked = function() {\n\tvar that = this\n\n\tswitch(this.stage) {\n\t\tcase 'beforeLoadingStage':\n\t\t\twindow.playVizorFile()\n\t\t\t.catch(function(err) {\n\t\t\t\tconsole.error(err.stack)\n\t\t\t\tvar $err = that.selectStage('errorStage')\n\t\t\t\t$err.html(err)\n\t\t\t})\n\t\t\tbreak;\n\n\t\tcase 'readyStage':\n\t\t\tE2.app.player.play()\n\t\t\tbreak;\n\t}\n}\n\nVizorPlayerUI.prototype.setStageFromPlayerState = function(playerState) {\n\tvar newStage = 'errorStage'\n\tvar state = E2.app.player.state\n\n\tswitch(playerState) {\n\t\tcase state.READY:\n\t\t\tnewStage = 'readyStage'\n\t\t\tbreak;\n\t\tcase state.PLAYING:\n\t\t\tnewStage = 'playingStage'\n\t\t\tE2.track({\n\t\t\t\tevent: 'playerPlaying'\n\t\t\t})\n\t\t\tbreak;\n\t\tcase state.PAUSED:\n\t\tcase state.STOPPED:\n\t\t\tnewStage = 'readyStage'\n\t\t\tbreak;\n\t\tcase state.LOADING:\n\t\t\tnewStage = 'loadingStage'\n\t\t\tbreak;\n\t}\n\n\tthis.selectStage(newStage)\n}\n\nVizorPlayerUI.prototype.selectStage = function(stageName) {\n\tif (stageName === this.stage)\n\t\treturn;\n\n\tvar $body = this.$body\n\n\tthis.stage = stageName\n\n\tvar wrap = $('#playerWrap')\n\twrap\n\t\t.find('div.stage')\n\t\t.removeClass('front')\n\n\twrap\n\t\t.find('#' + stageName)\n\t\t.addClass('front')\n\n\tswitch (stageName) {\n\t\tcase 'readyStage':\n\t\t\t$body.addClass('paused')\n\t\t\tbreak;\n\t\tcase 'playingStage':\n\t\t\t$body.removeClass('paused')\n\t\t\t$body.addClass('playing')\n\t\t\tbreak;\n\t}\n}\n\nVizorPlayerUI.prototype.suspendVRcamera = function() {\n\tthis.vrCameraEnabled = false\n}\n\nVizorPlayerUI.prototype.enableVRcamera = function() {\n\tvar that = this\n\tthis.vrCameraEnabled = true\n\n\tvar canMoveCamera = function(e){\n\t\tvar isKeyboard = (e instanceof KeyboardEvent) && (e.target === document.body)\n\t\tvar isCanvas = (!isKeyboard) && E2.util.isCanvasInFocus(e)\n\t\treturn siteUI.isFullScreen() || that.vrCameraEnabled && (isKeyboard || isCanvas)\n\t}\n\tWebVRConfig.canInitiateCameraMove = canMoveCamera\n\tE2.app.canInitiateCameraMove = canMoveCamera\n}\n\nVizorPlayerUI.prototype.headerDisableAutoFadeout = function() {\n\tthis.clearFadeoutTimer()\n\tthis.headerQueueFadeoutEnabled = false\n\tthis.headerFadeIn()\n}\n\nVizorPlayerUI.prototype.headerEnableAutoFadeout = function() {\n\tthis.headerQueueFadeoutEnabled = true\n}\n\nVizorPlayerUI.prototype.clearFadeoutTimer = function () {\n\tclearTimeout(this.fadeoutTimer)\n\tthis.fadeoutTimer = null\n}\n\nVizorPlayerUI.prototype.queueHeaderFadeOut = function(timeoutMs, forceIfAutoDisabled) {\n\tif (E2.app.player.current_state !== E2.app.player.state.PLAYING) return true\n\tif (!this.headerQueueFadeoutEnabled  &&  !forceIfAutoDisabled) return true\n\tif (!this.headerIsVisible) return\n\tif (siteUI.isInVR()) {\n\t\tthis.$body.removeClass('withPlayerControls')\n\t\tthis.$header.hide()\n\t\tthis.headerIsVisible = false\n\t}\n\tif (this.fadeoutTimer) clearTimeout(this.fadeoutTimer)\n\tthis.fadeoutTimer = setTimeout(this.headerFadeOut.bind(this), timeoutMs || VizorPlayerUI.headerDefaultFadeoutTimeMs)\n\treturn true\n}\n\nVizorPlayerUI.prototype.headerFadeOut = function (duration) {\n\tduration = duration || 500\n\tif (this.fadingOut || !this.headerIsVisible) return\n\tif (siteUI.isInVR()) {\n\t\tthis.$header.hide()\n\t\treturn\n\t}\n\tvar that = this\n\tthis.fadingOut = true\n\tthis.$body.removeClass('withPlayerControls')\n\tthis.$header.fadeOut(duration, function () {\n\t\tthat.fadingOut = false\n\t\tthat.headerIsVisible = false\n\t\tthat.overControls = false\n\t\tthat.overHeader = false\n\t})\n\treturn true\n}\n\nVizorPlayerUI.prototype.headerFadeIn = function () {\n\tif (this.fadingIn)\n\t\treturn\n\n\tthis.fadingIn = true\n\tthis.clearFadeoutTimer()\n\n\tvar that = this\n\tthis.headerIsVisible = true\n\tthis.$header.fadeIn(200, function () {\n\t\tthat.fadingIn = false\n\t\tthat.$body.addClass('withPlayerControls')\n\t})\n\treturn true\n}\n\nvar playerUI\n$(window).on('vizorLoaded', function() {\n\tplayerUI = new VizorPlayerUI()\n\n\tif (have_webgl) {\n\t\tplayerUI.init()\n\t\tplayerUI.onPlayerLoaded()\n\t\t$(window).trigger('playerUiReady')\n\t} else {\n\t\tvar $err = playerUI.selectStage('errorStage')\n\t\t$err.html(E2.views.partials.noWebGL({embed: siteUI.isEmbedded}))\n\t}\n})\n\nif (typeof(module) !== 'undefined') {\n\tmodule.exports = VizorPlayerUI\n}\n"
  },
  {
    "path": "browser/scripts/ui/tabbed.js",
    "content": "if (typeof uiEvent === 'undefined')\n\tuiEvent = {}\n\nuiEvent.tabbedChanged = 'tabbed:changedActive'\n\nif (typeof VizorUI === 'undefined')\n\tVizorUI = {}\n\n/**\n * click to toggle visible section in e.g. a div.\n * tabbed.less has the automatic css, setup for div.tabbed + section \n * specify data-activetab=\"(targetId)\" to switch to that tab upon init\n * add class tab-flex to toggle visible tab to display:flex instead of display:block\n * access tabbed element via document.getElementById('...')._tabbed\n * @example\n * <div class=\"tabbed\" data-activetab=\"tab2\">\n *     <nav><a href=\"#tab1\">1</a>\n *     \t\t<a href=\"#tab2\">2</a></nav>\n *     <section id=\"tab1\">...</section>\n *     <section id=\"tab2\">...</section>\n * </div>\n * @param containerEl HTMLElement\n */\nVizorUI.makeTabbed = function(containerEl) {\n\n\tif (containerEl._tabbed)\n\t\tconsole.warn('container tabs already setup', containerEl)\n\n\tvar nav \t= containerEl.querySelector('nav')\n\tvar links \t= nav.querySelectorAll('a[href^=\"#\"]')\n\tvar contentSelector = Array.prototype.map.call(links, function(link){\n\t \treturn 'section' + link.getAttribute('href')\n\t})\n\tvar contents = containerEl.querySelectorAll(contentSelector.join(','))\n\n\tvar clearActive = function(el){\n\t\tdelete el.dataset['active']\n\t}\n\n\tvar activetab = containerEl.dataset['activetab']\n\tdelete containerEl.dataset['activetab']\n\n\t// by now we have links + contents(sections)\n\tcontainerEl._tabbed = {\n\t\tget active() {\n\t\t\treturn containerEl.dataset['activetab']\n\t\t},\n\t\tset active(contentId) {\t// e.g .active='mytab' (from <a href=\"#mytab\">)\n\t\t\tif (contentId === this.active)\n\t\t\t\treturn contentId\n\n\t\t\tvar content = containerEl.querySelector('#'+contentId)\n\t\t\tif (content) {\n\t\t\t\tvar link = nav.querySelector('a[href^=\"#'+contentId+'\"]')\n\t\t\t\tArray.prototype.forEach.call(links, clearActive)\n\t\t\t\tlink.dataset['active'] = true\n\n\t\t\t\tArray.prototype.forEach.call(contents, clearActive)\n\t\t\t\tcontent.dataset['active'] = true\n\n\t\t\t\tcontainerEl.dataset['activetab'] = contentId\n\t\t\t\tcontainerEl.dispatchEvent(new CustomEvent(uiEvent.tabbedChanged, {\n\t\t\t\t\tdetail:{\n\t\t\t\t\t\tid: contentId,\n\t\t\t\t\t\ttab: content,\n\t\t\t\t\t\ttriggeredBy: link\n\t\t\t\t\t}\n\t\t\t\t}))\n\t\t\t} else {\n\t\t\t\tconsole.warn('could not find contentId #'+contentId)\n\t\t\t}\n\t\t\treturn this.active\n\t\t}\n\t}\n\n\tvar attachLink = function(link) {\n\t\tif (link._tabbed)\n\t\t\tlink.removeEventListener('click', link._tabbed._handler)\n\n\t\tvar handler = function(e) {\n\t\t\te.preventDefault()\n\t\t\tvar href = this.getAttribute('href').split('#')[1]\n\t\t\tcontainerEl._tabbed.active = href\n\t\t\treturn true\n\t\t}\n\t\tlink._tabbed = {\n\t\t\t_handler : handler\n\t\t}\n\t\tlink.addEventListener('click', handler)\n\t}\n\n\tArray.prototype.forEach.call(links, attachLink)\n\n\t// init\n\tcontainerEl.classList.add('tabbed')\n\tcontainerEl._tabbed.active = activetab\n}"
  },
  {
    "path": "browser/scripts/ui/ui-cards.js",
    "content": "if (typeof VizorUI === 'undefined')\n\tvar VizorUI = {}\n\n\nVizorUI.actionGraphShare = function(e) {\n\tvar url = e.detail.url\n\tvar origin = window.location.origin\n\tvar data = {\n\t\torigin: origin,\n\t\tshareURL : origin + url,\n\t\tembedSrc : origin + \"/embed\" + url\n\t}\n\treturn VizorUI.graphShareDialog(data, {title: \"Share\"})\n}\n\nVizorUI.actionGraphDelete = function(e) {\n\tif (!(e && e.detail))\n\t\treturn console.error('no event detail')\n\n\tvar id = e.detail.id\n\tvar data = {\n\t\t_id : id,\n\t\tpath: e.detail.url\n\t}\n\n\treturn VizorUI.requireConfirm('Are you sure you want to delete this?')\n\t\t.then(function(){\n\t\t\tvar xhr = $.ajax({\n\t\t\t\turl: e.detail.url,\n\t\t\t\ttype: 'DELETE',\n\t\t\t\tdata: data\n\t\t\t}).done(\n\t\t\t\tfunction(response){\n\t\t\t\t\tvar cards = VizorUI.findAssetCards(id)\n\t\t\t\t\tif (!cards.length) return\n\n\t\t\t\t\tvar title = 'Project'\n\n\t\t\t\t\tvar pageObjects = window.Vizor.pageObjects\n\t\t\t\t\tif (pageObjects && pageObjects.deleteGraph) {\n\t\t\t\t\t\tvar scene = pageObjects.getGraph(id)\n\t\t\t\t\t\ttitle = '\"' + scene.prettyName + '\"'\n\t\t\t\t\t\tpageObjects.deleteGraph(id)\n\t\t\t\t\t}\n\n\t\t\t\t\tArray.prototype.forEach.call(cards, function(/* HTMLElement */ card, ix){\n\t\t\t\t\t\tcard.parentNode.removeChild(card)\n\t\t\t\t\t})\n\n\t\t\t\t\tVizorUI.notifyBySite(title + \" was deleted\")\n\t\t\t\t})\n\t\t\t\t.fail(function(response){\n\t\t\t\t\tconsole.error(response)\n\t\t\t\t\talert('failed to delete ' + id)\n\t\t\t\t})\n\t\t\treturn xhr\n\t\t}).catch(function(ex) {\t// xhr\n\t\t\tif (ex)\n\t\t\t\tconsole.error(ex)\n\t\t})\n}\n\nVizorUI.actionGraphTogglePrivate = function(e) {\n\tif (!(e && e.detail))\n\t\t\t\treturn console.error('no event detail')\n\t// find card\n\tvar graph = Vizor.pageObjects.getGraph(e.detail.id)\n\tif (!graph)\n\t\treturn void console.error('could not find card ' + e.detail.id)\n\n\tvar data = {\n\t\t'private': !graph.private\n\t}\n\tvar checkbox = e.detail.triggeredByEl\n\treturn $.post(graph.path, data)\n\t\t.done(function(response){\n\t\t\tvar data = response.data\n\t\t\t// change the label too\n\t\t\tcheckbox.parentElement.dataset.content = (data.private) ? \"Make public\" : \"Make private\"\n\t\t\t// repaint|reposition card\n\t\t\tgraph.private = data.private\n\t\t})\n\t\t.fail(function(ex){\n\t\t\t// restore the toggle if the call failed\n\t\t\tvar message = 'could not make \"' + graph.prettyName + '\" ' + (graph.private ? 'public' : 'private')\n\t\t\tVizorUI.growl(message)\n\t\t\tcheckbox.checked = graph.private\n\t\t\tconsole.error(ex)\n\t\t})\n}\n\nVizorUI.findAssetCards = function(id) {\n\treturn document.querySelectorAll(\"article.card[data-objectid='\"+id+\"']\")\n}\n\nVizorUI.findProfileCards = function(id) {\n\treturn document.querySelectorAll(\"div.user-profile[data-objectid='\"+id+\"']\")\n}\n\n// only bound if device is touch-capable\nVizorUI.touchCardOverlay = function(e) {\n\t/* @var this HTMLElement div */\n\tvar el = e.target\n\tvar that = this\n\t// if focussed but the click is on something inside, then let it through\n\tif (this.classList.contains('focus')) {\n\t\tif ((el.tagName !== 'DIV') || !el.classList.contains('overlay')) {\n\t\t\treturn true\n\t\t}\n\t} else {\n\t\t// stop this click occasionally going to child elements on mobile\n\t\te.stopPropagation()\n\t\te.preventDefault()\n\t}\n\n\tvar focussed = document.querySelectorAll('article.card div.overlay.focus')\n\tArray.prototype.forEach.call(focussed, function(overlay){\n\t\tif (overlay !== that)\n\t\t\toverlay.classList.remove('focus')\n\t})\n\tthis.classList.toggle('focus')\n}"
  },
  {
    "path": "browser/scripts/ui/ui-helpscreen.js",
    "content": "if (typeof VizorUI === 'undefined')\n\tvar VizorUI = {}\n\nVizorUI.showHelpScreen = function(activeTab) {\n\n\treturn new Promise(function(resolve, reject){\n\n\t\tvar selectedGraph\n\n\t\tvar data = {\n\t\t\tactiveTab: activeTab || 'helpLinks',\n\t\t\trecent: [],\n\t\t\texamples: [],\n\t\t\ttemplates: []\n\t\t}\n\n\t\tvar html = E2.views.patch_editor.helpscreen(data)\n\t\tvar modal = VizorUI.modalOpen(html, null, /* className= */ 'welcome helpscreen')\n\t\tmodal[0].id='helpscreen'\n\t\tVizorUI.replaceSVGButtons(modal)\n\n\t\tvar helpContainer = modal[0].querySelector('#helpContainer')\n\t\tVizorUI.makeTabbed(helpContainer)\n\n\t\t$('.graph.card', modal)\n\t\t\t.each(function() {\n\t\t\t\tVizorUI.setupAssetCard($(this))\n\t\t\t})\n\n\t\tvar chooseHandler = function(e){\n\t\t\tselectedGraph = \"/data/graph\" + e.detail.path + \".json\"\n\t\t\tmodal.modal('hide')\n\t\t\treturn false\n\t\t}\n\t\tdocument.addEventListener('graph.choose', chooseHandler)\n\n\t\tmodal.on('hide.bs.modal', function(){\n\t\t\tdocument.removeEventListener('graph.choose', chooseHandler)\n\t\t\tresolve(selectedGraph)\n\t\t})\n\n\t\tvar loaded = {}\n\n\t\tfunction loadExamples(domEl) {\n\t\t\tif (loaded.examples)\n\t\t\t\treturn\n\t\t\tvar url = '/examples'\n\t\t\tdomEl.classList.add('loading')\n\t\t\t$.get(url)\n\t\t\t\t.success(function(response){\n\t\t\t\t\tdomEl.classList.remove('loading')\n\t\t\t\t\tloaded.examples = true\n\t\t\t\t\tvar renderFlags = {\n\t\t\t\t\t\twithActionEdit: false,\n\t\t\t\t\t\twithActionView: false,\n\t\t\t\t\t\twithActionChoose: true,\n\t\t\t\t\t\twithLinks: false,\n\t\t\t\t\t\twithJSON: false\n\t\t\t\t\t}\n\t\t\t\t\tvar html=[]\n\t\t\t\t\tvar partial = E2.views.partials.assets.graphCard\n\t\t\t\t\tresponse.data.graphs.list.forEach(function(entry){\n\t\t\t\t\t\thtml.push(partial(_.assign(entry, renderFlags)))\n\t\t\t\t\t})\n\t\t\t\t\tdomEl.innerHTML = html.join(\"\\n\")\n\t\t\t\t\t$('.graph.card', domEl)\n\t\t\t\t\t\t.each(function() {\n\t\t\t\t\t\t\tVizorUI.setupAssetCard($(this))\n\t\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t.fail(function(){\n\t\t\t\t\tdomEl.classList.remove('loading')\n\t\t\t\t})\n\t\t}\n\n\t\thelpContainer.addEventListener(uiEvent.tabbedChanged, function(e){\n\t\t\tvar tabId = e.detail.id\n\t\t\tswitch (tabId) {\n\t\t\t\tcase 'helpExamples':\n\t\t\t\t\tloadExamples(e.detail.tab)\n\t\t\t}\n\t\t})\n\t})\n}"
  },
  {
    "path": "browser/scripts/ui/uiAbstractProperties.js",
    "content": "/**\n * exposes in UI a set of properties belonging to the selected object or node\n * these are wired via get/set proxies\n */\nvar UIAbstractProperties = function UIAbstractProperties(domElement) {\n\tEventEmitter.apply(this, arguments)\n\tvar that = this\n\n\tthis.attached = false\n\tthis.updateQueued = false\n\tthis.detachQueue = []\n\n\tthis.dom = {\n\t\tcontainer: null\t\t// typically $(domElement)\n\t}\n\n\t// holds references to any custom UI control objects, controlling this.adapter via dom events\n\tthis.controls = {}\n\n\t// collects exposed properties. set at render-time\n\tthis.adapter = null\n\n\tObject.defineProperty(this, 'selectedEditorObjectMeshPlugin', {\n\t\tget: function() {\n\t\t\treturn E2.app.worldEditor.getSelectedObjectPlugin()\n\t\t}\n\t})\n\n\t// one graph node or nothing\n\tObject.defineProperty(this, 'selectedGraphNode', {\n\t\tget: function() {\n\t\t\tvar sel = E2.ui.state.selectedObjects\n\t\t\treturn (sel &&  sel.length === 1  && sel[0]) ? sel[0] : null\n\t\t}\n\t})\n\n\tObject.defineProperty(this, 'selectedIsCamera', {\n\t\tget: function() {\n\t\t\tvar sel = this.selectedEditorObjectMeshPlugin\n\t\t\treturn sel && (sel.id === 'three_vr_camera')\n\t\t}\n\t})\n\n\t// convenience methods\n\tObject.defineProperty(this, 'isValidObjectSelection', {\n\t\tget: function() {\n\t\t\treturn !!this.selectedEditorObjectMeshPlugin\n\t\t}\n\t})\n\n\tObject.defineProperty(this, 'isValidNodeSelection', {\n\t\tget: function() {\n\t\t\treturn !!this.selectedGraphNode\n\t\t}\n\t})\n\n\tObject.defineProperty(this, 'isInBuildMode', {\n\t\tget: function() {\n\t\t\treturn E2.ui.isInBuildMode()\n\t\t}\n\t})\n\t\n\tE2.ui.state.on('changed:mode', this.render.bind(this))\n\tE2.ui.on('undo', this.onUndo.bind(this))\n\tE2.ui.on('redo', this.onRedo.bind(this))\n}\nUIAbstractProperties.prototype = Object.create(EventEmitter.prototype)\nUIAbstractProperties.prototype.constructor = UIAbstractProperties\n\nUIAbstractProperties.prototype.onUndo = function() {\n\tthis.render()\n}\nUIAbstractProperties.prototype.onRedo = UIAbstractProperties.prototype.onUndo\n\n// sometimes we need to wait the graph to complete a cycle so we request a call on next frame\nUIAbstractProperties.prototype.queueUpdate = function() {\n\tvar that = this\n\n\tif (this.updateQueued)\n\t\treturn\n\n\tthis.updateQueued = true\n\n\tsetTimeout(function() {\n\t\tthat.updateQueued = false\n\n\t\tif (that.attached)\n\t\t\tthat.update()\n\t\telse\n\t\t\tconsole.error('queueUpdate() not attached?')\n\t}, 0)\n}\n\n// resets panel, clearing container, refreshing adapter, and controls, and rerendering template\nUIAbstractProperties.prototype.render = function() {\n\tthis._detach()\n\tvar canRender = this.isValidNodeSelection || this.isValidObjectSelection\n\tif (canRender) {\n\t\tthis.adapter = this.getAdapter()\n\t\tthis.controls = this.getControls()\n\t\tvar props = this.getTemplateData()\t// formatted etc\n\t} else {\n\t\tvar props = {}\n\t\tthis.adapter = {}\n\t\tthis.controls = {}\n\t}\n\n\tthis.dom.container.empty()\n\tthis.dom.container.html(this.template({\n\t\tadapter : this.adapter,\n\t\tcontrols: this.controls,\n\t\tproperties: props\n\t}))\n\n\tVizorUI.replaceSVGButtons(this.dom.container)\n\n\tthis._attach()\n\tthis.emit('rendered')\n\n\tthis.update()\n\n\treturn this\n}\n\nUIAbstractProperties.prototype._detach = function() {\n\n\t$('*', this.dom).off('.uiProperties')\n\n\tif (this.detachQueue && this.detachQueue.length) {\n\t\tvar removeHandler\n\t\twhile (removeHandler = this.detachQueue.pop()) {\n\t\t\tremoveHandler()\n\t\t}\n\t}\n\n\tthis.onDetach()\n\n\tthis.emit('detached')\n\tthis.attached = false\n\n}\n\nUIAbstractProperties.prototype.watchConnectionUpdates = function(node) {\n\n\tvar update = this.render.bind(this)\t// heavyhanded but object3d doesnt work otherwise\n\n\tnode.on('connected', update)\n\tnode.on('disconnected', update)\n\n\tthis.detachQueue.push(function () {\n\t\tnode.off('disconnected', update)\n\t\tnode.off('connected', update)\n\t})\n\n}\n\nUIAbstractProperties.prototype._attach = function() {\n\t// if anything is connected we wait a frame\n\tif (this.selectedGraphNode) {\n\t\tthis.watchConnectionUpdates(this.selectedGraphNode)\n\t}\n\tthis.onAttach()\n\tthis.emit('attached')\n\tthis.attached = true\n}\n\nUIAbstractProperties.prototype._reset = function() {\t// resets handling, clears interface\n\tthis.onReset()\n\tthis._detach()\n\tthis.adapter = {}\n\tthis.controls = {}\n\tthis.emit('reset')\n\treturn this\n}\n\n// makes a control based on an adapter prop\n/**\n * {e.g.\n *  position: {\n *    value:\n *    canEdit: (bool)\n *    label: (string)\n *    dt: (e2.core.datatypes)\n *  }\n * }\n * @param props (adapter)\n * @param propName (e.g. 'position' for adapter.position)\n * @param onChange (optional callback)\n * @private\n */\nUIAbstractProperties.prototype._makeControl = function(node, props, propName, onChange, opts) {\n\tvar controlType = VizorUI.getControlTypeForDt(props[propName].dt)\n\tif (!controlType) {\n\t\tconsole.error('could not get control type for dt of prop:'+propName, props)\n\t\treturn\n\t}\n\tif (!props[propName]) {\n\t\tconsole.error('no ' + propName + ' in slotProps', props)\n\t\treturn\n\t}\n\tvar prop = props[propName]\n\tvar control = new controlType(prop, 'value', null, onChange, opts)\n\tvar changeHandler = function(key){\n\t\tif (key.name && key.name !== propName) return\t// this is a slot and it's not for us\n\t\tcontrol.onSourceChange()\n\t}\n\tif (node) {\n\t\tcontrol.__attach = control.attach\n\t\tcontrol.attach = function () {\n\t\t\tcontrol.__attach()\n\t\t\tnode.on(prop.eventName, changeHandler)\n\t\t}\n\t\tcontrol.__detach = control.detach\n\t\tcontrol.detach = function () {\n\t\t\tnode.off(prop.eventName, changeHandler)\n\t\t\tcontrol.__detach()\n\t\t}\n\t}\n\tif (prop.canEdit !== undefined) {\n\t\tif (!prop.canEdit) control.disable()\n\t}\n\n\tcontrol.label \t= prop.label\n\tcontrol.dt \t\t= prop.dt\n\treturn control\n}\n\n// make the UI conform to the protocol loop (emit event, update on receive)\n// we can read direct from the proxy, but setting the values has to go via the graph API\n// when the node actually changes its input slot value (via graph call / event), control must update\nUIAbstractProperties.prototype.uifySlotProxy = function(node, slotName, inputSlotProxy) {\t//\n\tvar proxy = inputSlotProxy\n\tif (!(proxy instanceof Object)) {\n\t\tconsole.error('proxy not an object', proxy)\n\t\treturn\n\t}\n\tObject.defineProperty(proxy, 'value', {\n\t\tget: function() {\n\t\t\treturn proxy.canEdit ? proxy._value : proxy.default\n\t\t},\n\t\tset: function(v) {\n\t\t\tif (proxy.canEdit)\n\t\t\t\tE2.app.graphApi.changeInputSlotValue(node.parent_graph, node, slotName, v)\n\t\t\treturn v\n\t\t}\n\t})\n\tObject.defineProperty(proxy, 'eventName', {value: 'uiSlotValueChanged'})\t// control will listen to this\n\treturn proxy\n}\n\n/********* methods to implement ***********/\n\n/* recommend implementing */\n\t\t\t\tUIAbstractProperties.prototype.getTemplateData = function() {return this.adapter}\n\n// the adapter bridges values for the selected object's state or properties, and the UI controls\n/* @abstract */ UIAbstractProperties.prototype.getAdapter = function() {return {}}\n/* @abstract */ UIAbstractProperties.prototype.getControls = function() {return {}}\n/* @abstract */ UIAbstractProperties.prototype.onAttach \t= function() {}\n/* @abstract */ UIAbstractProperties.prototype.onDetach \t= function() {}\t// this.detachQueue is automatically processed\n/* @abstract */ UIAbstractProperties.prototype.onReset \t= function() {}\n/* @abstract */ UIAbstractProperties.prototype.update \t= function() {}\t// soft-update this.dom{} in place\n"
  },
  {
    "path": "browser/scripts/ui/uiAbstractProxy.js",
    "content": "// base for all UIProxy controls\n// bridge obj.propertyName and domElement\n// so that UI interaction on domElement results in obj.propertyName being updated\n\nvar UIAbstractProxy = function UIAbstractProxy(obj, propertyName, domElement, onChange) {\n\n\tvar that = this\n\tthis._str = ''\t\t// cache this.toString()\n\n\tthis.uid = 'uiproxy_'+E2.uid()\n\tthis.htmlId = false\n\tthis.obj = obj\n\tthis.propertyName = propertyName\n\tthis._onChange = onChange\n\tthis.element = null\n\tthis._enabled = true\n\tthis.isStillChanging = false\n\n\t// set these if needed before rendering html\n\tthis.label = ''\n\tthis.dt = null\n\n\tif (domElement) {\n\t\tthis.element = this.render(domElement)\n\t\tthis._attach()\n\t}\n\n\treturn this\n}\n\nUIAbstractProxy.prototype.render = function(domElement) {\n\tif (domElement) {\n\t\tthis.createdElement = false\n\t\tif (domElement.id) {\n\t\t\tthis.htmlId = domElement.id\n\t\t} else {\n\t\t\tthis.htmlId = this.uid\n\t\t\tdomElement.id = this.uid\n\t\t}\n\t\tif (!this.checkValidElement(domElement))\n\t\t\treturn null\n\t\tdomElement.dataset.uid = this.uid\n\t\treturn domElement\n\t} else {\n\t\tthis.createdElement = true\n\t\tvar el = this.newElement()\n\t\tthis.htmlId = el.id = this.uid\n\t\tel.dataset.uid = this.uid\n\t\treturn el\n\t}\n}\n\n// in case this is rendered some place else (e.g. handlebars),\n// return html, adding a little script to attach event handlers automatically upon render\nUIAbstractProxy.prototype.toString = function() {\n\tif (this._str !== '') {\n\t\tvar uid = this.uid\n\t\tconsole.log('toString called more than once' + uid)\n\t\treturn ''\n\t}\n\tvar that = this\n\tif (this.element) return ''\t// already rendered some place else\n\n\tvar c = document.createElement('template')\n\tvar el = this.render()\n\tc.content.appendChild(el)\n\tvar str = c.innerHTML\n\tel.remove()\n\tc.remove()\n\n\tvar d = {}\n\td.listener = function(e) {\n\t\tif (!(e.detail && e.detail.htmlId === that.htmlId)) return\n\t\tdocument.removeEventListener('uiproxy_rendered', d.listener)\n\t\tdocument.getElementById('_js_'+that.uid).remove()\n\t\tthat._attach()\n\t\td = null\n\t}\n\tdocument.addEventListener('uiproxy_rendered', d.listener)\n\n\t// as soon as this element is rendered, we announce ourselves to the document\n\tstr += \"<script id='_js_\"+ this.uid +\"'>document.dispatchEvent(new CustomEvent('uiproxy_rendered', {detail:{htmlId:'\" + this.htmlId + \"'}}))</script>\"\n\tthis._str = str\n\treturn this._str\n}\n\nUIAbstractProxy.prototype._getAdapter = function() {\n\tvar adapter = this.getAdapter(this.obj, this.propertyName)\n\treturn adapter\n}\n\nUIAbstractProxy.prototype._update = function() {\n\tthis.adapter.uiValue = this.adapter.sourceValue\n}\n\nUIAbstractProxy.prototype._attach = function() {\n\tvar el = document.getElementById(this.htmlId)\n\tif (el !== this.element) {\n\t\tthis.element = el\n\t}\n\tthis.adapter = this._getAdapter()\n\tthis._onUIChange = function(e){\n\t\tvar oldSourceValue = this.adapter.sourceValue\n\t\tif (!this.isEqualValue(this.adapter.uiValue, oldSourceValue)) {\t// blur triggers onchange. avoid it.\n\t\t\tthis.onUIChange(e)\n\t\t\tif (this._onChange)\n\t\t\t\tthis._onChange.call(this, e, this.adapter.sourceValue, oldSourceValue)\n\t\t}\n\t}.bind(this)\n\tthis.attach()\n\tthis.onSourceChange()\n\tthis.onEnabledChange()\n\n\t// release extra references\n\tthis.obj = null\n\tthis.propertyName = null\n}\n\nUIAbstractProxy.prototype._detach = function() {\n\tif (this.element)\n\t\tthis.detach()\n}\n\n\nUIAbstractProxy.prototype.attach = function() {\n\tthis.element.addEventListener('change', this._onUIChange)\n}\n\nUIAbstractProxy.prototype.detach = function() {\n\tthis.element.removeEventListener('change', this._onUIChange)\n}\n\nUIAbstractProxy.prototype.isEqualValue = function(v1, v2) {\n\treturn v1 === v2\n}\n\n/* overloaded methods */\nUIAbstractProxy.prototype.getAdapter = function(obj, propertyName) {\n\tconsole.error('must override getAdapter')\n\n\treturn {\n\t\tget sourceValue() \t{ /* return propertyName from obj via method or direct access */ },\n\t\tset sourceValue(v) \t{ /* set propertyName on obj directly or via some api */ },\n\t\tget uiValue() \t\t{ /* return the property of dom/ui element that represents the value */},\n\t\tset uiValue(v) \t\t{ /* change the dom/ui element to reflect value (e.g. .dataset.property, .className, etc)  */}\n\t}\n}\nUIAbstractProxy.prototype.checkValidElement = function() {return true}\n/* end overloaded methods */\nUIAbstractProxy.prototype.onUIChange = function() {\n\tthis.adapter.sourceValue = this.adapter.uiValue\n\tif (this.element && this.element.blur)\n\t\tthis.element.blur()\n}\n\nUIAbstractProxy.prototype.onSourceChange = function() {\n\tthis._update()\n\treturn true\n}\nUIAbstractProxy.prototype.onEnabledChange = function() {\n\tif (this.element)\n\t\tthis.element.disabled = !this._enabled\n}\n\nUIAbstractProxy.prototype.enable = function() {\n\tthis._enabled = true\n\tthis.onEnabledChange()\n}\n\nUIAbstractProxy.prototype.disable = function() {\n\tthis._enabled = false\n\tthis.onEnabledChange()\n}\n\nUIAbstractProxy.prototype.destroy = function() {\n\tthis._detach()\n\tif (this.createdElement) {\n\t\tvar p = this.element.parentElement\n\t\tif (p) p.removeChild(this.element)\n\t\tthis.element = null\n\t}\n\tthis.adapter = null\n}\n"
  },
  {
    "path": "browser/scripts/ui/uiDragAwareHelper.js",
    "content": "/**\n * this helper allows any element to be dragged by mouse or touch and produce start/move/end events\n * var \tel = document.getElementById('test'),\n * \t\td = new UIDragAware(el, function(){ return shouldStart(data) })\n * \t\td.detach()\t\t// remove your own event handlers if not removing element\n *\n * @emits uiDragstart|uiDragmove|uiDragend\n *\n * @param domNode\n * @param onStart optional callback test - if this returns false dragging is not enabled\n * @constructor\n */\n\nvar UIDragAwareHelper = function(domNode, onStart, trackX, trackY) {\n\n\ttrackX = typeof trackX === 'undefined' ? true : !!trackX\n\ttrackY = typeof trackY === 'undefined' ? true : !!trackY\n\tthis.dragEvents = {\n\t\tstart \t: 'uiDragstart',\n\t\tmove\t: 'uiDragmove',\n\t\tend\t\t: 'uiDragend',\n\t\tremove\t: 'uiDragremove'\n\t}\n\n\tonStart = onStart || function() { return true }\n\n\tvar that = this\n\tthis.minDelta = 2\n\n\tfunction _emit(node, eventName, data) {\n\t\tnode.dispatchEvent(new CustomEvent(eventName, {detail: data}))\n\t}\n\n\tfunction makeEventData(data, currentPosition) {\n\t\tvar op = data.startPosition, lp = data.lastPosition, o = data.startOffset\n\t\tvar tx = trackX ? 1 : 0\n\t\tvar ty = trackY ? 1 : 0\n\n\t\tvar ret ={\n\t\t\ttouchId \t\t: data.touchId,\n\t\t\tpointer\t\t\t: data.pointer,\n\t\t\tposition \t\t: {x: currentPosition.x, y: currentPosition.y},\n\t\t\tlastPosition \t: {x: lp.x, y: lp.y},\n\t\t\tstartPosition\t: {x: op.x, y: op.y},\n\t\t\tstartOffset\t\t: {x: o.x, y: o.y},\n\t\t\tdelta\t\t\t: {x : tx*(currentPosition.x - lp.x), y : ty*(currentPosition.y - lp.y) },\n\t\t\tstartDelta\t\t: {x : tx*(currentPosition.x - op.x), y : ty*(currentPosition.y - op.y) },\n\t\t\tdragThresholdPx\t: data.dragThresholdPx,\n\t\t\tdragged\t\t\t: data.dragged\n\t\t}\n\t\tif (!trackX) {\n\t\t\tret.lastPosition.x = ret.position.x\n\t\t\tret.startPosition.x = ret.position.x\n\t\t}\n\t\tif (!trackY) {\n\t\t\tret.lastPosition.y = ret.position.y\n\t\t\tret.startPosition.y = ret.position.y\n\t\t}\n\n\t\treturn ret\n\t}\n\n\tvar _attached = false\t// prevent up() from executing more than once\n\tvar minDelta = this.minDelta\t\t// initial threshold\n\n\tvar removeListeners = function(domNode, data) {\n\t\tdomNode.removeEventListener(that.dragEvents.remove, \tdata.up)\n\t\tdomNode.removeEventListener('dragover', \tdata.canceldrag, true)\n\t\tdocument.removeEventListener('click', \tdata.up, true)\n\t\tdocument.removeEventListener('mousemove', \tdata.move, true)\n\t\tdocument.removeEventListener('touchmove', \tdata.move, true)\n\t\tdocument.removeEventListener('mouseup', \tdata.up, true)\n\t\tdocument.removeEventListener('touchcancel', data.up, true)\n\t\tdocument.removeEventListener('touchend', \tdata.up, true)\n\t\tdocument.removeEventListener('dragstart', \tdata.canceldrag, true)\n\t\twindow.removeEventListener('blur', data.up, true)\n\t}\n\tvar up = function(data) { return function(e) {\n\t\tif (!_attached) return\n\n\t\tif (siteUI)\n\t\t\tsetTimeout(function(){\n\t\t\t\tsiteUI.isDragging = false\n\t\t\t}, 300)\n\n\t\tremoveListeners(domNode, data)\n\t\t_attached = false\n\n\t\tif (data.dragged) {\n\t\t\te.preventDefault()\n\t\t\te.stopPropagation()\n\t\t\tsetTimeout(function() {\n\t\t\t\tdomNode.style.pointerEvents = data.pointerEvents\n\t\t\t}, 200)\n\t\t} else {\n\t\t\tdomNode.style.pointerEvents = data.pointerEvents\n\t\t}\n\n\t\t_emit(domNode, that.dragEvents.end, makeEventData(data, {x: data.lastPosition.x, y: data.lastPosition.y}))\n\n\t\t// else\n\t\treturn !data.dragged\n\t}}\n\n\tvar move = function(data) {\n\t\treturn function(e) {\n\n\t\t\t// occasionally the browser will throw us\n\t\t\tif (!_attached) {\n\t\t\t\tremoveListeners(domNode, data)\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tvar t = e.touches ? e.touches[data.touchId] : e\n\n\t\t\tvar ed = makeEventData(data, {x: t.pageX, y : t.pageY})\n\n\t\t\tvar xy = Math.abs(ed.delta.x) + Math.abs(ed.delta.y)\n\t\t\t\n\t\t\tif (xy >= minDelta) {\n\t\t\t\tif (minDelta > 0) {\n\t\t\t\t\tif (siteUI)\n\t\t\t\t\t\tsiteUI.isDragging = true\n\t\t\t\t\tdata.dragged \t= true\n\t\t\t\t\tminDelta = 0\n\t\t\t\t\tdomNode.style.pointerEvents = 'none'\n\t\t\t\t}\n\t\t\t\tdata.lastPosition = ed.position\n\n\t\t\t\t_emit(domNode, that.dragEvents.move, ed)\n\n\t\t\t\tif (e.preventDefault)\n\t\t\t\t\te.preventDefault()\n\t\t\t\tif (e.stopPropagation)\n\t\t\t\t\te.stopPropagation()\n\t\t\t} else {\n\t\t\t\tif (window.pageYOffset !== data.pageYOffset) {\n\t\t\t\t\tdata.startPosition.x += ed.delta.x\n\t\t\t\t\tdata.lastPosition.x += ed.delta.x\n\t\t\t\t\tdata.pageXOffset = window.pageXOffset\n\t\t\t\t}\n\t\t\t\tif (window.pageXOffset !== data.pageXOffset) {\n\t\t\t\t\tdata.startPosition.y += ed.delta.y\n\t\t\t\t\tdata.lastPosition.y += ed.delta.y\n\t\t\t\t\tdata.pageYOffset = window.pageYOffset\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true\n\t\t} // end closure\n\t}\n\n\tvar down = function() {\n\t\treturn function(e) {\n\t\t\tif (e.touches && e.touches.length>1)\n\t\t\t\treturn true\n\n\t\t\tvar touchId = 0\t\t// @todo get correct touch id\n\t\t\tvar t = (e.touches) ? e.touches[touchId] : e;\n\n\t\t\tvar data = {\n\t\t\t\ttouchId \t\t: touchId,\n\t\t\t\tpointer\t\t\t: t,\n\t\t\t\tlastPosition\t: {\tx: t.pageX,\ty: t.pageY },\n\t\t\t\tstartPosition\t: { x: t.pageX,  y: t.pageY\t},\n\t\t\t\tstartOffset\t\t: { x: t.offsetX,\ty: t.offsetY },\n\t\t\t\tdragThresholdPx\t: that.minDelta,\n\t\t\t\tdragged\t\t\t: false,\n\t\t\t\tcanceldrag : function(e){e.preventDefault(); e.stopPropagation(); return false;},\n\t\t\t\tpointerEvents\t: window.getComputedStyle(domNode).pointerEvents,\n\t\t\t\tpageXOffset\t\t: window.pageXOffset,\n\t\t\t\tpageYOffset\t\t: window.pageYOffset\n\t\t\t}\n\n\t\t\tif (!onStart(makeEventData(data, {x: t.pageX, y: t.pageY}),e)) return true\n\n\t\t\tminDelta = that.minDelta\n\t\t\tdata.up = up(data)\n\t\t\tdata.move = move(data)\n\t\t\twindow.addEventListener('blur', data.up, true)\n\t\t\tdocument.addEventListener('dragstart', \tdata.canceldrag, true)\n\t\t\tdocument.addEventListener('touchend', data.up, true)\n\t\t\tdocument.addEventListener('touchcancel', data.up, true)\n\t\t\tdocument.addEventListener('mouseup', data.up, true)\n\t\t\tdocument.addEventListener('touchmove', data.move, true)\n\t\t\tdocument.addEventListener('mousemove', data.move, true)\n\t\t\tdocument.addEventListener('click', \tdata.up, true)\n\t\t\tdomNode.addEventListener('dragover', \tdata.canceldrag, true)\n\t\t\tdomNode.addEventListener(that.dragEvents.remove, data.up)\n\t\t\t_attached = true\n\n\t\t\t// if (e.preventDefault)\n\t\t\t// \te.preventDefault()\n\n\t\t\t_emit(domNode, that.dragEvents.start, data)\n\n\t\t\tdata.move(e)\n\t\t\treturn true\n\t\t}\n\t}\n\n\tvar _down = down()\n\n\tthis.attach = function() {\n\t\tdomNode.addEventListener('touchstart', _down)\n\t\tdomNode.addEventListener('mousedown', _down)\n\t}\n\n\tthis.detach = function() {\n\t\tdomNode.dispatchEvent(new CustomEvent(that.dragEvents.remove)) // force detach handlers\n\t\tdomNode.removeEventListener('mousedown', _down)\n\t\tdomNode.removeEventListener('touchstart', _down)\n\t}\n\n\tthis.attach()\n}"
  },
  {
    "path": "browser/scripts/ui/uiDragToAdjust.js",
    "content": "// former NodeUI.makeUIAdjustableValue\n\n// makes an element adjustable by dragging in two directions\n// onChange callback is (value, screenDelta)\n// note, does not support css/dom rotation of surface element\n// can be bound twice for XY controls\nvar uiMakeDragToAdjust = function(domNode, onStart, onChange, onEnd, options) {\n\n\tvar o = _.extend({\n\t\tmin : 0.0,\n\t\tmax : 1.0,\n\t\tstep : 0.1,\n\t\tsize : 100,\t// size of full range of control (e.g. min to max in 100px)\n\t\tgetValue : null,\t// supply function to dynamically read this value from elsewhere (e.g. state)\n\t\tvalue : 0.5,\t// default if no getValue()\n\n\t\tallowTextInput : true,\n\t\tallowTransientTextInput: false,\n\t\tparseTextInput : null,\n\t\ttextInputParentNode : null,\t// which node to attach the dynamic input control to\n\n\t\torientation: 'vertical',\n\t\tisSurface : false,\t\t\t// use the domNode as a surface, scaling value along the node's width or height\n\t\tsurfaceDomNode : null,\t\t// use another domNode's dimensions as surface, instead of this one (it won't move the node!)\n\t\tcssCursor: 'ns-resize'\t\t// e.g. ns-resize, we-resize, crosshair, all-scroll, etc\n\t}, options)\n\n\tif (parseFloat(o.step) === 0.0) {\n\t\terr(\"step cannot be zero\")\n\t\treturn\n\t}\n\n\tvar isVertical = (o.orientation === 'vertical')\n\tvar getValue = (typeof o.getValue === 'function') ? o.getValue : function(){return parseFloat(o.value)}\n\tif (o.isSurface) o.allowTextInput = false\t// not supported\n\tif (!o.textInputParentNode) o.allowTextInput = false\n\n\tonEnd = onEnd || function(){}\n\n\tvar value = getValue()\n\tvar prevValue = value\n\n\t// helpers\n\tvar clamp = THREE.Math.clamp\n\tvar mapLinear = THREE.Math.mapLinear\n\n\tvar parseInputValue\n\tif (typeof o.parseTextInput === 'function')\n\t\tparseInputValue = o.parseTextInput\n\telse {\n\t\tparseInputValue = function(inputValue, oldValue, isTransient) {\n\t\t\tvar v = parseFloat(inputValue)\n\t\t\tif (isNaN(v)) return false\n\t\t\tif (!isFinite(v)) return false\n\t\t\treturn clamp(v, o.min, o.max)\n\t\t}\n\t}\n\n\tvar numSteps = (o.max - o.min) / o.step\n\n\t// down() will set these\n\tvar minPixels = 1,\n\t\tnormValue = o.max / value\n\n\tvar isShiftPressed = function() {\n\t\treturn E2.ui.flags.pressedShift;\n\t}\n\n\tvar up = function(data) { return function(e) {\n\t\tE2.ui.setDragging(false);\n\t\tdocument.removeEventListener('mousemove', data.move, true)\n\t\tdocument.removeEventListener('touchmove', data.move, true)\n\t\tdocument.removeEventListener('mouseup', data.up)\n\t\tdocument.removeEventListener('touchcancel', data.up)\n\t\tdocument.removeEventListener('touchend', data.up)\n\t\tif(e.preventDefault) e.preventDefault()\n\t\tonEnd(value)\n\t\tdocument.body.style.cursor = '';\n\t\tvar rectRef = o.surfaceDomNode || domNode\n\t\t\trectRef.classList.remove('adjusting')\n\t\treturn true\n\t}}\n\n\tvar move = function(data) {\n\t\treturn function(e) {\n\t\t\tvar t = (e.touches) ? e.touches[data.touchId] : e;\n\n\t\t\tvar pos\n\t\t\tif (data.rect) { // constrain xy within rect\n\t\t\t\tif (isVertical) {\n\t\t\t\t\tpos = t.pageY - data.rect.top\n\t\t\t\t\tclamp(pos, 0.0, 0.0 + data.rect.height);\n\t\t\t\t} else {\n\t\t\t\t\tpos = t.pageX - data.rect.left\n\t\t\t\t\tclamp(pos, 0.0, 0.0 + data.rect.width);\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tpos = (isVertical) ? t.pageY : t.pageX\n\n\t\t\tvar delta = pos - data.last_pos\n\n\t\t\tvar shiftPressed = isShiftPressed(), quantize = o.step\n\t\t\tif (Math.abs(delta) >= minPixels) {\n\t\t\t\tdata.last_pos = pos\n\t\t\t\tif (shiftPressed) {\n\t\t\t\t\tdelta /= 10.0;\n\t\t\t\t\tquantize = o.step / 10\n\t\t\t\t} else {\n\t\t\t\t\tquantize = o.step\n\t\t\t\t\tif ((delta > 15) || (delta < -15)) {\t// above a threshold we decrease resolution\n\t\t\t\t\t\tdelta *= 5\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar oldValue = value;\n\n\t\t\t\tif (!data.rect) {\n\t\t\t\t\t// single point\n\t\t\t\t\tnormValue += (isVertical) ? (- delta) : delta;\n\t\t\t\t} else {\n\t\t\t\t\t// surface, cast to float\n\t\t\t\t\tnormValue = 0.0 + pos\n\t\t\t\t}\n\n\t\t\t\tnormValue = clamp(normValue, 0.0, o.size);\n\t\t\t\tvalue = mapLinear(normValue, 0.0, o.size, o.min, o.max);\n\t\t\t\tvalue = quantize * Math.round(value / quantize)\n\n\t\t\t\tif ((value !== oldValue)) {\n\t\t\t\t\tonChange(value, delta)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif(e.preventDefault) e.preventDefault()\n\t\t\treturn true\n\t\t} // end closure\n\t}\n\n\tvar down = function() {\n\t\treturn function(e) {\n\t\t\tvar t = (e.touches) ? e.touches[0] : e;\n\n\t\t\tvalue = getValue()\n\n\t\t\tvar data = {\n\t\t\t\tlast_pos: (isVertical) ? t.pageY : t.pageX,\n\t\t\t\ttouchId : 0\n\t\t\t}\n\n\t\t\tif (o.isSurface) {\t// size ourselves as per element in question\n\t\t\t\tvar rectRef = o.surfaceDomNode || domNode\n\t\t\t\tdata.rect = rectRef.getBoundingClientRect()\n\t\t\t\to.size =  (isVertical) ? data.rect.height : data.rect.width\n\t\t\t\tdata.last_pos -= (isVertical) ? data.rect.top : data.rect.left\n\t\t\t}\n\n\t\t\tminPixels = o.size / numSteps\n\n\t\t\tnormValue = mapLinear(value, o.min, o.max, 0, o.size)\n\n\t\t\tdata.up = up(data)\n\t\t\tdata.move = move(data)\n\t\t\tdocument.addEventListener('touchend', data.up)\n\t\t\tdocument.addEventListener('touchcancel', data.up)\n\t\t\tdocument.addEventListener('mouseup', data.up)\n\t\t\tdocument.addEventListener('touchmove', data.move, true)\n\t\t\tdocument.addEventListener('mousemove', data.move, true)\n\n\t\t\tif(document.activeElement)\n\t\t\t\tdocument.activeElement.blur();\n\n\t\t\tif(e.preventDefault) e.preventDefault()\n\n\t\t\tonStart(value)\n\t\t\tE2.ui.setDragging(true);\n\t\t\tdocument.body.style.cursor = o.cssCursor;\n\n\t\t\tvar rectRef = o.surfaceDomNode || domNode\n\t\t\trectRef.classList.add('adjusting')\n\t\t\tdata.move(e)\n\t\t\treturn true\n\t\t}\n\t}\n\n\tfunction textEntryChange(v) {\n\t\tvar oldValue = value\n\t\tv = parseInputValue(v, oldValue, false)\n\t\tif (v === false) v = oldValue\n\t\tv = clamp(v, o.min, o.max)\n\t\tif (oldValue !== v) {\n\t\t\tvalue = v\n\t\t\tnormValue = mapLinear(value, o.min, o.max, 0, o.size)\n\t\t\tonStart(oldValue)\n\t\t\tonChange(value, oldValue, false)\n\t\t\tonEnd(value)\n\t\t}\n\t}\n\n\tfunction transientEntryChange(v) {\n\t\tv = parseInputValue(v, prevValue, true)\n\t\tif (v === false)\n\t\t\tv = prevValue\n\t\tv = clamp(v, o.min, o.max)\n\t\tif (prevValue !== v) {\n\t\t\tprevValue = v\n\t\t\tnormValue = mapLinear(v, o.min, o.max, 0, o.size)\n\t\t\tonChange(v, prevValue, true)\n\t\t}\n\t}\n\n\tif (o.allowTextInput) {\n\t\tdomNode.addEventListener('dblclick', function(e){\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tvar evOpts = (o.allowTransientTextInput) ? {onTransientChange:transientEntryChange} : null\n\t\t\tuiEnterValueControl(domNode, o.textInputParentNode, textEntryChange, evOpts)\n\t\t\treturn false\n\t\t}, true);\n\t}\n\n\n\tdomNode.addEventListener('touchstart', down())\n\tdomNode.addEventListener('mousedown', down())\n\tdomNode.addEventListener('mouseenter', function(){\n\t\tdomNode.style.cursor = o.cssCursor;\n\t})\n\tdomNode.addEventListener('mouseleave', function() {\n\t\tdomNode.style.cursor = '';\n\t})\n\tif (domNode.className && (domNode.className.indexOf('uiValueAdjustable') === -1))\n\t\tdomNode.className += ' uiValueAdjustable'\n\telse\n\t\tdomNode.className = 'uiValueAdjustable'\n\n}"
  },
  {
    "path": "browser/scripts/ui/uiEnterValue.js",
    "content": "// former NodeUI.enterValueControl\nvar uiEnterValueControl = function(node, parentNode, onChange, options) {\n\n\tvar $node = jQuery(node)\n\tvar $parent = jQuery(parentNode)\n\tif ($node.hasClass('uiTextInput')) return true;\n\tvar o = _.extend({\n\t\ttype : 'text',\n\t\tplaceholder : '',\n\t\tonTransientChange: null\t\t// supply your transient change handler here\n\t}, options)\n\n\tvar $input = $('<input class=\"node-value-input\" type=\"'+ o.type +'\" placeholder=\"'+ o.placeholder +'\" />')\n\n\tvar nodeOffset = $node.offset();\n\tvar parentOffset = $parent.offset();\n\n\t$node.addClass('uiTextEntry');\n\tvar controlWidth = $node.innerWidth()\n\tif (controlWidth < 30) controlWidth = 30;\n\n\tvar parentStylePosition = $parent.css('position');\n\tif (parentStylePosition === 'static') parentStylePosition = ''\n\tif (!parentStylePosition) {\n\t\t$parent.css({\n\t\t\t'position' : 'relative'\n\t\t})\n\t}\n\n\tvar oldValue = $node.text()\n\tvar prevValue = oldValue\n\n\tfunction valueFromEventTarget(e) {\n\t\treturn $(e.target).val().replace(/^\\s+|\\s+$/g,'') // remove extra spaces\n\t}\n\n\tfunction tryChange(value) {\n\t\tif (value === \"\") value = oldValue\n\t\tif (value !== oldValue) {\n\t\t\tonChange(value, oldValue)\n\t\t\toldValue = value\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\tfunction transientChange(value) {\n\t\tif (value !== prevValue) {\n\t\t\to.onTransientChange(value, prevValue)\n\t\t\tprevValue = value\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t}\n\n\n\tvar cancelling = false\n\tvar done = false\n\n\tvar forceBlur = function(e) {\n\t\tvar t = e.target\n\t\tif (t !== $input[0]) $input.trigger('blur')\n\t\treturn true;\n\t}\n\n\tvar commit = function(e) {\n\t\tdone = true\n\t\ttryChange(valueFromEventTarget(e))\n\t\tjQuery(e.target).trigger('blur');\n\t}\n\n\tdocument.addEventListener('mousedown', forceBlur, true)\n\t$input\n\t\t.addClass('uiTextEntry')\n\t\t.appendTo($parent)\n\t\t.css({\n\t\t\tposition: 'absolute',\n\t\t\twidth:  '' + controlWidth + 'px',\n\t\t\tleft: '' + (nodeOffset.left - parentOffset.left ) + 'px',\n\t\t\ttop: '' + (nodeOffset.top - parentOffset.top ) + 'px',\n\t\t\t'z-index' : 3001,\n\t\t\tmargin: 0\n\t\t})\n\t\t.val(oldValue)\n\t\t.keydown(function(e){\n\t\t\tvar code = e.keyCode || e.which\n\t\t\tif (code === 13) {\n\t\t\t\tcommit(e)\n\t\t\t}\n\t\t\telse if (code === 9) {\n\t\t\t\t// tab!\n\t\t\t\te.preventDefault()\n\t\t\t\te.stopPropagation()\n\t\t\t\tcommit(e)\n\t\t\t\t$node[0].dispatchEvent(new CustomEvent('tabToNext'))\n\t\t\t}\n\t\t\telse if (o.onTransientChange) {\n\t\t\t\ttransientChange(valueFromEventTarget(e))\n\t\t\t}\n\t\t\treturn true;\n\t\t})\n\t\t.keyup(function(e) {\n\t\t\tvar code = e.keyCode || e.which\n\t\t\tif(code === 27) {\n\t\t\t\tcancelling = true\n\t\t\t\tif (o.onTransientChange) {\n\t\t\t\t\t$input.val(oldValue)\n\t\t\t\t\ttransientChange(oldValue)\n\t\t\t\t}\n\t\t\t\tjQuery(e.target).trigger('blur');\n\t\t\t}\n\t\t\telse if (o.onTransientChange) {\n\t\t\t\ttransientChange(valueFromEventTarget(e))\n\t\t\t}\n\t\t\treturn true;\n\t\t})\n\t\t.select()\n\t\t.bind('blur', function(e) {\n\t\t\tif (!(cancelling || done)) {\n\t\t\t\ttryChange(valueFromEventTarget(e))\n\t\t\t}\n\t\t\t$(this).remove()\t// this = input\n\t\t\t$node.removeClass('uiTextEntry')\n\t\t\t$parent.css({\n\t\t\t\tposition: parentStylePosition\n\t\t\t})\n\t\t\tdocument.removeEventListener('mousedown', forceBlur, true)\n\t\t})\n\t\t.focus()\n}"
  },
  {
    "path": "browser/scripts/ui/uiPropertiesNode.js",
    "content": "var UINodeProperties = function UINodeProperties(domElement){\n\n\tUIAbstractProperties.apply(this, arguments)\n\tdomElement = domElement || document.getElementById('nodePropertiesPane')\n\n\tthis.dom = {\n\t\tcontainer: $(domElement),\n\t\tcommon: {\n\t\t\tnodeName \t\t: false\n\t\t}\n\t}\n\n\tthis.controls = {}\n\n\tthis.template = E2.views.partials.editor.nodeInspector\n\tE2.ui.state.on('changed:selectedObjects', this.onSelectedNodeChanged.bind(this))\n\n\tthis.emit('created')\n\tthis.render()\n}\nUINodeProperties.prototype = Object.create(UIAbstractProperties.prototype)\nUINodeProperties.prototype.constructor = UINodeProperties\n\nUINodeProperties.prototype.onAttach = function() {\n\tvar that = this\n\tvar node = this.selectedGraphNode\n\n\tthis.dom.common.nodeName = document.getElementById('propertiesNodeName')\n\n\tif (node) {\n\t\tvar onRenamed = function() {\n\t\t\tthat.controls.common.nodeName.onSourceChange()\n\t\t}\n\t\tnode.on('renamed', onRenamed)\n\t\tthis.detachQueue.push(function(){node.off('renamed', onRenamed)})\n\t}\n}\n\nUIObjectProperties.prototype.onDetach = function() {\n\t// the detach queue has already been executed\n\tdelete this.controls\n\tdelete this.adapter\n\tthis.controls = {}\n\tthis.adapter = {}\n}\n\nUINodeProperties.prototype.onSelectedNodeChanged = function() {\n\tthis.render()\n}\n\nUINodeProperties.prototype.getAdapter = function() {\n\tvar that = this\n\n\tvar adapter = {\n\t\tcommon: {\n\t\t\tcanEdit: true,\n\t\t\tget nodeName() {\n\t\t\t\tvar n = that.selectedGraphNode\n\t\t\t\tif (n) {\n\t\t\t\t\treturn n.get_disp_name()\n\t\t\t\t}\n\t\t\t\treturn ''\n\t\t\t},\n\t\t\tset nodeName(v) {\n\t\t\t\tvar n = that.selectedGraphNode\n\t\t\t\tif (!n) return null\n\t\t\t\tE2.app.graphApi.renameNode(E2.core.active_graph, n, v);\n\t\t\t\treturn v\n\t\t\t}\n\t\t}\n\t}\n\n\tvar node = this.selectedGraphNode\n\n\tif (node) {\n\n\t\t// eventually we have no state props\n\t\tvar stateprops = node.getInspectorStateProps()\n\t\tif (!_.isEmpty(stateprops)) {\n\t\t\tadapter.stateProps = {}\n\t\t\tObject.keys(stateprops).forEach(function(name){\n\t\t\t\tvar proxy = stateprops[name]\t\t// a slot from node.getInspectorSlots {dt:,label:,canEdit:, value:}\n\t\t\t\tadapter.stateProps[name] = UINodeProperties.uifyStateProxy(node, name, proxy)\n\t\t\t})\n\t\t}\n\n\t\tvar slotprops = node.getInspectorSlotProps()\n\t\tif (!_.isEmpty(slotprops)) {\n\t\t\tadapter.slotProps = {}\n\t\t\tObject.keys(slotprops).forEach(function(name){\n\t\t\t\tvar proxy = slotprops[name]\t\t// a slot from node.getInspectorSlots {dt:,label:,canEdit:, value:}\n\t\t\t\tadapter.slotProps[name] = that.uifySlotProxy(node, name, proxy)\n\t\t\t})\n\t\t}\n\t}\n\n\treturn adapter\n}\n\n\n// as with prototype.uifySlot, this one goes via the undoManager\nUINodeProperties.uifyStateProxy = function(node, varName, pluginStateProxy) {\t//\n\tvar proxy = pluginStateProxy\n\tObject.defineProperty(proxy, 'value', {\n\t\tget: function() {\n\t\t\treturn proxy._value\n\t\t},\n\t\tset: function(v) {\n\t\t\tvar ov = this._value\n\t\t\tif (proxy.canEdit)\n\t\t\t\tnode.plugin.undoableSetState(varName, v, ov)\n\t\t\treturn v\n\t\t}\n\t})\n\tObject.defineProperty(proxy, 'eventName', {value: 'pluginStateChanged'})\n\treturn proxy\n}\n\nUINodeProperties.prototype.getControls = function() {\n\tvar that = this\n\tvar controls = {}\n\tvar node = this.selectedGraphNode\n\n\tvar makeControl = this._makeControl\n\t// props and state vars\n\n\tif (this.adapter.stateProps) {\n\t\tvar np = this.adapter.stateProps\n\t\tcontrols.stateProps = {_enabled: true}\n\n\t\tObject.keys(np).forEach(function(key){\n\t\t\tvar c = makeControl(node, np, key)\n\t\t\tif (!c) return\n\t\t\tthat.detachQueue.push(c.destroy.bind(c))\n\t\t\tcontrols.stateProps[key] = {\n\t\t\t\tdtName: \tc.dt.name,\n\t\t\t\tlabel:  c.label,\n\t\t\t\tcontrol: c\n\t\t\t}\n\t\t})\n\t}\n\n\tif (this.adapter.slotProps) {\n\t\tvar sp = this.adapter.slotProps\n\t\tcontrols.slotProps = {_enabled: true}\n\n\t\tObject.keys(sp).forEach(function(key){\n\t\t\tvar c = makeControl(node, sp, key)\n\t\t\tif (!c) return\n\t\t\tthat.detachQueue.push(c.destroy.bind(c))\n\t\t\tcontrols.slotProps[key] = {\n\t\t\t\tdtName: \tc.dt.name,\n\t\t\t\tlabel:  c.label,\n\t\t\t\tcontrol: c\n\t\t\t}\n\t\t})\n\t}\n\n\tif (node && this.adapter.common) {\n\t\tcontrols.common = {_enabled:true}\n\t\tvar t = new UITextField(this.adapter.common, 'nodeName')\n\t\tthis.detachQueue.push(t.destroy.bind(t))\n\t\tcontrols.common.nodeName = t\n\t}\n\n\treturn controls\n}\n\nUINodeProperties.prototype.update = function() {\t// soft updates the template already in place\n\tvar that = this\n\tvar canUpdate = this.isValidNodeSelection\n\tif (!canUpdate)\n\t\treturn\n\n\tvar updateControls = function(controlProps, adapterProps) {\n\t\tObject.keys(controlProps).forEach(function (key) {\n\t\t\tvar control = controlProps[key].control\n\t\t\tif (!control) return\t// e.g. [_enabled]\n\t\t\tcontrol.onSourceChange()\n\t\t\tif (adapterProps[key].canEdit)\n\t\t\t\tcontrol.enable()\n\t\t\telse\n\t\t\t\tcontrol.disable()\n\t\t})\n\t}\n\tif (that.controls.stateProps)\n\t\tupdateControls(that.controls.stateProps, that.adapter.stateProps)\n\n\tif (that.controls.slotProps)\n\t\tupdateControls(that.controls.slotProps, that.adapter.slotProps)\n\n\tif (that.controls.common)\n\t\tupdateControls(that.controls.common, that.adapter.common)\n\n}"
  },
  {
    "path": "browser/scripts/ui/uiPropertiesObj3d.js",
    "content": "// -> create (or reset: -> detach) -> select -> init -> render -> attach -> done\n\nvar UIObjectProperties = function UIObjectProperties(domElement) {\n\n\t// mesh slots found within this list will trigger update of entire panel\n\tthis.slotsThatTriggerUpdate = ['lock transform']\n\n\tUIAbstractProperties.apply(this, arguments)\n\n\tthis.template = E2.views.partials.editor.objectProperties\n\n\tdomElement = domElement || document.getElementById('obj3dPropertiesPane')\n\n\tthis.dom = {\t// elements\n\t\tcontainer: $(domElement),\n\t\tposition: {},\n\t\trotation: {},\n\t\tscale: {},\n\t\tscaleLinked : {}\n\t}\n\n\tthis.flags = {\n\t\t_uid: null,\n\t\tscaleLinkXYZ : true\n\t}\n\n\tthis.controls = {}\n\n\tE2.app.worldEditor.on('selectionSet', this.onObjectPicked.bind(this))\n\n\tthis.emit('created')\n\tthis.render()\n}\n\nUIObjectProperties.prototype = Object.create(UIAbstractProperties.prototype)\nUIObjectProperties.prototype.constructor = UIObjectProperties\n\n\nUIObjectProperties.prototype.getAdapter = function() {\n\tvar that = this\n\tvar rad2deg = 180 / 3.14159265358\n\n\t// threeObject3Dplugin\n\tvar meshPlugin = this.selectedEditorObjectMeshPlugin\n\n\tvar adapter = {\n\t\tselectedIsCamera: that.selectedIsCamera,\n\t\tscale: {\n\t\t\teventName: 'pluginStateChanged',\n\t\t\tdt: E2.core.datatypes.VECTOR,\n\t\t\tlabel: 'Scale',\n\t\t\tget canEdit() {\n\t\t\t\treturn meshPlugin && meshPlugin.canEditScale && meshPlugin.canEditScale()\n\t\t\t},\n\t\t\tget value() {\n\t\t\t\tif (that.selectedIsCamera) return {x:1.0, y:1.0, z:1.0}\n\t\t\t\tvar s = meshPlugin.state\n\t\t\t\treturn (s) ? s.scale : null\n\t\t\t},\n\t\t\tset value(v) {\n\t\t\t\tmeshPlugin.transientSetState('scale', v)\n\t\t\t\treturn v\n\t\t\t},\n\n\t\t},\n\t\tposition: {\n\t\t\teventName: 'pluginStateChanged',\n\t\t\tdt: E2.core.datatypes.VECTOR,\n\t\t\tlabel: 'Position',\n\t\t\tget canEdit() {\n\t\t\t\treturn meshPlugin && meshPlugin.canEditPosition && meshPlugin.canEditPosition()\n\t\t\t},\n\t\t\tget value() {\n\t\t\t\tvar s = meshPlugin.state\n\t\t\t\treturn (s) ? s.position : null\n\t\t\t},\n\t\t\tset value(v) {\n\t\t\t\tmeshPlugin.transientSetState('position', v)\n\t\t\t\treturn v\n\t\t\t}\n\t\t},\n\t\trotation: {\t// internally wired to return xyz degree vector (for UI)\n\t\t\teventName: 'pluginStateChanged',\n\t\t\tdt: E2.core.datatypes.VECTOR,\n\t\t\tlabel: 'Rotation',\n\t\t\tget canEdit() {\n\t\t\t\treturn meshPlugin && meshPlugin.canEditQuaternion && meshPlugin.canEditQuaternion()\n\t\t\t},\n\t\t\tget _value() {\n\t\t\t\tvar s = meshPlugin.state\n\t\t\t\tif (!s) return null\n\t\t\t\treturn new THREE.Quaternion(s.quaternion._x, s.quaternion._y, s.quaternion._z, s.quaternion._w)\n\t\t\t},\n\t\t\tset _value(q) {\n\t\t\t\tmeshPlugin.transientSetState('quaternion', q)\n\t\t\t},\n\t\t\tget value() {\n\t\t\t\treturn this.makeVec3(this._value)\n\t\t\t},\n\t\t\tset value(v) {\n\t\t\t\tthis._value = this.makeQuaternion(v)\n\t\t\t\treturn v\n\t\t\t},\n\t\t\tmakeQuaternion : function(vec3) {\t// take vec3, return quaternion\n\t\t\t\treturn new THREE.Quaternion().setFromEuler(\n\t\t\t\t\tnew THREE.Euler(vec3.x / rad2deg , vec3.y / rad2deg , vec3.z / rad2deg, \"YZX\"))\n\t\t\t},\n\t\t\tmakeVec3 : function(quaternion) {\t// t\n\t\t\t\tvar vec3 = new THREE.Euler().setFromQuaternion(quaternion, \"YZX\").toVector3()\n\t\t\t\tvec3.x = vec3.x * rad2deg\n\t\t\t\tvec3.y = vec3.y * rad2deg\n\t\t\t\tvec3.z = vec3.z * rad2deg\n\t\t\t\treturn vec3\n\t\t\t}\n\t\t},\n\t\tget quaternion() {\n\t\t\treturn this.rotation\n\t\t},\n\t\tcommon : {\n\t\t\tget enabled() {\n\t\t\t\treturn that.isValidObjectSelection\n\t\t\t}\n\t\t}\n\t}\n\n\tif (meshPlugin && !this.selectedIsCamera) {\n\t\tadapter.meshProps = meshPlugin.parentNode.getInspectorSlotProps(['castShadow', 'receiveShadow', 'lock transform'])\n\t} else {\n\t\tadapter.meshProps = null\n\t}\n\n\treturn adapter\n}\n\nUIObjectProperties.prototype.render = function() {\n\t// for now mostly a placeholder\n\treturn UIAbstractProperties.prototype.render.call(this, arguments)\n}\n\nUIObjectProperties.prototype.onObjectPicked = function() {\n\tvar o = E2.app.worldEditor.getSelectedObjectPlugin()\n\tif (o)\n\t\tthis.selected = [o]\n\telse\n\t\tthis.selected = []\n\tthis.render()\n}\n\nUIObjectProperties.prototype.resetFlags = function(uid) {\t// typically from the mesh node\n\tvar flags = this.flags\n\tflags._uid = uid\n\tflags.scaleLinkXYZ = true\n}\n\nUIObjectProperties.prototype.onAttach = function() {\n\tvar that = this, dom = this.dom\n\n\tif (!this.isValidObjectSelection) {\n\t\tdom.container.toggleClass('noSelection', true)\n\t\treturn\n\t}\n\tdom.container.toggleClass('noSelection', false)\n\n\tdom.position.reset = document.getElementById('propertiesResetPosition')\n\tdom.scale.reset = document.getElementById('propertiesResetScale')\n\tdom.scale.linked = document.getElementById('propertiesLinkScale')\n\tdom.rotation.reset = document.getElementById('propertiesResetRotation')\n\n\n\tvar plugin = this.selectedEditorObjectMeshPlugin\n\n\tif (plugin) {\n\t\tthis.watchConnectionUpdates(plugin.parentNode)\n\t}\n\t// writing to the adapter .value results in a transientSetState, effectively an onChange\n\t// the endchange listener commits the new state via undoManager\n\tvar addListeners = function(control, propName, makeValue) {\n\t\tvar el = control.element\n\t\tvar endchange = function(e){\n\t\t\tif (e.detail) {\n\t\t\t\tvar newValue = (makeValue) ? makeValue(e.detail.value) : e.detail.value\n\t\t\t\tvar oldSourceValue = (makeValue) ? makeValue(e.detail.oldValue) : e.detail.oldValue\n\n\t\t\t\tif (!control.isEqualValue(e.detail.value, e.detail.oldValue))\n\t\t\t\t\tplugin.undoableSetState(propName, newValue, oldSourceValue)\n\t\t\t}\n\t\t}\n\t\tel.addEventListener('endchange', endchange)\n\t\tthat.detachQueue.push(function(){\n\t\t\tel.removeEventListener('endchange', endchange)\n\t\t})\n\t}\n\n\t// the reset handler will set prop to whatever getResetValue() returns.\n\t// getResetValue is optional\n\tvar makeResetHandler = function(prop, getResetValue) {\n\t\tif (!prop) {\n\t\t\tconsole.error('no property name for reset button')\n\t\t\treturn null\n\t\t}\n\t\tgetResetValue = getResetValue || function(){return {x:0,y:0,z:0}}\n\t\treturn function(e) {\t\t// normal dom event\n\t\t\te.preventDefault()\n\t\t\te.stopPropagation()\n\t\t\tif (!that.adapter[prop].canEdit) return\n\t\t\tvar s = plugin.state\n\t\t\tif (!s) return\n\t\t\tvar undo = _.cloneDeep(s[prop])\n\t\t\tvar rv = getResetValue(s[prop])\n\t\t\tplugin.undoableSetState(prop, rv, undo)\n\t\t\treturn false\n\t\t}\n\t}\n\n\tif (this.controls.position) {\n\t\taddListeners(this.controls.position.control, 'position')\n\t\t$(this.dom.position.reset).on('click.uiProperties',\n\t\t\tmakeResetHandler('position', function(){\n\t\t\t\tif (!that.selectedIsCamera)\n\t\t\t\t\treturn {x:0.0, y:2.0, z:0.0}\n\t\t\t\telse\n\t\t\t\t\treturn {x:0.0, y:0.8, z:2.0}\n\t\t\t})\n\t\t)\n\t}\n\n\tif (this.controls.scale) {\n\t\taddListeners(this.controls.scale.control, 'scale')\n\t\t$(this.dom.scale.reset).on('click.uiProperties',\n\t\t\tmakeResetHandler('scale', function(){\n\t\t\t\treturn {x: 1.0, y:1.0, z:1.0}\n\t\t\t})\n\t\t)\n\t\tthis.controls.scaleLinked = new UIToggleButton(\n\t\t\tthis.controls.scale.control,\n\t\t\t'linkXYZ',\n\t\t\tdom.scale.linked,\n\t\t\tfunction(e, v) {\n\t\t\t\tthat.flags.scaleLinkXYZ = v\n\t\t\t}\n\t\t)\n\t}\n\n\tif (this.controls.rotation) {\n\t\taddListeners(this.controls.rotation.control, 'quaternion', this.adapter.rotation.makeQuaternion)\n\t\t$(this.dom.rotation.reset).on('click.uiProperties',\n\t\t\tmakeResetHandler('quaternion', function(){\n\t\t\t\treturn that.adapter.rotation.makeQuaternion({x:0.0,y:0.0,z:0.0})\n\t\t\t})\n\t\t)\n\t}\n\n\tthis.update()\n}\n\n\nUIObjectProperties.prototype.onDetach = function() {\n\n\tvar updateControls = function(controlProps, adapterProps) {\n\t\tObject.keys(controlProps).forEach(function (key) {\n\t\t\tvar control = controlProps[key].control\n\t\t\tcontrol.onSourceChange()\n\t\t\tif (adapterProps[key].canEdit)\n\t\t\t\tcontrol.enable()\n\t\t\telse\n\t\t\t\tcontrol.disable()\n\t\t})\n\t}\n\n\t// manage our own proxy controls\n\n\tif (this.controls.scaleLinked) {\n\t\tthis.controls.scaleLinked.destroy()\n\t\tthis.controls.scaleLinked = null\n\t}\n\n\tif (this.controls.position) {\n\t\tthis.controls.position.control.destroy()\n\t\tthis.controls.position.control = null\n\t}\n\n\tif (this.controls.scale) {\n\t\tthis.controls.scale.control.destroy()\n\t\tthis.controls.scale.control = null\n\t}\n\n\tif (this.controls.rotation) {\n\t\tthis.controls.rotation.control.destroy()\n\t\tthis.controls.rotation.control = null\n\t}\n\n\tif (this.controls.meshProps)\n\t\tupdateControls(this.controls.meshProps, this.adapter.stateProps)\n\n\t// one-shot buttons (e.g. reset) are wired directly via .uiProperties events\n\t// such listeners will be detached by the abstract base\n\n}\n\nUIObjectProperties.prototype.getControls = function() {\n\n\tvar that = this,\n\t\tadapter = this.adapter,\n\t\tflags = this.flags,\n\t\tcontrols = {}\n\n\tvar meshPlugin = this.selectedEditorObjectMeshPlugin\t\t// obj3d/mesh plugin\n\n\tfunction make3dProp(propName, opts) {\n\t\tvar meshNode = meshPlugin.parentNode\n\t\tvar c = that._makeControl(meshNode, adapter, propName, null, opts)\n\t\tif (!adapter[propName].canEdit) c.disable()\n\n\t\treturn {\n\t\t\tcontrol:c,\n\t\t\tdtName: c.dt.name,\n\t\t\tlabel: \tc.label\n\t\t}\n\t}\n\n\n\tif (meshPlugin) {\n\t\tvar meshNode = meshPlugin.parentNode\n\t\tif (meshNode.uid !== flags._uid) \t// reset for any new object selected\n\t\t\tthis.resetFlags(meshNode.uid)\n\n\t\tcontrols.position = make3dProp('position')\n\t\tcontrols.rotation = make3dProp('quaternion', {\n\t\t\tmin: -36000.0,\n\t\t\tmax: 36000.0,\n\t\t\tsize: 72000\t// 1px per deg\n\t\t})\n\n\t\tif (!this.selectedIsCamera) {\n\n\t\t\tcontrols.scale = make3dProp('scale')\n\t\t\tcontrols.scale.control.linkXYZ = this.flags.scaleLinkXYZ\n\n\t\t\tcontrols.meshProps = {}\n\n\t\t\tvar meshProps = adapter.meshProps\n\t\t\tvar makeControl = this._makeControl\n\n\t\t\tObject.keys(meshProps).forEach(function (key) {\n\t\t\t\tthat.uifySlotProxy(meshNode, key, meshProps[key])\n\t\t\t\tvar c = makeControl(meshNode, meshProps, key)\n\t\t\t\tif (!c) {\n\t\t\t\t\tconsole.error('could not make control for ' + key)\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tthat.detachQueue.push(c.destroy.bind(c))\n\n\t\t\t\tif (that.slotsThatTriggerUpdate.indexOf(key) !== -1) {\n\t\t\t\t\tc._onSourceChange = c.onSourceChange\n\t\t\t\t\tc.onSourceChange = function(){\n\t\t\t\t\t\tc._onSourceChange.call(this, arguments)\n\t\t\t\t\t\tthat.queueUpdate()\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcontrols.meshProps[key] = {\n\t\t\t\t\tdtName: c.dt.name,\n\t\t\t\t\tlabel: c.label,\n\t\t\t\t\tcontrol: c\n\t\t\t\t}\n\n\t\t\t})\n\t\t}\n\t}\n\telse\n\t\tthis.resetFlags(null)\n\n\treturn controls\n}\n\n\nUIObjectProperties.prototype.update = function() {\t// soft updates the template already in place\n\n\tvar that = this, adapter = this.adapter\n\n\tvar canUpdate = this.isValidNodeSelection || this.isValidObjectSelection\n\tif (!canUpdate)\n\t\treturn\n\n\tif (this.isValidObjectSelection) {\n\t\t['position', 'rotation', 'scale'].forEach(function (propName) {\n\t\t\tvar prop = that.controls[propName]\n\t\t\tif (!prop) return\n\t\t\tif (that.adapter[propName].canEdit)\n\t\t\t\tprop.control.enable()\n\t\t\telse\n\t\t\t\tprop.control.disable()\n\t\t})\n\t}\n\n\t// these only exist as dom elements\n\tvar pos = this.dom.position, rot = this.dom.rotation, scl = this.dom.scale\n\tif (pos && pos.reset) {\n\t\tpos.reset.disabled = this.isValidObjectSelection && !adapter.position.canEdit\n\t}\n\tif (scl && scl.reset) {\n\t\tscl.reset.disabled = this.isValidObjectSelection && !adapter.scale.canEdit\n\t\tscl.linked.disabled = this.isValidObjectSelection && !adapter.scale.canEdit\n\t}\n\tif (rot && rot.reset) {\n\t\trot.reset.disabled = this.isValidObjectSelection && !adapter.rotation.canEdit\n\t}\n\n}\n"
  },
  {
    "path": "browser/scripts/ui/uiProxyCheckbox.js",
    "content": "var UICheckbox = function UICheckbox(obj, propertyName, domElement, onChange) {\n\tUIAbstractProxy.apply(this, arguments)\n}\nUICheckbox.prototype = Object.create(UIAbstractProxy.prototype)\nUICheckbox.prototype.constructor = UICheckbox\n\nUICheckbox.prototype.getAdapter = function(obj, propertyName){\n\tvar that = this\n\treturn {\n\t\tget sourceValue() {\n\t\t\treturn !!obj[propertyName]\n\t\t},\n\t\tset sourceValue(v) {\n\t\t\treturn obj[propertyName] = !!v\n\t\t},\n\t\tget uiValue() {\n\t\t\treturn that.element.checked\n\t\t},\n\t\tset uiValue(v) {\n\t\t\treturn that.element.checked = !!v\n\t\t}\n\t}\n}\n\nUICheckbox.prototype.newElement = function() {\n\tvar domElement = document.createElement('INPUT')\n\tdomElement.setAttribute('type', 'checkbox')\n\treturn domElement\n}\n\nUICheckbox.prototype.checkValidElement = function(domElement) {\n\t return (domElement.tagName === 'INPUT')  &&  (domElement.getAttribute('type') === 'checkbox')\n}\n"
  },
  {
    "path": "browser/scripts/ui/uiProxyTextField.js",
    "content": "var UITextField = function UITextField() {\n\tUIAbstractProxy.apply(this, arguments)\n}\nUITextField.prototype = Object.create(UIAbstractProxy.prototype)\nUITextField.prototype.constructor = UITextField\n\nUITextField.prototype.getAdapter = function(obj, propertyName){\n\tvar that = this\n\treturn {\n\t\tget sourceValue() {\n\t\t\tvar sv = obj[propertyName]\n\t\t\treturn (sv || (sv === 0)) ? sv.toString() : ''\n\t\t},\n\t\tset sourceValue(v) {\n\t\t\treturn obj[propertyName] = v.toString()\n\t\t},\n\t\tget uiValue() {\n\t\t\treturn that.element.value\n\t\t},\n\t\tset uiValue(v) {\n\t\t\treturn that.element.value = v\n\t\t}\n\t}\n}\n\nUITextField.prototype.newElement = function() {\n\tvar domElement = document.createElement('INPUT')\n\tdomElement.setAttribute('type', 'text')\n\treturn domElement\n}\n\nUITextField.prototype.checkValidElement = function(domElement) {\n\t return (domElement.tagName === 'INPUT')  &&  (domElement.getAttribute('type') === 'text')\n}\n\n\n\nvar UIFloatField = function UIFloatField() {\n\tthis.precision = 2\t// .toFixed(N)\n\tUITextField.apply(this, arguments)\n}\nUIFloatField.prototype = Object.create(UITextField.prototype)\nUIFloatField.prototype.constructor = UIFloatField\nUIFloatField.prototype.getAdapter = function(obj, propertyName){\n\tvar that = this\n\treturn {\n\t\tget sourceValue() {\n\t\t\tvar sv = obj[propertyName]\n\t\t\treturn (sv || (sv === 0)) ? sv : ''\n\t\t},\n\t\tset sourceValue(v) {\n\t\t\treturn obj[propertyName] = v ? parseFloat(v) : v\n\t\t},\n\t\tget uiValue() {\n\t\t\tvar v = parseFloat(that.element.value)\n\t\t\treturn (!isNaN(v)) ? v : null\n\t\t},\n\t\tset uiValue(v) {\n\t\t\tif (v || v === 0)\n\t\t\t\treturn that.element.value = !isNaN(v) ? v.toFixed(that.precision) : ''\n\t\t\treturn ''\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "browser/scripts/ui/uiProxyToggleButton.js",
    "content": "// allows a button to toggle an object var directly\nvar UIToggleButton = function UIToggleButton() {\n\tUIAbstractProxy.apply(this, arguments)\n}\nUIToggleButton.prototype = Object.create(UIAbstractProxy.prototype)\nUIToggleButton.prototype.constructor = UIToggleButton\n\nUIToggleButton.prototype.getAdapter = function(){\n\tvar that = this\n\tvar obj = this.obj, propertyName = this.propertyName\n\treturn {\n\t\tget sourceValue() {\n\t\t\treturn !!obj[propertyName]\n\t\t},\n\t\tset sourceValue(v) {\n\t\t\treturn obj[propertyName] = !!v\n\t\t},\n\t\tget uiValue() {\n\t\t\treturn that.element.dataset.state === 'on'\n\t\t},\n\t\tset uiValue(v) {\n\t\t\tthat.element.dataset.state = (v) ? 'on' : 'off'\n\t\t\tthat.element.classList.toggle('uiToggle_on', !!v)\n\t\t\tthat.element.classList.toggle('uiToggle_off', !v)\n\t\t\treturn that.element.dataset.state\n\t\t}\n\t}\n}\n\nUIToggleButton.prototype.newElement = function() {\n\tvar domElement = document.createElement('BUTTON')\n\tdomElement.dataset.state = 'off'\n\tdomElement.className = 'uiToggle'\n\treturn domElement\n}\n\nUIToggleButton.prototype.checkValidElement = function(domElement) {\n\tvar typ = domElement.getAttribute('type') || ''\n\treturn (domElement.tagName === 'BUTTON')  &&  (typ.toLowerCase() !== 'submit')\n}\n\nUIToggleButton.prototype.attach = function() {\n\tthis._toggle = function(e) {\n\t\tthis.adapter.uiValue = !this.adapter.uiValue\n\t\tthis._onUIChange(e)\n\t}.bind(this)\n\tthis.element.addEventListener('click', this._toggle)\n}\n\nUIToggleButton.prototype.detach = function() {\n\tif (this._toggle)\n\t\tthis.element.removeEventListener('click', this._toggle)\n}"
  },
  {
    "path": "browser/scripts/ui/uiProxyVec3.js",
    "content": "var UIVector3 = function UIVector3(obj, propertyName, domElement, onChange, opts) {\n\tthis.dom = {}\t// reference to x, y, z controls\n\tthis.changeIndicatorDuration = 50\n\tthis.precision = 2\n\tthis._enabled = true\n\tthis.opts = opts || {}\n\tthis.linkXYZ = false\n\n\tthis.dragger = {\n\t\tx:null,\n\t\ty:null,\n\t\tz:null\n\t}\n\tUIAbstractProxy.apply(this, arguments)\n}\nUIVector3.prototype = Object.create(UIAbstractProxy.prototype)\nUIVector3.prototype.constructor = UIVector3\n\nUIVector3.prototype.getAdapter = function(obj, propertyName){\n\tvar that = this\n\tvar formatter = function(v) {\n\t\tif (isNaN(v) || (typeof v.toFixed === 'undefined')) return v\n\t\treturn v.toFixed(that.precision)\n\t}\n\n\tvar sv = obj[propertyName]\n\tvar sourceIsThreeVec3 = (sv instanceof THREE.Vector3)\n\n\tvar isVec3 = function(v) {\n\t\tif (sourceIsThreeVec3)\n\t\t\treturn (v instanceof THREE.Vector3)\n\t\telse\n\t\t\treturn (typeof v.x !== 'undefined') && (typeof v.y !== 'undefined') && (typeof v.z !== 'undefined')\n\t}\n\tvar makeVec3 = function(x,y,z) {\n\t\tif (sourceIsThreeVec3)\n\t\t\treturn new THREE.Vector3(x,y,z)\n\t\telse\n\t\t\treturn {x: x, y: y, z: z}\n\t}\n\t// indicator timeouts\n\tvar timeouts = {}\n\treturn {\n\t\t_uiVec : { // holds uiValues with full precision\n\t\t\tx:0.0, y:0.0, z:0.0\n\t\t},\n\t\tget sourceValue() {\n\t\t\tvar sv = obj[propertyName]\n\t\t\tif (!isVec3(sv))\n\t\t\t\treturn makeVec3(sv.x, sv.y, sv.z)\n\t\t\treturn sv\n\t\t},\n\t\tset sourceValue(v) {\n\t\t\tif (!isVec3(v))\n\t\t\t\tv = makeVec3(v.x, v.y, v.z)\n\t\t\treturn obj[propertyName] = v\n\t\t},\n\t\tget uiValue() {\n\t\t\treturn makeVec3(this._uiVec.x, this._uiVec.y, this._uiVec.z)\n\t\t},\n\t\tset uiValue(v) {\n\t\t\tif (typeof v.x === 'undefined') return\n\t\t\tthis._uiVec.x = v.x\n\t\t\tthis._uiVec.y = v.y\n\t\t\tthis._uiVec.z = v.z\n\t\t\tthis._updateDom()\n\t\t\treturn v\n\t\t},\n\t\t_updateDom : function() {\n\t\t\tvar dom = that.dom\n\t\t\tvar changeDomPart = function(xyz) {\n\t\t\t\tvar fv = formatter(this._uiVec[xyz])\n\t\t\t\tvar oldText = dom[xyz].innerHTML\n\t\t\t\tif (fv !== dom[xyz].innerHTML) {\n\t\t\t\t\tdom[xyz].innerHTML = fv\n\t\t\t\t\tif (oldText) {\n\t\t\t\t\t\tdom[xyz].classList.add('changed')\n\t\t\t\t\t\tif (timeouts[xyz]) clearTimeout(timeouts[xyz])\n\t\t\t\t\t\ttimeouts[xyz] = setTimeout(function () {\n\t\t\t\t\t\t\tif (dom[xyz]) dom[xyz].classList.remove('changed')\n\t\t\t\t\t\t}, that.changeIndicatorDuration)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}.bind(this)\n\t\t\tchangeDomPart('x')\n\t\t\tchangeDomPart('y')\n\t\t\tchangeDomPart('z')\n\t\t},\n\t\tget uiX() {\n\t\t\tvar v = parseFloat(that.dom.x.innerHTML)\n\t\t\treturn (isNaN(v)) ? 0.0 : v\n\t\t},\n\t\tset uiX(v) {\n\t\t\tthis._uiVec.x = isNaN(v) ? 0.0 : v\n\t\t\tthis._updateDom()\n\t\t\treturn v\n\t\t},\n\t\tget uiY() {\n\t\t\tvar v = parseFloat(that.dom.y.innerHTML)\n\t\t\treturn (isNaN(v)) ? 0.0 : v\n\t\t},\n\t\tset uiY(v) {\n\t\t\tthis._uiVec.y = isNaN(v) ? 0.0 : v\n\t\t\tthis._updateDom()\n\t\t\treturn v\n\t\t},\n\t\tget uiZ() {\n\t\t\tvar v = parseFloat(that.dom.z.innerHTML)\n\t\t\treturn (isNaN(v)) ? 0.0 : v\n\t\t},\n\t\tset uiZ(v) {\n\t\t\tthis._uiVec.z = isNaN(v) ? 0.0 : v\n\t\t\tthis._updateDom()\n\t\t\treturn v\n\t\t}\n\t}\n}\n\nUIVector3.prototype.newElement = function() {\n\tvar domElement = document.createElement('UL')\n\tvar liX = document.createElement('LI'),\n\t\tliY = document.createElement('LI'),\n\t\tliZ = document.createElement('LI')\n\n\tvar elX = document.createElement('SPAN'),\n\t\telY = document.createElement('SPAN'),\n\t\telZ = document.createElement('SPAN')\n\n\tliX.appendChild(elX)\n\tliY.appendChild(elY)\n\tliZ.appendChild(elZ)\n\tdomElement.appendChild(liX)\n\tdomElement.appendChild(liY)\n\tdomElement.appendChild(liZ)\n\n\tliX.className = 'xyz-x'\n\tliY.className = 'xyz-y'\n\tliZ.className = 'xyz-z'\n\tdomElement.className = 'xyz'\n\n\treturn domElement\n}\n\nUIVector3.prototype.attach = function() {\n\tvar that = this\n\tvar el = this.element, adapter = this.adapter\n\tvar spans = el.getElementsByTagName('span')\n\tthis.dom.x = spans[0]\n\tthis.dom.y = spans[1]\n\tthis.dom.z = spans[2]\n\n\tvar map = {\n\t\tx: 'uiX',\n\t\ty: 'uiY',\n\t\tz: 'uiZ'\n\t}\n\n\tfunction _makeParseTextInput(min, max) {\n\t\tvar clamp = THREE.Math.clamp\n\t\tvar ops = {\n\t\t\tmultiply: function(v, ov) { return ov*v},\n\t\t\tdivide: function(v,ov) { return (v !== 0) ? ov/v : ov},\n\t\t\tadd: function(v,ov) { return ov+v},\n\t\t\tsubtract: function(v,ov) { return ov-v}\n\t\t}\n\t\treturn function(inputValue, oldValue, transient) {\n\t\t\tvar input = inputValue\n\t\t\tvar op = null\n\t\t\tif (input) {\n\t\t\t\tif (input.startsWith('++')) {\n\t\t\t\t\tinput = input.substring(2)\n\t\t\t\t\top = ops.add\n\t\t\t\t}\n\t\t\t\telse if (input.startsWith('--')) {\n\t\t\t\t\tinput = input.substring(2)\n\t\t\t\t\top = ops.subtract\n\t\t\t\t}\n\t\t\t\telse if (input.startsWith('*')) {\n\t\t\t\t\tinput = input.substring(1)\n\t\t\t\t\top = ops.multiply\n\t\t\t\t}\n\t\t\t\telse if (input.startsWith('/')) {\n\t\t\t\t\tinput = input.substring(1)\n\t\t\t\t\top = ops.divide\n\t\t\t\t}\n\n\t\t\t\tif (op) {\n\t\t\t\t\tinput = parseFloat(input)\n\t\t\t\t\tif (isFinite(input))\n\t\t\t\t\t\tinputValue = input\n\t\t\t\t\telse\n\t\t\t\t\t\top = null\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (transient && op)\n\t\t\t\treturn false\n\t\t\t\n\t\t\tvar v = parseFloat(inputValue)\n\t\t\tif (isNaN(v)) return false\n\t\t\tif (!isFinite(v)) return false\n\t\t\tvar newValue = clamp(v, min, max)\n\t\t\treturn (op) ? op(newValue, oldValue) : newValue\n\t\t}\n\t}\n\t\n\tfunction enableEntry(domElement, xyz, opts) {\n\t\tif (!domElement) return\n\t\topts = _.extend({\n\t\t\tmin : -1000.0,\n\t\t\tmax : 1000.0,\n\t\t\tstep : 0.01,\n\t\t\tsize : 100000,\n\t\t\ttextInputParentNode : that.dom[xyz].parentNode,\n\n\t\t\tgetValue : function () {\n\t\t\t\treturn adapter.sourceValue[xyz]\n\t\t\t}\n\t\t}, opts)\n\n\t\tvar oldValue = null, previousValue = null\n\n\t\tvar onStart = function(){\n\t\t\tthat.isStillChanging = true\n\t\t\tif (oldValue === null)\n\t\t\t\toldValue \t= _.clone(adapter.sourceValue)\n\n\t\t\tel.dispatchEvent(new CustomEvent('beginchange', {\n\t\t\t\tdetail: {\n\t\t\t\t\tvalue: oldValue,\n\t\t\t\t\tpart: xyz\n\t\t\t\t}\n\t\t\t}))\n\t\t}\n\t\tvar onChange = function(v, oldV, isTransient) {\n\t\t\tpreviousValue = _.clone(adapter.uiValue)\n\t\t\tif (oldValue === null)\n\t\t\t\toldValue \t= _.clone(adapter.sourceValue)\n\t\t\tif (that.linkXYZ) {\n\t\t\t\t// xyz is 'x', 'y', or 'z'\n\t\t\t\tvar ov = oldValue[xyz],\n\t\t\t\t\tox = oldValue.x,\n\t\t\t\t\toy = oldValue.y,\n\t\t\t\t\toz = oldValue.z,\n\t\t\t\t\tscaleDelta,\n\t\t\t\t\toldWasZeros = (ox === 0.0) && (oy === 0.0) && (oz === 0.0)\n\n\t\t\t\tif (!oldWasZeros) {\n\t\t\t\t\t// normal op\n\t\t\t\t\tscaleDelta = (v - oldValue[xyz]) / ov\n\t\t\t\t\tadapter[map.x] = oldValue.x + scaleDelta * ox\n\t\t\t\t\tadapter[map.y] = oldValue.y + scaleDelta * oy\n\t\t\t\t\tadapter[map.z] = oldValue.z + scaleDelta * oz\n\t\t\t\t} else {\n\t\t\t\t\t// recover from edge case\n\t\t\t\t\tscaleDelta = v - oldValue[xyz]\n\t\t\t\t\tadapter[map.x] = oldValue.x + scaleDelta\n\t\t\t\t\tadapter[map.y] = oldValue.y + scaleDelta\n\t\t\t\t\tadapter[map.z] = oldValue.z + scaleDelta\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tadapter[map[xyz]] = v\n\n\t\t\tvar evt = new CustomEvent('change', {\n\t\t\t\tdetail: {\n\t\t\t\t\tvalue: _.clone(adapter.uiValue),\n\t\t\t\t\tpreviousValue: previousValue,\n\t\t\t\t\toldValue: oldValue,\n\t\t\t\t\tpart: xyz,\n\t\t\t\t\ttransient: isTransient\n\t\t\t\t}\n\t\t\t})\n\t\t\tel.dispatchEvent(evt)\n\t\t}\n\t\tvar onEnd = function(){\n\t\t\tthat.isStillChanging = false\n\t\t\tvar e = new CustomEvent('endchange', {\n\t\t\t\tdetail:{\n\t\t\t\t\tvalue: _.clone(adapter.uiValue),\n\t\t\t\t\tpreviousValue: previousValue,\n\t\t\t\t\toldValue: oldValue,\n\t\t\t\t\tpart: xyz\n\t\t\t\t}\n\t\t\t})\n\t\t\tel.dispatchEvent(e)\n\t\t}\n\t\topts.parseTextInput = _makeParseTextInput(opts.min, opts.max)\n\t\topts.allowTransientTextInput = true\n\t\t\n\t\tthat.dragger[xyz] = uiMakeDragToAdjust(domElement, onStart, onChange, onEnd, opts)\n\t\tdomElement.addEventListener('tabToNext', function(e){\n\t\t\te.stopPropagation()\n\t\t\tvar next = null\n\t\t\tvar shiftPressed = E2 && E2.ui && E2.ui.flags.pressedShift\n\t\t\tswitch (xyz) {\n\t\t\t\tcase 'x':\n\t\t\t\t\tif (!shiftPressed)\n\t\t\t\t\t\tnext = that.dom.y\n\t\t\t\t\tbreak\n\t\t\t\tcase 'y':\n\t\t\t\t\tnext = (shiftPressed) ? that.dom.x : that.dom.z\n\t\t\t\t\tbreak\n\t\t\t\tcase 'z':\n\t\t\t\t\tif (shiftPressed) next = that.dom.y\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t\tif (next)\n\t\t\t\tnext.dispatchEvent(new CustomEvent('dblclick'))\n\t\t\treturn false\n\t\t})\n\t}\n\n\tenableEntry(this.dom.x, 'x', this.opts)\n\tenableEntry(this.dom.y, 'y', this.opts)\n\tenableEntry(this.dom.z, 'z', this.opts)\n\n\tel.addEventListener('change', this._onUIChange.bind(this))\n}\n\nUIVector3.prototype.detach = function() {\n\tif (this.dragger.x) {\n\t\tthis.dragger.x.detach()\n\t\tthis.dragger.x = null\n\t}\n\tif (this.dragger.y) {\n\t\tthis.dragger.y.detach()\n\t\tthis.dragger.y = null\n\t}\n\tif (this.dragger.z) {\n\t\tthis.dragger.z.detach()\n\t\tthis.dragger.z = null\n\t}\n\tUIAbstractProxy.prototype.detach.call(this)\n}\nUIVector3.prototype.checkValidElement = function(domElement) {\t// we want an element with three child spans\n\treturn (domElement instanceof Element) && (domElement.getElementsByTagName('span').length = 3)\n}\n\nUIVector3.prototype.onEnabledChange = function() {\n\tif (this.element) {\n\t\tthis.element.classList.toggle('uiEnabled',   this._enabled)\n\t\tthis.element.classList.toggle('uiDisabled', !this._enabled)\n\t}\n}\n\nUIVector3.prototype.isEqualValue = function(v1, v2) {\n\treturn (v1.x === v2.x) && (v1.y === v2.y) && (v1.z === v2.z)\n}\n\nUIVector3.prototype.onSourceChange = function() {\n\tif (this.isStillChanging) return\n\tUIAbstractProxy.prototype.onSourceChange.call(this)\n}\n"
  },
  {
    "path": "browser/scripts/ui/uiTextArea.js",
    "content": "/**\n * custom-resizable text area housed in a div container\n * the change handlers will be called upon text entry and resizing, as follows:\n * textarea: focus = begin,  change = end, blur = end\n * resizer:  dragstart = begin, drag = change, dragend = end\n *\n * @param adapter - object containing {text, width, height} properties.\n * @param onBeginChange function|null called as described above\n * @param onChange\n * @param onEndChange\n * @uses UIDragAwareHelper\n * @constructor\n */\nvar UITextArea = function UITextArea(adapter, onBeginChange, onChange, onEndChange) {\n\tvar that = this\n\n\tvar paddingPx = 2\n\tvar borderPx = 0\n\n\tvar dummyCall = function() { return true }\n\tonBeginChange = onBeginChange || dummyCall\n\tonChange = onChange || dummyCall\n\tonEndChange = onEndChange || dummyCall\n\n\tvar container = $('<div style=\"position:relative\"></div>')\n\tvar textarea = $('<textarea placeholder=\"Type text here\" />')\n\tvar resizer = $('<svg class=\"resizecorner\"><use xlink:href=\"#resizecorner\"></use></svg>')\n\n\tcontainer.append(textarea)\n\tcontainer.append(resizer)\n\tcontainer.css({\n\t\t'width':\t\tadapter.width + 'px',\n\t\t'height':\t\tadapter.width + 'px',\n\t})\n\tcontainer.addClass('uiTextArea')\n\n\ttextarea.css({\n\t\t'width'\t\t: adapter.width + 'px',\n\t\t'height'\t: adapter.width + 'px',\n\t\t'resize' \t: 'none',\n\t\t'position' \t: 'absolute',\n\t\t'z-index' \t: 1,\n\t\t'pointer-events': 'initial'\n\t})\n\n\tresizer.css({\n\t\t'position' \t: 'absolute',\n\t\t'bottom' \t: '-8px',\n\t\t'right' \t: '-8px',\n\t\t'z-index' \t: 2\n\t})\n\n\tvar drag = this.dragAware = new UIDragAwareHelper(resizer[0])\n\tvar ow = adapter.width, oh = adapter.height\n\n\tresizer.on(drag.dragEvents.start, function() {\n\t\ttextarea.trigger('blur')\n\t\tow = adapter.width\n\t\toh = adapter.height\n\t\tonBeginChange()\n\t})\n\n\tresizer.on(drag.dragEvents.move, function(e) {\n\t\tvar data = e.originalEvent.detail\n\t\tif (! (data && data.delta)) return\n\t\tvar dx = data.startDelta.x, dy = data.startDelta.y\n\t\tadapter.width = ow + dx\n\t\tadapter.height = oh + dy\n\t\tonChange()\n\t})\n\n\tresizer.on(drag.dragEvents.end, onEndChange)\n\n\ttextarea.on('focus', onBeginChange)\n\ttextarea.on('change blur', function(){\n\t\tadapter.text = textarea.val()\n\t\tonEndChange()\n\t})\n\n\tthis.dom = container\n\n\tthis.update = function() {\n\t\ttextarea.val(adapter.text)\n\n\t\tif (adapter.width > 0) {\n\t\t\ttextarea.css('width', adapter.width +  2*paddingPx + 2* borderPx + 'px')\n\t\t\tcontainer.css('width', adapter.width +  2*paddingPx + 2* borderPx + 'px')\n\t\t}\n\n\t\tif (adapter.height > 0) {\n\t\t\ttextarea.css('height', adapter.height + 2*paddingPx + 2* borderPx + 'px')\n\t\t\tcontainer.css('height', adapter.height + 3 + 2*paddingPx + 2* borderPx + 'px')\n\t\t}\n\t}\n\n\tthis.destroy = function() {\n\t\ttextarea.off()\n\t\tdrag.detach()\n\t\tcontainer.remove()\n\t\tadapter = null\n\t\tthat = null\n\t}\n}"
  },
  {
    "path": "browser/scripts/ui/xhrForm.js",
    "content": "if (typeof VizorUI === 'undefined')\n\tvar VizorUI = {}\n\nif (typeof uiEvent === 'undefined')\n\tuiEvent = {}\n\nuiEvent.xhrFormSuccess\t= 'xhrFormSuccess'\t\t//\tdispatched on document\nuiEvent.xhrFormUIReset\t= 'xhrFormUIReset'\t\t//\tdispatched on form\n\n/**\n * enables a form to submit and process its response via xhr call\n * validation is done in backend\n * @param $form\n * @param onSuccess\n */\nVizorUI.setupXHRForm = function($form, onSuccess) {\t// see views/account/signup for example\n\n\tif ($form.length !== 1)\n\t\treturn console.error('must call with exactly 1 form')\n\n\tvar xhrEnabled = $form.data('xhrenabled')\n\tif (xhrEnabled) {\n\t\tmsg(\"ERROR: setupXHRForm but form already enabled \" + $form.attr('id'))\n\t\treturn false\n\t}\n\n\tvar hasFiles = $form.length && ($form[0].querySelectorAll('input[type=\"file\"]').length > 0)\n\n\tif (typeof onSuccess !== 'function') {\n\t\tonSuccess = function(response) {\n\t\t\tif (response && (typeof response.redirect !== 'undefined') && (response.redirect)) {\n\t\t\t\twindow.location.href = response.redirect\n\t\t\t\treturn\n\t\t\t}\n\t\t\t// append a message to form\n\t\t\tvar message = jQuery('<p></p>')\n\t\t\t\t\t\t\t.text(response.message)\n\t\t\t\t\t\t\t.addClass('xhr success message')\n\t\t\t$form.append(message)\n\t\t\t$form.find(':focus').trigger('blur')\n\n\t\t\tvar detail = {\n\t\t\t\tid: \t\t$form.attr('id'),\n\t\t\t\tresponse: \tresponse\n\t\t\t}\n\t\t\tvar successEvent = new CustomEvent(uiEvent.xhrFormSuccess, {detail: detail});\n\t\t\tdocument.dispatchEvent(successEvent)\n\t\t}\n\t}\n\n\t$form.find('input, textarea').each(function(){\n\t\tvar $this = jQuery(this)\n\t\tvar placeholder = $this.attr('placeholder')\n\t\tvar required = $this.hasClass('required')\n\t\tvar had_error = false\n\t\tvar had_error_value = false\n\t\tif (placeholder) {\n\t\t\tif (required) placeholder += '*'\n\t\t\t$this.attr('placeholder', placeholder)\n\t\t\t$this.on('focus', function(){\n\t\t\t\thad_error = $this.parent().hasClass('error')\n\t\t\t\thad_error_value = (had_error) ? $this.val() : false\n\t\t\t\t$this.parent().removeClass('error').find('span.message').html('')\n\t\t\t\t$this.addClass('in_focus')\n\t\t\t\t// ux\n\t\t\t\t//\t$this.data('placeholder', placeholder);\n\t\t\t\t//\t$this.attr('placeholder', '');\n\t\t\t\treturn true\n\t\t\t});\n\n\t\t\t$this.on('blur', function(){\n\t\t\t\t// ux\n\t\t\t\t//\t$this.attr('placeholder', $this.data('placeholder'));\n\t\t\t\t$this.removeClass('in_focus')\n\t\t\t\tif (required && had_error &&\n\t\t\t\t\t(($this.val() === '') || ($this.val() === had_error_value)) ) {\n\t\t\t\t\t// then\n\t\t\t\t\t\t$this.parent().addClass('error')\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t})\n\t\t}\n\t})\n\n\n\tvar inProgress = false\n\tvar $body = jQuery(document.body)\n\t$form\n\t\t.removeClass('hasMessage')\n\t\t.addClass('noMessage')\n\n\n\tvar $unknownError = jQuery('#unknown_error', $form)\n\t\tif ($unknownError.length < 1)\n\t\t\t$unknownError = jQuery('.genericError', $form)\n\n\tvar resetUIstate = function() {\n\t\t$form\n\t\t\t.attr('data-lastresult', null)\n\t\t\t.attr('data-laststatus', null)\n\n\t\t$form.not('.keepMessage')\n\t\t\t.removeClass('hasMessage')\n\t\t\t.addClass('noMessage')\n\n\t\t$form.find('p.xhr.success.message').remove()\n\t\t$form.find('span.message').html('')\n\t\t$form.find('div.form-input').removeClass('error')\n\n\t\tif (!$form.hasClass('keepMessage'))\n\t\t\t$unknownError.html('').hide()\n\n\t\t$form[0].dispatchEvent(new CustomEvent(uiEvent.xhrFormUIReset))\n\t}\n\n\tvar bindResetUIOnInputAfterResponse = function() {\n\t\tvar inputs = $form[0].querySelectorAll('input,textarea')\n\t\tvar other = $form[0].querySelectorAll('select, input[type=\"radio\"]')\n\n\t\tvar resetAndRemove = function() {\n\t\t\tresetUIstate()\n\t\t\tArray.prototype.forEach.call(inputs, function(el) {\n\t\t\t\tel.removeEventListener('input', resetAndRemove)\n\t\t\t})\n\t\t\tArray.prototype.forEach.call(other, function(el) {\n\t\t\t\tel.removeEventListener('change', resetAndRemove)\n\t\t\t})\n\t\t}\n\t\tArray.prototype.forEach.call(inputs, function(el){\n\t\t\tel.addEventListener('input', resetAndRemove)\n\t\t})\n\t\tArray.prototype.forEach.call(other, function(el){\n\t\t\tel.addEventListener('change', resetAndRemove)\n\t\t})\n\t}\n\n\tif (hasFiles) {\n\t\tvar iframe\n\t\tvar action = $form.attr('action')\n\t\tif (action && (action.indexOf('ajax=1') === -1)) {\n\t\t\taction += (action.indexOf('?') > -1) ? '&ajax=1' : '?ajax=1'\n\t\t\t$form.attr('action', action)\n\t\t}\n\n\t\t// http://stackoverflow.com/a/36976807\n\t\tif (!$form.attr('target')) {\n\t\t\t//create a unique iframe for the form\n\t\t\tvar d = new Date()\n\t\t\twhile (new Date().getTime() === d.getTime()) {}\t// block till next millisecond\n\t\t\tvar iframeName = 'xhrf_' + d.getTime()\n\t\t\tiframe = $(\"<iframe></iframe>\")\n\t\t\t\t.attr('name', iframeName)\n\t\t\t\t.hide()\n\t\t\t\t.insertAfter($form)\n\t\t\t$form.attr('target', iframeName)\n\t\t}\n\n\t\tiframe = iframe || $('iframe[name=\" ' + $form.attr('target') + ' \"]')\n\t\tiframe.load(function () {\n\t\t\tbindResetUIOnInputAfterResponse()\n\t\t\t//get the server response\n\t\t\tinProgress = false\n\t\t\t$body.removeClass('loading')\n\t\t\t$form.removeClass('loading')\n\t\t\tif (onSuccess) {\n\t\t\t\tvar response = iframe.contents().find('body').text()\n\t\t\t\ttry {\n\t\t\t\t\tresponse = JSON.parse(response)\n\t\t\t\t}\n\t\t\t\tcatch (e) {\n\t\t\t\t\tconsole.error('got no json', response, e)\n\t\t\t\t}\n\t\t\t\tonSuccess(response)\n\t\t\t}\n\t\t})\n\n\t}\n\n\t$form.submit(function(event) {\n\n\t\tif (inProgress) return false\n\n\t\t// future decision on forms without this set\n\t\tvar actionURL = $form.attr('action')\n\t\tif (!actionURL) return true\n\n\t\tresetUIstate()\n\t\t\n\t\tinProgress = true\n\t\t$body.addClass('loading')\n\t\t$form.addClass('loading')\n\n\t\tif (hasFiles)\n\t\t\treturn true\n\t\t\t// already handled by redirecting form submit to target iframe created above\n\n\t\tevent.preventDefault()\n\t\tvar formData = $form.serialize()\n\n\t\tjQuery.ajax({\n\t\t\ttype:\t'POST',\n\t\t\turl:\tactionURL,\n\t\t\tdata:\tformData,\n\t\t\tdataType: 'json',\n\t\t\tcache: false,\n\t\t\terror: function(err) {\n\t\t\t\tinProgress = false\n\t\t\t\tvar detail = {}\n\t\t\t\t$body.removeClass('loading')\n\t\t\t\t$form\n\t\t\t\t\t.removeClass('loading')\n\t\t\t\t\t.attr('data-lastresult', 'error')\n\t\t\t\t\t.attr('data-laststatus', err.status)\n\n\t\t\t\tbindResetUIOnInputAfterResponse()\n\t\t\t\tif (err.responseJSON) {\n\t\t\t\t\tvar json = err.responseJSON\n\t\t\t\t\tvar errors\n\t\t\t\t\t// best case expect err.responseJSON.errors[{msg:'',param:'',value:''}, ...]\n\t\t\t\t\tif (json.errors instanceof Array) {\n\t\t\t\t\t\terrors = json.errors\n\t\t\t\t\t} // exceptions follow\n\t\t\t\t\telse if (json instanceof Array) {\n\t\t\t\t\t\t// validation returns array, but some simple responses only have message\n\t\t\t\t\t\terrors = json\n\t\t\t\t\t\tmsg(\"ERROR: #596 lazy format error\")\n\t\t\t\t\t\tconsole.log(errors)\n\t\t\t\t\t}\n\t\t\t\t\telse if (json.error && json.error.errors){\t// graphController\n\t\t\t\t\t\terrors = []\n\t\t\t\t\t\tvar ers = json.error.errors\n\t\t\t\t\t\tfor (var key in ers) {\n\t\t\t\t\t\t\tif (ers.hasOwnProperty(key)) {\n\t\t\t\t\t\t\t\terrors.push({\n\t\t\t\t\t\t\t\t\tparam: key,\n\t\t\t\t\t\t\t\t\tmsg: ers[key].message\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\telse if (json.error && json.error.status) {\n\t\t\t\t\t\terrors = [json.error]\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tmsg(\"ERROR: #596 lazy format error\")\n\t\t\t\t\t\tconsole.log(json)\n\t\t\t\t\t\terrors = [{\n\t\t\t\t\t\t\tparam:\tjson.param || '',\n\t\t\t\t\t\t\tmsg:\tjson.message\n\t\t\t\t\t\t}]\n\t\t\t\t\t}\n\t\t\t\t\terrors.map(function(ei) {\n\t\t\t\t\t\tvar $field = $form.find('#f_'+ei.param.replace('[','_').replace(']','_'))\n\n\t\t\t\t\t\tif (ei.param && (ei.msg || ei.message) && ($field.length>0)) {\n\t\t\t\t\t\t\t$field.addClass('error')\n\t\t\t\t\t\t\t\t.find('span.message').html(ei.msg || ei.message)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// in case no 'param' comes back\n\t\t\t\t\t\t\t$unknownError.html($unknownError.html() + '<span>'+ (ei.msg || ei.message) + '</span>').show()\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t\tif (!errors.length) {\t// should errors be empty\n\t\t\t\t\t\t$unknownError.html($unknownError.html() + '<span>'+ (json.message) + '</span>').show()\n\t\t\t\t\t}\n\t\t\t\t\tdetail = {\n\t\t\t\t\t\terrors: errors,\n\t\t\t\t\t\tjson: json\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (err.status === 200) {\t// the response was deemed an error but has good status (jQuery timeout / last resort)\n\t\t\t\t\t\t$unknownError.html('<span>The server said: (' + err.status + '): ' + err.statusText +'</span>').show()\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// in case no json comes back, e.g. just a code\n\t\t\t\t\t\t$unknownError.html('<span>An error ('+err.status+') occurred. Please check all required fields</span>').show()\n\t\t\t\t\t}\n\t\t\t\t\tdetail = {\n\t\t\t\t\t\terr: err\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t$form[0].dispatchEvent(new CustomEvent('xhrerror', {detail:detail}))\n\t\t\t\t$form\n\t\t\t\t\t.removeClass('noMessage')\n\t\t\t\t\t.addClass('hasMessage')\n\t\t\t},\n\t\t\tsuccess: function(content, textStatus, jqxhr) {\n\t\t\t\tinProgress = false\n\t\t\t\t$body.removeClass('loading')\n\t\t\t\t$form\n\t\t\t\t\t.removeClass('loading')\n\t\t\t\t\t.attr('data-lastresult', 'success')\n\t\t\t\t\t.attr('data-laststatus', jqxhr.status)\n\n\t\t\t\tbindResetUIOnInputAfterResponse()\n\t\t\t\tonSuccess.apply(this,arguments)\n\t\t\t}\n\n\t\t})\n\t\treturn false\n\t})\n\n\tresetUIstate()\n\t$form.attr('data-xhrenabled', 'true')\n\n}"
  },
  {
    "path": "browser/scripts/ui-breadcrumb.js",
    "content": "/**\n * simple breadcrumb control using handlebars template\n * known limitations - if used server-side it won't attach clickhandlers\n */\nvar UIbreadcrumb = function(/* @var jQuery|null */ $existingContainer) {\n\tvar that = this\n\tthis.crumbs = []\n\tthis.clickHandlers = {}\n\tthis.withJquery = (typeof jQuery !== 'undefined')\n\tthis.options = {\n\t\tuseSeparator \t: true,\n\t\tseparatorHtml \t: null\t// default from template\n\t}\n\tif (typeof E2 !== 'undefined') {\n\t\tthis.get_uid \t= E2.core.get_uid\t// used to attach onClick events at add/prepend time\n\t\tthis._template \t= E2.views.partials.breadcrumb\n\t} else {\n\t\tvar uid_c = 0\t\t\t\t\t\t// server-side\n\t\tthis.get_uid \t= function(){return ++uid_c}\n\t\tthis._template \t= function(){return function(x){return (x)}}\n\t}\n\n\tif (this.withJquery && ($existingContainer instanceof jQuery)) {\n\t\tthis.container = $existingContainer\n\t\tthis._attach()\n\t} else {\n\t\tthis.container = null\t// only produce html\n\t}\n\n\tObject.defineProperty(this, 'length', {\n\t\tget: function(){return that.crumbs.length}\n\t})\n}\n\nUIbreadcrumb.prototype.getTemplateData = function() {\n\treturn {\n\t\toptions: this.options,\n\t\tcrumbs: this.crumbs\n\t}\n}\n\nUIbreadcrumb.prototype.renderHtml = function() {\n\treturn this._template(this.getTemplateData())\n}\n\nUIbreadcrumb.prototype.render = function($container) {\t// optionally supply $container at last minute (client js only)\n\tif (this.withJquery) {\n\t\tif ($container instanceof jQuery) this.container = $container\n\t\tif (this.container) {\n\t\t\tthis.container.html(this.renderHtml())\n\t\t\tthis._attach()\n\t\t\treturn this.container\n\t\t}\n\t}\n\telse return this.renderHtml()\n}\n\nUIbreadcrumb.prototype._attach = function() {\n\tthis.container.find('a').off('.breadcrumb')\n\tthis.container.find('a').on('click.breadcrumb', this.clickHandler.bind(this))\n}\n\nUIbreadcrumb.prototype.destroy = function() {\n\tif (this.withJquery && this.container) {\n\t\tthis.container.find('a').off('.breadcrumb')\n\t\tthis.container.html('')\n\t}\n\tthis.clickHandlers = {}\n\tthis.crumbs = []\n\tthis.container = null\n}\n\n/**\n * add a new crumb\n * @param text\n * @param link optional\n * @param onClick optional\n * @param uid optional\n */\nUIbreadcrumb.prototype.add = function(text, link, onClick, uid) {\n\tthis.crumbs.push(\n\t\tthis._makeCrumb(text, link, onClick, uid)\n\t)\n\treturn this\n}\n\nUIbreadcrumb.prototype.prepend = function(text, link, onClick, uid) {\n\tthis.crumbs.unshift(\n\t\tthis._makeCrumb(text, link, onClick, uid)\n\t)\n\treturn this\n}\n\nUIbreadcrumb.prototype._makeCrumb = function(text, linkHref, onClick, uid) {\n\tuid = uid || ('bc'+this.get_uid())\n\tlinkHref = linkHref || ''\n\tif (typeof onClick === 'function') {\n\t\tthis.clickHandlers[uid] = onClick\n\t\tif (linkHref === '') linkHref = '#'\n\t}\n\treturn {\n\t\tuid: uid,\n\t\tlink: linkHref,\n\t\ttext: text\n\t}\n}\n\nUIbreadcrumb.prototype.clickHandler = function(e) {\n\tvar domNode = e.currentTarget\n\tvar $a = jQuery(domNode)\n\tvar uid = $a.data('uid')\n\tif (uid && (typeof this.clickHandlers[uid] === 'function')) {\n\t\tthis.clickHandlers[uid](domNode)\n\t\te.preventDefault()\n\t\te.stopPropagation()\n\t\treturn false\n\t}\n\telse return true\n}\n\nif (typeof module !== 'undefined')\n\tmodule.exports = UIbreadcrumb"
  },
  {
    "path": "browser/scripts/ui-core-statestore.js",
    "content": "var uiMode = {\n\tbuild: \t'build',\n\tprogram: 'program'\n}\nvar uiModifyMode = {\n\tmove: \t'translate',\n\trotate: 'rotate',\n\tscale: \t'scale'\n}\n\n/**\n * owned by ui-core\n * first-level properties e.g. .mode, .visibility emit events upon changing\n * second-level properties through .visibility, .panelStates and .context also emit events\n * if persistentStorageRef, except for a number of ignored properties, the object will persist\n * @param persistentStorageRef (store or recall state)\n * @param context (data from a VizorUI.getContext() call)\n */\nvar UiState = function(persistentStorageRef, context) {\n\tEventEmitter.apply(this, arguments)\n\tvar that = this\n\n\tvar persistentStorageKey = 'uiState105b'\n\n\tvar defineProperty = function(obj, prop, options, callback) {\n\t\toptions = _.extend({\n\t\t\tget: function() {\n\t\t\t\treturn this._internal[prop]\n\t\t\t},\n\t\t\tset: function(v){\n\t\t\t\tvar ov = this._internal[prop]\n\t\t\t\tif ( ! ((typeof(v) === 'object') || (typeof(v) === 'function'))) {\n\t\t\t\t\tif (v === ov) return\t// nothing to do\n\t\t\t\t}\n\t\t\t\tthis._internal[prop] = v\n\t\t\t\tif (callback) {\n\t\t\t\t\tcallback(prop, v, ov)\n\t\t\t\t}\n\t\t\t}\n\t\t}, options)\n\t\tObject.defineProperty(obj, prop, options)\n\t}\n\n\tvar defineGettersAndSetters = function(obj, callback) {\n\t\t// top-level setter (e.g. obj.property = value) generates a changed:property event\n\t\tfor (var prop in obj._internal)\n\t\t\tif (obj._internal.hasOwnProperty(prop))\n\t\t\t\tdefineProperty(obj, prop, null, callback)\n\t\treturn obj\n\t}\n\n\t// emit: \t'changed' , 'changed:{key}'\n\t//\t\tor \t'changed' ,  eventName  ,  eventName:{key}\n\tvar makeEmitter = function(obj, eventName) {\n\t\treturn function(prop) {\n\t\t\tvar value = obj[prop]\n\t\t\tthat.emit('changed', obj, prop, value)\n\t\t\tif (eventName) {\n\t\t\t\tthat.emit(eventName, prop, value)\n\t\t\t\tthat.emit(eventName +':' +prop, value)\n\t\t\t} else {\n\t\t\t\tthat.emit('changed:'+prop, value)\n\t\t\t}\n\t\t}\n\t}\n\n\tthis._internal = {\n\t\tmodifyMode \t: uiModifyMode.move,\t\t\t// does not autosave\n\t\tmodifyModeDefault: \tuiModifyMode.move,\t\t//\t''\t, recall when modifications(keydown) end (keyup)\n\t\tselectedObjects\t: []\t\t\t\t\t\t// [node, ...], does not autosave\n\t}\n\n\tvar emitMain \t\t= makeEmitter(this)\n\tdefineGettersAndSetters(this, emitMain)\n\n\t_.extend(this._internal, {\n\t\tmode \t\t: uiMode.build,\n\t\tvisible \t: true,\t\t\t\t// overall visibility of the UI\n\t\tcontext\t\t: context || {},\n\t\tviewCamera\t: uiViewCam.birdsEye,\n\t\tvisibility\t: {\n\t\t\t_internal: {\n\t\t\t\tbreadcrumb: true,\t\t// always true\t(20151012)\n\t\t\t\tplayer_controls : true,\t// always true\t(20151012)\n\t\t\t\tmain_toolbar : true,\t// always true\t(20151012)\n\t\t\t\tinspector\t: false,\t// not ours yet (20151123)\n\t\t\t\ttimeline\t: false\t\t// (20151019)\n\t\t\t}\n\t\t},\n\t\tpanelStates : {\n\t\t\t_internal: {\n\t\t\t\tchat:\t\tnull,\n\t\t\t\tpatches:\tnull,\n\t\t\t\tassets:\t\tnull,\n\t\t\t\tproperties: null\n\t\t\t}\n\t\t}\n\t})\n\n\t// read only\n\tObject.defineProperty(this, 'visibility', {\n\t\tget: function(){ return this._internal.visibility }\n\t})\n\tObject.defineProperty(this, 'panelStates', {\n\t\tget: function(){ return this._internal.panelStates }\n\t})\n\n\n\tvar emitPanels \t\t= makeEmitter(this.panelStates, 'changed:panelStates'),\n\t\temitVisibility \t= makeEmitter(this.visibility,'changed:visibility')\n\tdefineGettersAndSetters(this.panelStates, emitPanels)\n\tdefineGettersAndSetters(this.visibility, emitVisibility)\n\n\n\t_.extend(this._internal.visibility._internal,\n\t\t{\n\t\t\tfloating_panels : true,\n\t\t\tpanel_chat : false,\n\t\t\tpanel_patches : true,\n\t\t\tpanel_assets : true,\n\t\t\tpatch_editor : false,\n\t\t\tpanel_properties: false\n\t\t}\n\t)\n\n\tdefineProperty(this, 'viewCamera', {\n\t\tget: function() { return this._internal.viewCamera },\n\t\tset: function(value) {\n\t\t\tif (value === this._internal.viewCamera) return\n\t\t\tthis._internal.viewCamera = value\n\t\t\tthat.emit('_internal:viewCamera', value)\n\t\t\temitMain('viewCamera', this.viewCamera)\n\t\t}\n\t})\n\n\n\tdefineProperty(this, 'mode', {\n\t\tget: function() {\n\t\t\treturn this._internal.mode\n\t\t},\n\t\tset: function(value) {\n\t\t\tif (!this.visible) {\t// nothing is visible, we expect patch editor or world editor\n\t\t\t\tthis.visible = true;\n\t\t\t\tthis.visibility.floating_panels = false;\n\t\t\t}\n\t\t\tif (value === this._internal.mode) return\n\t\t\tthis._internal.mode = value\n\n\t\t\tswitch (value) {\n\t\t\t\tcase uiMode.build:\n\t\t\t\t\tthis.visibility.patch_editor = false\n\t\t\t\t\tbreak\n\t\t\t\tcase uiMode.program:\n\t\t\t\t\tthis.visibility.patch_editor = true\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t\temitMain('mode', this.mode)\n\t\t}\n\t})\n\n\tvar notifyBuildMode = function() {\n\t\tif (that.visibility._internal.patch_editor)\n\t\t\tthat.mode = uiMode.program\n\t\telse \n\t\t\tthat.mode = uiMode.build\n\t}\n\tthis.on('_internal:patch_editor', notifyBuildMode)\n\tthis.on('_internal:viewCamera', notifyBuildMode)\n\tthis.on('_internal:visible', notifyBuildMode)\n\n\tdefineProperty(this, 'visible', {\n\t\tget: function() {\n\t\t\treturn this._internal.visible && (this.visibility.floating_panels || this.visibility.patch_editor)\n\t\t},\n\t\tset: function(value) {\t// this = state\n\t\t\tvar old = this.visible\n\t\t\tif (value === old) return\n\t\t\tthis._internal.visible = value\n\t\t\tvar v = this.visibility\n\t\t\tif (value) {\t// off -> on\n\t\t\t\tvar nothingVisible = !(v.floating_panels || v.patch_editor)\n\t\t\t\tif (nothingVisible) {\n\t\t\t\t\tswitch (this.mode) {\n\t\t\t\t\t\tcase uiMode.program:\n\t\t\t\t\t\t\tv.patch_editor = true\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase uiMode.build:\n\t\t\t\t\t\t\tv.floating_panels = true\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\temitVisibility('panel_chat', v.panel_chat)\n\t\t\temitVisibility('panel_patches', v.panel_patches)\n\t\t\temitVisibility('panel_assets', v.panel_assets)\n\t\t\temitVisibility('panel_properties', v.panel_properties)\n\t\t\temitVisibility('floating_panels', v.floating_panels)\n\t\t\temitVisibility('patch_editor', v.patch_editor)\n\t\t\temitMain('visible', this.visible)\n\t\t\temitMain('selectedObjects', this.selectedObjects)\n\t\t}\n\t})\n\n\tvar notifyVisible = function(visible) {\n\t\tvar v = that.visibility\n\t\tvar isAnythingVisible = v._internal.patch_editor || v._internal.floating_panels\n\n\t\tif (isAnythingVisible && !that.visible) {\n\t\t\tthat.visible = true\n\t\t}\n\t\telse if (that.visible && !isAnythingVisible) {\n\t\t\tthat.visible = false\n\t\t}\n\t\telse\n\t\t\temitMain('visible', that.visible)\n\t}\n\tthis.on('_internal:patch_editor', notifyVisible)\n\tthis.on('_internal:floating_panels', notifyVisible)\n\n\tdefineProperty(this._internal.visibility, 'floating_panels', {\n\t\t\tget: function() {\n\t\t\t\treturn that._internal.visible && this._internal.floating_panels\n\t\t\t},\n\t\t\tset: function(value) {\t// this = state.visibility\n\t\t\t\tvar old = this.floating_panels\n\t\t\t\tif (value === old) return\n\n\t\t\t\tthis._internal.floating_panels = value\n\n\t\t\t\tvar oldVisible = that.visible\n\t\t\t\tthat.emit('_internal:floating_panels', value)\t// super\n\n\t\t\t\tif (value) {\n\t\t\t\t\tif (!oldVisible) {\n\t\t\t\t\t\tthis.patch_editor = false\n\t\t\t\t\t}\n\t\t\t\t\tvar noPanelsAreSetToVisible = !(this._internal.panel_chat ||\n\t\t\t\t\t\tthis._internal.panel_patches ||\n\t\t\t\t\t\tthis._internal.panel_assets ||\n\t\t\t\t\t\tthis._internal.panel_properties)\n\t\t\t\t\tif (noPanelsAreSetToVisible) {\n\t\t\t\t\t\t// this.panel_assets = true // not in this build\n\t\t\t\t\t\tthis.panel_chat = false // disabled\n\t\t\t\t\t\tthis.panel_patches = true\n\t\t\t\t\t\tthis.panel_properties = true\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\temitVisibility('panel_chat', this.panel_chat)\n\t\t\t\temitVisibility('panel_patches', this.panel_patches)\n\t\t\t\temitVisibility('panel_assets', this.panel_assets)\n\t\t\t\temitVisibility('panel_properties', this.panel_properties)\n\t\t\t\temitVisibility('floating_panels', this.floating_panels)\n\t\t\t}\n\t\t}\n\t)\n\n\tvar notifyFloatingPanels = function() {\n\t\tvar v = that.visibility, _vi = that.visibility._internal\n\t\tvar isAnyPanelVisible = (_vi.panel_chat || _vi.panel_patches || _vi.panel_assets || _vi.panel_properties)\n\t\tif (isAnyPanelVisible && !v.floating_panels) {\n\t\t\tv.floating_panels = true\n\t\t}\n\t\telse if (v.floating_panels && !isAnyPanelVisible) {\n\t\t\tv.floating_panels = false\n\t\t}\n\t\telse\n\t\t\temitVisibility('floating_panels')\n\t}\n\tthis.on('_internal:visibility:panel_chat', notifyFloatingPanels)\n\tthis.on('_internal:visibility:panel_patches', notifyFloatingPanels)\n\tthis.on('_internal:visibility:panel_assets', notifyFloatingPanels)\n\tthis.on('_internal:visibility:panel_properties', notifyFloatingPanels)\n\n\tthis.visibility._panelLogic = function(which, value) {\n\t\t// the one panel that is shown is set through internal\n\t\t// the other panels that aren't shown are set through their setters\n\t\tvar old = this[which]\n\t\tif (value === old) return value\n\n\t\tvar panels = ['panel_assets', 'panel_patches', 'panel_properties', 'panel_chat']\n\t\tvar ix = panels.indexOf(which)\n\t\tif (ix === -1) {\n\t\t\tconsole.error('not found ' + which)\n\t\t\treturn false\n\t\t}\n\t\tdelete panels[ix]\n\n\t\tthis._internal[which] = value\n\t\tvar oldFloatingPanels = this.floating_panels\n\t\tthat.emit('_internal:visibility:' + which, value)\n\t\tif (value && !oldFloatingPanels) {\n\t\t\tfor (var p in panels) {\n\t\t\t\tthis[panels[p]] = false\n\t\t\t}\n\t\t}\n\t\tvar vv = this[which]\n\t\temitVisibility(which, vv)\n\t\treturn vv\n\t}\n\n\tdefineProperty(this._internal.visibility, 'panel_properties', {\n\t\tget : function() {\n\t\t\treturn this.floating_panels && this._internal.panel_properties\n\t\t},\n\t\tset: function(value) {\n\t\t\treturn this._panelLogic('panel_properties', value)\n\t\t}\n\t})\n\n\tdefineProperty(this._internal.visibility, 'panel_chat', {\n\t\t\tget: function() {\n\t\t\t\treturn this.floating_panels && this._internal.panel_chat\n\t\t\t},\n\t\t\tset: function(value) {\t// this = state._internal.visibility\n\t\t\t\treturn this._panelLogic('panel_chat', value)\n\t\t\t}\n\t\t}\n\t)\n\n\tdefineProperty(this._internal.visibility, 'panel_patches', {\n\t\t\tget: function() {\n\t\t\t\treturn this.floating_panels && this._internal.panel_patches\n\t\t\t},\n\t\t\tset: function(value) {\t// this = state.visibility\n\t\t\t\treturn this._panelLogic('panel_patches', value)\n\t\t\t}\n\t\t}\n\t)\n\n\tdefineProperty(this._internal.visibility, 'panel_assets', {\n\t\t\tget: function() {\n\t\t\t\treturn this.floating_panels && this._internal.panel_assets\n\t\t\t},\n\t\t\tset: function(value) {\t// this = state.visibility\n\t\t\t\treturn this._panelLogic('panel_assets', value)\n\t\t\t}\n\t\t}\n\t)\n\n\tdefineProperty(this._internal.visibility, 'patch_editor', {\n\t\t\tget: function() {\n\t\t\t\treturn that._internal.visible && this._internal.patch_editor\n\t\t\t},\n\t\t\tset: function(value) {\t// this = state.visibility\n\t\t\t\tvar old = this.patch_editor\n\t\t\t\tif (value === old) return\n\n\t\t\t\tthis._internal.patch_editor = value\n\t\t\t\tvar oldVisible = that.visible\n\t\t\t\tthat.emit('_internal:patch_editor', value)\n\n\t\t\t\tif (value) {\n\t\t\t\t\tif (!oldVisible) {\n\t\t\t\t\t\tthis.floating_panels = false\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\temitVisibility('patch_editor', this.patch_editor)\n\t\t\t}\n\t\t}\n\t)\n\n\tdefineProperty(this, 'context', {\n\t\tget: function() { return this._internal.context },\n\t\tset: function(context) {\n\t\t\tthis._internal.context = context\n\t\t\temitMain('context', context)\n\t\t\temitPanels('chat', this.panelStates.chat)\n\t\t\temitPanels('patches', this.panelStates.patches)\n\t\t\temitPanels('assets', this.panelStates.assets)\n\t\t\temitPanels('properties', this.panelStates.properties)\n\t\t}\n\t})\n\n\tthis._storageRef = persistentStorageRef\n\tthis._storageKey = persistentStorageKey\n\tthis._save_t = null\n\tthis.allowStoreOnChange = true\n\n\tif (this._storageRef) {\n\t\tvar ignoredProperties = ['selectedObjects', 'modifyMode']\n\t\tthis.on('changed', function(props, prop){\n\t\t\tif (!that.allowStoreOnChange) return\n\t\t\tif (ignoredProperties.indexOf(prop) > -1) return\n\n\t\t\tif (that._save_t) return\t// a saveState is scheduled already\n\t\t\tthat._save_t = setTimeout(function(){\n\t\t\t\tclearTimeout(that._save_t)\n\t\t\t\tthat._save_t = null\n\t\t\t\tthat.store()\n\t\t\t}, 500)\t// schedule in a while\n\t\t})\n\t}\n}\n\nUiState.prototype = Object.create(EventEmitter.prototype)\n\nUiState.prototype.isBuildMode = function() {\n\treturn this.mode === 'build'\n}\n\nUiState.prototype.isProgramMode = function() {\n\treturn this.mode === 'program'\n}\n\nUiState.prototype.store = function() {\n\tthis._save_t = null\n\tif (!this._storageRef) {\n\t\tmsg(\"ERROR: storeState but no storageRef\")\n\t\treturn false\n\t}\n\tthis._storageRef.setItem(this._storageKey, JSON.stringify(this.getCopy()))\n\treturn true\n}\n\nUiState.prototype.recall = function() {\n\tif (!this._storageRef) return false\n\tvar storage = this._storageRef\n\tvar uiState = storage.getItem(this._storageKey)\n\tif (uiState) {\n\t\tvar ok = this.setState(uiState)\n\t\tif (!ok)\n\t\t\tstorage.removeItem(this._storageKey) // it refused so this is useless\n\t}\n\treturn true\n}\n\nUiState.prototype.getCopy = function() {\n\treturn {\n\t\tmode: this.mode,\n\t\tmodifyMode: this.modifyMode,\n\t\tmodifyModeDefault: this.modifyModeDefault,\n\t\tvisible: this.visible,\n\t\tviewCamera: this.viewCamera,\n\t\tvisibility: clone(this.visibility._internal),\n\t\tpanelStates: clone(this.panelStates._internal),\n\t\t// selectedObjects: clone(this.selectedObjects),\n\t\tcontext: clone(this.context._internal)\n\t}\n}\n\n// note: overwrites the entire state, generating no events\nUiState.prototype._apply = function(newState) {\n\tif (typeof newState !== 'object') return msg('ERROR: invalid newState')\n\n\tvar internal = this._internal;\n\tvar internalVisibility = internal.visibility._internal;\n\tvar internalPanelStates = internal.panelStates._internal;\n\n\t// context is ignored but may be used for additional checks\n\tinternal.visible = (typeof newState.visible === 'boolean') ? newState.visible : true\n\tvar newVisibility = newState.visibility\n\tif (newState.mode) \t\t\tinternal.mode = newState.mode\n\tif (newState.viewCamera) \tinternal.viewCamera = newState.viewCamera\n\n\tif (newState.modifyModeDefault) \t{\n\t\tinternal.modifyModeDefault = newState.modifyModeDefault\n\t\tinternal.modifyMode = internal.modifyModeDefault\n\t}\n\t// selectedObjects ignored, and modifyMode set to default if one is given\n\n\t// take values from supplied visibility, but default to current\n\tfor (var k in internalVisibility) {\n\t\tif (typeof newVisibility[k] !== 'undefined') internalVisibility[k] = newVisibility[k]\n\t}\n\n\tif (newState.panelStates)  {\n\t\tvar ps = newState.panelStates\n\t\tif (ps.chat) \tinternalPanelStates.chat = ps.chat\n\t\tif (ps.patches) internalPanelStates.patches = ps.patches\n\t\tif (ps.assets) \tinternalPanelStates.assets = ps.assets\n\t\tif (ps.properties) \tinternalPanelStates.properties = ps.properties\n\t}\n\n\tthis.emit('replaced', this);\n\n\treturn true\n}\n\n\nUiState.prototype.setState = function(stateObjOrJSON) {\n\tvar newState\n\ttry {\n\t\tnewState = (typeof stateObjOrJSON === 'object') ? stateObjOrJSON : JSON.parse(stateObjOrJSON)\n\t}\n\tcatch (e) {\n\t\tconsole.error(e)\n\t\treturn msg('ERROR: failed parsing state json')\n\t}\n\tthis._apply(newState)\n\treturn true\n}\n"
  },
  {
    "path": "browser/scripts/ui-core.js",
    "content": "var uiKeys = {\n\tenter\t: 13,\n\tshift\t: 16,\n\tctrl\t: 17,\n\tleft_window_key : 91,\t// \tcmd, = ctrl (webkit)\n\tmeta\t: 224,\t\t\t// \tcmd firefox ^\n\talt\t\t: 18,\n\tspacebar: 32,\n\n\tbackspace   : 8,\n\tdelete      : 46,\n\n\t// handled on keydown - keycode + modifier value\n\ttoggleMode \t\t\t: 9,\t// Tab\n\tnavigateToPatch\t: 1009,\t// Shift+Tab\n\ttoggleUILayer\t\t: 11085,\t// meta+Shift+U\n\ttoggleFloatingPanels : 10066, // meta+B\n\n\ttoggleDebugFPSDisplay : 101070, // ctrl+meta+shift+F\n\n\t// single characters handled on keypress\n\topenInspector\t\t: 'I',\n\ttoggleEditorCamera\t: 'V',\n\tfocusPatchSearch\t: '/',\n\tfocusPatchSearchAlt: 'Q',\n\tviewSource\t\t\t: '\\\\',\n\n\tmodifyModeMove\t\t: 'M',\n\tmodifyModeScale \t: 'S',\n\tmodifyModeRotate\t: 'R',\n\tviewHelp \t\t\t: '?',\n\n\ttoggleEditorHelpers                 : 'H',\n\ttoggleWorldEditorGrid               : 'G',\n\ttoggleWorldEditorLocalGlobalHandles : 'L',\n\ttoggleWorldEditorXCamera            : 'X',\n\ttoggleWorldEditorYCamera            : 'Y',\n\ttoggleWorldEditorZCamera            : 'Z',\n\ttoggleWorldEditorOrthographicCamera : 'O',\n\tframeViewToSelection                : 'T',\n\ttoggleFullScreen \t                : 'F',\n\tmoveVRCameraToEditorCamera          : '=',\n\tgotoParentGraph\t\t                : ',',\n\n\tmoveSelectedNodesUp      : 38, // up arrow\n\tmoveSelectedNodesDown    : 40, // down arrow\n\tmoveSelectedNodesLeft    : 37, // left arrow\n\tmoveSelectedNodesRight   : 38, // right arrow\n\n\tshortcutKey0 : '0',\n\tshortcutKey1 : '1',\n\tshortcutKey2 : '2',\n\tshortcutKey3 : '3',\n\tshortcutKey4 : '4',\n\tshortcutKey5 : '5',\n\tshortcutKey6 : '6',\n\tshortcutKey7 : '7',\n\tshortcutKey8 : '8',\n\tshortcutKey9 : '9',\n\n\tactivateHoverSlot : 1016, // shift only activates hover slot\n\tdeselect : 13, // enter = deselect / commit move\n\n\tselectAll   : 10065, // meta + A: select all\n\tcopy        : 10067, // meta + C: copy\n\tcut         : 10088, // meta + X: cut\n\tpaste       : 10086, // meta + V: paste\n\tundo        : 10090, // meta + Z: undo\n\tredo        : 11090, // shift + meta + Z: redo\n\n\t// added to code in getModifiedKeyCode\n\tmodShift \t: 1000,\n\tmodMeta \t: 10000,\t// ctrl == cmd\n\tmodAlt \t\t: 100000\n};\n\nvar uiViewCam = {\n\tvr\t\t\t: 'hmd',\n\tbirdsEye\t: 'birdsEye'\n};\n\nif (typeof uiEvent === 'undefined')\n\tvar uiEvent = {}\n\n_.assign(uiEvent, { // emitted by ui (E2.ui) unless comments state otherwise\n\tinitialised\t\t: 'uiInitialised',\n\tmoved\t\t\t: 'uiMoved',\t\t\t// panels via movable.js\n\tresized\t\t\t: 'uiResized',\t\t\t// panels via draggable.js\n\tstateChanged\t: 'uiStateChanged'\n})\n\nvar VizorUI = function() {\t\t\t// becomes E2.ui\n\tEventEmitter.apply(this, arguments)\n\n\tthis._initialised = false;\n\n\tthis.dom = {\t\t\t\t// init sets this to E2.dom\n\t\tchatWindow : null,\n\t\tpatchesLib : null,\n\t\tassetsLib : null\n\t};\n\n\tthis.state = new UiState(VizorUI.getPersistentStorageRef(), VizorUI.getContext())\n\tthis.state.allowStoreOnChange = false;\n\n\tthis.flags = {\n\t\tloading: false,\n\t\tdragging: false,\n\t\tfullscreen: false,\n\t\tpressedShift: false,\n\t\tpressedAlt : false,\n\t\tpressedMeta : false\t\t// ctrl or cmd on osx, ctrl on windows\n\t};\n};\nVizorUI.prototype = Object.create(EventEmitter.prototype);\nVizorUI.prototype.constructor = VizorUI\n\nVizorUI.prototype._init = function(e2) {\t// called by .init() in ui.js\n\tthis.dom = e2.dom;\n\tdocument.body.addEventListener('keydown', this.onKeyDown.bind(this));\n\tdocument.body.addEventListener('keyup', this.onKeyUp.bind(this));\n\tdocument.addEventListener('keypress', this.onKeyPress.bind(this), true);\t// first\n\twindow.addEventListener('blur', this._onWindowBlur.bind(this));\n\twindow.addEventListener('focus', this._onWindowFocus.bind(this));\n\twindow.addEventListener('resize', this.onWindowResize.bind(this));\n\te2.core.on('progress', this.updateProgressBar.bind(this));\n}\n\nVizorUI.prototype.refreshBreadcrumb = function() {\t// force state to emit an event\n\tE2.ui.state.selectedObjects = E2.ui.state.selectedObjects\n}\n\nVizorUI.prototype.setupStateStoreEventListeners = function() {\n\tvar that = this;\n\tvar dom = this.dom;\t\t// normally E2.dom\n\tvar state = this.state;\n\tvar visibility = state.visibility;\n\tvar $assets = dom.assetsLib, $patches = dom.patchesLib, $chat = dom.chatWindow, $properties = dom.propertiesPanel;\n\tvar $patch_editor = dom.canvas_parent;\n\n\tE2.app.graphStore.on('changed:size', function(size) {\n\t\t$('#graphSizeLabel').html(siteUI.formatFileSize(size))\n\t})\n\tE2.app.graphStore.on('nodeRemoved', function(graph, node){\n\t\tvar ix = state.selectedObjects.indexOf(node)\n\t\tif (ix !== -1) {\n\t\t\tvar sel = _.clone(state.selectedObjects)\n\t\t\tsel.splice(ix, 1)\n\t\t\tstate.selectedObjects = sel\t// refresh\n\t\t}\n\t})\n\n\tE2.app.worldEditor.on('selectionSet', function(selected){\n\t\tstate.selectedObjects = selected\n\t})\n\n\tstate\n\t\t.on('changed:mode', function(mode, oldmode) {\n\t\t\tvar inBuildMode = mode === uiMode.build\n\t\t\tvar inProgramMode = !inBuildMode\n\n\t\t\tif (inProgramMode)\n\t\t\t\tE2.track({ event: 'programMode' })\n\t\t\telse\n\t\t\t\tE2.track({ event: 'buildMode' })\n\n\t\t\tdom.btnBuildMode\n\t\t\t\t.toggleClass('ui_on', inBuildMode)\n\t\t\t\t.toggleClass('ui_off', inProgramMode);\n\t\t\tdom.btnProgramMode\n\t\t\t\t.toggleClass('ui_on', inProgramMode)\n\t\t\t\t.toggleClass('ui_off', inBuildMode);\n\n\t\t\t// LIs\n\t\t\tdom.tabObjects\n\t\t\t\t.toggleClass('ui_off', inProgramMode)\n\t\t\t\t.toggleClass('ui_on', inBuildMode)\n\n\t\t\tdom.tabPatches\n\t\t\t\t.toggleClass('ui_off', inBuildMode)\n\t\t\t\t.toggleClass('ui_on', inProgramMode)\n\n\t\t\tdom.tabObjProperties\n\t\t\t\t.toggleClass('ui_off', inProgramMode)\n\t\t\t\t.toggleClass('ui_on', inBuildMode)\n\n\t\t\tdom.tabNodeProperties\n\t\t\t\t.toggleClass('ui_off', inBuildMode)\n\t\t\t\t.toggleClass('ui_on', inProgramMode)\n\n\n\t\t\tdom.btnMove.attr('disabled',!inBuildMode);\n\t\t\tdom.btnScale.attr('disabled',!inBuildMode);\n\t\t\tdom.btnRotate.attr('disabled',!inBuildMode);\n\n\t\t\tif (inBuildMode) {\n\t\t\t\tdom.tabObjects.find('a').trigger('click')\n\t\t\t\tdom.tabObjProperties.find('a').trigger('click')\n\t\t\t\tstate.selectedObjects = E2.app.worldEditor.getSelectedNodes()\n\t\t\t}\n\t\t\telse if (inProgramMode) {\n\t\t\t\tdom.tabPatches.find('a').trigger('click')\n\t\t\t\tdom.tabNodeProperties.find('a').trigger('click')\n\t\t\t\tE2.app.clearSelection(false)\n\t\t\t\tstate.selectedObjects = E2.app.selectedNodes\n\t\t\t}\n\n\t\t})\n\t\t.emit('changed:mode', state.mode);\n\n\tstate\n\t\t.on('changed:viewCamera', function(camera){\n\t\t\tvar birdsEyeCameraActive = (camera === uiViewCam.birdsEye);\n\t\t\tdom.btnEditorCam.parent().toggleClass('active', birdsEyeCameraActive);\n\t\t\tdom.btnVRCam.parent().toggleClass('active', !birdsEyeCameraActive);\n\t\t\tE2.app.setViewCamera(birdsEyeCameraActive);\n\t\t})\n\t\t.emit('changed:viewCamera', state.viewCamera);\n\n\t// nothing UI for top-level 'changed:visible' to process\n\n\tstate\n\t\t.on('changed:visibility:floating_panels', function(visible){\n\t\t\tthat.dom.btnHideAll.toggleClass('ui_off', visible);\t// inverse\n\t\t})\n\t\t.emit('changed:visibility:floating_panels', visibility.floating_panels);\n\n\n\tvar changedVisibilityPanelHandler = function($panel, $button) {\n\t\treturn function(visible){\n\t\t\tif (that.isFullScreen()) return;\n\t\t\t$panel\n\t\t\t\t.toggle(visible)\n\t\t\t\t.toggleClass('uiopen', visible);\n\t\t\t$button.toggleClass('ui_off', !visible);\n\n\t\t\tif (visible) VizorUI.constrainPanel($panel);\t// soft constrain\n\t\t};\n\t};\n\n\tstate\n\t\t.on('changed:visibility:panel_assets', \tchangedVisibilityPanelHandler($assets, dom.btnAssets))\n\t\t.on('changed:visibility:panel_patches', changedVisibilityPanelHandler($patches, dom.btnPatches))\n\t\t.on('changed:visibility:panel_properties', \tchangedVisibilityPanelHandler($properties, dom.btnInspector))\n\t\t.on('changed:visibility:panel_chat', \tchangedVisibilityPanelHandler($chat, dom.btnChatDisplay))\n\t\t.emit('changed:visibility:panel_assets', \tvisibility.panel_assets)\n\t\t.emit('changed:visibility:panel_patches', \tvisibility.panel_patches)\n\t\t.emit('changed:visibility:panel_properties', visibility.panel_properties)\n\t\t.emit('changed:visibility:panel_chat', \t\tvisibility.panel_chat);\n\n\tstate\n\t\t.on('changed:visibility:patch_editor', function(visible){\n\t\t\tE2.app.noodlesVisible = visible;\n\t\t\t$patch_editor.toggle(E2.app.noodlesVisible);\t// ui is visible and patch editor is visible (or not)\n\t\t\tif (E2.app.noodlesVisible) NodeUI.redrawActiveGraph();\n\t\t\tif (that.isInBuildMode() && !that.state.visibility.patch_editor) {\n\t\t\t\t\tthat.dom.tabObjects.find('a').trigger('click')\n\t\t\t}\n\t\t\tif (that.isInProgramMode() && that.state.visibility.patch_editor) {\n\t\t\t\tthat.dom.tabPatches.find('a').trigger('click')\n\t\t\t}\n\t\t\tdom.btnSavePatch.attr('disabled', !visible);\n\t\t})\n\t\t.emit('changed:visibility:patch_editor', visibility.patch_editor);\n\n\tstate\n\t\t.on('changed:selectedObjects', function(selected){\n\t\t\tthat.buildBreadcrumb(E2.core.active_graph, selected);\n\t\t})\n\t\t.emit('changed:selectedObjects', state.selectedObjects);\n\n\tstate\n\t\t.on('changed:modifyMode', function(modifyMode){\n\t\t\tdom.btnScale\n\t\t\t\t.toggleClass('ui_off', modifyMode !== uiModifyMode.scale)\n\t\t\t\t.toggleClass('ui_on', modifyMode === uiModifyMode.scale)\n\t\t\tdom.btnRotate\n\t\t\t\t.toggleClass('ui_off', modifyMode !== uiModifyMode.rotate)\n\t\t\t\t.toggleClass('ui_on', modifyMode === uiModifyMode.rotate)\n\t\t\tdom.btnMove\n\t\t\t\t.toggleClass('ui_off', modifyMode !== uiModifyMode.move)\n\t\t\t\t.toggleClass('ui_on', modifyMode === uiModifyMode.move)\n\t\t})\n\t\t.emit('changed:modifyMode', state.modifyMode);\n\n\n\tstate.on('changed:panelStates:properties', function(panelState){\n\t\tif (!panelState) return;\n\t\tif (!panelState._found) return;\n\t\tif (that.isFullScreen()) return;\n\t\tvar panel = dom.propertiesPanel\n\t\tVizorUI.applyPanelState(panel, panelState);\n\t\tvar controlsHeight = panel.find('.drag-handle').outerHeight(true) +\n\t\t\t\t\t   panel.find('.block-header').outerHeight(true);\n\t\tif (!panelState.collapsed) {\n\t\t\tpanel.removeClass('collapsed').height('auto');\n\t\t} else {\n\t\t\tpanel.addClass('collapsed').height(controlsHeight);\n\t\t}\n\t\tVizorUI.constrainPanel(panel);\n\t});\n\n\tstate.on('changed:panelStates:patches', function(panelState){\n\t\tif (!panelState) return;\n\t\tif (!panelState._found) return;\n\t\tif (that.isFullScreen()) return;\n\t\tVizorUI.applyPanelState(dom.patchesLib, panelState);\n\t\tvar controlsHeight = dom.patchesLib.find('.drag-handle').outerHeight(true) +\n\t\t\t\t\t   dom.patchesLib.find('.block-header').outerHeight(true) +\n\t\t\t\t\t   dom.patchesLib.find('.searchbox').outerHeight(true);\n\t\tif (!panelState.collapsed) {\n\t\t\tthat.onSearchResultsChange();\n\t\t} else {\n\t\t\tdom.patchesLib.addClass('collapsed').height(controlsHeight);\n\t\t}\n\t\tVizorUI.constrainPanel(dom.patchesLib);\n\t});\n\n\tstate.on('changed:panelStates:assets', function(panelState){\n\t\tif (!panelState) return;\n\t\tif (!panelState._found) return;\n\t\tif (that.isFullScreen()) return;\n\t\tVizorUI.applyPanelState(dom.assetsLib, panelState);\n\t\tvar controlsHeight = dom.assetsLib.find('.drag-handle').outerHeight(true) +\n\t\t\t\t\t   dom.assetsLib.find('.block-header').outerHeight(true) +\n\t\t\t\t\t   dom.assetsLib.find('.searchbox').outerHeight(true);\n\t\tif (E2.dom.assetsLib.hasClass('collapsed')) {\n\t\t\tvar newHeight = controlsHeight +\n\t\t\t\t\t\t   dom.assetsLib.find('#assets-tabs').outerHeight(true) +\n\t\t\t\t\t\t   dom.assetsLib.find('.tab-content.active .assets-frame').outerHeight(true) +\n\t\t\t\t\t\t   dom.assetsLib.find('.load-buttons').outerHeight(true) +\n\t\t\t\t\t\t   dom.assetsLib.find('#asset-info').outerHeight(true)\n\t\t\tdom.assetsLib.removeClass('collapsed').height(newHeight);\n\t\t} else {\n\t\t\tdom.assetsLib.addClass('collapsed').height(controlsHeight);\n\t\t}\n\t\tVizorUI.constrainPanel(dom.assetsLib);\n\t});\n\n\tstate.on('changed:panelStates:chat', function(panelState){\n\t\tif (!panelState) return;\n\t\tif (!panelState._found) return;\n\t\tif (that.isFullScreen()) return;\n\t\tvar $chat = dom.chatWindow;\n\t\tVizorUI.applyPanelState($chat, panelState);\n\t\tvar $resizeHandle = $chat.find('.resize-handle');\n\t\tvar chatTabsHeight = dom.chatTabs.height();\n\t\tvar dragHandleHeight = $chat.find('.drag-handle').height();\n\n\t\tif (panelState.collapsed) {\n\t\t\t$resizeHandle.hide();\n\t\t\t$chat.height(dragHandleHeight + chatTabsHeight);\n\t\t} else {\n\t\t\t$resizeHandle.show();\n\t\t\tvar height = (panelState.h >= 120) ? panelState.h : 'auto';\n\t\t\t$chat.height(height)\n\t\t\tVizorUI.constrainPanel($chat, true);\n\t\t\tthat.onChatResize();\n\t\t}\n\t});\n\n\tstate\n\t\t.emit('changed:panelStates:properties', state.panelStates.properties)\n\t\t.emit('changed:panelStates:patches', state.panelStates.patches)\n\t\t.emit('changed:panelStates:assets', state.panelStates.assets)\n\t\t.emit('changed:panelStates:chat', state.panelStates.chat)\n\n\tstate\n\t\t.on('changed:context', function(context){\n\t\t\t// store the panel states and sync again\n\t\t\tthat.state.panelStates.chat = VizorUI.getDomPanelState(dom.chatWindow);\n\t\t\tthat.state.panelStates.assets = VizorUI.getDomPanelState(dom.assetsLib);\n\t\t\tthat.state.panelStates.patches = VizorUI.getDomPanelState(dom.patchesLib);\n\t\t\tthat.state.panelStates.properties = VizorUI.getDomPanelState(dom.propertiesPanel);\n\t\t})\n\t\t.emit('changed:context', state.context)\n};\n\nVizorUI.prototype.setDragging = function(isOn) {\n\tthis.flags.dragging = isOn\n}\n\n/***** IS... *****/\n\nVizorUI.prototype.isFullScreen = function() {\n\treturn E2.util.isFullscreen()\n}\nVizorUI.prototype.isVisible = function() {\n\treturn this.state.visible;\n}\nVizorUI.prototype.isPatchEditorVisible = function() {\n\treturn this.state.visibility.patch_editor;\n}\nVizorUI.prototype.isInProgramMode = function() {\n\treturn this.state.mode === uiMode.program\n}\nVizorUI.prototype.isInBuildMode = function() {\n\treturn this.state.mode === uiMode.build\n}\nVizorUI.prototype.isDragging = function() {\n\treturn this.flags.dragging;\n}\nVizorUI.prototype.isLoading = function() {\n\treturn this.flags.loading;\n}\nVizorUI.prototype.isUploading = function() {\n\treturn this.uploading;\n}\nVizorUI.prototype.isModalOpen = function() {\n\t// was: return ($(\"body\").data('bs.modal') || {}).isShown;\n\treturn siteUI.isModalOpen()\n}\n\n/**** EVENT HANDLERS ****/\n\nVizorUI.prototype._onWindowBlur = function() {\n\t// clear modifier keys\n\tthis.flags.pressedMeta = false\n\tthis.flags.pressedAlt = false\n\tthis.flags.pressedShift = false\n\n\t// set default modify mode\n\tthis.state.modifyMode = this.state.modifyModeDefault\n\n\treturn true\n}\nVizorUI.prototype._onWindowFocus = VizorUI.prototype._onWindowBlur\n\nVizorUI.prototype._trackModifierKeys = function(e) {\t// returns bool if any modifiers changed\n\tvar oldMeta = this.flags.pressedMeta,\n\t\toldAlt = this.flags.pressedAlt,\n\t\toldShift = this.flags.pressedShift;\n\tthis.flags.pressedMeta = e.metaKey || e.ctrlKey;\n\tthis.flags.pressedAlt = e.altKey;\n\tthis.flags.pressedShift = e.shiftKey;\n\tvar modifiersChanged = (oldMeta !== this.flags.pressedMeta) ||\n\t\t\t\t\t\t\t(oldAlt !== this.flags.pressedAlt) ||\n\t\t\t\t\t\t\t(oldShift !== this.flags.pressedShift)\n\treturn modifiersChanged;\n};\n\nVizorUI.prototype.getModifiedKeyCode = function(keyCode) {\t// adds modifier keys value to keyCode if necessary\n\tif (typeof keyCode !== 'number') return keyCode;\n\tif (this.flags.pressedShift) keyCode += uiKeys.modShift;\n\tif (this.flags.pressedAlt)   keyCode += uiKeys.modAlt;\n\tif (this.flags.pressedMeta)  keyCode += uiKeys.modMeta;\n\treturn keyCode;\n};\n\n// adds meta+alt+shift (in this order) to key from keyPress\nVizorUI.prototype.getModifiedKey = function(key) {\n\tif (this.flags.pressedShift) key = \"shift+\" + key;\n\tif (this.flags.pressedAlt) key = \"alt+\" + key;\n\tif (this.flags.pressedMeta) key = \"meta+\" + key;\n\treturn key;\n}\n\nVizorUI.prototype.trackModifierKeysForWorldEditor = function() {\n\tif (!this.isInBuildMode()) return\n\tif (this.isDragging()) return\n\n\tvar flags = this.flags\n\tvar anyModifiersPressed = flags.pressedMeta || flags.pressedShift || flags.pressedAlt\n\n\tif (!anyModifiersPressed)\n\t\treturn anyModifiersPressed\n\n\t// 'cmd/ctrl' to rotate\n\t// 'cmd/ctrl+shift' to scale\n\t// 'shift' to move\n\n\tif (flags.pressedMeta &&  !flags.pressedShift &&  !flags.pressedAlt)\n\t\tthis.state.modifyMode = uiModifyMode.rotate\n\n\telse if (flags.pressedShift && flags.pressedMeta &&  !flags.pressedAlt)\n\t\tthis.state.modifyMode = uiModifyMode.scale\n\n\telse if (flags.pressedShift &&  !flags.pressedAlt &&  !flags.pressedMeta)\n\t\tthis.state.modifyMode = uiModifyMode.move\n\n\treturn anyModifiersPressed\n}\n\nVizorUI.prototype.onKeyPress = function(e) {\n\tif (this.isModalOpen() || E2.util.isTextInputInFocus(e) || this.isFullScreen()) return true;\n\tvar state = this.state;\n\tvar that = this;\n\n\tvar key = e.charCode;\n\tif (!key) return true;\t// if this is 0 then the code does not apply to this handler, because Firefox\n\n\tkey = String.fromCharCode(key).toUpperCase();\t// num->str\n\tkey = this.getModifiedKey(key);\t\t\t\t\t// attach modifiers e.g. shift+M\n\n\t// keys for both program and build modes:\n\n\t// note dual-case for '/','shift+/' etc depending on keyboard layout\n\tswitch (key) {\n\t\tcase uiKeys.toggleFullScreen:\n\t\t\tE2.app.toggleFullscreen();\n\t\t\te.preventDefault();\n\t\t\tbreak;\n\n\t\tcase uiKeys.openInspector:\n\t\t\tstate.visibility.panel_properties = !state.visibility.panel_properties\n\t\t\te.preventDefault();\n\t\t\tbreak;\n\n\t\tcase uiKeys.toggleEditorCamera:\n\t\t\tstate.viewCamera = (state.viewCamera === uiViewCam.vr) ? uiViewCam.birdsEye : uiViewCam.vr;\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tbreak;\n\t\tcase uiKeys.toggleEditorHelpers:\n\t\t\tE2.app.toggleHelperObjects()\n\t\t\tbreak;\n\t\tcase uiKeys.focusPatchSearchAlt:\n\t\tcase uiKeys.focusPatchSearch:\n\t\tcase 'shift+' + uiKeys.focusPatchSearch:\n\t\t\tstate.visibility.panel_patches = true;\n\t\t\tif (that.isInProgramMode()) {\n\t\t\t\tthat.dom.tabPatches.find('a').trigger('click')\n\t\t\t\tthat.dom.patches_list.find('.searchbox input').focus().select();\n\t\t\t} else {\n\t\t\t\tthat.dom.tabObjects.find('a').trigger('click')\n\t\t\t\tthat.dom.objectsList.find('.searchbox input').focus().select();\n\t\t\t}\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tbreak;\n\t\tcase uiKeys.viewHelp:\n\t\tcase 'shift+'+uiKeys.viewHelp:\n\t\t\tVizorUI.openEditorHelp();\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tbreak;\n\t}\n\n\t// keys for program-mode (noodles visible) only:\n\tif (this.isInProgramMode()) {\n\t\tfunction openPatchOrPlugin(item) {\n\t\t\tvar name = item.substring(7)\n\t\t\tif (item.indexOf('patch:') === 0)\n\t\t\t\tE2.app.patchManager.openPatch('/patches/' + name + '.json')\n\t\t\telse\n\t\t\t\tE2.app.instantiatePlugin(name)\n\t\t}\n\n\t\tswitch(key) {\n\t\t\tcase uiKeys.gotoParentGraph:\n\t\t\t\tif (E2.core.active_graph.parent_graph)\n\t\t\t\t\tE2.app.setActiveGraph(E2.core.active_graph.parent_graph)\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.viewSource:\n\t\t\tcase 'shift+' + uiKeys.viewSource:\n\t\t\tcase 'alt+shift+' + uiKeys.viewSource:\t// .fi\n\t\t\t\tthis.viewSource();\n\t\t\t\te.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.moveSelectedNodesUp:\n\t\t\t\tE2.app.executeNodeDrag(\n\t\t\t\t\tE2.app.selectedNodes,\n\t\t\t\t\tE2.app.selectedConnections,\n\t\t\t\t\t0, -10);\n\t\t\t\te.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.moveSelectedNodesDown:\n\t\t\t\tE2.app.executeNodeDrag(\n\t\t\t\t\tE2.app.selectedNodes,\n\t\t\t\t\tE2.app.selectedConnections,\n\t\t\t\t\t0, 10);\n\t\t\t\te.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.moveSelectedNodesLeft:\n\t\t\t\tE2.app.executeNodeDrag(\n\t\t\t\t\tE2.app.selectedNodes,\n\t\t\t\t\tE2.app.selectedConnections,\n\t\t\t\t\t-10, 0);\n\t\t\t\te.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.moveSelectedNodesRight:\n\t\t\t\tE2.app.executeNodeDrag(\n\t\t\t\t\tE2.app.selectedNodes,\n\t\t\t\t\tE2.app.selectedConnections,\n\t\t\t\t\t10, 0);\n\t\t\t\te.preventDefault();\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.shortcutKey0:\n\t\t\t\topenPatchOrPlugin('plugin:output_proxy');\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.shortcutKey1:\n\t\t\t\topenPatchOrPlugin('plugin:input_proxy');\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.shortcutKey2:\n\t\t\t\topenPatchOrPlugin('plugin:graph');\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.shortcutKey3:\n\t\t\t\topenPatchOrPlugin('plugin:slider_float_generator');\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.shortcutKey4:\n\t\t\t\topenPatchOrPlugin('plugin:const_float_generator');\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.shortcutKey5:\n\t\t\t\topenPatchOrPlugin('plugin:float_display');\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.shortcutKey6:\n\t\t\t\topenPatchOrPlugin('plugin:multiply_modulator');\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.shortcutKey7:\n\t\t\t\topenPatchOrPlugin('plugin:vector');\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.shortcutKey8:\n\t\t\t\topenPatchOrPlugin('plugin:toggle_button');\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.shortcutKey9:\n\t\t\t\topenPatchOrPlugin('plugin:knob_float_generator');\n\t\t\t\tbreak;\n\t\t}\n\n\t}\n\telse if (E2.app.worldEditor.isActive) {\n\t\tif (E2.app.worldEditor.cameraSelector.selectedCamera !== 'vr') {\n\t\t\t// world editor (bird's eye camera only) -specific keys\n\t\t\tswitch(key) {\n\t\t\tcase uiKeys.toggleWorldEditorXCamera:\n\t\t\t\tE2.app.worldEditor.setCameraView('-x');\n\t\t\t\tbreak;\n\t\t\tcase 'shift+' + uiKeys.toggleWorldEditorXCamera:\n\t\t\t\tE2.app.worldEditor.setCameraView('+x');\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.toggleWorldEditorYCamera:\n\t\t\t\tE2.app.worldEditor.setCameraView('-y');\n\t\t\t\tbreak;\n\t\t\tcase 'shift+' + uiKeys.toggleWorldEditorYCamera:\n\t\t\t\tE2.app.worldEditor.setCameraView('+y');\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.toggleWorldEditorZCamera:\n\t\t\t\tE2.app.worldEditor.setCameraView('-z');\n\t\t\t\tbreak;\n\t\t\tcase 'shift+' + uiKeys.toggleWorldEditorZCamera:\n\t\t\t\tE2.app.worldEditor.setCameraView('+z');\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.toggleWorldEditorOrthographicCamera:\n\t\t\t\tE2.app.worldEditor.toggleCameraOrthographic();\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.frameViewToSelection:\n\t\t\t\tE2.app.worldEditor.frameSelection();\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.moveVRCameraToEditorCamera:\n\t\t\tcase \"shift+\"+uiKeys.moveVRCameraToEditorCamera: // fi\n\t\t\t\tE2.app.worldEditor.matchVRToEditorCamera();\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// world editor (any camera) -specific keys\n\t\tswitch(key) {\n\t\t\tcase uiKeys.modifyModeMove:\n\t\t\t\tstate.modifyModeDefault = uiModifyMode.move\n\t\t\t\tstate.modifyMode = state.modifyModeDefault\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.modifyModeRotate:\n\t\t\t\tstate.modifyModeDefault = uiModifyMode.rotate\n\t\t\t\tstate.modifyMode = state.modifyModeDefault\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.modifyModeScale:\n\t\t\t\tstate.modifyModeDefault = uiModifyMode.scale\n\t\t\t\tstate.modifyMode = state.modifyModeDefault\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.toggleWorldEditorLocalGlobalHandles:\n\t\t\t\tE2.app.worldEditor.toggleLocalGlobalHandles();\n\t\t\t\tbreak;\n\t\t\tcase uiKeys.toggleWorldEditorGrid:\n\t\t\t\tE2.app.worldEditor.toggleGrid();\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn true;\n};\n\nVizorUI.prototype.onKeyDown = function(e) {\n\tvar modifiersChanged = this._trackModifierKeys(e);\n\tif (this.isModalOpen() || E2.util.isTextInputInFocus(e) || this.isFullScreen()) return true;\n\tif (this.isDragging()) {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t\treturn false;\n\t}\n\n\tvar state = this.state;\n\tvar that = this;\n\tvar modifiedKeyCode = this.getModifiedKeyCode(e.keyCode);\n\n\tif (modifiersChanged)\n\t\t\t\tthis.trackModifierKeysForWorldEditor()\n\n\tswitch (modifiedKeyCode) {\n\t\tcase uiKeys.toggleFloatingPanels:\n\t\t\tthis.toggleFloatingPanels();\n\t\t\te.preventDefault();\n\t\t\tbreak;\n\t\tcase uiKeys.toggleMode:\n\t\tcase uiKeys.navigateToPatch:\n\t\t\te.preventDefault()\n\t\t\te.stopPropagation()\n\t\t\tif (this.isInBuildMode()) {\n\t\t\t\tthis.setModeProgram()\n\t\t\t\tvar selectedGraph = E2.app.worldEditor.selectedEntityPatch\n\t\t\t\tif ((!selectedGraph) && E2.app.worldEditor.selectedEntityNode)\n\t\t\t\t\tselectedGraph = E2.app.worldEditor.selectedEntityNode.parent_graph\n\t\t\t\tif (this.flags.pressedShift && selectedGraph) {\n\t\t\t\t\tE2.app.setActiveGraph(selectedGraph)\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t\tthis.setModeBuild()\n\t\t\tbreak\n\t\tcase uiKeys.toggleUILayer:\n\t\t\tthat.toggleUILayer();\n\t\t\te.preventDefault();\n\t\t\tbreak;\n\t\tcase uiKeys.backspace:\n\t\tcase uiKeys.delete:\n\t\t\tE2.app.onDelete(e);\n\t\t\te.preventDefault();\n\t\t\tbreak;\n\t\tcase uiKeys.deselect: // enter = deselect (eg. commit move)\n\t\t\tE2.app.clearEditState();\n\t\t\tE2.app.clearSelection();\n\t\t\tbreak;\n\t\tcase uiKeys.activateHoverSlot:\n\t\t\tE2.app.activateHoverSlot();\n\t\t\tbreak;\n\t\tcase uiKeys.selectAll:\n\t\t\tE2.app.selectAll();\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tbreak;\n\t\tcase uiKeys.copy:\n\t\t\tif (VizorUI.isBrowser.Chrome())\n\t\t\t\treturn;\n\t\t\tE2.app.onCopy(e);\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tbreak;\n\t\tcase uiKeys.cut:\n\t\t\tif (VizorUI.isBrowser.Chrome())\n\t\t\t\treturn;\n\t\t\tE2.app.onCut(e);\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tbreak;\n\t\tcase uiKeys.paste:\n\t\t\tif (VizorUI.isBrowser.Chrome())\n\t\t\t\treturn;\n\t\t\tE2.app.pasteFromClipboard();\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tbreak;\n\t\tcase uiKeys.undo:\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tE2.app.undoManager.undo();\n\t\t\tthis.emit('undo')\n\t\t\tbreak;\n\t\tcase uiKeys.redo:\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tE2.app.undoManager.redo();\n\t\t\tthis.emit('redo')\n\t\t\tbreak;\n\t\tcase uiKeys.toggleDebugFPSDisplay:\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tE2.app.debugFpsDisplayVisible = !E2.app.debugFpsDisplayVisible\n\t\t\tbreak;\n\t}\n\treturn true;\n}\nVizorUI.prototype.onKeyUp = function(e) {\n\tvar modifiersChanged = this._trackModifierKeys(e);\n\n\tif (modifiersChanged) {\n\t\tvar anyModifiersPressed = this.trackModifierKeysForWorldEditor()\n\t\tif (anyModifiersPressed === false)\n\t\t\tthis.state.modifyMode = this.state.modifyModeDefault\n\t}\n\n\tif (this.isModalOpen() || E2.util.isTextInputInFocus(e) || this.isFullScreen()) return true;\n\n\tif(e.keyCode === uiKeys.shift)\n\t{\n\t\tE2.app.releaseHoverSlot();\n\t\tE2.app.releaseHoverNode(false);\n\t}\n\treturn true;\n};\n\nVizorUI.prototype.constrainAllPanels = function() {\n\tVizorUI.constrainPanel(this.dom.chatWindow)\n\tVizorUI.constrainPanel(this.dom.patchesLib)\n\tVizorUI.constrainPanel(this.dom.assetsLib)\n\tVizorUI.constrainPanel(this.dom.propertiesPanel)\n}\n\nVizorUI.prototype.onWindowResize = function() {\n\tthis.constrainAllPanels()\n\tthis.state.context = VizorUI.getContext();\n\tthis.flags.fullscreen = this.isFullScreen();\n\treturn true;\n};\n\n\n\n/***** HELPER METHODS *****/\n\nVizorUI.getControlTypeForDt = function(dt) {\n\tvar types = E2.core.datatypes\n\tswitch (dt) {\n\t\tcase types.BOOL:\n\t\t\treturn UICheckbox\n\t\tcase types.FLOAT:\n\t\t\treturn UIFloatField\n\t\tcase types.TEXT:\n\t\t\treturn UITextField\n\t\tcase types.VECTOR:\n\t\t\treturn UIVector3\n\t}\n\treturn false\n}\n\nVizorUI.getContext = function() {\n\treturn {\n\t\twidth \t\t\t: window.innerWidth  || document.documentElement.clientWidth  || document.body.clientWidth,\n\t\theight \t\t\t: window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight,\n\t\tscreenWidth\t\t: window.screen.width,\n\t\tscreenHeight\t: window.screen.height,\n\t\tavailWidth\t\t: window.screen.availWidth,\n\t\tavailHeight\t\t: window.screen.availHeight\n\t}\n};\n\n/**\n * get the state of a UI (tabbed) panel. if no $domElement provided, then _found = false\n * @param $domElement\n * @returns {{_found: boolean, visible: boolean, collapsed: boolean, selectedTab: null, x: boolean, y: boolean}}\n */\nVizorUI.getDomPanelState = function($domElement) {\t/* @var $domElement jQuery */\n\tvar state = {\n\t\t_found: false,\n\t\tvisible : true,\n\t\tcollapsed : false,\n\t\tselectedTab : null,\n\t\tx: false,\n\t\ty: false,\n\t\tw: -1,\n\t\th: -1\n\t};\n\tif ((typeof $domElement === 'object') && ($domElement.length > 0)) {\n\t\tstate._found = true;\n\t\tstate.visible = $domElement.is(':visible') && $domElement.hasClass('uiopen');\n\t\tstate.collapsed = $domElement.hasClass('collapsed');\n\t\tvar pos = $domElement.position();\n\t\tif (pos) {\n\t\t\tstate.x = pos.left;\n\t\t\tstate.y = pos.top;\n\t\t}\n\t\tstate.w = $domElement.width();\n\t\tstate.h = $domElement.height();\n\t\t// get the active tab\n\t\tvar $activeLi = $domElement.find('li.active');\n\t\tif ($activeLi.length>0) {\n\t\t\tvar tabName, tabLink;\n\t\t\ttabName = $activeLi.data('tabname');\t\t\t// data-tabname='patches' preferred\n\t\t\tif (tabName) {\n\t\t\t\tstate.selectedTab = tabName;\n\t\t\t} else {\n\t\t\t\ttabLink = $activeLi.find('a');\n\t\t\t\tstate.selectedTab = tabLink.attr('href');\t// #something\n\t\t\t}\n\t\t}\n\t\t// else this isn't tabbed so selectedTab does not apply\n\t}\n\treturn state;\n}\n\n/**\n * Apply a panelState obtained via VizorUI.getPanelState to a floating panel of the UI\n * @param $el\n * @param panelState\n * @returns {boolean}\n */\nVizorUI.applyPanelState = function($el, panelState) {\n\tif ((typeof $el !== 'object') || ($el.length === 0)) return false;\n\tif (!panelState) {\n\t\tmsg(\"ERROR: no panelState to apply\");\n\t\treturn false;\n\t}\n\n\t// parse state\n\t// ignores visibility which is already applied\n\tvar collapsed = !!panelState.collapsed;\n\tvar selectedTab = panelState.selectedTab || false;\n\tvar x = panelState.x || 0;\n\tvar y = panelState.y || 0;\n\tvar w = panelState.w || 0;\t// w currently ignored\n\tvar h = panelState.h || 0;\t// h only applied to chat window\n\n\n\t// collapse if needed\n\t$el.toggleClass('collapsed', collapsed);\n\n\t// position and check dimensions\n\tif (!((x===0) && (y === 0))) {\n\t\tvar parent = $el.parent();\n\t\tvar parentHeight = parent.innerHeight();\n\t\tvar parentWidth = parent.innerWidth();\n\t\tif ((parentWidth>0) && (parentHeight>0)) {\n\t\t\tvar oh = $el.outerHeight;\n\t\t\tvar ow = $el.outerWidth();\n\t\t\tif (oh < 50) oh = 100;\n\t\t\tif (ow < 50) ow = 100;\n\t\t\tif (y > parentHeight) {\n\t\t\t\ty = parentHeight - oh;\n\t\t\t}\n\t\t\tif (x > parentWidth) {\n\t\t\t\tx = parentWidth - ow;\n\t\t\t}\n\t\t}\n\t\t$el.css({\n\t\t\t'left' : '' + x + 'px',\n\t\t\t'top' : '' + y + 'px'\n\t\t});\n\n\t\t// $el.height(h);\t// currently ignored\n\t}\n\n\tif (!selectedTab) return true;\n\n\t// activate the selected tab\n\tjQuery('.tab-content>.tab-pane', $el).hide().removeClass('active');\n\tjQuery('.tab-content', $el).find(selectedTab).show().addClass('active');\n\tjQuery('.nav-tabs li', $el).removeClass('active');\n\tjQuery('a[href=\"' + selectedTab + '\"]', $el).parent().addClass('active');\n\n\treturn true;\n};\n\nVizorUI.constrainPanel = function($panel, doConstrainHeight, referenceTop, referenceBottom, referenceLeft) {\n\tvar viewport = E2.dom.canvases;\n\treferenceTop\t= referenceTop || 0;\n\treferenceBottom\t= referenceBottom || 0;\t// #652\n\treferenceLeft\t= referenceLeft || 0;\n\tdoConstrainHeight = !!doConstrainHeight;\n\n\tif (!$panel.is(':visible')) return false;\t// jQuery\n\n\tvar panelHeight = $panel.outerHeight(true);\n\tvar panelWidth = $panel.outerWidth(true);\n\tvar parentHeight = $panel.parent().innerHeight();\n\tvar parentWidth = $panel.parent().innerWidth();\n\tvar availableHeight =  viewport.outerHeight(true);\n\tvar availableWidth = viewport.outerWidth(true);\n\n\tvar doConstrain = false;\n\n\tvar pos = $panel.position();\n\tif (pos.left === 0) pos = $panel.offset();\n\n\tvar panelTop = pos.top;\n\tvar panelLeft = pos.left;\n\tvar newX = panelLeft, newY = panelTop, newH = panelHeight;\n\n\tif (panelHeight > parentHeight) {\n\t\t$panel.height(parentHeight - 10);\n\t\tdoConstrain = true;\n\t}\n\tif (panelTop + panelHeight > availableHeight) {\t// try to fit this on screen\n\t\tdoConstrain = true;\n\t\tif (newH > availableHeight) {\n\t\t\tnewH = availableHeight;\n\t\t}\n\t\tif (newH <= availableHeight) {\t// first change the top only\n\t\t\tnewY -= ((newY + newH) - availableHeight);\n\t\t}\n\t\tif (newY < referenceTop) {\t\t// if not enough, change height too\n\t\t\tnewH = newH - (referenceTop - newY) - 10;\n\t\t\tnewY = referenceTop + 5;\n\t\t}\n\t}\n\tif (panelLeft + panelWidth > parentWidth) {\t\t// same for x and fixed width\n\t\tdoConstrain = true;\n\t\tnewX -= ((newX + panelWidth) - availableWidth);\n\t}\n\tif (newX < referenceLeft) {\n\t\tnewX = referenceLeft + 5;\n\t\tdoConstrain = true;\n\t}\n\n\tif (doConstrain) {\n\t\tif (doConstrainHeight) $panel.height(newH);\t// only resizable panels take height (i.e. chat)\n\t\t$panel.css({top: newY, left: newX});\n\t}\n\n\treturn doConstrain;\n}\n\n\nVizorUI.getPersistentStorageRef = function() {\n\tvar storage = window.sessionStorage;\n\tvar quotaExceeded = DOMException.QUOTA_EXCEEDED_ERR || 22;\n\ttry {\n\t\tstorage.setItem('test', 1);\n\t\tstorage.removeItem('test');\n\t}\n\tcatch (e) {\n\t\tif (e.code === quotaExceeded && storage.length === 0) return null;\n\t}\n\treturn storage;\n}\n\n\n// separate function so it can be removed\nVizorUI._disableEvent = function(e) {\n\te.preventDefault()\n\te.stopPropagation()\n\treturn false\n}\n\nVizorUI.disableContextMenu = function(domElement) {\n\tdomElement.addEventListener('contextmenu', VizorUI._disableEvent, true)\t\t// top down\n}"
  },
  {
    "path": "browser/scripts/ui-minislides.js",
    "content": "/**\n * @author gmarinov\n */\nvar Minislides = function(containerEl, opts) {\n\n\tthis.detachQueue = []\n\n\topts = _.extend({\n\t\tnextOn : 'a.slide-next',\n\t\tnextOnSelf : false,\n\t\tslideQuery: ':scope>section',\n\t\tslideContainerQuery: '.slides',\n\t\ttransitionMethod: 'crossfade'\t\t// crossfade|horizontal\n\t}, opts)\n\n\topts.slideFunction = (opts.transitionMethod === 'crossfade') ? Minislides.crossfade : Minislides.horizontal\n\n\tthis.container = containerEl\n\tvar sc = this.container.querySelector(opts.slideContainerQuery)\t// one element\n\n\tvar containerClass = containerEl.className\n\tvar scClass = sc.className\n\n\tthis.detachQueue.push(function(){\n\t\tsc.className = scClass\n\t\tsc.style.height = \"\"\n\t\tsc.style.width = \"\"\n\t\tsc.style.left = \"\"\n\t\tcontainerEl.className = containerClass\n\t\tcontainerEl.style.height = \"\"\n\t\tcontainerEl.style.width = \"\"\n\t})\n\n\tthis.container.classList.add('minislides')\n\tsc.classList.add('slides')\n\tsc.classList.add(opts.transitionMethod)\n\tsc.style.userSelect = 'none'\n\n\tthis.isCrossfade = opts.transitionMethod === 'crossfade'\n\n\tthis.slideContainer = sc\n\tthis.slides = sc.querySelectorAll(opts.slideQuery)\n\tthis.slideSwitcher = document.createElement('DIV')\n\tthis.selected = 0\n\n\treturn this.init(opts)\n}\n\n// add an event listener and put it in the queue to destroy() later\nMinislides.prototype._on = function(element, eventName, handler, phase) {\n\tphase = !!phase\n\telement.addEventListener(eventName, handler, phase)\n\tthis.detachQueue.push(function(){\n\t\telement.removeEventListener(eventName, handler, phase)\n\t})\n}\n\nMinislides.prototype.attach = function(slideFn) {\n\tthis._on(this.container, 'slideChange', slideFn.bind(this))\n\tthis._on(this.container, 'slideChange', this.onSlideChanged.bind(this))\n}\n\n\nMinislides.prototype.detach = function() {\n\tif (this.detachQueue && this.detachQueue.length) {\n\t\tvar removeHandler\n\t\twhile (removeHandler = this.detachQueue.pop()) {\n\t\t\tremoveHandler()\n\t\t}\n\t}\n\tif (this._dragHelper)\n\t\tthis._dragHelper.detach()\n\n\tthis.container.classList.remove('minislides')\n\t$('*', this.container).off('.minislides')\n\n\tif (this.slideSwitcher) {\n\t\tthis.slideSwitcher.parentNode.removeChild(this.slideSwitcher)\n\t\tthis.slideSwitcher = null\n\t}\n}\n\nMinislides.prototype.getSlideDimensions = function(el) {\n\treturn el.getBoundingClientRect()\n}\n\nMinislides.horizontal = function(e) {\n\tvar ix = e.detail.index\n\tvar leftPx = -ix * this.slideWidth\n\tthis.slideContainer.style.left = leftPx + 'px'\n}\n\nMinislides.crossfade = function(e){\n\tvar ix = e.detail.index\n\tvar slides = jQuery(this.slides)\n\tvar selected = slides.eq(ix)\n\tselected.fadeIn(350)\n\tslides.not(selected).fadeOut(650)\n}\n\nMinislides.prototype.init = function(opts) {\n\topts = opts || {}\n\tvar that = this\n\n\tvar sw = this.slideSwitcher\n\tsw.classList.add('minislides-slideSwitcher')\n\n\tif (opts.switcherContainer)\n\t\topts.switcherContainer.appendChild(sw)\n\telse\n\t\tthis.container.appendChild(sw)\n\n\tArray.prototype.forEach.call(this.slides, function(el, ix) {\n\t\tel.classList.add('slide')\n\t\tel.classList.add('slide'+(ix+1))\n\t\tvar step = document.createElement('button')\n\t\tstep.className = 'slide-step'\n\t\tstep.dataset.index = ix\t\t// data-index=\"1\"\n\t\tsw.appendChild(step)\n\t\tvar listener = function(e){\n\t\t\te.preventDefault()\n\t\t\te.stopPropagation()\n\t\t\tthat.showSlide(ix)\n\t\t\treturn false\n\t\t}\n\t\tstep.addEventListener('touchend', listener)\n\t\tstep.addEventListener('click', listener)\n\t})\n\n\tthis.attach(opts.slideFunction)\n\tthis.showSlide(this.selected)\n\n\tsetTimeout(function(){\n\t\tvar d = this.getSlideDimensions(this.slides[this.selected])\n\t\tthis.slideWidth = d.width\n\t\tthis.slideHeight = d.height\n\t\tvar cs = this.container.style\n\t\tif (this.slideWidth) {\n\t\t\tcs.height = this.slideHeight + 'px'\n\t\t\tcs.width = this.slideWidth + 'px'\n\t\t}\n\t\tthis.slideContainer.style.width = (this.slideWidth * this.slides.length) + 'px'\n\t\tthis.slideContainer.style.height = this.slideHeight+'px'\n\t}.bind(this), 100)\n\n\tthis.initDrag()\n\n\tvar clickToNext\n\n\tif (opts.nextOnSelf) {\n\t\tclickToNext = jQuery(this.slides).add(opts.nextOn, this.slides)\n\t\tjQuery('a, button', this.slides)\n\t\t \t.on('click', function(e){e.stopPropagation()})\n\t} else {\n\t\tclickToNext = jQuery(opts.nextOn, this.slides)\n\t}\n\n\n\tclickToNext\n\t\t.off('.minislides')\n\t\t.on('click.minislides touchend.minislides', function(e){\n\t\t\tif (siteUI && siteUI.isDragging)\n\t\t\t\treturn true\t// not for us\n\n\t\t\te.preventDefault()\n\t\t\te.stopPropagation()\n\t\t\tthat.nextSlide()\n\t\t\treturn false\n\t\t})\n\n\treturn this\n}\n\nMinislides.prototype.initDrag = function() {\n\tvar that = this\n\tvar canDragLive = !this.isCrossfade\n\n\tvar el = this.container\n\tvar drag = new UIDragAwareHelper(el, undefined, true, false)\n\tdrag.minDelta = 12\n\n\tvar prev = this.prevSlide.bind(this)\n\tvar next = this.nextSlide.bind(this)\n\n\tvar leftPx = null\n\n\tvar exec = function(e, cb) {\n\t\te.preventDefault()\n\t\te.stopPropagation()\n\t\tcb()\n\t\tcanDragLive = false\n\t\treturn false\n\t}\n\n\tthis._on(el, drag.dragEvents.end, function(e){\n\t\tvar dx = e.detail.startDelta.x\n\n\t\tif (!e.detail.dragged)\n\t\t\treturn true\n\n\t\tthat.slideContainer.classList.remove('dragging')\n\n\t\tleftPx = null\n\n\t\tif (Math.abs(dx) < that.slideWidth / 9)\n\t\t\treturn exec(e, function(){that.showSlide(that.selected)})\n\n\t\tif (dx > 0)\n\t\t\treturn exec(e, prev)\n\t\tif (dx < 0)\n\t\t\treturn exec(e, next)\n\n\t})\n\n\n\tif (canDragLive) {\n\n\t\tvar sc = that.slideContainer\n\n\n\t\tthis._on(that.slideContainer, 'transitionend', function(){\n\t\t\tcanDragLive = true\n\t\t})\n\n\t\tthis._on(el, drag.dragEvents.move, function(e) {\n\t\t\tif (!e.detail.dragged)\n\t\t\t\treturn true\n\n\t\t\tthat.slideContainer.classList.add('dragging')\n\n\t\t\tvar sw = that.slideWidth * that.slides.length\n\t\t\tvar dx = e.detail.startDelta.x\n\n\t\t\tif (leftPx === null)\n\t\t\t\tleftPx = parseFloat(window.getComputedStyle(sc).left.replace(\"px\", ''))\n\n\t\t\tif (isNaN(leftPx))\n\t\t\t\tleftPx = 0\n\n\t\t\tvar newLeft = leftPx + dx\n\n\t\t\tif (newLeft > 0)\n\t\t\t\tnewLeft = 0\n\t\t\t\n\t\t\tif (newLeft - that.slideWidth < -sw)\n\t\t\t\tnewLeft = -sw + that.slideWidth\n\n\t\t\tsc.style.left = newLeft + 'px'\n\t\t\treturn true\n\t\t})\n\t}\n\n\tthis._dragHelper = drag\n\n}\n\nMinislides.prototype.canWrap = function() {\n\treturn false\n}\n\nMinislides.prototype.nextSlide = function() {\n\tvar sel = this.selected + 1\n\tif (sel > this.slides.length - 1) {\n\t\tif (this.canWrap())\n\t\t\tsel = 0\n\t\telse\n\t\t\tsel = this.slides.length - 1\n\t}\n\treturn this.showSlide(sel)\n}\n\nMinislides.prototype.prevSlide = function() {\n\tvar sel = this.selected - 1\n\tif (sel < 0) {\n\t\tif (this.canWrap())\n\t\t\tsel = this.slides.length - 1\n\t\telse\n\t\t\tsel = 0\n\t}\n\treturn this.showSlide(sel)\n}\n\nMinislides.prototype.onSlideChanged = function(e) {\n\tvar that = this\n\tvar steps = this.slideSwitcher.querySelectorAll('.slide-step')\n\tArray.prototype.forEach.call(steps, function(el, ix){\n\t\tel.classList.remove('selected')\n\t\tif (ix === that.selected)\n\t\t\tel.classList.add('selected')\n\t})\n}\n\nMinislides.prototype.showSlide = function(ix) {\n\tix = ix % this.slides.length\n\tthis.selected = ix\n\tvar ev = new CustomEvent('slideChange', {detail: {index: ix, slide: this.slides[ix]}})\n\tthis.container.dispatchEvent(ev)\n\treturn this\n}"
  },
  {
    "path": "browser/scripts/ui-site.js",
    "content": "// requires bootbox\nif (typeof msg === 'undefined')\n\tvar msg = function(msg) {console.error(msg)};\n\nif (typeof VizorUI === 'undefined')\n\tvar VizorUI = {}\n\n// takes care of common site shell and elements found on \"web\" pages.\nvar siteUI = new function() {\n\tvar that = this;\n\n\t// same as in css\n\tvar breakMobile = 550;\n\tvar breakTablet = 1024;\n\n\tif (window.matchMedia) {\n\t\tthis.mqMobile = window.matchMedia(\"only screen and (max-width: \"+ (breakMobile-1) +\"px)\")\n\t\tthis.mqTablet = window.matchMedia(\"screen and (max-width: \"+ (breakTablet-1) +\"px)\")\n\t\tthis.mqDesktop = window.matchMedia(\"screen and (min-width: \"+  breakTablet    +\"px)\")\n\t} else {\n\t\tthis.mqMobile = this.mqTablet = this.mqDesktop = { matches: false }\n\t}\n\n\tthis.devicePixelRatio = window.devicePixelRatio || 1;\n\tthis.hasOrientationChange = \"onorientationchange\" in window;\n\tthis.previousOrientation = (this.hasOrientationChange) ? window.orientation : null;\n\n\t// states (bool)\n\tthis.lastLayout = null;\n\tthis.lastPortrait = null;\n\tthis.isEmbedded = null;\n\n\tvar _isDragging = null\t// fallback when no E2.ui, e.g. on site\n\tObject.defineProperty(this, 'isDragging', {\n\t\tget: function() {\n\t\t\tif (E2 && E2.ui && E2.ui.isDragging) {\n\t\t\t\t_isDragging = E2 && E2.ui && E2.ui.isDragging()\n\t\t\t}\n\t\t\treturn _isDragging\n\t\t},\n\t\tset: function(v) {\n\t\t\t_isDragging = v\n\t\t\tif (E2 && E2.ui && E2.ui.setDragging)\n\t\t\t\tE2.ui.setDragging(v)\n\t\t\treturn v\n\t\t}\n\t})\n\n\tthis.onResize = function() {\n\t\tthat.tagBodyClass();\n\t\treturn true;\n\t};\n\n\tthis.attach = function() {\n\n\t\tvar $body = jQuery('body');\n\t\tthis._setupDragRecognition()\n\n\t\twindow.addEventListener('resize', this.onResize, true)\n\n\t\tif (that.hasOrientationChange) {\n\t\t\t$(window).on('orientationchange', function () {\n\t\t\t\t$body\n\t\t\t\t\t.removeClass('orientationInitial')\n\t\t\t\t\t.addClass('orientationChanged');\n\t\t\t\tthat.onResize();\n\t\t\t\treturn true;\n\t\t\t})\n\t\t\t$body.addClass('orientationInitial');\n\t\t}\n\n\t\tArray.prototype.forEach.call(\n\t\t\tdocument.body.querySelectorAll('[data-hideshow-target]'),\n\t\t\tVizorUI.hideshow)\n\n\t\tjQuery('form.xhr').each(function(){\n\t\t\tVizorUI.setupXHRForm(jQuery(this));\n\t\t});\n\n\t\t// legacy forms\n\t\tjQuery('#accountDetailsForm, #resetPasswordForm, #loginForm, #forgotPasswordForm')\n\t\t\t.not('[data-xhrenabled]')\n\t\t\t.each(function(){\n\t\t\t\tVizorUI.setupXHRForm(jQuery(this));\n\t\t\t});\n\n\t\tVizorUI.enableScrollToLinks($body);\n\t\tVizorUI.enablePopupEmbedLinks($body);\n\n\t\tvar $signupForm = jQuery('#signupForm')\n\t\tif ($signupForm.length) {\n\t\t\t// default if the signup form ever gets hit on a static page\n\t\t\tvar signupCallback = function () {\n\t\t\t\twindow.location.href = '/account';\n\t\t\t};\n\t\t\tVizorUI.setupXHRForm($signupForm, signupCallback);\n\t\t\tVizorUI._setupAccountUsernameField(jQuery('input[name=username]', $signupForm)); // currentUsername is still unavailable\n\t\t}\n\n\t\t$(document).on(\"shown.bs.modal\", function() {\n\t\t\t$('.bootbox-close-button')\n\t\t\t\t.html('<svg class=\"icon-dialog-close\"><use xlink:href=\"#icon-close\"></use></svg>')\n\t\t\t\t.attr('style','opacity:1');\n\t\t});\n\t};\n\n\tthis._setupDragRecognition = function(domElement, dragThresholdPx) {\n\t\tdragThresholdPx = dragThresholdPx || 3\n\n\t\tvar that = this;\n\t\tdomElement = domElement || document\n\t\tvar dragThreshold = dragThresholdPx * dragThresholdPx\n\n\t\tvar up = function(data) { return function(e) {\n\t\t\tthat.isDragging = false;\n\t\t\tdocument.removeEventListener('mousemove', data.move, true)\n\t\t\tdocument.removeEventListener('touchmove', data.move, true)\n\t\t\tdocument.removeEventListener('mouseup', data.up)\n\t\t\tdocument.removeEventListener('touchcancel', data.up)\n\t\t\tdocument.removeEventListener('touchend', data.up)\n\t\t\twindow.removeEventListener('blur', data.up)\n\t\t\treturn true\n\t\t}}\n\n\t\tfunction move(data) {\n\t\t\tfunction findTouch(inTouches, touchId){\n\t\t\t\tfor (var i in inTouches) {\n\t\t\t\t\tif (inTouches[i].identifier === touchId)\n\t\t\t\t\t\treturn inTouches[i]\n\t\t\t\t}\n\t\t\t\treturn null\n\t\t\t}\n\t\t\treturn function(e) {\n\t\t\t\tvar t = (e.touches) ? findTouch(e.changedTouches, data.touchId) : e;\n\t\t\t\tif (!t) return true; // something extraordinary must have happened\n\t\t\t\tvar distSquared = data.origin.distanceSq(t)\n\t\t\t\tif (distSquared > dragThreshold)\n\t\t\t\t\tthat.isDragging = true;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tfunction onStart(e) {\n\t\t\tvar t = (e.touches) ? e.changedTouches[0] : e;\n\t\t\tvar data = {\n\t\t\t\ttouchId : t.identifier || 0,\n\t\t\t\torigin: {\n\t\t\t\t\tpageX: t.pageX,\n\t\t\t\t\tpageY: t.pageY,\n\t\t\t\t\tdistanceSq: function(fromPointer){\n\t\t\t\t\t\tvar dx = fromPointer.pageX - data.origin.pageX,\n\t\t\t\t\t\t\tdy = fromPointer.pageY - data.origin.pageY;\n\t\t\t\t\t\treturn dx*dx + dy*dy\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tdata.up = up(data)\n\t\t\tdata.move = move(data)\n\t\t\twindow.addEventListener('blur', data.up)\n\t\t\tdocument.addEventListener('touchend', data.up)\n\t\t\tdocument.addEventListener('touchcancel', data.up)\n\t\t\tdocument.addEventListener('mouseup', data.up)\n\t\t\tdocument.addEventListener('touchmove', data.move, true)\n\t\t\tdocument.addEventListener('mousemove', data.move, true)\n\t\t}\n\n\t\tdomElement.addEventListener('touchstart', onStart)\n\t\tdomElement.addEventListener('mousedown', onStart)\n\t}\n\n\n\tthis.init = function() {\n\n\t\tthat.tagBodyClass()\n\t\tthat.disableForceTouch()\n\t\tsetTimeout(that.tagBodyClass.bind(that), 50)\t// Safari\n\n\t\tthat.attach()\n\n\t\tif (jQuery('body.bHome.bIndex').length > 0) {\n\t\t\tthat.initHomepage()\n\t\t}\n\t\telse if (jQuery('body.bHome.bAbout').length > 0) {\n\t\t\tthat.initAbout()\n\t\t}\n\t\tVizorUI.replaceSVGButtons($('footer'))\n\t\t// auto popovers\n\t\t$('[data-toggle=\"popover\"]').popover({trigger: 'hover'})\n\n\t\tjQuery('button#mobileMenuOpenButton').on('mousedown touchdown', function(e){\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tvar $contentWrap = jQuery('div#contentwrap')\n\t\t\tvar $mobileMenu = jQuery(E2.views.partials.homeMobileMenu())\n\t\t\t\t.appendTo('div#contentwrap');\n\t\t\tvar menuHeight = $mobileMenu.outerHeight();\n\n\t\t\tvar $body = jQuery('body');\n\t\t\tvar css = {height:menuHeight, overflow:'hidden'};\n\t\t\t$body.css(css);\n\t\t\t$body.scrollTop(0);\n\t\t\t$contentWrap.css(css);\n\n\t\t\tvar dismissMenu = function() {\n\t\t\t\tvar css = {height:'', overflow:'initial'}\n\t\t\t\t$body.css(css);\n\t\t\t\t$contentWrap.css(css);\n\t\t\t\tjQuery('#mobilemenu')\n\t\t\t\t\t.fadeOut('fast', function(){\n\t\t\t\t\t\tjQuery(this).remove();\n\t\t\t\t\t});\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tjQuery('button#mobileMenuCloseButton', $mobileMenu).on('mousedown touchdown', function(e){\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t\twindow.removeEventListener('resize', dismissMenu)\n\t\t\t\tif (that.hasOrientationChange) window.removeEventListener('orientationchange', dismissMenu)\n\t\t\t\tdismissMenu();\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\t\tif (that.hasOrientationChange)\n\t\t\t\twindow.addEventListener('orientationchange', dismissMenu)\n\t\t\twindow.addEventListener('resize', dismissMenu)\n\n\t\t\t$mobileMenu.fadeIn('fast');\n\t\t\tVizorUI.enableScrollToLinks($mobileMenu);\n\n\t\t\treturn false;\n\t\t});\n\n\t\t\n\t}\n\n\tthis.initCollapsible = function($container) {\n\t\tvar $links = jQuery('a.trigger', $container)\n\t\t$links.on('click',\n\t\t\tfunction(e){\n\t\t\t\tif (this.href.split('#').length <= 1) return true\t// not for us\n\t\t\t\te.preventDefault()\n\t\t\t\te.stopPropagation()\n\n\t\t\t\tvar anchor = '#'+ this.href.split('#')[1]\n\t\t\t\tvar $target = jQuery(anchor)\n\t\t\t\tvar $a = jQuery(this)\n\n\t\t\t\tvar wasVisible = $target.is(':visible')\n\t\t\t\tif (wasVisible) {\n\t\t\t\t\t$target\n\t\t\t\t\t\t.slideUp('medium', function(){\n\t\t\t\t\t\t\tjQuery(this)\n\t\t\t\t\t\t\t\t.removeClass('uncollapsed')\n\t\t\t\t\t\t\t\t.addClass('collapsed')\n\t\t\t\t\t\t\t\t.css({margin: '0'})\n\t\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\t$target\n\t\t\t\t\t\t.hide()\n\t\t\t\t\t\t.removeClass('collapsed')\n\t\t\t\t\t\t.addClass('uncollapsed')\n\t\t\t\t\t\t.slideDown('medium')\n\t\t\t\t}\n\n\t\t\t\t$a\n\t\t\t\t\t.toggleClass('closed', wasVisible)\n\t\t\t\t\t.toggleClass('open', !wasVisible)\n\t\t\t\treturn false\n\t\t\t})\n\t\t$links.each(function(){\n\t\t\tvar anchor = '#'+ this.href.split('#')[1]\n\t\t\tvar $target = jQuery(anchor)\n\t\t\t$target.hide()\n\t\t})\n\t}\n\n\tthis.initHome = function($body) {\n\t\t$body = $body || jQuery('body')\n\t\tjQuery('a#homeSignin', $body).on('click', function(e) {\n\t\t\te.preventDefault()\n\t\t\te.stopPropagation()\n\t\t\tVizorUI.openLoginModal()\n\t\t\t.then(function(user){\n\t\t\t\tdocument.location.href=\"/\"+user.username\n\t\t\t})\n\t\t\treturn false\n\t\t})\n\n\t\tjQuery('a#homeSignup', $body).on('click', function(e) {\n\t\t\te.preventDefault()\n\t\t\te.stopPropagation()\n\t\t\tVizorUI.openSignupModal()\n\t\t\t.then(function(){\n\t\t\t\tdocument.location.href=\"/edit\"\n\t\t\t})\n\t\t\treturn false\n\t\t})\n\n\t\t$('.team-member').click(function() {\n\t\t\twindow.open($(this).find('.profile-link').attr('href'));\n\t\t})\n\t\t$('.team-button').click(function(e) {\n\t\t\tvar teamY = $window.height();\n\t\t\t$(\"html, body\").animate({scrollTop: teamY}, 500);\n\t\t\te.preventDefault();\n\t\t\treturn false;\n\t\t});\n\n\t\tVizorUI.replaceSVGButtons($('#contentwrap'))\n\t}\n\n\tthis.initAbout = function($body) {\n\t\tE2.track({ event: 'aboutPage' })\n\t\tthis.initHome()\n\t}\n\n\tthis.initHomepage = function($body) {\n        E2.track({ event: 'frontPage' })\n\t\tthis.initHome()\n\n\t\tvar $homePlayerContainer = jQuery('#player_home');\n\t\t\n\t\t$(window).on('vizorLoaded', function() {\n\t\t\t// E2.app.canInitiateCameraMove = function(){return false};\t// disable panning on homepage player, see #790\n\t\t\tE2.app.calculateCanvasArea = function() {\n                return{\n                    width: $homePlayerContainer.innerWidth(),\n                    height: $homePlayerContainer.innerHeight()\n                }\n            }\n\n\t\t\t// WebVRConfig.canInitiateCameraMove = E2.app.canInitiateCameraMove // see above\n\t\t\tWebVRConfig.getContainerMeta = E2.app.calculateCanvasArea\n\t\t});\n\n\n\t\tvar ms = []\n\t\tvar switchSlides = function(e){\n\t\t\tvar m\n\t\t\tif (e.detail.layout === 'mobile') {\n\t\t\t\tif (ms.length > 0) {\n\t\t\t\t\twhile (m = ms.pop()) {\n\t\t\t\t\t\tm.detach()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvar content = document.getElementById('featuredVR').querySelectorAll('div.mobileslides')\n\t\t\t\tArray.prototype.forEach.call(content, function(div){\n\t\t\t\t\tvar m = new Minislides(div,  {\n            slideContainerQuery:'section.list',\n            slideQuery:':scope>article',\n\t\t\t\t\t\ttransitionMethod: 'horizontal',\n\t\t\t\t\t\tswitcherContainer: div.parentElement,\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t\tms.push(m)\n\t\t\t\t})\n\n\t\t\t} else {\n\t\t\t\tif (ms.length > 0) {\n\t\t\t\t\twhile (m = ms.pop()) {\n\t\t\t\t\t\tm.detach()\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}.bind(this)\n\n\t\tdocument.addEventListener('uiLayoutChanged', switchSlides)\n\t\tif (this.getLayoutMode() === 'mobile')\n\t\t\tswitchSlides({detail:{layout:'mobile'}})\n\n\t}\n\n\t// check if device resembles touch-capable.\n\tthis.isTouchCapable = function() {\n\t  return !!('ontouchstart' in window);\n\t};\n\n\tthis.disableForceTouch = function() {\n\t\t$('body').on('webkitmouseforcewillbegin webkitmouseforcedown webkitmouseforceup webkitmouseforcechanged', function(e){\n          e.preventDefault()\n          e.stopPropagation()\n          return false\n      })\n\t}\n\n\tthis.isFullScreen = function() {\n\t\treturn !!(document.mozFullScreenElement || document.webkitFullscreenElement)\n\t}\n\n\tthis.isInIframe = function() {\n\t\ttry {\n\t\t\treturn window.self !== window.top;\n\t\t} catch (e) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tthis.isInVR = function() {\n\t\treturn (E2 && E2.core && E2.core.webVRAdapter && E2.core.webVRAdapter.isVRMode && E2.core.webVRAdapter.isVRMode())\n\t}\n\n\t/**\n\t * tags document.body with mobile|nonmobile and portrait|landscape classes. invoked at start\n\t */\n\tthis.tagBodyClass = function() {\n\t\tvar $body = jQuery('body');\n\n\t\tvar devicePixelRatio = window.devicePixelRatio || 1\n\n\t\tvar isBrowser = VizorUI.isBrowser\n\t\t$body\n\t\t\t.toggleClass('uaSafari', isBrowser.Safari())\n\t\t\t.toggleClass('uaFirefox', isBrowser.Firefox())\n\t\t\t.toggleClass('uaChrome', isBrowser.Chrome())\n\t\t\t.toggleClass('uaEdge', isBrowser.Edge())\n\n\t\t$body\n\t\t\t.toggleClass('deviceDesktop', that.deviceIsDesktop)\n\t\t\t.toggleClass('deviceTablet', that.deviceIsTablet)\n\t\t\t.toggleClass('deviceMobile', that.deviceIsPhone)\n\t\t\t.toggleClass('inIframe', that.isEmbedded)\n\t\t\t.toggleClass('inVR', !!that.isInVR())\n\n\t\t$body.attr('data-dpr', devicePixelRatio)\n\t\t$body.attr('data-touchcapable', that.isTouchCapable() ? 'true' : 'false')\n\n\t\tvar l = that.getLayoutMode();\n\t\tif (l !== that.lastLayout) {\n\t\t\t$body\n\t\t\t\t.toggleClass('layoutMobile',  l === 'mobile')\n\t\t\t\t.toggleClass('layoutTablet',  l === 'tablet')\n\t\t\t\t.toggleClass('layoutDesktop', l === 'desktop')\n\t\t\tdocument.dispatchEvent(new CustomEvent('uiLayoutChanged', {detail:{layout: l, lastLayout: that.lastLayout}}))\n\t\t\tthat.lastLayout = l;\n\t\t}\n\n\t\t// because of how .isPortraitLike() works on Android, this needs a delay\n\t\tfunction tagLandscapeOrPortrait() {\n\t\t\tvar o = that.isPortraitLike();\n\t\t\tif (o !== that.lastPortrait) {\n\t\t\t\tthat.lastPortrait = o\n\t\t\t\t$body\n\t\t\t\t\t.toggleClass('portrait', o)\n\t\t\t\t\t.toggleClass('landscape', !o);\n\t\t\t}\n\t\t}\n\n\t\tif (VizorUI.isMobile.Android())\n\t\t\tsetTimeout(tagLandscapeOrPortrait, 300)\n\t\telse\n\t\t\ttagLandscapeOrPortrait()\n\n\t\treturn true;\n\t};\n\n\t// check if orientation resembles portrait\n\tthis.isPortraitLike = function() {\n\t\tif (VizorUI.isMobile.Android()) {\n\t\t\t// http://stackoverflow.com/questions/30753522/chrome-43-window-size-bug-after-full-screen\n\t\t\t// https://www.sencha.com/forum/showthread.php?303224-Wrong-orientation-for-Galaxy-Tab-devices\n\t\t\treturn window.innerWidth <= window.innerHeight\n\t\t}\n\t\t// http://caniuse.com/#search=matchmedia\n\t\tvar mql = window.matchMedia(\"(orientation: portrait)\");\n\t\treturn mql.matches;\n\t};\n\n\tthis.isDevicePhone = function() {\n\t\tvar ua = navigator.userAgent\n\t\tvar matchiOS = !!ua.match(/iPhone|iPod/i)\n\t\tvar matchMobile = !!ua.match(/Mobile/i)\n\t\treturn matchMobile && (matchiOS || !this.isDeviceTablet())\n\t}\n\n\tthis.isDeviceTablet = function() {\n\t\tvar ua = navigator.userAgent\n\n\t\tvar matchAndroid \t= !!ua.match(/Android/i)\n\t\tvar matchMobile \t= !!ua.match(/Mobile/i)\n\t\tvar matchiPad \t\t= !!ua.match(/iPad/i)\n\n\t\treturn matchiPad || (matchAndroid && !matchMobile)\n\t}\n\n\tthis.isDeviceDesktop = function() {\n\t\t// match OS\n\t\tvar ua = navigator.userAgent\n\t\tvar matchOS = !!ua.match(/Windows|Mac OS X|Linux/i)\n\t\treturn matchOS && !(this.isDevicePhone() || this.isDeviceTablet())\n\t}\n\n\tthis.getLayoutMode = function() {\t// note, match css!\n\t\tif (this.isInIframe()) return 'default'\n\t\tif (this.mqMobile.matches)\n\t\t\treturn 'mobile';\n\t\telse if (this.mqTablet.matches)\n\t\t\treturn 'tablet';\n\t\telse if (this.mqDesktop.matches)\n\t\t\treturn 'desktop';\n\t\telse\n\t\t\treturn 'default'\n\t};\n\n\tthis.isModalOpen = function() {\n\t\tvar $modal = jQuery('div.bootbox.modal');\n\t\tthat.lastModalIsOpen = $modal.hasClass('in');\n\t\treturn that.lastModalIsOpen\n\t}\n\n\tthis.deviceIsTablet = this.isDeviceTablet()\n\tthis.deviceIsPhone = this.isDevicePhone()\n\tthis.deviceIsDesktop = this.isDeviceDesktop()\n\tthis.isEmbedded = this.isInIframe()\n\n\tthis.lastModalIsOpen = false\n}\n\nsiteUI.formatFileSize = function(size) {\t// bytes\n\tif (isNaN(size) || (size < 0)) return size\n\n\tif (size < 1024)\n\t\treturn size + ' bytes'\n\n\tsize = size / 1024\n\n\tif (size < 1000)\n\t\treturn Math.round(size) + ' kB'\n\n\tsize = size / 1024\n\n\tif (size < 1000)\n\t\treturn size.toFixed(1) + ' MB'\n\n\tsize = size / 1024\n\n\treturn size.toFixed(2) + ' GB'\n}\n\n// youtube only for the time being\nVizorUI.enablePopupEmbedLinks = function($container) {\n\tvar $links = jQuery('a.popup.embed', $container);\n\t$links.off('.popupembed');\n\n\t$links.filter('[href*=\"youtube\"]').on('click.popupembed', function(e){\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\n\t\tvar html = E2.views.partials.embedYoutube({src: this.href});\n\t\tVizorUI.modalOpen(html, null, 'popupEmbed youtube');\n\t\treturn false;\n\t});\n}\n\n// a class='scrollto' href='#anchor'\nVizorUI.enableScrollToLinks = function($container) {\n\tjQuery('a.scrollto', $container)\n\t\t.off('.scrollto')\n\t\t.on('click.scrollto', function(e){\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\t\t\tvar href = '#' + this.href.split('#')[1];\n\n\t\t\tvar f = function() {\n\t\t\t\tvar loc = jQuery(href).offset().top;\n\t\t\t\t$(\"html, body\").animate({ scrollTop: ''+loc+'px' }, 500);\n\t\t\t};\n\t\t\tif (jQuery(href).length > 0)\n\t\t\t\tf();\n\t\t\telse\n\t\t\t\tsetTimeout(f, 150);\n\n\t\t\treturn false;\n\t\t});\n}\n\nVizorUI.openLoginModal = function(dfd) {\n\tif (E2 && E2.controllers && E2.controllers.account)\n\t\treturn E2.controllers.account.openLoginModal(dfd)\n\t// else\n\t// window.location.href=\"/account\";\n\treturn false;\n}\n\nVizorUI.openSignupModal = function() {\n\treturn E2.controllers.account.openSignupModal();\n}\n\nVizorUI.userIsLoggedIn = function() {\n\tvar user = E2.models.user.toJSON();\n\treturn (typeof user.username !== 'undefined') && (user.username !== '');\n};\n\n/***** MODAL LAYER *****/\nVizorUI.modalOpen = function(html, heading, className, onEscape, opts) {\n\topts = _.extend({\n\t\ttitle: heading,\n\t\tclassName : className,\n\t\tonEscape: (typeof onEscape !== 'undefined') ? onEscape : true\n\t}, opts)\n\n\topts.message = html\t// always overwrite\n\tif (typeof opts.backdrop === 'undefined')\n\t\topts.backdrop = opts.onEscape\t// bb 4.4+\n\n\tvar modal = bootbox.dialog(opts)\n\n\tvar trackModalStatus = function() {\n\t\tsiteUI.isModalOpen()\n\t\treturn true\n\t}\n\n\tmodal\n\t\t.on('hidden.bs.modal', trackModalStatus)\n\t\t.on('shown.bs.modal', trackModalStatus)\n\n\treturn modal\n}\n\nVizorUI.modalClose = function(bb) {\n\tif (typeof bb !== 'undefined') bb.modal('hide');\n\telse bootbox.hideAll();\n};\n\n// shorthand\nVizorUI.modalAlert = function(message, heading, className, okLabel) {\n\tvar opts = {\n\t\tbuttons: {\n\t\t\tOK : {\n\t\t\t\tlabel: okLabel || \"OK\",\n\t\t\t\tcallback: function(){}\n\t\t\t}\n\t\t}\n\t}\n\treturn VizorUI.modalOpen('<p>'+message+'</p>', heading, className, true, opts);\n}\n\n\n\nVizorUI.growl = function(message, type, duration, user) {\n\ttype = type || 'info'\n\tduration = 500 + (duration || 2000)\t\t\t// account for reveal animations\n\n\tvar fromUser = _.extend({\n\t\tusername: '',\n\t\tcolor: 'transparent',\n\t\tfirstLetter: '',\n\t\tgravatar: ''\n\t}, user)\n\n\tif (fromUser.username) {\n\t\tfromUser.firstLetter = fromUser.username.charAt(0)\n\t}\n\n\tvar data = {\n\t\ttype: type,\n\t\tfromUser: fromUser,\n\t\tmessage: message\n\t}\n\n\tvar $notificationArea = jQuery('#notifications-area')\n\tif (!$notificationArea.length) {\n\t\t$notificationArea = jQuery('<div id=\"notifications-area\"></div>')\n\t\tjQuery('body').append($notificationArea)\n\t}\n\n\tvar $notification = jQuery(E2.views.partials.notification(data))\n\n\tvar remove = function () {\n\t\t$notification.remove()\n\t\tif (jQuery('>div', $notificationArea).length === 0) {\n\t\t\t$notificationArea.remove()\n\t\t}\n\t}\n\n\tvar close = function() {\n\t\t$notification.removeClass('notification-show').addClass('notification-hide')\n\t\tsetTimeout(remove, 1000)\n\t}\n\n\t$notificationArea.append($notification)\n\t$notification.addClass('notification-show')\n\n\tsetTimeout(close, duration * $('.notification', $notificationArea).length)\n\n\treturn $notification\n}\n\nVizorUI.notifyBySite = function(text, timeout) {\n\treturn VizorUI.growl(text, 'notify-site', timeout || 2000)\n}\n\n\nVizorUI.isBrowser = {\n\tWebKit: function () {\n\t\treturn !!navigator.userAgent.match(/AppleWebKit/)\n\t},\n\tGecko: function () {\n\t\treturn !!navigator.userAgent.match(/Gecko/)\n\t},\n\tFirefox: function () {\n\t\treturn !!navigator.userAgent.match(/Firefox/)\n\t},\n\tChrome: function () {\n\t\treturn (!!navigator.userAgent.match(/Chrome/)) || (!!navigator.userAgent.match(/CriOS/))\n\t},\n\tSafari: function () {\n\t\treturn !!navigator.userAgent.match(/Safari/)\n\t},\n\tEdge: function () {\n\t\treturn !!navigator.userAgent.match(/Edge/)\n\t}\n}\n\nVizorUI.isMobile = {\n\tAndroid: function() {\n\t\treturn navigator.userAgent.match(/Android/i);\n\t},\n\tBlackBerry: function() {\n\t\treturn navigator.userAgent.match(/BlackBerry/i);\n\t},\n\tiOS: function() {\n\t\treturn navigator.userAgent.match(/iPhone|iPad|iPod/i);\n\t},\n\tOpera: function() {\n\t\treturn navigator.userAgent.match(/Opera Mini/i);\n\t},\n\tWindows: function() {\n\t\treturn navigator.userAgent.match(/IEMobile/i) || navigator.userAgent.match(/WPDesktop/i);\n\t},\n\tany: function() {\n\t\tif (E2 && E2.util && E2.util.isMobile && E2.util.isMobile.any)\t// legacy graphs\n\t\t\treturn E2.util.isMobile.any()\n\t\telse\n\t\t\treturn VizorUI.isMobile.iOS || VizorUI.isMobile.Android\n\t}\n}\n\n/**\n * adds handler to check whether desired username is available.\n * this is used in the signup form, and may be used in the account details form\n * @param $input jQuery\n * @param currentUsername string\n */\nVizorUI._setupAccountUsernameField = function($input, currentUsername) {\n\tvar _t = null;\n\tvar lastValue=false;\n\t$input.on('keyup', function(e){\n\t\tvar value = $input.val().trim();\n\t\tvar checkUsername = currentUsername || E2.models.user.get('username');\t// last resort\n\t\tif (value && (value !== checkUsername) && (value !== lastValue)) {\n\t\t\tlastValue=value;\n\t\t\tif (_t) clearTimeout(_t);\n\t\t\t_t = setTimeout(function(){\n\t\t\t\tjQuery.ajax({\t\t// backend responds with 409 or 200 here.\n\t\t\t\t\ttype: \"POST\",\n\t\t\t\t\turl: '/account/exists',\n\t\t\t\t\tdata: jQuery.param({'username': value}),\n\t\t\t\t\terror: function(err) { // assume 409\n\t\t\t\t\t\tvar errText = 'Sorry, this username is already taken'\n\t\t\t\t\t\t$input.parent().addClass('error').find('span.message').html(errText);\n\t\t\t\t\t},\n\t\t\t\t\tsuccess: function() {\t// 200\n\t\t\t\t\t\tif ($input.val() === value) {\t//\n\t\t\t\t\t\t\t$input.parent().removeClass('error').find('span.message').html('');\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\tdataType: 'json'\n\t\t\t\t});\n\t\t\t}, 1000);\t// every sec\n\t\t}\n\t\treturn true;\n\t});\n};\n\n/**\n * replaces all svg buttons that have a data-svgref attribute,\n * if class .tiny also moving text from the content of the button to a popover tooltip\n * @param $selector jQuery\n * @returns {boolean} replaced any\n */\nVizorUI.replaceSVGButtons = function($selector) {\n\n\tvar numReplaced=0;\n\t$selector.find('button.svg[data-svgref!=\"\"], a.svg[data-svgref!=\"\"]').each(function(){\n\t\tvar $button = jQuery(this);\n\t\tvar xref = $button.data('svgref');\n\t\tif (!xref) return;\n\n\t\tnumReplaced++;\n\t\tvar usehtml = \"<use xlink:href='#\"+ xref +\"'></use>\"\t// browser won't parse this custom tag unless in svg\n\t\tvar $svg = jQuery('<svg>'+usehtml+'</svg>');\n\n\t\t$button.data('svgref', false).attr('data-svgref','');\n\n\t\tif ($button.hasClass('tiny') && ($button.text() !== '')) {\n\t\t\tif (!$button.hasClass('nopopup')) {\n\t\t\t\t$button.popover({\n\t\t\t\t\tcontent: $button.text(),\n\t\t\t\t\tdelay: {\n\t\t\t\t\t\tshow: 750,\n\t\t\t\t\t\thide: 100\n\t\t\t\t\t},\n\t\t\t\t\tplacement: 'auto top',\n\t\t\t\t\ttrigger: 'hover'\n\t\t\t\t})\n\n\t\t\t\t$button.click(function(){\n\t\t\t\t\t$button.popover('hide')\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tif (!$button.attr('title'))\n\t\t\t\t\t$button.attr('title', $button.text())\n\t\t\t}\n\t\t\t$button.text('');\n\t\t}\n\t\t// place an empty <svg> wherever you want the image, or one will be appended\n\t\tvar $existingSvg = jQuery('svg', $button);\n\t\tif ($existingSvg.length > 0)\n\t\t\t$existingSvg.replaceWith($svg);\n\t\telse\n\t\t\t$button.append($svg);\n\t});\n\n\treturn (numReplaced>0);\n};\n\n/**\n * makes an element hide or show on trigger click\n * @example <button data-hideshow=\"hide\" data-target=\"hstarget\">click</button><div id=\"hstarget\">...</div>\n * @param triggerEl\n * @emits hideshow:changed on triggerEl when its visibility changes\n */\nVizorUI.hideshow = function(triggerEl) {\n\tif (triggerEl.hideshow)\n\t\ttriggerEl.removeEventListener('click', triggerEl.hideshow._listener)\n\n\tvar initialState = triggerEl.dataset['hideshow']\n\ttriggerEl.hideshow = {\n\t\t// *etters\n\t\tget default() {\n\t\t\treturn initialState\n\t\t},\n\t\tget target() {\n\t\t\treturn document.getElementById(triggerEl.dataset['hideshowTarget'])\n\t\t},\n\t\tget visible() {\n\t\t\treturn this.target.dataset['hideshow'] === 'show'\n\t\t},\n\t\tset visible(v) {\n\t\t\tvar target = this.target\n\t\t\ttarget.dataset['hideshow'] = triggerEl.dataset['hideshow'] = v ? 'show' : 'hide'\n\t\t\ttarget.dispatchEvent(new CustomEvent('hideshow:changed', {detail:{visible: this.visible, trigger: triggerEl}}))\n\t\t\treturn !!v\n\t\t},\n\t\t// methods\n\t\tset : function(state) {\n\t\t\tthis.visible = (state === 'show')\n\t\t},\n\t\ttoggle : function() {\n\t\t\tthis.visible = !this.visible\n\t\t},\n\t\t_listener : function(e) {\n\t\t\te.preventDefault()\n\t\t\te.currentTarget.hideshow.toggle()\n\t\t}\n\t}\n\n\ttriggerEl.hideshow.target.style.display = null;\t// allow style=\"display:none\" to avoid flashes\n\ttriggerEl.hideshow.set(initialState)\n\ttriggerEl.addEventListener('click', triggerEl.hideshow._listener)\n}\n\n/**\n * wires up svg buttons on asset card to fire events as per assetUIEvent\n * @param $card\n */\nVizorUI.setupAssetCard = function($card) {\n\n\tvar dispatchAction = function(e){\n\t\tvar $this = jQuery(e.currentTarget)\n\t\t$card = $this.parents('article.asset.card').first()\n\t\tif (!$card) return true\n\t\tvar detail = {\n\t\t\tid: \t$card.data('objectid'),\n\t\t\turl: \t$card.data('url'),\n\t\t\tpath: \t$card.data('path'),\n\t\t\ttype: \t$card.data('asset-type'),\n\t\t\taction:\t$this.data('action'),\n\t\t\ttriggeredByEl: e.currentTarget\n\t\t}\n\t\tvar eventName = detail.type + '.' + detail.action\t// e.g. graph.open, project.delete\n\t\tvar cardEvent = new CustomEvent(eventName, {detail: detail})\n\t\tdocument.dispatchEvent(cardEvent)\n\t\treturn true\n\t}\n\n\tVizorUI.replaceSVGButtons($card)\n\n\tjQuery('button', $card).off('.assetUI')\t\t// remove just us from all buttons\n\n\tjQuery('button.action', $card).on('click.assetUI', dispatchAction)\n\tjQuery('input[type=checkbox]', $card).on('change.assetUI', dispatchAction)\n\n\treturn true\n}\n\n// returns a promise for a confirmation dialog\nVizorUI.requireConfirm = function(message) {\n\treturn new Promise(function(resolve, reject){\n\t\tif (confirm(message || 'please confirm?'))\n\t\t\tresolve()\n\t\telse\n\t\t\treject()\n\t})\n}\n\nVizorUI.toggleAccountDropdown = function() {\n\tif (VizorUI.userIsLoggedIn()) {\n\t\tjQuery('#userPullDown').toggle()\n\t}\n\treturn false\n}\n\n/**\n * data : {\torigin:\t\tVizor.origin,\t\te.g. http://localhost:8000\n * \t\t\tshareURL : \tVizor.shareURL,\t\te.g. http://localhost:8000/eesn/flamingofront\n * \t\t\tembedSrc : \tVizor.embedSrc\t\te.g. http://localhost:8000/embed/eesn/flamingofront\n * \t\t   }\n */\nVizorUI.graphShareDialog = function(data, opts) {\n\tdata.autoplay = true\n\tdata.noHeader = false\n\topts = _.extend({\n\t\ttitle: \"Share this\"\n\t}, opts)\n\n\tvar html = E2.views.partials.playerShareDialog(data)\n\tvar modal = VizorUI.modalOpen(html, opts.title, 'player_share doselect_all', undefined, opts)\n\tmodal\n\t\t.find('textarea, input')\n\t\t.on('mouseup touchup', function (e) {\n\t\t\te.currentTarget.select()\n\t\t\te.currentTarget.setSelectionRange(0, 9999)\n\t\t\te.preventDefault()\n\t\t\treturn true\n\t\t})\n\t\t.on('focus', function (e) {\n\t\t\te.preventDefault()\n\t\t\te.stopPropagation()\n\t\t\treturn false\n\t\t})\n\n\tsiteUI.initCollapsible(modal)\n\treturn modal\n}\n\n\nVizorUI.renderGraphTile = function(tileData, withActions, withAllActions) {\n\tvar data = _.extend(_.cloneDeep(tileData), {\n\t\t\twithActions:withActions,\n\t\t\tallowAllActions: withAllActions\n\t\t})\n\treturn E2.views.partials.assets.graphCard(data)\n}\n\n\njQuery('document').ready(function(){\n\tif (!window)\n\t\treturn\n\tsiteUI.init()\n})\n"
  },
  {
    "path": "browser/scripts/ui-upload.js",
    "content": "(function() {\n\nvar modelsByExtension = {\n\t'.ogg': 'audio',\n\t'.ogv': 'video',\n\t'.jpg': 'image',\n\t'.png': 'image',\n\t'.js': 'scene',\n\t'.json': 'scene',\n\t'.obj': 'scene',\n\t'.gltf': 'scene',\n\t'.fbx': 'scene',\n\t'.dae': 'scene',\n\t'.zip': 'scene'\n}\n\nfunction uploadFile(file) {\n\tvar dfd = when.defer()\n\n\tvar fnl = file.name.toLowerCase()\n\n\tvar extname = fnl.substring(fnl.lastIndexOf('.'))\n\tvar modelName = modelsByExtension[extname]\n\n\tvar formData = new FormData()\n\tformData.append('filename', file.name)\n\tformData.append('file', file)\n\n\t$.ajax({\n\t\turl: '/upload/' + modelName,\n\t\ttype: 'POST',\n\t\txhr: function() {\n\t\t\tvar xhr = $.ajaxSettings.xhr()\n\t\t\txhr.upload.addEventListener('progress', function(evt) {\n\t\t\t\tif (evt.lengthComputable)\n\t\t\t\t\tE2.ui.updateProgressBar(Math.floor(evt.loaded/evt.total * 100))\n\t\t\t}, false)\n\n\t\t\treturn xhr\n\t\t},\n\t\tsuccess: function(uploadedFile) {\n\t\t\tE2.track({\n\t\t\t\tevent: 'uploaded', \n\t\t\t\tmodelName: modelName,\n\t\t\t\tpath: uploadedFile.url\n\t\t\t})\n\n\t\t\tE2.ui.updateProgressBar(100)\n\t\t\tE2.models.fileList.addFile(file)\n\t\t\tuploadedFile.modelName = modelName\n\t\t\tdfd.resolve(uploadedFile)\n\t\t},\n\t\terror: function(err) {\n\t\t\tvar errMsg = err.responseJSON ? err.responseJSON.message : err\n\t\t\tdfd.reject(errMsg)\n\t\t},\n\t\tdata: formData,\n\t\tcache: false,\n\t\tcontentType: false,\n\t\tprocessData: false,\n\t\tdataType: 'json'\n\t})\n\n\treturn dfd.promise\n}\n\n// Traverse the pasted nodes and perform any fixup (fix\nfunction postPasteFixup(nodes, fixupCallback) {\n\tfunction fixupNode(node) {\n\t\tif (E2.GRAPH_NODES.indexOf(node.plugin.id) > -1) {\n\t\t\tfor (var i = 0, len = node.plugin.graph.nodes.length; i < len; ++i) {\n\t\t\t\tfixupNode(node.plugin.graph.nodes[i])\n\t\t\t}\n\t\t}\n\n\t\tif (fixupCallback)\n\t\t\tfixupCallback(node)\n\t}\n\n\tfor (var i = 0, len = nodes.length; i < len; ++i) {\n\t\tfixupNode(nodes[i])\n\t}\n}\n\nfunction instantiatePluginForUpload(uploaded, position) {\n\tvar dfd = when.defer()\n\tvar pluginId\n\n\t// add a node to graph if graph visible\n\tswitch(uploaded.modelName) {\n\t\tcase 'image':\n\t\t\tpluginId = 'url_texture_generator'\n\t\t\tbreak;\n\t\tcase 'scene':\n\t\t\tpluginId = 'three_loader_scene'\n\t\t\tbreak;\n\t\tcase 'audio':\n\t\t\tpluginId = 'url_audio_buffer_generator'\n\t\t\tbreak;\n\t\tcase 'video':\n\t\t\tpluginId = 'url_video_generator'\n\t\t\tbreak;\n\t}\n\n\tvar node = E2.app.createPlugin(pluginId, position)\n\tnode.plugin.state.url = uploaded.url\n\n\tE2.track({\n\t\tevent: 'nodeAdded', \n\t\tid: pluginId,\n\t\tfromUpload: true\n\t})\n\n\tE2.app.graphApi.addNode(E2.core.active_graph, node)\n\n\tdfd.resolve(node)\n\n\tpostPasteFixup([node])\n\n\treturn dfd.promise\n}\n\nfunction instantiateTemplateForUpload(asset, position) {\n\tvar dfd = when.defer()\n\n\tvar templateName\n\tvar templateData = _.clone(asset)\n\n\tvar isEquiRectangular = asset.tags.indexOf('equirectangular') !== -1\n\n\tfunction fixupCallback(node) {\n\t\tif (node.plugin.id === 'three_mesh') {\n\t\t\tnode.plugin.postLoadCallback = new TexturePlacementHelper()\n\t\t}\n\n\t\tif (node.plugin.id === 'three_loader_scene') {\n\t\t\tnode.plugin.postLoadCallback = new ObjectPlacementHelper()\n\t\t}\n\t}\n\n\tconsole.info('instantiating template for asset', asset)\n\n\tif (!templateData.name) {\n\t\ttemplateData.name = asset.path\n\t\t\t.substring(asset.path.lastIndexOf('/') + 1)\n\t}\n\t\n\t// add to scene if graph not visible\n\tswitch(asset.modelName) {\n\t\tcase 'image':\n\t\t\ttemplateName = 'texture-plane.hbs'\n\t\t\tif (isEquiRectangular) {\n\t\t\t\ttemplateName = '360photo.hbs'\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'scene':\n\t\t\ttemplateName = 'scene.hbs'\n\t\t\tbreak;\n\t\tcase 'audio':\n\t\t\ttemplateName = 'audio.hbs'\n\t\t\tbreak;\n\t\tcase 'video':\n\t\t\ttemplateName = 'video_plane.patch.hbs'\n\t\t\tbreak;\n\t}\n\n\t$.get('/patchTemplates/'+templateName)\n\t.done(function(templateSource) {\n\t\tvar template = Handlebars.compile(templateSource)\n\t\tvar patch = template(templateData)\n\n\t\ttry {\n\t\t\tpatch = JSON.parse(patch)\n\t\t} catch(err) {\n\t\t\treturn dfd.reject(err)\n\t\t}\n\n\t\tE2.app.undoManager.begin('Drag & Drop Upload')\n\n\t\t// if there is already a 360 photo in the scene,\n\t\t// replace it with this one\n\t\tif (isEquiRectangular) {\n\t\t\tE2.app.removeEntityFromScene('threesixty_photo_entity')\n\t\t}\n\n\t\tE2.track({\n\t\t\tevent: 'patchAdded', \n\t\t\tname: templateName,\n\t\t\tfromUpload: true\n\t\t})\n\n\t\tvar pasted = E2.app.pasteInGraph(E2.core.root_graph, patch, position[0], position[1])\n\t\tpostPasteFixup(pasted.nodes, fixupCallback)\n\n\t\tif (E2.app.isWorldEditorActive() && asset.modelName !== 'audio') {\n\t\t\tE2.app.worldEditor.onEntityDropped(pasted.nodes[0])\n\t\t}\n\n\t\tE2.app.undoManager.end()\n\n\t\tdfd.resolve()\n\t})\n\t.fail(function(error) {\n\t\tdfd.reject(error)\n\t})\n\n\treturn dfd.promise\n}\n\n/**\n * listen to file drops, and upload all accepted files to right category on server\n */\nVizorUI.prototype.initDropUpload = function() {\n\tvar that = this\n\tvar target = $(document)\n\n\tE2.dom.dragOverlay.height(E2.dom.canvases.height())\n\n\tfunction cleanup() {\n\t\tE2.dom.dropUploading.hide()\n\t\tE2.dom.dragOverlay.hide()\n\t\tthat.uploading = false\n\t\t$('body').css('pointerEvents', 'all')\n\t\tdocument.removeEventListener('visibilitychange', cleanup)\n\t\treturn false\n\t}\n\n\ttarget.on('drop', function(e) {\n\t\te.preventDefault();\n\n\t\tvar dropPosition = [ e.clientX, e.clientY ]\n\t\t\n\t\tE2.dom.dropArea.hide()\n\n\t\tif (!E2.models.user.get('username')) {\n\t\t\tE2.dom.dragOverlay.hide()\n\t\t\tcleanup()\n\t\t\treturn bootbox.alert('Please sign in before uploading.')\n\t\t}\n\n\t\tvar files = e.originalEvent.dataTransfer.files;\n\t\t\n\t\tvar acceptedFiles = []\n\t\tfor (var i=0; i < files.length; i++) {\n\t\t\tvar file = files[i]\n\t\t\tvar fnl = file.name.toLowerCase()\n\t\t\tvar extname = fnl.substring(fnl.lastIndexOf('.'))\n\t\t\tif (modelsByExtension[extname])\n\t\t\t\tacceptedFiles.push(file)\n\t\t}\n\n\t\tif (!acceptedFiles.length)\n\t\t\treturn cleanup()\n\n\t\tE2.dom.dropUploading.show()\n\n\t\tthat.uploading = true\n\n\t\twhen.map(acceptedFiles, uploadFile)\n\t\t.catch(function(err) {\n\t\t\tbootbox.alert('Upload failed: ' + err)\n\t\t})\n\t\t.then(function(uploadedFiles) {\n\t\t\treturn when.map(uploadedFiles, function(uploaded) {\n\t\t\t\t// dropping into root graph, you want it in the scene\n\t\t\t\tif (E2.core.active_graph === E2.core.root_graph)\n\t\t\t\t\treturn instantiateTemplateForUpload(uploaded, dropPosition)\n\n\t\t\t\tif (E2.ui.isPatchEditorVisible()) {\n\t\t\t\t\treturn instantiatePluginForUpload(uploaded, dropPosition)\n\t\t\t\t} else {\n\t\t\t\t\treturn instantiateTemplateForUpload(uploaded, dropPosition)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t\t.then(function() {\n\t\t\tcleanup()\n\t\t})\n\t\t\n\t\treturn false\n\t})\n\n\ttarget.on('dragenter', function(e) {\n\t\te.stopPropagation()\n\t\te.preventDefault()\n\t\tdocument.addEventListener('visibilitychange', cleanup)\n\t})\n\t\n\ttarget.on('dragover', function(e) {\n\t\te.stopPropagation()\n\t\te.preventDefault()\n\n\t\t$('body').css('pointerEvents', 'none')\n\n\t\tif (!that.isUploading()) {\n\t\t\tE2.dom.dragOverlay.show()\n\t\t\tE2.dom.dropArea.show()\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\n\t\treturn true\n\t})\n\t\n\ttarget.on('dragleave dragend', function(e) {\n\t\te.stopPropagation()\n\t\te.preventDefault()\n\n\t\t// we get dragleave on CANVAS and HTML elements, drop the CANVAS ones\n\t\tif (e.target.tagName !== 'HTML')\n\t\t\treturn;\n\n\t\tcleanup()\n\n\t\treturn false\n\t})\n}\n\n})()\n\n"
  },
  {
    "path": "browser/scripts/ui.js",
    "content": "// require ui-core.js\n\nVizorUI.prototype.setupEventHandlers = function(e2, dom) {\n\tif (typeof e2 === 'undefined') return false;\n\n\tdom = dom || this.dom;\n\te2.app.openPatchSaveDialog = this.openPatchSaveDialog.bind(e2.app);\n\n\tvar that = this;\n\n\n\tdom.btnAssets.click(this.onBtnAssetsClicked.bind(this));\n\tdom.btnPatches.click(this.onBtnPatchesClicked.bind(this));\n\tdom.btnChatDisplay.click(this.onBtnChatClicked.bind(this));\n\tdom.btnHideAll.click(this.onBtnHideAllClicked.bind(this));\n\tdom.btnInspector.click(this.onBtnInspectorClicked.bind(this));\n\tdom.btnEditorCam.click(this.enterEditorView.bind(this));\n\tdom.btnVRCam.click(this.enterVRView.bind(this));\n\n\tdom.btnHelp = document.getElementById('btn-help')\n\tdom.btnHelp.addEventListener('click', this.onBtnHelpClicked.bind(this))\n\n\tvar setModeBuild = this.setModeBuild.bind(this),\n\tsetModeProgram = this.setModeProgram.bind(this)\n\tdom.btnBuildMode.click(setModeBuild);\n\tdom.btnProgramMode.click(setModeProgram);\n\tdom.patchesLib.find('a[href=\"#objects\"]').click(setModeBuild)\n\tdom.patchesLib.find('a[href=\"#patches\"]').click(setModeProgram)\n\n\tvar makeTabHandler = function(panelStateKey) {\n\t\treturn function(e) {\n\t\t\tif (e) {\n\t\t\t\te.preventDefault();\n\t\t\t}\n\t\t\tvar $a = jQuery(e.currentTarget);\n\t\t\tvar $li = $a.parent();\t// e.g. dom.tabObjects, dom.tabPatches, etc.\n\t\t\tif ($li.hasClass('disabled')) return true;\n\t\t\tvar s = this.state.panelStates[panelStateKey];\n\t\t\tvar stateChanged = false;\n\t\t\tif (s.collapsed) {\n\t\t\t\ts.collapsed = false;\n\t\t\t\tstateChanged = true;\n\t\t\t}\n\t\t\tif (!$li.hasClass('active')) {\n\t\t\t\ts.selectedTab = '#' + e.currentTarget.href.split('#')[1];\t// link\n\t\t\t\tstateChanged = true;\n\t\t\t}\n\t\t\tif (stateChanged)\n\t\t\t\tthis.state.panelStates[panelStateKey] = s;\n\t\t\treturn false;\n\t\t}.bind(that);\n\t};\n\n\tdom.chatWindow.find('ul.nav-tabs a').click(makeTabHandler('chat'));\n\tdom.patchesLib.find('ul.nav-tabs a').click(makeTabHandler('patches'));\n\tdom.propertiesPanel.find('ul.nav-tabs a').click(makeTabHandler('properties'));\n\n\tif (dom.assetsLib) dom.assetsLib.find('ul.nav-tabs a').click(makeTabHandler('assets'));\n\n\tvar makeCollapseHandler = function(panelStateKey) {\n\t\treturn function(e) {\n\t\t\tif (e) {\n\t\t\t\te.preventDefault();\n\t\t\t\te.stopPropagation();\n\t\t\t}\n\t\t\tvar newState = this.state.panelStates[panelStateKey] || {}\n\t\t\tnewState.collapsed = !newState.collapsed\n\t\t\tthis.state.panelStates[panelStateKey] = newState\n\t\t\treturn false;\n\t\t}.bind(that);\n\t};\n\tdom.chatToggleButton.click(makeCollapseHandler('chat'));\n\tdom.assetsToggle.click(makeCollapseHandler('assets'));\n\tdom.patchesToggle.click(makeCollapseHandler('patches'));\n\tdom.propertiesToggle.click(makeCollapseHandler('properties'));\n\n\tdom.assetsClose.click(this.closePanelAssets.bind(this));\n\tdom.patchesClose.click(this.closePanelPatches.bind(this));\n\tdom.chatClose.click(this.closePanelChat.bind(this));\n\tdom.propertiesClose.click(this.closePanelProperties.bind(this));\n\n\tdom.publishButton.click(function() {\n\t\tE2.app.onPublishClicked()\n\t});\n\n\tvar updatePanelState = function(which, domElement) {\n\t\tthat.state.panelStates[which] = VizorUI.getDomPanelState(domElement);\n\t}\n\t// drag handlers, for when the panels are dragged\n\tdom.propertiesPanel.on(uiEvent.moved, function(){  updatePanelState('properties', dom.propertiesPanel)   });\n\tdom.assetsLib.on(uiEvent.moved, function(){  updatePanelState('assets', dom.assetsLib)   });\n\tdom.patchesLib.on(uiEvent.moved, function(){ updatePanelState('patches', dom.patchesLib) });\n\tdom.chatWindow\n\t\t.on(uiEvent.moved, function() {\n\t\t\tupdatePanelState('chat', dom.chatWindow)\n\t\t})\n\t\t.on(uiEvent.resized, function(){\n\t\t\tupdatePanelState('chat', dom.chatWindow);\n\t\t})\n\t\t.find('.resize-handle')\n\t\t.on('mousemove touchmove', that.onChatResize.bind(that))\n\n\tvar switchModifyMode = function(modifyMode){\n\t\treturn function(e){\n\t\t\te.preventDefault()\n\t\t\te.stopPropagation()\n\t\t\tvar state = that.state\n\t\t\tstate.modifyModeDefault = modifyMode\n\t\t\tstate.modifyMode = state.modifyModeDefault\n\t\t\treturn false\n\t\t}\n\t}\n\tdom.btnMove.on('mousedown', switchModifyMode(uiModifyMode.move));\n\tdom.btnRotate.on('mousedown', switchModifyMode(uiModifyMode.rotate));\n\tdom.btnScale.on('mousedown', switchModifyMode(uiModifyMode.scale));\n\n\tE2.app.graphStore.on('nodeRenamed', this.refreshBreadcrumb)\n\n};\n\n\nVizorUI.prototype.init = function(e2) {\t// normally the global E2 object\n\te2.app.onWindowResize();\n\n\tthis._init(e2);\n\n\tvar that = this;\n\tvar dom = this.dom;\n\n\tdom.propertiesPanel = $('#properties-panel');\n\tdom.propertiesClose = $('#properties-close', dom.propertiesPanel)\n\tdom.propertiesToggle = $('#properties-toggle', dom.propertiesPanel)\n\n\tthis.state.panelStates.assets = VizorUI.getDomPanelState(dom.assetsLib);\n\tthis.state.panelStates.patches = VizorUI.getDomPanelState(dom.patchesLib);\n\tthis.state.panelStates.chat = VizorUI.getDomPanelState(dom.chatWindow);\n\tthis.state.panelStates.properties = VizorUI.getDomPanelState(dom.propertiesPanel);\n\n\n\tdom.btnBuildMode = $('#buildModeBtn');\n\tdom.btnProgramMode = $('#programModeBtn');\n\tdom.btnMove = $('#btn-move');\n\tdom.btnScale = $('#btn-scale');\n\tdom.btnRotate = $('#btn-rotate');\n\tdom.btnHideAll = $('#btn-hide-all');\n\n\n\n\tvar patchesTabs = jQuery('#patches-lib div.block-header ul.nav-tabs li');\n\tdom.tabPatches = patchesTabs.find(\"a[href='#patches']\").parent();\n\tdom.tabObjects = patchesTabs.find(\"a[href='#objects']\").parent();\n\n\n\tvar propertiesTabs = jQuery('#properties-panel div.block-header ul.nav-tabs li');\n\tdom.tabObjProperties = propertiesTabs.find(\"a[href='#obj3dPropertiesPane']\").parent();\n\tdom.tabNodeProperties = propertiesTabs.find(\"a[href='#nodePropertiesPane']\").parent();\n\n\tvar shaderBlock = $('.shader-block')\n\tshaderBlock.movable()\n\n\t// drag dragging handlers\n\tdom.patchesLib.movable();\n\tdom.assetsLib.movable();\n\tdom.propertiesPanel.movable();\n\n\tvar chatUsersHeight = jQuery('.chat-users').height();\n\n\tvar bottomPanelHeight = jQuery('.bottom-panel').height();\n\tvar editorHeaderHeight = jQuery('.editor-header').height();\n\tvar breadcrumbHeight = jQuery('#breadcrumb').height();\n\tvar chatTop = $(window).height() - chatUsersHeight - bottomPanelHeight - 40;\n\n\tif (chatTop < (editorHeaderHeight + breadcrumbHeight)) {\n\t\tchatTop = breadcrumbHeight + breadcrumbHeight + 40;\n\t}\n\tdom.chatWindow.css({'top': chatTop});\n\tdom.chatWindow.movable();\n\n\tthis.initDropUpload();\n\tthis.setPageTitle();\n\n\n\tdom.structure.addClass('scrollbar'); // #805\n\tdom.menubar = jQuery('div.menu-bar')\n\n\tVizorUI.replaceSVGButtons(dom.menubar);\n\tVizorUI.replaceSVGButtons(jQuery('#row2'));\n\n\tthis.state.recall();\n\n\tif (dom.assetsLib.length < 1) this.state.visibility.panel_assets = false;\n\n\tthis.setupEventHandlers(e2,this.dom);\n\n\tthis.propertiesPanel = {\n\t\tobj3d : new UIObjectProperties(jQuery('#obj3dPropertiesPane', dom.propertiesPanel)),\n\t\tnode :  new UINodeProperties(jQuery('#nodePropertiesPane', dom.propertiesPanel))\n\t}\n\n\tthis.setupStateStoreEventListeners();\n\tthis.state.allowStoreOnChange = true;\n\n\tthis.pluginDocsCache = new PluginDocsCache()\n\n\tif (boot && boot.graph && boot.graph.name) {\n\t\tvar parentName = boot.graph.name\n\t\tE2.core.on('forked', function () {\n\t\t\tif (!parentName.endsWith(' copy')) {\n\t\t\t\tboot.graph.name = parentName + ' copy'\n\t\t\t\tthat.updateSceneName(boot.graph.name)\n\t\t\t}\n\t\t})\n\t}\n\n\tthis._initialised = true;\n\tthis.emit(uiEvent.initialised, this);\n}\n\n\n\n/***** LOADING *****/\nVizorUI.prototype.setLoadingStatus = function(is_loading) {}\nVizorUI.prototype.hideLoadingIndicator = function() {\n\tthis.updateProgressBar(100);\n}\nVizorUI.prototype.showLoadingIndicator = function() {\n\tthis.updateProgressBar(10);\n}\n\nVizorUI.prototype.setPageTitle = function() {\n\tvar isLoggedIn = E2.models.user.get('username');\n\tif (!isLoggedIn)\n\t\treturn false;\n\n\tvar graphname = E2.app.path;\n\tvar newTitle = \"Patches\";\n\n\tgraphname = graphname.split('/')\n\tif (graphname.length > 1)\n\t\tgraphname=graphname[1];\n\t\n\tnewTitle = graphname + \" | \" + newTitle;\t\n\tdocument.title = newTitle;\n\treturn newTitle;\n}\n\n/***** EVENT HANDLERS *****/\n\nVizorUI.prototype.onSearchResultsChange = function($libContainer) {\n  var patchesPanel = E2.dom.patchesLib;\n  var $activeLib = $libContainer || patchesPanel.find('.tab-pane.active');\n  var resultsCount = $('.result.table tbody', $activeLib).children().length;\n\tvar $list = $activeLib.find('.patch-list-container');\n\tvar maxHeight = $list.css('maxHeight');\n\tif (resultsCount>0) {\n\t\tpatchesPanel.removeClass('collapsed');\n\t\t$list.show();\n\t\tvar resultsHeight = $('.result.table', $activeLib).outerHeight(true);\n\t\tvar newHeight = resultsHeight;\n\t\tnewHeight = ( newHeight >= maxHeight ) ? (maxHeight) : (newHeight);\n\t\tpatchesPanel.height('auto');\n\t\t$list.height(newHeight);\n\t}\n\t else {\n\t\tpatchesPanel.height('auto');\n\t\t$list.height(maxHeight);\n\t}\n};\n\nVizorUI.prototype.onBtnHelpClicked = function(e) {\n\te.preventDefault()\n\te.stopPropagation()\n\treturn E2.app.openStartDialog(true)\n}\n\nVizorUI.prototype.onBtnHideAllClicked = function(e) {\n\te.preventDefault();\n\tthis.toggleFloatingPanels();\n\treturn false;\n}\n\nVizorUI.prototype.onBtnChatClicked = function(e) {\n\tthis.state.visibility.panel_chat = !this.state.visibility.panel_chat;\n\treturn false;\n}\n\nVizorUI.prototype.onBtnPatchesClicked = function() {\n\tthis.state.visibility.panel_patches = !this.state.visibility.panel_patches;\n\treturn false;\n}\n\nVizorUI.prototype.onBtnInspectorClicked = function() {\n\tthis.state.visibility.panel_properties = !this.state.visibility.panel_properties\n\treturn false\n}\n\nVizorUI.prototype.onBtnAssetsClicked = function() {\n\tthis.state.visibility.panel_assets = !this.state.visibility.panel_assets;\n\treturn false;\n}\n\n\n/***** TOGGLE LAYERS OF THE UI ON OR OFF *****/\nVizorUI.prototype.toggleFloatingPanels = function(forceVisibility) {\n\tvar v = this.state.visibility;\n\tif (typeof forceVisibility !== 'undefined')\n\t\tv.floating_panels = forceVisibility;\n\telse\n\t\tv.floating_panels = !v.floating_panels;\n};\n\nVizorUI.prototype.togglePatchEditor = function(forceVisibility) {\n\tvar v = this.state.visibility;\n\tif (typeof forceVisibility !== 'undefined')\n\t\tv.patch_editor = forceVisibility;\n\telse\n\t\tv.patch_editor = !v.patch_editor;\n}\n\nVizorUI.prototype.toggleUILayer = function() {\n\tthis.state.visible = !this.state.visible;\n}\n\nVizorUI.prototype.enterEditorView = function(e) {\n\tthis.state.viewCamera = uiViewCam.birdsEye\n\tif (e) e.preventDefault()\n\treturn true;\n}\nVizorUI.prototype.enterVRView = function(e) {\n\tthis.state.viewCamera = uiViewCam.vr\n\tif (e) e.preventDefault()\n\treturn true;\n}\n\nVizorUI.prototype.onChatResize = function() {\n\tvar dom = this.dom;\n\tvar $chatPanel = dom.chatWindow;\n\n\tvar panelHeight = $chatPanel.outerHeight(true);\n\tif (panelHeight < 180) {\n\t\tpanelHeight = 180;\n\t\t$chatPanel.height(panelHeight);\n\t}\n\tvar chatParentHeight = $chatPanel.parent().height();\n\tif (panelHeight > chatParentHeight) {\n\t\t$chatPanel.height(chatParentHeight - 10);\n\t}\n\n\tpanelHeight = $chatPanel.outerHeight(true);\n\tvar dragHandleHeight = $chatPanel.find('.drag-handle').height();\n\tvar tabsHeight = dom.chatTabs.height();\n\n\t$chatPanel.find('.tab-content .tab-pane').height(panelHeight - dragHandleHeight - tabsHeight)\n};\n\n\nVizorUI.prototype.closePanelChat = function() {\n\tthis.state.visibility.panel_chat = false;\n\treturn false;\n}\n\nVizorUI.prototype.closePanelProperties = function() {\n\tthis.state.visibility.panel_properties = false;\n\treturn false;\n}\n\nVizorUI.prototype.closePanelAssets = function() {\n\tthis.state.visibility.panel_assets = false;\n\treturn false;\n}\n\nVizorUI.prototype.closePanelPatches = function() {\n\tthis.state.visibility.panel_patches = false;\n\treturn false;\n}\n\nVizorUI.prototype.onTreeClicked = function(e) {\t// currently unused\n\tvar s = this.state.panelStates.patches || {};\n\ts.selectedTab = '#graph';\n\tthis.state.panelStates.patches = s;\n\tif (e) {\n\t\te.preventDefault();\n\t\te.stopPropagation();\n\t}\n\treturn false;\n}\n\nVizorUI.prototype.onLibSearchClicked = function(e) {\n\tvar $input = jQuery(e.target);\n\tvar currentLib = $input.parents('.vp-library');\n\tif (currentLib.hasClass('collapsed')) {\n\t\tcurrentLib.removeClass('collapsed')\n\t\tthis.onSearchResultsChange();\n\t}\n\treturn false;\n}\n\nVizorUI.prototype.isPanelChatVisible = function() {\n\treturn this.state.visibility.panel_chat\n}\nVizorUI.prototype.isPanelPatchesVisible = function() {\n\treturn this.state.visibility.panel_patches\n}\nVizorUI.prototype.isPanelAssetsVisible = function() {\n\treturn this.state.visibility.panel_assets\n}\nVizorUI.prototype.isPanelPropertiesVisible = function() {\n\treturn this.state.visibility.panel_properties\n}\n\nVizorUI.prototype.togglePanelChatCollapsed = function() {\n\tthis.dom.chatToggleButton.trigger('click');\n}\nVizorUI.prototype.togglePanelAssetsCollapsed = function() {\n\tthis.dom.assetsToggle.trigger('click');\n}\nVizorUI.prototype.togglePanelPatchesCollapsed = function() {\n\tthis.dom.patchesToggle.trigger('click');\n}\nVizorUI.prototype.togglePanelPropertiesCollapsed = function() {\n\tthis.dom.propertiesToggle.trigger('click');\n}\n\nVizorUI.prototype.openPatchSaveDialog = function(serializedGraph) {\n\n\tvar that = this;\t// e2.app\n\tvar ui = E2.ui;\n\n\tvar patchDialog = function() {\n\n\t\tvar username = E2.models.user.get('username');\n\t\tvar patchesPath = '/'+username+'/patches/'\n\n\t\tui.updateProgressBar(65);\n\n\t\t$.get(patchesPath, function(files) {\n\t\t\tvar fsc = new FileSelectControl()\n\t\t\t.frame('save-frame')\n\t\t\t.template('patch')\n\t\t\t.buttons({\n\t\t\t\t'Cancel': function() {\n\t\t\t\t\tui.updateProgressBar(100);\n\t\t\t\t},\n\t\t\t\t'Save': function(name) {\n\t\t\t\t\tif (!name)\n\t\t\t\t\t{\n\t\t\t\t\t\tbootbox.alert('Please enter a name for the patch');\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tserializedGraph = serializedGraph || that.player.core.serialise()\n\n\t\t\t\t\t$.ajax({\n\t\t\t\t\t\ttype: 'POST',\n\t\t\t\t\t\turl: patchesPath,\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tname: name,\n\t\t\t\t\t\t\tgraph: serializedGraph\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdataType: 'json',\n\t\t\t\t\t\tsuccess: function() {\n\t\t\t\t\t\t\tui.updateProgressBar(100);\n\t\t\t\t\t\t\tE2.track({ event: 'patchSaved' })\n\t\t\t\t\t\t\tthat.patchManager.refresh()\n\t\t\t\t\t\t},\n\t\t\t\t\t\terror: function(x, t, err) {\n\t\t\t\t\t\t\tui.updateProgressBar(100);\n\n\t\t\t\t\t\t\t// since we ask first thing above\n\t\t\t\t\t\t\t// if (x.status === 401)\n\t\t\t\t\t\t\t//\treturn E2.controllers.account.openLoginModal();\n\n\t\t\t\t\t\t\tif (x.responseText)\n\t\t\t\t\t\t\t\tbootbox.alert('Save failed: ' + x.responseText);\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tbootbox.alert('Save failed: ' + err);\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.files(files)\n\t\t\t.on('closed', function(){\n\t\t\t\tui.updateProgressBar(100);\n\t\t\t})\n\t\t\t.modal();\n\n\t\t\treturn fsc;\n\t\t})\n\t};\n\n\tif (!VizorUI.userIsLoggedIn()) {\n\t\treturn VizorUI.openLoginModal().then(patchDialog);\n\t}\n\n\treturn patchDialog();\n};\n\nVizorUI.prototype.setModeBuild = function() {\n\tthis.state.mode = uiMode.build\n\treturn true;\n};\nVizorUI.prototype.setModeProgram = function() {\n\tthis.state.mode = uiMode.program\n\treturn true;\n};\n\nVizorUI.prototype.buildBreadcrumb = function(graph, selected, beforeRender) {\n\tvar b = new UIbreadcrumb()\n\tvar that = this\n\n\tselected = selected || []\n\n\tfunction prependFrom(graph) {\n\t\tvar node, title\n\t\twhile (graph && (node = graph.tree_node)){\n\t\t\ttitle = node.title || node.id\n\t\t\tif (b.length > 0) {\n\t\t\t\tb.prepend(title, null, function() {\n\t\t\t\t\t// switch over to program and navigate to layer/graph\n\t\t\t\t\tif (!that.isInProgramMode())\n\t\t\t\t\t\tthat.setModeProgram()\n\t\t\t\t\tE2.app.setActiveGraph(this)\n\t\t\t\t}.bind(graph))\n\t\t\t} else {\n\t\t\t\tb.prepend(title)\n\t\t\t}\n\t\t\tgraph = graph.parent_graph\n\t\t}\n\t}\n\n\tif (this.isInBuildMode()) {\n\t\tif (selected.length === 1) {\n\t\t\tb.add(selected[0].title)\n\t\t\tprependFrom(selected[0].parent_graph)\n\t\t}\n\t\telse if (selected.length > 1) {\n\t\t\t// get the group name from first selected object\n\t\t\tvar groupNode=''\n\t\t\tvar conns = selected[0].getConnections()\n\t\t\tfor (var i=0;i<conns.length;i++) {\n\t\t\t\tif (conns[i].dst_node.plugin.id === 'three_group') {\n\t\t\t\t\tif (groupNode !== '')\n\t\t\t\t\t\tconsole.warn('node in more than one group ', selected[0])\n\t\t\t\t\telse\n\t\t\t\t\t\tgroupNode = conns[i].dst_node\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tb.add(groupNode.get_disp_name() + ' (' + selected.length + ' objects)')\n\t\t\tprependFrom(groupNode.parent_graph)\n\n\t\t}\n\t} else {\n\t\tif (selected.length === 1) {\n\t\t\tb.add(selected[0].title || selected[0].id)\n\t\t\tprependFrom(selected[0].parent_graph)\n\t\t}\n\t\telse {\n\t\t\tif (selected.length > 1)\n\t\t\t\tb.add(selected.length + ' nodes')\n\t\t\tprependFrom(graph)\n\t\t}\n\t}\n\n\tif (typeof beforeRender === 'function') \n\t\tbeforeRender(b)\n\n\tb.render(this.dom.breadcrumb)\n\n\treturn b\n}\n\nVizorUI.prototype.toggleFullscreenVRViewButtons = function() {\n\tvar vr = false; // place E2 VR device check here;\n\tE2.dom.fscreen.parent.toggle(!vr);\n\tE2.dom.vrview.parent.toggle(vr);\n}\n\n\n/***** UI MODALS/DIALOGS *****/\n\n\n\nVizorUI.prototype.openPublishGraphModal = function() {\n\tvar that = this,\n\t\tdfd = when.defer(),\n\t\tpublishTemplate = E2.views.filebrowser.publishModal\n\n\tvar graphname = E2.app.path.split('/')\n    if (graphname.length > 1)\n        graphname = graphname[1]\n\n\tvar graphdata = E2.app.player.core.serialise()\n\tvar graphpreview = E2.app.player.getScreenshot(1280, 720)\n\tvar assetdata = _.clone(E2.app.graphStore.getGraphSize())\t// {size, numAssets, numNodes, hasAudio}\n\n\n\tvar prefs = E2.models.user.get('preferences')\n\tvar defaultPublic = prefs ? !!prefs.publishDefaultPublic : true\n\n\tvar data = {\n\t\tpath:\t        graphname,\n\t\tgraph:\t        graphdata,\n\t\tpreviewImage:   graphpreview,\n\t\tassetdata:\t\tassetdata,\n\t\tisPublic:\t\tdefaultPublic,\n\t\tsizeFormatted: \tsiteUI.formatFileSize(assetdata.size),\n\t\tname:\t\t\t''\n\t}\n\n\tif (boot && boot.graph) {\n\t\tdata.name = boot.graph.name\n\t\tdata.isPublic = !boot.graph.private\n\t}\n\n\tvar openSaveGraph = function(dfd) {\n\t\tvar $modal = VizorUI.modalOpen(publishTemplate(data), 'Publish', 'nopad modal_publish')\n\t\tvar $form = $('#publishGraphForm', $modal)\n\n\t\tVizorUI.setupXHRForm($form, function(saved) {\n\t\t\tdfd.resolve(saved.path)\n\t\t})\n\n\t\tvar $publicPrivateLabel = $form.find('label#publishPublicPrivateLabel').first()\n\t\t$form.find('input#publishPublic')\n\t\t\t.on('change', function(e){\n\t\t\t\tvar isPublic = this.checked\n\t\t\t\t$publicPrivateLabel.html( isPublic ? 'Public' : 'Private')\n\t\t\t})\n\n\t\tvar $pathInput = $('#pathInput', $form),\n\t\t\t$submit = $form.find('button[type=\"submit\"]'),\n\t\t\t$submitLabel = $submit.find('span'),\n\t\t\t$message = $form.find('.modal-error')\n\n\t\tvar canSubmit = false\n\n\t\tvar makeGraphUrl = function(username, pathInputValue) {\n\t\t\treturn '/' + username + '/' + E2.util.slugify(pathInputValue)\n\t\t}\n\n\t\tvar t = null, done_t = null\n\n\t\tvar checkGraphExists = function(path) {\n\t\t\tcanSubmit = false\n\n\t\t\tif (done_t)\n\t\t\t\tclearTimeout(done_t)\t\t// set by the response handler\n\n\t\t\tvar username = E2.models.user.toJSON().username\n\t\t\t$submit.attr('disabled', true)\n\n\t\t\tvar url = makeGraphUrl(username, path) + '?summary=1'\n\n\t\t\tvar responseHandler = function(status, json){\n\t\t\t\tvar delay = 0\n\t\t\t\tvar okToSubmit = true\t// default\n\t\t\t\tswitch (status) {\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\tokToSubmit = false\n\t\t\t\t\t\t// fallthrough\n\t\t\t\t\tcase 404:\n\t\t\t\t\t\t// clear warnings\n\t\t\t\t\t\t$message\n\t\t\t\t\t\t\t.html('')\n\t\t\t\t\t\t\t.removeClass('warn')\n\t\t\t\t\t\t\t.hide()\n\t\t\t\t\t\t$form\n\t\t\t\t\t\t\t.removeClass('hasMessage keepMessage')\n\t\t\t\t\t\t\t.addClass('noMessage')\n\t\t\t\t\t\t$submitLabel\n\t\t\t\t\t\t\t.text('Publish')\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 200:\n\t\t\t\t\t\t// warn the user and change the button\n\t\t\t\t\t\t$form\n\t\t\t\t\t\t\t.removeClass('noMessage')\n\t\t\t\t\t\t\t.addClass('hasMessage keepMessage')\n\t\t\t\t\t\t$message\n\t\t\t\t\t\t\t.html('That file already exists. Do you want to update it with this copy?')\n\t\t\t\t\t\t\t.addClass('warn')\n\t\t\t\t\t\t\t.show()\n\t\t\t\t\t\t$submitLabel\n\t\t\t\t\t\t\t.text('Yes, publish')\n\t\t\t\t\t\tdelay = 1000\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.error('could not parse response', status, json)\n\t\t\t\t}\n\n\t\t\t\tfunction done() {\n\t\t\t\t\t// set upper scope to our result\n\t\t\t\t\tcanSubmit = okToSubmit\n\t\t\t\t\t$submit.attr('disabled', !canSubmit)\n\t\t\t\t}\n\t\t\t\tif (delay) {\n\t\t\t\t\tdone_t = setTimeout(done, delay)\n\t\t\t\t} else {\n\t\t\t\t\tif (done_t) clearTimeout(done_t)\n\t\t\t\t\tdone()\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!path) {\n\t\t\t\tresponseHandler(0)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t$.ajax({\n\t\t\t\turl:\turl,\n\t\t\t\ttype: \t'GET',\n\t\t\t\tdataType: 'json',\n\t\t\t\tsuccess: function(res) {return responseHandler(200, res)},\n\t\t\t\terror:\tfunction(err) {return responseHandler(err.status, err.responseJSON)},\n\t\t\t})\n\n\t\t}\n\n\t\t// handle keyboard input and schedule a check for entered graph name\n\t\tvar oldPath = null\n\t\t$pathInput\n\t\t\t.on('keydown', function(e) {\n\t\t\t\tif (e.keyCode === 13) {\t// enter\n\t\t\t\t\tif (canSubmit)\n\t\t\t\t\t\treturn true\n\n\t\t\t\t\t// else check in progress\n\t\t\t\t\te.preventDefault()\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t})\n\t\t\t.on('keyup blur', function(e) {\n\t\t\t\tval = this.value.trim()\n\t\t\t\tif (val && (val === oldPath))\n\t\t\t\t\treturn true\n\n\t\t\t\toldPath = val\n\t\t\t\tcanSubmit = false\n\t\t\t\t$submit.attr('disabled', true)\n\n\t\t\t\tif (t)\n\t\t\t\t\tclearTimeout(t)\n\t\t\t\tt = setTimeout(function(){checkGraphExists(val)}, 300)\n\t\t\t\treturn true\n\t\t\t})\n\t\t\t.trigger('keyup')\n\n\t\t$form.on('submit', function(){\n\t\t\t$submitLabel.text('Publishing')\n\t\t\treturn true\n\t\t})\n\n\t}\n\n\tif (!VizorUI.userIsLoggedIn()) {\n\t\tVizorUI.openLoginModal(dfd)\n\t\t\t.then(openSaveGraph)\n\t} else {\n\t\topenSaveGraph(dfd)\n\t}\n\n\treturn dfd.promise\n}\n\n\nVizorUI.prototype.viewSource = function() {\n\tvar b = bootbox.dialog({\n\t\tmessage: '<h3 style=\"margin-top:0;padding-top:0;\">source</h3><textarea spellcheck=\"false\" style=\"resize:none\" autocorrect=\"false\" readonly=\"true\" class=\"form-control scrollbar\" cols=\"80\" rows=\"40\">'+\n\t\t\tE2.core.serialise()+'</textarea>',\n\t\tbuttons: { 'OK': function() {} }\n\t});\n\tjQuery(b).addClass('wideauto').addClass('viewsource');\n};\n\n\nVizorUI.prototype.showStartDialog = function(forceShow) {\n\t// keep track of how many times the dialog has been seen\n\t// do not show dialog if user logged in and shown more than twice\n\t// do not show if user not logged in and shown more than five times\n\t// cookie keeps for 24h from visit\n\tvar cookieName = 'vizor100'\n\tvar c = Cookies.get(cookieName), times = 0\n\n\ttry { c = JSON.parse(c) }\n\tcatch (e) { c = {} }\n\n\tif (c && ('seen' in c)) {\n\t\ttimes = parseInt(c.seen)\n\t\tc.seen = isNaN(times) ?  0  : times\n\t} else {\n\t\ttimes = 0\n\t}\n\n\tvar stats = E2.models.user.get('stats') || {}\n\tvar numPublished = stats.projects || 0\n\tvar showDialog = true\n\tif (!forceShow) {\n\t\ttimes++\n\t\tif (times > 1 || numPublished > 0)\n\t\t\tshowDialog = false\n\t}\n\n\t// return early in case of not showing dialog\n\tif (!showDialog) {\n\t\treturn Promise.resolve()\n\t}\n\n\tvar d = new Date()\n\td.setTime(d.getTime() + (3 * 86400 * 1000))\t// 3 days\n\tCookies.set(cookieName, {seen: times}, {expires: d})\n\n\treturn VizorUI.showHelpScreen()\n\n}\n\n\nVizorUI.prototype.updateProgressBar = function(percent) {\n\tvar dom = this.dom;\n\tpercent = 0.0 + percent;\n\tif (percent > 100) percent = 100;\n\tif (percent < 0) percent = 0;\n\tdom.progressBar = $('#progressbar');\n\t\n\tif (!dom.progressBar.is(':visible'))\n\t\tdom.progressBar.show().width(1);\n\t\n\tvar winWidth = $(window).width();\n\tvar barWidth = dom.progressBar.width();\n\tvar newWidth = winWidth / 100 * percent;\n\tvar barSpace = winWidth - barWidth;\n\tvar barSpeed = 1000 - percent * 8;\n\t\n\tpercent = (percent === 0) ? (barWidth / newWidth + 5) : (percent);\n\tnewWidth = (newWidth <= barWidth) ? (barSpace / 100 * percent + barWidth) : (newWidth);\n\t\n\tdom.progressBar.stop().animate({width: newWidth}, {duration: barSpeed, easing: 'linear', complete: function() {\n\t\tif ($(this).width() === winWidth)\n\t\t\t$(this).fadeOut('slow');\n\t}});\n}\n\nVizorUI.prototype.updateSceneName = function(newName) {\n\tvar nameLabel = document.getElementById('graphNameLabel')\n\tnameLabel.innerText = newName\n}\n\n\n/***** HELPER METHODS *****/\n\nVizorUI.prototype.getCurrentGraphSize = function() {\n\tvar state = E2.app.graphStore.getGraphSize()\n\treturn state.size\n}\n\nVizorUI.openEditorHelp = function() {\n\tvar keyData = _.extend({}, uiKeys);\n\tvar modShift = uiKeys.modShift,\n\t \tmodMeta = uiKeys.modMeta,\n\t \tmodAlt = uiKeys.modAlt;\n\n\tvar htmlFromKey = function(charOrKeycode) {\n\t\tvar isOSX = /mac os x/.test(navigator.userAgent.toLowerCase());\n\t\tvar html = []\n\t\tvar add = function(key, className) {\n\t\t\tvar tag\n\t\t\tif (typeof className !== 'undefined')\n\t\t\t\ttag = '<kbd class=\"' + className + '\">'\n\t\t\telse\n\t\t\t\ttag = '<kbd>';\n\t\t\tvar end = '</kbd>'\n\t\t\thtml.push(tag + key.toLowerCase() + end)\n\t\t}\n\t\tvar key_meta = (isOSX) ? 'cmd' : 'ctrl';\n\n\t\tif (Object.prototype.toString.call(charOrKeycode) === '[object String]' ) { // isString()\n\t\t\tadd(charOrKeycode)\n\t\t} else {\n\n\t\t\tif (charOrKeycode >= modAlt) {\n\t\t\t\tadd('alt', 'modifier key_alt');\n\t\t\t\tcharOrKeycode -= modAlt;\n\t\t\t}\n\t\t\tif (charOrKeycode >= modMeta) {\n\t\t\t\tadd(key_meta, (isOSX) ? 'modifier key_cmd' : 'modifier key_ctrl');\n\t\t\t\tcharOrKeycode -= modMeta;\n\t\t\t}\n\t\t\tif (charOrKeycode >= modShift) {\n\t\t\t\tadd('shift', 'modifier key_shift');\n\t\t\t\tcharOrKeycode -= modShift;\n\t\t\t}\n\n\t\t\tswitch (charOrKeycode) {\n\t\t\t\tcase 9:\n\t\t\t\t\tadd('tab', 'wide');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 13:\n\t\t\t\t\tadd('enter');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 27:\n\t\t\t\t\tadd('esc', 'wide');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 32:\n\t\t\t\t\tadd('space');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0:\t\t// modifier keys only\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tadd(String.fromCharCode(charOrKeycode));\n\t\t\t}\n\t\t}\n\t\treturn html.join(\" + \");\n\t};\n\tfor (var z in keyData) {\n\t\tif (keyData.hasOwnProperty(z))\n\t\t\tkeyData[z] = htmlFromKey(keyData[z]);\n\t}\n\tvar viewData = {\n\t\tkeys: keyData\n\t}\n\tvar html = E2.views.patch_editor.help_shortcuts(viewData);\n\tvar m = VizorUI.modalOpen(html, 'Keyboard Shortcuts', 'mHelp mShortcuts')\n\n\treturn m\n}\n\nVizorUI.checkCompatibleBrowser = function() {\n\tvar agent = navigator.userAgent;\n\tvar heading=false, message=false;\n\n\tvar isMobile = VizorUI.isMobile.any();\n\n\tif ((/Safari/i.test(agent)) || (/Chrome/i.test(agent)) || (/Firefox/i.test(agent))) {\n\n\t}\n\telse if (isMobile) {\n\t\theading = 'Mobile support';\n\t\tmessage = '<h4>Please view this page on your desktop/laptop. '+\n\t\t\t\t\t 'The editor is not ready for mobile just yet.</h4>';\n\t}\n\telse {\n\t\theading = 'Browser support';\n\t\tmessage = '<h4>We want you to fully enjoy Patches. <br />The editor works best in '+\n\t\t\t\t\t '<a href=\"http://www.google.com/chrome/\" target=\"_blank\"'+\n\t\t\t\t\t ' alt=\"Get Chrome\">Chrome</a> or '+\n\t\t\t\t\t '<a href=\"http://www.mozilla.org/firefox/new/\" target=\"_blank\"'+\n\t\t\t\t\t ' alt=\"Get Firefox\">Firefox</a>.</h4>';\n\n\t}\n\tif (message) VizorUI.modalOpen(message, heading, 'note', true, {buttons: { Ok: function() {}}});\n}\n"
  },
  {
    "path": "browser/scripts/util.js",
    "content": "if (typeof(E2) === 'undefined')\n\tE2 = {}\n\nfunction clone_recursive(from, to)\n{\n    if (from == null || typeof from != \"object\") return from;\n    if (from.constructor != Object && from.constructor != Array) return from;\n    if (from.constructor == Date || from.constructor == RegExp || from.constructor == Function ||\n        from.constructor == String || from.constructor == Number || from.constructor == Boolean)\n        return new from.constructor(from);\n\n    to = to || new from.constructor();\n\n    for (var name in from)\n    {\n        to[name] = typeof to[name] == \"undefined\" ? clone_recursive(from[name], null) : to[name];\n    }\n\n    return to;\n}\n\nfunction clone(o) {\n\treturn clone_recursive(o, null);\n};\n\nfunction make(tag)\n{\n\treturn $(document.createElement(tag));\n}\n\nfunction makeButton(text, alt, className)\n{\n\ttext = text || '';\n\talt = alt ? ' title=\"' + alt + '\"' : '';\n\tclassName = className ? ' ' + className : '';\n\t\n\treturn $('<button class=\"btn btn-xs' + className + '\"' + alt + '>' + text + '</button>');\n}\n\nfunction resolve_graph(graphs, guid)\n{\n\tfor(var i = 0, len = graphs.length; i < len; i++)\n\t{\n\t\tif(graphs[i].uid === guid)\n\t\t\treturn graphs[i]; \n\t}\n\n\tif(guid !== -1)\n\t\tmsg('ERROR: Failed to resolve graph(' + guid + ')');\n\t\n\treturn null;\n};\n\nfunction load_style(url)\n{\n\tvar link = document.createElement('link');\n\t\n\tlink.rel = 'stylesheet';\n\tlink.href = url;\n\t\n\tdocument.getElementById('head').appendChild(link);\n}\n\nfunction sort_dict(dict)\n{\n\tvar s = [], key;\n\t\n\tfor(key in dict)\n\t\ts.push(key);\n\t\t\n\t// JS has a quaint notion of what \"alphabetically\" means. Apparently all \n\t// upper caps letters preceeds lower case ones. Let's fix that.\n\ts.sort(function(a, b)\n\t{\n\t\tvar _a = a.toLowerCase();\n\t\tvar _b = b.toLowerCase();\n\t\t\n\t\treturn _a < _b ? -1 : _a > _b ? 1 : 0;\n\t});\n\n\treturn s;\n}\n\nfunction msg(txt) {\n\tvar d = E2.dom.dbg;\n\n\tif (d === undefined) {\n\t\tconsole.log(txt);\n\t\treturn;\n\t}\n\t\n\tif(txt) {\n\t\tif(txt.substring(0,  7) === 'ERROR: ') {\n\t\t\tconsole.error(txt)\n\t\t\td.append('<span style=\"color:#f20\">' + txt + '</span>\\n');\n\t\t}\n\t\telse if(txt.substring(0,  9) === 'WARNING: ') {\n\t\t\tconsole.warn(txt)\n\t\t\td.append('<span style=\"color:#fa0\">' + txt + '</span>\\n');\n\t\t}\n\t\telse if(txt.substring(0,  6) === 'INFO: ') {\n\t\t\tconsole.log(txt)\n\t\t\td.append('<span style=\"color:#04f\">' + txt + '</span>\\n');\n\t\t}\n\t\telse {\n\t\t\tconsole.log(txt)\n\t\t\td.append(txt + '\\n');\n\t\t}\n\t}\n\t\n\td.scrollTop(d[0].scrollHeight);\n}\n\nfunction ExpandableTextfield(node, tf, def_width)\n{\n\tvar self = this;\n\t\n\tthis.node = node;\n\tthis.tf = tf;\n\tthis.def_width = def_width;\n\t\n\tthis.update = function()\n\t{\n\t\tvar s = '' + self.tf.val();\n\t\t\n\t\t// self.tf[0].style.width = ((Math.max(self.def_width, s.length) * 7) + 2) + 'px';\n\t\tself.node.geometry_updated();\n\t};\n\t\n\tvar handler = function(self) { return function()\n\t{\n\t\tself.update();\n\t}}(this);\n\t\n\ttf.change(handler);\n\ttf.keyup(handler);\n}\n\nE2.util = {\n\tloadScript: function(url, onload, onerror) {\n\t\tvar script = document.createElement('script')\n\n\t\tscript.src = url\n\t\t\n\t\tif (!onload)\n\t\t\tthrow new Error('loadScript without listener')\n\n\t\tscript.onload = onload\n\t\tscript.onerror = onerror\n\t\t\n\t\tdocument.getElementsByTagName('head')[0].appendChild(script)\n\t},\n\n\tisFirstTime: function() {\n\t\treturn Cookies.get('vizor100') === undefined\n\t},\n\t\n\tisScrolledIntoView: function isScrolledIntoView(elem) {\n\t\tvar docViewTop = $(window).scrollTop();\n\t\tvar docViewBottom = docViewTop + $(window).height();\n\t\tvar elemTop = $(elem).offset().top;\n\t\treturn ((elemTop <= docViewBottom) && \n\t\t\t(elemTop >= docViewTop));\n\t},\n\n\tisTextInputInFocus: function isTextInputInFocus(e) {\n\t\tvar rx = /INPUT|SELECT|TEXTAREA/i;\n\t\tvar is= (rx.test(e.target.tagName) || e.target.disabled || e.target.readOnly);\n\t\treturn is\n\t},\n\n\tisCanvasInFocus: function isCanvasInFocus(e) {\n\t\tvar rx = /CANVAS/i;\n\t\tvar is = rx.test(e.target.tagName);\n\t\treturn is\n\t},\n\n\tcheckBrowser: function() {\n\t\treturn VizorUI.checkCompatibleBrowser();\n\t},\n\n\tisFullscreen: function() {\n\t\treturn !!(document.mozFullScreenElement || document.webkitFullscreenElement);\n\t},\n\n\tslugify: function(name) {\n\t\treturn name.toLowerCase()\n\t\t\t.replace(/[^\\w-]+/g,' ')\n\t\t\t.trim()\n\t\t\t.replace(/ +/g, '-')\n\t},\n\n\tisBrowser: {\n\t\tWebKit: function () {\n\t\t\treturn !!navigator.userAgent.match(/AppleWebKit/)\n\t\t},\n\t\tGecko: function () {\n\t\t\treturn !!navigator.userAgent.match(/Gecko/)\n\t\t},\n\t\tFirefox: function () {\n\t\t\treturn !!navigator.userAgent.match(/Firefox/)\n\t\t},\n\t\tChrome: function () {\n\t\t\treturn (!!navigator.userAgent.match(/Chrome/)) || (!!navigator.userAgent.match(/CriOS/))\n\t\t},\n\t\tSafari: function () {\n\t\t\treturn !E2.util.isBrowser.Chrome() && !!navigator.userAgent.match(/Safari/)\n\t\t},\n\t\tEdge: function () {\n\t\t\treturn !!navigator.userAgent.match(/Edge/)\n\t\t},\n\t\tCarmel: function() {\n\t\t\tif (navigator.userAgent.match(/99.77.34.51/))\n\t\t\t\treturn true\n\n\t\t\tif (!navigator.getGamepads)\n\t\t\t\treturn false\n\n\t\t\tvar gamepads = navigator.getGamepads()\n\t\t\tfor (var i = 0; i < gamepads.length; ++i) {\n\t\t\t\tif (gamepads[i] && gamepads[i].id.includes('Gear VR'))\n\t\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t},\n\n\tisMobile: {\n\t\tAndroid: function() {\n\t\t\treturn navigator.userAgent.match(/Android/i);\n\t\t},\n\t\tBlackBerry: function() {\n\t\t\treturn navigator.userAgent.match(/BlackBerry/i);\n\t\t},\n\t\tiOS: function() {\n\t\t\treturn navigator.userAgent.match(/iPhone|iPad|iPod/i);\n\t\t},\n\t\tOpera: function() {\n\t\t\treturn navigator.userAgent.match(/Opera Mini/i);\n\t\t},\n\t\tWindows: function() {\n\t\t\treturn navigator.userAgent.match(/IEMobile/i) || navigator.userAgent.match(/WPDesktop/i);\n\t\t},\n\t\tany: function() {\n\t\t\tvar check = false;\n\n\t\t\t(function(a){\n\t\t\t\tif (/(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)||/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\t\t\t\tcheck = true\n\t\t\t})(navigator.userAgent||navigator.vendor||window.opera)\n\n\t\t\treturn check\n\t\t}\n\t},\n\n\trequestAnimationFrame: function(cb) {\n\t\tvar hmd = E2.core.webVRAdapter.hmd\n\n\t\tif (hmd && !hmd.isPolyfilled) {\n\t\t\treturn hmd.requestAnimationFrame(cb)\n\t\t}\n\n\t\treturn window.requestAnimationFrame(cb)\n\t},\n\n\tcancelAnimationFrame: function(interval) {\n\t\tvar hmd = E2.core.webVRAdapter.hmd\n\n\t\tif (hmd && !hmd.isPolyfilled) {\n\t\t\treturn hmd.cancelAnimationFrame(interval)\n\t\t} else {\n\t\t\treturn window.cancelAnimationFrame(interval)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "browser/scripts/variables.js",
    "content": "(function() {\n\nfunction Variables() {\n\tthis.variables = {}\n}\n\nVariables.prototype.lock = function(plugin, name, connections) {\n\tif (name in this.variables) {\n\t\tthis.variables[name].ref_count++\n\t\tif (connections > 0)\n\t\t\tthis.variables[name].connections += connections\n\t} else {\n\t\tthis.variables[name] = {\n\t\t\tdt: E2.dt.ANY,\n\t\t\tvalue: null,\n\t\t\tusers: [],\n\t\t\tref_count: 1,\n\t\t\tconnections: 0\n\t\t}\n\t}\n\t\n\tvar u = this.variables[name].users\n\t\n\tif (!(plugin in u))\n\t\tu.push(plugin)\n}\n\nVariables.prototype.unlock = function(plugin, name) {\n\tif (name in this.variables) {\n\t\tvar reg = this.variables[name]\n\n\t\treg.users.splice(reg.users.indexOf(plugin), 1)\n\n\t\tif (--reg.ref_count === 0)\n\t\t\tdelete this.variables[name]\n\t}\n}\n\nVariables.prototype.connection_changed = function(name, added) {\n\tvar r = this.variables[name]\n\n\tif (!added) {\n\t\tr.connections--\n\t\t\n\t\tif (r.connections <= 0) {\n\t\t\tr.connections = 0\n\t\t\tthis.set_datatype(name, E2.dt.ANY, false)\n\t\t}\n\t}\n\telse\n\t\tr.connections++\n\t\t\n\treturn r.connections\n}\n\nVariables.prototype.set_datatype = function(name, dt, arrayness) {\n\tvar r = this.variables[name]\n\tvar u = r.users\n\t\n\tfor (var i = 0, len = u.length; i < len; i++)\n\t\tu[i].variable_dt_changed(dt, arrayness)\n\t\n\tr.dt = dt\n\tr.array = arrayness\n\n\tthis.write(name, E2.core.get_default_value(dt))\n}\n\nVariables.prototype.read = function(name) {\n\treturn this.variables[name].value\n}\n\nVariables.prototype.write = function(name, value) {\n\tvar r = this.variables[name]\n\tvar u = r.users\n\tif (r.value === value)\n\t\treturn;\n\n\tswitch(r.dt) {\n\t\tcase E2.dt.VECTOR:\n\t\t\tif (r.value)\n\t\t\t\tr.value.copy(value)\n\t\t\telse\n\t\t\t\tr.value = value.clone()\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tr.value = value\n\t}\n\n\tfor (var i = 0, len = u.length; i < len; i++) {\n\t\tvar plg = u[i]\n\t\t\n\t\tif (plg.variable_updated)\n\t\t\tplg.variable_updated(value)\n\t}\n}\n\nVariables.prototype.count = function() {\n\tvar size = 0\n\t\n\tfor (var key in this.variables) {\n\t\tif (!this.variables.hasOwnProperty(key))\n\t\t\tsize++\n\t}\n\t\n\treturn size\n}\n\nVariables.prototype.serialise = function(d) {\n\tvar regs = this.variables\n\tvar dregs = []\n\t\n\tfor (id in regs) {\n\t\tif (!regs.hasOwnProperty(id))\n\t\t\tcontinue\n\t\n\t\tdregs.push({\n\t\t\tid: id,\n\t\t\tdt: regs[id].dt.id,\n\t\t\tarray: regs[id].array\n\t\t})\n\t}\n\n\tif (dregs.length > 0)\n\t\td.variables = dregs\n}\n\nVariables.prototype.deserialise = function(regs) {\n\tvar rdt = E2.core.resolve_dt\n\n\tfor(var i = 0, len = regs.length; i < len; i++) {\n\t\tvar r = regs[i]\n\t\tvar r_dt = rdt[r.dt]\n\n\t\tthis.variables[r.id] = {\n\t\t\tdt: r_dt,\n\t\t\tarray: r.array,\n\t\t\tvalue: null,\n\t\t\tusers: [],\n\t\t\tconnections: 0,\n\t\t\tref_count: 0\n\t\t}\n\n\t\tthis.write(r.id, E2.core.get_default_value(r_dt))\n\t}\n}\n\nE2.Variables = Variables\n\nif (typeof(module) !== 'undefined') {\n\tmodule.exports.Variables = Variables\n}\n\n})()"
  },
  {
    "path": "browser/scripts/vizor2Teaser.js",
    "content": "// Scroll down button\njQuery('.hero__scroll-down')\n    .on('click', function(event) {\n        event.preventDefault();\n        var loc = jQuery('.introduction').offset().top;\n        $(\"html, body\").animate({ scrollTop: loc + 'px' }, 500);\n    });\n\n\n// Registration form\nvar registrationForm = document.querySelector('.register__form');\nregistrationForm.addEventListener('submit', trackAndSubmit);\nfunction trackAndSubmit(event) {\n    registrationForm.removeEventListener('submit', trackAndSubmit);\n    event.preventDefault();\n    E2.track({ event: 'betaWaitingListSignup' })\n    setTimeout(function() {\n        registrationForm.submit();\n    }, 300); // Wait for 300ms before submitting to allow tracking to go through\n}\n"
  },
  {
    "path": "browser/scripts/webVRAdapter.js",
    "content": "/**\n * wraps around and tweaks webvr boilerplate to work with Vizor\n * @emits VizorWebVRAdapter.events\n */\nfunction VizorWebVRAdapter() {\n\tvar that = this\n\n\tEventEmitter.apply(this, arguments)\n\tthis.events = VizorWebVRAdapter.events\n\n\tObject.defineProperty(this, 'mode', {\n\t\tget: function() {\n\t\t\tif (!that._manager)\n\t\t\t\treturn null\n\t\t\treturn that._manager.mode\n\t\t}\n\t})\n\n\tObject.defineProperty(this, 'hmd', {\n\t\tget: function() {\n\t\t\tif (!that._manager)\n\t\t\t\treturn null\n\t\t\treturn that._manager.hmd\n\t\t}\n\t})\n\n\tthis.iOS = navigator.userAgent.match(/iPhone|iPad|iPod/i)\n}\n\nVizorWebVRAdapter.prototype = Object.create(EventEmitter.prototype)\n\nVizorWebVRAdapter.prototype.initialise = function(domElement, renderer) {\n\tvar that = this\n\n\t// only stored here for convenience/debugging\n\tthis._renderer = renderer\n\tthis.modes = WebVRManager.Modes\n\n\tthis.domElement = domElement\t// typically a canvas\n\n\tthis.options = {\n\t\thideButton: \ttrue,\n\t\tisVRCompatible: true\n\t}\n\n\tthis.configure()\n\n\tthis.proxyOrientationChange = true\n\tthis.proxyDeviceMotion = this.isIOS\n\n\tif (document.body.classList)\n\t\tdocument.body.classList.toggle('hasHMD', this.haveVRDevices)\n\t\n\tthis._instructionsChanged = false\n\tthis._lastTarget = null\n\n\tthis._presentingKeyHandler = function(e) {\n\t\t// explicitly make esc exit VR mode\n\t\t// this seems not to be handled by the browser atm\n\t\tif (e.keyCode === 27)\n\t\t\tthis.exitVROrFullscreen()\n\t}.bind(this)\n}\n\nVizorWebVRAdapter.events = Object.freeze({\n\tdisplayPresentChanged: \t'displaypresentchanged',\n\tdisplayDeviceParamsChanged: 'displaydeviceparamschanged',\n\tmanagerInitialised: \t'webvrmanagerinitialised',\n\tmodeChanged: \t\t\t'vrmodechanged',\n\ttargetResized: \t\t\t'targetsizechanged'\n})\n\n/**\n * @param ev MouseEvent|TouchEvent|KeyboardEvent\n * @returns boolean\n */\nVizorWebVRAdapter.prototype.canInitiateCameraMove = function(ev) {\n\tif (E2 && E2.app && E2.app.canInitiateCameraMove)\n\t\treturn E2.app.canInitiateCameraMove(ev)\n\n\t// default\n\treturn true\n}\n\n// configures the polyfill\nVizorWebVRAdapter.prototype.configure = function() {\n\tif (this.configured)\n\t\treturn;\n\n\twindow.WebVRConfig = window.WebVRConfig || {}\n\tvar that = this\n\tvar w = window.WebVRConfig\n\n\tthis.configured = true\n\n\t// w.FORCE_ENABLE_VR \t= true\n\tw.NO_DPDB_FETCH \t= true\n\tw.BUFFER_SCALE \t\t= 1\n\tw.YAW_ONLY \t\t\t= false\n\tw.TOUCH_PANNER_DISABLED\t= false\n\tw.MOUSE_KEYBOARD_CONTROLS_DISABLED\t= false\n\n\tfunction patchDisplay(display) {\n\t\tif (display._vizorPatched)\n\t\t\treturn\n\n\t\tfunction patchPanner(panner) {\n\t\t\tpanner.shouldRotateStart = that.canInitiateCameraMove.bind(that)\n\t\t}\n\t\tswitch (display.displayName) {\n\t\t\tcase 'Mouse and Keyboard VRDisplay (webvr-polyfill)':\n\t\t\t\tpatchPanner(display)\n\t\t\t\tdisplay.getDimensions = that.getDomElementDimensions.bind(that);\n\t\t\t\tbreak;\n\t\t\tcase 'Cardboard VRDisplay (webvr-polyfill)':\n\t\t\t\tpatchPanner(display.poseSensor_.touchPanner)\n\t\t\t\tdisplay.getDimensions = function() {\n\t\t\t\t\tif (this.isPresenting)\n\t\t\t\t\t\treturn this.prototype.getDimensions.call(this)\n\t\t\t\t\t// else\n\t\t\t\t\treturn that.getDomElementDimensions()\n\t\t\t\t}.bind(display)\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// nothing to patch\n\t\t}\n\t\tdisplay._vizorPatched = true\n\t}\n\t\n\n\tnavigator.getVRDisplays()\n\t.then(function(displays) {\n\t\tif (!displays.length) {\n\t\t\t_webVRPolyfill.enablePolyfill()\n\t\t\t_webVRPolyfill.populateDevices()\n\t\t\tdisplays = _webVRPolyfill.displays\n\t\t}\n\n\t\tdisplays.forEach(function(display) {\n\t\t\tpatchDisplay(display)\n\t\t\tif (display.capabilities.canPresent)\n\t\t\t\tthat.haveVRDevices = true\n\t\t\t// note, if display.wrapForFullscreen (removeFullscreenWrapper) is taken out\n\t\t\t// then the cardboard selector won't show on Android because it would fullscreen the canvas, not its parent element\n\t\t})\n\n\t\tthat.options.isVRCompatible = that.haveVRDevices\n\n\t\tthat.effect = new THREE.VREffect(that._renderer)\n\n\t\tthat._manager = new WebVRManager(that._renderer, that.effect, that.options)\n\t\tthat._manager.on('initialized', function() {\n\t\t\tthat.patchWebVRManager()\n\n\t\t\tthat.attach()\n\n\t\t\t// initial sizing\n\t\t\tthat.resizeToTarget()\n\t\t})\t\t\n\n\t\tthat.emit('ready')\n\t})\n\n\tvar r = E2.core.renderer\n\tr._setSize = r.setSize\n\tr.setSize = function (width, height) {\t// becomes part of RAF loop\n\t\tthis._setSize(width, height, false)\t\t// ex .setSizeNoResize(); never update element\n\t}.bind(r)\n\n\twindow._WA = this\n}\n\n// patches the web vr manager so that requestFullscreen fullscreens our container\nVizorWebVRAdapter.prototype.patchWebVRManager = function() {\n\tvar that = this\n\tvar m = this._manager\n\n\tif (m.mode !== this.modes.NORMAL)\n\t\tm.setMode_(this.modes.NORMAL)\n\n\tif (m.requestFullscreen__)\n\t\treturn\n\n\tm.requestFullscreen__ = m.requestFullscreen_\n\tm.requestFullscreen_ = function() {\n\t\treturn this.requestFullscreen__(that.domElement)\n\t}.bind(m)\n}\n\nVizorWebVRAdapter.prototype.attach = function() {\n\t// events emitted by browser/boilerplate/polyfill\n\twindow.addEventListener('message', this.onMessageReceived.bind(this), false)\n\twindow.addEventListener('vrdisplaypresentchange', this._onVRPresentChange.bind(this), false)\n\twindow.addEventListener('vrdisplaydeviceparamschange', this._onVRDisplayDeviceParamsChange.bind(this), false)\n\n\twindow.addEventListener('vrdisplayactivate', this.enterVR.bind(this))\n\twindow.addEventListener('vrdisplaydeactivate', this.exitVROrFullscreen.bind(this))\n\n\tthis._manager.on('initialized', this._onManagerInitialised.bind(this))\n\tthis._manager.on('modechange', this._onManagerModeChanged.bind(this))\n\n\tthis.listenToBrowserEvents()\n}\n\nVizorWebVRAdapter.prototype.listenToBrowserEvents = function() {\n\tvar resizeHandler = this._onBrowserResize\n\tif (resizeHandler) {\n\t\twindow.removeEventListener('resize', resizeHandler, true)\n\n\t\tif (!this.iOS)\n\t\t\twindow.removeEventListener('orientationchange', resizeHandler, true)\n\n\t\tdocument.removeEventListener('webkitfullscreenchange', resizeHandler, true)\n\t\tdocument.removeEventListener('mozfullscreenchange', resizeHandler, true)\n\t\tdocument.removeEventListener('fullscreenchange', resizeHandler, true)\n\t} else {\n\t\tthis._onBrowserResize = this.onBrowserResize.bind(this)\n\t\tresizeHandler = this._onBrowserResize\n\t}\n\n\twindow.addEventListener('resize', resizeHandler, true)\n\tif (!this.iOS)\n\t\twindow.addEventListener('orientationchange', resizeHandler, true)\n\tdocument.addEventListener('webkitfullscreenchange', resizeHandler, true)\n\tdocument.addEventListener('mozfullscreenchange', resizeHandler, true)\n\tdocument.addEventListener('fullscreenchange', resizeHandler, true)\n\n\tif (this.iOS) {\n\t\tvar scrollHandler = this._onScroll\n\t\tif (scrollHandler) {\n\t\t\twindow.removeEventListener('scroll', scrollHandler, false)\n\t\t} else {\n\t\t\tthis._onScroll = this.onScroll.bind(this)\n\t\t\tscrollHandler = this._onScroll\n\t\t}\n\t\twindow.addEventListener('scroll', scrollHandler, false)\n\t}\n\n}\n\nVizorWebVRAdapter.prototype._scheduleResize = function(code, timeout) {\n\tif (this._resizeTimeout)\n\t\tclearTimeout(this._resizeTimeout)\n\n\tthis._resizeTimeout = setTimeout(code, timeout)\n\treturn this._resizeTimeout\n}\n\nVizorWebVRAdapter.prototype.onScroll = function() {\n\t// e.g. iOS needs double-checking viewport after it stops scrolling\n\tif (this._scrollTimeout)\n\t\tclearTimeout(this._scrollTimeout)\n\n\tvar that = this\n\t// double timeout here so resize does not overwrite the scroll timeout (e.g. Chrome/iOS)\n\tthis._scrollTimeout = setTimeout(function(){\n\t\tthat._scheduleResize(\n\t\t\tfunction(){\n\t\t\t\tif (!this._renderer)\n\t\t\t\t\treturn\n\t\t\t\tvar size = this.getTargetSize()\n\t\t\t\tvar rendererSize = this._renderer.getSize()\n\n\t\t\t\tif ((size.width !== rendererSize.width) || (size.height !== rendererSize.height)) {\n\t\t\t\t\tthis.resizeToTarget()\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t}.bind(that), 100)\n\t}, 500)\n}\n\nVizorWebVRAdapter.prototype.onBrowserResize = function() {\n\tvar that = this\n\tvar timeout = (this.iOS) ? 1000 : 10\n\n\tfunction doResize() {\n\t\tvar isFullscreen = E2.util.isFullscreen()\n\n\t\tif (document.body.classList && that.domElement) {\n\t\t\tvar elClasses = that.domElement.classList\n\t\t\tvar parentClasses = that.domElement.parentElement.classList\n\n\t\t\telClasses.toggle('webgl-canvas-fs', isFullscreen)\n\t\t\telClasses.toggle('webgl-canvas-normal', !isFullscreen)\n\n\t\t\tparentClasses.toggle('webgl-container-fs', isFullscreen)\n\t\t\tparentClasses.toggle('webgl-container-normal', !isFullscreen)\n\t\t}\n\n\t\tthat.resizeToTarget()\n\t}\n\n\tdoResize()\n\tif (this.iOS || !this.hmd || this.hmd.isPolyfilled)\n    this._scheduleResize(doResize, timeout)\n}\n\nVizorWebVRAdapter.prototype.isElementFullScreen = function() {\n\treturn E2.util.isFullscreen()\n}\n\nVizorWebVRAdapter.prototype.setDomElementDimensions = function(width, height, devicePixelRatio) {\n\tvar that = this\n\n\tif (this.iOS)\n\t\tthis.domElement.parentElement.style.zoom = 1.03\t// see below\n\n\t// the order here is important for iOS\n\tthis.domElement.style.width = width + 'px'\n\tthis.domElement.style.height = height + 'px'\n\tthis.domElement.width = width * devicePixelRatio\n\tthis.domElement.height = height * devicePixelRatio\n\n\tif (this.iOS)\n\t\tsetTimeout(function() {\n\t\t\tthat.domElement.parentElement.style.zoom = 1\n\t\t}, 10)\n}\n\nVizorWebVRAdapter.prototype.getDomElementDimensions = function() {\n\tvar ret\n\n\tthis.domElement.parentElement.style.zoom = 1\n\n\tif (this.isElementFullScreen())\n\t\tret = {\n\t\t\twidth:  window.innerWidth,\n\t\t\theight: window.innerHeight\n\t\t}\n\telse if (this.domElement) {\n\t\tvar clientRect = this.domElement.parentElement.getBoundingClientRect()\n\t\tret = {\n\t\t\twidth: clientRect.width,\n\t\t\theight: clientRect.height\n\t\t}\n\t}\n\treturn ret\n}\n\nVizorWebVRAdapter.prototype.resizeToTarget = function() {\n\tif (!this.domElement)\n\t\treturn\n\n\tvar size = this.getTargetSize()\n\tthis.setTargetSize(size.width, size.height, size.devicePixelRatio)\n}\n\nVizorWebVRAdapter.prototype.setTargetSize = function(width, height, devicePixelRatio) {\n\tif ((width === 0) || (height === 0)) {\n\t\tconsole.warn('setTargetSize 0x0')\n\t\treturn false\n\t}\n\n\tvar lastTarget = this._lastTarget\n\n\tif (lastTarget &&\n\t\t\tlastTarget.domElement === this.domElement &&\n\t\t\tlastTarget.width === width &&\n\t\t\tlastTarget.height === height &&\n\t\t\tlastTarget.devicePixelRatio === devicePixelRatio) {\n\t\tconsole.info('resizeToTarget: element and dimensions are the same')\n\t}\n\n\tthis.setDomElementDimensions(width, height, devicePixelRatio)\n\tthis._lastTarget = {\n\t\twidth: width,\n\t\theight: height,\n\t\tdevicePixelRatio: devicePixelRatio,\n\t\tdomElement: this.domElement\n\t}\n\n\tvar eventData = {\n\t\twidth: width,\n\t\theight: height,\n\t\tdevicePixelRatio: devicePixelRatio\n\t}\n\n\tthis.emit(this.events.targetResized, eventData)\n\tE2.core.emit('resize', eventData)\n}\n\nVizorWebVRAdapter.prototype.getTargetSize = function() {\n\tvar hmd = this.hmd\n\tvar isPresenting = hmd && hmd.isPresenting\n\n\tvar size = {\n\t\twidth: -1,\n\t\theight: -1,\n\t\tdevicePixelRatio: 0,\n\t\tisPresenting: isPresenting\n\t}\n\n\tvar domSize = this.getDomElementDimensions()\n\n\tif (isPresenting) {\n\t\t// { renderWidth, renderHeight }\n\t\tvar left = hmd.getEyeParameters('left')\n\t\tvar right = hmd.getEyeParameters('right')\n\t\tsize.width = left.renderWidth + right.renderWidth\n\t\tsize.height = Math.min(left.renderHeight, right.renderHeight)\n\t\tsize.devicePixelRatio = 1\n\t}\n\telse {\n\t\tsize.width  = domSize.width\n\t\tsize.height = domSize.height\n\t\tsize.devicePixelRatio = window.devicePixelRatio\n\t}\n\n\treturn size\n}\n\n// event handling\nVizorWebVRAdapter.prototype.onMessageReceived = function(e) {\n\treturn;\n\tif (!e.data)\n\t\treturn\n\n\tvar proxyEvent\n\n\tif (this.proxyOrientationChange && e.data.orientation) {\n\t\tproxyEvent = new CustomEvent('orientationchange', {\n\t\t\tdetail: {orientation: e.data.orientation}\n\t\t})\n\t\twindow.dispatchEvent(proxyEvent)\n\t}\n\n\tif (this.proxyDeviceMotion && e.data.devicemotion) {\n\t\tproxyEvent = new CustomEvent('devicemotion', {\n\t\t\tdetail: {devicemotion: e.data.devicemotion}\n\t\t})\n\t\twindow.dispatchEvent(proxyEvent)\n\t}\n}\n\n// event proxies\n\nVizorWebVRAdapter.prototype._onVRDisplayDeviceParamsChange = function(e) {\n\tthis.emit(this.events.displayDeviceParamsChanged, e)\n\treturn true\n}\n\nVizorWebVRAdapter.prototype._onVRPresentChange = function(e) {\n\tthis.onBrowserResize()\n\tthis.emit(this.events.displayPresentChanged, e)\n\treturn true\n}\n\nVizorWebVRAdapter.prototype._onManagerInitialised = function(e) {\n\tthis.emit(this.events.managerInitialised, {\n\t\tdomElement: this.domElement,\n\t\tsize: this.getDomElementDimensions(),\n\t\tmode: this._manager.mode\n\t})\n}\n\nVizorWebVRAdapter.prototype._onManagerModeChanged = function(mode, oldMode) {\n\n\tif (typeof siteUI !== 'undefined') {\n\t\tsiteUI.tagBodyClass()\n\n\t\tif (!siteUI.isDeviceDesktop()) {\n\t\t\tif (mode !== WebVRManager.Modes.NORMAL)\n\t\t\t\tthis._addViewportMeta()\n\t\t\telse\n\t\t\t\tthis._removeViewportMeta()\n\t\t}\n\t}\n\n\t// remove popovers\n\tvar tooltips = document.body.getElementsByClassName('popover')\n\tif (tooltips.length > 0) {\n\t\tArray.prototype.forEach.call(tooltips, function(n) {\n\t\t\tn.parentElement.removeChild(n)\n\t\t})\n\t}\n\n\tthis.emit(this.events.modeChanged, mode, oldMode)\n\n\t// fix iOS bug\n\tthis.onBrowserResize()\n}\n\nVizorWebVRAdapter.prototype.amendVRManagerInstructions = function() {\n\tvar r = this.getHmdRotateInstructions()\n\n\tif (!r)\n\t\treturn\n\n\tvar o = r.overlay\n\n\tif (o.className === 'VRInstructions') { // already changed\n\t\tthis._instructionsChanged = true\n\t\treturn\n\t}\n\to.className = 'VRInstructions'\n\n\tvar originalImage = o.getElementsByTagName('IMG')\n\toriginalImage[0].style.display = 'none';\n\n\tvar svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg')\n\tvar use = document.createElementNS('http://www.w3.org/2000/svg', 'use');\n\tuse.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href','#player-mobile-graphic');\n\tsvg.appendChild(use)\n\tvar s = svg.style\n\ts.marginLeft = '-92px'\n\ts.marginTop = '-54px'\n\ts.left = '50%'\n\ts.top = '35%'\n\ts.position = 'absolute'\n\ts.width = '184px'\n\ts.height = '108px'\n\ts.display = 'block'\n\n\to.style.height = '100%'\n\to.insertBefore(svg, o.firstChild)\n\n\n\tr.text.innerHTML = r.text.innerHTML.replace(\"Cardboard viewer\", \"VR viewer\")\n\n\t// if not bound directly, it sometimes stops working when reloading player files\n\tvar onclick = \"E2.core.webVRAdapter.exitVROrFullscreen();return false;\"\n\tr.text.innerHTML += \"<br /><br /><button style='color:white' onclick='\"+onclick+\"' id='backfromvr'>Exit VR view</button>\"\n\n\tr.text.style.position = 'absolute'\n\tr.text.style.top = '50%'\n\tr.overlay.style.color = '#ccc'\n\tr.overlay.style.background = '#2b2f37'\n\tr.overlay.style.zIndex = \"100\"\n\tvar divs = r.overlay.children\n\tif (divs && divs.length > 0) {\n\t\tvar getOne = divs[divs.length-1]\n\t\tgetOne.parentElement.removeChild(getOne)\n\t}\n\n\tthis._instructionsChanged = true\n\n}\n\nVizorWebVRAdapter.prototype.getCurrentManagerMode = function() {\n\treturn (this._manager) ? this._manager.mode : 0\n}\n\nVizorWebVRAdapter.prototype.isVRMode = function() {\n\tvar isPlayerPlaying = E2 && E2.app && E2.app.player && \n\t\t(E2.app.player.current_state === E2.app.player.state.PLAYING)\n\tvar isVRMode = (this.getCurrentManagerMode() === WebVRManager.Modes.VR)\n\treturn isPlayerPlaying && isVRMode\n}\n\nVizorWebVRAdapter.prototype.render = function(scene, camera) {\n\tif (!this._manager)\n\t\treturn;\n\treturn this._manager.render(scene, camera)\n}\n\nVizorWebVRAdapter.prototype.exitVROrFullscreen = function() {\n\tvar that = this\n\tvar manager = this._manager\n\tvar hmd = manager.hmd\n\tvar modeNormal = WebVRManager.Modes.NORMAL\n\t// to get back to normal mode, we have to:\n\t// 1) exit presentation mode\n\t// 2) do an equivalent to WebVRManager.prototype.onBackClick_()\n\tif (hmd && hmd.isPresenting) {\n\t\thmd.exitPresent()\n\t\t.then(function() {\n\t\t\tthat.setMode(modeNormal)\n\t\t})\n\t}\n\telse {\n\t\t// no hmd, we still want to go to normal mode\n\t\tthis.setMode(modeNormal)\n\t}\n}\n\nVizorWebVRAdapter.prototype.isVRCompatible = function() {\n\treturn this.haveVRDevices\n}\n\nVizorWebVRAdapter.prototype._addViewportMeta = function() {\n\tvar meta = document.getElementById('viewportmeta')\n\n\tif (!meta) {\n\t\tmeta = document.createElement('meta')\n\t\tmeta.id = 'viewportmeta'\n\t\tmeta.setAttribute('name', 'viewport')\n\t\tmeta.setAttribute('data-auto', 'true')\n\t\tdocument.head.appendChild(meta)\n\t}\n\n\tif (meta.getAttribute('data-auto') === 'true') {\n\t\tmeta.setAttribute('content', 'width=device-width, initial-scale=1, '+\n\t\t\t'maximum-scale=1, user-scalable=0, shrink-to-fit=no')\n\t} else {\n\t\tvar p = meta.parentElement\n\t\tp.removeChild(meta)\n\t\tp.appendChild(meta)\n\t}\n}\n\nVizorWebVRAdapter.prototype._removeViewportMeta = function() {\n\tvar meta = document.getElementById('viewportmeta')\n\n\tif (!meta) \n\t\treturn\n\n\tif (meta.getAttribute('data-auto') === 'true') {\n\t\tmeta.setAttribute('content', 'width=auto, initial-scale=auto, '+\n\t\t\t'minimum-scale=0.7, maximum-scale=2, user-scalable=1')\n\n\t\tsetTimeout(function() {\n\t\t\tvar meta = document.getElementById('viewportmeta')\n\n\t\t\tif (meta)\n\t\t\t\tmeta.parentNode.removeChild(meta)\n\t\t}, 10000)\n\t} else {\n\t\tvar p = meta.parentElement\n\t\tp.removeChild(meta)\n\t\tp.appendChild(meta)\n\t}\n}\n\nVizorWebVRAdapter.prototype.enterVROrFullscreen = function() {\n\tif (this.isVRCompatible())\n\t\tthis.enterVR()\n\telse\n\t\tthis.enterFullscreen()\n}\n\nVizorWebVRAdapter.prototype.toggleFullScreen = function() {\n\tvar goingToFullscreen = this._manager.mode === this.modes.NORMAL\n\n\tif (goingToFullscreen) { // normal to VR or full screen\n\t\treturn this.enterVROrFullscreen()\n\t}\n\telse {\n\t\t// toggleFullScreen doesn't get back from VR mode so we have to\n\t\t// do it ourselves\n\t\treturn this.exitVROrFullscreen()\n\t}\n}\n\nVizorWebVRAdapter.prototype.enterFullscreen = function() {\n\treturn this.setMode(this.modes.MAGIC_WINDOW)\n}\n\nVizorWebVRAdapter.prototype.enterVR = function() {\n\treturn this.setMode(this.modes.VR)\n}\n\nVizorWebVRAdapter.prototype.setMode = function(mode) {\n\t// replicating some of the manager functionality here\n\n\tvar manager = this._manager\n\tvar modes = this.modes\n\tvar oldMode = manager.mode\n\n\tif (!this._instructionsChanged)\n\t\tthis.amendVRManagerInstructions()\n\n\tif (mode === modes.VR)\n\t\tdocument.addEventListener('keydown', this._presentingKeyHandler)\n\telse\n\t\tdocument.removeEventListener('keydown', this._presentingKeyHandler)\n\n\tswitch (mode) {\n\t\tcase modes.VR:\n\t\t\tmanager.onVRClick_()\n\t\t\tbreak\n\t\tcase modes.MAGIC_WINDOW:\n\t\t\tmanager.onFSClick_()\n\t\t\tbreak\n\t\tcase modes.NORMAL:\n\t\t\tmanager.setMode_(mode)\n\t\t\tmanager.exitFullscreen_()\n\t\t\tbreak\n\t}\n\n\tthis._onManagerModeChanged(mode, oldMode)\n}\n\nVizorWebVRAdapter.prototype.getHmdRotateInstructions = function() {\n\tif (!(this._manager && this._manager.hmd))\n\t\treturn\n\treturn this._manager.hmd.rotateInstructions_\n}\n\nVizorWebVRAdapter.isNativeWebVRAvailable = function() {\n\treturn _webVRPolyfill.nativeWebVRAvailable || _webVRPolyfill.nativeLegacyWebVRAvailable\n}\n\nVizorWebVRAdapter.prototype.isNativeWebVRAvailable = VizorWebVRAdapter.isNativeWebVRAvailable\n\n\nif (typeof module !== 'undefined')\n\tmodule.exports = VizorWebVRAdapter\n"
  },
  {
    "path": "browser/scripts/worldEditor/abstractWorldEditorHelperObject.js",
    "content": "function AbstractWorldEditorHelperObject(referenceObj) {\n\tTHREE.Object3D.call(this)\n\n\tthis.assetLoader = E2.core.assetLoader\n\n\tif (referenceObj) {\n\t\tthis.attach(referenceObj)\n\t}\n}\n\nAbstractWorldEditorHelperObject.prototype = Object.create( THREE.Object3D.prototype )\n\nAbstractWorldEditorHelperObject.prototype.geometryLoaded = function(geometry, texture, scale, opacity) {\n\tvar scale = scale || 0.01\n\tvar rotation = Math.PI\n\n\tvar material = new THREE.MeshBasicMaterial({\n\t\tcolor: 0xffffff,\n\t\tmap: texture,\n\t\topacity: opacity || 0.9,\n\t\ttransparent: true,\n\t\tfog: false})\n\n\tvar mesh = new THREE.Mesh(geometry, material)\n\tmesh.scale.set(scale, scale, scale)\n\tmesh.quaternion.setFromEuler(new THREE.Euler(0, rotation, 0))\n\n\tthis.matrixAutoUpdate = false\n\n\tthis.add(mesh)\n}\n\nAbstractWorldEditorHelperObject.prototype.attach = function(referenceObj) {\n\tthis.referenceObj = referenceObj\n\n\tthis.matrix = this.referenceObj.matrixWorld\n\n\tthis.backReference = this.referenceObj.backReference\n\tthis.helperObjectBackReference = this.referenceObj\n}\n"
  },
  {
    "path": "browser/scripts/worldEditor/boundingBoxHelper.js",
    "content": "function BoundingBoxHelper() {\n\tTHREE.BoxHelper.apply(this)\n\n\tthis.material.opacity = 0.3\n\tthis.material.transparent = true\n\tthis.material.wireframe = false\n\tthis.material.color = new THREE.Color(0x9900ff)\n\n\tthis.attach = function (obj) {\n\t\tthis.object = obj\n\t\tthis.updateTransform()\n\t}\n\n\tthis.detach = function () {\n\t\tthis.object = undefined\n\t}\n\t\n\tthis.updateTransform = function() {\n\t\tif (!this.object)\n\t\t\treturn;\n\n\t\tthis.update()\n\t}\n}\n\nBoundingBoxHelper.prototype = Object.create(THREE.BoxHelper.prototype)\nBoundingBoxHelper.prototype.constructor = BoundingBoxHelper\n"
  },
  {
    "path": "browser/scripts/worldEditor/boundingSphereHelper.js",
    "content": "function BoundingSphereHelper( camera ) {\n\tAbstractWorldEditorHelperObject.call(this)\n\n\tvar that = this\n\n\tthis.matrixAutoUpdate = false\n\tthis.geometryLoaded(new THREE.SphereBufferGeometry(1), E2.core.assetLoader.defaultTexture, 1.0, 0.4)\n\n\tthis.name = 'bounding sphere camera helper object'\n\n\tthis.defaultPosition = new THREE.Vector3(0, 0, 0)\n}\n\nBoundingSphereHelper.prototype = Object.create( AbstractWorldEditorHelperObject.prototype )\n\nBoundingSphereHelper.prototype.attach = function(referenceObj) {\n\tvar position = this.defaultPosition\n\n\treferenceObj.updateMatrixWorld()\n\n\tvar scale = 0\n\tif (referenceObj.geometry) {\n\t\treferenceObj.geometry.computeBoundingSphere()\n\t\tscale = referenceObj.geometry.boundingSphere.radius\n\t\tposition = referenceObj.geometry.boundingSphere.center\n\t}\n\tthis.children[0].scale.set(scale, scale, scale)\n\tthis.children[0].position.copy(position)\n\tthis.children[0].updateMatrixWorld()\n\n\tAbstractWorldEditorHelperObject.prototype.attach.apply(this, arguments)\n}\n"
  },
  {
    "path": "browser/scripts/worldEditor/directionalLightHelper.js",
    "content": "function DirectionalLightHelper(light) {\n\tAbstractWorldEditorHelperObject.call(this)\n\n\tvar that = this\n\n\tthis.assetLoader.loadAsset('texture', \"/data/editor-icons/directional-light/IconTextureMap.png\")\n\t.then(function(texture) {\n\t\tthat.assetLoader.loadAsset('model', '/data/editor-icons/directional-light/directional.obj')\n\t\t.then(function(geomsmats) {\n\t\t\tthat.geometryLoaded(geomsmats.geometries[0], texture, 0.1)\n\t\t\tthat.children[0].material.color = light.color\n\t\t})\n\t})\n\n\tthis.name = 'directional light helper object'\n}\n\nDirectionalLightHelper.prototype = Object.create( AbstractWorldEditorHelperObject.prototype )\n"
  },
  {
    "path": "browser/scripts/worldEditor/hemisphereLightHelper.js",
    "content": "function HemisphereLightHelper(light) {\n\tAbstractWorldEditorHelperObject.call(this)\n\n\tvar that = this\n\n\tthis.assetLoader.loadAsset('texture', \"/data/editor-icons/hemisphere-light/IconTextureMap.png\")\n\t.then(function(texture) {\n\t\tthat.assetLoader.loadAsset('model', '/data/editor-icons/hemisphere-light/hemisphere.obj')\n\t\t.then(function(geomsmats) {\n\t\t\tthat.geometryLoaded(geomsmats.geometries[0], texture, 0.05)\n\t\t\tthat.children[0].material.color = light.color\n\t\t})\n\t})\n\n\tthis.name = 'hemisphere light helper object'\n}\n\nHemisphereLightHelper.prototype = Object.create( AbstractWorldEditorHelperObject.prototype )\n"
  },
  {
    "path": "browser/scripts/worldEditor/objectPlacementHelper.js",
    "content": "function AbstractObjectPlacementHelper() {\n}\n\nAbstractObjectPlacementHelper.prototype = {\n\texecute: function(plugin) {\n\t\t// place in front of current camera if we're in VR view\n\t\tif (E2.app.worldEditor.isVRCamera()) {\n\t\t\tvar cam = E2.app.worldEditor.getCamera()\n\t\t\tvar worldPos = new THREE.Vector3(0, 0, -2)\n\t\t\tworldPos.applyMatrix4(cam.matrixWorld)\n\n\t\t\tvar oldPos = new THREE.Vector3(plugin.state.position.x, plugin.state.position.y, plugin.state.position.z)\n\t\t\tplugin.undoableSetState('position', worldPos, oldPos)\n\t\t}\n\t}\n}\n\n// Objects\nfunction ObjectPlacementHelper() {\n\tAbstractObjectPlacementHelper.apply(this, arguments)\n}\n\nObjectPlacementHelper.prototype = Object.create(AbstractObjectPlacementHelper.prototype)\n\nObjectPlacementHelper.prototype.execute = function(plugin) {\n\t// scale to unit size\n\tplugin.scaleToUnitSize()\n\n\tAbstractObjectPlacementHelper.prototype.execute.apply(this, arguments)\n}\n\n// Textures\nfunction TexturePlacementHelper() {\n\tAbstractObjectPlacementHelper.apply(this, arguments)\n}\n\nTexturePlacementHelper.prototype = Object.create(AbstractObjectPlacementHelper.prototype)\n\nTexturePlacementHelper.prototype.execute = function(plugin) {\n\tAbstractObjectPlacementHelper.prototype.execute.apply(this, arguments)\n}\n"
  },
  {
    "path": "browser/scripts/worldEditor/pointLightHelper.js",
    "content": "function PointLightHelper(light) {\n\tAbstractWorldEditorHelperObject.call(this)\n\n\tvar that = this\n\n\tthis.assetLoader.loadAsset('texture', \"/data/editor-icons/point-light/IconTextureMap.png\")\n\t.then(function(texture) {\n\t\tthat.assetLoader.loadAsset('model', '/data/editor-icons/point-light/point.obj')\n\t\t.then(function(geomsmats) {\n\t\t\tthat.geometryLoaded(geomsmats.geometries[0], texture, 0.05)\n\t\t\tthat.children[0].material.color = light.color\n\t\t})\n\t})\n\n\tthis.name = 'point light helper object'\n}\n\nPointLightHelper.prototype = Object.create( AbstractWorldEditorHelperObject.prototype )\n"
  },
  {
    "path": "browser/scripts/worldEditor/sceneLightingHelper.js",
    "content": "function SceneLightingHelper(light) {\n\tAbstractWorldEditorHelperObject.call(this)\n\n\tvar that = this\n\n\tlight.traverse(function(n) {\n\t\tif (!that.directionalLight && n instanceof THREE.DirectionalLight) {\n\t\t\tthat.directionalLight = n\n\t\t}\n\t})\n\n\tvar that = this\n\n\tthis.assetLoader.loadAsset('texture', \"/data/editor-icons/directional-light/IconTextureMap.png\")\n\t.then(function(texture) {\n\t\tthat.assetLoader.loadAsset('model', '/data/editor-icons/directional-light/directional.obj')\n\t\t.then(function(geomsmats) {\n\t\t\tthat.geometryLoaded(geomsmats.geometries[0], texture, 0.05)\n\t\t\tthat.children[0].material.color = that.directionalLight.color\n\t\t})\n\t})\n\n\tthis.name = 'scene lighting helper object'\n}\n\nSceneLightingHelper.prototype = Object.create( AbstractWorldEditorHelperObject.prototype )\n\nSceneLightingHelper.prototype.attach = function(referenceObj) {\n\tthis.referenceObj = referenceObj\n\n\tthis.matrix = this.referenceObj.children[0].matrixWorld\n\n\tthis.backReference = this.referenceObj.backReference\n\tthis.helperObjectBackReference = this.referenceObj\n}\n"
  },
  {
    "path": "browser/scripts/worldEditor/skeletonHelper.js",
    "content": "function SkeletonHelper( node ) {\n\tAbstractWorldEditorHelperObject.call(this)\n\n\tvar that = this\n\n\tthis.matrixAutoUpdate = false\n\tvar mesh = new THREE.SkeletonHelper(node)\n\tmesh.matrix = new THREE.Matrix4()\n\tmesh.matrixAutoUpdate = true\n\tthis.add(mesh)\n\tthis.matrixAutoUpdate = false\n\n\tmesh.update()\n\n\tthis.name = 'skeleton helper object'\n\n\tthis.defaultPosition = new THREE.Vector3(0, 0, 0)\n}\n\nSkeletonHelper.prototype = Object.create( AbstractWorldEditorHelperObject.prototype )\n"
  },
  {
    "path": "browser/scripts/worldEditor/spotLightHelper.js",
    "content": "function SpotLightHelper(light) {\n\tAbstractWorldEditorHelperObject.call(this)\n\n\tvar that = this\n\n\tthis.assetLoader.loadAsset('texture', \"/data/editor-icons/spot-light/IconTextureMap.png\")\n\t.then(function(texture) {\n\t\tthat.assetLoader.loadAsset('model', '/data/editor-icons/spot-light/spot.obj')\n\t\t.then(function(geomsmats) {\n\t\t\tthat.geometryLoaded(geomsmats.geometries[0], texture, 0.1)\n\t\t\tthat.children[0].material.color = light.color\n\t\t})\n\t})\n\n\tthis.name = 'spot light helper object'\n}\n\nSpotLightHelper.prototype = Object.create( AbstractWorldEditorHelperObject.prototype )\n"
  },
  {
    "path": "browser/scripts/worldEditor/vrCameraHelperObject.js",
    "content": "function VRCameraHelper( camera ) {\n\tAbstractWorldEditorHelperObject.call(this)\n\n\tvar that = this\n\n\tthis.assetLoader.loadAsset('texture', \"/data/editor-icons/vr-camera/IconTextureMap.png\")\n\t.then(function(texture) {\n\t\tthat.assetLoader.loadAsset('model', '/data/editor-icons/vr-camera/Head1.obj')\n\t\t.then(function(geomsmats) {\n\t\t\tthat.geometryLoaded(geomsmats.geometries[0], texture)\n\t\t})\n\t})\n\n\tthis.name = 'vr camera helper object'\n}\n\nVRCameraHelper.prototype = Object.create( AbstractWorldEditorHelperObject.prototype )\n"
  },
  {
    "path": "browser/scripts/worldEditor/worldEditor.js",
    "content": "function WorldEditor(domElement) {\n\tEventEmitter.apply(this, arguments)\n\n\tvar that = this\n\tthis.domElement = domElement\n\tthis.showEditorHelpers = true\n\tvar active = false\n\n\tthis.activate = function() {\n\t\tactive = true\n\t\tthis.cameraSelector.transformControls.enabled = true\n\t\tthis.cameraSelector.editorControls.enabled = true\n\t}\n\n\tthis.deactivate = function() {\n\t\tthis.cameraSelector.transformControls.enabled = false\n\t\tthis.cameraSelector.editorControls.enabled = false\n\t\tif (this.editorTree.parent) {\n\t\t\tthis.editorTree.parent.remove(this.editorTree)\n\t\t}\n\t\tactive = false\n\t}\n\n\tthis.isActive = function() {\n\t\treturn active\n\t}\n\n\tthis.transformMode = 'translate'\n\n\tthis.editorTree = new THREE.Object3D()\n\n\t// grid around origin along x, z axises\n\tthis.gridHelper = new WorldEditorOriginGrid()\n\n\t// radial grid\n\tthis.radialHelper = new WorldEditorRadialHelper()\n\tthis.editorTree.add(this.radialHelper.mesh)\n\n\t// root for any selection objects\n\tthis.selectionTree = new THREE.Object3D()\n\tthis.editorTree.add(this.selectionTree)\n\tthis.selectedEntityPatch = undefined\n\tthis.selectedEntityNode = undefined\n\n\t// root for 3d handles\n\tthis.handleTree = new THREE.Object3D()\n\tthis.editorTree.add(this.handleTree)\n\n\tthis.cameraSelector = new WorldEditorCameraSelector(this.domElement)\n\n\tthis.cameraHelper = new VRCameraHelper()\n\n\t// box to act as a drag & drop zone\n\tthis.dropZoneHelper = new BoundingBoxHelper()\n\n\tvar that = this\n\n\tthis.setupObjectPicking()\n\n\tthis.toggleLocalGlobalHandles()\n\n\tE2.ui.state.on('changed:modifyMode', this.setTransformMode.bind(this));\n\n\t// whenever a drag is in progress, we want to know\n\tE2.ui.on('dragStarted', this.onDragStarted.bind(this))\n\tE2.ui.on('dragMoved', this.onDragMoved.bind(this))\n\tE2.ui.on('dragDropped', this.onDragDropped.bind(this))\n}\nWorldEditor.prototype = Object.create(EventEmitter.prototype)\nWorldEditor.prototype.constructor = WorldEditor\n\n\nWorldEditor.prototype.setTransformMode = function(mode) {\n\tthis.transformMode = mode\n}\n\nWorldEditor.prototype.update = function() {\n\tif (!this.isActive()) {\n\t\treturn\n\t}\n\n\t// update the reference grid scale based on camera distance from target\n\tvar f = function(v, n) {\n\t\tif (v / 10 < n) { return n }\n\t\treturn f(v, n * 10)\n\t}\n\n\tvar cameraDistanceToSelectedObject = \n\t\tthis.cameraSelector.camera.position.clone()\n\t\t.sub(this.cameraSelector.editorControls.center)\n\t\t.length() || 1\n\n\tvar gridScale = f(cameraDistanceToSelectedObject, 0.01)\n\n\tthis.gridHelper.scale(gridScale)\n\n\tif (this.vrCamera) {\n\t\tthis.radialHelper.position(this.vrCamera.parent.position)\n\n\t\tvar cameraDistanceToVRCamera = this.cameraSelector.camera.position.clone().sub(this.vrCamera.position).length() || 1\n\t\tvar gridScale = f(cameraDistanceToVRCamera, 0.01)\n\t\tgridScale = gridScale < 1 ? 1 : gridScale\n\t\tthis.radialHelper.scale(gridScale)\n\t}\n}\n\nWorldEditor.prototype.preRenderUpdate = function() {\n\t// update the camera selector just before render so that we get up to date\n\t// camera information for this frame\n\tthis.cameraSelector.update(this.transformMode, this.vrCamera, this.transformSpace)\n\n\t// add the editor tree to the scene if it's not there already\n\tvar editorIdx = this.scene.children.indexOf(this.editorTree)\n\n\tif (this.showEditorHelpers && editorIdx < 0) {\n\t\tthis.scene.add(this.editorTree)\n\t}\n\telse if (!this.showEditorHelpers && editorIdx >= 0) {\n\t\tthis.scene.remove(this.editorTree)\n\t}\n}\n\nWorldEditor.prototype.getCamera = function() {\n\treturn this.cameraSelector.camera\n}\n\nWorldEditor.prototype.updateHelperHandles = function(scene, camera) {\n\tvar needsHandles = []\n\tvar newHandles = []\n\tvar removeHandles = []\n\n\tvar that = this\n\n\tvar displayBoundingSphereHandles = false\n\tvar displaySkeletons = false\n\n\t// 1. collect objects requiring handles\n\tvar nodeCollector = function ( node ) {\n\t\tif (node instanceof THREE.PointLight\n\t\t||  node instanceof THREE.AmbientLight\n\t\t||  node instanceof THREE.SpotLight\n\t\t// legacy lights:\n\t\t||  node instanceof THREE.DirectionalLight\n\t\t||  node instanceof THREE.HemisphereLight\n\t\t||  (displayBoundingSphereHandles && node instanceof THREE.Mesh)\n\t\t||  (displaySkeletons && node instanceof THREE.SkinnedMesh)) {\n\t\t\tneedsHandles.push(node)\n\t\t}\n\t}\n\n\tif (scene) {\n\t\tscene.children[0].traverse( nodeCollector )\n\t}\n\n\t// add handles for the camera helper\n\tif (camera && camera.parent instanceof THREE.Camera && this.cameraSelector.selectedCamera !== 'vr') {\n\t\tneedsHandles.push(camera.parent)\n\t}\n\n\t// 2. remove handles that are no longer there\n\tthis.handleTree.traverse(function(n) {\n\t\tif (needsHandles.indexOf(n.helperObjectBackReference) === -1) {\n\t\t\tremoveHandles.push(n)\n\t\t}\n\t})\n\n\tfor (var i = 0; i < removeHandles.length; ++i) {\n\t\tthis.handleTree.remove(removeHandles[i])\n\t}\n\n\t// 3. create a list of handles to be created and filter out existing handles\n\tnewHandles = needsHandles.slice(0)\n\n\tfor (var i = 0; i < this.handleTree.children.length; ++i) {\n\t\tvar indexOfHandle = newHandles.indexOf(this.handleTree.children[i].helperObjectBackReference)\n\t\tif (indexOfHandle !== 1) {\n\t\t\tnewHandles.splice(indexOfHandle, 1)\n\t\t}\n\t}\n\n\t// 4. finally create any new helpers\n\tfor (var i = 0; i < newHandles.length; ++i) {\n\t\tvar node = newHandles[i]\n\n\t\tif (node instanceof THREE.HemisphereLight && node.children.length === 1 && node.children[0] instanceof THREE.DirectionalLight) {\n\t\t\tvar helper = new SceneLightingHelper(node)\n\t\t\thelper.attach(node)\n\t\t\tthis.handleTree.add(helper)\n\t\t}\n\t\telse if (node instanceof THREE.PointLight) {\n\t\t\tvar helper = new PointLightHelper(node)\n\t\t\thelper.attach(node)\n\t\t\tthis.handleTree.add(helper)\n\t\t}\n\t\telse if (node instanceof THREE.SpotLight) {\n\t\t\tvar helper = new SpotLightHelper(node)\n\t\t\thelper.attach(node)\n\t\t\tthis.handleTree.add(helper)\n\t\t}\n\t\telse if (node instanceof THREE.Camera) {\n\t\t\tthis.cameraHelper.attach(node)\n\t\t\tthis.handleTree.add(this.cameraHelper)\n\t\t}\n\t\telse if (displayBoundingSphereHandles && node instanceof THREE.Mesh) {\n\t\t\tvar helper = new BoundingSphereHelper(node)\n\t\t\thelper.attach(node)\n\t\t\tthis.handleTree.add(helper)\n\t\t}\n\t\telse if (displaySkeletons && node instanceof THREE.SkinnedMesh) {\n\t\t\tvar helper = new SkeletonHelper(node)\n\t\t\thelper.attach(node)\n\t\t\tthis.handleTree.add(helper)\n\t\t}\n\n\t\t// Directional & Hemisphere lights are legacy but we don't want to break old graphs:\n\t\telse if (node instanceof THREE.HemisphereLight && !(node.children.length == 1 && node.children[0] instanceof THREE.DirectionalLight)) {\n\t\t\tvar helper = new HemisphereLightHelper(node)\n\t\t\thelper.attach(node)\n\t\t\tthis.handleTree.add(helper)\n\t\t}\n\t\telse if (node instanceof THREE.DirectionalLight && !(node.parent instanceof THREE.HemisphereLight)) {\n\t\t\tvar helper = new DirectionalLightHelper(node)\n\t\t\thelper.attach(node)\n\t\t\tthis.handleTree.add(helper)\n\t\t}\n\t}\n}\n\nWorldEditor.prototype.updateScene = function(scene, camera) {\n\tthis.scene = scene\n\tthis.vrCamera = camera\n\n\tthis.updateHelperHandles(scene, camera)\n}\n\nWorldEditor.prototype.getEditorSceneTree = function() {\n\treturn this.editorTree\n}\n\nWorldEditor.prototype.setSelection = function(selected) {\n\tthis.selectionTree.children = []\n\n\tvar anySelected = false\n\n\tfor (var i = 0; i < selected.length; ++i) {\n\t\tvar obj = selected[i]\n\t\tif (obj && obj.backReference !== undefined) {\n\t\t\tif (obj.type && obj.type !== 'Group') {\n\t\t\t\tthis.selectedEntityPatch = obj.backReference.node.parent_graph\n\t\t\t\tthis.selectedEntityNode = this.selectedEntityPatch.plugin.node\n\t\t\t} else {\n\t\t\t\tthis.selectedEntityNode = obj.backReference.node\n\t\t\t}\n\t\t\tthis.cameraSelector.transformControls.attach(obj)\n\t\t\tthis.selectionTree.add(this.cameraSelector.transformControls)\n\n\t\t\tanySelected = true\n\t\t\t// only attach to first valid item\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif (!anySelected)\n\t\tthis.clearSelection()\n\n\tthis.emit('selectionSet', this.getSelectedNodes())\n}\n\nWorldEditor.prototype.clearSelection = function() {\n\tthis.selectedEntityPatch = undefined\n\tthis.selectedEntityNode = undefined\n\tthis.selectionTree.children = []\n\tthis.cameraSelector.transformControls.detach()\n}\n\nWorldEditor.prototype.onDelete = function(nodes) {\n\tthis.cameraSelector.transformControls.detach()\n}\n\nWorldEditor.prototype.selectEntityPatch = function(entityPatchNode) {\n\tif (!entityPatchNode.plugin.getObject3D)\n\t\treturn;\n\n\treturn this.setSelection([\n\t\tentityPatchNode\n\t\t\t.plugin\n\t\t\t.getObject3D()\n\t])\n}\n\nWorldEditor.prototype.selectMeshAndDependencies = function(meshNode, sceneNode, selectSingleObject) {\n\tvar selectNodes = []\n\n\tfunction collectConnectingNodesBetween(curNode, endNode) {\n\t\tvar allOutputs = curNode.outputs\n\n\t\tif (curNode.plugin.id === 'output_proxy' && curNode.parent_graph && curNode.parent_graph.plugin && curNode.parent_graph.plugin.parentNode) {\n\t\t\tif (collectConnectingNodesBetween(curNode.parent_graph.plugin.parentNode, sceneNode)) {\n\t\t\t\t// selected a whole subgraph node, don't recurse back into the subgraph\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\n\t\tfor(var i = 0; i < allOutputs.length; ++i) {\n\t\t\tif (!allOutputs[i].src_slot.is_connected || allOutputs[i].src_slot.dt !== E2.core.datatypes.OBJECT3D) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tvar candidateNode = allOutputs[i].dst_node\n\n\t\t\tvar atEndNode = candidateNode === endNode\n\n\t\t\tvar foundRouteToEnd =\n\t\t\t\t\tatEndNode ||\n\t\t\t\t\t(candidateNode ?\n\t\t\t\t\t\t\tcollectConnectingNodesBetween(candidateNode, endNode) :\n\t\t\t\t\t\t\tfalse)\n\n\t\t\tif (foundRouteToEnd) {\n\t\t\t\t// select this node and recurse back in the graph to select the path via which we came here\n\t\t\t\tif (selectNodes.indexOf(curNode) === -1) {\n\t\t\t\t\tselectNodes.push(curNode)\n\t\t\t\t}\n\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\n\t\treturn false\n\t}\n\n\tE2.app.clearSelection()\n\tthis.currentGroup = undefined\n\n\tif (meshNode) {\n\t\t// step 1:\n\t\t// collect nodes between mesh and scene\n\t\tcollectConnectingNodesBetween(meshNode, sceneNode)\n\n\t\tif (selectNodes.length === 0) {\n\t\t\t// found nothing\n\t\t\treturn\n\t\t}\n\n\t\t// step 2:\n\t\t// if we're selecting a single object, drop anything after group\n\t\t// nodes from the selection\n\t\tif (selectSingleObject) {\n\t\t\tfor (var i = selectNodes.length - 1; i >= 0; --i) {\n\t\t\t\tif (selectNodes[i].plugin instanceof E2.plugins.three_group) {\n\t\t\t\t\tthis.currentGroup = selectNodes[i]\n\t\t\t\t\tselectNodes.splice(0, i + 1)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// step 3:\n\t\t// add any objects hidden in group hierarchies into selection\n\t\tvar resolvedMeshNode = selectNodes[selectNodes.length - 1]\n\t\tvar origSelection = selectNodes.slice(0)\n\n\t\tfor (var i = 0; i < origSelection.length; ++i) {\n\t\t\tvar node = origSelection[i]\n\n\t\t\tif (node.plugin.object3d && node.plugin instanceof E2.plugins.three_group) {\n\t\t\t\tnode.plugin.object3d.traverse(function(obj) {\n\t\t\t\t\tif (obj.backReference && selectNodes.indexOf(obj.backReference.node) === -1) {\n\t\t\t\t\t\tcollectConnectingNodesBetween(obj.backReference.node, node)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\t// step 4:\n\t\t// select the collected nodes\n\t\tfor (var i = 0; i < selectNodes.length; ++i) {\n\t\t\tE2.app.markNodeAsSelected(selectNodes[i])\n\t\t\tselectNodes[i].getConnections()\n\t\t\t\t.map(E2.app.markConnectionAsSelected.bind(E2.app))\n\t\t}\n\n\t}\n}\n\nWorldEditor.prototype.paste = function(doc, x, y) {\n\tdoc = doc.root ? doc.root : doc\n\treturn this.onPatchDropped({ type: doc.nodes[0].plugin }, doc)\n}\n\nWorldEditor.prototype.onPatchDropped = function(patchMeta, patch, targetObject3d) {\n\tvar sceneNode = this.currentGroup || this.scene.backReference.parentNode\n\tvar leftFromSceneNode = 300\n\n\t// empty graph can have this\n\tif (!this.scene && !this.currentGroup)\n\t\treturn;\n\n\tpatch = patch.root ? patch.root : patch\n\n\tvar targetPatch = E2.core.root_graph\n\n\tif (targetObject3d) {\n\t\t// paste into the target entity patch\n\t\tvar meshNode = targetObject3d.backReference.node\n\t\ttargetPatch = meshNode.parent_graph\n\t} else {\n\t\t// minimise patches dropped in root\n\t\tif (patch.nodes[0])\n\t\t\tpatch.nodes[0].open = false\n\t}\n\n\tvar isRoot = targetPatch === E2.core.root_graph\n\n\tE2.app.undoManager.begin('Drag and Drop Patch')\n\n\tvar desiredPlace = { x: sceneNode.x - leftFromSceneNode, y: sceneNode.y }\n\tvar finalPlace = E2.app.findSpaceInGraphFor(\n\t\ttargetPatch, \n\t\tdesiredPlace, \n\t\tisRoot ? sceneNode : null\n\t)\n\tvar dropped = E2.app.pasteInGraph(targetPatch, patch, finalPlace.x, finalPlace.y)\n\tvar droppedNode = dropped.nodes[0]\n\tdroppedNode.x = finalPlace.x\n\tdroppedNode.y = finalPlace.y\n\n\tswitch(patchMeta.type) {\n\t\tcase 'entity':\n\t\t\tthis.onEntityDropped(droppedNode)\n\t\t\tbreak;\n\t\tcase 'entity_component':\n\t\t\tif (targetObject3d)\n\t\t\t\tthis.onComponentDropped(droppedNode, targetObject3d)\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t// materials on entities\n\t\t\t// modifiers on materials\n\t\t\t// audio, video entities?\n\t\t\tbreak;\n\t}\n\n\tE2.app.undoManager.end()\n\n\treturn dropped\n}\n\nWorldEditor.prototype.onEntityDropped = function(dropNode) {\n\tvar sceneNode = this.currentGroup || this.scene.backReference.parentNode\n\tsceneNode.slots_dirty = true\n\n\tvar slots = sceneNode.getDynamicInputSlots()\n\tvar sceneSlot = slots[slots.length - 1]\n\n\tfunction findObject3DOutput(node) {\n\t\tvar staticSlots = node.plugin.output_slots\n\t\tfor (var i = 0; i < staticSlots.length; ++i) {\n\t\t\tif (staticSlots[i].dt === E2.core.datatypes.OBJECT3D) {\n\t\t\t\treturn {index: i, dynamic: false}\n\t\t\t}\n\t\t}\n\n\t\t// if it's not a static slot,\n\t\t// assume it's the first dynamic slot\n\t\treturn {index: 0, dynamic: true}\n\t}\n\n\tvar srcSlot = findObject3DOutput(dropNode)\n\n\t// connect the new patch to the scene\n\tvar connection = Connection.hydrate(E2.core.root_graph, {\n\t\tsrc_nuid: dropNode.uid,\n\t\tdst_nuid: sceneNode.uid,\n\t\tsrc_slot: srcSlot.index,\n\t\tsrc_dyn: srcSlot.dynamic,\n\t\tdst_slot: sceneSlot.index,\n\t\tdst_dyn: true\n\t})\n\n\tE2.app.graphApi.connect(E2.core.root_graph, connection)\n\tE2.app.onLocalConnectionChanged(connection)\n\tE2.app.markConnectionAsSelected(connection)\n\n\t// select the meshes in world editor\n\tvar selectNodes = [dropNode]\n\n\tfunction collectMeshes(node) {\n\t\tif (node.plugin && node.plugin.object3d) {\n\t\t\tnode.plugin.object3d.traverse(function(n) {\n\t\t\t\tif (n.backReference) {\n\t\t\t\t\tselectNodes.push(n)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t\tif (node.plugin.graph) {\n\t\t\tfor (var n = 0; n < node.plugin.graph.nodes.length; ++n) {\n\t\t\t\tcollectMeshes(node.plugin.graph.nodes[n])\n\t\t\t}\n\t\t}\n\t}\n\n\tcollectMeshes(dropNode)\n\n\tthis.setSelection(selectNodes)\n\n\tif (!selectNodes.length)\n\t\tE2.app.growl('Oops, nothing was dropped.')\n}\n\nWorldEditor.prototype.onComponentDropped = function(droppedNode, targetObject3d) {\n\tvar meshNode = targetObject3d.backReference.node\n\tE2.app.graphApi.autoConnectPatchToNode(droppedNode, meshNode)\n}\n\nWorldEditor.prototype.onDragStarted = function(e) {\n\tthis.__wasPlayingOnDragStarted = E2.app.player.current_state === 1\n\tif (this.__wasPlayingOnDragStarted)\n\t\tE2.app.player.pause()\n}\n\nWorldEditor.prototype.onDragDropped = function(e) {\n\tif (this.__wasPlayingOnDragStarted)\n\t\tE2.app.player.play()\n\n\tthis.dropZoneHelper.detach()\n\tthis.selectionTree.remove(this.dropZoneHelper)\n\n\tthis._lastDropTarget = null\n}\n\nWorldEditor.prototype.onDragMoved = function(e, patchMeta) {\n\tif (patchMeta.type === 'entity') // always drop in root\n\t\treturn;\n\n\t// disable in production until Components library is ready\n\tif (Vizor.releaseMode)\n\t\treturn;\n\n\tvar obj = this.raycastFromMouseEvent(e, /* single = */ true)\n\n\tif (obj === this.dropZoneHelper.object)\n\t\treturn;\n\n\tif (!obj) {\n\t\tthis.dropZoneHelper.detach()\n\t\tthis.selectionTree.remove(this.dropZoneHelper)\n\t\tthis._lastDropTarget = null\n\t} else if (obj.backReference) {\n\t\tthis._lastDropTarget = obj\n\t\tthis.dropZoneHelper.attach(obj)\n\t\tthis.selectionTree.add(this.dropZoneHelper)\n\t}\n}\n\nWorldEditor.prototype.getLastDropTarget = function() {\n\treturn this._lastDropTarget\n}\n\nWorldEditor.prototype.pickObject = function(e) {\n\tvar obj = this.raycastFromMouseEvent(e, false)\n\t\n\tif (!obj) {\n\t\tthis.clearSelection()\n\t\treturn E2.app.onGraphSelected(E2.core.root_graph)\n\t}\n\n\treturn this.setSelection([ obj ])\n}\n\nWorldEditor.prototype.raycastFromMouseEvent = function(e, selectSingleObject) {\n\tif (E2.app.noodlesVisible === true)\n\t\treturn\n\n\tif (!this.isActive() || !this.scene || !this.scene.children)\n\t\treturn\n\t\n\t// if alt is pressed, we try to select the single object we click\n\t// otherwise we select the topmost group the clicked object is in\n\tselectSingleObject = selectSingleObject || E2.ui.flags.pressedAlt\n\n\tvar selectedObject\n\tvar pointer = e.changedTouches ? e.changedTouches[0] : e\n\tvar rect = this.domElement.getBoundingClientRect()\n\tvar x = ( pointer.clientX - rect.left ) / rect.width\n\tvar y = ( pointer.clientY - rect.top ) / rect.height\n\tvar mouseVector = new THREE.Vector3()\n\n\tmouseVector.set( ( x * 2 ) - 1, - ( y * 2 ) + 1 );\n\n\tthis.raycaster.setFromCamera(mouseVector, this.getCamera())\n\n\tvar intersects = this.raycaster.intersectObjects(this.scene.children, /*recursive = */ true)\n\n\tfor (var i = 0; i < intersects.length; i++) {\n\t\t// ancestor = object closest to object3d tree root\n\t\tvar ancestorObj\n\t\tvar seekObj = intersects[i].object\n\n\t\t// traverse the tree hierarchy up to find a parent with a node back reference\n\t\t// store a reference to the object closest to the scene root (ancestorObj)\n\t\twhile (seekObj) {\n\t\t\tif (seekObj.helperObjectBackReference) {\n\t\t\t\t// resolve back from a helper object to the object the helper is for\n\t\t\t\tseekObj = seekObj.helperObjectBackReference\n\t\t\t}\n\n\t\t\tif (seekObj.backReference && seekObj !== this.scene) {\n\t\t\t\tancestorObj = seekObj\n\n\t\t\t\tif (selectSingleObject)\n\t\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tseekObj = seekObj.parent\n\t\t}\n\n\t\tif (!ancestorObj) {\n\t\t\t// nothing found\n\t\t\tcontinue\n\t\t}\n\n\t\tif (ancestorObj.backReference.parentNode === this.scene.backReference.parentNode) {\n\t\t\t// trying to select the scene, ignore\n\t\t\tcontinue\n\t\t}\n\n\t\tselectedObject = ancestorObj\n\n\t\tvar selectionStartNode = ancestorObj.backReference.parentNode\n\t\tvar selectionEndNode = this.scene.backReference.parentNode\n\n\t\t// select everything between the mesh and scene nodes\n\t\t// (and any complete subgraph that contains the mesh)\n\t\tif (!selectSingleObject)\n\t\t\tthis.selectMeshAndDependencies(selectionStartNode, selectionEndNode, selectSingleObject)\n\n\t\t// only select a single object\n\t\tbreak\n\t}\n\n\treturn selectedObject\n}\n\nWorldEditor.prototype.mouseDown = function(e) {\n\tif (this.isActive()) {\n\t\tthis.dragContext = {startX: e.pageX, startY: e.pageY}\n\t}\n}\n\nWorldEditor.prototype.mouseUp = function(e) {\n\tif (this.dragContext && e.pageX === this.dragContext.startX && e.pageY === this.dragContext.startY) {\n\t\t// only pick an object if there was no drag\n\t\tthis.pickObject(e)\n\t}\n}\n\nWorldEditor.prototype.setupObjectPicking = function() {\n\tthis.domElement.addEventListener( 'mousedown', this.mouseDown.bind(this), false );\n\tthis.domElement.addEventListener( 'mouseup', this.mouseUp.bind(this), false );\n\tthis.raycaster = new THREE.Raycaster()\n}\n\nWorldEditor.prototype.getActiveSceneNode = function() {\n\treturn this.scene.backReference.parentNode\n}\n\nWorldEditor.prototype.matchVRToEditorCamera = function() {\n\t// match the selected vr camera to world editor camera\n\tvar vrCameraPlugin = this.vrCamera.parent.backReference\n\tvar editCamera = this.getCamera()\n\n\tE2.app.undoManager.begin()\n\n\tvar tempPosition = new THREE.Vector3(vrCameraPlugin.state.position.x, vrCameraPlugin.state.position.y, vrCameraPlugin.state.position.z)\n\tvrCameraPlugin.undoableSetState('position', editCamera.position.clone(), tempPosition)\n\tvar tempQuaternion = new THREE.Quaternion(vrCameraPlugin.state.quaternion._x, vrCameraPlugin.state.quaternion._y, vrCameraPlugin.state.quaternion._z, vrCameraPlugin.state.quaternion._w)\n\tvrCameraPlugin.undoableSetState('quaternion', editCamera.quaternion.clone(), tempQuaternion)\n\n\tE2.app.undoManager.end()\n}\n\nWorldEditor.prototype.callAndRetainSelection = function(callback) {\n\tvar activePlugin = this.cameraSelector.transformControls.plugin\n\tvar selectedObject = activePlugin ? activePlugin.object3d : undefined\n\tif (selectedObject !== undefined) {\n\t\tthis.cameraSelector.transformControls.detach()\n\t}\n\n\tif (callback) {\n\t\tcallback()\n\t}\n\n\t// reselect the selection for the new camera\n\tif (selectedObject !== undefined) {\n\t\tthis.setSelection([selectedObject])\n\t}\n}\n\nWorldEditor.prototype.selectCamera = function(cameraId) {\n\tvar that = this\n\tthis.callAndRetainSelection(function() {\n\t\tthat.cameraSelector.selectCamera(cameraId)\n\t})\n}\n\nWorldEditor.prototype.isVRCamera = function() {\n\treturn this.cameraSelector.selectedCamera === 'vr'\n}\n\nWorldEditor.prototype.matchEditorToVRCamera = function() {\n\t// match the selected vr camera to world editor camera\n\tvar vrCameraPlugin = this.vrCamera.parent.backReference\n\tvar editCamera = this.getCamera()\n\n\teditCamera.position.copy(vrCameraPlugin.state.position)\n\teditCamera.quaternion.set(vrCameraPlugin.state.quaternion._x, vrCameraPlugin.state.quaternion._y, vrCameraPlugin.state.quaternion._z, vrCameraPlugin.state.quaternion._w)\n}\n\nWorldEditor.prototype.toggleLocalGlobalHandles = function() {\n\tthis.transformSpace = this.transformSpace === 'world' ? 'local' : 'world'\n}\n\nWorldEditor.prototype.toggleGrid = function() {\n\tif (this.editorTree.children.indexOf(this.gridHelper.mesh) !== -1) {\n\t\tthis.editorTree.remove(this.gridHelper.mesh)\n\t\tthis.editorTree.add(this.radialHelper.mesh)\n\t}\n\telse {\n\t\tthis.editorTree.remove(this.radialHelper.mesh)\n\t\tthis.editorTree.add(this.gridHelper.mesh)\n\t}\n}\n\nWorldEditor.prototype.setCameraView = function(camera) {\n\tthis.cameraSelector.setView(camera)\n}\n\nWorldEditor.prototype.toggleCameraOrthographic = function() {\n\tvar that = this\n\tthis.callAndRetainSelection(function() {\n\t\tthat.cameraSelector.selectNextCameraInCurrentCategory()\n\t})\n}\n\nWorldEditor.prototype.setEditorHelpers = function(set) {\n\tthis.showEditorHelpers = set\n}\n\nWorldEditor.prototype.areEditorHelpersActive = function() {\n\treturn this.showEditorHelpers\n}\n\nWorldEditor.prototype.frameSelection = function() {\n\tvar activePlugin = this.getSelectedObjectPlugin()\n\tvar selectedObject = activePlugin ? activePlugin.object3d : undefined\n\n\tvar cameraDirection = this.cameraSelector.camera.getWorldDirection()\n\n\tvar center = new THREE.Vector3()\n\tvar radius = 1\n\n\tif (selectedObject === undefined) {\n\t\tselectedObject = this.scene.children[0]\n\t}\n\n\tif (selectedObject) {\n\t\tcenter.copy(selectedObject.position)\n\t\tcenter.applyMatrix4(selectedObject.matrixWorld)\n\n\t\tvar tempSphere = new THREE.Sphere()\n\n\t\tselectedObject.traverse(function(n) {\n\t\t\tif (n.geometry) {\n\t\t\t\tif (!n.geometry.boundingSphere) {\n\t\t\t\t\tn.geometry.computeBoundingSphere()\n\t\t\t\t}\n\n\t\t\t\ttempSphere.copy(n.geometry.boundingSphere)\n\t\t\t\ttempSphere.applyMatrix4(n.matrixWorld)\n\n\t\t\t\tvar nodeRadius = center.distanceTo(tempSphere.center) + tempSphere.radius\n\t\t\t\tif (radius < nodeRadius) {\n\t\t\t\t\tradius = nodeRadius\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\tthis.cameraSelector.camera.position.copy(selectedObject.position.clone().sub(cameraDirection.multiplyScalar(radius * 1.5)))\n\n\t\tthis.cameraSelector.camera.lookAt(selectedObject.position)\n\t\tthis.cameraSelector.editorControls.focus(selectedObject)\n\t}\n}\n\nWorldEditor.prototype.getSelectedObjectPlugin = function() {\n    var activePlugin = this.cameraSelector.transformControls.plugin\n    return activePlugin\n}\n\n/**\n * returns an array of selected nodes (entities)\n */\nWorldEditor.prototype.getSelectedNodes = function() {\n\tvar selection = []\n\tif (this.selectedEntityNode) {\n\t\tif (this.selectedEntityNode.plugin.id === 'three_group') {\n\t\t\tvar conns = this.selectedEntityNode.getConnections()\n\t\t\tif (conns) {\n\t\t\t\tconns.forEach(function (c) {\n\t\t\t\t\tif (c.dst_slot.dynamic)\n\t\t\t\t\t\tselection.push(c.src_node)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\telse\n\t\t\tselection = [this.selectedEntityNode]\n\t}\n\n\treturn selection\n}"
  },
  {
    "path": "browser/scripts/worldEditor/worldEditorCameraSelector.js",
    "content": "function WorldEditorCameraSelector(domElement) {\n\n\tvar perspectiveCamera = new WorldEditorCamera(domElement)\n\tvar orthographicCamera = new WorldEditorOrthographicCamera(domElement)\n\tvar vrCamera = new WorldEditorCamera(domElement)\n\tvrCamera.camera.matrixAutoUpdate = false\n\n\tthis.axisCameras = {\n\t\t'+x': {position: new THREE.Vector3(-1, 0, 0) },\n\t\t'+y': {position: new THREE.Vector3( 0,-1, 0) },\n\t\t'+z': {position: new THREE.Vector3( 0, 0,-1) },\n\t\t'-x': {position: new THREE.Vector3( 1, 0, 0) },\n\t\t'-y': {position: new THREE.Vector3( 0, 1, 0) },\n\t\t'-z': {position: new THREE.Vector3( 0, 0, 1) }\n\t}\n\n\tvar dummyEditorControls = {\n\t\tcenter: new THREE.Vector3(),\n\t\tenable: true\n\t}\n\n\tthis.cameraCategories = {\n\t\t'birdsEye': [\n\t\t\t{\n\t\t\t\tcamera: perspectiveCamera,\n\t\t\t\teditorControls: new THREE.EditorControls(perspectiveCamera.camera, domElement),\n\t\t\t\ttransformControls: new THREE.TransformControls(perspectiveCamera.camera, domElement),\n\t\t\t\tcanSwitchToPrimaryAxis: true\n\t\t\t},\n\t\t\t{\n\t\t\t\tcamera: orthographicCamera,\n\t\t\t\teditorControls: new THREE.EditorControls(orthographicCamera.camera, domElement),\n\t\t\t\ttransformControls: new THREE.TransformControls(orthographicCamera.camera, domElement),\n\t\t\t\tcanSwitchToPrimaryAxis: true\n\t\t\t}\n\t\t],\n\t\t'vr': [\n\t\t\t{\n\t\t\t\tcamera: vrCamera,\n\t\t\t\teditorControls: dummyEditorControls,\n\t\t\t\ttransformControls: new THREE.TransformControls(vrCamera.camera, domElement),\n\t\t\t\tcanSwitchToPrimaryAxis: false\n\t\t\t}\n\t\t]}\n\n\tthis.cameras = {\n\t\t'birdsEye': this.cameraCategories.birdsEye[0],\n\t\t'vr': this.cameraCategories.vr[0]\n\t}\n\n\tthis.currentCameraId = 'birdsEye'\n\n\tfunction initialiseCamera(camera) {\n\t\tcamera.editorControls.enabled = false\n\t\tcamera.transformControls.enabled = false\n\n\t\tfunction mouseDown() {\n\t\t\tthis.editorControls.enabled = false\n\t\t\tif (E2.ui.flags.pressedAlt) {\n\t\t\t\tE2.app.pasteJson(E2.app.stringifySelection())\n\t\t\t}\n\t\t}\n\n\t\tfunction mouseUp() {\n\t\t\tthis.editorControls.enabled = true\n\t\t}\n\n\t\tcamera.transformControls.addEventListener('mouseDown', mouseDown.bind(camera))\n\n\t\tcamera.transformControls.addEventListener('mouseUp', mouseUp.bind(camera))\n\t}\n\n\tthis.cameraCategories.birdsEye.map(initialiseCamera)\n\tthis.cameraCategories.vr.map(initialiseCamera)\n\n}\n\nWorldEditorCameraSelector.prototype = {\n\tconstructor: WorldEditorCameraSelector,\n\n\tget camera() {\n\t\treturn this.cameras[this.currentCameraId].camera.camera\n\t},\n\n\tget editorControls() {\n\t\treturn this.cameras[this.currentCameraId].editorControls\n\t},\n\n\tget transformControls() {\n\t\treturn this.cameras[this.currentCameraId].transformControls\n\t},\n\n\tget selectedCamera() {\n\t\treturn this.currentCameraId\n\t},\n\n\tsaveCameraState: function(camera) {\n\t\treturn {\n\t\t\t'position': camera.position.clone(),\n\t\t\t'rotation': camera.rotation.clone(),\n\t\t\t'quaternion': camera.quaternion.clone(),\n\t\t\t'scale': camera.scale.clone(),\n\n\t\t\t'transformControlsEnabled': this.transformControls.enabled,\n\t\t\t'editorControlsEnabled': this.editorControls.enabled\n\t\t}\n\t},\n\n\tapplySavedState: function(state) {\n\t\tthis.transformControls.enabled = state.transformControlsEnabled\n\t\tthis.editorControls.enabled = state.editorControlsEnabled\n\n\t\tthis.camera.position.copy(state.position)\n\t\tthis.camera.rotation.copy(state.rotation)\n\t\tthis.camera.quaternion.copy(state.quaternion)\n\t\tthis.camera.scale.copy(state.scale)\n\t},\n\n\tselectCamera: function(id) {\n\t\tif (id === this.currentCameraId) {\n\t\t\treturn\n\t\t}\n\n\t\t// save camera position, orientation etc\n\t\tvar oldCameraState = this.saveCameraState(this.camera)\n\n\t\t// disable previous camera\n\t\tthis.transformControls.enabled = false\n\t\tthis.editorControls.enabled = false\n\n\t\tthis.currentCameraId = id\n\n\t\t// apply saved state\n\t\tthis.applySavedState(oldCameraState)\n\t},\n\n\tselectNextCameraInCurrentCategory: function() {\n\t\tvar curCam = this.cameras[this.currentCameraId]\n\t\tvar camCat = this.cameraCategories[this.currentCameraId]\n\n\t\tfor (var i = 0; i < camCat.length; ++i) {\n\t\t\tif (curCam === camCat[i]) {\n\t\t\t\tcurCam = camCat[(i+1) % camCat.length]\n\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\n\t\t// save camera position, orientation etc\n\t\tvar oldCameraState = this.saveCameraState(this.camera)\n\n\t\t// disable previous camera\n\t\tthis.transformControls.enabled = false\n\t\tthis.editorControls.enabled = false\n\n\t\tthis.cameras[this.currentCameraId] = curCam\n\n\t\t// apply saved state\n\t\tthis.applySavedState(oldCameraState)\n\t},\n\n\tsetView: function(id) {\n\t\tif (!this.cameras[this.currentCameraId].canSwitchToPrimaryAxis) {\n\t\t\treturn\n\t\t}\n\n\t\tvar view = this.axisCameras[id].position.clone()\n\n\t\tvar target = this.transformControls.object\n\t\tvar targetPosition = target ? target.position : new THREE.Vector3(0, 0, 0)\n\n\t\tview.add(targetPosition)\n\t\tthis.camera.position.copy(view)\n\t\tthis.camera.lookAt(targetPosition)\n\n\t\tif (target) {\n\t\t\tthis.editorControls.focus(target)\n\t\t}\n\t},\n\n\tupdate: function(transformMode, vrCamera, localOrWorldSpace) {\n\t\t// needs calling on every update otherwise the transform controls draw incorrectly\n\t\tthis.transformControls.setMode(transformMode)\n\t\tthis.transformControls.setSpace(transformMode === 'scale' ? 'local' : localOrWorldSpace)\n\t\tthis.transformControls.updateTransformLock()\n\n\t\tthis.cameras[this.currentCameraId].camera.update();\n\n\t\tif (vrCamera && this.currentCameraId === 'vr') {\n\t\t\t// keep the editor vr camera in sync with the current vr camera plugin\n\t\t\tvrCamera.updateMatrixWorld()\n\n\t\t\tvar threeCamera = this.cameras.vr.camera.camera\n\t\t\tthreeCamera.matrixWorld.copy(vrCamera.matrixWorld)\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "browser/scripts/worldEditor/worldEditorOriginGrid.js",
    "content": "function WorldEditorOriginGrid() {\n\n\tvar EditorGridHelper = function ( size, step ) {\n\t\tthis.color1 = new THREE.Color( 0xBBBBBB )\n\t\tthis.color2 = new THREE.Color( 0x888888 )\n\n\t\tvar lineMaterial =\n\t\t\tnew THREE.LineBasicMaterial(\n\t\t\t\t{ vertexColors: THREE.VertexColors, linewidth: 1, fog: false } )\n\n\t\tvar geometry = new THREE.Geometry()\n\n\n\t\tfor ( var i = - size; i <= size; i += step ) {\n\n\t\t\tgeometry.vertices.push(\n\t\t\t\tnew THREE.Vector3( - size, 0, i ), new THREE.Vector3( size, 0, i ),\n\t\t\t\tnew THREE.Vector3( i, 0, - size ), new THREE.Vector3( i, 0, size ))\n\n\t\t\tvar color = Math.abs(i) < (step / 2) ? this.color1 : this.color2\n\n\t\t\tgeometry.colors.push( color, color, color, color )\n\t\t}\n\n\t\tTHREE.LineSegments.call( this, geometry, lineMaterial )\n\n\t};\n\n\tEditorGridHelper.prototype = Object.create( THREE.LineSegments.prototype )\n\tEditorGridHelper.prototype.constructor = THREE.GridHelper\n\n\tthis.mesh = new EditorGridHelper(10, 1)\n\tthis.mesh.add(new EditorGridHelper(1, 0.1))\n\n\tvar that = this\n\n\tvar fontLoader = new THREE.FontLoader()\n\tfontLoader.load(\"/data/fonts/helvetiker_regular.typeface.js\", function(font) {\n\t\tthat.font = font\n\t\t\n\t\tvar textShapes = font.generateShapes(\"\")\n\t\tvar text1 = new THREE.ShapeGeometry(textShapes)\n\t\tthat.textMesh1 = new THREE.Mesh(text1, new THREE.MeshBasicMaterial({color: that.mesh.color1, fog: false}))\n\t\tthat.textMesh1.scale.set(0.001, 0.001, 0.001)\n\t\tthat.textMesh1.position.set(1, 0, -1)\n\t\tthat.textMesh1.quaternion.setFromEuler(new THREE.Euler(-3.14159/2,0,0))\n\t\tthat.mesh.add(that.textMesh1)\n\n\t\tvar text2 = new THREE.ShapeGeometry(textShapes)\n\t\tthat.textMesh2 = new THREE.Mesh(text2, new THREE.MeshBasicMaterial({color: that.mesh.color1, fog: false}))\n\t\tthat.textMesh2.scale.set(0.002, 0.002, 0.002)\n\t\tthat.textMesh2.position.set(10, 0, -10)\n\t\tthat.textMesh2.quaternion.setFromEuler(new THREE.Euler(-3.14159/2,0,0))\n\t\tthat.mesh.add(that.textMesh2)\n\t})\n\n\tthis.gridScale = 0\n\tthis.scale(1)\n}\n\nWorldEditorOriginGrid.prototype.scale = function(s) {\n\tif (s !== this.gridScale) {\n\t\tif (this.textMesh1) {\n\t\t\tvar textShapes = this.font.generateShapes(s.toString() + \" m\")\n\t\t\tthis.textMesh1.geometry = new THREE.ShapeGeometry(textShapes)\n\t\t}\n\n\t\tif (this.textMesh2) {\n\t\t\ttextShapes = this.font.generateShapes((s * 10).toString() + \" m\")\n\t\t\tthis.textMesh2.geometry = new THREE.ShapeGeometry(textShapes)\n\t\t}\n\n\t\tthis.gridScale = s\n\t\tthis.mesh.scale.set(s, s, s)\n\t}\n}\n\n\n"
  },
  {
    "path": "browser/scripts/worldEditor/worldEditorOrthographicCamera.js",
    "content": "function WorldEditorOrthographicCamera(domElement) {\n\tthis.domElement = domElement\n\n\tthis.camera = new THREE.OrthographicCamera(\n\t\t-1, 1,\n\t\t1, -1,\n\t\t-10000,\n\t\t10000)\n\n\tthis.camera.zoom = 10\n\tthis.aspect = 1\n\n\tthis.camera.layers.enable(1)\n\n\tE2.core.on('resize', this.resize.bind(this))\n}\n\nWorldEditorOrthographicCamera.prototype.resize = function() {\n\tvar isFullscreen = E2.util.isFullscreen()\n\tvar wh = { width: window.innerWidth, height: window.innerHeight }\n\n\tif (!isFullscreen) {\n\t\twh.width = this.domElement.clientWidth\n\t\twh.height = this.domElement.clientHeight\n\n\t\tif (typeof(E2.app.calculateCanvasArea) !== 'undefined')\n\t\t\twh = E2.app.calculateCanvasArea()\n\t}\n\n\tthis.aspect = wh.width / wh.height\n\n\tthis.camera.left = -this.aspect\n\tthis.camera.right = this.aspect\n\tthis.camera.top = 1\n\tthis.camera.bottom = -1\n}\n\nWorldEditorOrthographicCamera.prototype.update = function() {\n\tvar distance = this.camera.position.length()\n\n\tvar zoom = 1 / distance\n\n\tif (this.camera.zoom !== zoom) {\n\t\tthis.camera.zoom = zoom\n\n\t\tthis.camera.updateProjectionMatrix()\n\t}\n}\n"
  },
  {
    "path": "browser/scripts/worldEditor/worldEditorPerspectiveCamera.js",
    "content": "function WorldEditorCamera(domElement) {\n\tthis.domElement = domElement\n\tthis.camera = new THREE.PerspectiveCamera(\n\t\t90,\n\t\tthis.domElement.clientWidth / this.domElement.clientHeight,\n\t\t0.01,\n\t\t10000)\n\n\tthis.camera.position.set(5, 5, 5)\n\tthis.camera.lookAt(new THREE.Vector3(0,0,0))\n\n\t// mono eye only\n\tthis.camera.layers.enable(3)\n\n\tE2.core.on('resize', this.resize.bind(this))\n}\n\nWorldEditorCamera.prototype.resize = function() {\n\tvar isFullscreen = E2.util.isFullscreen()\n\tvar wh = { width: window.innerWidth, height: window.innerHeight }\n\n\tif (!isFullscreen) {\n\t\twh.width = this.domElement.clientWidth\n\t\twh.height = this.domElement.clientHeight\n\n\t\tif (typeof(E2.app.calculateCanvasArea) !== 'undefined')\n\t\t\twh = E2.app.calculateCanvasArea()\n\t}\n\n\tthis.camera.aspect = wh.width / wh.height\n\tthis.camera.updateProjectionMatrix()\n}\n\nWorldEditorCamera.prototype.update = function() {\n\n}"
  },
  {
    "path": "browser/scripts/worldEditor/worldEditorRadialHelper.js",
    "content": "function WorldEditorRadialHelper() {\n\n\tvar EditorGridHelper = function ( first, last, step ) {\n\n\t\tvar size = last\n\n\t\tvar geometry = new THREE.Geometry()\n\t\tvar material =\n\t\t\tnew THREE.LineBasicMaterial(\n\t\t\t\t{ vertexColors: THREE.VertexColors, linewidth: 1, fog: false } )\n\n\t\tthis.color1 = new THREE.Color( 0xBBBBBB )\n\t\tthis.color2 = new THREE.Color( 0x888888 )\n\n\t\tgeometry.vertices.push(\n\t\t\tnew THREE.Vector3( - size, 0, 0 ), new THREE.Vector3( size, 0, 0 ),\n\t\t\tnew THREE.Vector3( 0, 0, - size ), new THREE.Vector3( 0, 0, size ))\n\n\t\tvar color = this.color1\n\n\t\tgeometry.colors.push( color, color, color, color )\n\n\t\tvar segments = 100\n\n\t\tfor ( var j = first; j <= last; j += step ) {\n\t\t\tvar scale = j\n\n\t\t\tfor (var i = 0; i < segments + 1; ++i) {\n\t\t\t\tvar f1 = i / segments\n\t\t\t\tvar f2 = (i + 1) / segments\n\n\t\t\t\tvar x1 = Math.sin(f1 * Math.PI * 2) * scale\n\t\t\t\tvar z1 = Math.cos(f1 * Math.PI * 2) * scale\n\n\t\t\t\tvar x2 = Math.sin(f2 * Math.PI * 2) * scale\n\t\t\t\tvar z2 = Math.cos(f2 * Math.PI * 2) * scale\n\n\t\t\t\tgeometry.vertices.push(\n\t\t\t\tnew THREE.Vector3(x1, 0, z1), new THREE.Vector3(x2, 0, z2))\n\n\t\t\t\tvar color = this.color2\n\n\t\t\t\tgeometry.colors.push(color, color)\n\t\t\t}\n\t\t}\n\n\t\tTHREE.LineSegments.call( this, geometry, material )\n\n\t};\n\n\tEditorGridHelper.prototype = Object.create( THREE.LineSegments.prototype )\n\tEditorGridHelper.prototype.constructor = THREE.GridHelper\n\n\tthis.mesh = new EditorGridHelper(2, 10, 1)\n\tthis.mesh.add(new EditorGridHelper(0.2, 1, 0.1))\n\n\tvar textRadius = [0.2, 0.4, 0.6, 0.8, 1, 2, 4, 6, 8, 10]\n\n\tvar that = this\n\n\tvar fontLoader = new THREE.FontLoader()\n\tfontLoader.load(\"/data/fonts/helvetiker_regular.typeface.js\", function(font) {\n\t\tthat.font = font\n\t\tvar emptyTextShape = font.generateShapes(\"\")\n\n\t\tvar rotateNinetyDegrees = new THREE.Euler(-Math.PI / 2, 0, 0)\n\n\t\tthat.textMeshes = []\n\n\t\tfor (var i = 0; i < textRadius.length; ++i) {\n\t\t\tvar textGeometry = new THREE.ShapeGeometry(emptyTextShape)\n\t\t\tvar textMesh = new THREE.Mesh(textGeometry, new THREE.MeshBasicMaterial({\n\t\t\t\tcolor: that.mesh.color1,\n\t\t\t\tfog: false\n\t\t\t}))\n\n\t\t\tvar scale = textRadius[i] < 1 ? 0.0001 : 0.001\n\n\t\t\ttextMesh.scale.set(scale, scale, scale)\n\t\t\ttextMesh.position.set(textRadius[i], 0, 0)\n\t\t\ttextMesh.quaternion.setFromEuler(rotateNinetyDegrees)\n\t\t\tthat.textMeshes.push({mesh: textMesh, radius: textRadius[i]})\n\t\t\tthat.mesh.add(textMesh)\n\t\t}\n\t})\n\n\tthis.gridScale = 0\n\tthis.scale(1)\n}\n\nWorldEditorRadialHelper.prototype.scale = function(s) {\n\tif (s !== this.gridScale) {\n\t\tif (this.textMeshes) {\n\t\t\tfor (var i = 0; i < this.textMeshes.length; ++i) {\n\t\t\t\tvar rad = this.textMeshes[i].radius * s\n\t\t\t\tvar str = rad < 1.0 ? (Math.round((rad * 100)) + \" cm\") : ((rad) + \" m\")\n\t\t\t\tvar textShape = this.font.generateShapes(str)\n\t\t\t\tthis.textMeshes[i].mesh.geometry = new THREE.ShapeGeometry(textShape)\n\t\t\t}\n\t\t}\n\n\t\tthis.gridScale = s\n\t\tthis.mesh.scale.set(s, s, s)\n\t}\n}\n\nWorldEditorRadialHelper.prototype.position = function(pos) {\n\tthis.mesh.position.x = pos.x\n\tthis.mesh.position.y = 0\n\tthis.mesh.position.z = pos.z\n}\n"
  },
  {
    "path": "browser/scripts/wschannel.js",
    "content": "if (typeof(module) !== 'undefined') {\n\tEventEmitter = require('events').EventEmitter\n}\n\nfunction WebSocketChannel() {\n\tEventEmitter.call(this)\n\tthis._listeners = {}\n\tthis._state = 'disconnected'\n}\n\nWebSocketChannel.prototype = Object.create(EventEmitter.prototype)\n\nWebSocketChannel.prototype.connect = function(wsUrl, options) {\n\tvar that = this\n\n\tif (this._state === 'connected' || this._state === 'connecting')\n\t\treturn\n\n\tthis._state = 'connecting'\n\n\tconsole.log('Connecting WebSocket', wsUrl)\n\n\tthis.ws = new WebSocket(wsUrl, options)\n\n\tthis.ws.onopen = function() {\n\t\tthat._state = 'connected'\n\t\tthat.emit('connected')\n\t}\n\n\tthis.ws.onclose = function() {\n\t\tconsole.warn('WsChannel disconnected')\n\t\tdataLayer.push({\n\t\t\tevent: 'webSocketDisconnected',\n\t\t\turl: wsUrl\n\t\t})\n\t\tthat._state = 'disconnected'\n\t\tthat.emit('disconnected')\n\t}\n\n\tthis.ws.onmessage = function(evt) {\n\t\tvar m = JSON.parse(evt.data)\n\n\t\tif (m.kind === 'READY') {\n\t\t\tthat.uid = m.id\n\t\t\tthat.emit('ready', that.uid)\n\t\t}\n\n\t\tthat.emit('message', m)\n\t\t\n\t\tif (m.channel)\n\t\t\tthat.emit(m.channel, m)\n\t}\n\n\treturn this\n}\n\nWebSocketChannel.prototype.close = function() {\n\tthis.ws.close()\n}\n\nWebSocketChannel.prototype.join = function(channel) {\n\tif (this._state !== 'connected')\n\t\treturn;\n\n\tthis.ws.send(JSON.stringify({ kind: 'join', channel: channel }))\n\treturn this\n}\n\nWebSocketChannel.prototype.leave = function(channel) {\n\tif (this._state !== 'connected')\n\t\treturn;\n\n\tthis.ws.send(JSON.stringify({ kind: 'leave', channel: channel }))\n\n\treturn this\n}\n\nWebSocketChannel.prototype.send = function(channel, data) {\n\tif (this._state !== 'connected')\n\t\treturn;\n\n\tif (typeof(data) !== 'object')\n\t\tdata = { kind: data }\n\n\tdata.channel = channel\n\n\tthis.ws.send(JSON.stringify(data))\n\n\treturn this\n}\n\nif (typeof(module) !== 'undefined')\n\tmodule.exports = WebSocketChannel;\n\n"
  },
  {
    "path": "browser/style/icons/source.css",
    "content": ".icon-img\n{\n\t/*\t/less\n\tdisplay: block;\n\tfloat: left;\n\tposition: relative !important;\n\ttop: 2px !important;\n\tpadding: 0px !important;\n\tmargin: 0px !important;\n\tmargin-right: 2px !important;\n\tbackground-clip: content-box !important;\n\twidth: 16px;\n\theight: 16px;\n\t*/\n}\n.icon-absolute_modulator { background: url('absolute-modulator.png'); }\n.icon-accumulate_modulator { background: url('accumulate-modulator.png'); }\n.icon-action_button { background: url('toggle-button.png'); }\n.icon-add_modulator { background: url('add-modulator.png'); }\n.icon-alpha_modulator { background: url('alpha-modulator.png'); }\n.icon-aspect_ratio_generator { background: url('aspect-ratio-generator.png'); }\n.icon-assets_started_generator { background: url('assets-started-generator.png'); }\n.icon-assets_completed_generator { background: url('assets-completed-generator.png'); }\n.icon-assets_failed_generator { background: url('assets-failed-generator.png'); }\n.icon-assets_signal_started_generator { background: url('assets-started-generator.png'); }\n.icon-assets_signal_completed_generator { background: url('assets-completed-generator.png'); }\n.icon-assets_signal_failed_generator { background: url('assets-failed-generator.png'); }\n.icon-and_modulator { background: url('and-modulator.png'); }\n.icon-annotation { background: url('annotation.png'); }\n.icon-array_generator { background: url('array-generator.png'); }\n.icon-array_to_mesh_modulator { background: url('array-to-mesh-modulator.png'); }\n.icon-array_to_texture_modulator { background: url('array-to-texture-modulator.png'); }\n.icon-array_get_modulator { background: url('array-get-modulator.png'); }\n.icon-array_get_as_modulator { background: url('array-get-modulator.png'); }\n.icon-array_item_to_bool_modulator { background: url('toggle-button.png'); }\n.icon-array_item_to_float_modulator { background: url('const-float-generator.png'); }\n.icon-array_item_to_object_modulator { background: url('member-to-object-modulator.png'); }\n.icon-array_item_to_string_modulator { background: url('text-display.png'); }\n.icon-array_item_to_typed_array_modulator { background: url('array-generator.png'); }\n.icon-array_length_modulator { background: url('array-length-modulator.png'); }\n.icon-array_set_modulator { background: url('array-set-modulator.png'); }\n.icon-array_set_as_modulator { background: url('array-set-modulator.png'); }\n.icon-audio_analyse_modulator { background: url('audio-analyse-modulator.png'); }\n.icon-audio_buffer_source_modulator { background: url('audio-buffer-source-modulator.png'); }\n.icon-audio_gain_modulator { background: url('audio-gain-modulator.png'); }\n.icon-audio_get_current_time_modulator { background: url('clock-generator.png'); }\n.icon-audio_get_duration_modulator { background: url('audio-get-duration-modulator.png'); }\n.icon-audio_player { background: url('audio-player.png'); }\n.icon-audio_source_player { background: url('audio-player.png'); }\n.icon-blend_mode_generator { background: url('color-blend-modulator.png'); }\n.icon-bool_display { background: url('bool-display.png'); }\n.icon-ceiling_modulator { background: url('ceiling-modulator.png'); }\n.icon-clamp_modulator { background: url('clamp-modulator.png'); }\n.icon-clamped_accumulate_modulator { background: url('clamped-accumulate-modulator.png'); }\n.icon-clock_generator { background: url('clock-generator.png'); }\n.icon-crypto_cw_get_balances { background: url('counterparty.png'); }\n.icon-crypto_dw_get_balances { background: url('dogeparty.png'); }\n.icon-color_add_modulator { background: url('color-add-modulator.png'); }\n.icon-color_blend_modulator { background: url('color-blend-modulator.png'); }\n.icon-color_display { background: url('color-display.png'); }\n.icon-color_multiply_modulator { background: url('color-multiply-modulator.png'); }\n.icon-color_picker { background: url('color-picker.png'); }\n.icon-concatenate_matrix_modulator { background: url('concatenate-matrix-modulator.png'); }\n.icon-const_float_generator { background: url('const-float-generator.png'); }\n.icon-const_text_generator { background: url('text-display.png'); }\n.icon-label_generator { background: url('text-display.png'); }\n.icon-text_editor_generator { background: url('text-display.png'); }\n.icon-convert_bool_float_modulator { background: url('convert-generic.png'); }\n.icon-convert_camera_matrices { background: url('convert-generic.png'); }\n.icon-convert_color_rgb_modulator { background: url('convert-generic.png'); }\n.icon-convert_hsl_color_modulator { background: url('convert-generic.png'); }\n.icon-convert_color_hsl_modulator { background: url('convert-generic.png'); }\n.icon-convert_matrices_camera { background: url('convert-generic.png'); }\n.icon-convert_oscilator_unit_modulator { background: url('convert-generic.png'); }\n.icon-convert_rgb_color_modulator { background: url('convert-generic.png'); }\n.icon-convert_float_bool_modulator { background: url('convert-generic.png'); }\n.icon-convert_vector_xyz_modulator { background: url('convert-generic.png'); }\n.icon-convert_string_float_modulator { background: url('float-display.png'); }\n.icon-cosine_modulator { background: url('cosine-modulator.png'); }\n.icon-cos_modulator { background: url('cosine-modulator.png'); }\n.icon-cube_mesh_generator { background: url('cube-mesh-generator.png'); }\n.icon-curve_interpolate_modulator { background: url('cubic-interpolate.png'); }\n.icon-data_info_display { background: url('none.png'); }\n.icon-delta_modulator { background: url('delta-modulator.png'); }\n.icon-delta_t_generator { background: url('delta-t-generator.png'); } \t\n.icon-depth_func_generator { background: url('material-z-buffer-modulator.png'); } \t\n.icon-divide_modulator { background: url('divide-modulator.png'); }\n.icon-equals_modulator { background: url('equals-modulator.png'); }\n.icon-exp_modulator { background: url('exp-modulator.png'); }\n.icon-flat_shader { background: url('shader.png'); }\n.icon-float_display { background: url('float-display.png'); }\n.icon-floor_modulator { background: url('floor-modulator.png'); }\n.icon-format_string_float { background: url('float-display.png'); }\n.icon-from_mesh_shader { background: url('shader.png'); }\n.icon-from_mesh_custom_shader { background: url('shader.png'); }\n.icon-graph { background: url('graph.png'); }\n.icon-grid_mesh_generator { background: url('grid-mesh-generator.png'); }\n.icon-if_modulator { background: url('if-modulator.png'); }\n.icon-if_else_modulator { background: url('if-else-modulator.png'); }\n.icon-initialise_generator { background: url('initialise-generator.png'); }\n.icon-input_proxy { background: url('input-proxy.png'); }\n.icon-instance_array_modulator { background: url('instance-array-modulator.png'); }\n.icon-instance_cube_modulator { background: url('instance-cube-modulator.png'); }\n.icon-instance_ifs_modulator { background: url('instance-ifs-modulator.png'); }\n.icon-invert_matrix_modulator { background: url('invert-matrix-modulator.png'); }\n.icon-key_press_generator { background: url('key-press-generator.png'); }\n.icon-knob_float_generator { background: url('knob-float-generator.png'); }\n.icon-led_display { background: url('led-display.png'); }\n.icon-less_than_modulator { background: url('less-than-modulator.png'); }\n.icon-light_clone_modulator { background: url('clone-modulator.png'); }\n.icon-light_diffuse_color_modulator { background: url('light-diffuse-color-modulator.png'); }\n.icon-light_direction_modulator { background: url('light-direction-modulator.png'); }\n.icon-light_intensity_modulator { background: url('light-intensity-modulator.png'); }\n.icon-light_position_modulator { background: url('light-position-modulator.png'); }\n.icon-light_specular_color_modulator { background: url('light-specular-color-modulator.png'); }\n.icon-light_type_generator { background: url('light-type-generator.png'); }\n.icon-light_type_modulator { background: url('light-type-generator.png'); }\n.icon-log_display { background: url('text-display.png'); }\n.icon-log_modulator { background: url('log-modulator.png'); }\n.icon-loop { background: url('rotation-xyz-matrix.png'); }\n.icon-lowpass_filter_modulator { background: url('lowpass-filter-modulator.png'); }\n.icon-material_alpha_clip_modulator { background: url('material-alpha-clip-modulator.png'); }\n.icon-material_ambient_color_modulator { background: url('material-ambient-color-modulator.png'); }\n.icon-material_blend_mode_modulator { background: url('color-blend-modulator.png'); }\n.icon-material_clone_modulator { background: url('clone-modulator.png'); }\n.icon-material_diffuse_color_modulator { background: url('material-diffuse-color-modulator.png'); }\n.icon-material_double_sided_modulator { background: url('material-double-sided-modulator.png'); }\n.icon-material_light_modulator { background: url('material-light-modulator.png'); }\n.icon-material_shinyness_modulator { background: url('material-shinyness-modulator.png'); }\n.icon-material_texture_modulator { background: url('texture-type-generator.png'); }\n.icon-material_z_buffer_modulator { background: url('material-z-buffer-modulator.png'); }\n.icon-matrix_display { background: url('matrix-display.png'); }\n.icon-matrix_clone_modulator { background: url('clone-modulator.png'); }\n.icon-member_array_length_modulator { background: url('array-length-modulator.png'); }\n.icon-member_to_bool_modulator { background: url('toggle-button.png'); }\n.icon-member_to_float_modulator { background: url('const-float-generator.png'); }\n.icon-member_to_object_modulator { background: url('member-to-object-modulator.png'); }\n.icon-member_to_string_modulator { background: url('text-display.png'); }\n.icon-member_to_typed_array_modulator { background: url('array-generator.png'); }\n.icon-get_matrix_modulator { background: url('array-get-modulator.png'); }\n.icon-set_matrix_modulator { background: url('array-set-modulator.png'); }\n.icon-max_modulator { background: url('max-modulator.png'); }\n.icon-mesh_primtype_generator { background: url('mesh-primtype-generator.png'); }\n.icon-mesh_primtype_modulator { background: url('mesh-primtype-generator.png'); }\n.icon-mesh_renderer_emitter { background: url('mesh-renderer-emitter.png'); }\n.icon-min_modulator { background: url('min-modulator.png'); }\n.icon-modulate_modulator { background: url('modulate-modulator.png'); }\n.icon-module_player { background: url('module-player.png'); }\n.icon-more_than_modulator { background: url('more-than-modulator.png'); }\n.icon-mouse_button_generator { background: url('mouse-button-generator.png'); }\n.icon-mouse_position_generator { background: url('mouse-position-generator.png'); }\n.icon-mouse_wheel_generator { background: url('mouse-wheel-generator.png'); }\n.icon-multiply_modulator { background: url('multiply-modulator.png'); }\n.icon-nand_modulator { background: url('nand-modulator.png'); }\n.icon-negate_modulator { background: url('negate-modulator.png'); }\n.icon-normal_as_color_shader { background: url('shader.png'); }\n.icon-not_modulator { background: url('not-modulator.png'); }\n.icon-null_mesh_generator { background: url('null-mesh-generator.png'); }\n.icon-object_display { background: url('less-than-modulator.png'); }\n.icon-or_modulator { background: url('or-modulator.png'); }\n.icon-orthographic_camera { background: url('orthographic-camera.png'); }\n.icon-osc_float { background: url('const-float-generator.png'); }\n.icon-osc_xy_float { background: url('const-float-generator.png'); }\n.icon-osc_receiver { background: url('url-json-generator.png'); }\n.icon-output_proxy { background: url('output-proxy.png'); }\n.icon-perspective_camera { background: url('perspective-camera.png'); }\n.icon-pi_generator { background: url('pi-generator.png'); }\n.icon-planar_projection_matrix { background: url('planar-projection-matrix.png'); }\n.icon-plane_mesh_generator { background: url('plane-mesh-generator.png'); }\n.icon-plot_display { background: url('plot-display.png'); }\n.icon-quad_mesh_generator { background: url('quad-mesh-generator.png'); }\n.icon-random_float_generator { background: url('random-float-generator.png'); }\n.icon-record_framebuffer { background: url('record-framebuffer.png'); }\n.icon-register_global_read { background: url('input-proxy.png'); }\n.icon-register_global_write { background: url('output-proxy.png'); }\n.icon-register_local_read { background: url('input-proxy.png'); }\n.icon-register_local_write { background: url('output-proxy.png'); }\n.icon-reset_framebuffer_recorder { background: url('record-framebuffer.png'); }\n.icon-rotation_matrix { background: url('rotation-matrix.png'); }\n.icon-rotation_xyz_matrix { background: url('rotation-xyz-matrix.png'); }\n.icon-round_modulator { background: url('round-modulator.png'); }\n.icon-sample_and_hold_modulator { background: url('sample-and-hold-modulator.png'); }\n.icon-sawtooth_modulator { background: url('sawtooth-modulator.png'); }\n.icon-scale_matrix { background: url('scale-matrix.png'); }\n.icon-scale_xyz_matrix { background: url('scale-matrix.png'); }\n.icon-scene_get_bounding_box { background: url('scene-get-bounding-box.png'); }\n.icon-scene_get_mesh_by_index { background: url('scene-get-mesh-by-index.png'); }\n.icon-scene_get_mesh_count { background: url('scene-get-mesh-count.png'); }\n.icon-scene_renderer_emitter { background: url('scene-renderer-emitter.png'); }\n.icon-screenspace_camera { background: url('screenspace-camera.png'); }\n.icon-sine_modulator { background: url('sine-modulator.png'); }\n.icon-sin_modulator { background: url('sine-modulator.png'); }\n.icon-slider_float_generator { background: url('slider-float-generator.png'); }\n.icon-sphere_mesh_generator { background: url('sphere-mesh-generator.png'); }\n.icon-sqrt_modulator { background: url('sqrt-modulator.png'); }\n.icon-square_modulator { background: url('square-modulator.png'); }\n.icon-stop_emitter { background: url('stop-emitter.png'); }\n.icon-string_concatenate_modulator { background: url('string-concatenate-modulator.png'); }\n.icon-parse_json_modulator { background: url('parse-json-modulator.png'); }\n.icon-subtract_modulator { background: url('subtract-modulator.png'); }\n.icon-switch_modulator { background: url('switch-modulator.png'); }\n.icon-tan_modulator { background: url('tan-modulator.png'); }\n.icon-text_display { background: url('text-display.png'); }\n.icon-texture_diffuse_shader { background: url('shader.png'); }\n.icon-texture_filter_generator { background: url('texture-filter-generator.png'); }\n.icon-texture_filter_modulator { background: url('texture-filter-generator.png'); }\n.icon-texture_from_text_generator { background: url('text-display.png'); }\n.icon-texture_height_modulator { background: url('viewport-height-generator.png'); }\n.icon-texture_type_generator { background: url('texture-type-generator.png'); }\n.icon-texture_width_modulator { background: url('viewport-width-generator.png'); }\n.icon-texture_wrap_generator { background: url('texture-wrap-generator.png'); }\n.icon-texture_wrap_modulator { background: url('texture-wrap-generator.png'); }\n.icon-toggle_button { background: url('toggle-button.png'); }\n.icon-toggle_modulator { background: url('toggle-modulator.png'); }\n.icon-translation_matrix { background: url('translation-matrix.png'); }\n.icon-translation_xyz_matrix { background: url('translation-matrix.png'); }\n.icon-transpose_matrix_modulator { background: url('transpose-matrix-modulator.png'); }\n.icon-triangle_modulator { background: url('triangle-modulator.png'); }\n.icon-tween_in_modulator { background: url('tween-in-modulator.png'); }\n.icon-tween_out_modulator { background: url('tween-out-modulator.png'); }\n.icon-url_audio_generator { background: url('url-audio-generator.png'); }\n.icon-url_audio_buffer_generator { background: url('url-audio-generator.png'); }\n.icon-url_json_generator { background: url('url-json-generator.png'); }\n.icon-url_scene_generator { background: url('url-scene-generator.png'); }\n.icon-url_texture_generator { background: url('url-texture-generator.png'); }\n.icon-url_video_generator { background: url('record-framebuffer.png'); }\n.icon-vector_add { background: url('vector-add.png'); }\n.icon-vector_cross { background: url('vector-cross.png'); }\n.icon-vector_dot { background: url('vector-dot.png'); }\n.icon-vector_display { background: url('vector-display.png'); }\n.icon-vector_magnitude { background: url('vector-magnitude.png'); }\n.icon-vector_multiply { background: url('vector-multiply.png'); }\n.icon-vector_normalize { background: url('vector-normalize.png'); }\n.icon-vector { background: url('convert-generic.png'); }\n.icon-vector_scale { background: url('vector-scale.png'); }\n.icon-vector_to_screenspace { background: url('vector-to-screenspace.png'); }\n.icon-vector_transform { background: url('vector-transform.png'); }\n.icon-video_get_current_time_modulator { background: url('clock-generator.png'); }\n.icon-video_get_duration_modulator { background: url('audio-get-duration-modulator.png'); }\n.icon-video_player { background: url('record-framebuffer.png'); }\n.icon-viewport_width_generator { background: url('viewport-width-generator.png'); }\n.icon-viewport_height_generator { background: url('viewport-height-generator.png'); }\n.icon-vr_camera_modulator { background: url('vr.png'); }\n.icon-vr_hmd_info_generator { background: url('vr.png'); }\n.icon-vr_velocity_generator { background: url('vr.png'); }\n.icon-vr_camera_info_generator { background: url('vr.png'); }\n.icon-vr_sensor_info_generator { background: url('vr.png'); }\n.icon-vr_acceleration_generator { background: url('vr.png'); }\n.icon-vr_hmd_available_generator { background: url('vr.png'); }\n.icon-vr_sensor_available_generator { background: url('vr.png'); }\n.icon-xor_modulator { background: url('xor-modulator.png'); }\n\n\n/* Groups */\n.icon-group { background: url('group.png'); }\n"
  },
  {
    "path": "browser/style/icons/style.css",
    "content": ".icon-img\n{\n\tdisplay: block;\n\tfloat: left;\n\tposition: relative !important;\n\ttop: 2px !important;\n\tpadding: 0px !important;\n\tmargin: 0px !important;\n\tmargin-right: 2px !important;\n\twidth: 15px !important;\n\theight: 15px !important;\n\tbackground-clip: content-box !important;\n}\n\n.icon-absolute_modulator { background: url('icons.png') -153px -17px no-repeat; }\n.icon-accumulate_modulator { background: url('icons.png') -153px -51px no-repeat; }\n.icon-action_button { background: url('icons.png') -51px -136px no-repeat; }\n.icon-add_modulator { background: url('icons.png') -68px -34px no-repeat; }\n.icon-alpha_modulator { background: url('icons.png') -102px -204px no-repeat; }\n.icon-and_modulator { background: url('icons.png') -119px -85px no-repeat; }\n.icon-annotation { background: url('icons.png') -85px -68px no-repeat; }\n.icon-array_generator { background: url('icons.png') -51px 0px no-repeat; }\n.icon-array_get_as_modulator { background: url('icons.png') -136px -102px no-repeat; }\n.icon-array_get_modulator { background: url('icons.png') -136px -102px no-repeat; }\n.icon-array_item_to_bool_modulator { background: url('icons.png') -51px -136px no-repeat; }\n.icon-array_item_to_float_modulator { background: url('icons.png') -187px -68px no-repeat; }\n.icon-array_item_to_object_modulator { background: url('icons.png') -187px 0px no-repeat; }\n.icon-array_item_to_string_modulator { background: url('icons.png') -136px -34px no-repeat; }\n.icon-array_item_to_typed_array_modulator { background: url('icons.png') -51px 0px no-repeat; }\n.icon-array_length_modulator { background: url('icons.png') -187px -153px no-repeat; }\n.icon-array_set_as_modulator { background: url('icons.png') -34px -170px no-repeat; }\n.icon-array_set_modulator { background: url('icons.png') -34px -170px no-repeat; }\n.icon-array_to_mesh_modulator { background: url('icons.png') -119px 0px no-repeat; }\n.icon-array_to_texture_modulator { background: url('icons.png') -136px -136px no-repeat; }\n.icon-aspect_ratio_generator { background: url('icons.png') -34px -102px no-repeat; }\n.icon-assets_completed_generator { background: url('icons.png') -170px -119px no-repeat; }\n.icon-assets_failed_generator { background: url('icons.png') -85px -187px no-repeat; }\n.icon-assets_signal_completed_generator { background: url('icons.png') -170px -119px no-repeat; }\n.icon-assets_signal_failed_generator { background: url('icons.png') -85px -187px no-repeat; }\n.icon-assets_signal_started_generator { background: url('icons.png') -68px -204px no-repeat; }\n.icon-assets_started_generator { background: url('icons.png') -68px -204px no-repeat; }\n.icon-audio_analyse_modulator { background: url('icons.png') -102px -153px no-repeat; }\n.icon-audio_buffer_source_modulator { background: url('icons.png') -51px -170px no-repeat; }\n.icon-audio_gain_modulator { background: url('icons.png') -204px -119px no-repeat; }\n.icon-audio_get_current_time_modulator { background: url('icons.png') -170px -136px no-repeat; }\n.icon-audio_get_duration_modulator { background: url('icons.png') -170px -17px no-repeat; }\n.icon-audio_player { background: url('icons.png') 0px -17px no-repeat; }\n.icon-audio_source_player { background: url('icons.png') 0px -17px no-repeat; }\n.icon-blend_mode_generator { background: url('icons.png') -204px 0px no-repeat; }\n.icon-bool_display { background: url('icons.png') -51px -102px no-repeat; }\n.icon-ceiling_modulator { background: url('icons.png') -153px -85px no-repeat; }\n.icon-clamp_modulator { background: url('icons.png') -51px -153px no-repeat; }\n.icon-clamped_accumulate_modulator { background: url('icons.png') -85px -85px no-repeat; }\n.icon-clock_generator { background: url('icons.png') -170px -136px no-repeat; }\n.icon-color_add_modulator { background: url('icons.png') -153px -187px no-repeat; }\n.icon-color_blend_modulator { background: url('icons.png') -204px 0px no-repeat; }\n.icon-color_display { background: url('icons.png') -51px -204px no-repeat; }\n.icon-color_multiply_modulator { background: url('icons.png') -85px 0px no-repeat; }\n.icon-color_picker { background: url('icons.png') -102px -119px no-repeat; }\n.icon-concatenate_matrix_modulator { background: url('icons.png') -51px -85px no-repeat; }\n.icon-const_float_generator { background: url('icons.png') -187px -68px no-repeat; }\n.icon-const_text_generator { background: url('icons.png') -136px -34px no-repeat; }\n.icon-convert_bool_float_modulator { background: url('icons.png') -170px -34px no-repeat; }\n.icon-convert_camera_matrices { background: url('icons.png') -170px -34px no-repeat; }\n.icon-convert_color_hsl_modulator { background: url('icons.png') -170px -34px no-repeat; }\n.icon-convert_color_rgb_modulator { background: url('icons.png') -170px -34px no-repeat; }\n.icon-convert_float_bool_modulator { background: url('icons.png') -170px -34px no-repeat; }\n.icon-convert_hsl_color_modulator { background: url('icons.png') -170px -34px no-repeat; }\n.icon-convert_matrices_camera { background: url('icons.png') -170px -34px no-repeat; }\n.icon-convert_oscilator_unit_modulator { background: url('icons.png') -170px -34px no-repeat; }\n.icon-convert_rgb_color_modulator { background: url('icons.png') -170px -34px no-repeat; }\n.icon-convert_string_float_modulator { background: url('icons.png') -51px -51px no-repeat; }\n.icon-convert_vector_xyz_modulator { background: url('icons.png') -170px -34px no-repeat; }\n.icon-cos_modulator { background: url('icons.png') -68px 0px no-repeat; }\n.icon-cosine_modulator { background: url('icons.png') -68px 0px no-repeat; }\n.icon-crypto_cw_get_balances { background: url('icons.png') 0px -34px no-repeat; }\n.icon-crypto_dw_get_balances { background: url('icons.png') -102px -34px no-repeat; }\n.icon-cube_mesh_generator { background: url('icons.png') -51px -34px no-repeat; }\n.icon-curve_interpolate_modulator { background: url('icons.png') 0px -68px no-repeat; }\n.icon-data_info_display { background: url('icons.png') -68px -68px no-repeat; }\n.icon-delta_modulator { background: url('icons.png') -119px -136px no-repeat; }\n.icon-delta_t_generator { background: url('icons.png') -34px -153px no-repeat; }\n.icon-depth_func_generator { background: url('icons.png') -34px -51px no-repeat; }\n.icon-divide_modulator { background: url('icons.png') -170px 0px no-repeat; }\n.icon-equals_modulator { background: url('icons.png') -51px -187px no-repeat; }\n.icon-exp_modulator { background: url('icons.png') -204px -68px no-repeat; }\n.icon-flat_shader { background: url('icons.png') -34px 0px no-repeat; }\n.icon-float_display { background: url('icons.png') -51px -51px no-repeat; }\n.icon-floor_modulator { background: url('icons.png') -85px -170px no-repeat; }\n.icon-format_string_float { background: url('icons.png') -51px -51px no-repeat; }\n.icon-from_mesh_custom_shader { background: url('icons.png') -34px 0px no-repeat; }\n.icon-from_mesh_shader { background: url('icons.png') -34px 0px no-repeat; }\n.icon-get_matrix_modulator { background: url('icons.png') -136px -102px no-repeat; }\n.icon-graph { background: url('icons.png') -51px -68px no-repeat; }\n.icon-grid_mesh_generator { background: url('icons.png') 0px -119px no-repeat; }\n.icon-group { background: url('icons.png') -34px -187px no-repeat; }\n.icon-if_else_modulator { background: url('icons.png') -17px -136px no-repeat; }\n.icon-if_modulator { background: url('icons.png') -85px -102px no-repeat; }\n.icon-initialise_generator { background: url('icons.png') -34px -17px no-repeat; }\n.icon-input_proxy { background: url('icons.png') -68px -170px no-repeat; }\n.icon-instance_array_modulator { background: url('icons.png') 0px -136px no-repeat; }\n.icon-instance_cube_modulator { background: url('icons.png') -136px -153px no-repeat; }\n.icon-instance_ifs_modulator { background: url('icons.png') -17px -68px no-repeat; }\n.icon-invert_matrix_modulator { background: url('icons.png') -85px -136px no-repeat; }\n.icon-key_press_generator { background: url('icons.png') -153px -170px no-repeat; }\n.icon-knob_float_generator { background: url('icons.png') -153px -34px no-repeat; }\n.icon-label_generator { background: url('icons.png') -136px -34px no-repeat; }\n.icon-led_display { background: url('icons.png') -153px -136px no-repeat; }\n.icon-less_than_modulator { background: url('icons.png') -85px -204px no-repeat; }\n.icon-light_clone_modulator { background: url('icons.png') -102px -51px no-repeat; }\n.icon-light_diffuse_color_modulator { background: url('icons.png') -17px -187px no-repeat; }\n.icon-light_direction_modulator { background: url('icons.png') -102px -68px no-repeat; }\n.icon-light_intensity_modulator { background: url('icons.png') -17px -85px no-repeat; }\n.icon-light_position_modulator { background: url('icons.png') -187px -17px no-repeat; }\n.icon-light_specular_color_modulator { background: url('icons.png') -34px -136px no-repeat; }\n.icon-light_type_generator { background: url('icons.png') -68px -187px no-repeat; }\n.icon-light_type_modulator { background: url('icons.png') -68px -187px no-repeat; }\n.icon-log_display { background: url('icons.png') -136px -34px no-repeat; }\n.icon-log_modulator { background: url('icons.png') -68px -102px no-repeat; }\n.icon-loop { background: url('icons.png') -102px -187px no-repeat; }\n.icon-lowpass_filter_modulator { background: url('icons.png') -119px -51px no-repeat; }\n.icon-material_alpha_clip_modulator { background: url('icons.png') -187px -102px no-repeat; }\n.icon-material_ambient_color_modulator { background: url('icons.png') -17px -153px no-repeat; }\n.icon-material_blend_mode_modulator { background: url('icons.png') -204px 0px no-repeat; }\n.icon-material_clone_modulator { background: url('icons.png') -102px -51px no-repeat; }\n.icon-material_diffuse_color_modulator { background: url('icons.png') -170px -102px no-repeat; }\n.icon-material_double_sided_modulator { background: url('icons.png') -51px -17px no-repeat; }\n.icon-material_light_modulator { background: url('icons.png') -17px -17px no-repeat; }\n.icon-material_shinyness_modulator { background: url('icons.png') -204px -34px no-repeat; }\n.icon-material_texture_modulator { background: url('icons.png') -153px -119px no-repeat; }\n.icon-material_z_buffer_modulator { background: url('icons.png') -34px -51px no-repeat; }\n.icon-matrix_clone_modulator { background: url('icons.png') -102px -51px no-repeat; }\n.icon-matrix_display { background: url('icons.png') -102px -136px no-repeat; }\n.icon-max_modulator { background: url('icons.png') -136px -170px no-repeat; }\n.icon-member_array_length_modulator { background: url('icons.png') -187px -153px no-repeat; }\n.icon-member_to_bool_modulator { background: url('icons.png') -51px -136px no-repeat; }\n.icon-member_to_float_modulator { background: url('icons.png') -187px -68px no-repeat; }\n.icon-member_to_object_modulator { background: url('icons.png') -187px 0px no-repeat; }\n.icon-member_to_string_modulator { background: url('icons.png') -136px -34px no-repeat; }\n.icon-member_to_typed_array_modulator { background: url('icons.png') -51px 0px no-repeat; }\n.icon-mesh_primtype_generator { background: url('icons.png') 0px -170px no-repeat; }\n.icon-mesh_primtype_modulator { background: url('icons.png') 0px -170px no-repeat; }\n.icon-mesh_renderer_emitter { background: url('icons.png') -68px -136px no-repeat; }\n.icon-min_modulator { background: url('icons.png') -34px -34px no-repeat; }\n.icon-modulate_modulator { background: url('icons.png') -102px -170px no-repeat; }\n.icon-module_player { background: url('icons.png') 0px 0px no-repeat; }\n.icon-more_than_modulator { background: url('icons.png') -187px -51px no-repeat; }\n.icon-mouse_button_generator { background: url('icons.png') -204px -51px no-repeat; }\n.icon-mouse_position_generator { background: url('icons.png') -204px -85px no-repeat; }\n.icon-mouse_wheel_generator { background: url('icons.png') -136px -119px no-repeat; }\n.icon-multiply_modulator { background: url('icons.png') -153px -68px no-repeat; }\n.icon-nand_modulator { background: url('icons.png') -85px -51px no-repeat; }\n.icon-negate_modulator { background: url('icons.png') -17px 0px no-repeat; }\n.icon-normal_as_color_shader { background: url('icons.png') -34px 0px no-repeat; }\n.icon-not_modulator { background: url('icons.png') -68px -119px no-repeat; }\n.icon-null_mesh_generator { background: url('icons.png') -170px -85px no-repeat; }\n.icon-object_display { background: url('icons.png') -85px -204px no-repeat; }\n.icon-or_modulator { background: url('icons.png') -136px -51px no-repeat; }\n.icon-orthographic_camera { background: url('icons.png') -204px -17px no-repeat; }\n.icon-osc_float { background: url('icons.png') -187px -68px no-repeat; }\n.icon-osc_receiver { background: url('icons.png') -34px -119px no-repeat; }\n.icon-osc_xy_float { background: url('icons.png') -187px -68px no-repeat; }\n.icon-output_proxy { background: url('icons.png') -153px -153px no-repeat; }\n.icon-parse_json_modulator { background: url('icons.png') -204px -102px no-repeat; }\n.icon-perspective_camera { background: url('icons.png') -17px -204px no-repeat; }\n.icon-pi_generator { background: url('icons.png') -204px -153px no-repeat; }\n.icon-planar_projection_matrix { background: url('icons.png') -119px -68px no-repeat; }\n.icon-plane_mesh_generator { background: url('icons.png') -187px -85px no-repeat; }\n.icon-plot_display { background: url('icons.png') -85px -119px no-repeat; }\n.icon-quad_mesh_generator { background: url('icons.png') -102px 0px no-repeat; }\n.icon-random_float_generator { background: url('icons.png') -170px -68px no-repeat; }\n.icon-record_framebuffer { background: url('icons.png') -136px -85px no-repeat; }\n.icon-register_global_read { background: url('icons.png') -68px -170px no-repeat; }\n.icon-register_global_write { background: url('icons.png') -153px -153px no-repeat; }\n.icon-register_local_read { background: url('icons.png') -68px -170px no-repeat; }\n.icon-register_local_write { background: url('icons.png') -153px -153px no-repeat; }\n.icon-reset_framebuffer_recorder { background: url('icons.png') -136px -85px no-repeat; }\n.icon-rotation_matrix { background: url('icons.png') -102px -17px no-repeat; }\n.icon-rotation_xyz_matrix { background: url('icons.png') -102px -187px no-repeat; }\n.icon-round_modulator { background: url('icons.png') -34px -85px no-repeat; }\n.icon-sample_and_hold_modulator { background: url('icons.png') -136px -17px no-repeat; }\n.icon-sawtooth_modulator { background: url('icons.png') -17px -170px no-repeat; }\n.icon-scale_matrix { background: url('icons.png') -51px -119px no-repeat; }\n.icon-scale_xyz_matrix { background: url('icons.png') -51px -119px no-repeat; }\n.icon-scene_get_bounding_box { background: url('icons.png') -187px -34px no-repeat; }\n.icon-scene_get_mesh_by_index { background: url('icons.png') -170px -153px no-repeat; }\n.icon-scene_get_mesh_count { background: url('icons.png') -17px -119px no-repeat; }\n.icon-scene_renderer_emitter { background: url('icons.png') -68px -17px no-repeat; }\n.icon-screenspace_camera { background: url('icons.png') -34px -204px no-repeat; }\n.icon-set_matrix_modulator { background: url('icons.png') -34px -170px no-repeat; }\n.icon-sin_modulator { background: url('icons.png') -136px 0px no-repeat; }\n.icon-sine_modulator { background: url('icons.png') -136px 0px no-repeat; }\n.icon-slider_float_generator { background: url('icons.png') -68px -85px no-repeat; }\n.icon-sphere_mesh_generator { background: url('icons.png') 0px -51px no-repeat; }\n.icon-sqrt_modulator { background: url('icons.png') 0px -204px no-repeat; }\n.icon-square_modulator { background: url('icons.png') -17px -34px no-repeat; }\n.icon-stop_emitter { background: url('icons.png') -136px -187px no-repeat; }\n.icon-string_concatenate_modulator { background: url('icons.png') -119px -153px no-repeat; }\n.icon-subtract_modulator { background: url('icons.png') -102px -85px no-repeat; }\n.icon-switch_modulator { background: url('icons.png') 0px -102px no-repeat; }\n.icon-tan_modulator { background: url('icons.png') -170px -51px no-repeat; }\n.icon-text_display { background: url('icons.png') -136px -34px no-repeat; }\n.icon-text_editor_generator { background: url('icons.png') -136px -34px no-repeat; }\n.icon-texture_diffuse_shader { background: url('icons.png') -34px 0px no-repeat; }\n.icon-texture_filter_generator { background: url('icons.png') -153px 0px no-repeat; }\n.icon-texture_filter_modulator { background: url('icons.png') -153px 0px no-repeat; }\n.icon-texture_from_text_generator { background: url('icons.png') -136px -34px no-repeat; }\n.icon-texture_height_modulator { background: url('icons.png') -102px -102px no-repeat; }\n.icon-texture_type_generator { background: url('icons.png') -153px -119px no-repeat; }\n.icon-texture_width_modulator { background: url('icons.png') 0px -187px no-repeat; }\n.icon-texture_wrap_generator { background: url('icons.png') -119px -187px no-repeat; }\n.icon-texture_wrap_modulator { background: url('icons.png') -119px -187px no-repeat; }\n.icon-toggle_button { background: url('icons.png') -51px -136px no-repeat; }\n.icon-toggle_modulator { background: url('icons.png') -153px -102px no-repeat; }\n.icon-translation_matrix { background: url('icons.png') -119px -204px no-repeat; }\n.icon-translation_xyz_matrix { background: url('icons.png') -119px -204px no-repeat; }\n.icon-transpose_matrix_modulator { background: url('icons.png') -85px -17px no-repeat; }\n.icon-triangle_modulator { background: url('icons.png') -119px -170px no-repeat; }\n.icon-tween_in_modulator { background: url('icons.png') -204px -136px no-repeat; }\n.icon-tween_out_modulator { background: url('icons.png') -34px -68px no-repeat; }\n.icon-url_audio_buffer_generator { background: url('icons.png') -17px -51px no-repeat; }\n.icon-url_audio_generator { background: url('icons.png') -17px -51px no-repeat; }\n.icon-url_json_generator { background: url('icons.png') -34px -119px no-repeat; }\n.icon-url_scene_generator { background: url('icons.png') -187px -136px no-repeat; }\n.icon-url_texture_generator { background: url('icons.png') 0px -153px no-repeat; }\n.icon-url_video_generator { background: url('icons.png') -136px -85px no-repeat; }\n.icon-vector { background: url('icons.png') -170px -34px no-repeat; }\n.icon-vector_add { background: url('icons.png') -136px -204px no-repeat; }\n.icon-vector_cross { background: url('icons.png') 0px -85px no-repeat; }\n.icon-vector_display { background: url('icons.png') -85px -153px no-repeat; }\n.icon-vector_dot { background: url('icons.png') -119px -34px no-repeat; }\n.icon-vector_magnitude { background: url('icons.png') -85px -34px no-repeat; }\n.icon-vector_multiply { background: url('icons.png') -17px -102px no-repeat; }\n.icon-vector_normalize { background: url('icons.png') -119px -102px no-repeat; }\n.icon-vector_scale { background: url('icons.png') -68px -153px no-repeat; }\n.icon-vector_to_screenspace { background: url('icons.png') -136px -68px no-repeat; }\n.icon-vector_transform { background: url('icons.png') -187px -119px no-repeat; }\n.icon-video_get_current_time_modulator { background: url('icons.png') -170px -136px no-repeat; }\n.icon-video_get_duration_modulator { background: url('icons.png') -170px -17px no-repeat; }\n.icon-video_player { background: url('icons.png') -136px -85px no-repeat; }\n.icon-viewport_height_generator { background: url('icons.png') -102px -102px no-repeat; }\n.icon-viewport_width_generator { background: url('icons.png') 0px -187px no-repeat; }\n.icon-vr_acceleration_generator { background: url('icons.png') -119px -17px no-repeat; }\n.icon-vr_camera_info_generator { background: url('icons.png') -119px -17px no-repeat; }\n.icon-vr_camera_modulator { background: url('icons.png') -119px -17px no-repeat; }\n.icon-vr_hmd_available_generator { background: url('icons.png') -119px -17px no-repeat; }\n.icon-vr_hmd_info_generator { background: url('icons.png') -119px -17px no-repeat; }\n.icon-vr_sensor_available_generator { background: url('icons.png') -119px -17px no-repeat; }\n.icon-vr_sensor_info_generator { background: url('icons.png') -119px -17px no-repeat; }\n.icon-vr_velocity_generator { background: url('icons.png') -119px -17px no-repeat; }\n.icon-xor_modulator { background: url('icons.png') -119px -119px no-repeat; }\n"
  },
  {
    "path": "browser/test/fixtures/357-color-convert-plugins.json",
    "content": "{\"abs_t\":14.258,\"active_graph\":\"root\",\"graph_uid\":\"xcqsaOehZ9Fy\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"nodes\":[{\"plugin\":\"convert_color_hsl_modulator\",\"x\":421,\"y\":209,\"uid\":\"Tr5O5NnneH3T\"},{\"plugin\":\"float_display\",\"x\":458,\"y\":89,\"uid\":\"2TOg2GCGEHpr\"},{\"plugin\":\"float_display\",\"x\":457,\"y\":128,\"uid\":\"Crr0SxbOcRlu\"},{\"plugin\":\"float_display\",\"x\":456,\"y\":169,\"uid\":\"5Ym04TgwimOB\"},{\"plugin\":\"convert_color_rgb_modulator\",\"x\":426,\"y\":329,\"uid\":\"pgKkaBEyw6A4\"},{\"plugin\":\"float_display\",\"x\":454,\"y\":403,\"uid\":\"FRHJmIPx3YwF\"},{\"plugin\":\"float_display\",\"x\":455,\"y\":443,\"uid\":\"OcUPWpiiS6dc\"},{\"plugin\":\"float_display\",\"x\":454,\"y\":481,\"uid\":\"HngxVc1Ppa9Y\"},{\"plugin\":\"convert_hsl_color_modulator\",\"x\":545,\"y\":210,\"uid\":\"Nxf7GpwA8Ltk\"},{\"plugin\":\"convert_rgb_color_modulator\",\"x\":545,\"y\":329,\"uid\":\"5Hp2xOpeMEHy\"},{\"plugin\":\"color_display\",\"x\":666,\"y\":266,\"uid\":\"vYMtLoozveeC\"},{\"plugin\":\"color_display\",\"x\":666,\"y\":307,\"uid\":\"wwKQfbInz1V4\"},{\"plugin\":\"convert_rgb_color_modulator\",\"x\":277,\"y\":271,\"uid\":\"Q6pRTfrNR4KB\"},{\"plugin\":\"const_float_generator\",\"x\":160,\"y\":228,\"uid\":\"pCqlSr84kH2I\",\"state\":{\"val\":1}},{\"plugin\":\"const_float_generator\",\"x\":160,\"y\":279,\"uid\":\"rtVRfMo8DgbC\",\"state\":{\"val\":1}},{\"plugin\":\"const_float_generator\",\"x\":159,\"y\":327,\"uid\":\"zuCGKkxlhOLM\",\"state\":{\"val\":0}}],\"conns\":[{\"src_nuid\":\"Tr5O5NnneH3T\",\"dst_nuid\":\"5Ym04TgwimOB\",\"src_slot\":\"luminosity\",\"dst_slot\":\"float\",\"uid\":\"MTlvaqWWO2zk\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Tr5O5NnneH3T\",\"dst_nuid\":\"Crr0SxbOcRlu\",\"src_slot\":\"saturation\",\"dst_slot\":\"float\",\"uid\":\"EbEjSQGbkmIu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Tr5O5NnneH3T\",\"dst_nuid\":\"2TOg2GCGEHpr\",\"src_slot\":\"hue\",\"dst_slot\":\"float\",\"uid\":\"r2OAfVWpqCRD\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"pgKkaBEyw6A4\",\"dst_nuid\":\"OcUPWpiiS6dc\",\"src_slot\":\"green\",\"dst_slot\":\"float\",\"uid\":\"zuVSjwReJGb1\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"pgKkaBEyw6A4\",\"dst_nuid\":\"HngxVc1Ppa9Y\",\"src_slot\":\"blue\",\"dst_slot\":\"float\",\"uid\":\"26iuD4yHXMCf\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"pgKkaBEyw6A4\",\"dst_nuid\":\"FRHJmIPx3YwF\",\"src_slot\":\"red\",\"dst_slot\":\"float\",\"uid\":\"Hnk4bwLSFHHE\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"pgKkaBEyw6A4\",\"dst_nuid\":\"5Hp2xOpeMEHy\",\"src_slot\":\"red\",\"dst_slot\":\"red\",\"uid\":\"C3GnFmIG5UeC\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"pgKkaBEyw6A4\",\"dst_nuid\":\"5Hp2xOpeMEHy\",\"src_slot\":\"green\",\"dst_slot\":\"green\",\"uid\":\"bWD6ioUw40Gw\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"pgKkaBEyw6A4\",\"dst_nuid\":\"5Hp2xOpeMEHy\",\"src_slot\":\"blue\",\"dst_slot\":\"blue\",\"uid\":\"GGKQf8Suakaq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5Hp2xOpeMEHy\",\"dst_nuid\":\"wwKQfbInz1V4\",\"src_slot\":\"color\",\"dst_slot\":\"color\",\"uid\":\"sYUfAje6fGq3\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Nxf7GpwA8Ltk\",\"dst_nuid\":\"vYMtLoozveeC\",\"src_slot\":\"color\",\"dst_slot\":\"color\",\"uid\":\"O1SniRVLnOMG\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Tr5O5NnneH3T\",\"dst_nuid\":\"Nxf7GpwA8Ltk\",\"src_slot\":\"hue\",\"dst_slot\":\"hue\",\"uid\":\"0TlkOora39YZ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Tr5O5NnneH3T\",\"dst_nuid\":\"Nxf7GpwA8Ltk\",\"src_slot\":\"saturation\",\"dst_slot\":\"saturation\",\"uid\":\"kR1S90d5GnJj\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Tr5O5NnneH3T\",\"dst_nuid\":\"Nxf7GpwA8Ltk\",\"src_slot\":\"luminosity\",\"dst_slot\":\"luminosity\",\"uid\":\"mTy87LJcGmWb\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Q6pRTfrNR4KB\",\"dst_nuid\":\"Tr5O5NnneH3T\",\"src_slot\":\"color\",\"dst_slot\":\"color\",\"uid\":\"MloBoSImH4ee\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Q6pRTfrNR4KB\",\"dst_nuid\":\"pgKkaBEyw6A4\",\"src_slot\":\"color\",\"dst_slot\":\"color\",\"uid\":\"8wQB5RBdgANN\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"rtVRfMo8DgbC\",\"dst_nuid\":\"Q6pRTfrNR4KB\",\"src_slot\":\"value\",\"dst_slot\":\"green\",\"uid\":\"fJ89pLMxgdRr\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"zuCGKkxlhOLM\",\"dst_nuid\":\"Q6pRTfrNR4KB\",\"src_slot\":\"value\",\"dst_slot\":\"blue\",\"uid\":\"BFMwZTsLxIo3\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"pCqlSr84kH2I\",\"dst_nuid\":\"Q6pRTfrNR4KB\",\"src_slot\":\"value\",\"dst_slot\":\"red\",\"uid\":\"lDMcgQJZMaPO\",\"src_connected\":true,\"dst_connected\":true}]}}"
  },
  {
    "path": "browser/test/fixtures/arrayfunction.json",
    "content": "{\"abs_t\":0,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"array_function\",\"x\":427,\"y\":525,\"uid\":\"VJtqTBvtyrmu\",\"state\":{\"input_sids\":{},\"output_sids\":{},\"always_update\":false},\"title\":\"Array function\",\"graph\":{\"uid\":\"ZV7P7QdHbe2e\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"variable_local_read\",\"x\":189,\"y\":620,\"uid\":\"k5TMKYZzH5QW\",\"title\":\"index\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"UzK3xrLc2Ugs\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"variable_local_write\",\"x\":819,\"y\":588,\"uid\":\"c2hqqB9hHgHS\",\"title\":\"item\",\"dyn_in\":[{\"name\":\"value\",\"dt\":21,\"uid\":\"9nshqd2VfZAK\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":562,\"y\":556,\"uid\":\"QcK56T2c7Jp9\",\"state\":{\"always_update\":true,\"input_sids\":{\"E7eYbqaQJCdF\":\"vXUPyGCSJM2y\"},\"output_sids\":{\"ZjZ3x4SKYKUM\":\"KQIJHdC6kfHo\"}},\"title\":\"Text\",\"graph\":{\"uid\":\"YXcxExWquwus\",\"parent_uid\":\"ZV7P7QdHbe2e\",\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":654,\"y\":470,\"uid\":\"Xxk7JcXe5Kw4\",\"state\":{\"always_update\":true,\"input_sids\":{\"tuVSZMFXkuwT\":\"sRlAkgcKhKMQ\",\"wQQdpR2syzAL\":\"S2nnu4FGbdIz\",\"HVUSVMUkNbz6\":\"GQQJWiOcNgy4\"},\"output_sids\":{\"XWbakqpVRs3C\":\"yKhxaLYpS7Se\",\"RTT7jjAChS8w\":\"BSStMLcL4wWS\"}},\"title\":\"Text\",\"graph\":{\"uid\":\"FJzyW8GjQmRX\",\"parent_uid\":\"YXcxExWquwus\",\"open\":true,\"nodes\":[{\"plugin\":\"const_float_generator\",\"x\":507,\"y\":622,\"uid\":\"s3Yd9zyNSKdp\",\"open\":false,\"state\":{\"val\":2},\"title\":\"Segments\"},{\"plugin\":\"three_geometry_plane\",\"x\":683,\"y\":587,\"uid\":\"2V2KskApQYby\",\"open\":false},{\"plugin\":\"const_float_generator\",\"x\":472,\"y\":562,\"uid\":\"HU6g3PaXuYRv\",\"open\":false,\"state\":{\"val\":1},\"title\":\"Width & Height\"},{\"plugin\":\"input_proxy\",\"x\":146,\"y\":391,\"uid\":\"tuVSZMFXkuwT\",\"title\":\"font style\",\"dyn_out\":[{\"name\":\"input\",\"dt\":15,\"uid\":\"mbrd65kMPyo2\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":170,\"y\":126,\"uid\":\"wQQdpR2syzAL\",\"title\":\"text\",\"dyn_out\":[{\"name\":\"input\",\"dt\":15,\"uid\":\"EHC1du1l07AS\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"texture_from_text_generator\",\"x\":407,\"y\":207,\"uid\":\"JXDkn87he8Fg\",\"open\":false},{\"plugin\":\"const_float_generator\",\"x\":447,\"y\":455,\"uid\":\"fcHDK3Bnw7Hk\",\"state\":{\"val\":2}},{\"plugin\":\"toggle_button\",\"x\":396,\"y\":256,\"uid\":\"GYWGanF2K6ha\",\"state\":{\"enabled\":true}},{\"plugin\":\"const_float_generator\",\"x\":141,\"y\":242,\"uid\":\"GyPxmcetfwYR\",\"open\":false,\"state\":{\"val\":1024},\"title\":\"Size\"},{\"plugin\":\"const_float_generator\",\"x\":156,\"y\":282,\"uid\":\"y3V7Rk4eqn6c\",\"state\":{\"val\":512},\"title\":\"X\"},{\"plugin\":\"const_float_generator\",\"x\":157,\"y\":351,\"uid\":\"tbkGxtAzM9uL\",\"state\":{\"val\":256},\"title\":\"Y\"},{\"plugin\":\"input_proxy\",\"x\":169,\"y\":38,\"uid\":\"HVUSVMUkNbz6\",\"title\":\"color\",\"dyn_out\":[{\"name\":\"input\",\"dt\":3,\"uid\":\"cG7DlCEla0O3\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":false}]},{\"plugin\":\"three_material\",\"x\":655,\"y\":230,\"uid\":\"C9YRNcL4aWXE\",\"state\":{}},{\"plugin\":\"knob_float_generator\",\"x\":427,\"y\":349,\"uid\":\"SpeKeQmdJcPq\",\"state\":{\"val\":1},\"title\":\"Opacity\"},{\"plugin\":\"output_proxy\",\"x\":980,\"y\":467,\"uid\":\"XWbakqpVRs3C\",\"title\":\"material\",\"dyn_in\":[{\"name\":\"output\",\"dt\":12,\"def\":null,\"uid\":\"B9qy6gC3PQX6\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":998,\"y\":654,\"uid\":\"RTT7jjAChS8w\",\"title\":\"geometry\",\"dyn_in\":[{\"name\":\"output\",\"dt\":19,\"def\":null,\"uid\":\"2z4HWL4Shu7t\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]}],\"conns\":[{\"src_nuid\":\"HU6g3PaXuYRv\",\"dst_nuid\":\"2V2KskApQYby\",\"src_slot\":\"value\",\"dst_slot\":\"width\",\"uid\":\"vTuHHTaj4wKR\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"HU6g3PaXuYRv\",\"dst_nuid\":\"2V2KskApQYby\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"2JuKn43eStkd\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"s3Yd9zyNSKdp\",\"dst_nuid\":\"2V2KskApQYby\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"Kd7BvZqs3hVd\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"s3Yd9zyNSKdp\",\"dst_nuid\":\"2V2KskApQYby\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"HA2xn4BxzadX\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"wQQdpR2syzAL\",\"dst_nuid\":\"JXDkn87he8Fg\",\"src_slot\":0,\"dst_slot\":\"text\",\"uid\":\"jHxFKbrGS6z2\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"tuVSZMFXkuwT\",\"dst_nuid\":\"JXDkn87he8Fg\",\"src_slot\":0,\"dst_slot\":\"font style\",\"uid\":\"TyejHuvQafn9\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"GyPxmcetfwYR\",\"dst_nuid\":\"JXDkn87he8Fg\",\"src_slot\":\"value\",\"dst_slot\":\"width\",\"uid\":\"URb64ztgCxvq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"GyPxmcetfwYR\",\"dst_nuid\":\"JXDkn87he8Fg\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"3TV85BSjTSeX\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"y3V7Rk4eqn6c\",\"dst_nuid\":\"JXDkn87he8Fg\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"24a2sQmYLCeB\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"tbkGxtAzM9uL\",\"dst_nuid\":\"JXDkn87he8Fg\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"4cuNbydwfwhx\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"fcHDK3Bnw7Hk\",\"dst_nuid\":\"C9YRNcL4aWXE\",\"src_slot\":\"value\",\"dst_slot\":\"side\",\"uid\":\"6EJqFE87MBNE\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"GYWGanF2K6ha\",\"dst_nuid\":\"C9YRNcL4aWXE\",\"src_slot\":\"bool\",\"dst_slot\":\"transparent\",\"uid\":\"YN7tEmJD88L6\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"JXDkn87he8Fg\",\"dst_nuid\":\"C9YRNcL4aWXE\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"mNhpCGGUkVUa\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"SpeKeQmdJcPq\",\"dst_nuid\":\"C9YRNcL4aWXE\",\"src_slot\":\"value\",\"dst_slot\":\"opacity\",\"uid\":\"Vckmf2uhBwuG\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"2V2KskApQYby\",\"dst_nuid\":\"RTT7jjAChS8w\",\"src_slot\":\"geometry\",\"dst_slot\":0,\"uid\":\"3fvsg9eJ3gLf\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"C9YRNcL4aWXE\",\"dst_nuid\":\"XWbakqpVRs3C\",\"src_slot\":\"material\",\"dst_slot\":0,\"uid\":\"vUXVM84RE4eM\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"name\":\"color\",\"dt\":3,\"index\":0,\"uid\":\"GQQJWiOcNgy4\",\"dynamic\":true,\"type\":0,\"is_connected\":true},{\"name\":\"text\",\"dt\":15,\"index\":1,\"uid\":\"S2nnu4FGbdIz\",\"dynamic\":true,\"type\":0,\"is_connected\":true},{\"name\":\"font style\",\"dt\":15,\"index\":2,\"uid\":\"sRlAkgcKhKMQ\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"geometry\",\"dt\":19,\"index\":0,\"uid\":\"BSStMLcL4wWS\",\"dynamic\":true,\"type\":1,\"is_connected\":true},{\"name\":\"material\",\"dt\":12,\"index\":1,\"uid\":\"yKhxaLYpS7Se\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"const_text_generator\",\"x\":354,\"y\":671,\"uid\":\"h6vg4KxTeT9d\",\"state\":{\"text\":\"bold 128px arial\",\"width\":107,\"height\":17},\"title\":\"Font Style\"},{\"plugin\":\"color_picker\",\"x\":334,\"y\":300,\"uid\":\"jM4Fe8aGTs72\",\"state\":{\"hue\":0,\"sat\":0.016853932584269662,\"lum\":1}},{\"plugin\":\"output_proxy\",\"x\":1270,\"y\":373,\"uid\":\"ZjZ3x4SKYKUM\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"IJEKqUWOR4PP\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_mesh\",\"x\":1019,\"y\":446,\"uid\":\"a3RUyMqhpmCZ\",\"open\":false,\"state\":{\"position\":{\"x\":0,\"y\":1.9615097093158624,\"z\":-2.9635665847604358},\"scale\":{\"x\":3.1907156068563065,\"y\":3.1907156068563065,\"z\":3.1907156068563065},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"input_proxy\",\"x\":373,\"y\":598,\"uid\":\"E7eYbqaQJCdF\",\"title\":\"input\",\"dyn_out\":[{\"name\":\"input\",\"dt\":15,\"uid\":\"kWpRLG9AhhbR\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]}],\"conns\":[{\"src_nuid\":\"jM4Fe8aGTs72\",\"dst_nuid\":\"Xxk7JcXe5Kw4\",\"src_slot\":\"color\",\"dst_slot\":0,\"uid\":\"TgqysMz7pG2a\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"h6vg4KxTeT9d\",\"dst_nuid\":\"Xxk7JcXe5Kw4\",\"src_slot\":\"text\",\"dst_slot\":2,\"uid\":\"zsEJAX46wPBG\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"a3RUyMqhpmCZ\",\"dst_nuid\":\"ZjZ3x4SKYKUM\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"qXeU3TfhGjCp\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"Xxk7JcXe5Kw4\",\"dst_nuid\":\"a3RUyMqhpmCZ\",\"src_slot\":0,\"dst_slot\":\"geometry\",\"uid\":\"84cny8XqJREC\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"Xxk7JcXe5Kw4\",\"dst_nuid\":\"a3RUyMqhpmCZ\",\"src_slot\":1,\"dst_slot\":\"material\",\"uid\":\"9KF54RzEq37x\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"E7eYbqaQJCdF\",\"dst_nuid\":\"Xxk7JcXe5Kw4\",\"src_slot\":0,\"dst_slot\":1,\"uid\":\"S56hEjqwjZAR\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true}]},\"dyn_in\":[{\"name\":\"input\",\"dt\":15,\"index\":0,\"uid\":\"vXUPyGCSJM2y\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"KQIJHdC6kfHo\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"format_string_float\",\"x\":339,\"y\":588,\"uid\":\"3HWVVa3DnVfJ\"}],\"conns\":[{\"src_nuid\":\"QcK56T2c7Jp9\",\"dst_nuid\":\"c2hqqB9hHgHS\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"yhRs3n248sGb\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"k5TMKYZzH5QW\",\"dst_nuid\":\"3HWVVa3DnVfJ\",\"src_slot\":0,\"dst_slot\":\"float\",\"uid\":\"8D7DVwYHZS77\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"3HWVVa3DnVfJ\",\"dst_nuid\":\"QcK56T2c7Jp9\",\"src_slot\":\"text\",\"dst_slot\":0,\"uid\":\"TJkp3pXGtMMp\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}],\"variables\":[{\"id\":\"item\",\"dt\":21},{\"id\":\"index\",\"dt\":0}]}},{\"plugin\":\"data_info_display\",\"x\":687,\"y\":510,\"uid\":\"Bpay4QuC5Qu3\"},{\"plugin\":\"const_float_generator\",\"x\":237,\"y\":557,\"uid\":\"MKM3A5YW7W7H\",\"state\":{\"val\":3}}],\"conns\":[{\"src_nuid\":\"MKM3A5YW7W7H\",\"dst_nuid\":\"VJtqTBvtyrmu\",\"src_slot\":\"value\",\"dst_slot\":\"length\",\"uid\":\"jjK3EfqW2qfv\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"VJtqTBvtyrmu\",\"dst_nuid\":\"Bpay4QuC5Qu3\",\"src_slot\":\"array\",\"dst_slot\":\"any\",\"uid\":\"V534gEPZSCAw\",\"src_connected\":true,\"dst_connected\":true}]}}"
  },
  {
    "path": "browser/test/fixtures/init-revolver.json",
    "content": "{\"abs_t\":605.884,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":1487,\"y\":137,\"uid\":\"GKCJDXV2557h\",\"state\":{\"always_update\":true,\"input_sids\":{\"FMcyzwxMutQ2\":\"lbU7hDvbnKfg\"},\"output_sids\":{}},\"title\":\"Cam\",\"graph\":{\"uid\":\"CM3ZPJd42DXF\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"input_proxy\",\"x\":366,\"y\":441,\"uid\":\"FMcyzwxMutQ2\",\"title\":\"scene\",\"dyn_out\":[{\"name\":\"input\",\"dt\":11,\"uid\":\"uGHXM4cdeVb3\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_webgl_renderer\",\"x\":992,\"y\":257,\"uid\":\"cNNpqQUaRrXL\",\"state\":{\"always_update\":true}},{\"plugin\":\"graph\",\"x\":330,\"y\":298,\"uid\":\"RtQdDec2QYjV\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"YaKvTqujhzz4\":\"8GpdZjiiiEQa\"}},\"title\":\"VR camera\",\"graph\":{\"uid\":\"TaKt97xAYuU9\",\"parent_uid\":\"CM3ZPJd42DXF\",\"open\":true,\"nodes\":[{\"plugin\":\"three_vr_camera\",\"x\":536,\"y\":212,\"uid\":\"pyUEv2XXrbau\",\"state\":{\"position\":{\"x\":-0.16868099969082617,\"y\":1.5022318390567229,\"z\":6.1706446681839315},\"quaternion\":{\"_x\":0.002957945970752956,\"_y\":0.06305678154269531,\"_z\":-0.00018689130010984562,\"_w\":0.9980055400290886}}},{\"plugin\":\"output_proxy\",\"x\":787,\"y\":213,\"uid\":\"YaKvTqujhzz4\",\"title\":\"camera\",\"dyn_in\":[{\"name\":\"output\",\"dt\":6,\"def\":null,\"uid\":\"uyyGR7LQwSEh\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]}],\"conns\":[{\"src_nuid\":\"pyUEv2XXrbau\",\"dst_nuid\":\"YaKvTqujhzz4\",\"src_slot\":\"camera\",\"dst_slot\":0,\"uid\":\"wwcTdM5ynNXx\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"camera\",\"dt\":6,\"index\":0,\"uid\":\"8GpdZjiiiEQa\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"three_gaze_clicker\",\"x\":530,\"y\":383,\"uid\":\"GapUv39SvFCK\",\"state\":{}},{\"plugin\":\"toggle_button\",\"x\":791,\"y\":376,\"uid\":\"9S76s344PzLC\",\"open\":false,\"state\":{\"enabled\":true},\"title\":\"Shadows on\"}],\"conns\":[{\"src_nuid\":\"RtQdDec2QYjV\",\"dst_nuid\":\"cNNpqQUaRrXL\",\"src_slot\":0,\"dst_slot\":\"camera\",\"uid\":\"KVhCVJEf3aDx\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"RtQdDec2QYjV\",\"dst_nuid\":\"GapUv39SvFCK\",\"src_slot\":0,\"dst_slot\":\"camera\",\"uid\":\"SEaBb88BvVBk\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"FMcyzwxMutQ2\",\"dst_nuid\":\"GapUv39SvFCK\",\"src_slot\":0,\"dst_slot\":\"scene\",\"uid\":\"yfun7WkqrWqV\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"GapUv39SvFCK\",\"dst_nuid\":\"cNNpqQUaRrXL\",\"src_slot\":\"scene\",\"dst_slot\":\"scene\",\"uid\":\"zbCDXdmCu3Fv\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"9S76s344PzLC\",\"dst_nuid\":\"cNNpqQUaRrXL\",\"src_slot\":\"bool\",\"dst_slot\":\"shadowsEnabled\",\"uid\":\"b6Ew8t87ynjL\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"scene\",\"dt\":11,\"index\":0,\"uid\":\"lbU7hDvbnKfg\",\"dynamic\":true,\"type\":0,\"is_connected\":true}]},{\"plugin\":\"array_switch_modulator\",\"x\":1106,\"y\":114,\"uid\":\"NDL73aSfJ6Ru\",\"title\":\"Scenes\",\"dyn_in\":[{\"type\":0,\"name\":\"0\",\"dt\":11,\"uid\":\"xks4nkpBdEK5\",\"dynamic\":true,\"index\":0,\"is_connected\":false,\"inactive\":true,\"array\":false},{\"type\":0,\"name\":\"1\",\"dt\":11,\"uid\":\"jgeU7rX4PCkc\",\"dynamic\":true,\"index\":1,\"is_connected\":true,\"inactive\":true,\"array\":false},{\"type\":0,\"name\":\"2\",\"dt\":11,\"uid\":\"Ltq9rMAh6MhD\",\"dynamic\":true,\"index\":2,\"inactive\":true,\"is_connected\":true,\"array\":false},{\"type\":0,\"name\":\"3\",\"dt\":11,\"uid\":\"YJWBcPXFWhQc\",\"dynamic\":true,\"index\":3,\"is_connected\":true,\"inactive\":true,\"array\":false},{\"type\":0,\"name\":\"4\",\"dt\":11,\"uid\":\"JYEzF47uNcVh\",\"dynamic\":true,\"index\":4,\"is_connected\":true,\"inactive\":true,\"array\":false},{\"type\":0,\"name\":\"5\",\"dt\":11,\"uid\":\"5JYbLsbhLdKv\",\"dynamic\":true,\"index\":5,\"is_connected\":true,\"inactive\":false,\"array\":false},{\"type\":0,\"name\":\"6\",\"dt\":11,\"uid\":\"LmWwjKTmFaa3\",\"dynamic\":true,\"index\":6,\"is_connected\":true,\"inactive\":true,\"array\":false},{\"type\":0,\"name\":\"7\",\"dt\":11,\"uid\":\"KVGudahyC4SK\",\"dynamic\":true,\"index\":7,\"is_connected\":true,\"inactive\":true,\"array\":false}]},{\"plugin\":\"graph\",\"x\":769,\"y\":167,\"uid\":\"2wDdwrYYBqDS\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"vQ8dHkXf4hAm\":\"xbephyP6fRzD\"}},\"title\":\"Scene 1\",\"graph\":{\"uid\":\"AYTQxHV5k5L7\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":909,\"y\":327,\"uid\":\"HYRSyDxRhkHd\",\"state\":{\"always_update\":true,\"input_sids\":{\"wSk2TS3qRGzF\":\"lOz0fKTfMesH\"},\"output_sids\":{\"ZDhLfT2FKu7R\":\"mh0rTKkFm0nD\"}},\"title\":\"360 photo\",\"graph\":{\"uid\":\"SaB635v8DPcX\",\"parent_uid\":\"AYTQxHV5k5L7\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1252,\"y\":373,\"uid\":\"aKvgxa7YyDhC\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1438,\"y\":405,\"uid\":\"ZDhLfT2FKu7R\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_material\",\"x\":974,\"y\":130,\"uid\":\"edTbWUVLa7XU\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":723,\"y\":214,\"uid\":\"QzuUB5rxXqhq\",\"state\":{\"val\":1},\"title\":\"Side\"},{\"plugin\":\"three_uv_modifier\",\"x\":553,\"y\":87,\"uid\":\"mEc7W4EQWCrH\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":297,\"y\":197,\"uid\":\"sC3SwHTqza3r\",\"state\":{\"val\":-1},\"title\":\"X repeat photo\"},{\"plugin\":\"input_proxy\",\"x\":321,\"y\":122,\"uid\":\"wSk2TS3qRGzF\",\"title\":\"texture\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"q2TtZnBOutlf\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_geometry_sphere\",\"x\":939,\"y\":467,\"uid\":\"Cx4Vx728jPKx\"},{\"plugin\":\"const_float_generator\",\"x\":670,\"y\":421,\"uid\":\"DHSC8GM2Sgf8\",\"state\":{\"val\":30},\"title\":\"Radius\"},{\"plugin\":\"const_float_generator\",\"x\":676,\"y\":502,\"uid\":\"u6JNMFUYVVdA\",\"state\":{\"val\":40},\"title\":\"Width Segments\"},{\"plugin\":\"const_float_generator\",\"x\":678,\"y\":584,\"uid\":\"h7Syx2jMWzFK\",\"state\":{\"val\":40},\"title\":\"Height Segments\"},{\"plugin\":\"toggle_button\",\"x\":724,\"y\":292,\"uid\":\"UawK46k3XH42\",\"state\":{\"enabled\":false},\"title\":\"Fog\"}],\"conns\":[{\"src_nuid\":\"aKvgxa7YyDhC\",\"dst_nuid\":\"ZDhLfT2FKu7R\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"wWY5T2CfVjrj\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"edTbWUVLa7XU\",\"dst_nuid\":\"aKvgxa7YyDhC\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"s75kEqxeL5c6\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"QzuUB5rxXqhq\",\"dst_nuid\":\"edTbWUVLa7XU\",\"src_slot\":\"value\",\"dst_slot\":\"side\",\"uid\":\"2tYMCCRWSXyz\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"mEc7W4EQWCrH\",\"dst_nuid\":\"edTbWUVLa7XU\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"watJk8Yj4JxK\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"sC3SwHTqza3r\",\"dst_nuid\":\"mEc7W4EQWCrH\",\"src_slot\":\"value\",\"dst_slot\":\"u repeat\",\"uid\":\"6MVSbjrSy8nx\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"wSk2TS3qRGzF\",\"dst_nuid\":\"mEc7W4EQWCrH\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"rztnpuS5C8DK\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"DHSC8GM2Sgf8\",\"dst_nuid\":\"Cx4Vx728jPKx\",\"src_slot\":\"value\",\"dst_slot\":\"radius\",\"uid\":\"h42wzHZKUEth\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"u6JNMFUYVVdA\",\"dst_nuid\":\"Cx4Vx728jPKx\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"6nCFnwMgd5HE\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"h7Syx2jMWzFK\",\"dst_nuid\":\"Cx4Vx728jPKx\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"4bsBd6bam5gE\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Cx4Vx728jPKx\",\"dst_nuid\":\"aKvgxa7YyDhC\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"KmwMaJZuVghS\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"UawK46k3XH42\",\"dst_nuid\":\"edTbWUVLa7XU\",\"src_slot\":\"bool\",\"dst_slot\":\"fog\",\"uid\":\"AemCzX4DvYtb\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"texture\",\"dt\":2,\"index\":0,\"uid\":\"lOz0fKTfMesH\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":639,\"y\":298,\"uid\":\"FtYtYJg5nBzj\",\"state\":{\"url\":\"/data/image/8afab664da753289d61ff6a84793d1a22fba82ce.jpg\"}},{\"plugin\":\"three_scene\",\"x\":1179,\"y\":317,\"uid\":\"kweeUEJKKBk3\",\"title\":\"Scene 1\",\"dyn_in\":[{\"type\":0,\"name\":\"0\",\"dt\":21,\"array\":true,\"uid\":\"DDzcOXqI6iRM\",\"dynamic\":true,\"index\":0,\"is_connected\":true},{\"type\":0,\"name\":\"1\",\"dt\":21,\"array\":true,\"uid\":\"gH5pmBKZK4lm\",\"dynamic\":true,\"index\":1,\"is_connected\":true},{\"type\":0,\"name\":\"2\",\"dt\":21,\"array\":true,\"uid\":\"nW2DuQNevrLR\",\"dynamic\":true,\"index\":2,\"is_connected\":false},{\"type\":0,\"name\":\"3\",\"dt\":21,\"array\":true,\"uid\":\"Qhvuw3hYvxpk\",\"dynamic\":true,\"index\":3,\"is_connected\":false},{\"type\":0,\"name\":\"4\",\"dt\":21,\"array\":true,\"uid\":\"xsJVdRqz2u5R\",\"dynamic\":true,\"index\":4,\"is_connected\":false},{\"type\":0,\"name\":\"5\",\"dt\":21,\"array\":true,\"uid\":\"6YA7VwBjNd9M\",\"dynamic\":true,\"index\":5}]},{\"plugin\":\"output_proxy\",\"x\":1369,\"y\":303,\"uid\":\"vQ8dHkXf4hAm\",\"title\":\"scene\",\"dyn_in\":[{\"name\":\"output\",\"dt\":11,\"def\":null,\"uid\":\"RSDfFzqVXHXX\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"graph\",\"x\":868,\"y\":484,\"uid\":\"BpqkYUEkvjhq\",\"state\":{\"always_update\":true,\"input_sids\":{\"ET3Fb2WzZa8g\":\"KQg2KDxbURhR\"},\"output_sids\":{\"Q6ER5tCjNmJA\":\"mh0rTKkFm0nD\"}},\"title\":\"Arrow to 2\",\"graph\":{\"uid\":\"stEX3QAhnW2z\",\"parent_uid\":\"AYTQxHV5k5L7\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1219,\"y\":454,\"uid\":\"MBQDdwqGx2na\",\"state\":{\"position\":{\"x\":-3.570232313431898,\"y\":-1.2800000000000002,\"z\":5.4189244375879655},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":-0.5164122965180219,\"_y\":0.48326723530718796,\"_z\":0.4870679295715031,\"_w\":0.5123826219403413}}},{\"plugin\":\"output_proxy\",\"x\":1418,\"y\":453,\"uid\":\"Q6ER5tCjNmJA\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":669,\"y\":542,\"uid\":\"gxsGm94J8ub9\",\"state\":{\"val\":16},\"title\":\"Segments\"},{\"plugin\":\"three_geometry_plane\",\"x\":925,\"y\":466,\"uid\":\"ZaRf4ajXkEBh\"},{\"plugin\":\"three_material\",\"x\":719,\"y\":90,\"uid\":\"R7thGJVKVXpz\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":664,\"y\":451,\"uid\":\"HsKnrsJ8j2et\",\"state\":{\"val\":1},\"title\":\"Width & Height\"},{\"plugin\":\"input_proxy\",\"x\":320,\"y\":223,\"uid\":\"ET3Fb2WzZa8g\",\"title\":\"arrow\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"TCVNVQDbGTpd\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"toggle_button\",\"x\":414,\"y\":479,\"uid\":\"fwNkZuH5HXPk\",\"state\":{\"enabled\":true}}],\"conns\":[{\"src_nuid\":\"MBQDdwqGx2na\",\"dst_nuid\":\"Q6ER5tCjNmJA\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"gM4X8uPthfj6\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"ZaRf4ajXkEBh\",\"dst_nuid\":\"MBQDdwqGx2na\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"BWweZKctNX4j\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"R7thGJVKVXpz\",\"dst_nuid\":\"MBQDdwqGx2na\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"TqeKeUVRYWEp\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"HsKnrsJ8j2et\",\"dst_nuid\":\"ZaRf4ajXkEBh\",\"src_slot\":\"value\",\"dst_slot\":\"width\",\"uid\":\"LWeqfJBKQxQx\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"HsKnrsJ8j2et\",\"dst_nuid\":\"ZaRf4ajXkEBh\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"kUGk6GVeJ5by\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"gxsGm94J8ub9\",\"dst_nuid\":\"ZaRf4ajXkEBh\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"CzywEX2sprv2\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"gxsGm94J8ub9\",\"dst_nuid\":\"ZaRf4ajXkEBh\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"Hsq7vp5w989u\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ET3Fb2WzZa8g\",\"dst_nuid\":\"R7thGJVKVXpz\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"xYrXtZjpjmAk\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"fwNkZuH5HXPk\",\"dst_nuid\":\"R7thGJVKVXpz\",\"src_slot\":\"bool\",\"dst_slot\":\"transparent\",\"uid\":\"qKT5xgAfSHwd\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"arrow\",\"dt\":2,\"index\":0,\"uid\":\"KQg2KDxbURhR\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":628,\"y\":482,\"uid\":\"6LHcUuXAHmgu\",\"state\":{\"url\":\"/data/image/f99f293b9cf27a0cb4d282cb891d9f7346f1f1b1.png\"},\"title\":\"Texture\"}],\"conns\":[{\"src_nuid\":\"FtYtYJg5nBzj\",\"dst_nuid\":\"HYRSyDxRhkHd\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"B7RZBBde3ztm\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"HYRSyDxRhkHd\",\"dst_nuid\":\"kweeUEJKKBk3\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"vkxmhQF2bPmt\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"kweeUEJKKBk3\",\"dst_nuid\":\"vQ8dHkXf4hAm\",\"src_slot\":\"scene\",\"dst_slot\":0,\"uid\":\"nmpJ7NAzAGsS\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"BpqkYUEkvjhq\",\"dst_nuid\":\"kweeUEJKKBk3\",\"src_slot\":0,\"dst_slot\":1,\"uid\":\"V2hNEz7Yyb87\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"6LHcUuXAHmgu\",\"dst_nuid\":\"BpqkYUEkvjhq\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"StRUYqhM8npd\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"scene\",\"dt\":11,\"index\":0,\"uid\":\"xbephyP6fRzD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":751,\"y\":72,\"uid\":\"QsGkx32Wp7YR\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"KPZHbTjw6D29\":\"LKvsR9mDw7Zs\"}},\"title\":\"Navigation\",\"graph\":{\"uid\":\"5ggTKHvrSE9P\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"on_three_object_gaze_clicked\",\"x\":395,\"y\":83,\"uid\":\"JwxrUyNrxwNB\",\"state\":{\"nodeRef\":\"EgG5ke9rN7gw.JFJBjBpxFLBg\",\"type\":0}},{\"plugin\":\"if_modulator\",\"x\":665,\"y\":119,\"uid\":\"aTgdQAqeUMeP\"},{\"plugin\":\"const_float_generator\",\"x\":434,\"y\":179,\"uid\":\"RcxW2qayCVmU\",\"state\":{\"val\":1}},{\"plugin\":\"variable_local_write\",\"x\":810,\"y\":123,\"uid\":\"9hN3btd2mP9m\",\"title\":\"Variable 1\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"cZqpx4gPWVFx\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"on_three_object_gaze_clicked\",\"x\":384,\"y\":416,\"uid\":\"H79ChFFfrGUP\",\"state\":{\"nodeRef\":\"stEX3QAhnW2z.MBQDdwqGx2na\",\"type\":0}},{\"plugin\":\"on_three_object_gaze_clicked\",\"x\":368,\"y\":767,\"uid\":\"kbHyK6LKFJ7y\",\"state\":{\"nodeRef\":\"ez7Pyu8PpcYR.LCxFfvSpfYvV\",\"type\":0}},{\"plugin\":\"on_three_object_gaze_clicked\",\"x\":415,\"y\":1009,\"uid\":\"chTKrYSGG5GE\",\"state\":{\"nodeRef\":\"GR7tSEBz2MGT.ErfuFUJc3fZd\",\"type\":0}},{\"plugin\":\"on_three_object_gaze_clicked\",\"x\":1182,\"y\":140,\"uid\":\"pgt3EB7fKAru\",\"state\":{\"nodeRef\":\"7kMC9KJTnGDC.UMdBR8AX47WQ\",\"type\":0}},{\"plugin\":\"if_modulator\",\"x\":1566,\"y\":230,\"uid\":\"U3NFj3Dyuu4U\",\"open\":false},{\"plugin\":\"const_float_generator\",\"x\":1218,\"y\":333,\"uid\":\"FtYBszSBrfZy\",\"state\":{\"val\":5}},{\"plugin\":\"variable_local_write\",\"x\":1711,\"y\":219,\"uid\":\"QfMRpKHs6p8W\",\"title\":\"Variable 1\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"cZqpx4gPWVFx\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"on_three_object_gaze_clicked\",\"x\":1192,\"y\":474,\"uid\":\"By2yEd5HvDaM\",\"state\":{\"nodeRef\":\"jnEE33C26WDq.28fgeM9ZxgAS\",\"type\":0}},{\"plugin\":\"if_modulator\",\"x\":1596,\"y\":489,\"uid\":\"29aKewDaMPRP\",\"open\":false},{\"plugin\":\"const_float_generator\",\"x\":1270,\"y\":644,\"uid\":\"aWgk92Wd5zJz\",\"state\":{\"val\":6}},{\"plugin\":\"variable_local_write\",\"x\":1742,\"y\":474,\"uid\":\"u8XVWbvnLaGs\",\"title\":\"Variable 1\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"cZqpx4gPWVFx\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"on_three_object_gaze_clicked\",\"x\":1225,\"y\":764,\"uid\":\"EULyEsAMqPyU\",\"state\":{\"nodeRef\":\"LwjmdTsENNhx.v5Uav7Y7BznR\",\"type\":0}},{\"plugin\":\"if_modulator\",\"x\":1495,\"y\":800,\"uid\":\"uUuvHw9xzuYY\"},{\"plugin\":\"const_float_generator\",\"x\":1264,\"y\":860,\"uid\":\"ZJGHPymqSwyh\",\"state\":{\"val\":7}},{\"plugin\":\"variable_local_write\",\"x\":1640,\"y\":804,\"uid\":\"JmQMS7bC4gjH\",\"title\":\"Variable 1\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"cZqpx4gPWVFx\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"on_three_object_gaze_clicked\",\"x\":1233,\"y\":1002,\"uid\":\"at8m78nDMfZZ\",\"state\":{\"nodeRef\":\"P9K5sL7u4RLj.UB6FNDdNsvvf\",\"type\":0}},{\"plugin\":\"if_modulator\",\"x\":1503,\"y\":1038,\"uid\":\"5E7cjCBAd67c\"},{\"plugin\":\"const_float_generator\",\"x\":1272,\"y\":1098,\"uid\":\"kmKEs5ugrDNm\",\"state\":{\"val\":8}},{\"plugin\":\"variable_local_write\",\"x\":1648,\"y\":1042,\"uid\":\"y9T7uYJB7TuC\",\"title\":\"Variable 1\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"cZqpx4gPWVFx\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"initialise_generator\",\"x\":2045,\"y\":286,\"uid\":\"2tvxKstzjyfv\"},{\"plugin\":\"variable_local_write\",\"x\":2431,\"y\":347,\"uid\":\"EsAkF4DU893S\",\"title\":\"Variable 1\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"XCJY78D4L2u3\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"if_modulator\",\"x\":2275,\"y\":372,\"uid\":\"g9HZD2EkeL6g\"},{\"plugin\":\"const_float_generator\",\"x\":2071,\"y\":434,\"uid\":\"KJmAewFpNUHW\",\"state\":{\"val\":1}},{\"plugin\":\"variable_local_read\",\"x\":2067,\"y\":654,\"uid\":\"EQfJXza6PXLP\",\"title\":\"Variable 1\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"Fk5VakgsUg2y\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"output_proxy\",\"x\":2290,\"y\":612,\"uid\":\"KPZHbTjw6D29\",\"title\":\"variable\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"def\":null,\"uid\":\"KmraM4nVBtDL\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"on_three_object_gaze_clicked\",\"x\":385,\"y\":337,\"uid\":\"j3mdryb5Axuu\",\"state\":{\"nodeRef\":\"rRVawZqmQzgc.8NzThQ2G8ddz\",\"type\":0}},{\"plugin\":\"if_modulator\",\"x\":801,\"y\":426,\"uid\":\"SWs2c5EVuPt3\"},{\"plugin\":\"const_float_generator\",\"x\":452,\"y\":494,\"uid\":\"c7rTxA2FuAwM\",\"state\":{\"val\":2}},{\"plugin\":\"variable_local_write\",\"x\":964,\"y\":436,\"uid\":\"dtYasBqB92TQ\",\"title\":\"Variable 1\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"cZqpx4gPWVFx\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"on_three_object_gaze_clicked\",\"x\":366,\"y\":689,\"uid\":\"M4EtxUsfPJZN\",\"state\":{\"nodeRef\":\"Dg2qFzPnqTAJ.SueUR959kwms\",\"type\":0}},{\"plugin\":\"if_modulator\",\"x\":841,\"y\":692,\"uid\":\"Hc4EpAKUQenr\"},{\"plugin\":\"const_float_generator\",\"x\":663,\"y\":785,\"uid\":\"dHJuaj4SYuxZ\",\"state\":{\"val\":3}},{\"plugin\":\"variable_local_write\",\"x\":997,\"y\":696,\"uid\":\"Wh5Lskk5Nuya\",\"title\":\"Variable 1\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"cZqpx4gPWVFx\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"on_three_object_gaze_clicked\",\"x\":416,\"y\":915,\"uid\":\"LHu27ZE424Cj\",\"state\":{\"nodeRef\":\"PAPDDJFeYVMS.SscVDmbhbQyF\",\"type\":0}},{\"plugin\":\"if_modulator\",\"x\":851,\"y\":918,\"uid\":\"ZwzHxHg7cR5r\"},{\"plugin\":\"const_float_generator\",\"x\":669,\"y\":1038,\"uid\":\"QLSdr66C5Hwg\",\"state\":{\"val\":4}},{\"plugin\":\"variable_local_write\",\"x\":995,\"y\":919,\"uid\":\"yrBHj5aP7HHw\",\"title\":\"Variable 1\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"cZqpx4gPWVFx\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"on_three_object_gaze_clicked\",\"x\":1172,\"y\":233,\"uid\":\"ku82rHVtzc3U\",\"state\":{\"nodeRef\":\"KP4FbxK8LzMQ.G6Ua5phNBXg9\",\"type\":0}},{\"plugin\":\"on_three_object_gaze_clicked\",\"x\":1184,\"y\":558,\"uid\":\"fgNspapYWJrs\",\"state\":{\"nodeRef\":\"RTzS2cAWKuTe.tAg6TXCFKC6g\",\"type\":0}},{\"plugin\":\"or_modulator\",\"x\":656,\"y\":404,\"uid\":\"8z2mhqXHVbxa\"},{\"plugin\":\"or_modulator\",\"x\":686,\"y\":678,\"uid\":\"kz8QygbMUxx2\"},{\"plugin\":\"or_modulator\",\"x\":683,\"y\":929,\"uid\":\"PfFrR64LAGgY\"},{\"plugin\":\"or_modulator\",\"x\":1427,\"y\":230,\"uid\":\"CzY4R5DG8Ngp\",\"open\":false},{\"plugin\":\"or_modulator\",\"x\":1453,\"y\":483,\"uid\":\"xzVb86bFBakQ\",\"open\":false}],\"conns\":[{\"src_nuid\":\"JwxrUyNrxwNB\",\"dst_nuid\":\"aTgdQAqeUMeP\",\"src_slot\":\"trigger\",\"dst_slot\":\"condition\",\"uid\":\"BD3AjhDCrbDK\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"RcxW2qayCVmU\",\"dst_nuid\":\"aTgdQAqeUMeP\",\"src_slot\":\"value\",\"dst_slot\":\"value\",\"uid\":\"veafSRdPKafW\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"aTgdQAqeUMeP\",\"dst_nuid\":\"9hN3btd2mP9m\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"haWUbtjbGGxX\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"FtYBszSBrfZy\",\"dst_nuid\":\"U3NFj3Dyuu4U\",\"src_slot\":\"value\",\"dst_slot\":\"value\",\"uid\":\"sJgKMSjM9bh7\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"U3NFj3Dyuu4U\",\"dst_nuid\":\"QfMRpKHs6p8W\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"uWXc6FNbBcYY\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"aWgk92Wd5zJz\",\"dst_nuid\":\"29aKewDaMPRP\",\"src_slot\":\"value\",\"dst_slot\":\"value\",\"uid\":\"2kztGpaLvg8g\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"29aKewDaMPRP\",\"dst_nuid\":\"u8XVWbvnLaGs\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"XWUPW46RT89c\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"EULyEsAMqPyU\",\"dst_nuid\":\"uUuvHw9xzuYY\",\"src_slot\":\"trigger\",\"dst_slot\":\"condition\",\"uid\":\"WDZdh6eyxTP9\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ZJGHPymqSwyh\",\"dst_nuid\":\"uUuvHw9xzuYY\",\"src_slot\":\"value\",\"dst_slot\":\"value\",\"uid\":\"TrAXw6EvjWyR\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"uUuvHw9xzuYY\",\"dst_nuid\":\"JmQMS7bC4gjH\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"p6FR37DxL9hQ\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"at8m78nDMfZZ\",\"dst_nuid\":\"5E7cjCBAd67c\",\"src_slot\":\"trigger\",\"dst_slot\":\"condition\",\"uid\":\"9MHHQxu3xMH7\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"kmKEs5ugrDNm\",\"dst_nuid\":\"5E7cjCBAd67c\",\"src_slot\":\"value\",\"dst_slot\":\"value\",\"uid\":\"BrmWDWT792td\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5E7cjCBAd67c\",\"dst_nuid\":\"y9T7uYJB7TuC\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"2S8q2kVjXPe6\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"2tvxKstzjyfv\",\"dst_nuid\":\"g9HZD2EkeL6g\",\"src_slot\":\"bool\",\"dst_slot\":\"condition\",\"uid\":\"K2xr4H2XDWDc\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"g9HZD2EkeL6g\",\"dst_nuid\":\"EsAkF4DU893S\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"fkTDX4gyf3wX\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"KJmAewFpNUHW\",\"dst_nuid\":\"g9HZD2EkeL6g\",\"src_slot\":\"value\",\"dst_slot\":\"value\",\"uid\":\"rCDQrg5U5UUk\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"EQfJXza6PXLP\",\"dst_nuid\":\"KPZHbTjw6D29\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"sHezRcNR7eDM\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"c7rTxA2FuAwM\",\"dst_nuid\":\"SWs2c5EVuPt3\",\"src_slot\":\"value\",\"dst_slot\":\"value\",\"uid\":\"MDpswFkuNTqu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"SWs2c5EVuPt3\",\"dst_nuid\":\"dtYasBqB92TQ\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"zvMtnu8KtcmQ\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"dHJuaj4SYuxZ\",\"dst_nuid\":\"Hc4EpAKUQenr\",\"src_slot\":\"value\",\"dst_slot\":\"value\",\"uid\":\"PEuNFxmeepwx\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Hc4EpAKUQenr\",\"dst_nuid\":\"Wh5Lskk5Nuya\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"72zLaAxmfFB6\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"QLSdr66C5Hwg\",\"dst_nuid\":\"ZwzHxHg7cR5r\",\"src_slot\":\"value\",\"dst_slot\":\"value\",\"uid\":\"BjWwHErapYLy\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ZwzHxHg7cR5r\",\"dst_nuid\":\"yrBHj5aP7HHw\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"r7wtVmFTS8wz\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"j3mdryb5Axuu\",\"dst_nuid\":\"8z2mhqXHVbxa\",\"src_slot\":\"trigger\",\"dst_slot\":\"a\",\"uid\":\"HLn5ACR2A5dZ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"8z2mhqXHVbxa\",\"dst_nuid\":\"SWs2c5EVuPt3\",\"src_slot\":\"bool\",\"dst_slot\":\"condition\",\"uid\":\"mMgfGTwQy9UB\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"H79ChFFfrGUP\",\"dst_nuid\":\"8z2mhqXHVbxa\",\"src_slot\":\"trigger\",\"dst_slot\":\"b\",\"uid\":\"zNjXMbFZF28t\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"M4EtxUsfPJZN\",\"dst_nuid\":\"kz8QygbMUxx2\",\"src_slot\":\"trigger\",\"dst_slot\":\"a\",\"uid\":\"9jXMumbEHE8x\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"kz8QygbMUxx2\",\"dst_nuid\":\"Hc4EpAKUQenr\",\"src_slot\":\"bool\",\"dst_slot\":\"condition\",\"uid\":\"9vuxQK4UUgjq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"kbHyK6LKFJ7y\",\"dst_nuid\":\"kz8QygbMUxx2\",\"src_slot\":\"trigger\",\"dst_slot\":\"b\",\"uid\":\"FKvbf3tYcLLY\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"LHu27ZE424Cj\",\"dst_nuid\":\"PfFrR64LAGgY\",\"src_slot\":\"trigger\",\"dst_slot\":\"a\",\"uid\":\"NcDDNZD4rgpm\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"PfFrR64LAGgY\",\"dst_nuid\":\"ZwzHxHg7cR5r\",\"src_slot\":\"bool\",\"dst_slot\":\"condition\",\"uid\":\"DJLDRGNeaXzZ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"chTKrYSGG5GE\",\"dst_nuid\":\"PfFrR64LAGgY\",\"src_slot\":\"trigger\",\"dst_slot\":\"b\",\"uid\":\"BV392YWXMJfN\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"pgt3EB7fKAru\",\"dst_nuid\":\"CzY4R5DG8Ngp\",\"src_slot\":\"trigger\",\"dst_slot\":\"a\",\"uid\":\"Fm8dQnekAPGB\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"CzY4R5DG8Ngp\",\"dst_nuid\":\"U3NFj3Dyuu4U\",\"src_slot\":\"bool\",\"dst_slot\":\"condition\",\"uid\":\"hU6cHehDR4S2\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ku82rHVtzc3U\",\"dst_nuid\":\"CzY4R5DG8Ngp\",\"src_slot\":\"trigger\",\"dst_slot\":\"b\",\"uid\":\"JBZxqQyN7ezb\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"By2yEd5HvDaM\",\"dst_nuid\":\"xzVb86bFBakQ\",\"src_slot\":\"trigger\",\"dst_slot\":\"a\",\"uid\":\"d7sxVBzMTkmD\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"xzVb86bFBakQ\",\"dst_nuid\":\"29aKewDaMPRP\",\"src_slot\":\"bool\",\"dst_slot\":\"condition\",\"uid\":\"aar98HW88JeJ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"fgNspapYWJrs\",\"dst_nuid\":\"xzVb86bFBakQ\",\"src_slot\":\"trigger\",\"dst_slot\":\"b\",\"uid\":\"7JGmyXr44JJz\",\"src_connected\":true,\"dst_connected\":true}],\"variables\":[{\"id\":\"Variable 1\",\"dt\":0}]},\"dyn_out\":[{\"name\":\"variable\",\"dt\":0,\"index\":0,\"uid\":\"LKvsR9mDw7Zs\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":770,\"y\":248,\"uid\":\"h89tKd8ePE89\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"tA2wPwXZLuxQ\":\"xbephyP6fRzD\"}},\"title\":\"Scene 2\",\"graph\":{\"uid\":\"V8LfC24TmdRA\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":889,\"y\":316,\"uid\":\"Sv73PEceurZD\",\"state\":{\"always_update\":true,\"input_sids\":{\"TMRjebMjU85E\":\"lOz0fKTfMesH\"},\"output_sids\":{\"RNq7ZRFQrF5w\":\"mh0rTKkFm0nD\"}},\"title\":\"360 photo\",\"graph\":{\"uid\":\"VEAG5fT2Lfu9\",\"parent_uid\":\"V8LfC24TmdRA\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1252,\"y\":373,\"uid\":\"4JshTZsJv9La\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1438,\"y\":405,\"uid\":\"RNq7ZRFQrF5w\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_material\",\"x\":974,\"y\":130,\"uid\":\"p82RmnRgFGWt\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":723,\"y\":214,\"uid\":\"czuKwEuMCKVa\",\"state\":{\"val\":1},\"title\":\"Side\"},{\"plugin\":\"three_uv_modifier\",\"x\":553,\"y\":87,\"uid\":\"uhRMSfefnWsa\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":297,\"y\":197,\"uid\":\"ezLKD68ZE7wG\",\"state\":{\"val\":-1},\"title\":\"X repeat photo\"},{\"plugin\":\"input_proxy\",\"x\":321,\"y\":122,\"uid\":\"TMRjebMjU85E\",\"title\":\"texture\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"q2TtZnBOutlf\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_geometry_sphere\",\"x\":939,\"y\":467,\"uid\":\"hRvEtsPDEbVM\"},{\"plugin\":\"const_float_generator\",\"x\":670,\"y\":421,\"uid\":\"P9NHQ42gqJGp\",\"state\":{\"val\":30},\"title\":\"Radius\"},{\"plugin\":\"const_float_generator\",\"x\":676,\"y\":502,\"uid\":\"BA2N9bNqV4hF\",\"state\":{\"val\":40},\"title\":\"Width Segments\"},{\"plugin\":\"const_float_generator\",\"x\":678,\"y\":584,\"uid\":\"TkKPCSPUyAXB\",\"state\":{\"val\":40},\"title\":\"Height Segments\"},{\"plugin\":\"toggle_button\",\"x\":724,\"y\":292,\"uid\":\"xxEkGtF7kevn\",\"state\":{\"enabled\":false},\"title\":\"Fog\"}],\"conns\":[{\"src_nuid\":\"4JshTZsJv9La\",\"dst_nuid\":\"RNq7ZRFQrF5w\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"Nz9gEbH2Xvvu\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"p82RmnRgFGWt\",\"dst_nuid\":\"4JshTZsJv9La\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"eHEPAJQwcSqR\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"czuKwEuMCKVa\",\"dst_nuid\":\"p82RmnRgFGWt\",\"src_slot\":\"value\",\"dst_slot\":\"side\",\"uid\":\"xKqXSkM9D8Kw\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"uhRMSfefnWsa\",\"dst_nuid\":\"p82RmnRgFGWt\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"xeFZrXuqxbRu\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ezLKD68ZE7wG\",\"dst_nuid\":\"uhRMSfefnWsa\",\"src_slot\":\"value\",\"dst_slot\":\"u repeat\",\"uid\":\"6jTZFQNznkLx\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"TMRjebMjU85E\",\"dst_nuid\":\"uhRMSfefnWsa\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"7pAYPxV4Uz6s\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"P9NHQ42gqJGp\",\"dst_nuid\":\"hRvEtsPDEbVM\",\"src_slot\":\"value\",\"dst_slot\":\"radius\",\"uid\":\"tReL45UNmqC5\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"BA2N9bNqV4hF\",\"dst_nuid\":\"hRvEtsPDEbVM\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"p3pSp32ejLTF\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"TkKPCSPUyAXB\",\"dst_nuid\":\"hRvEtsPDEbVM\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"xYMDTEF9LSvh\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"hRvEtsPDEbVM\",\"dst_nuid\":\"4JshTZsJv9La\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"uLQ58ykMG3hz\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"xxEkGtF7kevn\",\"dst_nuid\":\"p82RmnRgFGWt\",\"src_slot\":\"bool\",\"dst_slot\":\"fog\",\"uid\":\"h3aMajmG8KhS\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"texture\",\"dt\":2,\"index\":0,\"uid\":\"lOz0fKTfMesH\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":639,\"y\":298,\"uid\":\"896fqz8VKyQp\",\"state\":{\"url\":\"/data/image/f9240f43bb25e7c058c572121282bf37afbb0a0d.jpg\"}},{\"plugin\":\"three_scene\",\"x\":1179,\"y\":317,\"uid\":\"QpQ9Xfa28CkZ\",\"title\":\"Scene 1\",\"dyn_in\":[{\"type\":0,\"name\":\"0\",\"dt\":21,\"array\":true,\"uid\":\"DDzcOXqI6iRM\",\"dynamic\":true,\"index\":0,\"is_connected\":true},{\"type\":0,\"name\":\"1\",\"dt\":21,\"array\":true,\"uid\":\"gH5pmBKZK4lm\",\"dynamic\":true,\"index\":1,\"is_connected\":true},{\"type\":0,\"name\":\"2\",\"dt\":21,\"array\":true,\"uid\":\"nW2DuQNevrLR\",\"dynamic\":true,\"index\":2,\"is_connected\":true},{\"type\":0,\"name\":\"3\",\"dt\":21,\"array\":true,\"uid\":\"Qhvuw3hYvxpk\",\"dynamic\":true,\"index\":3,\"is_connected\":false},{\"type\":0,\"name\":\"4\",\"dt\":21,\"array\":true,\"uid\":\"xsJVdRqz2u5R\",\"dynamic\":true,\"index\":4,\"is_connected\":false},{\"type\":0,\"name\":\"5\",\"dt\":21,\"array\":true,\"uid\":\"6YA7VwBjNd9M\",\"dynamic\":true,\"index\":5}]},{\"plugin\":\"output_proxy\",\"x\":1369,\"y\":303,\"uid\":\"tA2wPwXZLuxQ\",\"title\":\"scene\",\"dyn_in\":[{\"name\":\"output\",\"dt\":11,\"def\":null,\"uid\":\"RSDfFzqVXHXX\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"graph\",\"x\":865,\"y\":492,\"uid\":\"eR5wjeZTrt9Z\",\"state\":{\"always_update\":true,\"input_sids\":{\"wA4m3qYft3bA\":\"KQg2KDxbURhR\"},\"output_sids\":{\"vCt4fpVEc2cT\":\"mh0rTKkFm0nD\"}},\"title\":\"Arrow to 1\",\"graph\":{\"uid\":\"EgG5ke9rN7gw\",\"parent_uid\":\"V8LfC24TmdRA\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1219,\"y\":454,\"uid\":\"JFJBjBpxFLBg\",\"state\":{\"position\":{\"x\":2.58,\"y\":-1.2800000000000002,\"z\":5.64},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":-0.5058357396770016,\"_y\":-0.4113109690521822,\"_z\":-0.4979966630453013,\"_w\":0.57179787932321}}},{\"plugin\":\"output_proxy\",\"x\":1418,\"y\":453,\"uid\":\"vCt4fpVEc2cT\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":669,\"y\":542,\"uid\":\"KuumYLdv2L2X\",\"state\":{\"val\":16},\"title\":\"Segments\"},{\"plugin\":\"three_geometry_plane\",\"x\":925,\"y\":466,\"uid\":\"Y92ApEZ464Fp\"},{\"plugin\":\"three_material\",\"x\":719,\"y\":90,\"uid\":\"BXBUMxCz6xvz\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":664,\"y\":451,\"uid\":\"PzsEy8NPzRFD\",\"state\":{\"val\":1},\"title\":\"Width & Height\"},{\"plugin\":\"input_proxy\",\"x\":320,\"y\":223,\"uid\":\"wA4m3qYft3bA\",\"title\":\"arrow\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"TCVNVQDbGTpd\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"toggle_button\",\"x\":414,\"y\":479,\"uid\":\"werr7PZvze7P\",\"state\":{\"enabled\":true}}],\"conns\":[{\"src_nuid\":\"JFJBjBpxFLBg\",\"dst_nuid\":\"vCt4fpVEc2cT\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"x3CYsYKzQKzK\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"Y92ApEZ464Fp\",\"dst_nuid\":\"JFJBjBpxFLBg\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"3r5FnQvPdPqF\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"BXBUMxCz6xvz\",\"dst_nuid\":\"JFJBjBpxFLBg\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"N8ttGA5ENkLy\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"PzsEy8NPzRFD\",\"dst_nuid\":\"Y92ApEZ464Fp\",\"src_slot\":\"value\",\"dst_slot\":\"width\",\"uid\":\"AhAAqyqCCyWS\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"PzsEy8NPzRFD\",\"dst_nuid\":\"Y92ApEZ464Fp\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"ds6qqnRhDymL\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"KuumYLdv2L2X\",\"dst_nuid\":\"Y92ApEZ464Fp\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"kuPSWnAh592e\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"KuumYLdv2L2X\",\"dst_nuid\":\"Y92ApEZ464Fp\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"SEUTvVByr6sN\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"wA4m3qYft3bA\",\"dst_nuid\":\"BXBUMxCz6xvz\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"WrvDyLGVZj8q\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"werr7PZvze7P\",\"dst_nuid\":\"BXBUMxCz6xvz\",\"src_slot\":\"bool\",\"dst_slot\":\"transparent\",\"uid\":\"AgAMtjEDHhyt\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"arrow\",\"dt\":2,\"index\":0,\"uid\":\"KQg2KDxbURhR\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":628,\"y\":482,\"uid\":\"6XHTztfkj5XW\",\"state\":{\"url\":\"/data/image/f99f293b9cf27a0cb4d282cb891d9f7346f1f1b1.png\"},\"title\":\"Texture\"},{\"plugin\":\"graph\",\"x\":884,\"y\":674,\"uid\":\"HU25yWPzcZpR\",\"state\":{\"always_update\":true,\"input_sids\":{\"bHrvPmJAQRRc\":\"KQg2KDxbURhR\"},\"output_sids\":{\"JrhScupAueSr\":\"mh0rTKkFm0nD\"}},\"title\":\"Arrow to 3\",\"graph\":{\"uid\":\"ez7Pyu8PpcYR\",\"parent_uid\":\"V8LfC24TmdRA\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1219,\"y\":454,\"uid\":\"LCxFfvSpfYvV\",\"state\":{\"position\":{\"x\":-3.933713981889869,\"y\":-0.7317978705791764,\"z\":5.075083900848185},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":-0.4679619668890721,\"_y\":0.5264209744598571,\"_z\":0.4462238175495447,\"_w\":0.5520659922921861}}},{\"plugin\":\"output_proxy\",\"x\":1418,\"y\":453,\"uid\":\"JrhScupAueSr\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":669,\"y\":542,\"uid\":\"qdtSB3hJgZdd\",\"state\":{\"val\":16},\"title\":\"Segments\"},{\"plugin\":\"three_geometry_plane\",\"x\":925,\"y\":466,\"uid\":\"Fq2XUnu4gSLH\"},{\"plugin\":\"three_material\",\"x\":719,\"y\":90,\"uid\":\"6veGpjJmLyYf\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":664,\"y\":451,\"uid\":\"k8FCzVcddGy6\",\"state\":{\"val\":1},\"title\":\"Width & Height\"},{\"plugin\":\"input_proxy\",\"x\":320,\"y\":223,\"uid\":\"bHrvPmJAQRRc\",\"title\":\"arrow\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"TCVNVQDbGTpd\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"toggle_button\",\"x\":414,\"y\":479,\"uid\":\"CbzNHHPNZuHu\",\"state\":{\"enabled\":true}}],\"conns\":[{\"src_nuid\":\"LCxFfvSpfYvV\",\"dst_nuid\":\"JrhScupAueSr\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"pQZYndHaQPZz\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"Fq2XUnu4gSLH\",\"dst_nuid\":\"LCxFfvSpfYvV\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"b3qC8XAJm4qv\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"6veGpjJmLyYf\",\"dst_nuid\":\"LCxFfvSpfYvV\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"Y3gkBWFxEmkg\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"k8FCzVcddGy6\",\"dst_nuid\":\"Fq2XUnu4gSLH\",\"src_slot\":\"value\",\"dst_slot\":\"width\",\"uid\":\"6xFNnHP5jwZc\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"k8FCzVcddGy6\",\"dst_nuid\":\"Fq2XUnu4gSLH\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"eKUy8fDGPKfa\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"qdtSB3hJgZdd\",\"dst_nuid\":\"Fq2XUnu4gSLH\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"jEmjruzYuvuX\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"qdtSB3hJgZdd\",\"dst_nuid\":\"Fq2XUnu4gSLH\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"eAzMKQ84pYbD\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"bHrvPmJAQRRc\",\"dst_nuid\":\"6veGpjJmLyYf\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"KxSQeU8nQ89x\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"CbzNHHPNZuHu\",\"dst_nuid\":\"6veGpjJmLyYf\",\"src_slot\":\"bool\",\"dst_slot\":\"transparent\",\"uid\":\"TBc9s8hCpNhq\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"arrow\",\"dt\":2,\"index\":0,\"uid\":\"KQg2KDxbURhR\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":647,\"y\":664,\"uid\":\"6GvnAfUDCafP\",\"state\":{\"url\":\"/data/image/f99f293b9cf27a0cb4d282cb891d9f7346f1f1b1.png\"},\"title\":\"Texture\"}],\"conns\":[{\"src_nuid\":\"896fqz8VKyQp\",\"dst_nuid\":\"Sv73PEceurZD\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"HhJMNeWLybXc\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"Sv73PEceurZD\",\"dst_nuid\":\"QpQ9Xfa28CkZ\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"7YwG3pQMwF4Z\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"QpQ9Xfa28CkZ\",\"dst_nuid\":\"tA2wPwXZLuxQ\",\"src_slot\":\"scene\",\"dst_slot\":0,\"uid\":\"5GZts74nT92A\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"eR5wjeZTrt9Z\",\"dst_nuid\":\"QpQ9Xfa28CkZ\",\"src_slot\":0,\"dst_slot\":1,\"uid\":\"X3MfYBGqzyuh\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"6XHTztfkj5XW\",\"dst_nuid\":\"eR5wjeZTrt9Z\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"P7tMmMA57a4p\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"6GvnAfUDCafP\",\"dst_nuid\":\"HU25yWPzcZpR\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"efLsygC2hsyS\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"HU25yWPzcZpR\",\"dst_nuid\":\"QpQ9Xfa28CkZ\",\"src_slot\":0,\"dst_slot\":2,\"uid\":\"94cSYyZ5RNJz\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"scene\",\"dt\":11,\"index\":0,\"uid\":\"xbephyP6fRzD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":775,\"y\":328,\"uid\":\"Raev2Ne75Xvg\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"yDhKHjc4tQmP\":\"xbephyP6fRzD\"}},\"title\":\"Scene 3\",\"graph\":{\"uid\":\"9bZw7qbLZTYb\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":909,\"y\":327,\"uid\":\"8yeKJ5au8hnK\",\"state\":{\"always_update\":true,\"input_sids\":{\"Zee9Hu9mzG3k\":\"lOz0fKTfMesH\"},\"output_sids\":{\"s28UjP6MQ9pF\":\"mh0rTKkFm0nD\"}},\"title\":\"360 photo\",\"graph\":{\"uid\":\"9SnUHWaKUqUr\",\"parent_uid\":\"9bZw7qbLZTYb\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1252,\"y\":373,\"uid\":\"GtYeA6gEswHs\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1438,\"y\":405,\"uid\":\"s28UjP6MQ9pF\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_material\",\"x\":974,\"y\":130,\"uid\":\"8H8dZ3v7X8jR\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":723,\"y\":214,\"uid\":\"hSAZ3LkETCQy\",\"state\":{\"val\":1},\"title\":\"Side\"},{\"plugin\":\"three_uv_modifier\",\"x\":553,\"y\":87,\"uid\":\"TwpvBktwbYD4\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":297,\"y\":197,\"uid\":\"6rvBU4NXRjPD\",\"state\":{\"val\":-1},\"title\":\"X repeat photo\"},{\"plugin\":\"input_proxy\",\"x\":321,\"y\":122,\"uid\":\"Zee9Hu9mzG3k\",\"title\":\"texture\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"q2TtZnBOutlf\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_geometry_sphere\",\"x\":939,\"y\":467,\"uid\":\"LJW34Ass9tka\"},{\"plugin\":\"const_float_generator\",\"x\":670,\"y\":421,\"uid\":\"gUUvzA4Rmdej\",\"state\":{\"val\":30},\"title\":\"Radius\"},{\"plugin\":\"const_float_generator\",\"x\":676,\"y\":502,\"uid\":\"aQw4TcyVFjzg\",\"state\":{\"val\":40},\"title\":\"Width Segments\"},{\"plugin\":\"const_float_generator\",\"x\":678,\"y\":584,\"uid\":\"Y2Ed8EKU9SRF\",\"state\":{\"val\":40},\"title\":\"Height Segments\"},{\"plugin\":\"toggle_button\",\"x\":724,\"y\":292,\"uid\":\"QgfZmVBVAeMh\",\"state\":{\"enabled\":false},\"title\":\"Fog\"}],\"conns\":[{\"src_nuid\":\"GtYeA6gEswHs\",\"dst_nuid\":\"s28UjP6MQ9pF\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"Bhmu5f7Bfu83\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"8H8dZ3v7X8jR\",\"dst_nuid\":\"GtYeA6gEswHs\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"H5R9mp4M4j6A\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"hSAZ3LkETCQy\",\"dst_nuid\":\"8H8dZ3v7X8jR\",\"src_slot\":\"value\",\"dst_slot\":\"side\",\"uid\":\"Yn9WfrUdC3Mc\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"TwpvBktwbYD4\",\"dst_nuid\":\"8H8dZ3v7X8jR\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"cZdzeQzFq2kB\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"6rvBU4NXRjPD\",\"dst_nuid\":\"TwpvBktwbYD4\",\"src_slot\":\"value\",\"dst_slot\":\"u repeat\",\"uid\":\"krGwXANrZpJG\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Zee9Hu9mzG3k\",\"dst_nuid\":\"TwpvBktwbYD4\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"rYYVGLERbx8Q\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"gUUvzA4Rmdej\",\"dst_nuid\":\"LJW34Ass9tka\",\"src_slot\":\"value\",\"dst_slot\":\"radius\",\"uid\":\"ZJYatTEDwarK\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"aQw4TcyVFjzg\",\"dst_nuid\":\"LJW34Ass9tka\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"KAbLwgZYgADF\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Y2Ed8EKU9SRF\",\"dst_nuid\":\"LJW34Ass9tka\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"Kevs2jDrYUCG\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"LJW34Ass9tka\",\"dst_nuid\":\"GtYeA6gEswHs\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"CNFS6GPCKj7z\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"QgfZmVBVAeMh\",\"dst_nuid\":\"8H8dZ3v7X8jR\",\"src_slot\":\"bool\",\"dst_slot\":\"fog\",\"uid\":\"rm5SwVCUNtWT\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"texture\",\"dt\":2,\"index\":0,\"uid\":\"lOz0fKTfMesH\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":639,\"y\":298,\"uid\":\"6KNYAdRcDEcr\",\"state\":{\"url\":\"/data/image/0fa7fa70a4a21c91fd0e3a661ee1906cc6656e33.jpg\"}},{\"plugin\":\"three_scene\",\"x\":1179,\"y\":317,\"uid\":\"A7PSN7j9Bwtv\",\"title\":\"Scene 1\",\"dyn_in\":[{\"type\":0,\"name\":\"0\",\"dt\":21,\"array\":true,\"uid\":\"DDzcOXqI6iRM\",\"dynamic\":true,\"index\":0,\"is_connected\":true},{\"type\":0,\"name\":\"1\",\"dt\":21,\"array\":true,\"uid\":\"gH5pmBKZK4lm\",\"dynamic\":true,\"index\":1,\"is_connected\":true},{\"type\":0,\"name\":\"2\",\"dt\":21,\"array\":true,\"uid\":\"nW2DuQNevrLR\",\"dynamic\":true,\"index\":2,\"is_connected\":true},{\"type\":0,\"name\":\"3\",\"dt\":21,\"array\":true,\"uid\":\"Qhvuw3hYvxpk\",\"dynamic\":true,\"index\":3,\"is_connected\":false},{\"type\":0,\"name\":\"4\",\"dt\":21,\"array\":true,\"uid\":\"xsJVdRqz2u5R\",\"dynamic\":true,\"index\":4,\"is_connected\":false},{\"type\":0,\"name\":\"5\",\"dt\":21,\"array\":true,\"uid\":\"6YA7VwBjNd9M\",\"dynamic\":true,\"index\":5}]},{\"plugin\":\"output_proxy\",\"x\":1369,\"y\":303,\"uid\":\"yDhKHjc4tQmP\",\"title\":\"scene\",\"dyn_in\":[{\"name\":\"output\",\"dt\":11,\"def\":null,\"uid\":\"RSDfFzqVXHXX\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"graph\",\"x\":865,\"y\":492,\"uid\":\"ydHQ6ZHv3a2T\",\"state\":{\"always_update\":true,\"input_sids\":{\"URg2GxuMwKFh\":\"KQg2KDxbURhR\"},\"output_sids\":{\"QN6rAYwGbDza\":\"mh0rTKkFm0nD\"}},\"title\":\"Arrow to 2\",\"graph\":{\"uid\":\"rRVawZqmQzgc\",\"parent_uid\":\"9bZw7qbLZTYb\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1219,\"y\":454,\"uid\":\"8NzThQ2G8ddz\",\"state\":{\"position\":{\"x\":3.414831286929875,\"y\":-1.1822784186886044,\"z\":5.610657153351654},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":-0.4923664503955314,\"_y\":-0.49919473323933505,\"_z\":-0.43516855657629544,\"_w\":0.5648081304286592}}},{\"plugin\":\"output_proxy\",\"x\":1418,\"y\":453,\"uid\":\"QN6rAYwGbDza\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":669,\"y\":542,\"uid\":\"gQrPULvnnLRq\",\"state\":{\"val\":16},\"title\":\"Segments\"},{\"plugin\":\"three_geometry_plane\",\"x\":925,\"y\":466,\"uid\":\"RbL98tDSJ4CQ\"},{\"plugin\":\"three_material\",\"x\":719,\"y\":90,\"uid\":\"NhPDDn8Yp98K\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":664,\"y\":451,\"uid\":\"BXBgCrA9zjqR\",\"state\":{\"val\":1},\"title\":\"Width & Height\"},{\"plugin\":\"input_proxy\",\"x\":320,\"y\":223,\"uid\":\"URg2GxuMwKFh\",\"title\":\"arrow\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"TCVNVQDbGTpd\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"toggle_button\",\"x\":414,\"y\":479,\"uid\":\"7YKwXSprY9Ve\",\"state\":{\"enabled\":true}}],\"conns\":[{\"src_nuid\":\"8NzThQ2G8ddz\",\"dst_nuid\":\"QN6rAYwGbDza\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"vh366THFM9Xf\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"RbL98tDSJ4CQ\",\"dst_nuid\":\"8NzThQ2G8ddz\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"Cfzv5K369wVa\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"NhPDDn8Yp98K\",\"dst_nuid\":\"8NzThQ2G8ddz\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"KpYcBgSpYepA\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"BXBgCrA9zjqR\",\"dst_nuid\":\"RbL98tDSJ4CQ\",\"src_slot\":\"value\",\"dst_slot\":\"width\",\"uid\":\"4McXpJLWkrx5\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"BXBgCrA9zjqR\",\"dst_nuid\":\"RbL98tDSJ4CQ\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"xEJavHUdDNut\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"gQrPULvnnLRq\",\"dst_nuid\":\"RbL98tDSJ4CQ\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"tP6ePYWv5KYv\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"gQrPULvnnLRq\",\"dst_nuid\":\"RbL98tDSJ4CQ\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"JmHELM6YYWk4\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"URg2GxuMwKFh\",\"dst_nuid\":\"NhPDDn8Yp98K\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"XHXChE2h9TJF\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"7YKwXSprY9Ve\",\"dst_nuid\":\"NhPDDn8Yp98K\",\"src_slot\":\"bool\",\"dst_slot\":\"transparent\",\"uid\":\"UdZtJhPEmbkQ\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"arrow\",\"dt\":2,\"index\":0,\"uid\":\"KQg2KDxbURhR\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":628,\"y\":482,\"uid\":\"X9e9Zmtp8nYs\",\"state\":{\"url\":\"/data/image/f99f293b9cf27a0cb4d282cb891d9f7346f1f1b1.png\"},\"title\":\"Texture\"},{\"plugin\":\"graph\",\"x\":884,\"y\":674,\"uid\":\"mdfZMDrs3UQW\",\"state\":{\"always_update\":true,\"input_sids\":{\"mUccKE8bucLe\":\"KQg2KDxbURhR\"},\"output_sids\":{\"r7Md8Dq9k9s6\":\"mh0rTKkFm0nD\"}},\"title\":\"Arrow to 4\",\"graph\":{\"uid\":\"GR7tSEBz2MGT\",\"parent_uid\":\"9bZw7qbLZTYb\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1219,\"y\":454,\"uid\":\"ErfuFUJc3fZd\",\"state\":{\"position\":{\"x\":-4.931402149793488,\"y\":-0.5659601761245598,\"z\":5.027609605313165},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":-0.47946601334137684,\"_y\":0.5118105279323352,\"_z\":0.4338391887475609,\"_w\":0.5656375905604306}}},{\"plugin\":\"output_proxy\",\"x\":1418,\"y\":453,\"uid\":\"r7Md8Dq9k9s6\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":669,\"y\":542,\"uid\":\"tJSjp47TwSuv\",\"state\":{\"val\":16},\"title\":\"Segments\"},{\"plugin\":\"three_geometry_plane\",\"x\":925,\"y\":466,\"uid\":\"fYVKw87bDasS\"},{\"plugin\":\"three_material\",\"x\":719,\"y\":90,\"uid\":\"DyF9YVCsY9cC\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":664,\"y\":451,\"uid\":\"GvNf79g5YGTD\",\"state\":{\"val\":1},\"title\":\"Width & Height\"},{\"plugin\":\"input_proxy\",\"x\":320,\"y\":223,\"uid\":\"mUccKE8bucLe\",\"title\":\"arrow\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"TCVNVQDbGTpd\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"toggle_button\",\"x\":414,\"y\":479,\"uid\":\"RhdX8FzKfKuD\",\"state\":{\"enabled\":true}}],\"conns\":[{\"src_nuid\":\"ErfuFUJc3fZd\",\"dst_nuid\":\"r7Md8Dq9k9s6\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"F5wLL4T5dsJ2\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"fYVKw87bDasS\",\"dst_nuid\":\"ErfuFUJc3fZd\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"CuxQ3gXFCJHa\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"DyF9YVCsY9cC\",\"dst_nuid\":\"ErfuFUJc3fZd\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"23PGXvkUUKYT\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"GvNf79g5YGTD\",\"dst_nuid\":\"fYVKw87bDasS\",\"src_slot\":\"value\",\"dst_slot\":\"width\",\"uid\":\"njbKtcmG9Vdr\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"GvNf79g5YGTD\",\"dst_nuid\":\"fYVKw87bDasS\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"v47r2pe5PVbN\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"tJSjp47TwSuv\",\"dst_nuid\":\"fYVKw87bDasS\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"Qab4aV6Gxwby\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"tJSjp47TwSuv\",\"dst_nuid\":\"fYVKw87bDasS\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"NKRA9wEfdAWV\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"mUccKE8bucLe\",\"dst_nuid\":\"DyF9YVCsY9cC\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"DHqfxjDJacbA\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"RhdX8FzKfKuD\",\"dst_nuid\":\"DyF9YVCsY9cC\",\"src_slot\":\"bool\",\"dst_slot\":\"transparent\",\"uid\":\"rEjq8na5zUrD\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"arrow\",\"dt\":2,\"index\":0,\"uid\":\"KQg2KDxbURhR\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":647,\"y\":664,\"uid\":\"tT6ZH6uhzpCn\",\"state\":{\"url\":\"/data/image/f99f293b9cf27a0cb4d282cb891d9f7346f1f1b1.png\"},\"title\":\"Texture\"}],\"conns\":[{\"src_nuid\":\"6KNYAdRcDEcr\",\"dst_nuid\":\"8yeKJ5au8hnK\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"bCdWrKqEGWBY\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"8yeKJ5au8hnK\",\"dst_nuid\":\"A7PSN7j9Bwtv\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"VbcSZ7C6Ejfy\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"A7PSN7j9Bwtv\",\"dst_nuid\":\"yDhKHjc4tQmP\",\"src_slot\":\"scene\",\"dst_slot\":0,\"uid\":\"XMrsTUtmHmLY\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"ydHQ6ZHv3a2T\",\"dst_nuid\":\"A7PSN7j9Bwtv\",\"src_slot\":0,\"dst_slot\":1,\"uid\":\"qUybM5Rk2Cqd\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"X9e9Zmtp8nYs\",\"dst_nuid\":\"ydHQ6ZHv3a2T\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"YbAYqvsmz6ya\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"tT6ZH6uhzpCn\",\"dst_nuid\":\"mdfZMDrs3UQW\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"htGcghDfjRD8\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"mdfZMDrs3UQW\",\"dst_nuid\":\"A7PSN7j9Bwtv\",\"src_slot\":0,\"dst_slot\":2,\"uid\":\"wSjBZz4RwqUa\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"scene\",\"dt\":11,\"index\":0,\"uid\":\"xbephyP6fRzD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":770,\"y\":399,\"uid\":\"Bu54LvjppPWC\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"f2wyKeRcxSKg\":\"xbephyP6fRzD\"}},\"title\":\"Scene 4\",\"graph\":{\"uid\":\"GzmBZnvJBgev\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":909,\"y\":327,\"uid\":\"kvMLr5pT8Pap\",\"state\":{\"always_update\":true,\"input_sids\":{\"VDPL8K6BsFdA\":\"lOz0fKTfMesH\"},\"output_sids\":{\"acXFcvwB7xX8\":\"mh0rTKkFm0nD\"}},\"title\":\"360 photo\",\"graph\":{\"uid\":\"mNjvUC3MwHgh\",\"parent_uid\":\"GzmBZnvJBgev\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1252,\"y\":373,\"uid\":\"XNCu74fnRNMf\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1438,\"y\":405,\"uid\":\"acXFcvwB7xX8\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_material\",\"x\":974,\"y\":130,\"uid\":\"7uYrmATtUWax\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":723,\"y\":214,\"uid\":\"UzspfhdzeW4c\",\"state\":{\"val\":1},\"title\":\"Side\"},{\"plugin\":\"three_uv_modifier\",\"x\":553,\"y\":87,\"uid\":\"Knaw5pwrZDLc\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":297,\"y\":197,\"uid\":\"EqAeFJpVrAwy\",\"state\":{\"val\":-1},\"title\":\"X repeat photo\"},{\"plugin\":\"input_proxy\",\"x\":321,\"y\":122,\"uid\":\"VDPL8K6BsFdA\",\"title\":\"texture\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"q2TtZnBOutlf\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_geometry_sphere\",\"x\":939,\"y\":467,\"uid\":\"ar9X5rDhazmU\"},{\"plugin\":\"const_float_generator\",\"x\":670,\"y\":421,\"uid\":\"xPA3dj3pfRuL\",\"state\":{\"val\":30},\"title\":\"Radius\"},{\"plugin\":\"const_float_generator\",\"x\":676,\"y\":502,\"uid\":\"uFKCmj4GUjJR\",\"state\":{\"val\":40},\"title\":\"Width Segments\"},{\"plugin\":\"const_float_generator\",\"x\":678,\"y\":584,\"uid\":\"2jBS8PDUbS68\",\"state\":{\"val\":40},\"title\":\"Height Segments\"},{\"plugin\":\"toggle_button\",\"x\":724,\"y\":292,\"uid\":\"mkkz9ebe9mWR\",\"state\":{\"enabled\":false},\"title\":\"Fog\"}],\"conns\":[{\"src_nuid\":\"XNCu74fnRNMf\",\"dst_nuid\":\"acXFcvwB7xX8\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"39RLYc3GEfZb\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"7uYrmATtUWax\",\"dst_nuid\":\"XNCu74fnRNMf\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"UuNsvqWN23Rg\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"UzspfhdzeW4c\",\"dst_nuid\":\"7uYrmATtUWax\",\"src_slot\":\"value\",\"dst_slot\":\"side\",\"uid\":\"DheyYrq7ucQX\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Knaw5pwrZDLc\",\"dst_nuid\":\"7uYrmATtUWax\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"sbDN7My4yB5S\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"EqAeFJpVrAwy\",\"dst_nuid\":\"Knaw5pwrZDLc\",\"src_slot\":\"value\",\"dst_slot\":\"u repeat\",\"uid\":\"McAFaqdk8QCe\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"VDPL8K6BsFdA\",\"dst_nuid\":\"Knaw5pwrZDLc\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"GUBzFCUVp9F7\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"xPA3dj3pfRuL\",\"dst_nuid\":\"ar9X5rDhazmU\",\"src_slot\":\"value\",\"dst_slot\":\"radius\",\"uid\":\"ExGnGr7eKaWw\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"uFKCmj4GUjJR\",\"dst_nuid\":\"ar9X5rDhazmU\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"UMnpUCbBReyy\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"2jBS8PDUbS68\",\"dst_nuid\":\"ar9X5rDhazmU\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"YNxSbENXZWXM\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ar9X5rDhazmU\",\"dst_nuid\":\"XNCu74fnRNMf\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"amZfUbnV7FFR\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"mkkz9ebe9mWR\",\"dst_nuid\":\"7uYrmATtUWax\",\"src_slot\":\"bool\",\"dst_slot\":\"fog\",\"uid\":\"7F7AYzBER8F3\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"texture\",\"dt\":2,\"index\":0,\"uid\":\"lOz0fKTfMesH\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":639,\"y\":298,\"uid\":\"7hm8MC9rZpEJ\",\"state\":{\"url\":\"/data/image/a27cfb080ad36bd4190a906023f4d15b25f9357c.jpg\"}},{\"plugin\":\"three_scene\",\"x\":1179,\"y\":317,\"uid\":\"C4baUTeFspuk\",\"title\":\"Scene 1\",\"dyn_in\":[{\"type\":0,\"name\":\"0\",\"dt\":21,\"array\":true,\"uid\":\"DDzcOXqI6iRM\",\"dynamic\":true,\"index\":0,\"is_connected\":true},{\"type\":0,\"name\":\"1\",\"dt\":21,\"array\":true,\"uid\":\"gH5pmBKZK4lm\",\"dynamic\":true,\"index\":1,\"is_connected\":true},{\"type\":0,\"name\":\"2\",\"dt\":21,\"array\":true,\"uid\":\"nW2DuQNevrLR\",\"dynamic\":true,\"index\":2,\"is_connected\":true},{\"type\":0,\"name\":\"3\",\"dt\":21,\"array\":true,\"uid\":\"Qhvuw3hYvxpk\",\"dynamic\":true,\"index\":3,\"is_connected\":false},{\"type\":0,\"name\":\"4\",\"dt\":21,\"array\":true,\"uid\":\"xsJVdRqz2u5R\",\"dynamic\":true,\"index\":4,\"is_connected\":false},{\"type\":0,\"name\":\"5\",\"dt\":21,\"array\":true,\"uid\":\"6YA7VwBjNd9M\",\"dynamic\":true,\"index\":5}]},{\"plugin\":\"output_proxy\",\"x\":1369,\"y\":303,\"uid\":\"f2wyKeRcxSKg\",\"title\":\"scene\",\"dyn_in\":[{\"name\":\"output\",\"dt\":11,\"def\":null,\"uid\":\"RSDfFzqVXHXX\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"graph\",\"x\":865,\"y\":492,\"uid\":\"pepgh5hmJdqu\",\"state\":{\"always_update\":true,\"input_sids\":{\"8fsrDNXQGmHq\":\"KQg2KDxbURhR\"},\"output_sids\":{\"pCEg4HBNWV5a\":\"mh0rTKkFm0nD\"}},\"title\":\"Arrow to 3\",\"graph\":{\"uid\":\"Dg2qFzPnqTAJ\",\"parent_uid\":\"GzmBZnvJBgev\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1219,\"y\":454,\"uid\":\"SueUR959kwms\",\"state\":{\"position\":{\"x\":2.4960743198383346,\"y\":-1.2262824616171084,\"z\":5.5139765469887445},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":-0.5503063265957701,\"_y\":-0.44492008552818163,\"_z\":-0.4484191955310989,\"_w\":0.5460121697192356}}},{\"plugin\":\"output_proxy\",\"x\":1418,\"y\":453,\"uid\":\"pCEg4HBNWV5a\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":669,\"y\":542,\"uid\":\"Zjw55AAgUWPE\",\"state\":{\"val\":16},\"title\":\"Segments\"},{\"plugin\":\"three_geometry_plane\",\"x\":925,\"y\":466,\"uid\":\"9X5NXYvPdGxL\"},{\"plugin\":\"three_material\",\"x\":719,\"y\":90,\"uid\":\"jHGSsJnyet84\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":664,\"y\":451,\"uid\":\"jgJq9fKTckwZ\",\"state\":{\"val\":1},\"title\":\"Width & Height\"},{\"plugin\":\"input_proxy\",\"x\":320,\"y\":223,\"uid\":\"8fsrDNXQGmHq\",\"title\":\"arrow\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"TCVNVQDbGTpd\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"toggle_button\",\"x\":414,\"y\":479,\"uid\":\"5p2KkFAhpT7R\",\"state\":{\"enabled\":true}}],\"conns\":[{\"src_nuid\":\"SueUR959kwms\",\"dst_nuid\":\"pCEg4HBNWV5a\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"QF4zNWnRhfLa\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"9X5NXYvPdGxL\",\"dst_nuid\":\"SueUR959kwms\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"ADcXnypFQ22z\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"jHGSsJnyet84\",\"dst_nuid\":\"SueUR959kwms\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"kGCjXbNb6aRG\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"jgJq9fKTckwZ\",\"dst_nuid\":\"9X5NXYvPdGxL\",\"src_slot\":\"value\",\"dst_slot\":\"width\",\"uid\":\"4cQap8CcWzCr\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"jgJq9fKTckwZ\",\"dst_nuid\":\"9X5NXYvPdGxL\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"agU9rUFfqC8Z\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Zjw55AAgUWPE\",\"dst_nuid\":\"9X5NXYvPdGxL\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"GerGsnvXdvPj\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Zjw55AAgUWPE\",\"dst_nuid\":\"9X5NXYvPdGxL\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"jC5KZm4qNepx\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"8fsrDNXQGmHq\",\"dst_nuid\":\"jHGSsJnyet84\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"g6BzGSUBrGhG\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"5p2KkFAhpT7R\",\"dst_nuid\":\"jHGSsJnyet84\",\"src_slot\":\"bool\",\"dst_slot\":\"transparent\",\"uid\":\"yBJHXhRuParj\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"arrow\",\"dt\":2,\"index\":0,\"uid\":\"KQg2KDxbURhR\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":628,\"y\":482,\"uid\":\"j5k4UbF8XpsS\",\"state\":{\"url\":\"/data/image/f99f293b9cf27a0cb4d282cb891d9f7346f1f1b1.png\"},\"title\":\"Texture\"},{\"plugin\":\"graph\",\"x\":884,\"y\":674,\"uid\":\"5qnwk8Ce5txV\",\"state\":{\"always_update\":true,\"input_sids\":{\"exCUpGaWT4N2\":\"KQg2KDxbURhR\"},\"output_sids\":{\"jzzMzvke6fCJ\":\"mh0rTKkFm0nD\"}},\"title\":\"Arrow to 5\",\"graph\":{\"uid\":\"7kMC9KJTnGDC\",\"parent_uid\":\"GzmBZnvJBgev\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1219,\"y\":454,\"uid\":\"UMdBR8AX47WQ\",\"state\":{\"position\":{\"x\":-3.6053565749244303,\"y\":-0.7876001075687582,\"z\":5.245557729450026},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":-0.4679619668890721,\"_y\":0.5264209744598571,\"_z\":0.4462238175495447,\"_w\":0.5520659922921861}}},{\"plugin\":\"output_proxy\",\"x\":1418,\"y\":453,\"uid\":\"jzzMzvke6fCJ\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":669,\"y\":542,\"uid\":\"EuEyTB4dT3Kc\",\"state\":{\"val\":16},\"title\":\"Segments\"},{\"plugin\":\"three_geometry_plane\",\"x\":925,\"y\":466,\"uid\":\"p5sGw4eME8r5\"},{\"plugin\":\"three_material\",\"x\":719,\"y\":90,\"uid\":\"5uvTrm3zSxUD\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":664,\"y\":451,\"uid\":\"TQG6yTbrdSTc\",\"state\":{\"val\":1},\"title\":\"Width & Height\"},{\"plugin\":\"input_proxy\",\"x\":320,\"y\":223,\"uid\":\"exCUpGaWT4N2\",\"title\":\"arrow\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"TCVNVQDbGTpd\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"toggle_button\",\"x\":414,\"y\":479,\"uid\":\"fMCwhdCnBreK\",\"state\":{\"enabled\":true}}],\"conns\":[{\"src_nuid\":\"UMdBR8AX47WQ\",\"dst_nuid\":\"jzzMzvke6fCJ\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"vw7DP2Ka93JP\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"p5sGw4eME8r5\",\"dst_nuid\":\"UMdBR8AX47WQ\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"w8ppM5QxFzwV\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5uvTrm3zSxUD\",\"dst_nuid\":\"UMdBR8AX47WQ\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"KFnbYhnmYu6u\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"TQG6yTbrdSTc\",\"dst_nuid\":\"p5sGw4eME8r5\",\"src_slot\":\"value\",\"dst_slot\":\"width\",\"uid\":\"LE8peMatJGzF\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"TQG6yTbrdSTc\",\"dst_nuid\":\"p5sGw4eME8r5\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"8cTMUWDfzcpc\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"EuEyTB4dT3Kc\",\"dst_nuid\":\"p5sGw4eME8r5\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"q8BbMeFmv5gD\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"EuEyTB4dT3Kc\",\"dst_nuid\":\"p5sGw4eME8r5\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"aGUbdYmvUK7d\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"exCUpGaWT4N2\",\"dst_nuid\":\"5uvTrm3zSxUD\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"FKrQgSfPmVgX\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"fMCwhdCnBreK\",\"dst_nuid\":\"5uvTrm3zSxUD\",\"src_slot\":\"bool\",\"dst_slot\":\"transparent\",\"uid\":\"BMjemqWPjE9D\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"arrow\",\"dt\":2,\"index\":0,\"uid\":\"KQg2KDxbURhR\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":647,\"y\":664,\"uid\":\"U6NTGuLBP5yp\",\"state\":{\"url\":\"/data/image/f99f293b9cf27a0cb4d282cb891d9f7346f1f1b1.png\"},\"title\":\"Texture\"}],\"conns\":[{\"src_nuid\":\"7hm8MC9rZpEJ\",\"dst_nuid\":\"kvMLr5pT8Pap\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"U7RfvtbGyFVS\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"kvMLr5pT8Pap\",\"dst_nuid\":\"C4baUTeFspuk\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"zFNDcBzbZDdc\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"C4baUTeFspuk\",\"dst_nuid\":\"f2wyKeRcxSKg\",\"src_slot\":\"scene\",\"dst_slot\":0,\"uid\":\"uKTzkDSWfMUE\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"pepgh5hmJdqu\",\"dst_nuid\":\"C4baUTeFspuk\",\"src_slot\":0,\"dst_slot\":1,\"uid\":\"qGpTmGPnaZTT\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"j5k4UbF8XpsS\",\"dst_nuid\":\"pepgh5hmJdqu\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"xsh8vj6jgKuW\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"U6NTGuLBP5yp\",\"dst_nuid\":\"5qnwk8Ce5txV\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"reS5vaayryJS\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"5qnwk8Ce5txV\",\"dst_nuid\":\"C4baUTeFspuk\",\"src_slot\":0,\"dst_slot\":2,\"uid\":\"6UdV9tCPJNZt\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"scene\",\"dt\":11,\"index\":0,\"uid\":\"xbephyP6fRzD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":772,\"y\":467,\"uid\":\"zy37UAgHF2eL\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"WL9uf4HkxxN8\":\"xbephyP6fRzD\"}},\"title\":\"Scene 5\",\"graph\":{\"uid\":\"peAfFuaAqWZj\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":909,\"y\":327,\"uid\":\"HfdnMwS7G93f\",\"state\":{\"always_update\":true,\"input_sids\":{\"RJ9ZNVCDHPtd\":\"lOz0fKTfMesH\"},\"output_sids\":{\"tvX2WQAgrHrK\":\"mh0rTKkFm0nD\"}},\"title\":\"360 photo\",\"graph\":{\"uid\":\"exWaEN3NVBDF\",\"parent_uid\":\"peAfFuaAqWZj\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1252,\"y\":373,\"uid\":\"dzbpbkx4SLZv\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1438,\"y\":405,\"uid\":\"tvX2WQAgrHrK\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_material\",\"x\":974,\"y\":130,\"uid\":\"aH8xdj9CVMXT\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":723,\"y\":214,\"uid\":\"6kEXpvsfhgNr\",\"state\":{\"val\":1},\"title\":\"Side\"},{\"plugin\":\"three_uv_modifier\",\"x\":553,\"y\":87,\"uid\":\"VxKRh9NEzMuT\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":297,\"y\":197,\"uid\":\"zkaBZgPwLKVy\",\"state\":{\"val\":-1},\"title\":\"X repeat photo\"},{\"plugin\":\"input_proxy\",\"x\":321,\"y\":122,\"uid\":\"RJ9ZNVCDHPtd\",\"title\":\"texture\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"q2TtZnBOutlf\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_geometry_sphere\",\"x\":939,\"y\":467,\"uid\":\"4BKnX4fbUpwp\"},{\"plugin\":\"const_float_generator\",\"x\":670,\"y\":421,\"uid\":\"j3Mm2RNrkmbm\",\"state\":{\"val\":30},\"title\":\"Radius\"},{\"plugin\":\"const_float_generator\",\"x\":676,\"y\":502,\"uid\":\"MxpQqnwt55Zz\",\"state\":{\"val\":40},\"title\":\"Width Segments\"},{\"plugin\":\"const_float_generator\",\"x\":678,\"y\":584,\"uid\":\"ZpzATuTeqSzp\",\"state\":{\"val\":40},\"title\":\"Height Segments\"},{\"plugin\":\"toggle_button\",\"x\":724,\"y\":292,\"uid\":\"eVKrfvDhUzZz\",\"state\":{\"enabled\":false},\"title\":\"Fog\"}],\"conns\":[{\"src_nuid\":\"dzbpbkx4SLZv\",\"dst_nuid\":\"tvX2WQAgrHrK\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"4VxVM4BhgChJ\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"aH8xdj9CVMXT\",\"dst_nuid\":\"dzbpbkx4SLZv\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"KQVeUFysxv6P\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"6kEXpvsfhgNr\",\"dst_nuid\":\"aH8xdj9CVMXT\",\"src_slot\":\"value\",\"dst_slot\":\"side\",\"uid\":\"2p9xGv3Cnvdz\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"VxKRh9NEzMuT\",\"dst_nuid\":\"aH8xdj9CVMXT\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"crKMFeqbHwPP\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"zkaBZgPwLKVy\",\"dst_nuid\":\"VxKRh9NEzMuT\",\"src_slot\":\"value\",\"dst_slot\":\"u repeat\",\"uid\":\"NSLMfdCFXM29\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"RJ9ZNVCDHPtd\",\"dst_nuid\":\"VxKRh9NEzMuT\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"mGW3jXcHSHWX\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"j3Mm2RNrkmbm\",\"dst_nuid\":\"4BKnX4fbUpwp\",\"src_slot\":\"value\",\"dst_slot\":\"radius\",\"uid\":\"Vc74dnbwEHRH\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"MxpQqnwt55Zz\",\"dst_nuid\":\"4BKnX4fbUpwp\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"zcGEw6zJauAy\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ZpzATuTeqSzp\",\"dst_nuid\":\"4BKnX4fbUpwp\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"DyXhU9SfjJbY\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"4BKnX4fbUpwp\",\"dst_nuid\":\"dzbpbkx4SLZv\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"3Xd6Afc48smy\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"eVKrfvDhUzZz\",\"dst_nuid\":\"aH8xdj9CVMXT\",\"src_slot\":\"bool\",\"dst_slot\":\"fog\",\"uid\":\"5cwkrKK5vnHU\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"texture\",\"dt\":2,\"index\":0,\"uid\":\"lOz0fKTfMesH\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":639,\"y\":298,\"uid\":\"3nXC9Uqd5P2U\",\"state\":{\"url\":\"/data/image/a1491a4411b470a6375cf119446aac14cb843576.jpg\"}},{\"plugin\":\"three_scene\",\"x\":1179,\"y\":317,\"uid\":\"nHvUf5KNYufS\",\"title\":\"Scene 1\",\"dyn_in\":[{\"type\":0,\"name\":\"0\",\"dt\":21,\"array\":true,\"uid\":\"DDzcOXqI6iRM\",\"dynamic\":true,\"index\":0,\"is_connected\":true},{\"type\":0,\"name\":\"1\",\"dt\":21,\"array\":true,\"uid\":\"gH5pmBKZK4lm\",\"dynamic\":true,\"index\":1,\"is_connected\":true},{\"type\":0,\"name\":\"2\",\"dt\":21,\"array\":true,\"uid\":\"nW2DuQNevrLR\",\"dynamic\":true,\"index\":2,\"is_connected\":true},{\"type\":0,\"name\":\"3\",\"dt\":21,\"array\":true,\"uid\":\"Qhvuw3hYvxpk\",\"dynamic\":true,\"index\":3,\"is_connected\":false},{\"type\":0,\"name\":\"4\",\"dt\":21,\"array\":true,\"uid\":\"xsJVdRqz2u5R\",\"dynamic\":true,\"index\":4,\"is_connected\":false},{\"type\":0,\"name\":\"5\",\"dt\":21,\"array\":true,\"uid\":\"6YA7VwBjNd9M\",\"dynamic\":true,\"index\":5}]},{\"plugin\":\"output_proxy\",\"x\":1369,\"y\":303,\"uid\":\"WL9uf4HkxxN8\",\"title\":\"scene\",\"dyn_in\":[{\"name\":\"output\",\"dt\":11,\"def\":null,\"uid\":\"RSDfFzqVXHXX\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"graph\",\"x\":865,\"y\":492,\"uid\":\"D4pW3hhBuvRQ\",\"state\":{\"always_update\":true,\"input_sids\":{\"g9Q6xaaUge7q\":\"KQg2KDxbURhR\"},\"output_sids\":{\"zR2J6RTfFmSu\":\"mh0rTKkFm0nD\"}},\"title\":\"Arrow to 4\",\"graph\":{\"uid\":\"PAPDDJFeYVMS\",\"parent_uid\":\"peAfFuaAqWZj\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1219,\"y\":454,\"uid\":\"SscVDmbhbQyF\",\"state\":{\"position\":{\"x\":4.24,\"y\":-0.9720014059874917,\"z\":5.3100000000000005},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":-0.5302227869631808,\"_y\":-0.4683133358062272,\"_z\":-0.4719964238710123,\"_w\":0.5260853462547849}}},{\"plugin\":\"output_proxy\",\"x\":1418,\"y\":453,\"uid\":\"zR2J6RTfFmSu\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":669,\"y\":542,\"uid\":\"EKR7DVypWa4x\",\"state\":{\"val\":16},\"title\":\"Segments\"},{\"plugin\":\"three_geometry_plane\",\"x\":925,\"y\":466,\"uid\":\"WjkrT7cNjand\"},{\"plugin\":\"three_material\",\"x\":719,\"y\":90,\"uid\":\"JERTJksR5ZYT\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":664,\"y\":451,\"uid\":\"wxtTHg2WM9aN\",\"state\":{\"val\":1},\"title\":\"Width & Height\"},{\"plugin\":\"input_proxy\",\"x\":320,\"y\":223,\"uid\":\"g9Q6xaaUge7q\",\"title\":\"arrow\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"TCVNVQDbGTpd\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"toggle_button\",\"x\":414,\"y\":479,\"uid\":\"DdcWZjXRytSg\",\"state\":{\"enabled\":true}}],\"conns\":[{\"src_nuid\":\"SscVDmbhbQyF\",\"dst_nuid\":\"zR2J6RTfFmSu\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"rw6JQgGjvFe4\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"WjkrT7cNjand\",\"dst_nuid\":\"SscVDmbhbQyF\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"bXZxUVcGs8dm\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"JERTJksR5ZYT\",\"dst_nuid\":\"SscVDmbhbQyF\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"vjTtnuYUZfKb\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"wxtTHg2WM9aN\",\"dst_nuid\":\"WjkrT7cNjand\",\"src_slot\":\"value\",\"dst_slot\":\"width\",\"uid\":\"ReNFXpYbTccX\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"wxtTHg2WM9aN\",\"dst_nuid\":\"WjkrT7cNjand\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"BXcb49JUFCFY\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"EKR7DVypWa4x\",\"dst_nuid\":\"WjkrT7cNjand\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"Mbbxs5fN7xGL\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"EKR7DVypWa4x\",\"dst_nuid\":\"WjkrT7cNjand\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"6Jzh2nRBeene\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"g9Q6xaaUge7q\",\"dst_nuid\":\"JERTJksR5ZYT\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"X8GeLRtWT2P7\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"DdcWZjXRytSg\",\"dst_nuid\":\"JERTJksR5ZYT\",\"src_slot\":\"bool\",\"dst_slot\":\"transparent\",\"uid\":\"QzBg9EjpuTQ7\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"arrow\",\"dt\":2,\"index\":0,\"uid\":\"KQg2KDxbURhR\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":628,\"y\":482,\"uid\":\"GKgKAHjTM2D9\",\"state\":{\"url\":\"/data/image/f99f293b9cf27a0cb4d282cb891d9f7346f1f1b1.png\"},\"title\":\"Texture\"},{\"plugin\":\"graph\",\"x\":878,\"y\":673,\"uid\":\"cdFVdk5WFYgm\",\"state\":{\"always_update\":true,\"input_sids\":{\"GJ93c52TzUd4\":\"KQg2KDxbURhR\"},\"output_sids\":{\"4QEKkQ8zXLWt\":\"mh0rTKkFm0nD\"}},\"title\":\"Arrow to 6\",\"graph\":{\"uid\":\"jnEE33C26WDq\",\"parent_uid\":\"peAfFuaAqWZj\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1219,\"y\":454,\"uid\":\"28fgeM9ZxgAS\",\"state\":{\"position\":{\"x\":-0.14438986574193213,\"y\":-1.114342461854283,\"z\":9.171902320674322},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":-0.001540347421282326,\"_y\":-0.7626373948996932,\"_z\":-0.6467805891390783,\"_w\":-0.007529989597464249}}},{\"plugin\":\"output_proxy\",\"x\":1418,\"y\":453,\"uid\":\"4QEKkQ8zXLWt\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":669,\"y\":542,\"uid\":\"635z5njNZ3Qx\",\"state\":{\"val\":16},\"title\":\"Segments\"},{\"plugin\":\"three_geometry_plane\",\"x\":925,\"y\":466,\"uid\":\"kwZhR2Z6uHq9\"},{\"plugin\":\"three_material\",\"x\":719,\"y\":90,\"uid\":\"aFXncYQEW88z\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":664,\"y\":451,\"uid\":\"kWje5q7yuqkU\",\"state\":{\"val\":1},\"title\":\"Width & Height\"},{\"plugin\":\"input_proxy\",\"x\":320,\"y\":223,\"uid\":\"GJ93c52TzUd4\",\"title\":\"arrow\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"TCVNVQDbGTpd\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"toggle_button\",\"x\":414,\"y\":479,\"uid\":\"g3LC3LdyX9Sp\",\"state\":{\"enabled\":true}}],\"conns\":[{\"src_nuid\":\"28fgeM9ZxgAS\",\"dst_nuid\":\"4QEKkQ8zXLWt\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"9VwQKuTsKY2a\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"kwZhR2Z6uHq9\",\"dst_nuid\":\"28fgeM9ZxgAS\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"zaLjCqVUGA2A\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"aFXncYQEW88z\",\"dst_nuid\":\"28fgeM9ZxgAS\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"FJd8yt4ExLgx\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"kWje5q7yuqkU\",\"dst_nuid\":\"kwZhR2Z6uHq9\",\"src_slot\":\"value\",\"dst_slot\":\"width\",\"uid\":\"cK8rezjzTrq4\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"kWje5q7yuqkU\",\"dst_nuid\":\"kwZhR2Z6uHq9\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"sJDW9M9NmASZ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"635z5njNZ3Qx\",\"dst_nuid\":\"kwZhR2Z6uHq9\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"dpzptb679xn5\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"635z5njNZ3Qx\",\"dst_nuid\":\"kwZhR2Z6uHq9\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"D6HzAhd3PrXM\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"GJ93c52TzUd4\",\"dst_nuid\":\"aFXncYQEW88z\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"VTfMFGp8SpG6\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"g3LC3LdyX9Sp\",\"dst_nuid\":\"aFXncYQEW88z\",\"src_slot\":\"bool\",\"dst_slot\":\"transparent\",\"uid\":\"Drp8tmjYv9JD\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"arrow\",\"dt\":2,\"index\":0,\"uid\":\"KQg2KDxbURhR\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":645,\"y\":663,\"uid\":\"T64GjC7WUCWC\",\"state\":{\"url\":\"/data/image/f99f293b9cf27a0cb4d282cb891d9f7346f1f1b1.png\"},\"title\":\"Texture\"}],\"conns\":[{\"src_nuid\":\"3nXC9Uqd5P2U\",\"dst_nuid\":\"HfdnMwS7G93f\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"hzg3jHU7ML7M\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"HfdnMwS7G93f\",\"dst_nuid\":\"nHvUf5KNYufS\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"tvBLg8rzZHxC\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"nHvUf5KNYufS\",\"dst_nuid\":\"WL9uf4HkxxN8\",\"src_slot\":\"scene\",\"dst_slot\":0,\"uid\":\"JTQVQY7aJHBT\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"D4pW3hhBuvRQ\",\"dst_nuid\":\"nHvUf5KNYufS\",\"src_slot\":0,\"dst_slot\":1,\"uid\":\"cEdCkULYKuQA\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"GKgKAHjTM2D9\",\"dst_nuid\":\"D4pW3hhBuvRQ\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"G42jxJUqQ5rL\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"T64GjC7WUCWC\",\"dst_nuid\":\"cdFVdk5WFYgm\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"39QjuUjsFqwz\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"cdFVdk5WFYgm\",\"dst_nuid\":\"nHvUf5KNYufS\",\"src_slot\":0,\"dst_slot\":2,\"uid\":\"hBR8JqeFFAg7\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"scene\",\"dt\":11,\"index\":0,\"uid\":\"xbephyP6fRzD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":769,\"y\":539,\"uid\":\"Hh6ZvT7B5evT\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"VmtfdjRPhJra\":\"xbephyP6fRzD\"}},\"title\":\"Scene 6\",\"graph\":{\"uid\":\"g2bmqfZTsdRx\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":909,\"y\":327,\"uid\":\"vE7c6hRHnaCQ\",\"state\":{\"always_update\":true,\"input_sids\":{\"zhcAXQxkVDFt\":\"lOz0fKTfMesH\"},\"output_sids\":{\"tnvzknZBJkYH\":\"mh0rTKkFm0nD\"}},\"title\":\"360 photo\",\"graph\":{\"uid\":\"YrjwdkPsvyfy\",\"parent_uid\":\"g2bmqfZTsdRx\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1252,\"y\":373,\"uid\":\"PUMH64U9GG6V\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":-0.6691306063644378,\"_z\":0,\"_w\":-0.7431448254723704}}},{\"plugin\":\"output_proxy\",\"x\":1438,\"y\":405,\"uid\":\"tnvzknZBJkYH\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_material\",\"x\":974,\"y\":130,\"uid\":\"tCweAHDNm9th\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":723,\"y\":214,\"uid\":\"yrde6e88YDVd\",\"state\":{\"val\":1},\"title\":\"Side\"},{\"plugin\":\"three_uv_modifier\",\"x\":553,\"y\":87,\"uid\":\"Txg92ABuHADC\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":297,\"y\":197,\"uid\":\"9mMWEgpx8BCY\",\"state\":{\"val\":-1},\"title\":\"X repeat photo\"},{\"plugin\":\"input_proxy\",\"x\":321,\"y\":122,\"uid\":\"zhcAXQxkVDFt\",\"title\":\"texture\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"q2TtZnBOutlf\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_geometry_sphere\",\"x\":939,\"y\":467,\"uid\":\"7ehNHLUXer68\"},{\"plugin\":\"const_float_generator\",\"x\":670,\"y\":421,\"uid\":\"VB5GbLwBv6Wm\",\"state\":{\"val\":30},\"title\":\"Radius\"},{\"plugin\":\"const_float_generator\",\"x\":676,\"y\":502,\"uid\":\"NBYnkXqymrRs\",\"state\":{\"val\":40},\"title\":\"Width Segments\"},{\"plugin\":\"const_float_generator\",\"x\":678,\"y\":584,\"uid\":\"bSAxHUH5N3M3\",\"state\":{\"val\":40},\"title\":\"Height Segments\"},{\"plugin\":\"toggle_button\",\"x\":724,\"y\":292,\"uid\":\"tcpYkdmWFtaA\",\"state\":{\"enabled\":false},\"title\":\"Fog\"}],\"conns\":[{\"src_nuid\":\"PUMH64U9GG6V\",\"dst_nuid\":\"tnvzknZBJkYH\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"FPwg35BPfPUT\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"tCweAHDNm9th\",\"dst_nuid\":\"PUMH64U9GG6V\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"LN6TJV5dVSGr\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"yrde6e88YDVd\",\"dst_nuid\":\"tCweAHDNm9th\",\"src_slot\":\"value\",\"dst_slot\":\"side\",\"uid\":\"Q9YEUGYMWUAJ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Txg92ABuHADC\",\"dst_nuid\":\"tCweAHDNm9th\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"wKTnp9Cy2f53\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"9mMWEgpx8BCY\",\"dst_nuid\":\"Txg92ABuHADC\",\"src_slot\":\"value\",\"dst_slot\":\"u repeat\",\"uid\":\"4LEvWMwcaGVg\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"zhcAXQxkVDFt\",\"dst_nuid\":\"Txg92ABuHADC\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"RAHDCxjp5jtx\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"VB5GbLwBv6Wm\",\"dst_nuid\":\"7ehNHLUXer68\",\"src_slot\":\"value\",\"dst_slot\":\"radius\",\"uid\":\"6e3jSUymLgvm\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"NBYnkXqymrRs\",\"dst_nuid\":\"7ehNHLUXer68\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"C6vpkjyRHxtt\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"bSAxHUH5N3M3\",\"dst_nuid\":\"7ehNHLUXer68\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"9wJ8gQZAVZa4\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"7ehNHLUXer68\",\"dst_nuid\":\"PUMH64U9GG6V\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"hakxjgbm2CEj\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"tcpYkdmWFtaA\",\"dst_nuid\":\"tCweAHDNm9th\",\"src_slot\":\"bool\",\"dst_slot\":\"fog\",\"uid\":\"ydx2cfUUb95x\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"texture\",\"dt\":2,\"index\":0,\"uid\":\"lOz0fKTfMesH\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":639,\"y\":298,\"uid\":\"B8WWzCPf3SvH\",\"state\":{\"url\":\"/data/image/88432af5394f3516d2e75c585420a3d9b9a57da5.jpg\"}},{\"plugin\":\"three_scene\",\"x\":1179,\"y\":317,\"uid\":\"e7zDTCYkHy2h\",\"title\":\"Scene 1\",\"dyn_in\":[{\"type\":0,\"name\":\"0\",\"dt\":21,\"array\":true,\"uid\":\"DDzcOXqI6iRM\",\"dynamic\":true,\"index\":0,\"is_connected\":true},{\"type\":0,\"name\":\"1\",\"dt\":21,\"array\":true,\"uid\":\"gH5pmBKZK4lm\",\"dynamic\":true,\"index\":1,\"is_connected\":true},{\"type\":0,\"name\":\"2\",\"dt\":21,\"array\":true,\"uid\":\"nW2DuQNevrLR\",\"dynamic\":true,\"index\":2,\"is_connected\":true},{\"type\":0,\"name\":\"3\",\"dt\":21,\"array\":true,\"uid\":\"Qhvuw3hYvxpk\",\"dynamic\":true,\"index\":3,\"is_connected\":false},{\"type\":0,\"name\":\"4\",\"dt\":21,\"array\":true,\"uid\":\"xsJVdRqz2u5R\",\"dynamic\":true,\"index\":4,\"is_connected\":false},{\"type\":0,\"name\":\"5\",\"dt\":21,\"array\":true,\"uid\":\"6YA7VwBjNd9M\",\"dynamic\":true,\"index\":5}]},{\"plugin\":\"output_proxy\",\"x\":1369,\"y\":303,\"uid\":\"VmtfdjRPhJra\",\"title\":\"scene\",\"dyn_in\":[{\"name\":\"output\",\"dt\":11,\"def\":null,\"uid\":\"RSDfFzqVXHXX\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"graph\",\"x\":865,\"y\":492,\"uid\":\"MsvdTgttX5Uc\",\"state\":{\"always_update\":true,\"input_sids\":{\"LCHF9mDXG9q2\":\"KQg2KDxbURhR\"},\"output_sids\":{\"HQbQgzmhMvsG\":\"mh0rTKkFm0nD\"}},\"title\":\"Arrow to 5\",\"graph\":{\"uid\":\"KP4FbxK8LzMQ\",\"parent_uid\":\"g2bmqfZTsdRx\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1219,\"y\":454,\"uid\":\"G6Ua5phNBXg9\",\"state\":{\"position\":{\"x\":0.49297986031318164,\"y\":-1.166976121234136,\"z\":2.294108820545143},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0.7088440945940115,\"_y\":0.02779658941698368,\"_z\":0.038163812842058095,\"_w\":-0.7037832923317631}}},{\"plugin\":\"output_proxy\",\"x\":1418,\"y\":453,\"uid\":\"HQbQgzmhMvsG\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":669,\"y\":542,\"uid\":\"DVkz9SM53HEB\",\"state\":{\"val\":16},\"title\":\"Segments\"},{\"plugin\":\"three_geometry_plane\",\"x\":925,\"y\":466,\"uid\":\"ZkZjtatxja4J\"},{\"plugin\":\"three_material\",\"x\":719,\"y\":90,\"uid\":\"4MFVN9AtN4PA\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":664,\"y\":451,\"uid\":\"6ySpPHPBDWhw\",\"state\":{\"val\":1},\"title\":\"Width & Height\"},{\"plugin\":\"input_proxy\",\"x\":320,\"y\":223,\"uid\":\"LCHF9mDXG9q2\",\"title\":\"arrow\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"TCVNVQDbGTpd\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"toggle_button\",\"x\":414,\"y\":479,\"uid\":\"tUqjYCFVgrNV\",\"state\":{\"enabled\":true}}],\"conns\":[{\"src_nuid\":\"G6Ua5phNBXg9\",\"dst_nuid\":\"HQbQgzmhMvsG\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"vC5pKmnZU3uR\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"ZkZjtatxja4J\",\"dst_nuid\":\"G6Ua5phNBXg9\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"NJNdJDcNVSxf\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"4MFVN9AtN4PA\",\"dst_nuid\":\"G6Ua5phNBXg9\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"YnReM7CNCwYY\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"6ySpPHPBDWhw\",\"dst_nuid\":\"ZkZjtatxja4J\",\"src_slot\":\"value\",\"dst_slot\":\"width\",\"uid\":\"tLKwNZq4FPrV\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"6ySpPHPBDWhw\",\"dst_nuid\":\"ZkZjtatxja4J\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"hMsbFeEnCsyn\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"DVkz9SM53HEB\",\"dst_nuid\":\"ZkZjtatxja4J\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"MQ62pj3snfaz\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"DVkz9SM53HEB\",\"dst_nuid\":\"ZkZjtatxja4J\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"xpfTunHest2q\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"LCHF9mDXG9q2\",\"dst_nuid\":\"4MFVN9AtN4PA\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"Zk8NezBKkrfk\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"tUqjYCFVgrNV\",\"dst_nuid\":\"4MFVN9AtN4PA\",\"src_slot\":\"bool\",\"dst_slot\":\"transparent\",\"uid\":\"ATmS3WaDFK2e\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"arrow\",\"dt\":2,\"index\":0,\"uid\":\"KQg2KDxbURhR\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":628,\"y\":482,\"uid\":\"gearR6RkBt3z\",\"state\":{\"url\":\"/data/image/f99f293b9cf27a0cb4d282cb891d9f7346f1f1b1.png\"},\"title\":\"Texture\"},{\"plugin\":\"graph\",\"x\":878,\"y\":673,\"uid\":\"F2gxxyctxA9G\",\"state\":{\"always_update\":true,\"input_sids\":{\"mjhenZxG6MEd\":\"KQg2KDxbURhR\"},\"output_sids\":{\"BaHN4uAEyfKy\":\"mh0rTKkFm0nD\"}},\"title\":\"Arrow to 7\",\"graph\":{\"uid\":\"LwjmdTsENNhx\",\"parent_uid\":\"g2bmqfZTsdRx\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1219,\"y\":454,\"uid\":\"v5Uav7Y7BznR\",\"state\":{\"position\":{\"x\":-0.5836904095743015,\"y\":-1.3400354649974657,\"z\":11.987885175511863},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":-0.02662617443460269,\"_y\":0.7621740061196097,\"_z\":0.646061255979333,\"_w\":0.0314115385323616}}},{\"plugin\":\"output_proxy\",\"x\":1418,\"y\":453,\"uid\":\"BaHN4uAEyfKy\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":669,\"y\":542,\"uid\":\"gB3eWsQPh8KP\",\"state\":{\"val\":16},\"title\":\"Segments\"},{\"plugin\":\"three_geometry_plane\",\"x\":925,\"y\":466,\"uid\":\"VMBDWNAfGuVj\"},{\"plugin\":\"three_material\",\"x\":719,\"y\":90,\"uid\":\"az4jBvdqqBhS\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":664,\"y\":451,\"uid\":\"w8mzYyv8xnDF\",\"state\":{\"val\":1},\"title\":\"Width & Height\"},{\"plugin\":\"input_proxy\",\"x\":320,\"y\":223,\"uid\":\"mjhenZxG6MEd\",\"title\":\"arrow\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"TCVNVQDbGTpd\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"toggle_button\",\"x\":414,\"y\":479,\"uid\":\"4NbuXAgtDS8s\",\"state\":{\"enabled\":true}}],\"conns\":[{\"src_nuid\":\"v5Uav7Y7BznR\",\"dst_nuid\":\"BaHN4uAEyfKy\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"VTS28sFVVA92\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"VMBDWNAfGuVj\",\"dst_nuid\":\"v5Uav7Y7BznR\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"aUcdRhHjCZ5U\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"az4jBvdqqBhS\",\"dst_nuid\":\"v5Uav7Y7BznR\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"tRCDbwUXsZAc\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"w8mzYyv8xnDF\",\"dst_nuid\":\"VMBDWNAfGuVj\",\"src_slot\":\"value\",\"dst_slot\":\"width\",\"uid\":\"89nqXqh6hjRJ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"w8mzYyv8xnDF\",\"dst_nuid\":\"VMBDWNAfGuVj\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"TRzUAR7tGupR\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"gB3eWsQPh8KP\",\"dst_nuid\":\"VMBDWNAfGuVj\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"THN92JRSatnp\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"gB3eWsQPh8KP\",\"dst_nuid\":\"VMBDWNAfGuVj\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"Qeyjb7HHzv5K\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"mjhenZxG6MEd\",\"dst_nuid\":\"az4jBvdqqBhS\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"qTtR3fT5d4YK\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"4NbuXAgtDS8s\",\"dst_nuid\":\"az4jBvdqqBhS\",\"src_slot\":\"bool\",\"dst_slot\":\"transparent\",\"uid\":\"sT2McsdvVDjz\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"arrow\",\"dt\":2,\"index\":0,\"uid\":\"KQg2KDxbURhR\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":645,\"y\":663,\"uid\":\"7jU2EbemzmZE\",\"state\":{\"url\":\"/data/image/f99f293b9cf27a0cb4d282cb891d9f7346f1f1b1.png\"},\"title\":\"Texture\"}],\"conns\":[{\"src_nuid\":\"B8WWzCPf3SvH\",\"dst_nuid\":\"vE7c6hRHnaCQ\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"ZaVn3ZUfY9kH\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"vE7c6hRHnaCQ\",\"dst_nuid\":\"e7zDTCYkHy2h\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"qEFEtPZGSVfM\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"e7zDTCYkHy2h\",\"dst_nuid\":\"VmtfdjRPhJra\",\"src_slot\":\"scene\",\"dst_slot\":0,\"uid\":\"Nh42cFP55KkF\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"MsvdTgttX5Uc\",\"dst_nuid\":\"e7zDTCYkHy2h\",\"src_slot\":0,\"dst_slot\":1,\"uid\":\"nmpG4ykyVpqz\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"gearR6RkBt3z\",\"dst_nuid\":\"MsvdTgttX5Uc\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"DZu8EnWCjavP\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"7jU2EbemzmZE\",\"dst_nuid\":\"F2gxxyctxA9G\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"PzbQwKSHusRY\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"F2gxxyctxA9G\",\"dst_nuid\":\"e7zDTCYkHy2h\",\"src_slot\":0,\"dst_slot\":2,\"uid\":\"MQnNvV7JP3pF\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"scene\",\"dt\":11,\"index\":0,\"uid\":\"xbephyP6fRzD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":768,\"y\":614,\"uid\":\"FGMmWTUyE6XL\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"cR5sTAN3QYWL\":\"xbephyP6fRzD\"}},\"title\":\"Scene 7\",\"graph\":{\"uid\":\"23sUb3yBAyQU\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":856,\"y\":211,\"uid\":\"5cY3hqGJMkBw\",\"state\":{\"always_update\":true,\"input_sids\":{\"P2FnksyYG4bn\":\"lOz0fKTfMesH\"},\"output_sids\":{\"WP59ppqZLj2G\":\"mh0rTKkFm0nD\"}},\"title\":\"360 photo\",\"graph\":{\"uid\":\"AD9AvjeJV3qL\",\"parent_uid\":\"23sUb3yBAyQU\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1252,\"y\":373,\"uid\":\"Negt8hUqYV7S\",\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":-0.9993908270192704,\"_z\":0,\"_w\":-0.03489949669749868}}},{\"plugin\":\"output_proxy\",\"x\":1438,\"y\":405,\"uid\":\"WP59ppqZLj2G\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_material\",\"x\":974,\"y\":130,\"uid\":\"2RCzzP6yPHR8\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":723,\"y\":214,\"uid\":\"mheCASzHQbmh\",\"state\":{\"val\":1},\"title\":\"Side\"},{\"plugin\":\"three_uv_modifier\",\"x\":553,\"y\":87,\"uid\":\"5Fh3cPX27Mym\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":297,\"y\":197,\"uid\":\"YPKvmmTeCJCM\",\"state\":{\"val\":-1},\"title\":\"X repeat photo\"},{\"plugin\":\"input_proxy\",\"x\":321,\"y\":122,\"uid\":\"P2FnksyYG4bn\",\"title\":\"texture\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"q2TtZnBOutlf\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_geometry_sphere\",\"x\":939,\"y\":467,\"uid\":\"JMhFqJAewUdU\"},{\"plugin\":\"const_float_generator\",\"x\":670,\"y\":421,\"uid\":\"wgM8tucbDuBp\",\"state\":{\"val\":30},\"title\":\"Radius\"},{\"plugin\":\"const_float_generator\",\"x\":676,\"y\":502,\"uid\":\"dsHY6DXrSJxD\",\"state\":{\"val\":40},\"title\":\"Width Segments\"},{\"plugin\":\"const_float_generator\",\"x\":678,\"y\":584,\"uid\":\"fuALtxfwmSnr\",\"state\":{\"val\":40},\"title\":\"Height Segments\"},{\"plugin\":\"toggle_button\",\"x\":724,\"y\":292,\"uid\":\"XTEVXCU27KZJ\",\"state\":{\"enabled\":false},\"title\":\"Fog\"}],\"conns\":[{\"src_nuid\":\"Negt8hUqYV7S\",\"dst_nuid\":\"WP59ppqZLj2G\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"rZ8hBhHdk2BW\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"2RCzzP6yPHR8\",\"dst_nuid\":\"Negt8hUqYV7S\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"ut7AEJ556S5b\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"mheCASzHQbmh\",\"dst_nuid\":\"2RCzzP6yPHR8\",\"src_slot\":\"value\",\"dst_slot\":\"side\",\"uid\":\"h38WrnCed2Nx\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"5Fh3cPX27Mym\",\"dst_nuid\":\"2RCzzP6yPHR8\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"YfBgrwMsTzx6\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"YPKvmmTeCJCM\",\"dst_nuid\":\"5Fh3cPX27Mym\",\"src_slot\":\"value\",\"dst_slot\":\"u repeat\",\"uid\":\"XeFUtv8AWMFp\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"P2FnksyYG4bn\",\"dst_nuid\":\"5Fh3cPX27Mym\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"b3nbCD9vjA5w\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"wgM8tucbDuBp\",\"dst_nuid\":\"JMhFqJAewUdU\",\"src_slot\":\"value\",\"dst_slot\":\"radius\",\"uid\":\"5Rzj25EHdy2J\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"dsHY6DXrSJxD\",\"dst_nuid\":\"JMhFqJAewUdU\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"DuBRYYSDcKqf\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"fuALtxfwmSnr\",\"dst_nuid\":\"JMhFqJAewUdU\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"ZzZA5KhPZZDh\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"JMhFqJAewUdU\",\"dst_nuid\":\"Negt8hUqYV7S\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"RxrBmtQxPZr9\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"XTEVXCU27KZJ\",\"dst_nuid\":\"2RCzzP6yPHR8\",\"src_slot\":\"bool\",\"dst_slot\":\"fog\",\"uid\":\"3XnNZ4yPk9km\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"texture\",\"dt\":2,\"index\":0,\"uid\":\"lOz0fKTfMesH\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":586,\"y\":182,\"uid\":\"czHber4cc9tc\",\"state\":{\"url\":\"/data/image/5caf502a294edd1c27e7bfb46afb597ee44a8989.jpg\"}},{\"plugin\":\"three_scene\",\"x\":1179,\"y\":317,\"uid\":\"UcXLPgnGp8QL\",\"title\":\"Scene 1\",\"dyn_in\":[{\"type\":0,\"name\":\"0\",\"dt\":21,\"array\":true,\"uid\":\"DDzcOXqI6iRM\",\"dynamic\":true,\"index\":0,\"is_connected\":true},{\"type\":0,\"name\":\"1\",\"dt\":21,\"array\":true,\"uid\":\"gH5pmBKZK4lm\",\"dynamic\":true,\"index\":1,\"is_connected\":true},{\"type\":0,\"name\":\"2\",\"dt\":21,\"array\":true,\"uid\":\"nW2DuQNevrLR\",\"dynamic\":true,\"index\":2,\"is_connected\":false},{\"type\":0,\"name\":\"3\",\"dt\":21,\"array\":true,\"uid\":\"Qhvuw3hYvxpk\",\"dynamic\":true,\"index\":3,\"is_connected\":false},{\"type\":0,\"name\":\"4\",\"dt\":21,\"array\":true,\"uid\":\"xsJVdRqz2u5R\",\"dynamic\":true,\"index\":4,\"is_connected\":false},{\"type\":0,\"name\":\"5\",\"dt\":21,\"array\":true,\"uid\":\"6YA7VwBjNd9M\",\"dynamic\":true,\"index\":5}]},{\"plugin\":\"output_proxy\",\"x\":1369,\"y\":303,\"uid\":\"cR5sTAN3QYWL\",\"title\":\"scene\",\"dyn_in\":[{\"name\":\"output\",\"dt\":11,\"def\":null,\"uid\":\"RSDfFzqVXHXX\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"graph\",\"x\":822,\"y\":358,\"uid\":\"S9uwad3EXtBY\",\"state\":{\"always_update\":true,\"input_sids\":{\"3rKWcMhuNZAu\":\"KQg2KDxbURhR\"},\"output_sids\":{\"LzqCdkvuzFwf\":\"mh0rTKkFm0nD\"}},\"title\":\"Arrow to 6\",\"graph\":{\"uid\":\"RTzS2cAWKuTe\",\"parent_uid\":\"23sUb3yBAyQU\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1219,\"y\":454,\"uid\":\"tAg6TXCFKC6g\",\"state\":{\"position\":{\"x\":0.15095613463565152,\"y\":-1.389233998547565,\"z\":1.2885653906128216},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":-0.7095676726493947,\"_y\":-0.020587686303992818,\"_z\":-0.02074959982622305,\"_w\":0.7040307658125612}}},{\"plugin\":\"output_proxy\",\"x\":1418,\"y\":453,\"uid\":\"LzqCdkvuzFwf\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":669,\"y\":542,\"uid\":\"q7UJfeMUcPae\",\"state\":{\"val\":16},\"title\":\"Segments\"},{\"plugin\":\"three_geometry_plane\",\"x\":925,\"y\":466,\"uid\":\"wEWNahCFYANk\"},{\"plugin\":\"three_material\",\"x\":719,\"y\":90,\"uid\":\"67MqFNbdnHnR\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":664,\"y\":451,\"uid\":\"WmV5eaHka3eZ\",\"state\":{\"val\":1},\"title\":\"Width & Height\"},{\"plugin\":\"input_proxy\",\"x\":320,\"y\":223,\"uid\":\"3rKWcMhuNZAu\",\"title\":\"arrow\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"TCVNVQDbGTpd\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"toggle_button\",\"x\":414,\"y\":479,\"uid\":\"zLDBfjkU3p2Y\",\"state\":{\"enabled\":true}}],\"conns\":[{\"src_nuid\":\"tAg6TXCFKC6g\",\"dst_nuid\":\"LzqCdkvuzFwf\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"YNNcu6Gsdcc9\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"wEWNahCFYANk\",\"dst_nuid\":\"tAg6TXCFKC6g\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"AyBbWSQvgu4j\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"67MqFNbdnHnR\",\"dst_nuid\":\"tAg6TXCFKC6g\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"BTH4nkgGwykL\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"WmV5eaHka3eZ\",\"dst_nuid\":\"wEWNahCFYANk\",\"src_slot\":\"value\",\"dst_slot\":\"width\",\"uid\":\"s4jHaLQ8Dttw\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"WmV5eaHka3eZ\",\"dst_nuid\":\"wEWNahCFYANk\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"xYyGaq6H6S4t\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"q7UJfeMUcPae\",\"dst_nuid\":\"wEWNahCFYANk\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"ps3snWjHzQ8Y\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"q7UJfeMUcPae\",\"dst_nuid\":\"wEWNahCFYANk\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"vKPfBeT9cyAR\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"3rKWcMhuNZAu\",\"dst_nuid\":\"67MqFNbdnHnR\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"9G2qdgD3FKss\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"zLDBfjkU3p2Y\",\"dst_nuid\":\"67MqFNbdnHnR\",\"src_slot\":\"bool\",\"dst_slot\":\"transparent\",\"uid\":\"G7x5jFBdQ8Bw\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"arrow\",\"dt\":2,\"index\":0,\"uid\":\"KQg2KDxbURhR\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":575,\"y\":366,\"uid\":\"ZxkeT6tUs2ag\",\"state\":{\"url\":\"/data/image/f99f293b9cf27a0cb4d282cb891d9f7346f1f1b1.png\"},\"title\":\"Texture\"},{\"plugin\":\"graph\",\"x\":826,\"y\":557,\"uid\":\"taWmAxeV6EEN\",\"state\":{\"always_update\":true,\"input_sids\":{\"ZeMPBcvSscmV\":\"KQg2KDxbURhR\"},\"output_sids\":{\"kvyFZWCxGPbs\":\"mh0rTKkFm0nD\"}},\"title\":\"Arrow to 8\",\"graph\":{\"uid\":\"P9K5sL7u4RLj\",\"parent_uid\":\"23sUb3yBAyQU\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1219,\"y\":454,\"uid\":\"UB6FNDdNsvvf\",\"state\":{\"position\":{\"x\":-3.598004831023115,\"y\":-0.7876001075687582,\"z\":5.0910583866191725},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":-0.4679619668890721,\"_y\":0.5264209744598571,\"_z\":0.4462238175495447,\"_w\":0.5520659922921861}}},{\"plugin\":\"output_proxy\",\"x\":1418,\"y\":453,\"uid\":\"kvyFZWCxGPbs\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":669,\"y\":542,\"uid\":\"2TnFQhSV4x4B\",\"state\":{\"val\":16},\"title\":\"Segments\"},{\"plugin\":\"three_geometry_plane\",\"x\":925,\"y\":466,\"uid\":\"mk3gYnyWFxeb\"},{\"plugin\":\"three_material\",\"x\":719,\"y\":90,\"uid\":\"qv2DCHAUX4rf\",\"state\":{}},{\"plugin\":\"const_float_generator\",\"x\":664,\"y\":451,\"uid\":\"mdkhLjBKVhp5\",\"state\":{\"val\":1},\"title\":\"Width & Height\"},{\"plugin\":\"input_proxy\",\"x\":320,\"y\":223,\"uid\":\"ZeMPBcvSscmV\",\"title\":\"arrow\",\"dyn_out\":[{\"name\":\"input\",\"dt\":2,\"uid\":\"TCVNVQDbGTpd\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"toggle_button\",\"x\":414,\"y\":479,\"uid\":\"L8kva3XbuRKN\",\"state\":{\"enabled\":true}}],\"conns\":[{\"src_nuid\":\"UB6FNDdNsvvf\",\"dst_nuid\":\"kvyFZWCxGPbs\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"kP5RbrDFhcyF\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"mk3gYnyWFxeb\",\"dst_nuid\":\"UB6FNDdNsvvf\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"CBKe4rTMVNcq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"qv2DCHAUX4rf\",\"dst_nuid\":\"UB6FNDdNsvvf\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"xCUr3XMWhbGt\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"mdkhLjBKVhp5\",\"dst_nuid\":\"mk3gYnyWFxeb\",\"src_slot\":\"value\",\"dst_slot\":\"width\",\"uid\":\"faUbgcmkLKDf\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"mdkhLjBKVhp5\",\"dst_nuid\":\"mk3gYnyWFxeb\",\"src_slot\":\"value\",\"dst_slot\":\"height\",\"uid\":\"D2MYBxC4GMp3\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"2TnFQhSV4x4B\",\"dst_nuid\":\"mk3gYnyWFxeb\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"8RSSqYR9YXYb\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"2TnFQhSV4x4B\",\"dst_nuid\":\"mk3gYnyWFxeb\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"yzZppZgpTeJL\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ZeMPBcvSscmV\",\"dst_nuid\":\"qv2DCHAUX4rf\",\"src_slot\":0,\"dst_slot\":\"texture\",\"uid\":\"h9x3VpXtqPW3\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"L8kva3XbuRKN\",\"dst_nuid\":\"qv2DCHAUX4rf\",\"src_slot\":\"bool\",\"dst_slot\":\"transparent\",\"uid\":\"mPLFfpLFEnam\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"arrow\",\"dt\":2,\"index\":0,\"uid\":\"KQg2KDxbURhR\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":false}]},{\"plugin\":\"url_texture_generator\",\"x\":592,\"y\":547,\"uid\":\"Kk6vH3bUPAfG\",\"state\":{\"url\":\"/data/image/f99f293b9cf27a0cb4d282cb891d9f7346f1f1b1.png\"},\"title\":\"Texture\"}],\"conns\":[{\"src_nuid\":\"czHber4cc9tc\",\"dst_nuid\":\"5cY3hqGJMkBw\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"keSC3NsK7C37\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"5cY3hqGJMkBw\",\"dst_nuid\":\"UcXLPgnGp8QL\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"yXFTgdpKxZdv\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"UcXLPgnGp8QL\",\"dst_nuid\":\"cR5sTAN3QYWL\",\"src_slot\":\"scene\",\"dst_slot\":0,\"uid\":\"6sXv4vaZ25Hj\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"S9uwad3EXtBY\",\"dst_nuid\":\"UcXLPgnGp8QL\",\"src_slot\":0,\"dst_slot\":1,\"uid\":\"Bw5f8FNVdpbv\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"ZxkeT6tUs2ag\",\"dst_nuid\":\"S9uwad3EXtBY\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"PFcvxz5hNLnf\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"Kk6vH3bUPAfG\",\"dst_nuid\":\"taWmAxeV6EEN\",\"src_slot\":\"texture\",\"dst_slot\":0,\"uid\":\"X7wyCqJVTY7W\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"scene\",\"dt\":11,\"index\":0,\"uid\":\"xbephyP6fRzD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"float_display\",\"x\":1042,\"y\":14,\"uid\":\"ArgbDB7ehN3r\"}],\"conns\":[{\"src_nuid\":\"NDL73aSfJ6Ru\",\"dst_nuid\":\"GKCJDXV2557h\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"xt8WMD7tTPmP\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"QsGkx32Wp7YR\",\"dst_nuid\":\"NDL73aSfJ6Ru\",\"src_slot\":0,\"dst_slot\":\"number\",\"uid\":\"F4aKLSFRW6xv\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"2wDdwrYYBqDS\",\"dst_nuid\":\"NDL73aSfJ6Ru\",\"src_slot\":0,\"dst_slot\":1,\"uid\":\"ru6cMDd9cfNJ\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"h89tKd8ePE89\",\"dst_nuid\":\"NDL73aSfJ6Ru\",\"src_slot\":0,\"dst_slot\":2,\"uid\":\"LmpDej6gkP9z\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"Raev2Ne75Xvg\",\"dst_nuid\":\"NDL73aSfJ6Ru\",\"src_slot\":0,\"dst_slot\":3,\"uid\":\"nFPMTy5YAQpp\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"Bu54LvjppPWC\",\"dst_nuid\":\"NDL73aSfJ6Ru\",\"src_slot\":0,\"dst_slot\":4,\"uid\":\"qLcZFrXLTyQv\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"zy37UAgHF2eL\",\"dst_nuid\":\"NDL73aSfJ6Ru\",\"src_slot\":0,\"dst_slot\":5,\"uid\":\"jydZ2YrNmKra\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"Hh6ZvT7B5evT\",\"dst_nuid\":\"NDL73aSfJ6Ru\",\"src_slot\":0,\"dst_slot\":6,\"uid\":\"943AuCkmge3G\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"FGMmWTUyE6XL\",\"dst_nuid\":\"NDL73aSfJ6Ru\",\"src_slot\":0,\"dst_slot\":7,\"uid\":\"jzPzSTw3UreL\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"QsGkx32Wp7YR\",\"dst_nuid\":\"ArgbDB7ehN3r\",\"src_slot\":0,\"dst_slot\":\"float\",\"uid\":\"CAyeC7dr8tcW\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true}]}}"
  },
  {
    "path": "browser/test/fixtures/issue195.json",
    "content": "{\"abs_t\":63.006,\"active_graph\":\"root\",\"graph_uid\":\"B2bX7p5sMwhn\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":256,\"y\":398,\"uid\":\"JTaTS0IVyNVv\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{}},\"title\":\"graph\",\"graph\":{\"uid\":\"tucfD94keNSl\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"slider_float_generator\",\"x\":373,\"y\":333,\"uid\":\"ilOy18RVZ9Th\",\"state\":{\"val\":0,\"min\":0,\"max\":1}},{\"plugin\":\"float_display\",\"x\":730,\"y\":438,\"uid\":\"kERJSto4OQW5\"}],\"conns\":[{\"src_nuid\":\"ilOy18RVZ9Th\",\"dst_nuid\":\"kERJSto4OQW5\",\"src_slot\":\"value\",\"dst_slot\":\"float\",\"uid\":\"IkhUQVYJPlpI\",\"src_connected\":true,\"dst_connected\":true}]}}],\"conns\":[]}}"
  },
  {
    "path": "browser/test/fixtures/paste-clock.json",
    "content": "{\"nodes\":[{\"plugin\":\"float_display\",\"x\":848,\"y\":601,\"uid\":\"4cQLj9px8mpX\"},{\"plugin\":\"clock_generator\",\"x\":445,\"y\":613,\"uid\":\"eUrmEYyvkts4\"},{\"plugin\":\"graph\",\"x\":613,\"y\":605,\"uid\":\"zj3uts6t22zK\",\"state\":{\"always_update\":true,\"input_sids\":{\"MBKzXpAHXrmS\":\"sPAfEhtNXGjh\"},\"output_sids\":{\"6DbpauwXJPNt\":\"gjMdVCUGVXV8\"}},\"title\":\"Graph\",\"graph\":{\"uid\":\"DNr49kXsSHdK\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":1152,\"y\":462,\"uid\":\"6DbpauwXJPNt\",\"title\":\"output\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"def\":null,\"uid\":\"CsY7pheKe7ha\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":623,\"y\":386,\"uid\":\"MBKzXpAHXrmS\",\"title\":\"time\",\"dyn_out\":[{\"name\":\"input\",\"dt\":0,\"uid\":\"TnvW4w2RAvUY\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"multiply_modulator\",\"x\":830,\"y\":450,\"uid\":\"5vepkHbYRkNR\",\"open\":false},{\"plugin\":\"const_float_generator\",\"x\":625,\"y\":525,\"uid\":\"DhE4V835WNpP\",\"open\":false,\"state\":{\"val\":1}}],\"conns\":[{\"src_nuid\":\"MBKzXpAHXrmS\",\"dst_nuid\":\"5vepkHbYRkNR\",\"src_slot\":0,\"dst_slot\":\"a\",\"uid\":\"rqpBXDdW6rcY\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"5vepkHbYRkNR\",\"dst_nuid\":\"6DbpauwXJPNt\",\"src_slot\":\"result\",\"dst_slot\":0,\"uid\":\"7PtLLkqPcLEs\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"DhE4V835WNpP\",\"dst_nuid\":\"5vepkHbYRkNR\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"EALZE7hrMyg4\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"time\",\"dt\":0,\"index\":0,\"uid\":\"sPAfEhtNXGjh\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"index\":0,\"uid\":\"gjMdVCUGVXV8\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":\"zj3uts6t22zK\",\"dst_nuid\":\"4cQLj9px8mpX\",\"src_slot\":0,\"dst_slot\":\"float\",\"uid\":\"c3WthP9XscmC\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"eUrmEYyvkts4\",\"dst_nuid\":\"zj3uts6t22zK\",\"src_slot\":\"seconds\",\"dst_slot\":0,\"uid\":\"CXSm25mCq8ZD\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}],\"x1\":445,\"y1\":651,\"x2\":971,\"y2\":717}\n"
  },
  {
    "path": "browser/test/fixtures/paste-complex.json",
    "content": "{\"abs_t\":169.195,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"slider_float_generator\",\"x\":834,\"y\":487,\"uid\":\"RsrJmNJ9cgwW\",\"state\":{\"val\":0.448,\"min\":0,\"max\":1}},{\"plugin\":\"float_display\",\"x\":1105,\"y\":461,\"uid\":\"fBm5hZg8v5qN\"},{\"plugin\":\"annotation\",\"x\":1181,\"y\":611,\"uid\":\"s49ZkHZzpFjK\",\"state\":{\"text\":\"This is a test\",\"width\":150,\"height\":70}},{\"plugin\":\"clock_generator\",\"x\":582,\"y\":454,\"uid\":\"gWThXWvCApwr\"},{\"plugin\":\"float_display\",\"x\":803,\"y\":353,\"uid\":\"DgeZMA5mDKd3\"},{\"plugin\":\"multiply_modulator\",\"x\":827,\"y\":169,\"uid\":\"JXLVm3me62Z2\"},{\"plugin\":\"float_display\",\"x\":1108,\"y\":278,\"uid\":\"gs28wvTQH5mC\"},{\"plugin\":\"graph\",\"x\":683,\"y\":665,\"uid\":\"zxU7LTPnnH3R\",\"state\":{\"always_update\":true,\"input_sids\":{\"bFWVEWHx4fJW\":\"YwgjRzdWf8vK\"},\"output_sids\":{}},\"title\":\"nested\",\"graph\":{\"uid\":\"khAapj7kDGnX\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"float_display\",\"x\":912,\"y\":311,\"uid\":\"SCRJK8h32xjY\"},{\"plugin\":\"input_proxy\",\"x\":629,\"y\":755,\"uid\":\"bFWVEWHx4fJW\",\"title\":\"input\",\"dyn_out\":[{\"name\":\"input\",\"dt\":0,\"uid\":\"EgZ5smgG5wr6\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]}],\"conns\":[{\"src_nuid\":\"bFWVEWHx4fJW\",\"dst_nuid\":\"SCRJK8h32xjY\",\"src_slot\":0,\"dst_slot\":\"float\",\"uid\":\"SMgRcFQV7kY8\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true}]},\"dyn_in\":[{\"name\":\"input\",\"dt\":0,\"index\":0,\"uid\":\"YwgjRzdWf8vK\",\"dynamic\":true,\"type\":0}]}],\"conns\":[{\"src_nuid\":\"RsrJmNJ9cgwW\",\"dst_nuid\":\"fBm5hZg8v5qN\",\"src_slot\":\"value\",\"dst_slot\":\"float\",\"uid\":\"VYJ5sauxjWUM\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"gWThXWvCApwr\",\"dst_nuid\":\"DgeZMA5mDKd3\",\"src_slot\":\"seconds\",\"dst_slot\":\"float\",\"uid\":\"qeFB2R3zFqYp\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"gWThXWvCApwr\",\"dst_nuid\":\"JXLVm3me62Z2\",\"src_slot\":\"seconds\",\"dst_slot\":\"a\",\"uid\":\"Zu4ZsrjCQKbD\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"gWThXWvCApwr\",\"dst_nuid\":\"JXLVm3me62Z2\",\"src_slot\":\"seconds\",\"dst_slot\":\"b\",\"uid\":\"FJTaUJp4WnPs\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"JXLVm3me62Z2\",\"dst_nuid\":\"gs28wvTQH5mC\",\"src_slot\":\"result\",\"dst_slot\":\"float\",\"uid\":\"j4Xg7y6k6a2N\",\"src_connected\":true,\"dst_connected\":true}]}}"
  },
  {
    "path": "browser/test/fixtures/paste.json",
    "content": "{\"abs_t\":0,\"active_graph\":0,\"graph_uid\":1,\"root\":{\"node_uid\":3,\"uid\":0,\"parent_uid\":-1,\"nodes\":[{\"plugin\":\"float_display\",\"x\":380,\"y\":109,\"uid\":0},{\"plugin\":\"float_display\",\"x\":389,\"y\":180,\"uid\":1},{\"plugin\":\"slider_float_generator\",\"x\":49,\"y\":96,\"uid\":2,\"state\":{\"val\":0.16666666666666666,\"min\":0,\"max\":1}}],\"conns\":[{\"src_nuid\":2,\"dst_nuid\":0,\"src_slot\":\"value\",\"dst_slot\":\"float\"},{\"src_nuid\":2,\"dst_nuid\":1,\"src_slot\":\"value\",\"dst_slot\":\"float\",\"offset\":1}]}}"
  },
  {
    "path": "browser/test/fixtures/pause-subgraph.json",
    "content": "{\"nodes\":[{\"plugin\":\"float_display\",\"x\":1042,\"y\":285,\"uid\":\"4fwAxdPujSnM\"},{\"plugin\":\"clock_generator\",\"x\":639,\"y\":297,\"uid\":\"2QbJLfBHc8cr\"},{\"plugin\":\"graph\",\"x\":807,\"y\":289,\"uid\":\"nKfDHySayKsB\",\"state\":{\"always_update\":true,\"input_sids\":{\"U3BLJVSwrJee\":\"sPAfEhtNXGjh\"},\"output_sids\":{\"h4bQuXtLxpdB\":\"gjMdVCUGVXV8\"}},\"title\":\"Graph\",\"graph\":{\"uid\":\"U38qBwntdMag\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":1152,\"y\":462,\"uid\":\"h4bQuXtLxpdB\",\"title\":\"output\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"def\":null,\"uid\":\"CsY7pheKe7ha\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"input_proxy\",\"x\":623,\"y\":386,\"uid\":\"U3BLJVSwrJee\",\"title\":\"time\",\"dyn_out\":[{\"name\":\"input\",\"dt\":0,\"uid\":\"TnvW4w2RAvUY\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"multiply_modulator\",\"x\":830,\"y\":450,\"uid\":\"5kKFvJEKTTkL\",\"open\":false},{\"plugin\":\"const_float_generator\",\"x\":625,\"y\":525,\"uid\":\"SRneaLUfU7t6\",\"open\":false,\"state\":{\"val\":1}}],\"conns\":[{\"src_nuid\":\"U3BLJVSwrJee\",\"dst_nuid\":\"5kKFvJEKTTkL\",\"src_slot\":0,\"dst_slot\":\"a\",\"uid\":\"MCUNSS3T3DLb\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"5kKFvJEKTTkL\",\"dst_nuid\":\"h4bQuXtLxpdB\",\"src_slot\":\"result\",\"dst_slot\":0,\"uid\":\"naXZZ3jBLuF3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"SRneaLUfU7t6\",\"dst_nuid\":\"5kKFvJEKTTkL\",\"src_slot\":\"value\",\"dst_slot\":\"b\",\"uid\":\"brcFPgn666RZ\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"time\",\"dt\":0,\"index\":0,\"uid\":\"sPAfEhtNXGjh\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"index\":0,\"uid\":\"gjMdVCUGVXV8\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":\"nKfDHySayKsB\",\"dst_nuid\":\"4fwAxdPujSnM\",\"src_slot\":0,\"dst_slot\":\"float\",\"uid\":\"ZBNGTVuN8G5B\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"2QbJLfBHc8cr\",\"dst_nuid\":\"nKfDHySayKsB\",\"src_slot\":\"seconds\",\"dst_slot\":0,\"uid\":\"XqTD5vbQd58q\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}],\"x1\":689,\"y1\":335,\"x2\":1209,\"y2\":401}"
  },
  {
    "path": "browser/test/fixtures/preloader1.json",
    "content": "{\"abs_t\":5.263,\"active_graph\":\"root\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":228,\"y\":313,\"uid\":\"sW61WYtysOa4\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"RJMhP0G3QvTX\":\"Ys30r7aVEks1\"}},\"title\":\"3D model\",\"graph\":{\"uid\":\"IJ9GSVUdbuhs\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_loader_model\",\"x\":321,\"y\":234,\"uid\":\"H4iok82Go737\",\"state\":{\"url\":\"/data/scene/flamingo/flamingo.js\"}},{\"plugin\":\"three_mesh\",\"x\":687,\"y\":203,\"uid\":\"gPqFmSVJlldA\",\"open\":false,\"state\":{\"position\":{\"x\":0,\"y\":0.890837835382039,\"z\":0},\"scale\":{\"x\":0.0094948370835134,\"y\":0.0094948370835134,\"z\":0.0094948370835134},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":883,\"y\":205,\"uid\":\"RJMhP0G3QvTX\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]}],\"conns\":[{\"src_nuid\":\"H4iok82Go737\",\"dst_nuid\":\"gPqFmSVJlldA\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"Iz3RPWkJdqlL\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"gPqFmSVJlldA\",\"dst_nuid\":\"RJMhP0G3QvTX\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"C4wE3rtauufh\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"H4iok82Go737\",\"dst_nuid\":\"gPqFmSVJlldA\",\"src_slot\":\"materials\",\"dst_slot\":\"material\",\"uid\":\"VLXEbtRhlvTk\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"three_scene\",\"x\":572,\"y\":213,\"uid\":\"u2O8M5ItNlW5\",\"dyn_in\":[{\"type\":0,\"name\":\"0\",\"dt\":21,\"array\":true,\"uid\":\"DDzcOXqI6iRM\",\"dynamic\":true,\"index\":0,\"is_connected\":true},{\"type\":0,\"name\":\"1\",\"dt\":21,\"array\":true,\"uid\":\"gH5pmBKZK4lm\",\"dynamic\":true,\"index\":1,\"is_connected\":true},{\"type\":0,\"name\":\"2\",\"dt\":21,\"array\":true,\"uid\":\"ExPIjji5rvFO\",\"dynamic\":true,\"index\":2,\"is_connected\":true},{\"type\":0,\"name\":\"3\",\"dt\":21,\"array\":true,\"uid\":\"hddJID3FkB4R\",\"dynamic\":true,\"index\":3,\"is_connected\":true},{\"type\":0,\"name\":\"4\",\"dt\":21,\"array\":true,\"uid\":\"uSr941HZ6MvG\",\"dynamic\":true,\"index\":4,\"is_connected\":true},{\"type\":0,\"name\":\"5\",\"dt\":21,\"array\":true,\"uid\":\"oIEkIRoSmV9S\",\"dynamic\":true,\"index\":5}]},{\"plugin\":\"graph\",\"x\":284,\"y\":160,\"uid\":\"d9slZ3PC0CIC\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"xfsyKARw231b\":\"tjoeHNDBhUcN\"}},\"title\":\"Environment settings\",\"graph\":{\"uid\":\"362z87EM3leu\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_environment_settings\",\"x\":572,\"y\":469,\"uid\":\"DU82zgpxCApv\",\"title\":\"Environment settings\"},{\"plugin\":\"output_proxy\",\"x\":980,\"y\":512,\"uid\":\"xfsyKARw231b\",\"title\":\"environment\",\"dyn_in\":[{\"name\":\"output\",\"dt\":23,\"def\":null,\"uid\":\"Yy89wKzOcZo4\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"color_picker\",\"x\":216,\"y\":254,\"uid\":\"9lwgQEWjB9z7\",\"state\":{\"hue\":0.4438202247191011,\"sat\":0.449438202247191,\"lum\":0.7916666666666666}},{\"plugin\":\"slider_float_generator\",\"x\":168,\"y\":565,\"uid\":\"I4FcCKaQ1VsZ\",\"open\":false,\"state\":{\"val\":5.287,\"min\":0.1,\"max\":40},\"title\":\"Fog near\"},{\"plugin\":\"slider_float_generator\",\"x\":168,\"y\":689,\"uid\":\"o2XmpYbvT21H\",\"open\":false,\"state\":{\"val\":18.706,\"min\":1,\"max\":40},\"title\":\"Fog far\"}],\"conns\":[{\"src_nuid\":\"DU82zgpxCApv\",\"dst_nuid\":\"xfsyKARw231b\",\"src_slot\":\"environment\",\"dst_slot\":0,\"uid\":\"y43ylTEng2A3\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"9lwgQEWjB9z7\",\"dst_nuid\":\"DU82zgpxCApv\",\"src_slot\":\"color\",\"dst_slot\":\"fog color\",\"uid\":\"OpoOwp04Ujs1\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"I4FcCKaQ1VsZ\",\"dst_nuid\":\"DU82zgpxCApv\",\"src_slot\":\"value\",\"dst_slot\":\"fog near\",\"uid\":\"fbCsW7oq7D90\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"o2XmpYbvT21H\",\"dst_nuid\":\"DU82zgpxCApv\",\"src_slot\":\"value\",\"dst_slot\":\"fog far\",\"uid\":\"ba0BcdDsYNux\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"environment\",\"dt\":23,\"index\":0,\"uid\":\"tjoeHNDBhUcN\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":260,\"y\":212,\"uid\":\"nvHKHIESiXU4\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"CVIoBh0ZtDmi\":\"547odbJKrTzG\"}},\"title\":\"Point light 1\",\"graph\":{\"uid\":\"SY5HtB97QwvQ\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":1012,\"y\":374,\"uid\":\"CVIoBh0ZtDmi\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"vSy6Gj4JSPYs\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_point_light\",\"x\":730,\"y\":371,\"uid\":\"VD3yMohWpRUe\",\"open\":false,\"state\":{\"position\":{\"x\":-2.9420035670141815,\"y\":1.3598567240571549,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"const_float_generator\",\"x\":304,\"y\":295,\"uid\":\"EJ710G4QTm3r\",\"state\":{\"val\":1},\"title\":\"Intensity\"},{\"plugin\":\"color_picker\",\"x\":276,\"y\":449,\"uid\":\"Q61YriArv6Pm\",\"state\":{\"hue\":0,\"sat\":0,\"lum\":1}}],\"conns\":[{\"src_nuid\":\"VD3yMohWpRUe\",\"dst_nuid\":\"CVIoBh0ZtDmi\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"7hWfc0RsxJyE\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"EJ710G4QTm3r\",\"dst_nuid\":\"VD3yMohWpRUe\",\"src_slot\":\"value\",\"dst_slot\":\"intensity\",\"uid\":\"LWyX9S0LB0Kg\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Q61YriArv6Pm\",\"dst_nuid\":\"VD3yMohWpRUe\",\"src_slot\":\"color\",\"dst_slot\":\"color\",\"uid\":\"CZE6N3hYAMh3\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"547odbJKrTzG\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":256,\"y\":373,\"uid\":\"5zkZJ1kVzShg\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"0uogYZhTulp7\":\"mh0rTKkFm0nD\"}},\"title\":\"Floor\",\"graph\":{\"uid\":\"Hzr5rg9SHgsb\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":936,\"y\":221,\"uid\":\"GxMrrSaA44wq\",\"open\":false,\"state\":{\"position\":{\"x\":0,\"y\":-0.01311748567091614,\"z\":0.000023347093529794483},\"scale\":{\"x\":16.260185647641777,\"y\":16.260185647641777,\"z\":16.260185647641777},\"quaternion\":{\"_x\":-0.7077357707678449,\"_y\":0,\"_z\":0,\"_w\":0.7064772456816478}}},{\"plugin\":\"output_proxy\",\"x\":1105,\"y\":223,\"uid\":\"0uogYZhTulp7\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":153,\"y\":180,\"uid\":\"EtDika07Vgah\",\"state\":{\"url\":\"/data/image/3968db2bdad274fc19d8283eb73c4691b14ac0b1.png\"},\"title\":\"Box texture\"},{\"plugin\":\"three_material_phong\",\"x\":665,\"y\":280,\"uid\":\"IJzf3S2ECiJe\",\"open\":false},{\"plugin\":\"three_geometry_plane\",\"x\":751,\"y\":172,\"uid\":\"tr9n2eRfks8M\",\"open\":false},{\"plugin\":\"three_uv_modifier\",\"x\":459,\"y\":279,\"uid\":\"yFbNFt740ntr\",\"open\":false},{\"plugin\":\"const_float_generator\",\"x\":215,\"y\":386,\"uid\":\"4zFrJc6lCSIw\",\"state\":{\"val\":40},\"title\":\"Repeat\"}],\"conns\":[{\"src_nuid\":\"GxMrrSaA44wq\",\"dst_nuid\":\"0uogYZhTulp7\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"lJTzbafg9t8D\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"IJzf3S2ECiJe\",\"dst_nuid\":\"GxMrrSaA44wq\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"RpKIcJTsYoCQ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"tr9n2eRfks8M\",\"dst_nuid\":\"GxMrrSaA44wq\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"0XCswCxPk54c\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"EtDika07Vgah\",\"dst_nuid\":\"yFbNFt740ntr\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"zc3YwBYvy48H\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"yFbNFt740ntr\",\"dst_nuid\":\"IJzf3S2ECiJe\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"MDQEpZLF6BgA\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"4zFrJc6lCSIw\",\"dst_nuid\":\"yFbNFt740ntr\",\"src_slot\":\"value\",\"dst_slot\":\"u repeat\",\"uid\":\"QmYbjbM2eBox\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"4zFrJc6lCSIw\",\"dst_nuid\":\"yFbNFt740ntr\",\"src_slot\":\"value\",\"dst_slot\":\"v repeat\",\"uid\":\"3Udkt5dADKZd\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":275,\"y\":432,\"uid\":\"OFAU6PiJpRKz\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"2hsWszsB1Oqx\":\"mh0rTKkFm0nD\"}},\"title\":\"Sky sphere\",\"graph\":{\"uid\":\"d0ts6LaG0Ito\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":967,\"y\":294,\"uid\":\"teRtCbrPh2hp\",\"open\":false,\"state\":{\"position\":{\"x\":0,\"y\":0,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1166,\"y\":295,\"uid\":\"2hsWszsB1Oqx\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"bEdPpC9C6Rh1\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"url_texture_generator\",\"x\":194,\"y\":63,\"uid\":\"CN1HiUFJop0r\",\"state\":{\"url\":\"/data/image/7cbc45195c04d1595c43be42418755520068c72e.png\"},\"title\":\"Texture\"},{\"plugin\":\"three_material\",\"x\":656,\"y\":156,\"uid\":\"GULXMKCn1srD\",\"open\":false},{\"plugin\":\"const_float_generator\",\"x\":470,\"y\":234,\"uid\":\"Q6dO15gKNxXy\",\"open\":false,\"state\":{\"val\":1},\"title\":\"Side\"},{\"plugin\":\"toggle_button\",\"x\":431,\"y\":172,\"uid\":\"yIJ9nHl2KjnJ\",\"open\":false,\"state\":{\"enabled\":false},\"title\":\"Fog On/Off\"},{\"plugin\":\"const_float_generator\",\"x\":356,\"y\":372,\"uid\":\"V3r2F4N05quW\",\"open\":false,\"state\":{\"val\":40},\"title\":\"Size\"},{\"plugin\":\"const_float_generator\",\"x\":356,\"y\":438,\"uid\":\"iaDi4g88cvfk\",\"open\":false,\"state\":{\"val\":40},\"title\":\"Detail\"},{\"plugin\":\"three_geometry_sphere\",\"x\":558,\"y\":402,\"uid\":\"AGL6UFkir1c7\",\"open\":false}],\"conns\":[{\"src_nuid\":\"teRtCbrPh2hp\",\"dst_nuid\":\"2hsWszsB1Oqx\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"Sr1R9KE4EAZz\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"CN1HiUFJop0r\",\"dst_nuid\":\"GULXMKCn1srD\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"CTWt2medCPTN\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"GULXMKCn1srD\",\"dst_nuid\":\"teRtCbrPh2hp\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"i2XtF3ECWcGl\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"Q6dO15gKNxXy\",\"dst_nuid\":\"GULXMKCn1srD\",\"src_slot\":\"value\",\"dst_slot\":\"side\",\"uid\":\"MGvYD4B6ny36\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"yIJ9nHl2KjnJ\",\"dst_nuid\":\"GULXMKCn1srD\",\"src_slot\":\"bool\",\"dst_slot\":\"fog\",\"uid\":\"HctMlUo1nDt6\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"V3r2F4N05quW\",\"dst_nuid\":\"AGL6UFkir1c7\",\"src_slot\":\"value\",\"dst_slot\":\"radius\",\"uid\":\"9ofh4uafnCh4\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"iaDi4g88cvfk\",\"dst_nuid\":\"AGL6UFkir1c7\",\"src_slot\":\"value\",\"dst_slot\":\"widthSegments\",\"uid\":\"LSP6NcEmgITg\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"iaDi4g88cvfk\",\"dst_nuid\":\"AGL6UFkir1c7\",\"src_slot\":\"value\",\"dst_slot\":\"heightSegments\",\"uid\":\"GL4VE82BuHl7\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"AGL6UFkir1c7\",\"dst_nuid\":\"teRtCbrPh2hp\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"fNK1vxh3Jx44\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"mh0rTKkFm0nD\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":924,\"y\":314,\"uid\":\"A36bzZH8DcdD\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{\"YlMPXGvqX6Qi\":\"lbU7hDvbnKfg\"},\"output_sids\":{}},\"title\":\"Render Camera\",\"graph\":{\"uid\":\"hcR6bM67cn7r\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"input_proxy\",\"x\":576,\"y\":363,\"uid\":\"YlMPXGvqX6Qi\",\"title\":\"scene\",\"dyn_out\":[{\"name\":\"input\",\"dt\":11,\"uid\":\"uGHXM4cdeVb3\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_webgl_renderer\",\"x\":829,\"y\":234,\"uid\":\"H3NpBXQ33CMQ\",\"state\":{\"always_update\":true}},{\"plugin\":\"graph\",\"x\":538,\"y\":163,\"uid\":\"K30UllZb98fn\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"RKXcXi2YUOaG\":\"8GpdZjiiiEQa\"}},\"title\":\"VR camera\",\"graph\":{\"uid\":\"igFZcpxL20UA\",\"parent_uid\":\"hcR6bM67cn7r\",\"open\":true,\"nodes\":[{\"plugin\":\"three_vr_camera\",\"x\":536,\"y\":212,\"uid\":\"mtzlRxy1mqkA\",\"state\":{\"position\":{\"x\":0,\"y\":0.8,\"z\":2},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":787,\"y\":213,\"uid\":\"RKXcXi2YUOaG\",\"title\":\"camera\",\"dyn_in\":[{\"name\":\"output\",\"dt\":6,\"def\":null,\"uid\":\"uyyGR7LQwSEh\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]}],\"conns\":[{\"src_nuid\":\"mtzlRxy1mqkA\",\"dst_nuid\":\"RKXcXi2YUOaG\",\"src_slot\":\"camera\",\"dst_slot\":0,\"uid\":\"B3OlIbWqwlIb\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"camera\",\"dt\":6,\"index\":0,\"uid\":\"8GpdZjiiiEQa\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":\"K30UllZb98fn\",\"dst_nuid\":\"H3NpBXQ33CMQ\",\"src_slot\":0,\"dst_slot\":\"camera\",\"uid\":\"UWbhXF72yxkf\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"YlMPXGvqX6Qi\",\"dst_nuid\":\"H3NpBXQ33CMQ\",\"src_slot\":0,\"dst_slot\":\"scene\",\"uid\":\"WkdPKvuGVAEc\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true}]},\"dyn_in\":[{\"name\":\"scene\",\"dt\":11,\"index\":0,\"uid\":\"lbU7hDvbnKfg\",\"dynamic\":true,\"type\":0,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":236,\"y\":265,\"uid\":\"T6PXHoQNqdKa\",\"open\":false,\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"f2swnVnJFdoy\":\"547odbJKrTzG\"}},\"title\":\"Point light 2\",\"graph\":{\"uid\":\"qjCrT5ZjfFq7\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"output_proxy\",\"x\":1012,\"y\":374,\"uid\":\"f2swnVnJFdoy\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"vSy6Gj4JSPYs\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_point_light\",\"x\":730,\"y\":371,\"uid\":\"zhn71BezVLqg\",\"open\":false,\"state\":{\"position\":{\"x\":2.9928296822160516,\"y\":1.034341986571219,\"z\":0},\"scale\":{\"x\":1,\"y\":1,\"z\":1},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"const_float_generator\",\"x\":304,\"y\":295,\"uid\":\"F4J3NYEA4O6Y\",\"state\":{\"val\":1},\"title\":\"Intensity\"},{\"plugin\":\"color_picker\",\"x\":276,\"y\":449,\"uid\":\"8wyhZxwYzyha\",\"state\":{\"hue\":0,\"sat\":0,\"lum\":1}}],\"conns\":[{\"src_nuid\":\"zhn71BezVLqg\",\"dst_nuid\":\"f2swnVnJFdoy\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"CtaQMxmUCxIX\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"F4J3NYEA4O6Y\",\"dst_nuid\":\"zhn71BezVLqg\",\"src_slot\":\"value\",\"dst_slot\":\"intensity\",\"uid\":\"kORsBJuO0gRj\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"8wyhZxwYzyha\",\"dst_nuid\":\"zhn71BezVLqg\",\"src_slot\":\"color\",\"dst_slot\":\"color\",\"uid\":\"6PAHvh9N4Iv9\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"547odbJKrTzG\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":\"d9slZ3PC0CIC\",\"dst_nuid\":\"u2O8M5ItNlW5\",\"src_slot\":0,\"dst_slot\":\"environment\",\"uid\":\"rzc7AKK9kBoJ\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"nvHKHIESiXU4\",\"dst_nuid\":\"u2O8M5ItNlW5\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"n6HvJBWbhUTp\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"u2O8M5ItNlW5\",\"dst_nuid\":\"A36bzZH8DcdD\",\"src_slot\":\"scene\",\"dst_slot\":0,\"uid\":\"L5qI2R8ltVWo\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"OFAU6PiJpRKz\",\"dst_nuid\":\"u2O8M5ItNlW5\",\"src_slot\":0,\"dst_slot\":4,\"uid\":\"5kcE6nOcoLZR\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"5zkZJ1kVzShg\",\"dst_nuid\":\"u2O8M5ItNlW5\",\"src_slot\":0,\"dst_slot\":3,\"uid\":\"j7QD3FQVfiTJ\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"sW61WYtysOa4\",\"dst_nuid\":\"u2O8M5ItNlW5\",\"src_slot\":0,\"dst_slot\":2,\"uid\":\"PHkdX0UgZeGa\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"T6PXHoQNqdKa\",\"dst_nuid\":\"u2O8M5ItNlW5\",\"src_slot\":0,\"dst_slot\":1,\"uid\":\"4dPQlNzWSEeP\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true}]}}"
  },
  {
    "path": "browser/test/fixtures/subGraphCutUndo.json",
    "content": "{\n\t\"abs_t\": 382.121,\n\t\"active_graph\": \"root\",\n\t\"graph_uid\": \"TXDgBc0JJtS3\",\n\t\"root\": {\n\t\t\"uid\": \"root\",\n\t\t\"parent_uid\": -1,\n\t\t\"open\": true,\n\t\t\"nodes\": [\n\t\t\t{\n\t\t\t\t\"plugin\": \"three_scene\",\n\t\t\t\t\"x\": 749,\n\t\t\t\t\"y\": 333,\n\t\t\t\t\"uid\": \"u2O8M5ItNlW5\",\n\t\t\t\t\"dyn_in\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"type\": 0,\n\t\t\t\t\t\t\"name\": \"0\",\n\t\t\t\t\t\t\"dt\": 21,\n\t\t\t\t\t\t\"array\": true,\n\t\t\t\t\t\t\"uid\": \"DDzcOXqI6iRM\",\n\t\t\t\t\t\t\"dynamic\": true,\n\t\t\t\t\t\t\"index\": 0,\n\t\t\t\t\t\t\"is_connected\": true\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\t\"type\": 0,\n\t\t\t\t\t\t\"name\": \"1\",\n\t\t\t\t\t\t\"dt\": 21,\n\t\t\t\t\t\t\"array\": true,\n\t\t\t\t\t\t\"uid\": \"gH5pmBKZK4lm\",\n\t\t\t\t\t\t\"dynamic\": true,\n\t\t\t\t\t\t\"index\": 1,\n\t\t\t\t\t\t\"is_connected\": false\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"plugin\": \"graph\",\n\t\t\t\t\"x\": 554,\n\t\t\t\t\"y\": 360,\n\t\t\t\t\"uid\": \"5zkZJ1kVzShg\",\n\t\t\t\t\"state\": {\n\t\t\t\t\t\"always_update\": true,\n\t\t\t\t\t\"input_sids\": {},\n\t\t\t\t\t\"output_sids\": {\n\t\t\t\t\t\t\"0uogYZhTulp7\": \"mh0rTKkFm0nD\"\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t\"title\": \"Floor\",\n\t\t\t\t\"graph\": {\n\t\t\t\t\t\"uid\": \"Hzr5rg9SHgsb\",\n\t\t\t\t\t\"parent_uid\": \"root\",\n\t\t\t\t\t\"open\": true,\n\t\t\t\t\t\"nodes\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"plugin\": \"three_mesh\",\n\t\t\t\t\t\t\t\"x\": 936,\n\t\t\t\t\t\t\t\"y\": 221,\n\t\t\t\t\t\t\t\"uid\": \"GxMrrSaA44wq\",\n\t\t\t\t\t\t\t\"state\": {\n\t\t\t\t\t\t\t\t\"position\": {\n\t\t\t\t\t\t\t\t\t\"x\": 0,\n\t\t\t\t\t\t\t\t\t\"y\": -0.01311748567091614,\n\t\t\t\t\t\t\t\t\t\"z\": 0.000023347093529794483\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"scale\": {\n\t\t\t\t\t\t\t\t\t\"x\": 16.260185647641777,\n\t\t\t\t\t\t\t\t\t\"y\": 16.260185647641777,\n\t\t\t\t\t\t\t\t\t\"z\": 16.260185647641777\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"quaternion\": {\n\t\t\t\t\t\t\t\t\t\"_x\": -0.707106781186548,\n\t\t\t\t\t\t\t\t\t\"_y\": 0,\n\t\t\t\t\t\t\t\t\t\"_z\": 0,\n\t\t\t\t\t\t\t\t\t\"_w\": 0.707106781186548\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\t{\n\t\t\t\t\t\t\t\"plugin\": \"output_proxy\",\n\t\t\t\t\t\t\t\"x\": 1105,\n\t\t\t\t\t\t\t\"y\": 223,\n\t\t\t\t\t\t\t\"uid\": \"0uogYZhTulp7\",\n\t\t\t\t\t\t\t\"title\": \"object3d\",\n\t\t\t\t\t\t\t\"dyn_in\": [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\"name\": \"output\",\n\t\t\t\t\t\t\t\t\t\"dt\": 21,\n\t\t\t\t\t\t\t\t\t\"def\": null,\n\t\t\t\t\t\t\t\t\t\"uid\": \"bEdPpC9C6Rh1\",\n\t\t\t\t\t\t\t\t\t\"dynamic\": true,\n\t\t\t\t\t\t\t\t\t\"type\": 0,\n\t\t\t\t\t\t\t\t\t\"index\": 0,\n\t\t\t\t\t\t\t\t\t\"is_connected\": true,\n\t\t\t\t\t\t\t\t\t\"connected\": true\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\t{\n\t\t\t\t\t\t\t\"plugin\": \"three_geometry_plane\",\n\t\t\t\t\t\t\t\"x\": 751,\n\t\t\t\t\t\t\t\"y\": 172,\n\t\t\t\t\t\t\t\"uid\": \"tr9n2eRfks8M\",\n\t\t\t\t\t\t\t\"open\": false\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"plugin\": \"three_material\",\n\t\t\t\t\t\t\t\"x\": 713,\n\t\t\t\t\t\t\t\"y\": 357,\n\t\t\t\t\t\t\t\"uid\": \"K4pX2hXH8Ba8\",\n\t\t\t\t\t\t\t\"state\": {}\n\t\t\t\t\t\t}\n\t\t\t\t\t],\n\t\t\t\t\t\"conns\": [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"src_nuid\": \"GxMrrSaA44wq\",\n\t\t\t\t\t\t\t\"dst_nuid\": \"0uogYZhTulp7\",\n\t\t\t\t\t\t\t\"src_slot\": \"object3d\",\n\t\t\t\t\t\t\t\"dst_slot\": 0,\n\t\t\t\t\t\t\t\"uid\": \"lJTzbafg9t8D\",\n\t\t\t\t\t\t\t\"src_connected\": true,\n\t\t\t\t\t\t\t\"dst_connected\": true,\n\t\t\t\t\t\t\t\"dst_dyn\": true\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"src_nuid\": \"tr9n2eRfks8M\",\n\t\t\t\t\t\t\t\"dst_nuid\": \"GxMrrSaA44wq\",\n\t\t\t\t\t\t\t\"src_slot\": \"geometry\",\n\t\t\t\t\t\t\t\"dst_slot\": \"geometry\",\n\t\t\t\t\t\t\t\"uid\": \"0XCswCxPk54c\",\n\t\t\t\t\t\t\t\"src_connected\": true,\n\t\t\t\t\t\t\t\"dst_connected\": true\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\"src_nuid\": \"K4pX2hXH8Ba8\",\n\t\t\t\t\t\t\t\"dst_nuid\": \"GxMrrSaA44wq\",\n\t\t\t\t\t\t\t\"src_slot\": \"material\",\n\t\t\t\t\t\t\t\"dst_slot\": \"material\",\n\t\t\t\t\t\t\t\"uid\": \"3VCDHDVyWCrf\",\n\t\t\t\t\t\t\t\"src_connected\": true,\n\t\t\t\t\t\t\t\"dst_connected\": true\n\t\t\t\t\t\t}\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\t\"dyn_out\": [\n\t\t\t\t\t{\n\t\t\t\t\t\t\"name\": \"object3d\",\n\t\t\t\t\t\t\"dt\": 21,\n\t\t\t\t\t\t\"index\": 0,\n\t\t\t\t\t\t\"uid\": \"mh0rTKkFm0nD\",\n\t\t\t\t\t\t\"dynamic\": true,\n\t\t\t\t\t\t\"type\": 1,\n\t\t\t\t\t\t\"is_connected\": true\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t],\n\t\t\"conns\": [\n\t\t\t{\n\t\t\t\t\"src_nuid\": \"5zkZJ1kVzShg\",\n\t\t\t\t\"dst_nuid\": \"u2O8M5ItNlW5\",\n\t\t\t\t\"src_slot\": 0,\n\t\t\t\t\"dst_slot\": 0,\n\t\t\t\t\"uid\": \"kDBxFStA4tSD\",\n\t\t\t\t\"src_connected\": true,\n\t\t\t\t\"dst_connected\": true,\n\t\t\t\t\"src_dyn\": true,\n\t\t\t\t\"dst_dyn\": true\n\t\t\t}\n\t\t]\n\t}\n}"
  },
  {
    "path": "browser/test/fixtures/subGraphFloatOutput.json",
    "content": "{\"abs_t\":118.604,\"active_graph\":\"root\",\"graph_uid\":\"oDQjqfv8xGYy\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":298,\"y\":208,\"uid\":\"O73NHh5YGaai\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"IgNvln2lnd3U\":\"GQ9tAAfxLMgt\"}},\"title\":\"one\",\"graph\":{\"uid\":\"LVYMR9Mb1JAS\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"const_float_generator\",\"x\":206,\"y\":176,\"uid\":\"Q3cjTx9t2uRD\",\"state\":{\"val\":1},\"title\":\"one\"},{\"plugin\":\"output_proxy\",\"x\":380,\"y\":211,\"uid\":\"IgNvln2lnd3U\",\"title\":\"output\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"def\":null,\"uid\":\"lpZJbEUXKeqU\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]}],\"conns\":[{\"src_nuid\":\"Q3cjTx9t2uRD\",\"dst_nuid\":\"IgNvln2lnd3U\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"m3NHRkkYWQt1\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"index\":0,\"uid\":\"GQ9tAAfxLMgt\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"graph\",\"x\":291,\"y\":282,\"uid\":\"YZi6Ev0SQexi\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"mqJC1a7ya83x\":\"GQ9tAAfxLMgt\"}},\"title\":\"two\",\"graph\":{\"uid\":\"w7qoVLv3AAa6\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"const_float_generator\",\"x\":206,\"y\":176,\"uid\":\"3LtesXDCo0am\",\"state\":{\"val\":2},\"title\":\"two\"},{\"plugin\":\"output_proxy\",\"x\":380,\"y\":211,\"uid\":\"mqJC1a7ya83x\",\"title\":\"output\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"def\":null,\"uid\":\"lpZJbEUXKeqU\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]}],\"conns\":[{\"src_nuid\":\"3LtesXDCo0am\",\"dst_nuid\":\"mqJC1a7ya83x\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"olvchLCUXHbi\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"index\":0,\"uid\":\"GQ9tAAfxLMgt\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":285,\"y\":355,\"uid\":\"lTxN4SwLAECd\",\"state\":{\"val\":3},\"title\":\"three\"}],\"conns\":[]}}"
  },
  {
    "path": "browser/test/fixtures/tasty1.json",
    "content": "{\"abs_t\":7754.035,\"active_graph\":\"CM3ZPJd42DXF\",\"graph_uid\":\"TXDgBc0JJtS3\",\"root\":{\"uid\":\"root\",\"parent_uid\":-1,\"open\":true,\"nodes\":[{\"plugin\":\"graph\",\"x\":1409,\"y\":234,\"uid\":\"GKCJDXV2557h\",\"state\":{\"always_update\":true,\"input_sids\":{\"FMcyzwxMutQ2\":\"lbU7hDvbnKfg\"},\"output_sids\":{}},\"title\":\"Cam\",\"graph\":{\"uid\":\"CM3ZPJd42DXF\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"input_proxy\",\"x\":39,\"y\":432,\"uid\":\"FMcyzwxMutQ2\",\"title\":\"scene\",\"dyn_out\":[{\"name\":\"input\",\"dt\":11,\"uid\":\"uGHXM4cdeVb3\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_webgl_renderer\",\"x\":1308,\"y\":147,\"uid\":\"cNNpqQUaRrXL\",\"state\":{\"always_update\":true}},{\"plugin\":\"graph\",\"x\":313,\"y\":156,\"uid\":\"RtQdDec2QYjV\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"YaKvTqujhzz4\":\"8GpdZjiiiEQa\"}},\"title\":\"VR camera\",\"graph\":{\"uid\":\"TaKt97xAYuU9\",\"parent_uid\":\"CM3ZPJd42DXF\",\"open\":true,\"nodes\":[{\"plugin\":\"three_vr_camera\",\"x\":341,\"y\":281,\"uid\":\"pyUEv2XXrbau\",\"state\":{\"position\":{\"x\":-0.16868099969082617,\"y\":1.5022318390567229,\"z\":6.1706446681839315},\"quaternion\":{\"_x\":0.0022918026312820847,\"_y\":0.06302202525703898,\"_z\":-0.01072738178498727,\"_w\":0.9979518491762025}}},{\"plugin\":\"output_proxy\",\"x\":787,\"y\":213,\"uid\":\"YaKvTqujhzz4\",\"title\":\"camera\",\"dyn_in\":[{\"name\":\"output\",\"dt\":6,\"def\":null,\"uid\":\"uyyGR7LQwSEh\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]}],\"conns\":[{\"src_nuid\":\"pyUEv2XXrbau\",\"dst_nuid\":\"YaKvTqujhzz4\",\"src_slot\":\"camera\",\"dst_slot\":0,\"uid\":\"wwcTdM5ynNXx\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"camera\",\"dt\":6,\"index\":0,\"uid\":\"8GpdZjiiiEQa\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"three_gaze_clicker\",\"x\":655,\"y\":406,\"uid\":\"GapUv39SvFCK\",\"state\":{}},{\"plugin\":\"toggle_button\",\"x\":187,\"y\":603,\"uid\":\"aTCwXzdkkf9Z\",\"state\":{\"enabled\":true}},{\"plugin\":\"const_float_generator\",\"x\":187,\"y\":516,\"uid\":\"ZQQYmW3wY4gB\",\"state\":{\"val\":2}},{\"plugin\":\"color_picker\",\"x\":1011,\"y\":508,\"uid\":\"FQFy2zWk8rK5\",\"state\":{\"hue\":0.466292808988764,\"sat\":0.14606741573033707,\"lum\":0.5333333333333333}}],\"conns\":[{\"src_nuid\":\"RtQdDec2QYjV\",\"dst_nuid\":\"cNNpqQUaRrXL\",\"src_slot\":0,\"dst_slot\":\"camera\",\"uid\":\"KVhCVJEf3aDx\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"RtQdDec2QYjV\",\"dst_nuid\":\"GapUv39SvFCK\",\"src_slot\":0,\"dst_slot\":\"camera\",\"uid\":\"SEaBb88BvVBk\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"FMcyzwxMutQ2\",\"dst_nuid\":\"GapUv39SvFCK\",\"src_slot\":0,\"dst_slot\":\"scene\",\"uid\":\"yfun7WkqrWqV\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"GapUv39SvFCK\",\"dst_nuid\":\"cNNpqQUaRrXL\",\"src_slot\":\"scene\",\"dst_slot\":\"scene\",\"uid\":\"zbCDXdmCu3Fv\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"aTCwXzdkkf9Z\",\"dst_nuid\":\"GapUv39SvFCK\",\"src_slot\":\"bool\",\"dst_slot\":\"show icon\",\"uid\":\"T7PTQAN7RKqY\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"ZQQYmW3wY4gB\",\"dst_nuid\":\"GapUv39SvFCK\",\"src_slot\":\"value\",\"dst_slot\":\"delay\",\"uid\":\"qUusUHmbefLr\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"FQFy2zWk8rK5\",\"dst_nuid\":\"cNNpqQUaRrXL\",\"src_slot\":\"color\",\"dst_slot\":\"bgcolor\",\"uid\":\"8MRRjnvmgCXy\",\"src_connected\":true,\"dst_connected\":true}]},\"dyn_in\":[{\"name\":\"scene\",\"dt\":11,\"index\":0,\"uid\":\"lbU7hDvbnKfg\",\"dynamic\":true,\"type\":0,\"is_connected\":true}]},{\"plugin\":\"three_scene\",\"x\":1102,\"y\":257,\"uid\":\"qwBLZESbz9QG\",\"title\":\"Scene 1\",\"dyn_in\":[{\"type\":0,\"name\":\"0\",\"dt\":21,\"array\":true,\"uid\":\"DDzcOXqI6iRM\",\"dynamic\":true,\"index\":0,\"is_connected\":true},{\"type\":0,\"name\":\"1\",\"dt\":21,\"array\":true,\"uid\":\"ug5yNxv7bPEE\",\"dynamic\":true,\"index\":1}]},{\"plugin\":\"graph\",\"x\":736,\"y\":229,\"uid\":\"muduyUUTySeH\",\"state\":{\"always_update\":true,\"input_sids\":{},\"output_sids\":{\"MFzyJGC9vnUF\":\"Ys30r7aVEks1\"}},\"title\":\"Vis Up On Gaze\",\"graph\":{\"uid\":\"2MX855H3MDtq\",\"parent_uid\":\"root\",\"open\":true,\"nodes\":[{\"plugin\":\"three_mesh\",\"x\":1211,\"y\":350,\"uid\":\"6PAGQYdcwzxs\",\"state\":{\"position\":{\"x\":0.03717239065720079,\"y\":0.03926023317848015,\"z\":-1.193571944882679},\"scale\":{\"x\":0.0094948370835134,\"y\":0.0094948370835134,\"z\":0.0094948370835134},\"quaternion\":{\"_x\":0,\"_y\":0,\"_z\":0,\"_w\":1}}},{\"plugin\":\"output_proxy\",\"x\":1564,\"y\":482,\"uid\":\"MFzyJGC9vnUF\",\"title\":\"object3d\",\"dyn_in\":[{\"name\":\"output\",\"dt\":21,\"def\":null,\"uid\":\"UW8xhKSPhTFp\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"three_material\",\"x\":796,\"y\":239,\"uid\":\"7g6squRgRL4S\",\"state\":{}},{\"plugin\":\"vector\",\"x\":666,\"y\":616,\"uid\":\"KJnnvVfErGQm\"},{\"plugin\":\"const_float_generator\",\"x\":316,\"y\":682,\"uid\":\"njwTUvk7XPEq\",\"state\":{\"val\":1}},{\"plugin\":\"three_geometry_box\",\"x\":655,\"y\":45,\"uid\":\"tFAFFC4U7uqK\",\"open\":false},{\"plugin\":\"url_texture_generator\",\"x\":350,\"y\":42,\"uid\":\"tdh7M4XGVSNv\",\"open\":false,\"state\":{\"url\":\"\"}},{\"plugin\":\"graph\",\"x\":386,\"y\":240,\"uid\":\"Ub8fwFgYD2yn\",\"state\":{\"always_update\":true,\"input_sids\":{\"HJ63a2MSn4Pw\":\"Sufc2g2gKGTJ\",\"SFjJTX8EuMtP\":\"Bt9YRpZDWpE3\"},\"output_sids\":{\"N93TXrnJcYkD\":\"WUKXkGjqWAwt\"}},\"title\":\"Visibility up on trigger\",\"graph\":{\"uid\":\"UveVLgCQvWA3\",\"parent_uid\":\"2MX855H3MDtq\",\"open\":true,\"nodes\":[{\"plugin\":\"input_proxy\",\"x\":1,\"y\":302,\"uid\":\"HJ63a2MSn4Pw\",\"title\":\"over\",\"dyn_out\":[{\"name\":\"input\",\"dt\":7,\"uid\":\"Gt2RHxRweRQW\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"animate_float_on_trigger\",\"x\":957,\"y\":313,\"uid\":\"856DVcnwx2SQ\",\"state\":{\"blendFuncId\":\"linear-blend\"}},{\"plugin\":\"const_float_generator\",\"x\":724,\"y\":205,\"uid\":\"RGtSXkbKA5cg\",\"open\":false,\"state\":{\"val\":1},\"title\":\"max vis\"},{\"plugin\":\"output_proxy\",\"x\":1345,\"y\":183,\"uid\":\"N93TXrnJcYkD\",\"title\":\"visibility\",\"dyn_in\":[{\"name\":\"output\",\"dt\":0,\"def\":null,\"uid\":\"jwH9KXAwgKqD\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"toggle_button\",\"x\":336,\"y\":431,\"uid\":\"uR3JtuADmASY\",\"state\":{\"enabled\":false}},{\"plugin\":\"animate_float_on_trigger\",\"x\":996,\"y\":47,\"uid\":\"AdJL4mhScwPD\",\"open\":false,\"state\":{\"blendFuncId\":\"linear-blend\"}},{\"plugin\":\"input_proxy\",\"x\":31,\"y\":44,\"uid\":\"SFjJTX8EuMtP\",\"title\":\"out\",\"dyn_out\":[{\"name\":\"input\",\"dt\":7,\"uid\":\"mj85MkSNgLfB\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true,\"connected\":true}]},{\"plugin\":\"const_float_generator\",\"x\":343,\"y\":153,\"uid\":\"BweRfPPtjEY7\",\"state\":{\"val\":2},\"title\":\"countdown\"},{\"plugin\":\"const_float_generator\",\"x\":727,\"y\":121,\"uid\":\"DBFE4fWVxqwv\",\"open\":false,\"state\":{\"val\":0.2},\"title\":\"min vis\"},{\"plugin\":\"variable_local_write\",\"x\":1240,\"y\":55,\"uid\":\"hzCUAhG5jmT2\",\"title\":\"vis\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"KWQ6a8CBM9tM\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"variable_local_write\",\"x\":1205,\"y\":317,\"uid\":\"BfT9YYyz7KNv\",\"title\":\"vis\",\"dyn_in\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"y9vKQv8FRqWb\",\"dynamic\":true,\"type\":0,\"index\":0,\"is_connected\":true}]},{\"plugin\":\"variable_local_read\",\"x\":1218,\"y\":185,\"uid\":\"D3x5LVvtDK5K\",\"title\":\"vis\",\"dyn_out\":[{\"name\":\"value\",\"dt\":0,\"uid\":\"cqakQaCHYgPM\",\"dynamic\":true,\"type\":1,\"index\":0,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":\"HJ63a2MSn4Pw\",\"dst_nuid\":\"856DVcnwx2SQ\",\"src_slot\":0,\"dst_slot\":\"trigger\",\"uid\":\"XZGjG4PcvvFY\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"uR3JtuADmASY\",\"dst_nuid\":\"856DVcnwx2SQ\",\"src_slot\":\"bool\",\"dst_slot\":\"reset\",\"uid\":\"X7EbdzDWERaJ\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"RGtSXkbKA5cg\",\"dst_nuid\":\"856DVcnwx2SQ\",\"src_slot\":\"value\",\"dst_slot\":\"endValue\",\"uid\":\"ZaSFXFQF8evG\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"DBFE4fWVxqwv\",\"dst_nuid\":\"AdJL4mhScwPD\",\"src_slot\":\"value\",\"dst_slot\":\"endValue\",\"uid\":\"KKLapLN6wBsq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"SFjJTX8EuMtP\",\"dst_nuid\":\"AdJL4mhScwPD\",\"src_slot\":0,\"dst_slot\":\"trigger\",\"uid\":\"JbvEFtLAXK9V\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"AdJL4mhScwPD\",\"dst_nuid\":\"hzCUAhG5jmT2\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"p9bPjgDBMgfP\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"856DVcnwx2SQ\",\"dst_nuid\":\"BfT9YYyz7KNv\",\"src_slot\":\"value\",\"dst_slot\":0,\"uid\":\"3akan7B2nS7c\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"D3x5LVvtDK5K\",\"dst_nuid\":\"N93TXrnJcYkD\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"F9ZXMHHFa5t2\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true},{\"src_nuid\":\"DBFE4fWVxqwv\",\"dst_nuid\":\"856DVcnwx2SQ\",\"src_slot\":\"value\",\"dst_slot\":\"startValue\",\"uid\":\"y2a25hLTUQnC\",\"src_connected\":true,\"dst_connected\":true,\"offset\":1},{\"src_nuid\":\"RGtSXkbKA5cg\",\"dst_nuid\":\"AdJL4mhScwPD\",\"src_slot\":\"value\",\"dst_slot\":\"startValue\",\"uid\":\"mjsUSgTVZNyK\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"BweRfPPtjEY7\",\"dst_nuid\":\"856DVcnwx2SQ\",\"src_slot\":\"value\",\"dst_slot\":\"duration\",\"uid\":\"WYaYrbV8Ct9q\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"BweRfPPtjEY7\",\"dst_nuid\":\"AdJL4mhScwPD\",\"src_slot\":\"value\",\"dst_slot\":\"duration\",\"uid\":\"RaQDM9fsr9w5\",\"src_connected\":true,\"dst_connected\":true}],\"variables\":[{\"id\":\"vis\",\"dt\":0}]},\"dyn_in\":[{\"name\":\"out\",\"dt\":7,\"index\":0,\"uid\":\"Bt9YRpZDWpE3\",\"dynamic\":true,\"type\":0,\"is_connected\":true},{\"name\":\"over\",\"dt\":7,\"index\":1,\"uid\":\"Sufc2g2gKGTJ\",\"dynamic\":true,\"type\":0,\"is_connected\":true}],\"dyn_out\":[{\"name\":\"visibility\",\"dt\":0,\"index\":0,\"uid\":\"WUKXkGjqWAwt\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]},{\"plugin\":\"on_three_object_gaze_in\",\"x\":20,\"y\":336,\"uid\":\"SBxjnWjt7CPb\",\"state\":{\"nodeRef\":\"2MX855H3MDtq.6PAGQYdcwzxs\",\"type\":1}},{\"plugin\":\"toggle_button\",\"x\":222,\"y\":535,\"uid\":\"zPdJpWehxSP6\",\"state\":{\"enabled\":true}},{\"plugin\":\"on_three_object_gaze_out\",\"x\":18,\"y\":215,\"uid\":\"fsHhSRMjeYz8\",\"state\":{\"nodeRef\":\"2MX855H3MDtq.6PAGQYdcwzxs\",\"type\":1}}],\"conns\":[{\"src_nuid\":\"7g6squRgRL4S\",\"dst_nuid\":\"6PAGQYdcwzxs\",\"src_slot\":\"material\",\"dst_slot\":\"material\",\"uid\":\"cr529RZg2Cjq\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"KJnnvVfErGQm\",\"dst_nuid\":\"6PAGQYdcwzxs\",\"src_slot\":\"vector\",\"dst_slot\":\"scale\",\"uid\":\"TGNsJMWhrJnj\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"njwTUvk7XPEq\",\"dst_nuid\":\"KJnnvVfErGQm\",\"src_slot\":\"value\",\"dst_slot\":\"z\",\"uid\":\"42GpP6v7fm39\",\"src_connected\":true,\"dst_connected\":true,\"offset\":1},{\"src_nuid\":\"tFAFFC4U7uqK\",\"dst_nuid\":\"6PAGQYdcwzxs\",\"src_slot\":\"geometry\",\"dst_slot\":\"geometry\",\"uid\":\"jMHNvCKZQHF5\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"tdh7M4XGVSNv\",\"dst_nuid\":\"7g6squRgRL4S\",\"src_slot\":\"texture\",\"dst_slot\":\"texture\",\"uid\":\"XQKCsBwmeV7e\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"njwTUvk7XPEq\",\"dst_nuid\":\"KJnnvVfErGQm\",\"src_slot\":\"value\",\"dst_slot\":\"y\",\"uid\":\"ptkKEXTrFtx8\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"njwTUvk7XPEq\",\"dst_nuid\":\"KJnnvVfErGQm\",\"src_slot\":\"value\",\"dst_slot\":\"x\",\"uid\":\"XpYGGvmGAJ6W\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"zPdJpWehxSP6\",\"dst_nuid\":\"7g6squRgRL4S\",\"src_slot\":\"bool\",\"dst_slot\":\"transparent\",\"uid\":\"bbuqv89xBD2Q\",\"src_connected\":true,\"dst_connected\":true},{\"src_nuid\":\"6PAGQYdcwzxs\",\"dst_nuid\":\"MFzyJGC9vnUF\",\"src_slot\":\"object3d\",\"dst_slot\":0,\"uid\":\"v8KR4kryMrjD\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"Ub8fwFgYD2yn\",\"dst_nuid\":\"7g6squRgRL4S\",\"src_slot\":0,\"dst_slot\":\"opacity\",\"uid\":\"Kcds6FZL5B3Y\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true},{\"src_nuid\":\"SBxjnWjt7CPb\",\"dst_nuid\":\"Ub8fwFgYD2yn\",\"src_slot\":\"trigger\",\"dst_slot\":1,\"uid\":\"2JWsdxLmdpDc\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"fsHhSRMjeYz8\",\"dst_nuid\":\"Ub8fwFgYD2yn\",\"src_slot\":\"trigger\",\"dst_slot\":0,\"uid\":\"8kmbNVdP34QM\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}]},\"dyn_out\":[{\"name\":\"object3d\",\"dt\":21,\"index\":0,\"uid\":\"Ys30r7aVEks1\",\"dynamic\":true,\"type\":1,\"is_connected\":true}]}],\"conns\":[{\"src_nuid\":\"qwBLZESbz9QG\",\"dst_nuid\":\"GKCJDXV2557h\",\"src_slot\":\"scene\",\"dst_slot\":0,\"uid\":\"NCLRk7ftfsE2\",\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":\"muduyUUTySeH\",\"dst_nuid\":\"qwBLZESbz9QG\",\"src_slot\":0,\"dst_slot\":0,\"uid\":\"X2SBYcacT3pR\",\"src_connected\":true,\"dst_connected\":true,\"src_dyn\":true,\"dst_dyn\":true}]}}"
  },
  {
    "path": "browser/test/fixtures/variables.json",
    "content": "{\n    \"abs_t\": 24.291,\n    \"active_graph\": \"root\",\n    \"graph_uid\": \"TXDgBc0JJtS3\",\n    \"root\": {\n        \"uid\": \"root\",\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [{\n            \"plugin\": \"float_display\",\n            \"x\": 591,\n            \"y\": 512,\n            \"uid\": \"PPWUuJJAfA9d\"\n        }, {\n            \"plugin\": \"variable_local_read\",\n            \"x\": 358,\n            \"y\": 554,\n            \"uid\": \"h2Nc2JAuRTAj\",\n            \"title\": \"a\",\n            \"dyn_out\": [{\n                \"name\": \"value\",\n                \"dt\": 0,\n                \"uid\": \"qavppWBQBNVP\",\n                \"dynamic\": true,\n                \"type\": 1,\n                \"index\": 0,\n                \"is_connected\": true\n            }]\n        }, {\n            \"plugin\": \"const_float_generator\",\n            \"x\": 394,\n            \"y\": 206,\n            \"uid\": \"fAZW4hvpgS94\",\n            \"open\": false,\n            \"state\": {\n                \"val\": 1\n            }\n        }, {\n            \"plugin\": \"variable_local_write\",\n            \"x\": 616,\n            \"y\": 206,\n            \"uid\": \"2wTJQPVu6hfh\",\n            \"title\": \"a\",\n            \"dyn_in\": [{\n                \"name\": \"value\",\n                \"dt\": 0,\n                \"uid\": \"vAf24AGrKSkb\",\n                \"dynamic\": true,\n                \"type\": 0,\n                \"index\": 0,\n                \"is_connected\": true\n            }]\n        }, {\n            \"plugin\": \"const_float_generator\",\n            \"x\": 351,\n            \"y\": 356,\n            \"uid\": \"FejYhVsMPXYw\",\n            \"open\": false,\n            \"state\": {\n                \"val\": 1\n            }\n        }, {\n            \"plugin\": \"variable_local_write_conditional\",\n            \"x\": 613,\n            \"y\": 308,\n            \"uid\": \"u2B9S2sjSYx8\",\n            \"title\": \"a\",\n            \"dyn_in\": [{\n                \"name\": \"value\",\n                \"dt\": 0,\n                \"uid\": \"rj7XZfmB7pRk\",\n                \"dynamic\": true,\n                \"type\": 0,\n                \"index\": 0,\n                \"is_connected\": true\n            }]\n        }, {\n            \"plugin\": \"const_float_generator\",\n            \"x\": 359,\n            \"y\": 665,\n            \"uid\": \"5DrW5taVbkdw\",\n            \"open\": false,\n            \"state\": {\n                \"val\": 1\n            }\n        }, {\n            \"plugin\": \"variable_local_write_conditional\",\n            \"x\": 624,\n            \"y\": 657,\n            \"uid\": \"VQgedjNUNCrZ\",\n            \"title\": \"a\",\n            \"dyn_in\": [{\n                \"name\": \"value\",\n                \"dt\": 0,\n                \"uid\": \"rj7XZfmB7pRk\",\n                \"dynamic\": true,\n                \"type\": 0,\n                \"index\": 0,\n                \"is_connected\": true\n            }]\n        }, {\n            \"plugin\": \"const_float_generator\",\n            \"x\": 368,\n            \"y\": 795,\n            \"uid\": \"tn5BSNZd5CKS\",\n            \"open\": false,\n            \"state\": {\n                \"val\": 1\n            }\n        }, {\n            \"plugin\": \"variable_local_write_conditional\",\n            \"x\": 633,\n            \"y\": 787,\n            \"uid\": \"RztLT7vcH62U\",\n            \"title\": \"a\",\n            \"dyn_in\": [{\n                \"name\": \"value\",\n                \"dt\": 0,\n                \"uid\": \"rj7XZfmB7pRk\",\n                \"dynamic\": true,\n                \"type\": 0,\n                \"index\": 0,\n                \"is_connected\": true\n            }]\n        }],\n        \"conns\": [{\n            \"src_nuid\": \"h2Nc2JAuRTAj\",\n            \"dst_nuid\": \"PPWUuJJAfA9d\",\n            \"src_slot\": 0,\n            \"dst_slot\": \"float\",\n            \"uid\": \"X2dXj4785as4\",\n            \"src_dyn\": true\n        }, {\n            \"src_nuid\": \"fAZW4hvpgS94\",\n            \"dst_nuid\": \"2wTJQPVu6hfh\",\n            \"src_slot\": \"value\",\n            \"dst_slot\": 0,\n            \"uid\": \"fWL3rPkeQQjq\",\n            \"dst_dyn\": true\n        }, {\n            \"src_nuid\": \"FejYhVsMPXYw\",\n            \"dst_nuid\": \"u2B9S2sjSYx8\",\n            \"src_slot\": \"value\",\n            \"dst_slot\": 0,\n            \"uid\": \"tw4DY3krEgkK\",\n            \"dst_dyn\": true\n        }, {\n            \"src_nuid\": \"5DrW5taVbkdw\",\n            \"dst_nuid\": \"VQgedjNUNCrZ\",\n            \"src_slot\": \"value\",\n            \"dst_slot\": 0,\n            \"uid\": \"WSmkZmS4tZWm\",\n            \"dst_dyn\": true\n        }, {\n            \"src_nuid\": \"tn5BSNZd5CKS\",\n            \"dst_nuid\": \"RztLT7vcH62U\",\n            \"src_slot\": \"value\",\n            \"dst_slot\": 0,\n            \"uid\": \"FmaZC4Y3ztP3\",\n            \"dst_dyn\": true\n        }],\n        \"variables\": [{\n            \"id\": \"a\",\n            \"dt\": 0\n        }]\n    }\n}"
  },
  {
    "path": "browser/test/functional/config.js",
    "content": "exports.config = {\n\n    /**\n     * language of your feature files\n     * options: french, spanish, norwegian, polish, german, russian\n     */\n    language: 'english',\n\n    /**\n     * set selenium host and port\n     */\n    selenium: {\n        host: '127.0.0.1',\n        port: 4444\n    },\n\n    /**\n     * webdriverio options\n     *\n     * - logLevel: stdout log level\n     *   Options: *verbose* | *silent* | *command* | *data* | *result*\n     *\n     * - coloredLogs: Enables colors for log output\n     *   default: true\n     *\n     * - singleton: Set to true if you always want to reuse the same remote\n     *   default: false\n     *\n     * - waitforTimeout: Default timeout for all waitForXXX commands\n     *   default: 500\n     */\n    options: {\n        logLevel: 'silent',\n        waitforTimeout: 45000\n    },\n\n    /**\n     * desired capabilities\n     */\n    capabilities: {\n        browserName: 'chrome',\n        chromeOptions: {\n            args: ['--ignore-gpu-blacklist', '--use-gl']\n        }\n    },\n\n    /**\n     * location of feature files\n     */\n    featureFiles: [\n        'functional/features/**/*.feature'\n    ],\n\n    /**\n     * environment variables\n     *\n     * - baseUrl: sets base url for `Given I open the site \"/some/url.html\"`\n     */\n    env: {\n        baseUrl: 'http://127.0.0.1:8000'\n    },\n\n    /**\n     * mocha options\n     * @see http://mochajs.org/\n     */\n    mochaOpts: {\n        reporter: 'spec',\n        timeout: 60000,\n        require: 'chai'\n    }\n};\n"
  },
  {
    "path": "browser/test/functional/features/editor.feature",
    "content": "Feature: Editor feature\n\n  Background:\n    Given I open the editor\n\n  Scenario: Going to Program mode\n    Given I go to Program mode\n    Then I should see a patch called \"Scene 1\"\n"
  },
  {
    "path": "browser/test/functional/features/fork.feature",
    "content": "Feature: Forking feature\n\n  Background:\n    Given I am signed in\n    And I open the editor\n    And I publish the project\n    And the player is playing\n\n  Scenario: Forking many nodes\n    When I click on the button \"#edit\"\n    And I am in the editor\n    And I go to Program mode\n    And I select all nodes\n    And I copypaste\n    Then the project is forked\n    And I see 16 nodes\n\n\n"
  },
  {
    "path": "browser/test/functional/features/helpscreen.feature",
    "content": "Feature: Editor Helpscreen/Startscreen feature\n  The help screen has at least Examples and Help tabs\n  The tab Examples loads a list of graphs (article.graph)\n  The tab Help shows a list of links and they have svg icons\n\n  Background:\n    Given I open the editor\n    When I click on the button \"#btn-help\"\n    Then I expect that element \"#helpContainer\" becomes visible\n\n  Scenario: Help screen has tabs\n    Then I expect that element \"#helpContainer>nav\" is visible\n    And I expect that element \"a[href='#helpLinks']\" is visible\n    And I expect that element \"a[href='#helpExamples']\" is visible\n\n  Scenario: Help screen Tabs switch sections and work\n\n  \tWhen I click on the element \"a[href='#helpLinks']\"\n  \tThen I expect that element \"section#helpLinks\" becomes visible\n  \tAnd I expect that element \"a[href='http://blog.vizor.io']\" is visible\n  \tAnd I expect that element \"a[href='http://blog.vizor.io']>svg>use\" is visible\n\n  \tWhen I click on the element \"a[href='#helpExamples']\"\n  \tThen I expect that element \"section#helpExamples\" becomes visible\n  \tAnd I expect that element \"#helpExamples article.card\" becomes visible\n"
  },
  {
    "path": "browser/test/functional/features/publish.feature",
    "content": "Feature: Publishing\n\n  Background:\n    Given I am signed in\n    And I open the editor\n\n  Scenario: Publishing\n    When I publish the project\n    Then the player is playing\n"
  },
  {
    "path": "browser/test/functional/hooks/after.js",
    "content": "var fs = require('fs')\n\nvar AfterHook = module.exports = function(done) {\n\tvar that = this\n\n\tif (!this.hadFailures || !process.env.CI_BUILD_NUMBER)\n\t    return this.browser.end().then(done.bind({}, null))\n\n\tconsole.log('Saving log')\n\n\tthis.browser.log('browser')\n\t.then(function(log) {\n\t\tvar logStr  = 'Codeship: '+process.env.CI_BUILD_URL+'\\n'\n\t\t\tlogStr += 'Artefacts: http://fail.vizor.lol/' +\n\t\t\t\tprocess.env.CI_BUILD_NUMBER + '/\\n\\n'\n\t\t\tlogStr += 'Browser log:\\n\\n'\n\n\t\tlog.value.map(function(item) {\n\t\t\tvar itemStr = item.timestamp + ' ' + item.level + ' ' + item.message\n\t\t\tlogStr += itemStr + '\\n'\n\t\t})\n\n\t\tconsole.error(logStr)\n\n\t\tconsole.log('Writing log')\n\n\t\tfs.writeFileSync('./' + process.env.CI_BUILD_NUMBER + '/log.txt', logStr)\n\n\t\tconsole.log('Log saved')\n\t\n\t    that.browser\n\t    \t.end()\n\t    \t.then(done.bind({}, null))\n\t})\n};\n"
  },
  {
    "path": "browser/test/functional/hooks/afterEach.js",
    "content": "var fs = require('fs')\n\nvar AfterEachHook = module.exports = function (done) {\n\tif (this.state === 'passed') {\n\t\treturn done()\n\t}\n\n\tif (!process.env.CI_BUILD_NUMBER) {\n\t\treturn done()\n\t}\n\n\tvar that = this\n\n\tif (!fs.existsSync(process.env.CI_BUILD_NUMBER))\n\t\tfs.mkdirSync(process.env.CI_BUILD_NUMBER)\n\n\tvar shotName = './' +\n\t\tprocess.env.CI_BUILD_NUMBER + '/' +\n\t\t(this.scenario + '_' + this.step)\n\t\t.replace(/\\W+/g, ' ')\n\t\t.trim()\n\t\t.replace(/\\W+/g, '-') +\n\t\t'.png'\n\n\tthis.browser\n\t.saveScreenshot(shotName)\n\t.then(function() {\n\t\tconsole.log('Screenshot taken as', shotName)\n\t\tdone()\n\t});\n};\n"
  },
  {
    "path": "browser/test/functional/hooks/before.js",
    "content": "var WebdriverIO = require('webdriverio'),\n    merge = require('deepmerge'),\n    config = require('../support/configure'),\n    BeforeHook;\n\nBeforeHook = module.exports = function (done) {\n    var options = config.options;\n    options = merge(config.options, config.selenium || {});\n    options.desiredCapabilities = config.capabilities;\n\n    this.browser = WebdriverIO.remote(options);\n    this.browser.init().call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/hooks/beforeEach.js",
    "content": "var BeforeEachHook = module.exports = function (done) {\n    done();\n};\n"
  },
  {
    "path": "browser/test/functional/run.js",
    "content": "#!/usr/bin/env node\n\n/**\n * wrapper arround mocha cmd\n * figures out options and calls mocha with desired arguments\n */\n\nvar spawn = require('child_process').spawn,\n    path = require('path'),\n    args = [path.join('node_modules', 'mocha', 'bin', '_mocha')],\n    config = require('./config').config,\n    flag,\n    proc;\n\n/**\n * execute init script with mocha\n * init script handles the rest\n */\nargs.push(path.join(__dirname, 'support', 'init.js'));\n\n/**\n * set mocha configs\n */\n\nfor (flag in (config.mochaOpts || {})) {\n    args.push('--' + flag + '=' + config.mochaOpts[flag]);\n}\n\nprocess.argv.slice(2).forEach(function (arg) {\n    var flag;\n\n    /**\n     * set mocha specific args\n     */\n    flag = arg.split('=')[0];\n    switch (flag) {\n        case '-d':\n            args.unshift('--debug');\n            break;\n        case 'debug':\n        case '--debug':\n        case '--debug-brk':\n            args.unshift(arg);\n            break;\n        case '-gc':\n        case '--expose-gc':\n            args.unshift('--expose-gc');\n            break;\n        case '--gc-global':\n        case '--harmony':\n        case '--harmony-proxies':\n        case '--harmony-collections':\n        case '--harmony-generators':\n        case '--prof':\n            args.unshift(arg);\n            break;\n        default:\n            if (0 === arg.indexOf('--trace')) {\n                args.unshift(arg);\n            } else {\n                args.push(arg);\n            }\n            break;\n    }\n});\n\nproc = spawn(process.argv[0], args, {\n    stdio: 'inherit'\n});\nproc.on(\n    'exit',\n    function (code, signal) {\n        process.on(\n            'exit',\n            function () {\n                if (signal) {\n                    process.kill(process.pid, signal);\n                } else {\n                    process.exit(code);\n                }\n            }\n        );\n    }\n);\n"
  },
  {
    "path": "browser/test/functional/steps/given.js",
    "content": "/**\n * given steps\n */\n\nmodule.exports = function () {\n    this\n        // vizor\n        .given(/I open the editor$/,\n            require('../support/action/openEditor'))\n\n        .given(/I am in the editor$/,\n            require('../support/action/waitForEditor'))\n\n        .given(/I am signed in$/,\n            require('../support/action/signIn'))\n\n        .given(/I go to Program mode$/,\n            require('../support/action/programMode'))\n\n        // defaults\n\n        .given(/I open the (url|site) \"$string\"$/,\n            require('../support/action/openWebsite'))\n\n        .given(/^the element \"$string\" is( not)* visible$/,\n            require('../support/check/isVisible'))\n\n        .given(/^the element \"$string\" is( not)* enabled$/,\n            require('../support/check/isEnabled'))\n\n        .given(/^the element \"$string\" is( not)* selected$/,\n            require('../support/check/checkSelected'))\n\n        .given(/^the checkbox \"$string\" is( not)* checked$/,\n            require('../support/check/checkSelected'))\n\n        .given(/^there is (an|no) element \"$string\" on the page$/,\n            require('../support/check/checkElementExists'))\n\n        .given(/^the title is( not)* \"$string\"$/,\n            require('../support/check/checkTitle'))\n\n        .given(/^the element \"$string\" contains( not)* the same text as element \"$string\"$/,\n            require('../support/check/compareText'))\n\n        .given(/^the (element|inputfield) \"$string\" does( not)* contain the text \"$string\"$/,\n            require('../support/check/checkContent'))\n\n        .given(/^the (element|inputfield) \"$string\" does( not)* contain any text$/,\n            require('../support/check/checkContent'))\n\n        .given(/^the page url is( not)* \"$string\"$/,\n            require('../support/check/checkURL'))\n\n        .given(/^the( css)* attribute \"$string\" from element \"$string\" is( not)* \"$string\"$/,\n            require('../support/check/checkProperty'))\n\n        .given(/^the cookie \"$string\" contains( not)* the value \"$string\"$/,\n            require('../support/check/checkCookieContent'))\n\n        .given(/^the cookie \"$string\" does( not)* exist$/,\n            require('../support/check/checkCookieExists'))\n\n        .given(/^the element \"$string\" is( not)* ([\\d]+)px (broad|tall)$/,\n            require('../support/check/checkDimension'))\n\n        .given(/^the element \"$string\" is( not)* positioned at ([\\d]+)px on the (x|y) axis$/,\n            require('../support/check/checkOffset'))\n\n        .given(/^I have a screen that is ([\\d]+) by ([\\d]+) pixels$/,\n            require('../support/action/resizeScreenSize'))\n\n        .given(/^I have closed all but the first (window|tab)$/,\n            require('../support/action/closeAllButFirstTab'))\n\n        .given(/^a (alertbox|confirmbox|prompt) is( not)* opened$/,\n            require('../support/check/checkModal'));\n};\n"
  },
  {
    "path": "browser/test/functional/steps/then.js",
    "content": "/**\n * then steps\n */\n\nmodule.exports = function (dict) {\n    this\n        // vizor\n        .then(/^I should see a patch called \"$string\"$/,\n            require('../support/check/checkPatchVisible'))\n\n        .then(/^the player is playing$/,\n            require('../support/check/waitForPlayer'))\n\n        .then(/^the project is forked$/,\n            require('../support/check/waitForFork'))\n\n        .then(/^I see $number nodes$/,\n            require('../support/check/checkNodeCount'))\n\n        // defaults\n        .then(/^I expect that the title is( not)* \"$string\"$/,\n            require('../support/check/checkTitle'))\n\n        .then(/^I expect that element \"$string\" is( not)* visible$/,\n            require('../support/check/isVisible'))\n\n        .then(/^I expect that element \"$string\" becomes( not)* visible$/,\n            require('../support/action/waitForVisible'))\n\n        .then(/^I expect that element \"$string\" is( not)* within the viewport$/,\n            require('../support/check/checkWithinViewport'))\n\n        .then(/^I expect that element \"$string\" does( not)* exist$/,\n            require('../support/check/isExisting'))\n\n        .then(/^I expect that element \"$string\" does( not)* contain the same text as element \"$string\"$/,\n            require('../support/check/compareText'))\n\n        .then(/^I expect that (element|inputfield) \"$string\"( not)* contains the text \"$string\"$/,\n            require('../support/check/checkContent'))\n\n        .then(/^I expect that (element|inputfield) \"$string\" does( not)* contain any text$/,\n            require('../support/check/checkContent'))\n\n        .then(/^I expect that (element|inputfield) \"$string\" is( not)* empty$/,\n            require('../support/check/checkContainsText'))\n\n        .then(/^I expect that the url is( not)* \"$string\"$/,\n            require('../support/check/checkURL'))\n\n        .then(/^I expect that the path is( not)* \"$string\"$/,\n            require('../support/check/checkURLPath'))\n\n        .then(/^I expect the url to( not)* contain \"$string\"$/,\n            require('../support/check/checkInURLPath'))\n\n        .then(/^I expect that the( css)* attribute \"$string\" from element \"$string\" is( not)* \"$string\"$/,\n            require('../support/check/checkProperty'))\n\n        .then(/^I expect that checkbox \"$string\" is( not)* checked$/,\n            require('../support/check/checkSelected'))\n\n        .then(/^I expect that element \"$string\" is( not)* selected$/,\n            require('../support/check/checkSelected'))\n\n        .then(/^I expect that element \"$string\" is( not)* enabled$/,\n            require('../support/check/isEnabled'))\n\n        .then(/^I expect that cookie \"$string\"( not)* contains \"$string\"$/,\n            require('../support/check/checkCookieContent'))\n\n        .then(/^I expect that cookie \"$string\"( not)* exists$/,\n            require('../support/check/checkCookieExists'))\n\n        .then(/^I expect that element \"$string\" is( not)* ([\\d]+)px (broad|tall)$/,\n            require('../support/check/checkDimension'))\n\n        .then(/^I expect that element \"$string\" is( not)* positioned at ([\\d]+)px on the (x|y) axis$/,\n            require('../support/check/checkOffset'))\n\n        .then(/^I expect that element \"$string\" (has|does not have) the class \"$string\"$/,\n            require('../support/check/checkClass'))\n\n        .then(/^I expect a new (window|tab) has( not)* been opened$/,\n            require('../support/check/checkNewWindow'))\n\n        .then(/^I expect the url \"$string\" is opened in a new (tab|window)$/,\n            require('../support/check/checkIsOpenedInNewWindow'))\n\n        .then(/^I expect that element \"$string\" is( not)* focused$/,\n            require('../support/check/checkFocus'))\n\n        .then(/^I wait on element \"$string\"( for (\\d+)ms)*( to( not)* (be checked|be enabled|be selected|be visible|contain a text|contain a value|exist))*$/,\n            require('../support/action/waitfor'))\n\n        .then(/^I expect that a (alertbox|confirmbox|prompt) is( not)* opened$/,\n            require('../support/check/checkModal'))\n\n        .then(/^I expect that a (alertbox|confirmbox|prompt)( not)* contains the text \"$text\"$/,\n            require('../support/check/checkModalText'));\n};\n"
  },
  {
    "path": "browser/test/functional/steps/when.js",
    "content": "/**\n * when steps\n */\n\nvar config = require('../config').config\nvar os = require('os')\nvar ctrlKey = os.type() === 'Darwin' ? '\\uE03D' : '\\uE009'\n\nmodule.exports = function () {\n    this\n        // ---- vizor\n        .when(/^I select all nodes$/, function(done) {\n            this.browser\n              .keys([ctrlKey, 'a'])\n              .call(done)\n        })\n\n        .when(/^I copypaste$/, function(done) {\n            var that = this\n            var timeout = config.options.waitforTimeout\n            this.browser\n            .execute(function() {\n                E2.app.onCopy()\n                E2.app.pasteFromClipboard()\n            })\n            .call(done)\n        })\n\n        .when(/^I publish the project$/, function(done) {\n            this.browser\n            .click('#btn-publish')\n            .waitForVisible('#publishGraphForm', null, true)\n            .setValue('#pathInput', 'test'+Date.now())\n            .submitForm('#publishGraphForm')\n            .call(done)\n        })\n\n        // ---- defaults\n\n        .when(/^I (click|doubleclick) on the (link|button|element) \"$string\"$/,\n            require('../support/action/clickElement'))\n\n        .when(/^I (add|set) \"$string\" to the inputfield \"$string\"$/,\n            require('../support/action/setInputField'))\n\n        .when(/^I clear the inputfield \"$string\"$/,\n            require('../support/action/clearInputField'))\n\n        .when(/^I drag element \"$string\" to element \"$string\"$/,\n            require('../support/action/dragElement'))\n\n        .when(/^I submit the form \"$string\"$/,\n            require('../support/action/submitForm'))\n\n        .when(/^I pause for (\\d+)ms$/,\n            require('../support/action/pause'))\n\n        .when(/^I set a cookie \"$string\" with the content \"$string\"$/,\n            require('../support/action/setCookie'))\n\n        .when(/^I delete the cookie \"$string\"$/,\n            require('../support/action/readCookie'))\n\n        .when(/^I press \"$string\"$/,\n            require('../support/action/pressButton'))\n\n        .when(/^I (accept|dismiss) the (alertbox|confirmbox|prompt)$/,\n            require('../support/action/handleModal'))\n\n        .when(/^I enter \"$string\" into the prompt$/,\n            require('../support/action/setPromptText'))\n\n        .when(/^I scroll to element \"$string\"$/,\n            require('../support/action/scroll'))\n\n        .when(/^I close the last opened (window|tab)$/,\n            require('../support/action/closeLastOpenedWindow'))\n\n        .when(/^I focus the last opened (window|tab)$/,\n            require('../support/action/focusLastOpenedWindow'))\n\n        .when(/^I select the (\\d+)(st|nd|rd|th) option for element \"$string\"$/,\n            require('../support/action/selectOptionByIndex'))\n\n        .when(/^I select the option with the (name|value|text) \"$string\" for element \"$string\"$/,\n            require('../support/action/selectOption'))\n\n        .when(/^I move to element \"$string\"( with an offset of (\\d+),(\\d+))*$/,\n            require('../support/action/moveToElement'));\n};\n"
  },
  {
    "path": "browser/test/functional/support/action/clearInputField.js",
    "content": "module.exports = function (element, done) {\n    this.browser\n        .clearElement(element)\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/action/clickElement.js",
    "content": "module.exports = function (action, type, element, done) {\n    var elem = (type === 'link') ? '=' + element : element,\n        method = (action === 'click') ? 'click' : 'doubleClick';\n\n    this.browser[method](elem)\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/action/closeAllButFirstTab.js",
    "content": "var Q = require('q');\n\nmodule.exports = function (windowType, done) {\n    this.browser\n        // Close all tabs but the first one - this should remain the last step\n        .windowHandles()\n        .then(function (windowHandles) {\n            var handles = windowHandles.value,\n                currentHandleNr = 0,\n                browser = this;\n\n            return Q.all(handles.map(function (handle) {\n                        currentHandleNr++;\n\n                        if (currentHandleNr > 1) {\n                            return browser.close();\n                        }\n\n                        return handle;\n                    }\n                )\n            );\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/action/closeLastOpenedWindow.js",
    "content": "module.exports = function (type, done) {\n    this.browser\n        .windowHandles()\n        .then(function (windowHandles) {\n            var lastWindowHandle = windowHandles.value.slice(-1);\n\n            return this\n                .window(lastWindowHandle[0])\n                .close();\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/action/dragElement.js",
    "content": "module.exports = function (source, destination, done) {\n    this.browser\n        .dragAndDrop(source, destination, this.noError)\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/action/focusLastOpenedWindow.js",
    "content": "module.exports = function (type, done) {\n    this.browser\n        .windowHandles()\n        .then(function (windowHandles) {\n            var lastWindowHandle = windowHandles.value.slice(-1);\n\n            return this\n                .window(lastWindowHandle[0]);\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/action/handleModal.js",
    "content": "module.exports = function (action, modalType, done) {\n    var command = 'alert' + action.slice(0, 1).toUpperCase() + action.slice(1);\n\n    /**\n     * Alertboxes can't be dismissed, this causes Chrome to crash during tests\n     */\n    if (modalType === 'alertbox') {\n        command = 'alertAccept';\n    }\n\n    this.browser\n        .then(function () {\n            return this[command]();\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/action/moveToElement.js",
    "content": "module.exports = function (element, obsolete, x, y) {\n    var done = arguments[arguments.length - 1];\n\n    x = parseInt(x, 10) || undefined;\n    y = parseInt(y, 10) || undefined;\n    this.browser\n        .moveToObject(element, x, y)\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/action/openEditor.js",
    "content": "var config = require('../../config').config\n\nmodule.exports = function (done) {\n    var url = this.baseUrl + '/edit'\n    var timeout = config.options.waitforTimeout\n\n\tvar browser = this.browser\n\tvar ff = function() {\n\t\tbrowser\n\t\t\t.timeoutsAsyncScript(timeout)\n\t\t\t.executeAsync(function(cb) {\n\t\t\t\tvar interval = setInterval(function() {\n\t\t\t\t\tif (E2.app.channel.connected) {\n\t\t\t\t\t\tclearInterval(interval)\n\t\t\t\t\t\tcb()\n\t\t\t\t\t}\n\t\t\t\t}, 300)\n\t\t\t})\n\t\t\t.call(done)\n\t}\n\n    browser\n\t    .setViewportSize({ width: 1024, height: 768 })\n        .url(url)\n\t\t.waitForExist('body.bEditor')\n\t\t.waitForExist('div#canvases')\n\t\t.waitForVisible('.welcome', 5000)\n\t\t.then(function(){\n\t\t\tbrowser\n\t\t\t\t.click('.welcome button.close')\n\t\t\t\t.waitForExist('.welcome', null, true)\n\t\t\t\t.deleteCookie('vizor100')\n\t\t\t\t.then(ff)\n\t\t}, ff)\n}\n\n"
  },
  {
    "path": "browser/test/functional/support/action/openWebsite.js",
    "content": "module.exports = function (type, page, done) {\n    var url = (type === 'url') ? page : this.baseUrl + page;\n\n    this.browser\n        .url(url)\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/action/pause.js",
    "content": "module.exports = function (ms, done) {\n    this.browser\n        .pause(ms)\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/action/pressButton.js",
    "content": "module.exports = function (key, done) {\n    this.browser\n        .keys(key)\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/action/programMode.js",
    "content": "module.exports = function (done) {\n    this.browser\n        .click('button#programModeBtn')\n        .waitForVisible('.graph-node')\n        .call(done)\n}\n\n"
  },
  {
    "path": "browser/test/functional/support/action/readCookie.js",
    "content": "module.exports = function (name, done) {\n    this.browser\n        .deleteCookie(name)\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/action/resizeScreenSize.js",
    "content": "module.exports = function (screenWidth, screenHeight, done) {\n    this.browser\n        .windowHandleSize({\n            width: parseInt(screenWidth),\n            height: parseInt(screenHeight)\n        })\n        .refresh()\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/action/scroll.js",
    "content": "module.exports = function (selector, done) {\n    this.browser\n        .waitForExist(selector, 15000)\n        .then(function (result) {\n            return this\n                .scroll(selector);\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/action/selectOption.js",
    "content": "/*\n    I select the option with the (name|value|text) \"$string\" of element \"$string\"\n */\nmodule.exports = function (selectionType, selectionValue, selectElem, done) {\n    var command;\n\n    switch (selectionType) {\n        case 'name' : {\n            command = 'selectByName';\n            break;\n        }\n\n        case 'value' : {\n            command = 'selectByValue';\n            break;\n        }\n\n        case 'text' : {\n            command = 'selectByVisibleText';\n            break;\n        }\n\n        default: {\n            throw new Exception('Unknown selection type `' + selectionType + '`!');\n        }\n    }\n\n    this.browser[command](selectElem, selectionValue)\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/action/selectOptionByIndex.js",
    "content": "module.exports = function (index, indexSuffix, selectElem, done) {\n    this.browser\n        .selectByIndex(selectElem, +index)\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/action/setCookie.js",
    "content": "module.exports = function (name, content, done) {\n    this.browser\n        .setCookie({\n            name: name,\n            value: content\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/action/setInputField.js",
    "content": "module.exports = function (method, text, element, done) {\n    var command = (method === 'add') ? 'addValue' : 'setValue';\n\n    this.browser[command](element, text)\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/action/setPromptText.js",
    "content": "module.exports = function (modalText, done) {\n    this.browser\n        .alertText(modalText)\n        .then(function (text) {\n            return this;\n        }, function () {\n            assert.ok(false, 'A prompt was not open when it should have been open');\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/action/signIn.js",
    "content": "var config = require('../../config').config\n\n\nmodule.exports = function (done) {\n    var url = this.baseUrl + '/signup'\n    var timeout = config.options.waitforTimeout\n\n    var rand = process.hrtime().join('')\n\n    this.browser\n        .url(url)\n        .setValue('#name_id', 'Test User'+rand)\n        .setValue('#username_id', 'test'+rand)\n        .setValue('#email_id', 'test'+rand+'@vizor.io')\n        .setValue('#password_id', 't3st3r!R0b0t')\n        .click('button.sign-btn')\n        .call(done)\n}\n\n"
  },
  {
    "path": "browser/test/functional/support/action/submitForm.js",
    "content": "module.exports = function (form, done) {\n    this.browser\n        .submitForm(form)\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/action/waitForEditor.js",
    "content": "var config = require('../../config').config\n\nmodule.exports = function (done) {\n    var timeout = config.options.waitforTimeout\n    var url = this.baseUrl + '/edit'\n\n\tvar browser = this.browser\n\tvar ff = function() {\n\t\tbrowser\n\t\t\t.timeoutsAsyncScript(timeout)\n\t\t\t.executeAsync(function(cb) {\n\t\t\t\tvar interval = setInterval(function() {\n\t\t\t\t\tif (E2.app.channel.connected) {\n\t\t\t\t\t\tclearInterval(interval)\n\t\t\t\t\t\tcb()\n\t\t\t\t\t}\n\t\t\t\t}, 300)\n\t\t\t})\n\t\t\t.call(done)\n\t}\n\n    browser\n        .url(url)\n\t\t.waitForExist('body.bEditor')\n\t\t.waitForExist('div#canvases')\n\t\t.waitForVisible('.welcome', 5000)\n\t\t.then(function(){\n\t\t\tbrowser\n\t\t\t\t.click('div.welcome button.close')\n\t\t\t\t.waitForExist('.welcome', null, true)\n\t\t\t\t.deleteCookie('vizor100')\n\t\t\t\t.then(ff)\n\t\t}, ff)\n\n\n\n\n}\n\n"
  },
  {
    "path": "browser/test/functional/support/action/waitForVisible.js",
    "content": "module.exports = function (elem, falseCase, done) {\n    var ms = 5000;\n\n    falseCase = (falseCase) ? true : false;\n\n    this.browser\n        .waitForVisible(elem, ms, falseCase)\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/action/waitfor.js",
    "content": "module.exports = function (elem, obsolete, ms, isWaitingOnSpecificState, falseState, state) {\n    var command = 'waitForExist',\n        done = arguments[arguments.length - 1];\n\n    if (isWaitingOnSpecificState) {\n        state = state.indexOf(' ') > -1 ? state.split(/\\s/)[state.split(/\\s/).length - 1] : state;\n\n        // Cehckbox checked state translates to selected state\n        if (state === 'checked') {\n            state = 'selected';\n        }\n\n        command = 'waitFor' + state[0].toUpperCase() + state.slice(1);\n    }\n\n    falseState = (falseState) ? true : false;\n\n    ms = parseInt(ms, 10) || 3000;\n    this.browser[command](elem, ms, falseState)\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/checkClass.js",
    "content": "// /^I expect that element \"$string\" (has|does not have) the class \"$string\"$/\n\nmodule.exports = function (elem, falseCase, className, done) {\n    falseCase = (falseCase === 'does not have') ? true : false;\n\n    this.browser\n        .getAttribute(elem, 'className')\n        .then(function (classes) {\n            classes = classes.split(' ');\n\n            if (falseCase) {\n                expect(classes).to.not.include(className, 'Element ' + elem + ' should not have the class ' + className);\n            } else {\n                expect(classes).to.include(className, 'Element ' + elem + ' should have the class ' + className);\n            }\n\n            return this;\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/checkContainsText.js",
    "content": "/**\n * Check text content for specific element or input field\n */\n// jshint -W030\nmodule.exports = function (type, element, falseCase, done) {\n    var command = (type !== 'inputfield') ? 'getText' : 'getValue';\n\n    this.browser[command](element)\n        .then(function (text) {\n            if (falseCase) {\n                expect(text).to.not.be.empty;\n            } else {\n                expect(text).to.be.empty;\n            }\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/checkContent.js",
    "content": "/**\n * check content for specific element or input field\n */\n\nmodule.exports = function (type, element, falseCase, origText, done) {\n    var command = (type !== 'inputfield') ? 'getText' : 'getValue';\n\n    // Check for empty element\n    if (!done && typeof origText === 'function') {\n        done = origText;\n        origText = '';\n\n        falseCase = !falseCase;\n    }\n\n    this.browser[command](element)\n        .then(function (text) {\n            if (falseCase) {\n                origText.should.not.equal(text);\n            } else {\n                origText.should.equal(text);\n            }\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/checkCookieContent.js",
    "content": "/**\n * check cookie content\n */\n\nmodule.exports = function (name, falseCase, value, done) {\n    this.browser\n        .getCookie(name)\n        .then(function (cookie) {\n            cookie.name.should.equals(name, 'no cookie found with the name \"' + name + '\"');\n\n            if (falseCase) {\n                cookie.value.should.not.equal(value, 'expected cookie \"' + name + '\" not to have value ' + value);\n            } else {\n                cookie.value.should.equal(value, 'expected cookie \"' + name + '\" to have value ' + value + ' but got ' + cookie.value);\n            }\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/checkCookieExists.js",
    "content": "/**\n * check cookie content\n */\n// jshint -W030\nmodule.exports = function (name, falseCase, done) {\n    this.browser\n        .getCookie(name)\n        .then(function (cookie) {\n            if (falseCase) {\n                expect(cookie).to.be.null;\n            } else {\n                expect(cookie).not.to.be.null;\n            }\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/checkDimension.js",
    "content": "/**\n * check width and height\n */\n\nmodule.exports = function (elem, falseCase, size, dimension, done) {\n    this.browser\n        .getElementSize(elem)\n        .then(function (res) {\n            var check = res.height,\n                label = 'height';\n\n            if (dimension === 'broad') {\n                check = res.width;\n                label = 'width';\n            }\n\n            size = parseInt(size, 10);\n\n            if (falseCase) {\n                check.should.not.equal(size, 'element ' + elem + ' should not have a ' + label + ' of ' + size + 'px');\n            } else {\n                check.should.equal(size, 'Element ' + elem + ' should have a ' + label + ' of ' + size + 'px, but is ' + check + 'px');\n            }\n\n            return this;\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/checkElementExists.js",
    "content": "/**\n * check if element exists\n */\n\nmodule.exports = function (isExisting, elem, done) {\n    isExisting = (isExisting === 'an');\n\n    this.browser\n        .elements(elem)\n        .then(function (res) {\n            if (isExisting) {\n                expect(res.value).to.have.length.above(0, 'element with selector \"' + elem + '\" should exist on the page');\n            } else {\n                expect(res.value).to.have.length(0, 'element with selector \"' + elem + '\" should not exist on the page');\n            }\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/checkFocus.js",
    "content": "module.exports = function (selector, falseCase, done) {\n    this.browser\n        .isExisting(selector + \":focus\")\n        .then(function (isExisting) {\n            if (falseCase) {\n                isExisting.should.not.equal(true, \"Expected element to not be focused, but it is\");\n            } else {\n                isExisting.should.equal(true, \"Expected element to be focused, but it is not\");\n            }\n\n            return this;\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/checkInURLPath.js",
    "content": "module.exports = function (falseCase, value, done) {\n    this.browser\n        .url()\n        .then(function (result) {\n            if (falseCase) {\n                result.value.should.not.contain(value, 'Expected URL (' + result.value + ') not to contain \"' + value + '\"');\n            } else {\n                result.value.should.contain(value, 'Expected URL (' + result.value + ') to contain \"' + value + '\"');\n            }\n\n            return this;\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/checkIsOpenedInNewWindow.js",
    "content": "module.exports = function (url, windowOrTab, done) {\n    this.browser\n        .pause(5000)\n        .windowHandles()\n        .then(function (windowHandles) {\n            var lastWindowHandle = windowHandles.value.slice(-1);\n\n            windowHandles.value.length.should.not.equal(1, \"A popup was not opened\");\n\n            return this\n                .window(lastWindowHandle[0])\n                .url();\n        })\n        .then(function (result) {\n            var windowUrl = result.value;\n\n            windowUrl.should.contain(url, 'The popup has a incorrect url');\n\n            return this.close();\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/checkModal.js",
    "content": "module.exports = function (modalType, falseState, done) {\n    this.browser\n        .alertText()\n        .then(function () {\n            if (falseState) {\n                assert.ok(false, 'A ' + modalType + ' was opened when it shouldnt');\n            }\n        }, function () {\n            if (!falseState) {\n                assert.ok(false, 'A ' + modalType + ' was not opened when it should have been opened');\n            }\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/checkModalText.js",
    "content": "module.exports = function (modalType, falseState, modalText, done) {\n    this.browser\n        .alertText()\n        .then(function (text) {\n            if (falseState) {\n                text.should.not.equal(modalText);\n            } else {\n                text.should.equal(modalText);\n            }\n        }, function () {\n            assert.ok(false, 'A ' + modalType + ' was not opened when it should have been opened');\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/checkNewWindow.js",
    "content": "module.exports = function (type, falseCase, done) {\n    this.browser\n        .windowHandles()\n        .then(function (windowHandles) {\n            windowHandles = windowHandles.value;\n\n            if (falseCase) {\n                windowHandles.length.should.equal(1, \"A new window should not have not been opened\");\n            } else {\n                windowHandles.length.should.not.equal(1, \"A new window has been opened\");\n            }\n\n            return this;\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/checkNodeCount.js",
    "content": "/**\n * check number of nodes\n */\n\nmodule.exports = function(number, done) {\n    this.browser\n        .elements('span.p_title')\n        .then(function(elements) {\n            elements.value.length\n            .should.equal(parseInt(number, 10))\n        })\n        .call(done)\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/checkOffset.js",
    "content": "/**\n * check position\n */\n\nmodule.exports = function (elem, falseCase, position, axis, done) {\n    this.browser\n        .getLocation(elem, axis)\n        .then(function (res) {\n            position = parseInt(position, 10);\n\n            if (falseCase) {\n                res.should.not.equal(position, 'element ' + elem + ' should not be positioned at ' + position + 'px on the x axis');\n            } else {\n                res.should.equal(position, 'element ' + elem + ' should be positioned at ' + position + 'px on the x axis, but was found at ' + res + 'px');\n            }\n\n            return this;\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/checkPatchVisible.js",
    "content": "/**\n * check if patch is visible on canvas\n */\n\nmodule.exports = function (patchName, done) {\n    this.browser\n        .isVisible('span.p_title='+patchName)\n        .then(function(visible) {\n            visible.should.equal(true, 'expected patch \"' + patchName + '\" to be visible')\n        })\n        .call(done)\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/checkProperty.js",
    "content": "/**\n * check attribute or css property\n */\n\nmodule.exports = function (isCSS, attrName, elem, falseCase, value, done) {\n    var command = isCSS ? 'getCssProperty' : 'getAttribute';\n\n    this.browser[command](elem, attrName)\n        .then(function (res) {\n            /**\n             * when getting something with a color WebdriverIO returns a color\n             * object but we want to assert against a string\n             */\n            if (attrName.indexOf('color') > -1) {\n                res = res.value;\n            }\n\n            if (falseCase) {\n                res.should.not.equal(value, (isCSS ? 'CSS ' : '') + 'attribute of element ' + elem + ' should not contain ' + res);\n            } else {\n                res.should.equal(value, (isCSS ? 'CSS ' : '') + 'attribute of element ' + elem + ' should not contain ' + res + ', but ' + value);\n            }\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/checkSelected.js",
    "content": "/**\n * check if element is selected\n */\n\nmodule.exports = function (element, falseCase, done) {\n    this.browser\n        .isSelected(element)\n        .then(function (isSelected) {\n            if (falseCase) {\n                isSelected.should.not.equal(true, element + ' should not be selected');\n            } else {\n                isSelected.should.equal(true, element + ' should be selected');\n            }\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/checkTitle.js",
    "content": "/**\n * check title\n */\n\nmodule.exports = function (falseCase, docTitle, done) {\n    this.browser\n        .getTitle()\n        .then(function (title) {\n            if (falseCase) {\n                title.should.not.equal(docTitle, 'expected title not to be ' + docTitle);\n            } else {\n                title.should.equal(docTitle, 'expected title to be \"' + docTitle + '\"  but found \"' + title + '\"');\n            }\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/checkURL.js",
    "content": "/**\n * check url\n */\n\nmodule.exports = function (falseCase, url, done) {\n    this.browser\n        .url(function (err,result) {\n            should.not.exist(err);\n\n            if (falseCase) {\n                result.value.should.not.equal(url, 'expected url not to be ' + result.value);\n            } else {\n                result.value.should.equal(url, 'expected url to be \"' + url + '\"  but found \"' + result.value + '\"');\n            }\n\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/checkURLPath.js",
    "content": "/**\n * check url path\n */\nvar config = require('../../config.js').config;\n\nmodule.exports = function (falseCase, path, done) {\n    this.browser\n        .url()\n        .then(function (result) {\n            // Remove the domain from the url\n            var domain = config.env.baseUrl;\n\n            if (result.value.indexOf(domain) === 0) {\n                result.value = result.value.replace(domain, '');\n            }\n\n            if (falseCase) {\n                result.value.should.not.equal(path, 'expected path not to be ' + result.value);\n            } else {\n                result.value.should.equal(path, 'expected path to be \"' + path + '\"  but found \"' + result.value + '\"');\n            }\n\n            return this;\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/checkWithinViewport.js",
    "content": "module.exports = function (selector, falseCase, done) {\n    this.browser\n        .isVisibleWithinViewport(selector)\n        .then(function (isVisible) {\n            if (falseCase) {\n                isVisible.should.not.equal(true, 'Expected element \"' + selector + '\" to be outside the viewport, but it is not');\n            } else {\n                isVisible.should.equal(true, 'Expected element \"' + selector + '\" to be inside the viewport, but it is not');\n            }\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/compareText.js",
    "content": "/**\n * compare content of two elements\n */\n\nmodule.exports = function (element1, falseCase, element2, done) {\n    var text1 = '';\n\n    this.browser\n        .getText(element1)\n        .then(function (text) {\n            text1 = text;\n        })\n        .getText(element2)\n        .then(function (text) {\n            if (falseCase) {\n                text1.should.not.equal(text, 'expected text not to be ' + text1);\n            } else {\n                text1.should.equal(text, 'expected text to be \"' + text1 + '\"  but found \"' + text + '\"');\n            }\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/isEnabled.js",
    "content": "/**\n * check if element is visible\n */\n\nmodule.exports = function (element, falseCase, done) {\n    this.browser\n        .isEnabled(element)\n        .then(function (enabled) {\n            if (falseCase) {\n                enabled.should.not.equal(true, 'expected element \"' + element + '\" not to be enabled');\n            } else {\n                enabled.should.equal(true, 'expected element \"' + element + '\" to be enabled');\n            }\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/isExisting.js",
    "content": "/**\n * check if element is visible\n */\n\nmodule.exports = function (selector, falseCase, done) {\n    this.browser\n        .elements(selector)\n        .then(function (elements) {\n            if (falseCase) {\n                expect(elements.value).to.have.length(0, 'expected element \"' + elements + '\" not to exist');\n            } else {\n                expect(elements.value).to.have.length.above(0, 'expected element \"' + elements + '\" to exist');\n            }\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/isVisible.js",
    "content": "/**\n * check if element is visible\n */\n\nmodule.exports = function (element, falseCase, done) {\n    this.browser\n        .isVisible(element)\n        .then(function (visible) {\n            if (falseCase) {\n                visible.should.not.equal(true, 'expected element \"' + element + '\" not to be visible');\n            } else {\n                visible.should.equal(true, 'expected element \"' + element + '\" to be visible');\n            }\n        })\n        .call(done);\n};\n"
  },
  {
    "path": "browser/test/functional/support/check/waitForFork.js",
    "content": "var config = require('../../config').config\n\nmodule.exports = function (done) {\n    var timeout = config.options.waitforTimeout\n\n    this.browser\n        .execute(function(cb) {\n            E2.core.once('forked', cb)\n        })\n        .call(done)\n}\n\n"
  },
  {
    "path": "browser/test/functional/support/check/waitForPlayer.js",
    "content": "var config = require('../../config').config\n\nmodule.exports = function (done) {\n    var timeout = config.options.waitforTimeout\n\n    this.browser\n\t    .timeoutsAsyncScript(timeout)\n        .executeAsync(function(cb) {\n            E2.core.once('player:firstFramePlayed', function() {\n            \tsetTimeout(cb, 0)\n            })\n        })\n        .call(done)\n}\n\n"
  },
  {
    "path": "browser/test/functional/support/configure.js",
    "content": "/**\n * this file generates the config attribute according\n * to current NODE_ENV\n */\nvar fs = require('fs'),\n    path = require('path'),\n    merge = require('deepmerge'),\n    config = require('../config.js').config,\n    envConfigPath = path.join(__dirname, '..', 'config.' + process.env.NODE_ENV + '.js');\n\nif (process.env.NODE_ENV && fs.existsSync(envConfigPath)) {\n    config = merge(config, require(envConfigPath).config);\n}\n\nmodule.exports = config;\n"
  },
  {
    "path": "browser/test/functional/support/init.js",
    "content": "var Yadda = require('yadda'),\n    chai = require('chai'),\n    path = require('path'),\n    glob = require('glob'),\n    merge = require('deepmerge'),\n    config = require('./configure'),\n    beforeHook = require('../hooks/before.js'),\n    afterHook = require('../hooks/after.js'),\n    beforeEachHook = require('../hooks/beforeEach.js'),\n    fs = require('fs'),\n    afterEachHook = require('../hooks/afterEach.js'),\n    processed = 0,\n    fileCount = null,\n    context = {},\n    currentStep,\n    runIsolateTestOnly = false,\n    files = [];\n\n/**\n * expose assertion library\n */\nglobal.expect = chai.expect;\nglobal.assert = chai.assert;\nglobal.should = chai.should();\n\n/**\n * register own global namespace\n */\nglobal.testscope = {};\n\nYadda.plugins.mocha.StepLevelPlugin.init();\n\n/**\n * gather feature files\n */\nconfig.featureFiles.forEach(function (globPattern) {\n    glob.sync(\n        globPattern,\n        {\n            cwd: path.join(__dirname, '..', '..')\n        }\n    ).forEach(function (file) {\n        files.push(path.join(__dirname, '..', '..', file));\n    });\n});\n\n/**\n * Looking for tests scenarios to run in isolation, if found set the flag to run only those\n */\nfiles.forEach(function (file, i, files) {\n    featureFile(\n        file,\n        function (feature) {\n            scenarios(\n                feature.scenarios,\n                function (scenario) {\n                    if (scenario.annotations.isolate) {\n                        runIsolateTestOnly = true;\n                    }\n                }\n            );\n        }\n    );\n});\n\nfiles.forEach(function (file, i, files) {\n    fileCount = (fileCount === null) ? files.length : fileCount;\n\n    featureFile(\n        file,\n        function (feature) {\n            if (feature.annotations.pending) {\n                fileCount--;\n            }\n\n            before(function (done) {\n                if (processed === 0) {\n                    return beforeHook.call(global.testscope, beforeEachHook.bind(global.testscope, done));\n                }\n\n                beforeEachHook.call(global.testscope, done);\n            });\n\n            scenarios(\n                feature.scenarios,\n                function (scenario) {\n                    var stepDefinitions = require('./step-definitions'),\n                        yadda = new Yadda.Yadda(stepDefinitions, context);\n\n                    if (runIsolateTestOnly &&\n                        !scenario.annotations.isolate &&\n                        !scenario.annotations.only\n                    ) {\n                        return;\n                    }\n\n                    steps(\n                        scenario.steps,\n                        function (step, done) {\n                            global.testscope.scenario = scenario.title\n                            global.testscope.step = step\n\n                            var context = merge(global.testscope, config.env);\n\n                            if (scenario.annotations.executedBy) {\n                                context.browser = context.browser.select(scenario.annotations.executedBy);\n                            }\n\n                            yadda.run(step, context, done)\n                        }\n                    );\n                }\n            );\n\n            Yadda.EventBus.instance().on(\n                Yadda.EventBus.ON_EXECUTE,\n                function (event) {\n                    currentStep = event.data.step;\n                }\n            );\n\n            afterEach(function(done) {\n                global.testscope.state = this.currentTest ? this.currentTest.state : 'failed'\n\n                if (global.testscope.state === 'failed')\n                    global.testscope.hadFailures = true\n\n                afterEachHook.call(global.testscope, done);\n            })\n\n            after(function(done) {\n                global.testscope.state = this.currentTest ? this.currentTest.state : 'failed'\n                \n                if (global.testscope.state === 'failed')\n                    global.testscope.hadFailures = true\n\n                return afterHook.call(global.testscope, done);\n            });\n\n        }\n    );\n});\n"
  },
  {
    "path": "browser/test/functional/support/step-definitions.js",
    "content": "var Yadda = require('yadda'),\n    config = require('./configure'),\n    language = Yadda.localisation[upperCaseFirstLetter(config.language)],\n    fs = require('fs'),\n    path = require('path'),\n    chai = require('chai');\n\nmodule.exports = (function () {\n    var library = language.library(),\n        dictionary = new Yadda.Dictionary(),\n        stepsFiles = path.join(__dirname, '..', 'steps'),\n        steps = fs.readdirSync(stepsFiles);\n\n    /**\n     * define regex helpers\n     */\n    dictionary.define('string', '([^\"]*)?');\n\n    /**\n     * define step library\n     */\n    steps.forEach(function (step) {\n        require(path.join(stepsFiles, step)).call(library, dictionary);\n    });\n\n    return library;\n\n})();\n\nfunction upperCaseFirstLetter(word) {\n    return word.slice(0, 1).toUpperCase() + word.slice(1);\n}\n"
  },
  {
    "path": "browser/test/integration/357-color-converters.js",
    "content": "var assert = require('assert');\nvar fs = require('fs')\n\nvar reset = require('./helpers').reset;\n\ndescribe('Color converters', function() {\n\tvar source\n\n\tbeforeEach(function() {\n\t\treset()\n\n\t\tapp = E2.app\n\n\t\tsource = JSON.parse(fs.readFileSync(__dirname+'/../fixtures/357-color-convert-plugins.json')).root\n\t})\n\n\tit('displays the right color', function() {\n\t\tapp.setupStoreListeners()\n\n\t\tapp.pasteObject(source)\n\n\t\tE2.core.active_graph.update()\n\t\t\n\t\tassert.ok(E2.core.active_graph.nodes[10].plugin.color.r > 0.9999)\n\t\tassert.equal(E2.core.active_graph.nodes[10].plugin.color.g, 1)\n\t\tassert.equal(E2.core.active_graph.nodes[10].plugin.color.b, 0)\n\t\t\n\t\tassert.equal(E2.core.active_graph.nodes[11].plugin.color.r, 1)\n\t\tassert.equal(E2.core.active_graph.nodes[11].plugin.color.g, 1)\n\t\tassert.equal(E2.core.active_graph.nodes[11].plugin.color.b, 0)\n\n\t})\n\n})\n\n\t\n"
  },
  {
    "path": "browser/test/integration/array_function.js",
    "content": "var assert = require('assert')\nvar fs = require('fs')\nvar reset = require('./helpers').reset\nvar source = fs.readFileSync(__dirname+'/../fixtures/arrayfunction.json')\n\ndescribe('Array function', function() {\n\tbeforeEach(function() {\n\t\treset()\n\t\tapp = E2.app\n\t})\n\n\tit('keeps a copy for every iteration', function() {\n\t\tapp.setupStoreListeners()\n\n\t\tvar graph = E2.core.active_graph\n\n\t\tE2.core.deserialiseObject(JSON.parse(source))\n\n\t\tvar afn = E2.core.active_graph.nodes[0]\n\t\tvar afp = afn.plugin\n\n\t\t// clone the graphs x 3\n\t\tafp.update_input({ name: 'length' }, 3)\n\n\t\t// run a frame\n\t\tafp.update_state({ delta_t: 1 })\n\n\t\tassert.equal(3, afp.graph.copies.length)\n\n\t\t// collect id's for created objects\n\t\tvar frame1ids = []\n\t\tafp.graph.copies.map(function(igraph) {\n\t\t\tframe1ids.push(\n\t\t\t\tigraph.nodes[2].plugin // text\n\t\t\t\t\t.graph.nodes[4].plugin // mesh\n\t\t\t\t\t\t.object3d.uuid\n\t\t\t)\n\t\t})\n\n\t\t// run another frame\n\t\tafp.update_state({ delta_t: 2 })\n\n\t\t// collect id's for created objects\n\t\tvar frame2ids = []\n\t\tafp.graph.copies.map(function(igraph) {\n\t\t\tframe2ids.push(\n\t\t\t\tigraph.nodes[2].plugin // text\n\t\t\t\t\t.graph.nodes[4].plugin // mesh\n\t\t\t\t\t\t.object3d.uuid\n\t\t\t)\n\t\t})\n\n\t\t// make sure they haven't been recreated\n\t\tassert.deepEqual(frame1ids, frame2ids)\n\t})\n\n\tit('applies edits to all copies', function() {\n\t\tapp.setupStoreListeners()\n\n\t\tvar graph = E2.core.active_graph\n\n\t\tE2.core.deserialiseObject(JSON.parse(source))\n\n\t\tvar afn = E2.core.active_graph.nodes[0]\n\t\tvar afp = afn.plugin\n\n\t\t// clone the graphs x 3\n\t\tafp.update_input({ name: 'length' }, 3)\n\n\t\tvar orig = afp.graph\n\n\t\tvar changedUpdates = 0\n\n\t\tafp.graph.copies.map(function(copy) {\n\t\t\tcopy.once('nodeRemoved', function() { changedUpdates++ })\n\t\t})\n\n\t\tE2.app.dispatcher.dispatch({\n\t\t\tactionType: 'uiNodeRemoved',\n\t\t\tgraphUid: orig.uid,\n\t\t\tnodeUid: orig.nodes[0].uid\n\t\t})\n\n\t\tassert.equal(3, changedUpdates)\n\t})\n\n})\n\n\t\n"
  },
  {
    "path": "browser/test/integration/array_switch_modulator.js",
    "content": "var assert = require('assert');\n\nvar helpers = require('./helpers')\nvar reset = helpers.reset\nvar connect = helpers.connect\nvar disconnect = helpers.disconnect\n\nvar reset = require('./helpers').reset;\n\ndescribe('array_switch_modulator', function() {\n\tbeforeEach(function() {\n\t\treset()\n\t})\n\n\tit('clears arrayness', function() {\n\t\tvar graph = E2.core.active_graph\n\n\t\tvar floatNode1 = E2.app.instantiatePlugin('const_float_generator')\n\t\tvar floatNode2 = E2.app.instantiatePlugin('const_float_generator')\n\t\tvar inputsToArrayNode = E2.app.instantiatePlugin('inputs_to_array')\n\t\tvar arraySwitchModulator = E2.app.instantiatePlugin('array_switch_modulator')\n\n\t\tvar pullerNode = E2.app.instantiatePlugin('float_display')\n\n\t\tconnect(graph, floatNode1, 0, inputsToArrayNode, 0, true)\n\t\tconnect(graph, floatNode2, 0, inputsToArrayNode, 1, true)\n\n\t\tE2.app.graphApi.addSlot(graph, arraySwitchModulator, {\n\t\t\ttype: E2.slot_type.input,\n\t\t\tname: '0',\n\t\t\tdt: arraySwitchModulator.plugin.lsg.dt\n\t\t})\n\n\t\t// connect array to revolver\n\t\tvar arrayConn = connect(graph, inputsToArrayNode, 0, arraySwitchModulator, 0, true)\n\n\t\tfloatNode1.plugin.state.val = 10\n\t\tfloatNode2.plugin.state.val = 20\n\n\t\tconnect(graph, arraySwitchModulator, 1, pullerNode, 0)\n\n\t\tarraySwitchModulator.plugin.lsg.infer_dt()\n\n\t\t// pull array, expect [10, 20]\n\t\tarraySwitchModulator.plugin.update_input({index: 0}, 0)\n\t\tgraph.update()\n\t\tarraySwitchModulator.plugin.update_state()\n\t\tassert.deepEqual(arraySwitchModulator.plugin.update_output({index: 0}), [10, 20])\n\n\t\t// disconnect\n\t\tdisconnect(graph, arrayConn)\n\n\t\t// check with no inputs\n\t\tarraySwitchModulator.plugin.update_input({index: 0}, 0)\n\t\tgraph.update()\n\t\tarraySwitchModulator.plugin.update_state()\n\t\tassert.deepEqual(arraySwitchModulator.plugin.update_output({index: 0}), 0)\n\n\t\t// connect a single float\n\t\tconnect(graph, floatNode1, 0, arraySwitchModulator, 0, true)\n\t\tarraySwitchModulator.plugin.lsg.infer_dt()\n\n\t\tgraph.update()\n\t\tarraySwitchModulator.plugin.update_state()\n\t\tassert.deepEqual(arraySwitchModulator.plugin.update_output({index: 0}), 10)\n\t})\n\n\tit('propagates arrayness', function() {\n\t\tvar graph = E2.core.active_graph\n\n\t\tvar inputSelectorNumberNode = E2.app.instantiatePlugin('const_float_generator')\n\n\t\tvar floatNode1 = E2.app.instantiatePlugin('const_float_generator')\n\t\tvar floatNode2 = E2.app.instantiatePlugin('const_float_generator')\n\t\tvar floatNode3 = E2.app.instantiatePlugin('const_float_generator')\n\t\tvar inputsToArrayNode1 = E2.app.instantiatePlugin('inputs_to_array')\n\t\tvar inputsToArrayNode2 = E2.app.instantiatePlugin('inputs_to_array')\n\t\tvar arraySwitchModulator = E2.app.instantiatePlugin('array_switch_modulator')\n\n\t\tvar pullerNode = E2.app.instantiatePlugin('float_display')\n\n\t\tconnect(graph, floatNode1, 0, inputsToArrayNode1, 0, true)\n\t\tconnect(graph, floatNode2, 0, inputsToArrayNode1, 1, true)\n\n\t\tconnect(graph, floatNode2, 0, inputsToArrayNode2, 0, true)\n\t\tconnect(graph, floatNode3, 0, inputsToArrayNode2, 1, true)\n\n\t\tE2.app.graphApi.addSlot(graph, arraySwitchModulator, {\n\t\t\ttype: E2.slot_type.input,\n\t\t\tname: '0',\n\t\t\tdt: arraySwitchModulator.plugin.lsg.dt\n\t\t})\n\n\t\tE2.app.graphApi.addSlot(graph, arraySwitchModulator, {\n\t\t\ttype: E2.slot_type.input,\n\t\t\tname: '1',\n\t\t\tdt: arraySwitchModulator.plugin.lsg.dt\n\t\t})\n\n\t\t// connect input selector to revolver\n\t\tconnect(graph, inputSelectorNumberNode, 0, arraySwitchModulator, 0, false)\n\n\t\t// connect arrays to revolver\n\t\tvar arrayConn1 = connect(graph, inputsToArrayNode1, 0, arraySwitchModulator, 0, true)\n\t\tvar arrayConn2 = connect(graph, inputsToArrayNode2, 0, arraySwitchModulator, 1, true)\n\n\t\tfloatNode1.plugin.state.val = 10\n\t\tfloatNode2.plugin.state.val = 20\n\t\tfloatNode3.plugin.state.val = 30\n\n\t\tconnect(graph, arraySwitchModulator, 1, pullerNode, 0)\n\n\t\tarraySwitchModulator.plugin.lsg.infer_dt()\n\n\t\t// length\n\t\tassert.equal(arraySwitchModulator.plugin.update_output({index: 1}), 2)\n\n\t\t// select the second array, expect [20, 30]\n\t\tinputSelectorNumberNode.plugin.state.val = 1\n\t\tinputSelectorNumberNode.plugin.updated = true\n\t\tgraph.update()\n\t\tarraySwitchModulator.plugin.update_state()\n\t\tassert.deepEqual(arraySwitchModulator.plugin.update_output({index: 0}), [20, 30])\n\n\t\t// select the first array, expect [10, 20]\n\t\tinputSelectorNumberNode.plugin.state.val = 0\n\t\tinputSelectorNumberNode.plugin.updated = true\n\t\tgraph.update()\n\t\tarraySwitchModulator.plugin.update_state()\n\t\tassert.deepEqual(arraySwitchModulator.plugin.update_output({index: 0}), [10, 20])\n\n\t\t// disconnect\n\t\tE2.app.graphApi.disconnect(graph, arrayConn1)\n\t\tE2.app.onLocalConnectionChanged(arrayConn1)\n\n\t\tE2.app.graphApi.disconnect(graph, arrayConn2)\n\t\tE2.app.onLocalConnectionChanged(arrayConn1)\n\n\t\t// connect non-arrays to revolver\n\t\tvar floatConn1 = connect(graph, floatNode1, 0, arraySwitchModulator, 0, true)\n\t\tvar floatConn2 = connect(graph, floatNode2, 0, arraySwitchModulator, 1, true)\n\n\t\tarraySwitchModulator.plugin.lsg.infer_dt()\n\n\t\tfloatNode1.plugin.state.val = 40\n\t\tfloatNode2.plugin.state.val = 50\n\t\tfloatNode1.plugin.updated = true\n\t\tfloatNode2.plugin.updated = true\n\n\t\tgraph.update()\n\n\t\t// length\n\t\tassert.equal(arraySwitchModulator.plugin.update_output({index: 1}), 2)\n\n\t\t// select first input, expect 40\n\t\tinputSelectorNumberNode.plugin.state.val = 0\n\t\tinputSelectorNumberNode.plugin.updated = true\n\t\tgraph.update()\n\t\tarraySwitchModulator.plugin.update_state()\n\t\tassert.deepEqual(arraySwitchModulator.plugin.update_output({index: 0}), 40)\n\n\t\t// select second input, expect 50\n\t\tinputSelectorNumberNode.plugin.state.val = 1\n\t\tinputSelectorNumberNode.plugin.updated = true\n\t\tgraph.update()\n\t\tarraySwitchModulator.plugin.update_state()\n\t\tassert.deepEqual(arraySwitchModulator.plugin.update_output({index: 0}), 50)\n\n\t\tfloatNode1.plugin.state.val = 60\n\n\t\t// select first input again, expect 60\n\t\tinputSelectorNumberNode.plugin.state.val = 0\n\t\tinputSelectorNumberNode.plugin.updated = true\n\t\tgraph.update()\n\t\tarraySwitchModulator.plugin.update_state()\n\t\tassert.deepEqual(arraySwitchModulator.plugin.update_output({index: 0}), 60)\n\t})\n\n\tit('updates inactive input chains', function() {\n\t\tvar graph = E2.core.active_graph\n\n\t\tvar inputSelectorNumberNode = E2.app.instantiatePlugin('const_float_generator')\n\n\t\tvar floatNode1 = E2.app.instantiatePlugin('const_float_generator')\n\t\tvar floatNode2 = E2.app.instantiatePlugin('const_float_generator')\n\n\t\tvar addNode = E2.app.instantiatePlugin('add_modulator')\n\n\t\tvar arraySwitchModulator = E2.app.instantiatePlugin('array_switch_modulator')\n\n\t\tvar pullerNode = E2.app.instantiatePlugin('float_display')\n\n\t\tE2.app.graphApi.addSlot(graph, arraySwitchModulator, {\n\t\t\ttype: E2.slot_type.input,\n\t\t\tname: '0',\n\t\t\tdt: arraySwitchModulator.plugin.lsg.dt\n\t\t})\n\n\t\tE2.app.graphApi.addSlot(graph, arraySwitchModulator, {\n\t\t\ttype: E2.slot_type.input,\n\t\t\tname: '1',\n\t\t\tdt: arraySwitchModulator.plugin.lsg.dt\n\t\t})\n\n\t\t// connect input selector to revolver\n\t\tconnect(graph, inputSelectorNumberNode, 0, arraySwitchModulator, 0, false)\n\n\t\t// connect float1 to add node\n\t\tconnect(graph, floatNode1, 0, addNode, 0, false)\n\n\t\t// connect arrays to revolver\n\t\tvar arrayConn1 = connect(graph, addNode, 0, arraySwitchModulator, 0, true)\n\t\tvar arrayConn2 = connect(graph, floatNode2, 0, arraySwitchModulator, 1, true)\n\n\t\tfloatNode1.plugin.state.val = 10\n\t\tfloatNode2.plugin.state.val = 20\n\n\t\tconnect(graph, arraySwitchModulator, 1, pullerNode, 0)\n\n\t\tarraySwitchModulator.plugin.lsg.infer_dt()\n\n\t\t// select the first array, expect 10\n\t\tinputSelectorNumberNode.plugin.state.val = 0\n\t\tinputSelectorNumberNode.plugin.updated = true\n\t\tgraph.update()\n\t\tarraySwitchModulator.plugin.update_state()\n\t\tassert.deepEqual(arraySwitchModulator.plugin.update_output({index: 0}), 10)\n\n\t\t// select the second array, expect 20\n\t\tinputSelectorNumberNode.plugin.state.val = 1\n\t\tinputSelectorNumberNode.plugin.updated = true\n\t\tgraph.update()\n\t\tarraySwitchModulator.plugin.update_state()\n\t\tassert.deepEqual(arraySwitchModulator.plugin.update_output({index: 0}), 20)\n\n\t\tfloatNode1.plugin.state.val = 30\n\n\t\t// select first input, expect 30\n\t\tinputSelectorNumberNode.plugin.state.val = 0\n\t\tinputSelectorNumberNode.plugin.updated = true\n\t\tgraph.update()\n\t\tarraySwitchModulator.plugin.update_state()\n\t\tassert.deepEqual(arraySwitchModulator.plugin.update_output({index: 0}), 30)\n\n\t\tfloatNode2.plugin.state.val = 40\n\n\t\t// select second input, expect 40\n\t\tinputSelectorNumberNode.plugin.state.val = 1\n\t\tinputSelectorNumberNode.plugin.updated = true\n\t\tgraph.update()\n\t\tarraySwitchModulator.plugin.update_state()\n\t\tassert.deepEqual(arraySwitchModulator.plugin.update_output({index: 0}), 40)\n\n\t\tfloatNode1.plugin.state.val = 50\n\n\t\t// select first input, expect 50\n\t\tinputSelectorNumberNode.plugin.state.val = 0\n\t\tinputSelectorNumberNode.plugin.updated = true\n\t\tgraph.update()\n\t\tarraySwitchModulator.plugin.update_state()\n\t\tassert.deepEqual(arraySwitchModulator.plugin.update_output({index: 0}), 50)\n\t})\n\n})\n\n\n"
  },
  {
    "path": "browser/test/integration/connections.js",
    "content": "var assert = require('assert')\n\nvar helpers = require('./helpers')\n\nvar EditConnection = require('../../scripts/editConnection')\n\ndescribe('Connections', function() {\n\tvar core, app, graphApi, ec\n\n\tbeforeEach(function() {\n\t\tcore = helpers.reset()\n\t\t\n\t\tglobal.window = { location: { pathname: 'test/test' } }\n\n\t\trequire('../../scripts/util')\n\n\t\tapp = E2.app\n\t\tapp.player = { core: core }\n\t\tapp.channel = { broadcast: function(){}}\n\t\tapp.updateCanvas = function(){}\n\t\tglobal.E2.app = app\n\t\tgraphApi = E2.app.graphApi\n\t})\n\n\tit('can undo and redo connection replacement', function() {\n\t\tapp.setupStoreListeners()\n\t\tvar graph = E2.core.active_graph\n\n\t\tvar toggle1 = E2.app.instantiatePlugin('toggle_button', [0,0])\n\t\tvar toggle2 = E2.app.instantiatePlugin('toggle_button', [0,0])\n\t\tvar toggle3 = E2.app.instantiatePlugin('toggle_button', [0,0])\n\n\t\tvar boolDisplay = E2.app.instantiatePlugin('bool_display', [0,0])\n\t\tvar ds = boolDisplay.plugin.input_slots[0]\n\n\t\t// connect first toggle\n\t\tvar conn1 = new Connection(toggle1, null, toggle1.plugin.output_slots[0], null)\n\t\tec = new EditConnection(graphApi, conn1)\n\t\tec.hoverSlot(boolDisplay, ds)\n\t\tec.commit()\n\n\t\tassert.equal(boolDisplay.inputs[0].src_slot, toggle1.plugin.output_slots[0])\n\t\tassert.equal(1, toggle1.outputs.length)\n\t\tassert.equal(true, toggle1.plugin.output_slots[0].is_connected)\n\n\t\t// replace with second toggle\n\t\tvar conn2 = new Connection(toggle2, null, toggle2.plugin.output_slots[0], null)\n\t\tec = new EditConnection(graphApi, conn2)\n\t\tec.hoverSlot(boolDisplay, ds)\n\t\tec.commit()\n\n\t\tassert.deepEqual(boolDisplay.inputs[0].src_slot, toggle2.plugin.output_slots[0])\n\t\tassert.equal(0, toggle1.outputs.length)\n\t\tassert.equal(1, toggle2.outputs.length)\n\t\tassert.equal(0, toggle3.outputs.length)\n\t\tassert.equal(false, toggle1.plugin.output_slots[0].is_connected)\n\t\tassert.equal(true, toggle2.plugin.output_slots[0].is_connected)\n\t\tassert.ok(!toggle3.plugin.output_slots[0].is_connected)\n\n\t\t// replace with third toggle\n\t\tvar conn3 = new Connection(toggle3, null, toggle3.plugin.output_slots[0], null)\n\t\tec = new EditConnection(graphApi, conn3)\n\t\tec.hoverSlot(boolDisplay, ds)\n\t\tec.commit()\n\n\t\tassert.deepEqual(boolDisplay.inputs[0].src_slot, toggle3.plugin.output_slots[0])\n\t\tassert.equal(0, toggle1.outputs.length)\n\t\tassert.equal(0, toggle2.outputs.length)\n\t\tassert.equal(1, toggle3.outputs.length)\n\t\tassert.equal(false, toggle1.plugin.output_slots[0].is_connected)\n\t\tassert.equal(false, toggle2.plugin.output_slots[0].is_connected)\n\t\tassert.equal(true, toggle3.plugin.output_slots[0].is_connected)\n\n\t\t// undo, reverting to 2nd connection\n\t\tE2.app.undoManager.undo() \n\t\tassert.equal(boolDisplay.inputs[0].src_slot, toggle2.plugin.output_slots[0])\n\t\tassert.equal(0, toggle1.outputs.length)\n\t\tassert.equal(1, toggle2.outputs.length)\n\t\tassert.equal(0, toggle3.outputs.length)\n\t\tassert.equal(false, toggle1.plugin.output_slots[0].is_connected)\n\t\tassert.equal(true, toggle2.plugin.output_slots[0].is_connected)\n\t\tassert.equal(false, toggle3.plugin.output_slots[0].is_connected)\n\n\t\t// undo, reverting to 1st connection\n\t\tE2.app.undoManager.undo() \n\t\tassert.equal(boolDisplay.inputs[0].src_slot, toggle1.plugin.output_slots[0])\n\t\tassert.equal(1, toggle1.outputs.length)\n\t\tassert.equal(0, toggle2.outputs.length)\n\t\tassert.equal(0, toggle3.outputs.length)\n\t\tassert.equal(true, toggle1.plugin.output_slots[0].is_connected)\n\t\tassert.equal(false, toggle2.plugin.output_slots[0].is_connected)\n\t\tassert.equal(false, toggle3.plugin.output_slots[0].is_connected)\n\n\t\t// undo, reverting to none\n\t\tE2.app.undoManager.undo() \n\t\tassert.equal(0, toggle1.outputs.length)\n\t\tassert.equal(0, toggle2.outputs.length)\n\t\tassert.equal(0, toggle3.outputs.length)\n\t\tassert.equal(false, toggle1.plugin.output_slots[0].is_connected)\n\t\tassert.equal(false, toggle2.plugin.output_slots[0].is_connected)\n\t\tassert.equal(false, toggle3.plugin.output_slots[0].is_connected)\n\n\t\t// redo, reverting to first\n\t\tE2.app.undoManager.redo() \n\t\tassert.equal(1, toggle1.outputs.length)\n\t\tassert.equal(0, toggle2.outputs.length)\n\t\tassert.equal(0, toggle3.outputs.length)\n\t\tassert.equal(true, toggle1.plugin.output_slots[0].is_connected)\n\t\tassert.equal(false, toggle2.plugin.output_slots[0].is_connected)\n\t\tassert.equal(false, toggle3.plugin.output_slots[0].is_connected)\n\n\t\t// redo, reverting to 2nd\n\t\tE2.app.undoManager.redo() \n\t\tassert.equal(0, toggle1.outputs.length)\n\t\tassert.equal(1, toggle2.outputs.length)\n\t\tassert.equal(0, toggle3.outputs.length)\n\t\tassert.equal(false, toggle1.plugin.output_slots[0].is_connected)\n\t\tassert.equal(true, toggle2.plugin.output_slots[0].is_connected)\n\t\tassert.equal(false, toggle3.plugin.output_slots[0].is_connected)\n\n\t\t// redo, reverting to 3rd\n\t\tE2.app.undoManager.redo() \n\t\tassert.equal(0, toggle1.outputs.length)\n\t\tassert.equal(0, toggle2.outputs.length)\n\t\tassert.equal(1, toggle3.outputs.length)\n\t\tassert.equal(false, toggle1.plugin.output_slots[0].is_connected)\n\t\tassert.equal(false, toggle2.plugin.output_slots[0].is_connected)\n\t\tassert.equal(true, toggle3.plugin.output_slots[0].is_connected)\n\n\t})\n\n})\n\n"
  },
  {
    "path": "browser/test/integration/graphShapes.js",
    "content": "var assert = require('assert');\n\nvar helpers = require('./helpers')\n\ndescribe('Simple graph shapes', function() {\n\tvar core, app\n\n\tbeforeEach(function() {\n\t\tcore = helpers.reset()\n\t\t\n\t\tglobal.window = { location: { pathname: 'test/test' } }\n\n\t\trequire('../../scripts/util')\n\n\t\tE2.commands.graph = require('../../scripts/commands/graphEditCommands')\n\t\tapp = E2.app\n\t\tapp.player = { core: core }\n\t\tapp.channel = { broadcast: function(){}}\n\t\tapp.updateCanvas = function(){}\n\t\tglobal.E2.app = app\n\t})\n\n\tit('subgraph with input and output proxy', function() {\n\t\tvar graphNode = E2.app.instantiatePlugin('graph', [0,0])\n\t\tvar graph = graphNode.plugin.graph\n\t\tE2.core.active_graph = graph\n\n\t\tE2.app.instantiatePlugin('input_proxy', [0,0])\n\t\tE2.app.instantiatePlugin('output_proxy', [0,0])\n\t\t\n\t\tassert.equal(E2.core.graphs.length, 2)\n\t\tassert.equal(graph.nodes.length, 2)\n\t\tassert.equal(graphNode.plugin.parent_node.dyn_inputs.length, 1)\n\t\tassert.equal(graphNode.plugin.parent_node.dyn_outputs.length, 1)\n\t})\n\n\tit('input_proxy connected to float sets type', function() {\n\t\tapp.setupStoreListeners()\n\t\tvar graphNode = E2.app.instantiatePlugin('graph', [0,0])\n\t\tvar graph = graphNode.plugin.graph\n\t\tE2.core.active_graph = graph\n\t\tvar ipx = E2.app.instantiatePlugin('input_proxy', [0,0])\n\t\tvar floatDisplay = E2.app.instantiatePlugin('float_display', [0,0])\n\t\tvar ss = ipx.dyn_outputs[0]\n\t\tvar ds = floatDisplay.plugin.input_slots[0]\n\t\tE2.app.graphApi.connect(graph, new Connection(ipx, floatDisplay, ss, ds, 0))\n\t\tassert.equal(ss.dt.name, 'Float')\n\t})\n\n\tit('connected input_proxy add redo does not throw', function() {\n\t\tapp.setupStoreListeners()\n\t\tvar pg = E2.core.active_graph\n\n\t\tvar graphNode = E2.app.instantiatePlugin('graph', [0,0])\n\t\tvar graph = graphNode.plugin.graph\n\t\tE2.core.active_graph = graph\n\n\t\tvar ipx = E2.app.instantiatePlugin('input_proxy', [0,0])\n\t\tvar floatDisplay = E2.app.instantiatePlugin('float_display', [0,0])\n\t\tvar ss = ipx.dyn_outputs[0]\n\t\tvar ds = floatDisplay.plugin.input_slots[0]\n\n\t\tvar ipxFloatConn = new Connection(ipx, floatDisplay, ss, ds, 0)\n\t\tE2.app.graphApi.connect(graph, ipxFloatConn)\n\n\t\tvar constFloat = E2.app.instantiatePlugin('const_float_generator', [0,0])\n\t\tss = constFloat.plugin.output_slots[0]\n\t\tds = graphNode.dyn_inputs[0]\n\n\t\tE2.core.active_graph = pg\n\t\tE2.app.graphApi.connect(pg, new Connection(constFloat, graphNode, ss, ds, 0))\n\n\t\tE2.app.undoManager.undo() // undo connection\n\t\tE2.app.undoManager.undo() // undo constFloat\n\t\tE2.app.undoManager.undo() // undo ipx-floatDisplay connection\n\t\tE2.app.undoManager.undo() // undo floatDisplay\n\t\tE2.app.undoManager.undo() // undo ipx\n\n\t\tE2.app.undoManager.redo() // redo ipx\n\t\tE2.app.undoManager.redo() // redo floatDisplay\n\t\tE2.app.undoManager.redo() // redo ipx-floatDisplay connection\n\t\tE2.app.undoManager.redo() // redo constFloat\n\t\tE2.app.undoManager.redo() // redo connection\n\t})\n\n})\n\n"
  },
  {
    "path": "browser/test/integration/helpers.js",
    "content": "var assert = require('assert')\nvar fs = require('fs');\nvar vm = require('vm');\nvar when = require('when')\nvar browserPath = __dirname+'/../../';\nvar EventEmitter = require('events').EventEmitter\n\nvar requireRoot = browserPath\n\nvar _ = require('lodash')\n\nglobal.clone = _.cloneDeep.bind(_)\n\nglobal.Plugin = require(browserPath+'scripts/plugin.js')\nglobal.SubGraphPlugin = require(browserPath+'scripts/subGraphPlugin.js')\n\nglobal.EventEmitter = require('events').EventEmitter\nglobal.Node = require(browserPath+'scripts/node.js').Node\nglobal.LinkedSlotGroup = require(browserPath+'scripts/node.js').LinkedSlotGroup\n\nexports.slot = function slot(index, type, dt) {\n\treturn {\n\t\tindex: index,\n\t\ttype: type,\n\t\tdt: dt\n\t}\n}\n\nexports.mockE2Classes = function() {\n\tglobal.AssetLoader = function AssetLoader() {\n\t\tEventEmitter.call(this)\n\t\tthis.defaultTexture = { clone: function() {} }\n\t\tthis.loadingTexture = { clone: function() {} }\n\t}\n\n\tglobal.AssetLoader.prototype = Object.create(EventEmitter.prototype)\n\tglobal.AssetLoader.prototype.loadAsset = function() {\n\t\treturn when.resolve()\n\t}\n\n\tglobal.PluginManager = function() {\n\t\tthis.keybyid = {}\n\t}\n\tglobal.PluginManager.prototype = Object.create(EventEmitter.prototype)\n\tglobal.PluginManager.prototype.create = function(id, node) {\n\t\texports.loadPlugin(id)\n\t\tvar p = new E2.plugins[id](E2.core, node);\n\t\tp.id = id\n\t\treturn p\n\t}\n\n\tglobal.E2.GraphAnalyser = function() {}\n\tglobal.E2.GraphAnalyser.prototype.analyseGraph = function(){\n\t\treturn when.resolve({ size: 0, numAssets: 0 })\n\t}\n\n\tglobal.E2.track = function() {}\n\n\tglobal.E2.GridFsClient = function() {}\n\n\tglobal.E2.EnvironmentSettings = function(){}\n\tglobal.E2.Noise = function() {this.noise2D = function(){}}\n}\n\nfunction Color() {}\n\tColor.prototype.setRGB = function(r, g, b) {\n\t\tthis.r = r\n\t\tthis.g = g\n\t\tthis.b = b\n\t}\n\tColor.prototype.setHSL = function() {\n}\n\nexports.setupThree = function() {\n\tglobal.THREE = require(browserPath + 'vendor/three/three.js')\n\tglobal.THREE.MorphAnimMesh = function() {}\n}\n\nvar setupWebVRAdapter = exports.setupWebVRAdapter = function() {\n\tvar mock = function(){}\n\n\tif (typeof global.VizorWebVRAdapter === 'undefined') {\n\t\tglobal.VizorWebVRAdapter = function () {\n\t\t\tthis.on = this.resizeToTarget = mock\n\t\t}\n\t\tglobal.VizorWebVRAdapter.isNativeWebVRAvailable = function () {\n\t\t\treturn false\n\t\t}\n\t\treturn\n\t}\n\n\tvar vw = global.VizorWebVRAdapter.prototype\n\tvw.getDomElementDimensions = function() {\n\t\treturn {width: 220, height: 100, devicePixelRatio:1}\n\t}\n\tvw._onManagerModeChanged = function(mode, oldMode){\n\t\tthis.emit(this.events.modeChanged, mode, oldMode)\n\t}\n\tvw.setDomElementDimensions = mock\n}\n\nexports.reset = function() {\n\tglobal.window = global\n\n\tglobal.window.screen = {width: 1280, height: 720}\n\n\tglobal.addEventListener = function() {}\n\tglobal.dispatchEvent = function() {}\n\tglobal.removeEventListener = function() {}\n\tglobal.location = {\n\t\tpathname: 'test/test'\n\t}\n\n\tglobal.Vizor = {}\n\n\tglobal.CustomEvent = function(){}\n\n\tfunction domNode() {\n\t\treturn {\n\t\t\tsrc: '',\n\t\t\tstyle: {},\n\t\t\taddEventListener: global.addEventListener,\n\t\t\tclassList: { toggle: function() {}},\n\t\t\tappendChild: function() {},\n\t\t\tdispatchEvent: function() {}\n\t\t}\n\t}\n\n\tfunction createEl() {\n\t\tvar el = domNode()\n\t\tel.setAttribute = function() {}\n\t\treturn el\n\t}\n\n\tglobal.document = {\n\t\taddEventListener: global.addEventListener,\n\t\tbody: domNode(),\n\t\tcreateElementNS: createEl,\n\t\tcreateElement: createEl,\n\t\tremoveEventListener: function() {},\n\t\tgetElementsByTagName: function() {\n\t\t\treturn [ domNode() ]\n\t\t},\n\t\tquerySelector: function() {}\n\t}\n\n\tglobal.navigator = {\n\t\tuserAgent: 'node',\n\t\tgetGamepads: function() {\n\t\t\treturn []\n\t\t}\n\t}\n\n\tglobal.WebVRConfig = {\n\t\tNO_DPDB_FETCH: true\n\t}\n\n\tglobal.XMLHttpRequest = function() {\n\t\tthis.overrideMimeType = function() {}\n\t\tthis.open = function() {}\n\t\tthis.addEventListener = function(name, callback) {}\n\t\tthis.send = function() {}\n\t}\n\n\texports.runScript(browserPath+'vendor/borismus/webvr-polyfill.js')\n\texports.runScript(browserPath+'vendor/borismus/webvr-manager.js')\n\n\texports.runScript(browserPath+'dist/engine.js')\n\texports.mockE2Classes()\n\n\tglobal._webVRPolyfill = {\n\t\tgetVRDisplays: function() { return when.resolve([]) },\n\t}\n\tglobal.hardware = {\n\t\thasVRDisplays: function() { return when.resolve(true) },\n\t}\n\n\tglobal.VizorWebVRAdapter = require(browserPath+'scripts/webVRAdapter.js')\n\n\tvar Application = require(browserPath+'scripts/application.js')\n\t\n\tE2.core = new Core()\n\n\tE2.core.audioContext = {\n\t\tcreateDelay: function() {},\n\t\tcreateGain: function() {},\n\t\tcreatePanner: function() {},\n\t\tcreateAnalyser: function() {},\n\t\tcreateBufferSource: function() {\n\t\t\treturn {}\n\t\t},\n\t}\n\n\tE2.plugins = {}\n\tE2.commands = {}\n\n\texports.setupGlobals()\n\n\t// throw any errors\n\tglobal.msg = function(txt) {\n\t\tif (/^ERROR/.test(txt))\n\t\t\tthrow new Error(txt)\n\n\t\tconsole.log.apply(console, arguments)\n\t}\n\n\tfunction leftTop(){ return { left: 0, top: 0 }}\n\n\tglobal.mat4 = {\n\t\tcreate: function() {},\n\t\tidentity: function(){}\n\t}\n\n\tglobal.$ = function() { return {\n\t\tlength: 1,\n\t\taddClass: function(){},\n\t\tremoveClass: function(){},\n\t\tclick: function(){},\n\t\ttext: function(){},\n\t\toffset: leftTop,\n\t\tposition: leftTop,\n\t\tcss: function(){ return 0 },\n\t\twidth: function(){ return 0 },\n\t\theight: function(){ return 0 },\n\t\tposition: function(){ return 0 },\n\t\tremove: function(){ },\n\t\tmovable: function(){},\n\t\tpopover:function(){},\n\t\tremoveClass:function(){},\n\t\tkeydown:function(){},\n\t\tkeyup:function(){},\n\t\tmousemove:function(){},\n\t\touterHeight:function(){},\n\t\t'0': {\n\t\t\tgetContext: function() {\n\t\t\t\treturn {\n\t\t\t\t\tclearRect: function() { return 0 },\n\t\t\t\t\tmeasureText: function() { return 0 },\n\t\t\t\t\tstrokeText: function() { return 0 },\n\t\t\t\t\tfillText: function() { return 0 },\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}}\n\n\tE2.dom = {\n\t\tbreadcrumb: {\n\t\t\tchildren: function() { return $() },\n\t\t\tprepend: function() {}\n\t\t},\n\t\tcanvas: [{ getContext: function(){} }],\n\t\tcanvas_parent: $(),\n\t\tcanvases: $()\n\t}\n\n\tE2.dom.webgl_canvas = {\n\t\ton:function(){},\n\t\tbind:function(){},\n\t\t'0': {\n\t\t\tclientWidth:1,\n\t\t\tclientHeight:1,\n\t\t\taddEventListener: function() {},\n\t\t\tgetContext: function() {\n\t\t\t\treturn {\n\t\t\t\t\tcreateShader: function() {},\n\t\t\t\t\tdeleteShader: function() {},\n\t\t\t\t\tcompileShader: function() {},\n\t\t\t\t\tshaderSource: function() {},\n\t\t\t\t\tattachShader: function() {},\n\t\t\t\t\tbindAttribLocation: function() {},\n\t\t\t\t\tbindBuffer: function() {},\n\t\t\t\t\tbufferData: function() {},\n\t\t\t\t\tgetProgramParameter: function() {},\n\t\t\t\t\tcreateBuffer: function() {},\n\t\t\t\t\tlinkProgram: function() {},\n\t\t\t\t\tcreateProgram: function() {}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tglobal.make = function() {\n\t\treturn $()\n\t}\n\n\tE2.dom.canvas_parent.scrollTop = E2.dom.canvas_parent.scrollLeft = \n\t\tfunction() { return 0; }\n\n    global.AudioContext = function() {}\n\n\tglobal.E2.app = new Application()\n\tglobal.E2.app.updateCanvas = function() {}\n\tglobal.E2.app.getSlotPosition = function() {}\n\tglobal.E2.app.channel = {\n\t\tbroadcast: function(){}\n\t}\n\n\tglobal.E2.app.worldEditor = {\n\t\tclearSelection: function() {},\n\t\tisActive: function() {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tglobal.E2.app.player = {\n\t\tcore: E2.core,\n\t\trayInput: {\n\t\t\tupdate: function() {},\n\t\t\tgetMesh: function() {},\n\t\t\tadd: function() {},\n\t\t\tremove: function() {},\n\t\t},\n\t\tvrControlCamera: new THREE.PerspectiveCamera(\n\t\t\t\t90,\n\t\t\t\t1280 / 720,\n\t\t\t\t0.001,\n\t\t\t\t1000),\n\t\tstate: {}\n\t}\n\n\tE2.app.player.concatenatedCamera = E2.app.player.vrControlCamera.clone()\n\n\tE2.core.active_graph = new Graph(E2.core, null, {})\n\tE2.core.root_graph = E2.core.active_graph\n\tE2.core.graphs = [ E2.core.active_graph ]\n\t\n\tE2.core.renderer = {\n\t\trender: function() {},\n\t\tclear: function() {},\n\t\tgetPixelRatio: function() {},\n\t\tsetPixelRatio: function() {},\n\t\tdomElement: domNode(),\n\t\tsetSize: function(){},\n\t\tsetSizeNoResize: function(){},\n\t\tsetClearColor: function() {},\n\t\tshadowMap: {},\n\t\tgetSize: function() {return {width: 1, height: 1}}\n\t}\n\n\t// don't try to load a graph\n\tglobal.boot = {hasEdits: true}\n\t//E2.app.onCoreReady()\n\tE2.app.setupStoreListeners()\n\n\tsetupWebVRAdapter()\n\n\treturn E2.core;\n}\n\nexports.runScript = function(path) {\n\tvar js = fs.readFileSync(path)\n\tvm.runInThisContext(js, path)\n}\n\nexports.loadPlugin = function(name) {\n\tvar js = fs.readFileSync(browserPath+'plugins/'+name+'.plugin.js');\n\tvm.runInThisContext(js, name);\n}\n\nexports.setupGlobals = function() {\n\tglobal._ = require('lodash')\n\tglobal.EditorChannel = function(){}\n\n\t// global.Graph = require(requireRoot+'/scripts/graph')\n\tglobal.Flux = require(requireRoot+'/vendor/flux')\n\tglobal.Store = require(requireRoot+'/scripts/stores/store');\n\tglobal.GraphStore = require(requireRoot+'/scripts/stores/graphStore');\n\n\tglobal.PeopleManager = function() {}\n\n\tglobal.PeopleStore = function(){}\n\tglobal.PeopleStore.prototype = {\n\t\tlist: function () {\n\t\t\treturn []\n\t\t},\n\t\ton: function() {}\n\t}\n\n\tglobal.NodeUI = function() {\n\t\tthis.dom = [{\n\t\t\tposition:function(){return {top:10,left:10}},\n\t\t\twidth:function(){return 200},\n\t\t\theight:function(){return 50} }]\n\t\tthis.dom.position = this.dom[0].position\n\t\tthis.dom.width = this.dom[0].width\n\t\tthis.dom.height = this.dom[0].height\n\t\tthis.dom[0].style = {}\n\t\tthis.setSelected = function(){}\n\t\tthis.redrawSlots = function(){}\n\t}\n\tglobal.NodeUI.redrawActiveGraph = function(){}\n\n\tglobal.TextureCache = function() {}\n\tglobal.PatchManager = function() {}\n\t\n\trequire(requireRoot+'/scripts/commands/graphEditCommands')\n\texports.runScript(requireRoot+'scripts/commands/graphEditCommands.js')\n\t\n\tglobal.UndoManager = require(requireRoot+'/scripts/commands/undoManager.js')\n\tglobal.GraphApi = require(requireRoot+'/scripts/graphApi.js')\n\n\tglobal.ConnectionUI = require(requireRoot+'/scripts/connection.js').ConnectionUI\n\tglobal.ConnectionUI.prototype.resolve_slot_divs = function() {\n\t\tthis.src_slot_div = $()\n\t\tthis.dst_slot_div = $()\n\t}\n\n\tE2.ui = {\n\t\tisInProgramMode: function() {\n\t\t\treturn false\n\t\t},\n\t\tbuildBreadcrumb: function() {},\n\t\tstate: {},\n\t\tshowStartDialog: function() {return when.resolve()}\n\t}\n}\n\nexports.connect = function connect(graph, a, aidx, b, bidx, dyn) {\n\tvar ss = a.plugin.output_slots[aidx]\n\tvar ds = dyn ? b.getDynamicInputSlots()[bidx] : b.plugin.input_slots[bidx]\n\n\tassert.ok(ss)\n\tassert.ok(ds)\n\n\tvar conn = new Connection(a, b, ss, ds)\n\tconn.uid = E2.uid()\n\n\tconn.patch_up()\n\tE2.app.graphApi.connect(graph, conn)\n\tE2.app.onLocalConnectionChanged(conn)\n\n\treturn conn\n}\n\nexports.disconnect = function disconnect(graph, conn) {\n\tE2.app.graphApi.disconnect(graph, conn)\n\tE2.app.onLocalConnectionChanged(conn)\n}\n"
  },
  {
    "path": "browser/test/integration/init-revolver.js",
    "content": "var assert = require('assert');\n\nvar reset = require('./helpers').reset\nvar fs = require('fs')\n\ndescribe('Initialisation together with if statements', function() {\n\n\tbeforeEach(function() {\n\t\treset()\n\t})\n\n\tit('inits the correct number', function() {\n\t\tvar source = JSON.parse(fs.readFileSync(__dirname +\n\t\t\t'/../fixtures/init-revolver.json'))\n\n\t\tE2.core.deserialiseObject(source)\n\n\t\tvar ag = E2.core.active_graph\n\t\tvar floatDisplay = ag.nodes[10]\n\n\t\tag.update({abs_t: 0, delta_t: 1/60})\n\t\tassert.equal(floatDisplay.plugin.value, 1)\n\n\t\tag.update({abs_t: 1/60, delta_t: 1/60})\n\t\tassert.equal(floatDisplay.plugin.value, 1)\n\t})\n\n})"
  },
  {
    "path": "browser/test/integration/inputsToArray.js",
    "content": "var assert = require('assert');\n\nvar reset = require('./helpers').reset;\n\ndescribe('inputs_to_array', function() {\n\tbeforeEach(function() {\n\t\treset()\n\t})\n\n\tfunction connect(graph, a, aidx, b, bidx, dyn) {\n\t\tvar ss = a.plugin.output_slots[aidx]\n\t\tvar ds = dyn ? b.getDynamicInputSlots()[bidx] : b.plugin.input_slots[bidx]\n\n\t\tassert.ok(ss)\n\t\tassert.ok(ds)\n\n\t\tvar conn = new Connection(a, b, ss, ds)\n\t\tconn.uid = E2.uid()\n\n\t\tconn.patch_up()\n\t\tE2.app.graphApi.connect(graph, conn)\n\t\tE2.app.onLocalConnectionChanged(conn)\n\t\tconn.signal_change(true)\n\n\t\treturn conn\n\t}\n\n\tfunction disconnect(graph, conn) {\n\t\tE2.app.graphApi.disconnect(graph, conn)\n\t\tE2.app.onLocalConnectionChanged(conn)\n\t\tconn.signal_change(false)\n\t}\n\n\tit('outputs an array', function() {\n\t\tvar graph = E2.core.active_graph\n\n\t\tvar floatNode1 = E2.app.instantiatePlugin('const_float_generator')\n\t\tvar floatNode2 = E2.app.instantiatePlugin('const_float_generator')\n\n\t\tvar inputsToArrayNode = E2.app.instantiatePlugin('inputs_to_array')\n\n\t\tvar pullerNode = E2.app.instantiatePlugin('float_display')\n\n\t\tconnect(graph, floatNode1, 0, inputsToArrayNode, 0, true)\n\t\tconnect(graph, floatNode2, 0, inputsToArrayNode, 1, true)\n\n\t\tconnect(graph, inputsToArrayNode, 0, pullerNode, 0, false)\n\n\t\tfloatNode1.plugin.state.val = 10\n\t\tfloatNode2.plugin.state.val = 20\n\n\t\tgraph.update()\n\n\t\tassert.ok(inputsToArrayNode.plugin.output_slots[0].array === true)\n\t})\n\n})\n"
  },
  {
    "path": "browser/test/integration/issue195.js",
    "content": "var assert = require('assert');\nvar fs = require('fs')\n\nvar reset = require('./helpers').reset;\n\ndescribe('Redo complex connection', function() {\n\tbeforeEach(function() {\n\t\treset()\n\n\t\tapp = E2.app\n\n\t\tE2.plugins.convert_camera_matrices = function(core) {\n\t\t\t\tthis.input_slots = [\n\t\t\t\t\t{ name: 'camera', dt: core.datatypes.CAMERA },\n\t\t\t\t]\n\t\t\t\tthis.output_slots = [\n\t\t\t\t\t{ name: 'projection', dt: core.datatypes.MATRIX},\n\t\t\t\t\t{ name: 'view', dt: core.datatypes.MATRIX }\n\t\t\t\t]\n\t\t}\n\n\t\tE2.plugins.material_texture_modulator = function(core, node) {\n\t\t\tthis.input_slots = [ \n\t\t\t\t{ name: 'material', dt: core.datatypes.MATERIAL},\n\t\t\t\t{ name: 'type', dt: core.datatypes.FLOAT},\n\t\t\t\t{ name: 'texture', dt: core.datatypes.TEXTURE }\n\t\t\t];\n\t\t\t\n\t\t\tthis.output_slots = [\n\t\t\t\t{ name: 'material', dt: core.datatypes.MATERIAL }\n\t\t\t];\n\t\t};\n\n\t\tsource = JSON.parse(fs.readFileSync(__dirname+'/../fixtures/issue195.json')).root\n\t})\n\n\tit('can redo connection after destructive edits in subgraph, issue #195', function() {\n\t\tapp.setupStoreListeners()\n\n\t\t// add VR clean template\n\t\tapp.pasteObject(source)\n\t\t\n\t\tvar rootGraph = E2.core.active_graph\n\t\trootGraph.create_ui = function(){}\n\t\trootGraph.tree_node = {}\n\t\t\n\t\t// open the VR render loop\n\t\tvar vrLoopGraph = rootGraph.children[0].plugin.graph\n\t\tvrLoopGraph.create_ui = function(){}\n\t\tvrLoopGraph.tree_node = {}\n\t\t\n\t\tapp.onGraphSelected(vrLoopGraph)\n\n\t\t// select all, delete\n\t\tapp.clearSelection()\n\t\tvrLoopGraph.nodes.map(function(node) {\n\t\t\tapp.markNodeAsSelected(node)\n\t\t})\n\n\t\tassert.equal(app.selectedNodes.length, 2)\n\n\t\tapp.onDelete()\n\n\t\t// back to root graph\n\t\tapp.onGraphSelected(rootGraph)\n\n\t\t// undo, undo, redo\n\t\tapp.undoManager.undo() // undo deletion inside subgraph\n\t\tapp.undoManager.undo() // undo addition of pasted nodes\n\t\tassert.doesNotThrow(function() {\n\t\t\tapp.undoManager.redo() // redo pasted nodes\n\t\t})\n\n\t})\n\n})\n\n\t\n"
  },
  {
    "path": "browser/test/integration/loadAllPlugins.js",
    "content": "var assert = require('assert');\n\nvar reset = require('./helpers').reset;\nvar loadPlugin = require('./helpers').loadPlugin;\nvar fs = require('fs');\nvar when = require('when');\nvar pluginPath = __dirname+'/../../plugins/'\n\ndescribe('loadAllPlugins', function() {\n\n\tbeforeEach(function() {\n\t\treset()\n\t})\n\n\tvar exceptions = [\n\t\t// legacy plugins used in unit tests (paste_complex)\n\t\t'mesh_renderer_emitter',\n\t\t'perspective_camera',\n\t\t'grid_mesh_generator',\n\t\t'concatenate_matrix_modulator',\n\t\t'scene_renderer_emitter',\n\t]\n\n\tit('loads all plugins', function(done) {\n\t\tvar plugins = []\n\t\tvar pluginInstances = []\n\n\t\tvar dfd = when.defer()\n\t\tvar promise = dfd.promise\n\n\t\tfs.readdir(pluginPath, function(err, files) {\n\t\t\tassert.ok(!err)\n\n\t\t\tfor(var i = 0; i < files.length; ++i) {\n\t\t\t\tvar filename = pluginPath + files[i]\n\t\t\t\tvar pluginName = files[i].replace('\\.plugin\\.js', '')\n\t\t\t\tif (pluginName.indexOf('.') !== -1 || exceptions.indexOf(pluginName) !== -1) {\n\t\t\t\t\t// skip\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tvar stat = fs.statSync(filename)\n\t\t\t\tif (!stat.isFile()) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tplugins.push(pluginName)\n\t\t\t}\n\n\t\t\tfor(var i = 0; i < plugins.length; ++i) {\n\t\t\t\tconsole.log(plugins[i])\n\t\t\t\tassert.doesNotThrow(function() {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpluginInstances.push(E2.app.instantiatePlugin(plugins[i]))\n\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\tconsole.error(e.stack)\n\t\t\t\t\t\tthrow e\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tassert.ok(plugins.length > 200)\n\t\t\tassert.equal(pluginInstances.length, plugins.length)\n\n\t\t\tdone()\n\t\t})\n\t})\n})\n"
  },
  {
    "path": "browser/test/integration/paste.js",
    "content": "var assert = require('assert');\nvar fs = require('fs')\n\nvar helpers = require('./helpers')\n\ndescribe('Paste', function() {\n\tvar core, app\n\n\tbeforeEach(function() {\n\t\tcore = helpers.reset()\n\t\thelpers.setupThree()\n\n\t\tE2.commands.graph = require('../../scripts/commands/graphEditCommands')\n\t\trequire('../../scripts/util')\n\n\t\tapp = E2.app\n\t\tE2.ui = { state: {} }\n\t\tapp.player = { core: core }\n\t\tapp.channel = { broadcast: function(){}}\n\t\tapp.updateCanvas = function(){}\n\t\tglobal.E2.app = app\n\t})\n\n\tdescribe('Simple', function() {\n\n\t\tvar source = JSON.parse(fs.readFileSync(__dirname+'/../fixtures/paste.json')).root\n\n\t\tit('pastes correctly', function() {\n\t\t\tapp.paste(source, 0, 0)\n\t\t\tassert.equal(core.active_graph.nodes.length, 3)\n\t\t\tassert.equal(core.active_graph.connections.length, 2)\n\t\t})\n\n\t\tit('pastes correctly when repeated', function() {\n\t\t\tapp.clipboard = source\n\t\t\tapp.paste(source, 0, 0)\n\t\t\tapp.paste(source, 0, 0)\n\t\t\tassert.equal(core.active_graph.nodes.length, 6)\n\t\t\tassert.equal(core.active_graph.connections.length, 4)\n\t\t})\n\n\t\tit('discards invalid connections', function() {\n\t\t\tapp.clipboard = JSON.parse('{\"nodes\":[{\"plugin\":\"url_texture_generator\",\"x\":246,\"y\":277,\"uid\":1430255492426139,\"state\":{\"url\":\"/data/image/dfc79110aef8fa620fa7a4ff3fc3b116de0c5374.png\"},\"title\":\"Image\"}],\"conns\":[{\"src_nuid\":1430255492426139,\"dst_nuid\":14302554924103,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"dst_connected\":true,\"dst_dyn\":true}],\"x1\":296,\"y1\":327,\"x2\":437,\"y2\":448}')\n\t\t\tapp.paste(app.clipboard, 0,0)\n\t\t\tassert.equal(core.active_graph.nodes.length, 1)\n\t\t\tassert.equal(core.active_graph.connections.length, 0)\n\t\t})\n\n\t\tit('sends the right events', function() {\n\t\t\tvar nodeAdded = 0\n\t\t\tvar connected = 0\n\t\t\tapp.dispatcher.register(function(pl) {\n\t\t\t\tconsole.log('event', pl.actionType)\n\t\t\t\tif (pl.actionType==='uiNodeAdded')\n\t\t\t\t\tnodeAdded++\n\t\t\t\tif (pl.actionType==='uiConnected')\n\t\t\t\t\tconnected++\n\t\t\t})\n\t\t\tapp.paste(source, 0, 0)\n\t\t\tassert.equal(nodeAdded, 3)\n\t\t\tassert.equal(connected, 2)\n\t\t})\n\t})\n\n\tdescribe('Clock', function() {\n\t\tvar source = JSON.parse(fs.readFileSync(__dirname+'/../fixtures/paste-clock.json'))\n\n\t\tit('pastes correctly', function() {\n\t\t\tapp.paste(source, 0, 0)\n\t\t\tassert.equal(core.active_graph.connections.length, 2)\n\t\t})\n\t})\n\n\tdescribe('Complex', function() {\n\t\tvar source\n\t\t\n\t\tglobal.window = global\n\n\t\tglobal.Renderer = function() {}\n\n\t\tvar Core = require('../../scripts/core')\n\t\t\n\t\tfunction PluginManager(_a, _b, _c, _d) {\n\t\t\tEventEmitter.call(this)\n\t\t\tthis.keybyid = {}\n\t\t\tvar that = this\n\t\t\tprocess.nextTick(function() {\n\t\t\t\tthat.emit('ready')\n\t\t\t})\n\t\t}\n\t\tPluginManager.prototype = Object.create(EventEmitter.prototype)\n\t\tPluginManager.prototype.create = function(id, node) {\n\t\t\tif (!E2.plugins[id])\n\t\t\t\thelpers.loadPlugin(id)\n\t\t\tvar p = new E2.plugins[id](core, node)\n\t\t\tp.id = id\n\t\t\treturn p\n\t\t}\n\n\t\tglobal.PluginManager = PluginManager\n\n\t\tglobal.Node.prototype.initialise = function(){}\n\n\t\tfunction TreeNode() {}\n\t\tTreeNode.prototype.add_child = function() { return new TreeNode() }\n\t\tglobal.TreeNode = TreeNode\n\n\t\tbeforeEach(function() {\n\t\t\tvar dummyCore = helpers.reset()\n\t\t\tE2.commands.graph = require('../../scripts/commands/graphEditCommands')\n\t\n\t\t\tE2.plugins.url_scene_generator = function(){\n\t\t\t\tthis.input_slots = []\n\t\t\t\tthis.output_slots = [ { name: 'x', dt: core.datatypes.BOOL } ]\n\t\t\t}\n\n\t\t\tapp = E2.app\n\t\t\tcore = E2.core = new Core()\n\t\t\tcore.renderer = dummyCore.renderer\n\t\t\tE2.app.player = { core: core }\n\t\t\tcore.active_graph = new Graph(core, null, new TreeNode())\n\t\t\tcore.root_graph = core.active_graph\n\t\t\tcore.graphs = [ core.active_graph ]\n\n\t\t\tsource = JSON.parse(fs.readFileSync(__dirname+'/../fixtures/paste-complex.json')).root\n\n\t\t\tE2.plugins.material_diffuse_color_modulator = function() {\n\t\t\t\tthis.input_slots = []\n\t\t\t\tthis.output_slots = []\n\t\t\t}\n\t\t})\n\n\t\tit('creates the right number of nodes, connections and outputs', function() {\n\t\t\tapp.paste(source, 0, 0)\n\t\t\tassert.equal(core.active_graph.nodes.length, 8)\n\t\t\tassert.equal(core.active_graph.connections.length, 5)\n\t\t})\n\n\t\tit('sends the right events', function() {\n\t\t\tvar nodeAdded = 0\n\t\t\tvar connected = 0\n\t\t\tapp.dispatcher.register(function(pl) {\n\t\t\t\tif (pl.actionType==='uiNodeAdded')\n\t\t\t\t\tnodeAdded++\n\t\t\t\tif (pl.actionType==='uiConnected')\n\t\t\t\t\tconnected++\n\t\t\t})\n\t\t\tapp.paste(source, 0, 0)\n\t\t\tassert.equal(nodeAdded, 8)\n\t\t\tassert.equal(connected, 5)\n\t\t})\n\n\t\tit('creates a subgraph in the right place', function() {\n\t\t\tapp.paste(source, 0, 0)\n\t\t\tassert.equal(core.graphs[1].plugin.id, 'graph')\n\t\t})\n\n\t\tit('sets up the right parent relationships', function() {\n\t\t\tapp.paste(source, 0, 0)\n\t\t\tassert.equal(\n\t\t\t\tcore.graphs[1].nodes[1]\n\t\t\t\t\t.plugin.node.parent_graph, // input proxy's parent\n\t\t\t\tcore.graphs[1]\n\t\t\t)\n\t\t})\n\n\t\tit('registers the right number of inputs and outputs', function() {\n\t\t\tapp.setupStoreListeners()\n\t\t\tapp.paste(source, 0, 0)\n\t\t\tvar node = core.graphs[0].nodes[5]\n\t\t\tassert.equal(node.inputs.length, 2)\n\t\t\tassert.equal(node.outputs.length, 1)\n\t\t})\n\n\t\t// this doesn't really belong here, but it's a good case to have\n\t\tit('has the correct number of connections after removing a node', function() {\n\t\t\tvar ag = core.active_graph\n\t\t\tapp.paste(source, 0, 0)\n\t\t\tassert.equal(ag.connections.length, 5)\n\t\t\tapp.graphApi.removeNode(ag, ag.nodes[3])\n\t\t\tassert.equal(ag.connections.length, 2)\n\t\t})\n\n\t\tit('adds the nodes and connections to the selection', function() {\n\t\t\tapp.setupStoreListeners()\n\t\t\tvar ag = core.active_graph\n\t\t\tapp.pasteObject(source)\n\t\t\tassert.equal(app.selectedConnections.length, 5)\n\t\t\tassert.equal(app.selectedNodes.length, 8)\n\t\t})\n\n\t})\n\n\t\n\n})\n\n\n\n\n\n\n\n"
  },
  {
    "path": "browser/test/integration/pause.js",
    "content": "var assert = require('assert');\n\nvar helpers = require('./helpers')\nvar reset = require('./helpers').reset;\nvar loadPlugin = require('./helpers').loadPlugin;\nvar fs = require('fs');\nvar when = require('when');\n\nvar pluginPath = __dirname+'/../../plugins/'\n\ndescribe('pause', function() {\n\tvar core, app\n\n\tbeforeEach(function() {\n\t\treset()\n\t})\n\n\tit('uses correct time in subgraph', function() {\n\t\tvar source = JSON.parse(fs.readFileSync(__dirname+'/../fixtures/pause-subgraph.json'))\n\t\tsource = source.root ? source.root : source\n\t\tE2.app.paste(source, 0, 0)\n\n\t\tvar ag = E2.core.active_graph\n\n\t\tvar floatNode = ag.nodes[0]\n\t\tvar subGraphNode = ag.nodes[2]\n\t\tvar clockNode = ag.nodes[1]\n\n\t\tag.update({abs_t: 0, delta_t: 1/60})\n\t\tassert.equal(floatNode.plugin.value, 0)\n\t\tag.update({abs_t: 1/60, delta_t: 1/60})\n\t\tassert.equal(floatNode.plugin.value, 1/60)\n\t\tag.update({abs_t: 1/60, delta_t: 0})\n\t\tassert.equal(floatNode.plugin.value, 1/60)\n\n\t})\n\n\tvar exceptions = [\n\t\t// legacy plugins used in unit tests (paste_complex)\n\t\t'mesh_renderer_emitter',\n\t\t'perspective_camera',\n\t\t'grid_mesh_generator',\n\t\t'concatenate_matrix_modulator',\n\t\t'scene_renderer_emitter',\n\n\t\t// these will need to be fixed:\n\t\t'viewport_height_generator',\n\t\t'viewport_width_generator',\n\n\t\t'three_webgl_renderer'\n\t]\n\n\tit('plugins won\\'t crash when paused', function(done) {\n\t\tvar plugins = []\n\t\tvar pluginInstances = []\n\n\t\tvar dfd = when.defer()\n\t\tvar promise = dfd.promise\n\n\t\tfs.readdir(pluginPath, function(err, files) {\n\t\t\tassert.ok(!err)\n\n\t\t\tfor(var i = 0; i < files.length; ++i) {\n\t\t\t\tvar filename = pluginPath + files[i]\n\t\t\t\tvar pluginName = files[i].replace('\\.plugin\\.js', '')\n\t\t\t\tif (pluginName.indexOf('.') !== -1 || exceptions.indexOf(pluginName) !== -1) {\n\t\t\t\t\t// skip\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tvar stat = fs.statSync(filename)\n\t\t\t\tif (!stat.isFile()) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tplugins.push(pluginName)\n\t\t\t}\n\n\t\t\tfor(var i = 0; i < plugins.length; ++i) {\n\t\t\t\t// assert.doesNotThrow(function() {\n\t\t\t\t\tpluginInstances.push(E2.app.instantiatePlugin(plugins[i]))\n\t\t\t\t\tvar ag = E2.core.active_graph\n\n\t\t\t\t\tag.update({abs_t: 0, delta_t: 1/60})\n\t\t\t\t\tag.update({abs_t: 1/60, delta_t: 0})\n\t\t\t\t// })\n\t\t\t}\n\n\t\t\tassert.ok(plugins.length > 200)\n\t\t\tassert.equal(pluginInstances.length, plugins.length)\n\n\t\t\tdone()\n\t\t})\n\t})\n})"
  },
  {
    "path": "browser/test/integration/pluginDocs.js",
    "content": "var assert = require('assert');\nconst fs = require('fs')\nconst vm = require('vm')\n\nconst createVizorSandbox = require('../../../lib/sandbox')\n\nconst pluginsPath = 'browser/plugins'\n\nvar sandbox = createVizorSandbox()\nvar context = new vm.createContext(sandbox)\n\nvar engineSource = fs.readFileSync('browser/dist/engine.js')\nengineSource += ';\\nE2.core = new Core();\\n'\nengineSource += ';\\nE2.app = { player: { core: E2.core }};\\n'\nengineSource += 'E2.core.root_graph = new Graph();\\n'\n\nvar engineScript = new vm.Script(engineSource, { filename: 'engine.js' })\nengineScript.runInContext(context)\n\nvar plugins = JSON.parse(fs.readFileSync(pluginsPath + '/plugins.json'))\nvar pluginCats = Object.keys(plugins)\n\nvar DocumentationController = require('../../../controllers/documentationController');\n\nvar docsPath = 'documentation/browser/plugins/'\n\nfunction jsonChecker(pluginId, inputSlots, outputSlots, finishCallback) {\n\treturn function (data) {\n\t\tfunction slotMapper(docSlots) {\n\t\t\treturn function (slot) {\n\t\t\t\tfor (var i = 0, len = docSlots.length; i < len; ++i) {\n\t\t\t\t\tif (docSlots[i].name === slot.name) {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconsole.error(pluginId + '.' + slot.name, 'missing markdown documentation in', docsPath + pluginId + '.md')\n\n\t\t\t\tassert.ok(false, 'no slot for ' + pluginId + '.' + slot.name)\n\t\t\t}\n\t\t}\n\n\t\tinputSlots.slice().map(slotMapper(data.inputs))\n\t\toutputSlots.slice().map(slotMapper(data.outputs))\n\n\t\tfinishCallback()\n\t}\n}\n\ndescribe('plugin docs', function() {\n\tvar dc\n\n\tbeforeEach(function() {\n\t\tdc = new DocumentationController()\n\t})\n\n\tit('has entries for all plugins', function(done) {\n\t\tvar todo = 0\n\t\t// count plugins\n\t\tpluginCats.map(function(cat) {\n\t\t\tvar pluginNames = Object.keys(plugins[cat])\n\t\t\tpluginNames.map(function() {\n\t\t\t\t++todo\n\t\t\t})\n\t\t})\n\n\t\tassert.ok(todo > 200)\n\n\t\t// process plugins\n\t\tpluginCats.map(function(cat) {\n\t\t\tvar pluginNames = Object.keys(plugins[cat])\n\n\t\t\tpluginNames.map(function (pluginName) {\n\t\t\t\tvar pluginId = plugins[cat][pluginName]\n\t\t\t\tvar pluginSourcePath = pluginsPath + '/' + pluginId + '.plugin.js'\n\n\t\t\t\tvar pluginSource = fs.readFileSync(pluginSourcePath)\n\t\t\t\tpluginSource += ';\\n'\n\t\t\t\tpluginSource += 'var fakeNode = new Node(E2.core.root_graph, \"' + pluginId + '\");\\n'\n\t\t\t\tpluginSource += 'var plugin' + pluginId + ' = new E2.plugins.' + pluginId + '(E2.core, fakeNode);\\n'\n\n\t\t\t\tscript = new vm.Script(pluginSource, {filename: pluginId})\n\t\t\t\tscript.runInContext(context)\n\n\t\t\t\tvar res = {}\n\n\t\t\t\tdc.getPluginDocumentation({\n\t\t\t\t\tparams: {\n\t\t\t\t\t\tpluginName: pluginId\n\t\t\t\t\t}\n\t\t\t\t}, {\n\t\t\t\t\tjson: jsonChecker(pluginId, context['plugin' + pluginId].input_slots, context['plugin' + pluginId].output_slots, function() {\n\t\t\t\t\t\t--todo\n\t\t\t\t\t\tif (!todo) {\n\t\t\t\t\t\t\tdone()\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}, function(e) {done(e)})\n\t\t\t})\n\t\t})\n\t})\n})\n\n"
  },
  {
    "path": "browser/test/integration/runtimeEvents.js",
    "content": "var assert = require('assert');\n\nvar reset = require('./helpers').reset;\n\ndescribe('Runtime events', function() {\n\tbeforeEach(function() {\n\t\treset()\n\t\tapp = E2.app\n\t})\n\n\tit('trigger for one frame only when system emits', function() {\n\t\tvar graph = E2.core.active_graph\n\n\t\tE2.app.instantiatePlugin('const_text_generator')\n\t\tE2.app.instantiatePlugin('runtime_event_read')\n\t\tE2.app.instantiatePlugin('float_display')\n\n\t\tvar textNode = graph.nodes[0]\n\t\tvar readNode = graph.nodes[1]\n\t\tvar floatNode = graph.nodes[2]\n\n\t\t// connect read output to float\n\t\tvar c = Connection.hydrate(graph, {\n\t\t\tsrc_nuid: readNode.uid,\n\t\t\tdst_nuid: floatNode.uid,\n\t\t\tsrc_slot: 1,\n\t\t\tdst_slot: 0,\n\t\t})\n\n\t\treadNode.plugin.connection_changed(true,\n\t\t\tc, readNode.plugin.output_slots[0])\n\n\t\t// connect text.output to readNode.eventName\n\t\tConnection.hydrate(graph, {\n\t\t\tsrc_nuid: textNode.uid,\n\t\t\tdst_nuid: readNode.uid,\n\t\t\tsrc_slot: 0,\n\t\t\tdst_slot: 0,\n\t\t})\n\n\t\t// set text value\n\t\ttextNode.plugin.state.text = 'testEventName'\n\n\t\tgraph.update()\n\n\t\tE2.core.runtimeEvents.emit('testEventName', 32)\n\n\t\tgraph.update()\n\t\n\t\tassert.equal(32, floatNode.plugin.value)\n\t\n\t\tgraph.update()\n\n\t\tassert.equal(0, floatNode.plugin.value)\n\t})\n\n\tit('trigger for one frame only when writer emits', function() {\n\t\tvar graph = E2.core.active_graph\n\n\t\tE2.app.instantiatePlugin('runtime_event_write')\n\n\t\tE2.app.instantiatePlugin('const_text_generator')\n\t\tE2.app.instantiatePlugin('runtime_event_read')\n\t\tE2.app.instantiatePlugin('float_display')\n\n\t\tvar emitNode = graph.nodes[0]\n\t\tvar textNode = graph.nodes[1]\n\t\tvar readNode = graph.nodes[2]\n\t\tvar floatNode = graph.nodes[3]\n\n\t\t// connect read output to float\n\t\tvar c = Connection.hydrate(graph, {\n\t\t\tsrc_nuid: readNode.uid,\n\t\t\tdst_nuid: floatNode.uid,\n\t\t\tsrc_slot: 1,\n\t\t\tdst_slot: 0,\n\t\t})\n\n\t\treadNode.plugin.connection_changed(true,\n\t\t\tc, readNode.plugin.output_slots[0])\n\n\t\t// connect text.output to emitNode.eventName\n\t\tConnection.hydrate(graph, {\n\t\t\tsrc_nuid: textNode.uid,\n\t\t\tdst_nuid: emitNode.uid,\n\t\t\tsrc_slot: 0,\n\t\t\tdst_slot: 1,\n\t\t})\n\n\t\t// connect text.output to readNode.eventName\n\t\tConnection.hydrate(graph, {\n\t\t\tsrc_nuid: textNode.uid,\n\t\t\tdst_nuid: readNode.uid,\n\t\t\tsrc_slot: 0,\n\t\t\tdst_slot: 0,\n\t\t})\n\n\t\t// set text value\n\t\ttextNode.plugin.state.text = 'testEventName'\n\n\t\tgraph.update()\n\n\t\tvar epl = emitNode.plugin\n\t\tepl.update_input(epl.input_slots[0], true)\n\t\tepl.update_input(epl.input_slots[2], 32.62)\n\n\t\tgraph.update()\n\t\t\n\t\tassert.equal(32.62, floatNode.plugin.value)\n\t\n\t\tgraph.update()\n\n\t\tassert.equal(0, floatNode.plugin.value)\n\t})\n\n\tit('trigger for multiple frames when continuous writer emits', function() {\n\t\tvar graph = E2.core.active_graph\n\n\t\tE2.app.instantiatePlugin('runtime_event_write_continuous')\n\n\t\tE2.app.instantiatePlugin('const_text_generator')\n\t\tE2.app.instantiatePlugin('runtime_event_read')\n\t\tE2.app.instantiatePlugin('float_display')\n\n\t\tvar emitNode = graph.nodes[0]\n\t\tvar textNode = graph.nodes[1]\n\t\tvar readNode = graph.nodes[2]\n\t\tvar floatNode = graph.nodes[3]\n\n\t\t// connect read output to float\n\t\tvar c = Connection.hydrate(graph, {\n\t\t\tsrc_nuid: readNode.uid,\n\t\t\tdst_nuid: floatNode.uid,\n\t\t\tsrc_slot: 1,\n\t\t\tdst_slot: 0,\n\t\t})\n\n\t\treadNode.plugin.connection_changed(true,\n\t\tc, readNode.plugin.output_slots[0])\n\n\t\t// connect text.output to emitNode.eventName\n\t\tConnection.hydrate(graph, {\n\t\t\tsrc_nuid: textNode.uid,\n\t\t\tdst_nuid: emitNode.uid,\n\t\t\tsrc_slot: 0,\n\t\t\tdst_slot: 1,\n\t\t})\n\n\t\t// connect text.output to readNode.eventName\n\t\tConnection.hydrate(graph, {\n\t\t\tsrc_nuid: textNode.uid,\n\t\t\tdst_nuid: readNode.uid,\n\t\t\tsrc_slot: 0,\n\t\t\tdst_slot: 0,\n\t\t})\n\n\t\t// set text value\n\t\ttextNode.plugin.state.text = 'testEventName'\n\n\t\tgraph.update()\n\n\t\tvar epl = emitNode.plugin\n\t\tepl.update_input(epl.input_slots[0], true)\n\t\tepl.update_input(epl.input_slots[2], 79.21)\n\n\t\tgraph.update()\n\n\t\t// two frames with a value\n\t\tassert.equal(79.21, floatNode.plugin.value)\n\n\t\tgraph.update()\n\n\t\tassert.equal(79.21, floatNode.plugin.value)\n\n\t\t// switch emitter off for two frames\n\t\tepl.update_input(epl.input_slots[0], false)\n\n\t\tgraph.update()\n\n\t\tassert.equal(0, floatNode.plugin.value)\n\n\t\tgraph.update()\n\n\t\tassert.equal(0, floatNode.plugin.value)\n\n\t\t// switch emitter on again for two frames\n\t\tepl.update_input(epl.input_slots[0], true)\n\n\t\tgraph.update()\n\n\t\tassert.equal(79.21, floatNode.plugin.value)\n\n\t\tgraph.update()\n\n\t\tassert.equal(79.21, floatNode.plugin.value)\n\t})\n})\n\n\t\n"
  },
  {
    "path": "browser/test/integration/subGraphCutUndo.js",
    "content": "var assert = require('assert');\nvar fs = require('fs')\n\nvar helpers = require('./helpers')\n\ndescribe('SubGraphCutUndo', function() {\n\tvar core, app\n\n\tbeforeEach(function() {\n\t\tcore = helpers.reset()\n\t\thelpers.setupThree()\n\n\t\tE2.commands.graph = require('../../scripts/commands/graphEditCommands')\n\t\trequire('../../scripts/util')\n\n\t\tapp = E2.app\n\t\tapp.player = { core: core }\n\t\tapp.channel = { broadcast: function(){}}\n\t\tapp.updateCanvas = function(){}\n\t\tglobal.E2.app = app\n\t})\n\n\tit('cuts all nodes inside a subgraph, pastes and reconnects arrayness', function() {\n\n\t\tvar source = JSON.parse(fs.readFileSync(__dirname+'/../fixtures/subGraphCutUndo.json')).root\n\n\t\tapp.paste(source, 0, 0)\n\t\tassert.equal(core.active_graph.nodes.length, 2)\n\t\tassert.equal(core.active_graph.connections.length, 1)\n\n\t\tvar rootGraph = E2.core.root_graph\n\n\t\tE2.app.onGraphSelected(rootGraph.nodes[1].plugin.graph);\n\n\t\tE2.app.selectAll()\n\t\tE2.app.onCut()\n\n\t\tE2.app.undoManager.undo()\n\n\t\tvar activeGraph = E2.core.active_graph\n\n\t\trootGraph.update({abs_t: 0, delta_t: 1/60})\n\n\t\tassert.equal(rootGraph.nodes[1].dyn_outputs[0].array, activeGraph.nodes[2].dyn_inputs[0].array)\n\t})\n\n})\n\n\n\n\n\n\n\n"
  },
  {
    "path": "browser/test/integration/subGraphPlugin.js",
    "content": "var assert = require('assert');\nvar reset = require('./helpers').reset;\nvar fs = require('fs')\n\ndescribe('SubGraphPlugin-Complex', function() {\n\tbeforeEach(function() {\n\t\treset()\n\n\t\tE2.plugins.url_scene_generator = function(){\n\t\t\tthis.input_slots = []\n\t\t\tthis.output_slots = [ { name: 'x', dt: core.datatypes.BOOL } ]\n\t\t}\n\n\t\tapp = E2.app\n\t\tcore = E2.core\n\n\t\tsource = JSON.parse(fs.readFileSync(__dirname+'/../fixtures/subGraphFloatOutput.json')).root\n\n\t\tapp.paste(source, 0, 0)\n\t})\n\n\tvar FloatConsumerPlugin = function(core, node) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'Test plugin for consuming floats'\n\n\t\tthis.input_slots = [\n\t\t\t{\n\t\t\t\tname: 'input',\n\t\t\t\tdt: core.datatypes.FLOAT\n\t\t\t}]\n\n\t\tthis.output_slots = []\n\t}\n\n\tFloatConsumerPlugin.prototype = Object.create(Plugin.prototype)\n\n\tFloatConsumerPlugin.prototype.get_value = function(v) {\n\t\treturn this.value\n\t}\n\n\tFloatConsumerPlugin.prototype.update_input = function(slot, data) {\n\t\tthis.value = data\n\t}\n\n\tit('fetches numbers from subgraphs', function() {\n\t\tvar ag = E2.core.active_graph\n\n\t\tvar floatConsumerNode = new Node(ag, undefined, 0, 0)\n\t\tvar floatConsumerPlugin = new FloatConsumerPlugin(E2.core, floatConsumerNode)\n\t\tfloatConsumerNode.set_plugin(floatConsumerPlugin)\n\t\tfloatConsumerPlugin.reset()\n\n\t\tag.addNode(floatConsumerNode)\n\n\t\tvar subgraph0 = ag.nodes[0]\n\t\tvar subgraph1 = ag.nodes[1]\n\t\tvar float0 = ag.nodes[2]\n\n\t\tvar ss = subgraph0.dyn_outputs[0]\n\t\tvar ds = floatConsumerNode.plugin.input_slots[0]\n\t\tvar conn = new Connection(subgraph0, floatConsumerNode, ss, ds)\n\t\tag.connect(conn)\n\t\tconn.patch_up(ag.nodes)\n\n\t\tag.update()\n\n\t\tvar v = floatConsumerPlugin.get_value()\n\t\tassert(v, 1)\n\n\t\tag.disconnect(conn)\n\n\t\tss = subgraph1.dyn_outputs[0]\n\n\t\tconn = new Connection(subgraph1, floatConsumerNode, ss, ds)\n\t\tag.connect(conn)\n\t\tconn.patch_up(ag.nodes)\n\n\t\tvar v = floatConsumerPlugin.get_value()\n\t\tassert(v, 2)\n\n\t\tag.disconnect(conn)\n\n\t\tss = float0.plugin.output_slots[0]\n\n\t\tconn = new Connection(float0, floatConsumerNode, ss, ds)\n\t\tag.connect(conn)\n\t\tconn.patch_up(ag.nodes)\n\n\t\tvar v = floatConsumerPlugin.get_value()\n\t\tassert(v, 3)\n\t})\n})\n\n\n\n"
  },
  {
    "path": "browser/test/integration/uiSlotValues.js",
    "content": "var assert = require('assert');\n\nvar helpers = require('./helpers')\nvar reset = helpers.reset\nvar connect = helpers.connect\nvar disconnect = helpers.disconnect\n\nvar reset = require('./helpers').reset;\n\ndescribe('Changing Slot Values', function() {\n\tvar graph, orNode, floatDisplay\n\n\tbeforeEach(function() {\n\t\treset()\n\n\t\tgraph = E2.core.active_graph\n\t\torNode = E2.app.instantiatePlugin('or_modulator')\n\t\tfloatDisplay = E2.app.instantiatePlugin('bool_display')\n\n\t\tconnect(graph, orNode, 0, floatDisplay, 0, false)\n\n\t\tE2.app.graphApi\n\t\t\t.changeInputSlotValue(graph, orNode, 'a', true)\n\t})\n\n\tit('sets values on dispatch', function() {\n\t\tassert.equal(true, orNode.plugin.conds[0])\n\t\tgraph.update()\n\t\tassert.equal(true, floatDisplay.plugin.inputValues['bool'])\n\t})\n\n\tit('can undo to previous value', function() {\n\t\tE2.app.graphApi\n\t\t\t.changeInputSlotValue(graph, orNode, 'a', false)\n\n\t\tassert.equal(false, orNode.plugin.conds[0])\n\n\t\tE2.app.undoManager.undo()\n\n\t\tassert.equal(true, orNode.plugin.conds[0])\n\t\tgraph.update()\n\t\tassert.equal(true, floatDisplay.plugin.inputValues['bool'])\n\t})\n\n\tit('can serialize slot values', function() {\n\t\tvar ser = E2.core.serialiseToObject()\n\t\tassert.equal(ser.root.nodes[0].uiSlotValues.a, true)\n\t})\n\n\tit('changes slot default (ui) when no override', function() {\n\t\tvar slot = orNode.findInputSlotByName('a')\n\t\tslot.def = 3\n\t\tE2.app.graphApi\n\t\t\t.changeInputSlotValue(graph, orNode, 'a', 3)\n\t\tassert.equal(orNode.getInputSlotValue('a'), 3)\n\t})\n\n\tit('refuses if slot is connected', function() {\n\t\tvar slot = orNode.findInputSlotByName('a')\n\t\tslot.is_connected = true\n\t\tE2.app.graphApi\n\t\t\t.changeInputSlotValue(graph, orNode, 'a', false)\n\t\tassert.equal(orNode.getInputSlotValue('a'), true)\n\t})\n\n\tit('can deserialize slot values', function() {\n\t\tvar ser = E2.core.serialise()\n\t\tgraph = E2.core.deserialise(ser)\n\n\t\tassert.equal(graph.nodes[0]\n\t\t\t.getInputSlotValue('a'), true)\n\t})\n\n\tit('calls update_input before update_state', function(done) {\n\t\tvar updateInputCalled = false\n\t\torNode.plugin.update_input = function() {\n\t\t\tupdateInputCalled = true\n\t\t}\n\t\torNode.plugin.update_state = function() {\n\t\t\tassert.ok(updateInputCalled)\n\t\t\tdone()\n\t\t}\n\t\tE2.app.graphApi\n\t\t\t.changeInputSlotValue(graph, orNode, 'a', false)\n\n\t\tgraph.update()\n\t})\n\n\tit('uses uiValue after input is disconnected', function(done) {\n\t\tvar updateCalled = false\n\n\t\tvar boolToggle = E2.app.instantiatePlugin('toggle_button')\n\t\tvar conn = connect(graph, boolToggle, 0, orNode, 0, false)\n\t\tgraph.update()\n\n\t\torNode.plugin.update_input = function() {\n\t\t\tupdateCalled = true\n\t\t}\n\t\torNode.plugin.update_state = function() {\n\t\t\tassert.ok(updateCalled, 'should have called update upon disconnecting')\n\t\t\tassert.equal(this.parentNode.getInputSlotValue('a'), true)\n\t\t\tdone()\n\t\t}\n\t\tdisconnect(graph, conn)\n\t\tgraph.update()\n\t})\n\n\n\tit('returns correct uiValue regardless of connection status', function(done) {\n\t\tvar boolToggle = E2.app.instantiatePlugin('toggle_button')\n\n\t\tvar slotA = orNode.findInputSlotByName('a')\n\n\t\tassert.equal(orNode.getUiSlotValue(slotA), true, 'correctly setup uiValue for A')\n\n\t\tvar conn = connect(graph, boolToggle, 0, orNode, 0, false)\n\t\tgraph.update()\n\n\t\tassert.equal(orNode.getInputSlotValue('a'), false, 'input A is updated')\n\t\tassert.equal(orNode.getUiSlotValue(slotA), true, 'uiValue for A remains true')\n\n\t\tdone()\n\t})\n\n})\n\n\n"
  },
  {
    "path": "browser/test/integration/variables.js",
    "content": "var assert = require('assert');\n\nvar helpers = require('./helpers')\nvar reset = helpers.reset\nvar fs = require('fs')\nvar connect = helpers.connect\nvar disconnect = helpers.disconnect\n\nvar reset = require('./helpers').reset;\n\nvar variablesJson = fs.readFileSync(__dirname+'/../fixtures/variables.json').toString()\n\ndescribe('Variables', function() {\n\tbeforeEach(function() {\n\t\treset()\n\t})\n\n\tit('keeps correct track of connections', function() {\n\t\tE2.core.deserialise(variablesJson)\n\n\t\tvar graph = E2.core.root_graph\n\n\t\t// assert 5 connections\n\t\tassert.equal(graph.variables.variables.a.connections, 5)\n\n\t\t// disconnect one\n\t\tdisconnect(graph, graph.nodes[5].inputs[0])\n\n\t\tassert.equal(graph.variables.variables.a.connections, 4)\n\n\t\t// // delete selection\n\t\tE2.app.selectedNodes = [\n\t\t\tgraph.nodes[6], // const_float\n\t\t\tgraph.nodes[7], // variable_write_conditional\n\t\t]\n\t\tE2.app.selectedConnections = [\n\t\t\tgraph.nodes[7].inputs[0],\n\t\t]\n\t\tE2.app.onCopy()\n\t\tE2.app.onDelete()\n\n\t\t// assert one connection less\n\t\tassert.equal(graph.variables.variables.a.connections, 3)\n\n\t\t// paste\n\t\tE2.app.pasteFromClipboard()\n\n\t\tassert.equal(graph.variables.variables.a.connections, 4)\n\t})\n})\n\n\n"
  },
  {
    "path": "browser/test/integration/webVRAdapter.js",
    "content": "var assert = require('assert')\nvar EventEmitter = require('events').EventEmitter\nvar helpers = require('./helpers')\nvar reset = helpers.reset\nvar setupThree = helpers.setupThree\n\nvar VizorWebVRAdapter = require('../../scripts/webVRAdapter.js')\t// respect mocks\n\nvar mockWebVRManager = function() {\n\tvar modes = WebVRManager.Modes\n\tglobal.WebVRManager = function (renderer, effect, params) {\n\t\tEventEmitter.call(this)\n\t\tvar that = this\n\t\tthis.renderer = renderer\n\t\tthis.effect = effect\n\t\tthis.params = params\n\t\tthis.mode = null\n\t\tthis.setMode_ = function (mode) {\n\t\t\tthat.mode = mode\n\t\t}\n\t\tthis.fsClickCalled = false\n\t\tthis.vrClickCalled = false\n\t\tthis.exitFullScreenCalled = false\n\t\tthis.onFSClick_ = function(){\n\t\t\tthat.setMode_(modes.MAGIC_WINDOW)\n\t\t\tthat.fsClickCalled = true\n\t\t}\n\t\tthis.onVRClick_ = function(){\n\t\t\tthat.setMode_(modes.VR)\n\t\t\tthat.vrClickCalled = true\n\t\t}\n\t\tthis.exitFullscreen_ = function(){\n\t\t\tthat.setMode_(modes.NORMAL)\n\t\t\tthat.exitFullScreenCalled = true\n\t\t}\n\n\t\tthis.on = function(){}\n\t}\n\tglobal.WebVRManager.prototype = Object.create(EventEmitter.prototype)\n\tglobal.WebVRManager.Modes = modes\n}\n\n\ndescribe('Web VR Manager', function() {\n\n\tbeforeEach(function(done) {\n\t\treset()\n\t\tglobal.E2.core.renderer.setSizeNoResize = function(){}\n\t\tmockWebVRManager()\n\t\tE2.core.webVRAdapter.on('ready', done)\n\t\tE2.core.webVRAdapter.initialise({}, E2.core.renderer)\n\t})\n\n\tit('instantiates a webvr adapter', function(done){\n\t\tassert.ok(E2.core.webVRAdapter, 'found a web vr adapter')\n\t\tassert.ok(E2.core.webVRAdapter instanceof global.VizorWebVRAdapter, 'found a VizorWebVRAdapter')\n\t\tdone()\n\t})\n\n\tit('gets and sets mode', function(done){\n\t\tvar a = E2.core.webVRAdapter, modes = a.modes\n\n\t\tvar newMode\n\n\t\tnewMode = modes.MAGIC_WINDOW\n\t\ta.setMode(newMode)\n\t\tassert.equal(a.getCurrentManagerMode(), newMode, 'should set fullscreen mode')\n\t\tassert.ok(a._manager.fsClickCalled, 'should have called manager.onFSClick!')\n\n\t\tnewMode = modes.VR\n\t\ta.setMode(newMode)\n\t\tassert.equal(a.getCurrentManagerMode(), newMode, 'should set VR mode')\n\t\tassert.ok(a._manager.vrClickCalled, 'should have called manager.onVRClick')\n\n\t\tdone()\n\t})\n\n\tit('toggles fullscreen', function(done){\n\t\tvar a = E2.core.webVRAdapter, modes = a.modes\n\n\t\ta.setMode(modes.NORMAL)\n\n\t\ta.toggleFullScreen()\n\t\tassert.notEqual(a.getCurrentManagerMode(), modes.NORMAL, 'should toggle fullscreen')\n\n\t\ta.setMode(modes.MAGIC_WINDOW)\n\t\ta.toggleFullScreen()\n\t\tassert.equal(a.getCurrentManagerMode(), modes.NORMAL, 'should exit fullscreen OK')\n\n\t\tdone()\n\t})\n\n\tit('tries to amend vr manager instructions', function(done){\n\t\tvar a = E2.core.webVRAdapter, modes = a.modes\n\n\t\tvar triedToAmendInstructions = false\n\t\ta.amendVRManagerInstructions = function() {\n\t\t\ttriedToAmendInstructions = true\n\t\t}\n\t\ta.setMode(modes.VR)\n\t\tassert.ok(triedToAmendInstructions, 'should have tried to modify instructions')\n\n\t\ta.setMode(modes.NORMAL)\n\n\t\ttriedToAmendInstructions = false\n\t\ta._instructionsChanged = true\n\t\ta.setMode(modes.VR)\n\t\tassert.ok(!triedToAmendInstructions, 'should NOT have tried to modify instructions')\n\n\t\tdone()\n\t})\n\n\tit('triggers modechanged events', function(done){\n\t\tvar a = E2.core.webVRAdapter, modes = a.modes\n\n\t\tvar modeChangeTriggered = false\n\t\ta.on(a.events.modeChanged, function(){\n\t\t\tmodeChangeTriggered = true\n\t\t})\n\n\t\ta.setMode(modes.VR)\n\t\tassert.ok(modeChangeTriggered, 'expected mode change event')\n\t\tdone()\n\t});\n\n})"
  },
  {
    "path": "browser/test/unit/assetLoader.js",
    "content": "\nglobal.E2 = {}\n\nvar assert = require('assert')\nvar fs = require('fs')\n\nvar graph = JSON.parse(fs.readFileSync(__dirname+'/../fixtures/preloader1.json'))\nvar tastyGraph = JSON.parse(fs.readFileSync(__dirname+'/../fixtures/tasty1.json'))\n\nvar AssetLoader = require('../../scripts/loaders/assetLoader.js').AssetLoader\nvar Loader = require('../../scripts/loaders/loader.js').Loader\nvar ModelLoader = require('../../scripts/loaders/modelLoader').ModelLoader\n\ndescribe('Asset loading', function() {\n\tbeforeEach(function() {\n\t\tglobal.msg = console.error.bind(console)\n\t\tglobal.$ = {\n\t\t\tget: function(url, cb) {\n\t\t\t\tcb({})\n\t\t\t}\n\t\t}\n\t\tglobal.E2.util = {\n\t\t\tisMobile: {\n\t\t\t\tiOS: () => { return false }\n\t\t\t}\n\t\t}\n\t\tglobal.THREE = {\n\t\t\tDDSLoader: function() {},\n\t\t\tImageUtils: {\n\t\t\t\tloadTexture: function() {\n\t\t\t\t\treturn {}\n\t\t\t\t}\n\t\t\t},\n\t\t\tLoader: {\n\t\t\t\tHandlers: { add: function() {} }\n\t\t\t},\n\t\t}\n\t})\n\n\tdescribe('ModelLoader', function() {\n\t\tbeforeEach(function() {\n\t\t\tglobal.THREE.JSONLoader = function() {\n\t\t\t\treturn {\n\t\t\t\t\tload: function(url, loadedCb, progressFn) {\n\t\t\t\t\t\tprocess.nextTick(function() {\n\t\t\t\t\t\t\tprogressFn({ loaded: 3, total: 6 })\n\t\t\t\t\t\t\tloadedCb()\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\tit('reports progress', function(done) {\n\t\t\tvar loader = new ModelLoader('foo.json')\n\t\t\tloader\n\t\t\t.on('progress', function(pct) {\n\t\t\t\tconsole.log('foo.json progress')\n\t\t\t\tassert.equal(0.5, pct)\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\tdescribe('AssetLoader', function() {\n\t\tvar pre\n\n\t\tfunction dummyLoader() {\n\t\t\treturn function() {\n\t\t\t\tvar ee = new EventEmitter()\n\t\t\t\tprocess.nextTick(function() {\n\t\t\t\t\tee.emit('progress', 0.5)\n\n\t\t\t\t\tprocess.nextTick(function() {\n\t\t\t\t\t\tee.emit('loaded', {})\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\treturn ee\n\t\t\t}\n\t\t}\n\n\t\tbeforeEach(function() {\n\t\t\tvar loaders = {\n\t\t\t\tmodel: dummyLoader(),\n\t\t\t\timage: dummyLoader(),\n\t\t\t\ttexture: dummyLoader(),\n\t\t\t}\n\n\t\t\tpre = new AssetLoader(loaders)\n\t\t})\n\n\t\tit('parses assets to load correctly', function(done) {\n\t\t\tvar assets = pre.parse(graph.root)\n\t\t\tassert.equal(assets.model.length, 1)\n\t\t\tassert.equal(assets.texture.length, 2)\n\t\t\tdone()\n\t\t})\n\n\t\tit('resolves if there is nothing to load', function(done) {\n\t\t\tpre.loadAssetsForGraph({})\n\t\t\t.then(function() {\n\t\t\t\tassert.equal(0, pre.assetsLoaded)\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\n\t\tit('resolves if there is nothing to load 2', function(done) {\n\t\t\tvar assets = pre.parse(tastyGraph.root)\n\t\t\tpre.loadAssetsForGraph(tastyGraph.root)\n\t\t\t.then(function() {\n\t\t\t\tassert.equal(0, pre.assetsLoaded)\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\n\t\tit('loads assets for graph', function(done) {\n\t\t\tpre.loadAssetsForGraph(graph.root)\n\t\t\t.then(function() {\n\t\t\t\tassert.equal(3, pre.assetsLoaded)\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\n\t\tit('reuses asset loading promise', function() {\n\t\t\tvar p1 = pre.loadAsset('texture', 'foo')\n\t\t\tvar p2 = pre.loadAsset('texture', 'foo')\n\t\t\tassert.equal(p1, p2)\n\t\t})\n\n\t\tit('fulfills both asset loading promises', function(done) {\n\t\t\tvar p1 = pre.loadAsset('texture', 'foo')\n\t\t\tvar p2 = pre.loadAsset('texture', 'foo')\n\t\t\tvar counter = 0\n\n\t\t\tfunction incr() {\n\t\t\t\tcounter++\n\t\t\t\tif (counter > 1)\n\t\t\t\t\tdone()\n\t\t\t}\n\n\t\t\tp1.then(incr)\n\t\t\tp2.then(incr)\n\t\t})\n\n\t\tit('emits progress', function(done) {\n\t\t\tpre.once('progress', function() {\n\t\t\t\tdone()\n\t\t\t})\n\t\t\tpre.loadAssetsForGraph(graph.root)\n\t\t})\n\t})\n})\n"
  },
  {
    "path": "browser/test/unit/blendFunctions.js",
    "content": "var assert = require('assert')\nrequire('./plugins/helpers')\n\nvar BlendFunctions = require('../../scripts/blendFunctions')\n\ndescribe('Blend Functions', function() {\n\tvar bfs\n\n\tvar ids = [\n\t\t'linear-blend',\n\t\t'inverse-blend',\n\t\t'circular-blend',\n\t\t'cubic-blend',\n\t\t'exponential-blend',\n\t\t'quadratic-blend',\n\t\t'quartic-blend',\n\t\t'quintic-blend',\n\t\t'sinusoidal-blend',\n\t\t'smoothstep-blend',\n\t\t'smootherstep-blend']\n\n\tbeforeEach(function() {\n\t\tbfs = new BlendFunctions()\n\t})\n\n\tit('Preserves blend function ids', function() {\n\t\tfor (var i = 0; i < ids.length; ++i) {\n\t\t\tassert.ok(bfs.getById(ids[i]) !== undefined, ids[i])\n\t\t}\n\t})\n\n\tit('Has tests for all blend functions', function() {\n\t\tvar allFuncs = bfs.functions\n\n\t\tfor (var i = 0; i < allFuncs.length; ++i) {\n\t\t\tassert.ok(ids.indexOf(allFuncs[i].id) !== -1, allFuncs[i].id)\n\t\t}\n\t})\n\n\tit('Stays within [0..1] range', function() {\n\t\tfor (var i = 0; i < ids.length; ++i) {\n\t\t\tvar func = bfs.getById(ids[i])\n\n\t\t\tvar iterations = 10\n\t\t\tfor (var f = 0; f < iterations; f++ ) {\n\t\t\t\tvar result = func.func(f / iterations)\n\t\t\t\tassert.ok(result >= 0 && result <= 1, func.id + ' ' + f / iterations + ' -> ' + result.toString())\n\t\t\t}\n\t\t}\n\t})\n})\n"
  },
  {
    "path": "browser/test/unit/breadcrumb.js",
    "content": "var assert = require('assert')\nvar UIBreadcrumb = require('../../scripts/ui-breadcrumb')\n\nglobal.jQuery = function(){\n\tvar blank = ()=>{}\n\tthis._html = ''\n\tthis.html = function(html){return (typeof html !== 'undefined') ? (this._html = html) : this._html}\n\n\tthis.find = function(){\n\t\tvar _on = this._on = {}\n\t\treturn {on: (c,h)=>{_on[c]=h}, off:blank}\n\t}\n}\nvar $ = () => new jQuery()\n\n\ndescribe('UIBreadcrumb', function() {\n\tvar u\n\tbeforeEach(function () {\n\t\tu = new UIBreadcrumb()\n\t})\n\n\tit('produces template data', function (done) {\n\t\tvar data = u.getTemplateData()\n\t\tassert.equal(typeof (data.options), 'object', 'data must contain .options')\n\t\tassert.equal(Array.isArray(data.crumbs), true, 'data must contain array of .crumbs')\n\t\tu.add('test')\n\t\tassert.equal(typeof data.crumbs[0], 'object', 'crumbs must be objects')\n\n\t\tdone()\n\t})\n\n\tit('adds crumbs', function (done) {\n\t\tu.add('test')\n\t\tu.add('test2', '#tx2')\n\t\tu.add('test3', '#tx3', null, '$one$')\n\n\t\tvar crumbs = u.getTemplateData().crumbs\n\n\t\tassert.equal(crumbs.length, 3, 'there must be three crumbs')\n\t\tassert.equal(crumbs[0].text, 'test', 'must have correct text')\n\t\tassert.equal(crumbs[1].link, '#tx2', 'must have correct link')\n\t\tassert.equal(crumbs[2].uid, '$one$', 'must have correct uid')\n\n\t\tdone()\n\t})\n\n\n\tit('prepends crumbs', function (done) {\n\t\tu.add('test')\n\t\tvar crumbs = u.getTemplateData().crumbs\n\t\tassert.equal(crumbs[0].text, 'test', 'test crumb must come first')\n\t\tu.prepend('prepend')\n\t\tassert.equal(crumbs[0].text, 'prepend', 'prepend crumb must come first')\n\t\tdone()\n\t})\n\n\n\tit('adds a click handler', function(done){\n\t\tvar ch = function(){}\n\t\tu.add('test4', '#tx4', ch, '$two$')\n\t\tassert.equal(u.clickHandlers['$two$'], ch, 'must push clickHandler')\n\t\tdone()\n\t})\n\n\n\tit('counts crumbs right', function (done) {\n\t\tvar rnd = 5 + Math.round(Math.random()*100)\n\t\tfor (var i=rnd; i>0; i--) {\n\t\t\tu.add('test'+i)\n\t\t}\n\t\tassert.equal(u.length, u.getTemplateData().crumbs.length, 'must have same length as crumbs')\n\t\tassert.equal(u.length, rnd, 'must have correct length')\n\n\t\tdone()\n\t})\n\n\tit('distinguishes between crumbs that look the same', function (done) {\n\t\tvar ch1 = function(){}\n\t\tvar ch2 = function(){}\n\t\tu.add('test', '#test', ch1, '$one$')\n\t\tu.add('test', '#test', ch2, '$two$')\n\t\tvar cr = u.getTemplateData().crumbs\n\t\tassert.equal(u.length, 2)\n\t\tassert.equal(cr[0].text, cr[1].text)\n\t\tassert.notEqual(cr[0].uid, cr[1].uid)\n\t\tassert.equal(ch1, u.clickHandlers['$one$'])\n\t\tassert.notEqual(ch1, u.clickHandlers['$two$'])\n\t\tassert.equal(ch2, u.clickHandlers['$two$'])\n\t\tdone()\n\t})\n\n\tit('attaches', function(done){\n\t\tu.add('sizz')\n\t\tvar container = $('#el')\n\t\tvar $j = u.render(container)\n\t\tvar template = $j.html\n\t\tassert.deepEqual(u.container, container, 'must refer to container')\n\t\tassert.equal(template('test'), 'test', 'must have default fallback template')\n\t\tassert.equal(typeof u.container['_on']['click.breadcrumb'], 'function', 'must have a func inside onclick handlers')\n\t\tdone()\n\t})\n\n})"
  },
  {
    "path": "browser/test/unit/chat.js",
    "content": "var assert = require('assert')\nglobal.Flux = require('../../vendor/flux')\nglobal.EventEmitter = require('events').EventEmitter\n\nvar Chat = require('../../scripts/chat').Chat\nvar ChatStore = require('../../scripts/chat').ChatStore\n\ndescribe('Chat system', function() {\n\tvar cs, wsChannel\n\tbeforeEach(function() {\n\t\tglobal.window = {}\n\t\tglobal.$ = function(){ return { length: 1 } }\n\t\tglobal.E2 = {\n\t\t\tutil: {\n\t\t\t\tisScrolledIntoView: function() {}\n\t\t\t},\n\t\t\tviews: {\n\t\t\t\tchat: { meta: '' }\n\t\t\t},\n\t\t\tapp: {\n\t\t\t\tdispatcher: new Flux.Dispatcher(),\n\t\t\t\tchatStore: new EventEmitter(),\n\t\t\t\tchannel: {\n\t\t\t\t\ton: function(){},\n\t\t\t\t\tgetWsChannel: function() {\n\t\t\t\t\t\twsChannel = new EventEmitter()\n\t\t\t\t\t\twsChannel.ws = {\n\t\t\t\t\t\t\tsend: function() {}\n\t\t\t\t\t\t}\n\t\t\t\t\t\twsChannel.send = function() {}\n\n\t\t\t\t\t\treturn wsChannel\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}}\n\n\t\tcs = new ChatStore()\n\t})\n\n\tdescribe('Chat', function() {\n\t\tvar chat\n\t\tglobal.E2 = {\n\t\t\tapp: {\n\t\t\t\tchatStore: {\n\t\t\t\t\ton: function() {}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbeforeEach(function() {\n\t\t\tchat = new Chat()\n\t\t})\n\n\t\tit('formats a vizor link correctly', function() {\n\t\t\tvar text = chat._messageCleaner('vizor.io/foo/bar')\n\t\t\tassert.equal('<a target=\"_blank\" href=\"http://vizor.io/foo/bar\">vizor.io/foo/bar</a>', text)\n\t\t})\n\n\t\tit('formats a full vizor url correctly', function() {\n\t\t\tvar text = chat._messageCleaner('a b c http://vizor.io/foo/bar b')\n\t\t\tassert.equal('a b c <a target=\"_blank\" href=\"http://vizor.io/foo/bar\">vizor.io/foo/bar</a> b', text)\n\t\t})\n\n\t\tit('formats a subdomain link correctly', function() {\n\t\t\tvar text = chat._messageCleaner('a fhoo.vizor.io/foo/bar baz')\n\t\t\tassert.equal('a <a target=\"_blank\" href=\"http://fhoo.vizor.io/foo/bar\">fhoo.vizor.io/foo/bar</a> baz', text)\n\t\t})\n\t})\n\n\tdescribe('ChatStore', function() {\n\t\tit('emits join', function(done) {\n\t\t\tcs.on('joined', done.bind({}, null))\n\t\t\twsChannel.emit('Global', { kind: 'join', from: 'foo' })\n\t\t})\n\n\t\tit('emits left', function(done) {\n\t\t\tcs.on('left', done.bind({}, null))\n\t\t\twsChannel.emit('Global', { kind: 'leave', from: 'foo' })\n\t\t})\n\n\t\tit('dispatches chats from network', function(done) {\n\t\t\tE2.app.dispatcher.register(function(pl) {\n\t\t\t\tassert.equal(pl.actionType, 'uiChatMessageAdded')\n\t\t\t\tassert.equal(pl.message, 'foo')\n\t\t\t\tdone()\n\t\t\t})\n\t\t\twsChannel.emit('Global', { actionType: 'uiChatMessageAdded', message: 'foo', from: 'bar' })\n\t\t})\n\n\t\tit('emits added on dispatch', function(done) {\n\t\t\tcs.on('added', function(m) {\n\t\t\t\tassert.ok(m.foo, 'bar')\n\t\t\t\tdone()\n\t\t\t})\n\n\t\t\tE2.app.dispatcher.dispatch({\n\t\t\t\tactionType: 'uiChatMessageAdded',\n\t\t\t\tfoo: 'bar'\n\t\t\t})\n\t\t})\n\n\t\tit('calls send on local messages', function(done) {\n\t\t\twsChannel.send = function(cn, message) {\n\t\t\t\tassert.ok(message.message, 'bar')\n\t\t\t\tdone()\n\t\t\t}\n\n\t\t\tE2.app.dispatcher.dispatch({\n\t\t\t\tactionType: 'uiChatMessageAdded',\n\t\t\t\tmessage: 'bar'\n\t\t\t})\n\t\t})\n\t})\n\n})\n"
  },
  {
    "path": "browser/test/unit/collapsibleSelectControl.js",
    "content": "var assert = require('assert')\nvar fs = require('fs')\n\nglobal.Handlebars = {}\nglobal.E2 = {uid:function(){return Date.now()}}\nvar CollapsibleSelectControl = require(__dirname+'/../../scripts/collapsible-select-control.js')\nvar patchesJson = JSON.parse(fs.readFileSync(__dirname+'/../../patches/patches.json'))\nvar patches = Object.keys(patchesJson).reduce(function(arr, catName) {\n\tObject.keys(patchesJson[catName]).map(function(title) {\n\t\tarr.push({ category: catName, title: title, path: patchesJson[catName][title]})\n\t})\n\treturn arr\n}, [])\n\nvar pluginsJson = JSON.parse(fs.readFileSync(__dirname+'/../../plugins/plugins.json'))\nvar plugins = Object.keys(pluginsJson)\n\t.reduce(function(arr, catName) {\n\t\tObject.keys(pluginsJson[catName]).map(function(title) {\n\t\t\tarr.push({\n\t\t\t\tcategory: catName,\n\t\t\t\ttitle: catName + '/' \t+ title,\n\t\t\t\tpath: pluginsJson[catName][title]\n\t\t\t})\n\t\t})\n\t\treturn arr\n\t}, [])\n\npatches = patches.concat(plugins)\n\ndescribe('scoring',function(){\n\tvar c = new CollapsibleSelectControl()\n\n\tit('debf in `Emitters debug float`', function() {\n\t\tassert.equal(c.scoreResult('debf', 'Emitters/Debug/Float'), 24)\n\t})\n\n\tit('debugf in `Emitters debug float`', function() {\n\t\tassert.equal(c.scoreResult('debugf', 'Emitters/Debug/Float'), 53)\n\t})\n\n\tit('template in `foo template bar`', function() {\n\t\tassert.equal(c.scoreResult('template', 'foo template bar'), 500)\n\t})\n\n\tit('oscillate in `gen oscillator bar`', function() {\n\t\tassert.equal(c.scoreResult('oscillate', 'gen oscillator bar'), 121)\n\t})\n})\n\ndescribe('filtering',function(){\n\tvar c \n\tbeforeEach(function() {\n\t\tc = new CollapsibleSelectControl()\n\t\tc.data(patches.concat(plugins))\n\t})\n\n\tit('finds oscillators with `oscillate`', function() {\n\t\tvar f = c._filterData('oscillate')\n\t\tassert.deepEqual(f[0].score, 1000)\n\t\tassert.deepEqual(f[0].title, 'Oscillate 2 values with in tween')\n\t})\n\n\tit('finds debgf', function() {\n\t\tvar f = c._filterData('debgf')\n\t\tassert.deepEqual(f[0].title, 'DEBUG TOOLS/Data info')\n\t})\n\n\tit('finds floa', function() {\n\t\tvar f = c._filterData('floadeb')\n\t\tassert.deepEqual(f[0].title, 'DEBUG TOOLS/Float')\n\t})\n})\n"
  },
  {
    "path": "browser/test/unit/connection.js",
    "content": "var assert = require('assert');\n\nglobal.E2 = {\n\tuid: function() {},\n\tdt: {\n\t\tANY: { id: 8, name: 'Arbitrary' },\n\t\tFLOAT: { id: 0, name: 'Float' }\n\t},\n\tslot_type: {\n\t\tinput: 0,\n\t\toutput: 1\n\t}\n}\n\nglobal.EventEmitter = require('../../scripts/event-emitter')\nglobal.Node = require('../../scripts/node').Node\nglobal.Connection = require('../../scripts/connection').Connection\nglobal.msg = console.log\n\ndescribe('Connection', function() {\n\tbefore(function() {\n\t})\n\n\tit('calls node addOutput', function(done) {\n\t\tvar na = new Node()\n\t\tna.uid = 'na'\n\t\tvar nb = new Node()\n\t\tnb.uid = 'nb'\n\t\t\n\t\tna.add_slot(1, { dt: E2.dt.FLOAT, name: 'x' })\n\t\tnb.add_slot(0, { dt: E2.dt.FLOAT, name: 'x' })\n\n\t\tna.addOutput = function() { done() }\n\n\t\tConnection.hydrate({ nodes: [ na, nb ] }, {\n\t\t\tsrc_nuid: 'na',\n\t\t\tdst_nuid: 'nb',\n\t\t\tsrc_slot: 0,\n\t\t\tsrc_dyn: true,\n\t\t\tdst_slot: 0,\n\t\t\tdst_dyn: true\n\t\t})\n\t})\n\n\tit('calls node addInput', function(done) {\n\t\tvar na = new Node()\n\t\tna.uid = 'na'\n\t\tvar nb = new Node()\n\t\tnb.uid = 'nb'\n\t\t\n\t\tna.add_slot(1, { dt: E2.dt.FLOAT, name: 'x' })\n\t\tnb.add_slot(0, { dt: E2.dt.FLOAT, name: 'x' })\n\n\t\tnb.addInput = function() { done() }\n\n\t\tConnection.hydrate({ nodes: [ na, nb ] }, {\n\t\t\tsrc_nuid: 'na',\n\t\t\tdst_nuid: 'nb',\n\t\t\tsrc_slot: 0,\n\t\t\tsrc_dyn: true,\n\t\t\tdst_slot: 0,\n\t\t\tdst_dyn: true\n\t\t})\n\t})\n\n\n\tit('patches up only once', function(done) {\n\t\tvar na = new Node()\n\t\tna.uid = 'na'\n\t\tvar nb = new Node()\n\t\tnb.uid = 'nb'\n\t\t\n\t\tna.add_slot(1, {dt: E2.dt.FLOAT, name: 'x'})\n\t\tnb.add_slot(0, {dt: E2.dt.FLOAT, name: 'x'})\n\n\t\tna.addOutput = function() { done() }\n\n\t\tvar conn = Connection.hydrate({ nodes: [ na, nb ] }, {\n\t\t\tsrc_nuid: 'na',\n\t\t\tdst_nuid: 'nb',\n\t\t\tsrc_slot: 0,\n\t\t\tsrc_dyn: true,\n\t\t\tdst_slot: 0,\n\t\t\tdst_dyn: true\n\t\t})\n\n\t\tconn.patch_up()\n\t\tconn.patch_up()\n\t\tconn.patch_up()\n\t})\n})\n\n\n\n"
  },
  {
    "path": "browser/test/unit/editConnection.js",
    "content": "var assert = require('assert');\n\nvar EditConnection = require('../../scripts/editConnection')\n\ndescribe('EditConnection', function() {\n\tglobal.E2 = { dt: { ANY: { id: 8 } }}\n\n\tfunction Connection(a,b,c,d) {\n\t\tthis.src_node = a\n\t\tthis.src_slot = c\n\t\tthis.dst_node = b\n\t\tthis.dst_slot = d\n\t}\n\tConnection.prototype.create_ui = function() {}\n\n\tfunction makeNode() {\n\t\treturn {}\n\t}\n\n\tfunction makeSlot(dt, slotType) {\n\t\treturn {\n\t\t\tdt: { id: dt },\n\t\t\ttype: slotType,\n\t\t\tindex: 0\n\t\t}\n\t}\t\n\n\tit('does not allow connecting to self', function() {\n\t\tvar isValid = true\n\t\tvar n1 = makeNode()\n\t\tvar s1 = makeSlot(0, 0)\n\t\tvar c = new EditConnection({}, new Connection(n1, null, s1))\n\t\tisValid = c.canConnectTo(n1, s1)\n\t\tassert.ok(!isValid)\n\t})\n\n\tit('does not allow connecting any to any', function() {\n\t\tvar isValid = true\n\t\tvar n1 = makeNode()\n\t\tvar s1 = makeSlot(8, 1)\n\t\tvar n2 = makeNode()\n\t\tvar s2 = makeSlot(8, 0)\n\t\tvar c = new EditConnection({}, new Connection(n1, null, s1))\n\t\tisValid = c.canConnectTo(n2, s2)\n\t\tassert.ok(!isValid)\n\t})\n\n\tit('does not allow connecting output to output', function() {\n\t\tvar isValid = true\n\t\tvar n1 = makeNode()\n\t\tvar s1 = makeSlot(8, 1)\n\t\tvar n2 = makeNode()\n\t\tvar s2 = makeSlot(2, 1)\n\t\tvar c = new EditConnection({},\n\t\t\tnew Connection(n1, null, s1))\n\t\tisValid = c.canConnectTo(n2, s2)\n\t\tassert.ok(!isValid)\n\t})\n\n\tit('recognizes right to left', function() {\n\t\tvar c = new EditConnection({}, new Connection(null, 1, null, 1))\n\t\tassert.ok(c.rightToLeft)\n\t})\n\n\tit('does allow connecting left to right', function() {\n\t\tvar isValid = true\n\t\tvar n1 = makeNode()\n\t\tvar s1 = makeSlot(0, 1)\n\t\tvar n2 = makeNode()\n\t\tvar s2 = makeSlot(0, 0)\n\t\tvar c = new EditConnection({}, new Connection(n1, null, s1))\n\t\tisValid = c.canConnectTo(n2, s2)\n\t\tassert.ok(isValid)\n\t})\n\n\tit('does allow connecting right to left', function() {\n\t\tvar isValid = true\n\t\tvar n1 = makeNode()\n\t\tvar s1 = makeSlot(0, 1)\n\t\tvar n2 = makeNode()\n\t\tvar s2 = makeSlot(0, 0)\n\t\tvar c = new EditConnection({}, new Connection(null, n1, null, s1))\n\t\tisValid = c.canConnectTo(n2, s2)\n\t\tassert.ok(isValid)\n\t})\n\n\n});\n\n"
  },
  {
    "path": "browser/test/unit/editorChannel.js",
    "content": "var assert = require('assert')\nvar when = require('when')\n\nglobal._ = require('lodash')\nglobal.EventEmitter = require('events').EventEmitter\n\nvar EditorChannel = require('../../scripts/editorChannel')\n\ndescribe('EditorChannel', function() {\n\tvar ec \n\tvar forkPromise\n\n\tbeforeEach(function() {\n\t\tglobal.E2 = {\n\t\t\tui: {\n\t\t\t\tupdateProgressBar: function() {}\n\t\t\t},\n\t\t\tapp: {\n\t\t\t\tgrowl: function() {},\n\t\t\t\tdispatcher: {\n\t\t\t\t\tregister: function() {}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tglobal.ForkCommand = function() {\n\t\t\tthis.fork = function() {\n\t\t\t\tforkPromise = when.defer()\n\t\t\t\treturn forkPromise.promise\n\t\t\t}\n\t\t}\n\n\t\tec = new EditorChannel()\n\t\tec.wsChannel = {\n\t\t\tsend: function() {}\n\t\t}\n\t})\n\n\tit('can`t send if not connected', function() {\n\t\tec.connected = false\n\t\tassert.equal(ec.canSend(), false)\n\t})\n\n\tit('can`t send if forking', function() {\n\t\tec.connected = true\n\t\tec.forking = true\n\t\tassert.equal(ec.canSend(), false)\n\t})\n\n\tit('queues messages', function() {\n\t\tec.connected = false\n\t\tec.send({ actionType: 'uiMouseMoved' })\n\t\tec.send({ actionType: 'uiMouseClicked' })\n\t\tassert.equal(ec.queue.length, 2)\n\t})\n\n\tit('processes queue if it can send', function() {\n\t\tec.channelName = 'foo'\n\t\tec.send({ actionType: 'uiMouseMoved' })\n\t\tec.send({ actionType: 'uiMouseClicked' })\n\t\tec.connected = true\n\t\tec.forking = false\n\t\tec.processQueue()\n\t\tassert.equal(ec.queue.length, 0)\n\t})\n\n\tit('replays queued messages after fork', function(done) {\n\t\tvar dispatches = 0\n\t\tec.fork()\n\t\tec.send({ actionType: 'uiNodeRemoved' })\n\t\tec.send({ actionType: 'uiDisconnected' })\n\t\tassert.equal(ec.queue.length, 2)\n\t\tforkPromise.resolve()\n\t\tglobal.E2.app.dispatcher.dispatch = function(pl) {\n\t\t\tif (++dispatches === 2)\n\t\t\t\tdone()\n\t\t}\n\t})\n\n})"
  },
  {
    "path": "browser/test/unit/fork.js",
    "content": "var ForkCommand = require('../../scripts/commands/fork').ForkCommand\nvar when = require('when')\nvar assert = require('assert')\n\nfunction MockApp(path) {\n\tvar that = this\n\tthis.channelSent = []\n\tthis.dispatches = []\n\tthis.path = path\n\tthis.dispatcher = {\n\t\tdispatch: function(d) {\n\t\t\tthat.dispatches.push(d)\n\t\t}\n\t}\n\tthis.setupEditorChannel = function() {\n\t\tvar dfd = when.defer()\n\t\tdfd.resolve()\n\t\treturn dfd.promise\n\t}\n\tthis.player = {\n\t\tstate: {},\n\t\tcurrent_state: 0,\n\t\tstop: function() {},\n\t\tplay: function() {},\n\t}\n\tthis.channel = {\n\t\tsendPayload: function(e) {\n\t\t\tthat.channelSent.push(e)\n\t\t},\n\t\tsnapshot: function() {\n\t\t\tthat.channelSent.push({\n\t\t\t\tactionType: 'graphSnapshotted',\n\t\t\t\tdata: 'serialisedGraph'\n\t\t\t})\n\t\t},\n\t\tsend: function(e) {\n\t\t\tthat.channelSent.push(e)\n\t\t}\n\t}\n}\t\n\ndescribe('ForkCommand', function() {\n\tvar dateNow = Date.now()\n\n\tbeforeEach(function() {\n\t\tglobal.history = { pushState: function() {} }\n\t\tglobal.E2 = {\n\t\t\ttrack: function() {},\n\t\t\tcore: {\n\t\t\t\troot_graph: {\n\t\t\t\t\tuid: 'root',\n\t\t\t\t\tnodes: [ 'a' ],\n\t\t\t\t\tconnections: [ 'b' ]\n\t\t\t\t},\n\t\t\t\tserialise: function() {\n\t\t\t\t\treturn 'serialisedGraph'\n\t\t\t\t}\n\t\t\t},\n\t\t\tuid: function() { return dateNow },\n\t\t\tapp: new MockApp('owner/test')\n\t\t}\n\n\t\tglobal.E2.core.active_graph = E2.core.root_graph\n\n\t})\n\n\tit('returns', function(done) {\n\t\tvar fc = new ForkCommand()\n\t\tfc.fork()\n\t\t\t.then(done)\n\t\t\t.catch(done)\n\t})\n\n\tit('sets the app path / channel name', function(done) {\n\t\tvar fc = new ForkCommand()\n\t\tfc.fork()\n\t\t\t.then(function() {\n\t\t\t\tassert.equal(E2.app.path, 'owner-test-'+dateNow)\n\t\t\t\tdone()\n\t\t\t})\n\t\t\t.catch(done)\n\t})\n\n\tit('pushes history state', function(done) {\n\t\thistory.pushState = function(_st, _, path) {\n\t\t\tassert.equal(path, '/owner-test-'+dateNow)\n\t\t\tdone()\n\t\t}\n\t\tvar fc = new ForkCommand()\n\t\tfc.fork()\n\t\t\t.catch(done)\n\t})\n\n\tit('connects the channel', function(done) {\n\t\tE2.app.setupEditorChannel = function() {\n\t\t\tvar dfd = when.defer()\n\t\t\tdfd.resolve()\n\t\t\tdone()\n\t\t\treturn dfd.promise\n\t\t}\n\n\t\tvar fc = new ForkCommand()\n\t\tfc.fork().catch(done)\n\t})\n\n\tit('dispatches the snapshot', function(done) {\n\t\tvar fc = new ForkCommand()\n\t\tfc.fork()\n\t\t\t.then(function() {\n\t\t\t\tvar dis = E2.app.channelSent[0]\n\t\t\t\tassert.equal(dis.actionType, 'graphSnapshotted')\n\t\t\t\tassert.deepEqual(dis.data, 'serialisedGraph')\n\t\t\t\tdone()\n\t\t\t})\n\t\t\t.catch(done)\n\t})\n\n\tit('can fork a fork', function(done) {\n\t\tE2.app.path = 'someuser-graph-fork52'\n\t\tvar fc = new ForkCommand()\n\t\tfc.fork()\n\t\t\t.then(function() {\n\t\t\t\tassert.equal(E2.app.path, 'someuser-graph-'+dateNow)\n\t\t\t\tdone()\n\t\t\t})\n\t\t\t.catch(done)\n\t})\n\n\tit('can fork an anonymous session', function(done) {\n\t\tE2.app.path = 'beef'\n\t\tvar fc = new ForkCommand()\n\t\tfc.fork()\n\t\t\t.then(function() {\n\t\t\t\tassert.equal(E2.app.path, 'beef-'+dateNow)\n\t\t\t\tdone()\n\t\t\t})\n\t\t\t.catch(done)\n\t})\n\n\n\n})\n\n\n\n"
  },
  {
    "path": "browser/test/unit/graphStore.js",
    "content": "var assert = require('assert');\nvar when = require('when')\n\nglobal.EventEmitter = require('events').EventEmitter\nglobal.Store = require('../../scripts/stores/store')\n\nvar GraphStore = require('../../scripts/stores/graphStore')\nvar Node = require('../../scripts/node').Node\n\ndescribe('GraphStore', function() {\n\tvar graph, node\n\n\tbeforeEach(function() {\n\t\tglobal.E2 = {\n\t\t\tuid: function() {\n\t\t\t\treturn '' + Math.random()\n\t\t\t},\n\t\t\tcore: {\n\t\t\t\ton: function(){},\n\t\t\t\troot_graph: { nodes: [ 'node' ] }\n\t\t\t},\n\t\t\tGraphAnalyser: function() {\n\t\t\t\treturn {\n\t\t\t\t\tanalyseGraph: function() {\n\t\t\t\t\t\treturn when.resolve({ size: 1 })\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tGridFsClient: function() {},\n\t\t\tapp: {\n\t\t\t\tdispatcher: {\n\t\t\t\t\tregister: function(){}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tgraph = { addNode: function() {} }\n\t\tnode = new Node()\n\t\tnode.plugin = { id: 'url_texture_generator' }\n\t})\n\n\tdescribe('uiNodeAdded', function() {\n\t\tit('calls reset on node', function(done) {\n\t\t\tvar gs = new GraphStore()\n\t\t\tnode.reset = done\n\t\t\tgs._uiNodeAdded(graph, node)\n\t\t})\n\n\t\tit('emits graph size on uiNodeAdded', function(done) {\n\t\t\tvar gs = new GraphStore()\n\t\t\tgs._uiNodeAdded(graph, node)\n\t\t\tgs.once('changed:size', function(size) {\n\t\t\t\tassert.equal(size, 1)\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\n\t\tit('calls initialise on node', function(done) {\n\t\t\tvar gs = new GraphStore()\n\t\t\tnode.initialise = done\n\t\t\tgs._uiNodeAdded(graph, node)\n\t\t})\n\t})\n\n})\n"
  },
  {
    "path": "browser/test/unit/node.js",
    "content": "var assert = require('assert');\n\nglobal.E2 = {\n\tuid: function() {},\n\tdt: {\n\t\tANY: { id: 8, name: 'Arbitrary' },\n\t\tFLOAT: { id: 0, name: 'Float' }\n\t},\n\tslot_type: {\n\t\tinput: 0,\n\t\toutput: 1\n\t}\n}\n\nglobal.msg = console.error\n\nglobal.EventEmitter = require('../../scripts/event-emitter')\nglobal.Node = require('../../scripts/node').Node\n\ndescribe('Node', function() {\n\tvar core, app\n\n\tit('adds input slots', function() {\n\t\tvar node = new Node()\n\t\tnode.add_slot(0, { a: 'a', dt: E2.dt.FLOAT, name: 'x' })\n\t\tassert.equal(node.dyn_inputs.length, 1)\n\t\tassert.equal(node.dyn_inputs[0].a, 'a')\n\t\tassert.equal(node.dyn_inputs[0].index, 0)\n\t\tassert.ok(node.dyn_inputs[0].dynamic)\n\t})\n\t\n\tit('adds input slots to given index', function() {\n\t\tvar node = new Node()\n\t\tnode.add_slot(0, { a: '1', dt: E2.dt.FLOAT, name: 'x' })\n\t\tnode.add_slot(0, { a: '2', dt: E2.dt.FLOAT, name: 'x' })\n\t\tnode.add_slot(0, { a: '3', dt: E2.dt.FLOAT, name: 'x' })\n\t\tnode.add_slot(0, { a: '4', index: 1, dt: E2.dt.FLOAT, name: 'x' })\n\t\tassert.equal(node.dyn_inputs[1].a, '4')\n\t})\n\t\n\tit('adds output slots', function() {\n\t\tvar node = new Node()\n\t\tnode.add_slot(1, { a: 'a', dt: E2.dt.FLOAT, name: 'x' })\n\t\tassert.equal(node.dyn_outputs.length, 1)\n\t\tassert.ok(node.dyn_outputs[0].dynamic)\n\t\tassert.equal(node.dyn_outputs[0].a, 'a')\n\t\tassert.equal(node.dyn_outputs[0].index, 0)\n\t})\n\n\tit('finds slots', function() {\n\t\tvar node = new Node()\n\t\tvar suid = node.add_slot(0, { a: 'a', dt: E2.dt.FLOAT, name: 'x' })\n\n\t\tassert.equal(node.find_dynamic_slot(0, suid).uid, suid)\n\t})\n\t\n\tit('finds slots by uid', function() {\n\t\tvar node = new Node()\n\t\tvar suid = node.add_slot(0, { a: 'a', dt: E2.dt.FLOAT, name: 'x' })\n\n\t\tassert.equal(node.findSlotByUid(suid).uid, suid)\n\t})\n\t\n\tit('emits slot addition', function(done) {\n\t\tvar node = new Node()\n\t\tnode.on('slotAdded', function() {\n\t\t\tdone()\n\t\t})\n\t\tnode.add_slot(0, { a: 'a', dt: E2.dt.FLOAT, name: 'x' })\n\t})\n\t\n\tit('emits slot removal', function(done) {\n\t\tvar node = new Node()\n\t\tnode.on('slotRemoved', function() {\n\t\t\tdone()\n\t\t})\n\t\tvar sid = node.add_slot(0, { a: 'a', dt: E2.dt.FLOAT, name: 'x' })\n\t\tnode.remove_slot(0, sid)\n\t})\n\n})\n\n\n\n"
  },
  {
    "path": "browser/test/unit/node_inputs.js",
    "content": "var assert = require('assert');\n\nvar reset = require('./plugins/helpers').reset;\n\nglobal.E2 = {}\nvar Application = require('../../scripts/application')\n\nglobal.EventEmitter = require('../../scripts/event-emitter')\nglobal.Node = require('../../scripts/node').Node\nglobal.EditorChannel = function(){}\nglobal.Graph = require('../../scripts/graph')\nglobal.Flux = require('../../vendor/flux')\nglobal.Plugin = require('../../scripts/plugin');\nglobal.Store = require('../../scripts/stores/store');\nglobal.GraphStore = require('../../scripts/stores/graphStore');\nglobal.PeopleManager = function() {}\nglobal.PeopleStore = function(){}\n\nglobal.NodeUI = function() {\n\tthis.dom = [$()]\n\tthis.dom.position = this.dom[0].position\n\tthis.dom.width = this.dom[0].width\n\tthis.dom.height = this.dom[0].height\n\tthis.dom.find = function() { return { remove: function(){} } }\n\tthis.dom[0].style = {}\n}\n\nglobal.Node.prototype.create_ui = function(){\n\t// this.ui = new global.NodeUI()\n\treturn null\n}\nglobal.Node.prototype.destroy_ui = function(){}\n\nglobal.Registers = function() {\n\tthis.serialise = function(){}\n}\nglobal.PatchManager = function() {}\nrequire('../../scripts/commands/graphEditCommands')\nglobal.UndoManager = require('../../scripts/commands/undoManager.js')\nglobal.GraphApi = require('../../scripts/graphApi.js')\nglobal.Connection = require('../../scripts/connection.js').Connection\nglobal.ConnectionUI = require('../../scripts/connection.js').ConnectionUI\nglobal.ConnectionUI.prototype.resolve_slot_divs = function() {\n\tthis.src_slot_div = $()\n\tthis.dst_slot_div = $()\n}\nglobal.navigator = { userAgent: 'test' }\nglobal.E2.plugins = {}\n\nglobal.E2.util = {}\nglobal.E2.util.isMobile = function() {return false}\n\ndescribe('Node inputs', function() {\n\tvar core, app\n\n\tvar ValidateTestPlugin = function(core) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'Plugin for testing input slot validation'\n\n\t\tthis.min = 5\n\t\tthis.max = 10\n\n\t\tthat = this\n\t\tthis.input_slots = [\n\t\t{\n\t\t\tname: 'clamped input',\n\t\t\tdt: core.datatypes.FLOAT,\n\t\t\tdef: 0,\n\t\t\tvalidate: function(v) {return Math.max(that.min, Math.min(v, that.max))}\n\t\t}]\n\n\t\tthis.output_slots = []\n\t}\n\n\tValidateTestPlugin.prototype = Object.create(Plugin.prototype)\n\n\tValidateTestPlugin.prototype.update_input = function(slot, data) {\n\t\tassert(data >= this.min)\n\t\tassert(data <= this.max)\n\n\t\tPlugin.prototype.update_input.apply(this, arguments)\n\t}\n\n\tvar FloatEmitterPlugin = function(core, node, isArray) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'Test plugin for emitting floats / arrays of floats'\n\n\t\tthis.input_slots = []\n\n\t\tthis.output_slots = [\n\t\t\t{\n\t\t\t\tname: 'output',\n\t\t\t\tdt: core.datatypes.FLOAT\n\t\t\t}\n\t\t]\n\n\t\tif (isArray) {\n\t\t\tthis.output_slots[0].array = true\n\t\t}\n\t}\n\n\tFloatEmitterPlugin.prototype = Object.create(Plugin.prototype)\n\n\tFloatEmitterPlugin.prototype.set_value = function(v) {\n\t\tthis.value = v\n\t\tthis.updated = 1\n\t}\n\n\tFloatEmitterPlugin.prototype.update_output = function(slot, data) {\n\t\treturn this.value\n\t}\n\n\n\tbeforeEach(function() {\n\t\tcore = reset()\n\n\t\tglobal.WebVRConfig = global.WebVRConfig || {}\n\n\t\tglobal.E2.Variables = function() {\n\t\t\tthis.serialise = function(){}\n\t\t}\n\n\t\tcore.active_graph = new Graph(core, null, {})\n\t\tcore.graphs = [ core.active_graph ]\n\t\tcore.rebuild_structure_tree = function(){}\n\n\t\tglobal.window = { location: { pathname: 'test/test' } }\n\n\t\trequire('../../scripts/util')\n\n\t\tE2.commands.graph = require('../../scripts/commands/graphEditCommands')\n\t\tapp = new Application()\n\t\tapp.player = { core: core }\n\t\tapp.channel = { broadcast: function(){}}\n\t\tapp.updateCanvas = function(){}\n\n\t\tglobal.E2.app = app\n\t})\n\n\tit('validates', function() {\n\t\tvar ag = E2.core.active_graph\n\n\t\tvar validateNode = new Node(ag, undefined, 0, 0)\n\t\tvar validatePlugin = new ValidateTestPlugin(E2.core, validateNode)\n\t\tvalidateNode.set_plugin(validatePlugin)\n\t\tvalidatePlugin.reset()\n\n\t\tvar constFloat = new Node(ag, undefined, 0, 0)\n\t\tvar constFloatPlugin = new FloatEmitterPlugin(E2.core, constFloat)\n\t\tconstFloat.set_plugin(constFloatPlugin)\n\t\tconstFloatPlugin.reset()\n\n\t\tvar ss = constFloat.plugin.output_slots[0]\n\t\tvar ds = validateNode.plugin.input_slots[0]\n\n\t\tag.addNode(validateNode)\n\t\tag.addNode(constFloat)\n\n\t\tvar conn = new Connection(constFloat, validateNode, ss, ds, 0)\n\t\tag.connect(conn)\n\t\tconn.patch_up()\n\n\t\tconstFloatPlugin.set_value(0)\n\t\tag.update()\n\n\t\tconstFloatPlugin.set_value(5)\n\t\tag.update()\n\n\t\tconstFloatPlugin.set_value(10)\n\t\tag.update()\n\n\t\tconstFloatPlugin.set_value(15)\n\t\tag.update()\n\t})\n\n\tvar FloatConsumerPlugin = function(core, node, isArray) {\n\t\tPlugin.apply(this, arguments)\n\n\t\tthis.desc = 'Test plugin for consuming floats / arrays of floats'\n\n\t\tthis.input_slots = [\n\t\t\t{\n\t\t\t\tname: 'input',\n\t\t\t\tdt: core.datatypes.FLOAT\n\t\t\t}]\n\n\t\tif (isArray) {\n\t\t\tthis.input_slots[0].array = true\n\t\t}\n\n\t\tthis.output_slots = []\n\t}\n\n\tFloatConsumerPlugin.prototype = Object.create(Plugin.prototype)\n\n\tFloatConsumerPlugin.prototype.get_value = function(v) {\n\t\treturn this.value\n\t}\n\n\tFloatConsumerPlugin.prototype.update_input = function(slot, data) {\n\t\tthis.value = data\n\t}\n\n\tit('handles array inputs and outputs', function() {\n\t\tvar ag = E2.core.active_graph\n\n\t\tvar floatNode = new Node(ag, undefined, 0, 0)\n\t\tvar floatPlugin = new FloatEmitterPlugin(E2.core, floatNode)\n\t\tfloatNode.set_plugin(floatPlugin)\n\t\tfloatPlugin.reset()\n\n\t\tvar floatArrayNode = new Node(ag, undefined, 0, 0)\n\t\tvar floatArrayPlugin = new FloatEmitterPlugin(E2.core, floatArrayNode, true)\n\t\tfloatArrayNode.set_plugin(floatArrayPlugin)\n\t\tfloatArrayPlugin.reset()\n\n\t\tvar floatConsumerNode = new Node(ag, undefined, 0, 0)\n\t\tvar floatConsumerPlugin = new FloatConsumerPlugin(E2.core, floatConsumerNode)\n\t\tfloatConsumerNode.set_plugin(floatConsumerPlugin)\n\t\tfloatConsumerPlugin.reset()\n\n\t\tvar floatArrayConsumerNode = new Node(ag, undefined, 0, 0)\n\t\tvar floatArrayConsumerPlugin = new FloatConsumerPlugin(E2.core, floatArrayConsumerNode, true)\n\t\tfloatArrayConsumerNode.set_plugin(floatArrayConsumerPlugin)\n\t\tfloatArrayConsumerPlugin.reset()\n\n\t\tag.addNode(floatNode)\n\t\tag.addNode(floatConsumerNode)\n\t\tag.addNode(floatArrayNode)\n\t\tag.addNode(floatArrayConsumerNode)\n\n\t\t// round 1 - test arrays to arrays and non-arrays to non-arrays\n\n\t\t// connect float -> float\n\t\tvar ss = floatNode.plugin.output_slots[0]\n\t\tvar ds = floatConsumerNode.plugin.input_slots[0]\n\n\t\tvar ftofconn = new Connection(floatNode, floatConsumerNode, ss, ds, 0)\n\t\tag.connect(ftofconn)\n\t\tftofconn.patch_up()\n\n\t\t// connect float array -> float array\n\t\tss = floatArrayNode.plugin.output_slots[0]\n\t\tds = floatArrayConsumerNode.plugin.input_slots[0]\n\n\t\tvar atoaconn = new Connection(floatArrayNode, floatArrayConsumerNode, ss, ds, 0)\n\t\tag.connect(atoaconn)\n\t\tatoaconn.patch_up()\n\n\t\tfloatPlugin.set_value(128)\n\t\tag.update()\n\t\tassert.equal(floatConsumerPlugin.get_value(), 128)\n\n\t\tfloatPlugin.set_value(64)\n\t\tag.update()\n\t\tassert.equal(floatConsumerPlugin.get_value(), 64)\n\n\t\tfloatArrayPlugin.set_value([1, 7, 4096, 12345, 1, 2])\n\t\tag.update()\n\t\tassert.deepEqual(floatArrayConsumerPlugin.get_value(), [1, 7, 4096, 12345, 1, 2])\n\n\t\tfloatArrayPlugin.set_value([999, 1, 415])\n\t\tag.update()\n\t\tassert.deepEqual(floatArrayConsumerPlugin.get_value(), [999, 1, 415])\n\n\t\tag.disconnect(ftofconn)\n\t\tag.disconnect(atoaconn)\n\n\t\t// round 2 - mix arrays / non-arrays\n\n\t\t// connect float -> array\n\t\tss = floatNode.plugin.output_slots[0]\n\t\tds = floatConsumerNode.plugin.input_slots[0]\n\n\t\tvar ftoaconn = new Connection(floatNode, floatArrayConsumerNode, ss, ds, 0)\n\t\tag.connect(ftoaconn)\n\t\tftoaconn.patch_up()\n\n\t\t// connect float array -> float\n\t\tss = floatArrayNode.plugin.output_slots[0]\n\t\tds = floatConsumerNode.plugin.input_slots[0]\n\n\t\tvar atofconn = new Connection(floatArrayNode, floatConsumerNode, ss, ds, 0)\n\t\tag.connect(atofconn)\n\t\tatofconn.patch_up()\n\n\t\tfloatPlugin.set_value(250)\n\t\tag.update()\n\t\tassert.deepEqual(floatArrayConsumerPlugin.get_value(), [250])\n\n\t\tfloatPlugin.set_value(550)\n\t\tag.update()\n\t\tassert.deepEqual(floatArrayConsumerPlugin.get_value(), [550])\n\n\t\tfloatArrayPlugin.set_value([10, 20, 30, 40])\n\t\tag.update()\n\t\tassert.equal(floatConsumerPlugin.get_value(), 10)\n\n\t\tfloatArrayPlugin.set_value([40, 50, 60, 70])\n\t\tag.update()\n\t\tassert.equal(floatConsumerPlugin.get_value(), 40)\n\t})\n\n})\n\n"
  },
  {
    "path": "browser/test/unit/pageStore.js",
    "content": "var assert = require('assert');\nvar when = require('when')\n\nglobal._ = require('lodash')\nglobal.VizorUI = require('../../scripts/ui/pageStore')\nglobal.EventEmitter = require('events').EventEmitter\nglobal.CustomEvent = function(name, opts) {\n\tthis.name = name\n\tthis.detail = opts.detail\n}\nglobal.document = new EventEmitter()\nglobal.document.dispatchEvent = function(e) {\n\tthis.emit.call(this, e.name, e)\n}\nglobal.uniq = new Date().getTime()\n\n\n// note: refer to store limitations\n\n\ndescribe('pageStore', function() {\n\n\tvar creatorId = '1234abcd'\n\tvar profile = {\n\t\t// must work without id\n\t\tname: 'somename'\n\t}\n\tvar graphWithProfile = {\n\t\t_creator: creatorId,\n\t\t_id : 'someid',\n\t\tpath: '/some/path',\n\t\tprofile: profile\n\t}\n\tvar graphWithoutProfile = {\n\t\t_creator: creatorId,\n\t\t_id: 'someotherid',\n\t\tpath: '/some/otherpath'\n\t\t// no profile\n\t}\n\n\tbeforeEach(function() {\n\t\tdocument.removeAllListeners()\n\t})\n\n\n\tit('emits event when a property changes', function(done) {\n\n\t\tvar emitted = false\n\t\tvar testData = {\n\t\t\tkey1: 'value1',\n\t\t\tkey2: 'value2'\n\t\t}\n\t\tdocument.on('changed:test', function(e){\n\t\t\tassert.equal(e.detail.id, uniq, 'uniq matches')\n\t\t\tassert.equal(e.detail.key, 'key1', 'key matches')\n\t\t\tassert.equal(e.detail.value, 'changed!', 'value matches')\n\t\t\temitted = true\n\t\t})\n\t\tvar s = VizorUI.makeStore(testData, 'test', uniq)\n\t\ts.key1 = 'changed!'\n\n\t\tassert.equal(emitted, true, 'expected event emitted')\n\t\tdone()\n\t})\n\n\tit('emits event when a deep property changes', function(done) {\n\n\t\tuniq++\n\t\tvar emitted = false\n\t\tvar testData = {\n\t\t\tkey1: 'value1',\n\t\t\tkey2: {\n\t\t\t\t'a': 4,\n\t\t\t\t'b': 5\n\t\t\t}\n\t\t}\n\t\tdocument.once('changed:test', function(e){\n\t\t\tassert.equal(e.detail.id, uniq, 'uniq matches')\n\t\t\tif (e.detail.key === 'key2.b') {\n\t\t\t\tassert.equal(e.detail.value, 6, 'value matches')\n\t\t\t\temitted = true\n\t\t\t}\n\t\t})\n\t\tvar s = VizorUI.makeStore(testData, 'test', uniq)\n\t\t++s.key2.b\n\n\t\tassert.equal(emitted, true, 'expected event emitted')\n\t\tdone()\n\n\t})\n\n\tit('converts a new object property to sub-store', function(done) {\n\t\tuniq++\n\t\tvar emits = false\n\t\tvar testData = {\n\t\t\tkey1: 'value1',\n\t\t\tkey2: {\n\t\t\t\t'a': 4,\n\t\t\t\t'b': 5\n\t\t\t}\n\t\t}\n\n\t\tvar s = VizorUI.makeStore(testData, 'test', uniq)\n\t\ts.key2 = {'c':1, 'd':2, 'e':3, f:{g:10, e:11}}\n\t\tassert.equal('c' in s.key2, true, 'new value set')\n\n\t\tdocument.once('changed:test', function(e){\n\t\t\tassert.equal(e.detail.id, uniq, 'uniq matches')\n\t\t\tassert.equal(e.detail.key, 'key2.f.g', 'key matches')\n\t\t\tassert.equal(e.detail.value, 11, 'new value is set')\n\t\t\temits = true\n\t\t})\n\n\t\t++s.key2.f.g\n\n\t\tassert.equal(emits, true, 's.key2 continues to emit')\n\t\tdone()\n\t})\n\n\tit('makes a pagestore from Vizor.pageObjects', function(done){\n\t\tuniq++\n\t\tglobal.Vizor = {\n\t\t\tpageObjects: {\n\t\t\t\tgraphs: [],\n\t\t\t\tprofiles: [],\n\t\t\t\tunknownFlatKey : 'string',\n\t\t\t\tunknownObj : {}\n\t\t\t}\n\t\t}\n\t\tvar po = global.Vizor.pageObjects\n\n\t\tassert.equal(po.graphs.__store__, undefined, 'graphs.__store__ is undefined before making store')\n\t\tVizorUI.pageStore()\n\t\tpo = global.Vizor.pageObjects\n\n\t\tassert.equal(po.graphs.__store__, true, '.graphs has been made a store')\n\t\tassert.equal(po.profiles.__store__, true, '.profiles has been made a store')\n\t\tassert.equal(po.unknownObj.__store__, true, '.unknownObj has been made a store')\n\t\tassert.equal(po.unknownFlatKey.__store__, undefined, 'unknownFlatKey is not turned into a substore')\n\n\t\tdone();\n\t})\n\n\tit('adds a graph', function(done) {\n\t\tVizor.pageObjects = {}\n\t\tVizorUI.pageStore()     // makes Vizor.pageObjects into a new store\n\t\tvar page = Vizor.pageObjects\n\t\tvar graph = graphWithoutProfile\n\t\tpage.addGraph(graph)\n\n\t\tassert.equal((graph._id in page.graphs), true, 'could not find graphs[id]')\n\t\tassert.equal(page.graphs[graph._id].path, graph.path, 'not the same data?')\n\t\tdone()\n\t})\n\n\n\tit('adds a profile from graph', function(done) {\n\t\tVizor.pageObjects = {}\n\t\tVizorUI.pageStore()\n\t\tvar page = Vizor.pageObjects\n\t\tvar graph = graphWithProfile\n\t\tpage.addGraph(graph)\n\n\t\tassert.equal((graph._creator in page.profiles), true, 'could not find profiles[graph._creator]')\n\t\tassert.equal(page.profiles[creatorId].name, profile.name, 'not the same data?')\n\t\tdone()\n\t})\n\n\n\tit('would keep a known creator profile if graph supplied no profile', function(done) {\n\t\tVizor.pageObjects = {}\n\t\tVizorUI.pageStore()\n\t\tvar page = Vizor.pageObjects\n\n\t\tpage.addGraph(graphWithProfile)\n\n\t\tpage.addGraph(graphWithoutProfile)\n\t\tassert.equal(page.profiles[creatorId].name, profile.name, 'profile should not have changed')\n\n\t\tdone()\n\t})\n\n})\n"
  },
  {
    "path": "browser/test/unit/peopleStore.js",
    "content": "global.EventEmitter = require('events').EventEmitter\nglobal.sinon = require('sinon')\nglobal.document = { addEventListener: function() {} }\n\nvar dispatchListener\n\nglobal.E2 = {\n\tcore: {\n\t\troot_graph: { uid: 'root_graph' },\n\t\tactive_graph: { uid: 'root_graph' }\n\t},\n\tapp: {\n\t\tchannel: new EventEmitter(),\n\t\tdispatcher: {\n\t\t\tregister: function(cb) {\n\t\t\t\tdispatchListener = cb\n\t\t\t}\n\t\t},\n\t\tscrollOffset: [0, 0]\n\t},\n\tdom: {\n\t\tcanvases: [{\n\t\t\toffsetLeft: 32,\n\t\t\toffsetTop: 32\n\t\t}]\n\t}\n}\n\nE2.app.channel.setMaxListeners(0)\n\nvar assert = require('assert')\nvar PeopleStore = require('../../scripts/stores/peopleStore')\n\ndescribe('PeopleStore', function() {\n\tvar ps\n\n\tbeforeEach(function() {\n\t\tE2.app.channel.uid = 'me'\n\t\tps = new PeopleStore()\n\t\tps.initialize()\n\t})\n\n\tit('handles join', function() {\n\t\tE2.app.channel.emit('join', {\n\t\t\tid: 'jep',\n\t\t\tcolor: 'color',\n\t\t\tactiveGraphUid: 'woo'\n\t\t})\n\n\t\tassert.equal(ps.people.jep.color, 'color')\n\t\tassert.equal(ps.people.jep.activeGraphUid, 'woo')\n\t\tassert.equal(ps.list().length, 2)\n\t})\n\n\tit('handles leave', function() {\n\t\tE2.app.channel.emit('join', { id: 'jeh' })\n\t\tassert.equal(ps.list().length, 2)\n\t\tE2.app.channel.emit('leave', { id: 'jeh' })\n\t\tassert.equal(ps.list().length, 1)\n\t})\n\n\tit('leave by the user should empty people on the channel, except self', function() {\n\t\tE2.app.channel.uid = 'foo'\n\t\tE2.app.channel.emit('join', { id: 'bar'})\n\t\tE2.app.channel.emit('join', { id: 'baz'})\n\t\tE2.app.channel.emit('join', { id: 'foo'})\n\t\tE2.app.channel.emit('leave', { id: 'foo' })\n\t\tassert.equal(ps.list().length, 1)\n\t})\n\n\tit('emptying should emit removes for all people', function(done) {\n\t\tvar i = 0\n\t\tE2.app.channel.uid = 'foo'\n\t\tE2.app.channel.emit('join', { id: 'foo'})\n\t\tE2.app.channel.emit('join', { id: 'bar'})\n\t\tE2.app.channel.emit('join', { id: 'baz'})\n\t\tps.on('removed', function() {\n\t\t\tif (++i===3)\n\t\t\t\tdone()\n\t\t})\n\t\tE2.app.channel.emit('leave', { id: 'foo' })\n\t})\n\n\tit('empties on disconnect, except self', function() {\n\t\tE2.app.channel.emit('join', { id: 'foo'})\n\t\tE2.app.channel.emit('join', { id: 'bar'})\n\t\tE2.app.channel.emit('disconnected')\n\t\tassert.equal(ps.list().length, 1)\n\t})\n\n\tit('can list people', function() {\n\t\tE2.app.channel.emit('join', { id: 'foo'})\n\t\tE2.app.channel.emit('join', { id: 'bar'})\n\t\tassert.equal(ps.list()[1].uid, 'foo')\n\t\tassert.equal(ps.list()[2].uid, 'bar')\n\t})\n\n\tit('can find people', function() {\n\t\tE2.app.channel.emit('join', { id: 'foo'})\n\t\tassert.equal(ps.findByUid('foo').uid, 'foo')\n\t})\n\n\tit('dispatches on mousemove when over the canvas', function(done) {\n\t\tglobal.E2.app.dispatcher.dispatch = function(pl) {\n\t\t\tassert.equal(pl.actionType, 'uiMouseMoved')\n\t\t\tassert.equal(pl.x, 32)\n\t\t\tassert.equal(pl.y, 32)\n\t\t\tdone()\n\t\t}\n\n\t\tps._mouseMoveHandler.call(ps, { pageX: 64, pageY: 64 })\n\t})\n\n\tit('does not dispatch on mousemove when not over the canvas', function(done) {\n\n\t\tglobal.E2.app.dispatcher.dispatch = function(pl) {\n\t\t\tif (pl.actionType === 'uiMouseMoved')\n\t\t\t\tdone(new Error('uiMouseMoved received'))\t\t\t\n\t\t}\n\n\t\tps._mouseMoveHandler.call(ps, { pageX: 16, pageY: 16 })\n\t\tdone()\n\n\t})\n\n\tit('updates lastSeen when joined', function() {\n\n\t\tE2.app.channel.emit('join', { id: 'foo'})\n\t\tassert.ok(ps.findByUid('foo').lastSeen > 1000)\n\n\t})\n\n\tit('updates lastSeen when user moves their mouse', function() {\n\n\t\tvar lastSeenWhenJoined\n\t\tvar lastSeenAfterMousemove\n\n\t\tE2.app.channel.emit('join', { id: 'antero'})\n\t\tlastSeenWhenJoined = ps.findByUid('antero').lastSeen\n\n\t\tvar clock = sinon.useFakeTimers(lastSeenWhenJoined + 100);\n\n\t\tdispatchListener({\n\t\t\tfrom: 'antero',\n\t\t\tactionType: 'uiMouseMoved',\n\t\t\tx: 64,\n\t\t\ty: 64\n\t\t})\n\n\t\tlastSeenAfterMousemove = ps.findByUid('antero').lastSeen\n\t\tassert.notEqual(lastSeenWhenJoined, lastSeenAfterMousemove)\n\n\t\tclock.restore()\n\n\t})\n\n\tit('updates lastSeen when user clicks', function() {\n\n\t\tvar lastSeenWhenJoined\n\t\tvar lastSeenAfterClick\n\n\t\tE2.app.channel.emit('join', { id: 'antero'})\n\t\tlastSeenWhenJoined = ps.findByUid('antero').lastSeen\n\n\t\tvar clock = sinon.useFakeTimers(lastSeenWhenJoined + 100);\n\n\t\tdispatchListener({\n\t\t\tfrom: 'antero',\n\t\t\tactionType: 'uiMouseClicked'\n\t\t})\n\n\t\tlastSeenAfterClick = ps.findByUid('antero').lastSeen\n\t\tassert.notEqual(lastSeenWhenJoined, lastSeenAfterClick)\n\n\t\tclock.restore()\n\n\t})\n\n\tit('changes active graph on uiActiveGraphChanged', function() {\n\t\tE2.app.channel.emit('join', { id: 'foo'})\n\n\t\tdispatchListener({\n\t\t\tfrom: 'foo',\n\t\t\tactionType: 'uiActiveGraphChanged',\n\t\t\tactiveGraphUid: 'abc'\n\t\t})\n\n\t\tassert.equal(ps.people.foo.activeGraphUid, 'abc')\n\t})\n\n\tit('changes follower`s active graph on uiActiveGraphChanged', function() {\n\t\tE2.app.channel.emit('join', { id: 'foo' })\n\t\tps.me.followUid = 'foo'\n\n\t\tdispatchListener({\n\t\t\tfrom: 'foo',\n\t\t\tactionType: 'uiActiveGraphChanged',\n\t\t\tactiveGraphUid: 'abc'\n\t\t})\n\n\t\tassert.equal(ps.people.foo.activeGraphUid, 'abc')\n\t\tassert.equal(ps.me.activeGraphUid, 'abc')\n\t})\n\n\tit('changes my active graph from a follow', function(done) {\n\t\tE2.app.channel.emit('join', { id: 'foo'})\n\t\tps.me.activeGraphUid = 'nope'\n\t\tps.me.followUid = 'foo'\n\n\t\tps.on('activeGraphChanged', function(p) {\n\t\t\tif (p.uid !== 'me')\n\t\t\t\treturn;\n\n\t\t\tif (p.activeGraphUid === 'abc')\n\t\t\t\tdone()\n\t\t})\n\n\t\tdispatchListener({\n\t\t\tfrom: 'foo',\n\t\t\tactionType: 'uiActiveGraphChanged',\n\t\t\tactiveGraphUid: 'abc'\n\t\t})\n\n\t})\n\n\tit('marks followee as followed', function() {\n\t\tE2.app.channel.emit('join', { id: 'foo', activeGraphUid: 'g' })\n\n\t\tdispatchListener({\n\t\t\tfrom: 'me',\n\t\t\tactionType: 'uiUserIdFollowed',\n\t\t\tfollowUid: 'foo'\n\t\t})\n\n\t\tassert.equal(ps.me.activeGraphUid, 'g')\n\t\tassert.equal(ps.me.followUid, 'foo')\n\t\tassert.equal(ps.findByUid('foo').followers, 1)\n\t})\n\n\n\tit('clears followee on follower leave', function() {\n\t\tE2.app.channel.emit('join', { id: 'foo' })\n\t\tps.people.foo.followUid = 'me'\n\t\tps.me.followers = 5\n\n\t\tE2.app.channel.emit('leave', { id: 'foo' })\n\n\t\tassert.equal(ps.me.followers, 4)\n\t})\n\n})\n"
  },
  {
    "path": "browser/test/unit/playerUI.js",
    "content": "var when = require('when')\nvar assert = require('assert')\nvar EventEmitter = require('events').EventEmitter\n\ndescribe('PlayerUI', function() {\n\tvar PlayerUI\n\n\tfunction makePlayerUi() {\n\t\tvar pui = new VizorPlayerUI()\n\t\tpui.headerFadeIn = function() {}\n\t\tpui.headerFadeOut = function() {}\n\t\tpui.$wrap = [{\n\t\t\tstyle: {},\n\t\t}]\n\t\tpui.$wrap.attr = function() {}\n\t\tpui.$body = {\n\t\t\ttoggleClass: function() { return pui.$body },\n\t\t\taddClass: function() { return pui.$body },\n\t\t\tremoveClass: function() { return pui.$body },\n\t\t}\n\t\treturn pui\n\t}\n\n\tbeforeEach(function() {\n\t\tglobal.E2 = {\n\t\t\ttrack: function() {},\n\t\t\tcore: {\n\t\t\t\twebVRAdapter: {\n\t\t\t\t\tresizeToTarget: function() {}\n\t\t\t\t}\n\t\t\t},\n\t\t\tuid: function() { return dateNow },\n\t\t\tutil: {\n\t\t\t\tisBrowser: {\n\t\t\t\t\tCarmel: function() { return false }\n\t\t\t\t}\n\t\t\t},\n\t\t\tapp: {\n\t\t\t\tplayer: {\n\t\t\t\t\tstate: {\n\t\t\t\t\t\tSTOPPED: 0,\n\t\t\t\t\t\tLOADING: 1,\n\t\t\t\t\t\tREADY: 2,\n\t\t\t\t\t\tPAUSED: 3,\n\t\t\t\t\t\tPLAYING: 4\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tglobal.Vizor = {}\n\t\tglobal.window = global\n\t\tglobal.siteUI = { isInIframe: function() {} }\n\t\tglobal.$ = function() {\n\t\t\tvar ee = new EventEmitter()\n\t\t\tee.addClass = function() {}\n\t\t\tee.removeClass = function() {}\n\t\t\tee.find = function() {\n\t\t\t\treturn ee\n\t\t\t}\n\t\t\treturn ee\n\t\t}\n\t\tglobal.document = {\n\t\t\tquerySelector : function(){}\n\t\t}\n\t\tVizorPlayerUI = require('../../scripts/ui/playerUI')\n\t})\n\n\tit('switches stage from player state', function() {\n\t\tglobal.Vizor.autoplay = false\n\t\tvar pui = makePlayerUi()\n\t\tpui.onPlayerStateChanged(0) // STOPPED\n\t\tassert.equal(pui.stage, 'readyStage')\n\t\tpui.onPlayerStateChanged(1) // LOADING\n\t\tassert.equal(pui.stage, 'loadingStage')\n\t\tpui.onPlayerStateChanged(2) // READY\n\t\tassert.equal(pui.stage, 'readyStage')\n\t\tpui.onPlayerStateChanged(3) // PAUSED\n\t\tassert.equal(pui.stage, 'readyStage')\n\t\tpui.onPlayerStateChanged(4) // PLAYING\n\t\tassert.equal(pui.stage, 'playingStage')\n\t})\n\n\tit('plays the graph on play button click in readyStage', function(done) {\n\t\tE2.app.player.play = done\n\t\tvar pui = makePlayerUi()\n\t\tpui.stage = 'readyStage'\n\t\tpui.onPlayButtonClicked()\n\t})\n\n\tit('loads the graph on play button click in beforeLoadingStage', function(done) {\n\t\tglobal.playVizorFile = function() {\n\t\t\tdone()\n\t\t\treturn when.resolve()\n\t\t}\n\t\tvar pui = makePlayerUi()\n\t\tpui.stage = 'beforeLoadingStage'\n\t\tpui.onPlayButtonClicked()\n\t})\n\n})\n\n"
  },
  {
    "path": "browser/test/unit/plugins/array_function.js",
    "content": "var assert = require('assert')\n\nvar slot = require('./helpers').slot\nvar reset = require('./helpers').reset\nvar loadPlugin = require('./helpers').loadPlugin\n\ndescribe('array_function', function() {\n\tvar plugin, core\n\n\tbeforeEach(function() {\n\t\tcore = reset()\n\t\tloadPlugin('array_function')\n\t\tplugin = new E2.plugins.array_function(core)\n\t\tplugin.graph = {\n\t\t\tcopies: [],\n\t\t\treset: function() {},\n\t\t\tupdate: function() {},\n\t\t\tclearCopies: function() {},\n\t\t\tmakeCopy: function(i) {\n\t\t\t\ti = i || this.copies.length\n\t\t\t\tthis.copies[i] = this\n\t\t\t\treturn this\n\t\t\t},\n\t\t\tvariables: {\n\t\t\t\tread: function() {},\n\t\t\t\twrite: function() {},\n\t\t\t\tset_datatype: function() {}\n\t\t\t}\n\t\t}\n\t})\n\n\tit('uses length input', function() {\n\t\tplugin.update_input({ name: 'length' }, 3.34)\n\t\tassert.equal(plugin.length, 3)\n\t})\n\n\tit('calls graph update', function() {\n\t\tvar updates = 0\n\t\tplugin.update_input({ name: 'length' }, 3)\n\t\tplugin.graph.update = function() { updates++ }\n\t\tplugin.update_state({abs_t:0, delta_t:(1/60)})\n\t\tassert.equal(updates, 3)\n\t})\n\n\tit('creates copies of graph', function() {\n\t\tplugin.update_input({ name: 'length' }, 3)\n\t\tassert.equal(plugin.graph.copies.length, 3)\n\t})\n\n\tit('sets loop index', function(done) {\n\t\tplugin.graph.variables.write = function(k, v) {\n\t\t\tassert.equal('index', k)\n\t\t\tassert.equal(1, v)\n\t\t\tdone()\n\t\t}\n\t\tplugin.update_input({ name: 'length' }, 1)\n\t\tplugin.update_state({abs_t:0, delta_t:(1/60)})\n\t})\n\n\tit('uses loop output', function() {\n\t\tplugin.update_input({ name: 'length' }, 1)\n\t\tplugin.graph.variables.read = function() {\n\t\t\treturn 'foo'\n\t\t}\n\t\tplugin.update_state({abs_t:0, delta_t:(1/60)})\n\t\tassert.equal(plugin.array[0], 'foo')\n\t})\n\n\tit('sets dt on item variable change', function() {\n\t\tplugin.output_slots = [ {} ]\n\t\tplugin.variable_dt_changed('foo')\n\t\tassert.equal(plugin.output_slots[0].dt, 'foo')\n\t})\n\n})\n\n"
  },
  {
    "path": "browser/test/unit/plugins/array_get.js",
    "content": "var assert = require('assert')\n\nglobal.EventEmitter = require('events').EventEmitter\nglobal.LinkedSlotGroup = require('../../../scripts/node').LinkedSlotGroup\n\nvar slot = require('./helpers').slot\nvar reset = require('./helpers').reset\nvar loadPlugin = require('./helpers').loadPlugin\n\ndescribe('array_get', function() {\n\tvar plugin, core\n\n\tbeforeEach(function() {\n\t\tcore = reset()\n\t\tnode = new EventEmitter()\n\t\tloadPlugin('array_get')\n\t\tplugin = new E2.plugins.array_get(core, node)\n\t})\n\n\tit('returns the right item', function() {\n\t\tplugin.update_input(slot(0), ['a','b','c','d'])\n\t\tplugin.update_input(slot(1), 2)\n\t\tassert.equal(plugin.update_output(), 'c')\n\t})\n\n})\n\n"
  },
  {
    "path": "browser/test/unit/plugins/array_remove.js",
    "content": "var assert = require('assert')\n\nglobal.EventEmitter = require('events').EventEmitter\nglobal.LinkedSlotGroup = require('../../../scripts/node').LinkedSlotGroup\n\nvar slot = require('./helpers').slot\nvar reset = require('./helpers').reset\nvar loadPlugin = require('./helpers').loadPlugin\n\ndescribe('array_remove', function() {\n\tvar plugin, core\n\n\tbeforeEach(function() {\n\t\tcore = reset()\n\t\tnode = new EventEmitter()\n\t\tloadPlugin('array_remove')\n\t\tplugin = new E2.plugins.array_remove(core, node)\n\t})\n\n\tit('deletes the right item', function() {\n\t\tplugin.update_input(slot(0), ['a','b','c','d'])\n\t\tplugin.update_input(slot(1), 2)\n\t\tassert.deepEqual(plugin.update_output(), ['a','b','d'])\n\t})\n\n})\n\n"
  },
  {
    "path": "browser/test/unit/plugins/array_set.js",
    "content": "var assert = require('assert')\n\nglobal.EventEmitter = require('events').EventEmitter\nglobal.LinkedSlotGroup = require('../../../scripts/node').LinkedSlotGroup\n\nvar slot = require('./helpers').slot\nvar reset = require('./helpers').reset\nvar loadPlugin = require('./helpers').loadPlugin\n\ndescribe('array_set', function() {\n\tvar plugin, core\n\n\tbeforeEach(function() {\n\t\tcore = reset()\n\t\tnode = new EventEmitter()\n\t\tloadPlugin('array_set')\n\t\tplugin = new E2.plugins.array_set(core, node)\n\t})\n\n\tit('declares the right slots', function() {\n\t\tassert.ok(plugin.input_slots.length, 3)\n\t\tassert.ok(plugin.output_slots.length, 1)\n\t})\n\n\tit('composes new arrays', function() {\n\t\tplugin.update_input(slot(1), 0)\n\t\tplugin.update_input(slot(2), 'bar')\n\t\tassert.deepEqual(plugin.update_output(), [ 'bar' ])\n\t})\n\n\tit('calls LSG on connection change', function(done) {\n\t\tplugin.lsg.connection_changed = function() {\n\t\t\tdone()\n\t\t}\n\t\tplugin.connection_changed(true, {}, {})\n\t})\n\n\tit('adds to existing array', function() {\n\t\tplugin.update_input({ name: 'array' }, [ 'foo' ])\n\t\tplugin.update_input({ name: 'index' }, 1)\n\t\tplugin.update_input({ name: 'item' }, 'bar')\n\n\t\tassert.deepEqual(plugin.update_output(), ['foo','bar'])\n\t})\n\n\tit('adds to existing array 2', function() {\n\t\tplugin.update_input({ name: 'array' }, [ 'foo' ])\n\t\tplugin.update_input({ name: 'index' }, 1)\n\t\tplugin.update_input({ name: 'item' }, 'bar')\n\n\t\tplugin.update_input({ name: 'array' }, plugin.update_output().slice())\n\t\tplugin.update_input({ name: 'index' }, 2)\n\t\tplugin.update_input({ name: 'item' }, 'baz')\n\n\t\tassert.deepEqual(plugin.update_output(), ['foo','bar','baz'])\n\t})\n\n})\n\n"
  },
  {
    "path": "browser/test/unit/plugins/array_switch_modulator.js",
    "content": "var assert = require('assert')\n\nvar reset = require('./helpers').reset\nvar loadPlugin = require('./helpers').loadPlugin\n\ndescribe('array_switch_modulator', function() {\n\tvar plugin, core\n\n\tbeforeEach(function() {\n\t\tcore = reset()\n\t\tloadPlugin('array_switch_modulator')\n\t\tvar node = new Node()\n\t\tplugin = new E2.plugins.array_switch_modulator(core, node)\n\t\tplugin.state_changed()\n\n\t\tnode.add_slot(E2.slot_type.input, {\n\t\t\ttype: E2.slot_type.input,\n\t\t\tname: '0',\n\t\t\tdt: plugin.lsg.dt\n\t\t})\n\n\t\tnode.add_slot(E2.slot_type.input, {\n\t\t\ttype: E2.slot_type.input,\n\t\t\tname: '1',\n\t\t\tdt: plugin.lsg.dt\n\t\t})\n\n\t\tnode.add_slot(E2.slot_type.input, {\n\t\t\ttype: E2.slot_type.input,\n\t\t\tname: '1',\n\t\t\tdt: plugin.lsg.dt\n\t\t})\n\t})\n\n\tit('uses the correct input count', function() {\n\t\tplugin.update_state({abs_t:0, delta_t:(1/60)})\n\t\tvar output = plugin.update_output({index: 1})\n\t\tassert.equal(output, 3)\n\n\t\tplugin.update_input({ index: 0, uid: 1 }, 10)\n\t\tplugin.update_input({ index: 1, uid: 2 }, 20)\n\n\t\tplugin.update_state({abs_t:0, delta_t:(1/60)})\n\t\toutput = plugin.update_output({index: 1})\n\t\tassert.equal(output, 3)\n\t})\n\n\tit('defaults to input 0', function() {\n\t\tplugin.update_input({index: 0, uid: 1}, 100)\n\t\tplugin.update_input({index: 1, uid: 2}, 200)\n\n\t\tplugin.update_state({abs_t:0, delta_t:(1/60)})\n\n\t\tvar output = plugin.update_output({index: 0})\n\t\tassert.equal(output, 100)\n\t})\n\n\tit('gives a null default value', function() {\n\t\tplugin.update_state({abs_t:0, delta_t:(1/60)})\n\n\t\tvar output = plugin.update_output({index: 0})\n\t\tassert.equal(output, null)\n\n\t\tplugin.update_input({index: 0, uid: 1}, 100)\n\t\tplugin.update_state({abs_t:0, delta_t:(1/60)})\n\t\tvar output = plugin.update_output({index: 0})\n\t\tassert.equal(output, 100)\n\n\t\tplugin.update_input({index: 0, uid: 1}, null)\n\t\tplugin.update_state({abs_t:0, delta_t:(1/60)})\n\t\tvar output = plugin.update_output({index: 0})\n\t\tassert.equal(output, null)\n\t})\n\n\tit('selects the correct input', function() {\n\t\tplugin.update_input({index: 0, uid: 1}, 10)\n\t\tplugin.update_input({index: 1, uid: 2}, 20)\n\t\tplugin.update_input({index: 2, uid: 3}, 30)\n\n\t\t// select input 1\n\t\tplugin.update_input({index: 0}, 1)\n\n\t\tplugin.update_state({abs_t:0, delta_t:(1/60)})\n\n\t\tvar output = plugin.update_output({index: 0})\n\t\tassert.equal(output, 20)\n\n\t\t// select input 0\n\t\tplugin.update_input({index: 0}, 0)\n\n\t\tplugin.update_state({abs_t:0, delta_t:(1/60)})\n\n\t\toutput = plugin.update_output({index: 0})\n\t\tassert.equal(output, 10)\n\n\t\t// select input 2\n\t\tplugin.update_input({index: 0}, 2)\n\n\t\tplugin.update_state({abs_t:0, delta_t:(1/60)})\n\n\t\toutput = plugin.update_output({index: 0})\n\t\tassert.equal(output, 30)\n\n\t})\n\n\tit ('updates inputs', function() {\n\t\tvar output\n\n\t\t// set initial values\n\t\tplugin.update_input({index: 0, uid: 1}, 10)\n\t\tplugin.update_input({index: 1, uid: 2}, 20)\n\t\tplugin.update_input({index: 2, uid: 3}, 30)\n\n\t\t// check all inputs for their initial values\n\t\tplugin.update_input({index: 0}, 0)\n\t\tplugin.update_state({abs_t:0, delta_t:(1/60)})\n\t\toutput = plugin.update_output({index: 0})\n\t\tassert.equal(output, 10)\n\n\t\tplugin.update_input({index: 0}, 1)\n\t\tplugin.update_state({abs_t:0, delta_t:(1/60)})\n\t\toutput = plugin.update_output({index: 0})\n\t\tassert.equal(output, 20)\n\n\t\tplugin.update_input({index: 0}, 2)\n\t\tplugin.update_state({abs_t:0, delta_t:(1/60)})\n\t\toutput = plugin.update_output({index: 0})\n\t\tassert.equal(output, 30)\n\n\t\t// reset all inputs\n\t\tplugin.update_input({index: 0, uid: 1}, 40)\n\t\tplugin.update_input({index: 1, uid: 2}, 50)\n\t\tplugin.update_input({index: 2, uid: 3}, 60)\n\n\t\t// check all inputs for their new values\n\t\tplugin.update_input({index: 0}, 0)\n\t\tplugin.update_state({abs_t:0, delta_t:(1/60)})\n\t\toutput = plugin.update_output({index: 0})\n\t\tassert.equal(output, 40)\n\n\t\tplugin.update_input({index: 0}, 1)\n\t\tplugin.update_state({abs_t:0, delta_t:(1/60)})\n\t\toutput = plugin.update_output({index: 0})\n\t\tassert.equal(output, 50)\n\n\t\tplugin.update_input({index: 0}, 2)\n\t\tplugin.update_state({abs_t:0, delta_t:(1/60)})\n\t\toutput = plugin.update_output({index: 0})\n\t\tassert.equal(output, 60)\n\t})\n})\n"
  },
  {
    "path": "browser/test/unit/plugins/helpers.js",
    "content": "var fs = require('fs');\nvar vm = require('vm');\nvar browserPath = __dirname+'/../../../';\nvar EventEmitter = require('events').EventEmitter\n\nvar when = require('when')\n\nvar _ = require('lodash')\n\nglobal.clone = _.cloneDeep.bind(_)\n\nglobal.Plugin = require(browserPath+'scripts/plugin.js')\nglobal.SubGraphPlugin = require(browserPath+'scripts/subGraphPlugin.js')\n\nglobal.EventEmitter = require('events').EventEmitter\nglobal.Node = require(browserPath+'scripts/node.js').Node\nglobal.LinkedSlotGroup = require(browserPath+'scripts/node.js').LinkedSlotGroup\n\nexports.slot = function slot(index, type, dt) {\n\treturn {\n\t\tindex: index,\n\t\ttype: type,\n\t\tdt: dt\n\t};\n}\n\nexports.mockE2Classes = function() {\n\tglobal.AssetLoader = function AssetLoader() {\n\t\tEventEmitter.call(this)\n\t\tthis.defaultTexture = {}\n\t\tthis.loadingTexture = {}\n\t}\n\tglobal.AssetLoader.prototype = Object.create(EventEmitter.prototype)\n\n\tglobal.E2.GraphAnalyser = function() {}\n\tglobal.E2.GraphAnalyser.prototype.analyseGraph = function(){\n\t\treturn when.resolve({ size: 0, numAssets: 0 })\n\t}\n\n\tglobal.E2.GridFsClient = function() {}\n}\n\nexports.reset = function() {\n\tif (typeof(global.E2) === 'undefined')\n\t\tglobal.E2 = {}\n\n\tE2 = global.E2\n\n\tE2.slot_type = { input: 0, output: 1 }\n\t\n\tE2.GRAPH_NODES = ['graph', 'loop', 'array_function'];\n\n\tE2.dt = {\n\t\tFLOAT: { id: 0, name: 'Float' },\n\t\tSHADER: { id: 1, name: 'Shader' },\n\t\tTEXTURE: { id: 2, name: 'Texture' },\n\t\tCOLOR: { id: 3, name: 'Color' },\n\t\tMATRIX: { id: 4, name: 'Matrix' },\n\t\tVECTOR: { id: 5, name: 'Vector' },\n\t\tCAMERA: { id: 6, name: 'Camera' },\n\t\tBOOL: { id: 7, name: 'Boolean' },\n\t\tANY: { id: 8, name: 'Arbitrary' },\n\t\tMESH: { id: 9, name: 'Mesh' },\n\t\tAUDIO: { id: 10, name: 'Audio' },\n\t\tSCENE: { id: 11, name: 'Scene' },\n\t\tMATERIAL: { id: 12, name: 'Material' },\n\t\tLIGHT: { id: 13, name: 'Light' },\n\t\tDELEGATE: { id: 14, name: 'Delegate' },\n\t\tTEXT: { id: 15, name: 'Text' },\n\t\tVIDEO: { id: 16, name: 'Video' },\n\t\tARRAY: { id: 17, name: 'Array' },\n\t\tOBJECT: { id: 18, name: 'Object' }\n\t};\n\n\tE2.plugins = {}\n\n\tif (!global.E2.app)\n\t\tglobal.E2.app = {}\n\n\texports.mockE2Classes()\n\n\tglobal.E2.app.getSlotPosition = function() {}\n\tglobal.E2.app.channel = {\n\t\tbroadcast: function(){}\n\t}\n\n\tglobal.msg = function() {\n\t\tconsole.log.apply(console, arguments)\n\t}\n\n\tfunction leftTop(){ return { left: 0, top: 0 }}\n\n\tglobal.mat4 = {\n\t\tcreate: function() {},\n\t\tidentity: function(){}\n\t}\n\n\tglobal.$ = function() { return {\n\t\tlength: 1,\n\t\taddClass: function(){},\n\t\tremoveClass: function(){},\n\t\tclick: function(){},\n\t\ttext: function(){},\n\t\toffset: leftTop,\n\t\tposition: leftTop,\n\t\tcss: function(){ return 0 },\n\t\twidth: function(){ return 0 },\n\t\theight: function(){ return 0 },\n\t\tposition: function(){ return 0 },\n\t\tremove: function(){ },\n\t\tmovable: function(){},\n\t\tpopover:function(){},\n\t\tremoveClass:function(){},\n\t\tkeydown:function(){},\n\t\tkeyup:function(){},\n\t\tmousemove:function(){},\n\t\touterHeight:function(){},\n\t\t'0': {\n\t\t\tgetContext: function(){}\n\t\t}\n\t}}\n\n\tvar graphCounter = 0\n\tcore = {\n\t\tdatatypes: E2.dt,\n\t\tget_uid: E2.uid,\n\t\tassetLoader: new AssetLoader(),\n\t\trenderer: {\n\t\t\tcontext: {},\n\t\t\tcanvas: [$()],\n\t\t\ton: function(){}\n\t\t},\n\t\tgraphs: [],\n\t\tget_default_value: function(dt) {\n\t\t\treturn null\n\t\t},\n\t\ton: function(){}\n\t};\n\n\tcore.pluginManager = {\n\t\tcreate: function(id, node) {\n\t\t\texports.loadPlugin(id)\n\t\t\tvar p = new E2.plugins[id](core, node);\n\t\t\tp.id = id\n\t\t\treturn p\n\t\t},\n\t\tkeybyid: {}\n\t}\n\n\tE2.core = core\n\tE2.dt = core.datatypes\n\tE2.core.resolve_dt = { 0: E2.dt.FLOAT }\n\tE2.commands = {}\n\tE2.slot_type = { input: 0, output: 1 };\n\n\tvar uidCounter = 0\n\tE2.core.get_uid = E2.uid = function() {\n\t\treturn Date.now() + '-' + uidCounter++\n\t}\n\n\tE2.dom = {\n\t\tbreadcrumb: {\n\t\t\tchildren: function() { return $() },\n\t\t\tprepend: function() {}\n\t\t},\n\t\tcanvas: [{ getContext: function(){} }],\n\t\tcanvas_parent: $(),\n\t\tcanvases: $()\n\t}\n\n\tglobal.make = function() {\n\t\treturn $()\n\t}\n\n\tE2.dom.canvas_parent.scrollTop = E2.dom.canvas_parent.scrollLeft = \n\t\tfunction() { return 0; }\n\n\treturn core;\n}\n\nexports.loadPlugin = function(name) {\n\tvar js = fs.readFileSync(browserPath+'plugins/'+name+'.plugin.js');\n\tvm.runInThisContext(js, name);\n}\n"
  },
  {
    "path": "browser/test/unit/plugins/material_modifier.js",
    "content": "var assert = require('assert')\n\nvar slot = require('./helpers').slot\nvar reset = require('./helpers').reset\nvar loadPlugin = require('./helpers').loadPlugin\nglobal.EventEmitter = require('../../../scripts/event-emitter')\nglobal.Node = require('../../../scripts/node').Node\nglobal.LinkedSlotGroup = require('../../../scripts/node').LinkedSlotGroup\n\nglobal.self = {}\n\nglobal.THREE = require('./../../../vendor/three/three.js')\n\ndescribe('material_modifier', function()\n{\n\tvar node, plugin, core\n\n\tbeforeEach(function()\n\t{\n\t\tcore = reset()\n\n\t\tloadPlugin('three_material_modifier')\n\n\t\tvar ag = E2.core.active_graph\n\t\tnode = new Node(ag, undefined, 0, 0)\n\t\tplugin = new E2.plugins.three_material_modifier(core, node)\n\t\tnode.set_plugin(plugin)\n\t\tplugin.reset()\n\t})\n\n\tit('pass material through without overriding', function() {\n\t\tvar m = [new THREE.Material()]\n\t\tm[0].name = 'm1'\n\t\tplugin.update_input({index: 0}, m)\n\n\t\tplugin.update_state({abs_t:0, delta_t:(1/60)})\n\n\t\tvar o = plugin.update_output({index: 0})\n\n\t\tassert.deepEqual(o, m)\n\t})\n\n\tit('overrides default material', function() {\n\t\tvar m1 = [new THREE.Material()]\n\t\tm1[0].name = 'default material'\n\n\t\tvar m2 = [new THREE.Material()]\n\t\tm2[0].name = 'override material'\n\n\t\tplugin.update_input({index: 0, name: 'material array'}, m1)\n\t\tplugin.update_input({index: 0, uid: 0x1234, name: 'default material'}, m2[0])\n\n\t\tplugin.update_state({abs_t:0, delta_t:(1/60)})\n\n\t\tvar o = plugin.update_output({index: 0})\n\n\t\tassert.deepEqual(o, m2)\n\t})\n\n\tit('overrides one of many materials', function() {\n\t\tvar m1 = [\n\t\t\tnew THREE.Material(),\n\t\t\tnew THREE.Material(),\n\t\t\tnew THREE.Material(),\n\t\t\tnew THREE.Material(),\n\t\t\tnew THREE.Material()]\n\n\t\tm1[0].name = 'mat0'\n\t\tm1[1].name = 'mat1'\n\t\tm1[2].name = 'mat2'\n\t\tm1[3].name = 'mat3'\n\t\tm1[4].name = 'mat4'\n\n\t\tvar m2 = [new THREE.Material()]\n\t\tm2[0].name = 'override material'\n\n\t\tplugin.update_input({index: 0, name: 'material array'}, m1)\n\t\tplugin.update_input({index: 3, uid: 0x1234, name: 'mat3'}, m2[0])\n\n\t\tplugin.update_state({abs_t:0, delta_t:(1/60)})\n\n\t\tvar o = plugin.update_output({index: 0})\n\n\t\tassert.deepEqual(o, [m1[0], m1[1], m1[2], m2[0], m1[4]])\n\t})\n\n})\n"
  },
  {
    "path": "browser/test/unit/plugins/object_add.js",
    "content": "var assert = require('assert');\n\nvar slot = require('./helpers').slot;\nvar reset = require('./helpers').reset;\nvar loadPlugin = require('./helpers').loadPlugin;\n\ndescribe('object_add', function()\n{\n\tvar plugin, core\n\n\tbeforeEach(function()\n\t{\n\t\tcore = reset();\n\t\tloadPlugin('object_add');\n\t\tplugin = new E2.plugins.object_add(core);\n\t});\n\n\tit('declares the right slots', function()\n\t{\n\t\tassert.ok(plugin.input_slots.length, 3);\n\t\tassert.ok(plugin.output_slots.length, 1);\n\t});\n\n\tit('composes new objects', function()\n\t{\n\t\tplugin.update_input(slot(1), 'foo');\n\t\tplugin.update_input(slot(2), 'bar');\n\n\t\tassert.deepEqual(plugin.update_output(),\n\t\t{\n\t\t\tfoo: 'bar'\n\t\t});\n\t});\n\n\tit('adds to objects', function()\n\t{\n\t\tplugin.update_input(slot(0), { bar: 'baz' });\n\t\tplugin.update_input(slot(1), 'foo');\n\t\tplugin.update_input(slot(2), 'bar');\n\n\t\tassert.deepEqual(plugin.update_output(),\n\t\t{\n\t\t\tfoo: 'bar',\n\t\t\tbar: 'baz'\n\t\t});\n\t});\n\n\tit('nests objects', function()\n\t{\n\t\tplugin.update_input(slot(1), 'foo');\n\t\tplugin.update_input(slot(2), 'bar');\n\t\tvar out = plugin.update_output();\n\t\tvar p2 = new E2.plugins.object_add(core);\n\t\tp2.update_input(slot(1), 'abc');\n\t\tp2.update_input(slot(2), out);\n\n\t\tassert.deepEqual(p2.update_output(),\n\t\t{\n\t\t\tabc:\n\t\t\t{\n\t\t\t\tfoo: 'bar'\n\t\t\t}\n\t\t});\n\t});\n\n\tit('extends objects given empty object as first value', function()\n\t{\n\t\tplugin.update_input(slot(1), 'foo');\n\t\tplugin.update_input(slot(2), {});\n\t\tvar out = plugin.update_output();\n\t\tvar p2 = new E2.plugins.object_add(core);\n\t\tp2.update_input(slot(0), out);\n\t\tp2.update_input(slot(1), 'abc');\n\t\tp2.update_input(slot(2), 'bar');\n\n\t\tassert.deepEqual(p2.update_output(),\n\t\t{\n\t\t\tfoo: {},\n\t\t\tabc: 'bar'\n\t\t});\n\t});\n\n});\n\n"
  },
  {
    "path": "browser/test/unit/plugins/object_stringify.js",
    "content": "var assert = require('assert');\n\nvar slot = require('./helpers').slot;\nvar reset = require('./helpers').reset;\nvar loadPlugin = require('./helpers').loadPlugin;\n\ndescribe('object_stringify', function()\n{\n\tvar plugin, core\n\n\tbeforeEach(function()\n\t{\n\t\tcore = reset();\n\t\tloadPlugin('object_stringify');\n\t\tplugin = new E2.plugins.object_stringify(core);\n\t});\n\n\tit('declares the right slots', function()\n\t{\n\t\tassert.ok(plugin.input_slots.length, 1);\n\t\tassert.ok(plugin.output_slots.length, 1);\n\t});\n\n\tit('serializes objects', function()\n\t{\n\t\tvar obj =\n\t\t{\n\t\t\tfoo: 'bar',\n\t\t\tbar: {\n\t\t\t\tbaz: 'qox'\n\t\t\t}\n\t\t};\n\t\t\n\t\tplugin.update_input(slot(0), obj);\n\n\t\tassert.deepEqual(plugin.update_output(),\n\t\t\tJSON.stringify(obj))\n\t});\n\n});\n\n"
  },
  {
    "path": "browser/test/unit/subGraphPlugin.js",
    "content": "var assert = require('assert');\nvar browserPath = __dirname+'/../../';\nglobal.Plugin = require(browserPath+'scripts/plugin.js')\n\nglobal.E2 = {\n\tuid: function() {},\n\tdt: {\n\t\tANY: { id: 8, name: 'Arbitrary' },\n\t\tFLOAT: { id: 0, name: 'Float' }\n\t},\n\tslot_type: {\n\t\tinput: 0,\n\t\toutput: 1\n\t}\n}\n\nglobal.msg = console.error\n\nglobal.EventEmitter = require('../../scripts/event-emitter')\nglobal.SubGraphPlugin = require('../../scripts/subGraphPlugin')\n\ndescribe('SubGraphPlugin', function() {\n\tvar sub, proxyNode, internalSlot\n\tvar conn = {\n\t\tsrc_slot: {\n\t\t\tdt: 'datatype',\n\t\t\tarray: true\n\t\t},\n\t\tdst_slot: {\n\t\t\tdt: 'datatype',\n\t\t\tarray: true\n\t\t}\n\t}\n\n\tbeforeEach(function() {\n\t\tinternalSlot = { dt: E2.dt.ANY }\n\t\tproxyNode = {\n\t\t\tdyn_outputs: [ internalSlot ],\n\t\t\toutputs: [],\n\t\t\tplugin: {},\n\t\t\treset: function() {}\n\t\t}\n\t\tsub = new SubGraphPlugin()\n\t\tsub.parent_node = {}\n\t\tsub.core = {\n\t\t\tdatatypes: E2.dt,\n\t\t\tget_default_value: function() { return 'testDefaultValue' }\n\t\t}\n\t})\n\n\tit('changes datatype when inbound connection lost', function() {\n\t\tproxyNode.dyn_outputs = [ internalSlot ]\n\t\tsub.input_nodes = { 'eSlotUid': proxyNode }\n\t\tvar externalSlot = { uid: 'eSlotUid', type: 0 }\n\t\tsub.connection_changed(false, conn, externalSlot)\n\t\tassert.equal(externalSlot.dt.id, 8)\n\t\tassert.equal(internalSlot.dt.id, 8)\n\t})\n\n\tit('resets plugin when inbound connection lost', function(done) {\n\t\tproxyNode.dyn_outputs = [ internalSlot ]\n\t\tsub.input_nodes = { 'eSlotUid': proxyNode }\n\t\tvar externalSlot = { uid: 'eSlotUid', type: 0 }\n\t\tproxyNode.reset = done\n\t\tsub.connection_changed(false, conn, externalSlot)\n\t})\n\n\tit('changes datatype and arrayness when inbound connection created', function() {\n\t\tproxyNode.dyn_outputs = [ internalSlot ]\n\t\tsub.input_nodes = { 'eSlotUid': proxyNode }\n\t\tvar externalSlot = { uid: 'eSlotUid', type: 0, dt: E2.dt.ANY }\n\t\tsub.connection_changed(true, conn, externalSlot)\n\t\tassert.equal(externalSlot.dt, 'datatype')\n\t\tassert.equal(externalSlot.array, true)\n\t\tassert.equal(internalSlot.dt, 'datatype')\n\t\tassert.equal(internalSlot.array, true)\n\t})\n\n\tit('changes datatype and arrayness when outbound connection created', function() {\n\t\tproxyNode.dyn_inputs = [ internalSlot ]\n\t\tsub.output_nodes = { 'eSlotUid': proxyNode }\n\t\tvar externalSlot = { uid: 'eSlotUid', type: 1, dt: E2.dt.ANY }\n\t\tsub.connection_changed(true, conn, externalSlot)\n\t\tassert.equal(externalSlot.dt, 'datatype')\n\t\tassert.equal(externalSlot.array, true)\n\t\tassert.equal(internalSlot.dt, 'datatype')\n\t\tassert.equal(internalSlot.array, true)\n\t})\n\n\tit('resets plugin data when outbound connection created', function() {\n\t\tproxyNode.dyn_inputs = [ internalSlot ]\n\t\tsub.output_nodes = { 'eSlotUid': proxyNode }\n\t\tvar externalSlot = { uid: 'eSlotUid', type: 1, dt: E2.dt.ANY }\n\t\tsub.connection_changed(true, conn, externalSlot)\n\t\tassert.equal(proxyNode.plugin.data, 'testDefaultValue')\n\t})\n\n})\n\n\n\n"
  },
  {
    "path": "browser/test/unit/undo.js",
    "content": "var assert = require('assert');\nvar EventEmitter = require('events').EventEmitter;\n\nglobal.E2 = {}\n\nE2.Variables = function(){}\nglobal.EventEmitter = EventEmitter // XXX\nglobal.Graph = require('../../scripts/graph');\nglobal.Connection = require('../../scripts/connection').Connection;\nglobal.Node = require('../../scripts/node').Node\n\nglobal.Flux = require('../../vendor/flux')\n\nvar helpers = require('./plugins/helpers')\nvar Connection = require('../../scripts/connection').Connection\nvar Graph = require('../../scripts/graph');\nvar GraphApi = require('../../scripts/graphApi');\nglobal.Store = require('../../scripts/stores/store');\nvar GraphStore = require('../../scripts/stores/graphStore');\nvar UndoManager = require('../../scripts/commands/undoManager');\n\nvar commands = require('../../scripts/commands/graphEditCommands')\n\ndescribe('Undo', function() {\n\tvar graph\n\tvar undoManager\n\n\tfunction makeNode() {\n\t\treturn Node.hydrate(graph.uid, {\n\t\t\tuid: E2.uid(),\n\t\t\tplugin: 'const_float_generator'\n\t\t})\n\t}\n\n\tfunction makeSlot(slots, type) {\n\t\tvar slot = {\n\t\t\ttype: type,\n\t\t\tindex: slots.length\n\t\t}\n\t\tslots.push(slot)\n\t\treturn slot\n\t}\n\n\tbeforeEach(function() {\n\t\thelpers.reset()\n\t\tE2.commands = { graph: commands }\n\t\t\n\t\tundoManager = new UndoManager()\n\t\t\n\t\tE2.app.undoManager = undoManager\n\t\tE2.app.dispatcher = new Flux.Dispatcher()\n\t\tE2.app.graphStore = new GraphStore()\n\t\tE2.app.graphApi = new GraphApi(undoManager)\n\n\t\tgraph = new Graph()\n\t\tE2.core.root_graph = E2.core.active_graph = graph\n\t\tE2.core.graphs = [graph]\n\t})\n\n\tdescribe('Manager', function() {\n\t\tbeforeEach(function() {\n\t\t})\n\n\t\tit('shows as undoable when item pushed', function() {\n\t\t\tundoManager.push({})\n\t\t\tassert.ok(undoManager.isUndoable())\n\t\t\tassert.ok(!undoManager.isRedoable())\n\t\t})\n\n\t\tit('shows as redoable when item undone', function() {\n\t\t\tundoManager.push({ undo: function() {} })\n\t\t\tundoManager.undo()\n\t\t\tassert.ok(undoManager.isRedoable())\n\t\t\tassert.ok(!undoManager.isUndoable())\n\t\t})\n\n\t\tit('pushes to stack on execute', function(done) {\n\t\t\tundoManager.execute({ undo: done, redo: function(){} })\n\t\t\tundoManager.undo()\n\t\t})\n\n\t\tit('calls undo method', function(done) {\n\t\t\tundoManager.push({ undo: done })\n\t\t\tundoManager.undo()\n\t\t})\n\n\t\tit('calls redo method', function(done) {\n\t\t\tundoManager.push({ undo: function() {}, redo: done })\n\t\t\tundoManager.undo()\n\t\t\tundoManager.redo()\n\t\t})\n\n\t\tit('lists undo stack', function() {\n\t\t\tundoManager.push({ title: 'Undo test' })\n\t\t\tvar us = undoManager.getUndoStack()\n\t\t\tassert.equal(us.length, 1)\n\t\t\tassert.equal(us[0].title, 'Undo test')\n\t\t})\n\n\t\tit('winds the stacks correctly', function() {\n\t\t\tvar efn = function(){}\n\t\t\tundoManager.execute({ title: 'Do 1', undo: efn, redo: efn })\n\t\t\tundoManager.execute({ title: 'Do 2', undo: efn, redo: efn })\n\t\t\t// [Do 1, Do 2], []\n\n\t\t\tassert.equal(undoManager.undoStack[0].title, 'Do 1')\n\t\t\tassert.equal(undoManager.undoStack[1].title, 'Do 2')\n\n\t\t\tundoManager.undo()\n\t\t\t// [Do 1], [Do 2]\n\t\t\tassert.equal(undoManager.undoStack.length, 1)\n\t\t\tassert.equal(undoManager.redoStack.length, 1)\n\t\t\tassert.equal(undoManager.undoStack[0].title, 'Do 1')\n\t\t\tassert.equal(undoManager.redoStack[0].title, 'Do 2')\n\n\t\t\tundoManager.undo()\n\t\t\t// [], [Do 2, Do 1]\n\t\t\tassert.equal(undoManager.undoStack.length, 0)\n\t\t\tassert.equal(undoManager.redoStack.length, 2)\n\t\t\tassert.equal(undoManager.redoStack[0].title, 'Do 2')\n\t\t\tassert.equal(undoManager.redoStack[1].title, 'Do 1')\n\n\t\t\tundoManager.redo()\n\t\t\t// [Do 1], [Do 2]\n\t\t\tassert.equal(undoManager.undoStack.length, 1)\n\t\t\tassert.equal(undoManager.redoStack.length, 1)\n\t\t\tassert.equal(undoManager.undoStack[0].title, 'Do 1')\n\t\t\tassert.equal(undoManager.redoStack[0].title, 'Do 2')\n\n\t\t\tundoManager.redo()\n\t\t\t// [Do 1, Do 2], []\n\t\t\tassert.equal(undoManager.undoStack.length, 2)\n\t\t\tassert.equal(undoManager.redoStack.length, 0)\n\t\t\tassert.equal(undoManager.undoStack[0].title, 'Do 1')\n\t\t\tassert.equal(undoManager.undoStack[1].title, 'Do 2')\n\t\t})\n\n\t\tit('can group actions', function() {\n\t\t\tvar redos = 0, undos = 0\n\n\t\t\tfunction redo() {\n\t\t\t\tredos++\n\t\t\t}\n\t\t\tfunction undo() {\n\t\t\t\tundos++\n\t\t\t}\n\n\t\t\tundoManager.begin('Test')\n\n\t\t\tundoManager.execute({ title: 'One', redo: redo, undo: undo })\n\t\t\tundoManager.execute({ title: 'Two', redo: redo, undo: undo })\n\t\t\tundoManager.execute({ title: 'Three', redo: redo, undo: undo })\n\n\t\t\tassert.equal(undoManager.undoStack.length, 0)\n\t\t\tassert.equal(undoManager._transaction.undoStack.length, 3)\n\n\t\t\tundoManager.end()\n\n\t\t\tassert.ok(redos, 3)\n\t\t\tassert.equal(undoManager.undoStack.length, 1)\n\t\t\tassert.equal(undoManager.undoStack[0].title, 'Test')\n\t\t\tassert.equal(undoManager._transaction, null)\n\n\t\t\tundoManager.undo()\n\n\t\t\tassert.ok(undos, 3)\n\t\t})\n\n\t\tit('handles multiple nested transactions', function() {\n\t\t\tvar redos = 0, undos = 0\n\n\t\t\tfunction redo() {\n\t\t\t\tredos++\n\t\t\t}\n\t\t\tfunction undo() {\n\t\t\t\tundos++\n\t\t\t}\n\n\t\t\tundoManager.begin('Test')\n\t\t\tvar firstXa = undoManager._transaction\n\t\t\tundoManager.begin('Test2')\n\t\t\tundoManager.execute({ title: 'One.2', redo: redo, undo: undo })\n\t\t\tundoManager.begin('Test3')\n\t\t\tundoManager.execute({ title: 'One.3', redo: redo, undo: undo })\n\t\t\tassert.equal(undoManager._nestedTransactions, 3)\n\t\t\tassert.equal(undoManager._transaction, firstXa)\n\t\t\tundoManager.execute({ title: 'Two', redo: redo, undo: undo })\n\t\t\tundoManager.execute({ title: 'Three', redo: redo, undo: undo })\n\t\t\tundoManager.end()\n\t\t\tassert.equal(undoManager._nestedTransactions, 2)\n\t\t\tundoManager.end()\n\t\t\tassert.equal(undoManager._nestedTransactions, 1)\n\t\t\tundoManager.end()\n\t\t\tassert.equal(undoManager._nestedTransactions, 0)\n\n\t\t\tassert.equal(redos, 4)\n\t\t\tassert.equal(undoManager._transaction, null)\n\n\t\t\tundoManager.undo()\n\n\t\t\tassert.ok(undos, 4)\n\t\t})\t\n\t})\n\n\tdescribe('AddNode', function() {\n\t\tit('AddNode execute', function() {\n\t\t\tassert.equal(graph.nodes.length, 0)\n\n\t\t\tvar cmd = new E2.commands.graph.AddNode(graph, makeNode())\n\t\t\tcmd.execute()\n\n\t\t\tassert.equal(graph.nodes.length, 1)\n\t\t});\n\n\t\tit('AddNode undo', function() {\n\t\t\tassert.equal(graph.nodes.length, 0)\n\n\t\t\tvar cmd = new E2.commands.graph.AddNode(graph, makeNode())\n\t\t\tcmd.execute()\n\t\t\tcmd.undo()\n\n\t\t\tassert.equal(graph.nodes.length, 0)\n\t\t});\n\t});\n\n\tdescribe('RemoveNode', function() {\n\t\tit('RemoveNode execute', function() {\n\t\t\tvar n = makeNode()\n\t\n\t\t\tgraph.addNode(n)\n\t\t\tassert.equal(graph.nodes.length, 1)\n\t\n\t\t\tvar cmd = new E2.commands.graph.RemoveNode(graph, n)\n\t\t\tcmd.execute()\n\n\t\t\tassert.equal(graph.nodes.length, 0)\n\t\t});\n\n\t\tit('RemoveNode undo', function() {\n\t\t\tvar n = makeNode()\n\t\n\t\t\tgraph.addNode(n)\n\t\t\tassert.equal(graph.nodes.length, 1)\n\t\n\t\t\tvar cmd = new E2.commands.graph.RemoveNode(graph, n)\n\t\t\tcmd.execute()\n\t\t\tcmd.undo()\n\n\t\t\tassert.equal(graph.nodes.length, 1)\n\t\t});\n\t});\n\n\tdescribe('Connect', function() {\n\t\tit('Connect execute', function() {\n\t\t\tassert.equal(graph.nodes.length, 0)\n\n\t\t\tvar n1 = makeNode()\n\t\t\tvar n2 = makeNode()\n\t\t\tvar ss = makeSlot(n1.plugin.output_slots, E2.slot_type.output)\n\t\t\tvar ds = makeSlot(n2.plugin.input_slots, E2.slot_type.input)\n\n\t\t\tgraph.nodes.push(n1)\n\t\t\tgraph.nodes.push(n2)\n\n\t\t\tvar connection = new Connection(n1, n2, ss, ds, 0)\n\t\t\tvar cmd = new E2.commands.graph.Connect(graph, connection)\n\t\t\tcmd.execute()\n\n\t\t\tassert.equal(graph.connections.length, 1)\n\t\t\tassert.equal(graph.nodes.length, 2)\n\t\t});\n\n\t\tit('Connect undo', function() {\n\t\t\tassert.equal(graph.nodes.length, 0)\n\n\t\t\tvar n1 = makeNode()\n\t\t\tvar n2 = makeNode()\n\t\t\tvar ss = makeSlot(n1.plugin.output_slots, E2.slot_type.output)\n\t\t\tvar ds = makeSlot(n2.plugin.input_slots, E2.slot_type.input)\n\n\t\t\tgraph.nodes.push(n1)\n\t\t\tgraph.nodes.push(n2)\n\n\t\t\tvar connection = new Connection(n1, n2, ss, ds, 0)\n\t\t\tvar cmd = new E2.commands.graph.Connect(graph, connection)\n\t\t\tcmd.execute()\n\t\t\tcmd.undo()\n\n\t\t\tassert.equal(graph.connections.length, 0)\n\t\t\tassert.equal(graph.nodes.length, 2)\n\t\t});\n\t});\n\n\tdescribe('Disconnect', function() {\n\t\tit('Disconnect execute', function() {\n\t\t\tassert.equal(graph.nodes.length, 0)\n\n\t\t\tvar n1 = makeNode()\n\t\t\tvar n2 = makeNode()\n\t\t\tvar ss = makeSlot(n1.plugin.output_slots, E2.slot_type.output)\n\t\t\tvar ds = makeSlot(n2.plugin.input_slots, E2.slot_type.input)\n\n\t\t\tgraph.nodes.push(n1)\n\t\t\tgraph.nodes.push(n2)\n\n\t\t\tvar conn = new Connection(n1, n2, ss, ds, 0)\n\t\t\tgraph.connect(conn)\n\n\t\t\tassert.equal(graph.connections.length, 1)\n\n\t\t\tvar cmd = new E2.commands.graph.Disconnect(graph, conn)\n\t\t\tcmd.execute()\n\n\t\t\tassert.equal(graph.connections.length, 0)\n\t\t});\n\n\t\tit('Disconnect undo', function() {\n\t\t\tassert.equal(graph.nodes.length, 0)\n\n\t\t\tvar n1 = makeNode()\n\t\t\tvar n2 = makeNode()\n\t\t\tvar ss = makeSlot(n1.plugin.output_slots, E2.slot_type.output)\n\t\t\tvar ds = makeSlot(n2.plugin.input_slots, E2.slot_type.input)\n\n\t\t\tgraph.nodes.push(n1)\n\t\t\tgraph.nodes.push(n2)\n\n\t\t\tvar conn = new Connection(n1, n2, ss, ds, 0)\n\t\t\tgraph.connect(conn)\n\n\t\t\tassert.equal(graph.connections.length, 1)\n\n\t\t\tvar cmd = new E2.commands.graph.Disconnect(graph, conn)\n\t\t\tcmd.execute()\n\t\t\tcmd.undo()\n\n\t\t\tassert.equal(graph.connections.length, 1)\n\t\t});\n\t});\n\n\tdescribe('GraphApi', function() {\n\t\tvar n1, n2, ss, ds\n\t\tbeforeEach(function() {\n\t\t\tn1 = makeNode()\n\t\t\tn2 = makeNode()\n\t\t\tss = makeSlot(n1.plugin.output_slots, E2.slot_type.output)\n\t\t\tds = makeSlot(n2.plugin.input_slots, E2.slot_type.input)\n\t\t\tapi = new GraphApi(undoManager)\n\t\t\tgraph.registerNode(n1)\n\t\t\tgraph.registerNode(n2)\n\t\t})\n\n\t\tit('can add nodes', function() {\n\t\t\tassert.equal(graph.nodes.length, 2)\n\t\t\tapi.addNode(graph, makeNode())\n\t\t\tassert.equal(graph.nodes.length, 3)\n\t\t})\n\n\t\tit('can remove nodes', function() {\n\t\t\tvar n = makeNode()\n\t\t\tapi.addNode(graph, n)\n\t\t\tassert.equal(graph.nodes.length, 3)\n\t\t\tapi.removeNode(graph, n)\n\t\t\tassert.equal(graph.nodes.length, 2)\n\t\t})\n\n\t\tit('can connect nodes', function() {\n\t\t\tassert.equal(graph.connections.length, 0)\n\t\t\tvar conn = new Connection(n1, n2, ss, ds, 0)\n\t\t\tapi.connect(graph, conn)\n\t\t\tassert.equal(graph.connections.length, 1)\n\t\t})\n\n\t\tit('can disconnect nodes', function() {\n\t\t\tvar conn = new Connection(n1, n2, ss, ds, 0)\n\t\t\tapi.connect(graph, conn)\n\t\t\tapi.disconnect(graph, conn)\n\t\t\tassert.equal(graph.connections.length, 0)\n\t\t})\n\n\t})\n\n\n\n});\n\n"
  },
  {
    "path": "browser/test/unit/variables.js",
    "content": "var assert = require('assert')\nvar reset = require('./plugins/helpers').reset\n\nglobal.E2 = {\n\tuid: function() {},\n\tdt: {\n\t\tANY: { id: 8, name: 'Arbitrary' },\n\t\tFLOAT: { id: 0, name: 'Float' }\n\t},\n\tslot_type: {\n\t\tinput: 0,\n\t\toutput: 1\n\t}\n}\n\nglobal.msg = console.error\n\nglobal.EventEmitter = require('../../scripts/event-emitter')\nglobal.Variables = require('../../scripts/variables').Variables\n\ndescribe('Variables', function() {\n\tvar core, vars\n\n\tbeforeEach(function() {\n\t\tcore = reset()\n\t\tvars = new Variables(core)\n\t\tplugin = {\n\t\t\tvariable_dt_changed: function() {}\n\t\t}\n\t})\n\n\tit('locks variables', function() {\n\t\tvars.lock('plugin', 'var1')\n\t\tassert.equal(vars.variables.var1.ref_count, 1)\n\t\tassert.equal(vars.variables.var1.users, 'plugin')\n\t})\n\n\tit('unlocks variables', function() {\n\t\tvars.lock('plugin', 'var1')\n\t\tvars.unlock('plugin', 'var1')\n\t\tassert.equal(vars.variables.var1, undefined)\n\t})\n\n\tit('sets dt and arrayness', function() {\n\t\tvars.lock(plugin, 'var1')\n\t\tvars.set_datatype('var1', 'dt', true)\n\t\tassert.equal(vars.variables.var1.dt, 'dt')\n\t\tassert.equal(vars.variables.var1.array, true)\n\t})\n\n\tit('clears dt and arrayness on d/c', function() {\n\t\tvars.lock(plugin, 'var1')\n\t\tvars.set_datatype('var1', E2.dt.ANY, true)\n\t\tvars.connection_changed('var1', true)\n\t\tvars.connection_changed('var1', false)\n\t\tassert.equal(vars.variables.var1.dt, E2.dt.ANY)\n\t})\n\n})\n\n\n\n"
  },
  {
    "path": "browser/test/unit/wsendpoint.js",
    "content": "global.E2 = {}\nvar Application = require('../../scripts/application')\n\nvar assert = require('assert')\n\nvar f = Application.prototype.determineWebSocketEndpoint.bind({}, '/ep')\n\ndescribe('Determine WS connection options', function() {\n\n\tbeforeEach(function() {\n\t\tglobal.Vizor = {\n\t\t\treleaseMode: false\n\t\t}\n\t\tglobal.window = {\n\t\t\tlocation: {\n\t\t\t\thostname: 'foo.vizor.test',\n\t\t\t\tport: 8000,\n\t\t\t}\n\t\t}\n\t})\n\n\tit('uses unsecure by default', function() {\n\t\tassert.equal('ws://foo.vizor.test:8000/ep', f())\n\t})\n\n\tit('uses secureWebSocket override', function() {\n\t\tglobal.Vizor.useSecureWebSocket = true\n\t\tassert.equal('wss://foo.vizor.test:443/ep', f())\n\t})\n\n\tit('uses webSocketHost and secureWebSocket overrides', function() {\n\t\tglobal.Vizor.useSecureWebSocket = true\n\t\tglobal.Vizor.webSocketHost = 'ws.ooh.vizor.test'\n\t\tassert.equal('wss://ws.ooh.vizor.test:443/ep', f())\n\t})\n\n\tit('uses webSocketHost override', function() {\n\t\tglobal.Vizor.webSocketHost = 'ws.ooh.vizor.test'\n\t\tassert.equal('ws://ws.ooh.vizor.test:8000/ep', f())\n\t})\n\n})"
  },
  {
    "path": "browser/vendor/bootstrap-3.1.1-dist/js/bootstrap.js",
    "content": "/*!\n * Bootstrap v3.1.1 (http://getbootstrap.com)\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\nif (typeof jQuery === 'undefined') { throw new Error('Bootstrap\\'s JavaScript requires jQuery') }\n\n/* ========================================================================\n * Bootstrap: transition.js v3.1.1\n * http://getbootstrap.com/javascript/#transitions\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)\n  // ============================================================\n\n  function transitionEnd() {\n    var el = document.createElement('bootstrap')\n\n    var transEndEventNames = {\n      'WebkitTransition' : 'webkitTransitionEnd',\n      'MozTransition'    : 'transitionend',\n      'OTransition'      : 'oTransitionEnd otransitionend',\n      'transition'       : 'transitionend'\n    }\n\n    for (var name in transEndEventNames) {\n      if (el.style[name] !== undefined) {\n        return { end: transEndEventNames[name] }\n      }\n    }\n\n    return false // explicit for ie8 (  ._.)\n  }\n\n  // http://blog.alexmaccaw.com/css-transitions\n  $.fn.emulateTransitionEnd = function (duration) {\n    var called = false, $el = this\n    $(this).one($.support.transition.end, function () { called = true })\n    var callback = function () { if (!called) $($el).trigger($.support.transition.end) }\n    setTimeout(callback, duration)\n    return this\n  }\n\n  $(function () {\n    $.support.transition = transitionEnd()\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: alert.js v3.1.1\n * http://getbootstrap.com/javascript/#alerts\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // ALERT CLASS DEFINITION\n  // ======================\n\n  var dismiss = '[data-dismiss=\"alert\"]'\n  var Alert   = function (el) {\n    $(el).on('click', dismiss, this.close)\n  }\n\n  Alert.prototype.close = function (e) {\n    var $this    = $(this)\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') // strip for ie7\n    }\n\n    var $parent = $(selector)\n\n    if (e) e.preventDefault()\n\n    if (!$parent.length) {\n      $parent = $this.hasClass('alert') ? $this : $this.parent()\n    }\n\n    $parent.trigger(e = $.Event('close.bs.alert'))\n\n    if (e.isDefaultPrevented()) return\n\n    $parent.removeClass('in')\n\n    function removeElement() {\n      $parent.trigger('closed.bs.alert').remove()\n    }\n\n    $.support.transition && $parent.hasClass('fade') ?\n      $parent\n        .one($.support.transition.end, removeElement)\n        .emulateTransitionEnd(150) :\n      removeElement()\n  }\n\n\n  // ALERT PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.alert\n\n  $.fn.alert = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.alert')\n\n      if (!data) $this.data('bs.alert', (data = new Alert(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.alert.Constructor = Alert\n\n\n  // ALERT NO CONFLICT\n  // =================\n\n  $.fn.alert.noConflict = function () {\n    $.fn.alert = old\n    return this\n  }\n\n\n  // ALERT DATA-API\n  // ==============\n\n  $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: button.js v3.1.1\n * http://getbootstrap.com/javascript/#buttons\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // BUTTON PUBLIC CLASS DEFINITION\n  // ==============================\n\n  var Button = function (element, options) {\n    this.$element  = $(element)\n    this.options   = $.extend({}, Button.DEFAULTS, options)\n    this.isLoading = false\n  }\n\n  Button.DEFAULTS = {\n    loadingText: 'loading...'\n  }\n\n  Button.prototype.setState = function (state) {\n    var d    = 'disabled'\n    var $el  = this.$element\n    var val  = $el.is('input') ? 'val' : 'html'\n    var data = $el.data()\n\n    state = state + 'Text'\n\n    if (!data.resetText) $el.data('resetText', $el[val]())\n\n    $el[val](data[state] || this.options[state])\n\n    // push to event loop to allow forms to submit\n    setTimeout($.proxy(function () {\n      if (state == 'loadingText') {\n        this.isLoading = true\n        $el.addClass(d).attr(d, d)\n      } else if (this.isLoading) {\n        this.isLoading = false\n        $el.removeClass(d).removeAttr(d)\n      }\n    }, this), 0)\n  }\n\n  Button.prototype.toggle = function () {\n    var changed = true\n    var $parent = this.$element.closest('[data-toggle=\"buttons\"]')\n\n    if ($parent.length) {\n      var $input = this.$element.find('input')\n      if ($input.prop('type') == 'radio') {\n        if ($input.prop('checked') && this.$element.hasClass('active')) changed = false\n        else $parent.find('.active').removeClass('active')\n      }\n      if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')\n    }\n\n    if (changed) this.$element.toggleClass('active')\n  }\n\n\n  // BUTTON PLUGIN DEFINITION\n  // ========================\n\n  var old = $.fn.button\n\n  $.fn.button = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.button')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.button', (data = new Button(this, options)))\n\n      if (option == 'toggle') data.toggle()\n      else if (option) data.setState(option)\n    })\n  }\n\n  $.fn.button.Constructor = Button\n\n\n  // BUTTON NO CONFLICT\n  // ==================\n\n  $.fn.button.noConflict = function () {\n    $.fn.button = old\n    return this\n  }\n\n\n  // BUTTON DATA-API\n  // ===============\n\n  $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {\n    var $btn = $(e.target)\n    if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')\n    $btn.button('toggle')\n    e.preventDefault()\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: carousel.js v3.1.1\n * http://getbootstrap.com/javascript/#carousel\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // CAROUSEL CLASS DEFINITION\n  // =========================\n\n  var Carousel = function (element, options) {\n    this.$element    = $(element)\n    this.$indicators = this.$element.find('.carousel-indicators')\n    this.options     = options\n    this.paused      =\n    this.sliding     =\n    this.interval    =\n    this.$active     =\n    this.$items      = null\n\n    this.options.pause == 'hover' && this.$element\n      .on('mouseenter', $.proxy(this.pause, this))\n      .on('mouseleave', $.proxy(this.cycle, this))\n  }\n\n  Carousel.DEFAULTS = {\n    interval: 5000,\n    pause: 'hover',\n    wrap: true\n  }\n\n  Carousel.prototype.cycle =  function (e) {\n    e || (this.paused = false)\n\n    this.interval && clearInterval(this.interval)\n\n    this.options.interval\n      && !this.paused\n      && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))\n\n    return this\n  }\n\n  Carousel.prototype.getActiveIndex = function () {\n    this.$active = this.$element.find('.item.active')\n    this.$items  = this.$active.parent().children()\n\n    return this.$items.index(this.$active)\n  }\n\n  Carousel.prototype.to = function (pos) {\n    var that        = this\n    var activeIndex = this.getActiveIndex()\n\n    if (pos > (this.$items.length - 1) || pos < 0) return\n\n    if (this.sliding)       return this.$element.one('slid.bs.carousel', function () { that.to(pos) })\n    if (activeIndex == pos) return this.pause().cycle()\n\n    return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))\n  }\n\n  Carousel.prototype.pause = function (e) {\n    e || (this.paused = true)\n\n    if (this.$element.find('.next, .prev').length && $.support.transition) {\n      this.$element.trigger($.support.transition.end)\n      this.cycle(true)\n    }\n\n    this.interval = clearInterval(this.interval)\n\n    return this\n  }\n\n  Carousel.prototype.next = function () {\n    if (this.sliding) return\n    return this.slide('next')\n  }\n\n  Carousel.prototype.prev = function () {\n    if (this.sliding) return\n    return this.slide('prev')\n  }\n\n  Carousel.prototype.slide = function (type, next) {\n    var $active   = this.$element.find('.item.active')\n    var $next     = next || $active[type]()\n    var isCycling = this.interval\n    var direction = type == 'next' ? 'left' : 'right'\n    var fallback  = type == 'next' ? 'first' : 'last'\n    var that      = this\n\n    if (!$next.length) {\n      if (!this.options.wrap) return\n      $next = this.$element.find('.item')[fallback]()\n    }\n\n    if ($next.hasClass('active')) return this.sliding = false\n\n    var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })\n    this.$element.trigger(e)\n    if (e.isDefaultPrevented()) return\n\n    this.sliding = true\n\n    isCycling && this.pause()\n\n    if (this.$indicators.length) {\n      this.$indicators.find('.active').removeClass('active')\n      this.$element.one('slid.bs.carousel', function () {\n        var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])\n        $nextIndicator && $nextIndicator.addClass('active')\n      })\n    }\n\n    if ($.support.transition && this.$element.hasClass('slide')) {\n      $next.addClass(type)\n      $next[0].offsetWidth // force reflow\n      $active.addClass(direction)\n      $next.addClass(direction)\n      $active\n        .one($.support.transition.end, function () {\n          $next.removeClass([type, direction].join(' ')).addClass('active')\n          $active.removeClass(['active', direction].join(' '))\n          that.sliding = false\n          setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0)\n        })\n        .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)\n    } else {\n      $active.removeClass('active')\n      $next.addClass('active')\n      this.sliding = false\n      this.$element.trigger('slid.bs.carousel')\n    }\n\n    isCycling && this.cycle()\n\n    return this\n  }\n\n\n  // CAROUSEL PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.carousel\n\n  $.fn.carousel = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.carousel')\n      var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)\n      var action  = typeof option == 'string' ? option : options.slide\n\n      if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))\n      if (typeof option == 'number') data.to(option)\n      else if (action) data[action]()\n      else if (options.interval) data.pause().cycle()\n    })\n  }\n\n  $.fn.carousel.Constructor = Carousel\n\n\n  // CAROUSEL NO CONFLICT\n  // ====================\n\n  $.fn.carousel.noConflict = function () {\n    $.fn.carousel = old\n    return this\n  }\n\n\n  // CAROUSEL DATA-API\n  // =================\n\n  $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {\n    var $this   = $(this), href\n    var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n    var options = $.extend({}, $target.data(), $this.data())\n    var slideIndex = $this.attr('data-slide-to')\n    if (slideIndex) options.interval = false\n\n    $target.carousel(options)\n\n    if (slideIndex = $this.attr('data-slide-to')) {\n      $target.data('bs.carousel').to(slideIndex)\n    }\n\n    e.preventDefault()\n  })\n\n  $(window).on('load', function () {\n    $('[data-ride=\"carousel\"]').each(function () {\n      var $carousel = $(this)\n      $carousel.carousel($carousel.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: collapse.js v3.1.1\n * http://getbootstrap.com/javascript/#collapse\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // COLLAPSE PUBLIC CLASS DEFINITION\n  // ================================\n\n  var Collapse = function (element, options) {\n    this.$element      = $(element)\n    this.options       = $.extend({}, Collapse.DEFAULTS, options)\n    this.transitioning = null\n\n    if (this.options.parent) this.$parent = $(this.options.parent)\n    if (this.options.toggle) this.toggle()\n  }\n\n  Collapse.DEFAULTS = {\n    toggle: true\n  }\n\n  Collapse.prototype.dimension = function () {\n    var hasWidth = this.$element.hasClass('width')\n    return hasWidth ? 'width' : 'height'\n  }\n\n  Collapse.prototype.show = function () {\n    if (this.transitioning || this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('show.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var actives = this.$parent && this.$parent.find('> .panel > .in')\n\n    if (actives && actives.length) {\n      var hasData = actives.data('bs.collapse')\n      if (hasData && hasData.transitioning) return\n      actives.collapse('hide')\n      hasData || actives.data('bs.collapse', null)\n    }\n\n    var dimension = this.dimension()\n\n    this.$element\n      .removeClass('collapse')\n      .addClass('collapsing')\n      [dimension](0)\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.$element\n        .removeClass('collapsing')\n        .addClass('collapse in')\n        [dimension]('auto')\n      this.transitioning = 0\n      this.$element.trigger('shown.bs.collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    var scrollSize = $.camelCase(['scroll', dimension].join('-'))\n\n    this.$element\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n      [dimension](this.$element[0][scrollSize])\n  }\n\n  Collapse.prototype.hide = function () {\n    if (this.transitioning || !this.$element.hasClass('in')) return\n\n    var startEvent = $.Event('hide.bs.collapse')\n    this.$element.trigger(startEvent)\n    if (startEvent.isDefaultPrevented()) return\n\n    var dimension = this.dimension()\n\n    this.$element\n      [dimension](this.$element[dimension]())\n      [0].offsetHeight\n\n    this.$element\n      .addClass('collapsing')\n      .removeClass('collapse')\n      .removeClass('in')\n\n    this.transitioning = 1\n\n    var complete = function () {\n      this.transitioning = 0\n      this.$element\n        .trigger('hidden.bs.collapse')\n        .removeClass('collapsing')\n        .addClass('collapse')\n    }\n\n    if (!$.support.transition) return complete.call(this)\n\n    this.$element\n      [dimension](0)\n      .one($.support.transition.end, $.proxy(complete, this))\n      .emulateTransitionEnd(350)\n  }\n\n  Collapse.prototype.toggle = function () {\n    this[this.$element.hasClass('in') ? 'hide' : 'show']()\n  }\n\n\n  // COLLAPSE PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.collapse\n\n  $.fn.collapse = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.collapse')\n      var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data && options.toggle && option == 'show') option = !option\n      if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.collapse.Constructor = Collapse\n\n\n  // COLLAPSE NO CONFLICT\n  // ====================\n\n  $.fn.collapse.noConflict = function () {\n    $.fn.collapse = old\n    return this\n  }\n\n\n  // COLLAPSE DATA-API\n  // =================\n\n  $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {\n    var $this   = $(this), href\n    var target  = $this.attr('data-target')\n        || e.preventDefault()\n        || (href = $this.attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '') //strip for ie7\n    var $target = $(target)\n    var data    = $target.data('bs.collapse')\n    var option  = data ? 'toggle' : $this.data()\n    var parent  = $this.attr('data-parent')\n    var $parent = parent && $(parent)\n\n    if (!data || !data.transitioning) {\n      if ($parent) $parent.find('[data-toggle=collapse][data-parent=\"' + parent + '\"]').not($this).addClass('collapsed')\n      $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')\n    }\n\n    $target.collapse(option)\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: dropdown.js v3.1.1\n * http://getbootstrap.com/javascript/#dropdowns\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // DROPDOWN CLASS DEFINITION\n  // =========================\n\n  var backdrop = '.dropdown-backdrop'\n  var toggle   = '[data-toggle=dropdown]'\n  var Dropdown = function (element) {\n    $(element).on('click.bs.dropdown', this.toggle)\n  }\n\n  Dropdown.prototype.toggle = function (e) {\n    var $this = $(this)\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    clearMenus()\n\n    if (!isActive) {\n      if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {\n        // if mobile we use a backdrop because click events don't delegate\n        $('<div class=\"dropdown-backdrop\"/>').insertAfter($(this)).on('click', clearMenus)\n      }\n\n      var relatedTarget = { relatedTarget: this }\n      $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))\n\n      if (e.isDefaultPrevented()) return\n\n      $parent\n        .toggleClass('open')\n        .trigger('shown.bs.dropdown', relatedTarget)\n\n      $this.focus()\n    }\n\n    return false\n  }\n\n  Dropdown.prototype.keydown = function (e) {\n    if (!/(38|40|27)/.test(e.keyCode)) return\n\n    var $this = $(this)\n\n    e.preventDefault()\n    e.stopPropagation()\n\n    if ($this.is('.disabled, :disabled')) return\n\n    var $parent  = getParent($this)\n    var isActive = $parent.hasClass('open')\n\n    if (!isActive || (isActive && e.keyCode == 27)) {\n      if (e.which == 27) $parent.find(toggle).focus()\n      return $this.click()\n    }\n\n    var desc = ' li:not(.divider):visible a'\n    var $items = $parent.find('[role=menu]' + desc + ', [role=listbox]' + desc)\n\n    if (!$items.length) return\n\n    var index = $items.index($items.filter(':focus'))\n\n    if (e.keyCode == 38 && index > 0)                 index--                        // up\n    if (e.keyCode == 40 && index < $items.length - 1) index++                        // down\n    if (!~index)                                      index = 0\n\n    $items.eq(index).focus()\n  }\n\n  function clearMenus(e) {\n    $(backdrop).remove()\n    $(toggle).each(function () {\n      var $parent = getParent($(this))\n      var relatedTarget = { relatedTarget: this }\n      if (!$parent.hasClass('open')) return\n      $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))\n      if (e.isDefaultPrevented()) return\n      $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)\n    })\n  }\n\n  function getParent($this) {\n    var selector = $this.attr('data-target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    var $parent = selector && $(selector)\n\n    return $parent && $parent.length ? $parent : $this.parent()\n  }\n\n\n  // DROPDOWN PLUGIN DEFINITION\n  // ==========================\n\n  var old = $.fn.dropdown\n\n  $.fn.dropdown = function (option) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.dropdown')\n\n      if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))\n      if (typeof option == 'string') data[option].call($this)\n    })\n  }\n\n  $.fn.dropdown.Constructor = Dropdown\n\n\n  // DROPDOWN NO CONFLICT\n  // ====================\n\n  $.fn.dropdown.noConflict = function () {\n    $.fn.dropdown = old\n    return this\n  }\n\n\n  // APPLY TO STANDARD DROPDOWN ELEMENTS\n  // ===================================\n\n  $(document)\n    .on('click.bs.dropdown.data-api', clearMenus)\n    .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })\n    .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)\n    .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu], [role=listbox]', Dropdown.prototype.keydown)\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: modal.js v3.1.1\n * http://getbootstrap.com/javascript/#modals\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // MODAL CLASS DEFINITION\n  // ======================\n\n  var Modal = function (element, options) {\n    this.options   = options\n    this.$element  = $(element)\n    this.$backdrop =\n    this.isShown   = null\n\n    if (this.options.remote) {\n      this.$element\n        .find('.modal-content')\n        .load(this.options.remote, $.proxy(function () {\n          this.$element.trigger('loaded.bs.modal')\n        }, this))\n    }\n  }\n\n  Modal.DEFAULTS = {\n    backdrop: true,\n    keyboard: true,\n    show: true\n  }\n\n  Modal.prototype.toggle = function (_relatedTarget) {\n    return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)\n  }\n\n  Modal.prototype.show = function (_relatedTarget) {\n    var that = this\n    var e    = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })\n\n    this.$element.trigger(e)\n\n    if (this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = true\n\n    this.escape()\n\n    this.$element.on('click.dismiss.bs.modal', '[data-dismiss=\"modal\"]', $.proxy(this.hide, this))\n\n    this.backdrop(function () {\n      var transition = $.support.transition && that.$element.hasClass('fade')\n\n      if (!that.$element.parent().length) {\n        that.$element.appendTo(document.body) // don't move modals dom position\n      }\n\n      that.$element\n        .show()\n        .scrollTop(0)\n\n      if (transition) {\n        that.$element[0].offsetWidth // force reflow\n      }\n\n      that.$element\n        .addClass('in')\n        .attr('aria-hidden', false)\n\n      that.enforceFocus()\n\n      var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })\n\n      transition ?\n        that.$element.find('.modal-dialog') // wait for modal to slide in\n          .one($.support.transition.end, function () {\n            that.$element.focus().trigger(e)\n          })\n          .emulateTransitionEnd(300) :\n        that.$element.focus().trigger(e)\n    })\n  }\n\n  Modal.prototype.hide = function (e) {\n    if (e) e.preventDefault()\n\n    e = $.Event('hide.bs.modal')\n\n    this.$element.trigger(e)\n\n    if (!this.isShown || e.isDefaultPrevented()) return\n\n    this.isShown = false\n\n    this.escape()\n\n    $(document).off('focusin.bs.modal')\n\n    this.$element\n      .removeClass('in')\n      .attr('aria-hidden', true)\n      .off('click.dismiss.bs.modal')\n\n    $.support.transition && this.$element.hasClass('fade') ?\n      this.$element\n        .one($.support.transition.end, $.proxy(this.hideModal, this))\n        .emulateTransitionEnd(300) :\n      this.hideModal()\n  }\n\n  Modal.prototype.enforceFocus = function () {\n    $(document)\n      .off('focusin.bs.modal') // guard against infinite focus loop\n      .on('focusin.bs.modal', $.proxy(function (e) {\n        if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {\n          this.$element.focus()\n        }\n      }, this))\n  }\n\n  Modal.prototype.escape = function () {\n    if (this.isShown && this.options.keyboard) {\n      this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {\n        e.which == 27 && this.hide()\n      }, this))\n    } else if (!this.isShown) {\n      this.$element.off('keyup.dismiss.bs.modal')\n    }\n  }\n\n  Modal.prototype.hideModal = function () {\n    var that = this\n    this.$element.hide()\n    this.backdrop(function () {\n      that.removeBackdrop()\n      that.$element.trigger('hidden.bs.modal')\n    })\n  }\n\n  Modal.prototype.removeBackdrop = function () {\n    this.$backdrop && this.$backdrop.remove()\n    this.$backdrop = null\n  }\n\n  Modal.prototype.backdrop = function (callback) {\n    var animate = this.$element.hasClass('fade') ? 'fade' : ''\n\n    if (this.isShown && this.options.backdrop) {\n      var doAnimate = $.support.transition && animate\n\n      this.$backdrop = $('<div class=\"modal-backdrop ' + animate + '\" />')\n        .appendTo(document.body)\n\n      this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {\n        if (e.target !== e.currentTarget) return\n        this.options.backdrop == 'static'\n          ? this.$element[0].focus.call(this.$element[0])\n          : this.hide.call(this)\n      }, this))\n\n      if (doAnimate) this.$backdrop[0].offsetWidth // force reflow\n\n      this.$backdrop.addClass('in')\n\n      if (!callback) return\n\n      doAnimate ?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (!this.isShown && this.$backdrop) {\n      this.$backdrop.removeClass('in')\n\n      $.support.transition && this.$element.hasClass('fade') ?\n        this.$backdrop\n          .one($.support.transition.end, callback)\n          .emulateTransitionEnd(150) :\n        callback()\n\n    } else if (callback) {\n      callback()\n    }\n  }\n\n\n  // MODAL PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.modal\n\n  $.fn.modal = function (option, _relatedTarget) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.modal')\n      var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)\n\n      if (!data) $this.data('bs.modal', (data = new Modal(this, options)))\n      if (typeof option == 'string') data[option](_relatedTarget)\n      else if (options.show) data.show(_relatedTarget)\n    })\n  }\n\n  $.fn.modal.Constructor = Modal\n\n\n  // MODAL NO CONFLICT\n  // =================\n\n  $.fn.modal.noConflict = function () {\n    $.fn.modal = old\n    return this\n  }\n\n\n  // MODAL DATA-API\n  // ==============\n\n  $(document).on('click.bs.modal.data-api', '[data-toggle=\"modal\"]', function (e) {\n    var $this   = $(this)\n    var href    = $this.attr('href')\n    var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\\s]+$)/, ''))) //strip for ie7\n    var option  = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())\n\n    if ($this.is('a')) e.preventDefault()\n\n    $target\n      .modal(option, this)\n      .one('hide', function () {\n        $this.is(':visible') && $this.focus()\n      })\n  })\n\n  $(document)\n    .on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') })\n    .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tooltip.js v3.1.1\n * http://getbootstrap.com/javascript/#tooltip\n * Inspired by the original jQuery.tipsy by Jason Frame\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TOOLTIP PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Tooltip = function (element, options) {\n    this.type       =\n    this.options    =\n    this.enabled    =\n    this.timeout    =\n    this.hoverState =\n    this.$element   = null\n\n    this.init('tooltip', element, options)\n  }\n\n  Tooltip.DEFAULTS = {\n    animation: true,\n    placement: 'top',\n    selector: false,\n    template: '<div class=\"tooltip\"><div class=\"tooltip-arrow\"></div><div class=\"tooltip-inner\"></div></div>',\n    trigger: 'hover focus',\n    title: '',\n    delay: 0,\n    html: false,\n    container: false\n  }\n\n  Tooltip.prototype.init = function (type, element, options) {\n    this.enabled  = true\n    this.type     = type\n    this.$element = $(element)\n    this.options  = this.getOptions(options)\n\n    var triggers = this.options.trigger.split(' ')\n\n    for (var i = triggers.length; i--;) {\n      var trigger = triggers[i]\n\n      if (trigger == 'click') {\n        this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))\n      } else if (trigger != 'manual') {\n        var eventIn  = trigger == 'hover' ? 'mouseenter' : 'focusin'\n        var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'\n\n        this.$element.on(eventIn  + '.' + this.type, this.options.selector, $.proxy(this.enter, this))\n        this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))\n      }\n    }\n\n    this.options.selector ?\n      (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :\n      this.fixTitle()\n  }\n\n  Tooltip.prototype.getDefaults = function () {\n    return Tooltip.DEFAULTS\n  }\n\n  Tooltip.prototype.getOptions = function (options) {\n    options = $.extend({}, this.getDefaults(), this.$element.data(), options)\n\n    if (options.delay && typeof options.delay == 'number') {\n      options.delay = {\n        show: options.delay,\n        hide: options.delay\n      }\n    }\n\n    return options\n  }\n\n  Tooltip.prototype.getDelegateOptions = function () {\n    var options  = {}\n    var defaults = this.getDefaults()\n\n    this._options && $.each(this._options, function (key, value) {\n      if (defaults[key] != value) options[key] = value\n    })\n\n    return options\n  }\n\n  Tooltip.prototype.enter = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'in'\n\n    if (!self.options.delay || !self.options.delay.show) return self.show()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'in') self.show()\n    }, self.options.delay.show)\n  }\n\n  Tooltip.prototype.leave = function (obj) {\n    var self = obj instanceof this.constructor ?\n      obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)\n\n    clearTimeout(self.timeout)\n\n    self.hoverState = 'out'\n\n    if (!self.options.delay || !self.options.delay.hide) return self.hide()\n\n    self.timeout = setTimeout(function () {\n      if (self.hoverState == 'out') self.hide()\n    }, self.options.delay.hide)\n  }\n\n  Tooltip.prototype.show = function () {\n    var e = $.Event('show.bs.' + this.type)\n\n    if (this.hasContent() && this.enabled) {\n      this.$element.trigger(e)\n\n      if (e.isDefaultPrevented()) return\n      var that = this;\n\n      var $tip = this.tip()\n\n      this.setContent()\n\n      if (this.options.animation) $tip.addClass('fade')\n\n      var placement = typeof this.options.placement == 'function' ?\n        this.options.placement.call(this, $tip[0], this.$element[0]) :\n        this.options.placement\n\n      var autoToken = /\\s?auto?\\s?/i\n      var autoPlace = autoToken.test(placement)\n      if (autoPlace) placement = placement.replace(autoToken, '') || 'top'\n\n      $tip\n        .detach()\n        .css({ top: 0, left: 0, display: 'block' })\n        .addClass(placement)\n\n      this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)\n\n      var pos          = this.getPosition()\n      var actualWidth  = $tip[0].offsetWidth\n      var actualHeight = $tip[0].offsetHeight\n\n      if (autoPlace) {\n        var $parent = this.$element.parent()\n\n        var orgPlacement = placement\n        var docScroll    = document.documentElement.scrollTop || document.body.scrollTop\n        var parentWidth  = this.options.container == 'body' ? window.innerWidth  : $parent.outerWidth()\n        var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()\n        var parentLeft   = this.options.container == 'body' ? 0 : $parent.offset().left\n\n        placement = placement == 'bottom' && pos.top   + pos.height  + actualHeight - docScroll > parentHeight  ? 'top'    :\n                    placement == 'top'    && pos.top   - docScroll   - actualHeight < 0                         ? 'bottom' :\n                    placement == 'right'  && pos.right + actualWidth > parentWidth                              ? 'left'   :\n                    placement == 'left'   && pos.left  - actualWidth < parentLeft                               ? 'right'  :\n                    placement\n\n        $tip\n          .removeClass(orgPlacement)\n          .addClass(placement)\n      }\n\n      var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)\n\n      this.applyPlacement(calculatedOffset, placement)\n      this.hoverState = null\n\n      var complete = function() {\n        that.$element.trigger('shown.bs.' + that.type)\n      }\n\n      $.support.transition && this.$tip.hasClass('fade') ?\n        $tip\n          .one($.support.transition.end, complete)\n          .emulateTransitionEnd(150) :\n        complete()\n    }\n  }\n\n  Tooltip.prototype.applyPlacement = function (offset, placement) {\n    var replace\n    var $tip   = this.tip()\n    var width  = $tip[0].offsetWidth\n    var height = $tip[0].offsetHeight\n\n    // manually read margins because getBoundingClientRect includes difference\n    var marginTop = parseInt($tip.css('margin-top'), 10)\n    var marginLeft = parseInt($tip.css('margin-left'), 10)\n\n    // we must check for NaN for ie 8/9\n    if (isNaN(marginTop))  marginTop  = 0\n    if (isNaN(marginLeft)) marginLeft = 0\n\n    offset.top  = offset.top  + marginTop\n    offset.left = offset.left + marginLeft\n\n    // $.fn.offset doesn't round pixel values\n    // so we use setOffset directly with our own function B-0\n    $.offset.setOffset($tip[0], $.extend({\n      using: function (props) {\n        $tip.css({\n          top: Math.round(props.top),\n          left: Math.round(props.left)\n        })\n      }\n    }, offset), 0)\n\n    $tip.addClass('in')\n\n    // check to see if placing tip in new offset caused the tip to resize itself\n    var actualWidth  = $tip[0].offsetWidth\n    var actualHeight = $tip[0].offsetHeight\n\n    if (placement == 'top' && actualHeight != height) {\n      replace = true\n      offset.top = offset.top + height - actualHeight\n    }\n\n    if (/bottom|top/.test(placement)) {\n      var delta = 0\n\n      if (offset.left < 0) {\n        delta       = offset.left * -2\n        offset.left = 0\n\n        $tip.offset(offset)\n\n        actualWidth  = $tip[0].offsetWidth\n        actualHeight = $tip[0].offsetHeight\n      }\n\n      this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')\n    } else {\n      this.replaceArrow(actualHeight - height, actualHeight, 'top')\n    }\n\n    if (replace) $tip.offset(offset)\n  }\n\n  Tooltip.prototype.replaceArrow = function (delta, dimension, position) {\n    this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '')\n  }\n\n  Tooltip.prototype.setContent = function () {\n    var $tip  = this.tip()\n    var title = this.getTitle()\n\n    $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)\n    $tip.removeClass('fade in top bottom left right')\n  }\n\n  Tooltip.prototype.hide = function () {\n    var that = this\n    var $tip = this.tip()\n    var e    = $.Event('hide.bs.' + this.type)\n\n    function complete() {\n      if (that.hoverState != 'in') $tip.detach()\n      that.$element.trigger('hidden.bs.' + that.type)\n    }\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    $tip.removeClass('in')\n\n    $.support.transition && this.$tip.hasClass('fade') ?\n      $tip\n        .one($.support.transition.end, complete)\n        .emulateTransitionEnd(150) :\n      complete()\n\n    this.hoverState = null\n\n    return this\n  }\n\n  Tooltip.prototype.fixTitle = function () {\n    var $e = this.$element\n    if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {\n      $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')\n    }\n  }\n\n  Tooltip.prototype.hasContent = function () {\n    return this.getTitle()\n  }\n\n  Tooltip.prototype.getPosition = function () {\n    var el = this.$element[0]\n    return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {\n      width: el.offsetWidth,\n      height: el.offsetHeight\n    }, this.$element.offset())\n  }\n\n  Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {\n    return placement == 'bottom' ? { top: pos.top + pos.height,   left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'top'    ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2  } :\n           placement == 'left'   ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :\n        /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width   }\n  }\n\n  Tooltip.prototype.getTitle = function () {\n    var title\n    var $e = this.$element\n    var o  = this.options\n\n    title = $e.attr('data-original-title')\n      || (typeof o.title == 'function' ? o.title.call($e[0]) :  o.title)\n\n    return title\n  }\n\n  Tooltip.prototype.tip = function () {\n    return this.$tip = this.$tip || $(this.options.template)\n  }\n\n  Tooltip.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')\n  }\n\n  Tooltip.prototype.validate = function () {\n    if (!this.$element[0].parentNode) {\n      this.hide()\n      this.$element = null\n      this.options  = null\n    }\n  }\n\n  Tooltip.prototype.enable = function () {\n    this.enabled = true\n  }\n\n  Tooltip.prototype.disable = function () {\n    this.enabled = false\n  }\n\n  Tooltip.prototype.toggleEnabled = function () {\n    this.enabled = !this.enabled\n  }\n\n  Tooltip.prototype.toggle = function (e) {\n    var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this\n    self.tip().hasClass('in') ? self.leave(self) : self.enter(self)\n  }\n\n  Tooltip.prototype.destroy = function () {\n    clearTimeout(this.timeout)\n    this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)\n  }\n\n\n  // TOOLTIP PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.tooltip\n\n  $.fn.tooltip = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.tooltip')\n      var options = typeof option == 'object' && option\n\n      if (!data && option == 'destroy') return\n      if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tooltip.Constructor = Tooltip\n\n\n  // TOOLTIP NO CONFLICT\n  // ===================\n\n  $.fn.tooltip.noConflict = function () {\n    $.fn.tooltip = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: popover.js v3.1.1\n * http://getbootstrap.com/javascript/#popovers\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // POPOVER PUBLIC CLASS DEFINITION\n  // ===============================\n\n  var Popover = function (element, options) {\n    this.init('popover', element, options)\n  }\n\n  if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')\n\n  Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {\n    placement: 'right',\n    trigger: 'click',\n    content: '',\n    template: '<div class=\"popover\"><div class=\"arrow\"></div><h3 class=\"popover-title\"></h3><div class=\"popover-content\"></div></div>'\n  })\n\n\n  // NOTE: POPOVER EXTENDS tooltip.js\n  // ================================\n\n  Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)\n\n  Popover.prototype.constructor = Popover\n\n  Popover.prototype.getDefaults = function () {\n    return Popover.DEFAULTS\n  }\n\n  Popover.prototype.setContent = function () {\n    var $tip    = this.tip()\n    var title   = this.getTitle()\n    var content = this.getContent()\n\n    $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)\n    $tip.find('.popover-content')[ // we use append for html objects to maintain js events\n      this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'\n    ](content)\n\n    $tip.removeClass('fade top bottom left right in')\n\n    // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do\n    // this manually by checking the contents.\n    if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()\n  }\n\n  Popover.prototype.hasContent = function () {\n    return this.getTitle() || this.getContent()\n  }\n\n  Popover.prototype.getContent = function () {\n    var $e = this.$element\n    var o  = this.options\n\n    return $e.attr('data-content')\n      || (typeof o.content == 'function' ?\n            o.content.call($e[0]) :\n            o.content)\n  }\n\n  Popover.prototype.arrow = function () {\n    return this.$arrow = this.$arrow || this.tip().find('.arrow')\n  }\n\n  Popover.prototype.tip = function () {\n    if (!this.$tip) this.$tip = $(this.options.template)\n    return this.$tip\n  }\n\n\n  // POPOVER PLUGIN DEFINITION\n  // =========================\n\n  var old = $.fn.popover\n\n  $.fn.popover = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.popover')\n      var options = typeof option == 'object' && option\n\n      if (!data && option == 'destroy') return\n      if (!data) $this.data('bs.popover', (data = new Popover(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.popover.Constructor = Popover\n\n\n  // POPOVER NO CONFLICT\n  // ===================\n\n  $.fn.popover.noConflict = function () {\n    $.fn.popover = old\n    return this\n  }\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: scrollspy.js v3.1.1\n * http://getbootstrap.com/javascript/#scrollspy\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // SCROLLSPY CLASS DEFINITION\n  // ==========================\n\n  function ScrollSpy(element, options) {\n    var href\n    var process  = $.proxy(this.process, this)\n\n    this.$element       = $(element).is('body') ? $(window) : $(element)\n    this.$body          = $('body')\n    this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)\n    this.options        = $.extend({}, ScrollSpy.DEFAULTS, options)\n    this.selector       = (this.options.target\n      || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\\s]+$)/, '')) //strip for ie7\n      || '') + ' .nav li > a'\n    this.offsets        = $([])\n    this.targets        = $([])\n    this.activeTarget   = null\n\n    this.refresh()\n    this.process()\n  }\n\n  ScrollSpy.DEFAULTS = {\n    offset: 10\n  }\n\n  ScrollSpy.prototype.refresh = function () {\n    var offsetMethod = this.$element[0] == window ? 'offset' : 'position'\n\n    this.offsets = $([])\n    this.targets = $([])\n\n    var self     = this\n    var $targets = this.$body\n      .find(this.selector)\n      .map(function () {\n        var $el   = $(this)\n        var href  = $el.data('target') || $el.attr('href')\n        var $href = /^#./.test(href) && $(href)\n\n        return ($href\n          && $href.length\n          && $href.is(':visible')\n          && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null\n      })\n      .sort(function (a, b) { return a[0] - b[0] })\n      .each(function () {\n        self.offsets.push(this[0])\n        self.targets.push(this[1])\n      })\n  }\n\n  ScrollSpy.prototype.process = function () {\n    var scrollTop    = this.$scrollElement.scrollTop() + this.options.offset\n    var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight\n    var maxScroll    = scrollHeight - this.$scrollElement.height()\n    var offsets      = this.offsets\n    var targets      = this.targets\n    var activeTarget = this.activeTarget\n    var i\n\n    if (scrollTop >= maxScroll) {\n      return activeTarget != (i = targets.last()[0]) && this.activate(i)\n    }\n\n    if (activeTarget && scrollTop <= offsets[0]) {\n      return activeTarget != (i = targets[0]) && this.activate(i)\n    }\n\n    for (i = offsets.length; i--;) {\n      activeTarget != targets[i]\n        && scrollTop >= offsets[i]\n        && (!offsets[i + 1] || scrollTop <= offsets[i + 1])\n        && this.activate( targets[i] )\n    }\n  }\n\n  ScrollSpy.prototype.activate = function (target) {\n    this.activeTarget = target\n\n    $(this.selector)\n      .parentsUntil(this.options.target, '.active')\n      .removeClass('active')\n\n    var selector = this.selector +\n        '[data-target=\"' + target + '\"],' +\n        this.selector + '[href=\"' + target + '\"]'\n\n    var active = $(selector)\n      .parents('li')\n      .addClass('active')\n\n    if (active.parent('.dropdown-menu').length) {\n      active = active\n        .closest('li.dropdown')\n        .addClass('active')\n    }\n\n    active.trigger('activate.bs.scrollspy')\n  }\n\n\n  // SCROLLSPY PLUGIN DEFINITION\n  // ===========================\n\n  var old = $.fn.scrollspy\n\n  $.fn.scrollspy = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.scrollspy')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.scrollspy.Constructor = ScrollSpy\n\n\n  // SCROLLSPY NO CONFLICT\n  // =====================\n\n  $.fn.scrollspy.noConflict = function () {\n    $.fn.scrollspy = old\n    return this\n  }\n\n\n  // SCROLLSPY DATA-API\n  // ==================\n\n  $(window).on('load', function () {\n    $('[data-spy=\"scroll\"]').each(function () {\n      var $spy = $(this)\n      $spy.scrollspy($spy.data())\n    })\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: tab.js v3.1.1\n * http://getbootstrap.com/javascript/#tabs\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // TAB CLASS DEFINITION\n  // ====================\n\n  var Tab = function (element) {\n    this.element = $(element)\n  }\n\n  Tab.prototype.show = function () {\n    var $this    = this.element\n    var $ul      = $this.closest('ul:not(.dropdown-menu)')\n    var selector = $this.data('target')\n\n    if (!selector) {\n      selector = $this.attr('href')\n      selector = selector && selector.replace(/.*(?=#[^\\s]*$)/, '') //strip for ie7\n    }\n\n    if ($this.parent('li').hasClass('active')) return\n\n    var previous = $ul.find('.active:last a')[0]\n    var e        = $.Event('show.bs.tab', {\n      relatedTarget: previous\n    })\n\n    $this.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    var $target = $(selector)\n\n    this.activate($this.parent('li'), $ul)\n    this.activate($target, $target.parent(), function () {\n      $this.trigger({\n        type: 'shown.bs.tab',\n        relatedTarget: previous\n      })\n    })\n  }\n\n  Tab.prototype.activate = function (element, container, callback) {\n    var $active    = container.find('> .active')\n    var transition = callback\n      && $.support.transition\n      && $active.hasClass('fade')\n\n    function next() {\n      $active\n        .removeClass('active')\n        .find('> .dropdown-menu > .active')\n        .removeClass('active')\n\n      element.addClass('active')\n\n      if (transition) {\n        element[0].offsetWidth // reflow for transition\n        element.addClass('in')\n      } else {\n        element.removeClass('fade')\n      }\n\n      if (element.parent('.dropdown-menu')) {\n        element.closest('li.dropdown').addClass('active')\n      }\n\n      callback && callback()\n    }\n\n    transition ?\n      $active\n        .one($.support.transition.end, next)\n        .emulateTransitionEnd(150) :\n      next()\n\n    $active.removeClass('in')\n  }\n\n\n  // TAB PLUGIN DEFINITION\n  // =====================\n\n  var old = $.fn.tab\n\n  $.fn.tab = function ( option ) {\n    return this.each(function () {\n      var $this = $(this)\n      var data  = $this.data('bs.tab')\n\n      if (!data) $this.data('bs.tab', (data = new Tab(this)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.tab.Constructor = Tab\n\n\n  // TAB NO CONFLICT\n  // ===============\n\n  $.fn.tab.noConflict = function () {\n    $.fn.tab = old\n    return this\n  }\n\n\n  // TAB DATA-API\n  // ============\n\n  $(document).on('click.bs.tab.data-api', '[data-toggle=\"tab\"], [data-toggle=\"pill\"]', function (e) {\n    e.preventDefault()\n    $(this).tab('show')\n  })\n\n}(jQuery);\n\n/* ========================================================================\n * Bootstrap: affix.js v3.1.1\n * http://getbootstrap.com/javascript/#affix\n * ========================================================================\n * Copyright 2011-2014 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n * ======================================================================== */\n\n\n+function ($) {\n  'use strict';\n\n  // AFFIX CLASS DEFINITION\n  // ======================\n\n  var Affix = function (element, options) {\n    this.options = $.extend({}, Affix.DEFAULTS, options)\n    this.$window = $(window)\n      .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))\n      .on('click.bs.affix.data-api',  $.proxy(this.checkPositionWithEventLoop, this))\n\n    this.$element     = $(element)\n    this.affixed      =\n    this.unpin        =\n    this.pinnedOffset = null\n\n    this.checkPosition()\n  }\n\n  Affix.RESET = 'affix affix-top affix-bottom'\n\n  Affix.DEFAULTS = {\n    offset: 0\n  }\n\n  Affix.prototype.getPinnedOffset = function () {\n    if (this.pinnedOffset) return this.pinnedOffset\n    this.$element.removeClass(Affix.RESET).addClass('affix')\n    var scrollTop = this.$window.scrollTop()\n    var position  = this.$element.offset()\n    return (this.pinnedOffset = position.top - scrollTop)\n  }\n\n  Affix.prototype.checkPositionWithEventLoop = function () {\n    setTimeout($.proxy(this.checkPosition, this), 1)\n  }\n\n  Affix.prototype.checkPosition = function () {\n    if (!this.$element.is(':visible')) return\n\n    var scrollHeight = $(document).height()\n    var scrollTop    = this.$window.scrollTop()\n    var position     = this.$element.offset()\n    var offset       = this.options.offset\n    var offsetTop    = offset.top\n    var offsetBottom = offset.bottom\n\n    if (this.affixed == 'top') position.top += scrollTop\n\n    if (typeof offset != 'object')         offsetBottom = offsetTop = offset\n    if (typeof offsetTop == 'function')    offsetTop    = offset.top(this.$element)\n    if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)\n\n    var affix = this.unpin   != null && (scrollTop + this.unpin <= position.top) ? false :\n                offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :\n                offsetTop    != null && (scrollTop <= offsetTop) ? 'top' : false\n\n    if (this.affixed === affix) return\n    if (this.unpin) this.$element.css('top', '')\n\n    var affixType = 'affix' + (affix ? '-' + affix : '')\n    var e         = $.Event(affixType + '.bs.affix')\n\n    this.$element.trigger(e)\n\n    if (e.isDefaultPrevented()) return\n\n    this.affixed = affix\n    this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null\n\n    this.$element\n      .removeClass(Affix.RESET)\n      .addClass(affixType)\n      .trigger($.Event(affixType.replace('affix', 'affixed')))\n\n    if (affix == 'bottom') {\n      this.$element.offset({ top: scrollHeight - offsetBottom - this.$element.height() })\n    }\n  }\n\n\n  // AFFIX PLUGIN DEFINITION\n  // =======================\n\n  var old = $.fn.affix\n\n  $.fn.affix = function (option) {\n    return this.each(function () {\n      var $this   = $(this)\n      var data    = $this.data('bs.affix')\n      var options = typeof option == 'object' && option\n\n      if (!data) $this.data('bs.affix', (data = new Affix(this, options)))\n      if (typeof option == 'string') data[option]()\n    })\n  }\n\n  $.fn.affix.Constructor = Affix\n\n\n  // AFFIX NO CONFLICT\n  // =================\n\n  $.fn.affix.noConflict = function () {\n    $.fn.affix = old\n    return this\n  }\n\n\n  // AFFIX DATA-API\n  // ==============\n\n  $(window).on('load', function () {\n    $('[data-spy=\"affix\"]').each(function () {\n      var $spy = $(this)\n      var data = $spy.data()\n\n      data.offset = data.offset || {}\n\n      if (data.offsetBottom) data.offset.bottom = data.offsetBottom\n      if (data.offsetTop)    data.offset.top    = data.offsetTop\n\n      $spy.affix(data)\n    })\n  })\n\n}(jQuery);\n"
  },
  {
    "path": "browser/vendor/borismus/ray-input.js",
    "content": "(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.RayInput = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n'use strict';\n\nvar has = Object.prototype.hasOwnProperty;\n\n//\n// We store our EE objects in a plain object whose properties are event names.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// `~` to make sure that the built-in object properties are not overridden or\n// used as an attack vector.\n// We also assume that `Object.create(null)` is available when the event name\n// is an ES6 Symbol.\n//\nvar prefix = typeof Object.create !== 'function' ? '~' : false;\n\n/**\n * Representation of a single EventEmitter function.\n *\n * @param {Function} fn Event handler to be called.\n * @param {Mixed} context Context for function execution.\n * @param {Boolean} [once=false] Only emit once\n * @api private\n */\nfunction EE(fn, context, once) {\n  this.fn = fn;\n  this.context = context;\n  this.once = once || false;\n}\n\n/**\n * Minimal EventEmitter interface that is molded against the Node.js\n * EventEmitter interface.\n *\n * @constructor\n * @api public\n */\nfunction EventEmitter() { /* Nothing to set */ }\n\n/**\n * Hold the assigned EventEmitters by name.\n *\n * @type {Object}\n * @private\n */\nEventEmitter.prototype._events = undefined;\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @api public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n  var events = this._events\n    , names = []\n    , name;\n\n  if (!events) return names;\n\n  for (name in events) {\n    if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n  }\n\n  if (Object.getOwnPropertySymbols) {\n    return names.concat(Object.getOwnPropertySymbols(events));\n  }\n\n  return names;\n};\n\n/**\n * Return a list of assigned event listeners.\n *\n * @param {String} event The events that should be listed.\n * @param {Boolean} exists We only need to know if there are listeners.\n * @returns {Array|Boolean}\n * @api public\n */\nEventEmitter.prototype.listeners = function listeners(event, exists) {\n  var evt = prefix ? prefix + event : event\n    , available = this._events && this._events[evt];\n\n  if (exists) return !!available;\n  if (!available) return [];\n  if (available.fn) return [available.fn];\n\n  for (var i = 0, l = available.length, ee = new Array(l); i < l; i++) {\n    ee[i] = available[i].fn;\n  }\n\n  return ee;\n};\n\n/**\n * Emit an event to all registered event listeners.\n *\n * @param {String} event The name of the event.\n * @returns {Boolean} Indication if we've emitted an event.\n * @api public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events || !this._events[evt]) return false;\n\n  var listeners = this._events[evt]\n    , len = arguments.length\n    , args\n    , i;\n\n  if ('function' === typeof listeners.fn) {\n    if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n    switch (len) {\n      case 1: return listeners.fn.call(listeners.context), true;\n      case 2: return listeners.fn.call(listeners.context, a1), true;\n      case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n      case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n      case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n      case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n    }\n\n    for (i = 1, args = new Array(len -1); i < len; i++) {\n      args[i - 1] = arguments[i];\n    }\n\n    listeners.fn.apply(listeners.context, args);\n  } else {\n    var length = listeners.length\n      , j;\n\n    for (i = 0; i < length; i++) {\n      if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n      switch (len) {\n        case 1: listeners[i].fn.call(listeners[i].context); break;\n        case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n        case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n        default:\n          if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n            args[j - 1] = arguments[j];\n          }\n\n          listeners[i].fn.apply(listeners[i].context, args);\n      }\n    }\n  }\n\n  return true;\n};\n\n/**\n * Register a new EventListener for the given event.\n *\n * @param {String} event Name of the event.\n * @param {Function} fn Callback function.\n * @param {Mixed} [context=this] The context of the function.\n * @api public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n  var listener = new EE(fn, context || this)\n    , evt = prefix ? prefix + event : event;\n\n  if (!this._events) this._events = prefix ? {} : Object.create(null);\n  if (!this._events[evt]) this._events[evt] = listener;\n  else {\n    if (!this._events[evt].fn) this._events[evt].push(listener);\n    else this._events[evt] = [\n      this._events[evt], listener\n    ];\n  }\n\n  return this;\n};\n\n/**\n * Add an EventListener that's only called once.\n *\n * @param {String} event Name of the event.\n * @param {Function} fn Callback function.\n * @param {Mixed} [context=this] The context of the function.\n * @api public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n  var listener = new EE(fn, context || this, true)\n    , evt = prefix ? prefix + event : event;\n\n  if (!this._events) this._events = prefix ? {} : Object.create(null);\n  if (!this._events[evt]) this._events[evt] = listener;\n  else {\n    if (!this._events[evt].fn) this._events[evt].push(listener);\n    else this._events[evt] = [\n      this._events[evt], listener\n    ];\n  }\n\n  return this;\n};\n\n/**\n * Remove event listeners.\n *\n * @param {String} event The event we want to remove.\n * @param {Function} fn The listener that we need to find.\n * @param {Mixed} context Only remove listeners matching this context.\n * @param {Boolean} once Only remove once listeners.\n * @api public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events || !this._events[evt]) return this;\n\n  var listeners = this._events[evt]\n    , events = [];\n\n  if (fn) {\n    if (listeners.fn) {\n      if (\n           listeners.fn !== fn\n        || (once && !listeners.once)\n        || (context && listeners.context !== context)\n      ) {\n        events.push(listeners);\n      }\n    } else {\n      for (var i = 0, length = listeners.length; i < length; i++) {\n        if (\n             listeners[i].fn !== fn\n          || (once && !listeners[i].once)\n          || (context && listeners[i].context !== context)\n        ) {\n          events.push(listeners[i]);\n        }\n      }\n    }\n  }\n\n  //\n  // Reset the array, or remove it completely if we have no more listeners.\n  //\n  if (events.length) {\n    this._events[evt] = events.length === 1 ? events[0] : events;\n  } else {\n    delete this._events[evt];\n  }\n\n  return this;\n};\n\n/**\n * Remove all listeners or only the listeners for the specified event.\n *\n * @param {String} event The event want to remove all listeners for.\n * @api public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n  if (!this._events) return this;\n\n  if (event) delete this._events[prefix ? prefix + event : event];\n  else this._events = prefix ? {} : Object.create(null);\n\n  return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// This function doesn't apply anymore.\n//\nEventEmitter.prototype.setMaxListeners = function setMaxListeners() {\n  return this;\n};\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n  module.exports = EventEmitter;\n}\n\n},{}],2:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/*\n * Copyright 2016 Google Inc. 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\nvar HEAD_ELBOW_OFFSET = new THREE.Vector3(0.155, -0.465, -0.15);\nvar ELBOW_WRIST_OFFSET = new THREE.Vector3(0, 0, -0.25);\nvar WRIST_CONTROLLER_OFFSET = new THREE.Vector3(0, 0, 0.05);\nvar ARM_EXTENSION_OFFSET = new THREE.Vector3(-0.08, 0.14, 0.08);\n\nvar ELBOW_BEND_RATIO = 0.4; // 40% elbow, 60% wrist.\nvar EXTENSION_RATIO_WEIGHT = 0.4;\n\nvar MIN_ANGULAR_SPEED = 0.61; // 35 degrees per second (in radians).\n\n/**\n * Represents the arm model for the Daydream controller. Feed it a camera and\n * the controller. Update it on a RAF.\n *\n * Get the model's pose using getPose().\n */\n\nvar OrientationArmModel = function () {\n  function OrientationArmModel() {\n    _classCallCheck(this, OrientationArmModel);\n\n    this.isLeftHanded = false;\n\n    // Current and previous controller orientations.\n    this.controllerQ = new THREE.Quaternion();\n    this.lastControllerQ = new THREE.Quaternion();\n\n    // Current and previous head orientations.\n    this.headQ = new THREE.Quaternion();\n\n    // Current head position.\n    this.headPos = new THREE.Vector3();\n\n    // Positions of other joints (mostly for debugging).\n    this.elbowPos = new THREE.Vector3();\n    this.wristPos = new THREE.Vector3();\n\n    // Current and previous times the model was updated.\n    this.time = null;\n    this.lastTime = null;\n\n    // Root rotation.\n    this.rootQ = new THREE.Quaternion();\n\n    // Current pose that this arm model calculates.\n    this.pose = {\n      orientation: new THREE.Quaternion(),\n      position: new THREE.Vector3()\n    };\n  }\n\n  /**\n   * Methods to set controller and head pose (in world coordinates).\n   */\n\n\n  _createClass(OrientationArmModel, [{\n    key: 'setControllerOrientation',\n    value: function setControllerOrientation(quaternion) {\n      this.lastControllerQ.copy(this.controllerQ);\n      this.controllerQ.copy(quaternion);\n    }\n  }, {\n    key: 'setHeadOrientation',\n    value: function setHeadOrientation(quaternion) {\n      this.headQ.copy(quaternion);\n    }\n  }, {\n    key: 'setHeadPosition',\n    value: function setHeadPosition(position) {\n      this.headPos.copy(position);\n    }\n  }, {\n    key: 'setLeftHanded',\n    value: function setLeftHanded(isLeftHanded) {\n      // TODO(smus): Implement me!\n      this.isLeftHanded = isLeftHanded;\n    }\n\n    /**\n     * Called on a RAF.\n     */\n\n  }, {\n    key: 'update',\n    value: function update() {\n      this.time = performance.now();\n\n      // If the controller's angular velocity is above a certain amount, we can\n      // assume torso rotation and move the elbow joint relative to the\n      // camera orientation.\n      var headYawQ = this.getHeadYawOrientation_();\n      var timeDelta = (this.time - this.lastTime) / 1000;\n      var angleDelta = this.quatAngle_(this.lastControllerQ, this.controllerQ);\n      var controllerAngularSpeed = angleDelta / timeDelta;\n      if (controllerAngularSpeed > MIN_ANGULAR_SPEED) {\n        // Attenuate the Root rotation slightly.\n        this.rootQ.slerp(headYawQ, angleDelta / 10);\n      } else {\n        this.rootQ.copy(headYawQ);\n      }\n\n      // We want to move the elbow up and to the center as the user points the\n      // controller upwards, so that they can easily see the controller and its\n      // tool tips.\n      var controllerEuler = new THREE.Euler().setFromQuaternion(this.controllerQ, 'YXZ');\n      var controllerXDeg = THREE.Math.radToDeg(controllerEuler.x);\n      var extensionRatio = this.clamp_((controllerXDeg - 11) / (50 - 11), 0, 1);\n\n      // Controller orientation in camera space.\n      var controllerCameraQ = this.rootQ.clone().inverse();\n      controllerCameraQ.multiply(this.controllerQ);\n\n      // Calculate elbow position.\n      var elbowPos = this.elbowPos;\n      elbowPos.copy(this.headPos).add(HEAD_ELBOW_OFFSET);\n      var elbowOffset = new THREE.Vector3().copy(ARM_EXTENSION_OFFSET);\n      elbowOffset.multiplyScalar(extensionRatio);\n      elbowPos.add(elbowOffset);\n\n      // Calculate joint angles. Generally 40% of rotation applied to elbow, 60%\n      // to wrist, but if controller is raised higher, more rotation comes from\n      // the wrist.\n      var totalAngle = this.quatAngle_(controllerCameraQ, new THREE.Quaternion());\n      var totalAngleDeg = THREE.Math.radToDeg(totalAngle);\n      var lerpSuppression = 1 - Math.pow(totalAngleDeg / 180, 4); // TODO(smus): ???\n\n      var elbowRatio = ELBOW_BEND_RATIO;\n      var wristRatio = 1 - ELBOW_BEND_RATIO;\n      var lerpValue = lerpSuppression * (elbowRatio + wristRatio * extensionRatio * EXTENSION_RATIO_WEIGHT);\n\n      var wristQ = new THREE.Quaternion().slerp(controllerCameraQ, lerpValue);\n      var invWristQ = wristQ.inverse();\n      var elbowQ = controllerCameraQ.clone().multiply(invWristQ);\n\n      // Calculate our final controller position based on all our joint rotations\n      // and lengths.\n      /*\n      position_ =\n        root_rot_ * (\n          controller_root_offset_ +\n      2:      (arm_extension_ * amt_extension) +\n      1:      elbow_rot * (kControllerForearm + (wrist_rot * kControllerPosition))\n        );\n      */\n      var wristPos = this.wristPos;\n      wristPos.copy(WRIST_CONTROLLER_OFFSET);\n      wristPos.applyQuaternion(wristQ);\n      wristPos.add(ELBOW_WRIST_OFFSET);\n      wristPos.applyQuaternion(elbowQ);\n      wristPos.add(this.elbowPos);\n\n      var offset = new THREE.Vector3().copy(ARM_EXTENSION_OFFSET);\n      offset.multiplyScalar(extensionRatio);\n\n      var position = new THREE.Vector3().copy(this.wristPos);\n      position.add(offset);\n      position.applyQuaternion(this.rootQ);\n\n      var orientation = new THREE.Quaternion().copy(this.controllerQ);\n\n      // Set the resulting pose orientation and position.\n      this.pose.orientation.copy(orientation);\n      this.pose.position.copy(position);\n\n      this.lastTime = this.time;\n    }\n\n    /**\n     * Returns the pose calculated by the model.\n     */\n\n  }, {\n    key: 'getPose',\n    value: function getPose() {\n      return this.pose;\n    }\n\n    /**\n     * Debug methods for rendering the arm model.\n     */\n\n  }, {\n    key: 'getForearmLength',\n    value: function getForearmLength() {\n      return ELBOW_WRIST_OFFSET.length();\n    }\n  }, {\n    key: 'getElbowPosition',\n    value: function getElbowPosition() {\n      var out = this.elbowPos.clone();\n      return out.applyQuaternion(this.rootQ);\n    }\n  }, {\n    key: 'getWristPosition',\n    value: function getWristPosition() {\n      var out = this.wristPos.clone();\n      return out.applyQuaternion(this.rootQ);\n    }\n  }, {\n    key: 'getHeadYawOrientation_',\n    value: function getHeadYawOrientation_() {\n      var headEuler = new THREE.Euler().setFromQuaternion(this.headQ, 'YXZ');\n      headEuler.x = 0;\n      headEuler.z = 0;\n      var destinationQ = new THREE.Quaternion().setFromEuler(headEuler);\n      return destinationQ;\n    }\n  }, {\n    key: 'clamp_',\n    value: function clamp_(value, min, max) {\n      return Math.min(Math.max(value, min), max);\n    }\n  }, {\n    key: 'quatAngle_',\n    value: function quatAngle_(q1, q2) {\n      var vec1 = new THREE.Vector3(0, 0, -1);\n      var vec2 = new THREE.Vector3(0, 0, -1);\n      vec1.applyQuaternion(q1);\n      vec2.applyQuaternion(q2);\n      return vec1.angleTo(vec2);\n    }\n  }]);\n\n  return OrientationArmModel;\n}();\n\nexports.default = OrientationArmModel;\n\n},{}],3:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _eventemitter = require('eventemitter3');\n\nvar _eventemitter2 = _interopRequireDefault(_eventemitter);\n\nvar _rayInteractionModes = require('./ray-interaction-modes');\n\nvar _rayInteractionModes2 = _interopRequireDefault(_rayInteractionModes);\n\nvar _util = require('./util');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /*\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * Copyright 2016 Google Inc. 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\nvar DRAG_DISTANCE_PX = 10;\n\n/**\n * Enumerates all possible interaction modes. Sets up all event handlers (mouse,\n * touch, etc), interfaces with gamepad API.\n *\n * Emits events:\n *    action: Input is activated (mousedown, touchstart, daydream click, vive\n *    trigger).\n *    release: Input is deactivated (mouseup, touchend, daydream release, vive\n *    release).\n *    cancel: Input is canceled (eg. we scrolled instead of tapping on\n *    mobile/desktop).\n *    pointermove(2D position): The pointer is moved (mouse or touch).\n */\n\nvar RayController = function (_EventEmitter) {\n  _inherits(RayController, _EventEmitter);\n\n  function RayController(opt_el) {\n    _classCallCheck(this, RayController);\n\n    var _this = _possibleConstructorReturn(this, (RayController.__proto__ || Object.getPrototypeOf(RayController)).call(this));\n\n    var el = opt_el || window;\n\n    // Handle interactions.\n    el.addEventListener('mousedown', _this.onMouseDown_.bind(_this));\n    el.addEventListener('mousemove', _this.onMouseMove_.bind(_this));\n    el.addEventListener('mouseup', _this.onMouseUp_.bind(_this));\n    el.addEventListener('touchstart', _this.onTouchStart_.bind(_this));\n    el.addEventListener('touchmove', _this.onTouchMove_.bind(_this));\n    el.addEventListener('touchend', _this.onTouchEnd_.bind(_this));\n\n    _this.element = el;\n\n    // The position of the pointer.\n    _this.pointer = new THREE.Vector2();\n    // The previous position of the pointer.\n    _this.lastPointer = new THREE.Vector2();\n    // Position of pointer in Normalized Device Coordinates (NDC).\n    _this.pointerNdc = new THREE.Vector2();\n    // How much we have dragged (if we are dragging).\n    _this.dragDistance = 0;\n    // Are we dragging or not.\n    _this.isDragging = false;\n    // Is pointer active or not.\n    _this.isTouchActive = false;\n\n    // Gamepad events.\n    _this.gamepad = null;\n\n    // VR Events.\n    if (!navigator.getVRDisplays) {\n      console.warn('WebVR API not available! Consider using the webvr-polyfill.');\n    } else {\n      navigator.getVRDisplays().then(function (displays) {\n        _this.vrDisplay = displays[0];\n      });\n    }\n    return _this;\n  }\n\n  _createClass(RayController, [{\n    key: 'getInteractionMode',\n    value: function getInteractionMode() {\n      // TODO: Debugging only.\n      //return InteractionModes.DAYDREAM;\n\n      var gamepad = this.getVRGamepad_();\n\n      if (gamepad) {\n        if (gamepad.id.includes('Gear VR')) {\n          return _rayInteractionModes2.default.VR_0DOF;\n        }\n\n        var pose = gamepad.pose;\n        // If there's a gamepad connected, determine if it's Daydream or a Vive.\n        if (pose.hasPosition) {\n          return _rayInteractionModes2.default.VR_6DOF;\n        }\n\n        if (pose.hasOrientation) {\n          return _rayInteractionModes2.default.VR_3DOF;\n        }\n      } else {\n        // If there's no gamepad, it might be Cardboard, magic window or desktop.\n        if ((0, _util.isMobile)()) {\n          // Either Cardboard or magic window, depending on whether we are\n          // presenting.\n          if (this.vrDisplay && this.vrDisplay.isPresenting) {\n            return _rayInteractionModes2.default.VR_0DOF;\n          } else {\n            return _rayInteractionModes2.default.TOUCH;\n          }\n        } else {\n          // We must be on desktop.\n          return _rayInteractionModes2.default.MOUSE;\n        }\n      }\n      // By default, use TOUCH.\n      return _rayInteractionModes2.default.TOUCH;\n    }\n  }, {\n    key: 'getGamepadPose',\n    value: function getGamepadPose() {\n      var gamepad = this.getVRGamepad_();\n      return gamepad.pose;\n    }\n\n    /**\n     * Get if there is an active touch event going on.\n     * Only relevant on touch devices\n     */\n\n  }, {\n    key: 'getIsTouchActive',\n    value: function getIsTouchActive() {\n      return this.isTouchActive;\n    }\n  }, {\n    key: 'setSize',\n    value: function setSize(size) {\n      this.size = size;\n      this.boundingRect = { left: 0, top: 0 };\n      if (typeof this.element.getBoundingClientRect === 'function') {\n        this.boundingRect = this.element.getBoundingClientRect();\n      }\n    }\n  }, {\n    key: 'update',\n    value: function update() {\n      if (!this.gamepad) return;\n\n      // If we're dealing with a gamepad, check every animation frame for a\n      // pressed action.\n      var isGamepadPressed = this.getGamepadButtonPressed_();\n      if (isGamepadPressed && !this.wasGamepadPressed) {\n        this.emit('raydown');\n      }\n      if (!isGamepadPressed && this.wasGamepadPressed) {\n        this.emit('rayup');\n      }\n      this.wasGamepadPressed = isGamepadPressed;\n    }\n  }, {\n    key: 'getGamepadButtonPressed_',\n    value: function getGamepadButtonPressed_() {\n      var gamepad = this.getVRGamepad_();\n      if (!gamepad) {\n        // If there's no gamepad, the button was not pressed.\n        return false;\n      }\n      // Check for clicks.\n      for (var j = 0; j < gamepad.buttons.length; ++j) {\n        if (gamepad.buttons[j].pressed) {\n          return true;\n        }\n      }\n      return false;\n    }\n  }, {\n    key: 'onMouseDown_',\n    value: function onMouseDown_(e) {\n      this.startDragging_(e);\n      this.emit('raydown', e);\n    }\n  }, {\n    key: 'onMouseMove_',\n    value: function onMouseMove_(e) {\n      this.updatePointer_(e);\n      this.updateDragDistance_();\n      this.emit('pointermove', this.pointerNdc);\n    }\n  }, {\n    key: 'onMouseUp_',\n    value: function onMouseUp_(e) {\n      this.endDragging_(e);\n    }\n  }, {\n    key: 'onTouchStart_',\n    value: function onTouchStart_(e) {\n      this.isTouchActive = true;\n      var t = e.touches[0];\n      this.startDragging_(t);\n      this.updateTouchPointer_(e);\n\n      this.emit('pointermove', this.pointerNdc);\n      this.emit('raydown', e);\n    }\n  }, {\n    key: 'onTouchMove_',\n    value: function onTouchMove_(e) {\n      this.updateTouchPointer_(e);\n      this.updateDragDistance_();\n\n      // Prevent synthetic mouse event from being created.\n      e.preventDefault();\n    }\n  }, {\n    key: 'onTouchEnd_',\n    value: function onTouchEnd_(e) {\n      this.endDragging_(e);\n\n      this.isTouchActive = false;\n    }\n  }, {\n    key: 'updateTouchPointer_',\n    value: function updateTouchPointer_(e) {\n      // If there's no touches array, ignore.\n      if (e.touches.length === 0) {\n        console.warn('Received touch event with no touches.');\n        return;\n      }\n      var t = e.touches[0];\n      this.updatePointer_(t);\n    }\n  }, {\n    key: 'updatePointer_',\n    value: function updatePointer_(e) {\n      // How much the pointer moved.\n      var x = e.clientX - this.boundingRect.left;\n      var y = e.clientY - this.boundingRect.top;\n      var nx = x / this.size.width;\n      var ny = y / this.size.height;\n      this.pointer.set(x, y);\n      this.pointerNdc.x = nx * 2 - 1;\n      this.pointerNdc.y = -(ny * 2) + 1;\n    }\n  }, {\n    key: 'updateDragDistance_',\n    value: function updateDragDistance_() {\n      if (this.isDragging) {\n        var distance = this.lastPointer.sub(this.pointer).length();\n        this.dragDistance += distance;\n        this.lastPointer.copy(this.pointer);\n\n        if (this.dragDistance > DRAG_DISTANCE_PX) {\n          this.emit('raycancel');\n          this.isDragging = false;\n        }\n      }\n    }\n  }, {\n    key: 'startDragging_',\n    value: function startDragging_(e) {\n      this.isDragging = true;\n      this.dragDistance = 0;\n      this.lastPointer.set(e.clientX, e.clientY);\n    }\n  }, {\n    key: 'endDragging_',\n    value: function endDragging_(e) {\n      if (this.dragDistance < DRAG_DISTANCE_PX) {\n        this.emit('rayup', e);\n      }\n      this.dragDistance = 0;\n      this.isDragging = false;\n    }\n\n    /**\n     * Gets the first VR-enabled gamepad.\n     */\n\n  }, {\n    key: 'getVRGamepad_',\n    value: function getVRGamepad_() {\n      // If there's no gamepad API, there's no gamepad.\n      if (!navigator.getGamepads) {\n        return null;\n      }\n\n      var gamepads = navigator.getGamepads();\n      for (var i = 0; i < gamepads.length; ++i) {\n        var gamepad = gamepads[i];\n        // The left hand of the Oculus Touch appears first in the list,\n        // skip it and force right-handedness. :(\n        if (gamepad && gamepad.id === 'Oculus Touch (Left)') continue;\n\n        // The array may contain undefined gamepads, so check for that as well as\n        // a non-null pose. Allow the Gear VR touch pad through.\n        if (gamepad && (gamepad.pose || gamepad.id.includes('Gear VR'))) {\n          this.gamepad = gamepad;\n          return gamepad;\n        }\n      }\n      return null;\n    }\n  }]);\n\n  return RayController;\n}(_eventemitter2.default);\n\nexports.default = RayController;\n\n},{\"./ray-interaction-modes\":5,\"./util\":7,\"eventemitter3\":1}],4:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _orientationArmModel = require('./orientation-arm-model');\n\nvar _orientationArmModel2 = _interopRequireDefault(_orientationArmModel);\n\nvar _eventemitter = require('eventemitter3');\n\nvar _eventemitter2 = _interopRequireDefault(_eventemitter);\n\nvar _rayRenderer = require('./ray-renderer');\n\nvar _rayRenderer2 = _interopRequireDefault(_rayRenderer);\n\nvar _rayController = require('./ray-controller');\n\nvar _rayController2 = _interopRequireDefault(_rayController);\n\nvar _rayInteractionModes = require('./ray-interaction-modes');\n\nvar _rayInteractionModes2 = _interopRequireDefault(_rayInteractionModes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /*\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * Copyright 2016 Google Inc. 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/**\n * API wrapper for the input library.\n */\nvar RayInput = function (_EventEmitter) {\n  _inherits(RayInput, _EventEmitter);\n\n  function RayInput(camera, opt_el) {\n    _classCallCheck(this, RayInput);\n\n    var _this = _possibleConstructorReturn(this, (RayInput.__proto__ || Object.getPrototypeOf(RayInput)).call(this));\n\n    _this.camera = camera;\n    _this.renderer = new _rayRenderer2.default(camera);\n    _this.controller = new _rayController2.default(opt_el);\n\n    // Arm model needed to transform controller orientation into proper pose.\n    _this.armModel = new _orientationArmModel2.default();\n\n    _this.controller.on('raydown', _this.onRayDown_.bind(_this));\n    _this.controller.on('rayup', _this.onRayUp_.bind(_this));\n    _this.controller.on('raycancel', _this.onRayCancel_.bind(_this));\n    _this.controller.on('pointermove', _this.onPointerMove_.bind(_this));\n    _this.renderer.on('rayover', function (mesh) {\n      _this.emit('rayover', mesh);\n    });\n    _this.renderer.on('rayout', function (mesh) {\n      _this.emit('rayout', mesh);\n    });\n\n    // By default, put the pointer offscreen.\n    _this.pointerNdc = new THREE.Vector2(1, 1);\n\n    // Event handlers.\n    _this.handlers = {};\n    return _this;\n  }\n\n  _createClass(RayInput, [{\n    key: 'add',\n    value: function add(object, handlers) {\n      this.renderer.add(object, handlers);\n      this.handlers[object.id] = handlers;\n    }\n  }, {\n    key: 'remove',\n    value: function remove(object) {\n      this.renderer.remove(object);\n      delete this.handlers[object.id];\n    }\n  }, {\n    key: 'update',\n    value: function update(meshes) {\n      this.currentMeshes = meshes;\n\n      var mode = this.controller.getInteractionMode();\n      switch (mode) {\n        case _rayInteractionModes2.default.MOUSE:\n          // Desktop mouse mode, mouse coordinates are what matters.\n          this.renderer.setPointer(this.pointerNdc);\n          // Hide the ray and reticle.\n          this.renderer.setRayVisibility(false);\n          this.renderer.setReticleVisibility(false);\n\n          // In mouse mode ray renderer is always active.\n          this.renderer.setActive(true);\n          break;\n\n        case _rayInteractionModes2.default.TOUCH:\n          // Mobile magic window mode. Touch coordinates matter, but we want to\n          // hide the reticle.\n          this.renderer.setPointer(this.pointerNdc);\n\n          // Hide the ray and the reticle.\n          this.renderer.setRayVisibility(false);\n          this.renderer.setReticleVisibility(false);\n\n          // In touch mode the ray renderer is only active on touch.\n          this.renderer.setActive(this.controller.getIsTouchActive());\n          break;\n\n        case _rayInteractionModes2.default.VR_0DOF:\n          // Cardboard mode, we're dealing with a gaze reticle.\n          this.renderer.setPosition(this.camera.position);\n          this.renderer.setOrientation(this.camera.quaternion);\n\n          // Reticle only.\n          this.renderer.setRayVisibility(false);\n          this.renderer.setReticleVisibility(true);\n\n          // Ray renderer always active.\n          this.renderer.setActive(true);\n          break;\n\n        case _rayInteractionModes2.default.VR_3DOF:\n          // Daydream, our origin is slightly off (depending on handedness).\n          // But we should be using the orientation from the gamepad.\n          // TODO(smus): Implement the real arm model.\n          var pose = this.controller.getGamepadPose();\n\n          // Debug only: use camera as input controller.\n          //let controllerOrientation = this.camera.quaternion;\n          var controllerOrientation = new THREE.Quaternion().fromArray(pose.orientation);\n\n          // Transform the controller into the camera coordinate system.\n          /*\n          controllerOrientation.multiply(\n              new THREE.Quaternion().setFromAxisAngle(new THREE.Vector3(0, 1, 0), Math.PI));\n          controllerOrientation.x *= -1;\n          controllerOrientation.z *= -1;\n          */\n\n          // Feed camera and controller into the arm model.\n          this.armModel.setHeadOrientation(this.camera.quaternion);\n          this.armModel.setHeadPosition(this.camera.position);\n          this.armModel.setControllerOrientation(controllerOrientation);\n          this.armModel.update();\n\n          // Get resulting pose and configure the renderer.\n          var modelPose = this.armModel.getPose();\n          this.renderer.setPosition(modelPose.position);\n          //this.renderer.setPosition(new THREE.Vector3());\n          this.renderer.setOrientation(modelPose.orientation);\n          //this.renderer.setOrientation(controllerOrientation);\n\n          // Show ray and reticle.\n          this.renderer.setRayVisibility(true);\n          this.renderer.setReticleVisibility(true);\n\n          // Ray renderer always active.\n          this.renderer.setActive(true);\n          break;\n\n        case _rayInteractionModes2.default.VR_6DOF:\n          // Vive, origin depends on the position of the controller.\n          // TODO(smus)...\n          var pose = this.controller.getGamepadPose();\n\n          // Check that the pose is valid.\n          if (!pose.orientation || !pose.position) {\n            console.warn('Invalid gamepad pose. Can\\'t update ray.');\n            break;\n          }\n\n          // Adjust the position of the controller to\n          // the position and orientation of the camera.\n          var position = new THREE.Vector3().fromArray(pose.position);\n          position.applyMatrix4(this.camera.matrixWorld);\n          var orientation = new THREE.Quaternion().multiplyQuaternions(this.camera.quaternion, new THREE.Quaternion().fromArray(pose.orientation));\n\n          this.renderer.setOrientation(orientation);\n          this.renderer.setPosition(position);\n\n          // Show ray and reticle.\n          this.renderer.setRayVisibility(true);\n          this.renderer.setReticleVisibility(true);\n\n          // Ray renderer always active.\n          this.renderer.setActive(true);\n          break;\n\n        default:\n          console.error('Unknown interaction mode.');\n      }\n      this.renderer.update(meshes);\n      this.controller.update();\n    }\n  }, {\n    key: 'setSize',\n    value: function setSize(size) {\n      this.controller.setSize(size);\n    }\n  }, {\n    key: 'getMesh',\n    value: function getMesh() {\n      return this.renderer.getReticleRayMesh();\n    }\n  }, {\n    key: 'getOrigin',\n    value: function getOrigin() {\n      return this.renderer.getOrigin();\n    }\n  }, {\n    key: 'getDirection',\n    value: function getDirection() {\n      return this.renderer.getDirection();\n    }\n  }, {\n    key: 'getRightDirection',\n    value: function getRightDirection() {\n      var lookAt = new THREE.Vector3(0, 0, -1);\n      lookAt.applyQuaternion(this.camera.quaternion);\n      return new THREE.Vector3().crossVectors(lookAt, this.camera.up);\n    }\n  }, {\n    key: 'onRayDown_',\n    value: function onRayDown_(e) {\n      var _this2 = this;\n\n      //console.log('onRayDown_');\n\n      // Force the renderer to raycast.\n      setTimeout(function () {\n        _this2.update(_this2.currentMeshes);\n        var mesh = _this2.renderer.getSelectedMesh();\n\n        _this2.rayDownMesh = mesh;\n        _this2.emit('raydown', mesh);\n\n        _this2.renderer.setActive(true);\n      }, 0);\n    }\n  }, {\n    key: 'onRayUp_',\n    value: function onRayUp_(e) {\n      // console.log('onRayUp_', e && this.rayDownMesh);\n\n      if (e && this.rayDownMesh) {\n        e.preventDefault();\n      }\n\n      this.emit('rayup', this.rayDownMesh);\n      this.rayDownMesh = null;\n\n      this.renderer.setActive(false);\n    }\n  }, {\n    key: 'onRayCancel_',\n    value: function onRayCancel_(e) {\n      //console.log('onRayCancel_');\n      var mesh = this.renderer.getSelectedMesh();\n      this.emit('raycancel', mesh);\n    }\n  }, {\n    key: 'onPointerMove_',\n    value: function onPointerMove_(ndc) {\n      this.pointerNdc.copy(ndc);\n    }\n  }]);\n\n  return RayInput;\n}(_eventemitter2.default);\n\nexports.default = RayInput;\n\n},{\"./orientation-arm-model\":2,\"./ray-controller\":3,\"./ray-interaction-modes\":5,\"./ray-renderer\":6,\"eventemitter3\":1}],5:[function(require,module,exports){\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n/*\n * Copyright 2016 Google Inc. 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\nvar InteractionModes = {\n  MOUSE: 1,\n  TOUCH: 2,\n  VR_0DOF: 3,\n  VR_3DOF: 4,\n  VR_6DOF: 5\n};\n\nexports.default = InteractionModes;\n\n},{}],6:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _util = require('./util');\n\nvar _eventemitter = require('eventemitter3');\n\nvar _eventemitter2 = _interopRequireDefault(_eventemitter);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /*\n                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                * Copyright 2016 Google Inc. 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\nvar RETICLE_DISTANCE = 3;\nvar INNER_RADIUS = 0.02;\nvar OUTER_RADIUS = 0.04;\nvar RAY_RADIUS = 0.02;\nvar GRADIENT_IMAGE = (0, _util.base64)('image/png', 'iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAABdklEQVR4nO3WwXHEQAwDQcin/FOWw+BjuiPYB2q4G2nP933P9SO4824zgDADiDOAuHfb3/UjuKMAcQYQZwBx/gBxChCnAHEKEKcAcQoQpwBxChCnAHEGEGcAcf4AcQoQZwBxBhBnAHEGEGcAcQYQZwBxBhBnAHEGEGcAcQYQZwBxBhBnAHHvtt/1I7ijAHEGEGcAcf4AcQoQZwBxTkCcAsQZQJwTEKcAcQoQpwBxBhDnBMQpQJwCxClAnALEKUCcAsQpQJwCxClAnALEKUCcAsQpQJwBxDkBcQoQpwBxChCnAHEKEKcAcQoQpwBxChCnAHEKEGcAcU5AnALEKUCcAsQZQJwTEKcAcQYQ5wTEKUCcAcQZQJw/QJwCxBlAnAHEGUCcAcQZQJwBxBlAnAHEGUCcAcQZQJwBxBlAnAHEGUDcu+25fgR3FCDOAOIMIM4fIE4B4hQgTgHiFCBOAeIUIE4B4hQgzgDiDCDOHyBOAeIMIM4A4v4B/5IF9eD6QxgAAAAASUVORK5CYII=');\n\n/**\n * Handles ray input selection from frame of reference of an arbitrary object.\n *\n * The source of the ray is from various locations:\n *\n * Desktop: mouse.\n * Magic window: touch.\n * Cardboard: camera.\n * Daydream: 3DOF controller via gamepad (and show ray).\n * Vive: 6DOF controller via gamepad (and show ray).\n *\n * Emits selection events:\n *     rayover(mesh): This mesh was selected.\n *     rayout(mesh): This mesh was unselected.\n */\n\nvar RayRenderer = function (_EventEmitter) {\n  _inherits(RayRenderer, _EventEmitter);\n\n  function RayRenderer(camera, opt_params) {\n    _classCallCheck(this, RayRenderer);\n\n    var _this = _possibleConstructorReturn(this, (RayRenderer.__proto__ || Object.getPrototypeOf(RayRenderer)).call(this));\n\n    _this.camera = camera;\n\n    var params = opt_params || {};\n\n    // Which objects are interactive (keyed on id).\n    _this.meshes = {};\n\n    // Which objects are currently selected (keyed on id).\n    _this.selected = {};\n\n    // The raycaster.\n    _this.raycaster = new THREE.Raycaster();\n\n    // Position and orientation, in addition.\n    _this.position = new THREE.Vector3();\n    _this.orientation = new THREE.Quaternion();\n\n    _this.root = new THREE.Object3D();\n\n    // Add the reticle mesh to the root of the object.\n    _this.reticle = _this.createReticle_();\n    _this.root.add(_this.reticle);\n\n    // Add the ray to the root of the object.\n    _this.ray = _this.createRay_();\n    _this.root.add(_this.ray);\n\n    // How far the reticle is currently from the reticle origin.\n    _this.reticleDistance = RETICLE_DISTANCE;\n    return _this;\n  }\n\n  /**\n   * Register an object so that it can be interacted with.\n   */\n\n\n  _createClass(RayRenderer, [{\n    key: 'add',\n    value: function add(object) {\n      this.meshes[object.id] = object;\n    }\n\n    /**\n     * Prevent an object from being interacted with.\n     */\n\n  }, {\n    key: 'remove',\n    value: function remove(object) {\n      var id = object.id;\n      if (this.meshes[id]) {\n        // If there's no existing mesh, we can't remove it.\n        delete this.meshes[id];\n      }\n      // If the object is currently selected, remove it.\n      if (this.selected[id]) {\n        delete this.selected[object.id];\n      }\n    }\n  }, {\n    key: 'update',\n    value: function update(meshes) {\n      // Do the raycasting and issue various events as needed.\n      var intersects = this.raycaster.intersectObjects(meshes, true);\n      var intersectedMesh = void 0;\n\n      for (var i = 0; i < intersects.length; i++) {\n        var obj = intersects[i].object;\n\n        // traverse the hierarchy backwards, to find a clickable mesh via a child\n        while (obj && !this.meshes[obj.id]) {\n          obj = obj.parent;\n        }\n\n        if (obj) {\n          intersectedMesh = obj.id;\n          break;\n        }\n      }\n\n      for (var id in this.meshes) {\n        var mesh = this.meshes[id];\n        var isIntersected = intersectedMesh === mesh.id;\n        var isSelected = this.selected[id];\n\n        // If it's newly selected, send rayover.\n        if (isIntersected && !isSelected) {\n          this.selected[id] = true;\n          if (this.isActive) {\n            this.emit('rayover', mesh);\n          }\n        }\n\n        // If it's no longer intersected, send rayout.\n        if (!isIntersected && isSelected) {\n          delete this.selected[id];\n          this.moveReticle_(null);\n          if (this.isActive) {\n            this.emit('rayout', mesh);\n          }\n        }\n\n        if (isIntersected) {\n          this.moveReticle_(intersects);\n        }\n      }\n    }\n\n    /**\n     * Sets the origin of the ray.\n     * @param {Vector} vector Position of the origin of the picking ray.\n     */\n\n  }, {\n    key: 'setPosition',\n    value: function setPosition(vector) {\n      this.position.copy(vector);\n      this.raycaster.ray.origin.copy(vector);\n      this.updateRaycaster_();\n    }\n  }, {\n    key: 'getOrigin',\n    value: function getOrigin() {\n      return this.raycaster.ray.origin;\n    }\n\n    /**\n     * Sets the direction of the ray.\n     * @param {Vector} quaternion Unit vector corresponding to direction.\n     */\n\n  }, {\n    key: 'setOrientation',\n    value: function setOrientation(quaternion) {\n      this.orientation.copy(quaternion);\n\n      var pointAt = new THREE.Vector3(0, 0, -1).applyQuaternion(quaternion);\n      this.raycaster.ray.direction.copy(pointAt);\n      this.updateRaycaster_();\n    }\n  }, {\n    key: 'getDirection',\n    value: function getDirection() {\n      return this.raycaster.ray.direction;\n    }\n\n    /**\n     * Sets the pointer on the screen for camera + pointer based picking. This\n     * superscedes origin and direction.\n     *\n     * @param {Vector2} vector The position of the pointer (screen coords).\n     */\n\n  }, {\n    key: 'setPointer',\n    value: function setPointer(vector) {\n      this.raycaster.setFromCamera(vector, this.camera);\n      this.updateRaycaster_();\n    }\n\n    /**\n     * Gets the mesh, which includes reticle and/or ray. This mesh is then added\n     * to the scene.\n     */\n\n  }, {\n    key: 'getReticleRayMesh',\n    value: function getReticleRayMesh() {\n      return this.root;\n    }\n\n    /**\n     * Gets the currently selected object in the scene.\n     */\n\n  }, {\n    key: 'getSelectedMesh',\n    value: function getSelectedMesh() {\n      var count = 0;\n      var mesh = null;\n      for (var id in this.selected) {\n        count += 1;\n        mesh = this.meshes[id];\n      }\n      if (count > 1) {\n        console.warn('More than one mesh selected.');\n      }\n      return mesh;\n    }\n\n    /**\n     * Hides and shows the reticle.\n     */\n\n  }, {\n    key: 'setReticleVisibility',\n    value: function setReticleVisibility(isVisible) {\n      this.reticle.visible = isVisible;\n    }\n\n    /**\n     * Enables or disables the raycasting ray which gradually fades out from\n     * the origin.\n     */\n\n  }, {\n    key: 'setRayVisibility',\n    value: function setRayVisibility(isVisible) {\n      this.ray.visible = isVisible;\n    }\n\n    /**\n     * Enables and disables the raycaster. For touch, where finger up means we\n     * shouldn't be raycasting.\n     */\n\n  }, {\n    key: 'setActive',\n    value: function setActive(isActive) {\n      // If nothing changed, do nothing.\n      if (this.isActive == isActive) {\n        return;\n      }\n      // TODO(smus): Show the ray or reticle adjust in response.\n      this.isActive = isActive;\n\n      if (!isActive) {\n        this.moveReticle_(null);\n        for (var id in this.selected) {\n          var mesh = this.meshes[id];\n          delete this.selected[id];\n          this.emit('rayout', mesh);\n        }\n      }\n    }\n  }, {\n    key: 'updateRaycaster_',\n    value: function updateRaycaster_() {\n      var ray = this.raycaster.ray;\n\n      // Position the reticle at a distance, as calculated from the origin and\n      // direction.\n      var position = this.reticle.position;\n      position.copy(ray.direction);\n      position.multiplyScalar(this.reticleDistance);\n      position.add(ray.origin);\n\n      // Set position and orientation of the ray so that it goes from origin to\n      // reticle.\n      var delta = new THREE.Vector3().copy(ray.direction);\n      delta.multiplyScalar(this.reticleDistance);\n      this.ray.scale.y = delta.length();\n      var arrow = new THREE.ArrowHelper(ray.direction, ray.origin);\n      this.ray.rotation.copy(arrow.rotation);\n      this.ray.position.addVectors(ray.origin, delta.multiplyScalar(0.5));\n    }\n\n    /**\n     * Creates the geometry of the reticle.\n     */\n\n  }, {\n    key: 'createReticle_',\n    value: function createReticle_() {\n      // Create a spherical reticle.\n      var innerGeometry = new THREE.SphereGeometry(INNER_RADIUS, 32, 32);\n      var innerMaterial = new THREE.MeshBasicMaterial({\n        color: 0xffffff,\n        transparent: true,\n        opacity: 0.9\n      });\n      var inner = new THREE.Mesh(innerGeometry, innerMaterial);\n\n      var outerGeometry = new THREE.SphereGeometry(OUTER_RADIUS, 32, 32);\n      var outerMaterial = new THREE.MeshBasicMaterial({\n        color: 0x333333,\n        transparent: true,\n        opacity: 0.3\n      });\n      var outer = new THREE.Mesh(outerGeometry, outerMaterial);\n\n      var reticle = new THREE.Group();\n      reticle.add(inner);\n      reticle.add(outer);\n      return reticle;\n    }\n\n    /**\n     * Moves the reticle to a position so that it's just in front of the mesh that\n     * it intersected with.\n     */\n\n  }, {\n    key: 'moveReticle_',\n    value: function moveReticle_(intersections) {\n      // If no intersection, return the reticle to the default position.\n      var distance = RETICLE_DISTANCE;\n      if (intersections) {\n        // Otherwise, determine the correct distance.\n        var inter = intersections[0];\n        distance = inter.distance;\n      }\n\n      this.reticleDistance = distance;\n      this.updateRaycaster_();\n      return;\n    }\n  }, {\n    key: 'createRay_',\n    value: function createRay_() {\n      // Create a cylindrical ray.\n      var geometry = new THREE.CylinderGeometry(RAY_RADIUS, RAY_RADIUS, 1, 32);\n      var material = new THREE.MeshBasicMaterial({\n        map: THREE.ImageUtils.loadTexture(GRADIENT_IMAGE),\n        //color: 0xffffff,\n        transparent: true,\n        opacity: 0.3\n      });\n      var mesh = new THREE.Mesh(geometry, material);\n\n      return mesh;\n    }\n  }]);\n\n  return RayRenderer;\n}(_eventemitter2.default);\n\nexports.default = RayRenderer;\n\n},{\"./util\":7,\"eventemitter3\":1}],7:[function(require,module,exports){\n'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.isMobile = isMobile;\nexports.base64 = base64;\n/*\n * Copyright 2016 Google Inc. 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\nfunction isMobile() {\n  var check = false;\n  (function (a) {\n    if (/(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) || /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))) check = true;\n  })(navigator.userAgent || navigator.vendor || window.opera);\n  return check;\n}\n\nfunction base64(mimeType, base64) {\n  return 'data:' + mimeType + ';base64,' + base64;\n}\n\n},{}]},{},[4])(4)\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Vzci9sb2NhbC9saWIvbm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2Jyb3dzZXItcGFjay9fcHJlbHVkZS5qcyIsIm5vZGVfbW9kdWxlcy9ldmVudGVtaXR0ZXIzL2luZGV4LmpzIiwic3JjL29yaWVudGF0aW9uLWFybS1tb2RlbC5qcyIsInNyYy9yYXktY29udHJvbGxlci5qcyIsInNyYy9yYXktaW5wdXQuanMiLCJzcmMvcmF5LWludGVyYWN0aW9uLW1vZGVzLmpzIiwic3JjL3JheS1yZW5kZXJlci5qcyIsInNyYy91dGlsLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7Ozs7O0FDalNBOzs7Ozs7Ozs7Ozs7Ozs7QUFlQSxJQUFNLG9CQUFvQixJQUFJLE1BQU0sT0FBVixDQUFrQixLQUFsQixFQUF5QixDQUFDLEtBQTFCLEVBQWlDLENBQUMsSUFBbEMsQ0FBMUI7QUFDQSxJQUFNLHFCQUFxQixJQUFJLE1BQU0sT0FBVixDQUFrQixDQUFsQixFQUFxQixDQUFyQixFQUF3QixDQUFDLElBQXpCLENBQTNCO0FBQ0EsSUFBTSwwQkFBMEIsSUFBSSxNQUFNLE9BQVYsQ0FBa0IsQ0FBbEIsRUFBcUIsQ0FBckIsRUFBd0IsSUFBeEIsQ0FBaEM7QUFDQSxJQUFNLHVCQUF1QixJQUFJLE1BQU0sT0FBVixDQUFrQixDQUFDLElBQW5CLEVBQXlCLElBQXpCLEVBQStCLElBQS9CLENBQTdCOztBQUVBLElBQU0sbUJBQW1CLEdBQXpCLEMsQ0FBOEI7QUFDOUIsSUFBTSx5QkFBeUIsR0FBL0I7O0FBRUEsSUFBTSxvQkFBb0IsSUFBMUIsQyxDQUFnQzs7QUFFaEM7Ozs7Ozs7SUFNcUIsbUI7QUFDbkIsaUNBQWM7QUFBQTs7QUFDWixTQUFLLFlBQUwsR0FBb0IsS0FBcEI7O0FBRUE7QUFDQSxTQUFLLFdBQUwsR0FBbUIsSUFBSSxNQUFNLFVBQVYsRUFBbkI7QUFDQSxTQUFLLGVBQUwsR0FBdUIsSUFBSSxNQUFNLFVBQVYsRUFBdkI7O0FBRUE7QUFDQSxTQUFLLEtBQUwsR0FBYSxJQUFJLE1BQU0sVUFBVixFQUFiOztBQUVBO0FBQ0EsU0FBSyxPQUFMLEdBQWUsSUFBSSxNQUFNLE9BQVYsRUFBZjs7QUFFQTtBQUNBLFNBQUssUUFBTCxHQUFnQixJQUFJLE1BQU0sT0FBVixFQUFoQjtBQUNBLFNBQUssUUFBTCxHQUFnQixJQUFJLE1BQU0sT0FBVixFQUFoQjs7QUFFQTtBQUNBLFNBQUssSUFBTCxHQUFZLElBQVo7QUFDQSxTQUFLLFFBQUwsR0FBZ0IsSUFBaEI7O0FBRUE7QUFDQSxTQUFLLEtBQUwsR0FBYSxJQUFJLE1BQU0sVUFBVixFQUFiOztBQUVBO0FBQ0EsU0FBSyxJQUFMLEdBQVk7QUFDVixtQkFBYSxJQUFJLE1BQU0sVUFBVixFQURIO0FBRVYsZ0JBQVUsSUFBSSxNQUFNLE9BQVY7QUFGQSxLQUFaO0FBSUQ7O0FBRUQ7Ozs7Ozs7NkNBR3lCLFUsRUFBWTtBQUNuQyxXQUFLLGVBQUwsQ0FBcUIsSUFBckIsQ0FBMEIsS0FBSyxXQUEvQjtBQUNBLFdBQUssV0FBTCxDQUFpQixJQUFqQixDQUFzQixVQUF0QjtBQUNEOzs7dUNBRWtCLFUsRUFBWTtBQUM3QixXQUFLLEtBQUwsQ0FBVyxJQUFYLENBQWdCLFVBQWhCO0FBQ0Q7OztvQ0FFZSxRLEVBQVU7QUFDeEIsV0FBSyxPQUFMLENBQWEsSUFBYixDQUFrQixRQUFsQjtBQUNEOzs7a0NBRWEsWSxFQUFjO0FBQzFCO0FBQ0EsV0FBSyxZQUFMLEdBQW9CLFlBQXBCO0FBQ0Q7O0FBRUQ7Ozs7Ozs2QkFHUztBQUNQLFdBQUssSUFBTCxHQUFZLFlBQVksR0FBWixFQUFaOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQUksV0FBVyxLQUFLLHNCQUFMLEVBQWY7QUFDQSxVQUFJLFlBQVksQ0FBQyxLQUFLLElBQUwsR0FBWSxLQUFLLFFBQWxCLElBQThCLElBQTlDO0FBQ0EsVUFBSSxhQUFhLEtBQUssVUFBTCxDQUFnQixLQUFLLGVBQXJCLEVBQXNDLEtBQUssV0FBM0MsQ0FBakI7QUFDQSxVQUFJLHlCQUF5QixhQUFhLFNBQTFDO0FBQ0EsVUFBSSx5QkFBeUIsaUJBQTdCLEVBQWdEO0FBQzlDO0FBQ0EsYUFBSyxLQUFMLENBQVcsS0FBWCxDQUFpQixRQUFqQixFQUEyQixhQUFhLEVBQXhDO0FBQ0QsT0FIRCxNQUdPO0FBQ0wsYUFBSyxLQUFMLENBQVcsSUFBWCxDQUFnQixRQUFoQjtBQUNEOztBQUVEO0FBQ0E7QUFDQTtBQUNBLFVBQUksa0JBQWtCLElBQUksTUFBTSxLQUFWLEdBQWtCLGlCQUFsQixDQUFvQyxLQUFLLFdBQXpDLEVBQXNELEtBQXRELENBQXRCO0FBQ0EsVUFBSSxpQkFBaUIsTUFBTSxJQUFOLENBQVcsUUFBWCxDQUFvQixnQkFBZ0IsQ0FBcEMsQ0FBckI7QUFDQSxVQUFJLGlCQUFpQixLQUFLLE1BQUwsQ0FBWSxDQUFDLGlCQUFpQixFQUFsQixLQUF5QixLQUFLLEVBQTlCLENBQVosRUFBK0MsQ0FBL0MsRUFBa0QsQ0FBbEQsQ0FBckI7O0FBRUE7QUFDQSxVQUFJLG9CQUFvQixLQUFLLEtBQUwsQ0FBVyxLQUFYLEdBQW1CLE9BQW5CLEVBQXhCO0FBQ0Esd0JBQWtCLFFBQWxCLENBQTJCLEtBQUssV0FBaEM7O0FBRUE7QUFDQSxVQUFJLFdBQVcsS0FBSyxRQUFwQjtBQUNBLGVBQVMsSUFBVCxDQUFjLEtBQUssT0FBbkIsRUFBNEIsR0FBNUIsQ0FBZ0MsaUJBQWhDO0FBQ0EsVUFBSSxjQUFjLElBQUksTUFBTSxPQUFWLEdBQW9CLElBQXBCLENBQXlCLG9CQUF6QixDQUFsQjtBQUNBLGtCQUFZLGNBQVosQ0FBMkIsY0FBM0I7QUFDQSxlQUFTLEdBQVQsQ0FBYSxXQUFiOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFVBQUksYUFBYSxLQUFLLFVBQUwsQ0FBZ0IsaUJBQWhCLEVBQW1DLElBQUksTUFBTSxVQUFWLEVBQW5DLENBQWpCO0FBQ0EsVUFBSSxnQkFBZ0IsTUFBTSxJQUFOLENBQVcsUUFBWCxDQUFvQixVQUFwQixDQUFwQjtBQUNBLFVBQUksa0JBQWtCLElBQUksS0FBSyxHQUFMLENBQVMsZ0JBQWdCLEdBQXpCLEVBQThCLENBQTlCLENBQTFCLENBeENPLENBd0NxRDs7QUFFNUQsVUFBSSxhQUFhLGdCQUFqQjtBQUNBLFVBQUksYUFBYSxJQUFJLGdCQUFyQjtBQUNBLFVBQUksWUFBWSxtQkFDWCxhQUFhLGFBQWEsY0FBYixHQUE4QixzQkFEaEMsQ0FBaEI7O0FBR0EsVUFBSSxTQUFTLElBQUksTUFBTSxVQUFWLEdBQXVCLEtBQXZCLENBQTZCLGlCQUE3QixFQUFnRCxTQUFoRCxDQUFiO0FBQ0EsVUFBSSxZQUFZLE9BQU8sT0FBUCxFQUFoQjtBQUNBLFVBQUksU0FBUyxrQkFBa0IsS0FBbEIsR0FBMEIsUUFBMUIsQ0FBbUMsU0FBbkMsQ0FBYjs7QUFFQTtBQUNBO0FBQ0E7Ozs7Ozs7O0FBUUEsVUFBSSxXQUFXLEtBQUssUUFBcEI7QUFDQSxlQUFTLElBQVQsQ0FBYyx1QkFBZDtBQUNBLGVBQVMsZUFBVCxDQUF5QixNQUF6QjtBQUNBLGVBQVMsR0FBVCxDQUFhLGtCQUFiO0FBQ0EsZUFBUyxlQUFULENBQXlCLE1BQXpCO0FBQ0EsZUFBUyxHQUFULENBQWEsS0FBSyxRQUFsQjs7QUFFQSxVQUFJLFNBQVMsSUFBSSxNQUFNLE9BQVYsR0FBb0IsSUFBcEIsQ0FBeUIsb0JBQXpCLENBQWI7QUFDQSxhQUFPLGNBQVAsQ0FBc0IsY0FBdEI7O0FBRUEsVUFBSSxXQUFXLElBQUksTUFBTSxPQUFWLEdBQW9CLElBQXBCLENBQXlCLEtBQUssUUFBOUIsQ0FBZjtBQUNBLGVBQVMsR0FBVCxDQUFhLE1BQWI7QUFDQSxlQUFTLGVBQVQsQ0FBeUIsS0FBSyxLQUE5Qjs7QUFFQSxVQUFJLGNBQWMsSUFBSSxNQUFNLFVBQVYsR0FBdUIsSUFBdkIsQ0FBNEIsS0FBSyxXQUFqQyxDQUFsQjs7QUFFQTtBQUNBLFdBQUssSUFBTCxDQUFVLFdBQVYsQ0FBc0IsSUFBdEIsQ0FBMkIsV0FBM0I7QUFDQSxXQUFLLElBQUwsQ0FBVSxRQUFWLENBQW1CLElBQW5CLENBQXdCLFFBQXhCOztBQUVBLFdBQUssUUFBTCxHQUFnQixLQUFLLElBQXJCO0FBQ0Q7O0FBRUQ7Ozs7Ozs4QkFHVTtBQUNSLGFBQU8sS0FBSyxJQUFaO0FBQ0Q7O0FBRUQ7Ozs7Ozt1Q0FHbUI7QUFDakIsYUFBTyxtQkFBbUIsTUFBbkIsRUFBUDtBQUNEOzs7dUNBRWtCO0FBQ2pCLFVBQUksTUFBTSxLQUFLLFFBQUwsQ0FBYyxLQUFkLEVBQVY7QUFDQSxhQUFPLElBQUksZUFBSixDQUFvQixLQUFLLEtBQXpCLENBQVA7QUFDRDs7O3VDQUVrQjtBQUNqQixVQUFJLE1BQU0sS0FBSyxRQUFMLENBQWMsS0FBZCxFQUFWO0FBQ0EsYUFBTyxJQUFJLGVBQUosQ0FBb0IsS0FBSyxLQUF6QixDQUFQO0FBQ0Q7Ozs2Q0FFd0I7QUFDdkIsVUFBSSxZQUFZLElBQUksTUFBTSxLQUFWLEdBQWtCLGlCQUFsQixDQUFvQyxLQUFLLEtBQXpDLEVBQWdELEtBQWhELENBQWhCO0FBQ0EsZ0JBQVUsQ0FBVixHQUFjLENBQWQ7QUFDQSxnQkFBVSxDQUFWLEdBQWMsQ0FBZDtBQUNBLFVBQUksZUFBZSxJQUFJLE1BQU0sVUFBVixHQUF1QixZQUF2QixDQUFvQyxTQUFwQyxDQUFuQjtBQUNBLGFBQU8sWUFBUDtBQUNEOzs7MkJBRU0sSyxFQUFPLEcsRUFBSyxHLEVBQUs7QUFDdEIsYUFBTyxLQUFLLEdBQUwsQ0FBUyxLQUFLLEdBQUwsQ0FBUyxLQUFULEVBQWdCLEdBQWhCLENBQVQsRUFBK0IsR0FBL0IsQ0FBUDtBQUNEOzs7K0JBRVUsRSxFQUFJLEUsRUFBSTtBQUNqQixVQUFJLE9BQU8sSUFBSSxNQUFNLE9BQVYsQ0FBa0IsQ0FBbEIsRUFBcUIsQ0FBckIsRUFBd0IsQ0FBQyxDQUF6QixDQUFYO0FBQ0EsVUFBSSxPQUFPLElBQUksTUFBTSxPQUFWLENBQWtCLENBQWxCLEVBQXFCLENBQXJCLEVBQXdCLENBQUMsQ0FBekIsQ0FBWDtBQUNBLFdBQUssZUFBTCxDQUFxQixFQUFyQjtBQUNBLFdBQUssZUFBTCxDQUFxQixFQUFyQjtBQUNBLGFBQU8sS0FBSyxPQUFMLENBQWEsSUFBYixDQUFQO0FBQ0Q7Ozs7OztrQkF0TGtCLG1COzs7Ozs7Ozs7OztBQ2hCckI7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7OzsrZUFqQkE7Ozs7Ozs7Ozs7Ozs7OztBQW1CQSxJQUFNLG1CQUFtQixFQUF6Qjs7QUFFQTs7Ozs7Ozs7Ozs7Ozs7SUFhcUIsYTs7O0FBQ25CLHlCQUFZLE1BQVosRUFBb0I7QUFBQTs7QUFBQTs7QUFFbEIsUUFBSSxLQUFLLFVBQVUsTUFBbkI7O0FBRUE7QUFDQSxPQUFHLGdCQUFILENBQW9CLFdBQXBCLEVBQWlDLE1BQUssWUFBTCxDQUFrQixJQUFsQixPQUFqQztBQUNBLE9BQUcsZ0JBQUgsQ0FBb0IsV0FBcEIsRUFBaUMsTUFBSyxZQUFMLENBQWtCLElBQWxCLE9BQWpDO0FBQ0EsT0FBRyxnQkFBSCxDQUFvQixTQUFwQixFQUErQixNQUFLLFVBQUwsQ0FBZ0IsSUFBaEIsT0FBL0I7QUFDQSxPQUFHLGdCQUFILENBQW9CLFlBQXBCLEVBQWtDLE1BQUssYUFBTCxDQUFtQixJQUFuQixPQUFsQztBQUNBLE9BQUcsZ0JBQUgsQ0FBb0IsV0FBcEIsRUFBaUMsTUFBSyxZQUFMLENBQWtCLElBQWxCLE9BQWpDO0FBQ0EsT0FBRyxnQkFBSCxDQUFvQixVQUFwQixFQUFnQyxNQUFLLFdBQUwsQ0FBaUIsSUFBakIsT0FBaEM7O0FBRUEsVUFBSyxPQUFMLEdBQWUsRUFBZjs7QUFFQTtBQUNBLFVBQUssT0FBTCxHQUFlLElBQUksTUFBTSxPQUFWLEVBQWY7QUFDQTtBQUNBLFVBQUssV0FBTCxHQUFtQixJQUFJLE1BQU0sT0FBVixFQUFuQjtBQUNBO0FBQ0EsVUFBSyxVQUFMLEdBQWtCLElBQUksTUFBTSxPQUFWLEVBQWxCO0FBQ0E7QUFDQSxVQUFLLFlBQUwsR0FBb0IsQ0FBcEI7QUFDQTtBQUNBLFVBQUssVUFBTCxHQUFrQixLQUFsQjtBQUNBO0FBQ0EsVUFBSyxhQUFMLEdBQXFCLEtBQXJCOztBQUVBO0FBQ0EsVUFBSyxPQUFMLEdBQWUsSUFBZjs7QUFFQTtBQUNBLFFBQUksQ0FBQyxVQUFVLGFBQWYsRUFBOEI7QUFDNUIsY0FBUSxJQUFSLENBQWEsNkRBQWI7QUFDRCxLQUZELE1BRU87QUFDTCxnQkFBVSxhQUFWLEdBQTBCLElBQTFCLENBQStCLFVBQUMsUUFBRCxFQUFjO0FBQzNDLGNBQUssU0FBTCxHQUFpQixTQUFTLENBQVQsQ0FBakI7QUFDRCxPQUZEO0FBR0Q7QUFyQ2lCO0FBc0NuQjs7Ozt5Q0FFb0I7QUFDbkI7QUFDQTs7QUFFQSxVQUFJLFVBQVUsS0FBSyxhQUFMLEVBQWQ7O0FBRUEsVUFBSSxPQUFKLEVBQWE7QUFDWCxZQUFJLFFBQVEsRUFBUixDQUFXLFFBQVgsQ0FBb0IsU0FBcEIsQ0FBSixFQUFvQztBQUNsQyxpQkFBTyw4QkFBaUIsT0FBeEI7QUFDRDs7QUFFRCxZQUFJLE9BQU8sUUFBUSxJQUFuQjtBQUNBO0FBQ0EsWUFBSSxLQUFLLFdBQVQsRUFBc0I7QUFDcEIsaUJBQU8sOEJBQWlCLE9BQXhCO0FBQ0Q7O0FBRUQsWUFBSSxLQUFLLGNBQVQsRUFBeUI7QUFDdkIsaUJBQU8sOEJBQWlCLE9BQXhCO0FBQ0Q7QUFDRixPQWRELE1BY087QUFDTDtBQUNBLFlBQUkscUJBQUosRUFBZ0I7QUFDZDtBQUNBO0FBQ0EsY0FBSSxLQUFLLFNBQUwsSUFBa0IsS0FBSyxTQUFMLENBQWUsWUFBckMsRUFBbUQ7QUFDakQsbUJBQU8sOEJBQWlCLE9BQXhCO0FBQ0QsV0FGRCxNQUVPO0FBQ0wsbUJBQU8sOEJBQWlCLEtBQXhCO0FBQ0Q7QUFDRixTQVJELE1BUU87QUFDTDtBQUNBLGlCQUFPLDhCQUFpQixLQUF4QjtBQUNEO0FBQ0Y7QUFDRDtBQUNBLGFBQU8sOEJBQWlCLEtBQXhCO0FBQ0Q7OztxQ0FFZ0I7QUFDZixVQUFJLFVBQVUsS0FBSyxhQUFMLEVBQWQ7QUFDQSxhQUFPLFFBQVEsSUFBZjtBQUNEOztBQUVEOzs7Ozs7O3VDQUltQjtBQUNqQixhQUFPLEtBQUssYUFBWjtBQUNEOzs7NEJBRU8sSSxFQUFNO0FBQ1osV0FBSyxJQUFMLEdBQVksSUFBWjtBQUNBLFdBQUssWUFBTCxHQUFvQixFQUFFLE1BQU0sQ0FBUixFQUFXLEtBQUssQ0FBaEIsRUFBcEI7QUFDQSxVQUFJLE9BQU8sS0FBSyxPQUFMLENBQWEscUJBQXBCLEtBQStDLFVBQW5ELEVBQStEO0FBQzdELGFBQUssWUFBTCxHQUFvQixLQUFLLE9BQUwsQ0FBYSxxQkFBYixFQUFwQjtBQUNEO0FBQ0Y7Ozs2QkFFUTtBQUNQLFVBQUksQ0FBQyxLQUFLLE9BQVYsRUFDRTs7QUFFRjtBQUNBO0FBQ0EsVUFBSSxtQkFBbUIsS0FBSyx3QkFBTCxFQUF2QjtBQUNBLFVBQUksb0JBQW9CLENBQUMsS0FBSyxpQkFBOUIsRUFBaUQ7QUFDL0MsYUFBSyxJQUFMLENBQVUsU0FBVjtBQUNEO0FBQ0QsVUFBSSxDQUFDLGdCQUFELElBQXFCLEtBQUssaUJBQTlCLEVBQWlEO0FBQy9DLGFBQUssSUFBTCxDQUFVLE9BQVY7QUFDRDtBQUNELFdBQUssaUJBQUwsR0FBeUIsZ0JBQXpCO0FBQ0Q7OzsrQ0FFMEI7QUFDekIsVUFBSSxVQUFVLEtBQUssYUFBTCxFQUFkO0FBQ0EsVUFBSSxDQUFDLE9BQUwsRUFBYztBQUNaO0FBQ0EsZUFBTyxLQUFQO0FBQ0Q7QUFDRDtBQUNBLFdBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxRQUFRLE9BQVIsQ0FBZ0IsTUFBcEMsRUFBNEMsRUFBRSxDQUE5QyxFQUFpRDtBQUMvQyxZQUFJLFFBQVEsT0FBUixDQUFnQixDQUFoQixFQUFtQixPQUF2QixFQUFnQztBQUM5QixpQkFBTyxJQUFQO0FBQ0Q7QUFDRjtBQUNELGFBQU8sS0FBUDtBQUNEOzs7aUNBRVksQyxFQUFHO0FBQ2QsV0FBSyxjQUFMLENBQW9CLENBQXBCO0FBQ0EsV0FBSyxJQUFMLENBQVUsU0FBVixFQUFxQixDQUFyQjtBQUNEOzs7aUNBRVksQyxFQUFHO0FBQ2QsV0FBSyxjQUFMLENBQW9CLENBQXBCO0FBQ0EsV0FBSyxtQkFBTDtBQUNBLFdBQUssSUFBTCxDQUFVLGFBQVYsRUFBeUIsS0FBSyxVQUE5QjtBQUNEOzs7K0JBRVUsQyxFQUFHO0FBQ1osV0FBSyxZQUFMLENBQWtCLENBQWxCO0FBQ0Q7OztrQ0FFYSxDLEVBQUc7QUFDZixXQUFLLGFBQUwsR0FBcUIsSUFBckI7QUFDQSxVQUFJLElBQUksRUFBRSxPQUFGLENBQVUsQ0FBVixDQUFSO0FBQ0EsV0FBSyxjQUFMLENBQW9CLENBQXBCO0FBQ0EsV0FBSyxtQkFBTCxDQUF5QixDQUF6Qjs7QUFFQSxXQUFLLElBQUwsQ0FBVSxhQUFWLEVBQXlCLEtBQUssVUFBOUI7QUFDQSxXQUFLLElBQUwsQ0FBVSxTQUFWLEVBQXFCLENBQXJCO0FBQ0Q7OztpQ0FFWSxDLEVBQUc7QUFDZCxXQUFLLG1CQUFMLENBQXlCLENBQXpCO0FBQ0EsV0FBSyxtQkFBTDs7QUFFQTtBQUNBLFFBQUUsY0FBRjtBQUNEOzs7Z0NBRVcsQyxFQUFHO0FBQ2IsV0FBSyxZQUFMLENBQWtCLENBQWxCOztBQUVBLFdBQUssYUFBTCxHQUFxQixLQUFyQjtBQUNEOzs7d0NBRW1CLEMsRUFBRztBQUNyQjtBQUNBLFVBQUksRUFBRSxPQUFGLENBQVUsTUFBVixLQUFxQixDQUF6QixFQUE0QjtBQUMxQixnQkFBUSxJQUFSLENBQWEsdUNBQWI7QUFDQTtBQUNEO0FBQ0QsVUFBSSxJQUFJLEVBQUUsT0FBRixDQUFVLENBQVYsQ0FBUjtBQUNBLFdBQUssY0FBTCxDQUFvQixDQUFwQjtBQUNEOzs7bUNBRWMsQyxFQUFHO0FBQ2hCO0FBQ0EsVUFBSSxJQUFJLEVBQUUsT0FBRixHQUFZLEtBQUssWUFBTCxDQUFrQixJQUF0QztBQUNBLFVBQUksSUFBSSxFQUFFLE9BQUYsR0FBWSxLQUFLLFlBQUwsQ0FBa0IsR0FBdEM7QUFDQSxVQUFJLEtBQUssSUFBSSxLQUFLLElBQUwsQ0FBVSxLQUF2QjtBQUNBLFVBQUksS0FBSyxJQUFJLEtBQUssSUFBTCxDQUFVLE1BQXZCO0FBQ0EsV0FBSyxPQUFMLENBQWEsR0FBYixDQUFpQixDQUFqQixFQUFvQixDQUFwQjtBQUNBLFdBQUssVUFBTCxDQUFnQixDQUFoQixHQUFxQixLQUFLLENBQU4sR0FBVyxDQUEvQjtBQUNBLFdBQUssVUFBTCxDQUFnQixDQUFoQixHQUFvQixFQUFFLEtBQUssQ0FBUCxJQUFZLENBQWhDO0FBQ0Q7OzswQ0FFcUI7QUFDcEIsVUFBSSxLQUFLLFVBQVQsRUFBcUI7QUFDbkIsWUFBSSxXQUFXLEtBQUssV0FBTCxDQUFpQixHQUFqQixDQUFxQixLQUFLLE9BQTFCLEVBQW1DLE1BQW5DLEVBQWY7QUFDQSxhQUFLLFlBQUwsSUFBcUIsUUFBckI7QUFDQSxhQUFLLFdBQUwsQ0FBaUIsSUFBakIsQ0FBc0IsS0FBSyxPQUEzQjs7QUFFQSxZQUFJLEtBQUssWUFBTCxHQUFvQixnQkFBeEIsRUFBMEM7QUFDeEMsZUFBSyxJQUFMLENBQVUsV0FBVjtBQUNBLGVBQUssVUFBTCxHQUFrQixLQUFsQjtBQUNEO0FBQ0Y7QUFDRjs7O21DQUVjLEMsRUFBRztBQUNoQixXQUFLLFVBQUwsR0FBa0IsSUFBbEI7QUFDQSxXQUFLLFlBQUwsR0FBb0IsQ0FBcEI7QUFDQSxXQUFLLFdBQUwsQ0FBaUIsR0FBakIsQ0FBcUIsRUFBRSxPQUF2QixFQUFnQyxFQUFFLE9BQWxDO0FBQ0Q7OztpQ0FFWSxDLEVBQUc7QUFDZCxVQUFJLEtBQUssWUFBTCxHQUFvQixnQkFBeEIsRUFBMEM7QUFDeEMsYUFBSyxJQUFMLENBQVUsT0FBVixFQUFtQixDQUFuQjtBQUNEO0FBQ0QsV0FBSyxZQUFMLEdBQW9CLENBQXBCO0FBQ0EsV0FBSyxVQUFMLEdBQWtCLEtBQWxCO0FBQ0Q7O0FBRUQ7Ozs7OztvQ0FHZ0I7QUFDZDtBQUNBLFVBQUksQ0FBQyxVQUFVLFdBQWYsRUFBNEI7QUFDMUIsZUFBTyxJQUFQO0FBQ0Q7O0FBRUQsVUFBSSxXQUFXLFVBQVUsV0FBVixFQUFmO0FBQ0EsV0FBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLFNBQVMsTUFBN0IsRUFBcUMsRUFBRSxDQUF2QyxFQUEwQztBQUN4QyxZQUFJLFVBQVUsU0FBUyxDQUFULENBQWQ7QUFDQTtBQUNBO0FBQ0EsWUFBSSxXQUFXLFFBQVEsRUFBUixLQUFlLHFCQUE5QixFQUNFOztBQUVGO0FBQ0E7QUFDQSxZQUFJLFlBQVksUUFBUSxJQUFSLElBQWdCLFFBQVEsRUFBUixDQUFXLFFBQVgsQ0FBb0IsU0FBcEIsQ0FBNUIsQ0FBSixFQUFpRTtBQUMvRCxlQUFLLE9BQUwsR0FBZSxPQUFmO0FBQ0EsaUJBQU8sT0FBUDtBQUNEO0FBQ0Y7QUFDRCxhQUFPLElBQVA7QUFDRDs7Ozs7O2tCQXBQa0IsYTs7Ozs7Ozs7Ozs7QUNuQnJCOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7K2VBbkJBOzs7Ozs7Ozs7Ozs7Ozs7QUFxQkE7OztJQUdxQixROzs7QUFDbkIsb0JBQVksTUFBWixFQUFvQixNQUFwQixFQUE0QjtBQUFBOztBQUFBOztBQUcxQixVQUFLLE1BQUwsR0FBYyxNQUFkO0FBQ0EsVUFBSyxRQUFMLEdBQWdCLDBCQUFnQixNQUFoQixDQUFoQjtBQUNBLFVBQUssVUFBTCxHQUFrQiw0QkFBa0IsTUFBbEIsQ0FBbEI7O0FBRUE7QUFDQSxVQUFLLFFBQUwsR0FBZ0IsbUNBQWhCOztBQUVBLFVBQUssVUFBTCxDQUFnQixFQUFoQixDQUFtQixTQUFuQixFQUE4QixNQUFLLFVBQUwsQ0FBZ0IsSUFBaEIsT0FBOUI7QUFDQSxVQUFLLFVBQUwsQ0FBZ0IsRUFBaEIsQ0FBbUIsT0FBbkIsRUFBNEIsTUFBSyxRQUFMLENBQWMsSUFBZCxPQUE1QjtBQUNBLFVBQUssVUFBTCxDQUFnQixFQUFoQixDQUFtQixXQUFuQixFQUFnQyxNQUFLLFlBQUwsQ0FBa0IsSUFBbEIsT0FBaEM7QUFDQSxVQUFLLFVBQUwsQ0FBZ0IsRUFBaEIsQ0FBbUIsYUFBbkIsRUFBa0MsTUFBSyxjQUFMLENBQW9CLElBQXBCLE9BQWxDO0FBQ0EsVUFBSyxRQUFMLENBQWMsRUFBZCxDQUFpQixTQUFqQixFQUE0QixVQUFDLElBQUQsRUFBVTtBQUFFLFlBQUssSUFBTCxDQUFVLFNBQVYsRUFBcUIsSUFBckI7QUFBNEIsS0FBcEU7QUFDQSxVQUFLLFFBQUwsQ0FBYyxFQUFkLENBQWlCLFFBQWpCLEVBQTJCLFVBQUMsSUFBRCxFQUFVO0FBQUUsWUFBSyxJQUFMLENBQVUsUUFBVixFQUFvQixJQUFwQjtBQUEyQixLQUFsRTs7QUFFQTtBQUNBLFVBQUssVUFBTCxHQUFrQixJQUFJLE1BQU0sT0FBVixDQUFrQixDQUFsQixFQUFxQixDQUFyQixDQUFsQjs7QUFFQTtBQUNBLFVBQUssUUFBTCxHQUFnQixFQUFoQjtBQXJCMEI7QUFzQjNCOzs7O3dCQUVHLE0sRUFBUSxRLEVBQVU7QUFDcEIsV0FBSyxRQUFMLENBQWMsR0FBZCxDQUFrQixNQUFsQixFQUEwQixRQUExQjtBQUNBLFdBQUssUUFBTCxDQUFjLE9BQU8sRUFBckIsSUFBMkIsUUFBM0I7QUFDRDs7OzJCQUVNLE0sRUFBUTtBQUNiLFdBQUssUUFBTCxDQUFjLE1BQWQsQ0FBcUIsTUFBckI7QUFDQSxhQUFPLEtBQUssUUFBTCxDQUFjLE9BQU8sRUFBckIsQ0FBUDtBQUNEOzs7MkJBRU0sTSxFQUFRO0FBQ2IsV0FBSyxhQUFMLEdBQXFCLE1BQXJCOztBQUVBLFVBQUksT0FBTyxLQUFLLFVBQUwsQ0FBZ0Isa0JBQWhCLEVBQVg7QUFDQSxjQUFRLElBQVI7QUFDRSxhQUFLLDhCQUFpQixLQUF0QjtBQUNFO0FBQ0EsZUFBSyxRQUFMLENBQWMsVUFBZCxDQUF5QixLQUFLLFVBQTlCO0FBQ0E7QUFDQSxlQUFLLFFBQUwsQ0FBYyxnQkFBZCxDQUErQixLQUEvQjtBQUNBLGVBQUssUUFBTCxDQUFjLG9CQUFkLENBQW1DLEtBQW5DOztBQUVBO0FBQ0EsZUFBSyxRQUFMLENBQWMsU0FBZCxDQUF3QixJQUF4QjtBQUNBOztBQUVGLGFBQUssOEJBQWlCLEtBQXRCO0FBQ0U7QUFDQTtBQUNBLGVBQUssUUFBTCxDQUFjLFVBQWQsQ0FBeUIsS0FBSyxVQUE5Qjs7QUFFQTtBQUNBLGVBQUssUUFBTCxDQUFjLGdCQUFkLENBQStCLEtBQS9CO0FBQ0EsZUFBSyxRQUFMLENBQWMsb0JBQWQsQ0FBbUMsS0FBbkM7O0FBRUE7QUFDQSxlQUFLLFFBQUwsQ0FBYyxTQUFkLENBQXdCLEtBQUssVUFBTCxDQUFnQixnQkFBaEIsRUFBeEI7QUFDQTs7QUFFRixhQUFLLDhCQUFpQixPQUF0QjtBQUNFO0FBQ0EsZUFBSyxRQUFMLENBQWMsV0FBZCxDQUEwQixLQUFLLE1BQUwsQ0FBWSxRQUF0QztBQUNBLGVBQUssUUFBTCxDQUFjLGNBQWQsQ0FBNkIsS0FBSyxNQUFMLENBQVksVUFBekM7O0FBRUE7QUFDQSxlQUFLLFFBQUwsQ0FBYyxnQkFBZCxDQUErQixLQUEvQjtBQUNBLGVBQUssUUFBTCxDQUFjLG9CQUFkLENBQW1DLElBQW5DOztBQUVBO0FBQ0EsZUFBSyxRQUFMLENBQWMsU0FBZCxDQUF3QixJQUF4QjtBQUNBOztBQUVGLGFBQUssOEJBQWlCLE9BQXRCO0FBQ0U7QUFDQTtBQUNBO0FBQ0EsY0FBSSxPQUFPLEtBQUssVUFBTCxDQUFnQixjQUFoQixFQUFYOztBQUVBO0FBQ0E7QUFDQSxjQUFJLHdCQUF3QixJQUFJLE1BQU0sVUFBVixHQUF1QixTQUF2QixDQUFpQyxLQUFLLFdBQXRDLENBQTVCOztBQUVBO0FBQ0E7Ozs7Ozs7QUFPQTtBQUNBLGVBQUssUUFBTCxDQUFjLGtCQUFkLENBQWlDLEtBQUssTUFBTCxDQUFZLFVBQTdDO0FBQ0EsZUFBSyxRQUFMLENBQWMsZUFBZCxDQUE4QixLQUFLLE1BQUwsQ0FBWSxRQUExQztBQUNBLGVBQUssUUFBTCxDQUFjLHdCQUFkLENBQXVDLHFCQUF2QztBQUNBLGVBQUssUUFBTCxDQUFjLE1BQWQ7O0FBRUE7QUFDQSxjQUFJLFlBQVksS0FBSyxRQUFMLENBQWMsT0FBZCxFQUFoQjtBQUNBLGVBQUssUUFBTCxDQUFjLFdBQWQsQ0FBMEIsVUFBVSxRQUFwQztBQUNBO0FBQ0EsZUFBSyxRQUFMLENBQWMsY0FBZCxDQUE2QixVQUFVLFdBQXZDO0FBQ0E7O0FBRUE7QUFDQSxlQUFLLFFBQUwsQ0FBYyxnQkFBZCxDQUErQixJQUEvQjtBQUNBLGVBQUssUUFBTCxDQUFjLG9CQUFkLENBQW1DLElBQW5DOztBQUVBO0FBQ0EsZUFBSyxRQUFMLENBQWMsU0FBZCxDQUF3QixJQUF4QjtBQUNBOztBQUVGLGFBQUssOEJBQWlCLE9BQXRCO0FBQ0U7QUFDQTtBQUNBLGNBQUksT0FBTyxLQUFLLFVBQUwsQ0FBZ0IsY0FBaEIsRUFBWDs7QUFFQTtBQUNBLGNBQUksQ0FBQyxLQUFLLFdBQU4sSUFBcUIsQ0FBQyxLQUFLLFFBQS9CLEVBQXlDO0FBQ3ZDLG9CQUFRLElBQVIsQ0FBYSwwQ0FBYjtBQUNBO0FBQ0Q7O0FBRUQ7QUFDQTtBQUNBLGNBQUksV0FBVyxJQUFJLE1BQU0sT0FBVixHQUFvQixTQUFwQixDQUE4QixLQUFLLFFBQW5DLENBQWY7QUFDQSxtQkFBUyxZQUFULENBQXNCLEtBQUssTUFBTCxDQUFZLFdBQWxDO0FBQ0EsY0FBSSxjQUFjLElBQUksTUFBTSxVQUFWLEdBQXVCLG1CQUF2QixDQUNkLEtBQUssTUFBTCxDQUFZLFVBREUsRUFFZCxJQUFJLE1BQU0sVUFBVixHQUF1QixTQUF2QixDQUFpQyxLQUFLLFdBQXRDLENBRmMsQ0FBbEI7O0FBSUEsZUFBSyxRQUFMLENBQWMsY0FBZCxDQUE2QixXQUE3QjtBQUNBLGVBQUssUUFBTCxDQUFjLFdBQWQsQ0FBMEIsUUFBMUI7O0FBRUE7QUFDQSxlQUFLLFFBQUwsQ0FBYyxnQkFBZCxDQUErQixJQUEvQjtBQUNBLGVBQUssUUFBTCxDQUFjLG9CQUFkLENBQW1DLElBQW5DOztBQUVBO0FBQ0EsZUFBSyxRQUFMLENBQWMsU0FBZCxDQUF3QixJQUF4QjtBQUNBOztBQUVGO0FBQ0Usa0JBQVEsS0FBUixDQUFjLDJCQUFkO0FBNUdKO0FBOEdBLFdBQUssUUFBTCxDQUFjLE1BQWQsQ0FBcUIsTUFBckI7QUFDQSxXQUFLLFVBQUwsQ0FBZ0IsTUFBaEI7QUFDRDs7OzRCQUVPLEksRUFBTTtBQUNaLFdBQUssVUFBTCxDQUFnQixPQUFoQixDQUF3QixJQUF4QjtBQUNEOzs7OEJBRVM7QUFDUixhQUFPLEtBQUssUUFBTCxDQUFjLGlCQUFkLEVBQVA7QUFDRDs7O2dDQUVXO0FBQ1YsYUFBTyxLQUFLLFFBQUwsQ0FBYyxTQUFkLEVBQVA7QUFDRDs7O21DQUVjO0FBQ2IsYUFBTyxLQUFLLFFBQUwsQ0FBYyxZQUFkLEVBQVA7QUFDRDs7O3dDQUVtQjtBQUNsQixVQUFJLFNBQVMsSUFBSSxNQUFNLE9BQVYsQ0FBa0IsQ0FBbEIsRUFBcUIsQ0FBckIsRUFBd0IsQ0FBQyxDQUF6QixDQUFiO0FBQ0EsYUFBTyxlQUFQLENBQXVCLEtBQUssTUFBTCxDQUFZLFVBQW5DO0FBQ0EsYUFBTyxJQUFJLE1BQU0sT0FBVixHQUFvQixZQUFwQixDQUFpQyxNQUFqQyxFQUF5QyxLQUFLLE1BQUwsQ0FBWSxFQUFyRCxDQUFQO0FBQ0Q7OzsrQkFFVSxDLEVBQUc7QUFBQTs7QUFDWjs7QUFFQTtBQUNBLGlCQUFXLFlBQU07QUFDZixlQUFLLE1BQUwsQ0FBWSxPQUFLLGFBQWpCO0FBQ0EsWUFBSSxPQUFPLE9BQUssUUFBTCxDQUFjLGVBQWQsRUFBWDs7QUFFQSxlQUFLLFdBQUwsR0FBbUIsSUFBbkI7QUFDQSxlQUFLLElBQUwsQ0FBVSxTQUFWLEVBQXFCLElBQXJCOztBQUVBLGVBQUssUUFBTCxDQUFjLFNBQWQsQ0FBd0IsSUFBeEI7QUFDRCxPQVJELEVBUUcsQ0FSSDtBQVNEOzs7NkJBRVEsQyxFQUFHO0FBQ1Y7O0FBRUEsVUFBSSxLQUFLLEtBQUssV0FBZCxFQUEyQjtBQUN2QixVQUFFLGNBQUY7QUFDSDs7QUFFRCxXQUFLLElBQUwsQ0FBVSxPQUFWLEVBQW1CLEtBQUssV0FBeEI7QUFDQSxXQUFLLFdBQUwsR0FBbUIsSUFBbkI7O0FBRUEsV0FBSyxRQUFMLENBQWMsU0FBZCxDQUF3QixLQUF4QjtBQUNEOzs7aUNBRVksQyxFQUFHO0FBQ2Q7QUFDQSxVQUFJLE9BQU8sS0FBSyxRQUFMLENBQWMsZUFBZCxFQUFYO0FBQ0EsV0FBSyxJQUFMLENBQVUsV0FBVixFQUF1QixJQUF2QjtBQUNEOzs7bUNBRWMsRyxFQUFLO0FBQ2xCLFdBQUssVUFBTCxDQUFnQixJQUFoQixDQUFxQixHQUFyQjtBQUNEOzs7Ozs7a0JBbk5rQixROzs7Ozs7OztBQ3hCckI7Ozs7Ozs7Ozs7Ozs7OztBQWVBLElBQUksbUJBQW1CO0FBQ3JCLFNBQU8sQ0FEYztBQUVyQixTQUFPLENBRmM7QUFHckIsV0FBUyxDQUhZO0FBSXJCLFdBQVMsQ0FKWTtBQUtyQixXQUFTO0FBTFksQ0FBdkI7O1FBUTZCLE8sR0FBcEIsZ0I7Ozs7Ozs7Ozs7O0FDUlQ7O0FBQ0E7Ozs7Ozs7Ozs7K2VBaEJBOzs7Ozs7Ozs7Ozs7Ozs7QUFrQkEsSUFBTSxtQkFBbUIsQ0FBekI7QUFDQSxJQUFNLGVBQWUsSUFBckI7QUFDQSxJQUFNLGVBQWUsSUFBckI7QUFDQSxJQUFNLGFBQWEsSUFBbkI7QUFDQSxJQUFNLGlCQUFpQixrQkFBTyxXQUFQLEVBQW9CLGtrQkFBcEIsQ0FBdkI7O0FBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7SUFlcUIsVzs7O0FBQ25CLHVCQUFZLE1BQVosRUFBb0IsVUFBcEIsRUFBZ0M7QUFBQTs7QUFBQTs7QUFHOUIsVUFBSyxNQUFMLEdBQWMsTUFBZDs7QUFFQSxRQUFJLFNBQVMsY0FBYyxFQUEzQjs7QUFFQTtBQUNBLFVBQUssTUFBTCxHQUFjLEVBQWQ7O0FBRUE7QUFDQSxVQUFLLFFBQUwsR0FBZ0IsRUFBaEI7O0FBRUE7QUFDQSxVQUFLLFNBQUwsR0FBaUIsSUFBSSxNQUFNLFNBQVYsRUFBakI7O0FBRUE7QUFDQSxVQUFLLFFBQUwsR0FBZ0IsSUFBSSxNQUFNLE9BQVYsRUFBaEI7QUFDQSxVQUFLLFdBQUwsR0FBbUIsSUFBSSxNQUFNLFVBQVYsRUFBbkI7O0FBRUEsVUFBSyxJQUFMLEdBQVksSUFBSSxNQUFNLFFBQVYsRUFBWjs7QUFFQTtBQUNBLFVBQUssT0FBTCxHQUFlLE1BQUssY0FBTCxFQUFmO0FBQ0EsVUFBSyxJQUFMLENBQVUsR0FBVixDQUFjLE1BQUssT0FBbkI7O0FBRUE7QUFDQSxVQUFLLEdBQUwsR0FBVyxNQUFLLFVBQUwsRUFBWDtBQUNBLFVBQUssSUFBTCxDQUFVLEdBQVYsQ0FBYyxNQUFLLEdBQW5COztBQUVBO0FBQ0EsVUFBSyxlQUFMLEdBQXVCLGdCQUF2QjtBQS9COEI7QUFnQy9COztBQUVEOzs7Ozs7O3dCQUdJLE0sRUFBUTtBQUNWLFdBQUssTUFBTCxDQUFZLE9BQU8sRUFBbkIsSUFBeUIsTUFBekI7QUFDRDs7QUFFRDs7Ozs7OzJCQUdPLE0sRUFBUTtBQUNiLFVBQUksS0FBSyxPQUFPLEVBQWhCO0FBQ0EsVUFBSSxLQUFLLE1BQUwsQ0FBWSxFQUFaLENBQUosRUFBcUI7QUFDbkI7QUFDQSxlQUFPLEtBQUssTUFBTCxDQUFZLEVBQVosQ0FBUDtBQUNEO0FBQ0Q7QUFDQSxVQUFJLEtBQUssUUFBTCxDQUFjLEVBQWQsQ0FBSixFQUF1QjtBQUNyQixlQUFPLEtBQUssUUFBTCxDQUFjLE9BQU8sRUFBckIsQ0FBUDtBQUNEO0FBQ0Y7OzsyQkFFTSxNLEVBQVE7QUFDYjtBQUNBLFVBQUksYUFBYSxLQUFLLFNBQUwsQ0FBZSxnQkFBZixDQUFnQyxNQUFoQyxFQUF3QyxJQUF4QyxDQUFqQjtBQUNBLFVBQUksd0JBQUo7O0FBRUEsV0FBSyxJQUFJLElBQUUsQ0FBWCxFQUFjLElBQUksV0FBVyxNQUE3QixFQUFxQyxHQUFyQyxFQUEwQztBQUN4QyxZQUFJLE1BQU0sV0FBVyxDQUFYLEVBQWMsTUFBeEI7O0FBRUE7QUFDQSxlQUFPLE9BQU8sQ0FBQyxLQUFLLE1BQUwsQ0FBWSxJQUFJLEVBQWhCLENBQWYsRUFBb0M7QUFDbEMsZ0JBQU0sSUFBSSxNQUFWO0FBQ0Q7O0FBRUQsWUFBSSxHQUFKLEVBQVM7QUFDUCw0QkFBa0IsSUFBSSxFQUF0QjtBQUNBO0FBQ0Q7QUFDRjs7QUFFRCxXQUFLLElBQUksRUFBVCxJQUFlLEtBQUssTUFBcEIsRUFBNEI7QUFDMUIsWUFBSSxPQUFPLEtBQUssTUFBTCxDQUFZLEVBQVosQ0FBWDtBQUNBLFlBQUksZ0JBQWlCLG9CQUFvQixLQUFLLEVBQTlDO0FBQ0EsWUFBSSxhQUFhLEtBQUssUUFBTCxDQUFjLEVBQWQsQ0FBakI7O0FBRUE7QUFDQSxZQUFJLGlCQUFpQixDQUFDLFVBQXRCLEVBQWtDO0FBQ2hDLGVBQUssUUFBTCxDQUFjLEVBQWQsSUFBb0IsSUFBcEI7QUFDQSxjQUFJLEtBQUssUUFBVCxFQUFtQjtBQUNqQixpQkFBSyxJQUFMLENBQVUsU0FBVixFQUFxQixJQUFyQjtBQUNEO0FBQ0Y7O0FBRUQ7QUFDQSxZQUFJLENBQUMsYUFBRCxJQUFrQixVQUF0QixFQUFrQztBQUNoQyxpQkFBTyxLQUFLLFFBQUwsQ0FBYyxFQUFkLENBQVA7QUFDQSxlQUFLLFlBQUwsQ0FBa0IsSUFBbEI7QUFDQSxjQUFJLEtBQUssUUFBVCxFQUFtQjtBQUNqQixpQkFBSyxJQUFMLENBQVUsUUFBVixFQUFvQixJQUFwQjtBQUNEO0FBQ0Y7O0FBRUQsWUFBSSxhQUFKLEVBQW1CO0FBQ2pCLGVBQUssWUFBTCxDQUFrQixVQUFsQjtBQUNEO0FBQ0Y7QUFDRjs7QUFFRDs7Ozs7OztnQ0FJWSxNLEVBQVE7QUFDbEIsV0FBSyxRQUFMLENBQWMsSUFBZCxDQUFtQixNQUFuQjtBQUNBLFdBQUssU0FBTCxDQUFlLEdBQWYsQ0FBbUIsTUFBbkIsQ0FBMEIsSUFBMUIsQ0FBK0IsTUFBL0I7QUFDQSxXQUFLLGdCQUFMO0FBQ0Q7OztnQ0FFVztBQUNWLGFBQU8sS0FBSyxTQUFMLENBQWUsR0FBZixDQUFtQixNQUExQjtBQUNEOztBQUVEOzs7Ozs7O21DQUllLFUsRUFBWTtBQUN6QixXQUFLLFdBQUwsQ0FBaUIsSUFBakIsQ0FBc0IsVUFBdEI7O0FBRUEsVUFBSSxVQUFVLElBQUksTUFBTSxPQUFWLENBQWtCLENBQWxCLEVBQXFCLENBQXJCLEVBQXdCLENBQUMsQ0FBekIsRUFBNEIsZUFBNUIsQ0FBNEMsVUFBNUMsQ0FBZDtBQUNBLFdBQUssU0FBTCxDQUFlLEdBQWYsQ0FBbUIsU0FBbkIsQ0FBNkIsSUFBN0IsQ0FBa0MsT0FBbEM7QUFDQSxXQUFLLGdCQUFMO0FBQ0Q7OzttQ0FFYztBQUNiLGFBQU8sS0FBSyxTQUFMLENBQWUsR0FBZixDQUFtQixTQUExQjtBQUNEOztBQUVEOzs7Ozs7Ozs7K0JBTVcsTSxFQUFRO0FBQ2pCLFdBQUssU0FBTCxDQUFlLGFBQWYsQ0FBNkIsTUFBN0IsRUFBcUMsS0FBSyxNQUExQztBQUNBLFdBQUssZ0JBQUw7QUFDRDs7QUFFRDs7Ozs7Ozt3Q0FJb0I7QUFDbEIsYUFBTyxLQUFLLElBQVo7QUFDRDs7QUFFRDs7Ozs7O3NDQUdrQjtBQUNoQixVQUFJLFFBQVEsQ0FBWjtBQUNBLFVBQUksT0FBTyxJQUFYO0FBQ0EsV0FBSyxJQUFJLEVBQVQsSUFBZSxLQUFLLFFBQXBCLEVBQThCO0FBQzVCLGlCQUFTLENBQVQ7QUFDQSxlQUFPLEtBQUssTUFBTCxDQUFZLEVBQVosQ0FBUDtBQUNEO0FBQ0QsVUFBSSxRQUFRLENBQVosRUFBZTtBQUNiLGdCQUFRLElBQVIsQ0FBYSw4QkFBYjtBQUNEO0FBQ0QsYUFBTyxJQUFQO0FBQ0Q7O0FBRUQ7Ozs7Ozt5Q0FHcUIsUyxFQUFXO0FBQzlCLFdBQUssT0FBTCxDQUFhLE9BQWIsR0FBdUIsU0FBdkI7QUFDRDs7QUFFRDs7Ozs7OztxQ0FJaUIsUyxFQUFXO0FBQzFCLFdBQUssR0FBTCxDQUFTLE9BQVQsR0FBbUIsU0FBbkI7QUFDRDs7QUFFRDs7Ozs7Ozs4QkFJVSxRLEVBQVU7QUFDbEI7QUFDQSxVQUFJLEtBQUssUUFBTCxJQUFpQixRQUFyQixFQUErQjtBQUM3QjtBQUNEO0FBQ0Q7QUFDQSxXQUFLLFFBQUwsR0FBZ0IsUUFBaEI7O0FBRUEsVUFBSSxDQUFDLFFBQUwsRUFBZTtBQUNiLGFBQUssWUFBTCxDQUFrQixJQUFsQjtBQUNBLGFBQUssSUFBSSxFQUFULElBQWUsS0FBSyxRQUFwQixFQUE4QjtBQUM1QixjQUFJLE9BQU8sS0FBSyxNQUFMLENBQVksRUFBWixDQUFYO0FBQ0EsaUJBQU8sS0FBSyxRQUFMLENBQWMsRUFBZCxDQUFQO0FBQ0EsZUFBSyxJQUFMLENBQVUsUUFBVixFQUFvQixJQUFwQjtBQUNEO0FBQ0Y7QUFDRjs7O3VDQUVrQjtBQUNqQixVQUFJLE1BQU0sS0FBSyxTQUFMLENBQWUsR0FBekI7O0FBRUE7QUFDQTtBQUNBLFVBQUksV0FBVyxLQUFLLE9BQUwsQ0FBYSxRQUE1QjtBQUNBLGVBQVMsSUFBVCxDQUFjLElBQUksU0FBbEI7QUFDQSxlQUFTLGNBQVQsQ0FBd0IsS0FBSyxlQUE3QjtBQUNBLGVBQVMsR0FBVCxDQUFhLElBQUksTUFBakI7O0FBRUE7QUFDQTtBQUNBLFVBQUksUUFBUSxJQUFJLE1BQU0sT0FBVixHQUFvQixJQUFwQixDQUF5QixJQUFJLFNBQTdCLENBQVo7QUFDQSxZQUFNLGNBQU4sQ0FBcUIsS0FBSyxlQUExQjtBQUNBLFdBQUssR0FBTCxDQUFTLEtBQVQsQ0FBZSxDQUFmLEdBQW1CLE1BQU0sTUFBTixFQUFuQjtBQUNBLFVBQUksUUFBUSxJQUFJLE1BQU0sV0FBVixDQUFzQixJQUFJLFNBQTFCLEVBQXFDLElBQUksTUFBekMsQ0FBWjtBQUNBLFdBQUssR0FBTCxDQUFTLFFBQVQsQ0FBa0IsSUFBbEIsQ0FBdUIsTUFBTSxRQUE3QjtBQUNBLFdBQUssR0FBTCxDQUFTLFFBQVQsQ0FBa0IsVUFBbEIsQ0FBNkIsSUFBSSxNQUFqQyxFQUF5QyxNQUFNLGNBQU4sQ0FBcUIsR0FBckIsQ0FBekM7QUFDRDs7QUFFRDs7Ozs7O3FDQUdpQjtBQUNmO0FBQ0EsVUFBSSxnQkFBZ0IsSUFBSSxNQUFNLGNBQVYsQ0FBeUIsWUFBekIsRUFBdUMsRUFBdkMsRUFBMkMsRUFBM0MsQ0FBcEI7QUFDQSxVQUFJLGdCQUFnQixJQUFJLE1BQU0saUJBQVYsQ0FBNEI7QUFDOUMsZUFBTyxRQUR1QztBQUU5QyxxQkFBYSxJQUZpQztBQUc5QyxpQkFBUztBQUhxQyxPQUE1QixDQUFwQjtBQUtBLFVBQUksUUFBUSxJQUFJLE1BQU0sSUFBVixDQUFlLGFBQWYsRUFBOEIsYUFBOUIsQ0FBWjs7QUFFQSxVQUFJLGdCQUFnQixJQUFJLE1BQU0sY0FBVixDQUF5QixZQUF6QixFQUF1QyxFQUF2QyxFQUEyQyxFQUEzQyxDQUFwQjtBQUNBLFVBQUksZ0JBQWdCLElBQUksTUFBTSxpQkFBVixDQUE0QjtBQUM5QyxlQUFPLFFBRHVDO0FBRTlDLHFCQUFhLElBRmlDO0FBRzlDLGlCQUFTO0FBSHFDLE9BQTVCLENBQXBCO0FBS0EsVUFBSSxRQUFRLElBQUksTUFBTSxJQUFWLENBQWUsYUFBZixFQUE4QixhQUE5QixDQUFaOztBQUVBLFVBQUksVUFBVSxJQUFJLE1BQU0sS0FBVixFQUFkO0FBQ0EsY0FBUSxHQUFSLENBQVksS0FBWjtBQUNBLGNBQVEsR0FBUixDQUFZLEtBQVo7QUFDQSxhQUFPLE9BQVA7QUFDRDs7QUFFRDs7Ozs7OztpQ0FJYSxhLEVBQWU7QUFDMUI7QUFDQSxVQUFJLFdBQVcsZ0JBQWY7QUFDQSxVQUFJLGFBQUosRUFBbUI7QUFDakI7QUFDQSxZQUFJLFFBQVEsY0FBYyxDQUFkLENBQVo7QUFDQSxtQkFBVyxNQUFNLFFBQWpCO0FBQ0Q7O0FBRUQsV0FBSyxlQUFMLEdBQXVCLFFBQXZCO0FBQ0EsV0FBSyxnQkFBTDtBQUNBO0FBQ0Q7OztpQ0FFWTtBQUNYO0FBQ0EsVUFBSSxXQUFXLElBQUksTUFBTSxnQkFBVixDQUEyQixVQUEzQixFQUF1QyxVQUF2QyxFQUFtRCxDQUFuRCxFQUFzRCxFQUF0RCxDQUFmO0FBQ0EsVUFBSSxXQUFXLElBQUksTUFBTSxpQkFBVixDQUE0QjtBQUN6QyxhQUFLLE1BQU0sVUFBTixDQUFpQixXQUFqQixDQUE2QixjQUE3QixDQURvQztBQUV6QztBQUNBLHFCQUFhLElBSDRCO0FBSXpDLGlCQUFTO0FBSmdDLE9BQTVCLENBQWY7QUFNQSxVQUFJLE9BQU8sSUFBSSxNQUFNLElBQVYsQ0FBZSxRQUFmLEVBQXlCLFFBQXpCLENBQVg7O0FBRUEsYUFBTyxJQUFQO0FBQ0Q7Ozs7OztrQkEzUmtCLFc7Ozs7Ozs7O1FDeEJMLFEsR0FBQSxRO1FBTUEsTSxHQUFBLE07QUFyQmhCOzs7Ozs7Ozs7Ozs7Ozs7QUFlTyxTQUFTLFFBQVQsR0FBb0I7QUFDekIsTUFBSSxRQUFRLEtBQVo7QUFDQSxHQUFDLFVBQVMsQ0FBVCxFQUFXO0FBQUMsUUFBRywyVEFBMlQsSUFBM1QsQ0FBZ1UsQ0FBaFUsS0FBb1UsMGtEQUEwa0QsSUFBMWtELENBQStrRCxFQUFFLE1BQUYsQ0FBUyxDQUFULEVBQVcsQ0FBWCxDQUEva0QsQ0FBdlUsRUFBcTZELFFBQVEsSUFBUjtBQUFhLEdBQS83RCxFQUFpOEQsVUFBVSxTQUFWLElBQXFCLFVBQVUsTUFBL0IsSUFBdUMsT0FBTyxLQUEvK0Q7QUFDQSxTQUFPLEtBQVA7QUFDRDs7QUFFTSxTQUFTLE1BQVQsQ0FBZ0IsUUFBaEIsRUFBMEIsTUFBMUIsRUFBa0M7QUFDdkMsU0FBTyxVQUFVLFFBQVYsR0FBcUIsVUFBckIsR0FBa0MsTUFBekM7QUFDRCIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIndXNlIHN0cmljdCc7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG4vL1xuLy8gV2Ugc3RvcmUgb3VyIEVFIG9iamVjdHMgaW4gYSBwbGFpbiBvYmplY3Qgd2hvc2UgcHJvcGVydGllcyBhcmUgZXZlbnQgbmFtZXMuXG4vLyBJZiBgT2JqZWN0LmNyZWF0ZShudWxsKWAgaXMgbm90IHN1cHBvcnRlZCB3ZSBwcmVmaXggdGhlIGV2ZW50IG5hbWVzIHdpdGggYVxuLy8gYH5gIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBidWlsdC1pbiBvYmplY3QgcHJvcGVydGllcyBhcmUgbm90IG92ZXJyaWRkZW4gb3Jcbi8vIHVzZWQgYXMgYW4gYXR0YWNrIHZlY3Rvci5cbi8vIFdlIGFsc28gYXNzdW1lIHRoYXQgYE9iamVjdC5jcmVhdGUobnVsbClgIGlzIGF2YWlsYWJsZSB3aGVuIHRoZSBldmVudCBuYW1lXG4vLyBpcyBhbiBFUzYgU3ltYm9sLlxuLy9cbnZhciBwcmVmaXggPSB0eXBlb2YgT2JqZWN0LmNyZWF0ZSAhPT0gJ2Z1bmN0aW9uJyA/ICd+JyA6IGZhbHNlO1xuXG4vKipcbiAqIFJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIEV2ZW50RW1pdHRlciBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBFdmVudCBoYW5kbGVyIHRvIGJlIGNhbGxlZC5cbiAqIEBwYXJhbSB7TWl4ZWR9IGNvbnRleHQgQ29udGV4dCBmb3IgZnVuY3Rpb24gZXhlY3V0aW9uLlxuICogQHBhcmFtIHtCb29sZWFufSBbb25jZT1mYWxzZV0gT25seSBlbWl0IG9uY2VcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBFRShmbiwgY29udGV4dCwgb25jZSkge1xuICB0aGlzLmZuID0gZm47XG4gIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gIHRoaXMub25jZSA9IG9uY2UgfHwgZmFsc2U7XG59XG5cbi8qKlxuICogTWluaW1hbCBFdmVudEVtaXR0ZXIgaW50ZXJmYWNlIHRoYXQgaXMgbW9sZGVkIGFnYWluc3QgdGhlIE5vZGUuanNcbiAqIEV2ZW50RW1pdHRlciBpbnRlcmZhY2UuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAYXBpIHB1YmxpY1xuICovXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7IC8qIE5vdGhpbmcgdG8gc2V0ICovIH1cblxuLyoqXG4gKiBIb2xkIHRoZSBhc3NpZ25lZCBFdmVudEVtaXR0ZXJzIGJ5IG5hbWUuXG4gKlxuICogQHR5cGUge09iamVjdH1cbiAqIEBwcml2YXRlXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBSZXR1cm4gYW4gYXJyYXkgbGlzdGluZyB0aGUgZXZlbnRzIGZvciB3aGljaCB0aGUgZW1pdHRlciBoYXMgcmVnaXN0ZXJlZFxuICogbGlzdGVuZXJzLlxuICpcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqIEBhcGkgcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZXZlbnROYW1lcyA9IGZ1bmN0aW9uIGV2ZW50TmFtZXMoKSB7XG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHNcbiAgICAsIG5hbWVzID0gW11cbiAgICAsIG5hbWU7XG5cbiAgaWYgKCFldmVudHMpIHJldHVybiBuYW1lcztcblxuICBmb3IgKG5hbWUgaW4gZXZlbnRzKSB7XG4gICAgaWYgKGhhcy5jYWxsKGV2ZW50cywgbmFtZSkpIG5hbWVzLnB1c2gocHJlZml4ID8gbmFtZS5zbGljZSgxKSA6IG5hbWUpO1xuICB9XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICByZXR1cm4gbmFtZXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZXZlbnRzKSk7XG4gIH1cblxuICByZXR1cm4gbmFtZXM7XG59O1xuXG4vKipcbiAqIFJldHVybiBhIGxpc3Qgb2YgYXNzaWduZWQgZXZlbnQgbGlzdGVuZXJzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudCBUaGUgZXZlbnRzIHRoYXQgc2hvdWxkIGJlIGxpc3RlZC5cbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZXhpc3RzIFdlIG9ubHkgbmVlZCB0byBrbm93IGlmIHRoZXJlIGFyZSBsaXN0ZW5lcnMuXG4gKiBAcmV0dXJucyB7QXJyYXl8Qm9vbGVhbn1cbiAqIEBhcGkgcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24gbGlzdGVuZXJzKGV2ZW50LCBleGlzdHMpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnRcbiAgICAsIGF2YWlsYWJsZSA9IHRoaXMuX2V2ZW50cyAmJiB0aGlzLl9ldmVudHNbZXZ0XTtcblxuICBpZiAoZXhpc3RzKSByZXR1cm4gISFhdmFpbGFibGU7XG4gIGlmICghYXZhaWxhYmxlKSByZXR1cm4gW107XG4gIGlmIChhdmFpbGFibGUuZm4pIHJldHVybiBbYXZhaWxhYmxlLmZuXTtcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IGF2YWlsYWJsZS5sZW5ndGgsIGVlID0gbmV3IEFycmF5KGwpOyBpIDwgbDsgaSsrKSB7XG4gICAgZWVbaV0gPSBhdmFpbGFibGVbaV0uZm47XG4gIH1cblxuICByZXR1cm4gZWU7XG59O1xuXG4vKipcbiAqIEVtaXQgYW4gZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgZXZlbnQgbGlzdGVuZXJzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudCBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gSW5kaWNhdGlvbiBpZiB3ZSd2ZSBlbWl0dGVkIGFuIGV2ZW50LlxuICogQGFwaSBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24gZW1pdChldmVudCwgYTEsIGEyLCBhMywgYTQsIGE1KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIGZhbHNlO1xuXG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbZXZ0XVxuICAgICwgbGVuID0gYXJndW1lbnRzLmxlbmd0aFxuICAgICwgYXJnc1xuICAgICwgaTtcblxuICBpZiAoJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGxpc3RlbmVycy5mbikge1xuICAgIGlmIChsaXN0ZW5lcnMub25jZSkgdGhpcy5yZW1vdmVMaXN0ZW5lcihldmVudCwgbGlzdGVuZXJzLmZuLCB1bmRlZmluZWQsIHRydWUpO1xuXG4gICAgc3dpdGNoIChsZW4pIHtcbiAgICAgIGNhc2UgMTogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0KSwgdHJ1ZTtcbiAgICAgIGNhc2UgMjogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSksIHRydWU7XG4gICAgICBjYXNlIDM6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyKSwgdHJ1ZTtcbiAgICAgIGNhc2UgNDogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzKSwgdHJ1ZTtcbiAgICAgIGNhc2UgNTogcmV0dXJuIGxpc3RlbmVycy5mbi5jYWxsKGxpc3RlbmVycy5jb250ZXh0LCBhMSwgYTIsIGEzLCBhNCksIHRydWU7XG4gICAgICBjYXNlIDY6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyLCBhMywgYTQsIGE1KSwgdHJ1ZTtcbiAgICB9XG5cbiAgICBmb3IgKGkgPSAxLCBhcmdzID0gbmV3IEFycmF5KGxlbiAtMSk7IGkgPCBsZW47IGkrKykge1xuICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuXG4gICAgbGlzdGVuZXJzLmZuLmFwcGx5KGxpc3RlbmVycy5jb250ZXh0LCBhcmdzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbGVuZ3RoID0gbGlzdGVuZXJzLmxlbmd0aFxuICAgICAgLCBqO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAobGlzdGVuZXJzW2ldLm9uY2UpIHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyc1tpXS5mbiwgdW5kZWZpbmVkLCB0cnVlKTtcblxuICAgICAgc3dpdGNoIChsZW4pIHtcbiAgICAgICAgY2FzZSAxOiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCk7IGJyZWFrO1xuICAgICAgICBjYXNlIDI6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSk7IGJyZWFrO1xuICAgICAgICBjYXNlIDM6IGxpc3RlbmVyc1tpXS5mbi5jYWxsKGxpc3RlbmVyc1tpXS5jb250ZXh0LCBhMSwgYTIpOyBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoIWFyZ3MpIGZvciAoaiA9IDEsIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0xKTsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgICAgICBhcmdzW2ogLSAxXSA9IGFyZ3VtZW50c1tqXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsaXN0ZW5lcnNbaV0uZm4uYXBwbHkobGlzdGVuZXJzW2ldLmNvbnRleHQsIGFyZ3MpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBSZWdpc3RlciBhIG5ldyBFdmVudExpc3RlbmVyIGZvciB0aGUgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IGV2ZW50IE5hbWUgb2YgdGhlIGV2ZW50LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gQ2FsbGJhY2sgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge01peGVkfSBbY29udGV4dD10aGlzXSBUaGUgY29udGV4dCBvZiB0aGUgZnVuY3Rpb24uXG4gKiBAYXBpIHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gZnVuY3Rpb24gb24oZXZlbnQsIGZuLCBjb250ZXh0KSB7XG4gIHZhciBsaXN0ZW5lciA9IG5ldyBFRShmbiwgY29udGV4dCB8fCB0aGlzKVxuICAgICwgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIXRoaXMuX2V2ZW50cykgdGhpcy5fZXZlbnRzID0gcHJlZml4ID8ge30gOiBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdKSB0aGlzLl9ldmVudHNbZXZ0XSA9IGxpc3RlbmVyO1xuICBlbHNlIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdLmZuKSB0aGlzLl9ldmVudHNbZXZ0XS5wdXNoKGxpc3RlbmVyKTtcbiAgICBlbHNlIHRoaXMuX2V2ZW50c1tldnRdID0gW1xuICAgICAgdGhpcy5fZXZlbnRzW2V2dF0sIGxpc3RlbmVyXG4gICAgXTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBBZGQgYW4gRXZlbnRMaXN0ZW5lciB0aGF0J3Mgb25seSBjYWxsZWQgb25jZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gZXZlbnQgTmFtZSBvZiB0aGUgZXZlbnQuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBDYWxsYmFjayBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7TWl4ZWR9IFtjb250ZXh0PXRoaXNdIFRoZSBjb250ZXh0IG9mIHRoZSBmdW5jdGlvbi5cbiAqIEBhcGkgcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uIG9uY2UoZXZlbnQsIGZuLCBjb250ZXh0KSB7XG4gIHZhciBsaXN0ZW5lciA9IG5ldyBFRShmbiwgY29udGV4dCB8fCB0aGlzLCB0cnVlKVxuICAgICwgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIXRoaXMuX2V2ZW50cykgdGhpcy5fZXZlbnRzID0gcHJlZml4ID8ge30gOiBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdKSB0aGlzLl9ldmVudHNbZXZ0XSA9IGxpc3RlbmVyO1xuICBlbHNlIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdLmZuKSB0aGlzLl9ldmVudHNbZXZ0XS5wdXNoKGxpc3RlbmVyKTtcbiAgICBlbHNlIHRoaXMuX2V2ZW50c1tldnRdID0gW1xuICAgICAgdGhpcy5fZXZlbnRzW2V2dF0sIGxpc3RlbmVyXG4gICAgXTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudCBUaGUgZXZlbnQgd2Ugd2FudCB0byByZW1vdmUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgdGhhdCB3ZSBuZWVkIHRvIGZpbmQuXG4gKiBAcGFyYW0ge01peGVkfSBjb250ZXh0IE9ubHkgcmVtb3ZlIGxpc3RlbmVycyBtYXRjaGluZyB0aGlzIGNvbnRleHQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9uY2UgT25seSByZW1vdmUgb25jZSBsaXN0ZW5lcnMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbZXZ0XSkgcmV0dXJuIHRoaXM7XG5cbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1tldnRdXG4gICAgLCBldmVudHMgPSBbXTtcblxuICBpZiAoZm4pIHtcbiAgICBpZiAobGlzdGVuZXJzLmZuKSB7XG4gICAgICBpZiAoXG4gICAgICAgICAgIGxpc3RlbmVycy5mbiAhPT0gZm5cbiAgICAgICAgfHwgKG9uY2UgJiYgIWxpc3RlbmVycy5vbmNlKVxuICAgICAgICB8fCAoY29udGV4dCAmJiBsaXN0ZW5lcnMuY29udGV4dCAhPT0gY29udGV4dClcbiAgICAgICkge1xuICAgICAgICBldmVudHMucHVzaChsaXN0ZW5lcnMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gbGlzdGVuZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICBsaXN0ZW5lcnNbaV0uZm4gIT09IGZuXG4gICAgICAgICAgfHwgKG9uY2UgJiYgIWxpc3RlbmVyc1tpXS5vbmNlKVxuICAgICAgICAgIHx8IChjb250ZXh0ICYmIGxpc3RlbmVyc1tpXS5jb250ZXh0ICE9PSBjb250ZXh0KVxuICAgICAgICApIHtcbiAgICAgICAgICBldmVudHMucHVzaChsaXN0ZW5lcnNbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy9cbiAgLy8gUmVzZXQgdGhlIGFycmF5LCBvciByZW1vdmUgaXQgY29tcGxldGVseSBpZiB3ZSBoYXZlIG5vIG1vcmUgbGlzdGVuZXJzLlxuICAvL1xuICBpZiAoZXZlbnRzLmxlbmd0aCkge1xuICAgIHRoaXMuX2V2ZW50c1tldnRdID0gZXZlbnRzLmxlbmd0aCA9PT0gMSA/IGV2ZW50c1swXSA6IGV2ZW50cztcbiAgfSBlbHNlIHtcbiAgICBkZWxldGUgdGhpcy5fZXZlbnRzW2V2dF07XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFsbCBsaXN0ZW5lcnMgb3Igb25seSB0aGUgbGlzdGVuZXJzIGZvciB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudCBUaGUgZXZlbnQgd2FudCB0byByZW1vdmUgYWxsIGxpc3RlbmVycyBmb3IuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uIHJlbW92ZUFsbExpc3RlbmVycyhldmVudCkge1xuICBpZiAoIXRoaXMuX2V2ZW50cykgcmV0dXJuIHRoaXM7XG5cbiAgaWYgKGV2ZW50KSBkZWxldGUgdGhpcy5fZXZlbnRzW3ByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnRdO1xuICBlbHNlIHRoaXMuX2V2ZW50cyA9IHByZWZpeCA/IHt9IDogT2JqZWN0LmNyZWF0ZShudWxsKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vXG4vLyBBbGlhcyBtZXRob2RzIG5hbWVzIGJlY2F1c2UgcGVvcGxlIHJvbGwgbGlrZSB0aGF0LlxuLy9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub2ZmID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcjtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uO1xuXG4vL1xuLy8gVGhpcyBmdW5jdGlvbiBkb2Vzbid0IGFwcGx5IGFueW1vcmUuXG4vL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbiBzZXRNYXhMaXN0ZW5lcnMoKSB7XG4gIHJldHVybiB0aGlzO1xufTtcblxuLy9cbi8vIEV4cG9zZSB0aGUgcHJlZml4LlxuLy9cbkV2ZW50RW1pdHRlci5wcmVmaXhlZCA9IHByZWZpeDtcblxuLy9cbi8vIEV4cG9zZSB0aGUgbW9kdWxlLlxuLy9cbmlmICgndW5kZWZpbmVkJyAhPT0gdHlwZW9mIG1vZHVsZSkge1xuICBtb2R1bGUuZXhwb3J0cyA9IEV2ZW50RW1pdHRlcjtcbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmNvbnN0IEhFQURfRUxCT1dfT0ZGU0VUID0gbmV3IFRIUkVFLlZlY3RvcjMoMC4xNTUsIC0wLjQ2NSwgLTAuMTUpO1xuY29uc3QgRUxCT1dfV1JJU1RfT0ZGU0VUID0gbmV3IFRIUkVFLlZlY3RvcjMoMCwgMCwgLTAuMjUpO1xuY29uc3QgV1JJU1RfQ09OVFJPTExFUl9PRkZTRVQgPSBuZXcgVEhSRUUuVmVjdG9yMygwLCAwLCAwLjA1KTtcbmNvbnN0IEFSTV9FWFRFTlNJT05fT0ZGU0VUID0gbmV3IFRIUkVFLlZlY3RvcjMoLTAuMDgsIDAuMTQsIDAuMDgpO1xuXG5jb25zdCBFTEJPV19CRU5EX1JBVElPID0gMC40OyAvLyA0MCUgZWxib3csIDYwJSB3cmlzdC5cbmNvbnN0IEVYVEVOU0lPTl9SQVRJT19XRUlHSFQgPSAwLjQ7XG5cbmNvbnN0IE1JTl9BTkdVTEFSX1NQRUVEID0gMC42MTsgLy8gMzUgZGVncmVlcyBwZXIgc2Vjb25kIChpbiByYWRpYW5zKS5cblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBhcm0gbW9kZWwgZm9yIHRoZSBEYXlkcmVhbSBjb250cm9sbGVyLiBGZWVkIGl0IGEgY2FtZXJhIGFuZFxuICogdGhlIGNvbnRyb2xsZXIuIFVwZGF0ZSBpdCBvbiBhIFJBRi5cbiAqXG4gKiBHZXQgdGhlIG1vZGVsJ3MgcG9zZSB1c2luZyBnZXRQb3NlKCkuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE9yaWVudGF0aW9uQXJtTW9kZWwge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmlzTGVmdEhhbmRlZCA9IGZhbHNlO1xuXG4gICAgLy8gQ3VycmVudCBhbmQgcHJldmlvdXMgY29udHJvbGxlciBvcmllbnRhdGlvbnMuXG4gICAgdGhpcy5jb250cm9sbGVyUSA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCk7XG4gICAgdGhpcy5sYXN0Q29udHJvbGxlclEgPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpO1xuXG4gICAgLy8gQ3VycmVudCBhbmQgcHJldmlvdXMgaGVhZCBvcmllbnRhdGlvbnMuXG4gICAgdGhpcy5oZWFkUSA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCk7XG5cbiAgICAvLyBDdXJyZW50IGhlYWQgcG9zaXRpb24uXG4gICAgdGhpcy5oZWFkUG9zID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcblxuICAgIC8vIFBvc2l0aW9ucyBvZiBvdGhlciBqb2ludHMgKG1vc3RseSBmb3IgZGVidWdnaW5nKS5cbiAgICB0aGlzLmVsYm93UG9zID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbiAgICB0aGlzLndyaXN0UG9zID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcblxuICAgIC8vIEN1cnJlbnQgYW5kIHByZXZpb3VzIHRpbWVzIHRoZSBtb2RlbCB3YXMgdXBkYXRlZC5cbiAgICB0aGlzLnRpbWUgPSBudWxsO1xuICAgIHRoaXMubGFzdFRpbWUgPSBudWxsO1xuXG4gICAgLy8gUm9vdCByb3RhdGlvbi5cbiAgICB0aGlzLnJvb3RRID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcblxuICAgIC8vIEN1cnJlbnQgcG9zZSB0aGF0IHRoaXMgYXJtIG1vZGVsIGNhbGN1bGF0ZXMuXG4gICAgdGhpcy5wb3NlID0ge1xuICAgICAgb3JpZW50YXRpb246IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCksXG4gICAgICBwb3NpdGlvbjogbmV3IFRIUkVFLlZlY3RvcjMoKVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kcyB0byBzZXQgY29udHJvbGxlciBhbmQgaGVhZCBwb3NlIChpbiB3b3JsZCBjb29yZGluYXRlcykuXG4gICAqL1xuICBzZXRDb250cm9sbGVyT3JpZW50YXRpb24ocXVhdGVybmlvbikge1xuICAgIHRoaXMubGFzdENvbnRyb2xsZXJRLmNvcHkodGhpcy5jb250cm9sbGVyUSk7XG4gICAgdGhpcy5jb250cm9sbGVyUS5jb3B5KHF1YXRlcm5pb24pO1xuICB9XG5cbiAgc2V0SGVhZE9yaWVudGF0aW9uKHF1YXRlcm5pb24pIHtcbiAgICB0aGlzLmhlYWRRLmNvcHkocXVhdGVybmlvbik7XG4gIH1cblxuICBzZXRIZWFkUG9zaXRpb24ocG9zaXRpb24pIHtcbiAgICB0aGlzLmhlYWRQb3MuY29weShwb3NpdGlvbik7XG4gIH1cblxuICBzZXRMZWZ0SGFuZGVkKGlzTGVmdEhhbmRlZCkge1xuICAgIC8vIFRPRE8oc211cyk6IEltcGxlbWVudCBtZSFcbiAgICB0aGlzLmlzTGVmdEhhbmRlZCA9IGlzTGVmdEhhbmRlZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgb24gYSBSQUYuXG4gICAqL1xuICB1cGRhdGUoKSB7XG4gICAgdGhpcy50aW1lID0gcGVyZm9ybWFuY2Uubm93KCk7XG5cbiAgICAvLyBJZiB0aGUgY29udHJvbGxlcidzIGFuZ3VsYXIgdmVsb2NpdHkgaXMgYWJvdmUgYSBjZXJ0YWluIGFtb3VudCwgd2UgY2FuXG4gICAgLy8gYXNzdW1lIHRvcnNvIHJvdGF0aW9uIGFuZCBtb3ZlIHRoZSBlbGJvdyBqb2ludCByZWxhdGl2ZSB0byB0aGVcbiAgICAvLyBjYW1lcmEgb3JpZW50YXRpb24uXG4gICAgbGV0IGhlYWRZYXdRID0gdGhpcy5nZXRIZWFkWWF3T3JpZW50YXRpb25fKCk7XG4gICAgbGV0IHRpbWVEZWx0YSA9ICh0aGlzLnRpbWUgLSB0aGlzLmxhc3RUaW1lKSAvIDEwMDA7XG4gICAgbGV0IGFuZ2xlRGVsdGEgPSB0aGlzLnF1YXRBbmdsZV8odGhpcy5sYXN0Q29udHJvbGxlclEsIHRoaXMuY29udHJvbGxlclEpO1xuICAgIGxldCBjb250cm9sbGVyQW5ndWxhclNwZWVkID0gYW5nbGVEZWx0YSAvIHRpbWVEZWx0YTtcbiAgICBpZiAoY29udHJvbGxlckFuZ3VsYXJTcGVlZCA+IE1JTl9BTkdVTEFSX1NQRUVEKSB7XG4gICAgICAvLyBBdHRlbnVhdGUgdGhlIFJvb3Qgcm90YXRpb24gc2xpZ2h0bHkuXG4gICAgICB0aGlzLnJvb3RRLnNsZXJwKGhlYWRZYXdRLCBhbmdsZURlbHRhIC8gMTApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucm9vdFEuY29weShoZWFkWWF3USk7XG4gICAgfVxuXG4gICAgLy8gV2Ugd2FudCB0byBtb3ZlIHRoZSBlbGJvdyB1cCBhbmQgdG8gdGhlIGNlbnRlciBhcyB0aGUgdXNlciBwb2ludHMgdGhlXG4gICAgLy8gY29udHJvbGxlciB1cHdhcmRzLCBzbyB0aGF0IHRoZXkgY2FuIGVhc2lseSBzZWUgdGhlIGNvbnRyb2xsZXIgYW5kIGl0c1xuICAgIC8vIHRvb2wgdGlwcy5cbiAgICBsZXQgY29udHJvbGxlckV1bGVyID0gbmV3IFRIUkVFLkV1bGVyKCkuc2V0RnJvbVF1YXRlcm5pb24odGhpcy5jb250cm9sbGVyUSwgJ1lYWicpO1xuICAgIGxldCBjb250cm9sbGVyWERlZyA9IFRIUkVFLk1hdGgucmFkVG9EZWcoY29udHJvbGxlckV1bGVyLngpO1xuICAgIGxldCBleHRlbnNpb25SYXRpbyA9IHRoaXMuY2xhbXBfKChjb250cm9sbGVyWERlZyAtIDExKSAvICg1MCAtIDExKSwgMCwgMSk7XG5cbiAgICAvLyBDb250cm9sbGVyIG9yaWVudGF0aW9uIGluIGNhbWVyYSBzcGFjZS5cbiAgICBsZXQgY29udHJvbGxlckNhbWVyYVEgPSB0aGlzLnJvb3RRLmNsb25lKCkuaW52ZXJzZSgpO1xuICAgIGNvbnRyb2xsZXJDYW1lcmFRLm11bHRpcGx5KHRoaXMuY29udHJvbGxlclEpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIGVsYm93IHBvc2l0aW9uLlxuICAgIGxldCBlbGJvd1BvcyA9IHRoaXMuZWxib3dQb3M7XG4gICAgZWxib3dQb3MuY29weSh0aGlzLmhlYWRQb3MpLmFkZChIRUFEX0VMQk9XX09GRlNFVCk7XG4gICAgbGV0IGVsYm93T2Zmc2V0ID0gbmV3IFRIUkVFLlZlY3RvcjMoKS5jb3B5KEFSTV9FWFRFTlNJT05fT0ZGU0VUKTtcbiAgICBlbGJvd09mZnNldC5tdWx0aXBseVNjYWxhcihleHRlbnNpb25SYXRpbyk7XG4gICAgZWxib3dQb3MuYWRkKGVsYm93T2Zmc2V0KTtcblxuICAgIC8vIENhbGN1bGF0ZSBqb2ludCBhbmdsZXMuIEdlbmVyYWxseSA0MCUgb2Ygcm90YXRpb24gYXBwbGllZCB0byBlbGJvdywgNjAlXG4gICAgLy8gdG8gd3Jpc3QsIGJ1dCBpZiBjb250cm9sbGVyIGlzIHJhaXNlZCBoaWdoZXIsIG1vcmUgcm90YXRpb24gY29tZXMgZnJvbVxuICAgIC8vIHRoZSB3cmlzdC5cbiAgICBsZXQgdG90YWxBbmdsZSA9IHRoaXMucXVhdEFuZ2xlXyhjb250cm9sbGVyQ2FtZXJhUSwgbmV3IFRIUkVFLlF1YXRlcm5pb24oKSk7XG4gICAgbGV0IHRvdGFsQW5nbGVEZWcgPSBUSFJFRS5NYXRoLnJhZFRvRGVnKHRvdGFsQW5nbGUpO1xuICAgIGxldCBsZXJwU3VwcHJlc3Npb24gPSAxIC0gTWF0aC5wb3codG90YWxBbmdsZURlZyAvIDE4MCwgNCk7IC8vIFRPRE8oc211cyk6ID8/P1xuXG4gICAgbGV0IGVsYm93UmF0aW8gPSBFTEJPV19CRU5EX1JBVElPO1xuICAgIGxldCB3cmlzdFJhdGlvID0gMSAtIEVMQk9XX0JFTkRfUkFUSU87XG4gICAgbGV0IGxlcnBWYWx1ZSA9IGxlcnBTdXBwcmVzc2lvbiAqXG4gICAgICAgIChlbGJvd1JhdGlvICsgd3Jpc3RSYXRpbyAqIGV4dGVuc2lvblJhdGlvICogRVhURU5TSU9OX1JBVElPX1dFSUdIVCk7XG5cbiAgICBsZXQgd3Jpc3RRID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5zbGVycChjb250cm9sbGVyQ2FtZXJhUSwgbGVycFZhbHVlKTtcbiAgICBsZXQgaW52V3Jpc3RRID0gd3Jpc3RRLmludmVyc2UoKTtcbiAgICBsZXQgZWxib3dRID0gY29udHJvbGxlckNhbWVyYVEuY2xvbmUoKS5tdWx0aXBseShpbnZXcmlzdFEpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIG91ciBmaW5hbCBjb250cm9sbGVyIHBvc2l0aW9uIGJhc2VkIG9uIGFsbCBvdXIgam9pbnQgcm90YXRpb25zXG4gICAgLy8gYW5kIGxlbmd0aHMuXG4gICAgLypcbiAgICBwb3NpdGlvbl8gPVxuICAgICAgcm9vdF9yb3RfICogKFxuICAgICAgICBjb250cm9sbGVyX3Jvb3Rfb2Zmc2V0XyArXG4yOiAgICAgIChhcm1fZXh0ZW5zaW9uXyAqIGFtdF9leHRlbnNpb24pICtcbjE6ICAgICAgZWxib3dfcm90ICogKGtDb250cm9sbGVyRm9yZWFybSArICh3cmlzdF9yb3QgKiBrQ29udHJvbGxlclBvc2l0aW9uKSlcbiAgICAgICk7XG4gICAgKi9cbiAgICBsZXQgd3Jpc3RQb3MgPSB0aGlzLndyaXN0UG9zO1xuICAgIHdyaXN0UG9zLmNvcHkoV1JJU1RfQ09OVFJPTExFUl9PRkZTRVQpO1xuICAgIHdyaXN0UG9zLmFwcGx5UXVhdGVybmlvbih3cmlzdFEpO1xuICAgIHdyaXN0UG9zLmFkZChFTEJPV19XUklTVF9PRkZTRVQpO1xuICAgIHdyaXN0UG9zLmFwcGx5UXVhdGVybmlvbihlbGJvd1EpO1xuICAgIHdyaXN0UG9zLmFkZCh0aGlzLmVsYm93UG9zKTtcblxuICAgIGxldCBvZmZzZXQgPSBuZXcgVEhSRUUuVmVjdG9yMygpLmNvcHkoQVJNX0VYVEVOU0lPTl9PRkZTRVQpO1xuICAgIG9mZnNldC5tdWx0aXBseVNjYWxhcihleHRlbnNpb25SYXRpbyk7XG5cbiAgICBsZXQgcG9zaXRpb24gPSBuZXcgVEhSRUUuVmVjdG9yMygpLmNvcHkodGhpcy53cmlzdFBvcyk7XG4gICAgcG9zaXRpb24uYWRkKG9mZnNldCk7XG4gICAgcG9zaXRpb24uYXBwbHlRdWF0ZXJuaW9uKHRoaXMucm9vdFEpO1xuXG4gICAgbGV0IG9yaWVudGF0aW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5jb3B5KHRoaXMuY29udHJvbGxlclEpO1xuXG4gICAgLy8gU2V0IHRoZSByZXN1bHRpbmcgcG9zZSBvcmllbnRhdGlvbiBhbmQgcG9zaXRpb24uXG4gICAgdGhpcy5wb3NlLm9yaWVudGF0aW9uLmNvcHkob3JpZW50YXRpb24pO1xuICAgIHRoaXMucG9zZS5wb3NpdGlvbi5jb3B5KHBvc2l0aW9uKTtcblxuICAgIHRoaXMubGFzdFRpbWUgPSB0aGlzLnRpbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcG9zZSBjYWxjdWxhdGVkIGJ5IHRoZSBtb2RlbC5cbiAgICovXG4gIGdldFBvc2UoKSB7XG4gICAgcmV0dXJuIHRoaXMucG9zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWJ1ZyBtZXRob2RzIGZvciByZW5kZXJpbmcgdGhlIGFybSBtb2RlbC5cbiAgICovXG4gIGdldEZvcmVhcm1MZW5ndGgoKSB7XG4gICAgcmV0dXJuIEVMQk9XX1dSSVNUX09GRlNFVC5sZW5ndGgoKTtcbiAgfVxuXG4gIGdldEVsYm93UG9zaXRpb24oKSB7XG4gICAgbGV0IG91dCA9IHRoaXMuZWxib3dQb3MuY2xvbmUoKTtcbiAgICByZXR1cm4gb3V0LmFwcGx5UXVhdGVybmlvbih0aGlzLnJvb3RRKTtcbiAgfVxuXG4gIGdldFdyaXN0UG9zaXRpb24oKSB7XG4gICAgbGV0IG91dCA9IHRoaXMud3Jpc3RQb3MuY2xvbmUoKTtcbiAgICByZXR1cm4gb3V0LmFwcGx5UXVhdGVybmlvbih0aGlzLnJvb3RRKTtcbiAgfVxuXG4gIGdldEhlYWRZYXdPcmllbnRhdGlvbl8oKSB7XG4gICAgbGV0IGhlYWRFdWxlciA9IG5ldyBUSFJFRS5FdWxlcigpLnNldEZyb21RdWF0ZXJuaW9uKHRoaXMuaGVhZFEsICdZWFonKTtcbiAgICBoZWFkRXVsZXIueCA9IDA7XG4gICAgaGVhZEV1bGVyLnogPSAwO1xuICAgIGxldCBkZXN0aW5hdGlvblEgPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpLnNldEZyb21FdWxlcihoZWFkRXVsZXIpO1xuICAgIHJldHVybiBkZXN0aW5hdGlvblE7XG4gIH1cblxuICBjbGFtcF8odmFsdWUsIG1pbiwgbWF4KSB7XG4gICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KHZhbHVlLCBtaW4pLCBtYXgpO1xuICB9XG5cbiAgcXVhdEFuZ2xlXyhxMSwgcTIpIHtcbiAgICBsZXQgdmVjMSA9IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDAsIC0xKTtcbiAgICBsZXQgdmVjMiA9IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDAsIC0xKTtcbiAgICB2ZWMxLmFwcGx5UXVhdGVybmlvbihxMSk7XG4gICAgdmVjMi5hcHBseVF1YXRlcm5pb24ocTIpO1xuICAgIHJldHVybiB2ZWMxLmFuZ2xlVG8odmVjMik7XG4gIH1cbn1cbiIsIi8qXG4gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRlbWl0dGVyMydcbmltcG9ydCBJbnRlcmFjdGlvbk1vZGVzIGZyb20gJy4vcmF5LWludGVyYWN0aW9uLW1vZGVzJ1xuaW1wb3J0IHtpc01vYmlsZX0gZnJvbSAnLi91dGlsJ1xuXG5jb25zdCBEUkFHX0RJU1RBTkNFX1BYID0gMTA7XG5cbi8qKlxuICogRW51bWVyYXRlcyBhbGwgcG9zc2libGUgaW50ZXJhY3Rpb24gbW9kZXMuIFNldHMgdXAgYWxsIGV2ZW50IGhhbmRsZXJzIChtb3VzZSxcbiAqIHRvdWNoLCBldGMpLCBpbnRlcmZhY2VzIHdpdGggZ2FtZXBhZCBBUEkuXG4gKlxuICogRW1pdHMgZXZlbnRzOlxuICogICAgYWN0aW9uOiBJbnB1dCBpcyBhY3RpdmF0ZWQgKG1vdXNlZG93biwgdG91Y2hzdGFydCwgZGF5ZHJlYW0gY2xpY2ssIHZpdmVcbiAqICAgIHRyaWdnZXIpLlxuICogICAgcmVsZWFzZTogSW5wdXQgaXMgZGVhY3RpdmF0ZWQgKG1vdXNldXAsIHRvdWNoZW5kLCBkYXlkcmVhbSByZWxlYXNlLCB2aXZlXG4gKiAgICByZWxlYXNlKS5cbiAqICAgIGNhbmNlbDogSW5wdXQgaXMgY2FuY2VsZWQgKGVnLiB3ZSBzY3JvbGxlZCBpbnN0ZWFkIG9mIHRhcHBpbmcgb25cbiAqICAgIG1vYmlsZS9kZXNrdG9wKS5cbiAqICAgIHBvaW50ZXJtb3ZlKDJEIHBvc2l0aW9uKTogVGhlIHBvaW50ZXIgaXMgbW92ZWQgKG1vdXNlIG9yIHRvdWNoKS5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmF5Q29udHJvbGxlciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIGNvbnN0cnVjdG9yKG9wdF9lbCkge1xuICAgIHN1cGVyKCk7XG4gICAgbGV0IGVsID0gb3B0X2VsIHx8IHdpbmRvdztcblxuICAgIC8vIEhhbmRsZSBpbnRlcmFjdGlvbnMuXG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5vbk1vdXNlRG93bl8uYmluZCh0aGlzKSk7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZV8uYmluZCh0aGlzKSk7XG4gICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25Nb3VzZVVwXy5iaW5kKHRoaXMpKTtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5vblRvdWNoU3RhcnRfLmJpbmQodGhpcykpO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMub25Ub3VjaE1vdmVfLmJpbmQodGhpcykpO1xuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5vblRvdWNoRW5kXy5iaW5kKHRoaXMpKTtcblxuICAgIHRoaXMuZWxlbWVudCA9IGVsO1xuXG4gICAgLy8gVGhlIHBvc2l0aW9uIG9mIHRoZSBwb2ludGVyLlxuICAgIHRoaXMucG9pbnRlciA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7XG4gICAgLy8gVGhlIHByZXZpb3VzIHBvc2l0aW9uIG9mIHRoZSBwb2ludGVyLlxuICAgIHRoaXMubGFzdFBvaW50ZXIgPSBuZXcgVEhSRUUuVmVjdG9yMigpO1xuICAgIC8vIFBvc2l0aW9uIG9mIHBvaW50ZXIgaW4gTm9ybWFsaXplZCBEZXZpY2UgQ29vcmRpbmF0ZXMgKE5EQykuXG4gICAgdGhpcy5wb2ludGVyTmRjID0gbmV3IFRIUkVFLlZlY3RvcjIoKTtcbiAgICAvLyBIb3cgbXVjaCB3ZSBoYXZlIGRyYWdnZWQgKGlmIHdlIGFyZSBkcmFnZ2luZykuXG4gICAgdGhpcy5kcmFnRGlzdGFuY2UgPSAwO1xuICAgIC8vIEFyZSB3ZSBkcmFnZ2luZyBvciBub3QuXG4gICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgLy8gSXMgcG9pbnRlciBhY3RpdmUgb3Igbm90LlxuICAgIHRoaXMuaXNUb3VjaEFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgLy8gR2FtZXBhZCBldmVudHMuXG4gICAgdGhpcy5nYW1lcGFkID0gbnVsbDtcblxuICAgIC8vIFZSIEV2ZW50cy5cbiAgICBpZiAoIW5hdmlnYXRvci5nZXRWUkRpc3BsYXlzKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1dlYlZSIEFQSSBub3QgYXZhaWxhYmxlISBDb25zaWRlciB1c2luZyB0aGUgd2VidnItcG9seWZpbGwuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hdmlnYXRvci5nZXRWUkRpc3BsYXlzKCkudGhlbigoZGlzcGxheXMpID0+IHtcbiAgICAgICAgdGhpcy52ckRpc3BsYXkgPSBkaXNwbGF5c1swXTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldEludGVyYWN0aW9uTW9kZSgpIHtcbiAgICAvLyBUT0RPOiBEZWJ1Z2dpbmcgb25seS5cbiAgICAvL3JldHVybiBJbnRlcmFjdGlvbk1vZGVzLkRBWURSRUFNO1xuXG4gICAgdmFyIGdhbWVwYWQgPSB0aGlzLmdldFZSR2FtZXBhZF8oKTtcblxuICAgIGlmIChnYW1lcGFkKSB7XG4gICAgICBpZiAoZ2FtZXBhZC5pZC5pbmNsdWRlcygnR2VhciBWUicpKSB7XG4gICAgICAgIHJldHVybiBJbnRlcmFjdGlvbk1vZGVzLlZSXzBET0Y7XG4gICAgICB9XG5cbiAgICAgIGxldCBwb3NlID0gZ2FtZXBhZC5wb3NlO1xuICAgICAgLy8gSWYgdGhlcmUncyBhIGdhbWVwYWQgY29ubmVjdGVkLCBkZXRlcm1pbmUgaWYgaXQncyBEYXlkcmVhbSBvciBhIFZpdmUuXG4gICAgICBpZiAocG9zZS5oYXNQb3NpdGlvbikge1xuICAgICAgICByZXR1cm4gSW50ZXJhY3Rpb25Nb2Rlcy5WUl82RE9GO1xuICAgICAgfVxuXG4gICAgICBpZiAocG9zZS5oYXNPcmllbnRhdGlvbikge1xuICAgICAgICByZXR1cm4gSW50ZXJhY3Rpb25Nb2Rlcy5WUl8zRE9GO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGVyZSdzIG5vIGdhbWVwYWQsIGl0IG1pZ2h0IGJlIENhcmRib2FyZCwgbWFnaWMgd2luZG93IG9yIGRlc2t0b3AuXG4gICAgICBpZiAoaXNNb2JpbGUoKSkge1xuICAgICAgICAvLyBFaXRoZXIgQ2FyZGJvYXJkIG9yIG1hZ2ljIHdpbmRvdywgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UgYXJlXG4gICAgICAgIC8vIHByZXNlbnRpbmcuXG4gICAgICAgIGlmICh0aGlzLnZyRGlzcGxheSAmJiB0aGlzLnZyRGlzcGxheS5pc1ByZXNlbnRpbmcpIHtcbiAgICAgICAgICByZXR1cm4gSW50ZXJhY3Rpb25Nb2Rlcy5WUl8wRE9GO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBJbnRlcmFjdGlvbk1vZGVzLlRPVUNIO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXZSBtdXN0IGJlIG9uIGRlc2t0b3AuXG4gICAgICAgIHJldHVybiBJbnRlcmFjdGlvbk1vZGVzLk1PVVNFO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBCeSBkZWZhdWx0LCB1c2UgVE9VQ0guXG4gICAgcmV0dXJuIEludGVyYWN0aW9uTW9kZXMuVE9VQ0g7XG4gIH1cblxuICBnZXRHYW1lcGFkUG9zZSgpIHtcbiAgICB2YXIgZ2FtZXBhZCA9IHRoaXMuZ2V0VlJHYW1lcGFkXygpO1xuICAgIHJldHVybiBnYW1lcGFkLnBvc2U7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSB0b3VjaCBldmVudCBnb2luZyBvbi5cbiAgICogT25seSByZWxldmFudCBvbiB0b3VjaCBkZXZpY2VzXG4gICAqL1xuICBnZXRJc1RvdWNoQWN0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLmlzVG91Y2hBY3RpdmU7XG4gIH1cblxuICBzZXRTaXplKHNpemUpIHtcbiAgICB0aGlzLnNpemUgPSBzaXplO1xuICAgIHRoaXMuYm91bmRpbmdSZWN0ID0geyBsZWZ0OiAwLCB0b3A6IDAgfTtcbiAgICBpZiAodHlwZW9mKHRoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QpID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzLmJvdW5kaW5nUmVjdCA9IHRoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmdhbWVwYWQpXG4gICAgICByZXR1cm47XG5cbiAgICAvLyBJZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBnYW1lcGFkLCBjaGVjayBldmVyeSBhbmltYXRpb24gZnJhbWUgZm9yIGFcbiAgICAvLyBwcmVzc2VkIGFjdGlvbi5cbiAgICBsZXQgaXNHYW1lcGFkUHJlc3NlZCA9IHRoaXMuZ2V0R2FtZXBhZEJ1dHRvblByZXNzZWRfKCk7XG4gICAgaWYgKGlzR2FtZXBhZFByZXNzZWQgJiYgIXRoaXMud2FzR2FtZXBhZFByZXNzZWQpIHtcbiAgICAgIHRoaXMuZW1pdCgncmF5ZG93bicpO1xuICAgIH1cbiAgICBpZiAoIWlzR2FtZXBhZFByZXNzZWQgJiYgdGhpcy53YXNHYW1lcGFkUHJlc3NlZCkge1xuICAgICAgdGhpcy5lbWl0KCdyYXl1cCcpO1xuICAgIH1cbiAgICB0aGlzLndhc0dhbWVwYWRQcmVzc2VkID0gaXNHYW1lcGFkUHJlc3NlZDtcbiAgfVxuXG4gIGdldEdhbWVwYWRCdXR0b25QcmVzc2VkXygpIHtcbiAgICB2YXIgZ2FtZXBhZCA9IHRoaXMuZ2V0VlJHYW1lcGFkXygpO1xuICAgIGlmICghZ2FtZXBhZCkge1xuICAgICAgLy8gSWYgdGhlcmUncyBubyBnYW1lcGFkLCB0aGUgYnV0dG9uIHdhcyBub3QgcHJlc3NlZC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gQ2hlY2sgZm9yIGNsaWNrcy5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IGdhbWVwYWQuYnV0dG9ucy5sZW5ndGg7ICsraikge1xuICAgICAgaWYgKGdhbWVwYWQuYnV0dG9uc1tqXS5wcmVzc2VkKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBvbk1vdXNlRG93bl8oZSkge1xuICAgIHRoaXMuc3RhcnREcmFnZ2luZ18oZSk7XG4gICAgdGhpcy5lbWl0KCdyYXlkb3duJywgZSk7XG4gIH1cblxuICBvbk1vdXNlTW92ZV8oZSkge1xuICAgIHRoaXMudXBkYXRlUG9pbnRlcl8oZSk7XG4gICAgdGhpcy51cGRhdGVEcmFnRGlzdGFuY2VfKCk7XG4gICAgdGhpcy5lbWl0KCdwb2ludGVybW92ZScsIHRoaXMucG9pbnRlck5kYyk7XG4gIH1cblxuICBvbk1vdXNlVXBfKGUpIHtcbiAgICB0aGlzLmVuZERyYWdnaW5nXyhlKTtcbiAgfVxuXG4gIG9uVG91Y2hTdGFydF8oZSkge1xuICAgIHRoaXMuaXNUb3VjaEFjdGl2ZSA9IHRydWU7XG4gICAgdmFyIHQgPSBlLnRvdWNoZXNbMF07XG4gICAgdGhpcy5zdGFydERyYWdnaW5nXyh0KTtcbiAgICB0aGlzLnVwZGF0ZVRvdWNoUG9pbnRlcl8oZSk7XG5cbiAgICB0aGlzLmVtaXQoJ3BvaW50ZXJtb3ZlJywgdGhpcy5wb2ludGVyTmRjKTtcbiAgICB0aGlzLmVtaXQoJ3JheWRvd24nLCBlKTtcbiAgfVxuXG4gIG9uVG91Y2hNb3ZlXyhlKSB7XG4gICAgdGhpcy51cGRhdGVUb3VjaFBvaW50ZXJfKGUpO1xuICAgIHRoaXMudXBkYXRlRHJhZ0Rpc3RhbmNlXygpO1xuXG4gICAgLy8gUHJldmVudCBzeW50aGV0aWMgbW91c2UgZXZlbnQgZnJvbSBiZWluZyBjcmVhdGVkLlxuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfVxuXG4gIG9uVG91Y2hFbmRfKGUpIHtcbiAgICB0aGlzLmVuZERyYWdnaW5nXyhlKTtcblxuICAgIHRoaXMuaXNUb3VjaEFjdGl2ZSA9IGZhbHNlO1xuICB9XG5cbiAgdXBkYXRlVG91Y2hQb2ludGVyXyhlKSB7XG4gICAgLy8gSWYgdGhlcmUncyBubyB0b3VjaGVzIGFycmF5LCBpZ25vcmUuXG4gICAgaWYgKGUudG91Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnNvbGUud2FybignUmVjZWl2ZWQgdG91Y2ggZXZlbnQgd2l0aCBubyB0b3VjaGVzLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdCA9IGUudG91Y2hlc1swXTtcbiAgICB0aGlzLnVwZGF0ZVBvaW50ZXJfKHQpO1xuICB9XG5cbiAgdXBkYXRlUG9pbnRlcl8oZSkge1xuICAgIC8vIEhvdyBtdWNoIHRoZSBwb2ludGVyIG1vdmVkLlxuICAgIHZhciB4ID0gZS5jbGllbnRYIC0gdGhpcy5ib3VuZGluZ1JlY3QubGVmdDtcbiAgICB2YXIgeSA9IGUuY2xpZW50WSAtIHRoaXMuYm91bmRpbmdSZWN0LnRvcDtcbiAgICB2YXIgbnggPSB4IC8gdGhpcy5zaXplLndpZHRoO1xuICAgIHZhciBueSA9IHkgLyB0aGlzLnNpemUuaGVpZ2h0O1xuICAgIHRoaXMucG9pbnRlci5zZXQoeCwgeSk7XG4gICAgdGhpcy5wb2ludGVyTmRjLnggPSAobnggKiAyKSAtIDE7XG4gICAgdGhpcy5wb2ludGVyTmRjLnkgPSAtKG55ICogMikgKyAxO1xuICB9XG5cbiAgdXBkYXRlRHJhZ0Rpc3RhbmNlXygpIHtcbiAgICBpZiAodGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICB2YXIgZGlzdGFuY2UgPSB0aGlzLmxhc3RQb2ludGVyLnN1Yih0aGlzLnBvaW50ZXIpLmxlbmd0aCgpO1xuICAgICAgdGhpcy5kcmFnRGlzdGFuY2UgKz0gZGlzdGFuY2U7XG4gICAgICB0aGlzLmxhc3RQb2ludGVyLmNvcHkodGhpcy5wb2ludGVyKTtcblxuICAgICAgaWYgKHRoaXMuZHJhZ0Rpc3RhbmNlID4gRFJBR19ESVNUQU5DRV9QWCkge1xuICAgICAgICB0aGlzLmVtaXQoJ3JheWNhbmNlbCcpO1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzdGFydERyYWdnaW5nXyhlKSB7XG4gICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmRyYWdEaXN0YW5jZSA9IDA7XG4gICAgdGhpcy5sYXN0UG9pbnRlci5zZXQoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuICB9XG5cbiAgZW5kRHJhZ2dpbmdfKGUpIHtcbiAgICBpZiAodGhpcy5kcmFnRGlzdGFuY2UgPCBEUkFHX0RJU1RBTkNFX1BYKSB7XG4gICAgICB0aGlzLmVtaXQoJ3JheXVwJywgZSk7XG4gICAgfVxuICAgIHRoaXMuZHJhZ0Rpc3RhbmNlID0gMDtcbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBmaXJzdCBWUi1lbmFibGVkIGdhbWVwYWQuXG4gICAqL1xuICBnZXRWUkdhbWVwYWRfKCkge1xuICAgIC8vIElmIHRoZXJlJ3Mgbm8gZ2FtZXBhZCBBUEksIHRoZXJlJ3Mgbm8gZ2FtZXBhZC5cbiAgICBpZiAoIW5hdmlnYXRvci5nZXRHYW1lcGFkcykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIGdhbWVwYWRzID0gbmF2aWdhdG9yLmdldEdhbWVwYWRzKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnYW1lcGFkcy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGdhbWVwYWQgPSBnYW1lcGFkc1tpXTtcbiAgICAgIC8vIFRoZSBsZWZ0IGhhbmQgb2YgdGhlIE9jdWx1cyBUb3VjaCBhcHBlYXJzIGZpcnN0IGluIHRoZSBsaXN0LFxuICAgICAgLy8gc2tpcCBpdCBhbmQgZm9yY2UgcmlnaHQtaGFuZGVkbmVzcy4gOihcbiAgICAgIGlmIChnYW1lcGFkICYmIGdhbWVwYWQuaWQgPT09ICdPY3VsdXMgVG91Y2ggKExlZnQpJylcbiAgICAgICAgY29udGludWU7XG5cbiAgICAgIC8vIFRoZSBhcnJheSBtYXkgY29udGFpbiB1bmRlZmluZWQgZ2FtZXBhZHMsIHNvIGNoZWNrIGZvciB0aGF0IGFzIHdlbGwgYXNcbiAgICAgIC8vIGEgbm9uLW51bGwgcG9zZS4gQWxsb3cgdGhlIEdlYXIgVlIgdG91Y2ggcGFkIHRocm91Z2guXG4gICAgICBpZiAoZ2FtZXBhZCAmJiAoZ2FtZXBhZC5wb3NlIHx8IGdhbWVwYWQuaWQuaW5jbHVkZXMoJ0dlYXIgVlInKSkpIHtcbiAgICAgICAgdGhpcy5nYW1lcGFkID0gZ2FtZXBhZDtcbiAgICAgICAgcmV0dXJuIGdhbWVwYWQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG5pbXBvcnQgT3JpZW50YXRpb25Bcm1Nb2RlbCBmcm9tICcuL29yaWVudGF0aW9uLWFybS1tb2RlbCdcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRlbWl0dGVyMydcbmltcG9ydCBSYXlSZW5kZXJlciBmcm9tICcuL3JheS1yZW5kZXJlcidcbmltcG9ydCBSYXlDb250cm9sbGVyIGZyb20gJy4vcmF5LWNvbnRyb2xsZXInXG5pbXBvcnQgSW50ZXJhY3Rpb25Nb2RlcyBmcm9tICcuL3JheS1pbnRlcmFjdGlvbi1tb2RlcydcblxuLyoqXG4gKiBBUEkgd3JhcHBlciBmb3IgdGhlIGlucHV0IGxpYnJhcnkuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJheUlucHV0IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgY29uc3RydWN0b3IoY2FtZXJhLCBvcHRfZWwpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5jYW1lcmEgPSBjYW1lcmE7XG4gICAgdGhpcy5yZW5kZXJlciA9IG5ldyBSYXlSZW5kZXJlcihjYW1lcmEpO1xuICAgIHRoaXMuY29udHJvbGxlciA9IG5ldyBSYXlDb250cm9sbGVyKG9wdF9lbCk7XG5cbiAgICAvLyBBcm0gbW9kZWwgbmVlZGVkIHRvIHRyYW5zZm9ybSBjb250cm9sbGVyIG9yaWVudGF0aW9uIGludG8gcHJvcGVyIHBvc2UuXG4gICAgdGhpcy5hcm1Nb2RlbCA9IG5ldyBPcmllbnRhdGlvbkFybU1vZGVsKCk7XG5cbiAgICB0aGlzLmNvbnRyb2xsZXIub24oJ3JheWRvd24nLCB0aGlzLm9uUmF5RG93bl8uYmluZCh0aGlzKSk7XG4gICAgdGhpcy5jb250cm9sbGVyLm9uKCdyYXl1cCcsIHRoaXMub25SYXlVcF8uYmluZCh0aGlzKSk7XG4gICAgdGhpcy5jb250cm9sbGVyLm9uKCdyYXljYW5jZWwnLCB0aGlzLm9uUmF5Q2FuY2VsXy5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLmNvbnRyb2xsZXIub24oJ3BvaW50ZXJtb3ZlJywgdGhpcy5vblBvaW50ZXJNb3ZlXy5iaW5kKHRoaXMpKTtcbiAgICB0aGlzLnJlbmRlcmVyLm9uKCdyYXlvdmVyJywgKG1lc2gpID0+IHsgdGhpcy5lbWl0KCdyYXlvdmVyJywgbWVzaCkgfSk7XG4gICAgdGhpcy5yZW5kZXJlci5vbigncmF5b3V0JywgKG1lc2gpID0+IHsgdGhpcy5lbWl0KCdyYXlvdXQnLCBtZXNoKSB9KTtcblxuICAgIC8vIEJ5IGRlZmF1bHQsIHB1dCB0aGUgcG9pbnRlciBvZmZzY3JlZW4uXG4gICAgdGhpcy5wb2ludGVyTmRjID0gbmV3IFRIUkVFLlZlY3RvcjIoMSwgMSk7XG5cbiAgICAvLyBFdmVudCBoYW5kbGVycy5cbiAgICB0aGlzLmhhbmRsZXJzID0ge307XG4gIH1cblxuICBhZGQob2JqZWN0LCBoYW5kbGVycykge1xuICAgIHRoaXMucmVuZGVyZXIuYWRkKG9iamVjdCwgaGFuZGxlcnMpO1xuICAgIHRoaXMuaGFuZGxlcnNbb2JqZWN0LmlkXSA9IGhhbmRsZXJzO1xuICB9XG5cbiAgcmVtb3ZlKG9iamVjdCkge1xuICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlKG9iamVjdCk7XG4gICAgZGVsZXRlIHRoaXMuaGFuZGxlcnNbb2JqZWN0LmlkXVxuICB9XG5cbiAgdXBkYXRlKG1lc2hlcykge1xuICAgIHRoaXMuY3VycmVudE1lc2hlcyA9IG1lc2hlcztcblxuICAgIGxldCBtb2RlID0gdGhpcy5jb250cm9sbGVyLmdldEludGVyYWN0aW9uTW9kZSgpO1xuICAgIHN3aXRjaCAobW9kZSkge1xuICAgICAgY2FzZSBJbnRlcmFjdGlvbk1vZGVzLk1PVVNFOlxuICAgICAgICAvLyBEZXNrdG9wIG1vdXNlIG1vZGUsIG1vdXNlIGNvb3JkaW5hdGVzIGFyZSB3aGF0IG1hdHRlcnMuXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UG9pbnRlcih0aGlzLnBvaW50ZXJOZGMpO1xuICAgICAgICAvLyBIaWRlIHRoZSByYXkgYW5kIHJldGljbGUuXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UmF5VmlzaWJpbGl0eShmYWxzZSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UmV0aWNsZVZpc2liaWxpdHkoZmFsc2UpO1xuXG4gICAgICAgIC8vIEluIG1vdXNlIG1vZGUgcmF5IHJlbmRlcmVyIGlzIGFsd2F5cyBhY3RpdmUuXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QWN0aXZlKHRydWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBJbnRlcmFjdGlvbk1vZGVzLlRPVUNIOlxuICAgICAgICAvLyBNb2JpbGUgbWFnaWMgd2luZG93IG1vZGUuIFRvdWNoIGNvb3JkaW5hdGVzIG1hdHRlciwgYnV0IHdlIHdhbnQgdG9cbiAgICAgICAgLy8gaGlkZSB0aGUgcmV0aWNsZS5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQb2ludGVyKHRoaXMucG9pbnRlck5kYyk7XG5cbiAgICAgICAgLy8gSGlkZSB0aGUgcmF5IGFuZCB0aGUgcmV0aWNsZS5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRSYXlWaXNpYmlsaXR5KGZhbHNlKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRSZXRpY2xlVmlzaWJpbGl0eShmYWxzZSk7XG5cbiAgICAgICAgLy8gSW4gdG91Y2ggbW9kZSB0aGUgcmF5IHJlbmRlcmVyIGlzIG9ubHkgYWN0aXZlIG9uIHRvdWNoLlxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEFjdGl2ZSh0aGlzLmNvbnRyb2xsZXIuZ2V0SXNUb3VjaEFjdGl2ZSgpKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgSW50ZXJhY3Rpb25Nb2Rlcy5WUl8wRE9GOlxuICAgICAgICAvLyBDYXJkYm9hcmQgbW9kZSwgd2UncmUgZGVhbGluZyB3aXRoIGEgZ2F6ZSByZXRpY2xlLlxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFBvc2l0aW9uKHRoaXMuY2FtZXJhLnBvc2l0aW9uKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRPcmllbnRhdGlvbih0aGlzLmNhbWVyYS5xdWF0ZXJuaW9uKTtcblxuICAgICAgICAvLyBSZXRpY2xlIG9ubHkuXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UmF5VmlzaWJpbGl0eShmYWxzZSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UmV0aWNsZVZpc2liaWxpdHkodHJ1ZSk7XG5cbiAgICAgICAgLy8gUmF5IHJlbmRlcmVyIGFsd2F5cyBhY3RpdmUuXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QWN0aXZlKHRydWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBJbnRlcmFjdGlvbk1vZGVzLlZSXzNET0Y6XG4gICAgICAgIC8vIERheWRyZWFtLCBvdXIgb3JpZ2luIGlzIHNsaWdodGx5IG9mZiAoZGVwZW5kaW5nIG9uIGhhbmRlZG5lc3MpLlxuICAgICAgICAvLyBCdXQgd2Ugc2hvdWxkIGJlIHVzaW5nIHRoZSBvcmllbnRhdGlvbiBmcm9tIHRoZSBnYW1lcGFkLlxuICAgICAgICAvLyBUT0RPKHNtdXMpOiBJbXBsZW1lbnQgdGhlIHJlYWwgYXJtIG1vZGVsLlxuICAgICAgICB2YXIgcG9zZSA9IHRoaXMuY29udHJvbGxlci5nZXRHYW1lcGFkUG9zZSgpO1xuXG4gICAgICAgIC8vIERlYnVnIG9ubHk6IHVzZSBjYW1lcmEgYXMgaW5wdXQgY29udHJvbGxlci5cbiAgICAgICAgLy9sZXQgY29udHJvbGxlck9yaWVudGF0aW9uID0gdGhpcy5jYW1lcmEucXVhdGVybmlvbjtcbiAgICAgICAgbGV0IGNvbnRyb2xsZXJPcmllbnRhdGlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCkuZnJvbUFycmF5KHBvc2Uub3JpZW50YXRpb24pO1xuXG4gICAgICAgIC8vIFRyYW5zZm9ybSB0aGUgY29udHJvbGxlciBpbnRvIHRoZSBjYW1lcmEgY29vcmRpbmF0ZSBzeXN0ZW0uXG4gICAgICAgIC8qXG4gICAgICAgIGNvbnRyb2xsZXJPcmllbnRhdGlvbi5tdWx0aXBseShcbiAgICAgICAgICAgIG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCkuc2V0RnJvbUF4aXNBbmdsZShuZXcgVEhSRUUuVmVjdG9yMygwLCAxLCAwKSwgTWF0aC5QSSkpO1xuICAgICAgICBjb250cm9sbGVyT3JpZW50YXRpb24ueCAqPSAtMTtcbiAgICAgICAgY29udHJvbGxlck9yaWVudGF0aW9uLnogKj0gLTE7XG4gICAgICAgICovXG5cbiAgICAgICAgLy8gRmVlZCBjYW1lcmEgYW5kIGNvbnRyb2xsZXIgaW50byB0aGUgYXJtIG1vZGVsLlxuICAgICAgICB0aGlzLmFybU1vZGVsLnNldEhlYWRPcmllbnRhdGlvbih0aGlzLmNhbWVyYS5xdWF0ZXJuaW9uKTtcbiAgICAgICAgdGhpcy5hcm1Nb2RlbC5zZXRIZWFkUG9zaXRpb24odGhpcy5jYW1lcmEucG9zaXRpb24pO1xuICAgICAgICB0aGlzLmFybU1vZGVsLnNldENvbnRyb2xsZXJPcmllbnRhdGlvbihjb250cm9sbGVyT3JpZW50YXRpb24pO1xuICAgICAgICB0aGlzLmFybU1vZGVsLnVwZGF0ZSgpO1xuXG4gICAgICAgIC8vIEdldCByZXN1bHRpbmcgcG9zZSBhbmQgY29uZmlndXJlIHRoZSByZW5kZXJlci5cbiAgICAgICAgbGV0IG1vZGVsUG9zZSA9IHRoaXMuYXJtTW9kZWwuZ2V0UG9zZSgpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFBvc2l0aW9uKG1vZGVsUG9zZS5wb3NpdGlvbik7XG4gICAgICAgIC8vdGhpcy5yZW5kZXJlci5zZXRQb3NpdGlvbihuZXcgVEhSRUUuVmVjdG9yMygpKTtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRPcmllbnRhdGlvbihtb2RlbFBvc2Uub3JpZW50YXRpb24pO1xuICAgICAgICAvL3RoaXMucmVuZGVyZXIuc2V0T3JpZW50YXRpb24oY29udHJvbGxlck9yaWVudGF0aW9uKTtcblxuICAgICAgICAvLyBTaG93IHJheSBhbmQgcmV0aWNsZS5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRSYXlWaXNpYmlsaXR5KHRydWUpO1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFJldGljbGVWaXNpYmlsaXR5KHRydWUpO1xuXG4gICAgICAgIC8vIFJheSByZW5kZXJlciBhbHdheXMgYWN0aXZlLlxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEFjdGl2ZSh0cnVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgSW50ZXJhY3Rpb25Nb2Rlcy5WUl82RE9GOlxuICAgICAgICAvLyBWaXZlLCBvcmlnaW4gZGVwZW5kcyBvbiB0aGUgcG9zaXRpb24gb2YgdGhlIGNvbnRyb2xsZXIuXG4gICAgICAgIC8vIFRPRE8oc211cykuLi5cbiAgICAgICAgdmFyIHBvc2UgPSB0aGlzLmNvbnRyb2xsZXIuZ2V0R2FtZXBhZFBvc2UoKTtcblxuICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBwb3NlIGlzIHZhbGlkLlxuICAgICAgICBpZiAoIXBvc2Uub3JpZW50YXRpb24gfHwgIXBvc2UucG9zaXRpb24pIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ0ludmFsaWQgZ2FtZXBhZCBwb3NlLiBDYW5cXCd0IHVwZGF0ZSByYXkuJyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGp1c3QgdGhlIHBvc2l0aW9uIG9mIHRoZSBjb250cm9sbGVyIHRvXG4gICAgICAgIC8vIHRoZSBwb3NpdGlvbiBhbmQgb3JpZW50YXRpb24gb2YgdGhlIGNhbWVyYS5cbiAgICAgICAgbGV0IHBvc2l0aW9uID0gbmV3IFRIUkVFLlZlY3RvcjMoKS5mcm9tQXJyYXkocG9zZS5wb3NpdGlvbik7XG4gICAgICAgIHBvc2l0aW9uLmFwcGx5TWF0cml4NCh0aGlzLmNhbWVyYS5tYXRyaXhXb3JsZCk7XG4gICAgICAgIGxldCBvcmllbnRhdGlvbiA9IG5ldyBUSFJFRS5RdWF0ZXJuaW9uKCkubXVsdGlwbHlRdWF0ZXJuaW9ucyhcbiAgICAgICAgICAgIHRoaXMuY2FtZXJhLnF1YXRlcm5pb24sXG4gICAgICAgICAgICBuZXcgVEhSRUUuUXVhdGVybmlvbigpLmZyb21BcnJheShwb3NlLm9yaWVudGF0aW9uKSk7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRPcmllbnRhdGlvbihvcmllbnRhdGlvbik7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UG9zaXRpb24ocG9zaXRpb24pO1xuXG4gICAgICAgIC8vIFNob3cgcmF5IGFuZCByZXRpY2xlLlxuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFJheVZpc2liaWxpdHkodHJ1ZSk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0UmV0aWNsZVZpc2liaWxpdHkodHJ1ZSk7XG5cbiAgICAgICAgLy8gUmF5IHJlbmRlcmVyIGFsd2F5cyBhY3RpdmUuXG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0QWN0aXZlKHRydWUpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgY29uc29sZS5lcnJvcignVW5rbm93biBpbnRlcmFjdGlvbiBtb2RlLicpO1xuICAgIH1cbiAgICB0aGlzLnJlbmRlcmVyLnVwZGF0ZShtZXNoZXMpO1xuICAgIHRoaXMuY29udHJvbGxlci51cGRhdGUoKTtcbiAgfVxuXG4gIHNldFNpemUoc2l6ZSkge1xuICAgIHRoaXMuY29udHJvbGxlci5zZXRTaXplKHNpemUpO1xuICB9XG5cbiAgZ2V0TWVzaCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5nZXRSZXRpY2xlUmF5TWVzaCgpO1xuICB9XG5cbiAgZ2V0T3JpZ2luKCkge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLmdldE9yaWdpbigpO1xuICB9XG5cbiAgZ2V0RGlyZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyLmdldERpcmVjdGlvbigpO1xuICB9XG5cbiAgZ2V0UmlnaHREaXJlY3Rpb24oKSB7XG4gICAgbGV0IGxvb2tBdCA9IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDAsIC0xKTtcbiAgICBsb29rQXQuYXBwbHlRdWF0ZXJuaW9uKHRoaXMuY2FtZXJhLnF1YXRlcm5pb24pO1xuICAgIHJldHVybiBuZXcgVEhSRUUuVmVjdG9yMygpLmNyb3NzVmVjdG9ycyhsb29rQXQsIHRoaXMuY2FtZXJhLnVwKTtcbiAgfVxuXG4gIG9uUmF5RG93bl8oZSkge1xuICAgIC8vY29uc29sZS5sb2coJ29uUmF5RG93bl8nKTtcblxuICAgIC8vIEZvcmNlIHRoZSByZW5kZXJlciB0byByYXljYXN0LlxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGUodGhpcy5jdXJyZW50TWVzaGVzKTtcbiAgICAgIGxldCBtZXNoID0gdGhpcy5yZW5kZXJlci5nZXRTZWxlY3RlZE1lc2goKTtcblxuICAgICAgdGhpcy5yYXlEb3duTWVzaCA9IG1lc2g7XG4gICAgICB0aGlzLmVtaXQoJ3JheWRvd24nLCBtZXNoKTtcblxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBY3RpdmUodHJ1ZSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBvblJheVVwXyhlKSB7XG4gICAgLy8gY29uc29sZS5sb2coJ29uUmF5VXBfJywgZSAmJiB0aGlzLnJheURvd25NZXNoKTtcblxuICAgIGlmIChlICYmIHRoaXMucmF5RG93bk1lc2gpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHRoaXMuZW1pdCgncmF5dXAnLCB0aGlzLnJheURvd25NZXNoKTtcbiAgICB0aGlzLnJheURvd25NZXNoID0gbnVsbDtcblxuICAgIHRoaXMucmVuZGVyZXIuc2V0QWN0aXZlKGZhbHNlKTtcbiAgfVxuXG4gIG9uUmF5Q2FuY2VsXyhlKSB7XG4gICAgLy9jb25zb2xlLmxvZygnb25SYXlDYW5jZWxfJyk7XG4gICAgbGV0IG1lc2ggPSB0aGlzLnJlbmRlcmVyLmdldFNlbGVjdGVkTWVzaCgpO1xuICAgIHRoaXMuZW1pdCgncmF5Y2FuY2VsJywgbWVzaCk7XG4gIH1cblxuICBvblBvaW50ZXJNb3ZlXyhuZGMpIHtcbiAgICB0aGlzLnBvaW50ZXJOZGMuY29weShuZGMpO1xuICB9XG59XG4iLCIvKlxuICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuXG52YXIgSW50ZXJhY3Rpb25Nb2RlcyA9IHtcbiAgTU9VU0U6IDEsXG4gIFRPVUNIOiAyLFxuICBWUl8wRE9GOiAzLFxuICBWUl8zRE9GOiA0LFxuICBWUl82RE9GOiA1XG59O1xuXG5leHBvcnQgeyBJbnRlcmFjdGlvbk1vZGVzIGFzIGRlZmF1bHQgfTtcbiIsIi8qXG4gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7YmFzZTY0fSBmcm9tICcuL3V0aWwnXG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50ZW1pdHRlcjMnXG5cbmNvbnN0IFJFVElDTEVfRElTVEFOQ0UgPSAzO1xuY29uc3QgSU5ORVJfUkFESVVTID0gMC4wMjtcbmNvbnN0IE9VVEVSX1JBRElVUyA9IDAuMDQ7XG5jb25zdCBSQVlfUkFESVVTID0gMC4wMjtcbmNvbnN0IEdSQURJRU5UX0lNQUdFID0gYmFzZTY0KCdpbWFnZS9wbmcnLCAnaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUlBQUFBQ0FDQVlBQUFERFBtSExBQUFCZGtsRVFWUjRuTzNXd1hIRVFBd0RRY2luL0ZPV3crQmp1aVBZQjJxNEcyblA5MzNQOVNPNDgyNHpnREFEaURPQXVIZmIzL1VqdUtNQWNRWVFad0J4L2dCeENoQ25BSEVLRUtjQWNRb1Fwd0J4Q2hDbkFIRUdFR2NBY2Y0QWNRb1Fad0J4QmhCbkFIRUdFR2NBY1FZUVp3QnhCaEJuQUhFR0VHY0FjUVlRWndCeEJoQm5BSEh2dHQvMUk3aWpBSEVHRUdjQWNmNEFjUW9RWndCeFRrQ2NBc1FaUUp3VEVLY0FjUW9RcHdCeEJoRG5CTVFwUUp3Q3hDbEFuQUxFS1VDY0FzUXBRSndDeENsQW5BTEVLVUNjQXNRcFFKd0J4RGtCY1FvUXB3QnhDaENuQUhFS0VLY0FjUW9RcHdCeENoQ25BSEVLRUdjQWNVNUFuQUxFS1VDY0FzUVpRSndURUtjQWNRWVE1d1RFS1VDY0FjUVpRSncvUUp3Q3hCbEFuQUhFR1VDY0FjUVpRSndCeEJsQW5BSEVHVUNjQWNRWlFKd0J4QmxBbkFIRUdVRGN1KzI1ZmdSM0ZDRE9BT0lNSU00ZklFNEI0aFFnVGdIaUZDQk9BZUlVSUU0QjRoUWd6Z0RpRENET0h5Qk9BZUlNSU00QTR2NEIvNUlGOWVENlF4Z0FBQUFBU1VWT1JLNUNZSUk9Jyk7XG5cbi8qKlxuICogSGFuZGxlcyByYXkgaW5wdXQgc2VsZWN0aW9uIGZyb20gZnJhbWUgb2YgcmVmZXJlbmNlIG9mIGFuIGFyYml0cmFyeSBvYmplY3QuXG4gKlxuICogVGhlIHNvdXJjZSBvZiB0aGUgcmF5IGlzIGZyb20gdmFyaW91cyBsb2NhdGlvbnM6XG4gKlxuICogRGVza3RvcDogbW91c2UuXG4gKiBNYWdpYyB3aW5kb3c6IHRvdWNoLlxuICogQ2FyZGJvYXJkOiBjYW1lcmEuXG4gKiBEYXlkcmVhbTogM0RPRiBjb250cm9sbGVyIHZpYSBnYW1lcGFkIChhbmQgc2hvdyByYXkpLlxuICogVml2ZTogNkRPRiBjb250cm9sbGVyIHZpYSBnYW1lcGFkIChhbmQgc2hvdyByYXkpLlxuICpcbiAqIEVtaXRzIHNlbGVjdGlvbiBldmVudHM6XG4gKiAgICAgcmF5b3ZlcihtZXNoKTogVGhpcyBtZXNoIHdhcyBzZWxlY3RlZC5cbiAqICAgICByYXlvdXQobWVzaCk6IFRoaXMgbWVzaCB3YXMgdW5zZWxlY3RlZC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmF5UmVuZGVyZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICBjb25zdHJ1Y3RvcihjYW1lcmEsIG9wdF9wYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5jYW1lcmEgPSBjYW1lcmE7XG5cbiAgICB2YXIgcGFyYW1zID0gb3B0X3BhcmFtcyB8fCB7fTtcblxuICAgIC8vIFdoaWNoIG9iamVjdHMgYXJlIGludGVyYWN0aXZlIChrZXllZCBvbiBpZCkuXG4gICAgdGhpcy5tZXNoZXMgPSB7fTtcblxuICAgIC8vIFdoaWNoIG9iamVjdHMgYXJlIGN1cnJlbnRseSBzZWxlY3RlZCAoa2V5ZWQgb24gaWQpLlxuICAgIHRoaXMuc2VsZWN0ZWQgPSB7fTtcblxuICAgIC8vIFRoZSByYXljYXN0ZXIuXG4gICAgdGhpcy5yYXljYXN0ZXIgPSBuZXcgVEhSRUUuUmF5Y2FzdGVyKCk7XG5cbiAgICAvLyBQb3NpdGlvbiBhbmQgb3JpZW50YXRpb24sIGluIGFkZGl0aW9uLlxuICAgIHRoaXMucG9zaXRpb24gPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuICAgIHRoaXMub3JpZW50YXRpb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpO1xuXG4gICAgdGhpcy5yb290ID0gbmV3IFRIUkVFLk9iamVjdDNEKCk7XG5cbiAgICAvLyBBZGQgdGhlIHJldGljbGUgbWVzaCB0byB0aGUgcm9vdCBvZiB0aGUgb2JqZWN0LlxuICAgIHRoaXMucmV0aWNsZSA9IHRoaXMuY3JlYXRlUmV0aWNsZV8oKTtcbiAgICB0aGlzLnJvb3QuYWRkKHRoaXMucmV0aWNsZSk7XG5cbiAgICAvLyBBZGQgdGhlIHJheSB0byB0aGUgcm9vdCBvZiB0aGUgb2JqZWN0LlxuICAgIHRoaXMucmF5ID0gdGhpcy5jcmVhdGVSYXlfKCk7XG4gICAgdGhpcy5yb290LmFkZCh0aGlzLnJheSk7XG5cbiAgICAvLyBIb3cgZmFyIHRoZSByZXRpY2xlIGlzIGN1cnJlbnRseSBmcm9tIHRoZSByZXRpY2xlIG9yaWdpbi5cbiAgICB0aGlzLnJldGljbGVEaXN0YW5jZSA9IFJFVElDTEVfRElTVEFOQ0U7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYW4gb2JqZWN0IHNvIHRoYXQgaXQgY2FuIGJlIGludGVyYWN0ZWQgd2l0aC5cbiAgICovXG4gIGFkZChvYmplY3QpIHtcbiAgICB0aGlzLm1lc2hlc1tvYmplY3QuaWRdID0gb2JqZWN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFByZXZlbnQgYW4gb2JqZWN0IGZyb20gYmVpbmcgaW50ZXJhY3RlZCB3aXRoLlxuICAgKi9cbiAgcmVtb3ZlKG9iamVjdCkge1xuICAgIHZhciBpZCA9IG9iamVjdC5pZDtcbiAgICBpZiAodGhpcy5tZXNoZXNbaWRdKSB7XG4gICAgICAvLyBJZiB0aGVyZSdzIG5vIGV4aXN0aW5nIG1lc2gsIHdlIGNhbid0IHJlbW92ZSBpdC5cbiAgICAgIGRlbGV0ZSB0aGlzLm1lc2hlc1tpZF07XG4gICAgfVxuICAgIC8vIElmIHRoZSBvYmplY3QgaXMgY3VycmVudGx5IHNlbGVjdGVkLCByZW1vdmUgaXQuXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRbaWRdKSB7XG4gICAgICBkZWxldGUgdGhpcy5zZWxlY3RlZFtvYmplY3QuaWRdO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZShtZXNoZXMpIHtcbiAgICAvLyBEbyB0aGUgcmF5Y2FzdGluZyBhbmQgaXNzdWUgdmFyaW91cyBldmVudHMgYXMgbmVlZGVkLlxuICAgIGxldCBpbnRlcnNlY3RzID0gdGhpcy5yYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0cyhtZXNoZXMsIHRydWUpO1xuICAgIGxldCBpbnRlcnNlY3RlZE1lc2g7XG5cbiAgICBmb3IgKHZhciBpPTA7IGkgPCBpbnRlcnNlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgb2JqID0gaW50ZXJzZWN0c1tpXS5vYmplY3Q7XG5cbiAgICAgIC8vIHRyYXZlcnNlIHRoZSBoaWVyYXJjaHkgYmFja3dhcmRzLCB0byBmaW5kIGEgY2xpY2thYmxlIG1lc2ggdmlhIGEgY2hpbGRcbiAgICAgIHdoaWxlIChvYmogJiYgIXRoaXMubWVzaGVzW29iai5pZF0pIHtcbiAgICAgICAgb2JqID0gb2JqLnBhcmVudDtcbiAgICAgIH1cblxuICAgICAgaWYgKG9iaikge1xuICAgICAgICBpbnRlcnNlY3RlZE1lc2ggPSBvYmouaWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAobGV0IGlkIGluIHRoaXMubWVzaGVzKSB7XG4gICAgICBsZXQgbWVzaCA9IHRoaXMubWVzaGVzW2lkXTtcbiAgICAgIGxldCBpc0ludGVyc2VjdGVkID0gKGludGVyc2VjdGVkTWVzaCA9PT0gbWVzaC5pZCk7XG4gICAgICBsZXQgaXNTZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRbaWRdO1xuXG4gICAgICAvLyBJZiBpdCdzIG5ld2x5IHNlbGVjdGVkLCBzZW5kIHJheW92ZXIuXG4gICAgICBpZiAoaXNJbnRlcnNlY3RlZCAmJiAhaXNTZWxlY3RlZCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkW2lkXSA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmlzQWN0aXZlKSB7XG4gICAgICAgICAgdGhpcy5lbWl0KCdyYXlvdmVyJywgbWVzaCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSWYgaXQncyBubyBsb25nZXIgaW50ZXJzZWN0ZWQsIHNlbmQgcmF5b3V0LlxuICAgICAgaWYgKCFpc0ludGVyc2VjdGVkICYmIGlzU2VsZWN0ZWQpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuc2VsZWN0ZWRbaWRdO1xuICAgICAgICB0aGlzLm1vdmVSZXRpY2xlXyhudWxsKTtcbiAgICAgICAgaWYgKHRoaXMuaXNBY3RpdmUpIHtcbiAgICAgICAgICB0aGlzLmVtaXQoJ3JheW91dCcsIG1lc2gpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChpc0ludGVyc2VjdGVkKSB7XG4gICAgICAgIHRoaXMubW92ZVJldGljbGVfKGludGVyc2VjdHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBvcmlnaW4gb2YgdGhlIHJheS5cbiAgICogQHBhcmFtIHtWZWN0b3J9IHZlY3RvciBQb3NpdGlvbiBvZiB0aGUgb3JpZ2luIG9mIHRoZSBwaWNraW5nIHJheS5cbiAgICovXG4gIHNldFBvc2l0aW9uKHZlY3Rvcikge1xuICAgIHRoaXMucG9zaXRpb24uY29weSh2ZWN0b3IpO1xuICAgIHRoaXMucmF5Y2FzdGVyLnJheS5vcmlnaW4uY29weSh2ZWN0b3IpO1xuICAgIHRoaXMudXBkYXRlUmF5Y2FzdGVyXygpO1xuICB9XG5cbiAgZ2V0T3JpZ2luKCkge1xuICAgIHJldHVybiB0aGlzLnJheWNhc3Rlci5yYXkub3JpZ2luO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgcmF5LlxuICAgKiBAcGFyYW0ge1ZlY3Rvcn0gcXVhdGVybmlvbiBVbml0IHZlY3RvciBjb3JyZXNwb25kaW5nIHRvIGRpcmVjdGlvbi5cbiAgICovXG4gIHNldE9yaWVudGF0aW9uKHF1YXRlcm5pb24pIHtcbiAgICB0aGlzLm9yaWVudGF0aW9uLmNvcHkocXVhdGVybmlvbik7XG5cbiAgICB2YXIgcG9pbnRBdCA9IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDAsIC0xKS5hcHBseVF1YXRlcm5pb24ocXVhdGVybmlvbik7XG4gICAgdGhpcy5yYXljYXN0ZXIucmF5LmRpcmVjdGlvbi5jb3B5KHBvaW50QXQpO1xuICAgIHRoaXMudXBkYXRlUmF5Y2FzdGVyXygpO1xuICB9XG5cbiAgZ2V0RGlyZWN0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnJheWNhc3Rlci5yYXkuZGlyZWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHBvaW50ZXIgb24gdGhlIHNjcmVlbiBmb3IgY2FtZXJhICsgcG9pbnRlciBiYXNlZCBwaWNraW5nLiBUaGlzXG4gICAqIHN1cGVyc2NlZGVzIG9yaWdpbiBhbmQgZGlyZWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ge1ZlY3RvcjJ9IHZlY3RvciBUaGUgcG9zaXRpb24gb2YgdGhlIHBvaW50ZXIgKHNjcmVlbiBjb29yZHMpLlxuICAgKi9cbiAgc2V0UG9pbnRlcih2ZWN0b3IpIHtcbiAgICB0aGlzLnJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKHZlY3RvciwgdGhpcy5jYW1lcmEpO1xuICAgIHRoaXMudXBkYXRlUmF5Y2FzdGVyXygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG1lc2gsIHdoaWNoIGluY2x1ZGVzIHJldGljbGUgYW5kL29yIHJheS4gVGhpcyBtZXNoIGlzIHRoZW4gYWRkZWRcbiAgICogdG8gdGhlIHNjZW5lLlxuICAgKi9cbiAgZ2V0UmV0aWNsZVJheU1lc2goKSB7XG4gICAgcmV0dXJuIHRoaXMucm9vdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgb2JqZWN0IGluIHRoZSBzY2VuZS5cbiAgICovXG4gIGdldFNlbGVjdGVkTWVzaCgpIHtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGxldCBtZXNoID0gbnVsbDtcbiAgICBmb3IgKHZhciBpZCBpbiB0aGlzLnNlbGVjdGVkKSB7XG4gICAgICBjb3VudCArPSAxO1xuICAgICAgbWVzaCA9IHRoaXMubWVzaGVzW2lkXTtcbiAgICB9XG4gICAgaWYgKGNvdW50ID4gMSkge1xuICAgICAgY29uc29sZS53YXJuKCdNb3JlIHRoYW4gb25lIG1lc2ggc2VsZWN0ZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiBtZXNoO1xuICB9XG5cbiAgLyoqXG4gICAqIEhpZGVzIGFuZCBzaG93cyB0aGUgcmV0aWNsZS5cbiAgICovXG4gIHNldFJldGljbGVWaXNpYmlsaXR5KGlzVmlzaWJsZSkge1xuICAgIHRoaXMucmV0aWNsZS52aXNpYmxlID0gaXNWaXNpYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHJheWNhc3RpbmcgcmF5IHdoaWNoIGdyYWR1YWxseSBmYWRlcyBvdXQgZnJvbVxuICAgKiB0aGUgb3JpZ2luLlxuICAgKi9cbiAgc2V0UmF5VmlzaWJpbGl0eShpc1Zpc2libGUpIHtcbiAgICB0aGlzLnJheS52aXNpYmxlID0gaXNWaXNpYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgYW5kIGRpc2FibGVzIHRoZSByYXljYXN0ZXIuIEZvciB0b3VjaCwgd2hlcmUgZmluZ2VyIHVwIG1lYW5zIHdlXG4gICAqIHNob3VsZG4ndCBiZSByYXljYXN0aW5nLlxuICAgKi9cbiAgc2V0QWN0aXZlKGlzQWN0aXZlKSB7XG4gICAgLy8gSWYgbm90aGluZyBjaGFuZ2VkLCBkbyBub3RoaW5nLlxuICAgIGlmICh0aGlzLmlzQWN0aXZlID09IGlzQWN0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIFRPRE8oc211cyk6IFNob3cgdGhlIHJheSBvciByZXRpY2xlIGFkanVzdCBpbiByZXNwb25zZS5cbiAgICB0aGlzLmlzQWN0aXZlID0gaXNBY3RpdmU7XG5cbiAgICBpZiAoIWlzQWN0aXZlKSB7XG4gICAgICB0aGlzLm1vdmVSZXRpY2xlXyhudWxsKTtcbiAgICAgIGZvciAobGV0IGlkIGluIHRoaXMuc2VsZWN0ZWQpIHtcbiAgICAgICAgbGV0IG1lc2ggPSB0aGlzLm1lc2hlc1tpZF07XG4gICAgICAgIGRlbGV0ZSB0aGlzLnNlbGVjdGVkW2lkXTtcbiAgICAgICAgdGhpcy5lbWl0KCdyYXlvdXQnLCBtZXNoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB1cGRhdGVSYXljYXN0ZXJfKCkge1xuICAgIHZhciByYXkgPSB0aGlzLnJheWNhc3Rlci5yYXk7XG5cbiAgICAvLyBQb3NpdGlvbiB0aGUgcmV0aWNsZSBhdCBhIGRpc3RhbmNlLCBhcyBjYWxjdWxhdGVkIGZyb20gdGhlIG9yaWdpbiBhbmRcbiAgICAvLyBkaXJlY3Rpb24uXG4gICAgdmFyIHBvc2l0aW9uID0gdGhpcy5yZXRpY2xlLnBvc2l0aW9uO1xuICAgIHBvc2l0aW9uLmNvcHkocmF5LmRpcmVjdGlvbik7XG4gICAgcG9zaXRpb24ubXVsdGlwbHlTY2FsYXIodGhpcy5yZXRpY2xlRGlzdGFuY2UpO1xuICAgIHBvc2l0aW9uLmFkZChyYXkub3JpZ2luKTtcblxuICAgIC8vIFNldCBwb3NpdGlvbiBhbmQgb3JpZW50YXRpb24gb2YgdGhlIHJheSBzbyB0aGF0IGl0IGdvZXMgZnJvbSBvcmlnaW4gdG9cbiAgICAvLyByZXRpY2xlLlxuICAgIHZhciBkZWx0YSA9IG5ldyBUSFJFRS5WZWN0b3IzKCkuY29weShyYXkuZGlyZWN0aW9uKTtcbiAgICBkZWx0YS5tdWx0aXBseVNjYWxhcih0aGlzLnJldGljbGVEaXN0YW5jZSk7XG4gICAgdGhpcy5yYXkuc2NhbGUueSA9IGRlbHRhLmxlbmd0aCgpO1xuICAgIHZhciBhcnJvdyA9IG5ldyBUSFJFRS5BcnJvd0hlbHBlcihyYXkuZGlyZWN0aW9uLCByYXkub3JpZ2luKTtcbiAgICB0aGlzLnJheS5yb3RhdGlvbi5jb3B5KGFycm93LnJvdGF0aW9uKTtcbiAgICB0aGlzLnJheS5wb3NpdGlvbi5hZGRWZWN0b3JzKHJheS5vcmlnaW4sIGRlbHRhLm11bHRpcGx5U2NhbGFyKDAuNSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIGdlb21ldHJ5IG9mIHRoZSByZXRpY2xlLlxuICAgKi9cbiAgY3JlYXRlUmV0aWNsZV8oKSB7XG4gICAgLy8gQ3JlYXRlIGEgc3BoZXJpY2FsIHJldGljbGUuXG4gICAgbGV0IGlubmVyR2VvbWV0cnkgPSBuZXcgVEhSRUUuU3BoZXJlR2VvbWV0cnkoSU5ORVJfUkFESVVTLCAzMiwgMzIpO1xuICAgIGxldCBpbm5lck1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hCYXNpY01hdGVyaWFsKHtcbiAgICAgIGNvbG9yOiAweGZmZmZmZixcbiAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxuICAgICAgb3BhY2l0eTogMC45XG4gICAgfSk7XG4gICAgbGV0IGlubmVyID0gbmV3IFRIUkVFLk1lc2goaW5uZXJHZW9tZXRyeSwgaW5uZXJNYXRlcmlhbCk7XG5cbiAgICBsZXQgb3V0ZXJHZW9tZXRyeSA9IG5ldyBUSFJFRS5TcGhlcmVHZW9tZXRyeShPVVRFUl9SQURJVVMsIDMyLCAzMik7XG4gICAgbGV0IG91dGVyTWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICAgICAgY29sb3I6IDB4MzMzMzMzLFxuICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICBvcGFjaXR5OiAwLjNcbiAgICB9KTtcbiAgICBsZXQgb3V0ZXIgPSBuZXcgVEhSRUUuTWVzaChvdXRlckdlb21ldHJ5LCBvdXRlck1hdGVyaWFsKTtcblxuICAgIGxldCByZXRpY2xlID0gbmV3IFRIUkVFLkdyb3VwKCk7XG4gICAgcmV0aWNsZS5hZGQoaW5uZXIpO1xuICAgIHJldGljbGUuYWRkKG91dGVyKTtcbiAgICByZXR1cm4gcmV0aWNsZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlcyB0aGUgcmV0aWNsZSB0byBhIHBvc2l0aW9uIHNvIHRoYXQgaXQncyBqdXN0IGluIGZyb250IG9mIHRoZSBtZXNoIHRoYXRcbiAgICogaXQgaW50ZXJzZWN0ZWQgd2l0aC5cbiAgICovXG4gIG1vdmVSZXRpY2xlXyhpbnRlcnNlY3Rpb25zKSB7XG4gICAgLy8gSWYgbm8gaW50ZXJzZWN0aW9uLCByZXR1cm4gdGhlIHJldGljbGUgdG8gdGhlIGRlZmF1bHQgcG9zaXRpb24uXG4gICAgbGV0IGRpc3RhbmNlID0gUkVUSUNMRV9ESVNUQU5DRTtcbiAgICBpZiAoaW50ZXJzZWN0aW9ucykge1xuICAgICAgLy8gT3RoZXJ3aXNlLCBkZXRlcm1pbmUgdGhlIGNvcnJlY3QgZGlzdGFuY2UuXG4gICAgICBsZXQgaW50ZXIgPSBpbnRlcnNlY3Rpb25zWzBdO1xuICAgICAgZGlzdGFuY2UgPSBpbnRlci5kaXN0YW5jZTtcbiAgICB9XG5cbiAgICB0aGlzLnJldGljbGVEaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgIHRoaXMudXBkYXRlUmF5Y2FzdGVyXygpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNyZWF0ZVJheV8oKSB7XG4gICAgLy8gQ3JlYXRlIGEgY3lsaW5kcmljYWwgcmF5LlxuICAgIHZhciBnZW9tZXRyeSA9IG5ldyBUSFJFRS5DeWxpbmRlckdlb21ldHJ5KFJBWV9SQURJVVMsIFJBWV9SQURJVVMsIDEsIDMyKTtcbiAgICB2YXIgbWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaEJhc2ljTWF0ZXJpYWwoe1xuICAgICAgbWFwOiBUSFJFRS5JbWFnZVV0aWxzLmxvYWRUZXh0dXJlKEdSQURJRU5UX0lNQUdFKSxcbiAgICAgIC8vY29sb3I6IDB4ZmZmZmZmLFxuICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICBvcGFjaXR5OiAwLjNcbiAgICB9KTtcbiAgICB2YXIgbWVzaCA9IG5ldyBUSFJFRS5NZXNoKGdlb21ldHJ5LCBtYXRlcmlhbCk7XG5cbiAgICByZXR1cm4gbWVzaDtcbiAgfVxufVxuIiwiLypcbiAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTW9iaWxlKCkge1xuICB2YXIgY2hlY2sgPSBmYWxzZTtcbiAgKGZ1bmN0aW9uKGEpe2lmKC8oYW5kcm9pZHxiYlxcZCt8bWVlZ28pLittb2JpbGV8YXZhbnRnb3xiYWRhXFwvfGJsYWNrYmVycnl8YmxhemVyfGNvbXBhbHxlbGFpbmV8ZmVubmVjfGhpcHRvcHxpZW1vYmlsZXxpcChob25lfG9kKXxpcmlzfGtpbmRsZXxsZ2UgfG1hZW1vfG1pZHB8bW1wfG1vYmlsZS4rZmlyZWZveHxuZXRmcm9udHxvcGVyYSBtKG9ifGluKWl8cGFsbSggb3MpP3xwaG9uZXxwKGl4aXxyZSlcXC98cGx1Y2tlcnxwb2NrZXR8cHNwfHNlcmllcyg0fDYpMHxzeW1iaWFufHRyZW98dXBcXC4oYnJvd3NlcnxsaW5rKXx2b2RhZm9uZXx3YXB8d2luZG93cyBjZXx4ZGF8eGlpbm8vaS50ZXN0KGEpfHwvMTIwN3w2MzEwfDY1OTB8M2dzb3w0dGhwfDUwWzEtNl1pfDc3MHN8ODAyc3xhIHdhfGFiYWN8YWMoZXJ8b298c1xcLSl8YWkoa298cm4pfGFsKGF2fGNhfGNvKXxhbW9pfGFuKGV4fG55fHl3KXxhcHR1fGFyKGNofGdvKXxhcyh0ZXx1cyl8YXR0d3xhdShkaXxcXC1tfHIgfHMgKXxhdmFufGJlKGNrfGxsfG5xKXxiaShsYnxyZCl8YmwoYWN8YXopfGJyKGV8dil3fGJ1bWJ8YndcXC0obnx1KXxjNTVcXC98Y2FwaXxjY3dhfGNkbVxcLXxjZWxsfGNodG18Y2xkY3xjbWRcXC18Y28obXB8bmQpfGNyYXd8ZGEoaXR8bGx8bmcpfGRidGV8ZGNcXC1zfGRldml8ZGljYXxkbW9ifGRvKGN8cClvfGRzKDEyfFxcLWQpfGVsKDQ5fGFpKXxlbShsMnx1bCl8ZXIoaWN8azApfGVzbDh8ZXooWzQtN10wfG9zfHdhfHplKXxmZXRjfGZseShcXC18Xyl8ZzEgdXxnNTYwfGdlbmV8Z2ZcXC01fGdcXC1tb3xnbyhcXC53fG9kKXxncihhZHx1bil8aGFpZXxoY2l0fGhkXFwtKG18cHx0KXxoZWlcXC18aGkocHR8dGEpfGhwKCBpfGlwKXxoc1xcLWN8aHQoYyhcXC18IHxffGF8Z3xwfHN8dCl8dHApfGh1KGF3fHRjKXxpXFwtKDIwfGdvfG1hKXxpMjMwfGlhYyggfFxcLXxcXC8pfGlicm98aWRlYXxpZzAxfGlrb218aW0xa3xpbm5vfGlwYXF8aXJpc3xqYSh0fHYpYXxqYnJvfGplbXV8amlnc3xrZGRpfGtlaml8a2d0KCB8XFwvKXxrbG9ufGtwdCB8a3djXFwtfGt5byhjfGspfGxlKG5vfHhpKXxsZyggZ3xcXC8oa3xsfHUpfDUwfDU0fFxcLVthLXddKXxsaWJ3fGx5bnh8bTFcXC13fG0zZ2F8bTUwXFwvfG1hKHRlfHVpfHhvKXxtYygwMXwyMXxjYSl8bVxcLWNyfG1lKHJjfHJpKXxtaShvOHxvYXx0cyl8bW1lZnxtbygwMXwwMnxiaXxkZXxkb3x0KFxcLXwgfG98dil8enopfG10KDUwfHAxfHYgKXxtd2JwfG15d2F8bjEwWzAtMl18bjIwWzItM118bjMwKDB8Mil8bjUwKDB8Mnw1KXxuNygwKDB8MSl8MTApfG5lKChjfG0pXFwtfG9ufHRmfHdmfHdnfHd0KXxub2soNnxpKXxuenBofG8yaW18b3AodGl8d3YpfG9yYW58b3dnMXxwODAwfHBhbihhfGR8dCl8cGR4Z3xwZygxM3xcXC0oWzEtOF18YykpfHBoaWx8cGlyZXxwbChheXx1Yyl8cG5cXC0yfHBvKGNrfHJ0fHNlKXxwcm94fHBzaW98cHRcXC1nfHFhXFwtYXxxYygwN3wxMnwyMXwzMnw2MHxcXC1bMi03XXxpXFwtKXxxdGVrfHIzODB8cjYwMHxyYWtzfHJpbTl8cm8odmV8em8pfHM1NVxcL3xzYShnZXxtYXxtbXxtc3xueXx2YSl8c2MoMDF8aFxcLXxvb3xwXFwtKXxzZGtcXC98c2UoYyhcXC18MHwxKXw0N3xtY3xuZHxyaSl8c2doXFwtfHNoYXJ8c2llKFxcLXxtKXxza1xcLTB8c2woNDV8aWQpfHNtKGFsfGFyfGIzfGl0fHQ1KXxzbyhmdHxueSl8c3AoMDF8aFxcLXx2XFwtfHYgKXxzeSgwMXxtYil8dDIoMTh8NTApfHQ2KDAwfDEwfDE4KXx0YShndHxsayl8dGNsXFwtfHRkZ1xcLXx0ZWwoaXxtKXx0aW1cXC18dFxcLW1vfHRvKHBsfHNoKXx0cyg3MHxtXFwtfG0zfG01KXx0eFxcLTl8dXAoXFwuYnxnMXxzaSl8dXRzdHx2NDAwfHY3NTB8dmVyaXx2aShyZ3x0ZSl8dmsoNDB8NVswLTNdfFxcLXYpfHZtNDB8dm9kYXx2dWxjfHZ4KDUyfDUzfDYwfDYxfDcwfDgwfDgxfDgzfDg1fDk4KXx3M2MoXFwtfCApfHdlYmN8d2hpdHx3aShnIHxuY3xudyl8d21sYnx3b251fHg3MDB8eWFzXFwtfHlvdXJ8emV0b3x6dGVcXC0vaS50ZXN0KGEuc3Vic3RyKDAsNCkpKWNoZWNrID0gdHJ1ZX0pKG5hdmlnYXRvci51c2VyQWdlbnR8fG5hdmlnYXRvci52ZW5kb3J8fHdpbmRvdy5vcGVyYSk7XG4gIHJldHVybiBjaGVjaztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NChtaW1lVHlwZSwgYmFzZTY0KSB7XG4gIHJldHVybiAnZGF0YTonICsgbWltZVR5cGUgKyAnO2Jhc2U2NCwnICsgYmFzZTY0O1xufVxuIl19\n"
  },
  {
    "path": "browser/vendor/borismus/webvr-manager.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(_dereq_,module,exports){\n/*\n * Copyright 2015 Google Inc. 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\nvar Emitter = _dereq_('./emitter.js');\nvar Modes = _dereq_('./modes.js');\nvar Util = _dereq_('./util.js');\n\n/**\n * Everything having to do with the WebVR button.\n * Emits a 'click' event when it's clicked.\n */\nfunction ButtonManager(opt_root) {\n  var root = opt_root || document.body;\n  this.loadIcons_();\n\n  // Make the fullscreen button.\n  var fsButton = this.createButton();\n  fsButton.src = this.ICONS.fullscreen;\n  fsButton.title = 'Fullscreen mode';\n  var s = fsButton.style;\n  s.bottom = 0;\n  s.right = 0;\n  fsButton.addEventListener('click', this.createClickHandler_('fs'));\n  root.appendChild(fsButton);\n  this.fsButton = fsButton;\n\n  // Make the VR button.\n  var vrButton = this.createButton();\n  vrButton.src = this.ICONS.cardboard;\n  vrButton.title = 'Virtual reality mode';\n  var s = vrButton.style;\n  s.bottom = 0;\n  s.right = '48px';\n  vrButton.addEventListener('click', this.createClickHandler_('vr'));\n  root.appendChild(vrButton);\n  this.vrButton = vrButton;\n\n  this.isVisible = true;\n\n}\nButtonManager.prototype = new Emitter();\n\nButtonManager.prototype.createButton = function() {\n  var button = document.createElement('img');\n  button.className = 'webvr-button';\n  var s = button.style;\n  s.position = 'fixed';\n  s.width = '24px'\n  s.height = '24px';\n  s.backgroundSize = 'cover';\n  s.backgroundColor = 'transparent';\n  s.border = 0;\n  s.userSelect = 'none';\n  s.webkitUserSelect = 'none';\n  s.MozUserSelect = 'none';\n  s.cursor = 'pointer';\n  s.padding = '12px';\n  s.zIndex = 1;\n  s.display = 'none';\n\n  // Prevent button from being selected and dragged.\n  button.draggable = false;\n  button.addEventListener('dragstart', function(e) {\n    e.preventDefault();\n  });\n\n  // Style it on hover.\n  button.addEventListener('mouseenter', function(e) {\n    s.filter = s.webkitFilter = 'drop-shadow(0 0 5px rgba(255,255,255,1))';\n  });\n  button.addEventListener('mouseleave', function(e) {\n    s.filter = s.webkitFilter = '';\n  });\n  return button;\n};\n\nButtonManager.prototype.setMode = function(mode, isVRCompatible) {\n  isVRCompatible = isVRCompatible || WebVRConfig.FORCE_ENABLE_VR;\n  if (!this.isVisible) {\n    return;\n  }\n  switch (mode) {\n    case Modes.NORMAL:\n      this.fsButton.style.display = 'block';\n      this.fsButton.src = this.ICONS.fullscreen;\n      this.vrButton.style.display = (isVRCompatible ? 'block' : 'none');\n      break;\n    case Modes.MAGIC_WINDOW:\n      this.fsButton.style.display = 'block';\n      this.fsButton.src = this.ICONS.exitFullscreen;\n      this.vrButton.style.display = (isVRCompatible ? 'block' : 'none');\n      break;\n    case Modes.VR:\n      this.fsButton.style.display = 'none';\n      this.vrButton.style.display = 'none';\n      break;\n  }\n\n  // Hack for Safari Mac/iOS to force relayout (svg-specific issue)\n  // http://goo.gl/hjgR6r\n  var oldValue = this.fsButton.style.display;\n  this.fsButton.style.display = 'inline-block';\n  this.fsButton.offsetHeight;\n  this.fsButton.style.display = oldValue;\n};\n\nButtonManager.prototype.setVisibility = function(isVisible) {\n  this.isVisible = isVisible;\n  this.fsButton.style.display = isVisible ? 'block' : 'none';\n  this.vrButton.style.display = isVisible ? 'block' : 'none';\n};\n\nButtonManager.prototype.createClickHandler_ = function(eventName) {\n  return function(e) {\n    e.stopPropagation();\n    e.preventDefault();\n    this.emit(eventName);\n  }.bind(this);\n};\n\nButtonManager.prototype.loadIcons_ = function() {\n  // Preload some hard-coded SVG.\n  this.ICONS = {};\n  this.ICONS.cardboard = Util.base64('image/svg+xml', 'PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI0ZGRkZGRiI+CiAgICA8cGF0aCBkPSJNMjAuNzQgNkgzLjIxQzIuNTUgNiAyIDYuNTcgMiA3LjI4djEwLjQ0YzAgLjcuNTUgMS4yOCAxLjIzIDEuMjhoNC43OWMuNTIgMCAuOTYtLjMzIDEuMTQtLjc5bDEuNC0zLjQ4Yy4yMy0uNTkuNzktMS4wMSAxLjQ0LTEuMDFzMS4yMS40MiAxLjQ1IDEuMDFsMS4zOSAzLjQ4Yy4xOS40Ni42My43OSAxLjExLjc5aDQuNzljLjcxIDAgMS4yNi0uNTcgMS4yNi0xLjI4VjcuMjhjMC0uNy0uNTUtMS4yOC0xLjI2LTEuMjh6TTcuNSAxNC42MmMtMS4xNyAwLTIuMTMtLjk1LTIuMTMtMi4xMiAwLTEuMTcuOTYtMi4xMyAyLjEzLTIuMTMgMS4xOCAwIDIuMTIuOTYgMi4xMiAyLjEzcy0uOTUgMi4xMi0yLjEyIDIuMTJ6bTkgMGMtMS4xNyAwLTIuMTMtLjk1LTIuMTMtMi4xMiAwLTEuMTcuOTYtMi4xMyAyLjEzLTIuMTNzMi4xMi45NiAyLjEyIDIuMTMtLjk1IDIuMTItMi4xMiAyLjEyeiIvPgogICAgPHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgyNHYyNEgwVjB6Ii8+Cjwvc3ZnPgo=');\n  this.ICONS.fullscreen = Util.base64('image/svg+xml', 'PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI0ZGRkZGRiI+CiAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+CiAgICA8cGF0aCBkPSJNNyAxNEg1djVoNXYtMkg3di0zem0tMi00aDJWN2gzVjVINXY1em0xMiA3aC0zdjJoNXYtNWgtMnYzek0xNCA1djJoM3YzaDJWNWgtNXoiLz4KPC9zdmc+Cg==');\n  this.ICONS.exitFullscreen = Util.base64('image/svg+xml', 'PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI0ZGRkZGRiI+CiAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+CiAgICA8cGF0aCBkPSJNNSAxNmgzdjNoMnYtNUg1djJ6bTMtOEg1djJoNVY1SDh2M3ptNiAxMWgydi0zaDN2LTJoLTV2NXptMi0xMVY1aC0ydjVoNVY4aC0zeiIvPgo8L3N2Zz4K');\n  this.ICONS.settings = Util.base64('image/svg+xml', 'PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNHB4IiBoZWlnaHQ9IjI0cHgiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iI0ZGRkZGRiI+CiAgICA8cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+CiAgICA8cGF0aCBkPSJNMTkuNDMgMTIuOThjLjA0LS4zMi4wNy0uNjQuMDctLjk4cy0uMDMtLjY2LS4wNy0uOThsMi4xMS0xLjY1Yy4xOS0uMTUuMjQtLjQyLjEyLS42NGwtMi0zLjQ2Yy0uMTItLjIyLS4zOS0uMy0uNjEtLjIybC0yLjQ5IDFjLS41Mi0uNC0xLjA4LS43My0xLjY5LS45OGwtLjM4LTIuNjVDMTQuNDYgMi4xOCAxNC4yNSAyIDE0IDJoLTRjLS4yNSAwLS40Ni4xOC0uNDkuNDJsLS4zOCAyLjY1Yy0uNjEuMjUtMS4xNy41OS0xLjY5Ljk4bC0yLjQ5LTFjLS4yMy0uMDktLjQ5IDAtLjYxLjIybC0yIDMuNDZjLS4xMy4yMi0uMDcuNDkuMTIuNjRsMi4xMSAxLjY1Yy0uMDQuMzItLjA3LjY1LS4wNy45OHMuMDMuNjYuMDcuOThsLTIuMTEgMS42NWMtLjE5LjE1LS4yNC40Mi0uMTIuNjRsMiAzLjQ2Yy4xMi4yMi4zOS4zLjYxLjIybDIuNDktMWMuNTIuNCAxLjA4LjczIDEuNjkuOThsLjM4IDIuNjVjLjAzLjI0LjI0LjQyLjQ5LjQyaDRjLjI1IDAgLjQ2LS4xOC40OS0uNDJsLjM4LTIuNjVjLjYxLS4yNSAxLjE3LS41OSAxLjY5LS45OGwyLjQ5IDFjLjIzLjA5LjQ5IDAgLjYxLS4yMmwyLTMuNDZjLjEyLS4yMi4wNy0uNDktLjEyLS42NGwtMi4xMS0xLjY1ek0xMiAxNS41Yy0xLjkzIDAtMy41LTEuNTctMy41LTMuNXMxLjU3LTMuNSAzLjUtMy41IDMuNSAxLjU3IDMuNSAzLjUtMS41NyAzLjUtMy41IDMuNXoiLz4KPC9zdmc+Cg==');\n};\n\nmodule.exports = ButtonManager;\n\n},{\"./emitter.js\":2,\"./modes.js\":4,\"./util.js\":5}],2:[function(_dereq_,module,exports){\n/*\n * Copyright 2015 Google Inc. 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\nfunction Emitter() {\n  this.callbacks = {};\n}\n\nEmitter.prototype.emit = function(eventName) {\n  var callbacks = this.callbacks[eventName];\n  if (!callbacks) {\n    //console.log('No valid callback specified.');\n    return;\n  }\n  var args = [].slice.call(arguments);\n  // Eliminate the first param (the callback).\n  args.shift();\n  for (var i = 0; i < callbacks.length; i++) {\n    callbacks[i].apply(this, args);\n  }\n};\n\nEmitter.prototype.on = function(eventName, callback) {\n  if (eventName in this.callbacks) {\n    this.callbacks[eventName].push(callback);\n  } else {\n    this.callbacks[eventName] = [callback];\n  }\n};\n\nmodule.exports = Emitter;\n\n},{}],3:[function(_dereq_,module,exports){\n/*\n * Copyright 2015 Google Inc. 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\nvar WebVRManager = _dereq_('./webvr-manager.js');\n\nwindow.WebVRConfig = window.WebVRConfig || {};\nwindow.WebVRManager = WebVRManager;\n\n},{\"./webvr-manager.js\":6}],4:[function(_dereq_,module,exports){\n/*\n * Copyright 2015 Google Inc. 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\nvar Modes = {\n  UNKNOWN: 0,\n  // Not fullscreen, just tracking.\n  NORMAL: 1,\n  // Magic window immersive mode.\n  MAGIC_WINDOW: 2,\n  // Full screen split screen VR mode.\n  VR: 3,\n};\n\nmodule.exports = Modes;\n\n},{}],5:[function(_dereq_,module,exports){\n/*\n * Copyright 2015 Google Inc. 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\nvar Util = {};\n\nUtil.base64 = function(mimeType, base64) {\n  return 'data:' + mimeType + ';base64,' + base64;\n};\n\nUtil.isMobile = function() {\n  var check = false;\n  (function(a){if(/(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)||/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)))check = true})(navigator.userAgent||navigator.vendor||window.opera);\n  return check;\n};\n\nUtil.isFirefox = function() {\n  return /firefox/i.test(navigator.userAgent);\n};\n\nUtil.isIOS = function() {\n  return /(iPad|iPhone|iPod)/g.test(navigator.userAgent);\n};\n\nUtil.isIFrame = function() {\n  try {\n    return window.self !== window.top;\n  } catch (e) {\n    return true;\n  }\n};\n\nUtil.appendQueryParameter = function(url, key, value) {\n  // Determine delimiter based on if the URL already GET parameters in it.\n  var delimiter = (url.indexOf('?') < 0 ? '?' : '&');\n  url += delimiter + key + '=' + value;\n  return url;\n};\n\n// From http://goo.gl/4WX3tg\nUtil.getQueryParameter = function(name) {\n  name = name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\n  var regex = new RegExp(\"[\\\\?&]\" + name + \"=([^&#]*)\"),\n      results = regex.exec(location.search);\n  return results === null ? \"\" : decodeURIComponent(results[1].replace(/\\+/g, \" \"));\n};\n\nUtil.isLandscapeMode = function() {\n  return (window.orientation == 90 || window.orientation == -90);\n};\n\nUtil.getScreenWidth = function() {\n  return Math.max(window.screen.width, window.screen.height) *\n      window.devicePixelRatio;\n};\n\nUtil.getScreenHeight = function() {\n  return Math.min(window.screen.width, window.screen.height) *\n      window.devicePixelRatio;\n};\n\n/**\n * Utility to convert the projection matrix to a vector accepted by the shader.\n *\n * @param {Object} opt_params A rectangle to scale this vector by.\n */\nUtil.projectionMatrixToVector_ = function(matrix, opt_params) {\n  var params = opt_params || {};\n  var xScale = params.xScale || 1;\n  var yScale = params.yScale || 1;\n  var xTrans = params.xTrans || 0;\n  var yTrans = params.yTrans || 0;\n\n  var elements = matrix.elements;\n  var vec = new THREE.Vector4();\n  vec.set(elements[4*0 + 0] * xScale,\n          elements[4*1 + 1] * yScale,\n          elements[4*2 + 0] - 1 - xTrans,\n          elements[4*2 + 1] - 1 - yTrans).divideScalar(2);\n  return vec;\n};\n\nUtil.leftProjectionVectorToRight_ = function(left) {\n  //projectionLeft + vec4(0.0, 0.0, 1.0, 0.0)) * vec4(1.0, 1.0, -1.0, 1.0);\n  var out = new THREE.Vector4(0, 0, 1, 0);\n  out.add(left); // out = left + (0, 0, 1, 0).\n  out.z *= -1; // Flip z.\n\n  return out;\n};\n\nmodule.exports = Util;\n\n},{}],6:[function(_dereq_,module,exports){\n/*\n * Copyright 2015 Google Inc. 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\nvar ButtonManager = _dereq_('./button-manager.js');\nvar Emitter = _dereq_('./emitter.js');\nvar Modes = _dereq_('./modes.js');\nvar Util = _dereq_('./util.js');\n\n/**\n * Helper for getting in and out of VR mode.\n */\nfunction WebVRManager(renderer, effect, params) {\n  this.params = params || {};\n\n  this.mode = Modes.UNKNOWN;\n\n  // Set option to hide the button.\n  this.hideButton = this.params.hideButton || false;\n  // Whether or not the FOV should be distorted or un-distorted. By default, it\n  // should be distorted, but in the case of vertex shader based distortion,\n  // ensure that we use undistorted parameters.\n  this.isUndistorted = !!this.params.isUndistorted;\n\n  // Save the THREE.js renderer and effect for later.\n  this.renderer = renderer;\n  this.effect = effect;\n  var polyfillWrapper = document.querySelector('.webvr-polyfill-fullscreen-wrapper');\n  this.button = new ButtonManager(polyfillWrapper);\n\n  if (typeof params.isVRCompatible !== 'undefined') {\n    this.isVRCompatible = params.isVRCompatible;\n  } else {\n    // Only automatically enable VR mode if we're on a mobile device.\n    this.isVRCompatible = Util.isMobile();\n  }\n\n  this.isFullscreenDisabled = !!Util.getQueryParameter('no_fullscreen');\n  this.startMode = Vizor.startMode;\n  var startModeParam = parseInt(Util.getQueryParameter('start_mode'));\n  if (!isNaN(startModeParam)) {\n    this.startMode = startModeParam;\n  }\n\n  if (this.hideButton) {\n    this.button.setVisibility(false);\n  }\n\n  // Check if the browser is compatible with WebVR.\n  this.getDeviceByType_(VRDisplay).then(function(hmd) {\n    this.hmd = hmd;\n\n    this.emit('initialized');\n  }.bind(this));\n\n  switch (this.startMode) {\n    case Modes.MAGIC_WINDOW:\n      this.setMode_(Modes.MAGIC_WINDOW);\n      break;\n    case Modes.VR:\n      this.setMode_(Modes.VR);\n      break;\n    default:\n      this.setMode_(Modes.NORMAL);\n  }\n\n  // Hook up button listeners.\n  this.button.on('fs', this.onFSClick_.bind(this));\n  this.button.on('vr', this.onVRClick_.bind(this));\n\n  // Bind to fullscreen events.\n  document.addEventListener('webkitfullscreenchange',\n      this.onFullscreenChange_.bind(this));\n  document.addEventListener('mozfullscreenchange',\n      this.onFullscreenChange_.bind(this));\n  document.addEventListener('msfullscreenchange',\n      this.onFullscreenChange_.bind(this));\n\n  // Bind to VR* specific events.\n  window.addEventListener('vrdisplaypresentchange',\n      this.onVRDisplayPresentChange_.bind(this));\n  window.addEventListener('vrdisplaydeviceparamschange',\n      this.onVRDisplayDeviceParamsChange_.bind(this));\n}\n\nWebVRManager.prototype = new Emitter();\n\n// Expose these values externally.\nWebVRManager.Modes = Modes;\n\n/**\n * Promise returns true if there is at least one HMD device available.\n */\nWebVRManager.prototype.getDeviceByType_ = function(type) {\n  return new Promise(function(resolve, reject) {\n    navigator.getVRDisplays().then(function(devices) {\n      // Promise succeeds, but check if there are any devices actually.\n      for (var i = 0; i < devices.length; i++) {\n        if (devices[i] instanceof type) {\n          resolve(devices[i]);\n          break;\n        }\n      }\n      resolve(null);\n    }, function() {\n      // No devices are found.\n      resolve(null);\n    });\n  });\n};\n\nWebVRManager.prototype.render = function(scene, camera, timestamp) {\n  // Scene may be an array of two scenes, one for each eye.\n  if (scene instanceof Array) {\n    this.effect.render(scene[0], camera);\n  } else {\n    this.effect.render(scene, camera);\n  }\n};\n\nWebVRManager.prototype.setMode_ = function(mode) {\n  var oldMode = this.mode;\n  if (mode == this.mode) {\n    console.error('Not changing modes, already in %s', mode);\n    return;\n  }\n  console.log('Mode change: %s => %s', this.mode, mode);\n  this.mode = mode;\n  this.button.setMode(mode, this.isVRCompatible);\n\n  // Emit an event indicating the mode changed.\n  this.emit('modechange', mode, oldMode);\n};\n\n/**\n * Main button was clicked.\n */\nWebVRManager.prototype.onFSClick_ = function() {\n  switch (this.mode) {\n    case Modes.NORMAL:\n      // TODO: Remove this hack if/when iOS gets real fullscreen mode.\n      // If this is an iframe on iOS, break out and open in no_fullscreen mode.\n      if (Util.isIOS() && Util.isIFrame()) {\n        var url = window.location.href;\n        url = Util.appendQueryParameter(url, 'no_fullscreen', 'true');\n        url = Util.appendQueryParameter(url, 'start_mode', Modes.MAGIC_WINDOW);\n        top.location.href = url;\n        return;\n      }\n      this.setMode_(Modes.MAGIC_WINDOW);\n      this.requestFullscreen_();\n      break;\n    case Modes.MAGIC_WINDOW:\n      if (this.isFullscreenDisabled) {\n        window.history.back();\n        return;\n      }\n      this.setMode_(Modes.NORMAL);\n      this.exitFullscreen_();\n      break;\n  }\n};\n\n/**\n * The VR button was clicked.\n */\nWebVRManager.prototype.onVRClick_ = function() {\n  // TODO: Remove this hack when iOS has fullscreen mode.\n  // If this is an iframe on iOS, break out and open in no_fullscreen mode.\n  if (this.mode == Modes.NORMAL && Util.isIOS() && Util.isIFrame()) {\n    var url = window.location.href;\n    url = Util.appendQueryParameter(url, 'no_fullscreen', 'true');\n    url = Util.appendQueryParameter(url, 'start_mode', Modes.VR);\n    top.location.href = url;\n    return;\n  }\n  var presentingDestination = {\n    source: this.renderer.domElement,\n    predistorted: this.isUndistorted\n  }\n  this.hmd.requestPresent(!(window.VRFrameData) ? presentingDestination : [ presentingDestination ]);\n  this.setMode_(Modes.VR);\n};\n\nWebVRManager.prototype.requestFullscreen_ = function(element) {\n  element = element || document.body;\n  if (element.requestFullscreen) {\n    element.requestFullscreen();\n  } else if (element.mozRequestFullScreen) {\n    element.mozRequestFullScreen();\n  } else if (element.webkitRequestFullscreen) {\n    element.webkitRequestFullscreen();\n  } else if (element.msRequestFullscreen) {\n    element.msRequestFullscreen();\n  }\n};\n\nWebVRManager.prototype.exitFullscreen_ = function() {\n  if (document.exitFullscreen) {\n    document.exitFullscreen();\n  } else if (document.mozCancelFullScreen) {\n    document.mozCancelFullScreen();\n  } else if (document.webkitExitFullscreen) {\n    document.webkitExitFullscreen();\n  } else if (document.msExitFullscreen) {\n    document.msExitFullscreen();\n  }\n};\n\nWebVRManager.prototype.onVRDisplayPresentChange_ = function(e) {\n  console.log('onVRDisplayPresentChange_', e);\n  if (this.hmd.isPresenting) {\n    this.setMode_(Modes.VR);\n  } else {\n    this.setMode_(Modes.NORMAL);\n  }\n};\n\nWebVRManager.prototype.onVRDisplayDeviceParamsChange_ = function(e) {\n  console.log('onVRDisplayDeviceParamsChange_', e);\n};\n\nWebVRManager.prototype.onFullscreenChange_ = function(e) {\n  // If we leave full-screen, go back to normal mode.\n  if (document.webkitFullscreenElement === null ||\n      document.mozFullScreenElement === null) {\n    this.setMode_(Modes.NORMAL);\n  }\n};\n\nmodule.exports = WebVRManager;\n\n},{\"./button-manager.js\":1,\"./emitter.js\":2,\"./modes.js\":4,\"./util.js\":5}]},{},[3]);\n"
  },
  {
    "path": "browser/vendor/borismus/webvr-polyfill.js",
    "content": "/**\n * @license\n * webvr-polyfill\n * Copyright (c) 2015-2017 Google\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/**\n * @license\n * wglu-preserve-state.js\n * Copyright (c) 2016, Brandon Jones.\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n\n/******/ (function(modules) { // webpackBootstrap\n/******/  // The module cache\n/******/  var installedModules = {};\n/******/\n/******/  // The require function\n/******/  function __webpack_require__(moduleId) {\n/******/\n/******/    // Check if module is in cache\n/******/    if(installedModules[moduleId]) {\n/******/      return installedModules[moduleId].exports;\n/******/    }\n/******/    // Create a new module (and put it into the cache)\n/******/    var module = installedModules[moduleId] = {\n/******/      i: moduleId,\n/******/      l: false,\n/******/      exports: {}\n/******/    };\n/******/\n/******/    // Execute the module function\n/******/    modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/    // Flag the module as loaded\n/******/    module.l = true;\n/******/\n/******/    // Return the exports of the module\n/******/    return module.exports;\n/******/  }\n/******/\n/******/\n/******/  // expose the modules object (__webpack_modules__)\n/******/  __webpack_require__.m = modules;\n/******/\n/******/  // expose the module cache\n/******/  __webpack_require__.c = installedModules;\n/******/\n/******/  // define getter function for harmony exports\n/******/  __webpack_require__.d = function(exports, name, getter) {\n/******/    if(!__webpack_require__.o(exports, name)) {\n/******/      Object.defineProperty(exports, name, {\n/******/        configurable: false,\n/******/        enumerable: true,\n/******/        get: getter\n/******/      });\n/******/    }\n/******/  };\n/******/\n/******/  // getDefaultExport function for compatibility with non-harmony modules\n/******/  __webpack_require__.n = function(module) {\n/******/    var getter = module && module.__esModule ?\n/******/      function getDefault() { return module['default']; } :\n/******/      function getModuleExports() { return module; };\n/******/    __webpack_require__.d(getter, 'a', getter);\n/******/    return getter;\n/******/  };\n/******/\n/******/  // Object.prototype.hasOwnProperty.call\n/******/  __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/  // __webpack_public_path__\n/******/  __webpack_require__.p = \"\";\n/******/\n/******/  // Load entry module and return exports\n/******/  return __webpack_require__(__webpack_require__.s = 7);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\n/*\n * Copyright 2015 Google Inc. 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\nvar Util = window.Util || {};\n\nUtil.MIN_TIMESTEP = 0.0008;\nUtil.MAX_TIMESTEP = 1;\n\nUtil.base64 = function(mimeType, base64) {\n  return 'data:' + mimeType + ';base64,' + base64;\n};\n\nUtil.clamp = function(value, min, max) {\n  return Math.min(Math.max(min, value), max);\n};\n\nUtil.lerp = function(a, b, t) {\n  return a + ((b - a) * t);\n};\n\n/**\n * Light polyfill for `Promise.race`. Returns\n * a promise that resolves when the first promise\n * provided resolves.\n *\n * @param {Array<Promise>} promises\n */\nUtil.race = function(promises) {\n  if (Promise.race) {\n    return Promise.race(promises);\n  }\n\n  return new Promise(function (resolve, reject) {\n    for (var i = 0; i < promises.length; i++) {\n      promises[i].then(resolve, reject);\n    }\n  });\n};\n\nUtil.isIOS = (function() {\n  var isIOS = /iPad|iPhone|iPod/.test(navigator.platform);\n  return function() {\n    return isIOS;\n  };\n})();\n\nUtil.isWebViewAndroid = (function() {\n  var isWebViewAndroid = navigator.userAgent.indexOf('Version') !== -1 &&\n      navigator.userAgent.indexOf('Android') !== -1 &&\n      navigator.userAgent.indexOf('Chrome') !== -1;\n  return function() {\n    return isWebViewAndroid;\n  };\n})();\n\nUtil.isSafari = (function() {\n  var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n  return function() {\n    return isSafari;\n  };\n})();\n\nUtil.isFirefoxAndroid = (function() {\n  var isFirefoxAndroid = navigator.userAgent.indexOf('Firefox') !== -1 &&\n      navigator.userAgent.indexOf('Android') !== -1;\n  return function() {\n    return isFirefoxAndroid;\n  };\n})();\n\nUtil.isR7 = (function() {\n  var isR7 = navigator.userAgent.indexOf('R7 Build') !== -1;\n  return function() {\n    return isR7;\n  };\n})();\n\nUtil.isLandscapeMode = function() {\n  var rtn = (window.orientation == 90 || window.orientation == -90);\n  return Util.isR7() ? !rtn : rtn;\n};\n\n// Helper method to validate the time steps of sensor timestamps.\nUtil.isTimestampDeltaValid = function(timestampDeltaS) {\n  if (isNaN(timestampDeltaS)) {\n    return false;\n  }\n  if (timestampDeltaS <= Util.MIN_TIMESTEP) {\n    return false;\n  }\n  if (timestampDeltaS > Util.MAX_TIMESTEP) {\n    return false;\n  }\n  return true;\n};\n\nUtil.getScreenWidth = function() {\n  return Math.max(window.screen.width, window.screen.height) *\n      window.devicePixelRatio;\n};\n\nUtil.getScreenHeight = function() {\n  return Math.min(window.screen.width, window.screen.height) *\n      window.devicePixelRatio;\n};\n\nUtil.requestFullscreen = function(element) {\n  if (Util.isWebViewAndroid()) {\n      return false;\n  }\n  if (element.requestFullscreen) {\n    element.requestFullscreen();\n  } else if (element.webkitRequestFullscreen) {\n    element.webkitRequestFullscreen();\n  } else if (element.mozRequestFullScreen) {\n    element.mozRequestFullScreen();\n  } else if (element.msRequestFullscreen) {\n    element.msRequestFullscreen();\n  } else {\n    return false;\n  }\n\n  return true;\n};\n\nUtil.exitFullscreen = function() {\n  if (document.exitFullscreen) {\n    document.exitFullscreen();\n  } else if (document.webkitExitFullscreen) {\n    document.webkitExitFullscreen();\n  } else if (document.mozCancelFullScreen) {\n    document.mozCancelFullScreen();\n  } else if (document.msExitFullscreen) {\n    document.msExitFullscreen();\n  } else {\n    return false;\n  }\n\n  return true;\n};\n\nUtil.getFullscreenElement = function() {\n  return document.fullscreenElement ||\n      document.webkitFullscreenElement ||\n      document.mozFullScreenElement ||\n      document.msFullscreenElement;\n};\n\nUtil.linkProgram = function(gl, vertexSource, fragmentSource, attribLocationMap) {\n  // No error checking for brevity.\n  var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n  gl.shaderSource(vertexShader, vertexSource);\n  gl.compileShader(vertexShader);\n\n  var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n  gl.shaderSource(fragmentShader, fragmentSource);\n  gl.compileShader(fragmentShader);\n\n  var program = gl.createProgram();\n  gl.attachShader(program, vertexShader);\n  gl.attachShader(program, fragmentShader);\n\n  for (var attribName in attribLocationMap)\n    gl.bindAttribLocation(program, attribLocationMap[attribName], attribName);\n\n  gl.linkProgram(program);\n\n  gl.deleteShader(vertexShader);\n  gl.deleteShader(fragmentShader);\n\n  return program;\n};\n\nUtil.getProgramUniforms = function(gl, program) {\n  var uniforms = {};\n  var uniformCount = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n  var uniformName = '';\n  for (var i = 0; i < uniformCount; i++) {\n    var uniformInfo = gl.getActiveUniform(program, i);\n    uniformName = uniformInfo.name.replace('[0]', '');\n    uniforms[uniformName] = gl.getUniformLocation(program, uniformName);\n  }\n  return uniforms;\n};\n\nUtil.orthoMatrix = function (out, left, right, bottom, top, near, far) {\n  var lr = 1 / (left - right),\n      bt = 1 / (bottom - top),\n      nf = 1 / (near - far);\n  out[0] = -2 * lr;\n  out[1] = 0;\n  out[2] = 0;\n  out[3] = 0;\n  out[4] = 0;\n  out[5] = -2 * bt;\n  out[6] = 0;\n  out[7] = 0;\n  out[8] = 0;\n  out[9] = 0;\n  out[10] = 2 * nf;\n  out[11] = 0;\n  out[12] = (left + right) * lr;\n  out[13] = (top + bottom) * bt;\n  out[14] = (far + near) * nf;\n  out[15] = 1;\n  return out;\n};\n\nUtil.copyArray = function (source, dest) {\n  for (var i = 0, n = source.length; i < n; i++) {\n    dest[i] = source[i];\n  }\n};\n\nUtil.isMobile = function() {\n  var check = false;\n  (function(a){if(/(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)||/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)))check = true})(navigator.userAgent||navigator.vendor||window.opera);\n  return check;\n};\n\nUtil.extend = function(dest, src) {\n  for (var key in src) {\n    if (src.hasOwnProperty(key)) {\n      dest[key] = src[key];\n    }\n  }\n\n  return dest;\n}\n\nUtil.safariCssSizeWorkaround = function(canvas) {\n  return  // gm\n\n  // TODO(smus): Remove this workaround when Safari for iOS is fixed.\n  // iOS only workaround (for https://bugs.webkit.org/show_bug.cgi?id=152556).\n  //\n  // \"To the last I grapple with thee;\n  //  from hell's heart I stab at thee;\n  //  for hate's sake I spit my last breath at thee.\"\n  // -- Moby Dick, by Herman Melville\n  if (Util.isIOS()) {\n    var width = canvas.style.width;\n    var height = canvas.style.height;\n    canvas.style.width = (parseInt(width) + 1) + 'px';\n    canvas.style.height = (parseInt(height)) + 'px';\n    setTimeout(function() {\n      canvas.style.width = width;\n      canvas.style.height = height;\n    }, 100);\n  }\n\n  // Debug only.\n  window.Util = Util;\n  window.canvas = canvas;\n};\n\nUtil.isDebug = function() {\n  return Util.getQueryParameter('debug');\n};\n\nUtil.getQueryParameter = function(name) {\n  var name = name.replace(/[\\[]/, \"\\\\[\").replace(/[\\]]/, \"\\\\]\");\n  var regex = new RegExp(\"[\\\\?&]\" + name + \"=([^&#]*)\"),\n      results = regex.exec(location.search);\n  return results === null ? \"\" : decodeURIComponent(results[1].replace(/\\+/g, \" \"));\n};\n\nUtil.frameDataFromPose = (function() {\n  var piOver180 = Math.PI / 180.0;\n  var rad45 = Math.PI * 0.25;\n\n  // Borrowed from glMatrix.\n  function mat4_perspectiveFromFieldOfView(out, fov, near, far) {\n    var upTan = Math.tan(fov ? (fov.upDegrees * piOver180) : rad45),\n    downTan = Math.tan(fov ? (fov.downDegrees * piOver180) : rad45),\n    leftTan = Math.tan(fov ? (fov.leftDegrees * piOver180) : rad45),\n    rightTan = Math.tan(fov ? (fov.rightDegrees * piOver180) : rad45),\n    xScale = 2.0 / (leftTan + rightTan),\n    yScale = 2.0 / (upTan + downTan);\n\n    out[0] = xScale;\n    out[1] = 0.0;\n    out[2] = 0.0;\n    out[3] = 0.0;\n    out[4] = 0.0;\n    out[5] = yScale;\n    out[6] = 0.0;\n    out[7] = 0.0;\n    out[8] = -((leftTan - rightTan) * xScale * 0.5);\n    out[9] = ((upTan - downTan) * yScale * 0.5);\n    out[10] = far / (near - far);\n    out[11] = -1.0;\n    out[12] = 0.0;\n    out[13] = 0.0;\n    out[14] = (far * near) / (near - far);\n    out[15] = 0.0;\n    return out;\n  }\n\n  function mat4_fromRotationTranslation(out, q, v) {\n    // Quaternion math\n    var x = q[0], y = q[1], z = q[2], w = q[3],\n        x2 = x + x,\n        y2 = y + y,\n        z2 = z + z,\n\n        xx = x * x2,\n        xy = x * y2,\n        xz = x * z2,\n        yy = y * y2,\n        yz = y * z2,\n        zz = z * z2,\n        wx = w * x2,\n        wy = w * y2,\n        wz = w * z2;\n\n    out[0] = 1 - (yy + zz);\n    out[1] = xy + wz;\n    out[2] = xz - wy;\n    out[3] = 0;\n    out[4] = xy - wz;\n    out[5] = 1 - (xx + zz);\n    out[6] = yz + wx;\n    out[7] = 0;\n    out[8] = xz + wy;\n    out[9] = yz - wx;\n    out[10] = 1 - (xx + yy);\n    out[11] = 0;\n    out[12] = v[0];\n    out[13] = v[1];\n    out[14] = v[2];\n    out[15] = 1;\n\n    return out;\n  };\n\n  function mat4_translate(out, a, v) {\n    var x = v[0], y = v[1], z = v[2],\n        a00, a01, a02, a03,\n        a10, a11, a12, a13,\n        a20, a21, a22, a23;\n\n    if (a === out) {\n      out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n      out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n      out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n      out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n    } else {\n      a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3];\n      a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7];\n      a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11];\n\n      out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03;\n      out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13;\n      out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23;\n\n      out[12] = a00 * x + a10 * y + a20 * z + a[12];\n      out[13] = a01 * x + a11 * y + a21 * z + a[13];\n      out[14] = a02 * x + a12 * y + a22 * z + a[14];\n      out[15] = a03 * x + a13 * y + a23 * z + a[15];\n    }\n\n    return out;\n  };\n\n  function mat4_invert(out, a) {\n    var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n        a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n        a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n        a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15],\n\n        b00 = a00 * a11 - a01 * a10,\n        b01 = a00 * a12 - a02 * a10,\n        b02 = a00 * a13 - a03 * a10,\n        b03 = a01 * a12 - a02 * a11,\n        b04 = a01 * a13 - a03 * a11,\n        b05 = a02 * a13 - a03 * a12,\n        b06 = a20 * a31 - a21 * a30,\n        b07 = a20 * a32 - a22 * a30,\n        b08 = a20 * a33 - a23 * a30,\n        b09 = a21 * a32 - a22 * a31,\n        b10 = a21 * a33 - a23 * a31,\n        b11 = a22 * a33 - a23 * a32,\n\n        // Calculate the determinant\n        det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n    if (!det) {\n      return null;\n    }\n    det = 1.0 / det;\n\n    out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n    out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n    out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n    out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n    out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n    out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n    out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n    out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n    out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n    out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n    out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n    out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n    out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n    out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n    out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n    out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n\n    return out;\n  };\n\n  var defaultOrientation = new Float32Array([0, 0, 0, 1]);\n  var defaultPosition = new Float32Array([0, 0, 0]);\n\n  function updateEyeMatrices(projection, view, pose, parameters, vrDisplay) {\n    mat4_perspectiveFromFieldOfView(projection, parameters ? parameters.fieldOfView : null, vrDisplay.depthNear, vrDisplay.depthFar);\n\n    var orientation = pose.orientation || defaultOrientation;\n    var position = pose.position || defaultPosition;\n\n    mat4_fromRotationTranslation(view, orientation, position);\n    if (parameters)\n      mat4_translate(view, view, parameters.offset);\n    mat4_invert(view, view);\n  }\n\n  return function(frameData, pose, vrDisplay) {\n    if (!frameData || !pose)\n      return false;\n\n    frameData.pose = pose;\n    frameData.timestamp = pose.timestamp;\n\n    updateEyeMatrices(\n        frameData.leftProjectionMatrix, frameData.leftViewMatrix,\n        pose, vrDisplay.getEyeParameters(\"left\"), vrDisplay);\n    updateEyeMatrices(\n        frameData.rightProjectionMatrix, frameData.rightViewMatrix,\n        pose, vrDisplay.getEyeParameters(\"right\"), vrDisplay);\n\n    return true;\n  };\n})();\n\nUtil.isInsideCrossDomainIFrame = function() {\n  var isFramed = (window.self !== window.top);\n  var refDomain = Util.getDomainFromUrl(document.referrer);\n  var thisDomain = Util.getDomainFromUrl(window.location.href);\n  \n  // gm\n  return isFramed\n  // return isFramed && (refDomain !== thisDomain) ;\n};\n\n// From http://stackoverflow.com/a/23945027.\nUtil.getDomainFromUrl = function(url) {\n  var domain;\n  // Find & remove protocol (http, ftp, etc.) and get domain.\n  if (url.indexOf(\"://\") > -1) {\n    domain = url.split('/')[2];\n  }\n  else {\n    domain = url.split('/')[0];\n  }\n\n  //find & remove port number\n  domain = domain.split(':')[0];\n\n  return domain;\n}\n\nmodule.exports = Util;\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * Copyright 2015 Google Inc. 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\nvar Util = __webpack_require__(0);\nvar WakeLock = __webpack_require__(21);\n\n// Start at a higher number to reduce chance of conflict.\nvar nextDisplayId = 1000;\nvar hasShowDeprecationWarning = false;\n\nvar defaultLeftBounds = [0, 0, 0.5, 1];\nvar defaultRightBounds = [0.5, 0, 0.5, 1];\n\n/**\n * The base class for all VR frame data.\n */\n\nfunction VRFrameData() {\n  this.leftProjectionMatrix = new Float32Array(16);\n  this.leftViewMatrix = new Float32Array(16);\n  this.rightProjectionMatrix = new Float32Array(16);\n  this.rightViewMatrix = new Float32Array(16);\n  this.pose = null;\n};\n\n/**\n * The base class for all VR displays.\n */\nfunction VRDisplay() {\n  this.isPolyfilled = true;\n  this.displayId = nextDisplayId++;\n  this.displayName = 'webvr-polyfill displayName';\n\n  this.depthNear = 0.01;\n  this.depthFar = 10000.0;\n\n  this.isConnected = true;\n  this.isPresenting = false;\n  this.capabilities = {\n    hasPosition: false,\n    hasOrientation: false,\n    hasExternalDisplay: false,\n    canPresent: false,\n    maxLayers: 1\n  };\n  this.stageParameters = null;\n\n  // \"Private\" members.\n  this.waitingForPresent_ = false;\n  this.layer_ = null;\n\n  this.fullscreenElement_ = null;\n  this.fullscreenWrapper_ = null;\n  this.fullscreenElementCachedStyle_ = null;\n\n  this.fullscreenEventTarget_ = null;\n  this.fullscreenChangeHandler_ = null;\n  this.fullscreenErrorHandler_ = null;\n\n  this.wakelock_ = new WakeLock();\n}\n\nVRDisplay.prototype.getFrameData = function(frameData) {\n  // TODO: Technically this should retain it's value for the duration of a frame\n  // but I doubt that's practical to do in javascript.\n  return Util.frameDataFromPose(frameData, this.getPose(), this);\n};\n\nVRDisplay.prototype.getPose = function() {\n  // TODO: Technically this should retain it's value for the duration of a frame\n  // but I doubt that's practical to do in javascript.\n  return this.getImmediatePose();\n};\n\nVRDisplay.prototype.requestAnimationFrame = function(callback) {\n  return window.requestAnimationFrame(callback);\n};\n\nVRDisplay.prototype.cancelAnimationFrame = function(id) {\n  return window.cancelAnimationFrame(id);\n};\n\nVRDisplay.prototype.wrapForFullscreen = function(element) {\n  // Don't wrap in iOS.\n  if (Util.isIOS()) {\n    return element;\n  }\n  if (!this.fullscreenWrapper_) {\n    this.fullscreenWrapper_ = document.createElement('div');\n    var cssProperties = [\n      'height: ' + Math.min(screen.height, screen.width) + 'px !important',\n      'top: 0 !important',\n      'left: 0 !important',\n      'right: 0 !important',\n      'border: 0',\n      'margin: 0',\n      'padding: 0',\n      'z-index: 999999 !important',\n      'position: fixed',\n    ];\n    this.fullscreenWrapper_.setAttribute('style', cssProperties.join('; ') + ';');\n    this.fullscreenWrapper_.classList.add('webvr-polyfill-fullscreen-wrapper');\n  }\n\n  if (this.fullscreenElement_ == element) {\n    return this.fullscreenWrapper_;\n  }\n\n  // Remove any previously applied wrappers\n  this.removeFullscreenWrapper();\n\n  this.fullscreenElement_ = element;\n  var parent = this.fullscreenElement_.parentElement;\n  parent.insertBefore(this.fullscreenWrapper_, this.fullscreenElement_);\n  parent.removeChild(this.fullscreenElement_);\n  this.fullscreenWrapper_.insertBefore(this.fullscreenElement_, this.fullscreenWrapper_.firstChild);\n  this.fullscreenElementCachedStyle_ = this.fullscreenElement_.getAttribute('style');\n\n  var self = this;\n  function applyFullscreenElementStyle() {\n    if (!self.fullscreenElement_) {\n      return;\n    }\n\n    var cssProperties = [\n      'position: absolute',\n      'top: 0',\n      'left: 0',\n      'width: ' + Math.max(screen.width, screen.height) + 'px',\n      'height: ' + Math.min(screen.height, screen.width) + 'px',\n      'border: 0',\n      'margin: 0',\n      'padding: 0',\n    ];\n    self.fullscreenElement_.setAttribute('style', cssProperties.join('; ') + ';');\n  }\n\n  applyFullscreenElementStyle();\n\n  return this.fullscreenWrapper_;\n};\n\nVRDisplay.prototype.removeFullscreenWrapper = function() {\n  if (!this.fullscreenElement_) {\n    return;\n  }\n\n  var element = this.fullscreenElement_;\n  if (this.fullscreenElementCachedStyle_) {\n    element.setAttribute('style', this.fullscreenElementCachedStyle_);\n  } else {\n    element.removeAttribute('style');\n  }\n  this.fullscreenElement_ = null;\n  this.fullscreenElementCachedStyle_ = null;\n\n  var parent = this.fullscreenWrapper_.parentElement;\n  this.fullscreenWrapper_.removeChild(element);\n  parent.insertBefore(element, this.fullscreenWrapper_);\n  parent.removeChild(this.fullscreenWrapper_);\n\n  return element;\n};\n\nVRDisplay.prototype.requestPresent = function(layers) {\n  var wasPresenting = this.isPresenting;\n  var self = this;\n\n  if (!(layers instanceof Array)) {\n    if (!hasShowDeprecationWarning) {\n      console.warn(\"Using a deprecated form of requestPresent. Should pass in an array of VRLayers.\");\n      hasShowDeprecationWarning = true;\n    }\n    layers = [layers];\n  }\n\n  return new Promise(function(resolve, reject) {\n    if (!self.capabilities.canPresent) {\n      reject(new Error('VRDisplay is not capable of presenting.'));\n      return;\n    }\n\n    if (layers.length == 0 || layers.length > self.capabilities.maxLayers) {\n      reject(new Error('Invalid number of layers.'));\n      return;\n    }\n\n    var incomingLayer = layers[0];\n    if (!incomingLayer.source) {\n      /*\n      todo: figure out the correct behavior if the source is not provided.\n      see https://github.com/w3c/webvr/issues/58\n      */\n      resolve();\n      return;\n    }\n\n    var leftBounds = incomingLayer.leftBounds || defaultLeftBounds;\n    var rightBounds = incomingLayer.rightBounds || defaultRightBounds;\n    if (wasPresenting) {\n      // Already presenting, just changing configuration\n      var layer = self.layer_;\n      if (layer.source !== incomingLayer.source) {\n        layer.source = incomingLayer.source;\n      }\n\n      for (var i = 0; i < 4; i++) {\n        layer.leftBounds[i] = leftBounds[i];\n        layer.rightBounds[i] = rightBounds[i];\n      }\n\n      resolve();\n      return;\n    }\n\n    // Was not already presenting.\n    self.layer_ = {\n      predistorted: incomingLayer.predistorted,\n      source: incomingLayer.source,\n      leftBounds: leftBounds.slice(0),\n      rightBounds: rightBounds.slice(0)\n    };\n\n    self.waitingForPresent_ = false;\n    if (self.layer_ && self.layer_.source) {\n      var fullscreenElement = self.wrapForFullscreen(self.layer_.source);\n\n      var onFullscreenChange = function() {\n        var actualFullscreenElement = Util.getFullscreenElement();\n\n        self.isPresenting = (fullscreenElement === actualFullscreenElement);\n        if (self.isPresenting) {\n          if (screen.orientation && screen.orientation.lock) {\n            screen.orientation.lock('landscape-primary').catch(function(error){\n                    console.error('screen.orientation.lock() failed due to', error.message)\n            });\n          }\n          self.waitingForPresent_ = false;\n          self.beginPresent_();\n          resolve();\n        } else {\n          if (screen.orientation && screen.orientation.unlock) {\n            screen.orientation.unlock();\n          }\n          self.removeFullscreenWrapper();\n          self.wakelock_.release();\n          self.endPresent_();\n          self.removeFullscreenListeners_();\n        }\n        self.fireVRDisplayPresentChange_();\n      }\n      var onFullscreenError = function() {\n        if (!self.waitingForPresent_) {\n          return;\n        }\n\n        self.removeFullscreenWrapper();\n        self.removeFullscreenListeners_();\n\n        self.wakelock_.release();\n        self.waitingForPresent_ = false;\n        self.isPresenting = false;\n\n        reject(new Error('Unable to present.'));\n      }\n\n      self.addFullscreenListeners_(fullscreenElement,\n          onFullscreenChange, onFullscreenError);\n\n      if (Util.requestFullscreen(fullscreenElement)) {\n        self.wakelock_.request();\n        self.waitingForPresent_ = true;\n      } else if (Util.isIOS() || Util.isWebViewAndroid()) {\n        // *sigh* Just fake it.\n        self.wakelock_.request();\n        self.isPresenting = true;\n        self.beginPresent_();\n        self.fireVRDisplayPresentChange_();\n        resolve();\n      }\n    }\n\n    if (!self.waitingForPresent_ && !Util.isIOS()) {\n      Util.exitFullscreen();\n      reject(new Error('Unable to present.'));\n    }\n  });\n};\n\nVRDisplay.prototype.exitPresent = function() {\n  var wasPresenting = this.isPresenting;\n  var self = this;\n  this.isPresenting = false;\n  this.layer_ = null;\n  this.wakelock_.release();\n\n  return new Promise(function(resolve, reject) {\n    if (wasPresenting) {\n      if (!Util.exitFullscreen() && Util.isIOS()) {\n        self.endPresent_();\n        self.fireVRDisplayPresentChange_();\n      }\n\n      if (Util.isWebViewAndroid()) {\n        self.removeFullscreenWrapper();\n        self.removeFullscreenListeners_();\n        self.endPresent_();\n        self.fireVRDisplayPresentChange_();\n      }\n\n      resolve();\n    } else {\n      reject(new Error('Was not presenting to VRDisplay.'));\n    }\n  });\n};\n\nVRDisplay.prototype.getLayers = function() {\n  if (this.layer_) {\n    return [this.layer_];\n  }\n  return [];\n};\n\nVRDisplay.prototype.fireVRDisplayPresentChange_ = function() {\n  // Important: unfortunately we cannot have full spec compliance here.\n  // CustomEvent custom fields all go under e.detail (so the VRDisplay ends up\n  // being e.detail.display, instead of e.display as per WebVR spec).\n  var event = new CustomEvent('vrdisplaypresentchange', {detail: {display: this}});\n  window.dispatchEvent(event);\n};\n\nVRDisplay.prototype.fireVRDisplayConnect_ = function() {\n  // Important: unfortunately we cannot have full spec compliance here.\n  // CustomEvent custom fields all go under e.detail (so the VRDisplay ends up\n  // being e.detail.display, instead of e.display as per WebVR spec).\n  var event = new CustomEvent('vrdisplayconnect', {detail: {display: this}});\n  window.dispatchEvent(event);\n};\n\nVRDisplay.prototype.addFullscreenListeners_ = function(element, changeHandler, errorHandler) {\n  this.removeFullscreenListeners_();\n\n  this.fullscreenEventTarget_ = element;\n  this.fullscreenChangeHandler_ = changeHandler;\n  this.fullscreenErrorHandler_ = errorHandler;\n\n  if (changeHandler) {\n    if (document.fullscreenEnabled) {\n      element.addEventListener('fullscreenchange', changeHandler, false);\n    } else if (document.webkitFullscreenEnabled) {\n      element.addEventListener('webkitfullscreenchange', changeHandler, false);\n    } else if (document.mozFullScreenEnabled) {\n      document.addEventListener('mozfullscreenchange', changeHandler, false);\n    } else if (document.msFullscreenEnabled) {\n      element.addEventListener('msfullscreenchange', changeHandler, false);\n    }\n  }\n\n  if (errorHandler) {\n    if (document.fullscreenEnabled) {\n      element.addEventListener('fullscreenerror', errorHandler, false);\n    } else if (document.webkitFullscreenEnabled) {\n      element.addEventListener('webkitfullscreenerror', errorHandler, false);\n    } else if (document.mozFullScreenEnabled) {\n      document.addEventListener('mozfullscreenerror', errorHandler, false);\n    } else if (document.msFullscreenEnabled) {\n      element.addEventListener('msfullscreenerror', errorHandler, false);\n    }\n  }\n};\n\nVRDisplay.prototype.removeFullscreenListeners_ = function() {\n  if (!this.fullscreenEventTarget_)\n    return;\n\n  var element = this.fullscreenEventTarget_;\n\n  if (this.fullscreenChangeHandler_) {\n    var changeHandler = this.fullscreenChangeHandler_;\n    element.removeEventListener('fullscreenchange', changeHandler, false);\n    element.removeEventListener('webkitfullscreenchange', changeHandler, false);\n    document.removeEventListener('mozfullscreenchange', changeHandler, false);\n    element.removeEventListener('msfullscreenchange', changeHandler, false);\n  }\n\n  if (this.fullscreenErrorHandler_) {\n    var errorHandler = this.fullscreenErrorHandler_;\n    element.removeEventListener('fullscreenerror', errorHandler, false);\n    element.removeEventListener('webkitfullscreenerror', errorHandler, false);\n    document.removeEventListener('mozfullscreenerror', errorHandler, false);\n    element.removeEventListener('msfullscreenerror', errorHandler, false);\n  }\n\n  this.fullscreenEventTarget_ = null;\n  this.fullscreenChangeHandler_ = null;\n  this.fullscreenErrorHandler_ = null;\n};\n\nVRDisplay.prototype.beginPresent_ = function() {\n  // Override to add custom behavior when presentation begins.\n};\n\nVRDisplay.prototype.endPresent_ = function() {\n  // Override to add custom behavior when presentation ends.\n};\n\nVRDisplay.prototype.submitFrame = function(pose) {\n  // Override to add custom behavior for frame submission.\n};\n\nVRDisplay.prototype.getEyeParameters = function(whichEye) {\n  // Override to return accurate eye parameters if canPresent is true.\n  return null;\n};\n\n/*\n * Deprecated classes\n */\n\n/**\n * The base class for all VR devices. (Deprecated)\n */\nfunction VRDevice() {\n  this.isPolyfilled = true;\n  this.hardwareUnitId = 'webvr-polyfill hardwareUnitId';\n  this.deviceId = 'webvr-polyfill deviceId';\n  this.deviceName = 'webvr-polyfill deviceName';\n}\n\n/**\n * The base class for all VR HMD devices. (Deprecated)\n */\nfunction HMDVRDevice() {\n}\nHMDVRDevice.prototype = new VRDevice();\n\n/**\n * The base class for all VR position sensor devices. (Deprecated)\n */\nfunction PositionSensorVRDevice() {\n}\nPositionSensorVRDevice.prototype = new VRDevice();\n\nmodule.exports.VRFrameData = VRFrameData;\nmodule.exports.VRDisplay = VRDisplay;\nmodule.exports.VRDevice = VRDevice;\nmodule.exports.HMDVRDevice = HMDVRDevice;\nmodule.exports.PositionSensorVRDevice = PositionSensorVRDevice;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports) {\n\n/*\n * Copyright 2016 Google Inc. 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\nvar MathUtil = window.MathUtil || {};\n\nMathUtil.degToRad = Math.PI / 180;\nMathUtil.radToDeg = 180 / Math.PI;\n\n// Some minimal math functionality borrowed from THREE.Math and stripped down\n// for the purposes of this library.\n\n\nMathUtil.Vector2 = function ( x, y ) {\n  this.x = x || 0;\n  this.y = y || 0;\n};\n\nMathUtil.Vector2.prototype = {\n  constructor: MathUtil.Vector2,\n\n  set: function ( x, y ) {\n    this.x = x;\n    this.y = y;\n\n    return this;\n  },\n\n  copy: function ( v ) {\n    this.x = v.x;\n    this.y = v.y;\n\n    return this;\n  },\n\n  subVectors: function ( a, b ) {\n    this.x = a.x - b.x;\n    this.y = a.y - b.y;\n\n    return this;\n  },\n};\n\nMathUtil.Vector3 = function ( x, y, z ) {\n  this.x = x || 0;\n  this.y = y || 0;\n  this.z = z || 0;\n};\n\nMathUtil.Vector3.prototype = {\n  constructor: MathUtil.Vector3,\n\n  set: function ( x, y, z ) {\n    this.x = x;\n    this.y = y;\n    this.z = z;\n\n    return this;\n  },\n\n  copy: function ( v ) {\n    this.x = v.x;\n    this.y = v.y;\n    this.z = v.z;\n\n    return this;\n  },\n\n  length: function () {\n    return Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n  },\n\n  normalize: function () {\n    var scalar = this.length();\n\n    if ( scalar !== 0 ) {\n      var invScalar = 1 / scalar;\n\n      this.multiplyScalar(invScalar);\n    } else {\n      this.x = 0;\n      this.y = 0;\n      this.z = 0;\n    }\n\n    return this;\n  },\n\n  multiplyScalar: function ( scalar ) {\n    this.x *= scalar;\n    this.y *= scalar;\n    this.z *= scalar;\n  },\n\n  applyQuaternion: function ( q ) {\n    var x = this.x;\n    var y = this.y;\n    var z = this.z;\n\n    var qx = q.x;\n    var qy = q.y;\n    var qz = q.z;\n    var qw = q.w;\n\n    // calculate quat * vector\n    var ix =  qw * x + qy * z - qz * y;\n    var iy =  qw * y + qz * x - qx * z;\n    var iz =  qw * z + qx * y - qy * x;\n    var iw = - qx * x - qy * y - qz * z;\n\n    // calculate result * inverse quat\n    this.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n    this.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n    this.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n    return this;\n  },\n\n  dot: function ( v ) {\n    return this.x * v.x + this.y * v.y + this.z * v.z;\n  },\n\n  crossVectors: function ( a, b ) {\n    var ax = a.x, ay = a.y, az = a.z;\n    var bx = b.x, by = b.y, bz = b.z;\n\n    this.x = ay * bz - az * by;\n    this.y = az * bx - ax * bz;\n    this.z = ax * by - ay * bx;\n\n    return this;\n  },\n};\n\nMathUtil.Quaternion = function ( x, y, z, w ) {\n  this.x = x || 0;\n  this.y = y || 0;\n  this.z = z || 0;\n  this.w = ( w !== undefined ) ? w : 1;\n};\n\nMathUtil.Quaternion.prototype = {\n  constructor: MathUtil.Quaternion,\n\n  set: function ( x, y, z, w ) {\n    this.x = x;\n    this.y = y;\n    this.z = z;\n    this.w = w;\n\n    return this;\n  },\n\n  copy: function ( quaternion ) {\n    this.x = quaternion.x;\n    this.y = quaternion.y;\n    this.z = quaternion.z;\n    this.w = quaternion.w;\n\n    return this;\n  },\n\n  setFromEulerXYZ: function( x, y, z ) {\n    var c1 = Math.cos( x / 2 );\n    var c2 = Math.cos( y / 2 );\n    var c3 = Math.cos( z / 2 );\n    var s1 = Math.sin( x / 2 );\n    var s2 = Math.sin( y / 2 );\n    var s3 = Math.sin( z / 2 );\n\n    this.x = s1 * c2 * c3 + c1 * s2 * s3;\n    this.y = c1 * s2 * c3 - s1 * c2 * s3;\n    this.z = c1 * c2 * s3 + s1 * s2 * c3;\n    this.w = c1 * c2 * c3 - s1 * s2 * s3;\n\n    return this;\n  },\n\n  setFromEulerYXZ: function( x, y, z ) {\n    var c1 = Math.cos( x / 2 );\n    var c2 = Math.cos( y / 2 );\n    var c3 = Math.cos( z / 2 );\n    var s1 = Math.sin( x / 2 );\n    var s2 = Math.sin( y / 2 );\n    var s3 = Math.sin( z / 2 );\n\n    this.x = s1 * c2 * c3 + c1 * s2 * s3;\n    this.y = c1 * s2 * c3 - s1 * c2 * s3;\n    this.z = c1 * c2 * s3 - s1 * s2 * c3;\n    this.w = c1 * c2 * c3 + s1 * s2 * s3;\n\n    return this;\n  },\n\n  setFromAxisAngle: function ( axis, angle ) {\n    // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n    // assumes axis is normalized\n\n    var halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n    this.x = axis.x * s;\n    this.y = axis.y * s;\n    this.z = axis.z * s;\n    this.w = Math.cos( halfAngle );\n\n    return this;\n  },\n\n  multiply: function ( q ) {\n    return this.multiplyQuaternions( this, q );\n  },\n\n  multiplyQuaternions: function ( a, b ) {\n    // from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n    var qax = a.x, qay = a.y, qaz = a.z, qaw = a.w;\n    var qbx = b.x, qby = b.y, qbz = b.z, qbw = b.w;\n\n    this.x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n    this.y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n    this.z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n    this.w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n    return this;\n  },\n\n  inverse: function () {\n    this.x *= -1;\n    this.y *= -1;\n    this.z *= -1;\n\n    this.normalize();\n\n    return this;\n  },\n\n  normalize: function () {\n    var l = Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n    if ( l === 0 ) {\n      this.x = 0;\n      this.y = 0;\n      this.z = 0;\n      this.w = 1;\n    } else {\n      l = 1 / l;\n\n      this.x = this.x * l;\n      this.y = this.y * l;\n      this.z = this.z * l;\n      this.w = this.w * l;\n    }\n\n    return this;\n  },\n\n  slerp: function ( qb, t ) {\n    if ( t === 0 ) return this;\n    if ( t === 1 ) return this.copy( qb );\n\n    var x = this.x, y = this.y, z = this.z, w = this.w;\n\n    // http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n    var cosHalfTheta = w * qb.w + x * qb.x + y * qb.y + z * qb.z;\n\n    if ( cosHalfTheta < 0 ) {\n      this.w = - qb.w;\n      this.x = - qb.x;\n      this.y = - qb.y;\n      this.z = - qb.z;\n\n      cosHalfTheta = - cosHalfTheta;\n    } else {\n      this.copy( qb );\n    }\n\n    if ( cosHalfTheta >= 1.0 ) {\n      this.w = w;\n      this.x = x;\n      this.y = y;\n      this.z = z;\n\n      return this;\n    }\n\n    var halfTheta = Math.acos( cosHalfTheta );\n    var sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n    if ( Math.abs( sinHalfTheta ) < 0.001 ) {\n      this.w = 0.5 * ( w + this.w );\n      this.x = 0.5 * ( x + this.x );\n      this.y = 0.5 * ( y + this.y );\n      this.z = 0.5 * ( z + this.z );\n\n      return this;\n    }\n\n    var ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n    ratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n    this.w = ( w * ratioA + this.w * ratioB );\n    this.x = ( x * ratioA + this.x * ratioB );\n    this.y = ( y * ratioA + this.y * ratioB );\n    this.z = ( z * ratioA + this.z * ratioB );\n\n    return this;\n  },\n\n  setFromUnitVectors: function () {\n    // http://lolengine.net/blog/2014/02/24/quaternion-from-two-vectors-final\n    // assumes direction vectors vFrom and vTo are normalized\n\n    var v1, r;\n    var EPS = 0.000001;\n\n    return function ( vFrom, vTo ) {\n      if ( v1 === undefined ) v1 = new MathUtil.Vector3();\n\n      r = vFrom.dot( vTo ) + 1;\n\n      if ( r < EPS ) {\n        r = 0;\n\n        if ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n          v1.set( - vFrom.y, vFrom.x, 0 );\n        } else {\n          v1.set( 0, - vFrom.z, vFrom.y );\n        }\n      } else {\n        v1.crossVectors( vFrom, vTo );\n      }\n\n      this.x = v1.x;\n      this.y = v1.y;\n      this.z = v1.z;\n      this.w = r;\n\n      this.normalize();\n\n      return this;\n    }\n  }(),\n};\n\nmodule.exports = MathUtil;\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * Copyright 2016 Google Inc. 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\nvar Util = __webpack_require__(0);\nvar WGLUPreserveGLState = __webpack_require__(4);\n\nvar uiVS = [\n  'attribute vec2 position;',\n\n  'uniform mat4 projectionMat;',\n\n  'void main() {',\n  '  gl_Position = projectionMat * vec4( position, -1.0, 1.0 );',\n  '}',\n].join('\\n');\n\nvar uiFS = [\n  'precision mediump float;',\n\n  'uniform vec4 color;',\n\n  'void main() {',\n  '  gl_FragColor = color;',\n  '}',\n].join('\\n');\n\nvar DEG2RAD = Math.PI/180.0;\n\n// The gear has 6 identical sections, each spanning 60 degrees.\nvar kAnglePerGearSection = 60;\n\n// Half-angle of the span of the outer rim.\nvar kOuterRimEndAngle = 12;\n\n// Angle between the middle of the outer rim and the start of the inner rim.\nvar kInnerRimBeginAngle = 20;\n\n// Distance from center to outer rim, normalized so that the entire model\n// fits in a [-1, 1] x [-1, 1] square.\nvar kOuterRadius = 1;\n\n// Distance from center to depressed rim, in model units.\nvar kMiddleRadius = 0.75;\n\n// Radius of the inner hollow circle, in model units.\nvar kInnerRadius = 0.3125;\n\n// Center line thickness in DP.\nvar kCenterLineThicknessDp = 0;\n\n// Button width in DP.\nvar kButtonWidthDp = 28;\n\n// Factor to scale the touch area that responds to the touch.\nvar kTouchSlopFactor = 1.5;\n\nvar Angles = [\n  0, kOuterRimEndAngle, kInnerRimBeginAngle,\n  kAnglePerGearSection - kInnerRimBeginAngle,\n  kAnglePerGearSection - kOuterRimEndAngle\n];\n\n/**\n * Renders the alignment line and \"options\" gear. It is assumed that the canvas\n * this is rendered into covers the entire screen (or close to it.)\n */\nfunction CardboardUI(gl) {\n  this.gl = gl;\n\n  this.attribs = {\n    position: 0\n  };\n  this.program = Util.linkProgram(gl, uiVS, uiFS, this.attribs);\n  this.uniforms = Util.getProgramUniforms(gl, this.program);\n\n  this.vertexBuffer = gl.createBuffer();\n  this.gearOffset = 0;\n  this.gearVertexCount = 0;\n  this.arrowOffset = 0;\n  this.arrowVertexCount = 0;\n\n  this.projMat = new Float32Array(16);\n\n  this.listener = null;\n\n  this.onResize();\n};\n\n/**\n * Tears down all the resources created by the UI renderer.\n */\nCardboardUI.prototype.destroy = function() {\n  var gl = this.gl;\n\n  if (this.listener) {\n    gl.canvas.removeEventListener('click', this.listener, false);\n  }\n\n  gl.deleteProgram(this.program);\n  gl.deleteBuffer(this.vertexBuffer);\n};\n\n/**\n * Adds a listener to clicks on the gear and back icons\n */\nCardboardUI.prototype.listen = function(optionsCallback, backCallback) {\n  var canvas = this.gl.canvas;\n  this.listener = function(event) {\n    var midline = canvas.clientWidth / 2;\n    var buttonSize = kButtonWidthDp * kTouchSlopFactor;\n    // Check to see if the user clicked on (or around) the gear icon\n    if (event.clientX > midline - buttonSize &&\n        event.clientX < midline + buttonSize &&\n        event.clientY > canvas.clientHeight - buttonSize) {\n      optionsCallback(event);\n    }\n    // Check to see if the user clicked on (or around) the back icon\n    else if (event.clientX < buttonSize && event.clientY < buttonSize) {\n      backCallback(event);\n    }\n  };\n  canvas.addEventListener('click', this.listener, false);\n};\n\n/**\n * Builds the UI mesh.\n */\nCardboardUI.prototype.onResize = function() {\n  var gl = this.gl;\n  var self = this;\n\n  var glState = [\n    gl.ARRAY_BUFFER_BINDING\n  ];\n\n  WGLUPreserveGLState(gl, glState, function(gl) {\n    var vertices = [];\n\n    var midline = gl.drawingBufferWidth / 2;\n\n    // The gl buffer size will likely be smaller than the physical pixel count.\n    // So we need to scale the dps down based on the actual buffer size vs physical pixel count.\n    // This will properly size the ui elements no matter what the gl buffer resolution is\n    var physicalPixels = Math.max(screen.width, screen.height) * window.devicePixelRatio;\n    var scalingRatio = gl.drawingBufferWidth / physicalPixels;\n    var dps = scalingRatio *  window.devicePixelRatio;\n\n    var lineWidth = kCenterLineThicknessDp * dps / 2;\n    var buttonSize = kButtonWidthDp * kTouchSlopFactor * dps;\n    var buttonScale = kButtonWidthDp * dps / 2;\n    var buttonBorder = ((kButtonWidthDp * kTouchSlopFactor) - kButtonWidthDp) * dps;\n\n    // Build centerline\n    vertices.push(midline - lineWidth, buttonSize);\n    vertices.push(midline - lineWidth, gl.drawingBufferHeight);\n    vertices.push(midline + lineWidth, buttonSize);\n    vertices.push(midline + lineWidth, gl.drawingBufferHeight);\n\n    // Build gear\n    self.gearOffset = (vertices.length / 2);\n\n    function addGearSegment(theta, r) {\n      var angle = (90 - theta) * DEG2RAD;\n      var x = Math.cos(angle);\n      var y = Math.sin(angle);\n      vertices.push(kInnerRadius * x * buttonScale + midline, kInnerRadius * y * buttonScale + buttonScale);\n      vertices.push(r * x * buttonScale + midline, r * y * buttonScale + buttonScale);\n    }\n\n    for (var i = 0; i <= 6; i++) {\n      var segmentTheta = i * kAnglePerGearSection;\n\n      addGearSegment(segmentTheta, kOuterRadius);\n      addGearSegment(segmentTheta + kOuterRimEndAngle, kOuterRadius);\n      addGearSegment(segmentTheta + kInnerRimBeginAngle, kMiddleRadius);\n      addGearSegment(segmentTheta + (kAnglePerGearSection - kInnerRimBeginAngle), kMiddleRadius);\n      addGearSegment(segmentTheta + (kAnglePerGearSection - kOuterRimEndAngle), kOuterRadius);\n    }\n\n    self.gearVertexCount = (vertices.length / 2) - self.gearOffset;\n\n    // Build back arrow\n    self.arrowOffset = (vertices.length / 2);\n\n    function addArrowVertex(x, y) {\n      vertices.push(buttonBorder + x, gl.drawingBufferHeight - buttonBorder - y);\n    }\n\n    var angledLineWidth = lineWidth / Math.sin(45 * DEG2RAD);\n\n    addArrowVertex(0, buttonScale);\n    addArrowVertex(buttonScale, 0);\n    addArrowVertex(buttonScale + angledLineWidth, angledLineWidth);\n    addArrowVertex(angledLineWidth, buttonScale + angledLineWidth);\n\n    addArrowVertex(angledLineWidth, buttonScale - angledLineWidth);\n    addArrowVertex(0, buttonScale);\n    addArrowVertex(buttonScale, buttonScale * 2);\n    addArrowVertex(buttonScale + angledLineWidth, (buttonScale * 2) - angledLineWidth);\n\n    addArrowVertex(angledLineWidth, buttonScale - angledLineWidth);\n    addArrowVertex(0, buttonScale);\n\n    addArrowVertex(angledLineWidth, buttonScale - lineWidth);\n    addArrowVertex(kButtonWidthDp * dps, buttonScale - lineWidth);\n    addArrowVertex(angledLineWidth, buttonScale + lineWidth);\n    addArrowVertex(kButtonWidthDp * dps, buttonScale + lineWidth);\n\n    self.arrowVertexCount = (vertices.length / 2) - self.arrowOffset;\n\n    // Buffer data\n    gl.bindBuffer(gl.ARRAY_BUFFER, self.vertexBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);\n  });\n};\n\n/**\n * Performs distortion pass on the injected backbuffer, rendering it to the real\n * backbuffer.\n */\nCardboardUI.prototype.render = function() {\n  var gl = this.gl;\n  var self = this;\n\n  var glState = [\n    gl.CULL_FACE,\n    gl.DEPTH_TEST,\n    gl.BLEND,\n    gl.SCISSOR_TEST,\n    gl.STENCIL_TEST,\n    gl.COLOR_WRITEMASK,\n    gl.VIEWPORT,\n\n    gl.CURRENT_PROGRAM,\n    gl.ARRAY_BUFFER_BINDING\n  ];\n\n  WGLUPreserveGLState(gl, glState, function(gl) {\n    // Make sure the GL state is in a good place\n    gl.disable(gl.CULL_FACE);\n    gl.disable(gl.DEPTH_TEST);\n    gl.disable(gl.BLEND);\n    gl.disable(gl.SCISSOR_TEST);\n    gl.disable(gl.STENCIL_TEST);\n    gl.colorMask(true, true, true, true);\n    gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n\n    self.renderNoState();\n  });\n};\n\nCardboardUI.prototype.renderNoState = function() {\n  var gl = this.gl;\n\n  // Bind distortion program and mesh\n  gl.useProgram(this.program);\n\n  gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexBuffer);\n  gl.enableVertexAttribArray(this.attribs.position);\n  gl.vertexAttribPointer(this.attribs.position, 2, gl.FLOAT, false, 8, 0);\n\n  gl.uniform4f(this.uniforms.color, 1.0, 1.0, 1.0, 1.0);\n\n  Util.orthoMatrix(this.projMat, 0, gl.drawingBufferWidth, 0, gl.drawingBufferHeight, 0.1, 1024.0);\n  gl.uniformMatrix4fv(this.uniforms.projectionMat, false, this.projMat);\n\n  // Draws UI element\n  gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);\n  gl.drawArrays(gl.TRIANGLE_STRIP, this.gearOffset, this.gearVertexCount);\n  gl.drawArrays(gl.TRIANGLE_STRIP, this.arrowOffset, this.arrowVertexCount);\n};\n\nmodule.exports = CardboardUI;\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports) {\n\n/**\n * Copyright (c) 2016, Brandon Jones.\n * https://github.com/toji/webgl-utils/blob/master/src/wglu-preserve-state.js\n * LICENSE: https://github.com/toji/webgl-utils/blob/master/LICENSE.md\n */\n\nfunction WGLUPreserveGLState(gl, bindings, callback) {\n  if (!bindings) {\n    callback(gl);\n    return;\n  }\n\n  var boundValues = [];\n\n  var activeTexture = null;\n  for (var i = 0; i < bindings.length; ++i) {\n    var binding = bindings[i];\n    switch (binding) {\n      case gl.TEXTURE_BINDING_2D:\n      case gl.TEXTURE_BINDING_CUBE_MAP:\n        var textureUnit = bindings[++i];\n        if (textureUnit < gl.TEXTURE0 || textureUnit > gl.TEXTURE31) {\n          console.error(\"TEXTURE_BINDING_2D or TEXTURE_BINDING_CUBE_MAP must be followed by a valid texture unit\");\n          boundValues.push(null, null);\n          break;\n        }\n        if (!activeTexture) {\n          activeTexture = gl.getParameter(gl.ACTIVE_TEXTURE);\n        }\n        gl.activeTexture(textureUnit);\n        boundValues.push(gl.getParameter(binding), null);\n        break;\n      case gl.ACTIVE_TEXTURE:\n        activeTexture = gl.getParameter(gl.ACTIVE_TEXTURE);\n        boundValues.push(null);\n        break;\n      default:\n        boundValues.push(gl.getParameter(binding));\n        break;\n    }\n  }\n\n  callback(gl);\n\n  for (var i = 0; i < bindings.length; ++i) {\n    var binding = bindings[i];\n    var boundValue = boundValues[i];\n    switch (binding) {\n      case gl.ACTIVE_TEXTURE:\n        break; // Ignore this binding, since we special-case it to happen last.\n      case gl.ARRAY_BUFFER_BINDING:\n        gl.bindBuffer(gl.ARRAY_BUFFER, boundValue);\n        break;\n      case gl.COLOR_CLEAR_VALUE:\n        gl.clearColor(boundValue[0], boundValue[1], boundValue[2], boundValue[3]);\n        break;\n      case gl.COLOR_WRITEMASK:\n        gl.colorMask(boundValue[0], boundValue[1], boundValue[2], boundValue[3]);\n        break;\n      case gl.CURRENT_PROGRAM:\n        gl.useProgram(boundValue);\n        break;\n      case gl.ELEMENT_ARRAY_BUFFER_BINDING:\n        gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, boundValue);\n        break;\n      case gl.FRAMEBUFFER_BINDING:\n        gl.bindFramebuffer(gl.FRAMEBUFFER, boundValue);\n        break;\n      case gl.RENDERBUFFER_BINDING:\n        gl.bindRenderbuffer(gl.RENDERBUFFER, boundValue);\n        break;\n      case gl.TEXTURE_BINDING_2D:\n        var textureUnit = bindings[++i];\n        if (textureUnit < gl.TEXTURE0 || textureUnit > gl.TEXTURE31)\n          break;\n        gl.activeTexture(textureUnit);\n        gl.bindTexture(gl.TEXTURE_2D, boundValue);\n        break;\n      case gl.TEXTURE_BINDING_CUBE_MAP:\n        var textureUnit = bindings[++i];\n        if (textureUnit < gl.TEXTURE0 || textureUnit > gl.TEXTURE31)\n          break;\n        gl.activeTexture(textureUnit);\n        gl.bindTexture(gl.TEXTURE_CUBE_MAP, boundValue);\n        break;\n      case gl.VIEWPORT:\n        gl.viewport(boundValue[0], boundValue[1], boundValue[2], boundValue[3]);\n        break;\n      case gl.BLEND:\n      case gl.CULL_FACE:\n      case gl.DEPTH_TEST:\n      case gl.SCISSOR_TEST:\n      case gl.STENCIL_TEST:\n        if (boundValue) {\n          gl.enable(binding);\n        } else {\n          gl.disable(binding);\n        }\n        break;\n      default:\n        console.log(\"No GL restore behavior for 0x\" + binding.toString(16));\n        break;\n    }\n\n    if (activeTexture) {\n      gl.activeTexture(activeTexture);\n    }\n  }\n}\n\nmodule.exports = WGLUPreserveGLState;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * Copyright 2015 Google Inc. 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\nvar Distortion = __webpack_require__(11);\nvar MathUtil = __webpack_require__(2);\nvar Util = __webpack_require__(0);\n\nfunction Device(params) {\n  this.width = params.width || Util.getScreenWidth();\n  this.height = params.height || Util.getScreenHeight();\n  this.widthMeters = params.widthMeters;\n  this.heightMeters = params.heightMeters;\n  this.bevelMeters = params.bevelMeters;\n}\n\n\n// Fallback Android device (based on Nexus 5 measurements) for use when\n// we can't recognize an Android device.\nvar DEFAULT_ANDROID = new Device({\n  widthMeters: 0.110,\n  heightMeters: 0.062,\n  bevelMeters: 0.004\n});\n\n// Fallback iOS device (based on iPhone6) for use when\n// we can't recognize an Android device.\nvar DEFAULT_IOS = new Device({\n  widthMeters: 0.1038,\n  heightMeters: 0.0584,\n  bevelMeters: 0.004\n});\n\n\nvar Viewers = {\n  CardboardV1: new CardboardViewer({\n    id: 'CardboardV1',\n    label: 'Cardboard I/O 2014',\n    fov: 40,\n    interLensDistance: 0.060,\n    baselineLensDistance: 0.035,\n    screenLensDistance: 0.042,\n    distortionCoefficients: [0.441, 0.156],\n    inverseCoefficients: [-0.4410035, 0.42756155, -0.4804439, 0.5460139,\n      -0.58821183, 0.5733938, -0.48303202, 0.33299083, -0.17573841,\n      0.0651772, -0.01488963, 0.001559834]\n  }),\n  CardboardV2: new CardboardViewer({\n    id: 'CardboardV2',\n    label: 'Cardboard I/O 2015',\n    fov: 60,\n    interLensDistance: 0.064,\n    baselineLensDistance: 0.035,\n    screenLensDistance: 0.039,\n    distortionCoefficients: [0.34, 0.55],\n    inverseCoefficients: [-0.33836704, -0.18162185, 0.862655, -1.2462051,\n      1.0560602, -0.58208317, 0.21609078, -0.05444823, 0.009177956,\n      -9.904169E-4, 6.183535E-5, -1.6981803E-6]\n  })\n};\n\n\nvar DEFAULT_LEFT_CENTER = {x: 0.5, y: 0.5};\nvar DEFAULT_RIGHT_CENTER = {x: 0.5, y: 0.5};\n\n/**\n * Manages information about the device and the viewer.\n *\n * deviceParams indicates the parameters of the device to use (generally\n * obtained from dpdb.getDeviceParams()). Can be null to mean no device\n * params were found.\n */\nfunction DeviceInfo(deviceParams) {\n  this.viewer = Viewers.CardboardV2;\n  this.updateDeviceParams(deviceParams);\n  this.distortion = new Distortion(this.viewer.distortionCoefficients);\n}\n\nDeviceInfo.prototype.updateDeviceParams = function(deviceParams) {\n  this.device = this.determineDevice_(deviceParams) || this.device;\n};\n\nDeviceInfo.prototype.getDevice = function() {\n  return this.device;\n};\n\nDeviceInfo.prototype.setViewer = function(viewer) {\n  this.viewer = viewer;\n  this.distortion = new Distortion(this.viewer.distortionCoefficients);\n};\n\nDeviceInfo.prototype.determineDevice_ = function(deviceParams) {\n  if (!deviceParams) {\n    // No parameters, so use a default.\n    if (Util.isIOS()) {\n      console.warn('Using fallback iOS device measurements.');\n      return DEFAULT_IOS;\n    } else {\n      console.warn('Using fallback Android device measurements.');\n      return DEFAULT_ANDROID;\n    }\n  }\n\n  // Compute device screen dimensions based on deviceParams.\n  var METERS_PER_INCH = 0.0254;\n  var metersPerPixelX = METERS_PER_INCH / deviceParams.xdpi;\n  var metersPerPixelY = METERS_PER_INCH / deviceParams.ydpi;\n  var width = Util.getScreenWidth();\n  var height = Util.getScreenHeight();\n  return new Device({\n    widthMeters: metersPerPixelX * width,\n    heightMeters: metersPerPixelY * height,\n    bevelMeters: deviceParams.bevelMm * 0.001,\n  });\n};\n\n/**\n * Calculates field of view for the left eye.\n */\nDeviceInfo.prototype.getDistortedFieldOfViewLeftEye = function() {\n  var viewer = this.viewer;\n  var device = this.device;\n  var distortion = this.distortion;\n\n  // Device.height and device.width for device in portrait mode, so transpose.\n  var eyeToScreenDistance = viewer.screenLensDistance;\n\n  var outerDist = (device.widthMeters - viewer.interLensDistance) / 2;\n  var innerDist = viewer.interLensDistance / 2;\n  var bottomDist = viewer.baselineLensDistance - device.bevelMeters;\n  var topDist = device.heightMeters - bottomDist;\n\n  var outerAngle = MathUtil.radToDeg * Math.atan(\n      distortion.distort(outerDist / eyeToScreenDistance));\n  var innerAngle = MathUtil.radToDeg * Math.atan(\n      distortion.distort(innerDist / eyeToScreenDistance));\n  var bottomAngle = MathUtil.radToDeg * Math.atan(\n      distortion.distort(bottomDist / eyeToScreenDistance));\n  var topAngle = MathUtil.radToDeg * Math.atan(\n      distortion.distort(topDist / eyeToScreenDistance));\n\n  return {\n    leftDegrees: Math.min(outerAngle, viewer.fov),\n    rightDegrees: Math.min(innerAngle, viewer.fov),\n    downDegrees: Math.min(bottomAngle, viewer.fov),\n    upDegrees: Math.min(topAngle, viewer.fov)\n  };\n};\n\n/**\n * Calculates the tan-angles from the maximum FOV for the left eye for the\n * current device and screen parameters.\n */\nDeviceInfo.prototype.getLeftEyeVisibleTanAngles = function() {\n  var viewer = this.viewer;\n  var device = this.device;\n  var distortion = this.distortion;\n\n  // Tan-angles from the max FOV.\n  var fovLeft = Math.tan(-MathUtil.degToRad * viewer.fov);\n  var fovTop = Math.tan(MathUtil.degToRad * viewer.fov);\n  var fovRight = Math.tan(MathUtil.degToRad * viewer.fov);\n  var fovBottom = Math.tan(-MathUtil.degToRad * viewer.fov);\n  // Viewport size.\n  var halfWidth = device.widthMeters / 4;\n  var halfHeight = device.heightMeters / 2;\n  // Viewport center, measured from left lens position.\n  var verticalLensOffset = (viewer.baselineLensDistance - device.bevelMeters - halfHeight);\n  var centerX = viewer.interLensDistance / 2 - halfWidth;\n  var centerY = -verticalLensOffset;\n  var centerZ = viewer.screenLensDistance;\n  // Tan-angles of the viewport edges, as seen through the lens.\n  var screenLeft = distortion.distort((centerX - halfWidth) / centerZ);\n  var screenTop = distortion.distort((centerY + halfHeight) / centerZ);\n  var screenRight = distortion.distort((centerX + halfWidth) / centerZ);\n  var screenBottom = distortion.distort((centerY - halfHeight) / centerZ);\n  // Compare the two sets of tan-angles and take the value closer to zero on each side.\n  var result = new Float32Array(4);\n  result[0] = Math.max(fovLeft, screenLeft);\n  result[1] = Math.min(fovTop, screenTop);\n  result[2] = Math.min(fovRight, screenRight);\n  result[3] = Math.max(fovBottom, screenBottom);\n  return result;\n};\n\n/**\n * Calculates the tan-angles from the maximum FOV for the left eye for the\n * current device and screen parameters, assuming no lenses.\n */\nDeviceInfo.prototype.getLeftEyeNoLensTanAngles = function() {\n  var viewer = this.viewer;\n  var device = this.device;\n  var distortion = this.distortion;\n\n  var result = new Float32Array(4);\n  // Tan-angles from the max FOV.\n  var fovLeft = distortion.distortInverse(Math.tan(-MathUtil.degToRad * viewer.fov));\n  var fovTop = distortion.distortInverse(Math.tan(MathUtil.degToRad * viewer.fov));\n  var fovRight = distortion.distortInverse(Math.tan(MathUtil.degToRad * viewer.fov));\n  var fovBottom = distortion.distortInverse(Math.tan(-MathUtil.degToRad * viewer.fov));\n  // Viewport size.\n  var halfWidth = device.widthMeters / 4;\n  var halfHeight = device.heightMeters / 2;\n  // Viewport center, measured from left lens position.\n  var verticalLensOffset = (viewer.baselineLensDistance - device.bevelMeters - halfHeight);\n  var centerX = viewer.interLensDistance / 2 - halfWidth;\n  var centerY = -verticalLensOffset;\n  var centerZ = viewer.screenLensDistance;\n  // Tan-angles of the viewport edges, as seen through the lens.\n  var screenLeft = (centerX - halfWidth) / centerZ;\n  var screenTop = (centerY + halfHeight) / centerZ;\n  var screenRight = (centerX + halfWidth) / centerZ;\n  var screenBottom = (centerY - halfHeight) / centerZ;\n  // Compare the two sets of tan-angles and take the value closer to zero on each side.\n  result[0] = Math.max(fovLeft, screenLeft);\n  result[1] = Math.min(fovTop, screenTop);\n  result[2] = Math.min(fovRight, screenRight);\n  result[3] = Math.max(fovBottom, screenBottom);\n  return result;\n};\n\n/**\n * Calculates the screen rectangle visible from the left eye for the\n * current device and screen parameters.\n */\nDeviceInfo.prototype.getLeftEyeVisibleScreenRect = function(undistortedFrustum) {\n  var viewer = this.viewer;\n  var device = this.device;\n\n  var dist = viewer.screenLensDistance;\n  var eyeX = (device.widthMeters - viewer.interLensDistance) / 2;\n  var eyeY = viewer.baselineLensDistance - device.bevelMeters;\n  var left = (undistortedFrustum[0] * dist + eyeX) / device.widthMeters;\n  var top = (undistortedFrustum[1] * dist + eyeY) / device.heightMeters;\n  var right = (undistortedFrustum[2] * dist + eyeX) / device.widthMeters;\n  var bottom = (undistortedFrustum[3] * dist + eyeY) / device.heightMeters;\n  return {\n    x: left,\n    y: bottom,\n    width: right - left,\n    height: top - bottom\n  };\n};\n\nDeviceInfo.prototype.getFieldOfViewLeftEye = function(opt_isUndistorted) {\n  return opt_isUndistorted ? this.getUndistortedFieldOfViewLeftEye() :\n      this.getDistortedFieldOfViewLeftEye();\n};\n\nDeviceInfo.prototype.getFieldOfViewRightEye = function(opt_isUndistorted) {\n  var fov = this.getFieldOfViewLeftEye(opt_isUndistorted);\n  return {\n    leftDegrees: fov.rightDegrees,\n    rightDegrees: fov.leftDegrees,\n    upDegrees: fov.upDegrees,\n    downDegrees: fov.downDegrees\n  };\n};\n\n/**\n * Calculates undistorted field of view for the left eye.\n */\nDeviceInfo.prototype.getUndistortedFieldOfViewLeftEye = function() {\n  var p = this.getUndistortedParams_();\n\n  return {\n    leftDegrees: MathUtil.radToDeg * Math.atan(p.outerDist),\n    rightDegrees: MathUtil.radToDeg * Math.atan(p.innerDist),\n    downDegrees: MathUtil.radToDeg * Math.atan(p.bottomDist),\n    upDegrees: MathUtil.radToDeg * Math.atan(p.topDist)\n  };\n};\n\nDeviceInfo.prototype.getUndistortedViewportLeftEye = function() {\n  var p = this.getUndistortedParams_();\n  var viewer = this.viewer;\n  var device = this.device;\n\n  // Distances stored in local variables are in tan-angle units unless otherwise\n  // noted.\n  var eyeToScreenDistance = viewer.screenLensDistance;\n  var screenWidth = device.widthMeters / eyeToScreenDistance;\n  var screenHeight = device.heightMeters / eyeToScreenDistance;\n  var xPxPerTanAngle = device.width / screenWidth;\n  var yPxPerTanAngle = device.height / screenHeight;\n\n  var x = Math.round((p.eyePosX - p.outerDist) * xPxPerTanAngle);\n  var y = Math.round((p.eyePosY - p.bottomDist) * yPxPerTanAngle);\n  return {\n    x: x,\n    y: y,\n    width: Math.round((p.eyePosX + p.innerDist) * xPxPerTanAngle) - x,\n    height: Math.round((p.eyePosY + p.topDist) * yPxPerTanAngle) - y\n  };\n};\n\nDeviceInfo.prototype.getUndistortedParams_ = function() {\n  var viewer = this.viewer;\n  var device = this.device;\n  var distortion = this.distortion;\n\n  // Most of these variables in tan-angle units.\n  var eyeToScreenDistance = viewer.screenLensDistance;\n  var halfLensDistance = viewer.interLensDistance / 2 / eyeToScreenDistance;\n  var screenWidth = device.widthMeters / eyeToScreenDistance;\n  var screenHeight = device.heightMeters / eyeToScreenDistance;\n\n  var eyePosX = screenWidth / 2 - halfLensDistance;\n  var eyePosY = (viewer.baselineLensDistance - device.bevelMeters) / eyeToScreenDistance;\n\n  var maxFov = viewer.fov;\n  var viewerMax = distortion.distortInverse(Math.tan(MathUtil.degToRad * maxFov));\n  var outerDist = Math.min(eyePosX, viewerMax);\n  var innerDist = Math.min(halfLensDistance, viewerMax);\n  var bottomDist = Math.min(eyePosY, viewerMax);\n  var topDist = Math.min(screenHeight - eyePosY, viewerMax);\n\n  return {\n    outerDist: outerDist,\n    innerDist: innerDist,\n    topDist: topDist,\n    bottomDist: bottomDist,\n    eyePosX: eyePosX,\n    eyePosY: eyePosY\n  };\n};\n\n\nfunction CardboardViewer(params) {\n  // A machine readable ID.\n  this.id = params.id;\n  // A human readable label.\n  this.label = params.label;\n\n  // Field of view in degrees (per side).\n  this.fov = params.fov;\n\n  // Distance between lens centers in meters.\n  this.interLensDistance = params.interLensDistance;\n  // Distance between viewer baseline and lens center in meters.\n  this.baselineLensDistance = params.baselineLensDistance;\n  // Screen-to-lens distance in meters.\n  this.screenLensDistance = params.screenLensDistance;\n\n  // Distortion coefficients.\n  this.distortionCoefficients = params.distortionCoefficients;\n  // Inverse distortion coefficients.\n  // TODO: Calculate these from distortionCoefficients in the future.\n  this.inverseCoefficients = params.inverseCoefficients;\n}\n\n// Export viewer information.\nDeviceInfo.Viewers = Viewers;\nmodule.exports = DeviceInfo;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * Copyright 2016 Google Inc. 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 */\nvar VRDisplay = __webpack_require__(1).VRDisplay;\nvar HMDVRDevice = __webpack_require__(1).HMDVRDevice;\nvar PositionSensorVRDevice = __webpack_require__(1).PositionSensorVRDevice;\n\n/**\n * Wraps a VRDisplay and exposes it as a HMDVRDevice\n */\nfunction VRDisplayHMDDevice(display) {\n  this.display = display;\n\n  this.hardwareUnitId = display.displayId;\n  this.deviceId = 'webvr-polyfill:HMD:' + display.displayId;\n  this.deviceName = display.displayName + ' (HMD)';\n}\nVRDisplayHMDDevice.prototype = new HMDVRDevice();\n\nVRDisplayHMDDevice.prototype.getEyeParameters = function(whichEye) {\n  var eyeParameters = this.display.getEyeParameters(whichEye);\n\n  return {\n    currentFieldOfView: eyeParameters.fieldOfView,\n    maximumFieldOfView: eyeParameters.fieldOfView,\n    minimumFieldOfView: eyeParameters.fieldOfView,\n    recommendedFieldOfView: eyeParameters.fieldOfView,\n    eyeTranslation: { x: eyeParameters.offset[0], y: eyeParameters.offset[1], z: eyeParameters.offset[2] },\n    renderRect: {\n      x: (whichEye == 'right') ? eyeParameters.renderWidth : 0,\n      y: 0,\n      width: eyeParameters.renderWidth,\n      height: eyeParameters.renderHeight\n    }\n  };\n};\n\nVRDisplayHMDDevice.prototype.setFieldOfView =\n    function(opt_fovLeft, opt_fovRight, opt_zNear, opt_zFar) {\n  // Not supported. getEyeParameters reports that the min, max, and recommended\n  // FoV is all the same, so no adjustment can be made.\n};\n\n// TODO: Need to hook requestFullscreen to see if a wrapped VRDisplay was passed\n// in as an option. If so we should prevent the default fullscreen behavior and\n// call VRDisplay.requestPresent instead.\n\n/**\n * Wraps a VRDisplay and exposes it as a PositionSensorVRDevice\n */\nfunction VRDisplayPositionSensorDevice(display) {\n  this.display = display;\n\n  this.hardwareUnitId = display.displayId;\n  this.deviceId = 'webvr-polyfill:PositionSensor: ' + display.displayId;\n  this.deviceName = display.displayName + ' (PositionSensor)';\n}\nVRDisplayPositionSensorDevice.prototype = new PositionSensorVRDevice();\n\nVRDisplayPositionSensorDevice.prototype.getState = function() {\n  var pose = this.display.getPose();\n  return {\n    position: pose.position ? { x: pose.position[0], y: pose.position[1], z: pose.position[2] } : null,\n    orientation: pose.orientation ? { x: pose.orientation[0], y: pose.orientation[1], z: pose.orientation[2], w: pose.orientation[3] } : null,\n    linearVelocity: null,\n    linearAcceleration: null,\n    angularVelocity: null,\n    angularAcceleration: null\n  };\n};\n\nVRDisplayPositionSensorDevice.prototype.resetState = function() {\n  return this.positionDevice.resetPose();\n};\n\n\nmodule.exports.VRDisplayHMDDevice = VRDisplayHMDDevice;\nmodule.exports.VRDisplayPositionSensorDevice = VRDisplayPositionSensorDevice;\n\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * Copyright 2015 Google Inc. 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 */\nvar Util = __webpack_require__(0);\nvar WebVRPolyfill = __webpack_require__(8).WebVRPolyfill;\n\n// Initialize a WebVRConfig just in case.\nwindow.WebVRConfig = Util.extend({\n  // Forces availability of VR mode, even for non-mobile devices.\n  FORCE_ENABLE_VR: false,\n\n  // Complementary filter coefficient. 0 for accelerometer, 1 for gyro.\n  K_FILTER: 0.98,\n\n  // How far into the future to predict during fast motion (in seconds).\n  PREDICTION_TIME_S: 0.040,\n\n  // Flag to enable touch panner. In case you have your own touch controls.\n  TOUCH_PANNER_DISABLED: true,\n\n  // Flag to disabled the UI in VR Mode.\n  CARDBOARD_UI_DISABLED: false, // Default: false\n\n  // Flag to disable the instructions to rotate your device.\n  ROTATE_INSTRUCTIONS_DISABLED: false, // Default: false.\n\n  // Enable yaw panning only, disabling roll and pitch. This can be useful\n  // for panoramas with nothing interesting above or below.\n  YAW_ONLY: false,\n\n  // To disable keyboard and mouse controls, if you want to use your own\n  // implementation.\n  MOUSE_KEYBOARD_CONTROLS_DISABLED: false,\n\n  // Prevent the polyfill from initializing immediately. Requires the app\n  // to call InitializeWebVRPolyfill() before it can be used.\n  DEFER_INITIALIZATION: false,\n\n  // Enable the deprecated version of the API (navigator.getVRDevices).\n  ENABLE_DEPRECATED_API: false,\n\n  // Scales the recommended buffer size reported by WebVR, which can improve\n  // performance.\n  // UPDATE(2016-05-03): Setting this to 0.5 by default since 1.0 does not\n  // perform well on many mobile devices.\n  BUFFER_SCALE: 0.5,\n\n  // Allow VRDisplay.submitFrame to change gl bindings, which is more\n  // efficient if the application code will re-bind its resources on the\n  // next frame anyway. This has been seen to cause rendering glitches with\n  // THREE.js.\n  // Dirty bindings include: gl.FRAMEBUFFER_BINDING, gl.CURRENT_PROGRAM,\n  // gl.ARRAY_BUFFER_BINDING, gl.ELEMENT_ARRAY_BUFFER_BINDING,\n  // and gl.TEXTURE_BINDING_2D for texture unit 0.\n  DIRTY_SUBMIT_FRAME_BINDINGS: false,\n\n  // When set to true, this will cause a polyfilled VRDisplay to always be\n  // appended to the list returned by navigator.getVRDisplays(), even if that\n  // list includes a native VRDisplay.\n  ALWAYS_APPEND_POLYFILL_DISPLAY: false,\n\n  // There are versions of Chrome (M58-M60?) where the native WebVR API exists,\n  // and instead of returning 0 VR displays when none are detected,\n  // `navigator.getVRDisplays()`'s promise never resolves. This results\n  // in the polyfill hanging and not being able to provide fallback\n  // displays, so set a timeout in milliseconds to stop waiting for a response\n  // and just use polyfilled displays.\n  // https://bugs.chromium.org/p/chromium/issues/detail?id=727969\n  GET_VR_DISPLAYS_TIMEOUT: 1000,\n}, window.WebVRConfig);\n\nif (!window.WebVRConfig.DEFER_INITIALIZATION) {\n  window._webVRPolyfill = new WebVRPolyfill();\n} else {\n  window.InitializeWebVRPolyfill = function() {\n    window._webVRPolyfill = new WebVRPolyfill();\n  }\n}\n\nwindow.WebVRPolyfill = WebVRPolyfill;\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * Copyright 2015 Google Inc. 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\nvar Util = __webpack_require__(0);\nvar CardboardVRDisplay = __webpack_require__(9);\nvar MouseKeyboardVRDisplay = __webpack_require__(22);\n// Uncomment to add positional tracking via webcam.\n//var WebcamPositionSensorVRDevice = require('./webcam-position-sensor-vr-device.js');\nvar VRDisplay = __webpack_require__(1).VRDisplay;\nvar VRFrameData = __webpack_require__(1).VRFrameData;\nvar HMDVRDevice = __webpack_require__(1).HMDVRDevice;\nvar PositionSensorVRDevice = __webpack_require__(1).PositionSensorVRDevice;\nvar VRDisplayHMDDevice = __webpack_require__(6).VRDisplayHMDDevice;\nvar VRDisplayPositionSensorDevice = __webpack_require__(6).VRDisplayPositionSensorDevice;\nvar version = __webpack_require__(23).version;\n\nfunction WebVRPolyfill() {\n  this.displays = [];\n  this.devices = []; // For deprecated objects\n  this.devicesPopulated = false;\n  this.nativeWebVRAvailable = this.isWebVRAvailable();\n  this.nativeLegacyWebVRAvailable = this.isDeprecatedWebVRAvailable();\n  this.nativeGetVRDisplaysFunc = this.nativeWebVRAvailable ?\n                                 navigator.getVRDisplays :\n                                 null;\n\n  if (!this.nativeLegacyWebVRAvailable && !this.nativeWebVRAvailable) {\n    this.enablePolyfill();\n    if (window.WebVRConfig.ENABLE_DEPRECATED_API) {\n      this.enableDeprecatedPolyfill();\n    }\n  }\n\n  // Put a shim in place to update the API to 1.1 if needed.\n  InstallWebVRSpecShim();\n}\n\nWebVRPolyfill.prototype.isWebVRAvailable = function() {\n  return ('getVRDisplays' in navigator);\n};\n\nWebVRPolyfill.prototype.isDeprecatedWebVRAvailable = function() {\n  return ('getVRDevices' in navigator) || ('mozGetVRDevices' in navigator);\n};\n\nWebVRPolyfill.prototype.connectDisplay = function(vrDisplay) {\n  vrDisplay.fireVRDisplayConnect_();\n  this.displays.push(vrDisplay);\n};\n\nWebVRPolyfill.prototype.populateDevices = function() {\n  if (this.devicesPopulated) {\n    return;\n  }\n\n  // Initialize our virtual VR devices.\n  var vrDisplay = null;\n\n  // Add a Cardboard VRDisplay on compatible mobile devices\n  if (this.isCardboardCompatible()) {\n    vrDisplay = new CardboardVRDisplay();\n\n    this.connectDisplay(vrDisplay);\n\n    // For backwards compatibility\n    if (window.WebVRConfig.ENABLE_DEPRECATED_API) {\n      this.devices.push(new VRDisplayHMDDevice(vrDisplay));\n      this.devices.push(new VRDisplayPositionSensorDevice(vrDisplay));\n    }\n  }\n\n  // Add a Mouse and Keyboard driven VRDisplay for desktops/laptops\n  if (!this.isMobile() && !window.WebVRConfig.MOUSE_KEYBOARD_CONTROLS_DISABLED) {\n    vrDisplay = new MouseKeyboardVRDisplay();\n    this.connectDisplay(vrDisplay);\n\n    // For backwards compatibility\n    if (window.WebVRConfig.ENABLE_DEPRECATED_API) {\n      this.devices.push(new VRDisplayHMDDevice(vrDisplay));\n      this.devices.push(new VRDisplayPositionSensorDevice(vrDisplay));\n    }\n  }\n\n  // Uncomment to add positional tracking via webcam.\n  //if (!this.isMobile() && window.WebVRConfig.ENABLE_DEPRECATED_API) {\n  //  positionDevice = new WebcamPositionSensorVRDevice();\n  //  this.devices.push(positionDevice);\n  //}\n\n  this.devicesPopulated = true;\n};\n\nWebVRPolyfill.prototype.enablePolyfill = function() {\n  // Provide navigator.getVRDisplays.\n  navigator.getVRDisplays = this.getVRDisplays.bind(this);\n\n  // Polyfill native VRDisplay.getFrameData\n  if (this.nativeWebVRAvailable && window.VRFrameData) {\n    var NativeVRFrameData = window.VRFrameData;\n    var nativeFrameData = new window.VRFrameData();\n    var nativeGetFrameData = window.VRDisplay.prototype.getFrameData;\n    window.VRFrameData = VRFrameData;\n\n    window.VRDisplay.prototype.getFrameData = function(frameData) {\n      if (frameData instanceof NativeVRFrameData) {\n        nativeGetFrameData.call(this, frameData);\n        return;\n      }\n\n      /*\n      Copy frame data from the native object into the polyfilled object.\n      */\n\n      nativeGetFrameData.call(this, nativeFrameData);\n      frameData.pose = nativeFrameData.pose;\n      Util.copyArray(nativeFrameData.leftProjectionMatrix, frameData.leftProjectionMatrix);\n      Util.copyArray(nativeFrameData.rightProjectionMatrix, frameData.rightProjectionMatrix);\n      Util.copyArray(nativeFrameData.leftViewMatrix, frameData.leftViewMatrix);\n      Util.copyArray(nativeFrameData.rightViewMatrix, frameData.rightViewMatrix);\n      //todo: copy\n    };\n  }\n\n  // Provide the `VRDisplay` object.\n  window.VRDisplay = VRDisplay;\n\n  // Provide the `navigator.vrEnabled` property.\n  if (navigator && typeof navigator.vrEnabled === 'undefined') {\n    var self = this;\n    Object.defineProperty(navigator, 'vrEnabled', {\n      get: function () {\n        return self.isCardboardCompatible() &&\n            (self.isFullScreenAvailable() || Util.isIOS());\n      }\n    });\n  }\n\n  if (!('VRFrameData' in window)) {\n    // Provide the VRFrameData object.\n    window.VRFrameData = VRFrameData;\n  }\n};\n\nWebVRPolyfill.prototype.enableDeprecatedPolyfill = function() {\n  // Provide navigator.getVRDevices.\n  navigator.getVRDevices = this.getVRDevices.bind(this);\n\n  // Provide the CardboardHMDVRDevice and PositionSensorVRDevice objects.\n  window.HMDVRDevice = HMDVRDevice;\n  window.PositionSensorVRDevice = PositionSensorVRDevice;\n};\n\nWebVRPolyfill.prototype.getVRDisplays = function() {\n  this.populateDevices();\n  var polyfillDisplays = this.displays;\n\n  if (!this.nativeWebVRAvailable) {\n    return Promise.resolve(polyfillDisplays);\n  }\n\n  // Set up a race condition if this browser has a bug where\n  // `navigator.getVRDisplays()` never resolves.\n  var timeoutId;\n  var vrDisplaysNative = this.nativeGetVRDisplaysFunc.call(navigator);\n  var timeoutPromise = new Promise(function(resolve) {\n    timeoutId = setTimeout(function() {\n      console.warn('Native WebVR implementation detected, but `getVRDisplays()` failed to resolve. Falling back to polyfill.');\n      resolve([]);\n    }, window.WebVRConfig.GET_VR_DISPLAYS_TIMEOUT);\n  });\n\n  return Util.race([\n    vrDisplaysNative,\n    timeoutPromise\n  ]).then(function(nativeDisplays) {\n    clearTimeout(timeoutId);\n    if (window.WebVRConfig.ALWAYS_APPEND_POLYFILL_DISPLAY) {\n      return nativeDisplays.concat(polyfillDisplays);\n    } else {\n      return nativeDisplays.length > 0 ? nativeDisplays : polyfillDisplays;\n    }\n  });\n};\n\nWebVRPolyfill.prototype.getVRDevices = function() {\n  console.warn('getVRDevices is deprecated. Please update your code to use getVRDisplays instead.');\n  var self = this;\n  return new Promise(function(resolve, reject) {\n    try {\n      if (!self.devicesPopulated) {\n        if (self.nativeWebVRAvailable) {\n          return navigator.getVRDisplays(function(displays) {\n            for (var i = 0; i < displays.length; ++i) {\n              self.devices.push(new VRDisplayHMDDevice(displays[i]));\n              self.devices.push(new VRDisplayPositionSensorDevice(displays[i]));\n            }\n            self.devicesPopulated = true;\n            resolve(self.devices);\n          }, reject);\n        }\n\n        if (self.nativeLegacyWebVRAvailable) {\n          return (navigator.getVRDDevices || navigator.mozGetVRDevices)(function(devices) {\n            for (var i = 0; i < devices.length; ++i) {\n              if (devices[i] instanceof HMDVRDevice) {\n                self.devices.push(devices[i]);\n              }\n              if (devices[i] instanceof PositionSensorVRDevice) {\n                self.devices.push(devices[i]);\n              }\n            }\n            self.devicesPopulated = true;\n            resolve(self.devices);\n          }, reject);\n        }\n      }\n\n      self.populateDevices();\n      resolve(self.devices);\n    } catch (e) {\n      reject(e);\n    }\n  });\n};\n\nWebVRPolyfill.prototype.NativeVRFrameData = window.VRFrameData;\n\n/**\n * Determine if a device is mobile.\n */\nWebVRPolyfill.prototype.isMobile = function() {\n  return /Android/i.test(navigator.userAgent) ||\n      /iPhone|iPad|iPod/i.test(navigator.userAgent);\n};\n\nWebVRPolyfill.prototype.isCardboardCompatible = function() {\n  // For now, support all iOS and Android devices.\n  // Also enable the WebVRConfig.FORCE_VR flag for debugging.\n  return this.isMobile() || window.WebVRConfig.FORCE_ENABLE_VR;\n};\n\nWebVRPolyfill.prototype.isFullScreenAvailable = function() {\n  return (document.fullscreenEnabled ||\n          document.mozFullScreenEnabled ||\n          document.webkitFullscreenEnabled ||\n          false);\n};\n\n// Installs a shim that updates a WebVR 1.0 spec implementation to WebVR 1.1\nfunction InstallWebVRSpecShim() {\n  if ('VRDisplay' in window && !('VRFrameData' in window)) {\n    // Provide the VRFrameData object.\n    window.VRFrameData = VRFrameData;\n\n    // A lot of Chrome builds don't have depthNear and depthFar, even\n    // though they're in the WebVR 1.0 spec. Patch them in if they're not present.\n    if(!('depthNear' in window.VRDisplay.prototype)) {\n      window.VRDisplay.prototype.depthNear = 0.01;\n    }\n\n    if(!('depthFar' in window.VRDisplay.prototype)) {\n      window.VRDisplay.prototype.depthFar = 10000.0;\n    }\n\n    window.VRDisplay.prototype.getFrameData = function(frameData) {\n      return Util.frameDataFromPose(frameData, this.getPose(), this);\n    }\n  }\n};\n\nWebVRPolyfill.InstallWebVRSpecShim = InstallWebVRSpecShim;\nWebVRPolyfill.version = version;\n\nmodule.exports.WebVRPolyfill = WebVRPolyfill;\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * Copyright 2016 Google Inc. 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\nvar CardboardDistorter = __webpack_require__(10);\nvar CardboardUI = __webpack_require__(3);\nvar DeviceInfo = __webpack_require__(5);\nvar Dpdb = __webpack_require__(12);\nvar FusionPoseSensor = __webpack_require__(14);\nvar RotateInstructions = __webpack_require__(19);\nvar ViewerSelector = __webpack_require__(20);\nvar VRDisplay = __webpack_require__(1).VRDisplay;\nvar Util = __webpack_require__(0);\n\nvar Eye = {\n  LEFT: 'left',\n  RIGHT: 'right'\n};\n\n/**\n * VRDisplay based on mobile device parameters and DeviceMotion APIs.\n */\nfunction CardboardVRDisplay() {\n  this.displayName = 'Cardboard VRDisplay (webvr-polyfill)';\n\n  this.capabilities.hasOrientation = true;\n  this.capabilities.canPresent = true;\n\n  // \"Private\" members.\n  this.bufferScale_ = window.WebVRConfig.BUFFER_SCALE;\n  this.poseSensor_ = new FusionPoseSensor();\n  this.distorter_ = null;\n  this.cardboardUI_ = null;\n\n  this.dpdb_ = new Dpdb(true, this.onDeviceParamsUpdated_.bind(this));\n  this.deviceInfo_ = new DeviceInfo(this.dpdb_.getDeviceParams());\n\n  this.viewerSelector_ = new ViewerSelector();\n  this.viewerSelector_.onChange(this.onViewerChanged_.bind(this));\n\n  // Set the correct initial viewer.\n  this.deviceInfo_.setViewer(this.viewerSelector_.getCurrentViewer());\n\n  if (!window.WebVRConfig.ROTATE_INSTRUCTIONS_DISABLED) {\n    this.rotateInstructions_ = new RotateInstructions();\n  }\n\n  if (Util.isIOS()) {\n    // Listen for resize events to workaround this awful Safari bug.\n    window.addEventListener('resize', this.onResize_.bind(this));\n  }\n}\nCardboardVRDisplay.prototype = new VRDisplay();\n\nCardboardVRDisplay.prototype.getImmediatePose = function() {\n  return {\n    position: this.poseSensor_.getPosition(),\n    orientation: this.poseSensor_.getOrientation(),\n    linearVelocity: null,\n    linearAcceleration: null,\n    angularVelocity: null,\n    angularAcceleration: null\n  };\n};\n\nCardboardVRDisplay.prototype.resetPose = function() {\n  this.poseSensor_.resetPose();\n};\n\nCardboardVRDisplay.prototype.getEyeParameters = function(whichEye) {\n  var offset = [this.deviceInfo_.viewer.interLensDistance * 0.5, 0.0, 0.0];\n  var fieldOfView;\n\n  // TODO: FoV can be a little expensive to compute. Cache when device params change.\n  if (whichEye == Eye.LEFT) {\n    offset[0] *= -1.0;\n    fieldOfView = this.deviceInfo_.getFieldOfViewLeftEye();\n  } else if (whichEye == Eye.RIGHT) {\n    fieldOfView = this.deviceInfo_.getFieldOfViewRightEye();\n  } else {\n    console.error('Invalid eye provided: %s', whichEye);\n    return null;\n  }\n\n  return {\n    fieldOfView: fieldOfView,\n    offset: offset,\n    // TODO: Should be able to provide better values than these.\n    renderWidth: this.deviceInfo_.device.width * 0.5 * this.bufferScale_,\n    renderHeight: this.deviceInfo_.device.height * this.bufferScale_,\n  };\n};\n\nCardboardVRDisplay.prototype.onDeviceParamsUpdated_ = function(newParams) {\n  if (Util.isDebug()) {\n    console.log('DPDB reported that device params were updated.');\n  }\n  this.deviceInfo_.updateDeviceParams(newParams);\n\n  if (this.distorter_) {\n    this.distorter_.updateDeviceInfo(this.deviceInfo_);\n  }\n};\n\nCardboardVRDisplay.prototype.updateBounds_ = function () {\n  if (this.layer_ && this.distorter_ && (this.layer_.leftBounds || this.layer_.rightBounds)) {\n    this.distorter_.setTextureBounds(this.layer_.leftBounds, this.layer_.rightBounds);\n  }\n};\n\nCardboardVRDisplay.prototype.beginPresent_ = function() {\n  var gl = this.layer_.source.getContext('webgl');\n  if (!gl)\n    gl = this.layer_.source.getContext('experimental-webgl');\n  if (!gl)\n    gl = this.layer_.source.getContext('webgl2');\n\n  if (!gl)\n    return; // Can't do distortion without a WebGL context.\n\n  // Provides a way to opt out of distortion\n  if (this.layer_.predistorted) {\n    if (!window.WebVRConfig.CARDBOARD_UI_DISABLED) {\n      gl.canvas.width = Util.getScreenWidth() * this.bufferScale_;\n      gl.canvas.height = Util.getScreenHeight() * this.bufferScale_;\n      this.cardboardUI_ = new CardboardUI(gl);\n    }\n  } else {\n    // Create a new distorter for the target context\n    this.distorter_ = new CardboardDistorter(gl);\n    this.distorter_.updateDeviceInfo(this.deviceInfo_);\n    this.cardboardUI_ = this.distorter_.cardboardUI;\n  }\n\n  if (this.cardboardUI_) {\n    this.cardboardUI_.listen(function(e) {\n      // Options clicked.\n      this.viewerSelector_.show(this.layer_.source.parentElement);\n      e.stopPropagation();\n      e.preventDefault();\n    }.bind(this), function(e) {\n      // Back clicked.\n      this.exitPresent();\n      e.stopPropagation();\n      e.preventDefault();\n    }.bind(this));\n  }\n\n  if (this.rotateInstructions_) {\n    if (Util.isLandscapeMode() && Util.isMobile()) {\n      // In landscape mode, temporarily show the \"put into Cardboard\"\n      // interstitial. Otherwise, do the default thing.\n      this.rotateInstructions_.showTemporarily(3000, this.layer_.source.parentElement);\n    } else {\n      this.rotateInstructions_.update();\n    }\n  }\n\n  // Listen for orientation change events in order to show interstitial.\n  this.orientationHandler = this.onOrientationChange_.bind(this);\n  window.addEventListener('orientationchange', this.orientationHandler);\n\n  // Listen for present display change events in order to update distorter dimensions\n  this.vrdisplaypresentchangeHandler = this.updateBounds_.bind(this);\n  window.addEventListener('vrdisplaypresentchange', this.vrdisplaypresentchangeHandler);\n\n  // Fire this event initially, to give geometry-distortion clients the chance\n  // to do something custom.\n  this.fireVRDisplayDeviceParamsChange_();\n};\n\nCardboardVRDisplay.prototype.endPresent_ = function() {\n  if (this.distorter_) {\n    this.distorter_.destroy();\n    this.distorter_ = null;\n  }\n  if (this.cardboardUI_) {\n    this.cardboardUI_.destroy();\n    this.cardboardUI_ = null;\n  }\n\n  if (this.rotateInstructions_) {\n    this.rotateInstructions_.hide();\n  }\n  this.viewerSelector_.hide();\n\n  window.removeEventListener('orientationchange', this.orientationHandler);\n  window.removeEventListener('vrdisplaypresentchange', this.vrdisplaypresentchangeHandler);\n};\n\nCardboardVRDisplay.prototype.submitFrame = function(pose) {\n  if (this.distorter_) {\n    this.updateBounds_();\n    this.distorter_.submitFrame();\n  } else if (this.cardboardUI_ && this.layer_) {\n    // Hack for predistorted: true.\n    var canvas = this.layer_.source.getContext('webgl').canvas;\n    if (canvas.width != this.lastWidth || canvas.height != this.lastHeight) {\n      this.cardboardUI_.onResize();\n    }\n    this.lastWidth = canvas.width;\n    this.lastHeight = canvas.height;\n\n    // Render the Cardboard UI.\n    this.cardboardUI_.render();\n  }\n};\n\nCardboardVRDisplay.prototype.onOrientationChange_ = function(e) {\n  // Hide the viewer selector.\n  this.viewerSelector_.hide();\n\n  // Update the rotate instructions.\n  if (this.rotateInstructions_) {\n    this.rotateInstructions_.update();\n  }\n\n  this.onResize_();\n};\n\nCardboardVRDisplay.prototype.onResize_ = function(e) {\n  if (this.layer_) {\n    var gl = this.layer_.source.getContext('webgl');\n    // Size the CSS canvas.\n    // Added padding on right and bottom because iPhone 5 will not\n    // hide the URL bar unless content is bigger than the screen.\n    // This will not be visible as long as the container element (e.g. body)\n    // is set to 'overflow: hidden'.\n    // Additionally, 'box-sizing: content-box' ensures renderWidth = width + padding.\n    // This is required when 'box-sizing: border-box' is used elsewhere in the page.\n    var cssProperties = [\n      'position: absolute',\n      'top: 0',\n      'left: 0',\n      // Use vw/vh to handle implicitly devicePixelRatio; issue #282\n      'width: 100vw',\n      'height: 100vh',\n      'border: 0',\n      'margin: 0',\n      // Set no padding in the case where you don't have control over\n      // the content injection, like in Unity WebGL; issue #282\n      'padding: 0px',\n      'box-sizing: content-box',\n    ];\n    gl.canvas.setAttribute('style', cssProperties.join('; ') + ';');\n\n    Util.safariCssSizeWorkaround(gl.canvas);\n  }\n};\n\nCardboardVRDisplay.prototype.onViewerChanged_ = function(viewer) {\n  this.deviceInfo_.setViewer(viewer);\n\n  if (this.distorter_) {\n    // Update the distortion appropriately.\n    this.distorter_.updateDeviceInfo(this.deviceInfo_);\n  }\n\n  // Fire a new event containing viewer and device parameters for clients that\n  // want to implement their own geometry-based distortion.\n  this.fireVRDisplayDeviceParamsChange_();\n};\n\nCardboardVRDisplay.prototype.fireVRDisplayDeviceParamsChange_ = function() {\n  var event = new CustomEvent('vrdisplaydeviceparamschange', {\n    detail: {\n      vrdisplay: this,\n      deviceInfo: this.deviceInfo_,\n    }\n  });\n  window.dispatchEvent(event);\n};\n\nmodule.exports = CardboardVRDisplay;\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * Copyright 2016 Google Inc. 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\nvar CardboardUI = __webpack_require__(3);\nvar Util = __webpack_require__(0);\nvar WGLUPreserveGLState = __webpack_require__(4);\n\nvar distortionVS = [\n  'attribute vec2 position;',\n  'attribute vec3 texCoord;',\n\n  'varying vec2 vTexCoord;',\n\n  'uniform vec4 viewportOffsetScale[2];',\n\n  'void main() {',\n  '  vec4 viewport = viewportOffsetScale[int(texCoord.z)];',\n  '  vTexCoord = (texCoord.xy * viewport.zw) + viewport.xy;',\n  '  gl_Position = vec4( position, 1.0, 1.0 );',\n  '}',\n].join('\\n');\n\nvar distortionFS = [\n  'precision mediump float;',\n  'uniform sampler2D diffuse;',\n\n  'varying vec2 vTexCoord;',\n\n  'void main() {',\n  '  gl_FragColor = texture2D(diffuse, vTexCoord);',\n  '}',\n].join('\\n');\n\n/**\n * A mesh-based distorter.\n */\nfunction CardboardDistorter(gl) {\n  this.gl = gl;\n  this.ctxAttribs = gl.getContextAttributes();\n\n  this.meshWidth = 20;\n  this.meshHeight = 20;\n\n  this.bufferScale = window.WebVRConfig.BUFFER_SCALE;\n\n  this.bufferWidth = gl.drawingBufferWidth;\n  this.bufferHeight = gl.drawingBufferHeight;\n\n  // Patching support\n  this.realBindFramebuffer = gl.bindFramebuffer;\n  this.realEnable = gl.enable;\n  this.realDisable = gl.disable;\n  this.realColorMask = gl.colorMask;\n  this.realClearColor = gl.clearColor;\n  this.realViewport = gl.viewport;\n\n  if (!Util.isIOS()) {\n    this.realCanvasWidth = Object.getOwnPropertyDescriptor(gl.canvas.__proto__, 'width');\n    this.realCanvasHeight = Object.getOwnPropertyDescriptor(gl.canvas.__proto__, 'height');\n  }\n\n  this.isPatched = false;\n\n  // State tracking\n  this.lastBoundFramebuffer = null;\n  this.cullFace = false;\n  this.depthTest = false;\n  this.blend = false;\n  this.scissorTest = false;\n  this.stencilTest = false;\n  this.viewport = [0, 0, 0, 0];\n  this.colorMask = [true, true, true, true];\n  this.clearColor = [0, 0, 0, 0];\n\n  this.attribs = {\n    position: 0,\n    texCoord: 1\n  };\n  this.program = Util.linkProgram(gl, distortionVS, distortionFS, this.attribs);\n  this.uniforms = Util.getProgramUniforms(gl, this.program);\n\n  this.viewportOffsetScale = new Float32Array(8);\n  this.setTextureBounds();\n\n  this.vertexBuffer = gl.createBuffer();\n  this.indexBuffer = gl.createBuffer();\n  this.indexCount = 0;\n\n  this.renderTarget = gl.createTexture();\n  this.framebuffer = gl.createFramebuffer();\n\n  this.depthStencilBuffer = null;\n  this.depthBuffer = null;\n  this.stencilBuffer = null;\n\n  if (this.ctxAttribs.depth && this.ctxAttribs.stencil) {\n    this.depthStencilBuffer = gl.createRenderbuffer();\n  } else if (this.ctxAttribs.depth) {\n    this.depthBuffer = gl.createRenderbuffer();\n  } else if (this.ctxAttribs.stencil) {\n    this.stencilBuffer = gl.createRenderbuffer();\n  }\n\n  this.patch();\n\n  this.onResize();\n\n  if (!window.WebVRConfig.CARDBOARD_UI_DISABLED) {\n    this.cardboardUI = new CardboardUI(gl);\n  }\n};\n\n/**\n * Tears down all the resources created by the distorter and removes any\n * patches.\n */\nCardboardDistorter.prototype.destroy = function() {\n  var gl = this.gl;\n\n  this.unpatch();\n\n  gl.deleteProgram(this.program);\n  gl.deleteBuffer(this.vertexBuffer);\n  gl.deleteBuffer(this.indexBuffer);\n  gl.deleteTexture(this.renderTarget);\n  gl.deleteFramebuffer(this.framebuffer);\n  if (this.depthStencilBuffer) {\n    gl.deleteRenderbuffer(this.depthStencilBuffer);\n  }\n  if (this.depthBuffer) {\n    gl.deleteRenderbuffer(this.depthBuffer);\n  }\n  if (this.stencilBuffer) {\n    gl.deleteRenderbuffer(this.stencilBuffer);\n  }\n\n  if (this.cardboardUI) {\n    this.cardboardUI.destroy();\n  }\n};\n\n\n/**\n * Resizes the backbuffer to match the canvas width and height.\n */\nCardboardDistorter.prototype.onResize = function() {\n  var gl = this.gl;\n  var self = this;\n\n  var glState = [\n    gl.RENDERBUFFER_BINDING,\n    gl.TEXTURE_BINDING_2D, gl.TEXTURE0\n  ];\n\n  WGLUPreserveGLState(gl, glState, function(gl) {\n    // Bind real backbuffer and clear it once. We don't need to clear it again\n    // after that because we're overwriting the same area every frame.\n    self.realBindFramebuffer.call(gl, gl.FRAMEBUFFER, null);\n\n    // Put things in a good state\n    if (self.scissorTest) { self.realDisable.call(gl, gl.SCISSOR_TEST); }\n    self.realColorMask.call(gl, true, true, true, true);\n    self.realViewport.call(gl, 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n    self.realClearColor.call(gl, 0, 0, 0, 1);\n\n    gl.clear(gl.COLOR_BUFFER_BIT);\n\n    // Now bind and resize the fake backbuffer\n    self.realBindFramebuffer.call(gl, gl.FRAMEBUFFER, self.framebuffer);\n\n    gl.bindTexture(gl.TEXTURE_2D, self.renderTarget);\n    gl.texImage2D(gl.TEXTURE_2D, 0, self.ctxAttribs.alpha ? gl.RGBA : gl.RGB,\n        self.bufferWidth, self.bufferHeight, 0,\n        self.ctxAttribs.alpha ? gl.RGBA : gl.RGB, gl.UNSIGNED_BYTE, null);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n    gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\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.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, self.renderTarget, 0);\n\n    if (self.ctxAttribs.depth && self.ctxAttribs.stencil) {\n      gl.bindRenderbuffer(gl.RENDERBUFFER, self.depthStencilBuffer);\n      gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL,\n          self.bufferWidth, self.bufferHeight);\n      gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT,\n          gl.RENDERBUFFER, self.depthStencilBuffer);\n    } else if (self.ctxAttribs.depth) {\n      gl.bindRenderbuffer(gl.RENDERBUFFER, self.depthBuffer);\n      gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_COMPONENT16,\n          self.bufferWidth, self.bufferHeight);\n      gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT,\n          gl.RENDERBUFFER, self.depthBuffer);\n    } else if (self.ctxAttribs.stencil) {\n      gl.bindRenderbuffer(gl.RENDERBUFFER, self.stencilBuffer);\n      gl.renderbufferStorage(gl.RENDERBUFFER, gl.STENCIL_INDEX8,\n          self.bufferWidth, self.bufferHeight);\n      gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.STENCIL_ATTACHMENT,\n          gl.RENDERBUFFER, self.stencilBuffer);\n    }\n\n    if (!gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE) {\n      console.error('Framebuffer incomplete!');\n    }\n\n    self.realBindFramebuffer.call(gl, gl.FRAMEBUFFER, self.lastBoundFramebuffer);\n\n    if (self.scissorTest) { self.realEnable.call(gl, gl.SCISSOR_TEST); }\n\n    self.realColorMask.apply(gl, self.colorMask);\n    self.realViewport.apply(gl, self.viewport);\n    self.realClearColor.apply(gl, self.clearColor);\n  });\n\n  if (this.cardboardUI) {\n    this.cardboardUI.onResize();\n  }\n};\n\nCardboardDistorter.prototype.patch = function() {\n  if (this.isPatched) {\n    return;\n  }\n\n  var self = this;\n  var canvas = this.gl.canvas;\n  var gl = this.gl;\n\n  if (!Util.isIOS()) {\n    canvas.width = Util.getScreenWidth() * this.bufferScale;\n    canvas.height = Util.getScreenHeight() * this.bufferScale;\n\n    Object.defineProperty(canvas, 'width', {\n      configurable: true,\n      enumerable: true,\n      get: function() {\n        return self.bufferWidth;\n      },\n      set: function(value) {\n        self.bufferWidth = value;\n        self.realCanvasWidth.set.call(canvas, value);\n        self.onResize();\n      }\n    });\n\n    Object.defineProperty(canvas, 'height', {\n      configurable: true,\n      enumerable: true,\n      get: function() {\n        return self.bufferHeight;\n      },\n      set: function(value) {\n        self.bufferHeight = value;\n        self.realCanvasHeight.set.call(canvas, value);\n        self.onResize();\n      }\n    });\n  }\n\n  this.lastBoundFramebuffer = gl.getParameter(gl.FRAMEBUFFER_BINDING);\n\n  if (this.lastBoundFramebuffer == null) {\n    this.lastBoundFramebuffer = this.framebuffer;\n    this.gl.bindFramebuffer(gl.FRAMEBUFFER, this.framebuffer);\n  }\n\n  this.gl.bindFramebuffer = function(target, framebuffer) {\n    self.lastBoundFramebuffer = framebuffer ? framebuffer : self.framebuffer;\n    // Silently make calls to bind the default framebuffer bind ours instead.\n    self.realBindFramebuffer.call(gl, target, self.lastBoundFramebuffer);\n  };\n\n  this.cullFace = gl.getParameter(gl.CULL_FACE);\n  this.depthTest = gl.getParameter(gl.DEPTH_TEST);\n  this.blend = gl.getParameter(gl.BLEND);\n  this.scissorTest = gl.getParameter(gl.SCISSOR_TEST);\n  this.stencilTest = gl.getParameter(gl.STENCIL_TEST);\n\n  gl.enable = function(pname) {\n    switch (pname) {\n      case gl.CULL_FACE: self.cullFace = true; break;\n      case gl.DEPTH_TEST: self.depthTest = true; break;\n      case gl.BLEND: self.blend = true; break;\n      case gl.SCISSOR_TEST: self.scissorTest = true; break;\n      case gl.STENCIL_TEST: self.stencilTest = true; break;\n    }\n    self.realEnable.call(gl, pname);\n  };\n\n  gl.disable = function(pname) {\n    switch (pname) {\n      case gl.CULL_FACE: self.cullFace = false; break;\n      case gl.DEPTH_TEST: self.depthTest = false; break;\n      case gl.BLEND: self.blend = false; break;\n      case gl.SCISSOR_TEST: self.scissorTest = false; break;\n      case gl.STENCIL_TEST: self.stencilTest = false; break;\n    }\n    self.realDisable.call(gl, pname);\n  };\n\n  this.colorMask = gl.getParameter(gl.COLOR_WRITEMASK);\n  gl.colorMask = function(r, g, b, a) {\n    self.colorMask[0] = r;\n    self.colorMask[1] = g;\n    self.colorMask[2] = b;\n    self.colorMask[3] = a;\n    self.realColorMask.call(gl, r, g, b, a);\n  };\n\n  this.clearColor = gl.getParameter(gl.COLOR_CLEAR_VALUE);\n  gl.clearColor = function(r, g, b, a) {\n    self.clearColor[0] = r;\n    self.clearColor[1] = g;\n    self.clearColor[2] = b;\n    self.clearColor[3] = a;\n    self.realClearColor.call(gl, r, g, b, a);\n  };\n\n  this.viewport = gl.getParameter(gl.VIEWPORT);\n  gl.viewport = function(x, y, w, h) {\n    self.viewport[0] = x;\n    self.viewport[1] = y;\n    self.viewport[2] = w;\n    self.viewport[3] = h;\n    self.realViewport.call(gl, x, y, w, h);\n  };\n\n  this.isPatched = true;\n  Util.safariCssSizeWorkaround(canvas);\n};\n\nCardboardDistorter.prototype.unpatch = function() {\n  if (!this.isPatched) {\n    return;\n  }\n\n  var gl = this.gl;\n  var canvas = this.gl.canvas;\n\n  if (!Util.isIOS()) {\n    Object.defineProperty(canvas, 'width', this.realCanvasWidth);\n    Object.defineProperty(canvas, 'height', this.realCanvasHeight);\n  }\n  canvas.width = this.bufferWidth;\n  canvas.height = this.bufferHeight;\n\n  gl.bindFramebuffer = this.realBindFramebuffer;\n  gl.enable = this.realEnable;\n  gl.disable = this.realDisable;\n  gl.colorMask = this.realColorMask;\n  gl.clearColor = this.realClearColor;\n  gl.viewport = this.realViewport;\n\n  // Check to see if our fake backbuffer is bound and bind the real backbuffer\n  // if that's the case.\n  if (this.lastBoundFramebuffer == this.framebuffer) {\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n  }\n\n  this.isPatched = false;\n\n  setTimeout(function() {\n    Util.safariCssSizeWorkaround(canvas);\n  }, 1);\n};\n\nCardboardDistorter.prototype.setTextureBounds = function(leftBounds, rightBounds) {\n  if (!leftBounds) {\n    leftBounds = [0, 0, 0.5, 1];\n  }\n\n  if (!rightBounds) {\n    rightBounds = [0.5, 0, 0.5, 1];\n  }\n\n  // Left eye\n  this.viewportOffsetScale[0] = leftBounds[0]; // X\n  this.viewportOffsetScale[1] = leftBounds[1]; // Y\n  this.viewportOffsetScale[2] = leftBounds[2]; // Width\n  this.viewportOffsetScale[3] = leftBounds[3]; // Height\n\n  // Right eye\n  this.viewportOffsetScale[4] = rightBounds[0]; // X\n  this.viewportOffsetScale[5] = rightBounds[1]; // Y\n  this.viewportOffsetScale[6] = rightBounds[2]; // Width\n  this.viewportOffsetScale[7] = rightBounds[3]; // Height\n};\n\n/**\n * Performs distortion pass on the injected backbuffer, rendering it to the real\n * backbuffer.\n */\nCardboardDistorter.prototype.submitFrame = function() {\n  var gl = this.gl;\n  var self = this;\n\n  var glState = [];\n\n  if (!window.WebVRConfig.DIRTY_SUBMIT_FRAME_BINDINGS) {\n    glState.push(\n      gl.CURRENT_PROGRAM,\n      gl.ARRAY_BUFFER_BINDING,\n      gl.ELEMENT_ARRAY_BUFFER_BINDING,\n      gl.TEXTURE_BINDING_2D, gl.TEXTURE0\n    );\n  }\n\n  WGLUPreserveGLState(gl, glState, function(gl) {\n    // Bind the real default framebuffer\n    self.realBindFramebuffer.call(gl, gl.FRAMEBUFFER, null);\n\n    // Make sure the GL state is in a good place\n    if (self.cullFace) { self.realDisable.call(gl, gl.CULL_FACE); }\n    if (self.depthTest) { self.realDisable.call(gl, gl.DEPTH_TEST); }\n    if (self.blend) { self.realDisable.call(gl, gl.BLEND); }\n    if (self.scissorTest) { self.realDisable.call(gl, gl.SCISSOR_TEST); }\n    if (self.stencilTest) { self.realDisable.call(gl, gl.STENCIL_TEST); }\n    self.realColorMask.call(gl, true, true, true, true);\n    self.realViewport.call(gl, 0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight);\n\n    // If the backbuffer has an alpha channel clear every frame so the page\n    // doesn't show through.\n    if (self.ctxAttribs.alpha || Util.isIOS()) {\n      self.realClearColor.call(gl, 0, 0, 0, 1);\n      gl.clear(gl.COLOR_BUFFER_BIT);\n    }\n\n    // Bind distortion program and mesh\n    gl.useProgram(self.program);\n\n    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, self.indexBuffer);\n\n    gl.bindBuffer(gl.ARRAY_BUFFER, self.vertexBuffer);\n    gl.enableVertexAttribArray(self.attribs.position);\n    gl.enableVertexAttribArray(self.attribs.texCoord);\n    gl.vertexAttribPointer(self.attribs.position, 2, gl.FLOAT, false, 20, 0);\n    gl.vertexAttribPointer(self.attribs.texCoord, 3, gl.FLOAT, false, 20, 8);\n\n    gl.activeTexture(gl.TEXTURE0);\n    gl.uniform1i(self.uniforms.diffuse, 0);\n    gl.bindTexture(gl.TEXTURE_2D, self.renderTarget);\n\n    gl.uniform4fv(self.uniforms.viewportOffsetScale, self.viewportOffsetScale);\n\n    // Draws both eyes\n    gl.drawElements(gl.TRIANGLES, self.indexCount, gl.UNSIGNED_SHORT, 0);\n\n    if (self.cardboardUI) {\n      self.cardboardUI.renderNoState();\n    }\n\n    // Bind the fake default framebuffer again\n    self.realBindFramebuffer.call(self.gl, gl.FRAMEBUFFER, self.framebuffer);\n\n    // If preserveDrawingBuffer == false clear the framebuffer\n    if (!self.ctxAttribs.preserveDrawingBuffer) {\n      self.realClearColor.call(gl, 0, 0, 0, 0);\n      gl.clear(gl.COLOR_BUFFER_BIT);\n    }\n\n    if (!window.WebVRConfig.DIRTY_SUBMIT_FRAME_BINDINGS) {\n      self.realBindFramebuffer.call(gl, gl.FRAMEBUFFER, self.lastBoundFramebuffer);\n    }\n\n    // Restore state\n    if (self.cullFace) { self.realEnable.call(gl, gl.CULL_FACE); }\n    if (self.depthTest) { self.realEnable.call(gl, gl.DEPTH_TEST); }\n    if (self.blend) { self.realEnable.call(gl, gl.BLEND); }\n    if (self.scissorTest) { self.realEnable.call(gl, gl.SCISSOR_TEST); }\n    if (self.stencilTest) { self.realEnable.call(gl, gl.STENCIL_TEST); }\n\n    self.realColorMask.apply(gl, self.colorMask);\n    self.realViewport.apply(gl, self.viewport);\n    if (self.ctxAttribs.alpha || !self.ctxAttribs.preserveDrawingBuffer) {\n      self.realClearColor.apply(gl, self.clearColor);\n    }\n  });\n\n  // Workaround for the fact that Safari doesn't allow us to patch the canvas\n  // width and height correctly. After each submit frame check to see what the\n  // real backbuffer size has been set to and resize the fake backbuffer size\n  // to match.\n  if (Util.isIOS()) {\n    var canvas = gl.canvas;\n    if (canvas.width != self.bufferWidth || canvas.height != self.bufferHeight) {\n      self.bufferWidth = canvas.width;\n      self.bufferHeight = canvas.height;\n      self.onResize();\n    }\n  }\n};\n\n/**\n * Call when the deviceInfo has changed. At this point we need\n * to re-calculate the distortion mesh.\n */\nCardboardDistorter.prototype.updateDeviceInfo = function(deviceInfo) {\n  var gl = this.gl;\n  var self = this;\n\n  var glState = [gl.ARRAY_BUFFER_BINDING, gl.ELEMENT_ARRAY_BUFFER_BINDING];\n  WGLUPreserveGLState(gl, glState, function(gl) {\n    var vertices = self.computeMeshVertices_(self.meshWidth, self.meshHeight, deviceInfo);\n    gl.bindBuffer(gl.ARRAY_BUFFER, self.vertexBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);\n\n    // Indices don't change based on device parameters, so only compute once.\n    if (!self.indexCount) {\n      var indices = self.computeMeshIndices_(self.meshWidth, self.meshHeight);\n      gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, self.indexBuffer);\n      gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indices, gl.STATIC_DRAW);\n      self.indexCount = indices.length;\n    }\n  });\n};\n\n/**\n * Build the distortion mesh vertices.\n * Based on code from the Unity cardboard plugin.\n */\nCardboardDistorter.prototype.computeMeshVertices_ = function(width, height, deviceInfo) {\n  var vertices = new Float32Array(2 * width * height * 5);\n\n  var lensFrustum = deviceInfo.getLeftEyeVisibleTanAngles();\n  var noLensFrustum = deviceInfo.getLeftEyeNoLensTanAngles();\n  var viewport = deviceInfo.getLeftEyeVisibleScreenRect(noLensFrustum);\n  var vidx = 0;\n  var iidx = 0;\n  for (var e = 0; e < 2; e++) {\n    for (var j = 0; j < height; j++) {\n      for (var i = 0; i < width; i++, vidx++) {\n        var u = i / (width - 1);\n        var v = j / (height - 1);\n\n        // Grid points regularly spaced in StreoScreen, and barrel distorted in\n        // the mesh.\n        var s = u;\n        var t = v;\n        var x = Util.lerp(lensFrustum[0], lensFrustum[2], u);\n        var y = Util.lerp(lensFrustum[3], lensFrustum[1], v);\n        var d = Math.sqrt(x * x + y * y);\n        var r = deviceInfo.distortion.distortInverse(d);\n        var p = x * r / d;\n        var q = y * r / d;\n        u = (p - noLensFrustum[0]) / (noLensFrustum[2] - noLensFrustum[0]);\n        v = (q - noLensFrustum[3]) / (noLensFrustum[1] - noLensFrustum[3]);\n\n        // Convert u,v to mesh screen coordinates.\n        var aspect = deviceInfo.device.widthMeters / deviceInfo.device.heightMeters;\n\n        // FIXME: The original Unity plugin multiplied U by the aspect ratio\n        // and didn't multiply either value by 2, but that seems to get it\n        // really close to correct looking for me. I hate this kind of \"Don't\n        // know why it works\" code though, and wold love a more logical\n        // explanation of what needs to happen here.\n        u = (viewport.x + u * viewport.width - 0.5) * 2.0; //* aspect;\n        v = (viewport.y + v * viewport.height - 0.5) * 2.0;\n\n        vertices[(vidx * 5) + 0] = u; // position.x\n        vertices[(vidx * 5) + 1] = v; // position.y\n        vertices[(vidx * 5) + 2] = s; // texCoord.x\n        vertices[(vidx * 5) + 3] = t; // texCoord.y\n        vertices[(vidx * 5) + 4] = e; // texCoord.z (viewport index)\n      }\n    }\n    var w = lensFrustum[2] - lensFrustum[0];\n    lensFrustum[0] = -(w + lensFrustum[0]);\n    lensFrustum[2] = w - lensFrustum[2];\n    w = noLensFrustum[2] - noLensFrustum[0];\n    noLensFrustum[0] = -(w + noLensFrustum[0]);\n    noLensFrustum[2] = w - noLensFrustum[2];\n    viewport.x = 1 - (viewport.x + viewport.width);\n  }\n  return vertices;\n}\n\n/**\n * Build the distortion mesh indices.\n * Based on code from the Unity cardboard plugin.\n */\nCardboardDistorter.prototype.computeMeshIndices_ = function(width, height) {\n  var indices = new Uint16Array(2 * (width - 1) * (height - 1) * 6);\n  var halfwidth = width / 2;\n  var halfheight = height / 2;\n  var vidx = 0;\n  var iidx = 0;\n  for (var e = 0; e < 2; e++) {\n    for (var j = 0; j < height; j++) {\n      for (var i = 0; i < width; i++, vidx++) {\n        if (i == 0 || j == 0)\n          continue;\n        // Build a quad.  Lower right and upper left quadrants have quads with\n        // the triangle diagonal flipped to get the vignette to interpolate\n        // correctly.\n        if ((i <= halfwidth) == (j <= halfheight)) {\n          // Quad diagonal lower left to upper right.\n          indices[iidx++] = vidx;\n          indices[iidx++] = vidx - width - 1;\n          indices[iidx++] = vidx - width;\n          indices[iidx++] = vidx - width - 1;\n          indices[iidx++] = vidx;\n          indices[iidx++] = vidx - 1;\n        } else {\n          // Quad diagonal upper left to lower right.\n          indices[iidx++] = vidx - 1;\n          indices[iidx++] = vidx - width;\n          indices[iidx++] = vidx;\n          indices[iidx++] = vidx - width;\n          indices[iidx++] = vidx - 1;\n          indices[iidx++] = vidx - width - 1;\n        }\n      }\n    }\n  }\n  return indices;\n};\n\nCardboardDistorter.prototype.getOwnPropertyDescriptor_ = function(proto, attrName) {\n  var descriptor = Object.getOwnPropertyDescriptor(proto, attrName);\n  // In some cases (ahem... Safari), the descriptor returns undefined get and\n  // set fields. In this case, we need to create a synthetic property\n  // descriptor. This works around some of the issues in\n  // https://github.com/borismus/webvr-polyfill/issues/46\n  if (descriptor.get === undefined || descriptor.set === undefined) {\n    descriptor.configurable = true;\n    descriptor.enumerable = true;\n    descriptor.get = function() {\n      return this.getAttribute(attrName);\n    };\n    descriptor.set = function(val) {\n      this.setAttribute(attrName, val);\n    };\n  }\n  return descriptor;\n};\n\nmodule.exports = CardboardDistorter;\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports) {\n\n/**\n * TODO(smus): Implement coefficient inversion.\n */\nfunction Distortion(coefficients) {\n  this.coefficients = coefficients;\n}\n\n/**\n * Calculates the inverse distortion for a radius.\n * </p><p>\n * Allows to compute the original undistorted radius from a distorted one.\n * See also getApproximateInverseDistortion() for a faster but potentially\n * less accurate method.\n *\n * @param {Number} radius Distorted radius from the lens center in tan-angle units.\n * @return {Number} The undistorted radius in tan-angle units.\n */\nDistortion.prototype.distortInverse = function(radius) {\n  // Secant method.\n  var r0 = 0;\n  var r1 = 1;\n  var dr0 = radius - this.distort(r0);\n  while (Math.abs(r1 - r0) > 0.0001 /** 0.1mm */) {\n    var dr1 = radius - this.distort(r1);\n    var r2 = r1 - dr1 * ((r1 - r0) / (dr1 - dr0));\n    r0 = r1;\n    r1 = r2;\n    dr0 = dr1;\n  }\n  return r1;\n};\n\n/**\n * Distorts a radius by its distortion factor from the center of the lenses.\n *\n * @param {Number} radius Radius from the lens center in tan-angle units.\n * @return {Number} The distorted radius in tan-angle units.\n */\nDistortion.prototype.distort = function(radius) {\n  var r2 = radius * radius;\n  var ret = 0;\n  for (var i = 0; i < this.coefficients.length; i++) {\n    ret = r2 * (ret + this.coefficients[i]);\n  }\n  return (ret + 1) * radius;\n};\n\nmodule.exports = Distortion;\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * Copyright 2015 Google Inc. 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// Offline cache of the DPDB, to be used until we load the online one (and\n// as a fallback in case we can't load the online one).\nvar DPDB_CACHE = __webpack_require__(13);\nvar Util = __webpack_require__(0);\n\n// Online DPDB URL.\nvar ONLINE_DPDB_URL =\n  'https://dpdb.webvr.rocks/dpdb.json';\n\n/**\n * Calculates device parameters based on the DPDB (Device Parameter Database).\n * Initially, uses the cached DPDB values.\n *\n * If fetchOnline == true, then this object tries to fetch the online version\n * of the DPDB and updates the device info if a better match is found.\n * Calls the onDeviceParamsUpdated callback when there is an update to the\n * device information.\n */\nfunction Dpdb(fetchOnline, onDeviceParamsUpdated) {\n  // Start with the offline DPDB cache while we are loading the real one.\n  this.dpdb = DPDB_CACHE;\n\n  // Calculate device params based on the offline version of the DPDB.\n  this.recalculateDeviceParams_();\n\n  // XHR to fetch online DPDB file, if requested.\n  if (fetchOnline) {\n    // Set the callback.\n    this.onDeviceParamsUpdated = onDeviceParamsUpdated;\n\n    var xhr = new XMLHttpRequest();\n    var obj = this;\n    xhr.open('GET', ONLINE_DPDB_URL, true);\n    xhr.addEventListener('load', function() {\n      obj.loading = false;\n      if (xhr.status >= 200 && xhr.status <= 299) {\n        // Success.\n        obj.dpdb = JSON.parse(xhr.response);\n        obj.recalculateDeviceParams_();\n      } else {\n        // Error loading the DPDB.\n        console.error('Error loading online DPDB!');\n      }\n    });\n    xhr.send();\n  }\n}\n\n// Returns the current device parameters.\nDpdb.prototype.getDeviceParams = function() {\n  return this.deviceParams;\n};\n\n// Recalculates this device's parameters based on the DPDB.\nDpdb.prototype.recalculateDeviceParams_ = function() {\n  var newDeviceParams = this.calcDeviceParams_();\n  if (newDeviceParams) {\n    this.deviceParams = newDeviceParams;\n    // Invoke callback, if it is set.\n    if (this.onDeviceParamsUpdated) {\n      this.onDeviceParamsUpdated(this.deviceParams);\n    }\n  } else {\n    console.error('Failed to recalculate device parameters.');\n  }\n};\n\n// Returns a DeviceParams object that represents the best guess as to this\n// device's parameters. Can return null if the device does not match any\n// known devices.\nDpdb.prototype.calcDeviceParams_ = function() {\n  var db = this.dpdb; // shorthand\n  if (!db) {\n    console.error('DPDB not available.');\n    return null;\n  }\n  if (db.format != 1) {\n    console.error('DPDB has unexpected format version.');\n    return null;\n  }\n  if (!db.devices || !db.devices.length) {\n    console.error('DPDB does not have a devices section.');\n    return null;\n  }\n\n  // Get the actual user agent and screen dimensions in pixels.\n  var userAgent = navigator.userAgent || navigator.vendor || window.opera;\n  var width = Util.getScreenWidth();\n  var height = Util.getScreenHeight();\n\n  if (!db.devices) {\n    console.error('DPDB has no devices section.');\n    return null;\n  }\n\n  for (var i = 0; i < db.devices.length; i++) {\n    var device = db.devices[i];\n    if (!device.rules) {\n      console.warn('Device[' + i + '] has no rules section.');\n      continue;\n    }\n\n    if (device.type != 'ios' && device.type != 'android') {\n      console.warn('Device[' + i + '] has invalid type.');\n      continue;\n    }\n\n    // See if this device is of the appropriate type.\n    if (Util.isIOS() != (device.type == 'ios')) continue;\n\n    // See if this device matches any of the rules:\n    var matched = false;\n    for (var j = 0; j < device.rules.length; j++) {\n      var rule = device.rules[j];\n      if (this.matchRule_(rule, userAgent, width, height)) {\n        matched = true;\n        break;\n      }\n    }\n    if (!matched) continue;\n\n    // device.dpi might be an array of [ xdpi, ydpi] or just a scalar.\n    var xdpi = device.dpi[0] || device.dpi;\n    var ydpi = device.dpi[1] || device.dpi;\n\n    return new DeviceParams({ xdpi: xdpi, ydpi: ydpi, bevelMm: device.bw });\n  }\n\n  console.warn('No DPDB device match.');\n  return null;\n};\n\nDpdb.prototype.matchRule_ = function(rule, ua, screenWidth, screenHeight) {\n  // We can only match 'ua' and 'res' rules, not other types like 'mdmh'\n  // (which are meant for native platforms).\n  if (!rule.ua && !rule.res) return false;\n\n  // If our user agent string doesn't contain the indicated user agent string,\n  // the match fails.\n  if (rule.ua && ua.indexOf(rule.ua) < 0) return false;\n\n  // If the rule specifies screen dimensions that don't correspond to ours,\n  // the match fails.\n  if (rule.res) {\n    if (!rule.res[0] || !rule.res[1]) return false;\n    var resX = rule.res[0];\n    var resY = rule.res[1];\n    // Compare min and max so as to make the order not matter, i.e., it should\n    // be true that 640x480 == 480x640.\n    if (Math.min(screenWidth, screenHeight) != Math.min(resX, resY) ||\n        (Math.max(screenWidth, screenHeight) != Math.max(resX, resY))) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nfunction DeviceParams(params) {\n  this.xdpi = params.xdpi;\n  this.ydpi = params.ydpi;\n  this.bevelMm = params.bevelMm;\n}\n\nmodule.exports = Dpdb;\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"format\":1,\"last_updated\":\"2017-08-27T14:39:31Z\",\"devices\":[{\"type\":\"android\",\"rules\":[{\"mdmh\":\"asus/*/Nexus 7/*\"},{\"ua\":\"Nexus 7\"}],\"dpi\":[320.8,323],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"asus/*/ASUS_Z00AD/*\"},{\"ua\":\"ASUS_Z00AD\"}],\"dpi\":[403,404.6],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Google/*/Pixel XL/*\"},{\"ua\":\"Pixel XL\"}],\"dpi\":[537.9,533],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Google/*/Pixel/*\"},{\"ua\":\"Pixel\"}],\"dpi\":[432.6,436.7],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"HTC/*/HTC6435LVW/*\"},{\"ua\":\"HTC6435LVW\"}],\"dpi\":[449.7,443.3],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"HTC/*/HTC One XL/*\"},{\"ua\":\"HTC One XL\"}],\"dpi\":[315.3,314.6],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"htc/*/Nexus 9/*\"},{\"ua\":\"Nexus 9\"}],\"dpi\":289,\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"HTC/*/HTC One M9/*\"},{\"ua\":\"HTC One M9\"}],\"dpi\":[442.5,443.3],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"HTC/*/HTC One_M8/*\"},{\"ua\":\"HTC One_M8\"}],\"dpi\":[449.7,447.4],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"HTC/*/HTC One/*\"},{\"ua\":\"HTC One\"}],\"dpi\":472.8,\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Huawei/*/Nexus 6P/*\"},{\"ua\":\"Nexus 6P\"}],\"dpi\":[515.1,518],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"LENOVO/*/Lenovo PB2-690Y/*\"},{\"ua\":\"Lenovo PB2-690Y\"}],\"dpi\":[457.2,454.713],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"LGE/*/Nexus 5X/*\"},{\"ua\":\"Nexus 5X\"}],\"dpi\":[422,419.9],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"LGE/*/LGMS345/*\"},{\"ua\":\"LGMS345\"}],\"dpi\":[221.7,219.1],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"LGE/*/LG-D800/*\"},{\"ua\":\"LG-D800\"}],\"dpi\":[422,424.1],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"LGE/*/LG-D850/*\"},{\"ua\":\"LG-D850\"}],\"dpi\":[537.9,541.9],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"LGE/*/VS985 4G/*\"},{\"ua\":\"VS985 4G\"}],\"dpi\":[537.9,535.6],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"LGE/*/Nexus 5/*\"},{\"ua\":\"Nexus 5 B\"}],\"dpi\":[442.4,444.8],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"LGE/*/Nexus 4/*\"},{\"ua\":\"Nexus 4\"}],\"dpi\":[319.8,318.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"LGE/*/LG-P769/*\"},{\"ua\":\"LG-P769\"}],\"dpi\":[240.6,247.5],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"LGE/*/LGMS323/*\"},{\"ua\":\"LGMS323\"}],\"dpi\":[206.6,204.6],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"LGE/*/LGLS996/*\"},{\"ua\":\"LGLS996\"}],\"dpi\":[403.4,401.5],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Micromax/*/4560MMX/*\"},{\"ua\":\"4560MMX\"}],\"dpi\":[240,219.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Micromax/*/A250/*\"},{\"ua\":\"Micromax A250\"}],\"dpi\":[480,446.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Micromax/*/Micromax AQ4501/*\"},{\"ua\":\"Micromax AQ4501\"}],\"dpi\":240,\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/DROID RAZR/*\"},{\"ua\":\"DROID RAZR\"}],\"dpi\":[368.1,256.7],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/XT830C/*\"},{\"ua\":\"XT830C\"}],\"dpi\":[254,255.9],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/XT1021/*\"},{\"ua\":\"XT1021\"}],\"dpi\":[254,256.7],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/XT1023/*\"},{\"ua\":\"XT1023\"}],\"dpi\":[254,256.7],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/XT1028/*\"},{\"ua\":\"XT1028\"}],\"dpi\":[326.6,327.6],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/XT1034/*\"},{\"ua\":\"XT1034\"}],\"dpi\":[326.6,328.4],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/XT1053/*\"},{\"ua\":\"XT1053\"}],\"dpi\":[315.3,316.1],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/XT1562/*\"},{\"ua\":\"XT1562\"}],\"dpi\":[403.4,402.7],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/Nexus 6/*\"},{\"ua\":\"Nexus 6 B\"}],\"dpi\":[494.3,489.7],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/XT1063/*\"},{\"ua\":\"XT1063\"}],\"dpi\":[295,296.6],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/XT1064/*\"},{\"ua\":\"XT1064\"}],\"dpi\":[295,295.6],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/XT1092/*\"},{\"ua\":\"XT1092\"}],\"dpi\":[422,424.1],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/XT1095/*\"},{\"ua\":\"XT1095\"}],\"dpi\":[422,423.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"motorola/*/G4/*\"},{\"ua\":\"Moto G (4)\"}],\"dpi\":401,\"bw\":4,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"OnePlus/*/A0001/*\"},{\"ua\":\"A0001\"}],\"dpi\":[403.4,401],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"OnePlus/*/ONE E1005/*\"},{\"ua\":\"ONE E1005\"}],\"dpi\":[442.4,441.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"OnePlus/*/ONE A2005/*\"},{\"ua\":\"ONE A2005\"}],\"dpi\":[391.9,405.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"OPPO/*/X909/*\"},{\"ua\":\"X909\"}],\"dpi\":[442.4,444.1],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/GT-I9082/*\"},{\"ua\":\"GT-I9082\"}],\"dpi\":[184.7,185.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G360P/*\"},{\"ua\":\"SM-G360P\"}],\"dpi\":[196.7,205.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/Nexus S/*\"},{\"ua\":\"Nexus S\"}],\"dpi\":[234.5,229.8],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/GT-I9300/*\"},{\"ua\":\"GT-I9300\"}],\"dpi\":[304.8,303.9],\"bw\":5,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-T230NU/*\"},{\"ua\":\"SM-T230NU\"}],\"dpi\":216,\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SGH-T399/*\"},{\"ua\":\"SGH-T399\"}],\"dpi\":[217.7,231.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SGH-M919/*\"},{\"ua\":\"SGH-M919\"}],\"dpi\":[440.8,437.7],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-N9005/*\"},{\"ua\":\"SM-N9005\"}],\"dpi\":[386.4,387],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SAMSUNG-SM-N900A/*\"},{\"ua\":\"SAMSUNG-SM-N900A\"}],\"dpi\":[386.4,387.7],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/GT-I9500/*\"},{\"ua\":\"GT-I9500\"}],\"dpi\":[442.5,443.3],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/GT-I9505/*\"},{\"ua\":\"GT-I9505\"}],\"dpi\":439.4,\"bw\":4,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G900F/*\"},{\"ua\":\"SM-G900F\"}],\"dpi\":[415.6,431.6],\"bw\":5,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G900M/*\"},{\"ua\":\"SM-G900M\"}],\"dpi\":[415.6,431.6],\"bw\":5,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G800F/*\"},{\"ua\":\"SM-G800F\"}],\"dpi\":326.8,\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G906S/*\"},{\"ua\":\"SM-G906S\"}],\"dpi\":[562.7,572.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/GT-I9300/*\"},{\"ua\":\"GT-I9300\"}],\"dpi\":[306.7,304.8],\"bw\":5,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-T535/*\"},{\"ua\":\"SM-T535\"}],\"dpi\":[142.6,136.4],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-N920C/*\"},{\"ua\":\"SM-N920C\"}],\"dpi\":[515.1,518.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-N920W8/*\"},{\"ua\":\"SM-N920W8\"}],\"dpi\":[515.1,518.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/GT-I9300I/*\"},{\"ua\":\"GT-I9300I\"}],\"dpi\":[304.8,305.8],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/GT-I9195/*\"},{\"ua\":\"GT-I9195\"}],\"dpi\":[249.4,256.7],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SPH-L520/*\"},{\"ua\":\"SPH-L520\"}],\"dpi\":[249.4,255.9],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SAMSUNG-SGH-I717/*\"},{\"ua\":\"SAMSUNG-SGH-I717\"}],\"dpi\":285.8,\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SPH-D710/*\"},{\"ua\":\"SPH-D710\"}],\"dpi\":[217.7,204.2],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/GT-N7100/*\"},{\"ua\":\"GT-N7100\"}],\"dpi\":265.1,\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SCH-I605/*\"},{\"ua\":\"SCH-I605\"}],\"dpi\":265.1,\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/Galaxy Nexus/*\"},{\"ua\":\"Galaxy Nexus\"}],\"dpi\":[315.3,314.2],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-N910H/*\"},{\"ua\":\"SM-N910H\"}],\"dpi\":[515.1,518],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-N910C/*\"},{\"ua\":\"SM-N910C\"}],\"dpi\":[515.2,520.2],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G130M/*\"},{\"ua\":\"SM-G130M\"}],\"dpi\":[165.9,164.8],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G928I/*\"},{\"ua\":\"SM-G928I\"}],\"dpi\":[515.1,518.4],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G920F/*\"},{\"ua\":\"SM-G920F\"}],\"dpi\":580.6,\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G920P/*\"},{\"ua\":\"SM-G920P\"}],\"dpi\":[522.5,577],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G925F/*\"},{\"ua\":\"SM-G925F\"}],\"dpi\":580.6,\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G925V/*\"},{\"ua\":\"SM-G925V\"}],\"dpi\":[522.5,576.6],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G930F/*\"},{\"ua\":\"SM-G930F\"}],\"dpi\":576.6,\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G935F/*\"},{\"ua\":\"SM-G935F\"}],\"dpi\":533,\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G950F/*\"},{\"ua\":\"SM-G950F\"}],\"dpi\":[562.707,565.293],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"samsung/*/SM-G955U/*\"},{\"ua\":\"SM-G955U\"}],\"dpi\":[522.514,525.762],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Sony/*/C6903/*\"},{\"ua\":\"C6903\"}],\"dpi\":[442.5,443.3],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Sony/*/D6653/*\"},{\"ua\":\"D6653\"}],\"dpi\":[428.6,427.6],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Sony/*/E6653/*\"},{\"ua\":\"E6653\"}],\"dpi\":[428.6,425.7],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Sony/*/E6853/*\"},{\"ua\":\"E6853\"}],\"dpi\":[403.4,401.9],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"Sony/*/SGP321/*\"},{\"ua\":\"SGP321\"}],\"dpi\":[224.7,224.1],\"bw\":3,\"ac\":500},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"TCT/*/ALCATEL ONE TOUCH Fierce/*\"},{\"ua\":\"ALCATEL ONE TOUCH Fierce\"}],\"dpi\":[240,247.5],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"THL/*/thl 5000/*\"},{\"ua\":\"thl 5000\"}],\"dpi\":[480,443.3],\"bw\":3,\"ac\":1000},{\"type\":\"android\",\"rules\":[{\"mdmh\":\"ZTE/*/ZTE Blade L2/*\"},{\"ua\":\"ZTE Blade L2\"}],\"dpi\":240,\"bw\":3,\"ac\":500},{\"type\":\"ios\",\"rules\":[{\"res\":[640,960]}],\"dpi\":[325.1,328.4],\"bw\":4,\"ac\":1000},{\"type\":\"ios\",\"rules\":[{\"res\":[640,1136]}],\"dpi\":[317.1,320.2],\"bw\":3,\"ac\":1000},{\"type\":\"ios\",\"rules\":[{\"res\":[750,1334]}],\"dpi\":326.4,\"bw\":4,\"ac\":1000},{\"type\":\"ios\",\"rules\":[{\"res\":[1242,2208]}],\"dpi\":[453.6,458.4],\"bw\":4,\"ac\":1000},{\"type\":\"ios\",\"rules\":[{\"res\":[1125,2001]}],\"dpi\":[410.9,415.4],\"bw\":4,\"ac\":1000}]}\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * Copyright 2015 Google Inc. 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 */\nvar ComplementaryFilter = __webpack_require__(15);\nvar PosePredictor = __webpack_require__(17);\nvar TouchPanner = __webpack_require__(18);\nvar MathUtil = __webpack_require__(2);\nvar Util = __webpack_require__(0);\n\n/**\n * The pose sensor, implemented using DeviceMotion APIs.\n */\nfunction FusionPoseSensor() {\n  this.deviceId = 'webvr-polyfill:fused';\n  this.deviceName = 'VR Position Device (webvr-polyfill:fused)';\n\n  this.accelerometer = new MathUtil.Vector3();\n  this.gyroscope = new MathUtil.Vector3();\n\n  this.start();\n\n  this.filter = new ComplementaryFilter(window.WebVRConfig.K_FILTER);\n  this.posePredictor = new PosePredictor(window.WebVRConfig.PREDICTION_TIME_S);\n  this.touchPanner = new TouchPanner();\n\n  this.filterToWorldQ = new MathUtil.Quaternion();\n\n  // Set the filter to world transform, depending on OS.\n  if (Util.isIOS()) {\n    this.filterToWorldQ.setFromAxisAngle(new MathUtil.Vector3(1, 0, 0), Math.PI / 2);\n  } else {\n    this.filterToWorldQ.setFromAxisAngle(new MathUtil.Vector3(1, 0, 0), -Math.PI / 2);\n  }\n\n  this.inverseWorldToScreenQ = new MathUtil.Quaternion();\n  this.worldToScreenQ = new MathUtil.Quaternion();\n  this.originalPoseAdjustQ = new MathUtil.Quaternion();\n  this.originalPoseAdjustQ.setFromAxisAngle(new MathUtil.Vector3(0, 0, 1),\n                                           -window.orientation * Math.PI / 180);\n\n  this.setScreenTransform_();\n  // Adjust this filter for being in landscape mode.\n  if (Util.isLandscapeMode()) {\n    this.filterToWorldQ.multiply(this.inverseWorldToScreenQ);\n  }\n\n  // Keep track of a reset transform for resetSensor.\n  this.resetQ = new MathUtil.Quaternion();\n\n  this.isFirefoxAndroid = Util.isFirefoxAndroid();\n  this.isIOS = Util.isIOS();\n\n  this.orientationOut_ = new Float32Array(4);\n}\n\nFusionPoseSensor.prototype.getPosition = function() {\n  // This PoseSensor doesn't support position\n  return null;\n};\n\nFusionPoseSensor.prototype.getOrientation = function() {\n  // Convert from filter space to the the same system used by the\n  // deviceorientation event.\n  var orientation = this.filter.getOrientation();\n\n  // Predict orientation.\n  this.predictedQ = this.posePredictor.getPrediction(orientation, this.gyroscope, this.previousTimestampS);\n\n  // Convert to THREE coordinate system: -Z forward, Y up, X right.\n  var out = new MathUtil.Quaternion();\n  out.copy(this.filterToWorldQ);\n  out.multiply(this.resetQ);\n  if (!window.WebVRConfig.TOUCH_PANNER_DISABLED) {\n    out.multiply(this.touchPanner.getOrientation());\n  }\n  out.multiply(this.predictedQ);\n  out.multiply(this.worldToScreenQ);\n\n  // Handle the yaw-only case.\n  if (window.WebVRConfig.YAW_ONLY) {\n    // Make a quaternion that only turns around the Y-axis.\n    out.x = 0;\n    out.z = 0;\n    out.normalize();\n  }\n\n  this.orientationOut_[0] = out.x;\n  this.orientationOut_[1] = out.y;\n  this.orientationOut_[2] = out.z;\n  this.orientationOut_[3] = out.w;\n  return this.orientationOut_;\n};\n\nFusionPoseSensor.prototype.resetPose = function() {\n  // Reduce to inverted yaw-only.\n  this.resetQ.copy(this.filter.getOrientation());\n  this.resetQ.x = 0;\n  this.resetQ.y = 0;\n  this.resetQ.z *= -1;\n  this.resetQ.normalize();\n\n  // Take into account extra transformations in landscape mode.\n  if (Util.isLandscapeMode()) {\n    this.resetQ.multiply(this.inverseWorldToScreenQ);\n  }\n\n  // Take into account original pose.\n  this.resetQ.multiply(this.originalPoseAdjustQ);\n\n  if (!window.WebVRConfig.TOUCH_PANNER_DISABLED) {\n    this.touchPanner.resetSensor();\n  }\n};\n\nFusionPoseSensor.prototype.onDeviceMotion_ = function(deviceMotion) {\n  this.updateDeviceMotion_(deviceMotion);\n};\n\nFusionPoseSensor.prototype.updateDeviceMotion_ = function(deviceMotion) {\n  var accGravity = deviceMotion.accelerationIncludingGravity;\n  var rotRate = deviceMotion.rotationRate;\n  var timestampS = deviceMotion.timeStamp / 1000;\n\n  var deltaS = timestampS - this.previousTimestampS;\n  if (deltaS <= Util.MIN_TIMESTEP || deltaS > Util.MAX_TIMESTEP) {\n    console.warn('Invalid timestamps detected. Time step between successive ' +\n                 'gyroscope sensor samples is very small or not monotonic');\n    this.previousTimestampS = timestampS;\n    return;\n  }\n\n  this.accelerometer.set(-accGravity.x, -accGravity.y, -accGravity.z);\n  if (Util.isR7()) {\n    this.gyroscope.set(-rotRate.beta, rotRate.alpha, rotRate.gamma);\n  } else {\n    this.gyroscope.set(rotRate.alpha, rotRate.beta, rotRate.gamma);\n  }\n\n  // With iOS and Firefox Android, rotationRate is reported in degrees,\n  // so we first convert to radians.\n  if (this.isIOS || this.isFirefoxAndroid) {\n    this.gyroscope.multiplyScalar(Math.PI / 180);\n  }\n\n  this.filter.addAccelMeasurement(this.accelerometer, timestampS);\n  this.filter.addGyroMeasurement(this.gyroscope, timestampS);\n\n  this.previousTimestampS = timestampS;\n};\n\nFusionPoseSensor.prototype.onOrientationChange_ = function(screenOrientation) {\n  this.setScreenTransform_();\n};\n\n/**\n * This is only needed if we are in an cross origin iframe on iOS to work around\n * this issue: https://bugs.webkit.org/show_bug.cgi?id=152299.\n */\nFusionPoseSensor.prototype.onMessage_ = function(event) {\n  var message = event.data;\n  \n  // If there's no message type, ignore it.\n  if (!message || !message.type) {\n    return;\n  }\n\n  // Ignore all messages that aren't devicemotion.\n  var type = message.type.toLowerCase();\n\n  if (type === 'devicemotion')\n    this.updateDeviceMotion_(message.deviceMotionEvent);\n  \n  if (type === 'orientationchange')\n    this.setScreenTransform_(message.orientation)\n};\n\nFusionPoseSensor.prototype.setScreenTransform_ = function(orientation) {\n  orientation = orientation || window.orientation\n  this.worldToScreenQ.set(0, 0, 0, 1);\n  switch (orientation) {\n    case 0:\n      break;\n    case 90:\n      this.worldToScreenQ.setFromAxisAngle(new MathUtil.Vector3(0, 0, 1), -Math.PI / 2);\n      break;\n    case -90:\n      this.worldToScreenQ.setFromAxisAngle(new MathUtil.Vector3(0, 0, 1), Math.PI / 2);\n      break;\n    case 180:\n      // TODO.\n      break;\n  }\n  this.inverseWorldToScreenQ.copy(this.worldToScreenQ);\n  this.inverseWorldToScreenQ.inverse();\n};\n\nFusionPoseSensor.prototype.start = function() {\n  this.onDeviceMotionCallback_ = this.onDeviceMotion_.bind(this);\n  this.onOrientationChangeCallback_ = this.onOrientationChange_.bind(this);\n  this.onMessageCallback_ = this.onMessage_.bind(this);\n\n  // Only listen for postMessages if we're in an iOS and embedded inside a cross\n  // domain IFrame. In this case, the polyfill can still work if the containing\n  // page sends synthetic devicemotion events. For an example of this, see\n  // iframe-message-sender.js in VR View: https://goo.gl/XDtvFZ\n  if (Util.isInsideCrossDomainIFrame()) {\n    window.addEventListener('message', this.onMessageCallback_);\n  } else {\n    window.addEventListener('orientationchange', this.onOrientationChangeCallback_);\n    window.addEventListener('devicemotion', this.onDeviceMotionCallback_);\n  }\n};\n\nFusionPoseSensor.prototype.stop = function() {\n  window.removeEventListener('devicemotion', this.onDeviceMotionCallback_);\n  window.removeEventListener('orientationchange', this.onOrientationChangeCallback_);\n  window.removeEventListener('message', this.onMessageCallback_);\n};\n\nmodule.exports = FusionPoseSensor;\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * Copyright 2015 Google Inc. 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\nvar SensorSample = __webpack_require__(16);\nvar MathUtil = __webpack_require__(2);\nvar Util = __webpack_require__(0);\n\n/**\n * An implementation of a simple complementary filter, which fuses gyroscope and\n * accelerometer data from the 'devicemotion' event.\n *\n * Accelerometer data is very noisy, but stable over the long term.\n * Gyroscope data is smooth, but tends to drift over the long term.\n *\n * This fusion is relatively simple:\n * 1. Get orientation estimates from accelerometer by applying a low-pass filter\n *    on that data.\n * 2. Get orientation estimates from gyroscope by integrating over time.\n * 3. Combine the two estimates, weighing (1) in the long term, but (2) for the\n *    short term.\n */\nfunction ComplementaryFilter(kFilter) {\n  this.kFilter = kFilter;\n\n  // Raw sensor measurements.\n  this.currentAccelMeasurement = new SensorSample();\n  this.currentGyroMeasurement = new SensorSample();\n  this.previousGyroMeasurement = new SensorSample();\n\n  // Set default look direction to be in the correct direction.\n  if (Util.isIOS()) {\n    this.filterQ = new MathUtil.Quaternion(-1, 0, 0, 1);\n  } else {\n    this.filterQ = new MathUtil.Quaternion(1, 0, 0, 1);\n  }\n  this.previousFilterQ = new MathUtil.Quaternion();\n  this.previousFilterQ.copy(this.filterQ);\n\n  // Orientation based on the accelerometer.\n  this.accelQ = new MathUtil.Quaternion();\n  // Whether or not the orientation has been initialized.\n  this.isOrientationInitialized = false;\n  // Running estimate of gravity based on the current orientation.\n  this.estimatedGravity = new MathUtil.Vector3();\n  // Measured gravity based on accelerometer.\n  this.measuredGravity = new MathUtil.Vector3();\n\n  // Debug only quaternion of gyro-based orientation.\n  this.gyroIntegralQ = new MathUtil.Quaternion();\n}\n\nComplementaryFilter.prototype.addAccelMeasurement = function(vector, timestampS) {\n  this.currentAccelMeasurement.set(vector, timestampS);\n};\n\nComplementaryFilter.prototype.addGyroMeasurement = function(vector, timestampS) {\n  this.currentGyroMeasurement.set(vector, timestampS);\n\n  var deltaT = timestampS - this.previousGyroMeasurement.timestampS;\n  if (Util.isTimestampDeltaValid(deltaT)) {\n    this.run_();\n  }\n\n  this.previousGyroMeasurement.copy(this.currentGyroMeasurement);\n};\n\nComplementaryFilter.prototype.run_ = function() {\n\n  if (!this.isOrientationInitialized) {\n    this.accelQ = this.accelToQuaternion_(this.currentAccelMeasurement.sample);\n    this.previousFilterQ.copy(this.accelQ);\n    this.isOrientationInitialized = true;\n    return;\n  }\n\n  var deltaT = this.currentGyroMeasurement.timestampS -\n      this.previousGyroMeasurement.timestampS;\n\n  // Convert gyro rotation vector to a quaternion delta.\n  var gyroDeltaQ = this.gyroToQuaternionDelta_(this.currentGyroMeasurement.sample, deltaT);\n  this.gyroIntegralQ.multiply(gyroDeltaQ);\n\n  // filter_1 = K * (filter_0 + gyro * dT) + (1 - K) * accel.\n  this.filterQ.copy(this.previousFilterQ);\n  this.filterQ.multiply(gyroDeltaQ);\n\n  // Calculate the delta between the current estimated gravity and the real\n  // gravity vector from accelerometer.\n  var invFilterQ = new MathUtil.Quaternion();\n  invFilterQ.copy(this.filterQ);\n  invFilterQ.inverse();\n\n  this.estimatedGravity.set(0, 0, -1);\n  this.estimatedGravity.applyQuaternion(invFilterQ);\n  this.estimatedGravity.normalize();\n\n  this.measuredGravity.copy(this.currentAccelMeasurement.sample);\n  this.measuredGravity.normalize();\n\n  // Compare estimated gravity with measured gravity, get the delta quaternion\n  // between the two.\n  var deltaQ = new MathUtil.Quaternion();\n  deltaQ.setFromUnitVectors(this.estimatedGravity, this.measuredGravity);\n  deltaQ.inverse();\n\n  if (Util.isDebug()) {\n    console.log('Delta: %d deg, G_est: (%s, %s, %s), G_meas: (%s, %s, %s)',\n                MathUtil.radToDeg * Util.getQuaternionAngle(deltaQ),\n                (this.estimatedGravity.x).toFixed(1),\n                (this.estimatedGravity.y).toFixed(1),\n                (this.estimatedGravity.z).toFixed(1),\n                (this.measuredGravity.x).toFixed(1),\n                (this.measuredGravity.y).toFixed(1),\n                (this.measuredGravity.z).toFixed(1));\n  }\n\n  // Calculate the SLERP target: current orientation plus the measured-estimated\n  // quaternion delta.\n  var targetQ = new MathUtil.Quaternion();\n  targetQ.copy(this.filterQ);\n  targetQ.multiply(deltaQ);\n\n  // SLERP factor: 0 is pure gyro, 1 is pure accel.\n  this.filterQ.slerp(targetQ, 1 - this.kFilter);\n\n  this.previousFilterQ.copy(this.filterQ);\n};\n\nComplementaryFilter.prototype.getOrientation = function() {\n  return this.filterQ;\n};\n\nComplementaryFilter.prototype.accelToQuaternion_ = function(accel) {\n  var normAccel = new MathUtil.Vector3();\n  normAccel.copy(accel);\n  normAccel.normalize();\n  var quat = new MathUtil.Quaternion();\n  quat.setFromUnitVectors(new MathUtil.Vector3(0, 0, -1), normAccel);\n  quat.inverse();\n  return quat;\n};\n\nComplementaryFilter.prototype.gyroToQuaternionDelta_ = function(gyro, dt) {\n  // Extract axis and angle from the gyroscope data.\n  var quat = new MathUtil.Quaternion();\n  var axis = new MathUtil.Vector3();\n  axis.copy(gyro);\n  axis.normalize();\n  quat.setFromAxisAngle(axis, gyro.length() * dt);\n  return quat;\n};\n\n\nmodule.exports = ComplementaryFilter;\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports) {\n\nfunction SensorSample(sample, timestampS) {\n  this.set(sample, timestampS);\n};\n\nSensorSample.prototype.set = function(sample, timestampS) {\n  this.sample = sample;\n  this.timestampS = timestampS;\n};\n\nSensorSample.prototype.copy = function(sensorSample) {\n  this.set(sensorSample.sample, sensorSample.timestampS);\n};\n\nmodule.exports = SensorSample;\n\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * Copyright 2015 Google Inc. 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 */\nvar MathUtil = __webpack_require__(2);\nvar Util = __webpack_require__(0);\n\n/**\n * Given an orientation and the gyroscope data, predicts the future orientation\n * of the head. This makes rendering appear faster.\n *\n * Also see: http://msl.cs.uiuc.edu/~lavalle/papers/LavYerKatAnt14.pdf\n *\n * @param {Number} predictionTimeS time from head movement to the appearance of\n * the corresponding image.\n */\nfunction PosePredictor(predictionTimeS) {\n  this.predictionTimeS = predictionTimeS;\n\n  // The quaternion corresponding to the previous state.\n  this.previousQ = new MathUtil.Quaternion();\n  // Previous time a prediction occurred.\n  this.previousTimestampS = null;\n\n  // The delta quaternion that adjusts the current pose.\n  this.deltaQ = new MathUtil.Quaternion();\n  // The output quaternion.\n  this.outQ = new MathUtil.Quaternion();\n}\n\nPosePredictor.prototype.getPrediction = function(currentQ, gyro, timestampS) {\n  if (!this.previousTimestampS) {\n    this.previousQ.copy(currentQ);\n    this.previousTimestampS = timestampS;\n    return currentQ;\n  }\n\n  // Calculate axis and angle based on gyroscope rotation rate data.\n  var axis = new MathUtil.Vector3();\n  axis.copy(gyro);\n  axis.normalize();\n\n  var angularSpeed = gyro.length();\n\n  // If we're rotating slowly, don't do prediction.\n  if (angularSpeed < MathUtil.degToRad * 20) {\n    if (Util.isDebug()) {\n      console.log('Moving slowly, at %s deg/s: no prediction',\n                  (MathUtil.radToDeg * angularSpeed).toFixed(1));\n    }\n    this.outQ.copy(currentQ);\n    this.previousQ.copy(currentQ);\n    return this.outQ;\n  }\n\n  // Get the predicted angle based on the time delta and latency.\n  var deltaT = timestampS - this.previousTimestampS;\n  var predictAngle = angularSpeed * this.predictionTimeS;\n\n  this.deltaQ.setFromAxisAngle(axis, predictAngle);\n  this.outQ.copy(this.previousQ);\n  this.outQ.multiply(this.deltaQ);\n\n  this.previousQ.copy(currentQ);\n  this.previousTimestampS = timestampS;\n\n  return this.outQ;\n};\n\n\nmodule.exports = PosePredictor;\n\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * Copyright 2015 Google Inc. 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 */\nvar MathUtil = __webpack_require__(2);\nvar Util = __webpack_require__(0);\n\nvar ROTATE_SPEED = 0.5;\n/**\n * Provides a quaternion responsible for pre-panning the scene before further\n * transformations due to device sensors.\n */\nfunction TouchPanner() {\n  window.addEventListener('touchstart', this.onTouchStart_.bind(this));\n  window.addEventListener('touchmove', this.onTouchMove_.bind(this));\n  window.addEventListener('touchend', this.onTouchEnd_.bind(this));\n\n  this.isTouching = false;\n  this.rotateStart = new MathUtil.Vector2();\n  this.rotateEnd = new MathUtil.Vector2();\n  this.rotateDelta = new MathUtil.Vector2();\n\n  this.theta = 0;\n  this.orientation = new MathUtil.Quaternion();\n}\n\nTouchPanner.prototype.getOrientation = function() {\n  this.orientation.setFromEulerXYZ(0, 0, this.theta);\n  return this.orientation;\n};\n\nTouchPanner.prototype.resetSensor = function() {\n  this.theta = 0;\n};\n\nTouchPanner.prototype.onTouchStart_ = function(e) {\n  if (('shouldRotateStart' in this) && !this.shouldRotateStart(e))\n    return\n  // Only respond if there is exactly one touch.\n  // Note that the Daydream controller passes in a `touchstart` event with\n  // no `touches` property, so we must check for that case too.\n  if (!e.touches || e.touches.length != 1) {\n    return;\n  }\n  this.rotateStart.set(e.touches[0].pageX, e.touches[0].pageY);\n  this.isTouching = true;\n};\n\nTouchPanner.prototype.onTouchMove_ = function(e) {\n  if (!this.isTouching) {\n    return;\n  }\n  this.rotateEnd.set(e.touches[0].pageX, e.touches[0].pageY);\n  this.rotateDelta.subVectors(this.rotateEnd, this.rotateStart);\n  this.rotateStart.copy(this.rotateEnd);\n\n  // On iOS, direction is inverted.\n  if (Util.isIOS()) {\n    this.rotateDelta.x *= -1;\n  }\n\n  var size = this.getDimensions();\n  this.theta += 2 * Math.PI * this.rotateDelta.x / size.width * ROTATE_SPEED;\n};\n\nTouchPanner.prototype.onTouchEnd_ = function(e) {\n  this.isTouching = false;\n};\n\nTouchPanner.prototype.getDimensions = function() {\n  var body = document.body\n  return {\n    width: body.clientWidth,\n    height: body.clientHeight\n  }\n}\nmodule.exports = TouchPanner;\n\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * Copyright 2015 Google Inc. 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\nvar Util = __webpack_require__(0);\n\nfunction RotateInstructions() {\n  this.loadIcon_();\n\n  var overlay = document.createElement('div');\n  var s = overlay.style;\n  s.position = 'fixed';\n  s.top = 0;\n  s.right = 0;\n  s.bottom = 0;\n  s.left = 0;\n  s.backgroundColor = 'gray';\n  s.fontFamily = 'sans-serif';\n  // Force this to be above the fullscreen canvas, which is at zIndex: 999999.\n  s.zIndex = 1000000;\n\n  var img = document.createElement('img');\n  img.src = this.icon;\n  var s = img.style;\n  s.marginLeft = '25%';\n  s.marginTop = '25%';\n  s.width = '50%';\n  overlay.appendChild(img);\n\n  var text = document.createElement('div');\n  var s = text.style;\n  s.textAlign = 'center';\n  s.fontSize = '16px';\n  s.lineHeight = '24px';\n  s.margin = '24px 25%';\n  s.width = '50%';\n  text.innerHTML = 'Place your phone into your Cardboard viewer.';\n  overlay.appendChild(text);\n\n  var snackbar = document.createElement('div');\n  var s = snackbar.style;\n  s.backgroundColor = '#CFD8DC';\n  s.position = 'fixed';\n  s.bottom = 0;\n  s.width = '100%';\n  s.height = '48px';\n  s.padding = '14px 24px';\n  s.boxSizing = 'border-box';\n  s.color = '#656A6B';\n  overlay.appendChild(snackbar);\n\n  var snackbarText = document.createElement('div');\n  snackbarText.style.float = 'left';\n  snackbarText.innerHTML = 'No Cardboard viewer?';\n\n  var snackbarButton = document.createElement('a');\n  snackbarButton.href = 'https://www.google.com/get/cardboard/get-cardboard/';\n  snackbarButton.innerHTML = 'get one';\n  snackbarButton.target = '_blank';\n  var s = snackbarButton.style;\n  s.float = 'right';\n  s.fontWeight = 600;\n  s.textTransform = 'uppercase';\n  s.borderLeft = '1px solid gray';\n  s.paddingLeft = '24px';\n  s.textDecoration = 'none';\n  s.color = '#656A6B';\n\n  snackbar.appendChild(snackbarText);\n  snackbar.appendChild(snackbarButton);\n\n  this.overlay = overlay;\n  this.text = text;\n\n  this.hide();\n}\n\nRotateInstructions.prototype.show = function(parent) {\n  if (!parent && !this.overlay.parentElement) {\n    document.body.appendChild(this.overlay);\n  } else if (parent) {\n    if (this.overlay.parentElement && this.overlay.parentElement != parent)\n      this.overlay.parentElement.removeChild(this.overlay);\n\n    parent.appendChild(this.overlay);\n  }\n\n  this.overlay.style.display = 'block';\n\n  var img = this.overlay.querySelector('img');\n  var s = img.style;\n\n  if (Util.isLandscapeMode()) {\n    s.width = '20%';\n    s.marginLeft = '40%';\n    s.marginTop = '3%';\n  } else {\n    s.width = '50%';\n    s.marginLeft = '25%';\n    s.marginTop = '25%';\n  }\n  window.dispatchEvent(new CustomEvent('vrinstructionsshown'))\n};\n\nRotateInstructions.prototype.hide = function() {\n  this.overlay.style.display = 'none';\n  window.dispatchEvent(new CustomEvent('vrinstructionshidden'))\n};\n\nRotateInstructions.prototype.showTemporarily = function(ms, parent) {\n  this.show(parent);\n  this.timer = setTimeout(this.hide.bind(this), ms);\n};\n\nRotateInstructions.prototype.disableShowTemporarily = function() {\n  clearTimeout(this.timer);\n};\n\nRotateInstructions.prototype.update = function() {\n  this.disableShowTemporarily();\n  // In portrait VR mode, tell the user to rotate to landscape. Otherwise, hide\n  // the instructions.\n  if (!Util.isLandscapeMode() && Util.isMobile()) {\n    this.show();\n  } else {\n    this.hide();\n  }\n};\n\nRotateInstructions.prototype.loadIcon_ = function() {\n  // Encoded asset_src/rotate-instructions.svg\n  this.icon = Util.base64('image/svg+xml', 'PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Cjxzdmcgd2lkdGg9IjE5OHB4IiBoZWlnaHQ9IjI0MHB4IiB2aWV3Qm94PSIwIDAgMTk4IDI0MCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bWxuczpza2V0Y2g9Imh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29tL3NrZXRjaC9ucyI+CiAgICA8IS0tIEdlbmVyYXRvcjogU2tldGNoIDMuMy4zICgxMjA4MSkgLSBodHRwOi8vd3d3LmJvaGVtaWFuY29kaW5nLmNvbS9za2V0Y2ggLS0+CiAgICA8dGl0bGU+dHJhbnNpdGlvbjwvdGl0bGU+CiAgICA8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KICAgIDxkZWZzPjwvZGVmcz4KICAgIDxnIGlkPSJQYWdlLTEiIHN0cm9rZT0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIxIiBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiIHNrZXRjaDp0eXBlPSJNU1BhZ2UiPgogICAgICAgIDxnIGlkPSJ0cmFuc2l0aW9uIiBza2V0Y2g6dHlwZT0iTVNBcnRib2FyZEdyb3VwIj4KICAgICAgICAgICAgPGcgaWQ9IkltcG9ydGVkLUxheWVycy1Db3B5LTQtKy1JbXBvcnRlZC1MYXllcnMtQ29weS0rLUltcG9ydGVkLUxheWVycy1Db3B5LTItQ29weSIgc2tldGNoOnR5cGU9Ik1TTGF5ZXJHcm91cCI+CiAgICAgICAgICAgICAgICA8ZyBpZD0iSW1wb3J0ZWQtTGF5ZXJzLUNvcHktNCIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMC4wMDAwMDAsIDEwNy4wMDAwMDApIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTQ5LjYyNSwyLjUyNyBDMTQ5LjYyNSwyLjUyNyAxNTUuODA1LDYuMDk2IDE1Ni4zNjIsNi40MTggTDE1Ni4zNjIsNy4zMDQgQzE1Ni4zNjIsNy40ODEgMTU2LjM3NSw3LjY2NCAxNTYuNCw3Ljg1MyBDMTU2LjQxLDcuOTM0IDE1Ni40Miw4LjAxNSAxNTYuNDI3LDguMDk1IEMxNTYuNTY3LDkuNTEgMTU3LjQwMSwxMS4wOTMgMTU4LjUzMiwxMi4wOTQgTDE2NC4yNTIsMTcuMTU2IEwxNjQuMzMzLDE3LjA2NiBDMTY0LjMzMywxNy4wNjYgMTY4LjcxNSwxNC41MzYgMTY5LjU2OCwxNC4wNDIgQzE3MS4wMjUsMTQuODgzIDE5NS41MzgsMjkuMDM1IDE5NS41MzgsMjkuMDM1IEwxOTUuNTM4LDgzLjAzNiBDMTk1LjUzOCw4My44MDcgMTk1LjE1Miw4NC4yNTMgMTk0LjU5LDg0LjI1MyBDMTk0LjM1Nyw4NC4yNTMgMTk0LjA5NSw4NC4xNzcgMTkzLjgxOCw4NC4wMTcgTDE2OS44NTEsNzAuMTc5IEwxNjkuODM3LDcwLjIwMyBMMTQyLjUxNSw4NS45NzggTDE0MS42NjUsODQuNjU1IEMxMzYuOTM0LDgzLjEyNiAxMzEuOTE3LDgxLjkxNSAxMjYuNzE0LDgxLjA0NSBDMTI2LjcwOSw4MS4wNiAxMjYuNzA3LDgxLjA2OSAxMjYuNzA3LDgxLjA2OSBMMTIxLjY0LDk4LjAzIEwxMTMuNzQ5LDEwMi41ODYgTDExMy43MTIsMTAyLjUyMyBMMTEzLjcxMiwxMzAuMTEzIEMxMTMuNzEyLDEzMC44ODUgMTEzLjMyNiwxMzEuMzMgMTEyLjc2NCwxMzEuMzMgQzExMi41MzIsMTMxLjMzIDExMi4yNjksMTMxLjI1NCAxMTEuOTkyLDEzMS4wOTQgTDY5LjUxOSwxMDYuNTcyIEM2OC41NjksMTA2LjAyMyA2Ny43OTksMTA0LjY5NSA2Ny43OTksMTAzLjYwNSBMNjcuNzk5LDEwMi41NyBMNjcuNzc4LDEwMi42MTcgQzY3LjI3LDEwMi4zOTMgNjYuNjQ4LDEwMi4yNDkgNjUuOTYyLDEwMi4yMTggQzY1Ljg3NSwxMDIuMjE0IDY1Ljc4OCwxMDIuMjEyIDY1LjcwMSwxMDIuMjEyIEM2NS42MDYsMTAyLjIxMiA2NS41MTEsMTAyLjIxNSA2NS40MTYsMTAyLjIxOSBDNjUuMTk1LDEwMi4yMjkgNjQuOTc0LDEwMi4yMzUgNjQuNzU0LDEwMi4yMzUgQzY0LjMzMSwxMDIuMjM1IDYzLjkxMSwxMDIuMjE2IDYzLjQ5OCwxMDIuMTc4IEM2MS44NDMsMTAyLjAyNSA2MC4yOTgsMTAxLjU3OCA1OS4wOTQsMTAwLjg4MiBMMTIuNTE4LDczLjk5MiBMMTIuNTIzLDc0LjAwNCBMMi4yNDUsNTUuMjU0IEMxLjI0NCw1My40MjcgMi4wMDQsNTEuMDM4IDMuOTQzLDQ5LjkxOCBMNTkuOTU0LDE3LjU3MyBDNjAuNjI2LDE3LjE4NSA2MS4zNSwxNy4wMDEgNjIuMDUzLDE3LjAwMSBDNjMuMzc5LDE3LjAwMSA2NC42MjUsMTcuNjYgNjUuMjgsMTguODU0IEw2NS4yODUsMTguODUxIEw2NS41MTIsMTkuMjY0IEw2NS41MDYsMTkuMjY4IEM2NS45MDksMjAuMDAzIDY2LjQwNSwyMC42OCA2Ni45ODMsMjEuMjg2IEw2Ny4yNiwyMS41NTYgQzY5LjE3NCwyMy40MDYgNzEuNzI4LDI0LjM1NyA3NC4zNzMsMjQuMzU3IEM3Ni4zMjIsMjQuMzU3IDc4LjMyMSwyMy44NCA4MC4xNDgsMjIuNzg1IEM4MC4xNjEsMjIuNzg1IDg3LjQ2NywxOC41NjYgODcuNDY3LDE4LjU2NiBDODguMTM5LDE4LjE3OCA4OC44NjMsMTcuOTk0IDg5LjU2NiwxNy45OTQgQzkwLjg5MiwxNy45OTQgOTIuMTM4LDE4LjY1MiA5Mi43OTIsMTkuODQ3IEw5Ni4wNDIsMjUuNzc1IEw5Ni4wNjQsMjUuNzU3IEwxMDIuODQ5LDI5LjY3NCBMMTAyLjc0NCwyOS40OTIgTDE0OS42MjUsMi41MjcgTTE0OS42MjUsMC44OTIgQzE0OS4zNDMsMC44OTIgMTQ5LjA2MiwwLjk2NSAxNDguODEsMS4xMSBMMTAyLjY0MSwyNy42NjYgTDk3LjIzMSwyNC41NDIgTDk0LjIyNiwxOS4wNjEgQzkzLjMxMywxNy4zOTQgOTEuNTI3LDE2LjM1OSA4OS41NjYsMTYuMzU4IEM4OC41NTUsMTYuMzU4IDg3LjU0NiwxNi42MzIgODYuNjQ5LDE3LjE1IEM4My44NzgsMTguNzUgNzkuNjg3LDIxLjE2OSA3OS4zNzQsMjEuMzQ1IEM3OS4zNTksMjEuMzUzIDc5LjM0NSwyMS4zNjEgNzkuMzMsMjEuMzY5IEM3Ny43OTgsMjIuMjU0IDc2LjA4NCwyMi43MjIgNzQuMzczLDIyLjcyMiBDNzIuMDgxLDIyLjcyMiA2OS45NTksMjEuODkgNjguMzk3LDIwLjM4IEw2OC4xNDUsMjAuMTM1IEM2Ny43MDYsMTkuNjcyIDY3LjMyMywxOS4xNTYgNjcuMDA2LDE4LjYwMSBDNjYuOTg4LDE4LjU1OSA2Ni45NjgsMTguNTE5IDY2Ljk0NiwxOC40NzkgTDY2LjcxOSwxOC4wNjUgQzY2LjY5LDE4LjAxMiA2Ni42NTgsMTcuOTYgNjYuNjI0LDE3LjkxMSBDNjUuNjg2LDE2LjMzNyA2My45NTEsMTUuMzY2IDYyLjA1MywxNS4zNjYgQzYxLjA0MiwxNS4zNjYgNjAuMDMzLDE1LjY0IDU5LjEzNiwxNi4xNTggTDMuMTI1LDQ4LjUwMiBDMC40MjYsNTAuMDYxIC0wLjYxMyw1My40NDIgMC44MTEsNTYuMDQgTDExLjA4OSw3NC43OSBDMTEuMjY2LDc1LjExMyAxMS41MzcsNzUuMzUzIDExLjg1LDc1LjQ5NCBMNTguMjc2LDEwMi4yOTggQzU5LjY3OSwxMDMuMTA4IDYxLjQzMywxMDMuNjMgNjMuMzQ4LDEwMy44MDYgQzYzLjgxMiwxMDMuODQ4IDY0LjI4NSwxMDMuODcgNjQuNzU0LDEwMy44NyBDNjUsMTAzLjg3IDY1LjI0OSwxMDMuODY0IDY1LjQ5NCwxMDMuODUyIEM2NS41NjMsMTAzLjg0OSA2NS42MzIsMTAzLjg0NyA2NS43MDEsMTAzLjg0NyBDNjUuNzY0LDEwMy44NDcgNjUuODI4LDEwMy44NDkgNjUuODksMTAzLjg1MiBDNjUuOTg2LDEwMy44NTYgNjYuMDgsMTAzLjg2MyA2Ni4xNzMsMTAzLjg3NCBDNjYuMjgyLDEwNS40NjcgNjcuMzMyLDEwNy4xOTcgNjguNzAyLDEwNy45ODggTDExMS4xNzQsMTMyLjUxIEMxMTEuNjk4LDEzMi44MTIgMTEyLjIzMiwxMzIuOTY1IDExMi43NjQsMTMyLjk2NSBDMTE0LjI2MSwxMzIuOTY1IDExNS4zNDcsMTMxLjc2NSAxMTUuMzQ3LDEzMC4xMTMgTDExNS4zNDcsMTAzLjU1MSBMMTIyLjQ1OCw5OS40NDYgQzEyMi44MTksOTkuMjM3IDEyMy4wODcsOTguODk4IDEyMy4yMDcsOTguNDk4IEwxMjcuODY1LDgyLjkwNSBDMTMyLjI3OSw4My43MDIgMTM2LjU1Nyw4NC43NTMgMTQwLjYwNyw4Ni4wMzMgTDE0MS4xNCw4Ni44NjIgQzE0MS40NTEsODcuMzQ2IDE0MS45NzcsODcuNjEzIDE0Mi41MTYsODcuNjEzIEMxNDIuNzk0LDg3LjYxMyAxNDMuMDc2LDg3LjU0MiAxNDMuMzMzLDg3LjM5MyBMMTY5Ljg2NSw3Mi4wNzYgTDE5Myw4NS40MzMgQzE5My41MjMsODUuNzM1IDE5NC4wNTgsODUuODg4IDE5NC41OSw4NS44ODggQzE5Ni4wODcsODUuODg4IDE5Ny4xNzMsODQuNjg5IDE5Ny4xNzMsODMuMDM2IEwxOTcuMTczLDI5LjAzNSBDMTk3LjE3MywyOC40NTEgMTk2Ljg2MSwyNy45MTEgMTk2LjM1NSwyNy42MTkgQzE5Ni4zNTUsMjcuNjE5IDE3MS44NDMsMTMuNDY3IDE3MC4zODUsMTIuNjI2IEMxNzAuMTMyLDEyLjQ4IDE2OS44NSwxMi40MDcgMTY5LjU2OCwxMi40MDcgQzE2OS4yODUsMTIuNDA3IDE2OS4wMDIsMTIuNDgxIDE2OC43NDksMTIuNjI3IEMxNjguMTQzLDEyLjk3OCAxNjUuNzU2LDE0LjM1NyAxNjQuNDI0LDE1LjEyNSBMMTU5LjYxNSwxMC44NyBDMTU4Ljc5NiwxMC4xNDUgMTU4LjE1NCw4LjkzNyAxNTguMDU0LDcuOTM0IEMxNTguMDQ1LDcuODM3IDE1OC4wMzQsNy43MzkgMTU4LjAyMSw3LjY0IEMxNTguMDA1LDcuNTIzIDE1Ny45OTgsNy40MSAxNTcuOTk4LDcuMzA0IEwxNTcuOTk4LDYuNDE4IEMxNTcuOTk4LDUuODM0IDE1Ny42ODYsNS4yOTUgMTU3LjE4MSw1LjAwMiBDMTU2LjYyNCw0LjY4IDE1MC40NDIsMS4xMTEgMTUwLjQ0MiwxLjExMSBDMTUwLjE4OSwwLjk2NSAxNDkuOTA3LDAuODkyIDE0OS42MjUsMC44OTIiIGlkPSJGaWxsLTEiIGZpbGw9IiM0NTVBNjQiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOTYuMDI3LDI1LjYzNiBMMTQyLjYwMyw1Mi41MjcgQzE0My44MDcsNTMuMjIyIDE0NC41ODIsNTQuMTE0IDE0NC44NDUsNTUuMDY4IEwxNDQuODM1LDU1LjA3NSBMNjMuNDYxLDEwMi4wNTcgTDYzLjQ2LDEwMi4wNTcgQzYxLjgwNiwxMDEuOTA1IDYwLjI2MSwxMDEuNDU3IDU5LjA1NywxMDAuNzYyIEwxMi40ODEsNzMuODcxIEw5Ni4wMjcsMjUuNjM2IiBpZD0iRmlsbC0yIiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTYzLjQ2MSwxMDIuMTc0IEM2My40NTMsMTAyLjE3NCA2My40NDYsMTAyLjE3NCA2My40MzksMTAyLjE3MiBDNjEuNzQ2LDEwMi4wMTYgNjAuMjExLDEwMS41NjMgNTguOTk4LDEwMC44NjMgTDEyLjQyMiw3My45NzMgQzEyLjM4Niw3My45NTIgMTIuMzY0LDczLjkxNCAxMi4zNjQsNzMuODcxIEMxMi4zNjQsNzMuODMgMTIuMzg2LDczLjc5MSAxMi40MjIsNzMuNzcgTDk1Ljk2OCwyNS41MzUgQzk2LjAwNCwyNS41MTQgOTYuMDQ5LDI1LjUxNCA5Ni4wODUsMjUuNTM1IEwxNDIuNjYxLDUyLjQyNiBDMTQzLjg4OCw1My4xMzQgMTQ0LjY4Miw1NC4wMzggMTQ0Ljk1Nyw1NS4wMzcgQzE0NC45Nyw1NS4wODMgMTQ0Ljk1Myw1NS4xMzMgMTQ0LjkxNSw1NS4xNjEgQzE0NC45MTEsNTUuMTY1IDE0NC44OTgsNTUuMTc0IDE0NC44OTQsNTUuMTc3IEw2My41MTksMTAyLjE1OCBDNjMuNTAxLDEwMi4xNjkgNjMuNDgxLDEwMi4xNzQgNjMuNDYxLDEwMi4xNzQgTDYzLjQ2MSwxMDIuMTc0IFogTTEyLjcxNCw3My44NzEgTDU5LjExNSwxMDAuNjYxIEM2MC4yOTMsMTAxLjM0MSA2MS43ODYsMTAxLjc4MiA2My40MzUsMTAxLjkzNyBMMTQ0LjcwNyw1NS4wMTUgQzE0NC40MjgsNTQuMTA4IDE0My42ODIsNTMuMjg1IDE0Mi41NDQsNTIuNjI4IEw5Ni4wMjcsMjUuNzcxIEwxMi43MTQsNzMuODcxIEwxMi43MTQsNzMuODcxIFoiIGlkPSJGaWxsLTMiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTQ4LjMyNyw1OC40NzEgQzE0OC4xNDUsNTguNDggMTQ3Ljk2Miw1OC40OCAxNDcuNzgxLDU4LjQ3MiBDMTQ1Ljg4Nyw1OC4zODkgMTQ0LjQ3OSw1Ny40MzQgMTQ0LjYzNiw1Ni4zNCBDMTQ0LjY4OSw1NS45NjcgMTQ0LjY2NCw1NS41OTcgMTQ0LjU2NCw1NS4yMzUgTDYzLjQ2MSwxMDIuMDU3IEM2NC4wODksMTAyLjExNSA2NC43MzMsMTAyLjEzIDY1LjM3OSwxMDIuMDk5IEM2NS41NjEsMTAyLjA5IDY1Ljc0MywxMDIuMDkgNjUuOTI1LDEwMi4wOTggQzY3LjgxOSwxMDIuMTgxIDY5LjIyNywxMDMuMTM2IDY5LjA3LDEwNC4yMyBMMTQ4LjMyNyw1OC40NzEiIGlkPSJGaWxsLTQiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNjkuMDcsMTA0LjM0NyBDNjkuMDQ4LDEwNC4zNDcgNjkuMDI1LDEwNC4zNCA2OS4wMDUsMTA0LjMyNyBDNjguOTY4LDEwNC4zMDEgNjguOTQ4LDEwNC4yNTcgNjguOTU1LDEwNC4yMTMgQzY5LDEwMy44OTYgNjguODk4LDEwMy41NzYgNjguNjU4LDEwMy4yODggQzY4LjE1MywxMDIuNjc4IDY3LjEwMywxMDIuMjY2IDY1LjkyLDEwMi4yMTQgQzY1Ljc0MiwxMDIuMjA2IDY1LjU2MywxMDIuMjA3IDY1LjM4NSwxMDIuMjE1IEM2NC43NDIsMTAyLjI0NiA2NC4wODcsMTAyLjIzMiA2My40NSwxMDIuMTc0IEM2My4zOTksMTAyLjE2OSA2My4zNTgsMTAyLjEzMiA2My4zNDcsMTAyLjA4MiBDNjMuMzM2LDEwMi4wMzMgNjMuMzU4LDEwMS45ODEgNjMuNDAyLDEwMS45NTYgTDE0NC41MDYsNTUuMTM0IEMxNDQuNTM3LDU1LjExNiAxNDQuNTc1LDU1LjExMyAxNDQuNjA5LDU1LjEyNyBDMTQ0LjY0Miw1NS4xNDEgMTQ0LjY2OCw1NS4xNyAxNDQuNjc3LDU1LjIwNCBDMTQ0Ljc4MSw1NS41ODUgMTQ0LjgwNiw1NS45NzIgMTQ0Ljc1MSw1Ni4zNTcgQzE0NC43MDYsNTYuNjczIDE0NC44MDgsNTYuOTk0IDE0NS4wNDcsNTcuMjgyIEMxNDUuNTUzLDU3Ljg5MiAxNDYuNjAyLDU4LjMwMyAxNDcuNzg2LDU4LjM1NSBDMTQ3Ljk2NCw1OC4zNjMgMTQ4LjE0Myw1OC4zNjMgMTQ4LjMyMSw1OC4zNTQgQzE0OC4zNzcsNTguMzUyIDE0OC40MjQsNTguMzg3IDE0OC40MzksNTguNDM4IEMxNDguNDU0LDU4LjQ5IDE0OC40MzIsNTguNTQ1IDE0OC4zODUsNTguNTcyIEw2OS4xMjksMTA0LjMzMSBDNjkuMTExLDEwNC4zNDIgNjkuMDksMTA0LjM0NyA2OS4wNywxMDQuMzQ3IEw2OS4wNywxMDQuMzQ3IFogTTY1LjY2NSwxMDEuOTc1IEM2NS43NTQsMTAxLjk3NSA2NS44NDIsMTAxLjk3NyA2NS45MywxMDEuOTgxIEM2Ny4xOTYsMTAyLjAzNyA2OC4yODMsMTAyLjQ2OSA2OC44MzgsMTAzLjEzOSBDNjkuMDY1LDEwMy40MTMgNjkuMTg4LDEwMy43MTQgNjkuMTk4LDEwNC4wMjEgTDE0Ny44ODMsNTguNTkyIEMxNDcuODQ3LDU4LjU5MiAxNDcuODExLDU4LjU5MSAxNDcuNzc2LDU4LjU4OSBDMTQ2LjUwOSw1OC41MzMgMTQ1LjQyMiw1OC4xIDE0NC44NjcsNTcuNDMxIEMxNDQuNTg1LDU3LjA5MSAxNDQuNDY1LDU2LjcwNyAxNDQuNTIsNTYuMzI0IEMxNDQuNTYzLDU2LjAyMSAxNDQuNTUyLDU1LjcxNiAxNDQuNDg4LDU1LjQxNCBMNjMuODQ2LDEwMS45NyBDNjQuMzUzLDEwMi4wMDIgNjQuODY3LDEwMi4wMDYgNjUuMzc0LDEwMS45ODIgQzY1LjQ3MSwxMDEuOTc3IDY1LjU2OCwxMDEuOTc1IDY1LjY2NSwxMDEuOTc1IEw2NS42NjUsMTAxLjk3NSBaIiBpZD0iRmlsbC01IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTIuMjA4LDU1LjEzNCBDMS4yMDcsNTMuMzA3IDEuOTY3LDUwLjkxNyAzLjkwNiw0OS43OTcgTDU5LjkxNywxNy40NTMgQzYxLjg1NiwxNi4zMzMgNjQuMjQxLDE2LjkwNyA2NS4yNDMsMTguNzM0IEw2NS40NzUsMTkuMTQ0IEM2NS44NzIsMTkuODgyIDY2LjM2OCwyMC41NiA2Ni45NDUsMjEuMTY1IEw2Ny4yMjMsMjEuNDM1IEM3MC41NDgsMjQuNjQ5IDc1LjgwNiwyNS4xNTEgODAuMTExLDIyLjY2NSBMODcuNDMsMTguNDQ1IEM4OS4zNywxNy4zMjYgOTEuNzU0LDE3Ljg5OSA5Mi43NTUsMTkuNzI3IEw5Ni4wMDUsMjUuNjU1IEwxMi40ODYsNzMuODg0IEwyLjIwOCw1NS4xMzQgWiIgaWQ9IkZpbGwtNiIgZmlsbD0iI0ZBRkFGQSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMi40ODYsNzQuMDAxIEMxMi40NzYsNzQuMDAxIDEyLjQ2NSw3My45OTkgMTIuNDU1LDczLjk5NiBDMTIuNDI0LDczLjk4OCAxMi4zOTksNzMuOTY3IDEyLjM4NCw3My45NCBMMi4xMDYsNTUuMTkgQzEuMDc1LDUzLjMxIDEuODU3LDUwLjg0NSAzLjg0OCw0OS42OTYgTDU5Ljg1OCwxNy4zNTIgQzYwLjUyNSwxNi45NjcgNjEuMjcxLDE2Ljc2NCA2Mi4wMTYsMTYuNzY0IEM2My40MzEsMTYuNzY0IDY0LjY2NiwxNy40NjYgNjUuMzI3LDE4LjY0NiBDNjUuMzM3LDE4LjY1NCA2NS4zNDUsMTguNjYzIDY1LjM1MSwxOC42NzQgTDY1LjU3OCwxOS4wODggQzY1LjU4NCwxOS4xIDY1LjU4OSwxOS4xMTIgNjUuNTkxLDE5LjEyNiBDNjUuOTg1LDE5LjgzOCA2Ni40NjksMjAuNDk3IDY3LjAzLDIxLjA4NSBMNjcuMzA1LDIxLjM1MSBDNjkuMTUxLDIzLjEzNyA3MS42NDksMjQuMTIgNzQuMzM2LDI0LjEyIEM3Ni4zMTMsMjQuMTIgNzguMjksMjMuNTgyIDgwLjA1MywyMi41NjMgQzgwLjA2NCwyMi41NTcgODAuMDc2LDIyLjU1MyA4MC4wODgsMjIuNTUgTDg3LjM3MiwxOC4zNDQgQzg4LjAzOCwxNy45NTkgODguNzg0LDE3Ljc1NiA4OS41MjksMTcuNzU2IEM5MC45NTYsMTcuNzU2IDkyLjIwMSwxOC40NzIgOTIuODU4LDE5LjY3IEw5Ni4xMDcsMjUuNTk5IEM5Ni4xMzgsMjUuNjU0IDk2LjExOCwyNS43MjQgOTYuMDYzLDI1Ljc1NiBMMTIuNTQ1LDczLjk4NSBDMTIuNTI2LDczLjk5NiAxMi41MDYsNzQuMDAxIDEyLjQ4Niw3NC4wMDEgTDEyLjQ4Niw3NC4wMDEgWiBNNjIuMDE2LDE2Ljk5NyBDNjEuMzEyLDE2Ljk5NyA2MC42MDYsMTcuMTkgNTkuOTc1LDE3LjU1NCBMMy45NjUsNDkuODk5IEMyLjA4Myw1MC45ODUgMS4zNDEsNTMuMzA4IDIuMzEsNTUuMDc4IEwxMi41MzEsNzMuNzIzIEw5NS44NDgsMjUuNjExIEw5Mi42NTMsMTkuNzgyIEM5Mi4wMzgsMTguNjYgOTAuODcsMTcuOTkgODkuNTI5LDE3Ljk5IEM4OC44MjUsMTcuOTkgODguMTE5LDE4LjE4MiA4Ny40ODksMTguNTQ3IEw4MC4xNzIsMjIuNzcyIEM4MC4xNjEsMjIuNzc4IDgwLjE0OSwyMi43ODIgODAuMTM3LDIyLjc4NSBDNzguMzQ2LDIzLjgxMSA3Ni4zNDEsMjQuMzU0IDc0LjMzNiwyNC4zNTQgQzcxLjU4OCwyNC4zNTQgNjkuMDMzLDIzLjM0NyA2Ny4xNDIsMjEuNTE5IEw2Ni44NjQsMjEuMjQ5IEM2Ni4yNzcsMjAuNjM0IDY1Ljc3NCwxOS45NDcgNjUuMzY3LDE5LjIwMyBDNjUuMzYsMTkuMTkyIDY1LjM1NiwxOS4xNzkgNjUuMzU0LDE5LjE2NiBMNjUuMTYzLDE4LjgxOSBDNjUuMTU0LDE4LjgxMSA2NS4xNDYsMTguODAxIDY1LjE0LDE4Ljc5IEM2NC41MjUsMTcuNjY3IDYzLjM1NywxNi45OTcgNjIuMDE2LDE2Ljk5NyBMNjIuMDE2LDE2Ljk5NyBaIiBpZD0iRmlsbC03IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTQyLjQzNCw0OC44MDggTDQyLjQzNCw0OC44MDggQzM5LjkyNCw0OC44MDcgMzcuNzM3LDQ3LjU1IDM2LjU4Miw0NS40NDMgQzM0Ljc3MSw0Mi4xMzkgMzYuMTQ0LDM3LjgwOSAzOS42NDEsMzUuNzg5IEw1MS45MzIsMjguNjkxIEM1My4xMDMsMjguMDE1IDU0LjQxMywyNy42NTggNTUuNzIxLDI3LjY1OCBDNTguMjMxLDI3LjY1OCA2MC40MTgsMjguOTE2IDYxLjU3MywzMS4wMjMgQzYzLjM4NCwzNC4zMjcgNjIuMDEyLDM4LjY1NyA1OC41MTQsNDAuNjc3IEw0Ni4yMjMsNDcuNzc1IEM0NS4wNTMsNDguNDUgNDMuNzQyLDQ4LjgwOCA0Mi40MzQsNDguODA4IEw0Mi40MzQsNDguODA4IFogTTU1LjcyMSwyOC4xMjUgQzU0LjQ5NSwyOC4xMjUgNTMuMjY1LDI4LjQ2MSA1Mi4xNjYsMjkuMDk2IEwzOS44NzUsMzYuMTk0IEMzNi41OTYsMzguMDg3IDM1LjMwMiw0Mi4xMzYgMzYuOTkyLDQ1LjIxOCBDMzguMDYzLDQ3LjE3MyA0MC4wOTgsNDguMzQgNDIuNDM0LDQ4LjM0IEM0My42NjEsNDguMzQgNDQuODksNDguMDA1IDQ1Ljk5LDQ3LjM3IEw1OC4yODEsNDAuMjcyIEM2MS41NiwzOC4zNzkgNjIuODUzLDM0LjMzIDYxLjE2NCwzMS4yNDggQzYwLjA5MiwyOS4yOTMgNTguMDU4LDI4LjEyNSA1NS43MjEsMjguMTI1IEw1NS43MjEsMjguMTI1IFoiIGlkPSJGaWxsLTgiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTQ5LjU4OCwyLjQwNyBDMTQ5LjU4OCwyLjQwNyAxNTUuNzY4LDUuOTc1IDE1Ni4zMjUsNi4yOTcgTDE1Ni4zMjUsNy4xODQgQzE1Ni4zMjUsNy4zNiAxNTYuMzM4LDcuNTQ0IDE1Ni4zNjIsNy43MzMgQzE1Ni4zNzMsNy44MTQgMTU2LjM4Miw3Ljg5NCAxNTYuMzksNy45NzUgQzE1Ni41Myw5LjM5IDE1Ny4zNjMsMTAuOTczIDE1OC40OTUsMTEuOTc0IEwxNjUuODkxLDE4LjUxOSBDMTY2LjA2OCwxOC42NzUgMTY2LjI0OSwxOC44MTQgMTY2LjQzMiwxOC45MzQgQzE2OC4wMTEsMTkuOTc0IDE2OS4zODIsMTkuNCAxNjkuNDk0LDE3LjY1MiBDMTY5LjU0MywxNi44NjggMTY5LjU1MSwxNi4wNTcgMTY5LjUxNywxNS4yMjMgTDE2OS41MTQsMTUuMDYzIEwxNjkuNTE0LDEzLjkxMiBDMTcwLjc4LDE0LjY0MiAxOTUuNTAxLDI4LjkxNSAxOTUuNTAxLDI4LjkxNSBMMTk1LjUwMSw4Mi45MTUgQzE5NS41MDEsODQuMDA1IDE5NC43MzEsODQuNDQ1IDE5My43ODEsODMuODk3IEwxNTEuMzA4LDU5LjM3NCBDMTUwLjM1OCw1OC44MjYgMTQ5LjU4OCw1Ny40OTcgMTQ5LjU4OCw1Ni40MDggTDE0OS41ODgsMjIuMzc1IiBpZD0iRmlsbC05IiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE5NC41NTMsODQuMjUgQzE5NC4yOTYsODQuMjUgMTk0LjAxMyw4NC4xNjUgMTkzLjcyMiw4My45OTcgTDE1MS4yNSw1OS40NzYgQzE1MC4yNjksNTguOTA5IDE0OS40NzEsNTcuNTMzIDE0OS40NzEsNTYuNDA4IEwxNDkuNDcxLDIyLjM3NSBMMTQ5LjcwNSwyMi4zNzUgTDE0OS43MDUsNTYuNDA4IEMxNDkuNzA1LDU3LjQ1OSAxNTAuNDUsNTguNzQ0IDE1MS4zNjYsNTkuMjc0IEwxOTMuODM5LDgzLjc5NSBDMTk0LjI2Myw4NC4wNCAxOTQuNjU1LDg0LjA4MyAxOTQuOTQyLDgzLjkxNyBDMTk1LjIyNyw4My43NTMgMTk1LjM4NCw4My4zOTcgMTk1LjM4NCw4Mi45MTUgTDE5NS4zODQsMjguOTgyIEMxOTQuMTAyLDI4LjI0MiAxNzIuMTA0LDE1LjU0MiAxNjkuNjMxLDE0LjExNCBMMTY5LjYzNCwxNS4yMiBDMTY5LjY2OCwxNi4wNTIgMTY5LjY2LDE2Ljg3NCAxNjkuNjEsMTcuNjU5IEMxNjkuNTU2LDE4LjUwMyAxNjkuMjE0LDE5LjEyMyAxNjguNjQ3LDE5LjQwNSBDMTY4LjAyOCwxOS43MTQgMTY3LjE5NywxOS41NzggMTY2LjM2NywxOS4wMzIgQzE2Ni4xODEsMTguOTA5IDE2NS45OTUsMTguNzY2IDE2NS44MTQsMTguNjA2IEwxNTguNDE3LDEyLjA2MiBDMTU3LjI1OSwxMS4wMzYgMTU2LjQxOCw5LjQzNyAxNTYuMjc0LDcuOTg2IEMxNTYuMjY2LDcuOTA3IDE1Ni4yNTcsNy44MjcgMTU2LjI0Nyw3Ljc0OCBDMTU2LjIyMSw3LjU1NSAxNTYuMjA5LDcuMzY1IDE1Ni4yMDksNy4xODQgTDE1Ni4yMDksNi4zNjQgQzE1NS4zNzUsNS44ODMgMTQ5LjUyOSwyLjUwOCAxNDkuNTI5LDIuNTA4IEwxNDkuNjQ2LDIuMzA2IEMxNDkuNjQ2LDIuMzA2IDE1NS44MjcsNS44NzQgMTU2LjM4NCw2LjE5NiBMMTU2LjQ0Miw2LjIzIEwxNTYuNDQyLDcuMTg0IEMxNTYuNDQyLDcuMzU1IDE1Ni40NTQsNy41MzUgMTU2LjQ3OCw3LjcxNyBDMTU2LjQ4OSw3LjggMTU2LjQ5OSw3Ljg4MiAxNTYuNTA3LDcuOTYzIEMxNTYuNjQ1LDkuMzU4IDE1Ny40NTUsMTAuODk4IDE1OC41NzIsMTEuODg2IEwxNjUuOTY5LDE4LjQzMSBDMTY2LjE0MiwxOC41ODQgMTY2LjMxOSwxOC43MiAxNjYuNDk2LDE4LjgzNyBDMTY3LjI1NCwxOS4zMzYgMTY4LDE5LjQ2NyAxNjguNTQzLDE5LjE5NiBDMTY5LjAzMywxOC45NTMgMTY5LjMyOSwxOC40MDEgMTY5LjM3NywxNy42NDUgQzE2OS40MjcsMTYuODY3IDE2OS40MzQsMTYuMDU0IDE2OS40MDEsMTUuMjI4IEwxNjkuMzk3LDE1LjA2NSBMMTY5LjM5NywxMy43MSBMMTY5LjU3MiwxMy44MSBDMTcwLjgzOSwxNC41NDEgMTk1LjU1OSwyOC44MTQgMTk1LjU1OSwyOC44MTQgTDE5NS42MTgsMjguODQ3IEwxOTUuNjE4LDgyLjkxNSBDMTk1LjYxOCw4My40ODQgMTk1LjQyLDgzLjkxMSAxOTUuMDU5LDg0LjExOSBDMTk0LjkwOCw4NC4yMDYgMTk0LjczNyw4NC4yNSAxOTQuNTUzLDg0LjI1IiBpZD0iRmlsbC0xMCIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNDUuNjg1LDU2LjE2MSBMMTY5LjgsNzAuMDgzIEwxNDMuODIyLDg1LjA4MSBMMTQyLjM2LDg0Ljc3NCBDMTM1LjgyNiw4Mi42MDQgMTI4LjczMiw4MS4wNDYgMTIxLjM0MSw4MC4xNTggQzExNi45NzYsNzkuNjM0IDExMi42NzgsODEuMjU0IDExMS43NDMsODMuNzc4IEMxMTEuNTA2LDg0LjQxNCAxMTEuNTAzLDg1LjA3MSAxMTEuNzMyLDg1LjcwNiBDMTEzLjI3LDg5Ljk3MyAxMTUuOTY4LDk0LjA2OSAxMTkuNzI3LDk3Ljg0MSBMMTIwLjI1OSw5OC42ODYgQzEyMC4yNiw5OC42ODUgOTQuMjgyLDExMy42ODMgOTQuMjgyLDExMy42ODMgTDcwLjE2Nyw5OS43NjEgTDE0NS42ODUsNTYuMTYxIiBpZD0iRmlsbC0xMSIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik05NC4yODIsMTEzLjgxOCBMOTQuMjIzLDExMy43ODUgTDY5LjkzMyw5OS43NjEgTDcwLjEwOCw5OS42NiBMMTQ1LjY4NSw1Ni4wMjYgTDE0NS43NDMsNTYuMDU5IEwxNzAuMDMzLDcwLjA4MyBMMTQzLjg0Miw4NS4yMDUgTDE0My43OTcsODUuMTk1IEMxNDMuNzcyLDg1LjE5IDE0Mi4zMzYsODQuODg4IDE0Mi4zMzYsODQuODg4IEMxMzUuNzg3LDgyLjcxNCAxMjguNzIzLDgxLjE2MyAxMjEuMzI3LDgwLjI3NCBDMTIwLjc4OCw4MC4yMDkgMTIwLjIzNiw4MC4xNzcgMTE5LjY4OSw4MC4xNzcgQzExNS45MzEsODAuMTc3IDExMi42MzUsODEuNzA4IDExMS44NTIsODMuODE5IEMxMTEuNjI0LDg0LjQzMiAxMTEuNjIxLDg1LjA1MyAxMTEuODQyLDg1LjY2NyBDMTEzLjM3Nyw4OS45MjUgMTE2LjA1OCw5My45OTMgMTE5LjgxLDk3Ljc1OCBMMTE5LjgyNiw5Ny43NzkgTDEyMC4zNTIsOTguNjE0IEMxMjAuMzU0LDk4LjYxNyAxMjAuMzU2LDk4LjYyIDEyMC4zNTgsOTguNjI0IEwxMjAuNDIyLDk4LjcyNiBMMTIwLjMxNyw5OC43ODcgQzEyMC4yNjQsOTguODE4IDk0LjU5OSwxMTMuNjM1IDk0LjM0LDExMy43ODUgTDk0LjI4MiwxMTMuODE4IEw5NC4yODIsMTEzLjgxOCBaIE03MC40MDEsOTkuNzYxIEw5NC4yODIsMTEzLjU0OSBMMTE5LjA4NCw5OS4yMjkgQzExOS42Myw5OC45MTQgMTE5LjkzLDk4Ljc0IDEyMC4xMDEsOTguNjU0IEwxMTkuNjM1LDk3LjkxNCBDMTE1Ljg2NCw5NC4xMjcgMTEzLjE2OCw5MC4wMzMgMTExLjYyMiw4NS43NDYgQzExMS4zODIsODUuMDc5IDExMS4zODYsODQuNDA0IDExMS42MzMsODMuNzM4IEMxMTIuNDQ4LDgxLjUzOSAxMTUuODM2LDc5Ljk0MyAxMTkuNjg5LDc5Ljk0MyBDMTIwLjI0Niw3OS45NDMgMTIwLjgwNiw3OS45NzYgMTIxLjM1NSw4MC4wNDIgQzEyOC43NjcsODAuOTMzIDEzNS44NDYsODIuNDg3IDE0Mi4zOTYsODQuNjYzIEMxNDMuMjMyLDg0LjgzOCAxNDMuNjExLDg0LjkxNyAxNDMuNzg2LDg0Ljk2NyBMMTY5LjU2Niw3MC4wODMgTDE0NS42ODUsNTYuMjk1IEw3MC40MDEsOTkuNzYxIEw3MC40MDEsOTkuNzYxIFoiIGlkPSJGaWxsLTEyIiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE2Ny4yMywxOC45NzkgTDE2Ny4yMyw2OS44NSBMMTM5LjkwOSw4NS42MjMgTDEzMy40NDgsNzEuNDU2IEMxMzIuNTM4LDY5LjQ2IDEzMC4wMiw2OS43MTggMTI3LjgyNCw3Mi4wMyBDMTI2Ljc2OSw3My4xNCAxMjUuOTMxLDc0LjU4NSAxMjUuNDk0LDc2LjA0OCBMMTE5LjAzNCw5Ny42NzYgTDkxLjcxMiwxMTMuNDUgTDkxLjcxMiw2Mi41NzkgTDE2Ny4yMywxOC45NzkiIGlkPSJGaWxsLTEzIiBmaWxsPSIjRkZGRkZGIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTkxLjcxMiwxMTMuNTY3IEM5MS42OTIsMTEzLjU2NyA5MS42NzIsMTEzLjU2MSA5MS42NTMsMTEzLjU1MSBDOTEuNjE4LDExMy41MyA5MS41OTUsMTEzLjQ5MiA5MS41OTUsMTEzLjQ1IEw5MS41OTUsNjIuNTc5IEM5MS41OTUsNjIuNTM3IDkxLjYxOCw2Mi40OTkgOTEuNjUzLDYyLjQ3OCBMMTY3LjE3MiwxOC44NzggQzE2Ny4yMDgsMTguODU3IDE2Ny4yNTIsMTguODU3IDE2Ny4yODgsMTguODc4IEMxNjcuMzI0LDE4Ljg5OSAxNjcuMzQ3LDE4LjkzNyAxNjcuMzQ3LDE4Ljk3OSBMMTY3LjM0Nyw2OS44NSBDMTY3LjM0Nyw2OS44OTEgMTY3LjMyNCw2OS45MyAxNjcuMjg4LDY5Ljk1IEwxMzkuOTY3LDg1LjcyNSBDMTM5LjkzOSw4NS43NDEgMTM5LjkwNSw4NS43NDUgMTM5Ljg3Myw4NS43MzUgQzEzOS44NDIsODUuNzI1IDEzOS44MTYsODUuNzAyIDEzOS44MDIsODUuNjcyIEwxMzMuMzQyLDcxLjUwNCBDMTMyLjk2Nyw3MC42ODIgMTMyLjI4LDcwLjIyOSAxMzEuNDA4LDcwLjIyOSBDMTMwLjMxOSw3MC4yMjkgMTI5LjA0NCw3MC45MTUgMTI3LjkwOCw3Mi4xMSBDMTI2Ljg3NCw3My4yIDEyNi4wMzQsNzQuNjQ3IDEyNS42MDYsNzYuMDgyIEwxMTkuMTQ2LDk3LjcwOSBDMTE5LjEzNyw5Ny43MzggMTE5LjExOCw5Ny43NjIgMTE5LjA5Miw5Ny43NzcgTDkxLjc3LDExMy41NTEgQzkxLjc1MiwxMTMuNTYxIDkxLjczMiwxMTMuNTY3IDkxLjcxMiwxMTMuNTY3IEw5MS43MTIsMTEzLjU2NyBaIE05MS44MjksNjIuNjQ3IEw5MS44MjksMTEzLjI0OCBMMTE4LjkzNSw5Ny41OTggTDEyNS4zODIsNzYuMDE1IEMxMjUuODI3LDc0LjUyNSAxMjYuNjY0LDczLjA4MSAxMjcuNzM5LDcxLjk1IEMxMjguOTE5LDcwLjcwOCAxMzAuMjU2LDY5Ljk5NiAxMzEuNDA4LDY5Ljk5NiBDMTMyLjM3Nyw2OS45OTYgMTMzLjEzOSw3MC40OTcgMTMzLjU1NCw3MS40MDcgTDEzOS45NjEsODUuNDU4IEwxNjcuMTEzLDY5Ljc4MiBMMTY3LjExMywxOS4xODEgTDkxLjgyOSw2Mi42NDcgTDkxLjgyOSw2Mi42NDcgWiIgaWQ9IkZpbGwtMTQiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTY4LjU0MywxOS4yMTMgTDE2OC41NDMsNzAuMDgzIEwxNDEuMjIxLDg1Ljg1NyBMMTM0Ljc2MSw3MS42ODkgQzEzMy44NTEsNjkuNjk0IDEzMS4zMzMsNjkuOTUxIDEyOS4xMzcsNzIuMjYzIEMxMjguMDgyLDczLjM3NCAxMjcuMjQ0LDc0LjgxOSAxMjYuODA3LDc2LjI4MiBMMTIwLjM0Niw5Ny45MDkgTDkzLjAyNSwxMTMuNjgzIEw5My4wMjUsNjIuODEzIEwxNjguNTQzLDE5LjIxMyIgaWQ9IkZpbGwtMTUiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOTMuMDI1LDExMy44IEM5My4wMDUsMTEzLjggOTIuOTg0LDExMy43OTUgOTIuOTY2LDExMy43ODUgQzkyLjkzMSwxMTMuNzY0IDkyLjkwOCwxMTMuNzI1IDkyLjkwOCwxMTMuNjg0IEw5Mi45MDgsNjIuODEzIEM5Mi45MDgsNjIuNzcxIDkyLjkzMSw2Mi43MzMgOTIuOTY2LDYyLjcxMiBMMTY4LjQ4NCwxOS4xMTIgQzE2OC41MiwxOS4wOSAxNjguNTY1LDE5LjA5IDE2OC42MDEsMTkuMTEyIEMxNjguNjM3LDE5LjEzMiAxNjguNjYsMTkuMTcxIDE2OC42NiwxOS4yMTIgTDE2OC42Niw3MC4wODMgQzE2OC42Niw3MC4xMjUgMTY4LjYzNyw3MC4xNjQgMTY4LjYwMSw3MC4xODQgTDE0MS4yOCw4NS45NTggQzE0MS4yNTEsODUuOTc1IDE0MS4yMTcsODUuOTc5IDE0MS4xODYsODUuOTY4IEMxNDEuMTU0LDg1Ljk1OCAxNDEuMTI5LDg1LjkzNiAxNDEuMTE1LDg1LjkwNiBMMTM0LjY1NSw3MS43MzggQzEzNC4yOCw3MC45MTUgMTMzLjU5Myw3MC40NjMgMTMyLjcyLDcwLjQ2MyBDMTMxLjYzMiw3MC40NjMgMTMwLjM1Nyw3MS4xNDggMTI5LjIyMSw3Mi4zNDQgQzEyOC4xODYsNzMuNDMzIDEyNy4zNDcsNzQuODgxIDEyNi45MTksNzYuMzE1IEwxMjAuNDU4LDk3Ljk0MyBDMTIwLjQ1LDk3Ljk3MiAxMjAuNDMxLDk3Ljk5NiAxMjAuNDA1LDk4LjAxIEw5My4wODMsMTEzLjc4NSBDOTMuMDY1LDExMy43OTUgOTMuMDQ1LDExMy44IDkzLjAyNSwxMTMuOCBMOTMuMDI1LDExMy44IFogTTkzLjE0Miw2Mi44ODEgTDkzLjE0MiwxMTMuNDgxIEwxMjAuMjQ4LDk3LjgzMiBMMTI2LjY5NSw3Ni4yNDggQzEyNy4xNCw3NC43NTggMTI3Ljk3Nyw3My4zMTUgMTI5LjA1Miw3Mi4xODMgQzEzMC4yMzEsNzAuOTQyIDEzMS41NjgsNzAuMjI5IDEzMi43Miw3MC4yMjkgQzEzMy42ODksNzAuMjI5IDEzNC40NTIsNzAuNzMxIDEzNC44NjcsNzEuNjQxIEwxNDEuMjc0LDg1LjY5MiBMMTY4LjQyNiw3MC4wMTYgTDE2OC40MjYsMTkuNDE1IEw5My4xNDIsNjIuODgxIEw5My4xNDIsNjIuODgxIFoiIGlkPSJGaWxsLTE2IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE2OS44LDcwLjA4MyBMMTQyLjQ3OCw4NS44NTcgTDEzNi4wMTgsNzEuNjg5IEMxMzUuMTA4LDY5LjY5NCAxMzIuNTksNjkuOTUxIDEzMC4zOTMsNzIuMjYzIEMxMjkuMzM5LDczLjM3NCAxMjguNSw3NC44MTkgMTI4LjA2NCw3Ni4yODIgTDEyMS42MDMsOTcuOTA5IEw5NC4yODIsMTEzLjY4MyBMOTQuMjgyLDYyLjgxMyBMMTY5LjgsMTkuMjEzIEwxNjkuOCw3MC4wODMgWiIgaWQ9IkZpbGwtMTciIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNOTQuMjgyLDExMy45MTcgQzk0LjI0MSwxMTMuOTE3IDk0LjIwMSwxMTMuOTA3IDk0LjE2NSwxMTMuODg2IEM5NC4wOTMsMTEzLjg0NSA5NC4wNDgsMTEzLjc2NyA5NC4wNDgsMTEzLjY4NCBMOTQuMDQ4LDYyLjgxMyBDOTQuMDQ4LDYyLjczIDk0LjA5Myw2Mi42NTIgOTQuMTY1LDYyLjYxMSBMMTY5LjY4MywxOS4wMSBDMTY5Ljc1NSwxOC45NjkgMTY5Ljg0NCwxOC45NjkgMTY5LjkxNywxOS4wMSBDMTY5Ljk4OSwxOS4wNTIgMTcwLjAzMywxOS4xMjkgMTcwLjAzMywxOS4yMTIgTDE3MC4wMzMsNzAuMDgzIEMxNzAuMDMzLDcwLjE2NiAxNjkuOTg5LDcwLjI0NCAxNjkuOTE3LDcwLjI4NSBMMTQyLjU5NSw4Ni4wNiBDMTQyLjUzOCw4Ni4wOTIgMTQyLjQ2OSw4Ni4xIDE0Mi40MDcsODYuMDggQzE0Mi4zNDQsODYuMDYgMTQyLjI5Myw4Ni4wMTQgMTQyLjI2Niw4NS45NTQgTDEzNS44MDUsNzEuNzg2IEMxMzUuNDQ1LDcwLjk5NyAxMzQuODEzLDcwLjU4IDEzMy45NzcsNzAuNTggQzEzMi45MjEsNzAuNTggMTMxLjY3Niw3MS4yNTIgMTMwLjU2Miw3Mi40MjQgQzEyOS41NCw3My41MDEgMTI4LjcxMSw3NC45MzEgMTI4LjI4Nyw3Ni4zNDggTDEyMS44MjcsOTcuOTc2IEMxMjEuODEsOTguMDM0IDEyMS43NzEsOTguMDgyIDEyMS43Miw5OC4xMTIgTDk0LjM5OCwxMTMuODg2IEM5NC4zNjIsMTEzLjkwNyA5NC4zMjIsMTEzLjkxNyA5NC4yODIsMTEzLjkxNyBMOTQuMjgyLDExMy45MTcgWiBNOTQuNTE1LDYyLjk0OCBMOTQuNTE1LDExMy4yNzkgTDEyMS40MDYsOTcuNzU0IEwxMjcuODQsNzYuMjE1IEMxMjguMjksNzQuNzA4IDEyOS4xMzcsNzMuMjQ3IDEzMC4yMjQsNzIuMTAzIEMxMzEuNDI1LDcwLjgzOCAxMzIuNzkzLDcwLjExMiAxMzMuOTc3LDcwLjExMiBDMTM0Ljk5NSw3MC4xMTIgMTM1Ljc5NSw3MC42MzggMTM2LjIzLDcxLjU5MiBMMTQyLjU4NCw4NS41MjYgTDE2OS41NjYsNjkuOTQ4IEwxNjkuNTY2LDE5LjYxNyBMOTQuNTE1LDYyLjk0OCBMOTQuNTE1LDYyLjk0OCBaIiBpZD0iRmlsbC0xOCIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMDkuODk0LDkyLjk0MyBMMTA5Ljg5NCw5Mi45NDMgQzEwOC4xMiw5Mi45NDMgMTA2LjY1Myw5Mi4yMTggMTA1LjY1LDkwLjgyMyBDMTA1LjU4Myw5MC43MzEgMTA1LjU5Myw5MC42MSAxMDUuNjczLDkwLjUyOSBDMTA1Ljc1Myw5MC40NDggMTA1Ljg4LDkwLjQ0IDEwNS45NzQsOTAuNTA2IEMxMDYuNzU0LDkxLjA1MyAxMDcuNjc5LDkxLjMzMyAxMDguNzI0LDkxLjMzMyBDMTEwLjA0Nyw5MS4zMzMgMTExLjQ3OCw5MC44OTQgMTEyLjk4LDkwLjAyNyBDMTE4LjI5MSw4Ni45NiAxMjIuNjExLDc5LjUwOSAxMjIuNjExLDczLjQxNiBDMTIyLjYxMSw3MS40ODkgMTIyLjE2OSw2OS44NTYgMTIxLjMzMyw2OC42OTIgQzEyMS4yNjYsNjguNiAxMjEuMjc2LDY4LjQ3MyAxMjEuMzU2LDY4LjM5MiBDMTIxLjQzNiw2OC4zMTEgMTIxLjU2Myw2OC4yOTkgMTIxLjY1Niw2OC4zNjUgQzEyMy4zMjcsNjkuNTM3IDEyNC4yNDcsNzEuNzQ2IDEyNC4yNDcsNzQuNTg0IEMxMjQuMjQ3LDgwLjgyNiAxMTkuODIxLDg4LjQ0NyAxMTQuMzgyLDkxLjU4NyBDMTEyLjgwOCw5Mi40OTUgMTExLjI5OCw5Mi45NDMgMTA5Ljg5NCw5Mi45NDMgTDEwOS44OTQsOTIuOTQzIFogTTEwNi45MjUsOTEuNDAxIEMxMDcuNzM4LDkyLjA1MiAxMDguNzQ1LDkyLjI3OCAxMDkuODkzLDkyLjI3OCBMMTA5Ljg5NCw5Mi4yNzggQzExMS4yMTUsOTIuMjc4IDExMi42NDcsOTEuOTUxIDExNC4xNDgsOTEuMDg0IEMxMTkuNDU5LDg4LjAxNyAxMjMuNzgsODAuNjIxIDEyMy43OCw3NC41MjggQzEyMy43OCw3Mi41NDkgMTIzLjMxNyw3MC45MjkgMTIyLjQ1NCw2OS43NjcgQzEyMi44NjUsNzAuODAyIDEyMy4wNzksNzIuMDQyIDEyMy4wNzksNzMuNDAyIEMxMjMuMDc5LDc5LjY0NSAxMTguNjUzLDg3LjI4NSAxMTMuMjE0LDkwLjQyNSBDMTExLjY0LDkxLjMzNCAxMTAuMTMsOTEuNzQyIDEwOC43MjQsOTEuNzQyIEMxMDguMDgzLDkxLjc0MiAxMDcuNDgxLDkxLjU5MyAxMDYuOTI1LDkxLjQwMSBMMTA2LjkyNSw5MS40MDEgWiIgaWQ9IkZpbGwtMTkiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTEzLjA5Nyw5MC4yMyBDMTE4LjQ4MSw4Ny4xMjIgMTIyLjg0NSw3OS41OTQgMTIyLjg0NSw3My40MTYgQzEyMi44NDUsNzEuMzY1IDEyMi4zNjIsNjkuNzI0IDEyMS41MjIsNjguNTU2IEMxMTkuNzM4LDY3LjMwNCAxMTcuMTQ4LDY3LjM2MiAxMTQuMjY1LDY5LjAyNiBDMTA4Ljg4MSw3Mi4xMzQgMTA0LjUxNyw3OS42NjIgMTA0LjUxNyw4NS44NCBDMTA0LjUxNyw4Ny44OTEgMTA1LDg5LjUzMiAxMDUuODQsOTAuNyBDMTA3LjYyNCw5MS45NTIgMTEwLjIxNCw5MS44OTQgMTEzLjA5Nyw5MC4yMyIgaWQ9IkZpbGwtMjAiIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTA4LjcyNCw5MS42MTQgTDEwOC43MjQsOTEuNjE0IEMxMDcuNTgyLDkxLjYxNCAxMDYuNTY2LDkxLjQwMSAxMDUuNzA1LDkwLjc5NyBDMTA1LjY4NCw5MC43ODMgMTA1LjY2NSw5MC44MTEgMTA1LjY1LDkwLjc5IEMxMDQuNzU2LDg5LjU0NiAxMDQuMjgzLDg3Ljg0MiAxMDQuMjgzLDg1LjgxNyBDMTA0LjI4Myw3OS41NzUgMTA4LjcwOSw3MS45NTMgMTE0LjE0OCw2OC44MTIgQzExNS43MjIsNjcuOTA0IDExNy4yMzIsNjcuNDQ5IDExOC42MzgsNjcuNDQ5IEMxMTkuNzgsNjcuNDQ5IDEyMC43OTYsNjcuNzU4IDEyMS42NTYsNjguMzYyIEMxMjEuNjc4LDY4LjM3NyAxMjEuNjk3LDY4LjM5NyAxMjEuNzEyLDY4LjQxOCBDMTIyLjYwNiw2OS42NjIgMTIzLjA3OSw3MS4zOSAxMjMuMDc5LDczLjQxNSBDMTIzLjA3OSw3OS42NTggMTE4LjY1Myw4Ny4xOTggMTEzLjIxNCw5MC4zMzggQzExMS42NCw5MS4yNDcgMTEwLjEzLDkxLjYxNCAxMDguNzI0LDkxLjYxNCBMMTA4LjcyNCw5MS42MTQgWiBNMTA2LjAwNiw5MC41MDUgQzEwNi43OCw5MS4wMzcgMTA3LjY5NCw5MS4yODEgMTA4LjcyNCw5MS4yODEgQzExMC4wNDcsOTEuMjgxIDExMS40NzgsOTAuODY4IDExMi45OCw5MC4wMDEgQzExOC4yOTEsODYuOTM1IDEyMi42MTEsNzkuNDk2IDEyMi42MTEsNzMuNDAzIEMxMjIuNjExLDcxLjQ5NCAxMjIuMTc3LDY5Ljg4IDEyMS4zNTYsNjguNzE4IEMxMjAuNTgyLDY4LjE4NSAxMTkuNjY4LDY3LjkxOSAxMTguNjM4LDY3LjkxOSBDMTE3LjMxNSw2Ny45MTkgMTE1Ljg4Myw2OC4zNiAxMTQuMzgyLDY5LjIyNyBDMTA5LjA3MSw3Mi4yOTMgMTA0Ljc1MSw3OS43MzMgMTA0Ljc1MSw4NS44MjYgQzEwNC43NTEsODcuNzM1IDEwNS4xODUsODkuMzQzIDEwNi4wMDYsOTAuNTA1IEwxMDYuMDA2LDkwLjUwNSBaIiBpZD0iRmlsbC0yMSIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNDkuMzE4LDcuMjYyIEwxMzkuMzM0LDE2LjE0IEwxNTUuMjI3LDI3LjE3MSBMMTYwLjgxNiwyMS4wNTkgTDE0OS4zMTgsNy4yNjIiIGlkPSJGaWxsLTIyIiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE2OS42NzYsMTMuODQgTDE1OS45MjgsMTkuNDY3IEMxNTYuMjg2LDIxLjU3IDE1MC40LDIxLjU4IDE0Ni43ODEsMTkuNDkxIEMxNDMuMTYxLDE3LjQwMiAxNDMuMTgsMTQuMDAzIDE0Ni44MjIsMTEuOSBMMTU2LjMxNyw2LjI5MiBMMTQ5LjU4OCwyLjQwNyBMNjcuNzUyLDQ5LjQ3OCBMMTEzLjY3NSw3NS45OTIgTDExNi43NTYsNzQuMjEzIEMxMTcuMzg3LDczLjg0OCAxMTcuNjI1LDczLjMxNSAxMTcuMzc0LDcyLjgyMyBDMTE1LjAxNyw2OC4xOTEgMTE0Ljc4MSw2My4yNzcgMTE2LjY5MSw1OC41NjEgQzEyMi4zMjksNDQuNjQxIDE0MS4yLDMzLjc0NiAxNjUuMzA5LDMwLjQ5MSBDMTczLjQ3OCwyOS4zODggMTgxLjk4OSwyOS41MjQgMTkwLjAxMywzMC44ODUgQzE5MC44NjUsMzEuMDMgMTkxLjc4OSwzMC44OTMgMTkyLjQyLDMwLjUyOCBMMTk1LjUwMSwyOC43NSBMMTY5LjY3NiwxMy44NCIgaWQ9IkZpbGwtMjMiIGZpbGw9IiNGQUZBRkEiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTEzLjY3NSw3Ni40NTkgQzExMy41OTQsNzYuNDU5IDExMy41MTQsNzYuNDM4IDExMy40NDIsNzYuMzk3IEw2Ny41MTgsNDkuODgyIEM2Ny4zNzQsNDkuNzk5IDY3LjI4NCw0OS42NDUgNjcuMjg1LDQ5LjQ3OCBDNjcuMjg1LDQ5LjMxMSA2Ny4zNzQsNDkuMTU3IDY3LjUxOSw0OS4wNzMgTDE0OS4zNTUsMi4wMDIgQzE0OS40OTksMS45MTkgMTQ5LjY3NywxLjkxOSAxNDkuODIxLDIuMDAyIEwxNTYuNTUsNS44ODcgQzE1Ni43NzQsNi4wMTcgMTU2Ljg1LDYuMzAyIDE1Ni43MjIsNi41MjYgQzE1Ni41OTIsNi43NDkgMTU2LjMwNyw2LjgyNiAxNTYuMDgzLDYuNjk2IEwxNDkuNTg3LDIuOTQ2IEw2OC42ODcsNDkuNDc5IEwxMTMuNjc1LDc1LjQ1MiBMMTE2LjUyMyw3My44MDggQzExNi43MTUsNzMuNjk3IDExNy4xNDMsNzMuMzk5IDExNi45NTgsNzMuMDM1IEMxMTQuNTQyLDY4LjI4NyAxMTQuMyw2My4yMjEgMTE2LjI1OCw1OC4zODUgQzExOS4wNjQsNTEuNDU4IDEyNS4xNDMsNDUuMTQzIDEzMy44NCw0MC4xMjIgQzE0Mi40OTcsMzUuMTI0IDE1My4zNTgsMzEuNjMzIDE2NS4yNDcsMzAuMDI4IEMxNzMuNDQ1LDI4LjkyMSAxODIuMDM3LDI5LjA1OCAxOTAuMDkxLDMwLjQyNSBDMTkwLjgzLDMwLjU1IDE5MS42NTIsMzAuNDMyIDE5Mi4xODYsMzAuMTI0IEwxOTQuNTY3LDI4Ljc1IEwxNjkuNDQyLDE0LjI0NCBDMTY5LjIxOSwxNC4xMTUgMTY5LjE0MiwxMy44MjkgMTY5LjI3MSwxMy42MDYgQzE2OS40LDEzLjM4MiAxNjkuNjg1LDEzLjMwNiAxNjkuOTA5LDEzLjQzNSBMMTk1LjczNCwyOC4zNDUgQzE5NS44NzksMjguNDI4IDE5NS45NjgsMjguNTgzIDE5NS45NjgsMjguNzUgQzE5NS45NjgsMjguOTE2IDE5NS44NzksMjkuMDcxIDE5NS43MzQsMjkuMTU0IEwxOTIuNjUzLDMwLjkzMyBDMTkxLjkzMiwzMS4zNSAxOTAuODksMzEuNTA4IDE4OS45MzUsMzEuMzQ2IEMxODEuOTcyLDI5Ljk5NSAxNzMuNDc4LDI5Ljg2IDE2NS4zNzIsMzAuOTU0IEMxNTMuNjAyLDMyLjU0MyAxNDIuODYsMzUuOTkzIDEzNC4zMDcsNDAuOTMxIEMxMjUuNzkzLDQ1Ljg0NyAxMTkuODUxLDUyLjAwNCAxMTcuMTI0LDU4LjczNiBDMTE1LjI3LDYzLjMxNCAxMTUuNTAxLDY4LjExMiAxMTcuNzksNzIuNjExIEMxMTguMTYsNzMuMzM2IDExNy44NDUsNzQuMTI0IDExNi45OSw3NC42MTcgTDExMy45MDksNzYuMzk3IEMxMTMuODM2LDc2LjQzOCAxMTMuNzU2LDc2LjQ1OSAxMTMuNjc1LDc2LjQ1OSIgaWQ9IkZpbGwtMjQiIGZpbGw9IiM0NTVBNjQiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTUzLjMxNiwyMS4yNzkgQzE1MC45MDMsMjEuMjc5IDE0OC40OTUsMjAuNzUxIDE0Ni42NjQsMTkuNjkzIEMxNDQuODQ2LDE4LjY0NCAxNDMuODQ0LDE3LjIzMiAxNDMuODQ0LDE1LjcxOCBDMTQzLjg0NCwxNC4xOTEgMTQ0Ljg2LDEyLjc2MyAxNDYuNzA1LDExLjY5OCBMMTU2LjE5OCw2LjA5MSBDMTU2LjMwOSw2LjAyNSAxNTYuNDUyLDYuMDYyIDE1Ni41MTgsNi4xNzMgQzE1Ni41ODMsNi4yODQgMTU2LjU0Nyw2LjQyNyAxNTYuNDM2LDYuNDkzIEwxNDYuOTQsMTIuMTAyIEMxNDUuMjQ0LDEzLjA4MSAxNDQuMzEyLDE0LjM2NSAxNDQuMzEyLDE1LjcxOCBDMTQ0LjMxMiwxNy4wNTggMTQ1LjIzLDE4LjMyNiAxNDYuODk3LDE5LjI4OSBDMTUwLjQ0NiwyMS4zMzggMTU2LjI0LDIxLjMyNyAxNTkuODExLDE5LjI2NSBMMTY5LjU1OSwxMy42MzcgQzE2OS42NywxMy41NzMgMTY5LjgxMywxMy42MTEgMTY5Ljg3OCwxMy43MjMgQzE2OS45NDMsMTMuODM0IDE2OS45MDQsMTMuOTc3IDE2OS43OTMsMTQuMDQyIEwxNjAuMDQ1LDE5LjY3IEMxNTguMTg3LDIwLjc0MiAxNTUuNzQ5LDIxLjI3OSAxNTMuMzE2LDIxLjI3OSIgaWQ9IkZpbGwtMjUiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTEzLjY3NSw3NS45OTIgTDY3Ljc2Miw0OS40ODQiIGlkPSJGaWxsLTI2IiBmaWxsPSIjNDU1QTY0Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTExMy42NzUsNzYuMzQyIEMxMTMuNjE1LDc2LjM0MiAxMTMuNTU1LDc2LjMyNyAxMTMuNSw3Ni4yOTUgTDY3LjU4Nyw0OS43ODcgQzY3LjQxOSw0OS42OSA2Ny4zNjIsNDkuNDc2IDY3LjQ1OSw0OS4zMDkgQzY3LjU1Niw0OS4xNDEgNjcuNzcsNDkuMDgzIDY3LjkzNyw0OS4xOCBMMTEzLjg1LDc1LjY4OCBDMTE0LjAxOCw3NS43ODUgMTE0LjA3NSw3NiAxMTMuOTc4LDc2LjE2NyBDMTEzLjkxNCw3Ni4yNzkgMTEzLjc5Niw3Ni4zNDIgMTEzLjY3NSw3Ni4zNDIiIGlkPSJGaWxsLTI3IiBmaWxsPSIjNDU1QTY0Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTY3Ljc2Miw0OS40ODQgTDY3Ljc2MiwxMDMuNDg1IEM2Ny43NjIsMTA0LjU3NSA2OC41MzIsMTA1LjkwMyA2OS40ODIsMTA2LjQ1MiBMMTExLjk1NSwxMzAuOTczIEMxMTIuOTA1LDEzMS41MjIgMTEzLjY3NSwxMzEuMDgzIDExMy42NzUsMTI5Ljk5MyBMMTEzLjY3NSw3NS45OTIiIGlkPSJGaWxsLTI4IiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTExMi43MjcsMTMxLjU2MSBDMTEyLjQzLDEzMS41NjEgMTEyLjEwNywxMzEuNDY2IDExMS43OCwxMzEuMjc2IEw2OS4zMDcsMTA2Ljc1NSBDNjguMjQ0LDEwNi4xNDIgNjcuNDEyLDEwNC43MDUgNjcuNDEyLDEwMy40ODUgTDY3LjQxMiw0OS40ODQgQzY3LjQxMiw0OS4yOSA2Ny41NjksNDkuMTM0IDY3Ljc2Miw0OS4xMzQgQzY3Ljk1Niw0OS4xMzQgNjguMTEzLDQ5LjI5IDY4LjExMyw0OS40ODQgTDY4LjExMywxMDMuNDg1IEM2OC4xMTMsMTA0LjQ0NSA2OC44MiwxMDUuNjY1IDY5LjY1NywxMDYuMTQ4IEwxMTIuMTMsMTMwLjY3IEMxMTIuNDc0LDEzMC44NjggMTEyLjc5MSwxMzAuOTEzIDExMywxMzAuNzkyIEMxMTMuMjA2LDEzMC42NzMgMTEzLjMyNSwxMzAuMzgxIDExMy4zMjUsMTI5Ljk5MyBMMTEzLjMyNSw3NS45OTIgQzExMy4zMjUsNzUuNzk4IDExMy40ODIsNzUuNjQxIDExMy42NzUsNzUuNjQxIEMxMTMuODY5LDc1LjY0MSAxMTQuMDI1LDc1Ljc5OCAxMTQuMDI1LDc1Ljk5MiBMMTE0LjAyNSwxMjkuOTkzIEMxMTQuMDI1LDEzMC42NDggMTEzLjc4NiwxMzEuMTQ3IDExMy4zNSwxMzEuMzk5IEMxMTMuMTYyLDEzMS41MDcgMTEyLjk1MiwxMzEuNTYxIDExMi43MjcsMTMxLjU2MSIgaWQ9IkZpbGwtMjkiIGZpbGw9IiM0NTVBNjQiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTEyLjg2LDQwLjUxMiBDMTEyLjg2LDQwLjUxMiAxMTIuODYsNDAuNTEyIDExMi44NTksNDAuNTEyIEMxMTAuNTQxLDQwLjUxMiAxMDguMzYsMzkuOTkgMTA2LjcxNywzOS4wNDEgQzEwNS4wMTIsMzguMDU3IDEwNC4wNzQsMzYuNzI2IDEwNC4wNzQsMzUuMjkyIEMxMDQuMDc0LDMzLjg0NyAxMDUuMDI2LDMyLjUwMSAxMDYuNzU0LDMxLjUwNCBMMTE4Ljc5NSwyNC41NTEgQzEyMC40NjMsMjMuNTg5IDEyMi42NjksMjMuMDU4IDEyNS4wMDcsMjMuMDU4IEMxMjcuMzI1LDIzLjA1OCAxMjkuNTA2LDIzLjU4MSAxMzEuMTUsMjQuNTMgQzEzMi44NTQsMjUuNTE0IDEzMy43OTMsMjYuODQ1IDEzMy43OTMsMjguMjc4IEMxMzMuNzkzLDI5LjcyNCAxMzIuODQxLDMxLjA2OSAxMzEuMTEzLDMyLjA2NyBMMTE5LjA3MSwzOS4wMTkgQzExNy40MDMsMzkuOTgyIDExNS4xOTcsNDAuNTEyIDExMi44Niw0MC41MTIgTDExMi44Niw0MC41MTIgWiBNMTI1LjAwNywyMy43NTkgQzEyMi43OSwyMy43NTkgMTIwLjcwOSwyNC4yNTYgMTE5LjE0NiwyNS4xNTggTDEwNy4xMDQsMzIuMTEgQzEwNS42MDIsMzIuOTc4IDEwNC43NzQsMzQuMTA4IDEwNC43NzQsMzUuMjkyIEMxMDQuNzc0LDM2LjQ2NSAxMDUuNTg5LDM3LjU4MSAxMDcuMDY3LDM4LjQzNCBDMTA4LjYwNSwzOS4zMjMgMTEwLjY2MywzOS44MTIgMTEyLjg1OSwzOS44MTIgTDExMi44NiwzOS44MTIgQzExNS4wNzYsMzkuODEyIDExNy4xNTgsMzkuMzE1IDExOC43MjEsMzguNDEzIEwxMzAuNzYyLDMxLjQ2IEMxMzIuMjY0LDMwLjU5MyAxMzMuMDkyLDI5LjQ2MyAxMzMuMDkyLDI4LjI3OCBDMTMzLjA5MiwyNy4xMDYgMTMyLjI3OCwyNS45OSAxMzAuOCwyNS4xMzYgQzEyOS4yNjEsMjQuMjQ4IDEyNy4yMDQsMjMuNzU5IDEyNS4wMDcsMjMuNzU5IEwxMjUuMDA3LDIzLjc1OSBaIiBpZD0iRmlsbC0zMCIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNjUuNjMsMTYuMjE5IEwxNTkuODk2LDE5LjUzIEMxNTYuNzI5LDIxLjM1OCAxNTEuNjEsMjEuMzY3IDE0OC40NjMsMTkuNTUgQzE0NS4zMTYsMTcuNzMzIDE0NS4zMzIsMTQuNzc4IDE0OC40OTksMTIuOTQ5IEwxNTQuMjMzLDkuNjM5IEwxNjUuNjMsMTYuMjE5IiBpZD0iRmlsbC0zMSIgZmlsbD0iI0ZBRkFGQSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xNTQuMjMzLDEwLjQ0OCBMMTY0LjIyOCwxNi4yMTkgTDE1OS41NDYsMTguOTIzIEMxNTguMTEyLDE5Ljc1IDE1Ni4xOTQsMjAuMjA2IDE1NC4xNDcsMjAuMjA2IEMxNTIuMTE4LDIwLjIwNiAxNTAuMjI0LDE5Ljc1NyAxNDguODE0LDE4Ljk0MyBDMTQ3LjUyNCwxOC4xOTkgMTQ2LjgxNCwxNy4yNDkgMTQ2LjgxNCwxNi4yNjkgQzE0Ni44MTQsMTUuMjc4IDE0Ny41MzcsMTQuMzE0IDE0OC44NSwxMy41NTYgTDE1NC4yMzMsMTAuNDQ4IE0xNTQuMjMzLDkuNjM5IEwxNDguNDk5LDEyLjk0OSBDMTQ1LjMzMiwxNC43NzggMTQ1LjMxNiwxNy43MzMgMTQ4LjQ2MywxOS41NSBDMTUwLjAzMSwyMC40NTUgMTUyLjA4NiwyMC45MDcgMTU0LjE0NywyMC45MDcgQzE1Ni4yMjQsMjAuOTA3IDE1OC4zMDYsMjAuNDQ3IDE1OS44OTYsMTkuNTMgTDE2NS42MywxNi4yMTkgTDE1NC4yMzMsOS42MzkiIGlkPSJGaWxsLTMyIiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE0NS40NDUsNzIuNjY3IEwxNDUuNDQ1LDcyLjY2NyBDMTQzLjY3Miw3Mi42NjcgMTQyLjIwNCw3MS44MTcgMTQxLjIwMiw3MC40MjIgQzE0MS4xMzUsNzAuMzMgMTQxLjE0NSw3MC4xNDcgMTQxLjIyNSw3MC4wNjYgQzE0MS4zMDUsNjkuOTg1IDE0MS40MzIsNjkuOTQ2IDE0MS41MjUsNzAuMDExIEMxNDIuMzA2LDcwLjU1OSAxNDMuMjMxLDcwLjgyMyAxNDQuMjc2LDcwLjgyMiBDMTQ1LjU5OCw3MC44MjIgMTQ3LjAzLDcwLjM3NiAxNDguNTMyLDY5LjUwOSBDMTUzLjg0Miw2Ni40NDMgMTU4LjE2Myw1OC45ODcgMTU4LjE2Myw1Mi44OTQgQzE1OC4xNjMsNTAuOTY3IDE1Ny43MjEsNDkuMzMyIDE1Ni44ODQsNDguMTY4IEMxNTYuODE4LDQ4LjA3NiAxNTYuODI4LDQ3Ljk0OCAxNTYuOTA4LDQ3Ljg2NyBDMTU2Ljk4OCw0Ny43ODYgMTU3LjExNCw0Ny43NzQgMTU3LjIwOCw0Ny44NCBDMTU4Ljg3OCw0OS4wMTIgMTU5Ljc5OCw1MS4yMiAxNTkuNzk4LDU0LjA1OSBDMTU5Ljc5OCw2MC4zMDEgMTU1LjM3Myw2OC4wNDYgMTQ5LjkzMyw3MS4xODYgQzE0OC4zNiw3Mi4wOTQgMTQ2Ljg1LDcyLjY2NyAxNDUuNDQ1LDcyLjY2NyBMMTQ1LjQ0NSw3Mi42NjcgWiBNMTQyLjQ3Niw3MSBDMTQzLjI5LDcxLjY1MSAxNDQuMjk2LDcyLjAwMiAxNDUuNDQ1LDcyLjAwMiBDMTQ2Ljc2Nyw3Mi4wMDIgMTQ4LjE5OCw3MS41NSAxNDkuNyw3MC42ODIgQzE1NS4wMSw2Ny42MTcgMTU5LjMzMSw2MC4xNTkgMTU5LjMzMSw1NC4wNjUgQzE1OS4zMzEsNTIuMDg1IDE1OC44NjgsNTAuNDM1IDE1OC4wMDYsNDkuMjcyIEMxNTguNDE3LDUwLjMwNyAxNTguNjMsNTEuNTMyIDE1OC42Myw1Mi44OTIgQzE1OC42Myw1OS4xMzQgMTU0LjIwNSw2Ni43NjcgMTQ4Ljc2NSw2OS45MDcgQzE0Ny4xOTIsNzAuODE2IDE0NS42ODEsNzEuMjgzIDE0NC4yNzYsNzEuMjgzIEMxNDMuNjM0LDcxLjI4MyAxNDMuMDMzLDcxLjE5MiAxNDIuNDc2LDcxIEwxNDIuNDc2LDcxIFoiIGlkPSJGaWxsLTMzIiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE0OC42NDgsNjkuNzA0IEMxNTQuMDMyLDY2LjU5NiAxNTguMzk2LDU5LjA2OCAxNTguMzk2LDUyLjg5MSBDMTU4LjM5Niw1MC44MzkgMTU3LjkxMyw0OS4xOTggMTU3LjA3NCw0OC4wMyBDMTU1LjI4OSw0Ni43NzggMTUyLjY5OSw0Ni44MzYgMTQ5LjgxNiw0OC41MDEgQzE0NC40MzMsNTEuNjA5IDE0MC4wNjgsNTkuMTM3IDE0MC4wNjgsNjUuMzE0IEMxNDAuMDY4LDY3LjM2NSAxNDAuNTUyLDY5LjAwNiAxNDEuMzkxLDcwLjE3NCBDMTQzLjE3Niw3MS40MjcgMTQ1Ljc2NSw3MS4zNjkgMTQ4LjY0OCw2OS43MDQiIGlkPSJGaWxsLTM0IiBmaWxsPSIjRkFGQUZBIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTE0NC4yNzYsNzEuMjc2IEwxNDQuMjc2LDcxLjI3NiBDMTQzLjEzMyw3MS4yNzYgMTQyLjExOCw3MC45NjkgMTQxLjI1Nyw3MC4zNjUgQzE0MS4yMzYsNzAuMzUxIDE0MS4yMTcsNzAuMzMyIDE0MS4yMDIsNzAuMzExIEMxNDAuMzA3LDY5LjA2NyAxMzkuODM1LDY3LjMzOSAxMzkuODM1LDY1LjMxNCBDMTM5LjgzNSw1OS4wNzMgMTQ0LjI2LDUxLjQzOSAxNDkuNyw0OC4yOTggQzE1MS4yNzMsNDcuMzkgMTUyLjc4NCw0Ni45MjkgMTU0LjE4OSw0Ni45MjkgQzE1NS4zMzIsNDYuOTI5IDE1Ni4zNDcsNDcuMjM2IDE1Ny4yMDgsNDcuODM5IEMxNTcuMjI5LDQ3Ljg1NCAxNTcuMjQ4LDQ3Ljg3MyAxNTcuMjYzLDQ3Ljg5NCBDMTU4LjE1Nyw0OS4xMzggMTU4LjYzLDUwLjg2NSAxNTguNjMsNTIuODkxIEMxNTguNjMsNTkuMTMyIDE1NC4yMDUsNjYuNzY2IDE0OC43NjUsNjkuOTA3IEMxNDcuMTkyLDcwLjgxNSAxNDUuNjgxLDcxLjI3NiAxNDQuMjc2LDcxLjI3NiBMMTQ0LjI3Niw3MS4yNzYgWiBNMTQxLjU1OCw3MC4xMDQgQzE0Mi4zMzEsNzAuNjM3IDE0My4yNDUsNzEuMDA1IDE0NC4yNzYsNzEuMDA1IEMxNDUuNTk4LDcxLjAwNSAxNDcuMDMsNzAuNDY3IDE0OC41MzIsNjkuNiBDMTUzLjg0Miw2Ni41MzQgMTU4LjE2Myw1OS4wMzMgMTU4LjE2Myw1Mi45MzkgQzE1OC4xNjMsNTEuMDMxIDE1Ny43MjksNDkuMzg1IDE1Ni45MDcsNDguMjIzIEMxNTYuMTMzLDQ3LjY5MSAxNTUuMjE5LDQ3LjQwOSAxNTQuMTg5LDQ3LjQwOSBDMTUyLjg2Nyw0Ny40MDkgMTUxLjQzNSw0Ny44NDIgMTQ5LjkzMyw0OC43MDkgQzE0NC42MjMsNTEuNzc1IDE0MC4zMDIsNTkuMjczIDE0MC4zMDIsNjUuMzY2IEMxNDAuMzAyLDY3LjI3NiAxNDAuNzM2LDY4Ljk0MiAxNDEuNTU4LDcwLjEwNCBMMTQxLjU1OCw3MC4xMDQgWiIgaWQ9IkZpbGwtMzUiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTUwLjcyLDY1LjM2MSBMMTUwLjM1Nyw2NS4wNjYgQzE1MS4xNDcsNjQuMDkyIDE1MS44NjksNjMuMDQgMTUyLjUwNSw2MS45MzggQzE1My4zMTMsNjAuNTM5IDE1My45NzgsNTkuMDY3IDE1NC40ODIsNTcuNTYzIEwxNTQuOTI1LDU3LjcxMiBDMTU0LjQxMiw1OS4yNDUgMTUzLjczMyw2MC43NDUgMTUyLjkxLDYyLjE3MiBDMTUyLjI2Miw2My4yOTUgMTUxLjUyNSw2NC4zNjggMTUwLjcyLDY1LjM2MSIgaWQ9IkZpbGwtMzYiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTE1LjkxNyw4NC41MTQgTDExNS41NTQsODQuMjIgQzExNi4zNDQsODMuMjQ1IDExNy4wNjYsODIuMTk0IDExNy43MDIsODEuMDkyIEMxMTguNTEsNzkuNjkyIDExOS4xNzUsNzguMjIgMTE5LjY3OCw3Ni43MTcgTDEyMC4xMjEsNzYuODY1IEMxMTkuNjA4LDc4LjM5OCAxMTguOTMsNzkuODk5IDExOC4xMDYsODEuMzI2IEMxMTcuNDU4LDgyLjQ0OCAxMTYuNzIyLDgzLjUyMSAxMTUuOTE3LDg0LjUxNCIgaWQ9IkZpbGwtMzciIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTE0LDEzMC40NzYgTDExNCwxMzAuMDA4IEwxMTQsNzYuMDUyIEwxMTQsNzUuNTg0IEwxMTQsNzYuMDUyIEwxMTQsMTMwLjAwOCBMMTE0LDEzMC40NzYiIGlkPSJGaWxsLTM4IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICA8L2c+CiAgICAgICAgICAgICAgICA8ZyBpZD0iSW1wb3J0ZWQtTGF5ZXJzLUNvcHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYyLjAwMDAwMCwgMC4wMDAwMDApIiBza2V0Y2g6dHlwZT0iTVNTaGFwZUdyb3VwIj4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTkuODIyLDM3LjQ3NCBDMTkuODM5LDM3LjMzOSAxOS43NDcsMzcuMTk0IDE5LjU1NSwzNy4wODIgQzE5LjIyOCwzNi44OTQgMTguNzI5LDM2Ljg3MiAxOC40NDYsMzcuMDM3IEwxMi40MzQsNDAuNTA4IEMxMi4zMDMsNDAuNTg0IDEyLjI0LDQwLjY4NiAxMi4yNDMsNDAuNzkzIEMxMi4yNDUsNDAuOTI1IDEyLjI0NSw0MS4yNTQgMTIuMjQ1LDQxLjM3MSBMMTIuMjQ1LDQxLjQxNCBMMTIuMjM4LDQxLjU0MiBDOC4xNDgsNDMuODg3IDUuNjQ3LDQ1LjMyMSA1LjY0Nyw0NS4zMjEgQzUuNjQ2LDQ1LjMyMSAzLjU3LDQ2LjM2NyAyLjg2LDUwLjUxMyBDMi44Niw1MC41MTMgMS45NDgsNTcuNDc0IDEuOTYyLDcwLjI1OCBDMS45NzcsODIuODI4IDIuNTY4LDg3LjMyOCAzLjEyOSw5MS42MDkgQzMuMzQ5LDkzLjI5MyA2LjEzLDkzLjczNCA2LjEzLDkzLjczNCBDNi40NjEsOTMuNzc0IDYuODI4LDkzLjcwNyA3LjIxLDkzLjQ4NiBMODIuNDgzLDQ5LjkzNSBDODQuMjkxLDQ4Ljg2NiA4NS4xNSw0Ni4yMTYgODUuNTM5LDQzLjY1MSBDODYuNzUyLDM1LjY2MSA4Ny4yMTQsMTAuNjczIDg1LjI2NCwzLjc3MyBDODUuMDY4LDMuMDggODQuNzU0LDIuNjkgODQuMzk2LDIuNDkxIEw4Mi4zMSwxLjcwMSBDODEuNTgzLDEuNzI5IDgwLjg5NCwyLjE2OCA4MC43NzYsMi4yMzYgQzgwLjYzNiwyLjMxNyA0MS44MDcsMjQuNTg1IDIwLjAzMiwzNy4wNzIgTDE5LjgyMiwzNy40NzQiIGlkPSJGaWxsLTEiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNODIuMzExLDEuNzAxIEw4NC4zOTYsMi40OTEgQzg0Ljc1NCwyLjY5IDg1LjA2OCwzLjA4IDg1LjI2NCwzLjc3MyBDODcuMjEzLDEwLjY3MyA4Ni43NTEsMzUuNjYgODUuNTM5LDQzLjY1MSBDODUuMTQ5LDQ2LjIxNiA4NC4yOSw0OC44NjYgODIuNDgzLDQ5LjkzNSBMNy4yMSw5My40ODYgQzYuODk3LDkzLjY2NyA2LjU5NSw5My43NDQgNi4zMTQsOTMuNzQ0IEw2LjEzMSw5My43MzMgQzYuMTMxLDkzLjczNCAzLjM0OSw5My4yOTMgMy4xMjgsOTEuNjA5IEMyLjU2OCw4Ny4zMjcgMS45NzcsODIuODI4IDEuOTYzLDcwLjI1OCBDMS45NDgsNTcuNDc0IDIuODYsNTAuNTEzIDIuODYsNTAuNTEzIEMzLjU3LDQ2LjM2NyA1LjY0Nyw0NS4zMjEgNS42NDcsNDUuMzIxIEM1LjY0Nyw0NS4zMjEgOC4xNDgsNDMuODg3IDEyLjIzOCw0MS41NDIgTDEyLjI0NSw0MS40MTQgTDEyLjI0NSw0MS4zNzEgQzEyLjI0NSw0MS4yNTQgMTIuMjQ1LDQwLjkyNSAxMi4yNDMsNDAuNzkzIEMxMi4yNCw0MC42ODYgMTIuMzAyLDQwLjU4MyAxMi40MzQsNDAuNTA4IEwxOC40NDYsMzcuMDM2IEMxOC41NzQsMzYuOTYyIDE4Ljc0NiwzNi45MjYgMTguOTI3LDM2LjkyNiBDMTkuMTQ1LDM2LjkyNiAxOS4zNzYsMzYuOTc5IDE5LjU1NCwzNy4wODIgQzE5Ljc0NywzNy4xOTQgMTkuODM5LDM3LjM0IDE5LjgyMiwzNy40NzQgTDIwLjAzMywzNy4wNzIgQzQxLjgwNiwyNC41ODUgODAuNjM2LDIuMzE4IDgwLjc3NywyLjIzNiBDODAuODk0LDIuMTY4IDgxLjU4MywxLjcyOSA4Mi4zMTEsMS43MDEgTTgyLjMxMSwwLjcwNCBMODIuMjcyLDAuNzA1IEM4MS42NTQsMC43MjggODAuOTg5LDAuOTQ5IDgwLjI5OCwxLjM2MSBMODAuMjc3LDEuMzczIEM4MC4xMjksMS40NTggNTkuNzY4LDEzLjEzNSAxOS43NTgsMzYuMDc5IEMxOS41LDM1Ljk4MSAxOS4yMTQsMzUuOTI5IDE4LjkyNywzNS45MjkgQzE4LjU2MiwzNS45MjkgMTguMjIzLDM2LjAxMyAxNy45NDcsMzYuMTczIEwxMS45MzUsMzkuNjQ0IEMxMS40OTMsMzkuODk5IDExLjIzNiw0MC4zMzQgMTEuMjQ2LDQwLjgxIEwxMS4yNDcsNDAuOTYgTDUuMTY3LDQ0LjQ0NyBDNC43OTQsNDQuNjQ2IDIuNjI1LDQ1Ljk3OCAxLjg3Nyw1MC4zNDUgTDEuODcxLDUwLjM4NCBDMS44NjIsNTAuNDU0IDAuOTUxLDU3LjU1NyAwLjk2NSw3MC4yNTkgQzAuOTc5LDgyLjg3OSAxLjU2OCw4Ny4zNzUgMi4xMzcsOTEuNzI0IEwyLjEzOSw5MS43MzkgQzIuNDQ3LDk0LjA5NCA1LjYxNCw5NC42NjIgNS45NzUsOTQuNzE5IEw2LjAwOSw5NC43MjMgQzYuMTEsOTQuNzM2IDYuMjEzLDk0Ljc0MiA2LjMxNCw5NC43NDIgQzYuNzksOTQuNzQyIDcuMjYsOTQuNjEgNy43MSw5NC4zNSBMODIuOTgzLDUwLjc5OCBDODQuNzk0LDQ5LjcyNyA4NS45ODIsNDcuMzc1IDg2LjUyNSw0My44MDEgQzg3LjcxMSwzNS45ODcgODguMjU5LDEwLjcwNSA4Ni4yMjQsMy41MDIgQzg1Ljk3MSwyLjYwOSA4NS41MiwxLjk3NSA4NC44ODEsMS42MiBMODQuNzQ5LDEuNTU4IEw4Mi42NjQsMC43NjkgQzgyLjU1MSwwLjcyNSA4Mi40MzEsMC43MDQgODIuMzExLDAuNzA0IiBpZD0iRmlsbC0yIiBmaWxsPSIjNDU1QTY0Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTY2LjI2NywxMS41NjUgTDY3Ljc2MiwxMS45OTkgTDExLjQyMyw0NC4zMjUiIGlkPSJGaWxsLTMiIGZpbGw9IiNGRkZGRkYiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTIuMjAyLDkwLjU0NSBDMTIuMDI5LDkwLjU0NSAxMS44NjIsOTAuNDU1IDExLjc2OSw5MC4yOTUgQzExLjYzMiw5MC4wNTcgMTEuNzEzLDg5Ljc1MiAxMS45NTIsODkuNjE0IEwzMC4zODksNzguOTY5IEMzMC42MjgsNzguODMxIDMwLjkzMyw3OC45MTMgMzEuMDcxLDc5LjE1MiBDMzEuMjA4LDc5LjM5IDMxLjEyNyw3OS42OTYgMzAuODg4LDc5LjgzMyBMMTIuNDUxLDkwLjQ3OCBMMTIuMjAyLDkwLjU0NSIgaWQ9IkZpbGwtNCIgZmlsbD0iIzYwN0Q4QiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMy43NjQsNDIuNjU0IEwxMy42NTYsNDIuNTkyIEwxMy43MDIsNDIuNDIxIEwxOC44MzcsMzkuNDU3IEwxOS4wMDcsMzkuNTAyIEwxOC45NjIsMzkuNjczIEwxMy44MjcsNDIuNjM3IEwxMy43NjQsNDIuNjU0IiBpZD0iRmlsbC01IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTguNTIsOTAuMzc1IEw4LjUyLDQ2LjQyMSBMOC41ODMsNDYuMzg1IEw3NS44NCw3LjU1NCBMNzUuODQsNTEuNTA4IEw3NS43NzgsNTEuNTQ0IEw4LjUyLDkwLjM3NSBMOC41Miw5MC4zNzUgWiBNOC43Nyw0Ni41NjQgTDguNzcsODkuOTQ0IEw3NS41OTEsNTEuMzY1IEw3NS41OTEsNy45ODUgTDguNzcsNDYuNTY0IEw4Ljc3LDQ2LjU2NCBaIiBpZD0iRmlsbC02IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTI0Ljk4Niw4My4xODIgQzI0Ljc1Niw4My4zMzEgMjQuMzc0LDgzLjU2NiAyNC4xMzcsODMuNzA1IEwxMi42MzIsOTAuNDA2IEMxMi4zOTUsOTAuNTQ1IDEyLjQyNiw5MC42NTggMTIuNyw5MC42NTggTDEzLjI2NSw5MC42NTggQzEzLjU0LDkwLjY1OCAxMy45NTgsOTAuNTQ1IDE0LjE5NSw5MC40MDYgTDI1LjcsODMuNzA1IEMyNS45MzcsODMuNTY2IDI2LjEyOCw4My40NTIgMjYuMTI1LDgzLjQ0OSBDMjYuMTIyLDgzLjQ0NyAyNi4xMTksODMuMjIgMjYuMTE5LDgyLjk0NiBDMjYuMTE5LDgyLjY3MiAyNS45MzEsODIuNTY5IDI1LjcwMSw4Mi43MTkgTDI0Ljk4Niw4My4xODIiIGlkPSJGaWxsLTciIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTMuMjY2LDkwLjc4MiBMMTIuNyw5MC43ODIgQzEyLjUsOTAuNzgyIDEyLjM4NCw5MC43MjYgMTIuMzU0LDkwLjYxNiBDMTIuMzI0LDkwLjUwNiAxMi4zOTcsOTAuMzk5IDEyLjU2OSw5MC4yOTkgTDI0LjA3NCw4My41OTcgQzI0LjMxLDgzLjQ1OSAyNC42ODksODMuMjI2IDI0LjkxOCw4My4wNzggTDI1LjYzMyw4Mi42MTQgQzI1LjcyMyw4Mi41NTUgMjUuODEzLDgyLjUyNSAyNS44OTksODIuNTI1IEMyNi4wNzEsODIuNTI1IDI2LjI0NCw4Mi42NTUgMjYuMjQ0LDgyLjk0NiBDMjYuMjQ0LDgzLjE2IDI2LjI0NSw4My4zMDkgMjYuMjQ3LDgzLjM4MyBMMjYuMjUzLDgzLjM4NyBMMjYuMjQ5LDgzLjQ1NiBDMjYuMjQ2LDgzLjUzMSAyNi4yNDYsODMuNTMxIDI1Ljc2Myw4My44MTIgTDE0LjI1OCw5MC41MTQgQzE0LDkwLjY2NSAxMy41NjQsOTAuNzgyIDEzLjI2Niw5MC43ODIgTDEzLjI2Niw5MC43ODIgWiBNMTIuNjY2LDkwLjUzMiBMMTIuNyw5MC41MzMgTDEzLjI2Niw5MC41MzMgQzEzLjUxOCw5MC41MzMgMTMuOTE1LDkwLjQyNSAxNC4xMzIsOTAuMjk5IEwyNS42MzcsODMuNTk3IEMyNS44MDUsODMuNDk5IDI1LjkzMSw4My40MjQgMjUuOTk4LDgzLjM4MyBDMjUuOTk0LDgzLjI5OSAyNS45OTQsODMuMTY1IDI1Ljk5NCw4Mi45NDYgTDI1Ljg5OSw4Mi43NzUgTDI1Ljc2OCw4Mi44MjQgTDI1LjA1NCw4My4yODcgQzI0LjgyMiw4My40MzcgMjQuNDM4LDgzLjY3MyAyNC4yLDgzLjgxMiBMMTIuNjk1LDkwLjUxNCBMMTIuNjY2LDkwLjUzMiBMMTIuNjY2LDkwLjUzMiBaIiBpZD0iRmlsbC04IiBmaWxsPSIjNjA3RDhCIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTEzLjI2Niw4OS44NzEgTDEyLjcsODkuODcxIEMxMi41LDg5Ljg3MSAxMi4zODQsODkuODE1IDEyLjM1NCw4OS43MDUgQzEyLjMyNCw4OS41OTUgMTIuMzk3LDg5LjQ4OCAxMi41NjksODkuMzg4IEwyNC4wNzQsODIuNjg2IEMyNC4zMzIsODIuNTM1IDI0Ljc2OCw4Mi40MTggMjUuMDY3LDgyLjQxOCBMMjUuNjMyLDgyLjQxOCBDMjUuODMyLDgyLjQxOCAyNS45NDgsODIuNDc0IDI1Ljk3OCw4Mi41ODQgQzI2LjAwOCw4Mi42OTQgMjUuOTM1LDgyLjgwMSAyNS43NjMsODIuOTAxIEwxNC4yNTgsODkuNjAzIEMxNCw4OS43NTQgMTMuNTY0LDg5Ljg3MSAxMy4yNjYsODkuODcxIEwxMy4yNjYsODkuODcxIFogTTEyLjY2Niw4OS42MjEgTDEyLjcsODkuNjIyIEwxMy4yNjYsODkuNjIyIEMxMy41MTgsODkuNjIyIDEzLjkxNSw4OS41MTUgMTQuMTMyLDg5LjM4OCBMMjUuNjM3LDgyLjY4NiBMMjUuNjY3LDgyLjY2OCBMMjUuNjMyLDgyLjY2NyBMMjUuMDY3LDgyLjY2NyBDMjQuODE1LDgyLjY2NyAyNC40MTgsODIuNzc1IDI0LjIsODIuOTAxIEwxMi42OTUsODkuNjAzIEwxMi42NjYsODkuNjIxIEwxMi42NjYsODkuNjIxIFoiIGlkPSJGaWxsLTkiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNMTIuMzcsOTAuODAxIEwxMi4zNyw4OS41NTQgTDEyLjM3LDkwLjgwMSIgaWQ9IkZpbGwtMTAiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNi4xMyw5My45MDEgQzUuMzc5LDkzLjgwOCA0LjgxNiw5My4xNjQgNC42OTEsOTIuNTI1IEMzLjg2LDg4LjI4NyAzLjU0LDgzLjc0MyAzLjUyNiw3MS4xNzMgQzMuNTExLDU4LjM4OSA0LjQyMyw1MS40MjggNC40MjMsNTEuNDI4IEM1LjEzNCw0Ny4yODIgNy4yMSw0Ni4yMzYgNy4yMSw0Ni4yMzYgQzcuMjEsNDYuMjM2IDgxLjY2NywzLjI1IDgyLjA2OSwzLjAxNyBDODIuMjkyLDIuODg4IDg0LjU1NiwxLjQzMyA4NS4yNjQsMy45NCBDODcuMjE0LDEwLjg0IDg2Ljc1MiwzNS44MjcgODUuNTM5LDQzLjgxOCBDODUuMTUsNDYuMzgzIDg0LjI5MSw0OS4wMzMgODIuNDgzLDUwLjEwMSBMNy4yMSw5My42NTMgQzYuODI4LDkzLjg3NCA2LjQ2MSw5My45NDEgNi4xMyw5My45MDEgQzYuMTMsOTMuOTAxIDMuMzQ5LDkzLjQ2IDMuMTI5LDkxLjc3NiBDMi41NjgsODcuNDk1IDEuOTc3LDgyLjk5NSAxLjk2Miw3MC40MjUgQzEuOTQ4LDU3LjY0MSAyLjg2LDUwLjY4IDIuODYsNTAuNjggQzMuNTcsNDYuNTM0IDUuNjQ3LDQ1LjQ4OSA1LjY0Nyw0NS40ODkgQzUuNjQ2LDQ1LjQ4OSA4LjA2NSw0NC4wOTIgMTIuMjQ1LDQxLjY3OSBMMTMuMTE2LDQxLjU2IEwxOS43MTUsMzcuNzMgTDE5Ljc2MSwzNy4yNjkgTDYuMTMsOTMuOTAxIiBpZD0iRmlsbC0xMSIgZmlsbD0iI0ZBRkFGQSI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02LjMxNyw5NC4xNjEgTDYuMTAyLDk0LjE0OCBMNi4xMDEsOTQuMTQ4IEw1Ljg1Nyw5NC4xMDEgQzUuMTM4LDkzLjk0NSAzLjA4NSw5My4zNjUgMi44ODEsOTEuODA5IEMyLjMxMyw4Ny40NjkgMS43MjcsODIuOTk2IDEuNzEzLDcwLjQyNSBDMS42OTksNTcuNzcxIDIuNjA0LDUwLjcxOCAyLjYxMyw1MC42NDggQzMuMzM4LDQ2LjQxNyA1LjQ0NSw0NS4zMSA1LjUzNSw0NS4yNjYgTDEyLjE2Myw0MS40MzkgTDEzLjAzMyw0MS4zMiBMMTkuNDc5LDM3LjU3OCBMMTkuNTEzLDM3LjI0NCBDMTkuNTI2LDM3LjEwNyAxOS42NDcsMzcuMDA4IDE5Ljc4NiwzNy4wMjEgQzE5LjkyMiwzNy4wMzQgMjAuMDIzLDM3LjE1NiAyMC4wMDksMzcuMjkzIEwxOS45NSwzNy44ODIgTDEzLjE5OCw0MS44MDEgTDEyLjMyOCw0MS45MTkgTDUuNzcyLDQ1LjcwNCBDNS43NDEsNDUuNzIgMy43ODIsNDYuNzcyIDMuMTA2LDUwLjcyMiBDMy4wOTksNTAuNzgyIDIuMTk4LDU3LjgwOCAyLjIxMiw3MC40MjQgQzIuMjI2LDgyLjk2MyAyLjgwOSw4Ny40MiAzLjM3Myw5MS43MjkgQzMuNDY0LDkyLjQyIDQuMDYyLDkyLjg4MyA0LjY4Miw5My4xODEgQzQuNTY2LDkyLjk4NCA0LjQ4Niw5Mi43NzYgNC40NDYsOTIuNTcyIEMzLjY2NSw4OC41ODggMy4yOTEsODQuMzcgMy4yNzYsNzEuMTczIEMzLjI2Miw1OC41MiA0LjE2Nyw1MS40NjYgNC4xNzYsNTEuMzk2IEM0LjkwMSw0Ny4xNjUgNy4wMDgsNDYuMDU5IDcuMDk4LDQ2LjAxNCBDNy4wOTQsNDYuMDE1IDgxLjU0MiwzLjAzNCA4MS45NDQsMi44MDIgTDgxLjk3MiwyLjc4NSBDODIuODc2LDIuMjQ3IDgzLjY5MiwyLjA5NyA4NC4zMzIsMi4zNTIgQzg0Ljg4NywyLjU3MyA4NS4yODEsMy4wODUgODUuNTA0LDMuODcyIEM4Ny41MTgsMTEgODYuOTY0LDM2LjA5MSA4NS43ODUsNDMuODU1IEM4NS4yNzgsNDcuMTk2IDg0LjIxLDQ5LjM3IDgyLjYxLDUwLjMxNyBMNy4zMzUsOTMuODY5IEM2Ljk5OSw5NC4wNjMgNi42NTgsOTQuMTYxIDYuMzE3LDk0LjE2MSBMNi4zMTcsOTQuMTYxIFogTTYuMTcsOTMuNjU0IEM2LjQ2Myw5My42OSA2Ljc3NCw5My42MTcgNy4wODUsOTMuNDM3IEw4Mi4zNTgsNDkuODg2IEM4NC4xODEsNDguODA4IDg0Ljk2LDQ1Ljk3MSA4NS4yOTIsNDMuNzggQzg2LjQ2NiwzNi4wNDkgODcuMDIzLDExLjA4NSA4NS4wMjQsNC4wMDggQzg0Ljg0NiwzLjM3NyA4NC41NTEsMi45NzYgODQuMTQ4LDIuODE2IEM4My42NjQsMi42MjMgODIuOTgyLDIuNzY0IDgyLjIyNywzLjIxMyBMODIuMTkzLDMuMjM0IEM4MS43OTEsMy40NjYgNy4zMzUsNDYuNDUyIDcuMzM1LDQ2LjQ1MiBDNy4zMDQsNDYuNDY5IDUuMzQ2LDQ3LjUyMSA0LjY2OSw1MS40NzEgQzQuNjYyLDUxLjUzIDMuNzYxLDU4LjU1NiAzLjc3NSw3MS4xNzMgQzMuNzksODQuMzI4IDQuMTYxLDg4LjUyNCA0LjkzNiw5Mi40NzYgQzUuMDI2LDkyLjkzNyA1LjQxMiw5My40NTkgNS45NzMsOTMuNjE1IEM2LjA4Nyw5My42NCA2LjE1OCw5My42NTIgNi4xNjksOTMuNjU0IEw2LjE3LDkzLjY1NCBMNi4xNyw5My42NTQgWiIgaWQ9IkZpbGwtMTIiIGZpbGw9IiM0NTVBNjQiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNy4zMTcsNjguOTgyIEM3LjgwNiw2OC43MDEgOC4yMDIsNjguOTI2IDguMjAyLDY5LjQ4NyBDOC4yMDIsNzAuMDQ3IDcuODA2LDcwLjczIDcuMzE3LDcxLjAxMiBDNi44MjksNzEuMjk0IDYuNDMzLDcxLjA2OSA2LjQzMyw3MC41MDggQzYuNDMzLDY5Ljk0OCA2LjgyOSw2OS4yNjUgNy4zMTcsNjguOTgyIiBpZD0iRmlsbC0xMyIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik02LjkyLDcxLjEzMyBDNi42MzEsNzEuMTMzIDYuNDMzLDcwLjkwNSA2LjQzMyw3MC41MDggQzYuNDMzLDY5Ljk0OCA2LjgyOSw2OS4yNjUgNy4zMTcsNjguOTgyIEM3LjQ2LDY4LjkgNy41OTUsNjguODYxIDcuNzE0LDY4Ljg2MSBDOC4wMDMsNjguODYxIDguMjAyLDY5LjA5IDguMjAyLDY5LjQ4NyBDOC4yMDIsNzAuMDQ3IDcuODA2LDcwLjczIDcuMzE3LDcxLjAxMiBDNy4xNzQsNzEuMDk0IDcuMDM5LDcxLjEzMyA2LjkyLDcxLjEzMyBNNy43MTQsNjguNjc0IEM3LjU1Nyw2OC42NzQgNy4zOTIsNjguNzIzIDcuMjI0LDY4LjgyMSBDNi42NzYsNjkuMTM4IDYuMjQ2LDY5Ljg3OSA2LjI0Niw3MC41MDggQzYuMjQ2LDcwLjk5NCA2LjUxNyw3MS4zMiA2LjkyLDcxLjMyIEM3LjA3OCw3MS4zMiA3LjI0Myw3MS4yNzEgNy40MTEsNzEuMTc0IEM3Ljk1OSw3MC44NTcgOC4zODksNzAuMTE3IDguMzg5LDY5LjQ4NyBDOC4zODksNjkuMDAxIDguMTE3LDY4LjY3NCA3LjcxNCw2OC42NzQiIGlkPSJGaWxsLTE0IiBmaWxsPSIjODA5N0EyIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTYuOTIsNzAuOTQ3IEM2LjY0OSw3MC45NDcgNi42MjEsNzAuNjQgNi42MjEsNzAuNTA4IEM2LjYyMSw3MC4wMTcgNi45ODIsNjkuMzkyIDcuNDExLDY5LjE0NSBDNy41MjEsNjkuMDgyIDcuNjI1LDY5LjA0OSA3LjcxNCw2OS4wNDkgQzcuOTg2LDY5LjA0OSA4LjAxNSw2OS4zNTUgOC4wMTUsNjkuNDg3IEM4LjAxNSw2OS45NzggNy42NTIsNzAuNjAzIDcuMjI0LDcwLjg1MSBDNy4xMTUsNzAuOTE0IDcuMDEsNzAuOTQ3IDYuOTIsNzAuOTQ3IE03LjcxNCw2OC44NjEgQzcuNTk1LDY4Ljg2MSA3LjQ2LDY4LjkgNy4zMTcsNjguOTgyIEM2LjgyOSw2OS4yNjUgNi40MzMsNjkuOTQ4IDYuNDMzLDcwLjUwOCBDNi40MzMsNzAuOTA1IDYuNjMxLDcxLjEzMyA2LjkyLDcxLjEzMyBDNy4wMzksNzEuMTMzIDcuMTc0LDcxLjA5NCA3LjMxNyw3MS4wMTIgQzcuODA2LDcwLjczIDguMjAyLDcwLjA0NyA4LjIwMiw2OS40ODcgQzguMjAyLDY5LjA5IDguMDAzLDY4Ljg2MSA3LjcxNCw2OC44NjEiIGlkPSJGaWxsLTE1IiBmaWxsPSIjODA5N0EyIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTcuNDQ0LDg1LjM1IEM3LjcwOCw4NS4xOTggNy45MjEsODUuMzE5IDcuOTIxLDg1LjYyMiBDNy45MjEsODUuOTI1IDcuNzA4LDg2LjI5MiA3LjQ0NCw4Ni40NDQgQzcuMTgxLDg2LjU5NyA2Ljk2Nyw4Ni40NzUgNi45NjcsODYuMTczIEM2Ljk2Nyw4NS44NzEgNy4xODEsODUuNTAyIDcuNDQ0LDg1LjM1IiBpZD0iRmlsbC0xNiIgZmlsbD0iI0ZGRkZGRiI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik03LjIzLDg2LjUxIEM3LjA3NCw4Ni41MSA2Ljk2Nyw4Ni4zODcgNi45NjcsODYuMTczIEM2Ljk2Nyw4NS44NzEgNy4xODEsODUuNTAyIDcuNDQ0LDg1LjM1IEM3LjUyMSw4NS4zMDUgNy41OTQsODUuMjg0IDcuNjU4LDg1LjI4NCBDNy44MTQsODUuMjg0IDcuOTIxLDg1LjQwOCA3LjkyMSw4NS42MjIgQzcuOTIxLDg1LjkyNSA3LjcwOCw4Ni4yOTIgNy40NDQsODYuNDQ0IEM3LjM2Nyw4Ni40ODkgNy4yOTQsODYuNTEgNy4yMyw4Ni41MSBNNy42NTgsODUuMDk4IEM3LjU1OCw4NS4wOTggNy40NTUsODUuMTI3IDcuMzUxLDg1LjE4OCBDNy4wMzEsODUuMzczIDYuNzgxLDg1LjgwNiA2Ljc4MSw4Ni4xNzMgQzYuNzgxLDg2LjQ4MiA2Ljk2Niw4Ni42OTcgNy4yMyw4Ni42OTcgQzcuMzMsODYuNjk3IDcuNDMzLDg2LjY2NiA3LjUzOCw4Ni42MDcgQzcuODU4LDg2LjQyMiA4LjEwOCw4NS45ODkgOC4xMDgsODUuNjIyIEM4LjEwOCw4NS4zMTMgNy45MjMsODUuMDk4IDcuNjU4LDg1LjA5OCIgaWQ9IkZpbGwtMTciIGZpbGw9IiM4MDk3QTIiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNNy4yMyw4Ni4zMjIgTDcuMTU0LDg2LjE3MyBDNy4xNTQsODUuOTM4IDcuMzMzLDg1LjYyOSA3LjUzOCw4NS41MTIgTDcuNjU4LDg1LjQ3MSBMNy43MzQsODUuNjIyIEM3LjczNCw4NS44NTYgNy41NTUsODYuMTY0IDcuMzUxLDg2LjI4MiBMNy4yMyw4Ni4zMjIgTTcuNjU4LDg1LjI4NCBDNy41OTQsODUuMjg0IDcuNTIxLDg1LjMwNSA3LjQ0NCw4NS4zNSBDNy4xODEsODUuNTAyIDYuOTY3LDg1Ljg3MSA2Ljk2Nyw4Ni4xNzMgQzYuOTY3LDg2LjM4NyA3LjA3NCw4Ni41MSA3LjIzLDg2LjUxIEM3LjI5NCw4Ni41MSA3LjM2Nyw4Ni40ODkgNy40NDQsODYuNDQ0IEM3LjcwOCw4Ni4yOTIgNy45MjEsODUuOTI1IDcuOTIxLDg1LjYyMiBDNy45MjEsODUuNDA4IDcuODE0LDg1LjI4NCA3LjY1OCw4NS4yODQiIGlkPSJGaWxsLTE4IiBmaWxsPSIjODA5N0EyIj48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTc3LjI3OCw3Ljc2OSBMNzcuMjc4LDUxLjQzNiBMMTAuMjA4LDkwLjE2IEwxMC4yMDgsNDYuNDkzIEw3Ny4yNzgsNy43NjkiIGlkPSJGaWxsLTE5IiBmaWxsPSIjNDU1QTY0Ij48L3BhdGg+CiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTTEwLjA4Myw5MC4zNzUgTDEwLjA4Myw0Ni40MjEgTDEwLjE0Niw0Ni4zODUgTDc3LjQwMyw3LjU1NCBMNzcuNDAzLDUxLjUwOCBMNzcuMzQxLDUxLjU0NCBMMTAuMDgzLDkwLjM3NSBMMTAuMDgzLDkwLjM3NSBaIE0xMC4zMzMsNDYuNTY0IEwxMC4zMzMsODkuOTQ0IEw3Ny4xNTQsNTEuMzY1IEw3Ny4xNTQsNy45ODUgTDEwLjMzMyw0Ni41NjQgTDEwLjMzMyw0Ni41NjQgWiIgaWQ9IkZpbGwtMjAiIGZpbGw9IiM2MDdEOEIiPjwvcGF0aD4KICAgICAgICAgICAgICAgIDwvZz4KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0xMjUuNzM3LDg4LjY0NyBMMTE4LjA5OCw5MS45ODEgTDExOC4wOTgsODQgTDEwNi42MzksODguNzEzIEwxMDYuNjM5LDk2Ljk4MiBMOTksMTAwLjMxNSBMMTEyLjM2OSwxMDMuOTYxIEwxMjUuNzM3LDg4LjY0NyIgaWQ9IkltcG9ydGVkLUxheWVycy1Db3B5LTIiIGZpbGw9IiM0NTVBNjQiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPjwvcGF0aD4KICAgICAgICAgICAgPC9nPgogICAgICAgIDwvZz4KICAgIDwvZz4KPC9zdmc+');\n};\n\nmodule.exports = RotateInstructions;\n\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * Copyright 2015 Google Inc. 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\nvar DeviceInfo = __webpack_require__(5);\nvar Util = __webpack_require__(0);\n\nvar DEFAULT_VIEWER = 'CardboardV1';\nvar VIEWER_KEY = 'WEBVR_CARDBOARD_VIEWER';\nvar CLASS_NAME = 'webvr-polyfill-viewer-selector';\n\n/**\n * Creates a viewer selector with the options specified. Supports being shown\n * and hidden. Generates events when viewer parameters change. Also supports\n * saving the currently selected index in localStorage.\n */\nfunction ViewerSelector() {\n  // Try to load the selected key from local storage.\n  try {\n    this.selectedKey = localStorage.getItem(VIEWER_KEY);\n  } catch (error) {\n    console.error('Failed to load viewer profile: %s', error);\n  }\n\n  //If none exists, or if localstorage is unavailable, use the default key.\n  if (!this.selectedKey) {\n    this.selectedKey = DEFAULT_VIEWER;\n  }\n\n  this.dialog = this.createDialog_(DeviceInfo.Viewers);\n  this.root = null;\n  this.onChangeCallbacks_ = [];\n}\n\nViewerSelector.prototype.show = function(root) {\n  this.root = root;\n\n  root.appendChild(this.dialog);\n\n  // Ensure the currently selected item is checked.\n  var selected = this.dialog.querySelector('#' + this.selectedKey);\n  selected.checked = true;\n\n  // Show the UI.\n  this.dialog.style.display = 'block';\n};\n\nViewerSelector.prototype.hide = function() {\n  if (this.root && this.root.contains(this.dialog)) {\n    this.root.removeChild(this.dialog);\n  }\n  this.dialog.style.display = 'none';\n};\n\nViewerSelector.prototype.getCurrentViewer = function() {\n  return DeviceInfo.Viewers[this.selectedKey];\n};\n\nViewerSelector.prototype.getSelectedKey_ = function() {\n  var input = this.dialog.querySelector('input[name=field]:checked');\n  if (input) {\n    return input.id;\n  }\n  return null;\n};\n\nViewerSelector.prototype.onChange = function(cb) {\n  this.onChangeCallbacks_.push(cb);\n};\n\nViewerSelector.prototype.fireOnChange_ = function(viewer) {\n  for (var i = 0; i < this.onChangeCallbacks_.length; i++) {\n    this.onChangeCallbacks_[i](viewer);\n  }\n};\n\nViewerSelector.prototype.onSave_ = function() {\n  this.selectedKey = this.getSelectedKey_();\n  if (!this.selectedKey || !DeviceInfo.Viewers[this.selectedKey]) {\n    console.error('ViewerSelector.onSave_: this should never happen!');\n    return;\n  }\n\n  this.fireOnChange_(DeviceInfo.Viewers[this.selectedKey]);\n\n  // Attempt to save the viewer profile, but fails in private mode.\n  try {\n    localStorage.setItem(VIEWER_KEY, this.selectedKey);\n  } catch(error) {\n    console.error('Failed to save viewer profile: %s', error);\n  }\n  this.hide();\n};\n\n/**\n * Creates the dialog.\n */\nViewerSelector.prototype.createDialog_ = function(options) {\n  var container = document.createElement('div');\n  container.classList.add(CLASS_NAME);\n  container.style.display = 'none';\n  // Create an overlay that dims the background, and which goes away when you\n  // tap it.\n  var overlay = document.createElement('div');\n  var s = overlay.style;\n  s.position = 'fixed';\n  s.left = 0;\n  s.top = 0;\n  s.width = '100%';\n  s.height = '100%';\n  s.background = 'rgba(0, 0, 0, 0.3)';\n  overlay.addEventListener('click', this.hide.bind(this));\n\n  var width = 280;\n  var dialog = document.createElement('div');\n  var s = dialog.style;\n  s.boxSizing = 'border-box';\n  s.position = 'fixed';\n  s.top = '24px';\n  s.left = '50%';\n  s.marginLeft = (-width/2) + 'px';\n  s.width = width + 'px';\n  s.padding = '24px';\n  s.overflow = 'hidden';\n  s.background = '#fafafa';\n  s.fontFamily = \"'Roboto', sans-serif\";\n  s.boxShadow = '0px 5px 20px #666';\n\n  dialog.appendChild(this.createH1_('Select your viewer'));\n  for (var id in options) {\n    dialog.appendChild(this.createChoice_(id, options[id].label));\n  }\n  dialog.appendChild(this.createButton_('Save', this.onSave_.bind(this)));\n\n  container.appendChild(overlay);\n  container.appendChild(dialog);\n\n  return container;\n};\n\nViewerSelector.prototype.createH1_ = function(name) {\n  var h1 = document.createElement('h1');\n  var s = h1.style;\n  s.color = 'black';\n  s.fontSize = '20px';\n  s.fontWeight = 'bold';\n  s.marginTop = 0;\n  s.marginBottom = '24px';\n  h1.innerHTML = name;\n  return h1;\n};\n\nViewerSelector.prototype.createChoice_ = function(id, name) {\n  /*\n  <div class=\"choice\">\n  <input id=\"v1\" type=\"radio\" name=\"field\" value=\"v1\">\n  <label for=\"v1\">Cardboard V1</label>\n  </div>\n  */\n  var div = document.createElement('div');\n  div.style.marginTop = '8px';\n  div.style.color = 'black';\n\n  var input = document.createElement('input');\n  input.style.fontSize = '30px';\n  input.setAttribute('id', id);\n  input.setAttribute('type', 'radio');\n  input.setAttribute('value', id);\n  input.setAttribute('name', 'field');\n\n  var label = document.createElement('label');\n  label.style.marginLeft = '4px';\n  label.setAttribute('for', id);\n  label.innerHTML = name;\n\n  div.appendChild(input);\n  div.appendChild(label);\n\n  return div;\n};\n\nViewerSelector.prototype.createButton_ = function(label, onclick) {\n  var button = document.createElement('button');\n  button.innerHTML = label;\n  var s = button.style;\n  s.float = 'right';\n  s.textTransform = 'uppercase';\n  s.color = '#1094f7';\n  s.fontSize = '14px';\n  s.letterSpacing = 0;\n  s.border = 0;\n  s.background = 'none';\n  s.marginTop = '16px';\n\n  button.addEventListener('click', onclick);\n\n  return button;\n};\n\nmodule.exports = ViewerSelector;\n\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * Copyright 2015 Google Inc. 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\nvar Util = __webpack_require__(0);\n\n/**\n * Android and iOS compatible wakelock implementation.\n *\n * Refactored thanks to dkovalev@.\n */\nfunction AndroidWakeLock() {\n  var video = document.createElement('video');\n  video.setAttribute('loop', '');\n\n  function addSourceToVideo(element, type, dataURI) {\n    var source = document.createElement('source');\n    source.src = dataURI;\n    source.type = 'video/' + type;\n    element.appendChild(source);\n  }\n\n  addSourceToVideo(video,'webm', Util.base64('video/webm', 'GkXfo0AgQoaBAUL3gQFC8oEEQvOBCEKCQAR3ZWJtQoeBAkKFgQIYU4BnQI0VSalmQCgq17FAAw9CQE2AQAZ3aGFtbXlXQUAGd2hhbW15RIlACECPQAAAAAAAFlSua0AxrkAu14EBY8WBAZyBACK1nEADdW5khkAFVl9WUDglhohAA1ZQOIOBAeBABrCBCLqBCB9DtnVAIueBAKNAHIEAAIAwAQCdASoIAAgAAUAmJaQAA3AA/vz0AAA='));\n  addSourceToVideo(video, 'mp4', Util.base64('video/mp4', 'AAAAHGZ0eXBpc29tAAACAGlzb21pc28ybXA0MQAAAAhmcmVlAAAAG21kYXQAAAGzABAHAAABthADAowdbb9/AAAC6W1vb3YAAABsbXZoZAAAAAB8JbCAfCWwgAAAA+gAAAAAAAEAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAIVdHJhawAAAFx0a2hkAAAAD3wlsIB8JbCAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAIAAAACAAAAAABsW1kaWEAAAAgbWRoZAAAAAB8JbCAfCWwgAAAA+gAAAAAVcQAAAAAAC1oZGxyAAAAAAAAAAB2aWRlAAAAAAAAAAAAAAAAVmlkZW9IYW5kbGVyAAAAAVxtaW5mAAAAFHZtaGQAAAABAAAAAAAAAAAAAAAkZGluZgAAABxkcmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAAEcc3RibAAAALhzdHNkAAAAAAAAAAEAAACobXA0dgAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAIAAgASAAAAEgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABj//wAAAFJlc2RzAAAAAANEAAEABDwgEQAAAAADDUAAAAAABS0AAAGwAQAAAbWJEwAAAQAAAAEgAMSNiB9FAEQBFGMAAAGyTGF2YzUyLjg3LjQGAQIAAAAYc3R0cwAAAAAAAAABAAAAAQAAAAAAAAAcc3RzYwAAAAAAAAABAAAAAQAAAAEAAAABAAAAFHN0c3oAAAAAAAAAEwAAAAEAAAAUc3RjbwAAAAAAAAABAAAALAAAAGB1ZHRhAAAAWG1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAAK2lsc3QAAAAjqXRvbwAAABtkYXRhAAAAAQAAAABMYXZmNTIuNzguMw=='));\n\n  this.request = function() {\n    if (video.paused) {\n      video.play();\n    }\n  };\n\n  this.release = function() {\n    video.pause();\n  };\n}\n\nfunction iOSWakeLock() {\n  var timer = null;\n\n  this.request = function() {\n    if (!timer) {\n      timer = setInterval(function() {\n        window.location = window.location;\n        setTimeout(window.stop, 0);\n      }, 30000);\n    }\n  }\n\n  this.release = function() {\n    if (timer) {\n      clearInterval(timer);\n      timer = null;\n    }\n  }\n}\n\n\nfunction getWakeLock() {\n  var userAgent = navigator.userAgent || navigator.vendor || window.opera;\n  if (userAgent.match(/iPhone/i) || userAgent.match(/iPod/i)) {\n    return iOSWakeLock;\n  } else {\n    return AndroidWakeLock;\n  }\n}\n\nmodule.exports = getWakeLock();\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/*\n * Copyright 2016 Google Inc. 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\nvar VRDisplay = __webpack_require__(1).VRDisplay;\nvar MathUtil = __webpack_require__(2);\nvar Util = __webpack_require__(0);\n\n// How much to rotate per key stroke.\nvar KEY_SPEED = 0.15;\nvar KEY_ANIMATION_DURATION = 80;\n\n// How much to rotate for mouse events.\nvar MOUSE_SPEED_X = 0.5;\nvar MOUSE_SPEED_Y = 0.3;\n\n/**\n * VRDisplay based on mouse and keyboard input. Designed for desktops/laptops\n * where orientation events aren't supported. Cannot present.\n */\nfunction MouseKeyboardVRDisplay() {\n  this.displayName = 'Mouse and Keyboard VRDisplay (webvr-polyfill)';\n\n  this.capabilities.hasOrientation = true;\n\n  // Attach to mouse and keyboard events.\n  window.addEventListener('keydown', this.onKeyDown_.bind(this));\n  window.addEventListener('mousemove', this.onMouseMove_.bind(this));\n  window.addEventListener('mousedown', this.onMouseDown_.bind(this));\n  window.addEventListener('mouseup', this.onMouseUp_.bind(this));\n\n  // \"Private\" members.\n  this.phi_ = 0;\n  this.theta_ = 0;\n\n  // Variables for keyboard-based rotation animation.\n  this.targetAngle_ = null;\n  this.angleAnimation_ = null;\n\n  // State variables for calculations.\n  this.orientation_ = new MathUtil.Quaternion();\n\n  // Variables for mouse-based rotation.\n  this.rotateStart_ = new MathUtil.Vector2();\n  this.rotateEnd_ = new MathUtil.Vector2();\n  this.rotateDelta_ = new MathUtil.Vector2();\n  this.isDragging_ = false;\n\n  this.orientationOut_ = new Float32Array(4);\n}\nMouseKeyboardVRDisplay.prototype = new VRDisplay();\n\nMouseKeyboardVRDisplay.prototype.getImmediatePose = function() {\n  this.orientation_.setFromEulerYXZ(this.phi_, this.theta_, 0);\n\n  this.orientationOut_[0] = this.orientation_.x;\n  this.orientationOut_[1] = this.orientation_.y;\n  this.orientationOut_[2] = this.orientation_.z;\n  this.orientationOut_[3] = this.orientation_.w;\n\n  return {\n    position: null,\n    orientation: this.orientationOut_,\n    linearVelocity: null,\n    linearAcceleration: null,\n    angularVelocity: null,\n    angularAcceleration: null\n  };\n};\n\nMouseKeyboardVRDisplay.prototype.onKeyDown_ = function(e) {\n  if (('shouldRotateStart' in this) && !this.shouldRotateStart(e))\n    return\n  // Track WASD and arrow keys.\n  if (e.keyCode == 38) { // Up key.\n    this.animatePhi_(this.phi_ + KEY_SPEED);\n  } else if (e.keyCode == 39) { // Right key.\n    this.animateTheta_(this.theta_ - KEY_SPEED);\n  } else if (e.keyCode == 40) { // Down key.\n    this.animatePhi_(this.phi_ - KEY_SPEED);\n  } else if (e.keyCode == 37) { // Left key.\n    this.animateTheta_(this.theta_ + KEY_SPEED);\n  }\n};\n\nMouseKeyboardVRDisplay.prototype.animateTheta_ = function(targetAngle) {\n  this.animateKeyTransitions_('theta_', targetAngle);\n};\n\nMouseKeyboardVRDisplay.prototype.animatePhi_ = function(targetAngle) {\n  // Prevent looking too far up or down.\n  targetAngle = Util.clamp(targetAngle, -Math.PI/2, Math.PI/2);\n  this.animateKeyTransitions_('phi_', targetAngle);\n};\n\n/**\n * Start an animation to transition an angle from one value to another.\n */\nMouseKeyboardVRDisplay.prototype.animateKeyTransitions_ = function(angleName, targetAngle) {\n  // If an animation is currently running, cancel it.\n  if (this.angleAnimation_) {\n    cancelAnimationFrame(this.angleAnimation_);\n  }\n  var startAngle = this[angleName];\n  var startTime = new Date();\n  // Set up an interval timer to perform the animation.\n  this.angleAnimation_ = requestAnimationFrame(function animate() {\n    // Once we're finished the animation, we're done.\n    var elapsed = new Date() - startTime;\n    if (elapsed >= KEY_ANIMATION_DURATION) {\n      this[angleName] = targetAngle;\n      cancelAnimationFrame(this.angleAnimation_);\n      return;\n    }\n    // loop with requestAnimationFrame\n    this.angleAnimation_ = requestAnimationFrame(animate.bind(this))\n    // Linearly interpolate the angle some amount.\n    var percent = elapsed / KEY_ANIMATION_DURATION;\n    this[angleName] = startAngle + (targetAngle - startAngle) * percent;\n  }.bind(this));\n};\n\nMouseKeyboardVRDisplay.prototype.onMouseDown_ = function(e) {\n  if (('shouldRotateStart' in this) && !this.shouldRotateStart(e))\n    return\n  this.rotateStart_.set(e.clientX, e.clientY);\n  this.isDragging_ = true;\n};\n\nMouseKeyboardVRDisplay.prototype.getDimensions = function() {\n  return {\n    width: window.innerWidth,\n    height: window.innerHeight\n  }\n}\n\n// Very similar to https://gist.github.com/mrflix/8351020\nMouseKeyboardVRDisplay.prototype.onMouseMove_ = function(e) {\n  if (!this.isDragging_ && !this.isPointerLocked_()) {\n    return;\n  }\n  // Support pointer lock API.\n  if (this.isPointerLocked_()) {\n    var movementX = e.movementX || e.mozMovementX || 0;\n    var movementY = e.movementY || e.mozMovementY || 0;\n    this.rotateEnd_.set(this.rotateStart_.x - movementX, this.rotateStart_.y - movementY);\n  } else {\n    this.rotateEnd_.set(e.clientX, e.clientY);\n  }\n  // Calculate how much we moved in mouse space.\n  this.rotateDelta_.subVectors(this.rotateEnd_, this.rotateStart_);\n  this.rotateStart_.copy(this.rotateEnd_);\n\n  // Keep track of the cumulative euler angles.\n  var size = this.getDimensions()\n  this.phi_ += 2 * Math.PI * this.rotateDelta_.y / size.height * MOUSE_SPEED_Y;\n  this.theta_ += 2 * Math.PI * this.rotateDelta_.x / size.width * MOUSE_SPEED_X;\n\n  // Prevent looking too far up or down.\n  this.phi_ = Util.clamp(this.phi_, -Math.PI/2, Math.PI/2);\n};\n\nMouseKeyboardVRDisplay.prototype.onMouseUp_ = function(e) {\n  this.isDragging_ = false;\n};\n\nMouseKeyboardVRDisplay.prototype.isPointerLocked_ = function() {\n  var el = document.pointerLockElement || document.mozPointerLockElement ||\n      document.webkitPointerLockElement;\n  return el !== undefined;\n};\n\nMouseKeyboardVRDisplay.prototype.resetPose = function() {\n  this.phi_ = 0;\n  this.theta_ = 0;\n};\n\nmodule.exports = MouseKeyboardVRDisplay;\n\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports) {\n\nmodule.exports = {\"name\":\"webvr-polyfill\",\"version\":\"0.9.40\",\"homepage\":\"https://github.com/googlevr/webvr-polyfill\",\"authors\":[\"Boris Smus <boris@smus.com>\",\"Brandon Jones <tojiro@gmail.com>\",\"Jordan Santell <jordan@jsantell.com>\"],\"description\":\"Use WebVR today, on mobile or desktop, without requiring a special browser build.\",\"devDependencies\":{\"chai\":\"^3.5.0\",\"jsdom\":\"^9.12.0\",\"mocha\":\"^3.2.0\",\"semver\":\"^5.3.0\",\"webpack\":\"^2.6.1\",\"webpack-dev-server\":\"2.7.1\"},\"main\":\"src/node-entry\",\"keywords\":[\"vr\",\"webvr\"],\"license\":\"Apache-2.0\",\"scripts\":{\"start\":\"npm run watch\",\"watch\":\"webpack-dev-server\",\"build\":\"webpack\",\"test\":\"mocha\"},\"repository\":\"googlevr/webvr-polyfill\",\"bugs\":{\"url\":\"https://github.com/googlevr/webvr-polyfill/issues\"}}\n\n/***/ })\n/******/ ]);\n//# sourceMappingURL=webvr-polyfill.js.map"
  },
  {
    "path": "browser/vendor/flux.js",
    "content": "(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){\n\tmodule.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.Flux = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n/**\n * Copyright (c) 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\nmodule.exports.Dispatcher = require('./lib/Dispatcher')\n\n},{\"./lib/Dispatcher\":2}],2:[function(require,module,exports){\n/**\n * Copyright (c) 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule Dispatcher\n * @typechecks\n * @preventMunge\n */\n\n\"use strict\";\n\nvar invariant = require('./invariant');\n\nvar _lastID = 1;\nvar _prefix = 'ID_';\n\n/**\n * Dispatcher is used to broadcast payloads to registered callbacks. This is\n * different from generic pub-sub systems in two ways:\n *\n *   1) Callbacks are not subscribed to particular events. Every payload is\n *      dispatched to every registered callback.\n *   2) Callbacks can be deferred in whole or part until other callbacks have\n *      been executed.\n *\n * For example, consider this hypothetical flight destination form, which\n * selects a default city when a country is selected:\n *\n *   var flightDispatcher = new Dispatcher();\n *\n *   // Keeps track of which country is selected\n *   var CountryStore = {country: null};\n *\n *   // Keeps track of which city is selected\n *   var CityStore = {city: null};\n *\n *   // Keeps track of the base flight price of the selected city\n *   var FlightPriceStore = {price: null}\n *\n * When a user changes the selected city, we dispatch the payload:\n *\n *   flightDispatcher.dispatch({\n *     actionType: 'city-update',\n *     selectedCity: 'paris'\n *   });\n *\n * This payload is digested by `CityStore`:\n *\n *   flightDispatcher.register(function(payload) {\n *     if (payload.actionType === 'city-update') {\n *       CityStore.city = payload.selectedCity;\n *     }\n *   });\n *\n * When the user selects a country, we dispatch the payload:\n *\n *   flightDispatcher.dispatch({\n *     actionType: 'country-update',\n *     selectedCountry: 'australia'\n *   });\n *\n * This payload is digested by both stores:\n *\n *   CountryStore.dispatchToken = flightDispatcher.register(function(payload) {\n *     if (payload.actionType === 'country-update') {\n *       CountryStore.country = payload.selectedCountry;\n *     }\n *   });\n *\n * When the callback to update `CountryStore` is registered, we save a reference\n * to the returned token. Using this token with `waitFor()`, we can guarantee\n * that `CountryStore` is updated before the callback that updates `CityStore`\n * needs to query its data.\n *\n *   CityStore.dispatchToken = flightDispatcher.register(function(payload) {\n *     if (payload.actionType === 'country-update') {\n *       // `CountryStore.country` may not be updated.\n *       flightDispatcher.waitFor([CountryStore.dispatchToken]);\n *       // `CountryStore.country` is now guaranteed to be updated.\n *\n *       // Select the default city for the new country\n *       CityStore.city = getDefaultCityForCountry(CountryStore.country);\n *     }\n *   });\n *\n * The usage of `waitFor()` can be chained, for example:\n *\n *   FlightPriceStore.dispatchToken =\n *     flightDispatcher.register(function(payload) {\n *       switch (payload.actionType) {\n *         case 'country-update':\n *         case 'city-update':\n *           flightDispatcher.waitFor([CityStore.dispatchToken]);\n *           FlightPriceStore.price =\n *             getFlightPriceStore(CountryStore.country, CityStore.city);\n *           break;\n *     }\n *   });\n *\n * The `country-update` payload will be guaranteed to invoke the stores'\n * registered callbacks in order: `CountryStore`, `CityStore`, then\n * `FlightPriceStore`.\n */\n\n  function Dispatcher() {\n    this._callbacks = {};\n    this._isPending = {};\n    this._isHandled = {};\n    this._isDispatching = false;\n    this._pendingPayload = null;\n  }\n\n  /**\n   * Registers a callback to be invoked with every dispatched payload. Returns\n   * a token that can be used with `waitFor()`.\n   *\n   * @param {function} callback\n   * @return {string}\n   */\n  Dispatcher.prototype.register=function(callback) {\n    var id = _prefix + _lastID++;\n    this._callbacks[id] = callback;\n    return id;\n  };\n\n  /**\n   * Removes a callback based on its token.\n   *\n   * @param {string} id\n   */\n  Dispatcher.prototype.unregister=function(id) {\n    invariant(\n      this._callbacks[id],\n      'Dispatcher.unregister(...): `%s` does not map to a registered callback.',\n      id\n    );\n    delete this._callbacks[id];\n  };\n\n  /**\n   * Waits for the callbacks specified to be invoked before continuing execution\n   * of the current callback. This method should only be used by a callback in\n   * response to a dispatched payload.\n   *\n   * @param {array<string>} ids\n   */\n  Dispatcher.prototype.waitFor=function(ids) {\n    invariant(\n      this._isDispatching,\n      'Dispatcher.waitFor(...): Must be invoked while dispatching.'\n    );\n    for (var ii = 0; ii < ids.length; ii++) {\n      var id = ids[ii];\n      if (this._isPending[id]) {\n        invariant(\n          this._isHandled[id],\n          'Dispatcher.waitFor(...): Circular dependency detected while ' +\n          'waiting for `%s`.',\n          id\n        );\n        continue;\n      }\n      invariant(\n        this._callbacks[id],\n        'Dispatcher.waitFor(...): `%s` does not map to a registered callback.',\n        id\n      );\n      this._invokeCallback(id);\n    }\n  };\n\n  /**\n   * Dispatches a payload to all registered callbacks.\n   *\n   * @param {object} payload\n   */\n  Dispatcher.prototype.dispatch=function(payload) {\n    invariant(\n      !this._isDispatching,\n      'Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.'\n    );\n    this._startDispatching(payload);\n    try {\n      for (var id in this._callbacks) {\n        if (this._isPending[id]) {\n          continue;\n        }\n        this._invokeCallback(id);\n      }\n    } finally {\n      this._stopDispatching();\n    }\n  };\n\n  /**\n   * Is this Dispatcher currently dispatching.\n   *\n   * @return {boolean}\n   */\n  Dispatcher.prototype.isDispatching=function() {\n    return this._isDispatching;\n  };\n\n  /**\n   * Call the callback stored with the given id. Also do some internal\n   * bookkeeping.\n   *\n   * @param {string} id\n   * @internal\n   */\n  Dispatcher.prototype._invokeCallback=function(id) {\n    this._isPending[id] = true;\n    this._callbacks[id](this._pendingPayload);\n    this._isHandled[id] = true;\n  };\n\n  /**\n   * Set up bookkeeping needed when dispatching.\n   *\n   * @param {object} payload\n   * @internal\n   */\n  Dispatcher.prototype._startDispatching=function(payload) {\n    for (var id in this._callbacks) {\n      this._isPending[id] = false;\n      this._isHandled[id] = false;\n    }\n    this._pendingPayload = payload;\n    this._isDispatching = true;\n  };\n\n  /**\n   * Clear bookkeeping used for dispatching.\n   *\n   * @internal\n   */\n  Dispatcher.prototype._stopDispatching=function() {\n    this._pendingPayload = null;\n    this._isDispatching = false;\n  };\n\n\nmodule.exports = Dispatcher;\n\n},{\"./invariant\":3}],3:[function(require,module,exports){\n/**\n * Copyright (c) 2014-2015, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule invariant\n */\n\n\"use strict\";\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n  if (false) {\n    if (format === undefined) {\n      throw new Error('invariant requires an error message argument');\n    }\n  }\n\n  if (!condition) {\n    var error;\n    if (format === undefined) {\n      error = new Error(\n        'Minified exception occurred; use the non-minified dev environment ' +\n        'for the full error message and additional helpful warnings.'\n      );\n    } else {\n      var args = [a, b, c, d, e, f];\n      var argIndex = 0;\n      error = new Error(\n        'Invariant Violation: ' +\n        format.replace(/%s/g, function() { return args[argIndex++]; })\n      );\n    }\n\n    error.framesToPop = 1; // we don't care about invariant's own frame\n    throw error;\n  }\n};\n\nmodule.exports = invariant;\n\n},{}]},{},[1])(1)\n});\n\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/css/font-awesome.css",
    "content": "/*!\n *  Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n/* FONT PATH\n * -------------------------- */\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('../fonts/fontawesome-webfont.eot?v=4.2.0');\n  src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');\n  font-weight: normal;\n  font-style: normal;\n}\n.fa {\n  display: inline-block;\n  font: normal normal normal 14px/1 FontAwesome;\n  font-size: inherit;\n  text-rendering: auto;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n/* makes the font 33% larger relative to the icon container */\n.fa-lg {\n  font-size: 1.33333333em;\n  line-height: 0.75em;\n  vertical-align: -15%;\n}\n.fa-2x {\n  font-size: 2em;\n}\n.fa-3x {\n  font-size: 3em;\n}\n.fa-4x {\n  font-size: 4em;\n}\n.fa-5x {\n  font-size: 5em;\n}\n.fa-fw {\n  width: 1.28571429em;\n  text-align: center;\n}\n.fa-ul {\n  padding-left: 0;\n  margin-left: 2.14285714em;\n  list-style-type: none;\n}\n.fa-ul > li {\n  position: relative;\n}\n.fa-li {\n  position: absolute;\n  left: -2.14285714em;\n  width: 2.14285714em;\n  top: 0.14285714em;\n  text-align: center;\n}\n.fa-li.fa-lg {\n  left: -1.85714286em;\n}\n.fa-border {\n  padding: .2em .25em .15em;\n  border: solid 0.08em #eeeeee;\n  border-radius: .1em;\n}\n.pull-right {\n  float: right;\n}\n.pull-left {\n  float: left;\n}\n.fa.pull-left {\n  margin-right: .3em;\n}\n.fa.pull-right {\n  margin-left: .3em;\n}\n.fa-spin {\n  -webkit-animation: fa-spin 2s infinite linear;\n  animation: fa-spin 2s infinite linear;\n}\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n    transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n    transform: rotate(359deg);\n  }\n}\n.fa-rotate-90 {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);\n  -webkit-transform: rotate(90deg);\n  -ms-transform: rotate(90deg);\n  transform: rotate(90deg);\n}\n.fa-rotate-180 {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);\n  -webkit-transform: rotate(180deg);\n  -ms-transform: rotate(180deg);\n  transform: rotate(180deg);\n}\n.fa-rotate-270 {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);\n  -webkit-transform: rotate(270deg);\n  -ms-transform: rotate(270deg);\n  transform: rotate(270deg);\n}\n.fa-flip-horizontal {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);\n  -webkit-transform: scale(-1, 1);\n  -ms-transform: scale(-1, 1);\n  transform: scale(-1, 1);\n}\n.fa-flip-vertical {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);\n  -webkit-transform: scale(1, -1);\n  -ms-transform: scale(1, -1);\n  transform: scale(1, -1);\n}\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical {\n  filter: none;\n}\n.fa-stack {\n  position: relative;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  line-height: 2em;\n  vertical-align: middle;\n}\n.fa-stack-1x,\n.fa-stack-2x {\n  position: absolute;\n  left: 0;\n  width: 100%;\n  text-align: center;\n}\n.fa-stack-1x {\n  line-height: inherit;\n}\n.fa-stack-2x {\n  font-size: 2em;\n}\n.fa-inverse {\n  color: #ffffff;\n}\n/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons */\n.fa-glass:before {\n  content: \"\\f000\";\n}\n.fa-music:before {\n  content: \"\\f001\";\n}\n.fa-search:before {\n  content: \"\\f002\";\n}\n.fa-envelope-o:before {\n  content: \"\\f003\";\n}\n.fa-heart:before {\n  content: \"\\f004\";\n}\n.fa-star:before {\n  content: \"\\f005\";\n}\n.fa-star-o:before {\n  content: \"\\f006\";\n}\n.fa-user:before {\n  content: \"\\f007\";\n}\n.fa-film:before {\n  content: \"\\f008\";\n}\n.fa-th-large:before {\n  content: \"\\f009\";\n}\n.fa-th:before {\n  content: \"\\f00a\";\n}\n.fa-th-list:before {\n  content: \"\\f00b\";\n}\n.fa-check:before {\n  content: \"\\f00c\";\n}\n.fa-remove:before,\n.fa-close:before,\n.fa-times:before {\n  content: \"\\f00d\";\n}\n.fa-search-plus:before {\n  content: \"\\f00e\";\n}\n.fa-search-minus:before {\n  content: \"\\f010\";\n}\n.fa-power-off:before {\n  content: \"\\f011\";\n}\n.fa-signal:before {\n  content: \"\\f012\";\n}\n.fa-gear:before,\n.fa-cog:before {\n  content: \"\\f013\";\n}\n.fa-trash-o:before {\n  content: \"\\f014\";\n}\n.fa-home:before {\n  content: \"\\f015\";\n}\n.fa-file-o:before {\n  content: \"\\f016\";\n}\n.fa-clock-o:before {\n  content: \"\\f017\";\n}\n.fa-road:before {\n  content: \"\\f018\";\n}\n.fa-download:before {\n  content: \"\\f019\";\n}\n.fa-arrow-circle-o-down:before {\n  content: \"\\f01a\";\n}\n.fa-arrow-circle-o-up:before {\n  content: \"\\f01b\";\n}\n.fa-inbox:before {\n  content: \"\\f01c\";\n}\n.fa-play-circle-o:before {\n  content: \"\\f01d\";\n}\n.fa-rotate-right:before,\n.fa-repeat:before {\n  content: \"\\f01e\";\n}\n.fa-refresh:before {\n  content: \"\\f021\";\n}\n.fa-list-alt:before {\n  content: \"\\f022\";\n}\n.fa-lock:before {\n  content: \"\\f023\";\n}\n.fa-flag:before {\n  content: \"\\f024\";\n}\n.fa-headphones:before {\n  content: \"\\f025\";\n}\n.fa-volume-off:before {\n  content: \"\\f026\";\n}\n.fa-volume-down:before {\n  content: \"\\f027\";\n}\n.fa-volume-up:before {\n  content: \"\\f028\";\n}\n.fa-qrcode:before {\n  content: \"\\f029\";\n}\n.fa-barcode:before {\n  content: \"\\f02a\";\n}\n.fa-tag:before {\n  content: \"\\f02b\";\n}\n.fa-tags:before {\n  content: \"\\f02c\";\n}\n.fa-book:before {\n  content: \"\\f02d\";\n}\n.fa-bookmark:before {\n  content: \"\\f02e\";\n}\n.fa-print:before {\n  content: \"\\f02f\";\n}\n.fa-camera:before {\n  content: \"\\f030\";\n}\n.fa-font:before {\n  content: \"\\f031\";\n}\n.fa-bold:before {\n  content: \"\\f032\";\n}\n.fa-italic:before {\n  content: \"\\f033\";\n}\n.fa-text-height:before {\n  content: \"\\f034\";\n}\n.fa-text-width:before {\n  content: \"\\f035\";\n}\n.fa-align-left:before {\n  content: \"\\f036\";\n}\n.fa-align-center:before {\n  content: \"\\f037\";\n}\n.fa-align-right:before {\n  content: \"\\f038\";\n}\n.fa-align-justify:before {\n  content: \"\\f039\";\n}\n.fa-list:before {\n  content: \"\\f03a\";\n}\n.fa-dedent:before,\n.fa-outdent:before {\n  content: \"\\f03b\";\n}\n.fa-indent:before {\n  content: \"\\f03c\";\n}\n.fa-video-camera:before {\n  content: \"\\f03d\";\n}\n.fa-photo:before,\n.fa-image:before,\n.fa-picture-o:before {\n  content: \"\\f03e\";\n}\n.fa-pencil:before {\n  content: \"\\f040\";\n}\n.fa-map-marker:before {\n  content: \"\\f041\";\n}\n.fa-adjust:before {\n  content: \"\\f042\";\n}\n.fa-tint:before {\n  content: \"\\f043\";\n}\n.fa-edit:before,\n.fa-pencil-square-o:before {\n  content: \"\\f044\";\n}\n.fa-share-square-o:before {\n  content: \"\\f045\";\n}\n.fa-check-square-o:before {\n  content: \"\\f046\";\n}\n.fa-arrows:before {\n  content: \"\\f047\";\n}\n.fa-step-backward:before {\n  content: \"\\f048\";\n}\n.fa-fast-backward:before {\n  content: \"\\f049\";\n}\n.fa-backward:before {\n  content: \"\\f04a\";\n}\n.fa-play:before {\n  content: \"\\f04b\";\n}\n.fa-pause:before {\n  content: \"\\f04c\";\n}\n.fa-stop:before {\n  content: \"\\f04d\";\n}\n.fa-forward:before {\n  content: \"\\f04e\";\n}\n.fa-fast-forward:before {\n  content: \"\\f050\";\n}\n.fa-step-forward:before {\n  content: \"\\f051\";\n}\n.fa-eject:before {\n  content: \"\\f052\";\n}\n.fa-chevron-left:before {\n  content: \"\\f053\";\n}\n.fa-chevron-right:before {\n  content: \"\\f054\";\n}\n.fa-plus-circle:before {\n  content: \"\\f055\";\n}\n.fa-minus-circle:before {\n  content: \"\\f056\";\n}\n.fa-times-circle:before {\n  content: \"\\f057\";\n}\n.fa-check-circle:before {\n  content: \"\\f058\";\n}\n.fa-question-circle:before {\n  content: \"\\f059\";\n}\n.fa-info-circle:before {\n  content: \"\\f05a\";\n}\n.fa-crosshairs:before {\n  content: \"\\f05b\";\n}\n.fa-times-circle-o:before {\n  content: \"\\f05c\";\n}\n.fa-check-circle-o:before {\n  content: \"\\f05d\";\n}\n.fa-ban:before {\n  content: \"\\f05e\";\n}\n.fa-arrow-left:before {\n  content: \"\\f060\";\n}\n.fa-arrow-right:before {\n  content: \"\\f061\";\n}\n.fa-arrow-up:before {\n  content: \"\\f062\";\n}\n.fa-arrow-down:before {\n  content: \"\\f063\";\n}\n.fa-mail-forward:before,\n.fa-share:before {\n  content: \"\\f064\";\n}\n.fa-expand:before {\n  content: \"\\f065\";\n}\n.fa-compress:before {\n  content: \"\\f066\";\n}\n.fa-plus:before {\n  content: \"\\f067\";\n}\n.fa-minus:before {\n  content: \"\\f068\";\n}\n.fa-asterisk:before {\n  content: \"\\f069\";\n}\n.fa-exclamation-circle:before {\n  content: \"\\f06a\";\n}\n.fa-gift:before {\n  content: \"\\f06b\";\n}\n.fa-leaf:before {\n  content: \"\\f06c\";\n}\n.fa-fire:before {\n  content: \"\\f06d\";\n}\n.fa-eye:before {\n  content: \"\\f06e\";\n}\n.fa-eye-slash:before {\n  content: \"\\f070\";\n}\n.fa-warning:before,\n.fa-exclamation-triangle:before {\n  content: \"\\f071\";\n}\n.fa-plane:before {\n  content: \"\\f072\";\n}\n.fa-calendar:before {\n  content: \"\\f073\";\n}\n.fa-random:before {\n  content: \"\\f074\";\n}\n.fa-comment:before {\n  content: \"\\f075\";\n}\n.fa-magnet:before {\n  content: \"\\f076\";\n}\n.fa-chevron-up:before {\n  content: \"\\f077\";\n}\n.fa-chevron-down:before {\n  content: \"\\f078\";\n}\n.fa-retweet:before {\n  content: \"\\f079\";\n}\n.fa-shopping-cart:before {\n  content: \"\\f07a\";\n}\n.fa-folder:before {\n  content: \"\\f07b\";\n}\n.fa-folder-open:before {\n  content: \"\\f07c\";\n}\n.fa-arrows-v:before {\n  content: \"\\f07d\";\n}\n.fa-arrows-h:before {\n  content: \"\\f07e\";\n}\n.fa-bar-chart-o:before,\n.fa-bar-chart:before {\n  content: \"\\f080\";\n}\n.fa-twitter-square:before {\n  content: \"\\f081\";\n}\n.fa-facebook-square:before {\n  content: \"\\f082\";\n}\n.fa-camera-retro:before {\n  content: \"\\f083\";\n}\n.fa-key:before {\n  content: \"\\f084\";\n}\n.fa-gears:before,\n.fa-cogs:before {\n  content: \"\\f085\";\n}\n.fa-comments:before {\n  content: \"\\f086\";\n}\n.fa-thumbs-o-up:before {\n  content: \"\\f087\";\n}\n.fa-thumbs-o-down:before {\n  content: \"\\f088\";\n}\n.fa-star-half:before {\n  content: \"\\f089\";\n}\n.fa-heart-o:before {\n  content: \"\\f08a\";\n}\n.fa-sign-out:before {\n  content: \"\\f08b\";\n}\n.fa-linkedin-square:before {\n  content: \"\\f08c\";\n}\n.fa-thumb-tack:before {\n  content: \"\\f08d\";\n}\n.fa-external-link:before {\n  content: \"\\f08e\";\n}\n.fa-sign-in:before {\n  content: \"\\f090\";\n}\n.fa-trophy:before {\n  content: \"\\f091\";\n}\n.fa-github-square:before {\n  content: \"\\f092\";\n}\n.fa-upload:before {\n  content: \"\\f093\";\n}\n.fa-lemon-o:before {\n  content: \"\\f094\";\n}\n.fa-phone:before {\n  content: \"\\f095\";\n}\n.fa-square-o:before {\n  content: \"\\f096\";\n}\n.fa-bookmark-o:before {\n  content: \"\\f097\";\n}\n.fa-phone-square:before {\n  content: \"\\f098\";\n}\n.fa-twitter:before {\n  content: \"\\f099\";\n}\n.fa-facebook:before {\n  content: \"\\f09a\";\n}\n.fa-github:before {\n  content: \"\\f09b\";\n}\n.fa-unlock:before {\n  content: \"\\f09c\";\n}\n.fa-credit-card:before {\n  content: \"\\f09d\";\n}\n.fa-rss:before {\n  content: \"\\f09e\";\n}\n.fa-hdd-o:before {\n  content: \"\\f0a0\";\n}\n.fa-bullhorn:before {\n  content: \"\\f0a1\";\n}\n.fa-bell:before {\n  content: \"\\f0f3\";\n}\n.fa-certificate:before {\n  content: \"\\f0a3\";\n}\n.fa-hand-o-right:before {\n  content: \"\\f0a4\";\n}\n.fa-hand-o-left:before {\n  content: \"\\f0a5\";\n}\n.fa-hand-o-up:before {\n  content: \"\\f0a6\";\n}\n.fa-hand-o-down:before {\n  content: \"\\f0a7\";\n}\n.fa-arrow-circle-left:before {\n  content: \"\\f0a8\";\n}\n.fa-arrow-circle-right:before {\n  content: \"\\f0a9\";\n}\n.fa-arrow-circle-up:before {\n  content: \"\\f0aa\";\n}\n.fa-arrow-circle-down:before {\n  content: \"\\f0ab\";\n}\n.fa-globe:before {\n  content: \"\\f0ac\";\n}\n.fa-wrench:before {\n  content: \"\\f0ad\";\n}\n.fa-tasks:before {\n  content: \"\\f0ae\";\n}\n.fa-filter:before {\n  content: \"\\f0b0\";\n}\n.fa-briefcase:before {\n  content: \"\\f0b1\";\n}\n.fa-arrows-alt:before {\n  content: \"\\f0b2\";\n}\n.fa-group:before,\n.fa-users:before {\n  content: \"\\f0c0\";\n}\n.fa-chain:before,\n.fa-link:before {\n  content: \"\\f0c1\";\n}\n.fa-cloud:before {\n  content: \"\\f0c2\";\n}\n.fa-flask:before {\n  content: \"\\f0c3\";\n}\n.fa-cut:before,\n.fa-scissors:before {\n  content: \"\\f0c4\";\n}\n.fa-copy:before,\n.fa-files-o:before {\n  content: \"\\f0c5\";\n}\n.fa-paperclip:before {\n  content: \"\\f0c6\";\n}\n.fa-save:before,\n.fa-floppy-o:before {\n  content: \"\\f0c7\";\n}\n.fa-square:before {\n  content: \"\\f0c8\";\n}\n.fa-navicon:before,\n.fa-reorder:before,\n.fa-bars:before {\n  content: \"\\f0c9\";\n}\n.fa-list-ul:before {\n  content: \"\\f0ca\";\n}\n.fa-list-ol:before {\n  content: \"\\f0cb\";\n}\n.fa-strikethrough:before {\n  content: \"\\f0cc\";\n}\n.fa-underline:before {\n  content: \"\\f0cd\";\n}\n.fa-table:before {\n  content: \"\\f0ce\";\n}\n.fa-magic:before {\n  content: \"\\f0d0\";\n}\n.fa-truck:before {\n  content: \"\\f0d1\";\n}\n.fa-pinterest:before {\n  content: \"\\f0d2\";\n}\n.fa-pinterest-square:before {\n  content: \"\\f0d3\";\n}\n.fa-google-plus-square:before {\n  content: \"\\f0d4\";\n}\n.fa-google-plus:before {\n  content: \"\\f0d5\";\n}\n.fa-money:before {\n  content: \"\\f0d6\";\n}\n.fa-caret-down:before {\n  content: \"\\f0d7\";\n}\n.fa-caret-up:before {\n  content: \"\\f0d8\";\n}\n.fa-caret-left:before {\n  content: \"\\f0d9\";\n}\n.fa-caret-right:before {\n  content: \"\\f0da\";\n}\n.fa-columns:before {\n  content: \"\\f0db\";\n}\n.fa-unsorted:before,\n.fa-sort:before {\n  content: \"\\f0dc\";\n}\n.fa-sort-down:before,\n.fa-sort-desc:before {\n  content: \"\\f0dd\";\n}\n.fa-sort-up:before,\n.fa-sort-asc:before {\n  content: \"\\f0de\";\n}\n.fa-envelope:before {\n  content: \"\\f0e0\";\n}\n.fa-linkedin:before {\n  content: \"\\f0e1\";\n}\n.fa-rotate-left:before,\n.fa-undo:before {\n  content: \"\\f0e2\";\n}\n.fa-legal:before,\n.fa-gavel:before {\n  content: \"\\f0e3\";\n}\n.fa-dashboard:before,\n.fa-tachometer:before {\n  content: \"\\f0e4\";\n}\n.fa-comment-o:before {\n  content: \"\\f0e5\";\n}\n.fa-comments-o:before {\n  content: \"\\f0e6\";\n}\n.fa-flash:before,\n.fa-bolt:before {\n  content: \"\\f0e7\";\n}\n.fa-sitemap:before {\n  content: \"\\f0e8\";\n}\n.fa-umbrella:before {\n  content: \"\\f0e9\";\n}\n.fa-paste:before,\n.fa-clipboard:before {\n  content: \"\\f0ea\";\n}\n.fa-lightbulb-o:before {\n  content: \"\\f0eb\";\n}\n.fa-exchange:before {\n  content: \"\\f0ec\";\n}\n.fa-cloud-download:before {\n  content: \"\\f0ed\";\n}\n.fa-cloud-upload:before {\n  content: \"\\f0ee\";\n}\n.fa-user-md:before {\n  content: \"\\f0f0\";\n}\n.fa-stethoscope:before {\n  content: \"\\f0f1\";\n}\n.fa-suitcase:before {\n  content: \"\\f0f2\";\n}\n.fa-bell-o:before {\n  content: \"\\f0a2\";\n}\n.fa-coffee:before {\n  content: \"\\f0f4\";\n}\n.fa-cutlery:before {\n  content: \"\\f0f5\";\n}\n.fa-file-text-o:before {\n  content: \"\\f0f6\";\n}\n.fa-building-o:before {\n  content: \"\\f0f7\";\n}\n.fa-hospital-o:before {\n  content: \"\\f0f8\";\n}\n.fa-ambulance:before {\n  content: \"\\f0f9\";\n}\n.fa-medkit:before {\n  content: \"\\f0fa\";\n}\n.fa-fighter-jet:before {\n  content: \"\\f0fb\";\n}\n.fa-beer:before {\n  content: \"\\f0fc\";\n}\n.fa-h-square:before {\n  content: \"\\f0fd\";\n}\n.fa-plus-square:before {\n  content: \"\\f0fe\";\n}\n.fa-angle-double-left:before {\n  content: \"\\f100\";\n}\n.fa-angle-double-right:before {\n  content: \"\\f101\";\n}\n.fa-angle-double-up:before {\n  content: \"\\f102\";\n}\n.fa-angle-double-down:before {\n  content: \"\\f103\";\n}\n.fa-angle-left:before {\n  content: \"\\f104\";\n}\n.fa-angle-right:before {\n  content: \"\\f105\";\n}\n.fa-angle-up:before {\n  content: \"\\f106\";\n}\n.fa-angle-down:before {\n  content: \"\\f107\";\n}\n.fa-desktop:before {\n  content: \"\\f108\";\n}\n.fa-laptop:before {\n  content: \"\\f109\";\n}\n.fa-tablet:before {\n  content: \"\\f10a\";\n}\n.fa-mobile-phone:before,\n.fa-mobile:before {\n  content: \"\\f10b\";\n}\n.fa-circle-o:before {\n  content: \"\\f10c\";\n}\n.fa-quote-left:before {\n  content: \"\\f10d\";\n}\n.fa-quote-right:before {\n  content: \"\\f10e\";\n}\n.fa-spinner:before {\n  content: \"\\f110\";\n}\n.fa-circle:before {\n  content: \"\\f111\";\n}\n.fa-mail-reply:before,\n.fa-reply:before {\n  content: \"\\f112\";\n}\n.fa-github-alt:before {\n  content: \"\\f113\";\n}\n.fa-folder-o:before {\n  content: \"\\f114\";\n}\n.fa-folder-open-o:before {\n  content: \"\\f115\";\n}\n.fa-smile-o:before {\n  content: \"\\f118\";\n}\n.fa-frown-o:before {\n  content: \"\\f119\";\n}\n.fa-meh-o:before {\n  content: \"\\f11a\";\n}\n.fa-gamepad:before {\n  content: \"\\f11b\";\n}\n.fa-keyboard-o:before {\n  content: \"\\f11c\";\n}\n.fa-flag-o:before {\n  content: \"\\f11d\";\n}\n.fa-flag-checkered:before {\n  content: \"\\f11e\";\n}\n.fa-terminal:before {\n  content: \"\\f120\";\n}\n.fa-code:before {\n  content: \"\\f121\";\n}\n.fa-mail-reply-all:before,\n.fa-reply-all:before {\n  content: \"\\f122\";\n}\n.fa-star-half-empty:before,\n.fa-star-half-full:before,\n.fa-star-half-o:before {\n  content: \"\\f123\";\n}\n.fa-location-arrow:before {\n  content: \"\\f124\";\n}\n.fa-crop:before {\n  content: \"\\f125\";\n}\n.fa-code-fork:before {\n  content: \"\\f126\";\n}\n.fa-unlink:before,\n.fa-chain-broken:before {\n  content: \"\\f127\";\n}\n.fa-question:before {\n  content: \"\\f128\";\n}\n.fa-info:before {\n  content: \"\\f129\";\n}\n.fa-exclamation:before {\n  content: \"\\f12a\";\n}\n.fa-superscript:before {\n  content: \"\\f12b\";\n}\n.fa-subscript:before {\n  content: \"\\f12c\";\n}\n.fa-eraser:before {\n  content: \"\\f12d\";\n}\n.fa-puzzle-piece:before {\n  content: \"\\f12e\";\n}\n.fa-microphone:before {\n  content: \"\\f130\";\n}\n.fa-microphone-slash:before {\n  content: \"\\f131\";\n}\n.fa-shield:before {\n  content: \"\\f132\";\n}\n.fa-calendar-o:before {\n  content: \"\\f133\";\n}\n.fa-fire-extinguisher:before {\n  content: \"\\f134\";\n}\n.fa-rocket:before {\n  content: \"\\f135\";\n}\n.fa-maxcdn:before {\n  content: \"\\f136\";\n}\n.fa-chevron-circle-left:before {\n  content: \"\\f137\";\n}\n.fa-chevron-circle-right:before {\n  content: \"\\f138\";\n}\n.fa-chevron-circle-up:before {\n  content: \"\\f139\";\n}\n.fa-chevron-circle-down:before {\n  content: \"\\f13a\";\n}\n.fa-html5:before {\n  content: \"\\f13b\";\n}\n.fa-css3:before {\n  content: \"\\f13c\";\n}\n.fa-anchor:before {\n  content: \"\\f13d\";\n}\n.fa-unlock-alt:before {\n  content: \"\\f13e\";\n}\n.fa-bullseye:before {\n  content: \"\\f140\";\n}\n.fa-ellipsis-h:before {\n  content: \"\\f141\";\n}\n.fa-ellipsis-v:before {\n  content: \"\\f142\";\n}\n.fa-rss-square:before {\n  content: \"\\f143\";\n}\n.fa-play-circle:before {\n  content: \"\\f144\";\n}\n.fa-ticket:before {\n  content: \"\\f145\";\n}\n.fa-minus-square:before {\n  content: \"\\f146\";\n}\n.fa-minus-square-o:before {\n  content: \"\\f147\";\n}\n.fa-level-up:before {\n  content: \"\\f148\";\n}\n.fa-level-down:before {\n  content: \"\\f149\";\n}\n.fa-check-square:before {\n  content: \"\\f14a\";\n}\n.fa-pencil-square:before {\n  content: \"\\f14b\";\n}\n.fa-external-link-square:before {\n  content: \"\\f14c\";\n}\n.fa-share-square:before {\n  content: \"\\f14d\";\n}\n.fa-compass:before {\n  content: \"\\f14e\";\n}\n.fa-toggle-down:before,\n.fa-caret-square-o-down:before {\n  content: \"\\f150\";\n}\n.fa-toggle-up:before,\n.fa-caret-square-o-up:before {\n  content: \"\\f151\";\n}\n.fa-toggle-right:before,\n.fa-caret-square-o-right:before {\n  content: \"\\f152\";\n}\n.fa-euro:before,\n.fa-eur:before {\n  content: \"\\f153\";\n}\n.fa-gbp:before {\n  content: \"\\f154\";\n}\n.fa-dollar:before,\n.fa-usd:before {\n  content: \"\\f155\";\n}\n.fa-rupee:before,\n.fa-inr:before {\n  content: \"\\f156\";\n}\n.fa-cny:before,\n.fa-rmb:before,\n.fa-yen:before,\n.fa-jpy:before {\n  content: \"\\f157\";\n}\n.fa-ruble:before,\n.fa-rouble:before,\n.fa-rub:before {\n  content: \"\\f158\";\n}\n.fa-won:before,\n.fa-krw:before {\n  content: \"\\f159\";\n}\n.fa-bitcoin:before,\n.fa-btc:before {\n  content: \"\\f15a\";\n}\n.fa-file:before {\n  content: \"\\f15b\";\n}\n.fa-file-text:before {\n  content: \"\\f15c\";\n}\n.fa-sort-alpha-asc:before {\n  content: \"\\f15d\";\n}\n.fa-sort-alpha-desc:before {\n  content: \"\\f15e\";\n}\n.fa-sort-amount-asc:before {\n  content: \"\\f160\";\n}\n.fa-sort-amount-desc:before {\n  content: \"\\f161\";\n}\n.fa-sort-numeric-asc:before {\n  content: \"\\f162\";\n}\n.fa-sort-numeric-desc:before {\n  content: \"\\f163\";\n}\n.fa-thumbs-up:before {\n  content: \"\\f164\";\n}\n.fa-thumbs-down:before {\n  content: \"\\f165\";\n}\n.fa-youtube-square:before {\n  content: \"\\f166\";\n}\n.fa-youtube:before {\n  content: \"\\f167\";\n}\n.fa-xing:before {\n  content: \"\\f168\";\n}\n.fa-xing-square:before {\n  content: \"\\f169\";\n}\n.fa-youtube-play:before {\n  content: \"\\f16a\";\n}\n.fa-dropbox:before {\n  content: \"\\f16b\";\n}\n.fa-stack-overflow:before {\n  content: \"\\f16c\";\n}\n.fa-instagram:before {\n  content: \"\\f16d\";\n}\n.fa-flickr:before {\n  content: \"\\f16e\";\n}\n.fa-adn:before {\n  content: \"\\f170\";\n}\n.fa-bitbucket:before {\n  content: \"\\f171\";\n}\n.fa-bitbucket-square:before {\n  content: \"\\f172\";\n}\n.fa-tumblr:before {\n  content: \"\\f173\";\n}\n.fa-tumblr-square:before {\n  content: \"\\f174\";\n}\n.fa-long-arrow-down:before {\n  content: \"\\f175\";\n}\n.fa-long-arrow-up:before {\n  content: \"\\f176\";\n}\n.fa-long-arrow-left:before {\n  content: \"\\f177\";\n}\n.fa-long-arrow-right:before {\n  content: \"\\f178\";\n}\n.fa-apple:before {\n  content: \"\\f179\";\n}\n.fa-windows:before {\n  content: \"\\f17a\";\n}\n.fa-android:before {\n  content: \"\\f17b\";\n}\n.fa-linux:before {\n  content: \"\\f17c\";\n}\n.fa-dribbble:before {\n  content: \"\\f17d\";\n}\n.fa-skype:before {\n  content: \"\\f17e\";\n}\n.fa-foursquare:before {\n  content: \"\\f180\";\n}\n.fa-trello:before {\n  content: \"\\f181\";\n}\n.fa-female:before {\n  content: \"\\f182\";\n}\n.fa-male:before {\n  content: \"\\f183\";\n}\n.fa-gittip:before {\n  content: \"\\f184\";\n}\n.fa-sun-o:before {\n  content: \"\\f185\";\n}\n.fa-moon-o:before {\n  content: \"\\f186\";\n}\n.fa-archive:before {\n  content: \"\\f187\";\n}\n.fa-bug:before {\n  content: \"\\f188\";\n}\n.fa-vk:before {\n  content: \"\\f189\";\n}\n.fa-weibo:before {\n  content: \"\\f18a\";\n}\n.fa-renren:before {\n  content: \"\\f18b\";\n}\n.fa-pagelines:before {\n  content: \"\\f18c\";\n}\n.fa-stack-exchange:before {\n  content: \"\\f18d\";\n}\n.fa-arrow-circle-o-right:before {\n  content: \"\\f18e\";\n}\n.fa-arrow-circle-o-left:before {\n  content: \"\\f190\";\n}\n.fa-toggle-left:before,\n.fa-caret-square-o-left:before {\n  content: \"\\f191\";\n}\n.fa-dot-circle-o:before {\n  content: \"\\f192\";\n}\n.fa-wheelchair:before {\n  content: \"\\f193\";\n}\n.fa-vimeo-square:before {\n  content: \"\\f194\";\n}\n.fa-turkish-lira:before,\n.fa-try:before {\n  content: \"\\f195\";\n}\n.fa-plus-square-o:before {\n  content: \"\\f196\";\n}\n.fa-space-shuttle:before {\n  content: \"\\f197\";\n}\n.fa-slack:before {\n  content: \"\\f198\";\n}\n.fa-envelope-square:before {\n  content: \"\\f199\";\n}\n.fa-wordpress:before {\n  content: \"\\f19a\";\n}\n.fa-openid:before {\n  content: \"\\f19b\";\n}\n.fa-institution:before,\n.fa-bank:before,\n.fa-university:before {\n  content: \"\\f19c\";\n}\n.fa-mortar-board:before,\n.fa-graduation-cap:before {\n  content: \"\\f19d\";\n}\n.fa-yahoo:before {\n  content: \"\\f19e\";\n}\n.fa-google:before {\n  content: \"\\f1a0\";\n}\n.fa-reddit:before {\n  content: \"\\f1a1\";\n}\n.fa-reddit-square:before {\n  content: \"\\f1a2\";\n}\n.fa-stumbleupon-circle:before {\n  content: \"\\f1a3\";\n}\n.fa-stumbleupon:before {\n  content: \"\\f1a4\";\n}\n.fa-delicious:before {\n  content: \"\\f1a5\";\n}\n.fa-digg:before {\n  content: \"\\f1a6\";\n}\n.fa-pied-piper:before {\n  content: \"\\f1a7\";\n}\n.fa-pied-piper-alt:before {\n  content: \"\\f1a8\";\n}\n.fa-drupal:before {\n  content: \"\\f1a9\";\n}\n.fa-joomla:before {\n  content: \"\\f1aa\";\n}\n.fa-language:before {\n  content: \"\\f1ab\";\n}\n.fa-fax:before {\n  content: \"\\f1ac\";\n}\n.fa-building:before {\n  content: \"\\f1ad\";\n}\n.fa-child:before {\n  content: \"\\f1ae\";\n}\n.fa-paw:before {\n  content: \"\\f1b0\";\n}\n.fa-spoon:before {\n  content: \"\\f1b1\";\n}\n.fa-cube:before {\n  content: \"\\f1b2\";\n}\n.fa-cubes:before {\n  content: \"\\f1b3\";\n}\n.fa-behance:before {\n  content: \"\\f1b4\";\n}\n.fa-behance-square:before {\n  content: \"\\f1b5\";\n}\n.fa-steam:before {\n  content: \"\\f1b6\";\n}\n.fa-steam-square:before {\n  content: \"\\f1b7\";\n}\n.fa-recycle:before {\n  content: \"\\f1b8\";\n}\n.fa-automobile:before,\n.fa-car:before {\n  content: \"\\f1b9\";\n}\n.fa-cab:before,\n.fa-taxi:before {\n  content: \"\\f1ba\";\n}\n.fa-tree:before {\n  content: \"\\f1bb\";\n}\n.fa-spotify:before {\n  content: \"\\f1bc\";\n}\n.fa-deviantart:before {\n  content: \"\\f1bd\";\n}\n.fa-soundcloud:before {\n  content: \"\\f1be\";\n}\n.fa-database:before {\n  content: \"\\f1c0\";\n}\n.fa-file-pdf-o:before {\n  content: \"\\f1c1\";\n}\n.fa-file-word-o:before {\n  content: \"\\f1c2\";\n}\n.fa-file-excel-o:before {\n  content: \"\\f1c3\";\n}\n.fa-file-powerpoint-o:before {\n  content: \"\\f1c4\";\n}\n.fa-file-photo-o:before,\n.fa-file-picture-o:before,\n.fa-file-image-o:before {\n  content: \"\\f1c5\";\n}\n.fa-file-zip-o:before,\n.fa-file-archive-o:before {\n  content: \"\\f1c6\";\n}\n.fa-file-sound-o:before,\n.fa-file-audio-o:before {\n  content: \"\\f1c7\";\n}\n.fa-file-movie-o:before,\n.fa-file-video-o:before {\n  content: \"\\f1c8\";\n}\n.fa-file-code-o:before {\n  content: \"\\f1c9\";\n}\n.fa-vine:before {\n  content: \"\\f1ca\";\n}\n.fa-codepen:before {\n  content: \"\\f1cb\";\n}\n.fa-jsfiddle:before {\n  content: \"\\f1cc\";\n}\n.fa-life-bouy:before,\n.fa-life-buoy:before,\n.fa-life-saver:before,\n.fa-support:before,\n.fa-life-ring:before {\n  content: \"\\f1cd\";\n}\n.fa-circle-o-notch:before {\n  content: \"\\f1ce\";\n}\n.fa-ra:before,\n.fa-rebel:before {\n  content: \"\\f1d0\";\n}\n.fa-ge:before,\n.fa-empire:before {\n  content: \"\\f1d1\";\n}\n.fa-git-square:before {\n  content: \"\\f1d2\";\n}\n.fa-git:before {\n  content: \"\\f1d3\";\n}\n.fa-hacker-news:before {\n  content: \"\\f1d4\";\n}\n.fa-tencent-weibo:before {\n  content: \"\\f1d5\";\n}\n.fa-qq:before {\n  content: \"\\f1d6\";\n}\n.fa-wechat:before,\n.fa-weixin:before {\n  content: \"\\f1d7\";\n}\n.fa-send:before,\n.fa-paper-plane:before {\n  content: \"\\f1d8\";\n}\n.fa-send-o:before,\n.fa-paper-plane-o:before {\n  content: \"\\f1d9\";\n}\n.fa-history:before {\n  content: \"\\f1da\";\n}\n.fa-circle-thin:before {\n  content: \"\\f1db\";\n}\n.fa-header:before {\n  content: \"\\f1dc\";\n}\n.fa-paragraph:before {\n  content: \"\\f1dd\";\n}\n.fa-sliders:before {\n  content: \"\\f1de\";\n}\n.fa-share-alt:before {\n  content: \"\\f1e0\";\n}\n.fa-share-alt-square:before {\n  content: \"\\f1e1\";\n}\n.fa-bomb:before {\n  content: \"\\f1e2\";\n}\n.fa-soccer-ball-o:before,\n.fa-futbol-o:before {\n  content: \"\\f1e3\";\n}\n.fa-tty:before {\n  content: \"\\f1e4\";\n}\n.fa-binoculars:before {\n  content: \"\\f1e5\";\n}\n.fa-plug:before {\n  content: \"\\f1e6\";\n}\n.fa-slideshare:before {\n  content: \"\\f1e7\";\n}\n.fa-twitch:before {\n  content: \"\\f1e8\";\n}\n.fa-yelp:before {\n  content: \"\\f1e9\";\n}\n.fa-newspaper-o:before {\n  content: \"\\f1ea\";\n}\n.fa-wifi:before {\n  content: \"\\f1eb\";\n}\n.fa-calculator:before {\n  content: \"\\f1ec\";\n}\n.fa-paypal:before {\n  content: \"\\f1ed\";\n}\n.fa-google-wallet:before {\n  content: \"\\f1ee\";\n}\n.fa-cc-visa:before {\n  content: \"\\f1f0\";\n}\n.fa-cc-mastercard:before {\n  content: \"\\f1f1\";\n}\n.fa-cc-discover:before {\n  content: \"\\f1f2\";\n}\n.fa-cc-amex:before {\n  content: \"\\f1f3\";\n}\n.fa-cc-paypal:before {\n  content: \"\\f1f4\";\n}\n.fa-cc-stripe:before {\n  content: \"\\f1f5\";\n}\n.fa-bell-slash:before {\n  content: \"\\f1f6\";\n}\n.fa-bell-slash-o:before {\n  content: \"\\f1f7\";\n}\n.fa-trash:before {\n  content: \"\\f1f8\";\n}\n.fa-copyright:before {\n  content: \"\\f1f9\";\n}\n.fa-at:before {\n  content: \"\\f1fa\";\n}\n.fa-eyedropper:before {\n  content: \"\\f1fb\";\n}\n.fa-paint-brush:before {\n  content: \"\\f1fc\";\n}\n.fa-birthday-cake:before {\n  content: \"\\f1fd\";\n}\n.fa-area-chart:before {\n  content: \"\\f1fe\";\n}\n.fa-pie-chart:before {\n  content: \"\\f200\";\n}\n.fa-line-chart:before {\n  content: \"\\f201\";\n}\n.fa-lastfm:before {\n  content: \"\\f202\";\n}\n.fa-lastfm-square:before {\n  content: \"\\f203\";\n}\n.fa-toggle-off:before {\n  content: \"\\f204\";\n}\n.fa-toggle-on:before {\n  content: \"\\f205\";\n}\n.fa-bicycle:before {\n  content: \"\\f206\";\n}\n.fa-bus:before {\n  content: \"\\f207\";\n}\n.fa-ioxhost:before {\n  content: \"\\f208\";\n}\n.fa-angellist:before {\n  content: \"\\f209\";\n}\n.fa-cc:before {\n  content: \"\\f20a\";\n}\n.fa-shekel:before,\n.fa-sheqel:before,\n.fa-ils:before {\n  content: \"\\f20b\";\n}\n.fa-meanpath:before {\n  content: \"\\f20c\";\n}\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/less/bordered-pulled.less",
    "content": "// Bordered & Pulled\n// -------------------------\n\n.@{fa-css-prefix}-border {\n  padding: .2em .25em .15em;\n  border: solid .08em @fa-border-color;\n  border-radius: .1em;\n}\n\n.pull-right { float: right; }\n.pull-left { float: left; }\n\n.@{fa-css-prefix} {\n  &.pull-left { margin-right: .3em; }\n  &.pull-right { margin-left: .3em; }\n}\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/less/core.less",
    "content": "// Base Class Definition\n// -------------------------\n\n.@{fa-css-prefix} {\n  display: inline-block;\n  font: normal normal normal 14px/1 FontAwesome; // shortening font declaration\n  font-size: inherit; // can't have font-size inherit on line above, so need to override\n  text-rendering: auto; // optimizelegibility throws things off #1094\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/less/fixed-width.less",
    "content": "// Fixed Width Icons\n// -------------------------\n.@{fa-css-prefix}-fw {\n  width: (18em / 14);\n  text-align: center;\n}\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/less/font-awesome.less",
    "content": "/*!\n *  Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n\n@import \"variables.less\";\n@import \"mixins.less\";\n@import \"path.less\";\n@import \"core.less\";\n@import \"larger.less\";\n@import \"fixed-width.less\";\n@import \"list.less\";\n@import \"bordered-pulled.less\";\n@import \"spinning.less\";\n@import \"rotated-flipped.less\";\n@import \"stacked.less\";\n@import \"icons.less\";\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/less/icons.less",
    "content": "/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons */\n\n.@{fa-css-prefix}-glass:before { content: @fa-var-glass; }\n.@{fa-css-prefix}-music:before { content: @fa-var-music; }\n.@{fa-css-prefix}-search:before { content: @fa-var-search; }\n.@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; }\n.@{fa-css-prefix}-heart:before { content: @fa-var-heart; }\n.@{fa-css-prefix}-star:before { content: @fa-var-star; }\n.@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; }\n.@{fa-css-prefix}-user:before { content: @fa-var-user; }\n.@{fa-css-prefix}-film:before { content: @fa-var-film; }\n.@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; }\n.@{fa-css-prefix}-th:before { content: @fa-var-th; }\n.@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; }\n.@{fa-css-prefix}-check:before { content: @fa-var-check; }\n.@{fa-css-prefix}-remove:before,\n.@{fa-css-prefix}-close:before,\n.@{fa-css-prefix}-times:before { content: @fa-var-times; }\n.@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; }\n.@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; }\n.@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; }\n.@{fa-css-prefix}-signal:before { content: @fa-var-signal; }\n.@{fa-css-prefix}-gear:before,\n.@{fa-css-prefix}-cog:before { content: @fa-var-cog; }\n.@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; }\n.@{fa-css-prefix}-home:before { content: @fa-var-home; }\n.@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; }\n.@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; }\n.@{fa-css-prefix}-road:before { content: @fa-var-road; }\n.@{fa-css-prefix}-download:before { content: @fa-var-download; }\n.@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; }\n.@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; }\n.@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; }\n.@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; }\n.@{fa-css-prefix}-rotate-right:before,\n.@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; }\n.@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; }\n.@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; }\n.@{fa-css-prefix}-lock:before { content: @fa-var-lock; }\n.@{fa-css-prefix}-flag:before { content: @fa-var-flag; }\n.@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; }\n.@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; }\n.@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; }\n.@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; }\n.@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; }\n.@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; }\n.@{fa-css-prefix}-tag:before { content: @fa-var-tag; }\n.@{fa-css-prefix}-tags:before { content: @fa-var-tags; }\n.@{fa-css-prefix}-book:before { content: @fa-var-book; }\n.@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; }\n.@{fa-css-prefix}-print:before { content: @fa-var-print; }\n.@{fa-css-prefix}-camera:before { content: @fa-var-camera; }\n.@{fa-css-prefix}-font:before { content: @fa-var-font; }\n.@{fa-css-prefix}-bold:before { content: @fa-var-bold; }\n.@{fa-css-prefix}-italic:before { content: @fa-var-italic; }\n.@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; }\n.@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; }\n.@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; }\n.@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; }\n.@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; }\n.@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; }\n.@{fa-css-prefix}-list:before { content: @fa-var-list; }\n.@{fa-css-prefix}-dedent:before,\n.@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; }\n.@{fa-css-prefix}-indent:before { content: @fa-var-indent; }\n.@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; }\n.@{fa-css-prefix}-photo:before,\n.@{fa-css-prefix}-image:before,\n.@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; }\n.@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; }\n.@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; }\n.@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; }\n.@{fa-css-prefix}-tint:before { content: @fa-var-tint; }\n.@{fa-css-prefix}-edit:before,\n.@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; }\n.@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; }\n.@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; }\n.@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; }\n.@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; }\n.@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; }\n.@{fa-css-prefix}-backward:before { content: @fa-var-backward; }\n.@{fa-css-prefix}-play:before { content: @fa-var-play; }\n.@{fa-css-prefix}-pause:before { content: @fa-var-pause; }\n.@{fa-css-prefix}-stop:before { content: @fa-var-stop; }\n.@{fa-css-prefix}-forward:before { content: @fa-var-forward; }\n.@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; }\n.@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; }\n.@{fa-css-prefix}-eject:before { content: @fa-var-eject; }\n.@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; }\n.@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; }\n.@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; }\n.@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; }\n.@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; }\n.@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; }\n.@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; }\n.@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; }\n.@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; }\n.@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; }\n.@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; }\n.@{fa-css-prefix}-ban:before { content: @fa-var-ban; }\n.@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; }\n.@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; }\n.@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; }\n.@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; }\n.@{fa-css-prefix}-mail-forward:before,\n.@{fa-css-prefix}-share:before { content: @fa-var-share; }\n.@{fa-css-prefix}-expand:before { content: @fa-var-expand; }\n.@{fa-css-prefix}-compress:before { content: @fa-var-compress; }\n.@{fa-css-prefix}-plus:before { content: @fa-var-plus; }\n.@{fa-css-prefix}-minus:before { content: @fa-var-minus; }\n.@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; }\n.@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; }\n.@{fa-css-prefix}-gift:before { content: @fa-var-gift; }\n.@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; }\n.@{fa-css-prefix}-fire:before { content: @fa-var-fire; }\n.@{fa-css-prefix}-eye:before { content: @fa-var-eye; }\n.@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; }\n.@{fa-css-prefix}-warning:before,\n.@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; }\n.@{fa-css-prefix}-plane:before { content: @fa-var-plane; }\n.@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; }\n.@{fa-css-prefix}-random:before { content: @fa-var-random; }\n.@{fa-css-prefix}-comment:before { content: @fa-var-comment; }\n.@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; }\n.@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; }\n.@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; }\n.@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; }\n.@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; }\n.@{fa-css-prefix}-folder:before { content: @fa-var-folder; }\n.@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; }\n.@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; }\n.@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; }\n.@{fa-css-prefix}-bar-chart-o:before,\n.@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; }\n.@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; }\n.@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; }\n.@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; }\n.@{fa-css-prefix}-key:before { content: @fa-var-key; }\n.@{fa-css-prefix}-gears:before,\n.@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; }\n.@{fa-css-prefix}-comments:before { content: @fa-var-comments; }\n.@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; }\n.@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; }\n.@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; }\n.@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; }\n.@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; }\n.@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; }\n.@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; }\n.@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; }\n.@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; }\n.@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; }\n.@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; }\n.@{fa-css-prefix}-upload:before { content: @fa-var-upload; }\n.@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; }\n.@{fa-css-prefix}-phone:before { content: @fa-var-phone; }\n.@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; }\n.@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; }\n.@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; }\n.@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; }\n.@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; }\n.@{fa-css-prefix}-github:before { content: @fa-var-github; }\n.@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; }\n.@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; }\n.@{fa-css-prefix}-rss:before { content: @fa-var-rss; }\n.@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; }\n.@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; }\n.@{fa-css-prefix}-bell:before { content: @fa-var-bell; }\n.@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; }\n.@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; }\n.@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; }\n.@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; }\n.@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; }\n.@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; }\n.@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; }\n.@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; }\n.@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; }\n.@{fa-css-prefix}-globe:before { content: @fa-var-globe; }\n.@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; }\n.@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; }\n.@{fa-css-prefix}-filter:before { content: @fa-var-filter; }\n.@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; }\n.@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; }\n.@{fa-css-prefix}-group:before,\n.@{fa-css-prefix}-users:before { content: @fa-var-users; }\n.@{fa-css-prefix}-chain:before,\n.@{fa-css-prefix}-link:before { content: @fa-var-link; }\n.@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; }\n.@{fa-css-prefix}-flask:before { content: @fa-var-flask; }\n.@{fa-css-prefix}-cut:before,\n.@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; }\n.@{fa-css-prefix}-copy:before,\n.@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; }\n.@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; }\n.@{fa-css-prefix}-save:before,\n.@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; }\n.@{fa-css-prefix}-square:before { content: @fa-var-square; }\n.@{fa-css-prefix}-navicon:before,\n.@{fa-css-prefix}-reorder:before,\n.@{fa-css-prefix}-bars:before { content: @fa-var-bars; }\n.@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; }\n.@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; }\n.@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; }\n.@{fa-css-prefix}-underline:before { content: @fa-var-underline; }\n.@{fa-css-prefix}-table:before { content: @fa-var-table; }\n.@{fa-css-prefix}-magic:before { content: @fa-var-magic; }\n.@{fa-css-prefix}-truck:before { content: @fa-var-truck; }\n.@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; }\n.@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; }\n.@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; }\n.@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; }\n.@{fa-css-prefix}-money:before { content: @fa-var-money; }\n.@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; }\n.@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; }\n.@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; }\n.@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; }\n.@{fa-css-prefix}-columns:before { content: @fa-var-columns; }\n.@{fa-css-prefix}-unsorted:before,\n.@{fa-css-prefix}-sort:before { content: @fa-var-sort; }\n.@{fa-css-prefix}-sort-down:before,\n.@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; }\n.@{fa-css-prefix}-sort-up:before,\n.@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; }\n.@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; }\n.@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; }\n.@{fa-css-prefix}-rotate-left:before,\n.@{fa-css-prefix}-undo:before { content: @fa-var-undo; }\n.@{fa-css-prefix}-legal:before,\n.@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; }\n.@{fa-css-prefix}-dashboard:before,\n.@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; }\n.@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; }\n.@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; }\n.@{fa-css-prefix}-flash:before,\n.@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; }\n.@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; }\n.@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; }\n.@{fa-css-prefix}-paste:before,\n.@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; }\n.@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; }\n.@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; }\n.@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; }\n.@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; }\n.@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; }\n.@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; }\n.@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; }\n.@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; }\n.@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; }\n.@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; }\n.@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; }\n.@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; }\n.@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; }\n.@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; }\n.@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; }\n.@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; }\n.@{fa-css-prefix}-beer:before { content: @fa-var-beer; }\n.@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; }\n.@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; }\n.@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; }\n.@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; }\n.@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; }\n.@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; }\n.@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; }\n.@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; }\n.@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; }\n.@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; }\n.@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; }\n.@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; }\n.@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; }\n.@{fa-css-prefix}-mobile-phone:before,\n.@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; }\n.@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; }\n.@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; }\n.@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; }\n.@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; }\n.@{fa-css-prefix}-circle:before { content: @fa-var-circle; }\n.@{fa-css-prefix}-mail-reply:before,\n.@{fa-css-prefix}-reply:before { content: @fa-var-reply; }\n.@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; }\n.@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; }\n.@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; }\n.@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; }\n.@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; }\n.@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; }\n.@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; }\n.@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; }\n.@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; }\n.@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; }\n.@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; }\n.@{fa-css-prefix}-code:before { content: @fa-var-code; }\n.@{fa-css-prefix}-mail-reply-all:before,\n.@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; }\n.@{fa-css-prefix}-star-half-empty:before,\n.@{fa-css-prefix}-star-half-full:before,\n.@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; }\n.@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; }\n.@{fa-css-prefix}-crop:before { content: @fa-var-crop; }\n.@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; }\n.@{fa-css-prefix}-unlink:before,\n.@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; }\n.@{fa-css-prefix}-question:before { content: @fa-var-question; }\n.@{fa-css-prefix}-info:before { content: @fa-var-info; }\n.@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; }\n.@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; }\n.@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; }\n.@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; }\n.@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; }\n.@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; }\n.@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; }\n.@{fa-css-prefix}-shield:before { content: @fa-var-shield; }\n.@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; }\n.@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; }\n.@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; }\n.@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; }\n.@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; }\n.@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; }\n.@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; }\n.@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; }\n.@{fa-css-prefix}-html5:before { content: @fa-var-html5; }\n.@{fa-css-prefix}-css3:before { content: @fa-var-css3; }\n.@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; }\n.@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; }\n.@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; }\n.@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; }\n.@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; }\n.@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; }\n.@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; }\n.@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; }\n.@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; }\n.@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; }\n.@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; }\n.@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; }\n.@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; }\n.@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; }\n.@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; }\n.@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; }\n.@{fa-css-prefix}-compass:before { content: @fa-var-compass; }\n.@{fa-css-prefix}-toggle-down:before,\n.@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; }\n.@{fa-css-prefix}-toggle-up:before,\n.@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; }\n.@{fa-css-prefix}-toggle-right:before,\n.@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; }\n.@{fa-css-prefix}-euro:before,\n.@{fa-css-prefix}-eur:before { content: @fa-var-eur; }\n.@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; }\n.@{fa-css-prefix}-dollar:before,\n.@{fa-css-prefix}-usd:before { content: @fa-var-usd; }\n.@{fa-css-prefix}-rupee:before,\n.@{fa-css-prefix}-inr:before { content: @fa-var-inr; }\n.@{fa-css-prefix}-cny:before,\n.@{fa-css-prefix}-rmb:before,\n.@{fa-css-prefix}-yen:before,\n.@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; }\n.@{fa-css-prefix}-ruble:before,\n.@{fa-css-prefix}-rouble:before,\n.@{fa-css-prefix}-rub:before { content: @fa-var-rub; }\n.@{fa-css-prefix}-won:before,\n.@{fa-css-prefix}-krw:before { content: @fa-var-krw; }\n.@{fa-css-prefix}-bitcoin:before,\n.@{fa-css-prefix}-btc:before { content: @fa-var-btc; }\n.@{fa-css-prefix}-file:before { content: @fa-var-file; }\n.@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; }\n.@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; }\n.@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; }\n.@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; }\n.@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; }\n.@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; }\n.@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; }\n.@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; }\n.@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; }\n.@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; }\n.@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; }\n.@{fa-css-prefix}-xing:before { content: @fa-var-xing; }\n.@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; }\n.@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; }\n.@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; }\n.@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; }\n.@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; }\n.@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; }\n.@{fa-css-prefix}-adn:before { content: @fa-var-adn; }\n.@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; }\n.@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; }\n.@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; }\n.@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; }\n.@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; }\n.@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; }\n.@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; }\n.@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; }\n.@{fa-css-prefix}-apple:before { content: @fa-var-apple; }\n.@{fa-css-prefix}-windows:before { content: @fa-var-windows; }\n.@{fa-css-prefix}-android:before { content: @fa-var-android; }\n.@{fa-css-prefix}-linux:before { content: @fa-var-linux; }\n.@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; }\n.@{fa-css-prefix}-skype:before { content: @fa-var-skype; }\n.@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; }\n.@{fa-css-prefix}-trello:before { content: @fa-var-trello; }\n.@{fa-css-prefix}-female:before { content: @fa-var-female; }\n.@{fa-css-prefix}-male:before { content: @fa-var-male; }\n.@{fa-css-prefix}-gittip:before { content: @fa-var-gittip; }\n.@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; }\n.@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; }\n.@{fa-css-prefix}-archive:before { content: @fa-var-archive; }\n.@{fa-css-prefix}-bug:before { content: @fa-var-bug; }\n.@{fa-css-prefix}-vk:before { content: @fa-var-vk; }\n.@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; }\n.@{fa-css-prefix}-renren:before { content: @fa-var-renren; }\n.@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; }\n.@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; }\n.@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; }\n.@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; }\n.@{fa-css-prefix}-toggle-left:before,\n.@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; }\n.@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; }\n.@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; }\n.@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; }\n.@{fa-css-prefix}-turkish-lira:before,\n.@{fa-css-prefix}-try:before { content: @fa-var-try; }\n.@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; }\n.@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; }\n.@{fa-css-prefix}-slack:before { content: @fa-var-slack; }\n.@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; }\n.@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; }\n.@{fa-css-prefix}-openid:before { content: @fa-var-openid; }\n.@{fa-css-prefix}-institution:before,\n.@{fa-css-prefix}-bank:before,\n.@{fa-css-prefix}-university:before { content: @fa-var-university; }\n.@{fa-css-prefix}-mortar-board:before,\n.@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; }\n.@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; }\n.@{fa-css-prefix}-google:before { content: @fa-var-google; }\n.@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; }\n.@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; }\n.@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; }\n.@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; }\n.@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; }\n.@{fa-css-prefix}-digg:before { content: @fa-var-digg; }\n.@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; }\n.@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; }\n.@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; }\n.@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; }\n.@{fa-css-prefix}-language:before { content: @fa-var-language; }\n.@{fa-css-prefix}-fax:before { content: @fa-var-fax; }\n.@{fa-css-prefix}-building:before { content: @fa-var-building; }\n.@{fa-css-prefix}-child:before { content: @fa-var-child; }\n.@{fa-css-prefix}-paw:before { content: @fa-var-paw; }\n.@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; }\n.@{fa-css-prefix}-cube:before { content: @fa-var-cube; }\n.@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; }\n.@{fa-css-prefix}-behance:before { content: @fa-var-behance; }\n.@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; }\n.@{fa-css-prefix}-steam:before { content: @fa-var-steam; }\n.@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; }\n.@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; }\n.@{fa-css-prefix}-automobile:before,\n.@{fa-css-prefix}-car:before { content: @fa-var-car; }\n.@{fa-css-prefix}-cab:before,\n.@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; }\n.@{fa-css-prefix}-tree:before { content: @fa-var-tree; }\n.@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; }\n.@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; }\n.@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; }\n.@{fa-css-prefix}-database:before { content: @fa-var-database; }\n.@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; }\n.@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; }\n.@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; }\n.@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; }\n.@{fa-css-prefix}-file-photo-o:before,\n.@{fa-css-prefix}-file-picture-o:before,\n.@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; }\n.@{fa-css-prefix}-file-zip-o:before,\n.@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; }\n.@{fa-css-prefix}-file-sound-o:before,\n.@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; }\n.@{fa-css-prefix}-file-movie-o:before,\n.@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; }\n.@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; }\n.@{fa-css-prefix}-vine:before { content: @fa-var-vine; }\n.@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; }\n.@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; }\n.@{fa-css-prefix}-life-bouy:before,\n.@{fa-css-prefix}-life-buoy:before,\n.@{fa-css-prefix}-life-saver:before,\n.@{fa-css-prefix}-support:before,\n.@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; }\n.@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; }\n.@{fa-css-prefix}-ra:before,\n.@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; }\n.@{fa-css-prefix}-ge:before,\n.@{fa-css-prefix}-empire:before { content: @fa-var-empire; }\n.@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; }\n.@{fa-css-prefix}-git:before { content: @fa-var-git; }\n.@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; }\n.@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; }\n.@{fa-css-prefix}-qq:before { content: @fa-var-qq; }\n.@{fa-css-prefix}-wechat:before,\n.@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; }\n.@{fa-css-prefix}-send:before,\n.@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; }\n.@{fa-css-prefix}-send-o:before,\n.@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; }\n.@{fa-css-prefix}-history:before { content: @fa-var-history; }\n.@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; }\n.@{fa-css-prefix}-header:before { content: @fa-var-header; }\n.@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; }\n.@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; }\n.@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; }\n.@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; }\n.@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; }\n.@{fa-css-prefix}-soccer-ball-o:before,\n.@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; }\n.@{fa-css-prefix}-tty:before { content: @fa-var-tty; }\n.@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; }\n.@{fa-css-prefix}-plug:before { content: @fa-var-plug; }\n.@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; }\n.@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; }\n.@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; }\n.@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; }\n.@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; }\n.@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; }\n.@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; }\n.@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; }\n.@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; }\n.@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; }\n.@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; }\n.@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; }\n.@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; }\n.@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; }\n.@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; }\n.@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; }\n.@{fa-css-prefix}-trash:before { content: @fa-var-trash; }\n.@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; }\n.@{fa-css-prefix}-at:before { content: @fa-var-at; }\n.@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; }\n.@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; }\n.@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; }\n.@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; }\n.@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; }\n.@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; }\n.@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; }\n.@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; }\n.@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; }\n.@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; }\n.@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; }\n.@{fa-css-prefix}-bus:before { content: @fa-var-bus; }\n.@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; }\n.@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; }\n.@{fa-css-prefix}-cc:before { content: @fa-var-cc; }\n.@{fa-css-prefix}-shekel:before,\n.@{fa-css-prefix}-sheqel:before,\n.@{fa-css-prefix}-ils:before { content: @fa-var-ils; }\n.@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; }\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/less/larger.less",
    "content": "// Icon Sizes\n// -------------------------\n\n/* makes the font 33% larger relative to the icon container */\n.@{fa-css-prefix}-lg {\n  font-size: (4em / 3);\n  line-height: (3em / 4);\n  vertical-align: -15%;\n}\n.@{fa-css-prefix}-2x { font-size: 2em; }\n.@{fa-css-prefix}-3x { font-size: 3em; }\n.@{fa-css-prefix}-4x { font-size: 4em; }\n.@{fa-css-prefix}-5x { font-size: 5em; }\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/less/list.less",
    "content": "// List Icons\n// -------------------------\n\n.@{fa-css-prefix}-ul {\n  padding-left: 0;\n  margin-left: @fa-li-width;\n  list-style-type: none;\n  > li { position: relative; }\n}\n.@{fa-css-prefix}-li {\n  position: absolute;\n  left: -@fa-li-width;\n  width: @fa-li-width;\n  top: (2em / 14);\n  text-align: center;\n  &.@{fa-css-prefix}-lg {\n    left: (-@fa-li-width + (4em / 14));\n  }\n}\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/less/mixins.less",
    "content": "// Mixins\n// --------------------------\n\n.fa-icon() {\n  display: inline-block;\n  font: normal normal normal 14px/1 FontAwesome; // shortening font declaration\n  font-size: inherit; // can't have font-size inherit on line above, so need to override\n  text-rendering: auto; // optimizelegibility throws things off #1094\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.fa-icon-rotate(@degrees, @rotation) {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation);\n  -webkit-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees);\n          transform: rotate(@degrees);\n}\n\n.fa-icon-flip(@horiz, @vert, @rotation) {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1);\n  -webkit-transform: scale(@horiz, @vert);\n      -ms-transform: scale(@horiz, @vert);\n          transform: scale(@horiz, @vert);\n}\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/less/path.less",
    "content": "/* FONT PATH\n * -------------------------- */\n\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');\n  src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),\n    url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),\n    url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),\n    url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');\n//  src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts\n  font-weight: normal;\n  font-style: normal;\n}\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/less/rotated-flipped.less",
    "content": "// Rotated & Flipped Icons\n// -------------------------\n\n.@{fa-css-prefix}-rotate-90  { .fa-icon-rotate(90deg, 1);  }\n.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }\n.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }\n\n.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }\n.@{fa-css-prefix}-flip-vertical   { .fa-icon-flip(1, -1, 2); }\n\n// Hook for IE8-9\n// -------------------------\n\n:root .@{fa-css-prefix}-rotate-90,\n:root .@{fa-css-prefix}-rotate-180,\n:root .@{fa-css-prefix}-rotate-270,\n:root .@{fa-css-prefix}-flip-horizontal,\n:root .@{fa-css-prefix}-flip-vertical {\n  filter: none;\n}\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/less/spinning.less",
    "content": "// Spinning Icons\n// --------------------------\n\n.@{fa-css-prefix}-spin {\n  -webkit-animation: fa-spin 2s infinite linear;\n          animation: fa-spin 2s infinite linear;\n}\n\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/less/stacked.less",
    "content": "// Stacked Icons\n// -------------------------\n\n.@{fa-css-prefix}-stack {\n  position: relative;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  line-height: 2em;\n  vertical-align: middle;\n}\n.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {\n  position: absolute;\n  left: 0;\n  width: 100%;\n  text-align: center;\n}\n.@{fa-css-prefix}-stack-1x { line-height: inherit; }\n.@{fa-css-prefix}-stack-2x { font-size: 2em; }\n.@{fa-css-prefix}-inverse { color: @fa-inverse; }\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/less/variables.less",
    "content": "// Variables\n// --------------------------\n\n@fa-font-path:        \"../fonts\";\n//@fa-font-path:        \"//netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts\"; // for referencing Bootstrap CDN font files directly\n@fa-css-prefix:       fa;\n@fa-version:          \"4.2.0\";\n@fa-border-color:     #eee;\n@fa-inverse:          #fff;\n@fa-li-width:         (30em / 14);\n\n@fa-var-adjust: \"\\f042\";\n@fa-var-adn: \"\\f170\";\n@fa-var-align-center: \"\\f037\";\n@fa-var-align-justify: \"\\f039\";\n@fa-var-align-left: \"\\f036\";\n@fa-var-align-right: \"\\f038\";\n@fa-var-ambulance: \"\\f0f9\";\n@fa-var-anchor: \"\\f13d\";\n@fa-var-android: \"\\f17b\";\n@fa-var-angellist: \"\\f209\";\n@fa-var-angle-double-down: \"\\f103\";\n@fa-var-angle-double-left: \"\\f100\";\n@fa-var-angle-double-right: \"\\f101\";\n@fa-var-angle-double-up: \"\\f102\";\n@fa-var-angle-down: \"\\f107\";\n@fa-var-angle-left: \"\\f104\";\n@fa-var-angle-right: \"\\f105\";\n@fa-var-angle-up: \"\\f106\";\n@fa-var-apple: \"\\f179\";\n@fa-var-archive: \"\\f187\";\n@fa-var-area-chart: \"\\f1fe\";\n@fa-var-arrow-circle-down: \"\\f0ab\";\n@fa-var-arrow-circle-left: \"\\f0a8\";\n@fa-var-arrow-circle-o-down: \"\\f01a\";\n@fa-var-arrow-circle-o-left: \"\\f190\";\n@fa-var-arrow-circle-o-right: \"\\f18e\";\n@fa-var-arrow-circle-o-up: \"\\f01b\";\n@fa-var-arrow-circle-right: \"\\f0a9\";\n@fa-var-arrow-circle-up: \"\\f0aa\";\n@fa-var-arrow-down: \"\\f063\";\n@fa-var-arrow-left: \"\\f060\";\n@fa-var-arrow-right: \"\\f061\";\n@fa-var-arrow-up: \"\\f062\";\n@fa-var-arrows: \"\\f047\";\n@fa-var-arrows-alt: \"\\f0b2\";\n@fa-var-arrows-h: \"\\f07e\";\n@fa-var-arrows-v: \"\\f07d\";\n@fa-var-asterisk: \"\\f069\";\n@fa-var-at: \"\\f1fa\";\n@fa-var-automobile: \"\\f1b9\";\n@fa-var-backward: \"\\f04a\";\n@fa-var-ban: \"\\f05e\";\n@fa-var-bank: \"\\f19c\";\n@fa-var-bar-chart: \"\\f080\";\n@fa-var-bar-chart-o: \"\\f080\";\n@fa-var-barcode: \"\\f02a\";\n@fa-var-bars: \"\\f0c9\";\n@fa-var-beer: \"\\f0fc\";\n@fa-var-behance: \"\\f1b4\";\n@fa-var-behance-square: \"\\f1b5\";\n@fa-var-bell: \"\\f0f3\";\n@fa-var-bell-o: \"\\f0a2\";\n@fa-var-bell-slash: \"\\f1f6\";\n@fa-var-bell-slash-o: \"\\f1f7\";\n@fa-var-bicycle: \"\\f206\";\n@fa-var-binoculars: \"\\f1e5\";\n@fa-var-birthday-cake: \"\\f1fd\";\n@fa-var-bitbucket: \"\\f171\";\n@fa-var-bitbucket-square: \"\\f172\";\n@fa-var-bitcoin: \"\\f15a\";\n@fa-var-bold: \"\\f032\";\n@fa-var-bolt: \"\\f0e7\";\n@fa-var-bomb: \"\\f1e2\";\n@fa-var-book: \"\\f02d\";\n@fa-var-bookmark: \"\\f02e\";\n@fa-var-bookmark-o: \"\\f097\";\n@fa-var-briefcase: \"\\f0b1\";\n@fa-var-btc: \"\\f15a\";\n@fa-var-bug: \"\\f188\";\n@fa-var-building: \"\\f1ad\";\n@fa-var-building-o: \"\\f0f7\";\n@fa-var-bullhorn: \"\\f0a1\";\n@fa-var-bullseye: \"\\f140\";\n@fa-var-bus: \"\\f207\";\n@fa-var-cab: \"\\f1ba\";\n@fa-var-calculator: \"\\f1ec\";\n@fa-var-calendar: \"\\f073\";\n@fa-var-calendar-o: \"\\f133\";\n@fa-var-camera: \"\\f030\";\n@fa-var-camera-retro: \"\\f083\";\n@fa-var-car: \"\\f1b9\";\n@fa-var-caret-down: \"\\f0d7\";\n@fa-var-caret-left: \"\\f0d9\";\n@fa-var-caret-right: \"\\f0da\";\n@fa-var-caret-square-o-down: \"\\f150\";\n@fa-var-caret-square-o-left: \"\\f191\";\n@fa-var-caret-square-o-right: \"\\f152\";\n@fa-var-caret-square-o-up: \"\\f151\";\n@fa-var-caret-up: \"\\f0d8\";\n@fa-var-cc: \"\\f20a\";\n@fa-var-cc-amex: \"\\f1f3\";\n@fa-var-cc-discover: \"\\f1f2\";\n@fa-var-cc-mastercard: \"\\f1f1\";\n@fa-var-cc-paypal: \"\\f1f4\";\n@fa-var-cc-stripe: \"\\f1f5\";\n@fa-var-cc-visa: \"\\f1f0\";\n@fa-var-certificate: \"\\f0a3\";\n@fa-var-chain: \"\\f0c1\";\n@fa-var-chain-broken: \"\\f127\";\n@fa-var-check: \"\\f00c\";\n@fa-var-check-circle: \"\\f058\";\n@fa-var-check-circle-o: \"\\f05d\";\n@fa-var-check-square: \"\\f14a\";\n@fa-var-check-square-o: \"\\f046\";\n@fa-var-chevron-circle-down: \"\\f13a\";\n@fa-var-chevron-circle-left: \"\\f137\";\n@fa-var-chevron-circle-right: \"\\f138\";\n@fa-var-chevron-circle-up: \"\\f139\";\n@fa-var-chevron-down: \"\\f078\";\n@fa-var-chevron-left: \"\\f053\";\n@fa-var-chevron-right: \"\\f054\";\n@fa-var-chevron-up: \"\\f077\";\n@fa-var-child: \"\\f1ae\";\n@fa-var-circle: \"\\f111\";\n@fa-var-circle-o: \"\\f10c\";\n@fa-var-circle-o-notch: \"\\f1ce\";\n@fa-var-circle-thin: \"\\f1db\";\n@fa-var-clipboard: \"\\f0ea\";\n@fa-var-clock-o: \"\\f017\";\n@fa-var-close: \"\\f00d\";\n@fa-var-cloud: \"\\f0c2\";\n@fa-var-cloud-download: \"\\f0ed\";\n@fa-var-cloud-upload: \"\\f0ee\";\n@fa-var-cny: \"\\f157\";\n@fa-var-code: \"\\f121\";\n@fa-var-code-fork: \"\\f126\";\n@fa-var-codepen: \"\\f1cb\";\n@fa-var-coffee: \"\\f0f4\";\n@fa-var-cog: \"\\f013\";\n@fa-var-cogs: \"\\f085\";\n@fa-var-columns: \"\\f0db\";\n@fa-var-comment: \"\\f075\";\n@fa-var-comment-o: \"\\f0e5\";\n@fa-var-comments: \"\\f086\";\n@fa-var-comments-o: \"\\f0e6\";\n@fa-var-compass: \"\\f14e\";\n@fa-var-compress: \"\\f066\";\n@fa-var-copy: \"\\f0c5\";\n@fa-var-copyright: \"\\f1f9\";\n@fa-var-credit-card: \"\\f09d\";\n@fa-var-crop: \"\\f125\";\n@fa-var-crosshairs: \"\\f05b\";\n@fa-var-css3: \"\\f13c\";\n@fa-var-cube: \"\\f1b2\";\n@fa-var-cubes: \"\\f1b3\";\n@fa-var-cut: \"\\f0c4\";\n@fa-var-cutlery: \"\\f0f5\";\n@fa-var-dashboard: \"\\f0e4\";\n@fa-var-database: \"\\f1c0\";\n@fa-var-dedent: \"\\f03b\";\n@fa-var-delicious: \"\\f1a5\";\n@fa-var-desktop: \"\\f108\";\n@fa-var-deviantart: \"\\f1bd\";\n@fa-var-digg: \"\\f1a6\";\n@fa-var-dollar: \"\\f155\";\n@fa-var-dot-circle-o: \"\\f192\";\n@fa-var-download: \"\\f019\";\n@fa-var-dribbble: \"\\f17d\";\n@fa-var-dropbox: \"\\f16b\";\n@fa-var-drupal: \"\\f1a9\";\n@fa-var-edit: \"\\f044\";\n@fa-var-eject: \"\\f052\";\n@fa-var-ellipsis-h: \"\\f141\";\n@fa-var-ellipsis-v: \"\\f142\";\n@fa-var-empire: \"\\f1d1\";\n@fa-var-envelope: \"\\f0e0\";\n@fa-var-envelope-o: \"\\f003\";\n@fa-var-envelope-square: \"\\f199\";\n@fa-var-eraser: \"\\f12d\";\n@fa-var-eur: \"\\f153\";\n@fa-var-euro: \"\\f153\";\n@fa-var-exchange: \"\\f0ec\";\n@fa-var-exclamation: \"\\f12a\";\n@fa-var-exclamation-circle: \"\\f06a\";\n@fa-var-exclamation-triangle: \"\\f071\";\n@fa-var-expand: \"\\f065\";\n@fa-var-external-link: \"\\f08e\";\n@fa-var-external-link-square: \"\\f14c\";\n@fa-var-eye: \"\\f06e\";\n@fa-var-eye-slash: \"\\f070\";\n@fa-var-eyedropper: \"\\f1fb\";\n@fa-var-facebook: \"\\f09a\";\n@fa-var-facebook-square: \"\\f082\";\n@fa-var-fast-backward: \"\\f049\";\n@fa-var-fast-forward: \"\\f050\";\n@fa-var-fax: \"\\f1ac\";\n@fa-var-female: \"\\f182\";\n@fa-var-fighter-jet: \"\\f0fb\";\n@fa-var-file: \"\\f15b\";\n@fa-var-file-archive-o: \"\\f1c6\";\n@fa-var-file-audio-o: \"\\f1c7\";\n@fa-var-file-code-o: \"\\f1c9\";\n@fa-var-file-excel-o: \"\\f1c3\";\n@fa-var-file-image-o: \"\\f1c5\";\n@fa-var-file-movie-o: \"\\f1c8\";\n@fa-var-file-o: \"\\f016\";\n@fa-var-file-pdf-o: \"\\f1c1\";\n@fa-var-file-photo-o: \"\\f1c5\";\n@fa-var-file-picture-o: \"\\f1c5\";\n@fa-var-file-powerpoint-o: \"\\f1c4\";\n@fa-var-file-sound-o: \"\\f1c7\";\n@fa-var-file-text: \"\\f15c\";\n@fa-var-file-text-o: \"\\f0f6\";\n@fa-var-file-video-o: \"\\f1c8\";\n@fa-var-file-word-o: \"\\f1c2\";\n@fa-var-file-zip-o: \"\\f1c6\";\n@fa-var-files-o: \"\\f0c5\";\n@fa-var-film: \"\\f008\";\n@fa-var-filter: \"\\f0b0\";\n@fa-var-fire: \"\\f06d\";\n@fa-var-fire-extinguisher: \"\\f134\";\n@fa-var-flag: \"\\f024\";\n@fa-var-flag-checkered: \"\\f11e\";\n@fa-var-flag-o: \"\\f11d\";\n@fa-var-flash: \"\\f0e7\";\n@fa-var-flask: \"\\f0c3\";\n@fa-var-flickr: \"\\f16e\";\n@fa-var-floppy-o: \"\\f0c7\";\n@fa-var-folder: \"\\f07b\";\n@fa-var-folder-o: \"\\f114\";\n@fa-var-folder-open: \"\\f07c\";\n@fa-var-folder-open-o: \"\\f115\";\n@fa-var-font: \"\\f031\";\n@fa-var-forward: \"\\f04e\";\n@fa-var-foursquare: \"\\f180\";\n@fa-var-frown-o: \"\\f119\";\n@fa-var-futbol-o: \"\\f1e3\";\n@fa-var-gamepad: \"\\f11b\";\n@fa-var-gavel: \"\\f0e3\";\n@fa-var-gbp: \"\\f154\";\n@fa-var-ge: \"\\f1d1\";\n@fa-var-gear: \"\\f013\";\n@fa-var-gears: \"\\f085\";\n@fa-var-gift: \"\\f06b\";\n@fa-var-git: \"\\f1d3\";\n@fa-var-git-square: \"\\f1d2\";\n@fa-var-github: \"\\f09b\";\n@fa-var-github-alt: \"\\f113\";\n@fa-var-github-square: \"\\f092\";\n@fa-var-gittip: \"\\f184\";\n@fa-var-glass: \"\\f000\";\n@fa-var-globe: \"\\f0ac\";\n@fa-var-google: \"\\f1a0\";\n@fa-var-google-plus: \"\\f0d5\";\n@fa-var-google-plus-square: \"\\f0d4\";\n@fa-var-google-wallet: \"\\f1ee\";\n@fa-var-graduation-cap: \"\\f19d\";\n@fa-var-group: \"\\f0c0\";\n@fa-var-h-square: \"\\f0fd\";\n@fa-var-hacker-news: \"\\f1d4\";\n@fa-var-hand-o-down: \"\\f0a7\";\n@fa-var-hand-o-left: \"\\f0a5\";\n@fa-var-hand-o-right: \"\\f0a4\";\n@fa-var-hand-o-up: \"\\f0a6\";\n@fa-var-hdd-o: \"\\f0a0\";\n@fa-var-header: \"\\f1dc\";\n@fa-var-headphones: \"\\f025\";\n@fa-var-heart: \"\\f004\";\n@fa-var-heart-o: \"\\f08a\";\n@fa-var-history: \"\\f1da\";\n@fa-var-home: \"\\f015\";\n@fa-var-hospital-o: \"\\f0f8\";\n@fa-var-html5: \"\\f13b\";\n@fa-var-ils: \"\\f20b\";\n@fa-var-image: \"\\f03e\";\n@fa-var-inbox: \"\\f01c\";\n@fa-var-indent: \"\\f03c\";\n@fa-var-info: \"\\f129\";\n@fa-var-info-circle: \"\\f05a\";\n@fa-var-inr: \"\\f156\";\n@fa-var-instagram: \"\\f16d\";\n@fa-var-institution: \"\\f19c\";\n@fa-var-ioxhost: \"\\f208\";\n@fa-var-italic: \"\\f033\";\n@fa-var-joomla: \"\\f1aa\";\n@fa-var-jpy: \"\\f157\";\n@fa-var-jsfiddle: \"\\f1cc\";\n@fa-var-key: \"\\f084\";\n@fa-var-keyboard-o: \"\\f11c\";\n@fa-var-krw: \"\\f159\";\n@fa-var-language: \"\\f1ab\";\n@fa-var-laptop: \"\\f109\";\n@fa-var-lastfm: \"\\f202\";\n@fa-var-lastfm-square: \"\\f203\";\n@fa-var-leaf: \"\\f06c\";\n@fa-var-legal: \"\\f0e3\";\n@fa-var-lemon-o: \"\\f094\";\n@fa-var-level-down: \"\\f149\";\n@fa-var-level-up: \"\\f148\";\n@fa-var-life-bouy: \"\\f1cd\";\n@fa-var-life-buoy: \"\\f1cd\";\n@fa-var-life-ring: \"\\f1cd\";\n@fa-var-life-saver: \"\\f1cd\";\n@fa-var-lightbulb-o: \"\\f0eb\";\n@fa-var-line-chart: \"\\f201\";\n@fa-var-link: \"\\f0c1\";\n@fa-var-linkedin: \"\\f0e1\";\n@fa-var-linkedin-square: \"\\f08c\";\n@fa-var-linux: \"\\f17c\";\n@fa-var-list: \"\\f03a\";\n@fa-var-list-alt: \"\\f022\";\n@fa-var-list-ol: \"\\f0cb\";\n@fa-var-list-ul: \"\\f0ca\";\n@fa-var-location-arrow: \"\\f124\";\n@fa-var-lock: \"\\f023\";\n@fa-var-long-arrow-down: \"\\f175\";\n@fa-var-long-arrow-left: \"\\f177\";\n@fa-var-long-arrow-right: \"\\f178\";\n@fa-var-long-arrow-up: \"\\f176\";\n@fa-var-magic: \"\\f0d0\";\n@fa-var-magnet: \"\\f076\";\n@fa-var-mail-forward: \"\\f064\";\n@fa-var-mail-reply: \"\\f112\";\n@fa-var-mail-reply-all: \"\\f122\";\n@fa-var-male: \"\\f183\";\n@fa-var-map-marker: \"\\f041\";\n@fa-var-maxcdn: \"\\f136\";\n@fa-var-meanpath: \"\\f20c\";\n@fa-var-medkit: \"\\f0fa\";\n@fa-var-meh-o: \"\\f11a\";\n@fa-var-microphone: \"\\f130\";\n@fa-var-microphone-slash: \"\\f131\";\n@fa-var-minus: \"\\f068\";\n@fa-var-minus-circle: \"\\f056\";\n@fa-var-minus-square: \"\\f146\";\n@fa-var-minus-square-o: \"\\f147\";\n@fa-var-mobile: \"\\f10b\";\n@fa-var-mobile-phone: \"\\f10b\";\n@fa-var-money: \"\\f0d6\";\n@fa-var-moon-o: \"\\f186\";\n@fa-var-mortar-board: \"\\f19d\";\n@fa-var-music: \"\\f001\";\n@fa-var-navicon: \"\\f0c9\";\n@fa-var-newspaper-o: \"\\f1ea\";\n@fa-var-openid: \"\\f19b\";\n@fa-var-outdent: \"\\f03b\";\n@fa-var-pagelines: \"\\f18c\";\n@fa-var-paint-brush: \"\\f1fc\";\n@fa-var-paper-plane: \"\\f1d8\";\n@fa-var-paper-plane-o: \"\\f1d9\";\n@fa-var-paperclip: \"\\f0c6\";\n@fa-var-paragraph: \"\\f1dd\";\n@fa-var-paste: \"\\f0ea\";\n@fa-var-pause: \"\\f04c\";\n@fa-var-paw: \"\\f1b0\";\n@fa-var-paypal: \"\\f1ed\";\n@fa-var-pencil: \"\\f040\";\n@fa-var-pencil-square: \"\\f14b\";\n@fa-var-pencil-square-o: \"\\f044\";\n@fa-var-phone: \"\\f095\";\n@fa-var-phone-square: \"\\f098\";\n@fa-var-photo: \"\\f03e\";\n@fa-var-picture-o: \"\\f03e\";\n@fa-var-pie-chart: \"\\f200\";\n@fa-var-pied-piper: \"\\f1a7\";\n@fa-var-pied-piper-alt: \"\\f1a8\";\n@fa-var-pinterest: \"\\f0d2\";\n@fa-var-pinterest-square: \"\\f0d3\";\n@fa-var-plane: \"\\f072\";\n@fa-var-play: \"\\f04b\";\n@fa-var-play-circle: \"\\f144\";\n@fa-var-play-circle-o: \"\\f01d\";\n@fa-var-plug: \"\\f1e6\";\n@fa-var-plus: \"\\f067\";\n@fa-var-plus-circle: \"\\f055\";\n@fa-var-plus-square: \"\\f0fe\";\n@fa-var-plus-square-o: \"\\f196\";\n@fa-var-power-off: \"\\f011\";\n@fa-var-print: \"\\f02f\";\n@fa-var-puzzle-piece: \"\\f12e\";\n@fa-var-qq: \"\\f1d6\";\n@fa-var-qrcode: \"\\f029\";\n@fa-var-question: \"\\f128\";\n@fa-var-question-circle: \"\\f059\";\n@fa-var-quote-left: \"\\f10d\";\n@fa-var-quote-right: \"\\f10e\";\n@fa-var-ra: \"\\f1d0\";\n@fa-var-random: \"\\f074\";\n@fa-var-rebel: \"\\f1d0\";\n@fa-var-recycle: \"\\f1b8\";\n@fa-var-reddit: \"\\f1a1\";\n@fa-var-reddit-square: \"\\f1a2\";\n@fa-var-refresh: \"\\f021\";\n@fa-var-remove: \"\\f00d\";\n@fa-var-renren: \"\\f18b\";\n@fa-var-reorder: \"\\f0c9\";\n@fa-var-repeat: \"\\f01e\";\n@fa-var-reply: \"\\f112\";\n@fa-var-reply-all: \"\\f122\";\n@fa-var-retweet: \"\\f079\";\n@fa-var-rmb: \"\\f157\";\n@fa-var-road: \"\\f018\";\n@fa-var-rocket: \"\\f135\";\n@fa-var-rotate-left: \"\\f0e2\";\n@fa-var-rotate-right: \"\\f01e\";\n@fa-var-rouble: \"\\f158\";\n@fa-var-rss: \"\\f09e\";\n@fa-var-rss-square: \"\\f143\";\n@fa-var-rub: \"\\f158\";\n@fa-var-ruble: \"\\f158\";\n@fa-var-rupee: \"\\f156\";\n@fa-var-save: \"\\f0c7\";\n@fa-var-scissors: \"\\f0c4\";\n@fa-var-search: \"\\f002\";\n@fa-var-search-minus: \"\\f010\";\n@fa-var-search-plus: \"\\f00e\";\n@fa-var-send: \"\\f1d8\";\n@fa-var-send-o: \"\\f1d9\";\n@fa-var-share: \"\\f064\";\n@fa-var-share-alt: \"\\f1e0\";\n@fa-var-share-alt-square: \"\\f1e1\";\n@fa-var-share-square: \"\\f14d\";\n@fa-var-share-square-o: \"\\f045\";\n@fa-var-shekel: \"\\f20b\";\n@fa-var-sheqel: \"\\f20b\";\n@fa-var-shield: \"\\f132\";\n@fa-var-shopping-cart: \"\\f07a\";\n@fa-var-sign-in: \"\\f090\";\n@fa-var-sign-out: \"\\f08b\";\n@fa-var-signal: \"\\f012\";\n@fa-var-sitemap: \"\\f0e8\";\n@fa-var-skype: \"\\f17e\";\n@fa-var-slack: \"\\f198\";\n@fa-var-sliders: \"\\f1de\";\n@fa-var-slideshare: \"\\f1e7\";\n@fa-var-smile-o: \"\\f118\";\n@fa-var-soccer-ball-o: \"\\f1e3\";\n@fa-var-sort: \"\\f0dc\";\n@fa-var-sort-alpha-asc: \"\\f15d\";\n@fa-var-sort-alpha-desc: \"\\f15e\";\n@fa-var-sort-amount-asc: \"\\f160\";\n@fa-var-sort-amount-desc: \"\\f161\";\n@fa-var-sort-asc: \"\\f0de\";\n@fa-var-sort-desc: \"\\f0dd\";\n@fa-var-sort-down: \"\\f0dd\";\n@fa-var-sort-numeric-asc: \"\\f162\";\n@fa-var-sort-numeric-desc: \"\\f163\";\n@fa-var-sort-up: \"\\f0de\";\n@fa-var-soundcloud: \"\\f1be\";\n@fa-var-space-shuttle: \"\\f197\";\n@fa-var-spinner: \"\\f110\";\n@fa-var-spoon: \"\\f1b1\";\n@fa-var-spotify: \"\\f1bc\";\n@fa-var-square: \"\\f0c8\";\n@fa-var-square-o: \"\\f096\";\n@fa-var-stack-exchange: \"\\f18d\";\n@fa-var-stack-overflow: \"\\f16c\";\n@fa-var-star: \"\\f005\";\n@fa-var-star-half: \"\\f089\";\n@fa-var-star-half-empty: \"\\f123\";\n@fa-var-star-half-full: \"\\f123\";\n@fa-var-star-half-o: \"\\f123\";\n@fa-var-star-o: \"\\f006\";\n@fa-var-steam: \"\\f1b6\";\n@fa-var-steam-square: \"\\f1b7\";\n@fa-var-step-backward: \"\\f048\";\n@fa-var-step-forward: \"\\f051\";\n@fa-var-stethoscope: \"\\f0f1\";\n@fa-var-stop: \"\\f04d\";\n@fa-var-strikethrough: \"\\f0cc\";\n@fa-var-stumbleupon: \"\\f1a4\";\n@fa-var-stumbleupon-circle: \"\\f1a3\";\n@fa-var-subscript: \"\\f12c\";\n@fa-var-suitcase: \"\\f0f2\";\n@fa-var-sun-o: \"\\f185\";\n@fa-var-superscript: \"\\f12b\";\n@fa-var-support: \"\\f1cd\";\n@fa-var-table: \"\\f0ce\";\n@fa-var-tablet: \"\\f10a\";\n@fa-var-tachometer: \"\\f0e4\";\n@fa-var-tag: \"\\f02b\";\n@fa-var-tags: \"\\f02c\";\n@fa-var-tasks: \"\\f0ae\";\n@fa-var-taxi: \"\\f1ba\";\n@fa-var-tencent-weibo: \"\\f1d5\";\n@fa-var-terminal: \"\\f120\";\n@fa-var-text-height: \"\\f034\";\n@fa-var-text-width: \"\\f035\";\n@fa-var-th: \"\\f00a\";\n@fa-var-th-large: \"\\f009\";\n@fa-var-th-list: \"\\f00b\";\n@fa-var-thumb-tack: \"\\f08d\";\n@fa-var-thumbs-down: \"\\f165\";\n@fa-var-thumbs-o-down: \"\\f088\";\n@fa-var-thumbs-o-up: \"\\f087\";\n@fa-var-thumbs-up: \"\\f164\";\n@fa-var-ticket: \"\\f145\";\n@fa-var-times: \"\\f00d\";\n@fa-var-times-circle: \"\\f057\";\n@fa-var-times-circle-o: \"\\f05c\";\n@fa-var-tint: \"\\f043\";\n@fa-var-toggle-down: \"\\f150\";\n@fa-var-toggle-left: \"\\f191\";\n@fa-var-toggle-off: \"\\f204\";\n@fa-var-toggle-on: \"\\f205\";\n@fa-var-toggle-right: \"\\f152\";\n@fa-var-toggle-up: \"\\f151\";\n@fa-var-trash: \"\\f1f8\";\n@fa-var-trash-o: \"\\f014\";\n@fa-var-tree: \"\\f1bb\";\n@fa-var-trello: \"\\f181\";\n@fa-var-trophy: \"\\f091\";\n@fa-var-truck: \"\\f0d1\";\n@fa-var-try: \"\\f195\";\n@fa-var-tty: \"\\f1e4\";\n@fa-var-tumblr: \"\\f173\";\n@fa-var-tumblr-square: \"\\f174\";\n@fa-var-turkish-lira: \"\\f195\";\n@fa-var-twitch: \"\\f1e8\";\n@fa-var-twitter: \"\\f099\";\n@fa-var-twitter-square: \"\\f081\";\n@fa-var-umbrella: \"\\f0e9\";\n@fa-var-underline: \"\\f0cd\";\n@fa-var-undo: \"\\f0e2\";\n@fa-var-university: \"\\f19c\";\n@fa-var-unlink: \"\\f127\";\n@fa-var-unlock: \"\\f09c\";\n@fa-var-unlock-alt: \"\\f13e\";\n@fa-var-unsorted: \"\\f0dc\";\n@fa-var-upload: \"\\f093\";\n@fa-var-usd: \"\\f155\";\n@fa-var-user: \"\\f007\";\n@fa-var-user-md: \"\\f0f0\";\n@fa-var-users: \"\\f0c0\";\n@fa-var-video-camera: \"\\f03d\";\n@fa-var-vimeo-square: \"\\f194\";\n@fa-var-vine: \"\\f1ca\";\n@fa-var-vk: \"\\f189\";\n@fa-var-volume-down: \"\\f027\";\n@fa-var-volume-off: \"\\f026\";\n@fa-var-volume-up: \"\\f028\";\n@fa-var-warning: \"\\f071\";\n@fa-var-wechat: \"\\f1d7\";\n@fa-var-weibo: \"\\f18a\";\n@fa-var-weixin: \"\\f1d7\";\n@fa-var-wheelchair: \"\\f193\";\n@fa-var-wifi: \"\\f1eb\";\n@fa-var-windows: \"\\f17a\";\n@fa-var-won: \"\\f159\";\n@fa-var-wordpress: \"\\f19a\";\n@fa-var-wrench: \"\\f0ad\";\n@fa-var-xing: \"\\f168\";\n@fa-var-xing-square: \"\\f169\";\n@fa-var-yahoo: \"\\f19e\";\n@fa-var-yelp: \"\\f1e9\";\n@fa-var-yen: \"\\f157\";\n@fa-var-youtube: \"\\f167\";\n@fa-var-youtube-play: \"\\f16a\";\n@fa-var-youtube-square: \"\\f166\";\n\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/scss/_bordered-pulled.scss",
    "content": "// Bordered & Pulled\n// -------------------------\n\n.#{$fa-css-prefix}-border {\n  padding: .2em .25em .15em;\n  border: solid .08em $fa-border-color;\n  border-radius: .1em;\n}\n\n.pull-right { float: right; }\n.pull-left { float: left; }\n\n.#{$fa-css-prefix} {\n  &.pull-left { margin-right: .3em; }\n  &.pull-right { margin-left: .3em; }\n}\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/scss/_core.scss",
    "content": "// Base Class Definition\n// -------------------------\n\n.#{$fa-css-prefix} {\n  display: inline-block;\n  font: normal normal normal 14px/1 FontAwesome; // shortening font declaration\n  font-size: inherit; // can't have font-size inherit on line above, so need to override\n  text-rendering: auto; // optimizelegibility throws things off #1094\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/scss/_fixed-width.scss",
    "content": "// Fixed Width Icons\n// -------------------------\n.#{$fa-css-prefix}-fw {\n  width: (18em / 14);\n  text-align: center;\n}\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/scss/_icons.scss",
    "content": "/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen\n   readers do not read off random characters that represent icons */\n\n.#{$fa-css-prefix}-glass:before { content: $fa-var-glass; }\n.#{$fa-css-prefix}-music:before { content: $fa-var-music; }\n.#{$fa-css-prefix}-search:before { content: $fa-var-search; }\n.#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; }\n.#{$fa-css-prefix}-heart:before { content: $fa-var-heart; }\n.#{$fa-css-prefix}-star:before { content: $fa-var-star; }\n.#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; }\n.#{$fa-css-prefix}-user:before { content: $fa-var-user; }\n.#{$fa-css-prefix}-film:before { content: $fa-var-film; }\n.#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; }\n.#{$fa-css-prefix}-th:before { content: $fa-var-th; }\n.#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; }\n.#{$fa-css-prefix}-check:before { content: $fa-var-check; }\n.#{$fa-css-prefix}-remove:before,\n.#{$fa-css-prefix}-close:before,\n.#{$fa-css-prefix}-times:before { content: $fa-var-times; }\n.#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; }\n.#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; }\n.#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; }\n.#{$fa-css-prefix}-signal:before { content: $fa-var-signal; }\n.#{$fa-css-prefix}-gear:before,\n.#{$fa-css-prefix}-cog:before { content: $fa-var-cog; }\n.#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; }\n.#{$fa-css-prefix}-home:before { content: $fa-var-home; }\n.#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; }\n.#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; }\n.#{$fa-css-prefix}-road:before { content: $fa-var-road; }\n.#{$fa-css-prefix}-download:before { content: $fa-var-download; }\n.#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; }\n.#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; }\n.#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; }\n.#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; }\n.#{$fa-css-prefix}-rotate-right:before,\n.#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; }\n.#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; }\n.#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; }\n.#{$fa-css-prefix}-lock:before { content: $fa-var-lock; }\n.#{$fa-css-prefix}-flag:before { content: $fa-var-flag; }\n.#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; }\n.#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; }\n.#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; }\n.#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; }\n.#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; }\n.#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; }\n.#{$fa-css-prefix}-tag:before { content: $fa-var-tag; }\n.#{$fa-css-prefix}-tags:before { content: $fa-var-tags; }\n.#{$fa-css-prefix}-book:before { content: $fa-var-book; }\n.#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; }\n.#{$fa-css-prefix}-print:before { content: $fa-var-print; }\n.#{$fa-css-prefix}-camera:before { content: $fa-var-camera; }\n.#{$fa-css-prefix}-font:before { content: $fa-var-font; }\n.#{$fa-css-prefix}-bold:before { content: $fa-var-bold; }\n.#{$fa-css-prefix}-italic:before { content: $fa-var-italic; }\n.#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; }\n.#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; }\n.#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; }\n.#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; }\n.#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; }\n.#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; }\n.#{$fa-css-prefix}-list:before { content: $fa-var-list; }\n.#{$fa-css-prefix}-dedent:before,\n.#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; }\n.#{$fa-css-prefix}-indent:before { content: $fa-var-indent; }\n.#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; }\n.#{$fa-css-prefix}-photo:before,\n.#{$fa-css-prefix}-image:before,\n.#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; }\n.#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; }\n.#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; }\n.#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; }\n.#{$fa-css-prefix}-tint:before { content: $fa-var-tint; }\n.#{$fa-css-prefix}-edit:before,\n.#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; }\n.#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; }\n.#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; }\n.#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; }\n.#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; }\n.#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; }\n.#{$fa-css-prefix}-backward:before { content: $fa-var-backward; }\n.#{$fa-css-prefix}-play:before { content: $fa-var-play; }\n.#{$fa-css-prefix}-pause:before { content: $fa-var-pause; }\n.#{$fa-css-prefix}-stop:before { content: $fa-var-stop; }\n.#{$fa-css-prefix}-forward:before { content: $fa-var-forward; }\n.#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; }\n.#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; }\n.#{$fa-css-prefix}-eject:before { content: $fa-var-eject; }\n.#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; }\n.#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; }\n.#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; }\n.#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; }\n.#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; }\n.#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; }\n.#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; }\n.#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; }\n.#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; }\n.#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; }\n.#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; }\n.#{$fa-css-prefix}-ban:before { content: $fa-var-ban; }\n.#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; }\n.#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; }\n.#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; }\n.#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; }\n.#{$fa-css-prefix}-mail-forward:before,\n.#{$fa-css-prefix}-share:before { content: $fa-var-share; }\n.#{$fa-css-prefix}-expand:before { content: $fa-var-expand; }\n.#{$fa-css-prefix}-compress:before { content: $fa-var-compress; }\n.#{$fa-css-prefix}-plus:before { content: $fa-var-plus; }\n.#{$fa-css-prefix}-minus:before { content: $fa-var-minus; }\n.#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; }\n.#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; }\n.#{$fa-css-prefix}-gift:before { content: $fa-var-gift; }\n.#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; }\n.#{$fa-css-prefix}-fire:before { content: $fa-var-fire; }\n.#{$fa-css-prefix}-eye:before { content: $fa-var-eye; }\n.#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; }\n.#{$fa-css-prefix}-warning:before,\n.#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; }\n.#{$fa-css-prefix}-plane:before { content: $fa-var-plane; }\n.#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; }\n.#{$fa-css-prefix}-random:before { content: $fa-var-random; }\n.#{$fa-css-prefix}-comment:before { content: $fa-var-comment; }\n.#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; }\n.#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; }\n.#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; }\n.#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; }\n.#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; }\n.#{$fa-css-prefix}-folder:before { content: $fa-var-folder; }\n.#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; }\n.#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; }\n.#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; }\n.#{$fa-css-prefix}-bar-chart-o:before,\n.#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; }\n.#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; }\n.#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; }\n.#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; }\n.#{$fa-css-prefix}-key:before { content: $fa-var-key; }\n.#{$fa-css-prefix}-gears:before,\n.#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; }\n.#{$fa-css-prefix}-comments:before { content: $fa-var-comments; }\n.#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; }\n.#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; }\n.#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; }\n.#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; }\n.#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; }\n.#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; }\n.#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; }\n.#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; }\n.#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; }\n.#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; }\n.#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; }\n.#{$fa-css-prefix}-upload:before { content: $fa-var-upload; }\n.#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; }\n.#{$fa-css-prefix}-phone:before { content: $fa-var-phone; }\n.#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; }\n.#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; }\n.#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; }\n.#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; }\n.#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; }\n.#{$fa-css-prefix}-github:before { content: $fa-var-github; }\n.#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; }\n.#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; }\n.#{$fa-css-prefix}-rss:before { content: $fa-var-rss; }\n.#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; }\n.#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; }\n.#{$fa-css-prefix}-bell:before { content: $fa-var-bell; }\n.#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; }\n.#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; }\n.#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; }\n.#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; }\n.#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; }\n.#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; }\n.#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; }\n.#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; }\n.#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; }\n.#{$fa-css-prefix}-globe:before { content: $fa-var-globe; }\n.#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; }\n.#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; }\n.#{$fa-css-prefix}-filter:before { content: $fa-var-filter; }\n.#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; }\n.#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; }\n.#{$fa-css-prefix}-group:before,\n.#{$fa-css-prefix}-users:before { content: $fa-var-users; }\n.#{$fa-css-prefix}-chain:before,\n.#{$fa-css-prefix}-link:before { content: $fa-var-link; }\n.#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; }\n.#{$fa-css-prefix}-flask:before { content: $fa-var-flask; }\n.#{$fa-css-prefix}-cut:before,\n.#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; }\n.#{$fa-css-prefix}-copy:before,\n.#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; }\n.#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; }\n.#{$fa-css-prefix}-save:before,\n.#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; }\n.#{$fa-css-prefix}-square:before { content: $fa-var-square; }\n.#{$fa-css-prefix}-navicon:before,\n.#{$fa-css-prefix}-reorder:before,\n.#{$fa-css-prefix}-bars:before { content: $fa-var-bars; }\n.#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; }\n.#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; }\n.#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; }\n.#{$fa-css-prefix}-underline:before { content: $fa-var-underline; }\n.#{$fa-css-prefix}-table:before { content: $fa-var-table; }\n.#{$fa-css-prefix}-magic:before { content: $fa-var-magic; }\n.#{$fa-css-prefix}-truck:before { content: $fa-var-truck; }\n.#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; }\n.#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; }\n.#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; }\n.#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; }\n.#{$fa-css-prefix}-money:before { content: $fa-var-money; }\n.#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; }\n.#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; }\n.#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; }\n.#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; }\n.#{$fa-css-prefix}-columns:before { content: $fa-var-columns; }\n.#{$fa-css-prefix}-unsorted:before,\n.#{$fa-css-prefix}-sort:before { content: $fa-var-sort; }\n.#{$fa-css-prefix}-sort-down:before,\n.#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; }\n.#{$fa-css-prefix}-sort-up:before,\n.#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; }\n.#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; }\n.#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; }\n.#{$fa-css-prefix}-rotate-left:before,\n.#{$fa-css-prefix}-undo:before { content: $fa-var-undo; }\n.#{$fa-css-prefix}-legal:before,\n.#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; }\n.#{$fa-css-prefix}-dashboard:before,\n.#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; }\n.#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; }\n.#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; }\n.#{$fa-css-prefix}-flash:before,\n.#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; }\n.#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; }\n.#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; }\n.#{$fa-css-prefix}-paste:before,\n.#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; }\n.#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; }\n.#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; }\n.#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; }\n.#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; }\n.#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; }\n.#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; }\n.#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; }\n.#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; }\n.#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; }\n.#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; }\n.#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; }\n.#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; }\n.#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; }\n.#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; }\n.#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; }\n.#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; }\n.#{$fa-css-prefix}-beer:before { content: $fa-var-beer; }\n.#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; }\n.#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; }\n.#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; }\n.#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; }\n.#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; }\n.#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; }\n.#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; }\n.#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; }\n.#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; }\n.#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; }\n.#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; }\n.#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; }\n.#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; }\n.#{$fa-css-prefix}-mobile-phone:before,\n.#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; }\n.#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; }\n.#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; }\n.#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; }\n.#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; }\n.#{$fa-css-prefix}-circle:before { content: $fa-var-circle; }\n.#{$fa-css-prefix}-mail-reply:before,\n.#{$fa-css-prefix}-reply:before { content: $fa-var-reply; }\n.#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; }\n.#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; }\n.#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; }\n.#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; }\n.#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; }\n.#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; }\n.#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; }\n.#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; }\n.#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; }\n.#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; }\n.#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; }\n.#{$fa-css-prefix}-code:before { content: $fa-var-code; }\n.#{$fa-css-prefix}-mail-reply-all:before,\n.#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; }\n.#{$fa-css-prefix}-star-half-empty:before,\n.#{$fa-css-prefix}-star-half-full:before,\n.#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; }\n.#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; }\n.#{$fa-css-prefix}-crop:before { content: $fa-var-crop; }\n.#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; }\n.#{$fa-css-prefix}-unlink:before,\n.#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; }\n.#{$fa-css-prefix}-question:before { content: $fa-var-question; }\n.#{$fa-css-prefix}-info:before { content: $fa-var-info; }\n.#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; }\n.#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; }\n.#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; }\n.#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; }\n.#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; }\n.#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; }\n.#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; }\n.#{$fa-css-prefix}-shield:before { content: $fa-var-shield; }\n.#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; }\n.#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; }\n.#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; }\n.#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; }\n.#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; }\n.#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; }\n.#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; }\n.#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; }\n.#{$fa-css-prefix}-html5:before { content: $fa-var-html5; }\n.#{$fa-css-prefix}-css3:before { content: $fa-var-css3; }\n.#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; }\n.#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; }\n.#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; }\n.#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; }\n.#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; }\n.#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; }\n.#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; }\n.#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; }\n.#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; }\n.#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; }\n.#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; }\n.#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; }\n.#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; }\n.#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; }\n.#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; }\n.#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; }\n.#{$fa-css-prefix}-compass:before { content: $fa-var-compass; }\n.#{$fa-css-prefix}-toggle-down:before,\n.#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; }\n.#{$fa-css-prefix}-toggle-up:before,\n.#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; }\n.#{$fa-css-prefix}-toggle-right:before,\n.#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; }\n.#{$fa-css-prefix}-euro:before,\n.#{$fa-css-prefix}-eur:before { content: $fa-var-eur; }\n.#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; }\n.#{$fa-css-prefix}-dollar:before,\n.#{$fa-css-prefix}-usd:before { content: $fa-var-usd; }\n.#{$fa-css-prefix}-rupee:before,\n.#{$fa-css-prefix}-inr:before { content: $fa-var-inr; }\n.#{$fa-css-prefix}-cny:before,\n.#{$fa-css-prefix}-rmb:before,\n.#{$fa-css-prefix}-yen:before,\n.#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; }\n.#{$fa-css-prefix}-ruble:before,\n.#{$fa-css-prefix}-rouble:before,\n.#{$fa-css-prefix}-rub:before { content: $fa-var-rub; }\n.#{$fa-css-prefix}-won:before,\n.#{$fa-css-prefix}-krw:before { content: $fa-var-krw; }\n.#{$fa-css-prefix}-bitcoin:before,\n.#{$fa-css-prefix}-btc:before { content: $fa-var-btc; }\n.#{$fa-css-prefix}-file:before { content: $fa-var-file; }\n.#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; }\n.#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; }\n.#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; }\n.#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; }\n.#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; }\n.#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; }\n.#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; }\n.#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; }\n.#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; }\n.#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; }\n.#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; }\n.#{$fa-css-prefix}-xing:before { content: $fa-var-xing; }\n.#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; }\n.#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; }\n.#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; }\n.#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; }\n.#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; }\n.#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; }\n.#{$fa-css-prefix}-adn:before { content: $fa-var-adn; }\n.#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; }\n.#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; }\n.#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; }\n.#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; }\n.#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; }\n.#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; }\n.#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; }\n.#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; }\n.#{$fa-css-prefix}-apple:before { content: $fa-var-apple; }\n.#{$fa-css-prefix}-windows:before { content: $fa-var-windows; }\n.#{$fa-css-prefix}-android:before { content: $fa-var-android; }\n.#{$fa-css-prefix}-linux:before { content: $fa-var-linux; }\n.#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; }\n.#{$fa-css-prefix}-skype:before { content: $fa-var-skype; }\n.#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; }\n.#{$fa-css-prefix}-trello:before { content: $fa-var-trello; }\n.#{$fa-css-prefix}-female:before { content: $fa-var-female; }\n.#{$fa-css-prefix}-male:before { content: $fa-var-male; }\n.#{$fa-css-prefix}-gittip:before { content: $fa-var-gittip; }\n.#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; }\n.#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; }\n.#{$fa-css-prefix}-archive:before { content: $fa-var-archive; }\n.#{$fa-css-prefix}-bug:before { content: $fa-var-bug; }\n.#{$fa-css-prefix}-vk:before { content: $fa-var-vk; }\n.#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; }\n.#{$fa-css-prefix}-renren:before { content: $fa-var-renren; }\n.#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; }\n.#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; }\n.#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; }\n.#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; }\n.#{$fa-css-prefix}-toggle-left:before,\n.#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; }\n.#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; }\n.#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; }\n.#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; }\n.#{$fa-css-prefix}-turkish-lira:before,\n.#{$fa-css-prefix}-try:before { content: $fa-var-try; }\n.#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; }\n.#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; }\n.#{$fa-css-prefix}-slack:before { content: $fa-var-slack; }\n.#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; }\n.#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; }\n.#{$fa-css-prefix}-openid:before { content: $fa-var-openid; }\n.#{$fa-css-prefix}-institution:before,\n.#{$fa-css-prefix}-bank:before,\n.#{$fa-css-prefix}-university:before { content: $fa-var-university; }\n.#{$fa-css-prefix}-mortar-board:before,\n.#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; }\n.#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; }\n.#{$fa-css-prefix}-google:before { content: $fa-var-google; }\n.#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; }\n.#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; }\n.#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; }\n.#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; }\n.#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; }\n.#{$fa-css-prefix}-digg:before { content: $fa-var-digg; }\n.#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; }\n.#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; }\n.#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; }\n.#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; }\n.#{$fa-css-prefix}-language:before { content: $fa-var-language; }\n.#{$fa-css-prefix}-fax:before { content: $fa-var-fax; }\n.#{$fa-css-prefix}-building:before { content: $fa-var-building; }\n.#{$fa-css-prefix}-child:before { content: $fa-var-child; }\n.#{$fa-css-prefix}-paw:before { content: $fa-var-paw; }\n.#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; }\n.#{$fa-css-prefix}-cube:before { content: $fa-var-cube; }\n.#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; }\n.#{$fa-css-prefix}-behance:before { content: $fa-var-behance; }\n.#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; }\n.#{$fa-css-prefix}-steam:before { content: $fa-var-steam; }\n.#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; }\n.#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; }\n.#{$fa-css-prefix}-automobile:before,\n.#{$fa-css-prefix}-car:before { content: $fa-var-car; }\n.#{$fa-css-prefix}-cab:before,\n.#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; }\n.#{$fa-css-prefix}-tree:before { content: $fa-var-tree; }\n.#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; }\n.#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; }\n.#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; }\n.#{$fa-css-prefix}-database:before { content: $fa-var-database; }\n.#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; }\n.#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; }\n.#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; }\n.#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; }\n.#{$fa-css-prefix}-file-photo-o:before,\n.#{$fa-css-prefix}-file-picture-o:before,\n.#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; }\n.#{$fa-css-prefix}-file-zip-o:before,\n.#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; }\n.#{$fa-css-prefix}-file-sound-o:before,\n.#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; }\n.#{$fa-css-prefix}-file-movie-o:before,\n.#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; }\n.#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; }\n.#{$fa-css-prefix}-vine:before { content: $fa-var-vine; }\n.#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; }\n.#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; }\n.#{$fa-css-prefix}-life-bouy:before,\n.#{$fa-css-prefix}-life-buoy:before,\n.#{$fa-css-prefix}-life-saver:before,\n.#{$fa-css-prefix}-support:before,\n.#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; }\n.#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; }\n.#{$fa-css-prefix}-ra:before,\n.#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; }\n.#{$fa-css-prefix}-ge:before,\n.#{$fa-css-prefix}-empire:before { content: $fa-var-empire; }\n.#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; }\n.#{$fa-css-prefix}-git:before { content: $fa-var-git; }\n.#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; }\n.#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; }\n.#{$fa-css-prefix}-qq:before { content: $fa-var-qq; }\n.#{$fa-css-prefix}-wechat:before,\n.#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; }\n.#{$fa-css-prefix}-send:before,\n.#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; }\n.#{$fa-css-prefix}-send-o:before,\n.#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; }\n.#{$fa-css-prefix}-history:before { content: $fa-var-history; }\n.#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; }\n.#{$fa-css-prefix}-header:before { content: $fa-var-header; }\n.#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; }\n.#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; }\n.#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; }\n.#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; }\n.#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; }\n.#{$fa-css-prefix}-soccer-ball-o:before,\n.#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; }\n.#{$fa-css-prefix}-tty:before { content: $fa-var-tty; }\n.#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; }\n.#{$fa-css-prefix}-plug:before { content: $fa-var-plug; }\n.#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; }\n.#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; }\n.#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; }\n.#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; }\n.#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; }\n.#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; }\n.#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; }\n.#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; }\n.#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; }\n.#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; }\n.#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; }\n.#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; }\n.#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; }\n.#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; }\n.#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; }\n.#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; }\n.#{$fa-css-prefix}-trash:before { content: $fa-var-trash; }\n.#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; }\n.#{$fa-css-prefix}-at:before { content: $fa-var-at; }\n.#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; }\n.#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; }\n.#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; }\n.#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; }\n.#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; }\n.#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; }\n.#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; }\n.#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; }\n.#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; }\n.#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; }\n.#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; }\n.#{$fa-css-prefix}-bus:before { content: $fa-var-bus; }\n.#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; }\n.#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; }\n.#{$fa-css-prefix}-cc:before { content: $fa-var-cc; }\n.#{$fa-css-prefix}-shekel:before,\n.#{$fa-css-prefix}-sheqel:before,\n.#{$fa-css-prefix}-ils:before { content: $fa-var-ils; }\n.#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; }\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/scss/_larger.scss",
    "content": "// Icon Sizes\n// -------------------------\n\n/* makes the font 33% larger relative to the icon container */\n.#{$fa-css-prefix}-lg {\n  font-size: (4em / 3);\n  line-height: (3em / 4);\n  vertical-align: -15%;\n}\n.#{$fa-css-prefix}-2x { font-size: 2em; }\n.#{$fa-css-prefix}-3x { font-size: 3em; }\n.#{$fa-css-prefix}-4x { font-size: 4em; }\n.#{$fa-css-prefix}-5x { font-size: 5em; }\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/scss/_list.scss",
    "content": "// List Icons\n// -------------------------\n\n.#{$fa-css-prefix}-ul {\n  padding-left: 0;\n  margin-left: $fa-li-width;\n  list-style-type: none;\n  > li { position: relative; }\n}\n.#{$fa-css-prefix}-li {\n  position: absolute;\n  left: -$fa-li-width;\n  width: $fa-li-width;\n  top: (2em / 14);\n  text-align: center;\n  &.#{$fa-css-prefix}-lg {\n    left: -$fa-li-width + (4em / 14);\n  }\n}\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/scss/_mixins.scss",
    "content": "// Mixins\n// --------------------------\n\n@mixin fa-icon() {\n  display: inline-block;\n  font: normal normal normal 14px/1 FontAwesome; // shortening font declaration\n  font-size: inherit; // can't have font-size inherit on line above, so need to override\n  text-rendering: auto; // optimizelegibility throws things off #1094\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n@mixin fa-icon-rotate($degrees, $rotation) {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});\n  -webkit-transform: rotate($degrees);\n      -ms-transform: rotate($degrees);\n          transform: rotate($degrees);\n}\n\n@mixin fa-icon-flip($horiz, $vert, $rotation) {\n  filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});\n  -webkit-transform: scale($horiz, $vert);\n      -ms-transform: scale($horiz, $vert);\n          transform: scale($horiz, $vert);\n}\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/scss/_path.scss",
    "content": "/* FONT PATH\n * -------------------------- */\n\n@font-face {\n  font-family: 'FontAwesome';\n  src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');\n  src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),\n    url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),\n    url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),\n    url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');\n  //src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts\n  font-weight: normal;\n  font-style: normal;\n}\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/scss/_rotated-flipped.scss",
    "content": "// Rotated & Flipped Icons\n// -------------------------\n\n.#{$fa-css-prefix}-rotate-90  { @include fa-icon-rotate(90deg, 1);  }\n.#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }\n.#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }\n\n.#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }\n.#{$fa-css-prefix}-flip-vertical   { @include fa-icon-flip(1, -1, 2); }\n\n// Hook for IE8-9\n// -------------------------\n\n:root .#{$fa-css-prefix}-rotate-90,\n:root .#{$fa-css-prefix}-rotate-180,\n:root .#{$fa-css-prefix}-rotate-270,\n:root .#{$fa-css-prefix}-flip-horizontal,\n:root .#{$fa-css-prefix}-flip-vertical {\n  filter: none;\n}\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/scss/_spinning.scss",
    "content": "// Spinning Icons\n// --------------------------\n\n.#{$fa-css-prefix}-spin {\n  -webkit-animation: fa-spin 2s infinite linear;\n          animation: fa-spin 2s infinite linear;\n}\n\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(359deg);\n            transform: rotate(359deg);\n  }\n}\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/scss/_stacked.scss",
    "content": "// Stacked Icons\n// -------------------------\n\n.#{$fa-css-prefix}-stack {\n  position: relative;\n  display: inline-block;\n  width: 2em;\n  height: 2em;\n  line-height: 2em;\n  vertical-align: middle;\n}\n.#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {\n  position: absolute;\n  left: 0;\n  width: 100%;\n  text-align: center;\n}\n.#{$fa-css-prefix}-stack-1x { line-height: inherit; }\n.#{$fa-css-prefix}-stack-2x { font-size: 2em; }\n.#{$fa-css-prefix}-inverse { color: $fa-inverse; }\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/scss/_variables.scss",
    "content": "// Variables\n// --------------------------\n\n$fa-font-path:        \"../fonts\" !default;\n//$fa-font-path:        \"//netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts\" !default; // for referencing Bootstrap CDN font files directly\n$fa-css-prefix:       fa !default;\n$fa-version:          \"4.2.0\" !default;\n$fa-border-color:     #eee !default;\n$fa-inverse:          #fff !default;\n$fa-li-width:         (30em / 14) !default;\n\n$fa-var-adjust: \"\\f042\";\n$fa-var-adn: \"\\f170\";\n$fa-var-align-center: \"\\f037\";\n$fa-var-align-justify: \"\\f039\";\n$fa-var-align-left: \"\\f036\";\n$fa-var-align-right: \"\\f038\";\n$fa-var-ambulance: \"\\f0f9\";\n$fa-var-anchor: \"\\f13d\";\n$fa-var-android: \"\\f17b\";\n$fa-var-angellist: \"\\f209\";\n$fa-var-angle-double-down: \"\\f103\";\n$fa-var-angle-double-left: \"\\f100\";\n$fa-var-angle-double-right: \"\\f101\";\n$fa-var-angle-double-up: \"\\f102\";\n$fa-var-angle-down: \"\\f107\";\n$fa-var-angle-left: \"\\f104\";\n$fa-var-angle-right: \"\\f105\";\n$fa-var-angle-up: \"\\f106\";\n$fa-var-apple: \"\\f179\";\n$fa-var-archive: \"\\f187\";\n$fa-var-area-chart: \"\\f1fe\";\n$fa-var-arrow-circle-down: \"\\f0ab\";\n$fa-var-arrow-circle-left: \"\\f0a8\";\n$fa-var-arrow-circle-o-down: \"\\f01a\";\n$fa-var-arrow-circle-o-left: \"\\f190\";\n$fa-var-arrow-circle-o-right: \"\\f18e\";\n$fa-var-arrow-circle-o-up: \"\\f01b\";\n$fa-var-arrow-circle-right: \"\\f0a9\";\n$fa-var-arrow-circle-up: \"\\f0aa\";\n$fa-var-arrow-down: \"\\f063\";\n$fa-var-arrow-left: \"\\f060\";\n$fa-var-arrow-right: \"\\f061\";\n$fa-var-arrow-up: \"\\f062\";\n$fa-var-arrows: \"\\f047\";\n$fa-var-arrows-alt: \"\\f0b2\";\n$fa-var-arrows-h: \"\\f07e\";\n$fa-var-arrows-v: \"\\f07d\";\n$fa-var-asterisk: \"\\f069\";\n$fa-var-at: \"\\f1fa\";\n$fa-var-automobile: \"\\f1b9\";\n$fa-var-backward: \"\\f04a\";\n$fa-var-ban: \"\\f05e\";\n$fa-var-bank: \"\\f19c\";\n$fa-var-bar-chart: \"\\f080\";\n$fa-var-bar-chart-o: \"\\f080\";\n$fa-var-barcode: \"\\f02a\";\n$fa-var-bars: \"\\f0c9\";\n$fa-var-beer: \"\\f0fc\";\n$fa-var-behance: \"\\f1b4\";\n$fa-var-behance-square: \"\\f1b5\";\n$fa-var-bell: \"\\f0f3\";\n$fa-var-bell-o: \"\\f0a2\";\n$fa-var-bell-slash: \"\\f1f6\";\n$fa-var-bell-slash-o: \"\\f1f7\";\n$fa-var-bicycle: \"\\f206\";\n$fa-var-binoculars: \"\\f1e5\";\n$fa-var-birthday-cake: \"\\f1fd\";\n$fa-var-bitbucket: \"\\f171\";\n$fa-var-bitbucket-square: \"\\f172\";\n$fa-var-bitcoin: \"\\f15a\";\n$fa-var-bold: \"\\f032\";\n$fa-var-bolt: \"\\f0e7\";\n$fa-var-bomb: \"\\f1e2\";\n$fa-var-book: \"\\f02d\";\n$fa-var-bookmark: \"\\f02e\";\n$fa-var-bookmark-o: \"\\f097\";\n$fa-var-briefcase: \"\\f0b1\";\n$fa-var-btc: \"\\f15a\";\n$fa-var-bug: \"\\f188\";\n$fa-var-building: \"\\f1ad\";\n$fa-var-building-o: \"\\f0f7\";\n$fa-var-bullhorn: \"\\f0a1\";\n$fa-var-bullseye: \"\\f140\";\n$fa-var-bus: \"\\f207\";\n$fa-var-cab: \"\\f1ba\";\n$fa-var-calculator: \"\\f1ec\";\n$fa-var-calendar: \"\\f073\";\n$fa-var-calendar-o: \"\\f133\";\n$fa-var-camera: \"\\f030\";\n$fa-var-camera-retro: \"\\f083\";\n$fa-var-car: \"\\f1b9\";\n$fa-var-caret-down: \"\\f0d7\";\n$fa-var-caret-left: \"\\f0d9\";\n$fa-var-caret-right: \"\\f0da\";\n$fa-var-caret-square-o-down: \"\\f150\";\n$fa-var-caret-square-o-left: \"\\f191\";\n$fa-var-caret-square-o-right: \"\\f152\";\n$fa-var-caret-square-o-up: \"\\f151\";\n$fa-var-caret-up: \"\\f0d8\";\n$fa-var-cc: \"\\f20a\";\n$fa-var-cc-amex: \"\\f1f3\";\n$fa-var-cc-discover: \"\\f1f2\";\n$fa-var-cc-mastercard: \"\\f1f1\";\n$fa-var-cc-paypal: \"\\f1f4\";\n$fa-var-cc-stripe: \"\\f1f5\";\n$fa-var-cc-visa: \"\\f1f0\";\n$fa-var-certificate: \"\\f0a3\";\n$fa-var-chain: \"\\f0c1\";\n$fa-var-chain-broken: \"\\f127\";\n$fa-var-check: \"\\f00c\";\n$fa-var-check-circle: \"\\f058\";\n$fa-var-check-circle-o: \"\\f05d\";\n$fa-var-check-square: \"\\f14a\";\n$fa-var-check-square-o: \"\\f046\";\n$fa-var-chevron-circle-down: \"\\f13a\";\n$fa-var-chevron-circle-left: \"\\f137\";\n$fa-var-chevron-circle-right: \"\\f138\";\n$fa-var-chevron-circle-up: \"\\f139\";\n$fa-var-chevron-down: \"\\f078\";\n$fa-var-chevron-left: \"\\f053\";\n$fa-var-chevron-right: \"\\f054\";\n$fa-var-chevron-up: \"\\f077\";\n$fa-var-child: \"\\f1ae\";\n$fa-var-circle: \"\\f111\";\n$fa-var-circle-o: \"\\f10c\";\n$fa-var-circle-o-notch: \"\\f1ce\";\n$fa-var-circle-thin: \"\\f1db\";\n$fa-var-clipboard: \"\\f0ea\";\n$fa-var-clock-o: \"\\f017\";\n$fa-var-close: \"\\f00d\";\n$fa-var-cloud: \"\\f0c2\";\n$fa-var-cloud-download: \"\\f0ed\";\n$fa-var-cloud-upload: \"\\f0ee\";\n$fa-var-cny: \"\\f157\";\n$fa-var-code: \"\\f121\";\n$fa-var-code-fork: \"\\f126\";\n$fa-var-codepen: \"\\f1cb\";\n$fa-var-coffee: \"\\f0f4\";\n$fa-var-cog: \"\\f013\";\n$fa-var-cogs: \"\\f085\";\n$fa-var-columns: \"\\f0db\";\n$fa-var-comment: \"\\f075\";\n$fa-var-comment-o: \"\\f0e5\";\n$fa-var-comments: \"\\f086\";\n$fa-var-comments-o: \"\\f0e6\";\n$fa-var-compass: \"\\f14e\";\n$fa-var-compress: \"\\f066\";\n$fa-var-copy: \"\\f0c5\";\n$fa-var-copyright: \"\\f1f9\";\n$fa-var-credit-card: \"\\f09d\";\n$fa-var-crop: \"\\f125\";\n$fa-var-crosshairs: \"\\f05b\";\n$fa-var-css3: \"\\f13c\";\n$fa-var-cube: \"\\f1b2\";\n$fa-var-cubes: \"\\f1b3\";\n$fa-var-cut: \"\\f0c4\";\n$fa-var-cutlery: \"\\f0f5\";\n$fa-var-dashboard: \"\\f0e4\";\n$fa-var-database: \"\\f1c0\";\n$fa-var-dedent: \"\\f03b\";\n$fa-var-delicious: \"\\f1a5\";\n$fa-var-desktop: \"\\f108\";\n$fa-var-deviantart: \"\\f1bd\";\n$fa-var-digg: \"\\f1a6\";\n$fa-var-dollar: \"\\f155\";\n$fa-var-dot-circle-o: \"\\f192\";\n$fa-var-download: \"\\f019\";\n$fa-var-dribbble: \"\\f17d\";\n$fa-var-dropbox: \"\\f16b\";\n$fa-var-drupal: \"\\f1a9\";\n$fa-var-edit: \"\\f044\";\n$fa-var-eject: \"\\f052\";\n$fa-var-ellipsis-h: \"\\f141\";\n$fa-var-ellipsis-v: \"\\f142\";\n$fa-var-empire: \"\\f1d1\";\n$fa-var-envelope: \"\\f0e0\";\n$fa-var-envelope-o: \"\\f003\";\n$fa-var-envelope-square: \"\\f199\";\n$fa-var-eraser: \"\\f12d\";\n$fa-var-eur: \"\\f153\";\n$fa-var-euro: \"\\f153\";\n$fa-var-exchange: \"\\f0ec\";\n$fa-var-exclamation: \"\\f12a\";\n$fa-var-exclamation-circle: \"\\f06a\";\n$fa-var-exclamation-triangle: \"\\f071\";\n$fa-var-expand: \"\\f065\";\n$fa-var-external-link: \"\\f08e\";\n$fa-var-external-link-square: \"\\f14c\";\n$fa-var-eye: \"\\f06e\";\n$fa-var-eye-slash: \"\\f070\";\n$fa-var-eyedropper: \"\\f1fb\";\n$fa-var-facebook: \"\\f09a\";\n$fa-var-facebook-square: \"\\f082\";\n$fa-var-fast-backward: \"\\f049\";\n$fa-var-fast-forward: \"\\f050\";\n$fa-var-fax: \"\\f1ac\";\n$fa-var-female: \"\\f182\";\n$fa-var-fighter-jet: \"\\f0fb\";\n$fa-var-file: \"\\f15b\";\n$fa-var-file-archive-o: \"\\f1c6\";\n$fa-var-file-audio-o: \"\\f1c7\";\n$fa-var-file-code-o: \"\\f1c9\";\n$fa-var-file-excel-o: \"\\f1c3\";\n$fa-var-file-image-o: \"\\f1c5\";\n$fa-var-file-movie-o: \"\\f1c8\";\n$fa-var-file-o: \"\\f016\";\n$fa-var-file-pdf-o: \"\\f1c1\";\n$fa-var-file-photo-o: \"\\f1c5\";\n$fa-var-file-picture-o: \"\\f1c5\";\n$fa-var-file-powerpoint-o: \"\\f1c4\";\n$fa-var-file-sound-o: \"\\f1c7\";\n$fa-var-file-text: \"\\f15c\";\n$fa-var-file-text-o: \"\\f0f6\";\n$fa-var-file-video-o: \"\\f1c8\";\n$fa-var-file-word-o: \"\\f1c2\";\n$fa-var-file-zip-o: \"\\f1c6\";\n$fa-var-files-o: \"\\f0c5\";\n$fa-var-film: \"\\f008\";\n$fa-var-filter: \"\\f0b0\";\n$fa-var-fire: \"\\f06d\";\n$fa-var-fire-extinguisher: \"\\f134\";\n$fa-var-flag: \"\\f024\";\n$fa-var-flag-checkered: \"\\f11e\";\n$fa-var-flag-o: \"\\f11d\";\n$fa-var-flash: \"\\f0e7\";\n$fa-var-flask: \"\\f0c3\";\n$fa-var-flickr: \"\\f16e\";\n$fa-var-floppy-o: \"\\f0c7\";\n$fa-var-folder: \"\\f07b\";\n$fa-var-folder-o: \"\\f114\";\n$fa-var-folder-open: \"\\f07c\";\n$fa-var-folder-open-o: \"\\f115\";\n$fa-var-font: \"\\f031\";\n$fa-var-forward: \"\\f04e\";\n$fa-var-foursquare: \"\\f180\";\n$fa-var-frown-o: \"\\f119\";\n$fa-var-futbol-o: \"\\f1e3\";\n$fa-var-gamepad: \"\\f11b\";\n$fa-var-gavel: \"\\f0e3\";\n$fa-var-gbp: \"\\f154\";\n$fa-var-ge: \"\\f1d1\";\n$fa-var-gear: \"\\f013\";\n$fa-var-gears: \"\\f085\";\n$fa-var-gift: \"\\f06b\";\n$fa-var-git: \"\\f1d3\";\n$fa-var-git-square: \"\\f1d2\";\n$fa-var-github: \"\\f09b\";\n$fa-var-github-alt: \"\\f113\";\n$fa-var-github-square: \"\\f092\";\n$fa-var-gittip: \"\\f184\";\n$fa-var-glass: \"\\f000\";\n$fa-var-globe: \"\\f0ac\";\n$fa-var-google: \"\\f1a0\";\n$fa-var-google-plus: \"\\f0d5\";\n$fa-var-google-plus-square: \"\\f0d4\";\n$fa-var-google-wallet: \"\\f1ee\";\n$fa-var-graduation-cap: \"\\f19d\";\n$fa-var-group: \"\\f0c0\";\n$fa-var-h-square: \"\\f0fd\";\n$fa-var-hacker-news: \"\\f1d4\";\n$fa-var-hand-o-down: \"\\f0a7\";\n$fa-var-hand-o-left: \"\\f0a5\";\n$fa-var-hand-o-right: \"\\f0a4\";\n$fa-var-hand-o-up: \"\\f0a6\";\n$fa-var-hdd-o: \"\\f0a0\";\n$fa-var-header: \"\\f1dc\";\n$fa-var-headphones: \"\\f025\";\n$fa-var-heart: \"\\f004\";\n$fa-var-heart-o: \"\\f08a\";\n$fa-var-history: \"\\f1da\";\n$fa-var-home: \"\\f015\";\n$fa-var-hospital-o: \"\\f0f8\";\n$fa-var-html5: \"\\f13b\";\n$fa-var-ils: \"\\f20b\";\n$fa-var-image: \"\\f03e\";\n$fa-var-inbox: \"\\f01c\";\n$fa-var-indent: \"\\f03c\";\n$fa-var-info: \"\\f129\";\n$fa-var-info-circle: \"\\f05a\";\n$fa-var-inr: \"\\f156\";\n$fa-var-instagram: \"\\f16d\";\n$fa-var-institution: \"\\f19c\";\n$fa-var-ioxhost: \"\\f208\";\n$fa-var-italic: \"\\f033\";\n$fa-var-joomla: \"\\f1aa\";\n$fa-var-jpy: \"\\f157\";\n$fa-var-jsfiddle: \"\\f1cc\";\n$fa-var-key: \"\\f084\";\n$fa-var-keyboard-o: \"\\f11c\";\n$fa-var-krw: \"\\f159\";\n$fa-var-language: \"\\f1ab\";\n$fa-var-laptop: \"\\f109\";\n$fa-var-lastfm: \"\\f202\";\n$fa-var-lastfm-square: \"\\f203\";\n$fa-var-leaf: \"\\f06c\";\n$fa-var-legal: \"\\f0e3\";\n$fa-var-lemon-o: \"\\f094\";\n$fa-var-level-down: \"\\f149\";\n$fa-var-level-up: \"\\f148\";\n$fa-var-life-bouy: \"\\f1cd\";\n$fa-var-life-buoy: \"\\f1cd\";\n$fa-var-life-ring: \"\\f1cd\";\n$fa-var-life-saver: \"\\f1cd\";\n$fa-var-lightbulb-o: \"\\f0eb\";\n$fa-var-line-chart: \"\\f201\";\n$fa-var-link: \"\\f0c1\";\n$fa-var-linkedin: \"\\f0e1\";\n$fa-var-linkedin-square: \"\\f08c\";\n$fa-var-linux: \"\\f17c\";\n$fa-var-list: \"\\f03a\";\n$fa-var-list-alt: \"\\f022\";\n$fa-var-list-ol: \"\\f0cb\";\n$fa-var-list-ul: \"\\f0ca\";\n$fa-var-location-arrow: \"\\f124\";\n$fa-var-lock: \"\\f023\";\n$fa-var-long-arrow-down: \"\\f175\";\n$fa-var-long-arrow-left: \"\\f177\";\n$fa-var-long-arrow-right: \"\\f178\";\n$fa-var-long-arrow-up: \"\\f176\";\n$fa-var-magic: \"\\f0d0\";\n$fa-var-magnet: \"\\f076\";\n$fa-var-mail-forward: \"\\f064\";\n$fa-var-mail-reply: \"\\f112\";\n$fa-var-mail-reply-all: \"\\f122\";\n$fa-var-male: \"\\f183\";\n$fa-var-map-marker: \"\\f041\";\n$fa-var-maxcdn: \"\\f136\";\n$fa-var-meanpath: \"\\f20c\";\n$fa-var-medkit: \"\\f0fa\";\n$fa-var-meh-o: \"\\f11a\";\n$fa-var-microphone: \"\\f130\";\n$fa-var-microphone-slash: \"\\f131\";\n$fa-var-minus: \"\\f068\";\n$fa-var-minus-circle: \"\\f056\";\n$fa-var-minus-square: \"\\f146\";\n$fa-var-minus-square-o: \"\\f147\";\n$fa-var-mobile: \"\\f10b\";\n$fa-var-mobile-phone: \"\\f10b\";\n$fa-var-money: \"\\f0d6\";\n$fa-var-moon-o: \"\\f186\";\n$fa-var-mortar-board: \"\\f19d\";\n$fa-var-music: \"\\f001\";\n$fa-var-navicon: \"\\f0c9\";\n$fa-var-newspaper-o: \"\\f1ea\";\n$fa-var-openid: \"\\f19b\";\n$fa-var-outdent: \"\\f03b\";\n$fa-var-pagelines: \"\\f18c\";\n$fa-var-paint-brush: \"\\f1fc\";\n$fa-var-paper-plane: \"\\f1d8\";\n$fa-var-paper-plane-o: \"\\f1d9\";\n$fa-var-paperclip: \"\\f0c6\";\n$fa-var-paragraph: \"\\f1dd\";\n$fa-var-paste: \"\\f0ea\";\n$fa-var-pause: \"\\f04c\";\n$fa-var-paw: \"\\f1b0\";\n$fa-var-paypal: \"\\f1ed\";\n$fa-var-pencil: \"\\f040\";\n$fa-var-pencil-square: \"\\f14b\";\n$fa-var-pencil-square-o: \"\\f044\";\n$fa-var-phone: \"\\f095\";\n$fa-var-phone-square: \"\\f098\";\n$fa-var-photo: \"\\f03e\";\n$fa-var-picture-o: \"\\f03e\";\n$fa-var-pie-chart: \"\\f200\";\n$fa-var-pied-piper: \"\\f1a7\";\n$fa-var-pied-piper-alt: \"\\f1a8\";\n$fa-var-pinterest: \"\\f0d2\";\n$fa-var-pinterest-square: \"\\f0d3\";\n$fa-var-plane: \"\\f072\";\n$fa-var-play: \"\\f04b\";\n$fa-var-play-circle: \"\\f144\";\n$fa-var-play-circle-o: \"\\f01d\";\n$fa-var-plug: \"\\f1e6\";\n$fa-var-plus: \"\\f067\";\n$fa-var-plus-circle: \"\\f055\";\n$fa-var-plus-square: \"\\f0fe\";\n$fa-var-plus-square-o: \"\\f196\";\n$fa-var-power-off: \"\\f011\";\n$fa-var-print: \"\\f02f\";\n$fa-var-puzzle-piece: \"\\f12e\";\n$fa-var-qq: \"\\f1d6\";\n$fa-var-qrcode: \"\\f029\";\n$fa-var-question: \"\\f128\";\n$fa-var-question-circle: \"\\f059\";\n$fa-var-quote-left: \"\\f10d\";\n$fa-var-quote-right: \"\\f10e\";\n$fa-var-ra: \"\\f1d0\";\n$fa-var-random: \"\\f074\";\n$fa-var-rebel: \"\\f1d0\";\n$fa-var-recycle: \"\\f1b8\";\n$fa-var-reddit: \"\\f1a1\";\n$fa-var-reddit-square: \"\\f1a2\";\n$fa-var-refresh: \"\\f021\";\n$fa-var-remove: \"\\f00d\";\n$fa-var-renren: \"\\f18b\";\n$fa-var-reorder: \"\\f0c9\";\n$fa-var-repeat: \"\\f01e\";\n$fa-var-reply: \"\\f112\";\n$fa-var-reply-all: \"\\f122\";\n$fa-var-retweet: \"\\f079\";\n$fa-var-rmb: \"\\f157\";\n$fa-var-road: \"\\f018\";\n$fa-var-rocket: \"\\f135\";\n$fa-var-rotate-left: \"\\f0e2\";\n$fa-var-rotate-right: \"\\f01e\";\n$fa-var-rouble: \"\\f158\";\n$fa-var-rss: \"\\f09e\";\n$fa-var-rss-square: \"\\f143\";\n$fa-var-rub: \"\\f158\";\n$fa-var-ruble: \"\\f158\";\n$fa-var-rupee: \"\\f156\";\n$fa-var-save: \"\\f0c7\";\n$fa-var-scissors: \"\\f0c4\";\n$fa-var-search: \"\\f002\";\n$fa-var-search-minus: \"\\f010\";\n$fa-var-search-plus: \"\\f00e\";\n$fa-var-send: \"\\f1d8\";\n$fa-var-send-o: \"\\f1d9\";\n$fa-var-share: \"\\f064\";\n$fa-var-share-alt: \"\\f1e0\";\n$fa-var-share-alt-square: \"\\f1e1\";\n$fa-var-share-square: \"\\f14d\";\n$fa-var-share-square-o: \"\\f045\";\n$fa-var-shekel: \"\\f20b\";\n$fa-var-sheqel: \"\\f20b\";\n$fa-var-shield: \"\\f132\";\n$fa-var-shopping-cart: \"\\f07a\";\n$fa-var-sign-in: \"\\f090\";\n$fa-var-sign-out: \"\\f08b\";\n$fa-var-signal: \"\\f012\";\n$fa-var-sitemap: \"\\f0e8\";\n$fa-var-skype: \"\\f17e\";\n$fa-var-slack: \"\\f198\";\n$fa-var-sliders: \"\\f1de\";\n$fa-var-slideshare: \"\\f1e7\";\n$fa-var-smile-o: \"\\f118\";\n$fa-var-soccer-ball-o: \"\\f1e3\";\n$fa-var-sort: \"\\f0dc\";\n$fa-var-sort-alpha-asc: \"\\f15d\";\n$fa-var-sort-alpha-desc: \"\\f15e\";\n$fa-var-sort-amount-asc: \"\\f160\";\n$fa-var-sort-amount-desc: \"\\f161\";\n$fa-var-sort-asc: \"\\f0de\";\n$fa-var-sort-desc: \"\\f0dd\";\n$fa-var-sort-down: \"\\f0dd\";\n$fa-var-sort-numeric-asc: \"\\f162\";\n$fa-var-sort-numeric-desc: \"\\f163\";\n$fa-var-sort-up: \"\\f0de\";\n$fa-var-soundcloud: \"\\f1be\";\n$fa-var-space-shuttle: \"\\f197\";\n$fa-var-spinner: \"\\f110\";\n$fa-var-spoon: \"\\f1b1\";\n$fa-var-spotify: \"\\f1bc\";\n$fa-var-square: \"\\f0c8\";\n$fa-var-square-o: \"\\f096\";\n$fa-var-stack-exchange: \"\\f18d\";\n$fa-var-stack-overflow: \"\\f16c\";\n$fa-var-star: \"\\f005\";\n$fa-var-star-half: \"\\f089\";\n$fa-var-star-half-empty: \"\\f123\";\n$fa-var-star-half-full: \"\\f123\";\n$fa-var-star-half-o: \"\\f123\";\n$fa-var-star-o: \"\\f006\";\n$fa-var-steam: \"\\f1b6\";\n$fa-var-steam-square: \"\\f1b7\";\n$fa-var-step-backward: \"\\f048\";\n$fa-var-step-forward: \"\\f051\";\n$fa-var-stethoscope: \"\\f0f1\";\n$fa-var-stop: \"\\f04d\";\n$fa-var-strikethrough: \"\\f0cc\";\n$fa-var-stumbleupon: \"\\f1a4\";\n$fa-var-stumbleupon-circle: \"\\f1a3\";\n$fa-var-subscript: \"\\f12c\";\n$fa-var-suitcase: \"\\f0f2\";\n$fa-var-sun-o: \"\\f185\";\n$fa-var-superscript: \"\\f12b\";\n$fa-var-support: \"\\f1cd\";\n$fa-var-table: \"\\f0ce\";\n$fa-var-tablet: \"\\f10a\";\n$fa-var-tachometer: \"\\f0e4\";\n$fa-var-tag: \"\\f02b\";\n$fa-var-tags: \"\\f02c\";\n$fa-var-tasks: \"\\f0ae\";\n$fa-var-taxi: \"\\f1ba\";\n$fa-var-tencent-weibo: \"\\f1d5\";\n$fa-var-terminal: \"\\f120\";\n$fa-var-text-height: \"\\f034\";\n$fa-var-text-width: \"\\f035\";\n$fa-var-th: \"\\f00a\";\n$fa-var-th-large: \"\\f009\";\n$fa-var-th-list: \"\\f00b\";\n$fa-var-thumb-tack: \"\\f08d\";\n$fa-var-thumbs-down: \"\\f165\";\n$fa-var-thumbs-o-down: \"\\f088\";\n$fa-var-thumbs-o-up: \"\\f087\";\n$fa-var-thumbs-up: \"\\f164\";\n$fa-var-ticket: \"\\f145\";\n$fa-var-times: \"\\f00d\";\n$fa-var-times-circle: \"\\f057\";\n$fa-var-times-circle-o: \"\\f05c\";\n$fa-var-tint: \"\\f043\";\n$fa-var-toggle-down: \"\\f150\";\n$fa-var-toggle-left: \"\\f191\";\n$fa-var-toggle-off: \"\\f204\";\n$fa-var-toggle-on: \"\\f205\";\n$fa-var-toggle-right: \"\\f152\";\n$fa-var-toggle-up: \"\\f151\";\n$fa-var-trash: \"\\f1f8\";\n$fa-var-trash-o: \"\\f014\";\n$fa-var-tree: \"\\f1bb\";\n$fa-var-trello: \"\\f181\";\n$fa-var-trophy: \"\\f091\";\n$fa-var-truck: \"\\f0d1\";\n$fa-var-try: \"\\f195\";\n$fa-var-tty: \"\\f1e4\";\n$fa-var-tumblr: \"\\f173\";\n$fa-var-tumblr-square: \"\\f174\";\n$fa-var-turkish-lira: \"\\f195\";\n$fa-var-twitch: \"\\f1e8\";\n$fa-var-twitter: \"\\f099\";\n$fa-var-twitter-square: \"\\f081\";\n$fa-var-umbrella: \"\\f0e9\";\n$fa-var-underline: \"\\f0cd\";\n$fa-var-undo: \"\\f0e2\";\n$fa-var-university: \"\\f19c\";\n$fa-var-unlink: \"\\f127\";\n$fa-var-unlock: \"\\f09c\";\n$fa-var-unlock-alt: \"\\f13e\";\n$fa-var-unsorted: \"\\f0dc\";\n$fa-var-upload: \"\\f093\";\n$fa-var-usd: \"\\f155\";\n$fa-var-user: \"\\f007\";\n$fa-var-user-md: \"\\f0f0\";\n$fa-var-users: \"\\f0c0\";\n$fa-var-video-camera: \"\\f03d\";\n$fa-var-vimeo-square: \"\\f194\";\n$fa-var-vine: \"\\f1ca\";\n$fa-var-vk: \"\\f189\";\n$fa-var-volume-down: \"\\f027\";\n$fa-var-volume-off: \"\\f026\";\n$fa-var-volume-up: \"\\f028\";\n$fa-var-warning: \"\\f071\";\n$fa-var-wechat: \"\\f1d7\";\n$fa-var-weibo: \"\\f18a\";\n$fa-var-weixin: \"\\f1d7\";\n$fa-var-wheelchair: \"\\f193\";\n$fa-var-wifi: \"\\f1eb\";\n$fa-var-windows: \"\\f17a\";\n$fa-var-won: \"\\f159\";\n$fa-var-wordpress: \"\\f19a\";\n$fa-var-wrench: \"\\f0ad\";\n$fa-var-xing: \"\\f168\";\n$fa-var-xing-square: \"\\f169\";\n$fa-var-yahoo: \"\\f19e\";\n$fa-var-yelp: \"\\f1e9\";\n$fa-var-yen: \"\\f157\";\n$fa-var-youtube: \"\\f167\";\n$fa-var-youtube-play: \"\\f16a\";\n$fa-var-youtube-square: \"\\f166\";\n\n"
  },
  {
    "path": "browser/vendor/font-awesome-4.2.0/scss/font-awesome.scss",
    "content": "/*!\n *  Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome\n *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)\n */\n\n@import \"variables\";\n@import \"mixins\";\n@import \"path\";\n@import \"core\";\n@import \"larger\";\n@import \"fixed-width\";\n@import \"list\";\n@import \"bordered-pulled\";\n@import \"spinning\";\n@import \"rotated-flipped\";\n@import \"stacked\";\n@import \"icons\";\n"
  },
  {
    "path": "browser/vendor/jquery.fastfix.js",
    "content": "(function($) {\n\n    // ## jquerypp/event/fastfix/fastfix.js\n    var __m1 = (function($) {\n        // http://bitovi.com/blog/2012/04/faster-jquery-event-fix.html\n        // https://gist.github.com/2377196\n\n        // IE 8 has Object.defineProperty but it only defines DOM Nodes. According to\n        // http://kangax.github.com/es5-compat-table/#define-property-ie-note\n        // All browser that have Object.defineProperties also support Object.defineProperty properly\n        if (Object.defineProperties) {\n            var\n            // Use defineProperty on an object to set the value and return it\n            set = function(obj, prop, val) {\n                if (val !== undefined) {\n                    Object.defineProperty(obj, prop, {\n                            value: val\n                        });\n                }\n                return val;\n            },\n                // special converters\n                special = {\n                    pageX: function(original) {\n                        if (!original) {\n                            return;\n                        }\n\n                        var eventDoc = this.target.ownerDocument || document;\n                        doc = eventDoc.documentElement;\n                        body = eventDoc.body;\n                        return original.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);\n                    },\n                    pageY: function(original) {\n                        if (!original) {\n                            return;\n                        }\n\n                        var eventDoc = this.target.ownerDocument || document;\n                        doc = eventDoc.documentElement;\n                        body = eventDoc.body;\n                        return original.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);\n                    },\n                    relatedTarget: function(original) {\n                        if (!original) {\n                            return;\n                        }\n\n                        return original.fromElement === this.target ? original.toElement : original.fromElement;\n                    },\n                    metaKey: function(originalEvent) {\n                        if (!originalEvent) {\n                            return;\n                        }\n                        return originalEvent.ctrlKey;\n                    },\n                    which: function(original) {\n                        if (!original) {\n                            return;\n                        }\n\n                        return original.charCode != null ? original.charCode : original.keyCode;\n                    }\n                };\n\n            // Get all properties that should be mapped\n            $.each($.event.keyHooks.props.concat($.event.mouseHooks.props).concat($.event.props), function(i, prop) {\n                if (prop !== \"target\") {\n                    (function() {\n                        Object.defineProperty($.Event.prototype, prop, {\n                                get: function() {\n                                    // get the original value, undefined when there is no original event\n                                    var originalValue = this.originalEvent && this.originalEvent[prop];\n                                    // overwrite getter lookup\n                                    return this['_' + prop] !== undefined ? this['_' + prop] : set(this, prop,\n                                        // if we have a special function and no value\n                                        special[prop] && originalValue === undefined ?\n                                        // call the special function\n                                        special[prop].call(this, this.originalEvent) :\n                                        // use the original value\n                                        originalValue)\n                                },\n                                set: function(newValue) {\n                                    // Set the property with underscore prefix\n                                    this['_' + prop] = newValue;\n                                }\n                            });\n                    })();\n                }\n            });\n\n            $.event.fix = function(event) {\n                if (event[$.expando]) {\n                    return event;\n                }\n                // Create a jQuery event with at minimum a target and type set\n                var originalEvent = event,\n                    event = $.Event(originalEvent);\n                event.target = originalEvent.target;\n                // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)\n                if (!event.target) {\n                    event.target = originalEvent.srcElement || document;\n                }\n\n                // Target should not be a text node (#504, Safari)\n                if (event.target.nodeType === 3) {\n                    event.target = event.target.parentNode;\n                }\n\n                return event;\n            }\n        }\n\n        return $;\n    })($);\n})(jQuery);\n"
  },
  {
    "path": "browser/vendor/jquery.mousewheel.js",
    "content": "/*! Copyright (c) 2013 Brandon Aaron (http://brandon.aaron.sh)\n * Licensed under the MIT License (LICENSE.txt).\n *\n * Version: 3.1.9\n *\n * Requires: jQuery 1.2.2+\n */\n\n(function (factory) {\n    if ( typeof define === 'function' && define.amd ) {\n        // AMD. Register as an anonymous module.\n        define(['jquery'], factory);\n    } else if (typeof exports === 'object') {\n        // Node/CommonJS style for Browserify\n        module.exports = factory;\n    } else {\n        // Browser globals\n        factory(jQuery);\n    }\n}(function ($) {\n\n    var toFix  = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'],\n        toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ?\n                    ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'],\n        slice  = Array.prototype.slice,\n        nullLowestDeltaTimeout, lowestDelta;\n\n    if ( $.event.fixHooks ) {\n        for ( var i = toFix.length; i; ) {\n            $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks;\n        }\n    }\n\n    var special = $.event.special.mousewheel = {\n        version: '3.1.9',\n\n        setup: function() {\n            if ( this.addEventListener ) {\n                for ( var i = toBind.length; i; ) {\n                    this.addEventListener( toBind[--i], handler, false );\n                }\n            } else {\n                this.onmousewheel = handler;\n            }\n            // Store the line height and page height for this particular element\n            $.data(this, 'mousewheel-line-height', special.getLineHeight(this));\n            $.data(this, 'mousewheel-page-height', special.getPageHeight(this));\n        },\n\n        teardown: function() {\n            if ( this.removeEventListener ) {\n                for ( var i = toBind.length; i; ) {\n                    this.removeEventListener( toBind[--i], handler, false );\n                }\n            } else {\n                this.onmousewheel = null;\n            }\n        },\n\n        getLineHeight: function(elem) {\n            return parseInt($(elem)['offsetParent' in $.fn ? 'offsetParent' : 'parent']().css('fontSize'), 10);\n        },\n\n        getPageHeight: function(elem) {\n            return $(elem).height();\n        },\n\n        settings: {\n            adjustOldDeltas: true\n        }\n    };\n\n    $.fn.extend({\n        mousewheel: function(fn) {\n            return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel');\n        },\n\n        unmousewheel: function(fn) {\n            return this.unbind('mousewheel', fn);\n        }\n    });\n\n\n    function handler(event) {\n        var orgEvent   = event || window.event,\n            args       = slice.call(arguments, 1),\n            delta      = 0,\n            deltaX     = 0,\n            deltaY     = 0,\n            absDelta   = 0;\n        event = $.event.fix(orgEvent);\n        event.type = 'mousewheel';\n\n        // Old school scrollwheel delta\n        if ( 'detail'      in orgEvent ) { deltaY = orgEvent.detail * -1;      }\n        if ( 'wheelDelta'  in orgEvent ) { deltaY = orgEvent.wheelDelta;       }\n        if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY;      }\n        if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; }\n\n        // Firefox < 17 horizontal scrolling related to DOMMouseScroll event\n        if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) {\n            deltaX = deltaY * -1;\n            deltaY = 0;\n        }\n\n        // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy\n        delta = deltaY === 0 ? deltaX : deltaY;\n\n        // New school wheel delta (wheel event)\n        if ( 'deltaY' in orgEvent ) {\n            deltaY = orgEvent.deltaY * -1;\n            delta  = deltaY;\n        }\n        if ( 'deltaX' in orgEvent ) {\n            deltaX = orgEvent.deltaX;\n            if ( deltaY === 0 ) { delta  = deltaX * -1; }\n        }\n\n        // No change actually happened, no reason to go any further\n        if ( deltaY === 0 && deltaX === 0 ) { return; }\n\n        // Need to convert lines and pages to pixels if we aren't already in pixels\n        // There are three delta modes:\n        //   * deltaMode 0 is by pixels, nothing to do\n        //   * deltaMode 1 is by lines\n        //   * deltaMode 2 is by pages\n        if ( orgEvent.deltaMode === 1 ) {\n            var lineHeight = $.data(this, 'mousewheel-line-height');\n            delta  *= lineHeight;\n            deltaY *= lineHeight;\n            deltaX *= lineHeight;\n        } else if ( orgEvent.deltaMode === 2 ) {\n            var pageHeight = $.data(this, 'mousewheel-page-height');\n            delta  *= pageHeight;\n            deltaY *= pageHeight;\n            deltaX *= pageHeight;\n        }\n\n        // Store lowest absolute delta to normalize the delta values\n        absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) );\n\n        if ( !lowestDelta || absDelta < lowestDelta ) {\n            lowestDelta = absDelta;\n\n            // Adjust older deltas if necessary\n            if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {\n                lowestDelta /= 40;\n            }\n        }\n\n        // Adjust older deltas if necessary\n        if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) {\n            // Divide all the things by 40!\n            delta  /= 40;\n            deltaX /= 40;\n            deltaY /= 40;\n        }\n\n        // Get a whole, normalized value for the deltas\n        delta  = Math[ delta  >= 1 ? 'floor' : 'ceil' ](delta  / lowestDelta);\n        deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta);\n        deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta);\n\n        // Add information to the event object\n        event.deltaX = deltaX;\n        event.deltaY = deltaY;\n        event.deltaFactor = lowestDelta;\n        // Go ahead and set deltaMode to 0 since we converted to pixels\n        // Although this is a little odd since we overwrite the deltaX/Y\n        // properties with normalized deltas.\n        event.deltaMode = 0;\n\n        // Add event and delta to the front of the arguments\n        args.unshift(event, delta, deltaX, deltaY);\n\n        // Clearout lowestDelta after sometime to better\n        // handle multiple device types that give different\n        // a different lowestDelta\n        // Ex: trackpad = 3 and mouse wheel = 120\n        if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); }\n        nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200);\n\n        return ($.event.dispatch || $.event.handle).apply(this, args);\n    }\n\n    function nullLowestDelta() {\n        lowestDelta = null;\n    }\n\n    function shouldAdjustOldDeltas(orgEvent, absDelta) {\n        // If this is an older event and the delta is divisable by 120,\n        // then we are assuming that the browser is treating this as an\n        // older mouse wheel event and that we should divide the deltas\n        // by 40 to try and get a more usable deltaFactor.\n        // Side note, this actually impacts the reported scroll distance\n        // in older browsers and can cause scrolling to be slower than native.\n        // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false.\n        return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0;\n    }\n\n}));\n"
  },
  {
    "path": "browser/vendor/spite/THREE.MeshLine.js",
    "content": "THREE.MeshLine = function() {\n\n\tthis.positions = [];\n\n\tthis.previous = [];\n\tthis.next = [];\n\tthis.side = [];\n\tthis.width = [];\n\tthis.indices_array = [];\n\tthis.uvs = [];\n\n\tthis.geometry = new THREE.BufferGeometry();\n\n\t// Used to raycast\n\tthis.matrixWorld = new THREE.Matrix4();\n\t\n\tthis.widthCallback = null;\n}\n\nTHREE.MeshLine.prototype.setMatrixWorld = function(matrixWorld) {\n\tthis.matrixWorld = matrixWorld;\n}\n\nTHREE.MeshLine.prototype.setGeometry = function( g, c ) {\n\n\tthis.widthCallback = c;\n\n\tthis.positions = [];\n\n\tif( g instanceof THREE.Geometry ) {\n\t\tfor( var j = 0; j < g.vertices.length; j++ ) {\n\t\t\tvar v = g.vertices[ j ];\n\t\t\tthis.positions.push( v.x, v.y, v.z );\n\t\t\tthis.positions.push( v.x, v.y, v.z );\n\t\t}\n\t}\n\n\tif( g instanceof THREE.BufferGeometry ) {\n\t\t// read attribute positions ?\n\t}\n\n\tif( g instanceof Float32Array || g instanceof Array ) {\n\t\tfor( var j = 0; j < g.length; j += 3 ) {\n\t\t\tthis.positions.push( g[ j ], g[ j + 1 ], g[ j + 2 ] );\n\t\t\tthis.positions.push( g[ j ], g[ j + 1 ], g[ j + 2 ] );\n\t\t}\n\t}\n\n\tthis.process();\n\n}\n\n// Raycast function\nTHREE.MeshLine.prototype.raycast = ( function () {\n\tvar inverseMatrix = new THREE.Matrix4();\n\tvar ray = new THREE.Ray();\n\tvar sphere = new THREE.Sphere();\n\n\treturn function raycast( raycaster, intersects ) {\n\t\tvar precision = raycaster.linePrecision;\n\t\tvar precisionSq = precision * precision;\n\n\t\tvar geometry = this.geometry;\n\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t// Checking boundingSphere distance to ray\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\tsphere.copy( geometry.boundingSphere );\n\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\tinverseMatrix.getInverse( matrixWorld );\n\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\tvar vStart = new THREE.Vector3();\n\t\tvar vEnd = new THREE.Vector3();\n\t\tvar interSegment = new THREE.Vector3();\n\t\tvar interRay = new THREE.Vector3();\n\t\tvar step = this instanceof THREE.LineSegments ? 2 : 1;\n\n\t\t// We assume here that this is an instance of BufferGeometry\n\t\tvar index = geometry.index;\n\t\tvar attributes = geometry.attributes;\n\t\tvar positions = attributes.position.array;\n\n\t\tif ( index !== null ) {\n\t\t\tvar indices = index.array;\n\t\t\tfor ( var i = 0, l = indices.length - 1; i < l; i += step ) {\n\t\t\t\tvar a = indices[ i ];\n\t\t\t\tvar b = indices[ i + 1 ];\n\n\t\t\t\tvStart.fromArray( positions, a * 3 );\n\t\t\t\tvEnd.fromArray( positions, b * 3 );\n\n\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\tintersects.push( {\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\tindex: i,\n\t\t\t\t\tface: null,\n\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\tobject: this\n\t\t\t\t} );\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {\n\t\t\t\tvStart.fromArray( positions, 3 * i );\n\t\t\t\tvEnd.fromArray( positions, 3 * i + 3 );\n\n\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\tintersects.push( {\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\tindex: i,\n\t\t\t\t\tface: null,\n\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\tobject: this\n\t\t\t\t} );\n\t\t\t}\n\t\t}\n\t};\n}() );\n\nTHREE.MeshLine.prototype.compareV3 = function( a, b ) {\n\n\tvar aa = a * 6;\n\tvar ab = b * 6;\n\treturn ( this.positions[ aa ] === this.positions[ ab ] ) && ( this.positions[ aa + 1 ] === this.positions[ ab + 1 ] ) && ( this.positions[ aa + 2 ] === this.positions[ ab + 2 ] );\n\n}\n\nTHREE.MeshLine.prototype.copyV3 = function( a ) {\n\n\tvar aa = a * 6;\n\treturn [ this.positions[ aa ], this.positions[ aa + 1 ], this.positions[ aa + 2 ] ];\n\n}\n\nTHREE.MeshLine.prototype.process = function() {\n\n\tvar l = this.positions.length / 6;\n\n\tthis.previous = [];\n\tthis.next = [];\n\tthis.side = [];\n\tthis.width = [];\n\tthis.indices_array = [];\n\tthis.uvs = [];\n\n\tfor( var j = 0; j < l; j++ ) {\n\t\tthis.side.push( 1 );\n\t\tthis.side.push( -1 );\n\t}\n\n\tvar w;\n\tfor( var j = 0; j < l; j++ ) {\n\t\tif( this.widthCallback ) w = this.widthCallback( j / ( l -1 ) );\n\t\telse w = 1;\n\t\tthis.width.push( w );\n\t\tthis.width.push( w );\n\t}\n\n\tfor( var j = 0; j < l; j++ ) {\n\t\tthis.uvs.push( j / ( l - 1 ), 0 );\n\t\tthis.uvs.push( j / ( l - 1 ), 1 );\n\t}\n\n\tvar v;\n\n\tif( this.compareV3( 0, l - 1 ) ){\n\t\tv = this.copyV3( l - 2 );\n\t} else {\n\t\tv = this.copyV3( 0 );\n\t}\n\tthis.previous.push( v[ 0 ], v[ 1 ], v[ 2 ] );\n\tthis.previous.push( v[ 0 ], v[ 1 ], v[ 2 ] );\n\tfor( var j = 0; j < l - 1; j++ ) {\n\t\tv = this.copyV3( j );\n\t\tthis.previous.push( v[ 0 ], v[ 1 ], v[ 2 ] );\n\t\tthis.previous.push( v[ 0 ], v[ 1 ], v[ 2 ] );\n\t}\n\n\tfor( var j = 1; j < l; j++ ) {\t\n\t\tv = this.copyV3( j );\n\t\tthis.next.push( v[ 0 ], v[ 1 ], v[ 2 ] );\n\t\tthis.next.push( v[ 0 ], v[ 1 ], v[ 2 ] );\n\t}\n\n\tif( this.compareV3( l - 1, 0 ) ){\n\t\tv = this.copyV3( 1 );\n\t} else {\n\t\tv = this.copyV3( l - 1 );\n\t}\n\tthis.next.push( v[ 0 ], v[ 1 ], v[ 2 ] );\n\tthis.next.push( v[ 0 ], v[ 1 ], v[ 2 ] );\n\n\tfor( var j = 0; j < l - 1; j++ ) {\n\t\tvar n = j * 2;\n\t\tthis.indices_array.push( n, n + 1, n + 2 );\n\t\tthis.indices_array.push( n + 2, n + 1, n + 3 );\n\t}\n\n\tthis.attributes = {\n\t\tposition: new THREE.BufferAttribute( new Float32Array( this.positions ), 3 ),\n\t\tprevious: new THREE.BufferAttribute( new Float32Array( this.previous ), 3 ),\n\t\tnext: new THREE.BufferAttribute( new Float32Array( this.next ), 3 ),\n\t\tside: new THREE.BufferAttribute( new Float32Array( this.side ), 1 ),\n\t\twidth: new THREE.BufferAttribute( new Float32Array( this.width ), 1 ),\n\t\tuv: new THREE.BufferAttribute( new Float32Array( this.uvs ), 2 ),\n\t\tindex: new THREE.BufferAttribute( new Uint16Array( this.indices_array ), 1 )\n\t}\n\n\tthis.geometry.addAttribute( 'position', this.attributes.position );\n\tthis.geometry.addAttribute( 'previous', this.attributes.previous );\n\tthis.geometry.addAttribute( 'next', this.attributes.next );\n\tthis.geometry.addAttribute( 'side', this.attributes.side );\n\tthis.geometry.addAttribute( 'width', this.attributes.width );\n\tthis.geometry.addAttribute( 'uv', this.attributes.uv );\n\n\tthis.geometry.setIndex( this.attributes.index );\n\n}\n\nTHREE.MeshLineMaterial = function ( parameters ) {\n\n\tvar vertexShaderSource = [\n'precision highp float;',\n'',\n'attribute vec3 position;',\n'attribute vec3 previous;',\n'attribute vec3 next;',\n'attribute float side;',\n'attribute float width;',\n'attribute vec2 uv;',\n'',\n'uniform mat4 projectionMatrix;',\n'uniform mat4 modelViewMatrix;',\n'uniform vec2 resolution;',\n'uniform float lineWidth;',\n'uniform vec3 color;',\n'uniform float opacity;',\n'uniform float near;',\n'uniform float far;',\n'uniform float sizeAttenuation;',\n'',\n'varying vec2 vUV;',\n'varying vec4 vColor;',\n'varying vec3 vPosition;',\n'',\n'vec2 fix( vec4 i, float aspect ) {',\n'',\n'    vec2 res = i.xy / i.w;',\n'    res.x *= aspect;',\n'    return res;',\n'',\n'}',\n'',\n'void main() {',\n'',\n'    float aspect = resolution.x / resolution.y;',\n'\t float pixelWidthRatio = 1. / (resolution.x * projectionMatrix[0][0]);',\n'',\n'    vColor = vec4( color, opacity );',\n'    vUV = uv;',\n'',\n'    mat4 m = projectionMatrix * modelViewMatrix;',\n'    vec4 finalPosition = m * vec4( position, 1.0 );',\n'    vec4 prevPos = m * vec4( previous, 1.0 );',\n'    vec4 nextPos = m * vec4( next, 1.0 );',\n'',\n'    vec2 currentP = fix( finalPosition, aspect );',\n'    vec2 prevP = fix( prevPos, aspect );',\n'    vec2 nextP = fix( nextPos, aspect );',\n'',\n'\t float pixelWidth = finalPosition.w * pixelWidthRatio;',\n'    float w = 1.8 * pixelWidth * lineWidth * width;',\n'',\n'    if( sizeAttenuation == 1. ) {',\n'        w = 1.8 * lineWidth * width;',\n'    }',\n'',\n'    vec2 dir;',\n'    if( nextP == currentP ) dir = normalize( currentP - prevP );',\n'    else if( prevP == currentP ) dir = normalize( nextP - currentP );',\n'    else {',\n'        vec2 dir1 = normalize( currentP - prevP );',\n'        vec2 dir2 = normalize( nextP - currentP );',\n'        dir = normalize( dir1 + dir2 );',\n'',\n'        vec2 perp = vec2( -dir1.y, dir1.x );',\n'        vec2 miter = vec2( -dir.y, dir.x );',\n'        //w = clamp( w / dot( miter, perp ), 0., 4. * lineWidth * width );',\n'',\n'    }',\n'',\n'    //vec2 normal = ( cross( vec3( dir, 0. ), vec3( 0., 0., 1. ) ) ).xy;',\n'    vec2 normal = vec2( -dir.y, dir.x );',\n'    normal.x /= aspect;',\n'    normal *= .5 * w;',\n'',\n'    vec4 offset = vec4( normal * side, 0.0, 1.0 );',\n'    finalPosition.xy += offset.xy;',\n'',\n'\t vPosition = ( modelViewMatrix * vec4( position, 1. ) ).xyz;',\n'    gl_Position = finalPosition;',\n'',\n'}' ];\n\n\tvar fragmentShaderSource = [\n\t\t'#extension GL_OES_standard_derivatives : enable',\n'precision mediump float;',\n'',\n'uniform sampler2D map;',\n'uniform float useMap;',\n'uniform float useDash;',\n'uniform vec2 dashArray;',\n'',\n'varying vec2 vUV;',\n'varying vec4 vColor;',\n'varying vec3 vPosition;',\n'',\n'void main() {',\n'',\n'    vec4 c = vColor;',\n'    if( useMap == 1. ) c *= texture2D( map, vUV );',\n'\t if( useDash == 1. ){',\n'\t \t ',\n'\t }',\n'    gl_FragColor = c;',\n'',   \n'}' ];\n\n\tfunction check( v, d ) {\n\t\tif( v === undefined ) return d;\n\t\treturn v;\n\t}\n\n\tTHREE.Material.call( this );\n\n\tparameters = parameters || {};\n\n\tthis.lineWidth = check( parameters.lineWidth, 1 );\n\tthis.map = check( parameters.map, null );\n\tthis.useMap = check( parameters.useMap, 0 );\n\tthis.color = check( parameters.color, new THREE.Color( 0xffffff ) );\n\tthis.opacity = check( parameters.opacity, 1 );\n\tthis.resolution = check( parameters.resolution, new THREE.Vector2( 1, 1 ) );\n\tthis.sizeAttenuation = check( parameters.sizeAttenuation, 1 );\n\tthis.near = check( parameters.near, 1 );\n\tthis.far = check( parameters.far, 1 );\n\tthis.dashArray = check( parameters.dashArray, [] );\n\tthis.useDash = ( this.dashArray !== [] ) ? 1 : 0;\n\n\tvar material = new THREE.RawShaderMaterial( { \n\t\tuniforms:{\n\t\t\tlineWidth: { type: 'f', value: this.lineWidth },\n\t\t\tmap: { type: 't', value: this.map },\n\t\t\tuseMap: { type: 'f', value: this.useMap },\n\t\t\tcolor: { type: 'c', value: this.color },\n\t\t\topacity: { type: 'f', value: this.opacity },\n\t\t\tresolution: { type: 'v2', value: this.resolution },\n\t\t\tsizeAttenuation: { type: 'f', value: this.sizeAttenuation },\n\t\t\tnear: { type: 'f', value: this.near },\n\t\t\tfar: { type: 'f', value: this.far },\n\t\t\tdashArray: { type: 'v2', value: new THREE.Vector2( this.dashArray[ 0 ], this.dashArray[ 1 ] ) },\n\t\t\tuseDash: { type: 'f', value: this.useDash }\n\t\t},\n\t\tvertexShader: vertexShaderSource.join( '\\r\\n' ),\n\t\tfragmentShader: fragmentShaderSource.join( '\\r\\n' )\n\t});\n\n\tdelete parameters.lineWidth;\n\tdelete parameters.map;\n\tdelete parameters.useMap;\n\tdelete parameters.color;\n\tdelete parameters.opacity;\n\tdelete parameters.resolution;\n\tdelete parameters.sizeAttenuation;\n\tdelete parameters.near;\n\tdelete parameters.far;\n\tdelete parameters.dashArray;\n\n\tmaterial.type = 'MeshLineMaterial';\n\n\tmaterial.setValues( parameters );\n\n\treturn material;\n\n};\n\nTHREE.MeshLineMaterial.prototype = Object.create( THREE.Material.prototype );\nTHREE.MeshLineMaterial.prototype.constructor = THREE.MeshLineMaterial;\n\nTHREE.MeshLineMaterial.prototype.copy = function ( source ) {\n\n\tTHREE.Material.prototype.copy.call( this, source );\n\n\tthis.lineWidth = source.lineWidth;\n\tthis.map = source.map;\n\tthis.useMap = source.useMap;\n\tthis.color.copy( source.color );\n\tthis.opacity = source.opacity;\n\tthis.resolution.copy( source.resolution );\n\tthis.sizeAttenuation = source.sizeAttenuation;\n\tthis.near = source.near;\n\tthis.far = source.far;\n\n\treturn this;\n\n};\n"
  },
  {
    "path": "browser/vendor/three/CardboardEffect.js",
    "content": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.CardboardEffect = function ( renderer ) {\n\n\tvar _camera = new THREE.OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n\tvar _scene = new THREE.Scene();\n\n\tvar _stereo = new THREE.StereoCamera();\n\t_stereo.aspect = 0.5;\n\n\tvar _params = { minFilter: THREE.LinearFilter, magFilter: THREE.NearestFilter, format: THREE.RGBAFormat };\n\n\tvar _renderTarget = new THREE.WebGLRenderTarget( 512, 512, _params );\n\t_renderTarget.scissorTest = true;\n\n\t// Distortion Mesh ported from:\n\t// https://github.com/borismus/webvr-boilerplate/blob/master/src/distortion/barrel-distortion-fragment.js\n\n\tvar distortion = new THREE.Vector2( 0.441, 0.156 );\n\n\tvar geometry = new THREE.PlaneBufferGeometry( 1, 1, 10, 20 ).removeAttribute( 'normal' ).toNonIndexed();\n\n\tvar positions = geometry.attributes.position.array;\n\tvar uvs = geometry.attributes.uv.array;\n\n\t// duplicate\n\n\tvar positions2 = new Float32Array( positions.length * 2 );\n\tpositions2.set( positions );\n\tpositions2.set( positions, positions.length );\n\n\tvar uvs2 = new Float32Array( uvs.length * 2 );\n\tuvs2.set( uvs );\n\tuvs2.set( uvs, uvs.length );\n\n\tvar vector = new THREE.Vector2();\n\tvar length = positions.length / 3;\n\n\tfor ( var i = 0, l = positions2.length / 3; i < l; i ++ ) {\n\n\t\tvector.x = positions2[ i * 3 + 0 ];\n\t\tvector.y = positions2[ i * 3 + 1 ];\n\n\t\tvar dot = vector.dot( vector );\n\t\tvar scalar = 1.5 + ( distortion.x + distortion.y * dot ) * dot;\n\n\t\tvar offset = i < length ? 0 : 1;\n\n\t\tpositions2[ i * 3 + 0 ] = ( vector.x / scalar ) * 1.5 - 0.5 + offset;\n\t\tpositions2[ i * 3 + 1 ] = ( vector.y / scalar ) * 3.0;\n\n\t\tuvs2[ i * 2 ] = ( uvs2[ i * 2 ] + offset ) * 0.5;\n\n\t}\n\n\tgeometry.attributes.position.array = positions2;\n\tgeometry.attributes.uv.array = uvs2;\n\n\t//\n\n\t//var material = new THREE.MeshBasicMaterial( { wireframe: true } );\n\tvar material = new THREE.MeshBasicMaterial( { map: _renderTarget } );\n\tvar mesh = new THREE.Mesh( geometry, material );\n\t_scene.add( mesh );\n\n\t//\n\n\tthis.setSize = function ( width, height ) {\n\t\tvar pixelRatio = window.devicePixelRatio\n\n\t\tvar realWidth = width * pixelRatio\n\t\tvar realHeight = height * pixelRatio\n\n\t\t_renderTarget.setSize( realWidth, realHeight );\n\n\t\trenderer.setSize( width, height );\n\n\t};\n\n\tthis.render = function ( scene, camera ) {\n\n\t\tscene.updateMatrixWorld();\n\n\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\t_stereo.update( camera );\n\n\t\tvar width = _renderTarget.width / 2;\n\t\tvar height = _renderTarget.height;\n\n\t\t_renderTarget.scissorTest = true\n\t\t_renderTarget.scissor.set( 0, 0, width, height );\n\t\t_renderTarget.viewport.set( 0, 0, width, height );\n\t\trenderer.render( scene, _stereo.cameraL, _renderTarget );\n\n\t\t_renderTarget.scissor.set( width, 0, width, height );\n\t\t_renderTarget.viewport.set( width, 0, width, height );\n\t\trenderer.render( scene, _stereo.cameraR, _renderTarget );\n\n\t\trenderer.render( _scene, _camera );\n\n\t};\n\n};\n"
  },
  {
    "path": "browser/vendor/three/DDSLoader.js",
    "content": "/*\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.DDSLoader = function () {\n\n\tthis._parser = THREE.DDSLoader.parse;\n\n};\n\nTHREE.DDSLoader.prototype = Object.create( THREE.CompressedTextureLoader.prototype );\nTHREE.DDSLoader.prototype.constructor = THREE.DDSLoader;\n\nTHREE.DDSLoader.parse = function ( buffer, loadMipmaps ) {\n\n\tvar dds = { mipmaps: [], width: 0, height: 0, format: null, mipmapCount: 1 };\n\n\t// Adapted from @toji's DDS utils\n\t// https://github.com/toji/webgl-texture-utils/blob/master/texture-util/dds.js\n\n\t// All values and structures referenced from:\n\t// http://msdn.microsoft.com/en-us/library/bb943991.aspx/\n\n\tvar DDS_MAGIC = 0x20534444;\n\n\tvar DDSD_CAPS = 0x1,\n\t\tDDSD_HEIGHT = 0x2,\n\t\tDDSD_WIDTH = 0x4,\n\t\tDDSD_PITCH = 0x8,\n\t\tDDSD_PIXELFORMAT = 0x1000,\n\t\tDDSD_MIPMAPCOUNT = 0x20000,\n\t\tDDSD_LINEARSIZE = 0x80000,\n\t\tDDSD_DEPTH = 0x800000;\n\n\tvar DDSCAPS_COMPLEX = 0x8,\n\t\tDDSCAPS_MIPMAP = 0x400000,\n\t\tDDSCAPS_TEXTURE = 0x1000;\n\n\tvar DDSCAPS2_CUBEMAP = 0x200,\n\t\tDDSCAPS2_CUBEMAP_POSITIVEX = 0x400,\n\t\tDDSCAPS2_CUBEMAP_NEGATIVEX = 0x800,\n\t\tDDSCAPS2_CUBEMAP_POSITIVEY = 0x1000,\n\t\tDDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000,\n\t\tDDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000,\n\t\tDDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000,\n\t\tDDSCAPS2_VOLUME = 0x200000;\n\n\tvar DDPF_ALPHAPIXELS = 0x1,\n\t\tDDPF_ALPHA = 0x2,\n\t\tDDPF_FOURCC = 0x4,\n\t\tDDPF_RGB = 0x40,\n\t\tDDPF_YUV = 0x200,\n\t\tDDPF_LUMINANCE = 0x20000;\n\n\tfunction fourCCToInt32( value ) {\n\n\t\treturn value.charCodeAt( 0 ) +\n\t\t\t( value.charCodeAt( 1 ) << 8 ) +\n\t\t\t( value.charCodeAt( 2 ) << 16 ) +\n\t\t\t( value.charCodeAt( 3 ) << 24 );\n\n\t}\n\n\tfunction int32ToFourCC( value ) {\n\n\t\treturn String.fromCharCode(\n\t\t\tvalue & 0xff,\n\t\t\t( value >> 8 ) & 0xff,\n\t\t\t( value >> 16 ) & 0xff,\n\t\t\t( value >> 24 ) & 0xff\n\t\t);\n\n\t}\n\n\tfunction loadARGBMip( buffer, dataOffset, width, height ) {\n\n\t\tvar dataLength = width * height * 4;\n\t\tvar srcBuffer = new Uint8Array( buffer, dataOffset, dataLength );\n\t\tvar byteArray = new Uint8Array( dataLength );\n\t\tvar dst = 0;\n\t\tvar src = 0;\n\t\tfor ( var y = 0; y < height; y ++ ) {\n\n\t\t\tfor ( var x = 0; x < width; x ++ ) {\n\n\t\t\t\tvar b = srcBuffer[ src ]; src ++;\n\t\t\t\tvar g = srcBuffer[ src ]; src ++;\n\t\t\t\tvar r = srcBuffer[ src ]; src ++;\n\t\t\t\tvar a = srcBuffer[ src ]; src ++;\n\t\t\t\tbyteArray[ dst ] = r; dst ++;\t//r\n\t\t\t\tbyteArray[ dst ] = g; dst ++;\t//g\n\t\t\t\tbyteArray[ dst ] = b; dst ++;\t//b\n\t\t\t\tbyteArray[ dst ] = a; dst ++;\t//a\n\n\t\t\t}\n\n\t\t}\n\t\treturn byteArray;\n\n\t}\n\n\tvar FOURCC_DXT1 = fourCCToInt32( \"DXT1\" );\n\tvar FOURCC_DXT3 = fourCCToInt32( \"DXT3\" );\n\tvar FOURCC_DXT5 = fourCCToInt32( \"DXT5\" );\n\tvar FOURCC_ETC1 = fourCCToInt32( \"ETC1\" );\n\n\tvar headerLengthInt = 31; // The header length in 32 bit ints\n\n\t// Offsets into the header array\n\n\tvar off_magic = 0;\n\n\tvar off_size = 1;\n\tvar off_flags = 2;\n\tvar off_height = 3;\n\tvar off_width = 4;\n\n\tvar off_mipmapCount = 7;\n\n\tvar off_pfFlags = 20;\n\tvar off_pfFourCC = 21;\n\tvar off_RGBBitCount = 22;\n\tvar off_RBitMask = 23;\n\tvar off_GBitMask = 24;\n\tvar off_BBitMask = 25;\n\tvar off_ABitMask = 26;\n\n\tvar off_caps = 27;\n\tvar off_caps2 = 28;\n\tvar off_caps3 = 29;\n\tvar off_caps4 = 30;\n\n\t// Parse header\n\n\tvar header = new Int32Array( buffer, 0, headerLengthInt );\n\n\tif ( header[ off_magic ] !== DDS_MAGIC ) {\n\n\t\tconsole.error( 'THREE.DDSLoader.parse: Invalid magic number in DDS header.' );\n\t\treturn dds;\n\n\t}\n\n\tif ( ! header[ off_pfFlags ] & DDPF_FOURCC ) {\n\n\t\tconsole.error( 'THREE.DDSLoader.parse: Unsupported format, must contain a FourCC code.' );\n\t\treturn dds;\n\n\t}\n\n\tvar blockBytes;\n\n\tvar fourCC = header[ off_pfFourCC ];\n\n\tvar isRGBAUncompressed = false;\n\n\tswitch ( fourCC ) {\n\n\t\tcase FOURCC_DXT1:\n\n\t\t\tblockBytes = 8;\n\t\t\tdds.format = THREE.RGB_S3TC_DXT1_Format;\n\t\t\tbreak;\n\n\t\tcase FOURCC_DXT3:\n\n\t\t\tblockBytes = 16;\n\t\t\tdds.format = THREE.RGBA_S3TC_DXT3_Format;\n\t\t\tbreak;\n\n\t\tcase FOURCC_DXT5:\n\n\t\t\tblockBytes = 16;\n\t\t\tdds.format = THREE.RGBA_S3TC_DXT5_Format;\n\t\t\tbreak;\n\n\t\tcase FOURCC_ETC1:\n\n\t\t\tblockBytes = 8;\n\t\t\tdds.format = THREE.RGB_ETC1_Format;\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tif ( header[ off_RGBBitCount ] === 32\n\t\t\t\t&& header[ off_RBitMask ] & 0xff0000\n\t\t\t\t&& header[ off_GBitMask ] & 0xff00\n\t\t\t\t&& header[ off_BBitMask ] & 0xff\n\t\t\t\t&& header[ off_ABitMask ] & 0xff000000  ) {\n\n\t\t\t\tisRGBAUncompressed = true;\n\t\t\t\tblockBytes = 64;\n\t\t\t\tdds.format = THREE.RGBAFormat;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.DDSLoader.parse: Unsupported FourCC code ', int32ToFourCC( fourCC ) );\n\t\t\t\treturn dds;\n\n\t\t\t}\n\t}\n\n\tdds.mipmapCount = 1;\n\n\tif ( header[ off_flags ] & DDSD_MIPMAPCOUNT && loadMipmaps !== false ) {\n\n\t\tdds.mipmapCount = Math.max( 1, header[ off_mipmapCount ] );\n\n\t}\n\n\tvar caps2 = header[ off_caps2 ];\n\tdds.isCubemap = caps2 & DDSCAPS2_CUBEMAP ? true : false;\n\tif ( dds.isCubemap && (\n\t\t! ( caps2 & DDSCAPS2_CUBEMAP_POSITIVEX ) ||\n\t\t! ( caps2 & DDSCAPS2_CUBEMAP_NEGATIVEX ) ||\n\t\t! ( caps2 & DDSCAPS2_CUBEMAP_POSITIVEY ) ||\n\t\t! ( caps2 & DDSCAPS2_CUBEMAP_NEGATIVEY ) ||\n\t\t! ( caps2 & DDSCAPS2_CUBEMAP_POSITIVEZ ) ||\n\t\t! ( caps2 & DDSCAPS2_CUBEMAP_NEGATIVEZ )\n\t\t) ) {\n\n\t\tconsole.error( 'THREE.DDSLoader.parse: Incomplete cubemap faces' );\n\t\treturn dds;\n\n\t}\n\n\tdds.width = header[ off_width ];\n\tdds.height = header[ off_height ];\n\n\tvar dataOffset = header[ off_size ] + 4;\n\n\t// Extract mipmaps buffers\n\n\tvar faces = dds.isCubemap ? 6 : 1;\n\n\tfor ( var face = 0; face < faces; face ++ ) {\n\n\t\tvar width = dds.width;\n\t\tvar height = dds.height;\n\n\t\tfor ( var i = 0; i < dds.mipmapCount; i ++ ) {\n\n\t\t\tif ( isRGBAUncompressed ) {\n\n\t\t\t\tvar byteArray = loadARGBMip( buffer, dataOffset, width, height );\n\t\t\t\tvar dataLength = byteArray.length;\n\n\t\t\t} else {\n\n\t\t\t\tvar dataLength = Math.max( 4, width ) / 4 * Math.max( 4, height ) / 4 * blockBytes;\n\t\t\t\tvar byteArray = new Uint8Array( buffer, dataOffset, dataLength );\n\n\t\t\t}\n\n\t\t\tvar mipmap = { \"data\": byteArray, \"width\": width, \"height\": height };\n\t\t\tdds.mipmaps.push( mipmap );\n\n\t\t\tdataOffset += dataLength;\n\n\t\t\twidth = Math.max( width >> 1, 1 );\n\t\t\theight = Math.max( height >> 1, 1 );\n\n\t\t}\n\n\t}\n\n\treturn dds;\n\n};\n"
  },
  {
    "path": "browser/vendor/three/EditorControls.js",
    "content": "/**\n * @author qiao / https://github.com/qiao\n * @author mrdoob / http://mrdoob.com\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n */\n\nTHREE.EditorControls = function ( object, domElement ) {\n\n\tdomElement = ( domElement !== undefined ) ? domElement : document;\n\n\t// API\n\n\tthis.enabled = true;\n\tthis.center = new THREE.Vector3();\n\n\t// internals\n\n\tvar scope = this;\n\tvar vector = new THREE.Vector3();\n\n\tvar STATE = { NONE: - 1, ROTATE: 0, ZOOM: 1, PAN: 2 };\n\tvar state = STATE.NONE;\n\n\tvar center = this.center;\n\tvar normalMatrix = new THREE.Matrix3();\n\tvar pointer = new THREE.Vector2();\n\tvar pointerOld = new THREE.Vector2();\n\n\t// events\n\n\tvar changeEvent = { type: 'change' };\n\n\tthis.focus = function ( target, frame ) {\n\n\t\tvar scale = new THREE.Vector3();\n\t\ttarget.matrixWorld.decompose( center, new THREE.Quaternion(), scale );\n\n\t\tif ( frame && target.geometry ) {\n\n\t\t\tscale = ( scale.x + scale.y + scale.z ) / 3;\n\t\t\tcenter.add( target.geometry.boundingSphere.center.clone().multiplyScalar( scale ) );\n\t\t\tvar radius = target.geometry.boundingSphere.radius * ( scale );\n\t\t\tvar pos = object.position.clone().sub( center ).normalize().multiplyScalar( radius * 2 );\n\t\t\tobject.position.copy( center ).add( pos );\n\n\t\t}\n\n\t\tobject.lookAt( center );\n\n\t\tscope.dispatchEvent( changeEvent );\n\n\t};\n\n\tthis.pan = function ( delta ) {\n\n\t\tvar distance = object.position.distanceTo( center );\n\n\t\tdelta.multiplyScalar( distance * 0.001 );\n\t\tdelta.applyMatrix3( normalMatrix.getNormalMatrix( object.matrix ) );\n\n\t\tobject.position.add( delta );\n\t\tcenter.add( delta );\n\n\t\tscope.dispatchEvent( changeEvent );\n\n\t};\n\n\tthis.zoom = function ( delta ) {\n\n\t\tvar distance = object.position.distanceTo( center );\n\n\t\tdelta.multiplyScalar( distance * 0.001 );\n\n\t\t// Limit the zoom level to 10 cm\n\t\t// But let the zoom level come out of distances smaller than that\n\t\tif ( distance >= 0.01 && (distance + delta.z) <= 0.01 ) return;\n\n\t\tdelta.applyMatrix3( normalMatrix.getNormalMatrix( object.matrix ) );\n\n\t\tobject.position.add( delta );\n\n\t\tscope.dispatchEvent( changeEvent );\n\n\t};\n\n\tthis.rotate = function ( delta ) {\n\n\t\tvector.copy( object.position ).sub( center );\n\n\t\tvar theta = Math.atan2( vector.x, vector.z );\n\t\tvar phi = Math.atan2( Math.sqrt( vector.x * vector.x + vector.z * vector.z ), vector.y );\n\n\t\ttheta += delta.x;\n\t\tphi += delta.y;\n\n\t\tvar EPS = 0.000001;\n\n\t\tphi = Math.max( EPS, Math.min( Math.PI - EPS, phi ) );\n\n\t\tvar radius = vector.length();\n\n\t\tvector.x = radius * Math.sin( phi ) * Math.sin( theta );\n\t\tvector.y = radius * Math.cos( phi );\n\t\tvector.z = radius * Math.sin( phi ) * Math.cos( theta );\n\n\t\tobject.position.copy( center ).add( vector );\n\n\t\tobject.lookAt( center );\n\n\t\tscope.dispatchEvent( changeEvent );\n\n\t};\n\n\t// mouse\n\n\tfunction onMouseDown( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tif ( event.button === 0 ) {\n\n\t\t\tstate = STATE.ROTATE;\n\n\t\t} else if ( event.button === 1 ) {\n\n\t\t\tstate = STATE.ZOOM;\n\n\t\t} else if ( event.button === 2 ) {\n\n\t\t\tstate = STATE.PAN;\n\n\t\t}\n\n\t\tpointerOld.set( event.clientX, event.clientY );\n\n\t\tdomElement.addEventListener( 'mousemove', onMouseMove, false );\n\t\tdomElement.addEventListener( 'mouseup', onMouseUp, false );\n\t\tdomElement.addEventListener( 'mouseout', onMouseUp, false );\n\t\tdomElement.addEventListener( 'dblclick', onMouseUp, false );\n\n\t}\n\n\tfunction onMouseMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tpointer.set( event.clientX, event.clientY );\n\n\t\tvar movementX = pointer.x - pointerOld.x;\n\t\tvar movementY = pointer.y - pointerOld.y;\n\n\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\tscope.rotate( new THREE.Vector3( - movementX * 0.005, - movementY * 0.005, 0 ) );\n\n\t\t} else if ( state === STATE.ZOOM ) {\n\n\t\t\tscope.zoom( new THREE.Vector3( 0, 0, movementY ) );\n\n\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\tscope.pan( new THREE.Vector3( - movementX, movementY, 0 ) );\n\n\t\t}\n\n\t\tpointerOld.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction onMouseUp( event ) {\n\n\t\tdomElement.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tdomElement.removeEventListener( 'mouseup', onMouseUp, false );\n\t\tdomElement.removeEventListener( 'mouseout', onMouseUp, false );\n\t\tdomElement.removeEventListener( 'dblclick', onMouseUp, false );\n\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tfunction onMouseWheel( event ) {\n\n\t\tevent.preventDefault();\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tvar delta = 0;\n\n\t\tif ( event.wheelDelta ) {\n\n\t\t\t// WebKit / Opera / Explorer 9\n\n\t\t\tdelta = - event.wheelDelta;\n\n\t\t} else if ( event.detail ) {\n\n\t\t\t// Firefox\n\n\t\t\tdelta = event.detail * 10;\n\n\t\t}\n\n\t\tscope.zoom( new THREE.Vector3( 0, 0, delta ) );\n\n\t}\n\n\tfunction contextmenu( event ) {\n\n\t\tevent.preventDefault();\n\n\t}\n\n\tthis.dispose = function() {\n\n\t\tdomElement.removeEventListener( 'contextmenu', contextmenu, false );\n\t\tdomElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\tdomElement.removeEventListener( 'mousewheel', onMouseWheel, false );\n\t\tdomElement.removeEventListener( 'MozMousePixelScroll', onMouseWheel, false ); // firefox\n\n\t\tdomElement.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tdomElement.removeEventListener( 'mouseup', onMouseUp, false );\n\t\tdomElement.removeEventListener( 'mouseout', onMouseUp, false );\n\t\tdomElement.removeEventListener( 'dblclick', onMouseUp, false );\n\n\t\tdomElement.removeEventListener( 'touchstart', touchStart, false );\n\t\tdomElement.removeEventListener( 'touchmove', touchMove, false );\n\n\t}\n\n\tdomElement.addEventListener( 'contextmenu', contextmenu, false );\n\tdomElement.addEventListener( 'mousedown', onMouseDown, false );\n\tdomElement.addEventListener( 'mousewheel', onMouseWheel, false );\n\tdomElement.addEventListener( 'MozMousePixelScroll', onMouseWheel, false ); // firefox\n\n\t// touch\n\n\tvar touch = new THREE.Vector3();\n\n\tvar touches = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ];\n\tvar prevTouches = [ new THREE.Vector3(), new THREE.Vector3(), new THREE.Vector3() ];\n\n\tvar prevDistance = null;\n\n\tfunction touchStart( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1:\n\t\t\t\ttouches[ 0 ].set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY, 0 );\n\t\t\t\ttouches[ 1 ].set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY, 0 );\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\ttouches[ 0 ].set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY, 0 );\n\t\t\t\ttouches[ 1 ].set( event.touches[ 1 ].pageX, event.touches[ 1 ].pageY, 0 );\n\t\t\t\tprevDistance = touches[ 0 ].distanceTo( touches[ 1 ] );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tprevTouches[ 0 ].copy( touches[ 0 ] );\n\t\tprevTouches[ 1 ].copy( touches[ 1 ] );\n\n\t}\n\n\n\tfunction touchMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tvar getClosest = function( touch, touches ) {\n\n\t\t\tvar closest = touches[ 0 ];\n\n\t\t\tfor ( var i in touches ) {\n\n\t\t\t\tif ( closest.distanceTo( touch ) > touches[ i ].distanceTo( touch ) ) closest = touches[ i ];\n\n\t\t\t}\n\n\t\t\treturn closest;\n\n\t\t};\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1:\n\t\t\t\ttouches[ 0 ].set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY, 0 );\n\t\t\t\ttouches[ 1 ].set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY, 0 );\n\t\t\t\tscope.rotate( touches[ 0 ].sub( getClosest( touches[ 0 ], prevTouches ) ).multiplyScalar( - 0.005 ) );\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\ttouches[ 0 ].set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY, 0 );\n\t\t\t\ttouches[ 1 ].set( event.touches[ 1 ].pageX, event.touches[ 1 ].pageY, 0 );\n\t\t\t\tdistance = touches[ 0 ].distanceTo( touches[ 1 ] );\n\t\t\t\tscope.zoom( new THREE.Vector3( 0, 0, prevDistance - distance ) );\n\t\t\t\tprevDistance = distance;\n\n\n\t\t\t\tvar offset0 = touches[ 0 ].clone().sub( getClosest( touches[ 0 ], prevTouches ) );\n\t\t\t\tvar offset1 = touches[ 1 ].clone().sub( getClosest( touches[ 1 ], prevTouches ) );\n\t\t\t\toffset0.x = - offset0.x;\n\t\t\t\toffset1.x = - offset1.x;\n\n\t\t\t\tscope.pan( offset0.add( offset1 ).multiplyScalar( 0.5 ) );\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tprevTouches[ 0 ].copy( touches[ 0 ] );\n\t\tprevTouches[ 1 ].copy( touches[ 1 ] );\n\n\t}\n\n\tdomElement.addEventListener( 'touchstart', touchStart, false );\n\tdomElement.addEventListener( 'touchmove', touchMove, false );\n\n};\n\nTHREE.EditorControls.prototype = Object.create( THREE.EventDispatcher.prototype );\nTHREE.EditorControls.prototype.constructor = THREE.EditorControls;\n"
  },
  {
    "path": "browser/vendor/three/Font.js",
    "content": "/**\n * @author zz85 / http://www.lab4games.net/zz85/blog\n * @author mrdoob / http://mrdoob.com/\n */\n\nfunction Font( data ) {\n\n\tthis.data = data;\n\n}\n\nObject.assign( Font.prototype, {\n\n\tisFont: true,\n\n\tgenerateShapes: function ( text, size, divisions ) {\n\n\t\tfunction createPaths( text ) {\n\n\t\t\tvar chars = String( text ).split( '' );\n\t\t\tvar scale = size / data.resolution;\n\t\t\tvar line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;\n\n\t\t\tvar offsetX = 0, offsetY = 0;\n\n\t\t\tvar paths = [];\n\n\t\t\tfor ( var i = 0; i < chars.length; i ++ ) {\n\n\t\t\t\tvar char = chars[ i ];\n\n\t\t\t\tif ( char === '\\n' ) {\n\n\t\t\t\t\toffsetX = 0;\n\t\t\t\t\toffsetY -= line_height;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar ret = createPath( char, scale, offsetX, offsetY );\n\t\t\t\t\toffsetX += ret.offsetX;\n\t\t\t\t\tpaths.push( ret.path );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn paths;\n\n\t\t}\n\n\t\tfunction createPath( c, scale, offsetX, offsetY ) {\n\n\t\t\tvar glyph = data.glyphs[ c ] || data.glyphs[ '?' ];\n\n\t\t\tif ( ! glyph ) return;\n\n\t\t\tvar path = new THREE.ShapePath();\n\n\t\t\tvar pts = [];\n\t\t\tvar x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste;\n\n\t\t\tif ( glyph.o ) {\n\n\t\t\t\tvar outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\t\t\tfor ( var i = 0, l = outline.length; i < l; ) {\n\n\t\t\t\t\tvar action = outline[ i ++ ];\n\n\t\t\t\t\tswitch ( action ) {\n\n\t\t\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\t\t\tcpx  = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\tcpy  = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\tTHREE.QuadraticBezierCurve( t, cpx0, cpx1, cpx );\n\t\t\t\t\t\t\t\t\tTHREE.QuadraticBezierCurve( t, cpy0, cpy1, cpy );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\t\t\tcpx  = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\tcpy  = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\tcpy2 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\tTHREE.CubicBezierCurve( t, cpx0, cpx1, cpx2, cpx );\n\t\t\t\t\t\t\t\t\tTHREE.CubicBezierCurve( t, cpy0, cpy1, cpy2, cpy );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn { offsetX: glyph.ha * scale, path: path };\n\n\t\t}\n\n\t\t//\n\n\t\tif ( size === undefined ) size = 100;\n\t\tif ( divisions === undefined ) divisions = 4;\n\n\t\tvar data = this.data;\n\n\t\tvar paths = createPaths( text );\n\t\tvar shapes = [];\n\n\t\tfor ( var p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n} );\n\n\nTHREE.Font = Font\n"
  },
  {
    "path": "browser/vendor/three/FontLoader.js",
    "content": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.FontLoader = function ( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\n\n};\n\nTHREE.FontLoader.prototype = {\n\n\tconstructor: THREE.FontLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar loader = new THREE.FileLoader( this.manager );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tvar json;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tconsole.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );\n\t\n\t\t\t\tvar fontDataMarker = 'loadFace('\n\t\t\t\tvar fontDataStart = text.indexOf(fontDataMarker)\n\n\t\t\t\tvar fontData = text\n\t\t\t\tif (fontDataStart === -1) {\n\t\t\t\t\tfontData = text\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tfontData = text.substring( fontDataStart + fontDataMarker.length, text.length - 2 )\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tjson = JSON.parse( fontData );\n\n\t\t\t}\n\n\t\t\tvar font = scope.parse( json );\n\n\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\tparse: function ( json ) {\n\n\t\treturn new THREE.Font( json );\n\n\t}\n\n};\n"
  },
  {
    "path": "browser/vendor/three/MTLLoader.js",
    "content": "/**\n * Loads a Wavefront .mtl file specifying materials\n *\n * @author angelxuanchang\n */\n\nTHREE.MTLLoader = function ( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\n\n};\n\nTHREE.MTLLoader.prototype = {\n\n\tconstructor: THREE.MTLLoader,\n\n\t/**\n\t * Loads and parses a MTL asset from a URL.\n\t *\n\t * @param {String} url - URL to the MTL file.\n\t * @param {Function} [onLoad] - Callback invoked with the loaded object.\n\t * @param {Function} [onProgress] - Callback for download progress.\n\t * @param {Function} [onError] - Callback for download errors.\n\t *\n\t * @see setPath setTexturePath\n\t *\n\t * @note In order for relative texture references to resolve correctly\n\t * you must call setPath and/or setTexturePath explicitly prior to load.\n\t */\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar loader = new THREE.FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tonLoad( scope.parse( text ) );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\t/**\n\t * Set base path for resolving references.\n\t * If set this path will be prepended to each loaded and found reference.\n\t *\n\t * @see setTexturePath\n\t * @param {String} path\n\t *\n\t * @example\n\t *     mtlLoader.setPath( 'assets/obj/' );\n\t *     mtlLoader.load( 'my.mtl', ... );\n\t */\n\tsetPath: function ( path ) {\n\n\t\tthis.path = path;\n\n\t},\n\n\t/**\n\t * Set base path for resolving texture references.\n\t * If set this path will be prepended found texture reference.\n\t * If not set and setPath is, it will be used as texture base path.\n\t *\n\t * @see setPath\n\t * @param {String} path\n\t *\n\t * @example\n\t *     mtlLoader.setPath( 'assets/obj/' );\n\t *     mtlLoader.setTexturePath( 'assets/textures/' );\n\t *     mtlLoader.load( 'my.mtl', ... );\n\t */\n\tsetTexturePath: function ( path ) {\n\n\t\tthis.texturePath = path;\n\n\t},\n\n\tsetBaseUrl: function ( path ) {\n\n\t\tconsole.warn( 'THREE.MTLLoader: .setBaseUrl() is deprecated. Use .setTexturePath( path ) for texture path or .setPath( path ) for general base path instead.' );\n\n\t\tthis.setTexturePath( path );\n\n\t},\n\n\tsetCrossOrigin: function ( value ) {\n\n\t\tthis.crossOrigin = value;\n\n\t},\n\n\tsetMaterialOptions: function ( value ) {\n\n\t\tthis.materialOptions = value;\n\n\t},\n\n\t/**\n\t * Parses a MTL file.\n\t *\n\t * @param {String} text - Content of MTL file\n\t * @return {THREE.MTLLoader.MaterialCreator}\n\t *\n\t * @see setPath setTexturePath\n\t *\n\t * @note In order for relative texture references to resolve correctly\n\t * you must call setPath and/or setTexturePath explicitly prior to parse.\n\t */\n\tparse: function ( text ) {\n\n\t\tvar lines = text.split( '\\n' );\n\t\tvar info = {};\n\t\tvar delimiter_pattern = /\\s+/;\n\t\tvar materialsInfo = {};\n\n\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\tvar line = lines[ i ];\n\t\t\tline = line.trim();\n\n\t\t\tif ( line.length === 0 || line.charAt( 0 ) === '#' ) {\n\n\t\t\t\t// Blank line or comment ignore\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tvar pos = line.indexOf( ' ' );\n\n\t\t\tvar key = ( pos >= 0 ) ? line.substring( 0, pos ) : line;\n\t\t\tkey = key.toLowerCase();\n\n\t\t\tvar value = ( pos >= 0 ) ? line.substring( pos + 1 ) : '';\n\t\t\tvalue = value.trim();\n\n\t\t\tif ( key === 'newmtl' ) {\n\n\t\t\t\t// New material\n\n\t\t\t\tinfo = { name: value };\n\t\t\t\tmaterialsInfo[ value ] = info;\n\n\t\t\t} else if ( info ) {\n\n\t\t\t\tif ( key === 'ka' || key === 'kd' || key === 'ks' ) {\n\n\t\t\t\t\tvar ss = value.split( delimiter_pattern, 3 );\n\t\t\t\t\tinfo[ key ] = [ parseFloat( ss[ 0 ] ), parseFloat( ss[ 1 ] ), parseFloat( ss[ 2 ] ) ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tinfo[ key ] = value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar materialCreator = new THREE.MTLLoader.MaterialCreator( this.texturePath || this.path, this.materialOptions );\n\t\tmaterialCreator.setCrossOrigin( this.crossOrigin );\n\t\tmaterialCreator.setManager( this.manager );\n\t\tmaterialCreator.setMaterials( materialsInfo );\n\t\treturn materialCreator;\n\n\t}\n\n};\n\n/**\n * Create a new THREE-MTLLoader.MaterialCreator\n * @param baseUrl - Url relative to which textures are loaded\n * @param options - Set of options on how to construct the materials\n *                  side: Which side to apply the material\n *                        THREE.FrontSide (default), THREE.BackSide, THREE.DoubleSide\n *                  wrap: What type of wrapping to apply for textures\n *                        THREE.RepeatWrapping (default), THREE.ClampToEdgeWrapping, THREE.MirroredRepeatWrapping\n *                  normalizeRGB: RGBs need to be normalized to 0-1 from 0-255\n *                                Default: false, assumed to be already normalized\n *                  ignoreZeroRGBs: Ignore values of RGBs (Ka,Kd,Ks) that are all 0's\n *                                  Default: false\n * @constructor\n */\n\nTHREE.MTLLoader.MaterialCreator = function ( baseUrl, options ) {\n\n\tthis.baseUrl = baseUrl || '';\n\tthis.options = options;\n\tthis.materialsInfo = {};\n\tthis.materials = {};\n\tthis.materialsArray = [];\n\tthis.nameLookup = {};\n\n\tthis.side = ( this.options && this.options.side ) ? this.options.side : THREE.FrontSide;\n\tthis.wrap = ( this.options && this.options.wrap ) ? this.options.wrap : THREE.RepeatWrapping;\n\n};\n\nTHREE.MTLLoader.MaterialCreator.prototype = {\n\n\tconstructor: THREE.MTLLoader.MaterialCreator,\n\n\tcrossOrigin: 'Anonymous',\n\n\tsetCrossOrigin: function ( value ) {\n\n\t\tthis.crossOrigin = value;\n\n\t},\n\n\tsetManager: function ( value ) {\n\n\t\tthis.manager = value;\n\n\t},\n\n\tsetMaterials: function ( materialsInfo ) {\n\n\t\tthis.materialsInfo = this.convert( materialsInfo );\n\t\tthis.materials = {};\n\t\tthis.materialsArray = [];\n\t\tthis.nameLookup = {};\n\n\t},\n\n\tconvert: function ( materialsInfo ) {\n\n\t\tif ( ! this.options ) return materialsInfo;\n\n\t\tvar converted = {};\n\n\t\tfor ( var mn in materialsInfo ) {\n\n\t\t\t// Convert materials info into normalized form based on options\n\n\t\t\tvar mat = materialsInfo[ mn ];\n\n\t\t\tvar covmat = {};\n\n\t\t\tconverted[ mn ] = covmat;\n\n\t\t\tfor ( var prop in mat ) {\n\n\t\t\t\tvar save = true;\n\t\t\t\tvar value = mat[ prop ];\n\t\t\t\tvar lprop = prop.toLowerCase();\n\n\t\t\t\tswitch ( lprop ) {\n\n\t\t\t\t\tcase 'kd':\n\t\t\t\t\tcase 'ka':\n\t\t\t\t\tcase 'ks':\n\n\t\t\t\t\t\t// Diffuse color (color under white light) using RGB values\n\n\t\t\t\t\t\tif ( this.options && this.options.normalizeRGB ) {\n\n\t\t\t\t\t\t\tvalue = [ value[ 0 ] / 255, value[ 1 ] / 255, value[ 2 ] / 255 ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( this.options && this.options.ignoreZeroRGBs ) {\n\n\t\t\t\t\t\t\tif ( value[ 0 ] === 0 && value[ 1 ] === 0 && value[ 2 ] === 0 ) {\n\n\t\t\t\t\t\t\t\t// ignore\n\n\t\t\t\t\t\t\t\tsave = false;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tif ( save ) {\n\n\t\t\t\t\tcovmat[ lprop ] = value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn converted;\n\n\t},\n\n\tpreload: function () {\n\n\t\tfor ( var mn in this.materialsInfo ) {\n\n\t\t\tthis.create( mn );\n\n\t\t}\n\n\t},\n\n\tgetIndex: function ( materialName ) {\n\n\t\treturn this.nameLookup[ materialName ];\n\n\t},\n\n\tgetAsArray: function () {\n\n\t\tvar index = 0;\n\n\t\tfor ( var mn in this.materialsInfo ) {\n\n\t\t\tthis.materialsArray[ index ] = this.create( mn );\n\t\t\tthis.nameLookup[ mn ] = index;\n\t\t\tindex ++;\n\n\t\t}\n\n\t\treturn this.materialsArray;\n\n\t},\n\n\tcreate: function ( materialName ) {\n\n\t\tif ( this.materials[ materialName ] === undefined ) {\n\n\t\t\tthis.createMaterial_( materialName );\n\n\t\t}\n\n\t\treturn this.materials[ materialName ];\n\n\t},\n\n\tcreateMaterial_: function ( materialName ) {\n\n\t\t// Create material\n\n\t\tvar scope = this;\n\t\tvar mat = this.materialsInfo[ materialName ];\n\t\tvar params = {\n\n\t\t\tname: materialName,\n\t\t\tside: this.side\n\n\t\t};\n\n\t\tfunction resolveURL( baseUrl, url ) {\n\n\t\t\tif ( typeof url !== 'string' || url === '' )\n\t\t\t\treturn '';\n\n\t\t\t// Absolute URL\n\t\t\tif ( /^https?:\\/\\//i.test( url ) ) return url;\n\n\t\t\treturn baseUrl + url;\n\n\t\t}\n\n\t\tfunction setMapForType( mapType, value ) {\n\n\t\t\tif ( params[ mapType ] ) return; // Keep the first encountered texture\n\n\t\t\tvar texParams = scope.getTextureParams( value, params );\n\t\t\tvar map = scope.loadTexture( resolveURL( scope.baseUrl, texParams.url ) );\n\n\t\t\tmap.repeat.copy( texParams.scale );\n\t\t\tmap.offset.copy( texParams.offset );\n\n\t\t\tmap.wrapS = scope.wrap;\n\t\t\tmap.wrapT = scope.wrap;\n\n\t\t\tparams[ mapType ] = map;\n\n\t\t}\n\n\t\tfor ( var prop in mat ) {\n\n\t\t\tvar value = mat[ prop ];\n\t\t\tvar n;\n\n\t\t\tif ( value === '' ) continue;\n\n\t\t\tswitch ( prop.toLowerCase() ) {\n\n\t\t\t\t// Ns is material specular exponent\n\n\t\t\t\tcase 'kd':\n\n\t\t\t\t\t// Diffuse color (color under white light) using RGB values\n\n\t\t\t\t\tparams.color = new THREE.Color().fromArray( value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ks':\n\n\t\t\t\t\t// Specular color (color when light is reflected from shiny surface) using RGB values\n\t\t\t\t\tparams.specular = new THREE.Color().fromArray( value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map_kd':\n\n\t\t\t\t\t// Diffuse texture map\n\n\t\t\t\t\tsetMapForType( \"map\", value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map_ks':\n\n\t\t\t\t\t// Specular map\n\n\t\t\t\t\tsetMapForType( \"specularMap\", value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'norm':\n\n\t\t\t\t\tsetMapForType( \"normalMap\", value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map_bump':\n\t\t\t\tcase 'bump':\n\n\t\t\t\t\t// Bump texture map\n\n\t\t\t\t\tsetMapForType( \"bumpMap\", value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ns':\n\n\t\t\t\t\t// The specular exponent (defines the focus of the specular highlight)\n\t\t\t\t\t// A high exponent results in a tight, concentrated highlight. Ns values normally range from 0 to 1000.\n\n\t\t\t\t\tparams.shininess = parseFloat( value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'd':\n\t\t\t\t\tn = parseFloat(value);\n\n\t\t\t\t\tif ( n < 1 ) {\n\n\t\t\t\t\t\tparams.opacity = n;\n\t\t\t\t\t\tparams.transparent = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'tr':\n\t\t\t\t\tn = parseFloat(value);\n\n\t\t\t\t\tif ( n > 0 ) {\n\n\t\t\t\t\t\tparams.opacity = 1 - n;\n\t\t\t\t\t\tparams.transparent = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.materials[ materialName ] = new THREE.MeshPhongMaterial( params );\n\t\treturn this.materials[ materialName ];\n\n\t},\n\n\tgetTextureParams: function ( value, matParams ) {\n\n\t\tvar texParams = {\n\n\t\t\tscale: new THREE.Vector2( 1, 1 ),\n\t\t\toffset: new THREE.Vector2( 0, 0 )\n\n\t\t };\n\n\t\tvar items = value.split( /\\s+/ );\n\t\tvar pos;\n\n\t\tpos = items.indexOf( '-bm' );\n\n\t\tif ( pos >= 0 ) {\n\n\t\t\tmatParams.bumpScale = parseFloat( items[ pos + 1 ] );\n\t\t\titems.splice( pos, 2 );\n\n\t\t}\n\n\t\tpos = items.indexOf( '-s' );\n\n\t\tif ( pos >= 0 ) {\n\n\t\t\ttexParams.scale.set( parseFloat( items[ pos + 1 ] ), parseFloat( items[ pos + 2 ] ) );\n\t\t\titems.splice( pos, 4 ); // we expect 3 parameters here!\n\n\t\t}\n\n\t\tpos = items.indexOf( '-o' );\n\n\t\tif ( pos >= 0 ) {\n\n\t\t\ttexParams.offset.set( parseFloat( items[ pos + 1 ] ), parseFloat( items[ pos + 2 ] ) );\n\t\t\titems.splice( pos, 4 ); // we expect 3 parameters here!\n\n\t\t}\n\n\t\ttexParams.url = items.join( ' ' ).trim();\n\t\treturn texParams;\n\n\t},\n\n\tloadTexture: function ( url, mapping, onLoad, onProgress, onError ) {\n\n\t\tvar texture;\n\t\tvar loader = THREE.Loader.Handlers.get( url );\n\t\tvar manager = ( this.manager !== undefined ) ? this.manager : THREE.DefaultLoadingManager;\n\n\t\tif ( loader === null ) {\n\n\t\t\tloader = new THREE.TextureLoader( manager );\n\n\t\t}\n\n\t\tif ( loader.setCrossOrigin ) loader.setCrossOrigin( this.crossOrigin );\n\t\ttexture = loader.load( url, onLoad, onProgress, onError );\n\n\t\tif ( mapping !== undefined ) texture.mapping = mapping;\n\n\t\treturn texture;\n\n\t}\n\n};\n"
  },
  {
    "path": "browser/vendor/three/MorphAnimMesh.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.MorphAnimMesh = function ( geometry, material ) {\n\n\tTHREE.Mesh.call( this, geometry, material );\n\n\tthis.type = 'MorphAnimMesh';\n\n\tthis.mixer = new THREE.AnimationMixer( this );\n\tthis.activeAction = null;\n};\n\nTHREE.MorphAnimMesh.prototype = Object.create( THREE.Mesh.prototype );\nTHREE.MorphAnimMesh.prototype.constructor = THREE.MorphAnimMesh;\n\nTHREE.MorphAnimMesh.prototype.setDirectionForward = function () {\n\n\tthis.mixer.timeScale = 1.0;\n\n};\n\nTHREE.MorphAnimMesh.prototype.setDirectionBackward = function () {\n\n\tthis.mixer.timeScale = -1.0;\n\n};\n\nTHREE.MorphAnimMesh.prototype.playAnimation = function ( label, fps ) {\n\n\tif( this.activeAction ) {\n\n\t\tthis.activeAction.stop();\n\t\tthis.activeAction = null;\n\t\t\n\t}\n\n\tvar clip = THREE.AnimationClip.findByName( this, label );\n\n\tif ( clip ) {\n\n\t\tvar action = this.mixer.clipAction( clip );\n\t\taction.timeScale = ( clip.tracks.length * fps ) / clip.duration;\n\t\tthis.activeAction = action.play();\n\n\t} else {\n\n\t\tthrow new Error( 'THREE.MorphAnimMesh: animations[' + label + '] undefined in .playAnimation()' );\n\n\t}\n\n};\n\nTHREE.MorphAnimMesh.prototype.updateAnimation = function ( delta ) {\n\n\tthis.mixer.update( delta );\n\n};\n\nTHREE.MorphAnimMesh.prototype.copy = function ( source ) {\n\n\tTHREE.Mesh.prototype.copy.call( this, source );\n\n\tthis.mixer = new THREE.AnimationMixer( this );\n\n\treturn this;\n\n};\n"
  },
  {
    "path": "browser/vendor/three/OBJLoader.js",
    "content": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.OBJLoader = ( function () {\n\n\t// o object_name | g group_name\n\tvar object_pattern           = /^[og]\\s*(.+)?/;\n\t// mtllib file_reference\n\tvar material_library_pattern = /^mtllib /;\n\t// usemtl material_name\n\tvar material_use_pattern     = /^usemtl /;\n\n\tfunction ParserState() {\n\n\t\tvar state = {\n\t\t\tobjects  : [],\n\t\t\tobject   : {},\n\n\t\t\tvertices : [],\n\t\t\tnormals  : [],\n\t\t\tuvs      : [],\n\n\t\t\tmaterialLibraries : [],\n\n\t\t\tstartObject: function ( name, fromDeclaration ) {\n\n\t\t\t\t// If the current object (initial from reset) is not from a g/o declaration in the parsed\n\t\t\t\t// file. We need to use it for the first parsed g/o to keep things in sync.\n\t\t\t\tif ( this.object && this.object.fromDeclaration === false ) {\n\n\t\t\t\t\tthis.object.name = name;\n\t\t\t\t\tthis.object.fromDeclaration = ( fromDeclaration !== false );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tvar previousMaterial = ( this.object && typeof this.object.currentMaterial === 'function' ? this.object.currentMaterial() : undefined );\n\n\t\t\t\tif ( this.object && typeof this.object._finalize === 'function' ) {\n\n\t\t\t\t\tthis.object._finalize( true );\n\n\t\t\t\t}\n\n\t\t\t\tthis.object = {\n\t\t\t\t\tname : name || '',\n\t\t\t\t\tfromDeclaration : ( fromDeclaration !== false ),\n\n\t\t\t\t\tgeometry : {\n\t\t\t\t\t\tvertices : [],\n\t\t\t\t\t\tnormals  : [],\n\t\t\t\t\t\tuvs      : []\n\t\t\t\t\t},\n\t\t\t\t\tmaterials : [],\n\t\t\t\t\tsmooth : true,\n\n\t\t\t\t\tstartMaterial: function ( name, libraries ) {\n\n\t\t\t\t\t\tvar previous = this._finalize( false );\n\n\t\t\t\t\t\t// New usemtl declaration overwrites an inherited material, except if faces were declared\n\t\t\t\t\t\t// after the material, then it must be preserved for proper MultiMaterial continuation.\n\t\t\t\t\t\tif ( previous && ( previous.inherited || previous.groupCount <= 0 ) ) {\n\n\t\t\t\t\t\t\tthis.materials.splice( previous.index, 1 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar material = {\n\t\t\t\t\t\t\tindex      : this.materials.length,\n\t\t\t\t\t\t\tname       : name || '',\n\t\t\t\t\t\t\tmtllib     : ( Array.isArray( libraries ) && libraries.length > 0 ? libraries[ libraries.length - 1 ] : '' ),\n\t\t\t\t\t\t\tsmooth     : ( previous !== undefined ? previous.smooth : this.smooth ),\n\t\t\t\t\t\t\tgroupStart : ( previous !== undefined ? previous.groupEnd : 0 ),\n\t\t\t\t\t\t\tgroupEnd   : -1,\n\t\t\t\t\t\t\tgroupCount : -1,\n\t\t\t\t\t\t\tinherited  : false,\n\n\t\t\t\t\t\t\tclone: function ( index ) {\n\t\t\t\t\t\t\t\tvar cloned = {\n\t\t\t\t\t\t\t\t\tindex      : ( typeof index === 'number' ? index : this.index ),\n\t\t\t\t\t\t\t\t\tname       : this.name,\n\t\t\t\t\t\t\t\t\tmtllib     : this.mtllib,\n\t\t\t\t\t\t\t\t\tsmooth     : this.smooth,\n\t\t\t\t\t\t\t\t\tgroupStart : 0,\n\t\t\t\t\t\t\t\t\tgroupEnd   : -1,\n\t\t\t\t\t\t\t\t\tgroupCount : -1,\n\t\t\t\t\t\t\t\t\tinherited  : false\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tcloned.clone = this.clone.bind(cloned);\n\t\t\t\t\t\t\t\treturn cloned;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tthis.materials.push( material );\n\n\t\t\t\t\t\treturn material;\n\n\t\t\t\t\t},\n\n\t\t\t\t\tcurrentMaterial: function () {\n\n\t\t\t\t\t\tif ( this.materials.length > 0 ) {\n\t\t\t\t\t\t\treturn this.materials[ this.materials.length - 1 ];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn undefined;\n\n\t\t\t\t\t},\n\n\t\t\t\t\t_finalize: function ( end ) {\n\n\t\t\t\t\t\tvar lastMultiMaterial = this.currentMaterial();\n\t\t\t\t\t\tif ( lastMultiMaterial && lastMultiMaterial.groupEnd === -1 ) {\n\n\t\t\t\t\t\t\tlastMultiMaterial.groupEnd = this.geometry.vertices.length / 3;\n\t\t\t\t\t\t\tlastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart;\n\t\t\t\t\t\t\tlastMultiMaterial.inherited = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Ignore objects tail materials if no face declarations followed them before a new o/g started.\n\t\t\t\t\t\tif ( end && this.materials.length > 1 ) {\n\n\t\t\t\t\t\t\tfor ( var mi = this.materials.length - 1; mi >= 0; mi-- ) {\n\t\t\t\t\t\t\t\tif ( this.materials[ mi ].groupCount <= 0 ) {\n\t\t\t\t\t\t\t\t\tthis.materials.splice( mi, 1 );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Guarantee at least one empty material, this makes the creation later more straight forward.\n\t\t\t\t\t\tif ( end && this.materials.length === 0 ) {\n\n\t\t\t\t\t\t\tthis.materials.push({\n\t\t\t\t\t\t\t\tname   : '',\n\t\t\t\t\t\t\t\tsmooth : this.smooth\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn lastMultiMaterial;\n\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Inherit previous objects material.\n\t\t\t\t// Spec tells us that a declared material must be set to all objects until a new material is declared.\n\t\t\t\t// If a usemtl declaration is encountered while this new object is being parsed, it will\n\t\t\t\t// overwrite the inherited material. Exception being that there was already face declarations\n\t\t\t\t// to the inherited material, then it will be preserved for proper MultiMaterial continuation.\n\n\t\t\t\tif ( previousMaterial && previousMaterial.name && typeof previousMaterial.clone === 'function' ) {\n\n\t\t\t\t\tvar declared = previousMaterial.clone( 0 );\n\t\t\t\t\tdeclared.inherited = true;\n\t\t\t\t\tthis.object.materials.push( declared );\n\n\t\t\t\t}\n\n\t\t\t\tthis.objects.push( this.object );\n\n\t\t\t},\n\n\t\t\tfinalize: function () {\n\n\t\t\t\tif ( this.object && typeof this.object._finalize === 'function' ) {\n\n\t\t\t\t\tthis.object._finalize( true );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tparseVertexIndex: function ( value, len ) {\n\n\t\t\t\tvar index = parseInt( value, 10 );\n\t\t\t\treturn ( index >= 0 ? index - 1 : index + len / 3 ) * 3;\n\n\t\t\t},\n\n\t\t\tparseNormalIndex: function ( value, len ) {\n\n\t\t\t\tvar index = parseInt( value, 10 );\n\t\t\t\treturn ( index >= 0 ? index - 1 : index + len / 3 ) * 3;\n\n\t\t\t},\n\n\t\t\tparseUVIndex: function ( value, len ) {\n\n\t\t\t\tvar index = parseInt( value, 10 );\n\t\t\t\treturn ( index >= 0 ? index - 1 : index + len / 2 ) * 2;\n\n\t\t\t},\n\n\t\t\taddVertex: function ( a, b, c ) {\n\n\t\t\t\tvar src = this.vertices;\n\t\t\t\tvar dst = this.object.geometry.vertices;\n\n\t\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\t\t\t\tdst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );\n\t\t\t\tdst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );\n\n\t\t\t},\n\n\t\t\taddVertexLine: function ( a ) {\n\n\t\t\t\tvar src = this.vertices;\n\t\t\t\tvar dst = this.object.geometry.vertices;\n\n\t\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\n\t\t\t},\n\n\t\t\taddNormal: function ( a, b, c ) {\n\n\t\t\t\tvar src = this.normals;\n\t\t\t\tvar dst = this.object.geometry.normals;\n\n\t\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\t\t\t\tdst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );\n\t\t\t\tdst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );\n\n\t\t\t},\n\n\t\t\taddUV: function ( a, b, c ) {\n\n\t\t\t\tvar src = this.uvs;\n\t\t\t\tvar dst = this.object.geometry.uvs;\n\n\t\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ] );\n\t\t\t\tdst.push( src[ b + 0 ], src[ b + 1 ] );\n\t\t\t\tdst.push( src[ c + 0 ], src[ c + 1 ] );\n\n\t\t\t},\n\n\t\t\taddUVLine: function ( a ) {\n\n\t\t\t\tvar src = this.uvs;\n\t\t\t\tvar dst = this.object.geometry.uvs;\n\n\t\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ] );\n\n\t\t\t},\n\n\t\t\taddFace: function ( a, b, c, ua, ub, uc, na, nb, nc ) {\n\n\t\t\t\tvar vLen = this.vertices.length;\n\n\t\t\t\tvar ia = this.parseVertexIndex( a, vLen );\n\t\t\t\tvar ib = this.parseVertexIndex( b, vLen );\n\t\t\t\tvar ic = this.parseVertexIndex( c, vLen );\n\n\t\t\t\tthis.addVertex( ia, ib, ic );\n\n\t\t\t\tif ( ua !== undefined ) {\n\n\t\t\t\t\tvar uvLen = this.uvs.length;\n\n\t\t\t\t\tia = this.parseUVIndex( ua, uvLen );\n\t\t\t\t\tib = this.parseUVIndex( ub, uvLen );\n\t\t\t\t\tic = this.parseUVIndex( uc, uvLen );\n\n\t\t\t\t\tthis.addUV( ia, ib, ic );\n\n\t\t\t\t}\n\n\t\t\t\tif ( na !== undefined ) {\n\n\t\t\t\t\t// Normals are many times the same. If so, skip function call and parseInt.\n\t\t\t\t\tvar nLen = this.normals.length;\n\t\t\t\t\tia = this.parseNormalIndex( na, nLen );\n\n\t\t\t\t\tib = na === nb ? ia : this.parseNormalIndex( nb, nLen );\n\t\t\t\t\tic = na === nc ? ia : this.parseNormalIndex( nc, nLen );\n\n\t\t\t\t\tthis.addNormal( ia, ib, ic );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\taddLineGeometry: function ( vertices, uvs ) {\n\n\t\t\t\tthis.object.geometry.type = 'Line';\n\n\t\t\t\tvar vLen = this.vertices.length;\n\t\t\t\tvar uvLen = this.uvs.length;\n\n\t\t\t\tfor ( var vi = 0, l = vertices.length; vi < l; vi ++ ) {\n\n\t\t\t\t\tthis.addVertexLine( this.parseVertexIndex( vertices[ vi ], vLen ) );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var uvi = 0, l = uvs.length; uvi < l; uvi ++ ) {\n\n\t\t\t\t\tthis.addUVLine( this.parseUVIndex( uvs[ uvi ], uvLen ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tstate.startObject( '', false );\n\n\t\treturn state;\n\n\t}\n\n\t//\n\n\tfunction OBJLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\n\n\t\tthis.materials = null;\n\n\t};\n\n\tOBJLoader.prototype = {\n\n\t\tconstructor: OBJLoader,\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new THREE.FileLoader( scope.manager );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.load( url, function ( text ) {\n\t      var geoms_and_mats = scope.parse( text );\n\n\t      onLoad(geoms_and_mats.geometries, geoms_and_mats.materials);\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\n\t\t},\n\n\t\tsetMaterials: function ( materials ) {\n\n\t\t\tthis.materials = materials;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tparse: function ( text ) {\n\n\t\t\tconsole.time( 'OBJLoader' );\n\n\t\t\tvar state = new ParserState();\n\n\t\t\tif ( text.indexOf( '\\r\\n' ) !== - 1 ) {\n\n\t\t\t\t// This is faster than String.split with regex that splits on both\n\t\t\t\ttext = text.replace( /\\r\\n/g, '\\n' );\n\n\t\t\t}\n\n\t\t\tif ( text.indexOf( '\\\\\\n' ) !== - 1) {\n\n\t\t\t\t// join lines separated by a line continuation character (\\)\n\t\t\t\ttext = text.replace( /\\\\\\n/g, '' );\n\n\t\t\t}\n\n\t\t\tvar lines = text.split( '\\n' );\n\t\t\tvar line = '', lineFirstChar = '';\n\t\t\tvar lineLength = 0;\n\t\t\tvar result = [];\n\n\t\t\t// Faster to just trim left side of the line. Use if available.\n\t\t\tvar trimLeft = ( typeof ''.trimLeft === 'function' );\n\n\t\t\tfor ( var i = 0, l = lines.length; i < l; i ++ ) {\n\n\t\t\t\tline = lines[ i ];\n\n\t\t\t\tline = trimLeft ? line.trimLeft() : line.trim();\n\n\t\t\t\tlineLength = line.length;\n\n\t\t\t\tif ( lineLength === 0 ) continue;\n\n\t\t\t\tlineFirstChar = line.charAt( 0 );\n\n\t\t\t\t// @todo invoke passed in handler if any\n\t\t\t\tif ( lineFirstChar === '#' ) continue;\n\n\t\t\t\tif ( lineFirstChar === 'v' ) {\n\n\t\t\t\t\tvar data = line.split( /\\s+/ );\n\n\t\t\t\t\tswitch ( data[ 0 ] ) {\n\n\t\t\t\t\t\tcase 'v':\n\t\t\t\t\t\t\tstate.vertices.push(\n\t\t\t\t\t\t\t\tparseFloat( data[ 1 ] ),\n\t\t\t\t\t\t\t\tparseFloat( data[ 2 ] ),\n\t\t\t\t\t\t\t\tparseFloat( data[ 3 ] )\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'vn':\n\t\t\t\t\t\t\tstate.normals.push(\n\t\t\t\t\t\t\t\tparseFloat( data[ 1 ] ),\n\t\t\t\t\t\t\t\tparseFloat( data[ 2 ] ),\n\t\t\t\t\t\t\t\tparseFloat( data[ 3 ] )\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'vt':\n\t\t\t\t\t\t\tstate.uvs.push(\n\t\t\t\t\t\t\t\tparseFloat( data[ 1 ] ),\n\t\t\t\t\t\t\t\tparseFloat( data[ 2 ] )\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( lineFirstChar === 'f' ) {\n\n\t\t\t\t\tvar lineData = line.substr( 1 ).trim();\n\t\t\t\t\tvar vertexData = lineData.split( /\\s+/ );\n\t\t\t\t\tvar faceVertices = [];\n\n\t\t\t\t\t// Parse the face vertex data into an easy to work with format\n\n\t\t\t\t\tfor ( var j = 0, jl = vertexData.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar vertex = vertexData[ j ];\n\n\t\t\t\t\t\tif ( vertex.length > 0 ) {\n\n\t\t\t\t\t\t\tvar vertexParts = vertex.split( '/' );\n\t\t\t\t\t\t\tfaceVertices.push( vertexParts );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Draw an edge between the first vertex and all subsequent vertices to form an n-gon\n\n\t\t\t\t\tvar v1 = faceVertices[ 0 ];\n\n\t\t\t\t\tfor ( var j = 1, jl = faceVertices.length - 1; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar v2 = faceVertices[ j ];\n\t\t\t\t\t\tvar v3 = faceVertices[ j + 1 ];\n\n\t\t\t\t\t\tstate.addFace(\n\t\t\t\t\t\t\tv1[ 0 ], v2[ 0 ], v3[ 0 ],\n\t\t\t\t\t\t\tv1[ 1 ], v2[ 1 ], v3[ 1 ],\n\t\t\t\t\t\t\tv1[ 2 ], v2[ 2 ], v3[ 2 ]\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( lineFirstChar === 'l' ) {\n\n\t\t\t\t\t// TODO XXX FIXME HACK\n\t\t\t\t\t// drop these like the old loader used to\n\t\t\t\t\t// fixes Machinedrum - Ocean of Thought obj's\n\t\t\t\t\tcontinue;\n\n\t\t\t\t\tvar lineParts = line.substring( 1 ).trim().split( \" \" );\n\t\t\t\t\tvar lineVertices = [], lineUVs = [];\n\n\t\t\t\t\tif ( line.indexOf( \"/\" ) === - 1 ) {\n\n\t\t\t\t\t\tlineVertices = lineParts;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var li = 0, llen = lineParts.length; li < llen; li ++ ) {\n\n\t\t\t\t\t\t\tvar parts = lineParts[ li ].split( \"/\" );\n\n\t\t\t\t\t\t\tif ( parts[ 0 ] !== \"\" ) lineVertices.push( parts[ 0 ] );\n\t\t\t\t\t\t\tif ( parts[ 1 ] !== \"\" ) lineUVs.push( parts[ 1 ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tstate.addLineGeometry( lineVertices, lineUVs );\n\n\t\t\t\t} else if ( ( result = object_pattern.exec( line ) ) !== null ) {\n\n\t\t\t\t\t// o object_name\n\t\t\t\t\t// or\n\t\t\t\t\t// g group_name\n\n\t\t\t\t\t// WORKAROUND: https://bugs.chromium.org/p/v8/issues/detail?id=2869\n\t\t\t\t\t// var name = result[ 0 ].substr( 1 ).trim();\n\t\t\t\t\tvar name = ( \" \" + result[ 0 ].substr( 1 ).trim() ).substr( 1 );\n\n\t\t\t\t\tstate.startObject( name );\n\n\t\t\t\t} else if ( material_use_pattern.test( line ) ) {\n\n\t\t\t\t\t// material\n\n\t\t\t\t\tstate.object.startMaterial( line.substring( 7 ).trim(), state.materialLibraries );\n\n\t\t\t\t} else if ( material_library_pattern.test( line ) ) {\n\n\t\t\t\t\t// mtl file\n\n\t\t\t\t\tstate.materialLibraries.push( line.substring( 7 ).trim() );\n\n\t\t\t\t} else if ( lineFirstChar === 's' ) {\n\n\t\t\t\t\tresult = line.split( ' ' );\n\n\t\t\t\t\t// smooth shading\n\n\t\t\t\t\t// @todo Handle files that have varying smooth values for a set of faces inside one geometry,\n\t\t\t\t\t// but does not define a usemtl for each face set.\n\t\t\t\t\t// This should be detected and a dummy material created (later MultiMaterial and geometry groups).\n\t\t\t\t\t// This requires some care to not create extra material on each smooth value for \"normal\" obj files.\n\t\t\t\t\t// where explicit usemtl defines geometry groups.\n\t\t\t\t\t// Example asset: examples/models/obj/cerberus/Cerberus.obj\n\n\t\t\t\t\t/*\n\t\t\t\t\t * http://paulbourke.net/dataformats/obj/\n\t\t\t\t\t * or\n\t\t\t\t\t * http://www.cs.utah.edu/~boulos/cs3505/obj_spec.pdf\n\t\t\t\t\t *\n\t\t\t\t\t * From chapter \"Grouping\" Syntax explanation \"s group_number\":\n\t\t\t\t\t * \"group_number is the smoothing group number. To turn off smoothing groups, use a value of 0 or off.\n\t\t\t\t\t * Polygonal elements use group numbers to put elements in different smoothing groups. For free-form\n\t\t\t\t\t * surfaces, smoothing groups are either turned on or off; there is no difference between values greater\n\t\t\t\t\t * than 0.\"\n\t\t\t\t\t */\n\t\t\t\t\tif ( result.length > 1 ) {\n\n\t\t\t\t\t\tvar value = result[ 1 ].trim().toLowerCase();\n\t\t\t\t\t\tstate.object.smooth = ( value !== '0' && value !== 'off' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// ZBrush can produce \"s\" lines #11707\n\t\t\t\t\t\tstate.object.smooth = true;\n\n\t\t\t\t\t}\n\t\t\t\t\tvar material = state.object.currentMaterial();\n\t\t\t\t\tif ( material ) material.smooth = state.object.smooth;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Handle null terminated files without exception\n\t\t\t\t\tif ( line === '\\0' ) continue;\n\n\t\t\t\t\tthrow new Error( \"Unexpected line: '\" + line  + \"'\" );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.finalize();\n\n\t    var geoms_and_mats = {geometries: [], materials: []}\n\n\t\t\tfor ( var i = 0, l = state.objects.length; i < l; i ++ ) {\n\n\t\t\t\tvar object = state.objects[ i ];\n\t\t\t\tvar geometry = object.geometry;\n\t\t\t\tvar materials = object.materials;\n\t\t\t\tvar isLine = ( geometry.type === 'Line' );\n\n\t\t\t\t// Skip o/g line declarations that did not follow with any faces\n\t\t\t\tif ( geometry.vertices.length === 0 ) continue;\n\n\t\t\t\tvar buffergeometry = new THREE.BufferGeometry();\n\n\t\t\t\tbuffergeometry.addAttribute( 'position', new THREE.BufferAttribute( new Float32Array( geometry.vertices ), 3 ) );\n\n\t\t\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\t\t\tbuffergeometry.addAttribute( 'normal', new THREE.BufferAttribute( new Float32Array( geometry.normals ), 3 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbuffergeometry.computeVertexNormals();\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.uvs.length > 0 ) {\n\n\t\t\t\t\tbuffergeometry.addAttribute( 'uv', new THREE.BufferAttribute( new Float32Array( geometry.uvs ), 2 ) );\n\n\t\t\t\t}\n\n\t\t\t\t// Create materials\n\n\t\t\t\tvar createdMaterials = [];\n\n\t\t\t\tfor ( var mi = 0, miLen = materials.length; mi < miLen ; mi++ ) {\n\n\t\t\t\t\tvar sourceMaterial = materials[ mi ];\n\t\t\t\t\tvar material = undefined;\n\n\t\t\t\t\tif ( this.materials !== null ) {\n\n\t\t\t\t\t\tmaterial = this.materials.create( sourceMaterial.name );\n\n\t\t\t\t\t\t// mtl etc. loaders probably can't create line materials correctly, copy properties to a line material.\n\t\t\t\t\t\tif ( isLine && material && ! ( material instanceof THREE.LineBasicMaterial ) ) {\n\n\t\t\t\t\t\t\tvar materialLine = new THREE.LineBasicMaterial();\n\t\t\t\t\t\t\tmaterialLine.copy( material );\n\t\t\t\t\t\t\tmaterial = materialLine;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! material ) {\n\n\t\t\t\t\t\tmaterial = ( ! isLine ? new THREE.MeshPhongMaterial() : new THREE.LineBasicMaterial() );\n\t\t\t\t\t\tmaterial.name = sourceMaterial.name;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmaterial.flatShading = sourceMaterial.smooth ? false : true;\n\n\t\t\t\t}\n\n\t      geoms_and_mats.geometries.push(buffergeometry)\n\t      geoms_and_mats.materials.push(material)\n\n\t\t\t}\n\n\t\t\tconsole.timeEnd( 'OBJLoader' );\n\n\t\t\treturn geoms_and_mats;\n\n\t\t}\n\n\t};\n\n\treturn OBJLoader;\n\n} )();\n"
  },
  {
    "path": "browser/vendor/three/OrbitControls.js",
    "content": "/**\n * @author qiao / https://github.com/qiao\n * @author mrdoob / http://mrdoob.com\n * @author alteredq / http://alteredqualia.com/\n * @author WestLangley / http://github.com/WestLangley\n * @author erich666 / http://erichaines.com\n */\n\n// This set of controls performs orbiting, dollying (zooming), and panning.\n// Unlike TrackballControls, it maintains the \"up\" direction object.up (+Y by default).\n//\n//    Orbit - left mouse / touch: one finger move\n//    Zoom - middle mouse, or mousewheel / touch: two finger spread or squish\n//    Pan - right mouse, or arrow keys / touch: three finter swipe\n\nTHREE.OrbitControls = function ( object, domElement ) {\n\n\tthis.object = object;\n\n\tthis.domElement = ( domElement !== undefined ) ? domElement : document;\n\n\t// Set to false to disable this control\n\tthis.enabled = true;\n\n\t// \"target\" sets the location of focus, where the object orbits around\n\tthis.target = new THREE.Vector3();\n\n\t// How far you can dolly in and out ( PerspectiveCamera only )\n\tthis.minDistance = 0;\n\tthis.maxDistance = Infinity;\n\n\t// How far you can zoom in and out ( OrthographicCamera only )\n\tthis.minZoom = 0;\n\tthis.maxZoom = Infinity;\n\n\t// How far you can orbit vertically, upper and lower limits.\n\t// Range is 0 to Math.PI radians.\n\tthis.minPolarAngle = 0; // radians\n\tthis.maxPolarAngle = Math.PI; // radians\n\n\t// How far you can orbit horizontally, upper and lower limits.\n\t// If set, must be a sub-interval of the interval [ - Math.PI, Math.PI ].\n\tthis.minAzimuthAngle = - Infinity; // radians\n\tthis.maxAzimuthAngle = Infinity; // radians\n\n\t// Set to true to enable damping (inertia)\n\t// If damping is enabled, you must call controls.update() in your animation loop\n\tthis.enableDamping = false;\n\tthis.dampingFactor = 0.25;\n\n\t// This option actually enables dollying in and out; left as \"zoom\" for backwards compatibility.\n\t// Set to false to disable zooming\n\tthis.enableZoom = true;\n\tthis.zoomSpeed = 1.0;\n\n\t// Set to false to disable rotating\n\tthis.enableRotate = true;\n\tthis.rotateSpeed = 1.0;\n\n\t// Set to false to disable panning\n\tthis.enablePan = true;\n\tthis.keyPanSpeed = 7.0;\t// pixels moved per arrow key push\n\n\t// Set to true to automatically rotate around the target\n\t// If auto-rotate is enabled, you must call controls.update() in your animation loop\n\tthis.autoRotate = false;\n\tthis.autoRotateSpeed = 2.0; // 30 seconds per round when fps is 60\n\n\t// Set to false to disable use of the keys\n\tthis.enableKeys = true;\n\n\t// The four arrow keys\n\tthis.keys = { LEFT: 37, UP: 38, RIGHT: 39, BOTTOM: 40 };\n\n\t// Mouse buttons\n\tthis.mouseButtons = { ORBIT: THREE.MOUSE.LEFT, ZOOM: THREE.MOUSE.MIDDLE, PAN: THREE.MOUSE.RIGHT };\n\n\t// for reset\n\tthis.target0 = this.target.clone();\n\tthis.position0 = this.object.position.clone();\n\tthis.zoom0 = this.object.zoom;\n\n\t//\n\t// public methods\n\t//\n\n\tthis.getPolarAngle = function () {\n\n\t\treturn spherical.phi;\n\n\t};\n\n\tthis.getAzimuthalAngle = function () {\n\n\t\treturn spherical.theta;\n\n\t};\n\n\tthis.reset = function () {\n\n\t\tscope.target.copy( scope.target0 );\n\t\tscope.object.position.copy( scope.position0 );\n\t\tscope.object.zoom = scope.zoom0;\n\n\t\tscope.object.updateProjectionMatrix();\n\t\tscope.dispatchEvent( changeEvent );\n\n\t\tscope.update();\n\n\t\tstate = STATE.NONE;\n\n\t};\n\n\t// this method is exposed, but perhaps it would be better if we can make it private...\n\tthis.update = function() {\n\n\t\tvar offset = new THREE.Vector3();\n\n\t\t// so camera.up is the orbit axis\n\t\tvar quat = new THREE.Quaternion().setFromUnitVectors( object.up, new THREE.Vector3( 0, 1, 0 ) );\n\t\tvar quatInverse = quat.clone().inverse();\n\n\t\tvar lastPosition = new THREE.Vector3();\n\t\tvar lastQuaternion = new THREE.Quaternion();\n\n\t\treturn function () {\n\n\t\t\tvar position = scope.object.position;\n\n\t\t\toffset.copy( position ).sub( scope.target );\n\n\t\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t\toffset.applyQuaternion( quat );\n\n\t\t\t// angle from z-axis around y-axis\n\t\t\tspherical.setFromVector3( offset );\n\n\t\t\tif ( scope.autoRotate && state === STATE.NONE ) {\n\n\t\t\t\trotateLeft( getAutoRotationAngle() );\n\n\t\t\t}\n\n\t\t\tspherical.theta += sphericalDelta.theta;\n\t\t\tspherical.phi += sphericalDelta.phi;\n\n\t\t\t// restrict theta to be between desired limits\n\t\t\tspherical.theta = Math.max( scope.minAzimuthAngle, Math.min( scope.maxAzimuthAngle, spherical.theta ) );\n\n\t\t\t// restrict phi to be between desired limits\n\t\t\tspherical.phi = Math.max( scope.minPolarAngle, Math.min( scope.maxPolarAngle, spherical.phi ) );\n\n\t\t\tspherical.makeSafe();\n\n\n\t\t\tspherical.radius *= scale;\n\n\t\t\t// restrict radius to be between desired limits\n\t\t\tspherical.radius = Math.max( scope.minDistance, Math.min( scope.maxDistance, spherical.radius ) );\n\n\t\t\t// move target to panned location\n\t\t\tscope.target.add( panOffset );\n\n\t\t\toffset.setFromSpherical( spherical );\n\n\t\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t\toffset.applyQuaternion( quatInverse );\n\n\t\t\tposition.copy( scope.target ).add( offset );\n\n\t\t\tscope.object.lookAt( scope.target );\n\n\t\t\tif ( scope.enableDamping === true ) {\n\n\t\t\t\tsphericalDelta.theta *= ( 1 - scope.dampingFactor );\n\t\t\t\tsphericalDelta.phi *= ( 1 - scope.dampingFactor );\n\n\t\t\t} else {\n\n\t\t\t\tsphericalDelta.set( 0, 0, 0 );\n\n\t\t\t}\n\n\t\t\tscale = 1;\n\t\t\tpanOffset.set( 0, 0, 0 );\n\n\t\t\t// update condition is:\n\t\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\t\tif ( zoomChanged ||\n\t\t\t\tlastPosition.distanceToSquared( scope.object.position ) > EPS ||\n\t\t\t\t8 * ( 1 - lastQuaternion.dot( scope.object.quaternion ) ) > EPS ) {\n\n\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t\tlastPosition.copy( scope.object.position );\n\t\t\t\tlastQuaternion.copy( scope.object.quaternion );\n\t\t\t\tzoomChanged = false;\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t};\n\n\t}();\n\n\tthis.dispose = function() {\n\n\t\tscope.domElement.removeEventListener( 'contextmenu', onContextMenu, false );\n\t\tscope.domElement.removeEventListener( 'mousedown', onMouseDown, false );\n\t\tscope.domElement.removeEventListener( 'mousewheel', onMouseWheel, false );\n\t\tscope.domElement.removeEventListener( 'MozMousePixelScroll', onMouseWheel, false ); // firefox\n\n\t\tscope.domElement.removeEventListener( 'touchstart', onTouchStart, false );\n\t\tscope.domElement.removeEventListener( 'touchend', onTouchEnd, false );\n\t\tscope.domElement.removeEventListener( 'touchmove', onTouchMove, false );\n\n\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\t\tdocument.removeEventListener( 'mouseout', onMouseUp, false );\n\n\t\twindow.removeEventListener( 'keydown', onKeyDown, false );\n\n\t\t//scope.dispatchEvent( { type: 'dispose' } ); // should this be added here?\n\n\t};\n\n\t//\n\t// internals\n\t//\n\n\tvar scope = this;\n\n\tvar changeEvent = { type: 'change' };\n\tvar startEvent = { type: 'start' };\n\tvar endEvent = { type: 'end' };\n\n\tvar STATE = { NONE : - 1, ROTATE : 0, DOLLY : 1, PAN : 2, TOUCH_ROTATE : 3, TOUCH_DOLLY : 4, TOUCH_PAN : 5 };\n\n\tvar state = STATE.NONE;\n\n\tvar EPS = 0.000001;\n\n\t// current position in spherical coordinates\n\tvar spherical = new THREE.Spherical();\n\tvar sphericalDelta = new THREE.Spherical();\n\n\tvar scale = 1;\n\tvar panOffset = new THREE.Vector3();\n\tvar zoomChanged = false;\n\n\tvar rotateStart = new THREE.Vector2();\n\tvar rotateEnd = new THREE.Vector2();\n\tvar rotateDelta = new THREE.Vector2();\n\n\tvar panStart = new THREE.Vector2();\n\tvar panEnd = new THREE.Vector2();\n\tvar panDelta = new THREE.Vector2();\n\n\tvar dollyStart = new THREE.Vector2();\n\tvar dollyEnd = new THREE.Vector2();\n\tvar dollyDelta = new THREE.Vector2();\n\n\tfunction getAutoRotationAngle() {\n\n\t\treturn 2 * Math.PI / 60 / 60 * scope.autoRotateSpeed;\n\n\t}\n\n\tfunction getZoomScale() {\n\n\t\treturn Math.pow( 0.95, scope.zoomSpeed );\n\n\t}\n\n\tfunction rotateLeft( angle ) {\n\n\t\tsphericalDelta.theta -= angle;\n\n\t}\n\n\tfunction rotateUp( angle ) {\n\n\t\tsphericalDelta.phi -= angle;\n\n\t}\n\n\tvar panLeft = function() {\n\n\t\tvar v = new THREE.Vector3();\n\n\t\treturn function panLeft( distance, objectMatrix ) {\n\n\t\t\tv.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t\tv.multiplyScalar( - distance );\n\n\t\t\tpanOffset.add( v );\n\n\t\t};\n\n\t}();\n\n\tvar panUp = function() {\n\n\t\tvar v = new THREE.Vector3();\n\n\t\treturn function panUp( distance, objectMatrix ) {\n\n\t\t\tv.setFromMatrixColumn( objectMatrix, 1 ); // get Y column of objectMatrix\n\t\t\tv.multiplyScalar( distance );\n\n\t\t\tpanOffset.add( v );\n\n\t\t};\n\n\t}();\n\n\t// deltaX and deltaY are in pixels; right and down are positive\n\tvar pan = function() {\n\n\t\tvar offset = new THREE.Vector3();\n\n\t\treturn function( deltaX, deltaY ) {\n\n\t\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\t\t// perspective\n\t\t\t\tvar position = scope.object.position;\n\t\t\t\toffset.copy( position ).sub( scope.target );\n\t\t\t\tvar targetDistance = offset.length();\n\n\t\t\t\t// half of the fov is center to top of screen\n\t\t\t\ttargetDistance *= Math.tan( ( scope.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t\t// we actually don't use screenWidth, since perspective camera is fixed to screen height\n\t\t\t\tpanLeft( 2 * deltaX * targetDistance / element.clientHeight, scope.object.matrix );\n\t\t\t\tpanUp( 2 * deltaY * targetDistance / element.clientHeight, scope.object.matrix );\n\n\t\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\t\t// orthographic\n\t\t\t\tpanLeft( deltaX * ( scope.object.right - scope.object.left ) / scope.object.zoom / element.clientWidth, scope.object.matrix );\n\t\t\t\tpanUp( deltaY * ( scope.object.top - scope.object.bottom ) / scope.object.zoom / element.clientHeight, scope.object.matrix );\n\n\t\t\t} else {\n\n\t\t\t\t// camera neither orthographic nor perspective\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\t\tscope.enablePan = false;\n\n\t\t\t}\n\n\t\t};\n\n\t}();\n\n\tfunction dollyIn( dollyScale ) {\n\n\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\tscale /= dollyScale;\n\n\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom * dollyScale ) );\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tzoomChanged = true;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tscope.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\tfunction dollyOut( dollyScale ) {\n\n\t\tif ( scope.object instanceof THREE.PerspectiveCamera ) {\n\n\t\t\tscale *= dollyScale;\n\n\t\t} else if ( scope.object instanceof THREE.OrthographicCamera ) {\n\n\t\t\tscope.object.zoom = Math.max( scope.minZoom, Math.min( scope.maxZoom, scope.object.zoom / dollyScale ) );\n\t\t\tscope.object.updateProjectionMatrix();\n\t\t\tzoomChanged = true;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tscope.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\t//\n\t// event callbacks - update the object state\n\t//\n\n\tfunction handleMouseDownRotate( event ) {\n\n\t\t//console.log( 'handleMouseDownRotate' );\n\n\t\trotateStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseDownDolly( event ) {\n\n\t\t//console.log( 'handleMouseDownDolly' );\n\n\t\tdollyStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseDownPan( event ) {\n\n\t\t//console.log( 'handleMouseDownPan' );\n\n\t\tpanStart.set( event.clientX, event.clientY );\n\n\t}\n\n\tfunction handleMouseMoveRotate( event ) {\n\n\t\t//console.log( 'handleMouseMoveRotate' );\n\n\t\trotateEnd.set( event.clientX, event.clientY );\n\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t// rotating across whole screen goes 360 degrees around\n\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\trotateStart.copy( rotateEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseMoveDolly( event ) {\n\n\t\t//console.log( 'handleMouseMoveDolly' );\n\n\t\tdollyEnd.set( event.clientX, event.clientY );\n\n\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t}\n\n\t\tdollyStart.copy( dollyEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseMovePan( event ) {\n\n\t\t//console.log( 'handleMouseMovePan' );\n\n\t\tpanEnd.set( event.clientX, event.clientY );\n\n\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\tpan( panDelta.x, panDelta.y );\n\n\t\tpanStart.copy( panEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleMouseUp( event ) {\n\n\t\t//console.log( 'handleMouseUp' );\n\n\t}\n\n\tfunction handleMouseWheel( event ) {\n\n\t\t//console.log( 'handleMouseWheel' );\n\n\t\tvar delta = 0;\n\n\t\tif ( event.wheelDelta !== undefined ) {\n\n\t\t\t// WebKit / Opera / Explorer 9\n\n\t\t\tdelta = event.wheelDelta;\n\n\t\t} else if ( event.detail !== undefined ) {\n\n\t\t\t// Firefox\n\n\t\t\tdelta = - event.detail;\n\n\t\t}\n\n\t\tif ( delta > 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t} else if ( delta < 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t}\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleKeyDown( event ) {\n\n\t\t//console.log( 'handleKeyDown' );\n\n\t\tswitch ( event.keyCode ) {\n\n\t\t\tcase scope.keys.UP:\n\t\t\t\tpan( 0, scope.keyPanSpeed );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.BOTTOM:\n\t\t\t\tpan( 0, - scope.keyPanSpeed );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.LEFT:\n\t\t\t\tpan( scope.keyPanSpeed, 0 );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t\tcase scope.keys.RIGHT:\n\t\t\t\tpan( - scope.keyPanSpeed, 0 );\n\t\t\t\tscope.update();\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction handleTouchStartRotate( event ) {\n\n\t\t//console.log( 'handleTouchStartRotate' );\n\n\t\trotateStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t}\n\n\tfunction handleTouchStartDolly( event ) {\n\n\t\t//console.log( 'handleTouchStartDolly' );\n\n\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tdollyStart.set( 0, distance );\n\n\t}\n\n\tfunction handleTouchStartPan( event ) {\n\n\t\t//console.log( 'handleTouchStartPan' );\n\n\t\tpanStart.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t}\n\n\tfunction handleTouchMoveRotate( event ) {\n\n\t\t//console.log( 'handleTouchMoveRotate' );\n\n\t\trotateEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\t\trotateDelta.subVectors( rotateEnd, rotateStart );\n\n\t\tvar element = scope.domElement === document ? scope.domElement.body : scope.domElement;\n\n\t\t// rotating across whole screen goes 360 degrees around\n\t\trotateLeft( 2 * Math.PI * rotateDelta.x / element.clientWidth * scope.rotateSpeed );\n\n\t\t// rotating up and down along whole screen attempts to go 360, but limited to 180\n\t\trotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight * scope.rotateSpeed );\n\n\t\trotateStart.copy( rotateEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleTouchMoveDolly( event ) {\n\n\t\t//console.log( 'handleTouchMoveDolly' );\n\n\t\tvar dx = event.touches[ 0 ].pageX - event.touches[ 1 ].pageX;\n\t\tvar dy = event.touches[ 0 ].pageY - event.touches[ 1 ].pageY;\n\n\t\tvar distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tdollyEnd.set( 0, distance );\n\n\t\tdollyDelta.subVectors( dollyEnd, dollyStart );\n\n\t\tif ( dollyDelta.y > 0 ) {\n\n\t\t\tdollyOut( getZoomScale() );\n\n\t\t} else if ( dollyDelta.y < 0 ) {\n\n\t\t\tdollyIn( getZoomScale() );\n\n\t\t}\n\n\t\tdollyStart.copy( dollyEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleTouchMovePan( event ) {\n\n\t\t//console.log( 'handleTouchMovePan' );\n\n\t\tpanEnd.set( event.touches[ 0 ].pageX, event.touches[ 0 ].pageY );\n\n\t\tpanDelta.subVectors( panEnd, panStart );\n\n\t\tpan( panDelta.x, panDelta.y );\n\n\t\tpanStart.copy( panEnd );\n\n\t\tscope.update();\n\n\t}\n\n\tfunction handleTouchEnd( event ) {\n\n\t\t//console.log( 'handleTouchEnd' );\n\n\t}\n\n\t//\n\t// event handlers - FSM: listen for events and reset state\n\t//\n\n\tfunction onMouseDown( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t\tif ( event.button === scope.mouseButtons.ORBIT ) {\n\n\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\thandleMouseDownRotate( event );\n\n\t\t\tstate = STATE.ROTATE;\n\n\t\t} else if ( event.button === scope.mouseButtons.ZOOM ) {\n\n\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\thandleMouseDownDolly( event );\n\n\t\t\tstate = STATE.DOLLY;\n\n\t\t} else if ( event.button === scope.mouseButtons.PAN ) {\n\n\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\thandleMouseDownPan( event );\n\n\t\t\tstate = STATE.PAN;\n\n\t\t}\n\n\t\tif ( state !== STATE.NONE ) {\n\n\t\t\tdocument.addEventListener( 'mousemove', onMouseMove, false );\n\t\t\tdocument.addEventListener( 'mouseup', onMouseUp, false );\n\t\t\tdocument.addEventListener( 'mouseout', onMouseUp, false );\n\n\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t}\n\n\t}\n\n\tfunction onMouseMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\n\t\tif ( state === STATE.ROTATE ) {\n\n\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\thandleMouseMoveRotate( event );\n\n\t\t} else if ( state === STATE.DOLLY ) {\n\n\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\thandleMouseMoveDolly( event );\n\n\t\t} else if ( state === STATE.PAN ) {\n\n\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\thandleMouseMovePan( event );\n\n\t\t}\n\n\t}\n\n\tfunction onMouseUp( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\thandleMouseUp( event );\n\n\t\tdocument.removeEventListener( 'mousemove', onMouseMove, false );\n\t\tdocument.removeEventListener( 'mouseup', onMouseUp, false );\n\t\tdocument.removeEventListener( 'mouseout', onMouseUp, false );\n\n\t\tscope.dispatchEvent( endEvent );\n\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tfunction onMouseWheel( event ) {\n\n\t\tif ( scope.enabled === false || scope.enableZoom === false || ( state !== STATE.NONE && state !== STATE.ROTATE ) ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\thandleMouseWheel( event );\n\n\t\tscope.dispatchEvent( startEvent ); // not sure why these are here...\n\t\tscope.dispatchEvent( endEvent );\n\n\t}\n\n\tfunction onKeyDown( event ) {\n\n\t\tif ( scope.enabled === false || scope.enableKeys === false || scope.enablePan === false ) return;\n\n\t\thandleKeyDown( event );\n\n\t}\n\n\tfunction onTouchStart( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1:\t// one-fingered touch: rotate\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\n\t\t\t\thandleTouchStartRotate( event );\n\n\t\t\t\tstate = STATE.TOUCH_ROTATE;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\t// two-fingered touch: dolly\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\n\t\t\t\thandleTouchStartDolly( event );\n\n\t\t\t\tstate = STATE.TOUCH_DOLLY;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\n\t\t\t\thandleTouchStartPan( event );\n\n\t\t\t\tstate = STATE.TOUCH_PAN;\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t\tif ( state !== STATE.NONE ) {\n\n\t\t\tscope.dispatchEvent( startEvent );\n\n\t\t}\n\n\t}\n\n\tfunction onTouchMove( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tswitch ( event.touches.length ) {\n\n\t\t\tcase 1: // one-fingered touch: rotate\n\n\t\t\t\tif ( scope.enableRotate === false ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_ROTATE ) return; // is this needed?...\n\n\t\t\t\thandleTouchMoveRotate( event );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 2: // two-fingered touch: dolly\n\n\t\t\t\tif ( scope.enableZoom === false ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_DOLLY ) return; // is this needed?...\n\n\t\t\t\thandleTouchMoveDolly( event );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 3: // three-fingered touch: pan\n\n\t\t\t\tif ( scope.enablePan === false ) return;\n\t\t\t\tif ( state !== STATE.TOUCH_PAN ) return; // is this needed?...\n\n\t\t\t\thandleTouchMovePan( event );\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tstate = STATE.NONE;\n\n\t\t}\n\n\t}\n\n\tfunction onTouchEnd( event ) {\n\n\t\tif ( scope.enabled === false ) return;\n\n\t\thandleTouchEnd( event );\n\n\t\tscope.dispatchEvent( endEvent );\n\n\t\tstate = STATE.NONE;\n\n\t}\n\n\tfunction onContextMenu( event ) {\n\n\t\tevent.preventDefault();\n\n\t}\n\n\t//\n\n\tscope.domElement.addEventListener( 'contextmenu', onContextMenu, false );\n\n\tscope.domElement.addEventListener( 'mousedown', onMouseDown, false );\n\tscope.domElement.addEventListener( 'mousewheel', onMouseWheel, false );\n\tscope.domElement.addEventListener( 'MozMousePixelScroll', onMouseWheel, false ); // firefox\n\n\tscope.domElement.addEventListener( 'touchstart', onTouchStart, false );\n\tscope.domElement.addEventListener( 'touchend', onTouchEnd, false );\n\tscope.domElement.addEventListener( 'touchmove', onTouchMove, false );\n\n\twindow.addEventListener( 'keydown', onKeyDown, false );\n\n\t// force an update at start\n\n\tthis.update();\n\n};\n\nTHREE.OrbitControls.prototype = Object.create( THREE.EventDispatcher.prototype );\nTHREE.OrbitControls.prototype.constructor = THREE.OrbitControls;\n\nObject.defineProperties( THREE.OrbitControls.prototype, {\n\n\tcenter: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .center has been renamed to .target' );\n\t\t\treturn this.target;\n\n\t\t}\n\n\t},\n\n\t// backward compatibility\n\n\tnoZoom: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\treturn ! this.enableZoom;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noZoom has been deprecated. Use .enableZoom instead.' );\n\t\t\tthis.enableZoom = ! value;\n\n\t\t}\n\n\t},\n\n\tnoRotate: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\treturn ! this.enableRotate;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noRotate has been deprecated. Use .enableRotate instead.' );\n\t\t\tthis.enableRotate = ! value;\n\n\t\t}\n\n\t},\n\n\tnoPan: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\treturn ! this.enablePan;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noPan has been deprecated. Use .enablePan instead.' );\n\t\t\tthis.enablePan = ! value;\n\n\t\t}\n\n\t},\n\n\tnoKeys: {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\treturn ! this.enableKeys;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .noKeys has been deprecated. Use .enableKeys instead.' );\n\t\t\tthis.enableKeys = ! value;\n\n\t\t}\n\n\t},\n\n\tstaticMoving : {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\treturn ! this.enableDamping;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .staticMoving has been deprecated. Use .enableDamping instead.' );\n\t\t\tthis.enableDamping = ! value;\n\n\t\t}\n\n\t},\n\n\tdynamicDampingFactor : {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\treturn this.dampingFactor;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.OrbitControls: .dynamicDampingFactor has been renamed. Use .dampingFactor instead.' );\n\t\t\tthis.dampingFactor = value;\n\n\t\t}\n\n\t}\n\n} );\n"
  },
  {
    "path": "browser/vendor/three/SceneLoader.js",
    "content": "/**\n * @author alteredq / http://alteredqualia.com/\n */\n\nTHREE.SceneLoader = function ( manager ) {\n\n\tthis.onLoadStart = function () {};\n\tthis.onLoadProgress = function() {};\n\tthis.onLoadComplete = function () {};\n\n\tthis.callbackSync = function () {};\n\tthis.callbackProgress = function () {};\n\n\tthis.geometryHandlers = {};\n\tthis.hierarchyHandlers = {};\n\n\tthis.addGeometryHandler( \"ascii\", THREE.JSONLoader );\n\n\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\n\n};\n\nTHREE.SceneLoader.prototype = {\n\n\tconstructor: THREE.SceneLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar loader = new THREE.XHRLoader( scope.manager );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tscope.parse( JSON.parse( text ), onLoad, url );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\taddGeometryHandler: function ( typeID, loaderClass ) {\n\n\t\tthis.geometryHandlers[ typeID ] = { \"loaderClass\": loaderClass };\n\n\t},\n\n\taddHierarchyHandler: function ( typeID, loaderClass ) {\n\n\t\tthis.hierarchyHandlers[ typeID ] = { \"loaderClass\": loaderClass };\n\n\t},\n\n\tparse: function ( json, callbackFinished, url ) {\n\n\t\tvar scope = this;\n\n\t\tvar urlBase = THREE.Loader.prototype.extractUrlBase( url );\n\n\t\tvar geometry, material, camera, fog,\n\t\t\ttexture, images, color,\n\t\t\tlight, hex, intensity,\n\t\t\tcounter_models, counter_textures,\n\t\t\ttotal_models, total_textures,\n\t\t\tresult;\n\n\t\tvar target_array = [];\n\n\t\tvar data = json;\n\n\t\t// async geometry loaders\n\n\t\tfor ( var typeID in this.geometryHandlers ) {\n\n\t\t\tvar loaderClass = this.geometryHandlers[ typeID ][ \"loaderClass\" ];\n\t\t\tthis.geometryHandlers[ typeID ][ \"loaderObject\" ] = new loaderClass();\n\n\t\t}\n\n\t\t// async hierachy loaders\n\n\t\tfor ( var typeID in this.hierarchyHandlers ) {\n\n\t\t\tvar loaderClass = this.hierarchyHandlers[ typeID ][ \"loaderClass\" ];\n\t\t\tthis.hierarchyHandlers[ typeID ][ \"loaderObject\" ] = new loaderClass();\n\n\t\t}\n\n\t\tcounter_models = 0;\n\t\tcounter_textures = 0;\n\n\t\tresult = {\n\n\t\t\tscene: new THREE.Scene(),\n\t\t\tgeometries: {},\n\t\t\tface_materials: {},\n\t\t\tmaterials: {},\n\t\t\ttextures: {},\n\t\t\tobjects: {},\n\t\t\tcameras: {},\n\t\t\tlights: {},\n\t\t\tfogs: {},\n\t\t\tempties: {},\n\t\t\tgroups: {}\n\n\t\t};\n\n\t\tif ( data.transform ) {\n\n\t\t\tvar position = data.transform.position,\n\t\t\t\trotation = data.transform.rotation,\n\t\t\t\tscale = data.transform.scale;\n\n\t\t\tif ( position ) {\n\n\t\t\t\tresult.scene.position.fromArray( position );\n\n\t\t\t}\n\n\t\t\tif ( rotation ) {\n\n\t\t\t\tresult.scene.rotation.fromArray( rotation );\n\n\t\t\t}\n\n\t\t\tif ( scale ) {\n\n\t\t\t\tresult.scene.scale.fromArray( scale );\n\n\t\t\t}\n\n\t\t\tif ( position || rotation || scale ) {\n\n\t\t\t\tresult.scene.updateMatrix();\n\t\t\t\tresult.scene.updateMatrixWorld();\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction get_url( source_url, url_type ) {\n\n\t\t\tif ( url_type == \"relativeToHTML\" ) {\n\n\t\t\t\treturn source_url;\n\n\t\t\t} else {\n\n\t\t\t\treturn urlBase + source_url;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// toplevel loader function, delegates to handle_children\n\n\t\tfunction handle_objects() {\n\n\t\t\thandle_children( result.scene, data.objects );\n\n\t\t}\n\n\t\t// handle all the children from the loaded json and attach them to given parent\n\n\t\tfunction handle_children( parent, children ) {\n\n\t\t\tvar mat, dst, pos, rot, scl, quat;\n\n\t\t\tfor ( var objID in children ) {\n\n\t\t\t\t// check by id if child has already been handled,\n\t\t\t\t// if not, create new object\n\n\t\t\t\tvar object = result.objects[ objID ];\n\t\t\t\tvar objJSON = children[ objID ];\n\n\t\t\t\tif ( object === undefined ) {\n\n\t\t\t\t\t// meshes\n\n\t\t\t\t\tif ( objJSON.type && ( objJSON.type in scope.hierarchyHandlers ) ) {\n\n\t\t\t\t\t\tif ( objJSON.loading === undefined ) {\n\n\t\t\t\t\t\t\tmaterial = result.materials[ objJSON.material ];\n\n\t\t\t\t\t\t\tobjJSON.loading = true;\n\n\t\t\t\t\t\t\tvar loader = scope.hierarchyHandlers[ objJSON.type ][ \"loaderObject\" ];\n\n\t\t\t\t\t\t\t// ColladaLoader\n\n\t\t\t\t\t\t\tif ( loader.options ) {\n\n\t\t\t\t\t\t\t\tloader.load( get_url( objJSON.url, data.urlBaseType ), create_callback_hierachy( objID, parent, material, objJSON ) );\n\n\t\t\t\t\t\t\t// UTF8Loader\n\t\t\t\t\t\t\t// OBJLoader\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tloader.load( get_url( objJSON.url, data.urlBaseType ), create_callback_hierachy( objID, parent, material, objJSON ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( objJSON.geometry !== undefined ) {\n\n\t\t\t\t\t\tgeometry = result.geometries[ objJSON.geometry ];\n\n\t\t\t\t\t\t// geometry already loaded\n\n\t\t\t\t\t\tif ( geometry ) {\n\n\t\t\t\t\t\t\tmaterial = result.materials[ objJSON.material ];\n\n\t\t\t\t\t\t\tpos = objJSON.position;\n\t\t\t\t\t\t\trot = objJSON.rotation;\n\t\t\t\t\t\t\tscl = objJSON.scale;\n\t\t\t\t\t\t\tmat = objJSON.matrix;\n\t\t\t\t\t\t\tquat = objJSON.quaternion;\n\n\t\t\t\t\t\t\t// use materials from the model file\n\t\t\t\t\t\t\t// if there is no material specified in the object\n\n\t\t\t\t\t\t\tif ( ! objJSON.material ) {\n\n\t\t\t\t\t\t\t\tmaterial = new THREE.MultiMaterial( result.face_materials[ objJSON.geometry ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// use materials from the model file\n\t\t\t\t\t\t\t// if there is just empty face material\n\t\t\t\t\t\t\t// (must create new material as each model has its own face material)\n\n\t\t\t\t\t\t\tif ( ( material instanceof THREE.MultiMaterial ) && material.materials.length === 0 ) {\n\n\t\t\t\t\t\t\t\tmaterial = new THREE.MultiMaterial( result.face_materials[ objJSON.geometry ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( objJSON.skin ) {\n\n\t\t\t\t\t\t\t\tobject = new THREE.SkinnedMesh( geometry, material );\n\n\t\t\t\t\t\t\t} else if ( objJSON.morph ) {\n\n\t\t\t\t\t\t\t\tobject = new THREE.MorphAnimMesh( geometry, material );\n\n\t\t\t\t\t\t\t\tif ( objJSON.duration !== undefined ) {\n\n\t\t\t\t\t\t\t\t\tobject.duration = objJSON.duration;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( objJSON.time !== undefined ) {\n\n\t\t\t\t\t\t\t\t\tobject.time = objJSON.time;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( objJSON.mirroredLoop !== undefined ) {\n\n\t\t\t\t\t\t\t\t\tobject.mirroredLoop = objJSON.mirroredLoop;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( material.morphNormals ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.computeMorphNormals();\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tobject = new THREE.Mesh( geometry, material );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tobject.name = objID;\n\n\t\t\t\t\t\t\tif ( mat ) {\n\n\t\t\t\t\t\t\t\tobject.matrixAutoUpdate = false;\n\t\t\t\t\t\t\t\tobject.matrix.set(\n\t\t\t\t\t\t\t\t\tmat[ 0 ],  mat[ 1 ],  mat[ 2 ],  mat[ 3 ],\n\t\t\t\t\t\t\t\t\tmat[ 4 ],  mat[ 5 ],  mat[ 6 ],  mat[ 7 ],\n\t\t\t\t\t\t\t\t\tmat[ 8 ],  mat[ 9 ],  mat[ 10 ], mat[ 11 ],\n\t\t\t\t\t\t\t\t\tmat[ 12 ], mat[ 13 ], mat[ 14 ], mat[ 15 ]\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tobject.position.fromArray( pos );\n\n\t\t\t\t\t\t\t\tif ( quat ) {\n\n\t\t\t\t\t\t\t\t\tobject.quaternion.fromArray( quat );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tobject.rotation.fromArray( rot );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tobject.scale.fromArray( scl );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tobject.visible = objJSON.visible;\n\t\t\t\t\t\t\tobject.castShadow = objJSON.castShadow;\n\t\t\t\t\t\t\tobject.receiveShadow = objJSON.receiveShadow;\n\n\t\t\t\t\t\t\tparent.add( object );\n\n\t\t\t\t\t\t\tresult.objects[ objID ] = object;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// lights\n\n\t\t\t\t\t} else if ( objJSON.type === \"AmbientLight\" || objJSON.type === \"PointLight\" ||\n\t\t\t\t\t\tobjJSON.type === \"DirectionalLight\" || objJSON.type === \"SpotLight\" ||\n\t\t\t\t\t\tobjJSON.type === \"HemisphereLight\" ) {\n\n\t\t\t\t\t\tvar color = objJSON.color || new THREE.Color(0xffffff);\n\t\t\t\t\t\tvar intensity = objJSON.intensity || 1;\n\t\t\t\t\t\tvar distance = objJSON.distance || 0;\n\t\t\t\t\t\tvar position = objJSON.position || [0, 0, 0];\n\t\t\t\t\t\tvar rotation = objJSON.rotation || [0, 0, 0];\n\n\t\t\t\t\t\tswitch ( objJSON.type ) {\n\n\t\t\t\t\t\t\tcase 'AmbientLight':\n\t\t\t\t\t\t\t\tlight = new THREE.AmbientLight( color );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'PointLight':\n\t\t\t\t\t\t\t\tlight = new THREE.PointLight( color, intensity, distance );\n\t\t\t\t\t\t\t\tlight.position.fromArray( position );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\t\t\t\tlight = new THREE.DirectionalLight( color, intensity );\n\t\t\t\t\t\t\t\tlight.position.fromArray( objJSON.direction );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'SpotLight':\n\t\t\t\t\t\t\t\tlight = new THREE.SpotLight( color, intensity, distance, 1 );\n\t\t\t\t\t\t\t\tlight.angle = objJSON.angle;\n\t\t\t\t\t\t\t\tlight.position.fromArray( position );\n\t\t\t\t\t\t\t\tlight.target.position.set( position[ 0 ], position[ 1 ] - distance, position[ 2 ] );\n\t\t\t\t\t\t\t\tlight.target.position.applyEuler( new THREE.Euler( rotation[ 0 ], rotation[ 1 ], rotation[ 2 ], 'XYZ' ) );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\t\t\t\tlight = new THREE.DirectionalLight( color, intensity, distance );\n\t\t\t\t\t\t\t\tlight.target.position.set( position[ 0 ], position[ 1 ] - distance, position[ 2 ] );\n\t\t\t\t\t\t\t\tlight.target.position.applyEuler( new THREE.Euler( rotation[ 0 ], rotation[ 1 ], rotation[ 2 ], 'XYZ' ) );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tparent.add( light );\n\n\t\t\t\t\t\tlight.name = objID;\n\t\t\t\t\t\tresult.lights[ objID ] = light;\n\t\t\t\t\t\tresult.objects[ objID ] = light;\n\n\t\t\t\t\t// cameras\n\n\t\t\t\t\t} else if ( objJSON.type === \"PerspectiveCamera\" || objJSON.type === \"OrthographicCamera\" ) {\n\n\t\t\t\t\t\tpos = objJSON.position;\n\t\t\t\t\t\trot = objJSON.rotation;\n\t\t\t\t\t\tquat = objJSON.quaternion;\n\n\t\t\t\t\t\tif ( objJSON.type === \"PerspectiveCamera\" ) {\n\n\t\t\t\t\t\t\tcamera = new THREE.PerspectiveCamera( objJSON.fov, objJSON.aspect, objJSON.near, objJSON.far );\n\n\t\t\t\t\t\t} else if ( objJSON.type === \"OrthographicCamera\" ) {\n\n\t\t\t\t\t\t\tcamera = new THREE.OrthographicCamera( objJSON.left, objJSON.right, objJSON.top, objJSON.bottom, objJSON.near, objJSON.far );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcamera.name = objID;\n\t\t\t\t\t\tcamera.position.fromArray( pos );\n\n\t\t\t\t\t\tif ( quat !== undefined ) {\n\n\t\t\t\t\t\t\tcamera.quaternion.fromArray( quat );\n\n\t\t\t\t\t\t} else if ( rot !== undefined ) {\n\n\t\t\t\t\t\t\tcamera.rotation.fromArray( rot );\n\n\t\t\t\t\t\t} else if ( objJSON.target ) {\n\n\t\t\t\t\t\t\tcamera.lookAt( new THREE.Vector3().fromArray( objJSON.target ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tparent.add( camera );\n\n\t\t\t\t\t\tresult.cameras[ objID ] = camera;\n\t\t\t\t\t\tresult.objects[ objID ] = camera;\n\n\t\t\t\t\t// pure Object3D\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpos = objJSON.position;\n\t\t\t\t\t\trot = objJSON.rotation;\n\t\t\t\t\t\tscl = objJSON.scale;\n\t\t\t\t\t\tquat = objJSON.quaternion;\n\n\t\t\t\t\t\tobject = new THREE.Object3D();\n\t\t\t\t\t\tobject.name = objID;\n\t\t\t\t\t\tobject.position.fromArray( pos );\n\n\t\t\t\t\t\tif ( quat ) {\n\n\t\t\t\t\t\t\tobject.quaternion.fromArray( quat );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tobject.rotation.fromArray( rot );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tobject.scale.fromArray( scl );\n\t\t\t\t\t\tobject.visible = ( objJSON.visible !== undefined ) ? objJSON.visible : false;\n\n\t\t\t\t\t\tparent.add( object );\n\n\t\t\t\t\t\tresult.objects[ objID ] = object;\n\t\t\t\t\t\tresult.empties[ objID ] = object;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( object ) {\n\n\t\t\t\t\t\tif ( objJSON.userData !== undefined ) {\n\n\t\t\t\t\t\t\tfor ( var key in objJSON.userData ) {\n\n\t\t\t\t\t\t\t\tvar value = objJSON.userData[ key ];\n\t\t\t\t\t\t\t\tobject.userData[ key ] = value;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( objJSON.groups !== undefined ) {\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < objJSON.groups.length; i ++ ) {\n\n\t\t\t\t\t\t\t\tvar groupID = objJSON.groups[ i ];\n\n\t\t\t\t\t\t\t\tif ( result.groups[ groupID ] === undefined ) {\n\n\t\t\t\t\t\t\t\t\tresult.groups[ groupID ] = [];\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tresult.groups[ groupID ].push( objID );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( object !== undefined && objJSON.children !== undefined ) {\n\n\t\t\t\t\thandle_children( object, objJSON.children );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction handle_mesh( geo, mat, id ) {\n\n\t\t\tresult.geometries[ id ] = geo;\n\t\t\tresult.face_materials[ id ] = mat;\n\t\t\thandle_objects();\n\n\t\t}\n\n\t\tfunction handle_hierarchy( node, id, parent, material, obj ) {\n\n\t\t\tvar p = obj.position;\n\t\t\tvar r = obj.rotation;\n\t\t\tvar q = obj.quaternion;\n\t\t\tvar s = obj.scale;\n\n\t\t\tnode.position.fromArray( p );\n\n\t\t\tif ( q ) {\n\n\t\t\t\tnode.quaternion.fromArray( q );\n\n\t\t\t} else {\n\n\t\t\t\tnode.rotation.fromArray( r );\n\n\t\t\t}\n\n\t\t\tnode.scale.fromArray( s );\n\n\t\t\t// override children materials\n\t\t\t// if object material was specified in JSON explicitly\n\n\t\t\tif ( material ) {\n\n\t\t\t\tnode.traverse( function ( child ) {\n\n\t\t\t\t\tchild.material = material;\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\t// override children visibility\n\t\t\t// with root node visibility as specified in JSON\n\n\t\t\tvar visible = ( obj.visible !== undefined ) ? obj.visible : true;\n\n\t\t\tnode.traverse( function ( child ) {\n\n\t\t\t\tchild.visible = visible;\n\n\t\t\t} );\n\n\t\t\tparent.add( node );\n\n\t\t\tnode.name = id;\n\n\t\t\tresult.objects[ id ] = node;\n\t\t\thandle_objects();\n\n\t\t}\n\n\t\tfunction create_callback_geometry( id ) {\n\n\t\t\treturn function ( geo, mat ) {\n\n\t\t\t\tgeo.name = id;\n\n\t\t\t\thandle_mesh( geo, mat, id );\n\n\t\t\t\tcounter_models -= 1;\n\n\t\t\t\tscope.onLoadComplete();\n\n\t\t\t\tasync_callback_gate();\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction create_callback_hierachy( id, parent, material, obj ) {\n\n\t\t\treturn function ( event ) {\n\n\t\t\t\tvar result;\n\n\t\t\t\t// loaders which use EventDispatcher\n\n\t\t\t\tif ( event.content ) {\n\n\t\t\t\t\tresult = event.content;\n\n\t\t\t\t// ColladaLoader\n\n\t\t\t\t} else if ( event.dae ) {\n\n\t\t\t\t\tresult = event.scene;\n\n\n\t\t\t\t// UTF8Loader\n\n\t\t\t\t} else {\n\n\t\t\t\t\tresult = event;\n\n\t\t\t\t}\n\n\t\t\t\thandle_hierarchy( result, id, parent, material, obj );\n\n\t\t\t\tcounter_models -= 1;\n\n\t\t\t\tscope.onLoadComplete();\n\n\t\t\t\tasync_callback_gate();\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction create_callback_embed( id ) {\n\n\t\t\treturn function ( geo, mat ) {\n\n\t\t\t\tgeo.name = id;\n\n\t\t\t\tresult.geometries[ id ] = geo;\n\t\t\t\tresult.face_materials[ id ] = mat;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction async_callback_gate() {\n\n\t\t\tvar progress = {\n\n\t\t\t\ttotalModels : total_models,\n\t\t\t\ttotalTextures : total_textures,\n\t\t\t\tloadedModels : total_models - counter_models,\n\t\t\t\tloadedTextures : total_textures - counter_textures\n\n\t\t\t};\n\n\t\t\tscope.callbackProgress( progress, result );\n\n\t\t\tscope.onLoadProgress();\n\n\t\t\tif ( counter_models === 0 && counter_textures === 0 ) {\n\n\t\t\t\tfinalize();\n\t\t\t\tcallbackFinished( result );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction finalize() {\n\n\t\t\t// take care of targets which could be asynchronously loaded objects\n\n\t\t\tfor ( var i = 0; i < target_array.length; i ++ ) {\n\n\t\t\t\tvar ta = target_array[ i ];\n\n\t\t\t\tvar target = result.objects[ ta.targetName ];\n\n\t\t\t\tif ( target ) {\n\n\t\t\t\t\tta.object.target = target;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// if there was error and target of specified name doesn't exist in the scene file\n\t\t\t\t\t// create instead dummy target\n\t\t\t\t\t// (target must be added to scene explicitly as parent is already added)\n\n\t\t\t\t\tta.object.target = new THREE.Object3D();\n\t\t\t\t\tresult.scene.add( ta.object.target );\n\n\t\t\t\t}\n\n\t\t\t\tta.object.target.userData.targetInverse = ta.object;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar callbackTexture = function ( count ) {\n\n\t\t\tcounter_textures -= count;\n\t\t\tasync_callback_gate();\n\n\t\t\tscope.onLoadComplete();\n\n\t\t};\n\n\t\t// must use this instead of just directly calling callbackTexture\n\t\t// because of closure in the calling context loop\n\n\t\tvar generateTextureCallback = function ( count ) {\n\n\t\t\treturn function () {\n\n\t\t\t\tcallbackTexture( count );\n\n\t\t\t};\n\n\t\t};\n\n\t\tfunction traverse_json_hierarchy( objJSON, callback ) {\n\n\t\t\tcallback( objJSON );\n\n\t\t\tif ( objJSON.children !== undefined ) {\n\n\t\t\t\tfor ( var objChildID in objJSON.children ) {\n\n\t\t\t\t\ttraverse_json_hierarchy( objJSON.children[ objChildID ], callback );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// first go synchronous elements\n\n\t\t// fogs\n\n\t\tvar fogID, fogJSON;\n\n\t\tfor ( fogID in data.fogs ) {\n\n\t\t\tfogJSON = data.fogs[ fogID ];\n\n\t\t\tif ( fogJSON.type === \"linear\" ) {\n\n\t\t\t\tfog = new THREE.Fog( 0x000000, fogJSON.near, fogJSON.far );\n\n\t\t\t} else if ( fogJSON.type === \"exp2\" ) {\n\n\t\t\t\tfog = new THREE.FogExp2( 0x000000, fogJSON.density );\n\n\t\t\t}\n\n\t\t\tcolor = fogJSON.color;\n\t\t\tfog.color.setRGB( color[ 0 ], color[ 1 ], color[ 2 ] );\n\n\t\t\tresult.fogs[ fogID ] = fog;\n\n\t\t}\n\n\t\t// now come potentially asynchronous elements\n\n\t\t// geometries\n\n\t\t// count how many geometries will be loaded asynchronously\n\n\t\tvar geoID, geoJSON;\n\n\t\tfor ( geoID in data.geometries ) {\n\n\t\t\tgeoJSON = data.geometries[ geoID ];\n\n\t\t\tif ( geoJSON.type in this.geometryHandlers ) {\n\n\t\t\t\tcounter_models += 1;\n\n\t\t\t\tscope.onLoadStart();\n\n\t\t\t}\n\n\t\t}\n\n\t\t// count how many hierarchies will be loaded asynchronously\n\n\t\tfor ( var objID in data.objects ) {\n\n\t\t\ttraverse_json_hierarchy( data.objects[ objID ], function ( objJSON ) {\n\n\t\t\t\tif ( objJSON.type && ( objJSON.type in scope.hierarchyHandlers ) ) {\n\n\t\t\t\t\tcounter_models += 1;\n\n\t\t\t\t\tscope.onLoadStart();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t\ttotal_models = counter_models;\n\n\t\tfor ( geoID in data.geometries ) {\n\n\t\t\tgeoJSON = data.geometries[ geoID ];\n\n\t\t\tif ( geoJSON.type === \"cube\" ) {\n\n\t\t\t\tgeometry = new THREE.BoxGeometry( geoJSON.width, geoJSON.height, geoJSON.depth, geoJSON.widthSegments, geoJSON.heightSegments, geoJSON.depthSegments );\n\t\t\t\tgeometry.name = geoID;\n\t\t\t\tresult.geometries[ geoID ] = geometry;\n\n\t\t\t} else if ( geoJSON.type === \"plane\" ) {\n\n\t\t\t\tgeometry = new THREE.PlaneGeometry( geoJSON.width, geoJSON.height, geoJSON.widthSegments, geoJSON.heightSegments );\n\t\t\t\tgeometry.name = geoID;\n\t\t\t\tresult.geometries[ geoID ] = geometry;\n\n\t\t\t} else if ( geoJSON.type === \"sphere\" ) {\n\n\t\t\t\tgeometry = new THREE.SphereGeometry( geoJSON.radius, geoJSON.widthSegments, geoJSON.heightSegments );\n\t\t\t\tgeometry.name = geoID;\n\t\t\t\tresult.geometries[ geoID ] = geometry;\n\n\t\t\t} else if ( geoJSON.type === \"cylinder\" ) {\n\n\t\t\t\tgeometry = new THREE.CylinderGeometry( geoJSON.topRad, geoJSON.botRad, geoJSON.height, geoJSON.radSegs, geoJSON.heightSegs );\n\t\t\t\tgeometry.name = geoID;\n\t\t\t\tresult.geometries[ geoID ] = geometry;\n\n\t\t\t} else if ( geoJSON.type === \"torus\" ) {\n\n\t\t\t\tgeometry = new THREE.TorusGeometry( geoJSON.radius, geoJSON.tube, geoJSON.segmentsR, geoJSON.segmentsT );\n\t\t\t\tgeometry.name = geoID;\n\t\t\t\tresult.geometries[ geoID ] = geometry;\n\n\t\t\t} else if ( geoJSON.type === \"icosahedron\" ) {\n\n\t\t\t\tgeometry = new THREE.IcosahedronGeometry( geoJSON.radius, geoJSON.subdivisions );\n\t\t\t\tgeometry.name = geoID;\n\t\t\t\tresult.geometries[ geoID ] = geometry;\n\n\t\t\t} else if ( geoJSON.type in this.geometryHandlers ) {\n\n\t\t\t\tvar loader = this.geometryHandlers[ geoJSON.type ][ \"loaderObject\" ];\n\t\t\t\tloader.load( get_url( geoJSON.url, data.urlBaseType ), create_callback_geometry( geoID ) );\n\n\t\t\t} else if ( geoJSON.type === \"embedded\" ) {\n\n\t\t\t\tvar modelJson = data.embeds[ geoJSON.id ],\n\t\t\t\t\ttexture_path = \"\";\n\n\t\t\t\t// pass metadata along to jsonLoader so it knows the format version\n\n\t\t\t\tmodelJson.metadata = data.metadata;\n\n\t\t\t\tif ( modelJson ) {\n\n\t\t\t\t\tvar jsonLoader = this.geometryHandlers[ \"ascii\" ][ \"loaderObject\" ];\n\t\t\t\t\tvar model = jsonLoader.parse( modelJson, texture_path );\n\t\t\t\t\tcreate_callback_embed( geoID )( model.geometry, model.materials );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// textures\n\n\t\t// count how many textures will be loaded asynchronously\n\n\t\tvar textureID, textureJSON;\n\n\t\tfor ( textureID in data.textures ) {\n\n\t\t\ttextureJSON = data.textures[ textureID ];\n\n\t\t\tif ( Array.isArray( textureJSON.url ) ) {\n\n\t\t\t\tcounter_textures += textureJSON.url.length;\n\n\t\t\t\tfor ( var n = 0; n < textureJSON.url.length; n ++ ) {\n\n\t\t\t\t\tscope.onLoadStart();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tcounter_textures += 1;\n\n\t\t\t\tscope.onLoadStart();\n\n\t\t\t}\n\n\t\t}\n\n\t\ttotal_textures = counter_textures;\n\n\t\tfor ( textureID in data.textures ) {\n\n\t\t\ttextureJSON = data.textures[ textureID ];\n\n\t\t\tif ( textureJSON.mapping !== undefined && THREE[ textureJSON.mapping ] !== undefined ) {\n\n\t\t\t\ttextureJSON.mapping = THREE[ textureJSON.mapping ];\n\n\t\t\t}\n\n\t\t\tvar texture;\n\n\t\t\tif ( Array.isArray( textureJSON.url ) ) {\n\n\t\t\t\tvar count = textureJSON.url.length;\n\t\t\t\tvar url_array = [];\n\n\t\t\t\tfor ( var i = 0; i < count; i ++ ) {\n\n\t\t\t\t\turl_array[ i ] = get_url( textureJSON.url[ i ], data.urlBaseType );\n\n\t\t\t\t}\n\n\t\t\t\tvar loader = THREE.Loader.Handlers.get( url_array[ 0 ] );\n\n\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\ttexture = loader.load( url_array, generateTextureCallback( count ) );\n\n\t\t\t\t\tif ( textureJSON.mapping !== undefined )\n\t\t\t\t\t\ttexture.mapping = textureJSON.mapping;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture = new THREE.CubeTextureLoader().load( urls, generateTextureCallback( count ) );\n\t\t\t\t\ttexture.mapping = textureJSON.mapping;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar fullUrl = get_url( textureJSON.url, data.urlBaseType );\n\t\t\t\tvar textureCallback = generateTextureCallback( 1 );\n\n\t\t\t\tvar loader = THREE.Loader.Handlers.get( fullUrl );\n\n\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\ttexture = loader.load( fullUrl, textureCallback );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture = new THREE.Texture();\n\t\t\t\t\tloader = new THREE.ImageLoader();\n\n\t\t\t\t\t( function ( texture ) {\n\n\t\t\t\t\t\tloader.load( fullUrl, function ( image ) {\n\n\t\t\t\t\t\t\ttexture.image = image;\n\t\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\t\ttextureCallback();\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} )( texture )\n\n\n\t\t\t\t}\n\n\t\t\t\tif ( textureJSON.mapping !== undefined )\n\t\t\t\t\ttexture.mapping = textureJSON.mapping;\n\n\t\t\t\tif ( THREE[ textureJSON.minFilter ] !== undefined )\n\t\t\t\t\ttexture.minFilter = THREE[ textureJSON.minFilter ];\n\n\t\t\t\tif ( THREE[ textureJSON.magFilter ] !== undefined )\n\t\t\t\t\ttexture.magFilter = THREE[ textureJSON.magFilter ];\n\n\t\t\t\tif ( textureJSON.anisotropy ) texture.anisotropy = textureJSON.anisotropy;\n\n\t\t\t\tif ( textureJSON.repeat ) {\n\n\t\t\t\t\ttexture.repeat.set( textureJSON.repeat[ 0 ], textureJSON.repeat[ 1 ] );\n\n\t\t\t\t\tif ( textureJSON.repeat[ 0 ] !== 1 ) texture.wrapS = THREE.RepeatWrapping;\n\t\t\t\t\tif ( textureJSON.repeat[ 1 ] !== 1 ) texture.wrapT = THREE.RepeatWrapping;\n\n\t\t\t\t}\n\n\t\t\t\tif ( textureJSON.offset ) {\n\n\t\t\t\t\ttexture.offset.set( textureJSON.offset[ 0 ], textureJSON.offset[ 1 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// handle wrap after repeat so that default repeat can be overriden\n\n\t\t\t\tif ( textureJSON.wrap ) {\n\n\t\t\t\t\tvar wrapMap = {\n\t\t\t\t\t\t\"repeat\": THREE.RepeatWrapping,\n\t\t\t\t\t\t\"mirror\": THREE.MirroredRepeatWrapping\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( wrapMap[ textureJSON.wrap[ 0 ] ] !== undefined ) texture.wrapS = wrapMap[ textureJSON.wrap[ 0 ] ];\n\t\t\t\t\tif ( wrapMap[ textureJSON.wrap[ 1 ] ] !== undefined ) texture.wrapT = wrapMap[ textureJSON.wrap[ 1 ] ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tresult.textures[ textureID ] = texture;\n\n\t\t}\n\n\t\t// materials\n\n\t\tvar matID, matJSON;\n\t\tvar parID;\n\n\t\tfor ( matID in data.materials ) {\n\n\t\t\tmatJSON = data.materials[ matID ];\n\n\t\t\tfor ( parID in matJSON.parameters ) {\n\n\t\t\t\tif ( parID === \"envMap\" || parID === \"map\" || parID === \"lightMap\" || parID === \"bumpMap\" || parID === \"normalMap\" || parID === \"alphaMap\" ) {\n\n\t\t\t\t\tmatJSON.parameters[ parID ] = result.textures[ matJSON.parameters[ parID ] ];\n\n\t\t\t\t} else if ( parID === \"shading\" ) {\n\n\t\t\t\t\tmatJSON.parameters[ parID ] = ( matJSON.parameters[ parID ] === \"flat\" ) ? THREE.FlatShading : THREE.SmoothShading;\n\n\t\t\t\t} else if ( parID === \"side\" ) {\n\n\t\t\t\t\tif ( matJSON.parameters[ parID ] == \"double\" ) {\n\n\t\t\t\t\t\tmatJSON.parameters[ parID ] = THREE.DoubleSide;\n\n\t\t\t\t\t} else if ( matJSON.parameters[ parID ] == \"back\" ) {\n\n\t\t\t\t\t\tmatJSON.parameters[ parID ] = THREE.BackSide;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmatJSON.parameters[ parID ] = THREE.FrontSide;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( parID === \"blending\" ) {\n\n\t\t\t\t\tmatJSON.parameters[ parID ] = matJSON.parameters[ parID ] in THREE ? THREE[ matJSON.parameters[ parID ] ] : THREE.NormalBlending;\n\n\t\t\t\t} else if ( parID === \"combine\" ) {\n\n\t\t\t\t\tmatJSON.parameters[ parID ] = matJSON.parameters[ parID ] in THREE ? THREE[ matJSON.parameters[ parID ] ] : THREE.MultiplyOperation;\n\n\t\t\t\t} else if ( parID === \"vertexColors\" ) {\n\n\t\t\t\t\tif ( matJSON.parameters[ parID ] == \"face\" ) {\n\n\t\t\t\t\t\tmatJSON.parameters[ parID ] = THREE.FaceColors;\n\n\t\t\t\t\t// default to vertex colors if \"vertexColors\" is anything else face colors or 0 / null / false\n\n\t\t\t\t\t} else if ( matJSON.parameters[ parID ] ) {\n\n\t\t\t\t\t\tmatJSON.parameters[ parID ] = THREE.VertexColors;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( parID === \"wrapRGB\" ) {\n\n\t\t\t\t\tvar v3 = matJSON.parameters[ parID ];\n\t\t\t\t\tmatJSON.parameters[ parID ] = new THREE.Vector3( v3[ 0 ], v3[ 1 ], v3[ 2 ] );\n\n\t\t\t\t} else if ( parID === \"normalScale\" ) {\n\n\t\t\t\t\tvar v2 = matJSON.parameters[ parID ];\n\t\t\t\t\tmatJSON.parameters[ parID ] = new THREE.Vector2( v2[ 0 ], v2[ 1 ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( matJSON.parameters.opacity !== undefined && matJSON.parameters.opacity < 1.0 ) {\n\n\t\t\t\tmatJSON.parameters.transparent = true;\n\n\t\t\t}\n\n\t\t\tmaterial = new THREE[ matJSON.type ]( matJSON.parameters );\n\t\t\tmaterial.name = matID;\n\n\t\t\tresult.materials[ matID ] = material;\n\n\t\t}\n\n\t\t// second pass through all materials to initialize MultiMaterials\n\t\t// that could be referring to other materials out of order\n\n\t\tfor ( matID in data.materials ) {\n\n\t\t\tmatJSON = data.materials[ matID ];\n\n\t\t\tif ( matJSON.parameters.materials ) {\n\n\t\t\t\tvar materialArray = [];\n\n\t\t\t\tfor ( var i = 0; i < matJSON.parameters.materials.length; i ++ ) {\n\n\t\t\t\t\tvar label = matJSON.parameters.materials[ i ];\n\t\t\t\t\tmaterialArray.push( result.materials[ label ] );\n\n\t\t\t\t}\n\n\t\t\t\tresult.materials[ matID ].materials = materialArray;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// objects ( synchronous init of procedural primitives )\n\n\t\thandle_objects();\n\n\t\t// defaults\n\n\t\tif ( result.cameras && data.defaults.camera ) {\n\n\t\t\tresult.currentCamera = result.cameras[ data.defaults.camera ];\n\n\t\t}\n\n\t\tif ( result.fogs && data.defaults.fog ) {\n\n\t\t\tresult.scene.fog = result.fogs[ data.defaults.fog ];\n\n\t\t}\n\n\t\t// synchronous callback\n\n\t\tscope.callbackSync( result );\n\n\t\t// just in case there are no async elements\n\n\t\tasync_callback_gate();\n\n\t}\n\n};\n"
  },
  {
    "path": "browser/vendor/three/THREEx.FullScreen.js",
    "content": "// This THREEx helper makes it easy to handle the fullscreen API\n// * it hides the prefix for each browser\n// * it hides the little discrepencies of the various vendor API\n// * at the time of this writing (nov 2011) it is available in \n//   [firefox nightly](http://blog.pearce.org.nz/2011/11/firefoxs-html-full-screen-api-enabled.html),\n//   [webkit nightly](http://peter.sh/2011/01/javascript-full-screen-api-navigation-timing-and-repeating-css-gradients/) and\n//   [chrome stable](http://updates.html5rocks.com/2011/10/Let-Your-Content-Do-the-Talking-Fullscreen-API).\n\n// \n// # Code\n\n//\n\n/** @namespace */\nvar THREEx\t\t= THREEx \t\t|| {};\nTHREEx.FullScreen\t= THREEx.FullScreen\t|| {};\n\n/**\n * test if it is possible to have fullscreen\n * \n * @returns {Boolean} true if fullscreen API is available, false otherwise\n*/\nTHREEx.FullScreen.available\t= function()\n{\n\treturn this._hasWebkitFullScreen || this._hasMozFullScreen;\n}\n\n/**\n * test if fullscreen is currently activated\n * \n * @returns {Boolean} true if fullscreen is currently activated, false otherwise\n*/\nTHREEx.FullScreen.activated\t= function()\n{\n\tif( this._hasWebkitFullScreen ){\n\t\treturn document.webkitIsFullScreen;\n\t}else if( this._hasMozFullScreen ){\n\t\treturn document.mozFullScreen;\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n/**\n * Request fullscreen on a given element\n * @param {DomElement} element to make fullscreen. optional. default to document.body\n*/\nTHREEx.FullScreen.request\t= function(element)\n{\n\telement\t= element\t|| document.body;\n\tif( this._hasWebkitFullScreen ){\n\t\telement.webkitRequestFullScreen();\n\t}else if( this._hasMozFullScreen ){\n\t\telement.mozRequestFullScreen();\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n/**\n * Cancel fullscreen\n*/\nTHREEx.FullScreen.cancel\t= function()\n{\n\tif( this._hasWebkitFullScreen ){\n\t\tdocument.webkitCancelFullScreen();\n\t}else if( this._hasMozFullScreen ){\n\t\tdocument.mozCancelFullScreen();\n\t}else{\n\t\tconsole.assert(false);\n\t}\n}\n\n// internal functions to know which fullscreen API implementation is available\nTHREEx.FullScreen._hasWebkitFullScreen\t= 'webkitCancelFullScreen' in document\t? true : false;\t\nTHREEx.FullScreen._hasMozFullScreen\t= 'mozCancelFullScreen' in document\t? true : false;\t\n\n"
  },
  {
    "path": "browser/vendor/three/TransformControls.js",
    "content": "/**\n * @author arodic / https://github.com/arodic\n */\n /*jshint sub:true*/\n\n( function () {\n\n\t'use strict';\n\n\n\tvar GizmoMaterial = function ( parameters ) {\n\n\t\tTHREE.MeshBasicMaterial.call( this );\n\n\t\tthis.depthTest = false;\n\t\tthis.depthWrite = false;\n\t\tthis.side = THREE.FrontSide;\n\t\tthis.transparent = true;\n\t\tthis.fog = false\n\n\t\tthis.setValues( parameters );\n\n\t\tthis.oldColor = this.color.clone();\n\t\tthis.oldOpacity = this.opacity;\n\n\t\tthis.disable = function( disabled ) {\n\t\t\tif ( disabled ) {\n\t\t\t\tthis.color.setRGB(\n\t\t\t\t\t0.5 + (this.oldColor.r - 0.5) * 0.2,\n\t\t\t\t\t0.5 + (this.oldColor.g - 0.5) * 0.2,\n\t\t\t\t\t0.5 + (this.oldColor.b - 0.5) * 0.2)\n\t\t\t} else {\n\t\t\t\tthis.color.copy( this.oldColor )\n\t\t\t}\n\t\t}\n\n\t\tthis.highlight = function( highlighted ) {\n\n\t\t\tif ( highlighted ) {\n\n\t\t\t\tthis.color.setRGB( 1, 1, 0 );\n\t\t\t\tthis.opacity = 1;\n\n\t\t\t} else {\n\n\t\t\t\tthis.color.copy( this.oldColor );\n\t\t\t\tthis.opacity = this.oldOpacity;\n\n\t\t\t}\n\n\t\t};\n\n\t};\n\n\tGizmoMaterial.prototype = Object.create( THREE.MeshBasicMaterial.prototype );\n\tGizmoMaterial.prototype.constructor = GizmoMaterial;\n\n\n\tvar GizmoLineMaterial = function ( parameters ) {\n\n\t\tTHREE.LineBasicMaterial.call( this );\n\n\t\tthis.depthTest = false;\n\t\tthis.depthWrite = false;\n\t\tthis.transparent = true;\n\t\tthis.linewidth = 1;\n\n\t\tthis.setValues( parameters );\n\n\t\tthis.oldColor = this.color.clone();\n\t\tthis.oldOpacity = this.opacity;\n\n\t\tthis.fog = false\n\n\t\tthis.disable = function( disabled ) {\n\t\t\tif ( disabled ) {\n\t\t\t\tthis.color.setRGB(\n\t\t\t\t\t0.5 + (this.oldColor.r - 0.5) * 0.2,\n\t\t\t\t\t0.5 + (this.oldColor.g - 0.5) * 0.2,\n\t\t\t\t\t0.5 + (this.oldColor.b - 0.5) * 0.2)\n\t\t\t} else {\n\t\t\t\tthis.color.copy(this.oldColor)\n\t\t\t}\n\t\t}\n\n\t\tthis.highlight = function( highlighted ) {\n\n\t\t\tif ( highlighted ) {\n\n\t\t\t\tthis.color.setRGB( 1, 1, 0 );\n\t\t\t\tthis.opacity = 1;\n\n\t\t\t} else {\n\n\t\t\t\tthis.color.copy( this.oldColor );\n\t\t\t\tthis.opacity = this.oldOpacity;\n\n\t\t\t}\n\n\t\t};\n\n\t};\n\n\tGizmoLineMaterial.prototype = Object.create( THREE.LineBasicMaterial.prototype );\n\tGizmoLineMaterial.prototype.constructor = GizmoLineMaterial;\n\n\tfunction fixRenderOrder(mesh) {\n\t\t// 1 above default, so that these meshes get always rendered\n\t\t// on top of anything else\n\t\tmesh.renderOrder = 1\n\t}\n\n\tfunction fixGizmoArray(gizmos) {\n\t\tObject.keys(gizmos).forEach(function(key) {\n\t\t\tfor (var i = 0; i < gizmos[key].length; ++i) {\n\t\t\t\tvar gizmo = gizmos[key][i]\n\t\t\t\tfor (var j = 0; j < gizmo.length; ++j) {\n\t\t\t\t\tif (gizmo[j] instanceof THREE.Mesh || gizmo[j] instanceof THREE.Line) {\n\t\t\t\t\t\tfixRenderOrder(gizmo[j])\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n\n\n\tvar pickerMaterial = new GizmoMaterial( { visible: false, transparent: false } );\n\n\n\tTHREE.TransformGizmo = function () {\n\n\t\tvar scope = this;\n\n\t\tthis.init = function () {\n\n\t\t\tTHREE.Object3D.call( this );\n\n\t\t\tthis.handles = new THREE.Object3D();\n\t\t\tthis.pickers = new THREE.Object3D();\n\t\t\tthis.planes = new THREE.Object3D();\n\n\t\t\tthis.add( this.handles );\n\t\t\tthis.add( this.pickers );\n\t\t\tthis.add( this.planes );\n\n\t\t\t//// PLANES\n\n\t\t\tvar planeGeometry = new THREE.PlaneBufferGeometry( 50, 50, 2, 2 );\n\t\t\tvar planeMaterial = new THREE.MeshBasicMaterial( { visible: false, side: THREE.DoubleSide } );\n\n\t\t\tvar planes = {\n\t\t\t\t\"XY\":   new THREE.Mesh( planeGeometry, planeMaterial ),\n\t\t\t\t\"YZ\":   new THREE.Mesh( planeGeometry, planeMaterial ),\n\t\t\t\t\"XZ\":   new THREE.Mesh( planeGeometry, planeMaterial ),\n\t\t\t\t\"XYZE\": new THREE.Mesh( planeGeometry, planeMaterial )\n\t\t\t};\n\n\t\t\tthis.activePlane = planes[ \"XYZE\" ];\n\n\t\t\tplanes[ \"YZ\" ].rotation.set( 0, Math.PI / 2, 0 );\n\t\t\tplanes[ \"XZ\" ].rotation.set( - Math.PI / 2, 0, 0 );\n\n\t\t\tfor ( var i in planes ) {\n\n\t\t\t\tplanes[ i ].name = i;\n\t\t\t\tthis.planes.add( planes[ i ] );\n\t\t\t\tthis.planes[ i ] = planes[ i ];\n\n\t\t\t}\n\n\t\t\t//// HANDLES AND PICKERS\n\n\t\t\tvar setupGizmos = function( gizmoMap, parent ) {\n\n\t\t\t\tfor ( var name in gizmoMap ) {\n\n\t\t\t\t\tfor ( i = gizmoMap[ name ].length; i --; ) {\n\n\t\t\t\t\t\tvar object = gizmoMap[ name ][ i ][ 0 ];\n\t\t\t\t\t\tvar position = gizmoMap[ name ][ i ][ 1 ];\n\t\t\t\t\t\tvar rotation = gizmoMap[ name ][ i ][ 2 ];\n\n\t\t\t\t\t\tobject.name = name;\n\n\t\t\t\t\t\tif ( position ) object.position.set( position[ 0 ], position[ 1 ], position[ 2 ] );\n\t\t\t\t\t\tif ( rotation ) object.rotation.set( rotation[ 0 ], rotation[ 1 ], rotation[ 2 ] );\n\n\t\t\t\t\t\tparent.add( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tsetupGizmos( this.handleGizmos, this.handles );\n\t\t\tsetupGizmos( this.pickerGizmos, this.pickers );\n\n\t\t\t// reset Transformations\n\n\t\t\tthis.traverse( function ( child ) {\n\n\t\t\t\tif ( child instanceof THREE.Mesh ) {\n\n\t\t\t\t\tchild.updateMatrix();\n\n\t\t\t\t\tvar tempGeometry = child.geometry.clone();\n\t\t\t\t\ttempGeometry.applyMatrix( child.matrix );\n\t\t\t\t\tchild.geometry = tempGeometry;\n\n\t\t\t\t\tchild.position.set( 0, 0, 0 );\n\t\t\t\t\tchild.rotation.set( 0, 0, 0 );\n\t\t\t\t\tchild.scale.set( 1, 1, 1 );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t};\n\n\t\tthis.highlight = function ( axis ) {\n\n\t\t\tthis.traverse( function( child ) {\n\n\t\t\t\tif ( child.material && child.material.highlight ) {\n\n\t\t\t\t\tif ( child.name === axis ) {\n\n\t\t\t\t\t\tchild.material.highlight( true );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tchild.material.highlight( false );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t};\n\n\t\tthis.disable = function(disable) {\n\t\t\tthis.traverse( function( child ) {\n\t\t\t\tif (child.material && child.material.disable) {\n\t\t\t\t\tchild.material.disable(disable)\n\t\t\t\t}\n\t\t\t})\n\t\t}\n\n\t};\n\n\tTHREE.TransformGizmo.prototype = Object.create( THREE.Object3D.prototype );\n\tTHREE.TransformGizmo.prototype.constructor = THREE.TransformGizmo;\n\n\tTHREE.TransformGizmo.prototype.update = function ( rotation, eye ) {\n\n\t\tvar vec1 = new THREE.Vector3( 0, 0, 0 );\n\t\tvar vec2 = new THREE.Vector3( 0, 1, 0 );\n\t\tvar lookAtMatrix = new THREE.Matrix4();\n\n\t\tthis.traverse( function( child ) {\n\n\t\t\tif ( child.name.search( \"E\" ) !== - 1 ) {\n\n\t\t\t\tchild.quaternion.setFromRotationMatrix( lookAtMatrix.lookAt( eye, vec1, vec2 ) );\n\n\t\t\t} else if ( child.name.search( \"X\" ) !== - 1 || child.name.search( \"Y\" ) !== - 1 || child.name.search( \"Z\" ) !== - 1 ) {\n\n\t\t\t\tchild.quaternion.setFromEuler( rotation );\n\n\t\t\t}\n\n\t\t} );\n\n\t};\n\n\tTHREE.TransformGizmoTranslate = function () {\n\n\t\tTHREE.TransformGizmo.call( this );\n\n\t\tvar arrowGeometry = new THREE.Geometry();\n\t\tvar mesh = new THREE.Mesh( new THREE.CylinderGeometry( 0, 0.05, 0.2, 12, 1, false ) );\n\t\tmesh.position.y = 0.5;\n\t\tmesh.updateMatrix();\n\n\t\tarrowGeometry.merge( mesh.geometry, mesh.matrix );\n\n\t\tvar lineXGeometry = new THREE.BufferGeometry();\n\t\tlineXGeometry.addAttribute( 'position', new THREE.Float32BufferAttribute( [ 0, 0, 0,  1, 0, 0 ], 3 ) );\n\n\t\tvar lineYGeometry = new THREE.BufferGeometry();\n\t\tlineYGeometry.addAttribute( 'position', new THREE.Float32BufferAttribute( [ 0, 0, 0,  0, 1, 0 ], 3 ) );\n\n\t\tvar lineZGeometry = new THREE.BufferGeometry();\n\t\tlineZGeometry.addAttribute( 'position', new THREE.Float32BufferAttribute( [ 0, 0, 0,  0, 0, 1 ], 3 ) );\n\n\t\tthis.handleGizmos = {\n\n\t\t\tX: [\n\t\t\t\t[ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0xff0000 } ) ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ] ],\n\t\t\t\t[ new THREE.Line( lineXGeometry, new GizmoLineMaterial( { color: 0xff0000 } ) ) ]\n\t\t\t],\n\n\t\t\tY: [\n\t\t\t\t[ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0x00ff00 } ) ), [ 0, 0.5, 0 ] ],\n\t\t\t\t[\tnew THREE.Line( lineYGeometry, new GizmoLineMaterial( { color: 0x00ff00 } ) ) ]\n\t\t\t],\n\n\t\t\tZ: [\n\t\t\t\t[ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0x0000ff } ) ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ] ],\n\t\t\t\t[ new THREE.Line( lineZGeometry, new GizmoLineMaterial( { color: 0x0000ff } ) ) ]\n\t\t\t],\n\n\t\t\tXYZ: [\n\t\t\t\t[ new THREE.Mesh( new THREE.OctahedronGeometry( 0.1, 0 ), new GizmoMaterial( { color: 0xffffff, opacity: 0.25 } ) ), [ 0, 0, 0 ], [ 0, 0, 0 ] ]\n\t\t\t],\n\n\t\t\tXY: [\n\t\t\t\t[ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.29, 0.29 ), new GizmoMaterial( { color: 0xffff00, opacity: 0.25 } ) ), [ 0.15, 0.15, 0 ] ]\n\t\t\t],\n\n\t\t\tYZ: [\n\t\t\t\t[ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.29, 0.29 ), new GizmoMaterial( { color: 0x00ffff, opacity: 0.25 } ) ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ] ]\n\t\t\t],\n\n\t\t\tXZ: [\n\t\t\t\t[ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.29, 0.29 ), new GizmoMaterial( { color: 0xff00ff, opacity: 0.25 } ) ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ] ]\n\t\t\t]\n\n\t\t};\n\n\t\tthis.pickerGizmos = {\n\n\t\t\tX: [\n\t\t\t\t[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), pickerMaterial ), [ 0.6, 0, 0 ], [ 0, 0, - Math.PI / 2 ] ]\n\t\t\t],\n\n\t\t\tY: [\n\t\t\t\t[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), pickerMaterial ), [ 0, 0.6, 0 ] ]\n\t\t\t],\n\n\t\t\tZ: [\n\t\t\t\t[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), pickerMaterial ), [ 0, 0, 0.6 ], [ Math.PI / 2, 0, 0 ] ]\n\t\t\t],\n\n\t\t\tXYZ: [\n\t\t\t\t[ new THREE.Mesh( new THREE.OctahedronGeometry( 0.2, 0 ), pickerMaterial ) ]\n\t\t\t],\n\n\t\t\tXY: [\n\t\t\t\t[ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.4, 0.4 ), pickerMaterial ), [ 0.2, 0.2, 0 ] ]\n\t\t\t],\n\n\t\t\tYZ: [\n\t\t\t\t[ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.4, 0.4 ), pickerMaterial ), [ 0, 0.2, 0.2 ], [ 0, Math.PI / 2, 0 ] ]\n\t\t\t],\n\n\t\t\tXZ: [\n\t\t\t\t[ new THREE.Mesh( new THREE.PlaneBufferGeometry( 0.4, 0.4 ), pickerMaterial ), [ 0.2, 0, 0.2 ], [ - Math.PI / 2, 0, 0 ] ]\n\t\t\t]\n\n\t\t};\n\n\t\t// move gizmos on top of other render elements by default\n\t\tfixGizmoArray(this.handleGizmos)\n\t\tfixGizmoArray(this.pickerGizmos)\n\n\t\tthis.setActivePlane = function ( axis, eye ) {\n\n\t\t\tvar tempMatrix = new THREE.Matrix4();\n\t\t\teye.applyMatrix4( tempMatrix.getInverse( tempMatrix.extractRotation( this.planes[ \"XY\" ].matrixWorld ) ) );\n\n\t\t\tif ( axis === \"X\" ) {\n\n\t\t\t\tthis.activePlane = this.planes[ \"XY\" ];\n\n\t\t\t\tif ( Math.abs( eye.y ) > Math.abs( eye.z ) ) this.activePlane = this.planes[ \"XZ\" ];\n\n\t\t\t}\n\n\t\t\tif ( axis === \"Y\" ) {\n\n\t\t\t\tthis.activePlane = this.planes[ \"XY\" ];\n\n\t\t\t\tif ( Math.abs( eye.x ) > Math.abs( eye.z ) ) this.activePlane = this.planes[ \"YZ\" ];\n\n\t\t\t}\n\n\t\t\tif ( axis === \"Z\" ) {\n\n\t\t\t\tthis.activePlane = this.planes[ \"XZ\" ];\n\n\t\t\t\tif ( Math.abs( eye.x ) > Math.abs( eye.y ) ) this.activePlane = this.planes[ \"YZ\" ];\n\n\t\t\t}\n\n\t\t\tif ( axis === \"XYZ\" ) this.activePlane = this.planes[ \"XYZE\" ];\n\n\t\t\tif ( axis === \"XY\" ) this.activePlane = this.planes[ \"XY\" ];\n\n\t\t\tif ( axis === \"YZ\" ) this.activePlane = this.planes[ \"YZ\" ];\n\n\t\t\tif ( axis === \"XZ\" ) this.activePlane = this.planes[ \"XZ\" ];\n\n\t\t};\n\n\t\tthis.init();\n\n\t};\n\n\tTHREE.TransformGizmoTranslate.prototype = Object.create( THREE.TransformGizmo.prototype );\n\tTHREE.TransformGizmoTranslate.prototype.constructor = THREE.TransformGizmoTranslate;\n\n\tTHREE.TransformGizmoRotate = function () {\n\n\t\tTHREE.TransformGizmo.call( this );\n\n\t\tvar CircleGeometry = function ( radius, facing, arc ) {\n\n\t\t\tvar geometry = new THREE.BufferGeometry();\n\t\t\tvar vertices = [];\n\t\t\tarc = arc ? arc : 1;\n\n\t\t\tfor ( var i = 0; i <= 64 * arc; ++ i ) {\n\n\t\t\t\tif ( facing === 'x' ) vertices.push( 0, Math.cos( i / 32 * Math.PI ) * radius, Math.sin( i / 32 * Math.PI ) * radius );\n\t\t\t\tif ( facing === 'y' ) vertices.push( Math.cos( i / 32 * Math.PI ) * radius, 0, Math.sin( i / 32 * Math.PI ) * radius );\n\t\t\t\tif ( facing === 'z' ) vertices.push( Math.sin( i / 32 * Math.PI ) * radius, Math.cos( i / 32 * Math.PI ) * radius, 0 );\n\n\t\t\t}\n\n\t\t\tgeometry.addAttribute( 'position', new THREE.Float32BufferAttribute( vertices, 3 ) );\n\t\t\treturn geometry;\n\n\t\t};\n\n\t\tthis.handleGizmos = {\n\n\t\t\tX: [\n\t\t\t\t[ new THREE.Line( new CircleGeometry( 1, 'x', 0.5 ), new GizmoLineMaterial( { color: 0xff0000 } ) ) ]\n\t\t\t],\n\n\t\t\tY: [\n\t\t\t\t[ new THREE.Line( new CircleGeometry( 1, 'y', 0.5 ), new GizmoLineMaterial( { color: 0x00ff00 } ) ) ]\n\t\t\t],\n\n\t\t\tZ: [\n\t\t\t\t[ new THREE.Line( new CircleGeometry( 1, 'z', 0.5 ), new GizmoLineMaterial( { color: 0x0000ff } ) ) ]\n\t\t\t],\n\n\t\t\tE: [\n\t\t\t\t[ new THREE.Line( new CircleGeometry( 1.25, 'z', 1 ), new GizmoLineMaterial( { color: 0xcccc00 } ) ) ]\n\t\t\t],\n\n\t\t\tXYZE: [\n\t\t\t\t[ new THREE.Line( new CircleGeometry( 1, 'z', 1 ), new GizmoLineMaterial( { color: 0x787878 } ) ) ]\n\t\t\t]\n\n\t\t};\n\n\t\tthis.pickerGizmos = {\n\n\t\t\tX: [\n\t\t\t\t[ new THREE.Mesh( new THREE.TorusGeometry( 1, 0.12, 4, 12, Math.PI ), pickerMaterial ), [ 0, 0, 0 ], [ 0, - Math.PI / 2, - Math.PI / 2 ] ]\n\t\t\t],\n\n\t\t\tY: [\n\t\t\t\t[ new THREE.Mesh( new THREE.TorusGeometry( 1, 0.12, 4, 12, Math.PI ), pickerMaterial ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ] ]\n\t\t\t],\n\n\t\t\tZ: [\n\t\t\t\t[ new THREE.Mesh( new THREE.TorusGeometry( 1, 0.12, 4, 12, Math.PI ), pickerMaterial ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ] ]\n\t\t\t],\n\n\t\t\tE: [\n\t\t\t\t[ new THREE.Mesh( new THREE.TorusGeometry( 1.25, 0.12, 2, 24 ), pickerMaterial ) ]\n\t\t\t],\n\n\t\t\tXYZE: [\n\t\t\t\t[ new THREE.Mesh( new THREE.Geometry() ) ]// TODO\n\t\t\t]\n\n\t\t};\n\n\t\t// move gizmos on top of other render elements by default\n\t\tfixGizmoArray(this.handleGizmos)\n\t\tfixGizmoArray(this.pickerGizmos)\n\n\t\tthis.setActivePlane = function ( axis ) {\n\n\t\t\tif ( axis === \"E\" ) this.activePlane = this.planes[ \"XYZE\" ];\n\n\t\t\tif ( axis === \"X\" ) this.activePlane = this.planes[ \"YZ\" ];\n\n\t\t\tif ( axis === \"Y\" ) this.activePlane = this.planes[ \"XZ\" ];\n\n\t\t\tif ( axis === \"Z\" ) this.activePlane = this.planes[ \"XY\" ];\n\n\t\t};\n\n\t\tthis.update = function ( rotation, eye2 ) {\n\n\t\t\tTHREE.TransformGizmo.prototype.update.apply( this, arguments );\n\n\t\t\tvar group = {\n\n\t\t\t\thandles: this[ \"handles\" ],\n\t\t\t\tpickers: this[ \"pickers\" ],\n\n\t\t\t};\n\n\t\t\tvar tempMatrix = new THREE.Matrix4();\n\t\t\tvar worldRotation = new THREE.Euler( 0, 0, 1 );\n\t\t\tvar tempQuaternion = new THREE.Quaternion();\n\t\t\tvar unitX = new THREE.Vector3( 1, 0, 0 );\n\t\t\tvar unitY = new THREE.Vector3( 0, 1, 0 );\n\t\t\tvar unitZ = new THREE.Vector3( 0, 0, 1 );\n\t\t\tvar quaternionX = new THREE.Quaternion();\n\t\t\tvar quaternionY = new THREE.Quaternion();\n\t\t\tvar quaternionZ = new THREE.Quaternion();\n\t\t\tvar eye = eye2.clone();\n\n\t\t\tworldRotation.copy( this.planes[ \"XY\" ].rotation );\n\t\t\ttempQuaternion.setFromEuler( worldRotation );\n\n\t\t\ttempMatrix.makeRotationFromQuaternion( tempQuaternion ).getInverse( tempMatrix );\n\t\t\teye.applyMatrix4( tempMatrix );\n\n\t\t\tthis.traverse( function( child ) {\n\n\t\t\t\ttempQuaternion.setFromEuler( worldRotation );\n\n\t\t\t\tif ( child.name === \"X\" ) {\n\n\t\t\t\t\tquaternionX.setFromAxisAngle( unitX, Math.atan2( - eye.y, eye.z ) );\n\t\t\t\t\ttempQuaternion.multiplyQuaternions( tempQuaternion, quaternionX );\n\t\t\t\t\tchild.quaternion.copy( tempQuaternion );\n\n\t\t\t\t}\n\n\t\t\t\tif ( child.name === \"Y\" ) {\n\n\t\t\t\t\tquaternionY.setFromAxisAngle( unitY, Math.atan2( eye.x, eye.z ) );\n\t\t\t\t\ttempQuaternion.multiplyQuaternions( tempQuaternion, quaternionY );\n\t\t\t\t\tchild.quaternion.copy( tempQuaternion );\n\n\t\t\t\t}\n\n\t\t\t\tif ( child.name === \"Z\" ) {\n\n\t\t\t\t\tquaternionZ.setFromAxisAngle( unitZ, Math.atan2( eye.y, eye.x ) );\n\t\t\t\t\ttempQuaternion.multiplyQuaternions( tempQuaternion, quaternionZ );\n\t\t\t\t\tchild.quaternion.copy( tempQuaternion );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t};\n\n\t\tthis.init();\n\n\t};\n\n\tTHREE.TransformGizmoRotate.prototype = Object.create( THREE.TransformGizmo.prototype );\n\tTHREE.TransformGizmoRotate.prototype.constructor = THREE.TransformGizmoRotate;\n\n\tTHREE.TransformGizmoScale = function () {\n\n\t\tTHREE.TransformGizmo.call( this );\n\n\t\tvar arrowGeometry = new THREE.Geometry();\n\t\tvar mesh = new THREE.Mesh( new THREE.BoxGeometry( 0.125, 0.125, 0.125 ) );\n\t\tmesh.position.y = 0.5;\n\t\tmesh.updateMatrix();\n\n\t\tarrowGeometry.merge( mesh.geometry, mesh.matrix );\n\n\t\tvar lineXGeometry = new THREE.BufferGeometry();\n\t\tlineXGeometry.addAttribute( 'position', new THREE.Float32BufferAttribute( [ 0, 0, 0,  1, 0, 0 ], 3 ) );\n\n\t\tvar lineYGeometry = new THREE.BufferGeometry();\n\t\tlineYGeometry.addAttribute( 'position', new THREE.Float32BufferAttribute( [ 0, 0, 0,  0, 1, 0 ], 3 ) );\n\n\t\tvar lineZGeometry = new THREE.BufferGeometry();\n\t\tlineZGeometry.addAttribute( 'position', new THREE.Float32BufferAttribute( [ 0, 0, 0,  0, 0, 1 ], 3 ) );\n\n\t\tthis.handleGizmos = {\n\n\t\t\tX: [\n\t\t\t\t[ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0xff0000 } ) ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ] ],\n\t\t\t\t[ new THREE.Line( lineXGeometry, new GizmoLineMaterial( { color: 0xff0000 } ) ) ]\n\t\t\t],\n\n\t\t\tY: [\n\t\t\t\t[ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0x00ff00 } ) ), [ 0, 0.5, 0 ] ],\n\t\t\t\t[ new THREE.Line( lineYGeometry, new GizmoLineMaterial( { color: 0x00ff00 } ) ) ]\n\t\t\t],\n\n\t\t\tZ: [\n\t\t\t\t[ new THREE.Mesh( arrowGeometry, new GizmoMaterial( { color: 0x0000ff } ) ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ] ],\n\t\t\t\t[ new THREE.Line( lineZGeometry, new GizmoLineMaterial( { color: 0x0000ff } ) ) ]\n\t\t\t],\n\n\t\t\tXYZ: [\n\t\t\t\t[ new THREE.Mesh( new THREE.BoxGeometry( 0.125, 0.125, 0.125 ), new GizmoMaterial( { color: 0xffffff, opacity: 0.25 } ) ) ]\n\t\t\t]\n\n\t\t};\n\n\t\tthis.pickerGizmos = {\n\n\t\t\tX: [\n\t\t\t\t[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), pickerMaterial ), [ 0.6, 0, 0 ], [ 0, 0, - Math.PI / 2 ] ]\n\t\t\t],\n\n\t\t\tY: [\n\t\t\t\t[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), pickerMaterial ), [ 0, 0.6, 0 ] ]\n\t\t\t],\n\n\t\t\tZ: [\n\t\t\t\t[ new THREE.Mesh( new THREE.CylinderGeometry( 0.2, 0, 1, 4, 1, false ), pickerMaterial ), [ 0, 0, 0.6 ], [ Math.PI / 2, 0, 0 ] ]\n\t\t\t],\n\n\t\t\tXYZ: [\n\t\t\t\t[ new THREE.Mesh( new THREE.BoxGeometry( 0.4, 0.4, 0.4 ), pickerMaterial ) ]\n\t\t\t]\n\n\t\t};\n\n\t\t// move gizmos on top of other render elements by default\n\t\tfixGizmoArray(this.handleGizmos)\n\t\tfixGizmoArray(this.pickerGizmos)\n\n\t\tthis.setActivePlane = function ( axis, eye ) {\n\n\t\t\tvar tempMatrix = new THREE.Matrix4();\n\t\t\teye.applyMatrix4( tempMatrix.getInverse( tempMatrix.extractRotation( this.planes[ \"XY\" ].matrixWorld ) ) );\n\n\t\t\tif ( axis === \"X\" ) {\n\n\t\t\t\tthis.activePlane = this.planes[ \"XY\" ];\n\t\t\t\tif ( Math.abs( eye.y ) > Math.abs( eye.z ) ) this.activePlane = this.planes[ \"XZ\" ];\n\n\t\t\t}\n\n\t\t\tif ( axis === \"Y\" ) {\n\n\t\t\t\tthis.activePlane = this.planes[ \"XY\" ];\n\t\t\t\tif ( Math.abs( eye.x ) > Math.abs( eye.z ) ) this.activePlane = this.planes[ \"YZ\" ];\n\n\t\t\t}\n\n\t\t\tif ( axis === \"Z\" ) {\n\n\t\t\t\tthis.activePlane = this.planes[ \"XZ\" ];\n\t\t\t\tif ( Math.abs( eye.x ) > Math.abs( eye.y ) ) this.activePlane = this.planes[ \"YZ\" ];\n\n\t\t\t}\n\n\t\t\tif ( axis === \"XYZ\" ) this.activePlane = this.planes[ \"XYZE\" ];\n\n\t\t};\n\n\t\tthis.init();\n\n\t};\n\n\tTHREE.TransformGizmoScale.prototype = Object.create( THREE.TransformGizmo.prototype );\n\tTHREE.TransformGizmoScale.prototype.constructor = THREE.TransformGizmoScale;\n\n\tTHREE.TransformControls = function ( camera, domElement ) {\n\n\t\t// TODO: Make non-uniform scale and rotate play nice in hierarchies\n\t\t// TODO: ADD RXYZ contol\n\n\t\tTHREE.Object3D.call( this );\n\n\t\tdomElement = ( domElement !== undefined ) ? domElement : document;\n\n\t\tthis.visible = false;\n\t\tthis.translationSnap = null;\n\t\tthis.rotationSnap = null;\n\t\tthis.space = \"world\";\n\t\tthis.size = 1;\n\t\tthis.axis = null;\n\n\t\tthis.objectCenter = new THREE.Vector3()\n\n\t\tthis.enabled = true\n\n\t\tvar scope = this;\n\n\t\tvar _mode = \"translate\";\n\t\tvar _dragging = false;\n\t\tvar _plane = \"XY\";\n\t\tvar _gizmo = {\n\n\t\t\t\"translate\": new THREE.TransformGizmoTranslate(),\n\t\t\t\"rotate\": new THREE.TransformGizmoRotate(),\n\t\t\t\"scale\": new THREE.TransformGizmoScale()\n\t\t};\n\n\t\tfor ( var type in _gizmo ) {\n\n\t\t\tvar gizmoObj = _gizmo[ type ];\n\n\t\t\tgizmoObj.visible = ( type === _mode );\n\t\t\tthis.add( gizmoObj );\n\n\t\t}\n\n\t\tvar changeEvent = { type: \"change\" };\n\t\tvar mouseDownEvent = { type: \"mouseDown\" };\n\t\tvar mouseUpEvent = { type: \"mouseUp\", mode: _mode };\n\t\tvar objectChangeEvent = { type: \"objectChange\" };\n\n\t\tvar ray = new THREE.Raycaster();\n\t\tvar pointerVector = new THREE.Vector2();\n\n\t\tvar point = new THREE.Vector3();\n\t\tvar offset = new THREE.Vector3();\n\n\t\tvar rotation = new THREE.Vector3();\n\t\tvar offsetRotation = new THREE.Vector3();\n\t\tvar scale = 1;\n\n\t\tvar lookAtMatrix = new THREE.Matrix4();\n\t\tvar eye = new THREE.Vector3();\n\n\t\tvar tempMatrix = new THREE.Matrix4();\n\t\tvar tempVector = new THREE.Vector3();\n\t\tvar tempQuaternion = new THREE.Quaternion();\n\t\tvar unitX = new THREE.Vector3( 1, 0, 0 );\n\t\tvar unitY = new THREE.Vector3( 0, 1, 0 );\n\t\tvar unitZ = new THREE.Vector3( 0, 0, 1 );\n\n\t\tvar quaternionXYZ = new THREE.Quaternion();\n\t\tvar quaternionX = new THREE.Quaternion();\n\t\tvar quaternionY = new THREE.Quaternion();\n\t\tvar quaternionZ = new THREE.Quaternion();\n\t\tvar quaternionE = new THREE.Quaternion();\n\n\t\tvar oldPosition = new THREE.Vector3();\n\t\tvar oldScale = new THREE.Vector3();\n\t\tvar oldRotationMatrix = new THREE.Matrix4();\n\t\tvar oldQuaternion = new THREE.Quaternion();\n\n\t\tvar parentRotationMatrix  = new THREE.Matrix4();\n\t\tvar parentScale = new THREE.Vector3();\n\n\t\tvar worldPosition = new THREE.Vector3();\n\t\tvar worldRotation = new THREE.Euler();\n\t\tvar worldRotationMatrix  = new THREE.Matrix4();\n\t\tvar camPosition = new THREE.Vector3();\n\t\tvar camRotation = new THREE.Euler();\n\n\t\tdomElement.addEventListener( \"mousedown\", onPointerDown, false );\n\t\tdomElement.addEventListener( \"touchstart\", onPointerDown, false );\n\n\t\tdomElement.addEventListener( \"mousemove\", onPointerHover, false );\n\t\tdomElement.addEventListener( \"touchmove\", onPointerHover, false );\n\n\t\tdomElement.addEventListener( \"mousemove\", onPointerMove, false );\n\t\tdomElement.addEventListener( \"touchmove\", onPointerMove, false );\n\n\t\tdomElement.addEventListener( \"mouseup\", onPointerUp, false );\n\t\tdomElement.addEventListener( \"mouseout\", onPointerUp, false );\n\t\tdomElement.addEventListener( \"touchend\", onPointerUp, false );\n\t\tdomElement.addEventListener( \"touchcancel\", onPointerUp, false );\n\t\tdomElement.addEventListener( \"touchleave\", onPointerUp, false );\n\n\t\tthis.dispose = function () {\n\n\t\t\tdomElement.removeEventListener( \"mousedown\", onPointerDown );\n\t\t\tdomElement.removeEventListener( \"touchstart\", onPointerDown );\n\n\t\t\tdomElement.removeEventListener( \"mousemove\", onPointerHover );\n\t\t\tdomElement.removeEventListener( \"touchmove\", onPointerHover );\n\n\t\t\tdomElement.removeEventListener( \"mousemove\", onPointerMove );\n\t\t\tdomElement.removeEventListener( \"touchmove\", onPointerMove );\n\n\t\t\tdomElement.removeEventListener( \"mouseup\", onPointerUp );\n\t\t\tdomElement.removeEventListener( \"mouseout\", onPointerUp );\n\t\t\tdomElement.removeEventListener( \"touchend\", onPointerUp );\n\t\t\tdomElement.removeEventListener( \"touchcancel\", onPointerUp );\n\t\t\tdomElement.removeEventListener( \"touchleave\", onPointerUp );\n\n\t\t};\n\n\t\tthis.calculateObjectCenter = function() {\n\t\t\tvar bbox = new THREE.Box3()\n\n\t\t\tthis.plugin.object3d.traverse( function(n) {\n\t\t\t\tif (!n.boundingBox && n.calculateBoundingBox) {\n\t\t\t\t\tn.calculateBoundingBox()\n\t\t\t\t}\n\n\t\t\t\tif (n.boundingBox) {\n\t\t\t\t\tbbox.expandByPoint(n.boundingBox.min)\n\t\t\t\t\tbbox.expandByPoint(n.boundingBox.max)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tthis.objectCenter.set((bbox.min.x + bbox.max.x) * 0.5, (bbox.min.y + bbox.max.y) * 0.5, (bbox.min.z + bbox.max.z) * 0.5)\n\t\t}\n\n\t\tthis.updateTransformLock = function() {\n\n\t\t\tif (!this.plugin) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\t// enable / disable the three transform modes\n\t\t\t_gizmo.translate.isEnabled = this.plugin.canEditPosition()\n\t\t\t_gizmo.rotate.isEnabled = this.plugin.canEditQuaternion()\n\t\t\t_gizmo.scale.isEnabled = this.plugin.canEditScale()\n\t\t}\n\n\t\tthis.attach = function ( object ) {\n\n\t\t\tthis.plugin = object.backReference\n\t\t\tthis.visible = true\n\n\t\t\tthis.updateTransformLock()\n\n\t\t\tthis.update()\n\n\t\t\tthis.calculateObjectCenter()\n\t\t};\n\n\t\tthis.detach = function () {\n\n\t\t\tthis.plugin = undefined\n\t\t\tthis.visible = false;\n\t\t\tthis.axis = null;\n\n\t\t\tthis.objectCenter.set(0, 0, 0)\n\n\t\t};\n\n\t\tthis.setMode = function ( mode ) {\n\n\t\t\t_mode = mode ? mode : _mode;\n\n\t\t\tif ( _mode === \"scale\" ) scope.space = \"local\";\n\n\t\t\tfor ( var type in _gizmo ) _gizmo[ type ].visible = ( type === _mode );\n\n\t\t\tthis.update();\n\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t};\n\n\t\tthis.setTranslationSnap = function ( translationSnap ) {\n\n\t\t\tscope.translationSnap = translationSnap;\n\n\t\t};\n\n\t\tthis.setRotationSnap = function ( rotationSnap ) {\n\n\t\t\tscope.rotationSnap = rotationSnap;\n\n\t\t};\n\n\t\tthis.setSize = function ( size ) {\n\n\t\t\tscope.size = size;\n\t\t\tthis.update();\n\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t};\n\n\t\tthis.setSpace = function ( space ) {\n\n\t\t\tscope.space = space;\n\t\t\tthis.update();\n\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t};\n\n\t\tthis.update = function () {\n\n\t\t\tif ( scope.plugin === undefined || !scope.enabled ) return;\n\n\t\t\tscope.plugin.object3d.updateMatrixWorld();\n\t\t\tworldPosition.setFromMatrixPosition( scope.plugin.object3d.matrixWorld );\n\t\t\tworldRotation.setFromRotationMatrix( tempMatrix.extractRotation( scope.plugin.object3d.matrixWorld ) );\n\n\t\t\tcamera.updateMatrixWorld();\n\t\t\tcamPosition.setFromMatrixPosition( camera.matrixWorld );\n\t\t\tcamRotation.setFromRotationMatrix( tempMatrix.extractRotation( camera.matrixWorld ) );\n\n\t\t\tscale = worldPosition.distanceTo( camPosition ) / 6 * scope.size;\n\n\t\t\tvar centerPosition = (scope.objectCenter || worldPosition).clone()\n\t\t\tcenterPosition.applyMatrix4(scope.plugin.object3d.matrixWorld)\n\n\t\t\tthis.position.copy( centerPosition );\n\t\t\tthis.scale.set( scale, scale, scale );\n\n\t\t\teye.copy( camPosition ).sub( worldPosition ).normalize();\n\n\t\t\tif ( scope.space === \"local\" ) {\n\n\t\t\t\t_gizmo[ _mode ].update( worldRotation, eye );\n\n\t\t\t} else if ( scope.space === \"world\" ) {\n\n\t\t\t\t_gizmo[ _mode ].update( new THREE.Euler(), eye );\n\n\t\t\t}\n\n\t\t\tif (_gizmo[ _mode ].isEnabled) {\n\t\t\t\t_gizmo[ _mode ].highlight( scope.axis );\n\t\t\t}\n\t\t\telse {\n\t\t\t\t_gizmo[ _mode].disable(true)\n\t\t\t}\n\t\t};\n\n\t\tfunction onPointerHover( event ) {\n\n\t\t\tif ( scope.plugin === undefined || !scope.enabled || _dragging === true || ( event.button !== undefined && event.button !== 0 ) ) return;\n\n\t\t\tvar pointer = event.changedTouches ? event.changedTouches[ 0 ] : event;\n\n\t\t\tvar intersect = intersectObjects( pointer, _gizmo[ _mode ].pickers.children );\n\n\t\t\tvar axis = null;\n\n\t\t\tif ( intersect ) {\n\n\t\t\t\taxis = intersect.object.name;\n\n\t\t\t\tevent.preventDefault();\n\n\t\t\t}\n\n\t\t\tif ( scope.axis !== axis ) {\n\n\t\t\t\tscope.axis = axis;\n\t\t\t\tscope.update();\n\t\t\t\tscope.dispatchEvent( changeEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onPointerDown( event ) {\n\n\t\t\tif ( scope.plugin === undefined || !scope.enabled || _dragging === true || ( event.button !== undefined && event.button !== 0 ) ) return;\n\n\t\t\tif ( !_gizmo[ _mode ].isEnabled ) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tvar pointer = event.changedTouches ? event.changedTouches[ 0 ] : event;\n\n\t\t\tif ( pointer.button === 0 || pointer.button === undefined ) {\n\n\t\t\t\tvar intersect = intersectObjects( pointer, _gizmo[ _mode ].pickers.children );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\n\t\t\t\t\tscope.dispatchEvent( mouseDownEvent );\n\n\t\t\t\t\tif(scope.plugin === undefined) {\n\t\t\t\t\t\t// we lost the object in mouseDownEvent\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\n\t\t\t\t\tscope.axis = intersect.object.name;\n\n\t\t\t\t\tscope.update();\n\n\t\t\t\t\teye.copy( camPosition ).sub( worldPosition ).normalize();\n\n\t\t\t\t\t_gizmo[ _mode ].setActivePlane( scope.axis, eye );\n\n\t\t\t\t\tvar planeIntersect = intersectObjects( pointer, [ _gizmo[ _mode ].activePlane ] );\n\n\t\t\t\t\tif ( planeIntersect ) {\n\n\t\t\t\t\t\tif (scope.plugin.state.position)\n\t\t\t\t\t\t\toldPosition.set( scope.plugin.state.position.x, scope.plugin.state.position.y, scope.plugin.state.position.z );\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\toldPosition.set(0, 0, 0)\n\n\t\t\t\t\t\tif (scope.plugin.state.scale)\n\t\t\t\t\t\t\toldScale.set( scope.plugin.state.scale.x, scope.plugin.state.scale.y, scope.plugin.state.scale.z );\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\toldScale.set(1, 1, 1, 1)\n\n\t\t\t\t\t\tif (scope.plugin.state.quaternion)\n\t\t\t\t\t\t\toldQuaternion.set( scope.plugin.state.quaternion._x, scope.plugin.state.quaternion._y, scope.plugin.state.quaternion._z, scope.plugin.state.quaternion._w )\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\toldQuaternion.set(0, 0, 0, 1)\n\n\t\t\t\t\t\toldRotationMatrix.extractRotation( scope.plugin.object3d.matrix );\n\t\t\t\t\t\tworldRotationMatrix.extractRotation( scope.plugin.object3d.matrixWorld );\n\n\t\t\t\t\t\tif (scope.plugin.object3d.parent) {\n\t\t\t\t\t\t\tparentRotationMatrix.extractRotation( scope.plugin.object3d.parent.matrixWorld );\n\t\t\t\t\t\t\tparentScale.setFromMatrixScale( tempMatrix.getInverse( scope.plugin.object3d.parent.matrixWorld ) );\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t// cameras don't have a parent in scene hierarchy\n\t\t\t\t\t\t\tparentRotationMatrix.identity()\n\t\t\t\t\t\t\tparentScale.set(1, 1, 1)\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\toffset.copy( planeIntersect.point );\n\n\t\t\t\t\t\tE2.app.undoManager.begin('Transform')\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_dragging = true;\n\n\t\t}\n\n\t\tfunction onPointerMove( event ) {\n\n\t\t\tif ( scope.plugin === undefined || !scope.enabled || scope.axis === null || _dragging === false || ( event.button !== undefined && event.button !== 0 ) ) return;\n\n\t\t\tif ( !_gizmo[ _mode ].isEnabled ) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tvar pointer = event.changedTouches ? event.changedTouches[ 0 ] : event;\n\n\t\t\tvar planeIntersect = intersectObjects( pointer, [ _gizmo[ _mode ].activePlane ] );\n\n\t\t\tif ( planeIntersect === false ) return;\n\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\n\t\t\tpoint.copy( planeIntersect.point );\n\n\t\t\tif ( _mode === \"translate\" ) {\n\n\t\t\t\tpoint.sub( offset );\n\t\t\t\tpoint.multiply( parentScale );\n\n\t\t\t\tvar newValue = oldPosition.clone()\n\n\t\t\t\tif ( scope.space === \"local\" ) {\n\n\t\t\t\t\tpoint.applyMatrix4( tempMatrix.getInverse( worldRotationMatrix ) );\n\n\t\t\t\t\tif ( scope.axis.search( \"X\" ) === - 1 ) point.x = 0;\n\t\t\t\t\tif ( scope.axis.search( \"Y\" ) === - 1 ) point.y = 0;\n\t\t\t\t\tif ( scope.axis.search( \"Z\" ) === - 1 ) point.z = 0;\n\n\t\t\t\t\tpoint.applyMatrix4( oldRotationMatrix );\n\n\t\t\t\t\tnewValue = oldPosition.clone()\n\t\t\t\t\tnewValue.add(point)\n\n\t\t\t\t}\n\n\t\t\t\tif ( scope.space === \"world\" || scope.axis.search( \"XYZ\" ) !== - 1 ) {\n\n\t\t\t\t\tif ( scope.axis.search( \"X\" ) === - 1 ) point.x = 0;\n\t\t\t\t\tif ( scope.axis.search( \"Y\" ) === - 1 ) point.y = 0;\n\t\t\t\t\tif ( scope.axis.search( \"Z\" ) === - 1 ) point.z = 0;\n\n\t\t\t\t\tpoint.applyMatrix4( tempMatrix.getInverse( parentRotationMatrix ) );\n\n\t\t\t\t\tnewValue = oldPosition.clone()\n\t\t\t\t\tnewValue.add(point)\n\n\t\t\t\t}\n\n\t\t\t\tif ( scope.translationSnap !== null ) {\n\n\t\t\t\t\tif ( scope.space === \"local\" ) {\n\n\t\t\t\t\t\tnewValue.applyMatrix4( tempMatrix.getInverse( worldRotationMatrix ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( scope.axis.search( \"X\" ) !== - 1 ) newValue.x = Math.round( newValue.x / scope.snap ) * scope.snap;\n\t\t\t\t\tif ( scope.axis.search( \"Y\" ) !== - 1 ) newValue.y = Math.round( newValue.y / scope.snap ) * scope.snap;\n\t\t\t\t\tif ( scope.axis.search( \"Z\" ) !== - 1 ) newValue.z = Math.round( newValue.z / scope.snap ) * scope.snap;\n\n\t\t\t\t\tif ( scope.space === \"local\" ) {\n\n\t\t\t\t\t\tnewValue.applyMatrix4( worldRotationMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tscope.plugin.undoableSetState('position', newValue.clone(), oldPosition.clone())\n\n\t\t\t} else if ( _mode === \"scale\" ) {\n\n\t\t\t\tpoint.sub( offset );\n\t\t\t\tpoint.multiply( parentScale );\n\n\t\t\t\tvar scaleMultiplier = 1\n\n\t\t\t\tif ( scope.space === \"local\" ) {\n\n\t\t\t\t\tvar newValue = oldScale.clone()\n\t\t\t\t\tif ( scope.axis === \"XYZ\" ) {\n\n\t\t\t\t\t\tscale = 1 + ( ( point.y ) * scaleMultiplier );\n\n\t\t\t\t\t\tnewValue.multiplyScalar(scale)\n\n\t\t\t\t\t\tscope.plugin.undoableSetState('scale', newValue, oldScale)\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpoint.applyMatrix4( tempMatrix.getInverse( worldRotationMatrix ) );\n\n\t\t\t\t\t\tif ( scope.axis === \"X\" ) newValue.x = oldScale.x * ( 1 + point.x * scaleMultiplier );\n\t\t\t\t\t\tif ( scope.axis === \"Y\" ) newValue.y = oldScale.y * ( 1 + point.y * scaleMultiplier );\n\t\t\t\t\t\tif ( scope.axis === \"Z\" ) newValue.z = oldScale.z * ( 1 + point.z * scaleMultiplier );\n\n\t\t\t\t\t\tscope.plugin.undoableSetState('scale', newValue.clone(), oldScale.clone())\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( _mode === \"rotate\" ) {\n\n\t\t\t\tpoint.sub( worldPosition );\n\t\t\t\tpoint.multiply( parentScale );\n\t\t\t\ttempVector.copy( offset ).sub( worldPosition );\n\t\t\t\ttempVector.multiply( parentScale );\n\n\t\t\t\tif ( scope.axis === \"E\" ) {\n\n\t\t\t\t\tpoint.applyMatrix4( tempMatrix.getInverse( lookAtMatrix ) );\n\t\t\t\t\ttempVector.applyMatrix4( tempMatrix.getInverse( lookAtMatrix ) );\n\n\t\t\t\t\trotation.set( Math.atan2( point.z, point.y ), Math.atan2( point.x, point.z ), Math.atan2( point.y, point.x ) );\n\t\t\t\t\toffsetRotation.set( Math.atan2( tempVector.z, tempVector.y ), Math.atan2( tempVector.x, tempVector.z ), Math.atan2( tempVector.y, tempVector.x ) );\n\n\t\t\t\t\ttempQuaternion.setFromRotationMatrix( tempMatrix.getInverse( parentRotationMatrix ) );\n\n\t\t\t\t\tquaternionE.setFromAxisAngle( eye, rotation.z - offsetRotation.z );\n\t\t\t\t\tquaternionXYZ.setFromRotationMatrix( worldRotationMatrix );\n\n\t\t\t\t\ttempQuaternion.multiplyQuaternions( tempQuaternion, quaternionE );\n\t\t\t\t\ttempQuaternion.multiplyQuaternions( tempQuaternion, quaternionXYZ );\n\n\t\t\t\t\tscope.plugin.undoableSetState('quaternion', tempQuaternion.clone(), oldQuaternion.clone())\n\n\t\t\t\t} else if ( scope.axis === \"XYZE\" ) {\n\n\t\t\t\t\tquaternionE.setFromEuler( point.clone().cross( tempVector ).normalize() ); // rotation axis\n\n\t\t\t\t\ttempQuaternion.setFromRotationMatrix( tempMatrix.getInverse( parentRotationMatrix ) );\n\t\t\t\t\tquaternionX.setFromAxisAngle( quaternionE, - point.clone().angleTo( tempVector ) );\n\t\t\t\t\tquaternionXYZ.setFromRotationMatrix( worldRotationMatrix );\n\n\t\t\t\t\ttempQuaternion.multiplyQuaternions( tempQuaternion, quaternionX );\n\t\t\t\t\ttempQuaternion.multiplyQuaternions( tempQuaternion, quaternionXYZ );\n\n\t\t\t\t\tscope.plugin.undoableSetState('quaternion', tempQuaternion.clone(), oldQuaternion.clone())\n\n\t\t\t\t} else if ( scope.space === \"local\" ) {\n\n\t\t\t\t\tpoint.applyMatrix4( tempMatrix.getInverse( worldRotationMatrix ) );\n\n\t\t\t\t\ttempVector.applyMatrix4( tempMatrix.getInverse( worldRotationMatrix ) );\n\n\t\t\t\t\trotation.set( Math.atan2( point.z, point.y ), Math.atan2( point.x, point.z ), Math.atan2( point.y, point.x ) );\n\t\t\t\t\toffsetRotation.set( Math.atan2( tempVector.z, tempVector.y ), Math.atan2( tempVector.x, tempVector.z ), Math.atan2( tempVector.y, tempVector.x ) );\n\n\t\t\t\t\tquaternionXYZ.copy( oldQuaternion );\n\n\t\t\t\t\tif ( scope.rotationSnap !== null ) {\n\n\t\t\t\t\t\tquaternionX.setFromAxisAngle( unitX, Math.round( ( rotation.x - offsetRotation.x ) / scope.rotationSnap ) * scope.rotationSnap );\n\t\t\t\t\t\tquaternionY.setFromAxisAngle( unitY, Math.round( ( rotation.y - offsetRotation.y ) / scope.rotationSnap ) * scope.rotationSnap );\n\t\t\t\t\t\tquaternionZ.setFromAxisAngle( unitZ, Math.round( ( rotation.z - offsetRotation.z ) / scope.rotationSnap ) * scope.rotationSnap );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tquaternionX.setFromAxisAngle( unitX, rotation.x - offsetRotation.x );\n\t\t\t\t\t\tquaternionY.setFromAxisAngle( unitY, rotation.y - offsetRotation.y );\n\t\t\t\t\t\tquaternionZ.setFromAxisAngle( unitZ, rotation.z - offsetRotation.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( scope.axis === \"X\" ) quaternionXYZ.multiplyQuaternions( quaternionXYZ, quaternionX );\n\t\t\t\t\tif ( scope.axis === \"Y\" ) quaternionXYZ.multiplyQuaternions( quaternionXYZ, quaternionY );\n\t\t\t\t\tif ( scope.axis === \"Z\" ) quaternionXYZ.multiplyQuaternions( quaternionXYZ, quaternionZ );\n\n\t\t\t\t\tscope.plugin.undoableSetState('quaternion', quaternionXYZ.clone(), oldQuaternion.clone())\n\n\t\t\t\t} else if ( scope.space === \"world\" ) {\n\n\t\t\t\t\trotation.set( Math.atan2( point.z, point.y ), Math.atan2( point.x, point.z ), Math.atan2( point.y, point.x ) );\n\t\t\t\t\toffsetRotation.set( Math.atan2( tempVector.z, tempVector.y ), Math.atan2( tempVector.x, tempVector.z ), Math.atan2( tempVector.y, tempVector.x ) );\n\n\t\t\t\t\ttempQuaternion.setFromRotationMatrix( tempMatrix.getInverse( parentRotationMatrix ) );\n\n\t\t\t\t\tif ( scope.rotationSnap !== null ) {\n\n\t\t\t\t\t\tquaternionX.setFromAxisAngle( unitX, Math.round( ( rotation.x - offsetRotation.x ) / scope.rotationSnap ) * scope.rotationSnap );\n\t\t\t\t\t\tquaternionY.setFromAxisAngle( unitY, Math.round( ( rotation.y - offsetRotation.y ) / scope.rotationSnap ) * scope.rotationSnap );\n\t\t\t\t\t\tquaternionZ.setFromAxisAngle( unitZ, Math.round( ( rotation.z - offsetRotation.z ) / scope.rotationSnap ) * scope.rotationSnap );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tquaternionX.setFromAxisAngle( unitX, rotation.x - offsetRotation.x );\n\t\t\t\t\t\tquaternionY.setFromAxisAngle( unitY, rotation.y - offsetRotation.y );\n\t\t\t\t\t\tquaternionZ.setFromAxisAngle( unitZ, rotation.z - offsetRotation.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tquaternionXYZ.setFromRotationMatrix( worldRotationMatrix );\n\n\t\t\t\t\tif ( scope.axis === \"X\" ) tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionX );\n\t\t\t\t\tif ( scope.axis === \"Y\" ) tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionY );\n\t\t\t\t\tif ( scope.axis === \"Z\" ) tempQuaternion.multiplyQuaternions( tempQuaternion, quaternionZ );\n\n\t\t\t\t\ttempQuaternion.multiplyQuaternions( tempQuaternion, quaternionXYZ );\n\n\t\t\t\t\tscope.plugin.undoableSetState('quaternion', tempQuaternion.clone(), oldQuaternion.clone())\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tscope.update();\n\t\t\tscope.dispatchEvent( changeEvent );\n\t\t\tscope.dispatchEvent( objectChangeEvent );\n\n\t\t}\n\n\t\tfunction onPointerUp( event ) {\n\t\t\tif ( !_gizmo[ _mode].isEnabled ) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tE2.app.undoManager.end()\n\n\t\t\tif ( event.button !== undefined && event.button !== 0 ) return;\n\n\t\t\tif ( _dragging && ( scope.axis !== null ) ) {\n\n\t\t\t\tmouseUpEvent.mode = _mode;\n\t\t\t\tscope.dispatchEvent( mouseUpEvent )\n\n\t\t\t}\n\n\t\t\t_dragging = false;\n\t\t\tonPointerHover( event );\n\n\t\t}\n\n\t\tfunction intersectObjects( pointer, objects ) {\n\n\t\t\tvar rect = domElement.getBoundingClientRect();\n\t\t\tvar x = ( pointer.clientX - rect.left ) / rect.width;\n\t\t\tvar y = ( pointer.clientY - rect.top ) / rect.height;\n\n\t\t\tpointerVector.set( ( x * 2 ) - 1, - ( y * 2 ) + 1 );\n\t\t\tray.setFromCamera( pointerVector, camera );\n\n\t\t\tvar intersections = ray.intersectObjects( objects, true );\n\t\t\treturn intersections[ 0 ] ? intersections[ 0 ] : false;\n\n\t\t}\n\n\t};\n\n\tTHREE.TransformControls.prototype = Object.create( THREE.Object3D.prototype );\n\tTHREE.TransformControls.prototype.constructor = THREE.TransformControls;\n\n}() );\n"
  },
  {
    "path": "browser/vendor/three/VRControls.js",
    "content": "/**\n * @author dmarcos / https://github.com/dmarcos\n * @author mrdoob / http://mrdoob.com\n */\n\nTHREE.VRControls = function ( object, onError ) {\n\n\tvar scope = this;\n\n\tvar vrDisplay, vrDisplays;\n\n\tvar standingMatrix = new THREE.Matrix4();\n\n\tvar frameData = null;\n\n\tif ( 'VRFrameData' in window ) {\n\n\t\tframeData = new VRFrameData();\n\n\t}\n\n\tfunction gotVRDisplays( displays ) {\n\n\t\tvrDisplays = displays;\n\n\t\tif ( displays.length > 0 ) {\n\n\t\t\tvrDisplay = displays[ 0 ];\n\n\t\t} else {\n\n\t\t\tif ( onError ) onError( 'VR input not available.' );\n\n\t\t}\n\n\t}\n\n\tif ( navigator.getVRDisplays ) {\n\n\t\tnavigator.getVRDisplays().then( gotVRDisplays ).catch ( function () {\n\n\t\t\tconsole.warn( 'THREE.VRControls: Unable to get VR Displays' );\n\n\t\t} );\n\n\t}\n\n\t// the Rift SDK returns the position in meters\n\t// this scale factor allows the user to define how meters\n\t// are converted to scene units.\n\n\tthis.scale = 1;\n\n\t// If true will use \"standing space\" coordinate system where y=0 is the\n\t// floor and x=0, z=0 is the center of the room.\n\tthis.standing = false;\n\n\t// Distance from the users eyes to the floor in meters. Used when\n\t// standing=true but the VRDisplay doesn't provide stageParameters.\n\tthis.userHeight = 1.6;\n\n\tthis.getVRDisplay = function () {\n\n\t\treturn vrDisplay;\n\n\t};\n\n\tthis.setVRDisplay = function ( value ) {\n\n\t\tvrDisplay = value;\n\n\t};\n\n\tthis.getVRDisplays = function () {\n\n\t\tconsole.warn( 'THREE.VRControls: getVRDisplays() is being deprecated.' );\n\t\treturn vrDisplays;\n\n\t};\n\n\tthis.getStandingMatrix = function () {\n\n\t\treturn standingMatrix;\n\n\t};\n\n\tthis.update = function () {\n\n\t\tif ( vrDisplay ) {\n\n\t\t\tvar pose;\n\n\t\t\tif ( vrDisplay.getFrameData ) {\n\n\t\t\t\tvrDisplay.getFrameData( frameData );\n\t\t\t\tpose = frameData.pose;\n\n\t\t\t} else if ( vrDisplay.getPose ) {\n\n\t\t\t\tpose = vrDisplay.getPose();\n\n\t\t\t}\n\n\t\t\tif ( pose.orientation !== null ) {\n\n\t\t\t\tobject.quaternion.fromArray( pose.orientation );\n\n\t\t\t}\n\n\t\t\tif ( pose.position !== null ) {\n\n\t\t\t\tobject.position.fromArray( pose.position );\n\n\t\t\t} else {\n\n\t\t\t\tobject.position.set( 0, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( this.standing ) {\n\n\t\t\t\tif ( vrDisplay.stageParameters ) {\n\n\t\t\t\t\tobject.updateMatrix();\n\n\t\t\t\t\tstandingMatrix.fromArray( vrDisplay.stageParameters.sittingToStandingTransform );\n\t\t\t\t\tobject.applyMatrix( standingMatrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tobject.position.setY( object.position.y + this.userHeight );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tobject.position.multiplyScalar( scope.scale );\n\n\t\t}\n\n\t};\n\n\tthis.resetPose = function () {\n\n\t\tif ( vrDisplay ) {\n\n\t\t\tvrDisplay.resetPose();\n\n\t\t}\n\n\t};\n\n\tthis.resetSensor = function () {\n\n\t\tconsole.warn( 'THREE.VRControls: .resetSensor() is now .resetPose().' );\n\t\tthis.resetPose();\n\n\t};\n\n\tthis.zeroSensor = function () {\n\n\t\tconsole.warn( 'THREE.VRControls: .zeroSensor() is now .resetPose().' );\n\t\tthis.resetPose();\n\n\t};\n\n\tthis.dispose = function () {\n\n\t\tvrDisplay = null;\n\n\t};\n\n};"
  },
  {
    "path": "browser/vendor/three/VREffect.js",
    "content": "/**\n * @author dmarcos / https://github.com/dmarcos\n * @author mrdoob / http://mrdoob.com\n *\n * WebVR Spec: http://mozvr.github.io/webvr-spec/webvr.html\n *\n * Firefox: http://mozvr.com/downloads/\n * Chromium: https://webvr.info/get-chrome\n */\n\nTHREE.VREffect = function ( renderer, onError ) {\n\n\tvar vrDisplay, vrDisplays;\n\tvar eyeTranslationL = new THREE.Vector3();\n\tvar eyeTranslationR = new THREE.Vector3();\n\tvar renderRectL, renderRectR;\n\tvar headMatrix = new THREE.Matrix4();\n\tvar eyeMatrixL = new THREE.Matrix4();\n\tvar eyeMatrixR = new THREE.Matrix4();\n\n\tvar frameData = null;\n\n\tif ( 'VRFrameData' in window ) {\n\n\t\tframeData = new window.VRFrameData();\n\n\t}\n\n\tfunction gotVRDisplays( displays ) {\n\n\t\tvrDisplays = displays;\n\n\t\tif ( displays.length > 0 ) {\n\n\t\t\tvrDisplay = displays[ 0 ];\n\n\t\t} else {\n\n\t\t\tif ( onError ) onError( 'HMD not available' );\n\n\t\t}\n\n\t}\n\n\tif ( navigator.getVRDisplays ) {\n\n\t\tnavigator.getVRDisplays().then( gotVRDisplays ).catch( function () {\n\n\t\t\tconsole.warn( 'THREE.VREffect: Unable to get VR Displays' );\n\n\t\t} );\n\n\t}\n\n\t//\n\n\tthis.isPresenting = false;\n\n\tvar scope = this;\n\n\tvar rendererSize = renderer.getSize();\n\tvar rendererUpdateStyle = false;\n\tvar rendererPixelRatio = renderer.getPixelRatio();\n\n\tthis.getVRDisplay = function () {\n\n\t\treturn vrDisplay;\n\n\t};\n\n\tthis.setVRDisplay = function ( value ) {\n\n\t\tvrDisplay = value;\n\n\t};\n\n\tthis.getVRDisplays = function () {\n\n\t\tconsole.warn( 'THREE.VREffect: getVRDisplays() is being deprecated.' );\n\t\treturn vrDisplays;\n\n\t};\n\n\tthis.setSize = function ( width, height, updateStyle ) {\n    renderer.setSize( width, height, updateStyle );\n\t};\n\n\t// VR presentation\n\n\tvar canvas = renderer.domElement;\n\tvar defaultLeftBounds = [ 0.0, 0.0, 0.5, 1.0 ];\n\tvar defaultRightBounds = [ 0.5, 0.0, 0.5, 1.0 ];\n\n\tfunction onVRDisplayPresentChange() {\n\n\t\tvar wasPresenting = scope.isPresenting;\n\t\tscope.isPresenting = vrDisplay !== undefined && vrDisplay.isPresenting;\n\n\t\tif ( scope.isPresenting ) {\n\n\t\t\tvar eyeParamsL = vrDisplay.getEyeParameters( 'left' );\n\t\t\tvar eyeWidth = eyeParamsL.renderWidth;\n\t\t\tvar eyeHeight = eyeParamsL.renderHeight;\n\n\t\t\tif ( ! wasPresenting ) {\n\n\t\t\t\trendererPixelRatio = renderer.getPixelRatio();\n\t\t\t\trendererSize = renderer.getSize();\n\n\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\trenderer.setSize( eyeWidth * 2, eyeHeight, false );\n\n\t\t\t}\n\n\t\t} else if ( wasPresenting ) {\n\n\t\t\trenderer.setPixelRatio( rendererPixelRatio );\n\t\t\trenderer.setSize( rendererSize.width, rendererSize.height, rendererUpdateStyle );\n\n\t\t}\n\n\t}\n\n\twindow.addEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange, false );\n\n\tthis.setFullScreen = function ( boolean ) {\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tif ( vrDisplay === undefined ) {\n\n\t\t\t\treject( new Error( 'No VR hardware found.' ) );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( scope.isPresenting === boolean ) {\n\n\t\t\t\tresolve();\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( boolean ) {\n\n\t\t\t\tresolve( vrDisplay.requestPresent( [ { source: canvas } ] ) );\n\n\t\t\t} else {\n\n\t\t\t\tresolve( vrDisplay.exitPresent() );\n\n\t\t\t}\n\n\t\t} );\n\n\t};\n\n\tthis.requestPresent = function () {\n\n\t\treturn this.setFullScreen( true );\n\n\t};\n\n\tthis.exitPresent = function () {\n\n\t\treturn this.setFullScreen( false );\n\n\t};\n\n\tthis.requestAnimationFrame = function ( f ) {\n\n\t\tif ( vrDisplay !== undefined ) {\n\n\t\t\treturn vrDisplay.requestAnimationFrame( f );\n\n\t\t} else {\n\n\t\t\treturn window.requestAnimationFrame( f );\n\n\t\t}\n\n\t};\n\n\tthis.cancelAnimationFrame = function ( h ) {\n\n\t\tif ( vrDisplay !== undefined ) {\n\n\t\t\tvrDisplay.cancelAnimationFrame( h );\n\n\t\t} else {\n\n\t\t\twindow.cancelAnimationFrame( h );\n\n\t\t}\n\n\t};\n\n\tthis.submitFrame = function () {\n\n\t\tif ( vrDisplay !== undefined && scope.isPresenting ) {\n\n\t\t\tvrDisplay.submitFrame();\n\n\t\t}\n\n\t};\n\n\tthis.autoSubmitFrame = true;\n\n\t// render\n\n\tvar cameraL = new THREE.PerspectiveCamera();\n\tcameraL.layers.enable( 1 );\n\n\tvar cameraR = new THREE.PerspectiveCamera();\n\tcameraR.layers.enable( 2 );\n\n\tthis.render = function ( scene, camera, renderTarget, forceClear ) {\n\n\t\tif ( vrDisplay && scope.isPresenting ) {\n\n\t\t\tvar autoUpdate = scene.autoUpdate;\n\n\t\t\tif ( autoUpdate ) {\n\n\t\t\t\tscene.updateMatrixWorld();\n\t\t\t\tscene.autoUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( Array.isArray( scene ) ) {\n\n\t\t\t\tconsole.warn( 'THREE.VREffect.render() no longer supports arrays. Use object.layers instead.' );\n\t\t\t\tscene = scene[ 0 ];\n\n\t\t\t}\n\n\t\t\t// When rendering we don't care what the recommended size is, only what the actual size\n\t\t\t// of the backbuffer is.\n\t\t\tvar size = renderer.getSize();\n\t\t\tvar layers = vrDisplay.getLayers();\n\t\t\tvar leftBounds;\n\t\t\tvar rightBounds;\n\n\t\t\tif ( layers.length ) {\n\n\t\t\t\tvar layer = layers[ 0 ];\n\n\t\t\t\tleftBounds = layer.leftBounds !== null && layer.leftBounds.length === 4 ? layer.leftBounds : defaultLeftBounds;\n\t\t\t\trightBounds = layer.rightBounds !== null && layer.rightBounds.length === 4 ? layer.rightBounds : defaultRightBounds;\n\n\t\t\t} else {\n\n\t\t\t\tleftBounds = defaultLeftBounds;\n\t\t\t\trightBounds = defaultRightBounds;\n\n\t\t\t}\n\n\t\t\trenderRectL = {\n\t\t\t\tx: Math.round( size.width * leftBounds[ 0 ] ),\n\t\t\t\ty: Math.round( size.height * leftBounds[ 1 ] ),\n\t\t\t\twidth: Math.round( size.width * leftBounds[ 2 ] ),\n\t\t\t\theight: Math.round( size.height * leftBounds[ 3 ] )\n\t\t\t};\n\t\t\trenderRectR = {\n\t\t\t\tx: Math.round( size.width * rightBounds[ 0 ] ),\n\t\t\t\ty: Math.round( size.height * rightBounds[ 1 ] ),\n\t\t\t\twidth: Math.round( size.width * rightBounds[ 2 ] ),\n\t\t\t\theight: Math.round( size.height * rightBounds[ 3 ] )\n\t\t\t};\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\trenderer.setRenderTarget( renderTarget );\n\t\t\t\trenderTarget.scissorTest = true;\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setRenderTarget( null );\n\t\t\t\trenderer.setScissorTest( true );\n\n\t\t\t}\n\n\t\t\tif ( renderer.autoClear || forceClear ) renderer.clear();\n\n\t\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\t\tcamera.matrixWorld.decompose( cameraL.position, cameraL.quaternion, cameraL.scale );\n\n\t\t\tcameraR.position.copy( cameraL.position );\n\t\t\tcameraR.quaternion.copy( cameraL.quaternion );\n\t\t\tcameraR.scale.copy( cameraL.scale );\n\n\t\t\tif ( vrDisplay.getFrameData ) {\n\n\t\t\t\tvrDisplay.depthNear = camera.near;\n\t\t\t\tvrDisplay.depthFar = camera.far;\n\n\t\t\t\tvrDisplay.getFrameData( frameData );\n\n\t\t\t\tcameraL.projectionMatrix.elements = frameData.leftProjectionMatrix;\n\t\t\t\tcameraR.projectionMatrix.elements = frameData.rightProjectionMatrix;\n\n\t\t\t\tgetEyeMatrices( frameData );\n\n\t\t\t\tcameraL.updateMatrix();\n\t\t\t\tcameraL.matrix.multiply( eyeMatrixL );\n\t\t\t\tcameraL.matrix.decompose( cameraL.position, cameraL.quaternion, cameraL.scale );\n\n\t\t\t\tcameraR.updateMatrix();\n\t\t\t\tcameraR.matrix.multiply( eyeMatrixR );\n\t\t\t\tcameraR.matrix.decompose( cameraR.position, cameraR.quaternion, cameraR.scale );\n\n\t\t\t} else {\n\n\t\t\t\tvar eyeParamsL = vrDisplay.getEyeParameters( 'left' );\n\t\t\t\tvar eyeParamsR = vrDisplay.getEyeParameters( 'right' );\n\n\t\t\t\tcameraL.projectionMatrix = fovToProjection( eyeParamsL.fieldOfView, true, camera.near, camera.far );\n\t\t\t\tcameraR.projectionMatrix = fovToProjection( eyeParamsR.fieldOfView, true, camera.near, camera.far );\n\n\t\t\t\teyeTranslationL.fromArray( eyeParamsL.offset );\n\t\t\t\teyeTranslationR.fromArray( eyeParamsR.offset );\n\n\t\t\t\tcameraL.translateOnAxis( eyeTranslationL, cameraL.scale.x );\n\t\t\t\tcameraR.translateOnAxis( eyeTranslationR, cameraR.scale.x );\n\n\t\t\t}\n\n\t\t\t// render left eye\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\trenderTarget.viewport.set( renderRectL.x, renderRectL.y, renderRectL.width, renderRectL.height );\n\t\t\t\trenderTarget.scissor.set( renderRectL.x, renderRectL.y, renderRectL.width, renderRectL.height );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setViewport( renderRectL.x, renderRectL.y, renderRectL.width, renderRectL.height );\n\t\t\t\trenderer.setScissor( renderRectL.x, renderRectL.y, renderRectL.width, renderRectL.height );\n\n\t\t\t}\n\t\t\trenderer.render( scene, cameraL, renderTarget, forceClear );\n\n\t\t\t// render right eye\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\trenderTarget.viewport.set( renderRectR.x, renderRectR.y, renderRectR.width, renderRectR.height );\n\t\t\t\trenderTarget.scissor.set( renderRectR.x, renderRectR.y, renderRectR.width, renderRectR.height );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setViewport( renderRectR.x, renderRectR.y, renderRectR.width, renderRectR.height );\n\t\t\t\trenderer.setScissor( renderRectR.x, renderRectR.y, renderRectR.width, renderRectR.height );\n\n\t\t\t}\n\t\t\trenderer.render( scene, cameraR, renderTarget, forceClear );\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\trenderTarget.viewport.set( 0, 0, size.width, size.height );\n\t\t\t\trenderTarget.scissor.set( 0, 0, size.width, size.height );\n\t\t\t\trenderTarget.scissorTest = false;\n\t\t\t\trenderer.setRenderTarget( null );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setViewport( 0, 0, size.width, size.height );\n\t\t\t\trenderer.setScissorTest( false );\n\n\t\t\t}\n\n\t\t\tif ( autoUpdate ) {\n\n\t\t\t\tscene.autoUpdate = true;\n\n\t\t\t}\n\n\t\t\tif ( scope.autoSubmitFrame ) {\n\n\t\t\t\tscope.submitFrame();\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Regular render mode if not HMD\n\n\t\trenderer.render( scene, camera, renderTarget, forceClear );\n\n\t};\n\n\tthis.dispose = function () {\n\n\t\twindow.removeEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange, false );\n\n\t};\n\n\t//\n\n\tvar poseOrientation = new THREE.Quaternion();\n\tvar posePosition = new THREE.Vector3();\n\n\t// Compute model matrices of the eyes with respect to the head.\n\tfunction getEyeMatrices( frameData ) {\n\n\t\t// Compute the matrix for the position of the head based on the pose\n\t\tif ( frameData.pose.orientation ) {\n\n\t\t\tposeOrientation.fromArray( frameData.pose.orientation );\n\t\t\theadMatrix.makeRotationFromQuaternion( poseOrientation );\n\n\t\t}\telse {\n\n\t\t\theadMatrix.identity();\n\n\t\t}\n\n\t\tif ( frameData.pose.position ) {\n\n\t\t\tposePosition.fromArray( frameData.pose.position );\n\t\t\theadMatrix.setPosition( posePosition );\n\n\t\t}\n\n\t\t// The view matrix transforms vertices from sitting space to eye space. As such, the view matrix can be thought of as a product of two matrices:\n\t\t// headToEyeMatrix * sittingToHeadMatrix\n\n\t\t// The headMatrix that we've calculated above is the model matrix of the head in sitting space, which is the inverse of sittingToHeadMatrix.\n\t\t// So when we multiply the view matrix with headMatrix, we're left with headToEyeMatrix:\n\t\t// viewMatrix * headMatrix = headToEyeMatrix * sittingToHeadMatrix * headMatrix = headToEyeMatrix\n\n\t\teyeMatrixL.fromArray( frameData.leftViewMatrix );\n\t\teyeMatrixL.multiply( headMatrix );\n\t\teyeMatrixR.fromArray( frameData.rightViewMatrix );\n\t\teyeMatrixR.multiply( headMatrix );\n\n\t\t// The eye's model matrix in head space is the inverse of headToEyeMatrix we calculated above.\n\n\t\teyeMatrixL.getInverse( eyeMatrixL );\n\t\teyeMatrixR.getInverse( eyeMatrixR );\n\n\t}\n\n\tfunction fovToNDCScaleOffset( fov ) {\n\n\t\tvar pxscale = 2.0 / ( fov.leftTan + fov.rightTan );\n\t\tvar pxoffset = ( fov.leftTan - fov.rightTan ) * pxscale * 0.5;\n\t\tvar pyscale = 2.0 / ( fov.upTan + fov.downTan );\n\t\tvar pyoffset = ( fov.upTan - fov.downTan ) * pyscale * 0.5;\n\t\treturn { scale: [ pxscale, pyscale ], offset: [ pxoffset, pyoffset ] };\n\n\t}\n\n\tfunction fovPortToProjection( fov, rightHanded, zNear, zFar ) {\n\n\t\trightHanded = rightHanded === undefined ? true : rightHanded;\n\t\tzNear = zNear === undefined ? 0.01 : zNear;\n\t\tzFar = zFar === undefined ? 10000.0 : zFar;\n\n\t\tvar handednessScale = rightHanded ? - 1.0 : 1.0;\n\n\t\t// start with an identity matrix\n\t\tvar mobj = new THREE.Matrix4();\n\t\tvar m = mobj.elements;\n\n\t\t// and with scale/offset info for normalized device coords\n\t\tvar scaleAndOffset = fovToNDCScaleOffset( fov );\n\n\t\t// X result, map clip edges to [-w,+w]\n\t\tm[ 0 * 4 + 0 ] = scaleAndOffset.scale[ 0 ];\n\t\tm[ 0 * 4 + 1 ] = 0.0;\n\t\tm[ 0 * 4 + 2 ] = scaleAndOffset.offset[ 0 ] * handednessScale;\n\t\tm[ 0 * 4 + 3 ] = 0.0;\n\n\t\t// Y result, map clip edges to [-w,+w]\n\t\t// Y offset is negated because this proj matrix transforms from world coords with Y=up,\n\t\t// but the NDC scaling has Y=down (thanks D3D?)\n\t\tm[ 1 * 4 + 0 ] = 0.0;\n\t\tm[ 1 * 4 + 1 ] = scaleAndOffset.scale[ 1 ];\n\t\tm[ 1 * 4 + 2 ] = - scaleAndOffset.offset[ 1 ] * handednessScale;\n\t\tm[ 1 * 4 + 3 ] = 0.0;\n\n\t\t// Z result (up to the app)\n\t\tm[ 2 * 4 + 0 ] = 0.0;\n\t\tm[ 2 * 4 + 1 ] = 0.0;\n\t\tm[ 2 * 4 + 2 ] = zFar / ( zNear - zFar ) * - handednessScale;\n\t\tm[ 2 * 4 + 3 ] = ( zFar * zNear ) / ( zNear - zFar );\n\n\t\t// W result (= Z in)\n\t\tm[ 3 * 4 + 0 ] = 0.0;\n\t\tm[ 3 * 4 + 1 ] = 0.0;\n\t\tm[ 3 * 4 + 2 ] = handednessScale;\n\t\tm[ 3 * 4 + 3 ] = 0.0;\n\n\t\tmobj.transpose();\n\t\treturn mobj;\n\n\t}\n\n\tfunction fovToProjection( fov, rightHanded, zNear, zFar ) {\n\n\t\tvar DEG2RAD = Math.PI / 180.0;\n\n\t\tvar fovPort = {\n\t\t\tupTan: Math.tan( fov.upDegrees * DEG2RAD ),\n\t\t\tdownTan: Math.tan( fov.downDegrees * DEG2RAD ),\n\t\t\tleftTan: Math.tan( fov.leftDegrees * DEG2RAD ),\n\t\t\trightTan: Math.tan( fov.rightDegrees * DEG2RAD )\n\t\t};\n\n\t\treturn fovPortToProjection( fovPort, rightHanded, zNear, zFar );\n\n\t}\n\n};"
  },
  {
    "path": "browser/vendor/three/loaders/ColladaLoader2.js",
    "content": "/**\n * @author mrdoob / http://mrdoob.com/\n */\n\nTHREE.ColladaLoader = function ( manager ) {\n\n\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\n\n};\n\nTHREE.ColladaLoader.prototype = {\n\n\tconstructor: THREE.ColladaLoader,\n\n\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\tfunction getBaseUrl( url ) {\n\n\t\t\tvar parts = url.split( '/' );\n\t\t\tparts.pop();\n\t\t\treturn ( parts.length < 1 ? '.' : parts.join( '/' ) ) + '/';\n\n\t\t}\n\n\t\tvar scope = this;\n\n\t\tvar loader = new THREE.XHRLoader( scope.manager );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tonLoad( scope.parse( text, getBaseUrl( url ) ) );\n\n\t\t}, onProgress, onError );\n\n\t},\n\n\toptions: {\n\n\t\tset convertUpAxis ( value ) {\n\n\t\t\tconsole.log( 'ColladaLoder.options.convertUpAxis: TODO' );\n\n\t\t}\n\n\t},\n\n\tsetCrossOrigin: function ( value ) {\n\n\t\tthis.crossOrigin = value;\n\n\t},\n\n\tparse: function ( text, baseUrl ) {\n\n\t\tfunction getElementsByTagName( xml, name ) {\n\n\t\t\t// Non recursive xml.getElementsByTagName() ...\n\n\t\t\tvar array = [];\n\t\t\tvar childNodes = xml.childNodes;\n\n\t\t\tfor ( var i = 0, l = childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = childNodes[ i ];\n\n\t\t\t\tif ( child.nodeName === name ) {\n\n\t\t\t\t\tarray.push( child );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t}\n\n\t\tfunction parseFloats( text ) {\n\n\t\t\tif ( text.length === 0 ) return [];\n\n\t\t\tvar parts = text.trim().split( /\\s+/ );\n\t\t\tvar array = new Array( parts.length );\n\n\t\t\tfor ( var i = 0, l = parts.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ] = parseFloat( parts[ i ] );\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t}\n\n\t\tfunction parseInts( text ) {\n\n\t\t\tif ( text.length === 0 ) return [];\n\n\t\t\tvar parts = text.trim().split( /\\s+/ );\n\t\t\tvar array = new Array( parts.length );\n\n\t\t\tfor ( var i = 0, l = parts.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ] = parseInt( parts[ i ] );\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t}\n\n\t\tfunction parseId( text ) {\n\n\t\t\treturn text.substring( 1 );\n\n\t\t}\n\n\t\t// asset\n\n\t\tfunction parseAsset( xml ) {\n\n\t\t\treturn {\n\t\t\t\tunit: parseAssetUnit( getElementsByTagName( xml, 'unit' )[ 0 ] ),\n\t\t\t\tupAxis: parseAssetUpAxis( getElementsByTagName( xml, 'up_axis' )[ 0 ] )\n\t\t\t};\n\n\t\t}\n\n\t\tfunction parseAssetUnit( xml ) {\n\n\t\t\treturn xml !== undefined ? parseFloat( xml.getAttribute( 'meter' ) ) : 1;\n\n\t\t}\n\n\t\tfunction parseAssetUpAxis( xml ) {\n\n\t\t\treturn xml !== undefined ? xml.textContent : 'Y_UP';\n\n\t\t}\n\n\t\t// library\n\n\t\tfunction parseLibrary( xml, data, libraryName, nodeName, parser ) {\n\n\t\t\tvar library = getElementsByTagName( xml, libraryName )[ 0 ];\n\n\t\t\tif ( library !== undefined ) {\n\n\t\t\t\tvar elements = getElementsByTagName( library, nodeName );\n\n\t\t\t\tfor ( var i = 0; i < elements.length; i ++ ) {\n\n\t\t\t\t\tparser( elements[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction buildLibrary( data, builder ) {\n\n\t\t\tfor ( var name in data ) {\n\n\t\t\t\tvar object = data[ name ];\n\t\t\t\tobject.build = builder( data[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// get\n\n\t\tfunction getBuild( data, builder ) {\n\n\t\t\tif ( data.build !== undefined ) return data.build;\n\n\t\t\tdata.build = builder( data );\n\n\t\t\treturn data.build;\n\n\t\t}\n\n\t\t// image\n\n\t\tvar imageLoader = new THREE.ImageLoader();\n\n\t\tfunction parseImage( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tinit_from: getElementsByTagName( xml, 'init_from' )[ 0 ].textContent\n\t\t\t};\n\n\t\t\tlibrary.images[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction buildImage( data ) {\n\n\t\t\tif ( data.build !== undefined ) return data.build;\n\n\t\t\tvar url = data.init_from;\n\n\t\t\tif ( baseUrl !== undefined ) url = baseUrl + url;\n\n\t\t\treturn imageLoader.load( url );\n\n\t\t}\n\n\t\tfunction getImage( id ) {\n\n\t\t\treturn getBuild( library.images[ id ], buildImage );\n\n\t\t}\n\n\t\t// effect\n\n\t\tfunction parseEffect( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'profile_COMMON':\n\t\t\t\t\t\tdata.profile = parseEffectProfileCOMMON( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.effects[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction parseEffectProfileCOMMON( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tsurfaces: {},\n\t\t\t\tsamplers: {}\n\t\t\t};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'newparam':\n\t\t\t\t\t\tparseEffectNewparam( child, data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'technique':\n\t\t\t\t\t\tdata.technique = parseEffectTechnique( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectNewparam( xml, data ) {\n\n\t\t\tvar sid = xml.getAttribute( 'sid' );\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'surface':\n\t\t\t\t\t\tdata.surfaces[ sid ] = parseEffectSurface( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'sampler2D':\n\t\t\t\t\t\tdata.samplers[ sid ] = parseEffectSampler( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseEffectSurface( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'init_from':\n\t\t\t\t\t\tdata.init_from = child.textContent;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectSampler( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'source':\n\t\t\t\t\t\tdata.source = child.textContent;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectTechnique( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'constant':\n\t\t\t\t\tcase 'lambert':\n\t\t\t\t\tcase 'blinn':\n\t\t\t\t\tcase 'phong':\n\t\t\t\t\t\tdata.type = child.nodeName;\n\t\t\t\t\t\tdata.parameters = parseEffectParameters( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectParameters( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'emission':\n\t\t\t\t\tcase 'diffuse':\n\t\t\t\t\tcase 'specular':\n\t\t\t\t\tcase 'shininess':\n\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\tdata[ child.nodeName ] = parseEffectParameter( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectParameter( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'color':\n\t\t\t\t\t\tdata[ child.nodeName ] = parseFloats( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'float':\n\t\t\t\t\t\tdata[ child.nodeName ] = parseFloat( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'texture':\n\t\t\t\t\t\tdata[ child.nodeName ] = { id: child.getAttribute( 'texture' ), extra: parseEffectParameterTexture( child ) };\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectParameterTexture( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'extra':\n\t\t\t\t\t\tdata = parseEffectParameterTextureExtra( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectParameterTextureExtra( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'technique':\n\t\t\t\t\t\tdata[ child.nodeName ] = parseEffectParameterTextureExtraTechnique( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectParameterTextureExtraTechnique( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'repeatU':\n\t\t\t\t\tcase 'repeatV':\n\t\t\t\t\tcase 'offsetU':\n\t\t\t\t\tcase 'offsetV':\n\t\t\t\t\t\tdata[ child.nodeName ] = parseFloat( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'wrapU':\n\t\t\t\t\tcase 'wrapV':\n\t\t\t\t\t\tdata[ child.nodeName ] = parseInt( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction buildEffect( data ) {\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction getEffect( id ) {\n\n\t\t\treturn getBuild( library.effects[ id ], buildEffect );\n\n\t\t}\n\n\t\t// material\n\n\t\tfunction parseMaterial( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tname: xml.getAttribute( 'name' )\n\t\t\t};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'instance_effect':\n\t\t\t\t\t\tdata.url = parseId( child.getAttribute( 'url' ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.materials[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction buildMaterial( data ) {\n\n\t\t\tvar effect = getEffect( data.url );\n\t\t\tvar technique = effect.profile.technique;\n\n\t\t\tvar material;\n\n\t\t\tswitch ( technique.type ) {\n\n\t\t\t\tcase 'phong':\n\t\t\t\tcase 'blinn':\n\t\t\t\t\tmaterial = new THREE.MeshPhongMaterial();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'lambert':\n\t\t\t\t\tmaterial = new THREE.MeshLambertMaterial();\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tmaterial = new THREE.MeshBasicMaterial();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tmaterial.name = data.name;\n\n\t\t\tfunction getTexture( textureObject ) {\n\n\t\t\t\tvar sampler = effect.profile.samplers[ textureObject.id ];\n\n\t\t\t\tif ( sampler !== undefined ) {\n\n\t\t\t\t\tvar surface = effect.profile.surfaces[ sampler.source ];\n\n\t\t\t\t\tvar texture = new THREE.Texture( getImage( surface.init_from ) );\n\n\t\t\t\t\tvar extra = textureObject.extra;\n\n\t\t\t\t\tif ( extra !== undefined && extra.technique !== undefined ) {\n\n\t\t\t\t\t\tvar technique = extra.technique;\n\n\t\t\t\t\t\ttexture.wrapS = technique.wrapU ? THREE.RepeatWrapping : THREE.ClampToEdgeWrapping;\n\t\t\t\t\t\ttexture.wrapT = technique.wrapV ? THREE.RepeatWrapping : THREE.ClampToEdgeWrapping;\n\n\t\t\t\t\t\ttexture.offset.set( technique.offsetU, technique.offsetV );\n\t\t\t\t\t\ttexture.repeat.set( technique.repeatU, technique.repeatV );\n\n\t\t\t\t\t} else {\n\t\t\t\t\n\t\t\t\t\t\ttexture.wrapS = THREE.RepeatWrapping;\n\t\t\t\t\t\ttexture.wrapT = THREE.RepeatWrapping;\n\t\t\t\t\t\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\treturn texture;\n\n\t\t\t\t}\n\n\t\t\t\tconsole.error( 'ColladaLoder: Undefined sampler', textureObject.id );\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar parameters = technique.parameters;\n\n\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\tvar parameter = parameters[ key ];\n\n\t\t\t\tswitch ( key ) {\n\t\t\t\t\tcase 'diffuse':\n\t\t\t\t\t\tif ( parameter.color ) material.color.fromArray( parameter.color );\n\t\t\t\t\t\tif ( parameter.texture ) material.map = getTexture( parameter.texture );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'specular':\n\t\t\t\t\t\tif ( parameter.color && material.specular )\n\t\t\t\t\t\t\tmaterial.specular.fromArray( parameter.color );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'shininess':\n\t\t\t\t\t\tif ( parameter.float && material.shininess )\n\t\t\t\t\t\t\tmaterial.shininess = parameter.float;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'emission':\n\t\t\t\t\t\tif ( parameter.color && material.emissive )\n\t\t\t\t\t\t\tmaterial.emissive.fromArray( parameter.color );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\tif ( parameter.float )\n\t\t\t\t\t\t\tmaterial.opacity = parameter.float;\n\t\t\t\t\t\tif ( parameter.float !== 1 )\n\t\t\t\t\t\t\tmaterial.transparent = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn material;\n\n\t\t}\n\n\t\tfunction getMaterial( id ) {\n\n\t\t\treturn getBuild( library.materials[ id ], buildMaterial );\n\n\t\t}\n\n\t\t// camera\n\n\t\tfunction parseCamera( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tname: xml.getAttribute( 'name' )\n\t\t\t};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'optics':\n\t\t\t\t\t\tdata.optics = parseCameraOptics( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.cameras[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction parseCameraOptics( xml ) {\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'technique_common':\n\t\t\t\t\t\treturn parseCameraTechnique( child );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {};\n\n\t\t}\n\n\t\tfunction parseCameraTechnique( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'perspective':\n\t\t\t\t\tcase 'orthographic':\n\n\t\t\t\t\t\tdata.technique = child.nodeName;\n\t\t\t\t\t\tdata.parameters = parseCameraParameters( child );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseCameraParameters( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'xfov':\n\t\t\t\t\tcase 'yfov':\n\t\t\t\t\tcase 'xmag':\n\t\t\t\t\tcase 'ymag':\n\t\t\t\t\tcase 'znear':\n\t\t\t\t\tcase 'zfar':\n\t\t\t\t\tcase 'aspect_ratio':\n\t\t\t\t\t\tdata[ child.nodeName ] = parseFloat( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction buildCamera( data ) {\n\n\t\t\tvar camera;\n\n\t\t\tswitch ( data.optics.technique ) {\n\n\t\t\t\tcase 'perspective':\n\t\t\t\t\tcamera = new THREE.PerspectiveCamera(\n\t\t\t\t\t\tdata.optics.parameters.yfov,\n\t\t\t\t\t\tdata.optics.parameters.aspect_ratio,\n\t\t\t\t\t\tdata.optics.parameters.znear,\n\t\t\t\t\t\tdata.optics.parameters.zfar\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'orthographic':\n\t\t\t\t\tcamera = new THREE.OrthographicCamera( /* TODO */ );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tcamera = new THREE.PerspectiveCamera();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tcamera.name = data.name;\n\n\t\t\treturn camera;\n\n\t\t}\n\n\t\tfunction getCamera( id ) {\n\n\t\t\treturn getBuild( library.cameras[ id ], buildCamera );\n\n\t\t}\n\n\t\t// light\n\n\t\tfunction parseLight( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'technique_common':\n\t\t\t\t\t\tdata = parseLightTechnique( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.lights[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction parseLightTechnique( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'directional':\n\t\t\t\t\tcase 'point':\n\t\t\t\t\tcase 'spot':\n\t\t\t\t\tcase 'ambient':\n\n\t\t\t\t\t\tdata.technique = child.nodeName;\n\t\t\t\t\t\tdata.parameters = parseLightParameters( child );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseLightParameters( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'color':\n\t\t\t\t\t\tvar array = parseFloats( child.textContent );\n\t\t\t\t\t\tdata.color = new THREE.Color().fromArray( array );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'falloff_angle':\n\t\t\t\t\t\tdata.falloffAngle = parseFloat( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'quadratic_attenuation':\n\t\t\t\t\t\tvar f = parseFloat( child.textContent );\n\t\t\t\t\t\tdata.distance = f ? Math.sqrt( 1 / f ) : 0;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction buildLight( data ) {\n\n\t\t\tvar light;\n\n\t\t\tswitch ( data.technique ) {\n\n\t\t\t\tcase 'directional':\n\t\t\t\t\tlight = new THREE.DirectionalLight();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'point':\n\t\t\t\t\tlight = new THREE.PointLight();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'spot':\n\t\t\t\t\tlight = new THREE.SpotLight();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ambient':\n\t\t\t\t\tlight = new THREE.AmbientLight();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( data.parameters.color ) light.color.copy( data.parameters.color );\n\t\t\tif ( data.parameters.distance ) light.distance = data.parameters.distance;\n\n\t\t\treturn light;\n\n\t\t}\n\n\t\tfunction getLight( id ) {\n\n\t\t\treturn getBuild( library.lights[ id ], buildLight );\n\n\t\t}\n\n\t\t// geometry\n\n\t\tfunction parseGeometry( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tname: xml.getAttribute( 'name' ),\n\t\t\t\tsources: {},\n\t\t\t\tvertices: {},\n\t\t\t\tprimitives: []\n\t\t\t};\n\n\t\t\tvar mesh = getElementsByTagName( xml, 'mesh' )[ 0 ];\n\n\t\t\tfor ( var i = 0; i < mesh.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = mesh.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tvar id = child.getAttribute( 'id' );\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'source':\n\t\t\t\t\t\tdata.sources[ id ] = parseGeometrySource( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'vertices':\n\t\t\t\t\t\t// data.sources[ id ] = data.sources[ parseId( getElementsByTagName( child, 'input' )[ 0 ].getAttribute( 'source' ) ) ];\n\t\t\t\t\t\tdata.vertices = parseGeometryVertices( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'polygons':\n\t\t\t\t\t\tconsole.log( 'ColladaLoader: Unsupported primitive type: ', child.nodeName );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'lines':\n\t\t\t\t\tcase 'linestrips':\n\t\t\t\t\tcase 'polylist':\n\t\t\t\t\tcase 'triangles':\n\t\t\t\t\t\tdata.primitives.push( parseGeometryPrimitive( child ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.log( child );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.geometries[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction parseGeometrySource( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tarray: [],\n\t\t\t\tstride: 3\n\t\t\t};\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'float_array':\n\t\t\t\t\t\tdata.array = parseFloats( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'technique_common':\n\t\t\t\t\t\tvar accessor = getElementsByTagName( child, 'accessor' )[ 0 ];\n\n\t\t\t\t\t\tif ( accessor !== undefined ) {\n\n\t\t\t\t\t\t\tdata.stride = parseInt( accessor.getAttribute( 'stride' ) );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.log( child );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseGeometryVertices( xml ) {\n\n\t\t\tvar data = {};\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tdata[ child.getAttribute( 'semantic' ) ] = parseId( child.getAttribute( 'source' ) );\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseGeometryPrimitive( xml ) {\n\n\t\t\tvar primitive = {\n\t\t\t\ttype: xml.nodeName,\n\t\t\t\tmaterial: xml.getAttribute( 'material' ),\n\t\t\t\tinputs: {},\n\t\t\t\tstride: 0\n\t\t\t};\n\n\t\t\tfor ( var i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'input':\n\t\t\t\t\t\tvar id = parseId( child.getAttribute( 'source' ) );\n\t\t\t\t\t\tvar semantic = child.getAttribute( 'semantic' );\n\t\t\t\t\t\tvar offset = parseInt( child.getAttribute( 'offset' ) );\n\t\t\t\t\t\tprimitive.inputs[ semantic ] = { id: id, offset: offset };\n\t\t\t\t\t\tprimitive.stride = Math.max( primitive.stride, offset + 1 );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'vcount':\n\t\t\t\t\t\tprimitive.vcount = parseInts( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'p':\n\t\t\t\t\t\tprimitive.p = parseInts( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn primitive;\n\n\t\t}\n\n\t\tvar DEFAULT_LINEMATERIAL = new THREE.LineBasicMaterial();\n\t\tvar DEFAULT_MESHMATERIAL = new THREE.MeshPhongMaterial();\n\n\t\tfunction buildGeometry( data ) {\n\n\t\t\tvar group = {};\n\n\t\t\tvar sources = data.sources;\n\t\t\tvar vertices = data.vertices;\n\t\t\tvar primitives = data.primitives;\n\n\t\t\tif ( primitives.length === 0 ) return group;\n\n\t\t\tfor ( var p = 0; p < primitives.length; p ++ ) {\n\n\t\t\t\tvar primitive = primitives[ p ];\n\t\t\t\tvar inputs = primitive.inputs;\n\n\t\t\t\tvar geometry = new THREE.BufferGeometry();\n\n\t\t\t\tif ( data.name ) geometry.name = data.name;\n\n\t\t\t\tfor ( var name in inputs ) {\n\n\t\t\t\t\tvar input = inputs[ name ];\n\n\t\t\t\t\tswitch ( name )\t{\n\n\t\t\t\t\t\tcase 'VERTEX':\n\t\t\t\t\t\t\tfor ( var key in vertices ) {\n\n\t\t\t\t\t\t\t\tgeometry.addAttribute( key.toLowerCase(), buildGeometryAttribute( primitive, sources[ vertices[ key ] ], input.offset ) );\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'NORMAL':\n\t\t\t\t\t\t\tgeometry.addAttribute( 'normal', buildGeometryAttribute( primitive, sources[ input.id ], input.offset ) );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'COLOR':\n\t\t\t\t\t\t\tgeometry.addAttribute( 'color', buildGeometryAttribute( primitive, sources[ input.id ], input.offset ) );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TEXCOORD':\n\t\t\t\t\t\t\tgeometry.addAttribute( 'uv', buildGeometryAttribute( primitive, sources[ input.id ], input.offset ) );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar object;\n\n\t\t\t\tswitch ( primitive.type ) {\n\n\t\t\t\t\tcase 'lines':\n\t\t\t\t\t\tobject = new THREE.LineSegments( geometry, DEFAULT_LINEMATERIAL );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'linestrips':\n\t\t\t\t\t\tobject = new THREE.Line( geometry, DEFAULT_LINEMATERIAL );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'triangles':\n\t\t\t\t\tcase 'polylist':\n\t\t\t\t\t\tobject = new THREE.Mesh( geometry, DEFAULT_MESHMATERIAL );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tgroup[ primitive.material ] = object;\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t}\n\n\t\tfunction buildGeometryAttribute( primitive, source, offset ) {\n\n\t\t\tvar indices = primitive.p;\n\t\t\tvar stride = primitive.stride;\n\t\t\tvar vcount = primitive.vcount;\n\n\t\t\tfunction pushVector( i ) {\n\n\t\t\t\tvar index = indices[ i + offset ] * sourceStride;\n\t\t\t\tvar length = index + sourceStride;\n\n\t\t\t\tfor ( ; index < length; index ++ ) {\n\n\t\t\t\t\tarray.push( sourceArray[ index ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar maxcount = 0;\n\n\t\t\tvar sourceArray = source.array;\n\t\t\tvar sourceStride = source.stride;\n\n\t\t\tvar array = [];\n\n\t\t\tif ( primitive.vcount !== undefined ) {\n\n\t\t\t\tvar index = 0;\n\n\t\t\t\tfor ( var i = 0, l = vcount.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar count = vcount[ i ];\n\n\t\t\t\t\tif ( count === 4 ) {\n\n\t\t\t\t\t\tvar a = index + stride * 0;\n\t\t\t\t\t\tvar b = index + stride * 1;\n\t\t\t\t\t\tvar c = index + stride * 2;\n\t\t\t\t\t\tvar d = index + stride * 3;\n\n\t\t\t\t\t\tpushVector( a ); pushVector( b ); pushVector( d );\n\t\t\t\t\t\tpushVector( b ); pushVector( c ); pushVector( d );\n\n\t\t\t\t\t} else if ( count === 3 ) {\n\n\t\t\t\t\t\tvar a = index + stride * 0;\n\t\t\t\t\t\tvar b = index + stride * 1;\n\t\t\t\t\t\tvar c = index + stride * 2;\n\n\t\t\t\t\t\tpushVector( a ); pushVector( b ); pushVector( c );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmaxcount = Math.max( maxcount, count );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tindex += stride * count;\n\n\t\t\t\t}\n\n\t\t\t\tif ( maxcount > 0 ) {\n\n\t\t\t\t\tconsole.log( 'ColladaLoader: Geometry has faces with more than 4 vertices.' );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i += stride ) {\n\n\t\t\t\t\tpushVector( i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new THREE.Float32Attribute( array, sourceStride );\n\n\t\t}\n\n\t\tfunction getGeometry( id ) {\n\n\t\t\treturn getBuild( library.geometries[ id ], buildGeometry );\n\n\t\t}\n\n\t\t// nodes\n\n\t\tvar matrix = new THREE.Matrix4();\n\t\tvar vector = new THREE.Vector3();\n\n\t\tfunction parseNode( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tname: xml.getAttribute( 'name' ),\n\t\t\t\tmatrix: new THREE.Matrix4(),\n\t\t\t\tnodes: [],\n\t\t\t\tinstanceCameras: [],\n\t\t\t\tinstanceLights: [],\n\t\t\t\tinstanceGeometries: [],\n\t\t\t\tinstanceNodes: []\n\t\t\t};\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'node':\n\t\t\t\t\t\tparseNode( child );\n\t\t\t\t\t\tdata.nodes.push( child.getAttribute( 'id' ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'instance_camera':\n\t\t\t\t\t\tdata.instanceCameras.push( parseId( child.getAttribute( 'url' ) ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'instance_light':\n\t\t\t\t\t\tdata.instanceLights.push( parseId( child.getAttribute( 'url' ) ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'instance_geometry':\n\t\t\t\t\t\tdata.instanceGeometries.push( parseNodeInstanceGeometry( child ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'instance_node':\n\t\t\t\t\t\tdata.instanceNodes.push( parseId( child.getAttribute( 'url' ) ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'matrix':\n\t\t\t\t\t\tvar array = parseFloats( child.textContent );\n\t\t\t\t\t\tdata.matrix.multiply( matrix.fromArray( array ).transpose() ); // .transpose() when Z_UP?\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'translate':\n\t\t\t\t\t\tvar array = parseFloats( child.textContent );\n\t\t\t\t\t\tvector.fromArray( array );\n\t\t\t\t\t\tdata.matrix.multiply( matrix.makeTranslation( vector.x, vector.y, vector.z ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'rotate':\n\t\t\t\t\t\tvar array = parseFloats( child.textContent );\n\t\t\t\t\t\tvar angle = THREE.Math.degToRad( array[ 3 ] );\n\t\t\t\t\t\tdata.matrix.multiply( matrix.makeRotationAxis( vector.fromArray( array ), angle ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'scale':\n\t\t\t\t\t\tvar array = parseFloats( child.textContent );\n\t\t\t\t\t\tdata.matrix.scale( vector.fromArray( array ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'extra':\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.log( child );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( xml.getAttribute( 'id' ) !== null ) {\n\n\t\t\t\tlibrary.nodes[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseNodeInstanceGeometry( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tid: parseId( xml.getAttribute( 'url' ) ),\n\t\t\t\tmaterials: {}\n\t\t\t};\n\n\t\t\tfor ( var i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tvar child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeName === 'bind_material' ) {\n\n\t\t\t\t\tvar instances = child.getElementsByTagName( 'instance_material' );\n\n\t\t\t\t\tfor ( var j = 0; j < instances.length; j ++ ) {\n\n\t\t\t\t\t\tvar instance = instances[ j ];\n\t\t\t\t\t\tvar symbol = instance.getAttribute( 'symbol' );\n\t\t\t\t\t\tvar target = instance.getAttribute( 'target' );\n\n\t\t\t\t\t\tdata.materials[ symbol ] = parseId( target );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction buildNode( data ) {\n\n\t\t\tvar objects = [];\n\n\t\t\tvar matrix = data.matrix;\n\t\t\tvar nodes = data.nodes;\n\t\t\tvar instanceCameras = data.instanceCameras;\n\t\t\tvar instanceLights = data.instanceLights;\n\t\t\tvar instanceGeometries = data.instanceGeometries;\n\t\t\tvar instanceNodes = data.instanceNodes;\n\n\t\t\tfor ( var i = 0, l = nodes.length; i < l; i ++ ) {\n\n\t\t\t\tif ( nodes[ i ] ) {\n\n\t\t\t\t\tobjects.push( getNode( nodes[ i ] ).clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = instanceCameras.length; i < l; i ++ ) {\n\n\t\t\t\tobjects.push( getCamera( instanceCameras[ i ] ).clone() );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = instanceLights.length; i < l; i ++ ) {\n\n\t\t\t\tobjects.push( getLight( instanceLights[ i ] ).clone() );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = instanceGeometries.length; i < l; i ++ ) {\n\n\t\t\t\tvar instance = instanceGeometries[ i ];\n\t\t\t\tvar geometries = getGeometry( instance.id );\n\n\t\t\t\tfor ( var key in geometries ) {\n\n\t\t\t\t\tvar object = geometries[ key ].clone();\n\n\t\t\t\t\tif ( instance.materials[ key ] !== undefined ) {\n\n\t\t\t\t\t\tobject.material = getMaterial( instance.materials[ key ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobjects.push( object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = instanceNodes.length; i < l; i ++ ) {\n\n\t\t\t\tobjects.push( getNode( instanceNodes[ i ] ).clone() );\n\n\t\t\t}\n\n\t\t\tvar object;\n\n\t\t\tif ( nodes.length === 0 && objects.length === 1 ) {\n\n\t\t\t\tobject = objects[ 0 ];\n\n\t\t\t} else {\n\n\t\t\t\tobject = new THREE.Group();\n\n\t\t\t\tfor ( var i = 0; i < objects.length; i ++ ) {\n\n\t\t\t\t\tobject.add( objects[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tobject.name = data.name;\n\t\t\tmatrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t\treturn object;\n\n\t\t}\n\n\t\tfunction getNode( id ) {\n\n\t\t\treturn getBuild( library.nodes[ id ], buildNode );\n\n\t\t}\n\n\t\t// visual scenes\n\n\t\tfunction parseVisualScene( xml ) {\n\n\t\t\tvar data = {\n\t\t\t\tname: xml.getAttribute( 'name' ),\n\t\t\t\tchildren: []\n\t\t\t};\n\n\t\t\tvar elements = getElementsByTagName( xml, 'node' );\n\n\t\t\tfor ( var i = 0; i < elements.length; i ++ ) {\n\n\t\t\t\tdata.children.push( parseNode( elements[ i ] ) );\n\n\t\t\t}\n\n\t\t\tlibrary.visualScenes[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction buildVisualScene( data ) {\n\n\t\t\tvar group = new THREE.Group();\n\t\t\tgroup.name = data.name;\n\n\t\t\tvar children = data.children;\n\n\t\t\tfor ( var i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tgroup.add( buildNode( children[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t}\n\n\t\tfunction getVisualScene( id ) {\n\n\t\t\treturn getBuild( library.visualScenes[ id ], buildVisualScene );\n\n\t\t}\n\n\t\t// scenes\n\n\t\tfunction parseScene( xml ) {\n\n\t\t\tvar instance = getElementsByTagName( xml, 'instance_visual_scene' )[ 0 ];\n\t\t\treturn getVisualScene( parseId( instance.getAttribute( 'url' ) ) );\n\n\t\t}\n\n\t\tconsole.time( 'ColladaLoader' );\n\n\t\tif ( text.length === 0 ) {\n\n\t\t\treturn { scene: new THREE.Scene() };\n\n\t\t}\n\n\t\tconsole.time( 'ColladaLoader: DOMParser' );\n\n\t\tvar xml = new DOMParser().parseFromString( text, 'application/xml' );\n\n\t\tconsole.timeEnd( 'ColladaLoader: DOMParser' );\n\n\t\tvar collada = getElementsByTagName( xml, 'COLLADA' )[ 0 ];\n\n\t\t// metadata\n\n\t\tvar version = collada.getAttribute( 'version' );\n\t\tconsole.log( 'ColladaLoader: File version', version );\n\n\t\tvar asset = parseAsset( getElementsByTagName( collada, 'asset' )[ 0 ] );\n\n\t\t//\n\n\t\tvar library = {\n\t\t\timages: {},\n\t\t\teffects: {},\n\t\t\tmaterials: {},\n\t\t\tcameras: {},\n\t\t\tlights: {},\n\t\t\tgeometries: {},\n\t\t\tnodes: {},\n\t\t\tvisualScenes: {}\n\t\t};\n\n\t\tconsole.time( 'ColladaLoader: Parse' );\n\n\t\tparseLibrary( collada, library.images, 'library_images', 'image', parseImage );\n\t\tparseLibrary( collada, library.effects, 'library_effects', 'effect', parseEffect );\n\t\tparseLibrary( collada, library.materials, 'library_materials', 'material', parseMaterial );\n\t\tparseLibrary( collada, library.cameras, 'library_cameras', 'camera', parseCamera );\n\t\tparseLibrary( collada, library.lights, 'library_lights', 'light', parseLight );\n\t\tparseLibrary( collada, library.geometries, 'library_geometries', 'geometry', parseGeometry );\n\t\tparseLibrary( collada, library.nodes, 'library_nodes', 'node', parseNode );\n\t\tparseLibrary( collada, library.visualScenes, 'library_visual_scenes', 'visual_scene', parseVisualScene );\n\n\t\tconsole.timeEnd( 'ColladaLoader: Parse' );\n\n\t\tconsole.time( 'ColladaLoader: Build' );\n\n\t\tbuildLibrary( library.images, buildImage );\n\t\tbuildLibrary( library.effects, buildEffect );\n\t\tbuildLibrary( library.materials, buildMaterial );\n\t\tbuildLibrary( library.cameras, buildCamera );\n\t\tbuildLibrary( library.lights, buildLight );\n\t\tbuildLibrary( library.geometries, buildGeometry );\n\t\tbuildLibrary( library.nodes, buildNode );\n\t\tbuildLibrary( library.visualScenes, buildVisualScene );\n\n\t\tconsole.timeEnd( 'ColladaLoader: Build' );\n\n\t\t// console.log( library );\n\n\t\tvar scene = parseScene( getElementsByTagName( collada, 'scene' )[ 0 ] );\n\n\t\tif ( asset.upAxis === 'Z_UP' ) {\n\n\t\t\tscene.rotation.x = - Math.PI / 2;\n\n\t\t}\n\n\t\tscene.scale.multiplyScalar( asset.unit );\n\n\t\tconsole.timeEnd( 'ColladaLoader' );\n\n\t\t// console.log( scene );\n\n\t\treturn {\n\t\t\tanimations: [],\n\t\t\tkinematics: { joints: [] },\n\t\t\tscene: scene\n\t\t};\n\n\t}\n\n};\n"
  },
  {
    "path": "browser/vendor/three/loaders/FBXLoader.js",
    "content": "/**\n * @author yamahigashi https://github.com/yamahigashi\n *\n * This loader loads FBX file in *ASCII and version 7 format*.\n *\n * Support\n *  - mesh\n *  - skinning\n *  - normal / uv\n *\n *  Not Support\n *  - material\n *  - texture\n *  - morph\n */\n\n( function() {\n\n\tTHREE.FBXLoader = function ( showStatus, manager ) {\n\n\t\tTHREE.Loader.call( this, showStatus );\n\t\tthis.manager = ( manager !== undefined ) ? manager : THREE.DefaultLoadingManager;\n\t\tthis.textureLoader = null;\n\t\tthis.textureBasePath = null;\n\n\t};\n\n\tTHREE.FBXLoader.prototype = Object.create( THREE.Loader.prototype );\n\n\tTHREE.FBXLoader.prototype.constructor = THREE.FBXLoader;\n\n\tTHREE.FBXLoader.prototype.load = function ( url, onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar loader = new THREE.XHRLoader( scope.manager );\n\t\t// loader.setCrossOrigin( this.crossOrigin );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tif ( ! scope.isFbxFormatASCII( text ) ) {\n\n\t\t\t\tconsole.warn( 'FBXLoader: !!! FBX Binary format not supported !!!' );\n\n\t\t\t} else if ( ! scope.isFbxVersionSupported( text ) ) {\n\n\t\t\t\tconsole.warn( 'FBXLoader: !!! FBX Version below 7 not supported !!!' );\n\n\t\t\t} else {\n\n\t\t\t\tscope.textureBasePath = scope.extractUrlBase( url );\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t};\n\n\tTHREE.FBXLoader.prototype.setCrossOrigin = function ( value ) {\n\n\t\tthis.crossOrigin = value;\n\n\t};\n\n\tTHREE.FBXLoader.prototype.isFbxFormatASCII = function ( body ) {\n\n\t\tCORRECT = [ 'K', 'a', 'y', 'd', 'a', 'r', 'a', '\\\\', 'F', 'B', 'X', '\\\\', 'B', 'i', 'n', 'a', 'r', 'y', '\\\\', '\\\\' ];\n\n\t\tvar cursor = 0;\n\t\tvar read = function ( offset ) {\n\n\t\t\tvar result = body[ offset - 1 ];\n\t\t\tbody = body.slice( cursor + offset );\n\t\t\tcursor ++;\n\t\t\treturn result;\n\n\t\t};\n\n\t\tfor ( var i = 0; i < CORRECT.length; ++ i ) {\n\n\t\t\tnum = read( 1 );\n\t\t\tif ( num == CORRECT[ i ] ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t};\n\n\tTHREE.FBXLoader.prototype.isFbxVersionSupported = function ( body ) {\n\n\t\tvar versionExp = /FBXVersion: (\\d+)/;\n\t\tmatch = body.match( versionExp );\n\t\tif ( match ) {\n\n\t\t\tvar version = parseInt( match[ 1 ] );\n\t\t\tconsole.log( 'FBXLoader: FBX version ' + version );\n\t\t\treturn version >= 7000;\n\n\t\t}\n\t\treturn false;\n\n\t};\n\n\tTHREE.FBXLoader.prototype.parse = function ( text ) {\n\n\t\tvar scope = this;\n\n\t\tconsole.time( 'FBXLoader' );\n\n\t\tconsole.time( 'FBXLoader: TextParser' );\n\t\tvar nodes = new FBXParser().parse( text );\n\t\tconsole.timeEnd( 'FBXLoader: TextParser' );\n\n\t\tconsole.time( 'FBXLoader: ObjectParser' );\n\t\tscope.hierarchy = ( new Bones() ).parseHierarchy( nodes );\n\t\tscope.weights\t= ( new Weights() ).parse( nodes, scope.hierarchy );\n\t\tscope.animations = ( new Animation() ).parse( nodes, scope.hierarchy );\n\t\tscope.textures = ( new Textures() ).parse( nodes, scope.hierarchy );\n\t\tconsole.timeEnd( 'FBXLoader: ObjectParser' );\n\n\t\tconsole.time( 'FBXLoader: GeometryParser' );\n\t\tgeometries = this.parseGeometries( nodes );\n\t\tconsole.timeEnd( 'FBXLoader: GeometryParser' );\n\n\t\tvar container = new THREE.Group();\n\n\t\tfor ( var i = 0; i < geometries.length; ++ i ) {\n\n\t\t\tif ( geometries[ i ] === undefined ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tcontainer.add( geometries[ i ] );\n\n\t\t\t//wireframe = new THREE.WireframeHelper( geometries[i], 0x00ff00 );\n\t\t\t//container.add( wireframe );\n\n\t\t\t//vnh = new THREE.VertexNormalsHelper( geometries[i], 0.6 );\n\t\t\t//container.add( vnh );\n\n\t\t\t//skh = new THREE.SkeletonHelper( geometries[i] );\n\t\t\t//container.add( skh );\n\n\t\t\t// container.add( new THREE.BoxHelper( geometries[i] ) );\n\n\t\t}\n\n\t\tconsole.timeEnd( 'FBXLoader' );\n\t\treturn container;\n\n\t};\n\n\tTHREE.FBXLoader.prototype.parseGeometries = function ( node ) {\n\n\t\t// has not geo, return []\n\t\tif ( ! ( 'Geometry' in node.Objects.subNodes ) ) {\n\n\t\t\treturn [];\n\n\t\t}\n\n\t\t// has many\n\t\tvar geoCount = 0;\n\t\tfor ( var geo in node.Objects.subNodes.Geometry ) {\n\n\t\t\tif ( geo.match( /^\\d+$/ ) ) {\n\n\t\t\t\tgeoCount ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar res = [];\n\t\tif ( geoCount > 0 ) {\n\n\t\t\tfor ( geo in node.Objects.subNodes.Geometry ) {\n\n\t\t\t\tif ( node.Objects.subNodes.Geometry[ geo ].attrType === 'Mesh' ) {\n\n\t\t\t\t\tres.push( this.parseGeometry( node.Objects.subNodes.Geometry[ geo ], node ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tres.push( this.parseGeometry( node.Objects.subNodes.Geometry, node ) );\n\n\t\t}\n\n\t\treturn res;\n\n\t};\n\n\tTHREE.FBXLoader.prototype.parseGeometry = function ( node, nodes ) {\n\n\t\tgeo = ( new Geometry() ).parse( node );\n\t\tgeo.addBones( this.hierarchy.hierarchy );\n\n\t\t//*\n\t\tvar geometry = new THREE.BufferGeometry();\n\t\tgeometry.name = geo.name;\n\t\tgeometry.addAttribute( 'position', new THREE.BufferAttribute( new Float32Array( geo.vertices ), 3 ) );\n\n\t\tif ( geo.normals !== undefined && geo.normals.length > 0 ) {\n\n\t\t\tgeometry.addAttribute( 'normal', new THREE.BufferAttribute( new Float32Array( geo.normals ), 3 ) );\n\n\t\t}\n\n\t\tif ( geo.uvs !== undefined && geo.uvs.length > 0 ) {\n\n\t\t\tgeometry.addAttribute( 'uv', new THREE.BufferAttribute( new Float32Array( geo.uvs ), 2 ) );\n\n\t\t}\n\n\t\tif ( geo.indices !== undefined && geo.indices.length > 65535 ) {\n\n\t\t\tgeometry.setIndex( new THREE.BufferAttribute( new Uint32Array( geo.indices ), 1 ) );\n\n\t\t} else if ( geo.indices !== undefined ) {\n\n\t\t\tgeometry.setIndex( new THREE.BufferAttribute( new Uint16Array( geo.indices ), 1 ) );\n\n\t\t}\n\n\t\tgeometry.verticesNeedUpdate = true;\n\t\tgeometry.computeBoundingSphere();\n\t\tgeometry.computeBoundingBox();\n\n\t\t// TODO: texture & material support\n\t\tvar texture;\n\t\tvar texs = this.textures.getById( nodes.searchConnectionParent( geo.id ) );\n\t\tif ( texs !== undefined && texs.length > 0 ) {\n\n\t\t\tif ( this.textureLoader === null ) {\n\n\t\t\t\tthis.textureLoader = new THREE.TextureLoader();\n\n\t\t\t}\n\t\t\ttexture = this.textureLoader.load( this.textureBasePath + texs[ 0 ].fileName );\n\n\t\t}\n\n\t\tvar material;\n\t\tif ( texture !== undefined ) {\n\n\t\t\tmaterial = new THREE.MeshBasicMaterial( { map: texture } );\n\n\t\t} else {\n\n\t\t\tmaterial = new THREE.MeshBasicMaterial( { color: 0x3300ff } );\n\n\t\t}\n\n\t\tgeometry = new THREE.Geometry().fromBufferGeometry( geometry );\n\t\tgeometry.bones = geo.bones;\n\t\tgeometry.skinIndices = this.weights.skinIndices;\n\t\tgeometry.skinWeights = this.weights.skinWeights;\n\n\t\tvar mesh = null;\n\t\tif ( geo.bones === undefined || geo.skins === undefined || this.animations === undefined || this.animations.length === 0 ) {\n\n\t\t\tmesh = new THREE.Mesh( geometry, material );\n\n\t\t} else {\n\n\t\t\tmaterial.skinning = true;\n\t\t\tmesh = new THREE.SkinnedMesh( geometry, material );\n\t\t\tthis.addAnimation( mesh, this.weights.matrices, this.animations );\n\n\t\t}\n\n\t\treturn mesh;\n\n\t};\n\n\tTHREE.FBXLoader.prototype.addAnimation = function ( mesh, matrices, animations ) {\n\n\t\tvar animationdata = { \"name\": 'animationtest', \"fps\": 30, \"length\": animations.length, \"hierarchy\": [] };\n\n\t\tfor ( var i = 0; i < mesh.geometry.bones.length; ++ i ) {\n\n\t\t\tvar name = mesh.geometry.bones[ i ].name;\n\t\t\tname = name.replace( /.*:/, '' );\n\t\t\tanimationdata.hierarchy.push( { parent: mesh.geometry.bones[ i ].parent, name: name, keys: [] } );\n\n\t\t}\n\n\t\tvar hasCurve = function ( animNode, attr ) {\n\n\t\t\tif ( animNode === undefined ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\tvar attrNode;\n\t\t\tswitch ( attr ) {\n\n\t\t\t\tcase 'S':\n\t\t\t\t\tif ( animNode.S === undefined ) {\n\n\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t}\n\t\t\t\t\tattrNode = animNode.S;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'R':\n\t\t\t\t\tif ( animNode.R === undefined ) {\n\n\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t}\n\t\t\t\t\tattrNode = animNode.R;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'T':\n\t\t\t\t\tif ( animNode.T === undefined ) {\n\n\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t}\n\t\t\t\t\tattrNode = animNode.T;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif ( attrNode.curves.x === undefined ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\tif ( attrNode.curves.y === undefined ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\tif ( attrNode.curves.z === undefined ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t};\n\n\t\tvar hasKeyOnFrame = function ( attrNode, frame ) {\n\n\t\t\tvar x = isKeyExistOnFrame( attrNode.curves.x, frame );\n\t\t\tvar y = isKeyExistOnFrame( attrNode.curves.y, frame );\n\t\t\tvar z = isKeyExistOnFrame( attrNode.curves.z, frame );\n\n\t\t\treturn x && y && z;\n\n\t\t};\n\n\t\tvar isKeyExistOnFrame = function ( curve, frame ) {\n\n\t\t\tvar value = curve.values[ frame ];\n\t\t\treturn value !== undefined;\n\n\t\t};\n\n\n\t\tvar genKey = function ( animNode, bone ) {\n\n\t\t\t// key initialize with its bone's bind pose at first\n\t\t\tvar key = {};\n\t\t\tkey.time = frame / animations.fps; // TODO:\n\t\t\tkey.pos = bone.pos;\n\t\t\tkey.rot = bone.rotq;\n\t\t\tkey.scl = bone.scl;\n\n\t\t\tif ( animNode === undefined ) {\n\n\t\t\t\treturn key;\n\n\t\t\t}\n\n\t\t\ttry {\n\n\t\t\t\tif ( hasCurve( animNode, 'T' ) && hasKeyOnFrame( animNode.T, frame ) ) {\n\n\t\t\t\t\tvar pos = new THREE.Vector3(\n\t\t\t\t\t\tanimNode.T.curves.x.values[ frame ],\n\t\t\t\t\t\tanimNode.T.curves.y.values[ frame ],\n\t\t\t\t\t\tanimNode.T.curves.z.values[ frame ] );\n\t\t\t\t\tkey.pos = [ pos.x, pos.y, pos.z ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdelete key.pos;\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasCurve( animNode, 'R' ) && hasKeyOnFrame( animNode.R, frame ) ) {\n\n\t\t\t\t\tvar rx = degToRad( animNode.R.curves.x.values[ frame ] );\n\t\t\t\t\tvar ry = degToRad( animNode.R.curves.y.values[ frame ] );\n\t\t\t\t\tvar rz = degToRad( animNode.R.curves.z.values[ frame ] );\n\t\t\t\t\tvar eul = new THREE.Vector3( rx, ry, rz );\n\t\t\t\t\tvar rot = quatFromVec( eul.x, eul.y, eul.z );\n\t\t\t\t\tkey.rot = [ rot.x, rot.y, rot.z, rot.w ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdelete key.rot;\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasCurve( animNode, 'S' ) && hasKeyOnFrame( animNode.S, frame ) ) {\n\n\t\t\t\t\tvar scl = new THREE.Vector3(\n\t\t\t\t\t\tanimNode.S.curves.x.values[ frame ],\n\t\t\t\t\t\tanimNode.S.curves.y.values[ frame ],\n\t\t\t\t\t\tanimNode.S.curves.z.values[ frame ] );\n\t\t\t\t\tkey.scl = [ scl.x, scl.y, scl.z ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdelete key.scl;\n\n\t\t\t\t}\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// curve is not full plotted\n\t\t\t\tconsole.log( bone );\n\t\t\t\tconsole.log( e );\n\n\t\t\t}\n\n\t\t\treturn key;\n\n\t\t};\n\n\t\tvar bones = mesh.geometry.bones;\n\t\tfor ( frame = 0; frame < animations.frames; frame ++ ) {\n\n\n\t\t\tfor ( i = 0; i < bones.length; i ++ ) {\n\n\t\t\t\tvar bone = bones[ i ];\n\t\t\t\tvar animNode = animations.curves[ i ];\n\n\t\t\t\tfor ( var j = 0; j < animationdata.hierarchy.length; j ++ ) {\n\n\t\t\t\t\tif ( animationdata.hierarchy[ j ].name === bone.name ) {\n\n\t\t\t\t\t\tanimationdata.hierarchy[ j ].keys.push( genKey( animNode, bone ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( mesh.geometry.animations === undefined ) {\n\n\t\t\tmesh.geometry.animations = [];\n\n\t\t}\n\n\t\tmesh.geometry.animations.push( THREE.AnimationClip.parseAnimation( animationdata, mesh.geometry.bones ) );\n\n\t};\n\n\tTHREE.FBXLoader.prototype.parseMaterials = function ( node ) {\n\n\t\t// has not mat, return []\n\t\tif ( ! ( 'Material' in node.subNodes ) ) {\n\n\t\t\treturn [];\n\n\t\t}\n\n\t\t// has many\n\t\tvar matCount = 0;\n\t\tfor ( var mat in node.subNodes.Materials ) {\n\n\t\t\tif ( mat.match( /^\\d+$/ ) ) {\n\n\t\t\t\tmatCount ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar res = [];\n\t\tif ( matCount > 0 ) {\n\n\t\t\tfor ( mat in node.subNodes.Material ) {\n\n\t\t\t\tres.push( parseMaterial( node.subNodes.Material[ mat ] ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tres.push( parseMaterial( node.subNodes.Material ) );\n\n\t\t}\n\n\t\treturn res;\n\n\t};\n\n\t// TODO\n\tTHREE.FBXLoader.prototype.parseMaterial = function ( node ) {\n\n\t};\n\n\n\tTHREE.FBXLoader.prototype.loadFile = function ( url, onLoad, onProgress, onError, responseType ) {\n\n\t\tvar loader = new THREE.XHRLoader( this.manager );\n\n\t\tloader.setResponseType( responseType );\n\n\t\tvar request = loader.load( url, function ( result ) {\n\n\t\t\tonLoad( result );\n\n\t\t}, onProgress, onError );\n\n\t\treturn request;\n\n\t};\n\n\tTHREE.FBXLoader.prototype.loadFileAsBuffer = function ( url, onload, onProgress, onError ) {\n\n\t\tthis.loadFile( url, onLoad, onProgress, onError, 'arraybuffer' );\n\n\t};\n\n\tTHREE.FBXLoader.prototype.loadFileAsText = function ( url, onLoad, onProgress, onError ) {\n\n\t\tthis.loadFile( url, onLoad, onProgress, onError, 'text' );\n\n\t};\n\n\n\t/* ----------------------------------------------------------------- */\n\n\tfunction FBXNodes() {}\n\n\tFBXNodes.prototype.add = function ( key, val ) {\n\n\t\tthis[ key ] = val;\n\n\t};\n\n\tFBXNodes.prototype.searchConnectionParent = function ( id ) {\n\n\t\tif ( this.__cache_search_connection_parent === undefined ) {\n\n\t\t\tthis.__cache_search_connection_parent = [];\n\n\t\t}\n\n\t\tif ( this.__cache_search_connection_parent[ id ] !== undefined ) {\n\n\t\t\treturn this.__cache_search_connection_parent[ id ];\n\n\t\t} else {\n\n\t\t\tthis.__cache_search_connection_parent[ id ] = [];\n\n\t\t}\n\n\t\tvar conns = this.Connections.properties.connections;\n\n\t\tvar results = [];\n\t\tfor ( var i = 0; i < conns.length; ++ i ) {\n\n\t\t\tif ( conns[ i ][ 0 ] == id ) {\n\n\t\t\t\t// 0 means scene root\n\t\t\t\tvar res = conns[ i ][ 1 ] === 0 ? - 1 : conns[ i ][ 1 ];\n\t\t\t\tresults.push( res );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( results.length > 0 ) {\n\n\t\t\tthis.__cache_search_connection_parent[ id ] = this.__cache_search_connection_parent[ id ].concat( results );\n\t\t\treturn results;\n\n\t\t} else {\n\n\t\t\tthis.__cache_search_connection_parent[ id ] = [ - 1 ];\n\t\t\treturn [ - 1 ];\n\n\t\t}\n\n\t};\n\n\tFBXNodes.prototype.searchConnectionChildren = function ( id ) {\n\n\t\tif ( this.__cache_search_connection_children === undefined ) {\n\n\t\t\tthis.__cache_search_connection_children = [];\n\n\t\t}\n\n\t\tif ( this.__cache_search_connection_children[ id ] !== undefined ) {\n\n\t\t\treturn this.__cache_search_connection_children[ id ];\n\n\t\t} else {\n\n\t\t\tthis.__cache_search_connection_children[ id ] = [];\n\n\t\t}\n\n\t\tvar conns = this.Connections.properties.connections;\n\n\t\tvar res = [];\n\t\tfor ( var i = 0; i < conns.length; ++ i ) {\n\n\t\t\tif ( conns[ i ][ 1 ] == id ) {\n\n\t\t\t\t// 0 means scene root\n\t\t\t\tres.push( conns[ i ][ 0 ] === 0 ? - 1 : conns[ i ][ 0 ] );\n\t\t\t\t// there may more than one kid, then search to the end\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( res.length > 0 ) {\n\n\t\t\tthis.__cache_search_connection_children[ id ] = this.__cache_search_connection_children[ id ].concat( res );\n\t\t\treturn res;\n\n\t\t} else {\n\n\t\t\tthis.__cache_search_connection_children[ id ] = [ - 1 ];\n\t\t\treturn [ - 1 ];\n\n\t\t}\n\n\t};\n\n\tFBXNodes.prototype.searchConnectionType = function ( id, to ) {\n\n\t\tvar key = id + ',' + to; // TODO: to hash\n\t\tif ( this.__cache_search_connection_type === undefined ) {\n\n\t\t\tthis.__cache_search_connection_type = '';\n\n\t\t}\n\n\t\tif ( this.__cache_search_connection_type[ key ] !== undefined ) {\n\n\t\t\treturn this.__cache_search_connection_type[ key ];\n\n\t\t} else {\n\n\t\t\tthis.__cache_search_connection_type[ key ] = '';\n\n\t\t}\n\n\t\tvar conns = this.Connections.properties.connections;\n\n\t\tfor ( var i = 0; i < conns.length; ++ i ) {\n\n\t\t\tif ( conns[ i ][ 0 ] == id && conns[ i ][ 1 ] == to ) {\n\n\t\t\t\t// 0 means scene root\n\t\t\t\tthis.__cache_search_connection_type[ key ] = conns[ i ][ 2 ];\n\t\t\t\treturn conns[ i ][ 2 ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.__cache_search_connection_type[ id ] = null;\n\t\treturn null;\n\n\t};\n\n\tfunction FBXParser() {}\n\n\tFBXParser.prototype = {\n\n\t\t// constructor: FBXParser,\n\n\t\t// ------------ node stack manipulations ----------------------------------\n\n\t\tgetPrevNode: function () {\n\n\t\t\treturn this.nodeStack[ this.currentIndent - 2 ];\n\n\t\t},\n\n\t\tgetCurrentNode: function () {\n\n\t\t\treturn this.nodeStack[ this.currentIndent - 1 ];\n\n\t\t},\n\n\t\tgetCurrentProp: function () {\n\n\t\t\treturn this.currentProp;\n\n\t\t},\n\n\t\tpushStack: function ( node ) {\n\n\t\t\tthis.nodeStack.push( node );\n\t\t\tthis.currentIndent += 1;\n\n\t\t},\n\n\t\tpopStack: function () {\n\n\t\t\tthis.nodeStack.pop();\n\t\t\tthis.currentIndent -= 1;\n\n\t\t},\n\n\t\tsetCurrentProp: function ( val, name ) {\n\n\t\t\tthis.currentProp = val;\n\t\t\tthis.currentPropName = name;\n\n\t\t},\n\n\t\t// ----------parse ---------------------------------------------------\n\t\tparse: function ( text ) {\n\n\t\t\tthis.currentIndent = 0;\n\t\t\tthis.allNodes = new FBXNodes();\n\t\t\tthis.nodeStack = [];\n\t\t\tthis.currentProp = [];\n\t\t\tthis.currentPropName = '';\n\n\t\t\tvar split = text.split( \"\\n\" );\n\t\t\tfor ( var line in split ) {\n\n\t\t\t\tvar l = split[ line ];\n\n\t\t\t\t// short cut\n\t\t\t\tif ( l.match( /^[\\s\\t]*;/ ) ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t} // skip comment line\n\t\t\t\tif ( l.match( /^[\\s\\t]*$/ ) ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t} // skip empty line\n\n\t\t\t\t// beginning of node\n\t\t\t\tvar beginningOfNodeExp = new RegExp( \"^\\\\t{\" + this.currentIndent + \"}(\\\\w+):(.*){\", '' );\n\t\t\t\tmatch = l.match( beginningOfNodeExp );\n\t\t\t\tif ( match ) {\n\n\t\t\t\t\tvar nodeName = match[ 1 ].trim().replace( /^\"/, '' ).replace( /\"$/, \"\" );\n\t\t\t\t\tvar nodeAttrs = match[ 2 ].split( ',' ).map( function ( element ) {\n\n\t\t\t\t\t\treturn element.trim().replace( /^\"/, '' ).replace( /\"$/, '' );\n\n\t\t\t\t\t} );\n\n\t\t\t\t\tthis.parseNodeBegin( l, nodeName, nodeAttrs || null );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// node's property\n\t\t\t\tvar propExp = new RegExp( \"^\\\\t{\" + ( this.currentIndent ) + \"}(\\\\w+):[\\\\s\\\\t\\\\r\\\\n](.*)\" );\n\t\t\t\tmatch = l.match( propExp );\n\t\t\t\tif ( match ) {\n\n\t\t\t\t\tvar propName = match[ 1 ].replace( /^\"/, '' ).replace( /\"$/, \"\" ).trim();\n\t\t\t\t\tvar propValue = match[ 2 ].replace( /^\"/, '' ).replace( /\"$/, \"\" ).trim();\n\n\t\t\t\t\tthis.parseNodeProperty( l, propName, propValue );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// end of node\n\t\t\t\tvar endOfNodeExp = new RegExp( \"^\\\\t{\" + ( this.currentIndent - 1 ) + \"}}\" );\n\t\t\t\tif ( l.match( endOfNodeExp ) ) {\n\n\t\t\t\t\tthis.nodeEnd();\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// for special case,\n\t\t\t\t//\n\t\t\t\t//\t  Vertices: *8670 {\n\t\t\t\t//\t\t  a: 0.0356229953467846,13.9599733352661,-0.399196773.....(snip)\n\t\t\t\t// -0.0612030513584614,13.960485458374,-0.409748703241348,-0.10.....\n\t\t\t\t// 0.12490539252758,13.7450733184814,-0.454119384288788,0.09272.....\n\t\t\t\t// 0.0836158767342567,13.5432004928589,-0.435397416353226,0.028.....\n\t\t\t\t//\n\t\t\t\t// these case the lines must contiue with previous line\n\t\t\t\tif ( l.match( /^[^\\s\\t}]/ ) ) {\n\n\t\t\t\t\tthis.parseNodePropertyContinued( l );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this.allNodes;\n\n\t\t},\n\n\t\tparseNodeBegin: function ( line, nodeName, nodeAttrs ) {\n\n\t\t\t// var nodeName = match[1];\n\t\t\tvar node = { 'name': nodeName, properties: {}, 'subNodes': {} };\n\t\t\tvar attrs = this.parseNodeAttr( nodeAttrs );\n\t\t\tvar currentNode = this.getCurrentNode();\n\n\t\t\t// a top node\n\t\t\tif ( this.currentIndent === 0 ) {\n\n\t\t\t\tthis.allNodes.add( nodeName, node );\n\n\t\t\t} else {\n\n\t\t\t\t// a subnode\n\n\t\t\t\t// already exists subnode, then append it\n\t\t\t\tif ( nodeName in currentNode.subNodes ) {\n\n\t\t\t\t\tvar tmp = currentNode.subNodes[ nodeName ];\n\n\t\t\t\t\t// console.log( \"duped entry found\\nkey: \" + nodeName + \"\\nvalue: \" + propValue );\n\t\t\t\t\tif ( this.isFlattenNode( currentNode.subNodes[ nodeName ] ) ) {\n\n\n\t\t\t\t\t\tif ( attrs.id === '' ) {\n\n\t\t\t\t\t\t\tcurrentNode.subNodes[ nodeName ] = [];\n\t\t\t\t\t\t\tcurrentNode.subNodes[ nodeName ].push( tmp );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tcurrentNode.subNodes[ nodeName ] = {};\n\t\t\t\t\t\t\tcurrentNode.subNodes[ nodeName ][ tmp.id ] = tmp;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attrs.id === '' ) {\n\n\t\t\t\t\t\tcurrentNode.subNodes[ nodeName ].push( node );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tcurrentNode.subNodes[ nodeName ][ attrs.id ] = node;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcurrentNode.subNodes[ nodeName ] = node;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// for this\t\t  ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓\n\t\t\t// NodeAttribute: 1001463072, \"NodeAttribute::\", \"LimbNode\" {\n\t\t\tif ( nodeAttrs ) {\n\n\t\t\t\tnode.id = attrs.id;\n\t\t\t\tnode.attrName = attrs.name;\n\t\t\t\tnode.attrType = attrs.type;\n\n\t\t\t}\n\n\t\t\tthis.pushStack( node );\n\n\t\t},\n\n\t\tparseNodeAttr: function ( attrs ) {\n\n\t\t\tvar id = attrs[ 0 ];\n\n\t\t\tif ( attrs[ 0 ] !== \"\" ) {\n\n\t\t\t\tid = parseInt( attrs[ 0 ] );\n\n\t\t\t\tif ( isNaN( id ) ) {\n\n\t\t\t\t\t// PolygonVertexIndex: *16380 {\n\t\t\t\t\tid = attrs[ 0 ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar name;\n\t\t\tvar type;\n\t\t\tif ( attrs.length > 1 ) {\n\n\t\t\t\tname = attrs[ 1 ].replace( /^(\\w+)::/, '' );\n\t\t\t\ttype = attrs[ 2 ];\n\n\t\t\t}\n\n\t\t\treturn { id: id, name: name || '', type: type || '' };\n\n\t\t},\n\n\t\tparseNodeProperty: function ( line, propName, propValue ) {\n\n\t\t\tvar currentNode = this.getCurrentNode();\n\t\t\tvar parentName = currentNode.name;\n\n\t\t\t// special case parent node's is like \"Properties70\"\n\t\t\t// these chilren nodes must treat with careful\n\t\t\tif ( parentName !== undefined ) {\n\n\t\t\t\tvar propMatch = parentName.match( /Properties(\\d)+/ );\n\t\t\t\tif ( propMatch ) {\n\n\t\t\t\t\tthis.parseNodeSpecialProperty( line, propName, propValue );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// special case Connections\n\t\t\tif ( propName == 'C' ) {\n\n\t\t\t\tvar connProps = propValue.split( ',' ).slice( 1 );\n\t\t\t\tvar from = parseInt( connProps[ 0 ] );\n\t\t\t\tvar to = parseInt( connProps[ 1 ] );\n\n\t\t\t\tvar rest = propValue.split( ',' ).slice( 3 );\n\n\t\t\t\tpropName = 'connections';\n\t\t\t\tpropValue = [ from, to ];\n\t\t\t\tpropValue = propValue.concat( rest );\n\n\t\t\t\tif ( currentNode.properties[ propName ] === undefined ) {\n\n\t\t\t\t\tcurrentNode.properties[ propName ] = [];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// special case Connections\n\t\t\tif ( propName == 'Node' ) {\n\n\t\t\t\tvar id = parseInt( propValue );\n\t\t\t\tcurrentNode.properties.id = id;\n\t\t\t\tcurrentNode.id = id;\n\n\t\t\t}\n\n\t\t\t// already exists in properties, then append this\n\t\t\tif ( propName in currentNode.properties ) {\n\n\t\t\t\t// console.log( \"duped entry found\\nkey: \" + propName + \"\\nvalue: \" + propValue );\n\t\t\t\tif ( Array.isArray( currentNode.properties[ propName ] ) ) {\n\n\t\t\t\t\tcurrentNode.properties[ propName ].push( propValue );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcurrentNode.properties[ propName ] += propValue;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// console.log( propName + \":  \" + propValue );\n\t\t\t\tif ( Array.isArray( currentNode.properties[ propName ] ) ) {\n\n\t\t\t\t\tcurrentNode.properties[ propName ].push( propValue );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcurrentNode.properties[ propName ] = propValue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.setCurrentProp( currentNode.properties, propName );\n\n\t\t},\n\n\t\t// TODO:\n\t\tparseNodePropertyContinued: function ( line ) {\n\n\t\t\tthis.currentProp[ this.currentPropName ] += line;\n\n\t\t},\n\n\t\tparseNodeSpecialProperty: function ( line, propName, propValue ) {\n\n\t\t\t// split this\n\t\t\t// P: \"Lcl Scaling\", \"Lcl Scaling\", \"\", \"A\",1,1,1\n\t\t\t// into array like below\n\t\t\t// [\"Lcl Scaling\", \"Lcl Scaling\", \"\", \"A\", \"1,1,1\" ]\n\t\t\tvar props = propValue.split( '\",' ).map( function ( element ) {\n\n\t\t\t\treturn element.trim().replace( /^\\\"/, '' ).replace( /\\s/, '_' );\n\n\t\t\t} );\n\n\t\t\tvar innerPropName = props[ 0 ];\n\t\t\tvar innerPropType1 = props[ 1 ];\n\t\t\tvar innerPropType2 = props[ 2 ];\n\t\t\tvar innerPropFlag = props[ 3 ];\n\t\t\tvar innerPropValue = props[ 4 ];\n\n\t\t\t/*\n\t\t\tif ( innerPropValue === undefined ) {\n\t\t\t\tinnerPropValue = props[3];\n\t\t\t}\n\t\t\t*/\n\n\t\t\t// cast value in its type\n\t\t\tswitch ( innerPropType1 ) {\n\n\t\t\t\tcase \"int\":\n\t\t\t\t\tinnerPropValue = parseInt( innerPropValue );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"double\":\n\t\t\t\t\tinnerPropValue = parseFloat( innerPropValue );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"ColorRGB\":\n\t\t\t\tcase \"Vector3D\":\n\t\t\t\t\tvar tmp = innerPropValue.split( ',' );\n\t\t\t\t\tinnerPropValue = new THREE.Vector3( tmp[ 0 ], tmp[ 1 ], tmp[ 2 ] );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\t// CAUTION: these props must append to parent's parent\n\t\t\tthis.getPrevNode().properties[ innerPropName ] = {\n\n\t\t\t\t'type': innerPropType1,\n\t\t\t\t'type2': innerPropType2,\n\t\t\t\t'flag': innerPropFlag,\n\t\t\t\t'value': innerPropValue\n\n\t\t\t};\n\n\t\t\tthis.setCurrentProp( this.getPrevNode().properties, innerPropName );\n\n\t\t},\n\n\t\tnodeEnd: function ( line ) {\n\n\t\t\tthis.popStack();\n\n\t\t},\n\n\t\t/* ---------------------------------------------------------------- */\n\t\t/*\t\tutil\t\t\t\t\t\t\t\t\t\t\t\t\t  */\n\t\tisFlattenNode: function ( node ) {\n\n\t\t\treturn ( 'subNodes' in node && 'properties' in node ) ? true : false;\n\n\t\t}\n\n\t};\n\n\tfunction FBXAnalyzer() {}\n\n\tFBXAnalyzer.prototype = {\n\n\t};\n\n\n\t// generate skinIndices, skinWeights\n\t//\t  @skinIndices: per vertex data, this represents the bone indexes affects that vertex\n\t//\t  @skinWeights: per vertex data, this represents the Weight Values affects that vertex\n\t//\t  @matrices:\tper `bones` data\n\tfunction Weights() {\n\n\t\tthis.skinIndices = [];\n\t\tthis.skinWeights = [];\n\n\t\tthis.matrices\t= [];\n\n\t}\n\n\n\tWeights.prototype.parseCluster = function ( node, id, entry ) {\n\n\t\tvar _p = node.searchConnectionParent( id );\n\t\tvar _indices = toInt( entry.subNodes.Indexes.properties.a.split( ',' ) );\n\t\tvar _weights = toFloat( entry.subNodes.Weights.properties.a.split( ',' ) );\n\t\tvar _transform = toMat44( toFloat( entry.subNodes.Transform.properties.a.split( ',' ) ) );\n\t\tvar _link = toMat44( toFloat( entry.subNodes.TransformLink.properties.a.split( ',' ) ) );\n\n\t\treturn {\n\n\t\t\t'parent': _p,\n\t\t\t'id': parseInt( id ),\n\t\t\t'indices': _indices,\n\t\t\t'weights': _weights,\n\t\t\t'transform': _transform,\n\t\t\t'transformlink': _link,\n\t\t\t'linkMode': entry.properties.Mode\n\n\t\t};\n\n\t};\n\n\tWeights.prototype.parse = function ( node, bones ) {\n\n\t\tthis.skinIndices = [];\n\t\tthis.skinWeights = [];\n\n\t\tthis.matrices = [];\n\n\t\tvar deformers = node.Objects.subNodes.Deformer;\n\n\t\tvar clusters = {};\n\t\tfor ( var id in deformers ) {\n\n\t\t\tif ( deformers[ id ].attrType === 'Cluster' ) {\n\n\t\t\t\tif ( ! ( 'Indexes' in deformers[ id ].subNodes ) ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t//clusters.push( this.parseCluster( node, id, deformers[id] ) );\n\t\t\t\tvar cluster = this.parseCluster( node, id, deformers[ id ] );\n\t\t\t\tvar boneId = node.searchConnectionChildren( cluster.id )[ 0 ];\n\t\t\t\tclusters[ boneId ] = cluster;\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// this clusters is per Bone data, thus we make this into per vertex data\n\t\tvar weights = [];\n\t\tvar hi = bones.hierarchy;\n\t\tfor ( var b = 0; b < hi.length; ++ b ) {\n\n\t\t\tvar bid = hi[ b ].internalId;\n\t\t\tif ( clusters[ bid ] === undefined ) {\n\n\t\t\t\t//console.log( bid );\n\t\t\t\tthis.matrices.push( new THREE.Matrix4() );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tvar clst = clusters[ bid ];\n\t\t\t// store transform matrix per bones\n\t\t\tthis.matrices.push( clst.transform );\n\t\t\t//this.matrices.push( clst.transformlink );\n\t\t\tfor ( var v = 0; v < clst.indices.length; ++ v ) {\n\n\t\t\t\tif ( weights[ clst.indices[ v ] ] === undefined ) {\n\n\t\t\t\t\tweights[ clst.indices[ v ] ] = {};\n\t\t\t\t\tweights[ clst.indices[ v ] ].joint = [];\n\t\t\t\t\tweights[ clst.indices[ v ] ].weight = [];\n\n\t\t\t\t}\n\n\t\t\t\t// indices\n\t\t\t\tvar affect = node.searchConnectionChildren( clst.id );\n\n\t\t\t\tif ( affect.length > 1 ) {\n\n\t\t\t\t\tconsole.warn( \"FBXLoader: node \" + clst.id + \" have many weight kids: \" + affect );\n\n\t\t\t\t}\n\t\t\t\tweights[ clst.indices[ v ] ].joint.push( bones.getBoneIdfromInternalId( node, affect[ 0 ] ) );\n\n\t\t\t\t// weight value\n\t\t\t\tweights[ clst.indices[ v ] ].weight.push( clst.weights[ v ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// normalize the skin weights\n\t\t// TODO -  this might be a good place to choose greatest 4 weights\n\t\tfor ( var i = 0; i < weights.length; i ++ ) {\n\n\t\t\tvar indicies = new THREE.Vector4(\n\t\t\t\tweights[ i ].joint[ 0 ] ? weights[ i ].joint[ 0 ] : 0,\n\t\t\t\tweights[ i ].joint[ 1 ] ? weights[ i ].joint[ 1 ] : 0,\n\t\t\t\tweights[ i ].joint[ 2 ] ? weights[ i ].joint[ 2 ] : 0,\n\t\t\t\tweights[ i ].joint[ 3 ] ? weights[ i ].joint[ 3 ] : 0 );\n\n\t\t\tvar weight = new THREE.Vector4(\n\t\t\t\tweights[ i ].weight[ 0 ] ? weights[ i ].weight[ 0 ] : 0,\n\t\t\t\tweights[ i ].weight[ 1 ] ? weights[ i ].weight[ 1 ] : 0,\n\t\t\t\tweights[ i ].weight[ 2 ] ? weights[ i ].weight[ 2 ] : 0,\n\t\t\t\tweights[ i ].weight[ 3 ] ? weights[ i ].weight[ 3 ] : 0 );\n\n\t\t\tthis.skinIndices.push( indicies );\n\t\t\tthis.skinWeights.push( weight );\n\n\t\t}\n\n\t\t//console.log( this );\n\t\treturn this;\n\n\t};\n\n\tfunction Bones() {\n\n\t\t// returns bones hierarchy tree.\n\t\t//\t  [\n\t\t//\t\t  {\n\t\t//\t\t\t  \"parent\": id,\n\t\t//\t\t\t  \"name\": name,\n\t\t//\t\t\t  \"pos\": pos,\n\t\t//\t\t\t  \"rotq\": quat\n\t\t//\t\t  },\n\t\t//\t\t  ...\n\t\t//\t\t  {},\n\t\t//\t\t  ...\n\t\t//\t  ]\n\t\t//\n\t\t/* sample response\n\n\t\t   \"bones\" : [\n\t\t\t{\"parent\":-1, \"name\":\"Fbx01\",\t\t\t\"pos\":[-0.002,\t 98.739,   1.6e-05],\t \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":0,  \"name\":\"Fbx01_Pelvis\",\t \"pos\":[0.00015963, 0,\t\t7.33107e-08], \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":1,  \"name\":\"Fbx01_Spine\",\t  \"pos\":[6.577e-06,  10.216,   0.0106811],   \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":2,  \"name\":\"Fbx01_R_Thigh\",\t\"pos\":[14.6537,\t-10.216,  -0.00918758], \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":3,  \"name\":\"Fbx01_R_Calf\",\t \"pos\":[-3.70047,\t -42.9681,\t -7.78158],\t \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":4,  \"name\":\"Fbx01_R_Foot\",\t \"pos\":[-2.0696,\t  -46.0488,\t 9.42052],\t  \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":5,  \"name\":\"Fbx01_R_Toe0\",\t \"pos\":[-0.0234785,   -9.46233,\t -15.3187],\t \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":2,  \"name\":\"Fbx01_L_Thigh\",\t\"pos\":[-14.6537,\t -10.216,\t  -0.00918314],  \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":7,  \"name\":\"Fbx01_L_Calf\",\t \"pos\":[3.70037,\t  -42.968,\t  -7.78155],\t \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":8,  \"name\":\"Fbx01_L_Foot\",\t \"pos\":[2.06954,\t  -46.0488,\t 9.42052],\t  \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":9,  \"name\":\"Fbx01_L_Toe0\",\t \"pos\":[0.0234566,\t-9.46235,\t -15.3187],\t \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":2,  \"name\":\"Fbx01_Spine1\",\t \"pos\":[-2.97523e-05, 11.5892,\t  -9.81027e-05], \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":11, \"name\":\"Fbx01_Spine2\",\t \"pos\":[-2.91292e-05, 11.4685,\t  8.27126e-05],  \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":12, \"name\":\"Fbx01_Spine3\",\t \"pos\":[-4.48857e-05, 11.5783,\t  8.35108e-05],  \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":13, \"name\":\"Fbx01_Neck\",\t   \"pos\":[1.22987e-05,  11.5582,\t  -0.0044775],   \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":14, \"name\":\"Fbx01_Head\",\t   \"pos\":[-3.50709e-05, 6.62915,\t  -0.00523254],  \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":15, \"name\":\"Fbx01_R_Eye\",\t  \"pos\":[3.31681,\t  12.739,\t   -10.5267],\t \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":15, \"name\":\"Fbx01_L_Eye\",\t  \"pos\":[-3.32038,\t 12.7391,\t  -10.5267],\t \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":15, \"name\":\"Jaw\",\t\t\t  \"pos\":[-0.0017738,   7.43481,\t  -4.08114],\t \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":14, \"name\":\"Fbx01_R_Clavicle\", \"pos\":[3.10919,\t  2.46577,\t  -0.0115284],   \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":19, \"name\":\"Fbx01_R_UpperArm\", \"pos\":[16.014,\t   4.57764e-05,  3.10405],\t  \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":20, \"name\":\"Fbx01_R_Forearm\",  \"pos\":[22.7068,\t  -1.66322,\t -2.13803],\t \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":21, \"name\":\"Fbx01_R_Hand\",\t \"pos\":[25.5881,\t  -0.80249,\t -6.37307],\t \"rotq\":[0, 0, 0, 1]},\n\t\t\t...\n\t\t\t{\"parent\":27, \"name\":\"Fbx01_R_Finger32\", \"pos\":[2.15572,\t  -0.548737,\t-0.539604],\t\"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":22, \"name\":\"Fbx01_R_Finger2\",  \"pos\":[9.79318,\t  0.132553,\t -2.97845],\t \"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":29, \"name\":\"Fbx01_R_Finger21\", \"pos\":[2.74037,\t  0.0483093,\t-0.650531],\t\"rotq\":[0, 0, 0, 1]},\n\t\t\t{\"parent\":55, \"name\":\"Fbx01_L_Finger02\", \"pos\":[-1.65308,\t -1.43208,\t -1.82885],\t \"rotq\":[0, 0, 0, 1]}\n\t\t\t]\n\t\t*/\n\t\tthis.hierarchy = [];\n\n\t}\n\n\tBones.prototype.parseHierarchy = function ( node ) {\n\n\t\tvar objects = node.Objects;\n\t\tvar models = objects.subNodes.Model;\n\n\t\tvar bones = [];\n\t\tfor ( var id in models ) {\n\n\t\t\tif ( models[ id ].attrType === undefined ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\t\t\tbones.push( models[ id ] );\n\n\t\t}\n\n\t\tthis.hierarchy = [];\n\t\tfor ( var i = 0; i < bones.length; ++ i ) {\n\n\t\t\tvar bone = bones[ i ];\n\n\t\t\tvar p = node.searchConnectionParent( bone.id )[ 0 ];\n\t\t\tvar t = [ 0.0, 0.0, 0.0 ];\n\t\t\tvar r = [ 0.0, 0.0, 0.0, 1.0 ];\n\t\t\tvar s = [ 1.0, 1.0, 1.0 ];\n\n\t\t\tif ( 'Lcl_Translation' in bone.properties ) {\n\n\t\t\t\tt = toFloat( bone.properties.Lcl_Translation.value.split( ',' ) );\n\n\t\t\t}\n\n\t\t\tif ( 'Lcl_Rotation' in bone.properties ) {\n\n\t\t\t\tr = toRad( toFloat( bone.properties.Lcl_Rotation.value.split( ',' ) ) );\n\t\t\t\tvar q = new THREE.Quaternion();\n\t\t\t\tq.setFromEuler( new THREE.Euler( r[ 0 ], r[ 1 ], r[ 2 ], 'ZYX' ) );\n\t\t\t\tr = [ q.x, q.y, q.z, q.w ];\n\n\t\t\t}\n\n\t\t\tif ( 'Lcl_Scaling' in bone.properties ) {\n\n\t\t\t\ts = toFloat( bone.properties.Lcl_Scaling.value.split( ',' ) );\n\n\t\t\t}\n\n\t\t\t// replace unsafe character\n\t\t\tvar name = bone.attrName;\n\t\t\tname = name.replace( /:/, '' );\n\t\t\tname = name.replace( /_/, '' );\n\t\t\tname = name.replace( /-/, '' );\n\t\t\tthis.hierarchy.push( { \"parent\": p, \"name\": name, \"pos\": t, \"rotq\": r, \"scl\": s, \"internalId\": bone.id } );\n\n\t\t}\n\n\t\tthis.reindexParentId();\n\n\t\tthis.restoreBindPose( node );\n\n\t\treturn this;\n\n\t};\n\n\tBones.prototype.reindexParentId = function () {\n\n\t\tfor ( var h = 0; h < this.hierarchy.length; h ++ ) {\n\n\t\t\tfor ( var ii = 0; ii < this.hierarchy.length; ++ ii ) {\n\n\t\t\t\tif ( this.hierarchy[ h ].parent == this.hierarchy[ ii ].internalId ) {\n\n\t\t\t\t\tthis.hierarchy[ h ].parent = ii;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tBones.prototype.restoreBindPose = function ( node ) {\n\n\t\tvar bindPoseNode = node.Objects.subNodes.Pose;\n\t\tif ( bindPoseNode === undefined ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tvar poseNode = bindPoseNode.subNodes.PoseNode;\n\t\tvar localMatrices = {}; // store local matrices, modified later( initialy world space )\n\t\tvar worldMatrices = {}; // store world matrices\n\n\t\tfor ( var i = 0; i < poseNode.length; ++ i ) {\n\n\t\t\tvar rawMatLcl = toMat44( poseNode[ i ].subNodes.Matrix.properties.a.split( ',' ) );\n\t\t\tvar rawMatWrd = toMat44( poseNode[ i ].subNodes.Matrix.properties.a.split( ',' ) );\n\n\t\t\tlocalMatrices[ poseNode[ i ].id ] = rawMatLcl;\n\t\t\tworldMatrices[ poseNode[ i ].id ] = rawMatWrd;\n\n\t\t}\n\n\t\tfor ( var h = 0; h < this.hierarchy.length; ++ h ) {\n\n\t\t\tvar bone = this.hierarchy[ h ];\n\t\t\tvar inId = bone.internalId;\n\n\t\t\tif ( worldMatrices[ inId ] === undefined ) {\n\n\t\t\t\t// has no bind pose node, possibly be mesh\n\t\t\t\t// console.log( bone );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tvar t = new THREE.Vector3( 0, 0, 0 );\n\t\t\tvar r = new THREE.Quaternion();\n\t\t\tvar s = new THREE.Vector3( 1, 1, 1 );\n\n\t\t\tvar parentId;\n\t\t\tvar parentNodes = node.searchConnectionParent( inId );\n\t\t\tfor ( var pn = 0; pn < parentNodes.length; ++ pn ) {\n\n\t\t\t\tif ( this.isBoneNode( parentNodes[ pn ] ) ) {\n\n\t\t\t\t\tparentId = parentNodes[ pn ];\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( parentId !== undefined && localMatrices[ parentId ] !== undefined ) {\n\n\t\t\t\t// convert world space matrix into local space\n\t\t\t\tvar inv = new THREE.Matrix4();\n\t\t\t\tinv.getInverse( worldMatrices[ parentId ] );\n\t\t\t\tinv.multiply( localMatrices[ inId ] );\n\t\t\t\tlocalMatrices[ inId ] = inv;\n\n\t\t\t} else {\n\t\t\t\t//console.log( bone );\n\t\t\t}\n\n\t\t\tlocalMatrices[ inId ].decompose( t, r, s );\n\t\t\tbone.pos = [ t.x, t.y, t.z ];\n\t\t\tbone.rotq = [ r.x, r.y, r.z, r.w ];\n\t\t\tbone.scl = [ s.x, s.y, s.z ];\n\n\t\t}\n\n\t};\n\n\tBones.prototype.searchRealId = function ( internalId ) {\n\n\t\tfor ( var h = 0; h < this.hierarchy.length; h ++ ) {\n\n\t\t\tif ( internalId == this.hierarchy[ h ].internalId ) {\n\n\t\t\t\treturn h;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// console.warn( 'FBXLoader: notfound internalId in bones: ' + internalId);\n\t\treturn - 1;\n\n\t};\n\n\tBones.prototype.getByInternalId = function ( internalId ) {\n\n\t\tfor ( var h = 0; h < this.hierarchy.length; h ++ ) {\n\n\t\t\tif ( internalId == this.hierarchy[ h ].internalId ) {\n\n\t\t\t\treturn this.hierarchy[ h ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t};\n\n\tBones.prototype.isBoneNode = function ( id ) {\n\n\t\tfor ( var i = 0; i < this.hierarchy.length; ++ i ) {\n\n\t\t\tif ( id === this.hierarchy[ i ].internalId ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t}\n\t\treturn false;\n\n\t};\n\n\tBones.prototype.getBoneIdfromInternalId = function ( node, id ) {\n\n\t\tif ( node.__cache_get_boneid_from_internalid === undefined ) {\n\n\t\t\tnode.__cache_get_boneid_from_internalid = [];\n\n\t\t}\n\n\t\tif ( node.__cache_get_boneid_from_internalid[ id ] !== undefined ) {\n\n\t\t\treturn node.__cache_get_boneid_from_internalid[ id ];\n\n\t\t}\n\n\t\tfor ( var i = 0; i < this.hierarchy.length; ++ i ) {\n\n\t\t\tif ( this.hierarchy[ i ].internalId == id ) {\n\n\t\t\t\tvar res = i;\n\t\t\t\tnode.__cache_get_boneid_from_internalid[ id ] = i;\n\t\t\t\treturn i;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// console.warn( 'FBXLoader: bone internalId(' + id + ') not found in bone hierarchy' );\n\t\treturn - 1;\n\n\t};\n\n\n\tfunction Geometry() {\n\n\t\tthis.node = null;\n\t\tthis.name = null;\n\t\tthis.id = null;\n\n\t\tthis.vertices = [];\n\t\tthis.indices = [];\n\t\tthis.normals = [];\n\t\tthis.uvs = [];\n\n\t\tthis.bones = [];\n\t\tthis.skins = null;\n\n\t}\n\n\tGeometry.prototype.parse = function ( geoNode ) {\n\n\t\tthis.node = geoNode;\n\t\tthis.name = geoNode.attrName;\n\t\tthis.id = geoNode.id;\n\n\t\tthis.vertices = this.getVertices();\n\n\t\tif ( this.vertices === undefined ) {\n\n\t\t\tconsole.log( 'FBXLoader: Geometry.parse(): pass' + this.node.id );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.indices = this.getPolygonVertexIndices();\n\t\tthis.uvs = ( new UV() ).parse( this.node, this );\n\t\tthis.normals = ( new Normal() ).parse( this.node, this );\n\n\t\tif ( this.getPolygonTopologyMax() > 3 ) {\n\n\t\t\tthis.indices = this.convertPolyIndicesToTri(\n\t\t\t\t\t\t\t\tthis.indices, this.getPolygonTopologyArray() );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\n\tGeometry.prototype.getVertices = function () {\n\n\t\tif ( this.node.__cache_vertices ) {\n\n\t\t\treturn this.node.__cache_vertices;\n\n\t\t}\n\n\t\tif ( this.node.subNodes.Vertices === undefined ) {\n\n\t\t\tconsole.warn( 'this.node: ' + this.node.attrName + \"(\" + this.node.id + \") does not have Vertices\" );\n\t\t\tthis.node.__cache_vertices = undefined;\n\t\t\treturn null;\n\n\t\t}\n\n\t\tvar rawTextVert\t= this.node.subNodes.Vertices.properties.a;\n\t\tvar vertices = rawTextVert.split( ',' ).map( function ( element ) {\n\n\t\t\treturn parseFloat( element );\n\n\t\t} );\n\n\t\tthis.node.__cache_vertices = vertices;\n\t\treturn this.node.__cache_vertices;\n\n\t};\n\n\tGeometry.prototype.getPolygonVertexIndices = function () {\n\n\t\tif ( this.node.__cache_indices && this.node.__cache_poly_topology_max ) {\n\n\t\t\treturn this.node.__cache_indices;\n\n\t\t}\n\n\t\tif ( this.node.subNodes === undefined ) {\n\n\t\t\tconsole.error( 'this.node.subNodes undefined' );\n\t\t\tconsole.log( this.node );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.node.subNodes.PolygonVertexIndex === undefined ) {\n\n\t\t\tconsole.warn( 'this.node: ' + this.node.attrName + \"(\" + this.node.id + \") does not have PolygonVertexIndex \" );\n\t\t\tthis.node.__cache_indices = undefined;\n\t\t\treturn;\n\n\t\t}\n\n\t\tvar rawTextIndices = this.node.subNodes.PolygonVertexIndex.properties.a;\n\t\tvar indices = rawTextIndices.split( ',' );\n\n\t\tvar currentTopo = 1;\n\t\tvar topologyN = null;\n\t\tvar topologyArr = [];\n\n\t\t// The indices that make up the polygon are in order and a negative index\n\t\t// means that it’s the last index of the polygon. That index needs\n\t\t// to be made positive and then you have to subtract 1 from it!\n\t\tfor ( var i = 0; i < indices.length; ++ i ) {\n\n\t\t\tvar tmpI = parseInt( indices[ i ] );\n\t\t\t// found n\n\t\t\tif ( tmpI < 0 ) {\n\n\t\t\t\tif ( currentTopo > topologyN ) {\n\n\t\t\t\t\ttopologyN = currentTopo;\n\n\t\t\t\t}\n\n\t\t\t\tindices[ i ] = tmpI ^ - 1;\n\t\t\t\ttopologyArr.push( currentTopo );\n\t\t\t\tcurrentTopo = 1;\n\n\t\t\t} else {\n\n\t\t\t\tindices[ i ] = tmpI;\n\t\t\t\tcurrentTopo ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( topologyN === null ) {\n\n\t\t\tconsole.warn( \"FBXLoader: topology N not found: \" + this.node.attrName );\n\t\t\tconsole.warn( this.node );\n\t\t\ttopologyN = 3;\n\n\t\t}\n\n\t\tthis.node.__cache_poly_topology_max = topologyN;\n\t\tthis.node.__cache_poly_topology_arr = topologyArr;\n\t\tthis.node.__cache_indices = indices;\n\n\t\treturn this.node.__cache_indices;\n\n\t};\n\n\tGeometry.prototype.getPolygonTopologyMax = function () {\n\n\t\tif ( this.node.__cache_indices && this.node.__cache_poly_topology_max ) {\n\n\t\t\treturn this.node.__cache_poly_topology_max;\n\n\t\t}\n\n\t\tthis.getPolygonVertexIndices( this.node );\n\t\treturn this.node.__cache_poly_topology_max;\n\n\t};\n\n\tGeometry.prototype.getPolygonTopologyArray = function () {\n\n\t\tif ( this.node.__cache_indices && this.node.__cache_poly_topology_max ) {\n\n\t\t\treturn this.node.__cache_poly_topology_arr;\n\n\t\t}\n\n\t\tthis.getPolygonVertexIndices( this.node );\n\t\treturn this.node.__cache_poly_topology_arr;\n\n\t};\n\n\t// a - d\n\t// |   |\n\t// b - c\n\t//\n\t// [( a, b, c, d ) ...........\n\t// [( a, b, c ), (a, c, d )....\n\tGeometry.prototype.convertPolyIndicesToTri = function ( indices, strides ) {\n\n\t\tvar res = [];\n\n\t\tvar i = 0;\n\t\tvar tmp = [];\n\t\tvar currentPolyNum = 0;\n\t\tvar currentStride = 0;\n\n\t\twhile ( i < indices.length ) {\n\n\t\t\tcurrentStride = strides[ currentPolyNum ];\n\n\t\t\t// CAUTIN: NG over 6gon\n\t\t\tfor ( var j = 0; j <= ( currentStride - 3 ); j ++ ) {\n\n\t\t\t\tres.push( indices[ i ] );\n\t\t\t\tres.push( indices[ i + ( currentStride - 2 - j ) ] );\n\t\t\t\tres.push( indices[ i + ( currentStride - 1 - j ) ] );\n\n\t\t\t}\n\n\t\t\tcurrentPolyNum ++;\n\t\t\ti += currentStride;\n\n\t\t}\n\n\t\treturn res;\n\n\t};\n\n\tGeometry.prototype.addBones = function ( bones ) {\n\n\t\tthis.bones = bones;\n\n\t};\n\n\n\tfunction UV() {\n\n\t\tthis.uv = null;\n\t\tthis.map = null;\n\t\tthis.ref = null;\n\t\tthis.node = null;\n\t\tthis.index = null;\n\n\t}\n\n\tUV.prototype.getUV = function ( node ) {\n\n\t\tif ( this.node && this.uv && this.map && this.ref ) {\n\n\t\t\treturn this.uv;\n\n\t\t} else {\n\n\t\t\treturn this._parseText( node );\n\n\t\t}\n\n\t};\n\n\tUV.prototype.getMap = function ( node ) {\n\n\t\tif ( this.node && this.uv && this.map && this.ref ) {\n\n\t\t\treturn this.map;\n\n\t\t} else {\n\n\t\t\tthis._parseText( node );\n\t\t\treturn this.map;\n\n\t\t}\n\n\t};\n\n\tUV.prototype.getRef = function ( node ) {\n\n\t\tif ( this.node && this.uv && this.map && this.ref ) {\n\n\t\t\treturn this.ref;\n\n\t\t} else {\n\n\t\t\tthis._parseText( node );\n\t\t\treturn this.ref;\n\n\t\t}\n\n\t};\n\n\tUV.prototype.getIndex = function ( node ) {\n\n\t\tif ( this.node && this.uv && this.map && this.ref ) {\n\n\t\t\treturn this.index;\n\n\t\t} else {\n\n\t\t\tthis._parseText( node );\n\t\t\treturn this.index;\n\n\t\t}\n\n\t};\n\n\tUV.prototype.getNode = function ( topnode ) {\n\n\t\tif ( this.node !== null ) {\n\n\t\t\treturn this.node;\n\n\t\t}\n\n\t\tthis.node = topnode.subNodes.LayerElementUV;\n\t\treturn this.node;\n\n\t};\n\n\tUV.prototype._parseText = function ( node ) {\n\n\t\tvar uvNode = this.getNode( node );\n\t\tif ( uvNode === undefined ) {\n\n\t\t\t// console.log( node.attrName + \"(\" + node.id + \")\" + \" has no LayerElementUV.\" );\n\t\t\treturn [];\n\n\t\t}\n\n\t\tvar count = 0;\n\t\tvar x = '';\n\t\tfor ( var n in uvNode ) {\n\n\t\t\tif ( n.match( /^\\d+$/ ) ) {\n\n\t\t\t\tcount ++;\n\t\t\t\tx = n;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( count > 0 ) {\n\n\t\t\tconsole.warn( 'multi uv not supported' );\n\t\t\tuvNode = uvNode[ n ];\n\n\t\t}\n\n\t\tvar uvIndex = uvNode.subNodes.UVIndex.properties.a;\n\t\tvar uvs = uvNode.subNodes.UV.properties.a;\n\t\tvar uvMap = uvNode.properties.MappingInformationType;\n\t\tvar uvRef = uvNode.properties.ReferenceInformationType;\n\n\n\t\tthis.uv\t= toFloat( uvs.split( ',' ) );\n\t\tthis.index = toInt( uvIndex.split( ',' ) );\n\n\t\tthis.map = uvMap; // TODO: normalize notation shaking... FOR BLENDER\n\t\tthis.ref = uvRef;\n\n\t\treturn this.uv;\n\n\t};\n\n\tUV.prototype.parse = function ( node, geo ) {\n\n\t\tthis.uvNode = this.getNode( node );\n\n\t\tthis.uv = this.getUV( node );\n\t\tvar mappingType = this.getMap( node );\n\t\tvar refType = this.getRef( node );\n\t\tvar indices = this.getIndex( node );\n\n\t\tvar strides = geo.getPolygonTopologyArray();\n\n\t\t// it means that there is a normal for every vertex of every polygon of the model.\n\t\t// For example, if the models has 8 vertices that make up four quads, then there\n\t\t// will be 16 normals (one normal * 4 polygons * 4 vertices of the polygon). Note\n\t\t// that generally a game engine needs the vertices to have only one normal defined.\n\t\t// So, if you find a vertex has more tha one normal, you can either ignore the normals\n\t\t// you find after the first, or calculate the mean from all of them (normal smoothing).\n\t\t//if ( mappingType == \"ByPolygonVertex\" ){\n\t\tswitch ( mappingType ) {\n\n\t\t\tcase \"ByPolygonVertex\":\n\n\t\t\t\tswitch ( refType ) {\n\n\t\t\t\t\t// Direct\n\t\t\t\t\t// The this.uv are in order.\n\t\t\t\t\tcase \"Direct\":\n\t\t\t\t\t\tthis.uv = this.parseUV_ByPolygonVertex_Direct( this.uv, indices, strides, 2 );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t// IndexToDirect\n\t\t\t\t\t// The order of the this.uv is given by the uvsIndex property.\n\t\t\t\t\tcase \"IndexToDirect\":\n\t\t\t\t\t\tthis.uv = this.parseUV_ByPolygonVertex_IndexToDirect( this.uv, indices );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\t// convert from by polygon(vert) data into by verts data\n\t\t\t\tthis.uv = mapByPolygonVertexToByVertex( this.uv, geo.getPolygonVertexIndices( node ), 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase \"ByPolygon\":\n\n\t\t\t\tswitch ( refType ) {\n\n\t\t\t\t\t// Direct\n\t\t\t\t\t// The this.uv are in order.\n\t\t\t\t\tcase \"Direct\":\n\t\t\t\t\t\tthis.uv = this.parseUV_ByPolygon_Direct();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t// IndexToDirect\n\t\t\t\t\t// The order of the this.uv is given by the uvsIndex property.\n\t\t\t\t\tcase \"IndexToDirect\":\n\t\t\t\t\t\tthis.uv = this.parseUV_ByPolygon_IndexToDirect();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn this.uv;\n\n\t};\n\n\tUV.prototype.parseUV_ByPolygonVertex_Direct = function ( node, indices, strides, itemSize ) {\n\n\t\treturn parse_Data_ByPolygonVertex_Direct( node, indices, strides, itemSize );\n\n\t};\n\n\tUV.prototype.parseUV_ByPolygonVertex_IndexToDirect = function ( node, indices ) {\n\n\t\treturn parse_Data_ByPolygonVertex_IndexToDirect( node, indices, 2 );\n\n\t};\n\n\tUV.prototype.parseUV_ByPolygon_Direct = function ( node ) {\n\n\t\tconsole.warn( \"not implemented\" );\n\t\treturn node;\n\n\t};\n\n\tUV.prototype.parseUV_ByPolygon_IndexToDirect = function ( node ) {\n\n\t\tconsole.warn( \"not implemented\" );\n\t\treturn node;\n\n\t};\n\n\tUV.prototype.parseUV_ByVertex_Direct = function ( node ) {\n\n\t\tconsole.warn( \"not implemented\" );\n\t\treturn node;\n\n\t};\n\n\n\tfunction Normal() {\n\n\t\tthis.normal = null;\n\t\tthis.map\t= null;\n\t\tthis.ref\t= null;\n\t\tthis.node = null;\n\t\tthis.index = null;\n\n\t}\n\n\tNormal.prototype.getNormal = function ( node ) {\n\n\t\tif ( this.node && this.normal && this.map && this.ref ) {\n\n\t\t\treturn this.normal;\n\n\t\t} else {\n\n\t\t\tthis._parseText( node );\n\t\t\treturn this.normal;\n\n\t\t}\n\n\t};\n\n\t// mappingType: possible variant\n\t//\t  ByPolygon\n\t//\t  ByPolygonVertex\n\t//\t  ByVertex (or also ByVertice, as the Blender exporter writes)\n\t//\t  ByEdge\n\t//\t  AllSame\n\t//\tvar mappingType = node.properties.MappingInformationType;\n\tNormal.prototype.getMap = function ( node ) {\n\n\t\tif ( this.node && this.normal && this.map && this.ref ) {\n\n\t\t\treturn this.map;\n\n\t\t} else {\n\n\t\t\tthis._parseText( node );\n\t\t\treturn this.map;\n\n\t\t}\n\n\t};\n\n\t// refType: possible variants\n\t//\t  Direct\n\t//\t  IndexToDirect (or Index for older versions)\n\t// var refType\t = node.properties.ReferenceInformationType;\n\tNormal.prototype.getRef = function ( node ) {\n\n\t\tif ( this.node && this.normal && this.map && this.ref ) {\n\n\t\t\treturn this.ref;\n\n\t\t} else {\n\n\t\t\tthis._parseText( node );\n\t\t\treturn this.ref;\n\n\t\t}\n\n\t};\n\n\tNormal.prototype.getNode = function ( node ) {\n\n\t\tif ( this.node ) {\n\n\t\t\treturn this.node;\n\n\t\t}\n\n\t\tthis.node = node.subNodes.LayerElementNormal;\n\t\treturn this.node;\n\n\t};\n\n\tNormal.prototype._parseText = function ( node ) {\n\n\t\tvar normalNode = this.getNode( node );\n\n\t\tif ( normalNode === undefined ) {\n\n\t\t\tconsole.warn( 'node: ' + node.attrName + \"(\" + node.id + \") does not have LayerElementNormal\" );\n\t\t\treturn;\n\n\t\t}\n\n\t\tvar mappingType = normalNode.properties.MappingInformationType;\n\t\tvar refType = normalNode.properties.ReferenceInformationType;\n\n\t\tvar rawTextNormals = normalNode.subNodes.Normals.properties.a;\n\t\tthis.normal = toFloat( rawTextNormals.split( ',' ) );\n\n\t\t// TODO: normalize notation shaking, vertex / vertice... blender...\n\t\tthis.map\t= mappingType;\n\t\tthis.ref\t= refType;\n\n\t};\n\n\tNormal.prototype.parse = function ( topnode, geo ) {\n\n\t\tvar normals = this.getNormal( topnode );\n\t\tvar normalNode = this.getNode( topnode );\n\t\tvar mappingType = this.getMap( topnode );\n\t\tvar refType = this.getRef( topnode );\n\n\t\tvar indices = geo.getPolygonVertexIndices( topnode );\n\t\tvar strides = geo.getPolygonTopologyArray( topnode );\n\n\t\t// it means that there is a normal for every vertex of every polygon of the model.\n\t\t// For example, if the models has 8 vertices that make up four quads, then there\n\t\t// will be 16 normals (one normal * 4 polygons * 4 vertices of the polygon). Note\n\t\t// that generally a game engine needs the vertices to have only one normal defined.\n\t\t// So, if you find a vertex has more tha one normal, you can either ignore the normals\n\t\t// you find after the first, or calculate the mean from all of them (normal smoothing).\n\t\t//if ( mappingType == \"ByPolygonVertex\" ){\n\t\tswitch ( mappingType ) {\n\n\t\t\tcase \"ByPolygonVertex\":\n\n\t\t\t\tswitch ( refType ) {\n\n\t\t\t\t\t// Direct\n\t\t\t\t\t// The normals are in order.\n\t\t\t\t\tcase \"Direct\":\n\t\t\t\t\t\tnormals = this.parseNormal_ByPolygonVertex_Direct( normals, indices, strides, 3 );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t// IndexToDirect\n\t\t\t\t\t// The order of the normals is given by the NormalsIndex property.\n\t\t\t\t\tcase \"IndexToDirect\":\n\t\t\t\t\t\tnormals = this.parseNormal_ByPolygonVertex_IndexToDirect();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase \"ByPolygon\":\n\n\t\t\t\tswitch ( refType ) {\n\n\t\t\t\t\t// Direct\n\t\t\t\t\t// The normals are in order.\n\t\t\t\t\tcase \"Direct\":\n\t\t\t\t\t\tnormals = this.parseNormal_ByPolygon_Direct();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t// IndexToDirect\n\t\t\t\t\t// The order of the normals is given by the NormalsIndex property.\n\t\t\t\t\tcase \"IndexToDirect\":\n\t\t\t\t\t\tnormals = this.parseNormal_ByPolygon_IndexToDirect();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\treturn normals;\n\n\t};\n\n\tNormal.prototype.parseNormal_ByPolygonVertex_Direct = function ( node, indices, strides, itemSize ) {\n\n\t\treturn parse_Data_ByPolygonVertex_Direct( node, indices, strides, itemSize );\n\n\t};\n\n\tNormal.prototype.parseNormal_ByPolygonVertex_IndexToDirect = function ( node ) {\n\n\t\tconsole.warn( \"not implemented\" );\n\t\treturn node;\n\n\t};\n\n\tNormal.prototype.parseNormal_ByPolygon_Direct = function ( node ) {\n\n\t\tconsole.warn( \"not implemented\" );\n\t\treturn node;\n\n\t};\n\n\tNormal.prototype.parseNormal_ByPolygon_IndexToDirect = function ( node ) {\n\n\t\tconsole.warn( \"not implemented\" );\n\t\treturn node;\n\n\t};\n\n\tNormal.prototype.parseNormal_ByVertex_Direct = function ( node ) {\n\n\t\tconsole.warn( \"not implemented\" );\n\t\treturn node;\n\n\t};\n\n\tfunction AnimationCurve() {\n\n\t\tthis.version = null;\n\n\t\tthis.id = null;\n\t\tthis.internalId = null;\n\t\tthis.times = null;\n\t\tthis.values = null;\n\n\t\tthis.attrFlag = null; // tangeant\n\t\tthis.attrData = null; // slope, weight\n\n\t}\n\n\tAnimationCurve.prototype.fromNode = function ( curveNode ) {\n\n\t\tthis.id = curveNode.id;\n\t\tthis.internalId = curveNode.id;\n\t\tthis.times = curveNode.subNodes.KeyTime.properties.a;\n\t\tthis.values = curveNode.subNodes.KeyValueFloat.properties.a;\n\n\t\tthis.attrFlag = curveNode.subNodes.KeyAttrFlags.properties.a;\n\t\tthis.attrData = curveNode.subNodes.KeyAttrDataFloat.properties.a;\n\n\t\tthis.times = toFloat( this.times.split(\t',' ) );\n\t\tthis.values = toFloat( this.values.split( ',' ) );\n\t\tthis.attrData = toFloat( this.attrData.split( ',' ) );\n\t\tthis.attrFlag = toInt( this.attrFlag.split( ',' ) );\n\n\t\tthis.times = this.times.map( function ( element ) {\n\n\t\t\treturn FBXTimeToSeconds( element );\n\n\t\t} );\n\n\t\treturn this;\n\n\t};\n\n\tAnimationCurve.prototype.getLength = function () {\n\n\t\treturn this.times[ this.times.length - 1 ];\n\n\t};\n\n\tfunction AnimationNode() {\n\n\t\tthis.id = null;\n\t\tthis.attr = null; // S, R, T\n\t\tthis.attrX = false;\n\t\tthis.attrY = false;\n\t\tthis.attrZ = false;\n\t\tthis.internalId = null;\n\t\tthis.containerInternalId = null; // bone, null etc Id\n\t\tthis.containerBoneId = null; // bone, null etc Id\n\t\tthis.curveIdx = null; // AnimationCurve's indices\n\t\tthis.curves = [];\t// AnimationCurve refs\n\n\t}\n\n\tAnimationNode.prototype.fromNode = function ( allNodes, node, bones ) {\n\n\t\tthis.id = node.id;\n\t\tthis.attr = node.attrName;\n\t\tthis.internalId = node.id;\n\n\t\tif ( this.attr.match( /S|R|T/ ) ) {\n\n\t\t\tfor ( var attrKey in node.properties ) {\n\n\t\t\t\tif ( attrKey.match( /X/ ) ) {\n\n\t\t\t\t\tthis.attrX = true;\n\n\t\t\t\t}\n\t\t\t\tif ( attrKey.match( /Y/ ) ) {\n\n\t\t\t\t\tthis.attrY = true;\n\n\t\t\t\t}\n\t\t\t\tif ( attrKey.match( /Z/ ) ) {\n\n\t\t\t\t\tthis.attrZ = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// may be deform percent nodes\n\t\t\treturn null;\n\n\t\t}\n\n\t\tthis.containerIndices = allNodes.searchConnectionParent( this.id );\n\t\tthis.curveIdx\t= allNodes.searchConnectionChildren( this.id );\n\n\t\tfor ( var i = this.containerIndices.length - 1; i >= 0; -- i ) {\n\n\t\t\tvar boneId = bones.searchRealId( this.containerIndices[ i ] );\n\t\t\tif ( boneId >= 0 ) {\n\n\t\t\t\tthis.containerBoneId = boneId;\n\t\t\t\tthis.containerId = this.containerIndices [ i ];\n\n\t\t\t}\n\n\t\t\tif ( boneId >= 0 ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\t\t// this.containerBoneId = bones.searchRealId( this.containerIndices );\n\n\t\treturn this;\n\n\t};\n\n\tAnimationNode.prototype.setCurve = function ( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t};\n\n\tfunction Animation() {\n\n\t\tthis.curves = {};\n\t\tthis.length = 0.0;\n\t\tthis.fps\t= 30.0;\n\t\tthis.frames = 0.0;\n\n\t}\n\n\tAnimation.prototype.parse = function ( node, bones ) {\n\n\t\tvar rawNodes = node.Objects.subNodes.AnimationCurveNode;\n\t\tvar rawCurves = node.Objects.subNodes.AnimationCurve;\n\n\t\t// first: expand AnimationCurveNode into curve nodes\n\t\tvar curveNodes = [];\n\t\tfor ( var key in rawNodes ) {\n\n\t\t\tif ( key.match( /\\d+/ ) ) {\n\n\t\t\t\tvar a = ( new AnimationNode() ).fromNode( node, rawNodes[ key ], bones );\n\t\t\t\tcurveNodes.push( a );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// second: gen dict, mapped by internalId\n\t\tvar tmp = {};\n\t\tfor ( var i = 0; i < curveNodes.length; ++ i ) {\n\n\t\t\tif ( curveNodes[ i ] === null ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\ttmp[ curveNodes[ i ].id ] = curveNodes[ i ];\n\n\t\t}\n\n\t\t// third: insert curves into the dict\n\t\tvar ac = [];\n\t\tvar max = 0.0;\n\t\tfor ( key in rawCurves ) {\n\n\t\t\tif ( key.match( /\\d+/ ) ) {\n\n\t\t\t\tvar c = ( new AnimationCurve() ).fromNode( rawCurves[ key ] );\n\t\t\t\tac.push( c );\n\t\t\t\tmax = c.getLength() ? c.getLength() : max;\n\n\t\t\t\tvar parentId = node.searchConnectionParent( c.id )[ 0 ];\n\t\t\t\tvar axis = node.searchConnectionType( c.id, parentId );\n\n\t\t\t\tif ( axis.match( /X/ ) ) {\n\n\t\t\t\t\taxis = 'x';\n\n\t\t\t\t}\n\t\t\t\tif ( axis.match( /Y/ ) ) {\n\n\t\t\t\t\taxis = 'y';\n\n\t\t\t\t}\n\t\t\t\tif ( axis.match( /Z/ ) ) {\n\n\t\t\t\t\taxis = 'z';\n\n\t\t\t\t}\n\n\t\t\t\ttmp[ parentId ].curves[ axis ] = c;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// forth:\n\t\tfor ( var t in tmp ) {\n\n\t\t\tvar id = tmp[ t ].containerBoneId;\n\t\t\tif ( this.curves[ id ] === undefined ) {\n\n\t\t\t\tthis.curves[ id ] = {};\n\n\t\t\t}\n\n\t\t\tthis.curves[ id ][ tmp[ t ].attr ] = tmp[ t ];\n\n\t\t}\n\n\t\tthis.length = max;\n\t\tthis.frames = this.length * this.fps;\n\n\t\treturn this;\n\n\t};\n\n\n\tfunction Textures() {\n\n\t\tthis.textures = [];\n\t\tthis.perGeoMap = {};\n\n\t}\n\n\tTextures.prototype.add = function ( tex ) {\n\n\t\tif ( this.textures === undefined ) {\n\n\t\t\tthis.textures = [];\n\n\t\t}\n\n\t\tthis.textures.push( tex );\n\n\t\tfor ( var i = 0; i < tex.parentIds.length; ++ i ) {\n\n\t\t\tif ( this.perGeoMap[ tex.parentIds[ i ] ] === undefined ) {\n\n\t\t\t\tthis.perGeoMap[ tex.parentIds[ i ] ] = [];\n\n\t\t\t}\n\n\t\t\tthis.perGeoMap[ tex.parentIds[ i ] ].push( this.textures[ this.textures.length - 1 ] );\n\n\t\t}\n\n\t};\n\n\tTextures.prototype.parse = function ( node, bones ) {\n\n\t\tvar rawNodes = node.Objects.subNodes.Texture;\n\n\t\tfor ( var n in rawNodes ) {\n\n\t\t\tvar tex = ( new Texture() ).parse( rawNodes[ n ], node );\n\t\t\tthis.add( tex );\n\n\t\t}\n\n\t\treturn this;\n\n\t};\n\n\tTextures.prototype.getById = function ( id ) {\n\n\t\treturn this.perGeoMap[ id ];\n\n\t};\n\n\tfunction Texture() {\n\n\t\tthis.fileName = \"\";\n\t\tthis.name = \"\";\n\t\tthis.id = null;\n\t\tthis.parentIds = [];\n\n\t}\n\n\tTexture.prototype.parse = function ( node, nodes ) {\n\n\t\tthis.id = node.id;\n\t\tthis.name = node.attrName;\n\t\tthis.fileName = this.parseFileName( node.properties.FileName );\n\n\t\tthis.parentIds = this.searchParents( this.id, nodes );\n\n\t\treturn this;\n\n\t};\n\n\t// TODO: support directory\n\tTexture.prototype.parseFileName = function ( fname ) {\n\n\t\tif ( fname === undefined ) {\n\n\t\t\treturn \"\";\n\n\t\t}\n\n\t\t// ignore directory structure, flatten path\n\t\tvar splitted = fname.split( /[\\\\\\/]/ );\n\t\tif ( splitted.length > 0 ) {\n\n\t\t\treturn splitted[ splitted.length - 1 ];\n\n\t\t} else {\n\n\t\t\treturn fname;\n\n\t\t}\n\n\t};\n\n\tTexture.prototype.searchParents = function ( id, nodes ) {\n\n\t\tvar p = nodes.searchConnectionParent( id );\n\n\t\treturn p;\n\n\t};\n\n\n\t/* --------------------------------------------------------------------- */\n\t/* --------------------------------------------------------------------- */\n\t/* --------------------------------------------------------------------- */\n\t/* --------------------------------------------------------------------- */\n\n\tfunction loadTextureImage( texture, url ) {\n\n\t\tvar loader = new THREE.ImageLoader();\n\n\t\tloader.load( url, function ( image ) {\n\n\n\t\t} );\n\n\t\tloader.load( url, function ( image ) {\n\n\t\t\ttexture.image = image;\n\t\t\ttexture.needUpdate = true;\n\t\t\tconsole.log( 'tex load done' );\n\n\t\t},\n\n\t\t// Function called when download progresses\n\t\t\tfunction ( xhr ) {\n\n\t\t\t\tconsole.log( ( xhr.loaded / xhr.total * 100 ) + '% loaded' );\n\n\t\t\t},\n\n\t\t\t// Function called when download errors\n\t\t\tfunction ( xhr ) {\n\n\t\t\t\tconsole.log( 'An error happened' );\n\n\t\t\t}\n\t\t);\n\n\t}\n\n\t// LayerElementUV: 0 {\n\t// \tVersion: 101\n\t//\tName: \"Texture_Projection\"\n\t//\tMappingInformationType: \"ByPolygonVertex\"\n\t//\tReferenceInformationType: \"IndexToDirect\"\n\t//\tUV: *1746 {\n\t//\tUVIndex: *7068 {\n\t//\n\t//\tThe order of the uvs is given by the UVIndex property.\n\tfunction parse_Data_ByPolygonVertex_IndexToDirect( node, indices, itemSize ) {\n\n\t\tvar res = [];\n\n\t\tfor ( var i = 0; i < indices.length; ++ i ) {\n\n\t\t\tfor ( var j = 0; j < itemSize; ++ j ) {\n\n\t\t\t\tres.push( node[ ( indices[ i ] * itemSize ) + j ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn res;\n\n\t}\n\n\n\t// what want:　normal per vertex, order vertice\n\t// i have: normal per polygon\n\t// i have: indice per polygon\n\tparse_Data_ByPolygonVertex_Direct = function ( node, indices, strides, itemSize ) {\n\n\t\t// *21204 > 3573\n\t\t// Geometry: 690680816, \"Geometry::\", \"Mesh\" {\n\t\t//  Vertices: *3573 {\n\t\t//  PolygonVertexIndex: *7068 {\n\n\t\tvar tmp = [];\n\t\tvar currentIndex = 0;\n\n\t\t// first: sort to per vertex\n\t\tfor ( var i = 0; i < indices.length; ++ i ) {\n\n\t\t\ttmp[ indices[ i ] ] = [];\n\n\t\t\t// TODO: duped entry? blend or something?\n\t\t\tfor ( var s = 0; s < itemSize; ++ s ) {\n\n\t\t\t\ttmp[ indices[ i ] ][ s ] = node[ currentIndex + s ];\n\n\t\t\t}\n\n\t\t\tcurrentIndex += itemSize;\n\n\t\t}\n\n\t\t// second: expand x,y,z into serial array\n\t\tvar res = [];\n\t\tfor ( var jj = 0; jj < tmp.length; ++ jj ) {\n\n\t\t\tif ( tmp[ jj ] === undefined ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tfor ( var t = 0; t < itemSize; ++ t ) {\n\n\t\t\t\tif ( tmp[ jj ][ t ] === undefined ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\t\t\t\tres.push( tmp[ jj ][ t ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn res;\n\n\t};\n\n\t// convert from by polygon(vert) data into by verts data\n\tfunction mapByPolygonVertexToByVertex( data, indices, stride ) {\n\n\t\tvar tmp = {};\n\t\tvar res = [];\n\t\tvar max = 0;\n\n\t\tfor ( var i = 0; i < indices.length; ++ i ) {\n\n\t\t\tif ( indices[ i ] in tmp ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\ttmp[ indices[ i ] ] = {};\n\n\t\t\tfor ( var j = 0; j < stride; ++ j ) {\n\n\t\t\t\ttmp[ indices[ i ] ][ j ] = data[ i * stride + j ];\n\n\t\t\t}\n\n\t\t\tmax = max < indices[ i ] ? indices[ i ] : max;\n\n\t\t}\n\n\t\ttry {\n\n\t\t\tfor ( i = 0; i <= max; i ++ ) {\n\n\t\t\t\tfor ( var s = 0; s < stride; s ++ ) {\n\n\t\t\t\t\tres.push( tmp[ i ][ s ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} catch ( e ) {\n\t\t\t//console.log( max );\n\t\t\t//console.log( tmp );\n\t\t\t//console.log( i );\n\t\t\t//console.log( e );\n\t\t}\n\n\t\treturn res;\n\n\t}\n\n\t// AUTODESK uses broken clock. i guess\n\tvar FBXTimeToSeconds = function ( adskTime ) {\n\n\t\treturn adskTime / 46186158000;\n\n\t};\n\n\tdegToRad = function ( degrees ) {\n\n\t\treturn degrees * Math.PI / 180;\n\n\t};\n\n\tradToDeg = function ( radians ) {\n\n\t\treturn radians * 180 / Math.PI;\n\n\t};\n\n\tquatFromVec = function ( x, y, z ) {\n\n\t\tvar euler = new THREE.Euler( x, y, z, 'ZYX' );\n\t\tvar quat = new THREE.Quaternion();\n\t\tquat.setFromEuler( euler );\n\n\t\treturn quat;\n\n\t};\n\n\n\t// extend Array.prototype ?  ....uuuh\n\ttoInt = function ( arr ) {\n\n\t\treturn arr.map( function ( element ) {\n\n\t\t\treturn parseInt( element );\n\n\t\t} );\n\n\t};\n\n\ttoFloat = function ( arr ) {\n\n\t\treturn arr.map( function ( element ) {\n\n\t\t\treturn parseFloat( element );\n\n\t\t} );\n\n\t};\n\n\ttoRad = function ( arr ) {\n\n\t\treturn arr.map( function ( element ) {\n\n\t\t\treturn degToRad( element );\n\n\t\t} );\n\n\t};\n\n\ttoMat44 = function ( arr ) {\n\n\t\tvar mat = new THREE.Matrix4();\n\t\tmat.set(\n\t\t\tarr[ 0 ], arr[ 4 ], arr[ 8 ], arr[ 12 ],\n\t\t\tarr[ 1 ], arr[ 5 ], arr[ 9 ], arr[ 13 ],\n\t\t\tarr[ 2 ], arr[ 6 ], arr[ 10 ], arr[ 14 ],\n\t\t\tarr[ 3 ], arr[ 7 ], arr[ 11 ], arr[ 15 ]\n\t\t);\n\n\t\t/*\n\t\tmat.set(\n\t\t\tarr[ 0], arr[ 1], arr[ 2], arr[ 3],\n\t\t\tarr[ 4], arr[ 5], arr[ 6], arr[ 7],\n\t\t\tarr[ 8], arr[ 9], arr[10], arr[11],\n\t\t\tarr[12], arr[13], arr[14], arr[15]\n\t\t);\n\t\t// */\n\n\t\treturn mat;\n\n\t};\n\n} )();\n"
  },
  {
    "path": "browser/vendor/three/loaders/gltf/glTF-parser.js",
    "content": "// Copyright (c) 2013 Fabrice Robinet\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n//  * Redistributions of source code must retain the above copyright\n//    notice, this list of conditions and the following disclaimer.\n//  * Redistributions in binary form must reproduce the above copyright\n//    notice, this list of conditions and the following disclaimer in the\n//    documentation and/or other materials provided with the distribution.\n//\n//  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n// ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n/*\n\tThe Abstract Loader has two modes:\n\t\t#1: [static] load all the JSON at once [as of now]\n\t\t#2: [stream] stream and parse JSON progressively [not yet supported]\n\n\tWhatever is the mechanism used to parse the JSON (#1 or #2),\n\tThe loader starts by resolving the paths to binaries and referenced json files (by replace the value of the path property with an absolute path if it was relative).\n\n\tIn case #1: it is guaranteed to call the concrete loader implementation methods in a order that solves the dependencies between the entries.\n\tonly the nodes requires an extra pass to set up the hirerarchy.\n\tIn case #2: the concrete implementation will have to solve the dependencies. no order is guaranteed.\n\n\tWhen case #1 is used the followed dependency order is:\n\n\tscenes -> nodes -> meshes -> materials -> techniques -> shaders\n\t\t\t\t\t-> buffers\n\t\t\t\t\t-> cameras\n\t\t\t\t\t-> lights\n\n\tThe readers starts with the leafs, i.e:\n\t\tshaders, techniques, materials, meshes, buffers, cameras, lights, nodes, scenes\n\n\tFor each called handle method called the client should return true if the next handle can be call right after returning,\n\tor false if a callback on client side will notify the loader that the next handle method can be called.\n\n*/\nvar global = window;\n(function (root, factory) {\n\tif (typeof exports === 'object') {\n\t\t// Node. Does not work with strict CommonJS, but\n\t\t// only CommonJS-like enviroments that support module.exports,\n\t\t// like Node.\n\t\tfactory(module.exports);\n\t} else if (typeof define === 'function' && define.amd) {\n\t\t// AMD. Register as an anonymous module.\n\t\tdefine([], function () {\n\t\t\treturn factory(root);\n\t\t});\n\t} else {\n\t\t// Browser globals\n\t\tfactory(root);\n\t}\n}(this, function (root) {\n\t\"use strict\";\n\n\tvar categoriesDepsOrder = [\"extensions\", \"buffers\", \"bufferViews\", \"images\",  \"videos\", \"samplers\", \"textures\", \"shaders\", \"programs\", \"techniques\", \"materials\", \"accessors\", \"meshes\", \"cameras\", \"lights\", \"skins\", \"nodes\", \"animations\", \"scenes\"];\n\n\tvar glTFParser = Object.create(Object.prototype, {\n\n\t\t_rootDescription: { value: null, writable: true },\n\n\t\trootDescription: {\n\t\t\tset: function(value) {\n\t\t\t\tthis._rootDescription = value;\n\t\t\t},\n\t\t\tget: function() {\n\t\t\t\treturn this._rootDescription;\n\t\t\t}\n\t\t},\n\n\t\tbaseURL: { value: null, writable: true },\n\n\t\t//detect absolute path following the same protocol than window.location\n\t\t_isAbsolutePath: {\n\t\t\tvalue: function(path) {\n\t\t\t\tvar isAbsolutePathRegExp = new RegExp(\"^\"+window.location.protocol, \"i\");\n\n\t\t\t\treturn path.match(isAbsolutePathRegExp) ? true : false;\n\t\t\t}\n\t\t},\n\n\t\tresolvePathIfNeeded: {\n\t\t\tvalue: function(path) {\n\t\t\t\tif (this._isAbsolutePath(path)) {\n\t\t\t\t\treturn path;\n\t\t\t\t}\n\n\t\t\t\tvar isDataUriRegex = /^data:/;\n\t\t\t\tif (isDataUriRegex.test(path)) {\n\t\t\t\t\treturn path;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn this.baseURL + path;\n\t\t\t}\n\t\t},\n\n\t\t_resolvePathsForCategories: {\n\t\t\tvalue: function(categories) {\n\t\t\t\tcategories.forEach( function(category) {\n\t\t\t\t\tvar descriptions = this.json[category];\n\t\t\t\t\tif (descriptions) {\n\t\t\t\t\t\tvar descriptionKeys = Object.keys(descriptions);\n\t\t\t\t\t\tdescriptionKeys.forEach( function(descriptionKey) {\n\t\t\t\t\t\t\tvar description = descriptions[descriptionKey];\n\t\t\t\t\t\t\tdescription.uri = this.resolvePathIfNeeded(description.uri);\n\t\t\t\t\t\t}, this);\n\t\t\t\t\t}\n\t\t\t\t}, this);\n\t\t\t}\n\t\t},\n\n\t\t_json: {\n\t\t\tvalue: null,\n\t\t\twritable: true\n\t\t},\n\n\t\tjson: {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn this._json;\n\t\t\t},\n\t\t\tset: function(value) {\n\t\t\t\tif (this._json !== value) {\n\t\t\t\t\tthis._json = value;\n\t\t\t\t\tthis._resolvePathsForCategories([\"buffers\", \"shaders\", \"images\", \"videos\"]);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t_path: {\n\t\t\tvalue: null,\n\t\t\twritable: true\n\t\t},\n\n\t\tgetEntryDescription: {\n\t\t\tvalue: function (entryID, entryType) {\n\t\t\t\tvar entries = null;\n\n\t\t\t\tvar category = entryType;\n\t\t\t\tentries = this.rootDescription[category];\n\t\t\t\tif (!entries) {\n\t\t\t\t\tconsole.log(\"ERROR:CANNOT find expected category named:\"+category);\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\n\t\t\t\treturn entries ? entries[entryID] : null;\n\t\t\t}\n\t\t},\n\n\t\t_stepToNextCategory: {\n\t\t\tvalue: function() {\n\t\t\t\tthis._state.categoryIndex = this.getNextCategoryIndex(this._state.categoryIndex + 1);\n\t\t\t\tif (this._state.categoryIndex !== -1) {\n\t\t\t\t\tthis._state.categoryState.index = 0;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\t_stepToNextDescription: {\n\t\t\tenumerable: false,\n\t\t\tvalue: function() {\n\t\t\t\tvar categoryState = this._state.categoryState;\n\t\t\t\tvar keys = categoryState.keys;\n\t\t\t\tif (!keys) {\n\t\t\t\t\tconsole.log(\"INCONSISTENCY ERROR\");\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tcategoryState.index++;\n\t\t\t\tcategoryState.keys = null;\n\t\t\t\tif (categoryState.index >= keys.length) {\n\t\t\t\t\treturn this._stepToNextCategory();\n\t\t\t\t}\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\n\t\thasCategory: {\n\t\t\tvalue: function(category) {\n\t\t\t\treturn this.rootDescription[category] ? true : false;\n\t\t\t}\n\t\t},\n\n\t\t_handleState: {\n\t\t\tvalue: function() {\n\n\t\t\t\tvar methodForType = {\n\t\t\t\t\t\"buffers\" : this.handleBuffer,\n\t\t\t\t\t\"bufferViews\" : this.handleBufferView,\n\t\t\t\t\t\"shaders\" : this.handleShader,\n\t\t\t\t\t\"programs\" : this.handleProgram,\n\t\t\t\t\t\"techniques\" : this.handleTechnique,\n\t\t\t\t\t\"materials\" : this.handleMaterial,\n\t\t\t\t\t\"meshes\" : this.handleMesh,\n\t\t\t\t\t\"cameras\" : this.handleCamera,\n\t\t\t\t\t\"lights\" : this.handleLight,\n\t\t\t\t\t\"nodes\" : this.handleNode,\n\t\t\t\t\t\"scenes\" : this.handleScene,\n\t\t\t\t\t\"images\" : this.handleImage,\n\t\t\t\t\t\"animations\" : this.handleAnimation,\n\t\t\t\t\t\"accessors\" : this.handleAccessor,\n\t\t\t\t\t\"skins\" : this.handleSkin,\n\t\t\t\t\t\"samplers\" : this.handleSampler,\n\t\t\t\t\t\"textures\" : this.handleTexture,\n\t\t\t\t\t\"videos\" : this.handleVideo,\n\t\t\t\t\t\"extensions\" : this.handleExtension,\n\n\t\t\t\t};\n\n\t\t\t\tvar success = true;\n\t\t\t\twhile (this._state.categoryIndex !== -1) {\n\t\t\t\t\tvar category = categoriesDepsOrder[this._state.categoryIndex];\n\t\t\t\t\tvar categoryState = this._state.categoryState;\n\t\t\t\t\tvar keys = categoryState.keys;\n\t\t\t\t\tif (!keys) {\n\t\t\t\t\t\tcategoryState.keys = keys = Object.keys(this.rootDescription[category]);\n\t\t\t\t\t\tif (keys) {\n\t\t\t\t\t\t\tif (keys.length == 0) {\n\t\t\t\t\t\t\t\tthis._stepToNextDescription();\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvar type = category;\n\t\t\t\t\tvar entryID = keys[categoryState.index];\n\t\t\t\t\tvar description = this.getEntryDescription(entryID, type);\n\t\t\t\t\tif (!description) {\n\t\t\t\t\t\tif (this.handleError) {\n\t\t\t\t\t\t\tthis.handleError(\"INCONSISTENCY ERROR: no description found for entry \"+entryID);\n\t\t\t\t\t\t\tsuccess = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif (methodForType[type]) {\n\t\t\t\t\t\t\tif (methodForType[type].call(this, entryID, description, this._state.loadContext) === false) {\n\t\t\t\t\t\t\t\tsuccess = false;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._stepToNextDescription();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (this.handleLoadCompleted) {\n\t\t\t\t\tthis.handleLoadCompleted(success);\n\t\t\t\t}\n\n\t\t\t}\n\t\t},\n\n\t\t_loadJSONIfNeeded: {\n\t\t\tenumerable: true,\n\t\t\tvalue: function(callback) {\n\t\t\t\tvar self = this;\n\t\t\t\t//FIXME: handle error\n\t\t\t\tif (!this._json)  {\n\t\t\t\t\tvar jsonPath = this._path;\n\t\t\t\t\tvar i = jsonPath.lastIndexOf(\"/\");\n\t\t\t\t\tthis.baseURL = (i !== 0) ? jsonPath.substring(0, i + 1) : '';\n\t\t\t\t\tvar jsonfile = new XMLHttpRequest();\n\t\t\t\t\tjsonfile.open(\"GET\", jsonPath, true);\n\t\t\t\t\tjsonfile.onreadystatechange = function() {\n\t\t\t\t\t\tif (jsonfile.readyState == 4) {\n\t\t\t\t\t\t\tif (jsonfile.status == 200) {\n\t\t\t\t\t\t\t\tself.json = JSON.parse(jsonfile.responseText);\n\t\t\t\t\t\t\t\tif (callback) {\n\t\t\t\t\t\t\t\t\tcallback(self.json);\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\tjsonfile.send(null);\n\t\t\t   } else {\n\t\t\t\t\tif (callback) {\n\t\t\t\t\t\tcallback(this.json);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t/* load JSON and assign it as description to the reader */\n\t\t_buildLoader: {\n\t\t\tvalue: function(callback) {\n\t\t\t\tvar self = this;\n\t\t\t\tfunction JSONReady(json) {\n\t\t\t\t\tself.rootDescription = json;\n\t\t\t\t\tif (callback)\n\t\t\t\t\t\tcallback(this);\n\t\t\t\t}\n\n\t\t\t\tthis._loadJSONIfNeeded(JSONReady);\n\t\t\t}\n\t\t},\n\n\t\t_state: { value: null, writable: true },\n\n\t\t_getEntryType: {\n\t\t\tvalue: function(entryID) {\n\t\t\t\tvar rootKeys = categoriesDepsOrder;\n\t\t\t\tfor (var i = 0 ;  i < rootKeys.length ; i++) {\n\t\t\t\t\tvar rootValues = this.rootDescription[rootKeys[i]];\n\t\t\t\t\tif (rootValues) {\n\t\t\t\t\t\treturn rootKeys[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\n\t\tgetNextCategoryIndex: {\n\t\t\tvalue: function(currentIndex) {\n\t\t\t\tfor (var i = currentIndex ; i < categoriesDepsOrder.length ; i++) {\n\t\t\t\t\tif (this.hasCategory(categoriesDepsOrder[i])) {\n\t\t\t\t\t\treturn i;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t},\n\n\t\tload: {\n\t\t\tenumerable: true,\n\t\t\tvalue: function(loadContext, options) {\n\t\t\t\tvar self = this;\n\t\t\t\tthis._buildLoader(function loaderReady(reader) {\n\t\t\t\t\tvar startCategory = self.getNextCategoryIndex.call(self,0);\n\t\t\t\t\tif (startCategory !== -1) {\n\t\t\t\t\t\tself._state = { \"loadContext\" : loadContext,\n\t\t\t\t\t\t\t\t\t\t\"options\" : options,\n\t\t\t\t\t\t\t\t\t\t\"categoryIndex\" : startCategory,\n\t\t\t\t\t\t\t\t\t\t\"categoryState\" : { \"index\" : \"0\" } };\n\t\t\t\t\t\tself._handleState();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\n\t\tinitWithPath: {\n\t\t\tvalue: function(path) {\n\t\t\t\tthis._path = path;\n\t\t\t\tthis._json = null;\n\t\t\t\treturn this;\n\t\t\t}\n\t\t},\n\n\t\t//this is meant to be global and common for all instances\n\t\t_knownURLs: { writable: true, value: {} },\n\n\t\t//to be invoked by subclass, so that ids can be ensured to not overlap\n\t\tloaderContext: {\n\t\t\tvalue: function() {\n\t\t\t\tif (typeof this._knownURLs[this._path] === \"undefined\") {\n\t\t\t\t\tthis._knownURLs[this._path] = Object.keys(this._knownURLs).length;\n\t\t\t\t}\n\t\t\t\treturn \"__\" + this._knownURLs[this._path];\n\t\t\t}\n\t\t},\n\n\t\tinitWithJSON: {\n\t\t\tvalue: function(json, baseURL) {\n\t\t\t\tthis.json = json;\n\t\t\t\tthis.baseURL = baseURL;\n\t\t\t\tif (!baseURL) {\n\t\t\t\t\tconsole.log(\"WARNING: no base URL passed to Reader:initWithJSON\");\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\n\t});\n\n\tif(root) {\n\t\troot.glTFParser = glTFParser;\n\t}\n\n\treturn glTFParser;\n\n}));\n"
  },
  {
    "path": "browser/vendor/three/loaders/gltf/glTFAnimation.js",
    "content": "/**\n * @author Tony Parisi / http://www.tonyparisi.com/\n */\n\nTHREE.glTFAnimator = ( function () {\n\n\tvar animators = [];\n\n\treturn\t{\n\t\tadd : function(animator)\n\t\t{\n\t\t\tanimators.push(animator);\n\t\t},\n\n\t\tremove: function(animator)\n\t\t{\n\t\t\tvar i = animators.indexOf(animator);\n\n\t\t\tif ( i !== -1 ) {\n\t\t\t\tanimators.splice( i, 1 );\n\t\t\t}\n\t\t},\n\n\t\tupdate : function()\n\t\t{\n\t\t\tfor (var i = 0; i < animators.length; i++)\n\t\t\t{\n\t\t\t\tanimators[i].update();\n\t\t\t}\n\t\t},\n\n\t\tcloneAnimationBindings: function(source, target) {\n\t\t\tvar newAnimations = []\n\n\t\t\tfor (var i = 0; i < animators.length; ++i) {\n\t\t\t\tvar animator = animators[i]\n\n\t\t\t\tvar newInterps = []\n\n\t\t\t\t// collect interps that need to be cloned from this animation\n\t\t\t\tfor (var j = 0; j < animator.interps.length; ++j) {\n\t\t\t\t\tvar interp = animator.interps[j]\n\n\t\t\t\t\tsource.traverse(function(n) {\n\t\t\t\t\t\tif (n === interp.targetNode && newInterps.indexOf(interp) === -1) {\n\t\t\t\t\t\t\tnewInterps.push(interp)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\t// create new interp definitions\n\t\t\t\tif (newInterps.length > 0) {\n\t\t\t\t\tvar interpDescs = []\n\n\t\t\t\t\tfor (var j = 0; j < newInterps.length; ++j) {\n\t\t\t\t\t\tvar interp = newInterps[j]\n\n\t\t\t\t\t\tfunction traverseAndClone(source, target) {\n\t\t\t\t\t\t\tif (source === interp.targetNode.skin) {\n\n\t\t\t\t\t\t\t\tvar targetIdx = source.skeleton.bones.indexOf(interp.targetNode)\n\n\t\t\t\t\t\t\t\tif (targetIdx === -1) {\n\t\t\t\t\t\t\t\t\tconsole.error('glTFAnimator.cloneAnimationBindings: cannot find target node')\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tinterpDescs.push({\n\t\t\t\t\t\t\t\t\tkeys: interp.keys.slice(),\n\t\t\t\t\t\t\t\t\tvalues: interp.values.slice(),\n\t\t\t\t\t\t\t\t\tcount: interp.count,\n\t\t\t\t\t\t\t\t\ttype: interp.type,\n\t\t\t\t\t\t\t\t\tpath: interp.path,\n\t\t\t\t\t\t\t\t\ttarget: target.skeleton.bones[targetIdx]\n\t\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\t\t// found the match, break out\n\t\t\t\t\t\t\t\treturn true\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse if (source === interp.targetNode) {\n\t\t\t\t\t\t\t\tinterpDescs.push({\n\t\t\t\t\t\t\t\t\tkeys: interp.keys.slice(),\n\t\t\t\t\t\t\t\t\tvalues: interp.values.slice(),\n\t\t\t\t\t\t\t\t\tcount: interp.count,\n\t\t\t\t\t\t\t\t\ttype: interp.type,\n\t\t\t\t\t\t\t\t\tpath: interp.path,\n\t\t\t\t\t\t\t\t\ttarget: target\n\t\t\t\t\t\t\t\t})\n\n\t\t\t\t\t\t\t\treturn true\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tfor (var i = 0; i < source.children.length; ++i) {\n\t\t\t\t\t\t\t\tif (traverseAndClone(source.children[i], target.children[i])) {\n\t\t\t\t\t\t\t\t\treturn true\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn false\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttraverseAndClone(source, target)\n\t\t\t\t\t}\n\n\t\t\t\t\tvar newAnim = new THREE.glTFAnimation(interpDescs)\n\t\t\t\t\tnewAnim.loop = animator.loop\n\t\t\t\t\tnewAnimations.push(newAnim)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (var i = 0; i < newAnimations.length; ++i) {\n\t\t\t\tnewAnimations[i].play()\n\t\t\t}\n\t\t}\n\t};\n})();\n\n// Construction/initialization\nTHREE.glTFAnimation = function(interps)\n{\n\tthis.running = false;\n\tthis.loop = false;\n\tthis.duration = 0;\n\tthis.startTime = 0;\n\tthis.interps = [];\n\t\n\tif (interps)\n\t{\n\t\tthis.createInterpolators(interps);\n\t}\n}\n\nTHREE.glTFAnimation.prototype.createInterpolators = function(interps)\n{\n\tvar i, len = interps.length;\n\tfor (i = 0; i < len; i++)\n\t{\n\t\tvar interp = new THREE.glTFInterpolator(interps[i]);\n\t\tthis.interps.push(interp);\n\t\tthis.duration = Math.max(this.duration, interp.duration);\n\t}\n}\n\n// Start/stop\nTHREE.glTFAnimation.prototype.play = function()\n{\n\tif (this.running)\n\t\treturn;\n\t\n\tthis.startTime = Date.now();\n\tthis.running = true;\n\tTHREE.glTFAnimator.add(this);\n}\n\nTHREE.glTFAnimation.prototype.stop = function()\n{\n\tthis.running = false;\n\tTHREE.glTFAnimator.remove(this);\n}\n\n// Update - drive key frame evaluation\nTHREE.glTFAnimation.prototype.update = function()\n{\n\tif (!this.running)\n\t\treturn;\n\t\n\tvar now = Date.now();\n\tvar deltat = (now - this.startTime) / 1000;\n\tvar t = deltat % this.duration;\n\tvar nCycles = Math.floor(deltat / this.duration);\n\t\n\tif (nCycles >= 1 && !this.loop)\n\t{\n\t\tthis.running = false;\n\t\tvar i, len = this.interps.length;\n\t\tfor (i = 0; i < len; i++)\n\t\t{\n\t\t\tthis.interps[i].interp(this.duration);\n\t\t}\n\t\tthis.stop();\n\t\treturn;\n\t}\n\telse\n\t{\n\t\tvar i, len = this.interps.length;\n\t\tfor (i = 0; i < len; i++)\n\t\t{\n\t\t\tthis.interps[i].interp(t);\n\t\t}\n\t}\n}\n\n//Interpolator class\n//Construction/initialization\nTHREE.glTFInterpolator = function(param) \n{\t    \t\t\n\tthis.keys = param.keys;\n\tthis.values = param.values;\n\tthis.count = param.count;\n\tthis.type = param.type;\n\tthis.path = param.path;\n\tthis.isRot = false;\n\t\n\tvar node = param.target;\n\tnode.updateMatrix();\n\tnode.matrixAutoUpdate = true;\n\tthis.targetNode = node;\n\t\n\tswitch (param.path) {\n\t\tcase \"translation\" :\n\t\t\tthis.target = node.position;\n\t\t\tthis.originalValue = node.position.clone();\n\t\t\tbreak;\n\t\tcase \"rotation\" :\n\t\t\tthis.target = node.quaternion;\n\t\t\tthis.originalValue = node.quaternion.clone();\n\t\t\tthis.isRot = true;\n\t\t\tbreak;\n\t\tcase \"scale\" :\n\t\t\tthis.target = node.scale;\n\t\t\tthis.originalValue = node.scale.clone();\n\t\t\tbreak;\n\t}\n\t\n\tthis.duration = this.keys[this.count - 1];\n\t\n\tthis.vec1 = new THREE.Vector3;\n\tthis.vec2 = new THREE.Vector3;\n\tthis.vec3 = new THREE.Vector3;\n\tthis.quat1 = new THREE.Quaternion;\n\tthis.quat2 = new THREE.Quaternion;\n\tthis.quat3 = new THREE.Quaternion;\n}\n\n//Interpolation and tweening methods\nTHREE.glTFInterpolator.prototype.interp = function(t)\n{\n\tvar i, j;\n\tif (t == this.keys[0])\n\t{\n\t\tif (this.isRot) {\n\t\t\tthis.quat3.set(this.values[0], this.values[1], this.values[2], this.values[3]);\n\t\t}\n\t\telse {\n\t\t\tthis.vec3.set(this.values[0], this.values[1], this.values[2]);\n\t\t}\n\t}\n\telse if (t < this.keys[0])\n\t{\n\t\tif (this.isRot) {\n\t\t\tthis.quat1.set(this.originalValue.x,\n\t\t\t\t\tthis.originalValue.y,\n\t\t\t\t\tthis.originalValue.z,\n\t\t\t\t\tthis.originalValue.w);\n\t\t\tthis.quat2.set(this.values[0],\n\t\t\t\t\tthis.values[1],\n\t\t\t\t\tthis.values[2],\n\t\t\t\t\tthis.values[3]);\n\t\t\tTHREE.Quaternion.slerp(this.quat1, this.quat2, this.quat3, t / this.keys[0]);\n\t\t}\n\t\telse {\n\t\t\tthis.vec3.set(this.originalValue.x,\n\t\t\t\t\tthis.originalValue.y,\n\t\t\t\t\tthis.originalValue.z);\n\t\t\tthis.vec2.set(this.values[0],\n\t\t\t\t\tthis.values[1],\n\t\t\t\t\tthis.values[2]);\n\n\t\t\tthis.vec3.lerp(this.vec2, t / this.keys[0]);\n\t\t}\n\t}\n\telse if (t >= this.keys[this.count - 1])\n\t{\n\t\tif (this.isRot) {\n\t\t\tthis.quat3.set(this.values[(this.count - 1) * 4], \n\t\t\t\t\tthis.values[(this.count - 1) * 4 + 1],\n\t\t\t\t\tthis.values[(this.count - 1) * 4 + 2],\n\t\t\t\t\tthis.values[(this.count - 1) * 4 + 3]);\n\t\t}\n\t\telse {\n\t\t\tthis.vec3.set(this.values[(this.count - 1) * 3], \n\t\t\t\t\tthis.values[(this.count - 1) * 3 + 1],\n\t\t\t\t\tthis.values[(this.count - 1) * 3 + 2]);\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (i = 0; i < this.count - 1; i++)\n\t\t{\n\t\t\tvar key1 = this.keys[i];\n\t\t\tvar key2 = this.keys[i + 1];\n\t\n\t\t\tif (t >= key1 && t <= key2)\n\t\t\t{\n\t\t\t\tif (this.isRot) {\n\t\t\t\t\tthis.quat1.set(this.values[i * 4],\n\t\t\t\t\t\t\tthis.values[i * 4 + 1],\n\t\t\t\t\t\t\tthis.values[i * 4 + 2],\n\t\t\t\t\t\t\tthis.values[i * 4 + 3]);\n\t\t\t\t\tthis.quat2.set(this.values[(i + 1) * 4],\n\t\t\t\t\t\t\tthis.values[(i + 1) * 4 + 1],\n\t\t\t\t\t\t\tthis.values[(i + 1) * 4 + 2],\n\t\t\t\t\t\t\tthis.values[(i + 1) * 4 + 3]);\n\t\t\t\t\tTHREE.Quaternion.slerp(this.quat1, this.quat2, this.quat3, (t - key1) / (key2 - key1));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.vec3.set(this.values[i * 3],\n\t\t\t\t\t\t\tthis.values[i * 3 + 1],\n\t\t\t\t\t\t\tthis.values[i * 3 + 2]);\n\t\t\t\t\tthis.vec2.set(this.values[(i + 1) * 3],\n\t\t\t\t\t\t\tthis.values[(i + 1) * 3 + 1],\n\t\t\t\t\t\t\tthis.values[(i + 1) * 3 + 2]);\n\t\n\t\t\t\t\tthis.vec3.lerp(this.vec2, (t - key1) / (key2 - key1));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tif (this.target)\n\t{\n\t\tthis.copyValue(this.target);\n\t}\n}\n\nTHREE.glTFInterpolator.prototype.copyValue = function(target) {\n\t\n\tif (this.isRot) {\n\t\ttarget.copy(this.quat3);\n\t}\n\telse {\n\t\ttarget.copy(this.vec3);\n\t}\t\t\n}\n"
  },
  {
    "path": "browser/vendor/three/loaders/gltf/glTFLoader.js",
    "content": "/**\n * @author Tony Parisi / http://www.tonyparisi.com/\n */\n\n// context in which a single load operation operates\nTHREE.glTFLoadContext = function(url, rootObj, onLoadedCallback) {\n\tthis.url = url\n\tthis.meshesRequested = 0;\n\tthis.meshesLoaded = 0;\n\tthis.pendingMeshes = [];\n\tthis.animationsRequested = 0;\n\tthis.animationsLoaded = 0;\n\tthis.animations = [];\n\tthis.shadersRequested = 0;\n\tthis.shadersLoaded = 0;\n\tthis.shaders = {};\n\tthis.loadRequests = [];\n\n\tthis.rootObj = rootObj\n\tthis.onLoadedCallback = onLoadedCallback\n\n\tthis.onSceneLoadedCallback = function(obj) {\n\n\t}\n\n\tvar that = this\n\n\tfunction componentsPerElementForGLType(type) {\n\t\tvar nElements = 1\n\t\t\n\t\tswitch(type) {\n\t\tcase \"SCALAR\" :\n\t\t\tnElements = 1;\n\t\t\tbreak;\n\t\tcase \"VEC2\" :\n\t\t\tnElements = 2;\n\t\t\tbreak;\n\t\tcase \"VEC3\" :\n\t\t\tnElements = 3;\n\t\t\tbreak;\n\t\tcase \"VEC4\" :\n\t\t\tnElements = 4;\n\t\t\tbreak;\n\t\tcase \"MAT2\" :\n\t\t\tnElements = 4;\n\t\t\tbreak;\n\t\tcase \"MAT3\" :\n\t\t\tnElements = 9;\n\t\t\tbreak;\n\t\tcase \"MAT4\" :\n\t\t\tnElements = 16;\n\t\t\tbreak;\n\t\tdefault :\n\t\t\tdebugger;\n\t\t\tbreak;\n\t\t}\n\n\t\treturn nElements;\n\t}\n\n\t// Delegate for processing index buffers\n\tvar IndicesDelegate = function() {};\n\n\tIndicesDelegate.prototype.handleError = function(errorCode, info) {\n\t\t// FIXME: report error\n\t\tconsole.log(\"ERROR(IndicesDelegate):\"+errorCode+\":\"+info);\n\t};\n\n\tIndicesDelegate.prototype.convert = function(resource, ctx) {\n\t\treturn new Uint16Array(resource, 0, ctx.indices.count);\n\t};\n\n\tIndicesDelegate.prototype.resourceAvailable = function(glResource, ctx) {\n\t\tvar geometry = ctx.geometry;\n\t\tgeometry.indexArray = glResource;\n\t\tgeometry.checkFinished();\n\t\treturn true;\n\t};\n\n\tthis.indicesDelegate = new IndicesDelegate();\n\n\t// Delegate for processing vertex attribute buffers\n\tvar VertexAttributeDelegate = function() {};\n\n\tVertexAttributeDelegate.prototype.handleError = function(errorCode, info) {\n\t\t// FIXME: report error\n\t\tconsole.log(\"ERROR(VertexAttributeDelegate):\"+errorCode+\":\"+info);\n\t};\n\n\tVertexAttributeDelegate.prototype.convert = function(resource, ctx) {\n\t\treturn resource;\n\t};\n\n\n\tVertexAttributeDelegate.prototype.bufferResourceAvailable = function(glResource, ctx) {\n\t\tvar geom = ctx.geometry;\n\t\tvar attribute = ctx.attribute;\n\t\tvar semantic = ctx.semantic;\n\t\tvar floatArray;\n\t\tvar i, l;\n\t\tvar nComponents;\n\t\t//FIXME: Float32 is assumed here, but should be checked.\n\n\t\tif (semantic == \"POSITION\") {\n\t\t\t// TODO: Should be easy to take strides into account here\n\t\t\tfloatArray = new Float32Array(glResource, 0, attribute.count * componentsPerElementForGLType(attribute.type));\n\t\t\tgeom.geometry.addAttribute( 'position', new THREE.BufferAttribute( floatArray, 3 ) );\n\t\t} else if (semantic == \"NORMAL\") {\n\t\t\tnComponents = componentsPerElementForGLType(attribute.type);\n\t\t\tfloatArray = new Float32Array(glResource, 0, attribute.count * nComponents);\n\t\t\tgeom.geometry.addAttribute( 'normal', new THREE.BufferAttribute( floatArray, 3 ) );\n\t\t} else if ((semantic == \"TEXCOORD_0\") || (semantic == \"TEXCOORD\" )) {\n\n\t\t\tnComponents = componentsPerElementForGLType(attribute.type);\n\t\t\tfloatArray = new Float32Array(glResource, 0, attribute.count * nComponents);\n\t\t\t// N.B.: flip Y value... should we just set texture.flipY everywhere?\n\t\t\tfor (i = 0; i < floatArray.length / 2; i++) {\n\t\t\t\tfloatArray[i*2+1] = 1.0 - floatArray[i*2+1];\n\t\t\t}\n\t\t\tgeom.geometry.addAttribute( 'uv', new THREE.BufferAttribute( floatArray, nComponents ) );\n\t\t}\n\t\telse if (semantic == \"WEIGHT\") {\n\t\t\tnComponents = componentsPerElementForGLType(attribute.type);\n\t\t\tfloatArray = new Float32Array(glResource, 0, attribute.count * nComponents);\n\t\t\tgeom.geometry.addAttribute( 'skinWeight', new THREE.BufferAttribute( floatArray, nComponents ) );\n\t\t}\n\t\telse if (semantic == \"JOINT\") {\n\t\t\tnComponents = componentsPerElementForGLType(attribute.type);\n\t\t\tfloatArray = new Float32Array(glResource, 0, attribute.count * nComponents);\n\t\t\tgeom.geometry.addAttribute( 'skinIndex', new THREE.BufferAttribute( floatArray, nComponents ) );\n\t\t}\n\t}\n\n\tVertexAttributeDelegate.prototype.resourceAvailable = function(glResource, ctx) {\n\n\t\tthis.bufferResourceAvailable(glResource, ctx);\n\n\t\tvar geom = ctx.geometry;\n\t\tgeom.loadedAttributes++;\n\t\tgeom.checkFinished();\n\t\treturn true;\n\t};\n\n\tthis.vertexAttributeDelegate = new VertexAttributeDelegate();\n\n\n\t// Delegate for processing shaders from external files\n\tvar ShaderDelegate = function() {\n\t};\n\n\tShaderDelegate.prototype.handleError = function(errorCode, info) {\n\t\t// FIXME: report error\n\t\tconsole.log(\"ERROR(ShaderDelegate):\"+errorCode+\":\"+info);\n\t};\n\n\tShaderDelegate.prototype.convert = function(resource, ctx) {\n\t\treturn resource;\n\t}\n\n\tShaderDelegate.prototype.resourceAvailable = function(data, ctx) {\n\t\tthat.shadersLoaded++;\n\t\tthat.shaders[ctx.id] = data;\n\t\treturn true;\n\t};\n\n\tthis.shaderDelegate = new ShaderDelegate();\n\n\t// Delegate for processing animation parameter buffers\n\tvar AnimationParameterDelegate = function() {};\n\n\tAnimationParameterDelegate.prototype.handleError = function(errorCode, info) {\n\t\t// FIXME: report error\n\t\tconsole.log(\"ERROR(AnimationParameterDelegate):\"+errorCode+\":\"+info);\n\t};\n\n\tAnimationParameterDelegate.prototype.convert = function(resource, ctx) {\n\t\tvar parameter = ctx.parameter;\n\n\t\tvar glResource = null;\n\t\tswitch (parameter.type) {\n\t\tcase \"SCALAR\" :\n\t\tcase \"VEC2\" :\n\t\tcase \"VEC3\" :\n\t\tcase \"VEC4\" :\n\t\t\tglResource = new Float32Array(resource, 0, parameter.count * componentsPerElementForGLType(parameter.type));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\treturn glResource;\n\t};\n\n\tAnimationParameterDelegate.prototype.resourceAvailable = function(glResource, ctx) {\n\t\tvar animation = ctx.animation;\n\t\tvar parameter = ctx.parameter;\n\t\tparameter.data = glResource;\n\t\tanimation.handleParameterLoaded(parameter);\n\t\treturn true;\n\t};\n\n\tthis.animationParameterDelegate = new AnimationParameterDelegate();\n\n\t// Delegate for processing inverse bind matrices buffer\n\tvar InverseBindMatricesDelegate = function() {};\n\n\tInverseBindMatricesDelegate.prototype.handleError = function(errorCode, info) {\n\t\t// FIXME: report error\n\t\tconsole.log(\"ERROR(InverseBindMatricesDelegate):\"+errorCode+\":\"+info);\n\t};\n\n\tInverseBindMatricesDelegate.prototype.convert = function(resource, ctx) {\n\t\tvar parameter = ctx.parameter;\n\n\t\tvar glResource = null;\n\t\tswitch (parameter.type) {\n\t\tcase \"MAT4\" :\n\t\t\tglResource = new Float32Array(resource, 0, parameter.count * componentsPerElementForGLType(parameter.type));\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\n\t\treturn glResource;\n\t};\n\n\tInverseBindMatricesDelegate.prototype.resourceAvailable = function(glResource, ctx) {\n\t\tvar skin = ctx.skin;\n\t\tskin.inverseBindMatrices = glResource;\n\t\treturn true;\n\t};\n\n\tthis.inverseBindMatricesDelegate = new InverseBindMatricesDelegate();\n}\n\nTHREE.glTFLoadContext.prototype.scheduleLoad = function(loadFn, data) {\n\n\tthis.loadRequests.push({fn: loadFn, data:data});\n}\n\nTHREE.glTFLoadContext.prototype.loadAllAssets = function() {\n\n\tfor (var i = 0, len = this.loadRequests.length; i < len; i++) {\n\t\tvar request = this.loadRequests[i];\n\t\trequest.fn(request.data);\n\t}\n\tthis.loadRequests = []\n}\n\nTHREE.glTFLoadContext.prototype.callLoadedCallback = function(loader) {\n\tvar result = {\n\t\tscene : this.rootObj,\n\t\tcameras : loader.cameras,\n\t\tanimations : loader.animations,\n\t\tshaders : loader.shaders,\n\t};\n\n\tthis.onLoadedCallback(result);\n}\n\nTHREE.glTFLoadContext.prototype.checkComplete = function(loader) {\n\tif (this.meshesLoaded == this.meshesRequested\n\t&& this.shadersLoaded == this.shadersRequested\n\t&& this.animationsLoaded == this.animationsRequested)\n\t{\n\t\tconsole.log('glTF loading complete:', this.url, 'meshes:', this.meshesLoaded, 'shaders:', this.shadersLoaded, 'animations', this.animationsLoaded)\n\t\tfor (var i = 0; i < this.pendingMeshes.length; i++) {\n\t\t\tvar pending = this.pendingMeshes[i];\n\t\t\tpending.mesh.attachToNode(this, pending.node);\n\t\t}\n\n\t\tfor (var i = 0; i < this.animations.length; i++) {\n\t\t\tvar animation = this.animations[i];\n\t\t\tloader.buildAnimation(animation, this.rootObj);\n\t\t}\n\n\t\tloader.createMeshAnimations(this.rootObj);\n\t\tloader.bindAnimations(this.rootObj)\n\t\tloader.createAnimations();\n\t\tTHREE.glTFShaders.bindShaderParameters(this.rootObj);\n\n\t\tthis.callLoadedCallback(loader);\n\t}\n}\n\nTHREE.glTFLoaderDebug = {\n\tdebugPendingMeshes: 0\n}\n\n// glTF loader\nTHREE.glTFLoader = function (showStatus) {\n\t//THREE.GLTFLoaderUtils.init();\n\tTHREE.glTFShaders.removeAll();\n\tTHREE.Loader.call( this, showStatus );\n}\n\nTHREE.glTFLoader.prototype = new THREE.Loader();\nTHREE.glTFLoader.prototype.constructor = THREE.glTFLoader;\n\nTHREE.glTFLoader.prototype.load = function( url, callback ) {\n\t// Utilities\n\n\tfunction RgbArraytoHex(colorArray) {\n\t\tif(!colorArray) return 0xFFFFFFFF;\n\t\tvar r = Math.floor(colorArray[0] * 255),\n\t\t\tg = Math.floor(colorArray[1] * 255),\n\t\t\tb = Math.floor(colorArray[2] * 255),\n\t\t\ta = 255;\n\n\t\tvar color = (a << 24) + (r << 16) + (g << 8) + b;\n\n\t\treturn color;\n\t}\n\n\tfunction replaceShaderDefinitions(shader, material) {\n\n\t\t// Three.js seems too dependent on attribute names so globally\n\t\t// replace those in the shader code\n\t\tvar program = material.params.program;\n\t\tvar shaderParams = material.params.technique.parameters;\n\t\tvar shaderAttributes = material.params.technique.attributes;\n\t\tvar params = {};\n\n\t\tfor (var attribute in material.params.attributes) {\n\t\t\tvar pname = shaderAttributes[attribute];\n\t\t\tvar shaderParam = shaderParams[pname];\n\t\t\tvar semantic = shaderParam.semantic;\n\t\t\tif (semantic) {\n\t\t\t\tparams[attribute] = shaderParam;\n\t\t\t}\n\t\t}\n\n\n\t\tvar s = shader;\n\t\tvar r = \"\";\n\t\tfor (var pname in params) {\n\t\t\tvar param = params[pname];\n\t\t\tvar semantic = param.semantic;\n\n\t\t\tr = eval(\"/\" + pname + \"/g\");\n\t\t\t\n\t\t\tswitch (semantic) {\n\t\t\t\tcase \"POSITION\" :\n\t\t\t\t\ts = s.replace(r, 'position');\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"NORMAL\" :\n\t\t\t\t\ts = s.replace(r, 'normal');\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"TEXCOORD_0\" :\n\t\t\t\t\ts = s.replace(r, 'uv');\n\t\t\t\t\tbreak;\n\t\t\t   case \"WEIGHT\" :\n\t\t\t\t\ts = s.replace(r, 'skinWeight');\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"JOINT\" :\n\t\t\t\t\ts = s.replace(r, 'skinIndex');\n\t\t\t\t\tbreak;\n\t\t\t\tdefault :\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t}\n\n\t\treturn s;\n\t}\n\n\tfunction replaceShaderSemantics(loadContext, material) {\n\t\t\n\t\tvar vertexShader = loadContext.shaders[material.params.vertexShader];\n\t\tif (vertexShader) {\n\t\t\tvertexShader = replaceShaderDefinitions(vertexShader, material);\n\t\t\tloadContext.shaders[material.params.vertexShader] = vertexShader;\n\t\t}\n\n\t}\n\n\tfunction createShaderMaterial(loadContext, material) {\n\t\t\n\t\t// replace named attributes and uniforms with Three.js built-ins    \n\t\treplaceShaderSemantics(loadContext, material);\n\n\t\tvar fragmentShader = loadContext.shaders[material.params.fragmentShader];\n\t\tif (!fragmentShader) {\n\t\t\tdebugger\n\t\t\tconsole.log(\"ERROR: Missing fragment shader definition:\", material.params.fragmentShader);\n\t\t\treturn new THREE.MeshPhongMaterial;\n\t\t}\n\t\t\n\t\tvar vertexShader = loadContext.shaders[material.params.vertexShader];\n\t\tif (!vertexShader) {\n\t\t\tdebugger\n\t\t\tconsole.log(\"ERROR: Missing vertex shader definition:\", material.params.vertexShader);\n\t\t\treturn new THREE.MeshPhongMaterial;\n\t\t}\n\n\t\t// clone most uniforms but then clobber textures, we want them to \n\t\t// be reused\n\t\tvar uniforms = THREE.UniformsUtils.clone(material.params.uniforms);\n\t\tfor (uniform in material.params.uniforms) {\n\t\t\tvar src = material.params.uniforms[uniform];\n\t\t\tvar dst = uniforms[uniform];\n\t\t\tif (dst.type == \"t\") {\n\t\t\t\tdst.value = src.value;\n\t\t\t}            \n\t\t}\n\n\t\tvar shaderMaterial = new THREE.RawShaderMaterial( {\n\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tvertexShader: vertexShader,\n\t\t\tuniforms: uniforms,\n\t\t\ttransparent: material.params.transparent,\n\n\t\t} );\n\n//        console.log(\"New shader material\")\n\t\treturn shaderMaterial;\n\t}\n\n\n\tfunction LoadTexture(src) {\n\t\tif(!src) { return null; }\n\n\t\tvar isDataUriRegex = /^data:/;\n\n\t\tvar loadImage = function(url, success, error) {\n\t\t\tvar image = new Image();\n\n\t\t\timage.onload = function() {\n\t\t\t\tsuccess(image);\n\t\t\t};\n\n\t\t\tif (typeof error !== 'undefined') {\n\t\t\t\timage.onerror = error;\n\t\t\t}\n\n\t\t\timage.src = url;\n\t\t};\n\n\t\tfunction loadImageFromTypedArray(uint8Array, format) {\n\t\t\t//>>includeStart('debug', pragmas.debug);\n\t\t\tif (!defined(uint8Array)) {\n\t\t\t\tthrow new DeveloperError('uint8Array is required.');\n\t\t\t}\n\n\t\t\tif (!defined(format)) {\n\t\t\t\tthrow new DeveloperError('format is required.');\n\t\t\t}\n\t\t\t//>>includeEnd('debug');\n\n\t\t\tvar blob = new Blob([uint8Array], {\n\t\t\t\ttype : format\n\t\t\t});\n\n\t\t};     \n\n\t\tfunction decodeDataUriText(isBase64, data) {\n\t\t\tvar result = decodeURIComponent(data);\n\t\t\tif (isBase64) {\n\t\t\t\treturn atob(result);\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\n\t\tfunction decodeDataUriArrayBuffer(isBase64, data) {\n\t\t\tvar byteString = decodeDataUriText(isBase64, data);\n\t\t\tvar buffer = new ArrayBuffer(byteString.length);\n\t\t\tvar view = new Uint8Array(buffer);\n\t\t\tfor (var i = 0; i < byteString.length; i++) {\n\t\t\t\tview[i] = byteString.charCodeAt(i);\n\t\t\t}\n\t\t\treturn buffer;\n\t\t}\n\n\t\tfunction decodeDataUri(dataUriRegexResult, responseType) {\n\t\t\tresponseType = typeof responseType !== 'undefined' ? responseType : '';\n\t\t\tvar mimeType = dataUriRegexResult[1];\n\t\t\tvar isBase64 = !!dataUriRegexResult[2];\n\t\t\tvar data = dataUriRegexResult[3];\n\n\t\t\tswitch (responseType) {\n\t\t\tcase '':\n\t\t\tcase 'text':\n\t\t\t\treturn decodeDataUriText(isBase64, data);\n\t\t\tcase 'ArrayBuffer':\n\t\t\t\treturn decodeDataUriArrayBuffer(isBase64, data);\n\t\t\tcase 'blob':\n\t\t\t\tvar buffer = decodeDataUriArrayBuffer(isBase64, data);\n\t\t\t\treturn new Blob([buffer], {\n\t\t\t\t\ttype : mimeType\n\t\t\t\t});\n\t\t\tcase 'document':\n\t\t\t\tvar parser = new DOMParser();\n\t\t\t\treturn parser.parseFromString(decodeDataUriText(isBase64, data), mimeType);\n\t\t\tcase 'json':\n\t\t\t\treturn JSON.parse(decodeDataUriText(isBase64, data));\n\t\t\tdefault:\n\t\t\t\tthrow 'Unhandled responseType: ' + responseType;\n\t\t\t}\n\t\t}\n\n\t\tvar dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;\n\t\tvar dataUriRegexResult = dataUriRegex.exec(src);\n\t\tif (dataUriRegexResult !== null) {\n\t\t\tvar texture = new THREE.Texture;\n\t\t\tvar blob = decodeDataUri(dataUriRegexResult, 'blob');\n\t\t\tvar blobUrl = window.URL.createObjectURL(blob);\n\t\t\tloadImage(blobUrl, function(img) {\n\t\t\t\ttexture.image = img;\n\t\t\t\ttexture.needsUpdate = true;\n\t\t\t});\n\t\t\treturn texture;\n\t\t}\n   \n\t\treturn new THREE.TextureLoader().load(src);\n\t}\n\n\tfunction CreateTexture(resources, resource) {\n\t\tvar texturePath = null;\n\t\tvar textureParams = null;\n\n\t\tif (resource)\n\t\t{\n\t\t\tvar texture = resource;\n\t\t\tif (texture) {\n\t\t\t\tvar textureEntry = resources.getEntry(texture);\n\t\t\t\tif (textureEntry) {\n\t\t\t\t\t{\n\t\t\t\t\t\tvar imageEntry = resources.getEntry(textureEntry.description.source);\n\t\t\t\t\t\tif (imageEntry) {\n\t\t\t\t\t\t\ttexturePath = imageEntry.description.uri;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar samplerEntry = resources.getEntry(textureEntry.description.sampler);\n\t\t\t\t\t\tif (samplerEntry) {\n\t\t\t\t\t\t\ttextureParams = samplerEntry.description;\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\tvar texture = LoadTexture(texturePath);\n\t\tif (texture && textureParams) {\n\t\t\t\n\t\t\tif (textureParams.wrapS == WebGLRenderingContext.REPEAT)\n\t\t\t\ttexture.wrapS = THREE.RepeatWrapping;\n\n\t\t\tif (textureParams.wrapT == WebGLRenderingContext.REPEAT)\n\t\t\t\ttexture.wrapT = THREE.RepeatWrapping;\n\t\t\t\n\t\t\tif (textureParams.magFilter == WebGLRenderingContext.LINEAR)\n\t\t\t\ttexture.magFilter = THREE.LinearFilter;\n\n//                  if (textureParams.minFilter == \"LINEAR\")\n//                      texture.minFilter = THREE.LinearFilter;\n\t\t}\n\n\t\treturn texture;\n\t}\n\n\t// Geometry processing\n\n\tvar ClassicGeometry = function() {\n\n\t\tthis.geometry = new THREE.BufferGeometry;\n\t\tthis.totalAttributes = 0;\n\t\tthis.loadedAttributes = 0;\n\t\tthis.indicesLoaded = false;\n\t\tthis.finished = false;\n\n\t\tthis.onload = null;\n\n\t\tthis.uvs = null;\n\t\tthis.indexArray = null;\n\t};\n\n\tClassicGeometry.prototype.constructor = ClassicGeometry;\n\n\tClassicGeometry.prototype.buildBufferGeometry = function() {\n\t\t// Build indexed mesh\n\t\tvar geometry = this.geometry;\n\t\tgeometry.setIndex(new THREE.BufferAttribute( this.indexArray, 1 ) );\n\n\t\tvar offset = {\n\t\t\t\tstart: 0,\n\t\t\t\tindex: 0,\n\t\t\t\tcount: this.indexArray.length\n\t\t\t};\n\n\t\tgeometry.groups.push( offset );\n\n\t\tgeometry.computeBoundingSphere();\n\t}\n\t\n\tClassicGeometry.prototype.checkFinished = function() {\n\t\tif(this.indexArray && this.loadedAttributes === this.totalAttributes) {\n\t\t\t\n\t\t\tthis.buildBufferGeometry();\n\t\t\t\n\t\t\tthis.finished = true;\n\n\t\t\tif(this.onload) {\n\t\t\t\tthis.onload();\n\t\t\t}\n\t\t}\n\t};\n\n\tvar IndicesContext = function(indices, geometry) {\n\t\tthis.indices = indices;\n\t\tthis.geometry = geometry;\n\t};\n\t\n\tvar VertexAttributeContext = function(attribute, semantic, geometry) {\n\t\tthis.attribute = attribute;\n\t\tthis.semantic = semantic;\n\t\tthis.geometry = geometry;\n\t};\n\n\tvar Mesh = function() {\n\t\t++THREE.glTFLoaderDebug.debugPendingMeshes\n\t\tthis.primitives = [];\n\t\tthis.materialsPending = [];\n\t\tthis.loadedGeometry = 0;\n\t\tthis.onCompleteCallbacks = [];\n\t};\n\n\tMesh.prototype.addPrimitive = function(geometry, material) {\n\t\t\n\t\tvar self = this;\n\t\tgeometry.onload = function() {\n\t\t\tself.loadedGeometry++;\n\t\t\tself.checkComplete();\n\t\t};\n\t\t\n\t\tthis.primitives.push({\n\t\t\tgeometry: geometry,\n\t\t\tmaterial: material,\n\t\t\tmesh: null\n\t\t});\n\t};\n\n\tMesh.prototype.onComplete = function(callback) {\n\t\tthis.onCompleteCallbacks.push(callback);\n\t\t//this.checkComplete();\n\t};\n\n\tMesh.prototype.checkComplete = function() {\n\t\tvar self = this;\n\t\tif(this.onCompleteCallbacks.length && this.primitives.length == this.loadedGeometry) {\n\t\t\tthis.onCompleteCallbacks.forEach(function(callback) {\n\t\t\t\tcallback(self);\n\t\t\t});\n\t\t\tthis.onCompleteCallbacks = [];\n\t\t\t--THREE.glTFLoaderDebug.debugPendingMeshes\n\t\t\tconsole.log('Meshes waiting', THREE.glTFLoaderDebug.debugPendingMeshes)\n\t\t}\n\t};\n\n\tMesh.prototype.attachToNode = function(loadContext, threeNode) {\n\t\t// Assumes that the geometry is complete\n\t\tvar that = this;\n\t\tthis.primitives.forEach(function(primitive) {\n\t\t\t/*if(!primitive.mesh) {\n\t\t\t\tprimitive.mesh = new THREE.Mesh(primitive.geometry, primitive.material);\n\t\t\t}*/\n\t\t\tvar material = primitive.material;\n\t\t\tvar materialParams = material.params;\n\t\t\tif (!(material instanceof THREE.Material)) {\n\t\t\t\tmaterial = createShaderMaterial(loadContext, material);\n\t\t\t}\n\n\t\t\tif (!that.skin) {\n\t\t\t\t// console.log (\"New mesh\")\n\t\t\t\tvar threeMesh = new THREE.Mesh(primitive.geometry.geometry, material);\n\t\t\t\tthreeMesh.castShadow = true;\n\t\t\t\tthreeNode.add(threeMesh);\n\n\t\t\t\tif (material instanceof THREE.ShaderMaterial) {\n\t\t\t\t\tvar glTFShader = new THREE.glTFShader(material, materialParams, threeMesh, loadContext.rootObj);\n\t\t\t\t\tTHREE.glTFShaders.add(glTFShader);\n\n\t\t\t\t}                \n\t\t\t}\n\t\t});\n\t};\n\n\t// Delayed-loaded material\n\tvar Material = function(params) {\n\t\tthis.params = params;\n\t};\n\t\n\tvar AnimationParameterContext = function(parameter, animation) {\n\t\tthis.parameter = parameter;\n\t\tthis.animation = animation;\n\t};\n\n\t// Animations\n\tvar Animation = function() {\n\n\t\t// create Three.js keyframe here\n\t\tthis.totalParameters = 0;\n\t\tthis.loadedParameters = 0;\n\t\tthis.parameters = {};\n\t\tthis.finishedLoading = false;\n\t\tthis.onload = null;\n\n\t};\n\n\tAnimation.prototype.constructor = Animation;\n\n\tAnimation.prototype.handleParameterLoaded = function(parameter) {\n\t\tthis.parameters[parameter.name] = parameter;\n\t\tthis.loadedParameters++;\n\t\tthis.checkFinished();\n\t};\n\t\n\tAnimation.prototype.checkFinished = function() {\n\t\tif(this.loadedParameters === this.totalParameters) {\n\t\t\t// Build animation\n\t\t\tthis.finishedLoading = true;\n\n\t\t\tif (this.onload) {\n\t\t\t\tthis.onload();\n\t\t\t}\n\t\t}\n\t};\n\t\n\tvar InverseBindMatricesContext = function(param, skin) {\n\t\tthis.parameter = param;\n\t\tthis.skin = skin;\n\t};\n\n\tvar ShaderContext = function(id, path) {\n\t\tthis.id = id;\n\t\tthis.uri = path;\n\t};\n\t\n\t// Resource management\n\n\tvar ResourceEntry = function(entryID, object, description) {\n\t\tthis.entryID = entryID;\n\t\tthis.object = object;\n\t\tthis.description = description;\n\t};\n\n\tvar Resources = function() {\n\t\tthis._entries = {};\n\t};\n\n\tResources.prototype.setEntry = function(entryID, object, description) {\n\t\tif (!entryID) {\n\t\t\tconsole.error(\"No EntryID provided, cannot store\", description);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._entries[entryID]) {\n\t\t\tconsole.warn(\"entry[\"+entryID+\"] is being overwritten\");\n\t\t}\n\t\n\t\tthis._entries[entryID] = new ResourceEntry(entryID, object, description );\n\t};\n\t\n\tResources.prototype.getEntry = function(entryID) {\n\t\treturn this._entries[entryID];\n\t};\n\n\tResources.prototype.clearEntries = function() {\n\t\tthis._entries = {};\n\t};\n\n\tLoadDelegate = function() {\n\t}\n\t\n\tLoadDelegate.prototype.loadCompleted = function(callback, obj) {\n\t\tcallback.call(Window, obj);\n\t}\n\t\n\t// Loader\n\n\tvar ThreeGLTFLoader = Object.create(glTFParser, {\n\n\t\tload: {\n\t\t\tenumerable: true,\n\t\t\tvalue: function(loadContext, options) {\n\t\t\t\tthis.loadContext = loadContext\n\t\t\t\tthis.resources = new Resources();\n\t\t\t\tthis.cameras = [];\n\t\t\t\tthis.lights = [];\n\t\t\t\tthis.animations = [];\n\t\t\t\tthis.joints = {};\n\t\t\t\tglTFParser.load.call(this, loadContext, options);\n\t\t\t}\n\t\t},\n\n\t\tcameras: {\n\t\t\tenumerable: true,\n\t\t\twritable: true,\n\t\t\tvalue : []\n\t\t},\n\n\t\tlights: {\n\t\t\tenumerable: true,\n\t\t\twritable: true,\n\t\t\tvalue : []\n\t\t},\n\t\t\n\t\tanimations: {\n\t\t\tenumerable: true,\n\t\t\twritable: true,\n\t\t\tvalue : []\n\t\t},\n\t\t\n\t\t// Implement WebGLTFLoader handlers\n\n\t\thandleBuffer: {\n\t\t\tvalue: function(entryID, description, loadContext) {\n\t\t\t\tthis.resources.setEntry(entryID, null, description);\n\t\t\t\tdescription.type = \"ArrayBuffer\";\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\thandleBufferView: {\n\t\t\tvalue: function(entryID, description, loadContext) {\n\t\t\t\tthis.resources.setEntry(entryID, null, description);\n\n\t\t\t\tvar buffer =  this.resources.getEntry(description.buffer);\n\t\t\t\tdescription.type = \"ArrayBufferView\";\n\n\t\t\t\tvar bufferViewEntry = this.resources.getEntry(entryID);\n\t\t\t\tbufferViewEntry.buffer = buffer;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\thandleShader: {\n\t\t\tvalue: function(entryID, description, loadContext) {\n\t\t\t\tthis.resources.setEntry(entryID, null, description);\n\t\t\t\tvar shaderRequest = {\n\t\t\t\t\t\tid : entryID,\n\t\t\t\t\t\turi : description.uri,\n\t\t\t\t};\n\n\t\t\t\tvar shaderContext = new ShaderContext(entryID, description.uri);\n\n\t\t\t\tloadContext.shadersRequested++;\n\t\t\t\tTHREE.GLTFLoaderUtils.getFile(shaderRequest, this.loadContext.shaderDelegate, shaderContext);\n\t\t\t\t\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\thandleProgram: {\n\t\t\tvalue: function(entryID, description, loadContext) {\n\t\t\t\tthis.resources.setEntry(entryID, null, description);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\thandleTechnique: {\n\t\t\tvalue: function(entryID, description, loadContext) {\n\t\t\t\tdescription.refCount = 0;\n\t\t\t\tthis.resources.setEntry(entryID, null, description);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\t\n\t\tcreateShaderParams : {\n\t\t\tvalue: function(materialId, values, params, programID, technique) {\n\t\t\t\tvar program = this.resources.getEntry(programID);\n\t\t\t\t\n\t\t\t\tparams.uniforms = {};\n\t\t\t\tparams.attributes = {};\n\t\t\t\tparams.program = program;\n\t\t\t\tparams.technique = technique;\n\t\t\t\tif (program) {\n\t\t\t\t\tparams.fragmentShader = program.description.fragmentShader;\n\t\t\t\t\tparams.vertexShader = program.description.vertexShader;\n\t\t\t\t\tfor (var uniform in technique.uniforms) {\n\t\t\t\t\t\tvar pname = technique.uniforms[uniform];\n\t\t\t\t\t\tvar shaderParam = technique.parameters[pname];\n\t\t\t\t\t\tvar ptype = shaderParam.type;\n\t\t\t\t\t\tvar pcount = shaderParam.count;\n\t\t\t\t\t\tvar value = values[pname];\n\t\t\t\t\t\tvar utype = \"\";\n\t\t\t\t\t\tvar uvalue;\n\t\t\t\t\t\tvar ulength;\n\n\t\t\t\t\t\t// THIS: for (n in WebGLRenderingContext) { z = WebGLRenderingContext[n]; idx[z] = n; }\n\t\t\t\t\t\t//console.log(\"shader uniform param type: \", ptype, \"-\", this.loadContext.idx[ptype])\n\n\t\t\t\t\t\t\n\t\t\t\t\t\tswitch (ptype) {\n\t\t\t\t\t\t\tcase WebGLRenderingContext.FLOAT :\n\t\t\t\t\t\t\t\tutype = \"f\";\n\t\t\t\t\t\t\t\tuvalue = shaderParam.value;\n\t\t\t\t\t\t\t\tif (pname == \"transparency\") {\n\t\t\t\t\t\t\t\t\tvar USE_A_ONE = true; // for now, hack because file format isn't telling us\n\t\t\t\t\t\t\t\t\tvar opacity =  USE_A_ONE ? value : (1.0 - value);\n\t\t\t\t\t\t\t\t\tuvalue = opacity;\n\t\t\t\t\t\t\t\t\tparams.transparent = true;                                    \n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase WebGLRenderingContext.FLOAT_VEC2 :\n\t\t\t\t\t\t\t\tutype = \"v2\";\n\t\t\t\t\t\t\t\tuvalue = new THREE.Vector2;\n\t\t\t\t\t\t\t\tif (shaderParam && shaderParam.value) {\n\t\t\t\t\t\t\t\t\tvar v2 = shaderParam.value;\n\t\t\t\t\t\t\t\t\tuvalue.fromArray(v2);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (value) {\n\t\t\t\t\t\t\t\t\tuvalue.fromArray(value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase WebGLRenderingContext.FLOAT_VEC3 :\n\t\t\t\t\t\t\t\tutype = \"v3\";\n\t\t\t\t\t\t\t\tuvalue = new THREE.Vector3;\n\t\t\t\t\t\t\t\tif (shaderParam && shaderParam.value) {\n\t\t\t\t\t\t\t\t\tvar v3 = shaderParam.value;\n\t\t\t\t\t\t\t\t\tuvalue.fromArray(v3);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (value) {\n\t\t\t\t\t\t\t\t\tuvalue.fromArray(value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase WebGLRenderingContext.FLOAT_VEC4 :\n\t\t\t\t\t\t\t\tutype = \"v4\";\n\t\t\t\t\t\t\t\tuvalue = new THREE.Vector4;\n\t\t\t\t\t\t\t\tif (shaderParam && shaderParam.value) {\n\t\t\t\t\t\t\t\t\tvar v4 = shaderParam.value;\n\t\t\t\t\t\t\t\t\tuvalue.fromArray(v4);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (value) {\n\t\t\t\t\t\t\t\t\tuvalue.fromArray(value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase WebGLRenderingContext.FLOAT_MAT2 :\n\t\t\t\t\t\t\t\t// what to do?\n\t\t\t\t\t\t\t\tconsole.log(\"Warning: FLOAT_MAT2\");\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase WebGLRenderingContext.FLOAT_MAT3 :\n\t\t\t\t\t\t\t\tutype = \"m3\";\n\t\t\t\t\t\t\t\tuvalue = new THREE.Matrix3;\n\t\t\t\t\t\t\t\tif (shaderParam && shaderParam.value) {\n\t\t\t\t\t\t\t\t\tvar m3 = shaderParam.value;\n\t\t\t\t\t\t\t\t\tuvalue.fromArray(m3);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (value) {\n\t\t\t\t\t\t\t\t\tuvalue.fromArray(value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tcase WebGLRenderingContext.FLOAT_MAT4 :\n\t\t\t\t\t\t\t\tif (pcount !== undefined) {\n\t\t\t\t\t\t\t\t\tutype = \"m4v\";\n\t\t\t\t\t\t\t\t\tuvalue = new Array(pcount);\n\t\t\t\t\t\t\t\t\tfor (var mi = 0; mi < pcount; mi++) {\n\t\t\t\t\t\t\t\t\t\tuvalue[mi] = new THREE.Matrix4;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tulength = pcount;\n\n\t\t\t\t\t\t\t\t\tif (shaderParam && shaderParam.value) {\n\t\t\t\t\t\t\t\t\t\tvar m4v = shaderParam.value;\n\t\t\t\t\t\t\t\t\t\tuvalue.fromArray(m4v);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (value) {\n\t\t\t\t\t\t\t\t\t\tuvalue.fromArray(value);\n\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\telse {\n\t\t\t\t\t\t\t\t\tutype = \"m4\";\n\t\t\t\t\t\t\t\t\tuvalue = new THREE.Matrix4;\n\n\t\t\t\t\t\t\t\t\tif (shaderParam && shaderParam.value) {\n\t\t\t\t\t\t\t\t\t\tvar m4 = shaderParam.value;\n\t\t\t\t\t\t\t\t\t\tuvalue.fromArray(m4);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tif (value) {\n\t\t\t\t\t\t\t\t\t\tuvalue.fromArray(value);\n\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\tbreak;\n\t\t\t\t\t\t\tcase WebGLRenderingContext.SAMPLER_2D :\n\t\t\t\t\t\t\t\tutype = \"t\";\n\t\t\t\t\t\t\t\tuvalue = value ? CreateTexture(this.resources, value) : null;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\tdefault :\n\t\t\t\t\t\t\t\tthrow new Error(\"Unknown shader uniform param type: \" + ptype + \" - \" + loadContext.idx[ptype]);\n\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tvar udecl = { type : utype, value : uvalue, length : ulength };\n\n\t\t\t\t\t\tparams.uniforms[uniform] = udecl;\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (var attribute in technique.attributes) {\n\t\t\t\t\t\tvar pname = technique.attributes[attribute];\n\t\t\t\t\t\tvar param = technique.parameters[pname];\n\t\t\t\t\t\tvar atype = param.type;\n\t\t\t\t\t\tvar semantic = param.semantic;\n\t\t\t\t\t\tvar adecl = { type : atype, semantic : semantic };\n\n\t\t\t\t\t\tparams.attributes[attribute] = adecl;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\n\t\tthreeJSMaterialType : {\n\t\t\tvalue: function(materialId, material, params) {\n\n\t\t\t\tvar extensions = material.extensions;\n\t\t\t\tvar khr_material = extensions ? extensions.KHR_materials_common : null;\n\n\t\t\t\tvar materialType = null;\n\t\t\t\tvar values;\n\n\t\t\t\tif (khr_material) {\n\n\t\t\t\t\tswitch (khr_material.technique)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 'BLINN' :\n\t\t\t\t\t\tcase 'PHONG' :\n\t\t\t\t\t\t\tmaterialType = THREE.MeshPhongMaterial;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'LAMBERT' :\n\t\t\t\t\t\t\tmaterialType = THREE.MeshLambertMaterial;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\tcase 'CONSTANT' :\n\t\t\t\t\t\tdefault :\n\t\t\t\t\t\t\tmaterialType = THREE.MeshBasicMaterial;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (khr_material.doubleSided)\n\t\t\t\t\t{\n\t\t\t\t\t\tparams.side = THREE.DoubleSide;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (khr_material.transparent)\n\t\t\t\t\t{\n\t\t\t\t\t\tparams.transparent = true;\n\t\t\t\t\t}\n\n\t\t\t\t\tvalues = {};\n\t\t\t\t\tfor (prop in khr_material.values) {\n\t\t\t\t\t\tvalues[prop] = khr_material.values[prop];\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tvar technique = material.technique ? \n\t\t\t\t\t\tthis.resources.getEntry(material.technique) :\n\t\t\t\t\t\tnull;\n\n\t\t\t\t\tvalues = material.values;\n\t\t\t\t\tvar description = technique.description;\n\n\t\t\t\t\tif (++description.refCount > 1) {\n\t\t\t\t\t\t//console.log(\"refcount\", description.refCount);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tvar programID = description.program;\n\t\t\t\t\tthis.createShaderParams(materialId, values, params, programID, description);\n\t\t\t\t\t\n\t\t\t\t\tvar loadshaders = true;\n\t\t\t\t\t\n\t\t\t\t\tif (loadshaders) {\n\t\t\t\t\t\tmaterialType = Material;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (values.diffuse && typeof(values.diffuse) == 'string') {\n\t\t\t\t\tparams.map = CreateTexture(this.resources, values.diffuse);\n\t\t\t\t}\n\t\t\t\tif (values.reflective && typeof(values.reflective) == 'string') {\n\t\t\t\t\tparams.envMap = CreateTexture(this.resources, values.reflective);\n\t\t\t\t}\n\t\t \n\t\t\t\tvar shininess = values.shininesss || values.shininess; // N.B.: typo in converter!\n\t\t\t\tif (shininess)\n\t\t\t\t{\n\t\t\t\t\tshininess = shininess;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar diffuseColor = null;\n\t\t\t\tif (!params.map) {\n\t\t\t\t\tdiffuseColor = values.diffuse;\n\t\t\t\t}\n\t\t\t\tvar opacity = 1.0;\n\t\t\t\tif (values.hasOwnProperty(\"transparency\"))\n\t\t\t\t{\n\t\t\t\t\tvar USE_A_ONE = true; // for now, hack because file format isn't telling us\n\t\t\t\t\topacity =  USE_A_ONE ? values.transparency : (1.0 - values.transparency);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// if (diffuseColor) diffuseColor = [0, 1, 0];\n\t\t\t\t\t\t\t\t\t\n\t\t\t\tparams.color = RgbArraytoHex(diffuseColor);\n\t\t\t\tparams.opacity = opacity;\n\t\t\t\tparams.transparent = opacity < 1.0;\n\t\t\t\t// hack hack hack\n\t\t\t\tif (params.map && params.map.sourceFile.toLowerCase().indexOf(\".png\") != -1)\n\t\t\t\t\tparams.transparent = true;\n\t\t\t\t\n\t\t\t\tif (!(shininess === undefined))\n\t\t\t\t{\n\t\t\t\t\tparams.shininess = Math.max( shininess, 1e-4 );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tdelete params.ambient;\n\t\t\t\tif (!(values.ambient === undefined) && !(typeof(values.ambient) == 'string'))\n\t\t\t\t{\n\t\t\t\t\t//params.ambient = RgbArraytoHex(values.ambient);\n\t\t\t\t}\n\n\t\t\t\tif (!(values.emission === undefined))\n\t\t\t\t{\n\t\t\t\t\tparams.emissive = RgbArraytoHex(values.emission);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (!(values.specular === undefined))\n\t\t\t\t{\n\t\t\t\t\tparams.specular = RgbArraytoHex(values.specular);\n\t\t\t\t}\n\n\t\t\t\treturn materialType;\n\t\t\t\t\n\t\t\t}\n\t\t},\n\t\t\n\t\thandleMaterial: {\n\t\t\tvalue: function(entryID, description, loadContext) {\n\t\t\t\tvar params = {};\n\t\t\t\t\n\t\t\t\tvar materialType = this.threeJSMaterialType(entryID, description, params);\n\n\t\t\t\tvar material = new materialType(params);\n\t\t\t\t\n\t\t\t\tthis.resources.setEntry(entryID, material, description);\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\thandleMesh: {\n\t\t\tvalue: function(entryID, description, loadContext) {\n\t\t\t\tvar self = this\n\t\t\t\tvar mesh = new Mesh();\n\t\t\t\tthis.resources.setEntry(entryID, mesh, description);\n\t\t\t\tvar primitivesDescription = description.primitives;\n\t\t\t\tif (!primitivesDescription) {\n\t\t\t\t\t//FIXME: not implemented in delegate\n\t\t\t\t\tconsole.log(\"MISSING_PRIMITIVES for mesh:\"+ entryID);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tfor (var i = 0 ; i < primitivesDescription.length ; i++) {\n\t\t\t\t\tvar primitiveDescription = primitivesDescription[i];\n\t\t\t\t\t\n\t\t\t\t\tif (primitiveDescription.mode === WebGLRenderingContext.TRIANGLES) {\n\n\t\t\t\t\t\tvar geometry = new ClassicGeometry();\n\t\t\t\t\t\tvar materialEntry = this.resources.getEntry(primitiveDescription.material);\n\n\t\t\t\t\t\tmesh.addPrimitive(geometry, materialEntry.object);\n\n\t\t\t\t\t\tvar allAttributes = Object.keys(primitiveDescription.attributes);\n\n\t\t\t\t\t\t// count them first, async issues otherwise\n\t\t\t\t\t\tallAttributes.forEach( function(semantic) {\n\t\t\t\t\t\t\tgeometry.totalAttributes++;\n\t\t\t\t\t\t}, this);\n\n\t\t\t\t\t\tvar indices = this.resources.getEntry(primitiveDescription.indices);\n\t\t\t\t\t\tvar bufferEntry = this.resources.getEntry(indices.description.bufferView);\n\t\t\t\t\t\tvar indicesObject = {\n\t\t\t\t\t\t\t\tbufferView : bufferEntry,\n\t\t\t\t\t\t\t\tbyteOffset : indices.description.byteOffset,\n\t\t\t\t\t\t\t\tcount : indices.description.count,\n\t\t\t\t\t\t\t\tid : indices.entryID,\n\t\t\t\t\t\t\t\tcomponentType : indices.description.componentType,\n\t\t\t\t\t\t\t\ttype : indices.description.type\n\t\t\t\t\t\t};\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar indicesContext = new IndicesContext(indicesObject, geometry);\n\t\t\t\t\t\tvar loaddata = { \n\t\t\t\t\t\t\tindicesObject : indicesObject,\n\t\t\t\t\t\t\tindicesDelegate : this.loadContext.indicesDelegate,\n\t\t\t\t\t\t\tindicesContext : indicesContext\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tthis.loadContext.scheduleLoad(function(data) {\n\t\t\t\t\t\t\tvar alreadyProcessedIndices = \n\t\t\t\t\t\t\t\tTHREE.GLTFLoaderUtils.getBuffer(data.indicesObject, \n\t\t\t\t\t\t\t\t\tdata.indicesDelegate, data.indicesContext);\n\n\t\t\t\t\t\t\tif (alreadyProcessedIndices) {\n\t\t\t\t\t\t\t\tdata.indicesDelegate.resourceAvailable(\n\t\t\t\t\t\t\t\t\talreadyProcessedIndices, data.indicesContext);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}, loaddata);\n\n\t\t\t\t\t\t// Load Vertex Attributes\n\t\t\t\t\t\tallAttributes.forEach( function(semantic) {\n\n\t\t\t\t\t\t\tvar attribute;\n\t\t\t\t\t\t\tvar attributeID = primitiveDescription.attributes[semantic];\n\t\t\t\t\t\t\tvar attributeEntry = this.resources.getEntry(attributeID);\n\t\t\t\t\t\t\tif (!attributeEntry) {\n\t\t\t\t\t\t\t\t//let's just use an anonymous object for the attribute\n\t\t\t\t\t\t\t\tattribute = description.attributes[attributeID];\n\t\t\t\t\t\t\t\tattribute.id = attributeID;\n\t\t\t\t\t\t\t\tthis.resources.setEntry(attributeID, attribute, attribute);\n\t\t\t\n\t\t\t\t\t\t\t\tvar bufferEntry = this.resources.getEntry(attribute.bufferView);\n\t\t\t\t\t\t\t\tattributeEntry = this.resources.getEntry(attributeID);\n\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tattribute = attributeEntry.object;\n\t\t\t\t\t\t\t\tattribute.id = attributeID;\n\t\t\t\t\t\t\t\tvar bufferEntry = this.resources.getEntry(attribute.bufferView);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar attributeObject = {\n\t\t\t\t\t\t\t\t\tbufferView : bufferEntry,\n\t\t\t\t\t\t\t\t\tbyteOffset : attribute.byteOffset,\n\t\t\t\t\t\t\t\t\tbyteStride : attribute.byteStride,\n\t\t\t\t\t\t\t\t\tcount : attribute.count,\n\t\t\t\t\t\t\t\t\tmax : attribute.max,\n\t\t\t\t\t\t\t\t\tmin : attribute.min,\n\t\t\t\t\t\t\t\t\tcomponentType : attribute.componentType,\n\t\t\t\t\t\t\t\t\ttype : attribute.type,\n\t\t\t\t\t\t\t\t\tid : attributeID             \n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tvar attribContext = new VertexAttributeContext(attributeObject, semantic, geometry);\n\n\t\t\t\t\t\t\tvar loaddata = { \n\t\t\t\t\t\t\t\tattributeObject : attributeObject,\n\t\t\t\t\t\t\t\tvertexAttributeDelegate : this.loadContext.vertexAttributeDelegate,\n\t\t\t\t\t\t\t\tattribContext : attribContext\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\tself.loadContext.scheduleLoad(function(data) {\n\t\t\t\t\t\t\t\tvar alreadyProcessedAttribute = \n\t\t\t\t\t\t\t\t\tTHREE.GLTFLoaderUtils.getBuffer(data.attributeObject, \n\t\t\t\t\t\t\t\t\t\tdata.vertexAttributeDelegate, data.attribContext);\n\n\t\t\t\t\t\t\t\tif (alreadyProcessedAttribute) {\n\t\t\t\t\t\t\t\t\tdata.vertexAttributeDelegate.resourceAvailable(\n\t\t\t\t\t\t\t\t\t\talreadyProcessedAttribute, data.attribContext);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}, loaddata);\n\n\n\t\t\t\t\t\t}, this);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\thandleCamera: {\n\t\t\tvalue: function(entryID, description, loadContext) {\n\t\t\t\tvar camera;\n\t\t\t\tif (description.type == \"perspective\")\n\t\t\t\t{\n\t\t\t\t\tvar znear = description.perspective.znear;\n\t\t\t\t\tvar zfar = description.perspective.zfar;\n\t\t\t\t\tvar yfov = description.perspective.yfov;                    \n\t\t\t\t\tvar xfov = description.perspective.xfov;\n\t\t\t\t\tvar aspect_ratio = description.perspective.aspect_ratio;\n\n\t\t\t\t\tif (!aspect_ratio)\n\t\t\t\t\t\taspect_ratio = 1; \n\n\t\t\t\t\tif (xfov === undefined) {\n\t\t\t\t\t\tif (yfov)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// According to COLLADA spec...\n\t\t\t\t\t\t\t// aspect_ratio = xfov / yfov\n\t\t\t\t\t\t\txfov = yfov * aspect_ratio;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (yfov === undefined)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (xfov)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// According to COLLADA spec...\n\t\t\t\t\t\t\t// aspect_ratio = xfov / yfov\n\t\t\t\t\t\t\tyfov = xfov / aspect_ratio;\n\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\n\t\t\t\t\tif (xfov)\n\t\t\t\t\t{\n\t\t\t\t\t\txfov = THREE.Math.radToDeg(xfov);\n\n\t\t\t\t\t\tcamera = new THREE.PerspectiveCamera(xfov, aspect_ratio, znear, zfar);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tcamera = new THREE.OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, znear, zfar );\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (camera)\n\t\t\t\t{\n\t\t\t\t\tthis.resources.setEntry(entryID, camera, description);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\thandleLight: {\n\t\t\tvalue: function(entryID, description, loadContext) {\n\n\t\t\t\tvar light = null;\n\t\t\t\tvar type = description.type;\n\t\t\t\tif (type && description[type])\n\t\t\t\t{\n\t\t\t\t\tvar lparams = description[type];\n\t\t\t\t\tvar color = RgbArraytoHex(lparams.color);\n\t\t\t\t\t\n\t\t\t\t\tswitch (type) {\n\t\t\t\t\t\tcase \"directional\" :\n\t\t\t\t\t\t\tlight = new THREE.DirectionalLight(color);\n\t\t\t\t\t\t\tlight.position.set(0, 0, 1);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\t\tcase \"point\" :\n\t\t\t\t\t\t\tlight = new THREE.PointLight(color);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\t\tcase \"spot \" :\n\t\t\t\t\t\t\tlight = new THREE.SpotLight(color);\n\t\t\t\t\t\t\tlight.position.set(0, 0, 1);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\n\t\t\t\t\t\tcase \"ambient\" : \n\t\t\t\t\t\t\tlight = new THREE.AmbientLight(color);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (light)\n\t\t\t\t{\n\t\t\t\t\tthis.resources.setEntry(entryID, light, description);   \n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\taddPendingMesh: {\n\t\t\tvalue: function(mesh, threeNode) {\n\t\t\t\tthis.loadContext.pendingMeshes.push({\n\t\t\t\t\tmesh: mesh,\n\t\t\t\t\tnode: threeNode\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t\n\t\thandleNode: {\n\t\t\tvalue: function(entryID, description, loadContext) {\n\n\t\t\t\tvar threeNode = null;\n\t\t\t\tif (description.jointName) {\n\t\t\t\t\tthreeNode = new THREE.Bone();\n\t\t\t\t\tthreeNode.jointName = description.jointName;\n\t\t\t\t\tthis.joints[description.jointName] = entryID;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthreeNode = new THREE.Object3D();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthreeNode.name = description.name;\n\t\t\t\tthreeNode.glTFID = entryID;\n\t\t\t\tthreeNode.glTF = description;\n\n\t\t\t\tthis.resources.setEntry(entryID, threeNode, description);\n\n\t\t\t\tvar m = description.matrix;\n\t\t\t\tif(m) {\n\t\t\t\t\tthreeNode.matrixAutoUpdate = false;\n\t\t\t\t\tthreeNode.applyMatrix(new THREE.Matrix4().set(\n\t\t\t\t\t\tm[0],  m[4],  m[8],  m[12],\n\t\t\t\t\t\tm[1],  m[5],  m[9],  m[13],\n\t\t\t\t\t\tm[2],  m[6],  m[10], m[14],\n\t\t\t\t\t\tm[3],  m[7],  m[11], m[15]\n\t\t\t\t\t));                    \n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tvar t = description.translation;\n\t\t\t\t\tvar r = description.rotation;\n\t\t\t\t\tvar s = description.scale;\n\t\t\t\t\t\n\t\t\t\t\tvar position = t ? new THREE.Vector3(t[0], t[1], t[2]) :\n\t\t\t\t\t\tnew THREE.Vector3;\n\n\t\t\t\t\tvar rotation = r ? new THREE.Quaternion(r[0], r[1], r[2], r[3]) :\n\t\t\t\t\t\tnew THREE.Quaternion;\n\t\t\t\t\tvar scale = s ? new THREE.Vector3(s[0], s[1], s[2]) :\n\t\t\t\t\t\tnew THREE.Vector3(1, 1, 1);\n\t\t\t\t\t\n\t\t\t\t\tvar matrix = new THREE.Matrix4;\n\t\t\t\t\tmatrix.compose(position, rotation, scale);\n\t\t\t\t\tthreeNode.matrixAutoUpdate = false;\n\t\t\t\t\tthreeNode.applyMatrix(matrix);                    \n\t\t\t\t}\n\n\t\t\t\tif (description.meshes) {\n\t\t\t\t\tdescription.meshInstances = {};\n\t\t\t\t\tvar skinEntry;\n\t\t\t\t\tif (description.skin) {\n\t\t\t\t\t\tskinEntry =  this.resources.getEntry(description.skin);\n\t\t\t\t\t}\n\n\t\t\t\t\tdescription.meshes.forEach( function(meshID) {\n\t\t\t\t\t\tvar meshEntry = this.resources.getEntry(meshID);\n\t\t\t\t\t\tthis.loadContext.meshesRequested++;\n\n\t\t\t\t\t\tvar self = this\n\t\t\t\t\t\tmeshEntry.object.onComplete(function(mesh) {\n\t\t\t\t\t\t\tself.addPendingMesh(mesh, threeNode);\n\t\t\t\t\t\t\tdescription.meshInstances[meshID] = meshEntry.object;\n\t\t\t\t\t\t\tif (skinEntry) {\n\t\t\t\t\t\t\t\tmesh.skin = skinEntry;\n\t\t\t\t\t\t\t\tdescription.instanceSkin = skinEntry.object;                        \n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tself.loadContext.meshesLoaded++;\n\t\t\t\t\t\t\tself.loadContext.checkComplete(self);\n\t\t\t\t\t\t});\n\t\t\t\t\t}, this);\n\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\tif (description.camera) {\n\t\t\t\t\tvar cameraEntry = this.resources.getEntry(description.camera);\n\t\t\t\t\tif (cameraEntry) {\n\t\t\t\t\t\tthreeNode.add(cameraEntry.object);\n\t\t\t\t\t\tthis.cameras.push(cameraEntry.object);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (description.extensions && description.extensions.KHR_materials_common \n\t\t\t\t\t\t&& description.extensions.KHR_materials_common.light) {\n\t\t\t\t\tvar lightID = description.extensions.KHR_materials_common.light;\n\t\t\t\t\tvar lightEntry = this.resources.getEntry(lightID);\n\t\t\t\t\tif (lightEntry) {\n\t\t\t\t\t\tthreeNode.add(lightEntry.object);\n\t\t\t\t\t\tthis.lights.push(lightEntry.object);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\thandleExtension: {\n\t\t\tvalue: function(entryID, description, loadContext) {\n\n\t\t\t\t// console.log(\"Extension\", entryID, description);\n\n\t\t\t\tswitch (entryID) {\n\t\t\t\t\tcase 'KHR_materials_common' :\n\t\t\t\t\t\tvar lights = description.lights;\n\t\t\t\t\t\tfor (lightID in lights) {\n\t\t\t\t\t\t\tvar light = lights[lightID];\n\t\t\t\t\t\t\tthis.handleLight(lightID, light);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;                    \n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\t\t\n\t\tbuildNodeHierarchy: {\n\t\t\tvalue: function(nodeEntryId, parentThreeNode) {\n\t\t\t\tvar nodeEntry = this.resources.getEntry(nodeEntryId);\n\t\t\t\tvar threeNode = nodeEntry.object;\n\t\t\t\tparentThreeNode.add(threeNode);\n\n\t\t\t\tvar children = nodeEntry.description.children;\n\t\t\t\tif (children) {\n\t\t\t\t\tchildren.forEach( function(childID) {\n\t\t\t\t\t\tthis.buildNodeHierarchy(childID, threeNode);\n\t\t\t\t\t}, this);\n\t\t\t\t}\n\n\t\t\t\treturn threeNode;\n\t\t\t}\n\t\t},\n\n\t\tbuildSkin: {\n\t\t\tvalue: function(node) {\n\t\t\t\n\t\t\t\tvar glTF = node.glTF;\n\t\t\t\tvar skin = glTF.instanceSkin;\n\t\t\t\tvar skeletons = glTF.skeletons;\n\t\t\t\tif (skin) {\n\t\t\t\t\tskeletons.forEach(function(skeleton) {\n\t\t\t\t\t\tvar nodeEntry = this.resources.getEntry(skeleton);\n\t\t\t\t\t\tif (nodeEntry) {\n\n\t\t\t\t\t\t\tvar rootSkeleton = nodeEntry.object;\n\t\t\t\t\t\t\tnode.add(rootSkeleton);\n\n\t\t\t\t\t\t\tvar dobones = true;\n\n\t\t\t\t\t\t\tfor (meshID in glTF.meshInstances) {\n\t\t\t\t\t\t\t\tvar mesh = glTF.meshInstances[meshID];\n\t\t\t\t\t\t\t\tmesh.primitives.forEach(function(primitive) {\n\n\t\t\t\t\t\t\t\t\tvar material = primitive.material;\n\t\t\t\t\t\t\t\t\tvar materialParams = material.params;\n\t\t\t\t\t\t\t\t\tif (!(material instanceof THREE.Material)) {\n\t\t\t\t\t\t\t\t\t\tmaterial = createShaderMaterial(this.loadContext, material);\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tvar geometry = primitive.geometry.geometry;\n\t\t\t\t\t\t\t\t\tvar boneInverses = [];\n\t\t\t\t\t\t\t\t\tif (dobones) {\n\t\t\t\t\t\t\t\t\t\tmaterial.skinning = true;\n\t\t\t\t\t\t\t\t\t\tvar jointNames = skin.jointNames;\n\n\t\t\t\t\t\t\t\t\t\tgeometry.bones = []\n\n\t\t\t\t\t\t\t\t\t\tvar i, len = jointNames.length\n\t\t\t\t\t\t\t\t\t\tvar joints = []\n\t\t\t\t\t\t\t\t\t\tfor (i = 0; i < len; ++i) {\n\t\t\t\t\t\t\t\t\t\t\tvar jointName = jointNames[i];\n\t\t\t\t\t\t\t\t\t\t\tvar nodeForJoint = this.joints[jointName];\n\t\t\t\t\t\t\t\t\t\t\tvar joint = this.resources.getEntry(nodeForJoint).object;\n\t\t\t\t\t\t\t\t\t\t\tif (joint) {\n\t\t\t\t\t\t\t\t\t\t\t\tjoints.push(joint)\n\n\t\t\t\t\t\t\t\t\t\t\t\tvar parentIdx = -1\n\n\t\t\t\t\t\t\t\t\t\t\t\tif (joint.parent && joint.parent instanceof THREE.Bone) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tparentIdx = joints.indexOf(joint.parent)\n\t\t\t\t\t\t\t\t\t\t\t\t\tconsole.log(joint.glTFID, joints.length - 1, 'has parent', parentIdx, joints[parentIdx].glTFID)\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tvar m = skin.inverseBindMatrices;\n\t\t\t\t\t\t\t\t\t\t\t\tvar mat = new THREE.Matrix4().set(\n\t\t\t\t\t\t\t\t\t\t\t\t\tm[i * 16 + 0],  m[i * 16 + 4],  m[i * 16 + 8],  m[i * 16 + 12],\n\t\t\t\t\t\t\t\t\t\t\t\t\tm[i * 16 + 1],  m[i * 16 + 5],  m[i * 16 + 9],  m[i * 16 + 13],\n\t\t\t\t\t\t\t\t\t\t\t\t\tm[i * 16 + 2],  m[i * 16 + 6],  m[i * 16 + 10], m[i * 16 + 14],\n\t\t\t\t\t\t\t\t\t\t\t\t\tm[i * 16 + 3],  m[i * 16 + 7],  m[i * 16 + 11], m[i * 16 + 15]);\n\t\t\t\t\t\t\t\t\t\t\t\tboneInverses.push(mat);\n\n\t\t\t\t\t\t\t\t\t\t\t\tvar gbone = {\n\t\t\t\t\t\t\t\t\t\t\t\t\tname: joint.glTFID,\n\t\t\t\t\t\t\t\t\t\t\t\t\tpos: [joint.position.x, joint.position.y, joint.position.z],\n\t\t\t\t\t\t\t\t\t\t\t\t\trotq: [joint.quaternion.x, joint.quaternion.y, joint.quaternion.z, joint.quaternion.w],\n\t\t\t\t\t\t\t\t\t\t\t\t\tscl: [joint.scale.x, joint.scale.y, joint.scale.z],\n\t\t\t\t\t\t\t\t\t\t\t\t\tparent: parentIdx\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tgeometry.bones.push(gbone)\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tvar threeMesh = new THREE.SkinnedMesh(geometry, material, false, skin.bindShapeMatrix);\n\n\t\t\t\t\t\t\t\t\t// we do need to override the boneinverses. Three gets these wrong.\n\t\t\t\t\t\t\t\t\tthreeMesh.skeleton.boneInverses = []\n\t\t\t\t\t\t\t\t\tfor (var i = 0; i < boneInverses.length; ++i) {\n\t\t\t\t\t\t\t\t\t\tthreeMesh.skeleton.boneInverses.push(boneInverses[i])\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (threeMesh) {\n\t\t\t\t\t\t\t\t\t\tthreeMesh.castShadow = true;\n\t\t\t\t\t\t\t\t\t\tnode.add(threeMesh);\n\n\t\t\t\t\t\t\t\t\t\tif (material instanceof THREE.ShaderMaterial) {\n\t\t\t\t\t\t\t\t\t\t\tvar glTFShader = new THREE.glTFShader(material, materialParams, threeMesh, this.loadContext.rootObj);\n\t\t\t\t\t\t\t\t\t\t\tTHREE.glTFShaders.add(glTFShader);\n\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}, this);                               \n\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\n\t\t\t\t\t}, this);\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t \n\t\tbuildSkins: {\n\t\t\tvalue: function(node) {\n\n\t\t\t\tif (node.glTF && node.glTF.instanceSkin)\n\t\t\t\t\tthis.buildSkin(node);\n\t\t\t\t\n\t\t\t\tvar children = node.children;\n\t\t\t\tif (children) {\n\t\t\t\t\tchildren.forEach( function(child) {\n\t\t\t\t\t\tthis.buildSkins(child);\n\t\t\t\t\t}, this);\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\n\t\tcreateMeshAnimations : {\n\t\t\tvalue : function(root) {\n\t\t\t\t\tthis.buildSkins(root);\n\t\t\t\t}\n\t\t},        \n\n\t\thandleScene: {\n\t\t\tvalue: function(entryID, description, loadContext) {\n\n\t\t\t\tif (!description.nodes) {\n\t\t\t\t\tconsole.log(\"ERROR: invalid file required nodes property is missing from scene\");\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tdescription.nodes.forEach( function(nodeUID) {\n\t\t\t\t\tthis.buildNodeHierarchy(nodeUID, this.loadContext.rootObj);\n\t\t\t\t}, this);\n\n\t\t\t\tif (this.delegate) {\n\t\t\t\t\tthis.delegate.loadCompleted(this.loadContext.onSceneLoadedCallback, this.loadContext.rootObj);\n\t\t\t\t}\n\n\t\t\t\tthis.loadContext.loadAllAssets();\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\thandleImage: {\n\t\t\tvalue: function(entryID, description, loadContext) {\n\t\t\t\tthis.resources.setEntry(entryID, null, description);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\t\t\n\t\taddNodeAnimationChannel : {\n\t\t\tvalue : function(name, channel, interp) {\n\t\t\t\tif (!this.nodeAnimationChannels)\n\t\t\t\t\tthis.nodeAnimationChannels = {};\n\t\t\t\t\n\t\t\t\tif (!this.nodeAnimationChannels[name]) {\n\t\t\t\t\tthis.nodeAnimationChannels[name] = [];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.nodeAnimationChannels[name].push(interp);\n\t\t\t},\n\t\t},\n\t\t\n\t\tcreateAnimations : {\n\t\t\tvalue : function() {\n\t\t\t\tfor (var name in this.nodeAnimationChannels) {\n\t\t\t\t\tvar nodeAnimationChannels = this.nodeAnimationChannels[name];\n\t\t\t\t\tvar i, len = nodeAnimationChannels.length;\n\t\t\t\t\t//console.log(\" animation channels for node \" + name);\n\t\t\t\t\t//for (i = 0; i < len; i++) {\n\t\t\t\t\t//  console.log(nodeAnimationChannels[i]);\n\t\t\t\t\t//}\n\t\t\t\t\tvar anim = new THREE.glTFAnimation(nodeAnimationChannels);\n\t\t\t\t\tanim.name = \"animation_\" + name;\n\t\t\t\t\tthis.animations.push(anim);                     \n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\tbindAnimations : {\n\t\t\tvalue: function(rootNode) {\n\t\t\t\tfor (var name in this.nodeAnimationChannels) {\n\t\t\t\t\tvar animChannel = this.nodeAnimationChannels[name]\n\t\t\t\t\tfor (var i = 0; i < animChannel.length; ++i) {\n\n\t\t\t\t\t\tfunction findTarget(id) {\n\t\t\t\t\t\t\tvar target = undefined\n\t\t\t\t\t\t\trootNode.traverse(function(n) {\n\t\t\t\t\t\t\t\tif (target) {\n\t\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (n instanceof THREE.SkinnedMesh) {\n\t\t\t\t\t\t\t\t\tfor (var i = 0; target === undefined && i < n.skeleton.bones.length; ++i) {\n\t\t\t\t\t\t\t\t\t\tif (n.skeleton.bones[i].name === id) {\n\t\t\t\t\t\t\t\t\t\t\ttarget = n.skeleton.bones[i]\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tif (!target) {\n\t\t\t\t\t\t\t\trootNode.traverse(function (n) {\n\t\t\t\t\t\t\t\t\tif (target) {\n\t\t\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tif (n.glTFID === id) {\n\t\t\t\t\t\t\t\t\t\ttarget = n\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\n\t\t\t\t\t\t\treturn target\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar target = findTarget(animChannel[i].targetID)\n\t\t\t\t\t\tif (!target) {\n\t\t\t\t\t\t\tconsole.error('glTFLoader.bindAnimations - cannot find target for', animChannel[i].targetID)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tanimChannel[i].target = target\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t\n\t\tbuildAnimation: {\n\t\t\tvalue : function(animation, rootNode) {\n\t\t\t\n\t\t\t\tvar i, len = animation.channels.length;\n\t\t\t\tfor (i = 0; i < len; i++) {\n\t\t\t\t\t\n\t\t\t\t\tvar channel = animation.channels[i];\n\t\t\t\t\tvar sampler = animation.samplers[channel.sampler];\n\t\t\t\t\tif (sampler) {\n\t\n\t\t\t\t\t\tvar input = animation.parameters[sampler.input];\n\t\t\t\t\t\tif (input && input.data) {\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tvar output = animation.parameters[sampler.output];\n\t\t\t\t\t\t\tif (output && output.data) {\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tvar target = channel.target;\n\n\t\t\t\t\t\t\t\tvar path = target.path;\n\n\t\t\t\t\t\t\t\tvar interp = {\n\t\t\t\t\t\t\t\t\t\tkeys : input.data,\n\t\t\t\t\t\t\t\t\t\tvalues : output.data,\n\t\t\t\t\t\t\t\t\t\tcount : input.count,\n\t\t\t\t\t\t\t\t\t\ttargetID: target.id,\n\t\t\t\t\t\t\t\t\t\t//target : targetObject,\n\t\t\t\t\t\t\t\t\t\tpath : path,\n\t\t\t\t\t\t\t\t\t\ttype : sampler.interpolation\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tthis.addNodeAnimationChannel(target.id, channel, interp);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}               \n\t\t\t}\n\t\t},\n\t\t\n\t\thandleAnimation: {\n\t\t\tvalue: function(entryID, description, loadContext) {\n\n\t\t\t\tvar self = this;\n\t\t\t\tthis.loadContext.animationsRequested++;\n\t\t\t\tvar animation = new Animation();\n\t\t\t\tanimation.name = entryID;\n\t\t\t\tanimation.onload = function() {\n\t\t\t\t\t// self.buildAnimation(animation);\n\t\t\t\t\tself.loadContext.animationsLoaded++;\n\t\t\t\t\tself.loadContext.animations.push(animation);\n\t\t\t\t\tself.loadContext.checkComplete(self);\n\t\t\t\t};              \n\t\t\t\t\n\t\t\t\tanimation.channels = description.channels;\n\t\t\t\tanimation.samplers = description.samplers;\n\t\t\t\tthis.resources.setEntry(entryID, animation, description);\n\t\t\t\tvar parameters = description.parameters;\n\t\t\t\tif (!parameters) {\n\t\t\t\t\t//FIXME: not implemented in delegate\n\t\t\t\t\tconsole.log(\"MISSING_PARAMETERS for animation:\"+ entryID);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\n\t\t\t\t// Load parameter buffers\n\t\t\t\tvar params = Object.keys(parameters);\n\t\t\t\tparams.forEach( function(param) {\n\n\t\t\t\t\t// async help\n\t\t\t\t\tanimation.totalParameters++;\n\n\t\t\t\t}, this);    \n\t\t\t\t\t\t\t\n\t\t\t\tvar params = Object.keys(parameters);\n\t\t\t\tparams.forEach( function(param) {\n\n\t\t\t\t\tvar parameter = parameters[param];\n\t\t\t\t\tvar accessor = this.resources.getEntry(parameter);\n\t\t\t\t\tif (!accessor)\n\t\t\t\t\t\tdebugger;\n\t\t\t\t\taccessor = accessor.object;\n\t\t\t\t\tvar bufferView = this.resources.getEntry(accessor.bufferView);\n\t\t\t\t\tvar paramObject = {\n\t\t\t\t\t\t\tbufferView : bufferView,\n\t\t\t\t\t\t\tbyteOffset : accessor.byteOffset,\n\t\t\t\t\t\t\tcount : accessor.count,\n\t\t\t\t\t\t\tcomponentType : accessor.componentType,\n\t\t\t\t\t\t\ttype : accessor.type,\n\t\t\t\t\t\t\tid : accessor.bufferView,\n\t\t\t\t\t\t\tname : param             \n\t\t\t\t\t};\n\t\t\t\t\t\n\t\t\t\t\tvar paramContext = new AnimationParameterContext(paramObject, animation);\n\n\t\t\t\t\tvar loaddata = { \n\t\t\t\t\t\tparamObject : paramObject,\n\t\t\t\t\t\tanimationParameterDelegate : this.loadContext.animationParameterDelegate,\n\t\t\t\t\t\tparamContext : paramContext\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.loadContext.scheduleLoad(function(data) {\n\n\t\t\t\t\t\tvar alreadyProcessedAttribute = \n\t\t\t\t\t\t\tTHREE.GLTFLoaderUtils.getBuffer(data.paramObject, \n\t\t\t\t\t\t\t\tdata.animationParameterDelegate, data.paramContext);\n\n\t\t\t\t\t\tif (alreadyProcessedAttribute) {\n\t\t\t\t\t\t\tdata.animationParameterDelegate.resourceAvailable(\n\t\t\t\t\t\t\t\talreadyProcessedAttribute, data.paramContext);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}, loaddata);\n\n\n\t\t\t\t}, this);\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\thandleAccessor: {\n\t\t\tvalue: function(entryID, description, loadContext) {\n\t\t\t\t// Save attribute entry\n\t\t\t\tthis.resources.setEntry(entryID, description, description);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\thandleSkin: {\n\t\t\tvalue: function(entryID, description, loadContext) {\n\t\t\t\t// Save skin entry\n\t\t\t\n\t\t\t\tvar skin = {\n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tvar m = description.bindShapeMatrix;\n\t\t\t\tskin.bindShapeMatrix = new THREE.Matrix4().set(\n\t\t\t\t\t\tm[0],  m[4],  m[8],  m[12],\n\t\t\t\t\t\tm[1],  m[5],  m[9],  m[13],\n\t\t\t\t\t\tm[2],  m[6],  m[10], m[14],\n\t\t\t\t\t\tm[3],  m[7],  m[11], m[15]\n\t\t\t\t\t);\n\t\t\t\t\n\t\t\t\tskin.jointNames = description.jointNames;\n\t\t\t\tvar inverseBindMatricesDescription = this.resources.getEntry(description.inverseBindMatrices);\n\t\t\t\tinverseBindMatricesDescription = inverseBindMatricesDescription.description;\n\t\t\t\tskin.inverseBindMatricesDescription = inverseBindMatricesDescription;\n\t\t\t\tskin.inverseBindMatricesDescription.id = description.inverseBindMatrices;\n\n\t\t\t\tvar bufferEntry = this.resources.getEntry(inverseBindMatricesDescription.bufferView);\n\n\t\t\t\tvar paramObject = {\n\t\t\t\t\t\tbufferView : bufferEntry,\n\t\t\t\t\t\tbyteOffset : inverseBindMatricesDescription.byteOffset,\n\t\t\t\t\t\tcount : inverseBindMatricesDescription.count,\n\t\t\t\t\t\tcomponentType : inverseBindMatricesDescription.componentType,\n\t\t\t\t\t\ttype : inverseBindMatricesDescription.type,\n\t\t\t\t\t\tid : inverseBindMatricesDescription.bufferView,\n\t\t\t\t\t\tname : skin.inverseBindMatricesDescription.id             \n\t\t\t\t};\n\t\t\t\t\n\t\t\t\tvar context = new InverseBindMatricesContext(paramObject, skin);\n\n\t\t\t\tvar loaddata = { \n\t\t\t\t\tparamObject : paramObject,\n\t\t\t\t\tinverseBindMatricesDelegate : this.loadContext.inverseBindMatricesDelegate,\n\t\t\t\t\tcontext : context\n\t\t\t\t};\n\n\t\t\t\tthis.loadContext.scheduleLoad(function(data) {\n\n\t\t\t\t\tvar alreadyProcessedAttribute = \n\t\t\t\t\t\tTHREE.GLTFLoaderUtils.getBuffer(data.paramObject, \n\t\t\t\t\t\t\tdata.inverseBindMatricesDelegate, data.context);\n\n\t\t\t\t\tif (alreadyProcessedAttribute) {\n\t\t\t\t\t\tdata.inverseBindMatricesDelegate.resourceAvailable(\n\t\t\t\t\t\t\talreadyProcessedAttribute, data.context);\n\t\t\t\t\t}\n\n\t\t\t\t}, loaddata);\n\n\n\n\t\t\t\tvar bufferView = this.resources.getEntry(skin.inverseBindMatricesDescription.bufferView);\n\t\t\t\tskin.inverseBindMatricesDescription.bufferView = \n\t\t\t\t\tbufferView.object;\n\t\t\t\tthis.resources.setEntry(entryID, skin, description);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\thandleSampler: {\n\t\t\tvalue: function(entryID, description, loadContext) {\n\t\t\t\t// Save attribute entry\n\t\t\t\tthis.resources.setEntry(entryID, description, description);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\n\t\thandleTexture: {\n\t\t\tvalue: function(entryID, description, loadContext) {\n\t\t\t\t// Save attribute entry\n\t\t\t\tthis.resources.setEntry(entryID, null, description);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\t\t\n\t\thandleError: {\n\t\t\tvalue: function(msg) {\n\n\t\t\t\tthrow new Error(msg);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t},\n\t\t\n\t\t_delegate: {\n\t\t\tvalue: new LoadDelegate,\n\t\t\twritable: true\n\t\t},\n\n\t\tdelegate: {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn this._delegate;\n\t\t\t},\n\t\t\tset: function(value) {\n\t\t\t\tthis._delegate = value;\n\t\t\t}\n\t\t}\n\t});\n\n\t// Loader\n\tvar glTFRootObj = new THREE.Object3D();\n\tvar glTFLoadContext = new THREE.glTFLoadContext(url, glTFRootObj, callback)\n\n\tvar loader = Object.create(ThreeGLTFLoader);\n\tloader.initWithPath(url);\n\tloader.load(glTFLoadContext, null);\n\n\treturn glTFRootObj;\n}\n"
  },
  {
    "path": "browser/vendor/three/loaders/gltf/glTFLoaderUtils.js",
    "content": "/**\n * @author Tony Parisi / http://www.tonyparisi.com/\n */\n\nTHREE.GLTFLoaderUtils = Object.create(Object, {\n\n    // errors\n    MISSING_DESCRIPTION: { value: \"MISSING_DESCRIPTION\" },\n    INVALID_PATH: { value: \"INVALID_PATH\" },\n    INVALID_TYPE: { value: \"INVALID_TYPE\" },\n    XMLHTTPREQUEST_STATUS_ERROR: { value: \"XMLHTTPREQUEST_STATUS_ERROR\" },\n    NOT_FOUND: { value: \"NOT_FOUND\" },\n    // misc constants\n    ARRAY_BUFFER: { value: \"ArrayBuffer\" },\n\n    _streams : { value:{}, writable: true },\n\n    _streamsStatus: { value: {}, writable: true },\n    \n    _resources: { value: {}, writable: true },\n\n    _resourcesStatus: { value: {}, writable: true },\n\n    // initialization\n    init: {\n        value: function() {\n\t        this._streams = {};\n\t        this._streamsStatus = {};\n            this._resources = {};\n            this._resourcesStatus = {};\n        }\n    },\n\n    //manage entries\n    _containsResource: {\n        enumerable: false,\n        value: function(resourceID) {\n            return this._resources[resourceID] ? true : false;\n        }\n    },\n\n    _storeResource: {\n        enumerable: false,\n        value: function(resourceID, resource) {\n            // console.log('storing resource', resourceID)\n            if (!resourceID) {\n                console.log(\"ERROR: entry does not contain id, cannot store\");\n                return;\n            }\n\n            if (this._containsResource(resourceID)) {\n                // console.log(\"WARNING: resource:\"+resourceID+\" is already stored, overriding\");\n            }\n\n           this._resources[resourceID] = resource;\n        }\n    },\n\n    _getResource: {\n        enumerable: false,\n        value: function(resourceID) {\n            return this._resources[resourceID];\n        }\n    },\n\n    _loadStream: {\n        value: function(path, type, delegate) {\n\n\n\n            var dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;\n\n            function decodeDataUriText(isBase64, data) {\n                var result = decodeURIComponent(data);\n                if (isBase64) {\n                    return atob(result);\n                }\n                return result;\n            }\n\n            function decodeDataUriArrayBuffer(isBase64, data) {\n                var byteString = decodeDataUriText(isBase64, data);\n                var buffer = new ArrayBuffer(byteString.length);\n                var view = new Uint8Array(buffer);\n                for (var i = 0; i < byteString.length; i++) {\n                    view[i] = byteString.charCodeAt(i);\n                }\n                return buffer;\n            }\n\n            function decodeDataUri(dataUriRegexResult, responseType) {\n                responseType = typeof responseType !== 'undefined' ? responseType : '';\n                var mimeType = dataUriRegexResult[1];\n                var isBase64 = !!dataUriRegexResult[2];\n                var data = dataUriRegexResult[3];\n\n                switch (responseType) {\n                case '':\n                case 'text':\n                    return decodeDataUriText(isBase64, data);\n                case 'ArrayBuffer':\n                    return decodeDataUriArrayBuffer(isBase64, data);\n                case 'blob':\n                    var buffer = decodeDataUriArrayBuffer(isBase64, data);\n                    return new Blob([buffer], {\n                        type : mimeType\n                    });\n                case 'document':\n                    var parser = new DOMParser();\n                    return parser.parseFromString(decodeDataUriText(isBase64, data), mimeType);\n                case 'json':\n                    return JSON.parse(decodeDataUriText(isBase64, data));\n                default:\n                    throw 'Unhandled responseType: ' + responseType;\n                }\n            }\n\n            var dataUriRegexResult = dataUriRegex.exec(path);\n            // console.log('resource available', path, dataUriRegexResult !== null)\n            if (dataUriRegexResult !== null) {\n                delegate.streamAvailable(path, decodeDataUri(dataUriRegexResult, type));\n                return;\n            }\n\n            var self = this;\n\n            if (!type) {\n                delegate.handleError(THREE.GLTFLoaderUtils.INVALID_TYPE, null);\n                return;\n            }\n\n            if (!path) {\n                delegate.handleError(THREE.GLTFLoaderUtils.INVALID_PATH);\n                return;\n            }\n\n            var xhr = new XMLHttpRequest();\n            xhr.open('GET', path, true);\n            xhr.responseType = (type === this.ARRAY_BUFFER) ? \"arraybuffer\" : \"text\";\n\n            //if this is not specified, 1 \"big blob\" scenes fails to load.\n            xhr.setRequestHeader(\"If-Modified-Since\", \"Sat, 01 Jan 1970 00:00:00 GMT\");\n            xhr.onload = function(e) {\n                if ((xhr.status == 200) || (xhr.status == 206)) {\n\n                    delegate.streamAvailable(path, xhr.response);\n\n                } else {\n                    delegate.handleError(THREE.GLTFLoaderUtils.XMLHTTPREQUEST_STATUS_ERROR, this.status);\n                }\n            };\n            xhr.send(null);\n        }\n    },\n\n    send: { value: 0, writable: true },\n    requested: { value: 0, writable: true },\n\n    _handleRequest: {\n        value: function(request) {\n            // console.log('requesting', request.id)\n            var resourceStatus = this._resourcesStatus[request.id];\n            if (resourceStatus)\n            {\n            \tthis._resourcesStatus[request.id]++;\n            }\n            else\n            {\n            \tthis._resourcesStatus[request.id] = 1;\n            }\n            \n            var streamStatus = this._streamsStatus[request.uri];\n            if (streamStatus && streamStatus.status === \"loading\" )\n            {\n            \tstreamStatus.requests.push(request);\n                return;\n            }\n\n            if (this._streamsStatus[request.uri]) {\n                // console.log('already loading', request.uri)\n                debugger;\n            }\n\n            this._streamsStatus[request.uri] = { status : \"loading\", requests : [request] };\n    \t\t\n            var self = this;\n            var processResourceDelegate = {};\n\n            processResourceDelegate.streamAvailable = function(path, res_) {\n            \tvar streamStatus = self._streamsStatus[path];\n\n                if (!streamStatus) {\n                    debugger;\n                    return\n                }\n\n                var requests = streamStatus.requests;\n                requests.forEach( function(req_) {\n                    // console.log('\\t', req_.uri)\n                    var subArray = res_.slice(req_.range[0], req_.range[1]);\n                    var convertedResource = req_.delegate.convert(subArray, req_.ctx);\n                    self._storeResource(req_.id, convertedResource);\n                    req_.delegate.resourceAvailable(convertedResource, req_.ctx);\n                    --self._resourcesStatus[req_.id];\n\n                }, this);\n            \t\n                delete self._streamsStatus[path];\n\n            };\n\n            processResourceDelegate.handleError = function(errorCode, info) {\n                request.delegate.handleError(errorCode, info);\n            }\n\n            this._loadStream(request.uri, request.type, processResourceDelegate);\n        }\n    },\n\n\n    _elementSizeForGLType: {\n        value: function(componentType, type) {\n    \t\n    \t\tvar nElements = 0;\n    \t\tswitch(type) {    \t\t\n\t            case \"SCALAR\" :\n\t                nElements = 1;\n\t                break;\n\t            case \"VEC2\" :\n\t                nElements = 2;\n\t                break;\n\t            case \"VEC3\" :\n\t                nElements = 3;\n\t                break;\n\t            case \"VEC4\" :\n\t                nElements = 4;\n\t                break;\n\t            case \"MAT2\" :\n\t                nElements = 4;\n\t                break;\n\t            case \"MAT3\" :\n\t                nElements = 9;\n\t                break;\n\t            case \"MAT4\" :\n\t                nElements = 16;\n\t                break;\n\t            default :\n\t            \tdebugger;\n\t            \tbreak;\n    \t\t}\n    \t\t\n            switch (componentType) {\n                case WebGLRenderingContext.FLOAT :\n                    return Float32Array.BYTES_PER_ELEMENT * nElements;\n                case WebGLRenderingContext.UNSIGNED_BYTE :\n                    return Uint8Array.BYTES_PER_ELEMENT * nElements;\n                case WebGLRenderingContext.UNSIGNED_SHORT :\n                    return Uint16Array.BYTES_PER_ELEMENT * nElements;\n                default :\n                \tdebugger;\n                    return null;\n            }\n        }\n    },\n\n    _handleWrappedBufferViewResourceLoading: {\n        value: function(wrappedBufferView, delegate, ctx) {\n            var bufferView = wrappedBufferView.bufferView;\n            var buffer = bufferView.buffer;\n            var byteOffset = wrappedBufferView.byteOffset + bufferView.description.byteOffset;\n            var range = [byteOffset , (this._elementSizeForGLType(wrappedBufferView.componentType, wrappedBufferView.type) * wrappedBufferView.count) + byteOffset];\n\n            this._handleRequest({   \"id\" : wrappedBufferView.id,\n                                    \"range\" : range,\n                                    \"type\" : buffer.description.type,\n                                    \"uri\" : buffer.description.uri,\n                                    \"delegate\" : delegate,\n                                    \"ctx\" : ctx }, null);\n        }\n    },\n    \n    getBuffer: {\n    \t\n            value: function(wrappedBufferView, delegate, ctx) {\n\n            var savedBuffer = this._getResource(wrappedBufferView.id);\n            if (false) { // savedBuffer) {\n                return savedBuffer;\n            } else {\n                this._handleWrappedBufferViewResourceLoading(wrappedBufferView, delegate, ctx);\n            }\n\n            return null;\n        }\n    },\n\n    getFile: {\n    \t\n        value: function(request, delegate, ctx) {\n\n    \t\trequest.delegate = delegate;\n    \t\trequest.ctx = ctx;\n\n            this._handleRequest({   \"id\" : request.id,\n                \"uri\" : request.uri,\n                \"range\" : [0],\n                \"type\" : \"text\",\n                \"delegate\" : delegate,\n                \"ctx\" : ctx }, null);\n    \t\n            return null;\n\t    }\n\t},    \n});\n"
  },
  {
    "path": "browser/vendor/three/loaders/gltf/glTFShaders.js",
    "content": "/**\n * @author Tony Parisi / http://www.tonyparisi.com/\n */\n\nTHREE.glTFShaders = ( function () {\n\n\tvar shaders = [];\n\n\treturn\t{\n\t\tadd : function(shader) {\n\t\t\tshaders.push(shader);\n\t\t},\n\n\t\tremove: function(shader) {\n\n\t\t\tvar i = shaders.indexOf(shader);\n\n\t\t\tif ( i !== -1 ) {\n\t\t\t\tshaders.splice( i, 1 );\n\t\t\t}\n\t\t},\n\n\t\tremoveAll: function(shader) {\n\n\t\t\t// probably want to clean up the shaders, too, but not for now\n\t\t\tshaders = [];\n\t\t},\n\n\t\tbindShaderParameters: function(scene) {\n\t\t\tfor (var i = 0; i < shaders.length; i++)\n\t\t\t{\n\t\t\t\tshaders[i].bindParameters(scene);\n\t\t\t}\n\t\t},\n\n\t\tupdate : function(scene, camera) {\n\t\t\tfor (var i = 0; i < shaders.length; i++)\n\t\t\t{\n\t\t\t\tshaders[i].update(scene, camera);\n\t\t\t}\n\t\t},\n\n\t\tcloneShaderBindings : function(source, target) {\n\t\t\tvar newShaders = []\n\t\t\tfor (var i = 0; i < shaders.length; i++)\n\t\t\t{\n\t\t\t\tvar cloneIdx = -1\n\t\t\t\tvar idx = 0\n\t\t\t\t\n\t\t\t\t// find the matching object (if any) from source object hierarchy\n\t\t\t\tsource.traverse(function(n) {\n\t\t\t\t\tif (cloneIdx === -1 && n === shaders[i].object) {\n\t\t\t\t\t\tcloneIdx = idx\n\t\t\t\t\t}\n\t\t\t\t\t++idx\n\t\t\t\t})\n\n\t\t\t\tif (cloneIdx >= 0) {\n\t\t\t\t\tidx = 0\n\t\t\t\t\tvar targetChild = undefined\n\n\t\t\t\t\t// find the matching object from target object hierarchy\n\t\t\t\t\ttarget.traverse(function(n) {\n\t\t\t\t\t\tif (cloneIdx === idx) {\n\t\t\t\t\t\t\ttargetChild = n\n\t\t\t\t\t\t}\n\t\t\t\t\t\t++idx\n\t\t\t\t\t})\n\t\t\t\t\tif (targetChild) {\n\t\t\t\t\t\tvar newShader = shaders[i].clone(targetChild, source, target)\n\t\t\t\t\t\tnewShader.bindParameters(target)\n\t\t\t\t\t\tnewShaders.push(newShader)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (var i = 0; i < newShaders.length; i++) {\n\t\t\t\tthis.add(newShaders[i])\n\t\t\t}\n\t\t}\n\t};\n})();\n\n// Construction/initialization\nTHREE.glTFShader = function(material, params, object, scene) {\n\tthis.material = material;\n\tthis.materialParams = params\n\tthis.parameters = params.technique.parameters;\n\tthis.uniforms = params.technique.uniforms;\n\tthis.object = object;\n\tthis.semantics = {};\n\tthis.m4 = new THREE.Matrix4;\n}\n\nTHREE.glTFShader.prototype.clone = function(object, sourceTree, targetTree) {\n\tvar newParams = {\n\t\ttechnique: {\n\t\t\tparameters: this.parameters,\n\t\t\tuniforms: this.uniforms\n\t\t}\n\t}\n\t\n\tfunction remap(source, target, f) {\n\t\tf(source, target)\n\n\t\tfor (var i = 0; i < source.children.length; ++i) {\n\t\t\tremap(source.children[i], target.children[i], f)\n\t\t}\n\t}\n\n\treturn new THREE.glTFShader(object.material, newParams, object)\n}\n\n\n// bindParameters - connect the uniform values to their source parameters\nTHREE.glTFShader.prototype.bindParameters = function(scene) {\n\n\tfunction findObject(o, p) { \n\t\tif (o.glTFID == param.node) {\n\t\t\tp.sourceObject = o;\n\t\t}\n\t}\n\n\tfor (var uniform in this.uniforms) {\n\t\tvar pname = this.uniforms[uniform];\n\t\tvar param = this.parameters[pname];\n\t\tif (param.semantic) {\n\n\t\t\tvar p = { \n\t\t\t\tsemantic : param.semantic,\n\t\t\t\tuniform: this.material.uniforms[uniform] \n\t\t\t};\n\n\t\t\tif (param.node) {\n\t\t\t\tscene.traverse(function(o) { findObject(o, p)});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tp.sourceObject = this.object;\n\t\t\t}\n\n\t\t\tif (!p.sourceObject) {\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tthis.semantics[pname] = p;\n\n\t\t}\n\t}\n\n}\n\n// Update - update all the uniform values\nTHREE.glTFShader.prototype.update = function(scene, camera) {\n\n\t// update scene graph\n\tscene.updateMatrixWorld();\n\n\t// update camera matrices and frustum\n\tcamera.updateMatrixWorld();\n\tcamera.matrixWorldInverse.getInverse( camera.matrixWorld );\n\n\n\tfor (var sname in this.semantics) {\n\t\tvar semantic = this.semantics[sname];\n\n\t\tif (semantic) {\n\t        switch (semantic.semantic) {\n\t            case \"MODELVIEW\" :\n\t                if (semantic.sourceObject) {\n\t\t                var m4 = semantic.uniform.value;\n\t\t                m4.multiplyMatrices(camera.matrixWorldInverse,\n\t\t                \tsemantic.sourceObject.matrixWorld);\n\t                }\n\t                break;\n\n\t            case \"MODELVIEWINVERSETRANSPOSE\" :\n\t\t            if (semantic.sourceObject) {\n\t\t\t            var m3 = semantic.uniform.value;\n\t\t\t            this.m4.multiplyMatrices(camera.matrixWorldInverse,\n\t\t\t            \tsemantic.sourceObject.matrixWorld);\n\t\t\t            m3.getNormalMatrix(this.m4);\n\t\t            }\n\t                break;\n\n\t            case \"PROJECTION\" :\n\t            \tvar m4 = semantic.uniform.value;\n\t            \tm4.copy(camera.projectionMatrix);            \t\t\n\t                break;\n\n\t            case \"JOINTMATRIX\" :\n\t\t            if (semantic.sourceObject) {\n\t\t\t            var m4v = semantic.uniform.value;\n\t\t\t            for (var mi = 0; mi < m4v.length; mi++) {\n\t\t\t\t            // So it goes like this:\n\t\t\t\t            // SkinnedMesh world matrix is already baked into MODELVIEW;\n\t\t\t\t            // transform joints to local space,\n\t\t\t\t            // then transform using joint's inverse\n\t\t\t\t\t\t\tm4v[mi].getInverse(semantic.sourceObject.matrixWorld).\n\t\t\t\t\t\t\t\tmultiply(this.object.skeleton.bones[mi].matrixWorld).\n\t\t\t\t\t\t\t\tmultiply(this.object.skeleton.boneInverses[mi]);\n\t\t\t            }\n\t\t            }\n\t                //console.log(\"Joint:\", semantic)\n\t                break;\n\n\t            default :\n\t                throw new Error(\"Unhandled shader semantic\" + semantic);\n\t                break;\n\t        }\n        }\n\t}\n}\n"
  },
  {
    "path": "browser/vendor/three/loaders/gltf/gltfUtilities.js",
    "content": "/**\ngltfUtilities\n@license\nThe MIT License (MIT)\nCopyright (c) 2014 Analytical Graphics, Inc.\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:\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n(function(root, factory) {\n    \"use strict\";\n    /*global define*/\n    if (typeof define === 'function' && define.amd) {\n        // AMD. Register as an anonymous module.\n        define([], factory);\n    } else {\n        // Browser globals\n        root.gltfUtilities = factory();\n    }\n}(this, function() {\n    \"use strict\";\n\n    /**\n     * Given a URL, determine whether that URL is considered cross-origin to the current page.\n     */\n    var isCrossOriginUrl = function(url) {\n        var location = window.location;\n        var a = document.createElement('a');\n\n        a.href = url;\n\n        // host includes both hostname and port if the port is not standard\n        return location.protocol !== a.protocol || location.host !== a.host;\n    };\n\n    var isDataUriRegex = /^data:/;\n\n    /**\n     * Asynchronously loads the given image URL.  Attempts to load cross-origin images using CORS.\n     *\n     * @param {String} url The source of the image.\n     * @param {Function} success A function that will be called with an Image object\n     *                           once the image has loaded successfully.\n     * @param {Function} [error] A function that will be called if the request fails.\n     *\n     * @see <a href='http://www.w3.org/TR/cors/'>Cross-Origin Resource Sharing</a>\n     */\n    var loadImage = function(url, success, error) {\n        var image = new Image();\n\n        image.onload = function() {\n            success(image);\n        };\n\n        if (typeof error !== 'undefined') {\n            image.onerror = error;\n        }\n\n        var crossOrigin;\n        if (isDataUriRegex.test(url)) {\n            crossOrigin = false;\n        } else {\n            crossOrigin = isCrossOriginUrl(url);\n        }\n\n        if (crossOrigin) {\n            image.crossOrigin = '';\n        }\n\n        image.src = url;\n    };\n\n    var dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;\n\n    function decodeDataUriText(isBase64, data) {\n        var result = decodeURIComponent(data);\n        if (isBase64) {\n            return atob(result);\n        }\n        return result;\n    }\n\n    function decodeDataUriArrayBuffer(isBase64, data) {\n        var byteString = decodeDataUriText(isBase64, data);\n        var buffer = new ArrayBuffer(byteString.length);\n        var view = new Uint8Array(buffer);\n        for (var i = 0; i < byteString.length; i++) {\n            view[i] = byteString.charCodeAt(i);\n        }\n        return buffer;\n    }\n\n    function decodeDataUri(dataUriRegexResult, responseType) {\n        responseType = typeof responseType !== 'undefined' ? responseType : '';\n        var mimeType = dataUriRegexResult[1];\n        var isBase64 = !!dataUriRegexResult[2];\n        var data = dataUriRegexResult[3];\n\n        switch (responseType) {\n        case '':\n        case 'text':\n            return decodeDataUriText(isBase64, data);\n        case 'arraybuffer':\n            return decodeDataUriArrayBuffer(isBase64, data);\n        case 'blob':\n            var buffer = decodeDataUriArrayBuffer(isBase64, data);\n            return new Blob([buffer], {\n                type : mimeType\n            });\n        case 'document':\n            var parser = new DOMParser();\n            return parser.parseFromString(decodeDataUriText(isBase64, data), mimeType);\n        case 'json':\n            return JSON.parse(decodeDataUriText(isBase64, data));\n        default:\n            throw 'Unhandled responseType: ' + responseType;\n        }\n    }\n\n    var loadWithXhr = function(url, responseType, success, error) {\n        var dataUriRegexResult = dataUriRegex.exec(url);\n        if (dataUriRegexResult !== null) {\n            success(decodeDataUri(dataUriRegexResult, responseType));\n            return;\n        }\n\n        var xhr = new XMLHttpRequest();\n        xhr.open('GET', url, true);\n\n        if (typeof responseType !== 'undefined') {\n            xhr.responseType = responseType;\n        }\n\n        xhr.onload = function(e) {\n            if (xhr.status === 200) {\n                success(xhr.response);\n            } else {\n                error(xhr);\n            }\n        };\n\n        xhr.onerror = function(e) {\n            error(xhr);\n        };\n\n        xhr.send();\n    };\n\n    /**\n     * Asynchronously loads the given URL as raw binary data.  The data is loaded\n     * using XMLHttpRequest, which means that in order to make requests to another origin,\n     * the server must have Cross-Origin Resource Sharing (CORS) headers enabled.\n     *\n     * @param {String} url The URL of the binary data.\n     * @param {Function} success A function that will be called with an ArrayBuffer object\n     *                           once the data has loaded successfully.\n     * @param {Function} [error] A function that will be called with the XMLHttpRequest object\n     *                           if the request fails.\n     *\n     * @see <a href=\"http://en.wikipedia.org/wiki/XMLHttpRequest\">XMLHttpRequest</a>\n     * @see <a href='http://www.w3.org/TR/cors/'>Cross-Origin Resource Sharing</a>\n     */\n    var loadArrayBuffer = function(url, success, error) {\n        loadWithXhr(url, 'arraybuffer', success, error);\n    };\n\n    /**\n     * Asynchronously loads the given URL as text.  The data is loaded\n     * using XMLHttpRequest, which means that in order to make requests to another origin,\n     * the server must have Cross-Origin Resource Sharing (CORS) headers enabled.\n     *\n     * @param {String} url The URL to request.\n     * @param {Function} success A function that will be called with a String\n     *                           once the data has loaded successfully.\n     * @param {Function} [error] A function that will be called with the XMLHttpRequest object\n     *                           if the request fails.\n     *\n     * @see <a href=\"http://en.wikipedia.org/wiki/XMLHttpRequest\">XMLHttpRequest</a>\n     * @see <a href='http://www.w3.org/TR/cors/'>Cross-Origin Resource Sharing</a>\n     */\n    var loadText = function(url, success, error) {\n        return loadWithXhr(url, undefined, success, error);\n    };\n\n    return {\n        loadImage : loadImage,\n        loadArrayBuffer : loadArrayBuffer,\n        loadText : loadText\n    };\n}));\n\n\n"
  },
  {
    "path": "browser/vendor/three/three.js",
    "content": "(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n\ttypeof define === 'function' && define.amd ? define(['exports'], factory) :\n\t(factory((global.THREE = global.THREE || {})));\n}(this, (function (exports) { 'use strict';\n\n\t// Polyfills\n\n\tif ( Number.EPSILON === undefined ) {\n\n\t\tNumber.EPSILON = Math.pow( 2, - 52 );\n\n\t}\n\n\tif ( Number.isInteger === undefined ) {\n\n\t\t// Missing in IE\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger\n\n\t\tNumber.isInteger = function ( value ) {\n\n\t\t\treturn typeof value === 'number' && isFinite( value ) && Math.floor( value ) === value;\n\n\t\t};\n\n\t}\n\n\t//\n\n\tif ( Math.sign === undefined ) {\n\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign\n\n\t\tMath.sign = function ( x ) {\n\n\t\t\treturn ( x < 0 ) ? - 1 : ( x > 0 ) ? 1 : + x;\n\n\t\t};\n\n\t}\n\n\tif ( Function.prototype.name === undefined ) {\n\n\t\t// Missing in IE\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name\n\n\t\tObject.defineProperty( Function.prototype, 'name', {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.toString().match( /^\\s*function\\s*([^\\(\\s]*)/ )[ 1 ];\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tif ( Object.assign === undefined ) {\n\n\t\t// Missing in IE\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n\n\t\t( function () {\n\n\t\t\tObject.assign = function ( target ) {\n\n\t\t\t\t'use strict';\n\n\t\t\t\tif ( target === undefined || target === null ) {\n\n\t\t\t\t\tthrow new TypeError( 'Cannot convert undefined or null to object' );\n\n\t\t\t\t}\n\n\t\t\t\tvar output = Object( target );\n\n\t\t\t\tfor ( var index = 1; index < arguments.length; index ++ ) {\n\n\t\t\t\t\tvar source = arguments[ index ];\n\n\t\t\t\t\tif ( source !== undefined && source !== null ) {\n\n\t\t\t\t\t\tfor ( var nextKey in source ) {\n\n\t\t\t\t\t\t\tif ( Object.prototype.hasOwnProperty.call( source, nextKey ) ) {\n\n\t\t\t\t\t\t\t\toutput[ nextKey ] = source[ nextKey ];\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn output;\n\n\t\t\t};\n\n\t\t} )();\n\n\t}\n\n\t/**\n\t * https://github.com/mrdoob/eventdispatcher.js/\n\t */\n\n\tfunction EventDispatcher() {}\n\n\tObject.assign( EventDispatcher.prototype, {\n\n\t\taddEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\t\tlisteners[ type ] = [];\n\n\t\t\t}\n\n\t\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\t\tlisteners[ type ].push( listener );\n\n\t\t\t}\n\n\t\t},\n\n\t\thasEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return false;\n\n\t\t\tvar listeners = this._listeners;\n\n\t\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t\t},\n\n\t\tremoveEventListener: function ( type, listener ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tvar index = listenerArray.indexOf( listener );\n\n\t\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tdispatchEvent: function ( event ) {\n\n\t\t\tif ( this._listeners === undefined ) return;\n\n\t\t\tvar listeners = this._listeners;\n\t\t\tvar listenerArray = listeners[ event.type ];\n\n\t\t\tif ( listenerArray !== undefined ) {\n\n\t\t\t\tevent.target = this;\n\n\t\t\t\tvar array = listenerArray.slice( 0 );\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\tvar REVISION = '87';\n\tvar MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2 };\n\tvar CullFaceNone = 0;\n\tvar CullFaceBack = 1;\n\tvar CullFaceFront = 2;\n\tvar CullFaceFrontBack = 3;\n\tvar FrontFaceDirectionCW = 0;\n\tvar FrontFaceDirectionCCW = 1;\n\tvar BasicShadowMap = 0;\n\tvar PCFShadowMap = 1;\n\tvar PCFSoftShadowMap = 2;\n\tvar FrontSide = 0;\n\tvar BackSide = 1;\n\tvar DoubleSide = 2;\n\tvar FlatShading = 1;\n\tvar SmoothShading = 2;\n\tvar NoColors = 0;\n\tvar FaceColors = 1;\n\tvar VertexColors = 2;\n\tvar NoBlending = 0;\n\tvar NormalBlending = 1;\n\tvar AdditiveBlending = 2;\n\tvar SubtractiveBlending = 3;\n\tvar MultiplyBlending = 4;\n\tvar CustomBlending = 5;\n\tvar AddEquation = 100;\n\tvar SubtractEquation = 101;\n\tvar ReverseSubtractEquation = 102;\n\tvar MinEquation = 103;\n\tvar MaxEquation = 104;\n\tvar ZeroFactor = 200;\n\tvar OneFactor = 201;\n\tvar SrcColorFactor = 202;\n\tvar OneMinusSrcColorFactor = 203;\n\tvar SrcAlphaFactor = 204;\n\tvar OneMinusSrcAlphaFactor = 205;\n\tvar DstAlphaFactor = 206;\n\tvar OneMinusDstAlphaFactor = 207;\n\tvar DstColorFactor = 208;\n\tvar OneMinusDstColorFactor = 209;\n\tvar SrcAlphaSaturateFactor = 210;\n\tvar NeverDepth = 0;\n\tvar AlwaysDepth = 1;\n\tvar LessDepth = 2;\n\tvar LessEqualDepth = 3;\n\tvar EqualDepth = 4;\n\tvar GreaterEqualDepth = 5;\n\tvar GreaterDepth = 6;\n\tvar NotEqualDepth = 7;\n\tvar MultiplyOperation = 0;\n\tvar MixOperation = 1;\n\tvar AddOperation = 2;\n\tvar NoToneMapping = 0;\n\tvar LinearToneMapping = 1;\n\tvar ReinhardToneMapping = 2;\n\tvar Uncharted2ToneMapping = 3;\n\tvar CineonToneMapping = 4;\n\tvar UVMapping = 300;\n\tvar CubeReflectionMapping = 301;\n\tvar CubeRefractionMapping = 302;\n\tvar EquirectangularReflectionMapping = 303;\n\tvar EquirectangularRefractionMapping = 304;\n\tvar SphericalReflectionMapping = 305;\n\tvar CubeUVReflectionMapping = 306;\n\tvar CubeUVRefractionMapping = 307;\n\tvar RepeatWrapping = 1000;\n\tvar ClampToEdgeWrapping = 1001;\n\tvar MirroredRepeatWrapping = 1002;\n\tvar NearestFilter = 1003;\n\tvar NearestMipMapNearestFilter = 1004;\n\tvar NearestMipMapLinearFilter = 1005;\n\tvar LinearFilter = 1006;\n\tvar LinearMipMapNearestFilter = 1007;\n\tvar LinearMipMapLinearFilter = 1008;\n\tvar UnsignedByteType = 1009;\n\tvar ByteType = 1010;\n\tvar ShortType = 1011;\n\tvar UnsignedShortType = 1012;\n\tvar IntType = 1013;\n\tvar UnsignedIntType = 1014;\n\tvar FloatType = 1015;\n\tvar HalfFloatType = 1016;\n\tvar UnsignedShort4444Type = 1017;\n\tvar UnsignedShort5551Type = 1018;\n\tvar UnsignedShort565Type = 1019;\n\tvar UnsignedInt248Type = 1020;\n\tvar AlphaFormat = 1021;\n\tvar RGBFormat = 1022;\n\tvar RGBAFormat = 1023;\n\tvar LuminanceFormat = 1024;\n\tvar LuminanceAlphaFormat = 1025;\n\tvar RGBEFormat = RGBAFormat;\n\tvar DepthFormat = 1026;\n\tvar DepthStencilFormat = 1027;\n\tvar RGB_S3TC_DXT1_Format = 2001;\n\tvar RGBA_S3TC_DXT1_Format = 2002;\n\tvar RGBA_S3TC_DXT3_Format = 2003;\n\tvar RGBA_S3TC_DXT5_Format = 2004;\n\tvar RGB_PVRTC_4BPPV1_Format = 2100;\n\tvar RGB_PVRTC_2BPPV1_Format = 2101;\n\tvar RGBA_PVRTC_4BPPV1_Format = 2102;\n\tvar RGBA_PVRTC_2BPPV1_Format = 2103;\n\tvar RGB_ETC1_Format = 2151;\n\tvar LoopOnce = 2200;\n\tvar LoopRepeat = 2201;\n\tvar LoopPingPong = 2202;\n\tvar InterpolateDiscrete = 2300;\n\tvar InterpolateLinear = 2301;\n\tvar InterpolateSmooth = 2302;\n\tvar ZeroCurvatureEnding = 2400;\n\tvar ZeroSlopeEnding = 2401;\n\tvar WrapAroundEnding = 2402;\n\tvar TrianglesDrawMode = 0;\n\tvar TriangleStripDrawMode = 1;\n\tvar TriangleFanDrawMode = 2;\n\tvar LinearEncoding = 3000;\n\tvar sRGBEncoding = 3001;\n\tvar GammaEncoding = 3007;\n\tvar RGBEEncoding = 3002;\n\tvar LogLuvEncoding = 3003;\n\tvar RGBM7Encoding = 3004;\n\tvar RGBM16Encoding = 3005;\n\tvar RGBDEncoding = 3006;\n\tvar BasicDepthPacking = 3200;\n\tvar RGBADepthPacking = 3201;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar _Math = {\n\n\t\tDEG2RAD: Math.PI / 180,\n\t\tRAD2DEG: 180 / Math.PI,\n\n\t\tgenerateUUID: function () {\n\n\t\t\t// http://www.broofa.com/Tools/Math.uuid.htm\n\n\t\t\tvar chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split( '' );\n\t\t\tvar uuid = new Array( 36 );\n\t\t\tvar rnd = 0, r;\n\n\t\t\treturn function generateUUID() {\n\n\t\t\t\tfor ( var i = 0; i < 36; i ++ ) {\n\n\t\t\t\t\tif ( i === 8 || i === 13 || i === 18 || i === 23 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '-';\n\n\t\t\t\t\t} else if ( i === 14 ) {\n\n\t\t\t\t\t\tuuid[ i ] = '4';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( rnd <= 0x02 ) rnd = 0x2000000 + ( Math.random() * 0x1000000 ) | 0;\n\t\t\t\t\t\tr = rnd & 0xf;\n\t\t\t\t\t\trnd = rnd >> 4;\n\t\t\t\t\t\tuuid[ i ] = chars[ ( i === 19 ) ? ( r & 0x3 ) | 0x8 : r ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn uuid.join( '' );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclamp: function ( value, min, max ) {\n\n\t\t\treturn Math.max( min, Math.min( max, value ) );\n\n\t\t},\n\n\t\t// compute euclidian modulo of m % n\n\t\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\t\teuclideanModulo: function ( n, m ) {\n\n\t\t\treturn ( ( n % m ) + m ) % m;\n\n\t\t},\n\n\t\t// Linear mapping from range <a1, a2> to range <b1, b2>\n\n\t\tmapLinear: function ( x, a1, a2, b1, b2 ) {\n\n\t\t\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n\t\t},\n\n\t\t// https://en.wikipedia.org/wiki/Linear_interpolation\n\n\t\tlerp: function ( x, y, t ) {\n\n\t\t\treturn ( 1 - t ) * x + t * y;\n\n\t\t},\n\n\t\t// http://en.wikipedia.org/wiki/Smoothstep\n\n\t\tsmoothstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * ( 3 - 2 * x );\n\n\t\t},\n\n\t\tsmootherstep: function ( x, min, max ) {\n\n\t\t\tif ( x <= min ) return 0;\n\t\t\tif ( x >= max ) return 1;\n\n\t\t\tx = ( x - min ) / ( max - min );\n\n\t\t\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n\t\t},\n\n\t\t// Random integer from <low, high> interval\n\n\t\trandInt: function ( low, high ) {\n\n\t\t\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n\t\t},\n\n\t\t// Random float from <low, high> interval\n\n\t\trandFloat: function ( low, high ) {\n\n\t\t\treturn low + Math.random() * ( high - low );\n\n\t\t},\n\n\t\t// Random float from <-range/2, range/2> interval\n\n\t\trandFloatSpread: function ( range ) {\n\n\t\t\treturn range * ( 0.5 - Math.random() );\n\n\t\t},\n\n\t\tdegToRad: function ( degrees ) {\n\n\t\t\treturn degrees * _Math.DEG2RAD;\n\n\t\t},\n\n\t\tradToDeg: function ( radians ) {\n\n\t\t\treturn radians * _Math.RAD2DEG;\n\n\t\t},\n\n\t\tisPowerOfTwo: function ( value ) {\n\n\t\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t\t},\n\n\t\tnearestPowerOfTwo: function ( value ) {\n\n\t\t\treturn Math.pow( 2, Math.round( Math.log( value ) / Math.LN2 ) );\n\n\t\t},\n\n\t\tnextPowerOfTwo: function ( value ) {\n\n\t\t\tvalue --;\n\t\t\tvalue |= value >> 1;\n\t\t\tvalue |= value >> 2;\n\t\t\tvalue |= value >> 4;\n\t\t\tvalue |= value >> 8;\n\t\t\tvalue |= value >> 16;\n\t\t\tvalue ++;\n\n\t\t\treturn value;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author egraether / http://egraether.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tfunction Vector2( x, y ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\n\t}\n\n\tObject.defineProperties( Vector2.prototype, {\n\n\t\t\"width\" : {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.x;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.x = value;\n\n\t\t\t}\n\n\t\t},\n\n\t\t\"height\" : {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.y;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis.y = value;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector2.prototype, {\n\n\t\tisVector2: true,\n\n\t\tset: function ( x, y ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v ) {\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tthis.x *= scalar;\n\t\t\tthis.y *= scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// assumes min < max, componentwise\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min = new Vector2();\n\t\t\tvar max = new Vector2();\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tmin.set( minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t\t},\n\n\t\tlengthManhattan: function() {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() || 1 );\n\n\t\t},\n\n\t\tangle: function () {\n\n\t\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\t\tvar angle = Math.atan2( this.y, this.x );\n\n\t\t\tif ( angle < 0 ) angle += 2 * Math.PI;\n\n\t\t\treturn angle;\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y;\n\t\t\treturn dx * dx + dy * dy;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.normalize().multiplyScalar( length );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector2: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateAround: function ( center, angle ) {\n\n\t\t\tvar c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\t\tvar x = this.x - center.x;\n\t\t\tvar y = this.y - center.y;\n\n\t\t\tthis.x = x * c - y * s + center.x;\n\t\t\tthis.y = x * s + y * c + center.y;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t */\n\n\tvar textureId = 0;\n\n\tfunction Texture( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\tObject.defineProperty( this, 'id', { value: textureId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\n\t\tthis.image = image !== undefined ? image : Texture.DEFAULT_IMAGE;\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping !== undefined ? mapping : Texture.DEFAULT_MAPPING;\n\n\t\tthis.wrapS = wrapS !== undefined ? wrapS : ClampToEdgeWrapping;\n\t\tthis.wrapT = wrapT !== undefined ? wrapT : ClampToEdgeWrapping;\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : LinearMipMapLinearFilter;\n\n\t\tthis.anisotropy = anisotropy !== undefined ? anisotropy : 1;\n\n\t\tthis.format = format !== undefined ? format : RGBAFormat;\n\t\tthis.type = type !== undefined ? type : UnsignedByteType;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\n\n\t\tthis.generateMipmaps = true;\n\t\tthis.premultiplyAlpha = false;\n\t\tthis.flipY = true;\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t\t//\n\t\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t\t// update.  You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\t\tthis.encoding = encoding !== undefined ? encoding : LinearEncoding;\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t}\n\n\tTexture.DEFAULT_IMAGE = undefined;\n\tTexture.DEFAULT_MAPPING = UVMapping;\n\n\tObject.defineProperty( Texture.prototype, \"needsUpdate\", {\n\n\t\tset: function ( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Texture.prototype, EventDispatcher.prototype, {\n\n\t\tconstructor: Texture,\n\n\t\tisTexture: true,\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.image = source.image;\n\t\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\t\tthis.mapping = source.mapping;\n\n\t\t\tthis.wrapS = source.wrapS;\n\t\t\tthis.wrapT = source.wrapT;\n\n\t\t\tthis.magFilter = source.magFilter;\n\t\t\tthis.minFilter = source.minFilter;\n\n\t\t\tthis.anisotropy = source.anisotropy;\n\n\t\t\tthis.format = source.format;\n\t\t\tthis.type = source.type;\n\n\t\t\tthis.offset.copy( source.offset );\n\t\t\tthis.repeat.copy( source.repeat );\n\n\t\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\t\tthis.flipY = source.flipY;\n\t\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\t\tthis.encoding = source.encoding;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tif ( meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t\t}\n\n\t\t\tfunction getDataURL( image ) {\n\n\t\t\t\tvar canvas;\n\n\t\t\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\t\t\tcanvas = image;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcanvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\t\tcanvas.width = image.width;\n\t\t\t\t\tcanvas.height = image.height;\n\n\t\t\t\t\tvar context = canvas.getContext( '2d' );\n\n\t\t\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar output = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.5,\n\t\t\t\t\ttype: 'Texture',\n\t\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t\t},\n\n\t\t\t\tuuid: this.uuid,\n\t\t\t\tname: this.name,\n\n\t\t\t\tmapping: this.mapping,\n\n\t\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\t\tminFilter: this.minFilter,\n\t\t\t\tmagFilter: this.magFilter,\n\t\t\t\tanisotropy: this.anisotropy,\n\n\t\t\t\tflipY: this.flipY\n\t\t\t};\n\n\t\t\tif ( this.image !== undefined ) {\n\n\t\t\t\t// TODO: Move to THREE.Image\n\n\t\t\t\tvar image = this.image;\n\n\t\t\t\tif ( image.uuid === undefined ) {\n\n\t\t\t\t\timage.uuid = _Math.generateUUID(); // UGH\n\n\t\t\t\t}\n\n\t\t\t\tif ( meta.images[ image.uuid ] === undefined ) {\n\n\t\t\t\t\tmeta.images[ image.uuid ] = {\n\t\t\t\t\t\tuuid: image.uuid,\n\t\t\t\t\t\turl: getDataURL( image )\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\toutput.image = image.uuid;\n\n\t\t\t}\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t\treturn output;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t},\n\n\t\ttransformUv: function ( uv ) {\n\n\t\t\tif ( this.mapping !== UVMapping ) return;\n\n\t\t\tuv.multiply( this.repeat );\n\t\t\tuv.add( this.offset );\n\n\t\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.flipY ) {\n\n\t\t\t\tuv.y = 1 - uv.y;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector4( x, y, z, w ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\t\tthis.w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tObject.assign( Vector4.prototype, {\n\n\t\tisVector4: true,\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\t\t\tthis.w = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( w ) {\n\n\t\t\tthis.w = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tcase 3: this.w = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tcase 3: return this.w;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\t\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\t\t\tthis.w += v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\t\t\tthis.w += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\t\t\tthis.w = a.w + b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\t\t\tthis.w += v.w * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\t\t\tthis.w -= v.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\t\t\tthis.w -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\t\t\tthis.w = a.w - b.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tthis.x *= scalar;\n\t\t\tthis.y *= scalar;\n\t\t\tthis.z *= scalar;\n\t\t\tthis.w *= scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z, w = this.w;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tsetAxisAngleFromQuaternion: function ( q ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t\t// q is assumed to be normalized\n\n\t\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\t\tvar s = Math.sqrt( 1 - q.w * q.w );\n\n\t\t\tif ( s < 0.0001 ) {\n\n\t\t\t\t this.x = 1;\n\t\t\t\t this.y = 0;\n\t\t\t\t this.z = 0;\n\n\t\t\t} else {\n\n\t\t\t\t this.x = q.x / s;\n\t\t\t\t this.y = q.y / s;\n\t\t\t\t this.z = q.z / s;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetAxisAngleFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar angle, x, y, z,\t\t// variables for result\n\t\t\t\tepsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\t\tte = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t\t     ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t\t     ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t\t// singularity found\n\t\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t\t     ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t\t     ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t\t     ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t\t}\n\n\t\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\t\tangle = Math.PI;\n\n\t\t\t\tvar xx = ( m11 + 1 ) / 2;\n\t\t\t\tvar yy = ( m22 + 1 ) / 2;\n\t\t\t\tvar zz = ( m33 + 1 ) / 2;\n\t\t\t\tvar xy = ( m12 + m21 ) / 4;\n\t\t\t\tvar xz = ( m13 + m31 ) / 4;\n\t\t\t\tvar yz = ( m23 + m32 ) / 4;\n\n\t\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\t\tx = 0;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\t\ty = xy / x;\n\t\t\t\t\t\tz = xz / x;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0;\n\t\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\t\tx = xy / y;\n\t\t\t\t\t\tz = yz / y;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\t\tz = 0;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\t\tx = xz / z;\n\t\t\t\t\t\ty = yz / z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.set( x, y, z, angle );\n\n\t\t\t\treturn this; // return 180 deg rotation\n\n\t\t\t}\n\n\t\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\t\tvar s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t                   ( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t                   ( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\t\tthis.x = ( m32 - m23 ) / s;\n\t\t\tthis.y = ( m13 - m31 ) / s;\n\t\t\tthis.z = ( m21 - m12 ) / s;\n\t\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\t\t\tthis.w = Math.min( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\t\t\tthis.w = Math.max( this.w, v.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// assumes min < max, componentwise\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min, max;\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tif ( min === undefined ) {\n\n\t\t\t\t\tmin = new Vector4();\n\t\t\t\t\tmax = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tmin.set( minVal, minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\t\t\tthis.w = Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\t\t\tthis.w = Math.ceil( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\t\t\tthis.w = Math.round( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\t\t\tthis.w = - this.w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() || 1 );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.normalize().multiplyScalar( length );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\t\t\tthis.w = array[ offset + 3 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\t\t\tarray[ offset + 3 ] = this.w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector4: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\t\t\tthis.z = attribute.getZ( index );\n\t\t\tthis.w = attribute.getW( index );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author szimek / https://github.com/szimek/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author Marius Kintel / https://github.com/kintel\n\t */\n\n\t/*\n\t In options, we can specify:\n\t * Texture parameters for an auto-generated target texture\n\t * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n\t*/\n\tfunction WebGLRenderTarget( width, height, options ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\t\tthis.scissorTest = false;\n\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\toptions = options || {};\n\n\t\tif ( options.minFilter === undefined ) options.minFilter = LinearFilter;\n\n\t\tthis.texture = new Texture( undefined, undefined, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\t\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\t\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : true;\n\t\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n\t}\n\n\tObject.assign( WebGLRenderTarget.prototype, EventDispatcher.prototype, {\n\n\t\tisWebGLRenderTarget: true,\n\n\t\tsetSize: function ( width, height ) {\n\n\t\t\tif ( this.width !== width || this.height !== height ) {\n\n\t\t\t\tthis.width = width;\n\t\t\t\tthis.height = height;\n\n\t\t\t\tthis.dispose();\n\n\t\t\t}\n\n\t\t\tthis.viewport.set( 0, 0, width, height );\n\t\t\tthis.scissor.set( 0, 0, width, height );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\n\t\t\tthis.viewport.copy( source.viewport );\n\n\t\t\tthis.texture = source.texture.clone();\n\n\t\t\tthis.depthBuffer = source.depthBuffer;\n\t\t\tthis.stencilBuffer = source.stencilBuffer;\n\t\t\tthis.depthTexture = source.depthTexture;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com\n\t */\n\n\tfunction WebGLRenderTargetCube( width, height, options ) {\n\n\t\tWebGLRenderTarget.call( this, width, height, options );\n\n\t\tthis.activeCubeFace = 0; // PX 0, NX 1, PY 2, NY 3, PZ 4, NZ 5\n\t\tthis.activeMipMapLevel = 0;\n\n\t}\n\n\tWebGLRenderTargetCube.prototype = Object.create( WebGLRenderTarget.prototype );\n\tWebGLRenderTargetCube.prototype.constructor = WebGLRenderTargetCube;\n\n\tWebGLRenderTargetCube.prototype.isWebGLRenderTargetCube = true;\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Quaternion( x, y, z, w ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._w = ( w !== undefined ) ? w : 1;\n\n\t}\n\n\tObject.assign( Quaternion, {\n\n\t\tslerp: function ( qa, qb, qm, t ) {\n\n\t\t\treturn qm.copy( qa ).slerp( qb, t );\n\n\t\t},\n\n\t\tslerpFlat: function ( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\t\tvar x0 = src0[ srcOffset0 + 0 ],\n\t\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\t\tw0 = src0[ srcOffset0 + 3 ],\n\n\t\t\t\tx1 = src1[ srcOffset1 + 0 ],\n\t\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\t\tvar s = 1 - t,\n\n\t\t\t\t\tcos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\n\t\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\t\tvar sin = Math.sqrt( sqrSin ),\n\t\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t\t}\n\n\t\t\t\tvar tDir = t * dir;\n\n\t\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t\t// Normalize in case we just did a lerp:\n\t\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\t\tvar f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\t\tx0 *= f;\n\t\t\t\t\ty0 *= f;\n\t\t\t\t\tz0 *= f;\n\t\t\t\t\tw0 *= f;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdst[ dstOffset ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( Quaternion.prototype, {\n\n\t\tx: {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this._x;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis._x = value;\n\t\t\t\tthis.onChangeCallback();\n\n\t\t\t}\n\n\t\t},\n\n\t\ty: {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this._y;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis._y = value;\n\t\t\t\tthis.onChangeCallback();\n\n\t\t\t}\n\n\t\t},\n\n\t\tz: {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this._z;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis._z = value;\n\t\t\t\tthis.onChangeCallback();\n\n\t\t\t}\n\n\t\t},\n\n\t\tw: {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this._w;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis._w = value;\n\t\t\t\tthis.onChangeCallback();\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Quaternion.prototype, {\n\n\t\tset: function ( x, y, z, w ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._w = w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t\t},\n\n\t\tcopy: function ( quaternion ) {\n\n\t\t\tthis._x = quaternion.x;\n\t\t\tthis._y = quaternion.y;\n\t\t\tthis._z = quaternion.z;\n\t\t\tthis._w = quaternion.w;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromEuler: function ( euler, update ) {\n\n\t\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\t\tthrow new Error( 'THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\tvar x = euler._x, y = euler._y, z = euler._z, order = euler.order;\n\n\t\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t\t//\tcontent/SpinCalc.m\n\n\t\t\tvar cos = Math.cos;\n\t\t\tvar sin = Math.sin;\n\n\t\t\tvar c1 = cos( x / 2 );\n\t\t\tvar c2 = cos( y / 2 );\n\t\t\tvar c3 = cos( z / 2 );\n\n\t\t\tvar s1 = sin( x / 2 );\n\t\t\tvar s2 = sin( y / 2 );\n\t\t\tvar s3 = sin( z / 2 );\n\n\t\t\tif ( order === 'XYZ' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'YZX' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\n\t\t\t} else if ( order === 'XZY' ) {\n\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\n\t\t\t}\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tvar halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\t\tthis._x = axis.x * s;\n\t\t\tthis._y = axis.y * s;\n\t\t\tthis._z = axis.z * s;\n\t\t\tthis._w = Math.cos( halfAngle );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m ) {\n\n\t\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements,\n\n\t\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\t\ttrace = m11 + m22 + m33,\n\t\t\t\ts;\n\n\t\t\tif ( trace > 0 ) {\n\n\t\t\t\ts = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\t\tthis._w = 0.25 / s;\n\t\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\t\tthis._x = 0.25 * s;\n\t\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t\t} else if ( m22 > m33 ) {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\t\tthis._y = 0.25 * s;\n\t\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t\t} else {\n\n\t\t\t\ts = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\t\tthis._z = 0.25 * s;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromUnitVectors: function () {\n\n\t\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar r;\n\n\t\t\tvar EPS = 0.000001;\n\n\t\t\treturn function setFromUnitVectors( vFrom, vTo ) {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\n\t\t\t\tr = vFrom.dot( vTo ) + 1;\n\n\t\t\t\tif ( r < EPS ) {\n\n\t\t\t\t\tr = 0;\n\n\t\t\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\t\t\tv1.set( - vFrom.y, vFrom.x, 0 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv1.set( 0, - vFrom.z, vFrom.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tv1.crossVectors( vFrom, vTo );\n\n\t\t\t\t}\n\n\t\t\t\tthis._x = v1.x;\n\t\t\t\tthis._y = v1.y;\n\t\t\t\tthis._z = v1.z;\n\t\t\t\tthis._w = r;\n\n\t\t\t\treturn this.normalize();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tinverse: function () {\n\n\t\t\treturn this.conjugate().normalize();\n\n\t\t},\n\n\t\tconjugate: function () {\n\n\t\t\tthis._x *= - 1;\n\t\t\tthis._y *= - 1;\n\t\t\tthis._z *= - 1;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t\t},\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tvar l = this.length();\n\n\t\t\tif ( l === 0 ) {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = 0;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = 1;\n\n\t\t\t} else {\n\n\t\t\t\tl = 1 / l;\n\n\t\t\t\tthis._x = this._x * l;\n\t\t\t\tthis._y = this._y * l;\n\t\t\t\tthis._z = this._z * l;\n\t\t\t\tthis._w = this._w * l;\n\n\t\t\t}\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( q, p ) {\n\n\t\t\tif ( p !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead.' );\n\t\t\t\treturn this.multiplyQuaternions( q, p );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyQuaternions( this, q );\n\n\t\t},\n\n\t\tpremultiply: function ( q ) {\n\n\t\t\treturn this.multiplyQuaternions( q, this );\n\n\t\t},\n\n\t\tmultiplyQuaternions: function ( a, b ) {\n\n\t\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\t\tvar qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\t\tvar qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tslerp: function ( qb, t ) {\n\n\t\t\tif ( t === 0 ) return this;\n\t\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\t\tvar x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\t\tvar cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\t\tthis._w = - qb._w;\n\t\t\t\tthis._x = - qb._x;\n\t\t\t\tthis._y = - qb._y;\n\t\t\t\tthis._z = - qb._z;\n\n\t\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t\t} else {\n\n\t\t\t\tthis.copy( qb );\n\n\t\t\t}\n\n\t\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\t\tthis._w = w;\n\t\t\t\tthis._x = x;\n\t\t\t\tthis._y = y;\n\t\t\t\tthis._z = z;\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar sinHalfTheta = Math.sqrt( 1.0 - cosHalfTheta * cosHalfTheta );\n\n\t\t\tif ( Math.abs( sinHalfTheta ) < 0.001 ) {\n\n\t\t\t\tthis._w = 0.5 * ( w + this._w );\n\t\t\t\tthis._x = 0.5 * ( x + this._x );\n\t\t\t\tthis._y = 0.5 * ( y + this._y );\n\t\t\t\tthis._z = 0.5 * ( z + this._z );\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\t\tvar ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( quaternion ) {\n\n\t\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis._x = array[ offset ];\n\t\t\tthis._y = array[ offset + 1 ];\n\t\t\tthis._z = array[ offset + 2 ];\n\t\t\tthis._w = array[ offset + 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._w;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author kile / http://kile.stravaganza.org/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author egraether / http://egraether.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Vector3( x, y, z ) {\n\n\t\tthis.x = x || 0;\n\t\tthis.y = y || 0;\n\t\tthis.z = z || 0;\n\n\t}\n\n\tObject.assign( Vector3.prototype, {\n\n\t\tisVector3: true,\n\n\t\tset: function ( x, y, z ) {\n\n\t\t\tthis.x = x;\n\t\t\tthis.y = y;\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.x = scalar;\n\t\t\tthis.y = scalar;\n\t\t\tthis.z = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetX: function ( x ) {\n\n\t\t\tthis.x = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( y ) {\n\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( z ) {\n\n\t\t\tthis.z = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponent: function ( index, value ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: this.x = value; break;\n\t\t\t\tcase 1: this.y = value; break;\n\t\t\t\tcase 2: this.z = value; break;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetComponent: function ( index ) {\n\n\t\t\tswitch ( index ) {\n\n\t\t\t\tcase 0: return this.x;\n\t\t\t\tcase 1: return this.y;\n\t\t\t\tcase 2: return this.z;\n\t\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t\t},\n\n\t\tcopy: function ( v ) {\n\n\t\t\tthis.x = v.x;\n\t\t\tthis.y = v.y;\n\t\t\tthis.z = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead.' );\n\t\t\t\treturn this.addVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x += v.x;\n\t\t\tthis.y += v.y;\n\t\t\tthis.z += v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.x += s;\n\t\t\tthis.y += s;\n\t\t\tthis.z += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x + b.x;\n\t\t\tthis.y = a.y + b.y;\n\t\t\tthis.z = a.z + b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScaledVector: function ( v, s ) {\n\n\t\t\tthis.x += v.x * s;\n\t\t\tthis.y += v.y * s;\n\t\t\tthis.z += v.z * s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead.' );\n\t\t\t\treturn this.subVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x -= v.x;\n\t\t\tthis.y -= v.y;\n\t\t\tthis.z -= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubScalar: function ( s ) {\n\n\t\t\tthis.x -= s;\n\t\t\tthis.y -= s;\n\t\t\tthis.z -= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsubVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x - b.x;\n\t\t\tthis.y = a.y - b.y;\n\t\t\tthis.z = a.z - b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead.' );\n\t\t\t\treturn this.multiplyVectors( v, w );\n\n\t\t\t}\n\n\t\t\tthis.x *= v.x;\n\t\t\tthis.y *= v.y;\n\t\t\tthis.z *= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( scalar ) {\n\n\t\t\tthis.x *= scalar;\n\t\t\tthis.y *= scalar;\n\t\t\tthis.z *= scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyVectors: function ( a, b ) {\n\n\t\t\tthis.x = a.x * b.x;\n\t\t\tthis.y = a.y * b.y;\n\t\t\tthis.z = a.z * b.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyEuler: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function applyEuler( euler ) {\n\n\t\t\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromEuler( euler ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyAxisAngle: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function applyAxisAngle( axis, angle ) {\n\n\t\t\t\treturn this.applyQuaternion( quaternion.setFromAxisAngle( axis, angle ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix3: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( m ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tvar w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ]  * z + e[ 12 ] ) * w;\n\t\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ]  * z + e[ 13 ] ) * w;\n\t\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyQuaternion: function ( q ) {\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t\t// calculate quat * vector\n\n\t\t\tvar ix =  qw * x + qy * z - qz * y;\n\t\t\tvar iy =  qw * y + qz * x - qx * z;\n\t\t\tvar iz =  qw * z + qx * y - qy * x;\n\t\t\tvar iw = - qx * x - qy * y - qz * z;\n\n\t\t\t// calculate result * inverse quat\n\n\t\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tproject: function () {\n\n\t\t\tvar matrix = new Matrix4();\n\n\t\t\treturn function project( camera ) {\n\n\t\t\t\tmatrix.multiplyMatrices( camera.projectionMatrix, matrix.getInverse( camera.matrixWorld ) );\n\t\t\t\treturn this.applyMatrix4( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tunproject: function () {\n\n\t\t\tvar matrix = new Matrix4();\n\n\t\t\treturn function unproject( camera ) {\n\n\t\t\t\tmatrix.multiplyMatrices( camera.matrixWorld, matrix.getInverse( camera.projectionMatrix ) );\n\t\t\t\treturn this.applyMatrix4( matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttransformDirection: function ( m ) {\n\n\t\t\t// input: THREE.Matrix4 affine matrix\n\t\t\t// vector interpreted as a direction\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ]  * z;\n\t\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ]  * z;\n\t\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\t\treturn this.normalize();\n\n\t\t},\n\n\t\tdivide: function ( v ) {\n\n\t\t\tthis.x /= v.x;\n\t\t\tthis.y /= v.y;\n\t\t\tthis.z /= v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdivideScalar: function ( scalar ) {\n\n\t\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t\t},\n\n\t\tmin: function ( v ) {\n\n\t\t\tthis.x = Math.min( this.x, v.x );\n\t\t\tthis.y = Math.min( this.y, v.y );\n\t\t\tthis.z = Math.min( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmax: function ( v ) {\n\n\t\t\tthis.x = Math.max( this.x, v.x );\n\t\t\tthis.y = Math.max( this.y, v.y );\n\t\t\tthis.z = Math.max( this.z, v.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclamp: function ( min, max ) {\n\n\t\t\t// assumes min < max, componentwise\n\n\t\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclampScalar: function () {\n\n\t\t\tvar min = new Vector3();\n\t\t\tvar max = new Vector3();\n\n\t\t\treturn function clampScalar( minVal, maxVal ) {\n\n\t\t\t\tmin.set( minVal, minVal, minVal );\n\t\t\t\tmax.set( maxVal, maxVal, maxVal );\n\n\t\t\t\treturn this.clamp( min, max );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclampLength: function ( min, max ) {\n\n\t\t\tvar length = this.length();\n\n\t\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t\t},\n\n\t\tfloor: function () {\n\n\t\t\tthis.x = Math.floor( this.x );\n\t\t\tthis.y = Math.floor( this.y );\n\t\t\tthis.z = Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tceil: function () {\n\n\t\t\tthis.x = Math.ceil( this.x );\n\t\t\tthis.y = Math.ceil( this.y );\n\t\t\tthis.z = Math.ceil( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tround: function () {\n\n\t\t\tthis.x = Math.round( this.x );\n\t\t\tthis.y = Math.round( this.y );\n\t\t\tthis.z = Math.round( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\troundToZero: function () {\n\n\t\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.x = - this.x;\n\t\t\tthis.y = - this.y;\n\t\t\tthis.z = - this.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdot: function ( v ) {\n\n\t\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t\t},\n\n\t\t// TODO lengthSquared?\n\n\t\tlengthSq: function () {\n\n\t\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t\t},\n\n\t\tlength: function () {\n\n\t\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t\t},\n\n\t\tlengthManhattan: function () {\n\n\t\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\treturn this.divideScalar( this.length() || 1 );\n\n\t\t},\n\n\t\tsetLength: function ( length ) {\n\n\t\t\treturn this.normalize().multiplyScalar( length );\n\n\t\t},\n\n\t\tlerp: function ( v, alpha ) {\n\n\t\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerpVectors: function ( v1, v2, alpha ) {\n\n\t\t\treturn this.subVectors( v2, v1 ).multiplyScalar( alpha ).add( v1 );\n\n\t\t},\n\n\t\tcross: function ( v, w ) {\n\n\t\t\tif ( w !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead.' );\n\t\t\t\treturn this.crossVectors( v, w );\n\n\t\t\t}\n\n\t\t\tvar x = this.x, y = this.y, z = this.z;\n\n\t\t\tthis.x = y * v.z - z * v.y;\n\t\t\tthis.y = z * v.x - x * v.z;\n\t\t\tthis.z = x * v.y - y * v.x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossVectors: function ( a, b ) {\n\n\t\t\tvar ax = a.x, ay = a.y, az = a.z;\n\t\t\tvar bx = b.x, by = b.y, bz = b.z;\n\n\t\t\tthis.x = ay * bz - az * by;\n\t\t\tthis.y = az * bx - ax * bz;\n\t\t\tthis.z = ax * by - ay * bx;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tprojectOnVector: function ( vector ) {\n\n\t\t\tvar scalar = vector.dot( this ) / vector.lengthSq();\n\n\t\t\treturn this.copy( vector ).multiplyScalar( scalar );\n\n\t\t},\n\n\t\tprojectOnPlane: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function projectOnPlane( planeNormal ) {\n\n\t\t\t\tv1.copy( this ).projectOnVector( planeNormal );\n\n\t\t\t\treturn this.sub( v1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\treflect: function () {\n\n\t\t\t// reflect incident vector off plane orthogonal to normal\n\t\t\t// normal is assumed to have unit length\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function reflect( normal ) {\n\n\t\t\t\treturn this.sub( v1.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tangleTo: function ( v ) {\n\n\t\t\tvar theta = this.dot( v ) / ( Math.sqrt( this.lengthSq() * v.lengthSq() ) );\n\n\t\t\t// clamp, to handle numerical problems\n\n\t\t\treturn Math.acos( _Math.clamp( theta, - 1, 1 ) );\n\n\t\t},\n\n\t\tdistanceTo: function ( v ) {\n\n\t\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t\t},\n\n\t\tdistanceToSquared: function ( v ) {\n\n\t\t\tvar dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t\t},\n\n\t\tdistanceToManhattan: function ( v ) {\n\n\t\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t\t},\n\n\t\tsetFromSpherical: function ( s ) {\n\n\t\t\tvar sinPhiRadius = Math.sin( s.phi ) * s.radius;\n\n\t\t\tthis.x = sinPhiRadius * Math.sin( s.theta );\n\t\t\tthis.y = Math.cos( s.phi ) * s.radius;\n\t\t\tthis.z = sinPhiRadius * Math.cos( s.theta );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCylindrical: function ( c ) {\n\n\t\t\tthis.x = c.radius * Math.sin( c.theta );\n\t\t\tthis.y = c.y;\n\t\t\tthis.z = c.radius * Math.cos( c.theta );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixPosition: function ( m ) {\n\n\t\t\tvar e = m.elements;\n\n\t\t\tthis.x = e[ 12 ];\n\t\t\tthis.y = e[ 13 ];\n\t\t\tthis.z = e[ 14 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixScale: function ( m ) {\n\n\t\t\tvar sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\t\tvar sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\t\tvar sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\tthis.x = sx;\n\t\t\tthis.y = sy;\n\t\t\tthis.z = sz;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrixColumn: function ( m, index ) {\n\n\t\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t\t},\n\n\t\tequals: function ( v ) {\n\n\t\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.x = array[ offset ];\n\t\t\tthis.y = array[ offset + 1 ];\n\t\t\tthis.z = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.x;\n\t\t\tarray[ offset + 1 ] = this.y;\n\t\t\tarray[ offset + 2 ] = this.z;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tfromBufferAttribute: function ( attribute, index, offset ) {\n\n\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Vector3: offset has been removed from .fromBufferAttribute().' );\n\n\t\t\t}\n\n\t\t\tthis.x = attribute.getX( index );\n\t\t\tthis.y = attribute.getY( index );\n\t\t\tthis.z = attribute.getZ( index );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author philogb / http://blog.thejit.org/\n\t * @author jordi_ros / http://plattsoft.com\n\t * @author D1plo1d / http://github.com/D1plo1d\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author timknip / http://www.floorplanner.com/\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Matrix4() {\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t];\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tObject.assign( Matrix4.prototype, {\n\n\t\tisMatrix4: true,\n\n\t\tset: function ( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, 1, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new Matrix4().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = m.elements;\n\n\t\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyPosition: function ( m ) {\n\n\t\t\tvar te = this.elements, me = m.elements;\n\n\t\t\tte[ 12 ] = me[ 12 ];\n\t\t\tte[ 13 ] = me[ 13 ];\n\t\t\tte[ 14 ] = me[ 14 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeBasis: function ( xAxis, yAxis, zAxis ) {\n\n\t\t\tthis.set(\n\t\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t\t0,       0,       0,       1\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\textractRotation: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function extractRotation( m ) {\n\n\t\t\t\tvar te = this.elements;\n\t\t\t\tvar me = m.elements;\n\n\t\t\t\tvar scaleX = 1 / v1.setFromMatrixColumn( m, 0 ).length();\n\t\t\t\tvar scaleY = 1 / v1.setFromMatrixColumn( m, 1 ).length();\n\t\t\t\tvar scaleZ = 1 / v1.setFromMatrixColumn( m, 2 ).length();\n\n\t\t\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\t\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\t\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\n\t\t\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\t\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\t\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\n\t\t\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\t\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\t\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakeRotationFromEuler: function ( euler ) {\n\n\t\t\tif ( ! ( euler && euler.isEuler ) ) {\n\n\t\t\t\tconsole.error( 'THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.' );\n\n\t\t\t}\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = euler.x, y = euler.y, z = euler.z;\n\t\t\tvar a = Math.cos( x ), b = Math.sin( x );\n\t\t\tvar c = Math.cos( y ), d = Math.sin( y );\n\t\t\tvar e = Math.cos( z ), f = Math.sin( z );\n\n\t\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - c * f;\n\t\t\t\tte[ 8 ] = d;\n\n\t\t\t\tte[ 1 ] = af + be * d;\n\t\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\t\tte[ 9 ] = - b * c;\n\n\t\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\t\tte[ 6 ] = be + af * d;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce + df * b;\n\t\t\t\tte[ 4 ] = de * b - cf;\n\t\t\t\tte[ 8 ] = a * d;\n\n\t\t\t\tte[ 1 ] = a * f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b;\n\n\t\t\t\tte[ 2 ] = cf * b - de;\n\t\t\t\tte[ 6 ] = df + ce * b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\t\tvar ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\t\tte[ 0 ] = ce - df * b;\n\t\t\t\tte[ 4 ] = - a * f;\n\t\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\t\tte[ 1 ] = cf + de * b;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\t\tte[ 2 ] = - a * d;\n\t\t\t\tte[ 6 ] = b;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\t\tvar ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = be * d - af;\n\t\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\t\tte[ 1 ] = c * f;\n\t\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\t\tte[ 2 ] = - d;\n\t\t\t\tte[ 6 ] = b * c;\n\t\t\t\tte[ 10 ] = a * c;\n\n\t\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\t\tte[ 1 ] = f;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = - b * e;\n\n\t\t\t\tte[ 2 ] = - d * e;\n\t\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\t\tvar ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\t\tte[ 0 ] = c * e;\n\t\t\t\tte[ 4 ] = - f;\n\t\t\t\tte[ 8 ] = d * e;\n\n\t\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\t\tte[ 5 ] = a * e;\n\t\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\t\tte[ 6 ] = b * e;\n\t\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t\t}\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationFromQuaternion: function ( q ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar x = q._x, y = q._y, z = q._z, w = q._w;\n\t\t\tvar x2 = x + x, y2 = y + y, z2 = z + z;\n\t\t\tvar xx = x * x2, xy = x * y2, xz = x * z2;\n\t\t\tvar yy = y * y2, yz = y * z2, zz = z * z2;\n\t\t\tvar wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\t\tte[ 0 ] = 1 - ( yy + zz );\n\t\t\tte[ 4 ] = xy - wz;\n\t\t\tte[ 8 ] = xz + wy;\n\n\t\t\tte[ 1 ] = xy + wz;\n\t\t\tte[ 5 ] = 1 - ( xx + zz );\n\t\t\tte[ 9 ] = yz - wx;\n\n\t\t\tte[ 2 ] = xz - wy;\n\t\t\tte[ 6 ] = yz + wx;\n\t\t\tte[ 10 ] = 1 - ( xx + yy );\n\n\t\t\t// last column\n\t\t\tte[ 3 ] = 0;\n\t\t\tte[ 7 ] = 0;\n\t\t\tte[ 11 ] = 0;\n\n\t\t\t// bottom row\n\t\t\tte[ 12 ] = 0;\n\t\t\tte[ 13 ] = 0;\n\t\t\tte[ 14 ] = 0;\n\t\t\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlookAt: function () {\n\n\t\t\tvar x = new Vector3();\n\t\t\tvar y = new Vector3();\n\t\t\tvar z = new Vector3();\n\n\t\t\treturn function lookAt( eye, target, up ) {\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tz.subVectors( eye, target );\n\n\t\t\t\tif ( z.lengthSq() === 0 ) {\n\n\t\t\t\t\t// eye and target are in the same position\n\n\t\t\t\t\tz.z = 1;\n\n\t\t\t\t}\n\n\t\t\t\tz.normalize();\n\t\t\t\tx.crossVectors( up, z );\n\n\t\t\t\tif ( x.lengthSq() === 0 ) {\n\n\t\t\t\t\t// up and z are parallel\n\n\t\t\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t\t\tz.x += 0.0001;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tz.z += 0.0001;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tz.normalize();\n\t\t\t\t\tx.crossVectors( up, z );\n\n\t\t\t\t}\n\n\t\t\t\tx.normalize();\n\t\t\t\ty.crossVectors( z, x );\n\n\t\t\t\tte[ 0 ] = x.x; te[ 4 ] = y.x; te[ 8 ] = z.x;\n\t\t\t\tte[ 1 ] = x.y; te[ 5 ] = y.y; te[ 9 ] = z.y;\n\t\t\t\tte[ 2 ] = x.z; te[ 6 ] = y.z; te[ 10 ] = z.z;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiply: function ( m, n ) {\n\n\t\t\tif ( n !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead.' );\n\t\t\t\treturn this.multiplyMatrices( m, n );\n\n\t\t\t}\n\n\t\t\treturn this.multiplyMatrices( this, m );\n\n\t\t},\n\n\t\tpremultiply: function ( m ) {\n\n\t\t\treturn this.multiplyMatrices( m, this );\n\n\t\t},\n\n\t\tmultiplyMatrices: function ( a, b ) {\n\n\t\t\tvar ae = a.elements;\n\t\t\tvar be = b.elements;\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\t\tvar a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\t\tvar a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\t\tvar a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\t\tvar b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\t\tvar b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\t\tvar b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\t\tvar b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToBufferAttribute: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function applyToBufferAttribute( attribute ) {\n\n\t\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tv1.x = attribute.getX( i );\n\t\t\t\t\tv1.y = attribute.getY( i );\n\t\t\t\t\tv1.z = attribute.getZ( i );\n\n\t\t\t\t\tv1.applyMatrix4( this );\n\n\t\t\t\t\tattribute.setXYZ( i, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn attribute;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\t\tvar n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\t\tvar n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\t\tvar n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t\t//TODO: make this more efficient\n\t\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\t\treturn (\n\t\t\t\tn41 * (\n\t\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t\t - n13 * n24 * n32\n\t\t\t\t\t - n14 * n22 * n33\n\t\t\t\t\t + n12 * n24 * n33\n\t\t\t\t\t + n13 * n22 * n34\n\t\t\t\t\t - n12 * n23 * n34\n\t\t\t\t) +\n\t\t\t\tn42 * (\n\t\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t\t - n11 * n24 * n33\n\t\t\t\t\t + n14 * n21 * n33\n\t\t\t\t\t - n13 * n21 * n34\n\t\t\t\t\t + n13 * n24 * n31\n\t\t\t\t\t - n14 * n23 * n31\n\t\t\t\t) +\n\t\t\t\tn43 * (\n\t\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t\t - n11 * n22 * n34\n\t\t\t\t\t - n14 * n21 * n32\n\t\t\t\t\t + n12 * n21 * n34\n\t\t\t\t\t + n14 * n22 * n31\n\t\t\t\t\t - n12 * n24 * n31\n\t\t\t\t) +\n\t\t\t\tn44 * (\n\t\t\t\t\t- n13 * n22 * n31\n\t\t\t\t\t - n11 * n23 * n32\n\t\t\t\t\t + n11 * n22 * n33\n\t\t\t\t\t + n13 * n21 * n32\n\t\t\t\t\t - n12 * n21 * n33\n\t\t\t\t\t + n12 * n23 * n31\n\t\t\t\t)\n\n\t\t\t);\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar tmp;\n\n\t\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPosition: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 12 ] = v.x;\n\t\t\tte[ 13 ] = v.y;\n\t\t\tte[ 14 ] = v.z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetInverse: function ( m, throwOnDegenerate ) {\n\n\t\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\t\tvar te = this.elements,\n\t\t\t\tme = m.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ], n41 = me[ 3 ],\n\t\t\t\tn12 = me[ 4 ], n22 = me[ 5 ], n32 = me[ 6 ], n42 = me[ 7 ],\n\t\t\t\tn13 = me[ 8 ], n23 = me[ 9 ], n33 = me[ 10 ], n43 = me[ 11 ],\n\t\t\t\tn14 = me[ 12 ], n24 = me[ 13 ], n34 = me[ 14 ], n44 = me[ 15 ],\n\n\t\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\t\tvar det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\t\tte[ 4 ] = t12 * detInv;\n\t\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\t\tte[ 8 ] = t13 * detInv;\n\t\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\t\tte[ 12 ] = t14 * detInv;\n\t\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tscale: function ( v ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = v.x, y = v.y, z = v.z;\n\n\t\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetMaxScaleOnAxis: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\t\tvar scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\t\tvar scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t\t},\n\n\t\tmakeTranslation: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationX: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0,  0, 0,\n\t\t\t\t0, c, - s, 0,\n\t\t\t\t0, s,  c, 0,\n\t\t\t\t0, 0,  0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationY: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\t c, 0, s, 0,\n\t\t\t\t 0, 1, 0, 0,\n\t\t\t\t- s, 0, c, 0,\n\t\t\t\t 0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationZ: function ( theta ) {\n\n\t\t\tvar c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\t\tthis.set(\n\n\t\t\t\tc, - s, 0, 0,\n\t\t\t\ts,  c, 0, 0,\n\t\t\t\t0,  0, 1, 0,\n\t\t\t\t0,  0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeRotationAxis: function ( axis, angle ) {\n\n\t\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\t\tvar c = Math.cos( angle );\n\t\t\tvar s = Math.sin( angle );\n\t\t\tvar t = 1 - c;\n\t\t\tvar x = axis.x, y = axis.y, z = axis.z;\n\t\t\tvar tx = t * x, ty = t * y;\n\n\t\t\tthis.set(\n\n\t\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\t return this;\n\n\t\t},\n\n\t\tmakeScale: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\tx, 0, 0, 0,\n\t\t\t\t0, y, 0, 0,\n\t\t\t\t0, 0, z, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeShear: function ( x, y, z ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, y, z, 0,\n\t\t\t\tx, 1, z, 0,\n\t\t\t\tx, y, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcompose: function ( position, quaternion, scale ) {\n\n\t\t\tthis.makeRotationFromQuaternion( quaternion );\n\t\t\tthis.scale( scale );\n\t\t\tthis.setPosition( position );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdecompose: function () {\n\n\t\t\tvar vector = new Vector3();\n\t\t\tvar matrix = new Matrix4();\n\n\t\t\treturn function decompose( position, quaternion, scale ) {\n\n\t\t\t\tvar te = this.elements;\n\n\t\t\t\tvar sx = vector.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\t\t\tvar sy = vector.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\t\t\tvar sz = vector.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t\t\t// if determine is negative, we need to invert one scale\n\t\t\t\tvar det = this.determinant();\n\t\t\t\tif ( det < 0 ) sx = - sx;\n\n\t\t\t\tposition.x = te[ 12 ];\n\t\t\t\tposition.y = te[ 13 ];\n\t\t\t\tposition.z = te[ 14 ];\n\n\t\t\t\t// scale the rotation part\n\t\t\t\tmatrix.copy( this );\n\n\t\t\t\tvar invSX = 1 / sx;\n\t\t\t\tvar invSY = 1 / sy;\n\t\t\t\tvar invSZ = 1 / sz;\n\n\t\t\t\tmatrix.elements[ 0 ] *= invSX;\n\t\t\t\tmatrix.elements[ 1 ] *= invSX;\n\t\t\t\tmatrix.elements[ 2 ] *= invSX;\n\n\t\t\t\tmatrix.elements[ 4 ] *= invSY;\n\t\t\t\tmatrix.elements[ 5 ] *= invSY;\n\t\t\t\tmatrix.elements[ 6 ] *= invSY;\n\n\t\t\t\tmatrix.elements[ 8 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 9 ] *= invSZ;\n\t\t\t\tmatrix.elements[ 10 ] *= invSZ;\n\n\t\t\t\tquaternion.setFromRotationMatrix( matrix );\n\n\t\t\t\tscale.x = sx;\n\t\t\t\tscale.y = sy;\n\t\t\t\tscale.z = sz;\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmakePerspective: function ( left, right, top, bottom, near, far ) {\n\n\t\t\tif ( far === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.' );\n\n\t\t\t}\n\n\t\t\tvar te = this.elements;\n\t\t\tvar x = 2 * near / ( right - left );\n\t\t\tvar y = 2 * near / ( top - bottom );\n\n\t\t\tvar a = ( right + left ) / ( right - left );\n\t\t\tvar b = ( top + bottom ) / ( top - bottom );\n\t\t\tvar c = - ( far + near ) / ( far - near );\n\t\t\tvar d = - 2 * far * near / ( far - near );\n\n\t\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeOrthographic: function ( left, right, top, bottom, near, far ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar w = 1.0 / ( right - left );\n\t\t\tvar h = 1.0 / ( top - bottom );\n\t\t\tvar p = 1.0 / ( far - near );\n\n\t\t\tvar x = ( right + left ) * w;\n\t\t\tvar y = ( top + bottom ) * h;\n\t\t\tvar z = ( far + near ) * p;\n\n\t\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( matrix ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = matrix.elements;\n\n\t\t\tfor ( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor ( var i = 0; i < 16; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DataTexture( data, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n\tDataTexture.prototype = Object.create( Texture.prototype );\n\tDataTexture.prototype.constructor = DataTexture;\n\n\tDataTexture.prototype.isDataTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTexture( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tTexture.call( this, images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tCubeTexture.prototype = Object.create( Texture.prototype );\n\tCubeTexture.prototype.constructor = CubeTexture;\n\n\tCubeTexture.prototype.isCubeTexture = true;\n\n\tObject.defineProperty( CubeTexture.prototype, 'images', {\n\n\t\tget: function () {\n\n\t\t\treturn this.image;\n\n\t\t},\n\n\t\tset: function ( value ) {\n\n\t\t\tthis.image = value;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t *\n\t * Uniforms of a program.\n\t * Those form a tree structure with a special top-level container for the root,\n\t * which you get by calling 'new WebGLUniforms( gl, program, renderer )'.\n\t *\n\t *\n\t * Properties of inner nodes including the top-level container:\n\t *\n\t * .seq - array of nested uniforms\n\t * .map - nested uniforms by name\n\t *\n\t *\n\t * Methods of all nodes except the top-level container:\n\t *\n\t * .setValue( gl, value, [renderer] )\n\t *\n\t * \t\tuploads a uniform value(s)\n\t *  \tthe 'renderer' parameter is needed for sampler uniforms\n\t *\n\t *\n\t * Static methods of the top-level container (renderer factorizations):\n\t *\n\t * .upload( gl, seq, values, renderer )\n\t *\n\t * \t\tsets uniforms in 'seq' to 'values[id].value'\n\t *\n\t * .seqWithValue( seq, values ) : filteredSeq\n\t *\n\t * \t\tfilters 'seq' entries with corresponding entry in values\n\t *\n\t *\n\t * Methods of the top-level container (renderer factorizations):\n\t *\n\t * .setValue( gl, name, value )\n\t *\n\t * \t\tsets uniform with  name 'name' to 'value'\n\t *\n\t * .set( gl, obj, prop )\n\t *\n\t * \t\tsets uniform from object and property with same name than uniform\n\t *\n\t * .setOptional( gl, obj, prop )\n\t *\n\t * \t\tlike .set for an optional property of the object\n\t *\n\t */\n\n\tvar emptyTexture = new Texture();\n\tvar emptyCubeTexture = new CubeTexture();\n\n\t// --- Base for inner nodes (including the root) ---\n\n\tfunction UniformContainer() {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\t// --- Utilities ---\n\n\t// Array Caches (provide typed arrays for temporary by size)\n\n\tvar arrayCacheF32 = [];\n\tvar arrayCacheI32 = [];\n\n\t// Float32Array caches used for uploading Matrix uniforms\n\n\tvar mat4array = new Float32Array( 16 );\n\tvar mat3array = new Float32Array( 9 );\n\n\t// Flattening for arrays of vectors and matrices\n\n\tfunction flatten( array, nBlocks, blockSize ) {\n\n\t\tvar firstElem = array[ 0 ];\n\n\t\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t\t// unoptimized: ! isNaN( firstElem )\n\t\t// see http://jacksondunstan.com/articles/983\n\n\t\tvar n = nBlocks * blockSize,\n\t\t\tr = arrayCacheF32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Float32Array( n );\n\t\t\tarrayCacheF32[ n ] = r;\n\n\t\t}\n\n\t\tif ( nBlocks !== 0 ) {\n\n\t\t\tfirstElem.toArray( r, 0 );\n\n\t\t\tfor ( var i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\t\toffset += blockSize;\n\t\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n\t// Texture unit allocation\n\n\tfunction allocTexUnits( renderer, n ) {\n\n\t\tvar r = arrayCacheI32[ n ];\n\n\t\tif ( r === undefined ) {\n\n\t\t\tr = new Int32Array( n );\n\t\t\tarrayCacheI32[ n ] = r;\n\n\t\t}\n\n\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\tr[ i ] = renderer.allocTextureUnit();\n\n\t\treturn r;\n\n\t}\n\n\t// --- Setters ---\n\n\t// Note: Defining these methods externally, because they come in a bunch\n\t// and this way their names minify.\n\n\t// Single scalar\n\n\tfunction setValue1f( gl, v ) { gl.uniform1f( this.addr, v ); }\n\tfunction setValue1i( gl, v ) { gl.uniform1i( this.addr, v ); }\n\n\t// Single float vector (from flat array or THREE.VectorN)\n\n\tfunction setValue2fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform2fv( this.addr, v );\n\t\telse gl.uniform2f( this.addr, v.x, v.y );\n\n\t}\n\n\tfunction setValue3fv( gl, v ) {\n\n\t\tif ( v.x !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\t\telse if ( v.r !== undefined )\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\t\telse\n\t\t\tgl.uniform3fv( this.addr, v );\n\n\t}\n\n\tfunction setValue4fv( gl, v ) {\n\n\t\tif ( v.x === undefined ) gl.uniform4fv( this.addr, v );\n\t\telse gl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t}\n\n\t// Single matrix (from flat array or MatrixN)\n\n\tfunction setValue2fm( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v.elements || v );\n\n\t}\n\n\tfunction setValue3fm( gl, v ) {\n\n\t\tif ( v.elements === undefined ) {\n\n\t\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\t} else {\n\n\t\t\tmat3array.set( v.elements );\n\t\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\t}\n\n\t}\n\n\tfunction setValue4fm( gl, v ) {\n\n\t\tif ( v.elements === undefined ) {\n\n\t\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\t} else {\n\n\t\t\tmat4array.set( v.elements );\n\t\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\t}\n\n\t}\n\n\t// Single texture (2D / Cube)\n\n\tfunction setValueT1( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTexture2D( v || emptyTexture, unit );\n\n\t}\n\n\tfunction setValueT6( gl, v, renderer ) {\n\n\t\tvar unit = renderer.allocTextureUnit();\n\t\tgl.uniform1i( this.addr, unit );\n\t\trenderer.setTextureCube( v || emptyCubeTexture, unit );\n\n\t}\n\n\t// Integer / Boolean vectors or arrays thereof (always flat arrays)\n\n\tfunction setValue2iv( gl, v ) { gl.uniform2iv( this.addr, v ); }\n\tfunction setValue3iv( gl, v ) { gl.uniform3iv( this.addr, v ); }\n\tfunction setValue4iv( gl, v ) { gl.uniform4iv( this.addr, v ); }\n\n\t// Helper to pick the right setter for the singular case\n\n\tfunction getSingularSetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1f; // FLOAT\n\t\t\tcase 0x8b50: return setValue2fv; // _VEC2\n\t\t\tcase 0x8b51: return setValue3fv; // _VEC3\n\t\t\tcase 0x8b52: return setValue4fv; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValue2fm; // _MAT2\n\t\t\tcase 0x8b5b: return setValue3fm; // _MAT3\n\t\t\tcase 0x8b5c: return setValue4fm; // _MAT4\n\n\t\t\tcase 0x8b5e: case 0x8d66: return setValueT1; // SAMPLER_2D, SAMPLER_EXTERNAL_OES\n\t\t\tcase 0x8b60: return setValueT6; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1i; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// Array of scalars\n\n\tfunction setValue1fv( gl, v ) { gl.uniform1fv( this.addr, v ); }\n\tfunction setValue1iv( gl, v ) { gl.uniform1iv( this.addr, v ); }\n\n\t// Array of vectors (flat or from THREE classes)\n\n\tfunction setValueV2a( gl, v ) {\n\n\t\tgl.uniform2fv( this.addr, flatten( v, this.size, 2 ) );\n\n\t}\n\n\tfunction setValueV3a( gl, v ) {\n\n\t\tgl.uniform3fv( this.addr, flatten( v, this.size, 3 ) );\n\n\t}\n\n\tfunction setValueV4a( gl, v ) {\n\n\t\tgl.uniform4fv( this.addr, flatten( v, this.size, 4 ) );\n\n\t}\n\n\t// Array of matrices (flat or from THREE clases)\n\n\tfunction setValueM2a( gl, v ) {\n\n\t\tgl.uniformMatrix2fv( this.addr, false, flatten( v, this.size, 4 ) );\n\n\t}\n\n\tfunction setValueM3a( gl, v ) {\n\n\t\tgl.uniformMatrix3fv( this.addr, false, flatten( v, this.size, 9 ) );\n\n\t}\n\n\tfunction setValueM4a( gl, v ) {\n\n\t\tgl.uniformMatrix4fv( this.addr, false, flatten( v, this.size, 16 ) );\n\n\t}\n\n\t// Array of textures (2D / Cube)\n\n\tfunction setValueT1a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\tfunction setValueT6a( gl, v, renderer ) {\n\n\t\tvar n = v.length,\n\t\t\tunits = allocTexUnits( renderer, n );\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tfor ( var i = 0; i !== n; ++ i ) {\n\n\t\t\trenderer.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t\t}\n\n\t}\n\n\t// Helper to pick the right setter for a pure (bottom-level) array\n\n\tfunction getPureArraySetter( type ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 0x1406: return setValue1fv; // FLOAT\n\t\t\tcase 0x8b50: return setValueV2a; // _VEC2\n\t\t\tcase 0x8b51: return setValueV3a; // _VEC3\n\t\t\tcase 0x8b52: return setValueV4a; // _VEC4\n\n\t\t\tcase 0x8b5a: return setValueM2a; // _MAT2\n\t\t\tcase 0x8b5b: return setValueM3a; // _MAT3\n\t\t\tcase 0x8b5c: return setValueM4a; // _MAT4\n\n\t\t\tcase 0x8b5e: return setValueT1a; // SAMPLER_2D\n\t\t\tcase 0x8b60: return setValueT6a; // SAMPLER_CUBE\n\n\t\t\tcase 0x1404: case 0x8b56: return setValue1iv; // INT, BOOL\n\t\t\tcase 0x8b53: case 0x8b57: return setValue2iv; // _VEC2\n\t\t\tcase 0x8b54: case 0x8b58: return setValue3iv; // _VEC3\n\t\t\tcase 0x8b55: case 0x8b59: return setValue4iv; // _VEC4\n\n\t\t}\n\n\t}\n\n\t// --- Uniform Classes ---\n\n\tfunction SingleUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction PureArrayUniform( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.size = activeInfo.size;\n\t\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n\tfunction StructuredUniform( id ) {\n\n\t\tthis.id = id;\n\n\t\tUniformContainer.call( this ); // mix-in\n\n\t}\n\n\tStructuredUniform.prototype.setValue = function ( gl, value ) {\n\n\t\t// Note: Don't need an extra 'renderer' parameter, since samplers\n\t\t// are not allowed in structured uniforms.\n\n\t\tvar seq = this.seq;\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ] );\n\n\t\t}\n\n\t};\n\n\t// --- Top-level ---\n\n\t// Parser - builds up the property tree from the path strings\n\n\tvar RePathPart = /([\\w\\d_]+)(\\])?(\\[|\\.)?/g;\n\n\t// extracts\n\t// \t- the identifier (member name or array index)\n\t//  - followed by an optional right bracket (found when array index)\n\t//  - followed by an optional left bracket or dot (type of subscript)\n\t//\n\t// Note: These portions can be read in a non-overlapping fashion and\n\t// allow straightforward parsing of the hierarchy that WebGL encodes\n\t// in the uniform names.\n\n\tfunction addUniform( container, uniformObject ) {\n\n\t\tcontainer.seq.push( uniformObject );\n\t\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n\t}\n\n\tfunction parseUniform( activeInfo, addr, container ) {\n\n\t\tvar path = activeInfo.name,\n\t\t\tpathLength = path.length;\n\n\t\t// reset RegExp object, because of the early exit of a previous run\n\t\tRePathPart.lastIndex = 0;\n\n\t\tfor ( ; ; ) {\n\n\t\t\tvar match = RePathPart.exec( path ),\n\t\t\t\tmatchEnd = RePathPart.lastIndex,\n\n\t\t\t\tid = match[ 1 ],\n\t\t\t\tidIsIndex = match[ 2 ] === ']',\n\t\t\t\tsubscript = match[ 3 ];\n\n\t\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\t\tbreak;\n\n\t\t\t} else {\n\n\t\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\t\tvar map = container.map, next = map[ id ];\n\n\t\t\t\tif ( next === undefined ) {\n\n\t\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\t\taddUniform( container, next );\n\n\t\t\t\t}\n\n\t\t\t\tcontainer = next;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Root Container\n\n\tfunction WebGLUniforms( gl, program, renderer ) {\n\n\t\tUniformContainer.call( this );\n\n\t\tthis.renderer = renderer;\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( var i = 0; i < n; ++ i ) {\n\n\t\t\tvar info = gl.getActiveUniform( program, i ),\n\t\t\t\tpath = info.name,\n\t\t\t\taddr = gl.getUniformLocation( program, path );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tWebGLUniforms.prototype.setValue = function ( gl, name, value ) {\n\n\t\tvar u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, this.renderer );\n\n\t};\n\n\tWebGLUniforms.prototype.setOptional = function ( gl, object, name ) {\n\n\t\tvar v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t};\n\n\n\t// Static interface\n\n\tWebGLUniforms.upload = function ( gl, seq, values, renderer ) {\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\t\tu.setValue( gl, v.value, renderer );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tWebGLUniforms.seqWithValue = function ( seq, values ) {\n\n\t\tvar r = [];\n\n\t\tfor ( var i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tvar u = seq[ i ];\n\t\t\tif ( u.id in values ) r.push( u );\n\n\t\t}\n\n\t\treturn r;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar ColorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\n\tfunction Color( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\t\t\treturn this.set( r );\n\n\t\t}\n\n\t\treturn this.setRGB( r, g, b );\n\n\t}\n\n\tObject.assign( Color.prototype, {\n\n\t\tisColor: true,\n\n\t\tr: 1, g: 1, b: 1,\n\n\t\tset: function ( value ) {\n\n\t\t\tif ( value && value.isColor ) {\n\n\t\t\t\tthis.copy( value );\n\n\t\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\t\tthis.setHex( value );\n\n\t\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\t\tthis.setStyle( value );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetScalar: function ( scalar ) {\n\n\t\t\tthis.r = scalar;\n\t\t\tthis.g = scalar;\n\t\t\tthis.b = scalar;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHex: function ( hex ) {\n\n\t\t\thex = Math.floor( hex );\n\n\t\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetRGB: function ( r, g, b ) {\n\n\t\t\tthis.r = r;\n\t\t\tthis.g = g;\n\t\t\tthis.b = b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetHSL: function () {\n\n\t\t\tfunction hue2rgb( p, q, t ) {\n\n\t\t\t\tif ( t < 0 ) t += 1;\n\t\t\t\tif ( t > 1 ) t -= 1;\n\t\t\t\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\t\t\t\tif ( t < 1 / 2 ) return q;\n\t\t\t\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\t\t\t\treturn p;\n\n\t\t\t}\n\n\t\t\treturn function setHSL( h, s, l ) {\n\n\t\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\t\t\th = _Math.euclideanModulo( h, 1 );\n\t\t\t\ts = _Math.clamp( s, 0, 1 );\n\t\t\t\tl = _Math.clamp( l, 0, 1 );\n\n\t\t\t\tif ( s === 0 ) {\n\n\t\t\t\t\tthis.r = this.g = this.b = l;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\t\t\tvar q = ( 2 * l ) - p;\n\n\t\t\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetStyle: function ( style ) {\n\n\t\t\tfunction handleAlpha( string ) {\n\n\t\t\t\tif ( string === undefined ) return;\n\n\t\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tvar m;\n\n\t\t\tif ( m = /^((?:rgb|hsl)a?)\\(\\s*([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t\t// rgb / hsl\n\n\t\t\t\tvar color;\n\t\t\t\tvar name = m[ 1 ];\n\t\t\t\tvar components = m[ 2 ];\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'rgb':\n\t\t\t\t\tcase 'rgba':\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( color = /^(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'hsl':\n\t\t\t\t\tcase 'hsla':\n\n\t\t\t\t\t\tif ( color = /^([0-9]*\\.?[0-9]+)\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\t\tvar h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\t\tvar s = parseInt( color[ 2 ], 10 ) / 100;\n\t\t\t\t\t\t\tvar l = parseInt( color[ 3 ], 10 ) / 100;\n\n\t\t\t\t\t\t\thandleAlpha( color[ 5 ] );\n\n\t\t\t\t\t\t\treturn this.setHSL( h, s, l );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( m = /^\\#([A-Fa-f0-9]+)$/.exec( style ) ) {\n\n\t\t\t\t// hex color\n\n\t\t\t\tvar hex = m[ 1 ];\n\t\t\t\tvar size = hex.length;\n\n\t\t\t\tif ( size === 3 ) {\n\n\t\t\t\t\t// #ff0\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t\t// #ff0000\n\t\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( style && style.length > 0 ) {\n\n\t\t\t\t// color keywords\n\t\t\t\tvar hex = ColorKeywords[ style ];\n\n\t\t\t\tif ( hex !== undefined ) {\n\n\t\t\t\t\t// red\n\t\t\t\t\tthis.setHex( hex );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// unknown color\n\t\t\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t\t},\n\n\t\tcopy: function ( color ) {\n\n\t\t\tthis.r = color.r;\n\t\t\tthis.g = color.g;\n\t\t\tthis.b = color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyGammaToLinear: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tthis.r = Math.pow( color.r, gammaFactor );\n\t\t\tthis.g = Math.pow( color.g, gammaFactor );\n\t\t\tthis.b = Math.pow( color.b, gammaFactor );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyLinearToGamma: function ( color, gammaFactor ) {\n\n\t\t\tif ( gammaFactor === undefined ) gammaFactor = 2.0;\n\n\t\t\tvar safeInverse = ( gammaFactor > 0 ) ? ( 1.0 / gammaFactor ) : 1.0;\n\n\t\t\tthis.r = Math.pow( color.r, safeInverse );\n\t\t\tthis.g = Math.pow( color.g, safeInverse );\n\t\t\tthis.b = Math.pow( color.b, safeInverse );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertGammaToLinear: function () {\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tthis.r = r * r;\n\t\t\tthis.g = g * g;\n\t\t\tthis.b = b * b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconvertLinearToGamma: function () {\n\n\t\t\tthis.r = Math.sqrt( this.r );\n\t\t\tthis.g = Math.sqrt( this.g );\n\t\t\tthis.b = Math.sqrt( this.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetHex: function () {\n\n\t\t\treturn ( this.r * 255 ) << 16 ^ ( this.g * 255 ) << 8 ^ ( this.b * 255 ) << 0;\n\n\t\t},\n\n\t\tgetHexString: function () {\n\n\t\t\treturn ( '000000' + this.getHex().toString( 16 ) ).slice( - 6 );\n\n\t\t},\n\n\t\tgetHSL: function ( optionalTarget ) {\n\n\t\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\t\tvar hsl = optionalTarget || { h: 0, s: 0, l: 0 };\n\n\t\t\tvar r = this.r, g = this.g, b = this.b;\n\n\t\t\tvar max = Math.max( r, g, b );\n\t\t\tvar min = Math.min( r, g, b );\n\n\t\t\tvar hue, saturation;\n\t\t\tvar lightness = ( min + max ) / 2.0;\n\n\t\t\tif ( min === max ) {\n\n\t\t\t\thue = 0;\n\t\t\t\tsaturation = 0;\n\n\t\t\t} else {\n\n\t\t\t\tvar delta = max - min;\n\n\t\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\t\tswitch ( max ) {\n\n\t\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t\t}\n\n\t\t\t\thue /= 6;\n\n\t\t\t}\n\n\t\t\thsl.h = hue;\n\t\t\thsl.s = saturation;\n\t\t\thsl.l = lightness;\n\n\t\t\treturn hsl;\n\n\t\t},\n\n\t\tgetStyle: function () {\n\n\t\t\treturn 'rgb(' + ( ( this.r * 255 ) | 0 ) + ',' + ( ( this.g * 255 ) | 0 ) + ',' + ( ( this.b * 255 ) | 0 ) + ')';\n\n\t\t},\n\n\t\toffsetHSL: function ( h, s, l ) {\n\n\t\t\tvar hsl = this.getHSL();\n\n\t\t\thsl.h += h; hsl.s += s; hsl.l += l;\n\n\t\t\tthis.setHSL( hsl.h, hsl.s, hsl.l );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( color ) {\n\n\t\t\tthis.r += color.r;\n\t\t\tthis.g += color.g;\n\t\t\tthis.b += color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddColors: function ( color1, color2 ) {\n\n\t\t\tthis.r = color1.r + color2.r;\n\t\t\tthis.g = color1.g + color2.g;\n\t\t\tthis.b = color1.b + color2.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddScalar: function ( s ) {\n\n\t\t\tthis.r += s;\n\t\t\tthis.g += s;\n\t\t\tthis.b += s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsub: function( color ) {\n\n\t\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiply: function ( color ) {\n\n\t\t\tthis.r *= color.r;\n\t\t\tthis.g *= color.g;\n\t\t\tthis.b *= color.b;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tthis.r *= s;\n\t\t\tthis.g *= s;\n\t\t\tthis.b *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tlerp: function ( color, alpha ) {\n\n\t\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( c ) {\n\n\t\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.r = array[ offset ];\n\t\t\tthis.g = array[ offset + 1 ];\n\t\t\tthis.b = array[ offset + 2 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this.r;\n\t\t\tarray[ offset + 1 ] = this.g;\n\t\t\tarray[ offset + 2 ] = this.b;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\treturn this.getHex();\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * Uniforms library for shared webgl shaders\n\t */\n\n\tvar UniformsLib = {\n\n\t\tcommon: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) },\n\n\t\t\talphaMap: { value: null },\n\n\t\t},\n\n\t\tspecularmap: {\n\n\t\t\tspecularMap: { value: null },\n\n\t\t},\n\n\t\tenvmap: {\n\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: - 1 },\n\t\t\treflectivity: { value: 1.0 },\n\t\t\trefractionRatio: { value: 0.98 }\n\n\t\t},\n\n\t\taomap: {\n\n\t\t\taoMap: { value: null },\n\t\t\taoMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\tlightmap: {\n\n\t\t\tlightMap: { value: null },\n\t\t\tlightMapIntensity: { value: 1 }\n\n\t\t},\n\n\t\temissivemap: {\n\n\t\t\temissiveMap: { value: null }\n\n\t\t},\n\n\t\tbumpmap: {\n\n\t\t\tbumpMap: { value: null },\n\t\t\tbumpScale: { value: 1 }\n\n\t\t},\n\n\t\tnormalmap: {\n\n\t\t\tnormalMap: { value: null },\n\t\t\tnormalScale: { value: new Vector2( 1, 1 ) }\n\n\t\t},\n\n\t\tdisplacementmap: {\n\n\t\t\tdisplacementMap: { value: null },\n\t\t\tdisplacementScale: { value: 1 },\n\t\t\tdisplacementBias: { value: 0 }\n\n\t\t},\n\n\t\troughnessmap: {\n\n\t\t\troughnessMap: { value: null }\n\n\t\t},\n\n\t\tmetalnessmap: {\n\n\t\t\tmetalnessMap: { value: null }\n\n\t\t},\n\n\t\tgradientmap: {\n\n\t\t\tgradientMap: { value: null }\n\n\t\t},\n\n\t\tfog: {\n\n\t\t\tfogDensity: { value: 0.00025 },\n\t\t\tfogNear: { value: 1 },\n\t\t\tfogFar: { value: 2000 },\n\t\t\tfogColor: { value: new Color( 0xffffff ) }\n\n\t\t},\n\n\t\tlights: {\n\n\t\t\tambientLightColor: { value: [] },\n\n\t\t\tdirectionalLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tcolor: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tdirectionalShadowMap: { value: [] },\n\t\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\t\tspotLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdirection: {},\n\t\t\t\tdistance: {},\n\t\t\t\tconeCos: {},\n\t\t\t\tpenumbraCos: {},\n\t\t\t\tdecay: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {}\n\t\t\t} },\n\n\t\t\tspotShadowMap: { value: [] },\n\t\t\tspotShadowMatrix: { value: [] },\n\n\t\t\tpointLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\tdecay: {},\n\t\t\t\tdistance: {},\n\n\t\t\t\tshadow: {},\n\t\t\t\tshadowBias: {},\n\t\t\t\tshadowRadius: {},\n\t\t\t\tshadowMapSize: {},\n\t\t\t\tshadowCameraNear: {},\n\t\t\t\tshadowCameraFar: {}\n\t\t\t} },\n\n\t\t\tpointShadowMap: { value: [] },\n\t\t\tpointShadowMatrix: { value: [] },\n\n\t\t\themisphereLights: { value: [], properties: {\n\t\t\t\tdirection: {},\n\t\t\t\tskyColor: {},\n\t\t\t\tgroundColor: {}\n\t\t\t} },\n\n\t\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\t\trectAreaLights: { value: [], properties: {\n\t\t\t\tcolor: {},\n\t\t\t\tposition: {},\n\t\t\t\twidth: {},\n\t\t\t\theight: {}\n\t\t\t} }\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tdiffuse: { value: new Color( 0xeeeeee ) },\n\t\t\topacity: { value: 1.0 },\n\t\t\tsize: { value: 1.0 },\n\t\t\tscale: { value: 1.0 },\n\t\t\tmap: { value: null },\n\t\t\toffsetRepeat: { value: new Vector4( 0, 0, 1, 1 ) }\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Uniform Utilities\n\t */\n\n\tvar UniformsUtils = {\n\n\t\tmerge: function ( uniforms ) {\n\n\t\t\tvar merged = {};\n\n\t\t\tfor ( var u = 0; u < uniforms.length; u ++ ) {\n\n\t\t\t\tvar tmp = this.clone( uniforms[ u ] );\n\n\t\t\t\tfor ( var p in tmp ) {\n\n\t\t\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn merged;\n\n\t\t},\n\n\t\tclone: function ( uniforms_src ) {\n\n\t\t\tvar uniforms_dst = {};\n\n\t\t\tfor ( var u in uniforms_src ) {\n\n\t\t\t\tuniforms_dst[ u ] = {};\n\n\t\t\t\tfor ( var p in uniforms_src[ u ] ) {\n\n\t\t\t\t\tvar parameter_src = uniforms_src[ u ][ p ];\n\n\t\t\t\t\tif ( parameter_src && ( parameter_src.isColor ||\n\t\t\t\t\t\tparameter_src.isMatrix3 || parameter_src.isMatrix4 ||\n\t\t\t\t\t\tparameter_src.isVector2 || parameter_src.isVector3 || parameter_src.isVector4 ||\n\t\t\t\t\t\tparameter_src.isTexture ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.clone();\n\n\t\t\t\t\t} else if ( Array.isArray( parameter_src ) ) {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src.slice();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuniforms_dst[ u ][ p ] = parameter_src;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn uniforms_dst;\n\n\t\t}\n\n\t};\n\n\tvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\\n\";\n\n\tvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\\n\";\n\n\tvar alphatest_fragment = \"#ifdef ALPHATEST\\n\\tif ( diffuseColor.a < ALPHATEST ) discard;\\n#endif\\n\";\n\n\tvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\\n\\t#endif\\n#endif\\n\";\n\n\tvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\n\tvar begin_vertex = \"\\nvec3 transformed = vec3( position );\\n\";\n\n\tvar beginnormal_vertex = \"\\nvec3 objectNormal = vec3( normal );\\n\";\n\n\tvar bsdfs = \"float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\tif( decayExponent > 0.0 ) {\\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\\n\\t\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\t\\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t\\treturn distanceFalloff * maxDistanceCutoffFactor;\\n#else\\n\\t\\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\\n#endif\\n\\t}\\n\\treturn 1.0;\\n}\\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\\n\\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\\n\\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\\n}\\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\treturn 1.0 / ( gl * gv );\\n}\\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\tfloat D = D_GGX( alpha, dotNH );\\n\\treturn F * ( G * D );\\n}\\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\\n\\tconst float LUT_SIZE  = 64.0;\\n\\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\\n\\tconst float LUT_BIAS  = 0.5 / LUT_SIZE;\\n\\tfloat theta = acos( dot( N, V ) );\\n\\tvec2 uv = vec2(\\n\\t\\tsqrt( saturate( roughness ) ),\\n\\t\\tsaturate( theta / ( 0.5 * PI ) ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\\n\\tfloat l = length( f );\\n\\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\\n}\\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\\n\\tfloat x = dot( v1, v2 );\\n\\tfloat y = abs( x );\\n\\tfloat a = 0.86267 + (0.49788 + 0.01436 * y ) * y;\\n\\tfloat b = 3.45068 + (4.18814 + y) * y;\\n\\tfloat v = a / b;\\n\\tfloat theta_sintheta = (x > 0.0) ? v : 0.5 * inversesqrt( 1.0 - x * x ) - v;\\n\\treturn cross( v1, v2 ) * theta_sintheta;\\n}\\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\\n\\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\\n\\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\\n\\tvec3 lightNormal = cross( v1, v2 );\\n\\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\\n\\tvec3 T1, T2;\\n\\tT1 = normalize( V - N * dot( V, N ) );\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tvec3 result = vec3( LTC_ClippedSphereFormFactor( vectorFormFactor ) );\\n\\treturn result;\\n}\\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\\n\\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\\n\\tvec4 r = roughness * c0 + c1;\\n\\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\\n\\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\\n\\treturn specularColor * AB.x + AB.y;\\n}\\nfloat G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\\n\\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\\n\\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, dotLH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n}\\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\\n\\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\\n}\\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\\n\\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\\n}\\n\";\n\n\tvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vUv );\\n\\t\\tvec2 dSTdy = dFdy( vUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\\n\\t\\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\\n\\t\\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 );\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\\n\";\n\n\tvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; ++ i ) {\\n\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t\\t\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; ++ i ) {\\n\\t\\t\\tvec4 plane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\tif ( clipped ) discard;\\n\\t\\n\\t#endif\\n#endif\\n\";\n\n\tvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\t\\tvarying vec3 vViewPosition;\\n\\t#endif\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\\n\";\n\n\tvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n\";\n\n\tvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n\";\n\n\tvar color_fragment = \"#ifdef USE_COLOR\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\n\tvar color_pars_fragment = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\\n\";\n\n\tvar color_pars_vertex = \"#ifdef USE_COLOR\\n\\tvarying vec3 vColor;\\n#endif\";\n\n\tvar color_vertex = \"#ifdef USE_COLOR\\n\\tvColor.xyz = color.xyz;\\n#endif\";\n\n\tvar common = \"#define PI 3.14159265359\\n#define PI2 6.28318530718\\n#define PI_HALF 1.5707963267949\\n#define RECIPROCAL_PI 0.31830988618\\n#define RECIPROCAL_PI2 0.15915494\\n#define LOG2 1.442695\\n#define EPSILON 1e-6\\n#define saturate(a) clamp( a, 0.0, 1.0 )\\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract(sin(sn) * c);\\n}\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\tfloat distance = dot( planeNormal, point - pointOnPlane );\\n\\treturn - distance * planeNormal + point;\\n}\\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn sign( dot( point - pointOnPlane, planeNormal ) );\\n}\\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\\n\\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\\n}\\nmat3 transpose( const in mat3 v ) {\\n\\tmat3 tmp;\\n\\ttmp[0] = vec3(v[0].x, v[1].x, v[2].x);\\n\\ttmp[1] = vec3(v[0].y, v[1].y, v[2].y);\\n\\ttmp[2] = vec3(v[0].z, v[1].z, v[2].z);\\n\\treturn tmp;\\n}\\n\";\n\n\tvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n#define cubeUV_textureSize (1024.0)\\nint getFaceFromDirection(vec3 direction) {\\n\\tvec3 absDirection = abs(direction);\\n\\tint face = -1;\\n\\tif( absDirection.x > absDirection.z ) {\\n\\t\\tif(absDirection.x > absDirection.y )\\n\\t\\t\\tface = direction.x > 0.0 ? 0 : 3;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\telse {\\n\\t\\tif(absDirection.z > absDirection.y )\\n\\t\\t\\tface = direction.z > 0.0 ? 2 : 5;\\n\\t\\telse\\n\\t\\t\\tface = direction.y > 0.0 ? 1 : 4;\\n\\t}\\n\\treturn face;\\n}\\n#define cubeUV_maxLods1  (log2(cubeUV_textureSize*0.25) - 1.0)\\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\\n\\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\\n\\tfloat dxRoughness = dFdx(roughness);\\n\\tfloat dyRoughness = dFdy(roughness);\\n\\tvec3 dx = dFdx( vec * scale * dxRoughness );\\n\\tvec3 dy = dFdy( vec * scale * dyRoughness );\\n\\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\\n\\td = clamp(d, 1.0, cubeUV_rangeClamp);\\n\\tfloat mipLevel = 0.5 * log2(d);\\n\\treturn vec2(floor(mipLevel), fract(mipLevel));\\n}\\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\\n\\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\\n\\tfloat a = 16.0 * cubeUV_rcpTextureSize;\\n\\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\\n\\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\\n\\tfloat powScale = exp2_packed.x * exp2_packed.y;\\n\\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\\n\\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\\n\\tbool bRes = mipLevel == 0.0;\\n\\tscale =  bRes && (scale < a) ? a : scale;\\n\\tvec3 r;\\n\\tvec2 offset;\\n\\tint face = getFaceFromDirection(direction);\\n\\tfloat rcpPowScale = 1.0 / powScale;\\n\\tif( face == 0) {\\n\\t\\tr = vec3(direction.x, -direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 1) {\\n\\t\\tr = vec3(direction.y, direction.x, direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 2) {\\n\\t\\tr = vec3(direction.z, direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\\n\\t}\\n\\telse if( face == 3) {\\n\\t\\tr = vec3(direction.x, direction.z, direction.y);\\n\\t\\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse if( face == 4) {\\n\\t\\tr = vec3(direction.y, direction.x, -direction.z);\\n\\t\\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\telse {\\n\\t\\tr = vec3(direction.z, -direction.x, direction.y);\\n\\t\\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\\n\\t\\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\\n\\t}\\n\\tr = normalize(r);\\n\\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\\n\\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\\n\\tvec2 base = offset + vec2( texelOffset );\\n\\treturn base + s * ( scale - 2.0 * texelOffset );\\n}\\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\\nvec4 textureCubeUV(vec3 reflectedDirection, float roughness ) {\\n\\tfloat roughnessVal = roughness* cubeUV_maxLods3;\\n\\tfloat r1 = floor(roughnessVal);\\n\\tfloat r2 = r1 + 1.0;\\n\\tfloat t = fract(roughnessVal);\\n\\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\\n\\tfloat s = mipInfo.y;\\n\\tfloat level0 = mipInfo.x;\\n\\tfloat level1 = level0 + 1.0;\\n\\tlevel1 = level1 > 5.0 ? 5.0 : level1;\\n\\tlevel0 += min( floor( s + 0.5 ), 5.0 );\\n\\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\\n\\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\\n\\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\\n\\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\\n\\tvec4 result = mix(color10, color20, t);\\n\\treturn vec4(result.rgb, 1.0);\\n}\\n#endif\\n\";\n\n\tvar defaultnormal_vertex = \"vec3 transformedNormal = normalMatrix * objectNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n\";\n\n\tvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\\n\";\n\n\tvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\\n#endif\\n\";\n\n\tvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\\n\";\n\n\tvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\\n\";\n\n\tvar encodings_fragment = \"  gl_FragColor = linearToOutputTexel( gl_FragColor );\\n\";\n\n\tvar encodings_pars_fragment = \"\\nvec4 LinearToLinear( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\\n}\\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\\n\\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\\n}\\nvec4 sRGBToLinear( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\\n}\\nvec4 RGBEToLinear( in vec4 value ) {\\n\\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\\n}\\nvec4 LinearToRGBE( in vec4 value ) {\\n\\tfloat maxComponent = max( max( value.r, value.g ), value.b );\\n\\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\\n\\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\\n}\\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\\n}\\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat M      = clamp( maxRGB / maxRange, 0.0, 1.0 );\\n\\tM            = ceil( M * 255.0 ) / 255.0;\\n\\treturn vec4( value.rgb / ( M * maxRange ), M );\\n}\\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\\n\\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\\n}\\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\\n\\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\\n\\tfloat D      = max( maxRange / maxRGB, 1.0 );\\n\\tD            = min( floor( D ) / 255.0, 1.0 );\\n\\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\\n}\\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\\nvec4 LinearToLogLuv( in vec4 value )  {\\n\\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\\n\\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\\n\\tvec4 vResult;\\n\\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\\n\\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\\n\\tvResult.w = fract(Le);\\n\\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\\n\\treturn vResult;\\n}\\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\\nvec4 LogLuvToLinear( in vec4 value ) {\\n\\tfloat Le = value.z * 255.0 + value.w;\\n\\tvec3 Xp_Y_XYZp;\\n\\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\\n\\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\\n\\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\\n\\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\\n\\treturn vec4( max(vRGB, 0.0), 1.0 );\\n}\\n\";\n\n\tvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\tvec2 sampleUV;\\n\\t\\treflectVec = normalize( reflectVec );\\n\\t\\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\t\\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\tvec4 envColor = texture2D( envMap, sampleUV );\\n\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\treflectVec = normalize( reflectVec );\\n\\t\\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\\n\\t\\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\tenvColor = envMapTexelToLinear( envColor );\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_pars_fragment = \"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\\n\\tuniform float reflectivity;\\n\\tuniform float envMapIntensity;\\n#endif\\n#ifdef USE_ENVMAP\\n\\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\tuniform float flipEnvMap;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\\n\";\n\n\tvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\\n\";\n\n\tvar fog_vertex = \"\\n#ifdef USE_FOG\\nfogDepth = -mvPosition.z;\\n#endif\";\n\n\tvar fog_pars_vertex = \"#ifdef USE_FOG\\n  varying float fogDepth;\\n#endif\\n\";\n\n\tvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\\n\";\n\n\tvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float fogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\\n\";\n\n\tvar gradientmap_pars_fragment = \"#ifdef TOON\\n\\tuniform sampler2D gradientMap;\\n\\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\t\\tfloat dotNL = dot( normal, lightDirection );\\n\\t\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t\\t#ifdef USE_GRADIENTMAP\\n\\t\\t\\treturn texture2D( gradientMap, coord ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\n\tvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n#endif\\n\";\n\n\tvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\n\tvar lights_lambert_vertex = \"vec3 diffuse = vec3( 1.0 );\\nGeometricContext geometry;\\ngeometry.position = mvPosition.xyz;\\ngeometry.normal = normalize( transformedNormal );\\ngeometry.viewDir = normalize( -mvPosition.xyz );\\nGeometricContext backGeometry;\\nbackGeometry.position = geometry.position;\\nbackGeometry.normal = -geometry.normal;\\nbackGeometry.viewDir = geometry.viewDir;\\nvLightFront = vec3( 0.0 );\\n#ifdef DOUBLE_SIDED\\n\\tvLightBack = vec3( 0.0 );\\n#endif\\nIncidentLight directLight;\\nfloat dotNL;\\nvec3 directLightColor_Diffuse;\\n#if NUM_POINT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_DIR_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\\n\\t\\tdotNL = dot( geometry.normal, directLight.direction );\\n\\t\\tdirectLightColor_Diffuse = PI * directLight.color;\\n\\t\\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\\n\\t\\t#endif\\n\\t}\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\n\tvar lights_pars = \"uniform vec3 ambientLightColor;\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treturn irradiance;\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tdirectLight.color = directionalLight.color;\\n\\t\\tdirectLight.direction = directionalLight.direction;\\n\\t\\tdirectLight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t\\tfloat shadowCameraNear;\\n\\t\\tfloat shadowCameraFar;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\\n\\t\\tvec3 lVector = pointLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tdirectLight.color = pointLight.color;\\n\\t\\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t\\tint shadow;\\n\\t\\tfloat shadowBias;\\n\\t\\tfloat shadowRadius;\\n\\t\\tvec2 shadowMapSize;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight  ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tdirectLight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tfloat angleCos = dot( directLight.direction, spotLight.direction );\\n\\t\\tif ( angleCos > spotLight.coneCos ) {\\n\\t\\t\\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\t\\tdirectLight.color = spotLight.color;\\n\\t\\t\\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tdirectLight.visible = true;\\n\\t\\t} else {\\n\\t\\t\\tdirectLight.color = vec3( 0.0 );\\n\\t\\t\\tdirectLight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltcMat;\\tuniform sampler2D ltcMag;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\\n\\t\\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tirradiance *= PI;\\n\\t\\t#endif\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\\n#if defined( USE_ENVMAP ) && defined( PHYSICAL )\\n\\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\\n\\t\\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( queryVec, 1.0 );\\n\\t\\t#else\\n\\t\\t\\tvec4 envMapColor = vec4( 0.0 );\\n\\t\\t#endif\\n\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t}\\n\\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\tfloat maxMIPLevelScalar = float( maxMIPLevel );\\n\\t\\tfloat desiredMIPLevel = maxMIPLevelScalar - 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\\n\\t\\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\\n\\t}\\n\\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\\n\\t\\t#endif\\n\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV(queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent));\\n\\t\\t#elif defined( ENVMAP_TYPE_EQUIREC )\\n\\t\\t\\tvec2 sampleUV;\\n\\t\\t\\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\t\\t\\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#elif defined( ENVMAP_TYPE_SPHERE )\\n\\t\\t\\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\\n\\t\\t\\t#ifdef TEXTURE_LOD_EXT\\n\\t\\t\\t\\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\\n\\t\\t\\t#endif\\n\\t\\t\\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\\n\\t\\t#endif\\n\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t}\\n#endif\\n\";\n\n\tvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\\n\";\n\n\tvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\nstruct BlinnPhongMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tvec3\\tspecularColor;\\n\\tfloat\\tspecularShininess;\\n\\tfloat\\tspecularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifdef TOON\\n\\t\\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\\n\\t#else\\n\\t\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\t\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#endif\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\\n#define Material_LightProbeLOD( material )\\t(0)\\n\";\n\n\tvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\\n#ifdef STANDARD\\n\\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.clearCoat = saturate( clearCoat );\\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\\n#endif\\n\";\n\n\tvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3\\tdiffuseColor;\\n\\tfloat\\tspecularRoughness;\\n\\tvec3\\tspecularColor;\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoat;\\n\\t\\tfloat clearCoatRoughness;\\n\\t#endif\\n};\\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\\n\\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometry.normal;\\n\\t\\tvec3 viewDir = geometry.viewDir;\\n\\t\\tvec3 position = geometry.position;\\n\\t\\tvec3 lightPos = rectAreaLight.position;\\n\\t\\tvec3 halfWidth = rectAreaLight.halfWidth;\\n\\t\\tvec3 halfHeight = rectAreaLight.halfHeight;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.specularRoughness;\\n\\t\\tvec3 rectCoords[ 4 ];\\n\\t\\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\\t\\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\\n\\t\\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\\n\\t\\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\\n\\t\\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\\n\\t\\tfloat norm = texture2D( ltcMag, uv ).a;\\n\\t\\tvec4 t = texture2D( ltcMat, uv );\\n\\t\\tmat3 mInv = mat3(\\n\\t\\t\\tvec3(   1,   0, t.y ),\\n\\t\\t\\tvec3(   0, t.z,   0 ),\\n\\t\\t\\tvec3( t.w,   0, t.x )\\n\\t\\t);\\n\\t\\treflectedLight.directSpecular += lightColor * material.specularColor * norm * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1 ), rectCoords );\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\tirradiance *= PI;\\n\\t#endif\\n\\t#ifndef STANDARD\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\\n\\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t#ifndef STANDARD\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\tfloat dotNL = dotNV;\\n\\t\\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\\n\\t#else\\n\\t\\tfloat clearCoatDHR = 0.0;\\n\\t#endif\\n\\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\\n\\t#ifndef STANDARD\\n\\t\\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\\n\\t#endif\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\n#define Material_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.specularRoughness )\\n#define Material_ClearCoat_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\\n\";\n\n\tvar lights_template = \"\\nGeometricContext geometry;\\ngeometry.position = - vViewPosition;\\ngeometry.normal = normal;\\ngeometry.viewDir = normalize( vViewPosition );\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\\n\\t\\t#ifdef USE_SHADOWMAP\\n\\t\\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\\n\\t}\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t\\t#ifndef PHYSICALLY_CORRECT_LIGHTS\\n\\t\\t\\tlightMapIrradiance *= PI;\\n\\t\\t#endif\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\\n\\t\\t}\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tirradiance += getLightProbeIndirectIrradiance( geometry, 8 );\\n\\t#endif\\n\\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\tvec3 radiance = getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), 8 );\\n\\t#ifndef STANDARD\\n\\t\\tvec3 clearCoatRadiance = getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), 8 );\\n\\t#else\\n\\t\\tvec3 clearCoatRadiance = vec3( 0.0 );\\n\\t#endif\\n\\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\\n#endif\\n\";\n\n\tvar logdepthbuf_fragment = \"#if defined(USE_LOGDEPTHBUF) && defined(USE_LOGDEPTHBUF_EXT)\\n\\tgl_FragDepthEXT = log2(vFragDepth) * logDepthBufFC * 0.5;\\n#endif\";\n\n\tvar logdepthbuf_pars_fragment = \"#ifdef USE_LOGDEPTHBUF\\n\\tuniform float logDepthBufFC;\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#endif\\n#endif\\n\";\n\n\tvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t#endif\\n\\tuniform float logDepthBufFC;\\n#endif\";\n\n\tvar logdepthbuf_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\tgl_Position.z = log2(max( EPSILON, gl_Position.w + 1.0 )) * logDepthBufFC;\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvFragDepth = 1.0 + gl_Position.w;\\n\\t#else\\n\\t\\tgl_Position.z = (gl_Position.z - 1.0) * gl_Position.w;\\n\\t#endif\\n#endif\\n\";\n\n\tvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 texelColor = texture2D( map, vUv );\\n\\ttexelColor = mapTexelToLinear( texelColor );\\n\\tdiffuseColor *= texelColor;\\n#endif\\n\";\n\n\tvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar map_particle_fragment = \"#ifdef USE_MAP\\n\\tvec4 mapTexel = texture2D( map, vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) * offsetRepeat.zw + offsetRepeat.xy );\\n\\tdiffuseColor *= mapTexelToLinear( mapTexel );\\n#endif\\n\";\n\n\tvar map_particle_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform vec4 offsetRepeat;\\n\\tuniform sampler2D map;\\n#endif\\n\";\n\n\tvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\\n\";\n\n\tvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\n\tvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\\n\\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\\n\\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\\n\\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\\n#endif\\n\";\n\n\tvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_MORPHNORMALS\\n\\tuniform float morphTargetInfluences[ 8 ];\\n\\t#else\\n\\tuniform float morphTargetInfluences[ 4 ];\\n\\t#endif\\n#endif\";\n\n\tvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\\n\\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\\n\\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\\n\\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\\n\\t#ifndef USE_MORPHNORMALS\\n\\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\\n\\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\\n\\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\\n\\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\\n\\t#endif\\n#endif\\n\";\n\n\tvar normal_fragment = \"#ifdef FLAT_SHADED\\n\\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\\n\\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\\n\\t#endif\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tnormal = perturbNormal2Arb( -vViewPosition, normal );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\\n#endif\\n\";\n\n\tvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n\\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\\n\\t\\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\\n\\t\\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\\n\\t\\tvec2 st0 = dFdx( vUv.st );\\n\\t\\tvec2 st1 = dFdy( vUv.st );\\n\\t\\tvec3 S = normalize( q0 * st1.t - q1 * st0.t );\\n\\t\\tvec3 T = normalize( -q0 * st1.s + q1 * st0.s );\\n\\t\\tvec3 N = normalize( surf_norm );\\n\\t\\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\t\\tmapN.xy = normalScale * mapN.xy;\\n\\t\\tmat3 tsn = mat3( S, T, N );\\n\\t\\treturn normalize( tsn * mapN );\\n\\t}\\n#endif\\n\";\n\n\tvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 1.0 - 2.0 * rgb.xyz;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256.,  256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n\\treturn linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\\n\";\n\n\tvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\\n\";\n\n\tvar project_vertex = \"vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\\ngl_Position = projectionMatrix * mvPosition;\\n\";\n\n\tvar dithering_fragment = \"#if defined( DITHERING )\\n  gl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\\n\";\n\n\tvar dithering_pars_fragment = \"#if defined( DITHERING )\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\\n\";\n\n\tvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\\n\";\n\n\tvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\n\tvar shadowmap_pars_fragment = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\\n\\t}\\n\\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\\n\\t\\tconst vec2 offset = vec2( 0.0, 1.0 );\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / size;\\n\\t\\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\\n\\t\\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\\n\\t\\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\\n\\t\\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\\n\\t\\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\\n\\t\\tvec2 f = fract( uv * size + 0.5 );\\n\\t\\tfloat a = mix( lb, lt, f.y );\\n\\t\\tfloat b = mix( rb, rt, f.y );\\n\\t\\tfloat c = mix( a, b, f.x );\\n\\t\\treturn c;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\\n\\t\\tbool inFrustum = all( inFrustumVec );\\n\\t\\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\\n\\t\\tbool frustumTest = all( frustumTestVec );\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn shadow;\\n\\t}\\n\\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\\n\\t\\tvec3 absV = abs( v );\\n\\t\\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\\n\\t\\tabsV *= scaleToCube;\\n\\t\\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\\n\\t\\tvec2 planar = v.xy;\\n\\t\\tfloat almostATexel = 1.5 * texelSizeY;\\n\\t\\tfloat almostOne = 1.0 - almostATexel;\\n\\t\\tif ( absV.z >= almostOne ) {\\n\\t\\t\\tif ( v.z > 0.0 )\\n\\t\\t\\t\\tplanar.x = 4.0 - v.x;\\n\\t\\t} else if ( absV.x >= almostOne ) {\\n\\t\\t\\tfloat signX = sign( v.x );\\n\\t\\t\\tplanar.x = v.z * signX + 2.0 * signX;\\n\\t\\t} else if ( absV.y >= almostOne ) {\\n\\t\\t\\tfloat signY = sign( v.y );\\n\\t\\t\\tplanar.x = v.x + 2.0 * signY + 2.0;\\n\\t\\t\\tplanar.y = v.z * signY - 2.0;\\n\\t\\t}\\n\\t\\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\\n\\t}\\n\\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\\t\\tdp += shadowBias;\\n\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t#endif\\n\\t}\\n#endif\\n\";\n\n\tvar shadowmap_pars_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\t\\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\\n\\t\\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\\n\\t#endif\\n#endif\\n\";\n\n\tvar shadowmap_vertex = \"#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\\n\\t}\\n\\t#endif\\n#endif\\n\";\n\n\tvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHTS > 0\\n\\tDirectionalLight directionalLight;\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHTS > 0\\n\\tSpotLight spotLight;\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHTS > 0\\n\\tPointLight pointLight;\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t}\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\\n\";\n\n\tvar skinbase_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n#endif\";\n\n\tvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\t#ifdef BONE_TEXTURE\\n\\t\\tuniform sampler2D boneTexture;\\n\\t\\tuniform int boneTextureSize;\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tfloat j = i * 4.0;\\n\\t\\t\\tfloat x = mod( j, float( boneTextureSize ) );\\n\\t\\t\\tfloat y = floor( j / float( boneTextureSize ) );\\n\\t\\t\\tfloat dx = 1.0 / float( boneTextureSize );\\n\\t\\t\\tfloat dy = 1.0 / float( boneTextureSize );\\n\\t\\t\\ty = dy * ( y + 0.5 );\\n\\t\\t\\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\n\\t\\t\\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\n\\t\\t\\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\n\\t\\t\\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\n\\t\\t\\tmat4 bone = mat4( v1, v2, v3, v4 );\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#else\\n\\t\\tuniform mat4 boneMatrices[ MAX_BONES ];\\n\\t\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\t\\tmat4 bone = boneMatrices[ int(i) ];\\n\\t\\t\\treturn bone;\\n\\t\\t}\\n\\t#endif\\n#endif\\n\";\n\n\tvar skinning_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\\n\";\n\n\tvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix  = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n#endif\\n\";\n\n\tvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\n\tvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\n\tvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n  gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\\n\";\n\n\tvar tonemapping_pars_fragment = \"#define saturate(a) clamp( a, 0.0, 1.0 )\\nuniform float toneMappingExposure;\\nuniform float toneMappingWhitePoint;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\\nvec3 Uncharted2ToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\n\";\n\n\tvar uv_pars_fragment = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n#endif\";\n\n\tvar uv_pars_vertex = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvarying vec2 vUv;\\n\\tuniform vec4 offsetRepeat;\\n#endif\\n\";\n\n\tvar uv_vertex = \"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\\n\\tvUv = uv * offsetRepeat.zw + offsetRepeat.xy;\\n#endif\";\n\n\tvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n#endif\";\n\n\tvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = uv2;\\n#endif\";\n\n\tvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( PHONG ) || defined( PHYSICAL ) || defined( LAMBERT ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\\n\\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\\n#endif\\n\";\n\n\tvar cube_frag = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldPosition;\\nvoid main() {\\n\\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\\n\\tgl_FragColor.a *= opacity;\\n}\\n\";\n\n\tvar cube_vert = \"varying vec3 vWorldPosition;\\n#include <common>\\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n}\\n\";\n\n\tvar depth_frag = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include <common>\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( gl_FragCoord.z ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\\n\\t#endif\\n}\\n\";\n\n\tvar depth_vert = \"#include <common>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n}\\n\";\n\n\tvar distanceRGBA_frag = \"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\n#include <common>\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main () {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\tfloat dist = length( vWorldPosition - referencePosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\\tgl_FragColor = packDepthToRGBA( dist );\\n}\\n\";\n\n\tvar distanceRGBA_vert = \"#define DISTANCE\\nvarying vec3 vWorldPosition;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvWorldPosition = worldPosition.xyz;\\n}\\n\";\n\n\tvar equirect_frag = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldPosition;\\n#include <common>\\nvoid main() {\\n\\tvec3 direction = normalize( vWorldPosition );\\n\\tvec2 sampleUV;\\n\\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n}\\n\";\n\n\tvar equirect_vert = \"varying vec3 vWorldPosition;\\n#include <common>\\nvoid main() {\\n\\tvWorldPosition = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n}\\n\";\n\n\tvar linedashed_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include <common>\\n#include <color_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <color_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n}\\n\";\n\n\tvar linedashed_vert = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include <common>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <color_vertex>\\n\\tvLineDistance = scale * lineDistance;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n}\\n\";\n\n\tvar meshbasic_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <uv2_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <specularmap_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include <aomap_fragment>\\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include <envmap_fragment>\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n}\\n\";\n\n\tvar meshbasic_vert = \"#include <common>\\n#include <uv_pars_vertex>\\n#include <uv2_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <uv2_vertex>\\n\\t#include <color_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#ifdef USE_ENVMAP\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <fog_vertex>\\n}\\n\";\n\n\tvar meshlambert_frag = \"uniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <uv2_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars>\\n#include <fog_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <shadowmask_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <specularmap_fragment>\\n\\t#include <emissivemap_fragment>\\n\\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\\n\\t#include <lightmap_fragment>\\n\\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\\n\\t#else\\n\\t\\treflectedLight.directDiffuse = vLightFront;\\n\\t#endif\\n\\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include <envmap_fragment>\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\\n\";\n\n\tvar meshlambert_vert = \"#define LAMBERT\\nvarying vec3 vLightFront;\\n#ifdef DOUBLE_SIDED\\n\\tvarying vec3 vLightBack;\\n#endif\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <uv2_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <bsdfs>\\n#include <lights_pars>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <uv2_vertex>\\n\\t#include <color_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <lights_lambert_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\\n\";\n\n\tvar meshphong_frag = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <uv2_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <gradientmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars>\\n#include <lights_phong_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <specularmap_fragment>\\n\\t#include <normal_fragment>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_phong_fragment>\\n\\t#include <lights_template>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include <envmap_fragment>\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\\n\";\n\n\tvar meshphong_vert = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <uv2_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <uv2_vertex>\\n\\t#include <color_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\\n\";\n\n\tvar meshphysical_frag = \"#define PHYSICAL\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifndef STANDARD\\n\\tuniform float clearCoat;\\n\\tuniform float clearCoatRoughness;\\n#endif\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <uv2_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <cube_uv_reflection_fragment>\\n#include <lights_pars>\\n#include <lights_physical_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <roughnessmap_pars_fragment>\\n#include <metalnessmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <roughnessmap_fragment>\\n\\t#include <metalnessmap_fragment>\\n\\t#include <normal_fragment>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_physical_fragment>\\n\\t#include <lights_template>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\\n\";\n\n\tvar meshphysical_vert = \"#define PHYSICAL\\nvarying vec3 vViewPosition;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <uv2_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <uv2_vertex>\\n\\t#include <color_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\\n\";\n\n\tvar normal_frag = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\nvoid main() {\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <normal_fragment>\\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\\n}\\n\";\n\n\tvar normal_vert = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\\n\";\n\n\tvar points_frag = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <color_pars_fragment>\\n#include <map_particle_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_particle_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphatest_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n}\\n\";\n\n\tvar points_vert = \"uniform float size;\\nuniform float scale;\\n#include <common>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <color_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tgl_PointSize = size * ( scale / - mvPosition.z );\\n\\t#else\\n\\t\\tgl_PointSize = size;\\n\\t#endif\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\\n\";\n\n\tvar shadow_frag = \"uniform vec3 color;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <bsdfs>\\n#include <lights_pars>\\n#include <shadowmap_pars_fragment>\\n#include <shadowmask_pars_fragment>\\nvoid main() {\\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n}\\n\";\n\n\tvar shadow_vert = \"#include <shadowmap_pars_vertex>\\nvoid main() {\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n}\\n\";\n\n\tvar ShaderChunk = {\n\t\talphamap_fragment: alphamap_fragment,\n\t\talphamap_pars_fragment: alphamap_pars_fragment,\n\t\talphatest_fragment: alphatest_fragment,\n\t\taomap_fragment: aomap_fragment,\n\t\taomap_pars_fragment: aomap_pars_fragment,\n\t\tbegin_vertex: begin_vertex,\n\t\tbeginnormal_vertex: beginnormal_vertex,\n\t\tbsdfs: bsdfs,\n\t\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\t\tclipping_planes_fragment: clipping_planes_fragment,\n\t\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\t\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\t\tclipping_planes_vertex: clipping_planes_vertex,\n\t\tcolor_fragment: color_fragment,\n\t\tcolor_pars_fragment: color_pars_fragment,\n\t\tcolor_pars_vertex: color_pars_vertex,\n\t\tcolor_vertex: color_vertex,\n\t\tcommon: common,\n\t\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\t\tdefaultnormal_vertex: defaultnormal_vertex,\n\t\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\t\tdisplacementmap_vertex: displacementmap_vertex,\n\t\temissivemap_fragment: emissivemap_fragment,\n\t\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\t\tencodings_fragment: encodings_fragment,\n\t\tencodings_pars_fragment: encodings_pars_fragment,\n\t\tenvmap_fragment: envmap_fragment,\n\t\tenvmap_pars_fragment: envmap_pars_fragment,\n\t\tenvmap_pars_vertex: envmap_pars_vertex,\n\t\tenvmap_vertex: envmap_vertex,\n\t\tfog_vertex: fog_vertex,\n\t\tfog_pars_vertex: fog_pars_vertex,\n\t\tfog_fragment: fog_fragment,\n\t\tfog_pars_fragment: fog_pars_fragment,\n\t\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\t\tlightmap_fragment: lightmap_fragment,\n\t\tlightmap_pars_fragment: lightmap_pars_fragment,\n\t\tlights_lambert_vertex: lights_lambert_vertex,\n\t\tlights_pars: lights_pars,\n\t\tlights_phong_fragment: lights_phong_fragment,\n\t\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\t\tlights_physical_fragment: lights_physical_fragment,\n\t\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\t\tlights_template: lights_template,\n\t\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\t\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\t\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\t\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\t\tmap_fragment: map_fragment,\n\t\tmap_pars_fragment: map_pars_fragment,\n\t\tmap_particle_fragment: map_particle_fragment,\n\t\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\t\tmetalnessmap_fragment: metalnessmap_fragment,\n\t\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\t\tmorphnormal_vertex: morphnormal_vertex,\n\t\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\t\tmorphtarget_vertex: morphtarget_vertex,\n\t\tnormal_fragment: normal_fragment,\n\t\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\t\tpacking: packing,\n\t\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\t\tproject_vertex: project_vertex,\n\t\tdithering_fragment: dithering_fragment,\n\t\tdithering_pars_fragment: dithering_pars_fragment,\n\t\troughnessmap_fragment: roughnessmap_fragment,\n\t\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\t\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\t\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\t\tshadowmap_vertex: shadowmap_vertex,\n\t\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\t\tskinbase_vertex: skinbase_vertex,\n\t\tskinning_pars_vertex: skinning_pars_vertex,\n\t\tskinning_vertex: skinning_vertex,\n\t\tskinnormal_vertex: skinnormal_vertex,\n\t\tspecularmap_fragment: specularmap_fragment,\n\t\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\t\ttonemapping_fragment: tonemapping_fragment,\n\t\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\t\tuv_pars_fragment: uv_pars_fragment,\n\t\tuv_pars_vertex: uv_pars_vertex,\n\t\tuv_vertex: uv_vertex,\n\t\tuv2_pars_fragment: uv2_pars_fragment,\n\t\tuv2_pars_vertex: uv2_pars_vertex,\n\t\tuv2_vertex: uv2_vertex,\n\t\tworldpos_vertex: worldpos_vertex,\n\n\t\tcube_frag: cube_frag,\n\t\tcube_vert: cube_vert,\n\t\tdepth_frag: depth_frag,\n\t\tdepth_vert: depth_vert,\n\t\tdistanceRGBA_frag: distanceRGBA_frag,\n\t\tdistanceRGBA_vert: distanceRGBA_vert,\n\t\tequirect_frag: equirect_frag,\n\t\tequirect_vert: equirect_vert,\n\t\tlinedashed_frag: linedashed_frag,\n\t\tlinedashed_vert: linedashed_vert,\n\t\tmeshbasic_frag: meshbasic_frag,\n\t\tmeshbasic_vert: meshbasic_vert,\n\t\tmeshlambert_frag: meshlambert_frag,\n\t\tmeshlambert_vert: meshlambert_vert,\n\t\tmeshphong_frag: meshphong_frag,\n\t\tmeshphong_vert: meshphong_vert,\n\t\tmeshphysical_frag: meshphysical_frag,\n\t\tmeshphysical_vert: meshphysical_vert,\n\t\tnormal_frag: normal_frag,\n\t\tnormal_vert: normal_vert,\n\t\tpoints_frag: points_frag,\n\t\tpoints_vert: points_vert,\n\t\tshadow_frag: shadow_frag,\n\t\tshadow_vert: shadow_vert\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t */\n\n\tvar ShaderLib = {\n\n\t\tbasic: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.specularmap,\n\t\t\t\tUniformsLib.envmap,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.fog\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t\t},\n\n\t\tlambert: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.specularmap,\n\t\t\t\tUniformsLib.envmap,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t\t},\n\n\t\tphong: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.specularmap,\n\t\t\t\tUniformsLib.envmap,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.gradientmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\t\tspecular: { value: new Color( 0x111111 ) },\n\t\t\t\t\tshininess: { value: 30 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t\t},\n\n\t\tstandard: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.envmap,\n\t\t\t\tUniformsLib.aomap,\n\t\t\t\tUniformsLib.lightmap,\n\t\t\t\tUniformsLib.emissivemap,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\tUniformsLib.roughnessmap,\n\t\t\t\tUniformsLib.metalnessmap,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\temissive: { value: new Color( 0x000000 ) },\n\t\t\t\t\troughness: { value: 0.5 },\n\t\t\t\t\tmetalness: { value: 0.5 },\n\t\t\t\t\tenvMapIntensity: { value: 1 } // temporary\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t\t},\n\n\t\tpoints: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.points,\n\t\t\t\tUniformsLib.fog\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.points_vert,\n\t\t\tfragmentShader: ShaderChunk.points_frag\n\n\t\t},\n\n\t\tdashed: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.fog,\n\t\t\t\t{\n\t\t\t\t\tscale: { value: 1 },\n\t\t\t\t\tdashSize: { value: 1 },\n\t\t\t\t\ttotalSize: { value: 2 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t\t},\n\n\t\tdepth: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.displacementmap\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.depth_vert,\n\t\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t\t},\n\n\t\tnormal: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.bumpmap,\n\t\t\t\tUniformsLib.normalmap,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\t{\n\t\t\t\t\topacity: { value: 1.0 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.normal_vert,\n\t\t\tfragmentShader: ShaderChunk.normal_frag\n\n\t\t},\n\n\t\t/* -------------------------------------------------------------------------\n\t\t//\tCube map shader\n\t\t ------------------------------------------------------------------------- */\n\n\t\tcube: {\n\n\t\t\tuniforms: {\n\t\t\t\ttCube: { value: null },\n\t\t\t\ttFlip: { value: - 1 },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.cube_vert,\n\t\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t\t},\n\n\t\tequirect: {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t},\n\n\t\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t\t},\n\n\t\tdistanceRGBA: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.common,\n\t\t\t\tUniformsLib.displacementmap,\n\t\t\t\t{\n\t\t\t\t\treferencePosition: { value: new Vector3() },\n\t\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t\t},\n\n\t\tshadow: {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.lights,\n\t\t\t\t{\n\t\t\t\t\tcolor: { value: new Color( 0x00000 ) },\n\t\t\t\t\topacity: { value: 1.0 }\n\t\t\t\t},\n\t\t\t] ),\n\n\t\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t\t}\n\n\t};\n\n\tShaderLib.physical = {\n\n\t\tuniforms: UniformsUtils.merge( [\n\t\t\tShaderLib.standard.uniforms,\n\t\t\t{\n\t\t\t\tclearCoat: { value: 0 },\n\t\t\t\tclearCoatRoughness: { value: 0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Box2( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector2( + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector2( - Infinity, - Infinity );\n\n\t}\n\n\tObject.assign( Box2.prototype, {\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = + Infinity;\n\t\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\t\tpoint.y < this.min.y || point.y > this.max.y ? false : true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 4 splitting planes to rule out intersections\n\n\t\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ? false : true;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector2();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector2();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction WebGLFlareRenderer( renderer, gl, state, textures, capabilities ) {\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar shader, program, attributes, uniforms;\n\n\t\tvar tempTexture, occlusionTexture;\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 1, - 1,  0, 0,\n\t\t\t\t 1, - 1,  1, 0,\n\t\t\t\t 1,  1,  1, 1,\n\t\t\t\t- 1,  1,  0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\t// buffers\n\n\t\t\tvertexBuffer     = gl.createBuffer();\n\t\t\telementBuffer    = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\t// textures\n\n\t\t\ttempTexture      = gl.createTexture();\n\t\t\tocclusionTexture = gl.createTexture();\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGB, 16, 16, 0, gl.RGB, gl.UNSIGNED_BYTE, 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_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\tgl.texImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 16, 16, 0, gl.RGBA, gl.UNSIGNED_BYTE, 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_MAG_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\n\t\t\tshader = {\n\n\t\t\t\tvertexShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform vec3 screenPosition;\",\n\t\t\t\t\t\"uniform vec2 scale;\",\n\t\t\t\t\t\"uniform float rotation;\",\n\n\t\t\t\t\t\"uniform sampler2D occlusionMap;\",\n\n\t\t\t\t\t\"attribute vec2 position;\",\n\t\t\t\t\t\"attribute vec2 uv;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t\"vUV = uv;\",\n\n\t\t\t\t\t\t\"vec2 pos = position;\",\n\n\t\t\t\t\t\t\"if ( renderType == 2 ) {\",\n\n\t\t\t\t\t\t\t\"vec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\",\n\t\t\t\t\t\t\t\"visibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\",\n\n\t\t\t\t\t\t\t\"vVisibility =        visibility.r / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.g / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *=       visibility.b / 9.0;\",\n\t\t\t\t\t\t\t\"vVisibility *= 1.0 - visibility.a / 9.0;\",\n\n\t\t\t\t\t\t\t\"pos.x = cos( rotation ) * position.x - sin( rotation ) * position.y;\",\n\t\t\t\t\t\t\t\"pos.y = sin( rotation ) * position.x + cos( rotation ) * position.y;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\t\"gl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" ),\n\n\t\t\t\tfragmentShader: [\n\n\t\t\t\t\t\"uniform lowp int renderType;\",\n\n\t\t\t\t\t\"uniform sampler2D map;\",\n\t\t\t\t\t\"uniform float opacity;\",\n\t\t\t\t\t\"uniform vec3 color;\",\n\n\t\t\t\t\t\"varying vec2 vUV;\",\n\t\t\t\t\t\"varying float vVisibility;\",\n\n\t\t\t\t\t\"void main() {\",\n\n\t\t\t\t\t\t// pink square\n\n\t\t\t\t\t\t\"if ( renderType == 0 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = vec4( 1.0, 0.0, 1.0, 0.0 );\",\n\n\t\t\t\t\t\t// restore\n\n\t\t\t\t\t\t\"} else if ( renderType == 1 ) {\",\n\n\t\t\t\t\t\t\t\"gl_FragColor = texture2D( map, vUV );\",\n\n\t\t\t\t\t\t// flare\n\n\t\t\t\t\t\t\"} else {\",\n\n\t\t\t\t\t\t\t\"vec4 texture = texture2D( map, vUV );\",\n\t\t\t\t\t\t\t\"texture.a *= opacity * vVisibility;\",\n\t\t\t\t\t\t\t\"gl_FragColor = texture;\",\n\t\t\t\t\t\t\t\"gl_FragColor.rgb *= color;\",\n\n\t\t\t\t\t\t\"}\",\n\n\t\t\t\t\t\"}\"\n\n\t\t\t\t].join( \"\\n\" )\n\n\t\t\t};\n\n\t\t\tprogram = createProgram( shader );\n\n\t\t\tattributes = {\n\t\t\t\tvertex: gl.getAttribLocation ( program, \"position\" ),\n\t\t\t\tuv:     gl.getAttribLocation ( program, \"uv\" )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\trenderType:     gl.getUniformLocation( program, \"renderType\" ),\n\t\t\t\tmap:            gl.getUniformLocation( program, \"map\" ),\n\t\t\t\tocclusionMap:   gl.getUniformLocation( program, \"occlusionMap\" ),\n\t\t\t\topacity:        gl.getUniformLocation( program, \"opacity\" ),\n\t\t\t\tcolor:          gl.getUniformLocation( program, \"color\" ),\n\t\t\t\tscale:          gl.getUniformLocation( program, \"scale\" ),\n\t\t\t\trotation:       gl.getUniformLocation( program, \"rotation\" ),\n\t\t\t\tscreenPosition: gl.getUniformLocation( program, \"screenPosition\" )\n\t\t\t};\n\n\t\t}\n\n\t\t/*\n\t\t * Render lens flares\n\t\t * Method: renders 16x16 0xff00ff-colored points scattered over the light source area,\n\t\t *         reads these back and calculates occlusion.\n\t\t */\n\n\t\tthis.render = function ( flares, scene, camera, viewport ) {\n\n\t\t\tif ( flares.length === 0 ) return;\n\n\t\t\tvar tempPosition = new Vector3();\n\n\t\t\tvar invAspect = viewport.w / viewport.z,\n\t\t\t\thalfViewportWidth = viewport.z * 0.5,\n\t\t\t\thalfViewportHeight = viewport.w * 0.5;\n\n\t\t\tvar size = 16 / viewport.w,\n\t\t\t\tscale = new Vector2( size * invAspect, size );\n\n\t\t\tvar screenPosition = new Vector3( 1, 1, 0 ),\n\t\t\t\tscreenPositionPixels = new Vector2( 1, 1 );\n\n\t\t\tvar validArea = new Box2();\n\n\t\t\tvalidArea.min.set( viewport.x, viewport.y );\n\t\t\tvalidArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) );\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tstate.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.vertex );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t// loop through all lens flares to update their occlusion and positions\n\t\t\t// setup gl and common used attribs/uniforms\n\n\t\t\tgl.uniform1i( uniforms.occlusionMap, 0 );\n\t\t\tgl.uniform1i( uniforms.map, 1 );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.vertex, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.buffers.depth.setMask( false );\n\n\t\t\tfor ( var i = 0, l = flares.length; i < l; i ++ ) {\n\n\t\t\t\tsize = 16 / viewport.w;\n\t\t\t\tscale.set( size * invAspect, size );\n\n\t\t\t\t// calc object screen position\n\n\t\t\t\tvar flare = flares[ i ];\n\n\t\t\t\ttempPosition.set( flare.matrixWorld.elements[ 12 ], flare.matrixWorld.elements[ 13 ], flare.matrixWorld.elements[ 14 ] );\n\n\t\t\t\ttempPosition.applyMatrix4( camera.matrixWorldInverse );\n\t\t\t\ttempPosition.applyMatrix4( camera.projectionMatrix );\n\n\t\t\t\t// setup arrays for gl programs\n\n\t\t\t\tscreenPosition.copy( tempPosition );\n\n\t\t\t\t// horizontal and vertical coordinate of the lower left corner of the pixels to copy\n\n\t\t\t\tscreenPositionPixels.x = viewport.x + ( screenPosition.x * halfViewportWidth ) + halfViewportWidth - 8;\n\t\t\t\tscreenPositionPixels.y = viewport.y + ( screenPosition.y * halfViewportHeight ) + halfViewportHeight - 8;\n\n\t\t\t\t// screen cull\n\n\t\t\t\tif ( validArea.containsPoint( screenPositionPixels ) === true ) {\n\n\t\t\t\t\t// save current RGB to temp texture\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, null );\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGB, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// render pink quad\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\n\t\t\t\t\tstate.disable( gl.BLEND );\n\t\t\t\t\tstate.enable( gl.DEPTH_TEST );\n\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// copy result to occlusionMap\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, occlusionTexture );\n\t\t\t\t\tgl.copyTexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, screenPositionPixels.x, screenPositionPixels.y, 16, 16, 0 );\n\n\n\t\t\t\t\t// restore graphics\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 1 );\n\t\t\t\t\tstate.disable( gl.DEPTH_TEST );\n\n\t\t\t\t\tstate.activeTexture( gl.TEXTURE1 );\n\t\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, tempTexture );\n\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\n\t\t\t\t\t// update object positions\n\n\t\t\t\t\tflare.positionScreen.copy( screenPosition );\n\n\t\t\t\t\tif ( flare.customUpdateCallback ) {\n\n\t\t\t\t\t\tflare.customUpdateCallback( flare );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tflare.updateLensFlares();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// render flares\n\n\t\t\t\t\tgl.uniform1i( uniforms.renderType, 2 );\n\t\t\t\t\tstate.enable( gl.BLEND );\n\n\t\t\t\t\tfor ( var j = 0, jl = flare.lensFlares.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar sprite = flare.lensFlares[ j ];\n\n\t\t\t\t\t\tif ( sprite.opacity > 0.001 && sprite.scale > 0.001 ) {\n\n\t\t\t\t\t\t\tscreenPosition.x = sprite.x;\n\t\t\t\t\t\t\tscreenPosition.y = sprite.y;\n\t\t\t\t\t\t\tscreenPosition.z = sprite.z;\n\n\t\t\t\t\t\t\tsize = sprite.size * sprite.scale / viewport.w;\n\n\t\t\t\t\t\t\tscale.x = size * invAspect;\n\t\t\t\t\t\t\tscale.y = size;\n\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.screenPosition, screenPosition.x, screenPosition.y, screenPosition.z );\n\t\t\t\t\t\t\tgl.uniform2f( uniforms.scale, scale.x, scale.y );\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.rotation, sprite.rotation );\n\n\t\t\t\t\t\t\tgl.uniform1f( uniforms.opacity, sprite.opacity );\n\t\t\t\t\t\t\tgl.uniform3f( uniforms.color, sprite.color.r, sprite.color.g, sprite.color.b );\n\n\t\t\t\t\t\t\tstate.setBlending( sprite.blending, sprite.blendEquation, sprite.blendSrc, sprite.blendDst );\n\n\t\t\t\t\t\t\ttextures.setTexture2D( sprite.texture, 1 );\n\n\t\t\t\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.DEPTH_TEST );\n\t\t\tstate.buffers.depth.setMask( true );\n\n\t\t\tstate.reset();\n\n\t\t};\n\n\t\tfunction createProgram( shader ) {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\n\t\t\tvar prefix = \"precision \" + capabilities.precision + \" float;\\n\";\n\n\t\t\tgl.shaderSource( fragmentShader, prefix + shader.fragmentShader );\n\t\t\tgl.shaderSource( vertexShader, prefix + shader.vertexShader );\n\n\t\t\tgl.compileShader( fragmentShader );\n\t\t\tgl.compileShader( vertexShader );\n\n\t\t\tgl.attachShader( program, fragmentShader );\n\t\t\tgl.attachShader( program, vertexShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CanvasTexture( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tCanvasTexture.prototype = Object.create( Texture.prototype );\n\tCanvasTexture.prototype.constructor = CanvasTexture;\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction WebGLSpriteRenderer( renderer, gl, state, textures, capabilities ) {\n\n\t\tvar vertexBuffer, elementBuffer;\n\t\tvar program, attributes, uniforms;\n\n\t\tvar texture;\n\n\t\t// decompose matrixWorld\n\n\t\tvar spritePosition = new Vector3();\n\t\tvar spriteRotation = new Quaternion();\n\t\tvar spriteScale = new Vector3();\n\n\t\tfunction init() {\n\n\t\t\tvar vertices = new Float32Array( [\n\t\t\t\t- 0.5, - 0.5,  0, 0,\n\t\t\t\t  0.5, - 0.5,  1, 0,\n\t\t\t\t  0.5,   0.5,  1, 1,\n\t\t\t\t- 0.5,   0.5,  0, 1\n\t\t\t] );\n\n\t\t\tvar faces = new Uint16Array( [\n\t\t\t\t0, 1, 2,\n\t\t\t\t0, 2, 3\n\t\t\t] );\n\n\t\t\tvertexBuffer  = gl.createBuffer();\n\t\t\telementBuffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.bufferData( gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\t\t\tgl.bufferData( gl.ELEMENT_ARRAY_BUFFER, faces, gl.STATIC_DRAW );\n\n\t\t\tprogram = createProgram();\n\n\t\t\tattributes = {\n\t\t\t\tposition:\t\t\tgl.getAttribLocation ( program, 'position' ),\n\t\t\t\tuv:\t\t\t\t\tgl.getAttribLocation ( program, 'uv' )\n\t\t\t};\n\n\t\t\tuniforms = {\n\t\t\t\tuvOffset:\t\t\tgl.getUniformLocation( program, 'uvOffset' ),\n\t\t\t\tuvScale:\t\t\tgl.getUniformLocation( program, 'uvScale' ),\n\n\t\t\t\trotation:\t\t\tgl.getUniformLocation( program, 'rotation' ),\n\t\t\t\tscale:\t\t\t\tgl.getUniformLocation( program, 'scale' ),\n\n\t\t\t\tcolor:\t\t\t\tgl.getUniformLocation( program, 'color' ),\n\t\t\t\tmap:\t\t\t\tgl.getUniformLocation( program, 'map' ),\n\t\t\t\topacity:\t\t\tgl.getUniformLocation( program, 'opacity' ),\n\n\t\t\t\tmodelViewMatrix: \tgl.getUniformLocation( program, 'modelViewMatrix' ),\n\t\t\t\tprojectionMatrix:\tgl.getUniformLocation( program, 'projectionMatrix' ),\n\n\t\t\t\tfogType:\t\t\tgl.getUniformLocation( program, 'fogType' ),\n\t\t\t\tfogDensity:\t\t\tgl.getUniformLocation( program, 'fogDensity' ),\n\t\t\t\tfogNear:\t\t\tgl.getUniformLocation( program, 'fogNear' ),\n\t\t\t\tfogFar:\t\t\t\tgl.getUniformLocation( program, 'fogFar' ),\n\t\t\t\tfogColor:\t\t\tgl.getUniformLocation( program, 'fogColor' ),\n\n\t\t\t\talphaTest:\t\t\tgl.getUniformLocation( program, 'alphaTest' )\n\t\t\t};\n\n\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\tcanvas.width = 8;\n\t\t\tcanvas.height = 8;\n\n\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\tcontext.fillStyle = 'white';\n\t\t\tcontext.fillRect( 0, 0, 8, 8 );\n\n\t\t\ttexture = new CanvasTexture( canvas );\n\n\t\t}\n\n\t\tthis.render = function ( sprites, scene, camera ) {\n\n\t\t\tif ( sprites.length === 0 ) return;\n\n\t\t\t// setup gl\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tinit();\n\n\t\t\t}\n\n\t\t\tstate.useProgram( program );\n\n\t\t\tstate.initAttributes();\n\t\t\tstate.enableAttribute( attributes.position );\n\t\t\tstate.enableAttribute( attributes.uv );\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\tstate.disable( gl.CULL_FACE );\n\t\t\tstate.enable( gl.BLEND );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, vertexBuffer );\n\t\t\tgl.vertexAttribPointer( attributes.position, 2, gl.FLOAT, false, 2 * 8, 0 );\n\t\t\tgl.vertexAttribPointer( attributes.uv, 2, gl.FLOAT, false, 2 * 8, 8 );\n\n\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, elementBuffer );\n\n\t\t\tgl.uniformMatrix4fv( uniforms.projectionMatrix, false, camera.projectionMatrix.elements );\n\n\t\t\tstate.activeTexture( gl.TEXTURE0 );\n\t\t\tgl.uniform1i( uniforms.map, 0 );\n\n\t\t\tvar oldFogType = 0;\n\t\t\tvar sceneFogType = 0;\n\t\t\tvar fog = scene.fog;\n\n\t\t\tif ( fog ) {\n\n\t\t\t\tgl.uniform3f( uniforms.fogColor, fog.color.r, fog.color.g, fog.color.b );\n\n\t\t\t\tif ( fog.isFog ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogNear, fog.near );\n\t\t\t\t\tgl.uniform1f( uniforms.fogFar, fog.far );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 1 );\n\t\t\t\t\toldFogType = 1;\n\t\t\t\t\tsceneFogType = 1;\n\n\t\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\t\tgl.uniform1f( uniforms.fogDensity, fog.density );\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, 2 );\n\t\t\t\t\toldFogType = 2;\n\t\t\t\t\tsceneFogType = 2;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tgl.uniform1i( uniforms.fogType, 0 );\n\t\t\t\toldFogType = 0;\n\t\t\t\tsceneFogType = 0;\n\n\t\t\t}\n\n\n\t\t\t// update positions and sort\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\n\t\t\t\tsprite.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, sprite.matrixWorld );\n\t\t\t\tsprite.z = - sprite.modelViewMatrix.elements[ 14 ];\n\n\t\t\t}\n\n\t\t\tsprites.sort( painterSortStable );\n\n\t\t\t// render all sprites\n\n\t\t\tvar scale = [];\n\n\t\t\tfor ( var i = 0, l = sprites.length; i < l; i ++ ) {\n\n\t\t\t\tvar sprite = sprites[ i ];\n\t\t\t\tvar material = sprite.material;\n\n\t\t\t\tif ( material.visible === false ) continue;\n\n\t\t\t\tsprite.onBeforeRender( renderer, scene, camera, undefined, material, undefined );\n\n\t\t\t\tgl.uniform1f( uniforms.alphaTest, material.alphaTest );\n\t\t\t\tgl.uniformMatrix4fv( uniforms.modelViewMatrix, false, sprite.modelViewMatrix.elements );\n\n\t\t\t\tsprite.matrixWorld.decompose( spritePosition, spriteRotation, spriteScale );\n\n\t\t\t\tscale[ 0 ] = spriteScale.x;\n\t\t\t\tscale[ 1 ] = spriteScale.y;\n\n\t\t\t\tvar fogType = 0;\n\n\t\t\t\tif ( scene.fog && material.fog ) {\n\n\t\t\t\t\tfogType = sceneFogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( oldFogType !== fogType ) {\n\n\t\t\t\t\tgl.uniform1i( uniforms.fogType, fogType );\n\t\t\t\t\toldFogType = fogType;\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.map !== null ) {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, material.map.offset.x, material.map.offset.y );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, material.map.repeat.x, material.map.repeat.y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.uniform2f( uniforms.uvOffset, 0, 0 );\n\t\t\t\t\tgl.uniform2f( uniforms.uvScale, 1, 1 );\n\n\t\t\t\t}\n\n\t\t\t\tgl.uniform1f( uniforms.opacity, material.opacity );\n\t\t\t\tgl.uniform3f( uniforms.color, material.color.r, material.color.g, material.color.b );\n\n\t\t\t\tgl.uniform1f( uniforms.rotation, material.rotation );\n\t\t\t\tgl.uniform2fv( uniforms.scale, scale );\n\n\t\t\t\tstate.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha );\n\t\t\t\tstate.buffers.depth.setTest( material.depthTest );\n\t\t\t\tstate.buffers.depth.setMask( material.depthWrite );\n\n\t\t\t\ttextures.setTexture2D( material.map || texture, 0 );\n\n\t\t\t\tgl.drawElements( gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0 );\n\n\t\t\t\tsprite.onAfterRender( renderer, scene, camera, undefined, material, undefined );\n\n\t\t\t}\n\n\t\t\t// restore gl\n\n\t\t\tstate.enable( gl.CULL_FACE );\n\n\t\t\tstate.reset();\n\n\t\t};\n\n\t\tfunction createProgram() {\n\n\t\t\tvar program = gl.createProgram();\n\n\t\t\tvar vertexShader = gl.createShader( gl.VERTEX_SHADER );\n\t\t\tvar fragmentShader = gl.createShader( gl.FRAGMENT_SHADER );\n\n\t\t\tgl.shaderSource( vertexShader, [\n\n\t\t\t\t'precision ' + capabilities.precision + ' float;',\n\n\t\t\t\t'#define SHADER_NAME ' + 'SpriteMaterial',\n\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform float rotation;',\n\t\t\t\t'uniform vec2 scale;',\n\t\t\t\t'uniform vec2 uvOffset;',\n\t\t\t\t'uniform vec2 uvScale;',\n\n\t\t\t\t'attribute vec2 position;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vUV = uvOffset + uv * uvScale;',\n\n\t\t\t\t\t'vec2 alignedPosition = position * scale;',\n\n\t\t\t\t\t'vec2 rotatedPosition;',\n\t\t\t\t\t'rotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;',\n\t\t\t\t\t'rotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;',\n\n\t\t\t\t\t'vec4 finalPosition;',\n\n\t\t\t\t\t'finalPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );',\n\t\t\t\t\t'finalPosition.xy += rotatedPosition;',\n\t\t\t\t\t'finalPosition = projectionMatrix * finalPosition;',\n\n\t\t\t\t\t'gl_Position = finalPosition;',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.shaderSource( fragmentShader, [\n\n\t\t\t\t'precision ' + capabilities.precision + ' float;',\n\n\t\t\t\t'#define SHADER_NAME ' + 'SpriteMaterial',\n\n\t\t\t\t'uniform vec3 color;',\n\t\t\t\t'uniform sampler2D map;',\n\t\t\t\t'uniform float opacity;',\n\n\t\t\t\t'uniform int fogType;',\n\t\t\t\t'uniform vec3 fogColor;',\n\t\t\t\t'uniform float fogDensity;',\n\t\t\t\t'uniform float fogNear;',\n\t\t\t\t'uniform float fogFar;',\n\t\t\t\t'uniform float alphaTest;',\n\n\t\t\t\t'varying vec2 vUV;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t\t'vec4 texture = texture2D( map, vUV );',\n\n\t\t\t\t\t'if ( texture.a < alphaTest ) discard;',\n\n\t\t\t\t\t'gl_FragColor = vec4( color * texture.xyz, texture.a * opacity );',\n\n\t\t\t\t\t'if ( fogType > 0 ) {',\n\n\t\t\t\t\t\t'float depth = gl_FragCoord.z / gl_FragCoord.w;',\n\t\t\t\t\t\t'float fogFactor = 0.0;',\n\n\t\t\t\t\t\t'if ( fogType == 1 ) {',\n\n\t\t\t\t\t\t\t'fogFactor = smoothstep( fogNear, fogFar, depth );',\n\n\t\t\t\t\t\t'} else {',\n\n\t\t\t\t\t\t\t'const float LOG2 = 1.442695;',\n\t\t\t\t\t\t\t'fogFactor = exp2( - fogDensity * fogDensity * depth * depth * LOG2 );',\n\t\t\t\t\t\t\t'fogFactor = 1.0 - clamp( fogFactor, 0.0, 1.0 );',\n\n\t\t\t\t\t\t'}',\n\n\t\t\t\t\t\t'gl_FragColor = mix( gl_FragColor, vec4( fogColor, gl_FragColor.w ), fogFactor );',\n\n\t\t\t\t\t'}',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ) );\n\n\t\t\tgl.compileShader( vertexShader );\n\t\t\tgl.compileShader( fragmentShader );\n\n\t\t\tgl.attachShader( program, vertexShader );\n\t\t\tgl.attachShader( program, fragmentShader );\n\n\t\t\tgl.linkProgram( program );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction painterSortStable( a, b ) {\n\n\t\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\t\treturn a.renderOrder - b.renderOrder;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else {\n\n\t\t\t\treturn b.id - a.id;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tvar materialId = 0;\n\n\tfunction Material() {\n\n\t\tObject.defineProperty( this, 'id', { value: materialId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.fog = true;\n\t\tthis.lights = true;\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.flatShading = false;\n\t\tthis.vertexColors = NoColors; // THREE.NoColors, THREE.VertexColors, THREE.FaceColors\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = false;\n\n\t\tthis.blendSrc = SrcAlphaFactor;\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\t\tthis.blendEquation = AddEquation;\n\t\tthis.blendSrcAlpha = null;\n\t\tthis.blendDstAlpha = null;\n\t\tthis.blendEquationAlpha = null;\n\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\n\n\t\tthis.colorWrite = true;\n\n\t\tthis.precision = null; // override the renderer's default precision for this material\n\n\t\tthis.polygonOffset = false;\n\t\tthis.polygonOffsetFactor = 0;\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\tthis.dithering = false;\n\n\t\tthis.alphaTest = 0;\n\t\tthis.premultipliedAlpha = false;\n\n\t\tthis.overdraw = 0; // Overdrawn pixels (typically between 0 and 1) for fixing antialiasing gaps in CanvasRenderer\n\n\t\tthis.visible = true;\n\n\t\tthis.userData = {};\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n\tObject.assign( Material.prototype, EventDispatcher.prototype, {\n\n\t\tisMaterial: true,\n\n\t\tonBeforeCompile: function () {},\n\n\t\tsetValues: function ( values ) {\n\n\t\t\tif ( values === undefined ) return;\n\n\t\t\tfor ( var key in values ) {\n\n\t\t\t\tvar newValue = values[ key ];\n\n\t\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.Material: '\" + key + \"' parameter is undefined.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// for backward compatability if shading is set in the constructor\n\t\t\t\tif ( key === 'shading' ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\t\t\t\t\tthis.flatShading = ( newValue === FlatShading ) ? true : false;\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar currentValue = this[ key ];\n\n\t\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.\" + this.type + \": '\" + key + \"' is not a property of this material.\" );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t\t} else if ( key === 'overdraw' ) {\n\n\t\t\t\t\t// ensure overdraw is backwards-compatible with legacy boolean type\n\t\t\t\t\tthis[ key ] = Number( newValue );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar isRoot = meta === undefined;\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tmeta = {\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.5,\n\t\t\t\t\ttype: 'Material',\n\t\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Material serialization\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\t\tif ( this.clearCoat !== undefined ) data.clearCoat = this.clearCoat;\n\t\t\tif ( this.clearCoatRoughness !== undefined ) data.clearCoatRoughness = this.clearCoatRoughness;\n\n\t\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\t\t\tif ( this.lightMap && this.lightMap.isTexture ) data.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t\t}\n\t\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t\t}\n\t\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t\t}\n\t\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\t\t\t\tdata.reflectivity = this.reflectivity; // Scale behind envMap\n\n\t\t\t}\n\n\t\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\t\tif ( this.flatShading === true ) data.flatShading = this.flatShading;\n\t\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\t\tif ( this.vertexColors !== NoColors ) data.vertexColors = this.vertexColors;\n\n\t\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\t\tdata.depthFunc = this.depthFunc;\n\t\t\tdata.depthTest = this.depthTest;\n\t\t\tdata.depthWrite = this.depthWrite;\n\n\t\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\n\t\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\t\tif ( this.morphTargets === true ) data.morphTargets = true;\n\t\t\tif ( this.skinning === true ) data.skinning = true;\n\n\t\t\tif ( this.visible === false ) data.visible = false;\n\t\t\tif ( JSON.stringify( this.userData ) !== '{}' ) data.userData = this.userData;\n\n\t\t\t// TODO: Copied from Object3D.toJSON\n\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t\tif ( isRoot ) {\n\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.fog = source.fog;\n\t\t\tthis.lights = source.lights;\n\n\t\t\tthis.blending = source.blending;\n\t\t\tthis.side = source.side;\n\t\t\tthis.flatShading = source.flatShading;\n\t\t\tthis.vertexColors = source.vertexColors;\n\n\t\t\tthis.opacity = source.opacity;\n\t\t\tthis.transparent = source.transparent;\n\n\t\t\tthis.blendSrc = source.blendSrc;\n\t\t\tthis.blendDst = source.blendDst;\n\t\t\tthis.blendEquation = source.blendEquation;\n\t\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\t\tthis.depthFunc = source.depthFunc;\n\t\t\tthis.depthTest = source.depthTest;\n\t\t\tthis.depthWrite = source.depthWrite;\n\n\t\t\tthis.colorWrite = source.colorWrite;\n\n\t\t\tthis.precision = source.precision;\n\n\t\t\tthis.polygonOffset = source.polygonOffset;\n\t\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\t\tthis.dithering = source.dithering;\n\n\t\t\tthis.alphaTest = source.alphaTest;\n\t\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\n\t\t\tthis.overdraw = source.overdraw;\n\n\t\t\tthis.visible = source.visible;\n\t\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\t\tthis.clipShadows = source.clipShadows;\n\t\t\tthis.clipIntersection = source.clipIntersection;\n\n\t\t\tvar srcPlanes = source.clippingPlanes,\n\t\t\t\tdstPlanes = null;\n\n\t\t\tif ( srcPlanes !== null ) {\n\n\t\t\t\tvar n = srcPlanes.length;\n\t\t\t\tdstPlanes = new Array( n );\n\n\t\t\t\tfor ( var i = 0; i !== n; ++ i )\n\t\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t\tthis.clippingPlanes = dstPlanes;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t *  defines: { \"label\" : \"value\" },\n\t *  uniforms: { \"parameter1\": { value: 1.0 }, \"parameter2\": { value2: 2 } },\n\t *\n\t *  fragmentShader: <string>,\n\t *  vertexShader: <string>,\n\t *\n\t *  wireframe: <boolean>,\n\t *  wireframeLinewidth: <float>,\n\t *\n\t *  lights: <bool>,\n\t *\n\t *  skinning: <bool>,\n\t *  morphTargets: <bool>,\n\t *  morphNormals: <bool>\n\t * }\n\t */\n\n\tfunction ShaderMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\n\t\tthis.vertexShader = 'void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}';\n\t\tthis.fragmentShader = 'void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}';\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false; // set to use scene fog\n\t\tthis.lights = false; // set to use scene lights\n\t\tthis.clipping = false; // set to use user-defined clipping planes\n\n\t\tthis.skinning = false; // set to use skinning attribute streams\n\t\tthis.morphTargets = false; // set to use morph targets\n\t\tthis.morphNormals = false; // set to use morph normals\n\n\t\tthis.extensions = {\n\t\t\tderivatives: false, // set to use derivatives\n\t\t\tfragDepth: false, // set to use fragment depth values\n\t\t\tdrawBuffers: false, // set to use draw buffers\n\t\t\tshaderTextureLOD: false // set to use shader texture LOD\n\t\t};\n\n\t\t// When rendered geometry doesn't include these attributes but the material does,\n\t\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv2': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tif ( parameters.attributes !== undefined ) {\n\n\t\t\t\tconsole.error( 'THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead.' );\n\n\t\t\t}\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tShaderMaterial.prototype = Object.create( Material.prototype );\n\tShaderMaterial.prototype.constructor = ShaderMaterial;\n\n\tShaderMaterial.prototype.isShaderMaterial = true;\n\n\tShaderMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = UniformsUtils.clone( source.uniforms );\n\n\t\tthis.defines = source.defines;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.skinning = source.skinning;\n\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\tthis.extensions = source.extensions;\n\n\t\treturn this;\n\n\t};\n\n\tShaderMaterial.prototype.toJSON = function ( meta ) {\n\n\t\tvar data = Material.prototype.toJSON.call( this, meta );\n\n\t\tdata.uniforms = this.uniforms;\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\treturn data;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / https://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t *\n\t *  opacity: <float>,\n\t *\n\t *  map: new THREE.Texture( <Image> ),\n\t *\n\t *  alphaMap: new THREE.Texture( <Image> ),\n\t *\n\t *  displacementMap: new THREE.Texture( <Image> ),\n\t *  displacementScale: <float>,\n\t *  displacementBias: <float>,\n\t *\n\t *  wireframe: <boolean>,\n\t *  wireframeLinewidth: <float>\n\t * }\n\t */\n\n\tfunction MeshDepthMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshDepthMaterial.prototype = Object.create( Material.prototype );\n\tMeshDepthMaterial.prototype.constructor = MeshDepthMaterial;\n\n\tMeshDepthMaterial.prototype.isMeshDepthMaterial = true;\n\n\tMeshDepthMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t *\n\t *  referencePosition: <float>,\n\t *  nearDistance: <float>,\n\t *  farDistance: <float>,\n\t *\n\t *  skinning: <bool>,\n\t *  morphTargets: <bool>,\n\t *\n\t *  map: new THREE.Texture( <Image> ),\n\t *\n\t *  alphaMap: new THREE.Texture( <Image> ),\n\t *\n\t *  displacementMap: new THREE.Texture( <Image> ),\n\t *  displacementScale: <float>,\n\t *  displacementBias: <float>\n\t *\n\t * }\n\t */\n\n\tfunction MeshDistanceMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshDistanceMaterial';\n\n\t\tthis.referencePosition = new Vector3();\n\t\tthis.nearDistance = 1;\n\t\tthis.farDistance = 1000;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshDistanceMaterial.prototype = Object.create( Material.prototype );\n\tMeshDistanceMaterial.prototype.constructor = MeshDistanceMaterial;\n\n\tMeshDistanceMaterial.prototype.isMeshDistanceMaterial = true;\n\n\tMeshDistanceMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.referencePosition.copy( source.referencePosition );\n\t\tthis.nearDistance = source.nearDistance;\n\t\tthis.farDistance = source.farDistance;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Box3( min, max ) {\n\n\t\tthis.min = ( min !== undefined ) ? min : new Vector3( + Infinity, + Infinity, + Infinity );\n\t\tthis.max = ( max !== undefined ) ? max : new Vector3( - Infinity, - Infinity, - Infinity );\n\n\t}\n\n\tObject.assign( Box3.prototype, {\n\n\t\tisBox3: true,\n\n\t\tset: function ( min, max ) {\n\n\t\t\tthis.min.copy( min );\n\t\t\tthis.max.copy( max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromArray: function ( array ) {\n\n\t\t\tvar minX = + Infinity;\n\t\t\tvar minY = + Infinity;\n\t\t\tvar minZ = + Infinity;\n\n\t\t\tvar maxX = - Infinity;\n\t\t\tvar maxY = - Infinity;\n\t\t\tvar maxZ = - Infinity;\n\n\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tvar x = array[ i ];\n\t\t\t\tvar y = array[ i + 1 ];\n\t\t\t\tvar z = array[ i + 2 ];\n\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\t\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t\t}\n\n\t\t\tthis.min.set( minX, minY, minZ );\n\t\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromBufferAttribute: function ( attribute ) {\n\n\t\t\tvar minX = + Infinity;\n\t\t\tvar minY = + Infinity;\n\t\t\tvar minZ = + Infinity;\n\n\t\t\tvar maxX = - Infinity;\n\t\t\tvar maxY = - Infinity;\n\t\t\tvar maxZ = - Infinity;\n\n\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\tvar x = attribute.getX( i );\n\t\t\t\tvar y = attribute.getY( i );\n\t\t\t\tvar z = attribute.getZ( i );\n\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\t\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t\t}\n\n\t\t\tthis.min.set( minX, minY, minZ );\n\t\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function ( points ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCenterAndSize: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function setFromCenterAndSize( center, size ) {\n\n\t\t\t\tvar halfSize = v1.copy( size ).multiplyScalar( 0.5 );\n\n\t\t\t\tthis.min.copy( center ).sub( halfSize );\n\t\t\t\tthis.max.copy( center ).add( halfSize );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromObject: function ( object ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\treturn this.expandByObject( object );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( box ) {\n\n\t\t\tthis.min.copy( box.min );\n\t\t\tthis.max.copy( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmakeEmpty: function () {\n\n\t\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tisEmpty: function () {\n\n\t\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tgetSize: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn this.isEmpty() ? result.set( 0, 0, 0 ) : result.subVectors( this.max, this.min );\n\n\t\t},\n\n\t\texpandByPoint: function ( point ) {\n\n\t\t\tthis.min.min( point );\n\t\t\tthis.max.max( point );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByVector: function ( vector ) {\n\n\t\t\tthis.min.sub( vector );\n\t\t\tthis.max.add( vector );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByScalar: function ( scalar ) {\n\n\t\t\tthis.min.addScalar( - scalar );\n\t\t\tthis.max.addScalar( scalar );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\texpandByObject: function () {\n\n\t\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t\t// accounting for both the object's, and children's, world transforms\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function expandByObject( object ) {\n\n\t\t\t\tvar scope = this;\n\n\t\t\t\tobject.updateMatrixWorld( true );\n\n\t\t\t\tobject.traverse( function ( node ) {\n\n\t\t\t\t\tvar i, l;\n\n\t\t\t\t\tvar geometry = node.geometry;\n\n\t\t\t\t\tif ( geometry !== undefined ) {\n\n\t\t\t\t\t\tif ( geometry.isGeometry ) {\n\n\t\t\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\t\t\tfor ( i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\tv1.copy( vertices[ i ] );\n\t\t\t\t\t\t\t\tv1.applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\t\t\tvar attribute = geometry.attributes.position;\n\n\t\t\t\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\t\t\t\tfor ( i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\t\tv1.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\t\t\t\tscope.expandByPoint( v1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\n\t\t},\n\n\t\tcontainsBox: function ( box ) {\n\n\t\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t\t},\n\n\t\tgetParameter: function ( point, optionalTarget ) {\n\n\t\t\t// This can potentially have a divide by zero if the box\n\t\t\t// has a size dimension of 0.\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.set(\n\t\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t\t);\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\t// using 6 splitting planes to rule out intersections.\n\t\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\t\tbox.max.z < this.min.z || box.min.z > this.max.z ? false : true;\n\n\t\t},\n\n\t\tintersectsSphere: ( function () {\n\n\t\t\tvar closestPoint = new Vector3();\n\n\t\t\treturn function intersectsSphere( sphere ) {\n\n\t\t\t\t// Find the point on the AABB closest to the sphere center.\n\t\t\t\tthis.clampPoint( sphere.center, closestPoint );\n\n\t\t\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\t\t\treturn closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\t\tvar min, max;\n\n\t\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t\t} else {\n\n\t\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t\t}\n\n\t\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t\t} else {\n\n\t\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t\t}\n\n\t\t\treturn ( min <= plane.constant && max >= plane.constant );\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.copy( point ).clamp( this.min, this.max );\n\n\t\t},\n\n\t\tdistanceToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceToPoint( point ) {\n\n\t\t\t\tvar clampedPoint = v1.copy( point ).clamp( this.min, this.max );\n\t\t\t\treturn clampedPoint.sub( point ).length();\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetBoundingSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function getBoundingSphere( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Sphere();\n\n\t\t\t\tthis.getCenter( result.center );\n\n\t\t\t\tresult.radius = this.getSize( v1 ).length() * 0.5;\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersect: function ( box ) {\n\n\t\t\tthis.min.max( box.min );\n\t\t\tthis.max.min( box.max );\n\n\t\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\t\tif( this.isEmpty() ) this.makeEmpty();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tunion: function ( box ) {\n\n\t\t\tthis.min.min( box.min );\n\t\t\tthis.max.max( box.max );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar points = [\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3()\n\t\t\t];\n\n\t\t\treturn function applyMatrix4( matrix ) {\n\n\t\t\t\t// transform of empty box is an empty box.\n\t\t\t\tif( this.isEmpty() ) return this;\n\n\t\t\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t\t\tpoints[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t\t\tpoints[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t\t\tpoints[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t\t\tpoints[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t\t\tpoints[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t\t\tpoints[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t\t\tpoints[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t\t\tpoints[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix );\t// 111\n\n\t\t\t\tthis.setFromPoints( points );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.min.add( offset );\n\t\t\tthis.max.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( box ) {\n\n\t\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Sphere( center, radius ) {\n\n\t\tthis.center = ( center !== undefined ) ? center : new Vector3();\n\t\tthis.radius = ( radius !== undefined ) ? radius : 0;\n\n\t}\n\n\tObject.assign( Sphere.prototype, {\n\n\t\tset: function ( center, radius ) {\n\n\t\t\tthis.center.copy( center );\n\t\t\tthis.radius = radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPoints: function () {\n\n\t\t\tvar box = new Box3();\n\n\t\t\treturn function setFromPoints( points, optionalCenter ) {\n\n\t\t\t\tvar center = this.center;\n\n\t\t\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\t\t\tcenter.copy( optionalCenter );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbox.setFromPoints( points ).getCenter( center );\n\n\t\t\t\t}\n\n\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\tfor ( var i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( sphere ) {\n\n\t\t\tthis.center.copy( sphere.center );\n\t\t\tthis.radius = sphere.radius;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tempty: function () {\n\n\t\t\treturn ( this.radius <= 0 );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar radiusSum = this.radius + sphere.radius;\n\n\t\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsSphere( this );\n\n\t\t},\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t\t},\n\n\t\tclampPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tresult.copy( point );\n\n\t\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t\tresult.sub( this.center ).normalize();\n\t\t\t\tresult.multiplyScalar( this.radius ).add( this.center );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\tgetBoundingBox: function ( optionalTarget ) {\n\n\t\t\tvar box = optionalTarget || new Box3();\n\n\t\t\tbox.set( this.center, this.center );\n\t\t\tbox.expandByScalar( this.radius );\n\n\t\t\treturn box;\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.center.applyMatrix4( matrix );\n\t\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.center.add( offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( sphere ) {\n\n\t\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t * @author tschw\n\t */\n\n\tfunction Matrix3() {\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t];\n\n\t\tif ( arguments.length > 0 ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.' );\n\n\t\t}\n\n\t}\n\n\tObject.assign( Matrix3.prototype, {\n\n\t\tisMatrix3: true,\n\n\t\tset: function ( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tidentity: function () {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0,\n\t\t\t\t0, 1, 0,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().fromArray( this.elements );\n\n\t\t},\n\n\t\tcopy: function ( m ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = m.elements;\n\n\t\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix4: function ( m ) {\n\n\t\t\tvar me = m.elements;\n\n\t\t\tthis.set(\n\n\t\t\t\tme[ 0 ], me[ 4 ], me[  8 ],\n\t\t\t\tme[ 1 ], me[ 5 ], me[  9 ],\n\t\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t\t);\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tapplyToBufferAttribute: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function applyToBufferAttribute( attribute ) {\n\n\t\t\t\tfor ( var i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tv1.x = attribute.getX( i );\n\t\t\t\t\tv1.y = attribute.getY( i );\n\t\t\t\t\tv1.z = attribute.getZ( i );\n\n\t\t\t\t\tv1.applyMatrix3( this );\n\n\t\t\t\t\tattribute.setXYZ( i, v1.x, v1.y, v1.z );\n\n\t\t\t\t}\n\n\t\t\t\treturn attribute;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmultiply: function ( m ) {\n\n\t\t\treturn this.multiplyMatrices( this, m );\n\n\t\t},\n\n\t\tpremultiply: function ( m ) {\n\n\t\t\treturn this.multiplyMatrices( m, this );\n\n\t\t},\n\n\t\tmultiplyMatrices: function ( a, b ) {\n\n\t\t\tvar ae = a.elements;\n\t\t\tvar be = b.elements;\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\t\tvar a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\t\tvar a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\t\tvar b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\t\tvar b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\t\tvar b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tmultiplyScalar: function ( s ) {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdeterminant: function () {\n\n\t\t\tvar te = this.elements;\n\n\t\t\tvar a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t\t},\n\n\t\tgetInverse: function ( matrix, throwOnDegenerate ) {\n\n\t\t\tif ( matrix && matrix.isMatrix4 ) {\n\n\t\t\t\tconsole.error( \"THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument.\" );\n\n\t\t\t}\n\n\t\t\tvar me = matrix.elements,\n\t\t\t\tte = this.elements,\n\n\t\t\t\tn11 = me[ 0 ], n21 = me[ 1 ], n31 = me[ 2 ],\n\t\t\t\tn12 = me[ 3 ], n22 = me[ 4 ], n32 = me[ 5 ],\n\t\t\t\tn13 = me[ 6 ], n23 = me[ 7 ], n33 = me[ 8 ],\n\n\t\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\t\tif ( det === 0 ) {\n\n\t\t\t\tvar msg = \"THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0\";\n\n\t\t\t\tif ( throwOnDegenerate === true ) {\n\n\t\t\t\t\tthrow new Error( msg );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( msg );\n\n\t\t\t\t}\n\n\t\t\t\treturn this.identity();\n\n\t\t\t}\n\n\t\t\tvar detInv = 1 / det;\n\n\t\t\tte[ 0 ] = t11 * detInv;\n\t\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\t\tte[ 3 ] = t12 * detInv;\n\t\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\t\tte[ 6 ] = t13 * detInv;\n\t\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttranspose: function () {\n\n\t\t\tvar tmp, m = this.elements;\n\n\t\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetNormalMatrix: function ( matrix4 ) {\n\n\t\t\treturn this.setFromMatrix4( matrix4 ).getInverse( this ).transpose();\n\n\t\t},\n\n\t\ttransposeIntoArray: function ( r ) {\n\n\t\t\tvar m = this.elements;\n\n\t\t\tr[ 0 ] = m[ 0 ];\n\t\t\tr[ 1 ] = m[ 3 ];\n\t\t\tr[ 2 ] = m[ 6 ];\n\t\t\tr[ 3 ] = m[ 1 ];\n\t\t\tr[ 4 ] = m[ 4 ];\n\t\t\tr[ 5 ] = m[ 7 ];\n\t\t\tr[ 6 ] = m[ 2 ];\n\t\t\tr[ 7 ] = m[ 5 ];\n\t\t\tr[ 8 ] = m[ 8 ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( matrix ) {\n\n\t\t\tvar te = this.elements;\n\t\t\tvar me = matrix.elements;\n\n\t\t\tfor ( var i = 0; i < 9; i ++ ) {\n\n\t\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tfromArray: function ( array, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tfor ( var i = 0; i < 9; i ++ ) {\n\n\t\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar te = this.elements;\n\n\t\t\tarray[ offset ] = te[ 0 ];\n\t\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\t\treturn array;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Plane( normal, constant ) {\n\n\t\t// normal is assumed to be normalized\n\n\t\tthis.normal = ( normal !== undefined ) ? normal : new Vector3( 1, 0, 0 );\n\t\tthis.constant = ( constant !== undefined ) ? constant : 0;\n\n\t}\n\n\tObject.assign( Plane.prototype, {\n\n\t\tset: function ( normal, constant ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetComponents: function ( x, y, z, w ) {\n\n\t\t\tthis.normal.set( x, y, z );\n\t\t\tthis.constant = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromNormalAndCoplanarPoint: function ( normal, point ) {\n\n\t\t\tthis.normal.copy( normal );\n\t\t\tthis.constant = - point.dot( this.normal );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromCoplanarPoints: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function setFromCoplanarPoints( a, b, c ) {\n\n\t\t\t\tvar normal = v1.subVectors( c, b ).cross( v2.subVectors( a, b ) ).normalize();\n\n\t\t\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\t\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( plane ) {\n\n\t\t\tthis.normal.copy( plane.normal );\n\t\t\tthis.constant = plane.constant;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\t\tvar inverseNormalLength = 1.0 / this.normal.length();\n\t\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\t\tthis.constant *= inverseNormalLength;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnegate: function () {\n\n\t\t\tthis.constant *= - 1;\n\t\t\tthis.normal.negate();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn this.normal.dot( point ) + this.constant;\n\n\t\t},\n\n\t\tdistanceToSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t\t},\n\n\t\tprojectPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point );\n\n\t\t},\n\n\t\tintersectLine: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectLine( line, optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tvar direction = line.delta( v1 );\n\n\t\t\t\tvar denominator = this.normal.dot( direction );\n\n\t\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t\t// line is coplanar, return origin\n\t\t\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\t\t\treturn result.copy( line.start );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\tvar t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\t\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t}\n\n\t\t\t\treturn result.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsLine: function ( line ) {\n\n\t\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\t\tvar startSign = this.distanceToPoint( line.start );\n\t\t\tvar endSign = this.distanceToPoint( line.end );\n\n\t\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t\t},\n\n\t\tintersectsBox: function ( box ) {\n\n\t\t\treturn box.intersectsPlane( this );\n\n\t\t},\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn sphere.intersectsPlane( this );\n\n\t\t},\n\n\t\tcoplanarPoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t\t},\n\n\t\tapplyMatrix4: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar m1 = new Matrix3();\n\n\t\t\treturn function applyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\t\t\tvar normalMatrix = optionalNormalMatrix || m1.getNormalMatrix( matrix );\n\n\t\t\t\tvar referencePoint = this.coplanarPoint( v1 ).applyMatrix4( matrix );\n\n\t\t\t\tvar normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function ( offset ) {\n\n\t\t\tthis.constant -= offset.dot( this.normal );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( plane ) {\n\n\t\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Frustum( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tthis.planes = [\n\n\t\t\t( p0 !== undefined ) ? p0 : new Plane(),\n\t\t\t( p1 !== undefined ) ? p1 : new Plane(),\n\t\t\t( p2 !== undefined ) ? p2 : new Plane(),\n\t\t\t( p3 !== undefined ) ? p3 : new Plane(),\n\t\t\t( p4 !== undefined ) ? p4 : new Plane(),\n\t\t\t( p5 !== undefined ) ? p5 : new Plane()\n\n\t\t];\n\n\t}\n\n\tObject.assign( Frustum.prototype, {\n\n\t\tset: function ( p0, p1, p2, p3, p4, p5 ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tplanes[ 0 ].copy( p0 );\n\t\t\tplanes[ 1 ].copy( p1 );\n\t\t\tplanes[ 2 ].copy( p2 );\n\t\t\tplanes[ 3 ].copy( p3 );\n\t\t\tplanes[ 4 ].copy( p4 );\n\t\t\tplanes[ 5 ].copy( p5 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( frustum ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromMatrix: function ( m ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar me = m.elements;\n\t\t\tvar me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\t\tvar me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\t\tvar me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\t\tvar me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tintersectsObject: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsObject( object ) {\n\n\t\t\t\tvar geometry = object.geometry;\n\n\t\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere )\n\t\t\t\t\t.applyMatrix4( object.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSprite: function () {\n\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function intersectsSprite( sprite ) {\n\n\t\t\t\tsphere.center.set( 0, 0, 0 );\n\t\t\t\tsphere.radius = 0.7071067811865476;\n\t\t\t\tsphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\tvar planes = this.planes;\n\t\t\tvar center = sphere.center;\n\t\t\tvar negRadius = - sphere.radius;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tvar distance = planes[ i ].distanceToPoint( center );\n\n\t\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t},\n\n\t\tintersectsBox: function () {\n\n\t\t\tvar p1 = new Vector3(),\n\t\t\t\tp2 = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\tvar planes = this.planes;\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tvar plane = planes[ i ];\n\n\t\t\t\t\tp1.x = plane.normal.x > 0 ? box.min.x : box.max.x;\n\t\t\t\t\tp2.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t\t\tp1.y = plane.normal.y > 0 ? box.min.y : box.max.y;\n\t\t\t\t\tp2.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t\t\tp1.z = plane.normal.z > 0 ? box.min.z : box.max.z;\n\t\t\t\t\tp2.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\t\t\tvar d1 = plane.distanceToPoint( p1 );\n\t\t\t\t\tvar d2 = plane.distanceToPoint( p2 );\n\n\t\t\t\t\t// if both outside plane, no intersection\n\n\t\t\t\t\tif ( d1 < 0 && d2 < 0 ) {\n\n\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\tvar planes = this.planes;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLShadowMap( _renderer, _objects, maxTextureSize ) {\n\n\t\tvar _frustum = new Frustum(),\n\t\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t\t_shadowMapSize = new Vector2(),\n\t\t\t_maxShadowMapSize = new Vector2( maxTextureSize, maxTextureSize ),\n\n\t\t\t_lookTarget = new Vector3(),\n\t\t\t_lightPositionWorld = new Vector3(),\n\n\t\t\t_MorphingFlag = 1,\n\t\t\t_SkinningFlag = 2,\n\n\t\t\t_NumberOfMaterialVariants = ( _MorphingFlag | _SkinningFlag ) + 1,\n\n\t\t\t_depthMaterials = new Array( _NumberOfMaterialVariants ),\n\t\t\t_distanceMaterials = new Array( _NumberOfMaterialVariants ),\n\n\t\t\t_materialCache = {};\n\n\t\tvar cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\t\tnew Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )\n\t\t];\n\n\t\tvar cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, - 1 )\n\t\t];\n\n\t\tvar cube2DViewPorts = [\n\t\t\tnew Vector4(), new Vector4(), new Vector4(),\n\t\t\tnew Vector4(), new Vector4(), new Vector4()\n\t\t];\n\n\t\t// init\n\n\t\tfor ( var i = 0; i !== _NumberOfMaterialVariants; ++ i ) {\n\n\t\t\tvar useMorphing = ( i & _MorphingFlag ) !== 0;\n\t\t\tvar useSkinning = ( i & _SkinningFlag ) !== 0;\n\n\t\t\tvar depthMaterial = new MeshDepthMaterial( {\n\n\t\t\t\tdepthPacking: RGBADepthPacking,\n\n\t\t\t\tmorphTargets: useMorphing,\n\t\t\t\tskinning: useSkinning\n\n\t\t\t} );\n\n\t\t\t_depthMaterials[ i ] = depthMaterial;\n\n\t\t\t//\n\n\t\t\tvar distanceMaterial = new MeshDistanceMaterial( {\n\n\t\t\t\tmorphTargets: useMorphing,\n\t\t\t\tskinning: useSkinning\n\n\t\t\t} );\n\n\t\t\t_distanceMaterials[ i ] = distanceMaterial;\n\n\t\t}\n\n\t\t//\n\n\t\tvar scope = this;\n\n\t\tthis.enabled = false;\n\n\t\tthis.autoUpdate = true;\n\t\tthis.needsUpdate = false;\n\n\t\tthis.type = PCFShadowMap;\n\n\t\tthis.renderReverseSided = true;\n\t\tthis.renderSingleSided = true;\n\n\t\tthis.render = function ( lights, scene, camera ) {\n\n\t\t\tif ( scope.enabled === false ) return;\n\t\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\t\tif ( lights.length === 0 ) return;\n\n\t\t\t// TODO Clean up (needed in case of contextlost)\n\t\t\tvar _gl = _renderer.context;\n\t\t\tvar _state = _renderer.state;\n\n\t\t\t// Set GL state for depth map.\n\t\t\t_state.disable( _gl.BLEND );\n\t\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t\t_state.buffers.depth.setTest( true );\n\t\t\t_state.setScissorTest( false );\n\n\t\t\t// render depth map\n\n\t\t\tvar faceCount;\n\n\t\t\tfor ( var i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\t\tvar light = lights[ i ];\n\t\t\t\tvar shadow = light.shadow;\n\t\t\t\tvar isPointLight = light && light.isPointLight;\n\n\t\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowCamera = shadow.camera;\n\n\t\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\t\t\t\t_shadowMapSize.min( _maxShadowMapSize );\n\n\t\t\t\tif ( isPointLight ) {\n\n\t\t\t\t\tvar vpWidth = _shadowMapSize.x;\n\t\t\t\t\tvar vpHeight = _shadowMapSize.y;\n\n\t\t\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t\t\t// following orientation:\n\t\t\t\t\t//\n\t\t\t\t\t//  xzXZ\n\t\t\t\t\t//   y Y\n\t\t\t\t\t//\n\t\t\t\t\t// X - Positive x direction\n\t\t\t\t\t// x - Negative x direction\n\t\t\t\t\t// Y - Positive y direction\n\t\t\t\t\t// y - Negative y direction\n\t\t\t\t\t// Z - Positive z direction\n\t\t\t\t\t// z - Negative z direction\n\n\t\t\t\t\t// positive X\n\t\t\t\t\tcube2DViewPorts[ 0 ].set( vpWidth * 2, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative X\n\t\t\t\t\tcube2DViewPorts[ 1 ].set( 0, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Z\n\t\t\t\t\tcube2DViewPorts[ 2 ].set( vpWidth * 3, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// negative Z\n\t\t\t\t\tcube2DViewPorts[ 3 ].set( vpWidth, vpHeight, vpWidth, vpHeight );\n\t\t\t\t\t// positive Y\n\t\t\t\t\tcube2DViewPorts[ 4 ].set( vpWidth * 3, 0, vpWidth, vpHeight );\n\t\t\t\t\t// negative Y\n\t\t\t\t\tcube2DViewPorts[ 5 ].set( vpWidth, 0, vpWidth, vpHeight );\n\n\t\t\t\t\t_shadowMapSize.x *= 4.0;\n\t\t\t\t\t_shadowMapSize.y *= 2.0;\n\n\t\t\t\t}\n\n\t\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\t\tvar pars = { minFilter: NearestFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\t\tshadow.map.texture.name = light.name + \".shadowMap\";\n\n\t\t\t\t\tshadowCamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tif ( shadow.isSpotLightShadow ) {\n\n\t\t\t\t\tshadow.update( light );\n\n\t\t\t\t}\n\n\t\t\t\tvar shadowMap = shadow.map;\n\t\t\t\tvar shadowMatrix = shadow.matrix;\n\n\t\t\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tshadowCamera.position.copy( _lightPositionWorld );\n\n\t\t\t\tif ( isPointLight ) {\n\n\t\t\t\t\tfaceCount = 6;\n\n\t\t\t\t\t// for point lights we set the shadow matrix to be a translation-only matrix\n\t\t\t\t\t// equal to inverse of the light's position\n\n\t\t\t\t\tshadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfaceCount = 1;\n\n\t\t\t\t\t_lookTarget.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\t\t\t\t\tshadowCamera.updateMatrixWorld();\n\n\t\t\t\t\t// compute shadow matrix\n\n\t\t\t\t\tshadowMatrix.set(\n\t\t\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t\t\t);\n\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.projectionMatrix );\n\t\t\t\t\tshadowMatrix.multiply( shadowCamera.matrixWorldInverse );\n\n\t\t\t\t}\n\n\t\t\t\t_renderer.setRenderTarget( shadowMap );\n\t\t\t\t_renderer.clear();\n\n\t\t\t\t// render shadow map for each cube face (if omni-directional) or\n\t\t\t\t// run a single pass if not\n\n\t\t\t\tfor ( var face = 0; face < faceCount; face ++ ) {\n\n\t\t\t\t\tif ( isPointLight ) {\n\n\t\t\t\t\t\t_lookTarget.copy( shadowCamera.position );\n\t\t\t\t\t\t_lookTarget.add( cubeDirections[ face ] );\n\t\t\t\t\t\tshadowCamera.up.copy( cubeUps[ face ] );\n\t\t\t\t\t\tshadowCamera.lookAt( _lookTarget );\n\t\t\t\t\t\tshadowCamera.updateMatrixWorld();\n\n\t\t\t\t\t\tvar vpDimensions = cube2DViewPorts[ face ];\n\t\t\t\t\t\t_state.viewport( vpDimensions );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// update camera matrices and frustum\n\n\t\t\t\t\t_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\t\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\t\t\t// set object matrices & frustum culling\n\n\t\t\t\t\trenderObject( scene, camera, shadowCamera, isPointLight );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tscope.needsUpdate = false;\n\n\t\t};\n\n\t\tfunction getDepthMaterial( object, material, isPointLight, lightPositionWorld, shadowCameraNear, shadowCameraFar ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tvar result = null;\n\n\t\t\tvar materialVariants = _depthMaterials;\n\t\t\tvar customMaterial = object.customDepthMaterial;\n\n\t\t\tif ( isPointLight ) {\n\n\t\t\t\tmaterialVariants = _distanceMaterials;\n\t\t\t\tcustomMaterial = object.customDistanceMaterial;\n\n\t\t\t}\n\n\t\t\tif ( ! customMaterial ) {\n\n\t\t\t\tvar useMorphing = false;\n\n\t\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\t\tif ( geometry && geometry.isBufferGeometry ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphAttributes && geometry.morphAttributes.position && geometry.morphAttributes.position.length > 0;\n\n\t\t\t\t\t} else if ( geometry && geometry.isGeometry ) {\n\n\t\t\t\t\t\tuseMorphing = geometry.morphTargets && geometry.morphTargets.length > 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( object.isSkinnedMesh && material.skinning === false ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:', object );\n\n\t\t\t\t}\n\n\t\t\t\tvar useSkinning = object.isSkinnedMesh && material.skinning;\n\n\t\t\t\tvar variantIndex = 0;\n\n\t\t\t\tif ( useMorphing ) variantIndex |= _MorphingFlag;\n\t\t\t\tif ( useSkinning ) variantIndex |= _SkinningFlag;\n\n\t\t\t\tresult = materialVariants[ variantIndex ];\n\n\t\t\t} else {\n\n\t\t\t\tresult = customMaterial;\n\n\t\t\t}\n\n\t\t\tif ( _renderer.localClippingEnabled &&\n\t\t\t\t\tmaterial.clipShadows === true &&\n\t\t\t\t\tmaterial.clippingPlanes.length !== 0 ) {\n\n\t\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t\t// appropriate state\n\n\t\t\t\tvar keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tvar materialsForVariant = _materialCache[ keyA ];\n\n\t\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t\t}\n\n\t\t\t\tvar cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\n\t\t\t\t}\n\n\t\t\t\tresult = cachedMaterial;\n\n\t\t\t}\n\n\t\t\tresult.visible = material.visible;\n\t\t\tresult.wireframe = material.wireframe;\n\n\t\t\tvar side = material.side;\n\n\t\t\tif ( scope.renderSingleSided && side == DoubleSide ) {\n\n\t\t\t\tside = FrontSide;\n\n\t\t\t}\n\n\t\t\tif ( scope.renderReverseSided ) {\n\n\t\t\t\tif ( side === FrontSide ) side = BackSide;\n\t\t\t\telse if ( side === BackSide ) side = FrontSide;\n\n\t\t\t}\n\n\t\t\tresult.side = side;\n\n\t\t\tresult.clipShadows = material.clipShadows;\n\t\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\t\tresult.linewidth = material.linewidth;\n\n\t\t\tif ( isPointLight && result.isMeshDistanceMaterial ) {\n\n\t\t\t\tresult.referencePosition.copy( lightPositionWorld );\n\t\t\t\tresult.nearDistance = shadowCameraNear;\n\t\t\t\tresult.farDistance = shadowCameraFar;\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction renderObject( object, camera, shadowCamera, isPointLight ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tvar visible = object.layers.test( camera.layers );\n\n\t\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\t\tif ( object.castShadow && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\t\tvar geometry = _objects.update( object );\n\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tvar groups = geometry.groups;\n\n\t\t\t\t\t\tfor ( var k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\t\tvar group = groups[ k ];\n\t\t\t\t\t\t\tvar groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, groupMaterial, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far );\n\t\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\tvar depthMaterial = getDepthMaterial( object, material, isPointLight, _lightPositionWorld, shadowCamera.near, shadowCamera.far );\n\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\trenderObject( children[ i ], camera, shadowCamera, isPointLight );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLAttributes( gl ) {\n\n\t\tvar buffers = {};\n\n\t\tfunction createBuffer( attribute, bufferType ) {\n\n\t\t\tvar array = attribute.array;\n\t\t\tvar usage = attribute.dynamic ? gl.DYNAMIC_DRAW : gl.STATIC_DRAW;\n\n\t\t\tvar buffer = gl.createBuffer();\n\n\t\t\tgl.bindBuffer( bufferType, buffer );\n\t\t\tgl.bufferData( bufferType, array, usage );\n\n\t\t\tattribute.onUploadCallback();\n\n\t\t\tvar type = gl.FLOAT;\n\n\t\t\tif ( array instanceof Float32Array ) {\n\n\t\t\t\ttype = gl.FLOAT;\n\n\t\t\t} else if ( array instanceof Float64Array ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLAttributes: Unsupported data buffer format: Float64Array.' );\n\n\t\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\t\ttype = gl.SHORT;\n\n\t\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\t\ttype = gl.INT;\n\n\t\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\t\ttype = gl.BYTE;\n\n\t\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tbuffer: buffer,\n\t\t\t\ttype: type,\n\t\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\t\tversion: attribute.version\n\t\t\t};\n\n\t\t}\n\n\t\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\t\tvar array = attribute.array;\n\t\t\tvar updateRange = attribute.updateRange;\n\n\t\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\t\tif ( attribute.dynamic === false ) {\n\n\t\t\t\tgl.bufferData( bufferType, array, gl.STATIC_DRAW );\n\n\t\t\t} else if ( updateRange.count === - 1 ) {\n\n\t\t\t\t// Not using update ranges\n\n\t\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t\t} else if ( updateRange.count === 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually.' );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray.subarray( updateRange.offset, updateRange.offset + updateRange.count ) );\n\n\t\t\t\tupdateRange.count = -1; // reset range\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction get( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\t\treturn buffers[ attribute.uuid ];\n\n\t\t}\n\n\t\tfunction remove( attribute ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\t\t\t\n\t\t\tvar data = buffers[ attribute.uuid ];\n\n\t\t\tif ( data ) {\n\n\t\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\t\tdelete buffers[ attribute.uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction update( attribute, bufferType ) {\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\t\tvar data = buffers[ attribute.uuid ];\n\n\t\t\tif ( data === undefined ) {\n\n\t\t\t\tbuffers[ attribute.uuid ] = createBuffer( attribute, bufferType );\n\n\t\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\t\tdata.version = attribute.version;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tget: get,\n\t\t\tremove: remove,\n\t\t\tupdate: update\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Euler( x, y, z, order ) {\n\n\t\tthis._x = x || 0;\n\t\tthis._y = y || 0;\n\t\tthis._z = z || 0;\n\t\tthis._order = order || Euler.DefaultOrder;\n\n\t}\n\n\tEuler.RotationOrders = [ 'XYZ', 'YZX', 'ZXY', 'XZY', 'YXZ', 'ZYX' ];\n\n\tEuler.DefaultOrder = 'XYZ';\n\n\tObject.defineProperties( Euler.prototype, {\n\n\t\tx: {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this._x;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis._x = value;\n\t\t\t\tthis.onChangeCallback();\n\n\t\t\t}\n\n\t\t},\n\n\t\ty: {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this._y;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis._y = value;\n\t\t\t\tthis.onChangeCallback();\n\n\t\t\t}\n\n\t\t},\n\n\t\tz: {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this._z;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis._z = value;\n\t\t\t\tthis.onChangeCallback();\n\n\t\t\t}\n\n\t\t},\n\n\t\torder: {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this._order;\n\n\t\t\t},\n\n\t\t\tset: function ( value ) {\n\n\t\t\t\tthis._order = value;\n\t\t\t\tthis.onChangeCallback();\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Euler.prototype, {\n\n\t\tisEuler: true,\n\n\t\tset: function ( x, y, z, order ) {\n\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\t\t\tthis._order = order || this._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t\t},\n\n\t\tcopy: function ( euler ) {\n\n\t\t\tthis._x = euler._x;\n\t\t\tthis._y = euler._y;\n\t\t\tthis._z = euler._z;\n\t\t\tthis._order = euler._order;\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromRotationMatrix: function ( m, order, update ) {\n\n\t\t\tvar clamp = _Math.clamp;\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tvar te = m.elements;\n\t\t\tvar m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\t\tvar m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\t\tvar m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\t\torder = order || this._order;\n\n\t\t\tif ( order === 'XYZ' ) {\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'YXZ' ) {\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'ZXY' ) {\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'ZYX' ) {\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'YZX' ) {\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t} else if ( order === 'XZY' ) {\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.99999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() given unsupported order: ' + order );\n\n\t\t\t}\n\n\t\t\tthis._order = order;\n\n\t\t\tif ( update !== false ) this.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromQuaternion: function () {\n\n\t\t\tvar matrix = new Matrix4();\n\n\t\t\treturn function setFromQuaternion( q, order, update ) {\n\n\t\t\t\tmatrix.makeRotationFromQuaternion( q );\n\n\t\t\t\treturn this.setFromRotationMatrix( matrix, order, update );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tsetFromVector3: function ( v, order ) {\n\n\t\t\treturn this.set( v.x, v.y, v.z, order || this._order );\n\n\t\t},\n\n\t\treorder: function () {\n\n\t\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t\tvar q = new Quaternion();\n\n\t\t\treturn function reorder( newOrder ) {\n\n\t\t\t\tq.setFromEuler( this );\n\n\t\t\t\treturn this.setFromQuaternion( q, newOrder );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( euler ) {\n\n\t\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t\t},\n\n\t\tfromArray: function ( array ) {\n\n\t\t\tthis._x = array[ 0 ];\n\t\t\tthis._y = array[ 1 ];\n\t\t\tthis._z = array[ 2 ];\n\t\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\t\tthis.onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoArray: function ( array, offset ) {\n\n\t\t\tif ( array === undefined ) array = [];\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tarray[ offset ] = this._x;\n\t\t\tarray[ offset + 1 ] = this._y;\n\t\t\tarray[ offset + 2 ] = this._z;\n\t\t\tarray[ offset + 3 ] = this._order;\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\ttoVector3: function ( optionalResult ) {\n\n\t\t\tif ( optionalResult ) {\n\n\t\t\t\treturn optionalResult.set( this._x, this._y, this._z );\n\n\t\t\t} else {\n\n\t\t\t\treturn new Vector3( this._x, this._y, this._z );\n\n\t\t\t}\n\n\t\t},\n\n\t\tonChange: function ( callback ) {\n\n\t\t\tthis.onChangeCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonChangeCallback: function () {}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Layers() {\n\n\t\tthis.mask = 1 | 0;\n\n\t}\n\n\tObject.assign( Layers.prototype, {\n\n\t\tset: function ( channel ) {\n\n\t\t\tthis.mask = 1 << channel | 0;\n\n\t\t},\n\n\t\tenable: function ( channel ) {\n\n\t\t\tthis.mask |= 1 << channel | 0;\n\n\t\t},\n\n\t\ttoggle: function ( channel ) {\n\n\t\t\tthis.mask ^= 1 << channel | 0;\n\n\t\t},\n\n\t\tdisable: function ( channel ) {\n\n\t\t\tthis.mask &= ~ ( 1 << channel | 0 );\n\n\t\t},\n\n\t\ttest: function ( layers ) {\n\n\t\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author elephantatwork / www.elephantatwork.ch\n\t */\n\n\tvar object3DId = 0;\n\n\tfunction Object3D() {\n\n\t\tObject.defineProperty( this, 'id', { value: object3DId ++ } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Object3D';\n\n\t\tthis.parent = null;\n\t\tthis.children = [];\n\n\t\tthis.up = Object3D.DefaultUp.clone();\n\n\t\tvar position = new Vector3();\n\t\tvar rotation = new Euler();\n\t\tvar quaternion = new Quaternion();\n\t\tvar scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation.onChange( onRotationChange );\n\t\tquaternion.onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\tposition: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\tthis.matrix = new Matrix4();\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\tthis.matrixAutoUpdate = Object3D.DefaultMatrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\tthis.layers = new Layers();\n\t\tthis.visible = true;\n\n\t\tthis.castShadow = false;\n\t\tthis.receiveShadow = false;\n\n\t\tthis.frustumCulled = true;\n\t\tthis.renderOrder = 0;\n\n\t\tthis.userData = {};\n\t}\n\n\tObject3D.DefaultUp = new Vector3( 0, 1, 0 );\n\tObject3D.DefaultMatrixAutoUpdate = true;\n\n\tObject.assign( Object3D.prototype, EventDispatcher.prototype, {\n\n\t\tisObject3D: true,\n\n\t\tonBeforeRender: function () {},\n\t\tonAfterRender: function () {},\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tthis.matrix.multiplyMatrices( matrix, this.matrix );\n\n\t\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t\t},\n\n\t\tapplyQuaternion: function ( q ) {\n\n\t\t\tthis.quaternion.premultiply( q );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetRotationFromAxisAngle: function ( axis, angle ) {\n\n\t\t\t// assumes axis is normalized\n\n\t\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t\t},\n\n\t\tsetRotationFromEuler: function ( euler ) {\n\n\t\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t\t},\n\n\t\tsetRotationFromMatrix: function ( m ) {\n\n\t\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t\t},\n\n\t\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t\t// assumes q is normalized\n\n\t\t\tthis.quaternion.copy( q );\n\n\t\t},\n\n\t\trotateOnAxis: function () {\n\n\t\t\t// rotate object on axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar q1 = new Quaternion();\n\n\t\t\treturn function rotateOnAxis( axis, angle ) {\n\n\t\t\t\tq1.setFromAxisAngle( axis, angle );\n\n\t\t\t\tthis.quaternion.multiply( q1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\treturn this.rotateOnAxis( v1, angle );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateOnAxis: function () {\n\n\t\t\t// translate object by distance along axis in object space\n\t\t\t// axis is assumed to be normalized\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function translateOnAxis( axis, distance ) {\n\n\t\t\t\tv1.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\t\t\tthis.position.add( v1.multiplyScalar( distance ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateX: function () {\n\n\t\t\tvar v1 = new Vector3( 1, 0, 0 );\n\n\t\t\treturn function translateX( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateY: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 1, 0 );\n\n\t\t\treturn function translateY( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslateZ: function () {\n\n\t\t\tvar v1 = new Vector3( 0, 0, 1 );\n\n\t\t\treturn function translateZ( distance ) {\n\n\t\t\t\treturn this.translateOnAxis( v1, distance );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlocalToWorld: function ( vector ) {\n\n\t\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t\t},\n\n\t\tworldToLocal: function () {\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function worldToLocal( vector ) {\n\n\t\t\t\treturn vector.applyMatrix4( m1.getInverse( this.matrixWorld ) );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\t// This method does not support objects with rotated and/or translated parent(s)\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tif ( this.isCamera ) {\n\n\t\t\t\t\tm1.lookAt( this.position, vector, this.up );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tm1.lookAt( vector, this.position, this.up );\n\n\t\t\t\t}\n\n\t\t\t\tthis.quaternion.setFromRotationMatrix( m1 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tadd: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( object === this ) {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object can't be added as a child of itself.\", object );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tif ( ( object && object.isObject3D ) ) {\n\n\t\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\t\tobject.parent.remove( object );\n\n\t\t\t\t}\n\n\t\t\t\tobject.parent = this;\n\t\t\t\tobject.dispatchEvent( { type: 'added' } );\n\n\t\t\t\tthis.children.push( object );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( \"THREE.Object3D.add: object not an instance of THREE.Object3D.\", object );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tremove: function ( object ) {\n\n\t\t\tif ( arguments.length > 1 ) {\n\n\t\t\t\tfor ( var i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar index = this.children.indexOf( object );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tobject.parent = null;\n\n\t\t\t\tobject.dispatchEvent( { type: 'removed' } );\n\n\t\t\t\tthis.children.splice( index, 1 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetObjectById: function ( id ) {\n\n\t\t\treturn this.getObjectByProperty( 'id', id );\n\n\t\t},\n\n\t\tgetObjectByName: function ( name ) {\n\n\t\t\treturn this.getObjectByProperty( 'name', name );\n\n\t\t},\n\n\t\tgetObjectByProperty: function ( name, value ) {\n\n\t\t\tif ( this[ name ] === value ) return this;\n\n\t\t\tfor ( var i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\t\tvar child = this.children[ i ];\n\t\t\t\tvar object = child.getObjectByProperty( name, value );\n\n\t\t\t\tif ( object !== undefined ) {\n\n\t\t\t\t\treturn object;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn undefined;\n\n\t\t},\n\n\t\tgetWorldPosition: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\treturn result.setFromMatrixPosition( this.matrixWorld );\n\n\t\t},\n\n\t\tgetWorldQuaternion: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar scale = new Vector3();\n\n\t\t\treturn function getWorldQuaternion( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Quaternion();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, result, scale );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldRotation: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldRotation( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Euler();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.setFromQuaternion( quaternion, this.rotation.order, false );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldScale: function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldScale( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, result );\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tgetWorldDirection: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.set( 0, 0, 1 ).applyQuaternion( quaternion );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\traycast: function () {},\n\n\t\ttraverse: function ( callback ) {\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverse( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseVisible: function ( callback ) {\n\n\t\t\tif ( this.visible === false ) return;\n\n\t\t\tcallback( this );\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttraverseAncestors: function ( callback ) {\n\n\t\t\tvar parent = this.parent;\n\n\t\t\tif ( parent !== null ) {\n\n\t\t\t\tcallback( parent );\n\n\t\t\t\tparent.traverseAncestors( callback );\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrix: function () {\n\n\t\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t\t},\n\n\t\tupdateMatrixWorld: function ( force ) {\n\n\t\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\t\tforce = true;\n\n\t\t\t}\n\n\t\t\t// update children\n\n\t\t\tvar children = this.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( force );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\t// meta is '' when called from JSON.stringify\n\t\t\tvar isRootObject = ( meta === undefined || meta === '' );\n\n\t\t\tvar output = {};\n\n\t\t\t// meta is a hash used to collect geometries, materials.\n\t\t\t// not providing it implies that this is the root object\n\t\t\t// being serialized.\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\t// initialize meta obj\n\t\t\t\tmeta = {\n\t\t\t\t\tgeometries: {},\n\t\t\t\t\tmaterials: {},\n\t\t\t\t\ttextures: {},\n\t\t\t\t\timages: {}\n\t\t\t\t};\n\n\t\t\t\toutput.metadata = {\n\t\t\t\t\tversion: 4.5,\n\t\t\t\t\ttype: 'Object',\n\t\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t// standard Object3D serialization\n\n\t\t\tvar object = {};\n\n\t\t\tobject.uuid = this.uuid;\n\t\t\tobject.type = this.type;\n\n\t\t\tif ( this.name !== '' ) object.name = this.name;\n\t\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\t\tif ( this.visible === false ) object.visible = false;\n\t\t\tif ( JSON.stringify( this.userData ) !== '{}' ) object.userData = this.userData;\n\n\t\t\tobject.matrix = this.matrix.toArray();\n\n\t\t\t//\n\n\t\t\tfunction serialize( library, element ) {\n\n\t\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t\t}\n\n\t\t\t\treturn element.uuid;\n\n\t\t\t}\n\n\t\t\tif ( this.geometry !== undefined ) {\n\n\t\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\t}\n\n\t\t\tif ( this.material !== undefined ) {\n\n\t\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\t\tvar uuids = [];\n\n\t\t\t\t\tfor ( var i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject.material = uuids;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( this.children.length > 0 ) {\n\n\t\t\t\tobject.children = [];\n\n\t\t\t\tfor ( var i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( isRootObject ) {\n\n\t\t\t\tvar geometries = extractFromCache( meta.geometries );\n\t\t\t\tvar materials = extractFromCache( meta.materials );\n\t\t\t\tvar textures = extractFromCache( meta.textures );\n\t\t\t\tvar images = extractFromCache( meta.images );\n\n\t\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\t\tif ( images.length > 0 ) output.images = images;\n\n\t\t\t}\n\n\t\t\toutput.object = object;\n\n\t\t\treturn output;\n\n\t\t\t// extract data from the cache hash\n\t\t\t// remove metadata on each item\n\t\t\t// and return as array\n\t\t\tfunction extractFromCache( cache ) {\n\n\t\t\t\tvar values = [];\n\t\t\t\tfor ( var key in cache ) {\n\n\t\t\t\t\tvar data = cache[ key ];\n\t\t\t\t\tdelete data.metadata;\n\t\t\t\t\tvalues.push( data );\n\n\t\t\t\t}\n\t\t\t\treturn values;\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function ( recursive ) {\n\n\t\t\treturn new this.constructor().copy( this, recursive );\n\n\t\t},\n\n\t\tcopy: function ( source, recursive ) {\n\n\t\t\tif ( recursive === undefined ) recursive = true;\n\n\t\t\tthis.name = source.name;\n\n\t\t\tthis.up.copy( source.up );\n\n\t\t\tthis.position.copy( source.position );\n\t\t\tthis.quaternion.copy( source.quaternion );\n\t\t\tthis.scale.copy( source.scale );\n\n\t\t\tthis.matrix.copy( source.matrix );\n\t\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\t\tthis.layers.mask = source.layers.mask;\n\t\t\tthis.visible = source.visible;\n\n\t\t\tthis.castShadow = source.castShadow;\n\t\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\t\tthis.frustumCulled = source.frustumCulled;\n\t\t\tthis.renderOrder = source.renderOrder;\n\n\t\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\t\tif ( recursive === true ) {\n\n\t\t\t\tfor ( var i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\t\tvar child = source.children[ i ];\n\t\t\t\t\tthis.add( child.clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author WestLangley / http://github.com/WestLangley\n\t*/\n\n\tfunction Camera() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t}\n\n\tCamera.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Camera,\n\n\t\tisCamera: true,\n\n\t\tcopy: function ( source, recursive ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\t\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetWorldDirection: function () {\n\n\t\t\tvar quaternion = new Quaternion();\n\n\t\t\treturn function getWorldDirection( optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tthis.getWorldQuaternion( quaternion );\n\n\t\t\t\treturn result.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tupdateMatrixWorld: function ( force ) {\n\n\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\tthis.matrixWorldInverse.getInverse( this.matrixWorld );\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author arose / http://github.com/arose\n\t */\n\n\tfunction OrthographicCamera( left, right, top, bottom, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\tthis.zoom = 1;\n\t\tthis.view = null;\n\n\t\tthis.left = left;\n\t\tthis.right = right;\n\t\tthis.top = top;\n\t\tthis.bottom = bottom;\n\n\t\tthis.near = ( near !== undefined ) ? near : 0.1;\n\t\tthis.far = ( far !== undefined ) ? far : 2000;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tOrthographicCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: OrthographicCamera,\n\n\t\tisOrthographicCamera: true,\n\n\t\tcopy: function ( source, recursive ) {\n\n\t\t\tCamera.prototype.copy.call( this, source, recursive );\n\n\t\t\tthis.left = source.left;\n\t\t\tthis.right = source.right;\n\t\t\tthis.top = source.top;\n\t\t\tthis.bottom = source.bottom;\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\n\t\t\tthis.zoom = source.zoom;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetViewOffset: function( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function() {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\t\tvar dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\t\tvar cx = ( this.right + this.left ) / 2;\n\t\t\tvar cy = ( this.top + this.bottom ) / 2;\n\n\t\t\tvar left = cx - dx;\n\t\t\tvar right = cx + dx;\n\t\t\tvar top = cy + dy;\n\t\t\tvar bottom = cy - dy;\n\n\t\t\tif ( this.view !== null ) {\n\n\t\t\t\tvar zoomW = this.zoom / ( this.view.width / this.view.fullWidth );\n\t\t\t\tvar zoomH = this.zoom / ( this.view.height / this.view.fullHeight );\n\t\t\t\tvar scaleW = ( this.right - this.left ) / this.view.width;\n\t\t\t\tvar scaleH = ( this.top - this.bottom ) / this.view.height;\n\n\t\t\t\tleft += scaleW * ( this.view.offsetX / zoomW );\n\t\t\t\tright = left + scaleW * ( this.view.width / zoomW );\n\t\t\t\ttop -= scaleH * ( this.view.offsetY / zoomH );\n\t\t\t\tbottom = top - scaleH * ( this.view.height / zoomH );\n\n\t\t\t}\n\n\t\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.zoom = this.zoom;\n\t\t\tdata.object.left = this.left;\n\t\t\tdata.object.right = this.right;\n\t\t\tdata.object.top = this.top;\n\t\t\tdata.object.bottom = this.bottom;\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author greggman / http://games.greggman.com/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author tschw\n\t */\n\n\tfunction PerspectiveCamera( fov, aspect, near, far ) {\n\n\t\tCamera.call( this );\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov !== undefined ? fov : 50;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near !== undefined ? near : 0.1;\n\t\tthis.far = far !== undefined ? far : 2000;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect !== undefined ? aspect : 1;\n\t\tthis.view = null;\n\n\t\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\t\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tPerspectiveCamera.prototype = Object.assign( Object.create( Camera.prototype ), {\n\n\t\tconstructor: PerspectiveCamera,\n\n\t\tisPerspectiveCamera: true,\n\n\t\tcopy: function ( source, recursive ) {\n\n\t\t\tCamera.prototype.copy.call( this, source, recursive );\n\n\t\t\tthis.fov = source.fov;\n\t\t\tthis.zoom = source.zoom;\n\n\t\t\tthis.near = source.near;\n\t\t\tthis.far = source.far;\n\t\t\tthis.focus = source.focus;\n\n\t\t\tthis.aspect = source.aspect;\n\t\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\t\tthis.filmGauge = source.filmGauge;\n\t\t\tthis.filmOffset = source.filmOffset;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t/**\n\t\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t\t *\n\t\t * The default film gauge is 35, so that the focal length can be specified for\n\t\t * a 35mm (full frame) camera.\n\t\t *\n\t\t * Values for focal length and film gauge must have the same unit.\n\t\t */\n\t\tsetFocalLength: function ( focalLength ) {\n\n\t\t\t// see http://www.bobatkins.com/photography/technical/field_of_view.html\n\t\t\tvar vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\t\tthis.fov = _Math.RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\t/**\n\t\t * Calculates the focal length from the current .fov and .filmGauge.\n\t\t */\n\t\tgetFocalLength: function () {\n\n\t\t\tvar vExtentSlope = Math.tan( _Math.DEG2RAD * 0.5 * this.fov );\n\n\t\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t\t},\n\n\t\tgetEffectiveFOV: function () {\n\n\t\t\treturn _Math.RAD2DEG * 2 * Math.atan(\n\t\t\t\t\tMath.tan( _Math.DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t\t},\n\n\t\tgetFilmWidth: function () {\n\n\t\t\t// film not completely covered in portrait format (aspect < 1)\n\t\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t\t},\n\n\t\tgetFilmHeight: function () {\n\n\t\t\t// film not completely covered in landscape format (aspect > 1)\n\t\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t\t},\n\n\t\t/**\n\t\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t\t * multi-monitor/multi-machine setups.\n\t\t *\n\t\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t\t * the monitors are in grid like this\n\t\t *\n\t\t *   +---+---+---+\n\t\t *   | A | B | C |\n\t\t *   +---+---+---+\n\t\t *   | D | E | F |\n\t\t *   +---+---+---+\n\t\t *\n\t\t * then for each monitor you would call it like this\n\t\t *\n\t\t *   var w = 1920;\n\t\t *   var h = 1080;\n\t\t *   var fullWidth = w * 3;\n\t\t *   var fullHeight = h * 2;\n\t\t *\n\t\t *   --A--\n\t\t *   camera.setOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t\t *   --B--\n\t\t *   camera.setOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t\t *   --C--\n\t\t *   camera.setOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t\t *   --D--\n\t\t *   camera.setOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t\t *   --E--\n\t\t *   camera.setOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t\t *   --F--\n\t\t *   camera.setOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t\t *\n\t\t *   Note there is no reason monitors have to be the same size or in a grid.\n\t\t */\n\t\tsetViewOffset: function ( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\t\tthis.view = {\n\t\t\t\tfullWidth: fullWidth,\n\t\t\t\tfullHeight: fullHeight,\n\t\t\t\toffsetX: x,\n\t\t\t\toffsetY: y,\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tclearViewOffset: function () {\n\n\t\t\tthis.view = null;\n\t\t\tthis.updateProjectionMatrix();\n\n\t\t},\n\n\t\tupdateProjectionMatrix: function () {\n\n\t\t\tvar near = this.near,\n\t\t\t\ttop = near * Math.tan(\n\t\t\t\t\t\t_Math.DEG2RAD * 0.5 * this.fov ) / this.zoom,\n\t\t\t\theight = 2 * top,\n\t\t\t\twidth = this.aspect * height,\n\t\t\t\tleft = - 0.5 * width,\n\t\t\t\tview = this.view;\n\n\t\t\tif ( view !== null ) {\n\n\t\t\t\tvar fullWidth = view.fullWidth,\n\t\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\t\twidth *= view.width / fullWidth;\n\t\t\t\theight *= view.height / fullHeight;\n\n\t\t\t}\n\n\t\t\tvar skew = this.filmOffset;\n\t\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.fov = this.fov;\n\t\t\tdata.object.zoom = this.zoom;\n\n\t\t\tdata.object.near = this.near;\n\t\t\tdata.object.far = this.far;\n\t\t\tdata.object.focus = this.focus;\n\n\t\t\tdata.object.aspect = this.aspect;\n\n\t\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\t\tdata.object.filmGauge = this.filmGauge;\n\t\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Face3( a, b, c, normal, color, materialIndex ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t\tthis.normal = ( normal && normal.isVector3 ) ? normal : new Vector3();\n\t\tthis.vertexNormals = Array.isArray( normal ) ? normal : [];\n\n\t\tthis.color = ( color && color.isColor ) ? color : new Color();\n\t\tthis.vertexColors = Array.isArray( color ) ? color : [];\n\n\t\tthis.materialIndex = materialIndex !== undefined ? materialIndex : 0;\n\n\t}\n\n\tObject.assign( Face3.prototype, {\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.a = source.a;\n\t\t\tthis.b = source.b;\n\t\t\tthis.c = source.c;\n\n\t\t\tthis.normal.copy( source.normal );\n\t\t\tthis.color.copy( source.color );\n\n\t\t\tthis.materialIndex = source.materialIndex;\n\n\t\t\tfor ( var i = 0, il = source.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexNormals[ i ] = source.vertexNormals[ i ].clone();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = source.vertexColors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertexColors[ i ] = source.vertexColors[ i ].clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author kile / http://kile.stravaganza.org/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author bhouston / http://clara.io\n\t */\n\n\tvar count = 0;\n\tfunction GeometryIdCount() { return count++; }\n\n\tfunction Geometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Geometry';\n\n\t\tthis.vertices = [];\n\t\tthis.colors = [];\n\t\tthis.faces = [];\n\t\tthis.faceVertexUvs = [[]];\n\n\t\tthis.morphTargets = [];\n\t\tthis.morphNormals = [];\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\tthis.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.elementsNeedUpdate = false;\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.lineDistancesNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tObject.assign( Geometry.prototype, EventDispatcher.prototype, {\n\n\t\tisGeometry: true,\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tfor ( var i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertex.applyMatrix4( matrix );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\t\t\t\tface.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tface.vertexNormals[ j ].applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\tthis.verticesNeedUpdate = true;\n\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj = new Object3D();\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tfromBufferGeometry: function ( geometry ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar indices = geometry.index !== null ? geometry.index.array : undefined;\n\t\t\tvar attributes = geometry.attributes;\n\n\t\t\tvar positions = attributes.position.array;\n\t\t\tvar normals = attributes.normal !== undefined ? attributes.normal.array : undefined;\n\t\t\tvar colors = attributes.color !== undefined ? attributes.color.array : undefined;\n\t\t\tvar uvs = attributes.uv !== undefined ? attributes.uv.array : undefined;\n\t\t\tvar uvs2 = attributes.uv2 !== undefined ? attributes.uv2.array : undefined;\n\n\t\t\tif ( uvs2 !== undefined ) this.faceVertexUvs[ 1 ] = [];\n\n\t\t\tvar tempNormals = [];\n\t\t\tvar tempUVs = [];\n\t\t\tvar tempUVs2 = [];\n\n\t\t\tfor ( var i = 0, j = 0; i < positions.length; i += 3, j += 2 ) {\n\n\t\t\t\tscope.vertices.push( new Vector3( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] ) );\n\n\t\t\t\tif ( normals !== undefined ) {\n\n\t\t\t\t\ttempNormals.push( new Vector3( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( colors !== undefined ) {\n\n\t\t\t\t\tscope.colors.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\ttempUVs.push( new Vector2( uvs[ j ], uvs[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\ttempUVs2.push( new Vector2( uvs2[ j ], uvs2[ j + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction addFace( a, b, c, materialIndex ) {\n\n\t\t\t\tvar vertexNormals = normals !== undefined ? [ tempNormals[ a ].clone(), tempNormals[ b ].clone(), tempNormals[ c ].clone() ] : [];\n\t\t\t\tvar vertexColors = colors !== undefined ? [ scope.colors[ a ].clone(), scope.colors[ b ].clone(), scope.colors[ c ].clone() ] : [];\n\n\t\t\t\tvar face = new Face3( a, b, c, vertexNormals, vertexColors, materialIndex );\n\n\t\t\t\tscope.faces.push( face );\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 0 ].push( [ tempUVs[ a ].clone(), tempUVs[ b ].clone(), tempUVs[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( uvs2 !== undefined ) {\n\n\t\t\t\t\tscope.faceVertexUvs[ 1 ].push( [ tempUVs2[ a ].clone(), tempUVs2[ b ].clone(), tempUVs2[ c ].clone() ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar groups = geometry.groups;\n\n\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\tfor ( var i = 0; i < groups.length; i ++ ) {\n\n\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\tvar start = group.start;\n\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\tfor ( var j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tif ( indices !== undefined ) {\n\n\t\t\t\t\t\t\taddFace( indices[ j ], indices[ j + 1 ], indices[ j + 2 ], group.materialIndex );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\taddFace( j, j + 1, j + 2, group.materialIndex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( indices !== undefined ) {\n\n\t\t\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t\t\taddFace( indices[ i ], indices[ i + 1 ], indices[ i + 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( var i = 0; i < positions.length / 3; i += 3 ) {\n\n\t\t\t\t\t\taddFace( i, i + 1, i + 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tnormalize: function () {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t\tvar center = this.boundingSphere.center;\n\t\t\tvar radius = this.boundingSphere.radius;\n\n\t\t\tvar s = radius === 0 ? 1 : 1.0 / radius;\n\n\t\t\tvar matrix = new Matrix4();\n\t\t\tmatrix.set(\n\t\t\t\ts, 0, 0, - s * center.x,\n\t\t\t\t0, s, 0, - s * center.y,\n\t\t\t\t0, 0, s, - s * center.z,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\tthis.applyMatrix( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\tfor ( var f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tvar face = this.faces[ f ];\n\n\t\t\t\tvar vA = this.vertices[ face.a ];\n\t\t\t\tvar vB = this.vertices[ face.b ];\n\t\t\t\tvar vC = this.vertices[ face.c ];\n\n\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\tcb.cross( ab );\n\n\t\t\t\tcb.normalize();\n\n\t\t\t\tface.normal.copy( cb );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeVertexNormals: function ( areaWeighted ) {\n\n\t\t\tif ( areaWeighted === undefined ) areaWeighted = true;\n\n\t\t\tvar v, vl, f, fl, face, vertices;\n\n\t\t\tvertices = new Array( this.vertices.length );\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ] = new Vector3();\n\n\t\t\t}\n\n\t\t\tif ( areaWeighted ) {\n\n\t\t\t\t// vertex normals weighted by triangle areas\n\t\t\t\t// http://www.iquilezles.org/www/articles/normals/normals.htm\n\n\t\t\t\tvar vA, vB, vC;\n\t\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvA = this.vertices[ face.a ];\n\t\t\t\t\tvB = this.vertices[ face.b ];\n\t\t\t\t\tvC = this.vertices[ face.c ];\n\n\t\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tvertices[ face.a ].add( cb );\n\t\t\t\t\tvertices[ face.b ].add( cb );\n\t\t\t\t\tvertices[ face.c ].add( cb );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.computeFaceNormals();\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tvertices[ face.a ].add( face.normal );\n\t\t\t\t\tvertices[ face.b ].add( face.normal );\n\t\t\t\t\tvertices[ face.c ].add( face.normal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( v = 0, vl = this.vertices.length; v < vl; v ++ ) {\n\n\t\t\t\tvertices[ v ].normalize();\n\n\t\t\t}\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( vertices[ face.a ] );\n\t\t\t\t\tvertexNormals[ 1 ].copy( vertices[ face.b ] );\n\t\t\t\t\tvertexNormals[ 2 ].copy( vertices[ face.c ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = vertices[ face.a ].clone();\n\t\t\t\t\tvertexNormals[ 1 ] = vertices[ face.b ].clone();\n\t\t\t\t\tvertexNormals[ 2 ] = vertices[ face.c ].clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeFlatVertexNormals: function () {\n\n\t\t\tvar f, fl, face;\n\n\t\t\tthis.computeFaceNormals();\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tvertexNormals[ 0 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 1 ].copy( face.normal );\n\t\t\t\t\tvertexNormals[ 2 ].copy( face.normal );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvertexNormals[ 0 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 1 ] = face.normal.clone();\n\t\t\t\t\tvertexNormals[ 2 ] = face.normal.clone();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.faces.length > 0 ) {\n\n\t\t\t\tthis.normalsNeedUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeMorphNormals: function () {\n\n\t\t\tvar i, il, f, fl, face;\n\n\t\t\t// save original normals\n\t\t\t// - create temp variables on first access\n\t\t\t//   otherwise just copy (for faster repeated calls)\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tif ( ! face.__originalFaceNormal ) {\n\n\t\t\t\t\tface.__originalFaceNormal = face.normal.clone();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tface.__originalFaceNormal.copy( face.normal );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! face.__originalVertexNormals ) face.__originalVertexNormals = [];\n\n\t\t\t\tfor ( i = 0, il = face.vertexNormals.length; i < il; i ++ ) {\n\n\t\t\t\t\tif ( ! face.__originalVertexNormals[ i ] ) {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ] = face.vertexNormals[ i ].clone();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface.__originalVertexNormals[ i ].copy( face.vertexNormals[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// use temp geometry to compute face and vertex normals for each morph\n\n\t\t\tvar tmpGeo = new Geometry();\n\t\t\ttmpGeo.faces = this.faces;\n\n\t\t\tfor ( i = 0, il = this.morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\t// create on first access\n\n\t\t\t\tif ( ! this.morphNormals[ i ] ) {\n\n\t\t\t\t\tthis.morphNormals[ i ] = {};\n\t\t\t\t\tthis.morphNormals[ i ].faceNormals = [];\n\t\t\t\t\tthis.morphNormals[ i ].vertexNormals = [];\n\n\t\t\t\t\tvar dstNormalsFace = this.morphNormals[ i ].faceNormals;\n\t\t\t\t\tvar dstNormalsVertex = this.morphNormals[ i ].vertexNormals;\n\n\t\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tfaceNormal = new Vector3();\n\t\t\t\t\t\tvertexNormals = { a: new Vector3(), b: new Vector3(), c: new Vector3() };\n\n\t\t\t\t\t\tdstNormalsFace.push( faceNormal );\n\t\t\t\t\t\tdstNormalsVertex.push( vertexNormals );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar morphNormals = this.morphNormals[ i ];\n\n\t\t\t\t// set vertices to morph target\n\n\t\t\t\ttmpGeo.vertices = this.morphTargets[ i ].vertices;\n\n\t\t\t\t// compute morph normals\n\n\t\t\t\ttmpGeo.computeFaceNormals();\n\t\t\t\ttmpGeo.computeVertexNormals();\n\n\t\t\t\t// store morph normals\n\n\t\t\t\tvar faceNormal, vertexNormals;\n\n\t\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\t\tfaceNormal = morphNormals.faceNormals[ f ];\n\t\t\t\t\tvertexNormals = morphNormals.vertexNormals[ f ];\n\n\t\t\t\t\tfaceNormal.copy( face.normal );\n\n\t\t\t\t\tvertexNormals.a.copy( face.vertexNormals[ 0 ] );\n\t\t\t\t\tvertexNormals.b.copy( face.vertexNormals[ 1 ] );\n\t\t\t\t\tvertexNormals.c.copy( face.vertexNormals[ 2 ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// restore original normals\n\n\t\t\tfor ( f = 0, fl = this.faces.length; f < fl; f ++ ) {\n\n\t\t\t\tface = this.faces[ f ];\n\n\t\t\t\tface.normal = face.__originalFaceNormal;\n\t\t\t\tface.vertexNormals = face.__originalVertexNormals;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeLineDistances: function () {\n\n\t\t\tvar d = 0;\n\t\t\tvar vertices = this.vertices;\n\n\t\t\tfor ( var i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tif ( i > 0 ) {\n\n\t\t\t\t\td += vertices[ i ].distanceTo( vertices[ i - 1 ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.lineDistances[ i ] = d;\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tthis.boundingBox.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.setFromPoints( this.vertices );\n\n\t\t},\n\n\t\tmerge: function ( geometry, matrix, materialIndexOffset ) {\n\n\t\t\tif ( ! ( geometry && geometry.isGeometry ) ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar normalMatrix,\n\t\t\t\tvertexOffset = this.vertices.length,\n\t\t\t\tvertices1 = this.vertices,\n\t\t\t\tvertices2 = geometry.vertices,\n\t\t\t\tfaces1 = this.faces,\n\t\t\t\tfaces2 = geometry.faces,\n\t\t\t\tuvs1 = this.faceVertexUvs[ 0 ],\n\t\t\t\tuvs2 = geometry.faceVertexUvs[ 0 ],\n\t\t\t\tcolors1 = this.colors,\n\t\t\t\tcolors2 = geometry.colors;\n\n\t\t\tif ( materialIndexOffset === undefined ) materialIndexOffset = 0;\n\n\t\t\tif ( matrix !== undefined ) {\n\n\t\t\t\tnormalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t}\n\n\t\t\t// vertices\n\n\t\t\tfor ( var i = 0, il = vertices2.length; i < il; i ++ ) {\n\n\t\t\t\tvar vertex = vertices2[ i ];\n\n\t\t\t\tvar vertexCopy = vertex.clone();\n\n\t\t\t\tif ( matrix !== undefined ) vertexCopy.applyMatrix4( matrix );\n\n\t\t\t\tvertices1.push( vertexCopy );\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tfor ( var i = 0, il = colors2.length; i < il; i ++ ) {\n\n\t\t\t\tcolors1.push( colors2[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tfor ( i = 0, il = faces2.length; i < il; i ++ ) {\n\n\t\t\t\tvar face = faces2[ i ], faceCopy, normal, color,\n\t\t\t\t\tfaceVertexNormals = face.vertexNormals,\n\t\t\t\t\tfaceVertexColors = face.vertexColors;\n\n\t\t\t\tfaceCopy = new Face3( face.a + vertexOffset, face.b + vertexOffset, face.c + vertexOffset );\n\t\t\t\tfaceCopy.normal.copy( face.normal );\n\n\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\tfaceCopy.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\tnormal = faceVertexNormals[ j ].clone();\n\n\t\t\t\t\tif ( normalMatrix !== undefined ) {\n\n\t\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceCopy.vertexNormals.push( normal );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.color.copy( face.color );\n\n\t\t\t\tfor ( var j = 0, jl = faceVertexColors.length; j < jl; j ++ ) {\n\n\t\t\t\t\tcolor = faceVertexColors[ j ];\n\t\t\t\t\tfaceCopy.vertexColors.push( color.clone() );\n\n\t\t\t\t}\n\n\t\t\t\tfaceCopy.materialIndex = face.materialIndex + materialIndexOffset;\n\n\t\t\t\tfaces1.push( faceCopy );\n\n\t\t\t}\n\n\t\t\t// uvs\n\n\t\t\tfor ( i = 0, il = uvs2.length; i < il; i ++ ) {\n\n\t\t\t\tvar uv = uvs2[ i ], uvCopy = [];\n\n\t\t\t\tif ( uv === undefined ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0, jl = uv.length; j < jl; j ++ ) {\n\n\t\t\t\t\tuvCopy.push( uv[ j ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tuvs1.push( uvCopy );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmergeMesh: function ( mesh ) {\n\n\t\t\tif ( ! ( mesh && mesh.isMesh ) ) {\n\n\t\t\t\tconsole.error( 'THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.', mesh );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tmesh.matrixAutoUpdate && mesh.updateMatrix();\n\n\t\t\tthis.merge( mesh.geometry, mesh.matrix );\n\n\t\t},\n\n\t\t/*\n\t\t * Checks for duplicate vertices with hashmap.\n\t\t * Duplicated vertices are removed\n\t\t * and faces' vertices are updated.\n\t\t */\n\n\t\tmergeVertices: function () {\n\n\t\t\tvar verticesMap = {}; // Hashmap for looking up vertices by position coordinates (and making sure they are unique)\n\t\t\tvar unique = [], changes = [];\n\n\t\t\tvar v, key;\n\t\t\tvar precisionPoints = 4; // number of decimal points, e.g. 4 for epsilon of 0.0001\n\t\t\tvar precision = Math.pow( 10, precisionPoints );\n\t\t\tvar i, il, face;\n\t\t\tvar indices, j, jl;\n\n\t\t\tfor ( i = 0, il = this.vertices.length; i < il; i ++ ) {\n\n\t\t\t\tv = this.vertices[ i ];\n\t\t\t\tkey = Math.round( v.x * precision ) + '_' + Math.round( v.y * precision ) + '_' + Math.round( v.z * precision );\n\n\t\t\t\tif ( verticesMap[ key ] === undefined ) {\n\n\t\t\t\t\tverticesMap[ key ] = i;\n\t\t\t\t\tunique.push( this.vertices[ i ] );\n\t\t\t\t\tchanges[ i ] = unique.length - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t//console.log('Duplicate vertex found. ', i, ' could be using ', verticesMap[key]);\n\t\t\t\t\tchanges[ i ] = changes[ verticesMap[ key ] ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// if faces are completely degenerate after merging vertices, we\n\t\t\t// have to remove them from the geometry.\n\t\t\tvar faceIndicesToRemove = [];\n\n\t\t\tfor ( i = 0, il = this.faces.length; i < il; i ++ ) {\n\n\t\t\t\tface = this.faces[ i ];\n\n\t\t\t\tface.a = changes[ face.a ];\n\t\t\t\tface.b = changes[ face.b ];\n\t\t\t\tface.c = changes[ face.c ];\n\n\t\t\t\tindices = [ face.a, face.b, face.c ];\n\n\t\t\t\t// if any duplicate vertices are found in a Face3\n\t\t\t\t// we have to remove the face as nothing can be saved\n\t\t\t\tfor ( var n = 0; n < 3; n ++ ) {\n\n\t\t\t\t\tif ( indices[ n ] === indices[ ( n + 1 ) % 3 ] ) {\n\n\t\t\t\t\t\tfaceIndicesToRemove.push( i );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( i = faceIndicesToRemove.length - 1; i >= 0; i -- ) {\n\n\t\t\t\tvar idx = faceIndicesToRemove[ i ];\n\n\t\t\t\tthis.faces.splice( idx, 1 );\n\n\t\t\t\tfor ( j = 0, jl = this.faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ j ].splice( idx, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Use unique set of vertices\n\n\t\t\tvar diff = this.vertices.length - unique.length;\n\t\t\tthis.vertices = unique;\n\t\t\treturn diff;\n\n\t\t},\n\n\t\tsortFacesByMaterialIndex: function () {\n\n\t\t\tvar faces = this.faces;\n\t\t\tvar length = faces.length;\n\n\t\t\t// tag faces\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tfaces[ i ]._id = i;\n\n\t\t\t}\n\n\t\t\t// sort faces\n\n\t\t\tfunction materialIndexSort( a, b ) {\n\n\t\t\t\treturn a.materialIndex - b.materialIndex;\n\n\t\t\t}\n\n\t\t\tfaces.sort( materialIndexSort );\n\n\t\t\t// sort uvs\n\n\t\t\tvar uvs1 = this.faceVertexUvs[ 0 ];\n\t\t\tvar uvs2 = this.faceVertexUvs[ 1 ];\n\n\t\t\tvar newUvs1, newUvs2;\n\n\t\t\tif ( uvs1 && uvs1.length === length ) newUvs1 = [];\n\t\t\tif ( uvs2 && uvs2.length === length ) newUvs2 = [];\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tvar id = faces[ i ]._id;\n\n\t\t\t\tif ( newUvs1 ) newUvs1.push( uvs1[ id ] );\n\t\t\t\tif ( newUvs2 ) newUvs2.push( uvs2[ id ] );\n\n\t\t\t}\n\n\t\t\tif ( newUvs1 ) this.faceVertexUvs[ 0 ] = newUvs1;\n\t\t\tif ( newUvs2 ) this.faceVertexUvs[ 1 ] = newUvs2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.5,\n\t\t\t\t\ttype: 'Geometry',\n\t\t\t\t\tgenerator: 'Geometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard Geometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tvar vertices = [];\n\n\t\t\tfor ( var i = 0; i < this.vertices.length; i ++ ) {\n\n\t\t\t\tvar vertex = this.vertices[ i ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t\tvar faces = [];\n\t\t\tvar normals = [];\n\t\t\tvar normalsHash = {};\n\t\t\tvar colors = [];\n\t\t\tvar colorsHash = {};\n\t\t\tvar uvs = [];\n\t\t\tvar uvsHash = {};\n\n\t\t\tfor ( var i = 0; i < this.faces.length; i ++ ) {\n\n\t\t\t\tvar face = this.faces[ i ];\n\n\t\t\t\tvar hasMaterial = true;\n\t\t\t\tvar hasFaceUv = false; // deprecated\n\t\t\t\tvar hasFaceVertexUv = this.faceVertexUvs[ 0 ][ i ] !== undefined;\n\t\t\t\tvar hasFaceNormal = face.normal.length() > 0;\n\t\t\t\tvar hasFaceVertexNormal = face.vertexNormals.length > 0;\n\t\t\t\tvar hasFaceColor = face.color.r !== 1 || face.color.g !== 1 || face.color.b !== 1;\n\t\t\t\tvar hasFaceVertexColor = face.vertexColors.length > 0;\n\n\t\t\t\tvar faceType = 0;\n\n\t\t\t\tfaceType = setBit( faceType, 0, 0 ); // isQuad\n\t\t\t\tfaceType = setBit( faceType, 1, hasMaterial );\n\t\t\t\tfaceType = setBit( faceType, 2, hasFaceUv );\n\t\t\t\tfaceType = setBit( faceType, 3, hasFaceVertexUv );\n\t\t\t\tfaceType = setBit( faceType, 4, hasFaceNormal );\n\t\t\t\tfaceType = setBit( faceType, 5, hasFaceVertexNormal );\n\t\t\t\tfaceType = setBit( faceType, 6, hasFaceColor );\n\t\t\t\tfaceType = setBit( faceType, 7, hasFaceVertexColor );\n\n\t\t\t\tfaces.push( faceType );\n\t\t\t\tfaces.push( face.a, face.b, face.c );\n\t\t\t\tfaces.push( face.materialIndex );\n\n\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\tvar faceVertexUvs = this.faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 0 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 1 ] ),\n\t\t\t\t\t\tgetUvIndex( faceVertexUvs[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\tfaces.push( getNormalIndex( face.normal ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 0 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 1 ] ),\n\t\t\t\t\t\tgetNormalIndex( vertexNormals[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\tfaces.push( getColorIndex( face.color ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\t\tfaces.push(\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 0 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 1 ] ),\n\t\t\t\t\t\tgetColorIndex( vertexColors[ 2 ] )\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction setBit( value, position, enabled ) {\n\n\t\t\t\treturn enabled ? value | ( 1 << position ) : value & ( ~ ( 1 << position ) );\n\n\t\t\t}\n\n\t\t\tfunction getNormalIndex( normal ) {\n\n\t\t\t\tvar hash = normal.x.toString() + normal.y.toString() + normal.z.toString();\n\n\t\t\t\tif ( normalsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tnormalsHash[ hash ] = normals.length / 3;\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\treturn normalsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getColorIndex( color ) {\n\n\t\t\t\tvar hash = color.r.toString() + color.g.toString() + color.b.toString();\n\n\t\t\t\tif ( colorsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tcolorsHash[ hash ] = colors.length;\n\t\t\t\tcolors.push( color.getHex() );\n\n\t\t\t\treturn colorsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tfunction getUvIndex( uv ) {\n\n\t\t\t\tvar hash = uv.x.toString() + uv.y.toString();\n\n\t\t\t\tif ( uvsHash[ hash ] !== undefined ) {\n\n\t\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t\t}\n\n\t\t\t\tuvsHash[ hash ] = uvs.length / 2;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\treturn uvsHash[ hash ];\n\n\t\t\t}\n\n\t\t\tdata.data = {};\n\n\t\t\tdata.data.vertices = vertices;\n\t\t\tdata.data.normals = normals;\n\t\t\tif ( colors.length > 0 ) data.data.colors = colors;\n\t\t\tif ( uvs.length > 0 ) data.data.uvs = [ uvs ]; // temporal backward compatibility\n\t\t\tdata.data.faces = faces;\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t // Handle primitives\n\n\t\t\t var parameters = this.parameters;\n\n\t\t\t if ( parameters !== undefined ) {\n\n\t\t\t var values = [];\n\n\t\t\t for ( var key in parameters ) {\n\n\t\t\t values.push( parameters[ key ] );\n\n\t\t\t }\n\n\t\t\t var geometry = Object.create( this.constructor.prototype );\n\t\t\t this.constructor.apply( geometry, values );\n\t\t\t return geometry;\n\n\t\t\t }\n\n\t\t\t return new this.constructor().copy( this );\n\t\t\t */\n\n\t\t\treturn new Geometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar i, il, j, jl, k, kl;\n\n\t\t\t// reset\n\n\t\t\tthis.vertices = [];\n\t\t\tthis.colors = [];\n\t\t\tthis.faces = [];\n\t\t\tthis.faceVertexUvs = [[]];\n\t\t\tthis.morphTargets = [];\n\t\t\tthis.morphNormals = [];\n\t\t\tthis.skinWeights = [];\n\t\t\tthis.skinIndices = [];\n\t\t\tthis.lineDistances = [];\n\t\t\tthis.boundingBox = null;\n\t\t\tthis.boundingSphere = null;\n\n\t\t\t// name\n\n\t\t\tthis.name = source.name;\n\n\t\t\t// vertices\n\n\t\t\tvar vertices = source.vertices;\n\n\t\t\tfor ( i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\t\tthis.vertices.push( vertices[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tvar colors = source.colors;\n\n\t\t\tfor ( i = 0, il = colors.length; i < il; i ++ ) {\n\n\t\t\t\tthis.colors.push( colors[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tvar faces = source.faces;\n\n\t\t\tfor ( i = 0, il = faces.length; i < il; i ++ ) {\n\n\t\t\t\tthis.faces.push( faces[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// face vertex uvs\n\n\t\t\tfor ( i = 0, il = source.faceVertexUvs.length; i < il; i ++ ) {\n\n\t\t\t\tvar faceVertexUvs = source.faceVertexUvs[ i ];\n\n\t\t\t\tif ( this.faceVertexUvs[ i ] === undefined ) {\n\n\t\t\t\t\tthis.faceVertexUvs[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( j = 0, jl = faceVertexUvs.length; j < jl; j ++ ) {\n\n\t\t\t\t\tvar uvs = faceVertexUvs[ j ], uvsCopy = [];\n\n\t\t\t\t\tfor ( k = 0, kl = uvs.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tvar uv = uvs[ k ];\n\n\t\t\t\t\t\tuvsCopy.push( uv.clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.faceVertexUvs[ i ].push( uvsCopy );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphTargets = source.morphTargets;\n\n\t\t\tfor ( i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphTarget = {};\n\t\t\t\tmorphTarget.name = morphTargets[ i ].name;\n\n\t\t\t\t// vertices\n\n\t\t\t\tif ( morphTargets[ i ].vertices !== undefined ) {\n\n\t\t\t\t\tmorphTarget.vertices = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphTargets[ i ].vertices.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphTarget.vertices.push( morphTargets[ i ].vertices[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// normals\n\n\t\t\t\tif ( morphTargets[ i ].normals !== undefined ) {\n\n\t\t\t\t\tmorphTarget.normals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphTargets[ i ].normals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphTarget.normals.push( morphTargets[ i ].normals[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t\t// morph normals\n\n\t\t\tvar morphNormals = source.morphNormals;\n\n\t\t\tfor ( i = 0, il = morphNormals.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphNormal = {};\n\n\t\t\t\t// vertex normals\n\n\t\t\t\tif ( morphNormals[ i ].vertexNormals !== undefined ) {\n\n\t\t\t\t\tmorphNormal.vertexNormals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphNormals[ i ].vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar srcVertexNormal = morphNormals[ i ].vertexNormals[ j ];\n\t\t\t\t\t\tvar destVertexNormal = {};\n\n\t\t\t\t\t\tdestVertexNormal.a = srcVertexNormal.a.clone();\n\t\t\t\t\t\tdestVertexNormal.b = srcVertexNormal.b.clone();\n\t\t\t\t\t\tdestVertexNormal.c = srcVertexNormal.c.clone();\n\n\t\t\t\t\t\tmorphNormal.vertexNormals.push( destVertexNormal );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// face normals\n\n\t\t\t\tif ( morphNormals[ i ].faceNormals !== undefined ) {\n\n\t\t\t\t\tmorphNormal.faceNormals = [];\n\n\t\t\t\t\tfor ( j = 0, jl = morphNormals[ i ].faceNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tmorphNormal.faceNormals.push( morphNormals[ i ].faceNormals[ j ].clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphNormals.push( morphNormal );\n\n\t\t\t}\n\n\t\t\t// skin weights\n\n\t\t\tvar skinWeights = source.skinWeights;\n\n\t\t\tfor ( i = 0, il = skinWeights.length; i < il; i ++ ) {\n\n\t\t\t\tthis.skinWeights.push( skinWeights[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// skin indices\n\n\t\t\tvar skinIndices = source.skinIndices;\n\n\t\t\tfor ( i = 0, il = skinIndices.length; i < il; i ++ ) {\n\n\t\t\t\tthis.skinIndices.push( skinIndices[ i ].clone() );\n\n\t\t\t}\n\n\t\t\t// line distances\n\n\t\t\tvar lineDistances = source.lineDistances;\n\n\t\t\tfor ( i = 0, il = lineDistances.length; i < il; i ++ ) {\n\n\t\t\t\tthis.lineDistances.push( lineDistances[ i ] );\n\n\t\t\t}\n\n\t\t\t// bounding box\n\n\t\t\tvar boundingBox = source.boundingBox;\n\n\t\t\tif ( boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t\t}\n\n\t\t\t// bounding sphere\n\n\t\t\tvar boundingSphere = source.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\t// update flags\n\n\t\t\tthis.elementsNeedUpdate = source.elementsNeedUpdate;\n\t\t\tthis.verticesNeedUpdate = source.verticesNeedUpdate;\n\t\t\tthis.uvsNeedUpdate = source.uvsNeedUpdate;\n\t\t\tthis.normalsNeedUpdate = source.normalsNeedUpdate;\n\t\t\tthis.colorsNeedUpdate = source.colorsNeedUpdate;\n\t\t\tthis.lineDistancesNeedUpdate = source.lineDistancesNeedUpdate;\n\t\t\tthis.groupsNeedUpdate = source.groupsNeedUpdate;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferAttribute( array, itemSize, normalized ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.uuid = _Math.generateUUID();\n\t\tthis.name = '';\n\n\t\tthis.array = array;\n\t\tthis.itemSize = itemSize;\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\t\tthis.normalized = normalized === true;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.onUploadCallback = function () {};\n\n\t\tthis.version = 0;\n\n\t}\n\n\tObject.defineProperty( BufferAttribute.prototype, 'needsUpdate', {\n\n\t\tset: function ( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t}\n\n\t} );\n\n\tObject.assign( BufferAttribute.prototype, {\n\n\t\tisBufferAttribute: true,\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.itemSize : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.itemSize = source.itemSize;\n\t\t\tthis.count = source.count;\n\t\t\tthis.normalized = source.normalized;\n\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.itemSize;\n\t\t\tindex2 *= attribute.itemSize;\n\n\t\t\tfor ( var i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyArray: function ( array ) {\n\n\t\t\tthis.array.set( array );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyColorsArray: function ( colors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\t\tvar color = colors[ i ];\n\n\t\t\t\tif ( color === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyColorsArray(): color is undefined', i );\n\t\t\t\t\tcolor = new Color();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = color.r;\n\t\t\t\tarray[ offset ++ ] = color.g;\n\t\t\t\tarray[ offset ++ ] = color.b;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyIndicesArray: function ( indices ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tvar index = indices[ i ];\n\n\t\t\t\tarray[ offset ++ ] = index.a;\n\t\t\t\tarray[ offset ++ ] = index.b;\n\t\t\t\tarray[ offset ++ ] = index.c;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector2sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector2sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector2();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector3sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector3sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector3();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyVector4sArray: function ( vectors ) {\n\n\t\t\tvar array = this.array, offset = 0;\n\n\t\t\tfor ( var i = 0, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tvar vector = vectors[ i ];\n\n\t\t\t\tif ( vector === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.BufferAttribute.copyVector4sArray(): vector is undefined', i );\n\t\t\t\t\tvector = new Vector4();\n\n\t\t\t\t}\n\n\t\t\t\tarray[ offset ++ ] = vector.x;\n\t\t\t\tarray[ offset ++ ] = vector.y;\n\t\t\t\tarray[ offset ++ ] = vector.z;\n\t\t\t\tarray[ offset ++ ] = vector.w;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize ];\n\n\t\t},\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 1 ];\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 2 ];\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.array[ index * this.itemSize + 3 ];\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex *= this.itemSize;\n\n\t\t\tthis.array[ index + 0 ] = x;\n\t\t\tthis.array[ index + 1 ] = y;\n\t\t\tthis.array[ index + 2 ] = z;\n\t\t\tthis.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tonUpload: function ( callback ) {\n\n\t\t\tthis.onUploadCallback = callback;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t//\n\n\tfunction Int8BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int8Array( array ), itemSize );\n\n\t}\n\n\tInt8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt8BufferAttribute.prototype.constructor = Int8BufferAttribute;\n\n\n\tfunction Uint8BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint8Array( array ), itemSize );\n\n\t}\n\n\tUint8BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint8BufferAttribute.prototype.constructor = Uint8BufferAttribute;\n\n\n\tfunction Uint8ClampedBufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint8ClampedArray( array ), itemSize );\n\n\t}\n\n\tUint8ClampedBufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint8ClampedBufferAttribute.prototype.constructor = Uint8ClampedBufferAttribute;\n\n\n\tfunction Int16BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int16Array( array ), itemSize );\n\n\t}\n\n\tInt16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt16BufferAttribute.prototype.constructor = Int16BufferAttribute;\n\n\n\tfunction Uint16BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint16Array( array ), itemSize );\n\n\t}\n\n\tUint16BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint16BufferAttribute.prototype.constructor = Uint16BufferAttribute;\n\n\n\tfunction Int32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Int32Array( array ), itemSize );\n\n\t}\n\n\tInt32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tInt32BufferAttribute.prototype.constructor = Int32BufferAttribute;\n\n\n\tfunction Uint32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Uint32Array( array ), itemSize );\n\n\t}\n\n\tUint32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tUint32BufferAttribute.prototype.constructor = Uint32BufferAttribute;\n\n\n\tfunction Float32BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Float32Array( array ), itemSize );\n\n\t}\n\n\tFloat32BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tFloat32BufferAttribute.prototype.constructor = Float32BufferAttribute;\n\n\n\tfunction Float64BufferAttribute( array, itemSize ) {\n\n\t\tBufferAttribute.call( this, new Float64Array( array ), itemSize );\n\n\t}\n\n\tFloat64BufferAttribute.prototype = Object.create( BufferAttribute.prototype );\n\tFloat64BufferAttribute.prototype.constructor = Float64BufferAttribute;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectGeometry() {\n\n\t\tthis.indices = [];\n\t\tthis.vertices = [];\n\t\tthis.normals = [];\n\t\tthis.colors = [];\n\t\tthis.uvs = [];\n\t\tthis.uvs2 = [];\n\n\t\tthis.groups = [];\n\n\t\tthis.morphTargets = {};\n\n\t\tthis.skinWeights = [];\n\t\tthis.skinIndices = [];\n\n\t\t// this.lineDistances = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// update flags\n\n\t\tthis.verticesNeedUpdate = false;\n\t\tthis.normalsNeedUpdate = false;\n\t\tthis.colorsNeedUpdate = false;\n\t\tthis.uvsNeedUpdate = false;\n\t\tthis.groupsNeedUpdate = false;\n\n\t}\n\n\tObject.assign( DirectGeometry.prototype, {\n\n\t\tcomputeGroups: function ( geometry ) {\n\n\t\t\tvar group;\n\t\t\tvar groups = [];\n\t\t\tvar materialIndex = undefined;\n\n\t\t\tvar faces = geometry.faces;\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t// materials\n\n\t\t\t\tif ( face.materialIndex !== materialIndex ) {\n\n\t\t\t\t\tmaterialIndex = face.materialIndex;\n\n\t\t\t\t\tif ( group !== undefined ) {\n\n\t\t\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\t\t\tgroups.push( group );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgroup = {\n\t\t\t\t\t\tstart: i * 3,\n\t\t\t\t\t\tmaterialIndex: materialIndex\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( group !== undefined ) {\n\n\t\t\t\tgroup.count = ( i * 3 ) - group.start;\n\t\t\t\tgroups.push( group );\n\n\t\t\t}\n\n\t\t\tthis.groups = groups;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tvar faces = geometry.faces;\n\t\t\tvar vertices = geometry.vertices;\n\t\t\tvar faceVertexUvs = geometry.faceVertexUvs;\n\n\t\t\tvar hasFaceVertexUv = faceVertexUvs[ 0 ] && faceVertexUvs[ 0 ].length > 0;\n\t\t\tvar hasFaceVertexUv2 = faceVertexUvs[ 1 ] && faceVertexUvs[ 1 ].length > 0;\n\n\t\t\t// morphs\n\n\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\tvar morphTargetsLength = morphTargets.length;\n\n\t\t\tvar morphTargetsPosition;\n\n\t\t\tif ( morphTargetsLength > 0 ) {\n\n\t\t\t\tmorphTargetsPosition = [];\n\n\t\t\t\tfor ( var i = 0; i < morphTargetsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsPosition[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.position = morphTargetsPosition;\n\n\t\t\t}\n\n\t\t\tvar morphNormals = geometry.morphNormals;\n\t\t\tvar morphNormalsLength = morphNormals.length;\n\n\t\t\tvar morphTargetsNormal;\n\n\t\t\tif ( morphNormalsLength > 0 ) {\n\n\t\t\t\tmorphTargetsNormal = [];\n\n\t\t\t\tfor ( var i = 0; i < morphNormalsLength; i ++ ) {\n\n\t\t\t\t\tmorphTargetsNormal[ i ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphTargets.normal = morphTargetsNormal;\n\n\t\t\t}\n\n\t\t\t// skins\n\n\t\t\tvar skinIndices = geometry.skinIndices;\n\t\t\tvar skinWeights = geometry.skinWeights;\n\n\t\t\tvar hasSkinIndices = skinIndices.length === vertices.length;\n\t\t\tvar hasSkinWeights = skinWeights.length === vertices.length;\n\n\t\t\t//\n\n\t\t\tfor ( var i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tthis.vertices.push( vertices[ face.a ], vertices[ face.b ], vertices[ face.c ] );\n\n\t\t\t\tvar vertexNormals = face.vertexNormals;\n\n\t\t\t\tif ( vertexNormals.length === 3 ) {\n\n\t\t\t\t\tthis.normals.push( vertexNormals[ 0 ], vertexNormals[ 1 ], vertexNormals[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar normal = face.normal;\n\n\t\t\t\t\tthis.normals.push( normal, normal, normal );\n\n\t\t\t\t}\n\n\t\t\t\tvar vertexColors = face.vertexColors;\n\n\t\t\t\tif ( vertexColors.length === 3 ) {\n\n\t\t\t\t\tthis.colors.push( vertexColors[ 0 ], vertexColors[ 1 ], vertexColors[ 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar color = face.color;\n\n\t\t\t\t\tthis.colors.push( color, color, color );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 0 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ', i );\n\n\t\t\t\t\t\tthis.uvs.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasFaceVertexUv2 === true ) {\n\n\t\t\t\t\tvar vertexUvs = faceVertexUvs[ 1 ][ i ];\n\n\t\t\t\t\tif ( vertexUvs !== undefined ) {\n\n\t\t\t\t\t\tthis.uvs2.push( vertexUvs[ 0 ], vertexUvs[ 1 ], vertexUvs[ 2 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ', i );\n\n\t\t\t\t\t\tthis.uvs2.push( new Vector2(), new Vector2(), new Vector2() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// morphs\n\n\t\t\t\tfor ( var j = 0; j < morphTargetsLength; j ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ j ].vertices;\n\n\t\t\t\t\tmorphTargetsPosition[ j ].push( morphTarget[ face.a ], morphTarget[ face.b ], morphTarget[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var j = 0; j < morphNormalsLength; j ++ ) {\n\n\t\t\t\t\tvar morphNormal = morphNormals[ j ].vertexNormals[ i ];\n\n\t\t\t\t\tmorphTargetsNormal[ j ].push( morphNormal.a, morphNormal.b, morphNormal.c );\n\n\t\t\t\t}\n\n\t\t\t\t// skins\n\n\t\t\t\tif ( hasSkinIndices ) {\n\n\t\t\t\t\tthis.skinIndices.push( skinIndices[ face.a ], skinIndices[ face.b ], skinIndices[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasSkinWeights ) {\n\n\t\t\t\t\tthis.skinWeights.push( skinWeights[ face.a ], skinWeights[ face.b ], skinWeights[ face.c ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.computeGroups( geometry );\n\n\t\t\tthis.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\tthis.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\tthis.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\tthis.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\tthis.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction arrayMax( array ) {\n\n\t\tif ( array.length === 0 ) return - Infinity;\n\n\t\tvar max = array[ 0 ];\n\n\t\tfor ( var i = 1, l = array.length; i < l; ++ i ) {\n\n\t\t\tif ( array[ i ] > max ) max = array[ i ];\n\n\t\t}\n\n\t\treturn max;\n\n\t}\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometry() {\n\n\t\tObject.defineProperty( this, 'id', { value: GeometryIdCount() } );\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\n\t\tthis.morphAttributes = {};\n\n\t\tthis.groups = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t}\n\n\tBufferGeometry.MaxIndex = 65535;\n\n\tObject.assign( BufferGeometry.prototype, EventDispatcher.prototype, {\n\n\t\tisBufferGeometry: true,\n\n\t\tgetIndex: function () {\n\n\t\t\treturn this.index;\n\n\t\t},\n\n\t\tsetIndex: function ( index ) {\n\n\t\t\tif ( Array.isArray( index ) ) {\n\n\t\t\t\tthis.index = new ( arrayMax( index ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t\t} else {\n\n\t\t\t\tthis.index = index;\n\n\t\t\t}\n\n\t\t},\n\n\t\taddAttribute: function ( name, attribute ) {\n\n\t\t\tif ( ! ( attribute && attribute.isBufferAttribute ) && ! ( attribute && attribute.isInterleavedBufferAttribute ) ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addAttribute() now expects ( name, attribute ).' );\n\n\t\t\t\tthis.addAttribute( name, new BufferAttribute( arguments[ 1 ], arguments[ 2 ] ) );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( name === 'index' ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute.' );\n\t\t\t\tthis.setIndex( attribute );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.attributes[ name ] = attribute;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetAttribute: function ( name ) {\n\n\t\t\treturn this.attributes[ name ];\n\n\t\t},\n\n\t\tremoveAttribute: function ( name ) {\n\n\t\t\tdelete this.attributes[ name ];\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddGroup: function ( start, count, materialIndex ) {\n\n\t\t\tthis.groups.push( {\n\n\t\t\t\tstart: start,\n\t\t\t\tcount: count,\n\t\t\t\tmaterialIndex: materialIndex !== undefined ? materialIndex : 0\n\n\t\t\t} );\n\n\t\t},\n\n\t\tclearGroups: function () {\n\n\t\t\tthis.groups = [];\n\n\t\t},\n\n\t\tsetDrawRange: function ( start, count ) {\n\n\t\t\tthis.drawRange.start = start;\n\t\t\tthis.drawRange.count = count;\n\n\t\t},\n\n\t\tapplyMatrix: function ( matrix ) {\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tmatrix.applyToBufferAttribute( position );\n\t\t\t\tposition.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tvar normal = this.attributes.normal;\n\n\t\t\tif ( normal !== undefined ) {\n\n\t\t\t\tvar normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\t\tnormalMatrix.applyToBufferAttribute( normal );\n\t\t\t\tnormal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tthis.computeBoundingBox();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tthis.computeBoundingSphere();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trotateX: function () {\n\n\t\t\t// rotate geometry around world x-axis\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function rotateX( angle ) {\n\n\t\t\t\tm1.makeRotationX( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateY: function () {\n\n\t\t\t// rotate geometry around world y-axis\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function rotateY( angle ) {\n\n\t\t\t\tm1.makeRotationY( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\trotateZ: function () {\n\n\t\t\t// rotate geometry around world z-axis\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function rotateZ( angle ) {\n\n\t\t\t\tm1.makeRotationZ( angle );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttranslate: function () {\n\n\t\t\t// translate geometry\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function translate( x, y, z ) {\n\n\t\t\t\tm1.makeTranslation( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tscale: function () {\n\n\t\t\t// scale geometry\n\n\t\t\tvar m1 = new Matrix4();\n\n\t\t\treturn function scale( x, y, z ) {\n\n\t\t\t\tm1.makeScale( x, y, z );\n\n\t\t\t\tthis.applyMatrix( m1 );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tlookAt: function () {\n\n\t\t\tvar obj = new Object3D();\n\n\t\t\treturn function lookAt( vector ) {\n\n\t\t\t\tobj.lookAt( vector );\n\n\t\t\t\tobj.updateMatrix();\n\n\t\t\t\tthis.applyMatrix( obj.matrix );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcenter: function () {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t\tvar offset = this.boundingBox.getCenter().negate();\n\n\t\t\tthis.translate( offset.x, offset.y, offset.z );\n\n\t\t\treturn offset;\n\n\t\t},\n\n\t\tsetFromObject: function ( object ) {\n\n\t\t\t// console.log( 'THREE.BufferGeometry.setFromObject(). Converting', object, this );\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( object.isPoints || object.isLine ) {\n\n\t\t\t\tvar positions = new Float32BufferAttribute( geometry.vertices.length * 3, 3 );\n\t\t\t\tvar colors = new Float32BufferAttribute( geometry.colors.length * 3, 3 );\n\n\t\t\t\tthis.addAttribute( 'position', positions.copyVector3sArray( geometry.vertices ) );\n\t\t\t\tthis.addAttribute( 'color', colors.copyColorsArray( geometry.colors ) );\n\n\t\t\t\tif ( geometry.lineDistances && geometry.lineDistances.length === geometry.vertices.length ) {\n\n\t\t\t\t\tvar lineDistances = new Float32BufferAttribute( geometry.lineDistances.length, 1 );\n\n\t\t\t\t\tthis.addAttribute( 'lineDistance', lineDistances.copyArray( geometry.lineDistances ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isMesh ) {\n\n\t\t\t\tif ( geometry && geometry.isGeometry ) {\n\n\t\t\t\t\tthis.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateFromObject: function ( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tvar direct = geometry.__directGeometry;\n\n\t\t\t\tif ( geometry.elementsNeedUpdate === true ) {\n\n\t\t\t\t\tdirect = undefined;\n\t\t\t\t\tgeometry.elementsNeedUpdate = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( direct === undefined ) {\n\n\t\t\t\t\treturn this.fromGeometry( geometry );\n\n\t\t\t\t}\n\n\t\t\t\tdirect.verticesNeedUpdate = geometry.verticesNeedUpdate;\n\t\t\t\tdirect.normalsNeedUpdate = geometry.normalsNeedUpdate;\n\t\t\t\tdirect.colorsNeedUpdate = geometry.colorsNeedUpdate;\n\t\t\t\tdirect.uvsNeedUpdate = geometry.uvsNeedUpdate;\n\t\t\t\tdirect.groupsNeedUpdate = geometry.groupsNeedUpdate;\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t\tgeometry = direct;\n\n\t\t\t}\n\n\t\t\tvar attribute;\n\n\t\t\tif ( geometry.verticesNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.position;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.vertices );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.verticesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.normalsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.normal;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector3sArray( geometry.normals );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.normalsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.colorsNeedUpdate === true ) {\n\n\t\t\t\tattribute = this.attributes.color;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyColorsArray( geometry.colors );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.colorsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvsNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.uv;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyVector2sArray( geometry.uvs );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uvsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.lineDistancesNeedUpdate ) {\n\n\t\t\t\tattribute = this.attributes.lineDistance;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tattribute.copyArray( geometry.lineDistances );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.lineDistancesNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( geometry.groupsNeedUpdate ) {\n\n\t\t\t\tgeometry.computeGroups( object.geometry );\n\t\t\t\tthis.groups = geometry.groups;\n\n\t\t\t\tgeometry.groupsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tfromGeometry: function ( geometry ) {\n\n\t\t\tgeometry.__directGeometry = new DirectGeometry().fromGeometry( geometry );\n\n\t\t\treturn this.fromDirectGeometry( geometry.__directGeometry );\n\n\t\t},\n\n\t\tfromDirectGeometry: function ( geometry ) {\n\n\t\t\tvar positions = new Float32Array( geometry.vertices.length * 3 );\n\t\t\tthis.addAttribute( 'position', new BufferAttribute( positions, 3 ).copyVector3sArray( geometry.vertices ) );\n\n\t\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\t\tvar normals = new Float32Array( geometry.normals.length * 3 );\n\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( normals, 3 ).copyVector3sArray( geometry.normals ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\t\tvar colors = new Float32Array( geometry.colors.length * 3 );\n\t\t\t\tthis.addAttribute( 'color', new BufferAttribute( colors, 3 ).copyColorsArray( geometry.colors ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs.length > 0 ) {\n\n\t\t\t\tvar uvs = new Float32Array( geometry.uvs.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv', new BufferAttribute( uvs, 2 ).copyVector2sArray( geometry.uvs ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.uvs2.length > 0 ) {\n\n\t\t\t\tvar uvs2 = new Float32Array( geometry.uvs2.length * 2 );\n\t\t\t\tthis.addAttribute( 'uv2', new BufferAttribute( uvs2, 2 ).copyVector2sArray( geometry.uvs2 ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.indices.length > 0 ) {\n\n\t\t\t\tvar TypeArray = arrayMax( geometry.indices ) > 65535 ? Uint32Array : Uint16Array;\n\t\t\t\tvar indices = new TypeArray( geometry.indices.length * 3 );\n\t\t\t\tthis.setIndex( new BufferAttribute( indices, 1 ).copyIndicesArray( geometry.indices ) );\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tthis.groups = geometry.groups;\n\n\t\t\t// morphs\n\n\t\t\tfor ( var name in geometry.morphTargets ) {\n\n\t\t\t\tvar array = [];\n\t\t\t\tvar morphTargets = geometry.morphTargets[ name ];\n\n\t\t\t\tfor ( var i = 0, l = morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar morphTarget = morphTargets[ i ];\n\n\t\t\t\t\tvar attribute = new Float32BufferAttribute( morphTarget.length * 3, 3 );\n\n\t\t\t\t\tarray.push( attribute.copyVector3sArray( morphTarget ) );\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t\t}\n\n\t\t\t// skinning\n\n\t\t\tif ( geometry.skinIndices.length > 0 ) {\n\n\t\t\t\tvar skinIndices = new Float32BufferAttribute( geometry.skinIndices.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinIndex', skinIndices.copyVector4sArray( geometry.skinIndices ) );\n\n\t\t\t}\n\n\t\t\tif ( geometry.skinWeights.length > 0 ) {\n\n\t\t\t\tvar skinWeights = new Float32BufferAttribute( geometry.skinWeights.length * 4, 4 );\n\t\t\t\tthis.addAttribute( 'skinWeight', skinWeights.copyVector4sArray( geometry.skinWeights ) );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = geometry.boundingBox.clone();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcomputeBoundingBox: function () {\n\n\t\t\tif ( this.boundingBox === null ) {\n\n\t\t\t\tthis.boundingBox = new Box3();\n\n\t\t\t}\n\n\t\t\tvar position = this.attributes.position;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t} else {\n\n\t\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t\t}\n\n\t\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t},\n\n\t\tcomputeBoundingSphere: function () {\n\n\t\t\tvar box = new Box3();\n\t\t\tvar vector = new Vector3();\n\n\t\t\treturn function computeBoundingSphere() {\n\n\t\t\t\tif ( this.boundingSphere === null ) {\n\n\t\t\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t\t\t}\n\n\t\t\t\tvar position = this.attributes.position;\n\n\t\t\t\tif ( position ) {\n\n\t\t\t\t\tvar center = this.boundingSphere.center;\n\n\t\t\t\t\tbox.setFromBufferAttribute( position );\n\t\t\t\t\tbox.getCenter( center );\n\n\t\t\t\t\t// hoping to find a boundingSphere with a radius smaller than the\n\t\t\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\t\t\tvar maxRadiusSq = 0;\n\n\t\t\t\t\tfor ( var i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t\t\tvector.x = position.getX( i );\n\t\t\t\t\t\tvector.y = position.getY( i );\n\t\t\t\t\t\tvector.z = position.getZ( i );\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( vector ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcomputeFaceNormals: function () {\n\n\t\t\t// backwards compatibility\n\n\t\t},\n\n\t\tcomputeVertexNormals: function () {\n\n\t\t\tvar index = this.index;\n\t\t\tvar attributes = this.attributes;\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( attributes.position ) {\n\n\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\tif ( attributes.normal === undefined ) {\n\n\t\t\t\t\tthis.addAttribute( 'normal', new BufferAttribute( new Float32Array( positions.length ), 3 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// reset existing normals to zero\n\n\t\t\t\t\tvar array = attributes.normal.array;\n\n\t\t\t\t\tfor ( var i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tarray[ i ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar normals = attributes.normal.array;\n\n\t\t\t\tvar vA, vB, vC;\n\t\t\t\tvar pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\t\tvar cb = new Vector3(), ab = new Vector3();\n\n\t\t\t\t// indexed elements\n\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\t\tthis.addGroup( 0, indices.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var j = 0, jl = groups.length; j < jl; ++ j ) {\n\n\t\t\t\t\t\tvar group = groups[ j ];\n\n\t\t\t\t\t\tvar start = group.start;\n\t\t\t\t\t\tvar count = group.count;\n\n\t\t\t\t\t\tfor ( var i = start, il = start + count; i < il; i += 3 ) {\n\n\t\t\t\t\t\t\tvA = indices[ i + 0 ] * 3;\n\t\t\t\t\t\t\tvB = indices[ i + 1 ] * 3;\n\t\t\t\t\t\t\tvC = indices[ i + 2 ] * 3;\n\n\t\t\t\t\t\t\tpA.fromArray( positions, vA );\n\t\t\t\t\t\t\tpB.fromArray( positions, vB );\n\t\t\t\t\t\t\tpC.fromArray( positions, vC );\n\n\t\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\t\tnormals[ vA ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vA + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vA + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vB ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vB + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vB + 2 ] += cb.z;\n\n\t\t\t\t\t\t\tnormals[ vC ] += cb.x;\n\t\t\t\t\t\t\tnormals[ vC + 1 ] += cb.y;\n\t\t\t\t\t\t\tnormals[ vC + 2 ] += cb.z;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\t\tfor ( var i = 0, il = positions.length; i < il; i += 9 ) {\n\n\t\t\t\t\t\tpA.fromArray( positions, i );\n\t\t\t\t\t\tpB.fromArray( positions, i + 3 );\n\t\t\t\t\t\tpC.fromArray( positions, i + 6 );\n\n\t\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\t\tnormals[ i ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 1 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 2 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 3 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 4 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 5 ] = cb.z;\n\n\t\t\t\t\t\tnormals[ i + 6 ] = cb.x;\n\t\t\t\t\t\tnormals[ i + 7 ] = cb.y;\n\t\t\t\t\t\tnormals[ i + 8 ] = cb.z;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.normalizeNormals();\n\n\t\t\t\tattributes.normal.needsUpdate = true;\n\n\t\t\t}\n\n\t\t},\n\n\t\tmerge: function ( geometry, offset ) {\n\n\t\t\tif ( ! ( geometry && geometry.isBufferGeometry ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.', geometry );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tif ( geometry.attributes[ key ] === undefined ) continue;\n\n\t\t\t\tvar attribute1 = attributes[ key ];\n\t\t\t\tvar attributeArray1 = attribute1.array;\n\n\t\t\t\tvar attribute2 = geometry.attributes[ key ];\n\t\t\t\tvar attributeArray2 = attribute2.array;\n\n\t\t\t\tvar attributeSize = attribute2.itemSize;\n\n\t\t\t\tfor ( var i = 0, j = attributeSize * offset; i < attributeArray2.length; i ++, j ++ ) {\n\n\t\t\t\t\tattributeArray1[ j ] = attributeArray2[ i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tnormalizeNormals: function () {\n\n\t\t\tvar vector = new Vector3();\n\n\t\t\treturn function normalizeNormals() {\n\n\t\t\t\tvar normals = this.attributes.normal;\n\n\t\t\t\tfor ( var i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t\t\tvector.x = normals.getX( i );\n\t\t\t\t\tvector.y = normals.getY( i );\n\t\t\t\t\tvector.z = normals.getZ( i );\n\n\t\t\t\t\tvector.normalize();\n\n\t\t\t\t\tnormals.setXYZ( i, vector.x, vector.y, vector.z );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttoNonIndexed: function () {\n\n\t\t\tif ( this.index === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed.' );\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t\tvar geometry2 = new BufferGeometry();\n\n\t\t\tvar indices = this.index.array;\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\n\t\t\t\tvar array = attribute.array;\n\t\t\t\tvar itemSize = attribute.itemSize;\n\n\t\t\t\tvar array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\t\tvar index = 0, index2 = 0;\n\n\t\t\t\tfor ( var i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t\tfor ( var j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry2.addAttribute( name, new BufferAttribute( array2, itemSize ) );\n\n\t\t\t}\n\n\t\t\treturn geometry2;\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar data = {\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.5,\n\t\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// standard BufferGeometry serialization\n\n\t\t\tdata.uuid = this.uuid;\n\t\t\tdata.type = this.type;\n\t\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\t\tif ( this.parameters !== undefined ) {\n\n\t\t\t\tvar parameters = this.parameters;\n\n\t\t\t\tfor ( var key in parameters ) {\n\n\t\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t\t}\n\n\t\t\t\treturn data;\n\n\t\t\t}\n\n\t\t\tdata.data = { attributes: {} };\n\n\t\t\tvar index = this.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tvar array = Array.prototype.slice.call( index.array );\n\n\t\t\t\tdata.data.index = {\n\t\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\t\tarray: array\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar attributes = this.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\n\t\t\t\tvar array = Array.prototype.slice.call( attribute.array );\n\n\t\t\t\tdata.data.attributes[ key ] = {\n\t\t\t\t\titemSize: attribute.itemSize,\n\t\t\t\t\ttype: attribute.array.constructor.name,\n\t\t\t\t\tarray: array,\n\t\t\t\t\tnormalized: attribute.normalized\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tvar groups = this.groups;\n\n\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = this.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tdata.data.boundingSphere = {\n\t\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\t\tradius: boundingSphere.radius\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\t/*\n\t\t\t // Handle primitives\n\n\t\t\t var parameters = this.parameters;\n\n\t\t\t if ( parameters !== undefined ) {\n\n\t\t\t var values = [];\n\n\t\t\t for ( var key in parameters ) {\n\n\t\t\t values.push( parameters[ key ] );\n\n\t\t\t }\n\n\t\t\t var geometry = Object.create( this.constructor.prototype );\n\t\t\t this.constructor.apply( geometry, values );\n\t\t\t return geometry;\n\n\t\t\t }\n\n\t\t\t return new this.constructor().copy( this );\n\t\t\t */\n\n\t\t\treturn new BufferGeometry().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar name, i, l;\n\n\t\t\t// reset\n\n\t\t\tthis.index = null;\n\t\t\tthis.attributes = {};\n\t\t\tthis.morphAttributes = {};\n\t\t\tthis.groups = [];\n\t\t\tthis.boundingBox = null;\n\t\t\tthis.boundingSphere = null;\n\n\t\t\t// name\n\n\t\t\tthis.name = source.name;\n\n\t\t\t// index\n\n\t\t\tvar index = source.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tthis.setIndex( index.clone() );\n\n\t\t\t}\n\n\t\t\t// attributes\n\n\t\t\tvar attributes = source.attributes;\n\n\t\t\tfor ( name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\t\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t\t}\n\n\t\t\t// morph attributes\n\n\t\t\tvar morphAttributes = source.morphAttributes;\n\n\t\t\tfor ( name in morphAttributes ) {\n\n\t\t\t\tvar array = [];\n\t\t\t\tvar morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\t\tfor ( i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\t\tarray.push( morphAttribute[ i ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t\t}\n\n\t\t\t// groups\n\n\t\t\tvar groups = source.groups;\n\n\t\t\tfor ( i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\tvar group = groups[ i ];\n\t\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t\t// bounding box\n\n\t\t\tvar boundingBox = source.boundingBox;\n\n\t\t\tif ( boundingBox !== null ) {\n\n\t\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t\t}\n\n\t\t\t// bounding sphere\n\n\t\t\tvar boundingSphere = source.boundingSphere;\n\n\t\t\tif ( boundingSphere !== null ) {\n\n\t\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t\t}\n\n\t\t\t// draw range\n\n\t\t\tthis.drawRange.start = source.drawRange.start;\n\t\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdispose: function () {\n\n\t\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\t// BoxGeometry\n\n\tfunction BoxGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tBoxGeometry.prototype = Object.create( Geometry.prototype );\n\tBoxGeometry.prototype.constructor = BoxGeometry;\n\n\t// BoxBufferGeometry\n\n\tfunction BoxBufferGeometry( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'BoxBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tvar scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments ) || 1;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\t\tdepthSegments = Math.floor( depthSegments ) || 1;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar numberOfVertices = 0;\n\t\tvar groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height,   width,  depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x',   1, - 1, depth, height, - width,  depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y',   1,   1, width, depth,    height, widthSegments, depthSegments,  2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y',   1, - 1, width, depth,  - height, widthSegments, depthSegments,  3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z',   1, - 1, width, height,   depth,  widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth,  widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tvar segmentWidth = width / gridX;\n\t\t\tvar segmentHeight = height / gridY;\n\n\t\t\tvar widthHalf = width / 2;\n\t\t\tvar heightHalf = height / 2;\n\t\t\tvar depthHalf = depth / 2;\n\n\t\t\tvar gridX1 = gridX + 1;\n\t\t\tvar gridY1 = gridY + 1;\n\n\t\t\tvar vertexCounter = 0;\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar ix, iy;\n\n\t\t\tvar vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tvar y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tvar x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tvar a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tvar b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tvar d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tBoxBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tBoxBufferGeometry.prototype.constructor = BoxBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\t// PlaneGeometry\n\n\tfunction PlaneGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new PlaneBufferGeometry( width, height, widthSegments, heightSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tPlaneGeometry.prototype = Object.create( Geometry.prototype );\n\tPlaneGeometry.prototype.constructor = PlaneGeometry;\n\n\t// PlaneBufferGeometry\n\n\tfunction PlaneBufferGeometry( width, height, widthSegments, heightSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PlaneBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tvar width_half = width / 2;\n\t\tvar height_half = height / 2;\n\n\t\tvar gridX = Math.floor( widthSegments ) || 1;\n\t\tvar gridY = Math.floor( heightSegments ) || 1;\n\n\t\tvar gridX1 = gridX + 1;\n\t\tvar gridY1 = gridY + 1;\n\n\t\tvar segment_width = width / gridX;\n\t\tvar segment_height = height / gridY;\n\n\t\tvar ix, iy;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tvar y = iy * segment_height - height_half;\n\n\t\t\tfor ( ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tvar x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tvar a = ix + gridX1 * iy;\n\t\t\t\tvar b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tvar c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tvar d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tPlaneBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPlaneBufferGeometry.prototype.constructor = PlaneBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t *  color: <hex>,\n\t *  opacity: <float>,\n\t *  map: new THREE.Texture( <Image> ),\n\t *\n\t *  lightMap: new THREE.Texture( <Image> ),\n\t *  lightMapIntensity: <float>\n\t *\n\t *  aoMap: new THREE.Texture( <Image> ),\n\t *  aoMapIntensity: <float>\n\t *\n\t *  specularMap: new THREE.Texture( <Image> ),\n\t *\n\t *  alphaMap: new THREE.Texture( <Image> ),\n\t *\n\t *  envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t *  combine: THREE.Multiply,\n\t *  reflectivity: <float>,\n\t *  refractionRatio: <float>,\n\t *\n\t *  depthTest: <bool>,\n\t *  depthWrite: <bool>,\n\t *\n\t *  wireframe: <boolean>,\n\t *  wireframeLinewidth: <float>,\n\t *\n\t *  skinning: <bool>,\n\t *  morphTargets: <bool>\n\t * }\n\t */\n\n\tfunction MeshBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // emissive\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshBasicMaterial.prototype = Object.create( Material.prototype );\n\tMeshBasicMaterial.prototype.constructor = MeshBasicMaterial;\n\n\tMeshBasicMaterial.prototype.isMeshBasicMaterial = true;\n\n\tMeshBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Ray( origin, direction ) {\n\n\t\tthis.origin = ( origin !== undefined ) ? origin : new Vector3();\n\t\tthis.direction = ( direction !== undefined ) ? direction : new Vector3();\n\n\t}\n\n\tObject.assign( Ray.prototype, {\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\tthis.origin.copy( origin );\n\t\t\tthis.direction.copy( direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( ray ) {\n\n\t\t\tthis.origin.copy( ray.origin );\n\t\t\tthis.direction.copy( ray.direction );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t\t},\n\n\t\tlookAt: function ( v ) {\n\n\t\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\trecast: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function recast( t ) {\n\n\t\t\t\tthis.origin.copy( this.at( t, v1 ) );\n\n\t\t\t\treturn this;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\tresult.subVectors( point, this.origin );\n\t\t\tvar directionDistance = result.dot( this.direction );\n\n\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\treturn result.copy( this.origin );\n\n\t\t\t}\n\n\t\t\treturn result.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t},\n\n\t\tdistanceToPoint: function ( point ) {\n\n\t\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t\t},\n\n\t\tdistanceSqToPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function distanceSqToPoint( point ) {\n\n\t\t\t\tvar directionDistance = v1.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t\t\t// point behind the ray\n\n\t\t\t\tif ( directionDistance < 0 ) {\n\n\t\t\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t\t\t}\n\n\t\t\t\tv1.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\t\t\treturn v1.distanceToSquared( point );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tdistanceSqToSegment: function () {\n\n\t\t\tvar segCenter = new Vector3();\n\t\t\tvar segDir = new Vector3();\n\t\t\tvar diff = new Vector3();\n\n\t\t\treturn function distanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t\t\t// It returns the min distance between the ray and the segment\n\t\t\t\t// defined by v0 and v1\n\t\t\t\t// It can also set two optional targets :\n\t\t\t\t// - The closest point on the ray\n\t\t\t\t// - The closest point on the segment\n\n\t\t\t\tsegCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t\t\tsegDir.copy( v1 ).sub( v0 ).normalize();\n\t\t\t\tdiff.copy( this.origin ).sub( segCenter );\n\n\t\t\t\tvar segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\t\t\tvar a01 = - this.direction.dot( segDir );\n\t\t\t\tvar b0 = diff.dot( this.direction );\n\t\t\t\tvar b1 = - diff.dot( segDir );\n\t\t\t\tvar c = diff.lengthSq();\n\t\t\t\tvar det = Math.abs( 1 - a01 * a01 );\n\t\t\t\tvar s0, s1, sqrDist, extDet;\n\n\t\t\t\tif ( det > 0 ) {\n\n\t\t\t\t\t// The ray and segment are not parallel.\n\n\t\t\t\t\ts0 = a01 * b1 - b0;\n\t\t\t\t\ts1 = a01 * b0 - b1;\n\t\t\t\t\textDet = segExtent * det;\n\n\t\t\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\t\t\tvar invDet = 1 / det;\n\t\t\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 5\n\n\t\t\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t\t\t// region 4\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t\t\t// region 3\n\n\t\t\t\t\t\t\ts0 = 0;\n\t\t\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// region 2\n\n\t\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Ray and segment are parallel.\n\n\t\t\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnRay ) {\n\n\t\t\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t\t\t}\n\n\t\t\t\tif ( optionalPointOnSegment ) {\n\n\t\t\t\t\toptionalPointOnSegment.copy( segDir ).multiplyScalar( s1 ).add( segCenter );\n\n\t\t\t\t}\n\n\t\t\t\treturn sqrDist;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectSphere: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function intersectSphere( sphere, optionalTarget ) {\n\n\t\t\t\tv1.subVectors( sphere.center, this.origin );\n\t\t\t\tvar tca = v1.dot( this.direction );\n\t\t\t\tvar d2 = v1.dot( v1 ) - tca * tca;\n\t\t\t\tvar radius2 = sphere.radius * sphere.radius;\n\n\t\t\t\tif ( d2 > radius2 ) return null;\n\n\t\t\t\tvar thc = Math.sqrt( radius2 - d2 );\n\n\t\t\t\t// t0 = first intersect point - entrance on front of sphere\n\t\t\t\tvar t0 = tca - thc;\n\n\t\t\t\t// t1 = second intersect point - exit point on back of sphere\n\t\t\t\tvar t1 = tca + thc;\n\n\t\t\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\t\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t\t\t// test to see if t0 is behind the ray:\n\t\t\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t\t\t// in order to always return an intersect point that is in front of the ray.\n\t\t\t\tif ( t0 < 0 ) return this.at( t1, optionalTarget );\n\n\t\t\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\t\t\treturn this.at( t0, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tintersectsSphere: function ( sphere ) {\n\n\t\t\treturn this.distanceToPoint( sphere.center ) <= sphere.radius;\n\n\t\t},\n\n\t\tdistanceToPlane: function ( plane ) {\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\t// line is coplanar, return origin\n\t\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\t\treturn 0;\n\n\t\t\t\t}\n\n\t\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t\t// Return if the ray never intersects the plane\n\n\t\t\treturn t >= 0 ? t :  null;\n\n\t\t},\n\n\t\tintersectPlane: function ( plane, optionalTarget ) {\n\n\t\t\tvar t = this.distanceToPlane( plane );\n\n\t\t\tif ( t === null ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\treturn this.at( t, optionalTarget );\n\n\t\t},\n\n\t\tintersectsPlane: function ( plane ) {\n\n\t\t\t// check if the ray lies on the plane first\n\n\t\t\tvar distToPoint = plane.distanceToPoint( this.origin );\n\n\t\t\tif ( distToPoint === 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\tvar denominator = plane.normal.dot( this.direction );\n\n\t\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\t\treturn false;\n\n\t\t},\n\n\t\tintersectBox: function ( box, optionalTarget ) {\n\n\t\t\tvar tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\t\tvar invdirx = 1 / this.direction.x,\n\t\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\t\tvar origin = this.origin;\n\n\t\t\tif ( invdirx >= 0 ) {\n\n\t\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t\t} else {\n\n\t\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t\t}\n\n\t\t\tif ( invdiry >= 0 ) {\n\n\t\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t\t} else {\n\n\t\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\t\t// These lines also handle the case where tmin or tmax is NaN\n\t\t\t// (result of 0 * Infinity). x !== x returns true if x is NaN\n\n\t\t\tif ( tymin > tmin || tmin !== tmin ) tmin = tymin;\n\n\t\t\tif ( tymax < tmax || tmax !== tmax ) tmax = tymax;\n\n\t\t\tif ( invdirz >= 0 ) {\n\n\t\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t\t} else {\n\n\t\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t\t}\n\n\t\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t\t//return point closest to the ray (positive side)\n\n\t\t\tif ( tmax < 0 ) return null;\n\n\t\t\treturn this.at( tmin >= 0 ? tmin : tmax, optionalTarget );\n\n\t\t},\n\n\t\tintersectsBox: ( function () {\n\n\t\t\tvar v = new Vector3();\n\n\t\t\treturn function intersectsBox( box ) {\n\n\t\t\t\treturn this.intersectBox( box, v ) !== null;\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tintersectTriangle: function () {\n\n\t\t\t// Compute the offset origin, edges, and normal.\n\t\t\tvar diff = new Vector3();\n\t\t\tvar edge1 = new Vector3();\n\t\t\tvar edge2 = new Vector3();\n\t\t\tvar normal = new Vector3();\n\n\t\t\treturn function intersectTriangle( a, b, c, backfaceCulling, optionalTarget ) {\n\n\t\t\t\t// from http://www.geometrictools.com/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t\t\tedge1.subVectors( b, a );\n\t\t\t\tedge2.subVectors( c, a );\n\t\t\t\tnormal.crossVectors( edge1, edge2 );\n\n\t\t\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t\t\t//   |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t\t\t//   |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t\t\t//   |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\t\t\tvar DdN = this.direction.dot( normal );\n\t\t\t\tvar sign;\n\n\t\t\t\tif ( DdN > 0 ) {\n\n\t\t\t\t\tif ( backfaceCulling ) return null;\n\t\t\t\t\tsign = 1;\n\n\t\t\t\t} else if ( DdN < 0 ) {\n\n\t\t\t\t\tsign = - 1;\n\t\t\t\t\tDdN = - DdN;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tdiff.subVectors( this.origin, a );\n\t\t\t\tvar DdQxE2 = sign * this.direction.dot( edge2.crossVectors( diff, edge2 ) );\n\n\t\t\t\t// b1 < 0, no intersection\n\t\t\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\tvar DdE1xQ = sign * this.direction.dot( edge1.cross( diff ) );\n\n\t\t\t\t// b2 < 0, no intersection\n\t\t\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// b1+b2 > 1, no intersection\n\t\t\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Line intersects triangle, check if ray does.\n\t\t\t\tvar QdN = - sign * diff.dot( normal );\n\n\t\t\t\t// t < 0, no intersection\n\t\t\t\tif ( QdN < 0 ) {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t\t// Ray intersects triangle.\n\t\t\t\treturn this.at( QdN / DdN, optionalTarget );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tapplyMatrix4: function ( matrix4 ) {\n\n\t\t\tthis.origin.applyMatrix4( matrix4 );\n\t\t\tthis.direction.transformDirection( matrix4 );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( ray ) {\n\n\t\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t */\n\n\tfunction Line3( start, end ) {\n\n\t\tthis.start = ( start !== undefined ) ? start : new Vector3();\n\t\tthis.end = ( end !== undefined ) ? end : new Vector3();\n\n\t}\n\n\tObject.assign( Line3.prototype, {\n\n\t\tset: function ( start, end ) {\n\n\t\t\tthis.start.copy( start );\n\t\t\tthis.end.copy( end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( line ) {\n\n\t\t\tthis.start.copy( line.start );\n\t\t\tthis.end.copy( line.end );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetCenter: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t\t},\n\n\t\tdelta: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.subVectors( this.end, this.start );\n\n\t\t},\n\n\t\tdistanceSq: function () {\n\n\t\t\treturn this.start.distanceToSquared( this.end );\n\n\t\t},\n\n\t\tdistance: function () {\n\n\t\t\treturn this.start.distanceTo( this.end );\n\n\t\t},\n\n\t\tat: function ( t, optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tclosestPointToPointParameter: function () {\n\n\t\t\tvar startP = new Vector3();\n\t\t\tvar startEnd = new Vector3();\n\n\t\t\treturn function closestPointToPointParameter( point, clampToLine ) {\n\n\t\t\t\tstartP.subVectors( point, this.start );\n\t\t\t\tstartEnd.subVectors( this.end, this.start );\n\n\t\t\t\tvar startEnd2 = startEnd.dot( startEnd );\n\t\t\t\tvar startEnd_startP = startEnd.dot( startP );\n\n\t\t\t\tvar t = startEnd_startP / startEnd2;\n\n\t\t\t\tif ( clampToLine ) {\n\n\t\t\t\t\tt = _Math.clamp( t, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t\treturn t;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tclosestPointToPoint: function ( point, clampToLine, optionalTarget ) {\n\n\t\t\tvar t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\treturn this.delta( result ).multiplyScalar( t ).add( this.start );\n\n\t\t},\n\n\t\tapplyMatrix4: function ( matrix ) {\n\n\t\t\tthis.start.applyMatrix4( matrix );\n\t\t\tthis.end.applyMatrix4( matrix );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tequals: function ( line ) {\n\n\t\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Triangle( a, b, c ) {\n\n\t\tthis.a = ( a !== undefined ) ? a : new Vector3();\n\t\tthis.b = ( b !== undefined ) ? b : new Vector3();\n\t\tthis.c = ( c !== undefined ) ? c : new Vector3();\n\n\t}\n\n\tObject.assign( Triangle, {\n\n\t\tnormal: function () {\n\n\t\t\tvar v0 = new Vector3();\n\n\t\t\treturn function normal( a, b, c, optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\tresult.subVectors( c, b );\n\t\t\t\tv0.subVectors( a, b );\n\t\t\t\tresult.cross( v0 );\n\n\t\t\t\tvar resultLengthSq = result.lengthSq();\n\t\t\t\tif ( resultLengthSq > 0 ) {\n\n\t\t\t\t\treturn result.multiplyScalar( 1 / Math.sqrt( resultLengthSq ) );\n\n\t\t\t\t}\n\n\t\t\t\treturn result.set( 0, 0, 0 );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\t// static/instance method to calculate barycentric coordinates\n\t\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\t\tbarycoordFromPoint: function () {\n\n\t\t\tvar v0 = new Vector3();\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function barycoordFromPoint( point, a, b, c, optionalTarget ) {\n\n\t\t\t\tv0.subVectors( c, a );\n\t\t\t\tv1.subVectors( b, a );\n\t\t\t\tv2.subVectors( point, a );\n\n\t\t\t\tvar dot00 = v0.dot( v0 );\n\t\t\t\tvar dot01 = v0.dot( v1 );\n\t\t\t\tvar dot02 = v0.dot( v2 );\n\t\t\t\tvar dot11 = v1.dot( v1 );\n\t\t\t\tvar dot12 = v1.dot( v2 );\n\n\t\t\t\tvar denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\n\t\t\t\t// collinear or singular triangle\n\t\t\t\tif ( denom === 0 ) {\n\n\t\t\t\t\t// arbitrary location outside of triangle?\n\t\t\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\t\t\treturn result.set( - 2, - 1, - 1 );\n\n\t\t\t\t}\n\n\t\t\t\tvar invDenom = 1 / denom;\n\t\t\t\tvar u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\t\t\tvar v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t\t\t// barycentric coordinates must always sum to 1\n\t\t\t\treturn result.set( 1 - u - v, v, u );\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tcontainsPoint: function () {\n\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function containsPoint( point, a, b, c ) {\n\n\t\t\t\tvar result = Triangle.barycoordFromPoint( point, a, b, c, v1 );\n\n\t\t\t\treturn ( result.x >= 0 ) && ( result.y >= 0 ) && ( ( result.x + result.y ) <= 1 );\n\n\t\t\t};\n\n\t\t}()\n\n\t} );\n\n\tObject.assign( Triangle.prototype, {\n\n\t\tset: function ( a, b, c ) {\n\n\t\t\tthis.a.copy( a );\n\t\t\tthis.b.copy( b );\n\t\t\tthis.c.copy( c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromPointsAndIndices: function ( points, i0, i1, i2 ) {\n\n\t\t\tthis.a.copy( points[ i0 ] );\n\t\t\tthis.b.copy( points[ i1 ] );\n\t\t\tthis.c.copy( points[ i2 ] );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( triangle ) {\n\n\t\t\tthis.a.copy( triangle.a );\n\t\t\tthis.b.copy( triangle.b );\n\t\t\tthis.c.copy( triangle.c );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tarea: function () {\n\n\t\t\tvar v0 = new Vector3();\n\t\t\tvar v1 = new Vector3();\n\n\t\t\treturn function area() {\n\n\t\t\t\tv0.subVectors( this.c, this.b );\n\t\t\t\tv1.subVectors( this.a, this.b );\n\n\t\t\t\treturn v0.cross( v1 ).length() * 0.5;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tmidpoint: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\treturn result.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t\t},\n\n\t\tnormal: function ( optionalTarget ) {\n\n\t\t\treturn Triangle.normal( this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tplane: function ( optionalTarget ) {\n\n\t\t\tvar result = optionalTarget || new Plane();\n\n\t\t\treturn result.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t\t},\n\n\t\tbarycoordFromPoint: function ( point, optionalTarget ) {\n\n\t\t\treturn Triangle.barycoordFromPoint( point, this.a, this.b, this.c, optionalTarget );\n\n\t\t},\n\n\t\tcontainsPoint: function ( point ) {\n\n\t\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t\t},\n\n\t\tclosestPointToPoint: function () {\n\n\t\t\tvar plane = new Plane();\n\t\t\tvar edgeList = [ new Line3(), new Line3(), new Line3() ];\n\t\t\tvar projectedPoint = new Vector3();\n\t\t\tvar closestPoint = new Vector3();\n\n\t\t\treturn function closestPointToPoint( point, optionalTarget ) {\n\n\t\t\t\tvar result = optionalTarget || new Vector3();\n\t\t\t\tvar minDistance = Infinity;\n\n\t\t\t\t// project the point onto the plane of the triangle\n\n\t\t\t\tplane.setFromCoplanarPoints( this.a, this.b, this.c );\n\t\t\t\tplane.projectPoint( point, projectedPoint );\n\n\t\t\t\t// check if the projection lies within the triangle\n\n\t\t\t\tif( this.containsPoint( projectedPoint ) === true ) {\n\n\t\t\t\t\t// if so, this is the closest point\n\n\t\t\t\t\tresult.copy( projectedPoint );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// if not, the point falls outside the triangle. the result is the closest point to the triangle's edges or vertices\n\n\t\t\t\t\tedgeList[ 0 ].set( this.a, this.b );\n\t\t\t\t\tedgeList[ 1 ].set( this.b, this.c );\n\t\t\t\t\tedgeList[ 2 ].set( this.c, this.a );\n\n\t\t\t\t\tfor( var i = 0; i < edgeList.length; i ++ ) {\n\n\t\t\t\t\t\tedgeList[ i ].closestPointToPoint( projectedPoint, true, closestPoint );\n\n\t\t\t\t\t\tvar distance = projectedPoint.distanceToSquared( closestPoint );\n\n\t\t\t\t\t\tif( distance < minDistance ) {\n\n\t\t\t\t\t\t\tminDistance = distance;\n\n\t\t\t\t\t\t\tresult.copy( closestPoint );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t}(),\n\n\t\tequals: function ( triangle ) {\n\n\t\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author jonobr1 / http://jonobr1.com/\n\t */\n\n\tfunction Mesh( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new MeshBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t\tthis.drawMode = TrianglesDrawMode;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tMesh.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Mesh,\n\n\t\tisMesh: true,\n\n\t\tsetDrawMode: function ( value ) {\n\n\t\t\tthis.drawMode = value;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.drawMode = source.drawMode;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tupdateMorphTargets: function () {\n\n\t\t\tvar geometry = this.geometry;\n\t\t\tvar m, ml, name;\n\n\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\tvar morphAttributes = geometry.morphAttributes;\n\t\t\t\tvar keys = Object.keys( morphAttributes );\n\n\t\t\t\tif ( keys.length > 0 ) {\n\n\t\t\t\t\tvar morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\t\t\tfor ( m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\t\tname = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar morphTargets = geometry.morphTargets;\n\n\t\t\t\tif ( morphTargets !== undefined && morphTargets.length > 0 ) {\n\n\t\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\t\tfor ( m = 0, ml = morphTargets.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\tname = morphTargets[ m ].name || String( m );\n\n\t\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\tvar vA = new Vector3();\n\t\t\tvar vB = new Vector3();\n\t\t\tvar vC = new Vector3();\n\n\t\t\tvar tempA = new Vector3();\n\t\t\tvar tempB = new Vector3();\n\t\t\tvar tempC = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tvar barycoord = new Vector3();\n\n\t\t\tvar intersectionPoint = new Vector3();\n\t\t\tvar intersectionPointWorld = new Vector3();\n\n\t\t\tfunction uvIntersection( point, p1, p2, p3, uv1, uv2, uv3 ) {\n\n\t\t\t\tTriangle.barycoordFromPoint( point, p1, p2, p3, barycoord );\n\n\t\t\t\tuv1.multiplyScalar( barycoord.x );\n\t\t\t\tuv2.multiplyScalar( barycoord.y );\n\t\t\t\tuv3.multiplyScalar( barycoord.z );\n\n\t\t\t\tuv1.add( uv2 ).add( uv3 );\n\n\t\t\t\treturn uv1.clone();\n\n\t\t\t}\n\n\t\t\tfunction checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\t\t\t\tvar intersect;\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tintersect = ray.intersectTriangle( pA, pB, pC, material.side !== DoubleSide, point );\n\n\t\t\t\t}\n\n\t\t\t\tif ( intersect === null ) return null;\n\n\t\t\t\tintersectionPointWorld.copy( point );\n\t\t\t\tintersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectionPointWorld );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\t\t\t\treturn {\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\tpoint: intersectionPointWorld.clone(),\n\t\t\t\t\tobject: object\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tfunction checkBufferGeometryIntersection( object, raycaster, ray, position, uv, a, b, c ) {\n\n\t\t\t\tvA.fromBufferAttribute( position, a );\n\t\t\t\tvB.fromBufferAttribute( position, b );\n\t\t\t\tvC.fromBufferAttribute( position, c );\n\n\t\t\t\tvar intersection = checkIntersection( object, object.material, raycaster, ray, vA, vB, vC, intersectionPoint );\n\n\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\tif ( uv ) {\n\n\t\t\t\t\t\tuvA.fromBufferAttribute( uv, a );\n\t\t\t\t\t\tuvB.fromBufferAttribute( uv, b );\n\t\t\t\t\t\tuvC.fromBufferAttribute( uv, c );\n\n\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, vA, vB, vC, uvA, uvB, uvC );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tintersection.face = new Face3( a, b, c, Triangle.normal( vA, vB, vC ) );\n\t\t\t\t\tintersection.faceIndex = a;\n\n\t\t\t\t}\n\n\t\t\t\treturn intersection;\n\n\t\t\t}\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar material = this.material;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\tif ( material === undefined ) return;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\t// Check boundingBox before continuing\n\n\t\t\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\t\t\tif ( ray.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t\t\t}\n\n\t\t\t\tvar intersection;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar a, b, c;\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar position = geometry.attributes.position;\n\t\t\t\t\tvar uv = geometry.attributes.uv;\n\t\t\t\t\tvar i, l;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\t// indexed buffer geometry\n\n\t\t\t\t\t\tfor ( i = 0, l = index.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\ta = index.getX( i );\n\t\t\t\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indices buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// non-indexed buffer geometry\n\n\t\t\t\t\t\tfor ( i = 0, l = position.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\ta = i;\n\t\t\t\t\t\t\tb = i + 1;\n\t\t\t\t\t\t\tc = i + 2;\n\n\t\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, raycaster, ray, position, uv, a, b, c );\n\n\t\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\t\tintersection.index = a; // triangle number in positions buffer semantics\n\t\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tvar fvA, fvB, fvC;\n\t\t\t\t\tvar isMultiMaterial = Array.isArray( material );\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar uvs;\n\n\t\t\t\t\tvar faceVertexUvs = geometry.faceVertexUvs[ 0 ];\n\t\t\t\t\tif ( faceVertexUvs.length > 0 ) uvs = faceVertexUvs;\n\n\t\t\t\t\tfor ( var f = 0, fl = faces.length; f < fl; f ++ ) {\n\n\t\t\t\t\t\tvar face = faces[ f ];\n\t\t\t\t\t\tvar faceMaterial = isMultiMaterial ? material[ face.materialIndex ] : material;\n\n\t\t\t\t\t\tif ( faceMaterial === undefined ) continue;\n\n\t\t\t\t\t\tfvA = vertices[ face.a ];\n\t\t\t\t\t\tfvB = vertices[ face.b ];\n\t\t\t\t\t\tfvC = vertices[ face.c ];\n\n\t\t\t\t\t\tif ( faceMaterial.morphTargets === true ) {\n\n\t\t\t\t\t\t\tvar morphTargets = geometry.morphTargets;\n\t\t\t\t\t\t\tvar morphInfluences = this.morphTargetInfluences;\n\n\t\t\t\t\t\t\tvA.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvB.set( 0, 0, 0 );\n\t\t\t\t\t\t\tvC.set( 0, 0, 0 );\n\n\t\t\t\t\t\t\tfor ( var t = 0, tl = morphTargets.length; t < tl; t ++ ) {\n\n\t\t\t\t\t\t\t\tvar influence = morphInfluences[ t ];\n\n\t\t\t\t\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t\t\t\t\tvar targets = morphTargets[ t ].vertices;\n\n\t\t\t\t\t\t\t\tvA.addScaledVector( tempA.subVectors( targets[ face.a ], fvA ), influence );\n\t\t\t\t\t\t\t\tvB.addScaledVector( tempB.subVectors( targets[ face.b ], fvB ), influence );\n\t\t\t\t\t\t\t\tvC.addScaledVector( tempC.subVectors( targets[ face.c ], fvC ), influence );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvA.add( fvA );\n\t\t\t\t\t\t\tvB.add( fvB );\n\t\t\t\t\t\t\tvC.add( fvC );\n\n\t\t\t\t\t\t\tfvA = vA;\n\t\t\t\t\t\t\tfvB = vB;\n\t\t\t\t\t\t\tfvC = vC;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tintersection = checkIntersection( this, faceMaterial, raycaster, ray, fvA, fvB, fvC, intersectionPoint );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tif ( uvs && uvs[ f ] ) {\n\n\t\t\t\t\t\t\t\tvar uvs_f = uvs[ f ];\n\t\t\t\t\t\t\t\tuvA.copy( uvs_f[ 0 ] );\n\t\t\t\t\t\t\t\tuvB.copy( uvs_f[ 1 ] );\n\t\t\t\t\t\t\t\tuvC.copy( uvs_f[ 2 ] );\n\n\t\t\t\t\t\t\t\tintersection.uv = uvIntersection( intersectionPoint, fvA, fvB, fvC, uvA, uvB, uvC );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tintersection.face = face;\n\t\t\t\t\t\t\tintersection.faceIndex = f;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLBackground( renderer, state, geometries, premultipliedAlpha ) {\n\n\t\tvar clearColor = new Color( 0x000000 );\n\t\tvar clearAlpha = 0;\n\n\t\tvar planeCamera, planeMesh;\n\t\tvar boxMesh;\n\n\t\tfunction render( renderList, scene, camera, forceClear ) {\n\n\t\t\tvar background = scene.background;\n\n\t\t\tif ( background === null ) {\n\n\t\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t\t} else if ( background && background.isColor ) {\n\n\t\t\t\tsetClear( background, 1 );\n\t\t\t\tforceClear = true;\n\n\t\t\t}\n\n\t\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t\t}\n\n\t\t\tif ( background && background.isCubeTexture ) {\n\n\t\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\t\tnew BoxBufferGeometry( 1, 1, 1 ),\n\t\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\t\tuniforms: ShaderLib.cube.uniforms,\n\t\t\t\t\t\t\tvertexShader: ShaderLib.cube.vertexShader,\n\t\t\t\t\t\t\tfragmentShader: ShaderLib.cube.fragmentShader,\n\t\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\t\tdepthTest: true,\n\t\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\t\tpolygonOffset: true,\n\t\t\t\t\t\t\tfog: false\n\t\t\t\t\t\t} )\n\t\t\t\t\t);\n\n\t\t\t\t\tboxMesh.geometry.removeAttribute( 'normal' );\n\t\t\t\t\tboxMesh.geometry.removeAttribute( 'uv' );\n\n\t\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\t\tvar scale = camera.far;\n\n\t\t\t\t\t\tthis.matrixWorld.makeScale( scale, scale, scale );\n\t\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t\t\tthis.material.polygonOffsetUnits = scale * 10;\n\n\t\t\t\t\t};\n\n\t\t\t\t\tgeometries.update( boxMesh.geometry );\n\n\t\t\t\t}\n\n\t\t\t\tboxMesh.material.uniforms.tCube.value = background;\n\n\t\t\t\trenderList.push( boxMesh, boxMesh.geometry, boxMesh.material, 0, null );\n\n\t\t\t} else if ( background && background.isTexture ) {\n\n\t\t\t\tif ( planeCamera === undefined ) {\n\n\t\t\t\t\tplaneCamera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n\t\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\t\tnew PlaneBufferGeometry( 2, 2 ),\n\t\t\t\t\t\tnew MeshBasicMaterial( { depthTest: false, depthWrite: false, fog: false } )\n\t\t\t\t\t);\n\n\t\t\t\t\tgeometries.update( planeMesh.geometry );\n\n\t\t\t\t}\n\n\t\t\t\tplaneMesh.material.map = background;\n\n\t\t\t\t// TODO Push this to renderList\n\n\t\t\t\trenderer.renderBufferDirect( planeCamera, null, planeMesh.geometry, planeMesh.material, planeMesh, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setClear( color, alpha ) {\n\n\t\t\tstate.buffers.color.setClear( color.r, color.g, color.b, alpha, premultipliedAlpha );\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tgetClearColor: function () {\n\n\t\t\t\treturn clearColor;\n\n\t\t\t},\n\t\t\tsetClearColor: function ( color, alpha ) {\n\n\t\t\t\tclearColor.set( color );\n\t\t\t\tclearAlpha = alpha !== undefined ? alpha : 1;\n\t\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t\t},\n\t\t\tgetClearAlpha: function () {\n\n\t\t\t\treturn clearAlpha;\n\n\t\t\t},\n\t\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\t\tclearAlpha = alpha;\n\t\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t\t},\n\t\t\trender: render\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction painterSortStable( a, b ) {\n\n\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\treturn a.renderOrder - b.renderOrder;\n\n\t\t} else if ( a.program && b.program && a.program !== b.program ) {\n\n\t\t\treturn a.program.id - b.program.id;\n\n\t\t} else if ( a.material.id !== b.material.id ) {\n\n\t\t\treturn a.material.id - b.material.id;\n\n\t\t} else if ( a.z !== b.z ) {\n\n\t\t\treturn a.z - b.z;\n\n\t\t} else {\n\n\t\t\treturn a.id - b.id;\n\n\t\t}\n\n\t}\n\n\tfunction reversePainterSortStable( a, b ) {\n\n\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\treturn a.renderOrder - b.renderOrder;\n\n\t\t} if ( a.z !== b.z ) {\n\n\t\t\treturn b.z - a.z;\n\n\t\t} else {\n\n\t\t\treturn a.id - b.id;\n\n\t\t}\n\n\t}\n\n\tfunction WebGLRenderList() {\n\n\t\tvar renderItems = [];\n\t\tvar renderItemsIndex = 0;\n\n\t\tvar opaque = [];\n\t\tvar transparent = [];\n\n\t\tfunction init() {\n\n\t\t\trenderItemsIndex = 0;\n\n\t\t\topaque.length = 0;\n\t\t\ttransparent.length = 0;\n\n\t\t}\n\n\t\tfunction push( object, geometry, material, z, group ) {\n\n\t\t\tvar renderItem = renderItems[ renderItemsIndex ];\n\n\t\t\tif ( renderItem === undefined ) {\n\n\t\t\t\trenderItem = {\n\t\t\t\t\tid: object.id,\n\t\t\t\t\tobject: object,\n\t\t\t\t\tgeometry: geometry,\n\t\t\t\t\tmaterial: material,\n\t\t\t\t\tprogram: material.program,\n\t\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\t\tz: z,\n\t\t\t\t\tgroup: group\n\t\t\t\t};\n\n\t\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t\t} else {\n\n\t\t\t\trenderItem.id = object.id;\n\t\t\t\trenderItem.object = object;\n\t\t\t\trenderItem.geometry = geometry;\n\t\t\t\trenderItem.material = material;\n\t\t\t\trenderItem.program = material.program;\n\t\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\t\trenderItem.z = z;\n\t\t\t\trenderItem.group = group;\n\n\t\t\t}\n\n\t\t\t( material.transparent === true ? transparent : opaque ).push( renderItem );\n\n\t\t\trenderItemsIndex ++;\n\n\t\t}\n\n\t\tfunction sort() {\n\n\t\t\tif ( opaque.length > 1 ) opaque.sort( painterSortStable );\n\t\t\tif ( transparent.length > 1 ) transparent.sort( reversePainterSortStable );\n\n\t\t}\n\n\t\treturn {\n\t\t\topaque: opaque,\n\t\t\ttransparent: transparent,\n\n\t\t\tinit: init,\n\t\t\tpush: push,\n\n\t\t\tsort: sort\n\t\t};\n\n\t}\n\n\tfunction WebGLRenderLists() {\n\n\t\tvar lists = {};\n\n\t\tfunction get( scene, camera ) {\n\n\t\t\tvar hash = scene.id + ',' + camera.id;\n\t\t\tvar list = lists[ hash ];\n\n\t\t\tif ( list === undefined ) {\n\n\t\t\t\t// console.log( 'THREE.WebGLRenderLists:', hash );\n\n\t\t\t\tlist = new WebGLRenderList();\n\t\t\t\tlists[ hash ] = list;\n\n\t\t\t}\n\n\t\t\treturn list;\n\n\t\t}\n\n\t\tfunction dispose() {\n\n\t\t\tlists = {};\n\n\t\t}\n\n\t\treturn {\n\t\t\tget: get,\n\t\t\tdispose: dispose\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction absNumericalSort( a, b ) {\n\n\t\treturn Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );\n\n\t}\n\n\tfunction WebGLMorphtargets( gl ) {\n\n\t\tvar influencesList = {};\n\t\tvar morphInfluences = new Float32Array( 8 );\n\n\t\tfunction update( object, geometry, material, program ) {\n\n\t\t\tvar objectInfluences = object.morphTargetInfluences;\n\n\t\t\tvar length = objectInfluences.length;\n\n\t\t\tvar influences = influencesList[ geometry.id ];\n\n\t\t\tif ( influences === undefined ) {\n\n\t\t\t\t// initialise list\n\n\t\t\t\tinfluences = [];\n\n\t\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tinfluences[ i ] = [ i, 0 ];\n\n\t\t\t\t}\n\n\t\t\t\tinfluencesList[ geometry.id ] = influences;\n\n\t\t\t}\n\n\t\t\tvar morphTargets = material.morphTargets && geometry.morphAttributes.position;\n\t\t\tvar morphNormals = material.morphNormals && geometry.morphAttributes.normal;\n\n\t\t\t// Remove current morphAttributes\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tvar influence = influences[ i ];\n\n\t\t\t\tif ( influence[ 1 ] !== 0 ) {\n\n\t\t\t\t\tif ( morphTargets ) geometry.removeAttribute( 'morphTarget' + i );\n\t\t\t\t\tif ( morphNormals ) geometry.removeAttribute( 'morphNormal' + i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Collect influences\n\n\t\t\tfor ( var i = 0; i < length; i ++ ) {\n\n\t\t\t\tvar influence = influences[ i ];\n\n\t\t\t\tinfluence[ 0 ] = i;\n\t\t\t\tinfluence[ 1 ] = objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tinfluences.sort( absNumericalSort );\n\n\t\t\t// Add morphAttributes\n\n\t\t\tfor ( var i = 0; i < 8; i ++ ) {\n\n\t\t\t\tvar influence = influences[ i ];\n\n\t\t\t\tif ( influence ) {\n\n\t\t\t\t\tvar index = influence[ 0 ];\n\t\t\t\t\tvar value = influence[ 1 ];\n\n\t\t\t\t\tif ( value ) {\n\n\t\t\t\t\t\tif ( morphTargets ) geometry.addAttribute( 'morphTarget' + i, morphTargets[ index ] );\n\t\t\t\t\t\tif ( morphNormals ) geometry.addAttribute( 'morphNormal' + i, morphNormals[ index ] );\n\n\t\t\t\t\t\tmorphInfluences[ i ] = value;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tmorphInfluences[ i ] = 0;\n\n\t\t\t}\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences );\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tupdate: update\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLIndexedBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tvar type, bytesPerElement;\n\n\t\tfunction setIndex( value ) {\n\n\t\t\ttype = value.type;\n\t\t\tbytesPerElement = value.bytesPerElement;\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\t\t\telse if ( mode === gl.POINTS ) infoRender.points += count;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry, start, count ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\textension.drawElementsInstancedANGLE( mode, count, type, start * bytesPerElement, geometry.maxInstancedCount );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\t\t\telse if ( mode === gl.POINTS ) infoRender.points += geometry.maxInstancedCount * count;\n\n\t\t}\n\n\t\t//\n\n\t\tthis.setMode = setMode;\n\t\tthis.setIndex = setIndex;\n\t\tthis.render = render;\n\t\tthis.renderInstances = renderInstances;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLBufferRenderer( gl, extensions, infoRender ) {\n\n\t\tvar mode;\n\n\t\tfunction setMode( value ) {\n\n\t\t\tmode = value;\n\n\t\t}\n\n\t\tfunction render( start, count ) {\n\n\t\t\tgl.drawArrays( mode, start, count );\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += count / 3;\n\t\t\telse if ( mode === gl.POINTS ) infoRender.points += count;\n\n\t\t}\n\n\t\tfunction renderInstances( geometry, start, count ) {\n\n\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar position = geometry.attributes.position;\n\n\t\t\tif ( position.isInterleavedBufferAttribute ) {\n\n\t\t\t\tcount = position.data.count;\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, 0, count, geometry.maxInstancedCount );\n\n\t\t\t} else {\n\n\t\t\t\textension.drawArraysInstancedANGLE( mode, start, count, geometry.maxInstancedCount );\n\n\t\t\t}\n\n\t\t\tinfoRender.calls ++;\n\t\t\tinfoRender.vertices += count * geometry.maxInstancedCount;\n\n\t\t\tif ( mode === gl.TRIANGLES ) infoRender.faces += geometry.maxInstancedCount * count / 3;\n\t\t\telse if ( mode === gl.POINTS ) infoRender.points += geometry.maxInstancedCount * count;\n\n\t\t}\n\n\t\t//\n\n\t\tthis.setMode = setMode;\n\t\tthis.render = render;\n\t\tthis.renderInstances = renderInstances;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLGeometries( gl, attributes, infoMemory ) {\n\n\t\tvar geometries = {};\n\t\tvar wireframeAttributes = {};\n\n\t\tfunction onGeometryDispose( event ) {\n\n\t\t\tvar geometry = event.target;\n\t\t\tvar buffergeometry = geometries[ geometry.id ];\n\n\t\t\tif ( buffergeometry.index !== null ) {\n\n\t\t\t\tattributes.remove( buffergeometry.index );\n\n\t\t\t}\n\n\t\t\tfor ( var name in buffergeometry.attributes ) {\n\n\t\t\t\tattributes.remove( buffergeometry.attributes[ name ] );\n\n\t\t\t}\n\n\t\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\t\tdelete geometries[ geometry.id ];\n\n\t\t\t// TODO Remove duplicate code\n\n\t\t\tvar attribute = wireframeAttributes[ geometry.id ];\n\n\t\t\tif ( attribute ) {\n\n\t\t\t\tattributes.remove( attribute );\n\t\t\t\tdelete wireframeAttributes[ geometry.id ];\n\n\t\t\t}\n\n\t\t\tattribute = wireframeAttributes[ buffergeometry.id ];\n\n\t\t\tif ( attribute ) {\n\n\t\t\t\tattributes.remove( attribute );\n\t\t\t\tdelete wireframeAttributes[ buffergeometry.id ];\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tinfoMemory.geometries --;\n\n\t\t}\n\n\t\tfunction get( object, geometry ) {\n\n\t\t\tvar buffergeometry = geometries[ geometry.id ];\n\n\t\t\tif ( buffergeometry ) return buffergeometry;\n\n\t\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\tbuffergeometry = geometry;\n\n\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\tif ( geometry._bufferGeometry === undefined ) {\n\n\t\t\t\t\tgeometry._bufferGeometry = new BufferGeometry().setFromObject( object );\n\n\t\t\t\t}\n\n\t\t\t\tbuffergeometry = geometry._bufferGeometry;\n\n\t\t\t}\n\n\t\t\tgeometries[ geometry.id ] = buffergeometry;\n\n\t\t\tinfoMemory.geometries ++;\n\n\t\t\treturn buffergeometry;\n\n\t\t}\n\n\t\tfunction update( geometry ) {\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar geometryAttributes = geometry.attributes;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tattributes.update( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\tfor ( var name in geometryAttributes ) {\n\n\t\t\t\tattributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t\t}\n\n\t\t\t// morph targets\n\n\t\t\tvar morphAttributes = geometry.morphAttributes;\n\n\t\t\tfor ( var name in morphAttributes ) {\n\n\t\t\t\tvar array = morphAttributes[ name ];\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\t\tattributes.update( array[ i ], gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getWireframeAttribute( geometry ) {\n\n\t\t\tvar attribute = wireframeAttributes[ geometry.id ];\n\n\t\t\tif ( attribute ) return attribute;\n\n\t\t\tvar indices = [];\n\n\t\t\tvar geometryIndex = geometry.index;\n\t\t\tvar geometryAttributes = geometry.attributes;\n\n\t\t\t// console.time( 'wireframe' );\n\n\t\t\tif ( geometryIndex !== null ) {\n\n\t\t\t\tvar array = geometryIndex.array;\n\n\t\t\t\tfor ( var i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = array[ i + 0 ];\n\t\t\t\t\tvar b = array[ i + 1 ];\n\t\t\t\t\tvar c = array[ i + 2 ];\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar array = geometryAttributes.position.array;\n\n\t\t\t\tfor ( var i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\t\tvar a = i + 0;\n\t\t\t\t\tvar b = i + 1;\n\t\t\t\t\tvar c = i + 2;\n\n\t\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// console.timeEnd( 'wireframe' );\n\n\t\t\tattribute = new ( arrayMax( indices ) > 65535 ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\n\t\t\tattributes.update( attribute, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t\twireframeAttributes[ geometry.id ] = attribute;\n\n\t\t\treturn attribute;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tget: get,\n\t\t\tupdate: update,\n\n\t\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction UniformsCache() {\n\n\t\tvar lights = {};\n\n\t\treturn {\n\n\t\t\tget: function ( light ) {\n\n\t\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\t\treturn lights[ light.id ];\n\n\t\t\t\t}\n\n\t\t\t\tvar uniforms;\n\n\t\t\t\tswitch ( light.type ) {\n\n\t\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\t\tdecay: 0,\n\n\t\t\t\t\t\t\tshadow: false,\n\t\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\t\tuniforms = {\n\t\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\t\treturn uniforms;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction WebGLLights() {\n\n\t\tvar cache = new UniformsCache();\n\n\t\tvar state = {\n\n\t\t\thash: '',\n\n\t\t\tambient: [ 0, 0, 0 ],\n\t\t\tdirectional: [],\n\t\t\tdirectionalShadowMap: [],\n\t\t\tdirectionalShadowMatrix: [],\n\t\t\tspot: [],\n\t\t\tspotShadowMap: [],\n\t\t\tspotShadowMatrix: [],\n\t\t\trectArea: [],\n\t\t\tpoint: [],\n\t\t\tpointShadowMap: [],\n\t\t\tpointShadowMatrix: [],\n\t\t\themi: []\n\n\t\t};\n\n\t\tvar vector3 = new Vector3();\n\t\tvar matrix4 = new Matrix4();\n\t\tvar matrix42 = new Matrix4();\n\n\t\tfunction setup( lights, shadows, camera ) {\n\n\t\t\tvar r = 0, g = 0, b = 0;\n\n\t\t\tvar directionalLength = 0;\n\t\t\tvar pointLength = 0;\n\t\t\tvar spotLength = 0;\n\t\t\tvar rectAreaLength = 0;\n\t\t\tvar hemiLength = 0;\n\n\t\t\tvar viewMatrix = camera.matrixWorldInverse;\n\n\t\t\tfor ( var i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\t\tvar light = lights[ i ];\n\n\t\t\t\tvar color = light.color;\n\t\t\t\tvar intensity = light.intensity;\n\t\t\t\tvar distance = light.distance;\n\n\t\t\t\tvar shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\t\tr += color.r * intensity;\n\t\t\t\t\tg += color.g * intensity;\n\t\t\t\t\tb += color.b * intensity;\n\n\t\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\t\tvar uniforms = cache.get( light );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\t\t\tuniforms.shadowBias = shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\t\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\t\tdirectionalLength ++;\n\n\t\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\t\tvar uniforms = cache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\t\t\tuniforms.shadowBias = shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\t\t\t\t\tstate.spotShadowMatrix[ spotLength ] = light.shadow.matrix;\n\t\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\t\tspotLength ++;\n\n\t\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\t\tvar uniforms = cache.get( light );\n\n\t\t\t\t\t// (a) intensity controls irradiance of entire light\n\t\t\t\t\tuniforms.color\n\t\t\t\t\t\t.copy( color )\n\t\t\t\t\t\t.multiplyScalar( intensity / ( light.width * light.height ) );\n\n\t\t\t\t\t// (b) intensity controls the radiance per light area\n\t\t\t\t\t// uniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\t\tmatrix42.identity();\n\t\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\t\tuniforms.halfWidth.set( light.width * 0.5,                0.0, 0.0 );\n\t\t\t\t\tuniforms.halfHeight.set(              0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\t\t// TODO (abelnation): RectAreaLight distance?\n\t\t\t\t\t// uniforms.distance = distance;\n\n\t\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\t\trectAreaLength ++;\n\n\t\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\t\tvar uniforms = cache.get( light );\n\n\t\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\t\tuniforms.decay = ( light.distance === 0 ) ? 0.0 : light.decay;\n\n\t\t\t\t\tuniforms.shadow = light.castShadow;\n\n\t\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\t\tvar shadow = light.shadow;\n\n\t\t\t\t\t\tuniforms.shadowBias = shadow.bias;\n\t\t\t\t\t\tuniforms.shadowRadius = shadow.radius;\n\t\t\t\t\t\tuniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\t\tuniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\t\tuniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\t\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\t\tpointLength ++;\n\n\t\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\t\tvar uniforms = cache.get( light );\n\n\t\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\t\t\t\t\tuniforms.direction.normalize();\n\n\t\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\t\themiLength ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.ambient[ 0 ] = r;\n\t\t\tstate.ambient[ 1 ] = g;\n\t\t\tstate.ambient[ 2 ] = b;\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\t// TODO (sam-g-steel) why aren't we using join\n\t\t\tstate.hash = directionalLength + ',' + pointLength + ',' + spotLength + ',' + rectAreaLength + ',' + hemiLength + ',' + shadows.length;\n\n\t\t}\n\n\t\treturn {\n\t\t\tsetup: setup,\n\t\t\tstate: state\n\t\t}\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLObjects( geometries, infoRender ) {\n\n\t\tvar updateList = {};\n\n\t\tfunction update( object ) {\n\n\t\t\tvar frame = infoRender.frame;\n\n\t\t\tvar geometry = object.geometry;\n\t\t\tvar buffergeometry = geometries.get( object, geometry );\n\n\t\t\t// Update once per frame\n\n\t\t\tif ( updateList[ buffergeometry.id ] !== frame ) {\n\n\t\t\t\tif ( geometry.isGeometry ) {\n\n\t\t\t\t\tbuffergeometry.updateFromObject( object );\n\n\t\t\t\t}\n\n\t\t\t\tgeometries.update( buffergeometry );\n\n\t\t\t\tupdateList[ buffergeometry.id ] = frame;\n\n\t\t\t}\n\n\t\t\treturn buffergeometry;\n\n\t\t}\n\n\t\tfunction clear() {\n\n\t\t\tupdateList = {};\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tupdate: update,\n\t\t\tclear: clear\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction addLineNumbers( string ) {\n\n\t\tvar lines = string.split( '\\n' );\n\n\t\tfor ( var i = 0; i < lines.length; i ++ ) {\n\n\t\t\tlines[ i ] = ( i + 1 ) + ': ' + lines[ i ];\n\n\t\t}\n\n\t\treturn lines.join( '\\n' );\n\n\t}\n\n\tfunction WebGLShader( gl, type, string ) {\n\n\t\tvar shader = gl.createShader( type );\n\n\t\tgl.shaderSource( shader, string );\n\t\tgl.compileShader( shader );\n\n\t\tif ( gl.getShaderParameter( shader, gl.COMPILE_STATUS ) === false ) {\n\n\t\t\tconsole.error( 'THREE.WebGLShader: Shader couldn\\'t compile.' );\n\n\t\t}\n\n\t\tif ( gl.getShaderInfoLog( shader ) !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLShader: gl.getShaderInfoLog()', type === gl.VERTEX_SHADER ? 'vertex' : 'fragment', gl.getShaderInfoLog( shader ), addLineNumbers( string ) );\n\n\t\t}\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( type, gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\treturn shader;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar programIdCount = 0;\n\n\tfunction getEncodingComponents( encoding ) {\n\n\t\tswitch ( encoding ) {\n\n\t\t\tcase LinearEncoding:\n\t\t\t\treturn [ 'Linear','( value )' ];\n\t\t\tcase sRGBEncoding:\n\t\t\t\treturn [ 'sRGB','( value )' ];\n\t\t\tcase RGBEEncoding:\n\t\t\t\treturn [ 'RGBE','( value )' ];\n\t\t\tcase RGBM7Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 7.0 )' ];\n\t\t\tcase RGBM16Encoding:\n\t\t\t\treturn [ 'RGBM','( value, 16.0 )' ];\n\t\t\tcase RGBDEncoding:\n\t\t\t\treturn [ 'RGBD','( value, 256.0 )' ];\n\t\t\tcase GammaEncoding:\n\t\t\t\treturn [ 'Gamma','( value, float( GAMMA_FACTOR ) )' ];\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported encoding: ' + encoding );\n\n\t\t}\n\n\t}\n\n\tfunction getTexelDecodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return \" + components[ 0 ] + \"ToLinear\" + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\t\tvar components = getEncodingComponents( encoding );\n\t\treturn \"vec4 \" + functionName + \"( vec4 value ) { return LinearTo\" + components[ 0 ] + components[ 1 ] + \"; }\";\n\n\t}\n\n\tfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\t\tvar toneMappingName;\n\n\t\tswitch ( toneMapping ) {\n\n\t\t\tcase LinearToneMapping:\n\t\t\t\ttoneMappingName = \"Linear\";\n\t\t\t\tbreak;\n\n\t\t\tcase ReinhardToneMapping:\n\t\t\t\ttoneMappingName = \"Reinhard\";\n\t\t\t\tbreak;\n\n\t\t\tcase Uncharted2ToneMapping:\n\t\t\t\ttoneMappingName = \"Uncharted2\";\n\t\t\t\tbreak;\n\n\t\t\tcase CineonToneMapping:\n\t\t\t\ttoneMappingName = \"OptimizedCineon\";\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'unsupported toneMapping: ' + toneMapping );\n\n\t\t}\n\n\t\treturn \"vec3 \" + functionName + \"( vec3 color ) { return \" + toneMappingName + \"ToneMapping( color ); }\";\n\n\t}\n\n\tfunction generateExtensions( extensions, parameters, rendererExtensions ) {\n\n\t\textensions = extensions || {};\n\n\t\tvar chunks = [\n\t\t\t( extensions.derivatives || parameters.envMapCubeUV || parameters.bumpMap || parameters.normalMap || parameters.flatShading ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t\t( extensions.fragDepth || parameters.logarithmicDepthBuffer ) && rendererExtensions.get( 'EXT_frag_depth' ) ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t\t( extensions.drawBuffers ) && rendererExtensions.get( 'WEBGL_draw_buffers' ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t\t( extensions.shaderTextureLOD || parameters.envMap ) && rendererExtensions.get( 'EXT_shader_texture_lod' ) ? '#extension GL_EXT_shader_texture_lod : enable' : ''\n\t\t];\n\n\t\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tfunction generateDefines( defines ) {\n\n\t\tvar chunks = [];\n\n\t\tfor ( var name in defines ) {\n\n\t\t\tvar value = defines[ name ];\n\n\t\t\tif ( value === false ) continue;\n\n\t\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t\t}\n\n\t\treturn chunks.join( '\\n' );\n\n\t}\n\n\tfunction fetchAttributeLocations( gl, program, identifiers ) {\n\n\t\tvar attributes = {};\n\n\t\tvar n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\t\tfor ( var i = 0; i < n; i ++ ) {\n\n\t\t\tvar info = gl.getActiveAttrib( program, i );\n\t\t\tvar name = info.name;\n\n\t\t\t// console.log(\"THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:\", name, i );\n\n\t\t\tattributes[ name ] = gl.getAttribLocation( program, name );\n\n\t\t}\n\n\t\treturn attributes;\n\n\t}\n\n\tfunction filterEmptyLine( string ) {\n\n\t\treturn string !== '';\n\n\t}\n\n\tfunction replaceLightNums( string, parameters ) {\n\n\t\treturn string\n\t\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights );\n\n\t}\n\n\tfunction parseIncludes( string ) {\n\n\t\tvar pattern = /^[ \\t]*#include +<([\\w\\d.]+)>/gm;\n\n\t\tfunction replace( match, include ) {\n\n\t\t\tvar replace = ShaderChunk[ include ];\n\n\t\t\tif ( replace === undefined ) {\n\n\t\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t\t}\n\n\t\t\treturn parseIncludes( replace );\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction unrollLoops( string ) {\n\n\t\tvar pattern = /for \\( int i \\= (\\d+)\\; i < (\\d+)\\; i \\+\\+ \\) \\{([\\s\\S]+?)(?=\\})\\}/g;\n\n\t\tfunction replace( match, start, end, snippet ) {\n\n\t\t\tvar unroll = '';\n\n\t\t\tfor ( var i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\t\t\tunroll += snippet.replace( /\\[ i \\]/g, '[ ' + i + ' ]' );\n\n\t\t\t}\n\n\t\t\treturn unroll;\n\n\t\t}\n\n\t\treturn string.replace( pattern, replace );\n\n\t}\n\n\tfunction WebGLProgram( renderer, extensions, code, material, shader, parameters ) {\n\n\t\tvar gl = renderer.context;\n\n\t\tvar defines = material.defines;\n\n\t\tvar vertexShader = shader.vertexShader;\n\t\tvar fragmentShader = shader.fragmentShader;\n\n\t\tvar shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\t\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t\t}\n\n\t\tvar envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\tvar envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\t\tvar envMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\n\t\tif ( parameters.envMap ) {\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeReflectionMapping:\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tcase CubeUVRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EquirectangularReflectionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_EQUIREC';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase SphericalReflectionMapping:\n\t\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_SPHERE';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.envMap.mapping ) {\n\n\t\t\t\tcase CubeRefractionMapping:\n\t\t\t\tcase EquirectangularRefractionMapping:\n\t\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tswitch ( material.combine ) {\n\n\t\t\t\tcase MultiplyOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MixOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AddOperation:\n\t\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar gammaFactorDefine = ( renderer.gammaFactor > 0 ) ? renderer.gammaFactor : 1.0;\n\n\t\t// console.log( 'building new program ' );\n\n\t\t//\n\n\t\tvar customExtensions = generateExtensions( material.extensions, parameters, extensions );\n\n\t\tvar customDefines = generateDefines( defines );\n\n\t\t//\n\n\t\tvar program = gl.createProgram();\n\n\t\tvar prefixVertex, prefixFragment;\n\n\t\tif ( material.isRawShaderMaterial ) {\n\n\t\t\tprefixVertex = [\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\t\t\t\tcustomDefines,\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t} else {\n\n\t\t\tprefixVertex = [\n\n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + shader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t'#define MAX_BONES ' + parameters.maxBones,\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\t\t\t\tparameters.useVertexTexture ? '#define BONE_TEXTURE' : '',\n\n\t\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t'attribute vec3 position;',\n\t\t\t\t'attribute vec3 normal;',\n\t\t\t\t'attribute vec2 uv;',\n\n\t\t\t\t'#ifdef USE_COLOR',\n\n\t\t\t\t'\tattribute vec3 color;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_MORPHTARGETS',\n\n\t\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t\t'\t#else',\n\n\t\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t\t'\t#endif',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t\t'#endif',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t\tprefixFragment = [\n\n\t\t\t\tcustomExtensions,\n\n\t\t\t\t'precision ' + parameters.precision + ' float;',\n\t\t\t\t'precision ' + parameters.precision + ' int;',\n\n\t\t\t\t'#define SHADER_NAME ' + shader.name,\n\n\t\t\t\tcustomDefines,\n\n\t\t\t\tparameters.alphaTest ? '#define ALPHATEST ' + parameters.alphaTest : '',\n\n\t\t\t\t'#define GAMMA_FACTOR ' + gammaFactorDefine,\n\n\t\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t\t( parameters.useFog && parameters.fogExp ) ? '#define FOG_EXP2' : '',\n\n\t\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\n\t\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\t\t'#define NUM_CLIPPING_PLANES ' + parameters.numClippingPlanes,\n\t\t\t\t'#define UNION_CLIPPING_PLANES ' + (parameters.numClippingPlanes - parameters.numClipIntersection),\n\n\t\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\t\tparameters.premultipliedAlpha ? \"#define PREMULTIPLIED_ALPHA\" : '',\n\n\t\t\t\tparameters.physicallyCorrectLights ? \"#define PHYSICALLY_CORRECT_LIGHTS\" : '',\n\n\t\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t\tparameters.logarithmicDepthBuffer && extensions.get( 'EXT_frag_depth' ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t\tparameters.envMap && extensions.get( 'EXT_shader_texture_lod' ) ? '#define TEXTURE_LOD_EXT' : '',\n\n\t\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t\t'uniform vec3 cameraPosition;',\n\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? \"#define TONE_MAPPING\" : '',\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '',  // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( \"toneMapping\", parameters.toneMapping ) : '',\n\n\t\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\n\t\t\t\t( parameters.outputEncoding || parameters.mapEncoding || parameters.envMapEncoding || parameters.emissiveMapEncoding ) ? ShaderChunk[ 'encodings_pars_fragment' ] : '', // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\t\tparameters.mapEncoding ? getTexelDecodingFunction( 'mapTexelToLinear', parameters.mapEncoding ) : '',\n\t\t\t\tparameters.envMapEncoding ? getTexelDecodingFunction( 'envMapTexelToLinear', parameters.envMapEncoding ) : '',\n\t\t\t\tparameters.emissiveMapEncoding ? getTexelDecodingFunction( 'emissiveMapTexelToLinear', parameters.emissiveMapEncoding ) : '',\n\t\t\t\tparameters.outputEncoding ? getTexelEncodingFunction( \"linearToOutputTexel\", parameters.outputEncoding ) : '',\n\n\t\t\t\tparameters.depthPacking ? \"#define DEPTH_PACKING \" + material.depthPacking : '',\n\n\t\t\t\t'\\n'\n\n\t\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\t}\n\n\t\tvertexShader = parseIncludes( vertexShader );\n\t\tvertexShader = replaceLightNums( vertexShader, parameters );\n\n\t\tfragmentShader = parseIncludes( fragmentShader );\n\t\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\n\t\tif ( ! material.isShaderMaterial ) {\n\n\t\t\tvertexShader = unrollLoops( vertexShader );\n\t\t\tfragmentShader = unrollLoops( fragmentShader );\n\n\t\t}\n\n\t\tvar vertexGlsl = prefixVertex + vertexShader;\n\t\tvar fragmentGlsl = prefixFragment + fragmentShader;\n\n\t\t// console.log( '*VERTEX*', vertexGlsl );\n\t\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\t\tvar glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\t\tvar glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\t\tgl.attachShader( program, glVertexShader );\n\t\tgl.attachShader( program, glFragmentShader );\n\n\t\t// Force a particular attribute to index 0.\n\n\t\tif ( material.index0AttributeName !== undefined ) {\n\n\t\t\tgl.bindAttribLocation( program, 0, material.index0AttributeName );\n\n\t\t} else if ( parameters.morphTargets === true ) {\n\n\t\t\t// programs with morphTargets displace position out of attribute 0\n\t\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t\t}\n\n\t\tgl.linkProgram( program );\n\n\t\tvar programLog = gl.getProgramInfoLog( program );\n\t\tvar vertexLog = gl.getShaderInfoLog( glVertexShader );\n\t\tvar fragmentLog = gl.getShaderInfoLog( glFragmentShader );\n\n\t\tvar runnable = true;\n\t\tvar haveDiagnostics = true;\n\n\t\t// console.log( '**VERTEX**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader ) );\n\t\t// console.log( '**FRAGMENT**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader ) );\n\n\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\trunnable = false;\n\n\t\t\tconsole.error( 'THREE.WebGLProgram: shader error: ', gl.getError(), 'gl.VALIDATE_STATUS', gl.getProgramParameter( program, gl.VALIDATE_STATUS ), 'gl.getProgramInfoLog', programLog, vertexLog, fragmentLog );\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: gl.getProgramInfoLog()', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\t\t\t\tmaterial: material,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t// clean up\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\t// set up caching for uniform locations\n\n\t\tvar cachedUniforms;\n\n\t\tthis.getUniforms = function () {\n\n\t\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t\tcachedUniforms = new WebGLUniforms( gl, program, renderer );\n\n\t\t\t}\n\n\t\t\treturn cachedUniforms;\n\n\t\t};\n\n\t\t// set up caching for attribute locations\n\n\t\tvar cachedAttributes;\n\n\t\tthis.getAttributes = function () {\n\n\t\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t\t}\n\n\t\t\treturn cachedAttributes;\n\n\t\t};\n\n\t\t// free resource\n\n\t\tthis.destroy = function() {\n\n\t\t\tgl.deleteProgram( program );\n\t\t\tthis.program = undefined;\n\n\t\t};\n\n\t\t// DEPRECATED\n\n\t\tObject.defineProperties( this, {\n\n\t\t\tuniforms: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .uniforms is now .getUniforms().' );\n\t\t\t\t\treturn this.getUniforms();\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tattributes: {\n\t\t\t\tget: function() {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram: .attributes is now .getAttributes().' );\n\t\t\t\t\treturn this.getAttributes();\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t} );\n\n\n\t\t//\n\n\t\tthis.id = programIdCount ++;\n\t\tthis.code = code;\n\t\tthis.usedTimes = 1;\n\t\tthis.program = program;\n\t\tthis.vertexShader = glVertexShader;\n\t\tthis.fragmentShader = glFragmentShader;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLPrograms( renderer, extensions, capabilities ) {\n\n\t\tvar programs = [];\n\n\t\tvar shaderIDs = {\n\t\t\tMeshDepthMaterial: 'depth',\n\t\t\tMeshDistanceMaterial: 'distanceRGBA',\n\t\t\tMeshNormalMaterial: 'normal',\n\t\t\tMeshBasicMaterial: 'basic',\n\t\t\tMeshLambertMaterial: 'lambert',\n\t\t\tMeshPhongMaterial: 'phong',\n\t\t\tMeshToonMaterial: 'phong',\n\t\t\tMeshStandardMaterial: 'physical',\n\t\t\tMeshPhysicalMaterial: 'physical',\n\t\t\tLineBasicMaterial: 'basic',\n\t\t\tLineDashedMaterial: 'dashed',\n\t\t\tPointsMaterial: 'points',\n\t\t\tShadowMaterial: 'shadow'\n\t\t};\n\n\t\tvar parameterNames = [\n\t\t\t\"precision\", \"supportsVertexTextures\", \"map\", \"mapEncoding\", \"envMap\", \"envMapMode\", \"envMapEncoding\",\n\t\t\t\"lightMap\", \"aoMap\", \"emissiveMap\", \"emissiveMapEncoding\", \"bumpMap\", \"normalMap\", \"displacementMap\", \"specularMap\",\n\t\t\t\"roughnessMap\", \"metalnessMap\", \"gradientMap\",\n\t\t\t\"alphaMap\", \"combine\", \"vertexColors\", \"fog\", \"useFog\", \"fogExp\",\n\t\t\t\"flatShading\", \"sizeAttenuation\", \"logarithmicDepthBuffer\", \"skinning\",\n\t\t\t\"maxBones\", \"useVertexTexture\", \"morphTargets\", \"morphNormals\",\n\t\t\t\"maxMorphTargets\", \"maxMorphNormals\", \"premultipliedAlpha\",\n\t\t\t\"numDirLights\", \"numPointLights\", \"numSpotLights\", \"numHemiLights\", \"numRectAreaLights\",\n\t\t\t\"shadowMapEnabled\", \"shadowMapType\", \"toneMapping\", 'physicallyCorrectLights',\n\t\t\t\"alphaTest\", \"doubleSided\", \"flipSided\", \"numClippingPlanes\", \"numClipIntersection\", \"depthPacking\", \"dithering\"\n\t\t];\n\n\n\t\tfunction allocateBones( object ) {\n\n\t\t\tvar skeleton = object.skeleton;\n\t\t\tvar bones = skeleton.bones;\n\n\t\t\tif ( capabilities.floatVertexTextures ) {\n\n\t\t\t\treturn 1024;\n\n\t\t\t} else {\n\n\t\t\t\t// default for when object is not specified\n\t\t\t\t// ( for example when prebuilding shader to be used with multiple objects )\n\t\t\t\t//\n\t\t\t\t//  - leave some extra space for other uniforms\n\t\t\t\t//  - limit here is ANGLE's 254 max uniform vectors\n\t\t\t\t//    (up to 54 should be safe)\n\n\t\t\t\tvar nVertexUniforms = capabilities.maxVertexUniforms;\n\t\t\t\tvar nVertexMatrices = Math.floor( ( nVertexUniforms - 20 ) / 4 );\n\n\t\t\t\tvar maxBones = Math.min( nVertexMatrices, bones.length );\n\n\t\t\t\tif ( maxBones < bones.length ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Skeleton has ' + bones.length + ' bones. This GPU supports ' + maxBones + '.' );\n\t\t\t\t\treturn 0;\n\n\t\t\t\t}\n\n\t\t\t\treturn maxBones;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getTextureEncodingFromMap( map, gammaOverrideLinear ) {\n\n\t\t\tvar encoding;\n\n\t\t\tif ( ! map ) {\n\n\t\t\t\tencoding = LinearEncoding;\n\n\t\t\t} else if ( map.isTexture ) {\n\n\t\t\t\tencoding = map.encoding;\n\n\t\t\t} else if ( map.isWebGLRenderTarget ) {\n\n\t\t\t\tconsole.warn( \"THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\tencoding = map.texture.encoding;\n\n\t\t\t}\n\n\t\t\t// add backwards compatibility for WebGLRenderer.gammaInput/gammaOutput parameter, should probably be removed at some point.\n\t\t\tif ( encoding === LinearEncoding && gammaOverrideLinear ) {\n\n\t\t\t\tencoding = GammaEncoding;\n\n\t\t\t}\n\n\t\t\treturn encoding;\n\n\t\t}\n\n\t\tthis.getParameters = function ( material, lights, shadows, fog, nClipPlanes, nClipIntersection, object ) {\n\n\t\t\tvar shaderID = shaderIDs[ material.type ];\n\n\t\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t\t// (not to blow over maxLights budget)\n\n\t\t\tvar maxBones = object.isSkinnedMesh ? allocateBones( object ) : 0;\n\t\t\tvar precision = capabilities.precision;\n\n\t\t\tif ( material.precision !== null ) {\n\n\t\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar currentRenderTarget = renderer.getRenderTarget();\n\n\t\t\tvar parameters = {\n\n\t\t\t\tshaderID: shaderID,\n\n\t\t\t\tprecision: precision,\n\t\t\t\tsupportsVertexTextures: capabilities.vertexTextures,\n\t\t\t\toutputEncoding: getTextureEncodingFromMap( ( ! currentRenderTarget ) ? null : currentRenderTarget.texture, renderer.gammaOutput ),\n\t\t\t\tmap: !! material.map,\n\t\t\t\tmapEncoding: getTextureEncodingFromMap( material.map, renderer.gammaInput ),\n\t\t\t\tenvMap: !! material.envMap,\n\t\t\t\tenvMapMode: material.envMap && material.envMap.mapping,\n\t\t\t\tenvMapEncoding: getTextureEncodingFromMap( material.envMap, renderer.gammaInput ),\n\t\t\t\tenvMapCubeUV: ( !! material.envMap ) && ( ( material.envMap.mapping === CubeUVReflectionMapping ) || ( material.envMap.mapping === CubeUVRefractionMapping ) ),\n\t\t\t\tlightMap: !! material.lightMap,\n\t\t\t\taoMap: !! material.aoMap,\n\t\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\t\temissiveMapEncoding: getTextureEncodingFromMap( material.emissiveMap, renderer.gammaInput ),\n\t\t\t\tbumpMap: !! material.bumpMap,\n\t\t\t\tnormalMap: !! material.normalMap,\n\t\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\t\tspecularMap: !! material.specularMap,\n\t\t\t\talphaMap: !! material.alphaMap,\n\n\t\t\t\tgradientMap: !! material.gradientMap,\n\n\t\t\t\tcombine: material.combine,\n\n\t\t\t\tvertexColors: material.vertexColors,\n\n\t\t\t\tfog: !! fog,\n\t\t\t\tuseFog: material.fog,\n\t\t\t\tfogExp: ( fog && fog.isFogExp2 ),\n\n\t\t\t\tflatShading: material.flatShading,\n\n\t\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\t\tlogarithmicDepthBuffer: capabilities.logarithmicDepthBuffer,\n\n\t\t\t\tskinning: material.skinning && maxBones > 0,\n\t\t\t\tmaxBones: maxBones,\n\t\t\t\tuseVertexTexture: capabilities.floatVertexTextures,\n\n\t\t\t\tmorphTargets: material.morphTargets,\n\t\t\t\tmorphNormals: material.morphNormals,\n\t\t\t\tmaxMorphTargets: renderer.maxMorphTargets,\n\t\t\t\tmaxMorphNormals: renderer.maxMorphNormals,\n\n\t\t\t\tnumDirLights: lights.directional.length,\n\t\t\t\tnumPointLights: lights.point.length,\n\t\t\t\tnumSpotLights: lights.spot.length,\n\t\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\t\tnumClippingPlanes: nClipPlanes,\n\t\t\t\tnumClipIntersection: nClipIntersection,\n\n\t\t\t\tdithering: material.dithering,\n\n\t\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && object.receiveShadow && shadows.length > 0,\n\t\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\t\ttoneMapping: renderer.toneMapping,\n\t\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\t\talphaTest: material.alphaTest,\n\t\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\t\tflipSided: material.side === BackSide,\n\n\t\t\t\tdepthPacking: ( material.depthPacking !== undefined ) ? material.depthPacking : false\n\n\t\t\t};\n\n\t\t\treturn parameters;\n\n\t\t};\n\n\t\tthis.getProgramCode = function ( material, parameters ) {\n\n\t\t\tvar array = [];\n\n\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\tarray.push( parameters.shaderID );\n\n\t\t\t} else {\n\n\t\t\t\tarray.push( material.fragmentShader );\n\t\t\t\tarray.push( material.vertexShader );\n\n\t\t\t}\n\n\t\t\tif ( material.defines !== undefined ) {\n\n\t\t\t\tfor ( var name in material.defines ) {\n\n\t\t\t\t\tarray.push( name );\n\t\t\t\t\tarray.push( material.defines[ name ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < parameterNames.length; i ++ ) {\n\n\t\t\t\tarray.push( parameters[ parameterNames[ i ] ] );\n\n\t\t\t}\n\n\t\t\tarray.push( material.onBeforeCompile.toString() );\n\n\t\t\tarray.push( renderer.gammaOutput );\n\n\t\t\treturn array.join();\n\n\t\t};\n\n\t\tthis.acquireProgram = function ( material, shader, parameters, code ) {\n\n\t\t\tvar program;\n\n\t\t\t// Check if code has been already compiled\n\t\t\tfor ( var p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\t\tvar programInfo = programs[ p ];\n\n\t\t\t\tif ( programInfo.code === code ) {\n\n\t\t\t\t\tprogram = programInfo;\n\t\t\t\t\t++ program.usedTimes;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\tprogram = new WebGLProgram( renderer, extensions, code, material, shader, parameters );\n\t\t\t\tprograms.push( program );\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t};\n\n\t\tthis.releaseProgram = function ( program ) {\n\n\t\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t\t// Remove from unordered set\n\t\t\t\tvar i = programs.indexOf( program );\n\t\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\t\tprograms.pop();\n\n\t\t\t\t// Free WebGL resources\n\t\t\t\tprogram.destroy();\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tthis.programs = programs;\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, infoMemory ) {\n\n\t\tvar _isWebGL2 = ( typeof WebGL2RenderingContext !== 'undefined' && _gl instanceof WebGL2RenderingContext );\n\n\t\t//\n\n\t\tfunction clampToMaxSize( image, maxSize ) {\n\n\t\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\t\t// Warning: Scaling through the canvas will only work with images that use\n\t\t\t\t// premultiplied alpha.\n\n\t\t\t\tvar scale = maxSize / Math.max( image.width, image.height );\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = Math.floor( image.width * scale );\n\t\t\t\tcanvas.height = Math.floor( image.height * scale );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is too big (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction isPowerOfTwo( image ) {\n\n\t\t\treturn _Math.isPowerOfTwo( image.width ) && _Math.isPowerOfTwo( image.height );\n\n\t\t}\n\n\t\tfunction makePowerOfTwo( image ) {\n\n\t\t\tif ( image instanceof HTMLImageElement || image instanceof HTMLCanvasElement ) {\n\n\t\t\t\tvar canvas = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\t\t\tcanvas.width = _Math.nearestPowerOfTwo( image.width );\n\t\t\t\tcanvas.height = _Math.nearestPowerOfTwo( image.height );\n\n\t\t\t\tvar context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: image is not power of two (' + image.width + 'x' + image.height + '). Resized to ' + canvas.width + 'x' + canvas.height, image );\n\n\t\t\t\treturn canvas;\n\n\t\t\t}\n\n\t\t\treturn image;\n\n\t\t}\n\n\t\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\t\treturn ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||\n\t\t\t\t( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );\n\n\t\t}\n\n\t\tfunction textureNeedsGenerateMipmaps( texture, isPowerOfTwo ) {\n\n\t\t\treturn texture.generateMipmaps && isPowerOfTwo &&\n\t\t\t\ttexture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t\t}\n\n\t\t// Fallback filters for non-power-of-2 textures\n\n\t\tfunction filterFallback( f ) {\n\n\t\t\tif ( f === NearestFilter || f === NearestMipMapNearestFilter || f === NearestMipMapLinearFilter ) {\n\n\t\t\t\treturn _gl.NEAREST;\n\n\t\t\t}\n\n\t\t\treturn _gl.LINEAR;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction onTextureDispose( event ) {\n\n\t\t\tvar texture = event.target;\n\n\t\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\t\tdeallocateTexture( texture );\n\n\t\t\tinfoMemory.textures --;\n\n\n\t\t}\n\n\t\tfunction onRenderTargetDispose( event ) {\n\n\t\t\tvar renderTarget = event.target;\n\n\t\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\tdeallocateRenderTarget( renderTarget );\n\n\t\t\tinfoMemory.textures --;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction deallocateTexture( texture ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image && textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__image__webglTextureCube );\n\n\t\t\t} else {\n\n\t\t\t\t// 2D texture\n\n\t\t\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\t// remove all webgl properties\n\t\t\tproperties.remove( texture );\n\n\t\t}\n\n\t\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\tif ( ! renderTarget ) return;\n\n\t\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.isWebGLRenderTargetCube ) {\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\n\t\t\t}\n\n\t\t\tproperties.remove( renderTarget.texture );\n\t\t\tproperties.remove( renderTarget );\n\n\t\t}\n\n\t\t//\n\n\n\n\t\tfunction setTexture2D( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\tvar image = texture.image;\n\n\t\t\t\tif ( image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is undefined', texture );\n\n\t\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete', texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureCube( texture, slot ) {\n\n\t\t\tvar textureProperties = properties.get( texture );\n\n\t\t\tif ( texture.image.length === 6 ) {\n\n\t\t\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\t\t\tif ( ! textureProperties.__image__webglTextureCube ) {\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\ttextureProperties.__image__webglTextureCube = _gl.createTexture();\n\n\t\t\t\t\t\tinfoMemory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\n\t\t\t\t\tvar isCompressed = ( texture && texture.isCompressedTexture );\n\t\t\t\t\tvar isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\t\t\tvar cubeImage = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = clampToMaxSize( texture.image[ i ], capabilities.maxCubemapSize );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar image = cubeImage[ 0 ],\n\t\t\t\t\tisPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\t\t\tglFormat = utils.convert( texture.format ),\n\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture, isPowerOfTwoImage );\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isCompressed ) {\n\n\t\t\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar mipmap, mipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\t\t\tfor ( var j = 0, jl = mipmaps.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\t\tmipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) {\n\n\t\t\t\t\t\t_gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__image__webglTextureCube );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setTextureCubeDynamic( texture, slot ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, properties.get( texture ).__webglTexture );\n\n\t\t}\n\n\t\tfunction setTextureParameters( textureType, texture, isPowerOfTwoImage ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( isPowerOfTwoImage ) {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, utils.convert( texture.wrapS ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, utils.convert( texture.wrapT ) );\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, utils.convert( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, utils.convert( texture.minFilter ) );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, _gl.CLAMP_TO_EDGE );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, _gl.CLAMP_TO_EDGE );\n\n\t\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.', texture );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterFallback( texture.magFilter ) );\n\t\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterFallback( texture.minFilter ) );\n\n\t\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.', texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\textension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension ) {\n\n\t\t\t\tif ( texture.type === FloatType && extensions.get( 'OES_texture_float_linear' ) === null ) return;\n\t\t\t\tif ( texture.type === HalfFloatType && extensions.get( 'OES_texture_half_float_linear' ) === null ) return;\n\n\t\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\tinfoMemory.textures ++;\n\n\t\t\t}\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\n\t\t\tvar image = clampToMaxSize( texture.image, capabilities.maxTextureSize );\n\n\t\t\tif ( textureNeedsPowerOfTwo( texture ) && isPowerOfTwo( image ) === false ) {\n\n\t\t\t\timage = makePowerOfTwo( image );\n\n\t\t\t}\n\n\t\t\tvar isPowerOfTwoImage = isPowerOfTwo( image ),\n\t\t\tglFormat = utils.convert( texture.format ),\n\t\t\tglType = utils.convert( texture.type );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_2D, texture, isPowerOfTwoImage );\n\n\t\t\tvar mipmap, mipmaps = texture.mipmaps;\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\t// populate depth texture with dummy data\n\n\t\t\t\tvar internalFormat = _gl.DEPTH_COMPONENT;\n\n\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\tif ( !_isWebGL2 ) throw new Error('Float Depth Texture only supported in WebGL2.0');\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t} else if ( _isWebGL2 ) {\n\n\t\t\t\t\t// WebGL 2.0 requires signed internalformat for glTexImage2D\n\t\t\t\t\tinternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texture.format === DepthFormat && internalFormat === _gl.DEPTH_COMPONENT ) {\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {\n\n\t\t\t\t\t        console.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedShortType;\n\t\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\tif ( texture.format === DepthStencilFormat ) {\n\n\t\t\t\t\tinternalFormat = _gl.DEPTH_STENCIL;\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedInt248Type ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedInt248Type;\n\t\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, internalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\tif ( texture.format !== RGBAFormat && texture.format !== RGBFormat ) {\n\n\t\t\t\t\t\tif ( state.getCompressedTextureFormats().indexOf( glFormat ) > - 1 ) {\n\n\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && isPowerOfTwoImage ) {\n\n\t\t\t\t\tfor ( var i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glFormat, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, isPowerOfTwoImage ) ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\n\t\t\ttextureProperties.__version = texture.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\t// Render targets\n\n\t\t// Setup storage for target texture and bind it to correct framebuffer\n\t\tfunction setupFrameBufferTexture( framebuffer, renderTarget, attachment, textureTarget ) {\n\n\t\t\tvar glFormat = utils.convert( renderTarget.texture.format );\n\t\t\tvar glType = utils.convert( renderTarget.texture.type );\n\t\t\tstate.texImage2D( textureTarget, 0, glFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, properties.get( renderTarget.texture ).__webglTexture, 0 );\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\t\tfunction setupRenderBufferStorage( renderbuffer, renderTarget ) {\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_COMPONENT16, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.DEPTH_STENCIL, renderTarget.width, renderTarget.height );\n\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t} else {\n\n\t\t\t\t// FIXME: We don't support !depth !stencil\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, _gl.RGBA4, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t}\n\n\t\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\t\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\t\tvar isCube = ( renderTarget && renderTarget.isWebGLRenderTargetCube );\n\t\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( !( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t\t}\n\n\t\t\t// upload an empty depth texture with framebuffer size\n\t\t\tif ( !properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\t\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\t\t\t}\n\n\t\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\t\tvar webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\n\t\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.DEPTH_STENCIL_ATTACHMENT, _gl.TEXTURE_2D, webglDepthTexture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup GL resources for a non-texture depth buffer\n\t\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\n\t\t\tvar isCube = ( renderTarget.isWebGLRenderTargetCube === true );\n\n\t\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\t\tif ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );\n\n\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t}\n\n\t\t// Set up GL resources for the render target\n\t\tfunction setupRenderTarget( renderTarget ) {\n\n\t\t\tvar renderTargetProperties = properties.get( renderTarget );\n\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\n\t\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\tinfoMemory.textures ++;\n\n\t\t\tvar isCube = ( renderTarget.isWebGLRenderTargetCube === true );\n\t\t\tvar isTargetPowerOfTwo = isPowerOfTwo( renderTarget );\n\n\t\t\t// Setup framebuffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t\t// Setup color buffer\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.texture, isTargetPowerOfTwo );\n\n\t\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i );\n\n\t\t\t\t}\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) _gl.generateMipmap( _gl.TEXTURE_CUBE_MAP );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_2D, renderTarget.texture, isTargetPowerOfTwo );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D );\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( renderTarget.texture, isTargetPowerOfTwo ) ) _gl.generateMipmap( _gl.TEXTURE_2D );\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_2D, null );\n\n\t\t\t}\n\n\t\t\t// Setup depth and stencil buffers\n\n\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\t\tvar texture = renderTarget.texture;\n\t\t\tvar isTargetPowerOfTwo = isPowerOfTwo( renderTarget );\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, isTargetPowerOfTwo ) ) {\n\n\t\t\t\tvar target = renderTarget.isWebGLRenderTargetCube ? _gl.TEXTURE_CUBE_MAP : _gl.TEXTURE_2D;\n\t\t\t\tvar webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\t_gl.generateMipmap( target );\n\t\t\t\tstate.bindTexture( target, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setTexture2D = setTexture2D;\n\t\tthis.setTextureCube = setTextureCube;\n\t\tthis.setTextureCubeDynamic = setTextureCubeDynamic;\n\t\tthis.setupRenderTarget = setupRenderTarget;\n\t\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\n\t}\n\n\t/**\n\t * @author fordacious / fordacious.github.io\n\t */\n\n\tfunction WebGLProperties() {\n\n\t\tvar properties = {};\n\n\t\tfunction get( object ) {\n\n\t\t\tvar uuid = object.uuid;\n\t\t\tvar map = properties[ uuid ];\n\n\t\t\tif ( map === undefined ) {\n\n\t\t\t\tmap = {};\n\t\t\t\tproperties[ uuid ] = map;\n\n\t\t\t}\n\n\t\t\treturn map;\n\n\t\t}\n\n\t\tfunction remove( object ) {\n\n\t\t\tdelete properties[ object.uuid ];\n\n\t\t}\n\n\t\tfunction clear() {\n\n\t\t\tproperties = {};\n\n\t\t}\n\n\t\treturn {\n\t\t\tget: get,\n\t\t\tremove: remove,\n\t\t\tclear: clear\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLState( gl, extensions, utils ) {\n\n\t\tfunction ColorBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar color = new Vector4();\n\t\t\tvar currentColorMask = null;\n\t\t\tvar currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\t\treturn {\n\n\t\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentColorMask = null;\n\t\t\t\t\tcurrentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction DepthBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentDepthMask = null;\n\t\t\tvar currentDepthFunc = null;\n\t\t\tvar currentDepthClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\t\tif ( depthFunc ) {\n\n\t\t\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentDepthMask = null;\n\t\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction StencilBuffer() {\n\n\t\t\tvar locked = false;\n\n\t\t\tvar currentStencilMask = null;\n\t\t\tvar currentStencilFunc = null;\n\t\t\tvar currentStencilRef = null;\n\t\t\tvar currentStencilFuncMask = null;\n\t\t\tvar currentStencilFail = null;\n\t\t\tvar currentStencilZFail = null;\n\t\t\tvar currentStencilZPass = null;\n\t\t\tvar currentStencilClear = null;\n\n\t\t\treturn {\n\n\t\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t\t     currentStencilRef \t!== stencilRef \t||\n\t\t\t\t\t     currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\t\tif ( currentStencilFail\t !== stencilFail \t||\n\t\t\t\t\t     currentStencilZFail !== stencilZFail ||\n\t\t\t\t\t     currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\t\tlocked = lock;\n\n\t\t\t\t},\n\n\t\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\treset: function () {\n\n\t\t\t\t\tlocked = false;\n\n\t\t\t\t\tcurrentStencilMask = null;\n\t\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\t\tcurrentStencilRef = null;\n\t\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\t\tcurrentStencilFail = null;\n\t\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\t//\n\n\t\tvar colorBuffer = new ColorBuffer();\n\t\tvar depthBuffer = new DepthBuffer();\n\t\tvar stencilBuffer = new StencilBuffer();\n\n\t\tvar maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar newAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar enabledAttributes = new Uint8Array( maxVertexAttributes );\n\t\tvar attributeDivisors = new Uint8Array( maxVertexAttributes );\n\n\t\tvar capabilities = {};\n\n\t\tvar compressedTextureFormats = null;\n\n\t\tvar currentProgram = null;\n\n\t\tvar currentBlending = null;\n\t\tvar currentBlendEquation = null;\n\t\tvar currentBlendSrc = null;\n\t\tvar currentBlendDst = null;\n\t\tvar currentBlendEquationAlpha = null;\n\t\tvar currentBlendSrcAlpha = null;\n\t\tvar currentBlendDstAlpha = null;\n\t\tvar currentPremultipledAlpha = false;\n\n\t\tvar currentFlipSided = null;\n\t\tvar currentCullFace = null;\n\n\t\tvar currentLineWidth = null;\n\n\t\tvar currentPolygonOffsetFactor = null;\n\t\tvar currentPolygonOffsetUnits = null;\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS );\n\n\t\tvar version = parseFloat( /^WebGL\\ ([0-9])/.exec( gl.getParameter( gl.VERSION ) )[ 1 ] );\n\t\tvar lineWidthAvailable = parseFloat( version ) >= 1.0;\n\n\t\tvar currentTextureSlot = null;\n\t\tvar currentBoundTextures = {};\n\n\t\tvar currentScissor = new Vector4();\n\t\tvar currentViewport = new Vector4();\n\n\t\tfunction createTexture( type, target, count ) {\n\n\t\t\tvar data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\t\tvar texture = gl.createTexture();\n\n\t\t\tgl.bindTexture( type, texture );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\t\tfor ( var i = 0; i < count; i ++ ) {\n\n\t\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t\tvar emptyTextures = {};\n\t\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\t\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\n\t\t// init\n\n\t\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\t\tdepthBuffer.setClear( 1 );\n\t\tstencilBuffer.setClear( 0 );\n\n\t\tenable( gl.DEPTH_TEST );\n\t\tdepthBuffer.setFunc( LessEqualDepth );\n\n\t\tsetFlipSided( false );\n\t\tsetCullFace( CullFaceBack );\n\t\tenable( gl.CULL_FACE );\n\n\t\tenable( gl.BLEND );\n\t\tsetBlending( NormalBlending );\n\n\t\t//\n\n\t\tfunction initAttributes() {\n\n\t\t\tfor ( var i = 0, l = newAttributes.length; i < l; i ++ ) {\n\n\t\t\t\tnewAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttribute( attribute ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== 0 ) {\n\n\t\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, 0 );\n\t\t\t\tattributeDivisors[ attribute ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\t\tnewAttributes[ attribute ] = 1;\n\n\t\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t\t}\n\n\t\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\t\tvar extension = extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\t\textension.vertexAttribDivisorANGLE( attribute, meshPerAttribute );\n\t\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disableUnusedAttributes() {\n\n\t\t\tfor ( var i = 0, l = enabledAttributes.length; i !== l; ++ i ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction enable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== true ) {\n\n\t\t\t\tgl.enable( id );\n\t\t\t\tcapabilities[ id ] = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disable( id ) {\n\n\t\t\tif ( capabilities[ id ] !== false ) {\n\n\t\t\t\tgl.disable( id );\n\t\t\t\tcapabilities[ id ] = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getCompressedTextureFormats() {\n\n\t\t\tif ( compressedTextureFormats === null ) {\n\n\t\t\t\tcompressedTextureFormats = [];\n\n\t\t\t\tif ( extensions.get( 'WEBGL_compressed_texture_pvrtc' ) ||\n\t\t\t\t     extensions.get( 'WEBGL_compressed_texture_s3tc' ) ||\n\t\t\t\t     extensions.get( 'WEBGL_compressed_texture_etc1' ) ) {\n\n\t\t\t\t\tvar formats = gl.getParameter( gl.COMPRESSED_TEXTURE_FORMATS );\n\n\t\t\t\t\tfor ( var i = 0; i < formats.length; i ++ ) {\n\n\t\t\t\t\t\tcompressedTextureFormats.push( formats[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn compressedTextureFormats;\n\n\t\t}\n\n\t\tfunction useProgram( program ) {\n\n\t\t\tif ( currentProgram !== program ) {\n\n\t\t\t\tgl.useProgram( program );\n\n\t\t\t\tcurrentProgram = program;\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\t\tif ( blending !== NoBlending ) {\n\n\t\t\t\tenable( gl.BLEND );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.BLEND );\n\n\t\t\t}\n\n\t\t\tif ( blending !== CustomBlending ) {\n\n\t\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\n\t\t\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE, gl.ONE, gl.ONE );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\t\t\tgl.blendFunc( gl.SRC_ALPHA, gl.ONE );\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\n\t\t\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.ONE_MINUS_SRC_COLOR );\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\n\t\t\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\t\t\t\t\t\t\tgl.blendFunc( gl.ZERO, gl.SRC_COLOR );\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tgl.blendEquationSeparate( gl.FUNC_ADD, gl.FUNC_ADD );\n\t\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendEquation = null;\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendEquationAlpha = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t} else {\n\n\t\t\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\t\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\t\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\t\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\t\t\tgl.blendEquationSeparate( utils.convert( blendEquation ), utils.convert( blendEquationAlpha ) );\n\n\t\t\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t\t\t}\n\n\t\t\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\t\t\tgl.blendFuncSeparate( utils.convert( blendSrc ), utils.convert( blendDst ), utils.convert( blendSrcAlpha ), utils.convert( blendDstAlpha ) );\n\n\t\t\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\t\t\tcurrentBlendDst = blendDst;\n\t\t\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcurrentBlending = blending;\n\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t}\n\n\t\tfunction setMaterial( material ) {\n\n\t\t\tmaterial.side === DoubleSide\n\t\t\t\t? disable( gl.CULL_FACE )\n\t\t\t\t: enable( gl.CULL_FACE );\n\n\t\t\tsetFlipSided( material.side === BackSide );\n\n\t\t\tmaterial.transparent === true\n\t\t\t\t? setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha )\n\t\t\t\t: setBlending( NoBlending );\n\n\t\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\t\tdepthBuffer.setTest( material.depthTest );\n\t\t\tdepthBuffer.setMask( material.depthWrite );\n\t\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction setFlipSided( flipSided ) {\n\n\t\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\t\tif ( flipSided ) {\n\n\t\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t\t}\n\n\t\t\t\tcurrentFlipSided = flipSided;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setCullFace( cullFace ) {\n\n\t\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\t\tenable( gl.CULL_FACE );\n\n\t\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.CULL_FACE );\n\n\t\t\t}\n\n\t\t\tcurrentCullFace = cullFace;\n\n\t\t}\n\n\t\tfunction setLineWidth( width ) {\n\n\t\t\tif ( width !== currentLineWidth ) {\n\n\t\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\t\tcurrentLineWidth = width;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\t\tif ( polygonOffset ) {\n\n\t\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction setScissorTest( scissorTest ) {\n\n\t\t\tif ( scissorTest ) {\n\n\t\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t\t} else {\n\n\t\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// texture\n\n\t\tfunction activeTexture( webglSlot ) {\n\n\t\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction bindTexture( webglType, webglTexture ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\tactiveTexture();\n\n\t\t\t}\n\n\t\t\tvar boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\t\tif ( boundTexture === undefined ) {\n\n\t\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\t\tcurrentBoundTextures[ currentTextureSlot ] = boundTexture;\n\n\t\t\t}\n\n\t\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\t\tboundTexture.type = webglType;\n\t\t\t\tboundTexture.texture = webglTexture;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction compressedTexImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction texImage2D() {\n\n\t\t\ttry {\n\n\t\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction scissor( scissor ) {\n\n\t\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\t\tcurrentScissor.copy( scissor );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction viewport( viewport ) {\n\n\t\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\t\tcurrentViewport.copy( viewport );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction reset() {\n\n\t\t\tfor ( var i = 0; i < enabledAttributes.length; i ++ ) {\n\n\t\t\t\tif ( enabledAttributes[ i ] === 1 ) {\n\n\t\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcapabilities = {};\n\n\t\t\tcompressedTextureFormats = null;\n\n\t\t\tcurrentTextureSlot = null;\n\t\t\tcurrentBoundTextures = {};\n\n\t\t\tcurrentProgram = null;\n\n\t\t\tcurrentBlending = null;\n\n\t\t\tcurrentFlipSided = null;\n\t\t\tcurrentCullFace = null;\n\n\t\t\tcolorBuffer.reset();\n\t\t\tdepthBuffer.reset();\n\t\t\tstencilBuffer.reset();\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tbuffers: {\n\t\t\t\tcolor: colorBuffer,\n\t\t\t\tdepth: depthBuffer,\n\t\t\t\tstencil: stencilBuffer\n\t\t\t},\n\n\t\t\tinitAttributes: initAttributes,\n\t\t\tenableAttribute: enableAttribute,\n\t\t\tenableAttributeAndDivisor: enableAttributeAndDivisor,\n\t\t\tdisableUnusedAttributes: disableUnusedAttributes,\n\t\t\tenable: enable,\n\t\t\tdisable: disable,\n\t\t\tgetCompressedTextureFormats: getCompressedTextureFormats,\n\n\t\t\tuseProgram: useProgram,\n\n\t\t\tsetBlending: setBlending,\n\t\t\tsetMaterial: setMaterial,\n\n\t\t\tsetFlipSided: setFlipSided,\n\t\t\tsetCullFace: setCullFace,\n\n\t\t\tsetLineWidth: setLineWidth,\n\t\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\t\tsetScissorTest: setScissorTest,\n\n\t\t\tactiveTexture: activeTexture,\n\t\t\tbindTexture: bindTexture,\n\t\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\t\ttexImage2D: texImage2D,\n\n\t\t\tscissor: scissor,\n\t\t\tviewport: viewport,\n\n\t\t\treset: reset\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\t\tvar maxAnisotropy;\n\n\t\tfunction getMaxAnisotropy() {\n\n\t\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\t\tvar extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t\t} else {\n\n\t\t\t\tmaxAnisotropy = 0;\n\n\t\t\t}\n\n\t\t\treturn maxAnisotropy;\n\n\t\t}\n\n\t\tfunction getMaxPrecision( precision ) {\n\n\t\t\tif ( precision === 'highp' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\t     gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'highp';\n\n\t\t\t\t}\n\n\t\t\t\tprecision = 'mediump';\n\n\t\t\t}\n\n\t\t\tif ( precision === 'mediump' ) {\n\n\t\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\t     gl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\t\treturn 'mediump';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn 'lowp';\n\n\t\t}\n\n\t\tvar precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\t\tvar maxPrecision = getMaxPrecision( precision );\n\n\t\tif ( maxPrecision !== precision ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\t\tprecision = maxPrecision;\n\n\t\t}\n\n\t\tvar logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true && !! extensions.get( 'EXT_frag_depth' );\n\n\t\tvar maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\t\tvar maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\t\tvar maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\t\tvar maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\t\tvar maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\t\tvar maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\t\tvar maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\t\tvar vertexTextures = maxVertexTextures > 0;\n\t\tvar floatFragmentTextures = !! extensions.get( 'OES_texture_float' );\n\t\tvar floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\t\treturn {\n\n\t\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\t\tprecision: precision,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tmaxTextures: maxTextures,\n\t\t\tmaxVertexTextures: maxVertexTextures,\n\t\t\tmaxTextureSize: maxTextureSize,\n\t\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\t\tmaxAttributes: maxAttributes,\n\t\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\t\tmaxVaryings: maxVaryings,\n\t\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\t\tvertexTextures: vertexTextures,\n\t\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\t\tfloatVertexTextures: floatVertexTextures\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ArrayCamera( array ) {\n\n\t\tPerspectiveCamera.call( this );\n\n\t\tthis.cameras = array || [];\n\n\t}\n\n\tArrayCamera.prototype = Object.assign( Object.create( PerspectiveCamera.prototype ), {\n\n\t\tconstructor: ArrayCamera,\n\n\t\tisArrayCamera: true\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebVRManager( renderer ) {\n\n\t\tvar scope = this;\n\n\t\tvar device = null;\n\t\tvar frameData = null;\n\n\t\tif ( 'VRFrameData' in window ) {\n\n\t\t\tframeData = new window.VRFrameData();\n\n\t\t}\n\n\t\tvar matrixWorldInverse = new Matrix4();\n\n\t\tvar standingMatrix = new Matrix4();\n\t\tvar standingMatrixInverse = new Matrix4();\n\n\t\tvar cameraL = new PerspectiveCamera();\n\t\tcameraL.bounds = new Vector4( 0.0, 0.0, 0.5, 1.0 );\n\t\tcameraL.layers.enable( 1 );\n\n\t\tvar cameraR = new PerspectiveCamera();\n\t\tcameraR.bounds = new Vector4( 0.5, 0.0, 0.5, 1.0 );\n\t\tcameraR.layers.enable( 2 );\n\n\t\tvar cameraVR = new ArrayCamera( [ cameraL, cameraR ] );\n\t\tcameraVR.layers.enable( 1 );\n\t\tcameraVR.layers.enable( 2 );\n\n\t\t//\n\n\t\tvar currentSize, currentPixelRatio;\n\n\t\tfunction onVRDisplayPresentChange() {\n\n\t\t\tif ( device !== null && device.isPresenting ) {\n\n\t\t\t\tvar eyeParameters = device.getEyeParameters( 'left' );\n\t\t\t\tvar renderWidth = eyeParameters.renderWidth;\n\t\t\t\tvar renderHeight = eyeParameters.renderHeight;\n\n\t\t\t\tcurrentPixelRatio = renderer.getPixelRatio();\n\t\t\t\tcurrentSize = renderer.getSize();\n\n\t\t\t\trenderer.setDrawingBufferSize( renderWidth * 2, renderHeight, 1 );\n\n\t\t\t} else if ( scope.enabled ) {\n\n\t\t\t\trenderer.setDrawingBufferSize( currentSize.width, currentSize.height, currentPixelRatio );\n\n\t\t\t}\n\n\t\t}\n\n\t\twindow.addEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange, false );\n\n\t\t//\n\n\t\tthis.enabled = false;\n\t\tthis.standing = false;\n\n\t\tthis.getDevice = function () {\n\n\t\t\treturn device;\n\n\t\t};\n\n\t\tthis.setDevice = function ( value ) {\n\n\t\t\tif ( value !== undefined ) device = value;\n\n\t\t};\n\n\t\tthis.getCamera = function ( camera ) {\n\n\t\t\tif ( device === null ) return camera;\n\n\t\t\tdevice.depthNear = camera.near;\n\t\t\tdevice.depthFar = camera.far;\n\n\t\t\tdevice.getFrameData( frameData );\n\n\t\t\t//\n\n\t\t\tvar pose = frameData.pose;\n\n\t\t\tif ( pose.position !== null ) {\n\n\t\t\t\tcamera.position.fromArray( pose.position );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.position.set( 0, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( pose.orientation !== null ) {\n\n\t\t\t\tcamera.quaternion.fromArray( pose.orientation );\n\n\t\t\t}\n\n\t\t\tcamera.updateMatrixWorld();\n\n\t\t\tvar stageParameters = device.stageParameters;\n\n\t\t\tif ( this.standing && stageParameters ) {\n\n\t\t\t\tstandingMatrix.fromArray( stageParameters.sittingToStandingTransform );\n\t\t\t\tstandingMatrixInverse.getInverse( standingMatrix );\n\n\t\t\t\tcamera.matrixWorld.multiply( standingMatrix );\n\t\t\t\tcamera.matrixWorldInverse.multiply( standingMatrixInverse );\n\n\t\t\t}\n\n\t\t\tif ( device.isPresenting === false ) return camera;\n\n\t\t\t//\n\n\t\t\tcameraL.near = camera.near;\n\t\t\tcameraR.near = camera.near;\n\n\t\t\tcameraL.far = camera.far;\n\t\t\tcameraR.far = camera.far;\n\n\t\t\tcameraVR.matrixWorld.copy( camera.matrixWorld );\n\t\t\tcameraVR.matrixWorldInverse.copy( camera.matrixWorldInverse );\n\n\t\t\tcameraL.matrixWorldInverse.fromArray( frameData.leftViewMatrix );\n\t\t\tcameraR.matrixWorldInverse.fromArray( frameData.rightViewMatrix );\n\n\t\t\tif ( this.standing && stageParameters ) {\n\n\t\t\t\tcameraL.matrixWorldInverse.multiply( standingMatrixInverse );\n\t\t\t\tcameraR.matrixWorldInverse.multiply( standingMatrixInverse );\n\n\t\t\t}\n\n\t\t\tvar parent = camera.parent;\n\n\t\t\tif ( parent !== null ) {\n\n\t\t\t\tmatrixWorldInverse.getInverse( parent.matrixWorld );\n\n\t\t\t\tcameraL.matrixWorldInverse.multiply( matrixWorldInverse );\n\t\t\t\tcameraR.matrixWorldInverse.multiply( matrixWorldInverse );\n\n\t\t\t}\n\n\t\t\t// envMap and Mirror needs camera.matrixWorld\n\n\t\t\tcameraL.matrixWorld.getInverse( cameraL.matrixWorldInverse );\n\t\t\tcameraR.matrixWorld.getInverse( cameraR.matrixWorldInverse );\n\n\t\t\tcameraL.projectionMatrix.fromArray( frameData.leftProjectionMatrix );\n\t\t\tcameraR.projectionMatrix.fromArray( frameData.rightProjectionMatrix );\n\n\t\t\t// HACK @mrdoob\n\t\t\t// https://github.com/w3c/webvr/issues/203\n\n\t\t\tcameraVR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t\t//\n\n\t\t\tvar layers = device.getLayers();\n\n\t\t\tif ( layers.length ) {\n\n\t\t\t\tvar layer = layers[ 0 ];\n\n\t\t\t\tif ( layer.leftBounds !== null && layer.leftBounds.length === 4 ) {\n\n\t\t\t\t\tcameraL.bounds.fromArray( layer.leftBounds );\n\n\t\t\t\t}\n\n\t\t\t\tif ( layer.rightBounds !== null && layer.rightBounds.length === 4 ) {\n\n\t\t\t\t\tcameraR.bounds.fromArray( layer.rightBounds );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn cameraVR;\n\n\t\t};\n\n\t\tthis.getStandingMatrix = function () {\n\n\t\t\treturn standingMatrix;\n\n\t\t};\n\n\t\tthis.submitFrame = function () {\n\n\t\t\tif ( device && device.isPresenting ) device.submitFrame();\n\n\t\t};\n\n\t\tthis.dispose = function() {\n\n\t\t\twindow.removeEventListener( 'vrdisplaypresentchange', onVRDisplayPresentChange );\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction WebGLExtensions( gl ) {\n\n\t\tvar extensions = {};\n\n\t\treturn {\n\n\t\t\tget: function ( name ) {\n\n\t\t\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\t\t\treturn extensions[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tvar extension;\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'WEBGL_compressed_texture_etc1':\n\t\t\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_etc1' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\textension = gl.getExtension( name );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extension === null ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t\t}\n\n\t\t\t\textensions[ name ] = extension;\n\n\t\t\t\treturn extension;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction WebGLClipping() {\n\n\t\tvar scope = this,\n\n\t\t\tglobalState = null,\n\t\t\tnumGlobalPlanes = 0,\n\t\t\tlocalClippingEnabled = false,\n\t\t\trenderingShadows = false,\n\n\t\t\tplane = new Plane(),\n\t\t\tviewNormalMatrix = new Matrix3(),\n\n\t\t\tuniform = { value: null, needsUpdate: false };\n\n\t\tthis.uniform = uniform;\n\t\tthis.numPlanes = 0;\n\t\tthis.numIntersection = 0;\n\n\t\tthis.init = function( planes, enableLocalClipping, camera ) {\n\n\t\t\tvar enabled =\n\t\t\t\tplanes.length !== 0 ||\n\t\t\t\tenableLocalClipping ||\n\t\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t\t// run another frame in order to reset the state:\n\t\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\t\tlocalClippingEnabled;\n\n\t\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\t\tglobalState = projectPlanes( planes, camera, 0 );\n\t\t\tnumGlobalPlanes = planes.length;\n\n\t\t\treturn enabled;\n\n\t\t};\n\n\t\tthis.beginShadows = function() {\n\n\t\t\trenderingShadows = true;\n\t\t\tprojectPlanes( null );\n\n\t\t};\n\n\t\tthis.endShadows = function() {\n\n\t\t\trenderingShadows = false;\n\t\t\tresetGlobalState();\n\n\t\t};\n\n\t\tthis.setState = function( planes, clipIntersection, clipShadows, camera, cache, fromCache ) {\n\n\t\t\tif ( ! localClippingEnabled ||\n\t\t\t\t\tplanes === null || planes.length === 0 ||\n\t\t\t\t\trenderingShadows && ! clipShadows ) {\n\t\t\t\t// there's no local clipping\n\n\t\t\t\tif ( renderingShadows ) {\n\t\t\t\t\t// there's no global clipping\n\n\t\t\t\t\tprojectPlanes( null );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tresetGlobalState();\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\t\tlGlobal = nGlobal * 4,\n\n\t\t\t\t\tdstArray = cache.clippingState || null;\n\n\t\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, fromCache );\n\n\t\t\t\tfor ( var i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcache.clippingState = dstArray;\n\t\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\t\tthis.numPlanes += nGlobal;\n\n\t\t\t}\n\n\n\t\t};\n\n\t\tfunction resetGlobalState() {\n\n\t\t\tif ( uniform.value !== globalState ) {\n\n\t\t\t\tuniform.value = globalState;\n\t\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = numGlobalPlanes;\n\t\t\tscope.numIntersection = 0;\n\n\t\t}\n\n\t\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\t\tvar nPlanes = planes !== null ? planes.length : 0,\n\t\t\t\tdstArray = null;\n\n\t\t\tif ( nPlanes !== 0 ) {\n\n\t\t\t\tdstArray = uniform.value;\n\n\t\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\t\tvar flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( var i = 0, i4 = dstOffset;\n\t\t\t\t\t\t\t\t\t\ti !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\t\tplane.copy( planes[ i ] ).\n\t\t\t\t\t\t\t\tapplyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tuniform.value = dstArray;\n\t\t\t\tuniform.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tscope.numPlanes = nPlanes;\n\t\t\t\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * @author thespite / http://www.twitter.com/thespite\n\t */\n\n\tfunction WebGLUtils ( gl, extensions ) {\n\n\t\tfunction convert ( p ) {\n\n\t\t\tvar extension;\n\n\t\t\tif ( p === RepeatWrapping ) return gl.REPEAT;\n\t\t\tif ( p === ClampToEdgeWrapping ) return gl.CLAMP_TO_EDGE;\n\t\t\tif ( p === MirroredRepeatWrapping ) return gl.MIRRORED_REPEAT;\n\n\t\t\tif ( p === NearestFilter ) return gl.NEAREST;\n\t\t\tif ( p === NearestMipMapNearestFilter ) return gl.NEAREST_MIPMAP_NEAREST;\n\t\t\tif ( p === NearestMipMapLinearFilter ) return gl.NEAREST_MIPMAP_LINEAR;\n\n\t\t\tif ( p === LinearFilter ) return gl.LINEAR;\n\t\t\tif ( p === LinearMipMapNearestFilter ) return gl.LINEAR_MIPMAP_NEAREST;\n\t\t\tif ( p === LinearMipMapLinearFilter ) return gl.LINEAR_MIPMAP_LINEAR;\n\n\t\t\tif ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE;\n\t\t\tif ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4;\n\t\t\tif ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1;\n\t\t\tif ( p === UnsignedShort565Type ) return gl.UNSIGNED_SHORT_5_6_5;\n\n\t\t\tif ( p === ByteType ) return gl.BYTE;\n\t\t\tif ( p === ShortType ) return gl.SHORT;\n\t\t\tif ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT;\n\t\t\tif ( p === IntType ) return gl.INT;\n\t\t\tif ( p === UnsignedIntType ) return gl.UNSIGNED_INT;\n\t\t\tif ( p === FloatType ) return gl.FLOAT;\n\n\t\t\tif ( p === HalfFloatType ) {\n\n\t\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\t\tif ( extension !== null ) return extension.HALF_FLOAT_OES;\n\n\t\t\t}\n\n\t\t\tif ( p === AlphaFormat ) return gl.ALPHA;\n\t\t\tif ( p === RGBFormat ) return gl.RGB;\n\t\t\tif ( p === RGBAFormat ) return gl.RGBA;\n\t\t\tif ( p === LuminanceFormat ) return gl.LUMINANCE;\n\t\t\tif ( p === LuminanceAlphaFormat ) return gl.LUMINANCE_ALPHA;\n\t\t\tif ( p === DepthFormat ) return gl.DEPTH_COMPONENT;\n\t\t\tif ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL;\n\n\t\t\tif ( p === AddEquation ) return gl.FUNC_ADD;\n\t\t\tif ( p === SubtractEquation ) return gl.FUNC_SUBTRACT;\n\t\t\tif ( p === ReverseSubtractEquation ) return gl.FUNC_REVERSE_SUBTRACT;\n\n\t\t\tif ( p === ZeroFactor ) return gl.ZERO;\n\t\t\tif ( p === OneFactor ) return gl.ONE;\n\t\t\tif ( p === SrcColorFactor ) return gl.SRC_COLOR;\n\t\t\tif ( p === OneMinusSrcColorFactor ) return gl.ONE_MINUS_SRC_COLOR;\n\t\t\tif ( p === SrcAlphaFactor ) return gl.SRC_ALPHA;\n\t\t\tif ( p === OneMinusSrcAlphaFactor ) return gl.ONE_MINUS_SRC_ALPHA;\n\t\t\tif ( p === DstAlphaFactor ) return gl.DST_ALPHA;\n\t\t\tif ( p === OneMinusDstAlphaFactor ) return gl.ONE_MINUS_DST_ALPHA;\n\n\t\t\tif ( p === DstColorFactor ) return gl.DST_COLOR;\n\t\t\tif ( p === OneMinusDstColorFactor ) return gl.ONE_MINUS_DST_COLOR;\n\t\t\tif ( p === SrcAlphaSaturateFactor ) return gl.SRC_ALPHA_SATURATE;\n\n\t\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format ||\n\t\t\t\tp === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format ||\n\t\t\t\tp === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\t\tif ( extension !== null ) return extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t}\n\n\t\t\tif ( p === MinEquation || p === MaxEquation ) {\n\n\t\t\t\textension = extensions.get( 'EXT_blend_minmax' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === MinEquation ) return extension.MIN_EXT;\n\t\t\t\t\tif ( p === MaxEquation ) return extension.MAX_EXT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\t\tif ( extension !== null ) return extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t}\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t\treturn { convert: convert }\n\n\t}\n\n\t// import { Sphere } from '../math/Sphere';\n\t/**\n\t * @author supereggbert / http://www.paulbrunt.co.uk/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author szimek / https://github.com/szimek/\n\t * @author tschw\n\t */\n\n\tfunction WebGLRenderer( parameters ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer', REVISION );\n\n\t\tparameters = parameters || {};\n\n\t\tvar _canvas = parameters.canvas !== undefined ? parameters.canvas : document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' ),\n\t\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false,\n\t\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false;\n\n\t\tvar lightsArray = [];\n\t\tvar shadowsArray = [];\n\n\t\tvar currentRenderList = null;\n\n\t\tvar spritesArray = [];\n\t\tvar flaresArray = [];\n\n\t\t// public properties\n\n\t\tthis.domElement = _canvas;\n\t\tthis.context = null;\n\n\t\t// clearing\n\n\t\tthis.autoClear = true;\n\t\tthis.autoClearColor = true;\n\t\tthis.autoClearDepth = true;\n\t\tthis.autoClearStencil = true;\n\n\t\t// scene graph\n\n\t\tthis.sortObjects = true;\n\n\t\t// user-defined clipping\n\n\t\tthis.clippingPlanes = [];\n\t\tthis.localClippingEnabled = false;\n\n\t\t// physically based shading\n\n\t\tthis.gammaFactor = 2.0;\t// for backwards compatibility\n\t\tthis.gammaInput = false;\n\t\tthis.gammaOutput = false;\n\n\t\t// physical lights\n\n\t\tthis.physicallyCorrectLights = false;\n\n\t\t// tone mapping\n\n\t\tthis.toneMapping = LinearToneMapping;\n\t\tthis.toneMappingExposure = 1.0;\n\t\tthis.toneMappingWhitePoint = 1.0;\n\n\t\t// morphs\n\n\t\tthis.maxMorphTargets = 8;\n\t\tthis.maxMorphNormals = 4;\n\n\t\t// internal properties\n\n\t\tvar _this = this,\n\n\t\t\t_isContextLost = false,\n\n\t\t\t// internal state cache\n\n\t\t\t_currentRenderTarget = null,\n\t\t\t_currentFramebuffer = null,\n\t\t\t_currentMaterialId = - 1,\n\t\t\t_currentGeometryProgram = '',\n\n\t\t\t_currentCamera = null,\n\t\t\t_currentArrayCamera = null,\n\n\t\t\t_currentViewport = new Vector4(),\n\t\t\t_currentScissor = new Vector4(),\n\t\t\t_currentScissorTest = null,\n\n\t\t\t//\n\n\t\t\t_usedTextureUnits = 0,\n\n\t\t\t//\n\n\t\t\t_width = _canvas.width,\n\t\t\t_height = _canvas.height,\n\n\t\t\t_pixelRatio = 1,\n\n\t\t\t_viewport = new Vector4( 0, 0, _width, _height ),\n\t\t\t_scissor = new Vector4( 0, 0, _width, _height ),\n\t\t\t_scissorTest = false,\n\n\t\t\t// frustum\n\n\t\t\t_frustum = new Frustum(),\n\n\t\t\t// clipping\n\n\t\t\t_clipping = new WebGLClipping(),\n\t\t\t_clippingEnabled = false,\n\t\t\t_localClippingEnabled = false,\n\n\t\t\t// camera matrices cache\n\n\t\t\t_projScreenMatrix = new Matrix4(),\n\n\t\t\t_vector3 = new Vector3(),\n\n\t\t\t// info\n\n\t\t\t_infoMemory = {\n\t\t\t\tgeometries: 0,\n\t\t\t\ttextures: 0\n\t\t\t},\n\n\t\t\t_infoRender = {\n\n\t\t\t\tframe: 0,\n\t\t\t\tcalls: 0,\n\t\t\t\tvertices: 0,\n\t\t\t\tfaces: 0,\n\t\t\t\tpoints: 0\n\n\t\t\t};\n\n\t\tthis.info = {\n\n\t\t\trender: _infoRender,\n\t\t\tmemory: _infoMemory,\n\t\t\tprograms: null\n\n\t\t};\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\t// initialize\n\n\t\tvar _gl;\n\n\t\ttry {\n\n\t\t\tvar contextAttributes = {\n\t\t\t\talpha: _alpha,\n\t\t\t\tdepth: _depth,\n\t\t\t\tstencil: _stencil,\n\t\t\t\tantialias: _antialias,\n\t\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer\n\t\t\t};\n\n\t\t\t_gl = _context || _canvas.getContext( 'webgl', contextAttributes ) || _canvas.getContext( 'experimental-webgl', contextAttributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( _canvas.getContext( 'webgl' ) !== null ) {\n\n\t\t\t\t\tthrow 'Error creating WebGL context with your selected attributes.';\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow 'Error creating WebGL context.';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\n\n\t\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\n\n\t\t\t\t_gl.getShaderPrecisionFormat = function () {\n\n\t\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\t_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer: ' + error );\n\n\t\t}\n\n\t\tvar extensions, capabilities, state;\n\t\tvar properties, textures, attributes, geometries, objects, lights;\n\t\tvar programCache, renderLists;\n\n\t\tvar background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\t\tvar flareRenderer, spriteRenderer;\n\n\t\tvar utils;\n\n\t\tfunction initGLContext() {\n\n\t\t\textensions = new WebGLExtensions( _gl );\n\t\t\textensions.get( 'WEBGL_depth_texture' );\n\t\t\textensions.get( 'OES_texture_float' );\n\t\t\textensions.get( 'OES_texture_float_linear' );\n\t\t\textensions.get( 'OES_texture_half_float' );\n\t\t\textensions.get( 'OES_texture_half_float_linear' );\n\t\t\textensions.get( 'OES_standard_derivatives' );\n\t\t\textensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\tif ( extensions.get( 'OES_element_index_uint' ) ) {\n\n\t\t\t\tBufferGeometry.MaxIndex = 4294967296;\n\n\t\t\t}\n\n\t\t\tutils = new WebGLUtils( _gl, extensions );\n\n\t\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\t\tstate = new WebGLState( _gl, extensions, utils );\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );\n\n\t\t\tproperties = new WebGLProperties();\n\t\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, _infoMemory );\n\t\t\tattributes = new WebGLAttributes( _gl );\n\t\t\tgeometries = new WebGLGeometries( _gl, attributes, _infoMemory );\n\t\t\tobjects = new WebGLObjects( geometries, _infoRender );\n\t\t\tmorphtargets = new WebGLMorphtargets( _gl );\n\t\t\tprogramCache = new WebGLPrograms( _this, extensions, capabilities );\n\t\t\tlights = new WebGLLights();\n\t\t\trenderLists = new WebGLRenderLists();\n\n\t\t\tbackground = new WebGLBackground( _this, state, geometries, _premultipliedAlpha );\n\n\t\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, _infoRender );\n\t\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, _infoRender );\n\n\t\t\tflareRenderer = new WebGLFlareRenderer( _this, _gl, state, textures, capabilities );\n\t\t\tspriteRenderer = new WebGLSpriteRenderer( _this, _gl, state, textures, capabilities );\n\n\t\t\t_this.info.programs = programCache.programs;\n\n\t\t\t_this.context = _gl;\n\t\t\t_this.capabilities = capabilities;\n\t\t\t_this.extensions = extensions;\n\t\t\t_this.properties = properties;\n\t\t\t_this.renderLists = renderLists;\n\t\t\t_this.state = state;\n\n\t\t}\n\n\t\tinitGLContext();\n\n\t\t// vr\n\n\t\tvar vr = new WebVRManager( _this );\n\n\t\tthis.vr = vr;\n\n\t\t// shadow map\n\n\t\tvar shadowMap = new WebGLShadowMap( _this, objects, capabilities.maxTextureSize );\n\n\t\tthis.shadowMap = shadowMap;\n\n\t\t// API\n\n\t\tthis.getContext = function () {\n\n\t\t\treturn _gl;\n\n\t\t};\n\n\t\tthis.getContextAttributes = function () {\n\n\t\t\treturn _gl.getContextAttributes();\n\n\t\t};\n\n\t\tthis.forceContextLoss = function () {\n\n\t\t\tvar extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.loseContext();\n\n\t\t};\n\n\t\tthis.forceContextRestore = function () {\n\n\t\t\tvar extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.restoreContext();\n\n\t\t};\n\n\t\tthis.getPixelRatio = function () {\n\n\t\t\treturn _pixelRatio;\n\n\t\t};\n\n\t\tthis.setPixelRatio = function ( value ) {\n\n\t\t\tif ( value === undefined ) return;\n\n\t\t\t_pixelRatio = value;\n\n\t\t\tthis.setSize( _width, _height, false );\n\n\t\t};\n\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\n\t\t};\n\n\t\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\t\tvar device = vr.getDevice();\n\n\t\t\tif ( device && device.isPresenting ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\n\t\t\tif ( updateStyle !== false ) {\n\t\t\t\t\n\t\t\t\t// gm^vizor.io; moved down from before the block\n\t\t\t\t_canvas.width = width * _pixelRatio;\n\t\t\t\t_canvas.height = height * _pixelRatio;\n\n\t\t\t\t_canvas.style.width = width + 'px';\n\t\t\t\t_canvas.style.height = height + 'px';\n\n\t\t\t}\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\n\t\tthis.getDrawingBufferSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width * _pixelRatio,\n\t\t\t\theight: _height * _pixelRatio\n\t\t\t};\n\n\t\t};\n\n\t\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_pixelRatio = pixelRatio;\n\n\t\t\t_canvas.width = width * pixelRatio;\n\t\t\t_canvas.height = height * pixelRatio;\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t\t_viewport.set( x, _height - y - height, width, height );\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ) );\n\n\t\t};\n\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\t_scissor.set( x, _height - y - height, width, height );\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ) );\n\n\t\t};\n\n\t\tthis.setScissorTest = function ( boolean ) {\n\n\t\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t\t};\n\n\t\t// Clearing\n\n\t\tthis.getClearColor = background.getClearColor;\n\t\tthis.setClearColor = background.setClearColor;\n\t\tthis.getClearAlpha = background.getClearAlpha;\n\t\tthis.setClearAlpha = background.setClearAlpha;\n\n\t\tthis.clear = function ( color, depth, stencil ) {\n\n\t\t\tvar bits = 0;\n\n\t\t\tif ( color === undefined || color ) bits |= _gl.COLOR_BUFFER_BIT;\n\t\t\tif ( depth === undefined || depth ) bits |= _gl.DEPTH_BUFFER_BIT;\n\t\t\tif ( stencil === undefined || stencil ) bits |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t_gl.clear( bits );\n\n\t\t};\n\n\t\tthis.clearColor = function () {\n\n\t\t\tthis.clear( true, false, false );\n\n\t\t};\n\n\t\tthis.clearDepth = function () {\n\n\t\t\tthis.clear( false, true, false );\n\n\t\t};\n\n\t\tthis.clearStencil = function () {\n\n\t\t\tthis.clear( false, false, true );\n\n\t\t};\n\n\t\tthis.clearTarget = function ( renderTarget, color, depth, stencil ) {\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\t\t\tthis.clear( color, depth, stencil );\n\n\t\t};\n\n\t\t//\n\n\t\tthis.dispose = function () {\n\n\t\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\t_canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\n\t\t\trenderLists.dispose();\n\n\t\t\tvr.dispose();\n\n\t\t};\n\n\t\t// Events\n\n\t\tfunction onContextLost( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tconsole.log( 'THREE.WebGLRenderer: Context Lost.' );\n\n\t\t\t_isContextLost = true;\n\n\t\t}\n\n\t\tfunction onContextRestore( event ) {\n\n\t\t\tconsole.log( 'THREE.WebGLRenderer: Context Restored.' );\n\n\t\t\t_isContextLost = false;\n\n\t\t\tinitGLContext();\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tvar material = event.target;\n\n\t\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tdeallocateMaterial( material );\n\n\t\t}\n\n\t\t// Buffer deallocation\n\n\t\tfunction deallocateMaterial( material ) {\n\n\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\tproperties.remove( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReference( material ) {\n\n\t\t\tvar programInfo = properties.get( material ).program;\n\n\t\t\tmaterial.program = undefined;\n\n\t\t\tif ( programInfo !== undefined ) {\n\n\t\t\t\tprogramCache.releaseProgram( programInfo );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tfunction renderObjectImmediate( object, program, material ) {\n\n\t\t\tobject.render( function ( object ) {\n\n\t\t\t\t_this.renderBufferImmediate( object, program, material );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tthis.renderBufferImmediate = function ( object, program, material ) {\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar buffers = properties.get( object );\n\n\t\t\tif ( object.hasPositions && ! buffers.position ) buffers.position = _gl.createBuffer();\n\t\t\tif ( object.hasNormals && ! buffers.normal ) buffers.normal = _gl.createBuffer();\n\t\t\tif ( object.hasUvs && ! buffers.uv ) buffers.uv = _gl.createBuffer();\n\t\t\tif ( object.hasColors && ! buffers.color ) buffers.color = _gl.createBuffer();\n\n\t\t\tvar programAttributes = program.getAttributes();\n\n\t\t\tif ( object.hasPositions ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.position );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.positionArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( programAttributes.position );\n\t\t\t\t_gl.vertexAttribPointer( programAttributes.position, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasNormals ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.normal );\n\n\t\t\t\tif ( ! material.isMeshPhongMaterial &&\n\t\t\t\t\t! material.isMeshStandardMaterial &&\n\t\t\t\t\t! material.isMeshNormalMaterial &&\n\t\t\t\t\tmaterial.flatShading === true ) {\n\n\t\t\t\t\tfor ( var i = 0, l = object.count * 3; i < l; i += 9 ) {\n\n\t\t\t\t\t\tvar array = object.normalArray;\n\n\t\t\t\t\t\tvar nx = ( array[ i + 0 ] + array[ i + 3 ] + array[ i + 6 ] ) / 3;\n\t\t\t\t\t\tvar ny = ( array[ i + 1 ] + array[ i + 4 ] + array[ i + 7 ] ) / 3;\n\t\t\t\t\t\tvar nz = ( array[ i + 2 ] + array[ i + 5 ] + array[ i + 8 ] ) / 3;\n\n\t\t\t\t\t\tarray[ i + 0 ] = nx;\n\t\t\t\t\t\tarray[ i + 1 ] = ny;\n\t\t\t\t\t\tarray[ i + 2 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 3 ] = nx;\n\t\t\t\t\t\tarray[ i + 4 ] = ny;\n\t\t\t\t\t\tarray[ i + 5 ] = nz;\n\n\t\t\t\t\t\tarray[ i + 6 ] = nx;\n\t\t\t\t\t\tarray[ i + 7 ] = ny;\n\t\t\t\t\t\tarray[ i + 8 ] = nz;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.normalArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( programAttributes.normal );\n\n\t\t\t\t_gl.vertexAttribPointer( programAttributes.normal, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasUvs && material.map ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.uv );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.uvArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( programAttributes.uv );\n\n\t\t\t\t_gl.vertexAttribPointer( programAttributes.uv, 2, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( object.hasColors && material.vertexColors !== NoColors ) {\n\n\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffers.color );\n\t\t\t\t_gl.bufferData( _gl.ARRAY_BUFFER, object.colorArray, _gl.DYNAMIC_DRAW );\n\n\t\t\t\tstate.enableAttribute( programAttributes.color );\n\n\t\t\t\t_gl.vertexAttribPointer( programAttributes.color, 3, _gl.FLOAT, false, 0, 0 );\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t\t_gl.drawArrays( _gl.TRIANGLES, 0, object.count );\n\n\t\t\tobject.count = 0;\n\n\t\t};\n\n\t\tthis.renderBufferDirect = function ( camera, fog, geometry, material, object, group ) {\n\n\t\t\tstate.setMaterial( material );\n\n\t\t\tvar program = setProgram( camera, fog, material, object );\n\t\t\tvar geometryProgram = geometry.id + '_' + program.id + '_' + ( material.wireframe === true );\n\n\t\t\tvar updateBuffers = false;\n\n\t\t\tif ( geometryProgram !== _currentGeometryProgram ) {\n\n\t\t\t\t_currentGeometryProgram = geometryProgram;\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\tif ( object.morphTargetInfluences ) {\n\n\t\t\t\tmorphtargets.update( object, geometry, material, program );\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar index = geometry.index;\n\t\t\tvar position = geometry.attributes.position;\n\t\t\tvar rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\tvar attribute;\n\t\t\tvar renderer = bufferRenderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tattribute = attributes.get( index );\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( attribute );\n\n\t\t\t}\n\n\t\t\tif ( updateBuffers ) {\n\n\t\t\t\tsetupVertexAttributes( material, program, geometry );\n\n\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t_gl.bindBuffer( _gl.ELEMENT_ARRAY_BUFFER, attribute.buffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tvar dataCount = 0;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdataCount = index.count;\n\n\t\t\t} else if ( position !== undefined ) {\n\n\t\t\t\tdataCount = position.count;\n\n\t\t\t}\n\n\t\t\tvar rangeStart = geometry.drawRange.start * rangeFactor;\n\t\t\tvar rangeCount = geometry.drawRange.count * rangeFactor;\n\n\t\t\tvar groupStart = group !== null ? group.start * rangeFactor : 0;\n\t\t\tvar groupCount = group !== null ? group.count * rangeFactor : Infinity;\n\n\t\t\tvar drawStart = Math.max( rangeStart, groupStart );\n\t\t\tvar drawEnd = Math.min( dataCount, rangeStart + rangeCount, groupStart + groupCount ) - 1;\n\n\t\t\tvar drawCount = Math.max( 0, drawEnd - drawStart + 1 );\n\n\t\t\tif ( drawCount === 0 ) return;\n\n\t\t\t//\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( object.drawMode ) {\n\n\t\t\t\t\t\tcase TrianglesDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleStripDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_STRIP );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TriangleFanDrawMode:\n\t\t\t\t\t\t\trenderer.setMode( _gl.TRIANGLE_FAN );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tvar lineWidth = material.linewidth;\n\n\t\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_LOOP );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints ) {\n\n\t\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t\t}\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tif ( geometry.maxInstancedCount > 0 ) {\n\n\t\t\t\t\trenderer.renderInstances( geometry, drawStart, drawCount );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction setupVertexAttributes( material, program, geometry, startIndex ) {\n\n\t\t\tif ( geometry && geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tif ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( startIndex === undefined ) startIndex = 0;\n\n\t\t\tstate.initAttributes();\n\n\t\t\tvar geometryAttributes = geometry.attributes;\n\n\t\t\tvar programAttributes = program.getAttributes();\n\n\t\t\tvar materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\t\tfor ( var name in programAttributes ) {\n\n\t\t\t\tvar programAttribute = programAttributes[ name ];\n\n\t\t\t\tif ( programAttribute >= 0 ) {\n\n\t\t\t\t\tvar geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\t\tvar normalized = geometryAttribute.normalized;\n\t\t\t\t\t\tvar size = geometryAttribute.itemSize;\n\n\t\t\t\t\t\tvar attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\t\tvar buffer = attribute.buffer;\n\t\t\t\t\t\tvar type = attribute.type;\n\t\t\t\t\t\tvar bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\t\tvar data = geometryAttribute.data;\n\t\t\t\t\t\t\tvar stride = data.stride;\n\t\t\t\t\t\t\tvar offset = geometryAttribute.offset;\n\n\t\t\t\t\t\t\tif ( data && data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, data.meshPerAttribute );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, stride * bytesPerElement, ( startIndex * stride + offset ) * bytesPerElement );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\t\tstate.enableAttributeAndDivisor( programAttribute, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\t\tif ( geometry.maxInstancedCount === undefined ) {\n\n\t\t\t\t\t\t\t\t\tgeometry.maxInstancedCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.enableAttribute( programAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_gl.bindBuffer( _gl.ARRAY_BUFFER, buffer );\n\t\t\t\t\t\t\t_gl.vertexAttribPointer( programAttribute, size, type, normalized, 0, startIndex * size * bytesPerElement );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\t\tvar value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib2fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib3fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib4fv( programAttribute, value );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t_gl.vertexAttrib1fv( programAttribute, value );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.disableUnusedAttributes();\n\n\t\t}\n\n\t\t// Compile\n\n\t\tthis.compile = function ( scene, camera ) {\n\n\t\t\tlightsArray.length = 0;\n\t\t\tshadowsArray.length = 0;\n\n\t\t\tscene.traverse( function ( object ) {\n\n\t\t\t\tif ( object.isLight ) {\n\n\t\t\t\t\tlightsArray.push( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tshadowsArray.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tlights.setup( lightsArray, shadowsArray, camera );\n\n\t\t\tscene.traverse( function ( object ) {\n\n\t\t\t\tif ( object.material ) {\n\n\t\t\t\t\tif ( Array.isArray( object.material ) ) {\n\n\t\t\t\t\t\tfor ( var i = 0; i < object.material.length; i ++ ) {\n\n\t\t\t\t\t\t\tinitMaterial( object.material[ i ], scene.fog, object );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tinitMaterial( object.material, scene.fog, object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tvar isAnimating = false;\n\t\tvar onAnimationFrame = null;\n\n\t\tfunction start() {\n\n\t\t\tif ( isAnimating ) return;\n\t\t\t( vr.getDevice() || window ).requestAnimationFrame( loop );\n\t\t\tisAnimating = true;\n\n\t\t}\n\n\t\tfunction loop( time ) {\n\n\t\t\tif ( onAnimationFrame !== null ) onAnimationFrame( time );\n\t\t\t( vr.getDevice() || window ).requestAnimationFrame( loop );\n\n\t\t}\n\n\t\tthis.animate = function ( callback ) {\n\n\t\t\tonAnimationFrame = callback;\n\t\t\tstart();\n\n\t\t};\n\n\t\t// Rendering\n\n\t\tthis.render = function ( scene, camera, renderTarget, forceClear ) {\n\n\t\t\tif ( ! ( camera && camera.isCamera ) ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( _isContextLost ) return;\n\n\t\t\t// reset caching for this frame\n\n\t\t\t_currentGeometryProgram = '';\n\t\t\t_currentMaterialId = - 1;\n\t\t\t_currentCamera = null;\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.autoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null ) camera.updateMatrixWorld();\n\n\t\t\tif ( vr.enabled ) {\n\n\t\t\t\tcamera = vr.getCamera( camera );\n\n\t\t\t}\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromMatrix( _projScreenMatrix );\n\n\t\t\tlightsArray.length = 0;\n\t\t\tshadowsArray.length = 0;\n\n\t\t\tspritesArray.length = 0;\n\t\t\tflaresArray.length = 0;\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = _clipping.init( this.clippingPlanes, _localClippingEnabled, camera );\n\n\t\t\tcurrentRenderList = renderLists.get( scene, camera );\n\t\t\tcurrentRenderList.init();\n\n\t\t\tprojectObject( scene, camera, _this.sortObjects );\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\tcurrentRenderList.sort();\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _clippingEnabled ) _clipping.beginShadows();\n\n\t\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\t\tlights.setup( lightsArray, shadowsArray, camera );\n\n\t\t\tif ( _clippingEnabled ) _clipping.endShadows();\n\n\t\t\t//\n\n\t\t\t_infoRender.frame ++;\n\t\t\t_infoRender.calls = 0;\n\t\t\t_infoRender.vertices = 0;\n\t\t\t_infoRender.faces = 0;\n\t\t\t_infoRender.points = 0;\n\n\t\t\tif ( renderTarget === undefined ) {\n\n\t\t\t\trenderTarget = null;\n\n\t\t\t}\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\n\t\t\t//\n\n\t\t\tbackground.render( currentRenderList, scene, camera, forceClear );\n\n\t\t\t// render scene\n\n\t\t\tvar opaqueObjects = currentRenderList.opaque;\n\t\t\tvar transparentObjects = currentRenderList.transparent;\n\n\t\t\tif ( scene.overrideMaterial ) {\n\n\t\t\t\tvar overrideMaterial = scene.overrideMaterial;\n\n\t\t\t\tif ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera, overrideMaterial );\n\t\t\t\tif ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera, overrideMaterial );\n\n\t\t\t} else {\n\n\t\t\t\t// opaque pass (front-to-back order)\n\n\t\t\t\tif ( opaqueObjects.length ) renderObjects( opaqueObjects, scene, camera );\n\n\t\t\t\t// transparent pass (back-to-front order)\n\n\t\t\t\tif ( transparentObjects.length ) renderObjects( transparentObjects, scene, camera );\n\n\t\t\t}\n\n\t\t\t// custom renderers\n\n\t\t\tspriteRenderer.render( spritesArray, scene, camera );\n\t\t\tflareRenderer.render( flaresArray, scene, camera, _currentViewport );\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\ttextures.updateRenderTargetMipmap( renderTarget );\n\n\t\t\t}\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\tstate.setPolygonOffset( false );\n\n\t\t\tif ( vr.enabled ) {\n\n\t\t\t\tvr.submitFrame();\n\n\t\t\t}\n\n\t\t\t// _gl.finish();\n\n\t\t};\n\n\t\t/*\n\t\t// TODO Duplicated code (Frustum)\n\n\t\tvar _sphere = new Sphere();\n\n\t\tfunction isObjectViewable( object ) {\n\n\t\t\tvar geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null )\n\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t_sphere.copy( geometry.boundingSphere ).\n\t\t\tapplyMatrix4( object.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSpriteViewable( sprite ) {\n\n\t\t\t_sphere.center.set( 0, 0, 0 );\n\t\t\t_sphere.radius = 0.7071067811865476;\n\t\t\t_sphere.applyMatrix4( sprite.matrixWorld );\n\n\t\t\treturn isSphereViewable( _sphere );\n\n\t\t}\n\n\t\tfunction isSphereViewable( sphere ) {\n\n\t\t\tif ( ! _frustum.intersectsSphere( sphere ) ) return false;\n\n\t\t\tvar numPlanes = _clipping.numPlanes;\n\n\t\t\tif ( numPlanes === 0 ) return true;\n\n\t\t\tvar planes = _this.clippingPlanes,\n\n\t\t\t\tcenter = sphere.center,\n\t\t\t\tnegRad = - sphere.radius,\n\t\t\t\ti = 0;\n\n\t\t\tdo {\n\n\t\t\t\t// out when deeper than radius in the negative halfspace\n\t\t\t\tif ( planes[ i ].distanceToPoint( center ) < negRad ) return false;\n\n\t\t\t} while ( ++ i !== numPlanes );\n\n\t\t\treturn true;\n\n\t\t}\n\t\t*/\n\n\t\tfunction projectObject( object, camera, sortObjects ) {\n\n\t\t\tif ( ! object.visible ) return;\n\n\t\t\tvar visible = object.layers.test( camera.layers );\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isLight ) {\n\n\t\t\t\t\tlightsArray.push( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tshadowsArray.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\t\tspritesArray.push( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isLensFlare ) {\n\n\t\t\t\t\tflaresArray.push( object );\n\n\t\t\t\t} else if ( object.isImmediateRenderObject ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentRenderList.push( object, null, object.material, _vector3.z, null );\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar geometry = objects.update( object );\n\t\t\t\t\t\tvar material = object.material;\n\n\t\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\t\tvar groups = geometry.groups;\n\n\t\t\t\t\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\tvar group = groups[ i ];\n\t\t\t\t\t\t\t\tvar groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, _vector3.z, group );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, _vector3.z, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, sortObjects );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera, overrideMaterial ) {\n\n\t\t\tfor ( var i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tvar renderItem = renderList[ i ];\n\n\t\t\t\tvar object = renderItem.object;\n\t\t\t\tvar geometry = renderItem.geometry;\n\t\t\t\tvar material = overrideMaterial === undefined ? renderItem.material : overrideMaterial;\n\t\t\t\tvar group = renderItem.group;\n\n\t\t\t\tif ( camera.isArrayCamera ) {\n\n\t\t\t\t\t_currentArrayCamera = camera;\n\n\t\t\t\t\tvar cameras = camera.cameras;\n\n\t\t\t\t\tfor ( var j = 0, jl = cameras.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar camera2 = cameras[ j ];\n\n\t\t\t\t\t\tif ( object.layers.test( camera2.layers ) ) {\n\n\t\t\t\t\t\t\tvar bounds = camera2.bounds;\n\n\t\t\t\t\t\t\tvar x = bounds.x * _width;\n\t\t\t\t\t\t\tvar y = bounds.y * _height;\n\t\t\t\t\t\t\tvar width = bounds.z * _width;\n\t\t\t\t\t\t\tvar height = bounds.w * _height;\n\n\t\t\t\t\t\t\tstate.viewport( _currentViewport.set( x, y, width, height ).multiplyScalar( _pixelRatio ) );\n\n\t\t\t\t\t\t\trenderObject( object, scene, camera2, geometry, material, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_currentArrayCamera = null;\n\n\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\tif ( object.isImmediateRenderObject ) {\n\n\t\t\t\tstate.setMaterial( material );\n\n\t\t\t\tvar program = setProgram( camera, scene.fog, material, object );\n\n\t\t\t\t_currentGeometryProgram = '';\n\n\t\t\t\trenderObjectImmediate( object, program, material );\n\n\t\t\t} else {\n\n\t\t\t\t_this.renderBufferDirect( camera, scene.fog, geometry, material, object, group );\n\n\t\t\t}\n\n\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\t\t}\n\n\t\tfunction initMaterial( material, fog, object ) {\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tvar parameters = programCache.getParameters(\n\t\t\t\tmaterial, lights.state, shadowsArray, fog, _clipping.numPlanes, _clipping.numIntersection, object );\n\n\t\t\tvar code = programCache.getProgramCode( material, parameters );\n\n\t\t\tvar program = materialProperties.program;\n\t\t\tvar programChange = true;\n\n\t\t\tif ( program === undefined ) {\n\n\t\t\t\t// new material\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t} else if ( program.code !== code ) {\n\n\t\t\t\t// changed glsl or parameters\n\t\t\t\treleaseMaterialProgramReference( material );\n\n\t\t\t} else if ( parameters.shaderID !== undefined ) {\n\n\t\t\t\t// same glsl and uniform list\n\t\t\t\treturn;\n\n\t\t\t} else {\n\n\t\t\t\t// only rebuild uniform list\n\t\t\t\tprogramChange = false;\n\n\t\t\t}\n\n\t\t\tif ( programChange ) {\n\n\t\t\t\tif ( parameters.shaderID ) {\n\n\t\t\t\t\tvar shader = ShaderLib[ parameters.shaderID ];\n\n\t\t\t\t\tmaterialProperties.shader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: UniformsUtils.clone( shader.uniforms ),\n\t\t\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\t\t\tfragmentShader: shader.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmaterialProperties.shader = {\n\t\t\t\t\t\tname: material.type,\n\t\t\t\t\t\tuniforms: material.uniforms,\n\t\t\t\t\t\tvertexShader: material.vertexShader,\n\t\t\t\t\t\tfragmentShader: material.fragmentShader\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.onBeforeCompile( materialProperties.shader );\n\n\t\t\t\tprogram = programCache.acquireProgram( material, materialProperties.shader, parameters, code );\n\n\t\t\t\tmaterialProperties.program = program;\n\t\t\t\tmaterial.program = program;\n\n\t\t\t}\n\n\t\t\tvar programAttributes = program.getAttributes();\n\n\t\t\tif ( material.morphTargets ) {\n\n\t\t\t\tmaterial.numSupportedMorphTargets = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphTargets; i ++ ) {\n\n\t\t\t\t\tif ( programAttributes[ 'morphTarget' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphTargets ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.morphNormals ) {\n\n\t\t\t\tmaterial.numSupportedMorphNormals = 0;\n\n\t\t\t\tfor ( var i = 0; i < _this.maxMorphNormals; i ++ ) {\n\n\t\t\t\t\tif ( programAttributes[ 'morphNormal' + i ] >= 0 ) {\n\n\t\t\t\t\t\tmaterial.numSupportedMorphNormals ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar uniforms = materialProperties.shader.uniforms;\n\n\t\t\tif ( ! material.isShaderMaterial &&\n\t\t\t\t! material.isRawShaderMaterial ||\n\t\t\t\tmaterial.clipping === true ) {\n\n\t\t\t\tmaterialProperties.numClippingPlanes = _clipping.numPlanes;\n\t\t\t\tmaterialProperties.numIntersection = _clipping.numIntersection;\n\t\t\t\tuniforms.clippingPlanes = _clipping.uniform;\n\n\t\t\t}\n\n\t\t\tmaterialProperties.fog = fog;\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.lightsHash = lights.state.hash;\n\n\t\t\tif ( material.lights ) {\n\n\t\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\t\tuniforms.spotShadowMatrix.value = lights.state.spotShadowMatrix;\n\t\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t\t}\n\n\t\t\tvar progUniforms = materialProperties.program.getUniforms(),\n\t\t\t\tuniformsList =\n\t\t\t\t\tWebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t\t}\n\n\t\tfunction setProgram( camera, fog, material, object ) {\n\n\t\t\t_usedTextureUnits = 0;\n\n\t\t\tvar materialProperties = properties.get( material );\n\n\t\t\tif ( _clippingEnabled ) {\n\n\t\t\t\tif ( _localClippingEnabled || camera !== _currentCamera ) {\n\n\t\t\t\t\tvar useCache =\n\t\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t\t// (#8465, #8379)\n\t\t\t\t\t_clipping.setState(\n\t\t\t\t\t\tmaterial.clippingPlanes, material.clipIntersection, material.clipShadows,\n\t\t\t\t\t\tcamera, materialProperties, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate === false ) {\n\n\t\t\t\tif ( materialProperties.program === undefined ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.fog && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( material.lights && materialProperties.lightsHash !== lights.state.hash ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t\t( materialProperties.numClippingPlanes !== _clipping.numPlanes ||\n\t\t\t\t\tmaterialProperties.numIntersection !== _clipping.numIntersection ) ) {\n\n\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.needsUpdate ) {\n\n\t\t\t\tinitMaterial( material, fog, object );\n\t\t\t\tmaterial.needsUpdate = false;\n\n\t\t\t}\n\n\t\t\tvar refreshProgram = false;\n\t\t\tvar refreshMaterial = false;\n\t\t\tvar refreshLights = false;\n\n\t\t\tvar program = materialProperties.program,\n\t\t\t\tp_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.shader.uniforms;\n\n\t\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\t\trefreshProgram = true;\n\t\t\t\trefreshMaterial = true;\n\t\t\t\trefreshLights = true;\n\n\t\t\t}\n\n\t\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t\t_currentMaterialId = material.id;\n\n\t\t\t\trefreshMaterial = true;\n\n\t\t\t}\n\n\t\t\tif ( refreshProgram || camera !== _currentCamera ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\n\t\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\t\t\t\t// Avoid unneeded uniform updates per ArrayCamera's sub-camera\n\n\t\t\t\tif ( _currentCamera !== ( _currentArrayCamera || camera ) ) {\n\n\t\t\t\t\t_currentCamera = ( _currentArrayCamera || camera );\n\n\t\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t\t}\n\n\t\t\t\t// load material specific uniforms\n\t\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.envMap ) {\n\n\t\t\t\t\tvar uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isShaderMaterial ||\n\t\t\t\t\tmaterial.skinning ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// skinning uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone texture must go before other textures\n\t\t\t// not sure why, but otherwise weird things happen\n\n\t\t\tif ( material.skinning ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\t\tvar skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tvar bones = skeleton.bones;\n\n\t\t\t\t\tif ( capabilities.floatVertexTextures ) {\n\n\t\t\t\t\t\tif ( skeleton.boneTexture === undefined ) {\n\n\t\t\t\t\t\t\t// layout (1 matrix = 4 pixels)\n\t\t\t\t\t\t\t//      RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t\t\t\t\t\t//  with  8x8  pixel texture max   16 bones * 4 pixels =  (8 * 8)\n\t\t\t\t\t\t\t//       16x16 pixel texture max   64 bones * 4 pixels = (16 * 16)\n\t\t\t\t\t\t\t//       32x32 pixel texture max  256 bones * 4 pixels = (32 * 32)\n\t\t\t\t\t\t\t//       64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\n\t\t\t\t\t\t\tvar size = Math.sqrt( bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\t\t\t\t\t\tsize = _Math.nextPowerOfTwo( Math.ceil( size ) );\n\t\t\t\t\t\t\tsize = Math.max( size, 4 );\n\n\t\t\t\t\t\t\tvar boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\t\t\t\t\t\tboneMatrices.set( skeleton.boneMatrices ); // copy current values\n\n\t\t\t\t\t\t\tvar boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );\n\n\t\t\t\t\t\t\tskeleton.boneMatrices = boneMatrices;\n\t\t\t\t\t\t\tskeleton.boneTexture = boneTexture;\n\t\t\t\t\t\t\tskeleton.boneTextureSize = size;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture );\n\t\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tp_uniforms.setOptional( _gl, skeleton, 'boneMatrices' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\t\t\t\tp_uniforms.setValue( _gl, 'toneMappingWhitePoint', _this.toneMappingWhitePoint );\n\n\t\t\t\tif ( material.lights ) {\n\n\t\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t\t// values\n\t\t\t\t\t//\n\t\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t\t// the GL state when required\n\n\t\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh uniforms common to several materials\n\n\t\t\t\tif ( fog && material.fog ) {\n\n\t\t\t\t\trefreshUniformsFog( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\t\t\t\t\trefreshUniformsLambert( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\t\tif ( material.isMeshToonMaterial ) {\n\n\t\t\t\t\t\trefreshUniformsToon( m_uniforms, material );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\trefreshUniformsPhong( m_uniforms, material );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\n\t\t\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\t\t\trefreshUniformsPhysical( m_uniforms, material );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\trefreshUniformsStandard( m_uniforms, material );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\t\t\t\t\trefreshUniformsDepth( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\t\t\t\t\trefreshUniformsDistance( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\t\t\trefreshUniformsCommon( m_uniforms, material );\n\t\t\t\t\trefreshUniformsNormal( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\t\t\trefreshUniformsLine( m_uniforms, material );\n\n\t\t\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\t\t\trefreshUniformsDash( m_uniforms, material );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\t\t\trefreshUniformsPoints( m_uniforms, material );\n\n\t\t\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\t\t\tm_uniforms.color.value = material.color;\n\t\t\t\t\tm_uniforms.opacity.value = material.opacity;\n\n\t\t\t\t}\n\n\t\t\t\t// RectAreaLight Texture\n\t\t\t\t// TODO (mrdoob): Find a nicer implementation\n\n\t\t\t\tif ( m_uniforms.ltcMat !== undefined ) m_uniforms.ltcMat.value = UniformsLib.LTC_MAT_TEXTURE;\n\t\t\t\tif ( m_uniforms.ltcMag !== undefined ) m_uniforms.ltcMag.value = UniformsLib.LTC_MAG_TEXTURE;\n\n\t\t\t\tWebGLUniforms.upload(\n\t\t\t\t\t_gl, materialProperties.uniformsList, m_uniforms, _this );\n\n\t\t\t}\n\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// Uniforms (refresh uniforms objects)\n\n\t\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t\tif ( material.color ) {\n\n\t\t\t\tuniforms.diffuse.value = material.color;\n\n\t\t\t}\n\n\t\t\tif ( material.emissive ) {\n\n\t\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t\t}\n\n\t\t\tif ( material.map ) {\n\n\t\t\t\tuniforms.map.value = material.map;\n\n\t\t\t}\n\n\t\t\tif ( material.alphaMap ) {\n\n\t\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\t}\n\n\t\t\tif ( material.specularMap ) {\n\n\t\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t\t}\n\n\t\t\tif ( material.envMap ) {\n\n\t\t\t\tuniforms.envMap.value = material.envMap;\n\n\t\t\t\t// don't flip CubeTexture envMaps, flip everything else:\n\t\t\t\t//  WebGLRenderTargetCube will be flipped for backwards compatibility\n\t\t\t\t//  WebGLRenderTargetCube.texture will be flipped because it's a Texture and NOT a CubeTexture\n\t\t\t\t// this check must be handled differently, or removed entirely, if WebGLRenderTargetCube uses a CubeTexture in the future\n\t\t\t\tuniforms.flipEnvMap.value = ( ! ( material.envMap && material.envMap.isCubeTexture ) ) ? 1 : - 1;\n\n\t\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t\t}\n\n\t\t\tif ( material.lightMap ) {\n\n\t\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\t}\n\n\t\t\tif ( material.aoMap ) {\n\n\t\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\t}\n\n\t\t\t// uv repeat and offset setting priorities\n\t\t\t// 1. color map\n\t\t\t// 2. specular map\n\t\t\t// 3. normal map\n\t\t\t// 4. bump map\n\t\t\t// 5. alpha map\n\t\t\t// 6. emissive map\n\n\t\t\tvar uvScaleMap;\n\n\t\t\tif ( material.map ) {\n\n\t\t\t\tuvScaleMap = material.map;\n\n\t\t\t} else if ( material.specularMap ) {\n\n\t\t\t\tuvScaleMap = material.specularMap;\n\n\t\t\t} else if ( material.displacementMap ) {\n\n\t\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t\t} else if ( material.normalMap ) {\n\n\t\t\t\tuvScaleMap = material.normalMap;\n\n\t\t\t} else if ( material.bumpMap ) {\n\n\t\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t\t} else if ( material.roughnessMap ) {\n\n\t\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t\t} else if ( material.metalnessMap ) {\n\n\t\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t\t} else if ( material.alphaMap ) {\n\n\t\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t\t} else if ( material.emissiveMap ) {\n\n\t\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t\t// backwards compatibility\n\t\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t\t}\n\n\t\t\t\tvar offset = uvScaleMap.offset;\n\t\t\t\tvar repeat = uvScaleMap.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t}\n\n\t\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\t\tuniforms.dashSize.value = material.dashSize;\n\t\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\t\tuniforms.scale.value = material.scale;\n\n\t\t}\n\n\t\tfunction refreshUniformsPoints( uniforms, material ) {\n\n\t\t\tuniforms.diffuse.value = material.color;\n\t\t\tuniforms.opacity.value = material.opacity;\n\t\t\tuniforms.size.value = material.size * _pixelRatio;\n\t\t\tuniforms.scale.value = _height * 0.5;\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\tif ( material.map !== null ) {\n\n\t\t\t\tvar offset = material.map.offset;\n\t\t\t\tvar repeat = material.map.repeat;\n\n\t\t\t\tuniforms.offsetRepeat.value.set( offset.x, offset.y, repeat.x, repeat.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsFog( uniforms, fog ) {\n\n\t\t\tuniforms.fogColor.value = fog.color;\n\n\t\t\tif ( fog.isFog ) {\n\n\t\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsLambert( uniforms, material ) {\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\t\tuniforms.specular.value = material.specular;\n\t\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t\tif ( material.gradientMap ) {\n\n\t\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\t\tuniforms.roughness.value = material.roughness;\n\t\t\tuniforms.metalness.value = material.metalness;\n\n\t\t\tif ( material.roughnessMap ) {\n\n\t\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.metalnessMap ) {\n\n\t\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\t}\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t\tif ( material.envMap ) {\n\n\t\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsPhysical( uniforms, material ) {\n\n\t\t\tuniforms.clearCoat.value = material.clearCoat;\n\t\t\tuniforms.clearCoatRoughness.value = material.clearCoatRoughness;\n\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t}\n\n\t\tfunction refreshUniformsDepth( uniforms, material ) {\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t\tuniforms.referencePosition.value.copy( material.referencePosition );\n\t\t\tuniforms.nearDistance.value = material.nearDistance;\n\t\t\tuniforms.farDistance.value = material.farDistance;\n\n\t\t}\n\n\t\tfunction refreshUniformsNormal( uniforms, material ) {\n\n\t\t\tif ( material.bumpMap ) {\n\n\t\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\t}\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\t}\n\n\t\t\tif ( material.displacementMap ) {\n\n\t\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\t\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\t\tuniforms.ambientLightColor.needsUpdate = value;\n\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\t// GL state setting\n\n\t\tthis.setFaceCulling = function ( cullFace, frontFaceDirection ) {\n\n\t\t\tstate.setCullFace( cullFace );\n\t\t\tstate.setFlipSided( frontFaceDirection === FrontFaceDirectionCW );\n\n\t\t};\n\n\t\t// Textures\n\n\t\tfunction allocTextureUnit() {\n\n\t\t\tvar textureUnit = _usedTextureUnits;\n\n\t\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t\t}\n\n\t\t\t_usedTextureUnits += 1;\n\n\t\t\treturn textureUnit;\n\n\t\t}\n\n\t\tthis.allocTextureUnit = allocTextureUnit;\n\n\t\t// this.setTexture2D = setTexture2D;\n\t\tthis.setTexture2D = ( function () {\n\n\t\t\tvar warned = false;\n\n\t\t\t// backwards compatibility: peel texture.texture\n\t\t\treturn function setTexture2D( texture, slot ) {\n\n\t\t\t\tif ( texture && texture.isWebGLRenderTarget ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTexture = ( function () {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTexture( texture, slot ) {\n\n\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead.\" );\n\t\t\t\t\twarned = true;\n\n\t\t\t\t}\n\n\t\t\t\ttextures.setTexture2D( texture, slot );\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.setTextureCube = ( function () {\n\n\t\t\tvar warned = false;\n\n\t\t\treturn function setTextureCube( texture, slot ) {\n\n\t\t\t\t// backwards compatibility: peel texture.texture\n\t\t\t\tif ( texture && texture.isWebGLRenderTargetCube ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( \"THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead.\" );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture = texture.texture;\n\n\t\t\t\t}\n\n\t\t\t\t// currently relying on the fact that WebGLRenderTargetCube.texture is a Texture and NOT a CubeTexture\n\t\t\t\t// TODO: unify these code paths\n\t\t\t\tif ( ( texture && texture.isCubeTexture ) ||\n\t\t\t\t\t( Array.isArray( texture.image ) && texture.image.length === 6 ) ) {\n\n\t\t\t\t\t// CompressedTexture can have Array in image :/\n\n\t\t\t\t\t// this function alone should take care of cube textures\n\t\t\t\t\ttextures.setTextureCube( texture, slot );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assumed: texture property of THREE.WebGLRenderTargetCube\n\n\t\t\t\t\ttextures.setTextureCubeDynamic( texture, slot );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() );\n\n\t\tthis.getRenderTarget = function () {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTarget = function ( renderTarget ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\n\t\t\tif ( renderTarget && properties.get( renderTarget ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t}\n\n\t\t\tvar framebuffer = null;\n\t\t\tvar isCube = false;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tvar __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\t\tif ( renderTarget.isWebGLRenderTargetCube ) {\n\n\t\t\t\t\tframebuffer = __webglFramebuffer[ renderTarget.activeCubeFace ];\n\t\t\t\t\tisCube = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t\t}\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t} else {\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio );\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio );\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t}\n\n\t\t\tif ( _currentFramebuffer !== framebuffer ) {\n\n\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\t\t\t\t_currentFramebuffer = framebuffer;\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport );\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tvar textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + renderTarget.activeCubeFace, textureProperties.__webglTexture, renderTarget.activeMipMapLevel );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tvar restore = false;\n\n\t\t\t\tif ( framebuffer !== _currentFramebuffer ) {\n\n\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\trestore = true;\n\n\t\t\t\t}\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar texture = renderTarget.texture;\n\t\t\t\t\tvar textureFormat = texture.format;\n\t\t\t\t\tvar textureType = texture.type;\n\n\t\t\t\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( _gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // IE11, Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t\t! ( textureType === FloatType && ( extensions.get( 'OES_texture_float' ) || extensions.get( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t\t! ( textureType === HalfFloatType && extensions.get( 'EXT_color_buffer_half_float' ) ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( _gl.checkFramebufferStatus( _gl.FRAMEBUFFER ) === _gl.FRAMEBUFFER_COMPLETE ) {\n\n\t\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\tif ( restore ) {\n\n\t\t\t\t\t\t_gl.bindFramebuffer( _gl.FRAMEBUFFER, _currentFramebuffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction FogExp2 ( color, density ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\t\tthis.density = ( density !== undefined ) ? density : 0.00025;\n\n\t}\n\n\tFogExp2.prototype.isFogExp2 = true;\n\n\tFogExp2.prototype.clone = function () {\n\n\t\treturn new FogExp2( this.color.getHex(), this.density );\n\n\t};\n\n\tFogExp2.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Fog ( color, near, far ) {\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\n\t\tthis.near = ( near !== undefined ) ? near : 1;\n\t\tthis.far = ( far !== undefined ) ? far : 1000;\n\n\t}\n\n\tFog.prototype.isFog = true;\n\n\tFog.prototype.clone = function () {\n\n\t\treturn new Fog( this.color.getHex(), this.near, this.far );\n\n\t};\n\n\tFog.prototype.toJSON = function ( meta ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Scene () {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Scene';\n\n\t\tthis.background = null;\n\t\tthis.fog = null;\n\t\tthis.overrideMaterial = null;\n\n\t\tthis.autoUpdate = true; // checked by the renderer\n\n\t}\n\n\tScene.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Scene,\n\n\t\tcopy: function ( source, recursive ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source, recursive );\n\n\t\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\t\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\t\tthis.autoUpdate = source.autoUpdate;\n\t\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tif ( this.background !== null ) data.object.background = this.background.toJSON( meta );\n\t\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction LensFlare( texture, size, distance, blending, color ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.lensFlares = [];\n\n\t\tthis.positionScreen = new Vector3();\n\t\tthis.customUpdateCallback = undefined;\n\n\t\tif ( texture !== undefined ) {\n\n\t\t\tthis.add( texture, size, distance, blending, color );\n\n\t\t}\n\n\t}\n\n\tLensFlare.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LensFlare,\n\n\t\tisLensFlare: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.positionScreen.copy( source.positionScreen );\n\t\t\tthis.customUpdateCallback = source.customUpdateCallback;\n\n\t\t\tfor ( var i = 0, l = source.lensFlares.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lensFlares.push( source.lensFlares[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tadd: function ( texture, size, distance, blending, color, opacity ) {\n\n\t\t\tif ( size === undefined ) size = - 1;\n\t\t\tif ( distance === undefined ) distance = 0;\n\t\t\tif ( opacity === undefined ) opacity = 1;\n\t\t\tif ( color === undefined ) color = new Color( 0xffffff );\n\t\t\tif ( blending === undefined ) blending = NormalBlending;\n\n\t\t\tdistance = Math.min( distance, Math.max( 0, distance ) );\n\n\t\t\tthis.lensFlares.push( {\n\t\t\t\ttexture: texture,\t// THREE.Texture\n\t\t\t\tsize: size, \t\t// size in pixels (-1 = use texture.width)\n\t\t\t\tdistance: distance, \t// distance (0-1) from light source (0=at light source)\n\t\t\t\tx: 0, y: 0, z: 0,\t// screen position (-1 => 1) z = 0 is in front z = 1 is back\n\t\t\t\tscale: 1, \t\t// scale\n\t\t\t\trotation: 0, \t\t// rotation\n\t\t\t\topacity: opacity,\t// opacity\n\t\t\t\tcolor: color,\t\t// color\n\t\t\t\tblending: blending\t// blending\n\t\t\t} );\n\n\t\t},\n\n\t\t/*\n\t\t * Update lens flares update positions on all flares based on the screen position\n\t\t * Set myLensFlare.customUpdateCallback to alter the flares in your project specific way.\n\t\t */\n\n\t\tupdateLensFlares: function () {\n\n\t\t\tvar f, fl = this.lensFlares.length;\n\t\t\tvar flare;\n\t\t\tvar vecX = - this.positionScreen.x * 2;\n\t\t\tvar vecY = - this.positionScreen.y * 2;\n\n\t\t\tfor ( f = 0; f < fl; f ++ ) {\n\n\t\t\t\tflare = this.lensFlares[ f ];\n\n\t\t\t\tflare.x = this.positionScreen.x + vecX * flare.distance;\n\t\t\t\tflare.y = this.positionScreen.y + vecY * flare.distance;\n\n\t\t\t\tflare.wantedRotation = flare.x * Math.PI * 0.25;\n\t\t\t\tflare.rotation += ( flare.wantedRotation - flare.rotation ) * 0.25;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t *  color: <hex>,\n\t *  opacity: <float>,\n\t *  map: new THREE.Texture( <Image> ),\n\t *\n\t *\tuvOffset: new THREE.Vector2(),\n\t *\tuvScale: new THREE.Vector2()\n\t * }\n\t */\n\n\tfunction SpriteMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\t\tthis.map = null;\n\n\t\tthis.rotation = 0;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tSpriteMaterial.prototype = Object.create( Material.prototype );\n\tSpriteMaterial.prototype.constructor = SpriteMaterial;\n\tSpriteMaterial.prototype.isSpriteMaterial = true;\n\n\tSpriteMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.map = source.map;\n\n\t\tthis.rotation = source.rotation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Sprite( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Sprite';\n\n\t\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\t}\n\n\tSprite.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Sprite,\n\n\t\tisSprite: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar intersectPoint = new Vector3();\n\t\t\tvar worldPosition = new Vector3();\n\t\t\tvar worldScale = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tworldPosition.setFromMatrixPosition( this.matrixWorld );\n\t\t\t\traycaster.ray.closestPointToPoint( worldPosition, intersectPoint );\n\n\t\t\t\tworldScale.setFromMatrixScale( this.matrixWorld );\n\t\t\t\tvar guessSizeSq = worldScale.x * worldScale.y / 4;\n\n\t\t\t\tif ( worldPosition.distanceToSquared( intersectPoint ) > guessSizeSq ) return;\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\tpoint: intersectPoint.clone(),\n\t\t\t\t\tface: null,\n\t\t\t\t\tobject: this\n\n\t\t\t\t} );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LOD() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tLOD.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: LOD,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source, false );\n\n\t\t\tvar levels = source.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tthis.addLevel( level.object.clone(), level.distance );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\taddLevel: function ( object, distance ) {\n\n\t\t\tif ( distance === undefined ) distance = 0;\n\n\t\t\tdistance = Math.abs( distance );\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlevels.splice( l, 0, { distance: distance, object: object } );\n\n\t\t\tthis.add( object );\n\n\t\t},\n\n\t\tgetObjectForDistance: function ( distance ) {\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tif ( distance < levels[ i ].distance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t},\n\n\t\traycast: ( function () {\n\n\t\t\tvar matrixPosition = new Vector3();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tmatrixPosition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( matrixPosition );\n\n\t\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tupdate: function () {\n\n\t\t\tvar v1 = new Vector3();\n\t\t\tvar v2 = new Vector3();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar levels = this.levels;\n\n\t\t\t\tif ( levels.length > 1 ) {\n\n\t\t\t\t\tv1.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\t\tv2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\t\tvar distance = v1.distanceTo( v2 );\n\n\t\t\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\t\t\tfor ( var i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tif ( distance >= levels[ i ].distance ) {\n\n\t\t\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}(),\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.levels = [];\n\n\t\t\tvar levels = this.levels;\n\n\t\t\tfor ( var i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tvar level = levels[ i ];\n\n\t\t\t\tdata.object.levels.push( {\n\t\t\t\t\tobject: level.object.uuid,\n\t\t\t\t\tdistance: level.distance\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author michael guerrero / http://realitymeltdown.com\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Skeleton( bones, boneInverses ) {\n\n\t\t// copy the bone array\n\n\t\tbones = bones || [];\n\n\t\tthis.bones = bones.slice( 0 );\n\t\tthis.boneMatrices = new Float32Array( this.bones.length * 16 );\n\n\t\t// use the supplied bone inverses or calculate the inverses\n\n\t\tif ( boneInverses === undefined ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\tif ( this.bones.length === boneInverses.length ) {\n\n\t\t\t\tthis.boneInverses = boneInverses.slice( 0 );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton boneInverses is the wrong length.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( var i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tObject.assign( Skeleton.prototype, {\n\n\t\tcalculateInverses: function () {\n\n\t\t\tthis.boneInverses = [];\n\n\t\t\tfor ( var i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\tvar inverse = new Matrix4();\n\n\t\t\t\tif ( this.bones[ i ] ) {\n\n\t\t\t\t\tinverse.getInverse( this.bones[ i ].matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tthis.boneInverses.push( inverse );\n\n\t\t\t}\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tvar bone, i, il;\n\n\t\t\t// recover the bind-time world matrices\n\n\t\t\tfor ( i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\tbone = this.bones[ i ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tbone.matrixWorld.getInverse( this.boneInverses[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// compute the local matrices, positions, rotations and scales\n\n\t\t\tfor ( i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\tbone = this.bones[ i ];\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\t\tbone.matrix.getInverse( bone.parent.matrixWorld );\n\t\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdate: ( function () {\n\n\t\t\tvar offsetMatrix = new Matrix4();\n\t\t\tvar identityMatrix = new Matrix4();\n\n\t\t\treturn function update() {\n\n\t\t\t\tvar bones = this.bones;\n\t\t\t\tvar boneInverses = this.boneInverses;\n\t\t\t\tvar boneMatrices = this.boneMatrices;\n\t\t\t\tvar boneTexture = this.boneTexture;\n\n\t\t\t\t// flatten bone matrices to array\n\n\t\t\t\tfor ( var i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t\t\t// compute the offset between the current and the original transform\n\n\t\t\t\t\tvar matrix = bones[ i ] ? bones[ i ].matrixWorld : identityMatrix;\n\n\t\t\t\t\toffsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );\n\t\t\t\t\toffsetMatrix.toArray( boneMatrices, i * 16 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( boneTexture !== undefined ) {\n\n\t\t\t\t\tboneTexture.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\tclone: function () {\n\n\t\t\treturn new Skeleton( this.bones, this.boneInverses );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction Bone() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n\tBone.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Bone,\n\n\t\tisBone: true\n\n\t} );\n\n\t/**\n\t * @author mikael emtinger / http://gomo.se/\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author ikerr / http://verold.com\n\t */\n\n\tfunction SkinnedMesh( geometry, material ) {\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\tthis.bindMode = 'attached';\n\t\tthis.bindMatrix = new Matrix4();\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\tvar bones = this.initBones();\n\t\tvar skeleton = new Skeleton( bones );\n\n\t\tthis.bind( skeleton, this.matrixWorld );\n\n\t\tthis.normalizeSkinWeights();\n\n\t}\n\n\tSkinnedMesh.prototype = Object.assign( Object.create( Mesh.prototype ), {\n\n\t\tconstructor: SkinnedMesh,\n\n\t\tisSkinnedMesh: true,\n\n\t\tinitBones: function () {\n\n\t\t\tvar bones = [], bone, gbone;\n\t\t\tvar i, il;\n\n\t\t\tif ( this.geometry && this.geometry.bones !== undefined ) {\n\n\t\t\t\t// first, create array of 'Bone' objects from geometry data\n\n\t\t\t\tfor ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) {\n\n\t\t\t\t\tgbone = this.geometry.bones[ i ];\n\n\t\t\t\t\t// create new 'Bone' object\n\n\t\t\t\t\tbone = new Bone();\n\t\t\t\t\tbones.push( bone );\n\n\t\t\t\t\t// apply values\n\n\t\t\t\t\tbone.name = gbone.name;\n\t\t\t\t\tbone.position.fromArray( gbone.pos );\n\t\t\t\t\tbone.quaternion.fromArray( gbone.rotq );\n\t\t\t\t\tif ( gbone.scl !== undefined ) bone.scale.fromArray( gbone.scl );\n\n\t\t\t\t}\n\n\t\t\t\t// second, create bone hierarchy\n\n\t\t\t\tfor ( i = 0, il = this.geometry.bones.length; i < il; i ++ ) {\n\n\t\t\t\t\tgbone = this.geometry.bones[ i ];\n\n\t\t\t\t\tif ( ( gbone.parent !== - 1 ) && ( gbone.parent !== null ) && ( bones[ gbone.parent ] !== undefined ) ) {\n\n\t\t\t\t\t\t// subsequent bones in the hierarchy\n\n\t\t\t\t\t\tbones[ gbone.parent ].add( bones[ i ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// topmost bone, immediate child of the skinned mesh\n\n\t\t\t\t\t\tthis.add( bones[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// now the bones are part of the scene graph and children of the skinned mesh.\n\t\t\t// let's update the corresponding matrices\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\treturn bones;\n\n\t\t},\n\n\t\tbind: function ( skeleton, bindMatrix ) {\n\n\t\t\tthis.skeleton = skeleton;\n\n\t\t\tif ( bindMatrix === undefined ) {\n\n\t\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t\t}\n\n\t\t\tthis.bindMatrix.copy( bindMatrix );\n\t\t\tthis.bindMatrixInverse.getInverse( bindMatrix );\n\n\t\t},\n\n\t\tpose: function () {\n\n\t\t\tthis.skeleton.pose();\n\n\t\t},\n\n\t\tnormalizeSkinWeights: function () {\n\n\t\t\tvar scale, i;\n\n\t\t\tif ( this.geometry && this.geometry.isGeometry ) {\n\n\t\t\t\tfor ( i = 0; i < this.geometry.skinWeights.length; i ++ ) {\n\n\t\t\t\t\tvar sw = this.geometry.skinWeights[ i ];\n\n\t\t\t\t\tscale = 1.0 / sw.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tsw.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tsw.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( this.geometry && this.geometry.isBufferGeometry ) {\n\n\t\t\t\tvar vec = new Vector4();\n\n\t\t\t\tvar skinWeight = this.geometry.attributes.skinWeight;\n\n\t\t\t\tfor ( i = 0; i < skinWeight.count; i ++ ) {\n\n\t\t\t\t\tvec.x = skinWeight.getX( i );\n\t\t\t\t\tvec.y = skinWeight.getY( i );\n\t\t\t\t\tvec.z = skinWeight.getZ( i );\n\t\t\t\t\tvec.w = skinWeight.getW( i );\n\n\t\t\t\t\tscale = 1.0 / vec.lengthManhattan();\n\n\t\t\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\t\t\tvec.multiplyScalar( scale );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvec.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t\t\t}\n\n\t\t\t\t\tskinWeight.setXYZW( i, vec.x, vec.y, vec.z, vec.w );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\tupdateMatrixWorld: function ( force ) {\n\n\t\t\tMesh.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\tif ( this.bindMode === 'attached' ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.matrixWorld );\n\n\t\t\t} else if ( this.bindMode === 'detached' ) {\n\n\t\t\t\tthis.bindMatrixInverse.getInverse( this.bindMatrix );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );\n\n\t\t\t}\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t *  color: <hex>,\n\t *  opacity: <float>,\n\t *\n\t *  linewidth: <float>,\n\t *  linecap: \"round\",\n\t *  linejoin: \"round\"\n\t * }\n\t */\n\n\tfunction LineBasicMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\t\tthis.linecap = 'round';\n\t\tthis.linejoin = 'round';\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineBasicMaterial.prototype = Object.create( Material.prototype );\n\tLineBasicMaterial.prototype.constructor = LineBasicMaterial;\n\n\tLineBasicMaterial.prototype.isLineBasicMaterial = true;\n\n\tLineBasicMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Line( geometry, material, mode ) {\n\n\t\tif ( mode === 1 ) {\n\n\t\t\tconsole.warn( 'THREE.Line: parameter THREE.LinePieces no longer supported. Created THREE.LineSegments instead.' );\n\t\t\treturn new LineSegments( geometry, material );\n\n\t\t}\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new LineBasicMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tLine.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Line,\n\n\t\tisLine: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar precision = raycaster.linePrecision;\n\t\t\t\tvar precisionSq = precision * precision;\n\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar vStart = new Vector3();\n\t\t\t\tvar vEnd = new Vector3();\n\t\t\t\tvar interSegment = new Vector3();\n\t\t\t\tvar interRay = new Vector3();\n\t\t\t\tvar step = (this && this.isLineSegments) ? 2 : 1;\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, l = indices.length - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\t\t\t\t\t\t\tvar b = indices[ i + 1 ];\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, a * 3 );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, b * 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3 - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\tvStart.fromArray( positions, 3 * i );\n\t\t\t\t\t\t\tvEnd.fromArray( positions, 3 * i + 3 );\n\n\t\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( geometry.isGeometry ) {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\t\t\t\t\tvar nbVertices = vertices.length;\n\n\t\t\t\t\tfor ( var i = 0; i < nbVertices - 1; i += step ) {\n\n\t\t\t\t\t\tvar distSq = ray.distanceSqToSegment( vertices[ i ], vertices[ i + 1 ], interRay, interSegment );\n\n\t\t\t\t\t\tif ( distSq > precisionSq ) continue;\n\n\t\t\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\t\t\tobject: this\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LineSegments( geometry, material ) {\n\n\t\tLine.call( this, geometry, material );\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tLineSegments.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\t\tconstructor: LineSegments,\n\n\t\tisLineSegments: true\n\n\t} );\n\n\t/**\n\t * @author mgreter / http://github.com/mgreter\n\t */\n\n\tfunction LineLoop( geometry, material ) {\n\n\t\tLine.call( this, geometry, material );\n\n\t\tthis.type = 'LineLoop';\n\n\t}\n\n\tLineLoop.prototype = Object.assign( Object.create( Line.prototype ), {\n\n\t\tconstructor: LineLoop,\n\n\t\tisLineLoop: true,\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t *  color: <hex>,\n\t *  opacity: <float>,\n\t *  map: new THREE.Texture( <Image> ),\n\t *\n\t *  size: <float>,\n\t *  sizeAttenuation: <bool>\n\t * }\n\t */\n\n\tfunction PointsMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.size = 1;\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.lights = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tPointsMaterial.prototype = Object.create( Material.prototype );\n\tPointsMaterial.prototype.constructor = PointsMaterial;\n\n\tPointsMaterial.prototype.isPointsMaterial = true;\n\n\tPointsMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Points( geometry, material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry !== undefined ? geometry : new BufferGeometry();\n\t\tthis.material = material !== undefined ? material : new PointsMaterial( { color: Math.random() * 0xffffff } );\n\n\t}\n\n\tPoints.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Points,\n\n\t\tisPoints: true,\n\n\t\traycast: ( function () {\n\n\t\t\tvar inverseMatrix = new Matrix4();\n\t\t\tvar ray = new Ray();\n\t\t\tvar sphere = new Sphere();\n\n\t\t\treturn function raycast( raycaster, intersects ) {\n\n\t\t\t\tvar object = this;\n\t\t\t\tvar geometry = this.geometry;\n\t\t\t\tvar matrixWorld = this.matrixWorld;\n\t\t\t\tvar threshold = raycaster.params.Points.threshold;\n\n\t\t\t\t// Checking boundingSphere distance to ray\n\n\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\tsphere.copy( geometry.boundingSphere );\n\t\t\t\tsphere.applyMatrix4( matrixWorld );\n\t\t\t\tsphere.radius += threshold;\n\n\t\t\t\tif ( raycaster.ray.intersectsSphere( sphere ) === false ) return;\n\n\t\t\t\t//\n\n\t\t\t\tinverseMatrix.getInverse( matrixWorld );\n\t\t\t\tray.copy( raycaster.ray ).applyMatrix4( inverseMatrix );\n\n\t\t\t\tvar localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\t\t\tvar localThresholdSq = localThreshold * localThreshold;\n\t\t\t\tvar position = new Vector3();\n\n\t\t\t\tfunction testPoint( point, index ) {\n\n\t\t\t\t\tvar rayPointDistanceSq = ray.distanceSqToPoint( point );\n\n\t\t\t\t\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\t\t\t\t\tvar intersectPoint = ray.closestPointToPoint( point );\n\t\t\t\t\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tvar distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\t\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\t\t\t\t\tintersects.push( {\n\n\t\t\t\t\t\t\tdistance: distance,\n\t\t\t\t\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\t\t\t\t\tpoint: intersectPoint.clone(),\n\t\t\t\t\t\t\tindex: index,\n\t\t\t\t\t\t\tface: null,\n\t\t\t\t\t\t\tobject: object\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\t\t\tvar index = geometry.index;\n\t\t\t\t\tvar attributes = geometry.attributes;\n\t\t\t\t\tvar positions = attributes.position.array;\n\n\t\t\t\t\tif ( index !== null ) {\n\n\t\t\t\t\t\tvar indices = index.array;\n\n\t\t\t\t\t\tfor ( var i = 0, il = indices.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tvar a = indices[ i ];\n\n\t\t\t\t\t\t\tposition.fromArray( positions, a * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, a );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( var i = 0, l = positions.length / 3; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tposition.fromArray( positions, i * 3 );\n\n\t\t\t\t\t\t\ttestPoint( position, i );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar vertices = geometry.vertices;\n\n\t\t\t\t\tfor ( var i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\ttestPoint( vertices[ i ], i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}() ),\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor( this.geometry, this.material ).copy( this );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Group() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Group';\n\n\t}\n\n\tGroup.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Group\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction VideoTexture( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tTexture.call( this, video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.generateMipmaps = false;\n\n\t\tvar scope = this;\n\n\t\tfunction update() {\n\n\t\t\trequestAnimationFrame( update );\n\n\t\t\tif ( video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\t\tscope.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tupdate();\n\n\t}\n\n\tVideoTexture.prototype = Object.create( Texture.prototype );\n\tVideoTexture.prototype.constructor = VideoTexture;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CompressedTexture( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.image = { width: width, height: height };\n\t\tthis.mipmaps = mipmaps;\n\n\t\t// no flipping for cube textures\n\t\t// (also flipping doesn't work for compressed textures )\n\n\t\tthis.flipY = false;\n\n\t\t// can't generate mipmaps for compressed textures\n\t\t// mips must be embedded in DDS files\n\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n\tCompressedTexture.prototype = Object.create( Texture.prototype );\n\tCompressedTexture.prototype.constructor = CompressedTexture;\n\n\tCompressedTexture.prototype.isCompressedTexture = true;\n\n\t/**\n\t * @author Matt DesLauriers / @mattdesl\n\t * @author atix / arthursilber.de\n\t */\n\n\tfunction DepthTexture( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {\n\n\t\tformat = format !== undefined ? format : DepthFormat;\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t\t}\n\n\t\tif ( type === undefined && format === DepthFormat ) type = UnsignedShortType;\n\t\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\t\tTexture.call( this, null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.flipY = false;\n\t\tthis.generateMipmaps\t= false;\n\n\t}\n\n\tDepthTexture.prototype = Object.create( Texture.prototype );\n\tDepthTexture.prototype.constructor = DepthTexture;\n\tDepthTexture.prototype.isDepthTexture = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction WireframeGeometry( geometry ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\n\t\t// helper variables\n\n\t\tvar i, j, l, o, ol;\n\t\tvar edge = [ 0, 0 ], edges = {}, e, edge1, edge2;\n\t\tvar key, keys = [ 'a', 'b', 'c' ];\n\t\tvar vertex;\n\n\t\t// different logic for Geometry and BufferGeometry\n\n\t\tif ( geometry && geometry.isGeometry ) {\n\n\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\tvar faces = geometry.faces;\n\n\t\t\tfor ( i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\tedge1 = face[ keys[ j ] ];\n\t\t\t\t\tedge2 = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\t\tedge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates\n\t\t\t\t\tedge[ 1 ] = Math.max( edge1, edge2 );\n\n\t\t\t\t\tkey = edge[ 0 ] + ',' + edge[ 1 ];\n\n\t\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// generate vertices\n\n\t\t\tfor ( key in edges ) {\n\n\t\t\t\te = edges[ key ];\n\n\t\t\t\tvertex = geometry.vertices[ e.index1 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\tvertex = geometry.vertices[ e.index2 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t} else if ( geometry && geometry.isBufferGeometry ) {\n\n\t\t\tvar position, indices, groups;\n\t\t\tvar group, start, count;\n\t\t\tvar index1, index2;\n\n\t\t\tvertex = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tposition = geometry.attributes.position;\n\t\t\t\tindices = geometry.index;\n\t\t\t\tgroups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all eges without duplicates\n\n\t\t\t\tfor ( o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tgroup = groups[ o ];\n\n\t\t\t\t\tstart = group.start;\n\t\t\t\t\tcount = group.count;\n\n\t\t\t\t\tfor ( i = start, l = ( start + count ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tedge1 = indices.getX( i + j );\n\t\t\t\t\t\t\tedge2 = indices.getX( i + ( j + 1 ) % 3 );\n\t\t\t\t\t\t\tedge[ 0 ] = Math.min( edge1, edge2 ); // sorting prevents duplicates\n\t\t\t\t\t\t\tedge[ 1 ] = Math.max( edge1, edge2 );\n\n\t\t\t\t\t\t\tkey = edge[ 0 ] + ',' + edge[ 1 ];\n\n\t\t\t\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ] };\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// generate vertices\n\n\t\t\t\tfor ( key in edges ) {\n\n\t\t\t\t\te = edges[ key ];\n\n\t\t\t\t\tvertex.fromBufferAttribute( position, e.index1 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\tvertex.fromBufferAttribute( position, e.index2 );\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tposition = geometry.attributes.position;\n\n\t\t\t\tfor ( i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tindex1 = 3 * i + j;\n\t\t\t\t\t\tvertex.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t\tindex2 = 3 * i + ( ( j + 1 ) % 3 );\n\t\t\t\t\t\tvertex.fromBufferAttribute( position, index2 );\n\t\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t}\n\n\tWireframeGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tWireframeGeometry.prototype.constructor = WireframeGeometry;\n\n\t/**\n\t * @author zz85 / https://github.com/zz85\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Parametric Surfaces Geometry\n\t * based on the brilliant article by @prideout http://prideout.net/blog/?p=44\n\t */\n\n\t// ParametricGeometry\n\n\tfunction ParametricGeometry( func, slices, stacks ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ParametricGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ParametricBufferGeometry( func, slices, stacks ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tParametricGeometry.prototype = Object.create( Geometry.prototype );\n\tParametricGeometry.prototype.constructor = ParametricGeometry;\n\n\t// ParametricBufferGeometry\n\n\tfunction ParametricBufferGeometry( func, slices, stacks ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ParametricBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\tvar EPS = 0.00001;\n\n\t\tvar normal = new Vector3();\n\n\t\tvar p0 = new Vector3(), p1 = new Vector3();\n\t\tvar pu = new Vector3(), pv = new Vector3();\n\n\t\tvar i, j;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tvar sliceCount = slices + 1;\n\n\t\tfor ( i = 0; i <= stacks; i ++ ) {\n\n\t\t\tvar v = i / stacks;\n\n\t\t\tfor ( j = 0; j <= slices; j ++ ) {\n\n\t\t\t\tvar u = j / slices;\n\n\t\t\t\t// vertex\n\n\t\t\t\tp0 = func( u, v, p0 );\n\t\t\t\tvertices.push( p0.x, p0.y, p0.z );\n\n\t\t\t\t// normal\n\n\t\t\t\t// approximate tangent vectors via finite differences\n\n\t\t\t\tif ( u - EPS >= 0 ) {\n\n\t\t\t\t\tp1 = func( u - EPS, v, p1 );\n\t\t\t\t\tpu.subVectors( p0, p1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tp1 = func( u + EPS, v, p1 );\n\t\t\t\t\tpu.subVectors( p1, p0 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( v - EPS >= 0 ) {\n\n\t\t\t\t\tp1 = func( u, v - EPS, p1 );\n\t\t\t\t\tpv.subVectors( p0, p1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tp1 = func( u, v + EPS, p1 );\n\t\t\t\t\tpv.subVectors( p1, p0 );\n\n\t\t\t\t}\n\n\t\t\t\t// cross product of tangent vectors returns surface normal\n\n\t\t\t\tnormal.crossVectors( pu, pv ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u, v );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( i = 0; i < stacks; i ++ ) {\n\n\t\t\tfor ( j = 0; j < slices; j ++ ) {\n\n\t\t\t\tvar a = i * sliceCount + j;\n\t\t\t\tvar b = i * sliceCount + j + 1;\n\t\t\t\tvar c = ( i + 1 ) * sliceCount + j + 1;\n\t\t\t\tvar d = ( i + 1 ) * sliceCount + j;\n\n\t\t\t\t// faces one and two\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tParametricBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tParametricBufferGeometry.prototype.constructor = ParametricBufferGeometry;\n\n\t/**\n\t * @author clockworkgeek / https://github.com/clockworkgeek\n\t * @author timothypratley / https://github.com/timothypratley\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\t// PolyhedronGeometry\n\n\tfunction PolyhedronGeometry( vertices, indices, radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new PolyhedronBufferGeometry( vertices, indices, radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tPolyhedronGeometry.prototype = Object.create( Geometry.prototype );\n\tPolyhedronGeometry.prototype.constructor = PolyhedronGeometry;\n\n\t// PolyhedronBufferGeometry\n\n\tfunction PolyhedronBufferGeometry( vertices, indices, radius, detail ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'PolyhedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tradius = radius || 1;\n\t\tdetail = detail || 0;\n\n\t\t// default buffer data\n\n\t\tvar vertexBuffer = [];\n\t\tvar uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tappplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\t\tif ( detail === 0 ) {\n\n\t\t\tthis.computeVertexNormals(); // flat normals\n\n\t\t} else {\n\n\t\t\tthis.normalizeNormals(); // smooth normals\n\n\t\t}\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivison with the given detail value\n\n\t\t\tfor ( var i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tvar cols = Math.pow( 2, detail );\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tvar v = [];\n\n\t\t\tvar i, j;\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tvar aj = a.clone().lerp( c, i / cols );\n\t\t\t\tvar bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tvar rows = cols - i;\n\n\t\t\t\tfor ( j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tvar k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction appplyRadius( radius ) {\n\n\t\t\tvar vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tfor ( var i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvar u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tvar v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( var i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tvar x0 = uvBuffer[ i + 0 ];\n\t\t\t\tvar x1 = uvBuffer[ i + 2 ];\n\t\t\t\tvar x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tvar max = Math.max( x0, x1, x2 );\n\t\t\t\tvar min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tvar stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tvar a = new Vector3();\n\t\t\tvar b = new Vector3();\n\t\t\tvar c = new Vector3();\n\n\t\t\tvar centroid = new Vector3();\n\n\t\t\tvar uvA = new Vector2();\n\t\t\tvar uvB = new Vector2();\n\t\t\tvar uvC = new Vector2();\n\n\t\t\tfor ( var i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tvar azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tPolyhedronBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tPolyhedronBufferGeometry.prototype.constructor = PolyhedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\t// TetrahedronGeometry\n\n\tfunction TetrahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new TetrahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTetrahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tTetrahedronGeometry.prototype.constructor = TetrahedronGeometry;\n\n\t// TetrahedronBufferGeometry\n\n\tfunction TetrahedronBufferGeometry( radius, detail ) {\n\n\t\tvar vertices = [\n\t\t\t1,  1,  1,   - 1, - 1,  1,   - 1,  1, - 1,    1, - 1, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t2,  1,  0,    0,  3,  2,    1,  3,  0,    2,  3,  1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tTetrahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tTetrahedronBufferGeometry.prototype.constructor = TetrahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\t// OctahedronGeometry\n\n\tfunction OctahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new OctahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tOctahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tOctahedronGeometry.prototype.constructor = OctahedronGeometry;\n\n\t// OctahedronBufferGeometry\n\n\tfunction OctahedronBufferGeometry( radius, detail ) {\n\n\t\tvar vertices = [\n\t\t\t1, 0, 0,   - 1, 0, 0,    0, 1, 0,    0, - 1, 0,    0, 0, 1,    0, 0, - 1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t0, 2, 4,    0, 4, 3,    0, 3, 5,    0, 5, 2,    1, 2, 5,    1, 5, 3,    1, 3, 4,    1, 4, 2\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tOctahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tOctahedronBufferGeometry.prototype.constructor = OctahedronBufferGeometry;\n\n\t/**\n\t * @author timothypratley / https://github.com/timothypratley\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\t// IcosahedronGeometry\n\n\tfunction IcosahedronGeometry( radius, detail ) {\n\n\t \tGeometry.call( this );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new IcosahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tIcosahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tIcosahedronGeometry.prototype.constructor = IcosahedronGeometry;\n\n\t// IcosahedronBufferGeometry\n\n\tfunction IcosahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tvar vertices = [\n\t\t\t- 1,  t,  0,    1,  t,  0,   - 1, - t,  0,    1, - t,  0,\n\t\t\t 0, - 1,  t,    0,  1,  t,    0, - 1, - t,    0,  1, - t,\n\t\t\t t,  0, - 1,    t,  0,  1,   - t,  0, - 1,   - t,  0,  1\n\t\t];\n\n\t\tvar indices = [\n\t\t\t 0, 11,  5,    0,  5,  1,    0,  1,  7,    0,  7, 10,    0, 10, 11,\n\t\t\t 1,  5,  9,    5, 11,  4,   11, 10,  2,   10,  7,  6,    7,  1,  8,\n\t\t\t 3,  9,  4,    3,  4,  2,    3,  2,  6,    3,  6,  8,    3,  8,  9,\n\t\t\t 4,  9,  5,    2,  4, 11,    6,  2, 10,    8,  6,  7,    9,  8,  1\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tIcosahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tIcosahedronBufferGeometry.prototype.constructor = IcosahedronBufferGeometry;\n\n\t/**\n\t * @author Abe Pazos / https://hamoid.com\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\t// DodecahedronGeometry\n\n\tfunction DodecahedronGeometry( radius, detail ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\tthis.fromBufferGeometry( new DodecahedronBufferGeometry( radius, detail ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tDodecahedronGeometry.prototype = Object.create( Geometry.prototype );\n\tDodecahedronGeometry.prototype.constructor = DodecahedronGeometry;\n\n\t// DodecahedronBufferGeometry\n\n\tfunction DodecahedronBufferGeometry( radius, detail ) {\n\n\t\tvar t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tvar r = 1 / t;\n\n\t\tvar vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t- 1, - 1, - 1,    - 1, - 1,  1,\n\t\t\t- 1,  1, - 1,    - 1,  1,  1,\n\t\t\t  1, - 1, - 1,     1, - 1,  1,\n\t\t\t  1,  1, - 1,     1,  1,  1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t 0, - r, - t,     0, - r,  t,\n\t\t\t 0,  r, - t,     0,  r,  t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t,  0,    - r,  t,  0,\n\t\t\t r, - t,  0,     r,  t,  0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t,  0, - r,     t,  0, - r,\n\t\t\t- t,  0,  r,     t,  0,  r\n\t\t];\n\n\t\tvar indices = [\n\t\t\t 3, 11,  7,      3,  7, 15,      3, 15, 13,\n\t\t\t 7, 19, 17,      7, 17,  6,      7,  6, 15,\n\t\t\t17,  4,  8,     17,  8, 10,     17, 10,  6,\n\t\t\t 8,  0, 16,      8, 16,  2,      8,  2, 10,\n\t\t\t 0, 12,  1,      0,  1, 18,      0, 18, 16,\n\t\t\t 6, 10,  2,      6,  2, 13,      6, 13, 15,\n\t\t\t 2, 16, 18,      2, 18,  3,      2,  3, 13,\n\t\t\t18,  1,  9,     18,  9, 11,     18, 11,  3,\n\t\t\t 4, 14, 12,      4, 12,  0,      4,  0,  8,\n\t\t\t11,  9,  5,     11,  5, 19,     11, 19,  7,\n\t\t\t19,  5, 14,     19, 14,  4,     19,  4, 17,\n\t\t\t 1, 12, 14,      1, 14,  5,      1,  5,  9\n\t\t];\n\n\t\tPolyhedronBufferGeometry.call( this, vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tDodecahedronBufferGeometry.prototype = Object.create( PolyhedronBufferGeometry.prototype );\n\tDodecahedronBufferGeometry.prototype.constructor = DodecahedronBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode / https://github.com/oosmoxiecode\n\t * @author WestLangley / https://github.com/WestLangley\n\t * @author zz85 / https://github.com/zz85\n\t * @author miningold / https://github.com/miningold\n\t * @author jonobr1 / https://github.com/jonobr1\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t */\n\n\t// TubeGeometry\n\n\tfunction TubeGeometry( path, tubularSegments, radius, radialSegments, closed, taper ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tif ( taper !== undefined ) console.warn( 'THREE.TubeGeometry: taper has been removed.' );\n\n\t\tvar bufferGeometry = new TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = bufferGeometry.tangents;\n\t\tthis.normals = bufferGeometry.normals;\n\t\tthis.binormals = bufferGeometry.binormals;\n\n\t\t// create geometry\n\n\t\tthis.fromBufferGeometry( bufferGeometry );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTubeGeometry.prototype = Object.create( Geometry.prototype );\n\tTubeGeometry.prototype.constructor = TubeGeometry;\n\n\t// TubeBufferGeometry\n\n\tfunction TubeBufferGeometry( path, tubularSegments, radius, radialSegments, closed ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TubeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\ttubularSegments = tubularSegments || 64;\n\t\tradius = radius || 1;\n\t\tradialSegments = radialSegments || 8;\n\t\tclosed = closed || false;\n\n\t\tvar frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\tvar i, j;\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\t\tvar indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tvar P = path.getPointAt( i / tubularSegments );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tvar N = frames.normals[ i ];\n\t\t\tvar B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tvar sin =   Math.sin( v );\n\t\t\t\tvar cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tTubeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTubeBufferGeometry.prototype.constructor = TubeBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * based on http://www.blackpawn.com/texts/pqtorus/\n\t */\n\n\t// TorusKnotGeometry\n\n\tfunction TorusKnotGeometry( radius, tube, tubularSegments, radialSegments, p, q, heightScale ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\tif ( heightScale !== undefined ) console.warn( 'THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.' );\n\n\t\tthis.fromBufferGeometry( new TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTorusKnotGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusKnotGeometry.prototype.constructor = TorusKnotGeometry;\n\n\t// TorusKnotBufferGeometry\n\n\tfunction TorusKnotBufferGeometry( radius, tube, tubularSegments, radialSegments, p, q ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusKnotBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 64;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\tp = p || 2;\n\t\tq = q || 3;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar i, j;\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\tvar P1 = new Vector3();\n\t\tvar P2 = new Vector3();\n\n\t\tvar B = new Vector3();\n\t\tvar T = new Vector3();\n\t\tvar N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segement\n\n\t\t\tvar u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\t\t\t\tvar cx = - tube * Math.cos( v );\n\t\t\t\tvar cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectos, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tvar a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tvar b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tvar c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tvar d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tvar cu = Math.cos( u );\n\t\t\tvar su = Math.sin( u );\n\t\t\tvar quOverP = q / p * u;\n\t\t\tvar cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tTorusKnotBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusKnotBufferGeometry.prototype.constructor = TorusKnotBufferGeometry;\n\n\t/**\n\t * @author oosmoxiecode\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\t// TorusGeometry\n\n\tfunction TorusGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tthis.fromBufferGeometry( new TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTorusGeometry.prototype = Object.create( Geometry.prototype );\n\tTorusGeometry.prototype.constructor = TorusGeometry;\n\n\t// TorusBufferGeometry\n\n\tfunction TorusBufferGeometry( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'TorusBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradius = radius || 100;\n\t\ttube = tube || 40;\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\ttubularSegments = Math.floor( tubularSegments ) || 6;\n\t\tarc = arc || Math.PI * 2;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar center = new Vector3();\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tvar u = i / tubularSegments * arc;\n\t\t\t\tvar v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tvar a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tvar b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tvar c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tvar d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tTorusBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tTorusBufferGeometry.prototype.constructor = TorusBufferGeometry;\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t */\n\n\tvar ShapeUtils = {\n\n\t\t// calculate area of the contour polygon\n\n\t\tarea: function ( contour ) {\n\n\t\t\tvar n = contour.length;\n\t\t\tvar a = 0.0;\n\n\t\t\tfor ( var p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t\t}\n\n\t\t\treturn a * 0.5;\n\n\t\t},\n\n\t\ttriangulate: ( function () {\n\n\t\t\t/**\n\t\t\t * This code is a quick port of code written in C++ which was submitted to\n\t\t\t * flipcode.com by John W. Ratcliff  // July 22, 2000\n\t\t\t * See original code and more information here:\n\t\t\t * http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml\n\t\t\t *\n\t\t\t * ported to actionscript by Zevan Rosser\n\t\t\t * www.actionsnippet.com\n\t\t\t *\n\t\t\t * ported to javascript by Joshua Koo\n\t\t\t * http://www.lab4games.net/zz85/blog\n\t\t\t *\n\t\t\t */\n\n\t\t\tfunction snip( contour, u, v, w, n, verts ) {\n\n\t\t\t\tvar p;\n\t\t\t\tvar ax, ay, bx, by;\n\t\t\t\tvar cx, cy, px, py;\n\n\t\t\t\tax = contour[ verts[ u ] ].x;\n\t\t\t\tay = contour[ verts[ u ] ].y;\n\n\t\t\t\tbx = contour[ verts[ v ] ].x;\n\t\t\t\tby = contour[ verts[ v ] ].y;\n\n\t\t\t\tcx = contour[ verts[ w ] ].x;\n\t\t\t\tcy = contour[ verts[ w ] ].y;\n\n\t\t\t\tif ( ( bx - ax ) * ( cy - ay ) - ( by - ay ) * ( cx - ax ) <= 0 ) return false;\n\n\t\t\t\tvar aX, aY, bX, bY, cX, cY;\n\t\t\t\tvar apx, apy, bpx, bpy, cpx, cpy;\n\t\t\t\tvar cCROSSap, bCROSScp, aCROSSbp;\n\n\t\t\t\taX = cx - bx;  aY = cy - by;\n\t\t\t\tbX = ax - cx;  bY = ay - cy;\n\t\t\t\tcX = bx - ax;  cY = by - ay;\n\n\t\t\t\tfor ( p = 0; p < n; p ++ ) {\n\n\t\t\t\t\tpx = contour[ verts[ p ] ].x;\n\t\t\t\t\tpy = contour[ verts[ p ] ].y;\n\n\t\t\t\t\tif ( ( ( px === ax ) && ( py === ay ) ) ||\n\t\t\t\t\t\t ( ( px === bx ) && ( py === by ) ) ||\n\t\t\t\t\t\t ( ( px === cx ) && ( py === cy ) ) )\tcontinue;\n\n\t\t\t\t\tapx = px - ax;  apy = py - ay;\n\t\t\t\t\tbpx = px - bx;  bpy = py - by;\n\t\t\t\t\tcpx = px - cx;  cpy = py - cy;\n\n\t\t\t\t\t// see if p is inside triangle abc\n\n\t\t\t\t\taCROSSbp = aX * bpy - aY * bpx;\n\t\t\t\t\tcCROSSap = cX * apy - cY * apx;\n\t\t\t\t\tbCROSScp = bX * cpy - bY * cpx;\n\n\t\t\t\t\tif ( ( aCROSSbp >= - Number.EPSILON ) && ( bCROSScp >= - Number.EPSILON ) && ( cCROSSap >= - Number.EPSILON ) ) return false;\n\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// takes in an contour array and returns\n\n\t\t\treturn function triangulate( contour, indices ) {\n\n\t\t\t\tvar n = contour.length;\n\n\t\t\t\tif ( n < 3 ) return null;\n\n\t\t\t\tvar result = [],\n\t\t\t\t\tverts = [],\n\t\t\t\t\tvertIndices = [];\n\n\t\t\t\t/* we want a counter-clockwise polygon in verts */\n\n\t\t\t\tvar u, v, w;\n\n\t\t\t\tif ( ShapeUtils.area( contour ) > 0.0 ) {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = v;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( v = 0; v < n; v ++ ) verts[ v ] = ( n - 1 ) - v;\n\n\t\t\t\t}\n\n\t\t\t\tvar nv = n;\n\n\t\t\t\t/*  remove nv - 2 vertices, creating 1 triangle every time */\n\n\t\t\t\tvar count = 2 * nv;   /* error detection */\n\n\t\t\t\tfor ( v = nv - 1; nv > 2; ) {\n\n\t\t\t\t\t/* if we loop, it is probably a non-simple polygon */\n\n\t\t\t\t\tif ( ( count -- ) <= 0 ) {\n\n\t\t\t\t\t\t//** Triangulate: ERROR - probable bad polygon!\n\n\t\t\t\t\t\t//throw ( \"Warning, unable to triangulate polygon!\" );\n\t\t\t\t\t\t//return null;\n\t\t\t\t\t\t// Sometimes warning is fine, especially polygons are triangulated in reverse.\n\t\t\t\t\t\tconsole.warn( 'THREE.ShapeUtils: Unable to triangulate polygon! in triangulate()' );\n\n\t\t\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t/* three consecutive vertices in current polygon, <u,v,w> */\n\n\t\t\t\t\tu = v; \t \tif ( nv <= u ) u = 0;     /* previous */\n\t\t\t\t\tv = u + 1;  if ( nv <= v ) v = 0;     /* new v    */\n\t\t\t\t\tw = v + 1;  if ( nv <= w ) w = 0;     /* next     */\n\n\t\t\t\t\tif ( snip( contour, u, v, w, nv, verts ) ) {\n\n\t\t\t\t\t\tvar a, b, c, s, t;\n\n\t\t\t\t\t\t/* true names of the vertices */\n\n\t\t\t\t\t\ta = verts[ u ];\n\t\t\t\t\t\tb = verts[ v ];\n\t\t\t\t\t\tc = verts[ w ];\n\n\t\t\t\t\t\t/* output Triangle */\n\n\t\t\t\t\t\tresult.push( [ contour[ a ],\n\t\t\t\t\t\t\tcontour[ b ],\n\t\t\t\t\t\t\tcontour[ c ] ] );\n\n\n\t\t\t\t\t\tvertIndices.push( [ verts[ u ], verts[ v ], verts[ w ] ] );\n\n\t\t\t\t\t\t/* remove v from the remaining polygon */\n\n\t\t\t\t\t\tfor ( s = v, t = v + 1; t < nv; s ++, t ++ ) {\n\n\t\t\t\t\t\t\tverts[ s ] = verts[ t ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tnv --;\n\n\t\t\t\t\t\t/* reset error detection counter */\n\n\t\t\t\t\t\tcount = 2 * nv;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( indices ) return vertIndices;\n\t\t\t\treturn result;\n\n\t\t\t};\n\n\t\t} )(),\n\n\t\ttriangulateShape: function ( contour, holes ) {\n\n\t\t\tfunction removeDupEndPts(points) {\n\n\t\t\t\tvar l = points.length;\n\n\t\t\t\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\t\tpoints.pop();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tremoveDupEndPts( contour );\n\t\t\tholes.forEach( removeDupEndPts );\n\n\t\t\tfunction point_in_segment_2D_colin( inSegPt1, inSegPt2, inOtherPt ) {\n\n\t\t\t\t// inOtherPt needs to be collinear to the inSegment\n\t\t\t\tif ( inSegPt1.x !== inSegPt2.x ) {\n\n\t\t\t\t\tif ( inSegPt1.x < inSegPt2.x ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt2.x ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.x <= inOtherPt.x ) && ( inOtherPt.x <= inSegPt1.x ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( inSegPt1.y < inSegPt2.y ) {\n\n\t\t\t\t\t\treturn\t( ( inSegPt1.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt2.y ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn\t( ( inSegPt2.y <= inOtherPt.y ) && ( inOtherPt.y <= inSegPt1.y ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction intersect_segments_2D( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1, inSeg2Pt2, inExcludeAdjacentSegs ) {\n\n\t\t\t\tvar seg1dx = inSeg1Pt2.x - inSeg1Pt1.x,   seg1dy = inSeg1Pt2.y - inSeg1Pt1.y;\n\t\t\t\tvar seg2dx = inSeg2Pt2.x - inSeg2Pt1.x,   seg2dy = inSeg2Pt2.y - inSeg2Pt1.y;\n\n\t\t\t\tvar seg1seg2dx = inSeg1Pt1.x - inSeg2Pt1.x;\n\t\t\t\tvar seg1seg2dy = inSeg1Pt1.y - inSeg2Pt1.y;\n\n\t\t\t\tvar limit\t\t= seg1dy * seg2dx - seg1dx * seg2dy;\n\t\t\t\tvar perpSeg1\t= seg1dy * seg1seg2dx - seg1dx * seg1seg2dy;\n\n\t\t\t\tif ( Math.abs( limit ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\n\t\t\t\t\tvar perpSeg2;\n\t\t\t\t\tif ( limit > 0 ) {\n\n\t\t\t\t\t\tif ( ( perpSeg1 < 0 ) || ( perpSeg1 > limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 < 0 ) || ( perpSeg2 > limit ) ) \t\treturn [];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ( perpSeg1 > 0 ) || ( perpSeg1 < limit ) ) \t\treturn [];\n\t\t\t\t\t\tperpSeg2 = seg2dy * seg1seg2dx - seg2dx * seg1seg2dy;\n\t\t\t\t\t\tif ( ( perpSeg2 > 0 ) || ( perpSeg2 < limit ) ) \t\treturn [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// i.e. to reduce rounding errors\n\t\t\t\t\t// intersection at endpoint of segment#1?\n\t\t\t\t\tif ( perpSeg2 === 0 ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( perpSeg2 === limit ) {\n\n\t\t\t\t\t\tif ( ( inExcludeAdjacentSegs ) &&\n\t\t\t\t\t\t\t ( ( perpSeg1 === 0 ) || ( perpSeg1 === limit ) ) )\t\treturn [];\n\t\t\t\t\t\treturn [ inSeg1Pt2 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// intersection at endpoint of segment#2?\n\t\t\t\t\tif ( perpSeg1 === 0 )\t\treturn [ inSeg2Pt1 ];\n\t\t\t\t\tif ( perpSeg1 === limit )\treturn [ inSeg2Pt2 ];\n\n\t\t\t\t\t// return real intersection point\n\t\t\t\t\tvar factorSeg1 = perpSeg2 / limit;\n\t\t\t\t\treturn\t[ { x: inSeg1Pt1.x + factorSeg1 * seg1dx,\n\t\t\t\t\t\t\t\ty: inSeg1Pt1.y + factorSeg1 * seg1dy } ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( ( perpSeg1 !== 0 ) ||\n\t\t\t\t\t\t ( seg2dy * seg1seg2dx !== seg2dx * seg1seg2dy ) ) \t\t\treturn [];\n\n\t\t\t\t\t// they are collinear or degenerate\n\t\t\t\t\tvar seg1Pt = ( ( seg1dx === 0 ) && ( seg1dy === 0 ) );\t// segment1 is just a point?\n\t\t\t\t\tvar seg2Pt = ( ( seg2dx === 0 ) && ( seg2dy === 0 ) );\t// segment2 is just a point?\n\t\t\t\t\t// both segments are points\n\t\t\t\t\tif ( seg1Pt && seg2Pt ) {\n\n\t\t\t\t\t\tif ( ( inSeg1Pt1.x !== inSeg2Pt1.x ) ||\n\t\t\t\t\t\t\t ( inSeg1Pt1.y !== inSeg2Pt1.y ) )\t\treturn [];\t// they are distinct  points\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];                 \t\t\t\t\t\t// they are the same point\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#1  is a single point\n\t\t\t\t\tif ( seg1Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg2Pt1, inSeg2Pt2, inSeg1Pt1 ) )\t\treturn [];\t\t// but not in segment#2\n\t\t\t\t\t\treturn [ inSeg1Pt1 ];\n\n\t\t\t\t\t}\n\t\t\t\t\t// segment#2  is a single point\n\t\t\t\t\tif ( seg2Pt ) {\n\n\t\t\t\t\t\tif ( ! point_in_segment_2D_colin( inSeg1Pt1, inSeg1Pt2, inSeg2Pt1 ) )\t\treturn [];\t\t// but not in segment#1\n\t\t\t\t\t\treturn [ inSeg2Pt1 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// they are collinear segments, which might overlap\n\t\t\t\t\tvar seg1min, seg1max, seg1minVal, seg1maxVal;\n\t\t\t\t\tvar seg2min, seg2max, seg2minVal, seg2maxVal;\n\t\t\t\t\tif ( seg1dx !== 0 ) {\n\n\t\t\t\t\t\t// the segments are NOT on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.x < inSeg1Pt2.x ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.x;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.x;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.x < inSeg2Pt2.x ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.x;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.x;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.x;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// the segments are on a vertical line\n\t\t\t\t\t\tif ( inSeg1Pt1.y < inSeg1Pt2.y ) {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt1; seg1minVal = inSeg1Pt1.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt2; seg1maxVal = inSeg1Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg1min = inSeg1Pt2; seg1minVal = inSeg1Pt2.y;\n\t\t\t\t\t\t\tseg1max = inSeg1Pt1; seg1maxVal = inSeg1Pt1.y;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( inSeg2Pt1.y < inSeg2Pt2.y ) {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt1; seg2minVal = inSeg2Pt1.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt2; seg2maxVal = inSeg2Pt2.y;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tseg2min = inSeg2Pt2; seg2minVal = inSeg2Pt2.y;\n\t\t\t\t\t\t\tseg2max = inSeg2Pt1; seg2maxVal = inSeg2Pt1.y;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\tif ( seg1minVal <= seg2minVal ) {\n\n\t\t\t\t\t\tif ( seg1maxVal <  seg2minVal )\treturn [];\n\t\t\t\t\t\tif ( seg1maxVal === seg2minVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg2min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg2min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg2min, seg2max ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( seg1minVal >  seg2maxVal )\treturn [];\n\t\t\t\t\t\tif ( seg1minVal === seg2maxVal )\t{\n\n\t\t\t\t\t\t\tif ( inExcludeAdjacentSegs )\t\treturn [];\n\t\t\t\t\t\t\treturn [ seg1min ];\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( seg1maxVal <= seg2maxVal )\treturn [ seg1min, seg1max ];\n\t\t\t\t\t\treturn\t[ seg1min, seg2max ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction isPointInsideAngle( inVertex, inLegFromPt, inLegToPt, inOtherPt ) {\n\n\t\t\t\t// The order of legs is important\n\n\t\t\t\t// translation of all points, so that Vertex is at (0,0)\n\t\t\t\tvar legFromPtX\t= inLegFromPt.x - inVertex.x,  legFromPtY\t= inLegFromPt.y - inVertex.y;\n\t\t\t\tvar legToPtX\t= inLegToPt.x\t- inVertex.x,  legToPtY\t\t= inLegToPt.y\t- inVertex.y;\n\t\t\t\tvar otherPtX\t= inOtherPt.x\t- inVertex.x,  otherPtY\t\t= inOtherPt.y\t- inVertex.y;\n\n\t\t\t\t// main angle >0: < 180 deg.; 0: 180 deg.; <0: > 180 deg.\n\t\t\t\tvar from2toAngle\t= legFromPtX * legToPtY - legFromPtY * legToPtX;\n\t\t\t\tvar from2otherAngle\t= legFromPtX * otherPtY - legFromPtY * otherPtX;\n\n\t\t\t\tif ( Math.abs( from2toAngle ) > Number.EPSILON ) {\n\n\t\t\t\t\t// angle != 180 deg.\n\n\t\t\t\t\tvar other2toAngle\t\t= otherPtX * legToPtY - otherPtY * legToPtX;\n\t\t\t\t\t// console.log( \"from2to: \" + from2toAngle + \", from2other: \" + from2otherAngle + \", other2to: \" + other2toAngle );\n\n\t\t\t\t\tif ( from2toAngle > 0 ) {\n\n\t\t\t\t\t\t// main angle < 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) && ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// main angle > 180 deg.\n\t\t\t\t\t\treturn\t( ( from2otherAngle >= 0 ) || ( other2toAngle >= 0 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// angle == 180 deg.\n\t\t\t\t\t// console.log( \"from2to: 180 deg., from2other: \" + from2otherAngle  );\n\t\t\t\t\treturn\t( from2otherAngle > 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tfunction removeHoles( contour, holes ) {\n\n\t\t\t\tvar shape = contour.concat(); // work on this shape\n\t\t\t\tvar hole;\n\n\t\t\t\tfunction isCutLineInsideAngles( inShapeIdx, inHoleIdx ) {\n\n\t\t\t\t\t// Check if hole point lies within angle around shape point\n\t\t\t\t\tvar lastShapeIdx = shape.length - 1;\n\n\t\t\t\t\tvar prevShapeIdx = inShapeIdx - 1;\n\t\t\t\t\tif ( prevShapeIdx < 0 )\t\t\tprevShapeIdx = lastShapeIdx;\n\n\t\t\t\t\tvar nextShapeIdx = inShapeIdx + 1;\n\t\t\t\t\tif ( nextShapeIdx > lastShapeIdx )\tnextShapeIdx = 0;\n\n\t\t\t\t\tvar insideAngle = isPointInsideAngle( shape[ inShapeIdx ], shape[ prevShapeIdx ], shape[ nextShapeIdx ], hole[ inHoleIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Shape): \" + inShapeIdx + \", Point: \" + hole[inHoleIdx].x + \"/\" + hole[inHoleIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check if shape point lies within angle around hole point\n\t\t\t\t\tvar lastHoleIdx = hole.length - 1;\n\n\t\t\t\t\tvar prevHoleIdx = inHoleIdx - 1;\n\t\t\t\t\tif ( prevHoleIdx < 0 )\t\t\tprevHoleIdx = lastHoleIdx;\n\n\t\t\t\t\tvar nextHoleIdx = inHoleIdx + 1;\n\t\t\t\t\tif ( nextHoleIdx > lastHoleIdx )\tnextHoleIdx = 0;\n\n\t\t\t\t\tinsideAngle = isPointInsideAngle( hole[ inHoleIdx ], hole[ prevHoleIdx ], hole[ nextHoleIdx ], shape[ inShapeIdx ] );\n\t\t\t\t\tif ( ! insideAngle ) {\n\n\t\t\t\t\t\t// console.log( \"Vertex (Hole): \" + inHoleIdx + \", Point: \" + shape[inShapeIdx].x + \"/\" + shape[inShapeIdx].y );\n\t\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\ttrue;\n\n\t\t\t\t}\n\n\t\t\t\tfunction intersectsShapeEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with shape edges\n\t\t\t\t\tvar sIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( sIdx = 0; sIdx < shape.length; sIdx ++ ) {\n\n\t\t\t\t\t\tnextIdx = sIdx + 1; nextIdx %= shape.length;\n\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, shape[ sIdx ], shape[ nextIdx ], true );\n\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar indepHoles = [];\n\n\t\t\t\tfunction intersectsHoleEdge( inShapePt, inHolePt ) {\n\n\t\t\t\t\t// checks for intersections with hole edges\n\t\t\t\t\tvar ihIdx, chkHole,\n\t\t\t\t\t\thIdx, nextIdx, intersection;\n\t\t\t\t\tfor ( ihIdx = 0; ihIdx < indepHoles.length; ihIdx ++ ) {\n\n\t\t\t\t\t\tchkHole = holes[ indepHoles[ ihIdx ] ];\n\t\t\t\t\t\tfor ( hIdx = 0; hIdx < chkHole.length; hIdx ++ ) {\n\n\t\t\t\t\t\t\tnextIdx = hIdx + 1; nextIdx %= chkHole.length;\n\t\t\t\t\t\t\tintersection = intersect_segments_2D( inShapePt, inHolePt, chkHole[ hIdx ], chkHole[ nextIdx ], true );\n\t\t\t\t\t\t\tif ( intersection.length > 0 )\t\treturn\ttrue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\t\t\t\t\treturn\tfalse;\n\n\t\t\t\t}\n\n\t\t\t\tvar holeIndex, shapeIndex,\n\t\t\t\t\tshapePt, holePt,\n\t\t\t\t\tholeIdx, cutKey, failedCuts = [],\n\t\t\t\t\ttmpShape1, tmpShape2,\n\t\t\t\t\ttmpHole1, tmpHole2;\n\n\t\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tindepHoles.push( h );\n\n\t\t\t\t}\n\n\t\t\t\tvar minShapeIndex = 0;\n\t\t\t\tvar counter = indepHoles.length * 2;\n\t\t\t\twhile ( indepHoles.length > 0 ) {\n\n\t\t\t\t\tcounter --;\n\t\t\t\t\tif ( counter < 0 ) {\n\n\t\t\t\t\t\tconsole.log( 'THREE.ShapeUtils: Infinite Loop! Holes left:\" + indepHoles.length + \", Probably Hole outside Shape!' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// search for shape-vertex and hole-vertex,\n\t\t\t\t\t// which can be connected without intersections\n\t\t\t\t\tfor ( shapeIndex = minShapeIndex; shapeIndex < shape.length; shapeIndex ++ ) {\n\n\t\t\t\t\t\tshapePt = shape[ shapeIndex ];\n\t\t\t\t\t\tholeIndex\t= - 1;\n\n\t\t\t\t\t\t// search for hole which can be reached without intersections\n\t\t\t\t\t\tfor ( var h = 0; h < indepHoles.length; h ++ ) {\n\n\t\t\t\t\t\t\tholeIdx = indepHoles[ h ];\n\n\t\t\t\t\t\t\t// prevent multiple checks\n\t\t\t\t\t\t\tcutKey = shapePt.x + ':' + shapePt.y + ':' + holeIdx;\n\t\t\t\t\t\t\tif ( failedCuts[ cutKey ] !== undefined )\t\t\tcontinue;\n\n\t\t\t\t\t\t\thole = holes[ holeIdx ];\n\t\t\t\t\t\t\tfor ( var h2 = 0; h2 < hole.length; h2 ++ ) {\n\n\t\t\t\t\t\t\t\tholePt = hole[ h2 ];\n\t\t\t\t\t\t\t\tif ( ! isCutLineInsideAngles( shapeIndex, h2 ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsShapeEdge( shapePt, holePt ) )\t\tcontinue;\n\t\t\t\t\t\t\t\tif ( intersectsHoleEdge( shapePt, holePt ) )\t\tcontinue;\n\n\t\t\t\t\t\t\t\tholeIndex = h2;\n\t\t\t\t\t\t\t\tindepHoles.splice( h, 1 );\n\n\t\t\t\t\t\t\t\ttmpShape1 = shape.slice( 0, shapeIndex + 1 );\n\t\t\t\t\t\t\t\ttmpShape2 = shape.slice( shapeIndex );\n\t\t\t\t\t\t\t\ttmpHole1 = hole.slice( holeIndex );\n\t\t\t\t\t\t\t\ttmpHole2 = hole.slice( 0, holeIndex + 1 );\n\n\t\t\t\t\t\t\t\tshape = tmpShape1.concat( tmpHole1 ).concat( tmpHole2 ).concat( tmpShape2 );\n\n\t\t\t\t\t\t\t\tminShapeIndex = shapeIndex;\n\n\t\t\t\t\t\t\t\t// Debug only, to show the selected cuts\n\t\t\t\t\t\t\t\t// glob_CutLines.push( [ shapePt, holePt ] );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t\t\tfailedCuts[ cutKey ] = true;\t\t\t// remember failure\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( holeIndex >= 0 )\tbreak;\t\t// hole-vertex found\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn shape; \t\t\t/* shape with no holes */\n\n\t\t\t}\n\n\n\t\t\tvar i, il, f, face,\n\t\t\t\tkey, index,\n\t\t\t\tallPointsMap = {};\n\n\t\t\t// To maintain reference to old shape, one must match coordinates, or offset the indices from original arrays. It's probably easier to do the first.\n\n\t\t\tvar allpoints = contour.concat();\n\n\t\t\tfor ( var h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( allpoints, holes[ h ] );\n\n\t\t\t}\n\n\t\t\t//console.log( \"allpoints\",allpoints, allpoints.length );\n\n\t\t\t// prepare all points map\n\n\t\t\tfor ( i = 0, il = allpoints.length; i < il; i ++ ) {\n\n\t\t\t\tkey = allpoints[ i ].x + ':' + allpoints[ i ].y;\n\n\t\t\t\tif ( allPointsMap[ key ] !== undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ShapeUtils: Duplicate point', key, i );\n\n\t\t\t\t}\n\n\t\t\t\tallPointsMap[ key ] = i;\n\n\t\t\t}\n\n\t\t\t// remove holes by cutting paths to holes and adding them to the shape\n\t\t\tvar shapeWithoutHoles = removeHoles( contour, holes );\n\n\t\t\tvar triangles = ShapeUtils.triangulate( shapeWithoutHoles, false ); // True returns indices for points of spooled shape\n\t\t\t//console.log( \"triangles\",triangles, triangles.length );\n\n\t\t\t// check all face vertices against all points map\n\n\t\t\tfor ( i = 0, il = triangles.length; i < il; i ++ ) {\n\n\t\t\t\tface = triangles[ i ];\n\n\t\t\t\tfor ( f = 0; f < 3; f ++ ) {\n\n\t\t\t\t\tkey = face[ f ].x + ':' + face[ f ].y;\n\n\t\t\t\t\tindex = allPointsMap[ key ];\n\n\t\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\t\tface[ f ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn triangles.concat();\n\n\t\t},\n\n\t\tisClockWise: function ( pts ) {\n\n\t\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t * Creates extruded geometry from a path shape.\n\t *\n\t * parameters = {\n\t *\n\t *  curveSegments: <int>, // number of points on the curves\n\t *  steps: <int>, // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n\t *  amount: <int>, // Depth to extrude the shape\n\t *\n\t *  bevelEnabled: <bool>, // turn on bevel\n\t *  bevelThickness: <float>, // how deep into the original shape bevel goes\n\t *  bevelSize: <float>, // how far from shape outline is bevel\n\t *  bevelSegments: <int>, // number of bevel layers\n\t *\n\t *  extrudePath: <THREE.Curve> // curve to extrude shape along\n\t *  frames: <Object> // containing arrays of tangents, normals, binormals\n\t *\n\t *  UVGenerator: <Object> // object that provides UV generator functions\n\t *\n\t * }\n\t */\n\n\t// ExtrudeGeometry\n\n\tfunction ExtrudeGeometry( shapes, options ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\toptions: options\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ExtrudeBufferGeometry( shapes, options ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tExtrudeGeometry.prototype = Object.create( Geometry.prototype );\n\tExtrudeGeometry.prototype.constructor = ExtrudeGeometry;\n\n\t// ExtrudeBufferGeometry\n\n\tfunction ExtrudeBufferGeometry( shapes, options ) {\n\n\t\tif ( typeof ( shapes ) === \"undefined\" ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ExtrudeBufferGeometry';\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tthis.addShapeList( shapes, options );\n\n\t\tthis.computeVertexNormals();\n\n\t\t// can't really use automatic vertex normals\n\t\t// as then front and back sides get smoothed too\n\t\t// should do separate smoothing just for sides\n\n\t\t//this.computeVertexNormals();\n\n\t\t//console.log( \"took\", ( Date.now() - startTime ) );\n\n\t}\n\n\tExtrudeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tExtrudeBufferGeometry.prototype.constructor = ExtrudeBufferGeometry;\n\n\tExtrudeBufferGeometry.prototype.getArrays = function () {\n\n\t\tvar positionAttribute = this.getAttribute( \"position\" );\n\t\tvar verticesArray = positionAttribute ? Array.prototype.slice.call( positionAttribute.array ) : [];\n\n\t\tvar uvAttribute = this.getAttribute( \"uv\" );\n\t\tvar uvArray = uvAttribute ? Array.prototype.slice.call( uvAttribute.array ) : [];\n\n\t\tvar IndexAttribute = this.index;\n\t\tvar indicesArray = IndexAttribute ? Array.prototype.slice.call( IndexAttribute.array ) : [];\n\n\t\treturn {\n\t\t\tposition: verticesArray,\n\t\t\tuv: uvArray,\n\t\t\tindex: indicesArray\n\t\t};\n\n\t};\n\n\tExtrudeBufferGeometry.prototype.addShapeList = function ( shapes, options ) {\n\n\t\tvar sl = shapes.length;\n\t\toptions.arrays = this.getArrays();\n\n\t\tfor ( var s = 0; s < sl; s ++ ) {\n\n\t\t\tvar shape = shapes[ s ];\n\t\t\tthis.addShape( shape, options );\n\n\t\t}\n\n\t\tthis.setIndex( options.arrays.index );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( options.arrays.position, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( options.arrays.uv, 2 ) );\n\n\t};\n\n\tExtrudeBufferGeometry.prototype.addShape = function ( shape, options ) {\n\n\t\tvar arrays = options.arrays ? options.arrays : this.getArrays();\n\t\tvar verticesArray = arrays.position;\n\t\tvar indicesArray = arrays.index;\n\t\tvar uvArray = arrays.uv;\n\n\t\tvar placeholder = [];\n\n\n\t\tvar amount = options.amount !== undefined ? options.amount : 100;\n\n\t\tvar bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 6; // 10\n\t\tvar bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 2; // 8\n\t\tvar bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\tvar bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true; // false\n\n\t\tvar curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\n\t\tvar steps = options.steps !== undefined ? options.steps : 1;\n\n\t\tvar extrudePath = options.extrudePath;\n\t\tvar extrudePts, extrudeByPath = false;\n\n\t\t// Use default WorldUVGenerator if no UV generators are specified.\n\t\tvar uvgen = options.UVGenerator !== undefined ? options.UVGenerator : ExtrudeGeometry.WorldUVGenerator;\n\n\t\tvar splineTube, binormal, normal, position2;\n\t\tif ( extrudePath ) {\n\n\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\textrudeByPath = true;\n\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t// SETUP TNB variables\n\n\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\tsplineTube = options.frames !== undefined ? options.frames : extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\tbinormal = new Vector3();\n\t\t\tnormal = new Vector3();\n\t\t\tposition2 = new Vector3();\n\n\t\t}\n\n\t\t// Safeguards if bevels are not enabled\n\n\t\tif ( ! bevelEnabled ) {\n\n\t\t\tbevelSegments = 0;\n\t\t\tbevelThickness = 0;\n\t\t\tbevelSize = 0;\n\n\t\t}\n\n\t\t// Variables initialization\n\n\t\tvar ahole, h, hl; // looping of holes\n\t\tvar scope = this;\n\n\t\tvar shapePoints = shape.extractPoints( curveSegments );\n\n\t\tvar vertices = shapePoints.shape;\n\t\tvar holes = shapePoints.holes;\n\n\t\tvar reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\tif ( reverse ) {\n\n\t\t\tvertices = vertices.reverse();\n\n\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tvar faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t/* Vertices */\n\n\t\tvar contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\tvertices = vertices.concat( ahole );\n\n\t\t}\n\n\n\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\tif ( ! vec ) console.error( \"THREE.ExtrudeGeometry: vec does not exist\" );\n\n\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t}\n\n\t\tvar b, bs, t, z,\n\t\t\tvert, vlen = vertices.length,\n\t\t\tface, flen = faces.length;\n\n\n\t\t// Find directions for point movement\n\n\n\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t//   shifted by 1 unit (length of normalized vector) to the left\n\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t//\n\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t//  adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\tvar v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\tvar v_prev_x = inPt.x - inPrev.x,\n\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\tvar v_next_x = inNext.x - inPt.x,\n\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\tvar v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t// check for collinear edges\n\t\t\tvar collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t// not collinear\n\n\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\tvar v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\tvar v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\tvar ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\tvar ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\tvar ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\tvar ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\tvar sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t//  but prevent crazy spikes\n\t\t\t\tvar v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\tvar direction_eq = false; // assumes: opposite\n\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t}\n\n\n\t\tvar contourMovements = [];\n\n\t\tfor ( var i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\tif ( j === il ) j = 0;\n\t\t\tif ( k === il ) k = 0;\n\n\t\t\t//  (j)---(i)---(k)\n\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t}\n\n\t\tvar holesMovements = [],\n\t\t\toneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\tahole = holes[ h ];\n\n\t\t\toneHoleMovements = [];\n\n\t\t\tfor ( i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t//  (j)---(i)---(k)\n\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t}\n\n\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t}\n\n\n\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\tfor ( b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tbs = bevelSize;\n\n\t\t// Back facing vertices\n\n\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t} else {\n\n\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add stepped vertices...\n\t\t// Including front facing vertices\n\n\t\tvar s;\n\n\t\tfor ( s = 1; s <= steps; s ++ ) {\n\n\t\t\tfor ( i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tvert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, amount / steps * s );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// Add bevel segments planes\n\n\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\tfor ( b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\tt = b / bevelSegments;\n\t\t\tz = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\tbs = bevelSize * Math.sin( t * Math.PI / 2 );\n\n\t\t\t// contract shape\n\n\t\t\tfor ( i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\tvert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t}\n\n\t\t\t// expand holes\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\tfor ( i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\tvert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, amount + z );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/* Faces */\n\n\t\t// Top and bottom faces\n\n\t\tbuildLidFaces();\n\n\t\t// Sides faces\n\n\t\tbuildSideFaces();\n\n\n\t\t/////  Internal functions\n\n\t\tfunction buildLidFaces() {\n\n\t\t\tvar start = verticesArray.length/3;\n\n\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\tvar layer = 0; // steps + 1\n\t\t\t\tvar offset = vlen * layer;\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bottom faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// Top faces\n\n\t\t\t\tfor ( i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\tface = faces[ i ];\n\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tscope.addGroup( start, verticesArray.length/3 -start, options.material !== undefined ? options.material : 0);\n\n\t\t}\n\n\t\t// Create faces for the z-sides of the shape\n\n\t\tfunction buildSideFaces() {\n\n\t\t\tvar start = verticesArray.length/3;\n\t\t\tvar layeroffset = 0;\n\t\t\tsidewalls( contour, layeroffset );\n\t\t\tlayeroffset += contour.length;\n\n\t\t\tfor ( h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tahole = holes[ h ];\n\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t//, true\n\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t}\n\n\n\t\t\tscope.addGroup( start, verticesArray.length/3 -start, options.extrudeMaterial !== undefined ? options.extrudeMaterial : 1);\n\n\n\t\t}\n\n\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\tvar j, k;\n\t\t\ti = contour.length;\n\n\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\tj = i;\n\t\t\t\tk = i - 1;\n\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\tvar s = 0,\n\t\t\t\t\tsl = steps + bevelSegments * 2;\n\n\t\t\t\tfor ( s = 0; s < sl; s ++ ) {\n\n\t\t\t\t\tvar slen1 = vlen * s;\n\t\t\t\t\tvar slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\tvar a = layeroffset + j + slen1,\n\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\tf4( a, b, c, d, contour, s, sl, j, k );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction v( x, y, z ) {\n\n\t\t\tplaceholder.push( x );\n\t\t\tplaceholder.push( y );\n\t\t\tplaceholder.push( z );\n\n\t\t}\n\n\n\t\tfunction f3( a, b, c ) {\n\n\t\t\taddVertex( a );\n\t\t\taddVertex( b );\n\t\t\taddVertex( c );\n\n\t\t\tvar nextIndex = verticesArray.length / 3;\n\t\t\tvar uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\taddUV( uvs[ 0 ] );\n\t\t\taddUV( uvs[ 1 ] );\n\t\t\taddUV( uvs[ 2 ] );\n\n\t\t}\n\n\t\tfunction f4( a, b, c, d, wallContour, stepIndex, stepsLength, contourIndex1, contourIndex2 ) {\n\n\t\t\taddVertex( a );\n\t\t\taddVertex( b );\n\t\t\taddVertex( d );\n\n\t\t\taddVertex( b );\n\t\t\taddVertex( c );\n\t\t\taddVertex( d );\n\n\n\t\t\tvar nextIndex = verticesArray.length / 3;\n\t\t\tvar uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\taddUV( uvs[ 0 ] );\n\t\t\taddUV( uvs[ 1 ] );\n\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\taddUV( uvs[ 1 ] );\n\t\t\taddUV( uvs[ 2 ] );\n\t\t\taddUV( uvs[ 3 ] );\n\n\t\t}\n\n\t\tfunction addVertex( index ) {\n\n\t\t\tindicesArray.push( verticesArray.length / 3 );\n\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t}\n\n\n\t\tfunction addUV( vector2 ) {\n\n\t\t\tuvArray.push( vector2.x );\n\t\t\tuvArray.push( vector2.y );\n\n\t\t}\n\n\t\tif ( ! options.arrays ) {\n\n\t\t\tthis.setIndex( indicesArray );\n\t\t\tthis.addAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\t\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( options.arrays.uv, 2 ) );\n\n\t\t}\n\n\t};\n\n\tExtrudeGeometry.WorldUVGenerator = {\n\n\t\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\t\tvar a_x = vertices[ indexA * 3 ];\n\t\t\tvar a_y = vertices[ indexA * 3 + 1 ];\n\t\t\tvar b_x = vertices[ indexB * 3 ];\n\t\t\tvar b_y = vertices[ indexB * 3 + 1 ];\n\t\t\tvar c_x = vertices[ indexC * 3 ];\n\t\t\tvar c_y = vertices[ indexC * 3 + 1 ];\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_x, a_y ),\n\t\t\t\tnew Vector2( b_x, b_y ),\n\t\t\t\tnew Vector2( c_x, c_y )\n\t\t\t];\n\n\t\t},\n\n\t\tgenerateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {\n\n\t\t\tvar a_x = vertices[ indexA * 3 ];\n\t\t\tvar a_y = vertices[ indexA * 3 + 1 ];\n\t\t\tvar a_z = vertices[ indexA * 3 + 2 ];\n\t\t\tvar b_x = vertices[ indexB * 3 ];\n\t\t\tvar b_y = vertices[ indexB * 3 + 1 ];\n\t\t\tvar b_z = vertices[ indexB * 3 + 2 ];\n\t\t\tvar c_x = vertices[ indexC * 3 ];\n\t\t\tvar c_y = vertices[ indexC * 3 + 1 ];\n\t\t\tvar c_z = vertices[ indexC * 3 + 2 ];\n\t\t\tvar d_x = vertices[ indexD * 3 ];\n\t\t\tvar d_y = vertices[ indexD * 3 + 1 ];\n\t\t\tvar d_z = vertices[ indexD * 3 + 2 ];\n\n\t\t\tif ( Math.abs( a_y - b_y ) < 0.01 ) {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a_x, 1 - a_z ),\n\t\t\t\t\tnew Vector2( b_x, 1 - b_z ),\n\t\t\t\t\tnew Vector2( c_x, 1 - c_z ),\n\t\t\t\t\tnew Vector2( d_x, 1 - d_z )\n\t\t\t\t];\n\n\t\t\t} else {\n\n\t\t\t\treturn [\n\t\t\t\t\tnew Vector2( a_y, 1 - a_z ),\n\t\t\t\t\tnew Vector2( b_y, 1 - b_z ),\n\t\t\t\t\tnew Vector2( c_y, 1 - c_z ),\n\t\t\t\t\tnew Vector2( d_y, 1 - d_z )\n\t\t\t\t];\n\n\t\t\t}\n\n\t\t}\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * Text = 3D Text\n\t *\n\t * parameters = {\n\t *  font: <THREE.Font>, // font\n\t *\n\t *  size: <float>, // size of the text\n\t *  height: <float>, // thickness to extrude text\n\t *  curveSegments: <int>, // number of points on the curves\n\t *\n\t *  bevelEnabled: <bool>, // turn on bevel\n\t *  bevelThickness: <float>, // how deep into text bevel goes\n\t *  bevelSize: <float> // how far from text outline is bevel\n\t * }\n\t */\n\n\t// TextGeometry\n\n\tfunction TextGeometry(  text, parameters ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'TextGeometry';\n\n\t\tthis.parameters = {\n\t\t\ttext: text,\n\t\t\tparameters: parameters\n\t\t};\n\n\t\tthis.fromBufferGeometry( new TextBufferGeometry( text, parameters ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tTextGeometry.prototype = Object.create( Geometry.prototype );\n\tTextGeometry.prototype.constructor = TextGeometry;\n\n\t// TextBufferGeometry\n\n\tfunction TextBufferGeometry( text, parameters ) {\n\n\t\tparameters = parameters || {};\n\n\t\tvar font = parameters.font;\n\n\t\tif ( ! ( font && font.isFont ) ) {\n\n\t\t\tconsole.error( 'THREE.TextGeometry: font parameter is not an instance of THREE.Font.' );\n\t\t\treturn new Geometry();\n\n\t\t}\n\n\t\tvar shapes = font.generateShapes( text, parameters.size, parameters.curveSegments );\n\n\t\t// translate parameters to ExtrudeGeometry API\n\n\t\tparameters.amount = parameters.height !== undefined ? parameters.height : 50;\n\n\t\t// defaults\n\n\t\tif ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;\n\t\tif ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;\n\t\tif ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;\n\n\t\tExtrudeBufferGeometry.call( this, shapes, parameters );\n\n\t\tthis.type = 'TextBufferGeometry';\n\n\t}\n\n\tTextBufferGeometry.prototype = Object.create( ExtrudeBufferGeometry.prototype );\n\tTextBufferGeometry.prototype.constructor = TextBufferGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\t// SphereGeometry\n\n\tfunction SphereGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tSphereGeometry.prototype = Object.create( Geometry.prototype );\n\tSphereGeometry.prototype.constructor = SphereGeometry;\n\n\t// SphereBufferGeometry\n\n\tfunction SphereBufferGeometry( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'SphereBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tradius = radius || 50;\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) || 8 );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) || 6 );\n\n\t\tphiStart = phiStart !== undefined ? phiStart : 0;\n\t\tphiLength = phiLength !== undefined ? phiLength : Math.PI * 2;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI;\n\n\t\tvar thetaEnd = thetaStart + thetaLength;\n\n\t\tvar ix, iy;\n\n\t\tvar index = 0;\n\t\tvar grid = [];\n\n\t\tvar vertex = new Vector3();\n\t\tvar normal = new Vector3();\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tvar verticesRow = [];\n\n\t\t\tvar v = iy / heightSegments;\n\n\t\t\tfor ( ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tvar u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.set( vertex.x, vertex.y, vertex.z ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tvar a = grid[ iy ][ ix + 1 ];\n\t\t\t\tvar b = grid[ iy ][ ix ];\n\t\t\t\tvar c = grid[ iy + 1 ][ ix ];\n\t\t\t\tvar d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tSphereBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tSphereBufferGeometry.prototype.constructor = SphereBufferGeometry;\n\n\t/**\n\t * @author Kaleb Murphy\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\t// RingGeometry\n\n\tfunction RingGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'RingGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tRingGeometry.prototype = Object.create( Geometry.prototype );\n\tRingGeometry.prototype.constructor = RingGeometry;\n\n\t// RingBufferGeometry\n\n\tfunction RingBufferGeometry( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'RingBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tinnerRadius = innerRadius || 20;\n\t\touterRadius = outerRadius || 50;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\tthetaSegments = thetaSegments !== undefined ? Math.max( 3, thetaSegments ) : 8;\n\t\tphiSegments = phiSegments !== undefined ? Math.max( 1, phiSegments ) : 1;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// some helper variables\n\n\t\tvar segment;\n\t\tvar radius = innerRadius;\n\t\tvar radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar j, i;\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tsegment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tvar thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tsegment = i + thetaSegmentLevel;\n\n\t\t\t\tvar a = segment;\n\t\t\t\tvar b = segment + thetaSegments + 1;\n\t\t\t\tvar c = segment + thetaSegments + 2;\n\t\t\t\tvar d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tRingBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tRingBufferGeometry.prototype.constructor = RingBufferGeometry;\n\n\t/**\n\t * @author astrodud / http://astrodud.isgreat.org/\n\t * @author zz85 / https://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\t// LatheGeometry\n\n\tfunction LatheGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new LatheBufferGeometry( points, segments, phiStart, phiLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tLatheGeometry.prototype = Object.create( Geometry.prototype );\n\tLatheGeometry.prototype.constructor = LatheGeometry;\n\n\t// LatheBufferGeometry\n\n\tfunction LatheBufferGeometry( points, segments, phiStart, phiLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'LatheBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments ) || 12;\n\t\tphiStart = phiStart || 0;\n\t\tphiLength = phiLength || Math.PI * 2;\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = _Math.clamp( phiLength, 0, Math.PI * 2 );\n\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar base;\n\t\tvar inverseSegments = 1.0 / segments;\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\t\tvar i, j;\n\n\t\t// generate vertices and uvs\n\n\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\tvar phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tvar sin = Math.sin( phi );\n\t\t\tvar cos = Math.cos( phi );\n\n\t\t\tfor ( j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tbase = j + i * points.length;\n\n\t\t\t\tvar a = base;\n\t\t\t\tvar b = base + points.length;\n\t\t\t\tvar c = base + points.length + 1;\n\t\t\t\tvar d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// generate normals\n\n\t\tthis.computeVertexNormals();\n\n\t\t// if the geometry is closed, we need to average the normals along the seam.\n\t\t// because the corresponding vertices are identical (but still have different UVs).\n\n\t\tif ( phiLength === Math.PI * 2 ) {\n\n\t\t\tvar normals = this.attributes.normal.array;\n\t\t\tvar n1 = new Vector3();\n\t\t\tvar n2 = new Vector3();\n\t\t\tvar n = new Vector3();\n\n\t\t\t// this is the buffer offset for the last line of vertices\n\n\t\t\tbase = segments * points.length * 3;\n\n\t\t\tfor ( i = 0, j = 0; i < points.length; i ++, j += 3 ) {\n\n\t\t\t\t// select the normal of the vertex in the first line\n\n\t\t\t\tn1.x = normals[ j + 0 ];\n\t\t\t\tn1.y = normals[ j + 1 ];\n\t\t\t\tn1.z = normals[ j + 2 ];\n\n\t\t\t\t// select the normal of the vertex in the last line\n\n\t\t\t\tn2.x = normals[ base + j + 0 ];\n\t\t\t\tn2.y = normals[ base + j + 1 ];\n\t\t\t\tn2.z = normals[ base + j + 2 ];\n\n\t\t\t\t// average normals\n\n\t\t\t\tn.addVectors( n1, n2 ).normalize();\n\n\t\t\t\t// assign the new values to both normals\n\n\t\t\t\tnormals[ j + 0 ] = normals[ base + j + 0 ] = n.x;\n\t\t\t\tnormals[ j + 1 ] = normals[ base + j + 1 ] = n.y;\n\t\t\t\tnormals[ j + 2 ] = normals[ base + j + 2 ] = n.z;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tLatheBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tLatheBufferGeometry.prototype.constructor = LatheBufferGeometry;\n\n\t/**\n\t * @author jonobr1 / http://jonobr1.com\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\t// ShapeGeometry\n\n\tfunction ShapeGeometry( shapes, curveSegments ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tif ( typeof curveSegments === 'object' ) {\n\n\t\t\tconsole.warn( 'THREE.ShapeGeometry: Options parameter has been removed.' );\n\n\t\t\tcurveSegments = curveSegments.curveSegments;\n\n\t\t}\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\tthis.fromBufferGeometry( new ShapeBufferGeometry( shapes, curveSegments ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tShapeGeometry.prototype = Object.create( Geometry.prototype );\n\tShapeGeometry.prototype.constructor = ShapeGeometry;\n\n\t// ShapeBufferGeometry\n\n\tfunction ShapeBufferGeometry( shapes, curveSegments ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'ShapeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\tcurveSegments = curveSegments || 12;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar groupStart = 0;\n\t\tvar groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( var i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tvar i, l, shapeHole;\n\n\t\t\tvar indexOffset = vertices.length / 3;\n\t\t\tvar points = shape.extractPoints( curveSegments );\n\n\t\t\tvar shapeVertices = points.shape;\n\t\t\tvar shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t\t// also check if holes are in the opposite direction\n\n\t\t\t\tfor ( i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\t\tshapeHole = shapeHoles[ i ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tshapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tvar vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// incides\n\n\t\t\tfor ( i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tvar a = face[ 0 ] + indexOffset;\n\t\t\t\tvar b = face[ 1 ] + indexOffset;\n\t\t\t\tvar c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tShapeBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tShapeBufferGeometry.prototype.constructor = ShapeBufferGeometry;\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction EdgesGeometry( geometry, thresholdAngle ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\tthis.parameters = {\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tthresholdAngle = ( thresholdAngle !== undefined ) ? thresholdAngle : 1;\n\n\t\t// buffer\n\n\t\tvar vertices = [];\n\n\t\t// helper variables\n\n\t\tvar thresholdDot = Math.cos( _Math.DEG2RAD * thresholdAngle );\n\t\tvar edge = [ 0, 0 ], edges = {}, edge1, edge2;\n\t\tvar key, keys = [ 'a', 'b', 'c' ];\n\n\t\t// prepare source geometry\n\n\t\tvar geometry2;\n\n\t\tif ( geometry.isBufferGeometry ) {\n\n\t\t\tgeometry2 = new Geometry();\n\t\t\tgeometry2.fromBufferGeometry( geometry );\n\n\t\t} else {\n\n\t\t\tgeometry2 = geometry.clone();\n\n\t\t}\n\n\t\tgeometry2.mergeVertices();\n\t\tgeometry2.computeFaceNormals();\n\n\t\tvar sourceVertices = geometry2.vertices;\n\t\tvar faces = geometry2.faces;\n\n\t\t// now create a data structure where each entry represents an edge with its adjoining faces\n\n\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tvar face = faces[ i ];\n\n\t\t\tfor ( var j = 0; j < 3; j ++ ) {\n\n\t\t\t\tedge1 = face[ keys[ j ] ];\n\t\t\t\tedge2 = face[ keys[ ( j + 1 ) % 3 ] ];\n\t\t\t\tedge[ 0 ] = Math.min( edge1, edge2 );\n\t\t\t\tedge[ 1 ] = Math.max( edge1, edge2 );\n\n\t\t\t\tkey = edge[ 0 ] + ',' + edge[ 1 ];\n\n\t\t\t\tif ( edges[ key ] === undefined ) {\n\n\t\t\t\t\tedges[ key ] = { index1: edge[ 0 ], index2: edge[ 1 ], face1: i, face2: undefined };\n\n\t\t\t\t} else {\n\n\t\t\t\t\tedges[ key ].face2 = i;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices\n\n\t\tfor ( key in edges ) {\n\n\t\t\tvar e = edges[ key ];\n\n\t\t\t// an edge is only rendered if the angle (in degrees) between the face normals of the adjoining faces exceeds this value. default = 1 degree.\n\n\t\t\tif ( e.face2 === undefined || faces[ e.face1 ].normal.dot( faces[ e.face2 ].normal ) <= thresholdDot ) {\n\n\t\t\t\tvar vertex = sourceVertices[ e.index1 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\tvertex = sourceVertices[ e.index2 ];\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t}\n\n\tEdgesGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tEdgesGeometry.prototype.constructor = EdgesGeometry;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\t// CylinderGeometry\n\n\tfunction CylinderGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tCylinderGeometry.prototype = Object.create( Geometry.prototype );\n\tCylinderGeometry.prototype.constructor = CylinderGeometry;\n\n\t// CylinderBufferGeometry\n\n\tfunction CylinderBufferGeometry( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CylinderBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tvar scope = this;\n\n\t\tradiusTop = radiusTop !== undefined ? radiusTop : 20;\n\t\tradiusBottom = radiusBottom !== undefined ? radiusBottom : 20;\n\t\theight = height !== undefined ? height : 100;\n\n\t\tradialSegments = Math.floor( radialSegments ) || 8;\n\t\theightSegments = Math.floor( heightSegments ) || 1;\n\n\t\topenEnded = openEnded !== undefined ? openEnded : false;\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0.0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : 2.0 * Math.PI;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar index = 0;\n\t\tvar indexArray = [];\n\t\tvar halfHeight = height / 2;\n\t\tvar groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tvar x, y;\n\t\t\tvar normal = new Vector3();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tvar slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tvar indexRow = [];\n\n\t\t\t\tvar v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tvar radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tvar u = x / radialSegments;\n\n\t\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tvar sinTheta = Math.sin( theta );\n\t\t\t\t\tvar cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tvar a = indexArray[ y ][ x ];\n\t\t\t\t\tvar b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tvar c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tvar d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// update group counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\tvar x, centerIndexStart, centerIndexEnd;\n\n\t\t\tvar uv = new Vector2();\n\t\t\tvar vertex = new Vector3();\n\n\t\t\tvar groupCount = 0;\n\n\t\t\tvar radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tvar sign = ( top === true ) ? 1 : - 1;\n\n\t\t\t// save the index of the first center vertex\n\t\t\tcenterIndexStart = index;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\n\t\t\tcenterIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tvar u = x / radialSegments;\n\t\t\t\tvar theta = u * thetaLength + thetaStart;\n\n\t\t\t\tvar cosTheta = Math.cos( theta );\n\t\t\t\tvar sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tvar c = centerIndexStart + x;\n\t\t\t\tvar i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tCylinderBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCylinderBufferGeometry.prototype.constructor = CylinderBufferGeometry;\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t */\n\n\t// ConeGeometry\n\n\tfunction ConeGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tConeGeometry.prototype = Object.create( CylinderGeometry.prototype );\n\tConeGeometry.prototype.constructor = ConeGeometry;\n\n\t// ConeBufferGeometry\n\n\tfunction ConeBufferGeometry( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tCylinderBufferGeometry.call( this, 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tConeBufferGeometry.prototype = Object.create( CylinderBufferGeometry.prototype );\n\tConeBufferGeometry.prototype.constructor = ConeBufferGeometry;\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t * @author Mugen87 / https://github.com/Mugen87\n\t * @author hughes\n\t */\n\n\t// CircleGeometry\n\n\tfunction CircleGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tGeometry.call( this );\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthis.fromBufferGeometry( new CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) );\n\t\tthis.mergeVertices();\n\n\t}\n\n\tCircleGeometry.prototype = Object.create( Geometry.prototype );\n\tCircleGeometry.prototype.constructor = CircleGeometry;\n\n\t// CircleBufferGeometry\n\n\tfunction CircleBufferGeometry( radius, segments, thetaStart, thetaLength ) {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'CircleBufferGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tradius = radius || 50;\n\t\tsegments = segments !== undefined ? Math.max( 3, segments ) : 8;\n\n\t\tthetaStart = thetaStart !== undefined ? thetaStart : 0;\n\t\tthetaLength = thetaLength !== undefined ? thetaLength : Math.PI * 2;\n\n\t\t// buffers\n\n\t\tvar indices = [];\n\t\tvar vertices = [];\n\t\tvar normals = [];\n\t\tvar uvs = [];\n\n\t\t// helper variables\n\n\t\tvar i, s;\n\t\tvar vertex = new Vector3();\n\t\tvar uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tvar segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.addAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.addAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tCircleBufferGeometry.prototype = Object.create( BufferGeometry.prototype );\n\tCircleBufferGeometry.prototype.constructor = CircleBufferGeometry;\n\n\n\n\tvar Geometries = Object.freeze({\n\t\tWireframeGeometry: WireframeGeometry,\n\t\tParametricGeometry: ParametricGeometry,\n\t\tParametricBufferGeometry: ParametricBufferGeometry,\n\t\tTetrahedronGeometry: TetrahedronGeometry,\n\t\tTetrahedronBufferGeometry: TetrahedronBufferGeometry,\n\t\tOctahedronGeometry: OctahedronGeometry,\n\t\tOctahedronBufferGeometry: OctahedronBufferGeometry,\n\t\tIcosahedronGeometry: IcosahedronGeometry,\n\t\tIcosahedronBufferGeometry: IcosahedronBufferGeometry,\n\t\tDodecahedronGeometry: DodecahedronGeometry,\n\t\tDodecahedronBufferGeometry: DodecahedronBufferGeometry,\n\t\tPolyhedronGeometry: PolyhedronGeometry,\n\t\tPolyhedronBufferGeometry: PolyhedronBufferGeometry,\n\t\tTubeGeometry: TubeGeometry,\n\t\tTubeBufferGeometry: TubeBufferGeometry,\n\t\tTorusKnotGeometry: TorusKnotGeometry,\n\t\tTorusKnotBufferGeometry: TorusKnotBufferGeometry,\n\t\tTorusGeometry: TorusGeometry,\n\t\tTorusBufferGeometry: TorusBufferGeometry,\n\t\tTextGeometry: TextGeometry,\n\t\tTextBufferGeometry: TextBufferGeometry,\n\t\tSphereGeometry: SphereGeometry,\n\t\tSphereBufferGeometry: SphereBufferGeometry,\n\t\tRingGeometry: RingGeometry,\n\t\tRingBufferGeometry: RingBufferGeometry,\n\t\tPlaneGeometry: PlaneGeometry,\n\t\tPlaneBufferGeometry: PlaneBufferGeometry,\n\t\tLatheGeometry: LatheGeometry,\n\t\tLatheBufferGeometry: LatheBufferGeometry,\n\t\tShapeGeometry: ShapeGeometry,\n\t\tShapeBufferGeometry: ShapeBufferGeometry,\n\t\tExtrudeGeometry: ExtrudeGeometry,\n\t\tExtrudeBufferGeometry: ExtrudeBufferGeometry,\n\t\tEdgesGeometry: EdgesGeometry,\n\t\tConeGeometry: ConeGeometry,\n\t\tConeBufferGeometry: ConeBufferGeometry,\n\t\tCylinderGeometry: CylinderGeometry,\n\t\tCylinderBufferGeometry: CylinderBufferGeometry,\n\t\tCircleGeometry: CircleGeometry,\n\t\tCircleBufferGeometry: CircleBufferGeometry,\n\t\tBoxGeometry: BoxGeometry,\n\t\tBoxBufferGeometry: BoxBufferGeometry\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t *\n\t * parameters = {\n\t *  color: <THREE.Color>,\n\t *  opacity: <float>\n\t * }\n\t */\n\n\tfunction ShadowMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'ShadowMaterial';\n\n\t\tthis.color = new Color( 0x000000 );\n\t\tthis.opacity = 1.0;\n\n\t\tthis.lights = true;\n\t\tthis.transparent = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tShadowMaterial.prototype = Object.create( Material.prototype );\n\tShadowMaterial.prototype.constructor = ShadowMaterial;\n\n\tShadowMaterial.prototype.isShadowMaterial = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction RawShaderMaterial( parameters ) {\n\n\t\tShaderMaterial.call( this, parameters );\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n\tRawShaderMaterial.prototype = Object.create( ShaderMaterial.prototype );\n\tRawShaderMaterial.prototype.constructor = RawShaderMaterial;\n\n\tRawShaderMaterial.prototype.isRawShaderMaterial = true;\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t *  color: <hex>,\n\t *  roughness: <float>,\n\t *  metalness: <float>,\n\t *  opacity: <float>,\n\t *\n\t *  map: new THREE.Texture( <Image> ),\n\t *\n\t *  lightMap: new THREE.Texture( <Image> ),\n\t *  lightMapIntensity: <float>\n\t *\n\t *  aoMap: new THREE.Texture( <Image> ),\n\t *  aoMapIntensity: <float>\n\t *\n\t *  emissive: <hex>,\n\t *  emissiveIntensity: <float>\n\t *  emissiveMap: new THREE.Texture( <Image> ),\n\t *\n\t *  bumpMap: new THREE.Texture( <Image> ),\n\t *  bumpScale: <float>,\n\t *\n\t *  normalMap: new THREE.Texture( <Image> ),\n\t *  normalScale: <Vector2>,\n\t *\n\t *  displacementMap: new THREE.Texture( <Image> ),\n\t *  displacementScale: <float>,\n\t *  displacementBias: <float>,\n\t *\n\t *  roughnessMap: new THREE.Texture( <Image> ),\n\t *\n\t *  metalnessMap: new THREE.Texture( <Image> ),\n\t *\n\t *  alphaMap: new THREE.Texture( <Image> ),\n\t *\n\t *  envMap: new THREE.CubeTexture( [posx, negx, posy, negy, posz, negz] ),\n\t *  envMapIntensity: <float>\n\t *\n\t *  refractionRatio: <float>,\n\t *\n\t *  wireframe: <boolean>,\n\t *  wireframeLinewidth: <float>,\n\t *\n\t *  skinning: <bool>,\n\t *  morphTargets: <bool>,\n\t *  morphNormals: <bool>\n\t * }\n\t */\n\n\tfunction MeshStandardMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.roughness = 0.5;\n\t\tthis.metalness = 0.5;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.roughnessMap = null;\n\n\t\tthis.metalnessMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapIntensity = 1.0;\n\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshStandardMaterial.prototype = Object.create( Material.prototype );\n\tMeshStandardMaterial.prototype.constructor = MeshStandardMaterial;\n\n\tMeshStandardMaterial.prototype.isMeshStandardMaterial = true;\n\n\tMeshStandardMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t *  reflectivity: <float>\n\t * }\n\t */\n\n\tfunction MeshPhysicalMaterial( parameters ) {\n\n\t\tMeshStandardMaterial.call( this );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\tthis.reflectivity = 0.5; // maps to F0 = 0.04\n\n\t\tthis.clearCoat = 0.0;\n\t\tthis.clearCoatRoughness = 0.0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhysicalMaterial.prototype = Object.create( MeshStandardMaterial.prototype );\n\tMeshPhysicalMaterial.prototype.constructor = MeshPhysicalMaterial;\n\n\tMeshPhysicalMaterial.prototype.isMeshPhysicalMaterial = true;\n\n\tMeshPhysicalMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshStandardMaterial.prototype.copy.call( this, source );\n\n\t\tthis.defines = { 'PHYSICAL': '' };\n\n\t\tthis.reflectivity = source.reflectivity;\n\n\t\tthis.clearCoat = source.clearCoat;\n\t\tthis.clearCoatRoughness = source.clearCoatRoughness;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t *  color: <hex>,\n\t *  specular: <hex>,\n\t *  shininess: <float>,\n\t *  opacity: <float>,\n\t *\n\t *  map: new THREE.Texture( <Image> ),\n\t *\n\t *  lightMap: new THREE.Texture( <Image> ),\n\t *  lightMapIntensity: <float>\n\t *\n\t *  aoMap: new THREE.Texture( <Image> ),\n\t *  aoMapIntensity: <float>\n\t *\n\t *  emissive: <hex>,\n\t *  emissiveIntensity: <float>\n\t *  emissiveMap: new THREE.Texture( <Image> ),\n\t *\n\t *  bumpMap: new THREE.Texture( <Image> ),\n\t *  bumpScale: <float>,\n\t *\n\t *  normalMap: new THREE.Texture( <Image> ),\n\t *  normalScale: <Vector2>,\n\t *\n\t *  displacementMap: new THREE.Texture( <Image> ),\n\t *  displacementScale: <float>,\n\t *  displacementBias: <float>,\n\t *\n\t *  specularMap: new THREE.Texture( <Image> ),\n\t *\n\t *  alphaMap: new THREE.Texture( <Image> ),\n\t *\n\t *  envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t *  combine: THREE.Multiply,\n\t *  reflectivity: <float>,\n\t *  refractionRatio: <float>,\n\t *\n\t *  wireframe: <boolean>,\n\t *  wireframeLinewidth: <float>,\n\t *\n\t *  skinning: <bool>,\n\t *  morphTargets: <bool>,\n\t *  morphNormals: <bool>\n\t * }\n\t */\n\n\tfunction MeshPhongMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.specular = new Color( 0x111111 );\n\t\tthis.shininess = 30;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshPhongMaterial.prototype = Object.create( Material.prototype );\n\tMeshPhongMaterial.prototype.constructor = MeshPhongMaterial;\n\n\tMeshPhongMaterial.prototype.isMeshPhongMaterial = true;\n\n\tMeshPhongMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author takahirox / http://github.com/takahirox\n\t *\n\t * parameters = {\n\t *  gradientMap: new THREE.Texture( <Image> )\n\t * }\n\t */\n\n\tfunction MeshToonMaterial( parameters ) {\n\n\t\tMeshPhongMaterial.call( this );\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\tthis.gradientMap = null;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshToonMaterial.prototype = Object.create( MeshPhongMaterial.prototype );\n\tMeshToonMaterial.prototype.constructor = MeshToonMaterial;\n\n\tMeshToonMaterial.prototype.isMeshToonMaterial = true;\n\n\tMeshToonMaterial.prototype.copy = function ( source ) {\n\n\t\tMeshPhongMaterial.prototype.copy.call( this, source );\n\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * parameters = {\n\t *  opacity: <float>,\n\t *\n\t *  bumpMap: new THREE.Texture( <Image> ),\n\t *  bumpScale: <float>,\n\t *\n\t *  normalMap: new THREE.Texture( <Image> ),\n\t *  normalScale: <Vector2>,\n\t *\n\t *  displacementMap: new THREE.Texture( <Image> ),\n\t *  displacementScale: <float>,\n\t *  displacementBias: <float>,\n\t *\n\t *  wireframe: <boolean>,\n\t *  wireframeLinewidth: <float>\n\t *\n\t *  skinning: <bool>,\n\t *  morphTargets: <bool>,\n\t *  morphNormals: <bool>\n\t * }\n\t */\n\n\tfunction MeshNormalMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false;\n\t\tthis.lights = false;\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshNormalMaterial.prototype = Object.create( Material.prototype );\n\tMeshNormalMaterial.prototype.constructor = MeshNormalMaterial;\n\n\tMeshNormalMaterial.prototype.isMeshNormalMaterial = true;\n\n\tMeshNormalMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t *  color: <hex>,\n\t *  opacity: <float>,\n\t *\n\t *  map: new THREE.Texture( <Image> ),\n\t *\n\t *  lightMap: new THREE.Texture( <Image> ),\n\t *  lightMapIntensity: <float>\n\t *\n\t *  aoMap: new THREE.Texture( <Image> ),\n\t *  aoMapIntensity: <float>\n\t *\n\t *  emissive: <hex>,\n\t *  emissiveIntensity: <float>\n\t *  emissiveMap: new THREE.Texture( <Image> ),\n\t *\n\t *  specularMap: new THREE.Texture( <Image> ),\n\t *\n\t *  alphaMap: new THREE.Texture( <Image> ),\n\t *\n\t *  envMap: new THREE.TextureCube( [posx, negx, posy, negy, posz, negz] ),\n\t *  combine: THREE.Multiply,\n\t *  reflectivity: <float>,\n\t *  refractionRatio: <float>,\n\t *\n\t *  wireframe: <boolean>,\n\t *  wireframeLinewidth: <float>,\n\t *\n\t *  skinning: <bool>,\n\t *  morphTargets: <bool>,\n\t *  morphNormals: <bool>\n\t * }\n\t */\n\n\tfunction MeshLambertMaterial( parameters ) {\n\n\t\tMaterial.call( this );\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.skinning = false;\n\t\tthis.morphTargets = false;\n\t\tthis.morphNormals = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tMeshLambertMaterial.prototype = Object.create( Material.prototype );\n\tMeshLambertMaterial.prototype.constructor = MeshLambertMaterial;\n\n\tMeshLambertMaterial.prototype.isMeshLambertMaterial = true;\n\n\tMeshLambertMaterial.prototype.copy = function ( source ) {\n\n\t\tMaterial.prototype.copy.call( this, source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.skinning = source.skinning;\n\t\tthis.morphTargets = source.morphTargets;\n\t\tthis.morphNormals = source.morphNormals;\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t *\n\t * parameters = {\n\t *  color: <hex>,\n\t *  opacity: <float>,\n\t *\n\t *  linewidth: <float>,\n\t *\n\t *  scale: <float>,\n\t *  dashSize: <float>,\n\t *  gapSize: <float>\n\t * }\n\t */\n\n\tfunction LineDashedMaterial( parameters ) {\n\n\t\tLineBasicMaterial.call( this );\n\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\tthis.scale = 1;\n\t\tthis.dashSize = 3;\n\t\tthis.gapSize = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tLineDashedMaterial.prototype = Object.create( LineBasicMaterial.prototype );\n\tLineDashedMaterial.prototype.constructor = LineDashedMaterial;\n\n\tLineDashedMaterial.prototype.isLineDashedMaterial = true;\n\n\tLineDashedMaterial.prototype.copy = function ( source ) {\n\n\t\tLineBasicMaterial.prototype.copy.call( this, source );\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t};\n\n\n\n\tvar Materials = Object.freeze({\n\t\tShadowMaterial: ShadowMaterial,\n\t\tSpriteMaterial: SpriteMaterial,\n\t\tRawShaderMaterial: RawShaderMaterial,\n\t\tShaderMaterial: ShaderMaterial,\n\t\tPointsMaterial: PointsMaterial,\n\t\tMeshPhysicalMaterial: MeshPhysicalMaterial,\n\t\tMeshStandardMaterial: MeshStandardMaterial,\n\t\tMeshPhongMaterial: MeshPhongMaterial,\n\t\tMeshToonMaterial: MeshToonMaterial,\n\t\tMeshNormalMaterial: MeshNormalMaterial,\n\t\tMeshLambertMaterial: MeshLambertMaterial,\n\t\tMeshDepthMaterial: MeshDepthMaterial,\n\t\tMeshDistanceMaterial: MeshDistanceMaterial,\n\t\tMeshBasicMaterial: MeshBasicMaterial,\n\t\tLineDashedMaterial: LineDashedMaterial,\n\t\tLineBasicMaterial: LineBasicMaterial,\n\t\tMaterial: Material\n\t});\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tvar Cache = {\n\n\t\tenabled: false,\n\n\t\tfiles: {},\n\n\t\tadd: function ( key, file ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\t\tthis.files[ key ] = file;\n\n\t\t},\n\n\t\tget: function ( key ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\t\treturn this.files[ key ];\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete this.files[ key ];\n\n\t\t},\n\n\t\tclear: function () {\n\n\t\t\tthis.files = {};\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LoadingManager( onLoad, onProgress, onError ) {\n\n\t\tvar scope = this;\n\n\t\tvar isLoading = false, itemsLoaded = 0, itemsTotal = 0;\n\n\t\tthis.onStart = undefined;\n\t\tthis.onLoad = onLoad;\n\t\tthis.onProgress = onProgress;\n\t\tthis.onError = onError;\n\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tvar DefaultLoadingManager = new LoadingManager();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction FileLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( FileLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( url === undefined ) url = '';\n\n\t\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\t\tvar scope = this;\n\n\t\t\tvar cached = Cache.get( url );\n\n\t\t\tif ( cached !== undefined ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t\treturn cached;\n\n\t\t\t}\n\n\t\t\t// Check for data: URI\n\t\t\tvar dataUriRegex = /^data:(.*?)(;base64)?,(.*)$/;\n\t\t\tvar dataUriRegexResult = url.match( dataUriRegex );\n\n\t\t\t// Safari can not handle Data URIs through XMLHttpRequest so process manually\n\t\t\tif ( dataUriRegexResult ) {\n\n\t\t\t\tvar mimeType = dataUriRegexResult[ 1 ];\n\t\t\t\tvar isBase64 = !! dataUriRegexResult[ 2 ];\n\t\t\t\tvar data = dataUriRegexResult[ 3 ];\n\n\t\t\t\tdata = window.decodeURIComponent( data );\n\n\t\t\t\tif ( isBase64 ) data = window.atob( data );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tvar response;\n\t\t\t\t\tvar responseType = ( this.responseType || '' ).toLowerCase();\n\n\t\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\t\tcase 'arraybuffer':\n\t\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\t \tresponse = new ArrayBuffer( data.length );\n\n\t\t\t\t\t\t\tvar view = new Uint8Array( response );\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\t\t\t\t\tview[ i ] = data.charCodeAt( i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( responseType === 'blob' ) {\n\n\t\t\t\t\t\t\t\tresponse = new Blob( [ response ], { type: mimeType } );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\t\tvar parser = new DOMParser();\n\t\t\t\t\t\t\tresponse = parser.parseFromString( data, mimeType );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\t\tresponse = JSON.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault: // 'text' or other\n\n\t\t\t\t\t\t\tresponse = data;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function () {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t}, 0 );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t// Wait for next browser tick\n\t\t\t\t\twindow.setTimeout( function () {\n\n\t\t\t\t\t\tif ( onError ) onError( error );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}, 0 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvar request = new XMLHttpRequest();\n\t\t\t\trequest.open( 'GET', url, true );\n\n\t\t\t\trequest.addEventListener( 'load', function ( event ) {\n\n\t\t\t\t\tvar response = event.target.response;\n\n\t\t\t\t\tCache.add( url, response );\n\n\t\t\t\t\tif ( this.status === 200 ) {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else if ( this.status === 0 ) {\n\n\t\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\t\tconsole.warn( 'THREE.FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( response );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\t\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( onProgress !== undefined ) {\n\n\t\t\t\t\trequest.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\t\t\tonProgress( event );\n\n\t\t\t\t\t}, false );\n\n\t\t\t\t}\n\n\t\t\t\trequest.addEventListener( 'error', function ( event ) {\n\n\t\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t}, false );\n\n\t\t\t\tif ( this.responseType !== undefined ) request.responseType = this.responseType;\n\t\t\t\tif ( this.withCredentials !== undefined ) request.withCredentials = this.withCredentials;\n\n\t\t\t\tif ( request.overrideMimeType ) request.overrideMimeType( this.mimeType !== undefined ? this.mimeType : 'text/plain' );\n\n\t\t\t\tfor ( var header in this.requestHeader ) {\n\n\t\t\t\t\trequest.setRequestHeader( header, this.requestHeader[ header ] );\n\n\t\t\t\t}\n\n\t\t\t\trequest.send( null );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn request;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetResponseType: function ( value ) {\n\n\t\t\tthis.responseType = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetWithCredentials: function ( value ) {\n\n\t\t\tthis.withCredentials = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetMimeType: function ( value ) {\n\n\t\t\tthis.mimeType = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetRequestHeader: function ( value ) {\n\n\t\t\tthis.requestHeader = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t *\n\t * Abstract Base class to block based textures loader (dds, pvr, ...)\n\t */\n\n\tfunction CompressedTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( CompressedTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar images = [];\n\n\t\t\tvar texture = new CompressedTexture();\n\t\t\ttexture.image = images;\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setPath( this.path );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\timages[ i ] = {\n\t\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t\t};\n\n\t\t\t\t\tloaded += 1;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\tif ( texDatas.mipmapCount === 1 )\n\t\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\tvar loaded = 0;\n\n\t\t\t\tfor ( var i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\t\tloadTexture( i );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\t\tvar texDatas = scope._parser( buffer, true );\n\n\t\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\t\tvar faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\t\tfor ( var f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\t\timages[ f ] = { mipmaps : [] };\n\n\t\t\t\t\t\t\tfor ( var i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author Nikos M. / https://github.com/foo123/\n\t *\n\t * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n\t */\n\n\tfunction DataTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t// override in sub classes\n\t\tthis._parser = null;\n\n\t}\n\n\tObject.assign( DataTextureLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texture = new DataTexture();\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar texData = scope._parser( buffer );\n\n\t\t\t\tif ( ! texData ) return;\n\n\t\t\t\tif ( undefined !== texData.image ) {\n\n\t\t\t\t\ttexture.image = texData.image;\n\n\t\t\t\t} else if ( undefined !== texData.data ) {\n\n\t\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.wrapS = undefined !== texData.wrapS ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\t\ttexture.wrapT = undefined !== texData.wrapT ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\t\ttexture.magFilter = undefined !== texData.magFilter ? texData.magFilter : LinearFilter;\n\t\t\t\ttexture.minFilter = undefined !== texData.minFilter ? texData.minFilter : LinearMipMapLinearFilter;\n\n\t\t\t\ttexture.anisotropy = undefined !== texData.anisotropy ? texData.anisotropy : 1;\n\n\t\t\t\tif ( undefined !== texData.format ) {\n\n\t\t\t\t\ttexture.format = texData.format;\n\n\t\t\t\t}\n\t\t\t\tif ( undefined !== texData.type ) {\n\n\t\t\t\t\ttexture.type = texData.type;\n\n\t\t\t\t}\n\n\t\t\t\tif ( undefined !== texData.mipmaps ) {\n\n\t\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( 1 === texData.mipmapCount ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t\t}, onProgress, onError );\n\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ImageLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( ImageLoader.prototype, {\n\n\t\tcrossOrigin: 'Anonymous',\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( url === undefined ) url = '';\n\n\t\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\t\tvar scope = this;\n\n\t\t\tvar cached = Cache.get( url );\n\n\t\t\tif ( cached !== undefined ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t\treturn cached;\n\n\t\t\t}\n\n\t\t\tvar image = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'img' );\n\n\t\t\timage.addEventListener( 'load', function () {\n\n\t\t\t\tCache.add( url, this );\n\n\t\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, false );\n\n\t\t\t/*\n\t\t\timage.addEventListener( 'progress', function ( event ) {\n\n\t\t\t\tif ( onProgress ) onProgress( event );\n\n\t\t\t}, false );\n\t\t\t*/\n\n\t\t\timage.addEventListener( 'error', function ( event ) {\n\n\t\t\t\tif ( onError ) onError( event );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}, false );\n\n\t\t\tif ( url.substr( 0, 5 ) !== 'data:' ) {\n\n\t\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t\t}\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\timage.src = url;\n\n\t\t\treturn image;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction CubeTextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( CubeTextureLoader.prototype, {\n\n\t\tcrossOrigin: 'Anonymous',\n\n\t\tload: function ( urls, onLoad, onProgress, onError ) {\n\n\t\t\tvar texture = new CubeTexture();\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setPath( this.path );\n\n\t\t\tvar loaded = 0;\n\n\t\t\tfunction loadTexture( i ) {\n\n\t\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\t\tloaded ++;\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, undefined, onError );\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < urls.length; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction TextureLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( TextureLoader.prototype, {\n\n\t\tcrossOrigin: 'Anonymous',\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar loader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\t\tloader.setPath( this.path );\n\n\t\t\tvar texture = new Texture();\n\t\t\ttexture.image = loader.load( url, function () {\n\n\t\t\t\t// JPEGs can't have an alpha channel, so memory can be saved by storing them as RGB.\n\t\t\t\tvar isJPEG = url.search( /\\.(jpg|jpeg)$/ ) > 0 || url.search( /^data\\:image\\/jpeg/ ) === 0;\n\n\t\t\t\ttexture.format = isJPEG ? RGBFormat : RGBAFormat;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\t\tonLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetPath: function ( value ) {\n\n\t\t\tthis.path = value;\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Light( color, intensity ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Light';\n\n\t\tthis.color = new Color( color );\n\t\tthis.intensity = intensity !== undefined ? intensity : 1;\n\n\t\tthis.receiveShadow = undefined;\n\n\t}\n\n\tLight.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Light,\n\n\t\tisLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tObject3D.prototype.copy.call( this, source );\n\n\t\t\tthis.color.copy( source.color );\n\t\t\tthis.intensity = source.intensity;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Object3D.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.color = this.color.getHex();\n\t\t\tdata.object.intensity = this.intensity;\n\n\t\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction HemisphereLight( skyColor, groundColor, intensity ) {\n\n\t\tLight.call( this, skyColor, intensity );\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.castShadow = undefined;\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tHemisphereLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: HemisphereLight,\n\n\t\tisHemisphereLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.groundColor.copy( source.groundColor );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction LightShadow( camera ) {\n\n\t\tthis.camera = camera;\n\n\t\tthis.bias = 0;\n\t\tthis.radius = 1;\n\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\tthis.map = null;\n\t\tthis.matrix = new Matrix4();\n\n\t}\n\n\tObject.assign( LightShadow.prototype, {\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.camera = source.camera.clone();\n\n\t\t\tthis.bias = source.bias;\n\t\t\tthis.radius = source.radius;\n\n\t\t\tthis.mapSize.copy( source.mapSize );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\ttoJSON: function () {\n\n\t\t\tvar object = {};\n\n\t\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\t\tdelete object.camera.matrix;\n\n\t\t\treturn object;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction SpotLightShadow() {\n\n\t\tLightShadow.call( this, new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t}\n\n\tSpotLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: SpotLightShadow,\n\n\t\tisSpotLightShadow: true,\n\n\t\tupdate: function ( light ) {\n\n\t\t\tvar camera = this.camera;\n\n\t\t\tvar fov = _Math.RAD2DEG * 2 * light.angle;\n\t\t\tvar aspect = this.mapSize.width / this.mapSize.height;\n\t\t\tvar far = light.distance || camera.far;\n\n\t\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\t\tcamera.fov = fov;\n\t\t\t\tcamera.aspect = aspect;\n\t\t\t\tcamera.far = far;\n\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction SpotLight( color, intensity, distance, angle, penumbra, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * Math.PI;\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (17) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / Math.PI;\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.angle = ( angle !== undefined ) ? angle : Math.PI / 3;\n\t\tthis.penumbra = ( penumbra !== undefined ) ? penumbra : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\tSpotLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: SpotLight,\n\n\t\tisSpotLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.angle = source.angle;\n\t\t\tthis.penumbra = source.penumbra;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\n\tfunction PointLight( color, intensity, distance, decay ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'PointLight';\n\n\t\tObject.defineProperty( this, 'power', {\n\t\t\tget: function () {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\treturn this.intensity * 4 * Math.PI;\n\n\t\t\t},\n\t\t\tset: function ( power ) {\n\t\t\t\t// intensity = power per solid angle.\n\t\t\t\t// ref: equation (15) from http://www.frostbite.com/wp-content/uploads/2014/11/course_notes_moving_frostbite_to_pbr.pdf\n\t\t\t\tthis.intensity = power / ( 4 * Math.PI );\n\t\t\t}\n\t\t} );\n\n\t\tthis.distance = ( distance !== undefined ) ? distance : 0;\n\t\tthis.decay = ( decay !== undefined ) ? decay : 1;\t// for physically correct lights, should be 2.\n\n\t\tthis.shadow = new LightShadow( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t}\n\n\tPointLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: PointLight,\n\n\t\tisPointLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.distance = source.distance;\n\t\t\tthis.decay = source.decay;\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction DirectionalLightShadow( ) {\n\n\t\tLightShadow.call( this, new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n\t}\n\n\tDirectionalLightShadow.prototype = Object.assign( Object.create( LightShadow.prototype ), {\n\n\t\tconstructor: DirectionalLightShadow\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction DirectionalLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DefaultUp );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tDirectionalLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: DirectionalLight,\n\n\t\tisDirectionalLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.target = source.target.clone();\n\n\t\t\tthis.shadow = source.shadow.clone();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AmbientLight( color, intensity ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'AmbientLight';\n\n\t\tthis.castShadow = undefined;\n\n\t}\n\n\tAmbientLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: AmbientLight,\n\n\t\tisAmbientLight: true\n\n\t} );\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t */\n\n\tfunction RectAreaLight( color, intensity, width, height ) {\n\n\t\tLight.call( this, color, intensity );\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\tthis.position.set( 0, 1, 0 );\n\t\tthis.updateMatrix();\n\n\t\tthis.width = ( width !== undefined ) ? width : 10;\n\t\tthis.height = ( height !== undefined ) ? height : 10;\n\n\t\t// TODO (abelnation): distance/decay\n\n\t\t// TODO (abelnation): update method for RectAreaLight to update transform to lookat target\n\n\t\t// TODO (abelnation): shadows\n\n\t}\n\n\t// TODO (abelnation): RectAreaLight update when light shape is changed\n\tRectAreaLight.prototype = Object.assign( Object.create( Light.prototype ), {\n\n\t\tconstructor: RectAreaLight,\n\n\t\tisRectAreaLight: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tLight.prototype.copy.call( this, source );\n\n\t\t\tthis.width = source.width;\n\t\t\tthis.height = source.height;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\ttoJSON: function ( meta ) {\n\n\t\t\tvar data = Light.prototype.toJSON.call( this, meta );\n\n\t\t\tdata.object.width = this.width;\n\t\t\tdata.object.height = this.height;\n\n\t\t\treturn data;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tvar AnimationUtils = {\n\n\t\t// same as Array.prototype.slice, but also works on typed arrays\n\t\tarraySlice: function ( array, from, to ) {\n\n\t\t\tif ( AnimationUtils.isTypedArray( array ) ) {\n\n\t\t\t\t// in ios9 array.subarray(from, undefined) will return empty array\n\t\t\t\t// but array.subarray(from) or array.subarray(from, len) is correct\n\t\t\t\treturn new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) );\n\n\t\t\t}\n\n\t\t\treturn array.slice( from, to );\n\n\t\t},\n\n\t\t// converts an array to a specific type\n\t\tconvertArray: function ( array, type, forceClone ) {\n\n\t\t\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t\t\t\t! forceClone && array.constructor === type ) return array;\n\n\t\t\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\t\t\treturn new type( array ); // create typed array\n\n\t\t\t}\n\n\t\t\treturn Array.prototype.slice.call( array ); // create Array\n\n\t\t},\n\n\t\tisTypedArray: function ( object ) {\n\n\t\t\treturn ArrayBuffer.isView( object ) &&\n\t\t\t\t\t! ( object instanceof DataView );\n\n\t\t},\n\n\t\t// returns an array by which times and values can be sorted\n\t\tgetKeyframeOrder: function ( times ) {\n\n\t\t\tfunction compareTime( i, j ) {\n\n\t\t\t\treturn times[ i ] - times[ j ];\n\n\t\t\t}\n\n\t\t\tvar n = times.length;\n\t\t\tvar result = new Array( n );\n\t\t\tfor ( var i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\t\t\tresult.sort( compareTime );\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// uses the array previously returned by 'getKeyframeOrder' to sort data\n\t\tsortedArray: function ( values, stride, order ) {\n\n\t\t\tvar nValues = values.length;\n\t\t\tvar result = new values.constructor( nValues );\n\n\t\t\tfor ( var i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\t\t\tvar srcOffset = order[ i ] * stride;\n\n\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// function for parsing AOS keyframe formats\n\t\tflattenJSON: function ( jsonKeys, times, values, valuePropertyName ) {\n\n\t\t\tvar i = 1, key = jsonKeys[ 0 ];\n\n\t\t\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t}\n\n\t\t\tif ( key === undefined ) return; // no data\n\n\t\t\tvar value = key[ valuePropertyName ];\n\t\t\tif ( value === undefined ) return; // no data\n\n\t\t\tif ( Array.isArray( value ) ) {\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else if ( value.toArray !== undefined ) {\n\n\t\t\t\t// ...assume THREE.Math-ish\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t} else {\n\n\t\t\t\t// otherwise push as-is\n\n\t\t\t\tdo {\n\n\t\t\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\ttimes.push( key.time );\n\t\t\t\t\t\tvalues.push( value );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t\t\t} while ( key !== undefined );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\t/**\n\t * Abstract base class of interpolants over parametric samples.\n\t *\n\t * The parameter domain is one dimensional, typically the time or a path\n\t * along a curve defined by the data.\n\t *\n\t * The sample values can have any dimensionality and derived classes may\n\t * apply special interpretations to the data.\n\t *\n\t * This class provides the interval seek in a Template Method, deferring\n\t * the actual interpolation to derived classes.\n\t *\n\t * Time complexity is O(1) for linear access crossing at most two points\n\t * and O(log N) for random access, where N is the number of positions.\n\t *\n\t * References:\n\t *\n\t * \t\thttp://www.oodesign.com/template-method-pattern.html\n\t *\n\t * @author tschw\n\t */\n\n\tfunction Interpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tthis.parameterPositions = parameterPositions;\n\t\tthis._cachedIndex = 0;\n\n\t\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\t\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\t\tthis.sampleValues = sampleValues;\n\t\tthis.valueSize = sampleSize;\n\n\t}\n\n\tObject.assign( Interpolant.prototype, {\n\n\t\tevaluate: function( t ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\ti1 = this._cachedIndex,\n\n\t\t\t\tt1 = pp[   i1   ],\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\tvalidate_interval: {\n\n\t\t\t\tseek: {\n\n\t\t\t\t\tvar right;\n\n\t\t\t\t\tlinear_scan: {\n\t\t\t\t\t\t//- See http://jsperf.com/comparison-to-undefined/3\n\t\t\t\t\t\t//- slower code:\n\t\t\t\t\t\t//-\n\t\t\t\t\t\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 + 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t, t0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//- slower code:\n\t\t\t\t\t\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\t\tvar t1global = pp[ 1 ];\n\n\t\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\t\tfor ( var giveUpAt = i1 - 2; ;) {\n\n\t\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t\t} // linear scan\n\n\t\t\t\t\t// binary search\n\n\t\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\t\tvar mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tt1 = pp[   i1   ];\n\t\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t\t// check boundary cases, again\n\n\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\treturn this.beforeStart_( 0, t, t1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\treturn this.afterEnd_( i1 - 1, t0, t );\n\n\t\t\t\t\t}\n\n\t\t\t\t} // seek\n\n\t\t\t\tthis._cachedIndex = i1;\n\n\t\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t\t} // validate_interval\n\n\t\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t\t},\n\n\t\tsettings: null, // optional, subclass-specific settings structure\n\t\t// Note: The indirection allows central control of many interpolants.\n\n\t\t// --- Protected interface\n\n\t\tDefaultSettings_: {},\n\n\t\tgetSettings_: function() {\n\n\t\t\treturn this.settings || this.DefaultSettings_;\n\n\t\t},\n\n\t\tcopySampleValue_: function( index ) {\n\n\t\t\t// copies a sample value to the result buffer\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = index * stride;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t},\n\n\t\t// Template methods for derived classes:\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tthrow new Error( \"call to abstract method\" );\n\t\t\t// implementations shall return this.resultBuffer\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\t// empty\n\n\t\t}\n\n\t} );\n\n\t//!\\ DECLARE ALIAS AFTER assign prototype !\n\tObject.assign( Interpolant.prototype, {\n\n\t\t//( 0, t, t0 ), returns this.resultBuffer\n\t\tbeforeStart_: Interpolant.prototype.copySampleValue_,\n\n\t\t//( N-1, tN-1, t ), returns this.resultBuffer\n\t\tafterEnd_: Interpolant.prototype.copySampleValue_,\n\n\t} );\n\n\t/**\n\t * Fast and simple cubic spline interpolant.\n\t *\n\t * It was derived from a Hermitian construction setting the first derivative\n\t * at each sample position to the linear slope between neighboring positions\n\t * over their parameter interval.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction CubicInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call(\n\t\t\t\tthis, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = -0;\n\t\tthis._offsetPrev = -0;\n\t\tthis._weightNext = -0;\n\t\tthis._offsetNext = -0;\n\n\t}\n\n\tCubicInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: CubicInterpolant,\n\n\t\tDefaultSettings_: {\n\n\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\n\t\t},\n\n\t\tintervalChanged_: function( i1, t0, t1 ) {\n\n\t\t\tvar pp = this.parameterPositions,\n\t\t\t\tiPrev = i1 - 2,\n\t\t\t\tiNext = i1 + 1,\n\n\t\t\t\ttPrev = pp[ iPrev ],\n\t\t\t\ttNext = pp[ iNext ];\n\n\t\t\tif ( tPrev === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\t\tiPrev = i1;\n\t\t\t\t\t\ttPrev = t1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tNext === undefined ) {\n\n\t\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\t\tiNext = i1;\n\t\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\t\tiNext = 1;\n\t\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\t\ttNext = t0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar halfDt = ( t1 - t0 ) * 0.5,\n\t\t\t\tstride = this.valueSize;\n\n\t\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\t\tthis._offsetPrev = iPrev * stride;\n\t\t\tthis._offsetNext = iNext * stride;\n\n\t\t},\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tpp = p * p,\n\t\t\t\tppp = pp * p;\n\n\t\t\t// evaluate polynomials\n\n\t\t\tvar sP =     - wP   * ppp   +         2 * wP    * pp    -          wP   * p;\n\t\t\tvar s0 = ( 1 + wP ) * ppp   + (-1.5 - 2 * wP )  * pp    + ( -0.5 + wP ) * p     + 1;\n\t\t\tvar s1 = (-1 - wN ) * ppp   + ( 1.5 +   wN   )  * pp    +    0.5        * p;\n\t\t\tvar sN =       wN   * ppp   -           wN      * pp;\n\n\t\t\t// combine data linearly\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author tschw\n\t */\n\n\tfunction LinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: LinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset1 = i1 * stride,\n\t\t\t\toffset0 = offset1 - stride,\n\n\t\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\t\tweight0 = 1 - weight1;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tresult[ i ] =\n\t\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Interpolant that evaluates to the sample value at the position preceeding\n\t * the parameter.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction DiscreteInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tDiscreteInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: DiscreteInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t}\n\n\t} );\n\n\tvar KeyframeTrackPrototype;\n\n\tKeyframeTrackPrototype = {\n\n\t\tTimeBufferType: Float32Array,\n\t\tValueBufferType: Float32Array,\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodDiscrete: function ( result ) {\n\n\t\t\treturn new DiscreteInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodLinear: function ( result ) {\n\n\t\t\treturn new LinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: function ( result ) {\n\n\t\t\treturn new CubicInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tsetInterpolation: function ( interpolation ) {\n\n\t\t\tvar factoryMethod;\n\n\t\t\tswitch ( interpolation ) {\n\n\t\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateLinear:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase InterpolateSmooth:\n\n\t\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( factoryMethod === undefined ) {\n\n\t\t\t\tvar message = \"unsupported interpolation for \" +\n\t\t\t\t\t\tthis.ValueTypeName + \" keyframe track named \" + this.name;\n\n\t\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconsole.warn( 'THREE.KeyframeTrackPrototype:', message );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.createInterpolant = factoryMethod;\n\n\t\t},\n\n\t\tgetInterpolation: function () {\n\n\t\t\tswitch ( this.createInterpolant ) {\n\n\t\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\t\treturn InterpolateLinear;\n\n\t\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\t\treturn InterpolateSmooth;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetValueSize: function () {\n\n\t\t\treturn this.values.length / this.times.length;\n\n\t\t},\n\n\t\t// move all keyframes either forwards or backwards in time\n\t\tshift: function ( timeOffset ) {\n\n\t\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor ( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\t\tscale: function ( timeScale ) {\n\n\t\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\t\tvar times = this.times;\n\n\t\t\t\tfor ( var i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t\t// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values\n\t\ttrim: function ( startTime, endTime ) {\n\n\t\t\tvar times = this.times,\n\t\t\t\tnKeys = times.length,\n\t\t\t\tfrom = 0,\n\t\t\t\tto = nKeys - 1;\n\n\t\t\twhile ( from !== nKeys && times[ from ] < startTime ) ++ from;\n\t\t\twhile ( to !== - 1 && times[ to ] > endTime ) -- to;\n\n\t\t\t++ to; // inclusive -> exclusive bound\n\n\t\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\t\tif ( from >= to ) to = Math.max( to, 1 ), from = to - 1;\n\n\t\t\t\tvar stride = this.getValueSize();\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, from, to );\n\t\t\t\tthis.values = AnimationUtils.\n\t\t\t\t\t\tarraySlice( this.values, from * stride, to * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\t\tvalidate: function () {\n\n\t\t\tvar valid = true;\n\n\t\t\tvar valueSize = this.getValueSize();\n\t\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrackPrototype: Invalid value size in track.', this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\n\t\t\t\tnKeys = times.length;\n\n\t\t\tif ( nKeys === 0 ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrackPrototype: Track is empty.', this );\n\t\t\t\tvalid = false;\n\n\t\t\t}\n\n\t\t\tvar prevTime = null;\n\n\t\t\tfor ( var i = 0; i !== nKeys; i ++ ) {\n\n\t\t\t\tvar currTime = times[ i ];\n\n\t\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.KeyframeTrackPrototype: Time is not a valid number.', this, i, currTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\t\tconsole.error( 'THREE.KeyframeTrackPrototype: Out of order keys.', this, i, currTime, prevTime );\n\t\t\t\t\tvalid = false;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tprevTime = currTime;\n\n\t\t\t}\n\n\t\t\tif ( values !== undefined ) {\n\n\t\t\t\tif ( AnimationUtils.isTypedArray( values ) ) {\n\n\t\t\t\t\tfor ( var i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tvar value = values[ i ];\n\n\t\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.KeyframeTrackPrototype: Value is not a valid number.', this, i, value );\n\t\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn valid;\n\n\t\t},\n\n\t\t// removes equivalent sequential keys as common in morph target sequences\n\t\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\t\toptimize: function () {\n\n\t\t\tvar times = this.times,\n\t\t\t\tvalues = this.values,\n\t\t\t\tstride = this.getValueSize(),\n\n\t\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\t\twriteIndex = 1,\n\t\t\t\tlastIndex = times.length - 1;\n\n\t\t\tfor ( var i = 1; i < lastIndex; ++ i ) {\n\n\t\t\t\tvar keep = false;\n\n\t\t\t\tvar time = times[ i ];\n\t\t\t\tvar timeNext = times[ i + 1 ];\n\n\t\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\t\tif ( time !== timeNext && ( i !== 1 || time !== time[ 0 ] ) ) {\n\n\t\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\t\tvar offset = i * stride,\n\t\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\t\tvar value = values[ offset + j ];\n\n\t\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else keep = true;\n\n\t\t\t\t}\n\n\t\t\t\t// in-place compaction\n\n\t\t\t\tif ( keep ) {\n\n\t\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\t\tvar readOffset = i * stride,\n\t\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\t\tfor ( var j = 0; j !== stride; ++ j )\n\n\t\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t++ writeIndex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// flush last keyframe (compaction looks ahead)\n\n\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\t\tfor ( var readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j )\n\n\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t\tif ( writeIndex !== times.length ) {\n\n\t\t\t\tthis.times = AnimationUtils.arraySlice( times, 0, writeIndex );\n\t\t\t\tthis.values = AnimationUtils.arraySlice( values, 0, writeIndex * stride );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t};\n\n\tfunction KeyframeTrackConstructor( name, times, values, interpolation ) {\n\n\t\tif ( name === undefined ) throw new Error( \"track name is undefined\" );\n\n\t\tif ( times === undefined || times.length === 0 ) {\n\n\t\t\tthrow new Error( \"no keyframes in track named \" + name );\n\n\t\t}\n\n\t\tthis.name = name;\n\n\t\tthis.times = AnimationUtils.convertArray( times, this.TimeBufferType );\n\t\tthis.values = AnimationUtils.convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t\tthis.validate();\n\t\tthis.optimize();\n\n\t}\n\n\t/**\n\t *\n\t * A Track of vectored keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction VectorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tVectorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: VectorKeyframeTrack,\n\n\t\tValueTypeName: 'vector'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t * Spherical linear unit quaternion interpolant.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction QuaternionLinearInterpolant( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tInterpolant.call( this, parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tQuaternionLinearInterpolant.prototype = Object.assign( Object.create( Interpolant.prototype ), {\n\n\t\tconstructor: QuaternionLinearInterpolant,\n\n\t\tinterpolate_: function( i1, t0, t, t1 ) {\n\n\t\t\tvar result = this.resultBuffer,\n\t\t\t\tvalues = this.sampleValues,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toffset = i1 * stride,\n\n\t\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\t\tfor ( var end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\t\tQuaternion.slerpFlat( result, 0,\n\t\t\t\t\t\tvalues, offset - stride, values, offset, alpha );\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of quaternion keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction QuaternionKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tQuaternionKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: QuaternionKeyframeTrack,\n\n\t\tValueTypeName: 'quaternion',\n\n\t\t// ValueBufferType is inherited\n\n\t\tDefaultInterpolation: InterpolateLinear,\n\n\t\tInterpolantFactoryMethodLinear: function( result ) {\n\n\t\t\treturn new QuaternionLinearInterpolant(\n\t\t\t\t\tthis.times, this.values, this.getValueSize(), result );\n\n\t\t},\n\n\t\tInterpolantFactoryMethodSmooth: undefined // not yet implemented\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of numeric keyframe values.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction NumberKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tNumberKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: NumberKeyframeTrack,\n\n\t\tValueTypeName: 'number'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\t} );\n\n\t/**\n\t *\n\t * A Track that interpolates Strings\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction StringKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tStringKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: StringKeyframeTrack,\n\n\t\tValueTypeName: 'string',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of Boolean keyframe values.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction BooleanKeyframeTrack( name, times, values ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values );\n\n\t}\n\n\tBooleanKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: BooleanKeyframeTrack,\n\n\t\tValueTypeName: 'bool',\n\t\tValueBufferType: Array,\n\n\t\tDefaultInterpolation: InterpolateDiscrete,\n\n\t\tInterpolantFactoryMethodLinear: undefined,\n\t\tInterpolantFactoryMethodSmooth: undefined\n\n\t\t// Note: Actually this track could have a optimized / compressed\n\t\t// representation of a single value and a custom interpolant that\n\t\t// computes \"firstValue ^ isOdd( index )\".\n\n\t} );\n\n\t/**\n\t *\n\t * A Track of keyframe values that represent color.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction ColorKeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.call( this, name, times, values, interpolation );\n\n\t}\n\n\tColorKeyframeTrack.prototype =\n\t\t\tObject.assign( Object.create( KeyframeTrackPrototype ), {\n\n\t\tconstructor: ColorKeyframeTrack,\n\n\t\tValueTypeName: 'color'\n\n\t\t// ValueBufferType is inherited\n\n\t\t// DefaultInterpolation is inherited\n\n\n\t\t// Note: Very basic implementation and nothing special yet.\n\t\t// However, this is the place for color space parameterization.\n\n\t} );\n\n\t/**\n\t *\n\t * A timed sequence of keyframes for a specific property.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction KeyframeTrack( name, times, values, interpolation ) {\n\n\t\tKeyframeTrackConstructor.apply( this, arguments );\n\n\t}\n\n\tKeyframeTrack.prototype = KeyframeTrackPrototype;\n\tKeyframeTrackPrototype.constructor = KeyframeTrack;\n\n\t// Static methods:\n\n\tObject.assign( KeyframeTrack, {\n\n\t\t// Serialization (in static context, because of constructor invocation\n\t\t// and automatic invocation of .toJSON):\n\n\t\tparse: function( json ) {\n\n\t\t\tif( json.type === undefined ) {\n\n\t\t\t\tthrow new Error( \"track type undefined, can not parse\" );\n\n\t\t\t}\n\n\t\t\tvar trackType = KeyframeTrack._getTrackTypeForValueTypeName( json.type );\n\n\t\t\tif ( json.times === undefined ) {\n\n\t\t\t\tvar times = [], values = [];\n\n\t\t\t\tAnimationUtils.flattenJSON( json.keys, times, values, 'value' );\n\n\t\t\t\tjson.times = times;\n\t\t\t\tjson.values = values;\n\n\t\t\t}\n\n\t\t\t// derived classes can define a static parse method\n\t\t\tif ( trackType.parse !== undefined ) {\n\n\t\t\t\treturn trackType.parse( json );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we assume a constructor compatible with the base\n\t\t\t\treturn new trackType(\n\t\t\t\t\t\tjson.name, json.times, json.values, json.interpolation );\n\n\t\t\t}\n\n\t\t},\n\n\t\ttoJSON: function( track ) {\n\n\t\t\tvar trackType = track.constructor;\n\n\t\t\tvar json;\n\n\t\t\t// derived classes can define a static toJSON method\n\t\t\tif ( trackType.toJSON !== undefined ) {\n\n\t\t\t\tjson = trackType.toJSON( track );\n\n\t\t\t} else {\n\n\t\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\t\tjson = {\n\n\t\t\t\t\t'name': track.name,\n\t\t\t\t\t'times': AnimationUtils.convertArray( track.times, Array ),\n\t\t\t\t\t'values': AnimationUtils.convertArray( track.values, Array )\n\n\t\t\t\t};\n\n\t\t\t\tvar interpolation = track.getInterpolation();\n\n\t\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\t\treturn json;\n\n\t\t},\n\n\t\t_getTrackTypeForValueTypeName: function( typeName ) {\n\n\t\t\tswitch( typeName.toLowerCase() ) {\n\n\t\t\t\tcase \"scalar\":\n\t\t\t\tcase \"double\":\n\t\t\t\tcase \"float\":\n\t\t\t\tcase \"number\":\n\t\t\t\tcase \"integer\":\n\n\t\t\t\t\treturn NumberKeyframeTrack;\n\n\t\t\t\tcase \"vector\":\n\t\t\t\tcase \"vector2\":\n\t\t\t\tcase \"vector3\":\n\t\t\t\tcase \"vector4\":\n\n\t\t\t\t\treturn VectorKeyframeTrack;\n\n\t\t\t\tcase \"color\":\n\n\t\t\t\t\treturn ColorKeyframeTrack;\n\n\t\t\t\tcase \"quaternion\":\n\n\t\t\t\t\treturn QuaternionKeyframeTrack;\n\n\t\t\t\tcase \"bool\":\n\t\t\t\tcase \"boolean\":\n\n\t\t\t\t\treturn BooleanKeyframeTrack;\n\n\t\t\t\tcase \"string\":\n\n\t\t\t\t\treturn StringKeyframeTrack;\n\n\t\t\t}\n\n\t\t\tthrow new Error( \"Unsupported typeName: \" + typeName );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Reusable set of Tracks that represent an animation.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t */\n\n\tfunction AnimationClip( name, duration, tracks ) {\n\n\t\tthis.name = name;\n\t\tthis.tracks = tracks;\n\t\tthis.duration = ( duration !== undefined ) ? duration : - 1;\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t\tthis.optimize();\n\n\t}\n\n\tObject.assign( AnimationClip, {\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tjsonTracks = json.tracks,\n\t\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\t\tfor ( var i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.parse( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( json.name, json.duration, tracks );\n\n\t\t},\n\n\t\ttoJSON: function ( clip ) {\n\n\t\t\tvar tracks = [],\n\t\t\t\tclipTracks = clip.tracks;\n\n\t\t\tvar json = {\n\n\t\t\t\t'name': clip.name,\n\t\t\t\t'duration': clip.duration,\n\t\t\t\t'tracks': tracks\n\n\t\t\t};\n\n\t\t\tfor ( var i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn json;\n\n\t\t},\n\n\t\tCreateFromMorphTargetSequence: function ( name, morphTargetSequence, fps, noLoop ) {\n\n\t\t\tvar numMorphTargets = morphTargetSequence.length;\n\t\t\tvar tracks = [];\n\n\t\t\tfor ( var i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\t\tvar times = [];\n\t\t\t\tvar values = [];\n\n\t\t\t\ttimes.push(\n\t\t\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\t\t\ti,\n\t\t\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\t\tvar order = AnimationUtils.getKeyframeOrder( times );\n\t\t\t\ttimes = AnimationUtils.sortedArray( times, 1, order );\n\t\t\t\tvalues = AnimationUtils.sortedArray( values, 1, order );\n\n\t\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t\t// last frame as well for perfect loop.\n\t\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t\t}\n\n\t\t\t\ttracks.push(\n\t\t\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\t\t\ttimes, values\n\t\t\t\t\t\t).scale( 1.0 / fps ) );\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( name, - 1, tracks );\n\n\t\t},\n\n\t\tfindByName: function ( objectOrClipArray, name ) {\n\n\t\t\tvar clipArray = objectOrClipArray;\n\n\t\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\t\tvar o = objectOrClipArray;\n\t\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\t\treturn clipArray[ i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\tCreateClipsFromMorphTargetSequences: function ( morphTargets, fps, noLoop ) {\n\n\t\t\tvar animationToMorphTargets = {};\n\n\t\t\t// tested with https://regex101.com/ on trick sequences\n\t\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\t\tvar pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t\t// sort morph target names into animation groups based\n\t\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\t\tfor ( var i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\t\tvar morphTarget = morphTargets[ i ];\n\t\t\t\tvar parts = morphTarget.name.match( pattern );\n\n\t\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\t\tvar name = parts[ 1 ];\n\n\t\t\t\t\tvar animationMorphTargets = animationToMorphTargets[ name ];\n\t\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar clips = [];\n\n\t\t\tfor ( var name in animationToMorphTargets ) {\n\n\t\t\t\tclips.push( AnimationClip.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t\t}\n\n\t\t\treturn clips;\n\n\t\t},\n\n\t\t// parse the animation.hierarchy format\n\t\tparseAnimation: function ( animation, bones ) {\n\n\t\t\tif ( ! animation ) {\n\n\t\t\t\tconsole.error( 'THREE.AnimationClip: No animation in JSONLoader data.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t\t// only return track if there are actually keys.\n\t\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\t\tvar times = [];\n\t\t\t\t\tvar values = [];\n\n\t\t\t\t\tAnimationUtils.flattenJSON( animationKeys, times, values, propertyName );\n\n\t\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tvar tracks = [];\n\n\t\t\tvar clipName = animation.name || 'default';\n\t\t\t// automatic length determination in AnimationClip.\n\t\t\tvar duration = animation.length || - 1;\n\t\t\tvar fps = animation.fps || 30;\n\n\t\t\tvar hierarchyTracks = animation.hierarchy || [];\n\n\t\t\tfor ( var h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\t\tvar animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t\t// skip empty tracks\n\t\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t\t// process morph targets\n\t\t\t\tif ( animationKeys[ 0 ].morphTargets ) {\n\n\t\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\t\tvar morphTargetNames = {};\n\n\t\t\t\t\tfor ( var k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\t\tif ( animationKeys[ k ].morphTargets ) {\n\n\t\t\t\t\t\t\tfor ( var m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t\t// the morphTarget is named.\n\t\t\t\t\tfor ( var morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\t\tvar times = [];\n\t\t\t\t\t\tvar values = [];\n\n\t\t\t\t\t\tfor ( var m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\t\tvar animationKey = animationKeys[ k ];\n\n\t\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tduration = morphTargetNames.length * ( fps || 1.0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\t\tvar boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\t\taddNonemptyTrack(\n\t\t\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( tracks.length === 0 ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tvar clip = new AnimationClip( clipName, duration, tracks );\n\n\t\t\treturn clip;\n\n\t\t}\n\n\t} );\n\n\tObject.assign( AnimationClip.prototype, {\n\n\t\tresetDuration: function () {\n\n\t\t\tvar tracks = this.tracks, duration = 0;\n\n\t\t\tfor ( var i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\t\tvar track = this.tracks[ i ];\n\n\t\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t\t}\n\n\t\t\tthis.duration = duration;\n\n\t\t},\n\n\t\ttrim: function () {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\toptimize: function () {\n\n\t\t\tfor ( var i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\t\tthis.tracks[ i ].optimize();\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction MaterialLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.textures = {};\n\n\t}\n\n\tObject.assign( MaterialLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTextures: function ( value ) {\n\n\t\t\tthis.textures = value;\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar textures = this.textures;\n\n\t\t\tfunction getTexture( name ) {\n\n\t\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t\t}\n\n\t\t\t\treturn textures[ name ];\n\n\t\t\t}\n\n\t\t\tvar material = new Materials[ json.type ]();\n\n\t\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\t\tif ( json.color !== undefined ) material.color.setHex( json.color );\n\t\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\t\tif ( json.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\t\tif ( json.specular !== undefined ) material.specular.setHex( json.specular );\n\t\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\t\tif ( json.clearCoat !== undefined ) material.clearCoat = json.clearCoat;\n\t\t\tif ( json.clearCoatRoughness !== undefined ) material.clearCoatRoughness = json.clearCoatRoughness;\n\t\t\tif ( json.uniforms !== undefined ) material.uniforms = json.uniforms;\n\t\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\t\tif ( json.vertexColors !== undefined ) material.vertexColors = json.vertexColors;\n\t\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\t\tif ( json.flatShading !== undefined ) material.flatShading = json.flatShading;\n\t\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\n\t\t\tif ( json.skinning !== undefined ) material.skinning = json.skinning;\n\t\t\tif ( json.morphTargets !== undefined ) material.morphTargets = json.morphTargets;\n\t\t\tif ( json.dithering !== undefined ) material.dithering = json.dithering;\n\n\t\t\tif ( json.visible !== undefined ) material.visible = json.visible;\n\t\t\tif ( json.userData !== undefined ) material.userData = json.userData;\n\n\t\t\t// Deprecated\n\n\t\t\tif ( json.shading !== undefined ) material.flatShading = json.shading === 1; // THREE.FlatShading\n\n\t\t\t// for PointsMaterial\n\n\t\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t\t// maps\n\n\t\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\n\t\t\tif ( json.alphaMap !== undefined ) {\n\n\t\t\t\tmaterial.alphaMap = getTexture( json.alphaMap );\n\t\t\t\tmaterial.transparent = true;\n\n\t\t\t}\n\n\t\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\t\tvar normalScale = json.normalScale;\n\n\t\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t\t}\n\n\t\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\n\t\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\n\t\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\n\t\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\t\treturn material;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction BufferGeometryLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( BufferGeometryLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\tvar geometry = new BufferGeometry();\n\n\t\t\tvar index = json.data.index;\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ index.type ]( index.array );\n\t\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tvar attributes = json.data.attributes;\n\n\t\t\tfor ( var key in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ key ];\n\t\t\t\tvar typedArray = new TYPED_ARRAYS[ attribute.type ]( attribute.array );\n\n\t\t\t\tgeometry.addAttribute( key, new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized ) );\n\n\t\t\t}\n\n\t\t\tvar groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\t\tif ( groups !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar group = groups[ i ];\n\n\t\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar boundingSphere = json.data.boundingSphere;\n\n\t\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\t\tvar center = new Vector3();\n\n\t\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\tvar TYPED_ARRAYS = {\n\t\tInt8Array: Int8Array,\n\t\tUint8Array: Uint8Array,\n\t\t// Workaround for IE11 pre KB2929437. See #11440\n\t\tUint8ClampedArray: typeof Uint8ClampedArray !== 'undefined' ? Uint8ClampedArray : Uint8Array,\n\t\tInt16Array: Int16Array,\n\t\tUint16Array: Uint16Array,\n\t\tInt32Array: Int32Array,\n\t\tUint32Array: Uint32Array,\n\t\tFloat32Array: Float32Array,\n\t\tFloat64Array: Float64Array\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Loader() {\n\n\t\tthis.onLoadStart = function () {};\n\t\tthis.onLoadProgress = function () {};\n\t\tthis.onLoadComplete = function () {};\n\n\t}\n\n\tLoader.Handlers = {\n\n\t\thandlers: [],\n\n\t\tadd: function ( regex, loader ) {\n\n\t\t\tthis.handlers.push( regex, loader );\n\n\t\t},\n\n\t\tget: function ( file ) {\n\n\t\t\tvar handlers = this.handlers;\n\n\t\t\tfor ( var i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tvar regex = handlers[ i ];\n\t\t\t\tvar loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t}\n\n\t};\n\n\tObject.assign( Loader.prototype, {\n\n\t\tcrossOrigin: undefined,\n\n\t\textractUrlBase: function ( url ) {\n\n\t\t\tvar parts = url.split( '/' );\n\n\t\t\tif ( parts.length === 1 ) return './';\n\n\t\t\tparts.pop();\n\n\t\t\treturn parts.join( '/' ) + '/';\n\n\t\t},\n\n\t\tinitMaterials: function ( materials, texturePath, crossOrigin ) {\n\n\t\t\tvar array = [];\n\n\t\t\tfor ( var i = 0; i < materials.length; ++ i ) {\n\n\t\t\t\tarray[ i ] = this.createMaterial( materials[ i ], texturePath, crossOrigin );\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t},\n\n\t\tcreateMaterial: ( function () {\n\n\t\t\tvar BlendingMode = {\n\t\t\t\tNoBlending: NoBlending,\n\t\t\t\tNormalBlending: NormalBlending,\n\t\t\t\tAdditiveBlending: AdditiveBlending,\n\t\t\t\tSubtractiveBlending: SubtractiveBlending,\n\t\t\t\tMultiplyBlending: MultiplyBlending,\n\t\t\t\tCustomBlending: CustomBlending\n\t\t\t};\n\n\t\t\tvar color = new Color();\n\t\t\tvar textureLoader = new TextureLoader();\n\t\t\tvar materialLoader = new MaterialLoader();\n\n\t\t\treturn function createMaterial( m, texturePath, crossOrigin ) {\n\n\t\t\t\t// convert from old material format\n\n\t\t\t\tvar textures = {};\n\n\t\t\t\tfunction loadTexture( path, repeat, offset, wrap, anisotropy ) {\n\n\t\t\t\t\tvar fullPath = texturePath + path;\n\t\t\t\t\tvar loader = Loader.Handlers.get( fullPath );\n\n\t\t\t\t\tvar texture;\n\n\t\t\t\t\tif ( loader !== null ) {\n\n\t\t\t\t\t\ttexture = loader.load( fullPath );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttextureLoader.setCrossOrigin( crossOrigin );\n\t\t\t\t\t\ttexture = textureLoader.load( fullPath );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( repeat !== undefined ) {\n\n\t\t\t\t\t\ttexture.repeat.fromArray( repeat );\n\n\t\t\t\t\t\tif ( repeat[ 0 ] !== 1 ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( repeat[ 1 ] !== 1 ) texture.wrapT = RepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( offset !== undefined ) {\n\n\t\t\t\t\t\ttexture.offset.fromArray( offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( wrap !== undefined ) {\n\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'repeat' ) texture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 0 ] === 'mirror' ) texture.wrapS = MirroredRepeatWrapping;\n\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'repeat' ) texture.wrapT = RepeatWrapping;\n\t\t\t\t\t\tif ( wrap[ 1 ] === 'mirror' ) texture.wrapT = MirroredRepeatWrapping;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( anisotropy !== undefined ) {\n\n\t\t\t\t\t\ttexture.anisotropy = anisotropy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar uuid = _Math.generateUUID();\n\n\t\t\t\t\ttextures[ uuid ] = texture;\n\n\t\t\t\t\treturn uuid;\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tvar json = {\n\t\t\t\t\tuuid: _Math.generateUUID(),\n\t\t\t\t\ttype: 'MeshLambertMaterial'\n\t\t\t\t};\n\n\t\t\t\tfor ( var name in m ) {\n\n\t\t\t\t\tvar value = m[ name ];\n\n\t\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\t\tcase 'DbgColor':\n\t\t\t\t\t\tcase 'DbgIndex':\n\t\t\t\t\t\tcase 'opticalDensity':\n\t\t\t\t\t\tcase 'illumination':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'DbgName':\n\t\t\t\t\t\t\tjson.name = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'blending':\n\t\t\t\t\t\t\tjson.blending = BlendingMode[ value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorAmbient':\n\t\t\t\t\t\tcase 'mapAmbient':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial:', name, 'is no longer supported.' );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorDiffuse':\n\t\t\t\t\t\t\tjson.color = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorSpecular':\n\t\t\t\t\t\t\tjson.specular = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'colorEmissive':\n\t\t\t\t\t\t\tjson.emissive = color.fromArray( value ).getHex();\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'specularCoef':\n\t\t\t\t\t\t\tjson.shininess = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'shading':\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'basic' ) json.type = 'MeshBasicMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'phong' ) json.type = 'MeshPhongMaterial';\n\t\t\t\t\t\t\tif ( value.toLowerCase() === 'standard' ) json.type = 'MeshStandardMaterial';\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuse':\n\t\t\t\t\t\t\tjson.map = loadTexture( value, m.mapDiffuseRepeat, m.mapDiffuseOffset, m.mapDiffuseWrap, m.mapDiffuseAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapDiffuseRepeat':\n\t\t\t\t\t\tcase 'mapDiffuseOffset':\n\t\t\t\t\t\tcase 'mapDiffuseWrap':\n\t\t\t\t\t\tcase 'mapDiffuseAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissive':\n\t\t\t\t\t\t\tjson.emissiveMap = loadTexture( value, m.mapEmissiveRepeat, m.mapEmissiveOffset, m.mapEmissiveWrap, m.mapEmissiveAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapEmissiveRepeat':\n\t\t\t\t\t\tcase 'mapEmissiveOffset':\n\t\t\t\t\t\tcase 'mapEmissiveWrap':\n\t\t\t\t\t\tcase 'mapEmissiveAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLight':\n\t\t\t\t\t\t\tjson.lightMap = loadTexture( value, m.mapLightRepeat, m.mapLightOffset, m.mapLightWrap, m.mapLightAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapLightRepeat':\n\t\t\t\t\t\tcase 'mapLightOffset':\n\t\t\t\t\t\tcase 'mapLightWrap':\n\t\t\t\t\t\tcase 'mapLightAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAO':\n\t\t\t\t\t\t\tjson.aoMap = loadTexture( value, m.mapAORepeat, m.mapAOOffset, m.mapAOWrap, m.mapAOAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAORepeat':\n\t\t\t\t\t\tcase 'mapAOOffset':\n\t\t\t\t\t\tcase 'mapAOWrap':\n\t\t\t\t\t\tcase 'mapAOAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBump':\n\t\t\t\t\t\t\tjson.bumpMap = loadTexture( value, m.mapBumpRepeat, m.mapBumpOffset, m.mapBumpWrap, m.mapBumpAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpScale':\n\t\t\t\t\t\t\tjson.bumpScale = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapBumpRepeat':\n\t\t\t\t\t\tcase 'mapBumpOffset':\n\t\t\t\t\t\tcase 'mapBumpWrap':\n\t\t\t\t\t\tcase 'mapBumpAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormal':\n\t\t\t\t\t\t\tjson.normalMap = loadTexture( value, m.mapNormalRepeat, m.mapNormalOffset, m.mapNormalWrap, m.mapNormalAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalFactor':\n\t\t\t\t\t\t\tjson.normalScale = [ value, value ];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapNormalRepeat':\n\t\t\t\t\t\tcase 'mapNormalOffset':\n\t\t\t\t\t\tcase 'mapNormalWrap':\n\t\t\t\t\t\tcase 'mapNormalAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecular':\n\t\t\t\t\t\t\tjson.specularMap = loadTexture( value, m.mapSpecularRepeat, m.mapSpecularOffset, m.mapSpecularWrap, m.mapSpecularAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapSpecularRepeat':\n\t\t\t\t\t\tcase 'mapSpecularOffset':\n\t\t\t\t\t\tcase 'mapSpecularWrap':\n\t\t\t\t\t\tcase 'mapSpecularAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalness':\n\t\t\t\t\t\t\tjson.metalnessMap = loadTexture( value, m.mapMetalnessRepeat, m.mapMetalnessOffset, m.mapMetalnessWrap, m.mapMetalnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapMetalnessRepeat':\n\t\t\t\t\t\tcase 'mapMetalnessOffset':\n\t\t\t\t\t\tcase 'mapMetalnessWrap':\n\t\t\t\t\t\tcase 'mapMetalnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughness':\n\t\t\t\t\t\t\tjson.roughnessMap = loadTexture( value, m.mapRoughnessRepeat, m.mapRoughnessOffset, m.mapRoughnessWrap, m.mapRoughnessAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapRoughnessRepeat':\n\t\t\t\t\t\tcase 'mapRoughnessOffset':\n\t\t\t\t\t\tcase 'mapRoughnessWrap':\n\t\t\t\t\t\tcase 'mapRoughnessAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlpha':\n\t\t\t\t\t\t\tjson.alphaMap = loadTexture( value, m.mapAlphaRepeat, m.mapAlphaOffset, m.mapAlphaWrap, m.mapAlphaAnisotropy );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'mapAlphaRepeat':\n\t\t\t\t\t\tcase 'mapAlphaOffset':\n\t\t\t\t\t\tcase 'mapAlphaWrap':\n\t\t\t\t\t\tcase 'mapAlphaAnisotropy':\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'flipSided':\n\t\t\t\t\t\t\tjson.side = BackSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'doubleSided':\n\t\t\t\t\t\t\tjson.side = DoubleSide;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\t\tconsole.warn( 'THREE.Loader.createMaterial: transparency has been renamed to opacity' );\n\t\t\t\t\t\t\tjson.opacity = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'depthTest':\n\t\t\t\t\t\tcase 'depthWrite':\n\t\t\t\t\t\tcase 'colorWrite':\n\t\t\t\t\t\tcase 'opacity':\n\t\t\t\t\t\tcase 'reflectivity':\n\t\t\t\t\t\tcase 'transparent':\n\t\t\t\t\t\tcase 'visible':\n\t\t\t\t\t\tcase 'wireframe':\n\t\t\t\t\t\t\tjson[ name ] = value;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'vertexColors':\n\t\t\t\t\t\t\tif ( value === true ) json.vertexColors = VertexColors;\n\t\t\t\t\t\t\tif ( value === 'face' ) json.vertexColors = FaceColors;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.Loader.createMaterial: Unsupported', name, value );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.type === 'MeshBasicMaterial' ) delete json.emissive;\n\t\t\t\tif ( json.type !== 'MeshPhongMaterial' ) delete json.specular;\n\n\t\t\t\tif ( json.opacity < 1 ) json.transparent = true;\n\n\t\t\t\tmaterialLoader.setTextures( textures );\n\n\t\t\t\treturn materialLoader.parse( json );\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction JSONLoader( manager ) {\n\n\t\tif ( typeof manager === 'boolean' ) {\n\n\t\t\tconsole.warn( 'THREE.JSONLoader: showStatus parameter has been removed from constructor.' );\n\t\t\tmanager = undefined;\n\n\t\t}\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\tthis.withCredentials = false;\n\n\t}\n\n\tObject.assign( JSONLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar texturePath = this.texturePath && ( typeof this.texturePath === \"string\" ) ? this.texturePath : Loader.prototype.extractUrlBase( url );\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setWithCredentials( this.withCredentials );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json = JSON.parse( text );\n\t\t\t\tvar metadata = json.metadata;\n\n\t\t\t\tif ( metadata !== undefined ) {\n\n\t\t\t\t\tvar type = metadata.type;\n\n\t\t\t\t\tif ( type !== undefined ) {\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'object' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.ObjectLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( type.toLowerCase() === 'scene' ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.JSONLoader: ' + url + ' should be loaded with THREE.SceneLoader instead.' );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tvar object = scope.parse( json, texturePath );\n\t\t\t\tonLoad( object.geometry, object.materials );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tparse: ( function () {\n\n\t\t\tfunction parseModel( json, geometry ) {\n\n\t\t\t\tfunction isBitSet( value, position ) {\n\n\t\t\t\t\treturn value & ( 1 << position );\n\n\t\t\t\t}\n\n\t\t\t\tvar i, j, fi,\n\n\t\t\t\t\toffset, zLength,\n\n\t\t\t\t\tcolorIndex, normalIndex, uvIndex, materialIndex,\n\n\t\t\t\t\ttype,\n\t\t\t\t\tisQuad,\n\t\t\t\t\thasMaterial,\n\t\t\t\t\thasFaceVertexUv,\n\t\t\t\t\thasFaceNormal, hasFaceVertexNormal,\n\t\t\t\t\thasFaceColor, hasFaceVertexColor,\n\n\t\t\t\t\tvertex, face, faceA, faceB, hex, normal,\n\n\t\t\t\t\tuvLayer, uv, u, v,\n\n\t\t\t\t\tfaces = json.faces,\n\t\t\t\t\tvertices = json.vertices,\n\t\t\t\t\tnormals = json.normals,\n\t\t\t\t\tcolors = json.colors,\n\n\t\t\t\t\tscale = json.scale,\n\n\t\t\t\t\tnUvLayers = 0;\n\n\n\t\t\t\tif ( json.uvs !== undefined ) {\n\n\t\t\t\t\t// disregard empty arrays\n\n\t\t\t\t\tfor ( i = 0; i < json.uvs.length; i ++ ) {\n\n\t\t\t\t\t\tif ( json.uvs[ i ].length ) nUvLayers ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\tgeometry.faceVertexUvs[ i ] = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = vertices.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\tvertex = new Vector3();\n\n\t\t\t\t\tvertex.x = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.y = vertices[ offset ++ ] * scale;\n\t\t\t\t\tvertex.z = vertices[ offset ++ ] * scale;\n\n\t\t\t\t\tgeometry.vertices.push( vertex );\n\n\t\t\t\t}\n\n\t\t\t\toffset = 0;\n\t\t\t\tzLength = faces.length;\n\n\t\t\t\twhile ( offset < zLength ) {\n\n\t\t\t\t\ttype = faces[ offset ++ ];\n\n\t\t\t\t\tisQuad = isBitSet( type, 0 );\n\t\t\t\t\thasMaterial = isBitSet( type, 1 );\n\t\t\t\t\thasFaceVertexUv = isBitSet( type, 3 );\n\t\t\t\t\thasFaceNormal = isBitSet( type, 4 );\n\t\t\t\t\thasFaceVertexNormal = isBitSet( type, 5 );\n\t\t\t\t\thasFaceColor = isBitSet( type, 6 );\n\t\t\t\t\thasFaceVertexColor = isBitSet( type, 7 );\n\n\t\t\t\t\t// console.log(\"type\", type, \"bits\", isQuad, hasMaterial, hasFaceVertexUv, hasFaceNormal, hasFaceVertexNormal, hasFaceColor, hasFaceVertexColor);\n\n\t\t\t\t\tif ( isQuad ) {\n\n\t\t\t\t\t\tfaceA = new Face3();\n\t\t\t\t\t\tfaceA.a = faces[ offset ];\n\t\t\t\t\t\tfaceA.b = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceA.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\tfaceB = new Face3();\n\t\t\t\t\t\tfaceB.a = faces[ offset + 1 ];\n\t\t\t\t\t\tfaceB.b = faces[ offset + 2 ];\n\t\t\t\t\t\tfaceB.c = faces[ offset + 3 ];\n\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tfaceA.materialIndex = materialIndex;\n\t\t\t\t\t\t\tfaceB.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi + 1 ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tif ( j !== 2 ) geometry.faceVertexUvs[ i ][ fi ].push( uv );\n\t\t\t\t\t\t\t\t\tif ( j !== 0 ) geometry.faceVertexUvs[ i ][ fi + 1 ].push( uv );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tfaceA.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tfaceB.normal.copy( faceA.normal );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexNormals.push( normal );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\tfaceA.color.setHex( hex );\n\t\t\t\t\t\t\tfaceB.color.setHex( hex );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 4; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\thex = colors[ colorIndex ];\n\n\t\t\t\t\t\t\t\tif ( i !== 2 ) faceA.vertexColors.push( new Color( hex ) );\n\t\t\t\t\t\t\t\tif ( i !== 0 ) faceB.vertexColors.push( new Color( hex ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( faceA );\n\t\t\t\t\t\tgeometry.faces.push( faceB );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tface = new Face3();\n\t\t\t\t\t\tface.a = faces[ offset ++ ];\n\t\t\t\t\t\tface.b = faces[ offset ++ ];\n\t\t\t\t\t\tface.c = faces[ offset ++ ];\n\n\t\t\t\t\t\tif ( hasMaterial ) {\n\n\t\t\t\t\t\t\tmaterialIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.materialIndex = materialIndex;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// to get face <=> uv index correspondence\n\n\t\t\t\t\t\tfi = geometry.faces.length;\n\n\t\t\t\t\t\tif ( hasFaceVertexUv ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < nUvLayers; i ++ ) {\n\n\t\t\t\t\t\t\t\tuvLayer = json.uvs[ i ];\n\n\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ] = [];\n\n\t\t\t\t\t\t\t\tfor ( j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\t\t\tuvIndex = faces[ offset ++ ];\n\n\t\t\t\t\t\t\t\t\tu = uvLayer[ uvIndex * 2 ];\n\t\t\t\t\t\t\t\t\tv = uvLayer[ uvIndex * 2 + 1 ];\n\n\t\t\t\t\t\t\t\t\tuv = new Vector2( u, v );\n\n\t\t\t\t\t\t\t\t\tgeometry.faceVertexUvs[ i ][ fi ].push( uv );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceNormal ) {\n\n\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\tface.normal.set(\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasFaceVertexNormal ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tnormalIndex = faces[ offset ++ ] * 3;\n\n\t\t\t\t\t\t\t\tnormal = new Vector3(\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ++ ],\n\t\t\t\t\t\t\t\t\tnormals[ normalIndex ]\n\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\tface.vertexNormals.push( normal );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceColor ) {\n\n\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\tface.color.setHex( colors[ colorIndex ] );\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\tif ( hasFaceVertexColor ) {\n\n\t\t\t\t\t\t\tfor ( i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t\tcolorIndex = faces[ offset ++ ];\n\t\t\t\t\t\t\t\tface.vertexColors.push( new Color( colors[ colorIndex ] ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgeometry.faces.push( face );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseSkin( json, geometry ) {\n\n\t\t\t\tvar influencesPerVertex = ( json.influencesPerVertex !== undefined ) ? json.influencesPerVertex : 2;\n\n\t\t\t\tif ( json.skinWeights ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinWeights.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar x = json.skinWeights[ i ];\n\t\t\t\t\t\tvar y = ( influencesPerVertex > 1 ) ? json.skinWeights[ i + 1 ] : 0;\n\t\t\t\t\t\tvar z = ( influencesPerVertex > 2 ) ? json.skinWeights[ i + 2 ] : 0;\n\t\t\t\t\t\tvar w = ( influencesPerVertex > 3 ) ? json.skinWeights[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinWeights.push( new Vector4( x, y, z, w ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.skinIndices ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.skinIndices.length; i < l; i += influencesPerVertex ) {\n\n\t\t\t\t\t\tvar a = json.skinIndices[ i ];\n\t\t\t\t\t\tvar b = ( influencesPerVertex > 1 ) ? json.skinIndices[ i + 1 ] : 0;\n\t\t\t\t\t\tvar c = ( influencesPerVertex > 2 ) ? json.skinIndices[ i + 2 ] : 0;\n\t\t\t\t\t\tvar d = ( influencesPerVertex > 3 ) ? json.skinIndices[ i + 3 ] : 0;\n\n\t\t\t\t\t\tgeometry.skinIndices.push( new Vector4( a, b, c, d ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.bones = json.bones;\n\n\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 && ( geometry.skinWeights.length !== geometry.skinIndices.length || geometry.skinIndices.length !== geometry.vertices.length ) ) {\n\n\t\t\t\t\tconsole.warn( 'When skinning, number of vertices (' + geometry.vertices.length + '), skinIndices (' +\n\t\t\t\t\t\tgeometry.skinIndices.length + '), and skinWeights (' + geometry.skinWeights.length + ') should match.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseMorphing( json, geometry ) {\n\n\t\t\t\tvar scale = json.scale;\n\n\t\t\t\tif ( json.morphTargets !== undefined ) {\n\n\t\t\t\t\tfor ( var i = 0, l = json.morphTargets.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tgeometry.morphTargets[ i ] = {};\n\t\t\t\t\t\tgeometry.morphTargets[ i ].name = json.morphTargets[ i ].name;\n\t\t\t\t\t\tgeometry.morphTargets[ i ].vertices = [];\n\n\t\t\t\t\t\tvar dstVertices = geometry.morphTargets[ i ].vertices;\n\t\t\t\t\t\tvar srcVertices = json.morphTargets[ i ].vertices;\n\n\t\t\t\t\t\tfor ( var v = 0, vl = srcVertices.length; v < vl; v += 3 ) {\n\n\t\t\t\t\t\t\tvar vertex = new Vector3();\n\t\t\t\t\t\t\tvertex.x = srcVertices[ v ] * scale;\n\t\t\t\t\t\t\tvertex.y = srcVertices[ v + 1 ] * scale;\n\t\t\t\t\t\t\tvertex.z = srcVertices[ v + 2 ] * scale;\n\n\t\t\t\t\t\t\tdstVertices.push( vertex );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.morphColors !== undefined && json.morphColors.length > 0 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.JSONLoader: \"morphColors\" no longer supported. Using them as face colors.' );\n\n\t\t\t\t\tvar faces = geometry.faces;\n\t\t\t\t\tvar morphColors = json.morphColors[ 0 ].colors;\n\n\t\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tfaces[ i ].color.fromArray( morphColors, i * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction parseAnimations( json, geometry ) {\n\n\t\t\t\tvar outputAnimations = [];\n\n\t\t\t\t// parse old style Bone/Hierarchy animations\n\t\t\t\tvar animations = [];\n\n\t\t\t\tif ( json.animation !== undefined ) {\n\n\t\t\t\t\tanimations.push( json.animation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.animations !== undefined ) {\n\n\t\t\t\t\tif ( json.animations.length ) {\n\n\t\t\t\t\t\tanimations = animations.concat( json.animations );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tanimations.push( json.animations );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var i = 0; i < animations.length; i ++ ) {\n\n\t\t\t\t\tvar clip = AnimationClip.parseAnimation( animations[ i ], geometry.bones );\n\t\t\t\t\tif ( clip ) outputAnimations.push( clip );\n\n\t\t\t\t}\n\n\t\t\t\t// parse implicit morph animations\n\t\t\t\tif ( geometry.morphTargets ) {\n\n\t\t\t\t\t// TODO: Figure out what an appropraite FPS is for morph target animations -- defaulting to 10, but really it is completely arbitrary.\n\t\t\t\t\tvar morphAnimationClips = AnimationClip.CreateClipsFromMorphTargetSequences( geometry.morphTargets, 10 );\n\t\t\t\t\toutputAnimations = outputAnimations.concat( morphAnimationClips );\n\n\t\t\t\t}\n\n\t\t\t\tif ( outputAnimations.length > 0 ) geometry.animations = outputAnimations;\n\n\t\t\t}\n\n\t\t\treturn function ( json, texturePath ) {\n\n\t\t\t\tif ( json.data !== undefined ) {\n\n\t\t\t\t\t// Geometry 4.0 spec\n\t\t\t\t\tjson = json.data;\n\n\t\t\t\t}\n\n\t\t\t\tif ( json.scale !== undefined ) {\n\n\t\t\t\t\tjson.scale = 1.0 / json.scale;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tjson.scale = 1.0;\n\n\t\t\t\t}\n\n\t\t\t\tvar geometry = new Geometry();\n\n\t\t\t\tparseModel( json, geometry );\n\t\t\t\tparseSkin( json, geometry );\n\t\t\t\tparseMorphing( json, geometry );\n\t\t\t\tparseAnimations( json, geometry );\n\n\t\t\t\tgeometry.computeFaceNormals();\n\t\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\t\tif ( json.materials === undefined || json.materials.length === 0 ) {\n\n\t\t\t\t\treturn { geometry: geometry };\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvar materials = Loader.prototype.initMaterials( json.materials, texturePath, this.crossOrigin );\n\n\t\t\t\t\treturn { geometry: geometry, materials: materials };\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction ObjectLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\t\tthis.texturePath = '';\n\n\t}\n\n\tObject.assign( ObjectLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tif ( this.texturePath === '' ) {\n\n\t\t\t\tthis.texturePath = url.substring( 0, url.lastIndexOf( '/' ) + 1 );\n\n\t\t\t}\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( scope.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json = null;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\t\tconsole.error( 'THREE:ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tvar metadata = json.metadata;\n\n\t\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\t\tconsole.error( 'THREE.ObjectLoader: Can\\'t load ' + url + '. Use THREE.JSONLoader instead.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tscope.parse( json, onLoad );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tsetTexturePath: function ( value ) {\n\n\t\t\tthis.texturePath = value;\n\n\t\t},\n\n\t\tsetCrossOrigin: function ( value ) {\n\n\t\t\tthis.crossOrigin = value;\n\n\t\t},\n\n\t\tparse: function ( json, onLoad ) {\n\n\t\t\tvar geometries = this.parseGeometries( json.geometries );\n\n\t\t\tvar images = this.parseImages( json.images, function () {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t} );\n\n\t\t\tvar textures = this.parseTextures( json.textures, images );\n\t\t\tvar materials = this.parseMaterials( json.materials, textures );\n\n\t\t\tvar object = this.parseObject( json.object, geometries, materials );\n\n\t\t\tif ( json.animations ) {\n\n\t\t\t\tobject.animations = this.parseAnimations( json.animations );\n\n\t\t\t}\n\n\t\t\tif ( json.images === undefined || json.images.length === 0 ) {\n\n\t\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t\t}\n\n\t\t\treturn object;\n\n\t\t},\n\n\t\tparseGeometries: function ( json ) {\n\n\t\t\tvar geometries = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar geometryLoader = new JSONLoader();\n\t\t\t\tvar bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar geometry;\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\t\tcase 'PlaneGeometry':\n\t\t\t\t\t\tcase 'PlaneBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BoxGeometry':\n\t\t\t\t\t\tcase 'BoxBufferGeometry':\n\t\t\t\t\t\tcase 'CubeGeometry': // backwards compatible\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.width,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.depth,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.depthSegments\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CircleGeometry':\n\t\t\t\t\t\tcase 'CircleBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'CylinderGeometry':\n\t\t\t\t\t\tcase 'CylinderBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radiusTop,\n\t\t\t\t\t\t\t\tdata.radiusBottom,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'ConeGeometry':\n\t\t\t\t\t\tcase 'ConeBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.height,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.openEnded,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'SphereGeometry':\n\t\t\t\t\t\tcase 'SphereBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.widthSegments,\n\t\t\t\t\t\t\t\tdata.heightSegments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'DodecahedronGeometry':\n\t\t\t\t\t\tcase 'IcosahedronGeometry':\n\t\t\t\t\t\tcase 'OctahedronGeometry':\n\t\t\t\t\t\tcase 'TetrahedronGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.detail\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'RingGeometry':\n\t\t\t\t\t\tcase 'RingBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.innerRadius,\n\t\t\t\t\t\t\t\tdata.outerRadius,\n\t\t\t\t\t\t\t\tdata.thetaSegments,\n\t\t\t\t\t\t\t\tdata.phiSegments,\n\t\t\t\t\t\t\t\tdata.thetaStart,\n\t\t\t\t\t\t\t\tdata.thetaLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusGeometry':\n\t\t\t\t\t\tcase 'TorusBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.arc\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TorusKnotGeometry':\n\t\t\t\t\t\tcase 'TorusKnotBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.radius,\n\t\t\t\t\t\t\t\tdata.tube,\n\t\t\t\t\t\t\t\tdata.tubularSegments,\n\t\t\t\t\t\t\t\tdata.radialSegments,\n\t\t\t\t\t\t\t\tdata.p,\n\t\t\t\t\t\t\t\tdata.q\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'LatheGeometry':\n\t\t\t\t\t\tcase 'LatheBufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = new Geometries[ data.type ](\n\t\t\t\t\t\t\t\tdata.points,\n\t\t\t\t\t\t\t\tdata.segments,\n\t\t\t\t\t\t\t\tdata.phiStart,\n\t\t\t\t\t\t\t\tdata.phiLength\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'BufferGeometry':\n\n\t\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'Geometry':\n\n\t\t\t\t\t\t\tgeometry = geometryLoader.parse( data, this.texturePath ).geometry;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Unsupported geometry type \"' + data.type + '\"' );\n\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\n\t\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometries;\n\n\t\t},\n\n\t\tparseMaterials: function ( json, textures ) {\n\n\t\t\tvar materials = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tvar loader = new MaterialLoader();\n\t\t\t\tloader.setTextures( textures );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tif ( data.type === 'MultiMaterial' ) {\n\n\t\t\t\t\t\t// Deprecated\n\n\t\t\t\t\t\tvar array = [];\n\n\t\t\t\t\t\tfor ( var j = 0; j < data.materials.length; j ++ ) {\n\n\t\t\t\t\t\t\tarray.push( loader.parse( data.materials[ j ] ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaterials[ data.uuid ] = array;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmaterials[ data.uuid ] = loader.parse( data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn materials;\n\n\t\t},\n\n\t\tparseAnimations: function ( json ) {\n\n\t\t\tvar animations = [];\n\n\t\t\tfor ( var i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tvar clip = AnimationClip.parse( json[ i ] );\n\n\t\t\t\tanimations.push( clip );\n\n\t\t\t}\n\n\t\t\treturn animations;\n\n\t\t},\n\n\t\tparseImages: function ( json, onLoad ) {\n\n\t\t\tvar scope = this;\n\t\t\tvar images = {};\n\n\t\t\tfunction loadImage( url ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\treturn loader.load( url, function () {\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, undefined, function () {\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\t\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\t\tvar manager = new LoadingManager( onLoad );\n\n\t\t\t\tvar loader = new ImageLoader( manager );\n\t\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar image = json[ i ];\n\t\t\t\t\tvar path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( image.url ) ? image.url : scope.texturePath + image.url;\n\n\t\t\t\t\timages[ image.uuid ] = loadImage( path );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn images;\n\n\t\t},\n\n\t\tparseTextures: function ( json, images ) {\n\n\t\t\tfunction parseConstant( value, type ) {\n\n\t\t\t\tif ( typeof( value ) === 'number' ) return value;\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\t\treturn type[ value ];\n\n\t\t\t}\n\n\t\t\tvar textures = {};\n\n\t\t\tif ( json !== undefined ) {\n\n\t\t\t\tfor ( var i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar data = json[ i ];\n\n\t\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar texture = new Texture( images[ data.image ] );\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );\n\n\t\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );\n\t\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );\n\t\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );\n\t\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn textures;\n\n\t\t},\n\n\t\tparseObject: function () {\n\n\t\t\tvar matrix = new Matrix4();\n\n\t\t\treturn function parseObject( data, geometries, materials ) {\n\n\t\t\t\tvar object;\n\n\t\t\t\tfunction getGeometry( name ) {\n\n\t\t\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn geometries[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tfunction getMaterial( name ) {\n\n\t\t\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\t\t\tif ( Array.isArray( name ) ) {\n\n\t\t\t\t\t\tvar array = [];\n\n\t\t\t\t\t\tfor ( var i = 0, l = name.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tvar uuid = name[ i ];\n\n\t\t\t\t\t\t\tif ( materials[ uuid ] === undefined ) {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', uuid );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tarray.push( materials[ uuid ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn array;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn materials[ name ];\n\n\t\t\t\t}\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'Scene':\n\n\t\t\t\t\t\tobject = new Scene();\n\n\t\t\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'AmbientLight':\n\n\t\t\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'DirectionalLight':\n\n\t\t\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointLight':\n\n\t\t\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'RectAreaLight':\n\n\t\t\t\t\t\tobject = new RectAreaLight( data.color, data.intensity, data.width, data.height );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SpotLight':\n\n\t\t\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'HemisphereLight':\n\n\t\t\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.' );\n\n\t\t\t\t\tcase 'Mesh':\n\n\t\t\t\t\t\tvar geometry = getGeometry( data.geometry );\n\t\t\t\t\t\tvar material = getMaterial( data.material );\n\n\t\t\t\t\t\tif ( geometry.bones && geometry.bones.length > 0 ) {\n\n\t\t\t\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LOD':\n\n\t\t\t\t\t\tobject = new LOD();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Line':\n\n\t\t\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ), data.mode );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LineLoop':\n\n\t\t\t\t\t\tobject = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LineSegments':\n\n\t\t\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PointCloud':\n\t\t\t\t\tcase 'Points':\n\n\t\t\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Sprite':\n\n\t\t\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Group':\n\n\t\t\t\t\t\tobject = new Group();\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tobject = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t\tobject.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) object.name = data.name;\n\t\t\t\tif ( data.matrix !== undefined ) {\n\n\t\t\t\t\tmatrix.fromArray( data.matrix );\n\t\t\t\t\tmatrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\t\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\t\t\tif ( data.shadow ) {\n\n\t\t\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\t\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\n\t\t\t\tif ( data.children !== undefined ) {\n\n\t\t\t\t\tvar children = data.children;\n\n\t\t\t\t\tfor ( var  i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\t\tobject.add( this.parseObject( children[ i ], geometries, materials ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.type === 'LOD' ) {\n\n\t\t\t\t\tvar levels = data.levels;\n\n\t\t\t\t\tfor ( var l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\t\t\tvar level = levels[ l ];\n\t\t\t\t\t\tvar child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\t\t\tobject.addLevel( child, level.distance );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn object;\n\n\t\t\t};\n\n\t\t}()\n\n\t} );\n\n\tvar TEXTURE_MAPPING = {\n\t\tUVMapping: UVMapping,\n\t\tCubeReflectionMapping: CubeReflectionMapping,\n\t\tCubeRefractionMapping: CubeRefractionMapping,\n\t\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\t\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\t\tSphericalReflectionMapping: SphericalReflectionMapping,\n\t\tCubeUVReflectionMapping: CubeUVReflectionMapping,\n\t\tCubeUVRefractionMapping: CubeUVRefractionMapping\n\t};\n\n\tvar TEXTURE_WRAPPING = {\n\t\tRepeatWrapping: RepeatWrapping,\n\t\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\t\tMirroredRepeatWrapping: MirroredRepeatWrapping\n\t};\n\n\tvar TEXTURE_FILTER = {\n\t\tNearestFilter: NearestFilter,\n\t\tNearestMipMapNearestFilter: NearestMipMapNearestFilter,\n\t\tNearestMipMapLinearFilter: NearestMipMapLinearFilter,\n\t\tLinearFilter: LinearFilter,\n\t\tLinearMipMapNearestFilter: LinearMipMapNearestFilter,\n\t\tLinearMipMapLinearFilter: LinearMipMapLinearFilter\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t * Bezier Curves formulas obtained from\n\t * http://en.wikipedia.org/wiki/Bézier_curve\n\t */\n\n\tfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\t\tvar v0 = ( p2 - p0 ) * 0.5;\n\t\tvar v1 = ( p3 - p1 ) * 0.5;\n\t\tvar t2 = t * t;\n\t\tvar t3 = t * t2;\n\t\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n\t}\n\n\t//\n\n\tfunction QuadraticBezierP0( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn k * k * p;\n\n\t}\n\n\tfunction QuadraticBezierP1( t, p ) {\n\n\t\treturn 2 * ( 1 - t ) * t * p;\n\n\t}\n\n\tfunction QuadraticBezierP2( t, p ) {\n\n\t\treturn t * t * p;\n\n\t}\n\n\tfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\t\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\t\tQuadraticBezierP2( t, p2 );\n\n\t}\n\n\t//\n\n\tfunction CubicBezierP0( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn k * k * k * p;\n\n\t}\n\n\tfunction CubicBezierP1( t, p ) {\n\n\t\tvar k = 1 - t;\n\t\treturn 3 * k * k * t * p;\n\n\t}\n\n\tfunction CubicBezierP2( t, p ) {\n\n\t\treturn 3 * ( 1 - t ) * t * t * p;\n\n\t}\n\n\tfunction CubicBezierP3( t, p ) {\n\n\t\treturn t * t * t * p;\n\n\t}\n\n\tfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\t\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\t\tCubicBezierP3( t, p3 );\n\n\t}\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Extensible curve object\n\t *\n\t * Some common of curve methods:\n\t * .getPoint(t), getTangent(t)\n\t * .getPointAt(u), getTangentAt(u)\n\t * .getPoints(), .getSpacedPoints()\n\t * .getLength()\n\t * .updateArcLengths()\n\t *\n\t * This following curves inherit from THREE.Curve:\n\t *\n\t * -- 2D curves --\n\t * THREE.ArcCurve\n\t * THREE.CubicBezierCurve\n\t * THREE.EllipseCurve\n\t * THREE.LineCurve\n\t * THREE.QuadraticBezierCurve\n\t * THREE.SplineCurve\n\t *\n\t * -- 3D curves --\n\t * THREE.CatmullRomCurve3\n\t * THREE.CubicBezierCurve3\n\t * THREE.LineCurve3\n\t * THREE.QuadraticBezierCurve3\n\t *\n\t * A series of curves can be represented as a THREE.CurvePath.\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tAbstract Curve base class\n\t **************************************************************/\n\n\tfunction Curve() {\n\n\t\tthis.arcLengthDivisions = 200;\n\n\t}\n\n\tObject.assign( Curve.prototype, {\n\n\t\t// Virtual base class method to overwrite and implement in subclasses\n\t\t//\t- t [0 .. 1]\n\n\t\tgetPoint: function () {\n\n\t\t\tconsole.warn( 'THREE.Curve: .getPoint() not implemented.' );\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// Get point at relative position in curve according to arc length\n\t\t// - u [0 .. 1]\n\n\t\tgetPointAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getPoint( t );\n\n\t\t},\n\n\t\t// Get sequence of points using getPoint( t )\n\n\t\tgetPoints: function ( divisions ) {\n\n\t\t\tif ( divisions === undefined ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get sequence of points using getPointAt( u )\n\n\t\tgetSpacedPoints: function ( divisions ) {\n\n\t\t\tif ( divisions === undefined ) divisions = 5;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var d = 0; d <= divisions; d ++ ) {\n\n\t\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t// Get total curve arc length\n\n\t\tgetLength: function () {\n\n\t\t\tvar lengths = this.getLengths();\n\t\t\treturn lengths[ lengths.length - 1 ];\n\n\t\t},\n\n\t\t// Get list of cumulative segment lengths\n\n\t\tgetLengths: function ( divisions ) {\n\n\t\t\tif ( divisions === undefined ) divisions = this.arcLengthDivisions;\n\n\t\t\tif ( this.cacheArcLengths &&\n\t\t\t\t( this.cacheArcLengths.length === divisions + 1 ) &&\n\t\t\t\t! this.needsUpdate ) {\n\n\t\t\t\treturn this.cacheArcLengths;\n\n\t\t\t}\n\n\t\t\tthis.needsUpdate = false;\n\n\t\t\tvar cache = [];\n\t\t\tvar current, last = this.getPoint( 0 );\n\t\t\tvar p, sum = 0;\n\n\t\t\tcache.push( 0 );\n\n\t\t\tfor ( p = 1; p <= divisions; p ++ ) {\n\n\t\t\t\tcurrent = this.getPoint( p / divisions );\n\t\t\t\tsum += current.distanceTo( last );\n\t\t\t\tcache.push( sum );\n\t\t\t\tlast = current;\n\n\t\t\t}\n\n\t\t\tthis.cacheArcLengths = cache;\n\n\t\t\treturn cache; // { sums: cache, sum: sum }; Sum is in the last element.\n\n\t\t},\n\n\t\tupdateArcLengths: function () {\n\n\t\t\tthis.needsUpdate = true;\n\t\t\tthis.getLengths();\n\n\t\t},\n\n\t\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\t\tgetUtoTmapping: function ( u, distance ) {\n\n\t\t\tvar arcLengths = this.getLengths();\n\n\t\t\tvar i = 0, il = arcLengths.length;\n\n\t\t\tvar targetArcLength; // The targeted u distance value to get\n\n\t\t\tif ( distance ) {\n\n\t\t\t\ttargetArcLength = distance;\n\n\t\t\t} else {\n\n\t\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t\t}\n\n\t\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\t\tvar low = 0, high = il - 1, comparison;\n\n\t\t\twhile ( low <= high ) {\n\n\t\t\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\n\n\t\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\t\tlow = i + 1;\n\n\t\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\t\thigh = i - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thigh = i;\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// DONE\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ti = high;\n\n\t\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\t\treturn i / ( il - 1 );\n\n\t\t\t}\n\n\t\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\t\tvar lengthBefore = arcLengths[ i ];\n\t\t\tvar lengthAfter = arcLengths[ i + 1 ];\n\n\t\t\tvar segmentLength = lengthAfter - lengthBefore;\n\n\t\t\t// determine where we are between the 'before' and 'after' points\n\n\t\t\tvar segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t\t// add that fractional amount to t\n\n\t\t\tvar t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\t\treturn t;\n\n\t\t},\n\n\t\t// Returns a unit vector tangent at t\n\t\t// In case any sub curve does not implement its tangent derivation,\n\t\t// 2 points a small delta apart will be used to find its gradient\n\t\t// which seems to give a reasonable approximation\n\n\t\tgetTangent: function ( t ) {\n\n\t\t\tvar delta = 0.0001;\n\t\t\tvar t1 = t - delta;\n\t\t\tvar t2 = t + delta;\n\n\t\t\t// Capping in case of danger\n\n\t\t\tif ( t1 < 0 ) t1 = 0;\n\t\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\t\tvar pt1 = this.getPoint( t1 );\n\t\t\tvar pt2 = this.getPoint( t2 );\n\n\t\t\tvar vec = pt2.clone().sub( pt1 );\n\t\t\treturn vec.normalize();\n\n\t\t},\n\n\t\tgetTangentAt: function ( u ) {\n\n\t\t\tvar t = this.getUtoTmapping( u );\n\t\t\treturn this.getTangent( t );\n\n\t\t},\n\n\t\tcomputeFrenetFrames: function ( segments, closed ) {\n\n\t\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\t\tvar normal = new Vector3();\n\n\t\t\tvar tangents = [];\n\t\t\tvar normals = [];\n\t\t\tvar binormals = [];\n\n\t\t\tvar vec = new Vector3();\n\t\t\tvar mat = new Matrix4();\n\n\t\t\tvar i, u, theta;\n\n\t\t\t// compute the tangent vectors for each segment on the curve\n\n\t\t\tfor ( i = 0; i <= segments; i ++ ) {\n\n\t\t\t\tu = i / segments;\n\n\t\t\t\ttangents[ i ] = this.getTangentAt( u );\n\t\t\t\ttangents[ i ].normalize();\n\n\t\t\t}\n\n\t\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t\t// and in the direction of the minimum tangent xyz component\n\n\t\t\tnormals[ 0 ] = new Vector3();\n\t\t\tbinormals[ 0 ] = new Vector3();\n\t\t\tvar min = Number.MAX_VALUE;\n\t\t\tvar tx = Math.abs( tangents[ 0 ].x );\n\t\t\tvar ty = Math.abs( tangents[ 0 ].y );\n\t\t\tvar tz = Math.abs( tangents[ 0 ].z );\n\n\t\t\tif ( tx <= min ) {\n\n\t\t\t\tmin = tx;\n\t\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t\t}\n\n\t\t\tif ( ty <= min ) {\n\n\t\t\t\tmin = ty;\n\t\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t\t}\n\n\t\t\tif ( tz <= min ) {\n\n\t\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t\t}\n\n\t\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\t\tvec.normalize();\n\n\t\t\t\t\ttheta = Math.acos( _Math.clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t\t}\n\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\t\tif ( closed === true ) {\n\n\t\t\t\ttheta = Math.acos( _Math.clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\t\ttheta /= segments;\n\n\t\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\t\ttheta = - theta;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t\t// twist a little...\n\t\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\ttangents: tangents,\n\t\t\t\tnormals: normals,\n\t\t\t\tbinormals: binormals\n\t\t\t};\n\n\t\t}\n\n\t} );\n\n\tfunction LineCurve( v1, v2 ) {\n\n\t\tCurve.call( this );\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tLineCurve.prototype = Object.create( Curve.prototype );\n\tLineCurve.prototype.constructor = LineCurve;\n\n\tLineCurve.prototype.isLineCurve = true;\n\n\tLineCurve.prototype.getPoint = function ( t ) {\n\n\t\tif ( t === 1 ) {\n\n\t\t\treturn this.v2.clone();\n\n\t\t}\n\n\t\tvar point = this.v2.clone().sub( this.v1 );\n\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\treturn point;\n\n\t};\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\n\tLineCurve.prototype.getPointAt = function ( u ) {\n\n\t\treturn this.getPoint( u );\n\n\t};\n\n\tLineCurve.prototype.getTangent = function ( t ) {\n\n\t\tvar tangent = this.v2.clone().sub( this.v1 );\n\n\t\treturn tangent.normalize();\n\n\t};\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t *\n\t **/\n\n\t/**************************************************************\n\t *\tCurved Path - a curve path is simply a array of connected\n\t *  curves, but retains the api of a curve\n\t **************************************************************/\n\n\tfunction CurvePath() {\n\n\t\tCurve.call( this );\n\n\t\tthis.curves = [];\n\n\t\tthis.autoClose = false; // Automatically closes the path\n\n\t}\n\n\tCurvePath.prototype = Object.assign( Object.create( Curve.prototype ), {\n\n\t\tconstructor: CurvePath,\n\n\t\tadd: function ( curve ) {\n\n\t\t\tthis.curves.push( curve );\n\n\t\t},\n\n\t\tclosePath: function () {\n\n\t\t\t// Add a line curve if start and end of lines are not connected\n\t\t\tvar startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\t\tvar endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tgetPoint: function ( t ) {\n\n\t\t\tvar d = t * this.getLength();\n\t\t\tvar curveLengths = this.getCurveLengths();\n\t\t\tvar i = 0;\n\n\t\t\t// To think about boundaries points.\n\n\t\t\twhile ( i < curveLengths.length ) {\n\n\t\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\t\tvar diff = curveLengths[ i ] - d;\n\t\t\t\t\tvar curve = this.curves[ i ];\n\n\t\t\t\t\tvar segmentLength = curve.getLength();\n\t\t\t\t\tvar u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\t\treturn curve.getPointAt( u );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t\t// loop where sum != 0, sum > d , sum+1 <d\n\n\t\t},\n\n\t\t// We cannot use the default THREE.Curve getPoint() with getLength() because in\n\t\t// THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath\n\t\t// getPoint() depends on getLength\n\n\t\tgetLength: function () {\n\n\t\t\tvar lens = this.getCurveLengths();\n\t\t\treturn lens[ lens.length - 1 ];\n\n\t\t},\n\n\t\t// cacheLengths must be recalculated.\n\t\tupdateArcLengths: function () {\n\n\t\t\tthis.needsUpdate = true;\n\t\t\tthis.cacheLengths = null;\n\t\t\tthis.getCurveLengths();\n\n\t\t},\n\n\t\t// Compute lengths and cache them\n\t\t// We cannot overwrite getLengths() because UtoT mapping uses it.\n\n\t\tgetCurveLengths: function () {\n\n\t\t\t// We use cache values if curves and cache array are same length\n\n\t\t\tif ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) {\n\n\t\t\t\treturn this.cacheLengths;\n\n\t\t\t}\n\n\t\t\t// Get length of sub-curve\n\t\t\t// Push sums into cached array\n\n\t\t\tvar lengths = [], sums = 0;\n\n\t\t\tfor ( var i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\t\tsums += this.curves[ i ].getLength();\n\t\t\t\tlengths.push( sums );\n\n\t\t\t}\n\n\t\t\tthis.cacheLengths = lengths;\n\n\t\t\treturn lengths;\n\n\t\t},\n\n\t\tgetSpacedPoints: function ( divisions ) {\n\n\t\t\tif ( divisions === undefined ) divisions = 40;\n\n\t\t\tvar points = [];\n\n\t\t\tfor ( var i = 0; i <= divisions; i ++ ) {\n\n\t\t\t\tpoints.push( this.getPoint( i / divisions ) );\n\n\t\t\t}\n\n\t\t\tif ( this.autoClose ) {\n\n\t\t\t\tpoints.push( points[ 0 ] );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\tgetPoints: function ( divisions ) {\n\n\t\t\tdivisions = divisions || 12;\n\n\t\t\tvar points = [], last;\n\n\t\t\tfor ( var i = 0, curves = this.curves; i < curves.length; i ++ ) {\n\n\t\t\t\tvar curve = curves[ i ];\n\t\t\t\tvar resolution = (curve && curve.isEllipseCurve) ? divisions * 2\n\t\t\t\t\t: (curve && curve.isLineCurve) ? 1\n\t\t\t\t\t: (curve && curve.isSplineCurve) ? divisions * curve.points.length\n\t\t\t\t\t: divisions;\n\n\t\t\t\tvar pts = curve.getPoints( resolution );\n\n\t\t\t\tfor ( var j = 0; j < pts.length; j++ ) {\n\n\t\t\t\t\tvar point = pts[ j ];\n\n\t\t\t\t\tif ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates\n\n\t\t\t\t\tpoints.push( point );\n\t\t\t\t\tlast = point;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.autoClose && points.length > 1 && !points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\t\tpoints.push( points[ 0 ] );\n\n\t\t\t}\n\n\t\t\treturn points;\n\n\t\t},\n\n\t\t/**************************************************************\n\t\t *\tCreate Geometries Helpers\n\t\t **************************************************************/\n\n\t\t/// Generate geometry from path points (for Line or Points objects)\n\n\t\tcreatePointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\t// Generate geometry from equidistant sampling along the path\n\n\t\tcreateSpacedPointsGeometry: function ( divisions ) {\n\n\t\t\tvar pts = this.getSpacedPoints( divisions );\n\t\t\treturn this.createGeometry( pts );\n\n\t\t},\n\n\t\tcreateGeometry: function ( points ) {\n\n\t\t\tvar geometry = new Geometry();\n\n\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tvar point = points[ i ];\n\t\t\t\tgeometry.vertices.push( new Vector3( point.x, point.y, point.z || 0 ) );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t} );\n\n\tfunction EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tCurve.call( this );\n\n\t\tthis.aX = aX;\n\t\tthis.aY = aY;\n\n\t\tthis.xRadius = xRadius;\n\t\tthis.yRadius = yRadius;\n\n\t\tthis.aStartAngle = aStartAngle;\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\tthis.aClockwise = aClockwise;\n\n\t\tthis.aRotation = aRotation || 0;\n\n\t}\n\n\tEllipseCurve.prototype = Object.create( Curve.prototype );\n\tEllipseCurve.prototype.constructor = EllipseCurve;\n\n\tEllipseCurve.prototype.isEllipseCurve = true;\n\n\tEllipseCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar twoPi = Math.PI * 2;\n\t\tvar deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tvar samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar angle = this.aStartAngle + t * deltaAngle;\n\t\tvar x = this.aX + this.xRadius * Math.cos( angle );\n\t\tvar y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tvar cos = Math.cos( this.aRotation );\n\t\t\tvar sin = Math.sin( this.aRotation );\n\n\t\t\tvar tx = x - this.aX;\n\t\t\tvar ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn new Vector2( x, y );\n\n\t};\n\n\tfunction SplineCurve( points /* array of Vector2 */ ) {\n\n\t\tCurve.call( this );\n\n\t\tthis.points = ( points === undefined ) ? [] : points;\n\n\t}\n\n\tSplineCurve.prototype = Object.create( Curve.prototype );\n\tSplineCurve.prototype.constructor = SplineCurve;\n\n\tSplineCurve.prototype.isSplineCurve = true;\n\n\tSplineCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar points = this.points;\n\t\tvar point = ( points.length - 1 ) * t;\n\n\t\tvar intPoint = Math.floor( point );\n\t\tvar weight = point - intPoint;\n\n\t\tvar point0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tvar point1 = points[ intPoint ];\n\t\tvar point2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tvar point3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\treturn new Vector2(\n\t\t\tCatmullRom( weight, point0.x, point1.x, point2.x, point3.x ),\n\t\t\tCatmullRom( weight, point0.y, point1.y, point2.y, point3.y )\n\t\t);\n\n\t};\n\n\tfunction CubicBezierCurve( v0, v1, v2, v3 ) {\n\n\t\tCurve.call( this );\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tCubicBezierCurve.prototype = Object.create( Curve.prototype );\n\tCubicBezierCurve.prototype.constructor = CubicBezierCurve;\n\n\tCubicBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\treturn new Vector2(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t};\n\n\tfunction QuadraticBezierCurve( v0, v1, v2 ) {\n\n\t\tCurve.call( this );\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tQuadraticBezierCurve.prototype = Object.create( Curve.prototype );\n\tQuadraticBezierCurve.prototype.constructor = QuadraticBezierCurve;\n\n\tQuadraticBezierCurve.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\treturn new Vector2(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t};\n\n\tvar PathPrototype = Object.assign( Object.create( CurvePath.prototype ), {\n\n\t\tfromPoints: function ( vectors ) {\n\n\t\t\tthis.moveTo( vectors[ 0 ].x, vectors[ 0 ].y );\n\n\t\t\tfor ( var i = 1, l = vectors.length; i < l; i ++ ) {\n\n\t\t\t\tthis.lineTo( vectors[ i ].x, vectors[ i ].y );\n\n\t\t\t}\n\n\t\t},\n\n\t\tmoveTo: function ( x, y ) {\n\n\t\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\t},\n\n\t\tlineTo: function ( x, y ) {\n\n\t\t\tvar curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( x, y );\n\n\t\t},\n\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\t\tvar curve = new QuadraticBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\t\tvar curve = new CubicBezierCurve(\n\t\t\t\tthis.currentPoint.clone(),\n\t\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\t\tnew Vector2( aX, aY )\n\t\t\t);\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.set( aX, aY );\n\n\t\t},\n\n\t\tsplineThru: function ( pts /*Array of Vector*/ ) {\n\n\t\t\tvar npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\t\tvar curve = new SplineCurve( npts );\n\t\t\tthis.curves.push( curve );\n\n\t\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\t},\n\n\t\tarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tabsarc: function ( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t},\n\n\t\tellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar x0 = this.currentPoint.x;\n\t\t\tvar y0 = this.currentPoint.y;\n\n\t\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t},\n\n\t\tabsellipse: function ( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\t\tvar curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t\t// if a previous curve is present, attempt to join\n\t\t\t\tvar firstPoint = curve.getPoint( 0 );\n\n\t\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.curves.push( curve );\n\n\t\t\tvar lastPoint = curve.getPoint( 1 );\n\t\t\tthis.currentPoint.copy( lastPoint );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Creates free form 2d path using series of points, lines or curves.\n\t **/\n\n\tfunction Path( points ) {\n\n\t\tCurvePath.call( this );\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.fromPoints( points );\n\n\t\t}\n\n\t}\n\n\tPath.prototype = PathPrototype;\n\tPathPrototype.constructor = Path;\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * Defines a 2d shape plane using paths.\n\t **/\n\n\t// STEP 1 Create a path.\n\t// STEP 2 Turn path into shape.\n\t// STEP 3 ExtrudeGeometry takes in Shape/Shapes\n\t// STEP 3a - Extract points from each shape, turn to vertices\n\t// STEP 3b - Triangulate each shape, add faces.\n\n\tfunction Shape() {\n\n\t\tPath.apply( this, arguments );\n\n\t\tthis.holes = [];\n\n\t}\n\n\tShape.prototype = Object.assign( Object.create( PathPrototype ), {\n\n\t\tconstructor: Shape,\n\n\t\tgetPointsHoles: function ( divisions ) {\n\n\t\t\tvar holesPts = [];\n\n\t\t\tfor ( var i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t\t}\n\n\t\t\treturn holesPts;\n\n\t\t},\n\n\t\t// Get points of shape and holes (keypoints based on segments parameter)\n\n\t\textractAllPoints: function ( divisions ) {\n\n\t\t\treturn {\n\n\t\t\t\tshape: this.getPoints( divisions ),\n\t\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t\t};\n\n\t\t},\n\n\t\textractPoints: function ( divisions ) {\n\n\t\t\treturn this.extractAllPoints( divisions );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * minimal class for proxing functions to Path. Replaces old \"extractSubpaths()\"\n\t **/\n\n\tfunction ShapePath() {\n\n\t\tthis.subPaths = [];\n\t\tthis.currentPath = null;\n\n\t}\n\n\tObject.assign( ShapePath.prototype, {\n\n\t\tmoveTo: function ( x, y ) {\n\n\t\t\tthis.currentPath = new Path();\n\t\t\tthis.subPaths.push( this.currentPath );\n\t\t\tthis.currentPath.moveTo( x, y );\n\n\t\t},\n\n\t\tlineTo: function ( x, y ) {\n\n\t\t\tthis.currentPath.lineTo( x, y );\n\n\t\t},\n\n\t\tquadraticCurveTo: function ( aCPx, aCPy, aX, aY ) {\n\n\t\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\t},\n\n\t\tbezierCurveTo: function ( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\t},\n\n\t\tsplineThru: function ( pts ) {\n\n\t\t\tthis.currentPath.splineThru( pts );\n\n\t\t},\n\n\t\ttoShapes: function ( isCCW, noHoles ) {\n\n\t\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\t\tvar shapes = [];\n\n\t\t\t\tfor ( var i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar tmpPath = inSubpaths[ i ];\n\n\t\t\t\t\tvar tmpShape = new Shape();\n\t\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t\t}\n\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\t\tvar polyLen = inPolygon.length;\n\n\t\t\t\t// inPt on polygon contour => immediate success    or\n\t\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t\t//  with the horizontal line through inPt, left of inPt\n\t\t\t\t//  not counting lowerY endpoints of edges and whole edges on that line\n\t\t\t\tvar inside = false;\n\t\t\t\tfor ( var p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\t\tvar edgeLowPt  = inPolygon[ p ];\n\t\t\t\t\tvar edgeHighPt = inPolygon[ q ];\n\n\t\t\t\t\tvar edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\t\tvar edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t\t// not parallel\n\t\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\t\tedgeLowPt  = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvar perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// parallel or collinear\n\t\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t\t// continue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn\tinside;\n\n\t\t\t}\n\n\t\t\tvar isClockWise = ShapeUtils.isClockWise;\n\n\t\t\tvar subPaths = this.subPaths;\n\t\t\tif ( subPaths.length === 0 ) return [];\n\n\t\t\tif ( noHoles === true )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tvar solid, tmpPath, tmpShape, shapes = [];\n\n\t\t\tif ( subPaths.length === 1 ) {\n\n\t\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\t\ttmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\treturn shapes;\n\n\t\t\t}\n\n\t\t\tvar holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\t\tvar betterShapeHoles = [];\n\t\t\tvar newShapes = [];\n\t\t\tvar newShapeHoles = [];\n\t\t\tvar mainIdx = 0;\n\t\t\tvar tmpPoints;\n\n\t\t\tnewShapes[ mainIdx ] = undefined;\n\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\tfor ( var i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\t\ttmpPath = subPaths[ i ];\n\t\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\t\tif ( solid ) {\n\n\t\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t\t//console.log('cw', i);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t\t//console.log('ccw', i);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\t\tif ( newShapes.length > 1 ) {\n\n\t\t\t\tvar ambiguous = false;\n\t\t\t\tvar toChange = [];\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tfor ( var sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\t\tvar sho = newShapeHoles[ sIdx ];\n\n\t\t\t\t\tfor ( var hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\t\tvar ho = sho[ hIdx ];\n\t\t\t\t\t\tvar hole_unassigned = true;\n\n\t\t\t\t\t\tfor ( var s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange.push( { froms: sIdx, tos: s2Idx, hole: hIdx } );\n\t\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\t// console.log(\"ambiguous: \", ambiguous);\n\t\t\t\tif ( toChange.length > 0 ) {\n\n\t\t\t\t\t// console.log(\"to change: \", toChange);\n\t\t\t\t\tif ( ! ambiguous )\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar tmpHoles;\n\n\t\t\tfor ( var i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\t\tshapes.push( tmpShape );\n\t\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\t\tfor ( var j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//console.log(\"shape\", shapes);\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author zz85 / http://www.lab4games.net/zz85/blog\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Font( data ) {\n\n\t\tthis.data = data;\n\n\t}\n\n\tObject.assign( Font.prototype, {\n\n\t\tisFont: true,\n\n\t\tgenerateShapes: function ( text, size, divisions ) {\n\n\t\t\tfunction createPaths( text ) {\n\n\t\t\t\tvar chars = String( text ).split( '' );\n\t\t\t\tvar scale = size / data.resolution;\n\t\t\t\tvar line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;\n\n\t\t\t\tvar offsetX = 0, offsetY = 0;\n\n\t\t\t\tvar paths = [];\n\n\t\t\t\tfor ( var i = 0; i < chars.length; i ++ ) {\n\n\t\t\t\t\tvar char = chars[ i ];\n\n\t\t\t\t\tif ( char === '\\n' ) {\n\n\t\t\t\t\t\toffsetX = 0;\n\t\t\t\t\t\toffsetY -= line_height;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvar ret = createPath( char, scale, offsetX, offsetY );\n\t\t\t\t\t\toffsetX += ret.offsetX;\n\t\t\t\t\t\tpaths.push( ret.path );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn paths;\n\n\t\t\t}\n\n\t\t\tfunction createPath( c, scale, offsetX, offsetY ) {\n\n\t\t\t\tvar glyph = data.glyphs[ c ] || data.glyphs[ '?' ];\n\n\t\t\t\tif ( ! glyph ) return;\n\n\t\t\t\tvar path = new ShapePath();\n\n\t\t\t\tvar pts = [];\n\t\t\t\tvar x, y, cpx, cpy, cpx0, cpy0, cpx1, cpy1, cpx2, cpy2, laste;\n\n\t\t\t\tif ( glyph.o ) {\n\n\t\t\t\t\tvar outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\t\t\t\tfor ( var i = 0, l = outline.length; i < l; ) {\n\n\t\t\t\t\t\tvar action = outline[ i ++ ];\n\n\t\t\t\t\t\tswitch ( action ) {\n\n\t\t\t\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\t\t\t\tcpx  = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy  = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tQuadraticBezier( t, cpx0, cpx1, cpx );\n\t\t\t\t\t\t\t\t\t\tQuadraticBezier( t, cpy0, cpy1, cpy );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\t\t\t\tcpx  = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy  = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\t\t\t\tcpy2 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\t\t\t\tlaste = pts[ pts.length - 1 ];\n\n\t\t\t\t\t\t\t\tif ( laste ) {\n\n\t\t\t\t\t\t\t\t\tcpx0 = laste.x;\n\t\t\t\t\t\t\t\t\tcpy0 = laste.y;\n\n\t\t\t\t\t\t\t\t\tfor ( var i2 = 1; i2 <= divisions; i2 ++ ) {\n\n\t\t\t\t\t\t\t\t\t\tvar t = i2 / divisions;\n\t\t\t\t\t\t\t\t\t\tCubicBezier( t, cpx0, cpx1, cpx2, cpx );\n\t\t\t\t\t\t\t\t\t\tCubicBezier( t, cpy0, cpy1, cpy2, cpy );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn { offsetX: glyph.ha * scale, path: path };\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( size === undefined ) size = 100;\n\t\t\tif ( divisions === undefined ) divisions = 4;\n\n\t\t\tvar data = this.data;\n\n\t\t\tvar paths = createPaths( text );\n\t\t\tvar shapes = [];\n\n\t\t\tfor ( var p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\t\tArray.prototype.push.apply( shapes, paths[ p ].toShapes() );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction FontLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( FontLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar scope = this;\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.load( url, function ( text ) {\n\n\t\t\t\tvar json;\n\n\t\t\t\ttry {\n\n\t\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead.' );\n\t\t\t\t\tjson = JSON.parse( text.substring( 65, text.length - 2 ) );\n\n\t\t\t\t}\n\n\t\t\t\tvar font = scope.parse( json );\n\n\t\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t\t}, onProgress, onError );\n\n\t\t},\n\n\t\tparse: function ( json ) {\n\n\t\t\treturn new Font( json );\n\n\t\t}\n\n\t} );\n\n\tvar context;\n\n\tvar AudioContext = {\n\n\t\tgetContext: function () {\n\n\t\t\tif ( context === undefined ) {\n\n\t\t\t\tcontext = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t\t}\n\n\t\t\treturn context;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction AudioLoader( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t}\n\n\tObject.assign( AudioLoader.prototype, {\n\n\t\tload: function ( url, onLoad, onProgress, onError ) {\n\n\t\t\tvar loader = new FileLoader( this.manager );\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tvar context = AudioContext.getContext();\n\n\t\t\t\tcontext.decodeAudioData( buffer, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction StereoCamera() {\n\n\t\tthis.type = 'StereoCamera';\n\n\t\tthis.aspect = 1;\n\n\t\tthis.eyeSep = 0.064;\n\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t}\n\n\tObject.assign( StereoCamera.prototype, {\n\n\t\tupdate: ( function () {\n\n\t\t\tvar instance, focus, fov, aspect, near, far, zoom, eyeSep;\n\n\t\t\tvar eyeRight = new Matrix4();\n\t\t\tvar eyeLeft = new Matrix4();\n\n\t\t\treturn function update( camera ) {\n\n\t\t\t\tvar needsUpdate = instance !== this || focus !== camera.focus || fov !== camera.fov ||\n\t\t\t\t\t\t\t\t\t\t\t\t\taspect !== camera.aspect * this.aspect || near !== camera.near ||\n\t\t\t\t\t\t\t\t\t\t\t\t\tfar !== camera.far || zoom !== camera.zoom || eyeSep !== this.eyeSep;\n\n\t\t\t\tif ( needsUpdate ) {\n\n\t\t\t\t\tinstance = this;\n\t\t\t\t\tfocus = camera.focus;\n\t\t\t\t\tfov = camera.fov;\n\t\t\t\t\taspect = camera.aspect * this.aspect;\n\t\t\t\t\tnear = camera.near;\n\t\t\t\t\tfar = camera.far;\n\t\t\t\t\tzoom = camera.zoom;\n\n\t\t\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t\t\tvar projectionMatrix = camera.projectionMatrix.clone();\n\t\t\t\t\teyeSep = this.eyeSep / 2;\n\t\t\t\t\tvar eyeSepOnProjection = eyeSep * near / focus;\n\t\t\t\t\tvar ymax = ( near * Math.tan( _Math.DEG2RAD * fov * 0.5 ) ) / zoom;\n\t\t\t\t\tvar xmin, xmax;\n\n\t\t\t\t\t// translate xOffset\n\n\t\t\t\t\teyeLeft.elements[ 12 ] = - eyeSep;\n\t\t\t\t\teyeRight.elements[ 12 ] = eyeSep;\n\n\t\t\t\t\t// for left eye\n\n\t\t\t\t\txmin = - ymax * aspect + eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect + eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraL.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t\t// for right eye\n\n\t\t\t\t\txmin = - ymax * aspect - eyeSepOnProjection;\n\t\t\t\t\txmax = ymax * aspect - eyeSepOnProjection;\n\n\t\t\t\t\tprojectionMatrix.elements[ 0 ] = 2 * near / ( xmax - xmin );\n\t\t\t\t\tprojectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\t\t\tthis.cameraR.projectionMatrix.copy( projectionMatrix );\n\n\t\t\t\t}\n\n\t\t\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( eyeLeft );\n\t\t\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( eyeRight );\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * Camera for rendering cube maps\n\t *\t- renders scene into axis-aligned cube\n\t *\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction CubeCamera( near, far, cubeResolution ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tvar fov = 90, aspect = 1;\n\n\t\tvar cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.up.set( 0, - 1, 0 );\n\t\tcameraPX.lookAt( new Vector3( 1, 0, 0 ) );\n\t\tthis.add( cameraPX );\n\n\t\tvar cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.up.set( 0, - 1, 0 );\n\t\tcameraNX.lookAt( new Vector3( - 1, 0, 0 ) );\n\t\tthis.add( cameraNX );\n\n\t\tvar cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.up.set( 0, 0, 1 );\n\t\tcameraPY.lookAt( new Vector3( 0, 1, 0 ) );\n\t\tthis.add( cameraPY );\n\n\t\tvar cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.up.set( 0, 0, - 1 );\n\t\tcameraNY.lookAt( new Vector3( 0, - 1, 0 ) );\n\t\tthis.add( cameraNY );\n\n\t\tvar cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.up.set( 0, - 1, 0 );\n\t\tcameraPZ.lookAt( new Vector3( 0, 0, 1 ) );\n\t\tthis.add( cameraPZ );\n\n\t\tvar cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.up.set( 0, - 1, 0 );\n\t\tcameraNZ.lookAt( new Vector3( 0, 0, - 1 ) );\n\t\tthis.add( cameraNZ );\n\n\t\tvar options = { format: RGBFormat, magFilter: LinearFilter, minFilter: LinearFilter };\n\n\t\tthis.renderTarget = new WebGLRenderTargetCube( cubeResolution, cubeResolution, options );\n\t\tthis.renderTarget.texture.name = \"CubeCamera\";\n\n\t\tthis.update = function ( renderer, scene ) {\n\n\t\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\t\tvar renderTarget = this.renderTarget;\n\t\t\tvar generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\t\trenderTarget.activeCubeFace = 0;\n\t\t\trenderer.render( scene, cameraPX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 1;\n\t\t\trenderer.render( scene, cameraNX, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 2;\n\t\t\trenderer.render( scene, cameraPY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 3;\n\t\t\trenderer.render( scene, cameraNY, renderTarget );\n\n\t\t\trenderTarget.activeCubeFace = 4;\n\t\t\trenderer.render( scene, cameraPZ, renderTarget );\n\n\t\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\t\trenderTarget.activeCubeFace = 5;\n\t\t\trenderer.render( scene, cameraNZ, renderTarget );\n\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t};\n\n\t\tthis.clear = function ( renderer, color, depth, stencil ) {\n\n\t\t\tvar renderTarget = this.renderTarget;\n\n\t\t\tfor ( var i = 0; i < 6; i ++ ) {\n\n\t\t\t\trenderTarget.activeCubeFace = i;\n\t\t\t\trenderer.setRenderTarget( renderTarget );\n\n\t\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t\t}\n\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t};\n\n\t}\n\n\tCubeCamera.prototype = Object.create( Object3D.prototype );\n\tCubeCamera.prototype.constructor = CubeCamera;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioListener() {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'AudioListener';\n\n\t\tthis.context = AudioContext.getContext();\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\tthis.filter = null;\n\n\t}\n\n\tAudioListener.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: AudioListener,\n\n\t\tgetInput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tremoveFilter: function ( ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\t\tthis.gain.connect( this.context.destination );\n\t\t\t\tthis.filter = null;\n\n\t\t\t}\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.filter;\n\n\t\t},\n\n\t\tsetFilter: function ( value ) {\n\n\t\t\tif ( this.filter !== null ) {\n\n\t\t\t\tthis.gain.disconnect( this.filter );\n\t\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t\t} else {\n\n\t\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t\t}\n\n\t\t\tthis.filter = value;\n\t\t\tthis.gain.connect( this.filter );\n\t\t\tthis.filter.connect( this.context.destination );\n\n\t\t},\n\n\t\tgetMasterVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\t\tsetMasterVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\t\t\tvar quaternion = new Quaternion();\n\t\t\tvar scale = new Vector3();\n\n\t\t\tvar orientation = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tvar listener = this.context.listener;\n\t\t\t\tvar up = this.up;\n\n\t\t\t\tthis.matrixWorld.decompose( position, quaternion, scale );\n\n\t\t\t\torientation.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t\t\tif ( listener.positionX ) {\n\n\t\t\t\t\tlistener.positionX.setValueAtTime( position.x, this.context.currentTime );\n\t\t\t\t\tlistener.positionY.setValueAtTime( position.y, this.context.currentTime );\n\t\t\t\t\tlistener.positionZ.setValueAtTime( position.z, this.context.currentTime );\n\t\t\t\t\tlistener.forwardX.setValueAtTime( orientation.x, this.context.currentTime );\n\t\t\t\t\tlistener.forwardY.setValueAtTime( orientation.y, this.context.currentTime );\n\t\t\t\t\tlistener.forwardZ.setValueAtTime( orientation.z, this.context.currentTime );\n\t\t\t\t\tlistener.upX.setValueAtTime( up.x, this.context.currentTime );\n\t\t\t\t\tlistener.upY.setValueAtTime( up.y, this.context.currentTime );\n\t\t\t\t\tlistener.upZ.setValueAtTime( up.z, this.context.currentTime );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlistener.setPosition( position.x, position.y, position.z );\n\t\t\t\t\tlistener.setOrientation( orientation.x, orientation.y, orientation.z, up.x, up.y, up.z );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t} )()\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Reece Aaron Lecrivain / http://reecenotes.com/\n\t */\n\n\tfunction Audio( listener ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.type = 'Audio';\n\n\t\tthis.context = listener.context;\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\tthis.autoplay = false;\n\n\t\tthis.buffer = null;\n\t\tthis.loop = false;\n\t\tthis.startTime = 0;\n\t\tthis.playbackRate = 1;\n\t\tthis.isPlaying = false;\n\t\tthis.hasPlaybackControl = true;\n\t\tthis.sourceType = 'empty';\n\n\t\tthis.filters = [];\n\n\t}\n\n\tAudio.prototype = Object.assign( Object.create( Object3D.prototype ), {\n\n\t\tconstructor: Audio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.gain;\n\n\t\t},\n\n\t\tsetNodeSource: function ( audioNode ) {\n\n\t\t\tthis.hasPlaybackControl = false;\n\t\t\tthis.sourceType = 'audioNode';\n\t\t\tthis.source = audioNode;\n\t\t\tthis.connect();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetBuffer: function ( audioBuffer ) {\n\n\t\t\tthis.buffer = audioBuffer;\n\t\t\tthis.sourceType = 'buffer';\n\n\t\t\tif ( this.autoplay ) this.play();\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tplay: function () {\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar source = this.context.createBufferSource();\n\n\t\t\tsource.buffer = this.buffer;\n\t\t\tsource.loop = this.loop;\n\t\t\tsource.onended = this.onEnded.bind( this );\n\t\t\tsource.playbackRate.setValueAtTime( this.playbackRate, this.startTime );\n\t\t\tsource.start( 0, this.startTime );\n\n\t\t\tthis.isPlaying = true;\n\n\t\t\tthis.source = source;\n\n\t\t\treturn this.connect();\n\n\t\t},\n\n\t\tpause: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = this.context.currentTime;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.startTime = 0;\n\t\t\tthis.isPlaying = false;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tdisconnect: function () {\n\n\t\t\tif ( this.filters.length > 0 ) {\n\n\t\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\t\tfor ( var i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t\t} else {\n\n\t\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilters: function () {\n\n\t\t\treturn this.filters;\n\n\t\t},\n\n\t\tsetFilters: function ( value ) {\n\n\t\t\tif ( ! value ) value = [];\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.disconnect();\n\t\t\t\tthis.filters = value;\n\t\t\t\tthis.connect();\n\n\t\t\t} else {\n\n\t\t\t\tthis.filters = value;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetFilter: function () {\n\n\t\t\treturn this.getFilters()[ 0 ];\n\n\t\t},\n\n\t\tsetFilter: function ( filter ) {\n\n\t\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t\t},\n\n\t\tsetPlaybackRate: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.playbackRate = value;\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.source.playbackRate.setValueAtTime( this.playbackRate, this.context.currentTime );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetPlaybackRate: function () {\n\n\t\t\treturn this.playbackRate;\n\n\t\t},\n\n\t\tonEnded: function () {\n\n\t\t\tthis.isPlaying = false;\n\n\t\t},\n\n\t\tgetLoop: function () {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\treturn this.loop;\n\n\t\t},\n\n\t\tsetLoop: function ( value ) {\n\n\t\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.loop = value;\n\n\t\t\tif ( this.isPlaying === true ) {\n\n\t\t\t\tthis.source.loop = this.loop;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetVolume: function () {\n\n\t\t\treturn this.gain.gain.value;\n\n\t\t},\n\n\t\tsetVolume: function ( value ) {\n\n\t\t\tthis.gain.gain.value = value;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PositionalAudio( listener ) {\n\n\t\tAudio.call( this, listener );\n\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tPositionalAudio.prototype = Object.assign( Object.create( Audio.prototype ), {\n\n\t\tconstructor: PositionalAudio,\n\n\t\tgetOutput: function () {\n\n\t\t\treturn this.panner;\n\n\t\t},\n\n\t\tgetRefDistance: function () {\n\n\t\t\treturn this.panner.refDistance;\n\n\t\t},\n\n\t\tsetRefDistance: function ( value ) {\n\n\t\t\tthis.panner.refDistance = value;\n\n\t\t},\n\n\t\tgetRolloffFactor: function () {\n\n\t\t\treturn this.panner.rolloffFactor;\n\n\t\t},\n\n\t\tsetRolloffFactor: function ( value ) {\n\n\t\t\tthis.panner.rolloffFactor = value;\n\n\t\t},\n\n\t\tgetDistanceModel: function () {\n\n\t\t\treturn this.panner.distanceModel;\n\n\t\t},\n\n\t\tsetDistanceModel: function ( value ) {\n\n\t\t\tthis.panner.distanceModel = value;\n\n\t\t},\n\n\t\tgetMaxDistance: function () {\n\n\t\t\treturn this.panner.maxDistance;\n\n\t\t},\n\n\t\tsetMaxDistance: function ( value ) {\n\n\t\t\tthis.panner.maxDistance = value;\n\n\t\t},\n\n\t\tupdateMatrixWorld: ( function () {\n\n\t\t\tvar position = new Vector3();\n\n\t\t\treturn function updateMatrixWorld( force ) {\n\n\t\t\t\tObject3D.prototype.updateMatrixWorld.call( this, force );\n\n\t\t\t\tposition.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\t\tthis.panner.setPosition( position.x, position.y, position.z );\n\n\t\t\t};\n\n\t\t} )()\n\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AudioAnalyser( audio, fftSize ) {\n\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize !== undefined ? fftSize : 2048;\n\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\tObject.assign( AudioAnalyser.prototype, {\n\n\t\tgetFrequencyData: function () {\n\n\t\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\t\treturn this.data;\n\n\t\t},\n\n\t\tgetAverageFrequency: function () {\n\n\t\t\tvar value = 0, data = this.getFrequencyData();\n\n\t\t\tfor ( var i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tvalue += data[ i ];\n\n\t\t\t}\n\n\t\t\treturn value / data.length;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Buffered scene graph property that allows weighted accumulation.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction PropertyMixer( binding, typeName, valueSize ) {\n\n\t\tthis.binding = binding;\n\t\tthis.valueSize = valueSize;\n\n\t\tvar bufferType = Float64Array,\n\t\t\tmixFunction;\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tbufferType = Array;\n\t\t\t\tmixFunction = this._select;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\n\t\t}\n\n\t\tthis.buffer = new bufferType( valueSize * 4 );\n\t\t// layout: [ incoming | accu0 | accu1 | orig ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\n\t\tthis._mixBufferRegion = mixFunction;\n\n\t\tthis.cumulativeWeight = 0;\n\n\t\tthis.useCount = 0;\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\tObject.assign( PropertyMixer.prototype, {\n\n\t\t// accumulate data in the 'incoming' region into 'accu<i>'\n\t\taccumulate: function ( accuIndex, weight ) {\n\n\t\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t\t// the weight and shouldn't have made the call in the first place\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tcurrentWeight = this.cumulativeWeight;\n\n\t\t\tif ( currentWeight === 0 ) {\n\n\t\t\t\t// accuN := incoming * weight\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcurrentWeight = weight;\n\n\t\t\t} else {\n\n\t\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\t\tcurrentWeight += weight;\n\t\t\t\tvar mix = weight / currentWeight;\n\t\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = currentWeight;\n\n\t\t},\n\n\t\t// apply the state of 'accu<i>' to the binding when accus differ\n\t\tapply: function ( accuIndex ) {\n\n\t\t\tvar stride = this.valueSize,\n\t\t\t\tbuffer = this.buffer,\n\t\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\t\tweight = this.cumulativeWeight,\n\n\t\t\t\tbinding = this.binding;\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t\tif ( weight < 1 ) {\n\n\t\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\t\tvar originalValueOffset = stride * 3;\n\n\t\t\t\tthis._mixBufferRegion(\n\t\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t\t}\n\n\t\t\tfor ( var i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remember the state of the bound property and copy it to both accus\n\t\tsaveOriginalState: function () {\n\n\t\t\tvar binding = this.binding;\n\n\t\t\tvar buffer = this.buffer,\n\t\t\t\tstride = this.valueSize,\n\n\t\t\t\toriginalValueOffset = stride * 3;\n\n\t\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\t\tfor ( var i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t\t}\n\n\t\t\tthis.cumulativeWeight = 0;\n\n\t\t},\n\n\t\t// apply the state previously taken via 'saveOriginalState' to the binding\n\t\trestoreOriginalState: function () {\n\n\t\t\tvar originalValueOffset = this.valueSize * 3;\n\t\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t\t},\n\n\n\t\t// mix functions\n\n\t\t_select: function ( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tif ( t >= 0.5 ) {\n\n\t\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_slerp: function ( buffer, dstOffset, srcOffset, t ) {\n\n\t\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );\n\n\t\t},\n\n\t\t_lerp: function ( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\t\tvar s = 1 - t;\n\n\t\t\tfor ( var i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tvar j = dstOffset + i;\n\n\t\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * A reference to a real property in the scene graph.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction Composite( targetGroup, path, optionalParsedPath ) {\n\n\t\tvar parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t}\n\n\tObject.assign( Composite.prototype, {\n\n\t\tgetValue: function ( array, offset ) {\n\n\t\t\tthis.bind(); // bind all binding\n\n\t\t\tvar firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t\t// and only call .getValue on the first\n\t\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t\t},\n\n\t\tsetValue: function ( array, offset ) {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\t  n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t\t}\n\n\t\t},\n\n\t\tbind: function () {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\t  n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].bind();\n\n\t\t\t}\n\n\t\t},\n\n\t\tunbind: function () {\n\n\t\t\tvar bindings = this._bindings;\n\n\t\t\tfor ( var i = this._targetGroup.nCachedObjects_,\n\t\t\t\t\t  n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tbindings[ i ].unbind();\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\n\tfunction PropertyBinding( rootNode, path, parsedPath ) {\n\n\t\tthis.path = path;\n\t\tthis.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode;\n\n\t\tthis.rootNode = rootNode;\n\n\t}\n\n\tObject.assign( PropertyBinding, {\n\n\t\tComposite: Composite,\n\n\t\tcreate: function ( root, path, parsedPath ) {\n\n\t\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t\t} else {\n\n\t\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t\t}\n\n\t\t},\n\n\t\t/**\n\t\t * Replaces spaces with underscores and removes unsupported characters from\n\t\t * node names, to ensure compatibility with parseTrackName().\n\t\t *\n\t\t * @param  {string} name Node name to be sanitized.\n\t\t * @return {string}\n\t\t */\n\t\tsanitizeNodeName: function ( name ) {\n\n\t\t\treturn name.replace( /\\s/g, '_' ).replace( /[^\\w-]/g, '' );\n\n\t\t},\n\n\t\tparseTrackName: function () {\n\n\t\t\t// Parent directories, delimited by '/' or ':'. Currently unused, but must\n\t\t\t// be matched to parse the rest of the track name.\n\t\t\tvar directoryRe = /((?:[\\w-]+[\\/:])*)/;\n\n\t\t\t// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.\n\t\t\tvar nodeRe = /([\\w-\\.]+)?/;\n\n\t\t\t// Object on target node, and accessor. Name may contain only word\n\t\t\t// characters. Accessor may contain any character except closing bracket.\n\t\t\tvar objectRe = /(?:\\.([\\w-]+)(?:\\[(.+)\\])?)?/;\n\n\t\t\t// Property and accessor. May contain only word characters. Accessor may\n\t\t\t// contain any non-bracket characters.\n\t\t\tvar propertyRe = /\\.([\\w-]+)(?:\\[(.+)\\])?/;\n\n\t\t\tvar trackRe = new RegExp(''\n\t\t\t\t+ '^'\n\t\t\t\t+ directoryRe.source\n\t\t\t\t+ nodeRe.source\n\t\t\t\t+ objectRe.source\n\t\t\t\t+ propertyRe.source\n\t\t\t\t+ '$'\n\t\t\t);\n\n\t\t\tvar supportedObjectNames = [ 'material', 'materials', 'bones' ];\n\n\t\t\treturn function ( trackName ) {\n\n\t\t\t\t\tvar matches = trackRe.exec( trackName );\n\n\t\t\t\t\tif ( ! matches ) {\n\n\t\t\t\t\t\tthrow new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar results = {\n\t\t\t\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\t\t\t\tnodeName: matches[ 2 ],\n\t\t\t\t\t\tobjectName: matches[ 3 ],\n\t\t\t\t\t\tobjectIndex: matches[ 4 ],\n\t\t\t\t\t\tpropertyName: matches[ 5 ],     // required\n\t\t\t\t\t\tpropertyIndex: matches[ 6 ]\n\t\t\t\t\t};\n\n\t\t\t\t\tvar lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );\n\n\t\t\t\t\tif ( lastDot !== undefined && lastDot !== -1 ) {\n\n\t\t\t\t\t\tvar objectName = results.nodeName.substring( lastDot + 1 );\n\n\t\t\t\t\t\t// Object names must be checked against a whitelist. Otherwise, there\n\t\t\t\t\t\t// is no way to parse 'foo.bar.baz': 'baz' must be a property, but\n\t\t\t\t\t\t// 'bar' could be the objectName, or part of a nodeName (which can\n\t\t\t\t\t\t// include '.' characters).\n\t\t\t\t\t\tif ( supportedObjectNames.indexOf( objectName ) !== -1 ) {\n\n\t\t\t\t\t\t\tresults.nodeName = results.nodeName.substring( 0, lastDot );\n\t\t\t\t\t\t\tresults.objectName = objectName;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\t\t\t\tthrow new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn results;\n\n\t\t\t\t};\n\n\t\t}(),\n\n\t\tfindNode: function ( root, nodeName ) {\n\n\t\t\tif ( ! nodeName || nodeName === \"\" || nodeName === \"root\" || nodeName === \".\" || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\t\treturn root;\n\n\t\t\t}\n\n\t\t\t// search into skeleton bones.\n\t\t\tif ( root.skeleton ) {\n\n\t\t\t\tvar searchSkeleton = function ( skeleton ) {\n\n\t\t\t\t\tfor ( var i = 0; i < skeleton.bones.length; i ++ ) {\n\n\t\t\t\t\t\tvar bone = skeleton.bones[ i ];\n\n\t\t\t\t\t\tif ( bone.name === nodeName ) {\n\n\t\t\t\t\t\t\treturn bone;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t};\n\n\t\t\t\tvar bone = searchSkeleton( root.skeleton );\n\n\t\t\t\tif ( bone ) {\n\n\t\t\t\t\treturn bone;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// search into node subtree.\n\t\t\tif ( root.children ) {\n\n\t\t\t\tvar searchNodeSubtree = function ( children ) {\n\n\t\t\t\t\tfor ( var i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\t\tvar childNode = children[ i ];\n\n\t\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t};\n\n\t\t\t\tvar subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\t\tif ( subTreeNode ) {\n\n\t\t\t\t\treturn subTreeNode;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t}\n\n\t} );\n\n\tObject.assign( PropertyBinding.prototype, { // prototype, continued\n\n\t\t// these are used to \"bind\" a nonexistent property\n\t\t_getValue_unavailable: function () {},\n\t\t_setValue_unavailable: function () {},\n\n\t\tBindingType: {\n\t\t\tDirect: 0,\n\t\t\tEntireArray: 1,\n\t\t\tArrayElement: 2,\n\t\t\tHasFromToArray: 3\n\t\t},\n\n\t\tVersioning: {\n\t\t\tNone: 0,\n\t\t\tNeedsUpdate: 1,\n\t\t\tMatrixWorldNeedsUpdate: 2\n\t\t},\n\n\t\tGetterByBindingType: [\n\n\t\t\tfunction getValue_direct( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.node[ this.propertyName ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_array( buffer, offset ) {\n\n\t\t\t\tvar source = this.resolvedProperty;\n\n\t\t\t\tfor ( var i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tfunction getValue_arrayElement( buffer, offset ) {\n\n\t\t\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t\t\t},\n\n\t\t\tfunction getValue_toArray( buffer, offset ) {\n\n\t\t\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t\t\t}\n\n\t\t],\n\n\t\tSetterByBindingTypeAndVersioning: [\n\n\t\t\t[\n\t\t\t\t// Direct\n\n\t\t\t\tfunction setValue_direct( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.node[ this.propertyName ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// EntireArray\n\n\t\t\t\tfunction setValue_array( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tvar dest = this.resolvedProperty;\n\n\t\t\t\t\tfor ( var i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\t\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// ArrayElement\n\n\t\t\t\tfunction setValue_arrayElement( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t], [\n\n\t\t\t\t// HasToFromArray\n\n\t\t\t\tfunction setValue_fromArray( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.needsUpdate = true;\n\n\t\t\t\t},\n\n\t\t\t\tfunction setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\t\t\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\t\t\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t]\n\n\t\t],\n\n\t\tgetValue: function getValue_unbound( targetArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.getValue( targetArray, offset );\n\n\t\t\t// Note: This class uses a State pattern on a per-method basis:\n\t\t\t// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n\t\t\t// prototype version of these methods with one that represents\n\t\t\t// the bound state. When the property is not found, the methods\n\t\t\t// become no-ops.\n\n\t\t},\n\n\t\tsetValue: function getValue_unbound( sourceArray, offset ) {\n\n\t\t\tthis.bind();\n\t\t\tthis.setValue( sourceArray, offset );\n\n\t\t},\n\n\t\t// create getter / setter pair for a property in the scene graph\n\t\tbind: function () {\n\n\t\t\tvar targetObject = this.node,\n\t\t\t\tparsedPath = this.parsedPath,\n\n\t\t\t\tobjectName = parsedPath.objectName,\n\t\t\t\tpropertyName = parsedPath.propertyName,\n\t\t\t\tpropertyIndex = parsedPath.propertyIndex;\n\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\ttargetObject = PropertyBinding.findNode(\n\t\t\t\t\t\tthis.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\t\tthis.node = targetObject;\n\n\t\t\t}\n\n\t\t\t// set fail state so we can just 'return' on error\n\t\t\tthis.getValue = this._getValue_unavailable;\n\t\t\tthis.setValue = this._setValue_unavailable;\n\n\t\t\t// ensure there is a value node\n\t\t\tif ( ! targetObject ) {\n\n\t\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\\'t found.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( objectName ) {\n\n\t\t\t\tvar objectIndex = parsedPath.objectIndex;\n\n\t\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\t\tswitch ( objectName ) {\n\n\t\t\t\t\tcase 'materials':\n\n\t\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'bones':\n\n\t\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\t\tfor ( var i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// resolve property\n\t\t\tvar nodeProperty = targetObject[ propertyName ];\n\n\t\t\tif ( nodeProperty === undefined ) {\n\n\t\t\t\tvar nodeName = parsedPath.nodeName;\n\n\t\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName +\n\t\t\t\t\t'.' + propertyName + ' but it wasn\\'t found.', targetObject );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// determine versioning scheme\n\t\t\tvar versioning = this.Versioning.None;\n\n\t\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\t\tversioning = this.Versioning.NeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\t\t\t\tthis.targetObject = targetObject;\n\n\t\t\t}\n\n\t\t\t// determine how the property gets bound\n\t\t\tvar bindingType = this.BindingType.Direct;\n\n\t\t\tif ( propertyIndex !== undefined ) {\n\n\t\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\t\tif ( propertyName === \"morphTargetInfluences\" ) {\n\n\t\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( targetObject.geometry.isBufferGeometry ) {\n\n\t\t\t\t\t\tif ( ! targetObject.geometry.morphAttributes ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( var i = 0; i < this.node.geometry.morphAttributes.position.length; i ++ ) {\n\n\t\t\t\t\t\t\tif ( targetObject.geometry.morphAttributes.position[ i ].name === propertyIndex ) {\n\n\t\t\t\t\t\t\t\tpropertyIndex = i;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ! targetObject.geometry.morphTargets ) {\n\n\t\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.', this );\n\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( var i = 0; i < this.node.geometry.morphTargets.length; i ++ ) {\n\n\t\t\t\t\t\t\tif ( targetObject.geometry.morphTargets[ i ].name === propertyIndex ) {\n\n\t\t\t\t\t\t\t\tpropertyIndex = i;\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\n\t\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else if ( Array.isArray( nodeProperty ) ) {\n\n\t\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t\t} else {\n\n\t\t\t\tthis.propertyName = propertyName;\n\n\t\t\t}\n\n\t\t\t// select getter / setter\n\t\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t\t},\n\n\t\tunbind: function () {\n\n\t\t\tthis.node = null;\n\n\t\t\t// back to the prototype version of getValue / setValue\n\t\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\t\tthis.getValue = this._getValue_unbound;\n\t\t\tthis.setValue = this._setValue_unbound;\n\n\t\t}\n\n\t} );\n\n\t//!\\ DECLARE ALIAS AFTER assign prototype !\n\tObject.assign( PropertyBinding.prototype, {\n\n\t\t// initial state of these methods that calls 'bind'\n\t\t_getValue_unbound: PropertyBinding.prototype.getValue,\n\t\t_setValue_unbound: PropertyBinding.prototype.setValue,\n\n\t} );\n\n\t/**\n\t *\n\t * A group of objects that receives a shared animation state.\n\t *\n\t * Usage:\n\t *\n\t * \t-\tAdd objects you would otherwise pass as 'root' to the\n\t * \t\tconstructor or the .clipAction method of AnimationMixer.\n\t *\n\t * \t-\tInstead pass this object as 'root'.\n\t *\n\t * \t-\tYou can also add and remove objects later when the mixer\n\t * \t\tis running.\n\t *\n\t * Note:\n\t *\n\t *  \tObjects of this class appear as one object to the mixer,\n\t *  \tso cache control of the individual objects must be done\n\t *  \ton the group.\n\t *\n\t * Limitation:\n\t *\n\t * \t- \tThe animated properties must be compatible among the\n\t * \t\tall objects in the group.\n\t *\n\t *  -\tA single property can either be controlled through a\n\t *  \ttarget group or directly, but not both.\n\t *\n\t * @author tschw\n\t */\n\n\tfunction AnimationObjectGroup( var_args ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0;\t\t\t// threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tvar indices = {};\n\t\tthis._indicesByUUID = indices;\t\t// for bookkeeping\n\n\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = [];\t\t\t\t\t// inside: string\n\t\tthis._parsedPaths = [];\t\t\t\t// inside: { we don't care, here }\n\t\tthis._bindings = []; \t\t\t\t// inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; \t// inside: indices in these arrays\n\n\t\tvar scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() { return scope._objects.length; },\n\t\t\t\tget inUse() { return this.total - scope.nCachedObjects_; }\n\t\t\t},\n\n\t\t\tget bindingsPerObject() { return scope._bindings.length; }\n\n\t\t};\n\n\t}\n\n\tObject.assign( AnimationObjectGroup.prototype, {\n\n\t\tisAnimationObjectGroup: true,\n\n\t\tadd: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tpaths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ],\n\t\t\t\t\tknownObject = undefined;\n\n\t\t\t\tif ( index === undefined ) {\n\n\t\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\t\tindex = nObjects ++;\n\t\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\t\tobjects.push( object );\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tbindings[ j ].push(\n\t\t\t\t\t\t\t\tnew PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\t\tbinding = new PropertyBinding(\n\t\t\t\t\t\t\t\t\tobject, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( objects[ index ] !== knownObject ) {\n\n\t\t\t\t\tconsole.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' +\n\t\t\t\t\t\t\t'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );\n\n\t\t\t\t} // else the object is already where we want it to be\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\tremove: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\t\tvar lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// remove & forget\n\t\tuncache: function( var_args ) {\n\n\t\t\tvar objects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = bindings.length;\n\n\t\t\tfor ( var i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = arguments[ i ],\n\t\t\t\t\tuuid = object.uuid,\n\t\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index !== undefined ) {\n\n\t\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\t\tvar firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\t\tvar lastIndex = -- nObjects,\n\t\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\t\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\t\tfor ( var j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\t\tvar bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} // cached or active\n\n\t\t\t\t} // if object is known\n\n\t\t\t} // for arguments\n\n\t\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t\t},\n\n\t\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\t\tsubscribe_: function ( path, parsedPath ) {\n\n\t\t\t// returns an array of bindings for the given path that is changed\n\t\t\t// according to the contained objects in the group\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ],\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\t\tvar paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tobjects = this._objects,\n\t\t\t\tnObjects = objects.length,\n\t\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\t\tindex = bindings.length;\n\n\t\t\tindicesByPath[ path ] = index;\n\n\t\t\tpaths.push( path );\n\t\t\tparsedPaths.push( parsedPath );\n\t\t\tbindings.push( bindingsForPath );\n\n\t\t\tfor ( var i = nCachedObjects, n = objects.length; i !== n; ++ i ) {\n\n\t\t\t\tvar object = objects[ i ];\n\t\t\t\tbindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );\n\n\t\t\t}\n\n\t\t\treturn bindingsForPath;\n\n\t\t},\n\n\t\tunsubscribe_: function ( path ) {\n\n\t\t\t// tells the group to forget about a property path and no longer\n\t\t\t// update the array previously obtained with 'subscribe_'\n\n\t\t\tvar indicesByPath = this._bindingsIndicesByPath,\n\t\t\t\tindex = indicesByPath[ path ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tvar paths = this._paths,\n\t\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\t\tbindings = this._bindings,\n\t\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\t\tbindings[ index ] = lastBindings;\n\t\t\t\tbindings.pop();\n\n\t\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\t\tparsedPaths.pop();\n\n\t\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\t\tpaths.pop();\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Action provided by AnimationMixer for scheduling clip playback on specific\n\t * objects.\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t *\n\t */\n\n\tfunction AnimationAction( mixer, clip, localRoot ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot || null;\n\n\t\tvar tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tvar interpolantSettings = {\n\t\t\t\tendingStart: \tZeroCurvatureEnding,\n\t\t\t\tendingEnd:\t\tZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tvar interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants;\t// bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null;\t\t\t// for the memory manager\n\t\tthis._byClipCacheIndex = null;\t\t// for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = -1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t// scaled local time of the action\n\t\t// gets clamped or wrapped to 0..clip.duration according to loop\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\tthis.repetitions = Infinity; \t\t// no. of repetitions when looping\n\n\t\tthis.paused = false;\t\t\t\t// true -> zero effective time scale\n\t\tthis.enabled = true;\t\t\t\t// false -> zero effective weight\n\n\t\tthis.clampWhenFinished \t= false;\t// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart \t= true;\t\t// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd\t\t= true;\t\t// clips for start, loop and end\n\n\t}\n\n\tObject.assign( AnimationAction.prototype, {\n\n\t\t// State & Scheduling\n\n\t\tplay: function() {\n\n\t\t\tthis._mixer._activateAction( this );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstop: function() {\n\n\t\t\tthis._mixer._deactivateAction( this );\n\n\t\t\treturn this.reset();\n\n\t\t},\n\n\t\treset: function() {\n\n\t\t\tthis.paused = false;\n\t\t\tthis.enabled = true;\n\n\t\t\tthis.time = 0;\t\t\t// restart clip\n\t\t\tthis._loopCount = -1;\t// forget previous loops\n\t\t\tthis._startTime = null;\t// forget scheduling\n\n\t\t\treturn this.stopFading().stopWarping();\n\n\t\t},\n\n\t\tisRunning: function() {\n\n\t\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\t// return true when play has been called\n\t\tisScheduled: function() {\n\n\t\t\treturn this._mixer._isActiveAction( this );\n\n\t\t},\n\n\t\tstartAt: function( time ) {\n\n\t\t\tthis._startTime = time;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetLoop: function( mode, repetitions ) {\n\n\t\t\tthis.loop = mode;\n\t\t\tthis.repetitions = repetitions;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Weight\n\n\t\t// set the weight stopping any scheduled fading\n\t\t// although .enabled = false yields an effective weight of zero, this\n\t\t// method does *not* change .enabled, because it would be confusing\n\t\tsetEffectiveWeight: function( weight ) {\n\n\t\t\tthis.weight = weight;\n\n\t\t\t// note: same logic as when updated at runtime\n\t\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\t\treturn this.stopFading();\n\n\t\t},\n\n\t\t// return the weight considering fading and .enabled\n\t\tgetEffectiveWeight: function() {\n\n\t\t\treturn this._effectiveWeight;\n\n\t\t},\n\n\t\tfadeIn: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t\t},\n\n\t\tfadeOut: function( duration ) {\n\n\t\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t\t},\n\n\t\tcrossFadeFrom: function( fadeOutAction, duration, warp ) {\n\n\t\t\tfadeOutAction.fadeOut( duration );\n\t\t\tthis.fadeIn( duration );\n\n\t\t\tif( warp ) {\n\n\t\t\t\tvar fadeInDuration = this._clip.duration,\n\t\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcrossFadeTo: function( fadeInAction, duration, warp ) {\n\n\t\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t\t},\n\n\t\tstopFading: function() {\n\n\t\t\tvar weightInterpolant = this._weightInterpolant;\n\n\t\t\tif ( weightInterpolant !== null ) {\n\n\t\t\t\tthis._weightInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Time Scale Control\n\n\t\t// set the time scale stopping any scheduled warping\n\t\t// although .paused = true yields an effective time scale of zero, this\n\t\t// method does *not* change .paused, because it would be confusing\n\t\tsetEffectiveTimeScale: function( timeScale ) {\n\n\t\t\tthis.timeScale = timeScale;\n\t\t\tthis._effectiveTimeScale = this.paused ? 0 :timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\t// return the time scale considering warping and .paused\n\t\tgetEffectiveTimeScale: function() {\n\n\t\t\treturn this._effectiveTimeScale;\n\n\t\t},\n\n\t\tsetDuration: function( duration ) {\n\n\t\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\tsyncWith: function( action ) {\n\n\t\t\tthis.time = action.time;\n\t\t\tthis.timeScale = action.timeScale;\n\n\t\t\treturn this.stopWarping();\n\n\t\t},\n\n\t\thalt: function( duration ) {\n\n\t\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t\t},\n\n\t\twarp: function( startTimeScale, endTimeScale, duration ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._timeScaleInterpolant,\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now;\n\t\t\ttimes[ 1 ] = now + duration;\n\n\t\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tstopWarping: function() {\n\n\t\t\tvar timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\t\tthis._timeScaleInterpolant = null;\n\t\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// Object Accessors\n\n\t\tgetMixer: function() {\n\n\t\t\treturn this._mixer;\n\n\t\t},\n\n\t\tgetClip: function() {\n\n\t\t\treturn this._clip;\n\n\t\t},\n\n\t\tgetRoot: function() {\n\n\t\t\treturn this._localRoot || this._mixer._root;\n\n\t\t},\n\n\t\t// Interna\n\n\t\t_update: function( time, deltaTime, timeDirection, accuIndex ) {\n\n\t\t\t// called by the mixer\n\n\t\t\tif ( ! this.enabled ) {\n\n\t\t\t\t// call ._updateWeight() to update ._effectiveWeight\n\n\t\t\t\tthis._updateWeight( time );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tvar startTime = this._startTime;\n\n\t\t\tif ( startTime !== null ) {\n\n\t\t\t\t// check for scheduled start of action\n\n\t\t\t\tvar timeRunning = ( time - startTime ) * timeDirection;\n\t\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\t\treturn; // yet to come / don't decide when delta = 0\n\n\t\t\t\t}\n\n\t\t\t\t// start\n\n\t\t\t\tthis._startTime = null; // unschedule\n\t\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t\t}\n\n\t\t\t// apply time scale and advance time\n\n\t\t\tdeltaTime *= this._updateTimeScale( time );\n\t\t\tvar clipTime = this._updateTime( deltaTime );\n\n\t\t\t// note: _updateTime may disable the action resulting in\n\t\t\t// an effective weight of 0\n\n\t\t\tvar weight = this._updateWeight( time );\n\n\t\t\tif ( weight > 0 ) {\n\n\t\t\t\tvar interpolants = this._interpolants;\n\t\t\t\tvar propertyMixers = this._propertyBindings;\n\n\t\t\t\tfor ( var j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_updateWeight: function( time ) {\n\n\t\t\tvar weight = 0;\n\n\t\t\tif ( this.enabled ) {\n\n\t\t\t\tweight = this.weight;\n\t\t\t\tvar interpolant = this._weightInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._effectiveWeight = weight;\n\t\t\treturn weight;\n\n\t\t},\n\n\t\t_updateTimeScale: function( time ) {\n\n\t\t\tvar timeScale = 0;\n\n\t\t\tif ( ! this.paused ) {\n\n\t\t\t\ttimeScale = this.timeScale;\n\n\t\t\t\tvar interpolant = this._timeScaleInterpolant;\n\n\t\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\t\tvar interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._effectiveTimeScale = timeScale;\n\t\t\treturn timeScale;\n\n\t\t},\n\n\t\t_updateTime: function( deltaTime ) {\n\n\t\t\tvar time = this.time + deltaTime;\n\n\t\t\tif ( deltaTime === 0 ) return time;\n\n\t\t\tvar duration = this._clip.duration,\n\n\t\t\t\tloop = this.loop,\n\t\t\t\tloopCount = this._loopCount;\n\n\t\t\tif ( loop === LoopOnce ) {\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tthis._loopCount = 0;\n\t\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t\t}\n\n\t\t\t\thandle_stop: {\n\n\t\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\t\ttime = duration;\n\n\t\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\t\ttime = 0;\n\n\t\t\t\t\t} else break handle_stop;\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime < 0 ? -1 : 1\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\t\tvar pingPong = ( loop === LoopPingPong );\n\n\t\t\t\tif ( loopCount === -1 ) {\n\t\t\t\t\t// just started\n\n\t\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\ttrue, this.repetitions === 0, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\t\tthis._setEndings(\n\t\t\t\t\t\t\t\tthis.repetitions === 0, true, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( time >= duration || time < 0 ) {\n\t\t\t\t\t// wrap around\n\n\t\t\t\t\tvar loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\t\tvar pending = this.repetitions - loopCount;\n\n\t\t\t\t\tif ( pending < 0 ) {\n\t\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// keep running\n\n\t\t\t\t\t\tif ( pending === 0 ) {\n\t\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\t\tvar atStart = deltaTime < 0;\n\t\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\t\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\t\tthis.time = time;\n\t\t\t\t\treturn duration - time;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.time = time;\n\t\t\treturn time;\n\n\t\t},\n\n\t\t_setEndings: function( atStart, atEnd, pingPong ) {\n\n\t\t\tvar settings = this._interpolantSettings;\n\n\t\t\tif ( pingPong ) {\n\n\t\t\t\tsettings.endingStart \t= ZeroSlopeEnding;\n\t\t\t\tsettings.endingEnd\t\t= ZeroSlopeEnding;\n\n\t\t\t} else {\n\n\t\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\t\tif ( atStart ) {\n\n\t\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t\tif ( atEnd ) {\n\n\t\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ?\n\t\t\t\t\t\t\tZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_scheduleFading: function( duration, weightNow, weightThen ) {\n\n\t\t\tvar mixer = this._mixer, now = mixer.time,\n\t\t\t\tinterpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant === null ) {\n\n\t\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t\t}\n\n\t\t\tvar times = interpolant.parameterPositions,\n\t\t\t\tvalues = interpolant.sampleValues;\n\n\t\t\ttimes[ 0 ] = now; \t\t\t\tvalues[ 0 ] = weightNow;\n\t\t\ttimes[ 1 ] = now + duration;\tvalues[ 1 ] = weightThen;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t *\n\t * Player for AnimationClips.\n\t *\n\t *\n\t * @author Ben Houston / http://clara.io/\n\t * @author David Sarno / http://lighthaus.us/\n\t * @author tschw\n\t */\n\n\tfunction AnimationMixer( root ) {\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\tObject.assign( AnimationMixer.prototype, EventDispatcher.prototype, {\n\n\t\t_bindAction: function ( action, prototypeAction ) {\n\n\t\t\tvar root = action._localRoot || this._root,\n\t\t\t\ttracks = action._clip.tracks,\n\t\t\t\tnTracks = tracks.length,\n\t\t\t\tbindings = action._propertyBindings,\n\t\t\t\tinterpolants = action._interpolants,\n\t\t\t\trootUuid = root.uuid,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingsByName === undefined ) {\n\n\t\t\t\tbindingsByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nTracks; ++ i ) {\n\n\t\t\t\tvar track = tracks[ i ],\n\t\t\t\t\ttrackName = track.name,\n\t\t\t\t\tbinding = bindingsByName[ trackName ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvar path = prototypeAction && prototypeAction.\n\t\t\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t\t}\n\n\t\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t\t}\n\n\t\t},\n\n\t\t_activateAction: function ( action ) {\n\n\t\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\t\tvar rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\t\tthis._bindAction( action,\n\t\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t\t}\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// increment reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._lendAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t_deactivateAction: function ( action ) {\n\n\t\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\t\tvar bindings = action._propertyBindings;\n\n\t\t\t\t// decrement reference counts / sort out state\n\t\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis._takeBackAction( action );\n\n\t\t\t}\n\n\t\t},\n\n\t\t// Memory manager\n\n\t\t_initMemoryManager: function () {\n\n\t\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\t\tthis._nActiveActions = 0;\n\n\t\t\tthis._actionsByClip = {};\n\t\t\t// inside:\n\t\t\t// {\n\t\t\t// \t\tknownActions: Array< AnimationAction >\t- used as prototypes\n\t\t\t// \t\tactionByRoot: AnimationAction\t\t\t- lookup\n\t\t\t// }\n\n\n\t\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\t\tthis._controlInterpolants = []; // same game as above\n\t\t\tthis._nActiveControlInterpolants = 0;\n\n\t\t\tvar scope = this;\n\n\t\t\tthis.stats = {\n\n\t\t\t\tactions: {\n\t\t\t\t\tget total() { return scope._actions.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveActions; }\n\t\t\t\t},\n\t\t\t\tbindings: {\n\t\t\t\t\tget total() { return scope._bindings.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveBindings; }\n\t\t\t\t},\n\t\t\t\tcontrolInterpolants: {\n\t\t\t\t\tget total() { return scope._controlInterpolants.length; },\n\t\t\t\t\tget inUse() { return scope._nActiveControlInterpolants; }\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t},\n\n\t\t// Memory management for AnimationAction objects\n\n\t\t_isActiveAction: function ( action ) {\n\n\t\t\tvar index = action._cacheIndex;\n\t\t\treturn index !== null && index < this._nActiveActions;\n\n\t\t},\n\n\t\t_addInactiveAction: function ( action, clipUuid, rootUuid ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip === undefined ) {\n\n\t\t\t\tactionsForClip = {\n\n\t\t\t\t\tknownActions: [ action ],\n\t\t\t\t\tactionByRoot: {}\n\n\t\t\t\t};\n\n\t\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t\t} else {\n\n\t\t\t\tvar knownActions = actionsForClip.knownActions;\n\n\t\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\t\tknownActions.push( action );\n\n\t\t\t}\n\n\t\t\taction._cacheIndex = actions.length;\n\t\t\tactions.push( action );\n\n\t\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t\t},\n\n\t\t_removeInactiveAction: function ( action ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\t\tcacheIndex = action._cacheIndex;\n\n\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\tactions.pop();\n\n\t\t\taction._cacheIndex = null;\n\n\n\t\t\tvar clipUuid = action._clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\t\tlastKnownAction =\n\t\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\t\tknownActionsForClip.pop();\n\n\t\t\taction._byClipCacheIndex = null;\n\n\n\t\t\tvar actionByRoot = actionsForClip.actionByRoot,\n\t\t\t\trootUuid = ( action._localRoot || this._root ).uuid;\n\n\t\t\tdelete actionByRoot[ rootUuid ];\n\n\t\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t},\n\n\t\t_removeInactiveBindingsForAction: function ( action ) {\n\n\t\t\tvar bindings = action._propertyBindings;\n\t\t\tfor ( var i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tvar binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendAction: function ( action ) {\n\n\t\t\t// [ active actions |  inactive actions  ]\n\t\t\t// [  active actions >| inactive actions ]\n\t\t\t//                 s        a\n\t\t\t//                  <-swap->\n\t\t\t//                 a        s\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\t\taction._cacheIndex = lastActiveIndex;\n\t\t\tactions[ lastActiveIndex ] = action;\n\n\t\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t\t},\n\n\t\t_takeBackAction: function ( action ) {\n\n\t\t\t// [  active actions  | inactive actions ]\n\t\t\t// [ active actions |< inactive actions  ]\n\t\t\t//        a        s\n\t\t\t//         <-swap->\n\t\t\t//        s        a\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\t\taction._cacheIndex = firstInactiveIndex;\n\t\t\tactions[ firstInactiveIndex ] = action;\n\n\t\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t\t},\n\n\t\t// Memory management for PropertyMixer objects\n\n\t\t_addInactiveBinding: function ( binding, rootUuid, trackName ) {\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tbindings = this._bindings;\n\n\t\t\tif ( bindingByName === undefined ) {\n\n\t\t\t\tbindingByName = {};\n\t\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t\t}\n\n\t\t\tbindingByName[ trackName ] = binding;\n\n\t\t\tbinding._cacheIndex = bindings.length;\n\t\t\tbindings.push( binding );\n\n\t\t},\n\n\t\t_removeInactiveBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tpropBinding = binding.binding,\n\t\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\t\ttrackName = propBinding.path,\n\t\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\t\tbindings.pop();\n\n\t\t\tdelete bindingByName[ trackName ];\n\n\t\t\tremove_empty_map: {\n\n\t\t\t\tfor ( var _ in bindingByName ) break remove_empty_map;\n\n\t\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t_lendBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\t\tbinding._cacheIndex = lastActiveIndex;\n\t\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t\t},\n\n\t\t_takeBackBinding: function ( binding ) {\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t\t},\n\n\n\t\t// Memory management of Interpolants for weight and time scale\n\n\t\t_lendControlInterpolant: function () {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++,\n\t\t\t\tinterpolant = interpolants[ lastActiveIndex ];\n\n\t\t\tif ( interpolant === undefined ) {\n\n\t\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t\t1, this._controlInterpolantsResultBuffer );\n\n\t\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t\t}\n\n\t\t\treturn interpolant;\n\n\t\t},\n\n\t\t_takeBackControlInterpolant: function ( interpolant ) {\n\n\t\t\tvar interpolants = this._controlInterpolants,\n\t\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t\t},\n\n\t\t_controlInterpolantsResultBuffer: new Float32Array( 1 ),\n\n\t\t// return an action for a clip optionally using a custom root target\n\t\t// object (this method allocates a lot of dynamic memory in case a\n\t\t// previously unknown clip/root combination is specified)\n\t\tclipAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject !== null ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ],\n\t\t\t\tprototypeAction = null;\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\tvar existingAction =\n\t\t\t\t\t\tactionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( existingAction !== undefined ) {\n\n\t\t\t\t\treturn existingAction;\n\n\t\t\t\t}\n\n\t\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t\t// the bindings again but can just copy\n\t\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t\t// also, take the clip from the prototype action\n\t\t\t\tif ( clipObject === null )\n\t\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t\t}\n\n\t\t\t// clip must be known when specified via string\n\t\t\tif ( clipObject === null ) return null;\n\n\t\t\t// allocate all resources required to run it\n\t\t\tvar newAction = new AnimationAction( this, clipObject, optionalRoot );\n\n\t\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t\t// and make the action known to the memory manager\n\t\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\t\treturn newAction;\n\n\t\t},\n\n\t\t// get an existing action\n\t\texistingAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar root = optionalRoot || this._root,\n\t\t\t\trootUuid = root.uuid,\n\n\t\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t},\n\n\t\t// deactivates all previously scheduled actions\n\t\tstopAllAction: function () {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tthis._nActiveActions = 0;\n\t\t\tthis._nActiveBindings = 0;\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tactions[ i ].reset();\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].useCount = 0;\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// advance the time and update apply the animation\n\t\tupdate: function ( deltaTime ) {\n\n\t\t\tdeltaTime *= this.timeScale;\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tnActions = this._nActiveActions,\n\n\t\t\t\ttime = this.time += deltaTime,\n\t\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t\t// run active actions\n\n\t\t\tfor ( var i = 0; i !== nActions; ++ i ) {\n\n\t\t\t\tvar action = actions[ i ];\n\n\t\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t\t}\n\n\t\t\t// update scene graph\n\n\t\t\tvar bindings = this._bindings,\n\t\t\t\tnBindings = this._nActiveBindings;\n\n\t\t\tfor ( var i = 0; i !== nBindings; ++ i ) {\n\n\t\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// return this mixer's root target object\n\t\tgetRoot: function () {\n\n\t\t\treturn this._root;\n\n\t\t},\n\n\t\t// free all resources specific to a particular clip\n\t\tuncacheClip: function ( clip ) {\n\n\t\t\tvar actions = this._actions,\n\t\t\t\tclipUuid = clip.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip,\n\t\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t\t// iteration state and also require updating the state we can\n\t\t\t\t// just throw away\n\n\t\t\t\tvar actionsToRemove = actionsForClip.knownActions;\n\n\t\t\t\tfor ( var i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\t\tvar action = actionsToRemove[ i ];\n\n\t\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\t\tvar cacheIndex = action._cacheIndex,\n\t\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\t\taction._cacheIndex = null;\n\t\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\t\tactions.pop();\n\n\t\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t\t}\n\n\t\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t\t}\n\n\t\t},\n\n\t\t// free all resources specific to a particular root target object\n\t\tuncacheRoot: function ( root ) {\n\n\t\t\tvar rootUuid = root.uuid,\n\t\t\t\tactionsByClip = this._actionsByClip;\n\n\t\t\tfor ( var clipUuid in actionsByClip ) {\n\n\t\t\t\tvar actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\t\tif ( action !== undefined ) {\n\n\t\t\t\t\tthis._deactivateAction( action );\n\t\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tvar bindingsByRoot = this._bindingsByRootAndName,\n\t\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\t\tif ( bindingByName !== undefined ) {\n\n\t\t\t\tfor ( var trackName in bindingByName ) {\n\n\t\t\t\t\tvar binding = bindingByName[ trackName ];\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t},\n\n\t\t// remove a targeted clip from the cache\n\t\tuncacheAction: function ( clip, optionalRoot ) {\n\n\t\t\tvar action = this.existingAction( clip, optionalRoot );\n\n\t\t\tif ( action !== null ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Uniform( value ) {\n\n\t\tif ( typeof value === 'string' ) {\n\n\t\t\tconsole.warn( 'THREE.Uniform: Type parameter is no longer needed.' );\n\t\t\tvalue = arguments[ 1 ];\n\n\t\t}\n\n\t\tthis.value = value;\n\n\t}\n\n\tUniform.prototype.clone = function () {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t};\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferGeometry() {\n\n\t\tBufferGeometry.call( this );\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\t\tthis.maxInstancedCount = undefined;\n\n\t}\n\n\tInstancedBufferGeometry.prototype = Object.assign( Object.create( BufferGeometry.prototype ), {\n\n\t\tconstructor: InstancedBufferGeometry,\n\n\t\tisInstancedBufferGeometry: true,\n\n\t\taddGroup: function ( start, count, materialIndex ) {\n\n\t\t\tthis.groups.push( {\n\n\t\t\t\tstart: start,\n\t\t\t\tcount: count,\n\t\t\t\tmaterialIndex: materialIndex\n\n\t\t\t} );\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tvar index = source.index;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tthis.setIndex( index.clone() );\n\n\t\t\t}\n\n\t\t\tvar attributes = source.attributes;\n\n\t\t\tfor ( var name in attributes ) {\n\n\t\t\t\tvar attribute = attributes[ name ];\n\t\t\t\tthis.addAttribute( name, attribute.clone() );\n\n\t\t\t}\n\n\t\t\tvar groups = source.groups;\n\n\t\t\tfor ( var i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\tvar group = groups[ i ];\n\t\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, normalized ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.data = interleavedBuffer;\n\t\tthis.itemSize = itemSize;\n\t\tthis.offset = offset;\n\n\t\tthis.normalized = normalized === true;\n\n\t}\n\n\tObject.defineProperties( InterleavedBufferAttribute.prototype, {\n\n\t\tcount: {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.data.count;\n\n\t\t\t}\n\n\t\t},\n\n\t\tarray: {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.data.array;\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\tObject.assign( InterleavedBufferAttribute.prototype, {\n\n\t\tisInterleavedBufferAttribute: true,\n\n\t\tsetX: function ( index, x ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetY: function ( index, y ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetZ: function ( index, z ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetW: function ( index, w ) {\n\n\t\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tgetX: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset ];\n\n\t\t},\n\n\t\tgetY: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\t},\n\n\t\tgetZ: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\t},\n\n\t\tgetW: function ( index ) {\n\n\t\t\treturn this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\t},\n\n\t\tsetXY: function ( index, x, y ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZ: function ( index, x, y, z ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetXYZW: function ( index, x, y, z, w ) {\n\n\t\t\tindex = index * this.data.stride + this.offset;\n\n\t\t\tthis.data.array[ index + 0 ] = x;\n\t\t\tthis.data.array[ index + 1 ] = y;\n\t\t\tthis.data.array[ index + 2 ] = z;\n\t\t\tthis.data.array[ index + 3 ] = w;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InterleavedBuffer( array, stride ) {\n\n\t\tthis.uuid = _Math.generateUUID();\n\n\t\tthis.array = array;\n\t\tthis.stride = stride;\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\tthis.dynamic = false;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.onUploadCallback = function () {};\n\n\t\tthis.version = 0;\n\n\t}\n\n\tObject.defineProperty( InterleavedBuffer.prototype, 'needsUpdate', {\n\n\t\tset: function ( value ) {\n\n\t\t\tif ( value === true ) this.version ++;\n\n\t\t}\n\n\t} );\n\n\tObject.assign( InterleavedBuffer.prototype, {\n\n\t\tisInterleavedBuffer: true,\n\n\t\tsetArray: function ( array ) {\n\n\t\t\tif ( Array.isArray( array ) ) {\n\n\t\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t\t}\n\n\t\t\tthis.count = array !== undefined ? array.length / this.stride : 0;\n\t\t\tthis.array = array;\n\n\t\t},\n\n\t\tsetDynamic: function ( value ) {\n\n\t\t\tthis.dynamic = value;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopy: function ( source ) {\n\n\t\t\tthis.array = new source.array.constructor( source.array );\n\t\t\tthis.count = source.count;\n\t\t\tthis.stride = source.stride;\n\t\t\tthis.dynamic = source.dynamic;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tcopyAt: function ( index1, attribute, index2 ) {\n\n\t\t\tindex1 *= this.stride;\n\t\t\tindex2 *= attribute.stride;\n\n\t\t\tfor ( var i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tset: function ( value, offset ) {\n\n\t\t\tif ( offset === undefined ) offset = 0;\n\n\t\t\tthis.array.set( value, offset );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tonUpload: function ( callback ) {\n\n\t\t\tthis.onUploadCallback = callback;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedInterleavedBuffer( array, stride, meshPerAttribute ) {\n\n\t\tInterleavedBuffer.call( this, array, stride );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedInterleavedBuffer.prototype = Object.assign( Object.create( InterleavedBuffer.prototype ), {\n\n\t\tconstructor: InstancedInterleavedBuffer,\n\n\t\tisInstancedInterleavedBuffer: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tInterleavedBuffer.prototype.copy.call( this, source );\n\n\t\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author benaadams / https://twitter.com/ben_a_adams\n\t */\n\n\tfunction InstancedBufferAttribute( array, itemSize, meshPerAttribute ) {\n\n\t\tBufferAttribute.call( this, array, itemSize );\n\n\t\tthis.meshPerAttribute = meshPerAttribute || 1;\n\n\t}\n\n\tInstancedBufferAttribute.prototype = Object.assign( Object.create( BufferAttribute.prototype ), {\n\n\t\tconstructor: InstancedBufferAttribute,\n\n\t\tisInstancedBufferAttribute: true,\n\n\t\tcopy: function ( source ) {\n\n\t\t\tBufferAttribute.prototype.copy.call( this, source );\n\n\t\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author bhouston / http://clara.io/\n\t * @author stephomi / http://stephaneginier.com/\n\t */\n\n\tfunction Raycaster( origin, direction, near, far ) {\n\n\t\tthis.ray = new Ray( origin, direction );\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.near = near || 0;\n\t\tthis.far = far || Infinity;\n\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: {},\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t\tObject.defineProperties( this.params, {\n\t\t\tPointCloud: {\n\t\t\t\tget: function () {\n\t\t\t\t\tconsole.warn( 'THREE.Raycaster: params.PointCloud has been renamed to params.Points.' );\n\t\t\t\t\treturn this.Points;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\n\t}\n\n\tfunction ascSort( a, b ) {\n\n\t\treturn a.distance - b.distance;\n\n\t}\n\n\tfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tobject.raycast( raycaster, intersects );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tvar children = object.children;\n\n\t\t\tfor ( var i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tObject.assign( Raycaster.prototype, {\n\n\t\tlinePrecision: 1,\n\n\t\tset: function ( origin, direction ) {\n\n\t\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\t\tthis.ray.set( origin, direction );\n\n\t\t},\n\n\t\tsetFromCamera: function ( coords, camera ) {\n\n\t\t\tif ( ( camera && camera.isPerspectiveCamera ) ) {\n\n\t\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\n\t\t\t} else if ( ( camera && camera.isOrthographicCamera ) ) {\n\n\t\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type.' );\n\n\t\t\t}\n\n\t\t},\n\n\t\tintersectObject: function ( object, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tintersectObject( object, this, intersects, recursive );\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t},\n\n\t\tintersectObjects: function ( objects, recursive ) {\n\n\t\t\tvar intersects = [];\n\n\t\t\tif ( Array.isArray( objects ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.Raycaster.intersectObjects: objects is not an Array.' );\n\t\t\t\treturn intersects;\n\n\t\t\t}\n\n\t\t\tfor ( var i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t\t}\n\n\t\t\tintersects.sort( ascSort );\n\n\t\t\treturn intersects;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction Clock( autoStart ) {\n\n\t\tthis.autoStart = ( autoStart !== undefined ) ? autoStart : true;\n\n\t\tthis.startTime = 0;\n\t\tthis.oldTime = 0;\n\t\tthis.elapsedTime = 0;\n\n\t\tthis.running = false;\n\n\t}\n\n\tObject.assign( Clock.prototype, {\n\n\t\tstart: function () {\n\n\t\t\tthis.startTime = ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732\n\n\t\t\tthis.oldTime = this.startTime;\n\t\t\tthis.elapsedTime = 0;\n\t\t\tthis.running = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tthis.getElapsedTime();\n\t\t\tthis.running = false;\n\t\t\tthis.autoStart = false;\n\n\t\t},\n\n\t\tgetElapsedTime: function () {\n\n\t\t\tthis.getDelta();\n\t\t\treturn this.elapsedTime;\n\n\t\t},\n\n\t\tgetDelta: function () {\n\n\t\t\tvar diff = 0;\n\n\t\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\t\tthis.start();\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\tif ( this.running ) {\n\n\t\t\t\tvar newTime = ( typeof performance === 'undefined' ? Date : performance ).now();\n\n\t\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\t\tthis.oldTime = newTime;\n\n\t\t\t\tthis.elapsedTime += diff;\n\n\t\t\t}\n\n\t\t\treturn diff;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author bhouston / http://clara.io\n\t * @author WestLangley / http://github.com/WestLangley\n\t *\n\t * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n\t *\n\t * The poles (phi) are at the positive and negative y axis.\n\t * The equator starts at positive z.\n\t */\n\n\tfunction Spherical( radius, phi, theta ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0;\n\t\tthis.phi = ( phi !== undefined ) ? phi : 0; // up / down towards top and bottom pole\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // around the equator of the sphere\n\n\t\treturn this;\n\n\t}\n\n\tObject.assign( Spherical.prototype, {\n\n\t\tset: function ( radius, phi, theta ) {\n\n\t\t\tthis.radius = radius;\n\t\t\tthis.phi = phi;\n\t\t\tthis.theta = theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( other ) {\n\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.phi = other.phi;\n\t\t\tthis.theta = other.theta;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\t// restrict phi to be betwee EPS and PI-EPS\n\t\tmakeSafe: function() {\n\n\t\t\tvar EPS = 0.000001;\n\t\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromVector3: function( vec3 ) {\n\n\t\t\tthis.radius = vec3.length();\n\n\t\t\tif ( this.radius === 0 ) {\n\n\t\t\t\tthis.theta = 0;\n\t\t\t\tthis.phi = 0;\n\n\t\t\t} else {\n\n\t\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z ); // equator angle around y-up axis\n\t\t\t\tthis.phi = Math.acos( _Math.clamp( vec3.y / this.radius, - 1, 1 ) ); // polar angle\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system\n\t *\n\t */\n\n\tfunction Cylindrical( radius, theta, y ) {\n\n\t\tthis.radius = ( radius !== undefined ) ? radius : 1.0; // distance from the origin to a point in the x-z plane\n\t\tthis.theta = ( theta !== undefined ) ? theta : 0; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis\n\t\tthis.y = ( y !== undefined ) ? y : 0; // height above the x-z plane\n\n\t\treturn this;\n\n\t}\n\n\tObject.assign( Cylindrical.prototype, {\n\n\t\tset: function ( radius, theta, y ) {\n\n\t\t\tthis.radius = radius;\n\t\t\tthis.theta = theta;\n\t\t\tthis.y = y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tclone: function () {\n\n\t\t\treturn new this.constructor().copy( this );\n\n\t\t},\n\n\t\tcopy: function ( other ) {\n\n\t\t\tthis.radius = other.radius;\n\t\t\tthis.theta = other.theta;\n\t\t\tthis.y = other.y;\n\n\t\t\treturn this;\n\n\t\t},\n\n\t\tsetFromVector3: function( vec3 ) {\n\n\t\t\tthis.radius = Math.sqrt( vec3.x * vec3.x + vec3.z * vec3.z );\n\t\t\tthis.theta = Math.atan2( vec3.x, vec3.z );\n\t\t\tthis.y = vec3.y;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t} );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tfunction ImmediateRenderObject( material ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.material = material;\n\t\tthis.render = function ( renderCallback ) {};\n\n\t}\n\n\tImmediateRenderObject.prototype = Object.create( Object3D.prototype );\n\tImmediateRenderObject.prototype.constructor = ImmediateRenderObject;\n\n\tImmediateRenderObject.prototype.isImmediateRenderObject = true;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction VertexNormalsHelper( object, size, hex, linewidth ) {\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xff0000;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\tnNormals = objGeometry.faces.length * 3;\n\n\t\t} else if ( objGeometry && objGeometry.isBufferGeometry ) {\n\n\t\t\tnNormals = objGeometry.attributes.normal.count;\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tVertexNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tVertexNormalsHelper.prototype.constructor = VertexNormalsHelper;\n\n\tVertexNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tvar keys = [ 'a', 'b', 'c' ];\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\t\tvar faces = objGeometry.faces;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\t\tfor ( var j = 0, jl = face.vertexNormals.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tvar vertex = vertices[ face[ keys[ j ] ] ];\n\n\t\t\t\t\t\tvar normal = face.vertexNormals[ j ];\n\n\t\t\t\t\t\tv1.copy( vertex ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( objGeometry && objGeometry.isBufferGeometry ) {\n\n\t\t\t\tvar objPos = objGeometry.attributes.position;\n\n\t\t\t\tvar objNorm = objGeometry.attributes.normal;\n\n\t\t\t\tvar idx = 0;\n\n\t\t\t\t// for simplicity, ignore index and drawcalls, and render every normal\n\n\t\t\t\tfor ( var j = 0, jl = objPos.count; j < jl; j ++ ) {\n\n\t\t\t\t\tv1.set( objPos.getX( j ), objPos.getY( j ), objPos.getZ( j ) ).applyMatrix4( matrixWorld );\n\n\t\t\t\t\tv2.set( objNorm.getX( j ), objNorm.getY( j ), objNorm.getZ( j ) );\n\n\t\t\t\t\tv2.applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\t\tidx = idx + 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction SpotLightHelper( light, color ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = [\n\t\t\t0, 0, 0,   0,   0,   1,\n\t\t\t0, 0, 0,   1,   0,   1,\n\t\t\t0, 0, 0, - 1,   0,   1,\n\t\t\t0, 0, 0,   0,   1,   1,\n\t\t\t0, 0, 0,   0, - 1,   1\n\t\t];\n\n\t\tfor ( var i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tvar p1 = ( i / l ) * Math.PI * 2;\n\t\t\tvar p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\tSpotLightHelper.prototype = Object.create( Object3D.prototype );\n\tSpotLightHelper.prototype.constructor = SpotLightHelper;\n\n\tSpotLightHelper.prototype.dispose = function () {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t};\n\n\tSpotLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\t\tvar vector2 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tthis.light.updateMatrixWorld();\n\n\t\t\tvar coneLength = this.light.distance ? this.light.distance : 1000;\n\t\t\tvar coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t\tvector.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tvector2.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\t\tthis.cone.lookAt( vector2.sub( vector ) );\n\n\t\t\tif ( this.color !== undefined ) {\n\n\t\t\t\tthis.cone.material.color.set( this.color );\n\n\t\t\t} else {\n\n\t\t\t\tthis.cone.material.color.copy( this.light.color );\n\n\t\t\t}\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author Sean Griffin / http://twitter.com/sgrif\n\t * @author Michael Guerrero / http://realitymeltdown.com\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author ikerr / http://verold.com\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction getBoneList( object ) {\n\n\t\tvar boneList = [];\n\n\t\tif ( object && object.isBone ) {\n\n\t\t\tboneList.push( object );\n\n\t\t}\n\n\t\tfor ( var i = 0; i < object.children.length; i ++ ) {\n\n\t\t\tboneList.push.apply( boneList, getBoneList( object.children[ i ] ) );\n\n\t\t}\n\n\t\treturn boneList;\n\n\t}\n\n\tfunction SkeletonHelper( object ) {\n\n\t\tvar bones = getBoneList( object );\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar color1 = new Color( 0, 0, 1 );\n\t\tvar color2 = new Color( 0, 1, 0 );\n\n\t\tfor ( var i = 0; i < bones.length; i ++ ) {\n\n\t\t\tvar bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( color1.r, color1.g, color1.b );\n\t\t\t\tcolors.push( color2.r, color2.g, color2.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors, depthTest: false, depthWrite: false, transparent: true } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.root = object;\n\t\tthis.bones = bones;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.onBeforeRender();\n\n\t}\n\n\tSkeletonHelper.prototype = Object.create( LineSegments.prototype );\n\tSkeletonHelper.prototype.constructor = SkeletonHelper;\n\n\tSkeletonHelper.prototype.onBeforeRender = function () {\n\n\t\tvar vector = new Vector3();\n\n\t\tvar boneMatrix = new Matrix4();\n\t\tvar matrixWorldInv = new Matrix4();\n\n\t\treturn function onBeforeRender() {\n\n\t\t\tvar bones = this.bones;\n\n\t\t\tvar geometry = this.geometry;\n\t\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\t\tmatrixWorldInv.getInverse( this.root.matrixWorld );\n\n\t\t\tfor ( var i = 0, j = 0; i < bones.length; i ++ ) {\n\n\t\t\t\tvar bone = bones[ i ];\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.matrixWorld );\n\t\t\t\t\tvector.setFromMatrixPosition( boneMatrix );\n\t\t\t\t\tposition.setXYZ( j, vector.x, vector.y, vector.z );\n\n\t\t\t\t\tboneMatrix.multiplyMatrices( matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t\tvector.setFromMatrixPosition( boneMatrix );\n\t\t\t\t\tposition.setXYZ( j + 1, vector.x, vector.y, vector.z );\n\n\t\t\t\t\tj += 2;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction PointLightHelper( light, sphereSize, color ) {\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.color = color;\n\n\t\tvar geometry = new SphereBufferGeometry( sphereSize, 4, 2 );\n\t\tvar material = new MeshBasicMaterial( { wireframe: true, fog: false } );\n\n\t\tMesh.call( this, geometry, material );\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\n\t\t/*\n\t\tvar distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\t\tvar distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\t\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\t\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\t\tvar d = light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\n\t\tthis.add( this.lightDistance );\n\t\t*/\n\n\t}\n\n\tPointLightHelper.prototype = Object.create( Mesh.prototype );\n\tPointLightHelper.prototype.constructor = PointLightHelper;\n\n\tPointLightHelper.prototype.dispose = function () {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t};\n\n\tPointLightHelper.prototype.update = function () {\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\t/*\n\t\tvar d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t};\n\n\t/**\n\t * @author abelnation / http://github.com/abelnation\n\t * @author Mugen87 / http://github.com/Mugen87\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction RectAreaLightHelper( light, color ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( new Float32Array( 5 * 3 ), 3 ) );\n\n\t\tthis.line = new Line( geometry, material );\n\t\tthis.add( this.line );\n\n\n\t\tthis.update();\n\n\t}\n\n\tRectAreaLightHelper.prototype = Object.create( Object3D.prototype );\n\tRectAreaLightHelper.prototype.constructor = RectAreaLightHelper;\n\n\tRectAreaLightHelper.prototype.dispose = function () {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t};\n\n\tRectAreaLightHelper.prototype.update = function () {\n\n\t\t// calculate new dimensions of the helper\n\n\t\tvar hx = this.light.width * 0.5;\n\t\tvar hy = this.light.height * 0.5;\n\n\t\tvar position = this.line.geometry.attributes.position;\n\t\tvar array = position.array;\n\n\t\t// update vertices\n\n\t\tarray[  0 ] =   hx; array[  1 ] = - hy; array[  2 ] = 0;\n\t\tarray[  3 ] =   hx; array[  4 ] =   hy; array[  5 ] = 0;\n\t\tarray[  6 ] = - hx; array[  7 ] =   hy; array[  8 ] = 0;\n\t\tarray[  9 ] = - hx; array[ 10 ] = - hy; array[ 11 ] = 0;\n\t\tarray[ 12 ] =   hx; array[ 13 ] = - hy; array[ 14 ] = 0;\n\n\t\tposition.needsUpdate = true;\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.line.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.line.material.color.copy( this.light.color );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t */\n\n\tfunction HemisphereLightHelper( light, size, color ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tvar geometry = new OctahedronBufferGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tthis.material = new MeshBasicMaterial( { wireframe: true, fog: false } );\n\t\tif ( this.color === undefined ) this.material.vertexColors = VertexColors;\n\n\t\tvar position = geometry.getAttribute( 'position' );\n\t\tvar colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.addAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, this.material ) );\n\n\t\tthis.update();\n\n\t}\n\n\tHemisphereLightHelper.prototype = Object.create( Object3D.prototype );\n\tHemisphereLightHelper.prototype.constructor = HemisphereLightHelper;\n\n\tHemisphereLightHelper.prototype.dispose = function () {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t};\n\n\tHemisphereLightHelper.prototype.update = function () {\n\n\t\tvar vector = new Vector3();\n\n\t\tvar color1 = new Color();\n\t\tvar color2 = new Color();\n\n\t\treturn function update() {\n\n\t\t\tvar mesh = this.children[ 0 ];\n\n\t\t\tif ( this.color !== undefined ) {\n\n\t\t\t\tthis.material.color.set( this.color );\n\n\t\t\t} else {\n\n\t\t\t\tvar colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\t\tcolor1.copy( this.light.color );\n\t\t\t\tcolor2.copy( this.light.groundColor );\n\n\t\t\t\tfor ( var i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\t\tvar color = ( i < ( l / 2 ) ) ? color1 : color2;\n\n\t\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t\t}\n\n\t\t\t\tcolors.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\tmesh.lookAt( vector.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction GridHelper( size, divisions, color1, color2 ) {\n\n\t\tsize = size || 10;\n\t\tdivisions = divisions || 10;\n\t\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\t\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\t\tvar center = divisions / 2;\n\t\tvar step = size / divisions;\n\t\tvar halfSize = size / 2;\n\n\t\tvar vertices = [], colors = [];\n\n\t\tfor ( var i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tvar color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tGridHelper.prototype = Object.create( LineSegments.prototype );\n\tGridHelper.prototype.constructor = GridHelper;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / http://github.com/Mugen87\n\t * @author Hectate / http://www.github.com/Hectate\n\t */\n\n\tfunction PolarGridHelper( radius, radials, circles, divisions, color1, color2 ) {\n\n\t\tradius = radius || 10;\n\t\tradials = radials || 16;\n\t\tcircles = circles || 8;\n\t\tdivisions = divisions || 64;\n\t\tcolor1 = new Color( color1 !== undefined ? color1 : 0x444444 );\n\t\tcolor2 = new Color( color2 !== undefined ? color2 : 0x888888 );\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar x, z;\n\t\tvar v, i, j, r, color;\n\n\t\t// create the radials\n\n\t\tfor ( i = 0; i <= radials; i ++ ) {\n\n\t\t\tv = ( i / radials ) * ( Math.PI * 2 );\n\n\t\t\tx = Math.sin( v ) * radius;\n\t\t\tz = Math.cos( v ) * radius;\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tvertices.push( x, 0, z );\n\n\t\t\tcolor = ( i & 1 ) ? color1 : color2;\n\n\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t}\n\n\t\t// create the circles\n\n\t\tfor ( i = 0; i <= circles; i ++ ) {\n\n\t\t\tcolor = ( i & 1 ) ? color1 : color2;\n\n\t\t\tr = radius - ( radius / circles * i );\n\n\t\t\tfor ( j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tv = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tPolarGridHelper.prototype = Object.create( LineSegments.prototype );\n\tPolarGridHelper.prototype.constructor = PolarGridHelper;\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction FaceNormalsHelper( object, size, hex, linewidth ) {\n\n\t\t// FaceNormalsHelper only supports THREE.Geometry\n\n\t\tthis.object = object;\n\n\t\tthis.size = ( size !== undefined ) ? size : 1;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\t\tvar width = ( linewidth !== undefined ) ? linewidth : 1;\n\n\t\t//\n\n\t\tvar nNormals = 0;\n\n\t\tvar objGeometry = this.object.geometry;\n\n\t\tif ( objGeometry && objGeometry.isGeometry ) {\n\n\t\t\tnNormals = objGeometry.faces.length;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.' );\n\n\t\t}\n\n\t\t//\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tvar positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.addAttribute( 'position', positions );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color, linewidth: width } ) );\n\n\t\t//\n\n\t\tthis.matrixAutoUpdate = false;\n\t\tthis.update();\n\n\t}\n\n\tFaceNormalsHelper.prototype = Object.create( LineSegments.prototype );\n\tFaceNormalsHelper.prototype.constructor = FaceNormalsHelper;\n\n\tFaceNormalsHelper.prototype.update = ( function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar normalMatrix = new Matrix3();\n\n\t\treturn function update() {\n\n\t\t\tthis.object.updateMatrixWorld( true );\n\n\t\t\tnormalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\t\tvar matrixWorld = this.object.matrixWorld;\n\n\t\t\tvar position = this.geometry.attributes.position;\n\n\t\t\t//\n\n\t\t\tvar objGeometry = this.object.geometry;\n\n\t\t\tvar vertices = objGeometry.vertices;\n\n\t\t\tvar faces = objGeometry.faces;\n\n\t\t\tvar idx = 0;\n\n\t\t\tfor ( var i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tvar face = faces[ i ];\n\n\t\t\t\tvar normal = face.normal;\n\n\t\t\t\tv1.copy( vertices[ face.a ] )\n\t\t\t\t\t.add( vertices[ face.b ] )\n\t\t\t\t\t.add( vertices[ face.c ] )\n\t\t\t\t\t.divideScalar( 3 )\n\t\t\t\t\t.applyMatrix4( matrixWorld );\n\n\t\t\t\tv2.copy( normal ).applyMatrix3( normalMatrix ).normalize().multiplyScalar( this.size ).add( v1 );\n\n\t\t\t\tposition.setXYZ( idx, v1.x, v1.y, v1.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t\tposition.setXYZ( idx, v2.x, v2.y, v2.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t}\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t};\n\n\t}() );\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction DirectionalLightHelper( light, size, color ) {\n\n\t\tObject3D.call( this );\n\n\t\tthis.light = light;\n\t\tthis.light.updateMatrixWorld();\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size,   size, 0,\n\t\t\t  size,   size, 0,\n\t\t\t  size, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size,   size, 0\n\t\t], 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { fog: false } );\n\n\t\tthis.lightPlane = new Line( geometry, material );\n\t\tthis.add( this.lightPlane );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\tthis.targetLine = new Line( geometry, material );\n\t\tthis.add( this.targetLine );\n\n\t\tthis.update();\n\n\t}\n\n\tDirectionalLightHelper.prototype = Object.create( Object3D.prototype );\n\tDirectionalLightHelper.prototype.constructor = DirectionalLightHelper;\n\n\tDirectionalLightHelper.prototype.dispose = function () {\n\n\t\tthis.lightPlane.geometry.dispose();\n\t\tthis.lightPlane.material.dispose();\n\t\tthis.targetLine.geometry.dispose();\n\t\tthis.targetLine.material.dispose();\n\n\t};\n\n\tDirectionalLightHelper.prototype.update = function () {\n\n\t\tvar v1 = new Vector3();\n\t\tvar v2 = new Vector3();\n\t\tvar v3 = new Vector3();\n\n\t\treturn function update() {\n\n\t\t\tv1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t\tv2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t\tv3.subVectors( v2, v1 );\n\n\t\t\tthis.lightPlane.lookAt( v3 );\n\n\t\t\tif ( this.color !== undefined ) {\n\n\t\t\t\tthis.lightPlane.material.color.set( this.color );\n\t\t\t\tthis.targetLine.material.color.set( this.color );\n\n\t\t\t} else {\n\n\t\t\t\tthis.lightPlane.material.color.copy( this.light.color );\n\t\t\t\tthis.targetLine.material.color.copy( this.light.color );\n\n\t\t\t}\n\n\t\t\tthis.targetLine.lookAt( v3 );\n\t\t\tthis.targetLine.scale.z = v3.length();\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t * @author Mugen87 / https://github.com/Mugen87\n\t *\n\t *\t- shows frustum, line of sight and up of the camera\n\t *\t- suitable for fast updates\n\t * \t- based on frustum visualization in lightgl.js shadowmap example\n\t *\t\thttp://evanw.github.com/lightgl.js/tests/shadowmap.html\n\t */\n\n\tfunction CameraHelper( camera ) {\n\n\t\tvar geometry = new BufferGeometry();\n\t\tvar material = new LineBasicMaterial( { color: 0xffffff, vertexColors: FaceColors } );\n\n\t\tvar vertices = [];\n\t\tvar colors = [];\n\n\t\tvar pointMap = {};\n\n\t\t// colors\n\n\t\tvar colorFrustum = new Color( 0xffaa00 );\n\t\tvar colorCone = new Color( 0xff0000 );\n\t\tvar colorUp = new Color( 0x00aaff );\n\t\tvar colorTarget = new Color( 0xffffff );\n\t\tvar colorCross = new Color( 0x333333 );\n\n\t\t// near\n\n\t\taddLine( \"n1\", \"n2\", colorFrustum );\n\t\taddLine( \"n2\", \"n4\", colorFrustum );\n\t\taddLine( \"n4\", \"n3\", colorFrustum );\n\t\taddLine( \"n3\", \"n1\", colorFrustum );\n\n\t\t// far\n\n\t\taddLine( \"f1\", \"f2\", colorFrustum );\n\t\taddLine( \"f2\", \"f4\", colorFrustum );\n\t\taddLine( \"f4\", \"f3\", colorFrustum );\n\t\taddLine( \"f3\", \"f1\", colorFrustum );\n\n\t\t// sides\n\n\t\taddLine( \"n1\", \"f1\", colorFrustum );\n\t\taddLine( \"n2\", \"f2\", colorFrustum );\n\t\taddLine( \"n3\", \"f3\", colorFrustum );\n\t\taddLine( \"n4\", \"f4\", colorFrustum );\n\n\t\t// cone\n\n\t\taddLine( \"p\", \"n1\", colorCone );\n\t\taddLine( \"p\", \"n2\", colorCone );\n\t\taddLine( \"p\", \"n3\", colorCone );\n\t\taddLine( \"p\", \"n4\", colorCone );\n\n\t\t// up\n\n\t\taddLine( \"u1\", \"u2\", colorUp );\n\t\taddLine( \"u2\", \"u3\", colorUp );\n\t\taddLine( \"u3\", \"u1\", colorUp );\n\n\t\t// target\n\n\t\taddLine( \"c\", \"t\", colorTarget );\n\t\taddLine( \"p\", \"c\", colorCross );\n\n\t\t// cross\n\n\t\taddLine( \"cn1\", \"cn2\", colorCross );\n\t\taddLine( \"cn3\", \"cn4\", colorCross );\n\n\t\taddLine( \"cf1\", \"cf2\", colorCross );\n\t\taddLine( \"cf3\", \"cf4\", colorCross );\n\n\t\tfunction addLine( a, b, color ) {\n\n\t\t\taddPoint( a, color );\n\t\t\taddPoint( b, color );\n\n\t\t}\n\n\t\tfunction addPoint( id, color ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t}\n\n\tCameraHelper.prototype = Object.create( LineSegments.prototype );\n\tCameraHelper.prototype.constructor = CameraHelper;\n\n\tCameraHelper.prototype.update = function () {\n\n\t\tvar geometry, pointMap;\n\n\t\tvar vector = new Vector3();\n\t\tvar camera = new Camera();\n\n\t\tfunction setPoint( point, x, y, z ) {\n\n\t\t\tvector.set( x, y, z ).unproject( camera );\n\n\t\t\tvar points = pointMap[ point ];\n\n\t\t\tif ( points !== undefined ) {\n\n\t\t\t\tvar position = geometry.getAttribute( 'position' );\n\n\t\t\t\tfor ( var i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\t\tposition.setXYZ( points[ i ], vector.x, vector.y, vector.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn function update() {\n\n\t\t\tgeometry = this.geometry;\n\t\t\tpointMap = this.pointMap;\n\n\t\t\tvar w = 1, h = 1;\n\n\t\t\t// we need just camera projection matrix\n\t\t\t// world matrix must be identity\n\n\t\t\tcamera.projectionMatrix.copy( this.camera.projectionMatrix );\n\n\t\t\t// center / target\n\n\t\t\tsetPoint( \"c\", 0, 0, - 1 );\n\t\t\tsetPoint( \"t\", 0, 0,  1 );\n\n\t\t\t// near\n\n\t\t\tsetPoint( \"n1\", - w, - h, - 1 );\n\t\t\tsetPoint( \"n2\",   w, - h, - 1 );\n\t\t\tsetPoint( \"n3\", - w,   h, - 1 );\n\t\t\tsetPoint( \"n4\",   w,   h, - 1 );\n\n\t\t\t// far\n\n\t\t\tsetPoint( \"f1\", - w, - h, 1 );\n\t\t\tsetPoint( \"f2\",   w, - h, 1 );\n\t\t\tsetPoint( \"f3\", - w,   h, 1 );\n\t\t\tsetPoint( \"f4\",   w,   h, 1 );\n\n\t\t\t// up\n\n\t\t\tsetPoint( \"u1\",   w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u2\", - w * 0.7, h * 1.1, - 1 );\n\t\t\tsetPoint( \"u3\",         0, h * 2,   - 1 );\n\n\t\t\t// cross\n\n\t\t\tsetPoint( \"cf1\", - w,   0, 1 );\n\t\t\tsetPoint( \"cf2\",   w,   0, 1 );\n\t\t\tsetPoint( \"cf3\",   0, - h, 1 );\n\t\t\tsetPoint( \"cf4\",   0,   h, 1 );\n\n\t\t\tsetPoint( \"cn1\", - w,   0, - 1 );\n\t\t\tsetPoint( \"cn2\",   w,   0, - 1 );\n\t\t\tsetPoint( \"cn3\",   0, - h, - 1 );\n\t\t\tsetPoint( \"cn4\",   0,   h, - 1 );\n\n\t\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\t};\n\n\t}();\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t * @author Mugen87 / http://github.com/Mugen87\n\t */\n\n\tfunction BoxHelper( object, color ) {\n\n\t\tthis.object = object;\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\n\t\tvar indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\t\tvar positions = new Float32Array( 8 * 3 );\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.addAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tBoxHelper.prototype = Object.create( LineSegments.prototype );\n\tBoxHelper.prototype.constructor = BoxHelper;\n\n\tBoxHelper.prototype.update = ( function () {\n\n\t\tvar box = new Box3();\n\n\t\treturn function update( object ) {\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BoxHelper: .update() has no longer arguments.' );\n\n\t\t\t}\n\n\t\t\tif ( this.object !== undefined ) {\n\n\t\t\t\tbox.setFromObject( this.object );\n\n\t\t\t}\n\n\t\t\tif ( box.isEmpty() ) return;\n\n\t\t\tvar min = box.min;\n\t\t\tvar max = box.max;\n\n\t\t\t/*\n\t\t\t  5____4\n\t\t\t1/___0/|\n\t\t\t| 6__|_7\n\t\t\t2/___3/\n\n\t\t\t0: max.x, max.y, max.z\n\t\t\t1: min.x, max.y, max.z\n\t\t\t2: min.x, min.y, max.z\n\t\t\t3: max.x, min.y, max.z\n\t\t\t4: max.x, max.y, min.z\n\t\t\t5: min.x, max.y, min.z\n\t\t\t6: min.x, min.y, min.z\n\t\t\t7: max.x, min.y, min.z\n\t\t\t*/\n\n\t\t\tvar position = this.geometry.attributes.position;\n\t\t\tvar array = position.array;\n\n\t\t\tarray[  0 ] = max.x; array[  1 ] = max.y; array[  2 ] = max.z;\n\t\t\tarray[  3 ] = min.x; array[  4 ] = max.y; array[  5 ] = max.z;\n\t\t\tarray[  6 ] = min.x; array[  7 ] = min.y; array[  8 ] = max.z;\n\t\t\tarray[  9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t\tthis.geometry.computeBoundingSphere();\n\n\t\t};\n\n\t} )();\n\n\tBoxHelper.prototype.setFromObject = function ( object ) {\n\n\t\tthis.object = object;\n\t\tthis.update();\n\n\t\treturn this;\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction Box3Helper( box, hex ) {\n\n\t\tthis.type = 'Box3Helper';\n\n\t\tthis.box = box;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\t\tvar indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\n\t\tvar positions = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 1, - 1, 1, - 1, - 1 ];\n\n\t\tvar geometry = new BufferGeometry();\n\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tLineSegments.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t\tthis.onBeforeRender();\n\n\t}\n\n\tBox3Helper.prototype = Object.create( LineSegments.prototype );\n\tBox3Helper.prototype.constructor = Box3Helper;\n\n\tBox3Helper.prototype.onBeforeRender = function () {\n\n\t\tvar box = this.box;\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tbox.getCenter( this.position );\n\n\t\tbox.getSize( this.scale );\n\n\t\tthis.scale.multiplyScalar( 0.5 );\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t */\n\n\tfunction PlaneHelper( plane, size, hex ) {\n\n\t\tthis.type = 'PlaneHelper';\n\n\t\tthis.plane = plane;\n\n\t\tthis.size = ( size === undefined ) ? 1 : size;\n\n\t\tvar color = ( hex !== undefined ) ? hex : 0xffff00;\n\n\t\tvar positions = [ 1, - 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0 ];\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tgeometry.computeBoundingSphere();\n\n\t\tLine.call( this, geometry, new LineBasicMaterial( { color: color } ) );\n\n\t\t//\n\n\t\tvar positions2 = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, 1, 1, - 1, - 1, 1, 1, - 1, 1 ];\n\n\t\tvar geometry2 = new BufferGeometry();\n\t\tgeometry2.addAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\t\tgeometry2.computeBoundingSphere();\n\n\t\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false } ) ) );\n\n\t\t//\n\n\t\tthis.onBeforeRender();\n\n\t}\n\n\tPlaneHelper.prototype = Object.create( Line.prototype );\n\tPlaneHelper.prototype.constructor = PlaneHelper;\n\n\tPlaneHelper.prototype.onBeforeRender = function () {\n\n\t\tvar scale = - this.plane.constant;\n\n\t\tif ( Math.abs( scale ) < 1e-8 ) scale = 1e-8; // sign does not matter\n\n\t\tthis.scale.set( 0.5 * this.size, 0.5 * this.size, scale );\n\n\t\tthis.lookAt( this.plane.normal );\n\n\t\tthis.updateMatrixWorld();\n\n\t};\n\n\t/**\n\t * @author WestLangley / http://github.com/WestLangley\n\t * @author zz85 / http://github.com/zz85\n\t * @author bhouston / http://clara.io\n\t *\n\t * Creates an arrow for visualizing directions\n\t *\n\t * Parameters:\n\t *  dir - Vector3\n\t *  origin - Vector3\n\t *  length - Number\n\t *  color - color in hex value\n\t *  headLength - Number\n\t *  headWidth - Number\n\t */\n\n\tvar lineGeometry;\n\tvar coneGeometry;\n\n\tfunction ArrowHelper( dir, origin, length, color, headLength, headWidth ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tObject3D.call( this );\n\n\t\tif ( color === undefined ) color = 0xffff00;\n\t\tif ( length === undefined ) length = 1;\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tif ( lineGeometry === undefined ) {\n\n\t\t\tlineGeometry = new BufferGeometry();\n\t\t\tlineGeometry.addAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\tconeGeometry = new CylinderBufferGeometry( 0, 0.5, 1, 5, 1 );\n\t\t\tconeGeometry.translate( 0, - 0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\tthis.line = new Line( lineGeometry, new LineBasicMaterial( { color: color } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\tthis.cone = new Mesh( coneGeometry, new MeshBasicMaterial( { color: color } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\tArrowHelper.prototype = Object.create( Object3D.prototype );\n\tArrowHelper.prototype.constructor = ArrowHelper;\n\n\tArrowHelper.prototype.setDirection = ( function () {\n\n\t\tvar axis = new Vector3();\n\t\tvar radians;\n\n\t\treturn function setDirection( dir ) {\n\n\t\t\t// dir is assumed to be normalized\n\n\t\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\taxis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\t\tradians = Math.acos( dir.y );\n\n\t\t\t\tthis.quaternion.setFromAxisAngle( axis, radians );\n\n\t\t\t}\n\n\t\t};\n\n\t}() );\n\n\tArrowHelper.prototype.setLength = function ( length, headLength, headWidth ) {\n\n\t\tif ( headLength === undefined ) headLength = 0.2 * length;\n\t\tif ( headWidth === undefined ) headWidth = 0.2 * headLength;\n\n\t\tthis.line.scale.set( 1, Math.max( 0, length - headLength ), 1 );\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t};\n\n\tArrowHelper.prototype.setColor = function ( color ) {\n\n\t\tthis.line.material.color.copy( color );\n\t\tthis.cone.material.color.copy( color );\n\n\t};\n\n\t/**\n\t * @author sroucheray / http://sroucheray.org/\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction AxisHelper( size ) {\n\n\t\tsize = size || 1;\n\n\t\tvar vertices = [\n\t\t\t0, 0, 0,  size, 0, 0,\n\t\t\t0, 0, 0,  0, size, 0,\n\t\t\t0, 0, 0,  0, 0, size\n\t\t];\n\n\t\tvar colors = [\n\t\t\t1, 0, 0,  1, 0.6, 0,\n\t\t\t0, 1, 0,  0.6, 1, 0,\n\t\t\t0, 0, 1,  0, 0.6, 1\n\t\t];\n\n\t\tvar geometry = new BufferGeometry();\n\t\tgeometry.addAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.addAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tvar material = new LineBasicMaterial( { vertexColors: VertexColors } );\n\n\t\tLineSegments.call( this, geometry, material );\n\n\t}\n\n\tAxisHelper.prototype = Object.create( LineSegments.prototype );\n\tAxisHelper.prototype.constructor = AxisHelper;\n\n\t/**\n\t * @author zz85 https://github.com/zz85\n\t *\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t * cusps and self-intersections in non-uniform catmull rom curves.\n\t * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t *\n\t * curve.type accepts centripetal(default), chordal and catmullrom\n\t * curve.tension is used for catmullrom which defaults to 0.5\n\t */\n\n\n\t/*\n\tBased on an optimized c++ solution in\n\t - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t - http://ideone.com/NoEbVM\n\n\tThis CubicPoly class could be used for reusing some variables and calculations,\n\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\twhich can be placed in CurveUtils.\n\t*/\n\n\tfunction CubicPoly() {\n\n\t\tvar c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t\t/*\n\t\t * Compute coefficients for a cubic polynomial\n\t\t *   p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t\t * such that\n\t\t *   p(0) = x0, p(1) = x1\n\t\t *  and\n\t\t *   p'(0) = t0, p'(1) = t1.\n\t\t */\n\t\tfunction init( x0, x1, t0, t1 ) {\n\n\t\t\tc0 = x0;\n\t\t\tc1 = t0;\n\t\t\tc2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t\t},\n\n\t\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\t\tvar t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\t\tvar t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\t\tt1 *= dt1;\n\t\t\t\tt2 *= dt1;\n\n\t\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t\t},\n\n\t\t\tcalc: function ( t ) {\n\n\t\t\t\tvar t2 = t * t;\n\t\t\t\tvar t3 = t2 * t;\n\t\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tvar tmp = new Vector3();\n\tvar px = new CubicPoly();\n\tvar py = new CubicPoly();\n\tvar pz = new CubicPoly();\n\n\tfunction CatmullRomCurve3( points ) {\n\n\t\tCurve.call( this );\n\n\t\tif ( points.length < 2 ) console.warn( 'THREE.CatmullRomCurve3: Points array needs at least two entries.' );\n\n\t\tthis.points = points || [];\n\t\tthis.closed = false;\n\n\t}\n\n\tCatmullRomCurve3.prototype = Object.create( Curve.prototype );\n\tCatmullRomCurve3.prototype.constructor = CatmullRomCurve3;\n\n\tCatmullRomCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar points = this.points;\n\t\tvar l = points.length;\n\n\t\tvar point = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tvar intPoint = Math.floor( point );\n\t\tvar weight = point - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / points.length ) + 1 ) * points.length;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tvar p0, p1, p2, p3; // 4 points\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tp1 = points[ intPoint % l ];\n\t\tp2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.type === undefined || this.type === 'centripetal' || this.type === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tvar pow = this.type === 'chordal' ? 0.5 : 0.25;\n\t\t\tvar dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tvar dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tvar dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.type === 'catmullrom' ) {\n\n\t\t\tvar tension = this.tension !== undefined ? this.tension : 0.5;\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, tension );\n\n\t\t}\n\n\t\treturn new Vector3( px.calc( weight ), py.calc( weight ), pz.calc( weight ) );\n\n\t};\n\n\tfunction CubicBezierCurve3( v0, v1, v2, v3 ) {\n\n\t\tCurve.call( this );\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tCubicBezierCurve3.prototype = Object.create( Curve.prototype );\n\tCubicBezierCurve3.prototype.constructor = CubicBezierCurve3;\n\n\tCubicBezierCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\treturn new Vector3(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t};\n\n\tfunction QuadraticBezierCurve3( v0, v1, v2 ) {\n\n\t\tCurve.call( this );\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tQuadraticBezierCurve3.prototype = Object.create( Curve.prototype );\n\tQuadraticBezierCurve3.prototype.constructor = QuadraticBezierCurve3;\n\n\tQuadraticBezierCurve3.prototype.getPoint = function ( t ) {\n\n\t\tvar v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\treturn new Vector3(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t};\n\n\tfunction LineCurve3( v1, v2 ) {\n\n\t\tCurve.call( this );\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tLineCurve3.prototype = Object.create( Curve.prototype );\n\tLineCurve3.prototype.constructor = LineCurve3;\n\n\tLineCurve3.prototype.getPoint = function ( t ) {\n\n\t\tif ( t === 1 ) {\n\n\t\t\treturn this.v2.clone();\n\n\t\t}\n\n\t\tvar vector = new Vector3();\n\n\t\tvector.subVectors( this.v2, this.v1 ); // diff\n\t\tvector.multiplyScalar( t );\n\t\tvector.add( this.v1 );\n\n\t\treturn vector;\n\n\t};\n\n\tfunction ArcCurve( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tEllipseCurve.call( this, aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t}\n\n\tArcCurve.prototype = Object.create( EllipseCurve.prototype );\n\tArcCurve.prototype.constructor = ArcCurve;\n\n\t/**\n\t * @author alteredq / http://alteredqualia.com/\n\t */\n\n\tvar SceneUtils = {\n\n\t\tcreateMultiMaterialObject: function ( geometry, materials ) {\n\n\t\t\tvar group = new Group();\n\n\t\t\tfor ( var i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\tgroup.add( new Mesh( geometry, materials[ i ] ) );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t},\n\n\t\tdetach: function ( child, parent, scene ) {\n\n\t\t\tchild.applyMatrix( parent.matrixWorld );\n\t\t\tparent.remove( child );\n\t\t\tscene.add( child );\n\n\t\t},\n\n\t\tattach: function ( child, scene, parent ) {\n\n\t\t\tchild.applyMatrix( new Matrix4().getInverse( parent.matrixWorld ) );\n\n\t\t\tscene.remove( child );\n\t\t\tparent.add( child );\n\n\t\t}\n\n\t};\n\n\t/**\n\t * @author mrdoob / http://mrdoob.com/\n\t */\n\n\tfunction Face4( a, b, c, d, normal, color, materialIndex ) {\n\n\t\tconsole.warn( 'THREE.Face4 has been removed. A THREE.Face3 will be created instead.' );\n\t\treturn new Face3( a, b, c, normal, color, materialIndex );\n\n\t}\n\n\tvar LineStrip = 0;\n\n\tvar LinePieces = 1;\n\n\tfunction MeshFaceMaterial( materials ) {\n\n\t\tconsole.warn( 'THREE.MeshFaceMaterial has been removed. Use an Array instead.' );\n\t\treturn materials;\n\n\t}\n\n\tfunction MultiMaterial( materials ) {\n\n\t\tif ( materials === undefined ) materials = [];\n\n\t\tconsole.warn( 'THREE.MultiMaterial has been removed. Use an Array instead.' );\n\t\tmaterials.isMultiMaterial = true;\n\t\tmaterials.materials = materials;\n\t\tmaterials.clone = function () {\n\n\t\t\treturn materials.slice();\n\n\t\t};\n\t\treturn materials;\n\n\t}\n\n\tfunction PointCloud( geometry, material ) {\n\n\t\tconsole.warn( 'THREE.PointCloud has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\n\t}\n\n\tfunction Particle( material ) {\n\n\t\tconsole.warn( 'THREE.Particle has been renamed to THREE.Sprite.' );\n\t\treturn new Sprite( material );\n\n\t}\n\n\tfunction ParticleSystem( geometry, material ) {\n\n\t\tconsole.warn( 'THREE.ParticleSystem has been renamed to THREE.Points.' );\n\t\treturn new Points( geometry, material );\n\n\t}\n\n\tfunction PointCloudMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction ParticleBasicMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction ParticleSystemMaterial( parameters ) {\n\n\t\tconsole.warn( 'THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.' );\n\t\treturn new PointsMaterial( parameters );\n\n\t}\n\n\tfunction Vertex( x, y, z ) {\n\n\t\tconsole.warn( 'THREE.Vertex has been removed. Use THREE.Vector3 instead.' );\n\t\treturn new Vector3( x, y, z );\n\n\t}\n\n\t//\n\n\tfunction DynamicBufferAttribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.' );\n\t\treturn new BufferAttribute( array, itemSize ).setDynamic( true );\n\n\t}\n\n\tfunction Int8Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.' );\n\t\treturn new Int8BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint8Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.' );\n\t\treturn new Uint8BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint8ClampedAttribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.' );\n\t\treturn new Uint8ClampedBufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Int16Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.' );\n\t\treturn new Int16BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint16Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.' );\n\t\treturn new Uint16BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Int32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.' );\n\t\treturn new Int32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Uint32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.' );\n\t\treturn new Uint32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Float32Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.' );\n\t\treturn new Float32BufferAttribute( array, itemSize );\n\n\t}\n\n\tfunction Float64Attribute( array, itemSize ) {\n\n\t\tconsole.warn( 'THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.' );\n\t\treturn new Float64BufferAttribute( array, itemSize );\n\n\t}\n\n\t//\n\n\tCurve.create = function ( construct, getPoint ) {\n\n\t\tconsole.log( 'THREE.Curve.create() has been deprecated' );\n\n\t\tconstruct.prototype = Object.create( Curve.prototype );\n\t\tconstruct.prototype.constructor = construct;\n\t\tconstruct.prototype.getPoint = getPoint;\n\n\t\treturn construct;\n\n\t};\n\n\t//\n\n\tfunction ClosedSplineCurve3( points ) {\n\n\t\tconsole.warn( 'THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\t\tthis.closed = true;\n\n\t}\n\n\tClosedSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\t//\n\n\tfunction SplineCurve3( points ) {\n\n\t\tconsole.warn( 'THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\n\t}\n\n\tSplineCurve3.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\t//\n\n\tfunction Spline( points ) {\n\n\t\tconsole.warn( 'THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.' );\n\n\t\tCatmullRomCurve3.call( this, points );\n\t\tthis.type = 'catmullrom';\n\n\t}\n\n\tSpline.prototype = Object.create( CatmullRomCurve3.prototype );\n\n\tObject.assign( Spline.prototype, {\n\n\t\tinitFromArray: function ( a ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .initFromArray() has been removed.' );\n\n\t\t},\n\t\tgetControlPointsArray: function ( optionalTarget ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .getControlPointsArray() has been removed.' );\n\n\t\t},\n\t\treparametrizeByArcLength: function ( samplingCoef ) {\n\n\t\t\tconsole.error( 'THREE.Spline: .reparametrizeByArcLength() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\t//\n\tfunction BoundingBoxHelper( object, color ) {\n\n\t\tconsole.warn( 'THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.' );\n\t\treturn new BoxHelper( object, color );\n\n\t}\n\n\tfunction EdgesHelper( object, hex ) {\n\n\t\tconsole.warn( 'THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.' );\n\t\treturn new LineSegments( new EdgesGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n\t}\n\n\tGridHelper.prototype.setColors = function () {\n\n\t\tconsole.error( 'THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.' );\n\n\t};\n\n\tSkeletonHelper.prototype.update = function () {\n\n\t\tconsole.error( 'THREE.SkeletonHelper: update() no longer needs to be called.' );\n\n\t};\n\n\tfunction WireframeHelper( object, hex ) {\n\n\t\tconsole.warn( 'THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.' );\n\t\treturn new LineSegments( new WireframeGeometry( object.geometry ), new LineBasicMaterial( { color: hex !== undefined ? hex : 0xffffff } ) );\n\n\t}\n\n\t//\n\n\tfunction XHRLoader( manager ) {\n\n\t\tconsole.warn( 'THREE.XHRLoader has been renamed to THREE.FileLoader.' );\n\t\treturn new FileLoader( manager );\n\n\t}\n\n\tfunction BinaryTextureLoader( manager ) {\n\n\t\tconsole.warn( 'THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.' );\n\t\treturn new DataTextureLoader( manager );\n\n\t}\n\n\t//\n\n\tObject.assign( Box2.prototype, {\n\n\t\tcenter: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\n\t\t},\n\t\tempty: function () {\n\n\t\t\tconsole.warn( 'THREE.Box2: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box2: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\n\t\t}\n\t} );\n\n\tObject.assign( Box3.prototype, {\n\n\t\tcenter: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .center() has been renamed to .getCenter().' );\n\t\t\treturn this.getCenter( optionalTarget );\n\n\t\t},\n\t\tempty: function () {\n\n\t\t\tconsole.warn( 'THREE.Box3: .empty() has been renamed to .isEmpty().' );\n\t\t\treturn this.isEmpty();\n\n\t\t},\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t},\n\t\tsize: function ( optionalTarget ) {\n\n\t\t\tconsole.warn( 'THREE.Box3: .size() has been renamed to .getSize().' );\n\t\t\treturn this.getSize( optionalTarget );\n\n\t\t}\n\t} );\n\n\tLine3.prototype.center = function ( optionalTarget ) {\n\n\t\tconsole.warn( 'THREE.Line3: .center() has been renamed to .getCenter().' );\n\t\treturn this.getCenter( optionalTarget );\n\n\t};\n\n\t_Math.random16 = function () {\n\n\t\tconsole.warn( 'THREE.Math.random16() has been deprecated. Use Math.random() instead.' );\n\t\treturn Math.random();\n\n\t};\n\n\tObject.assign( Matrix3.prototype, {\n\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\t\tmultiplyVector3: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix3( this );\n\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: .multiplyVector3Array() has been removed.'  );\n\n\t\t},\n\t\tapplyToBuffer: function( buffer, offset, length ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );\n\t\t\treturn this.applyToBufferAttribute( buffer );\n\n\t\t},\n\t\tapplyToVector3Array: function( array, offset, length ) {\n\n\t\t\tconsole.error( 'THREE.Matrix3: .applyToVector3Array() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Matrix4.prototype, {\n\n\t\textractPosition: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().' );\n\t\t\treturn this.copyPosition( m );\n\n\t\t},\n\t\tflattenToArrayOffset: function ( array, offset ) {\n\n\t\t\tconsole.warn( \"THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.\" );\n\t\t\treturn this.toArray( array, offset );\n\n\t\t},\n\t\tgetPosition: function () {\n\n\t\t\tvar v1;\n\n\t\t\treturn function getPosition() {\n\n\t\t\t\tif ( v1 === undefined ) v1 = new Vector3();\n\t\t\t\tconsole.warn( 'THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.' );\n\t\t\t\treturn v1.setFromMatrixColumn( this, 3 );\n\n\t\t\t};\n\n\t\t}(),\n\t\tsetRotationFromQuaternion: function ( q ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().' );\n\t\t\treturn this.makeRotationFromQuaternion( q );\n\n\t\t},\n\t\tmultiplyToArray: function () {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyToArray() has been removed.' );\n\n\t\t},\n\t\tmultiplyVector3: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\tmultiplyVector4: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\tmultiplyVector3Array: function ( a ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .multiplyVector3Array() has been removed.'  );\n\n\t\t},\n\t\trotateAxis: function ( v ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.' );\n\t\t\tv.transformDirection( this );\n\n\t\t},\n\t\tcrossVector: function ( vector ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.' );\n\t\t\treturn vector.applyMatrix4( this );\n\n\t\t},\n\t\ttranslate: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .translate() has been removed.' );\n\n\t\t},\n\t\trotateX: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateX() has been removed.' );\n\n\t\t},\n\t\trotateY: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateY() has been removed.' );\n\n\t\t},\n\t\trotateZ: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateZ() has been removed.' );\n\n\t\t},\n\t\trotateByAxis: function () {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .rotateByAxis() has been removed.' );\n\n\t\t},\n\t\tapplyToBuffer: function( buffer, offset, length ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.' );\n\t\t\treturn this.applyToBufferAttribute( buffer );\n\n\t\t},\n\t\tapplyToVector3Array: function( array, offset, length ) {\n\n\t\t\tconsole.error( 'THREE.Matrix4: .applyToVector3Array() has been removed.' );\n\n\t\t},\n\t\tmakeFrustum: function( left, right, bottom, top, near, far ) {\n\n\t\t\tconsole.warn( 'THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.' );\n\t\t\treturn this.makePerspective( left, right, top, bottom, near, far );\n\n\t\t}\n\n\t} );\n\n\tPlane.prototype.isIntersectionLine = function ( line ) {\n\n\t\tconsole.warn( 'THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().' );\n\t\treturn this.intersectsLine( line );\n\n\t};\n\n\tQuaternion.prototype.multiplyVector3 = function ( vector ) {\n\n\t\tconsole.warn( 'THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.' );\n\t\treturn vector.applyQuaternion( this );\n\n\t};\n\n\tObject.assign( Ray.prototype, {\n\n\t\tisIntersectionBox: function ( box ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().' );\n\t\t\treturn this.intersectsBox( box );\n\n\t\t},\n\t\tisIntersectionPlane: function ( plane ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().' );\n\t\t\treturn this.intersectsPlane( plane );\n\n\t\t},\n\t\tisIntersectionSphere: function ( sphere ) {\n\n\t\t\tconsole.warn( 'THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().' );\n\t\t\treturn this.intersectsSphere( sphere );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Shape.prototype, {\n\n\t\textrude: function ( options ) {\n\n\t\t\tconsole.warn( 'THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.' );\n\t\t\treturn new ExtrudeGeometry( this, options );\n\n\t\t},\n\t\tmakeGeometry: function ( options ) {\n\n\t\t\tconsole.warn( 'THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.' );\n\t\t\treturn new ShapeGeometry( this, options );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector2.prototype, {\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector3.prototype, {\n\n\t\tsetEulerFromRotationMatrix: function () {\n\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.' );\n\n\t\t},\n\t\tsetEulerFromQuaternion: function () {\n\n\t\t\tconsole.error( 'THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.' );\n\n\t\t},\n\t\tgetPositionFromMatrix: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().' );\n\t\t\treturn this.setFromMatrixPosition( m );\n\n\t\t},\n\t\tgetScaleFromMatrix: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().' );\n\t\t\treturn this.setFromMatrixScale( m );\n\n\t\t},\n\t\tgetColumnFromMatrix: function ( index, matrix ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().' );\n\t\t\treturn this.setFromMatrixColumn( matrix, index );\n\n\t\t},\n\t\tapplyProjection: function ( m ) {\n\n\t\t\tconsole.warn( 'THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.' );\n\t\t\treturn this.applyMatrix4( m );\n\n\t\t},\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\tObject.assign( Vector4.prototype, {\n\n\t\tfromAttribute: function ( attribute, index, offset ) {\n\n\t\t\tconsole.error( 'THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().' );\n\t\t\treturn this.fromBufferAttribute( attribute, index, offset );\n\n\t\t}\n\n\t} );\n\n\t//\n\n\tGeometry.prototype.computeTangents = function () {\n\n\t\tconsole.warn( 'THREE.Geometry: .computeTangents() has been removed.' );\n\n\t};\n\n\tObject.assign( Object3D.prototype, {\n\n\t\tgetChildByName: function ( name ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().' );\n\t\t\treturn this.getObjectByName( name );\n\n\t\t},\n\t\trenderDepth: function () {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.' );\n\n\t\t},\n\t\ttranslate: function ( distance, axis ) {\n\n\t\t\tconsole.warn( 'THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.' );\n\t\t\treturn this.translateOnAxis( axis, distance );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( Object3D.prototype, {\n\n\t\teulerOrder: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\treturn this.rotation.order;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .eulerOrder is now .rotation.order.' );\n\t\t\t\tthis.rotation.order = value;\n\n\t\t\t}\n\t\t},\n\t\tuseQuaternion: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.' );\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( LOD.prototype, {\n\n\t\tobjects: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.LOD: .objects has been renamed to .levels.' );\n\t\t\t\treturn this.levels;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperty( Skeleton.prototype, 'useVertexTexture', {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Skeleton: useVertexTexture has been removed.' );\n\n\t\t},\n\t\tset: function () {\n\n\t\t\tconsole.warn( 'THREE.Skeleton: useVertexTexture has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperty( Curve.prototype, '__arcLengthDivisions', {\n\n\t\tget: function () {\n\n\t\t\tconsole.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' );\n\t\t\treturn this.arcLengthDivisions;\n\n\t\t},\n\t\tset: function ( value ) {\n\n\t\t\tconsole.warn( 'THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.' );\n\t\t\tthis.arcLengthDivisions = value;\n\n\t\t}\n\n\t} );\n\n\t//\n\n\tPerspectiveCamera.prototype.setLens = function ( focalLength, filmGauge ) {\n\n\t\tconsole.warn( \"THREE.PerspectiveCamera.setLens is deprecated. \" +\n\t\t\t\t\"Use .setFocalLength and .filmGauge for a photographic setup.\" );\n\n\t\tif ( filmGauge !== undefined ) this.filmGauge = filmGauge;\n\t\tthis.setFocalLength( focalLength );\n\n\t};\n\n\t//\n\n\tObject.defineProperties( Light.prototype, {\n\t\tonlyShadow: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .onlyShadow has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraFov: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFov is now .shadow.camera.fov.' );\n\t\t\t\tthis.shadow.camera.fov = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraLeft: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraLeft is now .shadow.camera.left.' );\n\t\t\t\tthis.shadow.camera.left = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraRight: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraRight is now .shadow.camera.right.' );\n\t\t\t\tthis.shadow.camera.right = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraTop: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraTop is now .shadow.camera.top.' );\n\t\t\t\tthis.shadow.camera.top = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraBottom: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.' );\n\t\t\t\tthis.shadow.camera.bottom = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraNear: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraNear is now .shadow.camera.near.' );\n\t\t\t\tthis.shadow.camera.near = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraFar: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraFar is now .shadow.camera.far.' );\n\t\t\t\tthis.shadow.camera.far = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowCameraVisible: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowBias: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowBias is now .shadow.bias.' );\n\t\t\t\tthis.shadow.bias = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowDarkness: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowDarkness has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\tshadowMapWidth: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.' );\n\t\t\t\tthis.shadow.mapSize.width = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapHeight: {\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.' );\n\t\t\t\tthis.shadow.mapSize.height = value;\n\n\t\t\t}\n\t\t}\n\t} );\n\n\t//\n\n\tObject.defineProperties( BufferAttribute.prototype, {\n\n\t\tlength: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.BufferAttribute: .length has been deprecated. Use .count instead.' );\n\t\t\t\treturn this.array.length;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.assign( BufferGeometry.prototype, {\n\n\t\taddIndex: function ( index ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().' );\n\t\t\tthis.setIndex( index );\n\n\t\t},\n\t\taddDrawCall: function ( start, count, indexOffset ) {\n\n\t\t\tif ( indexOffset !== undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.' );\n\n\t\t\t}\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .addDrawCall() is now .addGroup().' );\n\t\t\tthis.addGroup( start, count );\n\n\t\t},\n\t\tclearDrawCalls: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().' );\n\t\t\tthis.clearGroups();\n\n\t\t},\n\t\tcomputeTangents: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeTangents() has been removed.' );\n\n\t\t},\n\t\tcomputeOffsets: function () {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry: .computeOffsets() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( BufferGeometry.prototype, {\n\n\t\tdrawcalls: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry: .drawcalls has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\n\t\t\t}\n\t\t},\n\t\toffsets: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.BufferGeometry: .offsets has been renamed to .groups.' );\n\t\t\t\treturn this.groups;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( Uniform.prototype, {\n\n\t\tdynamic: {\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.' );\n\n\t\t\t}\n\t\t},\n\t\tonUpdate: {\n\t\t\tvalue: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.' );\n\t\t\t\treturn this;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( Material.prototype, {\n\n\t\twrapAround: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Material: .wrapAround has been removed.' );\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Material: .wrapAround has been removed.' );\n\n\t\t\t}\n\t\t},\n\t\twrapRGB: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.Material: .wrapRGB has been removed.' );\n\t\t\t\treturn new Color();\n\n\t\t\t}\n\t\t},\n\n\t\tshading: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.error( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': .shading has been removed. Use the boolean .flatShading instead.' );\n\t\t\t\tthis.flatShading = ( value === FlatShading );\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( MeshPhongMaterial.prototype, {\n\n\t\tmetal: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.' );\n\t\t\t\treturn false;\n\n\t\t\t},\n\t\t\tset: function () {\n\n\t\t\t\tconsole.warn( 'THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead' );\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( ShaderMaterial.prototype, {\n\n\t\tderivatives: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\treturn this.extensions.derivatives;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.' );\n\t\t\t\tthis.extensions.derivatives = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.assign( WebGLRenderer.prototype, {\n\n\t\tgetCurrentRenderTarget: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().' );\n\t\t\treturn this.getRenderTarget();\n\n\t\t},\n\n\t\tgetMaxAnisotropy: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().' );\n\t\t\treturn this.capabilities.getMaxAnisotropy();\n\n\t\t},\n\n\t\tgetPrecision: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.' );\n\t\t\treturn this.capabilities.precision;\n\n\t\t},\n\n\t\tsupportsFloatTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( \\'OES_texture_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_float' );\n\n\t\t},\n\t\tsupportsHalfFloatTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( \\'OES_texture_half_float\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_texture_half_float' );\n\n\t\t},\n\t\tsupportsStandardDerivatives: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( \\'OES_standard_derivatives\\' ).' );\n\t\t\treturn this.extensions.get( 'OES_standard_derivatives' );\n\n\t\t},\n\t\tsupportsCompressedTextureS3TC: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( \\'WEBGL_compressed_texture_s3tc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t},\n\t\tsupportsCompressedTexturePVRTC: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( \\'WEBGL_compressed_texture_pvrtc\\' ).' );\n\t\t\treturn this.extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t},\n\t\tsupportsBlendMinMax: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( \\'EXT_blend_minmax\\' ).' );\n\t\t\treturn this.extensions.get( 'EXT_blend_minmax' );\n\n\t\t},\n\t\tsupportsVertexTextures: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.' );\n\t\t\treturn this.capabilities.vertexTextures;\n\n\t\t},\n\t\tsupportsInstancedArrays: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( \\'ANGLE_instanced_arrays\\' ).' );\n\t\t\treturn this.extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t},\n\t\tenableScissorTest: function ( boolean ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().' );\n\t\t\tthis.setScissorTest( boolean );\n\n\t\t},\n\t\tinitMaterial: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .initMaterial() has been removed.' );\n\n\t\t},\n\t\taddPrePlugin: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPrePlugin() has been removed.' );\n\n\t\t},\n\t\taddPostPlugin: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .addPostPlugin() has been removed.' );\n\n\t\t},\n\t\tupdateShadowMap: function () {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: .updateShadowMap() has been removed.' );\n\n\t\t}\n\n\t} );\n\n\tObject.defineProperties( WebGLRenderer.prototype, {\n\n\t\tshadowMapEnabled: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.enabled;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.' );\n\t\t\t\tthis.shadowMap.enabled = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapType: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.type;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.' );\n\t\t\t\tthis.shadowMap.type = value;\n\n\t\t\t}\n\t\t},\n\t\tshadowMapCullFace: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.shadowMap.cullFace;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: .shadowMapCullFace is now .shadowMap.cullFace.' );\n\t\t\t\tthis.shadowMap.cullFace = value;\n\n\t\t\t}\n\t\t}\n\t} );\n\n\tObject.defineProperties( WebGLShadowMap.prototype, {\n\n\t\tcullFace: {\n\t\t\tget: function () {\n\n\t\t\t\treturn this.renderReverseSided ? CullFaceFront : CullFaceBack;\n\n\t\t\t},\n\t\t\tset: function ( cullFace ) {\n\n\t\t\t\tvar value = ( cullFace !== CullFaceBack );\n\t\t\t\tconsole.warn( \"WebGLRenderer: .shadowMap.cullFace is deprecated. Set .shadowMap.renderReverseSided to \" + value + \".\" );\n\t\t\t\tthis.renderReverseSided = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tObject.defineProperties( WebGLRenderTarget.prototype, {\n\n\t\twrapS: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\treturn this.texture.wrapS;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.' );\n\t\t\t\tthis.texture.wrapS = value;\n\n\t\t\t}\n\t\t},\n\t\twrapT: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\treturn this.texture.wrapT;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.' );\n\t\t\t\tthis.texture.wrapT = value;\n\n\t\t\t}\n\t\t},\n\t\tmagFilter: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\treturn this.texture.magFilter;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.' );\n\t\t\t\tthis.texture.magFilter = value;\n\n\t\t\t}\n\t\t},\n\t\tminFilter: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\treturn this.texture.minFilter;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.' );\n\t\t\t\tthis.texture.minFilter = value;\n\n\t\t\t}\n\t\t},\n\t\tanisotropy: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\treturn this.texture.anisotropy;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.' );\n\t\t\t\tthis.texture.anisotropy = value;\n\n\t\t\t}\n\t\t},\n\t\toffset: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\treturn this.texture.offset;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .offset is now .texture.offset.' );\n\t\t\t\tthis.texture.offset = value;\n\n\t\t\t}\n\t\t},\n\t\trepeat: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\treturn this.texture.repeat;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .repeat is now .texture.repeat.' );\n\t\t\t\tthis.texture.repeat = value;\n\n\t\t\t}\n\t\t},\n\t\tformat: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\treturn this.texture.format;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .format is now .texture.format.' );\n\t\t\t\tthis.texture.format = value;\n\n\t\t\t}\n\t\t},\n\t\ttype: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\treturn this.texture.type;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .type is now .texture.type.' );\n\t\t\t\tthis.texture.type = value;\n\n\t\t\t}\n\t\t},\n\t\tgenerateMipmaps: {\n\t\t\tget: function () {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\treturn this.texture.generateMipmaps;\n\n\t\t\t},\n\t\t\tset: function ( value ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.' );\n\t\t\t\tthis.texture.generateMipmaps = value;\n\n\t\t\t}\n\t\t}\n\n\t} );\n\n\t//\n\n\tAudio.prototype.load = function ( file ) {\n\n\t\tconsole.warn( 'THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.' );\n\t\tvar scope = this;\n\t\tvar audioLoader = new AudioLoader();\n\t\taudioLoader.load( file, function ( buffer ) {\n\n\t\t\tscope.setBuffer( buffer );\n\n\t\t} );\n\t\treturn this;\n\n\t};\n\n\tAudioAnalyser.prototype.getData = function () {\n\n\t\tconsole.warn( 'THREE.AudioAnalyser: .getData() is now .getFrequencyData().' );\n\t\treturn this.getFrequencyData();\n\n\t};\n\n\t//\n\n\tCubeCamera.prototype.updateCubeMap = function ( renderer, scene ) {\n\n\t\tconsole.warn( 'THREE.CubeCamera: .updateCubeMap() is now .update().' );\n\t\treturn this.update( renderer, scene );\n\n\t};\n\n\t//\n\n\tvar GeometryUtils = {\n\n\t\tmerge: function ( geometry1, geometry2, materialIndexOffset ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.' );\n\t\t\tvar matrix;\n\n\t\t\tif ( geometry2.isMesh ) {\n\n\t\t\t\tgeometry2.matrixAutoUpdate && geometry2.updateMatrix();\n\n\t\t\t\tmatrix = geometry2.matrix;\n\t\t\t\tgeometry2 = geometry2.geometry;\n\n\t\t\t}\n\n\t\t\tgeometry1.merge( geometry2, matrix, materialIndexOffset );\n\n\t\t},\n\n\t\tcenter: function ( geometry ) {\n\n\t\t\tconsole.warn( 'THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.' );\n\t\t\treturn geometry.center();\n\n\t\t}\n\n\t};\n\n\tvar ImageUtils = {\n\n\t\tcrossOrigin: undefined,\n\n\t\tloadTexture: function ( url, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.' );\n\n\t\t\tvar loader = new TextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( url, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadTextureCube: function ( urls, mapping, onLoad, onError ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.' );\n\n\t\t\tvar loader = new CubeTextureLoader();\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tvar texture = loader.load( urls, onLoad, undefined, onError );\n\n\t\t\tif ( mapping ) texture.mapping = mapping;\n\n\t\t\treturn texture;\n\n\t\t},\n\n\t\tloadCompressedTexture: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t},\n\n\t\tloadCompressedTextureCube: function () {\n\n\t\t\tconsole.error( 'THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.' );\n\n\t\t}\n\n\t};\n\n\t//\n\n\tfunction Projector() {\n\n\t\tconsole.error( 'THREE.Projector has been moved to /examples/js/renderers/Projector.js.' );\n\n\t\tthis.projectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .projectVector() is now vector.project().' );\n\t\t\tvector.project( camera );\n\n\t\t};\n\n\t\tthis.unprojectVector = function ( vector, camera ) {\n\n\t\t\tconsole.warn( 'THREE.Projector: .unprojectVector() is now vector.unproject().' );\n\t\t\tvector.unproject( camera );\n\n\t\t};\n\n\t\tthis.pickingRay = function () {\n\n\t\t\tconsole.error( 'THREE.Projector: .pickingRay() is now raycaster.setFromCamera().' );\n\n\t\t};\n\n\t}\n\n\t//\n\n\tfunction CanvasRenderer() {\n\n\t\tconsole.error( 'THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js' );\n\n\t\tthis.domElement = document.createElementNS( 'http://www.w3.org/1999/xhtml', 'canvas' );\n\t\tthis.clear = function () {};\n\t\tthis.render = function () {};\n\t\tthis.setClearColor = function () {};\n\t\tthis.setSize = function () {};\n\n\t}\n\n\texports.WebGLRenderTargetCube = WebGLRenderTargetCube;\n\texports.WebGLRenderTarget = WebGLRenderTarget;\n\texports.WebGLRenderer = WebGLRenderer;\n\texports.ShaderLib = ShaderLib;\n\texports.UniformsLib = UniformsLib;\n\texports.UniformsUtils = UniformsUtils;\n\texports.ShaderChunk = ShaderChunk;\n\texports.FogExp2 = FogExp2;\n\texports.Fog = Fog;\n\texports.Scene = Scene;\n\texports.LensFlare = LensFlare;\n\texports.Sprite = Sprite;\n\texports.LOD = LOD;\n\texports.SkinnedMesh = SkinnedMesh;\n\texports.Skeleton = Skeleton;\n\texports.Bone = Bone;\n\texports.Mesh = Mesh;\n\texports.LineSegments = LineSegments;\n\texports.LineLoop = LineLoop;\n\texports.Line = Line;\n\texports.Points = Points;\n\texports.Group = Group;\n\texports.VideoTexture = VideoTexture;\n\texports.DataTexture = DataTexture;\n\texports.CompressedTexture = CompressedTexture;\n\texports.CubeTexture = CubeTexture;\n\texports.CanvasTexture = CanvasTexture;\n\texports.DepthTexture = DepthTexture;\n\texports.Texture = Texture;\n\texports.CompressedTextureLoader = CompressedTextureLoader;\n\texports.DataTextureLoader = DataTextureLoader;\n\texports.CubeTextureLoader = CubeTextureLoader;\n\texports.TextureLoader = TextureLoader;\n\texports.ObjectLoader = ObjectLoader;\n\texports.MaterialLoader = MaterialLoader;\n\texports.BufferGeometryLoader = BufferGeometryLoader;\n\texports.DefaultLoadingManager = DefaultLoadingManager;\n\texports.LoadingManager = LoadingManager;\n\texports.JSONLoader = JSONLoader;\n\texports.ImageLoader = ImageLoader;\n\texports.FontLoader = FontLoader;\n\texports.FileLoader = FileLoader;\n\texports.Loader = Loader;\n\texports.Cache = Cache;\n\texports.AudioLoader = AudioLoader;\n\texports.SpotLightShadow = SpotLightShadow;\n\texports.SpotLight = SpotLight;\n\texports.PointLight = PointLight;\n\texports.RectAreaLight = RectAreaLight;\n\texports.HemisphereLight = HemisphereLight;\n\texports.DirectionalLightShadow = DirectionalLightShadow;\n\texports.DirectionalLight = DirectionalLight;\n\texports.AmbientLight = AmbientLight;\n\texports.LightShadow = LightShadow;\n\texports.Light = Light;\n\texports.StereoCamera = StereoCamera;\n\texports.PerspectiveCamera = PerspectiveCamera;\n\texports.OrthographicCamera = OrthographicCamera;\n\texports.CubeCamera = CubeCamera;\n\texports.ArrayCamera = ArrayCamera;\n\texports.Camera = Camera;\n\texports.AudioListener = AudioListener;\n\texports.PositionalAudio = PositionalAudio;\n\texports.AudioContext = AudioContext;\n\texports.AudioAnalyser = AudioAnalyser;\n\texports.Audio = Audio;\n\texports.VectorKeyframeTrack = VectorKeyframeTrack;\n\texports.StringKeyframeTrack = StringKeyframeTrack;\n\texports.QuaternionKeyframeTrack = QuaternionKeyframeTrack;\n\texports.NumberKeyframeTrack = NumberKeyframeTrack;\n\texports.ColorKeyframeTrack = ColorKeyframeTrack;\n\texports.BooleanKeyframeTrack = BooleanKeyframeTrack;\n\texports.PropertyMixer = PropertyMixer;\n\texports.PropertyBinding = PropertyBinding;\n\texports.KeyframeTrack = KeyframeTrack;\n\texports.AnimationUtils = AnimationUtils;\n\texports.AnimationObjectGroup = AnimationObjectGroup;\n\texports.AnimationMixer = AnimationMixer;\n\texports.AnimationClip = AnimationClip;\n\texports.Uniform = Uniform;\n\texports.InstancedBufferGeometry = InstancedBufferGeometry;\n\texports.BufferGeometry = BufferGeometry;\n\texports.GeometryIdCount = GeometryIdCount;\n\texports.Geometry = Geometry;\n\texports.InterleavedBufferAttribute = InterleavedBufferAttribute;\n\texports.InstancedInterleavedBuffer = InstancedInterleavedBuffer;\n\texports.InterleavedBuffer = InterleavedBuffer;\n\texports.InstancedBufferAttribute = InstancedBufferAttribute;\n\texports.Face3 = Face3;\n\texports.Object3D = Object3D;\n\texports.Raycaster = Raycaster;\n\texports.Layers = Layers;\n\texports.EventDispatcher = EventDispatcher;\n\texports.Clock = Clock;\n\texports.QuaternionLinearInterpolant = QuaternionLinearInterpolant;\n\texports.LinearInterpolant = LinearInterpolant;\n\texports.DiscreteInterpolant = DiscreteInterpolant;\n\texports.CubicInterpolant = CubicInterpolant;\n\texports.Interpolant = Interpolant;\n\texports.Triangle = Triangle;\n\texports.Math = _Math;\n\texports.Spherical = Spherical;\n\texports.Cylindrical = Cylindrical;\n\texports.Plane = Plane;\n\texports.Frustum = Frustum;\n\texports.Sphere = Sphere;\n\texports.Ray = Ray;\n\texports.Matrix4 = Matrix4;\n\texports.Matrix3 = Matrix3;\n\texports.Box3 = Box3;\n\texports.Box2 = Box2;\n\texports.Line3 = Line3;\n\texports.Euler = Euler;\n\texports.Vector4 = Vector4;\n\texports.Vector3 = Vector3;\n\texports.Vector2 = Vector2;\n\texports.Quaternion = Quaternion;\n\texports.Color = Color;\n\texports.ImmediateRenderObject = ImmediateRenderObject;\n\texports.VertexNormalsHelper = VertexNormalsHelper;\n\texports.SpotLightHelper = SpotLightHelper;\n\texports.SkeletonHelper = SkeletonHelper;\n\texports.PointLightHelper = PointLightHelper;\n\texports.RectAreaLightHelper = RectAreaLightHelper;\n\texports.HemisphereLightHelper = HemisphereLightHelper;\n\texports.GridHelper = GridHelper;\n\texports.PolarGridHelper = PolarGridHelper;\n\texports.FaceNormalsHelper = FaceNormalsHelper;\n\texports.DirectionalLightHelper = DirectionalLightHelper;\n\texports.CameraHelper = CameraHelper;\n\texports.BoxHelper = BoxHelper;\n\texports.Box3Helper = Box3Helper;\n\texports.PlaneHelper = PlaneHelper;\n\texports.ArrowHelper = ArrowHelper;\n\texports.AxisHelper = AxisHelper;\n\texports.CatmullRomCurve3 = CatmullRomCurve3;\n\texports.CubicBezierCurve3 = CubicBezierCurve3;\n\texports.QuadraticBezierCurve3 = QuadraticBezierCurve3;\n\texports.LineCurve3 = LineCurve3;\n\texports.ArcCurve = ArcCurve;\n\texports.EllipseCurve = EllipseCurve;\n\texports.SplineCurve = SplineCurve;\n\texports.CubicBezierCurve = CubicBezierCurve;\n\texports.QuadraticBezierCurve = QuadraticBezierCurve;\n\texports.LineCurve = LineCurve;\n\texports.Shape = Shape;\n\texports.Path = Path;\n\texports.ShapePath = ShapePath;\n\texports.Font = Font;\n\texports.CurvePath = CurvePath;\n\texports.Curve = Curve;\n\texports.ShapeUtils = ShapeUtils;\n\texports.SceneUtils = SceneUtils;\n\texports.WebGLUtils = WebGLUtils;\n\texports.WireframeGeometry = WireframeGeometry;\n\texports.ParametricGeometry = ParametricGeometry;\n\texports.ParametricBufferGeometry = ParametricBufferGeometry;\n\texports.TetrahedronGeometry = TetrahedronGeometry;\n\texports.TetrahedronBufferGeometry = TetrahedronBufferGeometry;\n\texports.OctahedronGeometry = OctahedronGeometry;\n\texports.OctahedronBufferGeometry = OctahedronBufferGeometry;\n\texports.IcosahedronGeometry = IcosahedronGeometry;\n\texports.IcosahedronBufferGeometry = IcosahedronBufferGeometry;\n\texports.DodecahedronGeometry = DodecahedronGeometry;\n\texports.DodecahedronBufferGeometry = DodecahedronBufferGeometry;\n\texports.PolyhedronGeometry = PolyhedronGeometry;\n\texports.PolyhedronBufferGeometry = PolyhedronBufferGeometry;\n\texports.TubeGeometry = TubeGeometry;\n\texports.TubeBufferGeometry = TubeBufferGeometry;\n\texports.TorusKnotGeometry = TorusKnotGeometry;\n\texports.TorusKnotBufferGeometry = TorusKnotBufferGeometry;\n\texports.TorusGeometry = TorusGeometry;\n\texports.TorusBufferGeometry = TorusBufferGeometry;\n\texports.TextGeometry = TextGeometry;\n\texports.TextBufferGeometry = TextBufferGeometry;\n\texports.SphereGeometry = SphereGeometry;\n\texports.SphereBufferGeometry = SphereBufferGeometry;\n\texports.RingGeometry = RingGeometry;\n\texports.RingBufferGeometry = RingBufferGeometry;\n\texports.PlaneGeometry = PlaneGeometry;\n\texports.PlaneBufferGeometry = PlaneBufferGeometry;\n\texports.LatheGeometry = LatheGeometry;\n\texports.LatheBufferGeometry = LatheBufferGeometry;\n\texports.ShapeGeometry = ShapeGeometry;\n\texports.ShapeBufferGeometry = ShapeBufferGeometry;\n\texports.ExtrudeGeometry = ExtrudeGeometry;\n\texports.ExtrudeBufferGeometry = ExtrudeBufferGeometry;\n\texports.EdgesGeometry = EdgesGeometry;\n\texports.ConeGeometry = ConeGeometry;\n\texports.ConeBufferGeometry = ConeBufferGeometry;\n\texports.CylinderGeometry = CylinderGeometry;\n\texports.CylinderBufferGeometry = CylinderBufferGeometry;\n\texports.CircleGeometry = CircleGeometry;\n\texports.CircleBufferGeometry = CircleBufferGeometry;\n\texports.BoxGeometry = BoxGeometry;\n\texports.BoxBufferGeometry = BoxBufferGeometry;\n\texports.ShadowMaterial = ShadowMaterial;\n\texports.SpriteMaterial = SpriteMaterial;\n\texports.RawShaderMaterial = RawShaderMaterial;\n\texports.ShaderMaterial = ShaderMaterial;\n\texports.PointsMaterial = PointsMaterial;\n\texports.MeshPhysicalMaterial = MeshPhysicalMaterial;\n\texports.MeshStandardMaterial = MeshStandardMaterial;\n\texports.MeshPhongMaterial = MeshPhongMaterial;\n\texports.MeshToonMaterial = MeshToonMaterial;\n\texports.MeshNormalMaterial = MeshNormalMaterial;\n\texports.MeshLambertMaterial = MeshLambertMaterial;\n\texports.MeshDepthMaterial = MeshDepthMaterial;\n\texports.MeshDistanceMaterial = MeshDistanceMaterial;\n\texports.MeshBasicMaterial = MeshBasicMaterial;\n\texports.LineDashedMaterial = LineDashedMaterial;\n\texports.LineBasicMaterial = LineBasicMaterial;\n\texports.Material = Material;\n\texports.Float64BufferAttribute = Float64BufferAttribute;\n\texports.Float32BufferAttribute = Float32BufferAttribute;\n\texports.Uint32BufferAttribute = Uint32BufferAttribute;\n\texports.Int32BufferAttribute = Int32BufferAttribute;\n\texports.Uint16BufferAttribute = Uint16BufferAttribute;\n\texports.Int16BufferAttribute = Int16BufferAttribute;\n\texports.Uint8ClampedBufferAttribute = Uint8ClampedBufferAttribute;\n\texports.Uint8BufferAttribute = Uint8BufferAttribute;\n\texports.Int8BufferAttribute = Int8BufferAttribute;\n\texports.BufferAttribute = BufferAttribute;\n\texports.REVISION = REVISION;\n\texports.MOUSE = MOUSE;\n\texports.CullFaceNone = CullFaceNone;\n\texports.CullFaceBack = CullFaceBack;\n\texports.CullFaceFront = CullFaceFront;\n\texports.CullFaceFrontBack = CullFaceFrontBack;\n\texports.FrontFaceDirectionCW = FrontFaceDirectionCW;\n\texports.FrontFaceDirectionCCW = FrontFaceDirectionCCW;\n\texports.BasicShadowMap = BasicShadowMap;\n\texports.PCFShadowMap = PCFShadowMap;\n\texports.PCFSoftShadowMap = PCFSoftShadowMap;\n\texports.FrontSide = FrontSide;\n\texports.BackSide = BackSide;\n\texports.DoubleSide = DoubleSide;\n\texports.FlatShading = FlatShading;\n\texports.SmoothShading = SmoothShading;\n\texports.NoColors = NoColors;\n\texports.FaceColors = FaceColors;\n\texports.VertexColors = VertexColors;\n\texports.NoBlending = NoBlending;\n\texports.NormalBlending = NormalBlending;\n\texports.AdditiveBlending = AdditiveBlending;\n\texports.SubtractiveBlending = SubtractiveBlending;\n\texports.MultiplyBlending = MultiplyBlending;\n\texports.CustomBlending = CustomBlending;\n\texports.AddEquation = AddEquation;\n\texports.SubtractEquation = SubtractEquation;\n\texports.ReverseSubtractEquation = ReverseSubtractEquation;\n\texports.MinEquation = MinEquation;\n\texports.MaxEquation = MaxEquation;\n\texports.ZeroFactor = ZeroFactor;\n\texports.OneFactor = OneFactor;\n\texports.SrcColorFactor = SrcColorFactor;\n\texports.OneMinusSrcColorFactor = OneMinusSrcColorFactor;\n\texports.SrcAlphaFactor = SrcAlphaFactor;\n\texports.OneMinusSrcAlphaFactor = OneMinusSrcAlphaFactor;\n\texports.DstAlphaFactor = DstAlphaFactor;\n\texports.OneMinusDstAlphaFactor = OneMinusDstAlphaFactor;\n\texports.DstColorFactor = DstColorFactor;\n\texports.OneMinusDstColorFactor = OneMinusDstColorFactor;\n\texports.SrcAlphaSaturateFactor = SrcAlphaSaturateFactor;\n\texports.NeverDepth = NeverDepth;\n\texports.AlwaysDepth = AlwaysDepth;\n\texports.LessDepth = LessDepth;\n\texports.LessEqualDepth = LessEqualDepth;\n\texports.EqualDepth = EqualDepth;\n\texports.GreaterEqualDepth = GreaterEqualDepth;\n\texports.GreaterDepth = GreaterDepth;\n\texports.NotEqualDepth = NotEqualDepth;\n\texports.MultiplyOperation = MultiplyOperation;\n\texports.MixOperation = MixOperation;\n\texports.AddOperation = AddOperation;\n\texports.NoToneMapping = NoToneMapping;\n\texports.LinearToneMapping = LinearToneMapping;\n\texports.ReinhardToneMapping = ReinhardToneMapping;\n\texports.Uncharted2ToneMapping = Uncharted2ToneMapping;\n\texports.CineonToneMapping = CineonToneMapping;\n\texports.UVMapping = UVMapping;\n\texports.CubeReflectionMapping = CubeReflectionMapping;\n\texports.CubeRefractionMapping = CubeRefractionMapping;\n\texports.EquirectangularReflectionMapping = EquirectangularReflectionMapping;\n\texports.EquirectangularRefractionMapping = EquirectangularRefractionMapping;\n\texports.SphericalReflectionMapping = SphericalReflectionMapping;\n\texports.CubeUVReflectionMapping = CubeUVReflectionMapping;\n\texports.CubeUVRefractionMapping = CubeUVRefractionMapping;\n\texports.RepeatWrapping = RepeatWrapping;\n\texports.ClampToEdgeWrapping = ClampToEdgeWrapping;\n\texports.MirroredRepeatWrapping = MirroredRepeatWrapping;\n\texports.NearestFilter = NearestFilter;\n\texports.NearestMipMapNearestFilter = NearestMipMapNearestFilter;\n\texports.NearestMipMapLinearFilter = NearestMipMapLinearFilter;\n\texports.LinearFilter = LinearFilter;\n\texports.LinearMipMapNearestFilter = LinearMipMapNearestFilter;\n\texports.LinearMipMapLinearFilter = LinearMipMapLinearFilter;\n\texports.UnsignedByteType = UnsignedByteType;\n\texports.ByteType = ByteType;\n\texports.ShortType = ShortType;\n\texports.UnsignedShortType = UnsignedShortType;\n\texports.IntType = IntType;\n\texports.UnsignedIntType = UnsignedIntType;\n\texports.FloatType = FloatType;\n\texports.HalfFloatType = HalfFloatType;\n\texports.UnsignedShort4444Type = UnsignedShort4444Type;\n\texports.UnsignedShort5551Type = UnsignedShort5551Type;\n\texports.UnsignedShort565Type = UnsignedShort565Type;\n\texports.UnsignedInt248Type = UnsignedInt248Type;\n\texports.AlphaFormat = AlphaFormat;\n\texports.RGBFormat = RGBFormat;\n\texports.RGBAFormat = RGBAFormat;\n\texports.LuminanceFormat = LuminanceFormat;\n\texports.LuminanceAlphaFormat = LuminanceAlphaFormat;\n\texports.RGBEFormat = RGBEFormat;\n\texports.DepthFormat = DepthFormat;\n\texports.DepthStencilFormat = DepthStencilFormat;\n\texports.RGB_S3TC_DXT1_Format = RGB_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT1_Format = RGBA_S3TC_DXT1_Format;\n\texports.RGBA_S3TC_DXT3_Format = RGBA_S3TC_DXT3_Format;\n\texports.RGBA_S3TC_DXT5_Format = RGBA_S3TC_DXT5_Format;\n\texports.RGB_PVRTC_4BPPV1_Format = RGB_PVRTC_4BPPV1_Format;\n\texports.RGB_PVRTC_2BPPV1_Format = RGB_PVRTC_2BPPV1_Format;\n\texports.RGBA_PVRTC_4BPPV1_Format = RGBA_PVRTC_4BPPV1_Format;\n\texports.RGBA_PVRTC_2BPPV1_Format = RGBA_PVRTC_2BPPV1_Format;\n\texports.RGB_ETC1_Format = RGB_ETC1_Format;\n\texports.LoopOnce = LoopOnce;\n\texports.LoopRepeat = LoopRepeat;\n\texports.LoopPingPong = LoopPingPong;\n\texports.InterpolateDiscrete = InterpolateDiscrete;\n\texports.InterpolateLinear = InterpolateLinear;\n\texports.InterpolateSmooth = InterpolateSmooth;\n\texports.ZeroCurvatureEnding = ZeroCurvatureEnding;\n\texports.ZeroSlopeEnding = ZeroSlopeEnding;\n\texports.WrapAroundEnding = WrapAroundEnding;\n\texports.TrianglesDrawMode = TrianglesDrawMode;\n\texports.TriangleStripDrawMode = TriangleStripDrawMode;\n\texports.TriangleFanDrawMode = TriangleFanDrawMode;\n\texports.LinearEncoding = LinearEncoding;\n\texports.sRGBEncoding = sRGBEncoding;\n\texports.GammaEncoding = GammaEncoding;\n\texports.RGBEEncoding = RGBEEncoding;\n\texports.LogLuvEncoding = LogLuvEncoding;\n\texports.RGBM7Encoding = RGBM7Encoding;\n\texports.RGBM16Encoding = RGBM16Encoding;\n\texports.RGBDEncoding = RGBDEncoding;\n\texports.BasicDepthPacking = BasicDepthPacking;\n\texports.RGBADepthPacking = RGBADepthPacking;\n\texports.CubeGeometry = BoxGeometry;\n\texports.Face4 = Face4;\n\texports.LineStrip = LineStrip;\n\texports.LinePieces = LinePieces;\n\texports.MeshFaceMaterial = MeshFaceMaterial;\n\texports.MultiMaterial = MultiMaterial;\n\texports.PointCloud = PointCloud;\n\texports.Particle = Particle;\n\texports.ParticleSystem = ParticleSystem;\n\texports.PointCloudMaterial = PointCloudMaterial;\n\texports.ParticleBasicMaterial = ParticleBasicMaterial;\n\texports.ParticleSystemMaterial = ParticleSystemMaterial;\n\texports.Vertex = Vertex;\n\texports.DynamicBufferAttribute = DynamicBufferAttribute;\n\texports.Int8Attribute = Int8Attribute;\n\texports.Uint8Attribute = Uint8Attribute;\n\texports.Uint8ClampedAttribute = Uint8ClampedAttribute;\n\texports.Int16Attribute = Int16Attribute;\n\texports.Uint16Attribute = Uint16Attribute;\n\texports.Int32Attribute = Int32Attribute;\n\texports.Uint32Attribute = Uint32Attribute;\n\texports.Float32Attribute = Float32Attribute;\n\texports.Float64Attribute = Float64Attribute;\n\texports.ClosedSplineCurve3 = ClosedSplineCurve3;\n\texports.SplineCurve3 = SplineCurve3;\n\texports.Spline = Spline;\n\texports.BoundingBoxHelper = BoundingBoxHelper;\n\texports.EdgesHelper = EdgesHelper;\n\texports.WireframeHelper = WireframeHelper;\n\texports.XHRLoader = XHRLoader;\n\texports.BinaryTextureLoader = BinaryTextureLoader;\n\texports.GeometryUtils = GeometryUtils;\n\texports.ImageUtils = ImageUtils;\n\texports.Projector = Projector;\n\texports.CanvasRenderer = CanvasRenderer;\n\n\tObject.defineProperty(exports, '__esModule', { value: true });\n\n})));\n"
  },
  {
    "path": "browser/vendor/toji/webgl-utils/LICENSE.md",
    "content": "Copyright (c) 2016 Brandon Jones\n\nThis software is provided 'as-is', without any express or implied\nwarranty. In no event will the authors be held liable for any damages\narising from the use of this software.\n\nPermission is granted to anyone to use this software for any purpose,\nincluding commercial applications, and to alter it and redistribute it\nfreely, subject to the following restrictions:\n\n 1. The origin of this software must not be misrepresented; you must not\n    claim that you wrote the original software. If you use this software\n    in a product, an acknowledgment in the product documentation would be\n    appreciated but is not required.\n\n 2. Altered source versions must be plainly marked as such, and must not\n    be misrepresented as being the original software.\n\n 3. This notice may not be removed or altered from any source distribution."
  },
  {
    "path": "browser/vendor/toji/webgl-utils/src/wglu-stats.js",
    "content": "/*\nCopyright (c) 2016, Brandon Jones.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n\n/*\nHeavily inspired by Mr. Doobs stats.js, this FPS counter is rendered completely\nwith WebGL, allowing it to be shown in cases where overlaid HTML elements aren't\nusable (like WebVR), or if you want the FPS counter to be rendered as part of\nyour scene.\n\nSee stats-test.html for basic usage.\n*/\nvar WGLUStats = (function() {\n\n  \"use strict\";\n\n  //--------------------\n  // glMatrix functions\n  //--------------------\n\n  // These functions have been copied here from glMatrix (glmatrix.net) to allow\n  // this file to run standalone.\n\n  var mat4_identity = function(out) {\n      out[0] = 1;\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n      out[4] = 0;\n      out[5] = 1;\n      out[6] = 0;\n      out[7] = 0;\n      out[8] = 0;\n      out[9] = 0;\n      out[10] = 1;\n      out[11] = 0;\n      out[12] = 0;\n      out[13] = 0;\n      out[14] = 0;\n      out[15] = 1;\n      return out;\n  };\n\n  var mat4_multiply = function (out, a, b) {\n      var a00 = a[0], a01 = a[1], a02 = a[2], a03 = a[3],\n          a10 = a[4], a11 = a[5], a12 = a[6], a13 = a[7],\n          a20 = a[8], a21 = a[9], a22 = a[10], a23 = a[11],\n          a30 = a[12], a31 = a[13], a32 = a[14], a33 = a[15];\n\n      // Cache only the current line of the second matrix\n      var b0  = b[0], b1 = b[1], b2 = b[2], b3 = b[3];\n      out[0] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n      out[1] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n      out[2] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n      out[3] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n\n      b0 = b[4]; b1 = b[5]; b2 = b[6]; b3 = b[7];\n      out[4] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n      out[5] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n      out[6] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n      out[7] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n\n      b0 = b[8]; b1 = b[9]; b2 = b[10]; b3 = b[11];\n      out[8] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n      out[9] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n      out[10] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n      out[11] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n\n      b0 = b[12]; b1 = b[13]; b2 = b[14]; b3 = b[15];\n      out[12] = b0*a00 + b1*a10 + b2*a20 + b3*a30;\n      out[13] = b0*a01 + b1*a11 + b2*a21 + b3*a31;\n      out[14] = b0*a02 + b1*a12 + b2*a22 + b3*a32;\n      out[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33;\n      return out;\n  };\n\n  var mat4_fromTranslation = function(out, v) {\n      out[0] = 1;\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n      out[4] = 0;\n      out[5] = 1;\n      out[6] = 0;\n      out[7] = 0;\n      out[8] = 0;\n      out[9] = 0;\n      out[10] = 1;\n      out[11] = 0;\n      out[12] = v[0];\n      out[13] = v[1];\n      out[14] = v[2];\n      out[15] = 1;\n      return out;\n  };\n\n  var mat4_ortho = function (out, left, right, bottom, top, near, far) {\n      var lr = 1 / (left - right),\n          bt = 1 / (bottom - top),\n          nf = 1 / (near - far);\n      out[0] = -2 * lr;\n      out[1] = 0;\n      out[2] = 0;\n      out[3] = 0;\n      out[4] = 0;\n      out[5] = -2 * bt;\n      out[6] = 0;\n      out[7] = 0;\n      out[8] = 0;\n      out[9] = 0;\n      out[10] = 2 * nf;\n      out[11] = 0;\n      out[12] = (left + right) * lr;\n      out[13] = (top + bottom) * bt;\n      out[14] = (far + near) * nf;\n      out[15] = 1;\n      return out;\n  };\n\n  var mat4_translate = function (out, a, v) {\n      var x = v[0], y = v[1], z = v[2],\n          a00, a01, a02, a03,\n          a10, a11, a12, a13,\n          a20, a21, a22, a23;\n\n      if (a === out) {\n          out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n          out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n          out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n          out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n      } else {\n          a00 = a[0]; a01 = a[1]; a02 = a[2]; a03 = a[3];\n          a10 = a[4]; a11 = a[5]; a12 = a[6]; a13 = a[7];\n          a20 = a[8]; a21 = a[9]; a22 = a[10]; a23 = a[11];\n\n          out[0] = a00; out[1] = a01; out[2] = a02; out[3] = a03;\n          out[4] = a10; out[5] = a11; out[6] = a12; out[7] = a13;\n          out[8] = a20; out[9] = a21; out[10] = a22; out[11] = a23;\n\n          out[12] = a00 * x + a10 * y + a20 * z + a[12];\n          out[13] = a01 * x + a11 * y + a21 * z + a[13];\n          out[14] = a02 * x + a12 * y + a22 * z + a[14];\n          out[15] = a03 * x + a13 * y + a23 * z + a[15];\n      }\n\n      return out;\n  };\n\n  var mat4_scale = function(out, a, v) {\n      var x = v[0], y = v[1], z = v[2];\n\n      out[0] = a[0] * x;\n      out[1] = a[1] * x;\n      out[2] = a[2] * x;\n      out[3] = a[3] * x;\n      out[4] = a[4] * y;\n      out[5] = a[5] * y;\n      out[6] = a[6] * y;\n      out[7] = a[7] * y;\n      out[8] = a[8] * z;\n      out[9] = a[9] * z;\n      out[10] = a[10] * z;\n      out[11] = a[11] * z;\n      out[12] = a[12];\n      out[13] = a[13];\n      out[14] = a[14];\n      out[15] = a[15];\n      return out;\n  };\n\n  //-------------------\n  // Utility functions\n  //-------------------\n\n  function linkProgram(gl, vertexSource, fragmentSource, attribLocationMap) {\n    // No error checking for brevity.\n    var vertexShader = gl.createShader(gl.VERTEX_SHADER);\n    gl.shaderSource(vertexShader, vertexSource);\n    gl.compileShader(vertexShader);\n\n    var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);\n    gl.shaderSource(fragmentShader, fragmentSource);\n    gl.compileShader(fragmentShader);\n\n    var program = gl.createProgram();\n    gl.attachShader(program, vertexShader);\n    gl.attachShader(program, fragmentShader);\n\n    for (var attribName in attribLocationMap)\n      gl.bindAttribLocation(program, attribLocationMap[attribName], attribName);\n\n    gl.linkProgram(program);\n\n    gl.deleteShader(vertexShader);\n    gl.deleteShader(fragmentShader);\n\n    return program;\n  }\n\n  function getProgramUniforms(gl, program) {\n    var uniforms = {};\n    var uniformCount = gl.getProgramParameter(program, gl.ACTIVE_UNIFORMS);\n    var uniformName = \"\";\n    for (var i = 0; i < uniformCount; i++) {\n      var uniformInfo = gl.getActiveUniform(program, i);\n      uniformName = uniformInfo.name.replace(\"[0]\", \"\");\n      uniforms[uniformName] = gl.getUniformLocation(program, uniformName);\n    }\n    return uniforms;\n  }\n\n  //----------------------------\n  // Seven-segment text display\n  //----------------------------\n\n  var sevenSegmentVS = [\n    \"uniform mat4 projectionMat;\",\n    \"uniform mat4 modelViewMat;\",\n    \"attribute vec2 position;\",\n\n    \"void main() {\",\n    \"  gl_Position = projectionMat * modelViewMat * vec4( position, 0.0, 1.0 );\",\n    \"}\",\n  ].join(\"\\n\");\n\n  var sevenSegmentFS = [\n    \"precision mediump float;\",\n    \"uniform vec4 color;\",\n\n    \"void main() {\",\n    \"  gl_FragColor = color;\",\n    \"}\",\n  ].join(\"\\n\");\n\n  var SevenSegmentText = function (gl) {\n    this.gl = gl;\n\n    this.attribs = {\n      position: 0,\n      color: 1\n    };\n\n    this.program = linkProgram(gl, sevenSegmentVS, sevenSegmentFS, this.attribs);\n    this.uniforms = getProgramUniforms(gl, this.program);\n\n    var verts = [];\n    var segmentIndices = {};\n    var indices = [];\n\n    var width = 0.5;\n    var thickness = 0.25;\n    this.kerning = 2.0;\n\n    this.matrix = new Float32Array(16);\n\n    function defineSegment(id, left, top, right, bottom) {\n      var idx = verts.length / 2;\n      verts.push(\n          left, top,\n          right, top,\n          right, bottom,\n          left, bottom);\n\n      segmentIndices[id] = [\n          idx, idx+2, idx+1,\n          idx, idx+3, idx+2];\n    }\n\n    var characters = {};\n    this.characters = characters;\n\n    function defineCharacter(c, segments) {\n      var character = {\n        character: c,\n        offset: indices.length * 2,\n        count: 0\n      };\n\n      for (var i = 0; i < segments.length; ++i) {\n        var idx = segments[i];\n        var segment = segmentIndices[idx];\n        character.count += segment.length;\n        indices.push.apply(indices, segment);\n      }\n\n      characters[c] = character;\n    }\n\n    /* Segment layout is as follows:\n\n    |-0-|\n    3   4\n    |-1-|\n    5   6\n    |-2-|\n\n    */\n\n    defineSegment(0, -1, 1, width, 1-thickness);\n    defineSegment(1, -1, thickness*0.5, width, -thickness*0.5);\n    defineSegment(2, -1, -1+thickness, width, -1);\n    defineSegment(3, -1, 1, -1+thickness, -thickness*0.5);\n    defineSegment(4, width-thickness, 1, width, -thickness*0.5);\n    defineSegment(5, -1, thickness*0.5, -1+thickness, -1);\n    defineSegment(6, width-thickness, thickness*0.5, width, -1);\n\n\n    defineCharacter(\"0\", [0, 2, 3, 4, 5, 6]);\n    defineCharacter(\"1\", [4, 6]);\n    defineCharacter(\"2\", [0, 1, 2, 4, 5]);\n    defineCharacter(\"3\", [0, 1, 2, 4, 6]);\n    defineCharacter(\"4\", [1, 3, 4, 6]);\n    defineCharacter(\"5\", [0, 1, 2, 3, 6]);\n    defineCharacter(\"6\", [0, 1, 2, 3, 5, 6]);\n    defineCharacter(\"7\", [0, 4, 6]);\n    defineCharacter(\"8\", [0, 1, 2, 3, 4, 5, 6]);\n    defineCharacter(\"9\", [0, 1, 2, 3, 4, 6]);\n    defineCharacter(\"A\", [0, 1, 3, 4, 5, 6]);\n    defineCharacter(\"B\", [1, 2, 3, 5, 6]);\n    defineCharacter(\"C\", [0, 2, 3, 5]);\n    defineCharacter(\"D\", [1, 2, 4, 5, 6]);\n    defineCharacter(\"E\", [0, 1, 2, 4, 6]);\n    defineCharacter(\"F\", [0, 1, 3, 5]);\n    defineCharacter(\"P\", [0, 1, 3, 4, 5]);\n    defineCharacter(\"-\", [1]);\n    defineCharacter(\" \", []);\n    defineCharacter(\"_\", [2]); // Used for undefined characters\n\n    this.vertBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.vertBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(verts), gl.DYNAMIC_DRAW);\n\n    this.indexBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(indices), gl.STATIC_DRAW);\n  };\n\n  SevenSegmentText.prototype.render = function(projectionMat, modelViewMat, text, r, g, b, a) {\n    var gl = this.gl;\n\n    if (r == undefined || g == undefined || b == undefined) {\n      r = 0.0;\n      g = 1.0;\n      b = 0.0;\n    }\n\n    if (a == undefined)\n      a = 1.0;\n\n    gl.useProgram(this.program);\n\n    gl.uniformMatrix4fv(this.uniforms.projectionMat, false, projectionMat);\n    gl.uniform4f(this.uniforms.color, r, g, b, a);\n\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.vertBuffer);\n    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.indexBuffer);\n\n    gl.enableVertexAttribArray(this.attribs.position);\n    gl.vertexAttribPointer(this.attribs.position, 2, gl.FLOAT, false, 8, 0);\n\n    text = text.toUpperCase();\n\n    var offset = 0;\n\n    for (var i = 0; i < text.length; ++i) {\n      var c;\n      if (text[i] in this.characters) {\n        c = this.characters[text[i]];\n      } else {\n        c = this.characters[\"_\"];\n      }\n\n      if (c.count != 0) {\n        mat4_fromTranslation(this.matrix, [offset, 0, 0]);\n        mat4_multiply(this.matrix, modelViewMat, this.matrix);\n\n        gl.uniformMatrix4fv(this.uniforms.modelViewMat, false, this.matrix);\n        gl.drawElements(gl.TRIANGLES, c.count, gl.UNSIGNED_SHORT, c.offset);\n\n      }\n\n      offset += this.kerning;\n    }\n  }\n\n  //-----------\n  // FPS Graph\n  //-----------\n\n  var statsVS = [\n    \"uniform mat4 projectionMat;\",\n    \"uniform mat4 modelViewMat;\",\n    \"attribute vec3 position;\",\n    \"attribute vec3 color;\",\n    \"varying vec4 vColor;\",\n\n    \"void main() {\",\n    \"  vColor = vec4(color, 1.0);\",\n    \"  gl_Position = projectionMat * modelViewMat * vec4( position, 1.0 );\",\n    \"}\",\n  ].join(\"\\n\");\n\n  var statsFS = [\n    \"precision mediump float;\",\n    \"varying vec4 vColor;\",\n\n    \"void main() {\",\n    \"  gl_FragColor = vColor;\",\n    \"}\",\n  ].join(\"\\n\");\n\n  var segments = 30;\n  var maxFPS = 90;\n\n  function segmentToX(i) {\n    return ((0.9/segments) * i) - 0.45;\n  }\n\n  function fpsToY(value) {\n    return (Math.min(value, maxFPS) * (0.7 / maxFPS)) - 0.45;\n  }\n\n  function fpsToRGB(value) {\n    return {\n      r: Math.max(0.0, Math.min(1.0, 1.0 - (value/60))),\n      g: Math.max(0.0, Math.min(1.0, ((value-15)/(maxFPS-15)))),\n      b: Math.max(0.0, Math.min(1.0, ((value-15)/(maxFPS-15))))\n    };\n  }\n\n  var now = ( typeof performance !== 'undefined' && performance.now ) ? performance.now.bind( performance ) : Date.now;\n\n  var Stats = function(gl) {\n    this.gl = gl;\n\n    this.sevenSegmentText = new SevenSegmentText(gl);\n\n    this.startTime = now();\n    this.prevTime = this.startTime;\n    this.frames = 0;\n    this.fps = 0;\n\n    this.orthoProjMatrix = new Float32Array(16);\n    this.orthoViewMatrix = new Float32Array(16);\n    this.modelViewMatrix = new Float32Array(16);\n\n    // Hard coded because it doesn't change:\n    // Scale by 0.075 in X and Y\n    // Translate into upper left corner w/ z = 0.02\n    this.textMatrix = new Float32Array([\n      0.075, 0, 0, 0,\n      0, 0.075, 0, 0,\n      0, 0, 1, 0,\n      -0.3625, 0.3625, 0.02, 1\n    ]);\n\n    this.lastSegment = 0;\n\n    this.attribs = {\n      position: 0,\n      color: 1\n    };\n\n    this.program = linkProgram(gl, statsVS, statsFS, this.attribs);\n    this.uniforms = getProgramUniforms(gl, this.program);\n\n    var fpsVerts = [];\n    var fpsIndices = [];\n\n    // Graph geometry\n    for (var i = 0; i < segments; ++i) {\n      // Bar top\n      fpsVerts.push(segmentToX(i), fpsToY(0), 0.02, 0.0, 1.0, 1.0);\n      fpsVerts.push(segmentToX(i+1), fpsToY(0), 0.02, 0.0, 1.0, 1.0);\n\n      // Bar bottom\n      fpsVerts.push(segmentToX(i), fpsToY(0), 0.02, 0.0, 1.0, 1.0);\n      fpsVerts.push(segmentToX(i+1), fpsToY(0), 0.02, 0.0, 1.0, 1.0);\n\n      var idx = i * 4;\n      fpsIndices.push(idx, idx+3, idx+1,\n                      idx+3, idx, idx+2);\n    }\n\n    function addBGSquare(left, bottom, right, top, z, r, g, b) {\n      var idx = fpsVerts.length / 6;\n\n      fpsVerts.push(left, bottom, z, r, g, b);\n      fpsVerts.push(right, top, z, r, g, b);\n      fpsVerts.push(left, top, z, r, g, b);\n      fpsVerts.push(right, bottom, z, r, g, b);\n\n      fpsIndices.push(idx, idx+1, idx+2,\n                     idx, idx+3, idx+1);\n    };\n\n    // Panel Background\n    addBGSquare(-0.5, -0.5, 0.5, 0.5, 0.0, 0.0, 0.0, 0.125);\n\n    // FPS Background\n    addBGSquare(-0.45, -0.45, 0.45, 0.25, 0.01, 0.0, 0.0, 0.4);\n\n    // 30 FPS line\n    addBGSquare(-0.45, fpsToY(30), 0.45, fpsToY(32), 0.015, 0.5, 0.0, 0.5);\n\n    // 60 FPS line\n    addBGSquare(-0.45, fpsToY(60), 0.45, fpsToY(62), 0.015, 0.2, 0.0, 0.75);\n\n    this.fpsVertBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.fpsVertBuffer);\n    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(fpsVerts), gl.DYNAMIC_DRAW);\n\n    this.fpsIndexBuffer = gl.createBuffer();\n    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.fpsIndexBuffer);\n    gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, new Uint16Array(fpsIndices), gl.STATIC_DRAW);\n\n    this.fpsIndexCount = fpsIndices.length;\n  };\n\n  Stats.prototype.begin = function() {\n    this.startTime = now();\n  };\n\n  Stats.prototype.end = function() {\n    var time = now();\n\n    this.frames++;\n\n    if (time > this.prevTime + 250) {\n      this.fps = Math.round((this.frames * 1000) / (time - this.prevTime));\n\n      this.updateGraph(this.fps);\n\n      this.prevTime = time;\n      this.frames = 0;\n    }\n  };\n\n  Stats.prototype.updateGraph = function(value) {\n    var gl = this.gl;\n\n    var color = fpsToRGB(value);\n\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.fpsVertBuffer);\n\n    // Update the current segment with the new FPS value\n    var updateVerts = [\n      segmentToX(this.lastSegment), fpsToY(value), 0.02, color.r, color.g, color.b,\n      segmentToX(this.lastSegment+1), fpsToY(value), 0.02, color.r, color.g, color.b,\n      segmentToX(this.lastSegment), fpsToY(0), 0.02, color.r, color.g, color.b,\n      segmentToX(this.lastSegment+1), fpsToY(0), 0.02, color.r, color.g, color.b,\n    ];\n\n    // Re-shape the next segment into the green \"progress\" line\n    color.r = 0.2;\n    color.g = 1.0;\n    color.b = 0.2;\n\n    if (this.lastSegment == segments - 1) {\n      // If we're updating the last segment we need to do two bufferSubDatas\n      // to update the segment and turn the first segment into the progress line.\n      gl.bufferSubData(gl.ARRAY_BUFFER, this.lastSegment * 24 * 4, new Float32Array(updateVerts));\n      updateVerts = [\n        segmentToX(0), fpsToY(maxFPS), 0.02, color.r, color.g, color.b,\n        segmentToX(.25), fpsToY(maxFPS), 0.02, color.r, color.g, color.b,\n        segmentToX(0), fpsToY(0), 0.02, color.r, color.g, color.b,\n        segmentToX(.25), fpsToY(0), 0.02, color.r, color.g, color.b\n      ];\n      gl.bufferSubData(gl.ARRAY_BUFFER, 0, new Float32Array(updateVerts));\n    } else {\n      updateVerts.push(\n        segmentToX(this.lastSegment+1), fpsToY(maxFPS), 0.02, color.r, color.g, color.b,\n        segmentToX(this.lastSegment+1.25), fpsToY(maxFPS), 0.02, color.r, color.g, color.b,\n        segmentToX(this.lastSegment+1), fpsToY(0), 0.02, color.r, color.g, color.b,\n        segmentToX(this.lastSegment+1.25), fpsToY(0), 0.02, color.r, color.g, color.b\n      );\n      gl.bufferSubData(gl.ARRAY_BUFFER, this.lastSegment * 24 * 4, new Float32Array(updateVerts));\n    }\n\n    this.lastSegment = (this.lastSegment+1) % segments;\n  };\n\n  Stats.prototype.render = function(projectionMat, modelViewMat) {\n    var gl = this.gl;\n\n    // Render text first, minor win for early fragment discard\n    mat4_multiply(this.modelViewMatrix, modelViewMat, this.textMatrix);\n    this.sevenSegmentText.render(projectionMat, this.modelViewMatrix, this.fps + \" FP5\");\n\n    gl.useProgram(this.program);\n\n    gl.uniformMatrix4fv(this.uniforms.projectionMat, false, projectionMat);\n    gl.uniformMatrix4fv(this.uniforms.modelViewMat, false, modelViewMat);\n\n    gl.enableVertexAttribArray(this.attribs.position);\n    gl.enableVertexAttribArray(this.attribs.color);\n\n    gl.bindBuffer(gl.ARRAY_BUFFER, this.fpsVertBuffer);\n    gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, this.fpsIndexBuffer);\n\n    gl.vertexAttribPointer(this.attribs.position, 3, gl.FLOAT, false, 24, 0);\n    gl.vertexAttribPointer(this.attribs.color, 3, gl.FLOAT, false, 24, 12);\n\n    // Draw the graph and background in a single call\n    gl.drawElements(gl.TRIANGLES, this.fpsIndexCount, gl.UNSIGNED_SHORT, 0);\n  }\n\n  Stats.prototype.renderOrtho = function(x, y, width, height) {\n    var canvas = this.gl.canvas;\n\n    if (x == undefined || y == undefined) {\n      x = 10 * window.devicePixelRatio;\n      y = 10 * window.devicePixelRatio;\n    }\n    if (width == undefined || height == undefined) {\n      width = 75 * window.devicePixelRatio;\n      height = 75 * window.devicePixelRatio;\n    }\n\n    mat4_ortho(this.orthoProjMatrix, 0, canvas.width, 0, canvas.height, 0.1, 1024);\n\n    mat4_identity(this.orthoViewMatrix);\n    mat4_translate(this.orthoViewMatrix, this.orthoViewMatrix, [x, canvas.height - height - y, -1]);\n    mat4_scale(this.orthoViewMatrix, this.orthoViewMatrix, [width, height, 1]);\n    mat4_translate(this.orthoViewMatrix, this.orthoViewMatrix, [0.5, 0.5, 0]);\n\n    this.render(this.orthoProjMatrix, this.orthoViewMatrix);\n  }\n\n  return Stats;\n})();\n"
  },
  {
    "path": "browser/vendor/webgl-debug.js",
    "content": "/*\n** Copyright (c) 2012 The Khronos Group Inc.\n**\n** Permission is hereby granted, free of charge, to any person obtaining a\n** copy of this software and/or associated documentation files (the\n** \"Materials\"), to deal in the Materials without restriction, including\n** without limitation the rights to use, copy, modify, merge, publish,\n** distribute, sublicense, and/or sell copies of the Materials, and to\n** permit persons to whom the Materials are furnished to do so, subject to\n** the following conditions:\n**\n** The above copyright notice and this permission notice shall be included\n** in all copies or substantial portions of the Materials.\n**\n** THE MATERIALS ARE 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 NONINFRINGEMENT.\n** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\n** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.\n*/\n\n// Various functions for helping debug WebGL apps.\n\nWebGLDebugUtils = function() {\n\n/**\n * Wrapped logging function.\n * @param {string} msg Message to log.\n */\nvar log = function(msg) {\n  if (window.console && window.console.log) {\n    window.console.log(msg);\n  }\n};\n\n/**\n * Wrapped error logging function.\n * @param {string} msg Message to log.\n */\nvar error = function(msg) {\n  if (window.console && window.console.error) {\n    window.console.error(msg);\n  } else {\n    log(msg);\n  }\n};\n\n\n/**\n * Which arguments are enums based on the number of arguments to the function.\n * So\n *    'texImage2D': {\n *       9: { 0:true, 2:true, 6:true, 7:true },\n *       6: { 0:true, 2:true, 3:true, 4:true },\n *    },\n *\n * means if there are 9 arguments then 6 and 7 are enums, if there are 6\n * arguments 3 and 4 are enums\n *\n * @type {!Object.<number, !Object.<number, string>}\n */\nvar glValidEnumContexts = {\n  // Generic setters and getters\n\n  'enable': {1: { 0:true }},\n  'disable': {1: { 0:true }},\n  'getParameter': {1: { 0:true }},\n\n  // Rendering\n\n  'drawArrays': {3:{ 0:true }},\n  'drawElements': {4:{ 0:true, 2:true }},\n\n  // Shaders\n\n  'createShader': {1: { 0:true }},\n  'getShaderParameter': {2: { 1:true }},\n  'getProgramParameter': {2: { 1:true }},\n  'getShaderPrecisionFormat': {2: { 0: true, 1:true }},\n\n  // Vertex attributes\n\n  'getVertexAttrib': {2: { 1:true }},\n  'vertexAttribPointer': {6: { 2:true }},\n\n  // Textures\n\n  'bindTexture': {2: { 0:true }},\n  'activeTexture': {1: { 0:true }},\n  'getTexParameter': {2: { 0:true, 1:true }},\n  'texParameterf': {3: { 0:true, 1:true }},\n  'texParameteri': {3: { 0:true, 1:true, 2:true }},\n  'texImage2D': {\n     9: { 0:true, 2:true, 6:true, 7:true },\n     6: { 0:true, 2:true, 3:true, 4:true },\n  },\n  'texSubImage2D': {\n    9: { 0:true, 6:true, 7:true },\n    7: { 0:true, 4:true, 5:true },\n  },\n  'copyTexImage2D': {8: { 0:true, 2:true }},\n  'copyTexSubImage2D': {8: { 0:true }},\n  'generateMipmap': {1: { 0:true }},\n  'compressedTexImage2D': {7: { 0: true, 2:true }},\n  'compressedTexSubImage2D': {8: { 0: true, 6:true }},\n\n  // Buffer objects\n\n  'bindBuffer': {2: { 0:true }},\n  'bufferData': {3: { 0:true, 2:true }},\n  'bufferSubData': {3: { 0:true }},\n  'getBufferParameter': {2: { 0:true, 1:true }},\n\n  // Renderbuffers and framebuffers\n\n  'pixelStorei': {2: { 0:true, 1:true }},\n  'readPixels': {7: { 4:true, 5:true }},\n  'bindRenderbuffer': {2: { 0:true }},\n  'bindFramebuffer': {2: { 0:true }},\n  'checkFramebufferStatus': {1: { 0:true }},\n  'framebufferRenderbuffer': {4: { 0:true, 1:true, 2:true }},\n  'framebufferTexture2D': {5: { 0:true, 1:true, 2:true }},\n  'getFramebufferAttachmentParameter': {3: { 0:true, 1:true, 2:true }},\n  'getRenderbufferParameter': {2: { 0:true, 1:true }},\n  'renderbufferStorage': {4: { 0:true, 1:true }},\n\n  // Frame buffer operations (clear, blend, depth test, stencil)\n\n  'clear': {1: { 0:true }},\n  'depthFunc': {1: { 0:true }},\n  'blendFunc': {2: { 0:true, 1:true }},\n  'blendFuncSeparate': {4: { 0:true, 1:true, 2:true, 3:true }},\n  'blendEquation': {1: { 0:true }},\n  'blendEquationSeparate': {2: { 0:true, 1:true }},\n  'stencilFunc': {3: { 0:true }},\n  'stencilFuncSeparate': {4: { 0:true, 1:true }},\n  'stencilMaskSeparate': {2: { 0:true }},\n  'stencilOp': {3: { 0:true, 1:true, 2:true }},\n  'stencilOpSeparate': {4: { 0:true, 1:true, 2:true, 3:true }},\n\n  // Culling\n\n  'cullFace': {1: { 0:true }},\n  'frontFace': {1: { 0:true }},\n\n  // ANGLE_instanced_arrays extension\n\n  'drawArraysInstancedANGLE': {4: { 0:true }},\n  'drawElementsInstancedANGLE': {5: { 0:true, 2:true }},\n\n  // EXT_blend_minmax extension\n\n  'blendEquationEXT': {1: { 0:true }},\n};\n\n/**\n * Map of numbers to names.\n * @type {Object}\n */\nvar glEnums = null;\n\n/**\n * Initializes this module. Safe to call more than once.\n * @param {!WebGLRenderingContext} ctx A WebGL context. If\n *    you have more than one context it doesn't matter which one\n *    you pass in, it is only used to pull out constants.\n */\nfunction init(ctx) {\n  if (glEnums == null) {\n    glEnums = { };\n    for (var propertyName in ctx) {\n      if (typeof ctx[propertyName] == 'number') {\n        glEnums[ctx[propertyName]] = propertyName;\n      }\n    }\n  }\n}\n\n/**\n * Checks the utils have been initialized.\n */\nfunction checkInit() {\n  if (glEnums == null) {\n    throw 'WebGLDebugUtils.init(ctx) not called';\n  }\n}\n\n/**\n * Returns true or false if value matches any WebGL enum\n * @param {*} value Value to check if it might be an enum.\n * @return {boolean} True if value matches one of the WebGL defined enums\n */\nfunction mightBeEnum(value) {\n  checkInit();\n  return (glEnums[value] !== undefined);\n}\n\n/**\n * Gets an string version of an WebGL enum.\n *\n * Example:\n *   var str = WebGLDebugUtil.glEnumToString(ctx.getError());\n *\n * @param {number} value Value to return an enum for\n * @return {string} The string version of the enum.\n */\nfunction glEnumToString(value) {\n  checkInit();\n  var name = glEnums[value];\n  return (name !== undefined) ? (\"gl.\" + name) :\n      (\"/*UNKNOWN WebGL ENUM*/ 0x\" + value.toString(16) + \"\");\n}\n\n/**\n * Returns the string version of a WebGL argument.\n * Attempts to convert enum arguments to strings.\n * @param {string} functionName the name of the WebGL function.\n * @param {number} numArgs the number of arguments passed to the function.\n * @param {number} argumentIndx the index of the argument.\n * @param {*} value The value of the argument.\n * @return {string} The value as a string.\n */\nfunction glFunctionArgToString(functionName, numArgs, argumentIndex, value) {\n  var funcInfo = glValidEnumContexts[functionName];\n  if (funcInfo !== undefined) {\n    var funcInfo = funcInfo[numArgs];\n    if (funcInfo !== undefined) {\n      if (funcInfo[argumentIndex]) {\n        return glEnumToString(value);\n      }\n    }\n  }\n  if (value === null) {\n    return \"null\";\n  } else if (value === undefined) {\n    return \"undefined\";\n  } else {\n    return value.toString();\n  }\n}\n\n/**\n * Converts the arguments of a WebGL function to a string.\n * Attempts to convert enum arguments to strings.\n *\n * @param {string} functionName the name of the WebGL function.\n * @param {number} args The arguments.\n * @return {string} The arguments as a string.\n */\nfunction glFunctionArgsToString(functionName, args) {\n  // apparently we can't do args.join(\",\");\n  var argStr = \"\";\n  var numArgs = args.length;\n  for (var ii = 0; ii < numArgs; ++ii) {\n    argStr += ((ii == 0) ? '' : ', ') +\n        glFunctionArgToString(functionName, numArgs, ii, args[ii]);\n  }\n  return argStr;\n};\n\n\nfunction makePropertyWrapper(wrapper, original, propertyName) {\n  //log(\"wrap prop: \" + propertyName);\n  wrapper.__defineGetter__(propertyName, function() {\n    return original[propertyName];\n  });\n  // TODO(gmane): this needs to handle properties that take more than\n  // one value?\n  wrapper.__defineSetter__(propertyName, function(value) {\n    //log(\"set: \" + propertyName);\n    original[propertyName] = value;\n  });\n}\n\n// Makes a function that calls a function on another object.\nfunction makeFunctionWrapper(original, functionName) {\n  //log(\"wrap fn: \" + functionName);\n  var f = original[functionName];\n  return function() {\n    //log(\"call: \" + functionName);\n    var result = f.apply(original, arguments);\n    return result;\n  };\n}\n\n/**\n * Given a WebGL context returns a wrapped context that calls\n * gl.getError after every command and calls a function if the\n * result is not gl.NO_ERROR.\n *\n * @param {!WebGLRenderingContext} ctx The webgl context to\n *        wrap.\n * @param {!function(err, funcName, args): void} opt_onErrorFunc\n *        The function to call when gl.getError returns an\n *        error. If not specified the default function calls\n *        console.log with a message.\n * @param {!function(funcName, args): void} opt_onFunc The\n *        function to call when each webgl function is called.\n *        You can use this to log all calls for example.\n * @param {!WebGLRenderingContext} opt_err_ctx The webgl context\n *        to call getError on if different than ctx.\n */\nfunction makeDebugContext(ctx, opt_onErrorFunc, opt_onFunc, opt_err_ctx) {\n  opt_err_ctx = opt_err_ctx || ctx;\n  init(ctx);\n  opt_onErrorFunc = opt_onErrorFunc || function(err, functionName, args) {\n        // apparently we can't do args.join(\",\");\n        var argStr = \"\";\n        var numArgs = args.length;\n        for (var ii = 0; ii < numArgs; ++ii) {\n          argStr += ((ii == 0) ? '' : ', ') +\n              glFunctionArgToString(functionName, numArgs, ii, args[ii]);\n        }\n        error(\"WebGL error \"+ glEnumToString(err) + \" in \"+ functionName +\n              \"(\" + argStr + \")\");\n      };\n\n  // Holds booleans for each GL error so after we get the error ourselves\n  // we can still return it to the client app.\n  var glErrorShadow = { };\n\n  // Makes a function that calls a WebGL function and then calls getError.\n  function makeErrorWrapper(ctx, functionName) {\n    return function() {\n      if (opt_onFunc) {\n        opt_onFunc(functionName, arguments);\n      }\n      var result = ctx[functionName].apply(ctx, arguments);\n      var err = opt_err_ctx.getError();\n      if (err != 0) {\n        glErrorShadow[err] = true;\n        opt_onErrorFunc(err, functionName, arguments);\n      }\n      return result;\n    };\n  }\n\n  // Make a an object that has a copy of every property of the WebGL context\n  // but wraps all functions.\n  var wrapper = {};\n  for (var propertyName in ctx) {\n    if (typeof ctx[propertyName] == 'function') {\n       if (propertyName != 'getExtension') {\n\t  wrapper[propertyName] = makeErrorWrapper(ctx, propertyName);\n       } else {\n\t  var wrapped = makeErrorWrapper(ctx, propertyName);\n\t  wrapper[propertyName] = function () {\n\t     var result = wrapped.apply(ctx, arguments);\n\t     return makeDebugContext(result, opt_onErrorFunc, opt_onFunc, opt_err_ctx);\n\t  };\n       }\n     } else {\n       makePropertyWrapper(wrapper, ctx, propertyName);\n     }\n  }\n\n  // Override the getError function with one that returns our saved results.\n  wrapper.getError = function() {\n    for (var err in glErrorShadow) {\n      if (glErrorShadow.hasOwnProperty(err)) {\n        if (glErrorShadow[err]) {\n          glErrorShadow[err] = false;\n          return err;\n        }\n      }\n    }\n    return ctx.NO_ERROR;\n  };\n\n  return wrapper;\n}\n\nfunction resetToInitialState(ctx) {\n  var numAttribs = ctx.getParameter(ctx.MAX_VERTEX_ATTRIBS);\n  var tmp = ctx.createBuffer();\n  ctx.bindBuffer(ctx.ARRAY_BUFFER, tmp);\n  for (var ii = 0; ii < numAttribs; ++ii) {\n    ctx.disableVertexAttribArray(ii);\n    ctx.vertexAttribPointer(ii, 4, ctx.FLOAT, false, 0, 0);\n    ctx.vertexAttrib1f(ii, 0);\n  }\n  ctx.deleteBuffer(tmp);\n\n  var numTextureUnits = ctx.getParameter(ctx.MAX_TEXTURE_IMAGE_UNITS);\n  for (var ii = 0; ii < numTextureUnits; ++ii) {\n    ctx.activeTexture(ctx.TEXTURE0 + ii);\n    ctx.bindTexture(ctx.TEXTURE_CUBE_MAP, null);\n    ctx.bindTexture(ctx.TEXTURE_2D, null);\n  }\n\n  ctx.activeTexture(ctx.TEXTURE0);\n  ctx.useProgram(null);\n  ctx.bindBuffer(ctx.ARRAY_BUFFER, null);\n  ctx.bindBuffer(ctx.ELEMENT_ARRAY_BUFFER, null);\n  ctx.bindFramebuffer(ctx.FRAMEBUFFER, null);\n  ctx.bindRenderbuffer(ctx.RENDERBUFFER, null);\n  ctx.disable(ctx.BLEND);\n  ctx.disable(ctx.CULL_FACE);\n  ctx.disable(ctx.DEPTH_TEST);\n  ctx.disable(ctx.DITHER);\n  ctx.disable(ctx.SCISSOR_TEST);\n  ctx.blendColor(0, 0, 0, 0);\n  ctx.blendEquation(ctx.FUNC_ADD);\n  ctx.blendFunc(ctx.ONE, ctx.ZERO);\n  ctx.clearColor(0, 0, 0, 0);\n  ctx.clearDepth(1);\n  ctx.clearStencil(-1);\n  ctx.colorMask(true, true, true, true);\n  ctx.cullFace(ctx.BACK);\n  ctx.depthFunc(ctx.LESS);\n  ctx.depthMask(true);\n  ctx.depthRange(0, 1);\n  ctx.frontFace(ctx.CCW);\n  ctx.hint(ctx.GENERATE_MIPMAP_HINT, ctx.DONT_CARE);\n  ctx.lineWidth(1);\n  ctx.pixelStorei(ctx.PACK_ALIGNMENT, 4);\n  ctx.pixelStorei(ctx.UNPACK_ALIGNMENT, 4);\n  ctx.pixelStorei(ctx.UNPACK_FLIP_Y_WEBGL, false);\n  ctx.pixelStorei(ctx.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);\n  // TODO: Delete this IF.\n  if (ctx.UNPACK_COLORSPACE_CONVERSION_WEBGL) {\n    ctx.pixelStorei(ctx.UNPACK_COLORSPACE_CONVERSION_WEBGL, ctx.BROWSER_DEFAULT_WEBGL);\n  }\n  ctx.polygonOffset(0, 0);\n  ctx.sampleCoverage(1, false);\n  ctx.scissor(0, 0, ctx.canvas.width, ctx.canvas.height);\n  ctx.stencilFunc(ctx.ALWAYS, 0, 0xFFFFFFFF);\n  ctx.stencilMask(0xFFFFFFFF);\n  ctx.stencilOp(ctx.KEEP, ctx.KEEP, ctx.KEEP);\n  ctx.viewport(0, 0, ctx.canvas.width, ctx.canvas.height);\n  ctx.clear(ctx.COLOR_BUFFER_BIT | ctx.DEPTH_BUFFER_BIT | ctx.STENCIL_BUFFER_BIT);\n\n  // TODO: This should NOT be needed but Firefox fails with 'hint'\n  while(ctx.getError());\n}\n\nfunction makeLostContextSimulatingCanvas(canvas) {\n  var unwrappedContext_;\n  var wrappedContext_;\n  var onLost_ = [];\n  var onRestored_ = [];\n  var wrappedContext_ = {};\n  var contextId_ = 1;\n  var contextLost_ = false;\n  var resourceId_ = 0;\n  var resourceDb_ = [];\n  var numCallsToLoseContext_ = 0;\n  var numCalls_ = 0;\n  var canRestore_ = false;\n  var restoreTimeout_ = 0;\n\n  // Holds booleans for each GL error so can simulate errors.\n  var glErrorShadow_ = { };\n\n  canvas.getContext = function(f) {\n    return function() {\n      var ctx = f.apply(canvas, arguments);\n      // Did we get a context and is it a WebGL context?\n      if (ctx instanceof WebGLRenderingContext) {\n        if (ctx != unwrappedContext_) {\n          if (unwrappedContext_) {\n            throw \"got different context\"\n          }\n          unwrappedContext_ = ctx;\n          wrappedContext_ = makeLostContextSimulatingContext(unwrappedContext_);\n        }\n        return wrappedContext_;\n      }\n      return ctx;\n    }\n  }(canvas.getContext);\n\n  function wrapEvent(listener) {\n    if (typeof(listener) == \"function\") {\n      return listener;\n    } else {\n      return function(info) {\n        listener.handleEvent(info);\n      }\n    }\n  }\n\n  var addOnContextLostListener = function(listener) {\n    onLost_.push(wrapEvent(listener));\n  };\n\n  var addOnContextRestoredListener = function(listener) {\n    onRestored_.push(wrapEvent(listener));\n  };\n\n\n  function wrapAddEventListener(canvas) {\n    var f = canvas.addEventListener;\n    canvas.addEventListener = function(type, listener, bubble) {\n      switch (type) {\n        case 'webglcontextlost':\n          addOnContextLostListener(listener);\n          break;\n        case 'webglcontextrestored':\n          addOnContextRestoredListener(listener);\n          break;\n        default:\n          f.apply(canvas, arguments);\n      }\n    };\n  }\n\n  wrapAddEventListener(canvas);\n\n  canvas.loseContext = function() {\n    if (!contextLost_) {\n      contextLost_ = true;\n      numCallsToLoseContext_ = 0;\n      ++contextId_;\n      while (unwrappedContext_.getError());\n      clearErrors();\n      glErrorShadow_[unwrappedContext_.CONTEXT_LOST_WEBGL] = true;\n      var event = makeWebGLContextEvent(\"context lost\");\n      var callbacks = onLost_.slice();\n      setTimeout(function() {\n          //log(\"numCallbacks:\" + callbacks.length);\n          for (var ii = 0; ii < callbacks.length; ++ii) {\n            //log(\"calling callback:\" + ii);\n            callbacks[ii](event);\n          }\n          if (restoreTimeout_ >= 0) {\n            setTimeout(function() {\n                canvas.restoreContext();\n              }, restoreTimeout_);\n          }\n        }, 0);\n    }\n  };\n\n  canvas.restoreContext = function() {\n    if (contextLost_) {\n      if (onRestored_.length) {\n        setTimeout(function() {\n            if (!canRestore_) {\n              throw \"can not restore. webglcontestlost listener did not call event.preventDefault\";\n            }\n            freeResources();\n            resetToInitialState(unwrappedContext_);\n            contextLost_ = false;\n            numCalls_ = 0;\n            canRestore_ = false;\n            var callbacks = onRestored_.slice();\n            var event = makeWebGLContextEvent(\"context restored\");\n            for (var ii = 0; ii < callbacks.length; ++ii) {\n              callbacks[ii](event);\n            }\n          }, 0);\n      }\n    }\n  };\n\n  canvas.loseContextInNCalls = function(numCalls) {\n    if (contextLost_) {\n      throw \"You can not ask a lost contet to be lost\";\n    }\n    numCallsToLoseContext_ = numCalls_ + numCalls;\n  };\n\n  canvas.getNumCalls = function() {\n    return numCalls_;\n  };\n\n  canvas.setRestoreTimeout = function(timeout) {\n    restoreTimeout_ = timeout;\n  };\n\n  function isWebGLObject(obj) {\n    //return false;\n    return (obj instanceof WebGLBuffer ||\n            obj instanceof WebGLFramebuffer ||\n            obj instanceof WebGLProgram ||\n            obj instanceof WebGLRenderbuffer ||\n            obj instanceof WebGLShader ||\n            obj instanceof WebGLTexture);\n  }\n\n  function checkResources(args) {\n    for (var ii = 0; ii < args.length; ++ii) {\n      var arg = args[ii];\n      if (isWebGLObject(arg)) {\n        return arg.__webglDebugContextLostId__ == contextId_;\n      }\n    }\n    return true;\n  }\n\n  function clearErrors() {\n    var k = Object.keys(glErrorShadow_);\n    for (var ii = 0; ii < k.length; ++ii) {\n      delete glErrorShadow_[k];\n    }\n  }\n\n  function loseContextIfTime() {\n    ++numCalls_;\n    if (!contextLost_) {\n      if (numCallsToLoseContext_ == numCalls_) {\n        canvas.loseContext();\n      }\n    }\n  }\n\n  // Makes a function that simulates WebGL when out of context.\n  function makeLostContextFunctionWrapper(ctx, functionName) {\n    var f = ctx[functionName];\n    return function() {\n      // log(\"calling:\" + functionName);\n      // Only call the functions if the context is not lost.\n      loseContextIfTime();\n      if (!contextLost_) {\n        //if (!checkResources(arguments)) {\n        //  glErrorShadow_[wrappedContext_.INVALID_OPERATION] = true;\n        //  return;\n        //}\n        var result = f.apply(ctx, arguments);\n        return result;\n      }\n    };\n  }\n\n  function freeResources() {\n    for (var ii = 0; ii < resourceDb_.length; ++ii) {\n      var resource = resourceDb_[ii];\n      if (resource instanceof WebGLBuffer) {\n        unwrappedContext_.deleteBuffer(resource);\n      } else if (resource instanceof WebGLFramebuffer) {\n        unwrappedContext_.deleteFramebuffer(resource);\n      } else if (resource instanceof WebGLProgram) {\n        unwrappedContext_.deleteProgram(resource);\n      } else if (resource instanceof WebGLRenderbuffer) {\n        unwrappedContext_.deleteRenderbuffer(resource);\n      } else if (resource instanceof WebGLShader) {\n        unwrappedContext_.deleteShader(resource);\n      } else if (resource instanceof WebGLTexture) {\n        unwrappedContext_.deleteTexture(resource);\n      }\n    }\n  }\n\n  function makeWebGLContextEvent(statusMessage) {\n    return {\n      statusMessage: statusMessage,\n      preventDefault: function() {\n          canRestore_ = true;\n        }\n    };\n  }\n\n  return canvas;\n\n  function makeLostContextSimulatingContext(ctx) {\n    // copy all functions and properties to wrapper\n    for (var propertyName in ctx) {\n      if (typeof ctx[propertyName] == 'function') {\n         wrappedContext_[propertyName] = makeLostContextFunctionWrapper(\n             ctx, propertyName);\n       } else {\n         makePropertyWrapper(wrappedContext_, ctx, propertyName);\n       }\n    }\n\n    // Wrap a few functions specially.\n    wrappedContext_.getError = function() {\n      loseContextIfTime();\n      if (!contextLost_) {\n        var err;\n        while (err = unwrappedContext_.getError()) {\n          glErrorShadow_[err] = true;\n        }\n      }\n      for (var err in glErrorShadow_) {\n        if (glErrorShadow_[err]) {\n          delete glErrorShadow_[err];\n          return err;\n        }\n      }\n      return wrappedContext_.NO_ERROR;\n    };\n\n    var creationFunctions = [\n      \"createBuffer\",\n      \"createFramebuffer\",\n      \"createProgram\",\n      \"createRenderbuffer\",\n      \"createShader\",\n      \"createTexture\"\n    ];\n    for (var ii = 0; ii < creationFunctions.length; ++ii) {\n      var functionName = creationFunctions[ii];\n      wrappedContext_[functionName] = function(f) {\n        return function() {\n          loseContextIfTime();\n          if (contextLost_) {\n            return null;\n          }\n          var obj = f.apply(ctx, arguments);\n          obj.__webglDebugContextLostId__ = contextId_;\n          resourceDb_.push(obj);\n          return obj;\n        };\n      }(ctx[functionName]);\n    }\n\n    var functionsThatShouldReturnNull = [\n      \"getActiveAttrib\",\n      \"getActiveUniform\",\n      \"getBufferParameter\",\n      \"getContextAttributes\",\n      \"getAttachedShaders\",\n      \"getFramebufferAttachmentParameter\",\n      \"getParameter\",\n      \"getProgramParameter\",\n      \"getProgramInfoLog\",\n      \"getRenderbufferParameter\",\n      \"getShaderParameter\",\n      \"getShaderInfoLog\",\n      \"getShaderSource\",\n      \"getTexParameter\",\n      \"getUniform\",\n      \"getUniformLocation\",\n      \"getVertexAttrib\"\n    ];\n    for (var ii = 0; ii < functionsThatShouldReturnNull.length; ++ii) {\n      var functionName = functionsThatShouldReturnNull[ii];\n      wrappedContext_[functionName] = function(f) {\n        return function() {\n          loseContextIfTime();\n          if (contextLost_) {\n            return null;\n          }\n          return f.apply(ctx, arguments);\n        }\n      }(wrappedContext_[functionName]);\n    }\n\n    var isFunctions = [\n      \"isBuffer\",\n      \"isEnabled\",\n      \"isFramebuffer\",\n      \"isProgram\",\n      \"isRenderbuffer\",\n      \"isShader\",\n      \"isTexture\"\n    ];\n    for (var ii = 0; ii < isFunctions.length; ++ii) {\n      var functionName = isFunctions[ii];\n      wrappedContext_[functionName] = function(f) {\n        return function() {\n          loseContextIfTime();\n          if (contextLost_) {\n            return false;\n          }\n          return f.apply(ctx, arguments);\n        }\n      }(wrappedContext_[functionName]);\n    }\n\n    wrappedContext_.checkFramebufferStatus = function(f) {\n      return function() {\n        loseContextIfTime();\n        if (contextLost_) {\n          return wrappedContext_.FRAMEBUFFER_UNSUPPORTED;\n        }\n        return f.apply(ctx, arguments);\n      };\n    }(wrappedContext_.checkFramebufferStatus);\n\n    wrappedContext_.getAttribLocation = function(f) {\n      return function() {\n        loseContextIfTime();\n        if (contextLost_) {\n          return -1;\n        }\n        return f.apply(ctx, arguments);\n      };\n    }(wrappedContext_.getAttribLocation);\n\n    wrappedContext_.getVertexAttribOffset = function(f) {\n      return function() {\n        loseContextIfTime();\n        if (contextLost_) {\n          return 0;\n        }\n        return f.apply(ctx, arguments);\n      };\n    }(wrappedContext_.getVertexAttribOffset);\n\n    wrappedContext_.isContextLost = function() {\n      return contextLost_;\n    };\n\n    return wrappedContext_;\n  }\n}\n\nreturn {\n  /**\n   * Initializes this module. Safe to call more than once.\n   * @param {!WebGLRenderingContext} ctx A WebGL context. If\n   *    you have more than one context it doesn't matter which one\n   *    you pass in, it is only used to pull out constants.\n   */\n  'init': init,\n\n  /**\n   * Returns true or false if value matches any WebGL enum\n   * @param {*} value Value to check if it might be an enum.\n   * @return {boolean} True if value matches one of the WebGL defined enums\n   */\n  'mightBeEnum': mightBeEnum,\n\n  /**\n   * Gets an string version of an WebGL enum.\n   *\n   * Example:\n   *   WebGLDebugUtil.init(ctx);\n   *   var str = WebGLDebugUtil.glEnumToString(ctx.getError());\n   *\n   * @param {number} value Value to return an enum for\n   * @return {string} The string version of the enum.\n   */\n  'glEnumToString': glEnumToString,\n\n  /**\n   * Converts the argument of a WebGL function to a string.\n   * Attempts to convert enum arguments to strings.\n   *\n   * Example:\n   *   WebGLDebugUtil.init(ctx);\n   *   var str = WebGLDebugUtil.glFunctionArgToString('bindTexture', 2, 0, gl.TEXTURE_2D);\n   *\n   * would return 'TEXTURE_2D'\n   *\n   * @param {string} functionName the name of the WebGL function.\n   * @param {number} numArgs The number of arguments\n   * @param {number} argumentIndx the index of the argument.\n   * @param {*} value The value of the argument.\n   * @return {string} The value as a string.\n   */\n  'glFunctionArgToString': glFunctionArgToString,\n\n  /**\n   * Converts the arguments of a WebGL function to a string.\n   * Attempts to convert enum arguments to strings.\n   *\n   * @param {string} functionName the name of the WebGL function.\n   * @param {number} args The arguments.\n   * @return {string} The arguments as a string.\n   */\n  'glFunctionArgsToString': glFunctionArgsToString,\n\n  /**\n   * Given a WebGL context returns a wrapped context that calls\n   * gl.getError after every command and calls a function if the\n   * result is not NO_ERROR.\n   *\n   * You can supply your own function if you want. For example, if you'd like\n   * an exception thrown on any GL error you could do this\n   *\n   *    function throwOnGLError(err, funcName, args) {\n   *      throw WebGLDebugUtils.glEnumToString(err) +\n   *            \" was caused by call to \" + funcName;\n   *    };\n   *\n   *    ctx = WebGLDebugUtils.makeDebugContext(\n   *        canvas.getContext(\"webgl\"), throwOnGLError);\n   *\n   * @param {!WebGLRenderingContext} ctx The webgl context to wrap.\n   * @param {!function(err, funcName, args): void} opt_onErrorFunc The function\n   *     to call when gl.getError returns an error. If not specified the default\n   *     function calls console.log with a message.\n   * @param {!function(funcName, args): void} opt_onFunc The\n   *     function to call when each webgl function is called. You\n   *     can use this to log all calls for example.\n   */\n  'makeDebugContext': makeDebugContext,\n\n  /**\n   * Given a canvas element returns a wrapped canvas element that will\n   * simulate lost context. The canvas returned adds the following functions.\n   *\n   * loseContext:\n   *   simulates a lost context event.\n   *\n   * restoreContext:\n   *   simulates the context being restored.\n   *\n   * lostContextInNCalls:\n   *   loses the context after N gl calls.\n   *\n   * getNumCalls:\n   *   tells you how many gl calls there have been so far.\n   *\n   * setRestoreTimeout:\n   *   sets the number of milliseconds until the context is restored\n   *   after it has been lost. Defaults to 0. Pass -1 to prevent\n   *   automatic restoring.\n   *\n   * @param {!Canvas} canvas The canvas element to wrap.\n   */\n  'makeLostContextSimulatingCanvas': makeLostContextSimulatingCanvas,\n\n  /**\n   * Resets a context to the initial state.\n   * @param {!WebGLRenderingContext} ctx The webgl context to\n   *     reset.\n   */\n  'resetToInitialState': resetToInitialState\n};\n\n}();\n\n"
  },
  {
    "path": "browser/vendor/when.js",
    "content": "!function(a){\"object\"==typeof exports?module.exports=a():\"function\"==typeof define&&define.amd?define(a):\"undefined\"!=typeof window?window.when=a():\"undefined\"!=typeof global?global.when=a():\"undefined\"!=typeof self&&(self.when=a())}(function(){var a;return function b(a,c,d){function e(g,h){if(!c[g]){if(!a[g]){var i=\"function\"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);throw new Error(\"Cannot find module '\"+g+\"'\")}var j=c[g]={exports:{}};a[g][0].call(j.exports,function(b){var c=a[g][1][b];return e(c?c:b)},j,j.exports,b,a,c,d)}return c[g].exports}for(var f=\"function\"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){var d=b.exports=a(\"../when\");d.callbacks=a(\"../callbacks\"),d.cancelable=a(\"../cancelable\"),d.delay=a(\"../delay\"),d.fn=a(\"../function\"),d.guard=a(\"../guard\"),d.keys=a(\"../keys\"),d.nodefn=d.node=a(\"../node\"),d.parallel=a(\"../parallel\"),d.pipeline=a(\"../pipeline\"),d.poll=a(\"../poll\"),d.sequence=a(\"../sequence\"),d.timeout=a(\"../timeout\")},{\"../callbacks\":2,\"../cancelable\":3,\"../delay\":4,\"../function\":5,\"../guard\":6,\"../keys\":7,\"../node\":26,\"../parallel\":27,\"../pipeline\":28,\"../poll\":29,\"../sequence\":30,\"../timeout\":31,\"../when\":32}],2:[function(b,c,d){!function(a){a(function(a){function b(a,b){return q(a,this,b||[])}function c(a,b,c,e){c.push(k(e.resolve,e),k(e.reject,e)),d(a,b,c,e)}function d(a,b,c,d){try{a.apply(b,c)}catch(e){d.reject(e)}}function e(a){return q(a,this,o.call(arguments,1))}function f(a){var b=arguments.length>1?o.call(arguments,1):[];return function(){return q(a,this,b.concat(o.call(arguments)))}}function g(a,b,c){return n(f,b,c,a)}function h(a,b){return function(){var c=this;return m.all(arguments).then(function(d){var e,f,g=m._defer();return\"number\"==typeof b.callback&&(e=i(d,b.callback)),\"number\"==typeof b.errback&&(f=i(d,b.errback)),e>f?(j(d,f,g._handler.reject,g._handler),j(d,e,g._handler.resolve,g._handler)):(j(d,e,g._handler.resolve,g._handler),j(d,f,g._handler.reject,g._handler)),a.apply(c,d),g})}}function i(a,b){return 0>b?a.length+b+2:b}function j(a,b,c,d){\"number\"==typeof b&&a.splice(b,0,k(c,d))}function k(a,b){return function(){arguments.length>1?a.call(b,o.call(arguments)):a.apply(b,arguments)}}var l=a(\"./when\"),m=l.Promise,n=a(\"./lib/liftAll\"),o=Array.prototype.slice,p=a(\"./lib/apply\"),q=p(m,c);return{lift:f,liftAll:g,apply:b,call:e,promisify:h}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{\"./lib/apply\":11,\"./lib/liftAll\":23,\"./when\":32}],3:[function(b,c,d){!function(a){a(function(){return function(a,b){return a.cancel=function(){try{a.reject(b(a))}catch(c){a.reject(c)}return a.promise},a}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a()})},{}],4:[function(b,c,d){!function(a){a(function(a){var b=a(\"./when\");return function(a,c){return b(c).delay(a)}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{\"./when\":32}],5:[function(b,c,d){!function(a){a(function(a){function b(a,b){return i(a,this,null==b?[]:j.call(b))}function c(a){var b=arguments.length>1?j.call(arguments,1):[];return function(){return i(a,this,b.concat(j.call(arguments)))}}function d(a,b,d){return h(c,b,d,a)}function e(a){var b=j.call(arguments,1);return function(){var c=this,d=j.call(arguments),e=g.apply(c,[a].concat(d));return f.reduce(b,function(a,b){return b.call(c,a)},e)}}var f=a(\"./when\"),g=f[\"try\"],h=a(\"./lib/liftAll\"),i=a(\"./lib/apply\")(f.Promise),j=Array.prototype.slice;return{lift:c,liftAll:d,call:g,apply:b,compose:e}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{\"./lib/apply\":11,\"./lib/liftAll\":23,\"./when\":32}],6:[function(b,c,d){!function(a){a(function(a){function b(a,b){return function(){var c=e.call(arguments);return d(a()).withThis(this).then(function(a){return d(b.apply(this,c))[\"finally\"](a)})}}function c(a){function b(){c=Math.max(c-1,0),e.length>0&&e.shift()(b)}var c=0,e=[];return function(){return d.promise(function(d){a>c?d(b):e.push(d),c+=1})}}var d=a(\"./when\"),e=Array.prototype.slice;return b.n=c,b})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{\"./when\":32}],7:[function(b,c,d){!function(a){\"use strict\";a(function(a){function b(a){function b(a,b,c){this[a]=b,0===--i&&c.resolve(g)}for(var c,d=e._defer(),f=e._handler(d),g={},h=Object.keys(a),i=h.length,j=0;j<h.length;++j)c=h[j],e._handler(a[c]).fold(b,c,g,f);return 0===i&&f.resolve(g),d}function c(a,c){function d(a,b){return c(b,a)}return f(a).then(function(a){return b(Object.keys(a).reduce(function(b,c){return b[c]=f(a[c]).fold(d,c),b},{}))})}var d=a(\"./when\"),e=d.Promise,f=d.resolve;return{all:d.lift(b),map:c}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{\"./when\":32}],8:[function(b,c,d){!function(a){\"use strict\";a(function(a){var b=a(\"./makePromise\"),c=a(\"./Scheduler\"),d=a(\"./env\").asap;return b({scheduler:new c(d)})})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{\"./Scheduler\":9,\"./env\":21,\"./makePromise\":24}],9:[function(b,c,d){!function(a){\"use strict\";a(function(){function a(a){this._async=a,this._running=!1,this._queue=this,this._queueLen=0,this._afterQueue={},this._afterQueueLen=0;var b=this;this.drain=function(){b._drain()}}return a.prototype.enqueue=function(a){this._queue[this._queueLen++]=a,this.run()},a.prototype.afterQueue=function(a){this._afterQueue[this._afterQueueLen++]=a,this.run()},a.prototype.run=function(){this._running||(this._running=!0,this._async(this.drain))},a.prototype._drain=function(){for(var a=0;a<this._queueLen;++a)this._queue[a].run(),this._queue[a]=void 0;for(this._queueLen=0,this._running=!1,a=0;a<this._afterQueueLen;++a)this._afterQueue[a].run(),this._afterQueue[a]=void 0;this._afterQueueLen=0},a})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a()})},{}],10:[function(b,c,d){!function(a){\"use strict\";a(function(){function a(b){Error.call(this),this.message=b,this.name=a.name,\"function\"==typeof Error.captureStackTrace&&Error.captureStackTrace(this,a)}return a.prototype=Object.create(Error.prototype),a.prototype.constructor=a,a})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a()})},{}],11:[function(b,c,d){!function(a){\"use strict\";a(function(){function a(a,c){function d(b,d,f){var g=a._defer(),h=f.length,i=new Array(h);return e({f:b,thisArg:d,args:f,params:i,i:h-1,call:c},g._handler),g}function e(b,d){if(b.i<0)return c(b.f,b.thisArg,b.params,d);var e=a._handler(b.args[b.i]);e.fold(f,b,void 0,d)}function f(a,b,c){a.params[a.i]=b,a.i-=1,e(a,c)}return arguments.length<2&&(c=b),d}function b(a,b,c,d){try{d.resolve(a.apply(b,c))}catch(e){d.reject(e)}}return a.tryCatchResolve=b,a})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a()})},{}],12:[function(b,c,d){!function(a){\"use strict\";a(function(a){var b=a(\"../state\"),c=a(\"../apply\");return function(a){function d(b){function c(a){k=null,this.resolve(a)}function d(a){this.resolved||(k.push(a),0===--j&&this.reject(k))}for(var e,f,g=a._defer(),h=g._handler,i=b.length>>>0,j=i,k=[],l=0;i>l;++l)if(f=b[l],void 0!==f||l in b){if(e=a._handler(f),e.state()>0){h.become(e),a._visitRemaining(b,l,e);break}e.visit(h,c,d)}else--j;return 0===j&&h.reject(new RangeError(\"any(): array must not be empty\")),g}function e(b,c){function d(a){this.resolved||(k.push(a),0===--n&&(l=null,this.resolve(k)))}function e(a){this.resolved||(l.push(a),0===--f&&(k=null,this.reject(l)))}var f,g,h,i=a._defer(),j=i._handler,k=[],l=[],m=b.length>>>0,n=0;for(h=0;m>h;++h)g=b[h],(void 0!==g||h in b)&&++n;for(c=Math.max(c,0),f=n-c+1,n=Math.min(c,n),c>n?j.reject(new RangeError(\"some(): array must contain at least \"+c+\" item(s), but had \"+n)):0===n&&j.resolve(k),h=0;m>h;++h)g=b[h],(void 0!==g||h in b)&&a._handler(g).visit(j,d,e,j.notify);return i}function f(b,c){return a._traverse(c,b)}function g(b,c){var d=s.call(b);return a._traverse(c,d).then(function(a){return h(d,a)})}function h(b,c){for(var d=c.length,e=new Array(d),f=0,g=0;d>f;++f)c[f]&&(e[g++]=a._handler(b[f]).value);return e.length=g,e}function i(a){return p(a.map(j))}function j(c){var d=a._handler(c);return 0===d.state()?o(c).then(b.fulfilled,b.rejected):(d._unreport(),b.inspect(d))}function k(a,b){return arguments.length>2?q.call(a,m(b),arguments[2]):q.call(a,m(b))}function l(a,b){return arguments.length>2?r.call(a,m(b),arguments[2]):r.call(a,m(b))}function m(a){return function(b,c,d){return n(a,void 0,[b,c,d])}}var n=c(a),o=a.resolve,p=a.all,q=Array.prototype.reduce,r=Array.prototype.reduceRight,s=Array.prototype.slice;return a.any=d,a.some=e,a.settle=i,a.map=f,a.filter=g,a.reduce=k,a.reduceRight=l,a.prototype.spread=function(a){return this.then(p).then(function(b){return a.apply(this,b)})},a}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{\"../apply\":11,\"../state\":25}],13:[function(b,c,d){!function(a){\"use strict\";a(function(){function a(){throw new TypeError(\"catch predicate must be a function\")}function b(a,b){return c(b)?a instanceof b:b(a)}function c(a){return a===Error||null!=a&&a.prototype instanceof Error}function d(a){return(\"object\"==typeof a||\"function\"==typeof a)&&null!==a}function e(a){return a}return function(c){function f(a,c){return function(d){return b(d,c)?a.call(this,d):j(d)}}function g(a,b,c,e){var f=a.call(b);return d(f)?h(f,c,e):c(e)}function h(a,b,c){return i(a).then(function(){return b(c)})}var i=c.resolve,j=c.reject,k=c.prototype[\"catch\"];return c.prototype.done=function(a,b){this._handler.visit(this._handler.receiver,a,b)},c.prototype[\"catch\"]=c.prototype.otherwise=function(b){return arguments.length<2?k.call(this,b):\"function\"!=typeof b?this.ensure(a):k.call(this,f(arguments[1],b))},c.prototype[\"finally\"]=c.prototype.ensure=function(a){return\"function\"!=typeof a?this:this.then(function(b){return g(a,this,e,b)},function(b){return g(a,this,j,b)})},c.prototype[\"else\"]=c.prototype.orElse=function(a){return this.then(void 0,function(){return a})},c.prototype[\"yield\"]=function(a){return this.then(function(){return a})},c.prototype.tap=function(a){return this.then(a)[\"yield\"](this)},c}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a()})},{}],14:[function(b,c,d){!function(a){\"use strict\";a(function(){return function(a){return a.prototype.fold=function(b,c){var d=this._beget();return this._handler.fold(function(c,d,e){a._handler(c).fold(function(a,c,d){d.resolve(b.call(this,c,a))},d,this,e)},c,d._handler.receiver,d._handler),d},a}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a()})},{}],15:[function(b,c,d){!function(a){\"use strict\";a(function(a){var b=a(\"../state\").inspect;return function(a){return a.prototype.inspect=function(){return b(a._handler(this))},a}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{\"../state\":25}],16:[function(b,c,d){!function(a){\"use strict\";a(function(){return function(a){function b(a,b,d,e){return c(function(b){return[b,a(b)]},b,d,e)}function c(a,b,e,f){function g(f,g){return d(e(f)).then(function(){return c(a,b,e,g)})}return d(f).then(function(c){return d(b(c)).then(function(b){return b?c:d(a(c)).spread(g)})})}var d=a.resolve;return a.iterate=b,a.unfold=c,a}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a()})},{}],17:[function(b,c,d){!function(a){\"use strict\";a(function(){return function(a){return a.prototype.progress=function(a){return this.then(void 0,void 0,a)},a}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a()})},{}],18:[function(b,c,d){!function(a){\"use strict\";a(function(a){function b(a,b,d,e){return c.setTimer(function(){a(d,e,b)},b)}var c=a(\"../env\"),d=a(\"../TimeoutError\");return function(a){function e(a,c,d){b(f,a,c,d)}function f(a,b){b.resolve(a)}function g(a,b,c){var e=\"undefined\"==typeof a?new d(\"timed out after \"+c+\"ms\"):a;b.reject(e)}return a.prototype.delay=function(a){var b=this._beget();return this._handler.fold(e,a,void 0,b._handler),b},a.prototype.timeout=function(a,d){var e=this._beget(),f=e._handler,h=b(g,a,d,e._handler);return this._handler.visit(f,function(a){c.clearTimer(h),this.resolve(a)},function(a){c.clearTimer(h),this.reject(a)},f.notify),e},a}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{\"../TimeoutError\":10,\"../env\":21}],19:[function(b,c,d){!function(a){\"use strict\";a(function(a){function b(a){throw a}function c(){}var d=a(\"../env\").setTimer,e=a(\"../format\");return function(a){function f(a){a.handled||(n.push(a),k(\"Potentially unhandled rejection [\"+a.id+\"] \"+e.formatError(a.value)))}function g(a){var b=n.indexOf(a);b>=0&&(n.splice(b,1),l(\"Handled previous rejection [\"+a.id+\"] \"+e.formatObject(a.value)))}function h(a,b){m.push(a,b),null===o&&(o=d(i,0))}function i(){for(o=null;m.length>0;)m.shift()(m.shift())}var j,k=c,l=c;\"undefined\"!=typeof console&&(j=console,k=\"undefined\"!=typeof j.error?function(a){j.error(a)}:function(a){j.log(a)},l=\"undefined\"!=typeof j.info?function(a){j.info(a)}:function(a){j.log(a)}),a.onPotentiallyUnhandledRejection=function(a){h(f,a)},a.onPotentiallyUnhandledRejectionHandled=function(a){h(g,a)},a.onFatalRejection=function(a){h(b,a.value)};var m=[],n=[],o=null;return a}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{\"../env\":21,\"../format\":22}],20:[function(b,c,d){!function(a){\"use strict\";a(function(){return function(a){return a.prototype[\"with\"]=a.prototype.withThis=function(a){var b=this._beget(),c=b._handler;return c.receiver=a,this._handler.chain(c,a),b},a}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a()})},{}],21:[function(b,c,d){!function(a){\"use strict\";a(function(a){function b(){return\"undefined\"!=typeof process&&\"[object process]\"===Object.prototype.toString.call(process)}function c(){return\"function\"==typeof MutationObserver&&MutationObserver||\"function\"==typeof WebKitMutationObserver&&WebKitMutationObserver}function d(a){function b(){var a=c;c=void 0,a()}var c,d=document.createTextNode(\"\"),e=new a(b);e.observe(d,{characterData:!0});var f=0;return function(a){c=a,d.data=f^=1}}var e,f=\"undefined\"!=typeof setTimeout&&setTimeout,g=function(a,b){return setTimeout(a,b)},h=function(a){return clearTimeout(a)},i=function(a){return f(a,0)};if(b())i=function(a){return process.nextTick(a)};else if(e=c())i=d(e);else if(!f){var j=a,k=j(\"vertx\");g=function(a,b){return k.setTimer(b,a)},h=k.cancelTimer,i=k.runOnLoop||k.runOnContext}return{setTimer:g,clearTimer:h,asap:i}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{}],22:[function(b,c,d){!function(a){\"use strict\";a(function(){function a(a){var c=\"object\"==typeof a&&null!==a&&a.stack?a.stack:b(a);return a instanceof Error?c:c+\" (WARNING: non-Error used)\"}function b(a){var b=String(a);return\"[object Object]\"===b&&\"undefined\"!=typeof JSON&&(b=c(a,b)),b}function c(a,b){try{return JSON.stringify(a)}catch(c){return b}}return{formatError:a,formatObject:b,tryStringify:c}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a()})},{}],23:[function(b,c,d){!function(a){\"use strict\";a(function(){function a(a,b,c){return a[c]=b,a}function b(a){return\"function\"==typeof a?a.bind():Object.create(a)}return function(c,d,e,f){return\"undefined\"==typeof d&&(d=a),Object.keys(f).reduce(function(a,b){var e=f[b];return\"function\"==typeof e?d(a,c(e),b):a},\"undefined\"==typeof e?b(f):e)}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a()})},{}],24:[function(b,c,d){!function(a){\"use strict\";a(function(){return function(a){function b(a,b){this._handler=a===t?b:c(a)}function c(a){function b(a){e.resolve(a)}function c(a){e.reject(a)}function d(a){e.notify(a)}var e=new v;try{a(b,c,d)}catch(f){c(f)}return e}function d(a){return I(a)?a:new b(t,new w(q(a)))}function e(a){return new b(t,new w(new z(a)))}function f(){return _}function g(){return new b(t,new v)}function h(a,b){var c=new v(a.receiver,a.join().context);return new b(t,c)}function i(a){return k(S,null,a)}function j(a,b){return k(N,a,b)}function k(a,c,d){function e(b,e,g){g.resolved||l(d,f,b,a(c,e,b),g)}function f(a,b,c){k[a]=b,0===--j&&c.become(new y(k))}for(var g,h=\"function\"==typeof c?e:f,i=new v,j=d.length>>>0,k=new Array(j),m=0;m<d.length&&!i.resolved;++m)g=d[m],void 0!==g||m in d?l(d,h,m,g,i):--j;return 0===j&&i.become(new y(k)),new b(t,i)}function l(a,b,c,d,e){if(J(d)){var f=r(d),g=f.state();0===g?f.fold(b,c,void 0,e):g>0?b(c,f.value,e):(e.become(f),m(a,c+1,f))}else b(c,d,e)}function m(a,b,c){for(var d=b;d<a.length;++d)n(q(a[d]),c)}function n(a,b){if(a!==b){var c=a.state();0===c?a.visit(a,void 0,a._unreport):0>c&&a._unreport()}}function o(a){return\"object\"!=typeof a||null===a?e(new TypeError(\"non-iterable passed to race()\")):0===a.length?f():1===a.length?d(a[0]):p(a)}function p(a){var c,d,e,f=new v;for(c=0;c<a.length;++c)if(d=a[c],void 0!==d||c in a){if(e=q(d),0!==e.state()){f.become(e),m(a,c+1,e);break}e.visit(f,f.resolve,f.reject)}return new b(t,f)}function q(a){return I(a)?a._handler.join():J(a)?s(a):new y(a)}function r(a){return I(a)?a._handler.join():s(a)}function s(a){try{var b=a.then;return\"function\"==typeof b?new x(b,a):new y(a)}catch(c){return new z(c)}}function t(){}function u(){}function v(a,c){b.createContext(this,c),this.consumers=void 0,this.receiver=a,this.handler=void 0,this.resolved=!1}function w(a){this.handler=a}function x(a,b){v.call(this),V.enqueue(new F(a,b,this))}function y(a){b.createContext(this),this.value=a}function z(a){b.createContext(this),this.id=++Z,this.value=a,this.handled=!1,this.reported=!1,this._report()}function A(a,b){this.rejection=a,this.context=b}function B(a){this.rejection=a}function C(){return new z(new TypeError(\"Promise cycle\"))}function D(a,b){this.continuation=a,this.handler=b}function E(a,b){this.handler=b,this.value=a}function F(a,b,c){this._then=a,this.thenable=b,this.resolver=c}function G(a,b,c,d,e){try{a.call(b,c,d,e)}catch(f){d(f)}}function H(a,b,c,d){this.f=a,this.z=b,this.c=c,this.to=d,this.resolver=Y,this.receiver=this}function I(a){return a instanceof b}function J(a){return(\"object\"==typeof a||\"function\"==typeof a)&&null!==a}function K(a,c,d,e){return\"function\"!=typeof a?e.become(c):(b.enterContext(c),O(a,c.value,d,e),void b.exitContext())}function L(a,c,d,e,f){return\"function\"!=typeof a?f.become(d):(b.enterContext(d),P(a,c,d.value,e,f),void b.exitContext())}function M(a,c,d,e,f){return\"function\"!=typeof a?f.notify(c):(b.enterContext(d),Q(a,c,e,f),void b.exitContext())}function N(a,b,c){try{return a(b,c)}catch(d){return e(d)}}function O(a,b,c,d){try{d.become(q(a.call(c,b)))}catch(e){d.become(new z(e))}}function P(a,b,c,d,e){try{a.call(d,b,c,e)}catch(f){e.become(new z(f))}}function Q(a,b,c,d){try{d.notify(a.call(c,b))}catch(e){d.notify(e)}}function R(a,b){b.prototype=X(a.prototype),b.prototype.constructor=b}function S(a,b){return b}function T(){}function U(){return\"undefined\"!=typeof process&&null!==process&&\"function\"==typeof process.emit?function(a,b){return\"unhandledRejection\"===a?process.emit(a,b.value,b):process.emit(a,b)}:\"undefined\"!=typeof self&&\"function\"==typeof CustomEvent?function(a,b,c){var d=!1;try{var e=new c(\"unhandledRejection\");d=e instanceof c}catch(f){}return d?function(a,d){var e=new c(a,{detail:{reason:d.value,key:d},bubbles:!1,cancelable:!0});return!b.dispatchEvent(e)}:a}(T,self,CustomEvent):T}var V=a.scheduler,W=U(),X=Object.create||function(a){function b(){}return b.prototype=a,new b};b.resolve=d,b.reject=e,b.never=f,b._defer=g,b._handler=q,b.prototype.then=function(a,b,c){var d=this._handler,e=d.join().state();if(\"function\"!=typeof a&&e>0||\"function\"!=typeof b&&0>e)return new this.constructor(t,d);var f=this._beget(),g=f._handler;return d.chain(g,d.receiver,a,b,c),f},b.prototype[\"catch\"]=function(a){return this.then(void 0,a)},b.prototype._beget=function(){return h(this._handler,this.constructor)},b.all=i,b.race=o,b._traverse=j,b._visitRemaining=m,t.prototype.when=t.prototype.become=t.prototype.notify=t.prototype.fail=t.prototype._unreport=t.prototype._report=T,t.prototype._state=0,t.prototype.state=function(){return this._state},t.prototype.join=function(){for(var a=this;void 0!==a.handler;)a=a.handler;return a},t.prototype.chain=function(a,b,c,d,e){this.when({resolver:a,receiver:b,fulfilled:c,rejected:d,progress:e})},t.prototype.visit=function(a,b,c,d){this.chain(Y,a,b,c,d)},t.prototype.fold=function(a,b,c,d){this.when(new H(a,b,c,d))},R(t,u),u.prototype.become=function(a){a.fail()};var Y=new u;R(t,v),v.prototype._state=0,v.prototype.resolve=function(a){this.become(q(a))},v.prototype.reject=function(a){this.resolved||this.become(new z(a))},v.prototype.join=function(){if(!this.resolved)return this;for(var a=this;void 0!==a.handler;)if(a=a.handler,a===this)return this.handler=C();return a},v.prototype.run=function(){var a=this.consumers,b=this.handler;this.handler=this.handler.join(),this.consumers=void 0;for(var c=0;c<a.length;++c)b.when(a[c])},v.prototype.become=function(a){this.resolved||(this.resolved=!0,this.handler=a,void 0!==this.consumers&&V.enqueue(this),void 0!==this.context&&a._report(this.context))},v.prototype.when=function(a){this.resolved?V.enqueue(new D(a,this.handler)):void 0===this.consumers?this.consumers=[a]:this.consumers.push(a)},v.prototype.notify=function(a){this.resolved||V.enqueue(new E(a,this))},v.prototype.fail=function(a){var b=\"undefined\"==typeof a?this.context:a;this.resolved&&this.handler.join().fail(b)},v.prototype._report=function(a){this.resolved&&this.handler.join()._report(a)},v.prototype._unreport=function(){this.resolved&&this.handler.join()._unreport()},R(t,w),w.prototype.when=function(a){V.enqueue(new D(a,this))},w.prototype._report=function(a){this.join()._report(a)},w.prototype._unreport=function(){this.join()._unreport()},R(v,x),R(t,y),y.prototype._state=1,y.prototype.fold=function(a,b,c,d){L(a,b,this,c,d)},y.prototype.when=function(a){K(a.fulfilled,this,a.receiver,a.resolver)};var Z=0;R(t,z),z.prototype._state=-1,z.prototype.fold=function(a,b,c,d){d.become(this)},z.prototype.when=function(a){\"function\"==typeof a.rejected&&this._unreport(),K(a.rejected,this,a.receiver,a.resolver)},z.prototype._report=function(a){V.afterQueue(new A(this,a))},z.prototype._unreport=function(){this.handled||(this.handled=!0,V.afterQueue(new B(this)))},z.prototype.fail=function(a){this.reported=!0,W(\"unhandledRejection\",this),b.onFatalRejection(this,void 0===a?this.context:a)},A.prototype.run=function(){this.rejection.handled||this.rejection.reported||(this.rejection.reported=!0,W(\"unhandledRejection\",this.rejection)||b.onPotentiallyUnhandledRejection(this.rejection,this.context))},B.prototype.run=function(){this.rejection.reported&&(W(\"rejectionHandled\",this.rejection)||b.onPotentiallyUnhandledRejectionHandled(this.rejection))},b.createContext=b.enterContext=b.exitContext=b.onPotentiallyUnhandledRejection=b.onPotentiallyUnhandledRejectionHandled=b.onFatalRejection=T;var $=new t,_=new b(t,$);return D.prototype.run=function(){this.handler.join().when(this.continuation)},E.prototype.run=function(){var a=this.handler.consumers;if(void 0!==a)for(var b,c=0;c<a.length;++c)b=a[c],M(b.progress,this.value,this.handler,b.receiver,b.resolver)},F.prototype.run=function(){function a(a){d.resolve(a)}function b(a){d.reject(a)}function c(a){d.notify(a)}var d=this.resolver;G(this._then,this.thenable,a,b,c)},H.prototype.fulfilled=function(a){this.f.call(this.c,this.z,a,this.to)},H.prototype.rejected=function(a){this.to.reject(a)},H.prototype.progress=function(a){this.to.notify(a)},b}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a()})},{}],25:[function(b,c,d){!function(a){\"use strict\";a(function(){function a(){return{state:\"pending\"}}function b(a){return{state:\"rejected\",reason:a}}function c(a){return{state:\"fulfilled\",value:a}}function d(d){var e=d.state();return 0===e?a():e>0?c(d.value):b(d.value)}return{pending:a,fulfilled:c,rejected:b,inspect:d}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a()})},{}],26:[function(b,c,d){!function(a){a(function(a){function b(a,b){return n(a,this,b||[])}function c(a,b,c,d){var e=g(d);try{switch(c.length){case 2:a.call(b,c[0],c[1],e);break;case 1:a.call(b,c[0],e);break;case 0:a.call(b,e);break;default:c.push(e),a.apply(b,c)}}catch(f){d.reject(f)}}function d(a){return n(a,this,m.call(arguments,1))}function e(a){var b=arguments.length>1?m.call(arguments,1):[];return function(){var c,d=b.length,e=arguments.length,f=new Array(e+d);for(c=0;d>c;++c)f[c]=b[c];for(c=0;e>c;++c)f[c+d]=arguments[c];return n(a,this,f)}}function f(a,b,c){return k(e,b,c,a)}function g(a){return function(b,c){b?a.reject(b):arguments.length>2?a.resolve(m.call(arguments,1)):a.resolve(c)}}function h(a,b){function c(a){d(null,a)}function d(a,c){l(function(){b(a,c)},0)}return a=j(a),b&&a.then(c,d),a}function i(a){return function(b){return h(b,a)}}var j=a(\"./when\"),k=a(\"./lib/liftAll\"),l=a(\"./lib/env\").setTimer,m=Array.prototype.slice,n=a(\"./lib/apply\")(j.Promise,c);return{lift:e,liftAll:f,apply:b,call:d,createCallback:g,bindCallback:h,liftCallback:i}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{\"./lib/apply\":11,\"./lib/env\":21,\"./lib/liftAll\":23,\"./when\":32}],27:[function(b,c,d){!function(a){a(function(a){var b=a(\"./when\"),c=b.Promise.all,d=Array.prototype.slice;return function(a){return c(d.call(arguments,1)).then(function(c){return b.map(a,function(a){return a.apply(void 0,c)})})}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{\"./when\":32}],28:[function(b,c,d){!function(a){a(function(a){var b=a(\"./when\"),c=b.Promise.all,d=Array.prototype.slice;return function(a){var e=function(a,b){return e=function(a,b){return b(a)},b.apply(null,a)};return c(d.call(arguments,1)).then(function(c){return b.reduce(a,function(a,b){return e(a,b)},c)})}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{\"./when\":32}],29:[function(b,c,d){!function(a){\"use strict\";a(function(a){var b=a(\"./when\"),c=b[\"try\"],d=a(\"./cancelable\");return function(a,e,f,g){function h(a){k.resolve(a)}function i(a){c(e).then(j,m),void 0!==a&&k.notify(a)}function j(){l||b(a(),function(a){b(f(a),function(b){return b?h(a):i(a)},function(){i(a)})},m)}var k,l,m;return l=!1,k=d(b.defer(),function(){l=!0}),m=k.reject,f=f||function(){return!1},\"function\"!=typeof e&&(e=function(a){return function(){return b().delay(a)}}(e)),g?i():j(),k.promise=Object.create(k.promise),k.promise.cancel=k.cancel,k.promise}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{\"./cancelable\":3,\"./when\":32}],30:[function(b,c,d){!function(a){a(function(a){var b=a(\"./when\"),c=b.Promise.all,d=Array.prototype.slice;return function(a){function e(a){return f.push(a),f}var f=[];return c(d.call(arguments,1)).then(function(c){return b.reduce(a,function(a,d){return b(d.apply(void 0,c),e)},f)})}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{\"./when\":32}],31:[function(b,c,d){!function(a){a(function(a){var b=a(\"./when\");return function(a,c){return b(c).timeout(a)}})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{\"./when\":32}],32:[function(b,c,d){!function(a){\"use strict\";a(function(a){function b(a,b,c,d){var e=x.resolve(a);return arguments.length<2?e:e.then(b,c,d)}function c(a){return new x(a)}function d(a){return function(){for(var b=0,c=arguments.length,d=new Array(c);c>b;++b)d[b]=arguments[b];return y(a,this,d)}}function e(a){for(var b=0,c=arguments.length-1,d=new Array(c);c>b;++b)d[b]=arguments[b+1];return y(a,this,d)}function f(){return new g}function g(){function a(a){d._handler.resolve(a)}function b(a){d._handler.reject(a)}function c(a){d._handler.notify(a)}var d=x._defer();this.promise=d,this.resolve=a,this.reject=b,this.notify=c,this.resolver={resolve:a,reject:b,notify:c}}function h(a){return a&&\"function\"==typeof a.then}function i(){return x.all(arguments)}function j(a){return b(a,x.all)}function k(a){return b(a,x.settle)}function l(a,c){return b(a,function(a){return x.map(a,c)})}function m(a,c){return b(a,function(a){return x.filter(a,c)})}var n=a(\"./lib/decorators/timed\"),o=a(\"./lib/decorators/array\"),p=a(\"./lib/decorators/flow\"),q=a(\"./lib/decorators/fold\"),r=a(\"./lib/decorators/inspect\"),s=a(\"./lib/decorators/iterate\"),t=a(\"./lib/decorators/progress\"),u=a(\"./lib/decorators/with\"),v=a(\"./lib/decorators/unhandledRejection\"),w=a(\"./lib/TimeoutError\"),x=[o,p,q,s,t,r,u,n,v].reduce(function(a,b){return b(a)},a(\"./lib/Promise\")),y=a(\"./lib/apply\")(x);return b.promise=c,b.resolve=x.resolve,b.reject=x.reject,b.lift=d,b[\"try\"]=e,b.attempt=e,b.iterate=x.iterate,b.unfold=x.unfold,b.join=i,b.all=j,b.settle=k,b.any=d(x.any),b.some=d(x.some),b.race=d(x.race),b.map=l,b.filter=m,b.reduce=d(x.reduce),b.reduceRight=d(x.reduceRight),b.isPromiseLike=h,b.Promise=x,b.defer=f,b.TimeoutError=w,b})}(\"function\"==typeof a&&a.amd?a:function(a){c.exports=a(b)})},{\"./lib/Promise\":8,\"./lib/TimeoutError\":10,\"./lib/apply\":11,\"./lib/decorators/array\":12,\"./lib/decorators/flow\":13,\"./lib/decorators/fold\":14,\"./lib/decorators/inspect\":15,\"./lib/decorators/iterate\":16,\"./lib/decorators/progress\":17,\"./lib/decorators/timed\":18,\"./lib/decorators/unhandledRejection\":19,\"./lib/decorators/with\":20}]},{},[1])(1)});"
  },
  {
    "path": "common/graphAnalyser.js",
    "content": "(function() {\n\nvar isNode = typeof(process) !== 'undefined'\nvar when = isNode ? require('when') : window.when\n\nif (isNode) {\n\tE2 = require('../browser/scripts/core').E2\n}\n\nvar loadingPlugins = Object.keys(E2.LOADING_NODES)\n\nvar audioPlugins = [\n\t'url_audio_buffer_generator',\n\t'url_audio_generator'\n]\n\nvar videoPlugins = [\n\t'url_video_generator'\n]\n\nfunction GraphAnalyser(gfs) {\n\tif (!gfs)\n\t\tthrow new Error('GraphAnalyser needs a GridFS instance.')\n\tthis._fs = gfs\n}\n\nGraphAnalyser.prototype.parseAssets = function(graph) {\n\tvar that = this\n\tvar stat = {\n\t\tsize: 0,\n\t\tnumAssets: 0,\n\t\tnumNodes: 0,\n\t\thasAudio: false,\n\t\thasVideo: false,\n\t\ttype: 'patch'\n\t}\n\n\tfunction readRoot(graph) {\n\t\tif (!graph.nodes || !graph.nodes.length)\n\t\t\treturn console.error('No nodes to GraphAnalyser.parseAssets')\n\n\t\tvar patchNode = graph.nodes[0]\n\t\tvar patchNodeId = patchNode.plugin\n\t\tvar isPatchNode = (E2.GRAPH_NODES.indexOf(patchNodeId) > -1)\n\n\t\tif (!isPatchNode)\n\t\t\treturn;\n\n\t\tvar patchStrongType = 'patch'\n\n\t\t// catch single-node patches with matching outputs\n\t\tif (graph.nodes.length === 1 && patchNode.dyn_out) {\n\t\t\t// maybe entity / other typed patch\n\t\t\tvar soloOutName = patchNode.dyn_out[0].name\n\t\t\tswitch(soloOutName) {\n\t\t\t\tcase 'object3d':\n\t\t\t\t\tpatchStrongType = 'entity'\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'position':\n\t\t\t\tcase 'rotation':\n\t\t\t\tcase 'scale':\n\t\t\t\tcase 'material':\n\t\t\t\t\tpatchStrongType = 'entity_component'\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tstat.type = patchStrongType\n\t}\n\n\tfunction walkGraph(subgraph) {\n\t\tif (!subgraph.nodes)\n\t\t\treturn when.resolve()\n\n\t\treturn when.map(subgraph.nodes, function(node) {\n\t\t\tvar id = node.plugin.id || node.plugin\n\n\t\t\tstat.numNodes++\n\n\t\t\tif (E2.GRAPH_NODES.indexOf(id) > -1)\n\t\t\t\treturn walkGraph(node.graph || node.plugin.graph)\n\n\t\t\tif (loadingPlugins.indexOf(id) === -1)\n\t\t\t\treturn\n\n\t\t\tvar aurl = node.state ? node.state.url : node.plugin.state.url\n\t\t\t\n\t\t\tif (!aurl)\n\t\t\t\treturn\n\n\t\t\tif (audioPlugins.indexOf(id) > -1)\n\t\t\t\tstat.hasAudio = true\n\n\t\t\tif (videoPlugins.indexOf(id) > -1) {\n\t\t\t\tstat.hasAudio = true\n\t\t\t\tstat.hasVideo = true\n\t\t\t}\n\n\t\t\t// on server, remove /data from path\n\t\t\tif (isNode)\n\t\t\t\taurl = aurl.replace(/^\\/data/, '')\n\n\t\t\tstat.numAssets++;\n\n\t\t\treturn that._fs.stat(aurl)\n\t\t\t.then(function(assetStat) {\n\t\t\t\tif (!assetStat) // not found\n\t\t\t\t\treturn;\n\n\t\t\t\tstat.size += assetStat.length\n\t\t\t})\n\t\t})\n\t}\n\t\n\treadRoot(graph)\n\t\n\treturn walkGraph(graph)\n\t.then(function() {\n\t\treturn stat\n\t})\n}\n\nGraphAnalyser.prototype.analyseJson = function(graphJson) {\n\tvar graph\n\n\ttry {\n\t\tgraph = JSON.parse(graphJson)\n\t} catch(e) {\n\t\tconsole.error('PARSE ERROR', e.stack)\n\t\treturn e\n\t}\n\t\n\treturn this.analyseGraph(graph)\n}\n\nGraphAnalyser.prototype.analyseGraph = function(graph) {\n\treturn this.parseAssets(!!graph.root ? graph.root : graph)\n}\n\nif (isNode)\n\tmodule.exports.GraphAnalyser = GraphAnalyser\nelse\n\tE2.GraphAnalyser = GraphAnalyser\n\n})()\n\n"
  },
  {
    "path": "config/config.js",
    "content": "module.exports = {\n\tserver: {\n\t\tdebug: true,\n\t\tenableChannels: true,\n\t\tenableOSC: true,\n\t\toscPort: 8001,\n\t\tenableFrameDumping: true,\n\t\t//useCDN: true,\n\t\tuseCDN: process.env.NODE_ENV === 'production',\n\t\tcdnRoot: 'https://cdn.vizor.io',\n\t\tengiPath: './browser/',\n\t\thost: '127.0.0.1',\n\t\tport: 8000\n\t}\n}\n"
  },
  {
    "path": "config/passport.js",
    "content": "var _ = require('lodash');\nvar passport = require('passport');\nvar LocalStrategy = require('passport-local').Strategy;\nvar User = require('../models/user');\nvar secrets = require('./secrets');\n\nfunction error401() {\n\tvar e = new Error('Authorization required');\n\te.status = 401;\n\treturn e;\n}\n\npassport.serializeUser(function(user, done)\n{\n\tdone(null, user.id);\n});\n\npassport.deserializeUser(function(id, done)\n{\n\tUser.findById(id, function(err, user)\n\t{\n\t\tdone(err, user);\n\t});\n});\n\n// Sign in using Email and Password.\npassport.use(new LocalStrategy({ usernameField: 'email' }, function(email, password, done) {\n\tvar emailRe = new RegExp('^'+email+'$', 'i')\n\tUser.findOne({ email: emailRe }, function(err, user) {\n\t\tif (!user)\n\t\t\treturn done(null, false, { param: 'email', value: email, message: 'That account does not exist.' })\n\n\t\tuser.comparePassword(password, function(err, isMatch) {\n\t\t\tif (isMatch)\n\t\t\t\treturn done(null, user)\n\n\t\t\treturn done(null, false, { param: 'password', message: 'Incorrect password.' })\n\t\t})\n\t})\n}))\n\n// Login Required middleware.\nexports.isAuthenticated = function(req, res, next) {\n\tif (req.isAuthenticated())\n\t\treturn next()\n\n\tif (req.xhr)\n\t\treturn next(error401())\n\n\tres.redirect('/login')\n}\n\n// Authorization Required middleware.\nexports.isAuthorized = function(req, res, next) {\n\tvar provider = req.path.split('/').slice(-1)[0];\n\n\tif (_.find(req.user.tokens, { kind: provider })) {\n\t\tnext()\n\t} else {\n\t\tres.redirect('/auth/' + provider)\n\t}\n}\n"
  },
  {
    "path": "config/secrets.js",
    "content": "module.exports = {\n\tdb: process.env.MONGODB || 'mongodb://localhost:27017/vizor',\n\tgridFs: process.env.GRIDFS || 'mongodb://localhost:27017/vizor-assets',\n\tsessionSecret: process.env.SESSION_SECRET || 'vizor',\n\tmandrill: process.env.MANDRILL || 'mandrillSecretNotThere',\n};\n"
  },
  {
    "path": "config/settings.js",
    "content": "module.exports = {\n\tfqdn: process.env.FQDN || 'localhost:8000'\n}"
  },
  {
    "path": "controllers/assetController.js",
    "content": "var User = require('../models/user');\nvar fsPath = require('path')\nvar checksum = require('checksum')\nvar assetHelper = require('../models/asset-helper')\nvar streamFile = require('../lib/streamFile');\n\nfunction AssetController(modelClass, assetService, fs) {\n\tthis._model = modelClass\n\tthis._modelName = this._model.modelName.toString().toLowerCase()\n\tthis._service = assetService\n\tthis._fs = fs\n}\n\nAssetController.prototype.validate = function(req, res, next) {\n\tvar asset = new this._model(req.body)\n\n\tasset.validate(function(err) {\n\t\tif (err)\n\t\t\treturn res.status(400).json(err.errors)\n\n\t\tnext()\n\t})\n}\n\nAssetController.prototype.streamFile = function(req, res, next) {\n\tthis._service.findByPath(req.path)\n\t.then(asset => {\n\t\tif (!asset)\n\t\t\treturn next()\n\n\t\tvar fakereq = {\n\t\t\tpath: asset.url,\n\t\t\theaders: req.headers,\n\t\t\theader: req.header,\n\t\t}\n\t\treturn streamFile(fakereq, res, next, this._fs).catch(next)\n\t})\n}\n\n// GET /:model\nAssetController.prototype.userIndex = function(req, res, next) {\n\tvar dfd\n\n\tif (req.params.username === 'vizor') {\n\t\tdfd = this._service.findByCreatorName(req.params.username)\n\t} else {\n\t\tdfd = this._service.findByCreatorId(req.session.userId)\n\t}\n\n\tdfd.then(function(list) {\n\t\tres.json(list)\n\t})\n\t.catch(next)\n}\n\nAssetController.prototype.index = function(req, res, next) {\n\tthis._service.list()\n\t.then(function(list) {\n\t\tres.json(list)\n\t})\n\t.catch(next)\n}\n\nAssetController.prototype._parseTags = function(tags) {\n\tif (!tags || !tags.length)\n\t\treturn []\n\n\tif (!Array.isArray(tags))\n\t\ttags = tags.split(' ')\n\n\treturn tags.map(function(tag) {\n\t\treturn tag.replace(/[^a-zA-Z0-9]/g, '')\n\t})\n\t.filter(function(tag) {\n\t\treturn tag.length > 0\n\t})\n}\n\nAssetController.prototype._makePath = function(req, path) {\n\treturn '/' + fsPath.join(\n\t\treq.user.username,\n\t\t'assets',\n\t\tthis._modelName,\n\t\tassetHelper.slugify(\n\t\t\tfsPath.basename(path, fsPath.extname(path))\n\t\t) + fsPath.extname(path)\n\t)\n}\n\nAssetController.prototype._makeGridFsPath = function(req) {\n\tvar file = req.files.file\n\treturn '/'+this._modelName+'/'+file.sha1+fsPath.extname(file.path)\n}\n\n// eg. GET /:username/patches.json\nAssetController.prototype.findByCreatorName = function(req, res, next) {\n\tthis._service\n\t.findByCreatorName(req.params.username)\n\t.then(function(list) {\n\t\tres.json(list)\n\t})\n\t.catch(next)\n}\n\n// GET /:username/assets/:model/tag/:tag\nAssetController.prototype.findByTagAndUsername = function(req, res, next) {\n\tvar that = this\n\tvar tag = req.params.tag\n\n\tif (!tag) {\n\t\treturn res.status(400).json({\n\t\t\tmessage: 'No tag given'\n\t\t})\n\t}\n\n\tfunction performFind(userId) {\n\t\tthat._service.findByTagAndUserId(tag, userId)\n\t\t.then(function(list) {\n\t\t\tres.json(list)\n\t\t})\n\t\t.catch(next)\n\t}\n\n\tUser.findOne({ username: req.params.username })\n\t.exec(function(err, user) {\n\t\tif (err)\n\t\t\treturn next(err)\n\n\t\tif (!user)\n\t\t\treturn res.json([])\n\n\t\tperformFind(user._id)\n\t})\n}\n\n// GET /:model/:slug\nAssetController.prototype.load = function(req, res, next) {\n\tthis._service.findByPath(req.params.path)\n\t.then(function(item) {\n\t\tres.json(item)\n\t})\n\t.catch(next)\n}\n\n// POST /:model\nAssetController.prototype.save = function(req, res, next) {\n\tvar that = this\n\n\tthis._service.canWrite(req.user, req.body.path)\n\t.then(function(can) {\n\t\tif (!can) {\n\t\t\treturn res.status(403).json({\n\t\t\t\tmessage: 'Sorry, permission denied'\n\t\t\t})\n\t\t}\n\n\t\treturn that._service.save(req.body, req.user)\n\t\t.then(function(asset) {\n\t\t\tasset.tags = that._parseTags(req.body.tags)\n\t\t\tres.json(asset)\n\t\t})\n\t})\n}\n\nAssetController.prototype.checksumUpload = function(req, res, next) {\n\tif (!req.files || !req.files.file)\n\t\treturn next(new Error('No files uploaded'));\n\n\tchecksum.file(req.files.file.path, function(err, sum) {\n\t\tif (err)\n\t\t\treturn next(err)\n\n\t\treq.files.file.sha1 = sum\n\n\t\tnext()\n\t})\n}\n\nAssetController.prototype.canWriteUpload = function(req, res, next) {\n\tvar that = this;\n\n\tif (!req.files)\n\t\treturn next(new Error('No files uploaded'))\n\n\tvar file = req.files.file\n\tvar dest = this._makePath(req, file.path)\n\n\tthat._service.canWrite(req.user, dest)\n\t.then(function(can)\n\t{\n\t\tif (!can)\n\t\t\treturn res.status(403)\n\t\t\t\t.json({message: 'Sorry, permission denied'})\n\n\t\tnext()\n\t})\n}\n\nAssetController.prototype.canWriteUploadAnonymous = function(req, res, next) {\n\tvar that = this;\n\n\tif (!req.files)\n\t\treturn next(new Error('No files uploaded'))\n\n\tvar file = req.files.file\n\n\t// Fake the user\n\treq.user = {\n\t\tusername: 'v'\n\t}\n\tvar dest = this._makePath(req, file.path)\n\n\tthat._service.canWriteAnonymous(dest)\n\t.then(function(can)\n\t{\n\t\tif (!can)\n\t\t\treturn res.status(403)\n\t\t\t\t.json({message: 'Sorry, permission denied'})\n\n\t\tnext()\n\t})\n}\n\nAssetController.prototype.upload = function(req, res, next) {\n\tvar that = this\n\n\tvar file = req.files.file\n\tvar path = this._makePath(req, file.path)\n\tvar gridFsPath = this._makeGridFsPath(req)\n\n\treturn that._service.canWrite(req.user, path)\n\t.then(function(can) {\n\t\tif (!can)\n\t\t\treturn res.status(403)\n\t\t\t\t.json({message: 'Sorry, permission denied'})\n\n\t\t// move the uploaded file into GridFS / local FS\n\t\treturn that._fs.move(file.path, gridFsPath)\n\t\t.then(function(url) {\n\t\t\treturn that._service.findByPath(path)\n\t\t\t.then(function(model) {\n\t\t\t\tif (!model)\n\t\t\t\t\tmodel = { path: path }\n\n\t\t\t\tmodel.url = url\n\n\t\t\t\t// save/update the model\n\t\t\t\treturn that._service.save(model, req.user)\n\t\t\t\t.then(function(asset) {\n\t\t\t\t\tres.json(asset)\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t})\n\t.catch(function(err)\n\t{\n\t\treturn next(err)\n\t})\n}\n\nmodule.exports = AssetController\n"
  },
  {
    "path": "controllers/controllerHelpers.js",
    "content": "var _ = require('lodash')\n\nexports.responseStatusSuccess = function responseStatusSuccess(message, data, options) {\n    return _.extend(options || {}, {\n    \tsuccess: true,\n    \tmessage: message,\n    \tdata: data || {}\n    })\n}\n\nexports.responseStatusError = function responseStatusError(message, errors, options) {\n\terrors = errors || []\n\n\tif (!(errors instanceof Array))\n\t\terrors = [errors]\n\n    return _.extend(options || {}, {\n    \tsuccess: false,\n    \tmessage: message,\n    \terrors: errors || []\n    })\n}\n\n// genericXHRform <3 expressValidator.defaults.errorFormatter\nexports.formatResponseError = function formatResponseError(param, value, msg) {\n\treturn {\n\t\tparam: param,\n\t\tmsg: msg,\n\t\tvalue: value\n\t}\n}\n\nexports.parseErrors = function parseErrors(errors) {\n\tvar parsedErrors = []\n\n\tif (!(errors instanceof Array))\n\t\terrors = [errors]\n\n\tfor(var i=0; i < errors.length; i++) {\n\t\tparsedErrors.push({ message: errors[i].msg })\n\t}\n\n\treturn parsedErrors\n}\n\nexports.metaScript = function(path) {\n\tvar parts = path.split('/')\n\treturn [process.startTime]\n\t\t.concat(parts[0])\n\t\t.concat(parts.splice(1))\n\t\t.join('/')\n}\n\n// send xhr/json response, or redirect with flash message\n// common pattern for handling forms in backend controllers\nexports.respond = function respond(req, res, status, message, bodyOrErrors, responseOptions, redirectIfNotXHR) {\n\tvar response\n\tvar isOk = (status === 200)\n\n\tvar isXHR = req.xhr || req.path.slice(-5) === '.json'\n\n\tif (isOk)\n\t\tresponse = exports.responseStatusSuccess(message, bodyOrErrors, responseOptions)\n\telse\n\t\tresponse = exports.responseStatusError(message, bodyOrErrors, responseOptions)\n\n\tif (isXHR)\n\t\treturn res.status(status).json(response)\n\telse {\n\t\tif (isOk)\n\t\t\treq.flash('success', {message: message})\n\t\telse\n\t\t\treq.flash('errors', exports.parseErrors(bodyOrErrors))\n\n\t\tif (redirectIfNotXHR)\n\t\t\treturn res.redirect(redirectIfNotXHR)\n\n\t\tconsole.error('controllerHelper.respond but no xhr and no redirectIfNotXHR')\n\t}\n}\n"
  },
  {
    "path": "controllers/documentationController.js",
    "content": "var fs = require('fs')\nvar fsPath = require('path')\nvar marked = require('marked');\n\nfunction DocumentationController() {\n}\n\nDocumentationController.prototype.parsePluginDocumentation = function(markdown) {\n\tfunction getSubstring(str, beginMarker, endMarker) {\n\t\tvar beginMarkerIndex = str.indexOf(beginMarker)\n\t\tvar substr = beginMarkerIndex !== -1 ? str.substring(beginMarkerIndex + beginMarker.length) : \"\"\n\t\tvar endMarkerIndex = substr.indexOf(endMarker)\n\t\treturn (endMarkerIndex !== -1 ? substr.substring(0, endMarkerIndex) : substr).trim()\n\t}\n\n\tfunction getSubstrings(str, beginMarker, endMarker) {\n\t\tvar result = []\n\t\tvar workbuffer = str\n\t\twhile (workbuffer.length > 0) {\n\t\t\tvar ss = getSubstring(workbuffer, beginMarker, endMarker)\n\t\t\tif (!ss) {\n\t\t\t\treturn result\n\t\t\t}\n\n\t\t\tworkbuffer = workbuffer.substring(workbuffer.indexOf(ss) + ss.length)\n\n\t\t\tresult.push(ss)\n\t\t}\n\n\t\treturn result\n\t}\n\n\tvar result = {\n\t\tdesc: desc,\n\t\tinputs: [],\n\t\toutputs: []\n\t}\n\n\tvar desc = getSubstring(markdown, '##Description', '\\n\\n')\n\tvar inputs = getSubstring(markdown, '##Inputs', '##Outputs')\n\tvar outputs = getSubstring(markdown, '##Outputs', '##Detail')\n\n\tresult.desc = marked(desc)\n\n\tinputs = getSubstrings(inputs, '###', '\\n\\n')\n\toutputs = getSubstrings(outputs, '###', '\\n\\n')\n\n\t// extract Name (first line) from:\n\t// Name\n\t// Description\n\tfunction getName(str) {\n\t\tstr = str.trim()\n\t\tvar linelen = str.indexOf('\\n')\n\t\tvar name = linelen > 0 ? str.substring(0, linelen) : str\n\t\tif (!name) {\n\t\t\tconsole.error('no name in', str)\n\t\t}\n\t\treturn name\n\t}\n\n\t// extract Description (everything but the first line) from:\n\t// ###Name\n\t// Description\n\tfunction getDesc(str) {\n\t\tstr = str.trim()\n\t\tvar linelen = str.indexOf('\\n')\n\t\tvar desc = linelen > 0 ? str.substring(linelen) : \"\"\n\t\treturn desc\n\t}\n\n\tfor (var i = 0; i < inputs.length; ++i) {\n\t\tresult.inputs.push({name: getName(inputs[i]), desc: marked(getDesc(inputs[i]))})\n\t}\n\tfor (var i = 0; i < outputs.length; ++i) {\n\t\tresult.outputs.push({name: getName(outputs[i]), desc: marked(getDesc(outputs[i]))})\n\t}\n\n\treturn result\n}\n\nDocumentationController.prototype.getPluginDocumentation = function(req, res, next) {\n\tvar pluginName = req.params.pluginName\n\n\tvar pluginNameIsValid = /^[a-zA-Z0-9._-]*$/.test(pluginName)\n\n\tif (!pluginNameIsValid) {\n\t\tvar err = new Error('Invalid Plugin name:' + pluginName)\n\t\treturn res.json({ error: 404 })\n\t}\n\n\tvar docPath = './documentation/browser/plugins/' + pluginName + \".md\"\n\n\tvar that = this\n\n\tfs.stat(docPath, function(err, exists) {\n\t\tif (err) {\n\t\t\tvar e = new Error(err.toString()+docPath);\n\t\t\te.status = 404\n\n\t\t\treturn next(e)\n\t\t}\n\n\t\tfs.readFile(docPath, function(err, markdown) {\n\t\t\tif (err) {\n\t\t\t\tvar e = new Error(err.toString()+docPath);\n\t\t\t\te.status = 404\n\t\t\t\treturn next(err)\n\t\t\t}\n\n\t\t\tres.json(that.parsePluginDocumentation(markdown.toString()))\n\n\t\t})\n\t})\n}\n\nmodule.exports = DocumentationController;\n"
  },
  {
    "path": "controllers/editLogController.js",
    "content": "var EditLog = require('../models/editLog')\n\nfunction EditLogController() {\n}\n\nEditLogController.prototype._canWrite = function(editLog, user) {\n\tvar creator = editLog._creator\n\n\tif (!creator)\n\t\treturn false;\n\n\tif (creator._id)\n\t\tcreator = creator._id\n\n\treturn !editLog ||\n\t\tcreator.toString() === user.id.toString()\n}\n\nEditLogController.prototype.show = function(req, res, next) {\n\tEditLog.findOne({ name: req.params.channelName })\n\t.exec(function(err, editLog) {\n\t\tif (err)\n\t\t\treturn next(err)\n\n\t\treturn res.json(editLog)\n\t})\n}\n\nEditLogController.prototype.save = function(req, res, next) {\n\tvar that = this\n\tvar editLog\n\n\tfunction saveLog() {\n\t\teditLog.updatedAt = Date.now()\n\t\teditLog.save(function(err) {\n\t\t\tif (err)\n\t\t\t\treturn next(err)\n\n\t\t\tres.json(editLog)\n\t\t})\n\t}\n\n\tEditLog.findOne({ name: req.params.channelName })\n\t.exec(function(err, exLog) {\n\t\tif (err)\n\t\t\treturn next(err)\n\n\t\tif (exLog) {\n\t\t\teditLog = exLog\n\n\t\t\tif (!that._canWrite(editLog, req.user)) {\n\t\t\t\treturn res.status(403)\n\t\t\t\t\t.json({message: 'Sorry, permission denied'})\n\t\t\t}\n\n\t\t\teditLog.readableName = req.body.readableName\n\t\t\tsaveLog()\n\t\t} else {\n\t\t\teditLog = new EditLog(req.body)\n\t\t\teditLog.owner = req.user.username\n\t\t\teditLog.participants = [ req.user._id.toString() ]\n\t\n\t\t\tif (!editLog.readableName)\n\t\t\t\teditLog.readableName = editLog.channelName\n\n\t\t\teditLog._creator = req.user\n\n\t\t\tsaveLog()\n\t\t}\n\t})\n}\n\nEditLogController.prototype.join = function(req, res, next) {\n\tEditLog.findOne({ name: req.params.channelName })\n\t.exec(function(err, exLog) {\n\t\tif (err)\n\t\t\treturn next(err)\n\n\t\texLog.addParticipant(req.user._id.toString())\n\t\t.then(function() {\n\t\t\tres.json({ ok: true })\n\t\t})\n\t\t.catch(next)\n\t})\n}\n\nEditLogController.prototype.userIndex = function(req, res, next) {\n\tEditLog.find({ participants: req.user._id.toString() })\n\t.exec(function(err, logs) {\n\t\tif (err)\n\t\t\treturn next(err)\n\n\t\tres.json(logs)\n\t})\n}\n\nmodule.exports = EditLogController;\n"
  },
  {
    "path": "controllers/graphController.js",
    "content": "\nvar _ = require('lodash')\nvar Graph = require('../models/graph')\nvar AssetController = require('./assetController')\nvar fsPath = require('path')\nvar assetHelper = require('../models/asset-helper')\n\nvar Serial = require('../models/serial')\n\nvar templateCache = require('../lib/templateCache').templateCache\n\nvar helper = require('./controllerHelpers')\nvar isStringEmpty = require('../lib/stringUtil').isStringEmpty\nvar PreviewImageProcessor = require('../lib/previewImageProcessor')\n\nvar GraphAnalyser = require('../common/graphAnalyser').GraphAnalyser\n\nvar User = require('../models/user')\nvar EditLog = require('../models/editLog')\n\nvar redis = require('redis')\n\nvar config = require('../config/config.js')\nvar secrets = require('../config/secrets')\nvar Hashids = require('hashids')\nvar hashids = new Hashids(secrets.sessionSecret)\n\nvar parallel = require('when/parallel')\n\nvar fs = require('fs')\nvar packageJson = JSON.parse(fs.readFileSync(__dirname+'/../package.json'))\n\nconst checksum = require('checksum')\n\nlet CDN_ROOT = '/data'\nif (config.server.useCDN)\n\tCDN_ROOT = config.server.cdnRoot\n\nfunction cdnUrl(url) {\n\treturn CDN_ROOT + url.replace(/^\\/data/, '')\n}\n\nfunction renderError(status, res, message) {\n\tres.status(status).render('error', {\n\t\tmessage: message || 'Not found'\n\t})\n}\n\nfunction visitorIsUser(req, user) {\n\tif (!(req && req.user && user))\n\t\treturn false\n\tvar myUid = user._id\n\tvar theirUid = req.user._id\n\treturn myUid && theirUid && (myUid.toString() === theirUid.toString())\n}\n\nfunction ownsGraph(user, graph) {\n\treturn user && graph && user.username && graph.owner && (user.username === graph.owner)\n}\n\nfunction isGraphOwner(user, graph) {\n\treturn user && (user.isAdmin ||\n\t\t((user.id === graph._creator.id) ||\n\t\t(user.id === graph._creator.toString())))\n}\n\nfunction makeHashid(serial) {\n\treturn hashids.encode(serial)\n}\n\nfunction prettyPrintList(list, owners) {\n\tif (!list || !list.length)\n\t\treturn list\n\towners = owners || {}\n\treturn list.map(function(graph) {\n\t\treturn graph.getPrettyInfo(owners[graph._creator])\n\t})\n}\n\nfunction makeGraphSummary(req, graphModel) {\n\tvar graph = graphModel.getPrettyInfo()\n\treturn {\n\t\tid:\t\t\t\tgraph.id,\n\t\tgraphMinUrl: \tcdnUrl(graph.url),\n\t\tgraphName: \t\tgraph.prettyName,\n\t\tpreviewImage: \tcdnUrl(graph.previewUrlLarge),\n\t\tplayerVersion: \tgraph.version,\n\t\tstat:\t\t\tgraph.stat,\n\t\thasAudio:\t\tgraph.hasAudio,\n\t\thasVideo:\t\tgraph.hasVideo,\n\t\tviews: \t\t\tgraph.views,\n\t\tcreatedAt:\t\tgraph.createdAt,\n\t\tupdatedAt:\t\tgraph.updatedAt,\n\t\tcreatedTS:\t\tgraph.createdTS,\n\t\tupdatedTS:\t\tgraph.updatedTS,\n\t\tprivate: \t\tgraph.private,\n\t\teditable: \t\tgraph.editable\n\t}\n}\n\nfunction parsePaging(req, perPage) {\n\tvar page = 0\n\tvar start = 0\n\tif (req.params && typeof req.params.page !== 'undefined') {\n\t\tpage = req.params.page\n\t}\n\telse if (req.query) {\n\t\tpage = req.query.page\n\t\tstart = req.query.start\n\t}\n\n\tpage = parseInt(page, 10) || 1\n\tstart = parseInt(start, 10) || 0\n\tvar pageSize = parseInt(process.env.GRAPHCONTROLLER_PAGE_SIZE, 10) || (perPage || 20)\n\n\tif (page < 1)\n\t\tpage = 1\n\n\tvar offset\n\tif (start) {\n\t\toffset = start\n\t\tpage = 1 + Math.floor(offset / pageSize)\n\t}\n\telse if (page) {\n\t\t// page\n\t\toffset = pageSize * (page - 1)\n\t}\n\n\tif (offset < 0)\n\t\toffset = 0\n\n\treturn {\n\t\tpage: page,\n\t\toffset: offset,\n\t\tlimit: pageSize\n\t}\n}\n\n// ----------------------------\n\nfunction GraphController(s, gfs, mongoConnection) {\n\tvar args = Array.prototype.slice.apply(arguments);\n\targs.unshift(Graph);\n\tAssetController.apply(this, args);\n\n\tthis.redisClient = redis.createClient({\n\t\thost: process.env.REDIS || 'localhost'\n\t})\n\n\tthis.graphAnalyser = new GraphAnalyser(gfs)\n\tthis.previewImageProcessor = new PreviewImageProcessor()\n}\n\nGraphController.prototype = Object.create(AssetController.prototype)\n\n\n// GET /browse\nGraphController.prototype.publicRankedIndex = function(req, res, next) {\n\tvar paging = parsePaging(req)\n\tthis._service.publicRankedList(paging)\n\t.then((data) => {\n\t\tdata.list = prettyPrintList(data.list, data.owners)\n\t\tdelete (data.owners)\n\t\tvar listmeta = data.meta\n\t\tif (listmeta)\n\t\t\tlistmeta.baseUrl = '/browse/'\n\n\t\tif (req.xhr) {\n\t\t\treturn res.json(helper.responseStatusSuccess('OK', data))\n\t\t}\n\n\t\tres.render('graph/index', {meta : {\n\t\t\t\ttitle : 'Vizor - Browse projects',\n\t\t\t\tfooter: 'srv/home/_footer',\n\t\t\t\tbodyclass: 'bBrowse',\n\t\t\t\tscripts: [\n\t\t\t\t\thelper.metaScript('site/userpages.js'),\n\t\t\t\t\thelper.metaScript('ui/pagination.js')\n\t\t\t\t]},\n\t\t\t\tpageHeading: 'Public projects',\n\t\t\t\tgraphs: data})\n\t})\n\t.catch(next)\n}\n\n// GET /fthr?public=1|0\nGraphController.prototype._userOwnIndex = function(user, req, res, next) {\n\tvar that = this\n\tvar username = user.username\n\t// the user wants to see only their private graphs\n\tvar wantPrivate = undefined\n\tif (typeof req.query.public !== 'undefined') {\n\t\twantPrivate = (req.query.public === '0')\n\t}\n\n\tfunction render(publicGraphs, privateGraphs, profile, data) {\n\t\tdata = _.extend({\n\t\t\tbodyclass: '',\n\t\t\tpublicHasMoreLink: false,\n\t\t\tprivateHasMoreLink: false,\n\t\t\tisSummaryPage: false,\n\t\t\twithProjectListFilter : true,\n\t\t\tmeta: {\n\t\t\t\theader: 'srv/userpage/userpageHeader',\n\t\t\t\tfooter: 'srv/home/_footer',\n\t\t\t\ttitle: 'Your Files',\n\t\t\t\tscripts: [\n\t\t\t\t\thelper.metaScript('site/userpages.js')\n\t\t\t\t]\n\t\t\t}\n\t\t}, data)\n\n\t\t// format\n\t\tdata.publicGraphs = publicGraphs\n\t\tdata.privateGraphs = privateGraphs\n\t\tdata.profile = profile\n\n\t\tif (publicGraphs)\n\t\t\tdata.publicHasMoreLink = publicGraphs.meta.totalCount > publicGraphs.meta.listCount\n\n\t\tif (privateGraphs)\n\t\t\tdata.privateHasMoreLink = privateGraphs.meta.totalCount > privateGraphs.meta.listCount\n\n\t\t// allow the 'create' card to appear if both lists are empty. see css.\n\t\tvar totalProjects = 0\n\t\tfor (var graphs of [data.publicGraphs, data.privateGraphs]) {\n\t\t\tif (graphs) {\n\t\t\t\tif (Array.isArray(graphs))\n\t\t\t\t\ttotalProjects += graphs.length\t\t\t\t// plain list\n\t\t\t\telse if (Array.isArray(graphs.list))\n\t\t\t\t\ttotalProjects += graphs.list.length\t\t\t// {list:, meta:} (pagination)\n\t\t\t}\n\t\t}\n\n\t\tvar noProjectsClass = (totalProjects > 0) ? '' : 'noProjects '\n\t\tdata.meta.bodyclass = ('bUserpage ' + noProjectsClass + data.bodyclass).trim()\n\t\tdelete data.bodyclass\n\n\n\t\tif (req.xhr) {\n\t\t\treturn res.status(200).json(\n\t\t\t\thelper.responseStatusSuccess('OK', data))\n\t\t}\n\t\tres.render('server/pages/userpage', data)\n\t}\n\n\tvar profile = user.toJSON()\n\n\t// setup prettyPrintList\n\tvar ownerInfo = {}\n\townerInfo[user.id] = user.toPublicJSON()\n\n\tvar maxNumOnFront = 7\t// allow for \"create new\" card\n\t// front page, two lists\n\tvar data = {}\n\tif (wantPrivate === undefined) {\n\t\tdata.isSummaryPage = true\n\t\tdata.bodyclass = 'bGraphlistSummary'\n\t\tvar publicResults\n\t\tthat._service.userGraphsWithPrivacy(username, 0, maxNumOnFront, false)\n\t\t\t.then((results)=>{\n\t\t\t\tif (results.list) {\n\t\t\t\t\tresults.list = prettyPrintList(results.list, ownerInfo)\n\t\t\t\t\tpublicResults = results\n\t\t\t\t}\n\t\t\t\treturn that._service.userGraphsWithPrivacy(username, 0, maxNumOnFront, true)\n\t\t\t})\n\t\t\t.then((privateResults) => {\n\t\t\t\tif (privateResults.list) {\n\t\t\t\t\tprivateResults.list = prettyPrintList(privateResults.list, ownerInfo)\n\t\t\t\t}\n\t\t\t\treturn render(publicResults, privateResults, profile, data)\n\t\t\t})\n\t\t\t.catch(next)\n\t} else {\n\t\t// \"Public\" or \"Private\" lists\n\t\tvar paging = parsePaging(req)\n\t\tdata.isSummaryPage = false\n\t\tthat._service.userGraphsWithPrivacy(username, paging.offset, paging.limit, wantPrivate)\n\t\t\t.then(function(result) {\n\n\t\t\t\tdata.bodyclass = (wantPrivate) ? 'bGraphlistPrivate' : 'bGraphlistPublic'\n\n\t\t\t\tresult.list = prettyPrintList(result.list, ownerInfo)\n\n\t\t\t\tif (wantPrivate)\n\t\t\t\t\trender(null, result, profile, data)\n\t\t\t\telse\n\t\t\t\t\trender(result, null, profile, data)\n\t\t\t})\n\t\t\t.catch(next)\n\t}\n\n}\n\n// GET /fthr when visitor is not fthr\nGraphController.prototype._userPublicIndex = function(user, req, res, next) {\n\tvar that = this\n\tvar username = (user) ? user.username : null\n\tvar graphs\n\n\tvar paging = parsePaging(req)\n\n\tif (req.user && req.user.isAdmin)\n\t\tgraphs = that._service.userGraphs(username, paging.offset, paging.limit)\n\telse\n\t\tgraphs = that._service.userGraphsWithPrivacy(username, paging.offset, paging.limit, false)\t// public\n\n\tgraphs\n\t.then((result) => {\n\t\t// no files found, but if there is a user\n\t\t// then show empty userpage\n\t\tif (!result)\n\t\t\treturn next()\n\n\t\tvar list = result.list\n\t\tif (!user && (!list || !list.length)) {\n\t\t\treturn next()\n\t\t}\n\n\t\tvar ownerInfo = {}\n\t\tif (user) {\n\t\t\townerInfo[user.id] = user.toPublicJSON()\n\t\t}\n\t\tresult.list = prettyPrintList(result.list, ownerInfo)\n\n\t\tvar data = {\n\t\t\tprofile: user ? user.toPublicJSON() : {},\n\t\t\tgraphs: result\n\t\t}\n\n\t\tif (req.xhr) {\n\t\t\treturn res.status(200).json(\n\t\t\t\thelper.responseStatusSuccess(\"OK\", data))\n\t\t}\n\n\t\t_.extend(data, {\n\t\t\tisSummaryPage: false,\n\t\t\twithProjectListFilter : false,\n\t\t\tmeta : {\n\t\t\t\theader: 'srv/userpage/userpageHeader',\n\t\t\t\tfooter: 'srv/home/_footer',\n\t\t\t\ttitle: username+'\\'s Files',\n\t\t\t\tbodyclass: 'bUserpage bUserpublic',\n\t\t\t\tscripts : [\n\t\t\t\t\thelper.metaScript('site/userpages.js'),\n\t\t\t\t\thelper.metaScript('ui/pagination.js')\n\t\t\t\t]\n\t\t\t}\n\t\t})\n\n\t\tres.render('server/pages/userpage', data)\n\t})\n\t.catch(next)\n}\n\n\n// GET /fthr\nGraphController.prototype.userIndex = function(req, res, next) {\n\tvar username = req.params.model\n\n\tvar that = this\n\tUser.findOne({ username: username }, function(err, user) {\n\t\tif (err)\n\t\t\treturn next(err)\n\n\t\tif (visitorIsUser(req, user))\n\t\t\treturn that._userOwnIndex(user, req, res, next)\n\t\telse\n\t\t\treturn that._userPublicIndex(user, req, res, next)\n\t})\n}\n\n// GET /graph\nGraphController.prototype.adminIndex = function(req, res, next) {\n\tvar user = req.user\n\n\tvar paging = parsePaging(req)\n\n\tthis._service.listWithPreviews(paging)\n\t.then((result) => {\n\t\tif (req.xhr || req.path.slice(-5) === '.json')\n\t\t\treturn res.json(result.list);\n\n\t\tresult.list = prettyPrintList(result.list, result.owners)\n\n\t\tvar data = {\n\t\t\tgraphs: result\n\t\t}\n\n\t\t_.extend(data, {\n\t\t\tmeta : {\n\t\t\t\ttitle: 'Graphs',\n\t\t\t\tbodyclass: 'bGraphs',\n\t\t\t\tscripts: [\n\t\t\t\t\thelper.metaScript('site/userpages.js')\n\t\t\t\t]\n\t\t\t},\n\t\t\tpageHeading: 'Admin index'\n\t\t})\n\n\t\tres.render('graph/index', data)\n\t})\n\t.catch(next)\n}\n\nfunction renderEditor(res, graph, hasEdits) {\n\tvar releaseMode = process.env.NODE_ENV === 'production'\n\tvar layout = releaseMode ? 'editor-bundled' : 'editor'\n\n\tres.header('Cache-control', 'no-cache, must-revalidate, max-age=0')\n\n\tfunction respond() {\n\t\tres.render('editor', {\n\t\t\tlayout: layout,\n\t\t\tgraph: graph,\n\t\t\thasEdits: hasEdits,\n\t\t\tcdnRoot: CDN_ROOT,\n\t\t\treleaseMode: releaseMode,\n\t\t\twebSocketHost: process.env.WSS_HOST || '',\n\t\t\tuseSecureWebSocket: releaseMode || !!process.env.WSS_SECURE || false\n\t\t})\n\t}\n\n\tif (!releaseMode) {\n\t\ttemplateCache.recompile(function() {\n\t\t\trespond()\n\t\t})\n\t}\n\telse\n\t\trespond()\n}\n\n// GET /fthr/dunes-world/edit\nGraphController.prototype.edit = function(req, res, next) {\n\tvar that = this\n\n\tif (!req.params.path) {\n\t\treturn Serial.next('editLog')\n\t\t.then(function(serial) {\n\t\t\treturn res.redirect('/' + makeHashid(serial))\n\t\t})\n\t}\n\n\tthis._service.findByPath(req.params.path)\n\t.then(function(graph) {\n\t\tif (graph && (graph.editable === false || graph.private === true)) {\n\t\t\tif (!isGraphOwner(req.user, graph))\n\t\t\t\treturn renderError(404, res)\n\t\t}\n\n\t\tEditLog.hasEditsByName(that.redisClient, req.params.path.substring(1))\n\t\t.then(function(hasEdits) {\n\t\t\trenderEditor(res, graph, hasEdits)\n\t\t})\n\t})\n\t.catch(next)\n}\n\n\n// GET /~latest-graph\nGraphController.prototype.latest = function(req, res, next) {\n\tthis._service.publicList()\n\t.then(function(list) {\n\t\tres.redirect(list[0].path)\n\t})\n\t.catch(next)\n}\n\nfunction renderPlayer(graph, req, res, options) {\n\tgraph.increaseViewCount()\n\n\tif (graph._creator)\n\t\tgraph._creator.increaseViewCount()\n\n\tvar graphJson = graph.getPrettyInfo()\n\n\t// which version of player to use?\n\tvar version = graphJson.version || packageJson.version\n\tversion = version.split('.').slice(0,2).join('.')\n\n\tvar releaseMode = process.env.NODE_ENV === 'production'\n\tvar layout = releaseMode ? 'player-bundled' : 'player'\n\n\tres.render('graph/show', {\n\t\tlayout: res.locals.layout || layout,\n\t\tplayerVersion: version,\n\t\tautoplay: !!(options && options.autoplay),\n\t\tnoHeader: options.noHeader || false,\n\t\tisEmbedded: options.isEmbedded || false,\n\t\tcdnRoot: CDN_ROOT,\n\t\tgraph: graphJson,\n\t\tgraphMinUrl: cdnUrl(graph.url),\n\t\tgraphName: graphJson.prettyName,\n\t\tgraphOwner: graphJson.prettyOwner,\n\t\tpreviewImage: cdnUrl(graphJson.previewUrlLarge),\n\t\tpreviewImageWidth: 1280,\n\t\tpreviewImageHeight: 720,\n\t\tstartMode : options.startMode || 1\n\t})\n}\n\n// GET /embed/fthr/dunes-world\nGraphController.prototype.embed = function(req, res, next) {\n\tthis._service.findByPath(req.params.path)\n\t.then(function(graph) {\n\t\tif (!graph || graph.deleted)\n\t\t\treturn next()\n\n\t\tvar autoplay = false\n\t\tif (req.query.no_fullscreen === 'true') autoplay = true\n\n\t\tvar startMode = parseInt(req.query.start_mode)\n\t\tif (isNaN(startMode))\n\t\t\tstartMode = 1\n\n\t\treturn renderPlayer(graph, req, res, {\n\t\t\tisEmbedded: true,\n\t\t\tautoplay: req.query.autoplay || autoplay,\n\t\t\tnoHeader: req.query.noheader || false,\n\t\t\tstartMode : startMode\n\t\t})\n\t}).catch(next)\n}\n\n// GET /fthr/dunes-world\n// GET /fthr/dunes-world?summmary=1\nGraphController.prototype.graphLanding = function(req, res, next) {\n\tvar wantSummary = req.query.summary || false\n\n\treq.params.path = req.params.path.toLowerCase()\n\n\tfunction notFound() {\n\t\tres.status(404).json(helper.responseStatusError('not found'))\n\t}\n\n\tthis._service.findByPath(req.params.path)\n\t.then(function(graph) {\n\t\tif (!graph || graph.deleted)\n\t\t\treturn notFound()\n\n\t\tif (wantSummary) {\n\t\t\tvar data = makeGraphSummary(req, graph)\n\t\t\treturn res.json(helper.responseStatusSuccess('OK', data))\n\t\t}\n\n\t\tvar startMode = parseInt(req.query.start_mode)\n\t\tif (isNaN(startMode))\n\t\t\tstartMode = 1\n\n\t\treturn renderPlayer(graph, req, res, {\n\t\t\tautoplay: true,\n\t\t\tstartMode: startMode\n\t\t})\n\t}).catch(next)\n}\n\n// POST /fthr/dunes-world\nGraphController.prototype.graphModify = function(req, res, next) {\n\n\tvar that = this\n\t// if want XHR return json\n\t// else redirect to GET URL\n\n\treq.params.path = req.params.path.toLowerCase()\n\tvar wantXhr = req.xhr\n\n\tfunction notFound() {\n\t\tres.status(404).json(helper.responseStatusError('not found'))\n\t}\n\n\tthis._service.findByPath(req.params.path)\n\t.then(function(graph) {\n\t\tif (!graph || graph.deleted)\n\t\t\treturn notFound()\n\n\t\tif (!(req.user && ownsGraph(req.user, graph)))\n\t\t\treturn notFound()\n\n\t\tswitch (req.body.private) {\n\t\t\tcase 'true':\n\t\t\t\tgraph.private = true\n\t\t\t\tbreak\n\t\t\tcase 'false':\n\t\t\t\tgraph.private = false\n\t\t\t\tbreak\n\t\t}\n\n\t\tvar opts = {\n\t\t\tversion: graph.version,\n\t\t\tupdatedAt: graph.updatedAt\n\t\t}\n\n\t\treturn that._service.save(graph, req.user, opts)\n\t\t.then(function(savedGraph) {\n\t\t\tvar data = makeGraphSummary(req, savedGraph)\n\t\t\tif (wantXhr)\n\t\t\t\treturn res.json(helper.responseStatusSuccess('OK', data))\n\t\t\t// else\n\t\t\treturn res.redirect(req.params.path)\n\t\t})\n\t})\n\t.catch(next)\n}\n\n\n// GET /fthr/dunes-world/graph.json\nGraphController.prototype.stream = function(req, res, next) {\n\tvar that = this;\n\n\tthis._service.findByPath(req.params.path)\n\t.then(function(item) {\n\t\tthat._fs.createReadStream(item.url)\n\t\t.pipe(res)\n\t\t.on('error', next)\n\t})\n\t.catch(next)\n}\n\nGraphController.prototype._makePath = function(req, path) {\n\treturn '/' + req.user.username\n\t\t+ '/' + assetHelper.slugify(fsPath.basename(path, fsPath.extname(path)))\n}\n\nGraphController.prototype.canWriteUpload = function(req, res, next) {\n\tvar that = this;\n\n\tif (!req.files)\n\t\treturn next(new Error('No files uploaded'));\n\n\tvar file = req.files.file;\n\tvar dest = this._makePath(req, file.path);\n\n\tthat._service.canWrite(req.user, dest)\n\t.then(function(can) {\n\t\tif (!can)\n\t\t\treturn res.status(403)\n\t\t\t\t.json({message: 'Sorry, permission denied'});\n\n\t\tnext();\n\t})\n\t.catch(next)\n}\n\n// POST /graph with file upload\nGraphController.prototype.upload = function(req, res, next) {\n\tvar that = this;\n\tvar file = req.files.file;\n\n\tif (fsPath.extname(file.path) !== '.json')\n\t\treturn next(new Error('The upload is not a graph JSON! Are you sure you are trying to upload a graph?'))\n\n\tvar path = this._makePath(req, file.path);\n\tvar gridFsPath = '/graph'+path+'.json';\n\n\treturn this._service.canWrite(req.user, path)\n\t.then(function(can) {\n\t\tif (!can) {\n\t\t\treturn res.status(403)\n\t\t\t\t.json({message: 'Sorry, permission denied'});\n\t\t}\n\n\t\t// move the uploaded file into GridFS / local FS\n\t\treturn that._fs.move(file.path, gridFsPath)\n\t\t.then(function(url) {\n\t\t\treturn that._service.findByPath(path)\n\t\t\t.then(function(model) {\n\t\t\t\tif (!model)\n\t\t\t\t\tmodel = { path: path };\n\n\t\t\t\tmodel.url = url;\n\n\t\t\t\t// save/update the model\n\t\t\t\treturn that._service.save(model, req.user)\n\t\t\t\t.then(function(asset) {\n\t\t\t\t\tres.json(asset);\n\t\t\t\t});\n\t\t\t});\n\t\t})\n\t})\n\t.catch(next)\n}\n\n// POST /graph/delete\nGraphController.prototype.delete = function(req, res, next) {\n\tvar that = this\n\tvar path = this._makePath(req, req.params.path)\n\n\tthis._service.canWrite(req.user, path)\n\t.then(function(can) {\n\t\tif (!can) {\n\t\t\treturn res.status(403).json({\n\t\t\t\tmessage: 'Sorry, permission denied'\n\t\t\t})\n\t\t}\n\n\t\treturn that._service.findByPath(path)\n\t\t.then(function(graph) {\n\t\t\tif (!graph || graph.deleted) {\n\t\t\t\treturn res.status(404).json(helper.responseStatusError('not found'))\n\t\t\t}\n\n\t\t\tgraph.deleted = true\n\n\t\t\treturn that._service.save(graph, req.user)\n\t\t\t.then(function(asset) {\n\t\t\t\treq.user.decreaseProjectsCount()\n\t\t\t\tres.json(asset)\n\t\t\t})\n\t\t})\n\t})\n\t.catch(next)\n}\n\nGraphController.prototype._save = function(path, user, req, res, next) {\n\tvar that = this\n\n\tconst ghash = checksum(req.body.graph)\n\n\tvar wantsPrivate = !req.body.isPublic\n\tvar gridFsGraphPath = '/graph'+path+'-'+ghash+'.json';\n\n\tif (user.isAnonymous) {\n\t\twantsPrivate = false\n\t\treq.body.editable = true\n\t}\n\n\tvar gridFsOriginalImagePath = '/previews'+path+'-preview-original-'+ghash+'.png'\n\n\tvar previewImageSpecs = [{\n\t\tgridFsPath: '/previews'+path+'-preview-440x330-'+ghash+'.png',\n\t\twidth: 440,\n\t\theight: 330\n\t}, {\n\t\tgridFsPath: '/previews'+path+'-preview-1280x720-'+ghash+'.png',\n\t\twidth: 1280,\n\t\theight: 720,\n\t}]\n\n\tvar tags = that._parseTags(req.body.tags);\n\n\treturn that._fs.writeString(gridFsGraphPath, req.body.graph)\n\t.then(function() {\n\t\tif (!req.body.previewImage) {\n\t\t\treturn\n\t\t}\n\n\t\t// save original image (if we ever need to batch process any of these)\n\t\treturn that._fs.writeString(gridFsOriginalImagePath, req.body.previewImage.replace(/^data:image\\/\\w+;base64,/, \"\"), 'base64')\n\t\t.then(function() {\n\t\t\t// create preview images\n\t\t\treturn that.previewImageProcessor.process(path, req.body.previewImage, previewImageSpecs)\n\t\t\t.then(function(processedImages) {\n\t\t\t\tif (processedImages && processedImages.length === 2) {\n\t\t\t\t\treturn parallel([\n\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t// write small image\n\t\t\t\t\t\t\treturn that._fs.writeString(previewImageSpecs[0].gridFsPath, processedImages[0], 'base64')\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t// write large image\n\t\t\t\t\t\t\treturn that._fs.writeString(previewImageSpecs[1].gridFsPath, processedImages[1], 'base64')\n\t\t\t\t\t\t}\n\t\t\t\t\t])\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t})\n\t.then(function() {\n\t\treturn that.graphAnalyser.analyseJson(req.body.graph)\n\t})\n\t.then(function(analysis) {\n\t\tvar url = that._fs.url(gridFsGraphPath);\n\t\tvar previewUrlSmall = that._fs.url(previewImageSpecs[0].gridFsPath)\n\t\tvar previewUrlLarge = that._fs.url(previewImageSpecs[1].gridFsPath)\n\n\t\tvar model = {\n\t\t\tpath: path,\n\t\t\ttags: tags,\n\t\t\turl: url,\n\t\t\tprivate: wantsPrivate,\n\t\t\thasAudio: !!analysis.hasAudio,\n\t\t\thasVideo: !!analysis.hasVideo,\n\t\t\teditable: req.body.editable === false ? false : true,\n\t\t\tstat: {\n\t\t\t\tsize: analysis.size,\n\t\t\t\tnumAssets: analysis.numAssets\n\t\t\t},\n\t\t\tpreviewUrlSmall: previewUrlSmall,\n\t\t\tpreviewUrlLarge: previewUrlLarge\n\t\t}\n\n\t\treturn that._service.save(model, user)\n\t\t.then(function(asset) {\n\t\t\tres.json(asset)\n\t\t})\n\t})\n\t.catch(next)\n\n}\n\n// POST /graph\nGraphController.prototype.save = function(req, res, next) {\n\tvar that = this;\n\tvar path = this._makePath(req, req.body.path);\n\n\tthis._service.canWrite(req.user, path)\n\t.then(function(can) {\n\t\tif (!can) {\n\t\t\treturn res.status(403)\n\t\t\t\t.json({ message: 'Sorry, permission denied' })\n\t\t}\n\n\t\treturn that._save(path, req.user, req, res, next)\n\t})\n\t.catch(next)\n}\n\n// POST /graph\nGraphController.prototype.saveAnonymous = function(req, res, next) {\n\tvar that = this\n\tvar anonReq = { user: { username: 'v', isAnonymous: true } }\n\n\tif (!req.body)\n\t\treturn renderError(400, res)\n\n\treturn this.graphAnalyser.analyseJson(req.body.graph)\n\t.then(function(analysis) {\n\t\tif (!analysis.numNodes) {\n\t\t\treturn res.status(400)\n\t\t\t\t.json({ message: 'Invalid data' })\n\t\t}\n\n\t\treturn Serial.next('anonymousGraph')\n\t\t.then(function(serial) {\n\t\t\tvar uid = makeHashid(serial)\n\t\t\tvar path = that._makePath(anonReq, uid)\n\n\t\t\treq.body.path = path\n\n\t\t\treturn that._save(path, anonReq.user, req, res, next)\n\t\t})\n\t})\n\t.catch(next)\n}\n\nmodule.exports = GraphController;\n"
  },
  {
    "path": "controllers/homeController.js",
    "content": "const when = require('when')\nconst Graph = require('../models/graph')\nconst fsPath = require('path')\nconst config = require('../config/config')\n\nlet CDN_ROOT = '/data'\nif (config.server.useCDN)\n\tCDN_ROOT = config.server.cdnRoot\n\nconst STAFFPICKS_TTL = 30 * 60 * 1000\n\nlet cache, cacheTime = 0\nconst getCache = () => {\n\tif (process.env.NODE_ENV !== 'production')\n\t\treturn\n\n\tif (Date.now() - cacheTime > STAFFPICKS_TTL) {\n\t\tcache = undefined\n\t\treturn\n\t}\n\n\treturn cache\n}\n\nconst setCache = data => {\n\tcacheTime = Date.now()\n\tcache = data\n\treturn cache\n}\n\nfunction cdnUrl(url) {\n\tif (!url)\n\t\treturn url\n\treturn CDN_ROOT + url.replace(/^\\/data/, '')\n}\n\nfunction fixGraphUrls(graphModel) {\n\tvar graph = graphModel.getPrettyInfo()\n\tgraph.previewUrlSmall =\tcdnUrl(graph.previewUrlSmall)\n\treturn graph\n}\n\nfunction getHomeStaffPicks() {\n\tvar staffPicks = {}\n\tvar dfd = when.defer()\n\n\tlet cached = getCache()\n\tif (cached)\n\t\treturn when.resolve(cached)\n\n\t// get front page staff picks, sort them by rank/createdAt\n\tGraph.find({\n\t\tstaffpicks: 'frontpage'\n\t})\n\t.sort({\n\t\trank: -1,\n\t\tcreatedAt: -1\n\t})\n\t.exec((err, graphs) => {\n\t\tif (err) {\n\t\t\tconsole.error(err.stack)\n\t\t\treturn dfd.resolve([])\n\t\t}\n\n\t\tvar patchesPicks = []\n\t\t// collect staff picked graphs into their categories\n\t\tgraphs.map(graph => {\n\t\t\tgraph.staffpicks.map(tag => {\n\t\t\t\tif (!staffPicks[tag])\n\t\t\t\t\tstaffPicks[tag] = []\n\n\t\t\t\tvar prettyInfo = fixGraphUrls(graph)\n\t\t\t\tstaffPicks[tag].push(prettyInfo)\n\t\t\t\tpatchesPicks.push(prettyInfo)\n\t\t\t})\n\t\t})\n\n\t\t// patches homepage\n\t\tstaffPicks['_patches'] = pickFromStaffPicks(patchesPicks, 8)\n\t\tdfd.resolve(setCache(staffPicks))\n\t})\n\n\treturn dfd.promise\n}\n\nfunction pickFromStaffPicks(array, maxLength) {\n\tmaxLength = maxLength || 3\n\tarray.sort(function() { return 0.5 - Math.random() }) // shuffle\n\treturn array.slice(0, maxLength)\n}\n\n/**\n * GET /\n * Home page.\n */\nexports.index = function(req, res)  {\n\tgetHomeStaffPicks()\n\t.then(function(graphs) {\n\t\tlet picks = {}\n\n\t\tObject.keys(graphs).map(tag => {\n\t\t\tpicks[tag] = pickFromStaffPicks(graphs[tag].slice(), (tag === '_patches') ? 8 : null)\n\t\t})\n\n\t\tres.render('home', {\n\t\t\tfeatured: picks,\n\t\t\tcdnRoot: CDN_ROOT,\n\t\t\tmeta: {\n\t\t\t\tbodyclass: 'bHome bIndex',\n\t\t\t\theader: false\n\t\t\t}\n\t\t})\n\t})\n}\n\n\n/**\n * GET /about\n * Home > about\n */\nexports.about = function(req, res)  {\n\treturn res.redirect('../')\n}"
  },
  {
    "path": "controllers/imageController.js",
    "content": "var Image = require('../models/image')\nvar AssetController = require('./assetController')\nvar ImageProcessor = require('../lib/imageProcessor')\nvar User = require('../models/user')\nvar fs = require('fs')\nvar helper = require('./controllerHelpers')\n\nfunction ImageController() {\n\tvar args = Array.prototype.slice.apply(arguments)\n\targs.unshift(Image)\n\tAssetController.apply(this, args)\n}\n\nImageController.prototype = Object.create(AssetController.prototype)\n\nImageController.prototype.upload = function(req, res, next) {\n\tvar that = this\n\n\tvar file = req.files.file\n\tvar folder = '/' + req.user.username + '/assets/image'\n\n\tnew ImageProcessor(this._fs)\n\t\t.handleUpload(file, folder)\n\t\t.then(function(info) {\n\t\t\tfs.unlink(file.path, function() {})\n\n\t\t\tinfo.path = info.original.path\n\t\t\tinfo.url = info.original.url\n\n\t\t\treturn that._service.save(info, req.user)\n\t\t\t.then(function(asset) {\n\t\t\t\tres.json(asset)\n\t\t\t})\n\t\t})\n\t\t.catch(next)\n}\n\nImageController.prototype.getMetadata = function(req, res, next) {\n\tvar path = req.path.replace(/^\\/meta/, '/data')\n\n\tthis._service.findOne({'scaled.url' : path}).then(function(item) {\n\t\tif (!item) {\n\t\t\treturn next()\n\t\t}\n\n\t\tres.header('Cache-Control', 'public')\n\n\t\tres.json({\n\t\t\twidth: item.scaled.width,\n\t\t\theight: item.scaled.height,\n\t\t\tpitch: item.scaled.pitch,\n\t\t\theading: item.scaled.heading,\n\t\t\troll: item.scaled.roll\n\t\t})\n\t})\n\t.catch(next)\n}\n\n// called by setUserAvatar and setUserHeader\nImageController.prototype._setUserProfileImage = function(req, res, next, imageProcessor, folder, profileFields) {\n\tvar that = this\n\n\tvar file = req.files.file\n\tif (!(file && file.path))\n\t\treturn res.status(400).send('Please upload a file')\n\n\n\tUser.findById(req.user.id, function(err, user) {\n\n\t\tif (err || !user)\n\t\t\treturn next(err)\n\n\t\timageProcessor(file, folder)\n\t\t\t.then(function(info) {\n\t\t\t\tfs.unlink(file.path, function() {})\n\t\t\t\tuser.profile[profileFields.original] = info.original.url\n\t\t\t\tuser.profile[profileFields.scaled] = info.scaled.url\n\t \t\t\tuser.save(function(err) {\n\t \t\t\t\tif (err)\n\t \t\t\t\t\treturn next(err)\n\n\t \t\t\t\tres.json(helper.responseStatusSuccess(\n\t \t\t\t\t\t'OK', {\n\t \t\t\t\t\t\tuploaded: info,\n\t \t\t\t\t\t\tuser: user.toJSON()\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.catch(next)\n\t})\n}\n\n\nImageController.prototype.setUserAvatar = function(req, res, next) {\n\tvar processor = new ImageProcessor(this._fs)\n\treturn this._setUserProfileImage(req, res, next,\n\t\tprocessor.handleUserAvatarUpload.bind(processor),\n\t\t'/' + req.user.username + '/profile/avatar',\n\t\t{original: 'avatarOriginal', scaled: 'avatarScaled'}\n\t)\n}\n\nImageController.prototype.setUserHeader = function(req, res, next) {\n\tvar processor = new ImageProcessor(this._fs)\n\treturn this._setUserProfileImage(req, res, next,\n\t\tprocessor.handleUserHeaderUpload.bind(processor),\n\t\t'/' + req.user.username + '/profile/header',\n\t\t{original: 'headerOriginal', scaled: 'headerScaled'}\n\t)\n}\n\n\nImageController.prototype.uploadAnonymous = function(req, res, next) {\n\tvar that = this\n\n\tvar file = req.files.file\n\tvar folder = '/v/assets/image'\n\n\tnew ImageProcessor(this._fs)\n\t\t.handleUpload(file, folder)\n\t\t.then(function(info) {\n\t\t\tfs.unlink(file.path, function() {})\n\n\t\t\tinfo.path = info.original.path\n\t\t\tinfo.url = info.original.url\n\n\t\t\treturn that._service.save(info, req.user)\n\t\t\t.then(function(asset) {\n\t\t\t\tres.json(asset)\n\t\t\t})\n\t\t})\n\t\t.catch(next)\n}\n\nmodule.exports = ImageController\n"
  },
  {
    "path": "controllers/patchController.js",
    "content": "var Patch = require('../models/patch')\nvar AssetController = require('./assetController')\nvar fsPath = require('path')\nvar assetHelper = require('../models/asset-helper')\nvar GraphAnalyser = require('../common/graphAnalyser').GraphAnalyser\nvar helper = require('./controllerHelpers')\nvar checksum = require('checksum')\n\nfunction PatchController(patchService, fs) {\n\tvar args = Array.prototype.slice.apply(arguments)\n\targs.unshift(Patch)\n\tAssetController.apply(this, args)\n\n\tthis.graphAnalyser = new GraphAnalyser(fs)\n}\n\nPatchController.prototype = Object.create(AssetController.prototype)\n\nPatchController.prototype._makePath = function(req, name) {\n\treturn '/'\n\t\t+ req.user.username\n\t\t+ '/patches/'\n\t\t+ assetHelper.slugify(\n\t\t\tfsPath.basename(name, fsPath.extname(name)))\n}\n\nPatchController.prototype._makeGridFsPath = function(req, path) {\n\treturn this._makePath(req, path) + '.json'\n}\n\n// POST /:username/patches\nPatchController.prototype.save = function(req, res, next) {\n\tvar that = this\n\tvar path = this._makePath(req, req.body.name)\n\tvar patchHash = checksum(req.body.graph)\n\tvar gridFsPath = this._makeGridFsPath(req, req.body.name+'-'+patchHash)\n\n\tvar tags = that._parseTags(req.body.tags)\n\n\tthis._service.canWrite(req.user, path)\n\t.then(function(can) {\n\t\tif (!can) {\n\t\t\treturn res.status(403)\n\t\t\t\t.json(helper.responseStatusError('Sorry, permission denied'))\n\t\t}\n\n\t\treturn that.graphAnalyser.analyseJson(req.body.graph)\n\t\t.then(function(stat) {\n\t\t\tif (!stat.numNodes) {\n\t\t\t\treturn res.status(400)\n\t\t\t\t\t.json(helper.responseStatusError('bad data'))\n\t\t\t}\n\n\t\t\treturn that._fs.writeString(gridFsPath, req.body.graph)\n\t\t\t.then(function() {\n\t\t\t\tvar url = that._fs.url(gridFsPath)\n\n\t\t\t\tvar model = {\n\t\t\t\t\tcategory: req.body.category,\n\t\t\t\t\tname: req.body.name,\n\t\t\t\t\ttype: stat.type || 'patch',\n\t\t\t\t\tpath: path,\n\t\t\t\t\ttags: tags,\n\t\t\t\t\tstat: stat,\n\t\t\t\t\turl: url\n\t\t\t\t}\n\n\t\t\t\tconsole.log('Saved patch model', model)\n\n\t\t\t\treturn that._service.save(model, req.user)\n\t\t\t\t.then(function(asset) {\n\t\t\t\t\tres.json(asset)\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t})\n\t.catch(next)\n}\n\nmodule.exports = PatchController\n"
  },
  {
    "path": "controllers/sceneController.js",
    "content": "var Scene = require('../models/scene')\nvar AssetController = require('./assetController')\nvar SceneProcessor = require('../lib/sceneProcessor')\nvar fs = require('fs')\nvar fsPath = require('path')\nvar slugify = require('../models/asset-helper').slugify\n\nvar allowedExtensions = ['.zip', '.obj', '.js', '.json', '.gltf', '.fbx', '.dae']\n\nfunction SceneController() {\n\tvar args = Array.prototype.slice.apply(arguments)\n\targs.unshift(Scene)\n\tAssetController.apply(this, args)\n}\n\nSceneController.prototype = Object.create(AssetController.prototype)\n\nSceneController.prototype.canWriteUpload = function(req, res, next) {\n\tvar that = this\n\n\tif (!req.files)\n\t\treturn next(new Error('No files uploaded'))\n\n\tvar file = req.files.file\n\tvar folder = '/' + req.user.username + '/assets/scene'\n\tvar extless = fsPath.basename(file.name, fsPath.extname(file.name))\n\tvar dest = folder + '/' + slugify(extless)\n\n\tthat._service.canWrite(req.user, dest)\n\t.then(function(can) {\n\t\tif (can)\n\t\t\treturn next()\n\n\t\tfs.unlink(file.path)\n\n\t\treturn res.status(403)\n\t\t\t.json({message: 'Sorry, permission denied'})\n\t})\n}\n\nSceneController.prototype.upload = function(req, res, next) {\n\tvar that = this\n\tvar file = req.files.file\n\tvar sceneRoot = '/' + req.user.username + '/assets/scene'\n\tvar ext = fsPath.extname(file.name.toLowerCase())\n\n\tif (allowedExtensions.indexOf(ext) === -1) {\n\t\treturn res.status(400)\n\t\t\t.json({ message: 'Please upload only ' + allowedExtensions.join(', ') })\n\t}\n\n\tnew SceneProcessor(this._fs)\n\t\t.handleUpload(file, sceneRoot)\n\t\t.then(function(info) {\n\t\t\tfs.unlink(file.path)\n\n\t\t\treturn that._service.save(info, req.user)\n\t\t\t.then(function(asset) {\n\t\t\t\tres.json(asset)\n\t\t\t})\n\t\t})\n\t\t.catch(function(err) {\n\t\t\tconsole.error(err, err.stack)\n\t\t\tfs.unlink(file.path)\n\t\t\tnext(err)\n\t\t})\n}\n\nmodule.exports = SceneController\n"
  },
  {
    "path": "controllers/threesixty.js",
    "content": "var config = require('../config/config.js')\n\nif (config.server.useCDN)\n\tCDN_ROOT = config.server.cdnRoot\n\n/**\n * GET /threesixty\n * Threesixty site\n */\nexports.index = function(req, res) {\n\tvar releaseMode = process.env.NODE_ENV === 'production'\n\tvar layout = releaseMode ? 'threesixty-bundled' : 'threesixty'\n\n\t// get show frontpage graph URL\n\tres.render('graph/show', {\n\t\tlayout: layout,\n\t\tsite: 'threesixty',\n\t\tcdnRoot: CDN_ROOT,\n\t\tgraphSrc: '/threesixty/featured',\n\t\tgraphMinUrl: '/threesixty/featured',\n\t\tautoplay: true,\n\t\thideEditButton: false,\n\t\thideShareButton: false,\n\t\thidePlayButton: true,\n\t\tmeta : {\n\t\t\tbodyclass : 'bThreesixty b360'\n\t\t},\n\t\tnoHeader: false,\n\t\tgraph: {\n\t\t\thasAudio: false\n\t\t},\n\t\tstartMode : 1\n\t});\n}\n\nexports.featured = function(req,res) {\n\tvar featuredGraph = '/data/graph/kschzt/jamaica.json'\n\tswitch (process.env.FQDN) {\n\t\tcase '360.vizor.io':\n\t\tcase 'rc.vizor.io':\n\t\tcase 'vizor.io':\n\t\tcase '360vr.io':\n\t\t\tfeaturedGraph = '/data/graph/kschzt/jamaica.json'\n\t\t\tbreak;\n\t}\n\tres.redirect(featuredGraph)\n}\n"
  },
  {
    "path": "controllers/userController.js",
    "content": "var _ = require('lodash')\nvar async = require('async')\nvar crypto = require('crypto')\nvar passport = require('passport')\nvar User = require('../models/user')\nvar mailer = require('../lib/mailer')\nvar helper = require('./controllerHelpers')\n\n/**\n * GET /login\n * Login page.\n */\n\n exports.getLogin = function(req, res) {\n \tif (req.user)\n \t\treturn res.redirect('/')\n\n \tres.render('server/pages/account/login', {\n \t\tmeta: {\n\t\t\tbodyclass: 'bLogin',\n\t\t\ttitle: 'Login',\n\t\t\tscripts: [\n\t\t\t\thelper.metaScript('site/accountpages.js')\n\t\t\t]\n\t\t}\n \t})\n }\n\n/**\n * POST /login\n * Sign in using email and password.\n * @param email\n * @param password\n */\n\n exports.postLogin = function(req, res, next) {\n \treq.assert('email', 'Email is not valid').isEmail()\n \treq.assert('password', 'Password cannot be blank').notEmpty()\n\n \tvar wantJson = req.xhr || req.path.slice(-5) === '.json'\n\n \tfunction returnErrors(errors, status, reason) {\n \t\tif (wantJson)\n\t \t\treturn res.status(status || 400).json(helper.responseStatusError(reason, errors))\n\n \t\treq.flash('errors', helper.parseErrors(errors))\n \t\treturn res.redirect('/login')\n \t}\n\n\tvar errors = req.validationErrors()\n \tif (errors)\n \t\treturn returnErrors(errors, 400, 'Validation failed')\n\n \tpassport.authenticate('local', function(err, user, info) {\n \t\tif (err)\n \t\t\treturn returnErrors([{ message: err.toString() }], 500, 'Server error')\n\n \t\tif (!user) {\n \t\t\tif (info)\n\t \t\t\treturn returnErrors([ info ], 401, 'Failed authentication')\n \t\t}\n\n \t\treq.logIn(user, function(err) {\n \t\t\tif (err)\n\t \t\t\treturn returnErrors([{ message: err.toString() }], null, 'could not login')\n\n\t\t\tvar message = 'Success! You are logged in.'\n \t\t\tif (wantJson)\n \t\t\t\tres.json(helper.responseStatusSuccess(message, user.toJSON(), {\n\t\t\t\t\tredirect: req.session.returnTo || '/account'\n\t\t\t\t}))\n \t\t\telse {\n\t\t\t\treq.flash('success', { message: message})\n \t\t\t\tres.redirect(req.session.returnTo || '/account')\n\t\t\t}\n \t\t})\n \t})(req, res, next)\n }\n\n/**\n * GET /logout\n */\n exports.logout = function(req, res) {\n \treq.logout()\n \tres.redirect('/')\n }\n\n/**\n * GET /signup\n */\n exports.getSignup = function(req, res) {\n\tvar wantJSON = req.xhr\n\tif (wantJSON) {\n\t\tif (req.user) {\n\t\t\treturn res.status(403).json(helper.responseStatusError('user already logged in')).end()\n\t\t}\n\n\t\treturn res.status(501).json(helper.responseStatusError('not yet implemented')).end()\n\n\t} else {\n\t\tif (req.user) {\n\t\t\treturn res.redirect('/')\n\t\t}\n\t\tres.render('server/pages/account/signup', {\n\t\t\tmeta : {\n\t\t\t\ttitle: 'Sign up to Patches',\n\t\t\t\tscripts: [\n\t\t\t\t\thelper.metaScript('site/accountpages.js')\n\t\t\t\t]\n\t\t\t}\n\t\t})\n\t}\n }\n\n/**\n * GET /account/exists\n **/\n exports.checkUserName = function(req, res, next) {\n \tUser.findOne({ username: req.body.username },\t\n \t\tfunction(err, existingUser) {\n \t\t\tif (err)\n \t\t\t\treturn next(err)\n\n \t\t\tif (!existingUser) {\n \t\t\t\treturn res.json(\n \t\t\t\t\thelper.responseStatusSuccess('Username is available',\n \t\t\t\t\t\t{username: req.body.username})\n \t\t\t\t)\n \t\t\t}\n\n \t\t\tvar msg = 'Username taken'\n \t\t\tvar error = helper.formatResponseError('username', req.body.username, msg)\n \t\t\treturn res.status(409)\n \t\t\t\t.json(helper.responseStatusError(msg,error))\n \t\t\t\t.end()\n \t\t}\n \t)\n }\n\n/**\n * GET /account/email/exists\n **/\n exports.checkEmailExists = function(req, res, next) {\n \tconsole.log('checkEmailExists', req.body.email)\n \tUser.findOne({ email: req.body.email },\n \t\tfunction(err, existingUser) {\n \t\t\tif (err)\n \t\t\t\treturn next(err)\n\n \t\t\tif (!existingUser) {\n \t\t\t\treturn res.json(\n \t\t\t\t\thelper.responseStatusSuccess('Email is available',\n \t\t\t\t\t\t{email: req.body.email})\n \t\t\t\t)\n \t\t\t}\n\n \t\t\tvar msg = 'Email taken'\n \t\t\tvar error = helper.formatResponseError('email', req.body.email, msg)\n \t\t\treturn res.status(409)\n\t \t\t\t.json(helper.responseStatusError(msg, error))\n \t\t\t\t.end()\n \t\t}\n \t)\n }\n\n/**\n * POST /signup\n * Create a new local account.\n * @param email\n * @param password\n */\n\n exports.postSignup = function(req, res, next) {\n\treq.sanitize('name').trim()\n\treq.sanitize('username').trim()\n\treq.sanitize('email').trim()\n \treq.assert('name', 'Please enter a name').notEmpty()\n \treq.assert('username', 'Username is empty or invalid').isAlphanumeric()\n \treq.assert('email', 'Email is not valid').isEmail()\n \treq.assert('password', 'Password must be at least 8 characters long').len(8)\n\n\tvar wantJSON = req.xhr;\n \tvar errors = req.validationErrors()\n\n \tif (errors) {\n\t\tvar lastreq = req.body;\n\t\tdelete(lastreq.password);\n\t\tif (wantJSON)\n \t\t\treturn res.status(400).json(helper.responseStatusError('Failed validation', errors, {request:lastreq}))\n\n\t\treq.flash('errors', helper.parseErrors(errors));\n\t\treturn res.redirect('/signup');\n \t}\n\n \tvar user = new User({\n \t\tname: req.body.name.replace(/[<>\\\\\\\\'\\\"]+/gim, ''),\n \t\tusername: req.body.username,\n \t\temail: req.body.email,\n \t\tpassword: req.body.password\n \t})\n\n \tUser.findOne({ username: req.body.username }, function(err, existingUser) {\t// #664\n \t\tif (existingUser) {\n \t\t\tif (req.xhr){\n\t\t\t\tvar msg = 'An account with that username already exists.'\n\t\t\t\tvar error = helper.formatResponseError('username', req.body.username, msg)\n \t\t\t\treturn res.status(400).json(helper.responseStatusError(msg, error))\n \t\t\t}\n \t\t\treturn res.redirect('/signup')\n \t\t}\n \t\tUser.findOne({ email: req.body.email }, function(err, existingUser) {\t// #664\n \t\t\tif (existingUser) {\n \t\t\t\tif (req.xhr) {\n\t\t\t\t\tvar msg = 'An account with that email already exists.'\n\t\t\t\t\tvar error = helper.formatResponseError('email', req.body.email, msg)\n \t\t\t\t\treturn res.status(400).json(helper.responseStatusError(msg, error))\n \t\t\t\t}\n \t\t\t\treturn res.redirect('/signup')\n \t\t\t}\n\n \t\t\tuser.save(function(err) {\n \t\t\t\tif (err) return next(err)\n \t\t\t\treq.logIn(user, function(err) {\n \t\t\t\t\tif (err) return next(err)\n \t\t\t\t\tif (req.xhr) {\n\t\t\t\t\t\tres.status(200).json(helper.responseStatusSuccess('New account created', user.toJSON(), {\n\t\t\t\t\t\t\tredirect: req.session.returnTo || '/account'\n\t\t\t\t\t\t}))\n \t\t\t\t\t} else {\n \t\t\t\t\t\tres.redirect(req.session.returnTo || '/account')\n \t\t\t\t\t}\n \t\t\t\t})\n \t\t\t})\n \t\t})\n \t})\n }\n\n/**\n * GET /account\n * redirect to /account/profile\n */\nexports.getAccount = function(req, res) {\n\tres.redirect('/account/profile');\n}\n\n\n/**\n * GET /account/profile\n * Profile page.\n */\n exports.getAccountProfile = function(req, res) {\n\tvar wantJSON = req.xhr\n\tUser.findById(req.user.id, function(err, user) {\n\t\tif (err) return next(err)\n\t\tif (wantJSON) {\n\t\t\treturn res.status(200).json(helper.responseStatusSuccess('OK', user.toJSON()))\n\t\t}\n\t\telse {\n\t\t\tvar data = {\n\t\t\t\tmeta: {\n\t\t\t\t\ttitle: 'Account Management',\n\t\t\t\t\tbodyclass: 'bProfile',\n\t\t\t\t\theader: 'srv/userpage/userpageHeader',\n\t\t\t\t\tfooter: 'srv/home/_footer',\n\t\t\t\t\tscripts: [\n\t\t\t\t\t\thelper.metaScript('site/accountpages.js')\n\t\t\t\t\t]\n\t\t\t\t},\n\t\t\t\tprofile: user.toJSON()\n\t\t\t}\n\t\t\tres.render('server/pages/account/profile', data)\n\t\t}\n\t})\n }\n\n/**\n * POST /account/profile\n * Update profile information.\n */\n exports.postUpdateProfile = function(req, res, next) {\n\n\t // to add a key\n\t // 1.sanitize\n\t // 2. check for key in req.body\n\t // \t3. req.assert validation by key\n\t // \t4. add req.body.key to updateFields.key\n\t // 5. add key to copyKeysIfExist\n\t \n\tvar mustConfirmPassword = false\n\n\treq.sanitize('name').trim()\n\treq.sanitize('email').trim()\n\treq.sanitize('profile[website]').trim()\n\treq.sanitize('profile[bio]').trim()\n\n\tvar updateFields = {\n\t\tprofile: {},\n\t\tpreferences: {}\n\t}\n\n\tif ('email' in req.body) {\n\t\tmustConfirmPassword = true\n\t\treq.assert('email', 'Email is not valid').isEmail()\n\t\tupdateFields.email = req.body.email\n\t}\n\n\tif('password' in req.body) {\n\t\tmustConfirmPassword = true\n\t\treq.assert('password', 'New password is not valid').isLength({min: 6})\n\t\tupdateFields.password = req.body.password\n\t}\n\n\tif ('name' in req.body) {\n\t\treq.assert('name', 'Name is not valid').notEmpty()\n\t\tupdateFields.name = req.body.name.replace(/[<>\\\\\\\\'\\\"]+/gim, '')\n\t}\n\n\tif (req.body.profile) {\n\t\tif ('website' in req.body.profile) {\n\t\t\t// allow '' or valid URL only\n\t\t\tif (req.body.profile.website !== '')\n\t\t\t\treq.assert('profile[website]', 'Website is not valid').isURL({require_protocol:true})\n\t\t\tupdateFields.profile.website = req.body.profile.website\n\t\t}\n\n\t\tif ('bio' in req.body.profile) {\n\t\t\treq.assert('profile[bio]', 'Bio must be shorter than 200 characters').isLength({min: 0, max: 200})\n\t\t\tupdateFields.profile.bio = req.body.profile.bio\n\t\t}\n\t}\n\n\t if (req.body.preferences) {\n\t\t if ('publishDefaultPublic' in req.body.preferences)\n\t\t\t updateFields.preferences.publishDefaultPublic = (req.body.preferences.publishDefaultPublic === '1')\n\t }\n\n\tif (mustConfirmPassword)\n\t\treq.assert('current_password', 'Your current password is required').notEmpty()\n\n \tvar errors = req.validationErrors()\n\n \tif (errors) {\n\t\tdelete req.body.password\n\t\tdelete req.body.current_password\n\t\treturn helper.respond(req, res, 400, 'Failed validation', errors, null, '/account/profile')\n \t}\n\n\t function updateUser(user, updateFields) {\n\t\tfunction copyKeysIfExist(keys, fromObj, toObj) {\n\t\t\tkeys.forEach(function(key){\n\t\t\t\tif (key in fromObj)\n\t\t\t\t\ttoObj[key] = fromObj[key]\n\t\t\t})\n\t\t}\n\t\tcopyKeysIfExist(['email', 'password', 'name'], updateFields , user)\n\t\tcopyKeysIfExist(['website', 'bio'] , updateFields.profile, user.profile)\n\t\tcopyKeysIfExist(['publishDefaultPublic'] , updateFields.preferences, user.preferences)\n\n\t\tfunction save() {\n\t\t\tuser.save(function(err) {\n\t\t\t\tif (err)\n\t\t\t\t\treturn next(err)\n\t\t\t\treturn helper.respond(req, res, 200, 'Account details updated', user.toJSON(), null, '/account/profile')\n\t\t\t})\n\t\t}\n\n\t\t// if updating email, then check that email does not exist already\n\t\tif ('email' in updateFields) {\n\t\t\tUser.findOne({email: updateFields.email}, function(err, existingUser){\n\t\t\t\tif (!existingUser) {\n\t\t\t\t\tsave()\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\t// else\n\t\t\t\tvar error = helper.formatResponseError('email', req.body.email, 'Another account with that email already exists')\n\n\t\t\t\treturn helper.respond(req, res, 409, 'Duplicate email', error, null, '/account/profile')\n\t\t\t})\n\t\t} else\n\t\t\tsave()\n\t }\n\n \tUser.findById(req.user.id, function(err, user) {\n \t\tif (err) return next(err)\n\n\t\tif (mustConfirmPassword)\n\t\t \tuser.comparePassword(req.body.current_password, function(err, isMatch) {\n\t\t\t\tif (isMatch)\n\t\t\t\t\tupdateUser(user, updateFields)\n\t\t\t\telse {\n\t\t\t\t\treturn helper.respond(req, res, 401, 'Unauthorised',\n\t\t\t\t\t\thelper.formatResponseError('current_password', '', 'Current password does not match'),\n\t\t\t\t\t\tnull, '/account/profile')\n\t\t\t\t}\n\t\t\t})\n\t\telse\n\t\t\tupdateUser(user, updateFields)\n \t})\n }\n\n/**\n * POST /account/password\n * Update current password. Used on resetting password from email link\n * @param password\n * @see this.postUpdateProfile() for updating the password from the profile page\n */\n\n exports.postUpdatePassword = function(req, res, next) {\n \treq.assert('password', 'Password must be at least 8 characters long').len(8)\n \treq.assert('confirm', 'Passwords must match').equals(req.body.password)\n\tvar wantJSON = req.xhr\n\n \tvar errors = req.validationErrors()\n\n \tif (errors) {\n\t\tif (!wantJSON) {\n\t\t\treq.flash('errors', helper.parseErrors(errors))\n\t\t\treturn res.redirect('/account/profile')\n\t\t} else {\n\t\t\treturn res.status(400).json(\n\t\t\t\thelper.responseStatusError('Failed validation', errors)\t// request intentionally not returned\n\t\t\t)\n\t\t}\n \t}\n\n \tUser.findById(req.user.id, function(err, user) {\n \t\tif (err) return next(err)\n\n \t\tuser.password = req.body.password\n\n \t\tuser.save(function(err) {\n \t\t\tif (err) return next(err)\n\t\t\tif (wantJSON) {\n\t\t\t\treturn res.json(\n\t\t\t\t\thelper.responseStatusSuccess('Password has been changed.', user.toJSON())\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\treq.flash('success', { message: 'Password has been changed.' })\n\t\t\t\tres.redirect('/account/profile')\n\t\t\t}\n \t\t})\n \t})\n }\n\n/**\n * POST /account/delete\n * Delete user account.\n */\n\n exports.postDeleteAccount = function(req, res, next) {\n \tUser.remove({ _id: req.user.id }, function(err) {\n \t\tif (err) return next(err)\n \t\treq.logout()\n \t\treq.flash('info', { message: 'Your account has been deleted.' })\n \t\tres.redirect('/')\n \t})\n }\n\n/**\n * GET /account/unlink/:provider\n * Unlink OAuth2 provider from the current user.\n * @param provider\n * @param id - User ObjectId\n */\n\n exports.getOauthUnlink = function(req, res, next) {\n \tvar provider = req.params.provider\n \tUser.findById(req.user.id, function(err, user) {\n \t\tif (err) return next(err)\n\n \t\tuser[provider] = undefined\n \t\tuser.tokens = _.reject(user.tokens, function(token) { return token.kind === provider })\n\n \t\tuser.save(function(err) {\n \t\t\tif (err) return next(err)\n \t\t\treq.flash('info', { message: provider + ' account has been unlinked.' })\n \t\t\tres.redirect('/account/profile')\n \t\t})\n \t})\n }\n\n/**\n * GET /reset/:token\n * Reset Password page.\n */\n\n exports.getReset = function(req, res) {\n \tif (req.isAuthenticated()) {\n \t\treturn res.redirect('/')\n \t}\n\n \tUser\n \t.findOne({ resetPasswordToken: req.params.token })\n \t.where('resetPasswordExpires').gt(Date.now())\n \t.exec(function(err, user) {\n \t\tif (!user) {\n \t\t\treq.flash('errors', { message: 'Password reset token is invalid or has expired.' })\n \t\t\treturn res.redirect('/forgot')\n \t\t}\n \t\tres.render('server/pages/account/setPassword', {\n\t\t\tmeta: {\n\t\t\t\tbodyclass: 'bLogin'\n\t\t\t},\n \t\t\ttitle: 'Password Reset',\n \t\t\ttoken: req.params.token\n \t\t})\n \t})\n }\n\n/**\n * POST /reset/:token\n * Process the reset password request.\n */\n\n exports.postReset = function(req, res, next) {\n \treq.assert('password', 'Password must be at least 8 characters long').len(8)\n \treq.assert('confirm', 'Passwords must match.').equals(req.body.password)\n\n \tvar errors = req.validationErrors()\n\n \tif (errors) {\n \t\treq.flash('errors', helper.parseErrors(errors))\n \t\treturn res.redirect('back')\n \t}\n\n \tasync.waterfall([\n \t\tfunction(done) {\n \t\t\tUser\n \t\t\t.findOne({ resetPasswordToken: req.params.token })\n \t\t\t.where('resetPasswordExpires').gt(Date.now())\n \t\t\t.exec(function(err, user) {\n \t\t\t\tif (!user) {\n \t\t\t\t\treq.flash('errors', { message: 'Password reset token is invalid or has expired.' })\n \t\t\t\t\treturn res.redirect('back')\n \t\t\t\t}\n\n \t\t\t\tuser.password = req.body.password\n \t\t\t\tuser.resetPasswordToken = undefined\n \t\t\t\tuser.resetPasswordExpires = undefined\n\n \t\t\t\tuser.save(function(err) {\n \t\t\t\t\tif (err) return next(err)\n \t\t\t\t\treq.logIn(user, function(err) {\n \t\t\t\t\t\tdone(err, user)\n \t\t\t\t\t})\n \t\t\t\t})\n \t\t\t})\n \t\t},\n \t\tfunction(user, done) {\n \t\t\tvar mail = {\n \t\t\t\tto: user.email,\n \t\t\t\tfrom: 'info@vizor.io',\n \t\t\t\tsubject: 'Your Patches password has been changed',\n \t\t\t\thtml: 'Hello,<br><br>' +\n\t \t\t\t\t'This is a confirmation that the password for your account ' + user.email + ' has just been changed.<br><br>',\n \t\t\t\ttext: 'Hello,\\n\\n' +\n\t \t\t\t\t'This is a confirmation that the password for your account ' + user.email + ' has just been changed.\\n',\n \t\t\t}\n\n \t\t\tmailer.send(mail.to, mail.subject, mail.html, mail.text)\n \t\t\t.then(function() {\n \t\t\t\treq.flash('success', { message: 'Success! Your password has been changed.' })\n \t\t\t\tdone()\n \t\t\t})\n \t\t\t.catch(done)\n \t\t}\n \t\t], function(err) {\n \t\t\tif (err) return next(err)\n \t\t\tres.redirect('/')\n \t\t})\n}\n\n/**\n * GET /forgot\n * Forgot Password page.\n */\n\n exports.getForgot = function(req, res) {\n \tif (req.isAuthenticated()) {\n \t\treturn res.redirect('/account')\n \t}\n \tres.render('server/pages/account/forgotPassword', {\n\t\tmeta: {\n\t\t\ttitle: 'Forgot Password',\n\t\t\tbodyclass: 'bAccount'\n\t\t}\n \t})\n }\n\n/**\n * POST /forgot\n * Create a random token, then the send user an email with a reset link.\n * @param email\n */\n\n exports.postForgot = function(req, res, next) {\n\treq.sanitize('email').trim()\n \treq.assert('email', 'Please enter a valid email address.').isEmail()\n\tvar wantJSON = req.xhr\n\n \tvar errors = req.validationErrors()\n\n \tif (errors) {\n\t\tif (wantJSON) {\n\t\t\treturn res.status(400).json(\n\t\t\t\thelper.responseStatusError('Failed validation', errors, {request:req.body})\n\t\t\t)\n\t\t} else {\n\t\t\treq.flash('errors', helper.parseErrors(errors))\n\t\t\treturn res.redirect('/forgot')\n\t\t}\n \t}\n\n\tvar email = req.body.email\n \tasync.waterfall([\n \t\tfunction(done) {\n \t\t\tcrypto.randomBytes(16, function(err, buf) {\n \t\t\t\tvar token = buf.toString('hex')\n \t\t\t\tdone(err, token)\n \t\t\t})\n \t\t},\n \t\tfunction(token, done) {\n \t\t\tUser.findOne({ email: req.body.email }, function(err, user) { // #664\n \t\t\t\tif (!user) {\n\t\t\t\t\tvar msg = 'No account with that email address exists.'\n\t\t\t\t\tif (wantJSON) {\n\t\t\t\t\t\treturn res.status(400).json(\n\t\t\t\t\t\t\thelper.responseStatusError(msg, helper.formatResponseError('email', email, msg), {request: req.body})\n\t\t\t\t\t\t)\n\t\t\t\t\t} else {\n\t\t\t\t\t\treq.flash('errors', { message: msg })\n\t\t\t\t\t\treturn res.redirect('/forgot')\n\t\t\t\t\t}\n \t\t\t\t}\n\n \t\t\t\tuser.resetPasswordToken = token\n\t\t\t\tuser.resetPasswordExpires = Date.now() + 3600000 // 1 hour\n\n\t\t\t\tuser.save(function(err) {\n\t\t\t\t\tdone(err, token, user)\n\t\t\t\t})\n\t\t\t})\n \t\t},\n \t\tfunction(token, user, done) {\n \t\t\tvar mail = {\n \t\t\t\tto: user.email,\n \t\t\t\tfrom: 'info@vizor.io',\n \t\t\t\tsubject: 'Reset your Patches password',\n \t\t\t\thtml: 'You are receiving this email because you (or someone else) have requested the reset of the password for your account.<br/><br/>' +\n \t\t\t\t'Please click on the following link, or paste this into your browser to complete the process:<br/><br/>' +\n \t\t\t\t'http://' + req.headers.host + '/reset/' + token + '<br/><br/>' +\n \t\t\t\t'If you did not request this, please ignore this email and your password will remain unchanged.<br/><br/>',\n \t\t\t\ttext: 'You are receiving this email because you (or someone else) have requested the reset of the password for your account.\\n\\n' +\n \t\t\t\t'Please click on the following link, or paste this into your browser to complete the process:\\n\\n' +\n \t\t\t\t'http://' + req.headers.host + '/reset/' + token + '\\n\\n' +\n \t\t\t\t'If you did not request this, please ignore this email and your password will remain unchanged.\\n'\n \t\t\t}\n\n \t\t\tmailer.send(mail.to, mail.subject, mail.html, mail.text)\n \t\t\t.then(function() {\n\t\t\t\tif (!wantJSON) {\n\t\t\t\t\treq.flash('info', {\n\t\t\t\t\t\tmessage: 'We emailed further instructions to ' + user.email + '.'\n\t\t\t\t\t})\n\t\t\t\t}\n \t\t\t\tdone()\n \t\t\t})\n \t\t\t.catch(done)\n \t\t}\n \t\t], function(err) {\n \t\t\tif (err) {\n\t\t\t\tres.status(500).json(\n\t\t\t\t\thelper.responseStatusError('The server could not email you. Please contact us for assistance.', [], {diag: err})\n\t\t\t\t)\n \t\t\t\treturn next(err)\n\t\t\t}\n\t\t\tif (wantJSON) {\n\t\t\t\treturn res.status(200).json(\n\t\t\t\t\thelper.responseStatusSuccess('We emailed further instructions to ' + email + '.', {email: email})\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tres.redirect('/forgot')\n\t\t\t}\n\n \t\t})\n}\n"
  },
  {
    "path": "controllers/vizor2TeaserController.js",
    "content": "exports.index = function(req, res) {\n\tres.render('vizor2Teaser', {\n\t\tlayout: false\n\t});\n}\n"
  },
  {
    "path": "docker-compose.yml",
    "content": "version: '2'\nservices:\n  redis:\n    image: redis\n    ports:\n      - 127.0.0.1:6379:6379\n  mongo:\n    image: mongo:3.2\n    ports:\n      - 127.0.0.1:27017:27017\n"
  },
  {
    "path": "documentation/browser/plugins/absolute_modulator.md",
    "content": "#Absolute\n\n##Description\nEmit the absolute **value** of the **input**.\n\n##Inputs\n###value\nPositive or negative input value\n\n##Outputs\n###result\nPositive output value\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/accumulate_modulator.md",
    "content": "#Accumulate\n\n##Description\nEvery input **value** is accumulated in an internal buffer (which resets to **zero** on **playback stop**).\n\n##Inputs\n###value\nA small **value** to be accumulated in an internal buffer.\n\n###reset\nSend a **value** to this slot to **reset** the accumulator to that specific **value**.\n\n##Outputs\n###value\nThe current **value** of the accumulation buffer.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/action_button.md",
    "content": "#Action\n\n##Description\nA push button that emits **True** whenever it is clicked.\n\n##Inputs\n##Outputs\n###bool\nSends a **True** each time the button is clicked.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/add_modulator.md",
    "content": "#Add number\n\n##Description\nAdd two floating point values.\n\n##Inputs\n###a\nThe first **operand**.\n\n###b\nThe second **operand**.\n\n##Outputs\n###result\nThe result of **A** + **B**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/add_on_trigger_float.md",
    "content": "#Add number conditionally\n\n##Description\nWhen receiving **True**, will output **A** + **B**, otherwise **A**.\n\n##Inputs\n###trigger\nOn **True**, this plugin will output **A** + **B**, otherwise **A**\n\n###A\n\n\n###B\n\n\n##Outputs\n###value\nif trigger is **True**, will output **A** + **B**, otherwise **A**\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/add_on_trigger_vector3.md",
    "content": "#Add Vectors Conditionally\n\n##Description\nWhen receiving **True**, will output **A** + **B**, otherwise **A**.\n\n##Inputs\n###trigger\nOn **True**, this plugin will output **A** + **B**, otherwise **A**.\n\n###A\nValue to add **B** to.\n\n###B\nValue to add to **A**.\n\n##Outputs\n###value\nif trigger is **True**, will output **A** + **B**, otherwise **A**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/and_modulator.md",
    "content": "#And\n\n##Description\nEmit **True** if _and only if_ both inputs are **True**. **False** otherwise.\n\n##Inputs\n###a\nThe first **operand**.\n\n###b\nThe second **operand**.\n\n##Outputs\n###bool\nEmits **True** if **first** _and_ **second** are **True**, and **False** otherwise.\n\n##Detail\n"
  },
  {
    "path": "documentation/browser/plugins/animate_float_on_trigger.md",
    "content": "#Animate Float on Trigger\n\n##Description\nAnimate value from **startValue** to **endValue** on **trigger** (Boolean) over time specified by **duration**.\n\n##Inputs\n###trigger\nSending a boolean impulse (**True**) to **trigger** will start the animation.\n\n###reset\nReset back to **Start value**.\n\n###one-shot\nIf **true**, only allow the animation to be triggered once (until reset).\n\n###duration\n**Duration** of animation.\n\n###startValue\n**Start value** of animation.\n\n###endValue\n**End value** of animation.\n\n##Outputs\n###value\nAnimated **value**.\n\n###active\n**True** while the animation is active.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/animate_vector3_on_trigger.md",
    "content": "#Animate Vector3 on Trigger\n\n##Description\nAnimate **value** from **startValue** to **endValue** on **trigger** (Boolean) over time specified by **duration**.\n\n##Inputs\n###trigger\nSending a Boolean impulse (**True**) to **trigger** will start the **animation**.\n\n###reset\nReset **value** back to **startValue**.\n\n###one-shot\nIf **True**, only allow the animation to be triggered once (until **reset**).\n\n###duration\n**Duration** of animation.\n\n###startValue\nAnimation start **value**.\n\n###endValue\nAnimation end **value**.\n\n##Outputs\n###value\nOutput for animated **value** .\n\n###active\n**True** while the animation is active.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/annotation.md",
    "content": "#Annotation\n\n##Description\nAdd **textual** hints to the **graph**.\n\n##Inputs\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/array_blend_modulator_float.md",
    "content": "#Animate Between Input Floats\n\n##Description\nSet up **n** inputs, then choose which one to output. The output will animate from the previous input to the currently selected one over time duration and using the selected blending function\n\n##Inputs\n###number\nInput **number** to select for **output**.\n\n###duration\n**Duration** of blend animation.\n\n##Outputs\n###value\nEmits the selected **input**.\n\n###length\nEmits the number of **inputs** = the **length** of the **array**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/array_blend_modulator_vector3.md",
    "content": "#Animate Between Input Vector3s\n\n##Description\nSet up **n** inputs, then choose which one to output. The output will animate from the previous input to the currently selected one over time duration and using the selected blending function\n\n##Inputs\n###number\nInput **number** to select for output.\n\n###duration\n**Duration** of blend animation\n\n##Outputs\n###value\nEmits the selected **input**.\n\n###length\nEmits the number of **inputs** = the **length** of the **array**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/array_clear.md",
    "content": "#Array Clear\n\n##Description\nEmpties the given **array**.\n\n##Inputs\n###array\nOptional **array** to change.\n\n###clear\nSend a **True** signal to this input to clear the **array**\n\n##Outputs\n###array\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/array_function.md",
    "content": "#Array Function\n\n##Description\nCreates an **array** with the nested patch. A local variable called **index** is available to the patch in each iteration. Each iteration should output its result to the **item** local variable.\n\n##Inputs\n###length\nThe length of the **array** to create.\n\n##Outputs\n###array\nThe **array** created by the function.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/array_get.md",
    "content": "#Array Get\n\n##Description\nOutputs the **item** from the **index** of a specific **array**.\n\n##Inputs\n###array\nOptional **array** to change.\n\n###index\n**Index** for object in **array**.\n\n##Outputs\n###item\nThis outputs the **item** of the selected **index** of the specified **array**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/array_length.md",
    "content": "#Array Length\n\n##Description\nOutputs the **length** of the **array**.\n\n##Inputs\n###array\nThe **array** you wish to fetch the **length** of.\n\n##Outputs\n###length\nThe **length** of the **array**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/array_remove.md",
    "content": "#Array Remove\n\n##Description\nRemove a specific **index** in the array.\n\n##Inputs\n###array\nOptional **array** to change.\n\n###index\n**Index** for **object** in the **array**.\n\n##Outputs\n###array\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/array_set.md",
    "content": "#Array Set\n\n##Description\nSelect an **index** of the **array** and change the **item** in that array index.\n\n##Inputs\n###array\nOptional **array** to change.\n\n###index\n**Index** for **object** in the **array**.\n\n###item\n**Item** to set in **array** at **index**.\n\n##Outputs\n###array\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/array_switch_modulator.md",
    "content": "#Array Revolver Switch\n\n##Description\nRevolver style array switch. Set up **n** inputs, then choose which one to output.\n\n##Inputs\n###number\nInput **number** to select for output.\n\n##Outputs\n###value\nEmits the selected **input**.\n\n###length\nEmits the _number of inputs_ = the **length** of the array.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/atan2_modulator.md",
    "content": "#Atan2\n\n##Description\nAtan2(X, Y).\n\n##Inputs\n###x value\nInput the **X** value.\n\n###y value\nInput the **Y** value.\n\n##Outputs\n###result\natan(**X**,**Y**).\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/atan_modulator.md",
    "content": "#Atan\n\n##Description\nAtan(**X**).\n\n##Inputs\n###x value\nInput the **X** value.\n\n##Outputs\n###result\natan(**X**).\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_ambisonic_buffermerger.md",
    "content": "#TOAmbisonic buffer merger\n\n##Description\nDecode an ambisonic spherical recording to headphones.\n\n##Inputs\n###buffer1\nThe first 8ch audio buffer.\n\n###buffer2\nThe second 8ch audio buffer.\n\n###filetype\nAudio file format:\n**0**: WAV\n**1**: OGG.\n\n##Outputs\n###buffer12\nThe 16ch combined buffer.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_ambisonic_foaconverter.md",
    "content": "#FOAmbisonic converter\n\n##Description\nDecode an ambisonic spherical recording to headphones.\n\n##Inputs\n###audio_in\nA 4-channel B-format audio stream to convert.\n\n###convention\nAmbisonic convention:\n**0**: ACN/N3D\n**1**: WXYZ/FuMa\n**2**: ACN/SN3D.\n\n##Outputs\n###audio_out\nA converted 4-channel B-format audio stream.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_ambisonic_foadecoder.md",
    "content": "#FOAmbisonic decoder\n\n##Description\nDecode an ambisonic spherical recording to headphones.\n\n##Inputs\n###audio_in\nA 4-channel B-format audio stream to convert.\n\n###buffer\nA 4-channel audio buffer containing binaural decoding filters.\n\n##Outputs\n###audio_out\nA 2-channel binaural audio stream for headphones.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_ambisonic_foaencoder.md",
    "content": "#FOAmbisonic encoder\n\n##Description\nEncode a monophonic sound to an ambisonic 4-channel B-format stream.\n\n##Inputs\n###audio_in\nA mono audio stream to encode.\n\n###direction\nDirection vector.\n\n##Outputs\n###audio_out\nA 4-channel FOA audio stream.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_ambisonic_foamirror.md",
    "content": "#FOAmbisonic mirror\n\n##Description\nMirror an ambisonic spherical recording across the principal planes.\n\n##Inputs\n###audio_in\nA 4-channel B-format audio stream.\n\n###mirror_plane\nPlane to mirror:\n**0**: None\n**1**: Front-Back\n**2**: Left-Right\n**3**: Up-Down.\n\n##Outputs\n###audio_out\nA mirrored 4-channel B-format audio stream.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_ambisonic_foarotator.md",
    "content": "#FOAmbisonic rotator\n\n##Description\nRotate an ambisonic spherical recording.\n\n##Inputs\n###audio_in\nA 4-channel B-format audio stream to rotate.\n\n###rotation\nHead/camera rotation.\n\n##Outputs\n###audio_out\nA rotated 4-channel B-format audio stream.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_ambisonic_foavmic.md",
    "content": "#FOAmbisonic virtual mic\n\n##Description\nMirror an ambisonic spherical recording across the principal planes.\n\n##Inputs\n###audio_in\nA 4-channel B-format audio stream.\n\n###direction\nOrientation vector of virtual microphone.\n\n###mic_type\nType of virtual microphone:\n**0**: Cardioid\n**1**: Supercardioid\n**2**: Hypercardioid.\n\n##Outputs\n###audio_out\nA monophonic virtual microphone audio stream.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_ambisonic_toaconverter.md",
    "content": "#TOAmbisonic converter\n\n##Description\nDecode an ambisonic spherical recording to headphones.\n\n##Inputs\n###audio_in\nA 16-channel TOA audio stream to convert.\n\n###convention\nAmbisonic convention:\n**0**: ACN/N3D\n**1**: WXYZ/FuMa\n**2**: ACN/SN3D.\n\n##Outputs\n###audio_out\nA converted 16-channel TOA audio stream.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_ambisonic_toadecoder.md",
    "content": "#TOAmbisonic converter\n\n##Description\nDecode an ambisonic spherical recording to headphones.\n\n##Inputs\n###audio_in\nA 16-channel TOA Audio stream to decode.\n\n###buffer\nA 16-channel audio buffer containing binaural decoding filters.\n\n##Outputs\n###audio_out\nA 2-channel binaural audio stream for headphones.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_ambisonic_toaencoder.md",
    "content": "#TOAmbisonic encoder\n\n##Description\nEncode a monophonic sound to an ambisonic 4-channel B-format stream.\n\n##Inputs\n###audio_in\nA mono audio stream to encode.\n\n###direction\nDirection vector.\n\n##Outputs\n###audio_out\nA 16-channel TOA audio stream.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_ambisonic_toamirror.md",
    "content": "#TOAmbisonic mirror\n\n##Description\nMirror an ambisonic spherical recording across the principal planes.\n\n##Inputs\n###audio_in\nA 16-channel TOA audio stream.\n\n###mirror_plane\nPlane to mirror:\n**0**: None\n**1**: Front-Back\n**2**: Left-Right\n**3**: Up-Down.\n\n##Outputs\n###audio_out\nA mirrored 16-channel TOA audio stream.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_ambisonic_toarotator.md",
    "content": "#TOAmbisonic rotator\n\n##Description\nRotate an ambisonic spherical recording.\n\n##Inputs\n###audio_in\nA 16-channel TOA audio stream to rotate.\n\n###rotation\nHead/camera rotation.\n\n##Outputs\n###audio_out\nA rotated 16-channel TOA audio stream.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_ambisonic_toavmic.md",
    "content": "#TOAmbisonic virtual mic\n\n##Description\nMirror an ambisonic spherical recording across the principal planes.\n\n##Inputs\n###audio_in\nA 16-channel HOA audio stream.\n\n###direction\nOrientation vector of virtual microphone.\n\n###mic_type\nType of virtual microphone:\n**0**: Cardioid\n**1**: Supercardioid\n**2**: Hypercardioid\n**3**: max-rE.\n\n##Outputs\n###audio_out\nA monophonic virtual microphone audio stream.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_analyse_modulator.md",
    "content": "#Analyse\n\n##Description\nFrequency and time domain audio analysis.\n\n##Inputs\n###source\nAn audio source to analyse.\n\n###bin-count\nNumber of **FFT bins**. Will be made power-of-two and clamped to 8-2048.\n\n###multiplier\nMultiplier for each **bin** value.\n\n###smoothing\nAmount of FFT smoothing between frames.\n\n##Outputs\n###source\nThe unmodified supplied source.\n\n###fft-bins\nThe FFT bins.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_buffer_source_modulator.md",
    "content": "#Buffer source\n\n##Description\nCreate a playable audio source from a **buffer** of audio data.\n\n##Inputs\n###buffer\nAn audio **buffer** to create a playable source from.\n\n###play\nStart or Stop playback by sending a boolean. Send a **True** to Start, **False** to Stop.\n\n###loop\nSet Looping playback by sending a boolean. Send a **True** to enable looping, **False** to disable looping.\n\n###loop-start\nStart of loop (in seconds).\n\n###loop-end\nEnd of loop (in seconds).\n\n##Outputs\n###source\nA playable audio source.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_delay_modulator.md",
    "content": "#Delay\n\n##Description\nDelay audio data.\n\n##Inputs\n###source\nAn **audio source** to **delay**.\n\n###delay\n**Delay** time (in seconds).\n\n##Outputs\n###source\nThe **delayed audio source**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_gain_modulator.md",
    "content": "#Gain (mix)\n\n##Description\n(De)amplify or mix audio data.\n\n##Inputs\n###gain\nAmplification scalar.\n\n##Outputs\n###source\nA (de)amplified audio source.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_get_current_time_modulator.md",
    "content": "#Current time\n\n##Description\nGet the current **playback time** of the supplied **audio sample** in seconds.\n\n##Inputs\n###audio\nInput **audio sample**.\n\n##Outputs\n###time\nCurrent **playback time**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_get_duration_modulator.md",
    "content": "#Duration\n\n##Description\nGet the **duration** of the supplied audio sample in **seconds**.\n\n##Inputs\n###audio\nInput **audio sample**.\n\n##Outputs\n###duration\nAudio sample **duration** in **seconds**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_oneshot_on_trigger.md",
    "content": "#One-shot audio player\n\n##Description\nTrigger playback of a one-shot audio sample.\n\n##Inputs\n###buffer\nAn **audio buffer** to create a playable source from.\n\n###trigger\nSend a **trigger** to play the sound.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_player.md",
    "content": "#Audio player\n\n##Description\nPlay an audio stream. Playback loops.\n\n##Inputs\n###audio\nThe **audio stream** to play.\n\n###play\nSend **True** to start playback and **False** to stop.\n\n###mute\nSend **True** to mute playback and **False** to re-enable audio.\n\n###volume\nSet playback **volume**.\n\n###time\nSet playback **time**.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_source_player.md",
    "content": "#Audio source player\n\n##Description\nPlays a supplied **audio source**.\n\n##Inputs\n###source\nThe **audio source** to play.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_spatial_listener.md",
    "content": "#Spatial Listener\n\n##Description\nSpatial Listener.\n\n##Inputs\n###position\nProvide the **position**.\n\n###forward\nProvide the **Forward Vector**.\n\n###up\nProvide the **Up Vector**.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/audio_spatial_panner.md",
    "content": "#Spatial Panner\n\n##Description\nSpatial Panner.\n\n##Inputs\n###source\nAn audio source to spatialize.\n\n###position\nPosition.\n\n###orientation\nOrientation.\n\n###coneInnerAngle\nThe **angle**, in **degrees**, of a cone _inside of which_ there will be no **volume reduction**.\n\n###coneOuterAngle\nThe **angle**, in **degrees**, of a cone _outside of which_ the volume will be reduced by a **constant value**, defined by the **coneOuterGain** attribute.\n\n###coneOuterGain\nThe amount of **volume reduction** _outside the cone_ defined by the **coneOuterAngle** attribute. Its default value is **0**, meaning that no sound can be heard.\n\n###refDistance\nThe **reference distance** for reducing volume as the audio source moves further from the listener.\n\n###maxDistance\nA **value** representing the **maximum distance** between the audio source and the listener, after which the volume is not reduced any further.\n\n###rolloff\nA **value** describing how quickly the volume is reduced as the source moves away from the listener.\n\n##Outputs\n###source\nA spatialized audio source\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/bool_display.md",
    "content": "#Bool\n\n##Description\nDisplays the text **True** or **False**, depending on the state of the supplied **boolean**. If no data is being received, displays **-**.\n\n##Inputs\n###bool\nThe input **boolean** to display.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/camera_forward_vector.md",
    "content": "#Camera Forward Vector\n\n##Description\nExtract the **forward vector** from a camera.\n\n##Inputs\n###camera\nConnect the **Camera** -object into this **input**.\n\n##Outputs\n###forward\nExtracted **forward vector**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/ceiling_modulator.md",
    "content": "#Ceiling\n\n##Description\nRound **value** to the closest higher **interger**.\n\n##Inputs\n###value\n**Value** to be rounded to the closest higher **integer**.\n\n##Outputs\n###result\nThe rounded result as an **integer**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/change_trigger.md",
    "content": "#Trigger On Change\n\n##Description\nTriggers the **output** a single time, when the **input value** changes.\n\n##Inputs\n###value\nItem to watch for.\n\n##Outputs\n###bool\nTriggered for one frame when the **input value** changes.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/clamp_modulator.md",
    "content": "#Clamp\n\n##Description\nEmit a float **value** no less than **min** and no greater than **max**.\n\n##Inputs\n###value\n**Value** to be clipped by **min** and **max**.\n\n###min\nMinimum output **value**.\n\n###max\nMaximum output **value**.\n\n##Outputs\n###result\nEmits the **value**. If **value** is higher than the **max** then limits to **max**, if lower than **min** then limits to **min**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/clamped_accumulate_modulator.md",
    "content": "#Clamped accumulate\n\n##Description\nEvery input **value** is accumulated in an internal buffer. The buffer **value** is not permitted to be smaller then **min** or larger than **max**.\n\n##Inputs\n###value\nA small **value** to be accumulated in an internal buffer.\n\n###min\n**Minimum** internal buffer **value**.\n\n###max\n**Maximum** internal buffer **value**.\n\n###reset\nSend a **value** to this slot to **reset** the accumulator to that **value**.\n\n##Outputs\n###value\nThe current **value** of the accumulation buffer.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/clock_generator.md",
    "content": "#Clock\n\n##Description\nEmits current absolute **time** in seconds.\n\n##Inputs\n##Outputs\n###seconds\nCurrent absolute **time**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/color_add_modulator.md",
    "content": "#Add color\n\n##Description\nAdds a constant **value** to all components of a color. Each channel is clipped to the range of **0** to **1**.\n\n##Inputs\n###color\nInput color.\n\n###value\n**Value** to be added to the **R**, **G** and **B** channels.\n\n##Outputs\n###color\nOutput color: **R**+**V**, **G**+**V**, **B**+**V**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/color_blend_modulator.md",
    "content": "#Blend color\n\n##Description\nColor crossfader. Performs a linear blend between two colors (Color **A** and Color **B**).\n\n##Inputs\n###color A\nFirst color **operand**.\n\n###color B\nSecond color **operand**.\n\n###mix\n**0**: Emit only color **A**.\n**1**: Emit only color **B**.\n\n##Outputs\n###color\nLinear mix of colors **A** and **B**: A * (1 - mix) + B * mix\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/color_display.md",
    "content": "#Color\n\n##Description\nDisplays the supplied **color** in a **rectangle** in the plugin window.\n\n##Inputs\n###color\nInput **color** to be **displayed**.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/color_multiply_modulator.md",
    "content": "#Multiply color\n\n##Description\nScale the **RGB** components of a color by a supplied factor.\n\n##Inputs\n###color\n**Color** to be modulated.\n\n###factor\nFactor to **scale** the RGB components of the supplied color with.\n\n##Outputs\n###color\nOutput color: **R** * **V**, **G** * **V**, **B** * **V**, **A**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/color_picker.md",
    "content": "#Color picker\n\n##Description\nProvides an intuitive way of picking arbitrary colors via a **hue** slider and **saturation/value** selection area.\n\n##Inputs\n##Outputs\n###color\nThe selected **color**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/const_float_generator.md",
    "content": "#Number\n\n##Description\nEmits a **float** constant specified in the **input** field. If an invalid string in entered, the field is **reset** to the previous value.<br><br>Keyboard shortcut&nbsp;&nbsp;&nbsp;<kbd>4</kbd>\n\n##Inputs\n##Outputs\n###value\nThe currently entered **value**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/const_text_generator.md",
    "content": "#Text\n\n##Description\nEnter a constant text **string**.\n\n##Inputs\n##Outputs\n###text\nThe currently entered **text**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/convert_bool_float_modulator.md",
    "content": "#Bool to Float\n\n##Description\nConvert a **bool** to a **float**. **True** emits **1** and **False** emits a **0**.\n\n##Inputs\n###bool\nInput **boolean** (**True**/**False**) to be converted.\n\n##Outputs\n###value\nEmits **0** when the input is **False** and **1** otherwise.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/convert_color_hsl_modulator.md",
    "content": "#Color to HSL\n\n##Description\nCreate an RGB color from **hue**, **saturation** and **luminosity**.\n\n##Inputs\n###color\nThe corresponding **RGBA** color.\n\n##Outputs\n###hue\nThe **hue** of the input **color**.\n\n###saturation\nThe **saturation** (color intensity) of the input **color**.\n\n###luminosity\nThe **luminosity** (brightness) of the input **color**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/convert_color_rgb_modulator.md",
    "content": "#Color to RGB\n\n##Description\nConvert a color to its individual **RGB** components so they can be individually manipulated.\n\n##Inputs\n###color\nInput **color** to be split.\n\n##Outputs\n###red\n**Red** channel **value**.\n\n###green\n**Green** channel **value**.\n\n###blue\n**Blue** channel **value**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/convert_float_bool_modulator.md",
    "content": "#Float to Bool\n\n##Description\nConvert a **float** to a **boolean**. **0** is **False**, everything else is **True**.\n\n##Inputs\n###value\nInput **float** to be converted.\n\n##Outputs\n###bool\nEmits **False** when the input value is **0** and **True** otherwise.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/convert_hsl_color_modulator.md",
    "content": "#HSL to Color\n\n##Description\nCreate an **RGB** color from **hue**, **saturation** and **luminosity**.\n\n##Inputs\n###hue\nThe **hue** of the output color.\n\n###saturation\nThe **saturation** (color intensity) of the output color.\n\n###luminosity\nThe **luminosity** (brightness) of the output color.\n\n##Outputs\n###color\nThe corresponding **RGB** color.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/convert_oscilator_unit_modulator.md",
    "content": "#Oscilator to unit\n\n##Description\nRescales and offsets a number in the range **-1** to **1** to the range of **0** to **1**.\n\n##Inputs\n###value\nThe input **value**.\n\n##Outputs\n###value\nThe output **value**: (I + 1) / 2.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/convert_rgb_color_modulator.md",
    "content": "#RGB to Color\n\n##Description\nCreates a new **color** from individual **RGB** components.\n\n##Inputs\n###red\n**Red** channel **value**.\n\n###green\n**Green** channel **value**.\n\n###blue\n**Blue** channel **value**.\n\n##Outputs\n###color\nThe output **color**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/convert_string_float_modulator.md",
    "content": "#String to float\n\n##Description\nConverts a **string** to a **float**.\n\n##Inputs\n###text\nInput **string** to be converted.\n\n##Outputs\n###value\nThe parsed **float** value of the input **string** _or_ **0**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/convert_vector_xyz_modulator.md",
    "content": "#Vector to XYZ\n\n##Description\nDecompose a **vector** to its individual **XYZ** components so they can be manipulated individually.\n\n##Inputs\n###vector\nInput **vector**.\n\n##Outputs\n###x\nThe **X-component**.\n\n###y\nThe **Y-component**.\n\n###z\nThe **Z-component**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/cos_modulator.md",
    "content": "#Cos\n\n##Description\nCos(X).\n\n##Inputs\n###value\nInput **value**.\n\n##Outputs\n###result\nCos(**value**).\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/cosine_modulator.md",
    "content": "#Cosine\n\n##Description\nCosine oscillator. A **time** value incrementing by one unit per second will yield a 1Hz output signal.\n\n##Inputs\n###time\nTime in seconds.\n\n##Outputs\n###value\nEmits Cos(**time** * 2pi).\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/cubemap_assembler.md",
    "content": "#Cubemap Assembler\n\n##Description\nAssemble a cubemap texture by combining Positive XYZ and Negative XYZ.\n\n##Inputs\n###positive x\nPositive **X** texture face.\n\n###negative x\nNegative **X** texture face.\n\n###positive y\nPositive **Y** texture face.\n\n###negative y\nNegative **Y** texture face.\n\n###positive z\nPositive **Z** texture face.\n\n###negative z\nNegative **Z** texture face.\n\n##Outputs\n###cube texture\nAssembled cubemap texture.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/data_info_display.md",
    "content": "#Data info\n\n##Description\nDisplays metrics about the input **value** and its **type**.\n\n##Inputs\n###any\nInput **value** to be analyzed.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/delta_modulator.md",
    "content": "#Delta\n\n##Description\nEmits the derivative of the incoming **value**.\n\n##Inputs\n###reset\nSend **True** to this slot to **clear** the internal state.\n\n###value\nInput **value**.\n\n##Outputs\n###delta\nThe delta **value** from the last frame update.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/delta_t_generator.md",
    "content": "#Delta time\n\n##Description\nEmits the current frame **delta time** in seconds.\n\n##Inputs\n##Outputs\n###seconds\nLast frame **delta time** in seconds.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/divide_modulator.md",
    "content": "#Divide\n\n##Description\nDivides **value** by **scalar** and emits the result.\n\n##Inputs\n###value\nInput **value** to be divided.\n\n###scalar\n**Factor** to divide **value** by.\n\n##Outputs\n###result\nEmits the result of (**value**/**scalar**).\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/entity.md",
    "content": "#Entity Patch\n\n##Description\n3D Entity Patch.\n\n##Inputs\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/entity_component.md",
    "content": "#Entity Component Patch\n\n##Description\nEntity Component Patch. Contains behavior for a 3D Entity.\n\n##Inputs\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/envelope_modulator.md",
    "content": "#Line Envelope\n\n##Description\nEnvelope modulator\n\n##Inputs\n###x\n**X** value to pick **Y** with.\n\n##Outputs\n###y\nThe value at **X**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/equals_modulator.md",
    "content": "#Equals\n\n##Description\nEmits **True** if **value** equals **reference**, and **False** otherwise.\n\n##Inputs\n###value\nInput **value**.\n\n###reference\nReference **value** to comprate **value** to.\n\n##Outputs\n###bool\n**True** if **value** equals **reference** and **False** otherwise.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/exp_modulator.md",
    "content": "#Exp\n\n##Description\nExp(X).\n\n##Inputs\n###value\nInput **value**.\n\n##Outputs\n###result\nExp(**value**).\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/float_display.md",
    "content": "#Float\n\n##Description\nDisplay the supplied **float value** on the plugin surface.<br><br>Keyboard shortcut&nbsp;&nbsp;&nbsp;<kbd>5</kbd>\n\n##Inputs\n###float\nInput **value** to be displayed.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/floor_modulator.md",
    "content": "#Floor\n\n##Description\nRound **value** to the closest lower **interger**.\n\n##Inputs\n###value\n**Value** to be rounded down to closest lower **integer**.\n\n##Outputs\n###result\nThe value rounded down to the closest lower **integer**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/format_string_float.md",
    "content": "#Float as string\n\n##Description\nFormats a **float** as a **string**.\n\n##Inputs\n###float\nInput **float** to be formatted.\n\n###decimals\nNumber of **decimals** to **output**.\n\n##Outputs\n###text\nThe input **float** as a **string**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/ga_pageview.md",
    "content": "#Google Analytics Page view\n\n##Description\nReports a page view (as a hash under the experience URL) to **GA** any time the input changes. Sets **page** first, then calls **pageview**.\n\n##Inputs\n###hash\nThe location hash to report to **GA**.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/gamepad_generator.md",
    "content": "#XBOX 360 Gamepad\n\n##Description\nButtons and axes from a HTML5 standard gamepad.\n\n##Inputs\n###pad number\nGamepad **number**.\n\n##Outputs\n###button 0\nButton **0**.\n\n###button 1\nButton **1**.\n\n###button 2\nButton **2**.\n\n###button 3\nButton **3**.\n\n###left bumper\nLeft bumper.\n\n###right bumper\nRight bumper.\n\n###left trigger\nLeft trigger.\n\n###right trigger\nRight trigger.\n\n###select\nSelect.\n\n###start\nStart.\n\n###left stick button\nLeft stick button.\n\n###right stick button\nRight stick button.\n\n###D-pad top\nD-pad top.\n\n###D-pad bottom\nD-pad bottom.\n\n###D-pad left\nD-pad left.\n\n###D-pad right\nD-pad right.\n\n###extra\nExtra.\n\n###left stick X\nLeft stick **X**.\n\n###left stick Y\nLeft stick **Y**.\n\n###right stick X\nRight stick **X**.\n\n###right stick Y\nRight stick **Y**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/google_analytics.md",
    "content": "#Google Analytics Tracking Property\n\n##Description\nLets you track *views* and Patches *events* in your own **Google Analytics** property.\n\n##Inputs\n###trackingId\nGoogle Analytics property **Tracking ID**.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/graph.md",
    "content": "#Nested Patch\n\n##Description\nA Nested Patch can contain other patches. Nest patches to build complex functions or just to tidy things up. Click the **pencil icon** to edit.<br><br>Keyboard shortcut&nbsp;&nbsp;&nbsp;<kbd>2</kbd>\n\n##Inputs\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/gte_modulator.md",
    "content": "#More than or equal\n\n##Description\nEmits **True** if the supplied **value** is larger than - or equal to - **reference**, and **False** otherwise.\n\n##Inputs\n###value\nInput **value** to be compared.\n\n###reference\nReference to compare **value** to.\n\n##Outputs\n###bool\nEmits **True** if **value** is larger than - or equal to - **reference**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/if_else_modulator.md",
    "content": "#If ... Else\n\n##Description\nEmits **true value** if condition is **True** and **false value** otherwise. The output only updates when the condition or relevant input **value** does. Any incoming data-flow to the **value** slot excluded by condition _does not result_ in data emission.\n\n##Inputs\n###condition\nSend **True** to route **true value** to the output and **False** to route **false value**.\n\n###true value\n**Value** to be send to output if condition is **True**.\n\n###false value\n**Value** to be send to output if condition is **False**.\n\n##Outputs\n###value\nEmits **true value** if condition is **True** and **false value** otherwise.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/if_modulator.md",
    "content": "#If\n\n##Description\nAllows **value** though if _condition_ is **True** and inhibits futher data-flow otherwise.\n\n##Inputs\n###condition\n_Condition_ that, if **True**, allows **value** to be emitted.\n\n###value\nValue to be emitted if _condition_ is **True**.\n\n##Outputs\n###value\nEmits **value** if _condition_ is **True** and nothing otherwise.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/initialise_generator.md",
    "content": "#Initialise\n\n##Description\nEmits **True** on the first frame after playback is started, then **False** for one frame and then stops emitting. Can be used to run initialisation logic on the first frame of playback only.\n\n##Inputs\n##Outputs\n###bool\nEmits **True** on the first frame of playback, then **False** for one frame, then stops emitting.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/input_proxy.md",
    "content": "#Input proxy\n\n##Description\nCreate a new type-less slot to route data into the current graph from its parent. \nWhen connected to a slot, it will assume its type until disconnected. \nRenaming this plugin will rename the corresponding parent slot.<br><br>\nKeyboard shortcut: <kbd>1</kbd>\n\n##Inputs\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/inputs_to_array.md",
    "content": "#Inputs to Array\n\n##Description\nCombine all the **input** slots into an output **array** of the same datatype.\n\n##Inputs\n##Outputs\n###array\nThe **array**.\n\n###length\nThe number of **inputs** ie. the length of the **array**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/is_in_vr.md",
    "content": "#Is In VR\n\n##Description\nOutputs **True** if the graph is currently viewed in **VR**.\n\n##Inputs\n##Outputs\n###fullscreen\n**True** if in fullscreen, **False** if not.\n\n###stereo\n**True** if in stereo, **False** if not.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/key_press_generator.md",
    "content": "#Key press\n\n##Description\nEmits **True** on the next update, after the key matching the set filter has been pressed, **False** once after it has been released.\n\n##Inputs\n##Outputs\n###signal\nEmits **True** once when the set key is pressed.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/knob_float_generator.md",
    "content": "#Knob\n\n##Description\nEmits a user controllable float **value** between **0** and **1**.<br><br>Keyboard shortcut&nbsp;&nbsp;&nbsp;<kbd>9</kbd>\n\n##Inputs\n##Outputs\n###value\nEmits the current **value** when the knob is adjusted.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/label_generator.md",
    "content": "#Label\n\n##Description\nEmits a **string** specified in the **input** field.\n\n##Inputs\n##Outputs\n###value\nThe currently entered **text**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/led_display.md",
    "content": "#Led\n\n##Description\nDisplays the supplied normalised float **value** as a red LED, with a 8 bit color granularity.\n\n##Inputs\n###float\nNormalised input **value**.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/less_than_modulator.md",
    "content": "#Less than\n\n##Description\nEmits **True** if the supplied **value** is _less than_ the reference and **False** otherwise.\n\n##Inputs\n###value\nInput **value** to compare.\n\n###reference\n_Reference_ to compare **value** to.\n\n##Outputs\n###bool\nEmits **True** if **value** is _less than_ reference and **False** otherwise.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/load_graph_on_trigger.md",
    "content": "#Load File on Trigger\n\n##Description\nLoads and plays the Patches file (replacing the current one) on **trigger**.\n\n##Inputs\n###trigger\nWhen the **trigger** is **True**, the URL will be loaded into the player.\n\n###url\nRelative **URL** to a published Patches file, eg. /fthr/moon\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/log_display.md",
    "content": "#Log\n\n##Description\nPipes the supplied **text** to the console log of your browser.\n\n##Inputs\n###text\nInput **text** to be logged in the console log of your browser.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/log_modulator.md",
    "content": "#Log\n\n##Description\nLog(X).\n\n##Inputs\n###value\nInput **value**.\n\n##Outputs\n###result\nlog(**value**).\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/loop.md",
    "content": "#Loop\n\n##Description\nEncapsulate a nested graph into- and out of which arbitrary data can be routed and run the enclosed logic once per loop iteration. The loop counter is made available to enclosing logic as a local variable with the name **index**.\n\n##Inputs\n###first\nThe start index.\n\n###last\nThe end index.\n\n###step\nLoop index increment.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/lowpass_filter_modulator.md",
    "content": "#Lowpass Filter\n\n##Description\nPerform a simple 1st-order lowpass filtering of the supplied value. **Caution:** Do not use this plugin to filter infrequently updated values. This plugin expects continuous input on every frame; if necessary, a clock or another cheap continuous float provider can be multiplied by zero and added to the lowpass input to drive updates.\n\n##Inputs\n###value\nInput **value**. Must be updated every frame for correct operation of the filter.\n\n###amount\nFilter **amount**. **0** is pure passthrough, **0.999** equals maximum filtering.\n\n##Outputs\n###result\nThe smoothed output **value**.\n\n##Detail\n"
  },
  {
    "path": "documentation/browser/plugins/lte_modulator.md",
    "content": "#Less than or equal\n\n##Description\nEmits **True** if the supplied **value** is _less than_ or _equal_ to **reference** and **False** otherwise.\n\n##Inputs\n###value\nInput **value** to be compared.\n\n###reference\nReference to compare **value** to.\n\n##Outputs\n###bool\nEmits **True** if **value** is _less than_ or _equal_ to **reference**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/matrix_display.md",
    "content": "#Matrix\n\n##Description\nDisplays the supplied **matrix** as a 4x4 grid of values.\n\n##Inputs\n###matrix\nThe input **matrix** to be displayed.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/max_modulator.md",
    "content": "#Max\n\n##Description\nEmit the greater of the two input **values**.\n\n##Inputs\n###a\nThe **first** input **value**.\n\n###b\nThe **second** input **value**.\n\n##Outputs\n###max\nEmits the larger of the two supplied **values**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/member_array_length_modulator.md",
    "content": "#Object array length\n\n##Description\nEmits the **length** of an **array** member of the supplied **object**.\n\n##Inputs\n###object\n**Input object** containing an **array**.\n\n###member\nName of the **array** to emit the **length** of.\n\n##Outputs\n###length\nThe **length** of the specified array or **0**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/member_to_bool_modulator.md",
    "content": "#Object member to bool\n\n##Description\nEmits a **boolean** (**True**/**False**) representation of specified member of the supplied **object**.\n\n##Inputs\n###object\nInput **object**.\n\n###member\nName of the **member** to be converted.\n\n##Outputs\n###bool\nThe **boolean** (**True**/**False**) representation of the specified **member**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/member_to_float_modulator.md",
    "content": "#Object member to float\n\n##Description\nEmits a **float** representation of specified **member** of the supplied **object**.\n\n##Inputs\n###object\nInput **object**.\n\n###member\nName of the **member** to be converted.\n\n##Outputs\n###value\nThe **float** representation of the specified **member**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/member_to_object_modulator.md",
    "content": "#Object member to object\n\n##Description\nEmits an **object** representation of specified **member** of the supplied **object**.\n\n##Inputs\n###object\nInput **object**.\n\n###member\nName of the **member** to be converted.\n\n##Outputs\n###object\nThe **object** representation of the specified **member**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/member_to_string_modulator.md",
    "content": "#Object member to string\n\n##Description\nEmits a **string** representation of specified **member** of the supplied **object**.\n\n##Inputs\n###object\nInput **object**.\n\n###member\nName of the **member** to be converted.\n\n##Outputs\n###text\nThe **string** representation of the specified **member**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/member_to_typed_array_modulator.md",
    "content": "#Object member to typed array\n\n##Description\nEmits an typed **array** representation of a specified **member** of the supplied **object**.\n\n##Inputs\n###object\nInput **object**.\n\n###member\nName of the **member** to be converted.\n\n##Outputs\n###array\nThe typed **array** representation of the specified **member** of the **object**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/min_modulator.md",
    "content": "#Min\n\n##Description\nEmit the _lesser_ of the two input **values**.\n\n##Inputs\n###a\nThe first input **value**.\n\n###b\nThe second input **value**.\n\n##Outputs\n###min\nThe _lesser_ of the two supplied values.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/modulate_modulator.md",
    "content": "#Mod\n\n##Description\nModulate **value** so that the result will _never_ be negative or _less than_ or _equal_ to **limit**.\n\n##Inputs\n###value\nInput **value** to be modulated.\n\n###limit\nDivisor.\n\n##Outputs\n###result\nEmits the remainder of **value** divided by the **limit**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/module_player.md",
    "content": "#Module player\n\n##Description\nThis plugin plays a protracker-compatible .mod file using a library created by Firehawk/TDA (firehawk@haxor.fi).\n\n##Inputs\n###url\nThe **URL** of the module to play.\n\n###play\nSend **True** to start playback and **False** to stop.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/more_than_modulator.md",
    "content": "#More than\n\n##Description\nEmits **True** if the supplied **value** is _larger than_ the **reference** and **False** otherwise.\n\n##Inputs\n###value\nInput **value** to be compared.\n\n###reference\nReference to compare the **value** to.\n\n##Outputs\n###bool\nEmits **True** if **value** is _larger than_ the **reference**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/mouse_button_generator.md",
    "content": "#Mouse buttons\n\n##Description\nEmits the current mouse button state.\n\n##Inputs\n##Outputs\n###Left\n**True** if the left mouse button is pressed and **False** otherwise.\n\n###Middle\n**True** if the middle mouse button is pressed and **False** otherwise.\n\n###Right\n**True** if the right mouse button is pressed and **False** otherwise.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/mouse_position_generator.md",
    "content": "#Mouse position\n\n##Description\nEmits the current mouse position in clip space mapped to the canvas.\n\n##Inputs\n##Outputs\n###x\n**-1** at left edge of canvas and **1** at the right edge. Can be both smaller than **-1** and larger than **1** if the mouse is outside the canvas bounds.\n\n###y\n**-1** at top edge of canvas and **1** at the bottom edge. Can be both smaller than **-1** and larger than **1** if the mouse is outside the canvas bounds.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/mouse_wheel_generator.md",
    "content": "#Mouse wheel\n\n##Description\nEmits the current mouse wheel state.\n\n##Inputs\n##Outputs\n###delta\nThe **delta** mouse wheel movement.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/multiply_modulator.md",
    "content": "#Multiply number\n\n##Description\nMultiplies the two supplied **values** (**a** and **b**) and emits the result.<br><br>Keyboard shortcut&nbsp;&nbsp;&nbsp;<kbd>6</kbd>\n\n##Inputs\n###a\nThe first **operand**.\n\n###b\nThe second **operand**.\n\n##Outputs\n###result\nThe product of the two supplied **values**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/nand_modulator.md",
    "content": "#Nand\n\n##Description\nEmits **False** when both inputs are **True** and **False** otherwise.\n\n##Inputs\n###a\nThe first **operand** (**a**).\n\n###b\nThe second **operand** (**b**).\n\n##Outputs\n###bool\nEmits **False** if **a** and **b** are **True** and **False** otherwise.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/ne_modulator.md",
    "content": "#Not equal\n\n##Description\nEmits **True** if the supplied **value** is *not equal* to **reference** and **False** otherwise.\n\n##Inputs\n###value\nInput **value** to be compared.\n\n###reference\nReference to compare **value** to.\n\n##Outputs\n###bool\nEmits **True** if **value** is not equal to **reference**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/near_eq_modulator.md",
    "content": "#Nearly equal\n\n##Description\nEmits **True** if the difference between **value** and **reference** is *less than* or *equal* to **proximity**.\n\n##Inputs\n###value\nInput **value** to be compared.\n\n###proximity\nProximity **value** for comparison.\n\n###reference\nReference to compare **value** to.\n\n##Outputs\n###bool\nEmits **True** if the difference between **value** and **reference** is *less than* or *equal* to **proximity**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/negate_modulator.md",
    "content": "#Negate\n\n##Description\nEmits the sign inverted input **value**.\n\n##Inputs\n###value\nInput **value** to be negated.\n\n##Outputs\n###-value\nThe sign-inverted input **value**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/not_modulator.md",
    "content": "#Not\n\n##Description\nEmits **True** if the input is **False** and vice versa.\n\n##Inputs\n###bool\nInput **boolean** to be inverted. **True** becomes **False**, **False** becomes **True**.\n\n##Outputs\n###bool\nTruth-inverted input **value**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/object_add.md",
    "content": "#Object composition\n\n##Description\n**Object** composition.\n\n##Inputs\n###object\nOptional existing **object**.\n\n###key\nThe **key**.\n\n###value\nThe value: A **float**, **text** or **object**.\n\n##Outputs\n###object\nThe created **object**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/object_display.md",
    "content": "#Object\n\n##Description\nDisplays **Objects** and **Arrays**.\n\n##Inputs\n###object\nInput **object** to be analyzed.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/object_stringify.md",
    "content": "#Object to JSON\n\n##Description\nSerialize **object** to **JSON** (stringify)\n\n##Inputs\n###object\n**Object** to serialize.\n\n##Outputs\n###json\nThe serialized object as **JSON**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/on_three_object_gaze_clicked.md",
    "content": "#Experimental: Object Gaze Clicked\n\n##Description\nEmits an **impulse** or **continuous signal** when the selected object is gazed. The name in the pulldown refers to the name of the selected **Mesh** patch.\n\n##Inputs\n##Outputs\n###trigger\nThe **impulse** or **continuous signal** is sent forwards to the graph through this output.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/on_three_object_gaze_in.md",
    "content": "#Experimental: Object Gaze In\n\n##Description\nEmits an **impulse** or **continuous signal** when the selected object is gazed at. The name in the pulldown refers to the name of the selected **Mesh** patch.\n\n##Inputs\n##Outputs\n###trigger\nThe impulse or continuous signal is sent forwards to the graph through this output.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/on_three_object_gaze_out.md",
    "content": "#Experimental: Object Gaze Out\n\n##Description\nEmits an **impulse** or **continuous signal** when the viewer's gaze _leaves_ the selected object. The name in the pulldown refers to the name of the selected **Mesh** patch.\n\n##Inputs\n##Outputs\n###trigger\nThe impulse or continuous signal is sent forwards to the graph through this output.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/on_three_object_raydown.md",
    "content": "#Ray Down on Object\n\n##Description\nEmits an **impulse** or **continuous signal** when the ray is down on the selected object (the button is pressed). The name in the pulldown refers to the name of the selected **Mesh** patch.\n\n##Inputs\n##Outputs\n###trigger\nThe **impulse** or **continuous signal** is sent forwards to the graph through this output.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/on_three_object_rayout.md",
    "content": "#Ray Out of Object\n\n##Description\nEmits an **impulse** or **continuous signal** when the viewer's ray leaves the selected **object**. The name in the pulldown refers to the name of the selected **Mesh** patch.\n\n##Inputs\n##Outputs\n###trigger\nThe **impulse** or **continuous signal** is sent forwards to the graph through this output.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/on_three_object_rayover.md",
    "content": "#Ray Over Object\n\n##Description\nEmits an **impulse** or **continuous signal** when the viewer's ray is over the object. The name in the pulldown refers to the name of the selected **Mesh** patch.\n\n##Inputs\n##Outputs\n###trigger\nThe **impulse** or **continuous signal** is sent forwards to the graph through this output.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/on_three_object_rayup.md",
    "content": "#Ray Up from Object\n\n##Description\nEmits an **impulse** or **continuous signal** when the input ray is up on the selected object. The name in the pulldown refers to the name of the selected **Mesh** patch.\n\n##Inputs\n##Outputs\n###trigger\nThe **impulse** or **continuous signal** is sent forwards to the graph through this output.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/open_url_on_trigger.md",
    "content": "#Navigate to URL on Trigger\n\n##Description\nNavigates to the URL (away from experience) on **trigger**.\n\n##Inputs\n###trigger\nWhen **trigger** is **True**, the **URL** will be loaded in the browser.\n\n###url\nAbsolute **URL** to navigate to, eg. http://patches.vizor.io/\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/or_modulator.md",
    "content": "#Or\n\n##Description\nEmits **True** if either input value is **True** and **False** otherwise.\n\n##Inputs\n###a\nThe first **operand**.\n\n###b\nThe second **operand**.\n\n##Outputs\n###bool\nEmits **True** if **first** _or_ **second** are **True** and **False** otherwise.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/output_proxy.md",
    "content": "#Output proxy\n\n##Description\nCreate a new type-less slot to route data out of the current graph to its parent. When connected to a slot, it will assume its type until disconnected. Renaming this plugin will rename the corresponding parent slot.<br><br>Keyboard shortcut&nbsp;&nbsp;&nbsp;<kbd>0</kbd>\n\n##Inputs\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/parse_json_modulator.md",
    "content": "#Parse JSON\n\n##Description\nEmits an **object** representation of the supplied **JSON** string.\n\n##Inputs\n###json\nInput **string** to be parsed.\n\n##Outputs\n###object\nThe **object** representation of the supplied **JSON**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/photosphere_orientation_reader.md",
    "content": "#Photosphere Orientation\n\n##Description\n\n\n##Inputs\n###texture\n\n\n##Outputs\n###rotation\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/pi_generator.md",
    "content": "#Pi\n\n##Description\nEmits the constant **∏** (**pi**).\n\n##Inputs\n##Outputs\n###pi\nThe constant **∏** (**pi**).\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/plot_display.md",
    "content": "#Plot\n\n##Description\nDisplays the supplied **coordinate** on a **XY** plot.\n\n##Inputs\n###x\nThe location on the **X** axis.\n\n###y\nThe location on the **Y** axis.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/radial_point_geometry.md",
    "content": "#Radial Point Geometry\n\n##Description\n\n\n##Inputs\n###point count\n\n\n###sectors\n\n\n###depth\n\n\n###distance\n\n\n###spacing\n\n\n###layer spacing\n\n\n###layerRotation\n\n\n##Outputs\n###geometry\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/random_float_generator.md",
    "content": "#Random\n\n##Description\nEmits a random float **constant** within a specified **range**.\n\n##Inputs\n###min\n**Minimum** output value.\n\n###max\n**Maximum** output value.\n\n##Outputs\n###value\nRandom output value between **min** and **max**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/rotation_from_direction.md",
    "content": "#Rotation from Direction\n\n##Description\nCreates a **rotation vector** (**X**, **Y**, **Z**) rotation from a given **direction**.\nThe resulting **rotation vector** will rotate any object to _face the original \ndirection_.\n\n##Inputs\n###direction\nSupply a **direction** as a vector in order to create a **rotation vector** on the output. \n\n##Outputs\n###rotation\nThis rotation **vector** will rotate any object to face the original direction.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/round_modulator.md",
    "content": "#Round\n\n##Description\nEmits the input **value** rounded to the nearest **integer**.\n\n##Inputs\n###value\nThe input **value** to be rounded.\n\n##Outputs\n###result\nThe rounded **integer**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/runtime_event_read.md",
    "content": "#On Runtime Event\n\n##Description\nEvent listener. Listens to a specific eventName and outputs a Trigger (**True**/**False**) and incoming **data**.\n\n##Inputs\n###eventName\nName of the **event** to be listened to.\n\n##Outputs\n###triggered\nOutputs a boolean (**True**/**False**) when triggered.\n\n###data\nOutput of **data** heard from the **eventName**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/runtime_event_write.md",
    "content": "#Emit Single Runtime Event\n\n##Description\nEmit a single runtime **event** when the data-input changes. Behaviour can be controlled by the emit-input. When emit receives a **True**, any data not yet sent will be emitted.\n\n##Inputs\n###emit\nDisable / enable emitting by sending a **True**/**False**.\n\n###eventName\nThe **eventName** to be sent to.\n\n###data\n**Data** to be sent packaged in with the **eventName**.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/runtime_event_write_continuous.md",
    "content": "#Emit Continuous Runtime Events\n\n##Description\nEmit one **event** on every frame for as long as the emit-input remains **True**.\n\n##Inputs\n###emit\nDisable / enable emitting by sending a **True**/**False**.\n\n###eventName\nThe **eventName** to be sent to.\n\n###data\nThe **data** packaged in with the **eventName**.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/sample_and_hold_modulator.md",
    "content": "#Sample and hold\n\n##Description\nEmits the input **value** when **sample** is **True** and emits the last sampled value if **sample** is **False**. Emits **0** by default.\n\n##Inputs\n###sample\nSending a **True** to this slot updates the output **value** to match the input **value**, **False** inhibits input sampling.\n\n###value\nThe input **value**.\n\n##Outputs\n###value\nThe output **value**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/sawtooth_modulator.md",
    "content": "#Sawtooth\n\n##Description\nSawtooth oscillator. A **time** value incrementing by one unit per second will yield a 1Hz output signal.\n\n##Inputs\n###time\n**Time** in seconds.\n\n##Outputs\n###value\nEmits ((**time** % 1) - 0.5) * 2.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/scene_lighting.md",
    "content": "#Experimental: Scene Lighting\n\n##Description\nScene Lighting\n\n##Inputs\n###intensity\n\n\n###directional light color\n\n\n###sky light color\n\n\n###ground light color\n\n\n###shadow radius\n\n\n###shadow darkness\n\n\n###position\n\n\n###rotation\n\n\n###scale\n\n\n###visible\n\n\n###castShadow\n\n\n###receiveShadow\n\n\n###name\n\n\n###stereo view\nAffects how this object is rendered in stereo.\nStereo View:\n**0** both eyes\n**1** left eye only\n**2** right eye only\n**3** mono view only\n\n###lock transform\nIf enabled, this object's transform is locked and can't be adjusted in the 3d editor.\n\n##Outputs\n###object3d\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/sin_modulator.md",
    "content": "#Sin\n\n##Description\nSin(x).\n\n##Inputs\n###value\nInput **value**.\n\n##Outputs\n###result\nSin(**value**).\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/sine_modulator.md",
    "content": "#Sine\n\n##Description\nSine oscillator. A **time** value incrementing by one per second will yield a 1Hz output signal.\n\n##Inputs\n###time\n**Time** in seconds.\n\n##Outputs\n###value\nEmits sin(**time** * 2pi).\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/slider_float_generator.md",
    "content": "#Slider\n\n##Description\nEmits a user controllable float **value** between two specified **values**.<br><br>Keyboard shortcut&nbsp;&nbsp;&nbsp;<kbd>3</kbd>\n\n##Inputs\n##Outputs\n###value\nEmits the current **value** when the slider is adjusted.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/sqrt_modulator.md",
    "content": "#Sqrt\n\n##Description\nSqrt(x).\n\n##Inputs\n###value\nInput **value**.\n\n##Outputs\n###result\nSqrt(**value**).\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/square_modulator.md",
    "content": "#Square\n\n##Description\nSquare oscillator. A **time** value incrementing by one unit per second yields a 1Hz output signal.\n\n##Inputs\n###time\n**Time** in seconds.\n\n##Outputs\n###value\nEmits **1** if **time** % 1 is less than 0.5 and **-1** otherwise.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/stereo_cube_map.md",
    "content": "#Deprecated: Stereo Cubemap\n\n##Description\n**Stereo Cube Map** (Old and deprecated)\n\n##Inputs\n###url\nLoad a **Stereo Cube Map** from an **URL**.\n\n##Outputs\n###cube\nOutputs a **Stereo Cube Map**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/stop_emitter.md",
    "content": "#Stop playback\n\n##Description\nStops graph playback when a **True** value is received by the **bool** slot.\n\n##Inputs\n###bool\nWhen **True** is received by this slot, graph playback is stopped.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/streamr_client.md",
    "content": "#Streamr Client\n\n##Description\nClient for consuming Streamr.com streams.\n\n##Inputs\n###streamId\nThe **ID** of the Streamr stream to consume.\n\n##Outputs\n###trigger\nTriggers (becomes **True**) for one frame any time a message is received.\n\n###message\nA parsed message entry from the Streamr stream.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/string_concatenate_modulator.md",
    "content": "#Concatenate\n\n##Description\nConcatenates the two supplied **strings**.\n\n##Inputs\n###a\nThe first **string**.\n\n###b\nThe second **string**.\n\n##Outputs\n###result\nThe **string** representing the combination of **first** + **second** (**a** + **b**).\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/subtract_modulator.md",
    "content": "#Subtract\n\n##Description\nSubtract the second **value** from the first and emit the result.\n\n##Inputs\n###a\nThe first **operand**.\n\n###b\nThe second **operand**.\n\n##Outputs\n###result\nThe result of **first** - **second** (**a** - **b**).\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/switch_modulator.md",
    "content": "#Switch\n\n##Description\nGiven an **index**, emit the supplied **True** value on the output slot _matching_ the **index** and the **False** value on all others. If the **index** is invalid, the **False** value is emitted on all outputs.\n\n##Inputs\n###index\nThe selected **index**.\n\n###true\nThe **value** to emit on the output slot _matching_ the current **index**.\n\n###false\nThe **value** to emit on any slot _not matching_ the current **index**.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/tan_modulator.md",
    "content": "#Tan\n\n##Description\nTan(x).\n\n##Inputs\n###value\nInput **value**.\n\n##Outputs\n###result\ntan(**value**).\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/text_display.md",
    "content": "#Text\n\n##Description\nDisplay the supplied **text** value on the plugin surface.\n\n##Inputs\n###text\nInput **text** to be displayed.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/text_editor_generator.md",
    "content": "#Code Editor\n\n##Description\nEdit a block of **text**.\n\n##Inputs\n##Outputs\n###text\nThe currently entered **text**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/texture_from_text_generator.md",
    "content": "#From text\n\n##Description\nCreate a **texture** of a (2^n closest to the) given size filled with a rendered version of the supplied **text**.\n\n##Inputs\n###text\nThe **text** to be rendered to **texture**.\n\n###width\nThe **width** of the output **texture**. Will be rounded to nearest 2^n.\n\n###height\nThe **height** of the output **texture**. Will be rounded to nearest 2^n.\n\n###x\nThe **X** position of the **text**.\n\n###y\nThe **Y** position of the **text**.\n\n###font style\nThe desired **font style** (CSS standard).\n\n###fill style\nThe desired **fill style** (CSS standard).\n\n###stroke style\nThe desired **stroke style** (CSS standard).\n\n###stroke width\nThe desired **stroke width** in pixels.\n\n###align\nText **alignment**.\n\n###baseline\nText **baseline**.\n\n###line height\n**Line height** scalar.\n\n##Outputs\n###texture\nOutput **texture** containing the rendered **text**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_ambient_light.md",
    "content": "#Deprecated: Ambient Light\n\n##Description\nTHREE.js Ambient Light\n\n##Inputs\n###color\n\n\n##Outputs\n###object3d\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_clickable_object.md",
    "content": "#Clickable Object\n\n##Description\nClickable **object**. When gaze clicking on this **object**, _objectClicked_ events are sent. _objectClicked_ events can be received by using the _On Runtime Event_ plugin.\n\n##Inputs\n###object3d\n\n\n###eventName\n\n\n##Outputs\n###object3d\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_cube_material.md",
    "content": "#Cubemap Material\n\n##Description\nCube Shader Material.\n\n##Inputs\n###cube texture\nCube Texture.\n\n###depthWrite\nEnable / disable writing to the depth buffer by sending a **True** or a **False**.\n\n###opacity\n**Float** in the range of **0.0** - **1.0** indicating how transparent the material is. A value of **0.0** indicates fully transparent, **1.0** is fully opaque. If transparent is not set to **True** for the material, the material will remain fully opaque and this value will only affect its color.\n\n###transparent\nDefines whether this material is transparent. When set to **True**, the extent to which the material is transparent is controlled by the opacity setting.\n\n###blending\nWhich blending to use when displaying objects with this material. Default is Normal.\n**0** = No\n**1** = Normal\n**2** = Additive\n**3** = Subtractive\n**4** = Multiply\n**5** = Custom\n\n###side\nDefines which of the face sides will be rendered - front, back or both.\n**0** = Front\n**1** = Back\n**2** = Double Sided\n\n##Outputs\n###material\nCube Shader Material.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_directional_light.md",
    "content": "#Directional Light\n\n##Description\nTHREE.js Directional Light\n\n##Inputs\n###intensity\n\n\n###color\n\n\n###shadow radius\n\n\n###shadow darkness\n\n\n###position\n\n\n###rotation\n\n\n###scale\n\n\n###visible\n\n\n###castShadow\n\n\n###receiveShadow\n\n\n###name\n\n\n###stereo view\nAffects how this object is rendered in stereo. \nStereo View\n**0** both eyes\n**1** left eye only\n**2** right eye only\n**3** mono view only\n\n###lock transform\nIf enabled, this object's transform is locked and can't be adjusted in the 3d editor.\n\n##Outputs\n###object3d\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_environment_settings.md",
    "content": "#Environment Settings\n\n##Description\nEnvironment Settings Description\n\n##Inputs\n###fog color\n\n\n###fog near\n\n\n###fog far\n\n\n##Outputs\n###environment\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_gaze_clicker.md",
    "content": "#Gaze Clicker\n\n##Description\nGaze Clicker.\n\n##Inputs\n###camera\n\n\n###scene\n\n\n###delay\n\n\n###show icon\n\n\n###eye distance\nEye Distance for Gaze Clicker icon in VR.\n\n##Outputs\n###scene\n\n\n###object\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_geometry_box.md",
    "content": "#Box\n\n##Description\nTHREE.js Box Geometry\n\n##Inputs\n###subdivisions\n\n\n##Outputs\n###geometry\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_geometry_circle.md",
    "content": "#Circle\n\n##Description\nTHREE.js Circle Geometry\n\n##Inputs\n###radius\n\n\n###segments\n\n\n###thetaStart\nVertical starting angle.\n\n###thetaLength\nVertical sweep angle size.\n\n##Outputs\n###geometry\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_geometry_cylinder.md",
    "content": "#Cylinder\n\n##Description\nTHREE.js Cylinder Geometry\n\n##Inputs\n###radiusTop\n\n\n###radiusBottom\n\n\n###height\n\n\n###radiusSegments\n\n\n###heightSegments\n\n\n###openEnded\n\n\n###thetaStart\nVertical starting angle.\n\n###thetaLength\nVertical sweep angle size.\n\n##Outputs\n###geometry\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_geometry_dodecahedron.md",
    "content": "#Dodecahedron\n\n##Description\nTHREE.js Dodecahedron Geometry\n\n##Inputs\n###radius\n\n\n###detail\n\n\n##Outputs\n###geometry\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_geometry_plane.md",
    "content": "#Plane\n\n##Description\nTHREE.js Plane Geometry\n\n##Inputs\n###width\n\n\n###height\n\n\n###widthSegments\nNumber of horizontal (**width**) segments.\n\n###heightSegments\nNumber of vertical (**height**) segments.\n\n##Outputs\n###geometry\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_geometry_ring.md",
    "content": "#Ring\n\n##Description\nTHREE.js Ring Geometry\n\n##Inputs\n###innerRadius\n\n\n###outerRadius\n\n\n###thetaSegments\n\n\n###phiSegments\n\n\n###thetaStart\n\n\n###thetaLength\n\n\n##Outputs\n###geometry\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_geometry_sphere.md",
    "content": "#Sphere\n\n##Description\nTHREE.js Sphere Geometry\n\n##Inputs\n###radius\n\n\n###widthSegments\nNumber of horizontal (**width**) segments.\n\n###heightSegments\nNumber of vertical (**height**) segments.\n\n###phiStart\nHorizontal starting angle.\n\n###phiLength\nHorizontal sweep angle size.\n\n###thetaStart\nVertical starting angle.\n\n###thetaLength\nVertical sweep angle size.\n\n##Outputs\n###geometry\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_geometry_torus.md",
    "content": "#Torus\n\n##Description\nTHREE.js Torus Geometry\n\n##Inputs\n###radius\n\n\n###tube\n\n\n###radialSegments\n\n\n###tubularSegments\n\n\n###arc\n\n\n##Outputs\n###geometry\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_group.md",
    "content": "#3D Object Group\n\n##Description\nGroup several object3ds together so that they can be manipulated as one.\n\n##Inputs\n###position\n\n\n###rotation\n\n\n###scale\n\n\n###visible\n\n\n###castShadow\n\n\n###receiveShadow\n\n\n###name\n\n\n###stereo view\nAffects how this object is rendered in stereo.\nStereo View\n**0** both eyes\n**1** left eye only\n**2** right eye only\n**3** mono view only\n\n###lock transform\nIf enabled, this object's transform is locked and can't be adjusted in the 3d editor.\n\n##Outputs\n###object3d\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_hemisphere_light.md",
    "content": "#Hemisphere Light\n\n##Description\nTHREE.js Hemisphere Light\n\n##Inputs\n###intensity\n\n\n###color\n\n\n###groundColor\n\n\n###position\n\n\n###rotation\n\n\n###scale\n\n\n###visible\n\n\n###castShadow\n\n\n###receiveShadow\n\n\n###name\n\n\n###stereo view\nAffects how this object is rendered in stereo.\nStereo View\n**0** both eyes\n**1** left eye only\n**2** right eye only\n**3** mono view only\n\n###lock transform\nIf enabled, this object's transform is locked and can't be adjusted in the 3d editor.\n\n##Outputs\n###object3d\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_line_material.md",
    "content": "#Line Material\n\n##Description\nTHREE.js Line Material\n\n##Inputs\n###color\n\n\n###linewidth\n\n\n###fog\nDefine whether the material color is affected by global fog settings.\n\n###opacity\nFloat in the range of **0.0** - **1.0** indicating how transparent the material is. A value of **0.0** indicates fully transparent, **1.0** is fully opaque. If transparent is not set to **True** for the material, the material will remain fully opaque and this value will only affect its color.\n\n###transparent\nDefines whether this material is transparent. When set to **True**, the extent to which the material is transparent is controlled by setting opacity.\n\n###blending\nWhich blending to use when displaying objects with this material. Default is Normal.\n**0** = No\n**1** = Normal\n**2** = Additive\n**3** = Subtractive\n**4** = Multiply\n**5** = Custom\n\n###side\nDefines which of the face sides will be rendered - front, back or both.\n**0** = Front\n**1** = Back\n**2** = Double Sided\n\n##Outputs\n###material\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_line_segments.md",
    "content": "#Line Segments\n\n##Description\nTHREE.js Line Segments\n\n##Inputs\n###geometry\n\n\n###material\n\n\n###position\n\n\n###rotation\n\n\n###scale\n\n\n###visible\n\n\n###castShadow\n\n\n###receiveShadow\n\n\n###name\n\n\n###stereo view\nAffects how this object is rendered in stereo. \nStereo View\n**0** both eyes\n**1** left eye only\n**2** right eye only\n**3** mono view only\n\n###lock transform\nIf enabled, this object's transform is locked and can't be adjusted in the 3d editor.\n\n##Outputs\n###object3d\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_loader_model.md",
    "content": "#3D Geometry Loader\n\n##Description\nTHREE.js OBJ loader\n\n##Inputs\n##Outputs\n###geometry\n\n\n###materials\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_loader_scene.md",
    "content": "#3D Model Loader\n\n##Description\n3D Object/Scene loader. Loads .obj and THREE.js .json object hierarchies.\n\n##Inputs\n###position\n\n\n###rotation\n\n\n###scale\n\n\n###visible\n\n\n###castShadow\n\n\n###receiveShadow\n\n\n###name\n\n\n###stereo view\nAffects how this object is rendered in stereo. \nStereo View\n**0** both eyes\n**1** left eye only\n**2** right eye only\n**3** mono view only\n\n###lock transform\nIf enabled, this object's transform is locked and can't be adjusted in the 3d editor.\n\n##Outputs\n###object3d\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_material.md",
    "content": "#Basic Material\n\n##Description\nTHREE.js Mesh Basic Material\n\n##Inputs\n###texture\n\n\n###color\n\n\n###wireframe\n\n\n###fog\nDefine whether the material color is affected by global fog settings.\n\n###shading\nDefine shading type.\n**0** = No Shading\n**1** = Flat Shading\n**2** = Smooth Shading.\n\n###opacity\nFloat in the range of **0.0** to **1.0**, indicating how transparent the material is. A value of **0.0** indicates fully transparent, **1.0** is fully opaque. If transparent is not set to **True** for the material, the material will remain fully opaque and this value will only affect its color.\n\n###transparent\nDefines whether this material is transparent. When set to **True**, the extent to which the material is transparent is controlled by setting **opacity**.\n\n###blending\nWhich blending to use when displaying objects with this material. Default is **Normal** (**1**).<br>\n**0** = No\n**1** = Normal\n**2** = Additive\n**3** = Subtractive\n**4** = Multiply\n**5** = Custom\n\n###side\nDefines which of the face sides will be rendered - front, back or both.<br>\n**0** = Front\n**1** = Back\n**2** = Double Sided\n\n##Outputs\n###material\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_material_depth.md",
    "content": "#Depth Material\n\n##Description\nTHREE.js Mesh Depth Material\n\n##Inputs\n###wireframe\n\n\n###opacity\nFloat in the range of **0.0** to **1.0**, indicating how transparent the material is. A value of **0.0** indicates fully transparent, **1.0** is fully opaque. If transparent is not set to **True** for the material, the material will remain fully opaque and this value will only affect its color.\n\n###transparent\nDefines whether this material is transparent. When set to **True**, the extent to which the material is transparent is controlled by setting **opacity**.\n\n###blending\nWhich blending to use when displaying objects with this material. Default is **Normal** (**1**).<br>\n**0** = No\n**1** = Normal\n**2** = Additive\n**3** = Subtractive\n**4** = Multiply\n**5** = Custom\n\n###side\nDefines which of the face sides will be rendered - front, back or both.<br>\n**0** = Front\n**1** = Back\n**2** = Double Sided\n\n##Outputs\n###material\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_material_extractor.md",
    "content": "#Material Extractor\n\n##Description\nTHREE.js Material Extractor\n\n##Inputs\n###material\n\n\n##Outputs\n###texture\n\n\n###lightMap\n\n\n###bumpMap\n\n\n###normalMap\n\n\n###specularMap\n\n\n###displacementMap\n\n\n###alphaMap\n\n\n###color\n\n\n###wireframe\n\n\n###fog\n\n\n###shading\n\n\n###opacity\n\n\n###transparent\n\n\n###blending\n\n\n###side\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_material_lambert.md",
    "content": "#Lambert Material\n\n##Description\nTHREE.js Lambert Material\n\n##Inputs\n###texture\n\n\n###specularMap\n\n\n###alphaMap\n\n\n###color\n\n\n###wireframe\n\n\n###fog\nDefine whether the material color is affected by global fog settings.\n\n###shading\nDefine shading type.\n**0** = No Shading\n**1** = Flat Shading\n**2** = Smooth Shading.\n\n###opacity\nFloat in the range of **0.0** to **1.0**, indicating how transparent the material is. A value of **0.0** indicates fully transparent, **1.0** is fully opaque. If transparent is not set to **True** for the material, the material will remain fully opaque and this value will only affect its color.\n\n###transparent\nDefines whether this material is transparent. When set to **True**, the extent to which the material is transparent is controlled by setting **opacity**.\n\n###blending\nWhich blending to use when displaying objects with this material. Default is **Normal** (**1**).<br>\n**0** = No\n**1** = Normal\n**2** = Additive\n**3** = Subtractive\n**4** = Multiply\n**5** = Custom\n\n###side\nDefines which of the face sides will be rendered - front, back or both.<br>\n**0** = Front\n**1** = Back\n**2** = Double Sided\n\n\n##Outputs\n###material\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_material_modifier.md",
    "content": "#Material Modifier\n\n##Description\n\n\n##Inputs\n###material\n\n\n##Outputs\n###material\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_material_phong.md",
    "content": "#Phong Material\n\n##Description\nTHREE.js Phong Material\n\n##Inputs\n###texture\n\n\n###lightMap\n\n\n###bumpMap\n\n\n###normalMap\n\n\n###specularMap\n\n\n###displacementMap\n\n\n###alphaMap\n\n\n###color\n\n\n###wireframe\n\n\n###fog\nDefine whether the material color is affected by global fog settings.\n\n###shading\nDefine shading type. \n**0** = No Shading\n**1** = Flat Shading\n**2** = Smooth Shading.\n\n###opacity\nFloat in the range of **0.0** to **1.0**, indicating how transparent the material is. A value of **0.0** indicates fully transparent, **1.0** is fully opaque. If transparent is not set to **True** for the material, the material will remain fully opaque and this value will only affect its color.\n\n###transparent\nDefines whether this material is transparent. When set to **True**, the extent to which the material is transparent is controlled by setting **opacity**.\n\n###blending\nWhich blending to use when displaying objects with this material. Default is **Normal** (**1**).<br>\n**0** = No\n**1** = Normal\n**2** = Additive\n**3** = Subtractive\n**4** = Multiply\n**5** = Custom\n\n###side\nDefines which of the face sides will be rendered - front, back or both.<br>\n**0** = Front\n**1** = Back\n**2** = Double Sided\n\n###emissiveMap\n\n\n###emissive\n\n\n###specular\n\n\n###shininess\n\n\n###metal\n\n\n###lightMapIntensity\n\n\n###normalScale\n\n\n###bumpScale\n\n\n###displacementScale\n\n\n###displacementBias\n\n\n###reflectivity\n\n\n###refractionRatio\n\n\n###envMap\n\n\n##Outputs\n###material\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_material_shader.md",
    "content": "#Shader\n\n##Description\nShader Material\n\n##Inputs\n###depthTest\n\n\n###depthWrite\n\n\n###opacity\nFloat in the range of **0.0** to **1.0**, indicating how transparent the material is. A value of **0.0** indicates fully transparent, **1.0** is fully opaque. If transparent is not set to **True** for the material, the material will remain fully opaque and this value will only affect its color.\n\n###transparent\nDefines whether this material is transparent. When set to **True**, the extent to which the material is transparent is controlled by setting **opacity**.\n\n###blending\nWhich blending to use when displaying objects with this material. Default is **Normal** (**1**).<br>\n**0** = No\n**1** = Normal\n**2** = Additive\n**3** = Subtractive\n**4** = Multiply\n**5** = Custom\n\n###side\nDefines which of the face sides will be rendered - front, back or both.<br>\n**0** = Front\n**1** = Back\n**2** = Double Sided\n\n##Outputs\n###material\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_material_standard.md",
    "content": "#Standard Material\n\n##Description\nTHREE.js Standard Material\n\n##Inputs\n###color\n\n\n###roughness\n\n\n###metalness\n\n\n###texture\n\n\n###lightMap\n\n\n###lightMapIntensity\n\n\n###aoMap\n\n\n###aoIntensity\n\n\n###emissiveMap\n\n\n###emissive\n\n\n###emissiveIntensity\n\n\n###bumpMap\n\n\n###bumpScale\n\n\n###normalMap\n\n\n###normalScale\n\n\n###displacementMap\n\n\n###displacementScale\n\n\n###displacementBias\n\n\n###roughnessMap\n\n\n###metalnessMap\n\n\n###alphaMap\n\n\n###envMap\n\n\n###envMapIntensity\n\n\n###refractionRatio\n\n\n###wireframe\n\n\n###fog\nDefine whether the material color is affected by global fog settings.\n\n###shading\nDefine shading type.\n**0** = No Shading\n**1** = Flat Shading\n**2** = Smooth Shading.\n\n###opacity\nFloat in the range of **0.0** to **1.0**, indicating how transparent the material is. A value of **0.0** indicates fully transparent, **1.0** is fully opaque. If transparent is not set to **True** for the material, the material will remain fully opaque and this value will only affect its color.\n\n###transparent\nDefines whether this material is transparent. When set to **True**, the extent to which the material is transparent is controlled by setting **opacity**.\n\n###blending\nWhich blending to use when displaying objects with this material. Default is **Normal** (**1**).<br>\n**0** = No\n**1** = Normal\n**2** = Additive\n**3** = Subtractive\n**4** = Multiply\n**5** = Custom\n\n###side\nDefines which of the face sides will be rendered - front, back or both.<br>\n**0** = Front\n**1** = Back\n**2** = Double Sided\n\n##Outputs\n###material\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_mesh.md",
    "content": "#Mesh\n\n##Description\nTHREE.js Mesh\n\n##Inputs\n###object3d\nOptional existing mesh to modify\n\n###animation speed\nAnimation speed multiplier\n\n###geometry\n\n\n###material\n\n\n###position\n\n\n###rotation\n\n\n###scale\n\n\n###visible\n\n\n###castShadow\n\n\n###receiveShadow\n\n\n###name\n\n\n###stereo view\nAffects how this object is rendered in stereo. \nStereo View\n**0** both eyes\n**1** left eye only\n**2** right eye only\n**3** mono view only\n\n###lock transform\nIf enabled, this object's transform is locked and can't be adjusted in the 3d editor.\n\n##Outputs\n###object3d\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_meshline_material.md",
    "content": "#Vector Line Material\n\n##Description\nVector Line Material.\n\n##Inputs\n###color\n**Color** of the material.\n\n###sizeAttenuation\nSpecify whether line width will get smaller with the distance.\n\n###lineWidth\n**Width** of the resulting vector lines.\n\n###near\n**Near plane** distance.\n\n###far\n**Far plane** distance.\n\n###wireframe\nRender vector lines as **wireframe**.\n\n###fog\nDefine whether the material color is affected by **global fog settings**.\n\n###opacity\nFloat in the range of **0.0** to **1.0**, indicating how transparent the material is. A value of **0.0** indicates fully transparent, **1.0** is fully opaque. If transparent is not set to **True** for the material, the material will remain fully opaque and this value will only affect its color.\n\n###transparent\nDefines whether this material is transparent. When set to **True**, the extent to which the material is transparent is controlled by setting **opacity**.\n\n###blending\nWhich blending to use when displaying objects with this material. Default is **Normal** (**1**).<br>\n**0** = No\n**1** = Normal\n**2** = Additive\n**3** = Subtractive\n**4** = Multiply\n**5** = Custom\n\n###side\nDefines which of the face sides will be rendered - front, back or both.<br>\n**0** = Front\n**1** = Back\n**2** = Double Sided\n\n##Outputs\n###material\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_meshline_mesh.md",
    "content": "#Vector Line Object3d\n\n##Description\nVector Line Object3d\n\n##Inputs\n###geometry\n\n\n###material\nTakes **Vector Line Material** as **input**.\n\n###position\nTakes **Vector Line Position** as **input**.\n\n###rotation\nTakes **Vector Line Rotation** as **input**.\n\n###scale\nTakes **Vector Line Scale** as **input**.\n\n###visible\n\n\n###castShadow\n\n\n###receiveShadow\n\n\n###name\n\n\n###stereo view\nAffects how this object is rendered in stereo  \nStereo View:<br>\n**0**: both eyes\n**1**: left eye only\n**2**: right eye only\n**3**: mono view only\n\n###lock transform\nIf enabled, this object's transform is locked and can't be adjusted with the 3d editor.\n\n##Outputs\n###object3d\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_object3d_attribute_extractor.md",
    "content": "#Mesh attributes\n\n##Description\nExtract the **position**, **rotation** and **scale** from a **Mesh**.\n\n##Inputs\n###object3d\n**Mesh** to extract the attributes from.\n\n##Outputs\n###position\nExtracted **position** from the **Mesh**.\n\n###rotation\nExtracted **rotation** from the **Mesh**.\n\n###scale\nExtracted **scale** from the **Mesh**.\n\n###name\nExtracted **name** from the **Mesh**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_object3d_bbox_extractor.md",
    "content": "#Bounding Box Extractor\n\n##Description\nExtract bounding box from the **Mesh**.\n\n##Inputs\n###object3d\n**Mesh** to extract bounding box from.\n\n##Outputs\n###min\n\n\n###max\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_orbit_camera.md",
    "content": "#Orbit Camera\n\n##Description\nTHREE.js Orbit Camera\n\n##Inputs\n###position\n\n\n###rotation\n\n\n###offset\n\n\n###fov\n\n\n###aspectRatio\n\n\n###near\n\n\n###far\n\n\n##Outputs\n###camera\n\n\n###position\n\n\n###rotation\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_particle_emitter.md",
    "content": "#Particle Emitter\n\n##Description\nParticle emitter generating a point cloud that can be used in a point cloud.\n\n##Inputs\n###particle count\n\n\n###spawn rate\nThe amount of particles to spawn per second.\n\n###random seed\nSeed to initialise the random number generator with.\n\n###direction\nThe **direction** of the spawned particles.\n\n###speed\n**Speed** along direction.\n\n###spread\n**Spread** around direction.\n\n###lifetime\nParticle **lifetime**.\n\n###gravity\n**Gravity** vector.\n\n###noise\nAmount of **noise** to apply to movement.\n\n###geometry\nEmit from this **geometry**.\n\n##Outputs\n###geometry\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_perspective_camera.md",
    "content": "#Perspective Camera\n\n##Description\nTHREE.js Perspective Camera\n\n##Inputs\n###fov\n\n\n###aspectRatio\n\n\n###near\n\n\n###far\n\n\n###position\n\n\n###rotation\n\n\n###scale\n\n\n###visible\n\n\n###castShadow\n\n\n###receiveShadow\n\n\n###name\n\n\n###stereo view\nAffects how this object is rendered in stereo. \nStereo View\n**0** both eyes\n**1** left eye only\n**2** right eye only\n**3** mono view only\n\n###lock transform\nIf enabled, this object's transform is locked and can't be adjusted in the 3d editor.\n\n##Outputs\n###camera\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_point_cloud_material.md",
    "content": "#Point Cloud Material\n\n##Description\nTHREE.js Point Cloud Material\n\n##Inputs\n###texture\n\n\n###color\n\n\n###size\n\n\n###sizeAttenuation\n\n\n###fog\nDefine whether the material color is affected by global fog settings.\n\n###depthTest\n\n\n###opacity\nFloat in the range of **0.0** to **1.0**, indicating how transparent the material is. A value of **0.0** indicates fully transparent, **1.0** is fully opaque. If transparent is not set to **True** for the material, the material will remain fully opaque and this value will only affect its color.\n\n###transparent\nDefines whether this material is transparent. When set to **True**, the extent to which the material is transparent is controlled by setting **opacity**.\n\n###blending\nWhich blending to use when displaying objects with this material. Default is **Normal** (**1**).<br>\n**0** = No\n**1** = Normal\n**2** = Additive\n**3** = Subtractive\n**4** = Multiply\n**5** = Custom\n\n###side\nDefines which of the face sides will be rendered - front, back or both.<br>\n**0** = Front\n**1** = Back\n**2** = Double Sided\n\n##Outputs\n###material\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_point_cloud_mesh.md",
    "content": "#Point Cloud Mesh\n\n##Description\nTHREE.js Point Cloud Mesh\n\n##Inputs\n###geometry\n\n\n###material\n\n\n###position\n\n\n###rotation\n\n\n###scale\n\n\n###visible\n\n\n###castShadow\n\n\n###receiveShadow\n\n\n###name\n\n\n###stereo view\nAffects how this object is rendered in stereo.\nStereo View:\n**0** both eyes\n**1** left eye only\n**2** right eye only\n**3** mono view only\n\n###lock transform\nIf enabled, this object's transform is locked and can't be adjusted in the 3d editor.\n\n##Outputs\n###object3d\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_point_light.md",
    "content": "#Point Light\n\n##Description\nTHREE.js Point Light\n\n##Inputs\n###intensity\n\n\n###distance\n\n\n###decay\n\n\n###color\n\n\n###position\n\n\n###rotation\n\n\n###scale\n\n\n###visible\n\n\n###castShadow\n\n\n###receiveShadow\n\n\n###name\n\n\n###stereo view\nAffects how this object is rendered in stereo.\nStereo View:\n**0** both eyes\n**1** left eye only\n**2** right eye only\n**3** mono view only\n\n###lock transform\nIf enabled, this object's transform is locked and can't be adjusted in the 3d editor.\n\n##Outputs\n###object3d\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_procedural_ground.md",
    "content": "#Procedural Ground\n\n##Description\nTHREE.js Procedural Ground\n\n##Inputs\n###x size\n\n\n###y size\n\n\n###z size\n\n\n###seed\n\n\n###noise factor\n\n\n###noise octaves\n\n\n###noise scale\n\n\n###ground height\n\n\n###rock height\n\n\n###position\n\n\n###rotation\n\n\n###scale\n\n\n###visible\n\n\n###castShadow\n\n\n###receiveShadow\n\n\n###name\n\n\n###stereo view\nAffects how this object is rendered in stereo.\nStereo View:\n**0** both eyes\n**1** left eye only\n**2** right eye only\n**3** mono view only\n\n###lock transform\nIf enabled, this object's transform is locked and can't be adjusted in the 3d editor.\n\n##Outputs\n###object3d\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_scene.md",
    "content": "#Scene\n\n##Description\nAnything connected here will appear in your Patches scene. Click the port and drag to disconnect or select the patch and hit delete.\n\n##Inputs\n###environment\n\n\n##Outputs\n###scene\nConnect this to the **Camera**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_screen_space_transform_extractor.md",
    "content": "#Screen Space Transform Extractor\n\n##Description\nExtract transformation from a **VR Camera** for orienting **objects** to screen space.\n\n##Inputs\n###camera\nConnect your **VR Camera** here in order to extract transformation data.\n\n##Outputs\n###position\nThe **position** extracted from the **VR Camera**.\n\n###rotation\nThe **rotation** extracted from the **VR Camera**.\n\n###scale\nThe **scale** extracted from the **VR Camera**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_spot_light.md",
    "content": "#Spot Light\n\n##Description\nTHREE.js Spot Light\n\n##Inputs\n###intensity\n\n\n###color\n\n\n###distance\n\n\n###angle\n\n\n###exponent\n\n\n###decay\n\n\n###position\n\n\n###rotation\n\n\n###scale\n\n\n###visible\n\n\n###castShadow\n\n\n###receiveShadow\n\n\n###name\n\n\n###stereo view\nAffects how this object is rendered in stereo. \nStereo View:\n**0** both eyes\n**1** left eye only\n**2** right eye only\n**3** mono view only\n\n###lock transform\nIf enabled, this object's transform is locked and can't be adjusted in the 3d editor.\n\n##Outputs\n###object3d\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_text_geometry.md",
    "content": "#Experimental: Text Geometry\n\n##Description\nGenerate text\n\n##Inputs\n###text\nInput **text** as **string**. Default: \"hello world\".\n\n###font\nSelect your desired font from the pulldown menu. Fonts available:\n**1** Source Sans\n**2** Source Sans Bold\n**3** Helvetiker\n**4** Helvetiker Bold\n\n###size\nInput **size** value as float. Default: **1**\n\n###segments\nDefault: **4**\n\n###weight\n\n\n###style\n\n\n###line spacing\n\n\n###max line length\nDefault: **80**\n\n\n##Outputs\n###geometry\n\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_uv_modifier.md",
    "content": "#UV Modifier\n\n##Description\nAdjust a **texture's** UV coordinates.\n\n##Inputs\n###texture\nInput a **texture** to be adjusted.\n\n###u offset\n**Value** for the **U Offset**. Default is **0**.\n\n###v offset\n**Value** for the **V Offset**. Default is **0**.\n\n###u repeat\n**Value** for the **U Repeat**. Default is **1**.\n\n###v repeat\n**Value** for the **V repeat**. Default is **1**.\n\n###filter\nFilter mode:\n**0** nearest / point filtering.\n**1** linear filtering.\n\n##Outputs\n###texture\nThe output for the adjusted **texture**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_vr_camera.md",
    "content": "#VR Camera\n\n##Description\nTHREE.js VR Camera\n\n##Inputs\n###position\n\n\n###rotation\n\n\n###fov\n\n\n###aspectRatio\n\n\n###near\n\n\n###far\n\n\n###lock transform\nIf enabled, the transform coming from the HMD is ignored.\n\n##Outputs\n###camera\n**Camera** output.\n\n###offset\nThe position offset of the **Camera**.\n\n###position\nThe current **position** of the headset.\n\n###rotation\nThe current **rotation** of the headset.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_webgl_renderer.md",
    "content": "#Render To Screen\n\n##Description\nTHREE.js WebGL renderer.\n\n##Inputs\n###camera\n**Camera** to use for rendering.\n\n###scene\n**Scene** to render.\n\n###bgcolor\nBackground color.\n\n###shadowsEnabled\nMaster control for whether shadows are rendered. (**True**/**False**)\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/three_webgl_texture_renderer.md",
    "content": "#Render To Texture\n\n##Description\nTHREE.js WebGL Texture renderer.\n\n##Inputs\n###camera\n**Camera** to use for rendering.\n\n###scene\n**Scene** to render.\n\n###bgcolor\nBackground color.\n\n###width\nTexture **width**.\n\n###height\nTexture **height**.\n\n##Outputs\n###texture\nRender target **texture**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/threesixty_photo_entity.md",
    "content": "#360 Photo Entity\n\n##Description\n360 Photo Entity Patch\n\n##Inputs\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/toggle_button.md",
    "content": "#Boolean toggle\n\n##Description\nToggle button that emits **True** and **False** when clicked.<br><br>Keyboard shortcut&nbsp;&nbsp;&nbsp;<kbd>8</kbd>\n\n##Inputs\n##Outputs\n###bool\n**True** or **False** is emitted on the next update after the button has been clicked.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/toggle_modulator.md",
    "content": "#Boolean toggle Modulator\n\n##Description\nFor every continous sequence of **True** values sent to the **trigger** input slot the emitted **value** will switch from **True** to **False** and vice versa. The initial value is **True**.\n\n##Inputs\n###trigger\nEvery time **True** is sent one or more times in a row, the emitted **value** will switch between **True** and **False**, starting with **True**.\n\n##Outputs\n###bool\nThe current state.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/touch_end_generator.md",
    "content": "#Touch End\n\n##Description\nWhen a touch on eg. a mobile device ends, this outputs a boolean **True** value for one frame.\n\n##Inputs\n##Outputs\n###trigger\n**True** when the touch ends.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/touch_start_generator.md",
    "content": "#Touch Start\n\n##Description\nWhen a touch on eg. a mobile device starts, this outputs a boolean **True** value for one frame.\n\n##Inputs\n##Outputs\n###trigger\n**True** when the touch starts.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/touching_generator.md",
    "content": "#Touching\n\n##Description\nWhile touching eg. a mobile device, this outputs a boolean **True**.\n\n##Inputs\n##Outputs\n###trigger\n**True** while the touch is ongoing.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/triangle_modulator.md",
    "content": "#Triangle\n\n##Description\nTriangle oscillator. A **time** value incrementing by one per second yields a 1Hz output signal.\n\n##Inputs\n###time\nThe current **time** in seconds.\n\n##Outputs\n###value\nEmits ((0.5 - |(**time** % 1.0) - 0.5|) - 0.25) * 4.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/trigger_revolver.md",
    "content": "#Trigger Revolver Switch\n\n##Description\nRevolver style **array** switch. Set up **n** inputs, then choose which one to **output**.\n\n##Inputs\n###trigger\nSelect next **input**.\n\n##Outputs\n###value\nEmits the selected **input**.\n\n###length\nEmits the number of **inputs** = the **length** of the **array**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/tween_in_modulator.md",
    "content": "#In Tweens\n\n##Description\nPerform **tween in** over **time**.\n\n##Inputs\n###time\n**Time** ranging from **0** to **1**.\n\n##Outputs\n###result\nEmits a **tween in** over **time**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/tween_out_modulator.md",
    "content": "#Out Tweens\n\n##Description\nPerform **tween out** over **time**.\n\n##Inputs\n###time\n**Time** ranging from **0** to **1**.\n\n##Outputs\n###result\nEmits a **tween out** over **time**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/typed_array_generator.md",
    "content": "#Typed array\n\n##Description\nCreate a zeroed out **array** of a given **size** (in bytes).\n\n##Inputs\n###size\n**Size** of an **array** in number of elements.\n\n##Outputs\n###array\nThe resulting **array**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/typed_array_get_as_modulator.md",
    "content": "#Get typed array as\n\n##Description\nGets the **value** of a specified **item** from the provided **array**.\n\n##Inputs\n###array\nThe **array** to obtain a **value** from.\n\n###index\nThe **index** of the **item** to get.\n\n##Outputs\n###array\nThe modified **array**.\n\n###value\nThe **value** of the chosen **item**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/typed_array_get_modulator.md",
    "content": "#Get typed array\n\n##Description\nGets an **item** value from a specified **array**.\n\n##Inputs\n###array\nThe **array** to obtain the **value** from.\n\n###index\nThe **index** of the **item** to get.\n\n##Outputs\n###array\nThe modified **array**.\n\n###value\nThe **value** of the chosen **item**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/typed_array_item_to_bool_modulator.md",
    "content": "#Typed array item to bool\n\n##Description\nEmits a **boolean** (**True**/**False**) representation of the specified **item** in the named **array** member of the supplied **object**.\n\n##Inputs\n###object\nInput **object**.\n\n###member\nName of the **array** to be accessed.\n\n###index\n**Index** of the **array** **item** to be converted.\n\n##Outputs\n###bool\nThe **boolean** (**True**/**False**) representation of the specified **array** **item**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/typed_array_item_to_float_modulator.md",
    "content": "#Typed array item to float\n\n##Description\nEmits a **float** representation of the specified **item** in the named **array** member of the supplied **object**.\n\n##Inputs\n###object\nInput **object**.\n\n###member\nName of the **array** to be accessed.\n\n###index\n**Index** of the **array** item to be converted.\n\n##Outputs\n###value\nThe **float** representation of the specified **array** **item**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/typed_array_item_to_object_modulator.md",
    "content": "#Typed array item to object\n\n##Description\nEmits an **object** representation of the specified **item** in the named **array** member of the supplied **object**.\n\n##Inputs\n###object\nInput **object**.\n\n###member\nName of the **array** to be accessed.\n\n###index\n**Index** of the **array** item to be converted.\n\n##Outputs\n###object\nThe **object** representation of the specified **array** item.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/typed_array_item_to_string_modulator.md",
    "content": "#Typed array item to string\n\n##Description\nEmits a **string** representation of the specified **item** in the named **array** member of the supplied **object**.\n\n##Inputs\n###object\nInput **object**.\n\n###member\nName of the **array** to be accessed.\n\n###index\n**Index** of the **array** **item** to be converted.\n\n##Outputs\n###text\nThe **string** representation of the specified **array** **item**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/typed_array_item_to_typed_array_modulator.md",
    "content": "#Typed array item to typed array\n\n##Description\nEmits an typed **array** representation of the specified **item** in the named **array** member of the supplied **object**.\n\n##Inputs\n###object\nInput **object**.\n\n###member\nName of the **array** to be accessed.\n\n###index\n**Index** of the **array** **item** to be converted.\n\n##Outputs\n###array\nThe **string** representation of the specified **array** item.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/typed_array_length_modulator.md",
    "content": "#Typed array Length\n\n##Description\nGets the **length** of an **array** (in bytes).\n\n##Inputs\n###array\nThe **array** to obtain the **length** of.\n\n##Outputs\n###length\nThe **length** (in bytes) of the supplied **array**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/typed_array_set_as_modulator.md",
    "content": "#Set typed array as\n\n##Description\nSets an **item** **value** in an **array**.\n\n##Inputs\n###array\nThe **array** to set a **value** in.\n\n###index\nThe **index** of the **item** to set.\n\n###value\nThe **value** to set the **item** to.\n\n##Outputs\n###array\nThe modified **array**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/typed_array_set_modulator.md",
    "content": "#Set typed array\n\n##Description\nSets an **item** **value** in an **array**.\n\n##Inputs\n###array\nThe **array** to set a **value** in.\n\n###index\nThe **index** of the **item** to set.\n\n###value\nThe **value** to set the **item** to.\n\n##Outputs\n###array\nThe modified **array**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/typed_array_to_texture_modulator.md",
    "content": "#Typed array to texture\n\n##Description\nConverts the supplied **array** to a **texture**.\n\n##Inputs\n###array\nThe **array** to convert to a **texture**.\n\n###width\nThe desired **width** of the resulting **texture**. **Width** should be supplied as **float**.\n\n##Outputs\n###texture\nThe resulting **texture**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/url_array_generator.md",
    "content": "#Array\n\n##Description\nLoad arbitrary data packed in an **PNG** from an **URL**.\n\n##Inputs\n##Outputs\n###array\nThe loaded **array**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/url_audio_buffer_generator.md",
    "content": "#Audio buffer loader\n\n##Description\nLoad an audio sample from an **URL**.\n\n##Inputs\n###url\nUse this to load from a **URL** supplied as a **string**.\n\n##Outputs\n###buffer\nAn audio **buffer**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/url_audio_generator.md",
    "content": "#Audio file loader\n\n##Description\nLoad a sample from an **URL**. Each sample should be encoded as **WAV**, **MP3**, **MP4** and **OGG**, and no extension should be specified. This plugin will load the appropriate filetype for the current execution environment. Click on the **Source** button to see the **URL** of the current file.\n\n##Inputs\n###url\nUse this to load from a **URL** supplied as a **string**.\n\n##Outputs\n###audio\nAn audio **stream**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/url_cubemap_generator.md",
    "content": "#Cubemap\n\n##Description\nLoad a **cubemap**. **JPEG** and **PNG** supported. Click the **Browse** button to select an existing image from your library.\n\n##Inputs\n##Outputs\n###texture\nThe loaded **cubemap**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/url_json_generator.md",
    "content": "#JSON\n\n##Description\nLoad a **JSON** as an object from an **URL**. Click on the **Source** button to see the **URL** of the current file.\n\n##Inputs\n###url\nUse this to load from a **URL** supplied as a **string**.\n\n##Outputs\n###object\nThe **object** if one has been selected.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/url_stereo_cubemap_generator.md",
    "content": "#Stereo Cubemap\n\n##Description\nLoad a Stereo Cubemap from an **URL**. **JPEG** and **PNG** supported. Click the **Browse** button to select an existing image from your library.\n\n##Inputs\n##Outputs\n###left\nThe **left** side of the loaded Stereo Cubemap.\n\n###right\nThe **right** side of the loaded Stereo Cubemap.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/url_stereo_latlongmap_generator.md",
    "content": "#Stereo Lat Long Map\n\n##Description\nLoad a Stereo Lat Long Map from a **URL**. **JPEG** and **PNG** supported. Click the **Browse** button to select an existing image from your library.\n\n##Inputs\n##Outputs\n###left\nThe **left** side of the loaded Lat Long Map.\n\n###right\nThe **right** side of the loaded Lat Long Map.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/url_texture_generator.md",
    "content": "#Texture\n\n##Description\nLoad a **texture** from a **URL**. **JPEG** and **PNG** supported. Click the **Browse** button to select an existing image from your library.\n\n##Inputs\n##Outputs\n###texture\nThe loaded **texture**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/url_video_generator.md",
    "content": "#Video\n\n##Description\nLoad a **OGG/Theora** video from an **URL**.\n\n##Inputs\n###url\nUse this to load from a **URL** supplied as a **string**.\n\n##Outputs\n###video\nA video stream.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/variable_local_read.md",
    "content": "#Read Variable\n\n##Description\nRead from a local _variable_ using the name of the **node**.\n\n##Inputs\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/variable_local_write.md",
    "content": "#Write Variable\n\n##Description\nWrite to a local _variable_ using the name of the **node**.\n\n##Inputs\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/variable_local_write_conditional.md",
    "content": "#Write Variable on Trigger\n\n##Description\nWrite to a local _variable_ using name of the node, if the trigger is **True**.\n\n##Inputs\n###trigger\nIf the trigger is **True**, will write to the _variable_. Defaults to **False**.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/vector.md",
    "content": "#XYZ to Vector\n\n##Description\nCreate a **vector** from individual **X**, **Y** and **Z** components.<br><br>Keyboard shortcut&nbsp;&nbsp;&nbsp;<kbd>7</kbd>\n\n##Inputs\n###x\nThe input X-component.\n\n###y\nThe input Y-component.\n\n###z\nThe input Z-component.\n\n##Outputs\n###vector\nThe resulting **vector**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/vector_add.md",
    "content": "#Add Vector\n\n##Description\nAdds the **X**, **Y** and **Z** components of the supplied **vectors** and emits the result.\n\n##Inputs\n###a\nThe first **operand**.\n\n###b\nThe second **operand**.\n\n##Outputs\n###vector\nEmits **Ax + Bx**, **Ay + By**, **Az + Bz**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/vector_cross.md",
    "content": "#Cross\n\n##Description\nEmits the cross products of the two supplied **vectors**.\n\n##Inputs\n###a\nThe first **operand**.\n\n###b\nThe second **operand**.\n\n##Outputs\n###vector\nEmits **A** cross **B**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/vector_display.md",
    "content": "#Vector\n\n##Description\nDisplays the supplied **vector** as a three-cell row of values.\n\n##Inputs\n###vector\nThe **vector** to be displayed.\n\n##Outputs\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/vector_distance.md",
    "content": "#Distance of Vectors\n\n##Description\nOutputs the **distance** between the supplied **A** and **B** **vectors**.\n\n##Inputs\n###a\nThe first **operand**.\n\n###b\nThe second **operand**.\n\n##Outputs\n###vector\nEmits the **distance** from **A** to **B**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/vector_dot.md",
    "content": "#Dot\n\n##Description\nEmits the **dot** products of the two supplied **vectors**.\n\n##Inputs\n###a\nThe first **operand**.\n\n###b\nThe second **operand**.\n\n##Outputs\n###float\nEmits **A** dot **B**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/vector_magnitude.md",
    "content": "#Magnitude\n\n##Description\nEmits the **magnitude** (length) of the supplied **vector**.\n\n##Inputs\n###vector\nInput **vector** to compute the length of.\n\n##Outputs\n###mag\nEmits the **magnitude** of the input vector.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/vector_multiply.md",
    "content": "#Multiply vector\n\n##Description\nMultiplies the **X**, **Y** and **Z** components of the supplied **vectors** and emits the result as a **vector**.\n\n##Inputs\n###a\nThe first **operand**.\n\n###b\nThe second **operand**.\n\n##Outputs\n###vector\nEmits **Ax * Bx**, **Ay * By**, **Az * Bz**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/vector_normalize.md",
    "content": "#Normalize\n\n##Description\nEmit a normalized version of the supplied **vector** with a magnitude of **1**.\n\n##Inputs\n###vector\nThe input **vector** to be normalized.\n\n##Outputs\n###vector\nEmits the normalized input **vector**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/vector_scale.md",
    "content": "#Scale\n\n##Description\nScale the **X**, **Y** and **Z** components of the supplied **vector** by the supplied **factor**.\n\n##Inputs\n###vector\nThe input **vector** to be scaled.\n\n###scale\nThe scale **factor**.\n\n##Outputs\n###vector\nEmits Vx * s, Vy *s, Vz * s.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/vector_subtract.md",
    "content": "#Subtract Vectors\n\n##Description\nSubtracts the **X**, **Y** and **Z** components of the supplied **vectors** and emits the result as a **vector**.\n\n##Inputs\n###a\nThe first **operand**.\n\n###b\nThe second **operand**.\n\n##Outputs\n###vector\nEmits **Ax - Bx**, **Ay - By**, **Az - Bz**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/vector_to_screenspace.md",
    "content": "#Vector to screenspace\n\n##Description\nTransform a **vector** from world to **screenspace** given a specified camera.\n\n##Inputs\n###vector\nInput **vector** (in worldspace) to transform.\n\n###camera\n**Camera** to use for transformation.\n\n##Outputs\n###vector\nEmits the transformed input **vector**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/vector_transform.md",
    "content": "#Transform\n\n##Description\nTransform a **vector** by the supplied **matrix**.\n\n##Inputs\n###vector\nInput **vector** to transform.\n\n###matrix\nTransformation **matrix** to _multiply_ the **vector** by.\n\n##Outputs\n###vector\nEmits the transformed input **vector**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/video_get_current_time_modulator.md",
    "content": "#Current time\n\n##Description\nGet the current playback **time** of the supplied **video** in seconds.\n\n##Inputs\n###video\nInput **video**.\n\n##Outputs\n###time\nCurrent playback **time**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/video_get_duration_modulator.md",
    "content": "#Duration\n\n##Description\nGet the duration of the supplied video in seconds.\n\n##Inputs\n###video\nInput **video**.\n\n##Outputs\n###duration\n**Duration** in seconds as a **float**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/video_player.md",
    "content": "#Video player\n\n##Description\nPlay a video stream. Playback loops by default.\n\n##Inputs\n###video\nThe video stream to play.\n\n###play\nSend **True** to start playback and **False** to stop.\n\n###muted\nSend **True** to mute audio, **False** to unmute audio.\n\n###volume\nSet the **Volume** of the playback.\n\n###time\nSet playback **time**.\n\n##Outputs\n###texture\nThe current video frame.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/viewport_size_generator.md",
    "content": "#Viewport Size\n\n##Description\nEmits current renderer view size as **width** and **height**.\n\n##Inputs\n##Outputs\n###width\nThe current renderer viewport **width**.\n\n###height\nThe current renderer viewport **height**.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/vive_controller.md",
    "content": "#HTC Vive Controller\n\n##Description\nButtons and axes from HTC Vive Controller.\n\n##Inputs\n###pad number\nGamepad number.\n\n###vibrate\nVibrates the gamepad while this is **True**.\n\n##Outputs\n###touchpad down\nTouchpad down.\n\n###trigger down\nTrigger down.\n\n###grip down\nGrip down.\n\n###menu down\nMenu down.\n\n###touchpad x value\nTouchpad X value.\n\n###touchpad y value\nTouchpad Y value.\n\n###trigger value\nTrigger **value**.\n\n###position\nThe position of the Vive Controller.\n\n###rotation\nThe rotation of the Vive Controller.\n\n##Detail\n\n"
  },
  {
    "path": "documentation/browser/plugins/xor_modulator.md",
    "content": "#Xor\n\n##Description\nEmits **True** when the values of the two inputs are different and a **False** when they're identical.\n\n##Inputs\n###a\nThe first **operand**.\n\n###b\nThe second **operand**.\n\n##Outputs\n###bool\nEmits **True** if **a** _does not equal_ **b**. Emits a **False** otherwise.\n\n##Detail\n\n"
  },
  {
    "path": "gulpfile.js",
    "content": "const gulp = require('gulp')\nconst fs = require('fs')\nconst path = require('path')\nconst uglify = require('gulp-uglify')\nconst concat = require('gulp-concat-util')\nconst del = require('del')\nconst less = require('gulp-less')\nconst preprocess = require('gulp-preprocess')\n\nconst pushPlayerToGrid = require('./tools/pushPlayerToGrid')\n\nvar paths = {\n\tless : {\n\t\teditor: './less/build_editor.less',\n\t\tsite: \t'./less/build_site.less',\n\t\tsite360: './less/build_site360.less',\n\t\tvizor2teaser: './less/build_vizor2teaser.less'\n\t},\n\tjs: {\n\t\tplugins: './browser/plugins/*.plugin.js',\n\t\tengine: [\n\t\t\t'./browser/vendor/when.js',\n\n\t\t\t'./browser/scripts/event-emitter.js',\n\t\t\t'./browser/scripts/core.js',\n\t\t\t'./browser/scripts/util.js',\n\n\t\t\t'./browser/scripts/connection.js',\n\t\t\t'./browser/scripts/variables.js',\n\t\t\t'./browser/scripts/graph.js',\n\t\t\t'./browser/scripts/node.js',\n\t\t\t'./browser/scripts/autoSlotGroup.js',\n\n\t\t\t'./browser/scripts/plugin.js',\n\t\t\t'./browser/scripts/subGraphPlugin.js',\n\t\t\t'./browser/scripts/threeObject3dPlugin.js',\n\t\t\t'./browser/scripts/abstractPlugins/abstractGraphPlugin.js',\n\t\t\t'./browser/scripts/abstractPlugins/abstractEntityPlugin.js',\n\t\t\t'./browser/scripts/abstractPlugins/abstractTextAreaPlugin.js',\n\t\t\t'./browser/scripts/abstractPlugins/abstractObjectRayPlugin.js',\n\t\t\t'./browser/scripts/abstractPlugins/abstractThreeLoaderObjPlugin.js',\n\t\t\t'./browser/scripts/abstractPlugins/abstractThreeMaterialPlugin.js',\n\t\t\t'./browser/scripts/abstractPlugins/abstractThreeMeshPlugin.js',\n\t\t\t'./browser/scripts/abstractPlugins/abstractArrayBlendModulatorPlugin.js',\n\t\t\t'./browser/scripts/abstractPlugins/abstractAnimateValueOnTriggerPlugin.js',\n\t\n\t\t\t'./browser/scripts/blendFunctions.js',\n\t\t\t'./browser/scripts/fontSelector.js',\n\n\t\t\t'./browser/scripts/worldEditor/worldEditor.js',\n\t\t\t'./browser/scripts/worldEditor/worldEditorPerspectiveCamera.js',\n\t\t\t'./browser/scripts/worldEditor/worldEditorOrthographicCamera.js',\n\t\t\t'./browser/scripts/worldEditor/worldEditorCameraSelector.js',\n\t\t\t'./browser/scripts/worldEditor/worldEditorOriginGrid.js',\n\t\t\t'./browser/scripts/worldEditor/worldEditorRadialHelper.js',\n\n\t\t\t'./browser/scripts/worldEditor/objectPlacementHelper.js',\n\n\t\t\t'./browser/scripts/screenshot/ScreenshotRenderer.js',\n\n\t\t\t'./browser/scripts/loaders/loader.js',\n\t\t\t'./browser/scripts/loaders/imageLoader.js',\n\t\t\t'./browser/scripts/loaders/textureLoader.js',\n\t\t\t'./browser/scripts/loaders/modelLoader.js',\n\t\t\t'./browser/scripts/loaders/sceneLoader.js',\n\t\t\t'./browser/scripts/loaders/assetLoader.js',\n\t\t\t'./browser/scripts/loaders/audioBufferLoader.js',\n\t\t\t'./browser/scripts/loaders/videoLoader.js',\n\t\t\t'./browser/scripts/loaders/multiObjectLoader.js',\n\n\t\t\t'./browser/scripts/documentation/pluginDocsCache.js',\n\n\t\t\t'./browser/vendor/three/three.js',\n\t\t\t'./browser/vendor/three/OBJLoader.js',\n\t\t\t'./browser/vendor/three/OBJMTLLoader.js',\n\t\t\t'./browser/vendor/three/MTLLoader.js',\n\t\t\t'./browser/vendor/three/DDSLoader.js',\n\t\t\t'./browser/vendor/three/VREffect.js',\n\t\t\t'./browser/vendor/three/CardboardEffect.js',\n\t\t\t'./browser/vendor/three/VRControls.js',\n\t\t\t'./browser/vendor/three/OrbitControls.js',\n\t\t\t'./browser/vendor/three/SceneLoader.js',\n\t\t\t'./browser/vendor/three/MorphAnimMesh.js',\n\t\t\t'./browser/vendor/three/Font.js',\n\t\t\t'./browser/vendor/three/FontLoader.js',\n\n\t\t\t'./browser/vendor/three/loaders/FBXLoader.js',\n\t\t\t'./browser/vendor/three/loaders/ColladaLoader2.js',\n\t\t\t'./browser/vendor/three/loaders/gltf/glTF-parser.js',\n\t\t\t'./browser/vendor/three/loaders/gltf/glTFAnimation.js',\n\t\t\t'./browser/vendor/three/loaders/gltf/glTFLoader.js',\n\t\t\t'./browser/vendor/three/loaders/gltf/glTFLoaderUtils.js',\n\t\t\t'./browser/vendor/three/loaders/gltf/glTFShaders.js',\n\t\t\t'./browser/vendor/three/loaders/gltf/glTFUtilities.js',\n\n\t\t\t'./browser/vendor/spite/THREE.MeshLine.js',\n\n\t\t\t'./browser/scripts/glTFUtils.js',\n\n\t\t\t'./browser/scripts/noise.js',\n\t\t\t'./browser/vendor/random.min.js',\n\n\t\t\t'./browser/scripts/datatypes/environmentSettings.js',\n\n\t\t\t'./browser/scripts/textureCache.js',\n\n\t\t\t'./browser/scripts/plugin-manager-bundled.js',\n\t\t\n      \t'./browser/vendor/borismus/ray-input.js'\n\t\t],\n\n\t\tplayer: [\n\t\t\t'./browser/plugins/*.plugin.js',\n\t\t\t'./browser/plugins/ambisonics/*.plugin.js',\n\t\t\t'./browser/scripts/player.js',\n\t\t\t'./browser/scripts/player-run.js'\n\t\t]\n\t}\n}\n\n\nfunction errorHandler(err) {\n\tconsole.error(err.message, err.lineNumber, err.stack)\n\tthis.emit('end')\n}\n\ngulp.task('clean:js:player', function(cb) {\n\tdel('./browser/dist/player.min.js', cb)\n})\n\ngulp.task('clean:js:engine', function(cb) {\n\tdel('./browser/dist/engine.js', cb)\n})\n\ngulp.task('clean:less:site360', function(cb)  {\n\tdel('./browser/style/site360.css', cb);\n});\n\ngulp.task('clean:less:site', function(cb) {\n\tdel('./browser/style/site.css', cb)\n})\n\ngulp.task('clean:less:editor', function(cb) {\n\tdel('./browser/style/editor.css', cb)\n})\n\ngulp.task('clean:less:vizor2teaser', function(cb) {\n\tdel('./browser/style/vizor2teaser.css', cb)\n})\n\ngulp.task('clean:js', ['clean:js:player', 'clean:js:engine'])\n\ngulp.task('clean', ['clean:js'])\n\ngulp.task('js:engine', ['clean:js:engine'], function(done) {\n\tgulp.src(paths.js.engine)\n\t.pipe(concat.header(';\\n'))\n\t.pipe(concat('engine.js'))\n\t.pipe(gulp.dest(path.join(__dirname, 'browser', 'dist')))\n\t.on('error', errorHandler)\n\t.on('end', done)\n})\n\ngulp.task('js:player', ['clean:js:player', 'js:engine'], function(done) {\n\tvar playerPipe = gulp.src(paths.js.engine.concat(paths.js.player))\n\t\t.pipe(concat.header(';\\n'))\n\t\t.pipe(concat('player.min.js'))\n\n\t// only uglify in production\n\tif (process.env.NODE_ENV === 'production') {\n\t\tplayerPipe = playerPipe\n\t\t\t.pipe(uglify().on('error', errorHandler))\n\t}\n\n\tplayerPipe\n\t.pipe(gulp.dest(path.join(__dirname, 'browser', 'dist')))\n\t.on('error', errorHandler)\n\t.on('end', done)\n})\n\ngulp.task('push', ['js:player'], function(done) {\n\tpushPlayerToGrid()\n\t\t.then(done, errorHandler)\n})\n\ngulp.task('js', ['js:player'])\n\ngulp.task('less:site', ['clean:less:site'], function() {\n\tgulp.src(paths.less.site)\n    .pipe(less({\n\t\tpaths: [ path.join(__dirname, 'less') ]\n    }).on('error', errorHandler))\n\t.pipe(concat('site.css'))\n    .pipe(gulp.dest(path.join(__dirname, 'browser', 'style')))\n\t.on('error', errorHandler)\n})\n\ngulp.task('less:editor', ['clean:less:editor'], function() {\n\tgulp.src(paths.less.editor)\n    .pipe(less({\n\t\tpaths: [ path.join(__dirname, 'less') ]\n    }).on('error', errorHandler))\n\t.pipe(concat('editor.css'))\n    .pipe(gulp.dest(path.join(__dirname, 'browser', 'style')))\n\t.on('error', errorHandler)\n})\n\ngulp.task('less:site360', ['clean:less:site360'], function() {\n\tgulp.src(paths.less.site360)\n    .pipe(less({\n\t\tpaths: [ path.join(__dirname, 'less') ]\n    }).on('error', errorHandler))\n\t.pipe(concat('site360.css'))\n    .pipe(gulp.dest(path.join(__dirname, 'browser', 'style')))\n\t.on('error', errorHandler)\n});\n\ngulp.task('less:vizor2teaser', ['clean:less:vizor2teaser'], function() {\n\tgulp.src(paths.less.vizor2teaser)\n\t.pipe(less({\n\t\tpaths: [ path.join(__dirname, 'less') ]\n\t}).on('error', errorHandler))\n\t.pipe(concat('vizor2teaser.css'))\n\t.pipe(gulp.dest(path.join(__dirname, 'browser', 'style')))\n\t.on('error', errorHandler)\n});\n\n\ngulp.task('watch', ['default'], function() {\n\tgulp.watch('less/**/*', ['less:site', 'less:editor', 'less:site360', 'less:vizor2teaser']);\n\tgulp.watch(paths.js.player.concat(paths.js.engine), ['js:player', 'push'])\n})\n\n\ngulp.task('watch:less', function() {\n\tgulp.watch('less/**/*', ['less:site', 'less:editor', 'less:site360', 'less:vizor2teaser']);\n})\n\ngulp.task('watch:player', function() {\n\tgulp.watch(paths.js.player.concat(paths.js.engine), ['js:player', 'push'])\n})\n\ngulp.task('golive', ['less:site', 'less:editor', 'less:site360', 'less:vizor2teaser', 'js'])\n\ngulp.task('default', ['less:site', 'less:editor', 'less:site360', 'less:vizor2teaser', 'js', 'push'])\n\n"
  },
  {
    "path": "less/bootstrap/.csscomb.json",
    "content": "{\n  \"always-semicolon\": true,\n  \"block-indent\": 2,\n  \"color-case\": \"lower\",\n  \"color-shorthand\": true,\n  \"element-case\": \"lower\",\n  \"eof-newline\": true,\n  \"leading-zero\": false,\n  \"remove-empty-rulesets\": true,\n  \"space-after-colon\": 1,\n  \"space-after-combinator\": 1,\n  \"space-before-selector-delimiter\": 0,\n  \"space-between-declarations\": \"\\n\",\n  \"space-after-opening-brace\": \"\\n\",\n  \"space-before-closing-brace\": \"\\n\",\n  \"space-before-colon\": 0,\n  \"space-before-combinator\": 1,\n  \"space-before-opening-brace\": 1,\n  \"strip-spaces\": true,\n  \"unitless-zero\": true,\n  \"vendor-prefix-align\": true,\n  \"sort-order\": [\n    [\n      \"position\",\n      \"top\",\n      \"right\",\n      \"bottom\",\n      \"left\",\n      \"z-index\",\n      \"display\",\n      \"float\",\n      \"width\",\n      \"min-width\",\n      \"max-width\",\n      \"height\",\n      \"min-height\",\n      \"max-height\",\n      \"-webkit-box-sizing\",\n      \"-moz-box-sizing\",\n      \"box-sizing\",\n      \"-webkit-appearance\",\n      \"padding\",\n      \"padding-top\",\n      \"padding-right\",\n      \"padding-bottom\",\n      \"padding-left\",\n      \"margin\",\n      \"margin-top\",\n      \"margin-right\",\n      \"margin-bottom\",\n      \"margin-left\",\n      \"overflow\",\n      \"overflow-x\",\n      \"overflow-y\",\n      \"-webkit-overflow-scrolling\",\n      \"-ms-overflow-x\",\n      \"-ms-overflow-y\",\n      \"-ms-overflow-style\",\n      \"clip\",\n      \"clear\",\n      \"font\",\n      \"font-family\",\n      \"font-size\",\n      \"font-style\",\n      \"font-weight\",\n      \"font-variant\",\n      \"font-size-adjust\",\n      \"font-stretch\",\n      \"font-effect\",\n      \"font-emphasize\",\n      \"font-emphasize-position\",\n      \"font-emphasize-style\",\n      \"font-smooth\",\n      \"-webkit-hyphens\",\n      \"-moz-hyphens\",\n      \"hyphens\",\n      \"line-height\",\n      \"color\",\n      \"text-align\",\n      \"-webkit-text-align-last\",\n      \"-moz-text-align-last\",\n      \"-ms-text-align-last\",\n      \"text-align-last\",\n      \"text-emphasis\",\n      \"text-emphasis-color\",\n      \"text-emphasis-style\",\n      \"text-emphasis-position\",\n      \"text-decoration\",\n      \"text-indent\",\n      \"text-justify\",\n      \"text-outline\",\n      \"-ms-text-overflow\",\n      \"text-overflow\",\n      \"text-overflow-ellipsis\",\n      \"text-overflow-mode\",\n      \"text-shadow\",\n      \"text-transform\",\n      \"text-wrap\",\n      \"-webkit-text-size-adjust\",\n      \"-ms-text-size-adjust\",\n      \"letter-spacing\",\n      \"-ms-word-break\",\n      \"word-break\",\n      \"word-spacing\",\n      \"-ms-word-wrap\",\n      \"word-wrap\",\n      \"-moz-tab-size\",\n      \"-o-tab-size\",\n      \"tab-size\",\n      \"white-space\",\n      \"vertical-align\",\n      \"list-style\",\n      \"list-style-position\",\n      \"list-style-type\",\n      \"list-style-image\",\n      \"pointer-events\",\n      \"-ms-touch-action\",\n      \"touch-action\",\n      \"cursor\",\n      \"visibility\",\n      \"zoom\",\n      \"flex-direction\",\n      \"flex-order\",\n      \"flex-pack\",\n      \"flex-align\",\n      \"table-layout\",\n      \"empty-cells\",\n      \"caption-side\",\n      \"border-spacing\",\n      \"border-collapse\",\n      \"content\",\n      \"quotes\",\n      \"counter-reset\",\n      \"counter-increment\",\n      \"resize\",\n      \"-webkit-user-select\",\n      \"-moz-user-select\",\n      \"-ms-user-select\",\n      \"-o-user-select\",\n      \"user-select\",\n      \"nav-index\",\n      \"nav-up\",\n      \"nav-right\",\n      \"nav-down\",\n      \"nav-left\",\n      \"background\",\n      \"background-color\",\n      \"background-image\",\n      \"-ms-filter:\\\\'progid:DXImageTransform.Microsoft.gradient\",\n      \"filter:progid:DXImageTransform.Microsoft.gradient\",\n      \"filter:progid:DXImageTransform.Microsoft.AlphaImageLoader\",\n      \"filter\",\n      \"background-repeat\",\n      \"background-attachment\",\n      \"background-position\",\n      \"background-position-x\",\n      \"background-position-y\",\n      \"-webkit-background-clip\",\n      \"-moz-background-clip\",\n      \"background-clip\",\n      \"background-origin\",\n      \"-webkit-background-size\",\n      \"-moz-background-size\",\n      \"-o-background-size\",\n      \"background-size\",\n      \"border\",\n      \"border-color\",\n      \"border-style\",\n      \"border-width\",\n      \"border-top\",\n      \"border-top-color\",\n      \"border-top-style\",\n      \"border-top-width\",\n      \"border-right\",\n      \"border-right-color\",\n      \"border-right-style\",\n      \"border-right-width\",\n      \"border-bottom\",\n      \"border-bottom-color\",\n      \"border-bottom-style\",\n      \"border-bottom-width\",\n      \"border-left\",\n      \"border-left-color\",\n      \"border-left-style\",\n      \"border-left-width\",\n      \"border-radius\",\n      \"border-top-left-radius\",\n      \"border-top-right-radius\",\n      \"border-bottom-right-radius\",\n      \"border-bottom-left-radius\",\n      \"-webkit-border-image\",\n      \"-moz-border-image\",\n      \"-o-border-image\",\n      \"border-image\",\n      \"-webkit-border-image-source\",\n      \"-moz-border-image-source\",\n      \"-o-border-image-source\",\n      \"border-image-source\",\n      \"-webkit-border-image-slice\",\n      \"-moz-border-image-slice\",\n      \"-o-border-image-slice\",\n      \"border-image-slice\",\n      \"-webkit-border-image-width\",\n      \"-moz-border-image-width\",\n      \"-o-border-image-width\",\n      \"border-image-width\",\n      \"-webkit-border-image-outset\",\n      \"-moz-border-image-outset\",\n      \"-o-border-image-outset\",\n      \"border-image-outset\",\n      \"-webkit-border-image-repeat\",\n      \"-moz-border-image-repeat\",\n      \"-o-border-image-repeat\",\n      \"border-image-repeat\",\n      \"outline\",\n      \"outline-width\",\n      \"outline-style\",\n      \"outline-color\",\n      \"outline-offset\",\n      \"-webkit-box-shadow\",\n      \"-moz-box-shadow\",\n      \"box-shadow\",\n      \"filter:progid:DXImageTransform.Microsoft.Alpha(Opacity\",\n      \"-ms-filter:\\\\'progid:DXImageTransform.Microsoft.Alpha\",\n      \"opacity\",\n      \"-ms-interpolation-mode\",\n      \"-webkit-transition\",\n      \"-moz-transition\",\n      \"-ms-transition\",\n      \"-o-transition\",\n      \"transition\",\n      \"-webkit-transition-delay\",\n      \"-moz-transition-delay\",\n      \"-ms-transition-delay\",\n      \"-o-transition-delay\",\n      \"transition-delay\",\n      \"-webkit-transition-timing-function\",\n      \"-moz-transition-timing-function\",\n      \"-ms-transition-timing-function\",\n      \"-o-transition-timing-function\",\n      \"transition-timing-function\",\n      \"-webkit-transition-duration\",\n      \"-moz-transition-duration\",\n      \"-ms-transition-duration\",\n      \"-o-transition-duration\",\n      \"transition-duration\",\n      \"-webkit-transition-property\",\n      \"-moz-transition-property\",\n      \"-ms-transition-property\",\n      \"-o-transition-property\",\n      \"transition-property\",\n      \"-webkit-transform\",\n      \"-moz-transform\",\n      \"-ms-transform\",\n      \"-o-transform\",\n      \"transform\",\n      \"-webkit-transform-origin\",\n      \"-moz-transform-origin\",\n      \"-ms-transform-origin\",\n      \"-o-transform-origin\",\n      \"transform-origin\",\n      \"-webkit-animation\",\n      \"-moz-animation\",\n      \"-ms-animation\",\n      \"-o-animation\",\n      \"animation\",\n      \"-webkit-animation-name\",\n      \"-moz-animation-name\",\n      \"-ms-animation-name\",\n      \"-o-animation-name\",\n      \"animation-name\",\n      \"-webkit-animation-duration\",\n      \"-moz-animation-duration\",\n      \"-ms-animation-duration\",\n      \"-o-animation-duration\",\n      \"animation-duration\",\n      \"-webkit-animation-play-state\",\n      \"-moz-animation-play-state\",\n      \"-ms-animation-play-state\",\n      \"-o-animation-play-state\",\n      \"animation-play-state\",\n      \"-webkit-animation-timing-function\",\n      \"-moz-animation-timing-function\",\n      \"-ms-animation-timing-function\",\n      \"-o-animation-timing-function\",\n      \"animation-timing-function\",\n      \"-webkit-animation-delay\",\n      \"-moz-animation-delay\",\n      \"-ms-animation-delay\",\n      \"-o-animation-delay\",\n      \"animation-delay\",\n      \"-webkit-animation-iteration-count\",\n      \"-moz-animation-iteration-count\",\n      \"-ms-animation-iteration-count\",\n      \"-o-animation-iteration-count\",\n      \"animation-iteration-count\",\n      \"-webkit-animation-direction\",\n      \"-moz-animation-direction\",\n      \"-ms-animation-direction\",\n      \"-o-animation-direction\",\n      \"animation-direction\"\n    ]\n  ]\n}\n"
  },
  {
    "path": "less/bootstrap/.csslintrc",
    "content": "{\n  \"adjoining-classes\": false,\n  \"box-sizing\": false,\n  \"box-model\": false,\n  \"compatible-vendor-prefixes\": false,\n  \"floats\": false,\n  \"font-sizes\": false,\n  \"gradients\": false,\n  \"important\": false,\n  \"known-properties\": false,\n  \"outline-none\": false,\n  \"qualified-headings\": false,\n  \"regex-selectors\": false,\n  \"shorthand\": false,\n  \"text-indent\": false,\n  \"unique-headings\": false,\n  \"universal-selector\": false,\n  \"unqualified-attributes\": false\n}\n"
  },
  {
    "path": "less/bootstrap/alerts.less",
    "content": "//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n  padding: @alert-padding;\n  margin-bottom: @line-height-computed;\n  border: 1px solid transparent;\n  border-radius: @alert-border-radius;\n\n  // Headings for larger alerts\n  h4 {\n    margin-top: 0;\n    // Specified for the h4 to prevent conflicts of changing @headings-color\n    color: inherit;\n  }\n  // Provide class for links that match alerts\n  .alert-link {\n    font-weight: @alert-link-font-weight;\n  }\n\n  // Improve alignment and spacing of inner content\n  > p,\n  > ul {\n    margin-bottom: 0;\n  }\n  > p + p {\n    margin-top: 5px;\n  }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n  padding-right: (@alert-padding + 20);\n\n  // Adjust close link position\n  .close {\n    position: relative;\n    top: -2px;\n    right: -21px;\n    color: inherit;\n  }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n  .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n.alert-info {\n  .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n.alert-warning {\n  .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n.alert-danger {\n  .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n"
  },
  {
    "path": "less/bootstrap/badges.less",
    "content": "//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n  display: inline-block;\n  min-width: 10px;\n  padding: 3px 7px;\n  font-size: @font-size-small;\n  font-weight: @badge-font-weight;\n  color: @badge-color;\n  line-height: @badge-line-height;\n  vertical-align: baseline;\n  white-space: nowrap;\n  text-align: center;\n  background-color: @badge-bg;\n  border-radius: @badge-border-radius;\n\n  // Empty badges collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for badges in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n  .btn-xs & {\n    top: 0;\n    padding: 1px 5px;\n  }\n\n  // Hover state, but only for links\n  a& {\n    &:hover,\n    &:focus {\n      color: @badge-link-hover-color;\n      text-decoration: none;\n      cursor: pointer;\n    }\n  }\n\n  // Account for badges in navs\n  .list-group-item.active > &,\n  .nav-pills > .active > a > & {\n    color: @badge-active-color;\n    background-color: @badge-active-bg;\n  }\n  .list-group-item > & {\n    float: right;\n  }\n  .list-group-item > & + & {\n    margin-right: 5px;\n  }\n  .nav-pills > li > a > & {\n    margin-left: 3px;\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/bootstrap.less",
    "content": "// Core variables and mixins\n@import \"variables.less\";\n@import \"mixins.less\";\n\n// Reset and dependencies\n@import \"normalize.less\";\n@import \"print.less\";\n@import \"glyphicons.less\";\n\n// Core CSS\n@import \"scaffolding.less\";\n@import \"type.less\";\n@import \"code.less\";\n@import \"grid.less\";\n@import \"tables.less\";\n@import \"forms.less\";\n@import \"buttons.less\";\n\n// Components\n@import \"component-animations.less\";\n@import \"dropdowns.less\";\n@import \"button-groups.less\";\n@import \"input-groups.less\";\n@import \"navs.less\";\n@import \"navbar.less\";\n@import \"breadcrumbs.less\";\n//@import \"pagination.less\";\t// using our own\n@import \"pager.less\";\n@import \"labels.less\";\n@import \"badges.less\";\n@import \"jumbotron.less\";\n@import \"thumbnails.less\";\n@import \"alerts.less\";\n@import \"progress-bars.less\";\n@import \"media.less\";\n@import \"list-group.less\";\n@import \"panels.less\";\n@import \"responsive-embed.less\";\n@import \"wells.less\";\n@import \"close.less\";\n\n// Components w/ JavaScript\n@import \"modals.less\";\n@import \"tooltip.less\";\n@import \"popovers.less\";\n\n// Utility classes\n@import \"utilities.less\";\n@import \"responsive-utilities.less\";\n"
  },
  {
    "path": "less/bootstrap/breadcrumbs.less",
    "content": "//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n  padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n  margin-bottom: @line-height-computed;\n  list-style: none;\n  background-color: @breadcrumb-bg;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline-block;\n\n    + li:before {\n      content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n      padding: 0 5px;\n      color: @breadcrumb-color;\n    }\n  }\n\n  > .active {\n    color: @breadcrumb-active-color;\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/button-groups.less",
    "content": "//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n  position: relative;\n  display: inline-block;\n  vertical-align: middle; // match .btn alignment given font-size hack above\n  > .btn {\n    position: relative;\n    float: left;\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active,\n    &.active {\n      z-index: 2;\n    }\n  }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n  .btn + .btn,\n  .btn + .btn-group,\n  .btn-group + .btn,\n  .btn-group + .btn-group {\n    margin-left: -1px;\n  }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n  margin-left: -5px; // Offset the first child's margin\n  &:extend(.clearfix all);\n\n  .btn-group,\n  .input-group {\n    float: left;\n  }\n  > .btn,\n  > .btn-group,\n  > .input-group {\n    margin-left: 5px;\n  }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n  border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n  margin-left: 0;\n  &:not(:last-child):not(.dropdown-toggle) {\n    .border-right-radius(0);\n  }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n  .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n  float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group > .btn-group:first-child {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-right-radius(0);\n  }\n}\n.btn-group > .btn-group:last-child > .btn:first-child {\n  .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n  outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n  padding-left: 8px;\n  padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n  padding-left: 12px;\n  padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n  .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n  // Show no shadow for `.btn-link` since it has no other button styles.\n  &.btn-link {\n    .box-shadow(none);\n  }\n}\n\n\n// Reposition the caret\n.btn .caret {\n  margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n  border-width: @caret-width-large @caret-width-large 0;\n  border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n  border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n  > .btn,\n  > .btn-group,\n  > .btn-group > .btn {\n    display: block;\n    float: none;\n    width: 100%;\n    max-width: 100%;\n  }\n\n  // Clear floats so dropdown menus can be properly placed\n  > .btn-group {\n    &:extend(.clearfix all);\n    > .btn {\n      float: none;\n    }\n  }\n\n  > .btn + .btn,\n  > .btn + .btn-group,\n  > .btn-group + .btn,\n  > .btn-group + .btn-group {\n    margin-top: -1px;\n    margin-left: 0;\n  }\n}\n\n.btn-group-vertical > .btn {\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n  &:first-child:not(:last-child) {\n    border-top-right-radius: @border-radius-base;\n    .border-bottom-radius(0);\n  }\n  &:last-child:not(:first-child) {\n    border-bottom-left-radius: @border-radius-base;\n    .border-top-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n  border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n  > .btn:last-child,\n  > .dropdown-toggle {\n    .border-bottom-radius(0);\n  }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n  .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n  display: table;\n  width: 100%;\n  table-layout: fixed;\n  border-collapse: separate;\n  > .btn,\n  > .btn-group {\n    float: none;\n    display: table-cell;\n    width: 1%;\n  }\n  > .btn-group .btn {\n    width: 100%;\n  }\n\n  > .btn-group .dropdown-menu {\n    left: auto;\n  }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n  > .btn,\n  > .btn-group > .btn {\n    input[type=\"radio\"],\n    input[type=\"checkbox\"] {\n      position: absolute;\n      clip: rect(0,0,0,0);\n      pointer-events: none;\n    }\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/buttons.less",
    "content": "//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n  display: inline-block;\n  margin-bottom: 0; // For input.btn\n  font-weight: @btn-font-weight;\n  text-align: center;\n  vertical-align: middle;\n  touch-action: manipulation;\n  cursor: pointer;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  white-space: nowrap;\n  .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @border-radius-base);\n  .user-select(none);\n\n  &,\n  &:active,\n  &.active {\n    &:focus,\n    &.focus {\n      .tab-focus();\n    }\n  }\n\n  &:hover,\n  &:focus,\n  &.focus {\n    color: @btn-default-color;\n    text-decoration: none;\n  }\n\n  &:active,\n  &.active {\n    outline: 0;\n    background-image: none;\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n    pointer-events: none; // Future-proof disabling of clicks\n    .opacity(.65);\n    .box-shadow(none);\n  }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n  .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n  .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n  .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n  .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n  .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n  .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n  color: @link-color;\n  font-weight: normal;\n  border-radius: 0;\n\n  &,\n  &:active,\n  &.active,\n  &[disabled],\n  fieldset[disabled] & {\n    background-color: transparent;\n    .box-shadow(none);\n  }\n  &,\n  &:hover,\n  &:focus,\n  &:active {\n    border-color: transparent;\n  }\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: underline;\n    background-color: transparent;\n  }\n  &[disabled],\n  fieldset[disabled] & {\n    &:hover,\n    &:focus {\n      color: @btn-link-disabled-color;\n      text-decoration: none;\n    }\n  }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n  // line-height: ensure even-numbered height of button next to large input\n  .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n.btn-sm {\n  // line-height: ensure proper height of button next to small input\n  .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n.btn-xs {\n  .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n  display: block;\n  width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n  margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n  &.btn-block {\n    width: 100%;\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/carousel.less",
    "content": "//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n  position: relative;\n}\n\n.carousel-inner {\n  position: relative;\n  overflow: hidden;\n  width: 100%;\n\n  > .item {\n    display: none;\n    position: relative;\n    .transition(.6s ease-in-out left);\n\n    // Account for jankitude on images\n    > img,\n    > a > img {\n      &:extend(.img-responsive);\n      line-height: 1;\n    }\n\n    // WebKit CSS3 transforms for supported devices\n    @media all and (transform-3d), (-webkit-transform-3d) {\n      transition: transform .6s ease-in-out;\n      backface-visibility: hidden;\n      perspective: 1000;\n\n      &.next,\n      &.active.right {\n        transform: translate3d(100%, 0, 0);\n        left: 0;\n      }\n      &.prev,\n      &.active.left {\n        transform: translate3d(-100%, 0, 0);\n        left: 0;\n      }\n      &.next.left,\n      &.prev.right,\n      &.active {\n        transform: translate3d(0, 0, 0);\n        left: 0;\n      }\n    }\n  }\n\n  > .active,\n  > .next,\n  > .prev {\n    display: block;\n  }\n\n  > .active {\n    left: 0;\n  }\n\n  > .next,\n  > .prev {\n    position: absolute;\n    top: 0;\n    width: 100%;\n  }\n\n  > .next {\n    left: 100%;\n  }\n  > .prev {\n    left: -100%;\n  }\n  > .next.left,\n  > .prev.right {\n    left: 0;\n  }\n\n  > .active.left {\n    left: -100%;\n  }\n  > .active.right {\n    left: 100%;\n  }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n  position: absolute;\n  top: 0;\n  left: 0;\n  bottom: 0;\n  width: @carousel-control-width;\n  .opacity(@carousel-control-opacity);\n  font-size: @carousel-control-font-size;\n  color: @carousel-control-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  // We can't have this transition here because WebKit cancels the carousel\n  // animation if you trip this while in the middle of another animation.\n\n  // Set gradients for backgrounds\n  &.left {\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n  }\n  &.right {\n    left: auto;\n    right: 0;\n    #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n  }\n\n  // Hover/focus state\n  &:hover,\n  &:focus {\n    outline: 0;\n    color: @carousel-control-color;\n    text-decoration: none;\n    .opacity(.9);\n  }\n\n  // Toggles\n  .icon-prev,\n  .icon-next,\n  .glyphicon-chevron-left,\n  .glyphicon-chevron-right {\n    position: absolute;\n    top: 50%;\n    z-index: 5;\n    display: inline-block;\n  }\n  .icon-prev,\n  .glyphicon-chevron-left {\n    left: 50%;\n    margin-left: -10px;\n  }\n  .icon-next,\n  .glyphicon-chevron-right {\n    right: 50%;\n    margin-right: -10px;\n  }\n  .icon-prev,\n  .icon-next {\n    width:  20px;\n    height: 20px;\n    margin-top: -10px;\n    font-family: serif;\n  }\n\n\n  .icon-prev {\n    &:before {\n      content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n    }\n  }\n  .icon-next {\n    &:before {\n      content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n    }\n  }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n  position: absolute;\n  bottom: 10px;\n  left: 50%;\n  z-index: 15;\n  width: 60%;\n  margin-left: -30%;\n  padding-left: 0;\n  list-style: none;\n  text-align: center;\n\n  li {\n    display: inline-block;\n    width:  10px;\n    height: 10px;\n    margin: 1px;\n    text-indent: -999px;\n    border: 1px solid @carousel-indicator-border-color;\n    border-radius: 10px;\n    cursor: pointer;\n\n    // IE8-9 hack for event handling\n    //\n    // Internet Explorer 8-9 does not support clicks on elements without a set\n    // `background-color`. We cannot use `filter` since that's not viewed as a\n    // background color by the browser. Thus, a hack is needed.\n    //\n    // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n    // set alpha transparency for the best results possible.\n    background-color: #000 \\9; // IE8\n    background-color: rgba(0,0,0,0); // IE9\n  }\n  .active {\n    margin: 0;\n    width:  12px;\n    height: 12px;\n    background-color: @carousel-indicator-active-bg;\n  }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n  position: absolute;\n  left: 15%;\n  right: 15%;\n  bottom: 20px;\n  z-index: 10;\n  padding-top: 20px;\n  padding-bottom: 20px;\n  color: @carousel-caption-color;\n  text-align: center;\n  text-shadow: @carousel-text-shadow;\n  & .btn {\n    text-shadow: none; // No shadow for button elements in carousel-caption\n  }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n  // Scale up the controls a smidge\n  .carousel-control {\n    .glyphicon-chevron-left,\n    .glyphicon-chevron-right,\n    .icon-prev,\n    .icon-next {\n      width: 30px;\n      height: 30px;\n      margin-top: -15px;\n      font-size: 30px;\n    }\n    .glyphicon-chevron-left,\n    .icon-prev {\n      margin-left: -15px;\n    }\n    .glyphicon-chevron-right,\n    .icon-next {\n      margin-right: -15px;\n    }\n  }\n\n  // Show and left align the captions\n  .carousel-caption {\n    left: 20%;\n    right: 20%;\n    padding-bottom: 30px;\n  }\n\n  // Move up the indicators\n  .carousel-indicators {\n    bottom: 20px;\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/close.less",
    "content": "//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n  float: right;\n  font-size: (@font-size-base * 1.5);\n  font-weight: @close-font-weight;\n  line-height: 1;\n  color: @close-color;\n  text-shadow: @close-text-shadow;\n  .opacity(.2);\n\n  &:hover,\n  &:focus {\n    color: @close-color;\n    text-decoration: none;\n    cursor: pointer;\n    .opacity(.5);\n  }\n\n  // Additional properties for button version\n  // iOS requires the button element instead of an anchor tag.\n  // If you want the anchor version, it requires `href=\"#\"`.\n  button& {\n    padding: 0;\n    cursor: pointer;\n    background: transparent;\n    border: 0;\n    -webkit-appearance: none;\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/code.less",
    "content": "//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n  font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @code-color;\n  background-color: @code-bg;\n  border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n  padding: 2px 4px;\n  font-size: 90%;\n  color: @kbd-color;\n  background-color: @kbd-bg;\n  border-radius: @border-radius-small;\n  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n  kbd {\n    padding: 0;\n    font-size: 100%;\n    font-weight: bold;\n    box-shadow: none;\n  }\n}\n\n// Blocks of code\npre {\n  display: block;\n  padding: ((@line-height-computed - 1) / 2);\n  margin: 0 0 (@line-height-computed / 2);\n  font-size: (@font-size-base - 1); // 14px to 13px\n  line-height: @line-height-base;\n  word-break: break-all;\n  word-wrap: break-word;\n  color: @pre-color;\n  background-color: @pre-bg;\n  border: 1px solid @pre-border-color;\n  border-radius: @border-radius-base;\n\n  // Account for some code outputs that place code tags in pre tags\n  code {\n    padding: 0;\n    font-size: inherit;\n    color: inherit;\n    white-space: pre-wrap;\n    background-color: transparent;\n    border-radius: 0;\n  }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n  max-height: @pre-scrollable-max-height;\n  overflow-y: scroll;\n}\n"
  },
  {
    "path": "less/bootstrap/component-animations.less",
    "content": "//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n  opacity: 0;\n  .transition(opacity .15s linear);\n  &.in {\n    opacity: 1;\n  }\n}\n\n.collapse {\n  display: none;\n  visibility: hidden;\n\n  &.in      { display: block; visibility: visible; }\n  tr&.in    { display: table-row; }\n  tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n  position: relative;\n  height: 0;\n  overflow: hidden;\n  .transition-property(~\"height, visibility\");\n  .transition-duration(.35s);\n  .transition-timing-function(ease);\n}\n"
  },
  {
    "path": "less/bootstrap/dropdowns.less",
    "content": "//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n  display: inline-block;\n  width: 0;\n  height: 0;\n  margin-left: 2px;\n  vertical-align: middle;\n  border-top:   @caret-width-base solid;\n  border-right: @caret-width-base solid transparent;\n  border-left:  @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropdown {\n  position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n  outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n  position: absolute;\n  top: 100%;\n  left: 0;\n  z-index: @zindex-dropdown;\n  display: none; // none by default, but block on \"open\" of the menu\n  float: left;\n  min-width: 160px;\n  padding: 5px 0;\n  margin: 2px 0 0; // override default ul\n  list-style: none;\n  font-size: @font-size-base;\n  text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n  background-color: @dropdown-bg;\n  border: 1px solid @dropdown-fallback-border; // IE8 fallback\n  border: 1px solid @dropdown-border;\n  border-radius: @border-radius-base;\n  .box-shadow(0 6px 12px rgba(0,0,0,.175));\n  background-clip: padding-box;\n\n  // Aligns the dropdown menu to right\n  //\n  // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n  &.pull-right {\n    right: 0;\n    left: auto;\n  }\n\n  // Dividers (basically an hr) within the dropdown\n  .divider {\n    .nav-divider(@dropdown-divider-bg);\n  }\n\n  // Links within the dropdown menu\n  > li > a {\n    display: block;\n    padding: 3px 20px;\n    clear: both;\n    font-weight: normal;\n    line-height: @line-height-base;\n    color: @dropdown-link-color;\n    white-space: nowrap; // prevent links from randomly breaking onto new lines\n  }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: @dropdown-link-hover-color;\n    background-color: @dropdown-link-hover-bg;\n  }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-active-color;\n    text-decoration: none;\n    outline: 0;\n    background-color: @dropdown-link-active-bg;\n  }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n  &,\n  &:hover,\n  &:focus {\n    color: @dropdown-link-disabled-color;\n  }\n\n  // Nuke hover/focus effects\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    background-color: transparent;\n    background-image: none; // Remove CSS gradient\n    cursor: @cursor-disabled;\n  }\n}\n\n// Open state for the dropdown\n.open {\n  // Show the menu\n  > .dropdown-menu {\n    display: block;\n  }\n\n  // Remove the outline when :focus is triggered\n  > a {\n    outline: 0;\n  }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n  left: auto; // Reset the default from `.dropdown-menu`\n  right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n  left: 0;\n  right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n  display: block;\n  padding: 3px 20px;\n  font-size: @font-size-small;\n  line-height: @line-height-base;\n  color: @dropdown-header-color;\n  white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n  position: fixed;\n  left: 0;\n  right: 0;\n  bottom: 0;\n  top: 0;\n  z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n  right: 0;\n  left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n  // Reverse the caret\n  .caret {\n    border-top: 0;\n    border-bottom: @caret-width-base solid;\n    content: \"\";\n  }\n  // Different positioning for bottom up menu\n  .dropdown-menu {\n    top: auto;\n    bottom: 100%;\n    margin-bottom: 1px;\n  }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-right {\n    .dropdown-menu {\n      .dropdown-menu-right();\n    }\n    // Necessary for overrides of the default right aligned menu.\n    // Will remove come v4 in all likelihood.\n    .dropdown-menu-left {\n      .dropdown-menu-left();\n    }\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/forms.less",
    "content": "//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n  padding: 0;\n  margin: 0;\n  border: 0;\n  // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n  // so we reset that to ensure it behaves more like a standard block element.\n  // See https://github.com/twbs/bootstrap/issues/12359.\n  min-width: 0;\n}\n\nlegend {\n  display: block;\n  width: 100%;\n  padding: 0;\n  margin-bottom: @line-height-computed;\n  font-size: (@font-size-base * 1.5);\n  line-height: inherit;\n  color: @legend-color;\n  border: 0;\n  border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n  display: inline-block;\n  max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n  margin-bottom: 5px;\n  font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n  .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  margin: 4px 0 0;\n  margin-top: 1px \\9; // IE8-9\n  line-height: normal;\n}\n\n// Set the height of file controls to match text inputs\ninput[type=\"file\"] {\n  display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n  display: block;\n  width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n  height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n  .tab-focus();\n}\n\n// Adjust output element\noutput {\n  display: block;\n  padding-top: (@padding-base-vertical + 1);\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n  display: block;\n  width: 100%;\n  height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @input-color;\n  background-color: @input-bg;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid @input-border;\n  border-radius: @input-border-radius;\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n  .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n  // Customize the `:focus` state to imitate native WebKit styles.\n  .form-control-focus();\n\n  // Placeholder\n  .placeholder();\n\n  // Disabled and read-only inputs\n  //\n  // HTML5 says that controls under a fieldset > legend:first-child won't be\n  // disabled if the fieldset is disabled. Due to implementation difficulty, we\n  // don't honor that edge case; we style them as disabled anyway.\n  &[disabled],\n  &[readonly],\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n    background-color: @input-bg-disabled;\n    opacity: 1; // iOS fix for unreadable disabled content\n  }\n\n  // Reset height for `textarea`s\n  textarea& {\n    height: auto;\n  }\n}\n\n\n// Search inputs in iOS\n//\n// This overrides the extra rounded corners on search inputs in iOS so that our\n// `.form-control` class can properly style them. Note that this cannot simply\n// be added to `.form-control` as it's not specific enough. For details, see\n// https://github.com/twbs/bootstrap/issues/11586.\n\ninput[type=\"search\"] {\n  -webkit-appearance: none;\n}\n\n\n// Special styles for iOS temporal inputs\n//\n// In Mobile Safari, setting `display: block` on temporal inputs causes the\n// text within the input to become vertically misaligned. As a workaround, we\n// set a pixel line-height that matches the given height of the input, but only\n// for Safari.\n\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n  input[type=\"date\"],\n  input[type=\"time\"],\n  input[type=\"datetime-local\"],\n  input[type=\"month\"] {\n    line-height: @input-height-base;\n  }\n  input[type=\"date\"].input-sm,\n  input[type=\"time\"].input-sm,\n  input[type=\"datetime-local\"].input-sm,\n  input[type=\"month\"].input-sm {\n    line-height: @input-height-small;\n  }\n  input[type=\"date\"].input-lg,\n  input[type=\"time\"].input-lg,\n  input[type=\"datetime-local\"].input-lg,\n  input[type=\"month\"].input-lg {\n    line-height: @input-height-large;\n  }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n  position: relative;\n  display: block;\n  margin-top: 10px;\n  margin-bottom: 10px;\n\n  label {\n    min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n    padding-left: 20px;\n    margin-bottom: 0;\n    font-weight: normal;\n    cursor: pointer;\n  }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n  position: absolute;\n  margin-left: -20px;\n  margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n  margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n  display: inline-block;\n  padding-left: 20px;\n  margin-bottom: 0;\n  vertical-align: middle;\n  font-weight: normal;\n  cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n  margin-top: 0;\n  margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n  &[disabled],\n  &.disabled,\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n  }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n  &.disabled,\n  fieldset[disabled] & {\n    cursor: @cursor-disabled;\n  }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n  &.disabled,\n  fieldset[disabled] & {\n    label {\n      cursor: @cursor-disabled;\n    }\n  }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n  // Size it appropriately next to real form controls\n  padding-top: (@padding-base-vertical + 1);\n  padding-bottom: (@padding-base-vertical + 1);\n  // Remove default margin from `p`\n  margin-bottom: 0;\n\n  &.input-lg,\n  &.input-sm {\n    padding-left: 0;\n    padding-right: 0;\n  }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n\n.input-sm,\n.form-group-sm .form-control {\n  .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n}\n\n.input-lg,\n.form-group-lg .form-control {\n  .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n  // Enable absolute positioning\n  position: relative;\n\n  // Ensure icons don't overlap text\n  .form-control {\n    padding-right: (@input-height-base * 1.25);\n  }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n  position: absolute;\n  top: 0;\n  right: 0;\n  z-index: 2; // Ensure icon is above input groups\n  display: block;\n  width: @input-height-base;\n  height: @input-height-base;\n  line-height: @input-height-base;\n  text-align: center;\n  pointer-events: none;\n}\n.input-lg + .form-control-feedback {\n  width: @input-height-large;\n  height: @input-height-large;\n  line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback {\n  width: @input-height-small;\n  height: @input-height-small;\n  line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n  .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n  .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n  .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n  & ~ .form-control-feedback {\n     top: (@line-height-computed + 5); // Height of the `label` and its margin\n  }\n  &.sr-only ~ .form-control-feedback {\n     top: 0;\n  }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n  display: block; // account for any element using help-block\n  margin-top: 5px;\n  margin-bottom: 10px;\n  color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n  // Kick in the inline\n  @media (min-width: @screen-sm-min) {\n    // Inline-block all the things for \"inline\"\n    .form-group {\n      display: inline-block;\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // In navbar-form, allow folks to *not* use `.form-group`\n    .form-control {\n      display: inline-block;\n      width: auto; // Prevent labels from stacking above inputs in `.form-group`\n      vertical-align: middle;\n    }\n\n    // Make static controls behave like regular ones\n    .form-control-static {\n      display: inline-block;\n    }\n\n    .input-group {\n      display: inline-table;\n      vertical-align: middle;\n\n      .input-group-addon,\n      .input-group-btn,\n      .form-control {\n        width: auto;\n      }\n    }\n\n    // Input groups need that 100% width though\n    .input-group > .form-control {\n      width: 100%;\n    }\n\n    .control-label {\n      margin-bottom: 0;\n      vertical-align: middle;\n    }\n\n    // Remove default margin on radios/checkboxes that were used for stacking, and\n    // then undo the floating of radios and checkboxes to match (which also avoids\n    // a bug in WebKit: https://github.com/twbs/bootstrap/issues/1969).\n    .radio,\n    .checkbox {\n      display: inline-block;\n      margin-top: 0;\n      margin-bottom: 0;\n      vertical-align: middle;\n\n      label {\n        padding-left: 0;\n      }\n    }\n    .radio input[type=\"radio\"],\n    .checkbox input[type=\"checkbox\"] {\n      position: relative;\n      margin-left: 0;\n    }\n\n    // Re-override the feedback icon.\n    .has-feedback .form-control-feedback {\n      top: 0;\n    }\n  }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n  // Consistent vertical alignment of radios and checkboxes\n  //\n  // Labels also get some reset styles, but that is scoped to a media query below.\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline {\n    margin-top: 0;\n    margin-bottom: 0;\n    padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n  }\n  // Account for padding we're adding to ensure the alignment and of help text\n  // and other content below items\n  .radio,\n  .checkbox {\n    min-height: (@line-height-computed + (@padding-base-vertical + 1));\n  }\n\n  // Make form groups behave like rows\n  .form-group {\n    .make-row();\n  }\n\n  // Reset spacing and right align labels, but scope to media queries so that\n  // labels on narrow viewports stack the same as a default form example.\n  @media (min-width: @screen-sm-min) {\n    .control-label {\n      text-align: right;\n      margin-bottom: 0;\n      padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n    }\n  }\n\n  // Validation states\n  //\n  // Reposition the icon because it's now within a grid column and columns have\n  // `position: relative;` on them. Also accounts for the grid gutter padding.\n  .has-feedback .form-control-feedback {\n    right: (@grid-gutter-width / 2);\n  }\n\n  // Form group sizes\n  //\n  // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n  // inputs and labels within a `.form-group`.\n  .form-group-lg {\n    @media (min-width: @screen-sm-min) {\n      .control-label {\n        padding-top: ((@padding-large-vertical * @line-height-large) + 1);\n      }\n    }\n  }\n  .form-group-sm {\n    @media (min-width: @screen-sm-min) {\n      .control-label {\n        padding-top: (@padding-small-vertical + 1);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/glyphicons.less",
    "content": "//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// <a href=\"#\"><span class=\"glyphicon glyphicon-star\"></span> Star</a>\n\n// Import the fonts\n@font-face {\n  font-family: 'Glyphicons Halflings';\n  src: url('@{icon-font-path}@{icon-font-name}.eot');\n  src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n       url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n       url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n       url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n  position: relative;\n  top: 1px;\n  display: inline-block;\n  font-family: 'Glyphicons Halflings';\n  font-style: normal;\n  font-weight: normal;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk               { &:before { content: \"\\2a\"; } }\n.glyphicon-plus                   { &:before { content: \"\\2b\"; } }\n.glyphicon-euro,\n.glyphicon-eur                    { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus                  { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud                  { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope               { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil                 { &:before { content: \"\\270f\"; } }\n.glyphicon-glass                  { &:before { content: \"\\e001\"; } }\n.glyphicon-music                  { &:before { content: \"\\e002\"; } }\n.glyphicon-search                 { &:before { content: \"\\e003\"; } }\n.glyphicon-heart                  { &:before { content: \"\\e005\"; } }\n.glyphicon-star                   { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty             { &:before { content: \"\\e007\"; } }\n.glyphicon-user                   { &:before { content: \"\\e008\"; } }\n.glyphicon-film                   { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large               { &:before { content: \"\\e010\"; } }\n.glyphicon-th                     { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list                { &:before { content: \"\\e012\"; } }\n.glyphicon-ok                     { &:before { content: \"\\e013\"; } }\n.glyphicon-remove                 { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in                { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out               { &:before { content: \"\\e016\"; } }\n.glyphicon-off                    { &:before { content: \"\\e017\"; } }\n.glyphicon-signal                 { &:before { content: \"\\e018\"; } }\n.glyphicon-cog                    { &:before { content: \"\\e019\"; } }\n.glyphicon-trash                  { &:before { content: \"\\e020\"; } }\n.glyphicon-home                   { &:before { content: \"\\e021\"; } }\n.glyphicon-file                   { &:before { content: \"\\e022\"; } }\n.glyphicon-time                   { &:before { content: \"\\e023\"; } }\n.glyphicon-road                   { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt           { &:before { content: \"\\e025\"; } }\n.glyphicon-download               { &:before { content: \"\\e026\"; } }\n.glyphicon-upload                 { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox                  { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle            { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat                 { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh                { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt               { &:before { content: \"\\e032\"; } }\n.glyphicon-lock                   { &:before { content: \"\\e033\"; } }\n.glyphicon-flag                   { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones             { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off             { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down            { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up              { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode                 { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode                { &:before { content: \"\\e040\"; } }\n.glyphicon-tag                    { &:before { content: \"\\e041\"; } }\n.glyphicon-tags                   { &:before { content: \"\\e042\"; } }\n.glyphicon-book                   { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark               { &:before { content: \"\\e044\"; } }\n.glyphicon-print                  { &:before { content: \"\\e045\"; } }\n.glyphicon-camera                 { &:before { content: \"\\e046\"; } }\n.glyphicon-font                   { &:before { content: \"\\e047\"; } }\n.glyphicon-bold                   { &:before { content: \"\\e048\"; } }\n.glyphicon-italic                 { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height            { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width             { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left             { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center           { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right            { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify          { &:before { content: \"\\e055\"; } }\n.glyphicon-list                   { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left            { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right           { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video         { &:before { content: \"\\e059\"; } }\n.glyphicon-picture                { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker             { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust                 { &:before { content: \"\\e063\"; } }\n.glyphicon-tint                   { &:before { content: \"\\e064\"; } }\n.glyphicon-edit                   { &:before { content: \"\\e065\"; } }\n.glyphicon-share                  { &:before { content: \"\\e066\"; } }\n.glyphicon-check                  { &:before { content: \"\\e067\"; } }\n.glyphicon-move                   { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward          { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward          { &:before { content: \"\\e070\"; } }\n.glyphicon-backward               { &:before { content: \"\\e071\"; } }\n.glyphicon-play                   { &:before { content: \"\\e072\"; } }\n.glyphicon-pause                  { &:before { content: \"\\e073\"; } }\n.glyphicon-stop                   { &:before { content: \"\\e074\"; } }\n.glyphicon-forward                { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward           { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward           { &:before { content: \"\\e077\"; } }\n.glyphicon-eject                  { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left           { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right          { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign              { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign             { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign            { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign                { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign          { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign              { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot             { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle          { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle              { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle             { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left             { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right            { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up               { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down             { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt              { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full            { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small           { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign       { &:before { content: \"\\e101\"; } }\n.glyphicon-gift                   { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf                   { &:before { content: \"\\e103\"; } }\n.glyphicon-fire                   { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open               { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close              { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign           { &:before { content: \"\\e107\"; } }\n.glyphicon-plane                  { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar               { &:before { content: \"\\e109\"; } }\n.glyphicon-random                 { &:before { content: \"\\e110\"; } }\n.glyphicon-comment                { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet                 { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up             { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down           { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet                { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart          { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close           { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open            { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical        { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal      { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd                    { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn               { &:before { content: \"\\e122\"; } }\n.glyphicon-bell                   { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate            { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up              { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down            { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right             { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left              { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up                { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down              { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right     { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left      { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up        { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down      { &:before { content: \"\\e134\"; } }\n.glyphicon-globe                  { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench                 { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks                  { &:before { content: \"\\e137\"; } }\n.glyphicon-filter                 { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase              { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen             { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard              { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip              { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty            { &:before { content: \"\\e143\"; } }\n.glyphicon-link                   { &:before { content: \"\\e144\"; } }\n.glyphicon-phone                  { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin                { &:before { content: \"\\e146\"; } }\n.glyphicon-usd                    { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp                    { &:before { content: \"\\e149\"; } }\n.glyphicon-sort                   { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet       { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt   { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order          { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt      { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes     { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked              { &:before { content: \"\\e157\"; } }\n.glyphicon-expand                 { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down          { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up            { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in                 { &:before { content: \"\\e161\"; } }\n.glyphicon-flash                  { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out                { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window             { &:before { content: \"\\e164\"; } }\n.glyphicon-record                 { &:before { content: \"\\e165\"; } }\n.glyphicon-save                   { &:before { content: \"\\e166\"; } }\n.glyphicon-open                   { &:before { content: \"\\e167\"; } }\n.glyphicon-saved                  { &:before { content: \"\\e168\"; } }\n.glyphicon-import                 { &:before { content: \"\\e169\"; } }\n.glyphicon-export                 { &:before { content: \"\\e170\"; } }\n.glyphicon-send                   { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk            { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved           { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove          { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save            { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open            { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card            { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer               { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery                { &:before { content: \"\\e179\"; } }\n.glyphicon-header                 { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed             { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone               { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt              { &:before { content: \"\\e183\"; } }\n.glyphicon-tower                  { &:before { content: \"\\e184\"; } }\n.glyphicon-stats                  { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video               { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video               { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles              { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo           { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby            { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1              { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1              { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1              { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark         { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark      { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download         { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload           { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer           { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous         { &:before { content: \"\\e200\"; } }\n"
  },
  {
    "path": "less/bootstrap/grid.less",
    "content": "//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n  .container-fixed();\n\n  @media (min-width: @screen-sm-min) {\n    width: @container-sm;\n  }\n  @media (min-width: @screen-md-min) {\n    width: @container-md;\n  }\n  @media (min-width: @screen-lg-min) {\n    width: @container-lg;\n  }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n  .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n  .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n  .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n  .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n  .make-grid(lg);\n}\n"
  },
  {
    "path": "less/bootstrap/input-groups.less",
    "content": "//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n  position: relative; // For dropdowns\n  display: table;\n  border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n  // Undo padding and float of grid classes\n  &[class*=\"col-\"] {\n    float: none;\n    padding-left: 0;\n    padding-right: 0;\n  }\n\n  .form-control {\n    // Ensure that the input is always above the *appended* addon button for\n    // proper border colors.\n    position: relative;\n    z-index: 2;\n\n    // IE9 fubars the placeholder attribute in text inputs and the arrows on\n    // select elements in input groups. To fix it, we float the input. Details:\n    // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n    float: left;\n\n    width: 100%;\n    margin-bottom: 0;\n  }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n  .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n  .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n  display: table-cell;\n\n  &:not(:first-child):not(:last-child) {\n    border-radius: 0;\n  }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n  width: 1%;\n  white-space: nowrap;\n  vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n  padding: @padding-base-vertical @padding-base-horizontal;\n  font-size: @font-size-base;\n  font-weight: normal;\n  line-height: 1;\n  color: @input-color;\n  text-align: center;\n  background-color: @input-group-addon-bg;\n  border: 1px solid @input-group-addon-border-color;\n  border-radius: @border-radius-base;\n\n  // Sizing\n  &.input-sm {\n    padding: @padding-small-vertical @padding-small-horizontal;\n    font-size: @font-size-small;\n    border-radius: @border-radius-small;\n  }\n  &.input-lg {\n    padding: @padding-large-vertical @padding-large-horizontal;\n    font-size: @font-size-large;\n    border-radius: @border-radius-large;\n  }\n\n  // Nuke default margins from checkboxes and radios to vertically center within.\n  input[type=\"radio\"],\n  input[type=\"checkbox\"] {\n    margin-top: 0;\n  }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n  .border-right-radius(0);\n}\n.input-group-addon:first-child {\n  border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n  .border-left-radius(0);\n}\n.input-group-addon:last-child {\n  border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n  position: relative;\n  // Jankily prevent input button groups from wrapping with `white-space` and\n  // `font-size` in combination with `inline-block` on buttons.\n  font-size: 0;\n  white-space: nowrap;\n\n  // Negative margin for spacing, position for bringing hovered/focused/actived\n  // element above the siblings.\n  > .btn {\n    position: relative;\n    + .btn {\n      margin-left: -1px;\n    }\n    // Bring the \"active\" button to the front\n    &:hover,\n    &:focus,\n    &:active {\n      z-index: 2;\n    }\n  }\n\n  // Negative margin to only have a 1px border between the two\n  &:first-child {\n    > .btn,\n    > .btn-group {\n      margin-right: -1px;\n    }\n  }\n  &:last-child {\n    > .btn,\n    > .btn-group {\n      margin-left: -1px;\n    }\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/jumbotron.less",
    "content": "//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n  padding: @jumbotron-padding (@jumbotron-padding / 2);\n  margin-bottom: @jumbotron-padding;\n  color: @jumbotron-color;\n  background-color: @jumbotron-bg;\n\n  h1,\n  .h1 {\n    color: @jumbotron-heading-color;\n  }\n  p {\n    margin-bottom: (@jumbotron-padding / 2);\n    font-size: @jumbotron-font-size;\n    font-weight: 200;\n  }\n\n  > hr {\n    border-top-color: darken(@jumbotron-bg, 10%);\n  }\n\n  .container &,\n  .container-fluid & {\n    border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n  }\n\n  .container {\n    max-width: 100%;\n  }\n\n  @media screen and (min-width: @screen-sm-min) {\n    padding: (@jumbotron-padding * 1.6) 0;\n\n    .container &,\n    .container-fluid & {\n      padding-left:  (@jumbotron-padding * 2);\n      padding-right: (@jumbotron-padding * 2);\n    }\n\n    h1,\n    .h1 {\n      font-size: (@font-size-base * 4.5);\n    }\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/labels.less",
    "content": "//\n// Labels\n// --------------------------------------------------\n\n.label {\n  display: inline;\n  padding: .2em .6em .3em;\n  font-size: 75%;\n  font-weight: bold;\n  line-height: 1;\n  color: @label-color;\n  text-align: center;\n  white-space: nowrap;\n  vertical-align: baseline;\n  border-radius: .25em;\n\n  // Add hover effects, but only for links\n  a& {\n    &:hover,\n    &:focus {\n      color: @label-link-hover-color;\n      text-decoration: none;\n      cursor: pointer;\n    }\n  }\n\n  // Empty labels collapse automatically (not available in IE8)\n  &:empty {\n    display: none;\n  }\n\n  // Quick fix for labels in buttons\n  .btn & {\n    position: relative;\n    top: -1px;\n  }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n  .label-variant(@label-default-bg);\n}\n\n.label-primary {\n  .label-variant(@label-primary-bg);\n}\n\n.label-success {\n  .label-variant(@label-success-bg);\n}\n\n.label-info {\n  .label-variant(@label-info-bg);\n}\n\n.label-warning {\n  .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n  .label-variant(@label-danger-bg);\n}\n"
  },
  {
    "path": "less/bootstrap/list-group.less",
    "content": "//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on <ul>, <ol>, or <div>.\n\n.list-group {\n  // No need to set list-style: none; since .list-group-item is block level\n  margin-bottom: 20px;\n  padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n  position: relative;\n  display: block;\n  padding: 10px 15px;\n  // Place the border on the list items and negative margin up for better styling\n  margin-bottom: -1px;\n  background-color: @list-group-bg;\n  border: 1px solid @list-group-border;\n\n  // Round the first and last items\n  &:first-child {\n    .border-top-radius(@list-group-border-radius);\n  }\n  &:last-child {\n    margin-bottom: 0;\n    .border-bottom-radius(@list-group-border-radius);\n  }\n}\n\n\n// Linked list items\n//\n// Use anchor elements instead of `li`s or `div`s to create linked list items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item {\n  color: @list-group-link-color;\n\n  .list-group-item-heading {\n    color: @list-group-link-heading-color;\n  }\n\n  // Hover state\n  &:hover,\n  &:focus {\n    text-decoration: none;\n    color: @list-group-link-hover-color;\n    background-color: @list-group-hover-bg;\n  }\n}\n\n.list-group-item {\n  // Disabled state\n  &.disabled,\n  &.disabled:hover,\n  &.disabled:focus {\n    background-color: @list-group-disabled-bg;\n    color: @list-group-disabled-color;\n    cursor: @cursor-disabled;\n\n    // Force color to inherit for custom content\n    .list-group-item-heading {\n      color: inherit;\n    }\n    .list-group-item-text {\n      color: @list-group-disabled-text-color;\n    }\n  }\n\n  // Active class on item itself, not parent\n  &.active,\n  &.active:hover,\n  &.active:focus {\n    z-index: 2; // Place active items above their siblings for proper border styling\n    color: @list-group-active-color;\n    background-color: @list-group-active-bg;\n    border-color: @list-group-active-border;\n\n    // Force color to inherit for custom content\n    .list-group-item-heading,\n    .list-group-item-heading > small,\n    .list-group-item-heading > .small {\n      color: inherit;\n    }\n    .list-group-item-text {\n      color: @list-group-active-text-color;\n    }\n  }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n.list-group-item-text {\n  margin-bottom: 0;\n  line-height: 1.3;\n}\n"
  },
  {
    "path": "less/bootstrap/media.less",
    "content": ".media {\n  // Proper spacing between instances of .media\n  margin-top: 15px;\n\n  &:first-child {\n    margin-top: 0;\n  }\n}\n\n.media-right,\n.media > .pull-right {\n  padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n  padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n  display: table-cell;\n  vertical-align: top;\n}\n\n.media-middle {\n  vertical-align: middle;\n}\n\n.media-bottom {\n  vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n  margin-top: 0;\n  margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n  padding-left: 0;\n  list-style: none;\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/alerts.less",
    "content": "// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n  background-color: @background;\n  border-color: @border;\n  color: @text-color;\n\n  hr {\n    border-top-color: darken(@border, 5%);\n  }\n  .alert-link {\n    color: darken(@text-color, 10%);\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/background-variant.less",
    "content": "// Contextual backgrounds\n\n.bg-variant(@color) {\n  background-color: @color;\n  a&:hover {\n    background-color: darken(@color, 10%);\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/border-radius.less",
    "content": "// Single side border-radius\n\n.border-top-radius(@radius) {\n  border-top-right-radius: @radius;\n   border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n  border-bottom-right-radius: @radius;\n     border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n  border-bottom-right-radius: @radius;\n   border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n  border-bottom-left-radius: @radius;\n     border-top-left-radius: @radius;\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/buttons.less",
    "content": "// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n  color: @color;\n  background-color: @background;\n  border-color: @border;\n\n  &:hover,\n  &:focus,\n  &.focus,\n  &:active,\n  &.active,\n  .open > .dropdown-toggle& {\n    color: @color;\n    background-color: darken(@background, 10%);\n        border-color: darken(@border, 12%);\n  }\n  &:active,\n  &.active,\n  .open > .dropdown-toggle& {\n    background-image: none;\n  }\n  &.disabled,\n  &[disabled],\n  fieldset[disabled] & {\n    &,\n    &:hover,\n    &:focus,\n    &.focus,\n    &:active,\n    &.active {\n      background-color: @background;\n          border-color: @border;\n    }\n  }\n\n  .badge {\n    color: @background;\n    background-color: @color;\n  }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  padding: @padding-vertical @padding-horizontal;\n  font-size: @font-size;\n  line-height: @line-height;\n  border-radius: @border-radius;\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/center-block.less",
    "content": "// Center-align a block level element\n\n.center-block() {\n  display: block;\n  margin-left: auto;\n  margin-right: auto;\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/clearfix.less",
    "content": "// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n//    contenteditable attribute is included anywhere else in the document.\n//    Otherwise it causes space to appear at the top and bottom of elements\n//    that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n//    `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n  &:before,\n  &:after {\n    content: \" \"; // 1\n    display: table; // 2\n  }\n  &:after {\n    clear: both;\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/forms.less",
    "content": "// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n  // Color the label and help text\n  .help-block,\n  .control-label,\n  .radio,\n  .checkbox,\n  .radio-inline,\n  .checkbox-inline,\n  &.radio label,\n  &.checkbox label,\n  &.radio-inline label,\n  &.checkbox-inline label  {\n    color: @text-color;\n  }\n  // Set the border and box shadow on specific inputs to match\n  .form-control {\n    border-color: @border-color;\n    .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work\n    &:focus {\n      border-color: darken(@border-color, 10%);\n      @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n      .box-shadow(@shadow);\n    }\n  }\n  // Set validation states also for addons\n  .input-group-addon {\n    color: @text-color;\n    border-color: @border-color;\n    background-color: @background-color;\n  }\n  // Optional feedback icon\n  .form-control-feedback {\n    color: @text-color;\n  }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n  @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n  &:focus {\n    border-color: @color;\n    outline: 0;\n    .box-shadow(~\"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}\");\n  }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n  height: @input-height;\n  padding: @padding-vertical @padding-horizontal;\n  font-size: @font-size;\n  line-height: @line-height;\n  border-radius: @border-radius;\n\n  select& {\n    height: @input-height;\n    line-height: @input-height;\n  }\n\n  textarea&,\n  select[multiple]& {\n    height: auto;\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/gradients.less",
    "content": "// Gradients\n\n#gradient {\n\n  // Horizontal gradient, from left to right\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n    background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  // Vertical gradient, from top to bottom\n  //\n  // Creates two color stops, start and end, by specifying a color and position for each color stop.\n  // Color stops are not available in IE9 and below.\n  .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n    background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent);  // Opera 12\n    background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n    background-repeat: repeat-x;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n  }\n\n  .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n    background-repeat: repeat-x;\n    background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n    background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n    background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n  }\n  .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n    background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n    background-repeat: no-repeat;\n    filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n  }\n  .radial(@inner-color: #555; @outer-color: #333) {\n    background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n    background-image: radial-gradient(circle, @inner-color, @outer-color);\n    background-repeat: no-repeat;\n  }\n  .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n    background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n    background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/grid-framework.less",
    "content": "// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n  // Common styles for all sizes of grid columns, widths 1-12\n  .col(@index) { // initial\n    @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n    .col((@index + 1), @item);\n  }\n  .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n    @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n    .col((@index + 1), ~\"@{list}, @{item}\");\n  }\n  .col(@index, @list) when (@index > @grid-columns) { // terminal\n    @{list} {\n      position: relative;\n      // Prevent columns from collapsing when empty\n      min-height: 1px;\n      // Inner gutter via padding\n      padding-left:  (@grid-gutter-width / 2);\n      padding-right: (@grid-gutter-width / 2);\n    }\n  }\n  .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n  .col(@index) { // initial\n    @item: ~\".col-@{class}-@{index}\";\n    .col((@index + 1), @item);\n  }\n  .col(@index, @list) when (@index =< @grid-columns) { // general\n    @item: ~\".col-@{class}-@{index}\";\n    .col((@index + 1), ~\"@{list}, @{item}\");\n  }\n  .col(@index, @list) when (@index > @grid-columns) { // terminal\n    @{list} {\n      float: left;\n    }\n  }\n  .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n  .col-@{class}-@{index} {\n    width: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n  .col-@{class}-push-@{index} {\n    left: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n  .col-@{class}-push-0 {\n    left: auto;\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n  .col-@{class}-pull-@{index} {\n    right: percentage((@index / @grid-columns));\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n  .col-@{class}-pull-0 {\n    right: auto;\n  }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n  .col-@{class}-offset-@{index} {\n    margin-left: percentage((@index / @grid-columns));\n  }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n  .calc-grid-column(@index, @class, @type);\n  // next iteration\n  .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n  .float-grid-columns(@class);\n  .loop-grid-columns(@grid-columns, @class, width);\n  .loop-grid-columns(@grid-columns, @class, pull);\n  .loop-grid-columns(@grid-columns, @class, push);\n  .loop-grid-columns(@grid-columns, @class, offset);\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/grid.less",
    "content": "// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n  margin-right: auto;\n  margin-left: auto;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n  &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n  margin-left:  (@gutter / -2);\n  margin-right: (@gutter / -2);\n  &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  float: left;\n  width: percentage((@columns / @grid-columns));\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n  margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n  left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n  right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-sm-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-offset(@columns) {\n  @media (min-width: @screen-sm-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-push(@columns) {\n  @media (min-width: @screen-sm-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-sm-column-pull(@columns) {\n  @media (min-width: @screen-sm-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-md-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-offset(@columns) {\n  @media (min-width: @screen-md-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-push(@columns) {\n  @media (min-width: @screen-md-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-md-column-pull(@columns) {\n  @media (min-width: @screen-md-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n  position: relative;\n  min-height: 1px;\n  padding-left:  (@gutter / 2);\n  padding-right: (@gutter / 2);\n\n  @media (min-width: @screen-lg-min) {\n    float: left;\n    width: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-offset(@columns) {\n  @media (min-width: @screen-lg-min) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-push(@columns) {\n  @media (min-width: @screen-lg-min) {\n    left: percentage((@columns / @grid-columns));\n  }\n}\n.make-lg-column-pull(@columns) {\n  @media (min-width: @screen-lg-min) {\n    right: percentage((@columns / @grid-columns));\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/hide-text.less",
    "content": "// CSS image replacement\n//\n// Heads up! v3 launched with with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (will be removed in v4)\n.hide-text() {\n  font: ~\"0/0\" a;\n  color: transparent;\n  text-shadow: none;\n  background-color: transparent;\n  border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n  .hide-text();\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/image.less",
    "content": "// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n  display: @display;\n  max-width: 100%; // Part 1: Set a maximum relative to the parent\n  height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n  background-image: url(\"@{file-1x}\");\n\n  @media\n  only screen and (-webkit-min-device-pixel-ratio: 2),\n  only screen and (   min--moz-device-pixel-ratio: 2),\n  only screen and (     -o-min-device-pixel-ratio: 2/1),\n  only screen and (        min-device-pixel-ratio: 2),\n  only screen and (                min-resolution: 192dpi),\n  only screen and (                min-resolution: 2dppx) {\n    background-image: url(\"@{file-2x}\");\n    background-size: @width-1x @height-1x;\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/labels.less",
    "content": "// Labels\n\n.label-variant(@color) {\n  background-color: @color;\n\n  &[href] {\n    &:hover,\n    &:focus {\n      background-color: darken(@color, 10%);\n    }\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/list-group.less",
    "content": "// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n  .list-group-item-@{state} {\n    color: @color;\n    background-color: @background;\n\n    a& {\n      color: @color;\n\n      .list-group-item-heading {\n        color: inherit;\n      }\n\n      &:hover,\n      &:focus {\n        color: @color;\n        background-color: darken(@background, 5%);\n      }\n      &.active,\n      &.active:hover,\n      &.active:focus {\n        color: #fff;\n        background-color: @color;\n        border-color: @color;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/nav-divider.less",
    "content": "// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n  height: 1px;\n  margin: ((@line-height-computed / 2) - 1) 0;\n  overflow: hidden;\n  background-color: @color;\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/nav-vertical-align.less",
    "content": "// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n  margin-top: ((@navbar-height - @element-height) / 2);\n  margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/opacity.less",
    "content": "// Opacity\n\n.opacity(@opacity) {\n  opacity: @opacity;\n  // IE8 filter\n  @opacity-ie: (@opacity * 100);\n  filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/pagination.less",
    "content": "// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @border-radius) {\n  > li {\n    > a,\n    > span {\n      padding: @padding-vertical @padding-horizontal;\n      font-size: @font-size;\n    }\n    &:first-child {\n      > a,\n      > span {\n        .border-left-radius(@border-radius);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius);\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/panels.less",
    "content": "// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n  border-color: @border;\n\n  & > .panel-heading {\n    color: @heading-text-color;\n    background-color: @heading-bg-color;\n    border-color: @heading-border;\n\n    + .panel-collapse > .panel-body {\n      border-top-color: @border;\n    }\n    .badge {\n      color: @heading-bg-color;\n      background-color: @heading-text-color;\n    }\n  }\n  & > .panel-footer {\n    + .panel-collapse > .panel-body {\n      border-bottom-color: @border;\n    }\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/progress-bar.less",
    "content": "// Progress bars\n\n.progress-bar-variant(@color) {\n  background-color: @color;\n\n  // Deprecated parent class requirement as of v3.2.0\n  .progress-striped & {\n    #gradient > .striped();\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/reset-filter.less",
    "content": "// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n  filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/resize.less",
    "content": "// Resize anything\n\n.resizable(@direction) {\n  resize: @direction; // Options: horizontal, vertical, both\n  overflow: auto; // Per CSS3 UI, `resize` only applies when `overflow` isn't `visible`\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/responsive-visibility.less",
    "content": "// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n  display: block !important;\n  table&  { display: table; }\n  tr&     { display: table-row !important; }\n  th&,\n  td&     { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n  display: none !important;\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/size.less",
    "content": "// Sizing shortcuts\n\n.size(@width; @height) {\n  width: @width;\n  height: @height;\n}\n\n.square(@size) {\n  .size(@size; @size);\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/tab-focus.less",
    "content": "// WebKit-style focus\n\n.tab-focus() {\n  // Default\n  outline: thin dotted;\n  // WebKit\n  outline: 5px auto -webkit-focus-ring-color;\n  outline-offset: -2px;\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/table-row.less",
    "content": "// Tables\n\n.table-row-variant(@state; @background) {\n  // Exact selectors below required to override `.table-striped` and prevent\n  // inheritance to nested tables.\n  .table > thead > tr,\n  .table > tbody > tr,\n  .table > tfoot > tr {\n    > td.@{state},\n    > th.@{state},\n    &.@{state} > td,\n    &.@{state} > th {\n      background-color: @background;\n    }\n  }\n\n  // Hover states for `.table-hover`\n  // Note: this is not available for cells or rows within `thead` or `tfoot`.\n  .table-hover > tbody > tr {\n    > td.@{state}:hover,\n    > th.@{state}:hover,\n    &.@{state}:hover > td,\n    &:hover > .@{state},\n    &.@{state}:hover > th {\n      background-color: darken(@background, 5%);\n    }\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/text-emphasis.less",
    "content": "// Typography\n\n.text-emphasis-variant(@color) {\n  color: @color;\n  a&:hover {\n    color: darken(@color, 10%);\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/text-overflow.less",
    "content": "// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n"
  },
  {
    "path": "less/bootstrap/mixins/vendor-prefixes.less",
    "content": "// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They will be removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n  -webkit-animation: @animation;\n       -o-animation: @animation;\n          animation: @animation;\n}\n.animation-name(@name) {\n  -webkit-animation-name: @name;\n          animation-name: @name;\n}\n.animation-duration(@duration) {\n  -webkit-animation-duration: @duration;\n          animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n  -webkit-animation-timing-function: @timing-function;\n          animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n  -webkit-animation-delay: @delay;\n          animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n  -webkit-animation-iteration-count: @iteration-count;\n          animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n  -webkit-animation-direction: @direction;\n          animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n  -webkit-animation-fill-mode: @fill-mode;\n          animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility){\n  -webkit-backface-visibility: @visibility;\n     -moz-backface-visibility: @visibility;\n          backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n  -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n          box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n  -webkit-box-sizing: @boxmodel;\n     -moz-box-sizing: @boxmodel;\n          box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n  -webkit-column-count: @column-count;\n     -moz-column-count: @column-count;\n          column-count: @column-count;\n  -webkit-column-gap: @column-gap;\n     -moz-column-gap: @column-gap;\n          column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n  word-wrap: break-word;\n  -webkit-hyphens: @mode;\n     -moz-hyphens: @mode;\n      -ms-hyphens: @mode; // IE10+\n       -o-hyphens: @mode;\n          hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n  // Firefox\n  &::-moz-placeholder {\n    color: @color;\n    opacity: 1; // See https://github.com/twbs/bootstrap/pull/11526\n  }\n  &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n  &::-webkit-input-placeholder  { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n  -webkit-transform: scale(@ratio);\n      -ms-transform: scale(@ratio); // IE9 only\n       -o-transform: scale(@ratio);\n          transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n  -webkit-transform: scale(@ratioX, @ratioY);\n      -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n       -o-transform: scale(@ratioX, @ratioY);\n          transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n  -webkit-transform: scaleX(@ratio);\n      -ms-transform: scaleX(@ratio); // IE9 only\n       -o-transform: scaleX(@ratio);\n          transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n  -webkit-transform: scaleY(@ratio);\n      -ms-transform: scaleY(@ratio); // IE9 only\n       -o-transform: scaleY(@ratio);\n          transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n  -webkit-transform: skewX(@x) skewY(@y);\n      -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n       -o-transform: skewX(@x) skewY(@y);\n          transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n  -webkit-transform: translate(@x, @y);\n      -ms-transform: translate(@x, @y); // IE9 only\n       -o-transform: translate(@x, @y);\n          transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n  -webkit-transform: translate3d(@x, @y, @z);\n          transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n  -webkit-transform: rotate(@degrees);\n      -ms-transform: rotate(@degrees); // IE9 only\n       -o-transform: rotate(@degrees);\n          transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n  -webkit-transform: rotateX(@degrees);\n      -ms-transform: rotateX(@degrees); // IE9 only\n       -o-transform: rotateX(@degrees);\n          transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n  -webkit-transform: rotateY(@degrees);\n      -ms-transform: rotateY(@degrees); // IE9 only\n       -o-transform: rotateY(@degrees);\n          transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n  -webkit-perspective: @perspective;\n     -moz-perspective: @perspective;\n          perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n  -webkit-perspective-origin: @perspective;\n     -moz-perspective-origin: @perspective;\n          perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n  -webkit-transform-origin: @origin;\n     -moz-transform-origin: @origin;\n      -ms-transform-origin: @origin; // IE9 only\n          transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n  -webkit-transition: @transition;\n       -o-transition: @transition;\n          transition: @transition;\n}\n.transition-property(@transition-property) {\n  -webkit-transition-property: @transition-property;\n          transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n  -webkit-transition-delay: @transition-delay;\n          transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n  -webkit-transition-duration: @transition-duration;\n          transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n  -webkit-transition-timing-function: @timing-function;\n          transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n  -webkit-transition: -webkit-transform @transition;\n     -moz-transition: -moz-transform @transition;\n       -o-transition: -o-transform @transition;\n          transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n  -webkit-user-select: @select;\n     -moz-user-select: @select;\n      -ms-user-select: @select; // IE10+\n          user-select: @select;\n}\n"
  },
  {
    "path": "less/bootstrap/mixins.less",
    "content": "// Mixins\n// --------------------------------------------------\n\n// Utilities\n@import \"mixins/hide-text.less\";\n@import \"mixins/opacity.less\";\n@import \"mixins/image.less\";\n@import \"mixins/labels.less\";\n@import \"mixins/reset-filter.less\";\n@import \"mixins/resize.less\";\n@import \"mixins/responsive-visibility.less\";\n@import \"mixins/size.less\";\n@import \"mixins/tab-focus.less\";\n@import \"mixins/text-emphasis.less\";\n@import \"mixins/text-overflow.less\";\n@import \"mixins/vendor-prefixes.less\";\n\n// Components\n@import \"mixins/alerts.less\";\n@import \"mixins/buttons.less\";\n@import \"mixins/panels.less\";\n@import \"mixins/pagination.less\";\n@import \"mixins/list-group.less\";\n@import \"mixins/nav-divider.less\";\n@import \"mixins/forms.less\";\n@import \"mixins/progress-bar.less\";\n@import \"mixins/table-row.less\";\n\n// Skins\n@import \"mixins/background-variant.less\";\n@import \"mixins/border-radius.less\";\n@import \"mixins/gradients.less\";\n\n// Layout\n@import \"mixins/clearfix.less\";\n@import \"mixins/center-block.less\";\n@import \"mixins/nav-vertical-align.less\";\n@import \"mixins/grid-framework.less\";\n@import \"mixins/grid.less\";\n"
  },
  {
    "path": "less/bootstrap/modals.less",
    "content": "//\n// Modals\n// --------------------------------------------------\n\n// .modal-open      - body class for killing the scroll\n// .modal           - container to scroll within\n// .modal-dialog    - positioning shell for the actual modal\n// .modal-content   - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n  overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n  display: none;\n  overflow: hidden;\n  position: fixed;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  left: 0;\n  z-index: @zindex-modal;\n  -webkit-overflow-scrolling: touch;\n\n  // Prevent Chrome on Windows from adding a focus outline. For details, see\n  // https://github.com/twbs/bootstrap/pull/10951.\n  outline: 0;\n\n  // When fading in the modal, animate it to slide down\n  &.fade .modal-dialog {\n    .translate(0, -25%);\n    .transition-transform(~\"0.3s ease-out\");\n  }\n  &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n  overflow-x: hidden;\n  overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n  position: relative;\n  width: auto;\n  margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n  position: relative;\n  background-color: @modal-content-bg;\n  border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n  border: 1px solid @modal-content-border-color;\n  border-radius: @border-radius-large;\n  .box-shadow(0 3px 9px rgba(0,0,0,.5));\n  background-clip: padding-box;\n  // Remove focus outline from opened modal\n  outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n  position: absolute;\n  top: 0;\n  right: 0;\n  left: 0;\n  background-color: @modal-backdrop-bg;\n  // Fade for backdrop\n  &.fade { .opacity(0); }\n  &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n  padding: @modal-title-padding;\n  border-bottom: 1px solid @modal-header-border-color;\n  min-height: (@modal-title-padding + @modal-title-line-height);\n}\n// Close icon\n.modal-header .close {\n  margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n  margin: 0;\n  line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n  position: relative;\n  padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n  padding: @modal-inner-padding;\n  text-align: right; // right align buttons\n  border-top: 1px solid @modal-footer-border-color;\n  &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n  // Properly space out buttons\n  .btn + .btn {\n    margin-left: 5px;\n    margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n  }\n  // but override that for button groups\n  .btn-group .btn + .btn {\n    margin-left: -1px;\n  }\n  // and override it for block buttons as well\n  .btn-block + .btn-block {\n    margin-left: 0;\n  }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n  position: absolute;\n  top: -9999px;\n  width: 50px;\n  height: 50px;\n  overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n  // Automatically set modal's width for larger viewports\n  .modal-dialog {\n    width: @modal-md;\n    margin: 30px auto;\n  }\n  .modal-content {\n    .box-shadow(0 5px 15px rgba(0,0,0,.5));\n  }\n\n  // Modal sizes\n  .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n  .modal-lg { width: @modal-lg; }\n}\n"
  },
  {
    "path": "less/bootstrap/navbar.less",
    "content": "//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n  position: relative;\n  min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n  margin-bottom: @navbar-margin-bottom;\n  border: 1px solid transparent;\n\n  // Prevent floats from breaking the navbar\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: @navbar-border-radius;\n  }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n  &:extend(.clearfix all);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n  }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n  overflow-x: visible;\n  padding-right: @navbar-padding-horizontal;\n  padding-left:  @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n  &:extend(.clearfix all);\n  -webkit-overflow-scrolling: touch;\n\n  &.in {\n    overflow-y: auto;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border-top: 0;\n    box-shadow: none;\n\n    &.collapse {\n      display: block !important;\n      visibility: visible !important;\n      height: auto !important;\n      padding-bottom: 0; // Override default setting\n      overflow: visible !important;\n    }\n\n    &.in {\n      overflow-y: visible;\n    }\n\n    // Undo the collapse side padding for navbars with containers to ensure\n    // alignment of right-aligned contents.\n    .navbar-fixed-top &,\n    .navbar-static-top &,\n    .navbar-fixed-bottom & {\n      padding-left: 0;\n      padding-right: 0;\n    }\n  }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  .navbar-collapse {\n    max-height: @navbar-collapse-max-height;\n\n    @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n      max-height: 200px;\n    }\n  }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n  > .navbar-header,\n  > .navbar-collapse {\n    margin-right: -@navbar-padding-horizontal;\n    margin-left:  -@navbar-padding-horizontal;\n\n    @media (min-width: @grid-float-breakpoint) {\n      margin-right: 0;\n      margin-left:  0;\n    }\n  }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n  z-index: @zindex-navbar;\n  border-width: 0 0 1px;\n\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  position: fixed;\n  right: 0;\n  left: 0;\n  z-index: @zindex-navbar-fixed;\n\n  // Undo the rounded corners\n  @media (min-width: @grid-float-breakpoint) {\n    border-radius: 0;\n  }\n}\n.navbar-fixed-top {\n  top: 0;\n  border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n  bottom: 0;\n  margin-bottom: 0; // override .navbar defaults\n  border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n  float: left;\n  padding: @navbar-padding-vertical @navbar-padding-horizontal;\n  font-size: @font-size-large;\n  line-height: @line-height-computed;\n  height: @navbar-height;\n\n  &:hover,\n  &:focus {\n    text-decoration: none;\n  }\n\n  > img {\n    display: block;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    .navbar > .container &,\n    .navbar > .container-fluid & {\n      margin-left: -@navbar-padding-horizontal;\n    }\n  }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n  position: relative;\n  float: right;\n  margin-right: @navbar-padding-horizontal;\n  padding: 9px 10px;\n  .navbar-vertical-align(34px);\n  background-color: transparent;\n  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n  border: 1px solid transparent;\n  border-radius: @border-radius-base;\n\n  // We remove the `outline` here, but later compensate by attaching `:hover`\n  // styles to `:focus`.\n  &:focus {\n    outline: 0;\n  }\n\n  // Bars\n  .icon-bar {\n    display: block;\n    width: 22px;\n    height: 2px;\n    border-radius: 1px;\n  }\n  .icon-bar + .icon-bar {\n    margin-top: 4px;\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    display: none;\n  }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n  margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n  > li > a {\n    padding-top:    10px;\n    padding-bottom: 10px;\n    line-height: @line-height-computed;\n  }\n\n  @media (max-width: @grid-float-breakpoint-max) {\n    // Dropdowns get custom display when collapsed\n    .open .dropdown-menu {\n      position: static;\n      float: none;\n      width: auto;\n      margin-top: 0;\n      background-color: transparent;\n      border: 0;\n      box-shadow: none;\n      > li > a,\n      .dropdown-header {\n        padding: 5px 15px 5px 25px;\n      }\n      > li > a {\n        line-height: @line-height-computed;\n        &:hover,\n        &:focus {\n          background-image: none;\n        }\n      }\n    }\n  }\n\n  // Uncollapse the nav\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin: 0;\n\n    > li {\n      float: left;\n      > a {\n        padding-top:    @navbar-padding-vertical;\n        padding-bottom: @navbar-padding-vertical;\n      }\n    }\n  }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n  margin-left: -@navbar-padding-horizontal;\n  margin-right: -@navbar-padding-horizontal;\n  padding: 10px @navbar-padding-horizontal;\n  border-top: 1px solid transparent;\n  border-bottom: 1px solid transparent;\n  @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n\n  // Mixin behavior for optimum display\n  .form-inline();\n\n  .form-group {\n    @media (max-width: @grid-float-breakpoint-max) {\n      margin-bottom: 5px;\n\n      &:last-child {\n        margin-bottom: 0;\n      }\n    }\n  }\n\n  // Vertically center in expanded, horizontal navbar\n  .navbar-vertical-align(@input-height-base);\n\n  // Undo 100% width for pull classes\n  @media (min-width: @grid-float-breakpoint) {\n    width: auto;\n    border: 0;\n    margin-left: 0;\n    margin-right: 0;\n    padding-top: 0;\n    padding-bottom: 0;\n    .box-shadow(none);\n  }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n  margin-top: 0;\n  .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n  .border-top-radius(@navbar-border-radius);\n  .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n  .navbar-vertical-align(@input-height-base);\n\n  &.btn-sm {\n    .navbar-vertical-align(@input-height-small);\n  }\n  &.btn-xs {\n    .navbar-vertical-align(22);\n  }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n  .navbar-vertical-align(@line-height-computed);\n\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    margin-left: @navbar-padding-horizontal;\n    margin-right: @navbar-padding-horizontal;\n  }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n  .navbar-left  { .pull-left(); }\n  .navbar-right {\n    .pull-right();\n    margin-right: -@navbar-padding-horizontal;\n\n    ~ .navbar-right {\n      margin-right: 0;\n    }\n  }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  background-color: @navbar-default-bg;\n  border-color: @navbar-default-border;\n\n  .navbar-brand {\n    color: @navbar-default-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-default-brand-hover-color;\n      background-color: @navbar-default-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-default-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-default-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-hover-color;\n        background-color: @navbar-default-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-active-color;\n        background-color: @navbar-default-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-disabled-color;\n        background-color: @navbar-default-link-disabled-bg;\n      }\n    }\n  }\n\n  .navbar-toggle {\n    border-color: @navbar-default-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-default-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-default-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: @navbar-default-border;\n  }\n\n  // Dropdown menu items\n  .navbar-nav {\n    // Remove background color from open dropdown\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-default-link-active-bg;\n        color: @navbar-default-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display when collapsed\n      .open .dropdown-menu {\n        > li > a {\n          color: @navbar-default-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-hover-color;\n            background-color: @navbar-default-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-active-color;\n            background-color: @navbar-default-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-default-link-disabled-color;\n            background-color: @navbar-default-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n\n  // Links in navbars\n  //\n  // Add a class to ensure links outside the navbar nav are colored correctly.\n\n  .navbar-link {\n    color: @navbar-default-link-color;\n    &:hover {\n      color: @navbar-default-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: @navbar-default-link-color;\n    &:hover,\n    &:focus {\n      color: @navbar-default-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: @navbar-default-link-disabled-color;\n      }\n    }\n  }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n  background-color: @navbar-inverse-bg;\n  border-color: @navbar-inverse-border;\n\n  .navbar-brand {\n    color: @navbar-inverse-brand-color;\n    &:hover,\n    &:focus {\n      color: @navbar-inverse-brand-hover-color;\n      background-color: @navbar-inverse-brand-hover-bg;\n    }\n  }\n\n  .navbar-text {\n    color: @navbar-inverse-color;\n  }\n\n  .navbar-nav {\n    > li > a {\n      color: @navbar-inverse-link-color;\n\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-hover-color;\n        background-color: @navbar-inverse-link-hover-bg;\n      }\n    }\n    > .active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-active-color;\n        background-color: @navbar-inverse-link-active-bg;\n      }\n    }\n    > .disabled > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-disabled-color;\n        background-color: @navbar-inverse-link-disabled-bg;\n      }\n    }\n  }\n\n  // Darken the responsive nav toggle\n  .navbar-toggle {\n    border-color: @navbar-inverse-toggle-border-color;\n    &:hover,\n    &:focus {\n      background-color: @navbar-inverse-toggle-hover-bg;\n    }\n    .icon-bar {\n      background-color: @navbar-inverse-toggle-icon-bar-bg;\n    }\n  }\n\n  .navbar-collapse,\n  .navbar-form {\n    border-color: darken(@navbar-inverse-bg, 7%);\n  }\n\n  // Dropdowns\n  .navbar-nav {\n    > .open > a {\n      &,\n      &:hover,\n      &:focus {\n        background-color: @navbar-inverse-link-active-bg;\n        color: @navbar-inverse-link-active-color;\n      }\n    }\n\n    @media (max-width: @grid-float-breakpoint-max) {\n      // Dropdowns get custom display\n      .open .dropdown-menu {\n        > .dropdown-header {\n          border-color: @navbar-inverse-border;\n        }\n        .divider {\n          background-color: @navbar-inverse-border;\n        }\n        > li > a {\n          color: @navbar-inverse-link-color;\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-hover-color;\n            background-color: @navbar-inverse-link-hover-bg;\n          }\n        }\n        > .active > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-active-color;\n            background-color: @navbar-inverse-link-active-bg;\n          }\n        }\n        > .disabled > a {\n          &,\n          &:hover,\n          &:focus {\n            color: @navbar-inverse-link-disabled-color;\n            background-color: @navbar-inverse-link-disabled-bg;\n          }\n        }\n      }\n    }\n  }\n\n  .navbar-link {\n    color: @navbar-inverse-link-color;\n    &:hover {\n      color: @navbar-inverse-link-hover-color;\n    }\n  }\n\n  .btn-link {\n    color: @navbar-inverse-link-color;\n    &:hover,\n    &:focus {\n      color: @navbar-inverse-link-hover-color;\n    }\n    &[disabled],\n    fieldset[disabled] & {\n      &:hover,\n      &:focus {\n        color: @navbar-inverse-link-disabled-color;\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/navs.less",
    "content": "//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n  margin-bottom: 0;\n  padding-left: 0; // Override default ul/ol\n  list-style: none;\n  &:extend(.clearfix all);\n\n  > li {\n    position: relative;\n    display: block;\n\n    >a, >span {\n      padding: @nav-link-padding;\n      display: block;\n    }\n    >a {\n      position: relative;\n      &:hover,\n      &:focus {\n        text-decoration: none;\n        background-color: @nav-link-hover-bg;\n      }\n    }\n\n    // Disabled state sets text to gray and nukes hover/tab effects\n    &.disabled > a {\n      color: @nav-disabled-link-color;\n\n      &:hover,\n      &:focus {\n        color: @nav-disabled-link-hover-color;\n        text-decoration: none;\n        background-color: transparent;\n        cursor: @cursor-disabled;\n      }\n    }\n  }\n\n  // Open dropdowns\n  .open > a {\n    &,\n    &:hover,\n    &:focus {\n      background-color: @nav-link-hover-bg;\n      border-color: @link-color;\n    }\n  }\n\n  // Nav dividers (deprecated with v3.0.1)\n  //\n  // This should have been removed in v3 with the dropping of `.nav-list`, but\n  // we missed it. We don't currently support this anywhere, but in the interest\n  // of maintaining backward compatibility in case you use it, it's deprecated.\n  .nav-divider {\n    .nav-divider();\n  }\n\n  // Prevent IE8 from misplacing imgs\n  //\n  // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n  > li > a > img {\n    max-width: none;\n  }\n}\n\n/*\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n  border-bottom: 1px solid @nav-tabs-border-color;\n  > li {\n    float: left;\n    // Make the list-items overlay the bottom border\n    margin-bottom: -1px;\n\n    // Actual tabs (as links)\n    >a {\n      margin-right: 2px;\n      line-height: @line-height-base;\n      border: 1px solid transparent;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n      &:hover {\n        border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n      }\n    }\n\n    // Active state, and its :hover to override normal :hover\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-tabs-active-link-hover-color;\n        background-color: @nav-tabs-active-link-hover-bg;\n        border: 1px solid @nav-tabs-active-link-hover-border-color;\n        border-bottom-color: transparent;\n        cursor: default;\n      }\n    }\n  }\n  // pulling this in mainly for less shorthand\n  &.nav-justified {\n    .nav-justified();\n    .nav-tabs-justified();\n  }\n}\n\n*/\n\n// Pills\n// -------------------------\n.nav-pills {\n  > li {\n    float: left;\n\n    // Links rendered as pills\n    > a {\n      border-radius: @nav-pills-border-radius;\n    }\n    + li {\n      margin-left: 2px;\n    }\n\n    // Active state\n    &.active > a {\n      &,\n      &:hover,\n      &:focus {\n        color: @nav-pills-active-link-hover-color;\n        background-color: @nav-pills-active-link-hover-bg;\n      }\n    }\n  }\n}\n\n\n// Stacked pills\n.nav-stacked {\n  > li {\n    float: none;\n    + li {\n      margin-top: 2px;\n      margin-left: 0; // no need for this gap between nav items\n    }\n  }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n  width: 100%;\n\n  > li {\n    float: none;\n    > a {\n      text-align: center;\n      margin-bottom: 5px;\n    }\n  }\n\n  > .dropdown .dropdown-menu {\n    top: auto;\n    left: auto;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li {\n      display: table-cell;\n      width: 1%;\n      > a {\n        margin-bottom: 0;\n      }\n    }\n  }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n  border-bottom: 0;\n\n  > li > a {\n    // Override margin from .nav-tabs\n    margin-right: 0;\n    border-radius: @border-radius-base;\n  }\n\n  > .active > a,\n  > .active > a:hover,\n  > .active > a:focus {\n    border: 1px solid @nav-tabs-justified-link-border-color;\n  }\n\n  @media (min-width: @screen-sm-min) {\n    > li > a {\n      border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n      border-radius: @border-radius-base @border-radius-base 0 0;\n    }\n    > .active > a,\n    > .active > a:hover,\n    > .active > a:focus {\n      border-bottom-color: @nav-tabs-justified-active-link-border-color;\n    }\n  }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n  > .tab-pane {\n    display: none;\n    visibility: hidden;\n  }\n  > .active {\n    display: block;\n    visibility: visible;\n  }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n  // make dropdown border overlap tab border\n  margin-top: -1px;\n  // Remove the top rounded corners here since there is a hard edge above the menu\n  .border-top-radius(0);\n}\n"
  },
  {
    "path": "less/bootstrap/normalize.less",
    "content": "/*! normalize.css v3.0.2 | MIT License | git.io/normalize */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS text size adjust after orientation change, without disabling\n//    user zoom.\n//\n\nhtml {\n  font-family: sans-serif; // 1\n  -ms-text-size-adjust: 100%; // 2\n  -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n  margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n  display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n  display: inline-block; // 1\n  vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n  display: none;\n  height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n  display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n  background-color: transparent;\n}\n\n//\n// Improve readability when focused and also mouse hovered in all browsers.\n//\n\na:active,\na:hover {\n  outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n  border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n  font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n  font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n  background: #ff0;\n  color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n  font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n  font-size: 75%;\n  line-height: 0;\n  position: relative;\n  vertical-align: baseline;\n}\n\nsup {\n  top: -0.5em;\n}\n\nsub {\n  bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n  border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n  overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n  margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n  -moz-box-sizing: content-box;\n  box-sizing: content-box;\n  height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n  overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n//    Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n  color: inherit; // 1\n  font: inherit; // 2\n  margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n  overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n  text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n//    and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n//    `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n  -webkit-appearance: button; // 2\n  cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n  cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n  border: 0;\n  padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n  line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n  box-sizing: border-box; // 1\n  padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n  height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome\n//    (include `-moz` to future-proof).\n//\n\ninput[type=\"search\"] {\n  -webkit-appearance: textfield; // 1\n  -moz-box-sizing: content-box;\n  -webkit-box-sizing: content-box; // 2\n  box-sizing: content-box;\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n  -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n  border: 1px solid #c0c0c0;\n  margin: 0 2px;\n  padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n  border: 0; // 1\n  padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n  overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n  font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n  border-collapse: collapse;\n  border-spacing: 0;\n}\n\ntd,\nth {\n  padding: 0;\n}\n"
  },
  {
    "path": "less/bootstrap/pager.less",
    "content": "//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  list-style: none;\n  text-align: center;\n  &:extend(.clearfix all);\n  li {\n    display: inline;\n    > a,\n    > span {\n      display: inline-block;\n      padding: 5px 14px;\n      background-color: @pager-bg;\n      border: 1px solid @pager-border;\n      border-radius: @pager-border-radius;\n    }\n\n    > a:hover,\n    > a:focus {\n      text-decoration: none;\n      background-color: @pager-hover-bg;\n    }\n  }\n\n  .next {\n    > a,\n    > span {\n      float: right;\n    }\n  }\n\n  .previous {\n    > a,\n    > span {\n      float: left;\n    }\n  }\n\n  .disabled {\n    > a,\n    > a:hover,\n    > a:focus,\n    > span {\n      color: @pager-disabled-color;\n      background-color: @pager-bg;\n      cursor: @cursor-disabled;\n    }\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/pagination.less",
    "content": "//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n  display: inline-block;\n  padding-left: 0;\n  margin: @line-height-computed 0;\n  border-radius: @border-radius-base;\n\n  > li {\n    display: inline; // Remove list-style and block-level defaults\n    > a,\n    > span {\n      position: relative;\n      float: left; // Collapse white-space\n      padding: @padding-base-vertical @padding-base-horizontal;\n      line-height: @line-height-base;\n      text-decoration: none;\n      color: @pagination-color;\n      background-color: @pagination-bg;\n      border: 1px solid @pagination-border;\n      margin-left: -1px;\n    }\n    &:first-child {\n      > a,\n      > span {\n        margin-left: 0;\n        .border-left-radius(@border-radius-base);\n      }\n    }\n    &:last-child {\n      > a,\n      > span {\n        .border-right-radius(@border-radius-base);\n      }\n    }\n  }\n\n  > li > a,\n  > li > span {\n    &:hover,\n    &:focus {\n      color: @pagination-hover-color;\n      background-color: @pagination-hover-bg;\n      border-color: @pagination-hover-border;\n    }\n  }\n\n  > .active > a,\n  > .active > span {\n    &,\n    &:hover,\n    &:focus {\n      z-index: 2;\n      color: @pagination-active-color;\n      background-color: @pagination-active-bg;\n      border-color: @pagination-active-border;\n      cursor: default;\n    }\n  }\n\n  > .disabled {\n    > span,\n    > span:hover,\n    > span:focus,\n    > a,\n    > a:hover,\n    > a:focus {\n      color: @pagination-disabled-color;\n      background-color: @pagination-disabled-bg;\n      border-color: @pagination-disabled-border;\n      cursor: @cursor-disabled;\n    }\n  }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n  .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n  .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @border-radius-small);\n}\n"
  },
  {
    "path": "less/bootstrap/panels.less",
    "content": "//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n  margin-bottom: @line-height-computed;\n  background-color: @panel-bg;\n  border: 1px solid transparent;\n  border-radius: @panel-border-radius;\n  .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n  padding: @panel-body-padding;\n  &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n  padding: @panel-heading-padding;\n  border-bottom: 1px solid transparent;\n  .border-top-radius((@panel-border-radius - 1));\n\n  > .dropdown .dropdown-toggle {\n    color: inherit;\n  }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n  margin-top: 0;\n  margin-bottom: 0;\n  font-size: ceil((@font-size-base * 1.125));\n  color: inherit;\n\n  > a {\n    color: inherit;\n  }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n  padding: @panel-footer-padding;\n  background-color: @panel-footer-bg;\n  border-top: 1px solid @panel-inner-border;\n  .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n  > .list-group,\n  > .panel-collapse > .list-group {\n    margin-bottom: 0;\n\n    .list-group-item {\n      border-width: 1px 0;\n      border-radius: 0;\n    }\n\n    // Add border top radius for first one\n    &:first-child {\n      .list-group-item:first-child {\n        border-top: 0;\n        .border-top-radius((@panel-border-radius - 1));\n      }\n    }\n    // Add border bottom radius for last one\n    &:last-child {\n      .list-group-item:last-child {\n        border-bottom: 0;\n        .border-bottom-radius((@panel-border-radius - 1));\n      }\n    }\n  }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n  .list-group-item:first-child {\n    border-top-width: 0;\n  }\n}\n.list-group + .panel-footer {\n  border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n  > .table,\n  > .table-responsive > .table,\n  > .panel-collapse > .table {\n    margin-bottom: 0;\n\n    caption {\n      padding-left: @panel-body-padding;\n      padding-right: @panel-body-padding;\n    }\n  }\n  // Add border top radius for first one\n  > .table:first-child,\n  > .table-responsive:first-child > .table:first-child {\n    .border-top-radius((@panel-border-radius - 1));\n\n    > thead:first-child,\n    > tbody:first-child {\n      > tr:first-child {\n        border-top-left-radius: (@panel-border-radius - 1);\n        border-top-right-radius: (@panel-border-radius - 1);\n\n        td:first-child,\n        th:first-child {\n          border-top-left-radius: (@panel-border-radius - 1);\n        }\n        td:last-child,\n        th:last-child {\n          border-top-right-radius: (@panel-border-radius - 1);\n        }\n      }\n    }\n  }\n  // Add border bottom radius for last one\n  > .table:last-child,\n  > .table-responsive:last-child > .table:last-child {\n    .border-bottom-radius((@panel-border-radius - 1));\n\n    > tbody:last-child,\n    > tfoot:last-child {\n      > tr:last-child {\n        border-bottom-left-radius: (@panel-border-radius - 1);\n        border-bottom-right-radius: (@panel-border-radius - 1);\n\n        td:first-child,\n        th:first-child {\n          border-bottom-left-radius: (@panel-border-radius - 1);\n        }\n        td:last-child,\n        th:last-child {\n          border-bottom-right-radius: (@panel-border-radius - 1);\n        }\n      }\n    }\n  }\n  > .panel-body + .table,\n  > .panel-body + .table-responsive,\n  > .table + .panel-body,\n  > .table-responsive + .panel-body {\n    border-top: 1px solid @table-border-color;\n  }\n  > .table > tbody:first-child > tr:first-child th,\n  > .table > tbody:first-child > tr:first-child td {\n    border-top: 0;\n  }\n  > .table-bordered,\n  > .table-responsive > .table-bordered {\n    border: 0;\n    > thead,\n    > tbody,\n    > tfoot {\n      > tr {\n        > th:first-child,\n        > td:first-child {\n          border-left: 0;\n        }\n        > th:last-child,\n        > td:last-child {\n          border-right: 0;\n        }\n      }\n    }\n    > thead,\n    > tbody {\n      > tr:first-child {\n        > td,\n        > th {\n          border-bottom: 0;\n        }\n      }\n    }\n    > tbody,\n    > tfoot {\n      > tr:last-child {\n        > td,\n        > th {\n          border-bottom: 0;\n        }\n      }\n    }\n  }\n  > .table-responsive {\n    border: 0;\n    margin-bottom: 0;\n  }\n}\n\n\n// Collapsable panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n  margin-bottom: @line-height-computed;\n\n  // Tighten up margin so it's only between panels\n  .panel {\n    margin-bottom: 0;\n    border-radius: @panel-border-radius;\n\n    + .panel {\n      margin-top: 5px;\n    }\n  }\n\n  .panel-heading {\n    border-bottom: 0;\n\n    + .panel-collapse > .panel-body,\n    + .panel-collapse > .list-group {\n      border-top: 1px solid @panel-inner-border;\n    }\n  }\n\n  .panel-footer {\n    border-top: 0;\n    + .panel-collapse .panel-body {\n      border-bottom: 1px solid @panel-inner-border;\n    }\n  }\n}\n\n\n// Contextual variations\n.panel-default {\n  .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n  .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n  .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n  .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n  .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n  .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n"
  },
  {
    "path": "less/bootstrap/popovers.less",
    "content": "//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n  position: absolute;\n  top: 0;\n  left: 0;\n  z-index: @zindex-popover;\n  display: none;\n  max-width: @popover-max-width;\n  padding: 1px;\n  // Reset font and text propertes given new insertion method\n  font-family: @font-family-base;\n  font-size: @font-size-base;\n  font-weight: normal;\n  line-height: @line-height-base;\n  text-align: left;\n  background-color: @popover-bg;\n  background-clip: padding-box;\n  border: 1px solid @popover-fallback-border-color;\n  border: 1px solid @popover-border-color;\n  border-radius: @border-radius-large;\n  .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n  // Overrides for proper insertion\n  white-space: normal;\n\n  // Offset the popover to account for the popover arrow\n  &.top     { margin-top: -@popover-arrow-width; }\n  &.right   { margin-left: @popover-arrow-width; }\n  &.bottom  { margin-top: @popover-arrow-width; }\n  &.left    { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n  margin: 0; // reset heading margin\n  padding: 8px 14px;\n  font-size: @font-size-base;\n  background-color: @popover-title-bg;\n  border-bottom: 1px solid darken(@popover-title-bg, 5%);\n  border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n  padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n  &,\n  &:after {\n    position: absolute;\n    display: block;\n    width: 0;\n    height: 0;\n    border-color: transparent;\n    border-style: solid;\n  }\n}\n.popover > .arrow {\n  border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n  border-width: @popover-arrow-width;\n  content: \"\";\n}\n\n.popover {\n  &.top > .arrow {\n    left: 50%;\n    margin-left: -@popover-arrow-outer-width;\n    border-bottom-width: 0;\n    border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-top-color: @popover-arrow-outer-color;\n    bottom: -@popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      bottom: 1px;\n      margin-left: -@popover-arrow-width;\n      border-bottom-width: 0;\n      border-top-color: @popover-arrow-color;\n    }\n  }\n  &.right > .arrow {\n    top: 50%;\n    left: -@popover-arrow-outer-width;\n    margin-top: -@popover-arrow-outer-width;\n    border-left-width: 0;\n    border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-right-color: @popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      left: 1px;\n      bottom: -@popover-arrow-width;\n      border-left-width: 0;\n      border-right-color: @popover-arrow-color;\n    }\n  }\n  &.bottom > .arrow {\n    left: 50%;\n    margin-left: -@popover-arrow-outer-width;\n    border-top-width: 0;\n    border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-bottom-color: @popover-arrow-outer-color;\n    top: -@popover-arrow-outer-width;\n    &:after {\n      content: \" \";\n      top: 1px;\n      margin-left: -@popover-arrow-width;\n      border-top-width: 0;\n      border-bottom-color: @popover-arrow-color;\n    }\n  }\n\n  &.left > .arrow {\n    top: 50%;\n    right: -@popover-arrow-outer-width;\n    margin-top: -@popover-arrow-outer-width;\n    border-right-width: 0;\n    border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n    border-left-color: @popover-arrow-outer-color;\n    &:after {\n      content: \" \";\n      right: 1px;\n      border-right-width: 0;\n      border-left-color: @popover-arrow-color;\n      bottom: -@popover-arrow-width;\n    }\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/print.less",
    "content": "/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n    *,\n    *:before,\n    *:after {\n        background: transparent !important;\n        color: #000 !important; // Black prints faster: h5bp.com/s\n        box-shadow: none !important;\n        text-shadow: none !important;\n    }\n\n    a,\n    a:visited {\n        text-decoration: underline;\n    }\n\n    a[href]:after {\n        content: \" (\" attr(href) \")\";\n    }\n\n    abbr[title]:after {\n        content: \" (\" attr(title) \")\";\n    }\n\n    // Don't show links that are fragment identifiers,\n    // or use the `javascript:` pseudo protocol\n    a[href^=\"#\"]:after,\n    a[href^=\"javascript:\"]:after {\n        content: \"\";\n    }\n\n    pre,\n    blockquote {\n        border: 1px solid #999;\n        page-break-inside: avoid;\n    }\n\n    thead {\n        display: table-header-group; // h5bp.com/t\n    }\n\n    tr,\n    img {\n        page-break-inside: avoid;\n    }\n\n    img {\n        max-width: 100% !important;\n    }\n\n    p,\n    h2,\n    h3 {\n        orphans: 3;\n        widows: 3;\n    }\n\n    h2,\n    h3 {\n        page-break-after: avoid;\n    }\n\n    // Bootstrap specific changes start\n    //\n    // Chrome (OSX) fix for https://github.com/twbs/bootstrap/issues/11245\n    // Once fixed, we can just straight up remove this.\n    select {\n        background: #fff !important;\n    }\n\n    // Bootstrap components\n    .navbar {\n        display: none;\n    }\n    .btn,\n    .dropup > .btn {\n        > .caret {\n            border-top-color: #000 !important;\n        }\n    }\n    .label {\n        border: 1px solid #000;\n    }\n\n    .table {\n        border-collapse: collapse !important;\n\n        td,\n        th {\n            background-color: #fff !important;\n        }\n    }\n    .table-bordered {\n        th,\n        td {\n            border: 1px solid #ddd !important;\n        }\n    }\n\n    // Bootstrap specific changes end\n}\n"
  },
  {
    "path": "less/bootstrap/progress-bars.less",
    "content": "//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n  from  { background-position: 40px 0; }\n  to    { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n  overflow: hidden;\n  height: @line-height-computed;\n  margin-bottom: @line-height-computed;\n  background-color: @progress-bg;\n  border-radius: @progress-border-radius;\n  .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n  float: left;\n  width: 0%;\n  height: 100%;\n  font-size: @font-size-small;\n  line-height: @line-height-computed;\n  color: @progress-bar-color;\n  text-align: center;\n  background-color: @progress-bar-bg;\n  .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n  .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n  #gradient > .striped();\n  background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n  .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n  .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n  .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n  .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n  .progress-bar-variant(@progress-bar-danger-bg);\n}\n"
  },
  {
    "path": "less/bootstrap/responsive-embed.less",
    "content": "// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n  position: relative;\n  display: block;\n  height: 0;\n  padding: 0;\n  overflow: hidden;\n\n  .embed-responsive-item,\n  iframe,\n  embed,\n  object,\n  video {\n    position: absolute;\n    top: 0;\n    left: 0;\n    bottom: 0;\n    height: 100%;\n    width: 100%;\n    border: 0;\n  }\n\n  // Modifier class for 16:9 aspect ratio\n  &.embed-responsive-16by9 {\n    padding-bottom: 56.25%;\n  }\n\n  // Modifier class for 4:3 aspect ratio\n  &.embed-responsive-4by3 {\n    padding-bottom: 75%;\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/responsive-utilities.less",
    "content": "//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n  width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n  .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n  display: none !important;\n}\n\n.visible-xs {\n  @media (max-width: @screen-xs-max) {\n    .responsive-visibility();\n  }\n}\n.visible-xs-block {\n  @media (max-width: @screen-xs-max) {\n    display: block !important;\n  }\n}\n.visible-xs-inline {\n  @media (max-width: @screen-xs-max) {\n    display: inline !important;\n  }\n}\n.visible-xs-inline-block {\n  @media (max-width: @screen-xs-max) {\n    display: inline-block !important;\n  }\n}\n\n.visible-sm {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    .responsive-visibility();\n  }\n}\n.visible-sm-block {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    display: block !important;\n  }\n}\n.visible-sm-inline {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    display: inline !important;\n  }\n}\n.visible-sm-inline-block {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    display: inline-block !important;\n  }\n}\n\n.visible-md {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    .responsive-visibility();\n  }\n}\n.visible-md-block {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    display: block !important;\n  }\n}\n.visible-md-inline {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    display: inline !important;\n  }\n}\n.visible-md-inline-block {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    display: inline-block !important;\n  }\n}\n\n.visible-lg {\n  @media (min-width: @screen-lg-min) {\n    .responsive-visibility();\n  }\n}\n.visible-lg-block {\n  @media (min-width: @screen-lg-min) {\n    display: block !important;\n  }\n}\n.visible-lg-inline {\n  @media (min-width: @screen-lg-min) {\n    display: inline !important;\n  }\n}\n.visible-lg-inline-block {\n  @media (min-width: @screen-lg-min) {\n    display: inline-block !important;\n  }\n}\n\n.hidden-xs {\n  @media (max-width: @screen-xs-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-sm {\n  @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-md {\n  @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n    .responsive-invisibility();\n  }\n}\n.hidden-lg {\n  @media (min-width: @screen-lg-min) {\n    .responsive-invisibility();\n  }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n  .responsive-invisibility();\n\n  @media print {\n    .responsive-visibility();\n  }\n}\n.visible-print-block {\n  display: none !important;\n\n  @media print {\n    display: block !important;\n  }\n}\n.visible-print-inline {\n  display: none !important;\n\n  @media print {\n    display: inline !important;\n  }\n}\n.visible-print-inline-block {\n  display: none !important;\n\n  @media print {\n    display: inline-block !important;\n  }\n}\n\n.hidden-print {\n  @media print {\n    .responsive-invisibility();\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/scaffolding.less",
    "content": "//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n  .box-sizing(border-box);\n}\n*:before,\n*:after {\n  .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n  font-size: 10px;\n  -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n  font-family: @font-family-base;\n  font-size: @font-size-base;\n  line-height: @line-height-base;\n  color: @text-color;\n  background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n\n\n// Links\n\na {\n  color: @link-color;\n  text-decoration: none;\n\n  &:hover,\n  &:focus {\n    color: @link-hover-color;\n    text-decoration: @link-hover-decoration;\n  }\n\n  &:focus {\n    .tab-focus();\n  }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n  margin: 0;\n}\n\n\n// Images\n\nimg {\n  vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n  .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n  border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n  padding: @thumbnail-padding;\n  line-height: @line-height-base;\n  background-color: @thumbnail-bg;\n  border: 1px solid @thumbnail-border;\n  border-radius: @thumbnail-border-radius;\n  .transition(all .2s ease-in-out);\n\n  // Keep them at most 100% wide\n  .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n  border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n  margin-top:    @line-height-computed;\n  margin-bottom: @line-height-computed;\n  border: 0;\n  border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  padding: 0;\n  overflow: hidden;\n  clip: rect(0,0,0,0);\n  border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n  &:active,\n  &:focus {\n    position: static;\n    width: auto;\n    height: auto;\n    margin: 0;\n    overflow: visible;\n    clip: auto;\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/tables.less",
    "content": "//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n  background-color: @table-bg;\n}\ncaption {\n  padding-top: @table-cell-padding;\n  padding-bottom: @table-cell-padding;\n  color: @text-muted;\n  text-align: left;\n}\nth {\n  text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n  width: 100%;\n  max-width: 100%;\n  margin-bottom: @line-height-computed;\n  // Cells\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-cell-padding;\n        line-height: @line-height-base;\n        vertical-align: top;\n        border-top: 1px solid @table-border-color;\n      }\n    }\n  }\n  // Bottom align for column headings\n  > thead > tr > th {\n    vertical-align: bottom;\n    border-bottom: 2px solid @table-border-color;\n  }\n  // Remove top border from thead by default\n  > caption + thead,\n  > colgroup + thead,\n  > thead:first-child {\n    > tr:first-child {\n      > th,\n      > td {\n        border-top: 0;\n      }\n    }\n  }\n  // Account for multiple tbody instances\n  > tbody + tbody {\n    border-top: 2px solid @table-border-color;\n  }\n\n  // Nesting\n  .table {\n    background-color: @body-bg;\n  }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        padding: @table-condensed-cell-padding;\n      }\n    }\n  }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n  border: 1px solid @table-border-color;\n  > thead,\n  > tbody,\n  > tfoot {\n    > tr {\n      > th,\n      > td {\n        border: 1px solid @table-border-color;\n      }\n    }\n  }\n  > thead > tr {\n    > th,\n    > td {\n      border-bottom-width: 2px;\n    }\n  }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n  > tbody > tr:nth-child(odd) {\n    background-color: @table-bg-accent;\n  }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n  > tbody > tr:hover {\n    background-color: @table-bg-hover;\n  }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n  position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n  float: none;\n  display: table-column;\n}\ntable {\n  td,\n  th {\n    &[class*=\"col-\"] {\n      position: static; // Prevent border hiding in Firefox and IE9/10 (see https://github.com/twbs/bootstrap/issues/11623)\n      float: none;\n      display: table-cell;\n    }\n  }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n  overflow-x: auto;\n  min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n  @media screen and (max-width: @screen-xs-max) {\n    width: 100%;\n    margin-bottom: (@line-height-computed * 0.75);\n    overflow-y: hidden;\n    -ms-overflow-style: -ms-autohiding-scrollbar;\n    border: 1px solid @table-border-color;\n\n    // Tighten up spacing\n    > .table {\n      margin-bottom: 0;\n\n      // Ensure the content doesn't wrap\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th,\n          > td {\n            white-space: nowrap;\n          }\n        }\n      }\n    }\n\n    // Special overrides for the bordered tables\n    > .table-bordered {\n      border: 0;\n\n      // Nuke the appropriate borders so that the parent can handle them\n      > thead,\n      > tbody,\n      > tfoot {\n        > tr {\n          > th:first-child,\n          > td:first-child {\n            border-left: 0;\n          }\n          > th:last-child,\n          > td:last-child {\n            border-right: 0;\n          }\n        }\n      }\n\n      // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n      // chances are there will be only one `tr` in a `thead` and that would\n      // remove the border altogether.\n      > tbody,\n      > tfoot {\n        > tr:last-child {\n          > th,\n          > td {\n            border-bottom: 0;\n          }\n        }\n      }\n\n    }\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/theme.less",
    "content": "\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n  text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n  .box-shadow(@shadow);\n\n  // Reset the shadow\n  &:active,\n  &.active {\n    .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n  }\n\n  .badge {\n    text-shadow: none;\n  }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n  #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n  .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners\n  background-repeat: repeat-x;\n  border-color: darken(@btn-color, 14%);\n\n  &:hover,\n  &:focus  {\n    background-color: darken(@btn-color, 12%);\n    background-position: 0 -15px;\n  }\n\n  &:active,\n  &.active {\n    background-color: darken(@btn-color, 12%);\n    border-color: darken(@btn-color, 14%);\n  }\n\n  &:disabled,\n  &[disabled] {\n    background-color: darken(@btn-color, 12%);\n    background-image: none;\n  }\n}\n\n// Common styles\n.btn {\n  // Remove the gradient for the pressed/active state\n  &:active,\n  &.active {\n    background-image: none;\n  }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info    { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger  { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n  .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n  #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n  background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n  #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n  background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n  #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n  .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n  border-radius: @navbar-border-radius;\n  @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n  .box-shadow(@shadow);\n\n  .navbar-nav > .open > a,\n  .navbar-nav > .active > a {\n    #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n    .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n  }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n  text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n  #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n  .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n\n  .navbar-nav > .open > a,\n  .navbar-nav > .active > a {\n    #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n    .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n  }\n\n  .navbar-brand,\n  .navbar-nav > li > a {\n    text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n  }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n  border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n  .navbar .navbar-nav .open .dropdown-menu > .active > a {\n    &,\n    &:hover,\n    &:focus {\n      color: #fff;\n      #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n    }\n  }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n  text-shadow: 0 1px 0 rgba(255,255,255,.2);\n  @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n  .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n  border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success    { .alert-styles(@alert-success-bg); }\n.alert-info       { .alert-styles(@alert-info-bg); }\n.alert-warning    { .alert-styles(@alert-warning-bg); }\n.alert-danger     { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n  #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar            { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success    { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info       { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning    { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger     { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n  #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n  border-radius: @border-radius-base;\n  .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n  text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n  #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n  border-color: darken(@list-group-active-border, 7.5%);\n\n  .badge {\n    text-shadow: none;\n  }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n  .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n  #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading   { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading   { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading   { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading      { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading   { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading    { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n  #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n  border-color: darken(@well-bg, 10%);\n  @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n  .box-shadow(@shadow);\n}\n"
  },
  {
    "path": "less/bootstrap/thumbnails.less",
    "content": "//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n  display: block;\n  padding: @thumbnail-padding;\n  margin-bottom: @line-height-computed;\n  line-height: @line-height-base;\n  background-color: @thumbnail-bg;\n  border: 1px solid @thumbnail-border;\n  border-radius: @thumbnail-border-radius;\n  .transition(border .2s ease-in-out);\n\n  > img,\n  a > img {\n    &:extend(.img-responsive);\n    margin-left: auto;\n    margin-right: auto;\n  }\n\n  // Add a hover state for linked versions only\n  a&:hover,\n  a&:focus,\n  a&.active {\n    border-color: @link-color;\n  }\n\n  // Image captions\n  .caption {\n    padding: @thumbnail-caption-padding;\n    color: @thumbnail-caption-color;\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/tooltip.less",
    "content": "//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n  position: absolute;\n  z-index: @zindex-tooltip;\n  display: block;\n  visibility: visible;\n  // Reset font and text propertes given new insertion method\n  font-family: @font-family-base;\n  font-size: @font-size-small;\n  font-weight: normal;\n  line-height: 1.4;\n  .opacity(0);\n\n  &.in     { .opacity(@tooltip-opacity); }\n  &.top    { margin-top:  -3px; padding: @tooltip-arrow-width 0; }\n  &.right  { margin-left:  3px; padding: 0 @tooltip-arrow-width; }\n  &.bottom { margin-top:   3px; padding: @tooltip-arrow-width 0; }\n  &.left   { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n  max-width: @tooltip-max-width;\n  padding: 3px 8px;\n  color: @tooltip-color;\n  text-align: center;\n  text-decoration: none;\n  background-color: @tooltip-bg;\n  border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n  position: absolute;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n  &.top .tooltip-arrow {\n    bottom: 0;\n    left: 50%;\n    margin-left: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.top-left .tooltip-arrow {\n    bottom: 0;\n    right: @tooltip-arrow-width;\n    margin-bottom: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.top-right .tooltip-arrow {\n    bottom: 0;\n    left: @tooltip-arrow-width;\n    margin-bottom: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-top-color: @tooltip-arrow-color;\n  }\n  &.right .tooltip-arrow {\n    top: 50%;\n    left: 0;\n    margin-top: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n    border-right-color: @tooltip-arrow-color;\n  }\n  &.left .tooltip-arrow {\n    top: 50%;\n    right: 0;\n    margin-top: -@tooltip-arrow-width;\n    border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-left-color: @tooltip-arrow-color;\n  }\n  &.bottom .tooltip-arrow {\n    top: 0;\n    left: 50%;\n    margin-left: -@tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n  &.bottom-left .tooltip-arrow {\n    top: 0;\n    right: @tooltip-arrow-width;\n    margin-top: -@tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n  &.bottom-right .tooltip-arrow {\n    top: 0;\n    left: @tooltip-arrow-width;\n    margin-top: -@tooltip-arrow-width;\n    border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n    border-bottom-color: @tooltip-arrow-color;\n  }\n}\n"
  },
  {
    "path": "less/bootstrap/type.less",
    "content": "//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n  font-family: @headings-font-family;\n  font-weight: @headings-font-weight;\n  line-height: @headings-line-height;\n  color: @headings-color;\n\n  small,\n  .small {\n    font-weight: normal;\n    line-height: 1;\n    color: @headings-small-color;\n  }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n  margin-top: @line-height-computed;\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 65%;\n  }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n  margin-top: (@line-height-computed / 2);\n  margin-bottom: (@line-height-computed / 2);\n\n  small,\n  .small {\n    font-size: 75%;\n  }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n  margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n  margin-bottom: @line-height-computed;\n  font-size: floor((@font-size-base * 1.15));\n  font-weight: 300;\n  line-height: 1.4;\n\n  @media (min-width: @screen-sm-min) {\n    font-size: (@font-size-base * 1.5);\n  }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n  font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n  background-color: @state-warning-bg;\n  padding: .2em;\n}\n\n// Alignment\n.text-left           { text-align: left; }\n.text-right          { text-align: right; }\n.text-center         { text-align: center; }\n.text-justify        { text-align: justify; }\n.text-nowrap         { white-space: nowrap; }\n\n// Transformation\n.text-lowercase      { text-transform: lowercase; }\n.text-uppercase      { text-transform: uppercase; }\n.text-capitalize     { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n  color: @text-muted;\n}\n.text-primary {\n  .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n  .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n  .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n  .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n  .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n  // Given the contrast here, this is the only class to have its color inverted\n  // automatically.\n  color: #fff;\n  .bg-variant(@brand-primary);\n}\n.bg-success {\n  .bg-variant(@state-success-bg);\n}\n.bg-info {\n  .bg-variant(@state-info-bg);\n}\n.bg-warning {\n  .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n  .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n  padding-bottom: ((@line-height-computed / 2) - 1);\n  margin: (@line-height-computed * 2) 0 @line-height-computed;\n  border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n  margin-top: 0;\n  margin-bottom: (@line-height-computed / 2);\n  ul,\n  ol {\n    margin-bottom: 0;\n  }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n  padding-left: 0;\n  list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n  .list-unstyled();\n  margin-left: -5px;\n\n  > li {\n    display: inline-block;\n    padding-left: 5px;\n    padding-right: 5px;\n  }\n}\n\n// Description Lists\ndl {\n  margin-top: 0; // Remove browser default\n  margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n  line-height: @line-height-base;\n}\ndt {\n  font-weight: bold;\n}\ndd {\n  margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n  dd {\n    &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n  }\n\n  @media (min-width: @grid-float-breakpoint) {\n    dt {\n      float: left;\n      width: (@dl-horizontal-offset - 20);\n      clear: left;\n      text-align: right;\n      .text-overflow();\n    }\n    dd {\n      margin-left: @dl-horizontal-offset;\n    }\n  }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n  cursor: help;\n  border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n  font-size: 90%;\n  text-transform: uppercase;\n}\n\n// Blockquotes\nblockquote {\n  padding: (@line-height-computed / 2) @line-height-computed;\n  margin: 0 0 @line-height-computed;\n  font-size: @blockquote-font-size;\n  border-left: 5px solid @blockquote-border-color;\n\n  p,\n  ul,\n  ol {\n    &:last-child {\n      margin-bottom: 0;\n    }\n  }\n\n  // Note: Deprecated small and .small as of v3.1.0\n  // Context: https://github.com/twbs/bootstrap/issues/11660\n  footer,\n  small,\n  .small {\n    display: block;\n    font-size: 80%; // back to default font-size\n    line-height: @line-height-base;\n    color: @blockquote-small-color;\n\n    &:before {\n      content: '\\2014 \\00A0'; // em dash, nbsp\n    }\n  }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n  padding-right: 15px;\n  padding-left: 0;\n  border-right: 5px solid @blockquote-border-color;\n  border-left: 0;\n  text-align: right;\n\n  // Account for citation\n  footer,\n  small,\n  .small {\n    &:before { content: ''; }\n    &:after {\n      content: '\\00A0 \\2014'; // nbsp, em dash\n    }\n  }\n}\n\n// Addresses\naddress {\n  margin-bottom: @line-height-computed;\n  font-style: normal;\n  line-height: @line-height-base;\n}\n"
  },
  {
    "path": "less/bootstrap/utilities.less",
    "content": "//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n  .clearfix();\n}\n.center-block {\n  .center-block();\n}\n.pull-right {\n  float: right !important;\n}\n.pull-left {\n  float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n  display: none !important;\n}\n.show {\n  display: block !important;\n}\n.invisible {\n  visibility: hidden;\n}\n.text-hide {\n  .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n  display: none !important;\n  visibility: hidden !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n  position: fixed;\n}\n"
  },
  {
    "path": "less/bootstrap/variables.less",
    "content": "//\n// Variables\n// --------------------------------------------------\n\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n@gray-base:              #000;\n@gray-darker:            lighten(@gray-base, 13.5%); // #222\n@gray-dark:              lighten(@gray-base, 20%);   // #333\n@gray:                   lighten(@gray-base, 33.5%); // #555\n@gray-light:             lighten(@gray-base, 46.7%); // #777\n@gray-lighter:           lighten(@gray-base, 93.5%); // #eee\n\n@brand-primary:         darken(#428bca, 6.5%);\n@brand-success:         #5cb85c;\n@brand-info:            #5bc0de;\n@brand-warning:         #f0ad4e;\n@brand-danger:          #d9534f;\n\n\n//== Scaffolding\n//\n//## Settings for some of the most global styles.\n\n//** Background color for `<body>`.\n@body-bg:               #fff;\n//** Global text color on `<body>`.\n@text-color:            @gray-dark;\n\n//** Global textual link color.\n@link-color:            @brand-primary;\n//** Link hover color set via `darken()` function.\n@link-hover-color:      darken(@link-color, 15%);\n//** Link hover decoration.\n@link-hover-decoration: underline;\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n@font-family-sans-serif:  \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n@font-family-serif:       Georgia, \"Times New Roman\", Times, serif;\n//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.\n@font-family-monospace:   Menlo, Monaco, Consolas, \"Courier New\", monospace;\n@font-family-base:        @font-family-sans-serif;\n\n@font-size-base:          14px;\n@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px\n@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px\n\n@font-size-h1:            floor((@font-size-base * 2.6)); // ~36px\n@font-size-h2:            floor((@font-size-base * 2.15)); // ~30px\n@font-size-h3:            ceil((@font-size-base * 1.7)); // ~24px\n@font-size-h4:            ceil((@font-size-base * 1.25)); // ~18px\n@font-size-h5:            @font-size-base;\n@font-size-h6:            ceil((@font-size-base * 0.85)); // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n@line-height-base:        1.428571429; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px\n\n//** By default, this inherits from the `<body>`.\n@headings-font-family:    inherit;\n@headings-font-weight:    500;\n@headings-line-height:    1.1;\n@headings-color:          inherit;\n\n\n//== Iconography\n//\n//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n//** Load fonts from this directory.\n@icon-font-path:          \"../fonts/\";\n//** File name for all font files.\n@icon-font-name:          \"glyphicons-halflings-regular\";\n//** Element ID within SVG icon file.\n@icon-font-svg-id:        \"glyphicons_halflingsregular\";\n\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n@padding-base-vertical:     6px;\n@padding-base-horizontal:   12px;\n\n@padding-large-vertical:    10px;\n@padding-large-horizontal:  16px;\n\n@padding-small-vertical:    5px;\n@padding-small-horizontal:  10px;\n\n@padding-xs-vertical:       1px;\n@padding-xs-horizontal:     5px;\n\n@line-height-large:         1.33;\n@line-height-small:         1.5;\n\n@border-radius-base:        4px;\n@border-radius-large:       6px;\n@border-radius-small:       3px;\n\n//** Global color for active items (e.g., navs or dropdowns).\n@component-active-color:    #fff;\n//** Global background color for active items (e.g., navs or dropdowns).\n@component-active-bg:       @brand-primary;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n@caret-width-base:          4px;\n//** Carets increase slightly in size for larger components.\n@caret-width-large:         5px;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for `<th>`s and `<td>`s.\n@table-cell-padding:            8px;\n//** Padding for cells in `.table-condensed`.\n@table-condensed-cell-padding:  5px;\n\n//** Default background color used for all tables.\n@table-bg:                      transparent;\n//** Background color used for `.table-striped`.\n@table-bg-accent:               #f9f9f9;\n//** Background color used for `.table-hover`.\n@table-bg-hover:                #f5f5f5;\n@table-bg-active:               @table-bg-hover;\n\n//** Border color for table and cell borders.\n@table-border-color:            #ddd;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n@btn-font-weight:                normal;\n\n@btn-default-color:              #333;\n@btn-default-bg:                 #fff;\n@btn-default-border:             #ccc;\n\n@btn-primary-color:              #fff;\n@btn-primary-bg:                 @brand-primary;\n@btn-primary-border:             darken(@btn-primary-bg, 5%);\n\n@btn-success-color:              #fff;\n@btn-success-bg:                 @brand-success;\n@btn-success-border:             darken(@btn-success-bg, 5%);\n\n@btn-info-color:                 #fff;\n@btn-info-bg:                    @brand-info;\n@btn-info-border:                darken(@btn-info-bg, 5%);\n\n@btn-warning-color:              #fff;\n@btn-warning-bg:                 @brand-warning;\n@btn-warning-border:             darken(@btn-warning-bg, 5%);\n\n@btn-danger-color:               #fff;\n@btn-danger-bg:                  @brand-danger;\n@btn-danger-border:              darken(@btn-danger-bg, 5%);\n\n@btn-link-disabled-color:        @gray-light;\n\n\n//== Forms\n//\n//##\n\n//** `<input>` background color\n@input-bg:                       #fff;\n//** `<input disabled>` background color\n@input-bg-disabled:              @gray-lighter;\n\n//** Text color for `<input>`s\n@input-color:                    @gray;\n//** `<input>` border color\n@input-border:                   #ccc;\n\n// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4\n//** Default `.form-control` border radius\n@input-border-radius:            @border-radius-base;\n//** Large `.form-control` border radius\n@input-border-radius-large:      @border-radius-large;\n//** Small `.form-control` border radius\n@input-border-radius-small:      @border-radius-small;\n\n//** Border color for inputs on focus\n@input-border-focus:             #66afe9;\n\n//** Placeholder text color\n@input-color-placeholder:        #999;\n\n//** Default `.form-control` height\n@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);\n//** Large `.form-control` height\n@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);\n//** Small `.form-control` height\n@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);\n\n@legend-color:                   @gray-dark;\n@legend-border-color:            #e5e5e5;\n\n//** Background color for textual input addons\n@input-group-addon-bg:           @gray-lighter;\n//** Border color for textual input addons\n@input-group-addon-border-color: @input-border;\n\n//** Disabled cursor for form controls and buttons.\n@cursor-disabled:                not-allowed;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n@dropdown-bg:                    #fff;\n//** Dropdown menu `border-color`.\n@dropdown-border:                rgba(0,0,0,.15);\n//** Dropdown menu `border-color` **for IE8**.\n@dropdown-fallback-border:       #ccc;\n//** Divider color for between dropdown items.\n@dropdown-divider-bg:            #e5e5e5;\n\n//** Dropdown link text color.\n@dropdown-link-color:            @gray-dark;\n//** Hover color for dropdown links.\n@dropdown-link-hover-color:      darken(@gray-dark, 5%);\n//** Hover background for dropdown links.\n@dropdown-link-hover-bg:         #f5f5f5;\n\n//** Active dropdown menu item text color.\n@dropdown-link-active-color:     @component-active-color;\n//** Active dropdown menu item background color.\n@dropdown-link-active-bg:        @component-active-bg;\n\n//** Disabled dropdown menu item background color.\n@dropdown-link-disabled-color:   @gray-light;\n\n//** Text color for headers within dropdown menus.\n@dropdown-header-color:          @gray-light;\n\n//** Deprecated `@dropdown-caret-color` as of v3.1.0\n@dropdown-caret-color:           #000;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n@zindex-navbar:            1000;\n@zindex-dropdown:          1000;\n@zindex-popover:           1060;\n@zindex-tooltip:           1070;\n@zindex-navbar-fixed:      1030;\n@zindex-modal:             1040;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n//** Deprecated `@screen-xs` as of v3.0.1\n@screen-xs:                  480px;\n//** Deprecated `@screen-xs-min` as of v3.2.0\n@screen-xs-min:              @screen-xs;\n//** Deprecated `@screen-phone` as of v3.0.1\n@screen-phone:               @screen-xs-min;\n\n// Small screen / tablet\n//** Deprecated `@screen-sm` as of v3.0.1\n@screen-sm:                  768px;\n@screen-sm-min:              @screen-sm;\n//** Deprecated `@screen-tablet` as of v3.0.1\n@screen-tablet:              @screen-sm-min;\n\n// Medium screen / desktop\n//** Deprecated `@screen-md` as of v3.0.1\n@screen-md:                  992px;\n@screen-md-min:              @screen-md;\n//** Deprecated `@screen-desktop` as of v3.0.1\n@screen-desktop:             @screen-md-min;\n\n// Large screen / wide desktop\n//** Deprecated `@screen-lg` as of v3.0.1\n@screen-lg:                  1200px;\n@screen-lg-min:              @screen-lg;\n//** Deprecated `@screen-lg-desktop` as of v3.0.1\n@screen-lg-desktop:          @screen-lg-min;\n\n// So media queries don't overlap when required, provide a maximum\n@screen-xs-max:              (@screen-sm-min - 1);\n@screen-sm-max:              (@screen-md-min - 1);\n@screen-md-max:              (@screen-lg-min - 1);\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n@grid-columns:              12;\n//** Padding between columns. Gets divided in half for the left and right.\n@grid-gutter-width:         30px;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n@grid-float-breakpoint:     @screen-sm-min;\n//** Point at which the navbar begins collapsing.\n@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n@container-tablet:             (720px + @grid-gutter-width);\n//** For `@screen-sm-min` and up.\n@container-sm:                 @container-tablet;\n\n// Medium screen / desktop\n@container-desktop:            (940px + @grid-gutter-width);\n//** For `@screen-md-min` and up.\n@container-md:                 @container-desktop;\n\n// Large screen / wide desktop\n@container-large-desktop:      (1140px + @grid-gutter-width);\n//** For `@screen-lg-min` and up.\n@container-lg:                 @container-large-desktop;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n@navbar-height:                    50px;\n@navbar-margin-bottom:             @line-height-computed;\n@navbar-border-radius:             @border-radius-base;\n@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));\n@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);\n@navbar-collapse-max-height:       340px;\n\n@navbar-default-color:             #777;\n@navbar-default-bg:                #f8f8f8;\n@navbar-default-border:            darken(@navbar-default-bg, 6.5%);\n\n// Navbar links\n@navbar-default-link-color:                #777;\n@navbar-default-link-hover-color:          #333;\n@navbar-default-link-hover-bg:             transparent;\n@navbar-default-link-active-color:         #555;\n@navbar-default-link-active-bg:            darken(@navbar-default-bg, 6.5%);\n@navbar-default-link-disabled-color:       #ccc;\n@navbar-default-link-disabled-bg:          transparent;\n\n// Navbar brand label\n@navbar-default-brand-color:               @navbar-default-link-color;\n@navbar-default-brand-hover-color:         darken(@navbar-default-brand-color, 10%);\n@navbar-default-brand-hover-bg:            transparent;\n\n// Navbar toggle\n@navbar-default-toggle-hover-bg:           #ddd;\n@navbar-default-toggle-icon-bar-bg:        #888;\n@navbar-default-toggle-border-color:       #ddd;\n\n\n// Inverted navbar\n// Reset inverted navbar basics\n@navbar-inverse-color:                      lighten(@gray-light, 15%);\n@navbar-inverse-bg:                         #222;\n@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);\n\n// Inverted navbar links\n@navbar-inverse-link-color:                 lighten(@gray-light, 15%);\n@navbar-inverse-link-hover-color:           #fff;\n@navbar-inverse-link-hover-bg:              transparent;\n@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;\n@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 10%);\n@navbar-inverse-link-disabled-color:        #444;\n@navbar-inverse-link-disabled-bg:           transparent;\n\n// Inverted navbar brand label\n@navbar-inverse-brand-color:                @navbar-inverse-link-color;\n@navbar-inverse-brand-hover-color:          #fff;\n@navbar-inverse-brand-hover-bg:             transparent;\n\n// Inverted navbar toggle\n@navbar-inverse-toggle-hover-bg:            #333;\n@navbar-inverse-toggle-icon-bar-bg:         #fff;\n@navbar-inverse-toggle-border-color:        #333;\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n@nav-link-padding:                          10px 15px;\n@nav-link-hover-bg:                         @gray-lighter;\n\n@nav-disabled-link-color:                   @gray-light;\n@nav-disabled-link-hover-color:             @gray-light;\n\n//== Tabs\n@nav-tabs-border-color:                     #ddd;\n\n@nav-tabs-link-hover-border-color:          @gray-lighter;\n\n@nav-tabs-active-link-hover-bg:             @body-bg;\n@nav-tabs-active-link-hover-color:          @gray;\n@nav-tabs-active-link-hover-border-color:   #ddd;\n\n@nav-tabs-justified-link-border-color:            #ddd;\n@nav-tabs-justified-active-link-border-color:     @body-bg;\n\n//== Pills\n@nav-pills-border-radius:                   @border-radius-base;\n@nav-pills-active-link-hover-bg:            @component-active-bg;\n@nav-pills-active-link-hover-color:         @component-active-color;\n\n\n//== Pager\n//\n//##\n\n@pager-bg:                             @pagination-bg;\n@pager-border:                         @pagination-border;\n@pager-border-radius:                  15px;\n\n@pager-hover-bg:                       @pagination-hover-bg;\n\n@pager-active-bg:                      @pagination-active-bg;\n@pager-active-color:                   @pagination-active-color;\n\n@pager-disabled-color:                 @pagination-disabled-color;\n\n\n//== Jumbotron\n//\n//##\n\n@jumbotron-padding:              30px;\n@jumbotron-color:                inherit;\n@jumbotron-bg:                   @gray-lighter;\n@jumbotron-heading-color:        inherit;\n@jumbotron-font-size:            ceil((@font-size-base * 1.5));\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n@state-success-text:             #3c763d;\n@state-success-bg:               #dff0d8;\n@state-success-border:           darken(spin(@state-success-bg, -10), 5%);\n\n@state-info-text:                #31708f;\n@state-info-bg:                  #d9edf7;\n@state-info-border:              darken(spin(@state-info-bg, -10), 7%);\n\n@state-warning-text:             #8a6d3b;\n@state-warning-bg:               #fcf8e3;\n@state-warning-border:           darken(spin(@state-warning-bg, -10), 5%);\n\n@state-danger-text:              #a94442;\n@state-danger-bg:                #f2dede;\n@state-danger-border:            darken(spin(@state-danger-bg, -10), 5%);\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n@tooltip-max-width:           200px;\n//** Tooltip text color\n@tooltip-color:               #fff;\n//** Tooltip background color\n@tooltip-bg:                  #000;\n@tooltip-opacity:             .9;\n\n//** Tooltip arrow width\n@tooltip-arrow-width:         5px;\n//** Tooltip arrow color\n@tooltip-arrow-color:         @tooltip-bg;\n\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n@popover-bg:                          #fff;\n//** Popover maximum width\n@popover-max-width:                   276px;\n//** Popover border color\n@popover-border-color:                rgba(0,0,0,.2);\n//** Popover fallback border color\n@popover-fallback-border-color:       #ccc;\n\n//** Popover title background color\n@popover-title-bg:                    darken(@popover-bg, 3%);\n\n//** Popover arrow width\n@popover-arrow-width:                 10px;\n//** Popover arrow color\n@popover-arrow-color:                 @popover-bg;\n\n//** Popover outer arrow width\n@popover-arrow-outer-width:           (@popover-arrow-width + 1);\n//** Popover outer arrow color\n@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);\n//** Popover outer arrow fallback color\n@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n@label-default-bg:            @gray-light;\n//** Primary label background color\n@label-primary-bg:            @brand-primary;\n//** Success label background color\n@label-success-bg:            @brand-success;\n//** Info label background color\n@label-info-bg:               @brand-info;\n//** Warning label background color\n@label-warning-bg:            @brand-warning;\n//** Danger label background color\n@label-danger-bg:             @brand-danger;\n\n//** Default label text color\n@label-color:                 #fff;\n//** Default text color of a linked label\n@label-link-hover-color:      #fff;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n@modal-inner-padding:         15px;\n\n//** Padding applied to the modal title\n@modal-title-padding:         15px;\n//** Modal title line-height\n@modal-title-line-height:     @line-height-base;\n\n//** Background color of modal content area\n@modal-content-bg:                             #fff;\n//** Modal content border color\n@modal-content-border-color:                   rgba(0,0,0,.2);\n//** Modal content border color **for IE8**\n@modal-content-fallback-border-color:          #999;\n\n//** Modal backdrop background color\n@modal-backdrop-bg:           #000;\n//** Modal backdrop opacity\n@modal-backdrop-opacity:      .5;\n//** Modal header border color\n@modal-header-border-color:   #e5e5e5;\n//** Modal footer border color\n@modal-footer-border-color:   @modal-header-border-color;\n\n@modal-lg:                    900px;\n@modal-md:                    600px;\n@modal-sm:                    300px;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n@alert-padding:               15px;\n@alert-border-radius:         @border-radius-base;\n@alert-link-font-weight:      bold;\n\n@alert-success-bg:            @state-success-bg;\n@alert-success-text:          @state-success-text;\n@alert-success-border:        @state-success-border;\n\n@alert-info-bg:               @state-info-bg;\n@alert-info-text:             @state-info-text;\n@alert-info-border:           @state-info-border;\n\n@alert-warning-bg:            @state-warning-bg;\n@alert-warning-text:          @state-warning-text;\n@alert-warning-border:        @state-warning-border;\n\n@alert-danger-bg:             @state-danger-bg;\n@alert-danger-text:           @state-danger-text;\n@alert-danger-border:         @state-danger-border;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n@progress-bg:                 #f5f5f5;\n//** Progress bar text color\n@progress-bar-color:          #fff;\n//** Variable for setting rounded corners on progress bar.\n@progress-border-radius:      @border-radius-base;\n\n//** Default progress bar color\n@progress-bar-bg:             @brand-primary;\n//** Success progress bar color\n@progress-bar-success-bg:     @brand-success;\n//** Warning progress bar color\n@progress-bar-warning-bg:     @brand-warning;\n//** Danger progress bar color\n@progress-bar-danger-bg:      @brand-danger;\n//** Info progress bar color\n@progress-bar-info-bg:        @brand-info;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n@list-group-bg:                 #fff;\n//** `.list-group-item` border color\n@list-group-border:             #ddd;\n//** List group border radius\n@list-group-border-radius:      @border-radius-base;\n\n//** Background color of single list items on hover\n@list-group-hover-bg:           #f5f5f5;\n//** Text color of active list items\n@list-group-active-color:       @component-active-color;\n//** Background color of active list items\n@list-group-active-bg:          @component-active-bg;\n//** Border color of active list elements\n@list-group-active-border:      @list-group-active-bg;\n//** Text color for content within active list items\n@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);\n\n//** Text color of disabled list items\n@list-group-disabled-color:      @gray-light;\n//** Background color of disabled list items\n@list-group-disabled-bg:         @gray-lighter;\n//** Text color for content within disabled list items\n@list-group-disabled-text-color: @list-group-disabled-color;\n\n@list-group-link-color:         #555;\n@list-group-link-hover-color:   @list-group-link-color;\n@list-group-link-heading-color: #333;\n\n\n//== Panels\n//\n//##\n\n@panel-bg:                    #fff;\n@panel-body-padding:          15px;\n@panel-heading-padding:       10px 15px;\n@panel-footer-padding:        @panel-heading-padding;\n@panel-border-radius:         @border-radius-base;\n\n//** Border color for elements within panels\n@panel-inner-border:          #ddd;\n@panel-footer-bg:             #f5f5f5;\n\n@panel-default-text:          @gray-dark;\n@panel-default-border:        #ddd;\n@panel-default-heading-bg:    #f5f5f5;\n\n@panel-primary-text:          #fff;\n@panel-primary-border:        @brand-primary;\n@panel-primary-heading-bg:    @brand-primary;\n\n@panel-success-text:          @state-success-text;\n@panel-success-border:        @state-success-border;\n@panel-success-heading-bg:    @state-success-bg;\n\n@panel-info-text:             @state-info-text;\n@panel-info-border:           @state-info-border;\n@panel-info-heading-bg:       @state-info-bg;\n\n@panel-warning-text:          @state-warning-text;\n@panel-warning-border:        @state-warning-border;\n@panel-warning-heading-bg:    @state-warning-bg;\n\n@panel-danger-text:           @state-danger-text;\n@panel-danger-border:         @state-danger-border;\n@panel-danger-heading-bg:     @state-danger-bg;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n@thumbnail-padding:           4px;\n//** Thumbnail background color\n@thumbnail-bg:                @body-bg;\n//** Thumbnail border color\n@thumbnail-border:            #ddd;\n//** Thumbnail border radius\n@thumbnail-border-radius:     @border-radius-base;\n\n//** Custom text color for thumbnail captions\n@thumbnail-caption-color:     @text-color;\n//** Padding around the thumbnail caption\n@thumbnail-caption-padding:   9px;\n\n\n//== Wells\n//\n//##\n\n@well-bg:                     #f5f5f5;\n@well-border:                 darken(@well-bg, 7%);\n\n\n//== Badges\n//\n//##\n\n@badge-color:                 #fff;\n//** Linked badge text color on hover\n@badge-link-hover-color:      #fff;\n@badge-bg:                    @gray-light;\n\n//** Badge text color in active nav link\n@badge-active-color:          @link-color;\n//** Badge background color in active nav link\n@badge-active-bg:             #fff;\n\n@badge-font-weight:           bold;\n@badge-line-height:           1;\n@badge-border-radius:         10px;\n\n\n//== Breadcrumbs\n//\n//##\n\n@breadcrumb-padding-vertical:   8px;\n@breadcrumb-padding-horizontal: 15px;\n//** Breadcrumb background color\n@breadcrumb-bg:                 #f5f5f5;\n//** Breadcrumb text color\n@breadcrumb-color:              #ccc;\n//** Text color of current page in the breadcrumb\n@breadcrumb-active-color:       @gray-light;\n//** Textual separator for between breadcrumb elements\n@breadcrumb-separator:          \"/\";\n\n\n//== Carousel\n//\n//##\n\n@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);\n\n@carousel-control-color:                      #fff;\n@carousel-control-width:                      15%;\n@carousel-control-opacity:                    .5;\n@carousel-control-font-size:                  20px;\n\n@carousel-indicator-active-bg:                #fff;\n@carousel-indicator-border-color:             #fff;\n\n@carousel-caption-color:                      #fff;\n\n\n//== Close\n//\n//##\n\n@close-font-weight:           bold;\n@close-color:                 #000;\n@close-text-shadow:           0 1px 0 #fff;\n\n\n//== Code\n//\n//##\n\n@code-color:                  #c7254e;\n@code-bg:                     #f9f2f4;\n\n@kbd-color:                   #fff;\n@kbd-bg:                      #333;\n\n@pre-bg:                      #f5f5f5;\n@pre-color:                   @gray-dark;\n@pre-border-color:            #ccc;\n@pre-scrollable-max-height:   340px;\n\n\n//== Type\n//\n//##\n\n//** Horizontal offset for forms and lists.\n@component-offset-horizontal: 180px;\n//** Text muted color\n@text-muted:                  @gray-light;\n//** Abbreviations and acronyms border color\n@abbr-border-color:           @gray-light;\n//** Headings small color\n@headings-small-color:        @gray-light;\n//** Blockquote small color\n@blockquote-small-color:      @gray-light;\n//** Blockquote font size\n@blockquote-font-size:        (@font-size-base * 1.25);\n//** Blockquote border color\n@blockquote-border-color:     @gray-lighter;\n//** Page header border color\n@page-header-border-color:    @gray-lighter;\n//** Width of horizontal description list titles\n@dl-horizontal-offset:        @component-offset-horizontal;\n//** Horizontal line color.\n@hr-border:                   @gray-lighter;\n"
  },
  {
    "path": "less/bootstrap/wells.less",
    "content": "//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n  min-height: 20px;\n  padding: 19px;\n  margin-bottom: 20px;\n  background-color: @well-bg;\n  border: 1px solid @well-border;\n  border-radius: @border-radius-base;\n  .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n  blockquote {\n    border-color: #ddd;\n    border-color: rgba(0,0,0,.15);\n  }\n}\n\n// Sizes\n.well-lg {\n  padding: 24px;\n  border-radius: @border-radius-large;\n}\n.well-sm {\n  padding: 9px;\n  border-radius: @border-radius-small;\n}\n"
  },
  {
    "path": "less/browse.less",
    "content": "article.graph.small {\n\twidth: 325px;\n\theight: 155px;\n\tposition: relative;\n\n  \ta, a:active, a:hover, a:focus {\n\t  text-decoration: none;\n\t  border: 0;\n\t  outline: 0;\n\t}\n\n\t>a {\n\t  position: absolute;\n\t  display: block;\n\t  text-decoration: none;\n\t  border: 0;\n\t  top: 0;\n\t  left: 0;\n\t  right: 0;\n\t  bottom: 0;\n\t  overflow: hidden;\n\t  z-index: 1;\n\t}\n\timg {\n\t  display: block;\n\t  position: absolute;\n\t  left: 0;\n\t  right: 0;\n\t  top: 50%;\n\t  margin-top: -120px;\n\t  max-width: 100%;\n\t}\n\tdiv.text {\n\t  pointer-events: none;\n\t  -webkit-font-smoothing: subpixel-antialiased;\n\t  z-index: 2;\n\t  background: linear-gradient(rgba(0,0,0,0.7), rgba(0,0,0,0.65), rgba(0,0,0,0.55));\n\t  position: absolute;\n\t  top: 0;\n\t  left: 0;\n\t  right: 0;\n\t  bottom: 0;\n\t  padding: 15px 20px;\n\t  h3 {\n\t\tfont-size: 16px;\n\t\tfont-weight: 400;\n\t\tcolor: white;\n\t\tmargin: 0;\n\t  }\n\t  p.by {\n\t\tfont-size: 12px;\n\t\tfont-weight: 400;\n\t\tcolor: #5199d2;\n\t\ta {\n\t\t  color: #5199d2;\n\t\t  pointer-events: initial;\n\t\t  body.deviceDesktop &:hover {\n\t\t\tcolor: lighten(#5199d2,5%);\n\t\t\ttext-decoration: underline;\n\t\t  }\n\t\t}\n\t  }\n\t  body.deviceDesktop & {\n\t\topacity: 0;\n\t\ttransition: opacity 0.3s 0.1s;\n\t  }\n\t  body.deviceMobile &, body.deviceTablet & {\n\t\tbackground: none;\n\t\topacity: 0.8;\n\t\th3>span, p.by>span {\n\t\t  background: rgb(0,0,0);\n\t\t  padding: 2px;\n\t\t}\n\t  }\n\t}\n\tbody.deviceDesktop &:hover {\n\t  div.text {\n\t\topacity: 1;\n\t\ttransition: opacity 0.2s 0.01s;\n\t  }\n\t}\n\n  }"
  },
  {
    "path": "less/build_editor.less",
    "content": "/* editor */\n@import \"bootstrap/bootstrap\";\n\n@import \"mixin\";\n@import \"variables\";\n\n@import \"core\";\n@import \"scrollbars\";\n@import \"collapsible-select-control\";\n@import \"file-select-control\";\n@import \"tree\";\n\n@import \"widgets/widgets\";\n\n@import \"editors\";\n\n@import \"people\";\n@import \"chat\";\n@import \"libraries\";\n@import \"notifications\";\n@import \"modals\";\n\n@import \"userpulldown\";\n@import \"editor_shell\";\n@import \"editor\";\n\n@import \"site\";\n\n"
  },
  {
    "path": "less/build_site.less",
    "content": "/* public site */\n@import \"bootstrap/bootstrap\";\n@import \"mixin\";\n\n@import \"variables\";\n\n@import \"core\";\n@import \"scrollbars\";\n\n@import \"widgets/widgets\";\n\n@import \"editors\";\n@import \"notifications\";\n@import \"modals\";\n\n@import \"userpulldown\";\n@import \"site\";\n@import \"footer\";\n@import \"homepage\";\n@import \"browse\";\n@import \"playerpage\";\n\n"
  },
  {
    "path": "less/build_site360.less",
    "content": "/* 360 minisite */\n\n// modal dialogs\n@import \"bootstrap/variables\";\n@import \"bootstrap/mixins\";\n@import \"bootstrap/component-animations\";\n@import \"bootstrap/alerts\";\n@import \"bootstrap/modals\";\n// player\n@import \"variables\";\n@import \"core\";\n@import \"mixin\";\n\n@import \"scrollbars\";\n@import \"modals\";\n@import \"playerpage\";\n// 360\n@import \"threesixty\";\n@import \"widgets/widgets\";\n"
  },
  {
    "path": "less/build_vizor2teaser.less",
    "content": "@side-margin: 12.5%;\n@max-content-width: 960px;\n\n@primary-color: #0E6491;\n@secondary-color: #65A4B5;\n@accent-color: #37A0E9;\n@canvas-color-1: #F6F4F0;\n@canvas-color-2: #F3F3F3;\n\n@medium-viewport-width: 600px;\n@large-viewport-width: 1100px;\n@desktop-width: 1025px; // Treat all viewports below this as touch devices\n\n@input-height-small: 52px;\n@input-height-medium: 60px;\n@input-padding-small: 13px;\n@input-padding-medium: 13px;\n\n@logo-size-small: 32px;\n@logo-size-medium: 44px;\n@logo-size-large: 60px;\n\n@font-face {\n  font-family: 'Lab Grotesque';\n  font-weight: normal;\n  src: url('../fonts/lab-grotesque/lab-grotesque-regular.woff');\n}\n@font-face {\n  font-family: 'Lab Grotesque';\n  font-weight: 700;\n  src: url('../fonts/lab-grotesque/lab-grotesque-bold.woff');\n}\n\n* {\n    margin: 0;\n    padding: 0;\n    font-size: inherit;\n    font-weight: inherit;\n    list-style: none;\n    color: inherit;\n    text-decoration: none;\n}\n\nbody {\n    font-family: 'Lab Grotesque', sans-serif;\n    font-size: 16px;\n    color: @primary-color;\n    background-color: @canvas-color-1;\n    @media (min-width: @large-viewport-width) {\n        font-size: 20px;\n    }\n}\n\n.h1 {\n    font-size: 32px;\n    line-height: 33px;\n    margin-left: -0.05em; // Align optically\n    font-weight: bold;\n    @media (min-width: @medium-viewport-width) {\n        font-size: 50px;\n        line-height: 55px;\n    }\n    @media (min-width: @large-viewport-width) {\n        font-size: 80px;\n        line-height: 88px;\n    }\n}\n.h2 {\n    font-size: 24px;\n    line-height: 32px;\n    margin-left: -0.05em; // Align optically\n    font-weight: bold;\n     @media (min-width: @medium-viewport-width) {\n        font-size: 38px;\n        line-height: 42px;\n    }\n    @media (min-width: @large-viewport-width) {\n        font-size: 60px;\n        line-height: 66px;\n    }\n}\n.kicker {\n    font-size: 10px;\n    text-transform: uppercase;\n    letter-spacing: 0.94px;\n    color: @secondary-color;\n    @media (min-width: @large-viewport-width) {\n        font-size: 16px;\n    }\n}\n.kicker + .h2 {\n    margin-top: 4px;\n    @media (min-width: @large-viewport-width) {\n        margin-top: 16px;\n    }\n}\n\n.section {\n    padding-left: @side-margin;\n    padding-right: @side-margin;\n}\n.section__wrapper {\n    margin-left: auto;\n    margin-right: auto;\n    max-width: @max-content-width;\n}\n\n.hero {\n    position: relative;\n    box-sizing: border-box;\n    color: #FFFFFF;\n    background-color: @primary-color;\n}\n.hero iframe {\n    display: block;\n    position: absolute;\n    z-index: 0;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n}\n.hero:after {\n    content: \"\";\n    position: absolute;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    background: rgba(0, 0, 0, 0.24);\n    pointer-events: none;\n}\n.hero__wrapper {\n    position: relative;\n    z-index: 2;\n    display: flex;\n    flex-direction: column;\n    pointer-events: none;\n    user-select: none;\n    -webkit-user-select: none;\n    min-height: 100vh;\n    @media (min-width: @medium-viewport-width) {\n        justify-content: center;\n    }\n}\n.hero__content {\n    flex: 0 0 auto;\n    padding-top: 12vh;\n    padding-bottom: 12vh;\n}\n.hero__logo {\n    display: block;\n    width: @logo-size-small;\n    height: @logo-size-small;\n    @media (min-width: @medium-viewport-width) {\n        width: @logo-size-medium;\n        height: @logo-size-medium;\n    }\n    @media (min-width: @large-viewport-width)  {\n        width: @logo-size-large;\n        height: @logo-size-large;\n    }\n}\n.hero__title {\n    margin-top: 26px;\n    padding-bottom: 23px;\n    @media (min-width: @medium-viewport-width) {\n        margin-top: 60px;\n        padding-bottom: 32px;\n    }\n    @media (min-width: @large-viewport-width) {\n        margin-top: 93px;\n    }\n}\n.hero__body {\n    line-height: 24px;\n}\n// Allow scrolling the page when dragging with finger over text on mobile devices\n@media (max-width: (@desktop-width - 1px)) and (pointer: coarse) {\n    .hero__title, .hero__body {\n        pointer-events: all;\n    }\n}\n.hero__scroll-down {\n    margin-top: 34px;\n    pointer-events: all;\n    @media (min-width: @medium-viewport-width) {\n        margin-top: 80px;\n    }\n    @media (min-width: @large-viewport-width) {\n        margin-top: 160px;\n    }\n}\n\n.scroll-down-button {\n    display: inline-block;\n    background: transparent;\n    outline: none;\n    border: none;\n    cursor: pointer;\n}\n.scroll-down-button__icon {\n    display: block;\n}\n.scroll-down-button__label {\n    display: block;\n    margin-top: 9px;\n    font-size: 12px;\n}\n@media (min-width: @medium-viewport-width) {\n    .scroll-down-button__icon {\n        width: @logo-size-medium;\n        height: @logo-size-medium;\n    }\n    .scroll-down-button__label {\n        margin-top: 18px;\n    }\n}\n@media (min-width: @large-viewport-width) {\n    .scroll-down-button__icon {\n        width: @logo-size-large;\n        height: @logo-size-large;\n    }\n}\n\n.introduction {\n    border-top: 16px solid #FFFFFF;\n    border-bottom: 16px solid #FFFFFF;\n    padding-top: 80px;\n    overflow: hidden;\n    @media (min-width: @large-viewport-width) {\n        padding-top: 160px;\n    }\n}\n.introduction__screenshot {\n    display: block;\n    width: 564px;\n    height: auto;\n    min-width: 100%;\n    margin-top: 54px;\n    border-top-left-radius: 4px;\n    border-top-right-radius: 4px;\n    @media (min-width: @medium-viewport-width) {\n        margin-bottom: 40px;\n    }\n    @media (min-width: @large-viewport-width) {\n        margin-top: 116px;\n        margin-bottom: 200px;\n    }\n}\n\n.register {\n    padding-top: 54px;\n    padding-bottom: 100px;\n    background-color: @canvas-color-2;\n    @media (min-width: @large-viewport-width) {\n        padding-top: 160px;\n        padding-bottom: 160px;\n    }\n}\n.register__form {\n    margin-top: 35px;\n}\n.register__email {\n    width: 100%;\n}\n.register__email::placeholder {\n    color: inherit;\n}\n.register__hint {\n    margin-top: 14px;\n    max-width: 17em;\n    font-size: 10px;\n    color: @secondary-color;\n    @media (min-width: @medium-viewport-width) {\n        font-size: 12px;\n        max-width: none;\n    }\n}\n.register__submit {\n    margin-left: -4px; // Align optically\n}\n@media (max-width: (@large-viewport-width - 1px)) {\n    .register__submit {\n        margin-top: 27px;\n    }\n}\n@media (min-width: @large-viewport-width) {\n    .register__form {\n        display: flex;\n        justify-content: flex-start;\n        align-items: top;\n        margin-top: 100px;\n    }\n    .register__email-container {\n        flex: 0 0 50%;\n    }\n    .register__submit {\n        flex: 0 0 auto;\n        margin-left: 55px;\n    }\n}\n\n.button {\n    box-sizing: border-box;\n    width: 160px;\n    height: @input-height-small;\n    text-align: center;\n    font-size: inherit;\n    color: #0E6491;\n    background: transparent;\n    border: 2px solid @primary-color;\n    border-radius: 100px;\n    cursor: pointer;\n    outline: none;\n    -webkit-appearance: none;\n    @media (min-width: @medium-viewport-width) {\n        width: 184px;\n        height: @input-height-medium;\n    }\n}\n.button:hover {\n    color: @accent-color;\n    border-color: @accent-color;\n}\n.button:active {\n    background-color: @accent-color;\n    border-color: @accent-color;\n    color: #FFFFFF;\n}\n\n.text-input {\n    box-sizing: border-box;\n    height: @input-height-small;\n    padding: @input-padding-small 0;\n    font-size: 16px;\n    line-height: @input-height-small - @input-padding-small;\n    color: inherit;\n    background: transparent;\n    border: none;\n    border-bottom: 2px solid @primary-color;\n    outline: none;\n    border-radius: 0px;\n    -webkit-appearance: none;\n    @media (min-width: @medium-viewport-width) {\n        height: @input-height-medium;\n        padding-top: @input-padding-medium;\n        padding-bottom: @input-padding-medium;\n        line-height: @input-height-medium - @input-padding-medium;\n        font-size: 20px;\n    }\n}\n.text-input:hover {\n    border-bottom-color: @accent-color;\n}\n.text-input:focus {\n    border-bottom-color: @accent-color;\n}\n.text-input:focus::placeholder {\n    color: @secondary-color;\n}\n\n.footer {\n    background-color: @canvas-color-2;\n}\n.footer__wrapper {\n    padding-top: 50px;\n    padding-bottom: 50px;\n    border-top: 1px solid #C4C4C4;\n}\n.footer__link-list {\n    font-size: 20px;\n    line-height: 40px;\n    a {\n        &:hover, &:active {\n            color: @accent-color;\n        }\n    }\n}\n.footer__info {\n    margin-top: 60px;\n    strong {\n        font-weight: bold;\n    }\n    a {\n        text-decoration: underline;\n        &:hover {\n            color: @accent-color;\n        }\n        &:active {\n            color: @accent-color;\n        }\n    }\n}\n@media (min-width: @medium-viewport-width) {\n    .footer__wrapper {\n        padding-top: 150px;\n        padding-bottom: 150px;\n    }\n    .footer__link-list {\n        display: flex;\n        flex-wrap: wrap;\n        margin-left: -15px;\n        line-height: 28px;\n        li {\n            flex: 0 0 auto;\n            display: inline;\n            margin-left: 15px;\n        }\n    }\n    .footer__info {\n        margin-top: 20px;\n    }\n}\n\n.jobs-link {\n    position: relative;\n}\n.jobs-link__balloon {\n    opacity: 0;\n    position: absolute;\n    transform: translate(0, -10%);\n    top: 170%;\n    left: -5px;\n    padding: 6px 0px 5px;\n    width: 124px;\n    text-align: center;\n    font-size: 12px;\n    line-height: 1em;\n    text-transform: uppercase;\n    letter-spacing: 0.12em;\n    color: #FFFFFF;\n    background-color: @accent-color;\n    border-radius: 1000px;\n    pointer-events: none;\n    transition-property: transform, opacity;\n    transition-duration: 0.15s;\n    transition-delay: 0.2s;\n    transition-timing-function: ease-out;\n}\n.jobs-link__balloon:after {\n    content: \"\";\n    position: absolute;\n    left: 11px;\n    top: -8px;\n    border-width: 0px 4px 8px;\n    border-style: solid;\n    border-color: @accent-color transparent;\n}\n.jobs-link:hover .jobs-link__balloon {\n    opacity: 1;\n    transform: translate(0, 0);\n    transition-delay: 0s;\n}\n@media (min-width: @medium-viewport-width) {\n    .jobs-link__balloon {\n        transform: translate(0, 10%);\n        bottom: 170%;\n        left: -5px;\n        top: auto;\n    }\n    .jobs-link__balloon:after {\n        top: auto;\n        bottom: -8px;\n        border-width: 8px 4px 0;\n    }\n}\n"
  },
  {
    "path": "less/chat.less",
    "content": "@color-chat-username: @editor-text-hover;\n@color-chat-message: @chat-text-color;\n@color-chat-timestamp: @editor-text-default;\n@color-chat-composer: @editor-text-hover;\n\n.chat-users {\n    right: 30px;\n  \ttop: 340px;\n    z-index: 63;\n}\n\n.chat-tabs {\n    width: @floating-box-width;\n}\n\n#chatTab {\n  -moz-user-select: text;\n  -webkit-user-select: text;\n  -ms-user-select: text;\n  width: @floating-box-width;\n  height: @chat-height - @blocks-header-height;\n  position:relative;\n  background: @bg-light;\n  color: @editor-text-hover;\n  >.chat-nav, >.messages, >.composer {\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n  }\n\n  .chat-nav {\n\theight: @chat-nav-height;\n\tborder-bottom: 1px solid @bg-darker;\n\ttop: 0;\n\tpadding: 10px 20px;\n\tspan {\n\t  color: @editor-text-current;\n\t}\n\ta {\n\t  color: @chat-text-color;\n  \t}\n\tsvg {\n\t  display: inline-block;\n\t  width: 19px;\n\t  height: 10px;\n\t  stroke: @editor-text-inactive;\n  \t}\n  }\n\n  .messages {\n\toverflow-y: auto;\n\toverflow-x: hidden;\n\tpadding: 1px 5px;\n\ttop: @chat-nav-height;\n\tbottom: @chat-composer-height;\n   }\n\n  .composer {\n\twidth: @chat-width;\n\theight: @chat-composer-height;\n\tbottom: 0;\n\tbackground: @bg-darker;\n\tinput {\n\t  height: 18px;\n\t  font-family:   @font-family-sans-serif;\n\t  margin-top: @chat-composer-height/2 - 9;\n\t  font-size: 12px;\n\t  color: @color-chat-composer;\n\t  background: none;\n\t  border: 0;\n\t  width: @chat-width - 40;\n\t  margin-left: 20px;\n\t}\n\tinput:focus {\n\t  outline: 0;\n\t}\n  }\n}\n\n\n#chatTab .message {\n  margin: 0 15px-3px 10px 15px;\t// gently nudged to the right because scrollbar\n  color: @color-chat-message;\n  p {\n\tmargin: 0 0 0 43px;\n\tfont-weight: 400;\n\tword-wrap: break-word;\n\t&.meta {\n\t  time, span.username {\n\t  \tdisplay: inline;\n\t  }\n\t  time {\n\t\tcolor: @color-chat-timestamp;\n\t\tfont-size: 80%;\n\t  }\n\t  span.username {\n\t\tfont-weight: 600;\n\t  }\n\t  span.username+time {margin-left: 5px;}\n\t}\n  }\n  p+p {\n\tmargin-top: 2px;\n  }\n  .icon {\n\tbackground-color: gray; // default but template overrides it\n\tbackground-image: url('/images/alpha_chat_icon.png');\n\tbackground-position: center center;\n\tmargin: 0.5ex 0px 10px 0px;\n\twidth: 32px;\n\theight: 32px;\n\tborder-radius: 3px;\n\tfloat:left;\n  }\n}\n"
  },
  {
    "path": "less/collapsible-select-control.less",
    "content": ".floating-box {\n  -webkit-font-smoothing: subpixel-antialiased;\n}\n.patch-list-contained-box {\n\toverflow: hidden !important;\n}\n\n.patch-list-container {\n\toverflow: hidden;\n\twidth: 100%;\n\tmax-height: 310px;\n\t.patch-list-content {\n\t\twidth: 100%;\n\t\tmax-height: 310px;\n\t\toverflow-y: auto;\n\t\toverflow-x: hidden;\n\t\t.panel {\n\t\t    min-height: 32px;\n\t\t    padding: 8px 0 5px 10px;\n\t\t    color: @editor-text-default;\n\t\t    box-sizing: border-box;\n\t\t}\n\t}\n}\n\n.result.table {\n    width: @floating-box-width;\n}\n.result li,\n.panel {\n\tmargin-top: 1px;\n\tmargin-bottom: 1px;\n}\n\n.floating-box.vp-library div.searchbox {\n  margin-left: 20px;\n}\n.floating-box .result-item  {\n    color: @editor-text-default;\n    padding: 8px 16px 8px 38px;\n}\n\n.result.table td.result-item.active {\n  color: lighten(@editor-text-default, 20);\n  background: rgb(6,82,109);\n}\n\n.result-item span.title {\n  padding-right: 1ex;\n}\n.result-item span.category {\n  font-size: 87.5%;\n  color: darken(@editor-text-current,5%);\n  text-transform: lowercase;\n  white-space: nowrap;\t// force this on its own line if it doesn't fit\n}\n\n.result-item:hover {\n  color: @editor-text-hover;\n  background: rgba(6,82,109,0.5);\n}\n\n.panel-default {\n\tborder-color: @bg-darker;\n}\n\n.panel-default > .panel-heading {\n  background-image: none;\n  background-color: @bg-light;\n  position: relative;\n  padding-left: 28px;\n  letter-spacing: 0.8px;\n  word-spacing: 0.25rem;\n  &:before {\n\tcontent: \" \";\n\tposition: absolute;\n\tleft: 0px;\n\ttop: 50%;\n\tmargin-top: -8px;\n\twidth: 16px;\n\theight: 16px;\n\topacity: 0.5;\n\tbackground: url('/images/v2/chevron.svg') 5px center no-repeat;\n\tbackground-size: 16px ;\n\t-webkit-transform: rotate(0deg) translate3d(-5px, 0, 0);\n\t-webkit-transition: -webkit-transform 0.1s linear;\n\ttransform: rotate(0deg) translate3d(-5px, 0, 0);\n\ttransition: transform 0.1s linear;\n  }\n  &.expanded:before {\n\t-webkit-transform: rotate(90deg) translate3d(-5px, 0, 0);\n\ttransform: rotate(90deg) translate3d(-5px, 0, 0);\n  }\n}\n\n.panel-group .panel-heading+.panel-collapse .panel-body {\n\tborder-top: 0;\n}\n\n.panel-group {\n\tmargin: 0;\n\toverflow: auto;\n\tborder-radius: 0;\n}\n\n.panel-group .panel {\n\tborder-radius: 0;\n}\n\n.panel-group .panel+.panel {\n\tmargin: 0;\n}\n\n.panel-heading {\n\tborder-radius: 0;\n\tpadding: 0;\n}\n\n.result li:hover,\n.panel-heading:hover {\n\tcolor: @editor-text-hover;\n\tbackground-color: @bg-light;\n\tbackground-image: none;\n}\n\n.panel-title .glyphicon {\n\tmargin-right: 6px;\n\tmargin-left: 6px;\n}\n\n.result,\n.panel-body,\n.panel-body ul {\n    padding: 0;\n    margin: 0;\n    border-top: 0;\n}\n\n.result tr,\n.panel-body li {\n\tcursor: pointer;\n}\n.panel-body>ul {\n  padding-top: 0.5em;\n}\n.panel-body li {\t// browse list item\n    padding: 8px 0 8px 28px;\n}\n\nli.active,\n.panel-body li:hover {\n\tcolor: @editor-text-hover;\n}\n"
  },
  {
    "path": "less/core.less",
    "content": "html, body {\n  margin: 0;\n  border: 0;\n  padding: 0;\n}\n\na::-moz-focus-inner {\n  border: 0px solid transparent;\n  outline: 0 !important;\n}\nbody.uaFirefox a:active, body.uaFirefox a:focus {\n  outline: 0 !important;\n}\n\nspan>svg {\n  vertical-align: middle;\n}\n\n:active {\n  box-shadow: none !important;\n}\n\ninput, textarea, button {\n  &:active, &:focus {\n\toutline: 0 !important;\n  }\n}\n\nhtml.hVizor, body.bEditor, body.bPlayer {\n\theight: 100%;\n\twidth: 100%;\n\toverflow: hidden;\n}\n\nbutton, button:focus {\t// force no button outlines\n\toutline: 0 ! important;\n\t-webkit-tap-highlight-color: rgba(0, 0, 0, 0) !important;\n}\n\nbody {\n\tfont-family: @font-family-sans-serif;\n\ttext-shadow: none;\n\tline-height: @line-height-base;\n\tfont-size: @font-size-base;\n}\n\n// fix webkit fullscreen when container dimensions are not specified\n// and webvr manager keeps adjusting canvas dimensions to parent\n.webgl-container-fs, .webgl-canvas-fs {\n  height: 100% ! important;\n  width: 100% ! important;\n  min-height: 100% ! important;\n  min-width: 100% ! important;\n  margin:0;\n}\n\n.mixinSelectAllow {\n  -webkit-touch-callout: initial;\n  -webkit-user-select: initial;\n  -khtml-user-select: initial;\n  -moz-user-select: initial;\n  -ms-user-select: initial;\n  user-select: initial;\n}\n\n.mixinSelectDeny {\n  -webkit-touch-callout: none;\n  -webkit-user-select: none;\n  -khtml-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n.noselect {\n\t.mixinSelectDeny;\n\n\t.doselect {\n\t  .mixinSelectAllow;\n  \t}\n}\n.noselect_all, .noselect_all * {\n  \t.mixinSelectDeny;\n\n    .doselect_all, .doselect_all * {\n\t .mixinSelectAllow;\n\t}\n}\n\n\n\n\n*[contenteditable]:not([disabled]) {\n\t-webkit-touch-callout: initial;\n\t-webkit-user-select: initial;\n\tuser-select: initial;\n}\n\n#dbg\n{\n\tdisplay: none;\n\tfont-size: 12px;\n\tpadding: 0;\n\tmargin: 0;\n}\n\n#canvas_parent {\n\tz-index: 1;\n\toverflow: auto;\n\tposition: relative;\n\tborder: none;\n}\n\n#canvas {\n\tposition: relative;\n\tz-index: 2;\n}\n\n#structure\n{\n\tpadding-left: 24px;\n\tmargin: 16px;\n\toverflow: auto;\n\tcolor: @editor-text-default;\n}\n\n.btn { \n\tborder-radius: 0;\n}\n\nol, ul\n{\n    list-style: none;\n}\n\noptgroup\n{\n\tcolor: #fff;\n\tbackground-color: #444;\n}\n\n/* tables still need 'cellspacing=\"0\"' in the markup */\ntable\n{\n    border-collapse: collapse;\n    border-spacing: 0;\n    background: none;\n}\n\n.nodisplay\n{\n\tdisplay: none;\n}\n\n.nojs\n{\n\twidth: 500px;\n\tmargin-left: 20px;\n\tmargin-top: 20px;\n\tvertical-align: center;\n}\n\n\n.iconic-nav, .buttons {\n  height: @menu-bar-height;\n  >* {\n\theight: @menu-bar-height;\n    position: relative;\n\tdisplay: inline-block;\n  }\n  button, div.button {\n\toutline: none;\n    font-family: @font-family-sans-serif;\n\tbackground: none;\n    padding: 0;\n    height: @menu-bar-height;\n    vertical-align: top;\n\tbox-shadow:  0 0 0 rgba(0,0,0,0);\n\tsvg {\n\t  width: 32px;\n\t  height: 32px;\n\t  display: block;\n\t  margin: 0 auto 3px auto;\n\t  stroke: @editor-text-default;\n\t  overflow: visible;\n  \t}\n\tspan {\n\t  font-weight: 600;\n\t  font-size: 12px;\n\t  text-align: center;\n\t  margin: 0 auto;\n\t  color: @editor-text-default;\n  \t}\n\t&:hover {\n\t  span {\n\t\tcolor: @editor-text-hover;\n\t  }\n\t  svg {\n\t  \tstroke: @editor-text-hover;\n\t  }\n\t}\n\t&:active {\n\t  span {\n\t\tcolor: @editor-text-active;\n\t  }\n\t  svg {\n\t\tstroke: @editor-text-active;\n\t  }\n\t}\n  }\n}\n\n\n\nul.iconic-nav>li.open>button svg {\n    stroke: @editor-text-active;\n}\nul.iconic-nav>li.open>button .icon-file-menu {\n    transform: rotate(180deg);\n}\nul.iconic-nav>li.open>button span {\n    color:  @editor-text-active;\n}\n\n\n\n\n#top-header-logo svg {\n    width: 66px;\n    height: 24px;\n    overflow: visible;\n    position: absolute;\n    left: 45px;\n    top: 50%;\n    margin-top: -12px;\n}\n\n.info-pane {\n\tmargin-right: 20px;\n\tmargin-left: 5px;\n\tmargin-top: 5px;\n}\n\n.info-pane span {\n\tfont-size: 16px;\n}\n\n#infopanelogo {\n\theight: 18px;\n\tmargin-top: -2px;\n\tmargin-left: 5px;\n\tmargin-right: 5px;\n}\n\n#user-pulldown {\n\tmargin: 0 0px;\n}\n\n#graph-title {\n\tcolor: #666;\n\theight: 28px;\n\ttext-align: center;\n\tpadding: 7px 10px 0px 7px;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\tdisplay: none;\n\tborder-right: 10px solid #222;\n}\n\n\n.block-header {\n  width: @chat-width;\n  height: @blocks-header-height;\n  position: relative;\n  font-size: @tabs-font-size;\n  font-weight: 500;\n  color: #ffffff;\n  border-bottom: 1px solid @bg-darker;\n  background: @bg-dark;\n  .nav-tabs {\n\theight: @blocks-header-height;\n\tposition: relative;\n\tdisplay: table;\n\tfloat: left;\n\tborder: 0;\n\twidth: @floating-box-width - (@blocks-header-height * 2);\n\t> li {\n\t  text-align: center;\n\t  display: table-cell;\n\t  float: none;\n\t  >a, >span {\n\t\tborder-radius: 0;\n\t\tborder: 0;\n\t\tmargin: 0;\n\t\ttext-decoration: none;\n\t\tbackground: none;\n\t  }\n\t  >span, >a, >a:active {\n\t\tpadding-top: (@blocks-header-height / 2) - (@tabs-font-size * 0.75);\n\t\theight: @blocks-header-height;\n\t\toutline: none;\n\t\tcolor: @editor-text-inactive;\n\t  }\n\t  >a:hover, >a:focus {\n\t\tbackground: @bg-dark;\n\t\tcolor: @editor-text-active;\n\t  }\n\t  &.active>a {\n\t\tbackground: none;\n\t\tcolor: @editor-text-default;\n\t\tbackground: @bg-light;\n\t\tborder: 0;\n\t  }\n\t}\n  }\n}\n\n\n.block-header h4 {\n    background: none;\n    color: @editor-text-default;\n    display: block;\n    width: @floating-box-width - (@blocks-header-height * 2);\n    text-align: center;\n    padding: 10px 20px;\n    font-size: 14px;\n    font-weight: 600;\n    margin: 0;\n    float: left;\n    box-sizing: border-box;\n}\n\n.block-header>button {\n    width: @blocks-header-height;  \n    background: none;\n    border: 0 none;\n    border-radius: 0;\n    height: @blocks-header-height;\n    float: left;\n    position: relative;\n}\n.block-header>button:hover, .block-header>button:active {\n    background: none;\n}\n\n.block-header>button svg {\n    width: 16px;\n    height: 16px;\n    fill: @editor-text-default;\n    position: absolute;\n    left: 50%;\n    top: 50%;\n    margin: -8px 0 0 -8px;\n}\n.block-header>button:hover svg {\n    fill: #ffffff;    \n}\n.collapsed .toggle-button svg {\n    -webkit-transform: rotate(-90deg);\n    transform: rotate(-90deg);\n}\n\n.floating-box {\n    position: absolute;\n    top: @menu-bar-height + @breadcrumb-height + 40;\n    border-radius: 6px;\n    background: @bg-light;\n    width: @floating-box-width;\n    overflow: hidden;\n    box-shadow: 0 1px 2px rgba(0,0,0,0.3);\n}\n\n#load-spinner {\n\tposition: absolute;\n\tleft: 15px;\n\ttop: 50%;\n\topacity: 0.65;\n\twidth: 18px;\n\theight: 18px;\n\tbackground: url('/images/load-spinner.gif');\n\tbackground-size: 100% 100%;\n\tmargin-top: -9px;\n}\n\n.header .btn {\n\theight: 28px;\n\tdisplay: block;\n\tfloat: left;\n\tmargin-right: 2px;\n}\n\n.header .btn.save-button {\n\tmargin-right: 0;\n}\n\n\n#canvas\n{\n\tbackground-size: 100% 100%;\n\toverflow: hidden;\n}\n\n#load-snippet\n{\n\tmin-height: 40px;\n}\n\n.e_btn\n{\n\tfont-size:11px;\n\tfont-weight:normal;\n\t-moz-border-radius:3px;\n\t-webkit-border-radius:3px;\n\tborder-radius:3px;\n\tborder:1px solid #888;\n\tpadding:3px 4px;\n\ttext-decoration:none;\n\tcolor:#000;\n\tdisplay:inline-block;\n\ttext-shadow:1px 48px 0px #ffffff;\n \t-webkit-box-shadow:inset 1px 1px 0px 0px #ffffff;\n \t-moz-box-shadow:inset 1px 1px 0px 0px #ffffff;\n \tbox-shadow:inset 1px 1px 0px 0px #ffffff;\n\tbackground:-moz-linear-gradient(center top, #fdfdfd 5%, #c8c8c8 100%);\n\tbackground:-ms-linear-gradient(top, #fdfdfd 5%, #c8c8c8 100%);\n\tbackground:-webkit-gradient(linear, left top, left bottom, color-stop(5%, #fdfdfd), color-stop(100%, #c8c8c8));\n\tbackground-color:#fdeded ;\n}\n\n.e_btn:active\n{\n\tbackground:-moz-linear-gradient(center top, #fdfdfd 100%, #c8c8c8 5%);\n\tbackground:-ms-linear-gradient(top, #fdfdfd 100%, #c8c8c8 5%);\n\tbackground:-webkit-gradient(linear, left top, left bottom, color-stop(100%, #fdfdfd), color-stop(5%, #c8c8c8));\n\tposition:relative;\n}\n\n.plugin\n{\n\tfont-size: 8pt;\n\tbackground-color: #eee;\n\tz-index: 100;\n\tpadding: 0px;\n\tposition: absolute;\n\twhite-space: nowrap;\n}\n\n\n.graph-node .plugin-row td {\n\t//background: #eee;\n}\n\n.proxy, .proxy .plugin-row td\n{\n\tbackground: #badaff !important;\n}\n\n.variable\n{\n\tbackground: #c6ffc8 !important;\n}\n\n.loop, .loop .plugin-row td {\n\tbackground: #ffc6ee !important;\n}\n\n.arrayfunction, .arrayfunction .plugin-row td {\n\tbackground: #33c6fe !important;\n}\n\n.config_btn\n{\n\tbackground-image: url('/images/config.png') !important;\n\tbackground-repeat: no-repeat !important;\n\tbackground-size: 16px 16px!important;\n\tbackground-position: center center!important;\n\tposition: relative;\n\toutline: none;\n\tpadding: none !important;\n}\n\n.config_btn:hover {\n\topacity: 1.0;\n}\n\n.config_btn:active {\n\tborder: 0px !important;\n\toutline: 0 !important;\n\tbox-shadow: none !important;\n\t-moz-box-shadow: none !important;\n\toutline-offset: 0 !important;\n}\n\n\n\n.plugin-icon\n{\n\tfloat: left;\n\twidth: 18px;\n\theight: 18px;\n\tpadding: 0;\n\tmargin: 0;\n\tmargin-right: 2px;\n\tmargin-bottom: 2px;\n\tposition: relative;\n\ttop: 1px;\n\tleft: 1px;\n\tbackground-color: #ddd !important;\n\tborder: 1px solid #ddd;\n\tcursor: default;\n}\n\n.webgl-canvas-normal\n{\n\tbackground-color: #000;\n\tposition: absolute;\n\twidth: 100%;\n\theight: 100%;\n\tpadding: 0px;\n\tmargin: 0px;\n}\n\n.webgl-canvas-fs\n{\n\tbackground-color: #000;\n\tposition: absolute;\n\tleft: 0px;\n\ttop: 0px;\n\twidth: 100%;\n\theight: 100%;\n\tz-index: 10000;\n}\n\n.widget { font-family: Verdana,Arial,sans-serif; font-size: 1em;}\n.state-hover { background: #ffffff; font-weight: normal; color: #212121; }\n.state-hover a, .state-hover a:hover { color: #212121; text-decoration: none; }\n\n.corner-all { -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px; -khtml-border-top-left-radius: 4px; border-top-left-radius: 4px; }\n.corner-all { -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px; -khtml-border-top-right-radius: 4px; border-top-right-radius: 4px; }\n.corner-all { -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px; -khtml-border-bottom-left-radius: 4px; border-bottom-left-radius: 4px; }\n.corner-all { -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px; -khtml-border-bottom-right-radius: 4px; border-bottom-right-radius: 4px; }\n\n.slider-value {\n\ttext-align: center\n}\n\n.modal {\n  position: absolute;\n  -webkit-font-smoothing: subpixel-antialiased;\n}\n\n.nav li a h4 {\n\tcolor: @gray-light;\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n\tfont-weight: normal;\n\tfont-size: 13px;\n}\n\n.form-control {\n\tbackground-color: @bg-darker;\n\tborder-radius: 4px;\n\tborder: 0 none;\n\tcolor: @editor-text-hover;\n\theight: @searchbox-height;\n\tpadding: 0 8px;\n}\n\n#about {\n\tpadding: 5px;\n\tmargin-top: 8px;\n}\n\n.left-cell {\n\tflex: 0 0 @left-cell-width;\n\twidth: @left-cell-width;\n\tmin-width: 10px;\n\tmax-width: @left-cell-width;\n}\n\n.strikethru {\n\ttext-decoration: line-through;\n}\n\n.btn-dropdown {\n\tborder-left: 1px solid @gray-base;\n\tline-height: @line-height-small;\n}\n\n.node-title-input {\n\tposition: absolute;\n\ttop: 1px;\n\twidth: 100%;\n\tborder: none;\n\theight: 20px;\n}\n\n.panel-default > .panel-heading {\n\tcursor: pointer;\n}\n\n.plugin-drag-preview {\n\tposition: fixed;\n\topacity: 1.0;\n\tborder: 2px dashed @bg-bright;\n\tborder-radius: 4px;\n\tbackground: rgba(30,35,49,0.9);\n\tcolor: @editor-text-default;\n\tbox-shadow: 0px 0px 25px rgba(0,0,0,0.25);\n\tpadding: 25px 40px;\n\tpointer-events: none;\n\tfont-weight: 600;\n\tz-index: 10000;\n\ttext-align: center;\n\tfont-size: 14px;\n\twhite-space: nowrap;\n\toverflow: visible;\n\tspan {\n\t\tdisplay: block;\n\t\tfont-weight: 300;\n\t\tfont-size: 14px;\n\t\ttext-transform: uppercase;\n\t}\n\t.drag-add-icon {\n\t    position: absolute;\n\t    width: 21px;\n\t    height: 21px;\n\t    background: @bg-bright;\n\t    border-radius: 100%;\n\t    top: -10px;\n\t    left: -10px;\n\t    box-shadow: 0 2 4 rgba(0,0,0,0.5);\n\t    svg {\n\t        position: absolute; \n\t        left: 5px;\n\t        top: 5px;\n\t        width: 11px;\n\t        height: 11px;\n\t        fill: #ffffff;\n\t    }\n\t}\n\n}\n\n.dragging-allowed,\n.dragging-allowed * {\n\tcursor: grab;\n}\n\n.dragging-allowed {\n\tposition: absolute;\n\tz-index: 62;\n}\n\n.dragging-not-allowed:hover {\n    cursor: no-drop;\n    * {\n        pointer-events: none;\n    }\n}\n\n.floating-box.dragging-not-allowed {\n\t* {\n\t\tuser-select: none;\n\t   -o-user-select: none;\n\t   -moz-user-select: none;\n\t   -khtml-user-select: none;\n\t   -webkit-user-select: none;\n\t}\n    transition: opacity 0.3s;\n    z-index: 65;\n}\n\n.floating-box.dragging-not-allowed:hover {\n    cursor: grab;\n    opacity: 0;\n    * {\n        pointer-events: none;\n    }\n}\n\n.dragging-allowed.dragging-on-top {\n\tbackground: rgba(24,27,34,0.8);\n}\n\n.bootbox-body h4 {\n\tline-height: 2;\n}\n\n.searchbox {\t// div\n    background: @bg-darker;\n    height: @searchbox-height;\n    position: relative;\n}\n\n.floating-box .searchbox {\n  background: @bg-light;\n}\n\n.searchbox svg {\n    position: relative;\n    margin-right: 10px;\n    width: 40px;\n    height: 40px;\n    float: right;\n    stroke: @editor-text-default;\n}\n\n.searchbox input {\n    background: none;\n    border: 0;\n    outline: 0;\n    width: @floating-box-width - 90;\n    font-family: @font-family-sans-serif;\n    float: left;\n    color: @editor-text-hover;\n    font-size: 12px;\n    font-weight: 500;\n    height: 18px;\n    margin-left: 18px;\n    margin-top: 11px;\n    padding: 0;\n    -moz-appearance: textfield;\n    -webkit-appearance: textfield;\n    appearance: textfield;\n    box-shadow: 0 0 0 rgba(0, 0, 0, 0)!important;\n}\n\n.searchbox input::-webkit-input-placeholder { \n    color: @editor-text-current;\n}\n.searchbox input::-moz-placeholder { \n   color: @editor-text-current;\n   opacity:  1;\n}\n\n\n.panel-heading {\n    background: @bg-light!important;    \n}\n\n.panel {\n    border:0;\n  \tborder-bottom: 1px solid @bg-darker;\n}\n\n.drag-handle {\n    cursor: grab;\n    position: relative; \n    height: @drag-helper-height;\n    width: 100%;\n    background: @bg-light;\n    border-bottom: 1px solid @bg-darker;\n    box-sizing: border-box;\n}\n\n.bottom-panel {\n    height: @bottom-panel-height;\n    width: 100%;\n    text-align: center;\n    background: @bg-light;\n    position: absolute;\n    bottom: 0;\n    left: 0;\n    z-index: 66;\n    >ul {\n        height: @bottom-panel-height;\n        display: block;\n        padding: 0;\n        >li {\n            height: @bottom-panel-height;  \n            display: block;\n            float: left;\n            position: relative;\n            width: 60px;\n            background: @bg-darker;\n            >button {\n                height: @bottom-panel-height;\n                position: relative;\n                background: none;\n                outline: none!important;\n                width: 60px;\n                svg {\n                    position: absolute;\n                    height: 26px;\n                    width: 26px;\n                    overflow: visible;\n                    margin: -13px 0 0 -13px;\n                    top: 50%;\n                    stroke: @editor-text-default;\n                    }\n                &.disabled {\n\t\t            opacity: 1;\n\t\t            svg {\n\t\t                stroke: @editor-text-current!important;\n\t\t            }\n\t\t        }\n            }\n            &.active:before {\n\t\t        content: '';\n\t\t        display: block;\n\t\t        width: 100%;\n\t\t        height: 3px;\n\t\t        top: 0;\n\t\t        left: 0;\n\t\t        position: absolute;\n\t\t        background: @bg-bright;\n\t\t   }\n        }\n        :hover button svg {\n                    stroke: @editor-text-active;\n            }\n        button {\n            cursor: pointer;\n            }\n    }\n}\n.playback-controls {\n    margin: 0 auto;\n    width: 180px;\n    position: relative;\n}\n\nbutton.show-timeline {\n   display: block;\n   height: @bottom-panel-height;\n   position: absolute;\n   left: 44px;\n   top: 0;\n   background: none;\n   outline: none!important;\n   padding: 0;\n   svg {\n       position: absolute;\n       height: 26px;\n       width: 26px;\n       overflow: visible;\n       margin: -13px 0 0 -13px;\n       top: 50%;\n       stroke: @editor-text-default;\n       left: @bottom-panel-height / 2;\n    }\n    span {\n        display: block;\n        padding: 2px 6px;\n        background: @bg-darker;\n        color: @editor-text-default;\n        text-transform: uppercase;\n        letter-spacing: 2px;\n        text-align: center;\n        position: relative;\n        margin-left: @bottom-panel-height;\n        border-radius: 4px;\n        }\n}\n\nbutton.show-timeline:hover span {\n    color: @editor-text-active;\n}\n\nbutton.show-timeline:hover svg {\n    stroke: @editor-text-active;\n}\n\n.view-modes {\n    position: absolute;\n    right: 100px;\n    top: 0;\n    border-width: 0 1px;\n    border-color: @bg-darker;\n    border-style: solid;\n    li {\n        width: 36px;\n        button {\n            width: 36px;\n            svg {\n                left: 50%; \n                }\n            }\n        }\n}\n.popover {\n    border: 0 !important;\n    border-radius: 5px!important;\n    background-color: @bg-light!important;\n    color: @chat-text-color!important;\n    font-size: 12px;\n  \tline-height:1.5em;\n    padding: 16px 20px;\n}\n.popover-title {\n    padding: 0!important;\n    background: none!important;\n    border: 0!important;\n    font-size: 12px;\n    }\n.popover-content {\n    background: none!important;\n    padding: 0!important;\n}\n.popover-content .readmore {\n    padding: 12px 0 0!important;\n    border-top: 1px solid @bg-darker !important;\n}\n.popover.bottom > .arrow::after {\n    border-bottom-color: @bg-light!important;\n}\n.popover.top > .arrow::after {\n    border-top-color: @bg-light!important;    \n}\n\n.resize-handle {\n    display: block;\n    position: absolute;\n    bottom: 0;\n    left: 0;\n    width: 100%;\n    height: 4px;\n    cursor: n-resize;\n    z-index: 42;\n}\n\n#drag-overlay {\n\tdisplay: none;\n\twidth: 100%;\n\theight: 100%;\n\tposition: fixed;\n\ttop: @menu-bar-height + @breadcrumb-height;\n\tleft: 0;\n\tbackground-image: linear-gradient(-180deg, rgba(5,150,203,0.9) 0%, rgba(128,0,210,0.9) 100%);\n\tz-index: 1050;\n\t#drop-area, #drop-uploading {\n\t\twidth: 200px;\n\t\theight: 200px;\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\tleft: 50%;\n\t\tmargin: -100px 0 0 -100px;\n\t\ttext-align: center;\n\t\tpointer-events: none;\n\t\tdisplay: none;\n\t\tspan {\n\t\t\tcolor: @editor-text-active;\n\t\t\tfont-weight: 300;\n\t\t\tfont-size: 22px;\n\t\t\ttext-align: center;\n\t\t\tposition: absolute;\n\t\t\tbottom: 0;\n\t\t\tleft: 0;\n\t\t\twidth: 100%;\n\t\t\theight: 30px;\n\t\t}\n\t}\n\t#drop-area {\n\t\t.icon-drop-upload {\n\t\t\tposition: relative;\n\t\t\tmargin: 0 auto;\n\t\t\twidth: 150px;\n\t\t\theight: 150px;\n\t\t\tfill: @editor-text-active;\n\t\t}\n\t}\n\t#drop-uploading {\n\t\t.icon-drop-uploading {\n\t\t\tposition: absolute;\n\t\t\twidth: 64px;\n\t\t\theight: 64px;\n\t\t\ttop: 50%;\n\t\t\tleft: 50%;\n\t\t\tmargin: -32px 0 0 -32px;\n\t\t\ttransform: rotate(-360deg);\n\t\t\tanimation: rotateUploadIcon 2s infinite linear;\n\t\t\tstroke: @editor-text-active;\n\t\t}\n\t}\n}\n\n@keyframes rotateUploadIcon {\n\t0% {\n\t\ttransform: rotate(0deg);\n\t}\n\t100% {\n\t\ttransform: rotate(-360deg);\n\t}\n}\n\nbody.bEditor #progressbar {\n    display: none;\n    position: absolute;\n    top: @menu-bar-height + @breadcrumb-height;\n    left: 0;\n    margin: 0;\n    width: 1px;\n    height: 3px;\n    background: #385A8A;\n    z-index: 67;\n}\n\n.twocol {\n  >.col {\n\twidth: 49.5%;\n\ttext-align: left;\n\t&.left {float:left;}\n\t&:first-child {float:left}\n\t&.right {\n\t  float:right;\n\t  &.pull {text-align:right}\n\t}\n\t&:last-child {\n\t  float:right;\n\t  &.pull {text-align:right}\n\t}\n\n  }\n}\n\n.cols-flex {\n\tdisplay: flex;\n\tflex-direction: row;\n\tjustify-content: space-between;\n\t>.col {\n\t\tflex: 1;\n\t}\n}\n\n// svgs sometimes prevent button events from triggering (ios), this fixes it\nbutton.svg>svg, a.btn.svg>svg {\n  pointer-events: none;\n}\n\nbody.layoutMobile .nomobile,\nbody.layoutTablet .notablet,\nbody.layoutDesktop .nodesktop {\n  display: none !important;\n}\n\n// prevent flash of device-specific content\n@media screen and (min-width: @threshold-mobile) {\n  .mobileonly {\n\tdisplay: none !important;\n  }\n}\n@media screen and (max-width: @threshold-mobile) {\n  .nomobile {\n\tdisplay: none !important;\n  }\n}\n\nbody.deviceMobile .noDeviceMobile,\nbody.deviceTablet .noDeviceTablet,\nbody.deviceDesktop .noDeviceDesktop {\n  display: none !important;\n}\n\nbody {\n  &.layoutTablet, &.layoutDesktop {\n\t.mobileonly { display: none !important;}\n  }\n  &.layoutTablet, &.layoutMobile {\n\t.desktoponly {display: none !important;}\n  }\n  &.layoutDesktop, &.layoutMobile {\n\t.tabletonly { display: none !important;}\n  }\n  &.deviceTablet, &.deviceDesktop {\n\t.mobileDeviceOnly { display: none !important;}\n  }\n  &.deviceTablet, &.deviceMobile {\n\t.desktopDeviceOnly {display: none !important;}\n  }\n  &.deviceDesktop, &.deviceMobile {\n\t.tabletDeviceOnly { display: none !important;}\n  }\n  &.playing.hasHMD {\n    #entervr {\n      display: block !important;\n\t}\n  }\n}\n\n.launch-button-macro {\n  display: block;\n  border:1px solid @bordercolor-launch-button;\n  padding: 15px 20px;\n  background: none;\n  margin: 20px 0;\n  border-radius: 6px;\n  font-weight: @font-weight-home;\n  font-size: 150%;\n  width: 11em;\n  &:hover {\n\tborder:2px solid #fff;\n\tpadding-top: 14px;\n\tpadding-bottom: 14px;\n  }\n}\n\n.nofx {\n  outline: 0;\n  border:0;\n  background: none;\n  padding: 0;\n  text-decoration: none;\n  a&:hover {\n\tbackground: none;\n  }\n}\n\n.readmore(@vsize, @offsetLeft) {\n  @voffset: @vsize/2 + @offsetLeft;\n  &:before {\n\t  content: \" \";\n\t  position: absolute;\n\t  left: 0;\n\t  top: 50%;\n\t  margin-top: -@vsize/2;\n\t  width: @vsize;\n\t  height: @vsize;\n\t  background: url('/images/v2/chevron.svg') @voffset center no-repeat;\n\t  background-size: @vsize - 1;\n\t  -webkit-transform: rotate(0deg) translate3d(-@voffset, 0, 0);\n\t  -webkit-transition: -webkit-transform 0.1s linear;\n\t  transform: rotate(0deg) translate3d(-@voffset, 0, 0);\n\t  transition: transform 0.1s linear;\n\t}\n\t&.open:before {\n\t  -webkit-transform: rotate(90deg) translate3d(-@voffset, 0, 0);\n\t  transform: rotate(90deg) translate3d(-@voffset, 0, 0);\n\t}\n\n\tposition: relative;\n\tdisplay: block;\n\n\tpadding: 5px 0 5px @vsize;\n\n\t&:hover {\n\t  text-decoration: none;\n\t  cursor: pointer;\n\t}\n\t&.btn:before {\n\t  content:none;\n\t}\n}\n\n.center-neg-margin(@width, @height) {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  width: @width;\n  height: @height;\n  margin-left: -@width/2;\n  margin-top: -@height/2;\n}\n\n\n.mixin-threecol {\n  .threecol.clearfix {\n\t.col {\n\t  box-sizing: border-box;\n\t  width: 33.3%;\n\t  padding: 0;\n\t  &.left, &.mid {\n\t\tfloat:left;\n\t  }\n\t  &.right {\n\t\tfloat:right;\n\t  }\n\t}\n  }\n}"
  },
  {
    "path": "less/editor.less",
    "content": "/* only things to do with patch editor / visual programming layer */\n/* authors georgi marinov, ivan mukho */\n\n@vp-node-bg:         \t\t\t#4D7DC2;\n@vp-node-content-bg:\t\t\trgba(0,0,0,0.3);\n@vp-node-color: \t \t\t\t@device-def-color;\n@vp-node-text-size:\t\t\t\t10.3pt;\n@vp-node-border-radius: \t\t@border-radius-base;\n\n@vp-node-slot-text-size:\t\t@vp-node-text-size - 1.5pt;\n@vp-node-slot-text-color-default: \t#ddd;\n@vp-node-slot-text-color-connected: white;\n@vp-node-slot-text-color-connecting: yellow;\n\n@vp-node-button-padding:\t\t2px 5px;\n@vp-node-button-margin:\t\t\t2px;\n@vp-node-button-text-size:\t\t@vp-node-text-size - 1.5pt;\n@vp-node-button-color:\t\t\t#fff;\t//@btn-primary-color;\n@vp-node-button-background: \t@btn-primary-bg;\n@vp-node-button-border-color: \t@btn-primary-border;\n@vp-node-button-border-radius: \t@border-radius-small;\n\n\ndiv.menu-bar {z-index:100;}\t// #756\n\n.wkForceSubpixel {\n  -webkit-font-smoothing: subpixel-antialiased;\n}\n\n.uiTextArea,\ndiv.graph-node .p_content .p_plugin div.uiTextArea {\n  padding-top: \t2px;\n  margin: \t\t5px 0 2px 18px;\n  >textarea {\n\t-webkit-appearance: none;\n\tcolor: #fff;\n\tbackground: none;\n\tbackground: transparent;\n\tfont-size\t: 8.7pt;\n    line-height : 1.45;\n\tmargin\t\t: 0 0 5px 0;\n\tborder\t: 0;\n\tpadding: 2px;\n\t.wkForceSubpixel;\n\t.scrollbar;\n  }\n  >.resizecorner {\n\tbottom \t: 0;\t// control may override these\n    right \t: 0;\t//\t\"\n\twidth: 12px;\n\theight: 12px;\n\topacity: 0.1;\n\t&:hover {\n\t  cursor: nwse-resize;\n\t}\n  }\n}\n\n\n/* graphics */\n\nbutton.vp.svg {\t// for (square) buttons with svg icons inside\n\tbackground: none;\n\tposition: relative;\n\toutline: none;\n\tpadding: 0 !important;\n  \topacity: 0.8;\n  \t&.p_fade {\n\t \topacity: 0.4;\n\t}\n  \t&:hover, &.p_fade:hover {\n\t  opacity: 0.85;\n\t}\n  \t&:active, &.p_fade:active {\n\t  opacity: 1.0;\n\t  border: 0px;\n\t  outline: 0 !important;\n\t  box-shadow: none !important;\n\t  -moz-box-shadow: none !important;\n\t  outline-offset: 0 !important;\n\t}\n  \tsvg {\n\t  width: 16px;\n\t  height: 16px;\n\t  fill: @device-def-color;\n\t  position: absolute;\n\t  display: block;\n\t  left: 50%;\n\t  top: 50%;\n\t  margin: -8px 0 0 -8px;\n\t}\n}\n\n// adjustments for specific buttons\nbutton.vp.svg {\n  svg.cmd_edit_graph {\n\ttop: 53%;\n  }\n}\n\n\n/* nodes */\n\ndiv.graph-node.p_renamed .p_header > div span.p_title {color: #ffc;}\n\n@media screen and (-webkit-min-device-pixel-ratio:0) {\n  // force buttons to their specified width in webkit\n  div.graph-node .p_header>div span.p_title {width: 100%;}\n}\ndiv.graph-node {\n    -webkit-font-smoothing: subpixel-antialiased;\n  \tbox-shadow: 0 0 2px rgba(0,0,0,0.2);\n  \tdisplay: table;\n    border: 0;\n\tborder-spacing: 0;\n\tborder-radius: @vp-node-border-radius;\n\tbackground: @vp-node-bg;\n\tcolor: @vp-node-color;\n  \toverflow:hidden;\t// required by io or other inline nodes to round their corners\n  \t// note node-ui.js may set width:auto on this\n  \t&.p_renaming {\n\t  input.p_rename {\n\t\tposition : absolute;\n\t\ttop : 5px;\n\t\toutline:none;\n\t\tbackground: none;\n\t\tborder: 0;\n\t\tcolor:white ! important;\n\t\tfont-weight: 500;\n\t  }\n\t  .p_header .p_wrap {\n\t\tbutton.edit, .ic, .ic .p_slot span svg {visibility: hidden;}\n\t\tspan.p_title {color: rgba(1,1,1,0); width:auto;}\n\t  }\n\t}\n  \t.p_header {\n\t  position:relative;\n\t  border-top-left-radius: @vp-node-border-radius;\n\t  border-top-right-radius: @vp-node-border-radius;\n\t  >div {\n\t\t  display:table;\n\t\t  width:100%;\n\n\t\t  position:relative;\n\t\t  height: @device-header-height;\n\t\t  span.p_title {\n\t\t\t  font-weight: 500;\n\t\t\t  cursor: move;\n\t\t  }\n\t\t  span, button {\n\t\t\t  display: table-cell;\n\t\t\t  height: @device-header-height;\n\t\t\t  min-width: @device-header-height;\n\t\t\t  vertical-align: middle;\n\t\t  }\n\t\t  button {\t// node box button\n\t\t\t  height: @device-header-height;\n\t\t\t  width: @device-header-height ! important;\n\t\t\t  padding: 0;\n\t\t\t  margin: 0;\n\t\t\t  border: 0;\n\t\t\t  position:relative;\n\t\t\t  &.plugin-toggle svg {\n\t\t\t\t  width: 16px;\n\t\t\t\t  height: 16px;\n\t\t\t\t  fill: @device-def-color;\n\t\t\t\t  position: absolute;\n\t\t\t\t  display: block;\n\t\t\t\t  left: 50%;\n\t\t\t\t  top: 50%;\n\t\t\t\t  margin: -8px 0 0 -8px;\n\t\t\t  }\n\t\t  }\n\t\t  button {\n\t\t\tbackground: none;\n\t\t  }\n\t\t  button.plugin-toggle {\n\t\t\t  background-color: rgba(0,0,0,0.3);\n\t\t  }\n\t\t  span {\n\t\t\t  margin: 0;\n\t\t\t  padding: 0 20px 2px 10px;\n\t\t\t  //line-height: @vp-node-text-size;\n\t\t\t  font-size: @vp-node-text-size;\n\t\t\t  height: @device-header-height;\n\t\t  }\n\t  }\n\t  .p_ins, .p_outs {\t// in header\n\t\tdisplay:table-cell;\n\t  }\n\t}\n\t.p_slot {\t\t\t// in header\n\t  span.status {\n\t\t\tdisplay:table-cell;\n\t\t\tpadding:0;\n\t\t\twidth:32px;\n\t\t\tmin-width:32px;\n\t\t\theight: 27px;\n\t\t\tvertical-align: middle;\n\t\t\tposition:relative;\n\t\t\t>svg {\n\t\t\t  width: 8px; height: 8px;\n\t\t\t  position:absolute;\n\t\t\t  top: 50%;\n\t\t\t  left: 50%;\n\t\t\t  margin: -4px 0 0 -4px;\n\t\t\t  pointer-events: none;\n\t\t\t}\n\t\t\t>svg.p_on {visibility: hidden;}\n\t\t}\n\t  &.p_connected {\n\t\tcolor: @vp-node-slot-text-color-connected;\n\t\tspan.status>svg.p_on {visibility: visible;}\n\t\tspan.status>svg.p_off {visibility: hidden;}\n\t  }\n\t  &.p_connecting {\n\t\tcolor: @vp-node-slot-text-color-connecting;\n\t\tspan.status>svg.p_on {visibility: visible;}\n\t\tspan.status>svg.p_off {visibility: hidden;}\n\t  }\n\t}\n  \t.p_content {\n\t  \tbackground: @vp-node-content-bg;\n\t  \tdisplay: table;\n\t  \twidth:100%;\n\t  \theight:100%;\t// required for ins and outs to achieve 100% height\n\n\n\n\t  \t>.p_plugin, >.p_ins, >.p_outs {\n\t\t  position: relative;\n\t\t  display:table-cell;\n\t\t  height: 100%;\n\t\t}\n\t  \t>.p_ins {\n\t\t  >.p_in {\n\t\t  }\n\t\t}\n\t  \t>.p_outs {\n\t\t  text-align: right;\n\t\t  >.p_out {\n\t\t  }\n\t\t}\n\t  \t>.p_plugin {\n\t\t  width:100%;\n\t\t  vertical-align: middle;\n\t\t  vertical-position: 5%;\n\t\t  button {\t// node plugin content button\n\t\t\tbackground: @vp-node-button-background;\n\t\t\tborder: none;\n\t\t\tborder-radius: @vp-node-button-border-radius;\n\t\t\tfont-size: @vp-node-button-text-size;\n\t\t\tfont-weight: 600;\n\t\t\tcolor: @vp-node-button-color;\n\t\t\tpadding: @vp-node-button-padding;\n\t\t\tmargin: @vp-node-button-margin;\n\t\t\t&:hover {\n\t\t\t  text-shadow: 0px 0px 15px rgba(255,255,255,0.9);\n\t\t\t}\n\t\t\t&.state_on {\n\t\t\t  background: rgba(255,255,255,0.4);\n\t\t\t  color: #fff;\n\t\t\t}\n\t\t\t&.state_off {\n\t\t\t  background: rgba(0,0,0,0.4);\n\t\t\t  color: #ccc;\n\t\t\t}\n\t\t\t&.fxtrigger {\n\t\t\t  -webkit-transition: background 0.4s linear;\n\t\t\t  -moz-transition: background 0.4s linear;\n\t\t\t  transition: background 0.4s linear;\n\t\t\t}\n\t\t\t&.fxtrigger:active {\n\t\t\t  -webkit-transition: background 0s linear;\n\t\t\t  -moz-transition: background 0s linear;\n\t\t\t  transition: background 0s linear;\n\t\t\t  background: rgba(255,255,255,0.7);\n\t\t\t}\n\t\t  }\n\t\t  input, select, textarea {\n\t\t\tcolor: #fff;\n\t\t\tfont-size: @vp-node-text-size;\n\t\t\tbackground: rgba(0,0,0,0.3);\n\t\t\tborder: 1px solid rgba(255,255,255,0.3);\n\t\t\tborder-radius: 2px;\n\t\t\t-webkit-appearance: none;\n\t\t\tmargin: 1px ;\n\t\t  }\n\t\t  input:focus, select:focus, textarea:focus {\n\t\t\toutline:0;\n\t\t  }\n\t\t}\n\t  \t.p_in, .p_out {\n\t\t  color: white;\n\t\t}\n\t  \t.p_slot:last-of-type {\n\t\t\t// @todo fix plugins with unbalanced number of slots\n\t\t}\n\t\t.p_slot:only-of-type {\n\t\t  height:100%;\n\t\t}\n\t  \t.p_slot {\n\t\t\tposition:relative;\n\t\t  \tdisplay:table;\n\t\t  \tpadding:0; margin:0;\n\t\t  \tmin-width: 80px;\n\t\t  \theight: 20px;\n\t\t  \tcolor: @vp-node-slot-text-color-default;\n\t\t  \tspan.status {\n\t\t\t  background: rgba(0,0,0,0.15);\t// inside content area\n\t\t\t}\n\t\t  \tlabel {\n\t\t\t  font-size: @vp-node-slot-text-size;\n\t\t\t  font-weight: 600;\n\t\t\t  padding: 5px;\n\t\t\t  vertical-align: middle;\n\t\t\t  display:table-cell;\n\t\t\t  width:100%;\n\t\t\t}\n\t\t    &.p_in label {\n\t\t\t  padding: 5px 5px 5px 10px;\n\t\t\t}\n\t\t\t&.p_out label {\n\t\t\t  padding: 5px 10px 5px 5px;\n\t\t\t}\n\t\t}\n\n\t  \t.p_slot.p_compatible {\n\t\t  color: green;\n\t\t}\n\t  \t.p_slot.p_incompatible {\n\t\t  color: red;\n\t\t}\n\n\t}\n  \tinput.node-title-input {\n\t  \tcolor: #000 !important;\n  \t\tfont-size: @vp-node-text-size;\n\t}\n}\n\ndiv.graph-node.p_inline {\n  button.toggle {display:none;}\n}\n\n@io_hidden_width: 1px;\n\n\n// .has.single selectors weigh over .has\n// noodles need these to be displayed always, io or not\ndiv.graph-node .p_ins  {width:@io_hidden_width; min-width:@io_hidden_width; }\ndiv.graph-node .p_outs {width:@io_hidden_width; min-width:@io_hidden_width;}\n\ndiv.graph-node.p_has_ins div.p_content>div.p_ins,\ndiv.graph-node.p_has_outs div.p_content>div.p_outs {\n  .p_slot {\n  \twidth:auto; min-width: 5ex;\t// min-width required to solve e.g. color to HSL outputs etc.\n  }\n}\n\n// but make sure ins and outs are never too close to the UI or to each other\ndiv.graph-node div.p_content>div.p_ins>.p_slot {margin-right: 5px;}\ndiv.graph-node div.p_content>div.p_outs>.p_slot {margin-left: 5px;}\n\n// exceptions for specific plugins\ndiv.graph-node.p_id_envelope_modulator,\ndiv.graph-node.p_pi\n{\n  &.p_has_ins div.p_content>div.p_ins, &.p_has_outs>div.p_content>div.p_outs {\n\t.p_slot {\n\t  min-width: 5ex;\n\t}\n  }\n}\n\n\n// when a node has ins or outs in the header, hide their labels and set their width\ndiv.graph-node.p_header_in.p_has_ins div.p_header .p_ins,\ndiv.graph-node.p_header_out.p_has_outs div.p_header .p_outs {\n  min-width: 30px; width:30px;\n  label {\n\tdisplay:none;\n  }\n}\n// when a node displays header ins or outs, hide the empty slot columns in the content row\ndiv.graph-node.has_ins.p_header_in.p_1in div.p_content .p_ins,\ndiv.graph-node.has_outs.p_header_out.p_1out div.p_content .p_outs {\n  width:@io_hidden_width; min-width:@io_hidden_width;\n}\n\n\ndiv.graph-node {\n  box-shadow: 0 0 1px 1px rgba(0,0,0,0.3);\n}\ndiv.graph-node.p_inline {\n  box-shadow: none;\n}\ndiv.graph-node.p_inline .p_header {\n  height: 32px;\t/* fix 3px discrepancy in safari #804 */\n}\ndiv.graph-node.p_selected,\ndiv.graph-node.p_inline.p_selected\n{\n  box-shadow: 0 0 1px 1px rgba(255,255,255,0.8);\n}\n\ndiv.graph-node.p_collapse div.p_content, div.graph-node.p_collapse div.p_plugin {\n  display:none;\n}\n\n// edit button\n.graph-node .btn-xs {\n    color: @bg-darker;\n}\n\n\n.graph-node.p_collapse {\n  \tbutton.plugin-toggle {\n\t\t-webkit-transform: rotate(-90deg);\n\t\t-moz-transform: rotate(-90deg);\n\t\ttransform: rotate(-90deg);\n\t}\n}\n.pl_delete\n{\n\tbackground: #ff3b3b; /* Old browsers */\n\tbackground: -moz-linear-gradient(top,  #ff3b3b 1%, #df1b1b 100%); /* FF3.6+ */\n\tbackground: -webkit-gradient(linear, left top, left bottom, color-stop(1%,#ff3b3b), color-stop(100%,#df1b1b)); /* Chrome,Safari4+ */\n\tbackground: -webkit-linear-gradient(top,  #ff3b3b 1%,#df1b1b 100%); /* Chrome10+,Safari5.1+ */\n\tbackground: -o-linear-gradient(top,  #ff3b3b 1%,#df1b1b 100%); /* Opera 11.10+ */\n\tbackground: -ms-linear-gradient(top,  #ff3b3b 1%,#df1b1b 100%); /* IE10+ */\n\tbackground: linear-gradient(to bottom,  #ff3b3b 1%,#df1b1b 100%); /* W3C */\n}\n\n\n\n.ic {\n\ttext-align: left;\n\tvertical-align: top;\n}\n\n.oc {\n\ttext-align: right;\n\tvertical-align: top;\n}\n\n.pl_slot {\n\tcursor: pointer;\n\tpadding: 2px;\n}\n\n.pl_slot.connected {}\n.pl_slot.input {}\n.pl_slot.output {}\n.pl_slot.dynamic {}\n\n\n.p_ui_col\n{\n\tpadding: 10px;\n\tborder: none !important;\n\tvertical-align: top;\n}\n\n\n.p_content {\n  ::-webkit-scrollbar {\n\t  width: 8px;\n  }\n\n  ::-webkit-scrollbar-button {\n\t  display: none!important;\n  }\n\n  ::-webkit-scrollbar-track {\n\t  background-color: rgba(0,0,0,0.2);\n\t  border-radius: 3px;\n\t  width: 6px;\n  }\n\n  ::-webkit-scrollbar-track-piece {\n\t  background-color: rgba(0,0,0,0.2);\n  }\n\n  ::-webkit-scrollbar-thumb {\n\t  background-color: rgba(255,255,255,0.2);\n\t  border-radius: 3px;\n\t  width: 4px;\n\t  border: none;\n\t  background-clip: content-box;\n  }\n\n  ::-webkit-scrollbar-corner {\n\t  display: none!important;\n  }\n}\n\ndiv.graph-node.p_cat_meta {\n  background: rgba(182, 164, 0, 0.95);\n}\n\n\n@bgcolor-cat-value: \trgba(77,125,194,0.95);\n@bgcolor-cat-renderer: \trgba(89, 89, 109, 0.95);\n@bgcolor-cat-loader: \trgba(26, 19, 90, 0.94);\n@bgcolor-cat-environment: \t#59596D;\n@bgcolor-cat-material: rgba(71, 101, 141, 0.95);\n@bgcolor-cat-math: \trgba(40, 51, 66, 0.95);\n@bgcolor-cat-interaction: rgba(103, 0, 36, 0.95);\n\ndiv.graph-node.p_cat_value \t\t{ background: @bgcolor-cat-value }\ndiv.graph-node.p_cat_math \t\t{ background: @bgcolor-cat-math; color: #c4c4cc; }\ndiv.graph-node.p_cat_renderer \t{ background: @bgcolor-cat-renderer }\ndiv.graph-node.p_cat_loader \t{ background: @bgcolor-cat-loader}\ndiv.graph-node.p_cat_interaction\t{ background: @bgcolor-cat-interaction}\n\ndiv.graph-node.p_cat_material,\ndiv.graph-node.p_cat_texture \t{ background: @bgcolor-cat-material }\n\ndiv.graph-node.p_cat_environment {\n  background: @bgcolor-cat-environment;\n  .p_content button {\n\tbackground: rgba(255,255,255,0.4);\n\tcolor: #fff;\n  }\n}\ndiv.graph-node.p_cat_light {\n  background: rgba(185, 184, 140, 0.95);\n}\n\ndiv.graph-node.p_cat_compound {\n  background: rgba(82, 5, 104, 0.95);\n  .p_content button {\n\tbackground: rgba(255,255,255,0.4);\n  }\n}\n\n// regular inline cat_io nodes\ndiv.graph-node.p_cat_io .p_header\n{\n  .p_ins .p_slot, .p_outs .p_slot, span {\n  \tbackground: #C74C09;\n  }\n  svg {\n\tbackground: #EE5400;\n  }\n}\n\n// two inputs on this node (not inline)\ndiv.graph-node.p_cat_io.p_id_variable_local_write_conditional {\n  background: #24A219;\n  .p_ins .p_slot, .p_outs .p_slot, span {\n\tbackground: none;\n  }\n  svg {\n\tbackground: none;\n  }\n}\n\n// specific inline nodes\ndiv.graph-node.p_cat_io.p_id_variable_local_read .p_header,\ndiv.graph-node.p_cat_io.p_id_variable_local_write .p_header\n{\n  .p_ins .p_slot, .p_outs .p_slot, span {\n  \tbackground: #24A219;\n  }\n  svg {\n\tbackground: #17820B;\n  }\n}\n\n\ndiv.graph-node.p_id_color_picker {\n  .p_content {\n\ttable {\n\t  width: 100%;\n\t  font-size: 110%;\n\t  border-collapse: separate;\n\t  border-spacing: 3px;\n\t  th, td {\n\t\ttext-align: center;\n\t\tpadding: 2px 3px;\n\t\tmargin: 3px ! important;\n\t\tfont-weight: 600;\n\t\tborder:0;\n\t\twidth: 17%;\n\t  }\n\t  th:first-child, td:first-child {\n\t\twidth: 32%;\n\t  }\n\t  th {\n\t\tcolor: rgba(255,255,255,0.3);\n\t  }\n\t  td {\n\t\tbackground: rgba(0,0,0,0.3);\n\t\tborder-radius: 2px;\n\t\ttext-transform: uppercase;\n\t  }\n\t}\n\tinput.uiTextEntry {\n\t  font-size: 110%;\n\t  background: rgba(0,0,0,0.8);\n\t  text-transform: uppercase;\n\t  font-weight: 600;\n\t  width: 100%;\n\t  text-align: center;\n\t}\n\n  }\n}\n\ndiv.graph-node.p_id_data_info_display {\n  .p_content pre {\n\tmax-height: 200px;\n\twidth: 200px;\n  }\n}\n\n\ndiv.graph-node .p_content .p_plugin button.vp.svg.p_round {\n  width:44px;\n  height:44px;\n  background: rgba(30,30,30,0.9);\n  border-radius: 22px;\n  border:0;\n  outline:0;\n  opacity: 1;\n  &:hover {\n\topacity:1;\n\tbackground: rgba(30,30,30,0.9);\n  }\n  &:active {\n\topacity: 1;\n  }\n}\n\ndiv.graph-node.p_id_url_texture_generator {\n  div.p_plugin {\n\tposition:relative;\n\t// safari\n\tborder-bottom-left-radius: 4px;\n\tborder-bottom-right-radius: 4px;\n\toverflow: hidden;\n\t// /safari\n\t&.p_ui_col {padding:0;}\n\tdiv.p_thumbnail {\n\t  background: #000;\n\t  width:200px;\n\t  height:120px;\n\t  margin-bottom: 1px;\n\t  vertical-align: middle;\n\t  text-align: center;\n\t  opacity: 0.8;\n\t  z-index: 1;\n\t}\n\tbutton {\n\t  z-index: 2;\n\t  position:absolute;\n\t  left:50%;\n\t  top:50%;\n\t  margin-top: -22px;\n\t  margin-left: -22px;\n\t  svg {\n\t\tfill: #ccc;\n\t  }\n\t  &:hover svg {fill: #fff;}\n\t}\n  }\n}\n\ndiv.graph-node.p_cat_io.p_inline  {\n   background: none;\n  .p_header {\n\tbackground: none;\n  }\n}\n\ndiv.graph-node.p_inline  {\n  .p_content, .p_header .p_slot label {\n\tdisplay: none;\n  }\n  .p_ins, .p_outs {\n\tdiv.p_slot {\n\t  margin: 7px 0;\n\t  height: 18px;\n\t  width: 18px;\n\t  span.status {\n\t\twidth:16px;\n\t\tmin-width:16px;\n\t\theight: 14px;\n\t  }\n\t}\n  }\n  &.p_has_ins .p_slot, &.p_has_ins svg {\n\tborder-top-left-radius: 3px;\n\tborder-bottom-left-radius: 3px;\n  }\n  &.p_has_outs .p_slot, &.p_has_outs svg {\n\tborder-top-right-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n  }\n}\n\ndiv.graph-node.p_renaming {\n\t.p_header input {\n\t\t&::selection {\n\t\t\tbackground: rgba(0, 0, 0, 0.4);\n\t\t}\n\t\t&::-moz-selection {\n\t\t\tbackground: rgba(0, 0, 0, 0.4);\n\t\t}\n\t}\n\t&.p_inline {\n\t\t.p_header .p_wrap {\n\t\t\t.ic, .ic .p_slot span svg, span.p_title {visibility: visible;}\n\t\t}\n\t\t.p_header input { margin-top:1px; }\n\t}\n}\n\n// inline ins or outs\ndiv.graph-node.p_1in, div.graph-node.p_1out .p_header .p_slot span {width: 26px; min-width: 26px;}\n\ndiv.graph-node.p_inline .p_header.p_inline {\n  background: none;\n  button,svg {\n\tdisplay: inline-block;\n  }\n  svg.p_icon {\n\twidth: 32px;\n\theight: 32px;\n  }\n  .p_ins {\n\theight: 18px;\n\t.p_slot {\n\t  height: 18px;\n\t}\n  }\n\tspan.p_title {\n\t\tline-height: 32px;\n\t\tvertical-align: top;\n\t}\n}\n\ndiv.ace_content {text-align: left;}\n\ndiv.graph-node.p_id_knob_float_generator .p_content .p_plugin>div {\n  position: relative;\n  width: 100px;\n  height: 50px;\n  margin: 0 auto;\n  >div, >span {\n\tposition: absolute;\n\tz-index: 3001;\n  }\n  >span {\t// readout\n\tdisplay: block;\n\tborder-radius: 6px;\n\ttext-align: center;\n\tfont-size:  110%;\n\tbackground: rgba(0,0,0,0.3);\n\ttop: 5px;\n\tright: 0;\n  }\n  >div {\t// knob\n\ttop\t: 4px;\n\tleft: 0px;\n\tbackground: url(\"/images/knob/knob_v2.svg\");\n\ttransform: translate(-22px,-22px) scale(0.5);\n\t-webkit-transform: translate(-22px,-22px) scale(0.5);\n  }\n}\ndiv.graph-node .p_content {\n  .uiValueAdjustable {\n\t&:hover {\n\t  // stub\n\t}\n  }\n}\n\n\n/* styling the slider */\ndiv.p_id_slider_float_generator .p_content {\n  @slider-color-lightblue: rgb(122,164,226);\n  @slider-color-minmax: rgb(77, 126, 195);\n  @slider-vpad: 8px;\n  @slider-hpad: 12px;\n  .ic {\n\tdisplay: none;\t// hide 1px ins&outs from plugin area\n  }\n  .p_ui_col {\n\tpadding: 0;\t\t// we'll do our own layout\n  }\n\n  .p_plugin {\n\n\ttable.slider-table {\n\t  min-width: 181px;\n\t  width: 100%;\n\t  td {\n\t\tpadding: 0;\n\t\tinput, span {\n\t\t  font-size: 9pt;\n\t\t  background: none;\n\t\t  border: 0;\n\t\t  font-weight: 500;\n\t\t  padding: 0;\n\t\t  margin: 0;\n\t\t  -webkit-font-smoothing: subpixel-antialiased;\n\t\t}\n\t\tspan.uiTextEntry {\n\t\t  opacity: 0;\n\t\t}\n\t\tinput.uiTextEntry {\n\t\t  color: #eee !important;\n\t\t  background: rgba(0,0,0,0.3);\n\t\t  text-align: center;\n\t\t  border:1px solid transparent;\n\t\t}\n\n\n\t\tinput[type=number] {\n\t\t  width: 40px;\n\t\t  -moz-appearance:textfield;\n\t\t}\n\t\tinput[type=number]::-webkit-inner-spin-button,\n\t\tinput[type=number]::-webkit-outer-spin-button {\n\t\t  -webkit-appearance: none;\n\t\t  margin: 0;\n\t\t}\n\t\tinput[type=number]:focus {\n\t\t  color: #ccc;\n\t\t}\n\t  }\n\n\t  tr:first-of-type td {\n\t\tpadding: @slider-vpad (@slider-hpad - 1) @slider-vpad  @slider-hpad  ;\n\t  }\n\t  tr:last-of-type {\n\t\tbackground: rgba(0,0,0,0.3);\n\t\ttd {\n\t\t  vertical-align: middle;\n\t\t  padding: @slider-vpad 5px;\n\t\t  input {\n\t\t\tcolor: @slider-color-minmax;\n\t\t  }\n\t\t}\n\t\ttd:first-of-type {\n\t\t  padding-left: @slider-hpad;\n\t\t  input {text-align: left;}\n\t\t}\n\t\ttd:last-of-type {\n\t\t  padding-right: @slider-hpad;\n\t\t  input {text-align: right;}\n\t\t}\n\t  }\n\t  td.sliderContainer {\n\t\tposition: relative;\n\t\tinput {\n\t\t  z-index: 10;\n\t\t}\n\t\tsvg {\n\t\t  position: absolute;\n\t\t  top:50%;\n\t\t  height: 8px;\n\t\t  width: 8px;\n\t\t  margin-top: -4px;\n\t\t  z-index: 1;\n\t\t  pointer-events: none;\n\t\t  fill: @slider-color-lightblue;\n\t\t  use {\n\t\t\tfill: @slider-color-lightblue;\n\t\t  }\n\t\t  &:first-of-type {\n\t\t\tleft: @slider-hpad;\n\t\t  }\n\t\t  &:last-of-type {\n\t\t\tright: (@slider-hpad - 1);\n\t\t  }\n\t\t}\n\t  }\n\t}\n\n\tinput[type=range] {\n\t  -webkit-appearance: none; // css-tricks.com/styling-cross-browser-compatible-range-inputs-css\n\t  width: 100%; // ff\n\t}\n\n\t// (ff won't remove outline)\n\tinput[type=range] {\n\t  &::-moz-range-thumb {\n\t\tborder: 0;\n\t\theight: 18px;\n\t\twidth: 8px;\n\t\tbackground: @slider-color-lightblue;\n\t\tborder-radius: 4px;\n\t  }\n\t  &::-webkit-slider-thumb {\n\t\t-webkit-appearance: none;\n\t\tborder: 0;\n\t\theight: 18px;\n\t\twidth: 8px;\n\t\tbackground: @slider-color-lightblue;\n\t\tborder-radius: 4px;\n\t\tmargin-top: -8px;\n\t  }\n\t  &::-webkit-slider-container {\n\t\theight: 18px;\n\t  }\n\t  &::-webkit-slider-runnable-track {\n\t\tbackground: @slider-color-lightblue;\n\t\theight: 2px;\n\t  }\n\t  &::-moz-range-track {\n\t\tbackground: @slider-color-lightblue;\n\t\theight: 2px;\n\t  }\n\t}\n  }\n}\n\ninput.uiTextEntry {\n  margin:0;\n  outline: 0;\n  border: 0;\n  background: #000;\n}"
  },
  {
    "path": "less/editor_shell.less",
    "content": "@editor-topbar-button-margin:\t4px;\n@color-keyboard-shortcuts:  #afbfdf;\n@background-keyboard-shortcuts: #3F4963;\n@color-divider-rule: rgb(34,39,54);\n\n.mixin-keyboard-shortcut() {\n\tfont-family: \"Source Sans Pro\", \"Source Sans\", sans-serif;\n\tfont-size: 100%; // bootstrap\n\tfont-weight: 400;\n\tcolor: @color-keyboard-shortcuts;\n\tborder: 1px solid @color-keyboard-shortcuts;\n\tbackground: none;\n\tborder-radius: 3px 3px;\n\tpadding: 0px 5px;\n\tmargin: 0 3px;\n\tdisplay: inline-block;\n\ttext-align: center;\n\ttext-transform: capitalize;\n\t&.wide {\n\t  padding: 0 15px;\n\t}\n\t&:first-child {\n\t  margin-left: 0;\n\t}\n\t&.modifier {\n\t  text-indent: -10000px;\n\t  position: relative;\n\t  padding: 0;\n\t  &:after {\n\t\tcontent: \"\";\n\t\tposition: absolute;\n\t\ttop: 50%;\n\t\tleft: 50%;\n\t\tmargin-left: -15px;\n\t\tmargin-top: -15px;\n\t\twidth: 30px;\n\t\theight: 30px;\n\t\tbackground: url('/images/v2/mod_keys.svg') no-repeat;\n\t  }\n\t  &.key_cmd:after {\n\t\tbackground-position: 0px 0;\n\t  }\n\t  &.key_ctrl:after {\n\t\tbackground-position: -30px 0;\n\t  }\n\t  &.key_alt:after {\n\t\tbackground-position: -60px 0;\n\t  }\n\t  &.key_shift:after {\n\t\tbackground-position: -90px 0;\n\t  }\n\t}\n}\n\nbody.bEditor {\n\n  .mixin-threecol;\n\n  .searchbox svg {\n\twidth: 25px;\n\theight: 40px;\n\tmargin-right: 5px;\n  }\n\n\n\n  &.inVR {\n\t#editor-header, #progressbar, #info-pane, #editor-footer, #drag-overlay, >div.popover {\n\t  display: none;\n\t}\n\t>#canvases {\n\t  position: absolute;\n\t  top:0;\n\t  bottom:0;\n\t  >div {\n\t\tdisplay: none;\n\t  }\n\t  >div.webvr-polyfill-fullscreen-wrapper {\n\t\tdisplay: block;\n\t  }\n\t}\n  }\n\n\n  div.modal {\n\t-webkit-font-smoothing: subpixel-antialiased;\n  }\n\n\n  .floating-box {\n\tz-index: 65;\n  }\n\n  #canvases {\t// considered the master viewport\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n\ttop: @height-editor-header;\n\tbottom: @height-editor-footer;\n\toverflow: hidden;\n\tz-index: 2;\n  }\n\n  #canvas_parent {\n\tmin-height: 270px;\n  }\n\n  /* buttons */\n  button.ui_off svg, button[disabled] svg {\n\topacity: 0.5;\n  }\n  button[disabled] {\t// reset the reset..\n\topacity: 1;\n  }\n\n  button.svg, a.btn.svg {\t// default\n\tbackground: transparent;\n\tcolor: #ccc;\n\tsvg {\n\t  stroke: #ccc;\n\t  background: none;\n\t}\n  }\n\n  div#row2 {\n\tdisplay: -webkit-flex;\n\t-webkit-flex-flow: row wrap;\n\t-webkit-justify-content: center;\n\t-webkit-align-items: center;\n\t-webkit-align-content: center;\n\n\tdisplay:flex;\n\tjustify-content: center;\n\tflex-flow: row wrap;\n\talign-items: center;\n\talign-content: center;\n\n\t>div {\n\t  -webkit-flex: 1;\n\t  flex: 1;\n\t  height: (@row2-height - 2);\n\t  line-height: (@row2-height - 2);\n\t}\n\n\n\tborder-top: 1px solid @editor-text-inactive;\n\tborder-bottom: 1px solid @editor-text-inactive;\n\t#modeSwitcher {\n\t  text-align: right;\n\t  button {\n\t\tborder-left: 1px solid @editor-text-inactive;\n\t  }\n\t  button.ui_on {\n\t\tbackground: rgba(255,255,255,0.075);\n\t  }\n\t}\n\t#graphNameLabel {\n\t  border-left: 1px solid @editor-text-inactive;\n\t  border-right: 1px solid @editor-text-inactive;\n\t  text-align: center;\n\t  -webkit-flex: 0.45;\n\t  flex: 0.45;\n\t}\n\t#graphSizeLabel {\n\t  border-left: 1px solid @editor-text-inactive;\n\t  border-right: 1px solid @editor-text-inactive;\n\t  text-align: center;\n\t  -webkit-flex: 0.45;\n\t  flex: 0.45;\n\t}\n\tpadding:0;\n\tbackground: @bg-dark;\n\tcolor: @editor-text-inactive;\n\ta {\n\t \tcolor: @editor-text-inactive;\n\t}\n\n\n  }\n\n\n  /* breadcrumb */\n  #breadcrumb {\n\toverflow:hidden;\n\twidth: auto;\n\tmargin: 0;\n\tpadding: 0 0 0 10px;\n\ta {\n\t  color: @editor-text-inactive;\n\t  &:hover {\n\t\tcolor: @editor-text-current;\n\t  }\n\t}\n\tspan {\n\t  color: @editor-text-current;\n\t}\n  }\n\n  /* modals */\n\n  div.modal.viewsource .modal-dialog {\n\tmargin-top: 50px;\n  }\n  div.modal.viewsource textarea {\n\tbackground:#111;\n\tcolor:#eee;\n\t.codefont;\n\tfont-weight: 300;\n\t&::selection {\n\t  background: #999;\n\t}\n\t&::-moz-selection {\n\t  background: #444;\n\t}\n  }\n\n  #modeSwitcher button {\n\t&+button {\n\t  margin-left:-2px;\n\t}\n\tborder: 0;\n\tmargin:0;\n\tpadding:0;\n\toutline: 0;\n\tfont-size: 100%;\n\twidth: 25ex;\n\tcolor: @editor-text-default;\n\t* {\n\t  vertical-align: middle;\n\t}\n\tsvg {\n\t  margin-right: 10px;\n\t  width: 22.8px;\n\t  height: 15.5px;\n\t  stroke: @editor-text-default;\n\t}\n\t&:hover {\n\t  background: rgba(255,255,255,0.075);\n\t  color: @editor-text-hover;\n\t  svg {\n\t\tstroke: @editor-text-hover;\n\t  }\n\t}\n  }\n\n\n  .editor-header {\n\theight: @menu-bar-height;\n\twidth: 100%;\n\tposition: relative;\n\tbackground-color: @bg-light;\n\tz-index: 10;\n  }\n\n  .menu-bar {\n\tmargin-left: 180px;\n\tfont-family: @font-family-sans-serif;\n\theight: @menu-bar-height;\n\tposition: relative;\n  }\n\n  #top-header-logo {\n\twidth: 156px;\n\theight:66px;\n\tfloat: left;\n\tposition: relative;\n\t  user-select: none;\n\t#logo-link {\n\t\tdisplay: block;\n\t\theight: 36px;\n\t\tmargin-top: 10px;\n\t\tposition: relative;\n\t\tsvg {\n\t\t\tfill: @editor-text-default;\n\t\t\twidth: 85px;\n\t\t\theight: 34px;\n\t\t\tposition: absolute;\n\t\t\tleft: 50%;\n\t\t\ttop: 50%;\n\t\t\tmargin-top: -17px;\n\t\t\tmargin-left: -43px;\n\t\t  }\n\t\t&:hover svg {\n\t\t\tfill: white;\n\t\t  }\n\t}\n\tp {\n\t\tfont-size: 10px;\n\t\twidth: 86px;\n\t\tmargin: 0 auto;\n\t\tcolor: rgba(255,255,255,0.4);\n\t\ta {\n\t\t\tcolor: rgba(255,255,255,0.4);\n\t\t\t&:hover { color: white; text-decoration: none; }\n\t\t}\n\t}\n\n\n  }\n\n\n  div.menu-bar {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n\t-webkit-justify-content: space-between;\n\tjustify-content: space-between;\n\n\tdiv.buttons, ul.iconic-nav {\n\t  -webkit-flex-shrink: 0;\n\t  flex-shrink: 0;\n\t  button {\n\t\tmargin: 0 @editor-topbar-button-margin;\n\t  }\n\t}\n  }\n\n\n\n  .menu-bar {\n\n\tbutton {\n\t  font-weight: 600;\n\t  color: @editor-text-default;\n\t  &.ui_off {\n\t\t// color: @editor-text-inactive;\n\t  }\n\t  svg {\n\t\tstroke: @editor-text-default;\n\t  }\n\t  &:hover {\n\t\tcolor: @editor-text-hover;\n\t\tsvg {\n\t\t\tstroke: @editor-text-hover;\n\t\t}\n\t  }\n\t}\n\n\tbutton[disabled] {\n\t  color: @editor-text-inactive;\n\t  svg {\n\n\t  }\n\t}\n\tbutton>span {\n\t  display: block;\n\t}\n\t.button-group .spacer {\n\t  width: 5px;\n\t}\n\n\tbutton.zoom {\n\t  margin: 0 !important;\n\t  span {display: block;}\n\t}\n\t#btn-zoom {\n\t  width: 42px;\n\t  span {margin-left: 2px;}\n\t}\n\t#btn-zoom svg {\n\t  width: 36px;\n\t}\n\t#btn-zoom-in, #btn-zoom-out {\n\t  width: 16px;\n\t  min-width: 0;\n\t  svg {\n\t\theight: 34px;\n\t\twidth: 16px;\n\t  }\n\t}\n\n\n\t#grpElse {\n\t\tpadding-right: 40px;\n\t}\n  }\n\n  div.modal.mShortcuts {\n\ta {\n\t  color: @color-keyboard-shortcuts;\n\t}\n\tabbr {text-decoration: none; border-bottom:0;}\n\t.modal-dialog {\n\t  width: 940px;\n\t  max-width: 95%;\n\t  margin-top: 50px;\n\t}\n\t.modal-dialog .modal-content .modal-body div.bootbox-body {\n\t  text-align: left;\n\t}\n\t.modal-body h3 {\n\t  color: @color-keyboard-shortcuts;\n\t  padding: 0 5px 5px 5px;\n\t  font-weight: 300;\n\t  font-size: 125%;\n\t  &:first-of-type {\n\t\tmargin-top:0;\n\t  }\n\t}\n\tdl+h3 {\n\t  margin-top: 2em;\n\t}\n\tdl {\n\t  .clearfix;\n\t  dt, dd {font-weight: 300;}\n\t  &:last-of-type {\n\t\tmargin-bottom: 0;\n\t  }\n\t  color: @color-keyboard-shortcuts;\n\t}\n\tdt, dd {\n\t  line-height: 30px;\n\t  padding: 6px;\n\t  margin:0;\n\t}\n\tdt {\n\t  clear: right;\n\t  float: right;\n\t  width: 50%;\n\t}\n\tdd {\n\t  margin-right: 0%;\n\t  kbd {\n\t\t.mixin-keyboard-shortcut;\n\t\t  border: none;\n\t\t  background: @background-keyboard-shortcuts;\n\t  \tmin-width: 28px;\n\t\tline-height: 26px;\n\t  }\n\t}\n\tdiv.col.mid {\n\t\tpadding: 0 20px;\n\t}\n    div.col.left {\n\t  border-right: 1px solid @color-divider-rule;\n\t  padding: 0 20px 0 0;\n\t}\n\tdiv.col.right {\n\t  padding: 0 0 0 20px;\n\t  dt {margin-right: 0; width: 65%}\n\t  dd {width: 34%}\n\t}\n  }\n}\n\n.dark .modal-body {\n  input, textarea {\n\tbackground: none;\n\tcolor: white;\n  }\n}\n\n\ndiv.modal.modal_publish .modal-content {\n  width: 550px;\n  label, li { color: @editor-text-hover; }\n  div.modal-error.warn {\n\tcolor: @message-warn;\n\tmargin-top:10px;\n  }\n  button.close {\n\tright: 14px;\n  }\n  form {\n\twidth: 495px;\n\tmargin-left: auto;\n\tmargin-right: auto;\n\n\t&.loading button[type='submit'] {\n\t \tbackground: rgb(2,62,133);\n\t}\n\n\t#pathInput {\n\t  padding-top: 12px;\n\t  padding-bottom: 12px;\n\t  font-weight:300;\n\t}\n\tlabel {\n\t  font-weight: 500;\n\t}\n\tfieldset {\n\t  margin-bottom: 0;\n\t}\n\tdiv.preview {\n\t  width: 495px;\n\t  height: 188px;\n\t  background: center center no-repeat;\n\t  background-size: 500px;\n\t  border-radius: 4px;\n\t  margin-bottom: 14px;\n\t  transform: scaleY(-1);\n\t}\n\tdiv.flexed {\n\t  display: flex;\n\t  align-content: stretch;\n\t  flex-wrap: nowrap;\n\t  >* {\n\t\tflex: auto;\n\t  }\n\t}\n\tdiv.flexed {\n\t  margin-top:12px;\n\t  height: 50px;\n\t  >* {\n\t\theight: 100%;\n\t  }\n\t}\n\t#publish-graph-btn {\n\t  width: 200px;\n\t  max-width: 200px;\n\t}\n\n\tul.inline-rounded {\n\t  padding:0;\n\t  display: flex;\n\t  align-content: stretch;\n\t  flex-wrap: nowrap;\n\t  li {\n\n\t\tmargin:0;\n\t\tflex: auto;\n\t  }\n\t  li:first-child {\n\t\tborder-top-left-radius: 4px;\n\t\tborder-bottom-left-radius: 4px;\n\t  }\n\t  li:last-child {\n\t\tborder-top-right-radius: 4px;\n\t\tborder-bottom-right-radius: 4px;\n\t  }\n\t  li+li {\n\t\tmargin-left: 1px;\n\t  }\n\t}\n\n\tul {\n\t  line-height: 50px;\n\t  margin-right: 20px;\n\t  li {\n\t\tbackground: @bg-dark;\n\t\t&:first-child {\n\t\t  text-align: left;\n\t\t  padding-left: 21px;\n\t\t}\n\t\t&:last-child {\n\t\t  max-width: 100px;\n\t\t}\n\t\tlabel:first-of-type {\t// public/private text\n\t\t  padding-right: 20px;\n\t\t  width: 10ex;\n\t\t}\n\t  }\n\t}\n  }\n}\n\n.bEditor div.popover[data-uiid] {\n\tkbd {\n\t\t.mixin-keyboard-shortcut;\n\t\tbackground: @background-keyboard-shortcuts;\n\t\tborder: none;\n\t}\n}\n"
  },
  {
    "path": "less/editors.less",
    "content": "// E2.ShaderEditor\n.codefont {\n  font-family: \"Source Code Pro\", Monaco, Menlo, 'Ubuntu Mono', Consolas,  monospace;\n  font-weight: 400;\n  font-size: 11px;\n  line-height: 1.5;\n  -webkit-font-smoothing: subpixel-antialiased;\n}\n\n.shader-editor {\n  .input-editor {\n\toverflow: auto;\n  }\n  .input-button {\n\tborder-radius: 3px;\n\tmargin: 1px;\n\ti {\n\t\tmargin-right: 2px;\n\t}\n  }\n  .input-remove-button {\n\t@hclr: @brand-success;\n\tcolor: @gray-dark;\n\tbackground-color: @hclr;\n\tborder-color: @hclr;\n\t&:hover {\n\t  @hclr: @brand-danger;\n\t  color: @gray-dark;\n\t  background-color: @hclr;\n\t  border-color: @hclr;\n\t}\n  }\n\n}\n\n.shader-block {\n  left: 350px;\n  width: 660px;\n  z-index: 65;\n  .block-header {\n\twidth:100%;\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n\t-webkit-justify-content: space-between;\n\tjustify-content: space-between;\n\theight: 40px;\n  }\n  i.tab-close-button {\n\tline-height: 1.4em;\n  }\n  ul.nav-tabs {\n\twidth:85%;\n  }\n\n  div.ace-tomorrow-night-eighties {\n\tbackground-color: rgba(0,0,0,0.15);\n  }\n  div.ace_gutter {\n\tbackground-color: rgba(0,0,0,0.5);\n  }\n}\n\nform.addInputDialog select.form-control {\n  line-height: 1.2em;\n  font-weight: normal;\n  font-size: 100%;\n  height:auto;\n}\n\n.shader-ace {\n  display: -webkit-flex;\n  display: flex;\n  -webkit-justify-content: flex-end;\n  justify-content: flex-end;\n}\n\n\n.shader-block .ace_editor {\n  z-index: 0;\n  .codefont;\n}\n\n\n\n// E2.EnvelopeEditor\n\n.envelope-editor rect {\n  fill: none;\n  pointer-events: all;\n}\n\n.envelope-editor circle,\n.envelope-editor .line {\n  fill: none;\n  stroke: steelblue;\n  stroke-width: 1.5px;\n}\n\n.envelope-editor circle {\n  fill: #fff;\n  fill-opacity: .2;\n  cursor: move;\n}\n\n.envelope-editor .circle-selected {\n  fill: #ff7f0e;\n  stroke: #ff7f0e;\n}\n"
  },
  {
    "path": "less/file-select-control.less",
    "content": "\n.file-select-control {\n\toutline: none;\n}\n\n.file-selector {\n\theight: 50vh;\n\tposition: relative; /* could be absolute or relative */\n\tpadding-top: 30px; /* height of header */\n\tmargin-bottom: 10px;\n\tpadding-bottom: 1px;\n\tborder-bottom: 1px solid @bg-darker;\n}\n\n.file-selector table {\n\toverflow-x: hidden;\n\toverflow-y: auto;\n}\n\n.fixed-table-container-inner {\n\toverflow-x: hidden;\n\toverflow-y: auto;\n\theight: 100%;\n}\n\n.header-background {\n\tbackground-color: @bg-darker;\n\theight: 30px; /* height of header */\n\tposition: absolute;\n\ttop: 0;\n\tright: 0;\n\tleft: 0;\n}\n\n.th-inner {\n\tposition: absolute;\n\ttop: 0;\n\tline-height: 30px; /* height of header */\n\ttext-align: left;\n\tpadding-left: 5px;\n\tmargin-left: -5px;\n}\n\n.hidden-header .th-inner {\n\tposition: static;\n\toverflow-y: hidden;\n\theight: 0;\n\twhite-space: nowrap;\n\tpadding-right: 5px;\n}\n\n.file-selector .name-header {\n\twidth: 35%;\n}\n\n.file-selector .date-header {\n\twidth: 30%;\n}\n\n.file-selector .by-header {\n\twidth: 10%;\n}\n\n.file-selector .tags-header {\n\twidth: 25%;\n}\n\n.file-selector .thumbnail-header {\n\twidth: 35;\n}\n\n.file-selector .size-header {\n\twidth: 30%;\n}\n\n.file-selector thead th {\n\tborder-bottom: none;\n\tborder: none !important;\n\tpadding: 0px 5px 0px 10px !important;\n}\n\n.file-selector td {\n\tpadding-left: 10px !important;\n\ttext-align: left;\n}\n\n.file-selector td.path {\n\tmax-width: 240px;\n}\n\n.file-selector tbody tr {\n\tcursor: pointer;\n\tborder: none !important;\n}\n\n.file-select-control .nav a:link,\n.file-select-control .nav a:active,\n.file-select-control .nav a:visited,\n.file-select-control .nav a:hover {\n\tcolor: #000;\n}\n\n.file-select-control .tab-content {\n\tpadding: 10px 0 10px 0;\n\tborder-left: 1px solid @gray-darker;\n\tborder-right: 1px solid @gray-darker;\n\tborder-bottom: 1px solid @gray-darker;\n\tborder-top: 1px solid @gray-darker;\n\tmin-height: 30vh;\n}\n\n.file-select-control .bottom-row,\n.file-select-control .tags {\n\tmargin: 0 10px 0 10px;\n}\n\n.file-select-control .links\n{\n\tpadding-left: 10px;\n}\n\n#fileUploadFile {\n\tmargin-left: 10px;\n}\n\n#buttons-row {\n\tmargin-bottom: 0px;\n}\n\n#buttons-row td {\n\tpadding: 0px 16px 0 0;\n\t&:last-child {\n\t    padding: 0;  \n\t}\n}\n.fixed-table-container-inner .table > tbody > tr > td {\n    color: @editor-text-default;\n    &:hover {\n        background: @bg-light;\n        color: @editor-text-hover;\n    }\n}\n.fixed-table-container-inner .table > tbody > tr.success > td {\n    background: @bg-darker;\n    color: @editor-text-active;\n    &:hover {\n        background: @bg-darker;\n        color: @editor-text-active;\n    }\n}"
  },
  {
    "path": "less/footer.less",
    "content": "#contentwrap+footer {\n  margin-top:50px;\n}\n\n#brandBottom {\n  font-weight: 300;\n  color: #c3c3c3;\n  text-align: center;\n  span {\n\tdisplay: block;\n\tmargin-bottom: 20px;\n  }\n}\n\nbody.bMain footer {\n  background: @bgcolor-home-footer;\n  font-weight: 300;\n  font-size: 120%;\n  padding: 90px 0;\n\n  .flexcolumns {\n\tmax-width: 700px;\n\twidth: 67%;\n\tfloat: right;\n  }\n  li {\n\tmargin-bottom: 0.5em;\n  }\n\n  a {\n\tcolor: rgba(255,255,255,0.7);\n\t&:hover {\n\t  color: rgba(255,255,255,1);\n\t}\n  }\n\n\t#bottomLinks {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\tflex-wrap: wrap;\n\t\tmax-width: 250px;\n\t\tmargin: 0 auto 40px auto;\n\t\ta {\n\t\t\twidth: 50%;\n\t\t\tdisplay: flex;\n\t\t\talign-content: center;\n\t\t\talign-items: center;\n\t\t\tjustify-content: center;\n\t\t\tmin-height: 65px;\n\t\t\tsvg { fill: #cdcdcd; }\n\t\t\t&:hover {\n\t\t\t\ttext-decoration: none;\n\t\t\t\tcolor: @color-primary;\n\t\t\t\tsvg { fill: #fff; }\n\t\t\t}\n\t\t}\n\t}\n}\n\n\n@media screen and (max-width: (@threshold-mobile - 1)) {\n  footer {\n\t@hpf-left-pad: 45px;\n\tpadding-top: 10px;\n\tfont-size: 120%;\n\tnav.links {\n\t  a {\n\t\tletter-spacing: 1.75px;\n\t\t&+a {\n\t\t  margin-left: 1rem;\n\t\t}\n\t  }\n\t}\n\t>.in {\n\t  max-width: 100%;\n\t}\n\th6#footerBrand {\n\t  float: none;\n\t  margin-left: @hpf-left-pad;\n\t  margin-bottom: 2rem;\n\t}\n\tdiv.flexcolumns {\n\t  padding-left: @hpf-left-pad;\n\t  border-top: 1px solid #000;\n\t  margin-left: 0;\n\t  width: 100%;\n\t  float: none;\n\t  flex-wrap: wrap;\n\t  padding-top: 20px;\n\t  ul {\n\t\t-webkit-flex-basis: 100%;\n\t\tflex-basis: 100%;\n\t  }\n\t}\n  }\n}\n\n@media all and (min-width: @threshold-mobile) and (max-width: (@threshold-tablet - 1) ) {\n  footer>div.in {\n\tpadding-left: 5%;\n\tpadding-right: 5%;\n  }\n  footer {\n\tfont-size: 1.6rem;\n\n\tli {\n\t  margin-bottom: 1em;\n\t}\n  }\n}\n\n@media all and (min-width: @threshold-tablet) {\n  footer {\n\tpadding: 70px 0;\n  }\n  footer>div.in {\n\tpadding-left: 20px;\n\tpadding-right: 20px;\n  }\n}\n\n\n@media all and (min-width: (@max-width-desktop + 80)) {\n  footer>.in {\n\t  max-width: @max-width-desktop + 40;\n  }\n}"
  },
  {
    "path": "less/homepage.less",
    "content": "@color-primary: #37a0e9;\n@color-text1: #ffffff;\n@color-text2: #cdcdcd;\n@color-bg1: #0a0830;\n@color-bg2: #070624;\n@color-bg3: #000000;\n\n.type(@font-weight: 500, @font-size: 100%, @line-height: inherit, @letter-spacing: 0.5px) {\n\tfont-size: @font-size;\n\tfont-weight: @font-weight;\n\tline-height: @line-height;\n\tletter-spacing: @letter-spacing;\n}\n\n.ctabutton() {\n\tflex: 0 0 45%;\n\tborder-radius: 45px;\n\tbackground: none;\n\tborder: 2px solid white;\n\ttext-transform: uppercase;\n\tfont-size: 16px;\n\tletter-spacing: 2px;\n\tpadding: 13px 40px;\n\tmargin: 1px;\n}\n\nbody.bHome {\n  margin:0 !important;\n  padding:0 !important;\n\n\ta.btn.cta {\n\t\t.ctabutton;\n\t\t&.wide {\n\t\t\tpadding-left: 55px;\n\t\t\tpadding-right: 55px;\n\t\t}\n\t\t&+a.btn.cta {margin-left: 50px;}\n\t}\n\n\t&.deviceDesktop a.btn.cta:hover {\n\t  border: 3px solid white !important;\n\t  padding: 12px 39px !important;\n\t}\n\t&.deviceDesktop a.btn.cta.wide:hover {\n\t\tpadding-left: 54px !important;\n\t\tpadding-right: 54px !important;\n\t}\n\t&.deviceDesktop a.btn.cta:active {\n\t\tbackground: @color-primary !important;\n\t\tborder-color: @color-primary !important;\n\t\tcolor: white;\n\t\tbox-shadow: 0 0 40px 10px rgba(0,0,0,0.15) !important;\n\t}\n\n\t&[data-dpr=\"1\"] a.btn.cta {\n\t  font-weight: 500 !important;\n\t}\n\n}\n\n.text1 {  color: @color-text1; }\n.text2 {  color: @color-text2; }\n.bg1 {  background: @color-bg1; }\n.bg2 {  background: @color-bg2; }\n.bg3 {  background: @color-bg3; }\n\nheader nav.primary ul>li {\n\t>a {\n\t\t.text2;\n\t}\n}\n\n#homeIntro2 { // mobile only\n\tpadding: 40px !important;\n}\n\n#homeIntro, #homeIntro2 {\n\t.bg1;\n\t.text2;\n\t.type(500, 16.7px, 1.8, 0.75px);\n\tborder-top: 1px solid transparent;\t// safari padding bug\n\th3 {\n\t\t.text1;\n\t\t.type(500, 18px, inherit, 2px);\n\t\ttext-transform: uppercase;\n\t\tmargin-bottom: 15px;\n\t}\n\n\tdiv.hero {\n        width: 99%;\n\t\tmargin: 80px auto 90px auto;\n\t\timg {\n\t\t\tdisplay: block;\n\t\t\tmargin: 0 auto;\n\t\t\twidth: 100%;\n\t\t\tmax-width: 1075px;\n\t\t}\n\t}\n\n\t.cols-flex .col {\n\t\tmax-width: 430px;\n\t}\n\n\ta {\n\t\tcolor: @color-text2;\n\t\tdisplay: inline-block;\n\t\ttext-decoration: none;\n\t\tborder-bottom: 1px solid @color-primary;\n\t\t&:hover {\n\t\t\tcolor: @color-primary;\n\t\t\ttext-decoration: none;\n\t\t}\n\t\t&:active {\n\t\t\tcolor: @color-text1;\n\t\t\tborder-bottom-color: @color-text1;\n\t\t\ttext-decoration: none;\n\t\t}\n\n\t}\n\n\n\tbody.layoutTablet & div.hero {\n\t\twidth: 450px;\n\t\toverflow: hidden;\n\t\timg {\n\t\t\twidth: 1075px;\n\t\t\tmargin: 0;\n\t\t}\n\t}\n\tbody.layoutMobile & div.hero {\n\t\twidth: 100%;\n\t\tmargin: 20px auto 35px auto;\n\t\timg {\n\t\t\twidth: 100%;\n\t\t\tmax-width: 266px;\n\t\t}\n\t}\n\n\tbody.layoutMobile & {\n\t\ttext-align: center;\n\t\tfont-size: 14px;\n\t\t.cols-flex .col {\n\t\t\tmargin: 0 auto;\n\t\t}\n\t}\n\n\tbody.layoutTablet & {\n\t\tfont-size: 16px;\n\t\t.cols-flex {\n\t\t\tflex-direction: column;\n\t\t\t.col {\n\t\t\t\tmargin: 0 auto;\n\t\t\t}\n\t\t}\n\t}\n\n\n}\nbody.layoutDesktop #contentwrap>section {\n\tpadding-bottom: 100px;\n\t>div.in {\n\t\tpadding-left: 30px;\n\t\tpadding-right: 30px;\n\t}\n}\n\n#featuredVR {\n\tpadding-top: 70px;\n\tbody.layoutMobile & {\n\t\tpadding-top: 40px;\n\t}\n\t>h2 {\n\t\tmargin-top: 0;\n\t}\n\tbody.layoutDesktop & section.list {\n\t\tmargin-top: 70px;\n\t}\n\tsection.list {\n\t\t// minislides\n\t\tz-index: 2;\n\t\tposition: relative;\n\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\tjustify-content: space-between;\n\t\tmargin-top: 15px;\n\t\tmargin-bottom: 15px;\n\t\tarticle.card.asset {\n\t\t\tflex: 0 1 252px;\n\t\t\theight: 232px;\n\t\t\tmargin: 0 auto 20px auto;\n\t\t}\n\t}\n\n\t// distance between minislides\n\t.mobileslides.minislides section.list article.card.asset {\n\t\tflex: 0 1 272px;\n\t\tbackground: none;\n\t\t>div.meta, >div.image {\n\t\t\tmargin: 0 10px;\n\t\t}\n\t\t>div.meta {\n\t\t\tbackground: white;\n\t\t\tborder-bottom-left-radius: 4px;\n\t\t\tborder-bottom-right-radius: 4px;\n\t\t}\n\t}\n\n\n\tdiv.minislides-slideSwitcher {\n\t\tmargin: 20px auto;\n\t}\n\n\tp.more {\n\t\ttext-align: center;\n\t\tmargin-top: 50px;\n\t\tpadding-bottom: 50px;\n\t}\n\n\tbody.deviceDesktop & {\n\t\tp.more {\n\t\t  margin-top: 100px;\n          margin-bottom: 0;\n\t\t}\n\t\tpadding-bottom: 100px;\n\t}\n}\n\nbody:not(.layoutMobile) section.list article.card.asset div.image:not(.noimage, .fromsmall) {\n\tbackground-position: -28px 0;\n}\n\n\n// mind the fonts on non-retina Safari\nbody.bHome.uaSafari[data-dpr=\"1\"] {\n  #contentwrap {\n\theader {\n\t  font-weight: 400;\n\t  -webkit-font-smoothing: antialiased;\n\t  button, a.btn {\n\t\tfont-weight: 400;\n\t  }\n\t}\n\t#getstarted #herotext {\n\t  h1 {\n\t\tfont-weight: 700;\n\t  }\n\t  a {\n\t\tfont-weight: 300;\n\t\t-webkit-text-stroke: 0.4px;\n\t  }\n\t}\n  }\n}\n\n.selectedcolor() {\n  color: #5199d2;\n}\n.downloadoption() {\n  font-family: 'Source Sans Pro', sans-serif;\n  font-size: 13px;\n  letter-spacing: 1.5px;\n  font-weight: 300;\n}\n\nbody.bHome.bAbout #contentwrap a.navAbout {\n  .selectedcolor\n}\n\nbody.bHome #contentwrap {\n  header {\n\theight: 100px;\n  }\n\n  a.cta:hover, a.cta:active {\n\tcolor: inherit;\n  }\n\n}\n\n\n\nbody.bHome[data-touchcapable=\"false\"] #contentwrap #getstarted #herotext {\n\tpointer-events: none;\n}\n\nbody.bHome:not(.layoutDesktop) #contentwrap {\n\t#getstarted #herotext >h1 {\n\t\t.type(700, 24px, 1.1em, normal);\n\t\tmax-width: 90%;\n\t}\n}\n\nbody.bHome.layoutDesktop #contentwrap {\n\t#getstarted #herotext >h1 {\n\t\t.type(600, 39px);\n\t}\n}\n\n\nbody.bHome #contentwrap #homeVizor360 {\n\tbackground: @color-bg1 url(\"/images/v2/vizor360-editor.png\") no-repeat;\n\tbackground-position: 50% ~\"calc(100% + 200px)\";\n\tbackground-size: 952px;\n\tpadding-bottom: 380px;\n}\n\nbody.bHome.layoutTablet #contentwrap #homeVizor360 {\n\tbackground-position: 50% ~\"calc(100% + 180px)\";\n\tbackground-size: 740px;\n\tpadding-bottom: 280px;\n}\n\nbody.bHome.layoutMobile #contentwrap #homeVizor360 {\n\tbackground-size: auto 307px;\n\tbackground-position: ~\"calc(0% + 120px)\" 100%;\n\tpadding-bottom: 327px;\n}\n\n\nbody.bHome #contentwrap {\n\tbackground: #000;\n  #getstarted {\n    min-height: 100vh;\n\t//height: 678px;\n\n\t#herotext {\n\t  position: absolute;\n\t  left: 0;\n\t  right:0;\n\t  top: 40%;\n\t  z-index: 10;\n\t  text-align: center;\n\t\theight: 50%;\n\t  >h1 {\n\t\t  flex: 0 0 100%;\n\t\t  margin: 0 auto 25px auto;\n\t\t  padding:0;\n\t\t  pointer-events: none;\n\t\t  max-width: 1020px;\n\t\t}\n\t  >div {\n\t\tdisplay: -webkit-inline-flex;\n\t\tdisplay: inline-flex;\n\t\t-webkit-flex-flow: row wrap;\n\t\tflex-flow: row wrap;\n\t\t-webkit-justify-content: space-between;\n\t\tjustify-content: space-between;\n\t\tmax-width: 59rem;\n\t\tmargin: 0 auto;\n\t\t  position: absolute;\n\t\t  top: 50%;\n\t\t  bottom: 0%;\n\t\t  left: 0;\n\t\t  right: 0;\n\t\t  height: 52px;\n\t\ta {\n\t\t  .ctabutton;\n\t\t\tpointer-events: initial;\n\t\t}\n\t  }\n\t}\n  } // /#getstarted\n\n\t#homeVizor360 {\n\t\tmargin-top: 25px;\n\t\theight: auto;\n\t\tborder-top: 1px solid @color-bg1;\n\t  \tborder-bottom: 1px solid @color-bg1;\n\t\t.type(600,115%, 1.75em);\n\t\th2 {\n\t\t\tmargin-top: 90px;\n\t\t\t.type(700, 38px);\n\t\t  text-align: center;\n\t\t}\n\t\tp {\n\t\t\tmargin-top: 20px;\n\t\t\ttext-align: center;\n\t\t\tcolor: #CDCDCD;\n\t\t\ta {\n\t\t\t\tcolor: #CDCDCD;\n\t\t\t\tborder-bottom: 1px solid @color-primary;\n\t\t\t\t&:hover {\n\t\t\t\t\ttext-decoration: none;\n\t\t\t\t\tcolor: @color-primary;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\timg {\n          display: block;\n          margin: 50px auto 0 auto;\n\t\t  width: 952px;\n\t\t  max-width: 99%;\n\t\t}\n\t}\n  #featuredVR {\n\t  margin-top: 25px;\n\t  background: @color-bg2;\n\t  border-top: 1px solid @color-bg2;\n\t  border-bottom: 1px solid @color-bg2;\n\t  h2 {\n\t\t.type(700, 38px);\n\t\t  text-align: center;\n\t\t  margin-bottom: 25px;\n\t  }\n\t  div.mobileslides {\n\t\t  margin-left: auto;\n\t\t  margin-right: auto;\n\t  }\n  }\n}\n\nbody.bHome.layoutMobile #contentwrap #homeVizor360 div {\n\tfont-weight: 500;\n\tfont-size: 14px;\n\th2 {\n\t\tmargin-top: 60px;\n\t}\n}\n\nbody.bHome #contentwrap {\n\n  font-size: 11pt;\n  color: #f7f7f7;\n\n  .mobileonly, .launch-button.mobileonly {\n\tdisplay: none;\n  }\n\n  p {\n\tmargin-bottom: 1.5em;\n  }\n\n  form input {\n\tcolor: @color-formcontrol-home;\n  }\n\n\n\n\n\n  #getstarted .modal-footer {\n\tcolor: #AFBFDF;\n\ta {\n\t  color: #AFBFDF;\n\t  text-decoration: underline;\n\t  }\n  }\n\n\n  font-weight: @font-weight-home;\n\n\n  section div.in form fieldset {\n\t>div.form-input {\n\t  ::-webkit-input-placeholder {\n\t\t color: @color-placeholder-home;\n\t  }\n\t  ::-moz-placeholder {\n\t\t color: @color-placeholder-home;\n\t  }\n\t  .in_focus::-webkit-input-placeholder {\n\t\t color: @color-placeholder-home-dim;\n\t  }\n\t  .in_focus::-moz-placeholder {\n\t\t color: @color-placeholder-home-dim;\n\t  }\n\t  input {\n\t\tpadding-left: 25px;\n\t\tpadding-right: 25px;\n\t  }\n\t}\n\tlabel {\n\t  display: none;\n\t}\n  }\n\n  section {\n\tmargin:0;\n  }\n\n\n\n  .modal-footer {\n\tpadding-left: 0;\n\ttext-align: left;\n\tfont-size: 55%;\n\tcolor: #eee;\n  }\n\n  .team-container {\n\t  min-width: 320px;\n\t  max-width: @max-width-desktop;\n\t  margin: 0 auto;\n\t  padding: 0;\n\t  display: -webkit-flex;\n\t  -webkit-flex-wrap: wrap;\n\t  -webkit-align-content: center;\n\t  -webkit-justify-content: center;\n\t  display: flex;\n\t  flex-wrap: wrap;\n\t  align-content: center;\n\t  justify-content: center;\n  }\n\n  .team-member {\n\tposition: relative;\n\tbox-sizing: border-box;\n\tcursor: pointer;\n\th4 {\n\t  font-size: 20px;\n\t  font-weight: 300;\n\t  letter-spacing: @letter-spacing-home;\n\t}\n\t.member-pic {\n\t  width: 140px;\n\t  height: 140px;\n\t  border-radius: 100%;\n\t  overflow: hidden;\n\t  text-align: center;\n\t  margin: 0 auto;\n\t  position: relative;\n\t  img {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\theight: auto;\n\t\tmargin: 0 auto;\n\t  }\n\t  .pic-rollover {\n\t\tdisplay: block;\n\t\topacity: 0;\n\t\twidth: 140px;\n\t\theight: 140px;\n\t\tborder-radius: 100%;\n\t\tposition: absolute;\n\t\ttop: 0;\n\t\tleft: 0;\n\t\ttext-align: center;\n\t\toverflow: hidden;\n\t\tbackground: rgba(0,0,0,0.45);\n\t\ttransition: opacity 0.2s ease-out;\n\t\t.icon {\n\t\t  display: block;\n\t\t  width: 32px;\n\t\t  height: 32px;\n\t\t  position: absolute;\n\t\t  bottom: -32px;\n\t\t  left: 50%;\n\t\t  margin: 0 0 0 -16px;\n\t\t  fill: #fff;\n\t\t  transition: bottom 0.2s ease-out;\n\t\t}\n\t  }\n  \t}\n\t.person-name {\n\t  color: #fff;\n\t  display: block;\n\t  text-align: center;\n\t  text-decoration: none;\n\t  padding: 20px 0 5px;\n  \t}\n\t.person-position {\n\t  //color: rgba(225,225,225,0.8);\n\t  display: block;\n\t  width: 100%;\n\t  height: 18px;\n\t  text-align: center;\n\t  text-decoration: none;\n\t  padding: 0;\n\t  font-weight: 300;\n\t  text-transform: uppercase;\n\t  letter-spacing: 1px;\n\t  font-size: 90%;\n  \t}\n  }\n\n  .team-member .member-pic:hover .pic-rollover {\n\t  opacity: 1;\n  }\n  .team-member .member-pic .pic-rollover:hover .icon {\n\t  bottom: 12px;\n  }\n\n\n\n  h3.readmore a {\n\tcursor: text;\n\ttext-decoration: none;\n\t&:hover {text-decoration: none;}\n  }\n\n\n\n  @media all and (min-width: (@max-width-desktop + 80)) {\n\tdiv.in {\n\t\tmax-width: @max-width-desktop + 40;\n  \t}\n  }\n\n  .tabletonly {display: none}\n\n\n  // * * * * * * * * * * * * * * * * * * * * * * * * * TABLET * * * * * * * * * * * * * * * * * * * * * * * * * *\n\n  @media all and (min-width: @threshold-mobile) and (max-width: (@threshold-tablet - 1) ) {\n\n\n\t// left for debugging\n\t/*\n\t&:before {\n\t  content: \"tablet\";\n\t  position: fixed;\n\t  font-weight: bold;\n\t  top:0;\n\t  left:0;\n\t  background: #00f;\n\t  color:white;\n\t  z-index: 1000;\n\t}\n\t*/\n\n\t-webkit-font-smoothing: subpixel-antialiased;\n\n\t.notablet {\n\t  display: none;\n\t}\n\n\n\n\n\n\tsection {\n\t  font-size: 1.25rem;\n\t  h2 {\n\t\tmargin-bottom: 50px;\n\t  }\n\t}\n\n\n\n\tsection#createandsharevr img,\n\tsection#whyusevizor .in >img\n\t{\n\n\t  display: block;\n\t  margin: 0 auto;\n\t  max-width: 100%;\n\n\t}\n\tsection#createandsharevr {\n\t  div.text {\n\t\tposition: relative;\n\t\tp, div {\n\t\t  display:table-cell;\n\t\t  vertical-align: middle;\n\t\t}\n\t\tp, p.nomobile {\n\t\t  width: 50%;\n\t\t  padding: 0% 5% 0 0;\n\t\t}\n\t\tdiv {\n\t\t  width: 40%;\n\t\t  a {\n\t\t\twidth: 100%;\n\t\t  }\n\t\t}\n\t  }\n\n\t  @heading-offset: -80px;\n\t  .in h2 {\n\t\tfont-size: 3.4rem;\n\t\tmargin-top: @heading-offset;\n\t\tmargin-bottom: 10px - @heading-offset;\n\t  }\n\t}\n\n\tsection#whyusevizor {\n\t  div.in>div {\n\t\tdisplay: -webkit-flex;\n\t\t-webkit-flex-wrap: wrap;\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t  }\n\t  #why1, #why2, #why3 {\n\t\tmargin-top: 40px;\n\t  }\n\n\t  #why1, #why2 {\n\t\t -webkit-flex-basis: 49.5%;\n\t\tflex-basis: 49.5%\n\t  }\n\t  #why1 {\n\t\tp, h3 {\n\t\t  max-width: 95%;\n\t\t}\n\t  }\n\t  #why1 { -webkit-order:1; order: 1; }\n\t  #why2 { -webkit-order:2; order: 1; }\n\n\t  #why3 {\n\t\tposition: relative;\n\t\t-webkit-order: 3;\n\t\t-webkit-flex-basis: 100%;\n\t\torder: 3;\n\t\tflex-basis: 100%;\n\t\tpadding-left: 49.5%;\n\t  \timg {\n\t\t  top: 0.5rem;\n\t\t  position: absolute;\n\t\t  left: 0;\n\t\t  width: 180px;\n\t\t  height: auto;\n\t\t}\n\n\t  }\n\n\t}\n\n\tsection#howitworks {\n\t  .in div.text>div {\n\t\tdisplay: -webkit-flex;\n\t\t-webkit-justify-content: space-between;\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\tp:first-of-type {\n\t\t  padding-right: 20px;\n\t\t  padding-left: 5px;\n\t\t}\n\t\tp {\n\t\t  -webkit-flex-basis: 48%;\n\t\t  flex-basis: 48%;\n\t\t}\n\t  }\n\t  img {\n\t\tmax-width: 100%;\n\t\tmargin: 0 auto;\n\t\t&.nomobile.nodesktop {\n\t\t  display: block;\n\t\t  margin-bottom: 50px;\n\t\t}\n\t  }\n\t}\n\n\t.team-member {\n\t  -webkit-flex-basis: 50%;\n\t  flex-basis: 50%;\n\t  min-height: 210px;\n\t  min-width: 200px;\n\t  height: 250px;\n\t  padding: 40px 0;\n\t}\n\n\n\n\n\n\n\n\n\n  } // END TABLET\n\n\n  // * * * * * * * * * * * * * * * * * * * * * * * * * MOBILE * * * * * * * * * * * * * * * * * * * * * * * * * *\n\n  @media all and (max-width: (@threshold-mobile - 1)) {\n\n\t/*\n\t&:before {\n\t  content: \"mobile\";\n\t  position: fixed;\n\t  font-weight: bold;\n\t  top:0;\n\t  left:0;\n\t  background: #f00;\n\t  color:white;\n\t  z-index: 1000;\n\t}\n\t*/\n\n\tsection#getstarted {\n\t  height: 420px;\n\t  #herotext {\n\t\ttop: 25%;\n\t\th1 {\n\t\t  font-weight: 700;\n\t\t  letter-spacing: -1px;\n\t\t  flex: 0 0 240px;\n\t\t  margin-bottom: 65px;\n\t\t}\n\t\t> div {\n\t\t  -webkit-justify-content: center;\n\t\t  justify-content: center;\n\t\t}\n\t\ta.cta {\n\t\t  flex: 0 0 65%;\n\t\t\tpadding: 13px 25px;\n\t\t}\n\t  }\n\t}\n\n\n\tsection>div.in img.hero {\n\t  padding: 0 20px;\n\t  width: 100%;\n\t}\n\n\tsection#getnewsletter {\n\t  p {\n\t\tpadding: 0 20px;\n\t\twhite-space: pre-line;\n\t  }\n\t  .in>div {\n\t  \tpadding-left: 20px;\n\t  \tpadding-right: 20px;\n\t  }\n\t}\n\n\th3.readmore a {\n\t  .readmore(20px, 5px);\n\t  padding: 5px 0 5px 40px;\n\t  &:before {\n\t\tleft: 10px;\n\t  }\n\t}\n\n\tsection {\n\t  padding-bottom: 0;\n\n\t  >div.in h2 {\n\t  \tfont-size: 2rem !important;\n\t\tline-height: 3rem !important;\n\t  }\n\n\t  &#getnewsletter {\n\t\tpadding-bottom: 50px;\n\t  }\n\t  &#createandsharevr {\n\t\tpadding-top: 70px;\n\t\tpadding-bottom: 35px;\n\t\tdiv.in h2 {\n\t\t  line-height: 1.15em;\n\t\t  top: -50px;\n\t\t}\n\t\ta.launch-button {\n\t\t  margin-top: 50px;\n\t\t  width: 87%;\n\t\t}\n\t  }\n\t  &#vizorteam {\n\t\tpadding-bottom: 70px;\n\t  }\n\t}\n\n\n\n\tsection#whyusevizor {\n\t  p {\n\t\tpadding: 10px;\n\t  }\n\t  #why1 h3.readmore,\n\t  #why2 h3.readmore,\n\t  #why3 h3.readmore {\n\t\tmax-width: 110%;\n\t\tmargin: 5px -25px 5px -5px;\n\t  }\n\t  #why3 {\n\t\tpadding-left: 0;\n\t  }\n\t}\n\n\tsection#getnewsletter {\n\n\t  input {\n\t\toutline: 0;\n\t\tbox-shadow: none;\n\t\tmargin:0 1px;\n\t  }\n\t}\n\n\t#vizorteam  {\n\t  .team-member {\n\t\t-webkit-flex-basis: 100%;\n\t\tflex-basis: 100%;\n\t\tmin-height: 260px;\n\t\tpadding: 26px 0px;\n\t\tfont-size: 120%;\n\t  }\n\t}\n\n\n\n\t.mobileonly, .launch-button.mobileonly {\n\t  display: block;\n\t}\n\n\tsection#createandsharevr {\n\t  div.in img {\n\t\tmargin-top: 3.2em !important;\n\t  }\n\t  div.in h2 {\n\t\tposition:absolute;\n\t\ttop:-55px;\n\t\tmargin-top:0;\n\t\twhite-space: pre-line;\n\t\twidth: 100%;\n\t  }\n\t  a.launch-button {\n\t\t margin-left: auto;\n\t\t margin-right: auto;\n\t  }\n\t}\n\n \tsection#howitworks {\n\t  h3 {\n\t\tmargin: 10px -5px 5px -5px;\n\t\tpadding: 15px 20px 10px 10px;\n\t  }\n\t  img {\n\t\tmargin: 30px auto 70px auto;\n\t  }\n\t  p { padding: 10px 20px }\n\t}\n\n\tsection#whyusevizor {\n\t  #why1,#why2,#why3 {\n\t\th3 { padding: 15px 20px 10px 10px }\n\t\tp { padding: 10px 20px }\n\t  }\n\t}\n\n\th3.readmore {\n\t   border-top: 1px solid rgba(0,0,0,0.2);\n\t}\n\n\tsection#whyusevizor {\n\t  #why1 h3.readmore {\n\t\tborder-top: 0;\n\t  }\n\t  #why1, #why2, #why3 {\n\t\t-webkit-flex-basis: 100%;\n\t\tflex-basis: 100%;\n\t\tmargin-top: 0;\n\t  }\n\t  #why3 {\n\t\timg {\n\t\t  display: block;\n\t\t  float:none;\n\t\t  position: relative;\n\t\t  margin: 0px auto 20px auto;\n\t\t}\n\t\tp {\n\t\t  float:none;\n\t\t  width: 100%;\n\t\t  margin-left: 0;\n\t\t}\n\t  }\n\t}\n\n\n\n  } // END MOBILE\n\n\n\n\n\n  // * * * * * * * * * * * * * * * * * * * * * * * * * DESKTOP * * * * * * * * * * * * * * * * * * * * * * * * * *\n\n  @media all and (min-width: @threshold-tablet) {\n\n\t/*\n\t&:before {\n\t  content: \"desktop\";\n\t  position: fixed;\n\t  font-weight: bold;\n\t  top:0;\n\t  left:0;\n\t  background: #ff0;\n\t  color:#000;\n\t  z-index: 1000;\n\t}\n\t*/\n\n\t.nodesktop {\n\t  display: none !important;\n\t}\n\n\n\tsection#createandsharevr {\n\t  img {\n\t\tposition: absolute;\n\t\tleft: 55%;\n\t\ttop: 2.5rem;\n\t\tmax-width: none;\n\t  }\n\t  div.text {\n\t\twidth: 400px;\n\t  }\n\t  h2 {\n\t\ttext-align: left;\n\t\twhite-space: pre-line;\n\t\twidth: 40%;\n\t\tmargin-top:0px;\n\t  }\n\t  div.text {\n\t\tmin-height: 365px;\n\t\tp {\n\t\t  margin-bottom: 50px;\n\t\t}\n\t  }\n\t}\n\tsection>div.in {\n\t  padding-left: 20px;\n\t  padding-right: 20px;\n\t}\n\n\tsection#whyusevizor {\n\t  div.in {\n\t\tposition: relative;\n\t\t>img {\n\t\t  position: absolute;\n\t\t  right: 60%;\n\t\t  margin-top: 70px;\n\t\t  max-width: none;\n\t\t}\n\t  }\n\n\t  #why1, #why2, #why3 {\n\t\tmargin-top: 100px;\n\t\tp {\n\t\t  width: 365px;\n\t\t}\n\t  }\n\n\t  #why1, #why2 {\n\t\tmargin-left: 55%;\n\t\twidth: 45%;\n\t  }\n\t  #why3 {\n\t\tposition: relative;\n\t\timg {\n\t\t  position: absolute;\n\t\t  top: 0.9rem;\n\t\t  left: 55%;\n\t\t}\n\t  }\n\t}\n\n\tsection#howitworks {\n\t  h2 {\n\t\tmargin: 0px 0 70px 0;\n\t  }\n\t  img {\n\t\tfloat:right;\n\t  }\n\n\t  div.text {\n\t\twidth: 50%;\n\t\tmargin-right: 50%;\n\t  }\n\t  ul.cta {\n\t\tclear:both;\n\t\tpadding-top: 70px;\n\t  }\n\t  p {\n\t\twidth: 400px;\n\t  }\n\t}\n\n\t.team-member {\n\t  -webkit-flex-basis: 25%;\n\t  flex-basis: 25%;\n\t  min-height: 240px;\n\t  min-width: 200px;\n\t  height: 280px;\n\t  padding: 34px 0px 28px;\n\t}\n\n\n  } // END DESKTOP\n\n} // body.bHome\n\nbody.bHome:not(.bAbout) #contentwrap header {\n  position: absolute;\n  top:0;\n  left:0;\n  right:0;\n  z-index: 100;\n}\n\nbody.bMain.layoutTablet #contentwrap {\n  margin: 0 auto;\n\n  #featuredVR>div, #featuredVR>h2 {\n\tmargin-left: auto;\n\tmargin-right: auto;\n  }\n\n}\n\nbody.bHome.layoutTablet #contentwrap {\n\n  section#getstarted {\n\tposition: relative;\n\tbackground: black;\n\theight: 345px;\n\t#herotext {\n\t  top: 40%;\n\t\theight: 30%;\n\t  >div {\n\t\t  max-width: none;\n\t\t  a {\n\t\t\t  margin: 0 auto;\n\t\t  }\n\t  }\n\t  h1 {\n\t\ttext-align: center;\n\t  }\n\t}\n  }\n}\n\n\nbody.bAbout.layoutMobile #contentwrap {\n  #aboutIntro, #vizorteam {\n\tpadding-bottom: 40px;\n  }\n  #aboutIntro {\n\tpadding-top: 0px;\n  }\n  #vizorteam {\n\tpadding-top: 40px;\n  }\n  #aboutIntro div.in {\n\t>img {\n\t  float: none;\n\t  display: block;\n\t  margin: 20px;\n\t}\n\t>h1 {\n\t  width: 100%;\n\t  margin: 0 auto 20px auto;\n\t  padding: 0 20px;\n\t  max-width: none;\n\t}\n\t>div {\n\t  width: 100%;\n\t  margin: 20px auto;\n\t  padding: 0 20px;\n\t  text-align: left;\n\t  max-width: none;\n\t}\n  }\n\n  section {\n\tdiv.in {\n\t  h2:first-child {\n\t\ttext-align: left;\n\t\tpadding: 0 20px;\n\t  }\n\t  p.intro {\n\t\twidth: 100%;\n\t\tmargin: 30px auto;\n\t\tpadding: 0 20px;\n\t\ttext-align: left;\n\t\tmax-width: none;\n\t  }\n\t}\n  }\n}\n\nbody.bAbout.layoutMobile #contentwrap {\n  section#aboutIntro {\n\ta.launch-button.nomobile {\n\t  display: none;\n\t}\n\tdiv.in > section#aboutEmbed {\n\t  width: auto;\n\t  margin: 0 20px;\n\t  float:none;\n\t}\n\tdiv.in > h1 {\n\t  display: none;\n\t}\n  }\n}\n\nbody.bAbout.layoutTablet #contentwrap {\n  section#aboutIntro {\n\tdiv.in > section#aboutEmbed {\n\t  width: 49%;\n\t  margin: -10px 0 0 0;\n\t}\n\tpadding-bottom: 50px;\n  }\n  section#vizorteam {\n\tpadding-top: 30px;\n  }\n}\n\nbody.bAbout.layoutMobile #contentwrap {\n  div.featured.downloads {\n\t-webkit-flex-wrap: wrap;\n\tflex-wrap: wrap;\n\t>div {\n\t  -webkit-flex: 1 1 40%;\n\t  flex: 1 1 40%;\n\t}\n\t>div+div {\n\t  margin-left: 20px;\n\t}\n  }\n}\n\nbody.bAbout #contentwrap {\n\n  section#presskit {\n\tbackground: #0b132a;\n\tpadding-bottom: 125px;\n  }\n  div.featured.downloads {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n\t>div {\n\t  -webkit-flex: 1;\n\t  flex: 1;\n\t  text-align: center;\n\t  margin-top: 50px;\n\t  a {\n\t\tcolor: white;\n\t  }\n\t  a.svg {\n\t\tdisplay: block;\n\t\tfont-size: 19px;\n\t\tletter-spacing: 0.75px;\n\t\tmargin-bottom: 10px;\n\t\t&:hover {\n\t\t  text-decoration: none;\n\t\t}\n\t\tsvg {\n\t\t  width: 100%;\n\t\t  max-width: 140px;\n\t\t  display: block;\n\t\t  margin: 0 auto 20px auto;\n\t\t}\n\t  }\n\t  a:not(.svg) {\n\t\t.downloadoption;\n\t\tpadding: 0 3px;\n\t  }\n\t}\n\t>div+div {\n\t  margin-left: 60px;\n\t}\n  }\n  header, section#aboutIntro {\n\tbackground: #0b132a;\n  }\n\n  header nav {\n\tborder-bottom: 0;\n  }\n  #aboutIntro h1, section>div.in>h2:first-child {\n\tfont-size: 39px;\n\tfont-weight: 600;\n  }\n\n  #aboutIntro {\n\tpadding: 40px 0 100px 0;\n\tdiv.in {\n\t  >h1 {\n\t\tmargin: 0 0 20px auto;\n\t\twidth: 50%;\n\t\tmax-width: 420px;\n\t  }\n\t  >div {\n\t\tmargin: 0 0 20px auto;\n\t\twidth: 50%;\n\t\tmax-width: 420px;\n\t  }\n\t}\n\tdiv.in>section#aboutEmbed {\n\t  float:left;\n\t  margin-top:-30px;\n\t  width:400px;\n\t}\n\tp {\n\t  font-size: 19px;\n\t  line-height: 1.65;\n\t  color: #c3c3c3;\n\t  margin: 20px 0 40px 0;\n\t  letter-spacing: 1px;\n\t}\n\ta.launch-button {\n\t  .launch-button-macro;\n\t  border-radius: 45px;\n\t  background: none;\n\t  border: 2px solid white;\n\t  text-transform: uppercase;\n\t  font-size: 16px;\n\t  letter-spacing: 2px;\n\t  padding: 14px 50px;\n\t  width: auto;\n\t  display: inline;\n\t  margin: 1px;\n\t}\n  }\n\n  background: #171717;\n  .team-member {\n\tfont-size: 14px;\n  }\n\n  section#vizorteam {\n\tbackground: #250642;\n  }\n\n\n  section {\n\tpadding: 60px 0;\n\tdiv.in {\n\t  h2:first-child {\n\t\ttext-align: center;\n\t  }\n\t  p.intro {\n\t\ttext-align: center;\n\t\tmax-width: 500px;\n\t\tmargin: 38px auto 0 auto;\n\t\tfont-size: 19.5px;\n\t\tline-height: 1.7;\n\t\tletter-spacing: 0.5px;\n\t\tcolor: #c3c3c3;\n\t  }\n\t}\n  }\n}"
  },
  {
    "path": "less/libraries.less",
    "content": ".patches-block {\n\tleft: 30px;\n\n}\n\n.assets-block {\n    left: 30 + @floating-box-width + 30;\n\n}\nbody.bEditor div.floating-box.properties-block {\n  right: 30px;\n  top: 10px;\n  z-index: 67;\n}\n\n\n#assets {\n    display: block; \n    float: left;\n    position: relative;\n    .tab-content {\n            display: none;\n    }\n    .tab-content.active {\n            display: block;\n        }    \n    }\n\n.assets-frame {\n    height: 152px;\n    width: 100%;\n    overflow-x: hidden;\n    overflow-y: auto;\n    background: @bg-light;\n    position: relative;\n    float: left;\n    border-bottom: 1px solid @bg-darker;\n}\n\n.assets-group {\n    width: 100%;\n    position: relative;\n    float: left;\n}\n\n.assets-group .group-title {\n    display: block;\n    position: relative;\n    width: 100%; \n    padding: 16px 20px 12px 20px;\n    color: @tab-text-inactive;\n    text-transform: uppercase;\n    font-size: 12px;\n    line-height: 12px;\n    letter-spacing: 2px;\n    font-weight: 600;\n}\n\nul.assets-list {\n    margin: 0;\n    padding: 0;\n    display: block;\n    position: relative;\n    width: 100%;\n    > li {\n        display: block;\n        position: relative;\n        margin: 0;\n        padding: 0;\n        width: 100%;\n        height: 32px;\n        float: left;\n        clear: both;\n        cursor: pointer;\n        svg {\n            display: block;\n            width: 32px;\n            height: 32px;\n            margin-left: 14px;\n            stroke: @tab-text-inactive;\n            float: left;\n            overflow: visible;\n            }\n        span {\n            display: inline-block;\n            padding: 8px 20px 8px 6px;\n            color: @tab-text-inactive;\n            font-size: 12px;\n            font-weight: 600;\n            float: left;\n            }\n    }\n    > li.active {\n        cursor: grab;\n        svg {\n            stroke: @editor-text-active;\n            }\n        span {\n            color: @editor-text-active;\n        }\n    }\n    > li:hover {\n        svg {\n            stroke: @editor-text-active;\n            }\n        span {\n            color: @editor-text-active;\n        }\n    }\n}\n\n.load-buttons {\n    display: block;\n    position: relative;\n    height: 37px;\n    width: @floating-box-width;\n    float: left;\n    button {\n        width: 50%;\n        height: 37px;\n        margin: 0;\n        padding: 0;\n        font-family: @font-family-sans-serif;\n        background: @bg-light;\n        position: relative;\n        float: left; \n        border-bottom: 1px solid @bg-darker;\n        border-left: 0;\n        border-top: 0;\n        border-right: 0;\n        svg {\n            position: relative;\n            float: left;\n            width: 37px;\n            height: 37px;\n            overflow: visible;\n            margin-left: 9px;\n            stroke: @tab-text-inactive;\n            }\n        span {\n            display: inline-block;\n            padding: 9px 8px 8px 6px;\n            color: @tab-text-inactive;\n            font-size: 12px;\n            font-weight: 600;\n            float: left;\n            box-sizing: border-box;\n            }\n        }\n        button:first-child {\n            border-right: 1px solid @bg-darker;\n        }\n        button:hover {\n            svg {\n                stroke: @editor-text-active;\n            }\n            span {\n                color: @editor-text-active;\n            }\n        }\n}\n\n#asset-info {\n    position: relative;\n    float: left;\n    width: 100%;\n    div {\n        padding: 18px 20px;\n        float: left;\n        .asset-image {\n            border-radius: 5px;\n            overflow: hidden;\n            height: 96px;\n            width: 96px;\n            margin: 0;\n            box-sizing: border-box;\n            background: #6b748f;\n            display: table-cell;\n            position: relative;\n            vertical-align: middle;\n            text-align: center;\n            float: left;\n            img {\n                width:100%;\n                height: auto;\n                margin: 0 auto;\n                }\n        }\n        .asset-details {\n            display: block;\n            position: relative;\n            float: left;\n            padding: 0 0 0 18px; \n            color: @chat-text-color;\n        }\n    }\n}\n\n\n// ************************** RIGHT CLICK MENU\n\n@bg-menu-panel:     lighten(@bg-light,2%);\n@color-menu-panel-text: lighten(@editor-text-default,10%);\n@color-menu-panel-text-hover: lighten(@editor-text-hover,10%);\n@bgcolor-menu-panel-hover: @selected-bg;\n@bg-menu-entry-height: 30px;\n@menu-border-radius: 4px;\n\nli.context-menu-item span  {\n\twhite-space: nowrap;\n}\n\n/* Context menu */\n.menu-panel, .menu-panel * {\n  -webkit-box-sizing: border-box;\n  box-sizing: border-box;\n}\n\n.menu-panel {\n  border-radius: 4px;\n  \t-webkit-font-smoothing: subpixel-antialiased;\n    background: @bg-menu-panel;\n  \tcolor: @color-menu-panel-text;\n\tposition:relative;\n\tleft: 20px;\n\tfont-size: 9pt;\n\tpadding: 0;\n\tbox-shadow: 0 0 20px rgba(0, 0, 0, 0.4);\n\tdisplay: table-cell;\n\tcursor: pointer;\n}\n.menu-panel+.menu-panel {\n  background: lighten(@bg-menu-panel,1%);\n  .menu-item {\n\tcolor: lighten(@color-menu-panel-text,5%);\n  }\n}\n\n.menu-grp-item {\n  letter-spacing: 0.5px;\n}\n\n.menu-item {\n  display: -webkit-flex;\n  display: flex;\n  align-items: center;\n  \twhite-space: nowrap;\n\tpadding: 0;\n\tmargin: 0;\n\tcolor: @color-menu-panel-text;\n\t&.selected {\n\t  color: @color-menu-panel-text-hover;\n\t  background: @bgcolor-menu-panel-hover;\n\t  // webkit\n\t  &:first-child {\n\t\tborder-top-left-radius: @menu-border-radius;\n\t\tborder-top-right-radius: @menu-border-radius;\n\t  }\n\t  &:last-child {\n\t\tborder-bottom-left-radius: @menu-border-radius;\n\t\tborder-bottom-right-radius: @menu-border-radius;\n\t  }\n\t}\n}\n.menu-item.menu-grp-item.selected {\n  background:none;\n}\n\n.menu-item, .menu-item>* {\n  height: @bg-menu-entry-height;\n  line-height: @bg-menu-entry-height;\n  vertical-align: middle;\n}\n\n.menu-item+.menu-item {\n  border-top: 1px solid rgba(0,0,0,0.3)\n}\n\n.menu-item>span {\n  display: inline-block;\n  -webkit-flex: 1;\n  flex: 1;\n}\n\n.menu-item {\n  > .menu-lbl {\n\tflex-grow: 1;\n\tpadding: 0 20px 0 10px;\n  }\n  > .menu-lbl-grp {\n\tpadding: 0 20px;\n  }\n}\n\n.menu-grp-item { /* group > */\n  span:last-child {\n\tflex-grow: 0;\n\tmin-width: 12px;\n\theight: 12px;\n\tmargin: 0 10px 0 0;\n\tbackground: url('/images/v2/chevron.svg') center center no-repeat;\n\tbackground-size: 12px 12px;\n\topacity: 0.5;\n  }\n\n  &.selected {\n\tspan:last-child {\n\t  opacity: 1;\n\t}\n  }\n}\n\n.menu-item>.menu-icon, .menu-item>.menu-icon:first-child {\n  flex-grow: 0;\n  padding: 0 !important;\n  min-width: 16px;\n  height: 16px;\n  margin: 0 -4px 0 8px;\n}\n\n.menu-lbl-grp {\n\tposition: relative;\n\twhite-space: nowrap;\n}\n\n.menu-lbl {\n\tposition: relative;\n\twhite-space: nowrap;\n}\n\nul.unit-degree li>span:after {\n  content:\"°\";\n}\nul.xyz {\n  li:before {\n\tfloat:left;\n\tline-height: 1.4em;\n\tmargin-right: 5px;\n\tpadding-top: 1px;\n\tcolor:rgba(255,255,255,0.2);\n  }\n  li {\n\n\t&:hover span.uiValueAdjustable {\n\t  color: #afbfdf;\n\t}\n\n\tspan.uiValueAdjustable.adjusting:after,\n\t&:hover span.uiValueAdjustable:after {\t// renders the ^v icon\n\t  content: '';\n\t  display: block;\n\t  float:right;\n\t  width: 8px;\n\t  height: 17px;\n\t  background: url('/images/v2/widgetSprite.svg') -1px 0px no-repeat;\n\t}\n  }\n  &.uiDisabled li:hover span.uiValueAdjustable:after {\n\tdisplay: none;\n  }\n  li.xyz-x:before {content: \"X\";}\n  li.xyz-y:before {content: \"Y\";}\n  li.xyz-z:before {content: \"Z\";}\n}\n\n\n.propertiesContent {\n  padding-bottom: 5px;\n  label {\n\tmargin-bottom: 0;\n\tfont-weight: 500;\n\tcolor: @editor-text-default;\n  }\n  ul.xyz {\n\tdisplay: flex;\n\tdisplay: -webkit-flex;\n\tpadding-left: 0;\n\tli {\n\t  -webkit-flex: 1;\n\t  flex: 1;\n\t  height: 18px;\n\t  span {\n\t  \tcolor: @editor-text-default;\n\t\t  display: block;\n\t\t  line-height: 1.4em;\n\t\t  padding: 1px;\n\t\t  overflow: hidden;\n          transition: color 0.2s;\n          &.changed {\n              color: white;\n              transition: color 0s;\n          }\n\t  }\n\t  input.uiTextEntry {\n\t\tborder: 1px solid red;\n\t\tpadding: 0;\n\t\tline-height: inherit;\n\t  }\n\t}\n\t>li:first-child {\n\t  padding-right: 5px;\n\t}\n\t>li:nth-child(2) {\n\t  padding: 0 5px;\n\t}\n\t>li:last-child {\n\t  padding-left: 5px;\n\t}\n\n  }\n    .noSelection, .noSelectionOnly {\n      color: rgba(255,255,255,0.3);\n      text-align: center;\n    }\n    #propertiesResetScale, #propertiesResetRotation, #propertiesResetPosition, #propertiesLinkScale {\n      border: 0;\n      width: 15px;\n      height: 18px;\n    }\n}\n\n\n#properties-panel {\n    /* width: 232px;\n    .block-header {\n        width: 232px;\n        .nav-tabs {\n            width: 158px;\n        }\n    } */\n    .propertiesContent {\n        section {\n\t\t  padding: 5px 0;\n\t\t  ul {\n\t\t\tmargin: 0;\n\t\t\tpadding: 10px 15px;\n\t\t\tbackground: #1f2331\n\t\t  }\n\t\t  h4, >div, >p {\n\t\t\tmargin:0;\n\t\t\tpadding: 5px 15px;\n\t\t  }\n        }\n        section {\n            ul.xyz.uiDisabled,\n            &.disabled ul.xyz {\n                li span {\n\t\t\t\t  background: none;\n\t\t\t\t  pointer-events: none;\n\t\t\t\t  color: @editor-text-inactive;\n                }\n            }\n            button[disabled],\n            &.disabled button {\n                opacity: 0.3;\n            }\n        }\n        h4 {\n            .clearfix;\n            font-size: 100%;\n\t\t  \tfont-weight: 500;\n\t\t  \tcolor: @editor-text-default;\n            margin:0 0 5px 0;\n            button {\n                float:right;\n                height: 18px;\n            }\n        }\n    }\n    #propertiesPane.build {\n        section.noSelectionOnly {\n            display: none;\n        }\n        &.noSelection {\n            section {\n                display: none;\n            }\n            section.noSelectionOnly {\n                display: block;\n            }\n        }\n    }\n    input[type=text] {\n        background: rgba(255,255,255,0.1);\n        outline: none;\n        border: 0;\n        padding: 4px;\n\t  &.uiTextEntry.node-value-input {\n\t\tpadding:1px;\n\t\tbackground: rgba(0,0,0,0.6);\n\t  }\n    }\n    section button {\n\t  @pbtn-color-on: \t#afbfdf;\n\t  @pbtn-color-hover: \tlighten(#afbfdf, 15%);\n\t  @pbtn-color-off: \t@editor-text-inactive;\n\t  @pbtn-color-neutral: #7e8dab;\n\n        background: none;\n        padding: 1px 5px;\n        line-height: 1.1;\n\n\t  \tsvg, use {\n\t\t  stroke: @pbtn-color-neutral;\n\t\t}\n\t  \t&:hover {\n\t\t  svg, use {\n\t\t\tstroke: @pbtn-color-hover;\n\t\t  }\n\t\t}\n        &.uiToggle_off {\n        \tsvg, use {\n\t\t\t  stroke: @pbtn-color-off\n\t\t\t}\n        }\n\t  \t&.uiToggle_on {\n            svg, use {\n\t\t\t  stroke: @pbtn-color-on;\n\t\t\t}\n        }\n        &+button {margin-right: 2px}\n    }\n\n    div.nodeInspector {\n        div.prop.ptBoolean {\n            button {\n                width: 1.4em;\n                height: 1.4em;\n                line-height: 1.4em;\n                border-radius: 50%;\n                &[disabled] {\n                    border: 2px dotted #AFBFDF;\n                    &.uiToggle_on {\n                        border: 2px dotted #000;\n                    }\n                }\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "less/mixin.less",
    "content": "//----------------------------\n//\n//  mixins.less v0.1.5\n//  http://mixinsless.com/\n//  Reuse snippets & Cross-browser private properties snippets.\n//----------------------------\n\n// Border radius with the same argument\n// -------------------------\n.rounded(@radius: 3px) {\n  -webkit-border-radius:@radius;\n  -moz-border-radius:@radius;\n  border-radius:@radius;\n  -webkit-background-clip:padding-box;\n  -moz-background-clip:padding-box;\n  background-clip:padding-box;\n}\n\n// Border radius with different arguments\n// -------------------------\n.border-radius(@topleft: 0, @topright: 0, @bottomright: 0, @bottomleft: 0) {\n  -webkit-border-top-left-radius:@topleft;\n  -webkit-border-top-right-radius:@topright;\n  -webkit-border-bottom-right-radius:@bottomright;\n  -webkit-border-bottom-left-radius:@bottomleft;\n  -moz-border-radius-topleft:@topleft;\n  -moz-border-radius-topright:@topright;\n  -moz-border-radius-bottomright:@bottomright;\n  -moz-border-radius-bottomleft:@bottomleft;\n  border-top-left-radius:@topleft;\n  border-top-right-radius:@topright;\n  border-bottom-right-radius:@bottomright;\n  border-bottom-left-radius:@bottomleft;\n  -webkit-background-clip:padding-box;\n  -moz-background-clip:padding-box;\n  background-clip:padding-box;\n}\n\n// Background size\n// -------------------------\n.background-size(@size) {\n  -webkit-background-size:@size;\n  -moz-background-size:@size;\n  -o-background-size:@size;\n  background-size:@size;\n}\n\n// Opacity\n// -------------------------\n.opacity(@opacity) {\n  opacity:@opacity;\n  @opacityIE : @opacity * 100;\n  filter:~\"alpha(opacity=@{opacityIE})\";\n}\n\n// Appearance\n// -------------------------\n.appearance(@appearance:none) {\n  -webkit-appearance:@appearance;\n  appearance:@appearance;\n}\n\n// Gradient\n// -------------------------\n.gradient(@start: #000000, @stop: #FFFFFF) {\n  background:(@start + @stop)/2;\n  background:-webkit-gradient(linear, left top, left bottom, color-stop(0, @start), color-stop(1, @stop));\n  background:-moz-linear-gradient(center top, @start 0%, @stop 100%);\n}\n\n// Box shadow\n// -------------------------\n.drop-shadow(@horizontal: 0, @vertical: 1px, @blur: 2px, @alpha: 0.1) {\n  -webkit-box-shadow:@horizontal @vertical  @blur rgba(0, 0, 0, @alpha);\n  -moz-box-shadow:@horizontal @vertical  @blur rgba(0, 0, 0, @alpha);\n  box-shadow:@horizontal @vertical  @blur rgba(0, 0, 0, @alpha);\n}\n\n// Box shadow inset\n// -------------------------\n.inner-shadow(@horizontal: 0, @vertical: 1px, @blur: 2px, @alpha: 0.4) {\n  -webkit-box-shadow:inset @horizontal @vertical @blur rgba(0, 0, 0, @alpha);\n  -moz-box-shadow:inset @horizontal @vertical @blur rgba(0, 0, 0, @alpha);\n  box-shadow:inset @horizontal @vertical @blur rgba(0, 0, 0, @alpha);\n}\n\n// Box inner border\n// -------------------------\n.inner-border(@width: 1px, @color: #000) {\n  -webkit-box-shadow:inset 0 0 0 @width @color;\n  -moz-box-shadow:inset 0 0 0 @width @color;\n  box-shadow:inset 0 0 0 @width @color;\n}\n\n// Box shadow default\n// -------------------------\n.box-shadow(@arguments) {\n  -webkit-box-shadow:@arguments;\n  -moz-box-shadow:@arguments;\n  box-shadow:@arguments;\n}\n\n// Animation\n// -------------------------\n.animation(@animation) {\n  -webkit-animation:@animation;\n  -moz-animation:@animation;\n  animation:@animation;\n}\n\n.transition(@transition) {\n  -webkit-transition:@transition;\n  -moz-transition:@transition;\n  -o-transition:@transition;\n  transition:@transition;\n}\n.transition-delay(@transition-delay) {\n  -webkit-transition-delay:@transition-delay;\n  -moz-transition-delay:@transition-delay;\n  -o-transition-delay:@transition-delay;\n  transition-delay:@transition-delay;\n}\n.transition-duration(@transition-duration) {\n  -webkit-transition-duration:@transition-duration;\n  -moz-transition-duration:@transition-duration;\n  -o-transition-duration:@transition-duration;\n  transition-duration:@transition-duration;\n}\n\n// Transform\n// -------------------------\n.transform(@arguments) {\n  -webkit-transform:@arguments;\n  -moz-transform:@arguments;\n  transform:@arguments;\n}\n\n// Transform rotation\n// -------------------------\n.rotation(@deg:5deg) {\n  -webkit-transform:rotate(@deg);\n  -moz-transform:rotate(@deg);\n  transform:rotate(@deg);\n}\n\n// Transform scale\n// -------------------------\n.scale(@ratio:1.5) {\n  -webkit-transform:scale(@ratio);\n  -moz-transform:scale(@ratio);\n  transform:scale(@ratio);\n}\n\n// Translate\n// -------------------------\n.translate(@x:0, @y:0) {\n  -moz-transform:translate(@x, @y);\n  -webkit-transform:translate(@x, @y);\n  -o-transform:translate(@x, @y);\n  -ms-transform:translate(@x, @y);\n  transform:translate(@x, @y);\n}\n\n// Translate3d\n// -------------------------\n.translate3d(@x, @y, @z) {\n  -webkit-transform:translate3d(@x, @y, @z);\n  -moz-transform:translate3d(@x, @y, @z);\n  -o-transform:translate3d(@x, @y, @z);\n  transform:translate3d(@x, @y, @z);\n}\n\n// Background clipping\n// -------------------------\n.background-clip(@clip) {\n  -webkit-background-clip:@clip;\n  -moz-background-clip:@clip;\n  background-clip:@clip;\n}\n\n// CSS columns\n// -------------------------\n.columns(@colwidth: 250px, @colcount: 0, @colgap: 50px, @columnRuleColor: #EEEEEE, @columnRuleStyle: solid, @columnRuleWidth: 1px) {\n  -moz-column-width:@colwidth;\n  -moz-column-count:@colcount;\n  -moz-column-gap:@colgap;\n  -moz-column-rule-color:@columnRuleColor;\n  -moz-column-rule-style:@columnRuleStyle;\n  -moz-column-rule-width:@columnRuleWidth;\n  -webkit-column-width:@colwidth;\n  -webkit-column-count:@colcount;\n  -webkit-column-gap:@colgap;\n  -webkit-column-rule-color:@columnRuleColor;\n  -webkit-column-rule-style:@columnRuleStyle;\n  -webkit-column-rule-width:@columnRuleWidth;\n  column-width:@colwidth;\n  column-count:@colcount;\n  column-gap:@colgap;\n  column-rule-color:@columnRuleColor;\n  column-rule-style:@columnRuleStyle;\n  column-rule-width:@columnRuleWidth;\n}\n\n// Import font\n// -------------------------\n.font-face(@fontFamily, @fileName, @style, @weight) {\n  @font-face{\n    font-family:@fontFamily;\n    font-style:@style;\n    font-weight:@weight;\n    src:url('@{fileName}.eot');\n    src:local('@fontFamily'), url('@{fileName}.eot?#iefix') format('embedded-opentype'), url('@{fileName}.woff') format('woff'), url('@{fileName}.ttf') format('truetype'), url('@{fileName}.svg#@{fontFamily}') format('svg'), url(\"@{fileName}.otf\") format('opentype');\n  }\n}\n\n// Clearfix\n// -------------------------\n.clearfix() {\n  zoom:1;\n  &:before{\n    content:'';\n    display:block;\n  }\n  &:after{\n    content:'';\n    display:table;\n    clear:both;\n  }\n}\n\n// CSS image replacement\n// -------------------------\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n.hide-text() {\n  font:0/0 a;\n  color:transparent;\n  text-shadow:none;\n  background-color:transparent;\n  border:0;\n}\n\n// Force line breaks\n// -------------------------\n.word-break() {\n  word-break:break-all;\n  word-wrap:break-word;\n    white-space: normal;\n}\n\n// No wrap\n// -------------------------\n.no-wrap() {\n    word-break: normal;\n    word-wrap: normal;\n    white-space: nowrap;\n}\n\n// Text overflow with(...)\n// -------------------------\n// Requires inline-block or block for proper styling\n.text-overflow() {\n  overflow:hidden;\n  text-overflow:ellipsis;\n  white-space:nowrap;\n  max-width:100%;\n}\n\n.line-overflow(@line) {\n  overflow:hidden;\n  text-overflow:ellipsis;\n  display:-webkit-box;\n  -webkit-line-clamp:@line; /* number of lines to show */\n  -webkit-box-orient:vertical;\n}\n\n// Creates a wrapper for a series of columns\n// -------------------------\n.lay-row() {\n  // Negative margin the row out to align the content of columns\n  margin-left:  (@grid-gutter-width / -2);\n  margin-right: (@grid-gutter-width / -2);\n  // Then clear the floated columns\n  .clearfix();\n}\n\n// Generate the columns\n// -------------------------\n.lay-column(@columns) {\n  @media (min-width: @grid-float-breakpoint) {\n    float: left;\n    // Calculate width based on number of columns available\n    width: percentage(@columns / @grid-columns);\n  }\n  // Prevent columns from collapsing when empty\n  min-height: 1px;\n  // Set inner padding as gutters instead of margin\n  padding-left:  (@grid-gutter-width / 2);\n  padding-right: (@grid-gutter-width / 2);\n}\n\n// Generate the column offsets\n// -------------------------\n.lay-column-offset(@columns) {\n  @media (min-width: @grid-float-breakpoint) {\n    margin-left: percentage((@columns / @grid-columns));\n  }\n}\n\n// Alpha background\n// -------------------------\n.alpha-background(@rgb:#000,@alpha:.5){\n  @rgba-color:fade(@rgb,@alpha*100);\n  @argb-color:argb(@rgba-color);\n  background-color:@rgba-color;\n  zoom:1;\n  :root &{\n    filter: none;\n  }\n}\n\n// Controls the selection model of an element.\n// -------------------------\n.user-select(@arguments:none){\n  -webkit-user-select: @arguments;\n  -moz-user-select: @arguments;\n  -ms-user-select: @arguments;\n  user-select: @arguments;\n}\n\n// Flexbox display\n// -------------------------\n// flex or inline-flex\n.flex-display(@display: flex) {\n  display: ~\"-webkit-@{display}\";\n  display: ~\"-moz-@{display}\";\n  display: @display;\n}\n\n// triangle\n// -------------------------\n.triangle(@direction: down, @size: 10px, @color: #000){\n  display: inline-block;\n  width: 0;\n  height: 0;\n  font-size: 0;\n  line-height: 0;\n  overflow: hidden;\n}\n.triangle(@direction: down, @size: 10px, @color: #000) when (@direction = down){\n  border-color: @color transparent transparent transparent;\n  border-style: solid dashed dashed dashed;\n  border-width: @size @size 0 @size;\n}\n.triangle(@direction: down, @size: 10px, @color: #000) when(@direction = left){\n  border-color: transparent @color transparent transparent;\n  border-style: dashed solid dashed dashed;\n  border-width: @size @size @size 0;\n}\n.triangle(@direction: down, @size: 10px, @color: #000) when(@direction = up){\n  border-color: transparent transparent @color transparent;\n  border-style: dashed dashed solid dashed;\n  border-width: 0 @size @size @size;\n}\n.triangle(@direction: down, @size: 10px, @color: #000) when(@direction = right){\n  border-color: transparent transparent transparent @color;\n  border-style: dashed dashed dashed solid;\n  border-width: @size 0 @size @size;\n}\n\n// triangle-double\n// -------------------------\n.triangle-double(@direction: down, @size: 10px, @color: #000, @borderColor: #c00){\n  position: absolute;\n  width: 0;\n  height: 0;\n  font-size: 0;\n  &:after{\n    content: '';\n    position: absolute;\n    width: 0;\n    height: 0;\n    font-size: 0;\n  }\n}\n.triangle-double(@direction: down, @size: 10px, @color: #fff, @borderColor: #ccc) when (@direction = down){\n  border-color: @borderColor transparent transparent transparent;\n  border-style: solid dashed dashed dashed;\n  border-width: @size @size 0 @size;\n  &:after{\n    left: -@size;\n    top: -(@size+1);\n    border-color: @color transparent transparent transparent;\n    border-style: solid dashed dashed dashed;\n    border-width: @size @size 0 @size;\n  }\n}\n.triangle-double(@direction: down, @size: 10px, @color: #fff, @borderColor: #ccc) when (@direction = left){\n  border-color: transparent @borderColor transparent transparent;\n  border-style: dashed solid dashed dashed;\n  border-width: @size @size @size 0;\n  &:after{\n    left: 1px;\n    top: -@size;\n    border-color: transparent @color transparent transparent;\n    border-style: dashed solid dashed dashed;\n    border-width: @size @size @size 0;\n  }\n}\n.triangle-double(@direction: down, @size: 10px, @color: #fff, @borderColor: #ccc) when (@direction = up){\n  border-color: transparent transparent @borderColor transparent;\n  border-style: dashed dashed solid dashed;\n  border-width: 0 @size @size @size;\n  &:after{\n    left: -@size;\n    top: 1px;\n    border-color: transparent transparent @color transparent;\n    border-style: dashed dashed solid dashed;\n    border-width: 0 @size @size @size;\n  }\n}\n.triangle-double(@direction: down, @size: 10px, @color: #fff, @borderColor: #ccc) when (@direction = right){\n  border-color: transparent transparent transparent @borderColor;\n  border-style: dashed dashed dashed solid;\n  border-width: @size 0 @size @size;\n  &:after{\n    left: -(@size+1);\n    top: -@size;\n    border-color: transparent transparent transparent @color;\n    border-style: dashed dashed dashed solid;\n    border-width: @size 0 @size @size;\n  }\n}\n"
  },
  {
    "path": "less/mobilemenu.less",
    "content": "#mobilemenu {\n  background: @bgcolor-home-footer;\n  min-height: 100vh;\n  position: relative;\n  font-weight: 300;\n  #mobileMenuCloseButton {\n    font-size: 32px;\n    font-weight: 600;\n    transform: rotate(45deg);\n    color: white;\n  }\n  div#menuContainer {\n    top: 10px;\n    bottom:10px;\n    left:0;\n    right:0;\n    display: flex;\n    flex-direction: column;\n    position:absolute;\n    -webkit-font-smoothing: subpixel-antialiased;\n    ul {\n      font-size: 20px;\n      flex: 0 0 50%;\n      li {\n        line-height: 2;\n        margin-bottom: 10px;\n        a {\n          color: #fff;\n          &:hover {\n            text-decoration: initial;\n          }\n        }\n      }\n    }\n    ul+div {\n      display: flex;\n      flex: 0 0 50%;\n      justify-content: center;\n      align-items: center;\n      align-content: center;\n      text-align: center;\n      a {\n        padding: 20px;\n      }\n    }\n  }\n} // /#mobileMenu"
  },
  {
    "path": "less/modals.less",
    "content": "@color-placeholder: \t#414857;\n\n.bootbox.modal, .bootbox.modal:before {\n    display: block;\n    position: fixed;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n}\n\n.bootbox.modal:before {\n    background-color: darken(rgba(61,67,83,0.8), 50%);;\n    content: '';\n}\n.modal.wide .modal-dialog {\n  width: 800px;\n}\n\n.modal.wideauto .modal-dialog {\n  width: 90%;\n}\n\n.modal.popupEmbed .modal-dialog {\n  width: 700px;\n  .modal-content {}\n  .modal-body {\n\tpadding:30px;\n  }\n}\n\n.modal-dialog {\n    width: 400px;\n\n    &.file-select-dialog {\n    \twidth: 600px;\n    }\n    border-radius: 0;\n    margin: (@menu-bar-height + @breadcrumb-height + 30) auto 0 auto;\n    .button {\n        box-shadow: 0 0 0 rgba(0,0,0,0)!important;\n    }\n    input {\n        box-shadow: 0 0 0 rgba(0,0,0,0)!important;\n        outline: none!important;\n    }\n    button.bootbox-close-button {\n        display: block;\n        position: absolute;\n        width: 36px;\n        height: 36px;\n        padding: 0;\n        border: 0 none;\n        background: transparent;\n        opacity: 1;\n        svg {\n            display: block;\n            position: absolute;\n            width: 16px;\n            height: 16px;\n            margin: -8px 0 0 -8px;\n            left: 50%;\n            top: 50%;\n            fill: #bccbe4;\n        }\n        &:hover svg {\n            fill: #ffffff;\n        }\n    }\n    .modal-content {\n            border-radius: 4px;\n            box-shadow: 0 0 2px rgba(0,0,0,0.22);\n            background: transparent;\n            position: relative;\n            width: 100%;\n            > div {\n                display: block;\n                position: relative;\n\t\t\t  \tborder-top:1px solid transparent; // safari\n                width: 100%;\n            }\n            .modal-header {\n                background: @bg-dark;\n                height: 60px;\n                border: 0 none;\n                text-align: center;\n                padding: 0;\n                > h4 {\n                    padding: 20px 20px 0 20px;\n                    color: #bccbe4;\n                    font-size: 22px;\n                    font-weight: 300;\n                    margin: 0;\n                    line-height: 1;\n                }\n            }\n            .modal-body {\n                background: @bg-light;\n                padding: 22px 24px 18px;\n                box-sizing: border-box;\n                font-size: 14px;\n                color: #fff;\n                font-weight: 300;\n\t\t\t\ta, a:active {\n\t\t\t\t\tcolor: @bg-bright;\n\t\t\t\t\ttext-decoration: none;\n\t\t\t\t\t&:hover {\n\t\t\t\t\t\tcolor: @editor-text-active;\n\t\t\t\t\t\ttext-decoration: none;\n\t\t\t\t\t}\n\t\t\t\t}\n                .bootbox-body {\n                    padding: 0;\n                    text-align: center;\n                }\n                h4 {\n                    font-size: 14px;\n                    color: @editor-text-active;\n                    padding: 10px 0;\n                }\n\t\t\t  \tfieldset {margin-bottom:1em;}\n                div.form-input {\n                    width: 100%;\n                    border-radius: 4px;\n                    margin: 0 auto 5px;\n                    position: relative;\n                    text-align: left;\n                    &.error input {\n                        border: 1px solid @editor-text-hover;\n                    }\n\t\t\t\t  \t>input, >label {padding: 10px 20px;}\n                    >input {\n\t\t\t\t\t  \tbackground: rgba(0,0,0,0.3);\n\t\t\t\t\t  \twidth: 100%;\n\t\t\t\t\t\tborder: 1px solid transparent;\n\t\t\t\t\t  \tborder-radius: 3px;\n                        font-size: 16px;\n                        line-height: 1.33;\n                        font-weight: 300;\n                        color: @editor-text-active;\n\t\t\t\t\t  \tz-index: 1;\n                    }\n\t\t\t\t\t::-webkit-input-placeholder {\n\t\t\t\t\t   color: lighten(@color-placeholder, 10%);\n\t\t\t\t\t}\n\t\t\t\t\t::-moz-placeholder {\n\t\t\t\t\t   color: lighten(@color-placeholder, 10%);\n\t\t\t\t\t}\n\t\t\t\t  \t.in_focus::-webkit-input-placeholder {\n\t\t\t\t\t   color: darken(@color-placeholder, 5%);\n\t\t\t\t\t}\n\t\t\t\t\t.in_focus::-moz-placeholder {\n\t\t\t\t\t   color: darken(@color-placeholder, 5%);\n\t\t\t\t\t}\n                    >label {\n\t\t\t\t\t  \tdisplay:none; // modals only!\n                        color: #414857;\n                        font-size: 16px;\n                        font-weight: 400;\n\t\t\t\t\t  \tfloat:left;\n\t\t\t\t\t  \tposition:absolute;\n\t\t\t\t\t  \ttop:0;\n\t\t\t\t\t  \tz-index: 0;\n                    }\n\t\t\t\t  \t>span.message {\n\t\t\t\t\t  clear: left;\n\t\t\t\t\t  display: block;\n\t\t\t\t\t  text-align: right;\n\t\t\t\t\t  color: #fff;\n\t\t\t\t\t  padding-top:2px;\n\t\t\t\t\t  font-size: 85%;\n\t\t\t\t\t}\n\t\t\t\t\t>span.message:after {\n\t\t\t\t\t  content: \".\"; color: rgba(0,0,0,0);\t\t// prevent from collapsing\n\t\t\t\t\t}\n\t\t\t\t  \t&.error>span.message {\n\t\t\t\t\t  color: #ff6868;\n\t\t\t\t\t}\n                }\n                div.modal-error {\n\t\t\t\t    display: none;\n                    span {\n                        color: #ff6868;\n                        display: block;\n                        width: 100%;\n                        height: 16px;\n                        font-size: 12px;\n                    }\n                    &#general-error span {\n                        text-align: center;\n                    }\n                    &.revealError {\n                        display: block;\n                        height: 16px;\n                        animation: revealModalError 0.35s ease-out;\n                    }\n                    &.hideError {\n                        display: block;\n                        height: 0;\n                        animation: hideModalError 0.35s ease-in;\n                    }\n                }\n                button {\n                  \tposition: relative;\n                    border-radius: 4px;\n                    background: darken(@bg-bright, 5%);\n                }\n                button.sign-btn {\n                    width: 100%;\n                    height: @modal-control-height;\n                    color: @editor-text-default;\n                    border: 0 none;\n                    padding: 0;\n                    span {\n                        display: block;\n                        position: relative;\n                        padding: 15px 20px 0 22px;\n                        height: @modal-control-height;\n                        font-size: 16px;\n                        float: left;\n                        color: @editor-text-active;\n                    }\n                    svg {\n                        width: 24px;\n                        height: 24px;\n                        position: absolute;\n                        right: 22px;\n                        top: 50%;\n                        margin: -12px 0 0;\n                        stroke: @editor-text-active;\n                    }\n                    &.disabled {\n                        background: #515c75;\n                    }\n\t\t\t\t\t&:hover {\n\t\t\t\t\t  background: @bg-bright;\n\t\t\t\t\t}\n                }\n            }\n            .modal-footer {\n                background: @bg-dark;\n                border: 0 none;\n                text-align: center;\n                padding: 20px 40px;\n                box-sizing: border-box;\n\t\t\t  \tcolor: @editor-text-hover;\n\t\t\t  \tfont-size: 12px;\n\t\t\t  \tfont-weight: 400;\n                span, p {\n                    padding: 0;\n                    margin: 0;\n                    display: block;\n                    a, a:active {\n                        color: #2d93c9;\n                        text-decoration: none;\n                        &:hover {\n                            color: @editor-text-active;\n                            text-decoration: none;\n                        }\n                    }\n                }\n                p {\n                    padding: 0 0 8px 0;\n                    text-align: center;\n                    &:last-child {\n                        padding: 0;\n                    }\n                }\n                button.btn {\n                    border-radius: 4px;\n                    background: @bg-bright;\n                    border: 0 none;\n                    font-size: 16px;\n                    color: #ffffff;\n                    padding: 8px 12px;\n                    &:hover {\n                        border: 0 none;\n                        color: @editor-text-active;\n                    }\n                }\n            }\n            \n    }\n    &.patch-inspector {\n        .modal-header {\n            text-align: left;\n            background: @bg-light;\n            border-bottom: 1px solid @bg-darker;\n            min-height: 60px;\n            height: auto;\n            h4 {\n                color: @editor-text-default;\n                font-weight: 600;\n                font-size: 16px;\n                padding: 20px 18px;\n            }\n            button.bootbox-close-button {\n                top: 28px;\n                svg {\n                     fill: @editor-text-default;\n                }\n            }\n            ul {\n                display: table;\n                position: relative;\n                padding: 0;\n                margin: 0 auto;\n                float: left;\n                height: 35px;\n                li {\n                    display: table-cell;\n                    position: relative;\n                    text-align: center;\n                    vertical-align: center;\n                    height: 35px;\n                    border-top: 1px solid @bg-darker;\n                    border-right: 1px solid @bg-darker;\n                    &:last-child {\n                        border-right: 0;\n                    }\n                    a, a:active {\n                        display: block;\n                        font-weight: 600;\n                        height: 35px;\n                        font-size: 14px;\n                        text-transform: uppercase;\n                        text-decoration: none;\n                        color: @editor-text-default;\n                        outline: none;\n                        padding: 8px 0 0;\n                        &:hover {\n                            color: @editor-text-hover;\n                            text-decoration: none;\n                        }\n                    }\n                    &.active {\n                        background: @bg-lighter;\n                        a, a:active, a:hover {\n                            color: @editor-text-default;\n                            text-decoration: none;\n                        }\n                    }\n                }\n            }\n        }\n        .modal-body {\n            padding: 30px 16px;\n            input[type=checkbox] {\n                display: none;\n            }\n            input[type=checkbox] + label {\n                font-size: 14px;\n                font-weight: 400;\n                color: @editor-text-default;\n                cursor: pointer;\n            }\n            input[type=checkbox] + label span {\n                display: inline-block;\n                border: 0 none;\n                border-radius: 2px;\n                background: #394055;\n                height: 14px;\n                width: 14px;\n                margin: 3px 10px 0 0;\n                position: relative;\n                float: left;\n                svg {\n                    display: none;\n                    height: 14px;\n                    width: 14px;\n                    float: left;\n                }\n            }\n            input[type=checkbox]:checked + label span {\n                background: #6b748f;\n                svg {\n                    display: block;\n                }\n            }\n        }\n        .modal-footer {\n            background: @bg-light;\n            border-top: 1px solid @bg-darker;\n            padding: 20px 16px;\n            button.btn {\n                height: 28px;\n                min-width: 100px;\n                background: #1e222c;\n                color: @editor-text-default;\n                padding: 0;\n                font-size: 12px;\n                font-weight: 400;\n                float: left;\n                &:last-child {\n                    float: right;\n                }\n                &:first-child {\n                    float: left;\n                }\n                &.btn-primary {\n                    float: right;\n                }\n            }\n        }\n    }\n}\n.bootbox.modal.nopad {\n  .modal-content, .modal-body {padding:0;}\n  .modal-body form {\n\tmargin: 18px 26px;\n  }\n  .modal-body p.left {text-align: left;}\n  .modal-body>p {\n\tmargin-left: 40px; margin-right: 40px;\n  }\n  .modal-body .bootbox-body {\n\tp:only-child {\n\t  margin: 20px 40px;\n\t}\n  }\n}\n\n.modal.login {\n  button.close {\n\ttop: 12px;\n\tright: 2px;\n  }\n  h3:first-child {\n\tbackground: rgba(0,0,0,0.2);\n\tmargin: 0;\n\tpadding: 18px;\n  }\n  div.modal-footer {\n\tbackground: rgba(0,0,0,0.2);\n\tfont-size: 12px;\n\tfont-weight: 500;\n  }\n}\n\ndiv.bootbox.modal {\n  .modal-header, .modal-content {\t// necessary for selector weight\n\tbutton.bootbox-close-button {\n\t\tbackground: transparent;\n\t  \tcolor:#ccc;\n\t  \tfont-weight: 100;\n\t\tfloat: none;\n\t\tposition: absolute;\n\t\ttop: 9px;\n\t  \tright: 2px;\n\t\tmargin: 0;\n\t}\n  }\n}\n\n.modal-dialog .file-select-control {\n    border: 0;\n    float: left;\n    padding: 20px 0 0;\n    width: 100%;\n    .tab-content {\n        display: block;\n        position: relative;\n        float: left;\n        width: 100%;\n        padding: 0;\n        border: 0;\n    }\n    ul.nav-tabs {\n        display: table;\n        position: relative;\n        float: left;\n        width: 100%;\n        height: 32px;\n        margin: 0;\n        padding: 0;\n        border-bottom: 1px solid @bg-darker;\n        border-left: 1px solid @bg-darker;\n        > li {\n            display: table-cell;\n            position: relative;\n            text-align: center;\n            vertical-align: middle;\n            float: none;\n            height: 32px;\n            background: @bg-light;\n            border-right: 1px solid @bg-darker;\n            border-top: 1px solid @bg-darker;\n            :last-child {\n                border: 0;    \n            }\n            a {\n                padding-top: 8px; \n                height: 32px;\n                outline: none;\n                color: @tab-text-inactive;\n                font-size: 12px;\n                font-weight: 600;\n                display: block;\n                border-radius: 0;\n                h4 {\n                    margin: 0;\n                    padding: 0;\n                    color: @tab-text-inactive;\n                    line-height: 1.33;\n                    font-weight: 600;\n                }\n            }\n            a:active, a:focus {\n                text-decoration: none;\n                }\n            &:hover a {\n                background: none;\n            }\n        }\n        > li.active {\n                background: @bg-lighter;\n                a {\n                    color: @editor-text-active;\n                    background: none;\n                    h4 {\n                        color: @editor-text-active;\n                    }\n                }\n        }\n        > li.active:hover {\n                a {\n                    text-decoration: none; \n                }\n        }\n        > li:hover {\n                a {\n                    text-decoration: none; \n                    color: @editor-text-active;\n                    h4 {\n                        color: @editor-text-active;\n                    }\n                }\n        }\n    }\n}\n\n.modal-dialog tr#buttons-row {\n    td {\n        vertical-align: middle;\n        button {\n            height: @searchbox-height;\n            padding: 0 8px;\n        }\n    }\n}\n\n.modal-dialog .fileUploadForm {\n    margin: 10px 0;\n    width: 100%;\n    > input, > button {\n        float: left;\n        display: table-cell;\n    }\n    > .browse-button {\n        margin: 0;\n        width: 25%;\n        &:hover {\n            color: @editor-text-default;\n        }\n    }\n    > #fileUploadName {\n        width: 46%;\n        margin: 0 2%;\n        background: @bg-dark;\n        color: @editor-text-default;\n    }\n    .btn-primary {\n        height: @searchbox-height;\n        background: @bg-bright;\n        color: @editor-text-active;\n        &:hover {\n            color: @editor-text-default;\n        }\n    }\n    #fileUploadFile {\n        display: none;\n    }\n}\n\n.userpage-dialog {\n    .modal-content {\n        .modal-body {\n            background: #ffffff;\n            div.form-input {\n                background: #f6f7f8;\n                input, label {\n                    color: #535c6b;\n                }\n                label:after {\n                    display: none;\n                }\n            }\n            div.form-select {\n                .icon-arrow-down {\n                    height: 7px;\n                    width: 10px;\n                    position: absolute;\n                    right: 20px;\n                    top: 22px;\n                    stroke: #535c6b;\n                    left: auto;\n                    z-index: 97;\n                }\n                input {\n                    display: none;\n                }\n                label {\n                    cursor: pointer;\n                    z-index: 98;\n                }\n                ul {\n                    position: relative;\n                    width: 100%;\n                    height: @modal-input-height;;\n                    margin-top: @modal-input-height;\n                    li {\n                        width: 100%;\n                        float: left;\n                        position: relative;\n                        height: @modal-input-height;\n                        background: #f6f7f8;\n                        color: #535c6b;\n                        padding: 15px 20px 0 22px;\n                        cursor: pointer;\n                        font-size: 16px;\n                        font-weight: 400;\n                        border-top: 1px solid #fff;\n                        &:hover {\n                            background: @bg-bright;\n                            color: @editor-text-active;\n                        }\n                        &:last-child {\n                            border-radius: 0 0 4px 4px;\n                        }\n                    }\n                }\n                &.active {\n                    overflow: visible;\n                    .icon-arrow-down {\n                        transform: rotate(180deg);\n                    }\n                }\n            }\n            button.user-btn {\n                width: 100%;\n                height: @modal-control-height;\n                border: 0 none;\n                padding: 0;\n                color: @editor-text-active;\n                font-size: 16px;\n                text-transform: uppercase;\n                font-weight: 600;\n                text-align: center;\n            }\n        }\n    }\n}\n\n@keyframes revealModalError {\n    0% {\n        height: 0;\n    }\n    100% {\n        height: 16px;\n    }\n}\n\n@keyframes hideModalError {\n    0% {\n        height: 16px;\n    }\n    100% {\n        height: 0;\n    }\n}\n\n\n\n// welcome slides\n\n@modal-welcome-width: 588px;\n@modal-welcome-height: 440px;\n@modal-welcome-transition-length: 0.4s;\n@modal-welcome-background: #2d4b77;\n\n.modal-intro-tight {\n\tmargin:0;\n\tpadding:0;\n\tborder-radius: 5px 5px;\n}\n.modal-intro-dimensions {\n  width: @modal-welcome-width;\n  height: @modal-welcome-height;\n}\n\n.modal .launch-button {\n  .launch-button-macro;\n}\n\n\ndiv#helpscreen.bootbox.modal .modal-dialog {\n    width: 716px;\n    height: 485px;\n}\ndiv#helpscreen.bootbox.modal .modal-content {\n    border: 0;\n\n    button.bootbox-close-button {\n        top: -4px;\n        right: -34px;\n\n        svg {\n            width: 20px;\n            height: 20px;\n            stroke-width: 3px !important;\n        }\n    }\n    .modal-body {\n        padding: 0;\n        border: 0;\n        background: #f2f2f2;\n    }\n    .bootbox-body {\n        //background: #f2f2f2;\n    }\n}\n\n#helpContainer {\n\n    background: #f2f2f2;\n    .noselect_all;\n    nav {\n        background: #181c2a;\n        display: flex;\n        a {\n            color: @editor-text-inactive;\n            flex: 1;\n            font: 500 12px/42px 'Source Sans Pro', 'Source Sans', sans-serif;\n            text-transform: uppercase;\n            letter-spacing: 1.5px;\n            &[data-active='true'] {\n                color: @editor-text-hover;\n                background: #272E47;\n            }\n            &:hover {\n                color: white;\n            }\n        }\n        a+a {\n            border-left: 1px solid transparent;\n        }\n        a:not([data-active])+a:not([data-active]) {\n            border-left: 1px solid rgba(255,255,255,0.1);\n        }\n    }\n    @keyframes loadflash {\n        to { color: #fff; }\n    }\n    section {\n        margin: 5px 10px;\n        flex-wrap: wrap;\n        justify-content: space-around;\n        padding: 5px 10px;\n        background: #f2f2f2;\n        height: 420px;\n        &.loading {\n            position: relative;\n            >* {\n                opacity: 0.5;\n            }\n            &:after {\n                .center-neg-margin(120px,40px);\n                line-height: 40px;\n                border-radius: 4px;\n                content: \"Loading...\";\n                background: #272e47;\n                color: #AFBFDF;\n                display: block;\n                letter-spacing: 0.5px;\n                animation: loadflash 0.3s infinite alternate;\n            }\n        }\n        &#helpRecent, &#helpTemplates, &#helpExamples {\n            .scrollbar;\n\n            &::-webkit-scrollbar-track-piece {\n                background: white;\n            }\n            &::-webkit-scrollbar-thumb {\n                background: rgba(0,0,0,0.3);\n            }\n            max-height: 420px;\n            overflow-y: auto;\n\n            .graph.card .meta .user {display: none}\n        }\n    }\n\n    #helpExamples {\n        .graph.card {\n            a.avatar {\n                display: none;\n            }\n            div.meta h4 {\n                margin: 5px 0 0 0;\n                line-height: 1.3;\n            }\n        }\n    }\n    .graph.card {\n        margin: 10px 0;\n        width: 200px;\n        height:185px;\n        .mainaction.open {display: none}\n        .image {\n            height: 130px;\n            background-position: 0 0;\n            background-size: cover;\n            background-repeat: no-repeat;\n        }\n        div.meta {\n            top: 130px;\n            height:55px;\n            padding: 5px 15px;\n            h4 {\n                margin: 0;\n                padding-top: 0;\n                padding-bottom: 0;\n                text-align: left;\n                font-weight: 400;\n                color: #444;\n            }\n            a {\n                color: #454545;\n                &:hover {\n                    color: @brand-primary;\n                }\n            }\n        }\n    }\n    #helpLinks {\n        h2 {\n            width:100%;\n        }\n        a.svg {\n            display: block;\n            position:relative;\n            width: 200px;\n            height: 185px;\n            margin: 10px 0;\n            flex-grow: 0;\n            color: white;\n            border-radius: 4px;\n            background-size: 100%;\n            background-position: center center;\n            transition: background-size 0.1s linear;\n            font-size: 13px;\n            font-weight: 500;\n            &::before {\n                z-index: 1;\n                content: \" \";\n                display: block;\n                position: absolute;\n                top: 0;\n                bottom: 0;\n                left: 0;\n                right: 0;\n                border-radius: 4px;\n                background: transparent;\n                background-image: radial-gradient(circle, rgba(0,0,0,0.6), rgba(0,0,0,0.5));\n                transition: opacity 0.1s linear;\n                opacity:0.75;\n            }\n            &:hover::before {\n                opacity: 1;\n            }\n            &:hover {\n                background-size: 110%;\n            }\n\n            img, svg, span {\n                position: absolute;\n            }\n            svg {\n                z-index: 2;\n\n                width: 100px;\n                height: 100px;\n\n                left:50%;\n                top:50%;\n                margin-left: -50px;\n                margin-top: -50px;\n            }\n            span {\n                z-index: 3;\n                left: 0;\n                right: 0;\n                top: 118px;\n                display: block;\n                text-align: center;\n            }\n        }\n    }\n}"
  },
  {
    "path": "less/notifications.less",
    "content": ".notificationAnimationIn () {\n\t  0% { opacity: 0; right: 0 - @msg-width - 30; \theight: 0; \t\t\t\t\tmargin-bottom: 0px;}\n     30% { opacity: 0; right: 0 - @msg-width - 30; \theight: @msg-min-height; \tmargin-bottom: 10px;}\n    100% { opacity: 1; right: 0; \t\t\t\t\theight: @msg-min-height; \tmargin-bottom: 10px;}\n}\n.notificationAnimationOut () {\n      0% { opacity: 1; right: 0; \t\t\t\t\theight: @msg-min-height; \tmargin-bottom: 10px;}\n     70% { opacity: 0; right: 0 - @msg-width - 30; \theight: @msg-min-height; \tmargin-bottom: 10px;}\n\t100% { opacity: 0; right: 0 - @msg-width - 30; \theight: 0; \t\t\t\t\tmargin-bottom: 0px;}\n}\n// ff,chrome won't play animations in reverse. (?)\n@-webkit-keyframes notification-appear { .notificationAnimationIn(); }\t\t// safari pre-9\n@-webkit-keyframes notification-disappear { .notificationAnimationOut(); }\n@keyframes notification-appear { .notificationAnimationIn(); }\n@keyframes notification-disappear { .notificationAnimationOut(); }\n\n#notifications-area {\n    display: block;\n    position: fixed;\n    right: 0;\n    top: 0;\n    width: @msg-width + 30;\n    overflow: hidden;\n    padding-top: 30px;\n    z-index: 1000;\n}\n#notifications-area .notification {\n    width: @msg-width;\n    background: @msg-text-bg;\n    border-radius: 4px;\n    box-shadow: 0 2px 2px rgba(0,0,0,0.22);\n    overflow: hidden;\n    position: relative;\n   -webkit-animation: notification-appear 0.4s ease-in-out 1;\n  \tanimation: notification-appear 0.4s ease-in-out 1;\n  \tmargin-bottom: 10px;\n}\n\n\n#notifications-area .notification-hide {\n   -webkit-animation: notification-disappear 0.6s ease-in-out 1;\n  \tanimation: notification-disappear 0.6s ease-in-out 1;\n  \topacity: 0;\n  \theight: 0;\n    right: 0 - @msg-width - 30;\n  \tmargin-bottom: 0px;\n}\n\n.nt-content {\n    width: @msg-width;\n    min-height: @msg-min-height;\n    height: @msg-min-height;\n    display: table;\n    background: none;\n    padding: 0;\n    max-width: @msg-width; \n}\n\n.nt-content .text {\n    display: table-cell;\n    vertical-align: middle;\n    text-align: left;\n}\n.nt-content .text span {\n    display: block;\n    margin: 14px 16px;\n    font-size: 14px;\n    line-height: 18px;\n    color: @msg-text-color;\n    font-weight: 400;\n    background: none;\n    padding: 0;\n    border-radius: 0;\n    text-align: left;\n}\n\n.nt-content .glyph {\n    display: table-cell;\n    position: relative;\n    vertical-align: middle;\n    text-align: left;\n    width: @msg-min-height;\n    min-height: @msg-min-height;\n    height: 100%;\n    background-color: @msg-glyph-bg;\n}\n\n.nt-content .glyph svg {\n    width: @msg-min-height;\n    height: @msg-min-height;\n    position: absolute; \n    display: block;\n    left: 50%;\n    top: 50%;\n    margin-top: -35px;\n    margin-left: -35px;\n}\n\n\n.nt-content .glyph .image-crop {\n    background-size: cover;\n    background-position: center center;\n    width: 30px;\n    height: 30px;\n    border-radius: 100%; \n    position: absolute;\n    left: 50%;\n    top: 50%;\n    margin-top: -15px;\n    margin-left: -15px;\n    text-align: center;\n}\n\n.nt-content .glyph .image-crop span {\n    display: block;\n    color: #fff;\n    font-weight: 400;\n    font-size: 20px;\n    margin: 0 auto; \n}"
  },
  {
    "path": "less/people.less",
    "content": "#peopleTab {\n  background: @bg-light;\n  position: relative;\n  color: @editor-text-hover;\n  width: @floating-box-width;\n  height: @chat-height - @blocks-header-height;\n  >.meta, >.peopleList {\n\tposition: absolute;\n\tleft: 0;\n\tright: 0;\n  }\n  .meta {\n    padding: 10px 20px;\n\ttop: 0;\n\theight: @chat-nav-height;\n\tborder-bottom: 1px solid @bg-darker;\n  }\n  .peopleList {\n    overflow-y: auto;\n\toverflow-x: hidden;\n\ttop: @chat-nav-height;\n\tbottom: 0;\n  }\n}\n\n.graph-users {\n    padding: 0;\n    margin: 0;\n}\n.graph-users li {\n    height: 60px;\n    border-top: 1px solid @bg-darker;\n    padding: 12px 20px;\n    position: relative;\n    width: @floating-box-width;\n    box-sizing: border-box;\n}\n.graph-users li .icon {\n\tbackground-image: url('/images/alpha_chat_icon.png');\n\tbackground-position: center center;\n\tmargin: 0 14px 9px 0;\n\twidth: 34px;\n\theight: 34px;\n\tbackground-color: gray;\n\tborder-radius: 3px;\n\tfloat: left;\n}\n.graph-users li .user-info {\n    float: left;\n    height: 32px;\n    position: relative;\n    width: @chat-width - 34 - 40 - 14;\n    line-height: 1;\n}\n.graph-users li .user-info .name {\n    font-weight: 700;  \n    font-size: 14px;\n    color: @editor-text-hover;\n    display: block;\n    width: 100%;\n}\n\n.graph-users li .user-info .info {\n    font-weight: 300;    \n    font-size: 12px;\n    color: @editor-text-hover;\n    display: block;\n    width: 100%;\n}\n.graph-users li button {\n    background: none;\n    border: 0;\n    position: relative;\n    text-align: center;\n    color: @editor-text-default;\n    width: 42px;\n    height: 36px;\n    position: absolute;\n    top: 8px;\n    background: @bg-light;\n    padding: 0;\n    display: none;\n}\n\n.graph-users li:hover button {\n    display: block;\n}\n\n.graph-users li button.follow-state {\n    right: 52px    \n}\n.graph-users li button.kick-user {\n    right: 10px    \n}\n.graph-users li button svg {\n    height: 26px;\n    width: 26px;\n    display: block;\n    position: absolute;\n    top: 0;\n    left: 50%;\n    margin: 0 0 0 -13px;\n    stroke: @editor-text-default;\n}\n.graph-users li button span {\n    display: block;\n    width: 100%;\n    height: 12px;\n    font-size: 12px;\n    margin-top: 26px;\n}\n.graph-users li button:hover svg {\n    stroke: #ffffff;    \n}\n\n.graph-users li button:hover span {\n    color: #ffffff;\n}\n\n.graph-users li .user-info .info {\n    line-height: 2;    \n}\n\n.remote-mouse-pointer {\n\tposition: absolute;\n\tbackground-color: #fff;\n\tborder-radius: 7px;\n\tz-index: 99;\n\twidth: 14px;\n\theight: 14px;\n\tmargin: -7px 0 0 -7px;\n\tpointer-events: none;\n\ttransition: all .05s ease-out;\n\topacity: 0.75;\n}\n\n.remote-mouse-pointer.inactive {\n\topacity: 0.25;\n\ttransition: all 1s ease-in-out;\n}\n\n.remote-mouse-pointer.outside {\n\topacity: 0.5 !important;\n\twidth: 24px;\n\theight: 24px;\n\tmargin-left: -12px;\n\tmargin-top: -12px;\n\tborder-radius: 16px;\n\t-webkit-filter: blur(6px);\n\t-moz-filter: blur(6px);\n\t-o-filter: blur(6px);\n\t-ms-filter: blur(6px);\n\tfilter: blur(6px);\n}\n\n.remote-mouse-pointer.clicked {\n\ttransform: scale(2.0);\n\topacity: 1.0;\n}\n\n.peopleList li button.followed {\n\tbackground-color: @brand-success;\n}\n\n.peopleList span.small {\n\tfont-size: 1em;\n}\n\n.peopleList div.peopleRow {\n\tdisplay: table-row;\n}\n\n\n"
  },
  {
    "path": "less/playerpage.less",
    "content": "@bgcolor-progress-incomplete: rgba(255,255,255,1);\n@bgcolor-progress-complete: rgba(255,255,255,0.5);\n@bgcolor-progress-bar: rgba(32,32,32,0.5);\n@bgcolor-graph-heading: rgba(0,0,0,0.1);\n@color-graph-heading: #fff;\n@color-graph-buttons: #ddd;\n\n.webvr-polyfill-viewer-selector {\n  position: absolute;\n  left: 0;\n  top: 0;\n  right: 0;\n  bottom: 0;\n  z-index: 10010;\t// above canvas\n  width: 100%;\n  height: 100%;\n}\n\nbody.bPlayer header {\n  pointer-events: none;\n  >div {\n\tpointer-events: initial;\n  }\n}\nbody.bPlayer, body.b360 {\n\n  .modal {\n\t-webkit-font-smoothing: subpixel-antialiased;\n  }\n  .modal.viewinvr .modal-dialog {\n\tmargin: 15% auto;\n  }\n\n  .modal.viewinvr .bootbox-body {\n\tfont-family: @font-family-sans-serif;\n\tfont-size: 140%;\n\tpadding: 20px;\n\tp:first-child {\n\t  margin-top:0;padding-top:0;\n\t  font-weight: 500;\n\t}\n\ta {\n\t  color: white;\n\t  padding: 5px 10px;\n\t  border-radius: 5px;\n\t}\n  }\n}\nbody.bPlayer {\n\n  height:100%; width:100%;\n\n  #playerpage {\n\tposition: fixed;\n\ttop:0;\n\tleft:0;\n\tbottom:0;\n\tright:0;\n\theight: 100%;\n  }\n  &.assetsLoaded .loadingonly {display: none}\n  &.playing .noplaying,\n  &.paused .nopaused,\n  &.stopped .nopaused,\n  &.autoplay:not(.stopped) .noautoplay\n  {display: none}\n\n  #playButton.btn {\n\tsvg {\n\t  display: none;\n\t}\n\tbackground: none;\n\tborder-radius: 4px;\n\tborder: 1px solid white;\n\ttext-transform: uppercase;\n\tfont-size: 14px;\n\tcolor: white;\n\tletter-spacing: 0.2ex;\n\tpadding-left: 20px;\n\tpadding-right: 20px;\n  }\n\n\n  #playerWrap {\n\t#loadingStage {\n\t  svg {\n\t\tposition: absolute;\n\t\ttop: 25%;\n\t\tleft: 50%;\n\t\tmargin-left: -50px;\n\t\tmargin-top: -50px;\n\t  }\n\t}\n  }\n\n}\n\nbody.inVR #playerpage header {\n  display: none !important;\n}\n\nbutton#backfromvr {\n  -webkit-appearance: none;\n  appearance: none;\n  padding: 10px 20px;\n  border-radius: 5px;\n  border: 0;\n  background: rgba(1,1,1,0.3);\n  &:active {\n\tbackground: rgba(255,255,255,0.2);\n  }\n}\n\nbody.b360 #playerpage {\n  &div> * { border:0; margin: 0; padding:0;}\n}\n\n#playerpage {\n  min-height: 100%;\n\n  #playerWrap {\n\t  position: fixed;\n\t  top:0;\n\t  bottom:0;\n\t  left: 0;\n\t  right:0;\n\t  display: flex;\n\t  flex-direction: column;\n\t  height: 100%;\n\t  display: -webkit-flex;\n\t  -webkit-flex-direction: column;\n  }\n\n  #playingStage, #playerWrap .stage {\n\t  -webkit-flex: 1;\n\t  -webkit-flex-order: 2;\n\t  flex:1;\n\t  order: 2;\n\t  min-height: 100px;\t// allow _some_ height at all\n  }\n  #playerWrap .stage {\n\tdisplay: none;\n\tposition: relative;\n\t&.front {\t// selected stage\n\t  display: block\n\t}\n  }\n\n  .noWebGL {\n  \tmargin: 100px auto 0 auto;\n\twidth: 400px;\n\tsvg {\n\t  margin-left: -5px;\n\t}\n\tline-height: 1.5em;\n\tfont-size: 110%;\n  }\n}\n\nbody.bPlayer.paused header,\nbody.bPlayer.stopped header\n{\n  h2#graph_heading, div.controls button, div.controls a.btn {\n\ttext-align: center;\n\tmargin: 0 auto;\n  }\n}\n\nbody.b360 #playerpage header div.controls {\n  -webkit-justify-content: flex-end;\n  justify-content: flex-end;;\n}\n\n#playerpage header {\n\n\t-webkit-flex: 0 1 auto;\n\t-webkit-flex-order: 1;\n\tflex: 0 1 auto;\n\torder: 1;\n\n  position: fixed;\n\n\n  top: 0;\n  left: 0;\n  bottom: 0;\n  right: 0;\n  background: rgba(0,0,0,0.3);\n\n  z-index: 30;\n\n  &> * { border:0; margin: 0; padding:0;}\n\n  a {border:0; margin:0; padding:0;}\n\n  #logo_h {\n\tfloat:left;\n\tspan {display:none;}\n\tspan#load_spinner {\n\t  float:left;\n\t  display: block;\n\t  visibility: hidden;\n\t  height:30px; width:30px;\n\t  margin:13px 2px 0 5px;\n\t}\n  }\n  .controls {\n\tmargin-top: 15px;\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n\n\t-webkit-justify-content: center;\n\tjustify-content: center;\n\n\t-webkit-align-items: center;\n\talign-items: center;\n  }\n\n  button.svg, a.btn.svg {\n\tcursor: hand ! important;\n\tcursor: pointer ! important;\n\tbackground: none;\n\theight: 50px; /* includes padding */\n\twidth: 50px;\n\tpadding: 5px;\n\tmargin: 5px 10px;\n\tborder: 0;\n\toutline: none;\n\tborder-radius: 5px;\n\tsvg {\n\t  width: 40px;\n\t  height: 40px;\n\t  vertical-align: middle;\n\t  stroke: @color-graph-buttons;\n\t  fill: none;\n\t  display: block;\n\t}\n\t> span {\n\t  display: none;\n\t}\n  }\n\n  #graph_heading {\n\tpadding-bottom: 5px;\n\tmargin-bottom: 10px;\n\tfont-size: 10.5pt;\n\tfont-weight: 500;\n\tcolor: @color-graph-heading;\n\ttext-align: center;\n\ta {color: @color-graph-heading;}\n\tposition: relative;\n\tsvg {\n\t  height: 2ex; width: 2ex;\n\t  margin-right: 5px;\n\t  margin-left: 0ex;\n\t  vertical-align: -12.5%;\n\t  stroke: none;\n\t  fill:@color-graph-heading;\n\t}\n\t>* {vertical-align: middle; }\n  }\n}\n\ndiv.nojs, div.nowebgl {\n  font-size: 130%;\n  width: 600px;\n  margin: 100px auto;\n}\n\nbody:not(.b360) #progressbar {\n  margin: 10px 0;\n}\n\n#progressbar {\n  -webkit-appearance: none;\n  appearance: none;\n  display: block;\n  height: 2px;\n  width: 100%;\n  opacity: 0.75;\n  transition: background-color 1s;\n  border: 0;\n  &::-webkit-progress-value {\n\tposition:relative;\n\ttop:-1px;\n\theight: 4px;\n\tbackground-color:@bgcolor-progress-incomplete;\n\ttransition: background-color 1s;\n\tborder-radius: 2px;\n  }\n  &::-moz-progress-bar {\n\tbackground-color: @bgcolor-progress-incomplete;\n\theight: 2px;\n  }\n  &::-webkit-progress-bar {\n\tbackground-color: @bgcolor-progress-bar;\n  }\n  background-color: @bgcolor-progress-bar;\t// firefox\n\n  &:not([value]) {\n\t&::-moz-progress-bar {\n\t  background-color: #555;\n\t}\n  }\n  &[value=\"100\"] {\n\ttransition: background-color 5s;\n\theight: 1px;\n\t&::-webkit-progress-bar {\n\t  background-color: @bgcolor-progress-complete;\n\t  transition: background-color 5s;\n\t  height: 1px;\n\t}\n\t&::-webkit-progress-value {\n\t  background-color: @bgcolor-progress-complete;\n\t  transition: background-color 5s;\n\t  height: 1px;\n\t  top:0;\n\t}\n\t&::-moz-progress-bar {\n\t  background-color: @bgcolor-progress-complete;\n\t  height: 1px;\n\t  transition: background-color 5s;\n\t}\n  }\n}\n\nbody.bPlayer #playerpage header {\n  >div {\n\tmargin-left: -160px;\n\twidth: 320px;\n\tpadding: 20px 20px;\n\tbottom: 10%;\n  \tleft: 50%;\n\tposition: absolute;\n  }\n}\nbody.bPlayer.b360 #playerpage header>div {\n  margin-left: 0;\n\twidth: auto;\n\tpadding: 0;\n\tbottom: auto;\n  \tleft: auto;\n\tposition: static;\n}\n\nbody.deviceDesktop #playerpage header {\n  button.svg, a.btn.svg {\n\t &:hover svg {\n\t  opacity:1;\n\t  stroke: #fff;\n\t}\n  }\n}\n\nbody.deviceTablet, body.deviceMobile {\n  #playerpage header {\n\tbutton.svg, a.btn.svg {\n\t  svg {\n\t\tstroke: #fff;\n\t  }\n\t  &:active svg {\n\t\topacity: 1;\n\t\tstroke: #fff;\n\t  }\n\t}\n  }\n}\n\n\nbody.deviceMobile #playerpage header, body.deviceTablet #playerpage header {\n  h2#graph_heading {\n\ttext-align: center;\n\tsvg {\t// preserve heading in center, shifting logo to left\n\t  position: absolute;\n\t  margin-left: -22px;\n\t}\n  }\n  .controls {\n\t-webkit-justify-content: center;\n\tjustify-content: center;\n\tbutton+button, a.btn+button, button+a.btn, a.btn+a.btn {\n\t  margin-left: 10px;\n\t  margin-right: 10px;\n\t}\n  }\n}\n\nbody.deviceMobile.landscape .modal-dialog {\n \tmargin-top: 30px;\n}\n\n@media all and (max-height: 700px) {\n  body.landscape #playerpage header>div {\n\t\tbottom: 3%;\n  }\n  body.b360 #playerpage header>div {\n\tbottom:initial;\n  }\n}\n\n@media all and (max-height: 500px) {\n  body.landscape #playerpage header>div {\n\t\tbottom: 0;\n  }\n  body.b360 #playerpage header>div {\n\tbottom:initial;\n  }\n}"
  },
  {
    "path": "less/scrollbars.less",
    "content": "@bgcolor-transparent-brand: rgba(38,44,61,0.7);\n@bgcolor-transparent-bright: rgba(228,234,251,0.7);\n\n// mixin form\n.scrollbar{\n  &::-webkit-scrollbar {\n    width: 8px;\n  \theight: 8px;\n  }\n  &::-webkit-scrollbar-button {\n    display: none!important;\n  }\n  &::-webkit-scrollbar-track {\n    border-radius: 6px;\n    border: none;\n  }\n  &::-webkit-scrollbar-track-piece {\n    background-color: @bgcolor-transparent-brand;\n    border: none;\n  }\n  &::-webkit-scrollbar-thumb {\n    background-color: rgba(255,255,255,0.3);\n    border-radius: 6px;\n    border: 1px solid rgba(0,0,0,0.1);\n    background-clip: content-box;\n  }\n  &::-webkit-scrollbar-corner {\n    display: none!important;\n  }\n}\n\n.card .scrollbar::-webkit-scrollbar-track-piece {\n  background-color: @bgcolor-transparent-bright;\n}\n\n.card .scrollbar::-webkit-scrollbar-thumb {\n    background-color: rgba(0,0,0,0.1);\n}"
  },
  {
    "path": "less/site.less",
    "content": "// gm: common site css\n\n@letter-spacing-home:\t0.1pt;\n@letter-spacing-home-normal: 0.5px;\n\n@bgcolor-body: \t#f2f2f2;\n@color-body: #333;\n\n@bgcolor-message: \t#999;\n@color-message: #fff;\n@bgcolor-message-success: \t#fff;\n@color-message-success: #2EB046;\n\n@bgcolor-button: #4040bb;\n@bgcolor-button-warn: #c20b25;\n@color-button: #fff;\n\n@bgcolor-header: #262c3d;\n@color-header: #7e8dab;\n\n@color-placeholder-lightbg: #999;\n@color-placeholder-lightbg-focus: rgba(153,153,153,0.5);\n\n@bgcolor-formcontrol: \trgba(0,0,0,0.1);\n@color-formcontrol: #333;\n@color-formcontrol-error: #c00;\n@bordercolor-formcontrol: #999;\n\n@bgcolor-asset-card: #fff;\n@bgcolor-asset-card-overlay: rgba(38,44,61,0.7);\n@bgcolor-asset-card-graph: #fff;\n@bgcolor-asset-card-project: #fff;\n@color-asset-card-title: #777;\n\n@margin-asset-card\t:   15px;\n@margin-asset-card-h\t:   10px;\n@card-asset-width\t:  229px;\n@card-asset-height\t:  235px;\n\n@card-asset-width-mobile\t:  308px;\n@card-asset-height-mobile\t:  269px;\n\n@card-asset-width-mobile-se\t:  278px;\n@card-asset-height-mobile-se:  284px;\n\n// BOX-SIZING IS BORDER BOX!\n\n\n.modal-body {\n  .clearfix()\n}\n\nbody div.bootbox div.modal-dialog button.btn-primary {\n  outline: 0;\t// bootbox\n}\n\nbutton.svg, a.btn.svg {\n  position: relative;\n}\n\nbutton.toggle-button {\n  outline: 0;\n}\n\nbutton.nofx, a.nofx {\n  .nofx;\n}\n\ndiv.breadcrumb {\n  padding:0; margin:0;\n}\n.breadcrumb svg {\n\tdisplay: inline-block;\n\twidth: 19px;\n\theight: 10px;\n\tmargin-bottom: -1px;\n\tstroke: @editor-text-inactive;\n}\n\n\nbody.bMain nav.primary {\n  li>button {\n\tcolor: #cdcdcd;\n\t  font-weight: 600 !important;\n  }\n  a:hover, li>button:hover {\n\t  color: white;\n\t  text-decoration: none;\n  }\n}\n\nbody.bMain.modal-open {\n  overflow: auto;\t// seriously, bootbox\n}\n\nbody.bMain {\n\n  .mixin-threecol;\n\n  &.modal-open {\n\toverflow: auto;\t// bootbox\n  }\n\t\n  #brandTop, .brandTop {\n\tspan:first-of-type {\n\t  display: none;\n\t}\n\twidth: 120px;\n\theight: 30px;\n\tline-height: normal;\n\tpadding:0 !important;\n\t* {vertical-align: middle}\n  }\n  .brandTop svg {\n\tmargin:0;\n\tpadding:0;\n\tdisplay: block;\n  }\n\n\n  footer {\n\th6#footerBrand {\n\t  width: 153px;\n\t  height: 60px;\n\t  background: url('/images/home/vizor_footer_logo.png');\n\t  background-size: 100% 100%;\n\t  text-indent: -10000px;\n\t  padding:0;\n\t}\n  }\n  // https://css-tricks.com/snippets/css/a-guide-to-flexbox/\n  .flexcenter {\n\tdisplay:-webkit-flex;\n\t-webkit-flex-flow: row wrap;\n\t-webkit-justify-content: center;\n\t-webkit-align-items: center;\n\t-webkit-align-content: center;\n\n\tdisplay:flex;\n\tjustify-content: center;\n\tflex-flow: row wrap;\n\talign-items: center;\n\talign-content: center;\n\n\t>* {\n\t  -webkit-flex-basis: auto;\n\t  -webkit-flex-grow: 1;\n\t  -webkit-align-self: center;\n\n\t  flex-basis: auto;\n\t  flex-grow: 1;\n\t  align-self: center;\n\t}\n  }\n\n  .popover {\n\tpadding: 8px 15px;\n  }\n\n  background: @bgcolor-body;\n  color: @color-body;\n  font-size: 11pt;\n  p {margin-bottom: 1em;}\n  nav ul {\n\tpadding-left:0;\n\tmargin-left:0;\n\tli>a {vertical-align: middle;}\n  }\n\n  header>nav.primary>ul {\t// top right nav\n\tmargin: 0 0 0 auto;\n\tdisplay: flex;\n\tjustify-content: flex-end;\n\talign-items: center;\n\t>li {\n\t  display: inline-block;\n\t  margin-left: 60px;\n\t  &:first-of-type {\n\t\tmargin-left: 0;\n\t  }\n\t}\n  }\n\n  @media all and (max-width: @threshold-tablet ) {\n\theader>nav.primary>ul>li {\n\t  margin-left: 45px;\n\t}\n  }\n\n\n  .modal-footer {\n\tborder-top: 0;\n  }\n  .panel {\n\tbackground: none;\n\tborder-bottom:0;\n\tmargin-bottom: 2em;\n\tfieldset {\n\t  label  {\n\t  \tdisplay: block;\n\t  }\n\t}\n  }\n\n  a {\n\tcolor: @color-body;\n  }\n\n\n  button svg {\n\tdisplay: none;\n  }\n  a.svg.go, ul.cta li {\n\tbackground: url('/images/v2/icon_go.svg') right center no-repeat;\n\tbackground-size: auto 85%;\n\tpadding-right: 40px;\n  }\n\n\n  a.btn {\n\tfont-size: 120%;\n  }\n  header a.btn {\n\tfont-size: inherit;\n  }\n  button.svg svg, a.btn.svg svg {\n\tdisplay: inline;\n\twidth:1em;\n\theight:1em;\n\tvertical-align: -0.25ex;\n\tmargin-left: 1.3ex;\n  }\n\n  #wrapper {width:100%;}\n\n  header, footer, #flash, #contentcontainer>div>section, div.secondarynav, #contentwrap, #contentwrap>section {\n\t>.in {\n\t  padding-left: 20px;\n\t  padding-right: 20px;\n\t  margin: 0 auto;\n\t  position: relative;\n\t}\n  }\n  #contentcontainer {\n\tmin-height: 500px;\n  }\n\n  >header {\n\tbackground: @bgcolor-header;\n\tcolor: @color-header;\n\ta {color:@color-header;}\n  }\n\n  #flash div.alert {\n\tcolor:white;\n  }\n  #topnav {\n\tli#logo {\n\t  font-size: 250%;\n\t  font-weight: 500;\n\t  >a {\n\t\tdisplay: block;\n\t\tbackground: url(../images/v2/patches-textlogo-100x22.svg) center center no-repeat;\n\t  \tbackground-size: 100px 22px;\n\t\theight: 22px; width: 100px;\n\t\tfont-size: 1px;\n\t\ttext-indent: -1000px;\n\t\topacity: 0.9;\n\t\t&:hover {opacity: 1;}\n\t  }\n\t}\n\tli {\n\t  display: inline-block;\n\t  vertical-align: middle;\n\t  line-height: 2em;\n\t}\n\t.col.right ul {\n\t  text-align: right;\n\t}\n  }\n\n  a.btn, button.btn {\n\tbackground: #777;\n\tcolor: @color-button;\n\tborder: 1px solid rgba(0,0,0,0.5);\n\tpadding: 7px 10px;\n\tborder-radius: 3px;\n\t&:hover {\n\t  border: 1px solid rgba(0,0,0,1);\n\t}\n\t&:active {\n\t  background: #fff;\n\t  color: black;\n\n\t}\n  \t&.warn {\n\t  background: @bgcolor-button-warn !important;\n\t}\n  }\n\n  .smalltext {\n\t font-size: 87.5%;\n  }\n\n\n  a.btn.svg {\n\tsvg {\n\t  stroke: #fff;\n\t}\n  }\n\n  ul.errors {margin-left:0; color: #c00; padding-left:0;}\n  #contentcontainer form, section.contentcontainer form, #contentwrap>div.in form {\n\tinput:focus,\n\tselect:focus,\n  \tbutton:focus,\n  \ttextarea:focus\n\t{\n\t\toutline:0;\n\t}\n\tinput, select, button, textarea\n\t{\n\t\tborder:1px solid @bordercolor-formcontrol; font-size: 120%; padding: 5px;\n\t}\n\t.xhr.message {\n\t  background: @bgcolor-message;\n\t  color: @color-message;\n\t  padding: 5px 0;\n\t  border-radius: 3px;\n\t  display:inline-block;\n\t  &.success {\n\t\tbackground: @bgcolor-message-success;\n\t\tcolor: @color-message-success;\n\t  }\n\t}\n\n\tfieldset {margin-bottom:1em;}\n\tdiv.form-input {\n\t\twidth: auto;\n\t\tborder-radius: 4px;\n\t\tmargin: 0 auto 5px;\n\t\tposition: relative;\n\t\ttext-align: left;\n\t\t&.error input {\n\t\t\tborder: 1px solid @color-formcontrol-error;\n\t\t}\n\t\t>input, >label {\n\t\t  width: 100%;\n\t\t}\n\t\t>input {\n\t\t \tpadding: 10px;\n\t\t\tbackground: @bgcolor-formcontrol;\n\t\t\tborder: 1px solid @bordercolor-formcontrol;\n\t\t\tborder-radius: 3px;\n\t\t\tfont-size: 16px;\n\t\t\tline-height: 1.33;\n\t\t\tfont-weight: 300;\n\t\t\tcolor: @color-formcontrol;\n\t\t\tz-index: 1;\n\t\t}\n\t\t::-webkit-input-placeholder {\n\t\t   color: @color-placeholder-lightbg;\n\t\t}\n\t\t::-moz-placeholder {\n\t\t   color: @color-placeholder-lightbg;\n\t\t}\n\t\t.in_focus::-webkit-input-placeholder {\n\t\t   color: @color-placeholder-lightbg-focus;\n\t\t}\n\t\t.in_focus::-moz-placeholder {\n\t\t   color: @color-placeholder-lightbg-focus;\n\t\t}\n\t\t>label {\n\t\t\tfont-size: 16px;\n\t\t\tfont-weight: 400;\n\t\t\ttop:0;\n\t\t\tz-index: 0;\n\n\t\t}\n\t\t>span.message {\n\t\t  clear: left;\n\t\t  display: block;\n\t\t  color: #333;\n\t\t  padding:2px 0 0 5px;\n\t\t  font-size: 95%;\n\t\t}\n\t\t>span.message:after {\n\t\t  content: \".\"; color: rgba(0,0,0,0);\t\t// prevent from collapsing\n\t\t}\n\t\t&.error>span.message {\n\t\t  color: #ff6868;\n\t\t}\n\n\t} //  end  div.form-input\n\tdiv.modal-error {\n\t\tdisplay: none;\n\t\tspan {\n\t\t\tcolor: #ff6868;\n\t\t\tdisplay: block;\n\t\t\twidth: 100%;\n\t\t\theight: 16px;\n\t\t\tfont-size: 12px;\n\t\t}\n\t\t&#general-error span {\n\t\t\ttext-align: center;\n\t\t}\n\t}\n\n\tbutton {\n\t  border: 0;\n\t  border-radius: 3px;\n\t  padding: 7px 12px;\n\t  svg {\n\t\topacity: 0.85;\n\t\tstroke-width: 1.5px;\n\t\tstroke: #111;\n\t\tfill: #111;\n\t  }\n\t  &.warn { // button.warn\n\t\tsvg {\n\t\t  stroke: #fff;\n\t\t  fill: #fff;\n\t\t  stroke-width: 1.5px;\n\t\t}\n\t  }\n\t  &:hover svg {\n\t\topacity: 1;\n\t  }\n\t}\n\n\t// specific forms\n\n\t&#accountDetailsForm {\n\t  &.err_name #f_name,\n\t  &.err_email #f_email\n\t  {\n\t\tcolor:#c00;\n\t\tinput {\n\t\t\tborder:1px solid #c00;\n\t\t}\n\t  }\n\t}\n  } // end form\n\n  h1.decorative, h2.decorative, h3.decorative {\n\ttext-align: center;\n\tpadding-bottom: 0;\n\tspan {\n\t  background: url(../images/v2/heading_decor_dark.svg) center bottom no-repeat;\n\t  background-size: 2000px 22px;\n\t  display:inline-block;\n\t  padding-bottom:0;\n\t}\n\ti.fa {\n\t  font-size: 80%;\n\t  opacity: 0.5;\n\t  line-height: inherit;\n\t  vertical-align: 3%;\n\t  padding: 0 0.2ex;\n\t}\n\t&.light span {\n\t  background-image: url(../images/v2/heading_decor.svg);\n\t}\n  }\n  h1.decorative span {height: 1.85em}\n  h2.decorative span {height: 2.15em}\n  h3.decorative span {height: 2.5em}\n\n  .twocol.clearfix section.col,\n  section.center {\n\tbox-sizing: border-box;\n\twidth:50%;\n\tpadding: 0 40px;\n\tform {\n\t  box-sizing: border-box;\n\t  max-width: 600px;\n\t  * {\n\t\tbox-sizing: border-box\n\t  };\n\t}\n  }\n\n  @media all and (max-width: @threshold-mobile) {\n\tsection.center {\n\t  width: 100%;\n\t}\n  }\n\n  section.centre, section.center {\n\tmargin: 0 auto;\n\tform, p, div {\n\t  text-align: center;\n\t}\n  }\n\n  section:not(.list) {\n\tmargin-top: 30px;\n\tmargin-bottom:30px;\n  }\n  body>section:first-child:not(.list) {margin-top:0}\n  #contentcontainer>section:first-child {margin-top:0}\n  #contentcontainer>nav+section {margin-top:0}\n\n  .breadcrumbcontainer.dark {\n\tbackground: @bg-darker;\n\tcolor: white;\n\ta {\n\t  color: white;\n\t}\n\tsvg {\n\t  stroke: white;\n\t}\n\t>.in {\n\t  padding: 20px 22px;\n\t}\n  }\n\n}\t// body.bMain\n\nbutton.svg.tiny, a.btn.svg.tiny {\n  border: 0;\n  background: none;\n  height: 24px;\n  width: 24px;\n  font-size: 0.1px;\n  color: transparent;\n  padding:0;\n  svg {\n\theight: 24px;\n\twidth: 24px;\n\tstroke: #333;\n\tfill: none;\n\tposition: absolute;\n\tleft:0;\n\ttop:0;\n  }\n}\n\nbutton.svg, a.btn.svg {\n  svg {\n\tmax-height: 100%;\n  }\n}\n\n\n\n\n\nsection.list {\n\n  article.card {\n\tmargin:@margin-asset-card @margin-asset-card-h;\n  }\n  body.bGraphlistSummary:not(.noProjects) &+section.list:before {\n\tcontent: \"\";\n\tdisplay: block;\n\theight: 25px;\n\tmargin: 0 10px;\n\tborder-top: 1px solid #aaa;\n  }\n  body.bGraphlistSummary:not(.noProjects) &.assets[data-numitems=\"0\"],\n  body.bGraphlistSummary.noProjects &.assets[data-numitems=\"0\"]+section\n  {\n\tdisplay: none;\n\tvisibility: hidden;\n\toverflow: hidden;\n\theight: 0;\n\tmargin: 0 !important;\n  }\n  body.bGraphlistSummary &.assets[data-numitems=\"0\"]+section {\n\tmargin-top: 0 !important;\n  }\n}\n\n@color-main-action-button: #afbfdf;\n\nbody.bUserpage p.explain.emptylist {\n  margin: 20px 0;\n}\n\n@media all and (min-width: @threshold-mobile) {\n  section.list {\n\tmargin-left: -@margin-asset-card-h;\n\tmargin-right: -@margin-asset-card-h;\n\tmargin-top: 25px;\n\tmargin-bottom: 25px;\n\t>h4:first-child {\n\t  margin-left: @margin-asset-card-h;\n\t}\n  }\n}\n@media all and (max-width: @threshold-mobile) {\n  section.list>h4 {\n\ttext-align: center;\n\tmargin-bottom: 20px;\n  }\n}\n\nbody:not(.layoutMobile) {\n  section.list {\n\tarticle.card.asset {\n\t  float: left;\n\t  width: @card-asset-width;\n\t  height: @card-asset-height;\n\t  div.image {\n\t\theight: 165px;\n\t\t&:not(.fromsmall) {\n\t\t  background-size: auto 100%;\n\t\t}\n\t\t&.fromsmall {\n\t\t  background-size: cover;\n\t\t}\n\t\t&:not(.noimage, .fromsmall) {\n\t\t  background-position: -48px 0;\n\t\t}\n\t  }\n\t  div.meta {\n\t\ttop: 165px;\n\t  }\n\t}\n  }\n}\n\nbody.layoutMobile {\n  &:not(.bHome) {\n\t  section.list article.card.asset {\n\t\t  width: @card-asset-width-mobile;\n\t\t  height: @card-asset-height-mobile;\n\t\t  @media screen and (device-width: @device-width-iPhoneSE) {\n\t\t\t  width: @card-asset-width-mobile-se;\n\t\t\t  height: @card-asset-height-mobile-se;\n\t\t  }\n\t  }\n  }\n  section.list article.card.asset {\n\tmargin: 0 auto 20px auto;\n\tdiv.image {\n\t  //height: 200px;\n\t\tbottom: 65px;\n\t  background-size: cover;\n\t  background-position: 0 0;\n\t}\n\tdiv.meta {\n\t  //top: 200px;\n\t\theight: 65px;\n\t}\n  }\n}\n\nbody.bUserpage p.more {\n  margin-left: 0;\n  margin-right: 0;\n  margin-bottom: 20px;\n  text-align: right;\n  padding: 10px 12px;\n  a {\n\tcolor: @color-action;\n  }\n}\narticle.asset.card {\t\t// ##graph\n  \tbackground: white;\n  \tborder-radius: 4px;\n  \tposition:relative;\n\n  \t// order here is important\n  \tdiv.image:not(.noimage) {\n\t  background-color: #1e1269;\n\t}\n\n  \th4 a {\n\t  color: @color-action;\n\t}\n  \t&.private {\n\t  div.image:not(.noimage) {background-color: #24405F}\n\t  h4 a {color: #333;}\n\t  &.new {\n\t\tdiv.image {\n\t\t  background: #0597cd;\n\t\t}\n\t  }\n\t}\n\n\t&.new {\n\t\tdiv.image {\n\t\t  background: #0597cd;\n\t\t  position: relative;\n\t\t  a.action {\n\t\t\t&.btn.mainaction {\n\t\t\t  border: 0;\n\t\t\t  position: absolute;\n\t\t\t  top:0;\n\t\t\t  left:0;\n\t\t\t  right:0;\n\t\t\t  bottom:0;\n\t\t\t  display: block;\n\t\t\t  background: none;\n\t\t\t  width: auto;\n\t\t\t  height: 100%;\n\t\t\t  max-width: none;\n\t\t\t}\n\t\t\tspan {\n\t\t\t  display: none;\n\t\t\t}\n\t\t\tsvg {\n\t\t\t  stroke: #eee;\n\t\t\t  .center-neg-margin(32px, 32px);\n\t\t\t}\n\t\t\t&:hover svg {\n\t\t\t  stroke: #fff;\n\t\t\t}\n\t\t  }\n\t\t}\n\t}\n\n\n  \tbody:not(.layoutMobile) & div.overlay div.actions {\n\t  left: 44%;\n\t}\n\n  \tdiv.overlay {\n\t  -webkit-flex-flow: column wrap;\n\t  flex-flow: column wrap;\n\t  justify-content: center;\n\n\t  p.meta {\n\t\tposition: absolute;\n\t\tbottom: 10px;\n\t\tright: 20px;\n\t\twidth: 150px;\n\t\ttext-align: right;\n\t\tmargin-bottom: 0;\n\t\tfont-size: 12px;\n\t\tcolor: rgba(255, 255, 255, 0.5)\n\t  }\n\n\t  span.stat.views {\n\t\tmargin-left: 1ex;\n\t\t>span {\n\t\t  display: none;\n\t\t}\n\t  }\n\t}\n\n\n\n  button.action, a.btn.action {\n\t&.delete,\n\t&.share\n\t{\n\t  svg {\n\t\tfill: #afbfdf;\n\t  }\n\t  &:hover svg {\n\t\tfill: #fff;\n\t  }\n\t}\n  }\n\n  div.mainActionsWrap {\n\ttext-align:center;\n\tposition: absolute;\n\tleft: 0; right:0;\n\ttop: 50%; bottom: 50%;\n\tmargin-top: -20px;\n\tmargin-bottom: -20px;\n\n\t// iOS\n\tpointer-events: none;\n\t>* {\n\t  pointer-events: all;\n\t}\n  }\n\n  button.mainaction, a.btn.mainaction {\n\t  letter-spacing: 1px;\n\t  -webkit-flex-grow: 0;\n\t  flex-grow: 0;\n\t  width: 7em;\n\t  max-width: 7em;\n\t  border: 1px solid @color-main-action-button;\n\t  border-radius: 3.5px;\n\t  color: @color-main-action-button;\n\t  background: rgba(0,0,0,0.1);\n\t  text-transform: uppercase;\n\t  font-weight: 500;\n\t  font-size: 85%;\n\t  margin: 5px;\n\t  padding: 6px 10px;\n\t  height: 36px;\n\tsvg {\n\t\tstroke: @color-main-action-button;\n\t\tvertical-align: middle;\n\t\theight: 24px;\n\t\twidth: 22px;\n\t\tmargin-left: 0;\n\t\tmargin-right: 0;\n\t  }\n\t  span {\n\t\tdisplay: inline-block;\n\t\tmargin-left: 2px;\n\t\tvertical-align: middle;\n\t\ttransition: margin-left 0.1s ease-in;\n\t\tline-height: 24px;\n\t  }\n\t&.expand {\n\t  span {\n\t\tmargin-left: 2px;\n\t  }\n\t}\n  }\n\n  .mainaction.view {\n\tsvg {\n\t  fill: #afbfdf;\n\t}\n\t&:hover {\n\t  border-color: #fff;\n\t  color: #fff;\n\t  svg {\n\t\tfill: #fff;\n\t  }\n\t}\n  }\n\n  \tbody[data-touchcapable='false'] & {\n\t  button.mainaction:not(.new, .expand), a.btn.mainaction:not(.new, .expand) {\n\t\twidth: 36px;\n\t\tpadding: 6px 2px;\n\t\ttransition: width 0.1s ease-out;\n\n\t\tspan {\n\t\t  margin-left: -2px;\n\t\t  width: 0;\n\t\t  overflow: hidden;\n\t\t}\n\n\t\t&:hover {\n\t\t  width: 6.75em;\n\t\t  transition: width 0.1s ease-in;\n\t\t  span {\n\t\t\tmargin-left: 2px;\n\t\t\twidth: 5.3ex;\n\t\t\ttransition: width 0.2s ease-out, margin-left 0.1s;\n\t\t  }\n\t\t  border-color: #fff;\n\t\t  color: #fff;\n\t\t  svg {\n\t\t\tstroke: #fff;\n\t\t  }\n\t\t}\n\t  }\n\t}\n\n\n  \t>div {\n\t  position:absolute;\n\t  left: 0;\n\t  right: 0;\n\t}\n\n\n\t&:not(.new) div.meta h4 {\n\t  margin-left: 45px;\n\t}\n\n  \tdiv.meta {\n\t  padding: 10px 15px;\n\t  padding-bottom:0;\n\t  bottom:0;\n\t  .clearfix;\n\n\t  overflow: auto;\n\t  a.avatar {\n\t\twidth: 32px;\n\t\theight: 32px;\n\t\tfloat: left;\n\t\t&.vizor img {\n\t\t  background: #0597cd;\n\t\t}\n\t  }\n\t  img.avatar, a.avatar img {\n\t\twidth: 32px;\n\t\theight: 32px;\n\t\tborder-radius: 50% 50%;\n\t\tborder: 0;\n\t  }\n\t  img.avatar {\n\t\tfloat: left;\n\t  }\n\t  .avatar {\n\t\tmargin-top: 7px;\n\t  }\n\t  h4 {\n\t\tmargin-top: 7px;\n\t\tfont-size: 105%;\n\t\tfont-weight: 500;\n\t\tcolor: @color-asset-card-title;\n\t\tmargin-bottom: 10px;\n\t\t>a:hover {\n\t\t  text-decoration: none;\n\t\t  color: #0b6b9b;\n\t\t}\n\t\tspan.description {\n\t\t  margin-top:3px;\n\t\t  padding-left: 1px;\n\t\t  padding-right: 1px;\n\t\t  display: block;\n\t\t  font-size: 1.2rem;\n\t\t}\n\t\tspan.stat {\n\t\t  display: none;\n\t\t}\n\t  }\n\t  p {\n\t\tfont-size: 75%;\n\t\tcolor: #999;\n\t\tpadding-bottom:0;\n\t\tmargin-bottom: 0;\n\t  }\n\t}\n\n  \t// looking at own tiles\n  \tbody.bGraphlistSummary &,\n  \tbody.bGraphlistPublic &,\n  \tbody.bGraphlistPrivate & {\n\t  div.meta h4 {\n\t\tmargin-left: 0;\n\t  }\n\t  .avatar, span.description.user  {\n\t\tdisplay: none;\n\t  }\n\t  span.description.stat {\n\t\tcolor: #a3a3a3;\n\t\tdisplay: block;\n\t\tspan {\n\t\t  display: inline;\n\t\t  padding-right: 5px;\n\t\t}\n\t\tspan+span:before {\n\t\t\tcontent: \"|\";\n\t\t\tpadding-right: 5px;\n\t\t}\n\t  }\n\t  div.overlay:hover, div.overlay.focus {\n\t\tspan.stat {\n\t\t  display: none;\n\t\t}\n\t  }\n\t}\n\n  \tdiv.image, div.overlay {\n\t  // safari..\n\t  border-top-left-radius: 4px;\n\t  border-top-right-radius: 4px;\n\t}\n\tdiv.image {\n\t  top:0;\n\t  &.noimage {\n\t\tbackground-image: url('../images/v2/placeholder_440x330.png');\n\t\tbackground-position: 0 0;\n\t\tbackground-size: 100%;\n\t  }\n\t}\n  \tdiv.overlay {\n\t  display: -webkit-flex;\n\t  display: flex;\n\t  position: absolute;\n\t  top:0; bottom:0; left:0; right:0;\n\t  background-color: @bgcolor-asset-card-overlay;\n\t  button {\n\t\t&:not(.mainaction) svg {stroke: rgba(255,255,255,0.5); stroke-width:1px; }\n\t\t&:hover svg {stroke: #fff;}\n\t  }\n\t  // see below\n\t  opacity: 0;\n\t  transition: opacity 0.2s linear;\n\t}\n\n  // touchcapable uses js to get around iOS's inconsistent/leaky :hover, replace with .focus\n  body[data-touchcapable='false'] & div.overlay:hover,\n  body[data-touchcapable='true'] & div.overlay.focus {\n\topacity: 1;\n  }\n\n\tdiv.actions {\n\t  position:absolute;\n\t  top:10px;\n\t  right:10px;\n\t  height: 24px;\n\t  padding: 0 5px;\n\t  display: flex;\n\t  align-items: center;\n\t  justify-content: flex-end;\n\t}\n  \tdiv.actions button, div.actions label {\n\t  margin-left: 10px;\n\t  height: 24px;\n\t  input[type='checkbox'] {\n\t\tmargin-top:0.6ex;\n\t  }\n\t}\n\tdiv.actions>* {\n\t  flex-grow: 0;\n\t}\n  \tdiv.actions button {\n\t  &.tiny {\t// button tiny\n\t\tsvg {\n\t\t  position:absolute; left:50%;top:50%;\n\t\t  margin-left:-12px;\n\t\t  margin-top:-12px;\n\t\t}\n\t  }\n\t}\n  button.svg>svg, a.btn.svg>svg  {\n\tstroke: #afbfdf;\n  }\n\n  .toggleWrap, .toggleWrap * {\n\tcursor: pointer;\n  }\n  input[type='checkbox'] {\n\tmargin-top:0;\n  }\n\n}\n\n// see toggle.less\n\n\nbody.bUserpage {\n\n  // hide the create card on phone layout\n  &.layoutMobile section.list article.new.card {display: none}\n\n  #secondarynav {\n\tli {\n\t  display: inline-block;\n\t}\n  }\n\n  &.bMain #contentcontainer section.list:first-of-type {\n\tmargin-top: 25px;\n  }\n}\n\nbody.bProfile {\n  section.center + section.center {margin-top: 3em;}\n}\n\n#account {\n  button.action.login {\n\tbackground: none;\n  }\n  span {display: block}\n  svg {\n\twidth: 32px;\n\theight: 32px;\n  }\n  .top-userpic {\n\tmargin: 5px auto 6px;\n  }\n}\n\n.bMain #account {\n  button {\n\tborder: 0; outline: 0; box-shadow: 0;\n\twidth: 56px;\n\tmargin-right: 10px;\n\tsvg {\n\t  stroke: #fff;\n\t}\n  }\n}\n.bEditor #account {\n  margin: 0 10px 0 4px;\n}\n\n\n.flexcolumns {\n  display: -webkit-flex;\n  -webkit-flex-direction: row;\n  -webkit-justify-content: space-between;\n  -webkit-align-items: stretch;\n  -webkit-align-content: stretch;\n\n  display: flex;\n  flex-direction: row;\n  justify-content: space-between;\n  align-items: stretch;\n  align-content: stretch;\n  &.c2 {\n\t>ul, >div, >p {\n\t\t-webkit-flex-basis: 50%;\n\t\tflex-basis: 50%;\n\t}\n  }\n  &.c3 {\n\t>ul, >div, >p {\n\t\t-webkit-flex-basis: 33.3%;\n\t\tflex-basis: 33.3%;\n\t}\n  }\n  &.c4 {\n\t>ul, >div, >p {\n\t\t-webkit-flex-basis: 25%;\n\t\tflex-basis: 25%;\n\t}\n  }\n\n  >ul {\n\tpadding-left: 0;\n\tmargin-right: 20px;\n  }\n}\n\n\n\n@keyframes spinner {\n  from {transform: rotate(0deg)}\n  to {transform: rotate(-360deg)}\n}\n\n.withWaitState {\n  .waitOn {\n\tdisplay: none;\n  }\n  .waitOff {\n\tdisplay: initial;\n  }\n}\n.withWaitState.waiting, form.loading button.withWaitState {\n  .waitOn {\n\tdisplay: initial;\n  }\n  .waitOff {\n\tdisplay: none;\n  }\n}\n\nform.loading button.withWaitState.spinner {\n  .waitOn {\n\tanimation: spinner 1.3s infinite linear;\n  }\n}\n\n.modal form button {\n  font-weight: 400;\n}\n\n.bProfile form button, .bProfile form a.btn {\n  >svg {\n\tmax-width: 20px;\n\tmax-height: 20px;\n\tvertical-align: middle;\n  }\n  &.withWaitState svg {\n\tmargin-left: 5px;\n  }\n}\n\n.hide {\n  visibility:hidden;\n  width: 1px;\n  height: 1px;\n  overflow:hidden;\n}\n\n\nbody.bHome header nav.primary {\n  padding-bottom: 15px;\n}\n\n/*\n@media all and (min-width: @threshold-mobile) {\n  body.bHome:not(.bAbout) header nav.primary {\n\t&:after {\n\t  content: \"\";\n\t  height: 16px;\n\t  width: 100%;\n\t  border-bottom: 1px solid #fff;\n\t  display: block;\n\t  float:left;\n\t}\n  }\n}\n*/\n\nbody.bMain {\n  header {\n\tmargin:0;\n\tpadding: 0;\n\twidth: 100%;\n\n\tnav.primary {\n\t  padding-top: 30px;\n\t  >* {margin:0; padding:0;}\n\n\t  >ul {\t// top right links\n\t\tfont-size: 15px;\n\t\tfont-weight: 600;\n\t    letter-spacing: 0.5px;\n\t\t-webkit-text-stroke: 0.3px;\n\t\tpadding-left: 0;\n\t\ttext-align: center;\n\t\tli {\n\t\t  line-height: 24px;\t// userpulldown\n\t\t  &.wider {\n\t\t\t-webkit-flex: 1.2;\n\t\t\tflex: 1.2;\n\t\t  }\n\t\t}\n\t  }\n\t}\n\n\tbutton.sign-btn, a.btn.sign-btn {\n\t  width: auto;\n\t  padding: 5px 15px;\n\t  border-radius: @btn-border-radius-small;\n\t  font-weight: @font-weight-home;\n\t}\n\tbutton+button, button+a.btn {margin-left:1em;}\n\n  }\n\n\n\t&.layoutMobile header nav.primary {\n\t  padding-top: 20px;\n  }\n\n  header button, header form button, header a.btn {\n\tborder: 1px solid #fff;\n\tbackground: none;\n\tvertical-align: middle;\n\tline-height: 1em;\n\t&:hover {\n\t  border-color: #fff;\n\t}\n  }\n  &.layoutTablet #contentwrap header {\n\theight: 60px;\n\tnav {\n\t  border-bottom: 0;\n\t}\n  }\n\n  #brandTop {\n\ta {\n\t  display: block;\n\t  line-height: normal;\n\t  span {\n\t\tline-height: normal;\n\t  }\n\t}\n\tsvg {\n\t  margin-top:-2px;\n\t  width: 100%;\n\t  height: 100%;\n\t}\n  }\n\n  @import \"mobilemenu\";\n\n  #brandTop {\n\tfloat:left;\n\twidth: 100px;\n\theight: 28px;\n\ta {\n\t  height: 28px;\n\t}\n  }\n\n\n  @media all and (max-width: (@threshold-mobile - 1)) {\n\n\t#brandTop {\n\t  width: 65px;\n\t  height: 30px;\n\t  float:none;\n\t}\n\n\theader nav {\n\t  border-bottom: 0;\n\t}\n  } // /@media mobile\n\n  @media all and (min-width: @threshold-tablet) {\n\t#brandTop {\n\t  margin-left: 0;\n\t}\n\n\theader>nav>ul {\n\t  width: 442px;\n\t  padding-left: 0;\n\t  float: right;\n\t}\n\n\theader {\n\t  nav.in, div.secondarynav {\n\t\tmax-width: @max-width-desktop;\n\t\tmargin-left: auto !important;\n\t\tmargin-right: auto !important;\n\t  }\n\t}\n\n  } // /@media desktop\n\n}\n\n\n@media all and (min-width: @threshold-tablet) {\n  body.bMain {\n\t#flash>div.in {\n\t  max-width: @max-width-desktop -5;\n\t}\n  }\n}\nbody.bMain {\n  #flash {\n\tz-index: 1000;\n\tposition: absolute;\n\tleft:0;\n\tright:0;\n\ttop:0;\n\t>div.in {\n\t  z-index: 10;\n\t}\n\tbackground: #eee;\n  }\n  #flash>div.in {\n\tbackground: none;\n\tcolor: #000;\n\ttext-align: center;\n\tborder: 0;\n\t&.alert-danger {\n\t  color: #c00;\n\t}\n\t&.alert-success {\n\t  color: #090;\n\t}\n  }\n  #flash .close {\n\topacity: 1;\n  }\n  #flash .ion-close-circled:before {\n\twidth: 22px;\n\theight: 22px;\n\tdisplay: block;\n\tcontent: \"x\";\n\tborder:1px solid #000;\n\tborder-radius: 100%;\n  }\n}\n\n@media all and (min-width: @threshold-tablet) {\n  body.bUserpage, body.bAccount, body.bProfile {\n\t&:not(.layoutMobile) {\n\t  header div.in {\n\t\twidth: @max-width-desktop;\n\t  }\n\t}\n  }\n}\n\nbody.bUserpage, body.bAccount, body.bProfile {\n  section form.panel {\n\tmargin-bottom: 0;\n  }\n  img.vizor.avatar {\n\tbackground: #0597cd;\n  }\n  header #profileheader div.meta.userinfo p.strapline {\n\t\tline-height: 1.4;\n\t\tmargin-top: 7px;\n\t\tmargin-bottom: 0;\n  }\n\n  &:not(.layoutMobile) {\n\theader {\n\n\t  #profileheader {\n\t\tmargin-top: 40px;\n\t\tmargin-bottom: 40px;\n\t\tdiv.user-profile {\n\t\t  display: flex;\n\t\t}\n\t\tdiv.avatar {\n\t\t  width: 130px;\n\t\t}\n\t\tdiv.meta.userinfo {\n\t\t  margin-left: 50px;\n\t\t  max-width: 75%;\n\t\t}\n\t  }\n\t}\n  }\n  &.layoutMobile {\n\t#profileheader {\n\t  display: flex;\n\t  flex-direction: column;\n\t  align-items: center;\n\t  width: 100%;\n\t  div.avatar {\n\t\ttext-align: center;\n\t  }\n\t  div.meta.userinfo {\n\t\ttext-align: center;\n\t\tmargin: 10px auto;\n\t  }\n\t  h2 {\n\t\tline-height: 40px;\n\t  }\n\n\t}\n  }\n  header {\n\theight: auto;\n\tul, ol {\n\t  margin-bottom: 0;\n\t  padding-left: 0;\n\t  li {\n\t\tlist-style: none;\n\t  }\n\t}\n\t.secondarynav nav a, #projectListFilter a {\n\t\tdisplay: block;\n\t}\n\t#profileheader {\n\t  div.avatar {\n\t\timg {\n\t\t  width: 128px;\n\t\t  height: 128px;\n\t\t  border-radius: 64px;\n\t\t  border: 0 solid white;\n\t\t}\n\t  }\n\t  div.meta.userinfo {\n\t\tcolor: white;\n\t\tfont-size: 15px;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tjustify-content: space-between;\n\t\th2 {\n\t\t  margin-top:0;\n\t\t  padding-top:0;\n\t\t  font-size: 24px;\n\t\t  font-weight: 600;\n\t\t}\n\t\th2, ul li {\n\t\t  line-height: 30px;\n\t\t  margin-bottom: 0;\n\t\t}\n\t\ta {\n\t\t  color: #0b97c4;\n\t\t}\n\t\tul {\n\t\t  margin: 0;\n\t\t  padding: 0;\n\t\t  span.count+span.count:before {\n\t\t\tcontent: \"|\";\n\t\t\tmargin: 0 10px;\n\t\t  }\n\t\t}\n\t\tli {\n\t\t  &.website {\n\t\t\tfont-weight: 600;\n\t\t  }\n\t\t}\n\t  }\n\t}\n\n\n\t@media all and (min-width: @threshold-mobile) {\n\t  div.secondarynav {\n\t\t> .in:last-child {\n\t\t  display: flex;\n\t\t  justify-content: space-between;\n\t\t}\n\t\tnav, #projectListFilter {\n\t\t  font-size: 16px;\n\t\t}\n\t\tnav {\n\t\t  width: 230px;\n\t\t  > ul {\n\t\t\t//display: flex;\n\t\t\t//justify-content: space-between;\n\t\t  }\n\t\t}\n\t\t#projectListFilter {\n\t\t  width: 260px;\n\t\t  display: flex;\n\t\t  justify-content: flex-end;\n\t\t  li {\n\t\t\t//padding: 0 30px;\n\t\t  }\n\t\t}\n\t  }\n\t}\n\n\n\n\tdiv.secondarynav {\n\t  nav, #projectListFilter {\n\t\t//font-size: 16px;\n\t  }\n\t  nav {\n\t\tfont-weight: 400;\n\t\t//width: 230px;\n\t\ta {\n\t\t  line-height: 2;\n\t\t  color: #a3a3a3;\n\t\t  &:hover {\n\t\t\ttext-decoration: none;\n\t\t\tcolor: white;\n\t\t  }\n\t\t}\n\t\t>ul {\n\t\t  display: flex;\n\t\t  justify-content: space-between;\n\t\t}\n\t  }\n\t  #projectListFilter {\n\t\t//width: 260px;\n\t\tmargin-top: 5px;\n\t\ta {\n\t\t  color: #a3a3a3;\n\t\t}\n\t\tli {\n\t\t  padding: 0 30px;\n\t\t  display: inline-block;\n\t\t  height: 1.3em;\n\t\t}\n\t\tli:first-child {\n\t\t  padding-left: 0;\n\t\t}\n\t\tli:last-child {\n\t\t  padding-right: 0;\n\t\t}\n\t\tli+li {\n\t\t  border-left: 1px solid #ccc;\n\t\t}\n\t  }\n\n\t  @media all and (max-width: @threshold-mobile) {\n\t\t// div.secondarynav\n\n\t\t#projectListFilter {\n\t\t  text-align: center;\n\t\t  position: absolute;\n\t\t  top: 100%;\t\t// see above\n\t\t  left: 0;\n\t\t  right: 0;\n\t\t  z-index: 10;\n\t\t  padding-top: 10px;\n\t\t  a {\n\t\t\tcolor: #333;\n\t\t  }\n\t\t}\n\n\t\tnav.secondary  {\n\t\t  margin-top:10px;\n\t\t}\n\t\tnav.secondary ul li {\n\t\t  flex: 1;\n\t\t  padding: 0 15px;\n\t\t  text-align: center;\n\t\t}\n\n\t  }\n\n\t}\n  }\n  }\n\n@media all and (max-width: @threshold-mobile) {\n  body.bUserpage {\n\theader div.secondarynav {\n\t\tdiv.in.self { margin-bottom: 70px; } } } }\n\n\nbody.bGraphlistSummary #projectListFilter #plfAll a,\nbody.bGraphlistPublic #projectListFilter #plfPublic a,\nbody.bGraphlistPrivate #projectListFilter #plfPrivate a{\n  color: white;\n}\n\n@media all and (max-width: @threshold-mobile) {\n  body.bGraphlistSummary #projectListFilter #plfAll a,\n  body.bGraphlistPublic #projectListFilter #plfPublic a,\n  body.bGraphlistPrivate #projectListFilter #plfPrivate a{\n\tcolor: #00b3ee;\n  }\n}\n\n\nbody.bUserpage nav #nProjectsLi, body.bProfile nav #nAccountSettingsLi {\n  a {\n\tcolor: white;\n\t&:after {\n\t  content: \"\";\n\t  display: block;\n\t  border-bottom: 8px solid #0b97c4;\n\t}\n  }\n}\n\n\n@media all and (min-width: @threshold-tablet) {\n  #contentwrap > div.in {\n\twidth: @max-width-desktop;\n  }\n}\n\nbody.layoutMobile #contentwrap>div.in {\n  width: @max-width-phone;\n}\n\n\nmeter {\n  height:10px;\n  width:50%;\n  -webkit-appearance: none;\n\n  >span {\n\tborder:1px solid black;\n\theight: 100%;\n\twidth: 3px;\n\tdisplay: block;\n\tmargin: 0 auto;\n  }\n\n  &::-webkit-meter-bar {\n\tbackground: #ccc;\n  }\n\n  &::-webkit-meter-optimum-value {\n\tbackground: green;\n  }\n\n  &::-webkit-meter-suboptimum-value {\n  \tbackground:    yellow ;\n  }\n\n  &::-webkit-meter-even-less-good-value {\n  \tbackground:    red ;\n  }\n\n}\n\n\n.collapsible {\n  >h3>a.toggle {\n\t.nofx;\n\tdisplay: block;\n\t&:after {\n\t  content: \"+\";\n\t  float:right;\n\t  width: 20px;\n\t  height: 20px;\n\t  font-size: 18px;\n\t  line-height: 17px;\n\t  vertical-align: middle;\n\t  text-align: center;\n\t  border: 1px solid #444;\n\t  color: #444;\n\t  border-radius: 10px;\n\t  display: inline-block;\n\t  transform: rotateZ(45deg);\n\t  transition: transform 0.2s linear;\n\t}\n\t&:hover:after {\n\t  border: 1px solid #777;\n\t  background: #777;\n\t  color: #eee;\n\t}\n  }\n  &.collapsed > h3 > a.toggle {\n  }\n  &.collapsed > h3 > a.toggle:after {\n\tcontent: \"+\";\n\ttransform: rotateZ(0);\n  }\n  >div {\n\ttransition: max-height 0.3s ease-out 0s;\n\tmax-height: 600px;\n\toverflow: hidden;\n  }\n  &.collapsed>div {\n\ttransition: max-height 0.3s ease-in 0s;\n\tmax-height: 0;\n  }\n}\n\nbody.bMain.bProfile #contentwrap #contentcontainer {\n\n  background: white;\n  padding: 40px;\n\n  section {\n\t>h3 {\n\t  margin-top:0;\n\t  padding: 10px 0;\n\t  -webkit-user-select: none;\n\t}\n\tpadding-bottom: 20px;\n\tmargin-bottom: 0;\n\tform {\n\t  box-shadow: none;\n\t}\n  }\n  section+section {\n\tborder-top: 1px solid #f2f2f2;\n\tpadding-top: 20px;\n\tmargin-top: 0;\n  }\n\n  form button, a.btn {\n\tfont-size: 16px;\n\tline-height: 23px;\n\tfont-weight: 500;\n\tpadding: 10px 20px;\n\tcolor: #ffffff;\n\tbackground: #0597cd;\n\tborder-radius: 4px;\n\tborder: none;\n\tsvg {\n\t  stroke: #fff;\n\t}\n  }\n\n  form {\n\tlabel {\n\t  color: #9b9b9b;\n\t  margin-bottom: 0;\n\t}\n\tinput:not([type='checkbox']):not([type='radio']):not([type='file']) {\n\t  width: 250px;\n\t  font-weight: 500;\n\t  background: none;\n\t}\n\tinput[type='checkbox'] {\n\t  border: 0;\n\t  margin-top:0;\n\t  vertical-align: middle;\n\t}\n\tinput[type=\"file\"] {\n\t  display: inline;\n\t  width: auto;\n\t}\n\ttextarea {\n\t  width: 500px;\n\t  height: 80px;\n\t  border-radius: 4px;\n\t  font-size: 16px;\n\t  padding: 10px;\n\t}\n\tp.explain, span.explain {\n\t  font-size:14px;\n\t  line-height: 1.45;\n\t  color: #8b8b8b;\n\t  margin-top: 20px;\n\t  &:first-child {\n\t\tmargin-top: 0;\n\t\tmargin-bottom: 20px;\n\t  }\n\t}\n\tdl {\n\t  .clearfix;\n\t  font-size:14px;\n\t  line-height: 1.45;\n\t  color: #9b9b9b;\n\t  dt {\n\t\tfloat:left;\n\t\tclear:left;\n\t  }\n\t  dd.form-input {\n\t\tfloat:right;\n\t\twidth: 20%;\n\t\ttext-align: right;\n\t\tlabel {\n\t\t  font-weight: normal;\n\t\t}\n\t\tlabel+label {margin-left: 10px;}\n\t  }\n\t}\n\tdt {\n\t  font-size: 14px;\n\t  font-weight: normal;\n\t}\n\ta.needhelp {\n\t  color: #0597cd;\n\t  font-size: 90%;\n\t}\n\n\t@media all and (min-width: @threshold-mobile) {\n\t  input + button, input + a.needhelp {\n\t\tmargin-left: 10px;\n\t  }\n\t  span.explain {\n\t\tmargin-left: 20px;\n\t  }\n\t}\n\t@media all and (max-width: @threshold-mobile) {\n\t  input, textarea {\n\t\tmax-width: 98%;\n\t  }\n\t  input + button {\n\t\tmargin-top: 10px;\n\t  }\n\t  input + a.needhelp, span.explain {\n\t\tdisplay: block;\n\t\tmargin-top: 10px;\n\t  }\n\t  span.explain {\n\t\tmargin-left: 0;\n\t  }\n\t  meter {\n\t\twidth: 250px;\n\t  }\n\t}\n  } // /form\n}\n\n\narticle.card {\n  button.action, a.btn.action {\n\t&.tiny svg {\n\t\twidth: 24px;\n\t\theight: 24px;\n\t}\n  }\n}\n\n\n  .modal-dialog {\n\tmax-width: 100%;\n\tpadding: 0 10px;\n\tsection+section {\n\t  margin-top:20px;\n\t}\n\t.modal-header {\n\t  border-top-left-radius: @share-border-radius;\n\t  border-top-right-radius: @share-border-radius;\n\t}\n\t.modal-body {\n\t  border-bottom-left-radius: @share-border-radius;\n\t  border-bottom-right-radius: @share-border-radius;\n\t}\n  }\n\n  .minislides .slides section+section {\n\tmargin-top:0;\n  }\n\n  .modal-dialog, header, button, a.btn {\n\t-webkit-font-smoothing: subpixel-antialiased;\n\tfont-smoothing: subpixel-antialiased;\n  }\n\n  #shareDialog {\n\ttext-align: left;\n\tmargin-bottom: 0;\n\t.collapsible .trigger {\n\t  .readmore(16px, -5px);\n\t}\n\tlabel, input, textarea, a {\n\t  color: @share-color-text !important;\n\t  &::-moz-selection, &::selection {\n\t\tcolor: #000;\n\t\tbackground: @share-bgcolor-text;\n\t  }\n\t}\n\tlabel {\n\t  font-weight: 500;\n\t}\n\tinput, textarea {\n\t  background: rgba(0,0,0,0.2) !important;\n\t  border: 0;\n\t  border-radius: 3px;\n\t  width: 98%;\n\t  max-width: 98%;\n\t  margin: 5px 0;\n\t  line-height: 1.5em;\n\t  padding: 10px;\n\t}\n\ttextarea {\n\t  height: 6.5em;\n\t  font-size: 91.5%;\n\t  resize: none;\n\t}\n  }\n\nbody.bUserpage, body.bProfile {\n  header[data-uid], div.header-preview {\n\tbackground-position: center center;\n\tbackground-repeat: no-repeat;\n\tbackground-size: cover;\n\tposition:relative;\n\t.header-overlay {\n\t  position: absolute;\n\t  top:0;\n\t  bottom:0;\n\t  left:0;\n\t  right:0;\n\t  background: rgba(22,24,28,0.75);\n\t  z-index: 0;\n\t}\n\t* {\n\t  z-index: 1;\n\t}\n  }\n}\n\n#avatarUploadForm img.user.avatar {\n  border-radius: 50% 50%;\n}\n\n#headerUploadForm div.header-preview {\n  border-radius: 4px 4px;\n  div.header-overlay {\n\tborder-radius: 4px 4px;\n  }\n}\n\nbody.bProfile {\n  #headerUploadForm .xhr.message,\n  #avatarUploadForm .xhr.message {\n\tmargin-left: 20px;\n  }\n}\n\nbody.bProfile form {\n  div.header-preview {\n\twidth: 940px; height:222px;\n\t&.noHeader {\n\t  height: 1px;\n\t}\n  }\n}\n\n\nbody.bMain header {\n  >nav.in, >div.secondarynav.in {\n\tz-index:100;\n  }\n}\n\n\nbody.bMain {\n\n  button.nofx {\n\tpadding:0;\n\tborder: 0;\n  }\n\n  #contentwrap .overlay {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin:0;\n\ttop:0;\n\tbottom:0;\n\tleft:0;\n\tright:0;\n\twidth: 100%;\n\theight: 100%;\n\tbackground: @bgcolor-overlay;\n\tz-index: 100;\t// note, affects mobile menu\n  }\n  #contentwrap article .overlay {\n\tz-index: 90;\n  }\n}\n\n\n\n@media screen and (min-width: @threshold-mobile + 1px) and (max-width: @threshold-tablet) {\n  body.bMain header[data-uid] {\n\tdiv.secondarynav, >nav.primary {\n\t  padding-left: 20px;\n\t  padding-right: 20px;\n\t}\n  }\n}\n\n\n\n\nfooter >nav.in {\n  padding: 15px 0;\n}\n\nfooter nav.links a {\n  font-size: 13px;\t\t// android, otherwise 14px\n}\n\n@media all and (min-width: @threshold-tablet) {\n  footer nav.links a {\n\tfont-size: 16px;\n  }\n}\n\n@media all and (max-width: @threshold-mobile) {\n  body.bUserpage header #profileheader div.userinfo:last-child {\n\tmargin-bottom: 20px;\n  }\n}\n\n\nheader.default, body.bMain header.default {\n  padding-bottom: 20px;\n}"
  },
  {
    "path": "less/threesixty.less",
    "content": ".big {\n  font-family: @font-family-sans-serif;\n  background:  none !important;\n  text-align: center !important;\n  word-wrap: break-word !important;;\n  font-weight: 500 !important;\n  color: #fff !important;\n  letter-spacing: initial !important;\n  padding: 0 !important;\n  margin: 0 !important;\n}\n\n.roundbutton {\n  border: 0px;\n  background: rgba(0,0,0,0.5);\n  height: 40px;\n  font-size: 16px;\n  line-height: 40px;\n  color: #fff;\n  border-radius: 20px;\n}\n\nbody.b360 {\n\n  @controls-right: 60px;\n\n  background: #999;\n  margin:0;\n  padding:0;\n  height: 100%;\n  width: 100%;\n  min-height: 100%;\n\n  &.deviceDesktop {\n\tbutton#entervr {\n\t  display: block; // set to .nodesktop otherwise\n\t}\n\t.modal.player_share .modal-dialog {\n\t  margin: 15% auto;\n\t  section#embedSource {\n\t\ttext-align: center;\n\t  }\n\t}\n  }\n\n  #playerpage header div.controls {\n\t-webkit-justify-content: flex-end;\n\tjustify-content: flex-end;;\n  }\n\n  button#fullscreen svg {\n\tstroke-width: 1px !important;\n  }\n\n  button:active, button:focus, a.btn:active {\n\toutline: 0;\n  }\n\n  #madeByVizorWidget {\n\tposition: absolute;\n\tbottom: 20px;\n\tright: @controls-right + 20;\n  }\n\n  &.deviceMobile {\n\t#madeByVizorWidget {\n\t  display: none;\n\t}\n\tbutton#backfromvr {\n\t  .roundbutton;\n\t  width: 16ex;\n\t  padding:0;\n\t  margin-top: 20px;\n\t}\n  }\n\n  &.assetsLoaded.playing #progressbar {\n\tdisplay: none;\n  }\n\n\n  #shareDialog {\n\tinput {\n\t  .big;\n\t  font-size: 24px !important;\n\t}\n  }\n  div.modal.player_share, div.modal.viewinvr {\n\t.modal-body {\n\t  padding-top: 0;\n\t}\n  }\n  div.modal {\n\t.modal-dialog {\n\t  button.bootbox-close-button {\n\t\ttop: 4px;\n\t\tright: 4px;\n\t\tcolor: transparent;\n\t\tsvg, use {\n\t\t  fill: rgba(255, 255, 255, 0.4);\n\t\t}\n\t  }\n\t}\n  }\n\n  div.modal-backdrop.fade.in {\n\topacity: 0;\n\tfilter: none;\n\tdisplay: none;\n  }\n  .bootbox.modal:before {\n\tbackground-color: transparent;\n  }\n\n  div.modal-dialog {\n\tsection, fieldset {\n\t  border: 0;\n\t}\n\t.modal-content {\n\t  border: 0;\n\t  box-shadow: none;\n\t  -webkit-box-shadow: none;\n\t  -moz-box-shadow: none;\n\t\tborder-radius: 5px !important;\n  \t\tbackground: rgba(38, 44, 61, 0.65) !important;\n\t}\n\t.modal-body {\n\t  font-family: @font-family-sans-serif;\n\t  -webkit-font-smoothing: subpixel-antialiased;\n\t  background: none !important;\n\t}\n  }\n\n  div.modal-dialog .modal-content .modal-header {\n\tbackground: none !important;\n  }\n  div.modal.player_share .modal-dialog,\n  div.modal.error .modal-dialog,\n  div.modal.viewinvr .modal-dialog {\n\t.modal-content {\n\t  .modal-header h4.modal-title {\n\t\tfont-weight: 300;\n\t\tletter-spacing: 0.75px;\n\t\tmargin-bottom: 10px;\n\t\tcolor: #fff;\n\t\tfont-size: 24px;\n\t  }\n\t  .modal-body {\n\t\tfont-size: 1.03rem;\n\t\tbackground: rgba(38, 44, 61, 0.75);\n\t\t.bootbox-body {\n\t\t  padding: 5px 5px 5px 5px;\n\t\t  a {\n\t\t\t.big;\n\t\t\tfont-size: 24px !important;\n\t\t  }\n\t\t}\n\t  }\n\t}\n  }\n\n  div.modal.error .modal-dialog {\n\twidth: 600px;\n\t.modal-content .modal-body .bootbox-body section.error {\n\t  p:first-of-type {\n\t\tmargin-top:0; padding-top:0;\n\t  }\n\t  a {\n\t\tfont-size: inherit !important;\n\t  }\n\t}\n\t.modal-body {\n\t  padding: 10px 20px;\n\t  .bootbox-body {\n\t\ttext-align: left;\n\t\tcode {\n\t\t  max-width: 600px;\n\t\t  word-wrap: break-word;\n\t\t  font-size: 87.5%;\n\t\t  font-weight: normal;\n\t\t  font-family: @font-family-monospace;\n\t\t}\n\t  }\n\t}\n  }\n\n\n  &.deviceMobile.portrait {\n\tdiv.modal.player_share .modal-dialog,\n\tdiv.modal.error .modal-dialog,\n  \tdiv.modal.viewinvr .modal-dialog {\n\t  width: 95%;\n\t  .modal-content .modal-body .bootbox-body {\n\t\ta, article#shareDialog>section>input {\n\t\t  font-size: 120% !important;\n\t\t}\n\t  }\n\t  code {\n\t\tmax-width: 100%;\n\t  }\n\t}\n  }\n\n\n\n  &.withPlayerControls, &.modal-open {\n\theader {\n\t  pointer-events: none;\n\t}\n\tdiv.controls {\n\t  pointer-events: initial;\n\t}\n  }\n\n  #progressbar {\n\tposition: absolute;\n\ttop:45%;\n\tleft:50%;\n\twidth: 400px;\n\tmargin-left: -200px;\n  }\n\n  &.deviceMobile #progressbar {\n\twidth: 310px;\n\tmargin-left: -155px;\n  }\n\n  #drop-zone {\n\tdisplay: none;\n  }\n  &.dragentered #drop-zone {\n\tdisplay: block;\n  }\n  #drop-zone {\n\tpointer-events: initial;\n\tsvg {\n\t  @size: 180px;\n\t  position: absolute;\n\t  top: 45%;\n\t  left: 50%;\n\t  height: @size;\n\t  width: @size;\n\t  margin-left: -(@size/2);\n\t  margin-top: -(@size/2);\n\t}\n  }\n\n  #container360 {\n\tposition: fixed;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\tmargin:0; padding:0;\n\tfont-family: @font-family-sans-serif;\n\tz-index: 501;\n\theight: 100%;\n\twidth: auto;\n\tcolor: white;\n\tpointer-events: none;\n\t#logo360 {\n\t  font-weight: 900;\n\t  position: absolute;\n\t  top: 30px;\n\t  margin-top:0;\n\t  left: 30px;\n\t  font-size: 32px;\n\t  line-height: 1;\n\t  a {color: #fff; text-decoration: none; pointer-events: initial;}\n\t}\n\t#lander-header {\n\t  @lander-width: 680px;\n\t  font-size: 150%;\n\t  line-height: 1;\n\t  height: 7.5em;\n\t  width: @lander-width;\n\t  text-align: center;\n\t  position: absolute;\n\t  top: 45%;\n\t  left: 50%;\n\t  margin-left: -(@lander-width/2);\n\t  margin-top: -2em;\n\t  opacity: 1;\n\t  transition: opacity 0.2s;\n\t  h2 {\n\t\tmargin: -20px 0 22px 0;\n\t\tfont-size: 46px;\n\t\tletter-spacing: -0.5px;\n\t\tfont-weight: 700;\n\t  }\n\t  p {margin:15px auto;}\n\t}\n  }\n\n  &.firsttime #lander-header {display: block}\n  #lander-header {display: none}\n\n  #cancelbutton {\n\tpointer-events: initial;\n\tz-index: 100;\n\tdisplay: none;\n\tposition: absolute;\n\tleft: 50%;\n\ttop: 55%;\n\tmargin-left: -6ex;\n\tmargin-top: -20px;\n\twidth: 12ex;\n\t.roundbutton\n  }\n  &.uploading #cancelbutton {\n\tdisplay: block;\n  }\n\n\n  #drop-zone svg {\n\tpointer-events: none;\n  }\n\n  &.dragentered {\n\theader {\n\t  pointer-events: none;\n\t}\n\n\t#container360 #lander-header {\n\t  opacity: 0;\n\t}\n  }\n\n\n  &.withPlayerControls, &.deviceMobile, &.modal-open {\n\t#container360 {pointer-events: none;}\n\t#drop-zone {display: none;}\n  }\n\n  &.deviceMobile  {\n\t#logo360 {\n\t  left: 20px;\n\t}\n\n\t#container360 {\n\t  pointer-events: none;\n\t  #lander-header {\n\t\th2 { font-size: 24px; font-weight: 400 }\n\t  }\n\t}\n\t#drop-zone {\n\t  pointer-events: none;\n\t}\n  }\n\n  #drop-zone {\n\tposition: fixed;\n\ttop:0;\n\tbottom:0;\n\tleft:0;\n\tright:0;\n\theight: 100%;\n\tz-index: 200;\n\tbackground: rgba(0,0,0,0.3);\n\topacity: 0;\n  }\n  &.dragentered #drop-zone {\n\topacity: 1;\n  }\n\n  #threesixty-image-input {\n\theight: 1px;\n\twidth: 1px;\n\toverflow: hidden;\n\topacity: 0;\n\toutline: 0 !important;\n  }\n\n  #playerpage {\n\tposition: fixed;\n\ttop:0;\n\tleft:0;\n\tbottom:0;\n\tright:0;\n\theight: 100%;\n  }\n\n  #playerpage header {\n\tmargin: 0;\n\tpadding:0;\n\tborder-radius: 0;\n\tz-index: 300;\n\t>div {\n\n\t  position: absolute;\n\t}\n\tdiv.controls {\n\t  position: absolute;\n\t  top: 10px;\n\t  right: @controls-right;\n\t  width: 400px;\n\t  bottom: auto;\n\t  left: auto;\n\t  margin-top: 0;\n\t}\n\th2#graph_heading {\n\t  display: none;\n\t}\n\tbutton.svg, a.btn.svg {\n\t  background: none;\n\t  position: relative;\n\t  height: 70px;\n\t  span {\n\t\tdisplay: none;\n\t\tposition: absolute;\n\t\tbottom: 5px;\n\t\tleft: 0;\n\t\tright: 0;\n\t\theight: 1em;}\n\t  svg {\n\t\tstroke-width: 1.5px;\n\t\tstroke: white;\n\t\tfill: none;\n\t\topacity: 0.9;\n\t  }\n\t  &:hover {\n\t\tcolor: white;\n\t\tsvg {\n\t\t  stroke: white;\n\t\t  use {\n\t\t\tstroke: white;\n\t\t  }\n\t\t}\n\t  }\n\t}\n  }\n}\n\nbody.deviceDesktop #playerpage header div.controls {\n  button, a.btn {\n\t&:hover span {\n\t  display: inline;\n\t}\n  }\n}\n\n\nbody #playerpage header div.controls {\n  button, a.btn {\n\ttransition: bottom;\n\ttransition-duration: 0.2s;\n\ttransition-delay: 0s;\n  }\n}\n\nbody.b360.withPlayerControls #playerpage header div.controls {\n  button {\n\tbottom: 0;\n  }\n}\n\nbody.b360, body.b360.uploading {\n  #playerpage header div.controls button {\n\tbottom: 120px;\n  }\n}\nbody.b360.uploading {\n  button#uploadbutton {display: none}\n}\n\nbody.b360 {\n  &.deviceMobile, &.layoutMobile {\n\t#playerpage header {\n\t  div.controls {\n\t\ttop: auto;\n\t\tleft: auto;\n\t\tright: auto;\n\t\tbottom: 5px;\n\t\twidth: 100%;\n\t  }\n\t}\n  }\n}\n\nbody.b360 {\n  &.deviceMobile, &.layoutMobile {\n\t#playerpage header div.controls {\n\t  button {\n\t\tbottom: -120px;\n\t  }\n\t}\n\t&.withPlayerControls #playerpage header div.controls {\n\t  button {\n\t\tbottom: 0;\n\t  }\n\t}\n  }\n}"
  },
  {
    "path": "less/tree.less",
    "content": "\n.tree-sub\n{\n\tpadding: 0px;\n\tpadding-left: 15px;\n}\n\n.tree-handle\n{\n\twidth: 16px;\n\theight: 12px;\n\tdisplay: block;\n\tfloat: left;\n\tposition: relative;\n\ttop: 3px;\n\tpadding: 0px;\n\tmargin: 0px;\n\tmargin-left: -40px;\n\tbackground-clip: content-box;\n\tcursor: pointer;\n}\n\n.tree-item:hover\n{\n\tbackground-color: #444;\n\tcolor: #aaa;\n\tcursor: pointer;\n}\n\n.tree-name\n{\n\tfloat: clear;\n\twhite-space: nowrap;\n\tposition: relative;\n\ttop: 0px;\n\tleft: -26px;\n\tmargin: 0px;\n\tpadding: 2px 6px 2px 4px;\n\tcursor: default;\n}\n\n.tree-item\n{\n\tfloat: break;\n\twhite-space: nowrap;\n\tdisplay: table;\n\tmargin: 0px;\n\tmargin-left: -10px;\n\tpadding: 1px 4px 1px 4px;\n\tcursor: default;\n}\n\n.tree-active\n{\n\tbackground-color: #444;\n\tcolor: #aaa;\n}\n\n.tree-dupe\n{\n\tbackground-color: #433;\n\tcolor: #fff;\n}\n\n.tree-drag\n{\n\tposition: absolute;\n\tz-index: 11000;\n\tbackground-color: #fff;\n\tpointer-events: none;\n}\n\n.tree-drag-sub\n{\n\tborder: 1px solid #888;\n\tpadding-left: 50px;\n}\n\n.tree-drag-item\n{\n\tborder: none;\n\tpadding-left: 0px;\n}\n\n.tree-drag-indicator\n{\n}\n\n"
  },
  {
    "path": "less/userpulldown.less",
    "content": "@default-pulldown-bg: #232333;\n@editor-pulldown-bg: @bg-light;\n@default-pulldown-link: #bbb;\n@editor-pulldown-link: #afbfdf;\n\n#btn-account-top {\n  outline: none;\n  border: 0;\n  #userpulldownUsername {\n    line-height: 24px;\n  }\n}\n\nbody:not(.bEditor) #btn-account-top {\n  display: inline-flex;\n}\n\nbody.bEditor #btn-account-top {\n  flex-direction: column;\n}\n\n#userpulldowncontainer:before {\n  border-top: 1px solid @bg-lightest;\n  border-left: 1px solid @bg-lightest;\n  background: @default-pulldown-bg;\n  width: 12px;\n  height: 12px;\n  display: block;\n  float:right;\n  position: relative;\n  right: 11px;\n  top: -7px;\n  content: \" \";\n  transform: rotateZ(45deg);\n}\n\n\n#userpulldowncontainer {\n  position: absolute;\n  right: 0;\n  border-radius: 4px;\n  box-shadow: 0 2px 10px rgba(0,0,0,0.2);\n  width: 160px;\n  z-index: 1000;\n  background: #232333;\n  border:1px solid @bg-lightest;\n  padding: 0;\n  text-align: left;\n  ul {\n\tpadding: 8px 0;\n\tmargin: 0;\n  }\n  li {\n\tline-height: 2;\n  }\n  a {\n\ttext-decoration: none;\n\tdisplay: block;\n\tpadding: 5px 20px;\n\tcolor: @default-pulldown-link;\n\t&:hover {\n\t  background: @bg-bright;\n\t  color: white;\n\t}\n  }\n}\n\n\n.top-userpic {\n    display: inline-block;\n    width: 24px;\n    height: 24px;\n    position: relative;\n    img {\n        width: 24px;\n        height: auto;\n        margin: -12px 0  0 -12px;\n        position: absolute;\n        left: 50%;\n        top: 50%;\n        padding: 0;\n        border: 0 none;\n        border-radius: 100%;\n    }\n}\n\n\nbody.bEditor #account .top-userpic {\n  width: 32px;\n  height: 32px;\n  line-height: 32px;\n  margin: 10px auto -1px;\n}\n\nheader nav li.account {\n  z-index: 100;\n  position: relative;\n  .top-userpic {\n\tmargin-top:0;\n  }\n}\n\nbody.bEditor {\n  #userpulldowncontainer:before {\n    background: @editor-pulldown-bg;\n  }\n  #userpulldowncontainer {\n    top: 74px;\n    background: @editor-pulldown-bg;\n    a {\n      color: @editor-pulldown-link;\n    }\n  }\n  header nav li.account {\n    max-width: 58px;\n  }\n  .top-userpic {\n    display: block;\n    margin: 15px auto 6px;\n    overflow: hidden;\n  }\n}\n\nbody.bMain {\n  #userpulldowncontainer {\n    top: 100%; // start from around bottom of container\n    margin-top:10px;\n  }\n  #btn-account-top {\n    padding-top:0;\n    padding-bottom: 0;\n    padding-right: 0;\n  }\n  header nav li.account {\n    min-width: 72px;\n    max-width: 240px;\n    text-align: right;\n  }\n  .top-userpic {\n    vertical-align: middle;\n    margin-right: 5px;\n  }\n}"
  },
  {
    "path": "less/variables.less",
    "content": "// Slate 3.3.1\n// Variables\n// --------------------------------------------------\n\n@left-cell-width: 220px;\n@mid-cell-width: 550px;\n@right-cell-width: 268px;\n\n@tablet:      ~\"only screen and (min-width: 720px) and (max-width: 1150px)\";\n@desktop:     ~\"only screen and (min-width: 1150px) and (max-width: 1279px)\";\n@desktop-l:  ~\"only screen and (min-width: 1280px) and (max-width: 1599px)\";\n@desktop-xl:  ~\"only screen and (min-width: 1600px)\";\n\n@share-color-text: #eee;\n@share-bgcolor-text: #ddd;\n@share-border-radius: 4px;\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n@gray-base:              #222;\n@gray-darker:            #222;\n@gray-dark:              #333;\n@gray-soft:              #444;\n@gray:                   #555;\n@gray-light:             #aaa;\n@gray-lighter:           #eee;\n\n@auxiliary-color-first: yellow;\n\n@color-action:\t\t\t#0597cd;\n@brand-primary:         #4292c4;\n@brand-success:         #575;\n@brand-info:            #667;\n@brand-warning:         lighten(@brand-primary, 3%);\n@brand-danger:          #f88;\n@orange:\t\t\t\trgb(236,157,1);\n@alt:\t\t\t\t\t@orange;\n@message-warn:\t\t\t@alt;\n\n@bg-bright:             #0597cd;\n@bg-lighter:            #2B3142;\n@bg-lightest:           lighten(@bg-lighter, 15%);\n@bg-light:              #262c3d;\n@bg-dark:               #1f2331;\n@bg-darker:             #1e2331;\n\n@editor-text-default:   #7e8dab;\n@editor-text-hover:     #afbfdf;\n@editor-text-active:    #ffffff;\n@editor-text-current:   #637088;\n@editor-text-inactive:  #515c75;\n@tab-text-inactive:     #909fb9;\n@selected-bg:           #05516d;\n\n@chat-text-color:       #BCCBE5;\n\n@device-def-bg:         #263e63;\n@device-def-color:      #ffffff;\n@device-header-def-bg:  #4d7dc2;\n@dev-head-button-bg:    #385a8a;\n\n// dimensions\n@menu-bar-height:       70px;\n@bottom-panel-height:   44px;\n@row2-height:\t\t\t26px;\n@breadcrumb-height:     @row2-height;\n\n@height-editor-header:\t@menu-bar-height + @row2-height;\n@height-editor-footer:\t@bottom-panel-height;\n\n@floating-box-width:    252px;\n@scrollbar:             18px;\n\n@chat-width:            252px;\n@chat-height:           387px;\n@chat-composer-height:  40px;\n@chat-nav-height:       36px;\n\n@drag-helper-height:    14px;\n@blocks-header-height:  37px;\n@device-header-height:  32px;\n\n@searchbox-height:      40px;\n@modal-input-height:    50px;\n\n@tabs-font-size:        13px;\n\n\n//== Scaffolding\n//\n//## Settings for some of the most global styles.\n\n//** Background color for `<body>`.\n@body-bg:               @gray-darker;\n//** Global text color on `<body>`.\n@text-color:            #aaa;\n\n//** Global textual link color.\n@link-color:            #ccc;\n//** Link hover color set via `darken()` function.\n@link-hover-color:      #fff;\n//** Link hover decoration.\n@link-hover-decoration: underline;\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n@font-family-sans-serif:  \"Source Sans Pro\", \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n@font-family-serif:       Georgia, \"Times New Roman\", Times, serif;\n//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.\n@font-family-monospace:   Menlo, Monaco, Consolas, \"Courier New\", monospace;\n@font-family-base:        @font-family-sans-serif;\n\n@font-size-base:          12px;\n@font-size-large:         ceil((@font-size-base * 1.25)); // ~18px\n@font-size-small:         ceil((@font-size-base * 0.85)); // ~12px\n\n@font-size-h1:            floor((@font-size-base * 2.6)); // ~36px\n@font-size-h2:            floor((@font-size-base * 2.15)); // ~30px\n@font-size-h3:            ceil((@font-size-base * 1.7)); // ~24px\n@font-size-h4:            ceil((@font-size-base * 1.25)); // ~18px\n@font-size-h5:            @font-size-base;\n@font-size-h6:            ceil((@font-size-base * 0.85)); // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n@line-height-base:        1.33; // 1.428571429; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n@line-height-computed:    floor((@font-size-base * @line-height-base)); // ~20px\n\n@line-height-large:       1.33;\n@line-height-small:       1.66;\n\n\n//** By default, this inherits from the `<body>`.\n@headings-font-family:    @font-family-base;\n@headings-font-weight:    500;\n@headings-line-height:    1.1;\n@headings-color:          inherit;\n\n\n//== Iconography\n//\n//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.\n\n//** Load fonts from this directory.\n@icon-font-path:          \"../fonts/\";\n//** File name for all font files.\n@icon-font-name:          \"glyphicons-halflings-regular\";\n//** Element ID within SVG icon file.\n@icon-font-svg-id:        \"glyphicons_halflingsregular\";\n\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n@padding-base-vertical:     8px;\n@padding-base-horizontal:   12px;\n\n@padding-large-vertical:    14px;\n@padding-large-horizontal:  16px;\n\n@padding-small-vertical:    5px;\n@padding-small-horizontal:  10px;\n\n@padding-xs-vertical:       1px;\n@padding-xs-horizontal:     5px;\n\n@border-radius-base:        4px;\n@border-radius-large:       6px;\n@border-radius-small:       3px;\n\n//** Global color for active items (e.g., navs or dropdowns).\n@component-active-color:    #aaa;\n//** Global background color for active items (e.g., navs or dropdowns).\n@component-active-bg:       transparent;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n@caret-width-base:          4px;\n//** Carets increase slightly in size for larger components.\n@caret-width-large:         5px;\n\n\n//== Tables\n//\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n//** Padding for `<th>`s and `<td>`s.\n@table-cell-padding:            8px;\n//** Padding for cells in `.table-condensed`.\n@table-condensed-cell-padding:  5px;\n\n//** Default background color used for all tables.\n@table-bg:                      @bg-light;\n//** Background color used for `.table-striped`.\n@table-bg-accent:               @bg-light;\n//** Background color used for `.table-hover`.\n@table-bg-hover:                @bg-light;\n@table-bg-active:               @bg-light;\n\n//** Border color for table and cell borders.\n@table-border-color:            @bg-darker;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n@btn-font-weight:                normal;\n\n@btn-default-color:              @gray-light;\n@btn-default-bg:                 @gray-dark;\n@btn-default-border:             @btn-default-bg;\n\n@btn-primary-color:              @gray-lighter;\n@btn-primary-bg:                 @brand-primary;\n@btn-primary-border:             @btn-primary-bg;\n\n@btn-success-color:              @btn-default-color;\n@btn-success-bg:                 @brand-success;\n@btn-success-border:             @btn-success-bg;\n\n@btn-info-color:                 @btn-default-color;\n@btn-info-bg:                    @brand-info;\n@btn-info-border:                @btn-info-bg;\n\n@btn-warning-color:              @btn-default-color;\n@btn-warning-bg:                 @brand-warning;\n@btn-warning-border:             @btn-warning-bg;\n\n@btn-danger-color:               @btn-default-color;\n@btn-danger-bg:                  @brand-danger;\n@btn-danger-border:              @btn-danger-bg;\n\n@btn-link-disabled-color:        @gray-light;\n\n\n//== Forms\n//\n//##\n\n//** `<input>` background color\n@input-bg:                       #fff;\n//** `<input disabled>` background color\n@input-bg-disabled:              @gray-lighter;\n\n//** Text color for `<input>`s\n@input-color:                    @gray-darker;\n//** `<input>` border color\n@input-border:                   #ccc;\n\n// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4\n//** Default `.form-control` border radius\n@input-border-radius:            @border-radius-base;\n//** Large `.form-control` border radius\n@input-border-radius-large:      @border-radius-large;\n//** Small `.form-control` border radius\n@input-border-radius-small:      @border-radius-small;\n\n//** Border color for inputs on focus\n@input-border-focus:             #66afe9;\n\n//** Placeholder text color\n@input-color-placeholder:        @gray-light;\n\n//** Default `.form-control` height\n@input-height-base:              (@line-height-computed + (@padding-base-vertical * 2) + 2);\n//** Large `.form-control` height\n@input-height-large:             (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2);\n//** Small `.form-control` height\n@input-height-small:             (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2);\n\n@legend-color:                   @text-color;\n@legend-border-color:            darken(@gray-darker, 5%);\n\n//** Background color for textual input addons\n@input-group-addon-bg:           @gray-lighter;\n//** Border color for textual input addons\n@input-group-addon-border-color: @input-border;\n\n//** Disabled cursor for form controls and buttons.\n@cursor-disabled:                not-allowed;\n\n\n//== Dropdowns\n//\n//## Dropdown menu container and contents.\n\n//** Background for the dropdown menu.\n@dropdown-bg:                    @gray-dark;\n//** Dropdown menu `border-color`.\n@dropdown-border:                rgba(0,0,0,.15);\n//** Dropdown menu `border-color` **for IE8**.\n@dropdown-fallback-border:       @gray-darker;\n//** Divider color for between dropdown items.\n@dropdown-divider-bg:            @gray-darker;\n\n//** Dropdown link text color.\n@dropdown-link-color:            @text-color;\n//** Hover color for dropdown links.\n@dropdown-link-hover-color:      #fff;\n//** Hover background for dropdown links.\n@dropdown-link-hover-bg:         @gray-darker;\n\n//** Active dropdown menu item text color.\n@dropdown-link-active-color:     #fff;\n//** Active dropdown menu item background color.\n@dropdown-link-active-bg:        @gray-darker;\n\n//** Disabled dropdown menu item background color.\n@dropdown-link-disabled-color:   @gray-light;\n\n//** Text color for headers within dropdown menus.\n@dropdown-header-color:          @gray-light;\n\n//** Deprecated `@dropdown-caret-color` as of v3.1.0\n@dropdown-caret-color:           #000;\n\n\n//-- Z-index master list\n//\n// Warning: Avoid customizing these values. They're used for a bird's eye view\n// of components dependent on the z-axis and are designed to all work together.\n//\n// Note: These variables are not generated into the Customizer.\n\n@zindex-navbar:            1000;\n@zindex-dropdown:          1000;\n@zindex-popover:           1060;\n@zindex-tooltip:           1070;\n@zindex-navbar-fixed:      1030;\n@zindex-modal:             1040;\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes.\n\n// Extra small screen / phone\n//** Deprecated `@screen-xs` as of v3.0.1\n@screen-xs:                  480px;\n//** Deprecated `@screen-xs-min` as of v3.2.0\n@screen-xs-min:              @screen-xs;\n//** Deprecated `@screen-phone` as of v3.0.1\n@screen-phone:               @screen-xs-min;\n\n// Small screen / tablet\n//** Deprecated `@screen-sm` as of v3.0.1\n@screen-sm:                  768px;\n@screen-sm-min:              @screen-sm;\n//** Deprecated `@screen-tablet` as of v3.0.1\n@screen-tablet:              @screen-sm-min;\n\n// Medium screen / desktop\n//** Deprecated `@screen-md` as of v3.0.1\n@screen-md:                  992px;\n@screen-md-min:              @screen-md;\n//** Deprecated `@screen-desktop` as of v3.0.1\n@screen-desktop:             @screen-md-min;\n\n// Large screen / wide desktop\n//** Deprecated `@screen-lg` as of v3.0.1\n@screen-lg:                  1200px;\n@screen-lg-min:              @screen-lg;\n//** Deprecated `@screen-lg-desktop` as of v3.0.1\n@screen-lg-desktop:          @screen-lg-min;\n\n// So media queries don't overlap when required, provide a maximum\n@screen-xs-max:              (@screen-sm-min - 1);\n@screen-sm-max:              (@screen-md-min - 1);\n@screen-md-max:              (@screen-lg-min - 1);\n\n\n//== Grid system\n//\n//## Define your custom responsive grid.\n\n//** Number of columns in the grid.\n@grid-columns:              12;\n//** Padding between columns. Gets divided in half for the left and right.\n@grid-gutter-width:         30px;\n// Navbar collapse\n//** Point at which the navbar becomes uncollapsed.\n@grid-float-breakpoint:     @screen-sm-min;\n//** Point at which the navbar begins collapsing.\n@grid-float-breakpoint-max: (@grid-float-breakpoint - 1);\n\n\n//== Container sizes\n//\n//## Define the maximum width of `.container` for different screen sizes.\n\n// Small screen / tablet\n@container-tablet:             (720px + @grid-gutter-width);\n//** For `@screen-sm-min` and up.\n@container-sm:                 @container-tablet;\n\n// Medium screen / desktop\n@container-desktop:            (940px + @grid-gutter-width);\n//** For `@screen-md-min` and up.\n@container-md:                 @container-desktop;\n\n// Large screen / wide desktop\n@container-large-desktop:      (1140px + @grid-gutter-width);\n//** For `@screen-lg-min` and up.\n@container-lg:                 @container-large-desktop;\n\n\n//== Navbar\n//\n//##\n\n// Basics of a navbar\n@navbar-height:                    50px;\n@navbar-margin-bottom:             @line-height-computed;\n@navbar-border-radius:             @border-radius-base;\n@navbar-padding-horizontal:        floor((@grid-gutter-width / 2));\n@navbar-padding-vertical:          ((@navbar-height - @line-height-computed) / 2);\n@navbar-collapse-max-height:       340px;\n\n@navbar-default-color:             @text-color;\n@navbar-default-bg:                @gray-dark;\n@navbar-default-border:            darken(@navbar-default-bg, 6.5%);\n\n// Navbar links\n@navbar-default-link-color:                @text-color;\n@navbar-default-link-hover-color:          #aaa;\n@navbar-default-link-hover-bg:             darken(@navbar-default-bg, 8%);\n@navbar-default-link-active-color:         #aaa;\n@navbar-default-link-active-bg:            darken(@navbar-default-bg, 8%);\n@navbar-default-link-disabled-color:       #ccc;\n@navbar-default-link-disabled-bg:          transparent;\n\n// Navbar brand label\n@navbar-default-brand-color:               @navbar-default-link-color;\n@navbar-default-brand-hover-color:         #aaa;\n@navbar-default-brand-hover-bg:            none;\n\n// Navbar toggle\n@navbar-default-toggle-hover-bg:           darken(@navbar-default-bg, 8%);\n@navbar-default-toggle-icon-bar-bg:        @text-color;\n@navbar-default-toggle-border-color:       darken(@navbar-default-bg, 8%);\n\n\n// Inverted navbar\n// Reset inverted navbar basics\n@navbar-inverse-color:                      #ccc;\n@navbar-inverse-bg:                         @brand-primary;\n@navbar-inverse-border:                     darken(@navbar-inverse-bg, 10%);\n\n// Inverted navbar links\n@navbar-inverse-link-color:                 #ccc;\n@navbar-inverse-link-hover-color:           #aaa;\n@navbar-inverse-link-hover-bg:              darken(@navbar-inverse-bg, 12%);\n@navbar-inverse-link-active-color:          @navbar-inverse-link-hover-color;\n@navbar-inverse-link-active-bg:             darken(@navbar-inverse-bg, 12%);\n@navbar-inverse-link-disabled-color:        #ccc;\n@navbar-inverse-link-disabled-bg:           transparent;\n\n// Inverted navbar brand label\n@navbar-inverse-brand-color:                @navbar-inverse-link-color;\n@navbar-inverse-brand-hover-color:          #aaa;\n@navbar-inverse-brand-hover-bg:             none;\n\n// Inverted navbar toggle\n@navbar-inverse-toggle-hover-bg:            darken(@navbar-inverse-bg, 12%);\n@navbar-inverse-toggle-icon-bar-bg:         #aaa;\n@navbar-inverse-toggle-border-color:        darken(@navbar-inverse-bg, 12%);\n\n\n//== Navs\n//\n//##\n\n//=== Shared nav styles\n@nav-link-padding:                          10px 15px;\n@nav-link-hover-bg:                         lighten(@body-bg, 10%);\n\n@nav-disabled-link-color:                   @gray-light;\n@nav-disabled-link-hover-color:             @gray-light;\n\n//== Tabs\n@nav-tabs-border-color:                     darken(@gray-darker, 5%);\n\n@nav-tabs-link-hover-border-color:          darken(@gray-darker, 5%);\n\n@nav-tabs-active-link-hover-bg:             lighten(@body-bg, 10%);\n@nav-tabs-active-link-hover-color:          #aaa;\n@nav-tabs-active-link-hover-border-color:   darken(@gray-darker, 5%);\n\n@nav-tabs-justified-link-border-color:            @nav-tabs-border-color;\n@nav-tabs-justified-active-link-border-color:     @body-bg;\n\n//== Pills\n@nav-pills-border-radius:                   @border-radius-base;\n@nav-pills-active-link-hover-bg:            @component-active-bg;\n@nav-pills-active-link-hover-color:         @component-active-color;\n\n\n//== Pagination\n//\n//##\n\n@pagination-color:                     @link-color;\n@pagination-bg:                        @btn-default-bg;\n@pagination-border:                    rgba(0, 0, 0, 0.6);\n\n@pagination-hover-color:               @link-hover-color;\n@pagination-hover-bg:                  transparent;\n@pagination-hover-border:              rgba(0, 0, 0, 0.6);\n\n@pagination-active-color:              #aaa;\n@pagination-active-bg:                 darken(@pagination-bg, 10%);\n@pagination-active-border:             rgba(0, 0, 0, 0.6);\n\n@pagination-disabled-color:            @gray-light;\n@pagination-disabled-bg:               #aaa;\n@pagination-disabled-border:           rgba(0, 0, 0, 0.6);\n\n\n//== Pager\n//\n//##\n\n@pager-bg:                             @pagination-bg;\n@pager-border:                         @pagination-border;\n@pager-border-radius:                  15px;\n\n@pager-hover-bg:                       @pagination-hover-bg;\n\n@pager-active-bg:                      @pagination-active-bg;\n@pager-active-color:                   @pagination-active-color;\n\n@pager-disabled-color:                 @gray-light;\n\n\n//== Jumbotron\n//\n//##\n\n@jumbotron-padding:              30px;\n@jumbotron-color:                inherit;\n@jumbotron-bg:                   darken(@body-bg, 5%);\n@jumbotron-heading-color:        inherit;\n@jumbotron-font-size:            ceil((@font-size-base * 1.5));\n\n\n//== Form states and alerts\n//\n//## Define colors for form feedback states and, by default, alerts.\n\n@state-success-text:             #aaa;\n@state-success-bg:               @brand-success;\n@state-success-border:           darken(spin(@state-success-bg, -10), 5%);\n\n@state-info-text:                #aaa;\n@state-info-bg:                  @brand-info;\n@state-info-border:              darken(spin(@state-info-bg, -10), 7%);\n\n@state-warning-text:             #aaa;\n@state-warning-bg:               @brand-warning;\n@state-warning-border:           darken(spin(@state-warning-bg, -10), 3%);\n\n@state-danger-text:              #aaa;\n@state-danger-bg:                @brand-danger;\n@state-danger-border:            darken(spin(@state-danger-bg, -10), 3%);\n\n\n//== Tooltips\n//\n//##\n\n//** Tooltip max width\n@tooltip-max-width:           200px;\n//** Tooltip text color\n@tooltip-color:               #000;\n//** Tooltip background color\n@tooltip-bg:                  @auxiliary-color-first;\n@tooltip-opacity:             .9;\n\n//** Tooltip arrow width\n@tooltip-arrow-width:         5px;\n//** Tooltip arrow color\n@tooltip-arrow-color:         @tooltip-bg;\n\n//== Notifications\n\n@msg-width: 320px;\n@msg-min-height: 70px;\n@msg-text-bg: #2d4f77;\n@msg-glyph-bg: #385a8a;\n@msg-text-color: #fff;\n@msg-warning-color: #ef4835;\n\n//== Popovers\n//\n//##\n\n//** Popover body background color\n@popover-bg:                          lighten(@body-bg, 3%);\n//** Popover maximum width\n@popover-max-width:                   276px;\n//** Popover border color\n@popover-border-color:                rgba(0,0,0,.2);\n//** Popover fallback border color\n@popover-fallback-border-color:       #999;\n\n//** Popover title background color\n@popover-title-bg:                    @popover-bg;\n\n//** Popover arrow width\n@popover-arrow-width:                 10px;\n//** Popover arrow color\n@popover-arrow-color:                 @popover-bg;\n\n//** Popover outer arrow width\n@popover-arrow-outer-width:           (@popover-arrow-width + 1);\n//** Popover outer arrow color\n@popover-arrow-outer-color:           fadein(@popover-border-color, 5%);\n//** Popover outer arrow fallback color\n@popover-arrow-outer-fallback-color:  darken(@popover-fallback-border-color, 20%);\n\n\n//== Labels\n//\n//##\n\n//** Default label background color\n@label-default-bg:            @btn-default-bg;\n//** Primary label background color\n@label-primary-bg:            @brand-primary;\n//** Success label background color\n@label-success-bg:            @brand-success;\n//** Info label background color\n@label-info-bg:               @brand-info;\n//** Warning label background color\n@label-warning-bg:            @brand-warning;\n//** Danger label background color\n@label-danger-bg:             @brand-danger;\n\n//** Default label text color\n@label-color:                 #aaa;\n//** Default text color of a linked label\n@label-link-hover-color:      #aaa;\n\n\n//== Modals\n//\n//##\n\n//** Padding applied to the modal body\n@modal-inner-padding:         20px;\n\n//** Padding applied to the modal title\n@modal-title-padding:         15px;\n//** Modal title line-height\n@modal-title-line-height:     @line-height-base;\n\n//** Background color of modal content area\n@modal-content-bg:                             lighten(@body-bg, 3%);\n//** Modal content border color\n@modal-content-border-color:                   rgba(0,0,0,.2);\n//** Modal content border color **for IE8**\n@modal-content-fallback-border-color:          #999;\n\n//** Modal backdrop background color\n@modal-backdrop-bg:           #000;\n//** Modal backdrop opacity\n@modal-backdrop-opacity:      .5;\n//** Modal header border color\n@modal-header-border-color:   darken(@gray-darker, 5%);\n//** Modal footer border color\n@modal-footer-border-color:   @modal-header-border-color;\n\n@modal-lg:                    900px;\n@modal-md:                    600px;\n@modal-sm:                    300px;\n\n@modal-sign-width:            400px;\n@modal-sign-padding:          40px;\n@modal-input-width:           @modal-sign-width - (@modal-sign-padding * 2);\n@modal-control-height:       50px;\n\n\n//== Alerts\n//\n//## Define alert colors, border radius, and padding.\n\n@alert-padding:               15px;\n@alert-border-radius:         @border-radius-base;\n@alert-link-font-weight:      bold;\n\n@alert-success-bg:            @state-success-bg;\n@alert-success-text:          @state-success-text;\n@alert-success-border:        @state-success-border;\n\n@alert-info-bg:               @state-info-bg;\n@alert-info-text:             @state-info-text;\n@alert-info-border:           @state-info-border;\n\n@alert-warning-bg:            @state-warning-bg;\n@alert-warning-text:          @state-warning-text;\n@alert-warning-border:        @state-warning-border;\n\n@alert-danger-bg:             @state-danger-bg;\n@alert-danger-text:           @state-danger-text;\n@alert-danger-border:         @state-danger-border;\n\n\n//== Progress bars\n//\n//##\n\n//** Background color of the whole progress component\n@progress-bg:                 darken(@body-bg, 5%);\n//** Progress bar text color\n@progress-bar-color:          #aaa;\n//** Variable for setting rounded corners on progress bar.\n@progress-border-radius:      @border-radius-base;\n\n//** Default progress bar color\n@progress-bar-bg:             @brand-primary;\n//** Success progress bar color\n@progress-bar-success-bg:     @brand-success;\n//** Warning progress bar color\n@progress-bar-warning-bg:     @brand-warning;\n//** Danger progress bar color\n@progress-bar-danger-bg:      @brand-danger;\n//** Info progress bar color\n@progress-bar-info-bg:        @brand-info;\n\n\n//== List group\n//\n//##\n\n//** Background color on `.list-group-item`\n@list-group-bg:                 lighten(@body-bg, 5%);\n//** `.list-group-item` border color\n@list-group-border:             rgba(0, 0, 0, 0.6);\n//** List group border radius\n@list-group-border-radius:      @border-radius-base;\n\n//** Background color of single list items on hover\n@list-group-hover-bg:           lighten(@body-bg, 10%);\n//** Text color of active list items\n@list-group-active-color:       @component-active-color;\n//** Background color of active list items\n@list-group-active-bg:          lighten(@body-bg, 10%);\n//** Border color of active list elements\n@list-group-active-border:      @list-group-border;\n//** Text color for content within active list items\n@list-group-active-text-color:  lighten(@list-group-active-bg, 40%);\n\n//** Text color of disabled list items\n@list-group-disabled-color:      @gray-light;\n//** Background color of disabled list items\n@list-group-disabled-bg:         @gray-lighter;\n//** Text color for content within disabled list items\n@list-group-disabled-text-color: @list-group-disabled-color;\n\n@list-group-link-color:         @text-color;\n@list-group-link-hover-color:   @list-group-link-color;\n@list-group-link-heading-color: #fff;\n\n\n//== Panels\n//\n//##\n\n@panel-bg:                    @bg-light;\n@panel-body-padding:          15px;\n@panel-heading-padding:       10px 15px;\n@panel-footer-padding:        @panel-heading-padding;\n@panel-border-radius:         @border-radius-base;\n\n//** Border color for elements within panels\n@panel-inner-border:          rgba(0, 0, 0, 0.6);\n@panel-footer-bg:             @bg-dark;\n\n@panel-default-text:          @editor-text-default;\n@panel-default-border:        rgba(0, 0, 0, 0.6);\n@panel-default-heading-bg:    @bg-light;\n\n@panel-primary-text:          #fff;\n@panel-primary-border:        @bg-darker;\n@panel-primary-heading-bg:    @bg-light;\n\n@panel-success-text:          @state-success-text;\n@panel-success-border:        @panel-default-border;\n@panel-success-heading-bg:    @state-success-bg;\n\n@panel-info-text:             @state-info-text;\n@panel-info-border:           @panel-default-border;\n@panel-info-heading-bg:       @state-info-bg;\n@panel-heading-bg-color:      @bg-light;\n\n@panel-warning-text:          @state-warning-text;\n@panel-warning-border:        @panel-default-border;\n@panel-warning-heading-bg:    @state-warning-bg;\n\n@panel-danger-text:           @state-danger-text;\n@panel-danger-border:         @panel-default-border;\n@panel-danger-heading-bg:     @state-danger-bg;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n@thumbnail-padding:           4px;\n//** Thumbnail background color\n@thumbnail-bg:                darken(@body-bg, 5%);\n//** Thumbnail border color\n@thumbnail-border:            darken(@thumbnail-bg, 7%);\n//** Thumbnail border radius\n@thumbnail-border-radius:     @border-radius-base;\n\n//** Custom text color for thumbnail captions\n@thumbnail-caption-color:     @text-color;\n//** Padding around the thumbnail caption\n@thumbnail-caption-padding:   9px;\n\n\n//== Wells\n//\n//##\n\n@well-bg:                     @thumbnail-bg;\n@well-border:                 @thumbnail-border;\n\n\n//== Badges\n//\n//##\n\n@badge-color:                 #fff;\n//** Linked badge text color on hover\n@badge-link-hover-color:      #fff;\n@badge-bg:                    @gray-light;\n\n//** Badge text color in active nav link\n@badge-active-color:          @link-color;\n//** Badge background color in active nav link\n@badge-active-bg:             @gray-light;\n\n@badge-font-weight:           bold;\n@badge-line-height:           1;\n@badge-border-radius:         10px;\n\n\n//== Breadcrumbs\n//\n//##\n\n@breadcrumb-padding-vertical:   8px;\n@breadcrumb-padding-horizontal: 15px;\n//** Breadcrumb background color\n@breadcrumb-bg:                 transparent;\n//** Breadcrumb text color\n@breadcrumb-color:              #ccc;\n//** Text color of current page in the breadcrumb\n@breadcrumb-active-color:       @gray-light;\n//** Textual separator for between breadcrumb elements\n@breadcrumb-separator:          \"/\";\n\n\n//== Carousel\n//\n//##\n\n@carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6);\n\n@carousel-control-color:                      #fff;\n@carousel-control-width:                      15%;\n@carousel-control-opacity:                    .5;\n@carousel-control-font-size:                  20px;\n\n@carousel-indicator-active-bg:                #fff;\n@carousel-indicator-border-color:             #fff;\n\n@carousel-caption-color:                      #fff;\n\n\n//== Close\n//\n//##\n\n@close-font-weight:           bold;\n@close-color:                 #000;\n@close-text-shadow:           0 1px 0 #fff;\n\n\n//== Code\n//\n//##\n\n@code-color:                  #c7254e;\n@code-bg:                     #f9f2f4;\n\n@kbd-color:                   #fff;\n@kbd-bg:                      #333;\n\n@pre-bg:                      #f5f5f5;\n@pre-color:                   @gray-dark;\n@pre-border-color:            #ccc;\n@pre-scrollable-max-height:   340px;\n\n\n//== Type\n//\n//##\n\n//** Horizontal offset for forms and lists.\n@component-offset-horizontal: 180px;\n//** Text muted color\n@text-muted:                  @gray-light;\n//** Abbreviations and acronyms border color\n@abbr-border-color:           @gray-light;\n//** Headings small color\n@headings-small-color:        @gray-light;\n//** Blockquote small color\n@blockquote-small-color:      @gray-light;\n//** Blockquote font size\n@blockquote-font-size:        (@font-size-base * 1.25);\n//** Blockquote border color\n@blockquote-border-color:     @gray-light;\n//** Page header border color\n@page-header-border-color:    darken(@gray-darker, 5%);\n//** Width of horizontal description list titles\n@dl-horizontal-offset:        @component-offset-horizontal;\n//** Horizontal line color.\n@hr-border:                   darken(@gray-darker, 5%);\n\n\n@bordercolor-launch-button: #fff;\n@font-weight-home:\t300;\n@font-weight-home-button: 400;\n@btn-border-radius-small: 6px;\n\n@bgcolor-home-button: darken(@bg-bright, 5%);\n@bgcolor-overlay: rgba(0,0,0,0.95);\n\n@color-formcontrol-home: #eee;\n@bordercolor-formcontrol-home: #aaa;\n\n@bgcolor-home-section1: rgb(47,146,238);\n@bgcolor-home-section2: rgb(28,128,221);\n@bgcolor-home-section3: rgb(20,114,201);\n@bgcolor-home-section4: rgb(15,97,173);\n@bgcolor-home-section5: rgb(5,73,140);\n@bgcolor-home-section6: rgb(38,44,61);\n\n@bgcolor-home-intro:\t\t@bgcolor-home-section1;\n@bgcolor-home-whyusevizor:\t@bgcolor-home-section2;\n@bgcolor-home-howitworks:\t@bgcolor-home-section3;\n@bgcolor-home-meettheteam:\t@bgcolor-home-section4;\n@bgcolor-home-getstarted:\t@bgcolor-home-section5;\n@bgcolor-home-footer:\t\t#171717;\n\n@color-placeholder-home:\trgba(200,200,200,1);\n@color-placeholder-home-dim:\trgba(150,150,150,0.5);\n\n@x-pad-col : 60px;\n\n@threshold-mobile: 550px;\n@threshold-tablet: 1025px;\n\n@max-width-desktop: 1080px;\n@max-width-tablet: 96%;\n@max-width-phone: 98%;\n\n@device-width-iPhoneSE: 320px;\n@device-height-iPhoneSE: 658px;\n@device-width-iPhone: 375px;\n@device-height-iPhone: 667px;\n@device-width-iPhonePlus: 414px;\n@device-height-iPhonePlus: 736px;\n\n"
  },
  {
    "path": "less/widgets/hideshow.less",
    "content": "*[data-hideshow='hide']:not([data-hideshow-target])\n{\n  display: none;\n}\n\n*[data-hideshow='show']:not([data-hideshow-target])\n{\n  display: block;\n}\n\n*.hideshow-inline[data-hideshow='show']:not([data-hideshow-target])\n{\n  display: inline;\n}\n\n*.hideshow-inline-block[data-hideshow='show']:not([data-hideshow-target])\n{\n  display: inline-block;\n}\n\n*.hideshow-flex[data-hideshow='show']:not([data-hideshow-target])\n{\n  display: flex;\n}"
  },
  {
    "path": "less/widgets/madeByVizor.less",
    "content": "/*** MADE WITH VIZOR ***/\n#madeByVizorWidget {\n  width: 180px;\n  font-weight: 600;\n  a:last-child {\n\ttext-align: right;\n\theight: 24px;\n\tfloat:right;\n\tline-height: 24px;\n\tmargin:0 5px 0 0;\n\toverflow: hidden;\n\t-webkit-font-smoothing: antialiased;\n  }\n  a {\n\tline-height: 24px;\n\tdisplay: block;\n\tcolor: #fff;\n\ttext-decoration: none;\n  }\n  a, a svg {\n\tborder: 0;\n\tpointer-events: initial;\n  }\n  a:last-child svg {\n\tdisplay: inline-block;\n\tvertical-align:middle;\n\tmargin: 0 0 5px 0;\n\tfill: #fff;\n  }\n  >a:first-child {\n\tfloat: right;\n\tpointer-events: initial;\n\t>svg {fill: #fff;  }\n  }\n}\n\n.deviceDesktop #madeByVizorWidget {\n  a:last-child {\n\twidth: 0;\n\ttransition: width 0.2s 0.3s, opacity 0.2s 0.3s, text-indent 0.2s 0.3s;\n  }\n  &:hover a:last-child {\n\twidth: 145px;\n\ttransition: width 0.15s 0s, opacity 0.15s 0s, text-indent 0.15s 0s;\n  }\n}\n/*** /made with Vizor ***/"
  },
  {
    "path": "less/widgets/minislides.less",
    "content": ".minislides {\n    position: relative;\n    overflow: hidden;\n    >.slides {\n        z-index: 1;\n        position:absolute;\n        left:0;\n        top:0;\n        bottom:0;\n        transition: left 0.3s;\n        &.horizontal {\n         >* {\n            position: relative;\n            float: left;\n         }\n         &.dragging {\n            transition: none;\n         }\n        }\n        &.crossfade {\n            width: 100%;\n            >* {\n                display: none;\n                position: absolute;\n                top: 0;\n                left: 0;\n                float: none;\n            }\n        }\n\t}\n\n  div.minislides-slideSwitcher {\n    position: absolute;\n    z-index: 5;\n    bottom: 20px;\n    left:0;\n    right:0;\n  }\n}\n\ndiv.minislides-slideSwitcher {\n  height: 20px;\n  text-align: center;\n  line-height: 14px;\n  >button {\n    vertical-align: middle;\n    background: none !important;\n    display: inline-block;\n    height: 14px;\n    width: 14px;\n    padding:0;\n    border-radius: 14px 14px !important;\n    border: 2px solid white;\n    transition: background @modal-welcome-transition-length;\n    body.deviceDesktop &:hover {\n      background: rgba(255,255,255,0.5);\n    }\n    &.selected {\n      background: white !important;\n    }\n  }\n  >button+button {margin-left: 7px;}\n}"
  },
  {
    "path": "less/widgets/pagination.less",
    "content": "div.pagination {\n  text-align: center;\n  margin: 35px 0;\n\n  a {\n\tdisplay: inline-block;\n\tline-height: 4ex;\n\tpadding: 0 5px;\n\tmargin: 0 5px;\n\tborder: 1px solid #c2c2c2;\n\tborder-radius: 2px 2px;\n\ttext-decoration: none;\n\tmin-width: 5ex;\n  }\n  a:first-of-type {\n\tmargin-left: 0;\n  }\n  a:last-of-type {\n\tmargin-right: 0;\n  }\n  a.current {\n\tborder:none;\n\tbackground: @bg-lightest;\n\tpointer-events: none;\n\tcolor: white;\n\t&.first, &.last {\n\t  display: none;\n\t}\n  }\n  @media screen and (max-width: @device-width-iPhone) {\n\ta:not(.current, .prev, .next), span.ellipsis {\n\t  display: none;\n\t}\n  }\n  &.loading {\n\ta.page.next {\n\t  pointer-events: none;\n\t  opacity: 0.5;\n\t}\n  }\n}\n\nsection.list div.pagination {margin:30px 0;}"
  },
  {
    "path": "less/widgets/tabbed.less",
    "content": "div.tabbed section {\n\tdisplay: none;\n}\n\ndiv.tabbed section[data-active=\"true\"] {\n\tdisplay: block;\n}\n\ndiv.tabbed section.tab-flex[data-active=\"true\"] {\n\tdisplay: flex;\n}\n\ndiv.tabbed nav a[data-active=\"true\"] {\n\n}"
  },
  {
    "path": "less/widgets/toggle.less",
    "content": "@toggle-rounded-width: 38px;\n@toggle-rounded-height: 18px;\n@toggle-rounded-small-width: 24px;\n@toggle-rounded-small-height: 14px;\n@toggle-rounded-colorChecked: @alt;\n@toggle-rounded-colorUnchecked: rgba(96,160,255,0.9);\n@toggle-rounded-colorCircle: #afbfdf;\n@toggle-rounded-monochrome-colorChecked: #afbfdf;\n@toggle-rounded-monochrome-colorUnchecked: #afbfdf;\n@toggle-rounded-monochrome-colorCircle: #000;\n\nlabel.toggleWrap{\n  margin: 0;\n  padding: 0;\n  text-align: center;\n}\n\n// checkbox-rounded-toggle\n// {{>toggle ...}}\n// <label><input id=\"publishPublic\" type=\"checkbox\" class=\"cb-rounded\" /><span><!-- firefox --></span></label>\n.toggle-rounded:focus, .toggle-rounded:active {\n\toutline: 0;\n}\n\nbody.uaFirefox input[type=checkbox].toggle-rounded {\n\tvisibility: hidden;\n}\n\nbody .toggle-rounded+span {\n  display: none;\n}\nbody.uaFirefox .toggle-rounded+span {\n  display: inline-block;\n  pointer-events: none;\n\n}\n.toggle-rounded, body.uaFirefox .toggle-rounded+span {\n\toutline: 0;\n\tvertical-align: -0.35em;\n\t-webkit-touch-callout: none;\n\t-webkit-appearance: none;\n\tappearance: none;\n\tborder: 0px solid #666;\n\tposition: relative;\n\ttransition: background-color 0.05s 0.05s ease-in;\n}\n\n.toggle-rounded::before, body.uaFirefox .toggle-rounded+span:before {\n\tcontent: \"\";\n\tborder-radius: 50%;\n\tdisplay: inline-block;\n\tposition: absolute;\n\ttop: 50%;\n\ttransition: left 0.12s linear;\n}\n\n.toggle-rounded:checked, .toggle-rounded.on,\nbody.uaFirefox .toggle-rounded:checked+span, body.uaFirefox .toggle-rounded.on+span {\n\ttransition: background-color 0.1s 0.03s ease-in;\n}\n\n\n/* COLORS */\n\n\n.toggle-rounded::before, body.uaFirefox .toggle-rounded+span:before {\n  background: @toggle-rounded-colorCircle;\n}\n.toggle-rounded, body.uaFirefox .toggle-rounded+span {\n  background: @toggle-rounded-colorUnchecked;\n}\n\n.toggle-rounded:checked, .toggle-rounded.on,\nbody.uaFirefox .toggle-rounded:checked+span, body.uaFirefox .toggle-rounded.on+span {\n  background: @toggle-rounded-colorChecked;\n}\n\n\n.toggle-rounded.monochrome::before, body.uaFirefox .toggle-rounded.monochrome+span:before {\n  background: @toggle-rounded-monochrome-colorCircle;\n}\n.toggle-rounded.monochrome, body.uaFirefox .toggle-rounded.monochrome+span {\n  background: @toggle-rounded-monochrome-colorUnchecked;\n}\n\n.toggle-rounded.monochrome:checked, .toggle-rounded.monochrome.on,\nbody.uaFirefox .toggle-rounded.monochrome:checked+span, body.uaFirefox .toggle-rounded.monochrome.on+span {\n  background: @toggle-rounded-monochrome-colorChecked;\n}\n\n// hover\n.toggle-rounded.monochrome:hover, body.uaFirefox .toggle-rounded.monochrome+span:hover {\n  background: white;\n}\n\n.toggle-rounded.monochrome:checked:hover, .toggle-rounded.monochrome.on:hover,\nbody.uaFirefox .toggle-rounded.monochrome:checked+span:hover, body.uaFirefox .toggle-rounded.monochrome.on+span:hover {\n  background: white;\n}\n\n\n\n/* DIMENSIONS */\n\n.toggle-rounded::before,\n.toggle-rounded.off:before,\nbody.uaFirefox .toggle-rounded+span:before,\nbody.uaFirefox .toggle-rounded.off+span:before {\n  left: @toggle-rounded-height / 2;\n}\n\n.toggle-rounded:checked::before,\n.toggle-rounded.on::before,\nbody.uaFirefox .toggle-rounded:checked+span:before,\nbody.uaFirefox .toggle-rounded.on+span:before {\n  left: @toggle-rounded-width - @toggle-rounded-height/2;\n}\n\nbody.uaFirefox .toggle-rounded+span {\n  margin-left: -@toggle-rounded-width;\n}\n.toggle-rounded,\nbody.uaFirefox .toggle-rounded+span {\n  width: @toggle-rounded-width;\n  height: @toggle-rounded-height;\n  border-radius: @toggle-rounded-height/2;\n}\n.toggle-rounded::before,\nbody.uaFirefox .toggle-rounded+span:before {\n  width: @toggle-rounded-height;\n  height: @toggle-rounded-height;\n  margin-left: -@toggle-rounded-height / 2;\n  margin-top: -@toggle-rounded-height / 2;\n}\n\n\n\n.toggle-rounded.small::before,\n.toggle-rounded.small.off:before,\nbody.uaFirefox .toggle-rounded.small+span:before,\nbody.uaFirefox .toggle-rounded.small.off+span:before {\n  left: @toggle-rounded-small-height / 2;\n}\n\n.toggle-rounded.small:checked::before,\n.toggle-rounded.small.on::before,\nbody.uaFirefox .toggle-rounded.small:checked+span:before,\nbody.uaFirefox .toggle-rounded.small.on+span:before {\n  left: @toggle-rounded-small-width - @toggle-rounded-small-height/2;\n}\n\nbody.uaFirefox .toggle-rounded.small+span {\n  margin-left: -@toggle-rounded-small-width;\n}\n.toggle-rounded.small,\nbody.uaFirefox .toggle-rounded.small+span {\n  width: @toggle-rounded-small-width;\n  height: @toggle-rounded-small-height;\n  border-radius: @toggle-rounded-small-height/2;\n}\n.toggle-rounded.small::before,\nbody.uaFirefox .toggle-rounded.small+span:before {\n  width: @toggle-rounded-small-height;\n  height: @toggle-rounded-small-height;\n  margin-left: -@toggle-rounded-small-height / 2;\n  margin-top: -@toggle-rounded-small-height / 2;\n}\n\n\n\n\n/* specifics */\n\narticle.card .toggle-rounded.monochrome, body.uaFirefox article.card .toggle-rounded+span {\n  transition: none;\n}\n\n\narticle.asset.card .toggle-rounded.monochrome::before,\nbody.uaFirefox article.asset.card .toggle-rounded.monochrome+span:before {\n  border: 4px solid @toggle-rounded-monochrome-colorChecked;\n}\narticle.asset.card .toggle-rounded.monochrome:hover::before,\nbody.uaFirefox article.asset.card .toggle-rounded.monochrome+span:hover::before {\n  border: 4px solid white;\n}\n"
  },
  {
    "path": "less/widgets/widgets.less",
    "content": "@import \"minislides\";\n@import \"madeByVizor\";\n@import \"toggle\";\n@import \"hideshow\";\n@import \"tabbed\";\n@import \"pagination\";"
  },
  {
    "path": "lib/cloudStorage.js",
    "content": "const fs = require('fs')\nconst when = require('when')\nconst Storage = require('@google-cloud/storage')\nconst secrets = require('../config/secrets')\nconst EventEmitter = require('events').EventEmitter\nconst nodefn = require('when/node')\nconst Readable = require('stream').Readable\nconst mime = require('mime')\nconst retry = require('retry')\n\nconst URL_HEAD = '/data'\nconst projectId = 'vizor-162112'\nconst bucketName = 'cdn.vizor.io'\n\nconst stripPath = (path) => { return path.substring(1) }\n\nclass CloudStorage extends EventEmitter {\n  constructor(gcs) {\n    super()\n\n    if (!gcs) {\n      this.connect()\n    } else {\n      this.gcs = gcs\n      process.nextTick(() => this.emit('ready'))\n    }\n  }\n\n  connect() {\n    let opts = {\n      projectId: projectId,\n    }\n\n    if (process.env.NODE_ENV !== 'production') {\n      opts.keyFilename = __dirname+'/../config/vizor-gcs.json'\n    }\n\n    this.gcs = new Storage(opts)\n\n    this.bucket = this.gcs.bucket(bucketName)\n    process.nextTick(() => this.emit('ready'))\n  }\n\n  close() {}\n\n  file(path) {\n    return this.bucket.file(stripPath(path))\n  }\n\n  exists(path) {\n    return this.file(path).exists()\n    .then(data => { return data[0] })\n  }\n\n  stat(path) {\n    return this.file(path).get()\n    .catch(() => { return undefined })\n    .then(data => { return data ? data[0] : undefined })\n  }\n\n  url(path) {\n    if (path.indexOf(URL_HEAD) === 0)\n      return path\n\n    return URL_HEAD + '/' + stripPath(path)\n  }\n\n  copy(src, path, metadata) {\n    return this.exists(path)\n    .then(exists => {\n      if (exists) {\n        console.log('  - GCS: Already exists: ', path)\n        return this.url(path)\n      }\n\n      return this.retry(() => {\n        return this.writeStream(fs.createReadStream(src), path, metadata)\n      })\n    })\n  }\n\n  retry(fn) {\n    const dfd = when.defer()\n    const op = retry.operation({\n      retries: 10,\n      factor: 2,\n      minTimeout: 1000,\n      maxTimeout: 60 * 1000,\n      randomize: true\n    })\n\n    op.attempt(currentAttempt => {\n      fn()\n      .then(result => dfd.resolve(result))\n      .catch(err => {\n        if (op.retry(err))\n          return console.log('    !! RETRYING', currentAttempt, err.code)\n\n        return dfd.reject(op.mainError())\n      })\n    })\n\n    return dfd.promise\n  }\n\n  writeStream(stream, path, metadata={}) {\n    const dfd = when.defer()\n\n    stream.pipe(this._createWriteStream(path, metadata.contentType))\n    .on('error', err => {\n      console.error('Failed to write file', err)\n      dfd.reject(err)\n    })\n    .on('finish', () => {\n      console.log('  -> Google Cloud Storage: ', path)\n      dfd.resolve(this.url(path))\n    })\n\n    return dfd.promise\n  }\n\n  move(src, path, metadata) {\n    return this.retry(() => {\n      return this.copy(src, path, metadata)\n    \t.then(function(url) {\n    \t\tfs.unlink(src)\n    \t\treturn url\n    \t})\n    })\n  }\n\n  unlink(path) {\n    return this.file(path).delete()\n  }\n\n  read(path) {\n    return this.file(path).createReadStream()\n  }\n\n  readString(path) {\n    const stream = this.read(path)\n    const dfd = when.defer()\n    let buf = ''\n\n    stream.on('data', d => buf += d.toString())\n    stream.on('error', err => dfd.reject(err))\n    stream.on('end', () => dfd.resolve(buf))\n\n    return dfd.promise\n  }\n\n  writeString(path, stringData, encoding) {\n    const writeStream = this._createWriteStream(path)\n    var dfd = when.defer()\n\n    writeStream.on('finish', () => {\n      dfd.resolve()\n    })\n    .on('error', err => dfd.reject(err))\n\n    var s = new Readable()\n    s._read = function() {}\n    s.push(new Buffer(stringData, encoding))\n    s.push(null)\n    s.pipe(writeStream)\n    writeStream.on('drain', function() {\n      s.emit('end')\n    })\n\n    return dfd.promise\n  }\n\n  _createWriteStream(path, mimetype) {\n    let stream = this.file(path).createWriteStream({\n      public: true,\n      metadata: {\n        contentType: mimetype || mime.lookup(path),\n        cacheControl: 'public',\n        contentDisposition: 'inline'\n      }\n    })\n    stream.once('finish', () => {\n      console.log('  -> Google Cloud Storage: ', path)\n      stream.emit('close')\n    })\n    return stream\n  }\n\n  createWriteStream(path, mimetype) {\n    return when.resolve(this._createWriteStream(path, mimetype))\n  }\n}\n\nmodule.exports = CloudStorage\n"
  },
  {
    "path": "lib/editorChannelServer.js",
    "content": "var EventEmitter = require('events').EventEmitter\nvar WebSocket = require('ws')\nvar WebSocketServer = require('ws').Server\nvar config = require('../config/config.js').server\n\nvar mongoose = require('mongoose')\nvar redis = require('redis')\n\nvar User = require('../models/user')\n\nvar secrets = require('../config/secrets')\nvar sessions = require('client-sessions')\n\nvar EditLog = require('../models/editLog')\nvar Serial = require('../models/serial')\n\nvar minute = 60 * 1000;\nvar hour = 60 * minute;\nvar day = hour * 24;\nvar week = day * 7;\n\nfunction guid() {\n\tvar alf = 'abcdefghijklmnopqrstuvwxyz0123456789'\n\tvar gstr = ''\n\tfor (var i=0; i < 10; i++) {\n\t\tgstr += alf[Math.floor(Math.random() * alf.length)]\n\t}\n\treturn gstr\n}\n\nfunction encode(obj) {\n\tif(!obj.channel)\n\t\tobj.channel = 'server'\n\n\tif(!obj.from)\n\t\tobj.from = 'server'\n\n\treturn JSON.stringify(obj)\n}\n\nfunction onSocketError(err) {\n\tif (err)\n\t\tconsole.error('Error writing to socket:', err.stack)\n}\n\nfunction clientErrorReporter(client, err) {\n\tconsole.error(err)\n\tthis.send(client, { error: err })\n}\n\nfunction EditorConnection(userId) {\n\tthis.color = '#' + Math.floor(Math.random() * 16777215).toString(16)\n\tthis.id = guid()\n\tconsole.log('EditorConnection id', this.id)\n\tthis.userId = userId\n\tthis.followers = 0\n}\n\nEditorConnection.prototype.toJson = function() {\n\tvar json = {\n\t\tchannel: this.channelName,\n\t\tcolor: this.color,\n\t\tid: this.id,\n\t\tuserId: this.userId,\n\t\tusername: this.username,\n\t\tactiveGraphUid: this.activeGraphUid,\n\t\tfollowers: this.followers\n\t}\n\treturn json\n}\n\nfunction EditorChannelServer() {\n\tEventEmitter.call(this)\n\n\tthis.config = config\n\tthis.clients = {}\n\tthis.channels = {}\n\tthis.dispatchQueue = []\n\n\tthis.clusterNodeId = guid()\n\n\tthis._redisClient = this.createRedisClient()\n\tthis._redisSubscriber = this.createRedisClient()\n\tthis._redisPublisher = this.createRedisClient()\n}\n\nEditorChannelServer.prototype = Object.create(EventEmitter.prototype)\n\nEditorChannelServer.prototype.createRedisClient = function() {\n\treturn redis.createClient({\n\t\thost: process.env.REDIS || 'localhost'\n\t})\n}\n\nEditorChannelServer.prototype.listen = function(httpServer) {\n\tthis.wss = new WebSocketServer( {\n\t\tserver: httpServer,\n\t\tpath: '/__editorChannel'\n\t})\n\n\tthis.wss.on('connection', this.handleConnection.bind(this))\n\n\tthis._redisSubscriber.on('message', this.handleRedisMessage.bind(this))\n\n\tthis.emit('ready')\n\n\tconsole.log('EditorChannelServer ready')\n}\n\nEditorChannelServer.prototype.close = function() {\n\tthis.wss.close()\n\tthis.clients = {}\n\tthis.channels = {}\n\n\tthis._redisClient.end()\n\tthis._redisPublisher.end()\n\tthis._redisSubscriber.end()\n}\n\nEditorChannelServer.prototype.handleConnection = function(socket) {\n\tvar that = this\n\tvar req = socket.upgradeReq\n\tvar remoteAddress = req.headers['x-forwarded-for'] || req.connection.remoteAddress\n\n\tfunction abortClient(err) {\n\t\tconsole.error('handleConnection.abortClient', err)\n\n\t\tif (socket.readyState === WebSocket.OPEN) {\n\t\t\tsocket.send(JSON.stringify({ error: err.message, stack: err.stack }))\n\t\t}\n\n\t\tsocket.close()\n\t}\n\n\tfunction parseCookie() {\n\t\tvar header = req.headers.cookie\n\n\t\tif (!header)\n\t\t\treturn\n\n\t\tvar headerMatch = header.match(/(vs070=[^;\\s]*)/)\n\n\t\tif (!headerMatch)\n\t\t\treturn\n\n\t\tvar sessionCookie = headerMatch[1].substring('vs070='.length)\n\n\t\treturn sessions.util.decode({\n\t\t\tcookieName: 'vs070',\n\t\t\tcookie: {\n\t\t\t\tdomain: process.env.FQDN,\n\t\t\t},\n\t\t\tsecret: secrets.sessionSecret,\n\t\t\tduration: week,\n\t\t\tactiveDuration: day\n\t\t}, sessionCookie)\n\t}\n\n\tvar cookie = parseCookie()\n\n\tif (!cookie || !cookie.content)\n\t\treturn abortClient('No cookie')\n\n\tvar userId = cookie.content.userId\n\tif (cookie.content.passport && cookie.content.passport.user)\n\t\tuserId = cookie.content.passport.user\n\n\tfunction setupClient(user) {\n\t\tvar client = new EditorConnection(userId)\n\t\tclient.socket = socket\n\t\tclient.remoteAddress = remoteAddress\n\t\tclient.channels = []\n\t\tclient.username = user.username\n\t\tclient.lastMessageReceivedAt = 0\n\t\tclient.floodCounter = 0\n\n\t\tthat.clients[client.id] = client\n\n\t\tsocket.on('message', that.handleSocketMessage.bind(that, client))\n\t\tsocket.on('close', that.onSocketClosed.bind(that, client))\n\n\t\t// relay messages to the user from other nodes\n\t\tthat._redisSubscriber.subscribe(client.id)\n\n\t\tconsole.log('EditorChannelServer connected', remoteAddress, userId, client.username, client.id)\n\n\t\tthat.send(client, {\n\t\t\tkind: 'READY',\n\t\t\tid: client.id,\n\t\t\tcolor: client.color\n\t\t})\n\t}\n\n\tUser.findById(mongoose.Types.ObjectId(userId), function(err, user) {\n\t\tif (err)\n\t\t\treturn abortClient(err.stack)\n\n\t\tif (!user)\n\t\t\treturn setupClient({\n\t\t\t\tusername: 'Guest '+\n\t\t\t\t\tuserId.substring(0, 1).toUpperCase() +\n\t\t\t\t\tuserId.substring(1, 2)\n\t\t\t})\n\n\t\tsetupClient(user)\n\t})\n}\n\nEditorChannelServer.prototype.onSocketClosed = function(client) {\n\tvar that = this\n\n\tthis._redisSubscriber.unsubscribe(client.id)\n\n\tclient.channels.map(function(ch) {\n\t\tthat.leaveChannel(ch, client)\n\t})\n\n\tdelete this.clients[client.id]\n}\n\nEditorChannelServer.prototype.handleRedisMessage = function(channelName, payload) {\n\tvar that = this\n\n\t// direct message to someone here\n\tif (this.clients[channelName]) {\n\t\treturn this.sendString(this.clients[channelName], payload)\n\t}\n\n\tvar message = JSON.parse(payload)\n\n\tif (message.__cnid !== this.clusterNodeId) {\n\t\tswitch(message.kind) {\n\t\t\tcase 'join': // a join on another node\n\t\t\t\tvar members = this.channels[channelName]\n\n\t\t\t\t// tell the joiner our member list\n\t\t\t\tmembers.map(function(oc) {\n\t\t\t\t\tvar m = oc.toJson()\n\t\t\t\t\tm.kind = 'join'\n\t\t\t\t\tm.date = Date.now()\n\t\t\t\t\tm.channel = channelName\n\t\t\t\t\tthat.sendToClientElsewhere(message.id, m)\n\t\t\t\t})\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tthis.channels[channelName].map(function(client) {\n\t\tthat.sendString(client, payload)\n\t})\n}\n\nEditorChannelServer.prototype.handleSocketMessage = function(client, m) {\n\tvar now = Date.now()\n\n\tvar message = JSON.parse(m)\n\tmessage.from = client.id\n\n\tclient.lastMessageReceivedAt = now\n\n\tif (message.actionType === '__ping') {\n\t\treturn this.send(client, {\n\t\t\tkind: '__pong',\n\t\t\tfrom: 'server',\n\t\t\tchannel: message.channel\n\t\t})\n\t}\n\n\tif (!message.channel)\n\t\treturn\n\n\tswitch(message.kind) {\n\t\tcase 'join':\n\t\t\tthis.joinChannel(message.channel, message.readableName, client, message)\n\t\t\tbreak\n\n\t\tcase 'leave':\n\t\t\tif (this.clients[client.followUid])\n\t\t\t\tthis.clients[client.followUid].followers--\n\n\t\t\tthis.leaveChannel(message.channel, client)\n\t\t\tbreak\n\n\t\tdefault:\n\t\t\tif (!message.actionType)\n\t\t\t\treturn;\n\n\t\t\tswitch(message.actionType) {\n\t\t\t\tcase 'uiActiveGraphChanged':\n\t\t\t\t\tclient.activeGraphUid = message.activeGraphUid\n\t\t\t\t\treturn this.sendToChannel(message.channel, message)\n\n\t\t\t\tcase 'uiUserIdFollowed':\n\t\t\t\t\tclient.followUid = message.followUid\n\t\t\t\t\tvar target = this.clients[message.followUid]\n\t\t\t\t\tif (target)\n\t\t\t\t\t\ttarget.followers++\n\t\t\t\t\treturn this.sendToChannel(message.channel, message)\n\t\t\t\tcase 'uiUserIdUnfollowed':\n\t\t\t\t\tclient.followUid = null\n\t\t\t\t\tvar target = this.clients[message.followUid]\n\t\t\t\t\tif (target)\n\t\t\t\t\t\ttarget.followers--\n\t\t\t\t\treturn this.sendToChannel(message.channel, message)\n\n\t\t\t\tcase 'uiMouseMoved':\n\t\t\t\t\tclient.mousePosition = [message.x, message.y]\n\t\t\t\t\treturn this.sendToChannel(message.channel, message)\n\n\t\t\t\tcase 'uiMouseClicked':\n\t\t\t\t\treturn this.sendToChannel(message.channel, message)\n\n\t\t\t\tcase 'uiPluginTransientStateChanged':\n\t\t\t\t\treturn this.sendToChannel(message.channel, message)\n\n\t\t\t\tcase 'uiChatMessageAdded':\n\t\t\t\tcase 'graphSnapshotted':\n\t\t\t\tcase 'uiNodeAdded':\n\t\t\t\tcase 'uiNodeRemoved':\n\t\t\t\tcase 'uiNodeRenamed':\n\t\t\t\tcase 'uiSlotAdded':\n\t\t\t\tcase 'uiSlotRemoved':\n\t\t\t\tcase 'uiNodeOpenStateChanged':\n\t\t\t\tcase 'uiNodesMoved':\n\t\t\t\tcase 'uiConnected':\n\t\t\t\tcase 'uiDisconnected':\n\t\t\t\tcase 'uiGraphTreeReordered':\n\t\t\t\tcase 'uiPluginStateChanged':\n\t\t\t\tcase 'uiSlotValueChanged':\n\t\t\t\t\tthis.queue({\n\t\t\t\t\t\tchannel: message.channel,\n\t\t\t\t\t\tfrom: client.id,\n\t\t\t\t\t\tack: message.ack,\n\t\t\t\t\t\tmessage: message\n\t\t\t\t\t})\n\n\t\t\t\t\tthis.dispatch()\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbreak\n\t}\n}\n\nEditorChannelServer.prototype.queue = function(dispatchObject) {\n\tthis.dispatchQueue.push(dispatchObject)\n}\n\nvar localSerial = 0\nEditorChannelServer.prototype.dispatch = function() {\n\tvar that = this\n\n\tif (this.dispatching || !this.dispatchQueue.length)\n\t\treturn;\n\n\tthis.dispatching = true\n\n\tvar dsp = that.dispatchQueue.shift()\n\n\tif (dsp.channel === 'Global') { // chat\n\t\t// limit max message length\n\t\tdsp.message.message = dsp.message.message.substring(0, 1000)\n\t}\n\n\tSerial.next(dsp.channel)\n\t.then(function(serial) {\n\t\tvar payload = {\n\t\t\tid: serial,\n\t\t\tfrom: dsp.from,\n\t\t\tdate: Date.now(),\n\t\t\tlog: JSON.stringify(dsp.message)\n\t\t}\n\n\t\tthat._redisClient.zadd(dsp.channel, serial, JSON.stringify(payload), function(err) {\n\t\t\tif (err)\n\t\t\t\tconsole.error('REDIS WRITE FAILED', err.stack)\n\n\t\t\tthat.dispatching = false\n\n\t\t\tif (dsp.ack) {\n\t\t\t\tthat.send(that.clients[dsp.from], {\n\t\t\t\t\tkind: 'ack',\n\t\t\t\t\tack: dsp.ack\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tvar message = dsp.message\n\t\t\tmessage.id = payload.id\n\t\t\tmessage.date = payload.date\n\n\t\t\tthat.sendToChannel(dsp.channel, message)\n\n\t\t\tthat.dispatch()\n\t\t})\n\t})\n}\n\nEditorChannelServer.prototype.tail = function(channelName, client, options) {\n\tvar that = this\n\n\tvar lastEditSeen = options.lastEditSeen\n\tvar limit = options.limit\n\n\tfunction onInitialSet(err, initialSet) {\n\t\tif (limit)\n\t\t\tinitialSet = initialSet.reverse()\n\n\t\tinitialSet.map(function(rowData) {\n\t\t\tvar row = JSON.parse(rowData)\n\n\t\t\tif (!limit && lastEditSeen && row.id === lastEditSeen)\n\t\t\t\treturn;\n\n\t\t\tvar message = JSON.parse(row.log)\n\t\t\tmessage.id = row.id\n\t\t\tmessage.date = row.date\n\t\t\tthat.send(client, message)\n\t\t})\n\t}\n\n\tif (limit) {\n\t\tthis._redisClient.zrevrangebyscore(channelName,\n\t\t\t'+inf',\n\t\t\t'0',\n\t\t\t'LIMIT', '0', limit,\n\t\t\tonInitialSet)\n\t} else {\n\t\tthis._redisClient.zrangebyscore(channelName,\n\t\t\tlastEditSeen || '-inf',\n\t\t\t'+inf',\n\t\t\tonInitialSet)\n\t}\n}\n\nEditorChannelServer.prototype.joinChannel = function(channelName, readableName, client, message) {\n\tvar that = this\n\n\tif (this.config.debug)\n\t\tconsole.log('EditorChannelServer Join:', channelName, client.id)\n\n\tif (client.channels.indexOf(channelName) !== -1)\n\t\treturn\n\n\tif (!this.channels[channelName]) {\n\t\tthis._redisSubscriber.subscribe(channelName)\n\t\tthis.channels[channelName] = []\n\t}\n\n\tvar members = this.channels[channelName]\n\n\tfunction doJoinChannel() {\n\t\t// start listening to events from db\n\t\tthat.tail(channelName, client, {\n\t\t\tlastEditSeen: message.lastEditSeen,\n\t\t\tlimit: message.limit\n\t\t})\n\n\t\t// add it to client's channels\n\t\tclient.channels.push(channelName)\n\t\tclient.activeGraphUid = message.activeGraphUid\n\n\t\t// tell joiner of others (on this node)\n\t\tmembers.map(function(oc) {\n\t\t\tvar m = oc.toJson()\n\t\t\tm.kind = 'join'\n\t\t\tm.date = Date.now()\n\t\t\tm.channel = channelName\n\t\t\tthat.send(client, m)\n\t\t})\n\n\t\tmembers.push(client)\n\n\t\t// tell others of joiner\n\t\tvar m = client.toJson()\n\t\tm.kind = 'join'\n\t\tm.date = Date.now()\n\t\tm.channel = channelName\n\t\tthat.sendToChannel(channelName, m)\n\n\t\tthat.send(client, { kind: 'youJoined', channel: channelName })\n\t}\n\n\tif (channelName !== 'Global') {\n\t\tEditLog.joinOrCreate(channelName, readableName, client.userId)\n\t\t.then(doJoinChannel)\n\t} else {\n\t\tdoJoinChannel()\n\t}\n\n}\n\nEditorChannelServer.prototype.leaveChannel = function(channelName, client) {\n\tif (this.config.debug)\n\t\tconsole.log('EditorChannelServer Leave:', channelName, client.id)\n\n\tif (!this.channels[channelName] || this.channels[channelName].indexOf(client) === -1)\n\t\treturn\n\n\tthis.sendToChannel(channelName, {\n\t\tchannel: channelName,\n\t\tkind: 'leave',\n\t\tdate: Date.now(),\n\t\tusername: client.username,\n\t\tid: client.id\n\t})\n\n\tthis.channels[channelName] = this.channels[channelName].filter(function(cl) {\n\t\treturn (client.id !== cl.id)\n\t})\n\n\tclient.channels = client.channels.filter(function(ch) {\n\t\treturn (ch !== channelName)\n\t})\n}\n\nEditorChannelServer.prototype.sendToChannel = function(channelName, message) {\n\tvar that = this\n\n\tmessage.__cnid = this.clusterNodeId\n\n\tthis._redisPublisher.publish(channelName, encode(message))\n\n\tthis.emit(channelName, message)\n}\n\nEditorChannelServer.prototype.sendToClientElsewhere = function(clientId, message) {\n\tmessage.__cnid = this.clusterNodeId\n\tthis._redisPublisher.publish(clientId, encode(message))\n}\n\nEditorChannelServer.prototype.send = function(client, message) {\n\tthis.sendString(client, encode(message))\n}\n\nEditorChannelServer.prototype.sendString = function(client, message) {\n\tif (!client || client.socket.readyState !== 1)\n\t\treturn;\n\n\tclient.socket.send(message, onSocketError)\n}\n\nexports.EditorChannelServer = EditorChannelServer\n"
  },
  {
    "path": "lib/framedump-server.js",
    "content": "\"use strict\";\n\nvar fs = require('fs');\nvar path = require('path');\nvar exec = require('child_process').exec;\nvar o_path = null;\nvar frame = 0;\nvar data = null;\nvar w = 0, h = 0;\n\nfunction lpad(n, width)\n{\n\tn += '';\n\t\n\treturn n.length >= width ? n : new Array(width - n.length + 1).join('0') + n;\n}\n\nfunction FrameDumpServer(project)\n{\n\to_path = path.join(project, 'output');\n\t\n\tif(!fs.existsSync(o_path))\n\t    fs.mkdirSync(o_path);\n}\n\nFrameDumpServer.prototype.listen = function(expressApp)\n{\n\texpressApp\n\t.get('/fd/reset', function(req, res)\n\t{\n\t\tvar mask = path.join(o_path, '*.tga');\n\t\t\n\t\tconsole.log('Reset: ' + mask);\n\t\tframe = 0;\n\t\t\n\t\texec('rm -f ' + mask, function()\n\t\t{\n\t\t\texec('mkdir -p ' + o_path);\n\t\t\tres.send(200);\n\t\t})\n\t})\n\t.post('/fd/frame', function(req, res)\n\t{\n\t\tif(!req.query.width || !req.query.height)\n\t\t{\n\t\t\tconsole.error('The client did not specify a width or height');\n\t\t\treturn res.send(400);\n\t\t}\n\n\t\tif(!data || w !== req.query.width || h !== req.query.height)\n\t\t{\n\t\t\tw = req.query.width;\n\t\t\th = req.query.height;\n\t\t\tdata = new Buffer(18 + (req.query.width * req.query.height * 3));\n\t\t\tdata[0] = 0; // ID\n\t\t\tdata[1] = 0; // No colormap\n\t\t\tdata[2] = 2; // Uncompressed true-color image\n\t\t\tdata[3] = data[4] = data[5] = data[6] = data[7] = 0;\n\t\t\tdata[8] = data[9] = 0; // X origin\n\t\t\tdata[10] = data[11] = 0; // Y origin\n\t\t\tdata[12] = (w & 255)\n\t\t\tdata[13] = (w >> 8) & 255; // Width\n\t\t\tdata[14] = (h & 255)\n\t\t\tdata[15] = (h >> 8) & 255; // Height\n\t\t\tdata[16] = 24; // BPP\n\t\t\tdata[17] = 0; // No alpha\n\t\t}\n\n\t\tvar offset = 18;\n\t\tvar filename = path.join(o_path, lpad(frame++, 8) + '.tga');\n\n\t\treq.on('data', function(d)\n\t\t{\n\t\t\td.copy(data, offset);\n\t\t\toffset += d.length;\n\t\t});\n\n\t\treq.on('end', function()\n\t\t{\n\t\t\tfs.writeFileSync(filename, data);\n\t\t\tconsole.log('Wrote frame: ' + filename);\n\t\t\tres.send(200);\n\t\t});\n\t});\n}\n\nexports.FrameDumpServer = FrameDumpServer;\n"
  },
  {
    "path": "lib/graphOptimizer.js",
    "content": "var when = require('when');\nvar settings = require('../config/settings');\t\n\n// Set of plugins that may contain references to external dependencies.\nvar urlPlugins = [\n\t'three_loader_model',\n\t'url_audio_buffer_generator',\n\t'url_audio_generator',\n\t'url_json_generator',\n\t'url_scene_generator',\n\t'url_texture_generator',\n\t'url_video_generator'\n];\n\n// Set of plugins the title of which has a functional purpose and must thus be retained.\nvar maintainTitle = [\n\t'variable_global_read',\n\t'variable_global_write',\n\t'variable_local_read',\n\t'variable_local_write'\n];\n\n// Set of plugins that can be removed without compromising graph functionality.\nvar filteredPlugins = [\n\t'annotation',\n\t'bool_display',\n\t'color_display',\n\t'data_info_display',\n\t'float_display',\n\t'led_display',\n\t'log_display',\n\t'matrix_display',\n\t'object_display',\n\t'plot_display',\n\t'text_display',\n\t'vector_display'\n];\n\nfunction removeItem(coll, item)\n{\n\tcoll.splice(coll.indexOf(item), 1);\n}\n\nfunction deleteNode(graph, node)\n{\n\tvar nuid = node.uid;\n\n\tremoveItem(graph.nodes, node);\n\t\n\tgraph.conns = graph.conns.filter(function(c)\n\t{\t\n\t\treturn (c.src_nuid !== nuid && c.dst_nuid !== nuid)\n\t});\n}\n\nfunction pruneDynamicSlots(slots) {\n\tslots.forEach(function(slot) {\n\t\tdelete slot.desc\n\t\tdelete slot.type\n\t\tdelete slot.connected\n\t\tdelete slot.is_connected\n\t\tdelete slot.def\n\t})\n}\n\nfunction _makeUrlAbsolute(url) {\n\tif (url[0] !== '/')\n\t\turl = '/' + url\n\n\tif (settings.fqdn) {\n\t\turl = '//' + settings.fqdn + url\n\t}\n\n\treturn url\n}\n\n// --------------------------------------------\n\nfunction GraphOptimizer() {}\nGraphOptimizer.prototype.graph = function(src) {\n\tthis.graph = src;\n\treturn this;\n}\n\nGraphOptimizer.prototype.optimize = function(graph) {\n\tvar that = this;\n\tvar pruned = [];\n\tgraph = graph || this.graph.root;\n\n\tdelete graph.open;\n\tdelete graph.scroll;\n\n\tgraph.nodes.forEach(function(node)\n\t{\n\t\tif (node.plugin === 'graph' || node.plugin === 'loop')\n\t\t{\n\t\t\tthat.optimize(node.graph);\n\t\t} else if (filteredPlugins.indexOf(node.plugin) > -1)\n\t\t{\t\n\t\t\tpruned.push(node);\n\t\t\treturn;\n\t\t}\n\n\t\tdelete node.x;\n\t\tdelete node.y;\n\n\t\tif (urlPlugins.indexOf(node.plugin) > -1 && node.state.url)\n\t\t\tnode.state.url = _makeUrlAbsolute(node.state.url);\n\n\t\tif (maintainTitle.indexOf(node.plugin) === -1)\n\t\t\tdelete node.title;\n\n\t\tif (node.dyn_in)\n\t\t\tpruneDynamicSlots(node.dyn_in);\n\n\t\tif (node.dyn_out)\n\t\t\tpruneDynamicSlots(node.dyn_out);\n\t});\n\n\tpruned.forEach(function(prune)\n\t{\n\t\tdeleteNode(graph, prune);\n\t});\n\n\tgraph.conns.forEach(function(conn)\n\t{\n\t\tdelete conn.offset;\n\t});\n\n\treturn this.graph;\n}\n\nmodule.exports = GraphOptimizer;\n\n"
  },
  {
    "path": "lib/gridfs-storage.js",
    "content": "var when = require('when')\nvar nodefn = require('when/node')\nvar fs = require('fs')\nvar mongo = require('mongodb')\nvar Grid = require('gridfs-stream')\nvar EventEmitter = require('events').EventEmitter\nvar mime = require('mime')\nvar Readable = require('stream').Readable\nvar secrets = require('../config/secrets')\n\nfunction GridFsStorage(gridWebRoot, gfs) {\n\tEventEmitter.apply(this)\n\n\tthis._webroot = gridWebRoot || '/data'\n\n\tif (!gfs) {\n\t\tthis._connect()\n\t} else {\n\t\tthis._gfs = gfs\n\t\tprocess.nextTick(this.emit.bind(this, 'ready'))\n\t}\n}\n\nGridFsStorage.prototype = Object.create(EventEmitter.prototype)\n\nGridFsStorage.prototype.url = function(url) {\n\tif (url.indexOf(this._webroot) !== 0)\n\t\treturn this._webroot + url\n\treturn url\n}\n\nGridFsStorage.prototype._connect = function() {\n\tvar that = this\n\tvar gfsUrl = secrets.gridFs.split('/').slice(2)\n\tvar gfsHostPort = gfsUrl[0].split(':')\n\n\tvar db = this.db = new mongo.Db(\n\t\tgfsUrl[1],\n\t\tnew mongo.Server(gfsHostPort[0], gfsHostPort[1]),\n\t\t{ safe: true }\n\t)\n\n\tdb.open(function(err) {\n\t\tif (err) throw err\n\n\t\tdb.collection('fs.files', function(err, coll) {\n\t\t\tif (err) throw err\n\t\t\tcoll.ensureIndex({ filename: -1 }, { unique: true }, function() {})\n\t\t})\n\n\t\tthat._gfs = Grid(db, mongo)\n\t\tthat.emit('ready')\n\t})\n}\n\nGridFsStorage.prototype.close = function() {\n\tthis.db.close()\n}\n\nGridFsStorage.prototype.exists = function(path) {\n\treturn nodefn.call(this._gfs.exist.bind(this._gfs), { filename: path })\n}\n\nGridFsStorage.prototype.createReadStream = function(path, range) {\n\treturn this.read(path, range)\n}\n\nGridFsStorage.prototype.createWriteStream = function(path, mimetype) {\n\tvar that = this\n\n\treturn this.stat(path)\n\t.then(function(stat) {\n\t\tvar opts = { filename: path, mode: 'w' }\n\n\t\ttry {\n\t\t\tif (mimetype)\n\t\t\t\topts.content_type = mimetype\n\t\t\telse\n\t\t\t\topts.content_type = mime.lookup(path)\n\t\t} catch (e) {\n\t\t\treturn when.reject(e)\n\t\t}\n\n\t\tif (stat)\n\t\t\topts._id = stat._id\n\n\t\treturn that._gfs.createWriteStream(opts)\n\t})\n}\n\nGridFsStorage.prototype.writeString = function(path, stringData, encoding) {\n\treturn this.createWriteStream(path)\n\t.then(function(writeStream) {\n\t\tvar dfd = when.defer()\n\t\twriteStream.on('error', function(err) {\n\t\t\tdfd.reject(err)\n\t\t})\n\t\twriteStream.on('close', () => {\n\t\t\tdfd.resolve()\n\t\t})\n\t\twriteStream.write(new Buffer(stringData, encoding), () => {\n\t\t\twriteStream.end()\n\t\t})\n\t\treturn dfd.promise\n\t})\n}\n\nGridFsStorage.prototype.readString = function(path) {\n\tvar stream = this._gfs.createReadStream({ filename: path })\n\tvar dfd = when.defer()\n\tvar buf = ''\n\n\tstream.on('data', function(d) {\n\t\tbuf += d.toString()\n\t})\n\n\tstream.on('error', function(err) {\n\t\tdfd.reject(err)\n\t})\n\n\tstream.on('end', function() {\n\t\tdfd.resolve(buf)\n\t})\n\n\treturn dfd.promise\n}\n\nGridFsStorage.prototype.read = function(path, range) {\n\tvar options = {}\n\toptions.filename = path\n\toptions.range = range\n\treturn this._gfs.createReadStream(options)\n}\n\nGridFsStorage.prototype.unlink = function(path) {\n\tvar dfd = when.defer()\n\tthis._gfs.remove({ filename: path }, function(err) {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\t\tdfd.resolve()\n\t})\n\treturn dfd.promise\n}\n\nGridFsStorage.prototype.stat = function(path) {\n\tvar dfd = when.defer()\n\tthis._gfs.files.find({ filename: path })\n\t.limit(1)\n\t.toArray(function(err, files) {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\n\t\tdfd.resolve(files[0])\n\t})\n\n\treturn dfd.promise\n}\n\nGridFsStorage.prototype.move = function(src, dest, metadata) {\n\treturn this.copy(src, dest, metadata)\n\t.then(function(url) {\n\t\tfs.unlink(src)\n\t\treturn url\n\t})\n}\n\nGridFsStorage.prototype.copy = function(src, dest, metadata) {\n\tvar that = this\n\n\treturn this.stat(dest)\n\t.then(function(existing) {\n\t\tvar dfd = when.defer()\n\n\t\tvar destination = {\n\t\t\tfilename: dest,\n\t\t\tmode: 'w',\n\t\t\tcontent_type: mime.lookup(src),\n\t\t\tchunkSize: 1024,\n\t\t\tmetadata: metadata\n\t\t}\n\n\t\tif (existing)\n\t\t\tdestination._id = existing._id\n\n\t\tvar stream = that._gfs.createWriteStream(destination)\n\t\t.on('error', function(err) { dfd.reject(err) })\n\t\t.on('close', function() {\n\t\t\tdfd.resolve(that.url(dest))\n\t\t})\n\n\t\tfs.createReadStream(src)\n\t\t.on('error', function(err) {\n\t\t\tdfd.reject(err)\n\t\t})\n\t\t.pipe(stream)\n\n\t\treturn dfd.promise\n\t})\n}\n\nmodule.exports = GridFsStorage\n"
  },
  {
    "path": "lib/hbs-helpers.js",
    "content": "if ((typeof module !== 'undefined') && module.exports) {\n\tvar _ = require('lodash')\n\tvar Handlebars = require('handlebars')\n\tvar path = require('path')\n\tvar UIPagination = require(path.resolve( __dirname, '../browser/scripts/ui/pagination.js'))\n}\n\nvar helpers = {\n    /**\n     * Check string or array for a length greater than a passed number\n     * Usage: {{#ifLengthierThan activationsGraphData 5}} ... {{else}} ... {{/ifLengthierThan}}\n     */\n    ifLengthierThan: function(obj, length)\n    {\n        var options = arguments[arguments.length - 1];\n        if(obj.length > length)\n        {\n            return options.fn(this);\n        } else\n        {\n            return options.inverse(this);\n        }\n    },\n\n\tfriendlyURL : function(url) {\n\t\tif (!url)\n\t\t\treturn url\n\n\t\turl = url.replace(/.*?:\\/\\//g, \"\");\n\t\tif (url.endsWith('/'))\n\t\t\turl = url.substring(0, url.length-1);\n\t\treturn url\n\t},\n\n    json : function(obj, options) {\n        var j = JSON.stringify(obj)\n\t\tif (!j)\n\t\t\treturn j\n\n\t\tvar deletes = options.hash['deleteKeys'] || ''\n\t\tif (deletes) {\n\t\t\tdeletes.split(',')\n\t\t\t\t.forEach(function (d) {\n\t\t\t\t\tdelete j[d.trim()]\n\t\t\t\t})\n\t\t}\n\t\treturn j.replace(/<\\//gm, '<\\\\\\/') // escape html tag closers\n    },\n\n    formatDate : function(date) {\n\t\tvar mdate = moment(date)\n\t\tvar now = moment(Date.now())\n\n\t\tif (!mdate.isValid())\n\t\t\treturn date\n\t\t\n\t\tif (mdate.isSame(now, 'd'))\n\t\t\treturn mdate.calendar()\n\n\t\tif (mdate.isSame(now, 'y'))\n\t\t\treturn mdate.format('MMM Do h:mm A')\n\t\t\n\t\treturn mdate.format('ll h:mm A')\n\t},\n\n    // e.g. 1 view, 2 views\n    plural : function(count, what, whats) {\n        var plural = (typeof whats === 'string') ? whats : what+'s'\n        return count + ' ' + (count === 1  ? what : plural)\n    },\n\n    /**\n     * Mark selected option based on passed in status\n     * From: http://stackoverflow.com/questions/13046401/how-to-set-selected-select-option-in-handlebars-template#18349787\n     * Usage:\n     * <select>\n     *   {{#select status}}\n     *   <option>Option 1</option>\n     *   <option>Option 2</option>\n     *   <option value=\"Option 3\">Option 3 (extra info)</option>\n     *   <option value=\"Option 4\">Option 4 (more extra)</option>\n     *   {{/select}}\n     * </select>\n     */\n    select: function(value, options)\n    {\n        return options.fn(this)\n            .replace(new RegExp(' value=\\\"' + value + '\\\"'),\n                '$& selected=\"selected\"')\n            .replace(new RegExp('>' + value + '</option>'),\n                ' selected=\"selected\"$&');\n    },\n\n\tconcat: function() {\n\t\tvar i\n\t\tvar ret = []\n\t\tvar l = arguments.length - 1\n\t\tfor (i=0; i<l; i++) {\n\t\t\tret.push(arguments[i])\n\t\t}\n\t\treturn ret.join(\"\")\n\t},\n\n\t// e.g. (byindex templateVar string0 string1 string2 string3 ... stringN }\n\tbyindex: function() {\n\t\tvar opts = []\n\t\tfor (var l=0; l<arguments.length; l++)\n\t\t\topts.push(arguments[l])\n\n\t\topts.pop()\t\t// handlebars stuff\n\n\t\tvar index = parseInt(0 + opts.shift())\n\n\t\tif (isNaN(index))\n\t\t\treturn '?'\n\t\treturn opts[index]\n\t},\n\n\t// e.g. (unescape 'something that would be \"escaped\" otherwise')\n\tunescape : function(content) {\n\t\treturn new Handlebars.SafeString(content)\n\t},\n\n\tequals : function(arg1, arg2) {\n\t\treturn arg1 === arg2\n\t},\n\n\t// length of array, or length of object keys, or length of (string) argument\n\tlength : function(arg) {\n\n\t\tif (Array.isArray(arg))\n\t\t\treturn arg.length\n\t\tif (typeof arg === 'object')\n\t\t\treturn Object.keys(arg).length\n\t\treturn (\"\"+arg).length\n\t},\n\n\tmoment: function(date, fmt) {\t// use moment.js to format a date\n\t\tif (typeof moment !== 'undefined')\n\t\t\treturn moment(date).format(fmt)\n\t\t// fallback\n\t\treturn date.toString()\n\t},\n\n\t// returns true on arg being truthy.   [] {\n\thave : function(arg) {\n\t\treturn (arg && typeof arg === 'object') ? (Object.keys(arg).length > 0) : !!arg\n\t},\n\n\t// returns arg&&arg&&arg&&arg\n\tand: function() {\n\t\tvar result = true\n\t\treturn Array.prototype.slice.call(arguments, 0,-1)\n\t\t\t.reduce(function(arg){return result && helpers.have(arg)})\n\t},\n\n\t// returns arg||arg||arg||arg\n\tor: function() {\n\t\tvar result = false\n\t\tArray.prototype.slice.call(arguments, 0,-1)\n\t\t\t.map(function(arg){\n\t\t\t\tresult = result || helpers.have(arg)\n\t\t\t})\n\t\treturn !!result\n\t},\n\n\t/**** PAGINATION ****/\n\n\t/**\n\t * parse .meta part of an assetService query result and define extra pagination variables\n\t * @example hbs:  {{>pagination (makePaginationData list.meta)}}\n\t * @param meta\n\t * @returns {UIPagination}\n\t */\n\tmakePaginationData : function(meta) {\t// used by graphList.handlebars\n\t\treturn UIPagination.fromMeta(meta)\n\t},\n\n\t// gets the query {key:val} from a custom string, or express or from current browser window\n\t_getQuery : function(queryString) {\n\t\tvar query = {}\n\n\t\t// if running on client, and no queryString, default to the browser\n\t\tif ((typeof queryString === 'undefined') && (typeof window !== 'undefined') && (window.location))\n\t\t\tqueryString = window.location.search\n\n\t\tif (queryString && queryString.length && queryString[0] === '?')\n\t\t\tqueryString = queryString.substring(1)\n\n\t\t// if queryString found\n\t\tif (queryString) {\n\t\t\tfor (var pair of queryString.split('&')) {\n\t\t\t\tpair = pair.split('=')\n\t\t\t\tif (typeof pair[1] === 'string')\n\t\t\t\t\tquery[pair[0]] = decodeURIComponent(pair[1])\n\t\t\t\telse\n\t\t\t\t\tquery[pair[0]] = pair[1]\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// assume running on backend\n\t\t\tif (Handlebars._request)\t// see app.js\n\t\t\t\tquery = _.extend(query, Handlebars._request.query)\n\t\t}\n\t\treturn query\n\t},\n\n\t/**\n\t * Replace parameters in the query string based on keys and values from passed object\n\t * Use as Handlebars helper. To use a custom query string, pass '_' in opt.hash,\n\t * @example hbs: {{{replaceQueryParameters k1=3 k2='val' k3=false k4=../var}}}\n\t * @example hbs: {{{replaceQueryParameters _='?custom=querystring' k1=3 k2='val' k3=false k4=../var}}}\n\t * @example  js: Handlebars.helpers.replaceQueryParameters({hash:{'qwe':4,'hexam':false}})\n\t * @example  js: Handlebars.helpers.replaceQueryParameters({hash:{_:'?hexam=4&jolt', 'qwe':4,'hexam':false}})\n\t * @param opt (Handlebars internal)\n\t * @returns {string}\n\t */\n\treplaceQueryParameters : function(opt) {\n\t\tvar attributes = []\n\n\t\tvar queryString = opt.hash['_']\n\t\tdelete (opt.hash['_'])\n\n\t\tvar query\n\t\tif ((typeof helpers !== 'undefined') && (helpers._getQuery))\n\t\t\tquery = helpers._getQuery(queryString)\n\t\telse if (typeof Handlebars !== 'undefined')\n\t\t\tquery = Handlebars.helpers._getQuery(queryString)\n\n\t\tif (!query)\n\t\t\treturn '??'\n\n\t\tfunction isEmpty(value) {\n\t\t\treturn (value === false) || (value === null) || (typeof value === 'undefined')\n\t\t}\n\t\t// clean empty variables from existing query\n\t\tfor (var attributeName in opt.hash) {\n\t\t\tif (opt.hash.hasOwnProperty(attributeName)) {\n\t\t\t\tvalue = opt.hash[attributeName]\n\t\t\t\tif (isEmpty(value))\n\t\t\t\t\tdelete query[attributeName]\n\t\t\t\telse\n\t\t\t\t\tquery[attributeName] = value\n\t\t\t}\n\t\t}\n\n\t\t// join things back\n\t\tvar ret=[], value\n\t\tfor (var key of Object.keys(query)) {\n\t\t\tvalue = query[key]\n\t\t\tif (isEmpty(value))\n\t\t\t\tret.push(key)\n\t\t\telse\n\t\t\t\tret.push(key+'='+encodeURIComponent(query[key]))\n\t\t}\n\t\treturn '?' + ret.join('&')\n\t}\n\n\t/**** END PAGINATION ****/\n}\n\nif ((typeof module !== 'undefined') && module.exports) {\n\tmodule.exports = helpers\n}\n\nif ((typeof window !== 'undefined') && window.Handlebars) {\n\tObject.keys(helpers).forEach(function(name) {\n\t\twindow.Handlebars.registerHelper(name, helpers[name])\n\t})\n}\n"
  },
  {
    "path": "lib/imageProcessor.js",
    "content": "var gm = require('gm')\nvar fs = require('fs-extra')\nvar fsPath = require('path')\nvar mime = require('mime')\nvar when = require('when')\nvar parallel = require('when/parallel')\nvar nodefn = require('when/node')\nvar temp = require('temp').track()\nvar _ = require('lodash')\nvar checksum = require('checksum')\nvar exif = require('exiftool')\n\nvar thumbSize = 128\nvar thumbnailThreshold = 128 * 128\nvar log2 = Math.log(2)\n\nfunction isPow2(number) {\n  return number !== 0 && (number & number-1) === 0\n}\n\nfunction nearestPower(number) {\n    return Math.pow(2, Math.round(Math.log(number) / log2))\n}\n\nfunction ImageProcessor(storage) {\n\tif (!storage)\n\t\tthrow new Error('ImageProcessor got no storage')\n\n\tthis._storage = storage\n}\n\nImageProcessor.prototype.analyze = function(path) {\n  return parallel([\n    function() {\n      var dfd = when.defer()\n  \t\tgm(path).size(function(err, gsize) {\n  \t\t\tif (err)\n  \t\t\t\treturn dfd.reject(err)\n  \t\t\tdfd.resolve(gsize)\n  \t\t})\n  \t\treturn dfd.promise\n    },\n\n    function() {\n      return nodefn.call(fs.stat, path)\n    },\n\n    function() {\n      return nodefn.call(checksum.file, path)\n    },\n\n    function() {\n      // extract XMP from image\n      return nodefn.call(fs.readFile, path)\n      .then(function(data) {\n        return nodefn.call(exif.metadata, data)\n        .then(function(metadata) {\n          var xmp = {}\n\n          if (metadata.accelerometer && metadata.compass) {\n            var list = metadata.accelerometer.match(/-?\\d+/g)\n            xmp.rollDegrees = list[0]\n            xmp.pitchDegrees = list[1]\n            xmp.headingDegrees = metadata.compass\n          }\n          else if (metadata.posePitchDegrees && metadata.poseRollDegrees && metadata.poseHeadingDegrees) {\n            xmp.rollDegrees = metadata.poseRollDegrees\n            xmp.pitchDegrees = metadata.posePitchDegrees\n            xmp.headingDegrees = metadata.poseHeadingDegrees\n          }\n          else if (metadata.ricohPitch && metadata.ricohRoll) {\n            xmp.rollDegrees = metadata.ricohRoll\n            xmp.pitchDegrees = metadata.ricohPitch\n            xmp.headingDegrees = 0\n          }\n\n          return xmp\n        })\n      })\n    }\n  ])\n  .then(function(results) {\n\t\treturn {\n      width: results[0].width,\n\t\t\theight: results[0].height,\n\t\t\tbytes: results[1].size,\n      sha1: results[2],\n\t\t\tmimetype: mime.lookup(path),\n\t\t\tpitch: results[3].pitchDegrees,\n\t\t\theading: results[3].headingDegrees,\n\t\t\troll: results[3].rollDegrees,\n\t\t}\n\t})\n\t.catch(function(err) {\n\t\treturn err\n\t})\n}\n\nImageProcessor.prototype.processScaled = function(path, destPath, thumbPath) {\n\tvar that = this\n\tvar scaledInfo\n\n\treturn this.analyze(path)\n\t.then(function(info) {\n\t\tscaledInfo = info\n\t\tscaledInfo.path = destPath\n\n\t\tvar shaPath = '/image/'+info.sha1+fsPath.extname(path)\n\t\treturn that.storeImage(path, shaPath)\n\t})\n\t.then(function(url) {\n\t\tscaledInfo.url = url\n\t\treturn that.generateThumbnail(path, thumbPath)\n\t})\n\t.then(function(thumbInfo) {\n\t\treturn { scaled: scaledInfo, thumbnail: thumbInfo }\n\t})\n}\n\nImageProcessor.prototype.processOriginal = function(path, destPath) {\n\tvar that = this\n\tvar info = {}\n\n\treturn this.analyze(path)\n\t.then(function(analysis) {\n\t\tinfo.original = analysis\n\t\tinfo.original.path = destPath\n\n\t\tvar shaPath = '/image/'+info.original.sha1+fsPath.extname(path)\n\t\treturn that.storeImage(path, shaPath)\n\t\t.then(function(url) {\n\t\t\tinfo.original.url = url\n\t\t\treturn info\n\t\t})\n\t})\n}\n\nImageProcessor.prototype.processProfileImage = function(path, destPath) {\n\tvar that = this\n\tvar info = {}\n\n\treturn this.analyze(path)\n\t.then(function(analysis) {\n\t\tinfo = analysis\n\t\tinfo.path = destPath\n\n\t\treturn that.storeImage(path, destPath)\n\t\t.then(function(url) {\n\t\t\tinfo.url = url\n\t\t\treturn info\n\t\t})\n\t})\n}\n\nImageProcessor.prototype.isEquiRectangular = function(info) {\n\treturn Math.floor(info.original.width / info.original.height) === 2.0\n}\n\nImageProcessor.prototype.isCubeMap = function(info) {\n\treturn (info.original.width / info.original.height) === 6\n}\n\nImageProcessor.prototype.isStereoCubeMap = function(info) {\n\treturn (info.original.width / info.original.height) === 12\n}\n\nImageProcessor.prototype.needsScaling = function(info) {\n\tvar isScaled = isPow2(info.original.height) && isPow2(info.original.width)\n\n\treturn !this.isCubeMap(info) && !this.isStereoCubeMap(info) && !isScaled\n}\n\n// called by handleUserAvatarUpload and handleUserHeaderUpload\nImageProcessor.prototype._handleProfileImageUpload = function(file, destDir, width, height) {\n\tvar that = this\n\n\tvar ext = fsPath.extname(file.path).toLowerCase()\n\n\tvar destExt = '.png'\n\tif (ext === '.jpeg' || ext === '.jpg')\n\t\tdestExt = '.jpg'\n\n\tvar name = fsPath.basename(file.path, ext)\n\tvar originalName = fsPath.join(destDir, name + destExt)\n\tvar scaledName = fsPath.join(destDir, name + '-scaled'+ destExt)\n\tvar normalizedPath\n\n\tvar info = {}\n\n\t// normalize image to png or jpeg\n\treturn this.normalizeImage(file.path)\n\t.then(function(npath) {\n\t\tnormalizedPath = npath\n\t\t// analyse and store the original\n\t\treturn that.processOriginal(normalizedPath, originalName)\n\t})\n\t// scale avatar\n\t.then(function(oinfo) {\n\t\tinfo.original = oinfo\n\t\treturn that.createScaled(normalizedPath, width, height)\n\t})\n\t// analyse and store\n\t.then(function(scaledPath) {\n\t\treturn that.processProfileImage(scaledPath, scaledName)\n\t\t.then(function(scaledInfo) {\n\t\t\tinfo.scaled = scaledInfo\n\t\t\tfs.unlink(scaledPath, function() {})\n\t\t\treturn info\n\t\t})\n\t})\n}\n\nImageProcessor.prototype.handleUserAvatarUpload = function(file, destDir) {\n\treturn this._handleProfileImageUpload(file, destDir, 128, 128)\n}\nImageProcessor.prototype.handleUserHeaderUpload = function(file, destDir) {\n\treturn this._handleProfileImageUpload(file, destDir, 1440, 340)\n}\n\nImageProcessor.prototype.createScaled = function(path, width, height) {\n\tvar dfd = when.defer()\n\tvar tempPath = temp.path({ suffix: fsPath.extname(path) })\n\n\tgm(path)\n\t\t.resize(width, height, '^>')\n\t\t.gravity('Center')\n\t\t.crop(width, height)\n\t\t.interlace('Line')\n\t\t.write(tempPath, function(err) {\n\t\t\tif (err)\n\t\t\t\treturn dfd.reject(err)\n\n\t\t\tdfd.resolve(tempPath)\n\t\t}\n\t)\n\n\treturn dfd.promise\n}\n\n// regular asset uploads\nImageProcessor.prototype.handleUpload = function(file, destDir) {\n\tvar that = this\n\n\tvar ext = fsPath.extname(file.path).toLowerCase()\n\n\tvar destExt = '.png'\n\tif (ext === '.jpeg' || ext === '.jpg')\n\t\tdestExt = '.jpg'\n\n\tvar name = fsPath.basename(file.path, fsPath.extname(file.path)).toLowerCase()\n\tvar originalName = fsPath.join(destDir, name + destExt)\n\tvar scaledName = fsPath.join(destDir, name + '-scaled'+ destExt)\n\tvar scaledThumbName = fsPath.join(destDir, name + '-scaled-thumb.png')\n\tvar normalizedPath\n\n\tvar info = {}\n\n\t// normalize image to png or jpeg\n\treturn this.normalizeImage(file.path)\n\t.then(function(npath) {\n\t\tnormalizedPath = npath\n\t\t// analyse and store the original\n\t\treturn that.processOriginal(normalizedPath, originalName)\n\t})\n\t.then(function(analysis) {\n\t\tinfo = analysis\n\n\t\t// determine tags\n\t\tinfo.tags = ['texture']\n\n\t\tif (that.isEquiRectangular(info))\n\t\t\tinfo.tags = ['equirectangular', 'texture']\n\n\t\tif (that.isCubeMap(info))\n\t\t\tinfo.tags = ['monocubemap']\n\n\t\tif (that.isStereoCubeMap(info))\n\t\t\tinfo.tags = ['stereocubemap']\n\t})\n\t// scale original if needed\n\t.then(function() {\n\t\tif (that.needsScaling(info)) {\n\t\t\treturn that.createPowerOfTwoImage(normalizedPath, info.original)\n\t\t} else {\n\t\t\treturn normalizedPath\n\t\t}\n\t})\n\t// thumbnail the scaled image\n\t.then(function(powerOfTwo) {\n\t\treturn that.processScaled(powerOfTwo, scaledName, scaledThumbName)\n\t\t.then(function(p2info) {\n\t\t\tinfo.scaled = p2info.scaled\n\t\t\tinfo.scaledThumbnail = p2info.thumbnail\n\t\t\tinfo.scaled.path = scaledName\n\t\t\tinfo.scaledThumbnail.path = scaledThumbName\n\t\t\treturn info\n\t\t})\n\t})\n}\n\nfunction copyImage(path, destPath) {\n\tvar dfd = when.defer()\n\tfs.copy(path, destPath, { clobber: true }, function(err) {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\t\tdfd.resolve(destPath)\n\t})\n\treturn dfd.promise\n}\n\nImageProcessor.prototype.normalizeImage = function(path) {\n\tvar dfd = when.defer()\n\tvar suffix = fsPath.extname(path).toLowerCase()\n\n\t// use the image directly if it can be\n\tvar usableTypes = ['.jpg', '.jpeg', '.png']\n\tif (usableTypes.indexOf(suffix) !== -1) {\n\t\treturn copyImage(path, temp.path({ suffix: suffix }))\n\t}\n\n\t// otherwise, convert to PNG\n\tvar tempPath = temp.path({ suffix: '.png' })\n\n\tgm(path)\n\t.interlace('Line')\n\t.write(tempPath, function(err) {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\n\t\tdfd.resolve(tempPath)\n\t})\n\n\treturn dfd.promise\n}\n\nImageProcessor.prototype.createPowerOfTwoImage = function(path, info) {\n\tvar dfd = when.defer()\n\tvar tempPath = temp.path({ suffix: fsPath.extname(path) })\n\n\tgm(path)\n\t\t.resize(nearestPower(info.width), nearestPower(info.height), '!')\n\t\t.interlace('Line')\n\t\t.write(tempPath, function(err) {\n\t\t\tif (err)\n\t\t\t\treturn dfd.reject(err)\n\n\t\t\tdfd.resolve(tempPath)\n\t\t}\n\t)\n\n\treturn dfd.promise\n}\n\nImageProcessor.prototype.storeImage = function(sourcePath, destinationPath) {\n\treturn this._storage.copy(sourcePath, destinationPath)\n}\n\nImageProcessor.prototype.generateThumbnail = function(path, thumbPath) {\n\tvar that = this\n\tvar thumbInfo\n\tvar dfd = when.defer()\n\tvar tempPath = temp.path({suffix: fsPath.extname(path)})\n\n\tgm(path)\n\t.resize(thumbSize, thumbSize)\n\t.interlace('Line')\n\t.write(tempPath, function(err) {\n\t\tif (err) return dfd.reject(err)\n\n\t\tthat.analyze(tempPath)\n\t\t.then(function(info) {\n\t\t\tthumbInfo = info\n\t\t\tthumbInfo.path = thumbPath\n\t\t\tvar shaPath = '/image/'+info.sha1+fsPath.extname(path)\n\t\t\treturn that.storeImage(tempPath, shaPath)\n\t\t})\n\t\t.then(function(url) {\n\t\t\tthumbInfo.url = url\n\t\t\tfs.unlink(tempPath)\n\t\t\tdfd.resolve(thumbInfo)\n\t\t})\n\t})\n\n\treturn dfd.promise\n}\n\nmodule.exports = ImageProcessor\n"
  },
  {
    "path": "lib/mailer.js",
    "content": "var SparkPost = require('sparkpost')\nvar when = require('when')\n\nexports.send = function send(to, subject, html, text) {\n\tvar dfd = when.defer()\n\n\tconsole.log('mailer: sending to', to, subject, text)\n\n\tif (!process.env.KEY_SPARKPOST)\n\t\treturn when.resolve()\n\n\tvar client = new SparkPost(process.env.KEY_SPARKPOST)\n\n\tclient.transmissions.send({\n\t\ttransmissionBody: {\n\t\t\tcontent: {\n\t\t\t\tfrom: 'info@vizor.io',\n\t\t\t\tsubject: subject,\n\t\t\t\thtml: html,\n\t\t\t\ttext: text\n\t\t\t},\n\t\t\trecipients: [\n\t\t\t\t{ address: to }\n\t\t\t]\n\t\t}\n\t}, function(err, res) {\n\t\tif (err) {\n\t\t\tconsole.error(err)\n\t\t\tdfd.reject(err)\n\t\t} else {\n\t\t\tdfd.resolve()\n\t\t}\n\t})\n\n\treturn dfd.promise\n}\n\n"
  },
  {
    "path": "lib/osc-server.js",
    "content": "var WebSocketServer = require('ws').Server;\nvar udp = require('dgram');\nvar osc = require('osc-min');\nvar crypto = require('crypto');\n\nvar config = require('../config/config.js').server;\nvar oscPort = config.oscPort || 8001;\n\nfunction OscServer()\n{\n\tthis.clients = {}\n}\n\nOscServer.prototype.listen = function(httpServer)\n{\n\tvar wss = new WebSocketServer(\n\t{\n\t\tserver: httpServer,\n\t\tpath: '/__osc-proxy'\n\t});\n\n\twss.on('connection', function(ws)\n\t{\n\t\tvar id = crypto.randomBytes(20).toString('hex');\n\n\t\tthis.clients[id] = ws;\n\n\t\tif(config.debug)\n\t\t\tconsole.log('OSC registered client:', id);\n\n\t\tws.on('close', function()\n\t\t{\n\t\t\tdelete this.clients[id];\n\t\t}.bind(this))\n\t}.bind(this));\n\n\tvar oscSocket = udp.createSocket('udp4');\n\n\toscSocket.on('message', this.onUdpMessage.bind(this));\n\toscSocket.bind(oscPort);\n\n\tif(config.debug)\n\t\tconsole.log('OSC server at port:', oscPort);\n}\n\nOscServer.prototype.onUdpMessage = function(msg, rinfo)\n{\n\ttry\n\t{\n\t\tvar oscMsg = osc.fromBuffer(msg);\n\n\t\tdelete oscMsg.oscType;\n\n\t\tvar oscJson = JSON.stringify(oscMsg);\n\n\t\tconsole.log('OSC:', oscJson);\n\n\t\tfor(var id in this.clients)\n\t\t\tthis.clients[id].send(oscJson);\n\t}\n\tcatch(e)\n\t{\n\t\tif(config.debug)\n\t\t\tconsole.error('OSC packet invalid:' + e)\n\t}\n}\n\nexports.OscServer = OscServer;\n"
  },
  {
    "path": "lib/parsePluginSlots.js",
    "content": "const fs = require('fs')\nconst vm = require('vm')\n\nconst createVizorSandbox = require('./sandbox')\n\nconst browserPath = __dirname+'/../browser'\nconst pluginsPath =  browserPath+'/plugins'\n\nmodule.exports = function parsePluginSlots() {\n\tvar sandbox = createVizorSandbox()\n\tvar context = new vm.createContext(sandbox)\n\n\tvar engineSource = fs.readFileSync(browserPath+'/dist/engine.js')\n\tengineSource += ';\\nE2.core = new Core();\\n'\n\tengineSource += ';\\nE2.app = { player: { core: E2.core }};\\n'\n\tengineSource += 'E2.core.root_graph = new Graph();\\n'\n\n\tvar engineScript = new vm.Script(engineSource, { filename: 'engine.js' })\n\tengineScript.runInContext(context)\n\n\tvar slotMap = {}\n\n\tfunction seenSlot(pluginId, slotType) {\n\t\tvar key = pluginId + '.' + slotType\n\n\t\treturn function(slot) {\n\t\t\tif (!slotMap[key])\n\t\t\t\tslotMap[key] = []\n\n\t\t\tslotMap[key].push(slot.name)\n\t\t}\n\t}\n\n\tvar plugins = JSON.parse(fs.readFileSync(pluginsPath + '/plugins.json'))\n\tvar pluginCats = Object.keys(plugins)\n\n\tpluginCats.map(function(cat) {\n\t\tvar pluginNames = Object.keys(plugins[cat])\n\n\t\tpluginNames.map(function(pluginName) {\n\t\t\tvar pluginId = plugins[cat][pluginName]\n\t\t\tvar pluginSourcePath = pluginsPath+'/'+pluginId+'.plugin.js'\n\n\t\t\tvar pluginSource = fs.readFileSync(pluginSourcePath)\n\t\t\tpluginSource += ';\\n'\n\t\t\tpluginSource += 'var fakeNode = new Node(E2.core.root_graph, \"'+pluginId+'\");\\n'\n\t\t\tpluginSource += 'var plugin = new E2.plugins.'+pluginId+'(E2.core, fakeNode);\\n'\n\n\t\t\tscript = new vm.Script(pluginSource, { filename: pluginId })\n\t\t\tscript.runInContext(context)\n\n\t\t\tsandbox.plugin.input_slots.map(seenSlot(pluginId, 0))\n\t\t\tsandbox.plugin.output_slots.map(seenSlot(pluginId, 1))\n\t\t})\n\t})\n\n\treturn slotMap\n}\n"
  },
  {
    "path": "lib/previewImageProcessor.js",
    "content": "var gm = require('gm')\nvar when = require('when')\nvar nodefn = require('when/node')\n\nfunction PreviewImageProcessor() {\n}\n\nPreviewImageProcessor.prototype.process = function(path, image, previewSizes) {\n\tvar dfd = when.defer()\n\n\tif (!image) {\n\t\tconsole.error('PreviewImageProcessor: failed to upload image', path, 'no image')\n\n\t\tdfd.resolve()\n\t}\n\telse {\n\t\tvar imgString = image.replace(/^data:image\\/\\w+;base64,/, \"\")\n\t\tvar imgData = new Buffer(imgString, 'base64')\n\n\t\tvar that = this\n\n\t\tvar resultImages = []\n\n\t\t// fill in resultImages with converted versions\n\n\t\tfunction createImages(images) {\n\t\t\treturn images.reduce(function(promise, imageInfo) {\n\t\t\t\treturn promise.then(function() {\n\t\t\t\t\tvar dfd = when.defer()\n\n\t\t\t\t\tgm(imgData, \"img.png\")\n\t\t\t\t\t.identify(function(err, data) {\n\n\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\tconsole.error('PreviewImageProcessor: Failed to upload image', path, err)\n\t\t\t\t\t\t\tdfd.resolve()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar aspect = data.size.width / data.size.height\n\n\t\t\t\t\t\tgm(imgData, \"img.png\")\n\t\t\t\t\t\t.flip()\n\t\t\t\t\t\t.resize(imageInfo.height * aspect, imageInfo.height)\n\t\t\t\t\t\t.crop(imageInfo.width, imageInfo.height, (imageInfo.height * aspect - imageInfo.width) / 2, 0)\n\t\t\t\t\t\t.interlace('Line')\n\t\t\t\t\t\t.toBuffer('PNG', function(err, buffer) {\n\t\t\t\t\t\t\tif (err) {\n\t\t\t\t\t\t\t\tconsole.error('PreviewImageProcessor: Failed to upload image', path, err)\n\t\t\t\t\t\t\t\tdfd.resolve()\n\t\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tresultImages.push(buffer.toString('base64'))\n\t\t\t\t\t\t\tdfd.resolve()\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\n\t\t\t\t\treturn dfd.promise\n\t\t\t\t})\n\t\t\t}, Promise.resolve())\n\t\t}\n\n\t\tcreateImages(previewSizes).then(function() {\n\t\t\tdfd.resolve(resultImages)\n\t\t})\n\t}\n\n\treturn dfd.promise\n}\n\nmodule.exports = PreviewImageProcessor\n\n"
  },
  {
    "path": "lib/sandbox.js",
    "content": "module.exports = function createVizorSandbox() {\n\tvar sandbox = {\n\t\tnavigator: {\n\t\t\tuserAgent: 'node'\n\t\t},\n\t\tVizor: {\n\t\t},\n\t\tdocument: {\n\t\t\tcreateElementNS: function() {\n\t\t\t\treturn {\n\t\t\t\t\taddEventListener: function() {}\n\t\t\t\t}\n\t\t\t},\n\t\t\tcreateElement: function() {\n\t\t\t\treturn {\n\t\t\t\t\taddEventListener: function() {}\n\t\t\t\t}\n\t\t\t},\n\t\t\tgetElementsByTagName: function() {\n\t\t\t\treturn [{\n\t\t\t\t\tappendChild: function() {}\n\t\t\t\t}]\n\t\t\t}\n\t\t},\n\t\t$: function() {\n\t\t\treturn [ {\n\t\t\t\tgetContext: function() {}\n\t\t\t} ]\n\t\t},\n\t\tVizorWebVRAdapter: function() {\n\t\t\tthis.getEyeParameters = function() {\n\t\t\t\treturn { fieldOfView: {}}\n\t\t\t}\n\t\t},\n\t\tWebVRConfig: {},\n\t\taddEventListener: function() {},\n\t\tsetTimeout: function() {},\n\t\tconsole: console,\n\t\trequire: function() {\n\t\t\treturn {\n\t\t\t\tcancelTimer: function() {}\n\t\t\t}\n\t\t},\n\t\tmodule: undefined,\n\t\texports: undefined,\n\t\tdefine: undefined,\n\t\tmsg: function() {},\n\t\tscreen: {\n\t\t\twidth: 1024,\n\t\t\theight: 1024\n\t\t}\n\t}\n\t\n\tsandbox.window = sandbox\n\tsandbox.self = sandbox\n\n\treturn sandbox\n}\n"
  },
  {
    "path": "lib/sceneProcessor.js",
    "content": "const fs = require('fs')\nconst fsPath = require('path')\nconst when = require('when')\nconst yauzl = require('yauzl')\nconst slugify = require('../models/asset-helper').slugify\nconst replaceStream = require('replacestream')\nconst gm = require('gm')\nconst temp = require('temp').track()\nconst ImageProcessor = require('./imageProcessor')\n\nconst mainFileExtensions = [\n\t'.obj', '.js', '.json', '.gltf', '.fbx', '.dae'\n]\nconst textureExtensions = [\n\t'.jpg', '.jpeg', '.png', '.tga', '.dds', '.gif',\n]\nconst needsConversionExtensions = [\n\t'.tga', '.gif',\n]\nconst allowedExtensions = ['.mtl','.bin', '.glsl', '.txt']\n\t.concat(textureExtensions)\n\t.concat(mainFileExtensions)\n\nfunction SceneProcessor(storage) {\n\tif (!storage)\n\t\tthrow new Error('SceneProcessor got no storage')\n\n\tthis._fs = storage\n\tthis.imageProcessor = new ImageProcessor(this._fs)\n}\n\n/**\n * pre-process a file upload to build metadata and\n * determine whether we'll accept it\n */\nSceneProcessor.prototype.preprocess = function(file, sceneFolder) {\n\tvar dfd = when.defer()\n\tvar extname = fsPath.extname(file.path).toLowerCase()\n\tvar manifest = {\n\t\tfsPath: file.path,\n\t\tslug: slugify(fsPath.basename(file.path, fsPath.extname(file.path))),\n\t\tisArchive: extname === '.zip',\n\t\tvalid: false,\n\t\tfiles: {},\n\t\tchangedNames: {},\n\t\ttextures: []\n\t}\n\n\tmanifest.path = sceneFolder\n\n\tif (!manifest.isArchive) {\n\t\tmanifest.type = extname.substring(1)\n\t\tmanifest.dest = manifest.path = sceneFolder + '/' + manifest.slug + extname\n\t\tmanifest.valid = (mainFileExtensions.indexOf(extname) !== -1)\n\t\treturn when.resolve(manifest)\n\t}\n\n\tyauzl.open(file.path, function(err, zip) {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\n\t\tzip.on('entry', function(entry) {\n\t\t\tvar entryExt = fsPath.extname(entry.fileName)\n\t\t\tvar entryBn = fsPath.basename(entry.fileName)\n\n\t\t\tif (allowedExtensions.indexOf(entryExt) === -1 ||\n\t\t\t\tentryBn[0] === '.' ||\n\t\t\t\tentryBn[0] === '_')\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar mf = {\n\t\t\t\tpath: entry.fileName,\n\t\t\t\tbasename: entryBn,\n\t\t\t\tslug: fsPath.basename(entryBn, entryExt),\n\t\t\t\textname: entryExt,\n\t\t\t}\n\n\t\t\tif (mainFileExtensions.indexOf(entryExt) > -1) {\n\t\t\t\t// object\n\t\t\t\tif (!manifest.type)\n\t\t\t\t\tmanifest.type = mf.extname.substring(1)\n\n\t\t\t\tmanifest.valid = true\n\t\t\t\tmf.isMainFile = true\n\t\t\t\tmf.slug = manifest.slug\n\t\t\t} else {\n\t\t\t\t// asset\n\t\t\t\tmf.isTexture = textureExtensions.indexOf(entryExt) > -1\n\t\t\t\tmf.needsConversion = needsConversionExtensions.indexOf(entryExt) > -1\n\n\t\t\t\tif (mf.isTexture && mf.needsConversion)\n\t\t\t\t\tmf.extname = '.png'\n\n\t\t\t\tif (mf.extname === '.mtl') {\n\t\t\t\t\tmf.isMaterial = true\n\t\t\t\t\tmanifest.type = 'objmtl'\n\t\t\t\t\tmf.slug = manifest.slug\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tmf.dest = sceneFolder + '/' + mf.slug + mf.extname\n\t\t\tmf.destBasename = fsPath.basename(mf.dest)\n\n\t\t\tif (mf.basename !== mf.destBasename)\n\t\t\t\tmanifest.changedNames[mf.basename] = mf.destBasename\n\n\t\t\tif (mf.isTexture)\n\t\t\t\tmanifest.textures.push(mf.dest)\n\n\t\t\tmanifest.files[mf.basename] = mf\n\t\t})\n\t\t.on('error', function(err) {\n\t\t\tconsole.error(err)\n\t\t\tdfd.resolve(manifest)\n\t\t})\n\t\t.on('close', function() {\n\t\t\tdfd.resolve(manifest)\n\t\t})\n\t})\n\n\treturn dfd.promise\n}\n\nSceneProcessor.prototype.handleUpload = function(file, sceneRoot) {\n\tvar that = this\n\tvar extless = fsPath.basename(file.name, fsPath.extname(file.name))\n\tvar sceneSlug = sceneRoot + '/' + slugify(extless)\n\n\tconsole.info('SceneProcessor.handleUpload', file.path, sceneSlug)\n\n\treturn this.preprocess(file, sceneSlug)\n\t.then(function(manifest) {\n\t\tconsole.info(' - manifest', manifest)\n\n\t\tif (!manifest.valid)\n\t\t\treturn new Error('We support the following file formats: ' + mainFileExtensions.join(', '))\n\n\t\tif (manifest.isArchive)\n\t\t\treturn that.processZipUpload(manifest, file)\n\n\t\tvar readStream = fs.createReadStream(file.path)\n\n\t\treturn that.writeStreamToGridFs(readStream, manifest.dest)\n\t\t.then(function(gf) {\n\t\t\treturn {\n\t\t\t\tpath: manifest.dest,\n\t\t\t\turl: gf.url,\n\t\t\t\ttype: manifest.type,\n\t\t\t\tfiles: [ gf.url ]\n\t\t\t}\n\t\t})\n\t})\n}\n\nSceneProcessor.prototype.writeStreamToGridFs = function(readStream, destPath) {\n\tvar that = this\n\tvar dfd = when.defer()\n\n\tthis._fs.createWriteStream(destPath)\n\t.then(function(writeStream) {\n\t\treadStream.pipe(writeStream)\n\t\t.on('error', function(err) {\n\t\t\tdfd.reject(err)\n\t\t})\n\t\t.on('close', function() {\n\t\t\tdfd.resolve({\n\t\t\t\tpath: destPath,\n\t\t\t\turl: that._fs.url(destPath)\n\t\t\t})\n\t\t})\n\t})\n\n\treturn dfd.promise\n}\n\nSceneProcessor.prototype.processZipUpload = function(zipManif, file) {\n\tvar dfd = when.defer()\n\tvar that = this\n\tvar files = []\n\tvar textures = []\n\tvar processing = 0\n\tvar closed = false\n\tvar mainFileUrl\n\n\tvar changedNames = Object.keys(zipManif.changedNames)\n\n\tconsole.info(' Processing zip upload', zipManif)\n\n\tyauzl.open(file.path, function(err, zip) {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\n\t\tfunction handleError(err) {\n\t\t\tzip.close()\n\t\t\tdfd.reject(err)\n\t\t}\n\n\t\tzip.on('entry', function(entry) {\n\t\t\tvar entryManif = zipManif.files[fsPath.basename(entry.fileName)]\n\t\t\tif (!entryManif)\n\t\t\t\treturn;\n\n\t\t\tfunction writeEntry(fromStream) {\n\t\t\t\treturn that.writeStreamToGridFs(fromStream, entryManif.dest)\n\t\t\t\t.then(function(wroteFile) {\n\t\t\t\t\tfiles.push(wroteFile.url)\n\n\t\t\t\t\tif (entryManif.isTexture)\n\t\t\t\t\t\ttextures.push(wroteFile.url)\n\n\t\t\t\t\tif (entryManif.isMainFile)\n\t\t\t\t\t\tmainFileUrl = wroteFile.url\n\n\t\t\t\t\tprocessing--\n\n\t\t\t\t\tif (closed && !processing) {\n\t\t\t\t\t\tvar zipAsset = {\n\t\t\t\t\t\t\tpath: zipManif.path,\n\t\t\t\t\t\t\turl: mainFileUrl,\n\t\t\t\t\t\t\ttype: zipManif.type,\n\t\t\t\t\t\t\ttextures: textures,\n\t\t\t\t\t\t\tfiles: files\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconsole.info(' - zip asset', zipAsset)\n\n\t\t\t\t\t\tdfd.resolve(zipAsset)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(handleError)\n\t\t\t}\n\n\t\t\tzip.openReadStream(entry, function(err, readStream) {\n\t\t\t\tif (err)\n\t\t\t\t\treturn handleError(err)\n\n\t\t\t\tprocessing++\n\n\t\t\t\t// change names in material file\n\t\t\t\tif (changedNames.length && entryManif.isMaterial) {\n\t\t\t\t\tvar filterStream = readStream\n\t\t\t\t\tchangedNames.map(function(fromName) {\n\t\t\t\t\t\tfilterStream = filterStream.pipe(\n\t\t\t\t\t\t\treplaceStream(fromName, zipManif.changedNames[fromName]))\n\t\t\t\t\t})\n\t\t\t\t\treturn writeEntry(filterStream)\n\t\t\t\t}\n\n\t\t\t\tif (!entryManif.needsConversion)\n\t\t\t\t\treturn writeEntry(readStream)\n\n\t\t\t\tif (entryManif.isTexture) {\n\t\t\t\t\treturn that.convertTexture(entryManif.basename, readStream)\n\t\t\t\t\t.then(function(convertedPath) {\n\t\t\t\t\t\treturn writeEntry(fs.createReadStream(convertedPath))\n\t\t\t\t\t\t.then(() => {\n\t\t\t\t\t\t\tfs.unlink(convertedPath)\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t\t.on('error', handleError)\n\t\t.on('close', function() {\n\t\t\tclosed = true\n\t\t})\n\t\t.on('end', function() {\n\t\t})\n\t})\n\n\treturn dfd.promise\n}\n\nSceneProcessor.prototype.convertTexture = function(basename, readStream) {\n\tvar that = this\n\tvar dfd = when.defer()\n\n\t// write the readStream into a file\n\tvar tempPath = temp.path({ suffix: fsPath.extname(basename) })\n\tvar writeStream = fs.createWriteStream(tempPath)\n\n\treadStream.pipe(writeStream)\n\t.on('error', function(err) {\n\t\tfs.unlink(tempPath)\n\t\tdfd.reject(err)\n\t})\n\t.on('close', function() {\n\t\tthat.imageProcessor.normalizeImage(tempPath)\n\t\t.then(function(convertedPath) {\n\t\t\tfs.unlink(tempPath)\n\t\t\tdfd.resolve(convertedPath)\n\t\t})\n\t\t.catch(function(err) {\n\t\t\tdfd.reject(err)\n\t\t})\n\t})\n\n\treturn dfd.promise\n}\n\nmodule.exports = SceneProcessor\n"
  },
  {
    "path": "lib/streamFile.js",
    "content": "var fsPath = require('path')\nvar config = require('../config/config.js')\nvar when = require('when')\n\nfunction streamFile(req, res, next, gfs) {\n\tvar path = req.path.replace(/^\\/data/, '')\n\tvar extname = fsPath.extname(path)\n\tvar model = path.split('/')[1]\n\tvar cacheControl\n\tvar expires = ''\n\n\tif (config.server.useCDN) {\n\t\tres.redirect(301, config.server.cdnRoot + path)\n\t\treturn when.resolve()\n\t}\n\n\tswitch(model) {\n\t\tcase 'dist':\n\t\tcase 'graph':\n\t\t\t// minimal caching, please\n\t\t\tcacheControl = 'public, must-revalidate'\n\t\t\tbreak;\n\t\tdefault:\n\t\t\t// strong caching\n \t\t\tcacheControl = 'public'\n \t\t\texpires = 'Sun, 17-Jan-2038 19:14:07 GMT'\n \t\t\tbreak;\n\t}\n\n\treturn gfs.stat(path)\n\t.then(function(stat) {\n\t\tif (!stat)\n\t\t\treturn res.status(404).send();\n\n\t\tif (req.header('If-None-Match') === stat.md5)\n\t\t\treturn res.status(304).send();\n\n\t\tres.header('Content-Type', stat.contentType)\n\t\tres.header('Cache-Control', cacheControl)\n\n\t\tif (expires)\n\t\t\tres.header('Expires', expires)\n\n\t\tif (req.headers.range) {\n\t\t\t// stream partial file range\n\t\t\tvar parts = req.headers.range.replace(/bytes[=:]/, \"\").split(\"-\");\n\t\t\tvar partialstart = parts[0];\n\t\t\tvar partialend = parts[1];\n\n\t\t\t// start&end offset are inclusive, end is optional\n\t\t\tvar start = parseInt(partialstart, 10);\n\t\t\tvar end = partialend ? parseInt(partialend, 10) : (stat.length - 1);\n\n\t\t\tvar chunksize = (end - start) + 1;\n\n\t\t\tres.header('Content-Range', 'bytes ' + start + '-' + end + '/' + stat.length);\n\t\t\tres.header('Content-Length', chunksize)\n\t\t\tres.header('Accept-Ranges', 'bytes')\n\n\t\t\tres.status(206);\n\n\t\t\tvar range = {startPos: start, endPos: end};\n\t\t\tgfs.createReadStream(path, range)\n\t\t\t.on('error', next)\n\t\t\t.pipe(res);\n\t\t} else {\n\t\t\t// stream whole file in a single request\n\n\t\t\t// only accept range-requests on audio and video\n\t\t\tvar rangeableTypes = ['.mp3', '.m4a', '.ogg', '.mp4', '.ogm', '.ogv']\n\t\t\tif (rangeableTypes.indexOf(extname) !== -1)\n\t\t\t\t\tres.header('Accept-Ranges', 'bytes')\n\n\t\t\tres.header('ETag', stat.md5);\n\t\t\tres.header('Content-Length', stat.length)\n\n\t\t\tgfs.createReadStream(path)\n\t\t\t.on('error', next)\n\t\t\t.pipe(res)\n\n\t\t}\n\t})\n}\n\nmodule.exports = streamFile\n"
  },
  {
    "path": "lib/stringUtil.js",
    "content": "exports.isStringEmpty = function isStringEmpty(str) {\n\treturn (str.length === 0 || !str.trim());\n}\n\nexports.makeRandomString = function makeRandomString(len) {\n\tvar keys = 'abcdefghjkmnpqrstuvwxyz23456789ABCDEFGHJKLMNPQRSTUVWXYZ'\n\tvar str = ''\n\tfor (var i=0; i < len; i++) {\n\t\tstr += keys[Math.floor(Math.random() * keys.length)]\n\t}\n\treturn str\n}\n"
  },
  {
    "path": "lib/templateCache.js",
    "content": "var gulp = require('gulp')\nvar handlebars = require('gulp-handlebars')\nvar wrap = require('gulp-wrap')\nvar declare = require('gulp-declare')\nvar concat = require('gulp-concat')\nvar path = require('path')\nvar diyHbsHelpers = require('diy-handlebars-helpers')\nvar hbsHelpers = require('./hbs-helpers')\n\nvar views = ''\nvar partials=''\nvar helpers=''\n\nfunction TemplateCache() {\n\tthis.hbsOptions = {}\n}\n\nTemplateCache.prototype.recompile = function(cb) {\n\tviews = ''\n\tpartials = ''\n\thelpers = ''\n\treturn this.compile(cb)\n}\nTemplateCache.prototype.setHbs = function(hbs) {\n\tthis.hbsOptions.handlebars = hbs\n}\n\nTemplateCache.prototype.compile = function(cb) {\n\tvar that = this\n\n\tif (partials && helpers && views) {\n\t\treturn cb && cb()\n\t}\n\n\tvar partialPaths = [\n\t\t__dirname+'/../views/partials/**/*.handlebars'\n\t\t// server/partials not in cache\n\t]\n\n\tvar sourcePaths = [\n\t\t__dirname+'/../views/**/*.handlebars',\n\t\t'!'+__dirname+'/../views/server/**/*.handlebars',\n\t\t'!'+__dirname+'/../views/layouts/*.handlebars',\n\t\t'!'+__dirname+'/../views/graph/*.handlebars',\n\t\t'!'+__dirname+'/../views/*.handlebars'\n\t]\n\n\t// registers diyHbsHelpers and hbsHelpers to use client-side\n\tfunction makeHelpers() {\n\t\tvar helpersJs = []\n\t\tvar key\n\t\tfor (key in diyHbsHelpers) {\n\t\t\tif (key !== 'templateCache')\n\t\t\t\thelpersJs.push(\"Handlebars.registerHelper('\" + key + \"',\" + diyHbsHelpers[key].toString()+\");\")\n\t\t}\n\t\tfor (key in hbsHelpers) {\n\t\t\thelpersJs.push(\"Handlebars.registerHelper('\" + key + \"',\" + hbsHelpers[key].toString()+\");\")\n\t\t}\n\t\treturn helpers = helpersJs.join(\"\\n\")\n\t}\n\n\tfunction makePartials() {\n\t\treturn gulp.src(partialPaths)\n\t\t\t.pipe(handlebars(that.hbsOptions))\n\t\t\t.pipe(wrap('Handlebars.registerPartial(<%= processPartialName(file.relative) %>, <%= partialToE2Name(file.relative) %>);', {}, {\n\t\t\t\timports: {\n\t\t\t\t\t// makes a name for a partial from its filename, e.g. assets/graphCard\n\t\t\t\t\tprocessPartialName: function (fileName) {\n\t\t\t\t\t\tvar parts = fileName.split('/')\n\t\t\t\t\t\tvar prefix = ''\n\t\t\t\t\t\tif (parts.length > 1) {\n\t\t\t\t\t\t\tparts.pop()\n\t\t\t\t\t\t\tprefix = parts.pop() + '/'\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar n = prefix + path.basename(fileName, '.js')\t// gulp\n\t\t\t\t\t\treturn JSON.stringify(n)\n\t\t\t\t\t},\n\t\t\t\t\t// maps a partial to its E2.views.partials precompiled template\n\t\t\t\t\tpartialToE2Name: function (fileName) {\n\t\t\t\t\t\tvar name = path.basename(fileName, '.js')\n\t\t\t\t\t\tfileName = fileName.split('/')\n\t\t\t\t\t\tfileName.pop()\t\t// name.js\n\t\t\t\t\t\tfileName.push(name)\t// name\n\t\t\t\t\t\treturn \"E2.views.partials.\" + fileName.join(\".\")\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}))\n\t\t\t.pipe(concat('partials'))\n\t\t\t.on('data', function (data) {\n\t\t\t\tpartials += data.contents\n\t\t\t})\n\t\t\t.on('end', function () {\n\t\t\t\tif (cb)\n\t\t\t\t\tcb()\n\t\t\t})\n\t}\n\n\n\tfunction makeTemplates(cb) {\n\t\treturn gulp.src(sourcePaths)\n\t\t\t.pipe(handlebars(that.hbsOptions))\n\t\t\t.pipe(wrap('Handlebars.template(<%= contents %>)'))\n\t\t\t.pipe(declare({\n\t\t\t\tnamespace: 'E2',\n\t\t\t\tnoRedeclare: true, // Avoid duplicate declarations\n\t\t\t\tprocessName: declare.processNameByPath\n\t\t\t}))\n\t\t\t.pipe(concat('templates'))\n\t\t\t.on('data', function (data) {\n\t\t\t\tviews += data.contents\n\t\t\t})\n\t\t\t.on('end', function () {\n\t\t\t\tif (cb)\n\t\t\t\t\tcb()\n\t\t\t})\n\t}\n\n\tmakeHelpers()\t\t\t\t// sets helpers\n\tmakeTemplates(function(){\t// sets cache\n\t\tmakePartials(cb)\t\t// sets partials\n\t})\n\n\t// not a bad idea to make this into a file and serve it separately\n\treturn this\n}\n\nTemplateCache.prototype.helper = function() {\n\treturn {\n\t\ttemplateCache: function() {\n\t\t\treturn helpers + views + partials\n\t\t}\n\t}\n}\n\nmodule.exports.templateCache = new TemplateCache()\n"
  },
  {
    "path": "lib/wschannel-server.js",
    "content": "var WebSocketServer = require('ws').Server;\nvar config = require('../config/config.js').server;\nvar crypto = require('crypto');\n\nfunction encode(obj)\n{\n\tif(!obj.channel)\n\t\tobj.channel = 'server';\n\n\tif(!obj.from)\n\t\tobj.from = 'server';\n\n\treturn JSON.stringify(obj);\n}\n\nfunction onSocketError(err)\n{\n\tif(err)\n\t\tconsole.error('Error writing to socket:', err.stack)\n}\n\nfunction WsChannelServer()\n{\n\tthis.config = config;\n\tthis.clients = {};\n\tthis.channels = {};\n}\n\nWsChannelServer.prototype.listen = function(httpServer)\n{\n\tthis.wss = new WebSocketServer(\n\t{\n\t\tserver: httpServer,\n\t\tpath: '/__wschannel'\n\t});\n\n\tthis.wss.on('connection', function(socket)\n\t{\n\t\tvar client =\n\t\t{\n\t\t\tsocket: socket,\n\t\t\tid: crypto.randomBytes(20).toString('hex'),\n\t\t\tchannels: []\n\t\t};\n\n\t\tthis.clients[client.id] = client;\n\t\tsocket.on('message', this.handleMessage.bind(this, client));\n\t\tsocket.on('close', function()\n\t\t{\n\t\t\tfor(var ch in client.channels)\n\t\t\t\tthis.leaveChannel(ch, client);\n\n\t\t\tdelete this.clients[client.id];\n\t\t}.bind(this));\n\n\t\tthis.send(socket,\n\t\t{\n\t\t\tkind: 'READY', data: client.id\n\t\t});\n\t}.bind(this));\n\n\tconsole.log('Channel server ready');\n}\n\nWsChannelServer.prototype.close = function()\n{\n\tthis.wss.close();\n\tthis.clients = {};\n\tthis.channels = {};\n};\n\nWsChannelServer.prototype.handleMessage = function(client, m)\n{\n\tif(this.config.debug)\n\t\tconsole.log('WS In:', m);\n\n\tvar message = JSON.parse(m);\n\tmessage.from = client.id;\n\n\tif (!message.channel)\n\t\treturn;\n\n\tswitch(message.kind)\n\t{\n\t\tcase 'join':\n\t\t\tthis.joinChannel(message.channel, client);\n\t\t\tbreak;\n\t\tcase 'leave':\n\t\t\tthis.leaveChannel(message.channel, client);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tthis.sendToChannel(message.channel, message, client.id);\n\t\t\tbreak;\n\t}\n};\n\nWsChannelServer.prototype.joinChannel = function(channelName, client)\n{\n\tif(this.config.debug)\n\t\tconsole.log('WS Join:', channelName, client.id);\n\n\tif(client.channels.indexOf(channelName) !== -1)\n\t\treturn;\n\n\tif(!this.channels[channelName])\n\t\tthis.channels[channelName] = [];\n\n\tvar chan = this.channels[channelName];\n\n\tclient.channels.push(channelName);\n\tchan.push(client);\n\n\tthis.sendToChannel(channelName,\n\t{\n\t\tchannel: channelName, kind: 'join', data: client.id\n\t}, client.id);\n\n\tfor(var ch in chan)\n\t{\n\t\tvar oc = chan[ch];\n\n\t\tif(oc.id === client.id)\n\t\t\treturn;\n\n\t\tthis.send(client.socket,\n\t\t{\n\t\t\tchannel: channelName, kind: 'join', data: oc.id\n\t\t});\n\t}\n};\n\nWsChannelServer.prototype.leaveChannel = function(channelName, client)\n{\n\tif(this.config.debug)\n\t\tconsole.log('WS Leave:', channelName, client.id);\n\n\tif(!this.channels[channelName] || this.channels[channelName].indexOf(client) === -1)\n\t\treturn;\n\n\tthis.sendToChannel(channelName,\n\t{\n\t\tchannel: channelName, kind: 'leave', data: client.id\n\t}, client.id);\n\n\tthis.channels[channelName] = this.channels[channelName].filter(function(cl)\n\t{\n\t\treturn (client.id !== cl.id)\n\t});\n\n\tclient.channels = client.channels.filter(function(ch)\n\t{\n\t\treturn (ch !== channelName);\n\t});\n};\n\nWsChannelServer.prototype.sendToChannel = function(channelName, message, exceptId)\n{\n\tif(!this.channels[channelName])\n\t\treturn;\n\n\tthis.channels[channelName].forEach(function(client)\n\t{\n\t\tif(exceptId !== client.id)\n\t\t\tthis.send(client.socket, message);\n\t}.bind(this));\n};\n\nWsChannelServer.prototype.send = function(socket, message)\n{\n\tif(this.config.debug)\n\t\tconsole.log('Ws Out:', message);\n\n\tsocket.send(encode(message), onSocketError);\n};\n\nexports.WsChannelServer = WsChannelServer;\n"
  },
  {
    "path": "modelRoutes.js",
    "content": "var fsPath = require('path')\nvar temp = require('temp').track();\nvar multer = require('multer');\nvar path = require('path');\nvar makeRandomString = require('./lib/stringUtil').makeRandomString\n\nvar tempDir;\ntemp.mkdir('uploads', function(err, dirPath) {\n\tif (err)\n\t\tthrow err;\n\ttempDir = dirPath;\n});\n\nfunction requireAdminUser(req, res, next) {\n\tif (req.user && req.user.isAdmin)\n\t\treturn next()\n\n\tres.sendStatus(401)\n}\n\nfunction setupDefaultRoutes(\n\tapp,\n\tcloudStorage,\n\tmongoConnection,\n\tpassportConf\n){\n\t// ----- MODEL ROUTES\n\n\t// Asset controllers\n\tvar AssetController = require('./controllers/assetController');\n\tvar GraphController = require('./controllers/graphController');\n\tvar ImageController = require('./controllers/imageController');\n\tvar SceneController = require('./controllers/sceneController');\n\tvar PatchController = require('./controllers/patchController');\n\n\tvar AssetService = require('./services/assetService');\n\tvar GraphService = require('./services/graphService');\n\n\tvar EditLogController = require('./controllers/editLogController');\n\tvar editLogController = new EditLogController()\n\n\tvar DocumentationController = require('./controllers/documentationController');\n\tvar documentationController = new DocumentationController();\n\n\tvar graphController = new GraphController(\n\t\tnew GraphService(require('./models/graph'), cloudStorage),\n\t\tcloudStorage,\n\t\tmongoConnection\n\t);\n\n\tvar imageController = new ImageController(\n\t\tnew AssetService(require('./models/image')),\n\t\tcloudStorage\n\t);\n\n\tvar sceneController = new SceneController(\n\t\tnew AssetService(require('./models/scene')),\n\t\tcloudStorage\n\t);\n\n\tvar AudioModel = require('./models/audio');\n\tvar audioController = new AssetController(\n\t\tAudioModel,\n\t\tnew AssetService(AudioModel),\n\t\tcloudStorage\n\t);\n\n\tvar VideoModel = require('./models/video');\n\tvar videoController = new AssetController(\n\t\tVideoModel,\n\t\tnew AssetService(VideoModel),\n\t\tcloudStorage\n\t);\n\n\tvar patchController = new PatchController(\n\t\tnew AssetService(require('./models/patch')),\n\t\tcloudStorage\n\t);\n\n\tvar JsonModel = require('./models/json');\n\tvar jsonController = new AssetController(\n\t\tJsonModel,\n\t\tnew AssetService(JsonModel),\n\t\tcloudStorage\n\t);\n\n\tvar controllers = {\n\t\tgraph: graphController,\n\t\timage: imageController,\n\t\tscene: sceneController,\n\t\taudio: audioController,\n\t\tvideo: videoController,\n\t\tjson: jsonController,\n\n\t\tpatch: patchController\n\t}\n\n\tfunction getController(req, res, next) {\n\t\treq.controller = controllers[req.params.model];\n\t\tnext();\n\t}\n\n\tfunction requireController(req, res, next) {\n\t\treq.controller = controllers[req.params.model];\n\t\tif (!req.controller) {\n\t\t\tvar e = new Error('Not found: '+req.path);\n\t\t\te.status = 404;\n\t\t\treturn next(e);\n\t\t}\n\t\tnext();\n\t}\n\n\tfunction expectUploadedFile(req, res, next) {\n\t\tvar file = req.files.file\n\n\t\tif (!file) {\n\t\t\tvar e = new Error('Please upload an image')\n\t\t\te.status = 400\n\t\t\treturn next(e)\n\t\t}\n\n\t\tnext()\n\t}\n\n\t// upload user profile avatar picture\n\tapp.post('/account/profile/avatar',\n\t\tpassportConf.isAuthenticated,\n\t\tmulter({\n\t\t\tdest: tempDir,\n\t\t\tlimits: {\n\t\t\t\tfileSize: 1024 * 1024 * 8 // 8m\n\t\t\t},\n\t\t\trename: function (fieldname, filename) {\n\t\t\t\treturn filename.replace(/\\W+/g, '-');\n\t\t\t}\n\t\t}),\n\t\texpectUploadedFile,\n\t\timageController.setUserAvatar.bind(imageController))\n\n\t// upload user profile header picture\n\tapp.post('/account/profile/header',\n\t\tpassportConf.isAuthenticated,\n\t\tmulter({\n\t\t\tdest: tempDir,\n\t\t\tlimits: {\n\t\t\t\tfileSize: 1024 * 1024 * 8 // 8m\n\t\t\t},\n\t\t\trename: function (fieldname, filename) {\n\t\t\t\treturn filename.replace(/\\W+/g, '-');\n\t\t\t}\n\t\t}),\n\t\timageController.setUserHeader.bind(imageController))\n\n\n\t// upload\n\tapp.post('/upload/:model',\n\t\trequireController,\n\t\tpassportConf.isAuthenticated,\n\t\tmulter({\n\t\t\tdest: tempDir,\n\t\t\tlimits: {\n\t\t\t\tfileSize: 1024 * 1024 * 128 // 128m\n\t\t\t},\n\t\t\trename: function (fieldname, filename) {\n\t\t\t\treturn filename.replace(/\\W+/g, '-');\n\t\t\t}\n\t\t}),\n\t\texpectUploadedFile,\n\t\tfunction(req, res, next) {\n\t\t\t// imageProcessor will checksum the file\n\t\t\tif (req.params.model === 'image')\n\t\t\t\treturn next()\n\n\t\t\treq.controller.checksumUpload(req, res, next)\n\t\t},\n\t\tfunction(req, res, next) {\n\t\t\treq.controller.canWriteUpload(req, res, next)\n\t\t},\n\t\tfunction(req, res, next) {\n\t\t\treq.controller.upload(req, res, next)\n\t\t}\n\t);\n\n\t// anonymous upload, no auth required\n\tapp.post('/uploadAnonymous/:model',\n\t\trequireController,\n\t\tmulter({\n\t\t\tdest: tempDir,\n\t\t\tlimits: {\n\t\t\t\tfileSize: 1024 * 1024 * 128 // 128m\n\t\t\t},\n\t\t\trename: function (fieldname, filename) {\n\t\t\t\t// Rename the file to a random string\n\t\t\t\tvar randomStr = makeRandomString(12);\n\t\t\t\tvar fileExt = path.extname(filename);\n\t\t\t\tvar newName = randomStr + fileExt;\n\n\t\t\t\treturn newName;\n\t\t\t}\n\t\t}),\n\t\texpectUploadedFile,\n\t\tfunction(req, res, next) {\n\t\t\t// imageProcessor will checksum the file\n\t\t\tif (req.params.model === 'image')\n\t\t\t\treturn next()\n\n\t\t\treq.controller.checksumUpload(req, res, next)\n\t\t},\n\t\tfunction(req, res, next) {\n\t\t\treq.controller.canWriteUploadAnonymous(req, res, next)\n\t\t},\n\t\tfunction(req, res, next) {\n\t\t\treq.controller.uploadAnonymous(req, res, next)\n\t\t}\n\t);\n\n\t// -----\n\t// Admin\n\tapp.get('/admin/list',\n\t\trequireAdminUser,\n\t\tfunction(req, res, next) {\n\t\t\tgraphController.adminIndex(req, res, next)\n\t\t}\n\t)\n\n\t// -----\n\t// Edit Log routes\n\tapp.get('/editlog', function(req, res, next) {\n\t\treturn editLogController.userIndex(req, res, next)\n\t})\n\n\tapp.get('/editlog/:channelName', function(req, res, next) {\n\t\treturn editLogController.show(req, res, next)\n\t})\n\n\tapp.post('/editlog/:channelName', function(req, res, next) {\n\t\treturn editLogController.save(req, res, next)\n\t})\n\n\tapp.post('/editlog/:channelName/join', function(req, res, next) {\n\t\treturn editLogController.join(req, res, next)\n\t})\n\n\t// -----\n\t// User Patch routes\n\tapp.get('/:username/patches', function(req, res, next) {\n\t\tpatchController.findByCreatorName(req, res, next);\n\t})\n\n\tapp.post('/:username/patches', function(req, res, next) {\n\t\tpatchController.save(req, res, next);\n\t})\n\n\t// -----\n\t// Graph routes\n\n\t// save, anonymous\n\tapp.post('/:model/v',\n\t\trequireController,\n\t\tfunction(req, res, next) {\n\t\t\treq.user = {\n\t\t\t\tusername: 'v'\n\t\t\t}\n\n\t\t\tif (req.params.model === 'graph')\n\t\t\t\treturn req.controller.saveAnonymous(req, res, next)\n\n\t\t\treq.controller.uploadAnonymous(req, res, next)\n\t\t}\n\t)\n\n\tapp.get(['/editor', '/edit'], graphController.edit.bind(graphController));\n\n\t// GET /embed/fthr/dunes-world -- EMBED\n\tapp.get('/embed/:username/:graph', function(req, res, next) {\n\t\treq.params.path = '/'+req.params.username+'/'+req.params.graph;\n\t\tgraphController.embed(req, res, next);\n\t});\n\n\t// GET /fthr/dunes-world/edit -- EDITOR\n\tapp.get('/:username/:graph/edit', function(req, res, next) {\n\t\treq.params.path = '/'+req.params.username+'/'+req.params.graph;\n\t\tgraphController.edit(req, res, next);\n\t});\n\n\t// GET /fthr/dunes-world.json\n\tapp.get('/:username/:graph.json', function(req, res, next) {\n\t\treq.params.path = '/'+req.params.username+'/'+req.params.graph.replace(/\\.json$/g, '');\n\t\tgraphController.load(req, res, next);\n\t});\n\n\t// GET /fthr/dunes-world -- PLAYER\n\tapp.get('/:username/:graph', function(req, res, next) {\n\t\treq.params.path = '/'+req.params.username+'/'+req.params.graph\n\t\tgraphController.graphLanding(req, res, next)\n\t})\n\n\t// POST /fthr/dunes-world -- USERPAGE\n\tapp.post('/:username/:graph',\n\t\tpassportConf.isAuthenticated,\n\t\tfunction(req, res, next) {\n\t\t\treq.params.path = '/'+req.params.username+'/'+req.params.graph\n\t\t\tgraphController.graphModify(req, res, next)\n\t\t})\n\n\t// DELETE /fthr/dunes-world\n\tapp.delete('/:username/:graph',\n\t\tpassportConf.isAuthenticated,\n\t\tfunction(req, res, next) {\n\t\t\treq.params.path = '/'+req.params.username+'/'+req.params.graph\n\t\t\tgraphController.delete(req, res, next)\n\t\t})\n\n\t// GET /fthr/dunes-world/graph.json\n\tapp.get('/:username/:graph/graph.json', function(req, res, next) {\n\t\treq.params.path = '/'+req.params.username+'/'+req.params.graph.replace(/\\.json$/g, '');\n\t\tgraphController.stream(req, res, next);\n\t});\n\n\t// ----\n\t// Documentation\n\tapp.get('/docs/plugins/:pluginName', function(req, res, next) {\n\t\tdocumentationController.getPluginDocumentation(req, res, next);\n\t});\n\n\t// ----\n\t// Metadata on images\n\tapp.get(/^\\/meta\\/.*/, function(req, res, next) {\n\t\timageController.getMetadata(req, res, next);\n\t})\n\n\n\t// -----\n\t// Generic model routes\n\n\t// latest (\"I'm feeling lucky\")\n\tapp.get('/~latest-graph', function(req,res,next) {\n\t\tgraphController.latest(req, res, next)\n\t})\n\n\t// discovery\n\tapp.get([\n\t\t'/browse',\n\t\t'/browse/page/:page',\n\t\t'/graphs',\n\t\t'/graphs/page/:page'\n\t], function(req, res, next) {\n\t\tgraphController.publicRankedIndex(req, res, next)\n\t})\n\n\t// list own assets\n\tapp.get(['/:model', '/:model/page/:page'], getController, function(req, res, next) {\n\t\tif (!req.controller)\n\t\t\treturn graphController.userIndex(req, res, next)\n\n\t\trequireController(req, res, function(err) {\n\t\t\tif (err)\n\t\t\t\treturn next(err)\n\n\t\t\treturn req.controller.userIndex(req, res, next)\n\t\t})\n\t})\n\n\t// list user assets\n\tapp.get(['/:username/assets/:model', '/:username/assets/:model.json'], getController, function(req, res, next) {\n\t\trequireController(req, res, function(err) {\n\t\t\tif (err)\n\t\t\t\treturn next(err)\n\n\t\t\treturn req.controller.userIndex(req, res, next)\n\t\t})\n\t})\n\n\t// stream a file by asset path\n\t// usually done by hash, but for audio, we need ogg and m4a on the same name\n\tapp.get('/:username/assets/:model/:filename', getController, function(req, res, next) {\n\t\trequireController(req, res, function(err) {\n\t\t\tif (err)\n\t\t\t\treturn next(err)\n\n\t\t\treturn req.controller.streamFile(req, res, next)\n\t\t})\n\t})\n\n\t// list by tag for user\n\tapp.get('/:username/assets/:model/tag/:tag', requireController, function(req, res, next) {\n\t\treq.controller.findByTagAndUsername(req, res, next)\n\t})\n\n\t// list by tag for current user\n\tapp.get('/:model/tag/:tag',\n\t\trequireController,\n\t\tfunction(req, res, next) {\n\t\t\tif (!req.user || !req.user.username)\n\t\t\t\treturn res.json([])\n\n\t\t\treq.params.username = req.user.username;\n\t\t\treq.controller.findByTagAndUsername(req, res, next)\n\t\t})\n\n\t// get\n\tapp.get('/:model/:id', requireController, function(req, res, next) {\n\t\treq.controller.load(req, res, next)\n\t})\n\n\t// save\n\tapp.post('/:model',\n\t\trequireController,\n\t\tpassportConf.isAuthenticated,\n\t\tfunction(req, res, next) {\n\t\t\treq.controller.save(req, res, next)\n\t\t}\n\t)\n\n\t// last resort Graph URLs\n\n\t// GET /ju63\n\tapp.get('/:path', function(req, res, next) {\n\t\treq.params.path = '/'+req.params.path\n\t\tgraphController.edit(req, res, next)\n\t})\n\n}\n\nmodule.exports = {\n\tsetupDefaultRoutes: setupDefaultRoutes,\n}\n"
  },
  {
    "path": "models/asset-helper.js",
    "content": "var mongoose = require('mongoose')\nvar Schema = mongoose.Schema\n\nexports.schema =  {\n\t_creator: { type: Schema.Types.ObjectId, ref: 'User' },\n\tpath: {\n\t\ttype: String,\n\t\trequired: true, \n\t\tmatch: [\n\t\t\t/[\\w0-9\\-\\_\\/\\.]/,\n\t\t\t'Path must be alphanumeric'\n\t\t],\n\t\tunique: true\n\t},\n\turl: { type: String, required: true },\n\ttags: [{\n\t\ttype: String,\n\t\tmatch: [\n\t\t\t/[a-z0-9\\-\\_]/,\n\t\t\t'Tags must be alphanumeric and lowercase'\n\t\t],\n\t\tindex: true\n\t}],\n\tupdatedAt: { type: Date, default: Date.now },\n\tcreatedAt: { type: Date, default: Date.now }\n}\n\nexports.slugify = function slugify(name) {\n\treturn name.toLowerCase()\n\t\t.replace(/[^\\w-]+/g,' ')\n\t\t.trim()\n\t\t.replace(/ +/g, '-')\n}\n\n"
  },
  {
    "path": "models/audio.js",
    "content": "var mongoose = require('mongoose');\nvar Schema = mongoose.Schema;\nvar assetHelper = require('./asset-helper');\nvar _ = require('lodash');\n\nvar audioSchema = new mongoose.Schema(_.assign({}, assetHelper.schema));\n\nmodule.exports = mongoose.model('Audio', audioSchema);\n"
  },
  {
    "path": "models/editLog.js",
    "content": "var when = require('when')\nvar mongoose = require('mongoose')\nvar Schema = mongoose.Schema\nvar User = require('./user')\n\nvar alphanumeric = [\n\t/[a-zA-Z0-9\\-\\_]/,\n\t'Must be alphanumeric'\n];\n\nvar editLogSchema = new mongoose.Schema({\n\t_creator: { type: Schema.Types.ObjectId, ref: 'User' },\n\towner: { type: String, required: true, match: alphanumeric },\n\tname: { type: String, required: true, unique: true, match: alphanumeric },\n\treadableName: { type: String, required: true, match: alphanumeric },\n\tparticipants: [ { type: String, index: true } ],\n\tupdatedAt: { type: Date, default: Date.now },\n\tcreatedAt: { type: Date, default: Date.now }\n},\n{\n\ttoObject: { virtuals: true },\n\ttoJSON: { virtuals: true }\n})\n\n// compound index on owner + readableName\neditLogSchema.index({\n\towner: 1,\n\treadableName: 1,\n\tunique: true\n})\n\neditLogSchema.methods.addParticipant = function(userId) {\n\tvar dfd = when.defer()\n\n\tthis.participants.addToSet(userId)\n\tthis.save(function(err) {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\n\t\tdfd.resolve()\n\t})\n\n\treturn dfd.promise\n}\n\n// statics\n\neditLogSchema.statics.joinOrCreate = function(channelName, readableName, userId) {\n\tvar dfd = when.defer()\n\t\n\tthis.findOne({ name: channelName })\n\t.exec(function(err, exLog) {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\n\t\tif (exLog)\n\t\t\treturn dfd.resolve(exLog.addParticipant(userId))\n\n\t\tUser.findById(userId).exec(function(err, user) {\n\t\t\tif (err)\n\t\t\t\treturn dfd.reject(err)\n\n\t\t\tnew EditLog({\n\t\t\t\tname: channelName,\n\t\t\t\treadableName: readableName,\n\t\t\t\towner: userId,\n\t\t\t\tparticipants: [ userId ]\n\t\t\t}).save(function(err, editLog) {\n\t\t\t\tif (err) {\n\t\t\t\t\tif (err.code === 11000) {\n\t\t\t\t\t\t// duplicate, try to join again\n\t\t\t\t\t\treturn dfd.resolve(EditLog.joinOrCreate(channelName, readableName, userId))\n\t\t\t\t\t}\n\n\t\t\t\t\treturn dfd.reject(err)\n\t\t\t\t}\n\n\t\t\t\tdfd.resolve(editLog)\t\t\t\t\n\t\t\t})\n\t\t})\n\t})\n\n\treturn dfd.promise\n}\n\n\n/**\n * check whether Redis has any edits for this\n * @returns Promise<boolean>\n */\neditLogSchema.statics.hasEditsByName = function(redisClient, name) {\n\tvar dfd = when.defer()\n\n\tredisClient.zcard(name, function(err, cardinality) {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\n\t\tconsole.log('EditLog.hasEditsByName', name, cardinality)\n\t\tdfd.resolve(cardinality > 0)\n\t})\n\n\treturn dfd.promise\n}\n\nvar EditLog = mongoose.model('EditLog', editLogSchema)\nmodule.exports = EditLog\n"
  },
  {
    "path": "models/graph.js",
    "content": "var mongoose = require('mongoose')\nvar Schema = mongoose.Schema\nvar assetHelper = require('./asset-helper')\n\nvar fs = require('fs')\nvar packageJson = JSON.parse(fs.readFileSync(__dirname+'/../package.json'))\nvar currentPlayerVersion = packageJson.version.split('.').slice(0,2).join('.')\n\nvar when = require('when')\nvar isStringEmpty = require('../lib/stringUtil').isStringEmpty\n\nvar alphanumeric = [\n\t/[a-z0-9\\-\\_]/,\n\t'Must be alphanumeric'\n]\n\nvar statSpec = {\n\tsize: { type: Number, required: false, default: 0 }, \n\tnumAssets: { type: Number, required: false, default: 0 }\n}\n\nvar graphSchema = new mongoose.Schema({\n\t_creator: { type: Schema.Types.ObjectId, ref: 'User' },\n\towner: { type: String, required: true, match: alphanumeric },\n\tname: { type: String, required: true, match: alphanumeric },\n\turl: { type: String, required: true },\n\t\n\ttags: [{\n\t\ttype: String,\n\t\tmatch: alphanumeric,\n\t\tindex: true\n\t}],\n\n\tstaffpicks: [{\n\t\ttype: String,\n\t\tmatch: alphanumeric,\n\t\tindex: true\n\t}],\n\n\tpreviewUrlSmall: { type: String },\n\tpreviewUrlLarge: { type: String },\n\n\tdeleted: { type: Boolean, default: false },\n\teditable: { type: Boolean, default: true },\n\tprivate: { type: Boolean, default: false },\n\n\tviews: { type: Number, default: 0 },\n\trank: { type: Number, default: 0 },\n\n\thasAudio: { type: Boolean, default: false },\n\thasVideo: { type: Boolean, default: false },\n\n\tversion: { type: String, default: currentPlayerVersion },\n\n\tstat: { type: statSpec, required: false },\n\n\tupdatedAt: { type: Date, default: Date.now },\n\tcreatedAt: { type: Date, default: Date.now }\n}, {\n\ttoObject: { virtuals: true },\n\ttoJSON: { virtuals: true }\n})\n\n// index on staff picks (eg. frontpage)\ngraphSchema.index({ staffpicks: 1 })\n\n// unique index on owner+name\ngraphSchema.index({ owner: 1, name: 1, unique: true })\n\n// index on private + deleted\ngraphSchema.index({ private: 1, deleted: 1 })\n\n// index rank+private+deleted for discovery\ngraphSchema.index({ rank: 1, private: 1, deleted: 1 })\n\n// index owner+private+deleted for public userpage\ngraphSchema.index({ owner: 1, private: 1, deleted: 1 })\n\n// index owner+deleted for own userpage\ngraphSchema.index({ owner: 1, deleted: 1 })\n\n// used for sorting\ngraphSchema.virtual('updatedTS').get(function() {\n\treturn this.updatedAt ? this.updatedAt.getTime() : null\n})\n// added for consistency\ngraphSchema.virtual('createdTS').get(function() {\n\treturn this.createdAt ? this.createdAt.getTime() : null\n})\n\ngraphSchema.virtual('path').get(function() {\n\treturn '/'+this.owner+'/'+this.name\n})\n\ngraphSchema.virtual('path').set(function(path) {\n\tvar paths = path.split('/')\n\tthis.owner = paths[1]\n\tthis.name = assetHelper.slugify(paths[2])\n})\n\ngraphSchema.statics.slugify = assetHelper.slugify\n\ngraphSchema.methods.increaseViewCount = function() {\n\tvar dfd = when.defer()\n\n\tthis.update({ $inc: { views: 1 } }, { w: 1 }, function(err) {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\n\t\tdfd.resolve() \n\t})\n\t\n\treturn dfd.promise\n}\n\ngraphSchema.pre('save', function(next) {\n\tvar graph = this\n\tgraph.name = assetHelper.slugify(graph.name)\n\tnext()\n})\n\nfunction getPrettyName(cardName) {\n\tvar maxLen = 22\n\tvar nameParts = cardName.split(' ')\n\tvar name = nameParts.shift()\n\n\tfunction addNamePart() {\n\t\tvar nextPart = nameParts.shift()\n\t\tif (nextPart && name.length + nextPart.length < maxLen) {\n\t\t\tname += ' ' + nextPart\n\n\t\t\tif (nameParts.length)\n\t\t\t\taddNamePart()\n\t\t}\n\t}\n\n\taddNamePart()\n\n\tif (name.length > maxLen)\n\t\tname = name.substring(0, maxLen)\n\n\treturn name\n}\n\nfunction getPrettyInfo(ownerInfo) {\n\tvar graph = this.toJSON()\n\n\t// Get displayed values for graph and owner\n\t// 'this-is-a-graph' => 'This Is A Graph'\n\tvar graphName = graph.name\n\t\t.split('-')\n\t\t.map(s => s.charAt(0).toUpperCase() + s.slice(1))\n\t\t.join(' ')\n\n\t// Figure out if the graph owner has a fullname\n\t// Use that if does, else use the username for display\n\tvar graphOwner\n\tif (ownerInfo) {\n\t\tgraph.ownerInfo = ownerInfo\n\t\tgraph.username = ownerInfo.username\n\t\tgraph.avatar = ownerInfo.avatar\n\n\t\tgraphOwner = ownerInfo.username\n\t} else {\n\t\tif (graph.owner)\n\t\t\tgraphOwner = graph.owner\n\t\telse\n\t\t\tgraphOwner = 'anonymous'\n\t\tgraph.username = graphOwner\n\t}\n\tgraph.prettyOwner = graphOwner\n\tgraph.prettyName = getPrettyName(graphName)\n\n\tgraph.size = ''\n\n\tif (graph.stat && graph.stat.size) {\n\t\tvar sizeInKb = (graph.stat.size / 1048576).toFixed(2) // megabytes\n\t\tgraph.size = sizeInKb + ' MB'\n\t}\n\n\treturn graph\n}\n\ngraphSchema.methods.getPrettyInfo = getPrettyInfo\n\nmodule.exports = mongoose.model('Graph', graphSchema)\n"
  },
  {
    "path": "models/image.js",
    "content": "var mongoose = require('mongoose');\nvar Schema = mongoose.Schema;\nvar assetHelper = require('./asset-helper');\nvar _ = require('lodash');\n\nvar sizeSpec = \n{\n\turl: { type: String, required: true },\n\tpath: { type: String, required: true },\n\twidth: { type: Number, required: true },\n\theight: { type: Number, required: true },\n\tpitch: { type: Number, required: false },\n\theading: { type: Number, required: false },\n\troll: { type: Number, required: false },\n\tbytes: Number,\n\tmimetype: String\n};\n\nvar imageSchema = new mongoose.Schema(_.assign(\n{\n\toriginal: _.clone(sizeSpec),\n\tscaled: _.clone(sizeSpec),\n\tscaledThumbnail: _.clone(sizeSpec),\n}, assetHelper.schema));\n\nmodule.exports = mongoose.model('Image', imageSchema);\n"
  },
  {
    "path": "models/json.js",
    "content": "var mongoose = require('mongoose');\nvar Schema = mongoose.Schema;\nvar assetHelper = require('./asset-helper');\nvar _ = require('lodash');\n\nvar jsonSchema = new mongoose.Schema(_.assign({}, assetHelper.schema));\n\nmodule.exports = mongoose.model('JSON', jsonSchema);\n"
  },
  {
    "path": "models/patch.js",
    "content": "var mongoose = require('mongoose');\nvar Schema = mongoose.Schema;\nvar assetHelper = require('./asset-helper');\nvar _ = require('lodash');\n\nvar patchSchema = new mongoose.Schema(_.assign({\n\tcategory: { type: String },\n\tname: { type: String, required: true },\n\ttype: { type: String, required: true },\n\tstat: { type: Schema.Types.Mixed, required: true }\n}, assetHelper.schema), {});\n\nmodule.exports = mongoose.model('Patch', patchSchema);\n"
  },
  {
    "path": "models/scene.js",
    "content": "var fsPath = require('path')\nvar mongoose = require('mongoose');\nvar Schema = mongoose.Schema;\nvar assetHelper = require('./asset-helper');\nvar _ = require('lodash');\n\nvar sceneSchema = new mongoose.Schema(_.assign({\n\tfiles: [String],\n\ttype: String,\n\tmanifest: Schema.Types.Mixed\n}, assetHelper.schema), {\n\ttoObject: { virtuals: true },\n\ttoJSON: { virtuals: true }\n})\n\nsceneSchema.virtual('name').get(function() {\n\treturn fsPath.basename(this.path)\n})\n\nmodule.exports = mongoose.model('Scene', sceneSchema);\n"
  },
  {
    "path": "models/serial.js",
    "content": "var mongoose = require('mongoose')\nvar Schema = mongoose.Schema\nvar when = require('when')\n\nvar serialSchema = new mongoose.Schema({\n  _id: { type: String },\n  counter: { type: Number, default: Date.now() }\n})\n\nserialSchema.statics.next = function(name) {\n\tvar dfd = when.defer()\n\n\tthis.findOneAndUpdate(\n\t\t{ _id: name },\n\t\t{ $inc: { counter: 1 } },\n\t\t{ upsert: true, new: true },\n\t\tfunction(err, result) {\n\t\t\tif (err) {\n\t\t\t\treturn dfd.reject(err)\n\t\t\t}\n\n\t\t\treturn dfd.resolve(result.counter)\n\t\t})\n\n\treturn dfd.promise\n}\n\nvar Serial = mongoose.model('Serial', serialSchema)\n\nmodule.exports = Serial\n"
  },
  {
    "path": "models/user.js",
    "content": "var mongoose = require('mongoose')\nvar bcrypt = require('bcrypt-nodejs')\nvar crypto = require('crypto')\nvar when = require('when')\nvar _ = require('lodash')\nvar ObjectId = require('mongoose').Types.ObjectId\n\nvar userSchema = new mongoose.Schema({\n\tname: { type: String, required: false, unique: false },\n\tusername: { type: String, required: true, unique: true, lowercase: true },\n\temail: { type: String, required: true, unique: true, lowercase: true },\n\tpassword: String,\n\n\tcreatedAt: { type: Date, default: Date.now },\n\t\n\tisAdmin: { type: Boolean, default: false },\n\n\tprofile: {\n\t\twebsite: {type: String, default: ''},\t// minlength/maxlength in mongoose 4+\n\t\tbio: {type: String, default: ''},\n\t\tavatarOriginal: { type: String, default: '' },\n\t\tavatarScaled: { type: String, default: '' },\n\t\theaderOriginal: { type: String, default: '' },\n\t\theaderScaled: { type: String, default: '' }\n\t},\n\n\tpreferences : {\n\t\tpublishDefaultPublic : {type: Boolean, default: false}\n\t},\n\n\tstats: {\n\t\tviews: { type: Number, default: 0 },\n\t\tprojects: { type: Number, default: 0 },\n\t},\n\n\tresetPasswordToken: String,\n\tresetPasswordExpires: Date\n}, {\n\ttoObject: { virtuals: true },\n\ttoJSON: { virtuals: true }\n})\n\nuserSchema.pre('save', function(next) {\n\tvar user = this\n\n\tif(!user.isModified('password'))\n\t\treturn next()\n\n\tbcrypt.genSalt(5, function(err, salt) {\n\t\tif (err)\n\t\t\treturn next(err)\n\n \t\tbcrypt.hash(user.password, salt, null, function(err, hash) {\n\t\t\tif (err)\n\t\t\t\treturn next(err)\n\n \t\t\tuser.password = hash\n\t\t\tnext()\n\t\t})\n\t})\n})\n\nuserSchema.methods.toJSON = function() {\n\treturn {\n\t\tid : this._id,\n\t\tusername: this.username,\n\t\tname: this.name,\n\t\temail: this.email,\n\t\tcreatedAt: this.createdAt,\n\t\tgravatar: this.gravatar,\n\t\tprofile: {\n\t\t\twebsite: this.profile.website,\n\t\t\tbio: this.profile.bio,\n\t\t\tavatar: this.profile.avatarScaled,\n\t\t\theader: this.profile.headerScaled\n\t\t},\n\t\tpreferences: {\n\t\t\tpublishDefaultPublic: this.preferences.publishDefaultPublic\n\t\t},\n\t\tstats: {\n\t\t\tviews: this.stats.views || 0,\n\t\t\tprojects: this.stats.projects || 0\n\t\t}\n\t}\n}\n\nuserSchema.methods.toPublicJSON = function() {\n\tvar avatar = this.profile.avatarScaled\n\n\treturn {\n\t\tid : this._id,\n\t\tusername: this.username,\n\t\tname: this.name,\n\t\tcreatedAt: this.createdAt,\n\t\tprofile: {\n\t\t\tavatar: avatar,\n\t\t\theader: this.profile.headerScaled,\n\t\t\twebsite: this.profile.website,\n\t\t\tbio: this.profile.bio\n\t\t},\n\t\tstats: {\n\t\t\tviews: this.stats.views || 0,\n\t\t\tprojects: this.stats.projects || 0\n\t\t}\n\t}\n}\n\nuserSchema.methods.comparePassword = function(candidatePassword, cb) {\n\tbcrypt.compare(candidatePassword, this.password, function(err, isMatch) {\n\t\tif (err)\n\t\t\treturn cb(err)\n\n \t\tcb(null, isMatch)\n\t})\n}\n\nuserSchema.methods.setStats = function(stats) {\n\tvar dfd = when.defer()\n\n\t// update graph views\n\tthis.update({ $set: { stats: stats } }, { w: 1 }, function(err) {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\n\t\tdfd.resolve() \n\t})\n\t\n\treturn dfd.promise\n}\n\nuserSchema.methods.increaseViewCount = function() {\n\tvar dfd = when.defer()\n\n\t// update view count\n\tthis.update({ $inc: { 'stats.views': 1 } }, { w: 1 }, function(err) {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\n\t\tdfd.resolve() \n\t})\n\t\n\treturn dfd.promise\n}\n\nuserSchema.methods.increaseProjectsCount = function() {\n\tvar dfd = when.defer()\n\n\t// update projects count\n\tthis.update({ $inc: { 'stats.projects': 1 } }, { w: 1 }, function(err) {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\n\t\tdfd.resolve() \n\t})\n\t\n\treturn dfd.promise\n}\n\nuserSchema.methods.decreaseProjectsCount = function() {\n\tvar dfd = when.defer()\n\n\t// update projects count\n\tthis.update({ $inc: { 'stats.projects': -1 } }, { w: 1 }, function(err) {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\n\t\tdfd.resolve() \n\t})\n\t\n\treturn dfd.promise\n}\n\n/*\n * static methods\n */\n\nuserSchema.statics.findUsersMappedByIds = function(ids) {\n\treturn this\n\t\t.find({ _id: { $in: ids } })\n\t\t.exec()\n\t\t.then(function(users) {\n\t\t\tvar map = {}\n\t\t\tusers.map(function(user) {\n\t\t\t\tmap[user.id] = user.toPublicJSON()\n\t\t\t})\n\t\t\treturn map\n\t\t})\n}\n\n/*\n * virtuals\n */\n\nuserSchema.virtual('gravatar').get(function(size) {\n\tif (!size)\n\t\tsize = 200\n\n \tif (!this.email) {\n\t\treturn 'https://gravatar.com/avatar/?s=' + size + '&d=retro'\n\t}\n\n \tvar md5 = crypto.createHash('md5').update(this.email).digest('hex')\n\n\treturn 'https://gravatar.com/avatar/' + md5 + '?s=' + size + '&d=retro'\n})\n\nmodule.exports = mongoose.model('User', userSchema)\n\n"
  },
  {
    "path": "models/video.js",
    "content": "var mongoose = require('mongoose');\nvar Schema = mongoose.Schema;\nvar assetHelper = require('./asset-helper');\nvar _ = require('lodash');\n\nvar videoSchema = new mongoose.Schema(_.assign({}, assetHelper.schema));\n\nmodule.exports = mongoose.model('Video', videoSchema);\n"
  },
  {
    "path": "newrelic.js",
    "content": "/**\n * New Relic agent configuration.\n *\n * See lib/config.defaults.js in the agent distribution for a more complete\n * description of configuration variables and their potential values.\n */\nexports.config = {\n\tapp_name: ['vizor.io'],\n\tlicense_key: process.env.NEWRELIC,\n\tlogging: {\n\t\tlevel: 'info'\n\t}\n};\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"Vizor\",\n  \"version\": \"0.18.3\",\n  \"description\": \"\",\n  \"main\": \"server.js\",\n  \"dependencies\": {\n    \"@google-cloud/storage\": \"^0.8.0\",\n    \"async\": \"^0.9.0\",\n    \"backbone\": \"^1.1.2\",\n    \"bcrypt-nodejs\": \"^0.0.3\",\n    \"body-parser\": \"^1.6.4\",\n    \"checksum\": \"^0.1.1\",\n    \"client-sessions\": \"^0.7.0\",\n    \"compression\": \"^1.0.11\",\n    \"connect-assets\": \"^4.3.0\",\n    \"connect-mongo\": \"^0.4.1\",\n    \"cookie-parser\": \"^1.3.2\",\n    \"crypto-balance\": \"^0.0.4\",\n    \"csso\": \"^1.3.11\",\n    \"decompress-zip\": \"0.0.8\",\n    \"deepmerge\": \"~0.2.7\",\n    \"del\": \"^0.1.3\",\n    \"diy-handlebars-helpers\": \"^1.0.10\",\n    \"errorhandler\": \"^1.1.1\",\n    \"exiftool\": \"0.0.3\",\n    \"express\": \"^4.8.4\",\n    \"express-flash\": \"^0.0.2\",\n    \"express-handlebars\": \"~3.0.0\",\n    \"express-validator\": \"^2.3.0\",\n    \"fast-crc32c\": \"^1.0.4\",\n    \"formidable\": \"^1.0.15\",\n    \"fs-extra\": \"~0.12.0\",\n    \"gm\": \"1.23.0\",\n    \"gridfs-stream\": \"1.1.1\",\n    \"gulp\": \"3.9.0\",\n    \"gulp-concat\": \"~2.4.1\",\n    \"gulp-concat-util\": \"^0.5.2\",\n    \"gulp-declare\": \"~0.3.0\",\n    \"gulp-handlebars\": \"~3.0.0\",\n    \"gulp-less\": \"2.0.1\",\n    \"gulp-preprocess\": \"^1.2.0\",\n    \"gulp-slash\": \"~1.1.3\",\n    \"gulp-uglify\": \"~1.5.3\",\n    \"gulp-wrap\": \"~0.5.0\",\n    \"handlebars\": \"~4.0.0\",\n    \"hashids\": \"^1.0.2\",\n    \"helmet\": \"^0.4.2\",\n    \"jquery\": \"2.1.0\",\n    \"less\": \"^1.7.4\",\n    \"lodash\": \"^2.4.1\",\n    \"lusca\": \"^1.0.1\",\n    \"marked\": \"0.3.5\",\n    \"method-override\": \"^2.1.3\",\n    \"mime\": \"~1.2.11\",\n    \"minimist\": \"0.0.8\",\n    \"moment\": \"^2.9.0\",\n    \"mongodb\": \"2.2.35\",\n    \"mongoose\": \"4.11.5\",\n    \"morgan\": \"^1.2.2\",\n    \"multer\": \"^0.1.6\",\n    \"newrelic\": \"^1.13.4\",\n    \"osc-min\": \"^0.1.0\",\n    \"passport\": \"^0.2.0\",\n    \"passport-local\": \"^1.0.0\",\n    \"random-js\": \"1.0.4\",\n    \"readable-stream\": \"^2.0.6\",\n    \"redis\": \"^2.4.2\",\n    \"replacestream\": \"^4.0.0\",\n    \"request\": \"^2.40.0\",\n    \"retry\": \"^0.10.1\",\n    \"sparkpost\": \"^1.3.3\",\n    \"stream-browserify\": \"^2.0.1\",\n    \"temp\": \"~0.8.1\",\n    \"to-markdown\": \"^3.0.0\",\n    \"uglify-js\": \"^2.4.15\",\n    \"validator\": \"^3.17.0\",\n    \"when\": \"^3.5.1\",\n    \"ws\": \"^0.4.31\",\n    \"yauzl\": \"^2.3.1\"\n  },\n  \"devDependencies\": {\n    \"chai\": \"^1.10.0\",\n    \"cheerio\": \"^0.19.0\",\n    \"glob\": \"^7.0.0\",\n    \"mocha\": \"2.3.3\",\n    \"multiline\": \"^0.3.4\",\n    \"q\": \"https://registry.npmjs.org/q/-/q-1.0.1.tgz\",\n    \"selenium-standalone\": \"^6.6.0\",\n    \"sinon\": \"^1.15.4\",\n    \"supertest\": \"^0.13.0\",\n    \"uglify-js2\": \"^2.1.11\",\n    \"webdriverio\": \"4.7.0\",\n    \"yadda\": \"0.16.0\"\n  },\n  \"scripts\": {\n    \"start\": \"node app.js\",\n    \"gulp\": \"node ./node_modules/gulp/bin/gulp\",\n    \"gulp-engine\": \"node ./node_modules/gulp/bin/gulp js:engine\",\n    \"selenium-server\": \"selenium-standalone install && selenium-standalone start\",\n    \"tester\": \"node tools/test-runner\",\n    \"test:browser:integration\": \"npm run tester browser/test/integration\",\n    \"test:browser:unit\": \"npm run tester browser/test/unit\",\n    \"test:browser:plugins\": \"npm run tester browser/test/unit/plugins\",\n    \"test:browser\": \"npm run test:browser:unit && npm run test:browser:plugins && npm run test:browser:integration\",\n    \"test:server:unit\": \"npm run tester test/unit\",\n    \"test:server:controllers\": \"npm run tester test/controllers\",\n    \"test:server:integration\": \"npm run tester test/integration && npm run tester test/integration/models\",\n    \"test:server:services\": \"npm run tester test/services\",\n    \"test:server\": \"npm run test:server:unit && npm run test:server:controllers && npm run test:server:integration && npm run test:server:services\",\n    \"test:functional\": \"sh bin/test-functional.sh\",\n    \"test\": \"npm run gulp-engine && npm run test:browser && npm run test:server\"\n  },\n  \"author\": \"Pixelface, Ltd <info@vizor.io>\",\n  \"license\": \"MIT\",\n  \"repository\": \"vizorvr/vizor\"\n}\n"
  },
  {
    "path": "patches-exporter/export.handlebars",
    "content": "<!DOCTYPE html>\n<html lang=\"en\" class=\"hVizor\">\n\t<head id=\"head\">\n\t\t<meta charset='utf-8' />\n        <title>{{graphName}} by {{graphOwner}}</title>\n\t\t<meta id=\"viewportmeta\" name=\"viewport\" content=\"initial-scale=1, maximum-scale=1, shrink-to-fit=no\" />\n        <meta name=\"keywords\" content=\"vizor, vr, webvr, virtual reality, webgl, visual programming, animation\" />\n        <meta name=\"description\" content=\"Vizor is a platform for creating and sharing VR experiences\" />\n        <meta name=\"og:description\" content=\"Vizor is a platform for creating and sharing VR experiences\" />\n        <meta name=\"og:title\" content=\"{{graphName}} by {{graphOwner}}\" />\n        <meta name=\"og:image\" content=\"{{previewImage}}\" />\n        <meta name=\"og:image:width\" content=\"{{previewImageWidth}}\" />\n        <meta name=\"og:image:height\" content=\"{{previewImageHeight}}\" />\n        <meta name=\"og:restrictions:age\" content=\"13+\" />\n        <meta name=\"twitter:card\" content=\"summary_large_image\" />\n        <meta name=\"twitter:site\" content=\"@Vizor_VR\" />\n        <meta name=\"twitter:title\" content=\"{{graphName}} by {{graphOwner}}\" />\n        <meta name=\"twitter:description\" content=\"Vizor is a platform for creating and sharing VR experiences\" />\n        <meta name=\"twitter:image\" content=\"{{previewImage}}\" />\n\n        {{#each styles}}\n            <link rel=\"stylesheet\" href=\"{{this}}\" name=\"css\" />\n        {{/each}}\n\n        {{#each scripts}}\n            <script type=\"text/javascript\" src=\"{{this}}\"></script>\n        {{/each}}\n\t</head>\n\n\t<body class=\"bPlayer noselect_all dark\">\n        <div class=\"wrap clearfix\" id=\"playerpage\">\n\n            <div id=\"playerWrap\" style=\"background: #000 url('{{previewImage}}') center center no-repeat; background-size: cover;\">\n                <div id=\"beforeLoadingStage\" class=\"stage\"></div>\n                <div id=\"loadingStage\" class=\"stage\"></div>\n                <div id=\"readyStage\" class=\"stage\"></div>\n                <div id=\"errorStage\" class=\"stage\"></div>\n                <div id=\"playingStage\" class=\"stage front\">\n                    <canvas\n                        id=\"webgl-canvas\"\n                        class=\"webgl-canvas-normal\"\n                        style=\"background:transparent;width:100%;height:100%;\"\n                        oncontextmenu=\"return false;\"\n                        data-autoplay=\"true\"\n                        data-graph-url=\"{{graphUrl}}\">\n                    </canvas>\n                </div>\n            </div>\n\n            <script>\n                (function() {\n                    E2.track = function() {}\n\n                    if (!window.Vizor)\n                        window.Vizor = {}\n\n                    Vizor.origin = window.location.origin\n                    Vizor.isEditor = false\n                    Vizor.autoplay = true\n                    Vizor.noHeader = true\n                    Vizor.hasAudio = true\n\t\t\t\t\t\t\t\t\t\tVizor.cdnRoot = '/data'\n                    Vizor.graphName = '{{graphName}}'\n                    Vizor.hideWebVRButton = true\n                    Vizor.isEmbedded = false\n                    Vizor.startMode = 1\n\n\t\t\t\t\t\t\t\t\t\t$(window).on('vizorLoaded', function() {\n\t\t\t\t\t\t\t\t\t\t\tconsole.error('Vizor loaded')\n\t\t\t\t\t\t\t\t\t\t\tE2.core.on('assetsLoaded', function() {\n\t\t\t\t\t\t\t\t\t\t\t\tconsole.log('assets loaded, playing')\n\t\t\t\t\t\t\t\t\t\t\t\t// E2.app.player.play()\n\t\t\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t\t})\n                })()\n            </script>\n\n            <noscript>\n                <div class=\"nojs clearfix\">\n                    <div style=\"float: left; margin: 5px 8px 0 0;\"><img src=\"/images/warning.png\" width=\"64px\" height=\"64px\" /></div>\n                    <p>This page requires javascript in order to display properly.</p>\n                    <p>\n                        If you're running a script blocker - such as NoScript - please whitelist this page.<br />\n                        If you have disabled javascript in your browser, please enable it and reload.\n                    </p>\n                </div>\n            </noscript>\n        </div>\n\t</body>\n</html>\n"
  },
  {
    "path": "patches-exporter/index.js",
    "content": "const request = require('supertest')\nconst when = require('when')\nconst fs = require('fs-extra')\nconst fsPath = require('path')\nconst urlParse = require('url').parse\nconst _ = require('lodash')\nconst Handlebars = require('handlebars')\nconst cheerio = require('cheerio')\nconst guard = require('when/guard')\n\nvar argv = require('minimist')(process.argv.slice(2))\n\nif (argv._.length < 1) {\n\tconsole.log(`\n\tusage:\n\n\t\t$ export graphUrl [folder] [root]\n\n\t\t\texports the graph from the remote url to local folder\n\t\t\t- retrieves assets and remaps the paths to work locally under 'root'\n\t\t\t- use the root option to put assets in a specific folder\n\t\t\t- folder name defaults to basename of graph\n\t\t\t- root defaults to /\n\n\t\t\t$ export fthr/tunnel ./tunnel assets\n\n\t\t\tpulls fthr/tunnel from patches.vizor.io to local folder tunnel,\n\t\t\tand remaps the asset paths to be under 'assets'\n\t`)\n\n\tprocess.exit(1)\n}\n\nvar graphUrl = argv._[0]\nvar chroot = argv._[2] || ''\nvar parsed = urlParse(graphUrl)\nvar hn = (parsed.hostname || 'patches.vizor.io') + ':' + (parsed.port || 443)\n\nif (chroot !== '' && chroot[0] !== '/')\n\tchroot = '/' + chroot\n\nvar userAndGraph = parsed.path\n\t.split('.')[0] // remove extensions\n\t.split('/')\n\nif (userAndGraph[userAndGraph.length-1] === 'edit')\n\tuserAndGraph.pop()\n\nuserAndGraph = userAndGraph.slice(-2) // last two parts\n\nvar folder = argv._[1] || fsPath.basename(graphUrl)\nfolder = folder + chroot\n\nconsole.log('things', userAndGraph, folder)\n\nuserAndGraph = userAndGraph.join('/')\n\nvar graphModelUrl = '/' + userAndGraph +'.json'\nvar htmlUrl = '/' + userAndGraph\n\nvar remoteHttp = 'https://'+hn\nvar cdnHttp = 'https://cdn.vizor.io:443'\nvar remote = request.agent(remoteHttp)\nvar cdn = request.agent(cdnHttp)\n\nconsole.log('Consuming', remoteHttp, cdnHttp)\n\nvar loadingPlugins = [\n\t'three_loader_model',\n\t'three_loader_scene',\n\t'url_texture_generator',\n\t'url_cubemap_generator',\n\t'url_stereo_cubemap_generator',\n\t'url_stereo_latlongmap_generator',\n\t'url_audio_buffer_generator',\n\t'url_audio_generator',\n\t'url_json_generator',\n\t'url_video_generator',\n]\n\nfunction error(err) {\n\tconsole.error(err.stack)\n\tprocess.exit(1)\n}\n\nfunction saveGraph(graphData) {\n\tvar dfd = when.defer()\n\n\tvar path = fsPath.join(folder, 'graph.json')\n\n\tfs.writeFile(path, JSON.stringify(graphData, null, 2), (err) => {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\n\t\tdfd.resolve()\n\t})\n\n\treturn dfd.promise\n}\n\nfunction mirror(remoteUrl, i, realName) {\n\tvar dfd = when.defer()\n\tlet agent = remoteUrl.indexOf('/data') === 0 ? cdn : remote\n\tlet getUrl = remoteUrl.replace(/^\\/data/, '')\n\tlet dest = folder+remoteUrl\n\tif (realName)\n\t\tdest = folder + realName\n\tvar dirname = fsPath.dirname(dest)\n\n\tif (!getUrl) {\n\t\treturn dfd.resolve()\n\t}\n\n\tagent.head(getUrl)\n\t.end((err, head) => {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\n\t\tif (head.statusCode !== 200)\n\t\t\tconsole.log('  HEAD', getUrl, head.statusCode)\n\n\t\tif (head.statusCode === 301) {\n\t\t\tlet redUrl = head.headers.location.replace('https://cdn.vizor.io', '/data')\n\t\t\tconsole.log('  REDIRECT', redUrl)\n\t\t\treturn mirror(redUrl, 0, getUrl).then(() => { return dfd.resolve(getUrl) })\n\t\t}\n\n\t\tif (head.statusCode === 404)\n\t\t\treturn dfd.resolve()\n\n\t\tfs.mkdirs(dirname, (err) => {\n\t\t\tif (err)\n\t\t\t\treturn dfd.reject(err)\n\n\t\t\tconsole.log('GET', getUrl, 'from', agent === cdn ? 'cdn' : 'site', dest)\n\n\t\t\tif (getUrl.indexOf('.obj') !== -1) {\n\t\t\t\tvar mtlUrl = getUrl.replace('.obj', '.mtl')\n\t\t\t\tdfd.promise.then(() => { return mirror(mtlUrl) })\n\t\t\t}\n\n\t\t\tif (getUrl.indexOf('.ogg') !== -1) {\n\t\t\t\tvar m4aUrl = getUrl.replace('.ogg', '.m4a')\n\t\t\t\tdfd.promise.then(() => { return mirror(m4aUrl) })\n\t\t\t}\n\n\t\t\tif (remoteUrl.indexOf('/data') === 0) {\n\t\t\t\tvar metaUrl = '/meta' + getUrl\n\t\t\t\tdfd.promise.then(() => { return mirror(metaUrl) })\n\t\t\t}\n\n\t\t\tvar writeStream = fs.createWriteStream(dest)\n\n\t\t\tagent.get(getUrl)\n\t\t\t.pipe(writeStream)\n\t\t\t.on('close', () => {\n\t\t\t\tconsole.log('  OK', remoteUrl)\n\t\t\t\tdfd.resolve(getUrl)\n\t\t\t})\n\t\t})\n\n\t})\n\n\treturn dfd.promise\n}\n\nvar nestedPatches = ['graph', 'entity']\n\nfunction relocateAsset(url) {\n\treturn chroot + url\n}\n\nfunction readAssets(subgraph, assets) {\n\tassets = assets || [\n\t\t'/data/textures/loadingtex.png',\n\t\t'/data/textures/defaulttex.png'\n\t]\n\n\tif (!subgraph.nodes)\n\t\treturn\n\n\tsubgraph.nodes.map((node) => {\n\t\tif (nestedPatches.indexOf(node.plugin) !== -1)\n\t\t\treturn readAssets(node.graph, assets)\n\n\t\tif (loadingPlugins.indexOf(node.plugin) === -1)\n\t\t\treturn;\n\n\t\tassets.push(node.state.url)\n\n\t\tnode.state.url = relocateAsset(node.state.url)\n\t})\n\n\treturn _.uniq(assets)\n}\n\n// --------\nfunction readPlayerHtml(htmlUrl) {\n\tvar dfd = when.defer()\n\n\tconsole.log('Retrieving html:', htmlUrl)\n\n\tremote.get(htmlUrl)\n\t.expect(200)\n\t.end((err, res) => {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\n\t\tdfd.resolve(res.text)\n\t})\n\n\treturn dfd.promise\n}\n\nfunction retrieveGraphAndAssets() {\n\treturn readJson(graphModelUrl)\n\t.then(([meta, graph]) => {\n\t\tvar assets = readAssets(graph.root)\n\n\t\treturn when.map(assets, mirror)\n\t\t.then(() => {\n\t\t\treturn saveGraph(graph)\n\t\t})\n\t\t.then(() => {\n\t\t\treturn meta\n\t\t})\n\t})\n}\n\nfunction readJson(url) {\n\tvar dfd = when.defer()\n\n\tremote.get(url)\n\t.expect(200)\n\t.end((err, res) => {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\n\t\tlet model = res.body\n\t\tlet graphUrl = model.url.replace(/^\\/data/, '')\n\n\t\tconsole.log('Retrieving Graph', graphUrl)\n\n\t\tcdn.get(graphUrl)\n\t\t.end((err, res) => {\n\t\t\tif (err)\n\t\t\t\treturn dfd.reject(err)\n\n\t\t\tdfd.resolve([model, res.body])\n\t\t})\n\t})\n\n\treturn dfd.promise\n}\n\nreadPlayerHtml(htmlUrl)\n.then((html) => {\n\tvar $ = cheerio.load(html)\n\n\t// grab styles and scripts to retrieve\n\tvar styles = []\n\t$('link').each((i, link) => {\n\t\tstyles.push(link.attribs.href)\n\t})\n\n\tvar scripts = []\n\t$('script').each((i, script) => {\n\t\tif (!script.attribs.src)\n\t\t\treturn\n\n\t\tscripts.push(script.attribs.src)\n\t})\n\n\treturn when.map(styles.concat(scripts), mirror)\n\t.then(retrieveGraphAndAssets)\n\t.then(meta => {\n\t\tmeta.scripts = scripts\n\t\tmeta.styles = styles\n\t\treturn meta\n\t})\n})\n.then(templateData => {\n\tconsole.log('templatedata', templateData)\n\ttemplateData.graphUrl = 'graph.json'\n\n\tconsole.log('Rendering', templateData)\n\tvar templateSource = fs.readFileSync('./export.handlebars').toString()\n\tvar template = Handlebars.compile(templateSource)\n\tvar html = template(templateData)\n\tfs.writeFileSync(folder+'/'+'index.html', html)\n})\n.catch(error)\n"
  },
  {
    "path": "services/assetService.js",
    "content": "var User = require('../models/user')\nvar when = require('when')\nvar _ = require('lodash')\n\nfunction AssetService(assetModel) {\n\tthis._model = assetModel\n}\n\nAssetService.prototype.list = function() {\n\treturn this.find()\n}\n\nAssetService.prototype.count = function(filter) {\n\tvar dfd = when.defer()\n\n\tthis._model.count(filter, function(err, count) {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\n\t\tdfd.resolve(count)\n\t})\n\n\treturn dfd.promise\n}\n\nAssetService.prototype.countAndFind = function(filter, sort, select, paging) {\n\tvar that = this\n\tpaging = paging || {limit: 0, offset: 0}\n\tvar limit = paging.limit || 0\n\tvar offset = paging.offset || 0\n\tvar totalCount\n\n\treturn this.count(filter)\n\t\t.then(function(count) {\n\t\t\ttotalCount = count\n\n\t\t\treturn that._model.find(filter)\n\t\t\t\t.sort(sort)\n\t\t\t\t.skip(offset)\n\t\t\t\t.limit(limit)\n\t\t\t\t.select(select)\n\t\t})\n\t\t.then(function(list) {\n\t\t\treturn {\n\t\t\t\tmeta: _.extend(paging, {\n\t\t\t\t\ttotalCount: totalCount,\n\t\t\t\t\tlistCount: list.length,\n\t\t\t\t\tlimit: limit,\n\t\t\t\t\toffset: offset,\n\t\t\t\t\tdisplayStart: 1 + offset,\n\t\t\t\t\tdisplayEnd: offset + list.length\n\t\t\t\t}),\n\t\t\t\tlist: list\n\t\t\t}\n\t\t})\n}\n\nAssetService.prototype.buildQuery = function(find, options) {\n\tvar query = this._model.find(find)\n\n\tif (options && options.limit)\n\t\tquery = query.limit(options.limit)\n\n\tif (options && options.offset)\n\t\tquery = query.skip(options.offset)\n\n\treturn query\n}\n\nAssetService.prototype.find = function(q, paging) {\n\tvar dfd = when.defer()\n\n\tpaging = paging || { offset: 0, limit: 0 }\n\n\tthis._model.find(q)\n\t\t.sort('-updatedAt')\n\t\t.skip(paging.offset || 0)\n\t\t.limit(paging.limit || 0)\n\t\t.exec((err, list) => {\n\t\t\tif (err)\n\t\t\t\treturn dfd.reject(err)\n\t\t\n\t\t\tdfd.resolve(list)\n\t\t})\n\n\treturn dfd.promise\n}\n\nAssetService.prototype.findByCreatorName = function(username) {\n\tvar that = this\n\tvar dfd = when.defer()\n\n\tUser.findOne({ username: username })\n\t.exec(function(err, user) {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\n\t\tif (!user)\n\t\t\treturn dfd.resolve([])\n\n\t\tdfd.resolve(that.find({ '_creator': user._id }))\n\t})\n\n\treturn dfd.promise\n}\n\nAssetService.prototype.findByCreatorId = function(userId) {\n\treturn this.find({\n\t\t'_creator': userId\n\t})\n}\n\nAssetService.prototype.canWrite = function(user, path) {\n\treturn this.findByPath(path)\n\t.then(function(asset) {\n\t\tif (!asset)\n\t\t\treturn true\n\n\t\tvar creator = asset._creator\n\n\t\tif (creator._id)\n\t\t\tcreator = creator._id\n\n\t\treturn !asset ||\n\t\t\tcreator.toString() === user.id.toString()\n\t})\n}\n\nAssetService.prototype.canWriteAnonymous = function(path) {\n\treturn this.findByPath(path)\n\t.then(function(asset) {\n\t\t// Asset is null, doesn't exist, we can write\n\t\tif (!asset) {\n\t\t\treturn true\n\t\t}\n\n\t\t// Asset already found, can't overwrite\n\t\treturn false\n\t})\n}\n\nAssetService.prototype.findOne = function(q) {\n\tvar dfd = when.defer()\n\tthis._model\n\t\t.findOne(q)\n\t\t.populate('_creator', 'username profile')\n\t\t.exec(function(err, item)\n\t{\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\t\t\n\t\tdfd.resolve(item)\n\t})\n\n\treturn dfd.promise\n}\n\nAssetService.prototype.findByTagAndUserId = function(tag, userId) {\n\treturn this.find({\n\t\ttags: tag.replace(/[^a-zA-Z0-9]/g, ''),\n\t\t_creator: userId\n\t})\n}\n\nAssetService.prototype.findByPath = function(path) {\n\treturn this.findOne({path: path})\n}\n\nAssetService.prototype.save = function(data, user) {\n\tvar that = this\n\n\treturn this.findByPath(data.path)\n\t.then(function(asset) {\n\t\tif (!asset) {\n\t\t\tasset = new that._model(data)\n\t\t\tasset._creator = user.id\n\t\t}\n\n\t\t// update model with everything from data\n\t\t_.assign(asset, data)\n\n\t\tasset.updatedAt = Date.now()\n\n\t\tvar dfd = when.defer()\n\n\t\tasset.save(function(err) {\n\t\t\tif (err) {\n\t\t\t\tconsole.error(err)\n\t\t\t\treturn dfd.reject(err)\n\t\t\t}\n\n\t\t\tdfd.resolve(asset)\n\t\t})\n\n\t\treturn dfd.promise\n\t})\n}\n\nmodule.exports = AssetService\n\n"
  },
  {
    "path": "services/graphService.js",
    "content": "var when = require('when')\nvar util = require('util')\nvar _ = require('lodash')\n\nvar AssetService = require('./assetService')\nvar GraphOptimizer = require('../lib/graphOptimizer')\n\nvar User = require('../models/user')\n\nvar fs = require('fs')\nvar packageJson = JSON.parse(fs.readFileSync(__dirname+'/../package.json'))\nvar currentPlayerVersion = packageJson.version.split('.').slice(0,2).join('.')\n\nfunction GraphService(assetModel, gfs) {\n\tAssetService.call(this)\n\tthis._model = assetModel\n\tthis._fs = gfs\n}\n\nutil.inherits(GraphService, AssetService)\n\nGraphService.prototype.publicList = function() {\n\treturn this.find({ private: false }, {offset: 0, limit: 1})\n}\n\nGraphService.prototype.findByPath = function(path) {\n\tvar parts = path.split('/')\n\treturn this.findOne({\n\t\towner: parts[1],\n\t\tname: parts[2]\n\t})\n}\n\n/**\n * @param paging\n * @return {list, meta, owners}\n * @private\n */\nGraphService.prototype._listWithOwners = function(filter, sort, select, paging) {\n\tvar that = this\n\tvar listData = {}\n\n\treturn this.countAndFind(filter, sort, select, paging)\n\t\t.then((data) => {\n\t\t\tlistData = data\n\t\t\tvar creatorIds = []\n\t\t\tfor (var graph of data.list) {\n\t\t\t\tif (graph._creator)\n\t\t\t\t\tcreatorIds.push(graph._creator)\n\t\t\t}\n\n\t\t\treturn User.findUsersMappedByIds(_.uniq(creatorIds))\n\t\t})\n\t\t.then((owners) => {\n\t\t\tlistData.owners = owners\n\t\t\treturn Promise.resolve(listData)\n\t\t})\n}\n\n\n//  /admin/list\nGraphService.prototype.listWithPreviews = function(paging) {\n\tvar filter = {deleted: false}\n\tvar select = '_creator owner name previewUrlSmall previewUrlLarge updatedAt stat views'\n\tvar sort = '-updatedAt'\n\treturn this._listWithOwners(filter, sort, select, paging)\n}\n\nGraphService.prototype.publicRankedList = function(paging) {\n\tvar filter = { private: false, deleted: false }\n\tvar sort = {'rank': -1, 'updatedAt': -1}\n\tvar select = '_creator private owner name previewUrlSmall updatedAt stat rank views'\n\treturn this._listWithOwners(filter, sort, select, paging)\n}\n\n/**\n * get user graphs for username. defaults to filter for non-deleted graphs only.\n * @param username string\n * @param paging object {offset: int, limit: int}\n * @param filter object mongo filter (as in .find({...}))\n * @returns {Promise}\n * @private\n */\nGraphService.prototype._userGraphs = function(username, filter, paging) {\n\tfilter = _.extend({deleted:false}, filter)\n\tfilter.owner = username\n\tvar sort = '-updatedAt'\n\tvar fields = '_creator private owner name previewUrlSmall previewUrlLarge updatedAt stat views'\n\treturn this.countAndFind(filter, sort, fields, paging)\n}\n\nGraphService.prototype.userGraphs = function(username, offset, limit) {\n\treturn this._userGraphs(username, null, {offset:offset, limit:limit})\n}\n\n// allows to filter by private graph. defaults to public graphs\nGraphService.prototype.userGraphsWithPrivacy = function(username, offset, limit, isPrivate) {\n\tvar filter = {\n\t\t'private': !!isPrivate\n\t}\n\treturn this._userGraphs(username, filter, {offset:offset, limit:limit})\n}\n\n\n// e.g. when toggling public/private or renaming, but not touching anything else\n// opts {updatedAt, version}\nGraphService.prototype._save = function(data, user, opts) {\n\tvar that = this\n\tvar wasNew = false\n\n\topts = _.extend({\n\t\tversion : currentPlayerVersion,\n\t\tupdatedAt: Date.now()\n\t}, opts)\n\n\treturn this.findByPath(data.path)\n\t.then(function(asset) {\n\t\tif (!asset) {\n\t\t\twasNew = true\n\t\t\tasset = new that._model(data)\n\t\t}\n\n\t\tasset._creator = user.id\n\t\tasset.updatedAt = opts.updatedAt\n\n\t\tif (data.tags)\n\t\t\tasset.tags = data.tags\n\n\t\tif (data.url)\n\t\t\tasset.url = data.url\n\n\t\tif (data.previewUrlSmall)\n\t\t\tasset.previewUrlSmall = data.previewUrlSmall\n\n\t\tif (data.previewUrlLarge)\n\t\t\tasset.previewUrlLarge = data.previewUrlLarge\n\n\t\tif (data.stat)\n\t\t\tasset.stat = data.stat\n\n\t\tif (data.hasAudio !== undefined)\n\t\t\tasset.hasAudio = data.hasAudio\n\n\t\tif (data.hasVideo !== undefined)\n\t\t\tasset.hasVideo = data.hasVideo\n\n\t\t// by default bumps to latest player version\n\t\tasset.version = opts.version\n\n\t\tasset.deleted = data.deleted || false\n\t\tasset.private = data.private || false\n\t\tasset.editable = data.editable === false ? false : true\n\n\t\tvar dfd = when.defer()\n\n\t\tasset.save(function(err) {\n\t\t\tif (err)\n\t\t\t\treturn dfd.reject(err)\n\n\t\t\tif (wasNew && !user.isAnonymous)\n\t\t\t\tuser.increaseProjectsCount()\n\n\t\t\tdfd.resolve(asset)\n\t\t})\n\n\t\treturn dfd.promise\n\t})\n}\n\nGraphService.prototype.save = function(data, user, opts) {\n\tvar that = this;\n\tvar gridFsPath = data.url.substring('/data'.length).replace()\n\tvar optimisedGfsPath = gridFsPath.replace('.json', '.min.json')\n\n\treturn this._save.apply(this, arguments)\n\t.then(function(asset) {\n\t\tif (asset.deleted)\n\t\t\treturn asset\n\n\t\t// make an optimized copy\n\t\treturn that._fs.readString(gridFsPath)\n\t\t.then(function(source) {\n\t\t\tvar optimized = new GraphOptimizer()\n\t\t\t\t.graph(JSON.parse(source))\n\t\t\t\t.optimize();\n\n\t\t\treturn that._fs.writeString(optimisedGfsPath,\n\t\t\t\tJSON.stringify(optimized));\n\t\t})\n\t\t.then(function() {\n\t\t\treturn asset;\n\t\t});\n\t});\n};\n\nmodule.exports = GraphService;\n"
  },
  {
    "path": "test/controllers/assetController.js",
    "content": "var mongoose = require('mongoose')\nvar assert = require('assert');\nvar AssetController = require('../../controllers/assetController');\nvar when = require('when');\n\ndescribe('AssetController', function() {\n\tvar ctrl, svc;\n\tvar resolved = function(data) {\n\t\tvar dfd = when.defer();\n\t\tdfd.resolve(data || true);\n\t\treturn dfd.promise;\n\t};\n\n\tbeforeEach(function() {\n\t\tvar fs;\n\t\tsvc = {}\n\t\tvar model = {\n\t\t\tmodelName: 'foo'\n\t\t}\n\t\tctrl = new AssetController(model, svc, fs);\n\t});\n\n\tafter(function() {\n\t\tmongoose.models = {}\n\t\tmongoose.modelSchemas = {}\n\t})\n\n\tit('lists user assets by id', function(done) {\n\t\tvar req = {}\n\t\tvar res = {}\n\t\tvar list = [{ a: '1' }, { b: '2' }]\n\n\t\treq.params = {}\n\t\treq.params.username = ''\n\t\treq.session = { userId: 'me'}\n\n\t\tsvc.findByCreatorId = function(userId) {\n\t\t\tassert.equal('me', userId)\n\t\t\treturn resolved(list)\n\t\t}\n\n\t\tres.json = function(jl) {\n\t\t\tassert.equal(jl.length, 2)\n\t\t\tassert.deepEqual(jl, list)\n\t\t\tdone()\n\t\t}\n\n\t\tctrl.userIndex(req, res)\n\t})\n\n\tit('lists system assets', function(done) {\n\t\tvar req = {}\n\t\tvar res = {}\n\t\tvar list = [{ a: '1' }, { b: '2' }]\n\n\t\treq.params = {}\n\t\treq.params.username = ''\n\t\treq.session = { userId: 'system'}\n\n\t\tsvc.findByCreatorId = function(userId) {\n\t\t\tassert.equal('system', userId)\n\t\t\treturn resolved(list)\n\t\t}\n\n\t\tres.json = function(jl) {\n\t\t\tassert.equal(jl.length, 2)\n\t\t\tassert.deepEqual(jl, list)\n\t\t\tdone()\n\t\t}\n\n\t\tctrl.userIndex(req, res)\n\t})\n\n})\n\n"
  },
  {
    "path": "test/controllers/documentationController.js",
    "content": "var assert = require('assert');\nvar DocumentationController = require('../../controllers/documentationController');\nvar when = require('when');\n\ndescribe('DocumentationController', function() {\n\tvar dc\n\n\tbeforeEach(function() {\n\t\tdc = new DocumentationController()\n\t})\n\n\tit('fetches documentation for plugins', function(done) {\n\t\tvar req = {params: {}}\n\t\tvar res = {}\n\t\treq.params.pluginName = 'and_modulator'\n\n\t\tres.json = function(data) {\n\t\t\tassert.equal(data.desc, \"<p>Emit <strong>True</strong> if <em>and only if</em> both inputs are <strong>True</strong>. <strong>False</strong> otherwise.</p>\\n\")\n\t\t\tassert.deepEqual(data.inputs, [{name: 'a', desc: '<p>The first <strong>operand</strong>.</p>\\n'}, {name: 'b', desc: '<p>The second <strong>operand</strong>.</p>\\n'}])\n\t\t\tassert.deepEqual(data.outputs, [{name: 'bool', desc: '<p>Emits <strong>True</strong> if <strong>first</strong> <em>and</em> <strong>second</strong> are <strong>True</strong>, and <strong>False</strong> otherwise.</p>\\n'}])\n\n\t\t\tdone()\n\t\t}\n\n\t\tdc.getPluginDocumentation(req, res, function() {assert.ok(false); done()})\n\t})\n\n\tit('fetches 404 for plugin without documentation', function(done) {\n\t\tvar req = {params: {}}\n\t\tvar res = {}\n\t\treq.params.pluginName = 'nonexistent_test_plugin'\n\n\t\tres.json = function(data) {\n\t\t\tassert.ok(false, 'found an nonexistent plugin documentation')\n\n\t\t\tdone()\n\t\t}\n\n\t\tdc.getPluginDocumentation(req, res, function(e) {assert.ok(e.status === 404); done()})\n\t})\n})\n"
  },
  {
    "path": "test/controllers/graphController.js",
    "content": "process.env.GRAPHCONTROLLER_PAGE_SIZE = 2\n\nvar assert = require('assert')\nvar GraphController = require('../../controllers/graphController')\nvar when = require('when')\nvar fs = require('fs')\n\ndescribe('GraphController', function() {\n\tvar ctrl, svc, stream\n\tvar res = { json: function() {}, render: function() {} }\n\n\tfunction resolved(data) {\n\t\treturn when.resolve(data)\n\t}\n\n\tbeforeEach(function() {\n\t\tsvc = {\n\t\t\tcanWrite: resolved,\n\t\t\tsave: function(data) {\n\t\t\t\treturn resolved(data)\n\t\t\t}\n\t\t}\n\t\tfs = {\n\t\t\turl: function(str) {\n\t\t\t\treturn '/root'+str\n\t\t\t},\n\t\t\twriteString: function() {\n\t\t\t\treturn resolved()\n\t\t\t},\n\t\t\twriteString: resolved\n\t\t}\n\n\t\tvar mongo = {\n\t\t\tcollection: function() {}\n\t\t}\n\t\tctrl = new GraphController(svc, fs, mongo)\n\t})\n\n\tit('calls save on graph post', function(done) {\n\t\tsvc.save = function(data) {\n\t\t\tassert.equal(data.path, '/memyselfandi/foo')\n\t\t\tassert.equal(data.graph, undefined)\n\t\t\treturn resolved(data)\n\t\t}\n\n\t\tfs.writeString = function() {\n\t\t\tdone()\n\t\t\treturn resolved()\n\t\t}\n\n\t\tctrl.save({\n\t\t\tbody: { path: 'foo', graph: '{ \"root\": {}}' },\n\t\t\tuser: { username: 'memyselfandi' }\n\t\t}, res, done)\n\t});\n\n\tit('handles graph post', function(done) {\n\t\tctrl.save({\n\t\t\tbody: { path: 'foo', graph: '{ \"root\": {}}' },\n\t\t\tuser: { username: 'memyselfandi'}\n\t\t}, {\n\t\t\tjson: function(json) {\n\t\t\t\tassert.equal(json.path, '/memyselfandi/foo')\n\t\t\t\tassert.equal(json.url.indexOf('/root/graph/memyselfandi/foo'), 0)\n\t\t\t\tassert.equal(json.previewUrlSmall, '/root/previews/memyselfandi/foo-preview-440x330-52ee467b8878a91cce01ab0f2a3e8ff849909ba5.png')\n\t\t\t\tassert.equal(json.previewUrlLarge, '/root/previews/memyselfandi/foo-preview-1280x720-52ee467b8878a91cce01ab0f2a3e8ff849909ba5.png')\n\t\t\t\tdone()\n\t\t\t}\n\t\t}, done)\n\t});\n\n\tit('pages through results 0-1', function(done) {\n\t\tsvc.publicRankedList = function(opts) {\n\t\t\tassert.equal(opts.limit, 2)\n\t\t\tassert.equal(opts.offset, 0)\n\t\t\tdone()\n\t\t\treturn when.resolve({ result: [] })\n\t\t}\n\t\tctrl.publicRankedIndex({ params: { page: 0 }, }, res, done)\n\t});\n\n\tit('pages through results 2-3', function(done) {\n\t\tsvc.publicRankedList = function(opts) {\n\t\t\tassert.equal(opts.limit, 2)\n\t\t\tassert.equal(opts.offset, 2)\n\t\t\tdone()\n\t\t\treturn when.resolve({ result: [] })\n\t\t}\n\t\tctrl.publicRankedIndex({ params: { page: 2 }, }, res, done)\n\t});\n\n});\n"
  },
  {
    "path": "test/fixtures/component-rotation-y.json",
    "content": "{\n    \"nodes\": [{\n        \"plugin\": \"entity_component\",\n        \"x\": 353,\n        \"y\": 569,\n        \"uid\": \"B9s6NLUFhEx7\",\n        \"state\": {\n            \"always_update\": true,\n            \"input_sids\": {},\n            \"output_sids\": {\n                \"vh3vhkHMwZVE\": \"hAAWj4zrpu6a\"\n            }\n        },\n        \"title\": \"Wobble on Y axis\",\n        \"graph\": {\n            \"uid\": \"Huru3nKe58cN\",\n            \"parent_uid\": \"VXrYhepwHyZH\",\n            \"open\": true,\n            \"nodes\": [{\n                \"plugin\": \"output_proxy\",\n                \"x\": 825,\n                \"y\": 550,\n                \"uid\": \"vh3vhkHMwZVE\",\n                \"title\": \"position\",\n                \"dyn_in\": [{\n                    \"name\": \"output\",\n                    \"dt\": 5,\n                    \"def\": null,\n                    \"uid\": \"vEbx2hrxHrMs\",\n                    \"dynamic\": true,\n                    \"type\": 0,\n                    \"index\": 0,\n                    \"is_connected\": true,\n                    \"connected\": true\n                }]\n            }, {\n                \"plugin\": \"vector\",\n                \"x\": 592,\n                \"y\": 549,\n                \"uid\": \"rPvZeP2EYb9w\",\n                \"open\": false\n            }, {\n                \"plugin\": \"annotation\",\n                \"x\": 614,\n                \"y\": 146,\n                \"uid\": \"zzVae32Epwr6\",\n                \"state\": {\n                    \"text\": \"Wobble the Y position with a sinewave.\",\n                    \"width\": 207,\n                    \"height\": 80\n                }\n            }, {\n                \"plugin\": \"clock_generator\",\n                \"x\": 362,\n                \"y\": 415,\n                \"uid\": \"wpjFNWJbSRZ4\"\n            }, {\n                \"plugin\": \"sine_modulator\",\n                \"x\": 552,\n                \"y\": 498,\n                \"uid\": \"dGRYxnQ6ewTs\",\n                \"open\": false\n            }, {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 280,\n                \"y\": 474,\n                \"uid\": \"9u8Fcpp9SEFd\",\n                \"state\": {\n                    \"val\": 0.187,\n                    \"min\": 0,\n                    \"max\": 1\n                },\n                \"title\": \"Wobble Speed\"\n            }, {\n                \"plugin\": \"multiply_modulator\",\n                \"x\": 505,\n                \"y\": 450,\n                \"uid\": \"QLzyyGMYLGp4\",\n                \"open\": false,\n                \"title\": \"Multiply\"\n            }],\n            \"conns\": [{\n                \"src_nuid\": \"rPvZeP2EYb9w\",\n                \"dst_nuid\": \"vh3vhkHMwZVE\",\n                \"src_slot\": \"vector\",\n                \"dst_slot\": 0,\n                \"uid\": \"JzM7HgqjeQUE\",\n                \"src_connected\": true,\n                \"dst_connected\": true,\n                \"dst_dyn\": true\n            }, {\n                \"src_nuid\": \"dGRYxnQ6ewTs\",\n                \"dst_nuid\": \"rPvZeP2EYb9w\",\n                \"src_slot\": \"value\",\n                \"dst_slot\": \"y\",\n                \"uid\": \"r7vA9QJTEx9H\",\n                \"src_connected\": true,\n                \"dst_connected\": true\n            }, {\n                \"src_nuid\": \"wpjFNWJbSRZ4\",\n                \"dst_nuid\": \"QLzyyGMYLGp4\",\n                \"src_slot\": \"seconds\",\n                \"dst_slot\": \"a\",\n                \"uid\": \"SJYez7RmA6KK\",\n                \"src_connected\": true,\n                \"dst_connected\": true\n            }, {\n                \"src_nuid\": \"9u8Fcpp9SEFd\",\n                \"dst_nuid\": \"QLzyyGMYLGp4\",\n                \"src_slot\": \"value\",\n                \"dst_slot\": \"b\",\n                \"uid\": \"483geGtgJE6d\",\n                \"src_connected\": true,\n                \"dst_connected\": true\n            }, {\n                \"src_nuid\": \"QLzyyGMYLGp4\",\n                \"dst_nuid\": \"dGRYxnQ6ewTs\",\n                \"src_slot\": \"result\",\n                \"dst_slot\": \"time\",\n                \"uid\": \"KY2uwcrvJu6S\",\n                \"src_connected\": true,\n                \"dst_connected\": true\n            }]\n        },\n        \"dyn_out\": [{\n            \"name\": \"position\",\n            \"dt\": 5,\n            \"index\": 0,\n            \"uid\": \"hAAWj4zrpu6a\",\n            \"dynamic\": true,\n            \"type\": 1,\n            \"is_connected\": true\n        }]\n    }],\n    \"conns\": [{\n        \"src_nuid\": \"B9s6NLUFhEx7\",\n        \"dst_nuid\": \"KuEQ556yBFDK\",\n        \"src_slot\": 0,\n        \"dst_slot\": \"position\",\n        \"uid\": \"4sAfB7ZQFkxT\",\n        \"src_connected\": true,\n        \"dst_connected\": true,\n        \"src_dyn\": true\n    }],\n    \"x1\": 403,\n    \"y1\": 619,\n    \"x2\": 597,\n    \"y2\": 678\n}"
  },
  {
    "path": "test/fixtures/graph.json",
    "content": "{\n    \"abs_t\": 510.481,\n    \"active_graph\": \"root\",\n    \"graph_uid\": \"TXDgBc0JJtS3\",\n    \"root\": {\n        \"uid\": \"root\",\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 87,\n                \"y\": 249,\n                \"uid\": \"F7vsqCsT1H7I\",\n                \"state\": {\n                    \"always_update\": true,\n                    \"input_sids\": {},\n                    \"output_sids\": {\n                        \"KUVIt8IoP1bg\": \"Ys30r7aVEks1\"\n                    }\n                },\n                \"title\": \"Box\",\n                \"graph\": {\n                    \"uid\": \"iMMxodF60c4k\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"three_mesh\",\n                            \"x\": 424,\n                            \"y\": 254,\n                            \"uid\": \"AXRPZGJb3Dac\"\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 615,\n                            \"y\": 314,\n                            \"uid\": \"KUVIt8IoP1bg\",\n                            \"title\": \"object3d\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 21,\n                                    \"def\": null,\n                                    \"uid\": \"UW8xhKSPhTFp\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 70,\n                            \"y\": 322,\n                            \"uid\": \"EZrQsMmgCLgP\",\n                            \"state\": {\n                                \"always_update\": true,\n                                \"input_sids\": {},\n                                \"output_sids\": {\n                                    \"lTinRx5wDILm\": \"kNCVqRth7P7e\",\n                                    \"1e6j9qkTVakL\": \"j9HWaNkV9Ebv\",\n                                    \"aZHH160gAHE8\": \"8DsLGwXcfbYF\"\n                                }\n                            },\n                            \"title\": \"Position, Rotation, Scale\",\n                            \"graph\": {\n                                \"uid\": \"V6C3LBABzED4\",\n                                \"parent_uid\": \"iMMxodF60c4k\",\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"slider_float_generator\",\n                                        \"x\": 21,\n                                        \"y\": 91,\n                                        \"uid\": \"tdQ2GsmY0zR0\",\n                                        \"state\": {\n                                            \"val\": 0,\n                                            \"min\": -1,\n                                            \"max\": 1\n                                        },\n                                        \"title\": \"Position X\"\n                                    },\n                                    {\n                                        \"plugin\": \"slider_float_generator\",\n                                        \"x\": 22,\n                                        \"y\": 158,\n                                        \"uid\": \"6wADRKsLAzsD\",\n                                        \"state\": {\n                                            \"val\": 0,\n                                            \"min\": -1,\n                                            \"max\": 1\n                                        },\n                                        \"title\": \"Position Y\"\n                                    },\n                                    {\n                                        \"plugin\": \"slider_float_generator\",\n                                        \"x\": 20,\n                                        \"y\": 224,\n                                        \"uid\": \"lGP8KUmTlZ2S\",\n                                        \"state\": {\n                                            \"val\": 0,\n                                            \"min\": -1,\n                                            \"max\": 1\n                                        },\n                                        \"title\": \"Position Z\"\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 370,\n                                        \"y\": 142,\n                                        \"uid\": \"sapcnAWDjY7h\",\n                                        \"title\": \"Position\"\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 348,\n                                        \"y\": 588,\n                                        \"uid\": \"8Aj5XS1Dp1w8\",\n                                        \"title\": \"Scale\"\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 350,\n                                        \"y\": 415,\n                                        \"uid\": \"J3zDF3RfWjMz\",\n                                        \"title\": \"Rotation\"\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 73,\n                                        \"y\": 593,\n                                        \"uid\": \"5JjqmZ3a4J9w\",\n                                        \"state\": {\n                                            \"val\": 0.3\n                                        },\n                                        \"title\": \"Scale XYZ\"\n                                    },\n                                    {\n                                        \"plugin\": \"clock_generator\",\n                                        \"x\": 99,\n                                        \"y\": 425,\n                                        \"uid\": \"qyG0yq4y4nJC\"\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 608,\n                                        \"y\": 581,\n                                        \"uid\": \"lTinRx5wDILm\",\n                                        \"title\": \"scale\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 5,\n                                                \"def\": null,\n                                                \"uid\": \"BSJXoHyMPIgk\",\n                                                \"dynamic\": true,\n                                                \"type\": 0,\n                                                \"index\": 0,\n                                                \"is_connected\": true,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 594,\n                                        \"y\": 426,\n                                        \"uid\": \"1e6j9qkTVakL\",\n                                        \"title\": \"rotation\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 5,\n                                                \"def\": null,\n                                                \"uid\": \"eDSw6r1hKhFA\",\n                                                \"dynamic\": true,\n                                                \"type\": 0,\n                                                \"index\": 0,\n                                                \"is_connected\": true,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 595,\n                                        \"y\": 149,\n                                        \"uid\": \"aZHH160gAHE8\",\n                                        \"title\": \"position\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 5,\n                                                \"def\": null,\n                                                \"uid\": \"2HHqrD2d9yeE\",\n                                                \"dynamic\": true,\n                                                \"type\": 0,\n                                                \"index\": 0,\n                                                \"is_connected\": true,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": \"tdQ2GsmY0zR0\",\n                                        \"dst_nuid\": \"sapcnAWDjY7h\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"uid\": \"KYNVImUGOKt3\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true\n                                    },\n                                    {\n                                        \"src_nuid\": \"6wADRKsLAzsD\",\n                                        \"dst_nuid\": \"sapcnAWDjY7h\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"uid\": \"iq0i08iWCjkU\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true\n                                    },\n                                    {\n                                        \"src_nuid\": \"lGP8KUmTlZ2S\",\n                                        \"dst_nuid\": \"sapcnAWDjY7h\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"uid\": \"r49ESRulYkyJ\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true\n                                    },\n                                    {\n                                        \"src_nuid\": \"5JjqmZ3a4J9w\",\n                                        \"dst_nuid\": \"8Aj5XS1Dp1w8\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"uid\": \"TrQ40pIy8NzX\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true\n                                    },\n                                    {\n                                        \"src_nuid\": \"5JjqmZ3a4J9w\",\n                                        \"dst_nuid\": \"8Aj5XS1Dp1w8\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"uid\": \"aecMTqQ3ui2u\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": \"5JjqmZ3a4J9w\",\n                                        \"dst_nuid\": \"8Aj5XS1Dp1w8\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"uid\": \"s2YiyVJq74lC\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true\n                                    },\n                                    {\n                                        \"src_nuid\": \"qyG0yq4y4nJC\",\n                                        \"dst_nuid\": \"J3zDF3RfWjMz\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"uid\": \"hM3Oqh1MYme3\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true\n                                    },\n                                    {\n                                        \"src_nuid\": \"qyG0yq4y4nJC\",\n                                        \"dst_nuid\": \"J3zDF3RfWjMz\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"uid\": \"n0UZe8sta8BN\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true\n                                    },\n                                    {\n                                        \"src_nuid\": \"qyG0yq4y4nJC\",\n                                        \"dst_nuid\": \"J3zDF3RfWjMz\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"uid\": \"XhCMCBRNVMIS\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true\n                                    },\n                                    {\n                                        \"src_nuid\": \"sapcnAWDjY7h\",\n                                        \"dst_nuid\": \"aZHH160gAHE8\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"uid\": \"T8IwFMaCXEin\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": \"J3zDF3RfWjMz\",\n                                        \"dst_nuid\": \"1e6j9qkTVakL\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"uid\": \"zXBrxfLLfA9O\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": \"8Aj5XS1Dp1w8\",\n                                        \"dst_nuid\": \"lTinRx5wDILm\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"uid\": \"rdCBCLIxl1vP\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"position\",\n                                    \"dt\": 5,\n                                    \"index\": 0,\n                                    \"uid\": \"8DsLGwXcfbYF\",\n                                    \"dynamic\": true,\n                                    \"type\": 1,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"rotation\",\n                                    \"dt\": 5,\n                                    \"index\": 1,\n                                    \"uid\": \"j9HWaNkV9Ebv\",\n                                    \"dynamic\": true,\n                                    \"type\": 1,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"scale\",\n                                    \"dt\": 5,\n                                    \"index\": 2,\n                                    \"uid\": \"kNCVqRth7P7e\",\n                                    \"dynamic\": true,\n                                    \"type\": 1,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"three_material_phong\",\n                            \"x\": 227,\n                            \"y\": 450,\n                            \"uid\": \"aJOHmMab6QLI\"\n                        },\n                        {\n                            \"plugin\": \"three_geometry_box\",\n                            \"x\": 175,\n                            \"y\": 271,\n                            \"uid\": \"ZKmkyt2SCP5g\"\n                        },\n                        {\n                            \"plugin\": \"annotation\",\n                            \"x\": 65,\n                            \"y\": 70,\n                            \"uid\": \"kfpuoWgPZjy7\",\n                            \"state\": {\n                                \"text\": \"This is the nested patch for the Box.\\nConnect the Phong material to the Mesh!\",\n                                \"width\": 204,\n                                \"height\": 41\n                            }\n                        },\n                        {\n                            \"plugin\": \"color_picker\",\n                            \"x\": 11,\n                            \"y\": 468,\n                            \"uid\": \"DX352VkQwWK2\",\n                            \"state\": {\n                                \"hue\": 0.89,\n                                \"sat\": 0.9,\n                                \"lum\": 0.91\n                            }\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"AXRPZGJb3Dac\",\n                            \"dst_nuid\": \"KUVIt8IoP1bg\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"9QJuavsy4oBZ\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"ZKmkyt2SCP5g\",\n                            \"dst_nuid\": \"AXRPZGJb3Dac\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"dJh6kWrWhXVu\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"DX352VkQwWK2\",\n                            \"dst_nuid\": \"aJOHmMab6QLI\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"bsDTWOSjbHts\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"EZrQsMmgCLgP\",\n                            \"dst_nuid\": \"AXRPZGJb3Dac\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"uid\": \"YR9zbU3ElbTk\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"EZrQsMmgCLgP\",\n                            \"dst_nuid\": \"AXRPZGJb3Dac\",\n                            \"src_slot\": 1,\n                            \"dst_slot\": 4,\n                            \"uid\": \"iF10j4ZDm1lQ\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"EZrQsMmgCLgP\",\n                            \"dst_nuid\": \"AXRPZGJb3Dac\",\n                            \"src_slot\": 2,\n                            \"dst_slot\": 5,\n                            \"uid\": \"Nau6vdv2fX9a\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"src_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_out\": [\n                    {\n                        \"name\": \"object3d\",\n                        \"dt\": 21,\n                        \"index\": 0,\n                        \"uid\": \"Ys30r7aVEks1\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 393,\n                \"y\": 161,\n                \"uid\": \"45rjEcLj62c2\",\n                \"state\": {\n                    \"always_update\": true,\n                    \"input_sids\": {},\n                    \"output_sids\": {\n                        \"wghbdJEVX7Jt\": \"8GpdZjiiiEQa\"\n                    }\n                },\n                \"title\": \"VR camera\",\n                \"graph\": {\n                    \"uid\": \"Luq1jlSlDICE\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"three_vr_camera\",\n                            \"x\": 503,\n                            \"y\": 249,\n                            \"uid\": \"gPxJDJT2iaab\"\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 681,\n                            \"y\": 310,\n                            \"uid\": \"wghbdJEVX7Jt\",\n                            \"title\": \"camera\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 6,\n                                    \"def\": null,\n                                    \"uid\": \"uyyGR7LQwSEh\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 17,\n                            \"y\": 237,\n                            \"uid\": \"W8qFo71CQtqm\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"Position X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 17,\n                            \"y\": 302,\n                            \"uid\": \"rpLRlJOP1NiD\",\n                            \"state\": {\n                                \"val\": 0,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"Position Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 17,\n                            \"y\": 368,\n                            \"uid\": \"Dib2OnJ7sKCi\",\n                            \"state\": {\n                                \"val\": 2,\n                                \"min\": -2,\n                                \"max\": 2\n                            },\n                            \"title\": \"Position Z\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 340,\n                            \"y\": 299,\n                            \"uid\": \"dGHzjMjXnauT\",\n                            \"title\": \"Camera position\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 376,\n                            \"y\": 199,\n                            \"uid\": \"6M2TxkvEqYtc\",\n                            \"state\": {\n                                \"val\": 45\n                            },\n                            \"title\": \"FOV\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"gPxJDJT2iaab\",\n                            \"dst_nuid\": \"wghbdJEVX7Jt\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"rxo2qcYvkhHR\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"W8qFo71CQtqm\",\n                            \"dst_nuid\": \"dGHzjMjXnauT\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"Vu0N2nLeZ7ak\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"rpLRlJOP1NiD\",\n                            \"dst_nuid\": \"dGHzjMjXnauT\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"swtzIoT2ywjc\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"Dib2OnJ7sKCi\",\n                            \"dst_nuid\": \"dGHzjMjXnauT\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"jfPRyWs9ixY8\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"dGHzjMjXnauT\",\n                            \"dst_nuid\": \"gPxJDJT2iaab\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"TDSamUc9rKa8\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"6M2TxkvEqYtc\",\n                            \"dst_nuid\": \"gPxJDJT2iaab\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"ErePKq1fyFw3\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        }\n                    ]\n                },\n                \"dyn_out\": [\n                    {\n                        \"name\": \"camera\",\n                        \"dt\": 6,\n                        \"index\": 0,\n                        \"uid\": \"8GpdZjiiiEQa\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 79,\n                \"y\": 324,\n                \"uid\": \"JE8hv2zEirLU\",\n                \"state\": {\n                    \"always_update\": true,\n                    \"input_sids\": {},\n                    \"output_sids\": {\n                        \"txM3nltzQ772\": \"547odbJKrTzG\"\n                    }\n                },\n                \"title\": \"Point light\",\n                \"graph\": {\n                    \"uid\": \"q4YsaAW0T3za\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 648,\n                            \"y\": 309,\n                            \"uid\": \"txM3nltzQ772\",\n                            \"title\": \"object3d\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 21,\n                                    \"def\": null,\n                                    \"uid\": \"vSy6Gj4JSPYs\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 39,\n                            \"y\": 375,\n                            \"uid\": \"3H7bmcJUHEo2\",\n                            \"state\": {\n                                \"val\": -0.008,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"X\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 39,\n                            \"y\": 441,\n                            \"uid\": \"JAXBip6CPJDB\",\n                            \"state\": {\n                                \"val\": 0.606,\n                                \"min\": -1,\n                                \"max\": 1\n                            },\n                            \"title\": \"Y\"\n                        },\n                        {\n                            \"plugin\": \"slider_float_generator\",\n                            \"x\": 34,\n                            \"y\": 508,\n                            \"uid\": \"rq9lr909zBzO\",\n                            \"state\": {\n                                \"val\": 2,\n                                \"min\": -1,\n                                \"max\": 2\n                            },\n                            \"title\": \"Z\"\n                        },\n                        {\n                            \"plugin\": \"vector\",\n                            \"x\": 342,\n                            \"y\": 398,\n                            \"uid\": \"0AqY4opiMqBM\",\n                            \"title\": \"Position\"\n                        },\n                        {\n                            \"plugin\": \"three_point_light\",\n                            \"x\": 459,\n                            \"y\": 307,\n                            \"uid\": \"5JQaApeBZxea\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 225,\n                            \"y\": 307,\n                            \"uid\": \"7BISUoBCNXqu\",\n                            \"state\": {\n                                \"val\": 1.7\n                            },\n                            \"title\": \"Intensity\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"3H7bmcJUHEo2\",\n                            \"dst_nuid\": \"0AqY4opiMqBM\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"vujwdunJsKjQ\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"JAXBip6CPJDB\",\n                            \"dst_nuid\": \"0AqY4opiMqBM\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"9cY2wUOFuLn7\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"rq9lr909zBzO\",\n                            \"dst_nuid\": \"0AqY4opiMqBM\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"dfBjQszH6e0h\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"5JQaApeBZxea\",\n                            \"dst_nuid\": \"txM3nltzQ772\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"aYkCHTvIbMFA\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"0AqY4opiMqBM\",\n                            \"dst_nuid\": \"5JQaApeBZxea\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"uid\": \"BmH2PYB8m4e3\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"7BISUoBCNXqu\",\n                            \"dst_nuid\": \"5JQaApeBZxea\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"Yaqz1gE2iNG4\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        }\n                    ]\n                },\n                \"dyn_out\": [\n                    {\n                        \"name\": \"object3d\",\n                        \"dt\": 21,\n                        \"index\": 0,\n                        \"uid\": \"547odbJKrTzG\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"annotation\",\n                \"x\": 54,\n                \"y\": 130,\n                \"uid\": \"eRL3axT3Ff1I\",\n                \"state\": {\n                    \"text\": \"Welcome to Patches!\\nClick the Edit button on the Box patch!\",\n                    \"width\": 198,\n                    \"height\": 35\n                }\n            },\n            {\n                \"plugin\": \"three_scene\",\n                \"x\": 315,\n                \"y\": 240,\n                \"uid\": \"qflZidzjtnQX\",\n                \"dyn_in\": [\n                    {\n                        \"type\": 0,\n                        \"name\": \"0\",\n                        \"dt\": 21,\n                        \"array\": true,\n                        \"uid\": \"DDzcOXqI6iRM\",\n                        \"dynamic\": true,\n                        \"index\": 0,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"type\": 0,\n                        \"name\": \"1\",\n                        \"dt\": 21,\n                        \"array\": true,\n                        \"uid\": \"gH5pmBKZK4lm\",\n                        \"dynamic\": true,\n                        \"index\": 1,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"type\": 0,\n                        \"name\": \"2\",\n                        \"dt\": 21,\n                        \"array\": true,\n                        \"uid\": \"ExPIjji5rvFO\",\n                        \"dynamic\": true,\n                        \"index\": 2,\n                        \"is_connected\": true\n                    },\n                    {\n                        \"type\": 0,\n                        \"name\": \"3\",\n                        \"dt\": 21,\n                        \"array\": true,\n                        \"uid\": \"hddJID3FkB4R\",\n                        \"dynamic\": true,\n                        \"index\": 3,\n                        \"is_connected\": false\n                    },\n                    {\n                        \"type\": 0,\n                        \"name\": \"4\",\n                        \"dt\": 21,\n                        \"array\": true,\n                        \"uid\": \"fb1ifySJ5kUl\",\n                        \"dynamic\": true,\n                        \"index\": 4,\n                        \"is_connected\": false\n                    }\n                ]\n            },\n            {\n                \"plugin\": \"three_webgl_renderer\",\n                \"x\": 569,\n                \"y\": 161,\n                \"uid\": \"DeVeX4NPB0qj\",\n                \"state\": {\n                    \"always_update\": true\n                }\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 55,\n                \"y\": 405,\n                \"uid\": \"sqwIFj7gwhsH\",\n                \"state\": {\n                    \"always_update\": true,\n                    \"input_sids\": {},\n                    \"output_sids\": {\n                        \"wvHE9PeQUI2b\": \"mh0rTKkFm0nD\"\n                    }\n                },\n                \"title\": \"Ground Plane\",\n                \"graph\": {\n                    \"uid\": \"EggfP3QptNML\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"three_mesh\",\n                            \"x\": 646,\n                            \"y\": 436,\n                            \"uid\": \"j9pZPtR8i8s1\"\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 845,\n                            \"y\": 435,\n                            \"uid\": \"wvHE9PeQUI2b\",\n                            \"title\": \"object3d\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 21,\n                                    \"def\": null,\n                                    \"uid\": \"bEdPpC9C6Rh1\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"toggle_button\",\n                            \"x\": 491,\n                            \"y\": 632,\n                            \"uid\": \"H82aayZeZBKR\",\n                            \"state\": {\n                                \"enabled\": true\n                            },\n                            \"title\": \"Visible\"\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 364,\n                            \"y\": 522,\n                            \"uid\": \"9CtqhxjQDPWR\",\n                            \"state\": {\n                                \"always_update\": true,\n                                \"input_sids\": {},\n                                \"output_sids\": {\n                                    \"tScxqFgzShns\": \"xnmIRUOwsegz\",\n                                    \"UScWp8PJx2qB\": \"ejxO7eIJpw4m\",\n                                    \"DHO5eu6LxaSs\": \"H3AwGhvcvewD\"\n                                }\n                            },\n                            \"title\": \"Position, Rotation, Scale\",\n                            \"graph\": {\n                                \"uid\": \"7ssvJHv77NP4\",\n                                \"parent_uid\": \"EggfP3QptNML\",\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"slider_float_generator\",\n                                        \"x\": 82,\n                                        \"y\": 105,\n                                        \"uid\": \"kJtBFUf7Kd1n\",\n                                        \"state\": {\n                                            \"val\": 0,\n                                            \"min\": -1,\n                                            \"max\": 1\n                                        },\n                                        \"title\": \"Position X\"\n                                    },\n                                    {\n                                        \"plugin\": \"slider_float_generator\",\n                                        \"x\": 83,\n                                        \"y\": 172,\n                                        \"uid\": \"xTcMSGYcXTnj\",\n                                        \"state\": {\n                                            \"val\": -0.36,\n                                            \"min\": -1,\n                                            \"max\": 1\n                                        },\n                                        \"title\": \"Position Y\"\n                                    },\n                                    {\n                                        \"plugin\": \"slider_float_generator\",\n                                        \"x\": 81,\n                                        \"y\": 238,\n                                        \"uid\": \"nCVWzbHZaEXg\",\n                                        \"state\": {\n                                            \"val\": -0.5,\n                                            \"min\": -1,\n                                            \"max\": 1\n                                        },\n                                        \"title\": \"Position Z\"\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 585,\n                                        \"y\": 200,\n                                        \"uid\": \"zykcFbVIQbQ1\",\n                                        \"open\": false,\n                                        \"title\": \"Position\"\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 290,\n                                        \"y\": 610,\n                                        \"uid\": \"XQQNODAbGEIB\",\n                                        \"title\": \"Scale\"\n                                    },\n                                    {\n                                        \"plugin\": \"vector\",\n                                        \"x\": 581,\n                                        \"y\": 413,\n                                        \"uid\": \"Od8zeUZ8qvwZ\",\n                                        \"open\": false,\n                                        \"title\": \"Rotation\"\n                                    },\n                                    {\n                                        \"plugin\": \"const_float_generator\",\n                                        \"x\": 113,\n                                        \"y\": 636,\n                                        \"uid\": \"QuJBbRwZJq01\",\n                                        \"state\": {\n                                            \"val\": 8.6\n                                        },\n                                        \"title\": \"Scale XYZ\"\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 803,\n                                        \"y\": 252,\n                                        \"uid\": \"tScxqFgzShns\",\n                                        \"title\": \"position\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 5,\n                                                \"def\": null,\n                                                \"uid\": \"S0aurqIbmI1x\",\n                                                \"dynamic\": true,\n                                                \"type\": 0,\n                                                \"index\": 0,\n                                                \"is_connected\": true,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 818,\n                                        \"y\": 400,\n                                        \"uid\": \"UScWp8PJx2qB\",\n                                        \"title\": \"rotation\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 5,\n                                                \"def\": null,\n                                                \"uid\": \"ueZzDAy1hfyc\",\n                                                \"dynamic\": true,\n                                                \"type\": 0,\n                                                \"index\": 0,\n                                                \"is_connected\": true,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 825,\n                                        \"y\": 549,\n                                        \"uid\": \"DHO5eu6LxaSs\",\n                                        \"title\": \"scale\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 5,\n                                                \"def\": null,\n                                                \"uid\": \"TTvvZvj40kZI\",\n                                                \"dynamic\": true,\n                                                \"type\": 0,\n                                                \"index\": 0,\n                                                \"is_connected\": true,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"slider_float_generator\",\n                                        \"x\": 85,\n                                        \"y\": 369,\n                                        \"uid\": \"feDfpnlxwFEp\",\n                                        \"state\": {\n                                            \"val\": -1.57075,\n                                            \"min\": -1.57075,\n                                            \"max\": 1.57075\n                                        },\n                                        \"title\": \"Rotate X\"\n                                    },\n                                    {\n                                        \"plugin\": \"slider_float_generator\",\n                                        \"x\": 82,\n                                        \"y\": 436,\n                                        \"uid\": \"zhkGRDbL1Jgq\",\n                                        \"state\": {\n                                            \"val\": 0,\n                                            \"min\": 0,\n                                            \"max\": 5\n                                        },\n                                        \"title\": \"Rotate Y\"\n                                    },\n                                    {\n                                        \"plugin\": \"slider_float_generator\",\n                                        \"x\": 80,\n                                        \"y\": 502,\n                                        \"uid\": \"cw9D3fC2fLsI\",\n                                        \"state\": {\n                                            \"val\": 0,\n                                            \"min\": 0,\n                                            \"max\": 5\n                                        },\n                                        \"title\": \"Rotate Z\"\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": \"kJtBFUf7Kd1n\",\n                                        \"dst_nuid\": \"zykcFbVIQbQ1\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"uid\": \"1mtJRlCO1qVM\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true\n                                    },\n                                    {\n                                        \"src_nuid\": \"xTcMSGYcXTnj\",\n                                        \"dst_nuid\": \"zykcFbVIQbQ1\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"uid\": \"pHvj1ZUG7X12\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true\n                                    },\n                                    {\n                                        \"src_nuid\": \"nCVWzbHZaEXg\",\n                                        \"dst_nuid\": \"zykcFbVIQbQ1\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"uid\": \"88gJkOyqWKzX\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true\n                                    },\n                                    {\n                                        \"src_nuid\": \"QuJBbRwZJq01\",\n                                        \"dst_nuid\": \"XQQNODAbGEIB\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"uid\": \"26tHPkaml0Jg\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true\n                                    },\n                                    {\n                                        \"src_nuid\": \"QuJBbRwZJq01\",\n                                        \"dst_nuid\": \"XQQNODAbGEIB\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"uid\": \"VhdlmKFiS0a0\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true,\n                                        \"offset\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": \"QuJBbRwZJq01\",\n                                        \"dst_nuid\": \"XQQNODAbGEIB\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"uid\": \"Bp9iH0nMIrBs\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true\n                                    },\n                                    {\n                                        \"src_nuid\": \"zykcFbVIQbQ1\",\n                                        \"dst_nuid\": \"tScxqFgzShns\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"uid\": \"KFlPAlujUnGU\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": \"Od8zeUZ8qvwZ\",\n                                        \"dst_nuid\": \"UScWp8PJx2qB\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"uid\": \"uSn2KHTfY0xc\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": \"XQQNODAbGEIB\",\n                                        \"dst_nuid\": \"DHO5eu6LxaSs\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"uid\": \"WCOvwmRKc0Rm\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": \"feDfpnlxwFEp\",\n                                        \"dst_nuid\": \"Od8zeUZ8qvwZ\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"uid\": \"FvVvkCFFnBui\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true\n                                    },\n                                    {\n                                        \"src_nuid\": \"zhkGRDbL1Jgq\",\n                                        \"dst_nuid\": \"Od8zeUZ8qvwZ\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"uid\": \"LbdsH8aOBSJL\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true\n                                    },\n                                    {\n                                        \"src_nuid\": \"cw9D3fC2fLsI\",\n                                        \"dst_nuid\": \"Od8zeUZ8qvwZ\",\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"uid\": \"CXUdyY9dtTsp\",\n                                        \"src_connected\": true,\n                                        \"dst_connected\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"scale\",\n                                    \"dt\": 5,\n                                    \"index\": 0,\n                                    \"uid\": \"H3AwGhvcvewD\",\n                                    \"dynamic\": true,\n                                    \"type\": 1,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"rotation\",\n                                    \"dt\": 5,\n                                    \"index\": 1,\n                                    \"uid\": \"ejxO7eIJpw4m\",\n                                    \"dynamic\": true,\n                                    \"type\": 1,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"position\",\n                                    \"dt\": 5,\n                                    \"index\": 2,\n                                    \"uid\": \"xnmIRUOwsegz\",\n                                    \"dynamic\": true,\n                                    \"type\": 1,\n                                    \"is_connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 25,\n                            \"y\": 524,\n                            \"uid\": \"T2L2sXquyHI4\",\n                            \"state\": {\n                                \"val\": 16\n                            },\n                            \"title\": \"Segments\"\n                        },\n                        {\n                            \"plugin\": \"three_geometry_plane\",\n                            \"x\": 189,\n                            \"y\": 465,\n                            \"uid\": \"LAEVUutcCJj8\"\n                        },\n                        {\n                            \"plugin\": \"const_float_generator\",\n                            \"x\": 25,\n                            \"y\": 465,\n                            \"uid\": \"WkbNBtf5A8bQ\",\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Width & Height\"\n                        },\n                        {\n                            \"plugin\": \"color_picker\",\n                            \"x\": 136,\n                            \"y\": 262,\n                            \"uid\": \"G00kVDLpVHHf\",\n                            \"state\": {\n                                \"hue\": 0.24,\n                                \"sat\": 0.78,\n                                \"lum\": 0.76\n                            }\n                        },\n                        {\n                            \"plugin\": \"three_material_lambert\",\n                            \"x\": 352,\n                            \"y\": 244,\n                            \"uid\": \"lwo9bsWEEtaF\"\n                        },\n                        {\n                            \"plugin\": \"annotation\",\n                            \"x\": 64,\n                            \"y\": 159,\n                            \"uid\": \"hgcsGsT0iw5f\",\n                            \"state\": {\n                                \"text\": \"This is the nested patch for the ground plane.\",\n                                \"width\": 119,\n                                \"height\": 33\n                            }\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"j9pZPtR8i8s1\",\n                            \"dst_nuid\": \"wvHE9PeQUI2b\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"RCnLkHtM6lFF\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"H82aayZeZBKR\",\n                            \"dst_nuid\": \"j9pZPtR8i8s1\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 6,\n                            \"uid\": \"M820WdIYapmM\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"9CtqhxjQDPWR\",\n                            \"dst_nuid\": \"j9pZPtR8i8s1\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"uid\": \"bodKllBWEumw\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"9CtqhxjQDPWR\",\n                            \"dst_nuid\": \"j9pZPtR8i8s1\",\n                            \"src_slot\": 1,\n                            \"dst_slot\": 4,\n                            \"uid\": \"IwqELtG7oaCb\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"9CtqhxjQDPWR\",\n                            \"dst_nuid\": \"j9pZPtR8i8s1\",\n                            \"src_slot\": 2,\n                            \"dst_slot\": 3,\n                            \"uid\": \"416UruoUbsAq\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"LAEVUutcCJj8\",\n                            \"dst_nuid\": \"j9pZPtR8i8s1\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"9JK5STrP3ydH\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"WkbNBtf5A8bQ\",\n                            \"dst_nuid\": \"LAEVUutcCJj8\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"rpdrNqAJ67tC\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"WkbNBtf5A8bQ\",\n                            \"dst_nuid\": \"LAEVUutcCJj8\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"Dj0p5SnQHUNn\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"T2L2sXquyHI4\",\n                            \"dst_nuid\": \"LAEVUutcCJj8\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"EAK6zFFRpooY\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"T2L2sXquyHI4\",\n                            \"dst_nuid\": \"LAEVUutcCJj8\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"uid\": \"afDmOETn8uAC\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"G00kVDLpVHHf\",\n                            \"dst_nuid\": \"lwo9bsWEEtaF\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"uid\": \"vCcHUYi1Ldtw\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        },\n                        {\n                            \"src_nuid\": \"lwo9bsWEEtaF\",\n                            \"dst_nuid\": \"j9pZPtR8i8s1\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"uid\": \"B41oTLCGKoIl\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true\n                        }\n                    ]\n                },\n                \"dyn_out\": [\n                    {\n                        \"name\": \"object3d\",\n                        \"dt\": 21,\n                        \"index\": 0,\n                        \"uid\": \"mh0rTKkFm0nD\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": \"JE8hv2zEirLU\",\n                \"dst_nuid\": \"qflZidzjtnQX\",\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"uid\": \"2SKMZOtI0vAm\",\n                \"src_connected\": true,\n                \"dst_connected\": true,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": \"F7vsqCsT1H7I\",\n                \"dst_nuid\": \"qflZidzjtnQX\",\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"uid\": \"Qxi1bX8IB9z9\",\n                \"src_connected\": true,\n                \"dst_connected\": true,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": \"qflZidzjtnQX\",\n                \"dst_nuid\": \"DeVeX4NPB0qj\",\n                \"src_slot\": 0,\n                \"dst_slot\": 1,\n                \"uid\": \"cw5ZGfM1bhjb\",\n                \"src_connected\": true,\n                \"dst_connected\": true\n            },\n            {\n                \"src_nuid\": \"45rjEcLj62c2\",\n                \"dst_nuid\": \"DeVeX4NPB0qj\",\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"uid\": \"qBJpycgZWBNG\",\n                \"src_connected\": true,\n                \"dst_connected\": true,\n                \"src_dyn\": true\n            },\n            {\n                \"src_nuid\": \"sqwIFj7gwhsH\",\n                \"dst_nuid\": \"qflZidzjtnQX\",\n                \"src_slot\": 0,\n                \"dst_slot\": 2,\n                \"uid\": \"shAYIWCAHwSV\",\n                \"src_connected\": true,\n                \"dst_connected\": true,\n                \"src_dyn\": true,\n                \"dst_dyn\": true\n            }\n        ]\n    }\n}\n"
  },
  {
    "path": "test/fixtures/loaders.json",
    "content": "{\n    \"abs_t\": 50.354,\n    \"active_graph\": \"root\",\n    \"graph_uid\": \"TXDgBc0JJtS3\",\n    \"root\": {\n        \"uid\": \"root\",\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"three_loader_model\",\n                \"x\": 509,\n                \"y\": 350,\n                \"uid\": \"jVkWDXLAjTrT\",\n                \"state\": {\n                    \"url\": \"/data/kschzt/assets/scene/fox/fox.js\"\n                }\n            },\n            {\n                \"plugin\": \"url_audio_buffer_generator\",\n                \"x\": 767,\n                \"y\": 332,\n                \"uid\": \"bxM3RuTrhSZK\",\n                \"state\": {\n                    \"url\": \"/data/audio/d6cfcad4024860b287561594147b423820b34405.jpg\"\n                }\n            },\n            {\n                \"plugin\": \"url_texture_generator\",\n                \"x\": 540,\n                \"y\": 173,\n                \"uid\": \"8CCL3ZhmbM2p\",\n                \"state\": {\n                    \"url\": \"/data/image/bc028b7bcbc058acca2f0f48d4340f7db78c7f0f.png\"\n                }\n            },\n            {\n                \"plugin\": \"url_texture_generator\",\n                \"x\": 494,\n                \"y\": 446,\n                \"uid\": \"7yhVPYBfqeGv\",\n                \"state\": {\n                    \"url\": \"/data/image/0bc8d920b61be5fe7a12bb255d53f4eaf454ba55.png\"\n                }\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "test/fixtures/slider-float.json",
    "content": "{\n    \"abs_t\": 102.973,\n    \"active_graph\": \"root\",\n    \"graph_uid\": \"TXDgBc0JJtS3\",\n    \"root\": {\n        \"uid\": \"root\",\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"float_display\",\n                \"x\": 794,\n                \"y\": 436,\n                \"uid\": \"4ZvhZKgD8Njn\"\n            },\n            {\n                \"plugin\": \"slider_float_generator\",\n                \"x\": 375,\n                \"y\": 471,\n                \"uid\": \"CX2xfcJndSpe\",\n                \"state\": {\n                    \"val\": 0,\n                    \"min\": 0,\n                    \"max\": 1\n                }\n            },\n            {\n                \"plugin\": \"graph\",\n                \"x\": 602,\n                \"y\": 439,\n                \"uid\": \"He2pCTSTCSAc\",\n                \"state\": {\n                    \"always_update\": true,\n                    \"input_sids\": {\n                        \"CyGr3wwdbZQm\": \"Tjpea54nUZuK\"\n                    },\n                    \"output_sids\": {\n                        \"DanRkH7HzZtb\": \"7qwZKqJEWRGX\"\n                    }\n                },\n                \"title\": \"Graph\",\n                \"graph\": {\n                    \"uid\": \"cn3S6yLt6urm\",\n                    \"parent_uid\": \"root\",\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"input_proxy\",\n                            \"x\": 445,\n                            \"y\": 700,\n                            \"uid\": \"CyGr3wwdbZQm\",\n                            \"title\": \"input\",\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"input\",\n                                    \"dt\": 0,\n                                    \"uid\": \"j4QYJW7F8mba\",\n                                    \"dynamic\": true,\n                                    \"type\": 1,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"output_proxy\",\n                            \"x\": 680,\n                            \"y\": 716,\n                            \"uid\": \"DanRkH7HzZtb\",\n                            \"title\": \"output\",\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"output\",\n                                    \"dt\": 0,\n                                    \"def\": null,\n                                    \"uid\": \"FPBgeLU37PG6\",\n                                    \"dynamic\": true,\n                                    \"type\": 0,\n                                    \"index\": 0,\n                                    \"is_connected\": true,\n                                    \"connected\": true\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"float_display\",\n                            \"x\": 705,\n                            \"y\": 779,\n                            \"uid\": \"NFMw8xmePJ5Z\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": \"CyGr3wwdbZQm\",\n                            \"dst_nuid\": \"NFMw8xmePJ5Z\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"2PJEFUR5U25W\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"src_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": \"CyGr3wwdbZQm\",\n                            \"dst_nuid\": \"DanRkH7HzZtb\",\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"uid\": \"nQNP4HL8xjfU\",\n                            \"src_connected\": true,\n                            \"dst_connected\": true,\n                            \"src_dyn\": true,\n                            \"dst_dyn\": true\n                        }\n                    ]\n                },\n                \"dyn_in\": [\n                    {\n                        \"name\": \"input\",\n                        \"dt\": 0,\n                        \"index\": 0,\n                        \"uid\": \"Tjpea54nUZuK\",\n                        \"dynamic\": true,\n                        \"type\": 0,\n                        \"is_connected\": true\n                    }\n                ],\n                \"dyn_out\": [\n                    {\n                        \"name\": \"output\",\n                        \"dt\": 0,\n                        \"index\": 0,\n                        \"uid\": \"7qwZKqJEWRGX\",\n                        \"dynamic\": true,\n                        \"type\": 1,\n                        \"is_connected\": true\n                    }\n                ]\n            }\n        ],\n        \"conns\": [\n            {\n                \"src_nuid\": \"CX2xfcJndSpe\",\n                \"dst_nuid\": \"He2pCTSTCSAc\",\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"uid\": \"NrsCKvACx3Bp\",\n                \"src_connected\": true,\n                \"dst_connected\": true,\n                \"dst_dyn\": true\n            },\n            {\n                \"src_nuid\": \"He2pCTSTCSAc\",\n                \"dst_nuid\": \"4ZvhZKgD8Njn\",\n                \"src_slot\": 0,\n                \"dst_slot\": 0,\n                \"uid\": \"NYLY4nHvd5Jq\",\n                \"src_connected\": true,\n                \"dst_connected\": true,\n                \"src_dyn\": true\n            }\n        ]\n    }\n}"
  },
  {
    "path": "test/fixtures/te-2rb.json",
    "content": "{\n    \"abs_t\": 79.087,\n    \"active_graph\": 0,\n    \"graph_uid\": 3,\n    \"root\": {\n        \"node_uid\": 4,\n        \"uid\": 0,\n        \"parent_uid\": -1,\n        \"open\": true,\n        \"nodes\": [\n            {\n                \"plugin\": \"graph\",\n                \"x\": 247,\n                \"y\": 352,\n                \"uid\": 0,\n                \"dsid\": 2,\n                \"state\": {\n                    \"enabled\": true,\n                    \"always_update\": true,\n                    \"rt_width\": 512,\n                    \"rt_height\": 512,\n                    \"rt_filter\": 9729,\n                    \"input_sids\": {},\n                    \"output_sids\": {}\n                },\n                \"title\": \"Background image\",\n                \"graph\": {\n                    \"node_uid\": 33,\n                    \"uid\": 1,\n                    \"parent_uid\": 0,\n                    \"open\": true,\n                    \"nodes\": [\n                        {\n                            \"plugin\": \"mesh_renderer_emitter\",\n                            \"x\": 925,\n                            \"y\": 238,\n                            \"uid\": 0\n                        },\n                        {\n                            \"plugin\": \"quad_mesh_generator\",\n                            \"x\": 721,\n                            \"y\": 181,\n                            \"uid\": 10,\n                            \"open\": false\n                        },\n                        {\n                            \"plugin\": \"from_mesh_shader\",\n                            \"x\": 780,\n                            \"y\": 258,\n                            \"uid\": 15,\n                            \"open\": false\n                        },\n                        {\n                            \"plugin\": \"graph\",\n                            \"x\": 619,\n                            \"y\": 279,\n                            \"uid\": 22,\n                            \"open\": false,\n                            \"dsid\": 20,\n                            \"state\": {\n                                \"enabled\": true,\n                                \"always_update\": true,\n                                \"rt_width\": 512,\n                                \"rt_height\": 512,\n                                \"rt_filter\": 9729,\n                                \"input_sids\": {\n                                    \"15\": 3,\n                                    \"21\": 4,\n                                    \"22\": 5,\n                                    \"23\": 6,\n                                    \"24\": 7,\n                                    \"25\": 8,\n                                    \"39\": 12,\n                                    \"40\": 13,\n                                    \"41\": 14,\n                                    \"44\": 16\n                                },\n                                \"output_sids\": {\n                                    \"9\": 0\n                                }\n                            },\n                            \"title\": \"Material chain\",\n                            \"graph\": {\n                                \"node_uid\": 53,\n                                \"uid\": 2,\n                                \"parent_uid\": 1,\n                                \"open\": true,\n                                \"nodes\": [\n                                    {\n                                        \"plugin\": \"material_diffuse_color_modulator\",\n                                        \"x\": 1054,\n                                        \"y\": 73,\n                                        \"uid\": 1\n                                    },\n                                    {\n                                        \"plugin\": \"material_alpha_clip_modulator\",\n                                        \"x\": 1176,\n                                        \"y\": 73,\n                                        \"uid\": 5\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 1064,\n                                        \"y\": 151,\n                                        \"uid\": 6,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Alpha clip\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_texture_modulator\",\n                                        \"x\": 1288,\n                                        \"y\": 73,\n                                        \"uid\": 7\n                                    },\n                                    {\n                                        \"plugin\": \"output_proxy\",\n                                        \"x\": 1396,\n                                        \"y\": 73,\n                                        \"uid\": 9,\n                                        \"dsid\": 34,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_in\": [\n                                            {\n                                                \"name\": \"input\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect a slot of any type to this plugin, to have the parent slot assume its datatype and forward data from this plugin.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 0,\n                                                \"connected\": true,\n                                                \"is_connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"material_blend_mode_modulator\",\n                                        \"x\": 839,\n                                        \"y\": 73,\n                                        \"uid\": 10\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 1207,\n                                        \"y\": 150,\n                                        \"uid\": 15,\n                                        \"dsid\": 34,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"Image\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 2,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 866,\n                                        \"y\": 279,\n                                        \"uid\": 21,\n                                        \"dsid\": 28,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 803,\n                                        \"y\": 334,\n                                        \"uid\": 22,\n                                        \"dsid\": 28,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 814,\n                                        \"y\": 395,\n                                        \"uid\": 23,\n                                        \"dsid\": 28,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 856,\n                                        \"y\": 457,\n                                        \"uid\": 24,\n                                        \"dsid\": 28,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"alpha\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 739,\n                                        \"y\": 204,\n                                        \"uid\": 25,\n                                        \"dsid\": 28,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"blend mode\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 943,\n                                        \"y\": 296,\n                                        \"uid\": 26\n                                    },\n                                    {\n                                        \"plugin\": \"material_z_buffer_modulator\",\n                                        \"x\": 706,\n                                        \"y\": 72,\n                                        \"uid\": 27\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 573,\n                                        \"y\": 162,\n                                        \"uid\": 28,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Z-buffer\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_double_sided_modulator\",\n                                        \"x\": 432,\n                                        \"y\": 73,\n                                        \"uid\": 35\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 323,\n                                        \"y\": 161,\n                                        \"uid\": 36,\n                                        \"state\": {\n                                            \"enabled\": true\n                                        },\n                                        \"title\": \"Double-sided\"\n                                    },\n                                    {\n                                        \"plugin\": \"material_ambient_color_modulator\",\n                                        \"x\": 290,\n                                        \"y\": 73,\n                                        \"uid\": 37\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 83,\n                                        \"y\": 181,\n                                        \"uid\": 39,\n                                        \"dsid\": 29,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am hue\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 45,\n                                        \"y\": 244,\n                                        \"uid\": 40,\n                                        \"dsid\": 29,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am saturation\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 56,\n                                        \"y\": 305,\n                                        \"uid\": 41,\n                                        \"dsid\": 29,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"am luminosity\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 0,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"convert_hsla_color_modulator\",\n                                        \"x\": 170,\n                                        \"y\": 200,\n                                        \"uid\": 43\n                                    },\n                                    {\n                                        \"plugin\": \"input_proxy\",\n                                        \"x\": 17,\n                                        \"y\": 38,\n                                        \"uid\": 44,\n                                        \"dsid\": 18,\n                                        \"state\": {\n                                            \"slot_id\": 0\n                                        },\n                                        \"title\": \"material\",\n                                        \"dyn_out\": [\n                                            {\n                                                \"name\": \"output\",\n                                                \"dt\": 12,\n                                                \"desc\": \"Connect this to a slot of any type, to have the parent slot assume its datatype and forward data from the parent graph.\",\n                                                \"uid\": 0,\n                                                \"index\": 0,\n                                                \"type\": 1,\n                                                \"connected\": true\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"plugin\": \"toggle_button\",\n                                        \"x\": 584,\n                                        \"y\": 231,\n                                        \"uid\": 50,\n                                        \"state\": {\n                                            \"enabled\": false\n                                        },\n                                        \"title\": \"Depth write\"\n                                    }\n                                ],\n                                \"conns\": [\n                                    {\n                                        \"src_nuid\": 1,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 6,\n                                        \"dst_nuid\": 5,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 5,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 7,\n                                        \"dst_nuid\": 9,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"dst_connected\": true,\n                                        \"dst_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 10,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 15,\n                                        \"dst_nuid\": 7,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 25,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 21,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 22,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 23,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 24,\n                                        \"dst_nuid\": 26,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 3,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 26,\n                                        \"dst_nuid\": 1,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 27,\n                                        \"dst_nuid\": 10,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 28,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 36,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 37,\n                                        \"dst_nuid\": 35,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 39,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 40,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 41,\n                                        \"dst_nuid\": 43,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    },\n                                    {\n                                        \"src_nuid\": 43,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 1\n                                    },\n                                    {\n                                        \"src_nuid\": 50,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 2\n                                    },\n                                    {\n                                        \"src_nuid\": 35,\n                                        \"dst_nuid\": 27,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0\n                                    },\n                                    {\n                                        \"src_nuid\": 44,\n                                        \"dst_nuid\": 37,\n                                        \"src_slot\": 0,\n                                        \"dst_slot\": 0,\n                                        \"src_connected\": true,\n                                        \"src_dyn\": true\n                                    }\n                                ]\n                            },\n                            \"dyn_in\": [\n                                {\n                                    \"name\": \"Image\",\n                                    \"dt\": 2,\n                                    \"uid\": 3,\n                                    \"index\": 0,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 4,\n                                    \"index\": 1,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 5,\n                                    \"index\": 2,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 6,\n                                    \"index\": 3,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"alpha\",\n                                    \"dt\": 0,\n                                    \"uid\": 7,\n                                    \"index\": 4,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"blend mode\",\n                                    \"dt\": 0,\n                                    \"uid\": 8,\n                                    \"index\": 5,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am hue\",\n                                    \"dt\": 0,\n                                    \"uid\": 12,\n                                    \"index\": 6,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am saturation\",\n                                    \"dt\": 0,\n                                    \"uid\": 13,\n                                    \"index\": 7,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"am luminosity\",\n                                    \"dt\": 0,\n                                    \"uid\": 14,\n                                    \"index\": 8,\n                                    \"type\": 0,\n                                    \"is_connected\": true\n                                },\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 16,\n                                    \"index\": 9,\n                                    \"type\": 0,\n                                    \"is_connected\": false\n                                }\n                            ],\n                            \"dyn_out\": [\n                                {\n                                    \"name\": \"material\",\n                                    \"dt\": 12,\n                                    \"uid\": 0,\n                                    \"index\": 0,\n                                    \"type\": 1\n                                }\n                            ]\n                        },\n                        {\n                            \"plugin\": \"url_texture_generator\",\n                            \"x\": 80,\n                            \"y\": 267,\n                            \"uid\": 23,\n                            \"state\": {\n                                \"url\": \"/data/image/55756-scaled.jpg\"\n                            },\n                            \"title\": \"Image\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 221,\n                            \"y\": 269,\n                            \"uid\": 24,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 304,\n                            \"y\": 270,\n                            \"uid\": 25,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Saturation\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 398,\n                            \"y\": 269,\n                            \"uid\": 26,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Luminosity\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 486,\n                            \"y\": 269,\n                            \"uid\": 27,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Alpha\"\n                        },\n                        {\n                            \"plugin\": \"blend_mode_generator\",\n                            \"x\": 101,\n                            \"y\": 345,\n                            \"uid\": 28,\n                            \"state\": {\n                                \"mode\": 4\n                            }\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 290,\n                            \"y\": 347,\n                            \"uid\": 30,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Ambient Hue\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 390,\n                            \"y\": 347,\n                            \"uid\": 31,\n                            \"state\": {\n                                \"val\": 1\n                            },\n                            \"title\": \"Ambient Sat\"\n                        },\n                        {\n                            \"plugin\": \"knob_float_generator\",\n                            \"x\": 486,\n                            \"y\": 346,\n                            \"uid\": 32,\n                            \"state\": {\n                                \"val\": 0\n                            },\n                            \"title\": \"Ambient Lum\"\n                        }\n                    ],\n                    \"conns\": [\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0\n                        },\n                        {\n                            \"src_nuid\": 10,\n                            \"dst_nuid\": 15,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"offset\": 1\n                        },\n                        {\n                            \"src_nuid\": 15,\n                            \"dst_nuid\": 0,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1\n                        },\n                        {\n                            \"src_nuid\": 23,\n                            \"dst_nuid\": 22,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 0,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 24,\n                            \"dst_nuid\": 22,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 25,\n                            \"dst_nuid\": 22,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 2,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 26,\n                            \"dst_nuid\": 22,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 3,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 27,\n                            \"dst_nuid\": 22,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 4,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 28,\n                            \"dst_nuid\": 22,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 5,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 32,\n                            \"dst_nuid\": 22,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 8,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 31,\n                            \"dst_nuid\": 22,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 7,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 30,\n                            \"dst_nuid\": 22,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 6,\n                            \"dst_dyn\": true\n                        },\n                        {\n                            \"src_nuid\": 22,\n                            \"dst_nuid\": 15,\n                            \"src_slot\": 0,\n                            \"dst_slot\": 1,\n                            \"src_dyn\": true\n                        }\n                    ]\n                }\n            },\n            {\n                \"plugin\": \"float_display\",\n                \"x\": 204,\n                \"y\": 239,\n                \"uid\": 1\n            },\n            {\n                \"plugin\": \"bool_display\",\n                \"x\": 278,\n                \"y\": 238,\n                \"uid\": 2\n            },\n            {\n                \"plugin\": \"led_display\",\n                \"x\": 350,\n                \"y\": 237,\n                \"uid\": 3\n            }\n        ],\n        \"conns\": []\n    }\n}"
  },
  {
    "path": "test/fixtures/te-2rb.optimized.json",
    "content": "{\"abs_t\":79.087,\"active_graph\":0,\"graph_uid\":3,\"root\":{\"node_uid\":4,\"uid\":0,\"parent_uid\":-1,\"nodes\":[{\"plugin\":\"graph\",\"uid\":0,\"dsid\":2,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"rt_filter\":9729,\"input_sids\":{},\"output_sids\":{}},\"graph\":{\"node_uid\":33,\"uid\":1,\"parent_uid\":0,\"nodes\":[{\"plugin\":\"mesh_renderer_emitter\",\"uid\":0},{\"plugin\":\"quad_mesh_generator\",\"uid\":10,\"open\":false},{\"plugin\":\"from_mesh_shader\",\"uid\":15,\"open\":false},{\"plugin\":\"graph\",\"uid\":22,\"open\":false,\"dsid\":20,\"state\":{\"enabled\":true,\"always_update\":true,\"rt_width\":512,\"rt_height\":512,\"rt_filter\":9729,\"input_sids\":{\"15\":3,\"21\":4,\"22\":5,\"23\":6,\"24\":7,\"25\":8,\"39\":12,\"40\":13,\"41\":14,\"44\":16},\"output_sids\":{\"9\":0}},\"graph\":{\"node_uid\":53,\"uid\":2,\"parent_uid\":1,\"nodes\":[{\"plugin\":\"material_diffuse_color_modulator\",\"uid\":1},{\"plugin\":\"material_alpha_clip_modulator\",\"uid\":5},{\"plugin\":\"toggle_button\",\"uid\":6,\"state\":{\"enabled\":false}},{\"plugin\":\"material_texture_modulator\",\"uid\":7},{\"plugin\":\"output_proxy\",\"uid\":9,\"dsid\":34,\"state\":{\"slot_id\":0},\"dyn_in\":[{\"name\":\"input\",\"dt\":12,\"uid\":0,\"index\":0}]},{\"plugin\":\"material_blend_mode_modulator\",\"uid\":10},{\"plugin\":\"input_proxy\",\"uid\":15,\"dsid\":34,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"name\":\"output\",\"dt\":2,\"uid\":0,\"index\":0}]},{\"plugin\":\"input_proxy\",\"uid\":21,\"dsid\":28,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0}]},{\"plugin\":\"input_proxy\",\"uid\":22,\"dsid\":28,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0}]},{\"plugin\":\"input_proxy\",\"uid\":23,\"dsid\":28,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0}]},{\"plugin\":\"input_proxy\",\"uid\":24,\"dsid\":28,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0}]},{\"plugin\":\"input_proxy\",\"uid\":25,\"dsid\":28,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0}]},{\"plugin\":\"convert_hsla_color_modulator\",\"uid\":26},{\"plugin\":\"material_z_buffer_modulator\",\"uid\":27},{\"plugin\":\"toggle_button\",\"uid\":28,\"state\":{\"enabled\":false}},{\"plugin\":\"material_double_sided_modulator\",\"uid\":35},{\"plugin\":\"toggle_button\",\"uid\":36,\"state\":{\"enabled\":true}},{\"plugin\":\"material_ambient_color_modulator\",\"uid\":37},{\"plugin\":\"input_proxy\",\"uid\":39,\"dsid\":29,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0}]},{\"plugin\":\"input_proxy\",\"uid\":40,\"dsid\":29,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0}]},{\"plugin\":\"input_proxy\",\"uid\":41,\"dsid\":29,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"name\":\"output\",\"dt\":0,\"uid\":0,\"index\":0}]},{\"plugin\":\"convert_hsla_color_modulator\",\"uid\":43},{\"plugin\":\"input_proxy\",\"uid\":44,\"dsid\":18,\"state\":{\"slot_id\":0},\"dyn_out\":[{\"name\":\"output\",\"dt\":12,\"uid\":0,\"index\":0}]},{\"plugin\":\"toggle_button\",\"uid\":50,\"state\":{\"enabled\":false}}],\"conns\":[{\"src_nuid\":1,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":6,\"dst_nuid\":5,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":5,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":7,\"dst_nuid\":9,\"src_slot\":0,\"dst_slot\":0,\"dst_connected\":true,\"dst_dyn\":true},{\"src_nuid\":10,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":15,\"dst_nuid\":7,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":25,\"dst_nuid\":10,\"src_slot\":0,\"dst_slot\":1,\"src_dyn\":true},{\"src_nuid\":21,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":22,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":23,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":24,\"dst_nuid\":26,\"src_slot\":0,\"dst_slot\":3,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":26,\"dst_nuid\":1,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":27,\"dst_nuid\":10,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":28,\"dst_nuid\":27,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":36,\"dst_nuid\":35,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":37,\"dst_nuid\":35,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":39,\"dst_nuid\":43,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":40,\"dst_nuid\":43,\"src_slot\":0,\"dst_slot\":1,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":41,\"dst_nuid\":43,\"src_slot\":0,\"dst_slot\":2,\"src_connected\":true,\"src_dyn\":true},{\"src_nuid\":43,\"dst_nuid\":37,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":50,\"dst_nuid\":27,\"src_slot\":0,\"dst_slot\":2},{\"src_nuid\":35,\"dst_nuid\":27,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":44,\"dst_nuid\":37,\"src_slot\":0,\"dst_slot\":0,\"src_connected\":true,\"src_dyn\":true}]},\"dyn_in\":[{\"name\":\"Image\",\"dt\":2,\"uid\":3,\"index\":0},{\"name\":\"hue\",\"dt\":0,\"uid\":4,\"index\":1},{\"name\":\"saturation\",\"dt\":0,\"uid\":5,\"index\":2},{\"name\":\"luminosity\",\"dt\":0,\"uid\":6,\"index\":3},{\"name\":\"alpha\",\"dt\":0,\"uid\":7,\"index\":4},{\"name\":\"blend mode\",\"dt\":0,\"uid\":8,\"index\":5},{\"name\":\"am hue\",\"dt\":0,\"uid\":12,\"index\":6},{\"name\":\"am saturation\",\"dt\":0,\"uid\":13,\"index\":7},{\"name\":\"am luminosity\",\"dt\":0,\"uid\":14,\"index\":8},{\"name\":\"material\",\"dt\":12,\"uid\":16,\"index\":9}],\"dyn_out\":[{\"name\":\"material\",\"dt\":12,\"uid\":0,\"index\":0}]},{\"plugin\":\"url_texture_generator\",\"uid\":23,\"state\":{\"url\":\"//localhost:8000/data/image/55756-scaled.jpg\"}},{\"plugin\":\"knob_float_generator\",\"uid\":24,\"state\":{\"val\":0}},{\"plugin\":\"knob_float_generator\",\"uid\":25,\"state\":{\"val\":1}},{\"plugin\":\"knob_float_generator\",\"uid\":26,\"state\":{\"val\":1}},{\"plugin\":\"knob_float_generator\",\"uid\":27,\"state\":{\"val\":1}},{\"plugin\":\"blend_mode_generator\",\"uid\":28,\"state\":{\"mode\":4}},{\"plugin\":\"knob_float_generator\",\"uid\":30,\"state\":{\"val\":1}},{\"plugin\":\"knob_float_generator\",\"uid\":31,\"state\":{\"val\":1}},{\"plugin\":\"knob_float_generator\",\"uid\":32,\"state\":{\"val\":0}}],\"conns\":[{\"src_nuid\":10,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":10,\"dst_nuid\":15,\"src_slot\":0,\"dst_slot\":0},{\"src_nuid\":15,\"dst_nuid\":0,\"src_slot\":0,\"dst_slot\":1},{\"src_nuid\":23,\"dst_nuid\":22,\"src_slot\":0,\"dst_slot\":0,\"dst_dyn\":true},{\"src_nuid\":24,\"dst_nuid\":22,\"src_slot\":0,\"dst_slot\":1,\"dst_dyn\":true},{\"src_nuid\":25,\"dst_nuid\":22,\"src_slot\":0,\"dst_slot\":2,\"dst_dyn\":true},{\"src_nuid\":26,\"dst_nuid\":22,\"src_slot\":0,\"dst_slot\":3,\"dst_dyn\":true},{\"src_nuid\":27,\"dst_nuid\":22,\"src_slot\":0,\"dst_slot\":4,\"dst_dyn\":true},{\"src_nuid\":28,\"dst_nuid\":22,\"src_slot\":0,\"dst_slot\":5,\"dst_dyn\":true},{\"src_nuid\":32,\"dst_nuid\":22,\"src_slot\":0,\"dst_slot\":8,\"dst_dyn\":true},{\"src_nuid\":31,\"dst_nuid\":22,\"src_slot\":0,\"dst_slot\":7,\"dst_dyn\":true},{\"src_nuid\":30,\"dst_nuid\":22,\"src_slot\":0,\"dst_slot\":6,\"dst_dyn\":true},{\"src_nuid\":22,\"dst_nuid\":15,\"src_slot\":0,\"dst_slot\":1,\"src_dyn\":true}]}}],\"conns\":[]}}\n"
  },
  {
    "path": "test/fixtures/teapot-claraio.json",
    "content": "{\"metadata\":{\"version\":4.3,\"type\":\"Object\",\"generator\":\"ObjectExporter\"},\"geometries\":[{\"uuid\":\"15930b1c-1b50-4926-a0ac-df433b9c4f96\",\"type\":\"Geometry\",\"data\":{\"vertices\":[0.699999988079071,1.2000000476837158,0,0.6456999778747559,1.2000000476837158,0.27469998598098755,0.6366999745368958,1.236899971961975,0.27090001106262207,0.6901999711990356,1.236899971961975,0,0.6471999883651733,1.2491999864578247,0.2754000127315521,0.7016000151634216,1.2491999864578247,0,0.6685000061988831,1.236899971961975,0.28439998626708984,0.7246000170707703,1.236899971961975,0,0.6919000148773193,1.2000000476837158,0.29440000653266907,0.75,1.2000000476837158,0,0.4970000088214874,1.2000000476837158,0.4970000088214874,0.4900999963283539,1.236899971961975,0.4900999963283539,0.49810001254081726,1.2491999864578247,0.49810001254081726,0.5145000219345093,1.236899971961975,0.5145000219345093,0.5325000286102295,1.2000000476837158,0.5325000286102295,0.27469998598098755,1.2000000476837158,0.6456999778747559,0.27090001106262207,1.236899971961975,0.6366999745368958,0.2754000127315521,1.2491999864578247,0.6471999883651733,0.28439998626708984,1.236899971961975,0.6685000061988831,0.29440000653266907,1.2000000476837158,0.6919000148773193,0,1.2000000476837158,0.699999988079071,0,1.236899971961975,0.6901999711990356,0,1.2491999864578247,0.7016000151634216,0,1.236899971961975,0.7246000170707703,0,1.2000000476837158,0.75,-0.2937000095844269,1.2000000476837158,0.6456999778747559,-0.27889999747276306,1.236899971961975,0.6366999745368958,-0.2777000069618225,1.2491999864578247,0.6471999883651733,-0.2847000062465668,1.236899971961975,0.6685000061988831,-0.29440000653266907,1.2000000476837158,0.6919000148773193,-0.5138999819755554,1.2000000476837158,0.4970000088214874,-0.49720001220703125,1.236899971961975,0.4900999963283539,-0.5001999735832214,1.2491999864578247,0.49810001254081726,-0.5146999955177307,1.236899971961975,0.5145000219345093,-0.5325000286102295,1.2000000476837158,0.5325000286102295,-0.6521000266075134,1.2000000476837158,0.27469998598098755,-0.6394000053405762,1.236899971961975,0.27090001106262207,-0.6480000019073486,1.2491999864578247,0.2754000127315521,-0.6686000227928162,1.236899971961975,0.28439998626708984,-0.6919000148773193,1.2000000476837158,0.29440000653266907,-0.699999988079071,1.2000000476837158,0,-0.6901999711990356,1.236899971961975,0,-0.7016000151634216,1.2491999864578247,0,-0.7246000170707703,1.236899971961975,0,-0.75,1.2000000476837158,0,-0.6456999778747559,1.2000000476837158,-0.27469998598098755,-0.6366999745368958,1.236899971961975,-0.27090001106262207,-0.6471999883651733,1.2491999864578247,-0.2754000127315521,-0.6685000061988831,1.236899971961975,-0.28439998626708984,-0.6919000148773193,1.2000000476837158,-0.29440000653266907,-0.4970000088214874,1.2000000476837158,-0.4970000088214874,-0.4900999963283539,1.236899971961975,-0.4900999963283539,-0.49810001254081726,1.2491999864578247,-0.49810001254081726,-0.5145000219345093,1.236899971961975,-0.5145000219345093,-0.5325000286102295,1.2000000476837158,-0.5325000286102295,-0.27469998598098755,1.2000000476837158,-0.6456999778747559,-0.27090001106262207,1.236899971961975,-0.6366999745368958,-0.2754000127315521,1.2491999864578247,-0.6471999883651733,-0.28439998626708984,1.236899971961975,-0.6685000061988831,-0.29440000653266907,1.2000000476837158,-0.6919000148773193,0,1.2000000476837158,-0.699999988079071,0,1.236899971961975,-0.6901999711990356,0,1.2491999864578247,-0.7016000151634216,0,1.236899971961975,-0.7246000170707703,0,1.2000000476837158,-0.75,0.27469998598098755,1.2000000476837158,-0.6456999778747559,0.27090001106262207,1.236899971961975,-0.6366999745368958,0.2754000127315521,1.2491999864578247,-0.6471999883651733,0.28439998626708984,1.236899971961975,-0.6685000061988831,0.29440000653266907,1.2000000476837158,-0.6919000148773193,0.4970000088214874,1.2000000476837158,-0.4970000088214874,0.4900999963283539,1.236899971961975,-0.4900999963283539,0.49810001254081726,1.2491999864578247,-0.49810001254081726,0.5145000219345093,1.236899971961975,-0.5145000219345093,0.5325000286102295,1.2000000476837158,-0.5325000286102295,0.6456999778747559,1.2000000476837158,-0.27469998598098755,0.6366999745368958,1.236899971961975,-0.27090001106262207,0.6471999883651733,1.2491999864578247,-0.2754000127315521,0.6685000061988831,1.236899971961975,-0.28439998626708984,0.6919000148773193,1.2000000476837158,-0.29440000653266907,0.7766000032424927,1.0037000179290771,0.3303999900817871,0.8417999744415283,1.0037000179290771,0,0.8503999710083008,0.8108999729156494,0.3617999851703644,0.9218999743461609,0.8108999729156494,0,0.9027000069618225,0.6251999735832214,0.3840999901294708,0.9785000085830688,0.6251999735832214,0,0.9225000143051147,0.44999998807907104,0.39250001311302185,1,0.44999998807907104,0,0.5976999998092651,1.0037000179290771,0.5976999998092651,0.6545000076293945,0.8108999729156494,0.6545000076293945,0.6947000026702881,0.6251999735832214,0.6947000026702881,0.7099999785423279,0.44999998807907104,0.7099999785423279,0.3303999900817871,1.0037000179290771,0.7766000032424927,0.3617999851703644,0.8108999729156494,0.8503999710083008,0.3840999901294708,0.6251999735832214,0.9027000069618225,0.39250001311302185,0.44999998807907104,0.9225000143051147,0,1.0037000179290771,0.8417999744415283,0,0.8108999729156494,0.9218999743461609,0,0.6251999735832214,0.9785000085830688,0,0.44999998807907104,1,-0.3303999900817871,1.0037000179290771,0.7766000032424927,-0.3617999851703644,0.8108999729156494,0.8503999710083008,-0.3840999901294708,0.6251999735832214,0.9027000069618225,-0.39250001311302185,0.44999998807907104,0.9225000143051147,-0.5976999998092651,1.0037000179290771,0.5976999998092651,-0.6545000076293945,0.8108999729156494,0.6545000076293945,-0.6947000026702881,0.6251999735832214,0.6947000026702881,-0.7099999785423279,0.44999998807907104,0.7099999785423279,-0.7766000032424927,1.0037000179290771,0.3303999900817871,-0.8503999710083008,0.8108999729156494,0.3617999851703644,-0.9027000069618225,0.6251999735832214,0.3840999901294708,-0.9225000143051147,0.44999998807907104,0.39250001311302185,-0.8417999744415283,1.0037000179290771,0,-0.9218999743461609,0.8108999729156494,0,-0.9785000085830688,0.6251999735832214,0,-1,0.44999998807907104,0,-0.7766000032424927,1.0037000179290771,-0.3303999900817871,-0.8503999710083008,0.8108999729156494,-0.3617999851703644,-0.9027000069618225,0.6251999735832214,-0.3840999901294708,-0.9225000143051147,0.44999998807907104,-0.39250001311302185,-0.5976999998092651,1.0037000179290771,-0.5976999998092651,-0.6545000076293945,0.8108999729156494,-0.6545000076293945,-0.6947000026702881,0.6251999735832214,-0.6947000026702881,-0.7099999785423279,0.44999998807907104,-0.7099999785423279,-0.3303999900817871,1.0037000179290771,-0.7766000032424927,-0.3617999851703644,0.8108999729156494,-0.8503999710083008,-0.3840999901294708,0.6251999735832214,-0.9027000069618225,-0.39250001311302185,0.44999998807907104,-0.9225000143051147,0,1.0037000179290771,-0.8417999744415283,0,0.8108999729156494,-0.9218999743461609,0,0.6251999735832214,-0.9785000085830688,0,0.44999998807907104,-1,0.3303999900817871,1.0037000179290771,-0.7766000032424927,0.3617999851703644,0.8108999729156494,-0.8503999710083008,0.3840999901294708,0.6251999735832214,-0.9027000069618225,0.39250001311302185,0.44999998807907104,-0.9225000143051147,0.5976999998092651,1.0037000179290771,-0.5976999998092651,0.6545000076293945,0.8108999729156494,-0.6545000076293945,0.6947000026702881,0.6251999735832214,-0.6947000026702881,0.7099999785423279,0.44999998807907104,-0.7099999785423279,0.7766000032424927,1.0037000179290771,-0.3303999900817871,0.8503999710083008,0.8108999729156494,-0.3617999851703644,0.9027000069618225,0.6251999735832214,-0.3840999901294708,0.9225000143051147,0.44999998807907104,-0.39250001311302185,0.8865000009536743,0.301800012588501,0.37720000743865967,0.9609000086784363,0.301800012588501,0,0.807200014591217,0.19220000505447388,0.3434000015258789,0.875,0.19220000505447388,0,0.7279000282287598,0.11779999732971191,0.30970001220703125,0.7890999913215637,0.11779999732971191,0,0.6919000148773193,0.07500000298023224,0.29440000653266907,0.75,0.07500000298023224,0,0.6822999715805054,0.301800012588501,0.6822999715805054,0.6212999820709229,0.19220000505447388,0.6212999820709229,0.5601999759674072,0.11779999732971191,0.5601999759674072,0.5325000286102295,0.07500000298023224,0.5325000286102295,0.37720000743865967,0.301800012588501,0.8865000009536743,0.3434000015258789,0.19220000505447388,0.807200014591217,0.30970001220703125,0.11779999732971191,0.7279000282287598,0.29440000653266907,0.07500000298023224,0.6919000148773193,0,0.301800012588501,0.9609000086784363,0,0.19220000505447388,0.875,0,0.11779999732971191,0.7890999913215637,0,0.07500000298023224,0.75,-0.37720000743865967,0.301800012588501,0.8865000009536743,-0.3434000015258789,0.19220000505447388,0.807200014591217,-0.30970001220703125,0.11779999732971191,0.7279000282287598,-0.29440000653266907,0.07500000298023224,0.6919000148773193,-0.6822999715805054,0.301800012588501,0.6822999715805054,-0.6212999820709229,0.19220000505447388,0.6212999820709229,-0.5601999759674072,0.11779999732971191,0.5601999759674072,-0.5325000286102295,0.07500000298023224,0.5325000286102295,-0.8865000009536743,0.301800012588501,0.37720000743865967,-0.807200014591217,0.19220000505447388,0.3434000015258789,-0.7279000282287598,0.11779999732971191,0.30970001220703125,-0.6919000148773193,0.07500000298023224,0.29440000653266907,-0.9609000086784363,0.301800012588501,0,-0.875,0.19220000505447388,0,-0.7890999913215637,0.11779999732971191,0,-0.75,0.07500000298023224,0,-0.8865000009536743,0.301800012588501,-0.37720000743865967,-0.807200014591217,0.19220000505447388,-0.3434000015258789,-0.7279000282287598,0.11779999732971191,-0.30970001220703125,-0.6919000148773193,0.07500000298023224,-0.29440000653266907,-0.6822999715805054,0.301800012588501,-0.6822999715805054,-0.6212999820709229,0.19220000505447388,-0.6212999820709229,-0.5601999759674072,0.11779999732971191,-0.5601999759674072,-0.5325000286102295,0.07500000298023224,-0.5325000286102295,-0.37720000743865967,0.301800012588501,-0.8865000009536743,-0.3434000015258789,0.19220000505447388,-0.807200014591217,-0.30970001220703125,0.11779999732971191,-0.7279000282287598,-0.29440000653266907,0.07500000298023224,-0.6919000148773193,0,0.301800012588501,-0.9609000086784363,0,0.19220000505447388,-0.875,0,0.11779999732971191,-0.7890999913215637,0,0.07500000298023224,-0.75,0.37720000743865967,0.301800012588501,-0.8865000009536743,0.3434000015258789,0.19220000505447388,-0.807200014591217,0.30970001220703125,0.11779999732971191,-0.7279000282287598,0.29440000653266907,0.07500000298023224,-0.6919000148773193,0.6822999715805054,0.301800012588501,-0.6822999715805054,0.6212999820709229,0.19220000505447388,-0.6212999820709229,0.5601999759674072,0.11779999732971191,-0.5601999759674072,0.5325000286102295,0.07500000298023224,-0.5325000286102295,0.8865000009536743,0.301800012588501,-0.37720000743865967,0.807200014591217,0.19220000505447388,-0.3434000015258789,0.7279000282287598,0.11779999732971191,-0.30970001220703125,0.6919000148773193,0.07500000298023224,-0.29440000653266907,0.6761999726295471,0.04749999940395355,0.28769999742507935,0.7329999804496765,0.04749999940395355,0,0.5924000144004822,0.023399999365210533,0.25209999084472656,0.6421999931335449,0.023399999365210533,0,0.3853999972343445,0.006399999838322401,0.164000004529953,0.41780000925064087,0.006399999838322401,0,0,0,0,0.5203999876976013,0.04749999940395355,0.5203999876976013,0.4560000002384186,0.023399999365210533,0.4560000002384186,0.29660001397132874,0.006399999838322401,0.29660001397132874,0.28769999742507935,0.04749999940395355,0.6761999726295471,0.25209999084472656,0.023399999365210533,0.5924000144004822,0.164000004529953,0.006399999838322401,0.3853999972343445,0,0.04749999940395355,0.7329999804496765,0,0.023399999365210533,0.6421999931335449,0,0.006399999838322401,0.41780000925064087,-0.28769999742507935,0.04749999940395355,0.6761999726295471,-0.25209999084472656,0.023399999365210533,0.5924000144004822,-0.164000004529953,0.006399999838322401,0.3853999972343445,-0.5203999876976013,0.04749999940395355,0.5203999876976013,-0.4560000002384186,0.023399999365210533,0.4560000002384186,-0.29660001397132874,0.006399999838322401,0.29660001397132874,-0.6761999726295471,0.04749999940395355,0.28769999742507935,-0.5924000144004822,0.023399999365210533,0.25209999084472656,-0.3853999972343445,0.006399999838322401,0.164000004529953,-0.7329999804496765,0.04749999940395355,0,-0.6421999931335449,0.023399999365210533,0,-0.41780000925064087,0.006399999838322401,0,-0.6761999726295471,0.04749999940395355,-0.28769999742507935,-0.5924000144004822,0.023399999365210533,-0.25209999084472656,-0.3853999972343445,0.006399999838322401,-0.164000004529953,-0.5203999876976013,0.04749999940395355,-0.5203999876976013,-0.4560000002384186,0.023399999365210533,-0.4560000002384186,-0.29660001397132874,0.006399999838322401,-0.29660001397132874,-0.28769999742507935,0.04749999940395355,-0.6761999726295471,-0.25209999084472656,0.023399999365210533,-0.5924000144004822,-0.164000004529953,0.006399999838322401,-0.3853999972343445,0,0.04749999940395355,-0.7329999804496765,0,0.023399999365210533,-0.6421999931335449,0,0.006399999838322401,-0.41780000925064087,0.28769999742507935,0.04749999940395355,-0.6761999726295471,0.25209999084472656,0.023399999365210533,-0.5924000144004822,0.164000004529953,0.006399999838322401,-0.3853999972343445,0.5203999876976013,0.04749999940395355,-0.5203999876976013,0.4560000002384186,0.023399999365210533,-0.4560000002384186,0.29660001397132874,0.006399999838322401,-0.29660001397132874,0.6761999726295471,0.04749999940395355,-0.28769999742507935,0.5924000144004822,0.023399999365210533,-0.25209999084472656,0.3853999972343445,0.006399999838322401,-0.164000004529953,-0.800000011920929,1.0125000476837158,0,-0.7922000288963318,1.0300999879837036,0.0843999981880188,-1.0405999422073364,1.027999997138977,0.0843999981880188,-1.0335999727249146,1.010699987411499,0,-1.2229000329971313,1.013800024986267,0.0843999981880188,-1.2063000202178955,0.9983999729156494,0,-1.3351000547409058,0.9751999974250793,0.0843999981880188,-1.3133000135421753,0.9649999737739563,0,-1.3733999729156494,0.8999999761581421,0.0843999981880188,-1.350000023841858,0.8999999761581421,0,-0.7749999761581421,1.0687999725341797,0.11249999701976776,-1.055899977684021,1.066100001335144,0.11249999701976776,-1.2594000101089478,1.047700047492981,0.11249999701976776,-1.3832000494003296,0.9976000189781189,0.11249999701976776,-1.4249999523162842,0.8999999761581421,0.11249999701976776,-0.7577999830245972,1.1073999404907227,0.0843999981880188,-1.0712000131607056,1.104200005531311,0.0843999981880188,-1.2958999872207642,1.0815000534057617,0.0843999981880188,-1.4313000440597534,1.0198999643325806,0.0843999981880188,-1.4766000509262085,0.8999999761581421,0.0843999981880188,-0.75,1.125,0,-1.0780999660491943,1.121500015258789,0,-1.3125,1.0968999862670898,0,-1.4530999660491943,1.0300999879837036,0,-1.5,0.8999999761581421,0,-0.7577999830245972,1.1073999404907227,-0.0843999981880188,-1.0712000131607056,1.104200005531311,-0.0843999981880188,-1.2958999872207642,1.0815000534057617,-0.0843999981880188,-1.4313000440597534,1.0198999643325806,-0.0843999981880188,-1.4766000509262085,0.8999999761581421,-0.0843999981880188,-0.7749999761581421,1.0687999725341797,-0.11249999701976776,-1.055899977684021,1.066100001335144,-0.11249999701976776,-1.2594000101089478,1.047700047492981,-0.11249999701976776,-1.3832000494003296,0.9976000189781189,-0.11249999701976776,-1.4249999523162842,0.8999999761581421,-0.11249999701976776,-0.7922000288963318,1.0300999879837036,-0.0843999981880188,-1.0405999422073364,1.027999997138977,-0.0843999981880188,-1.2229000329971313,1.013800024986267,-0.0843999981880188,-1.3351000547409058,0.9751999974250793,-0.0843999981880188,-1.3733999729156494,0.8999999761581421,-0.0843999981880188,-1.3517999649047852,0.7882000207901001,0.0843999981880188,-1.3305000066757202,0.7979999780654907,0,-1.2839000225067139,0.6600000262260437,0.0843999981880188,-1.2687000036239624,0.675000011920929,0,-1.1655000448226929,0.5333999991416931,0.0843999981880188,-1.1601999998092651,0.5519999861717224,0,-0.9922000169754028,0.42660000920295715,0.0843999981880188,-1.3985999822616577,0.7666000127792358,0.11249999701976776,-1.317199945449829,0.6269999742507935,0.11249999701976776,-1.1770999431610107,0.4925999939441681,0.11249999701976776,-0.9750000238418579,0.375,0.11249999701976776,-1.4455000162124634,0.7448999881744385,0.0843999981880188,-1.3504999876022339,0.5939000248908997,0.0843999981880188,-1.1887999773025513,0.45179998874664307,0.0843999981880188,-0.9577999711036682,0.32339999079704285,0.0843999981880188,-1.4667999744415283,0.7350999712944031,0,-1.3655999898910522,0.5788999795913696,0,-1.194100022315979,0.4332999885082245,0,-0.949999988079071,0.30000001192092896,0,-1.4455000162124634,0.7448999881744385,-0.0843999981880188,-1.3504999876022339,0.5939000248908997,-0.0843999981880188,-1.1887999773025513,0.45179998874664307,-0.0843999981880188,-0.9577999711036682,0.32339999079704285,-0.0843999981880188,-1.3985999822616577,0.7666000127792358,-0.11249999701976776,-1.317199945449829,0.6269999742507935,-0.11249999701976776,-1.1770999431610107,0.4925999939441681,-0.11249999701976776,-0.9750000238418579,0.375,-0.11249999701976776,-1.3517999649047852,0.7882000207901001,-0.0843999981880188,-1.2839000225067139,0.6600000262260437,-0.0843999981880188,-1.1655000448226929,0.5333999991416931,-0.0843999981880188,-0.9922000169754028,0.42660000920295715,-0.0843999981880188,0.8500000238418579,0.7124999761581421,0,0.8500000238418579,0.6480000019073486,0.18559999763965607,1.108199954032898,0.7197999954223633,0.16760000586509705,1.0898000001907349,0.7675999999046326,0,1.2172000408172607,0.8722000122070312,0.12800000607967377,1.1937999725341797,0.8999999761581421,0,1.2792999744415283,1.0505000352859497,0.08829999715089798,1.2508000135421753,1.0605000257492065,0,1.3969000577926636,1.2000000476837158,0.07029999792575836,1.350000023841858,1.2000000476837158,0,0.8500000238418579,0.5062999725341797,0.2475000023841858,1.1483999490737915,0.6146000027656555,0.22349999845027924,1.2687000036239624,0.8108999729156494,0.17059999704360962,1.3422000408172607,1.0283000469207764,0.11779999732971191,1.5,1.2000000476837158,0.09380000084638596,0.8500000238418579,0.3644999861717224,0.18559999763965607,1.1886999607086182,0.5095000267028809,0.16760000586509705,1.3202999830245972,0.7497000098228455,0.12800000607967377,1.4049999713897705,1.0061999559402466,0.08829999715089798,1.6030999422073364,1.2000000476837158,0.07029999792575836,0.8500000238418579,0.30000001192092896,0,1.2070000171661377,0.4616999924182892,0,1.3437000513076782,0.7218999862670898,0,1.4335999488830566,0.9961000084877014,0,1.649999976158142,1.2000000476837158,0,0.8500000238418579,0.3644999861717224,-0.18559999763965607,1.1886999607086182,0.5095000267028809,-0.16760000586509705,1.3202999830245972,0.7497000098228455,-0.12800000607967377,1.4049999713897705,1.0061999559402466,-0.08829999715089798,1.6030999422073364,1.2000000476837158,-0.07029999792575836,0.8500000238418579,0.5062000155448914,-0.2475000023841858,1.1483999490737915,0.6146000027656555,-0.22349999845027924,1.2687000036239624,0.8108999729156494,-0.17059999704360962,1.3422000408172607,1.0283000469207764,-0.11779999732971191,1.5,1.2000000476837158,-0.09380000084638596,0.8500000238418579,0.6480000019073486,-0.18559999763965607,1.108199954032898,0.7197999954223633,-0.16760000586509705,1.2172000408172607,0.8722000122070312,-0.12800000607967377,1.2792999744415283,1.0505000352859497,-0.08829999715089798,1.3969000577926636,1.2000000476837158,-0.07029999792575836,1.4361000061035156,1.222100019454956,0.06589999794960022,1.3859000205993652,1.2210999727249146,0,1.4595999717712402,1.2297999858856201,0.056299999356269836,1.412500023841858,1.2280999422073364,0,1.4602999687194824,1.222499966621399,0.04659999907016754,1.420300006866455,1.2210999727249146,0,1.4312000274658203,1.2000000476837158,0.0421999990940094,1.399999976158142,1.2000000476837158,0,1.5465999841690063,1.2244000434875488,0.08789999783039093,1.5633000135421753,1.2333999872207642,0.07500000298023224,1.54830002784729,1.2257000207901,0.06210000067949295,1.5,1.2000000476837158,0.056299999356269836,1.656999945640564,1.226699948310852,0.06589999794960022,1.6669000387191772,1.2369999885559082,0.056299999356269836,1.6363999843597412,1.2288999557495117,0.04659999907016754,1.5687999725341797,1.2000000476837158,0.0421999990940094,1.707200050354004,1.2276999950408936,0,1.7141000032424927,1.238700032234192,0,1.6763999462127686,1.230299949645996,0,1.600000023841858,1.2000000476837158,0,1.656999945640564,1.226699948310852,-0.06589999794960022,1.6669000387191772,1.2369999885559082,-0.056299999356269836,1.6363999843597412,1.2288999557495117,-0.04659999907016754,1.5687999725341797,1.2000000476837158,-0.0421999990940094,1.5465999841690063,1.2244000434875488,-0.08789999783039093,1.5633000135421753,1.2333999872207642,-0.07500000298023224,1.54830002784729,1.2257000207901,-0.06210000067949295,1.5,1.2000000476837158,-0.056299999356269836,1.4361000061035156,1.222100019454956,-0.06589999794960022,1.4595999717712402,1.2297999858856201,-0.056299999356269836,1.4602999687194824,1.222499966621399,-0.04659999907016754,1.4312000274658203,1.2000000476837158,-0.0421999990940094,0.15719999372959137,1.5504000186920166,0.06700000166893005,0.17030000686645508,1.5504000186920166,0,0,1.5750000476837158,0,0.15000000596046448,1.4905999898910522,0.06390000134706497,0.16249999403953552,1.4905999898910522,0,0.09080000221729279,1.4168000221252441,0.03869999945163727,0.09839999675750732,1.4168000221252441,0,0.09229999780654907,1.350000023841858,0.03929999843239784,0.10000000149011612,1.350000023841858,0,0.12110000103712082,1.5504000186920166,0.12110000103712082,0.11550000309944153,1.4905999898910522,0.11550000309944153,0.06989999860525131,1.4168000221252441,0.06989999860525131,0.07100000232458115,1.350000023841858,0.07100000232458115,0.06700000166893005,1.5504000186920166,0.15719999372959137,0.06390000134706497,1.4905999898910522,0.15000000596046448,0.03869999945163727,1.4168000221252441,0.09080000221729279,0.03929999843239784,1.350000023841858,0.09229999780654907,0,1.5504000186920166,0.17030000686645508,0,1.4905999898910522,0.16249999403953552,0,1.4168000221252441,0.09839999675750732,0,1.350000023841858,0.10000000149011612,-0.06700000166893005,1.5504000186920166,0.15719999372959137,-0.06390000134706497,1.4905999898910522,0.15000000596046448,-0.03869999945163727,1.4168000221252441,0.09080000221729279,-0.03929999843239784,1.350000023841858,0.09229999780654907,-0.12110000103712082,1.5504000186920166,0.12110000103712082,-0.11550000309944153,1.4905999898910522,0.11550000309944153,-0.06989999860525131,1.4168000221252441,0.06989999860525131,-0.07100000232458115,1.350000023841858,0.07100000232458115,-0.15719999372959137,1.5504000186920166,0.06700000166893005,-0.15000000596046448,1.4905999898910522,0.06390000134706497,-0.09080000221729279,1.4168000221252441,0.03869999945163727,-0.09229999780654907,1.350000023841858,0.03929999843239784,-0.17030000686645508,1.5504000186920166,0,-0.16249999403953552,1.4905999898910522,0,-0.09839999675750732,1.4168000221252441,0,-0.10000000149011612,1.350000023841858,0,-0.15719999372959137,1.5504000186920166,-0.06700000166893005,-0.15000000596046448,1.4905999898910522,-0.06390000134706497,-0.09080000221729279,1.4168000221252441,-0.03869999945163727,-0.09229999780654907,1.350000023841858,-0.03929999843239784,-0.12110000103712082,1.5504000186920166,-0.12110000103712082,-0.11550000309944153,1.4905999898910522,-0.11550000309944153,-0.06989999860525131,1.4168000221252441,-0.06989999860525131,-0.07100000232458115,1.350000023841858,-0.07100000232458115,-0.06700000166893005,1.5504000186920166,-0.15719999372959137,-0.06390000134706497,1.4905999898910522,-0.15000000596046448,-0.03869999945163727,1.4168000221252441,-0.09080000221729279,-0.03929999843239784,1.350000023841858,-0.09229999780654907,0,1.5504000186920166,-0.17030000686645508,0,1.4905999898910522,-0.16249999403953552,0,1.4168000221252441,-0.09839999675750732,0,1.350000023841858,-0.10000000149011612,0.06700000166893005,1.5504000186920166,-0.15719999372959137,0.06390000134706497,1.4905999898910522,-0.15000000596046448,0.03869999945163727,1.4168000221252441,-0.09080000221729279,0.03929999843239784,1.350000023841858,-0.09229999780654907,0.12110000103712082,1.5504000186920166,-0.12110000103712082,0.11550000309944153,1.4905999898910522,-0.11550000309944153,0.06989999860525131,1.4168000221252441,-0.06989999860525131,0.07100000232458115,1.350000023841858,-0.07100000232458115,0.15719999372959137,1.5504000186920166,-0.06700000166893005,0.15000000596046448,1.4905999898910522,-0.06390000134706497,0.09080000221729279,1.4168000221252441,-0.03869999945163727,0.09229999780654907,1.350000023841858,-0.03929999843239784,0.21040000021457672,1.3055000305175781,0.08950000256299973,0.2281000018119812,1.3055000305175781,0,0.3804999887943268,1.274999976158142,0.16189999878406525,0.4124999940395355,1.274999976158142,0,0.53329998254776,1.2445000410079956,0.22689999639987946,0.5781000256538391,1.2445000410079956,0,0.5996000170707703,1.2000000476837158,0.2551000118255615,0.6499999761581421,1.2000000476837158,0,0.16200000047683716,1.3055000305175781,0.16200000047683716,0.2928999960422516,1.274999976158142,0.2928999960422516,0.4104999899864197,1.2445000410079956,0.4104999899864197,0.46149998903274536,1.2000000476837158,0.46149998903274536,0.08950000256299973,1.3055000305175781,0.21040000021457672,0.16189999878406525,1.274999976158142,0.3804999887943268,0.22689999639987946,1.2445000410079956,0.53329998254776,0.2551000118255615,1.2000000476837158,0.5996000170707703,0,1.3055000305175781,0.2281000018119812,0,1.274999976158142,0.4124999940395355,0,1.2445000410079956,0.5781000256538391,0,1.2000000476837158,0.6499999761581421,-0.08950000256299973,1.3055000305175781,0.21040000021457672,-0.16189999878406525,1.274999976158142,0.3804999887943268,-0.22689999639987946,1.2445000410079956,0.53329998254776,-0.2551000118255615,1.2000000476837158,0.5996000170707703,-0.16200000047683716,1.3055000305175781,0.16200000047683716,-0.2928999960422516,1.274999976158142,0.2928999960422516,-0.4104999899864197,1.2445000410079956,0.4104999899864197,-0.46149998903274536,1.2000000476837158,0.46149998903274536,-0.21040000021457672,1.3055000305175781,0.08950000256299973,-0.3804999887943268,1.274999976158142,0.16189999878406525,-0.53329998254776,1.2445000410079956,0.22689999639987946,-0.5996000170707703,1.2000000476837158,0.2551000118255615,-0.2281000018119812,1.3055000305175781,0,-0.4124999940395355,1.274999976158142,0,-0.5781000256538391,1.2445000410079956,0,-0.6499999761581421,1.2000000476837158,0,-0.21040000021457672,1.3055000305175781,-0.08950000256299973,-0.3804999887943268,1.274999976158142,-0.16189999878406525,-0.53329998254776,1.2445000410079956,-0.22689999639987946,-0.5996000170707703,1.2000000476837158,-0.2551000118255615,-0.16200000047683716,1.3055000305175781,-0.16200000047683716,-0.2928999960422516,1.274999976158142,-0.2928999960422516,-0.4104999899864197,1.2445000410079956,-0.4104999899864197,-0.46149998903274536,1.2000000476837158,-0.46149998903274536,-0.08950000256299973,1.3055000305175781,-0.21040000021457672,-0.16189999878406525,1.274999976158142,-0.3804999887943268,-0.22689999639987946,1.2445000410079956,-0.53329998254776,-0.2551000118255615,1.2000000476837158,-0.5996000170707703,0,1.3055000305175781,-0.2281000018119812,0,1.274999976158142,-0.4124999940395355,0,1.2445000410079956,-0.5781000256538391,0,1.2000000476837158,-0.6499999761581421,0.08950000256299973,1.3055000305175781,-0.21040000021457672,0.16189999878406525,1.274999976158142,-0.3804999887943268,0.22689999639987946,1.2445000410079956,-0.53329998254776,0.2551000118255615,1.2000000476837158,-0.5996000170707703,0.16200000047683716,1.3055000305175781,-0.16200000047683716,0.2928999960422516,1.274999976158142,-0.2928999960422516,0.4104999899864197,1.2445000410079956,-0.4104999899864197,0.46149998903274536,1.2000000476837158,-0.46149998903274536,0.21040000021457672,1.3055000305175781,-0.08950000256299973,0.3804999887943268,1.274999976158142,-0.16189999878406525,0.53329998254776,1.2445000410079956,-0.22689999639987946,0.5996000170707703,1.2000000476837158,-0.2551000118255615],\"normals\":[-0.9494920694323845,-0.2515364269786189,-0.1876012686200115,-0.96670001745224,-0.2558000087738037,0,-0.8930000066757202,-0.2563000023365021,-0.3698999881744385,-0.8934000134468079,0.25600001215934753,-0.36910000443458557,-0.9667999744415283,0.25540000200271606,0,-0.7260149722024023,0.6725622315424132,-0.14339562350586094,-0.08389999717473984,0.9958000183105469,-0.03550000116229057,-0.09210000187158585,0.9958000183105469,0,0.46895168053340897,0.8783596159888912,0.09256730699733487,0.6297000050544739,0.7318999767303467,0.2603999972343445,0.6819999814033508,0.7312999963760376,0,0.8131828855771891,0.5594560236122703,0.16044485734451933,0.8036999702453613,0.4934000074863434,0.3325999975204468,0.8702999949455261,0.4925000071525574,0,-0.8045241032084407,-0.25135180073328567,-0.5381108060843871,-0.6833999752998352,-0.2567000091075897,-0.6833999752998352,-0.6834999918937683,0.25609999895095825,-0.6834999918937683,-0.6154172153756186,0.6720670779897282,-0.41181002137110273,-0.0649000033736229,0.9958000183105469,-0.0649000033736229,0.39550647488952684,0.8794788320983019,0.2647482053035805,0.4814000129699707,0.7325000166893005,0.4814000129699707,0.6880720658725188,0.5607374353912905,0.4605761182657241,0.614799976348877,0.49399998784065247,0.614799976348877,-0.5381108060843871,-0.25135180073328567,-0.8045241032084407,-0.3698999881744385,-0.2563000023365021,-0.8930000066757202,-0.36910000443458557,0.25600001215934753,-0.8934000134468079,-0.41181002137110273,0.6720670779897282,-0.6154172153756186,-0.03550000116229057,0.9958000183105469,-0.08389999717473984,0.2647482053035805,0.8794788320983019,0.39550647488952684,0.2603999972343445,0.7318999767303467,0.6297000050544739,0.4605761182657241,0.5607374353912905,0.6880720658725188,0.3325999975204468,0.4934000074863434,0.8036999702453613,-0.1876012686200115,-0.2515364269786189,-0.9494920694323845,-0.00279999990016222,-0.2578999996185303,-0.9661999940872192,-0.0019000000320374966,0.2547000050544739,-0.9670000076293945,-0.14339562350586094,0.6725622315424132,-0.7260149722024023,-0.0003000000142492354,0.9957000017166138,-0.09229999780654907,0.09256730699733487,0.8783596159888912,0.46895168053340897,0,0.7312999963760376,0.6820999979972839,0.16044485734451933,0.5594560236122703,0.8131828855771891,0,0.4925000071525574,0.8702999949455261,0.17781356971082418,-0.2762617871652753,-0.94449021137275,0.3790999948978424,-0.35929998755455017,-0.8528000116348267,0.37709999084472656,0.14910000562667847,-0.9140999913215637,0.14395780863022883,0.6540767852077758,-0.7426033317906966,0.027499999850988388,0.9921000003814697,-0.1225999966263771,-0.09276555608813127,0.8766296536816158,0.47213875279382633,-0.26100000739097595,0.7268000245094299,0.6353999972343445,-0.16042337038321952,0.5590076148671953,0.8134954386813597,-0.33250001072883606,0.4925000071525574,0.8043000102043152,0.5155281298975289,-0.3849732031227696,-0.7655235986968341,0.6635000109672546,-0.4108000099658966,-0.6252999901771545,0.7127000093460083,0.07370000332593918,-0.6976000070571899,0.4638206739517661,0.5539062400248373,-0.691417572582934,0.09969999641180038,0.987500011920929,-0.12200000137090683,-0.2749668019071642,0.8694154310328366,0.4104997760424887,-0.48730000853538513,0.723800003528595,0.4885999858379364,-0.46145001001631164,0.5585924142572216,0.6892302974987636,-0.6151999831199646,0.4925999939441681,0.6154999732971191,0.7799397173089967,-0.38252671106395425,-0.495345690085779,0.8799999952316284,-0.3328999876976013,-0.33869999647140503,0.9172999858856201,0.1670999974012375,-0.36149999499320984,0.6935905336506715,0.5583449082267957,-0.4551737416497001,0.1136000007390976,0.9923999905586243,-0.04809999838471413,-0.41112556129251077,0.8694462651166909,0.2739324094125316,-0.6341000199317932,0.7275000214576721,0.26190000772476196,-0.6892193216130235,0.5588149346665281,0.46119691619624625,-0.804099977016449,0.4925999939441681,0.3327000141143799,0.940120720168391,-0.2953801644080805,-0.1700693681540597,0.96670001745224,-0.2556999921798706,0.010499999858438969,0.9674000144004822,0.2529999911785126,0.008100000210106373,0.7547291638439781,0.639985268644528,-0.1442315678392254,0.0934000015258789,0.9955999851226807,0.0013000000035390258,-0.4746532582851164,0.8752533177838288,0.09292961910888725,-0.682200014591217,0.7311999797821045,-0.0003000000142492354,-0.8137112475669765,0.5586976998809986,0.1604084964416667,-0.8702999949455261,0.4925000071525574,-0.00009999999747378752,0.9494920694323845,-0.2515364269786189,0.1876012686200115,0.8930000066757202,-0.2563000023365021,0.3698999881744385,0.8934000134468079,0.25600001215934753,0.36910000443458557,0.7260149722024023,0.6725622315424132,0.14339562350586094,0.08389999717473984,0.9958000183105469,0.03550000116229057,-0.46895168053340897,0.8783596159888912,-0.09256730699733487,-0.6297000050544739,0.7318999767303467,-0.2603999972343445,-0.8131828855771891,0.5594560236122703,-0.16044485734451933,-0.8036999702453613,0.4934000074863434,-0.3325999975204468,0.8045241032084407,-0.25135180073328567,0.5381108060843871,0.6833999752998352,-0.2567000091075897,0.6833999752998352,0.6834999918937683,0.25609999895095825,0.6834999918937683,0.6154172153756186,0.6720670779897282,0.41181002137110273,0.0649000033736229,0.9958000183105469,0.0649000033736229,-0.39550647488952684,0.8794788320983019,-0.2647482053035805,-0.4814000129699707,0.7325000166893005,-0.4814000129699707,-0.6880720658725188,0.5607374353912905,-0.4605761182657241,-0.614799976348877,0.49399998784065247,-0.614799976348877,0.5381108060843871,-0.25135180073328567,0.8045241032084407,0.3698999881744385,-0.2563000023365021,0.8930000066757202,0.36910000443458557,0.25600001215934753,0.8934000134468079,0.41181002137110273,0.6720670779897282,0.6154172153756186,0.03550000116229057,0.9958000183105469,0.08389999717473984,-0.2647482053035805,0.8794788320983019,-0.39550647488952684,-0.2603999972343445,0.7318999767303467,-0.6297000050544739,-0.4605761182657241,0.5607374353912905,-0.6880720658725188,-0.3325999975204468,0.4934000074863434,-0.8036999702453613,0.1876012686200115,-0.2515364269786189,0.9494920694323845,0,-0.2558000087738037,0.96670001745224,0,0.25540000200271606,0.9667999744415283,0.14339562350586094,0.6725622315424132,0.7260149722024023,0,0.9958000183105469,0.09210000187158585,-0.09256730699733487,0.8783596159888912,-0.46895168053340897,0,0.7312999963760376,-0.6819999814033508,-0.16044485734451933,0.5594560236122703,-0.8131828855771891,0,0.4925000071525574,-0.8702999949455261,-0.1876012686200115,-0.2515364269786189,0.9494920694323845,-0.3698999881744385,-0.2563000023365021,0.8930000066757202,-0.36910000443458557,0.25600001215934753,0.8934000134468079,-0.14339562350586094,0.6725622315424132,0.7260149722024023,-0.03550000116229057,0.9958000183105469,0.08389999717473984,0.09256730699733487,0.8783596159888912,-0.46895168053340897,0.2603999972343445,0.7318999767303467,-0.6297000050544739,0.16044485734451933,0.5594560236122703,-0.8131828855771891,0.3325999975204468,0.4934000074863434,-0.8036999702453613,-0.5381108060843871,-0.25135180073328567,0.8045241032084407,-0.6833999752998352,-0.2567000091075897,0.6833999752998352,-0.6834999918937683,0.25609999895095825,0.6834999918937683,-0.41181002137110273,0.6720670779897282,0.6154172153756186,-0.0649000033736229,0.9958000183105469,0.0649000033736229,0.2647482053035805,0.8794788320983019,-0.39550647488952684,0.4814000129699707,0.7325000166893005,-0.4814000129699707,0.4605761182657241,0.5607374353912905,-0.6880720658725188,0.614799976348877,0.49399998784065247,-0.614799976348877,-0.8045241032084407,-0.25135180073328567,0.5381108060843871,-0.8930000066757202,-0.2563000023365021,0.3698999881744385,-0.8934000134468079,0.25600001215934753,0.36910000443458557,-0.6154172153756186,0.6720670779897282,0.41181002137110273,-0.08389999717473984,0.9958000183105469,0.03550000116229057,0.39550647488952684,0.8794788320983019,-0.2647482053035805,0.6297000050544739,0.7318999767303467,-0.2603999972343445,0.6880720658725188,0.5607374353912905,-0.4605761182657241,0.8036999702453613,0.4934000074863434,-0.3325999975204468,-0.9494920694323845,-0.2515364269786189,0.1876012686200115,-0.7260149722024023,0.6725622315424132,0.14339562350586094,0.46895168053340897,0.8783596159888912,-0.09256730699733487,0.8131828855771891,0.5594560236122703,-0.16044485734451933,0.89170186696973,0.4170154906217081,0.175971193734185,0.8453999757766724,0.4034999907016754,0.3497999906539917,0.9153000116348267,0.4027000069618225,0,0.9085685972138349,0.37723739278916374,0.17942980142250198,0.8700000047683716,0.336899995803833,0.36000001430511475,0.9417999982833862,0.3361999988555908,0,0.9398615330526648,0.28672575430335634,0.18560344960982264,0.90420001745224,0.20579999685287476,0.3743000030517578,0.9786999821662903,0.2053000032901764,0,0.974048141581515,0.11941584930670929,0.19227603286929457,0.9218999743461609,-0.06639999896287918,0.38179999589920044,0.9977999925613403,-0.06620000302791595,0,0.7547722509117953,0.41841261984957023,0.5052224547703327,0.6467999815940857,0.4041000008583069,0.6467999815940857,0.7692780597174184,0.3783166747117983,0.5148667404993367,0.6657000184059143,0.33739998936653137,0.6657000184059143,0.7957963785535204,0.28785546405722773,0.5327732685613087,0.6919000148773193,0.2061000019311905,0.6919000148773193,0.8249659082595298,0.1199935753008835,0.5522977386302068,0.7055000066757202,-0.06650000065565109,0.7055000066757202,0.5052224547703327,0.41841261984957023,0.7547722509117953,0.3497999906539917,0.4034999907016754,0.8453999757766724,0.5148667404993367,0.3783166747117983,0.7692780597174184,0.36000001430511475,0.336899995803833,0.8700000047683716,0.5327732685613087,0.28785546405722773,0.7957963785535204,0.3743000030517578,0.20579999685287476,0.90420001745224,0.5522977386302068,0.1199935753008835,0.8249659082595298,0.38179999589920044,-0.06639999896287918,0.9218999743461609,0.175971193734185,0.4170154906217081,0.89170186696973,0,0.4027000069618225,0.9153000116348267,0.17942980142250198,0.37723739278916374,0.9085685972138349,0,0.3361999988555908,0.9417999982833862,0.18560344960982264,0.28672575430335634,0.9398615330526648,0,0.2053000032901764,0.9786999821662903,0.19227603286929457,0.11941584930670929,0.974048141581515,0,-0.06620000302791595,0.9977999925613403,-0.175971193734185,0.4170154906217081,0.89170186696973,-0.3497999906539917,0.4034999907016754,0.8453999757766724,-0.17942980142250198,0.37723739278916374,0.9085685972138349,-0.36000001430511475,0.336899995803833,0.8700000047683716,-0.18560344960982264,0.28672575430335634,0.9398615330526648,-0.3743000030517578,0.20579999685287476,0.90420001745224,-0.19227603286929457,0.11941584930670929,0.974048141581515,-0.38179999589920044,-0.06639999896287918,0.9218999743461609,-0.5052224547703327,0.41841261984957023,0.7547722509117953,-0.6467999815940857,0.4041000008583069,0.6467999815940857,-0.5148667404993367,0.3783166747117983,0.7692780597174184,-0.6657000184059143,0.33739998936653137,0.6657000184059143,-0.5327732685613087,0.28785546405722773,0.7957963785535204,-0.6919000148773193,0.2061000019311905,0.6919000148773193,-0.5522977386302068,0.1199935753008835,0.8249659082595298,-0.7055000066757202,-0.06650000065565109,0.7055000066757202,-0.7547722509117953,0.41841261984957023,0.5052224547703327,-0.8453999757766724,0.4034999907016754,0.3497999906539917,-0.7692780597174184,0.3783166747117983,0.5148667404993367,-0.8700000047683716,0.336899995803833,0.36000001430511475,-0.7957963785535204,0.28785546405722773,0.5327732685613087,-0.90420001745224,0.20579999685287476,0.3743000030517578,-0.8249659082595298,0.1199935753008835,0.5522977386302068,-0.9218999743461609,-0.06639999896287918,0.38179999589920044,-0.89170186696973,0.4170154906217081,0.175971193734185,-0.9153000116348267,0.4027000069618225,0,-0.9085685972138349,0.37723739278916374,0.17942980142250198,-0.9417999982833862,0.3361999988555908,0,-0.9398615330526648,0.28672575430335634,0.18560344960982264,-0.9786999821662903,0.2053000032901764,0,-0.974048141581515,0.11941584930670929,0.19227603286929457,-0.9977999925613403,-0.06620000302791595,0,-0.89170186696973,0.4170154906217081,-0.175971193734185,-0.8453999757766724,0.4034999907016754,-0.3497999906539917,-0.9085685972138349,0.37723739278916374,-0.17942980142250198,-0.8700000047683716,0.336899995803833,-0.36000001430511475,-0.9398615330526648,0.28672575430335634,-0.18560344960982264,-0.90420001745224,0.20579999685287476,-0.3743000030517578,-0.974048141581515,0.11941584930670929,-0.19227603286929457,-0.9218999743461609,-0.06639999896287918,-0.38179999589920044,-0.7547722509117953,0.41841261984957023,-0.5052224547703327,-0.6467999815940857,0.4041000008583069,-0.6467999815940857,-0.7692780597174184,0.3783166747117983,-0.5148667404993367,-0.6657000184059143,0.33739998936653137,-0.6657000184059143,-0.7957963785535204,0.28785546405722773,-0.5327732685613087,-0.6919000148773193,0.2061000019311905,-0.6919000148773193,-0.8249659082595298,0.1199935753008835,-0.5522977386302068,-0.7055000066757202,-0.06650000065565109,-0.7055000066757202,-0.5052224547703327,0.41841261984957023,-0.7547722509117953,-0.3497999906539917,0.4034999907016754,-0.8453999757766724,-0.5148667404993367,0.3783166747117983,-0.7692780597174184,-0.36000001430511475,0.336899995803833,-0.8700000047683716,-0.5327732685613087,0.28785546405722773,-0.7957963785535204,-0.3743000030517578,0.20579999685287476,-0.90420001745224,-0.5522977386302068,0.1199935753008835,-0.8249659082595298,-0.38179999589920044,-0.06639999896287918,-0.9218999743461609,-0.175971193734185,0.4170154906217081,-0.89170186696973,0,0.4027000069618225,-0.9153000116348267,-0.17942980142250198,0.37723739278916374,-0.9085685972138349,0,0.3361999988555908,-0.9417999982833862,-0.18560344960982264,0.28672575430335634,-0.9398615330526648,0,0.2053000032901764,-0.9786999821662903,-0.19227603286929457,0.11941584930670929,-0.974048141581515,0,-0.06620000302791595,-0.9977999925613403,0.175971193734185,0.4170154906217081,-0.89170186696973,0.3497999906539917,0.4034999907016754,-0.8453999757766724,0.17942980142250198,0.37723739278916374,-0.9085685972138349,0.36000001430511475,0.336899995803833,-0.8700000047683716,0.18560344960982264,0.28672575430335634,-0.9398615330526648,0.3743000030517578,0.20579999685287476,-0.90420001745224,0.19227603286929457,0.11941584930670929,-0.974048141581515,0.38179999589920044,-0.06639999896287918,-0.9218999743461609,0.5052224547703327,0.41841261984957023,-0.7547722509117953,0.6467999815940857,0.4041000008583069,-0.6467999815940857,0.5148667404993367,0.3783166747117983,-0.7692780597174184,0.6657000184059143,0.33739998936653137,-0.6657000184059143,0.5327732685613087,0.28785546405722773,-0.7957963785535204,0.6919000148773193,0.2061000019311905,-0.6919000148773193,0.5522977386302068,0.1199935753008835,-0.8249659082595298,0.7055000066757202,-0.06650000065565109,-0.7055000066757202,0.7547722509117953,0.41841261984957023,-0.5052224547703327,0.8453999757766724,0.4034999907016754,-0.3497999906539917,0.7692780597174184,0.3783166747117983,-0.5148667404993367,0.8700000047683716,0.336899995803833,-0.36000001430511475,0.7957963785535204,0.28785546405722773,-0.5327732685613087,0.90420001745224,0.20579999685287476,-0.3743000030517578,0.8249659082595298,0.1199935753008835,-0.5522977386302068,0.9218999743461609,-0.06639999896287918,-0.38179999589920044,0.89170186696973,0.4170154906217081,-0.175971193734185,0.9085685972138349,0.37723739278916374,-0.17942980142250198,0.9398615330526648,0.28672575430335634,-0.18560344960982264,0.974048141581515,0.11941584930670929,-0.19227603286929457,0.949837996375371,-0.25034021126228206,0.18745015141838892,0.8313999772071838,-0.43619999289512634,0.3441999852657318,0.9002000093460083,-0.43549999594688416,0,0.7776228852967049,-0.6097170963557023,0.15345263332507184,0.6735000014305115,-0.6847000122070312,0.2786000072956085,0.7296000123023987,-0.683899998664856,0,0.649169927361788,-0.7497580231546305,0.12822368004526918,0.6403999924659729,-0.7208999991416931,0.26489999890327454,0.6940000057220459,-0.7200000286102295,0,0.7309008795580111,-0.6670453977388504,0.14434106005134031,0.7329000234603882,-0.609000027179718,0.30320000648498535,0.7939000129699707,-0.6079999804496765,0,0.8044401026352556,-0.2509927077580416,0.5384039207922486,0.6360999941825867,-0.4368000030517578,0.6360999941825867,0.6577259751592633,-0.611316221873683,0.4401011457322989,0.5149999856948853,-0.6852999925613403,0.5149999856948853,0.5484574657551682,-0.7513248159850185,0.3670223823454051,0.48969998955726624,-0.7214000225067139,0.48969998955726624,0.6183258124965243,-0.6680727822223783,0.41394679278158897,0.5605999827384949,-0.6096000075340271,0.5605999827384949,0.5384039207922486,-0.2509927077580416,0.8044401026352556,0.3441999852657318,-0.43619999289512634,0.8313999772071838,0.44010114573229886,-0.6113162218736828,0.6577259751592632,0.2786000072956085,-0.6847000122070312,0.6735000014305115,0.3670223823454051,-0.7513248159850185,0.5484574657551682,0.26489999890327454,-0.7208999991416931,0.6403999924659729,0.41394679278158897,-0.6680727822223783,0.6183258124965243,0.30320000648498535,-0.609000027179718,0.7329000234603882,0.18745015141838892,-0.25034021126228206,0.949837996375371,0,-0.43549999594688416,0.9002000093460083,0.15345263332507184,-0.6097170963557023,0.7776228852967049,0,-0.683899998664856,0.7296000123023987,0.12822368004526918,-0.7497580231546305,0.649169927361788,0,-0.7200000286102295,0.6940000057220459,0.14434106005134031,-0.6670453977388504,0.7309008795580111,0,-0.6079999804496765,0.7939000129699707,-0.18745015141838892,-0.25034021126228206,0.949837996375371,-0.3441999852657318,-0.43619999289512634,0.8313999772071838,-0.15345263332507184,-0.6097170963557023,0.7776228852967049,-0.2786000072956085,-0.6847000122070312,0.6735000014305115,-0.12822368004526918,-0.7497580231546305,0.649169927361788,-0.26489999890327454,-0.7208999991416931,0.6403999924659729,-0.14434106005134031,-0.6670453977388504,0.7309008795580111,-0.30320000648498535,-0.609000027179718,0.7329000234603882,-0.5384039207922486,-0.2509927077580416,0.8044401026352556,-0.6360999941825867,-0.4368000030517578,0.6360999941825867,-0.44010114573229886,-0.6113162218736828,0.6577259751592632,-0.5149999856948853,-0.6852999925613403,0.5149999856948853,-0.3670223823454051,-0.7513248159850185,0.5484574657551682,-0.48969998955726624,-0.7214000225067139,0.48969998955726624,-0.41394679278158897,-0.6680727822223783,0.6183258124965243,-0.5605999827384949,-0.6096000075340271,0.5605999827384949,-0.8044401026352556,-0.2509927077580416,0.5384039207922486,-0.8313999772071838,-0.43619999289512634,0.3441999852657318,-0.6577259751592633,-0.611316221873683,0.4401011457322989,-0.6735000014305115,-0.6847000122070312,0.2786000072956085,-0.5484574657551682,-0.7513248159850185,0.3670223823454051,-0.6403999924659729,-0.7208999991416931,0.26489999890327454,-0.6183258124965243,-0.6680727822223783,0.41394679278158897,-0.7329000234603882,-0.609000027179718,0.30320000648498535,-0.949837996375371,-0.25034021126228206,0.18745015141838892,-0.9002000093460083,-0.43549999594688416,0,-0.7776228852967049,-0.6097170963557023,0.15345263332507184,-0.7296000123023987,-0.683899998664856,0,-0.649169927361788,-0.7497580231546305,0.12822368004526918,-0.6940000057220459,-0.7200000286102295,0,-0.7309008795580111,-0.6670453977388504,0.14434106005134031,-0.7939000129699707,-0.6079999804496765,0,-0.949837996375371,-0.25034021126228206,-0.18745015141838892,-0.8313999772071838,-0.43619999289512634,-0.3441999852657318,-0.7776228852967049,-0.6097170963557023,-0.15345263332507184,-0.6735000014305115,-0.6847000122070312,-0.2786000072956085,-0.649169927361788,-0.7497580231546305,-0.12822368004526918,-0.6403999924659729,-0.7208999991416931,-0.26489999890327454,-0.7309008795580111,-0.6670453977388504,-0.14434106005134031,-0.7329000234603882,-0.609000027179718,-0.30320000648498535,-0.8044401026352556,-0.2509927077580416,-0.5384039207922486,-0.6360999941825867,-0.4368000030517578,-0.6360999941825867,-0.6577259751592633,-0.611316221873683,-0.4401011457322989,-0.5149999856948853,-0.6852999925613403,-0.5149999856948853,-0.5484574657551682,-0.7513248159850185,-0.3670223823454051,-0.48969998955726624,-0.7214000225067139,-0.48969998955726624,-0.6183258124965243,-0.6680727822223783,-0.41394679278158897,-0.5605999827384949,-0.6096000075340271,-0.5605999827384949,-0.5384039207922486,-0.2509927077580416,-0.8044401026352556,-0.3441999852657318,-0.43619999289512634,-0.8313999772071838,-0.44010114573229886,-0.6113162218736828,-0.6577259751592632,-0.2786000072956085,-0.6847000122070312,-0.6735000014305115,-0.3670223823454051,-0.7513248159850185,-0.5484574657551682,-0.26489999890327454,-0.7208999991416931,-0.6403999924659729,-0.41394679278158897,-0.6680727822223783,-0.6183258124965243,-0.30320000648498535,-0.609000027179718,-0.7329000234603882,-0.18745015141838892,-0.25034021126228206,-0.949837996375371,0,-0.43549999594688416,-0.9002000093460083,-0.15345263332507184,-0.6097170963557023,-0.7776228852967049,0,-0.683899998664856,-0.7296000123023987,-0.12822368004526918,-0.7497580231546305,-0.649169927361788,0,-0.7200000286102295,-0.6940000057220459,-0.14434106005134031,-0.6670453977388504,-0.7309008795580111,0,-0.6079999804496765,-0.7939000129699707,0.18745015141838892,-0.25034021126228206,-0.949837996375371,0.3441999852657318,-0.43619999289512634,-0.8313999772071838,0.15345263332507184,-0.6097170963557023,-0.7776228852967049,0.2786000072956085,-0.6847000122070312,-0.6735000014305115,0.12822368004526918,-0.7497580231546305,-0.649169927361788,0.26489999890327454,-0.7208999991416931,-0.6403999924659729,0.14434106005134031,-0.6670453977388504,-0.7309008795580111,0.30320000648498535,-0.609000027179718,-0.7329000234603882,0.5384039207922486,-0.2509927077580416,-0.8044401026352556,0.6360999941825867,-0.4368000030517578,-0.6360999941825867,0.44010114573229886,-0.6113162218736828,-0.6577259751592632,0.5149999856948853,-0.6852999925613403,-0.5149999856948853,0.3670223823454051,-0.7513248159850185,-0.5484574657551682,0.48969998955726624,-0.7214000225067139,-0.48969998955726624,0.41394679278158897,-0.6680727822223783,-0.6183258124965243,0.5605999827384949,-0.6096000075340271,-0.5605999827384949,0.8044401026352556,-0.2509927077580416,-0.5384039207922486,0.8313999772071838,-0.43619999289512634,-0.3441999852657318,0.6577259751592633,-0.611316221873683,-0.4401011457322989,0.6735000014305115,-0.6847000122070312,-0.2786000072956085,0.5484574657551682,-0.7513248159850185,-0.3670223823454051,0.6403999924659729,-0.7208999991416931,-0.26489999890327454,0.6183258124965243,-0.6680727822223783,-0.41394679278158897,0.7329000234603882,-0.609000027179718,-0.30320000648498535,0.949837996375371,-0.25034021126228206,-0.18745015141838892,0.7776228852967049,-0.6097170963557023,-0.15345263332507184,0.649169927361788,-0.7497580231546305,-0.12822368004526918,0.7309008795580111,-0.6670453977388504,-0.14434106005134031,0.8387035316725441,-0.518815353093059,0.16555064287077373,0.576200008392334,-0.7817999720573425,0.23819999396800995,0.6238999962806702,-0.781499981880188,0,0.25616783727492487,-0.9653076593733025,0.050588159692990436,0.16359999775886536,-0.9842000007629395,0.06750000268220901,0.17730000615119934,-0.9842000007629395,0,0.07553202574448914,-0.9970317293860195,0.014921249426803469,0.04540000110864639,-0.9987999796867371,0.018699999898672104,0.04919999837875366,-0.9987999796867371,0,0.015316466366009897,-0.9998781173537434,0.003025937076820533,0,-1,0,0.7093394127545394,-0.5208703290912265,0.47490177698703395,0.44040000438690186,-0.7822999954223633,0.44040000438690186,0.21633036433079836,-0.9655254553343809,0.14478179640355507,0.12489999830722809,-0.9843000173568726,0.12489999830722809,0.06371717584979004,-0.9970565493361698,0.04264222001229404,0.034699998795986176,-0.9987999796867371,0.034699998795986176,0.01292177647076656,-0.9998790650449104,0.008653495117885388,0.47490177698703395,-0.5208703290912265,0.7093394127545394,0.23819999396800995,-0.7817999720573425,0.576200008392334,0.14478179640355507,-0.9655254553343809,0.21633036433079836,0.06750000268220901,-0.9842000007629395,0.16359999775886536,0.04264222001229404,-0.9970565493361698,0.06371717584979004,0.018699999898672104,-0.9987999796867371,0.04540000110864639,0.008653495117885388,-0.9998790650449104,0.01292177647076656,0.16555064287077373,-0.5188153530930589,0.838703531672544,0,-0.781499981880188,0.6238999962806702,0.050588159692990436,-0.9653076593733025,0.25616783727492487,0,-0.9842000007629395,0.17730000615119934,0.014921249426803469,-0.9970317293860195,0.07553202574448914,0,-0.9987999796867371,0.04919999837875366,0.003025937076820533,-0.9998781173537434,0.015316466366009897,-0.16555064287077373,-0.5188153530930589,0.838703531672544,-0.23819999396800995,-0.7817999720573425,0.576200008392334,-0.050588159692990436,-0.9653076593733025,0.25616783727492487,-0.06750000268220901,-0.9842000007629395,0.16359999775886536,-0.014921249426803469,-0.9970317293860195,0.07553202574448914,-0.018699999898672104,-0.9987999796867371,0.04540000110864639,-0.003025937076820533,-0.9998781173537434,0.015316466366009897,-0.47490177698703395,-0.5208703290912265,0.7093394127545394,-0.44040000438690186,-0.7822999954223633,0.44040000438690186,-0.14478179640355507,-0.9655254553343809,0.21633036433079836,-0.12489999830722809,-0.9843000173568726,0.12489999830722809,-0.04264222001229404,-0.9970565493361698,0.06371717584979004,-0.034699998795986176,-0.9987999796867371,0.034699998795986176,-0.008653495117885388,-0.9998790650449104,0.01292177647076656,-0.7093394127545394,-0.5208703290912265,0.47490177698703395,-0.576200008392334,-0.7817999720573425,0.23819999396800995,-0.21633036433079836,-0.9655254553343809,0.14478179640355507,-0.16359999775886536,-0.9842000007629395,0.06750000268220901,-0.06371717584979004,-0.9970565493361698,0.04264222001229404,-0.04540000110864639,-0.9987999796867371,0.018699999898672104,-0.01292177647076656,-0.9998790650449104,0.008653495117885388,-0.8387035316725441,-0.518815353093059,0.16555064287077373,-0.6238999962806702,-0.781499981880188,0,-0.25616783727492487,-0.9653076593733025,0.050588159692990436,-0.17730000615119934,-0.9842000007629395,0,-0.07553202574448914,-0.9970317293860195,0.014921249426803469,-0.04919999837875366,-0.9987999796867371,0,-0.015316466366009897,-0.9998781173537434,0.003025937076820533,-0.8387035316725441,-0.518815353093059,-0.16555064287077373,-0.576200008392334,-0.7817999720573425,-0.23819999396800995,-0.25616783727492487,-0.9653076593733025,-0.050588159692990436,-0.16359999775886536,-0.9842000007629395,-0.06750000268220901,-0.07553202574448914,-0.9970317293860195,-0.014921249426803469,-0.04540000110864639,-0.9987999796867371,-0.018699999898672104,-0.015316466366009897,-0.9998781173537434,-0.003025937076820533,-0.7093394127545394,-0.5208703290912265,-0.47490177698703395,-0.44040000438690186,-0.7822999954223633,-0.44040000438690186,-0.21633036433079836,-0.9655254553343809,-0.14478179640355507,-0.12489999830722809,-0.9843000173568726,-0.12489999830722809,-0.06371717584979004,-0.9970565493361698,-0.04264222001229404,-0.034699998795986176,-0.9987999796867371,-0.034699998795986176,-0.01292177647076656,-0.9998790650449104,-0.008653495117885388,-0.47490177698703395,-0.5208703290912265,-0.7093394127545394,-0.23819999396800995,-0.7817999720573425,-0.576200008392334,-0.14478179640355507,-0.9655254553343809,-0.21633036433079836,-0.06750000268220901,-0.9842000007629395,-0.16359999775886536,-0.04264222001229404,-0.9970565493361698,-0.06371717584979004,-0.018699999898672104,-0.9987999796867371,-0.04540000110864639,-0.008653495117885388,-0.9998790650449104,-0.01292177647076656,-0.16555064287077373,-0.5188153530930589,-0.838703531672544,0,-0.781499981880188,-0.6238999962806702,-0.050588159692990436,-0.9653076593733025,-0.25616783727492487,0,-0.9842000007629395,-0.17730000615119934,-0.014921249426803469,-0.9970317293860195,-0.07553202574448914,0,-0.9987999796867371,-0.04919999837875366,-0.003025937076820533,-0.9998781173537434,-0.015316466366009897,0.16555064287077373,-0.5188153530930589,-0.838703531672544,0.23819999396800995,-0.7817999720573425,-0.576200008392334,0.050588159692990436,-0.9653076593733025,-0.25616783727492487,0.06750000268220901,-0.9842000007629395,-0.16359999775886536,0.014921249426803469,-0.9970317293860195,-0.07553202574448914,0.018699999898672104,-0.9987999796867371,-0.04540000110864639,0.003025937076820533,-0.9998781173537434,-0.015316466366009897,0.47490177698703395,-0.5208703290912265,-0.7093394127545394,0.44040000438690186,-0.7822999954223633,-0.44040000438690186,0.14478179640355507,-0.9655254553343809,-0.21633036433079836,0.12489999830722809,-0.9843000173568726,-0.12489999830722809,0.04264222001229404,-0.9970565493361698,-0.06371717584979004,0.034699998795986176,-0.9987999796867371,-0.034699998795986176,0.008653495117885388,-0.9998790650449104,-0.01292177647076656,0.7093394127545394,-0.5208703290912265,-0.47490177698703395,0.576200008392334,-0.7817999720573425,-0.23819999396800995,0.21633036433079836,-0.9655254553343809,-0.14478179640355507,0.16359999775886536,-0.9842000007629395,-0.06750000268220901,0.06371717584979004,-0.9970565493361698,-0.04264222001229404,0.04540000110864639,-0.9987999796867371,-0.018699999898672104,0.01292177647076656,-0.9998790650449104,-0.008653495117885388,0.8387035316725441,-0.518815353093059,-0.16555064287077373,0.25616783727492487,-0.9653076593733025,-0.050588159692990436,0.07553202574448914,-0.9970317293860195,-0.014921249426803469,0.015316466366009897,-0.9998781173537434,-0.003025937076820533,0.007923619032407068,-0.9792649536215844,0.20242867106698378,0.007799999788403511,-1,-0.00019999999494757503,0.007000000216066837,-0.8125,0.5828999876976013,0.03610000014305115,-0.8373000025749207,0.5455999970436096,0.03909999877214432,-0.9991999864578247,-0.0010000000474974513,0.07294431178951416,-0.9771793893951642,0.19949829151861947,0.16179999709129333,-0.8104000091552734,0.5630000233650208,0.17949999868869781,-0.9836999773979187,-0.004399999976158142,0.30508737694808447,-0.9288212891929031,0.2102681744082329,0.48240000009536743,-0.5950999855995178,0.6427000164985657,0.6122999787330627,-0.7906000018119812,-0.010499999858438969,0.85242181732101,-0.45600261568139905,0.2558098118659036,0.7386999726295471,-0.11460000276565552,0.6642000079154968,0.9861999750137329,-0.1657000035047531,-0.0066999997943639755,0.005356055160839852,-0.5906212413030134,0.8069311383227207,-0.0019000000320374966,0.16210000216960907,0.9868000149726868,0.00279999990016222,0.017100000753998756,0.9998000264167786,0.050017369857379264,-0.5919248852555064,0.8044396763759266,0.010499999858438969,0.07339999824762344,0.9972000122070312,0.19813039646486702,-0.5271562130528779,0.8263477918143327,-0.06599999964237213,0.13009999692440033,0.989300012588501,0.4449202026559152,-0.20623851513417835,0.8714996776498938,-0.09440000355243683,0.016599999740719795,0.9954000115394592,-0.005868425724113912,0.5911289942558654,0.8065556854486675,-0.009200000204145908,0.8715000152587891,0.4902999997138977,-0.04859999939799309,0.8406000137329102,0.5394999980926514,-0.0565568733345604,0.5892386602454603,0.8059771221013369,-0.2232999950647354,0.8029000163078308,0.5526999831199646,-0.21826903582935248,0.5064932454046728,0.8341601886673605,-0.5964000225067139,0.5600000023841858,0.5751000046730042,-0.4519125123063575,0.18097256755074448,0.8735124561304479,-0.8033000230789185,0.0681999996304512,0.5916000008583069,-0.010227406140092809,0.9792477063934721,0.20240881820407414,-0.010599999688565731,0.9998999834060669,0.00009999999747378752,-0.058800000697374344,0.9983000159263611,0.000699999975040555,-0.1003582147149349,0.9740903926657386,0.2026724837158167,-0.2806999981403351,0.9598000049591064,0.0032999999821186066,-0.4107606469303811,0.8829429191860411,0.22734883415704424,-0.7497000098228455,0.6617000102996826,0.00430000014603138,-0.905303034236947,0.33387590683454604,0.26258959430409023,-0.9973999857902527,0.07270000129938126,0.002099999925121665,-0.010227406140092809,0.9792477063934721,-0.20240881820407414,-0.008799999952316284,0.8715000152587891,-0.4902999997138977,-0.04650000110268593,0.8411999940872192,-0.5388000011444092,-0.1003582147149349,0.9740903926657386,-0.2026724837158167,-0.21789999306201935,0.8068000078201294,-0.5491999983787537,-0.4107606469303811,0.8829429191860411,-0.22734883415704424,-0.5972999930381775,0.5600000023841858,-0.5741000175476074,-0.905303034236947,0.33387590683454604,-0.26258959430409023,-0.8040000200271606,0.06289999932050705,-0.5913000106811523,-0.005868425724113912,0.5911289942558654,-0.8065556854486675,-0.0017999999690800905,0.16169999539852142,-0.9868000149726868,0.0020000000949949026,0.014600000344216824,-0.9998999834060669,-0.0565568733345604,0.5892386602454603,-0.8059771221013369,0.009200000204145908,0.060100000351667404,-0.998199999332428,-0.21826903582935248,0.5064932454046728,-0.8341601886673605,-0.059300001710653305,0.11389999836683273,-0.9916999936103821,-0.4519125123063575,0.18097256755074448,-0.8735124561304479,-0.0869000032544136,0.012299999594688416,-0.9961000084877014,0.005356055160839852,-0.5906212413030134,-0.8069311383227207,0.006399999838322401,-0.8123999834060669,-0.5831000208854675,0.033799998462200165,-0.8374999761581421,-0.5454000234603882,0.050017369857379264,-0.5919248852555064,-0.8044396763759266,0.15710000693798065,-0.8119000196456909,-0.5622000098228455,0.19813039646486702,-0.5271562130528779,-0.8263477918143327,0.4844000041484833,-0.5893999934196472,-0.6464999914169312,0.4449202026559152,-0.20623851513417835,-0.8714996776498938,0.7389000058174133,-0.10130000114440918,-0.6661999821662903,0.007923619032407068,-0.9792649536215844,-0.20242867106698378,0.07294431178951416,-0.9771793893951642,-0.19949829151861947,0.30508737694808447,-0.9288212891929031,-0.2102681744082329,0.85242181732101,-0.45600261568139905,-0.2558098118659036,0.9478292644663923,0.18220680595344424,0.2615728680221666,0.725600004196167,0.25940001010894775,0.6373999714851379,0.9465000033378601,0.32269999384880066,-0.0034000000450760126,0.8600566042901111,0.44406573291460566,0.25121357898803404,0.6459000110626221,0.4620000123977661,0.607699990272522,0.8258000016212463,0.5638999938964844,-0.007499999832361937,0.722097468072962,0.6564257510605728,0.21835860401454446,0.5315999984741211,0.6366999745368958,0.5586000084877014,0.6499999761581421,0.7598999738693237,-0.006899999920278788,0.5200506551893511,0.8306365796457171,0.1989728338029867,0.42500001192092896,0.6816999912261963,0.5954999923706055,0.5324000120162964,0.8464999794960022,-0.005200000014156103,0.4781972352408055,0.09361119253153362,0.8732493050904043,-0.04960000142455101,-0.01979999989271164,0.9986000061035156,0.4393956565632051,0.2449654752923344,0.8642472868966327,-0.03779999911785126,-0.035599999129772186,0.9986000061035156,0.39562746673558924,0.3918378901601171,0.830627458852191,-0.03790000081062317,-0.0364999994635582,0.9986000061035156,0.3039318735441624,0.5084492756925236,0.8056703732244866,-0.1688999980688095,-0.29789999127388,0.9394999742507935,-0.47742285385863215,-0.09515362565485244,0.8735062713788696,-0.7422999739646912,-0.29919999837875366,0.5995000004768372,-0.42856464276720363,-0.26014738661504994,0.8652489145946263,-0.6195999979972839,-0.5293999910354614,0.5795000195503235,-0.3729119034765285,-0.40703367257705336,0.8338227039568712,-0.4837000072002411,-0.6858000159263611,0.5437999963760376,-0.2896259899317443,-0.5099064991908379,0.8100074987547963,-0.44530001282691956,-0.7943999767303467,0.4131999909877777,-0.9462576942087682,-0.19013883790828634,0.26161727479199826,-0.9265000224113464,-0.37630000710487366,0.0020000000949949026,-0.8154980530103969,-0.5208357818286896,0.25237474894123124,-0.7538999915122986,-0.6570000052452087,0.00430000014603138,-0.6370197706643513,-0.7377648710591707,0.22340279052371467,-0.5662000179290771,-0.8241999745368958,0.0035000001080334187,-0.4721523712289914,-0.8571632880733152,0.2057747212905012,-0.48179998993873596,-0.8762999773025513,0.0019000000320374966,-0.9462576942087682,-0.19013883790828634,-0.26161727479199826,-0.744700014591217,-0.29440000653266907,-0.5989999771118164,-0.8154980530103969,-0.5208357818286896,-0.25237474894123124,-0.6219000220298767,-0.5281000137329102,-0.5781999826431274,-0.6370197706643513,-0.7377648710591707,-0.22340279052371467,-0.4812000095844269,-0.6883000135421753,-0.5428000092506409,-0.4721523712289914,-0.8571632880733152,-0.2057747212905012,-0.43810001015663147,-0.796999990940094,-0.4156999886035919,-0.47742285385863215,-0.09515362565485244,-0.8735062713788696,-0.04430000111460686,-0.017100000753998756,-0.9988999962806702,-0.42856464276720363,-0.26014738661504994,-0.8652489145946263,-0.026200000196695328,-0.028200000524520874,-0.9993000030517578,-0.3729119034765285,-0.40703367257705336,-0.8338227039568712,-0.025299999862909317,-0.028300000354647636,-0.9993000030517578,-0.2896259899317443,-0.5099064991908379,-0.8100074987547963,-0.1574999988079071,-0.28940001130104065,-0.9441999793052673,0.4781972352408055,0.09361119253153362,-0.8732493050904043,0.7282000184059143,0.2524000108242035,-0.6370999813079834,0.4393956565632051,0.2449654752923344,-0.8642472868966327,0.6470999717712402,0.45969998836517334,-0.608299970626831,0.39562746673558924,0.3918378901601171,-0.830627458852191,0.5230000019073486,0.6406999826431274,-0.5622000098228455,0.3039318735441624,0.5084492756925236,-0.8056703732244866,0.4099999964237213,0.6829000115394592,-0.6047000288963318,0.9478292644663923,0.18220680595344424,-0.2615728680221666,0.8600566042901111,0.44406573291460566,-0.25121357898803404,0.722097468072962,0.6564257510605728,-0.21835860401454446,0.5200506551893511,0.8306365796457171,-0.1989728338029867,-0.22469814643301808,0.9251791464063235,0.30586645786099653,-0.23080000281333923,0.9729999899864197,-0.006500000134110451,-0.15289999544620514,0.6872000098228455,0.7102000117301941,-0.3167000114917755,0.6377999782562256,0.7020999789237976,-0.5489000082015991,0.8359000086784363,-0.001500000013038516,-0.7554159687089509,0.6012029555014725,0.260579585761839,-0.6011000275611877,0.4715000092983246,0.6452999711036682,-0.8756999969482422,0.4828000068664551,0.00989999994635582,-0.8962608931532676,0.34737987822914146,0.2757600979213887,-0.6359000205993652,0.44609999656677246,0.629800021648407,-0.8776000142097473,0.47909998893737793,0.019099999219179153,-0.7277298905609964,0.5697090903460769,0.38189102995635527,-0.435699999332428,0.6010000109672546,0.6700000166893005,-0.6962000131607056,0.7174000144004822,0.02449999935925007,-0.06782871702682407,0.42060539852275436,0.9047045727086881,0.11110000312328339,-0.08510000258684158,0.9901999831199646,0.2232999950647354,0.006500000134110451,0.9746999740600586,-0.2397267208313023,0.393118607711727,0.8876873659066373,0.19009999930858612,0.1550000011920929,0.9695000052452087,-0.3269428225776823,0.3199115704344181,0.8892496712774892,0.0052999998442828655,0.18950000405311584,0.9818999767303467,-0.24664197962623152,0.33059209207256196,0.9109756322455285,-0.011800000444054604,0.2467000037431717,0.968999981880188,0.21474893554810956,-0.3917948594999005,0.8946394149322995,0.34389999508857727,-0.7228000164031982,0.599399983882904,0.5724999904632568,-0.5677000284194946,0.5916000008583069,0.5724729014296546,-0.15995477083527343,0.8041699126526359,0.7874000072479248,-0.2565000057220459,0.5605000257492065,0.5277329114283671,-0.01038778030367959,0.8493468480048075,0.6470999717712402,-0.30640000104904175,0.6980999708175659,0.2802675583364272,-0.16422675916009252,0.9457693520726449,0.42750000953674316,-0.4993000030517578,0.753600001335144,0.39159473040680615,-0.8708293307411027,0.2971697222777314,0.4108999967575073,-0.9117000102996826,0.0013000000035390258,0.671500027179718,-0.7409999966621399,-0.0008999999845400453,0.8641399116222908,-0.44467986513529173,0.23563113267282512,0.921999990940094,-0.3871000111103058,-0.007300000172108412,0.9202642753550175,-0.2825130464997946,0.2707398050946873,0.8468999862670898,-0.5315999984741211,-0.013899999670684338,0.6553517759350307,-0.6669930474005048,0.35444932571270243,0.5358999967575073,-0.8442000150680542,-0.010499999858438969,0.39159473040680615,-0.8708293307411027,-0.2971697222777314,0.34119999408721924,-0.7228000164031982,-0.6008999943733215,0.5787000060081482,-0.5611000061035156,-0.5917999744415283,0.8641399116222908,-0.44467986513529173,-0.23563113267282512,0.7849000096321106,-0.25099998712539673,-0.5665000081062317,0.9202642753550175,-0.2825130464997946,-0.2707398050946873,0.6427000164985657,-0.30230000615119934,-0.7039999961853027,0.6553517759350307,-0.6669930474005048,-0.35444932571270243,0.4185999929904938,-0.5,-0.7580999732017517,0.21484877208785355,-0.39190315580348,-0.894568008372541,0.11580000072717667,-0.07909999787807465,-0.9901000261306763,0.23280000686645508,0.012600000016391277,-0.9724000096321106,0.5724729014296546,-0.15995477083527343,-0.8041699126526359,0.20669999718666077,0.15360000729560852,-0.9663000106811523,0.5277329114283671,-0.01038778030367959,-0.8493468480048075,0.02449999935925007,0.16140000522136688,-0.9865999817848206,0.2802675583364272,-0.16422675916009252,-0.9457693520726449,0.0034000000450760126,0.2110999971628189,-0.9775000214576721,-0.06785298017190203,0.4204621294822817,-0.9047693467138552,-0.13490000367164612,0.6875,-0.7135999798774719,-0.31949999928474426,0.6330999732017517,-0.7050999999046326,-0.2397267208313023,0.393118607711727,-0.8876873659066373,-0.6039000153541565,0.46140000224113464,-0.6499000191688538,-0.3269428225776823,0.3199115704344181,-0.8892496712774892,-0.6317999958992004,0.43720000982284546,-0.6401000022888184,-0.24664197962623152,0.33059209207256196,-0.9109756322455285,-0.4242999851703644,0.6126999855041504,-0.666700005531311,-0.22469814643301808,0.9251791464063235,-0.30586645786099653,-0.7554159687089509,0.6012029555014725,-0.260579585761839,-0.8962608931532676,0.34737987822914146,-0.2757600979213887,-0.7277298905609964,0.5697090903460769,-0.38189102995635527,-0.4581346849192706,0.8290808733288989,0.32052693483404915,-0.2599000036716461,0.7918999791145325,0.5525000095367432,-0.42579999566078186,0.9047999978065491,0.01080000028014183,-0.246185208210748,0.9533009586111941,0.17495749646473896,0.009499999694526196,0.9997000098228455,-0.021700000390410423,0.02199999988079071,0.9998000264167786,0.0015999999595806003,0.5588645441304007,0.6666977641221954,-0.49313741759106583,0.41019999980926514,0.3328999876976013,-0.8490999937057495,0.9995999932289124,0.02590000070631504,0.011599999852478504,0.6055606832628622,-0.6381346851214208,-0.47547910840666874,0.5414999723434448,-0.5486000180244446,-0.6370000243186951,0.7095999717712402,-0.7045999765396118,0.009700000286102295,-0.18304741452057446,0.5222477728722519,0.8329171073806239,0.046300001442432404,0.4551999866962433,0.88919997215271,-0.11108392464029737,0.8826749299553293,0.45666763593981924,-0.010700000450015068,0.9887999892234802,0.14890000224113464,0.07555097805976921,0.8081131026014043,-0.5841620178667426,-0.04439999908208847,0.6829000115394592,-0.7290999889373779,0.1865265036320752,-0.09254615883689393,-0.9780813217352277,0.12280000001192093,0.009200000204145908,-0.9923999905586243,0.20586843545090303,-0.21233995694823685,0.9552643246600484,0.48179998993873596,-0.18039999902248383,0.8575000166893005,0.11889342221748984,0.6798112027299875,0.723685762466156,0.4553000032901764,0.7366999983787537,0.4999000132083893,-0.10639578264983571,0.9027074902947484,-0.4168922215634223,-0.22050000727176666,0.9071999788284302,-0.35830000042915344,-0.16898371149150437,0.5156251093433941,-0.8399852688381916,-0.23589999973773956,0.6572999954223633,-0.7157999873161316,0.4290978121327757,-0.8521036390277623,0.29965723081299106,0.7281000018119812,-0.6852999925613403,-0.015599999576807022,0.7436424021085918,-0.3226049926539566,0.5855954204917456,0.888700008392334,0.45809999108314514,-0.016699999570846558,-0.2121657419347905,0.9655431048711052,-0.15070570853529733,-0.26010000705718994,0.9656000137329102,0.0007999999797903001,-0.3585820114624871,0.8925522270977658,-0.2734400536833164,-0.3716000020503998,0.9283999800682068,-0.004399999976158142,0.4290978121327757,-0.8521036390277623,-0.29965723081299106,0.48019999265670776,-0.17839999496936798,-0.8589000105857849,0.7436424021085918,-0.3226049926539566,-0.5855954204917456,0.48809999227523804,0.7167999744415283,-0.49790000915527344,-0.2121657419347905,0.9655431048711052,0.15070570853529733,-0.22200000286102295,0.9053999781608582,0.3619000017642975,-0.3585820114624871,0.8925522270977658,0.2734400536833164,-0.2354000061750412,0.6632000207901001,0.7105000019073486,0.20586843545090303,-0.21233995694823685,-0.9552643246600484,0.05869999900460243,0.4377000033855438,-0.8971999883651733,0.11889342221748984,0.6798112027299875,-0.723685762466156,0.0013000000035390258,0.9865000247955322,-0.164000004529953,-0.10639578264983571,0.9027074902947484,0.4168922215634223,-0.044199999421834946,0.6816999912261963,0.7303000092506409,-0.16898371149150437,0.5156251093433941,0.8399852688381916,0.1387999951839447,-0.03420000150799751,0.9897000193595886,-0.18304741452057446,0.5222477728722519,-0.8329171073806239,-0.258899986743927,0.7972000241279602,-0.5454000234603882,-0.11108392464029737,0.8826749299553293,-0.45666763593981924,0.012299999594688416,0.9997000098228455,0.019300000742077827,0.07555097805976921,0.8081131026014043,0.5841620178667426,0.3986000120639801,0.3549000024795532,0.8457000255584717,0.1865265036320752,-0.09254615883689393,0.9780813217352277,0.5375999808311462,-0.5813999772071838,0.6107000112533569,-0.4581346849192706,0.8290808733288989,-0.32052693483404915,-0.246185208210748,0.9533009586111941,-0.17495749646473896,0.5588645441304007,0.6666977641221954,0.49313741759106583,0.6055606832628622,-0.6381346851214208,0.47547910840666874,0.14291142372842203,0.9893409658361559,0.02794241017337756,0.7626000046730042,0.5649999976158142,0.3147999942302704,0.8245000243186951,0.5658000111579895,0,0,1,0,0.973458284214919,-0.12702375109433608,0.1903784009578562,0.8479999899864197,-0.39800000190734863,0.3499999940395355,0.9176999926567078,-0.39730000495910645,0,0.746764468277477,-0.6487991657292128,0.14629583544084326,0.8640999794006348,-0.35530000925064087,0.3564000129699707,0.9352999925613403,-0.3538999855518341,0.00009999999747378752,0.981025828088616,0.023627540802087,0.19243197223614078,0.7210000157356262,0.6255999803543091,0.29789999127388,0.7807000279426575,0.6248999834060669,0.00009999999747378752,0.12055154584358733,0.9894424773820601,0.08044195886956569,0.5834000110626221,0.5651999711990356,0.583299994468689,0.8246900772851533,-0.12832997885984362,0.5508336345515219,0.6485000252723694,-0.3986999988555908,0.6484000086784363,0.6311228589976491,-0.650668419605885,0.422273068734218,0.6608999967575073,-0.35589998960494995,0.6607000231742859,0.8301974890908831,0.023243924461984086,0.5569846039908094,0.5519000291824341,0.6252999901771545,0.551800012588501,0.08044195886956569,0.9894424773820601,0.12055154584358733,0.3147999942302704,0.5651000142097473,0.7626000046730042,0.5508336345515219,-0.12832997885984362,0.8246900772851533,0.3499999940395355,-0.39800000190734863,0.8479999899864197,0.422273068734218,-0.650668419605885,0.6311228589976491,0.3564999997615814,-0.35519999265670776,0.8641999959945679,0.5569846039908094,0.023243924461984086,0.8301974890908831,0.2980000078678131,0.6255000233650208,0.7210999727249146,0.02794241017337756,0.9893409658361559,0.14291142372842203,0,0.5658000111579895,0.8245000243186951,0.1903784009578562,-0.12702375109433608,0.973458284214919,0,-0.39730000495910645,0.9176999926567078,0.14629583544084326,-0.6487991657292128,0.746764468277477,-0.00009999999747378752,-0.3538999855518341,0.9352999925613403,0.19243197223614078,0.023627540802087,0.981025828088616,-0.00009999999747378752,0.6248999834060669,0.7807000279426575,-0.02794241017337756,0.9893409658361559,0.14291142372842203,-0.3147999942302704,0.5649999976158142,0.7626000046730042,-0.1903784009578562,-0.12702375109433608,0.973458284214919,-0.3499999940395355,-0.39800000190734863,0.8479999899864197,-0.14629583544084326,-0.6487991657292128,0.746764468277477,-0.3564000129699707,-0.35530000925064087,0.8640999794006348,-0.19243197223614078,0.023627540802087,0.981025828088616,-0.29789999127388,0.6255999803543091,0.7210000157356262,-0.08044195886956569,0.9894424773820601,0.12055154584358733,-0.583299994468689,0.5651999711990356,0.5834000110626221,-0.5508336345515219,-0.12832997885984362,0.8246900772851533,-0.6484000086784363,-0.3986999988555908,0.6485000252723694,-0.422273068734218,-0.650668419605885,0.6311228589976491,-0.6607000231742859,-0.35589998960494995,0.6608999967575073,-0.5569846039908094,0.023243924461984086,0.8301974890908831,-0.551800012588501,0.6252999901771545,0.5519000291824341,-0.12055154584358733,0.9894424773820601,0.08044195886956569,-0.7626000046730042,0.5651000142097473,0.3147999942302704,-0.8246900772851533,-0.12832997885984362,0.5508336345515219,-0.8479999899864197,-0.39800000190734863,0.3499999940395355,-0.6311228589976491,-0.650668419605885,0.422273068734218,-0.8641999959945679,-0.35519999265670776,0.3564999997615814,-0.8301974890908831,0.023243924461984086,0.5569846039908094,-0.7210999727249146,0.6255000233650208,0.2980000078678131,-0.14291142372842203,0.9893409658361559,0.02794241017337756,-0.8245000243186951,0.5658000111579895,0,-0.973458284214919,-0.12702375109433608,0.1903784009578562,-0.9176999926567078,-0.39730000495910645,0,-0.746764468277477,-0.6487991657292128,0.14629583544084326,-0.9352999925613403,-0.3538999855518341,-0.00009999999747378752,-0.981025828088616,0.023627540802087,0.19243197223614078,-0.7807000279426575,0.6248999834060669,-0.00009999999747378752,-0.14291142372842203,0.9893409658361559,-0.02794241017337756,-0.7626000046730042,0.5649999976158142,-0.3147999942302704,-0.973458284214919,-0.12702375109433608,-0.1903784009578562,-0.8479999899864197,-0.39800000190734863,-0.3499999940395355,-0.746764468277477,-0.6487991657292128,-0.14629583544084326,-0.8640999794006348,-0.35530000925064087,-0.3564000129699707,-0.981025828088616,0.023627540802087,-0.19243197223614078,-0.7210000157356262,0.6255999803543091,-0.29789999127388,-0.12055154584358733,0.9894424773820601,-0.08044195886956569,-0.5834000110626221,0.5651999711990356,-0.583299994468689,-0.8246900772851533,-0.12832997885984362,-0.5508336345515219,-0.6485000252723694,-0.3986999988555908,-0.6484000086784363,-0.6311228589976491,-0.650668419605885,-0.422273068734218,-0.6608999967575073,-0.35589998960494995,-0.6607000231742859,-0.8301974890908831,0.023243924461984086,-0.5569846039908094,-0.5519000291824341,0.6252999901771545,-0.551800012588501,-0.08044195886956569,0.9894424773820601,-0.12055154584358733,-0.3147999942302704,0.5651000142097473,-0.7626000046730042,-0.5508336345515219,-0.12832997885984362,-0.8246900772851533,-0.3499999940395355,-0.39800000190734863,-0.8479999899864197,-0.422273068734218,-0.650668419605885,-0.6311228589976491,-0.3564999997615814,-0.35519999265670776,-0.8641999959945679,-0.5569846039908094,0.023243924461984086,-0.8301974890908831,-0.2980000078678131,0.6255000233650208,-0.7210999727249146,-0.02794241017337756,0.9893409658361559,-0.14291142372842203,0,0.5658000111579895,-0.8245000243186951,-0.1903784009578562,-0.12702375109433608,-0.973458284214919,0,-0.39730000495910645,-0.9176999926567078,-0.14629583544084326,-0.6487991657292128,-0.746764468277477,0.00009999999747378752,-0.3538999855518341,-0.9352999925613403,-0.19243197223614078,0.023627540802087,-0.981025828088616,0.00009999999747378752,0.6248999834060669,-0.7807000279426575,0.02794241017337756,0.9893409658361559,-0.14291142372842203,0.3147999942302704,0.5649999976158142,-0.7626000046730042,0.1903784009578562,-0.12702375109433608,-0.973458284214919,0.3499999940395355,-0.39800000190734863,-0.8479999899864197,0.14629583544084326,-0.6487991657292128,-0.746764468277477,0.3564000129699707,-0.35530000925064087,-0.8640999794006348,0.19243197223614078,0.023627540802087,-0.981025828088616,0.29789999127388,0.6255999803543091,-0.7210000157356262,0.08044195886956569,0.9894424773820601,-0.12055154584358733,0.583299994468689,0.5651999711990356,-0.5834000110626221,0.5508336345515219,-0.12832997885984362,-0.8246900772851533,0.6484000086784363,-0.3986999988555908,-0.6485000252723694,0.422273068734218,-0.650668419605885,-0.6311228589976491,0.6607000231742859,-0.35589998960494995,-0.6608999967575073,0.5569846039908094,0.023243924461984086,-0.8301974890908831,0.551800012588501,0.6252999901771545,-0.5519000291824341,0.12055154584358733,0.9894424773820601,-0.08044195886956569,0.7626000046730042,0.5651000142097473,-0.3147999942302704,0.8246900772851533,-0.12832997885984362,-0.5508336345515219,0.8479999899864197,-0.39800000190734863,-0.3499999940395355,0.6311228589976491,-0.650668419605885,-0.422273068734218,0.8641999959945679,-0.35519999265670776,-0.3564999997615814,0.8301974890908831,0.023243924461984086,-0.5569846039908094,0.7210999727249146,0.6255000233650208,-0.2980000078678131,0.14291142372842203,0.9893409658361559,-0.02794241017337756,0.973458284214919,-0.12702375109433608,-0.1903784009578562,0.746764468277477,-0.6487991657292128,-0.14629583544084326,0.981025828088616,0.023627540802087,-0.19243197223614078,0.3275777539387444,0.9426132072697088,0.06459997372414784,0.21799999475479126,0.9718000292778015,0.09019999951124191,0.23659999668598175,0.9715999960899353,0,0.16309406473662258,0.9860835381794821,0.03224254610169826,0.15960000455379486,0.9850000143051147,0.06599999964237213,0.17309999465942383,0.9848999977111816,0,0.18099512760445208,0.982833937027952,0.035752146922720544,0.3504999876022339,0.9253000020980835,0.14470000565052032,0.3797000050544739,0.9251000285148621,0,0.5235316128339348,0.8457082744477594,0.10340292497841669,0.48559999465942383,0.8507000207901001,0.20149999856948853,0.5267000198364258,0.8500999808311462,0,0.27649957959472143,0.9430486026192276,0.18495219809957497,0.16660000383853912,0.9718000292778015,0.16660000383853912,0.13770263578303485,0.9861891086646662,0.09202731143305214,0.12189999967813492,0.9850000143051147,0.12189999967813492,0.15275889985296257,0.9829686899991592,0.1021629727300915,0.2676999866962433,0.925599992275238,0.2676999866962433,0.44245158541572593,0.8465383737127242,0.29598881126645027,0.37130001187324524,0.8510000109672546,0.37130001187324524,0.18495219809957497,0.9430486026192276,0.27649957959472143,0.09019999951124191,0.9718000292778015,0.21799999475479126,0.09202731143305214,0.9861891086646662,0.13770263578303485,0.06599999964237213,0.9850000143051147,0.15960000455379486,0.1021629727300915,0.9829686899991592,0.15275889985296257,0.14470000565052032,0.9253000020980835,0.3504999876022339,0.29598881126645027,0.8465383737127242,0.44245158541572593,0.20149999856948853,0.8507000207901001,0.48559999465942383,0.06459997372414784,0.9426132072697088,0.3275777539387444,0,0.9715999960899353,0.23659999668598175,0.03224254610169826,0.9860835381794821,0.16309406473662258,0,0.9848999977111816,0.17309999465942383,0.035752146922720544,0.982833937027952,0.18099512760445208,0,0.9251000285148621,0.3797000050544739,0.1034029249784167,0.8457082744477595,0.5235316128339349,0,0.8500999808311462,0.5267000198364258,-0.06459997372414784,0.9426132072697088,0.3275777539387444,-0.09019999951124191,0.9718000292778015,0.21799999475479126,-0.03224254610169826,0.9860835381794821,0.16309406473662258,-0.06599999964237213,0.9850000143051147,0.15960000455379486,-0.035752146922720544,0.982833937027952,0.18099512760445208,-0.14470000565052032,0.9253000020980835,0.3504999876022339,-0.1034029249784167,0.8457082744477595,0.5235316128339349,-0.20149999856948853,0.8507000207901001,0.48559999465942383,-0.18495219809957497,0.9430486026192276,0.27649957959472143,-0.16660000383853912,0.9718000292778015,0.16660000383853912,-0.09202731143305214,0.9861891086646662,0.13770263578303485,-0.12189999967813492,0.9850000143051147,0.12189999967813492,-0.1021629727300915,0.9829686899991592,0.15275889985296257,-0.2676999866962433,0.925599992275238,0.2676999866962433,-0.29598881126645027,0.8465383737127242,0.44245158541572593,-0.37130001187324524,0.8510000109672546,0.37130001187324524,-0.27649957959472143,0.9430486026192276,0.18495219809957497,-0.21799999475479126,0.9718000292778015,0.09019999951124191,-0.13770263578303485,0.9861891086646662,0.09202731143305214,-0.15960000455379486,0.9850000143051147,0.06599999964237213,-0.15275889985296257,0.9829686899991592,0.1021629727300915,-0.3504999876022339,0.9253000020980835,0.14470000565052032,-0.44245158541572593,0.8465383737127242,0.29598881126645027,-0.48559999465942383,0.8507000207901001,0.20149999856948853,-0.3275777539387444,0.9426132072697088,0.06459997372414784,-0.23659999668598175,0.9715999960899353,0,-0.16309406473662258,0.9860835381794821,0.03224254610169826,-0.17309999465942383,0.9848999977111816,0,-0.18099512760445208,0.982833937027952,0.035752146922720544,-0.3797000050544739,0.9251000285148621,0,-0.5235316128339348,0.8457082744477594,0.10340292497841669,-0.5267000198364258,0.8500999808311462,0,-0.3275777539387444,0.9426132072697088,-0.06459997372414784,-0.21799999475479126,0.9718000292778015,-0.09019999951124191,-0.16309406473662258,0.9860835381794821,-0.03224254610169826,-0.15960000455379486,0.9850000143051147,-0.06599999964237213,-0.18099512760445208,0.982833937027952,-0.035752146922720544,-0.3504999876022339,0.9253000020980835,-0.14470000565052032,-0.5235316128339348,0.8457082744477594,-0.10340292497841669,-0.48559999465942383,0.8507000207901001,-0.20149999856948853,-0.27649957959472143,0.9430486026192276,-0.18495219809957497,-0.16660000383853912,0.9718000292778015,-0.16660000383853912,-0.13770263578303485,0.9861891086646662,-0.09202731143305214,-0.12189999967813492,0.9850000143051147,-0.12189999967813492,-0.15275889985296257,0.9829686899991592,-0.1021629727300915,-0.2676999866962433,0.925599992275238,-0.2676999866962433,-0.44245158541572593,0.8465383737127242,-0.29598881126645027,-0.37130001187324524,0.8510000109672546,-0.37130001187324524,-0.18495219809957497,0.9430486026192276,-0.27649957959472143,-0.09019999951124191,0.9718000292778015,-0.21799999475479126,-0.09202731143305214,0.9861891086646662,-0.13770263578303485,-0.06599999964237213,0.9850000143051147,-0.15960000455379486,-0.1021629727300915,0.9829686899991592,-0.15275889985296257,-0.14470000565052032,0.9253000020980835,-0.3504999876022339,-0.29598881126645027,0.8465383737127242,-0.44245158541572593,-0.20149999856948853,0.8507000207901001,-0.48559999465942383,-0.06459997372414784,0.9426132072697088,-0.3275777539387444,0,0.9715999960899353,-0.23659999668598175,-0.03224254610169826,0.9860835381794821,-0.16309406473662258,0,0.9848999977111816,-0.17309999465942383,-0.035752146922720544,0.982833937027952,-0.18099512760445208,0,0.9251000285148621,-0.3797000050544739,-0.1034029249784167,0.8457082744477595,-0.5235316128339349,0,0.8500999808311462,-0.5267000198364258,0.06459997372414784,0.9426132072697088,-0.3275777539387444,0.09019999951124191,0.9718000292778015,-0.21799999475479126,0.03224254610169826,0.9860835381794821,-0.16309406473662258,0.06599999964237213,0.9850000143051147,-0.15960000455379486,0.035752146922720544,0.982833937027952,-0.18099512760445208,0.14470000565052032,0.9253000020980835,-0.3504999876022339,0.1034029249784167,0.8457082744477595,-0.5235316128339349,0.20149999856948853,0.8507000207901001,-0.48559999465942383,0.18495219809957497,0.9430486026192276,-0.27649957959472143,0.16660000383853912,0.9718000292778015,-0.16660000383853912,0.09202731143305214,0.9861891086646662,-0.13770263578303485,0.12189999967813492,0.9850000143051147,-0.12189999967813492,0.1021629727300915,0.9829686899991592,-0.15275889985296257,0.2676999866962433,0.925599992275238,-0.2676999866962433,0.29598881126645027,0.8465383737127242,-0.44245158541572593,0.37130001187324524,0.8510000109672546,-0.37130001187324524,0.27649957959472143,0.9430486026192276,-0.18495219809957497,0.21799999475479126,0.9718000292778015,-0.09019999951124191,0.13770263578303485,0.9861891086646662,-0.09202731143305214,0.15960000455379486,0.9850000143051147,-0.06599999964237213,0.15275889985296257,0.9829686899991592,-0.1021629727300915,0.3504999876022339,0.9253000020980835,-0.14470000565052032,0.44245158541572593,0.8465383737127242,-0.29598881126645027,0.48559999465942383,0.8507000207901001,-0.20149999856948853,0.3275777539387444,0.9426132072697088,-0.06459997372414784,0.16309406473662258,0.9860835381794821,-0.03224254610169826,0.18099512760445208,0.982833937027952,-0.035752146922720544,0.5235316128339348,0.8457082744477594,-0.10340292497841669],\"uvs\":[[2,2,1.75,2,1.75,1.975000023841858,2,1.975000023841858,1.75,1.9500000476837158,2,1.9500000476837158,1.75,1.9249999523162842,2,1.9249999523162842,1.75,1.899999976158142,2,1.899999976158142,1.5,2,1.5,1.975000023841858,1.5,1.9500000476837158,1.5,1.9249999523162842,1.5,1.899999976158142,1.25,2,1.25,1.975000023841858,1.25,1.9500000476837158,1.25,1.9249999523162842,1.25,1.899999976158142,1,2,1,1.975000023841858,1,1.9500000476837158,1,1.9249999523162842,1,1.899999976158142,0.75,2,0.75,1.975000023841858,0.75,1.9500000476837158,0.75,1.9249999523162842,0.75,1.899999976158142,0.5,2,0.5,1.975000023841858,0.5,1.9500000476837158,0.5,1.9249999523162842,0.5,1.899999976158142,0.25,2,0.25,1.975000023841858,0.25,1.9500000476837158,0.25,1.9249999523162842,0.25,1.899999976158142,0,2,0,1.975000023841858,0,1.9500000476837158,0,1.9249999523162842,0,1.899999976158142,1.75,1.6749999523162842,2,1.6749999523162842,1.75,1.4500000476837158,2,1.4500000476837158,1.75,1.225000023841858,2,1.225000023841858,1.75,1,2,1,1.5,1.6749999523162842,1.5,1.4500000476837158,1.5,1.225000023841858,1.5,1,1.25,1.6749999523162842,1.25,1.4500000476837158,1.25,1.225000023841858,1.25,1,1,1.6749999523162842,1,1.4500000476837158,1,1.225000023841858,1,1,0.75,1.6749999523162842,0.75,1.4500000476837158,0.75,1.225000023841858,0.75,1,0.5,1.6749999523162842,0.5,1.4500000476837158,0.5,1.225000023841858,0.5,1,0.25,1.6749999523162842,0.25,1.4500000476837158,0.25,1.225000023841858,0.25,1,0,1.6749999523162842,0,1.4500000476837158,0,1.225000023841858,0,1,1.75,0.8500000238418579,2,0.8500000238418579,1.75,0.699999988079071,2,0.699999988079071,1.75,0.550000011920929,2,0.550000011920929,1.75,0.4000000059604645,2,0.4000000059604645,1.5,0.8500000238418579,1.5,0.699999988079071,1.5,0.550000011920929,1.5,0.4000000059604645,1.25,0.8500000238418579,1.25,0.699999988079071,1.25,0.550000011920929,1.25,0.4000000059604645,1,0.8500000238418579,1,0.699999988079071,1,0.550000011920929,1,0.4000000059604645,0.75,0.8500000238418579,0.75,0.699999988079071,0.75,0.550000011920929,0.75,0.4000000059604645,0.5,0.8500000238418579,0.5,0.699999988079071,0.5,0.550000011920929,0.5,0.4000000059604645,0.25,0.8500000238418579,0.25,0.699999988079071,0.25,0.550000011920929,0.25,0.4000000059604645,0,0.8500000238418579,0,0.699999988079071,0,0.550000011920929,0,0.4000000059604645,1.75,0.30000001192092896,2,0.30000001192092896,1.75,0.20000000298023224,2,0.20000000298023224,1.75,0.10000000149011612,2,0.10000000149011612,1.75,0,1.5,0.30000001192092896,1.5,0.20000000298023224,1.5,0.10000000149011612,1.5,0,1.25,0.30000001192092896,1.25,0.20000000298023224,1.25,0.10000000149011612,1.25,0,1,0.30000001192092896,1,0.20000000298023224,1,0.10000000149011612,1,0,0.75,0.30000001192092896,0.75,0.20000000298023224,0.75,0.10000000149011612,0.75,0,0.5,0.30000001192092896,0.5,0.20000000298023224,0.5,0.10000000149011612,0.5,0,0.25,0.30000001192092896,0.25,0.20000000298023224,0.25,0.10000000149011612,0.25,0,0,0.30000001192092896,0,0.20000000298023224,0,0.10000000149011612,0,0,0.875,1,0.875,0.875,1,0.875,0.875,0.75,1,0.75,0.875,0.625,1,0.625,0.875,0.5,1,0.5,0.75,0.875,0.75,0.75,0.75,0.625,0.75,0.5,0.625,1,0.625,0.875,0.625,0.75,0.625,0.625,0.625,0.5,0.5,0.875,0.5,0.75,0.5,0.625,0.5,0.5,0.375,1,0.375,0.875,0.375,0.75,0.375,0.625,0.375,0.5,0.25,0.875,0.25,0.75,0.25,0.625,0.25,0.5,0.125,1,0.125,0.875,0.125,0.75,0.125,0.625,0.125,0.5,0,0.875,0,0.75,0,0.625,0,0.5,0.875,0.375,1,0.375,0.875,0.25,1,0.25,0.875,0.125,1,0.125,0.875,0,0.75,0.375,0.75,0.25,0.75,0.125,0.625,0.375,0.625,0.25,0.625,0.125,0.625,0,0.5,0.375,0.5,0.25,0.5,0.125,0.375,0.375,0.375,0.25,0.375,0.125,0.375,0,0.25,0.375,0.25,0.25,0.25,0.125,0.125,0.375,0.125,0.25,0.125,0.125,0.125,0,0,0.375,0,0.25,0,0.125,0.625,0.22499999403953552,0.5,0.22499999403953552,0.625,0.44999998807907104,0.5,0.44999998807907104,0.625,0.675000011920929,0.5,0.675000011920929,0.625,0.8999999761581421,0.5,0.8999999761581421,0.75,0.22499999403953552,0.75,0.44999998807907104,0.75,0.675000011920929,0.75,0.8999999761581421,0.875,0.22499999403953552,0.875,0.44999998807907104,0.875,0.675000011920929,0.875,0.8999999761581421,1,0.22499999403953552,1,0.44999998807907104,1,0.675000011920929,1,0.8999999761581421,0.125,0.22499999403953552,0,0.22499999403953552,0.125,0.44999998807907104,0,0.44999998807907104,0.125,0.675000011920929,0,0.675000011920929,0.125,0.8999999761581421,0,0.8999999761581421,0.25,0.22499999403953552,0.25,0.44999998807907104,0.25,0.675000011920929,0.25,0.8999999761581421,0.375,0.22499999403953552,0.375,0.44999998807907104,0.375,0.675000011920929,0.375,0.8999999761581421,0.625,0.925000011920929,0.5,0.925000011920929,0.625,0.949999988079071,0.5,0.949999988079071,0.625,0.9750000238418579,0.5,0.9750000238418579,0.75,0.925000011920929,0.75,0.949999988079071,0.75,0.9750000238418579,0.875,0.925000011920929,0.875,0.949999988079071,0.875,0.9750000238418579,1,0.925000011920929,1,0.949999988079071,1,0.9750000238418579,0.125,0.925000011920929,0,0.925000011920929,0.125,0.949999988079071,0,0.949999988079071,0.125,0.9750000238418579,0,0.9750000238418579,0.25,0.925000011920929,0.25,0.949999988079071,0.25,0.9750000238418579,0.375,0.925000011920929,0.375,0.949999988079071,0.375,0.9750000238418579]],\"faces\":[56,0,1,2,0,1,2,0,1,2,3,56,0,2,3,0,2,3,0,1,3,4,56,3,2,4,3,2,4,5,4,3,6,56,3,4,5,3,4,5,5,4,6,7,56,5,4,6,5,4,6,8,7,6,9,56,5,6,7,5,6,7,8,7,9,10,56,7,6,8,7,6,8,11,10,9,12,56,7,8,9,7,8,9,11,10,12,13,56,1,10,11,1,10,11,14,2,15,16,56,1,11,2,1,11,2,14,2,16,3,56,2,11,12,2,11,12,17,3,16,18,56,2,12,4,2,12,4,17,3,18,6,56,4,12,13,4,12,13,19,6,18,20,56,4,13,6,4,13,6,19,6,20,9,56,6,13,14,6,13,14,21,9,20,22,56,6,14,8,6,14,8,21,9,22,12,56,10,15,16,10,15,16,23,15,24,25,56,10,16,11,10,16,11,23,15,25,16,56,11,16,17,11,16,17,26,16,25,27,56,11,17,12,11,17,12,26,16,27,18,56,12,17,18,12,17,18,28,18,27,29,56,12,18,13,12,18,13,28,18,29,20,56,13,18,19,13,18,19,30,20,29,31,56,13,19,14,13,19,14,30,20,31,22,56,15,20,21,15,20,21,32,24,33,34,56,15,21,16,15,21,16,32,24,34,25,56,16,21,22,16,21,22,35,25,34,36,56,16,22,17,16,22,17,35,25,36,27,56,17,22,23,17,22,23,37,27,36,38,56,17,23,18,17,23,18,37,27,38,29,56,18,23,24,18,23,24,39,29,38,40,56,18,24,19,18,24,19,39,29,40,31,56,20,25,26,20,25,26,41,33,42,43,56,20,26,21,20,26,21,41,33,43,34,56,21,26,27,21,26,27,44,34,43,45,56,21,27,22,21,27,22,44,34,45,36,56,22,27,28,22,27,28,46,36,45,47,56,22,28,23,22,28,23,46,36,47,38,56,23,28,29,23,28,29,48,38,47,49,56,23,29,24,23,29,24,48,38,49,40,56,25,30,31,25,30,31,50,42,51,52,56,25,31,26,25,31,26,50,42,52,43,56,26,31,32,26,31,32,53,43,52,54,56,26,32,27,26,32,27,53,43,54,45,56,27,32,33,27,32,33,55,45,54,56,56,27,33,28,27,33,28,55,45,56,47,56,28,33,34,28,33,34,57,47,56,58,56,28,34,29,28,34,29,57,47,58,49,56,30,35,36,30,35,36,59,51,60,61,56,30,36,31,30,36,31,59,51,61,52,56,31,36,37,31,36,37,62,52,61,63,56,31,37,32,31,37,32,62,52,63,54,56,32,37,38,32,37,38,64,54,63,65,56,32,38,33,32,38,33,64,54,65,56,56,33,38,39,33,38,39,66,56,65,67,56,33,39,34,33,39,34,66,56,67,58,56,35,40,41,35,40,41,68,60,69,70,56,35,41,36,35,41,36,68,60,70,61,56,36,41,42,36,41,42,71,61,70,72,56,36,42,37,36,42,37,71,61,72,63,56,37,42,43,37,42,43,73,63,72,74,56,37,43,38,37,43,38,73,63,74,65,56,38,43,44,38,43,44,75,65,74,76,56,38,44,39,38,44,39,75,65,76,67,56,40,45,46,0,1,2,77,69,78,79,56,40,46,41,0,2,3,77,69,79,70,56,41,46,47,3,2,4,80,70,79,81,56,41,47,42,3,4,5,80,70,81,72,56,42,47,48,5,4,6,82,72,81,83,56,42,48,43,5,6,7,82,72,83,74,56,43,48,49,7,6,8,84,74,83,85,56,43,49,44,7,8,9,84,74,85,76,56,45,50,51,1,10,11,86,78,87,88,56,45,51,46,1,11,2,86,78,88,79,56,46,51,52,2,11,12,89,79,88,90,56,46,52,47,2,12,4,89,79,90,81,56,47,52,53,4,12,13,91,81,90,92,56,47,53,48,4,13,6,91,81,92,83,56,48,53,54,6,13,14,93,83,92,94,56,48,54,49,6,14,8,93,83,94,85,56,50,55,56,10,15,16,95,87,96,97,56,50,56,51,10,16,11,95,87,97,88,56,51,56,57,11,16,17,98,88,97,99,56,51,57,52,11,17,12,98,88,99,90,56,52,57,58,12,17,18,100,90,99,101,56,52,58,53,12,18,13,100,90,101,92,56,53,58,59,13,18,19,102,92,101,103,56,53,59,54,13,19,14,102,92,103,94,56,55,60,61,15,20,21,104,96,105,106,56,55,61,56,15,21,16,104,96,106,97,56,56,61,62,16,21,22,107,97,106,108,56,56,62,57,16,22,17,107,97,108,99,56,57,62,63,17,22,23,109,99,108,110,56,57,63,58,17,23,18,109,99,110,101,56,58,63,64,18,23,24,111,101,110,112,56,58,64,59,18,24,19,111,101,112,103,56,60,65,66,20,25,26,113,105,114,115,56,60,66,61,20,26,21,113,105,115,106,56,61,66,67,21,26,27,116,106,115,117,56,61,67,62,21,27,22,116,106,117,108,56,62,67,68,22,27,28,118,108,117,119,56,62,68,63,22,28,23,118,108,119,110,56,63,68,69,23,28,29,120,110,119,121,56,63,69,64,23,29,24,120,110,121,112,56,65,70,71,25,30,31,122,114,123,124,56,65,71,66,25,31,26,122,114,124,115,56,66,71,72,26,31,32,125,115,124,126,56,66,72,67,26,32,27,125,115,126,117,56,67,72,73,27,32,33,127,117,126,128,56,67,73,68,27,33,28,127,117,128,119,56,68,73,74,28,33,34,129,119,128,130,56,68,74,69,28,34,29,129,119,130,121,56,70,75,76,30,35,36,131,123,132,133,56,70,76,71,30,36,31,131,123,133,124,56,71,76,77,31,36,37,134,124,133,135,56,71,77,72,31,37,32,134,124,135,126,56,72,77,78,32,37,38,136,126,135,137,56,72,78,73,32,38,33,136,126,137,128,56,73,78,79,33,38,39,138,128,137,139,56,73,79,74,33,39,34,138,128,139,130,56,75,0,3,35,40,41,140,132,1,4,56,75,3,76,35,41,36,140,132,4,133,56,76,3,5,36,41,42,141,133,4,7,56,76,5,77,36,42,37,141,133,7,135,56,77,5,7,37,42,43,142,135,7,10,56,77,7,78,37,43,38,142,135,10,137,56,78,7,9,38,43,44,143,137,10,13,56,78,9,79,38,44,39,143,137,13,139,56,9,8,80,9,8,45,144,13,12,145,56,9,80,81,9,45,46,144,13,145,146,56,81,80,82,46,45,47,147,146,145,148,56,81,82,83,46,47,48,147,146,148,149,56,83,82,84,48,47,49,150,149,148,151,56,83,84,85,48,49,50,150,149,151,152,56,85,84,86,50,49,51,153,152,151,154,56,85,86,87,50,51,52,153,152,154,155,56,8,14,88,8,14,53,156,12,22,157,56,8,88,80,8,53,45,156,12,157,145,56,80,88,89,45,53,54,158,145,157,159,56,80,89,82,45,54,47,158,145,159,148,56,82,89,90,47,54,55,160,148,159,161,56,82,90,84,47,55,49,160,148,161,151,56,84,90,91,49,55,56,162,151,161,163,56,84,91,86,49,56,51,162,151,163,154,56,14,19,92,14,19,57,164,22,31,165,56,14,92,88,14,57,53,164,22,165,157,56,88,92,93,53,57,58,166,157,165,167,56,88,93,89,53,58,54,166,157,167,159,56,89,93,94,54,58,59,168,159,167,169,56,89,94,90,54,59,55,168,159,169,161,56,90,94,95,55,59,60,170,161,169,171,56,90,95,91,55,60,56,170,161,171,163,56,19,24,96,19,24,61,172,31,40,173,56,19,96,92,19,61,57,172,31,173,165,56,92,96,97,57,61,62,174,165,173,175,56,92,97,93,57,62,58,174,165,175,167,56,93,97,98,58,62,63,176,167,175,177,56,93,98,94,58,63,59,176,167,177,169,56,94,98,99,59,63,64,178,169,177,179,56,94,99,95,59,64,60,178,169,179,171,56,24,29,100,24,29,65,180,40,49,181,56,24,100,96,24,65,61,180,40,181,173,56,96,100,101,61,65,66,182,173,181,183,56,96,101,97,61,66,62,182,173,183,175,56,97,101,102,62,66,67,184,175,183,185,56,97,102,98,62,67,63,184,175,185,177,56,98,102,103,63,67,68,186,177,185,187,56,98,103,99,63,68,64,186,177,187,179,56,29,34,104,29,34,69,188,49,58,189,56,29,104,100,29,69,65,188,49,189,181,56,100,104,105,65,69,70,190,181,189,191,56,100,105,101,65,70,66,190,181,191,183,56,101,105,106,66,70,71,192,183,191,193,56,101,106,102,66,71,67,192,183,193,185,56,102,106,107,67,71,72,194,185,193,195,56,102,107,103,67,72,68,194,185,195,187,56,34,39,108,34,39,73,196,58,67,197,56,34,108,104,34,73,69,196,58,197,189,56,104,108,109,69,73,74,198,189,197,199,56,104,109,105,69,74,70,198,189,199,191,56,105,109,110,70,74,75,200,191,199,201,56,105,110,106,70,75,71,200,191,201,193,56,106,110,111,71,75,76,202,193,201,203,56,106,111,107,71,76,72,202,193,203,195,56,39,44,112,39,44,77,204,67,76,205,56,39,112,108,39,77,73,204,67,205,197,56,108,112,113,73,77,78,206,197,205,207,56,108,113,109,73,78,74,206,197,207,199,56,109,113,114,74,78,79,208,199,207,209,56,109,114,110,74,79,75,208,199,209,201,56,110,114,115,75,79,80,210,201,209,211,56,110,115,111,75,80,76,210,201,211,203,56,44,49,116,9,8,45,212,76,85,213,56,44,116,112,9,45,46,212,76,213,205,56,112,116,117,46,45,47,214,205,213,215,56,112,117,113,46,47,48,214,205,215,207,56,113,117,118,48,47,49,216,207,215,217,56,113,118,114,48,49,50,216,207,217,209,56,114,118,119,50,49,51,218,209,217,219,56,114,119,115,50,51,52,218,209,219,211,56,49,54,120,8,14,53,220,85,94,221,56,49,120,116,8,53,45,220,85,221,213,56,116,120,121,45,53,54,222,213,221,223,56,116,121,117,45,54,47,222,213,223,215,56,117,121,122,47,54,55,224,215,223,225,56,117,122,118,47,55,49,224,215,225,217,56,118,122,123,49,55,56,226,217,225,227,56,118,123,119,49,56,51,226,217,227,219,56,54,59,124,14,19,57,228,94,103,229,56,54,124,120,14,57,53,228,94,229,221,56,120,124,125,53,57,58,230,221,229,231,56,120,125,121,53,58,54,230,221,231,223,56,121,125,126,54,58,59,232,223,231,233,56,121,126,122,54,59,55,232,223,233,225,56,122,126,127,55,59,60,234,225,233,235,56,122,127,123,55,60,56,234,225,235,227,56,59,64,128,19,24,61,236,103,112,237,56,59,128,124,19,61,57,236,103,237,229,56,124,128,129,57,61,62,238,229,237,239,56,124,129,125,57,62,58,238,229,239,231,56,125,129,130,58,62,63,240,231,239,241,56,125,130,126,58,63,59,240,231,241,233,56,126,130,131,59,63,64,242,233,241,243,56,126,131,127,59,64,60,242,233,243,235,56,64,69,132,24,29,65,244,112,121,245,56,64,132,128,24,65,61,244,112,245,237,56,128,132,133,61,65,66,246,237,245,247,56,128,133,129,61,66,62,246,237,247,239,56,129,133,134,62,66,67,248,239,247,249,56,129,134,130,62,67,63,248,239,249,241,56,130,134,135,63,67,68,250,241,249,251,56,130,135,131,63,68,64,250,241,251,243,56,69,74,136,29,34,69,252,121,130,253,56,69,136,132,29,69,65,252,121,253,245,56,132,136,137,65,69,70,254,245,253,255,56,132,137,133,65,70,66,254,245,255,247,56,133,137,138,66,70,71,256,247,255,257,56,133,138,134,66,71,67,256,247,257,249,56,134,138,139,67,71,72,258,249,257,259,56,134,139,135,67,72,68,258,249,259,251,56,74,79,140,34,39,73,260,130,139,261,56,74,140,136,34,73,69,260,130,261,253,56,136,140,141,69,73,74,262,253,261,263,56,136,141,137,69,74,70,262,253,263,255,56,137,141,142,70,74,75,264,255,263,265,56,137,142,138,70,75,71,264,255,265,257,56,138,142,143,71,75,76,266,257,265,267,56,138,143,139,71,76,72,266,257,267,259,56,79,9,81,39,44,77,268,139,13,146,56,79,81,140,39,77,73,268,139,146,261,56,140,81,83,73,77,78,269,261,146,149,56,140,83,141,73,78,74,269,261,149,263,56,141,83,85,74,78,79,270,263,149,152,56,141,85,142,74,79,75,270,263,152,265,56,142,85,87,75,79,80,271,265,152,155,56,142,87,143,75,80,76,271,265,155,267,56,87,86,144,52,51,81,272,155,154,273,56,87,144,145,52,81,82,272,155,273,274,56,145,144,146,82,81,83,275,274,273,276,56,145,146,147,82,83,84,275,274,276,277,56,147,146,148,84,83,85,278,277,276,279,56,147,148,149,84,85,86,278,277,279,280,56,149,148,150,86,85,87,281,280,279,282,56,149,150,151,86,87,88,281,280,282,283,56,86,91,152,51,56,89,284,154,163,285,56,86,152,144,51,89,81,284,154,285,273,56,144,152,153,81,89,90,286,273,285,287,56,144,153,146,81,90,83,286,273,287,276,56,146,153,154,83,90,91,288,276,287,289,56,146,154,148,83,91,85,288,276,289,279,56,148,154,155,85,91,92,290,279,289,291,56,148,155,150,85,92,87,290,279,291,282,56,91,95,156,56,60,93,292,163,171,293,56,91,156,152,56,93,89,292,163,293,285,56,152,156,157,89,93,94,294,285,293,295,56,152,157,153,89,94,90,294,285,295,287,56,153,157,158,90,94,95,296,287,295,297,56,153,158,154,90,95,91,296,287,297,289,56,154,158,159,91,95,96,298,289,297,299,56,154,159,155,91,96,92,298,289,299,291,56,95,99,160,60,64,97,300,171,179,301,56,95,160,156,60,97,93,300,171,301,293,56,156,160,161,93,97,98,302,293,301,303,56,156,161,157,93,98,94,302,293,303,295,56,157,161,162,94,98,99,304,295,303,305,56,157,162,158,94,99,95,304,295,305,297,56,158,162,163,95,99,100,306,297,305,307,56,158,163,159,95,100,96,306,297,307,299,56,99,103,164,64,68,101,308,179,187,309,56,99,164,160,64,101,97,308,179,309,301,56,160,164,165,97,101,102,310,301,309,311,56,160,165,161,97,102,98,310,301,311,303,56,161,165,166,98,102,103,312,303,311,313,56,161,166,162,98,103,99,312,303,313,305,56,162,166,167,99,103,104,314,305,313,315,56,162,167,163,99,104,100,314,305,315,307,56,103,107,168,68,72,105,316,187,195,317,56,103,168,164,68,105,101,316,187,317,309,56,164,168,169,101,105,106,318,309,317,319,56,164,169,165,101,106,102,318,309,319,311,56,165,169,170,102,106,107,320,311,319,321,56,165,170,166,102,107,103,320,311,321,313,56,166,170,171,103,107,108,322,313,321,323,56,166,171,167,103,108,104,322,313,323,315,56,107,111,172,72,76,109,324,195,203,325,56,107,172,168,72,109,105,324,195,325,317,56,168,172,173,105,109,110,326,317,325,327,56,168,173,169,105,110,106,326,317,327,319,56,169,173,174,106,110,111,328,319,327,329,56,169,174,170,106,111,107,328,319,329,321,56,170,174,175,107,111,112,330,321,329,331,56,170,175,171,107,112,108,330,321,331,323,56,111,115,176,76,80,113,332,203,211,333,56,111,176,172,76,113,109,332,203,333,325,56,172,176,177,109,113,114,334,325,333,335,56,172,177,173,109,114,110,334,325,335,327,56,173,177,178,110,114,115,336,327,335,337,56,173,178,174,110,115,111,336,327,337,329,56,174,178,179,111,115,116,338,329,337,339,56,174,179,175,111,116,112,338,329,339,331,56,115,119,180,52,51,81,340,211,219,341,56,115,180,176,52,81,82,340,211,341,333,56,176,180,181,82,81,83,342,333,341,343,56,176,181,177,82,83,84,342,333,343,335,56,177,181,182,84,83,85,344,335,343,345,56,177,182,178,84,85,86,344,335,345,337,56,178,182,183,86,85,87,346,337,345,347,56,178,183,179,86,87,88,346,337,347,339,56,119,123,184,51,56,89,348,219,227,349,56,119,184,180,51,89,81,348,219,349,341,56,180,184,185,81,89,90,350,341,349,351,56,180,185,181,81,90,83,350,341,351,343,56,181,185,186,83,90,91,352,343,351,353,56,181,186,182,83,91,85,352,343,353,345,56,182,186,187,85,91,92,354,345,353,355,56,182,187,183,85,92,87,354,345,355,347,56,123,127,188,56,60,93,356,227,235,357,56,123,188,184,56,93,89,356,227,357,349,56,184,188,189,89,93,94,358,349,357,359,56,184,189,185,89,94,90,358,349,359,351,56,185,189,190,90,94,95,360,351,359,361,56,185,190,186,90,95,91,360,351,361,353,56,186,190,191,91,95,96,362,353,361,363,56,186,191,187,91,96,92,362,353,363,355,56,127,131,192,60,64,97,364,235,243,365,56,127,192,188,60,97,93,364,235,365,357,56,188,192,193,93,97,98,366,357,365,367,56,188,193,189,93,98,94,366,357,367,359,56,189,193,194,94,98,99,368,359,367,369,56,189,194,190,94,99,95,368,359,369,361,56,190,194,195,95,99,100,370,361,369,371,56,190,195,191,95,100,96,370,361,371,363,56,131,135,196,64,68,101,372,243,251,373,56,131,196,192,64,101,97,372,243,373,365,56,192,196,197,97,101,102,374,365,373,375,56,192,197,193,97,102,98,374,365,375,367,56,193,197,198,98,102,103,376,367,375,377,56,193,198,194,98,103,99,376,367,377,369,56,194,198,199,99,103,104,378,369,377,379,56,194,199,195,99,104,100,378,369,379,371,56,135,139,200,68,72,105,380,251,259,381,56,135,200,196,68,105,101,380,251,381,373,56,196,200,201,101,105,106,382,373,381,383,56,196,201,197,101,106,102,382,373,383,375,56,197,201,202,102,106,107,384,375,383,385,56,197,202,198,102,107,103,384,375,385,377,56,198,202,203,103,107,108,386,377,385,387,56,198,203,199,103,108,104,386,377,387,379,56,139,143,204,72,76,109,388,259,267,389,56,139,204,200,72,109,105,388,259,389,381,56,200,204,205,105,109,110,390,381,389,391,56,200,205,201,105,110,106,390,381,391,383,56,201,205,206,106,110,111,392,383,391,393,56,201,206,202,106,111,107,392,383,393,385,56,202,206,207,107,111,112,394,385,393,395,56,202,207,203,107,112,108,394,385,395,387,56,143,87,145,76,80,113,396,267,155,274,56,143,145,204,76,113,109,396,267,274,389,56,204,145,147,109,113,114,397,389,274,277,56,204,147,205,109,114,110,397,389,277,391,56,205,147,149,110,114,115,398,391,277,280,56,205,149,206,110,115,111,398,391,280,393,56,206,149,151,111,115,116,399,393,280,283,56,206,151,207,111,116,112,399,393,283,395,56,151,150,208,88,87,117,400,283,282,401,56,151,208,209,88,117,118,400,283,401,402,56,209,208,210,118,117,119,403,402,401,404,56,209,210,211,118,119,120,403,402,404,405,56,211,210,212,120,119,121,406,405,404,407,56,211,212,213,120,121,122,406,405,407,408,56,213,212,214,122,121,123,409,408,407,410,56,150,155,215,87,92,124,411,282,291,412,56,150,215,208,87,124,117,411,282,412,401,56,208,215,216,117,124,125,413,401,412,414,56,208,216,210,117,125,119,413,401,414,404,56,210,216,217,119,125,126,415,404,414,416,56,210,217,212,119,126,121,415,404,416,407,56,212,217,214,121,126,127,417,407,416,410,56,155,159,218,92,96,128,418,291,299,419,56,155,218,215,92,128,124,418,291,419,412,56,215,218,219,124,128,129,420,412,419,421,56,215,219,216,124,129,125,420,412,421,414,56,216,219,220,125,129,130,422,414,421,423,56,216,220,217,125,130,126,422,414,423,416,56,217,220,214,126,130,131,424,416,423,410,56,159,163,221,96,100,132,425,299,307,426,56,159,221,218,96,132,128,425,299,426,419,56,218,221,222,128,132,133,427,419,426,428,56,218,222,219,128,133,129,427,419,428,421,56,219,222,223,129,133,134,429,421,428,430,56,219,223,220,129,134,130,429,421,430,423,56,220,223,214,130,134,135,431,423,430,410,56,163,167,224,100,104,136,432,307,315,433,56,163,224,221,100,136,132,432,307,433,426,56,221,224,225,132,136,137,434,426,433,435,56,221,225,222,132,137,133,434,426,435,428,56,222,225,226,133,137,138,436,428,435,437,56,222,226,223,133,138,134,436,428,437,430,56,223,226,214,134,138,139,438,430,437,410,56,167,171,227,104,108,140,439,315,323,440,56,167,227,224,104,140,136,439,315,440,433,56,224,227,228,136,140,141,441,433,440,442,56,224,228,225,136,141,137,441,433,442,435,56,225,228,229,137,141,142,443,435,442,444,56,225,229,226,137,142,138,443,435,444,437,56,226,229,214,138,142,143,445,437,444,410,56,171,175,230,108,112,144,446,323,331,447,56,171,230,227,108,144,140,446,323,447,440,56,227,230,231,140,144,145,448,440,447,449,56,227,231,228,140,145,141,448,440,449,442,56,228,231,232,141,145,146,450,442,449,451,56,228,232,229,141,146,142,450,442,451,444,56,229,232,214,142,146,147,452,444,451,410,56,175,179,233,112,116,148,453,331,339,454,56,175,233,230,112,148,144,453,331,454,447,56,230,233,234,144,148,149,455,447,454,456,56,230,234,231,144,149,145,455,447,456,449,56,231,234,235,145,149,150,457,449,456,458,56,231,235,232,145,150,146,457,449,458,451,56,232,235,214,146,150,151,459,451,458,410,56,179,183,236,88,87,117,460,339,347,461,56,179,236,233,88,117,118,460,339,461,454,56,233,236,237,118,117,119,462,454,461,463,56,233,237,234,118,119,120,462,454,463,456,56,234,237,238,120,119,121,464,456,463,465,56,234,238,235,120,121,122,464,456,465,458,56,235,238,214,122,121,123,466,458,465,410,56,183,187,239,87,92,124,467,347,355,468,56,183,239,236,87,124,117,467,347,468,461,56,236,239,240,117,124,125,469,461,468,470,56,236,240,237,117,125,119,469,461,470,463,56,237,240,241,119,125,126,471,463,470,472,56,237,241,238,119,126,121,471,463,472,465,56,238,241,214,121,126,127,473,465,472,410,56,187,191,242,92,96,128,474,355,363,475,56,187,242,239,92,128,124,474,355,475,468,56,239,242,243,124,128,129,476,468,475,477,56,239,243,240,124,129,125,476,468,477,470,56,240,243,244,125,129,130,478,470,477,479,56,240,244,241,125,130,126,478,470,479,472,56,241,244,214,126,130,131,480,472,479,410,56,191,195,245,96,100,132,481,363,371,482,56,191,245,242,96,132,128,481,363,482,475,56,242,245,246,128,132,133,483,475,482,484,56,242,246,243,128,133,129,483,475,484,477,56,243,246,247,129,133,134,485,477,484,486,56,243,247,244,129,134,130,485,477,486,479,56,244,247,214,130,134,135,487,479,486,410,56,195,199,248,100,104,136,488,371,379,489,56,195,248,245,100,136,132,488,371,489,482,56,245,248,249,132,136,137,490,482,489,491,56,245,249,246,132,137,133,490,482,491,484,56,246,249,250,133,137,138,492,484,491,493,56,246,250,247,133,138,134,492,484,493,486,56,247,250,214,134,138,139,494,486,493,410,56,199,203,251,104,108,140,495,379,387,496,56,199,251,248,104,140,136,495,379,496,489,56,248,251,252,136,140,141,497,489,496,498,56,248,252,249,136,141,137,497,489,498,491,56,249,252,253,137,141,142,499,491,498,500,56,249,253,250,137,142,138,499,491,500,493,56,250,253,214,138,142,143,501,493,500,410,56,203,207,254,108,112,144,502,387,395,503,56,203,254,251,108,144,140,502,387,503,496,56,251,254,255,140,144,145,504,496,503,505,56,251,255,252,140,145,141,504,496,505,498,56,252,255,256,141,145,146,506,498,505,507,56,252,256,253,141,146,142,506,498,507,500,56,253,256,214,142,146,147,508,500,507,410,56,207,151,209,112,116,148,509,395,283,402,56,207,209,254,112,148,144,509,395,402,503,56,254,209,211,144,148,149,510,503,402,405,56,254,211,255,144,149,145,510,503,405,505,56,255,211,213,145,149,150,511,505,405,408,56,255,213,256,145,150,146,511,505,408,507,56,256,213,214,146,150,151,512,507,408,410,56,257,258,259,64,152,153,513,514,515,516,56,257,259,260,64,153,154,513,514,516,517,56,260,259,261,154,153,155,518,517,516,519,56,260,261,262,154,155,156,518,517,519,520,56,262,261,263,156,155,157,521,520,519,522,56,262,263,264,156,157,158,521,520,522,523,56,264,263,265,158,157,159,524,523,522,525,56,264,265,266,158,159,160,524,523,525,526,56,258,267,268,152,68,161,527,515,528,529,56,258,268,259,152,161,153,527,515,529,516,56,259,268,269,153,161,162,530,516,529,531,56,259,269,261,153,162,155,530,516,531,519,56,261,269,270,155,162,163,532,519,531,533,56,261,270,263,155,163,157,532,519,533,522,56,263,270,271,157,163,164,534,522,533,535,56,263,271,265,157,164,159,534,522,535,525,56,267,272,273,68,165,166,536,528,537,538,56,267,273,268,68,166,161,536,528,538,529,56,268,273,274,161,166,167,539,529,538,540,56,268,274,269,161,167,162,539,529,540,531,56,269,274,275,162,167,168,541,531,540,542,56,269,275,270,162,168,163,541,531,542,533,56,270,275,276,163,168,169,543,533,542,544,56,270,276,271,163,169,164,543,533,544,535,56,272,277,278,165,72,170,545,537,546,547,56,272,278,273,165,170,166,545,537,547,538,56,273,278,279,166,170,171,548,538,547,549,56,273,279,274,166,171,167,548,538,549,540,56,274,279,280,167,171,172,550,540,549,551,56,274,280,275,167,172,168,550,540,551,542,56,275,280,281,168,172,173,552,542,551,553,56,275,281,276,168,173,169,552,542,553,544,56,277,282,283,72,174,175,554,546,555,556,56,277,283,278,72,175,170,554,546,556,547,56,278,283,284,170,175,176,557,547,556,558,56,278,284,279,170,176,171,557,547,558,549,56,279,284,285,171,176,177,559,549,558,560,56,279,285,280,171,177,172,559,549,560,551,56,280,285,286,172,177,178,561,551,560,562,56,280,286,281,172,178,173,561,551,562,553,56,282,287,288,174,76,179,563,555,564,565,56,282,288,283,174,179,175,563,555,565,556,56,283,288,289,175,179,180,566,556,565,567,56,283,289,284,175,180,176,566,556,567,558,56,284,289,290,176,180,181,568,558,567,569,56,284,290,285,176,181,177,568,558,569,560,56,285,290,291,177,181,182,570,560,569,571,56,285,291,286,177,182,178,570,560,571,562,56,287,292,293,76,183,184,572,564,573,574,56,287,293,288,76,184,179,572,564,574,565,56,288,293,294,179,184,185,575,565,574,576,56,288,294,289,179,185,180,575,565,576,567,56,289,294,295,180,185,186,577,567,576,578,56,289,295,290,180,186,181,577,567,578,569,56,290,295,296,181,186,187,579,569,578,580,56,290,296,291,181,187,182,579,569,580,571,56,292,257,260,183,80,188,581,573,514,517,56,292,260,293,183,188,184,581,573,517,574,56,293,260,262,184,188,189,582,574,517,520,56,293,262,294,184,189,185,582,574,520,576,56,294,262,264,185,189,190,583,576,520,523,56,294,264,295,185,190,186,583,576,523,578,56,295,264,266,186,190,191,584,578,523,526,56,295,266,296,186,191,187,584,578,526,580,56,266,265,297,160,159,192,585,526,525,586,56,266,297,298,160,192,193,585,526,586,587,56,298,297,299,193,192,194,588,587,586,589,56,298,299,300,193,194,195,588,587,589,590,56,300,299,301,195,194,196,591,590,589,592,56,300,301,302,195,196,197,591,590,592,593,56,302,301,303,197,196,198,594,593,592,595,56,302,303,115,197,198,135,594,593,595,596,56,265,271,304,159,164,199,597,525,535,598,56,265,304,297,159,199,192,597,525,598,586,56,297,304,305,192,199,200,599,586,598,600,56,297,305,299,192,200,194,599,586,600,589,56,299,305,306,194,200,201,601,589,600,602,56,299,306,301,194,201,196,601,589,602,592,56,301,306,307,196,201,139,603,592,602,604,56,301,307,303,196,139,198,603,592,604,595,56,271,276,308,164,169,202,605,535,544,606,56,271,308,304,164,202,199,605,535,606,598,56,304,308,309,199,202,203,607,598,606,608,56,304,309,305,199,203,200,607,598,608,600,56,305,309,310,200,203,204,609,600,608,610,56,305,310,306,200,204,201,609,600,610,602,56,306,310,311,201,204,205,611,602,610,612,56,306,311,307,201,205,139,611,602,612,604,56,276,281,312,169,173,206,613,544,553,614,56,276,312,308,169,206,202,613,544,614,606,56,308,312,313,202,206,207,615,606,614,616,56,308,313,309,202,207,203,615,606,616,608,56,309,313,314,203,207,208,617,608,616,618,56,309,314,310,203,208,204,617,608,618,610,56,310,314,315,204,208,143,619,610,618,620,56,310,315,311,204,143,205,619,610,620,612,56,281,286,316,173,178,209,621,553,562,622,56,281,316,312,173,209,206,621,553,622,614,56,312,316,317,206,209,210,623,614,622,624,56,312,317,313,206,210,207,623,614,624,616,56,313,317,318,207,210,211,625,616,624,626,56,313,318,314,207,211,208,625,616,626,618,56,314,318,319,208,211,212,627,618,626,628,56,314,319,315,208,212,143,627,618,628,620,56,286,291,320,178,182,213,629,562,571,630,56,286,320,316,178,213,209,629,562,630,622,56,316,320,321,209,213,214,631,622,630,632,56,316,321,317,209,214,210,631,622,632,624,56,317,321,322,210,214,215,633,624,632,634,56,317,322,318,210,215,211,633,624,634,626,56,318,322,323,211,215,147,635,626,634,636,56,318,323,319,211,147,212,635,626,636,628,56,291,296,324,182,187,216,637,571,580,638,56,291,324,320,182,216,213,637,571,638,630,56,320,324,325,213,216,217,639,630,638,640,56,320,325,321,213,217,214,639,630,640,632,56,321,325,326,214,217,218,641,632,640,642,56,321,326,322,214,218,215,641,632,642,634,56,322,326,327,215,218,219,643,634,642,644,56,322,327,323,215,219,147,643,634,644,636,56,296,266,298,187,191,220,645,580,526,587,56,296,298,324,187,220,216,645,580,587,638,56,324,298,300,216,220,221,646,638,587,590,56,324,300,325,216,221,217,646,638,590,640,56,325,300,302,217,221,222,647,640,590,593,56,325,302,326,217,222,218,647,640,593,642,56,326,302,115,218,222,151,648,642,593,596,56,326,115,327,218,151,219,648,642,596,644,56,328,329,330,143,205,223,649,650,651,652,56,328,330,331,143,223,224,649,650,652,653,56,331,330,332,224,223,225,654,653,652,655,56,331,332,333,224,225,226,654,653,655,656,56,333,332,334,226,225,227,657,656,655,658,56,333,334,335,226,227,228,657,656,658,659,56,335,334,336,228,227,229,660,659,658,661,56,335,336,337,228,229,230,660,659,661,662,56,329,338,339,205,139,231,663,651,664,665,56,329,339,330,205,231,223,663,651,665,652,56,330,339,340,223,231,232,666,652,665,667,56,330,340,332,223,232,225,666,652,667,655,56,332,340,341,225,232,233,668,655,667,669,56,332,341,334,225,233,227,668,655,669,658,56,334,341,342,227,233,234,670,658,669,671,56,334,342,336,227,234,229,670,658,671,661,56,338,343,344,139,198,235,672,664,673,674,56,338,344,339,139,235,231,672,664,674,665,56,339,344,345,231,235,236,675,665,674,676,56,339,345,340,231,236,232,675,665,676,667,56,340,345,346,232,236,237,677,667,676,678,56,340,346,341,232,237,233,677,667,678,669,56,341,346,347,233,237,238,679,669,678,680,56,341,347,342,233,238,234,679,669,680,671,56,343,348,349,198,135,239,681,673,682,683,56,343,349,344,198,239,235,681,673,683,674,56,344,349,350,235,239,240,684,674,683,685,56,344,350,345,235,240,236,684,674,685,676,56,345,350,351,236,240,241,686,676,685,687,56,345,351,346,236,241,237,686,676,687,678,56,346,351,352,237,241,242,688,678,687,689,56,346,352,347,237,242,238,688,678,689,680,56,348,353,354,151,219,243,690,682,691,692,56,348,354,349,151,243,244,690,682,692,683,56,349,354,355,244,243,245,693,683,692,694,56,349,355,350,244,245,246,693,683,694,685,56,350,355,356,246,245,247,695,685,694,696,56,350,356,351,246,247,248,695,685,696,687,56,351,356,357,248,247,249,697,687,696,698,56,351,357,352,248,249,250,697,687,698,689,56,353,358,359,219,147,251,699,691,700,701,56,353,359,354,219,251,243,699,691,701,692,56,354,359,360,243,251,252,702,692,701,703,56,354,360,355,243,252,245,702,692,703,694,56,355,360,361,245,252,253,704,694,703,705,56,355,361,356,245,253,247,704,694,705,696,56,356,361,362,247,253,254,706,696,705,707,56,356,362,357,247,254,249,706,696,707,698,56,358,363,364,147,212,255,708,700,709,710,56,358,364,359,147,255,251,708,700,710,701,56,359,364,365,251,255,256,711,701,710,712,56,359,365,360,251,256,252,711,701,712,703,56,360,365,366,252,256,257,713,703,712,714,56,360,366,361,252,257,253,713,703,714,705,56,361,366,367,253,257,258,715,705,714,716,56,361,367,362,253,258,254,715,705,716,707,56,363,328,331,212,143,224,717,709,650,653,56,363,331,364,212,224,255,717,709,653,710,56,364,331,333,255,224,226,718,710,653,656,56,364,333,365,255,226,256,718,710,656,712,56,365,333,335,256,226,228,719,712,656,659,56,365,335,366,256,228,257,719,712,659,714,56,366,335,337,257,228,230,720,714,659,662,56,366,337,367,257,230,258,720,714,662,716,56,337,336,368,230,229,259,721,662,661,722,56,337,368,369,230,259,260,721,662,722,723,56,369,368,370,260,259,261,724,723,722,725,56,369,370,371,260,261,262,724,723,725,726,56,371,370,372,262,261,263,727,726,725,728,56,371,372,373,262,263,264,727,726,728,729,56,373,372,374,264,263,165,730,729,728,731,56,373,374,375,264,165,72,730,729,731,732,56,336,342,376,229,234,265,733,661,671,734,56,336,376,368,229,265,259,733,661,734,722,56,368,376,377,259,265,266,735,722,734,736,56,368,377,370,259,266,261,735,722,736,725,56,370,377,378,261,266,267,737,725,736,738,56,370,378,372,261,267,263,737,725,738,728,56,372,378,379,263,267,68,739,728,738,740,56,372,379,374,263,68,165,739,728,740,731,56,342,347,380,234,238,268,741,671,680,742,56,342,380,376,234,268,265,741,671,742,734,56,376,380,381,265,268,269,743,734,742,744,56,376,381,377,265,269,266,743,734,744,736,56,377,381,382,266,269,270,745,736,744,746,56,377,382,378,266,270,267,745,736,746,738,56,378,382,383,267,270,152,747,738,746,748,56,378,383,379,267,152,68,747,738,748,740,56,347,352,384,238,242,271,749,680,689,750,56,347,384,380,238,271,268,749,680,750,742,56,380,384,385,268,271,272,751,742,750,752,56,380,385,381,268,272,269,751,742,752,744,56,381,385,386,269,272,273,753,744,752,754,56,381,386,382,269,273,270,753,744,754,746,56,382,386,387,270,273,64,755,746,754,756,56,382,387,383,270,64,152,755,746,756,748,56,352,357,388,250,249,274,757,689,698,758,56,352,388,384,250,274,275,757,689,758,750,56,384,388,389,275,274,276,759,750,758,760,56,384,389,385,275,276,277,759,750,760,752,56,385,389,390,277,276,278,761,752,760,762,56,385,390,386,277,278,279,761,752,762,754,56,386,390,391,279,278,183,763,754,762,764,56,386,391,387,279,183,80,763,754,764,756,56,357,362,392,249,254,280,765,698,707,766,56,357,392,388,249,280,274,765,698,766,758,56,388,392,393,274,280,281,767,758,766,768,56,388,393,389,274,281,276,767,758,768,760,56,389,393,394,276,281,282,769,760,768,770,56,389,394,390,276,282,278,769,760,770,762,56,390,394,395,278,282,76,771,762,770,772,56,390,395,391,278,76,183,771,762,772,764,56,362,367,396,254,258,283,773,707,716,774,56,362,396,392,254,283,280,773,707,774,766,56,392,396,397,280,283,284,775,766,774,776,56,392,397,393,280,284,281,775,766,776,768,56,393,397,398,281,284,285,777,768,776,778,56,393,398,394,281,285,282,777,768,778,770,56,394,398,399,282,285,174,779,770,778,780,56,394,399,395,282,174,76,779,770,780,772,56,367,337,369,258,230,260,781,716,662,723,56,367,369,396,258,260,283,781,716,723,774,56,396,369,371,283,260,262,782,774,723,726,56,396,371,397,283,262,284,782,774,726,776,56,397,371,373,284,262,264,783,776,726,729,56,397,373,398,284,264,285,783,776,729,778,56,398,373,375,285,264,72,784,778,729,732,56,398,375,399,285,72,174,784,778,732,780,56,400,401,402,155,156,64,785,786,787,788,56,401,400,403,156,155,159,789,787,786,790,56,401,403,404,156,159,160,789,787,790,791,56,404,403,405,160,159,194,792,791,790,793,56,404,405,406,160,194,195,792,791,793,794,56,406,405,407,195,194,198,795,794,793,796,56,406,407,408,195,198,135,795,794,796,797,56,409,400,402,162,155,152,798,799,786,788,56,400,409,410,155,162,164,800,786,799,801,56,400,410,403,155,164,159,800,786,801,790,56,403,410,411,159,164,200,802,790,801,803,56,403,411,405,159,200,194,802,790,803,793,56,405,411,412,194,200,139,804,793,803,805,56,405,412,407,194,139,198,804,793,805,796,56,413,409,402,167,162,68,806,807,799,788,56,409,413,414,162,167,169,808,799,807,809,56,409,414,410,162,169,164,808,799,809,801,56,410,414,415,164,169,203,810,801,809,811,56,410,415,411,164,203,200,810,801,811,803,56,411,415,416,200,203,205,812,803,811,813,56,411,416,412,200,205,139,812,803,813,805,56,417,413,402,171,167,165,814,815,807,788,56,413,417,418,167,171,173,816,807,815,817,56,413,418,414,167,173,169,816,807,817,809,56,414,418,419,169,173,207,818,809,817,819,56,414,419,415,169,207,203,818,809,819,811,56,415,419,420,203,207,143,820,811,819,821,56,415,420,416,203,143,205,820,811,821,813,56,421,417,402,176,171,72,822,823,815,788,56,417,421,422,171,176,178,824,815,823,825,56,417,422,418,171,178,173,824,815,825,817,56,418,422,423,173,178,210,826,817,825,827,56,418,423,419,173,210,207,826,817,827,819,56,419,423,424,207,210,212,828,819,827,829,56,419,424,420,207,212,143,828,819,829,821,56,425,421,402,180,176,174,830,831,823,788,56,421,425,426,176,180,182,832,823,831,833,56,421,426,422,176,182,178,832,823,833,825,56,422,426,427,178,182,214,834,825,833,835,56,422,427,423,178,214,210,834,825,835,827,56,423,427,428,210,214,147,836,827,835,837,56,423,428,424,210,147,212,836,827,837,829,56,429,425,402,185,180,76,838,839,831,788,56,425,429,430,180,185,187,840,831,839,841,56,425,430,426,180,187,182,840,831,841,833,56,426,430,431,182,187,217,842,833,841,843,56,426,431,427,182,217,214,842,833,843,835,56,427,431,432,214,217,219,844,835,843,845,56,427,432,428,214,219,147,844,835,845,837,56,433,429,402,189,185,183,846,847,839,788,56,429,433,434,185,189,191,848,839,847,849,56,429,434,430,185,191,187,848,839,849,841,56,430,434,435,187,191,221,850,841,849,851,56,430,435,431,187,221,217,850,841,851,843,56,431,435,436,217,221,151,852,843,851,853,56,431,436,432,217,151,219,852,843,853,845,56,437,433,402,155,156,64,854,855,847,788,56,433,437,438,156,155,159,856,847,855,857,56,433,438,434,156,159,160,856,847,857,849,56,434,438,439,160,159,194,858,849,857,859,56,434,439,435,160,194,195,858,849,859,851,56,435,439,440,195,194,198,860,851,859,861,56,435,440,436,195,198,135,860,851,861,853,56,441,437,402,162,155,152,862,863,855,788,56,437,441,442,155,162,164,864,855,863,865,56,437,442,438,155,164,159,864,855,865,857,56,438,442,443,159,164,200,866,857,865,867,56,438,443,439,159,200,194,866,857,867,859,56,439,443,444,194,200,139,868,859,867,869,56,439,444,440,194,139,198,868,859,869,861,56,445,441,402,167,162,68,870,871,863,788,56,441,445,446,162,167,169,872,863,871,873,56,441,446,442,162,169,164,872,863,873,865,56,442,446,447,164,169,203,874,865,873,875,56,442,447,443,164,203,200,874,865,875,867,56,443,447,448,200,203,205,876,867,875,877,56,443,448,444,200,205,139,876,867,877,869,56,449,445,402,171,167,165,878,879,871,788,56,445,449,450,167,171,173,880,871,879,881,56,445,450,446,167,173,169,880,871,881,873,56,446,450,451,169,173,207,882,873,881,883,56,446,451,447,169,207,203,882,873,883,875,56,447,451,452,203,207,143,884,875,883,885,56,447,452,448,203,143,205,884,875,885,877,56,453,449,402,176,171,72,886,887,879,788,56,449,453,454,171,176,178,888,879,887,889,56,449,454,450,171,178,173,888,879,889,881,56,450,454,455,173,178,210,890,881,889,891,56,450,455,451,173,210,207,890,881,891,883,56,451,455,456,207,210,212,892,883,891,893,56,451,456,452,207,212,143,892,883,893,885,56,457,453,402,180,176,174,894,895,887,788,56,453,457,458,176,180,182,896,887,895,897,56,453,458,454,176,182,178,896,887,897,889,56,454,458,459,178,182,214,898,889,897,899,56,454,459,455,178,214,210,898,889,899,891,56,455,459,460,210,214,147,900,891,899,901,56,455,460,456,210,147,212,900,891,901,893,56,461,457,402,185,180,76,902,903,895,788,56,457,461,462,180,185,187,904,895,903,905,56,457,462,458,180,187,182,904,895,905,897,56,458,462,463,182,187,217,906,897,905,907,56,458,463,459,182,217,214,906,897,907,899,56,459,463,464,214,217,219,908,899,907,909,56,459,464,460,214,219,147,908,899,909,901,56,401,461,402,189,185,183,910,787,903,788,56,461,401,404,185,189,191,911,903,787,791,56,461,404,462,185,191,187,911,903,791,905,56,462,404,406,187,191,221,912,905,791,794,56,462,406,463,187,221,217,912,905,794,907,56,463,406,408,217,221,151,913,907,794,797,56,463,408,464,217,151,219,913,907,797,909,56,408,407,465,64,152,155,914,797,796,915,56,408,465,466,64,155,156,914,797,915,916,56,466,465,467,156,155,159,917,916,915,918,56,466,467,468,156,159,160,917,916,918,919,56,468,467,469,160,159,194,920,919,918,921,56,468,469,470,160,194,195,920,919,921,922,56,470,469,471,195,194,198,923,922,921,924,56,470,471,472,195,198,135,923,922,924,925,56,407,412,473,152,68,162,926,796,805,927,56,407,473,465,152,162,155,926,796,927,915,56,465,473,474,155,162,164,928,915,927,929,56,465,474,467,155,164,159,928,915,929,918,56,467,474,475,159,164,200,930,918,929,931,56,467,475,469,159,200,194,930,918,931,921,56,469,475,476,194,200,139,932,921,931,933,56,469,476,471,194,139,198,932,921,933,924,56,412,416,477,68,165,167,934,805,813,935,56,412,477,473,68,167,162,934,805,935,927,56,473,477,478,162,167,169,936,927,935,937,56,473,478,474,162,169,164,936,927,937,929,56,474,478,479,164,169,203,938,929,937,939,56,474,479,475,164,203,200,938,929,939,931,56,475,479,480,200,203,205,940,931,939,941,56,475,480,476,200,205,139,940,931,941,933,56,416,420,481,165,72,171,942,813,821,943,56,416,481,477,165,171,167,942,813,943,935,56,477,481,482,167,171,173,944,935,943,945,56,477,482,478,167,173,169,944,935,945,937,56,478,482,483,169,173,207,946,937,945,947,56,478,483,479,169,207,203,946,937,947,939,56,479,483,484,203,207,143,948,939,947,949,56,479,484,480,203,143,205,948,939,949,941,56,420,424,485,72,174,176,950,821,829,951,56,420,485,481,72,176,171,950,821,951,943,56,481,485,486,171,176,178,952,943,951,953,56,481,486,482,171,178,173,952,943,953,945,56,482,486,487,173,178,210,954,945,953,955,56,482,487,483,173,210,207,954,945,955,947,56,483,487,488,207,210,212,956,947,955,957,56,483,488,484,207,212,143,956,947,957,949,56,424,428,489,174,76,180,958,829,837,959,56,424,489,485,174,180,176,958,829,959,951,56,485,489,490,176,180,182,960,951,959,961,56,485,490,486,176,182,178,960,951,961,953,56,486,490,491,178,182,214,962,953,961,963,56,486,491,487,178,214,210,962,953,963,955,56,487,491,492,210,214,147,964,955,963,965,56,487,492,488,210,147,212,964,955,965,957,56,428,432,493,76,183,185,966,837,845,967,56,428,493,489,76,185,180,966,837,967,959,56,489,493,494,180,185,187,968,959,967,969,56,489,494,490,180,187,182,968,959,969,961,56,490,494,495,182,187,217,970,961,969,971,56,490,495,491,182,217,214,970,961,971,963,56,491,495,496,214,217,219,972,963,971,973,56,491,496,492,214,219,147,972,963,973,965,56,432,436,497,183,80,189,974,845,853,975,56,432,497,493,183,189,185,974,845,975,967,56,493,497,498,185,189,191,976,967,975,977,56,493,498,494,185,191,187,976,967,977,969,56,494,498,499,187,191,221,978,969,977,979,56,494,499,495,187,221,217,978,969,979,971,56,495,499,500,217,221,151,980,971,979,981,56,495,500,496,217,151,219,980,971,981,973,56,436,440,501,64,152,155,982,853,861,983,56,436,501,497,64,155,156,982,853,983,975,56,497,501,502,156,155,159,984,975,983,985,56,497,502,498,156,159,160,984,975,985,977,56,498,502,503,160,159,194,986,977,985,987,56,498,503,499,160,194,195,986,977,987,979,56,499,503,504,195,194,198,988,979,987,989,56,499,504,500,195,198,135,988,979,989,981,56,440,444,505,152,68,162,990,861,869,991,56,440,505,501,152,162,155,990,861,991,983,56,501,505,506,155,162,164,992,983,991,993,56,501,506,502,155,164,159,992,983,993,985,56,502,506,507,159,164,200,994,985,993,995,56,502,507,503,159,200,194,994,985,995,987,56,503,507,508,194,200,139,996,987,995,997,56,503,508,504,194,139,198,996,987,997,989,56,444,448,509,68,165,167,998,869,877,999,56,444,509,505,68,167,162,998,869,999,991,56,505,509,510,162,167,169,1000,991,999,1001,56,505,510,506,162,169,164,1000,991,1001,993,56,506,510,511,164,169,203,1002,993,1001,1003,56,506,511,507,164,203,200,1002,993,1003,995,56,507,511,512,200,203,205,1004,995,1003,1005,56,507,512,508,200,205,139,1004,995,1005,997,56,448,452,513,165,72,171,1006,877,885,1007,56,448,513,509,165,171,167,1006,877,1007,999,56,509,513,514,167,171,173,1008,999,1007,1009,56,509,514,510,167,173,169,1008,999,1009,1001,56,510,514,515,169,173,207,1010,1001,1009,1011,56,510,515,511,169,207,203,1010,1001,1011,1003,56,511,515,516,203,207,143,1012,1003,1011,1013,56,511,516,512,203,143,205,1012,1003,1013,1005,56,452,456,517,72,174,176,1014,885,893,1015,56,452,517,513,72,176,171,1014,885,1015,1007,56,513,517,518,171,176,178,1016,1007,1015,1017,56,513,518,514,171,178,173,1016,1007,1017,1009,56,514,518,519,173,178,210,1018,1009,1017,1019,56,514,519,515,173,210,207,1018,1009,1019,1011,56,515,519,520,207,210,212,1020,1011,1019,1021,56,515,520,516,207,212,143,1020,1011,1021,1013,56,456,460,521,174,76,180,1022,893,901,1023,56,456,521,517,174,180,176,1022,893,1023,1015,56,517,521,522,176,180,182,1024,1015,1023,1025,56,517,522,518,176,182,178,1024,1015,1025,1017,56,518,522,523,178,182,214,1026,1017,1025,1027,56,518,523,519,178,214,210,1026,1017,1027,1019,56,519,523,524,210,214,147,1028,1019,1027,1029,56,519,524,520,210,147,212,1028,1019,1029,1021,56,460,464,525,76,183,185,1030,901,909,1031,56,460,525,521,76,185,180,1030,901,1031,1023,56,521,525,526,180,185,187,1032,1023,1031,1033,56,521,526,522,180,187,182,1032,1023,1033,1025,56,522,526,527,182,187,217,1034,1025,1033,1035,56,522,527,523,182,217,214,1034,1025,1035,1027,56,523,527,528,214,217,219,1036,1027,1035,1037,56,523,528,524,214,219,147,1036,1027,1037,1029,56,464,408,466,183,80,189,1038,909,797,916,56,464,466,525,183,189,185,1038,909,916,1031,56,525,466,468,185,189,191,1039,1031,916,919,56,525,468,526,185,191,187,1039,1031,919,1033,56,526,468,470,187,191,221,1040,1033,919,922,56,526,470,527,187,221,217,1040,1033,922,1035,56,527,470,472,217,221,151,1041,1035,922,925,56,527,472,528,217,151,219,1041,1035,925,1037]}}],\"materials\":[{\"uuid\":\"7AAB18E5-FF88-4A82-8018-4DF34EDB7539\",\"type\":\"MeshPhongMaterial\",\"color\":16714940,\"ambient\":16714940,\"emissive\":0,\"specular\":0,\"shininess\":50,\"opacity\":1,\"transparent\":false,\"wireframe\":false}],\"object\":{\"uuid\":\"0D4F494E-35AD-4D5B-9696-7DF60B73E7F0\",\"name\":\"Teapot001\",\"type\":\"Mesh\",\"geometry\":\"15930b1c-1b50-4926-a0ac-df433b9c4f96\",\"material\":\"7AAB18E5-FF88-4A82-8018-4DF34EDB7539\",\"castShadow\":true,\"receiveShadow\":true,\"matrix\":[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]}}"
  },
  {
    "path": "test/integration/account.js",
    "content": "var testId = rand()\nprocess.env.MONGODB = 'mongodb://localhost:27017/upload'+testId\nprocess.env.RETHINKDB_NAME = 'upload' + testId\n\nvar request = require('supertest');\nvar fs = require('fs');\nvar fsPath = require('path');\nvar mongo = require('mongodb');\nvar expect = require('chai').expect;\n\nfunction rand() {\n\treturn Math.floor(Math.random() * 100000);\n}\n\nvar app = require('../../app.js');\n\ndescribe('Account', function() {\n\tvar username = 'test'+testId;\n\tvar deets = {\n\t\tname: 'Foo bar',\n\t\tusername: username,\n\t\temail: username+'@test.foo',\n\t\tpassword: 'abcd1234',\n\t\tconfirmPassword: 'abcd1234'\n\t};\n\t\n\tfunction makePath(model, name) {\n\t\treturn '/' + fsPath.join(deets.username, 'assets', model, name)\n\t}\n\n\tvar agent = request.agent(app);\n\tvar db;\n\n\tbefore(function(done) {\n\t\tvar that = this;\n\n\t\tdb = new mongo.Db('upload'+testId,\n\t\t\tnew mongo.Server('localhost', 27017),\n\t\t\t{ safe: true }\n\t\t);\n\n\t\tdb.open(function() {\n\t\t\tagent\n\t\t\t.post('/signup')\n\t\t\t.send(deets)\n\t\t\t.expect(302)\n\t\t\t.end(done);\n\t\t})\n\t})\n\n\tafter(function() {\n\t\tdb.dropDatabase();\n\t});\n\n\tit('should return 200 for non-existing email check', function(done) {\n\t\tagent\n\t\t.post('/account/email/exists')\n\t\t.send({ 'email': 'foo@bar.com' })\n\t\t.expect(200)\n\t\t.end(done)\n\t});\n\n\tit('should return 409 for existing email check', function(done) {\n\t\tagent\n\t\t.post('/account/email/exists')\n\t\t.send({ 'email': deets.email })\n\t\t.expect(409)\n\t\t.end(done)\n\t});\n\n});\n\n"
  },
  {
    "path": "test/integration/avatars.js",
    "content": "var request = require('supertest')\nvar app = require('../../app.js')\n\nvar jpeg = __dirname+'/../fixtures/te-2rb.jpg'\nvar assert = require('assert')\n\ndescribe('Avatars', function() {\n\tvar db\n\tvar agent = request.agent(app)\n\tvar testId = process.hrtime().join('')\n\tvar username = 'test'+testId\n\tvar deets = {\n\t\tname: 'Test User'+testId,\n\t\tusername: username,\n\t\temail: username+'@test.foo',\n\t\tpassword: 'abcd1234',\n\t\tconfirmPassword: 'abcd1234'\n\t}\n\n\tbefore(function(done) {\n\t\tapp.events.on('ready', function() {\n\t\t\tagent\n\t\t\t.post('/signup')\n\t\t\t.send(deets)\n\t\t\t.expect(302)\n\t\t\t.end(done)\n\t\t})\n\t})\n\n\tit('sets user avatar', function(done) {\n\t\tagent.post('/account/profile/avatar')\n\t\t.attach('file', jpeg, 'my.jpeg')\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tagent.get('/account/profile')\n\t\t\t.set('X-Requested-With', 'XMLHttpRequest')\n\t\t\t.expect(200)\n\t\t\t.end(function(err, res) {\n\t\t\t\tif (err) return done(err)\n\t\t\t\tassert.equal('/data/'+username+'/profile/avatar/te-2rb-scaled.jpg',\n\t\t\t\t\tres.body.data.profile.avatar)\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\tit('scales avatar correctly', function(done) {\n\t\tagent.post('/account/profile/avatar')\n\t\t.attach('file', jpeg, 'my.jpeg')\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tif (err) return done(err)\n\t\t\tassert.equal(128, res.body.data.uploaded.scaled.width)\n\t\t\tassert.equal(128, res.body.data.uploaded.scaled.height)\n\t\t\tdone()\n\t\t})\n\t})\n\n})\n\n"
  },
  {
    "path": "test/integration/editLog.js",
    "content": "var testId = rand()\nprocess.env.MONGODB = 'mongodb://localhost:27017/editLog'+testId\n\nvar EditLog = require('../../models/editLog')\nvar assert = require('assert')\nvar request = require('supertest')\nvar mongo = require('mongodb')\n\nfunction rand() {\n\treturn Math.floor(Math.random() * 100000)\n}\n\nvar app = require('../../app.js')\n\ndescribe('EditLog', function() {\n\tvar username = 'test'+testId\n\tvar deets = {\n\t\tname: 'Foo bar',\n\t\tusername: username,\n\t\temail: username+'@test.foo',\n\t\tpassword: 'abcd1234',\n\t\tconfirmPassword: 'abcd1234'\n\t}\n\t\n\tvar agent\n\tvar db\n\n\tbefore(function(done) {\n\t\tapp.events.on('ready', function() {\n\t\t\tagent = request.agent(app)\n\t\t\tdb = new mongo.Db('editLog'+testId,\n\t\t\t\tnew mongo.Server('localhost', 27017),\n\t\t\t\t{ safe: true }\n\t\t\t)\n\n\t\t\tdb.open(function() {\n\t\t\t\tagent\n\t\t\t\t.post('/signup')\n\t\t\t\t.send(deets)\n\t\t\t\t.expect(302)\n\t\t\t\t.end(done)\n\t\t\t})\n\t\t})\n\t})\n\n\tafter(function() {\n\t\tdb.dropDatabase()\n\t\tdb.close()\n\t})\n\n\tit('should list user`s editlogs', function(done) {\n\t\tvar channelName = 'chan'+rand()\n\t\tvar readableName = 'what is this I don`t even'+rand()\n\t\tagent\n\t\t.post('/editlog/'+channelName)\n\t\t.send({\n\t\t\tname: channelName,\n\t\t\treadableName: readableName\n\t\t})\n\t\t.expect(200)\n\t\t.end(function(err) {\n\t\t\tif (err) return done(err);\n\n\t\t\tagent.get('/editlog')\n\t\t\t.end(function(err, res) {\n\t\t\t\tif (err) return done(err);\n\n\t\t\t\tvar result = res.body;\n\t\t\t\tassert.equal(result.length, 1)\n\t\t\t\tassert.equal(result[0].participants.length, 1)\n\t\t\t\tassert.equal(result[0].readableName, readableName)\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\tit('should show editlog by name', function(done) {\n\t\tvar channelName = 'chan'+rand()\n\t\tvar readableName = 'what is this I don`t even'+rand()\n\t\tagent\n\t\t.post('/editlog/'+channelName)\n\t\t.send({\n\t\t\tname: channelName,\n\t\t\treadableName: readableName\n\t\t})\n\t\t.expect(200)\n\t\t.end(function(err) {\n\t\t\tif (err) return done(err);\n\n\t\t\tagent.get('/editlog/'+channelName)\n\t\t\t.end(function(err, res) {\n\t\t\t\tif (err) return done(err);\n\n\t\t\t\tvar result = res.body;\n\t\t\t\tassert.equal(result.participants.length, 1)\n\t\t\t\tassert.equal(result.readableName, readableName)\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\tit('should update editlog by name', function(done) {\n\t\tvar channelName = 'chan'+rand()\n\t\tvar readableName = 'what is this I don`t even'+rand()\n\t\tvar newName = 'longcat is long'+rand()\n\t\tagent\n\t\t.post('/editlog/'+channelName)\n\t\t.send({\n\t\t\tname: channelName,\n\t\t\treadableName: readableName\n\t\t})\n\t\t.expect(200)\n\t\t.end(function(err) {\n\t\t\tif (err) return done(err);\n\n\t\t\tagent.post('/editlog/'+channelName)\n\t\t\t.send({ readableName: newName })\n\t\t\t.expect(200)\n\t\t\t.end(function(err) {\n\t\t\t\tif (err) return done(err);\n\t\t\t\tagent.get('/editlog/'+channelName)\n\t\t\t\t.end(function(err, res) {\n\t\t\t\t\tif (err) return done(err);\n\n\t\t\t\t\tvar result = res.body;\n\t\t\t\t\tassert.equal(result.readableName, newName)\n\t\t\t\t\tdone()\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t})\n\n\n\tit('should be possible to join an editlog', function(done) {\n\t\tvar channelName = 'chan'+rand()\n\t\tvar readableName = 'what is this I don`t even'+rand()\n\t\t\n\t\tnew EditLog({\n\t\t\tname: channelName,\n\t\t\treadableName: readableName,\n\t\t\towner: 'foo'\n\t\t}).save(function(err) {\n\t\t\tif (err) return done(err);\n\t\t\tagent.post('/editlog/'+channelName+'/join')\n\t\t\t.expect(200)\n\t\t\t.end(function(err) {\n\t\t\t\tif (err) return done(err);\n\t\t\t\tagent.get('/editlog/'+channelName)\n\t\t\t\t.end(function(err, res) {\n\t\t\t\t\tif (err) return done(err);\n\n\t\t\t\t\tvar result = res.body;\n\t\t\t\t\tassert.equal(result.participants.length, 1)\n\t\t\t\t\tdone()\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\n\t})\n\n\n})\n\n"
  },
  {
    "path": "test/integration/graph-save.js",
    "content": "\nvar testId = rand()\nprocess.env.MONGODB = 'mongodb://localhost:27017/graphsave'+testId\nprocess.env.RETHINKDB_NAME = 'graphsave' + testId\n\nvar request = require('supertest')\nvar app = require('../../app.js')\nvar fs = require('fs')\nvar mongo = require('mongodb')\nvar assert = require('assert')\nvar expect = require('chai').expect\nvar jpeg = __dirname+'/../fixtures/te-2rb.jpg'\n\nvar graphFile = __dirname+'/../../browser/data/graphs/default.json'\nvar graphData = fs.readFileSync(graphFile).toString('utf8')\n\nvar packageJson = JSON.parse(fs.readFileSync(__dirname+'/../../package.json'))\nvar currentVersion = packageJson.version.split('.').slice(0,2).join('.')\n\nfunction rand() {\n\treturn Math.floor(Math.random() * 10000)\n}\n\ndescribe('Graph', function() {\n\tvar username\n\tvar deets\n\n\tvar agent = request.agent(app)\n\tvar db\n\tvar anonymousAgent = request.agent(app)\n\n\tfunction setAvatar(cb) {\n\t\treturn agent.post('/account/profile/avatar')\n\t\t\t\t.attach('file', jpeg)\n\t\t\t\t.expect(200)\n\t\t\t\t.end(cb)\n\t}\n\n\tfunction sendGraph(path, cb) {\n\t\treturn agent.post('/graph').send({\n\t\t\tpath: path,\n\t\t\tgraph: graphData\n\t\t})\n\t\t.expect(200)\n\t\t.end(cb)\n\t}\n\n\tfunction sendAnonymousGraph(path, cb) {\n\t\treturn anonymousAgent.post('/graph/v').send({\n\t\t\tpath: path,\n\t\t\tgraph: graphData\n\t\t})\n\t\t.expect(200)\n\t\t.end(cb)\n\t}\n\n\tfunction findAutoplayInHTML(bodyHtml) {\n\t\tvar canvasRX \t= /<canvas\\/?[\\w\\s=\"/.':;#-\\/]+>[.\\s\\S]*<\\/canvas>/gi.exec(bodyHtml)\n\t\tvar endScriptRX\t= /<script>[.\\s\\S]*<\\/script>/gi.exec(bodyHtml)\n\t\treturn {\n\t\t\tcanvasTag: \t\tcanvasRX.length === 1 \t? canvasRX[0] \t: '',\n\t\t\tendScriptTag: \tendScriptRX.length > 0 \t? endScriptRX.pop()\t: ''\n\t\t}\n\t}\n\n\tafter(function() {\n\t\tdb.dropDatabase()\n\t})\n\n\tbefore(function(done) {\n\t\tapp.events.on('ready', () => {\n\t\t\tdb = new mongo.Db('graphsave'+testId,\n\t\t\t\tnew mongo.Server('localhost', 27017),\n\t\t\t\t{ safe: true }\n\t\t\t)\n\n\t\t\tdb.open(function() {\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\tbeforeEach(function(done) {\n\t\tusername = 'user' + rand()\n\t\tdeets = {\n\t\t\tname: 'Foo bar',\n\t\t\tusername: username,\n\t\t\temail: username+'@test.foo',\n\t\t\tpassword: 'abcd1234',\n\t\t\tconfirmPassword: 'abcd1234'\n\t\t}\n\t\tagent\n\t\t.post('/signup')\n\t\t.send(deets)\n\t\t.expect(302)\n\t\t.end(done)\n\t})\n\n\tit('should accept anonymous save', function(done) {\n\t\tvar path = 'some-'+rand()\n\t\tvar expectedPath = '/v/'+path\n\n\t\tsendAnonymousGraph(path, function(err, res) {\n\t\t\tif (err) return done(err)\n\t\t\tvar json = {\n\t\t\t\tname: res.body.name,\n\t\t\t\towner: res.body.owner,\n\t\t\t\turl: res.body.url,\n\t\t\t\tpath: res.body.path\n\t\t\t}\n\t\t\texpect(json.name).to.not.equal(path)\n\t\t\texpect(json.owner).to.equal('v')\n\t\t\texpect(json.path).to.equal('/v/'+json.name)\n\t\t\tassert.equal(json.url.indexOf('/data/graph/v/'+json.name), 0)\n\t\t\tdone()\n\t\t})\n\t})\n\n\tit('should use the expected name, owner, path, and url', function(done) {\n\t\tvar path = 'some-'+rand()\n\t\tvar expectedPath = '/'+username+'/'+path\n\n\t\tsendGraph(path, function(err, res) {\n\t\t\tif (err) return done(err)\n\t\t\tvar json = {\n\t\t\t\tname: res.body.name,\n\t\t\t\towner: res.body.owner,\n\t\t\t\tpath: res.body.path\n\t\t\t}\n  \t\texpect({\n\t\t\t\tname: path,\n\t\t\t\towner: username,\n\t\t\t\tpath: expectedPath,\n\t\t\t}).to.deep.equal(json)\n\t\t\t// assert expectedPath is in the url\n\t\t\tassert.equal(res.body.url.indexOf(expectedPath), '/data/graph'.length)\n\t\t\t// assert hash\n\t\t\tassert.equal(res.body.url.substring(('/data/graph'+expectedPath+'-'+'.json').length).length, 40)\n\t\t\tdone()\n\t\t})\n\t})\n\n\tit('trim the space from the end', function(done) {\n\t\tvar r = rand()\n\t\tvar path = 'some'+r+'    '\n\t\tvar goodPath = 'some'+r\n\t\tvar expectedPath = '/'+username+'/'+goodPath\n\n\t\tsendGraph(path, function(err, res) {\n\t\t\tif (err) return done(err)\n\t\t\tvar json = {\n\t\t\t\tname: res.body.name,\n\t\t\t\towner: res.body.owner,\n\t\t\t\tpath: res.body.path\n\t\t\t}\n  \t\texpect({\n\t\t\t\tname: goodPath,\n\t\t\t\towner: username,\n\t\t\t\tpath: expectedPath,\n\t\t\t}).to.deep.equal(json)\n\t\t\tdone()\n\t\t})\n\t})\n\n\tit('should return data by url', function(done) {\n\t\tvar path = 'button-'+rand()\n\n\t\tsendGraph(path, function(err, res) {\n\t\t\tif (err) return done(err)\n\t\t\trequest(app).get(res.body.url)\n\t\t\t.expect(200).end(function(err, res)\n\t\t\t{\n\t\t\t\tif (err) return done(err)\n\t\t\t\tassert.equal(res.body.active_graph, 'root')\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\tit('should be able to give a summary', function(done) {\n\t\tvar path = 'button-'+rand()\n\n\t\tsendGraph(path, function(err, res) {\n\t\t\tif (err) return done(err)\n\t\t\trequest(app).get(res.body.path + '?summary=1')\n\t\t\t.expect(200).end(function(err, res) {\n\t\t\t\tif (err) return done(err)\n\t\t\t\tassert.equal(res.body.data.private, true)\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\tit('should force the right path', function(done) {\n\t\tvar path = '/blah/quux/bar/foo.png'\n\t\tvar expectedPath = '/'+username+'/foo'\n\n\t\tsendGraph(path, function(err, res) {\n\t\t\tif (err) return done(err)\n\t\t\texpect(res.body.path).to.equal(expectedPath)\n\t\t\tdone()\n\t\t})\n\t})\n\n\tit('should automatically create an optimized version', function(done) {\n\t\tvar name = rand()\n\t\tvar path = '/blah/quux/bar/'+name+'.png'\n\t\tvar expectedPath = '/'+username+'/foo'\n\t\tsendGraph(path, function(err, res) {\n\t\t\tif (err) return done(err)\n\t\t\tvar optimPath = res.body.url.replace('.json', '.min.json')\n\t\t\trequest(app).get(optimPath)\n\t\t\t.expect(200).end(function(err, res) {\n\t\t\t\tif (err) return done(err)\n\t\t\t\tassert.equal(res.body.active_graph, 'root')\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\tit('should return graph json by path', function(done) {\n\t\tvar name = 'button-'+rand()\n\t\tvar path = '/'+username+'/'+name+'.json'\n\t\tvar expectedPath = '/'+username+'/'+name\n\n\t\tsendGraph(name, function(err, res) {\n\t\t\tif (err) return done(err)\n\t\t\trequest(app).get(path)\n\t\t\t.expect(200).end(function(err, res)\n\t\t\t{\n\t\t\t\tif (err) return done(err)\n\t\t\t\texpect(res.body.path).to.equal(expectedPath)\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\tit('should return avatar with graph', function(done) {\n\t\tvar name = 'button-'+rand()\n\t\tvar path = '/'+username+'/'+name+'.json'\n\t\tvar expectedPath = '/'+username+'/'+name\n\t\tvar expectedAvatar = '/data/'+username+'/profile/avatar/'+(jpeg.split('/').pop().replace('.jpg', '-scaled.jpg'))\n\t\tsetAvatar(function(err, res){\n\t\t\tif (err) return done(err)\n\t\t\tsendGraph(name, function(err, res) {\n\t\t\t\tif (err) return done(err)\n\t\t\t\trequest(app).get(path)\n\t\t\t\t.expect(200).end(function(err, res)\n\t\t\t\t{\n\t\t\t\t\tif (err) return done(err)\n\t\t\t\t\texpect(res.body._creator.profile.avatar).to.equal(expectedAvatar)\n\t\t\t\t\tdone()\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t})\n\n\tit('should save graph version', function(done) {\n\t\tvar name = 'button-'+rand()\n\t\tvar path = '/'+username+'/'+name+'.json'\n\n\t\tsendGraph(name, function(err, res) {\n\t\t\tif (err) return done(err)\n\t\t\trequest(app).get(path)\n\t\t\t.expect(200).end(function(err, res) {\n\t\t\t\tif (err) return done(err)\n\t\t\t\texpect(res.body.version).to.equal(currentVersion)\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\tit('should use the player version for the graph', function(done) {\n\t\tvar name = 'button-'+rand()\n\t\tvar path = '/'+username+'/'+name\n\n\t\tsendGraph(name, function(err, res) {\n\t\t\tif (err) return done(err)\n\t\t\trequest(app).get(path)\n\t\t\t.set('Accept', 'text/html')\n\t\t\t.expect(200).end(function(err, res) {\n\t\t\t\tif (err) return done(err)\n\n\t\t\t\texpect(res.text\n\t\t\t\t\t.split('/'+currentVersion+'/player.min.js').length)\n\t\t\t\t\t.to.equal(2)\n\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\n\tit('should autoplay graphs by default', function(done) {\n\t\tvar name = 'button-'+rand()\n\t\tvar path = '/'+username+'/'+name\n\n\t\tsendGraph(name, function(err, res) {\n\t\t\tif (err) return done(err)\n\t\t\trequest(app).get(path)\n\t\t\t.set('Accept', 'text/html')\n\t\t\t.expect(200).end(function(err, res) {\n\t\t\t\tif (err) return done(err)\n\t\t\t\tvar autoplay = findAutoplayInHTML(res.text)\n\t\t\t\texpect(autoplay.canvasTag\n\t\t\t\t\t.split('data-autoplay=\"true\"').length)\n\t\t\t\t\t.to.equal(2)\n\n\t\t\t\texpect(autoplay.endScriptTag\n\t\t\t\t\t.split('Vizor.autoplay = true').length)\n\t\t\t\t\t.to.equal(2)\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\tit('should not autoplay embedded graphs', function(done) {\n\t\tvar name = 'button-'+rand()\n\t\tvar path = '/embed/'+username+'/'+name\n\n\t\tsendGraph(name, function(err, res) {\n\t\t\tif (err) return done(err)\n\t\t\trequest(app).get(path)\n\t\t\t.set('Accept', 'text/html')\n\t\t\t.expect(200).end(function(err, res) {\n\t\t\t\tif (err) return done(err)\n\t\t\t\tvar autoplay = findAutoplayInHTML(res.text)\n\t\t\t\texpect(autoplay.canvasTag\n\t\t\t\t\t.split('data-autoplay=\"true\"').length)\n\t\t\t\t\t.to.equal(1)\n\n\t\t\t\texpect(autoplay.endScriptTag\n\t\t\t\t\t.split('Vizor.autoplay = false').length)\n\t\t\t\t\t.to.equal(3)\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\tit('can not be found if private', function(done) {\n\t\tvar path = 'graph-tag-'+process.pid\n\n\t\tagent.post('/graph').send({\n\t\t\tpath: path,\n\t\t\ttags: [ '3948tehr' ],\n\t\t\tgraph: graphData,\n\t\t\tprivate: true\n\t\t})\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tif (err) return done(err)\n\n\t\t\tanonymousAgent\n\t\t\t.get('/'+username)\n\t\t\t.set('X-Requested-With', 'XMLHttpRequest')\n\t\t\t.expect(200)\n\t\t\t.end(function(err, res) {\n\t\t\t\tvar list = res.body.data.graphs.list\n\t\t\t\tif (err) return done(err)\n\t\t\t\texpect(list.length).to.equal(0)\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\tit('can be found by tag after saving', function(done) {\n\t\tvar path = 'graph-tag-'+process.pid\n\n\t\tagent.post('/graph').send({\n\t\t\tpath: path,\n\t\t\ttags: [ 'tags', '#are', 'cool' ],\n\t\t\tgraph: graphData\n\t\t})\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tif (err) return done(err)\n\n\t\t\trequest(app)\n\t\t\t.get('/'+username+'/assets/graph/tag/are')\n\t\t\t.expect(200)\n\t\t\t.end(function(err, res) {\n\t\t\t\tif (err)\n\t\t\t\t\treturn done(err)\n\n\t\t\t\texpect(res.body[0].tags)\n\t\t\t\t.to.deep.equal([\n\t\t\t\t\t'tags', 'are', 'cool'\n\t\t\t\t])\n\t\t\t\tdone(err)\n\t\t\t})\n\t\t})\n\t})\n\n\t// original data\n\tvar testPngData = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQ\" +\n\t\"BAMAAAA9U8BlAAAAD1BMVEUAAAAAiSMAIYmJAHuJCABsJlEnAAACX0lEQVR42uzSMQEAAAgD\" +\n\t\"oNnA/mmt4D/IQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n\t\"AAAAAABKzQbeBAQAAAAAAAAAAODYu2MaAAAABmH+XU/BDJBWAz8AAAAAAAAAAAAAAAAAAACH\" +\n\t\"tQUtAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABg7NIhAQAA\" +\n\t\"CAMwBMHon4oKdzdbhgEAAAAAAAAAAAAAAAAAAAAAAAAAULE3EBMQAAAAAAAAAAAAAAAAAAAA\" +\n\t\"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAODZgwMBAAAAACD/10ZQVVVVVVVVVVVVVVVVVVVVVVVV\" +\n\t\"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRX24EAAAAAAAMj/tRFU\" +\n\t\"VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\" +\n\t\"VVVVVYVdOqYBAAYBAEY2I0jAvzoscELSaigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\" +\n\t\"AAAAAGz3MmBMQAAAAAAAuOdXwJiAAAAAAAAAAAAAAAAAAAAAAAAAADR7cCAAAAAAAOT/2giq\" +\n\t\"qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\" +\n\t\"qqqqqtIeHBIAAAAACPr/2hsGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATgIb\" +\n\t\"gAF3C+ZweAAAAABJRU5ErkJggg==\"\n\n\t// converted data\n\tvar convertedTestPngData440x330 = \"77+9UE5HDQoaCgAAAA1JSERSAAAFAAAAAu+/vQQDAAAAPVPvv71lAAAAD1BMVEUAAAAA77+9IwAh77+977+9AHvvv70IAGwmUScAAAJfSURBVHjvv73vv73vv70xAQAACAPvv73vv73vv73vv71p77+977+9P++/vUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASu+/vQbvv70EBAAAAAAAAAAA77+92LtjGgAAAAZh77+9XU/vv70M77+9VgM/AAAAAAAAAAAAAAAAAAAA77+977+9BS0CBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGDvv73vv70hAQAACAMwBO+/veifigp3N1vvv70BAAAAAAAAAAAAAAAAAAAAAAAAAFDvv703EBMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO+/vdmDAwEAAAAAIO+/ve+/vUZQVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVRXvv73vv71AAAAAAADvv73vv73vv70RVFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVXvv71dOu+/vQEABgEARjYjSO+/ve+/vToscELvv71qKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbO+/vTJgTEAAAAAAAO+/ve+/vVfvv73vv73vv70AAAAAAAAAAAAAAAAAAAAAAAAANHtwIAAAAAAA77+977+977+9CO+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/ve+/vR4cEgAAAAAI77+977+977+9GwYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOAhvvv70Bdwvvv71weAAAAABJRU5E77+9QmDvv70=\"\n\n\tvar convertedTestPngData1280x720 = '77+9UE5HDQoaCgAAAA1JSERSAAAFAAAAAu+/vQQDAAABSlTvv73vv70AAAAPUExURQAAAADvv70jACHvv73vv70Ae++/vQgAbCZRJwAAAiBJREFUeO+/ve+/ve+/vUsN77+9QBRFQX4C77+9BCQg77+977+977+9Yu+/ve+/ve+/vRkSbmjvv70UHANnGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA77+9aU4HAAAAAAAAAAAAAAAA77+9SEsHAAAAAO+/ve+/vXQAAM+rdAAAAAAAAAAAAAAAAAAAAAAAAO+/vWFKBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDvv73vv70DAO+/vdOaDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA77+9My0dAAAAAAAAAAAAAAAAAAAAAO+/ve+/vUoHAAAAAAAAHe+/vXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO+/vWHvv73vv70FAADvv70Z05ouAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA477+977+9dAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFfvv73vv70uAAAAAAAAAAAAAAAA77+977+977+9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO+/ve+/vR05DgHvv70a77+9K++/vQAAAABJRU5E77+9QmDvv70='\n\n\tit('uploads preview images', function(done) {\n\t\tvar path = 'graph-with-preview-image-good-'+process.pid\n\t\tvar expectedSmallImagePath = '/data/previews/' + username + '/' + path + '-preview-440x330-3b4958f8441df46a51c347c5e1e34736cbea700f.png'\n\t\tvar expectedLargeImagePath = '/data/previews/' + username + '/' + path + '-preview-1280x720-3b4958f8441df46a51c347c5e1e34736cbea700f.png'\n\t\tvar expectedOriginalImagePath = '/data/previews/' + username + '/' + path + '-preview-original-3b4958f8441df46a51c347c5e1e34736cbea700f.png'\n\n\t\tagent.post('/graph').send({\n\t\t\tpath: path,\n\t\t\tgraph: graphData,\n\t\t\tpreviewImage: testPngData\n\t\t})\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tif (err) return done(err)\n\n\t\t\t// check original image\n\t\t\trequest(app).get(expectedOriginalImagePath)\n\t\t\t.expect(200).end(function(err, res)\t{\n\t\t\t\tif (err) return done(err)\n\n\t\t\t\tvar gotData = new Buffer(res.text).toString()\n\t\t\t\tvar expectedData = new Buffer(testPngData.replace(/^data:image\\/\\w+;base64,/, \"\"), 'base64').toString()\n\n\t\t\t\tassert.equal(gotData.length, expectedData.length)\n\t\t\t\tassert.equal(gotData, expectedData)\n\n\t\t\t\t// check small preview\n\t\t\t\trequest(app).get(expectedSmallImagePath)\n\t\t\t\t.expect(200).end(function(err, res) {\n\t\t\t\t\tif (err) return done(err)\n\n\t\t\t\t\tvar gotData = new Buffer(res.text).toString()\n\t\t\t\t\tvar expectedData = new Buffer(convertedTestPngData440x330, 'base64').toString()\n\n\t\t\t\t\tassert.ok(gotData.length > expectedData.length - 40 &&\n\t\t\t\t\t\tgotData.length <= expectedData.length)\n\n\t\t\t\t\t// check large preview\n\t\t\t\t\trequest(app).get(expectedLargeImagePath)\n\t\t\t\t\t.expect(200).end(function(err, res)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (err) return done(err)\n\n\t\t\t\t\t\tvar gotData = new Buffer(res.text).toString()\n\t\t\t\t\t\tassert.equal(gotData[1], 'P')\n\t\t\t\t\t\tdone()\n\t\t\t\t\t})\n\t\t\t\t})\n\n\t\t\t})\n\n\t\t})\n\t})\n\n\tit('creates no image on null preview data', function(done) {\n\t\tvar path = 'graph-with-preview-image-null-'+process.pid\n\t\tvar expectedImagePath = '/data/previews/' + username + '/' + path + '-preview-440x330.png'\n\n\t\tagent.post('/graph').send({\n\t\t\tpath: path,\n\t\t\tgraph: graphData,\n\t\t\tpreviewImage: null\n\t\t})\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tif (err) return done(err)\n\n\t\t\trequest(app).get(expectedImagePath)\n\t\t\t.expect(404).end(function(err, res)\n\t\t\t{\n\t\t\t\tif (err) return done(err)\n\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\tit('creates no image on invalid preview data', function(done) {\n\t\tvar path = 'graph-with-preview-image-invalid-'+process.pid\n\t\tvar expectedImagePath = '/data/previews/' + username + '/' + path + '-preview.png'\n\n\t\tagent.post('/graph').send({\n\t\t\tpath: path,\n\t\t\tgraph: graphData,\n\t\t\tpreviewImage: \"abcdefg123456789\"\n\t\t})\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tif (err) return done(err)\n\n\t\t\trequest(app).get(expectedImagePath)\n\t\t\t.expect(404).end(function(err, res)\n\t\t\t{\n\t\t\t\tif (err) return done(err)\n\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\n\tit('sets editable flag true as default', function(done) {\n\t\tvar path = 'graph-editable-'+rand()\n\n\t\tagent.post('/graph').send({\n\t\t\tpath: path,\n\t\t\tgraph: graphData\n\t\t})\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tif (err) return done(err)\n\n\t\t\tassert.ok(res.body.editable === true)\n\t\t\tdone()\n\t\t})\n\t})\n\n\n\tit('stores editable flag', function(done) {\n\t\tvar path = 'graph-editable-'+rand()\n\n\t\tagent.post('/graph').send({\n\t\t\tpath: path,\n\t\t\teditable: false,\n\t\t\tgraph: graphData\n\t\t})\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tif (err) return done(err)\n\n\t\t\tassert.ok(res.body.editable === false)\n\t\t\tdone()\n\t\t})\n\t})\n\n\n\n\tit('allows editing on editable=false by owner', function(done) {\n\t\tvar path = 'graph-editable-'+rand()\n\t\tvar editPath = '/'+username+'/'+path+'/edit'\n\n\t\tagent.post('/graph').send({\n\t\t\tpath: path,\n\t\t\teditable: false,\n\t\t\tgraph: graphData\n\t\t})\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tif (err) return done(err)\n\n\t\t\tagent.get(editPath).expect(200).end(done)\n\t\t})\n\t})\n\n\n\n\tit('denies editing on editable=false by other', function(done) {\n\t\tvar path = 'graph-editable-'+rand()\n\t\tvar editPath = '/'+username+'/'+path+'/edit'\n\n\t\tagent.post('/graph').send({\n\t\t\tpath: path,\n\t\t\teditable: false,\n\t\t\tgraph: graphData\n\t\t})\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tif (err) return done(err)\n\n\t\t\tanonymousAgent.get(editPath).expect(404).end(done)\n\t\t})\n\t})\n\n\n\tit('increases graph view count on view', function(done) {\n\t\tvar path = 'graph-views-'+rand()\n\t\tvar viewPath = '/'+username+'/'+path+''\n\t\tvar jsonPath = '/'+username+'/'+path+'.json'\n\n\t\tagent.post('/graph').send({\n\t\t\tpath: path,\n\t\t\tgraph: graphData\n\t\t})\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tif (err) return done(err)\n\n\t\t\tassert.equal(0, res.body.views)\n\n\t\t\trequest(app).get(viewPath).expect(200).end(function(err) {\n\t\t\t\trequest(app).get(viewPath).expect(200).end(function(err) {\n\t\t\t\t\tif (err) return done(err)\n\n\t\t\t\t\trequest(app).get(jsonPath)\n\t\t\t\t\t.expect(200).end(function(err, res) {\n\t\t\t\t\t\tif (err)\n\t\t\t\t\t\t\treturn done(err)\n\n\t\t\t\t\t\tassert.equal(2, res.body.views)\n\t\t\t\t\t\tdone()\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t})\n\n\tit('increases user view count on view', function(done) {\n\t\tvar path = 'graph-views-'+rand()\n\t\tvar viewPath = '/'+username+'/'+path+''\n\t\tvar userPath = '/'+username\n\n\t\tagent.post('/graph').send({\n\t\t\tpath: path,\n\t\t\tgraph: graphData\n\t\t})\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tif (err) return done(err)\n\n\t\t\trequest(app).get(viewPath).expect(200).end(function(err) {\n\t\t\t\trequest(app).get(viewPath).expect(200).end(function(err) {\n\t\t\t\t\tif (err) return done(err)\n\n\t\t\t\t\trequest(app).get(userPath)\n\t\t\t\t\t.set('X-Requested-With', 'XMLHttpRequest')\n\t\t\t\t\t.expect(200).end(function(err, res) {\n\t\t\t\t\t\tif (err)\n\t\t\t\t\t\t\treturn done(err)\n\n\t\t\t\t\t\tassert.equal(2, res.body.data.profile.stats.views)\n\t\t\t\t\t\tdone()\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t})\n\n\tit('increases user projects count', function(done) {\n\t\tvar name = 'button-'+rand()\n\t\tvar userPath = '/'+username\n\n\t\tsendGraph(name, function(err, res) {\n\t\t\tif (err) return done(err)\n\t\t\trequest(app).get(userPath)\n\t\t\t.set('X-Requested-With', 'XMLHttpRequest')\n\t\t\t.expect(200).end(function(err, res) {\n\t\t\t\tif (err) return done(err)\n\t\t\t\texpect(res.body.data.profile.stats.projects).to.equal(1)\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\n})\n"
  },
  {
    "path": "test/integration/graphDelete.js",
    "content": "var testId = rand()\nvar DBNAME = 'graphDelete'+testId\n\nprocess.env.MONGODB = 'mongodb://localhost:27017/'+DBNAME\nprocess.env.GRAPHCONTROLLER_PAGE_SIZE = 3\n\nvar request = require('supertest')\nvar app = require('../../app.js')\nvar fs = require('fs')\nvar assert = require('assert')\nvar expect = require('chai').expect\n\nvar graphFile = __dirname+'/../../browser/data/graphs/default.json'\nvar graphData = fs.readFileSync(graphFile).toString('utf8')\n\nvar packageJson = JSON.parse(fs.readFileSync(__dirname+'/../../package.json'))\nvar currentVersion = packageJson.version.split('.').slice(0,2).join('.')\n\nvar mongo = require('mongodb')\n\nvar when = require('when')\nvar guard = require('when/guard')\n\nfunction rand() {\n\treturn Math.floor(Math.random() * 10000)\n}\n\nfunction range(howmany) {\n\tvar a = []\n\tfor (var i=0; i < howmany; i++)\n\t\ta.push(i)\n\treturn a\n}\n\ndescribe('Graph delete', function() {\n\tvar username = 'user'+rand()\n\tvar deets = {\n\t\tname: 'Foo bar',\n\t\tusername: username,\n\t\temail: username+'@test.foo',\n\t\tpassword: 'abcd1234',\n\t\tconfirmPassword: 'abcd1234'\n\t}\n\n\tvar anonymousAgent = request.agent(app)\n\tvar agent = request.agent(app)\n\tvar db\n\n\tfunction sendGraph(path) {\n\t\tvar dfd = when.defer()\n\n\t\tagent.post('/graph').send({\n\t\t\tpath: path,\n\t\t\tgraph: graphData,\n\t\t\tisPublic: true\n\t\t})\n\t\t.expect(200)\n\t\t.end(function(err) {\n\t\t\tif (err)\n\t\t\t\treturn dfd.reject(err)\n\n\t\t\tdfd.resolve()\n\t\t})\n\n\t\treturn dfd.promise\n\t}\n\n\tbefore(function(done) {\n\t\tapp.events.on('ready', function() {\n\t\t\tdb = new mongo.Db(DBNAME,\n\t\t\t\tnew mongo.Server('localhost', 27017),\n\t\t\t\t{ safe: true }\n\t\t\t)\n\n\t\t\tdb.open(function() {\n\t\t\t\tagent\n\t\t\t\t.post('/signup')\n\t\t\t\t.send(deets)\n\t\t\t\t.expect(302)\n\t\t\t\t.end(function() {\n\t\t\t\t\tdone()\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t})\n\n\tafter(function() {\n\t\tdb.dropDatabase()\n\t\tdb.close()\n\t})\n\n\tit('deletes if owner', function(done) {\n\t\tsendGraph('toDelete')\n\t\t.then(function() {\n\t\t\tagent\n\t\t\t.delete('/'+username+'/toDelete')\n\t\t\t.expect(200)\n\t\t\t.end(function(err, res) {\n\t\t\t\tif (err)\n\t\t\t\t\treturn done(err)\n\n\t\t\t\tagent\n\t\t\t\t\t.get('/'+username+'/toDelete')\n\t\t\t\t\t.expect(404)\n\t\t\t\t\t.end(done)\n\t\t\t})\n\t\t})\n\t})\n\n\tit('doesn`t delete if not owner', function(done) {\n\t\tsendGraph('notDelete')\n\t\t.then(function() {\n\t\t\t\tagent\n\t\t\t\t\t.get('/'+username+'/notDelete')\n\t\t\t\t\t.expect(200)\n\t\t\t\t\t.end(done)\n\t\t})\n\t})\n\n\n})\n\n"
  },
  {
    "path": "test/integration/graphPaging.js",
    "content": "var testId = rand()\nvar DBNAME = 'paging'+testId\nvar UIPagination = require('../../browser/scripts/ui/pagination')\n\nprocess.env.MONGODB = 'mongodb://localhost:27017/'+DBNAME\nprocess.env.GRAPHCONTROLLER_PAGE_SIZE = 3\n\nvar request = require('supertest')\nvar app = require('../../app.js')\nvar fs = require('fs')\nvar assert = require('assert')\nvar expect = require('chai').expect\n\nvar graphFile = __dirname+'/../../browser/data/graphs/default.json'\nvar graphData = fs.readFileSync(graphFile).toString('utf8')\n\nvar packageJson = JSON.parse(fs.readFileSync(__dirname+'/../../package.json'))\nvar currentVersion = packageJson.version.split('.').slice(0,2).join('.')\n\nvar mongo = require('mongodb')\n\nvar when = require('when')\nvar guard = require('when/guard')\n\nfunction rand() {\n\treturn Math.floor(Math.random() * 10000)\n}\n\nfunction range(howmany) {\n\tvar a = []\n\tfor (var i=0; i < howmany; i++)\n\t\ta.push(i)\n\treturn a\n}\n\ndescribe('Graph paging', function() {\n\tvar username = 'user'+rand()\n\tvar deets = {\n\t\tname: 'Foo bar',\n\t\tusername: username,\n\t\temail: username+'@test.foo',\n\t\tpassword: 'abcd1234',\n\t\tconfirmPassword: 'abcd1234'\n\t}\n\n\tvar agent\n\tvar db\n\n\tfunction sendGraph(path) {\n\t\tvar dfd = when.defer()\n\n\t\tagent.post('/graph').send({\n\t\t\tpath: path,\n\t\t\tgraph: graphData,\n\t\t\tisPublic: true\n\t\t})\n\t\t.expect(200)\n\t\t.end(function(err) {\n\t\t\tif (err)\n\t\t\t\treturn dfd.reject(err)\n\n\t\t\tdfd.resolve()\n\t\t})\n\n\t\treturn dfd.promise\n\t}\n\n\tbefore(function(done) {\n\t\tapp.events.on('ready', function() {\n\t\t\tagent = request.agent(app)\n\n\t\t\tdb = new mongo.Db(DBNAME,\n\t\t\t\tnew mongo.Server('localhost', 27017),\n\t\t\t\t{ safe: true }\n\t\t\t)\n\n\t\t\tdb.open(function() {\n\t\t\t\tagent\n\t\t\t\t.post('/signup')\n\t\t\t\t.send(deets)\n\t\t\t\t.expect(302)\n\t\t\t\t.end(function(err) {\n\t\t\t\t\twhen.map(range(10), guard(guard.n(1), function(i) {\n\t\t\t\t\t\treturn sendGraph('dummy'+i)\n\t\t\t\t\t}))\n\t\t\t\t\t.then(function() {\n\t\t\t\t\t\tdone()\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\n\t})\n\n\tafter(function() {\n\t\tdb.dropDatabase()\n\t\tdb.close()\n\t})\n\n\tit('pages on browse', function(done) {\n\t\trequest(app)\n\t\t.get('/browse')\n\t\t.set('X-Requested-With', 'XMLHttpRequest')\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tif (err)\n\t\t\t\treturn done(err)\n\n\t\t\tassert.equal(10, res.body.data.meta.totalCount)\n\t\t\tassert.equal(3, res.body.data.list.length)\n\t\t\tassert.equal('dummy9', res.body.data.list[0].name)\n\n\t\t\tvar p = UIPagination.fromMeta(res.body.data.meta)\n\t\t\tassert.equal(1, p.currentPage)\n\t\t\tassert.equal(4, p.totalPages)\n\n\t\t\tdone()\n\t\t})\n\t})\n\n\tit('pages on browse page 2', function(done) {\n\t\trequest(app)\n\t\t.get('/browse/page/2')\n\t\t.set('X-Requested-With', 'XMLHttpRequest')\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tif (err)\n\t\t\t\treturn done(err)\n\n\t\t\tassert.equal(10, res.body.data.meta.totalCount)\n\t\t\tassert.equal(3, res.body.data.list.length)\n\t\t\tassert.equal('dummy6', res.body.data.list[0].name)\n\n\t\t\tvar p = UIPagination.fromMeta(res.body.data.meta)\n\t\t\tassert.equal(2, p.currentPage)\n\t\t\tassert.equal(4, p.totalPages)\n\n\t\t\tdone()\n\t\t})\n\t})\n\n\tit('pages on user page 3', function(done) {\n\t\trequest(app)\n\t\t.get('/'+username+'/page/3')\n\t\t.set('X-Requested-With', 'XMLHttpRequest')\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tif (err)\n\t\t\t\treturn done(err)\n\n\t\t\tvar graphs = res.body.data.graphs\n\t\t\tassert.equal(10, graphs.meta.totalCount)\n\t\t\tassert.equal(3, graphs.list.length)\n\t\t\tassert.equal('dummy3', graphs.list[0].name)\n\n\t\t\tvar p = UIPagination.fromMeta(graphs.meta)\n\t\t\tassert.equal(3, p.currentPage)\n\t\t\tassert.equal(4, p.totalPages)\n\n\t\t\tdone()\n\t\t})\n\t})\n\n\n})\n\n"
  },
  {
    "path": "test/integration/graphRank.js",
    "content": "var testId = rand()\nvar DBNAME = 'graphrank'+testId\nprocess.env.MONGODB = 'mongodb://localhost:27017/'+DBNAME\n\nvar request = require('supertest')\nvar app = require('../../app.js')\nvar fs = require('fs')\nvar assert = require('assert')\nvar expect = require('chai').expect\n\nvar graphFile = __dirname+'/../../browser/data/graphs/default.json'\nvar graphData = fs.readFileSync(graphFile).toString('utf8')\n\nvar packageJson = JSON.parse(fs.readFileSync(__dirname+'/../../package.json'))\nvar currentVersion = packageJson.version.split('.').slice(0,2).join('.')\n\nvar mongo = require('mongodb')\n\nfunction rand() {\n\treturn Math.floor(Math.random() * 10000)\n}\n\ndescribe('Graph', function() {\n\tvar username = 'user'+rand()\n\tvar deets = {\n\t\tname: 'Foo bar',\n\t\tusername: username,\n\t\temail: username+'@test.foo',\n\t\tpassword: 'abcd1234',\n\t\tconfirmPassword: 'abcd1234'\n\t}\n\n\tvar agent = request.agent(app)\n\tvar db\n\n\tfunction sendGraph(path, cb) {\n\t\treturn agent.post('/graph').send({\n\t\t\tpath: path,\n\t\t\tgraph: graphData\n\t\t})\n\t\t.expect(200)\n\t\t.end(cb)\n\t}\n\n\tbefore(function(done) {\n\t\tapp.events.on('ready', function() {\n\t\t\tdb = new mongo.Db(DBNAME,\n\t\t\t\tnew mongo.Server('localhost', 27017),\n\t\t\t\t{ safe: true }\n\t\t\t)\n\n\t\t\tdb.open(function() {\n\t\t\t\tagent\n\t\t\t\t.post('/signup')\n\t\t\t\t.send(deets)\n\t\t\t\t.expect(302)\n\t\t\t\t.end(done)\n\t\t\t})\n\t\t})\n\t})\n\n\tafter(function() {\n\t\tdb.dropDatabase()\n\t\tdb.close()\n\t})\n\n\tit('displays public', function(done) {\n\t\tvar path = 'graph-rank-'+rand()\n\n\t\tagent.post('/graph').send({\n\t\t\tpath: path,\n\t\t\tgraph: graphData,\n\t\t\tisPublic: true\n\t\t})\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tif (err) return done(err)\n\n\t\t\tassert.equal(res.body.private, false)\n\n\t\t\trequest(app)\n\t\t\t.get('/browse')\n\t\t\t.set('X-Requested-With', 'XMLHttpRequest')\n\t\t\t.expect(200)\n\t\t\t.end(function(err, res) {\n\t\t\t\tif (err)\n\t\t\t\t\treturn done(err)\n\n\t\t\t\tvar list = res.body.data.list\n\n\t\t\t\texpect(list.length)\n\t\t\t\t\t.to.equal(1)\n\n\t\t\t\texpect(list[0].private)\n\t\t\t\t\t.to.equal(false)\n\n\t\t\t\texpect(list[0].name)\n\t\t\t\t\t.to.equal(path)\n\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\tit('doesn\\'t display privates', function(done) {\n\t\tvar path = 'graph-rank-'+rand()\n\n\t\tagent.post('/graph').send({\n\t\t\tpath: path,\n\t\t\tisPublic: false,\n\t\t\tgraph: graphData\n\t\t})\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tif (err) return done(err)\n\n\t\t\tassert.equal(res.body.private, true)\n\n\t\t\trequest(app)\n\t\t\t.get('/browse')\n\t\t\t.set('X-Requested-With', 'XMLHttpRequest')\n\t\t\t.expect(200)\n\t\t\t.end(function(err, res) {\n\t\t\t\tif (err)\n\t\t\t\t\treturn done(err)\n\n\t\t\t\tres.body.data.list.map(function(graph) {\n\t\t\t\t\tassert.notEqual(graph.name, path)\n\t\t\t\t})\n\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\tit('doesn\\'t display deleted', function(done) {\n\t\tvar path = 'graph-rank-'+rand()\n\n\t\tagent.post('/graph').send({\n\t\t\tpath: path,\n\t\t\tgraph: graphData\n\t\t})\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tif (err) return done(err)\n\n\t\t\tagent.delete('/'+username+'/'+path)\n\t\t\t.expect(200)\n\t\t\t.end(function(err, res) {\n\t\t\t\tif (err)\n\t\t\t\t\treturn done(err)\n\n\t\t\t\trequest(app)\n\t\t\t\t.get('/browse')\n\t\t\t\t.set('X-Requested-With', 'XMLHttpRequest')\n\t\t\t\t.expect(200)\n\t\t\t\t.end(function(err, res) {\n\t\t\t\t\tif (err)\n\t\t\t\t\t\treturn done(err)\n\n\t\t\t\t\tres.body.data.list.map(function(graph) {\n\t\t\t\t\t\tassert.notEqual(graph.name, path)\n\t\t\t\t\t})\n\n\t\t\t\t\tdone()\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t})\n\n\n\n})\n\n"
  },
  {
    "path": "test/integration/headers.js",
    "content": "var request = require('supertest')\nvar app = require('../../app.js')\n\nvar jpeg = __dirname+'/../fixtures/te-2rb.jpg'\nvar assert = require('assert')\n\ndescribe('Headers', function() {\n\tvar db\n\tvar agent = request.agent(app)\n\tvar testId = process.hrtime().join('')\n\tvar username = 'test'+testId\n\tvar deets = {\n\t\tname: 'Test User'+testId,\n\t\tusername: username,\n\t\temail: username+'@test.foo',\n\t\tpassword: 'abcd1234',\n\t\tconfirmPassword: 'abcd1234'\n\t}\n\n\tbefore(function(done) {\n\t\tapp.events.on('ready', function() {\n\t\t\tagent\n\t\t\t.post('/signup')\n\t\t\t.send(deets)\n\t\t\t.expect(302)\n\t\t\t.end(done)\n\t\t})\n\t})\n\n\tit('sets user header', function(done) {\n\t\tagent.post('/account/profile/header')\n\t\t.attach('file', jpeg, 'my.jpeg')\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tagent.get('/account/profile')\n\t\t\t.set('X-Requested-With', 'XMLHttpRequest')\n\t\t\t.expect(200)\n\t\t\t.end(function(err, res) {\n\t\t\t\tif (err) return done(err)\n\t\t\t\tassert.equal('/data/'+username+'/profile/header/te-2rb-scaled.jpg',\n\t\t\t\t\tres.body.data.profile.header)\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\tit('scales header correctly', function(done) {\n\t\tagent.post('/account/profile/header')\n\t\t.attach('file', jpeg, 'my.jpeg')\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tif (err) return done(err)\n\t\t\tassert.equal(1440, res.body.data.uploaded.scaled.width)\n\t\t\tassert.equal(340, res.body.data.uploaded.scaled.height)\n\t\t\tdone()\n\t\t})\n\t})\n\n})\n\n"
  },
  {
    "path": "test/integration/models/editLog.js",
    "content": "var assert = require('assert')\nvar EditLog = require('../../../models/editLog.js')\nvar mongoose = require('mongoose')\nvar mongo = require('mongodb')\nvar ObjectId = require('mongoose').Types.ObjectId; \n\nvar testId = rand()\n\nprocess.env.MONGODB = 'mongodb://localhost:27017/eltest'+testId\n\nfunction rand() {\n\treturn Math.floor(Math.random() * 100000)\n}\n\ndescribe('EditLog', function() {\n\tvar db\n\n\tbefore(function(done) {\n\t\tmongoose.connect(process.env.MONGODB)\n\n\t\tdb = new mongo.Db('eltest'+testId, \n\t\t\tnew mongo.Server('localhost', 27017),\n\t\t\t{ safe: true })\n\n\t\tdb.open(function() {\n\t\t\tdone()\n\t\t})\n\t})\n\n\tafter(function(done) {\n\t\tdb.dropDatabase()\n\t\tdb.close()\n\t\tmongoose.models = {}\n\t\tmongoose.modelSchemas = {}\n\t\tmongoose.connection.close()\n\t\tdone()\n\t})\n\n\tit('can find editlogs by channel name', function(done) {\n\t\tnew EditLog({\n\t\t\towner: 'testi',\n\t\t\tname: 'chan1',\n\t\t\treadableName: 'my channel'\n\t\t})\n\t\t.save(function(err) {\n\t\t\tif (err) return done(err)\n\t\t\t\n\t\t\tEditLog.findOne({ name: 'chan1'})\n\t\t\t.exec(function(err, el) {\n\t\t\t\tif (err) return done(err)\n\n\t\t\t\tassert.equal(el.readableName, 'my channel')\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\tit('can find editlogs by participant', function(done) {\n\t\tnew EditLog({\n\t\t\towner: 'testi',\n\t\t\tname: 'chan'+rand(),\n\t\t\treadableName: 'my channel'\n\t\t})\n\t\t.save(function(err, savedEl) {\n\t\t\tif (err) return done(err)\n\t\t\t\n\t\t\tvar participant = 'aaaaaaaaaaaa'\n\n\t\t\tsavedEl.addParticipant(participant)\n\t\t\t.then(function() {\n\t\t\t\tEditLog.findOne({ participants: participant })\n\t\t\t\t.exec(function(err, el) {\n\t\t\t\t\tif (err) return done(err)\n\t\t\t\t\tassert.equal(el.readableName, 'my channel')\n\t\t\t\t\tdone()\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t})\n\n\tit('does not add participant twice', function(done) {\n\t\tnew EditLog({\n\t\t\towner: 'testi',\n\t\t\tname: 'chan'+rand(),\n\t\t\treadableName: 'my channel'\n\t\t})\n\t\t.save(function(err, savedEl) {\n\t\t\tif (err) return done(err)\n\t\t\t\n\t\t\tvar participant = 'abcdabcd1234'\n\n\t\t\tsavedEl.addParticipant(participant)\n\t\t\t.then(function() {\n\t\t\t\treturn savedEl.addParticipant(participant)\n\t\t\t})\n\t\t\t.then(function() {\n\t\t\t\tEditLog.findOne({ participants: participant })\n\t\t\t\t.exec(function(err, el) {\n\t\t\t\t\tif (err) return done(err)\n\t\t\t\t\tassert.equal(el.readableName, 'my channel')\n\t\t\t\t\tassert.equal(el.participants.length, 1)\n\t\t\t\t\tdone()\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t})\n\n\n})\n\n"
  },
  {
    "path": "test/integration/multiuserEditing.js",
    "content": "var testId = rand()\nvar DBNAME = 'multiuser'+testId\nprocess.env.MONGODB = 'mongodb://localhost:27017/'+DBNAME\n\nglobal.WebSocket = require('ws')\nglobal.EventEmitter = require('events').EventEmitter\nglobal._ = require('lodash')\nvar request = require('supertest')\nvar mongoose = require('mongoose')\nvar mongo = require('mongodb')\nvar assert = require('assert')\nglobal.WebSocketChannel = require('../../browser/scripts/wschannel')\nvar EditorChannel = require('../../browser/scripts/editorChannel')\nvar session = require('client-sessions')\nvar secrets = require('../../config/secrets');\nglobal.Flux = require('../../browser/vendor/flux')\n\nconst redis = require('redis')\n\nglobal.window = {\n\tlocation: { hostname: 'localhost', port: 8000 }\n}\n\nglobal.ga = function() {}\n\nfunction rand() {\n\treturn Math.floor(Math.random() * 100000)\n}\n\nvar app = require('../../app.js')\nvar agent = request.agent(app)\n\nfunction redisClient() {\n\treturn redis.createClient({\n\t\thost: process.env.REDIS || 'localhost'\n\t})\n}\n\nfunction createClient(channelName, lastEditSeen) {\n\tvar dispatcher = new Flux.Dispatcher()\n\tvar chan = new EditorChannel(dispatcher)\n\n\tvar wsUrl = 'ws://localhost:'+window.location.port+'/__editorChannel'\n\n\tchan.connect(wsUrl, {\n\t\theaders: {\n\t\t\t'Cookie': 'vs070='+session.util.encode({\n\t\t\t\tcookieName: 'vs070',\n\t\t\t\tsecret: secrets.sessionSecret,\n\t\t\t\tduration: 4100421,\n\t\t\t\tactiveDuration: 190248\n\t\t\t}, {\n\t\t\t\tuserId: new mongoose.Types.ObjectId('test1234' + (''+Date.now()).substring(8,12))\n\t\t\t})\n\t\t}\n\t})\n\t.once('ready', function() {\n\t\tchan.lastEditSeen = lastEditSeen\n\n\t\tif (channelName)\n\t\t\tchan.join(channelName, channelName)\n\t})\n\n\tchan.dispatcher = dispatcher\n\n\treturn chan\n}\n\n\nvar s1, s2\n\nvar numbers = [ 'one', 'two', 'three', 'four', 'five',\n\t'six', 'seven', 'eight', 'nine', 'ten' ]\n\nfunction burst() {\n\tvar bn = numbers.slice()\n\tvar interval = setInterval(function() {\n\t\tvar n = bn.shift()\n\t\tif (n) {\n\t\t\ts1.send({\n\t\t\t\tactionType: 'uiPluginStateChanged',\n\t\t\t\tnumber: n,\n\t\t\t\tack: 'ack-' + n\n\t\t\t})\n\t\t} else {\n\t\t\tclearInterval(interval)\n\t\t}\n\t}, 1)\n\n\ts1.on('ack-ten', function() {\n\t\ts1.close()\n\t})\n}\n\ndescribe('Multiuser', function() {\n\tvar db\n\n\tbefore(function(done) {\n\t\tglobal.dataLayer = []\n\n\t\tapp.events.once('ready', function() {\n\t\t\tdb = new mongo.Db(DBNAME,\n\t\t\t\tnew mongo.Server('localhost', 27017),\n\t\t\t\t{ safe: true })\n\n\t\t\tdb.open(function() {\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\tafter(function() {\n\t\tdb.dropDatabase()\n\t\tdb.close()\n\t\tmongoose.models = {}\n\t\tmongoose.modelSchemas = {}\n\t\tmongoose.connection.close()\n\t})\n\n\tbeforeEach(function() {\n\t\tglobal.E2 = {\n\t\t\ttrack: function() {},\n\t\t\tmodels: {\n\t\t\t\tuser: {\n\t\t\t\t\tonce: function(){}\n\t\t\t\t}\n\t\t\t},\n\t\t\tapp: {\n\t\t\t\tgrowl: function() {}\n\t\t\t},\n\t\t\tcore: {\n\t\t\t\tactive_graph: { uid: 'root' }\n\t\t\t}\n\t\t}\n\t})\n\tafterEach(function() {\n\t\t[s1, s2].map(function(s) {\n\t\t\tif (s) {\n\t\t\t\ts.close()\n\t\t\t\ts = null\n\t\t\t}\n\t\t})\n\t})\n\n\tit('should connect', function(done) {\n\t\ts1 = createClient()\n\t\ts1.once('ready', function() {\n\t\t\tdone()\n\t\t})\n\t})\n\n\tit('sends acks', function(done) {\n\t\ts1 = createClient('testack.' + Date.now())\n\t\ts1.once('youJoined', function() {\n\t\t\ts1.on('ackAbc', function() {\n\t\t\t\tdone()\n\t\t\t})\n\t\t\ts1.send({\n\t\t\t\tactionType: 'uiPluginStateChanged',\n\t\t\t\tack: 'ackAbc'\n\t\t\t})\n\t\t})\n\t})\n\n\tit('should notify two users of each others joins', function(done) {\n\t\ts1 = createClient('test1')\n\t\ts2 = createClient('test1')\n\n\t\tfunction checkCondition() {\n\t\t\tif (usersSeen.length < 4)\n\t\t\t\treturn;\n\n\t\t\tassert.ok(usersSeen.indexOf(s1.uid) > -1)\n\t\t\tassert.ok(usersSeen.indexOf(s2.uid) > -1)\n\n\t\t\tdone()\n\t\t}\n\n\t\tvar usersSeen = []\n\t\ts1.on('join', function(other) {\n\t\t\tusersSeen.push(other.id)\n\t\t\tcheckCondition()\n\t\t})\n\n\t\ts2.on('join', function(other) {\n\t\t\tusersSeen.push(other.id)\n\t\t\tcheckCondition()\n\t\t})\n\t})\n\n\tit('sends existing edit log on join', function(done) {\n\t\tvar channel = 'test2'+Math.random()\n\t\tvar edits = []\n\n\t\ts1 = createClient(channel)\n\t\ts1.once('join', burst)\n\t\ts1.once('disconnected', function() {\n\t\t\ts2 = createClient(channel)\n\t\t\ts2.dispatcher.register(function(m) {\n\t\t\t\tif (!m.actionType)\n\t\t\t\t\treturn;\n\n\t\t\t\tedits.push(m)\n\n\t\t\t\tif (edits.length === 10) {\n\t\t\t\t\tassert.deepEqual(edits.map(function(e) { return e.number }),\n\t\t\t\t\t\tnumbers)\n\n\t\t\t\t\tdone()\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t})\n\n\n\tit('keeps order of live entries', function(done) {\n\t\tvar channel = 'test3'+Math.random()\n\t\tvar edits = []\n\n\t\ts1 = createClient(channel)\n\t\ts1.once('join', function() {\n\t\t\ts2 = createClient(channel)\n\t\t\ts2.once('join', burst)\n\t\t\ts2.dispatcher.register(function(m) {\n\t\t\t\tif (!m.actionType)\n\t\t\t\t\treturn;\n\n\t\t\t\tedits.push(m)\n\n\t\t\t\tif (edits.length === 10) {\n\t\t\t\t\tassert.deepEqual(edits.map(function(e) { return e.number }),\n\t\t\t\t\t\tnumbers)\n\n\t\t\t\t\tdone()\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\n\t})\n\n\n\tit('keeps order of replayed entries', function(done) {\n\t\tvar channel = 'test3'+Math.random()\n\t\tvar edits = []\n\n\t\ts1 = createClient(channel)\n\t\ts1.once('join', burst)\n\t\ts1.once('disconnected', function() {\n\t\t\ts2 = createClient(channel)\n\t\t\ts2.dispatcher.register(function(m) {\n\t\t\t\tif (!m.actionType)\n\t\t\t\t\treturn;\n\n\t\t\t\tedits.push(m)\n\n\t\t\t\tif (edits.length === 10) {\n\t\t\t\t\tassert.deepEqual(edits.map(function(e) { return e.number }),\n\t\t\t\t\t\tnumbers)\n\n\t\t\t\t\tdone()\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t})\n\n\tit('sends log on join, leave, join back', function(done) {\n\t\tvar channel = 'one-'+Math.random()\n\t\tvar ogChannel = channel\n\t\tvar closed = false\n\n\t\ts1 = createClient(channel)\n\t\ts1.once('join', function() {\n\t\t\ts1.send({\n\t\t\t\tactionType: 'uiPluginStateChanged',\n\t\t\t\tnumber: 1,\n\t\t\t\tack: 'ack-one'\n\t\t\t})\n\n\t\t\tvar s3 = createClient(channel)\n\t\t\ts3.once('youJoined', function() {\n\t\t\t\t// join some other channel\n\t\t\t\tchannel = 'part-two-'+Math.random()\n\n\t\t\t\ts3.once('youJoined', function() {\n\t\t\t\t\t// join original channel again\n\t\t\t\t\ts3.join(ogChannel, ogChannel, function() {\n\t\t\t\t\t\ts3.dispatcher.register(function(m) {\n\t\t\t\t\t\t\tif (closed)\n\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t\tassert.ok(m.number === 1)\n\t\t\t\t\t\t\ts3.close()\n\t\t\t\t\t\t\tclosed = true\n\t\t\t\t\t\t\ts3.once('disconnected', done)\n\t\t\t\t\t\t})\n\t\t\t\t\t})\n\t\t\t\t})\n\n\t\t\t\ts3.join(channel, channel, function() {})\n\t\t\t})\n\t\t})\n\t})\n\n\tit('sends log from where left off', function(done) {\n\t\tvar channel = 'test'+Math.random()\n\n\t\ts2 = createClient(channel)\n\t\ts1 = createClient(channel)\n\n\t\tvar firstId, lastId\n\n\t\ts2.dispatcher.register(function(m) {\n\t\t\tif (!firstId)\n\t\t\t\tfirstId = m.id\n\n\t\t\tlastId = m.id\n\n\t\t\t// wait until last message\n\t\t\tif (m.number !== 2)\n\t\t\t\treturn;\n\n\t\t\t// use another client to join with a lastEditSeen set\n\t\t\tvar s3 = createClient(channel, firstId)\n\t\t\ts3.once('join', function() {\n\t\t\t\t// assert that we only get number 2\n\t\t\t\ts3.dispatcher.register(function(m) {\n\t\t\t\t\tassert.equal(m.number, 2)\n\t\t\t\t\ts3.close()\n\t\t\t\t\ts3.once('disconnected', done)\n\t\t\t\t})\n\t\t\t})\n\n\t\t})\n\n\t\t// send 1 and 2\n\t\ts1.once('join', function() {\n\t\t\t[1,2].forEach(function(n) {\n\t\t\t\ts1.send({\n\t\t\t\t\tactionType: 'uiPluginStateChanged',\n\t\t\t\t\tnumber: n\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t})\n\n\n\tit('relays messages to user from cluster', function(done) {\n\t\tvar channel = 'test'+Math.random()\n\n\t\ts1 = createClient(channel)\n\t\tvar rc = redisClient()\n\n\t\ts1.on('youJoined', function(you) {\n\t\t\ts1.on('join', function(m) {\n\t\t\t\tif (m.id === 'alice')\n\t\t\t\t\tdone()\n\t\t\t})\n\n\t\t\t// write to user's channel\n\t\t\trc.publish(s1.uid, JSON.stringify({\n\t\t\t\tkind: 'join',\n\t\t\t\tchannel: channel,\n\t\t\t\tid: 'alice'\n\t\t\t}))\n\t\t})\n\t})\n\n\n\n\tit('reconnects when user changes', function(done) {\n\t\tvar listener\n\t\tglobal.E2.models.user = {\n\t\t\tonce: function(key, cb) {\n\t\t\t\tlistener = cb\n\t\t\t}\n\t\t}\n\n\t\tvar channel = 'test'+Math.random()\n\t\ts1 = createClient(channel)\n\t\ts1.once('ready', function(uid) {\n\t\t\tvar preUid = uid\n\t\t\ts1.once('disconnected', function(m) {\n\t\t\t\ts1.once('ready', function(uid) {\n\t\t\t\t\tassert.notEqual(uid, preUid)\n\t\t\t\t\tdone()\n\t\t\t\t})\n\t\t\t})\n\n\t\t\tlistener()\n\t\t})\n\t})\n\n\n\n\tit('maintains a keepalive interval', function(done) {\n\t\tvar channel = 'test'+Math.random()\n\t\ts1 = createClient(channel)\n\t\ts1.once('ready', function() {\n\t\t\tassert.ok(s1.pingInterval)\n\t\t\ts1.wsChannel.emit('disconnected')\n\t\t\tassert.ok(!s1.pingInterval)\n\t\t\tdone()\n\t\t})\n\t})\n\n\n\n})\n"
  },
  {
    "path": "test/integration/patch-save.js",
    "content": "var testId = rand()\nprocess.env.MONGODB = 'mongodb://localhost:27017/patch'+testId\n\nvar Patch = require('../../models/patch')\nvar request = require('supertest')\nvar app = require('../../app.js')\nvar fs = require('fs')\nvar fsPath = require('path')\nvar assert = require('assert')\nvar expect = require('chai').expect\n\nvar graphFile = __dirname+'/../../browser/data/graphs/default.json'\nvar graphData = fs.readFileSync(graphFile).toString()\n\nfunction rand() {\n\treturn Math.floor(Math.random() * 10000)\n}\n\ndescribe('Patch', function() {\n\tvar username = 'user'+rand()\n\tvar deets = {\n\t\tname: 'Foo Bar',\n\t\tusername: username,\n\t\temail: username+'@test.foo',\n\t\tpassword: 'abcd1234',\n\t\tconfirmPassword: 'abcd1234'\n\t}\n\n\tvar agent = request.agent(app)\n\n\tfunction sendPatch(name, cb) {\n\t\treturn agent.post('/'+deets.username+'/patches').send({\n\t\t\tname: name,\n\t\t\tgraph: graphData\n\t\t})\n\t\t.expect(200)\n\t\t.end(cb)\n\t}\n\n\tbefore(function(done) {\n\t\tapp.events.on('ready', function() {\n\t\t\tagent\n\t\t\t.post('/signup')\n\t\t\t.send(deets)\n\t\t\t.expect(302)\n\t\t\t.end(done)\n\t\t})\n\t})\n\n\tit('should use the expected name, owner, path, and url', function(done) {\n\t\tvar name = 'This is a patch'\n\t\tvar expectedPath = '/'+username+'/patches/this-is-a-patch'\n\n\t\tsendPatch(name, function(err, res) {\n\t\t\tif (err) return done(err)\n\t\t\tvar json = {\n\t\t\t\tname: res.body.name,\n\t\t\t\tpath: res.body.path\n\t\t\t}\n  \t\t\texpect({\n\t\t\t\tname: name,\n\t\t\t\tpath: expectedPath,\n\t\t\t}).to.deep.equal(json)\n\t\t\tconsole.log('url', res.body.url)\n\t\t\tassert.equal(res.body.url.indexOf('/data'+expectedPath), 0)\n\t\t\tdone()\n\t\t})\n\t})\n\n\tit('should return data by url', function(done) {\n\t\tvar path = 'button-'+rand()\n\n\t\tsendPatch(path, function(err, res) {\n\t\t\tif (err) return done(err)\n\t\t\trequest(app).get(res.body.url)\n\t\t\t.expect(200).end(function(err, res)\n\t\t\t{\n\t\t\t\tif (err) return done(err)\n\t\t\t\tassert.equal(res.body.active_graph, 'root')\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\tit('should force the right path', function(done) {\n\t\tvar path = '/blah/quux/bar/foo.png'\n\t\tvar expectedPath = '/'+username+'/patches/foo'\n\n\t\tsendPatch(path, function(err, res) {\n\t\t\tif (err) return done(err)\n\t\t\tassert.equal(res.body.path.indexOf(expectedPath), 0)\n\t\t\tdone()\n\t\t})\n\t})\n\n\tit('should list user patches', function(done) {\n\t\tPatch.remove().exec(function(err) {\n\t\t\tif (err) return done(err)\n\n\t\t\tsendPatch('Awesomesauce Patch', function(err, res) {\n\t\t\t\tif (err) return done(err)\n\t\t\t\trequest(app)\n\t\t\t\t.get('/'+username+'/patches')\n\t\t\t\t.expect(200).end(function(err, res)\n\t\t\t\t{\n\t\t\t\t\tif (err) return done(err)\n\t\t\t\t\texpect(res.body.length).to.equal(1)\n\t\t\t\t\texpect(res.body[0].name).to.equal('Awesomesauce Patch')\n\t\t\t\t\tdone()\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t})\n})\n"
  },
  {
    "path": "test/integration/sceneUpload.js",
    "content": "var testId = rand()\nprocess.env.MONGODB = 'mongodb://localhost:27017/sceneUpload'+testId\n\nvar request = require('supertest')\nvar fs = require('fs')\nvar fsPath = require('path')\nvar mongo = require('mongodb')\nvar assert = require('assert')\n\nfunction rand() {\n\treturn Math.floor(Math.random() * 100000)\n}\n\nvar app = require('../../app.js')\n\ndescribe('Upload', function() {\n\tvar username = 'test'+testId\n\tvar deets = {\n\t\tname: 'Foo bar',\n\t\tusername: username,\n\t\temail: username+'@test.foo',\n\t\tpassword: 'abcd1234',\n\t\tconfirmPassword: 'abcd1234'\n\t}\n\t\n\tfunction makePath(model, name) {\n\t\treturn '/' + fsPath.join(deets.username, 'assets', model, name)\n\t}\n\n\tvar agent = request.agent(app)\n\tvar db\n\n\tafter(function() {\n\t\tdb.dropDatabase()\n\t\tdb.close()\n\t})\n\n\tbefore(function(done) {\n\t\tapp.events.on('ready', function() {\n\t\t\tvar that = this\n\n\t\t\tdb = new mongo.Db('upload'+testId,\n\t\t\t\tnew mongo.Server('localhost', 27017),\n\t\t\t\t{ safe: true }\n\t\t\t)\n\n\t\t\tdb.open(function() {\n\t\t\t\tagent\n\t\t\t\t.post('/signup')\n\t\t\t\t.send(deets)\n\t\t\t\t.expect(302)\n\t\t\t\t.end(done)\n\t\t\t})\n\t\t})\n\t})\n\n\tit('remaps OBJ+MTL+TGA', function(done) {\n\t\tvar scene = makePath('scene', 'lambent-obj-mtl-tga')\n\t\tvar original = scene+'.zip'\n\t\tvar stream = fs.createReadStream(__dirname+'/../fixtures/lambent-obj-mtl-tga.zip')\n\t\tstream.path = original\n\n\t\tagent\n\t\t.post('/upload/scene')\n\t\t.attach('file', stream, original)\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tif (err) return done(err)\n\t\t\tvar json = res.body\n\t\t\tdelete json._creator\n\t\t\tdelete json._id\n\t\t\tdelete json.id\n\t\t\tdelete json.createdAt\n\t\t\tdelete json.updatedAt\n\t\t\tjson.files = json.files.sort()\n\n\t\t\tfiles = [\n\t\t\t\t'/data'+scene+'/attribution.txt',\n\t\t\t\t'/data'+scene+'/lambent-obj-mtl-tga.obj',\n\t\t\t\t'/data'+scene+'/lambent-obj-mtl-tga.mtl',\n\t\t\t\t'/data'+scene+'/Lambent_Male_D.png',\n\t\t\t\t'/data'+scene+'/Lambent_Male_N.png',\n\t\t\t\t'/data'+scene+'/Lambent_Male_S.png'\n\t\t\t\t].sort()\n\n\t\t\tassert.deepEqual({__v: 0,\n\t\t\t\tpath: scene,\n\t\t\t\tname: 'lambent-obj-mtl-tga',\n\t\t\t\turl: '/data'+scene+'/lambent-obj-mtl-tga.obj',\n\t\t\t\ttags: [],\n\t\t\t\ttype: 'objmtl',\n\t\t\t\tfiles: files\n\t\t\t}, json)\n\n\t\t\tagent.get('/data'+scene+'/lambent-obj-mtl-tga.mtl')\n\t\t\t.end(function(err, res) {\n\t\t\t\tif (err)\n\t\t\t\t\treturn done(err)\n\n\t\t\t\tassert.equal('map_Kd Lambent_Male_D.png', res.text.split('\\n')[11])\n\n\t\t\t\tdone(err)\n\t\t\t})\n\t\t})\n\t})\n\n\n\tit('supports json', function(done) {\n\t\tvar scene = makePath('scene', 'teapot-claraio')\n\t\tvar original = scene+'.json'\n\t\tvar stream = fs.createReadStream(__dirname+'/../fixtures/teapot-claraio.json')\n\t\tstream.path = original\n\n\t\tagent\n\t\t.post('/upload/scene')\n\t\t.attach('file', stream, original)\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tif (err) return done(err)\n\t\t\tvar json = res.body\n\t\t\tdelete json._creator\n\t\t\tdelete json._id\n\t\t\tdelete json.id\n\t\t\tdelete json.createdAt\n\t\t\tdelete json.updatedAt\n\n\t\t\tvar files = [\n\t\t\t\t'/data'+scene+'/teapot-claraio.json'\n\t\t\t]\n\n\t\t\tassert.deepEqual({__v: 0,\n\t\t\t\tpath: scene+'/teapot-claraio.json',\n\t\t\t\tname: 'teapot-claraio.json',\n\t\t\t\turl: '/data'+scene+'/teapot-claraio.json',\n\t\t\t\ttags: [],\n\t\t\t\ttype: 'json',\n\t\t\t\tfiles: files\n\t\t\t}, json)\n\n\t\t\tdone()\n\t\t})\n\t})\n\n\n\tit('supports gltf', function(done) {\n\t\tvar scene = makePath('scene', 'cesium-man-three-gltf')\n\t\tvar original = scene+'.zip'\n\t\tvar stream = fs.createReadStream(__dirname+'/../fixtures/cesium-man-three-gltf.zip')\n\t\tstream.path = original\n\n\t\tagent\n\t\t.post('/upload/scene')\n\t\t.attach('file', stream, original)\n\t\t.expect(200)\n\t\t.end(function(err, res) {\n\t\t\tif (err) return done(err)\n\t\t\tvar json = res.body\n\t\t\tjson.files = json.files.sort()\n\t\t\tdelete json._creator\n\t\t\tdelete json._id\n\t\t\tdelete json.id\n\t\t\tdelete json.createdAt\n\t\t\tdelete json.updatedAt\n\n\t\t\tvar files = [\n\t\t\t\t'/data'+scene+'/cesium-man-three-gltf.gltf',\n\t\t\t\t'/data'+scene+'/Cesium_Man.jpg',\n\t\t\t\t'/data'+scene+'/Cesium_Man.bin',\n\t\t\t\t'/data'+scene+'/Cesium_Man0FS.glsl',\n\t\t\t\t'/data'+scene+'/Cesium_Man0VS.glsl',\n\t\t\t].sort()\n\n\t\t\tassert.deepEqual({__v: 0,\n\t\t\t\tpath: scene,\n\t\t\t\tname: 'cesium-man-three-gltf',\n\t\t\t\turl: '/data'+scene+'/cesium-man-three-gltf.gltf',\n\t\t\t\ttags: [],\n\t\t\t\ttype: 'gltf',\n\t\t\t\tfiles: files\n\t\t\t}, json)\n\n\t\t\tdone()\n\t\t})\n\t})\n\n})\n\n"
  },
  {
    "path": "test/integration/serial.js",
    "content": "var testId = rand()\nprocess.env.MONGODB = 'mongodb://localhost:27017/serial'+testId\n\nvar secrets = require('../../config/secrets')\nvar Serial = require('../../models/serial')\nvar assert = require('assert')\nvar mongoose = require('mongoose')\nmongoose.Promise = global.Promise\n\nfunction rand() {\n\treturn Math.floor(Math.random() * 100000)\n}\n\ndescribe('Serial', function() {\n\tvar connection\n\n\tbefore(function(done) {\n\t\tmongoose.connect(secrets.db)\n\t\tmongoose.connection.on('error', done)\n\t\tmongoose.connection.on('connected', c => {\n\t\t\tconnection = mongoose.connection\n\t\t\tdone()\n\t\t})\n\t})\n\n\tafter(function() {\n\t\tconnection.db.dropDatabase()\n\t\tconnection.close()\n\t})\n\n\tit('should create serials', function(done) {\n\t\tSerial.next('test-first-'+testId)\n\t\t.then(function(serial) {\n\t\t\tassert.equal(1, serial)\n\t\t\tdone()\n\t\t})\n\t\t.catch(done)\n\t})\n\n\tit('should increase serials', function(done) {\n\t\tSerial.next('test-increase-'+testId)\n\t\t.then(function(serial) {\n\t\t\treturn Serial.next('test-increase-'+testId)\n\t\t\t.then(function(serial) {\n\t\t\t\tassert.equal(2, serial)\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t\t.catch(done)\n\t})\n\n})\n\n"
  },
  {
    "path": "test/integration/upload.js",
    "content": "var testId = rand()\nprocess.env.MONGODB = 'mongodb://localhost:27017/upload'+testId\nprocess.env.RETHINKDB_NAME = 'upload' + testId\n\nvar request = require('supertest');\nvar fs = require('fs');\nvar fsPath = require('path');\nvar mongo = require('mongodb');\nvar expect = require('chai').expect;\n\nfunction rand() {\n\treturn Math.floor(Math.random() * 100000);\n}\n\nvar app = require('../../app.js');\n\ndescribe('Upload', function() {\n\tvar username = 'test'+testId;\n\tvar deets = {\n\t\tname: 'Foo bar',\n\t\tusername: username,\n\t\temail: username+'@test.foo',\n\t\tpassword: 'abcd1234',\n\t\tconfirmPassword: 'abcd1234'\n\t};\n\t\n\tfunction makePath(model, name) {\n\t\treturn '/' + fsPath.join(deets.username, 'assets', model, name)\n\t}\n\n\tvar agent = request.agent(app);\n\tvar db;\n\n\tafter(function() {\n\t\tdb.dropDatabase();\n\t})\n\n\tbefore(function(done) {\n\t\tapp.events.on('ready', function() {\n\t\t\tvar that = this;\n\n\t\t\tdb = new mongo.Db('upload'+testId,\n\t\t\t\tnew mongo.Server('localhost', 27017),\n\t\t\t\t{ safe: true }\n\t\t\t)\n\n\t\t\tdb.open(function() {\n\t\t\t\tagent\n\t\t\t\t.post('/signup')\n\t\t\t\t.send(deets)\n\t\t\t\t.expect(302)\n\t\t\t\t.end(done)\n\t\t\t});\n\t\t})\n\t});\n\n\tdescribe('Image', function()\n\t{\n\t\tit('should upload correctly', function(done) {\n\t\t\tvar original = makePath('image', testId+'.png')\n\t\t\tvar thumb = makePath('image', testId+'-thumb.png')\n\t\t\tvar scaled = makePath('image', testId+'-scaled.png')\n\t\t\tvar scaledThumb = makePath('image', testId+'-scaled-thumb.png')\n\t\t\tvar stream = fs.createReadStream(__dirname+'/../fixtures/te-2rb.jpg');\n\t\t\tstream.path = original\n\n\t\t\tagent\n\t\t\t.post('/upload/image')\n\t\t\t.attach('file', stream, original)\n\t\t\t.expect(200)\n\t\t\t.end(function(err, res) {\n\t\t\t\tif (err) return done(err);\n\t\t\t\tvar json = res.body;\n\t\t\t\tdelete json._creator;\n\t\t\t\tdelete json._id;\n\t\t\t\tdelete json.createdAt;\n\t\t\t\tdelete json.updatedAt;\n\t\t\t\tdelete json.original.bytes;\n\t\t\t\tdelete json.scaledThumbnail.bytes;\n\t\t\t\tdelete json.scaled.bytes;\n\n\t\t\t\texpect(json.url.length).to.equal(56);\n\t\t\t\texpect(json.original.url.length).to.equal(56);\n\t\t\t\texpect(json.scaled.url.length).to.equal(56);\n\t\t\t\texpect(json.scaledThumbnail.url.length).to.equal(56);\n\n\t\t\t\tdelete json.url; delete json.scaled.url; delete json.original.url; delete json.scaledThumbnail.url;\n\n\t\t\t\texpect({__v:0,path:original,\n\t\t\t\t\ttags:['texture'],\n\t\t\t\t\tscaledThumbnail:{mimetype:'image/png',width:128,height:64,path:scaledThumb},\n\t\t\t\t\tscaled:{mimetype:'image/png',width:2048,height:1024,path:scaled},\n\t\t\t\t\toriginal:{mimetype:'image/png',width:1920,height:1080,path:original}\n\t\t\t\t\t})\n\t\t\t\t\t.to.deep.equal(json);\n\t\t\t\tdone(err);\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe('Audio', function() {\n\t\tit('should upload correctly', function(done) {\n\t\t\tvar audio = makePath('audio', testId+'.ogg');\n\t\t\tvar stream = fs.createReadStream(__dirname+'/../../browser/data/audio/inedible_candy.ogg');\n\t\t\tstream.path = audio\n\n\t\t\tagent\n\t\t\t.post('/upload/audio')\n\t\t\t.attach('file', stream, audio)\n\t\t\t.expect(200)\n\t\t\t.end(function(err, res) {\n\t\t\t\tif (err) return done(err);\n\t\t\t\tvar json = res.body;\n\t\t\t\tdelete json._creator;\n\t\t\t\tdelete json._id;\n\t\t\t\tdelete json.createdAt;\n\t\t\t\tdelete json.updatedAt;\n\t\t\t\tconsole.log(json)\n\n\t\t\t\texpect({\"__v\":0,\n\t\t\t\t\t\"path\":audio,\n\t\t\t\t\t\"url\":\"/data/audio/84a9746d5ac7d62fae337f2e3d878d8e949d71a3.ogg\",\n\t\t\t\t\t\"tags\":[]}).to.deep.equal(json);\n\t\t\t\tdone(err);\n\t\t\t});\n\t\t});\n\t});\n\n\tdescribe('JSON', function()\n\t{\n\t\tit('should upload correctly', function(done) {\n\t\t\tvar jsonFile = makePath('json', testId+'.json');\n\t\t\tvar stream = fs.createReadStream(__dirname+'/../fixtures/graph.json');\n\t\t\tstream.path = jsonFile\n\n\t\t\tagent\n\t\t\t.post('/upload/json')\n\t\t\t.attach('file', stream, jsonFile)\n\t\t\t.expect(200)\n\t\t\t.end(function(err, res) {\n\t\t\t\tif (err) return done(err);\n\t\t\t\tvar json = res.body;\n\t\t\t\tdelete json._creator;\n\t\t\t\tdelete json._id;\n\t\t\t\tdelete json.createdAt;\n\t\t\t\tdelete json.updatedAt;\n\n\t\t\t\texpect({\"__v\":0,\"path\":jsonFile,\n\t\t\t\t\t\"url\":\"/data/json/ab7571a524dec35a280b8fcbd10c3b39ff4e0546.json\",\"tags\":[]})\n\t\t\t\t.to.deep.equal(json);\n\n\t\t\t\tdone(err);\n\t\t\t});\n\t\t});\n\t});\n\n});\n\n"
  },
  {
    "path": "test/integration/uploadAnonymous.js",
    "content": "var testId = rand()\nprocess.env.MONGODB = 'mongodb://localhost:27017/upload'+testId\nprocess.env.RETHINKDB_NAME = 'upload' + testId\n\nvar request = require('supertest');\nvar fs = require('fs');\nvar fsPath = require('path');\nvar mongo = require('mongodb');\nvar expect = require('chai').expect;\n\nfunction rand() {\n\treturn Math.floor(Math.random() * 100000);\n}\n\nvar app = require('../../app.js');\n\ndescribe('Upload', function() {\n\tvar username = 'v'\n\tvar deets = {\n\t\tname: 'Foo bar',\n\t\tusername: username,\n\t\temail: username+'@test.foo',\n\t\tpassword: 'abcd1234',\n\t\tconfirmPassword: 'abcd1234'\n\t};\n\n\tfunction makePath(model, name) {\n\t\treturn '/' + fsPath.join(deets.username, 'assets', model, name)\n\t}\n\n\tvar agent = request.agent(app);\n\tvar db;\n\n\tbefore(function(done) {\n\t\tvar that = this;\n\n\t\tapp.events.on('ready', () => {\n\t\t\tdb = new mongo.Db('upload'+testId,\n\t\t\t\tnew mongo.Server('localhost', 27017),\n\t\t\t\t{ safe: true }\n\t\t\t)\n\n\t\t\tdb.open(done);\n\t\t})\n\t})\n\n\tafter(function() {\n\t\tdb.dropDatabase();\n\t})\n\n\tdescribe('Image', function()\n\t{\n\t\tit('should upload correctly', function(done) {\n\t\t\tvar original = makePath('image', testId+'.png')\n\t\t\tvar thumb = makePath('image', testId+'-thumb.png')\n\t\t\tvar scaled = makePath('image', testId+'-scaled.png')\n\t\t\tvar scaledThumb = makePath('image', testId+'-scaled-thumb.png')\n\t\t\tvar stream = fs.createReadStream(__dirname+'/../fixtures/te-2rb.jpg');\n\t\t\tstream.path = original\n\n\t\t\tagent\n\t\t\t.post('/uploadAnonymous/image')\n\t\t\t.attach('file', stream, original)\n\t\t\t.expect(200)\n\t\t\t.end(function(err, res) {\n\t\t\t\tif (err) return done(err);\n\t\t\t\tvar json = res.body;\n\t\t\t\tdelete json._creator;\n\t\t\t\tdelete json._id;\n\t\t\t\tdelete json.createdAt;\n\t\t\t\tdelete json.updatedAt;\n\t\t\t\tdelete json.original.bytes;\n\t\t\t\tdelete json.scaledThumbnail.bytes;\n\t\t\t\tdelete json.scaled.bytes;\n\n\t\t\t\texpect(json.url.length).to.equal(56);\n\t\t\t\texpect(json.original.url.length).to.equal(56);\n\t\t\t\texpect(json.scaled.url.length).to.equal(56);\n\t\t\t\texpect(json.scaledThumbnail.url.length).to.equal(56);\n\n\t\t\t\tdone(err);\n\t\t\t});\n\t\t});\n\t});\n\n});\n"
  },
  {
    "path": "test/services/assetService.js",
    "content": "var assert = require('assert');\nvar AssetService = require('../../services/assetService');\nvar _ = require('lodash');\n\nfunction MockGraph()\n{\n\tthis.find = this.findOne = this.exec = this.skip = this.limit =\n\tthis.populate = function() { return this; };\n\tthis.sort = function() { return this; };\n\tthis.save = function(cb) { cb(); };\n};\n\ndescribe('AssetService', function()\n{\n\tvar s, model;\n\n\tbeforeEach(function()\n\t{\n\t\tmodel = new MockGraph()\n\t\ts = new AssetService(model);\n\t});\n\n\tit('handles errors from model', function(done)\n\t{\n\t\tmodel.exec = function(cb)\n\t\t{\n\t\t\treturn cb(new Error('nope'));\n\t\t};\n\t\ts.list()\n\t\t.catch(function(err)\n\t\t{\n\t\t\tassert.equal(err.message, 'nope');\n\t\t\tdone();\n\t\t})\n\t});\n\n\tit('lists items from model', function(done)\n\t{\n\t\tmodel.exec = function(cb)\n\t\t{\n\t\t\treturn cb(null, ['a', 'b']);\n\t\t};\n\t\ts.list()\n\t\t.then(function(list)\n\t\t{\n\t\t\tassert.deepEqual(list, ['a', 'b']);\n\t\t\tdone();\n\t\t});\n\t});\n\n\tit('allows write on non-existent path', function(done)\n\t{\n\t\tmodel.exec = function(cb)\n\t\t{\n\t\t\treturn cb(null, null);\n\t\t};\n\t\ts.canWrite({ id: 'user' }, 'graph')\n\t\t.then(function(can)\n\t\t{\n\t\t\tassert.ok(can);\n\t\t\tdone();\n\t\t});\n\t});\n\n\tit('allows write on existing user-owned asset', function(done)\n\t{\n\t\tmodel.exec = function(cb)\n\t\t{\n\t\t\treturn cb(null, {_creator: 'someguy' });\n\t\t};\n\t\ts.canWrite({ id: 'someguy' }, 'graph')\n\t\t.then(function(can)\n\t\t{\n\t\t\tassert.ok(can);\n\t\t\tdone();\n\t\t});\n\t});\n\n\tit('denies write on existing non-user-owned asset', function(done)\n\t{\n\t\tmodel.exec = function(cb)\n\t\t{\n\t\t\treturn cb(null, {_creator: 'someguy' });\n\t\t};\n\t\ts.canWrite({ id: 'user' }, 'graph')\n\t\t.then(function(can)\n\t\t{\n\t\t\tassert.ok(!can);\n\t\t\tdone();\n\t\t});\n\t});\n\n\tit('can find by path', function(done)\n\t{\n\t\tmodel.findOne = function(search)\n\t\t{\n\t\t\tassert.equal(search.path, 'somegraph')\n\t\t\treturn this;\n\t\t};\n\t\tmodel.exec = function(cb)\n\t\t{\n\t\t\treturn cb();\n\t\t};\n\t\ts.findByPath('somegraph')\n\t\t.then(function()\n\t\t{\n\t\t\tdone();\n\t\t});\n\t});\n\n\tit('can save', function(done)\n\t{\n\t\tfunction MockSave(data) {\n\t\t\t_.extend(this, data);\n\t\t}\n\t\tMockSave.exec = function(cb) { cb() }\n\t\tMockSave.populate = function() { return this; }\n\t\tMockSave.findOne = function() { return this; }\n\t\tMockSave.prototype.save = function() {\n\t\t\tassert.equal(this._creator, 'someguy');\n\t\t\tassert.equal(this.url, 'somegraph');\n\t\t\tdone()\n\t\t}\n\t\ts = new AssetService(MockSave);\n\t\ts.save({url: 'somegraph'}, {id: 'someguy'});\n\t});\n});\n\n"
  },
  {
    "path": "test/services/graphService.js",
    "content": "function rand() {\n\treturn Math.floor(Math.random() * 10000)\n}\nvar testId = rand()\nvar testDb = 'graphsvc'+testId\nprocess.env.MONGODB = 'mongodb://localhost:27017/'+testDb\n\nvar app = require('../../app.js')\nvar mongoose = require('mongoose')\n\nvar request = require('supertest')\nvar assert = require('assert')\n\nvar Graph = require('../../models/graph.js')\nvar GraphService = require('../../services/graphService')\nvar _ = require('lodash')\nvar fs = require('fs')\n\nvar graphFile = __dirname+'/../../browser/data/graphs/default.json'\nvar graphData = fs.readFileSync(graphFile).toString('utf8')\n\nvar graphFile2 = __dirname+'/../../browser/data/graphs/example.json'\nvar graphData2 = fs.readFileSync(graphFile2).toString('utf8')\n\nvar someFailed = false\n\ndescribe('GraphService', function() {\n\n\tvar agent = request.agent(app)\n\n\tfunction sendGraph(path, data, cb) {\n\t\treturn agent.post('/graph').send({\n\t\t\tpath: path,\n\t\t\tgraph: data\n\t\t})\n\t\t.expect(200)\n\t\t.end(cb)\n\t}\n\n\tvar svc\n\n\tvar usernameA, usernameB\n\tvar paging = {\n\t\toffset: 0,\n\t\tlimit: 100\n\t}\n\n\tbefore(function(){\n\t\tconsole.log('* db is graphsvc'+testId)\n\n\t\tvar rnd = rand()\n\t\t// must be lowercase\n\t\tusernameA = 'user' + rnd + 'a'\n\t\tusernameB = 'user' + rnd + 'b'\n\t\tvar deets1 = {\n\t\t\tname: 'Foo bar',\n\t\t\tusername: usernameA,\n\t\t\temail: usernameA+'@test.foo',\n\t\t\tpassword: 'abcd1234',\n\t\t\tconfirmPassword: 'abcd1234'\n\t\t}\n\t\tvar deets2 = {\n\t\t\tname: 'Qwe Baz',\n\t\t\tusername: usernameB,\n\t\t\temail: usernameB+'@test.foo',\n\t\t\tpassword: 'abdea1234',\n\t\t\tconfirmPassword: 'abdea1234'\n\t\t}\n\n\t\tvar postAcct = function() {\n\t\t\tvar deets = this\n\t\t\treturn new Promise(function(resolve, reject){\n\t\t\t\tagent\n\t\t\t\t\t.post('/signup')\n\t\t\t\t\t.send(deets)\n\t\t\t\t\t.expect(302)\n\t\t\t\t\t.end(function(err, data){\n\t\t\t\t\t\tif (err)\n\t\t\t\t\t\t\treject(err)\n\t\t\t\t\t\tresolve(data)\n\t\t\t\t\t})\n\t\t\t})\n\t\t}\n\n\t\tvar postGraph = function() {\n\t\t\tvar data = this\n\t\t\treturn new Promise(function(resolve, reject) {\n\t\t\t\tvar now = new Date().getTime()\n\t\t\t\twhile (now === new Date().getTime()) {}\t\t// wait a msec\n\t\t\t\tsendGraph(data.path, data.graph, function(err, data){\n\t\t\t\t\tif (err)\n\t\t\t\t\t\treject(err)\n\t\t\t\t\tresolve(data)\n\t\t\t\t})\n\t\t\t})\n\t\t}\n\n\t\treturn postAcct.call(deets1)\n\t\t\t.then(postGraph.bind({path:'/'+usernameA+'/testa1', graph: graphData}))\n\t\t\t.then(postGraph.bind({path:'/'+usernameA+'/testa2', graph: graphData2}))\n\t\t\t.then(postAcct.bind(deets2))\n\t\t\t.then(postGraph.bind({path:'/'+usernameB+'/testb1', graph: graphData}))\n\t\t\t.then(postGraph.bind({path:'/'+usernameB+'/testb2', graph: graphData2}))\n\t\t\t.then(function(){\n\t\t\t\tconsole.log('* users are ' + usernameB + ', ' + usernameB)\n\t\t\t\treturn Promise.resolve()\n\t\t\t})\n\t})\n\n\tbeforeEach(function(done) {\n\t\tsvc = new GraphService(Graph)\n\t\tdone()\n\t})\n\n\tafterEach(function(done) {\n\t\tif (this.currentTest.state === 'failed') {\n\t\t  someFailed = true\n\t\t}\n\t\tdone()\n\t})\n\n\tafter(function(done){\n\t\tif (someFailed)\n\t\t\treturn done()\n\n\t\tmongoose.connect('mongodb://localhost:27017/'+testDb, function(){\n\t\t\tmongoose.connection.db.dropDatabase(function(){\n\t\t\t\tconsole.log('dropped test DB: ' + testDb );\n\t\t\t\tdone()\n\t\t\t})\n\t\t})\n\t})\n\n\n\tit('finds by creator username', function() {\n\t\treturn svc.findByCreatorName(usernameA)\n\t\t\t.then(function(data){\n\t\t\t\tassert.equal(data.length, 2)\n\t\t\t\tassert.equal(data[0].name, 'testa2')\n\t\t\t\tassert.equal(data[1].url.indexOf('/data/graph/'+usernameA+'/testa1'), 0)\n\t\t\t\tassert.equal(data[1].path, '/'+usernameA+'/testa1')\n\t\t\t})\n\t})\n\n\tit('counts and finds graphs', function(){\n\t\treturn svc.countAndFind(null, null, '_id name owner', paging)\n\t\t\t.then(function(data){\n\t\t\t\tvar hasList = !!data.list\n\t\t\t\tvar hasMeta = !!data.meta\n\t\t\t\tassert.equal(hasList, true, 'data should contain .list')\n\t\t\t\tassert.equal(hasMeta, true, 'data should contain .meta information')\n\t\t\t\tassert.equal(data.meta.totalCount, 4)\n\t\t\t\tassert.equal(data.meta.listCount, data.list.length, 'meta listCount is not the same as list length')\n\t\t\t})\n\t})\n\n\n\tit('attaches owners info', function(){\n\t\treturn svc._listWithOwners(null, 'name,owner,_creator', null, paging)\n\t\t\t.then(function (data) {\n\t\t\t\tvar hasOwners = !!data.owners && !_.isEmpty(data.owners)\n\n\t\t\t\tassert.equal(hasOwners, true, 'data has no owners?')\n\t\t\t\tassert.equal(Object.keys(data.owners).length, 2)\n\n\t\t\t\tvar graphOwnerIds = {}\n\t\t\t\tfor (var graph of data.list) {\n\t\t\t\t\tgraphOwnerIds[graph._creator] = graph._creator\n\t\t\t\t}\n\n\t\t\t\tvar userAfound = false\n\t\t\t\tvar userBfound = false\n\t\t\t\tfor (var ownerId in data.owners) {\n\t\t\t\t\tif (!data.owners.hasOwnProperty(ownerId))\n\t\t\t\t\t\tcontinue\n\n\t\t\t\t\tif (data.owners[ownerId].username === usernameA)\n\t\t\t\t\t\tuserAfound = true\n\t\t\t\t\tif (data.owners[ownerId].username === usernameB)\n\t\t\t\t\t\tuserBfound = true\n\n\t\t\t\t\tassert.equal(ownerId, graphOwnerIds[ownerId], 'owner ' + ownerId + ' must be a _creator in the list of graphs')\n\t\t\t\t}\n\n\t\t\t\tassert.equal(userAfound, true, 'could not find ' + usernameA + ' in returned owners')\n\t\t\t\tassert.equal(userBfound, true, 'could not find ' + usernameB + ' in returned owners')\n\n\t\t\t})\n\t})\n\n})\n"
  },
  {
    "path": "test/unit/editorChannelServer.js",
    "content": "var mongoose = require('mongoose')\nvar EventEmitter = require('events').EventEmitter\nvar assert = require('assert')\nvar EditorChannelServer = require('../../lib/editorChannelServer').EditorChannelServer\n\nfunction makeClient(id) {\n\treturn {\n\t\tid: id,\n\t\tsocket: new EventEmitter(),\n\t\tchannels: [],\n\t\ttoJson: function() {\n\t\t\treturn {}\n\t\t}\n\t}\n}\n\ndescribe('EditorChannelServer', function() {\n\tafter(function() {\n\t\tmongoose.models = {}\n\t\tmongoose.modelSchemas = {}\n\t\tmongoose.connection.close()\n\t})\n\n\tit('removes correctly on leave', function() {\n\t\tvar client = makeClient('a1')\n\t\tvar ecs = new EditorChannelServer()\n\t\tecs.joinChannel('Global', 'foo', client, { activeGraphUid: 'a' })\n\t\tassert.equal(ecs.channels.Global.length, 1)\n\t\tecs.leaveChannel('Global', client)\n\t\tassert.equal(ecs.channels.Global.length, 0)\n\t})\n\n\tit('removes correctly on socket close', function() {\n\t\tvar client = makeClient('a2')\n\t\tvar ecs = new EditorChannelServer()\n\t\tecs.joinChannel('Global', 'foo', client, { activeGraphUid: 'a' })\n\t\tassert.equal(ecs.channels.Global.length, 1)\n\t\tecs.onSocketClosed(client)\n\t\tassert.equal(ecs.channels.Global.length, 0)\n\t})\n})\n"
  },
  {
    "path": "test/unit/graphAnalyser.js",
    "content": "var assert = require('assert')\nvar fs = require('fs')\nvar when = require('when')\nvar GraphAnalyser = require('../../common/graphAnalyser').GraphAnalyser\n\nvar componentJson = fs.readFileSync(__dirname+'/../fixtures/component-rotation-y.json')\nvar graphJson = fs.readFileSync(__dirname+'/../fixtures/loaders.json')\n\ndescribe('Graph analysis', function() {\n\tvar ga\n\n\tbeforeEach(function() {\n\t\tga = new GraphAnalyser({\n\t\t\tstat: function(url) {\n\t\t\t\tvar dfd = when.defer()\n\t\t\t\tdfd.resolve({ length: 2 })\n\t\t\t\treturn dfd.promise\n\t\t\t}\n\t\t})\n\t})\n\n\tit('parses the size', function(done) {\n\t\tga.analyseJson(graphJson)\n\t\t.then(function(stat) {\n\t\t\tassert.equal(stat.size, 8)\n\t\t\tdone()\n\t\t})\n\t})\n\n\tit('finds audio', function(done) {\n\t\tga.analyseJson(graphJson)\n\t\t.then(function(stat) {\n\t\t\tassert.equal(stat.hasAudio, true)\n\t\t\tdone()\n\t\t})\n\t})\n\n\tit('finds component', function(done) {\n\t\tga.analyseJson(componentJson)\n\t\t.then(function(stat) {\n\t\t\tassert.equal(stat.type, 'entity_component')\n\t\t\tdone()\n\t\t})\n\t})\n\n\tit('parses the number of assets', function(done) {\n\t\tga.analyseJson(graphJson)\n\t\t.then(function(stat) {\n\t\t\tassert.equal(stat.numAssets, 4)\n\t\t\tdone()\n\t\t})\n\t})\n\n\tit('returns 0 size if assets not found', function(done) {\n\t\tga = new GraphAnalyser({\n\t\t\tstat: function() {\n\t\t\t\treturn when.resolve()\n\t\t\t}\n\t\t})\n\n\t\tga.analyseJson(graphJson)\n\t\t.then(function(stat) {\n\t\t\tassert.equal(stat.numAssets, 4)\n\t\t\tassert.equal(stat.size, 0)\n\t\t\tdone()\n\t\t})\n\t})\n\n})\n"
  },
  {
    "path": "test/unit/graphOptimizer.js",
    "content": "var expect = require('chai').expect;\nvar fs = require('fs-extra');\nvar GraphOptimizer = require('../../lib/graphOptimizer');\n\ndescribe('Graph optimizer', function() {\n\tvar source = JSON.parse(fs.readFileSync(__dirname+'/../fixtures/te-2rb.json').toString());\n\tvar optimized = JSON.parse(fs.readFileSync(__dirname+'/../fixtures/te-2rb.optimized.json').toString());\n\n\tit('produces the right output', function() {\n\t\tvar oldEnv = process.env.NODE_ENV;\n\t\tprocess.env.NODE_ENV = 'production';\n\n\t\tvar output = new GraphOptimizer()\n\t\t\t.graph(source)\n\t\t\t.optimize();\n\n\t\texpect(output).to.deep.equal(optimized);\n\t\tprocess.env.NODE_ENV = oldEnv;\n\t});\n\n});\n\n"
  },
  {
    "path": "test/unit/gridfs-storage.js",
    "content": "var GridFsStorage = require('../../lib/gridfs-storage');\nvar when = require('when');\nvar nodefn = require('when/node');\nvar assert = require('assert');\nvar fsPath = require('path');\nvar fs = require('fs-extra');\nvar EventEmitter = require('events').EventEmitter;\nvar mongo = require('mongodb');\nvar Grid = require('gridfs-stream');\n\nvar images = {\n\tsmall: __dirname+'/../../browser/images/engilogo.png',\n\ttexture: __dirname+'/../../browser/images/no_texture.png'\n};\n\ndescribe('GridFsStorage', function()\n{\n\tvar gfs, db, grid;\n\n\tbefore(function(done)\n\t{\n\t\tvar that = this;\n\n\t\tdb = new mongo.Db('test'+process.pid,\n\t\t\tnew mongo.Server('localhost', 27017),\n\t\t\t{ safe: true }\n\t\t);\n\n\t\tdb.open(function(err)\n\t\t{\n\t\t\tif (err) throw err;\n\n\t\t\tdb.collection('fs.files', function(err, coll) {\n\t\t\t\tif (err) throw err;\n\t\t\t\tcoll.ensureIndex({ filename: -1 }, { unique: true }, function() {});\n\t\t\t});\n\n\t\t\tgrid = Grid(db, mongo);\n\n\t\t\tgfs = new GridFsStorage('/foo', grid);\n\t\t\tgfs.on('ready', function()\n\t\t\t{\n\t\t\t\tgfs.copy(images.small, '/images/engilogo.png')\n\t\t\t\t.then(function()\n\t\t\t\t{\n\t\t\t\t\tdone();\t\t\t\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n\n\tafter(function()\n\t{\n\t\tdb.dropDatabase();\n\t})\n\n\tit('can copy file from filesystem', function(done)\n\t{\n\t\tgfs.copy(images.texture, '/images/no_texture.png')\n\t\t.then(function()\n\t\t{\n\t\t\treturn gfs.stat('/images/no_texture.png')\n\t\t\t.then(function(stat)\n\t\t\t{\n\t\t\t\tassert.equal(stat.length, 18215);\n\t\t\t\tdone();\n\t\t\t});\n\t\t})\n\t\t.catch(done);\n\t});\n\n\tit('can find files by path', function(done)\n\t{\n\t\tgfs.stat('/images/engilogo.png')\n\t\t.then(function(file)\n\t\t{\n\t\t\tassert.equal(file.length, 31482);\n\t\t\tdone();\n\t\t})\n\t\t.catch(done);\n\t});\n\n\tit('can read files', function()\n\t{\n\t\tvar stream = gfs.read('/images/engilogo.png');\n\t\tassert.equal(stream.name, '/images/engilogo.png');\n\t});\n\n\tit('returns the right urls', function(done)\n\t{\n\t\tgfs.copy(images.texture, '/images/no_texture.png')\n\t\t.then(function(url)\n\t\t{\n\t\t\tassert.equal('/foo/images/no_texture.png', url);\n\t\t\tdone();\n\t\t})\n\t\t.catch(done);\n\t});\n\n\tit('can read partial file from filesystem', function(done) {\n\t\tvar stream = gfs.createReadStream('/images/engilogo.png', {startPos: 1000, endPos: 2000});\n\t\tassert.equal(stream.name, '/images/engilogo.png');\n\t\tassert.equal(stream.range.startPos, 1000);\n\t\tassert.equal(stream.range.endPos, 2000);\n\n\t\tvar buffers = [];\n\t\tstream.on(\"data\", function (chunk) {\n\t\t\tbuffers.push(chunk);\n\t\t})\n\t\tstream.on(\"end\", function () {\n\t\t\tvar buffer = Buffer.concat(buffers);\n\t\t\tvar bufferLength = buffer.length;\n\t\t\tassert.equal(bufferLength, 1001);\n\t\t\tdone();\n\t\t})\n\t\tstream.on(\"error\", function (err) {\n\t\t\tthrow err;\n\t\t})\n\n\t});\n\n});\n\n"
  },
  {
    "path": "test/unit/imageProcessor.js",
    "content": "var ImageProcessor = require('../../lib/imageProcessor')\nvar when = require('when')\nvar nodefn = require('when/node')\nvar assert = require('assert')\nvar fsPath = require('path')\nvar fs = require('fs-extra')\n\nvar images = {\n\tlarge: {\n\t\t\tname: 'te-2rb.jpg',\n\t\t\tpath: __dirname+'/../fixtures/te-2rb.jpg'\n\t},\n\tlargeTexture: {\n\t\t\tname: 'no_texture.png',\n\t\t\tpath: __dirname+'/../../browser/images/no_texture.png'\n\t},\n\tsmall: {\n\t\t\tname: 'engilogo.png',\n\t\t\tpath: __dirname+'/../../browser/images/engilogo.png'\n\t}\n}\n\ndescribe('ImageProcessor', function() {\n\tvar imp, upload\n\n\tbeforeEach(function() {\n\t\timp = new ImageProcessor({\n\t\t\tcopy: function(sourcePath, destination) {\n\t\t\t\tvar dfd = when.defer()\n\t\t\t\t// nodefn.call(fs.copy, path, '/tmp/foo/'+name)\n\t\t\t\t// .then(function() { return path })\n\t\t\t\tdfd.resolve('/files'+destination)\n\t\t\t\treturn dfd.promise\n\t\t\t}\n\t\t})\n\t})\n\n\tit('analyzes image correctly', function(done) {\n\t\timp.analyze(images.small.path)\n\t\t.then(function(data) {\n\t\t\tassert.equal(data.width, 164)\n\t\t\tassert.equal(data.height, 164)\n\t\t\tassert.equal(data.sha1, 'f09d10f5fa34355c597ad20294f4542ebe3111cc')\n\t\t\tdone()\n\t\t})\n\t\t.catch(done)\n\t})\n\n\tit('skips thumbnailing if below threshold', function(done) {\n\t\timp.handleUpload(images.small, 'foo')\n\t\t.then(function(data) {\n\t\t\tassert.equal(data.scaled.url, data.scaledThumbnail.url)\n\t\t\tdone()\n\t\t})\n\t\t.catch(done)\n\t})\n\n\tit('maintains aspect ratio for thumbnail', function(done) {\n\t\timp.handleUpload(images.large, 'foo')\n\t\t.then(function(data) {\n\t\t\tassert.equal(data.scaledThumbnail.width, 128)\n\t\t\tassert.equal(data.scaledThumbnail.height, 64)\n\t\t\tdone()\n\t\t})\n\t\t.catch(done)\n\t})\n\n\tit('generates the right versions for large', function(done) {\n\t\timp.handleUpload(images.large, 'foo')\n\t\t.then(function(data) {\n\t\t\tassert.equal(data.original.width, 1920)\n\t\t\tassert.equal(data.scaled.width, 2048)\n\t\t\tassert.equal(data.scaledThumbnail.width, 128)\n\t\t\tdone()\n\t\t})\n\t\t.catch(done)\n\t})\n\n\tit('generates the right versions for large texture', function(done) {\n\t\timp.handleUpload(images.largeTexture, 'foo')\n\t\t.then(function(data) {\n\t\t\tassert.equal(data.original.width, 256)\n\t\t\tassert.equal(data.scaled.width, 256)\n\t\t\tassert.equal(data.scaledThumbnail.width, 128)\n\t\t\tdone()\n\t\t})\n\t\t.catch(done)\n\t})\n\n\tit('generates the right versions for small', function(done) {\n\t\timp.handleUpload(images.small, 'foo')\n\t\t.then(function(data) {\n\t\t\tassert.equal(data.original.width, 164)\n\t\t\tassert.equal(data.scaled.width, 128)\n\t\t\tassert.equal(data.scaledThumbnail.width, 128)\n\t\t\tdone()\n\t\t})\n\t\t.catch(done)\n\t})\n\n\tit('puts the files in the right places', function(done) {\n\t\timp.handleUpload(images.large, '/images')\n\t\t.then(function(data) {\n\t\t\tvar fplen = '/files/image/abc83484eec1f6e0e597147c47978488ef39e795.png'.length\n\t\t\tassert.equal(data.original.path, '/images/te-2rb.jpg')\n\t\t\tassert.equal(data.original.url.length, fplen)\n\t\t\tassert.equal(data.scaled.path, '/images/te-2rb-scaled.jpg')\n\t\t\tassert.equal(data.scaled.url.length, fplen)\n\t\t\tassert.equal(data.scaledThumbnail.path, '/images/te-2rb-scaled-thumb.png')\n\t\t\tassert.equal(data.scaledThumbnail.url.length, fplen)\n\t\t\tdone()\n\t\t})\n\t\t.catch(done)\n\t})\n\n\tit('sets up the correct tag for texture', function(done) {\n\t\timp.handleUpload(images.small, 'foo')\n\t\t.then(function(data) {\n\t\t\tassert.deepEqual(data.tags, ['texture'])\n\t\t\tdone()\n\t\t})\n\t\t.catch(done)\n\t})\n})\n"
  },
  {
    "path": "test/unit/migrations/0.6.0-slotname.js",
    "content": "var fs = require('fs')\nvar assert = require('assert')\n\nvar migrateGraphToUseSlotNames = require(__dirname+'/../../../tools/migration/0.6.0/migrate')\n\t.migrateGraphToUseSlotNames\n\nvar fixture = fs.readFileSync(__dirname+'/../../fixtures/slider-float.json')\n\nvar parsePluginSlots = require('../../../lib/parsePluginSlots')\n\ndescribe('parsePluginSlots', function() {\n\tit('finds slots', function() {\n\t\tvar slots = parsePluginSlots()\n\t\tassert.equal(slots['sine_modulator.0'][0], 'time')\n\t\tassert.equal(slots['runtime_event_write.0'][2], 'data')\n\t})\n})\n\ndescribe('Minimal graph migration to use slot UIDs', function() {\n\tvar graph = {\n\t\tnodes: [\n\t\t\t{ uid: 'nuid-a', plugin: 'pluginId-a' },\n\t\t\t{ uid: 'nuid-b', plugin: 'pluginId-b' },\n\t\t],\n\t\tconns: [{\n\t\t\tsrc_nuid: 'nuid-a',\n\t\t\tdst_nuid: 'nuid-b',\n\t\t\tsrc_slot: 0,\n\t\t\tdst_slot: 0\n\t\t}]\n\t}\n\n\tvar slotMap = {\n\t\t'pluginId-a.1': [ 'slot-a' ], // output\n\t\t'pluginId-b.0': [ 'slot-b' ] // input\n\t}\n\n\tit('changes connection slot uid`s', function() {\n\t\tvar result = migrateGraphToUseSlotNames(slotMap, graph)\n\t\tassert.equal(result.conns[0].src_slot, 'slot-a')\n\t\tassert.equal(result.conns[0].dst_slot, 'slot-b')\n\t})\n})\n\ndescribe('Nested graph migration to use slot UIDs', function() {\n\tvar graph = JSON.parse(fixture)\n\tvar root = graph.root\n\tvar nested = root.nodes[2].graph\n\n\tvar slotMap = parsePluginSlots()\n\n\tslotMap['float_display.0'] = [ 'float output' ]\n\tslotMap['slider_float_generator.1'] = [ 'slider output' ] \n\n\tit('maps connection slot uid`s', function() {\n\t\tmigrateGraphToUseSlotNames(slotMap, graph.root)\n\t\tassert.equal(nested.conns[0].src_slot, 0) // dyn slot\n\t\tassert.equal(nested.conns[0].dst_slot, 'float output')\n\t\tassert.equal(root.conns[0].src_slot, 'slider output')\n\t})\n})\n"
  },
  {
    "path": "test/unit/sceneProcessor.js",
    "content": "var SceneProcessor = require('../../lib/sceneProcessor')\nvar when = require('when')\nvar nodefn = require('when/node')\nvar assert = require('assert')\nvar fsPath = require('path')\nvar fs = require('fs-extra')\nvar EventEmitter = require('events').EventEmitter\n\nvar scenes = {\n\tactuallyAnImage: {\n\t\t\tname: 'te-2rb.jpg',\n\t\t\tpath: __dirname+'/../fixtures/te-2rb.jpg'\n\t},\n\tvalid: {\n\t\t\tname: 'scene.zip',\n\t\t\tpath: __dirname+'/../fixtures/lambent-obj-mtl-tga.zip'\n\t}\n}\n\ndescribe('SceneProcessor', function() {\n\tvar sp, gfs = {}\n\n\tbeforeEach(function() {\n\t\tsp = new SceneProcessor(gfs)\n\t\tgfs.url = function(u) { return u }\n\t\tgfs.createWriteStream = function() {\n\t\t\tvar dfd = when.defer()\n\t\t\tvar ee = new EventEmitter()\n\t\t\tee.write = function() { return true }\n\t\t\tee.end = function() {\n\t\t\t\tee.emit('close')\n\t\t\t}\n\t\t\tdfd.resolve(ee)\n\t\t\treturn dfd.promise\n\t\t}\n\n\t})\n\n\tit('rejects an invalid zip', function(done) {\n\t\tsp.preprocess(scenes.actuallyAnImage, 'foo')\n\t\t.then(function(manifest) {\n\t\t\tassert.ok(!manifest.valid)\n\t\t\tdone()\n\t\t})\n\t\t.catch(done)\n\t})\n\n\tit('accepts a valid zip', function(done) {\n\t\tsp.preprocess(scenes.valid, 'foo')\n\t\t.then(function(manifest) {\n\t\t\tassert.ok(manifest.valid)\n\t\t\tdone()\n\t\t})\n\t\t.catch(done)\n\t})\n\n\tit('explodes a valid zip', function(done) {\n\t\tvar wrote = 0\n\t\tgfs.createWriteStream = function() {\n\t\t\tvar dfd = when.defer()\n\t\t\tvar ee = new EventEmitter()\n\t\t\tee.write = function(data) { return true }\n\t\t\tee.end = function() {\n\t\t\t\twrote++\n\t\t\t\tee.emit('close')\n\t\t\t}\n\t\t\tdfd.resolve(ee)\n\t\t\treturn dfd.promise\n\t\t}\n\n\t\tsp.handleUpload(scenes.valid, 'foo')\n\t\t.then(function() {\n\t\t\tassert.ok(wrote, 9)\n\t\t\tdone()\n\t\t})\n\t\t.catch(done)\n\t})\n\n\tit('creates valid paths', function(done) {\n\t\tvar wrote = 0\n\t\tgfs.createWriteStream = function(path) {\n\t\t\tvar dfd = when.defer()\n\t\t\tif (path === '/the/right/stuff/scene/lambent-obj-mtl-tga.obj')\n\t\t\t\tdone()\n\n\t\t\tvar ee = new EventEmitter()\n\t\t\tee.write = function(data) { return true }\n\t\t\tee.end = function() {}\n\t\t\tdfd.resolve(ee)\n\t\t\treturn dfd.promise\n\t\t}\n\n\t\tsp.handleUpload(scenes.valid, '/the/right/stuff')\n\t\t.catch(done)\n\t})\n\n\tit('returns the correct scene url', function(done) {\n\t\tgfs.url = function(path) {\n\t\t\treturn '/root'+path\n\t\t}\n\n\t\tsp.handleUpload(scenes.valid, '/foo/scenes/blah')\n\t\t.then(function(sceneUrl) {\n\t\t\tassert.equal('/root/foo/scenes/blah/scene/lambent-obj-mtl-tga.obj', sceneUrl.url)\n\t\t\tdone()\n\t\t})\n\t\t.catch(done)\n\t})\n\n})\n"
  },
  {
    "path": "tools/blender/io_export_curve.py",
    "content": "# Part of the Engi-WebGL suite.\n\nfrom bpy.props import *\nfrom bpy_extras.io_utils import ExportHelper\nfrom mathutils import *\nfrom functools import reduce\nimport os, sys, os.path, bpy, bmesh, math, struct, base64, itertools\n\nbl_info = {\n\t'name': 'Curve Export (.json)',\n\t'author': 'Lasse Nielsen',\n\t'version': (0, 2),\n\t'blender': (2, 72, 0),\n\t'location': 'File > Export > Curve (.json)',\n\t'description': 'Curve Export (.json)',\n\t'category': 'Import-Export'\n}\n\n# Compress number representation to save as much space as possible.\ndef cnr(n):\n\ts = '%.4f' % n\n\t\n\twhile s[-1] == '0':\n\t\ts = s[:-1]\n\t\n\tif s[-1] == '.':\n\t\ts = s[:-1]\n\t\n\treturn s\n\ndef format_stream(ident, id, s):\n\treturn '%s%s: [%s]' % (ident, id, ','.join(map(cnr, s)))\n        \nclass EngiCurveExporter(bpy.types.Operator, ExportHelper):\n\tbl_idname = 'curve.json'\n\tbl_label = 'Export Curve (.json)'\n\tbl_options = {'PRESET'}\n\tfilename_ext = \".json\"\n\t\n\tfilter_glob = StringProperty(default=\"*.json\", options={'HIDDEN'})\n\t\n\t#filepath = StringProperty()\n\tfilename = StringProperty()\n\tdirectory = StringProperty()\n\t\n\t# Black Magic...\n\tcheck_extension = True\n\t\n\tdef execute(self, context):\n\t\tfilename = os.path.splitext(self.filename)[0]\n\t\tfilename = filename + '.json'\n\n\t\t# Check for a valid selection. We expect a single object of type 'CURVE'.\n\t\tif bpy.context.active_object.type != 'CURVE':\n\t\t\tprint('The current selection is invalid. Please select a single curve to export.')\n\t\t\treturn {'FINISHED'}\n\t\t\n\t\tspline = bpy.context.active_object.data.splines[0]\n\t\tpoints = spline.points\n\t\t\n\t\tjson = '{\\n'\n\t\tjson += '\\t\"count\": ' + str(len(points)) + ',\\n'\n\t\t\n\t\tx_stream = []\n\t\ty_stream = []\n\t\tz_stream = []\n\t\t\n\t\tfor point in points:\n\t\t\tx_stream.append(point.co[0])\n\t\t\ty_stream.append(point.co[1])\n\t\t\tz_stream.append(point.co[2])\n\t\t\n\t\tjson += format_stream('\\t', '\"x\"', x_stream) + ',\\n'\n\t\tjson += format_stream('\\t', '\"y\"', y_stream) + ',\\n'\n\t\tjson += format_stream('\\t', '\"z\"', z_stream) + '\\n'\n\t\t\n\t\tjson += '}'\n\t\t\n\t\twith open(self.directory + filename, 'w') as out:\n\t\t\tout.write(json)\n\t\t\n\t\treturn {'FINISHED'}\n\ndef menu_func(self, context):\n\tself.layout.operator(EngiCurveExporter.bl_idname, text=\"Curve (.json)\")\n\n\ndef register():\n\tbpy.utils.register_class(EngiCurveExporter)\n\tbpy.types.INFO_MT_file_export.append(menu_func)\n\n\ndef unregister():\n\tbpy.utils.unregister_class(EngiCurveExporter)\n\tbpy.types.INFO_MT_file_export.remove(menu_func)\n\nif __name__ == '__main__':\n\tregister()\n"
  },
  {
    "path": "tools/blender/io_export_engi.py",
    "content": "from bpy.props import *\nfrom bpy_extras.io_utils import ExportHelper\nfrom mathutils import *\nfrom functools import reduce\nimport os, sys, os.path, bpy, bmesh, math, struct, base64, itertools\n\ndebug = True\n\nbl_info = {\n    'name': 'Engi Export (.json)',\n    'author': 'Lasse Nielsen',\n    'version': (0, 2),\n    'blender': (2, 72, 0),\n    'location': 'File > Export > Engi (.json)',\n    'description': 'Engi Export (.json)',\n    'category': 'Import-Export'\n}\n\ndef dbg(msg):\n    if debug:\n        print(msg)\n\ndef sanitize_name(name):\n    name = name.replace('.', '_')\n    name = name.replace('-', '_')\n    name = name.replace('\"', '')\n    return name\n\n# Compress number representation to save as much space as possible.\ndef cnr(n):\n    s = '%.4f' % n\n\n    while s[-1] == '0':\n        s = s[:-1]\n\n    if s[-1] == '.':\n        s = s[:-1]\n\n    return s\n\ndef clean_dir(path):\n\tmask = ['png', 'jpg', 'json']\n\t\n\tfor filename in os.listdir(path):\n\t\tffn = os.path.join(path, filename)\n\n\t\tif os.path.isfile(ffn) and os.path.splitext(filename)[1][1:] in mask:\n\t\t\tos.remove(ffn)\n\ndef median_factor(n):\n    fact = [1,n]\n    check = 2\n    rootn = math.sqrt(n)\n    \n    while check < rootn:\n        if n % check==0:\n            fact.append(check)\n            fact.append(n/check)\n            \n        check += 1\n            \n    if rootn == check:\n        fact.append(check)\n        \n    fact.sort()\n    return fact[math.floor(len(fact) / 2)]\n\ndef stream_to_image(ctx, filename, d_stream):\n    pixel_count = len(d_stream) * 4\n    data = []\n    \n    # Find ideal size\n    w = int(median_factor(pixel_count))\n    h = int(pixel_count / w)\n    \n    r_settings = ctx.render_settings.render\n    settings = r_settings.image_settings\n    \n    bpy.data.images.new(name = filename, width = w, height = h)\n    img = bpy.data.images[filename]\n    \n    stream = struct.pack('>' + ('f' * len(d_stream)), *d_stream)\n    data = []\n    o = 0\n    \n    for y in range(h):\n        l = []\n        \n        for x in range(w):\n            v = float(stream[o]) / 255.0\n            l.extend([v, v, v, 1.0])\n            o = o + 1\n        \n        data.append(l)\n    \n    # Invert scanlines, damnit Blender.\n    data.reverse()\n    \n    # Flatten\n    data = list(itertools.chain(*data))\n    \n    img.pixels = data\n    print('Stream to image: %s.png (%d x %d, %d).' % (filename, w, h, pixel_count))\n    \n    r_settings.alpha_mode = 'TRANSPARENT'\n    r_settings.use_antialiasing = False\n    r_settings.use_compositing = False\n    r_settings.use_sequencer = False\n    r_settings.resolution_percentage = 100\n    \n    # We save as greyscale 8BPC because some browsers apply gamma and / or color space correction, even when\n    # the PNG doesn't include any color space chunks. Greyscale side-steps this issue at a slight computational\n    # and memory consumption cost when decoding client-side.\n    settings.file_format = 'PNG'\n    settings.compression = 100\n    settings.color_mode = 'BW'\n    \n    img.save_render(ctx.base_path + filename + '.png', ctx.render_settings)\n    bpy.data.images.remove(img)\n    \n    # Allow chaining\n    return filename\n\ndef img_uses_alpha(img):\n    p = list(img.pixels)\n    count = len(p)\n    \n    for pi in range(0, count, 4):\n        if int(p[pi + 3] * 255.0) < 255:\n            return True\n    \n    return False\n\nclass EngiContext:\n    def __init__(self, scene, directory):\n        self.scene = scene\n        self.directory = directory\n        self.world = scene.world\n        self.world_amb = Color((0, 0, 0))\n        self.material_cache = EngiMaterialCache()\n        self.unique_textures = {}\n        self.render_settings = bpy.data.scenes.new('EngiRenderSettings') # Dummy scene with custom render settings used for resaving textures.\n        self.default_mat = bpy.data.materials.new('EngiDefault')\n        self.file_base_name = ''\n        self.base_path = ''\n        \n        self.render_settings.render.resolution_percentage = 100\n        \n        for img in bpy.data.images:\n            if not img.filepath:\n                continue\n            \n            if img.name in self.unique_textures: \n                continue\n            \n            print('Caching unique texture [%s]' % img.name)\n            \n            fn = bpy.path.abspath(img.filepath)\n            \n            if not img.packed_file and not os.path.exists(fn):\n                print('[Error]: Failed to find referenced texture \\'%s\\'' % fn)\n                continue\n            \n            self.unique_textures[img.name] = { 'filename': fn, 'outfn': '', 'width': img.size[0], 'height': img.size[1], 'used': False, 'image': img, 'alpha': None, 'achannel': None, 'is_diffuse': False }\n        \n        if self.world:\n            self.world_amb = self.world.ambient_color\n    \n    def process_textures(self):\n        rs = self.render_settings.render\n        \n        for img in self.unique_textures:\n            img = self.unique_textures[img]\n            \n            if not img['used'] or img['image'].users < 1:\n                print('Skipping unused texture: ' + img['image'].name)\n                continue\n                \n            ow = math.floor(math.log(img['width']) / math.log(2))\n            oh = math.floor(math.log(img['height']) / math.log(2))\n            \n            if ow < 1 or oh < 1:\n                print('Skipping texture with no image data: ' + img['image'].name)\n                continue\n            \n            # Reduce to at most 2048 and minimum 2 pixels on any axis, unless the\n            # aspect ratio is too extreme in which case we clip to 2048, aspect be damned. The user was asking for it.\n            while ow > 1 and oh > 1 and (ow > 11 or oh > 11):\n                ow = ow - 1\n                oh = oh - 1\n                \n            ow = int(math.pow(2, ow))\n            oh = int(math.pow(2, oh))\n            \n            ext = '.jpg'\n            img_alpha = img['is_diffuse'] and img_uses_alpha(img['image'])\n            \n            # img['image'].depth != 24 or (\n            if (self.merge_alpha and img['alpha'] != None): # or img_alpha: # Convert all 24bpp images to JPEG, everything else to PNG\n                ext = '.png'\n                rs.image_settings.file_format = 'PNG'\n                rs.image_settings.color_mode = 'RGBA'\n                img['achannel'] = True\n                print('Texture has alpha, switching to PNG: ' + img['image'].name)\n                print('Is Alpha: ' + str(self.merge_alpha and img['alpha'] != None))\n                print('ImgAlpha: ' + str(img_alpha))\n            else:\n                rs.image_settings.color_mode = 'RGB'\n                rs.image_settings.file_format = 'JPEG'\n            \n            # This is slightly tricky. To find out whether the alpha channel of this \n            # image is in use, we have to traverse all referencing textures and check\n            # the state of their 'Use Alpha' flag. There's got to be a better way.\n            \n            img['outfn'] = os.path.splitext(os.path.split(img['filename'])[1])[0] + ext\n            out_filename = self.directory + img['outfn']\n            \n            print('Texture(\"%s\", %dx%d) -> (\"%s\", %dx%d)' %  (img['filename'], img['width'], img['height'], out_filename, ow, oh))\n            \n            imgc = img['image'].copy()\n            imgc.scale(ow, oh)\n            \n            if self.merge_alpha and img['alpha']:\n                print('Found diffuse texture with alpha, merging the a channel.')\n                alphac = img['alpha'].copy()\n                alphac.scale(ow, oh)\n                cp = list(imgc.pixels)\n                ap = list(alphac.pixels)\n                ofs = 0\n                \n                for y in range(imgc.size[1]):\n                    for x in range(imgc.size[0]):\n                        cp[ofs+3] = ap[ofs]\n                        ofs += 4\n                \n                imgc.pixels = cp\n            \n            rs.filepath = out_filename\n            imgc.save_render(out_filename, self.render_settings)\n            bpy.data.images.remove(imgc)\n            \n    def clean_up(self):\n        bpy.data.scenes.remove(self.render_settings)\n        bpy.data.materials.remove(self.default_mat)                        \n\nclass EngiMaterialCache:\n    def __init__(self):\n        self.materials = {}\n        \n    def add(self, ctx, mat, mesh):\n        if mat.name not in self.materials:\n            self.materials[mat.name] = EngiMaterial(ctx, mat, mesh)\n        \n        return self.materials[mat.name]\n    \n    def serialise(self):\n        json = '\\t\"materials\": {\\n'\n        delim = ''\n        \n        for m in self.materials:\n            json += '%s%s' % (delim, self.materials[m].serialise())\n            delim = ',\\n'\n        \n        json += '\\n\\t},\\n'\n        \n        return json\n\ndef ts_invalid(ts):\n    return not ts or not ts.texture or ts.texture.type != 'IMAGE' or not ts.texture.image\n\nclass EngiMaterial:\n    def __init__(self, ctx, mat, mesh):\n        self.ctx = ctx\n        self.material = mat\n        self.mesh = mesh\n    \n        alpha = None\n        d_name = None\n        idx = -1\n        \n        for ts in self.material.texture_slots:\n            idx = idx + 1\n            \n            if ts_invalid(ts) or not mat.use_textures[idx]:\n                continue\n            \n            if ts.use_map_alpha:\n                alpha = ts.texture.image\n                print('Found alpha map = ' + alpha.name)\n            elif ts.use_map_color_diffuse:\n                d_name = ts.texture.image.name\n                print('Found diffuse map = ' + d_name)\n                \n            if ts.texture.image.name in self.ctx.unique_textures:\n                img = self.ctx.unique_textures[ts.texture.image.name]\n                \n                img['used'] = True\n                \n                # Tag diffuse textures\n                if ts.use_map_color_diffuse:\n                    img['is_diffuse'] = True\n\n        if alpha and d_name:\n            print('Enabling alpha merge for material: ' + self.material.name)\n            self.ctx.unique_textures[alpha.name]['used'] = False\n            self.ctx.unique_textures[d_name]['alpha'] =  alpha\n    \n    def format_vec(self, name, value, default):\n    \tif value.x == default[0] and value.y == default[1]:\n    \t\treturn ''\n    \t\n    \treturn ', \"%s\": [%s, %s]' % (name, cnr(value.x), cnr(value.y))\n\n    def format_map(self, name, ts):\n    \tfactor = getattr(ts, name + '_factor')\n    \timg = ts.texture.image\n    \tuv_idx = 0\n    \t\n    \t#if ts.uv_layer != '':\n        #\tif ts.uv_layer.name in self.mesh.uv_layers.keys():\n        #\t\tuv_idx = self.mesh.uv_layers.keys().index(ts.uv_layer)\n        #\telse:\n        #\t\tprint('WARNING: The uv layer \"' + ts.uv_layer + '\" does not exist. Assuming layer index 0.')\n    \t#else:\n        #\tprint('WARNING: The ' + name + ' layer in the material ' + self.material.name + ' is not using a UV map. That probably will not work.')\n    \t\n    \tif img.name in self.ctx.unique_textures:\n        \tdata = self.ctx.unique_textures[img.name]\n        \n        \treturn ',\\n\\t\\t\\t\\t\"%s_map\": { \"url\": \"%s\", \"uv_idx\": %d%s%s }' % (name, data['outfn'], uv_idx, self.format_vec('offset', ts.offset, [0, 0]), self.format_vec('scale', ts.scale, [1, 1]))\n    \telse:\n        \tprint('Error: Failed to find unique texture by name: [%s]\\n\\nThe full collection contains:' % img.name)\n\t\t        \n        \tfor name in self.ctx.unique_textures:\n                \tprint('[%s]' % name)\n    \t\t\n    \treturn ''\n        \n    def serialise(self):\n        m = self.material\n        json = ''\n        json += '\\t\\t\\t\"%s\": {\\n' % m.name\n        amb = [0, 0, 0]\n        d = { 'r': 1.0, 'g': 1.0, 'b': 1.0 }\n        alpha = 1.0\n        \n        if m.alpha:\n            alpha = m.alpha\n            \n        if m.diffuse_color:\n            d = m.diffuse_color\n                \n        amb = m.ambient * self.ctx.world_amb\n        \n        json += '\\t\\t\\t\\t\"ambient_color\": [%s, %s, %s, 1],\\n' % (cnr(amb[0]), cnr(amb[1]), cnr(amb[2]))\n        json += '\\t\\t\\t\\t\"diffuse_color\": [%s, %s, %s, %s],\\n' % (cnr(d.r), cnr(d.g), cnr(d.b), cnr(alpha))\n        json += '\\t\\t\\t\\t\"double_sided\": %s,\\n' % (str(self.mesh.show_double_sided).lower())\n        json += '\\t\\t\\t\\t\"shinyness\": %s' % cnr(m.specular_intensity)\n        uvi = 0\n        \n        for ts in self.material.texture_slots:\n            if ts_invalid(ts):\n                continue\n            \n            # We cannot support using a single map for multiple things, although the\n            # same texture image may be used for different mapping, provided a texture\n            # slot per mapping is used.\n            if ts.use_map_color_diffuse:\n                if ts.texture.image.name in self.ctx.unique_textures and self.ctx.unique_textures[ts.texture.image.name]['achannel']:\n                    json += ',\\n\\t\\t\\t\\t\"alpha_clip\": true'\n                \n                json += self.format_map('diffuse_color', ts)\n            elif ts.use_map_color_spec:\n                json += self.format_map('specular_color', ts)\n            elif ts.use_map_color_emission:\n                json += self.format_map('emission_color', ts)\n            elif ts.use_map_normal:\n                json += self.format_map('normal', ts)\n        \n        json += '\\n\\t\\t\\t}'\n        \n        return json\n\nclass EngiBatch:\n    def __init__(self, ctx, m_name, index, mat, mesh, polygons, export_normals):\n        self.ctx = ctx\n        self.material = ctx.material_cache.add(ctx, mat, mesh)\n        self.verts = []\n        self.norms = []\n        self.uvs = [[], [], [], []]\n        self.bb_lo = [9999999.0, 9999999.0, 9999999.0]\n        self.bb_hi = [-9999999.0, -9999999.0, -9999999.0]\n        self.index = index\n        self.m_name = m_name\n        \n        for poly in polygons:\n            for v in [mesh.vertices[v] for v in list(poly.vertices)]:\n                self.verts.append(v)\n                \n                self.bb_lo[0] = v.co[0] if v.co[0] < self.bb_lo[0] else self.bb_lo[0]\n                self.bb_lo[1] = v.co[1] if v.co[1] < self.bb_lo[1] else self.bb_lo[1]\n                self.bb_lo[2] = v.co[2] if v.co[2] < self.bb_lo[2] else self.bb_lo[2]\n                \n                self.bb_hi[0] = v.co[0] if v.co[0] > self.bb_hi[0] else self.bb_hi[0]\n                self.bb_hi[1] = v.co[1] if v.co[1] > self.bb_hi[1] else self.bb_hi[1]\n                self.bb_hi[2] = v.co[2] if v.co[2] > self.bb_hi[2] else self.bb_hi[2]\n                \n                if export_normals:\n                    if poly.use_smooth: # Use vertex normals, if available.\n                        self.norms.append(v.normal)\n                    else: # Use face normals otherwise.\n                        self.norms.append(poly.normal)\n            \n            uvi = 0\n            \n            for uvl in mesh.uv_layers:\n                for uv in [uvl.data[v] for v in poly.loop_indices]:\n                    self.uvs[uvi].append(uv)\n                \n                uvi += 1\n                \n                if uvi == 4: # We can only support four concurrent textures.\n                    break\n        \n        # Flatten streams to interleaved lists of floats\n        def flatten(list):\n            return [i for sl in list for i in sl]\n        \n        self.verts = flatten(map(lambda v: [v.co[0], v.co[1], v.co[2]], self.verts))\n        self.norms = flatten(map(lambda n: [n[0], n[1], n[2]], self.norms))\n        \n        for idx in range(4):\n            uv = self.uvs[idx]\n            \n            if len(uv) > 0:\n                uv = flatten(map(lambda v: [math.fmod(v.uv[0], 1.0), math.fmod(v.uv[1], 1.0)], uv))\n                self.uvs[idx] = uv\n            \n    def write_streams(self, export_normals):\n    \tstream_to_image(self.ctx, '%s_v%d' % (self.m_name, self.index), self.verts)\n    \t\n    \tif export_normals:\n    \t\tstream_to_image(self.ctx, '%s_n%d' % (self.m_name, self.index), self.norms)\n    \t\n    \tfor idx in range(4):\n    \t\tif len(self.uvs[idx]) > 0:\n    \t\t\tstream_to_image(self.ctx, '%s_t%d' % (self.m_name, self.index * idx), self.uvs[idx])\n    \n    def serialise(self, export_normals):\n        json = '\\t\\t\\t\\t{\\n'\n        json += '\\t\\t\\t\\t\\t\"material\": \"%s\"' % self.material.material.name\n        \n        ident = ',\\n\\t\\t\\t\\t\\t'\n        json += '%s\"vertices\": \"%s\"' % (ident, '%s_v%d' % (self.m_name, self.index))\n        \n        if export_normals:\n            json += '%s\"normals\": \"%s\"' % (ident, '%s_n%d' % (self.m_name, self.index))\n            \n        for idx in range(4):\n            if len(self.uvs[idx]) > 0:\n                json += '%s\"uv%d\": \"%s\"' % (ident, idx, '%s_t%d' % (self.m_name, self.index * idx))\n                \n        json += '\\n\\t\\t\\t\\t}'\n        return json\n\nclass EngiMesh:\n    def __init__(self, ctx, name, mesh, export_normals):\n        self.ctx = ctx\n        self.mesh = mesh\n        self.batches = []\n        self.bb_lo = [9999999.0, 9999999.0, 9999999.0]\n        self.bb_hi = [-9999999.0, -9999999.0, -9999999.0]\n        self.v_count = 0\n        self.export_normals = export_normals\n        self.name = sanitize_name(name)\n        self.instances = []\n        \n        n_batches = []\n        materials = {}\n        mats = mesh.materials\n        self.instances.append(Matrix())\n        \n        if mats.keys(): # Do we have any materials at all?\n            \"\"\"Create a unique set of referenced materials \n               so we can pre-split the mesh into batches by \n               material\"\"\"\n            for poly in mesh.polygons:\n                if mats[poly.material_index] not in materials:\n                    materials[poly.material_index] = mats[poly.material_index]\n            \n            idx = 0\n            \n            for i in materials:\n                polys = []\n                \n                for poly in mesh.polygons:\n                    if poly.material_index == i:\n                        polys.append(poly)\n                \n                n_batches.append(EngiBatch(ctx, self.name, idx, materials[i], mesh, polys, export_normals))\n                idx += 1\n        else:\n            # Create one batch with a default material\n            n_batches.append(EngiBatch(ctx, self.name, 0, ctx.default_mat, mesh, mesh.polygons, export_normals))\n        \n        for b in n_batches:\n            if len(b.verts) > 0:\n                self.bb_lo[0] = b.bb_lo[0] if b.bb_lo[0] < self.bb_lo[0] else self.bb_lo[0]\n                self.bb_lo[1] = b.bb_lo[1] if b.bb_lo[1] < self.bb_lo[1] else self.bb_lo[1]\n                self.bb_lo[2] = b.bb_lo[2] if b.bb_lo[2] < self.bb_lo[2] else self.bb_lo[2]\n                \n                self.bb_hi[0] = b.bb_hi[0] if b.bb_hi[0] > self.bb_hi[0] else self.bb_hi[0]\n                self.bb_hi[1] = b.bb_hi[1] if b.bb_hi[1] > self.bb_hi[1] else self.bb_hi[1]\n                self.bb_hi[2] = b.bb_hi[2] if b.bb_hi[2] > self.bb_hi[2] else self.bb_hi[2]\n                \n                self.v_count += len(b.verts)\n                self.batches.append(b)\n    \n    def write_streams(self):\n        for batch in self.batches:\n                batch.write_streams(self.export_normals)\n    \n    def format_matrix(self, m):\n    \tcomps = []\n    \t\n    \tfor r in range(4):\n    \t\tfor c in range(4):\n    \t\t\tcomps.append(cnr(m[c][r]))\n    \t\n    \treturn '[' + ','.join(comps) + ']'\n    \n    def serialise(self):\n        json = '\\t\\t\"%s\": {\\n' % self.name\n        json += '\\t\\t\\t\"batches\": [\\n'\n        \n        b_delim = ''\n        \n        for batch in self.batches:\n                json += '%s%s' % (b_delim, batch.serialise(self.export_normals))\n                b_delim = ',\\n'\n        \n        json += '\\n\\t\\t\\t]'\n        \n        if len(self.instances) > 1:\n        \tistr = []\n        \t\n        \tfor inst in self.instances:\n        \t\tistr.append(self.format_matrix(inst))\n        \t\n\t        json += ',\\n\\t\\t\\t\"instances\": [\\n'\n\t        json += '\\t\\t\\t\\t' + (',\\n\\t\\t\\t\\t'.join(istr))\n\t        json += '\\n\\t\\t\\t]'\n        \t\n        json += '\\n\\t\\t}'\n        \n        return json\n        \nclass JSONExporter(bpy.types.Operator, ExportHelper):\n    bl_idname = 'export.json'\n    bl_label = 'Export Engi (.json)'\n    bl_options = {'PRESET'}\n    filename_ext = \".json\"\n    \n    filter_glob = StringProperty(default=\"*.json\", options={'HIDDEN'})\n    export_cameras = BoolProperty(name=\"Export cameras\", default=False)\n    export_normals = BoolProperty(name=\"Export normals\", default=True)\n    smooth_normals = BoolProperty(name=\"Smooth normals\", default=True)\n    merge_alpha = BoolProperty(name=\"Merge alpha into diffuse\", default=True)\n    \n    #filepath = StringProperty()\n    filename = StringProperty()\n    directory = StringProperty()\n    \n    # Black Magic...\n    check_extension = True\n    \n    def draw(self, context):\n        layout = self.layout\n        \n        box = layout.box()\n        box.label('Options:')\n        box.prop(self, 'export_cameras')\n        box.prop(self, 'export_normals')\n        box.prop(self, 'smooth_normals')\n        box.prop(self, 'merge_alpha')\n    \n    def execute(self, context):\n        scene = bpy.context.scene # Export the active scene\n        ctx = EngiContext(scene, self.directory)\n        \n        world_amb = Color((0.0, 0.0, 0.0))\n        filename = 'scene' #os.path.splitext(self.filename)[0]\n        ctx.file_base_name = filename\n        ctx.base_path = self.directory\n        \n        # Remove all png, jpg and json files from the selected output directory\n        # since the mesh names may have changed or we may be trying to export a\n        # new model to an existing directory, which would leave left-over files behind.\n        clean_dir(self.directory)\n        \n        filename = filename + '.json'\n        \n        print('Target path = %s' % (self.directory + filename)) \n        bb_lo = None\n        bb_hi = None\n        \n        if scene.objects.active:\n            try:\n                bpy.ops.object.mode_set(mode = 'OBJECT')\n                bpy.ops.object.select_all(action = 'DESELECT')\n            except:\n                pass\n        \n        ctx.merge_alpha = self.merge_alpha\n        \n        mjson = ''\n        \n        json = ''\n        json += '{\\n'\n        json += '\\t\"id\": \"%s\",\\n' % sanitize_name(filename) \n        \n        for i in scene.objects:\n            i.select = False # deselect all objects\n            \n            if self.export_cameras:\n                cams = []\n                \n                for obj in bpy.data.objects:\n                    if obj.type == 'CAMERA':\n                        cams.append(obj)\n                        \n                if len(cams) > 0:\n                    mjson = '\\t\"cameras\": {'\n                    cdelim = ''\n                    \n                    for cam in cams:\n                        mjson += '%s\\n\\t\\t\"%s\" {' % (cdelim, cam.name)\n                        mjson += ',\\n\\t\\t\\t\"fov\": %s' % cnr(math.degrees(cam.data.angle))\n                        mjson += ',\\n\\t\\t\\t\"near_clip\": %s' % cnr(cam.data.clip_start)\n                        mjson += ',\\n\\t\\t\\t\"far_clip\": %s' % cnr(cam.data.clip_end)\n                        mjson += ',\\n\\t\\t\\t\"position\": [%s, %s, %s]' % (cnr(cam.location.x), cnr(cam.location.y), cnr(cam.location.z))\n                        mjson += ',\\n\\t\\t\\t\"rotation\": [%s, %s, %s]' % (cnr(cam.rotation_euler.x), cnr(cam.rotation_euler.y), cnr(cam.rotation_euler.z))\n                        mjson += '\\n\\t\\t}'\n                        cdelim = ','\n                    \n                    mjson += '\\n\\t},\\n'\n                        \n        meshes = dict()\n        \n        for obj in bpy.data.objects:\n            dbg('Found object ' + obj.name + ' of type ' + obj.type)\n            \n            if obj.type == 'MESH':\n                # First, check if we have already seen this mesh. If so, just\n                # add the transform of this object to that as an instance.\n                if obj.data.name in meshes:\n                \tprint('Found duplicate of mesh: ' + obj.data.name)\n                \tmeshes[obj.data.name].instances.append(obj.matrix_world)\n                \tcontinue\n                \n                # Copy the object temporarily, so we can maniulate the copy prior\n                # to export, without altering the original scene.\n                objc = obj.copy()\n                scene.objects.link(objc)\n                scene.update()\n                \n                objc.select = True\n                scene.objects.active = objc\n                \n                try:\n                    bpy.ops.object.mode_set(mode='EDIT')\n                    bpy.ops.mesh.select_all(action='SELECT')\n                    bpy.ops.object.mode_set(mode='EDIT')\n                    bpy.ops.mesh.quads_convert_to_tris()\n                except:\n                    continue\n                \n                if self.smooth_normals:\n                    bpy.ops.mesh.faces_shade_smooth()\n                \n                scene.update()\n                \n                bpy.ops.object.mode_set(mode='OBJECT')\n                mesh = objc.to_mesh(scene, True, 'PREVIEW') #write data object\n                scene.update()\n                \n                # Transform from local to world space.\n                mesh.transform(obj.matrix_world)\n                mesh.update()\n                \n                cmesh = EngiMesh(ctx, obj.name, mesh, self.export_normals)\n\n                m_name = mesh.name\n                \n                # Remove the temporary objects\n                scene.objects.unlink(objc)\n                bpy.data.objects.remove(objc)\n                \n                scene.update()\n                \n                if len(cmesh.batches) < 1 or cmesh.v_count < 1:\n                    continue\n                \n                cmesh.write_streams()\n                meshes[obj.data.name] = cmesh;\n                bpy.data.meshes.remove(bpy.data.meshes[mesh.name])\n                \n        mjson += '\\t\"meshes\": {\\n'\n        delim = ''\n        \n        for cmesh in meshes.values():\n                mjson += '%s%s' % (delim, cmesh.serialise())\n                delim = ',\\n'\n\n                # Update bounds\n                bbl = cmesh.bb_lo\n                bbh = cmesh.bb_hi\n                \n                if not bb_lo:\n                    bb_lo = list(bbl)\n                else:\n                    for i in range(3):\n                        bb_lo[i] = bbl[i] if bbl[i] < bb_lo[i] else bb_lo[i]\n                \n                if not bb_hi:\n                    bb_hi = list(bbh)\n                else:\n                    for i in range(3):\n                        bb_hi[i] = bbh[i] if bbh[i] > bb_hi[i] else bb_hi[i]\n        \n        mjson += '\\n\\t},'\n        \n        if bb_lo and bb_hi:\n            mjson += '\\n\\t\"bounding_box\": { \"lo\": [' + cnr(bb_lo[0]) + ', ' + cnr(bb_lo[1]) + ', ' + cnr(bb_lo[2]) + '], \"hi\": [' + cnr(bb_hi[0]) + ', ' + cnr(bb_hi[1]) + ', ' + cnr(bb_hi[2]) + '] }\\n'\n        else:\n            mjson += '\\n\\t\"bounding_box\": { \"lo\": [-0.5, -0.5, -0.5], \"hi\": [0.5, 0.5, 0.5] }\\n'\n            \n        # Convert textures\n        ctx.process_textures()\n            \n        # Write the material cache\n        json += ctx.material_cache.serialise()\n        \n        # Append the meshes\n        json += mjson\n        json += '}\\n'\n        \n        f = open(self.directory + filename, 'w')\n            \n        if not f: \n            raise ('Could not open file for writing.')\n        \n        f.write(json)\n        f.close()\n        \n        ctx.clean_up()\n        \n        return {'FINISHED'}\n\ndef menu_func(self, context):\n    self.layout.operator(JSONExporter.bl_idname, text=\"Engi (.json)\")\n\n\ndef register():\n    bpy.utils.register_class(JSONExporter)\n    bpy.types.INFO_MT_file_export.append(menu_func)\n\n\ndef unregister():\n    bpy.utils.unregister_class(JSONExporter)\n    bpy.types.INFO_MT_file_export.remove(menu_func)\n\n\nif __name__ == '__main__':\n    register()\n"
  },
  {
    "path": "tools/cdnMakePublic.js",
    "content": "const when = require('when')\nconst CloudStorage = require('../lib/cloudStorage')\n\nconst done = (err) => {\n  console.log('Done - closing')\n\n  if (err) {\n    console.error('ERROR: ', err)\n    throw err\n  } else {\n    console.log('Done.')\n  }\n}\n\nfunction setPublic() {\n  return file => {\n    cloudStorage.retry(() => {\n      return file.makePublic()\n      .then(() => {\n        console.log(' + ', file.name)\n      })\n    })\n  }\n}\n\nconst cloudStorage = new CloudStorage()\ncloudStorage.bucket.getFilesStream()\n.on('error', done)\n.on('data', setPublic())\n.on('end', () => {\n  done()\n})\n"
  },
  {
    "path": "tools/compress-plugin-icons.py",
    "content": "#!/usr/bin/python\nimport sys\nimport os\nimport Image\nimport ImageDraw\nimport math\nimport glob\n\nfolder = 'browser/style/icons'\n\nimages = []\ncss_rules = {}\n\nwith open(folder + '/source.css') as css_file:\n\tcss_data = css_file.read()\n\n\tfor line in css_data.split('\\n'):\n\t\tif len(line) < 1 or line[0] != '.' or line[:9] == '.icon-img':\n\t\t\tcontinue\n\t\t\n\t\tcss_rules[line.split(' ')[0]] = line.split('\\'')[1]\n\n# A source image structure that loads the image and stores the\n# extents. It will also get the destination rect in the atlas written to it.\nclass SourceImage:\n\tdef __init__(self, filePath, fileName, oi):\n\t\tself.filePath = filePath\n\t\tself.fileName = fileName\n\t\tself.fullPath = filePath + '/' + fileName\n\t\tself.origIndex = oi\n\t\t\n\t\tif not os.path.exists(self.fullPath):\n\t\t\tprint \"Error: '%s' does not exist.\" % self.fullPath\n\t\t\n\t\t# Open the image and make sure it's in RGBA mode.\n\t\tself.img = Image.open(self.fullPath)\n\t\tself.img = self.img.convert('RGBA')\n\t\tself.uncropped = Rect(0,0, self.img.size[0]-1, self.img.size[1]-1)\n\t\t\n\t\t# Grab the bounding box from the alpha channel.\n\t\t# alpha = self.img.split()[3]\n\t\t# bbox = alpha.getbbox()\n\t\t# alpha = None\n\t\t\n\t\t# if bbox == None:\n\t\t#\tbbox = [0,0,1,1];\n\t\tbbox = [0, 0, self.img.size[0], self.img.size[1]]\n\t\t\n\t\t# Crop it and get the new extents.\n\t\tself.img = self.img.crop(bbox)\n\t\tself.img.load()\n\t\tself.offset = (bbox[0], bbox[1])\n\t\tself.rect = Rect(0,0, self.img.size[0], self.img.size[1])\n\n# A simple rect class using inclusive coordinates.\nclass Rect:\n\tdef __init__(self, x0,y0,x1,y1):\n\t\tself.xmin = int(x0)\n\t\tself.xmax = int(x1)\n\t\tself.ymin = int(y0)\n\t\tself.ymax = int(y1)\n\t\n\tdef width(self):\n\t\treturn int(self.xmax - self.xmin + 1)\n\t\n\tdef height(self):\n\t\treturn int(self.ymax - self.ymin + 1)\n\n# A k-d tree node containing rectangles used to tightly pack images.\nclass Node:\n\tdef __init__(self):\n\t\tself.image = None\n\t\tself.rect = Rect(0,0,0,0)\n\t\tself.child0 = None\n\t\tself.child1 = None\n\n  # Iterate the full tree and write the destination rects to the source images.\n\tdef finalize(self):\n\t\tif self.image != None:\n\t\t\tself.image.destRect = self.rect\n\t\telse:\n\t\t\tif self.child0 != None:\n\t\t\t\tself.child0.finalize()\n\t\t\tif self.child1 != None:\n\t\t\t\tself.child1.finalize()\n\t\n\t# Insert a single rect into the tree by recursing into the children.\n\tdef insert(self, r, img):\n\t\tif self.child0 != None or self.child1 != None:\n\t\t\tnewNode = self.child0.insert(r, img)\n\t\t\t\n\t\t\tif newNode != None:\n\t\t\t\treturn newNode\n\t\t\t\n\t\t\treturn self.child1.insert(r, img)\n\t\telse:\n\t\t\tif self.image != None:\n\t\t\t\treturn None\n\t\t\n\t\t\tif r.width() > self.rect.width() or r.height() > self.rect.height():\n\t\t\t\treturn None\n\t\t\n\t\t\tif r.width() == self.rect.width() and r.height() == self.rect.height():\n\t\t\t\tself.image = img\n\t\t\t\treturn self\n\t\t\t\n\t\t\tself.child0 = Node()\n\t\t\tself.child1 = Node()\n\t\t\tdw = self.rect.width() - r.width()\n\t\t\tdh = self.rect.height() - r.height()\n\t\t\n\t\t\tif dw > dh:\n\t\t\t\tself.child0.rect = Rect(self.rect.xmin, self.rect.ymin, self.rect.xmin + r.width() - 1, self.rect.ymax)\n\t\t\t\tself.child1.rect = Rect(self.rect.xmin + r.width(), self.rect.ymin, self.rect.xmax, self.rect.ymax)\n\t\t\telse:\n\t\t\t\tself.child0.rect = Rect(self.rect.xmin, self.rect.ymin, self.rect.xmax, self.rect.ymin + r.height() - 1)\n\t\t\t\tself.child1.rect = Rect(self.rect.xmin, self.rect.ymin + r.height(), self.rect.xmax, self.rect.ymax)\n\t\t\n\t\t\treturn self.child0.insert(r,img)\n\ndef writeAtlas(images, atlasW, atlasH):\n\tatlasImg = Image.new('RGBA', [atlasW, atlasH])\n\t\n\tfor i in images:\n\t\tatlasImg.paste(i.img, [int(i.img.destRect.xmin), int(i.img.destRect.ymin), int(i.img.destRect.xmax), int(i.img.destRect.ymax)])\n\t\n\tatlasImg.save('browser/build/style/icons/icons.png')\n\tatlasImg = None\n\t\n\tos.system('tools/imgopt/imgopt browser/build/style/icons/icons.png')\n\ndef writeCSS(images, atlasW, atlasH):\n\tcss = open('browser/build/style/icons/style.css', 'w')\n\t\n\t#    css.write('  padding-left: ' + str(i.offset[0]) + 'px;\\n')\n\t#    css.write('  padding-top: ' + str(i.offset[1]) + 'px;\\n')\n\t#    css.write('  padding-right: ' + str(i.uncropped.width() - i.img.destRect.width() - i.offset[0]) + 'px;\\n')\n\t#    css.write('  padding-bottom: ' + str(i.uncropped.height() - i.img.destRect.height() - i.offset[1]) + 'px;\\n')\n\t\n\tcss.write('.icon-img\\n{\\n')\n\tcss.write('\\tdisplay: block;\\n')\n\tcss.write('\\tfloat: left;\\n')\n\tcss.write('\\tposition: relative !important;\\n')\n\tcss.write('\\ttop: 2px !important;\\n')\n\tcss.write('\\tpadding: 0px !important;\\n')\n\tcss.write('\\tmargin: 0px !important;\\n')\n\tcss.write('\\tmargin-right: 2px !important;\\n')\n\tcss.write('\\twidth: 15px !important;\\n')\n\tcss.write('\\theight: 15px !important;\\n')\n\tcss.write('\\tbackground-clip: content-box !important;\\n}\\n\\n')\n\t\t\n\tfor rule in sorted(css_rules.keys()):\n\t\timg_fname = css_rules[rule]\n\t\tfound = False\n\t\t\n\t\tfor i in images:\n\t\t\tif i.fileName == img_fname:\n\t\t\t\tcss.write(rule + ' { ')\n\t\t\t\t#css.write('width: ' + str(i.img.destRect.width()) + 'px; ')\n\t\t\t\t#css.write('height: ' + str(i.img.destRect.height()) + 'px; ')\n\t\t\t\tcss.write('background: url(\\'icons.png\\') ' + str(-i.img.destRect.xmin) + 'px ' + str(-i.img.destRect.ymin) + 'px no-repeat; }\\n')\n\t\t\t\tfound = True\n\t\t\t\tbreak\n\t\t\n\t\tif not found:\n\t\t\tprint \"Error: The rule '%s' has no known source image.\" % rule\n\t\n\tcss.close()\n\noriginalIndex = 0\n\ndef addFolder(folder):\n\tglobal originalIndex\n\n\tfolderList = os.listdir(folder);\n\t\n\tfor folderName in folderList:\n\t\tif folderName[0] == '.':\n\t\t\tcontinue\n\t\t\n\t\tfullPath = folder + '/' + folderName\n\t\t\n\t\tif os.path.isdir(fullPath) == True:\n\t\t\taddFolder(fullPath)\n\t\telse:\n\t\t\t# Create source image structs and give them a unique index.\n\t\t\tif fullPath[-4:] == '.png' and fullPath[-9:] != 'icons.png':\n\t\t\t\timages.append(SourceImage(folder, folderName, originalIndex))\n\t\t\t\toriginalIndex = originalIndex + 1\n\nprint 'Building CSS sprite sheet from images in ' + folder\naddFolder(folder)\n\n# An alternate heuristic for insertion order.\ndef imageArea(i):\n\treturn i.rect.width() * i.rect.height()\n\n# The used heuristic for insertion order, inserting images with the\n# largest extent (in any direction) first.\ndef maxExtent(i):\n\treturn max([i.rect.width(), i.rect.height()])\n\t\n# Sort the source images using the insert heuristic.\nimages.sort(None, maxExtent, True)\n\n# Calculate the total area of all the source images and figure out a starting\n# width and height to use when creating the atlas.\ntotalArea = 0\ntotalAreaUncropped = 0\n\nfor i in images:\n\ttotalArea = totalArea + i.rect.width() * i.rect.height()\n\ttotalAreaUncropped = totalAreaUncropped + i.uncropped.width() * i.uncropped.height()\n\nwidth = math.floor(math.sqrt(totalArea))\nheight = math.floor(totalArea / width)\n\n# Loop until success.\nwhile True:\n\t# Set up an empty tree the size of the expected atlas.\n\troot = Node()\n\troot.rect = Rect(0, 0, width, height)\n\t\n\t# Try to insert all the source images.\n\tok = True\n\t\n\tfor i in images:\n\t\tn = root.insert(i.rect, i.img)\n\t\tif n == None:\n\t\t\tok = False\n\t\t\tbreak\n\t\n\t# If all source images fit break out of the loop.\n\tif ok:\n\t\tbreak\n\t\n\t# Increase the width or height by one and try again.\n\tif width > height:\n\t\theight = height + 1\n\telse:\n\t\twidth = width + 1\n\n# We've succeeded so write the dest rects to the source images.\nroot.finalize()\nroot = None\n\n# Figure out the actual size of the atlas as it may not fill the entire area.\natlasW = 0\natlasH = 0\n\nfor i in images:\n\tatlasW = max([atlasW, i.img.destRect.xmax])\n\tatlasH = max([atlasH, i.img.destRect.ymax])\n  \natlasW = int(atlasW+1)\natlasH = int(atlasH+1)\nprint('AtlasDimensions: ' + str(atlasW) + 'x' + str(atlasH) + '  :  ' + str(int(100.0 * (atlasW * atlasH)/totalAreaUncropped)) + '% of original')\n\nwriteAtlas(images, atlasW, atlasH)\nwriteCSS(images, atlasW, atlasH)\n"
  },
  {
    "path": "tools/convert-audio.py",
    "content": "#!/usr/bin/python\nimport os\nimport sys\n\nif len(sys.argv) < 3:\n\tsys.exit('Usage: convert-audio.py <input sample> <output dir>')\n\ninput_filename = sys.argv[1]\noutput_dir = os.path.abspath(sys.argv[2])\n\nif not os.path.exists(input_filename):\n    sys.exit('[Error]: Cannot access \"%s\".' % input_filename)\nif output_dir[len(output_dir)-1] == '/':\n\toutput_dir = output_dir[:-1]\n\noutput_dir = os.path.expanduser(output_dir)\n \ndef ensure_dir(f):\n\tprint 'Output to ' + f + ' (exists = ' + str(os.path.exists(f)) + ').'\n\t\n\tif not os.path.exists(f):\n\t\tprint '\\t* Doesn\\'t exist, creating...'\n\t\tos.makedirs(f)\n\nensure_dir(output_dir)\nfname = os.path.splitext(os.path.split(input_filename)[1])[0]\n\nos.system('ffmpeg -i \"%s\" \"%s/%s.ogg\"' % (input_filename, output_dir, fname))\nos.system('ffmpeg -i \"%s\" \"%s/%s.mp3\"' % (input_filename, output_dir, fname))\n"
  },
  {
    "path": "tools/convert-sequence",
    "content": "// Converts sequences from the legacy format to the new, more compact format.\nvar fs = require('fs');\n\nif(process.argv.length < 4)\n{\n\tconsole.log('Usage: convert-sequence <input> <output>');\n\treturn;\n}\n\nvar input_fn = process.argv[2];\nvar output_fn = process.argv[3];\n\nvar seq = JSON.parse(fs.readFileSync(input_fn));\n\nfunction rename(o, s, d)\n{\n\to[d] = o[s];\n\tdelete o[s];\n}\n\nfunction reduce_dyn_in(ds)\n{\n\trename(ds, 'name', 'n');\n\trename(ds, 'index', 'i');\n\trename(ds, 'type', 't');\n\trename(ds, 'is_connected', 'ic');\n}\n\nfunction reduce_dyn_out(ds)\n{\n\trename(ds, 'name', 'n');\n\trename(ds, 'index', 'i');\n\trename(ds, 'type', 't');\n\trename(ds, 'connected', 'c');\n\tdelete ds.desc;\n}\n\nfunction reduce_graph(g)\n{\n\trename(g, 'node_uid', 'nuid');\n\trename(g, 'parent_uid', 'puid');\n\t\n\tvar nodes = g.nodes;\n\t\n\tfor(var i = 0; i < nodes.length; i++)\n\t{\n\t\tvar n = nodes[i];\n\t\t\n\t\trename(n, 'plugin', 'p');\n\t\tn.l = [n.x, n.y];\n\t\tdelete n.x;\n\t\tdelete n.y;\n\t\trename(n, 'state', 's');\n\t\trename(n, 'title', 't');\n\t\t\n\t\tif(n.p === 'graph' || n.p === 'loop')\n\t\t{\n\t\t\trename(n, 'graph', 'g');\n\t\t\treduce_graph(n.g);\n\t\t}\n\t\t\n\t\tif(n.dyn_in)\n\t\t{\n\t\t\trename(n, 'dyn_in', 'dci');\n\t\t\treduce_dyn_in(n.dci);\n\t\t}\n\n\t\tif(n.dyn_out)\n\t\t{\n\t\t\trename(n, 'dyn_out', 'dco');\n\t\t\treduce_dyn_out(n.dco);\n\t\t}\n\t}\n\t\n\tvar conns = g.conns;\n\tvar nc = [];\n\t\n\tfor(var i = 0; i < conns.length; i++)\n\t{\n\t\tvar c = conns[i];\n\t\tnc.push([c.src_nuid, c.dst_nuid, c.src_slot, c.dst_slot]);\n\t}\n\t\n\tg.conns = nc;\n}\n\nreduce_graph(seq.root);\nfs.writeFileSync(output_fn, JSON.stringify(seq, '    '));\n"
  },
  {
    "path": "tools/create-test-examples.js",
    "content": "var fs = require('fs')\nvar mongoose = require('mongoose')\nvar when = require('when')\n\nvar graphFile = __dirname+'/../browser/data/graphs/default.json'\nvar graphData = fs.readFileSync(graphFile).toString('utf8')\n\nvar db, graphs, users\n\nfunction rand() {\n\treturn Math.floor(Math.random() * 10000)\n}\n\nfunction connect() {\n\tvar dfd = when.defer()\n\tmongoose.connect('mongodb://localhost:27017/vizor')\n\tmongoose.connection.once('connected', function() {\n\t\tdb = mongoose.connection.db\n\t\tdb.collection('graphs', function(err, gc) {\n\t\t\tif (err) return dfd.reject(err)\n\t\t\tgraphs = gc\n\n\t\t\tdb.collection('users', function(err, uc) {\n\t\t\t\tif (err) return dfd.reject(err)\n\t\t\t\tusers = uc\n\n\t\t\t\tdfd.resolve()\n\t\t\t})\n\t\t})\n\t})\n\treturn dfd.promise\n}\n\nconnect()\n.then(function() {\n\treturn users.findOne({username:'examples'})\n\t.then((user) => {\n\t\tif (user)\n\t\t\treturn when.resolve(user)\n\n\t\tconsole.log('Creating test examples user')\n\t\treturn users.insert({username:'examples'})\n\t})\n})\n.then(function(user) {\n\treturn when.map([1, 2, 3, 4, 5], () => {\n\t\treturn graphs.insert({\n\t\t\tprivate: false,\n\t\t\trank: 0,\n\t\t\tdeleted: false,\n\t\t\teditable: true,\n\t\t\tgraph: graphData,\n\t\t\tpath: rand(),\n\t\t\tname: rand(),\n\t\t\towner: 'examples',\n\t\t\t_creator: user._id,\n\t\t\tpreviewUrlSmall: 'foo',\n\t\t\tpreviewUrlLarge: 'foo',\n\t\t})\n\t})\n})\n.then(function() {\n\tdb.close()\n})\n\n"
  },
  {
    "path": "tools/edit-graph.py",
    "content": "#!/usr/bin/env python\nfrom __future__ import print_function\nimport os\nimport sys\nimport codecs\nimport json\nimport fnmatch\nimport shlex\nimport collections\nimport cmd\n\nANSI_BLUE = '\\033[94m'\nANSI_GREEN = '\\033[92m'\nANSI_YELLOW = '\\033[93m'\nANSI_RED = '\\033[91m'\nANSI_PROMPT = '\\033[95m'\nANSI_ENDC = '\\033[0m'\n\nclass DelegationException(Exception):\n\tpass\n\nclass ParsedSelectors:\n\tdef __init__(self, args):\n\t\tself.pat = []\n\t\tself.predicate = [None] * 4\n\t\tself.mask = [False] * 4\n\t\t\n\t\tit = iter(args)\n\n\t\tfor arg in it:\n\t\t\tif arg[0] == '-':\n\t\t\t\tfor c in arg[1:]:\n\t\t\t\t\tif c == 'g':\n\t\t\t\t\t\tself.mask[0] = True\n\t\t\t\t\telif c == 'n':\n\t\t\t\t\t\tself.mask[1] = True\n\t\t\t\t\telif c == 'c':\n\t\t\t\t\t\tself.mask[2] = True\n\t\t\t\t\telif c == 'r':\n\t\t\t\t\t\tself.mask[3] = True\n\t\t\t\t\telif c == 'p':\n\t\t\t\t\t\ttry:\n\t\t\t\t\t\t\tself.predicate = it.next()\n\t\t\t\t\t\texcept StopIteration:\n\t\t\t\t\t\t\tprint('*** Error: Expected predicate expression after the \\'-p\\' switch.')\n\t\t\t\t\t\t\traise DelegationException()\n\t\t\t\t\telse:\n\t\t\t\t\t\treturn '*** Error: Unrecognized switch ' + arg\n\t\t\telse:\n\t\t\t\tself.pat.append(arg)\n\t\t\n\t\tif len(self.pat) < 1:\n\t\t\tself.pat.append('*')\n\n\t\tif not self.mask[0] and not self.mask[1] and not self.mask[2]:\n\t\t\tself.mask[0] = self.mask[1] = self.mask[2] = True\n\t\t\n\t\tself.pat = ' '.join(self.pat)\n\nclass Connection:\n\tdef __init__(self, parent_graph, data):\n\t\tself.parent_graph = parent_graph\n\t\tself.data = data\n\t\tself.uid = parent_graph.conn_index\n\t\tparent_graph.conn_index = parent_graph.conn_index + 1\n\t\tself.src_node = parent_graph.find_node_by_uid(data['src_nuid'])\n\t\tself.dst_node = parent_graph.find_node_by_uid(data['dst_nuid'])\n\t\tself.name = '%s (%d) -> %s (%d)' % (self.src_node.name, self.src_node.uid, self.dst_node.name, self.dst_node.uid)\n\nclass Node:\n\tdef __init__(self, parent_graph, data):\n\t\tself.parent_graph = parent_graph\n\t\tself.uid = data['uid']\n\t\tself.name = data.get('title') or data['plugin']\n\t\tself.data = data\n\t\tself.plugin = data['plugin']\n\t\t\n\t\tif self.plugin == 'graph' or self.plugin == 'loop':\n\t\t\tself.graph = Graph(data['title'], parent_graph, self, data['graph'])\n\t\n\tdef get_conns(self):\n\t\tconns = []\n\t\t\n\t\tfor conn in self.parent_graph.conns:\n\t\t\tif conn.src_node == self or conn.dst_node == self:\n\t\t\t\tconns.append(conn)\n\t\t\n\t\treturn conns\n\nclass Graph:\n\tdef __init__(self, name, parent_graph, parent_node, data):\n\t\tself.name = name\n\t\tself.parent_graph = parent_graph\n\t\tself.parent_node = parent_node\n\t\tself.uid = -1\n\t\tself.graphs = []\n\t\tself.nodes = []\n\t\tself.all_nodes = []\n\t\tself.conns = []\n\t\tself.data = data\n\t\tself.conn_index = 0\n\t\t\n\t\tif data:\n\t\t\tself.uid = data['uid']\n\t\t\t\n\t\t\tfor n in data['nodes']:\n\t\t\t\tnode = Node(self, n)\n\t\t\t\n\t\t\t\tif hasattr(node, 'graph'):\n\t\t\t\t\tself.graphs.append(node.graph)\n\t\t\t\telse:\n\t\t\t\t\tself.nodes.append(node)\n\t\t\t\n\t\t\t\tself.all_nodes.append(node)\n\t\t\t\n\t\t\tfor c in data['conns']:\n\t\t\t\tconn = Connection(self, c)\n\t\t\t\n\t\t\t\tself.conns.append(conn)\n\t\n\tdef get_item_count(self):\n\t\treturn len(self.graphs) + len(self.nodes) + len(self.conns)\n\t\n\tdef parse_by_id(self, pat):\n\t\tt = shlex.split(pat)\n\t\tis_digit = len(t) > 1 and t[1].isdigit()\n\t\t\n\t\treturn t[0] == 'id' and is_digit, int(t[1]) if is_digit else -1\n\t\n\tdef remove_dyn_slot(self, is_output, uid):\n\t\tdslots = self.parent_node.data['dyn_out'] if is_output else self.parent_node.data['dyn_in']\n\t\t\n\t\tfor slot in dslots:\n\t\t\tif slot['uid'] == uid:\n\t\t\t\tprint('Removed slot ' + slot.uid)\n\t\t\t\tdslots.remove(slot)\n\t\t\t\tbreak\n\t\n\tdef delete(self, graph):\n\t\tgraph.iterate([self.delete_graph, self.delete_node, self.delete_conn])\n\n\tdef delete_node(self, node):\n\t\tif node in self.nodes: self.nodes.remove(node)\n\t\tif node in self.all_nodes: self.all_nodes.remove(node)\n\n\t\tnodes = self.data['nodes']\n\n\t\tif node.data in nodes: nodes.remove(node.data)\n\t\t\n\t\tif hasattr(self.parent_graph, 'parent_node'):\n\t\t\tif node.plugin == 'input_proxy':\n\t\t\t\tself.parent_graph.parent_node.remove_dyn_slot(False, self.data['state']['slot_id'])\n\t\t\telif node.plugin == 'output_proxy':\n\t\t\t\tself.parent_graph.parent_node.remove_dyn_slot(True, self.data['state']['slot_id'])\n\t\t\t\t\n\tdef delete_conn(self, conn):\n\t\tif conn in self.conns: self.conns.remove(conn)\n\t\t\n\t\tconns = self.data['conns']\n\t\t\n\t\tif conn.data in conns: conns.remove(conn.data)\n\n\tdef delete_graph(self, graph):\n\t\tif graph in self.graphs: self.graphs.remove(graph)\n\t\t\n\t\tself.delete_node(graph.parent_node)\n\n\tdef find_node_by_uid(self, uid):\n\t\tfor node in self.all_nodes:\n\t\t\tif node.uid == uid:\n\t\t\t\treturn node\n\t\n\tdef find_all(self, ps, pred = [None, None, None]):\n\t\tg = Graph('Internal search graph', None, None, None)\n\t\t\n\t\tg.graphs = self.find_items('graphs', 0, ps, pred[0])\n\t\tg.nodes = self.find_items('nodes', 1, ps, pred[1])\n\t\tg.conns = self.find_items('conns', 2, ps, pred[2])\n\t\t\n\t\treturn g\n\t\t\n\tdef find_items(self, arr_prop, idx, ps, pred):\n\t\tif not ps.mask[idx]:\n\t\t\treturn []\n\t\t\n\t\tby_id, uid = self.parse_by_id(ps.pat)\n\t\tps.pred_funcs = []\n\t\t\n\t\tdef splitkeepsep(s, sep):\n\t\t\treturn reduce(lambda acc, elem: acc[:-1] + [acc[-1] + elem] if elem == sep else acc + [elem], re.split(\"(%s)\" % re.escape(sep), s), [])\n\t\t\n\t\tfor i in range(3):\n\t\t\tif not ps.predicate[i]:\n\t\t\t\tps.pred_func.append(None)\n\t\t\t\tcontinue\n\t\t\t\n\t\t\tpred_toks = splitkeepsep(ps.predicate[i], '=<>! ')\n\t\t\t\n\t\t\t# TODO:\n\t\t\n\t\treturn self.find_items_recursive(arr_prop, idx, by_id, uid, ps, pred)\n\t\t\t\n\tdef find_items_recursive(self, arr_prop, idx, by_id, uid, ps, pred):\n\t\titems = []\n\t\tarr = getattr(self, arr_prop)\n\t\t\n\t\tfor item in arr:\n\t\t\ttry:\n\t\t\t\tif (not pred or pred(item)) and (not ps.predicate[idx] or eval(ps.predicate[idx])):\n\t\t\t\t\tif by_id:\n\t\t\t\t\t\tif item.uid == uid:\n\t\t\t\t\t\t\titems.append(item)\n\t\t\t\t\telif fnmatch.fnmatch(item.name, ps.pat):\n\t\t\t\t\t\titems.append(item)\n\t\t\texcept:\n\t\t\t\tcontinue\n\n\t\tif ps.mask[3]:\n\t\t\tfor graph in self.graphs:\n\t\t\t\titems.extend(graph.find_items_recursive(arr_prop, idx, by_id, uid, ps, pred))\n\t\t\n\t\treturn items\n\t\n\tdef echo(self, cbs = [None, None, None]):\n\t\theaders = [ANSI_GREEN + '<GRAPH> ', ANSI_BLUE + '<NODE> ', ANSI_YELLOW + '<CONN> ']\n\t\tarrs = [self.graphs, self.nodes, self.conns]\n\t\t\n\t\tfor i in range(3):\n\t\t\tcb = cbs[i]\n\t\t\t\n\t\t\tfor item in arrs[i]:\n\t\t\t\tprint(headers[i] + ANSI_ENDC + item.name + ' (' + str(item.uid) +')')\n\t\t\t\t\n\t\t\t\tif cb:\n\t\t\t\t\tcb(item)\n\t\n\tdef dump(self, ps, cbs):\n\t\tg = self.find_all(ps)\n\t\tg.echo(cbs)\n\t\t\n\t\treturn [len(g.graphs), len(g.nodes), len(g.conns)]\n\t\n\tdef iterate(self, cbs = [None, None, None], mask = [True, True, True]):\n\t\tarray = [self.graphs, self.nodes, self.conns]\n\t\t\n\t\tfor i in range(3):\n\t\t\tif not mask[i] or not cbs[i]:\n\t\t\t\tcontinue\n\t\t\t\n\t\t\tcb = cbs[i]\n\t\t\t\n\t\t\tfor item in array[i]:\n\t\t\t\tcb(item)\n\t\t\nclass Context:\n\tdef __init__(self, data, filename):\n\t\tself.data = data\n\t\tself.filename = filename if filename else ''\n\t\tself.root_graph = Graph('Root', None, None, data['root']) if filename else Graph('Default graph', None, None, None)\n\t\tself.current_graph = self.root_graph\n\t\tself.cwd = 'Root/'\n\t\t\n\tdef build_path_recursive(self, path, graph):\n\t\tpath = graph.name + '/' + path\n\t\t\n\t\tif graph.parent_graph:\n\t\t\treturn self.build_path_recursive(path, graph.parent_graph)\n\t\t\n\t\treturn path\n\t\t\t\n\tdef update_cwd(self):\n\t\tself.cwd = self.build_path_recursive('', self.current_graph)\t\t\n\t\n\tdef cd(self, args):\n\t\tif args == '': return\n\t\t\n\t\targs = shlex.split(args)\n\t\t\n\t\tif args[0] == '..':\n\t\t\tif self.current_graph.parent_graph == None:\n\t\t\t\tprint('*** You\\'re already in the root.')\n\t\t\telse:\n\t\t\t\tself.current_graph = self.current_graph.parent_graph\n\t\t\t\tself.update_cwd()\n\t\telse:\n\t\t\tps = ParsedSelectors(args)\n\t\t\tps.mask = [True, False, False, False]\n\t\t\tg = self.current_graph.find_all(ps)\n\t\t\tcount = g.get_item_count()\n\t\t\t\n\t\t\tif count < 1:\n\t\t\t\tprint('*** No such graph: ' + ps.pat)\n\t\t\t\treturn\n\t\t\telif count > 1:\n\t\t\t\tprint('\\nThe specified graph \\'' + ps.pat + '\\' is named ambigously. Which graph did you mean:\\n')\n\t\t\t\tg.echo()\t\t\n\t\t\t\treturn\n\n\t\t\tself.current_graph = g.graphs[0]\n\t\t\tself.update_cwd()\n\t\t\n\tdef print_summary(self, count):\n\t\tdelim = ''\n\t\t\n\t\tif count[0] == 0 and count[1] == 0 and count[2] == 0:\n\t\t\tdelim = '---\\n'\n\t\t\n\t\tprint(delim + '\\n%d graphs, %d nodes and %d connections.' % (count[0], count[1], count[2]))\n\t\n\tdef ls(self, args):\n\t\targs = shlex.split(args)\n\t\tprint('')\n\t\tself.print_summary(self.current_graph.dump(ParsedSelectors(args), [None, None, None]))\n\t\n\tdef alter_data_query(self, cb, desc, query):\n\t\tprint('\\n' + ANSI_RED + desc + ':\\n' + ANSI_ENDC)\n\t\tcb()\n\t\tinp = raw_input('\\n' + query + '. Continue (y/n)? ')\n\t\t\n\t\treturn inp == 'yes' or inp == 'y'\n\t\n\tdef rm(self, args):\n\t\targs = shlex.split(args)\n\t\t\n\t\tif len(args) < 1:\n\t\t\tprint('*** Nothing to remove.')\n\t\t\n\t\tps = ParsedSelectors(args)\n\t\tg = self.current_graph.find_all(ps)\n\t\t\n\t\tif ps.mask[1]:\n\t\t\tfor node in g.nodes:\n\t\t\t\tg.conns.extend(node.get_conns())\n\t\t\n\t\tg.conns = list(set(g.conns))\n\t\tpending = g.get_item_count()\n\t\t\n\t\tif pending > 0:\n\t\t\tif self.alter_data_query(lambda: g.echo(), 'This action will delete the following objects', 'This operation will destroy data'):\n\t\t\t\tself.current_graph.delete(g)\n\t\t\t\tprint('\\nRemoved %d graphs, %d nodes and %d connections.' % (len(g.graphs), len(g.nodes), len(g.conns)))\n\t\telse:\n\t\t\tprint('*** Nothing to remove.')\n\t\n\tdef dump(self, args):\n\t\targs = shlex.split(args)\n\t\t\n\t\tdef dump_json(i): print(json.dumps(i.data, indent = 2, sort_keys = False) + '\\n')\n\t\t\n\t\tself.print_summary(self.current_graph.dump(ParsedSelectors(args), [dump_json, dump_json, dump_json]))\n\t\n\tdef refac(self, args):\n\t\targs = shlex.split(args)\n\t\tps = ParsedSelectors(args)\n\t\ttok = shlex.split(ps.pat)\n\t\t\n\t\tif len(tok) < 4:\n\t\t\tprint('*** Missing argument(s).')\n\t\t\n\t\tprop = tok[0]\n\t\told_val = tok[1]\n\t\tnew_val = tok[2]\n\t\tps.pat = tok[3]\n\t\t\n\t\tif old_val.isdigit():\n\t\t\told_val = int(old_val)\n\t\t\tnew_val = int(new_val)\n\t\t\n\t\tdef pred(i):\n\t\t\tprint(i.data[prop])\n\t\t\treturn hasattr(i, prop) and i.data[prop] == old_val\n\t\t\n\t\tdef show_prop(i):\n\t\t\tprint('(%s).%s: %s -> %s' % (i.name, prop, str(i.data[prop]), tok[2]))\n\t\t\n\t\tdef set_prop(i):\n\t\t\ti.data[prop] = new_val\n\t\t\n\t\tg = self.current_graph.find_all(ps, [pred, pred, pred])\n\t\tpending = g.get_item_count()\n\t\t\t\t\n\t\tif pending > 0:\n\t\t\tif self.alter_data_query(lambda: g.iterate([show_prop, show_prop, show_prop], mask), 'This action will change the following objects', 'This operation will alter data'):\n\t\t\t\tg.iterate([set_prop, set_prop, set_prop], mask)\n\t\t\t\tprint('\\nChanged %d graphs, %d nodes and %d connections.' % (len(g.graphs), len(g.nodes), len(g.conns)))\n\t\telse:\n\t\t\tprint('Nothing to refactor.')\n\n\tdef save(self, args):\n\t\targs = shlex.split(args)\n\t\tf = open(self.filename, 'w')\n\t\t\n\t\t# TODO: The ordering of the keys is not maintained!\n\t\tf.write(json.dumps(self.data, indent=4, sort_keys=False))\n\t\tf.close()\n\t\t\n\t\tprint('Saved to ' + self.filename)\n\nclass Expression:\n\tdef __init__(self, context, args):\n\t\tg = context.current_graph.find_all()\n\ncontext = Context({}, None)\n\ndef load_file(filename):\n\tglobal context\n\t\n\twith codecs.open(filename, 'r', 'utf-8-sig') as json_data:\n\t\tcontext = Context(json.load(json_data, object_pairs_hook = collections.OrderedDict), filename)\n\t\n\tprint('Editing: ' + filename)\n\t\nclass Shell(cmd.Cmd):\n\tdef set_prompt(self):\n\t\tself.prompt = '\\n' + ANSI_PROMPT + context.cwd + '> ' + ANSI_ENDC\n\t\n\tdef help_flags(self):\n\t\tprint('* Where ' + ANSI_GREEN + '<sel>' + ANSI_ENDC + ' is specified, this means: wildcard pattern')\n\t\tprint('or id <n>, where <n> is the uid of the desired object.')\n\t\tprint('')\n\t\tprint('* Where ' + ANSI_GREEN + '-gncr' + ANSI_ENDC + ' flags can be supplied these limit the operation')\n\t\tprint('to (g)raphs, (n)odes or (c)onnections or (r)ecurses into')\n\t\tprint('child graphs. Any combination can be specified, ex.: -gc,')\n\t\tprint('-rgn and so on. The default is to operatate on all three')\n\t\tprint('types without recursion.')\n\t\n\tdef do_cd(self, args):\n\t\tcontext.cd(args)\n\t\tself.set_prompt()\n\t\n\tdef help_cd(self):\n\t\tprint(ANSI_GREEN + 'cd <sel | ..>' + ANSI_ENDC + ':\\nMoves up to the parent graph or into the first child graph\\nthe name pattern or uid supplied.')\n\t\n\tdef do_ls(self, args):\n\t\tcontext.ls(args)\n\t\n\tdef help_ls(self):\n\t\tprint(ANSI_GREEN + 'ls [-gncr] [-p <python>] [sel]' + ANSI_ENDC + ':\\nList the contents of the current graph. If no selector is given,\\neverything is listed.')\n\t\n\tdef do_rm(self, args):\n\t\tcontext.rm(args)\n\t\n\tdef help_rm(self):\n\t\tprint(ANSI_GREEN + 'rm [-gncr] [-p <python>] <sel>' + ANSI_ENDC + ':\\nRemoves the specified items from the current graph. Will display\\nthe pending set and ask for confirmation before proceeding.')\n\t\n\tdef do_dump(self, args):\n\t\tcontext.dump(args)\n\t\n\tdef help_dump(self):\n\t\tprint(ANSI_GREEN + 'dump [-gncr] [-p <python>] [sel]' + ANSI_ENDC + ':\\nDumps the json of the matching objects. If not selector is given,\\neverything is dumped.')\n\t\t\n\tdef do_refac(self, args):\n\t\tcontext.refac(args)\n\t\n\tdef help_refac(self):\n\t\tprint(ANSI_GREEN + 'refac [-gncr] [-p <python>] <property name> <old value> <new value> <sel>' + ANSI_ENDC + ':\\nDumps the json of the matching objects.')\n\t\n\tdef do_save(self, args):\n\t\tcontext.save(args)\n\t\n\tdef help_save(self):\n\t\tprint(ANSI_GREEN + 'save' + ANSI_ENDC + ':\\nSaves the current file to the original filename.')\n\t\n\tdef do_exit(self, args):\n\t\tsys.exit('Session closed.')\n\t\t\n\tdef help_exit(self):\n\t\tprint(ANSI_GREEN + 'exit' + ANSI_ENDC + ':\\nEnd the current session, discarding all unsaved changes.')\n\t\n\tdef help_help(self):\n\t\tpass\n\ndef repl():\n\ts = Shell()\n\ts.set_prompt()\n\t\n\ttry:\n\t\ts.cmdloop()\n\texcept DelegationException:\n\t\ts.cmdloop()\n\nprint(ANSI_GREEN + '\\nEdit Graph\\n----------' + ANSI_ENDC + '\\n')\n\narg_count = len(sys.argv)\n\nif arg_count < 2 or arg_count > 3:\n\tsys.exit('Usage: edit-graph.py <graph.json> OR edit-graph.py <script> <json file pattern>')\n\t\nif arg_count == 2:\n\tload_file(sys.argv[1])\n\trepl()\nelif arg_count == 3:\n\tpass\n\n"
  },
  {
    "path": "tools/extract-plugin-docs.js",
    "content": "const fs = require('fs')\nconst vm = require('vm')\n\nvar toMarkdown = require('to-markdown')\n\nconst createVizorSandbox = require('../lib/sandbox')\n\nconst pluginsPath = 'browser/plugins'\n\nvar sandbox = createVizorSandbox()\nvar context = new vm.createContext(sandbox)\n\nvar engineSource = fs.readFileSync('browser/dist/engine.js')\nengineSource += ';\\nE2.core = new Core();\\n'\nengineSource += ';\\nE2.core.add_aux_script = function() { return when.resolve() }\\n'\nengineSource += ';\\nE2.app = { player: { core: E2.core }};\\n'\nengineSource += 'E2.core.root_graph = new Graph();\\n'\n\nvar engineScript = new vm.Script(engineSource, { filename: 'engine.js' })\nengineScript.runInContext(context)\n\nvar plugins = JSON.parse(fs.readFileSync(pluginsPath + '/plugins.json'))\nvar pluginCats = Object.keys(plugins)\n\nvar docsPath = 'documentation/browser/plugins'\n\nvar argv = require('minimist')(process.argv.slice(2))\n\nif (!argv['f'] && !argv['o']) {\n\tconsole.log(`usage: extract-plugin-docs [-o pluginId [otherPluginId] [...]] [-f]\n\t\n\textracts the desc fields from all plugins and rewrites\n\tdocumentation in documentation/browser/plugins/\n\n\tgiving pluginIds filters the operation to only the given plugin ids\n\n\tif no pluginIds are given, you need -f (force) to overwrite all\n\texisting plugin docs`)\n\tprocess.exit(1)\n}\n\nvar onlyPlugins = argv['_'].length > 0 ? argv['_'].slice() : undefined\n\nif (process.argv.indexOf('-o') !== -1) {\n\tonlyPlugins = process.argv.slice(process.argv.indexOf('-o') + 1)\n\n\tconsole.log('only plugins:', onlyPlugins)\n}\n\nfunction captureStrings(pluginId, pluginName, plugin) {\n\tvar desc = plugin.desc\n\n\tvar md = ''\n\n\tmd += '#' + pluginName + '\\n\\n'\n\n\tmd += '##Description\\n'\n\tmd += toMarkdown(desc || \"\") + '\\n\\n'\n\n\tmd += '##Inputs\\n'\n\n\tfor (var i = 0; i < plugin.input_slots.length; ++i) {\n\t\tvar s = plugin.input_slots[i]\n\t\t//console.log('   i ', s.name, ':', s.desc)\n\t\tmd += '###' + s.name + '\\n'\n\t\tmd += toMarkdown(s.desc || \"\") + '\\n\\n'\n\t}\n\n\tmd += '##Outputs\\n'\n\n\tfor (var i = 0; i < plugin.output_slots.length; ++i) {\n\t\tvar s = plugin.output_slots[i]\n\t\tmd += '###' + s.name + '\\n'\n\t\tmd += toMarkdown(s.desc || \"\") + '\\n\\n'\n\t}\n\n\tmd += '##Detail\\n\\n'\n\n\treturn md\n}\n\npluginCats.map(function(cat) {\n\tvar pluginNames = Object.keys(plugins[cat])\n\n\tpluginNames.map(function(pluginName) {\n\t\tvar pluginId = plugins[cat][pluginName]\n\t\tif (onlyPlugins && onlyPlugins.indexOf(pluginId) === -1) {\n\t\t\t// skip if we're filtering\n\t\t\treturn\n\t\t}\n\t\tvar pluginSourcePath = pluginsPath+'/'+pluginId+'.plugin.js'\n\n\t\tvar pluginSource = fs.readFileSync(pluginSourcePath)\n\t\tpluginSource += ';\\n'\n\t\tpluginSource += 'var fakeNode = new Node(E2.core.root_graph, \"'+pluginId+'\");\\n'\n\t\tpluginSource += 'var plugin = new E2.plugins.'+pluginId+'(E2.core, fakeNode);\\n'\n\n\t\tscript = new vm.Script(pluginSource, { filename: pluginId })\n\t\tscript.runInContext(context)\n\n\t\tvar md = captureStrings(pluginId, pluginName, context.plugin)\n\n\t\tfs.writeFileSync(docsPath + '/' + pluginId + '.md', md)\n\t})\n})\n\n"
  },
  {
    "path": "tools/imgopt/README.txt",
    "content": "imgopt README\n\n# Author: Joel Hardi\n# Version: 0.1.2 2009-04-02\n#\n# For more information and usage examples, see:\n# http://lyncd.com/2009/03/imgopt-lossless-optimize-png-jpeg/\n\nThe included bash script imgopt uses find to recursively locate JPEG/PNG \nfiles and process them with jpegtran, jfifremove, optipng, advpng and pngout, \nusing settings to losslessly minimize file size and strip all metadata headers.\n\nSo, you can easily optimize every image in your website (\"imgopt htdocs\"), just\na single file (\"imgopt favicon.png\") or any combination (\"imgopt favicon.png\nimages/ uploads/\")!\n\nAny files the script is able to reduce in size, it overwrites in place. It does\nnot write to or overwrite files that it cannot reduce in size.\n\nThe script is commented to make it easy for you to edit if you would like to\ncustomize the helper programs used, or their runtime options.\n\nBy default, all image transformations are lossless. (Stripping of metadata is,\nof course, not reversible.) But, there's always the possibility of bugs, and \nI'm not the author of any of the helper programs used, so I strongly suggest\nthat you not run this script on your only copy of a file! Use at your own risk.\n\nThe intended use of this script is the absolute minimization of file size to\nmaximize performance of high-traffic websites -- I recommend you use it as the\nlast stage in a publish/build workflow of your web graphics and always keep\noriginal graphic source files somewhere.\n\nIncluded is a small program, jfifremove.c, to strip the optional JFIF header\nsegment from JPEG files. I don't claim authorship -- I found it at\nhttp://archives.devshed.com/forums/compression-130/question-about-using-jpegtran-for-lossless-compression-of-jpegs-2013044.html,\ncompared what it does to the JFIF segment format standard, fixed a few small\nerrors and named it jfifremove. I've tested it thoroughly as it is used in this\nscript -- deleting the JFIF segment from files that already have had all other\noptional headers stripped by jpegtran. I have *not* tested it thoroughly for\nstandalone use (i.e. with files containing thumbnails, EXIF data) so I cannot \nrecommend you use it on its own on JPEG files in the wild. This is just FYI -- I\nhave no reason to believe that it *isn't* OK for standalone use; I'm just \ntelling you that I haven't tested it that way, so you should use caution.\n\n------------\nInstallation\n------------\n\n1. imgopt is ready to run. Copy imgopt into your path and chmod it executable.\n   i.e. as root or via sudo:\n   cp imgopt /usr/local/bin/ && chmod a+x /usr/local/bin/imgopt\n\n2. Compile jfifremove and copy into your path. i.e.:\n\n   gcc -o jfifremove jfifremove.c\n   # as root or via sudo:\n   mv jfifremove /usr/local/bin/\n\n   (Or, if you would rather not use jfifremove and just leave JFIF data intact,\n   you can edit imgopt and delete/comment out the line that calls jfifremove.)\n\n3. Install jpegtran (part of libjpeg so very likely already installed),\n   optipng and advpng (part of AdvanceCOMP) or comment out any of these that \n   you prefer not to use. If you're on Linux, you'll likely use your package\n   manager to install these (i.e. \"apt-get install optipng advancecomp\"). On my\n   Mac, I've installed them all from source and they're all very quick\n   installs; see comments in imgopt script for download locations.\n\n   pngout is closed source; binaries are available for free download for\n   Linux x86, BSD x86, Mac OS X (Intel and PPC) and Windows. See:\n   http://www.jonof.id.au/index.php?p=kenutils\n\n-----\nUsage\n-----\n\nimgopt [FILE/DIR] [FILE/DIR] [FILE/DIR] ...\n\nOptimizes any combination of files and directories. Directories are searched\nrecursively, and all image files in any subdirectories are optimized.\n\nExamples:\n\n imgopt .      Optimize all images in current directory and any subdirectories\n imgopt *.png  Optimize all pngs in current directory only\n\n"
  },
  {
    "path": "tools/imgopt/imgopt",
    "content": "#!/bin/bash\n\n# Simple bash script to use find to recursively locate JPEG/PNG files\n# and process them with jpegtran, jfifremove, optipng, advpng and pngout \n# using settings to minimize file size and strip all metadata headers.\n#\n# To change optimization programs/settings, edit/comment out in functions\n# do_jpeg and do_png below.\n#\n# Author: Joel Hardi\n# Version: 0.1.2 2009-04-02\n#\n# For more information and usage examples, see:\n# http://lyncd.com/2009/03/imgopt-lossless-optimize-png-jpeg/\n\n# Usage help text\nusage () {\n  echo \"Usage: imgopt [FILE/DIR] [FILE/DIR] [FILE/DIR] ...\"\n  echo\n  echo \"Optimizes any combination of files and directories. Directories are searched\"\n  echo \"recursively, and all image files in any subdirectories are optimized.\"\n  echo\n  echo \"Examples:\"\n  echo\n  echo \" imgopt .      Optimize all images in current directory and any subdirectories\"\n  echo \" imgopt *.png  Optimize all pngs in current directory only\"\n  echo\n}\n\n# Optimize PNG file in place\n# (edit here to add/remove PNG optimizing steps or change parameters)\n# More information on PNG optimization techniques:\n# http://optipng.sourceforge.net/pngtech/optipng.html\ndo_png () {\n  # $1 is filename\n\n  # advpng, part of AdvanceCOMP, is available here:\n  # http://advancemame.sourceforge.net/comp-download.html\n  advpng -z -4 -q \"$1\"\n\n  # OptiPNG is available here:\n  # http://optipng.sourceforge.net/\n  optipng -q -zc1-9 -zm1-9 -zs0-3 -f0-5 \"$1\"\n\n  # pngout is available here (binaries only):\n  # http://www.jonof.id.au/index.php?p=kenutils\n  # pngout \"$1\" $TMPF -q -y\n  \n  # Sometimes (not always) pngout appends \".PNG\" to output filename\n  #if [ -f \"$TMPF.PNG\" ]; then\n  #  mv -f $TMPF.PNG $TMPF\n  #fi\n\n  return 0\n}\n\n# Optimize JPEG file in place\n# (edit here to add/remove JPEG optimizing steps or change parameters)\ndo_jpeg () {\n  # $1 is filename\n  TMPJ=`mktemp -t tmp.XXXXXX` || return 1\n\n  # jpegtran is part of libjpeg (almost surely already on your system).\n  # If not, it's here:\n  # http://www.ijg.org/\n  jpegtran -copy none -optimize -outfile $TMPJ \"$1\" && mv -f $TMPJ \"$1\"\n\n  # jfifremove is included with this script, be sure to compile and install\n  ./jfifremove < \"$1\" > $TMPJ && mv -f $TMPJ \"$1\"\n\n  return 0\n}\n\n# Optimize file, only replace original if optimized version is smaller\ndo_file () {\n  # $1 is name of file\n  if [ -w \"$1\" ]; then\n\n    # Copy file to tmp file and optimize in place\n    cp -f \"$1\" $TMPF\n    case \"$1\" in\n      *.[Pp][Nn][Gg] )\n      do_png $TMPF\n      ;;\n      *.[Jj][Pp][Ee][Gg] )\n      do_jpeg $TMPF\n      ;;\n      *.[Jj][Pp][Gg] )\n      do_jpeg $TMPF\n      ;;\n      * )\n      echo \"$1 could not be identified, please rename to .jpg or .png\"\n      return 1\n      ;;\n    esac\n\n    # If optimized file is smaller, copy it over original\n    BEFORE=`ls -la \"$1\" | awk '{print $5}'`\n    AFTER=`ls -la $TMPF | awk '{print $5}'`\n    let REDUCED=$BEFORE-$AFTER\n    if [ $AFTER -lt $BEFORE ]; then\n      cp -f $TMPF $1\n      echo \"$1 reduced $REDUCED bytes to $AFTER bytes\"\n    else\n      echo \"$1 unchanged at $BEFORE bytes\"\n    fi\n\n    return 0\n  else\n    echo \"$1 is not writable, skipping\"\n    return 1\n  fi\n}\n\n# Optimize recursively all files in a directory\ndo_dir () {\n  # $1 is name of dir\n  RETURNVAL=\"\"\n  IFS=$'\\n'\n  # Doing 2 finds for compatibility with both BSD and GNU find syntax\n  # extended regex like .*\\.(jpe?|pn)g$ would be better but syntax differs\n  for x in `find \"$1\" -type f -iregex '.*\\.[jp][pn]g$' ; find \"$1\" -type f -iregex '.*\\.jpeg$'`; do\n    do_file $x\n    if [ \"$RETURNVAL\" != \"0\" ]; then\n      RETURNVAL=$?\n    fi\n  done\n  if [ \"$RETURNVAL\" == \"\" ]; then\n    RETURNVAL=0\n  fi\n  return $RETURNVAL\n}\n\n\n# If run with args, optimize these files or recursively all files in a dir\nif [[ -n \"$1\" && \"$1\" != '-h' && \"$1\" != '--help' ]]; then\n  TMPF=`mktemp tmp.XXXXXX` || exit 1\n  RETURNVAL=1\n  until [ -z \"$1\" ]; do\n    if [ -d \"$1\" ]; then\n      do_dir \"$1\"\n      if [ \"$RETURNVAL\" != \"0\" ]; then\n        RETURNVAL=$?\n      fi\n    elif [ -f \"$1\" ]; then\n      do_file \"$1\"\n      if [ \"$RETURNVAL\" != \"0\" ]; then\n        RETURNVAL=$?\n      fi\n    else\n      echo \"$1 is neither a file nor directory, skipping\"\n    fi\n    shift\n  done\n  rm -f $TMPF\n  exit $RETURNVAL\n# If run without args, print usage help\nelse\n  usage\n  exit 1\nfi\n"
  },
  {
    "path": "tools/imgopt/jfifremove.c",
    "content": "/* Strip JFIF headers from the JPEG image on stdin, and write\nthe result to stdout. Won't work unmodified on Windows\nbecause of the text/binary problem. Not thoroughly tested.\n\nDebugged version of code found here:\nhttp://archives.devshed.com/forums/compression-130/question-about-using-jpegtran-for-lossless-compression-of-jpegs-2013044.html\n*/\n\n#include <stdio.h>\n#include <stdlib.h>\n\nvoid fail(const char* msg) {\n  fputs(msg, stderr);\n  exit(1);\n}\n\nvoid copy_rest(FILE* f, FILE* g) {\n  char buf[4096];\n  int len;\n  while ((len = fread(buf, 1, sizeof buf, f)) > 0) {\n    if (fwrite(buf, 1, len, g) != len)\n      fail(\"write error\");\n  }\n  if (len < 0)\n    fail(\"read error\");\n}\n\nvoid skip_jfif(FILE* f, FILE* g) {\n  int a,b;\n  a = getc(f); b = getc(f);\n  if (a != 0xFF || b != 0xD8)\n    fail(\"not a JPEG file\");\n  putc(a,g); putc(b,g);\n  // 0xFFE9 is APP0 marker to begin JFIF segment\n  while (a = getc(f), b = getc(f), a == 0xFF && b == 0xE0) {\n    // Next 2 bytes after APP0 are length of JFIF segment *including* APP0\n    // so seek forward (0x???? - 2) bytes\n    a = getc(f); b = getc(f);\n    if (a == 0xEF || b == 0xEF)\n      fail(\"stop confusing me with weird test cases\");\n    fseek(f, a * 256 + b - 2, SEEK_CUR);\n  }\n  if (a != 0xEF) putc(a,g);\n  if (b != 0xEF) putc(b,g);\n  copy_rest(f,g);\n}\n\nint main() {\n  skip_jfif(stdin,stdout);\n  return 0;\n}\n"
  },
  {
    "path": "tools/layoutBundler.js",
    "content": "var fs = require('fs')\nvar path = require('path')\nvar gulp = require('gulp')\nvar concat = require('gulp-concat')\nvar slash = require('gulp-slash')\nvar uglify = require('gulp-uglify')\n\nconst packageJson = JSON.parse(fs.readFileSync(__dirname+'/../package.json'))\nconst currentVersion = packageJson.version\n\nconst argv = require('minimist')(process.argv.slice(2))\n\nconst layoutName = argv._[0]\nconst includePlugins = !!argv.i || layoutName === 'editor'\n\nif (!layoutName) {\n\tconsole.error('usage: '+process.argv[1]+' layoutName')\n\tprocess.exit(1)\n}\n\nvar htmlPath = __dirname+'/../views/layouts/'+layoutName+'.handlebars'\nvar htmlOutPath = __dirname+'/../views/layouts/'+layoutName+'-bundled.handlebars'\nvar scriptName = layoutName+'-layout-' + currentVersion + '.min.js'\n\nfunction errorHandler(err) {\n\tconsole.error(err.message, err.lineNumber, err.stack)\n\tthis.emit('end')\n}\n\nfunction bundleLayoutScripts() {\n\tif (process.env.NODE_ENV !== 'production') {\n\t\tconsole.log('Not bundling layout '+layoutName+' (process.env.NODE_ENV is not `production`)')\n\t\treturn;\n\t}\n\n\tconsole.log('Building layout bundle', layoutName)\n\n\t// read input html\n\tvar html = fs.readFileSync(htmlPath, { encoding: 'utf8' })\n\n\tvar beginMarker = '<!-- begin bundler -->'\n\tvar endMarker = '<!-- end bundler -->'\n\n\tvar beginOffset = html.indexOf(beginMarker)\n\tvar endOffset = html.indexOf(endMarker)\n\n\tvar beforeHtml = html.substring(0, beginOffset)\n\tvar bundlerHtml = html.substring(beginOffset + beginMarker.length, endOffset)\n\tvar afterHtml = html.substring(endOffset + endMarker.length)\n\n\t// parse scripts to concatenate\n\tvar re = /\\s?<script( type=\"text\\/javascript\")? src=\"(.*)\"><\\/script>$/gim\n\tvar scripts = bundlerHtml.match(re)\n\tscripts = scripts.map(function(script) {\n\t\tvar scriptPath = /src=\"(.*)\"/.exec(script)[1]\n\t\t\t.substring(1)\n\t\t\t.replace(/^scripts\\//, 'browser/scripts/')\n\t\t\t.replace(/^dist\\//, 'browser/dist/')\n\t\t\t.replace(/^vendor\\//, 'browser/vendor/')\n\t\t\t.replace(/^common\\//, 'common/')\n\n\t\tscriptPath = path.resolve(__dirname, '..', scriptPath)\n\n\t\t// make sure script is there. will throw if not\n\t\tfs.statSync(scriptPath)\n\t\t\n\t\treturn scriptPath\n\t})\n\n\tconsole.log('  scripts found', scripts.length)\n\n\t// add plugins\n\tif (includePlugins) {\n\t\tscripts.push(path.resolve(__dirname, '..') + '/browser/plugins/*.plugin.js')\n\t}\n\n\tvar scriptFolder = path.join(__dirname, '..', 'browser', 'dist')\n\tvar scriptPath = scriptFolder+'/'+scriptName\n\n\t// concat scripts with gulp\n\tgulp.src(scripts)\n\t.pipe(slash())\n\t.pipe(uglify().on('error', errorHandler))\n\t.pipe(concat(scriptName))\n\t.pipe(gulp.dest(scriptFolder))\n\t.on('error', errorHandler)\n\t.on('end', function() {\n\t\thtml = beforeHtml + '\\n'\n\t\thtml += '<script type=\"text/javascript\" src=\"/dist/'+scriptName+'\"></script>\\n'\n\t\thtml += afterHtml\n\n\t\t// write output layout\n\t\tfs.writeFileSync(htmlOutPath, html)\n\n\t\tvar stat = fs.statSync(scriptPath)\n\n\t\tconsole.log('  bundle', scriptName, 'is', Math.round(stat.size / 1024) + ' kB')\n\t})\n}\n\nexports.bundleLayoutScripts = bundleLayoutScripts\n\nif (require.main === module) {\n\tbundleLayoutScripts()\n}\n"
  },
  {
    "path": "tools/migration/0.11.0/0.11.0-userstats.js",
    "content": "var fsPath = require('path')\nvar secrets = require('../../../config/secrets')\nvar mongoose = require('mongoose')\nvar when = require('when')\nvar User = require('../../../models/user')\nvar Graph = require('../../../models/graph')\n\nfunction processUser(username) {\n\tvar dfd = when.defer()\n\t\n\tGraph.find({ owner: username, deleted: false})\n\t.populate('_creator')\n\t.exec(function(err, graphs) {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\n\t\tvar userStats = {\n\t\t\tviews: 0,\n\t\t\tprojects: graphs.length\n\t\t}\n\n\t\tvar creator = graphs[0]._creator\n\n\t\twhen.map(graphs, function(graph) {\n\t\t\tuserStats.views += graph.views\n\t\t})\n\t\t.then(function() {\n\t\t\tcreator.setStats(userStats)\n\t\t\t\t.then(dfd.resolve.bind(dfd))\n\t\t})\n\t})\n\n\treturn dfd.promise\n}\n\n// migrate the graphs and presets in the db\nexports.execute = function() {\n\tvar dfd = when.defer()\n\n\tfunction done(err) {\n\t\tmongoose.disconnect()\n\n\t\tif (err) {\n\t\t\tconsole.error('ERROR: ', err.stack)\n\t\t\treturn dfd.reject(err)\n\t\t}\n\n\t\tdfd.resolve()\n\t}\n\n\tmongoose.connect(secrets.db)\n\n\tmongoose.connection.on('connected', function() {\n\t\t// each owner in db\n\t\tGraph.distinct('owner', function(err, users) {\n\t\t\tif (err)\n\t\t\t\treturn done(err)\n\n\t\t\treturn when.map(users, function(username) {\n\t\t\t\tif (username === 'v')\n\t\t\t\t\treturn;\n\n\t\t\t\treturn processUser(username)\n\t\t\t})\n\t\t\t.then(function() {\n\t\t\t\tdone()\n\t\t\t})\n\t\t\t.catch(done)\n\t\t})\n\t})\n\n\tmongoose.connection.on('error', done)\n\n\treturn dfd.promise\n}\n\nif (require.main === module)\n\texports.execute()\n"
  },
  {
    "path": "tools/migration/0.11.0/run.js",
    "content": "const db = require('./0.11.0-userstats')\n\ndb.execute()\n.catch(function(err) {\n\tconsole.error('ERROR', err)\n\tprocess.exit(1)\n})"
  },
  {
    "path": "tools/migration/0.13.0/0.13.0-import-patches.js",
    "content": "var fs = require('fs')\nvar fsPath = require('path')\nvar secrets = require('../../../config/secrets')\nvar mongoose = require('mongoose')\nvar when = require('when')\nvar nodefn = require('when/node')\nvar _ = require('lodash')\nvar GridFsStorage = require('../../../lib/gridfs-storage');\nvar GraphAnalyser = require('../../../common/graphAnalyser').GraphAnalyser\n\nvar User = require('../../../models/user')\nvar Patch = require('../../../models/patch')\nvar assetHelper = require('../../../models/asset-helper')\n\nvar patchesRoot = fsPath.resolve(__dirname \n\t+ '/../../../browser/patches/') \n\t+ '/'\n\nvar gfs\nvar graphAnalyser\nvar importedPatches = 0\n\nfunction makePath(name) {\n\treturn '/vizor/patches/'\n\t\t+ assetHelper.slugify(\n\t\t\tfsPath.basename(name, fsPath.extname(name)))\n\t\t+ '.json'\n}\n\nfunction preparePatches() {\n\tvar dfd = when.defer()\n\tvar patches = []\n\tvar patchesObject = JSON.parse(fs.readFileSync(\n\t\tpatchesRoot + 'patches.json'))\n\tvar patchCategories = Object.keys(patchesObject)\n\n\t// each category\n\treturn when.map(patchCategories, function(cat) {\n\t\tvar patchTitles = Object.keys(patchesObject[cat])\n\t\t// each title in category\n\t\treturn when.map(patchTitles, function(patchTitle) {\n\t\t\t// analyse the patch\n\t\t\tvar patch = patchesObject[cat][patchTitle]\n\t\t\tvar patchGraph = JSON.parse(\n\t\t\t\tfs.readFileSync(patchesRoot + patch.name + '.json')\n\t\t\t)\n\n\t\t\tvar pg = patchGraph.root ? patchGraph.root : patchGraph\n\t\n\t\t\treturn graphAnalyser.parseAssets(pg)\n\t\t\t.then(function(stat) {\n\t\t\t\tvar patch = {\n\t\t\t\t\tcategory: cat,\n\t\t\t\t\tname: patchTitle,\n\t\t\t\t\ttype: stat.type,\n\t\t\t\t\tstat: stat,\n\t\t\t\t\tpath: makePath(patchesObject[cat][patchTitle].name),\n\t\t\t\t\tpatch: pg\n\t\t\t\t}\n\n\t\t\t\tpatches.push(patch)\n\t\t\t})\n\t\t})\n\t})\n\t.then(function() {\n\t\tconsole.log('  found', patches.length, 'patches')\n\t\treturn patches\n\t})\n}\n\nfunction writePatch(vizorUserId, patch) {\n\tvar dfd = when.defer()\n\tvar gridFsPath = patch.path\n\tvar that = this\n\n\tgfs.writeString(gridFsPath, JSON.stringify(patch.patch))\n\t.then(function() {\n\t\tvar url = gfs.url(gridFsPath)\n\n\t\tPatch.findOne({ path: patch.path })\n\t\t.exec(function(err, found) {\n\t\t\tif (err)\n\t\t\t\treturn dfd.reject(err)\n\n\t\t\tvar patchModelData = {\n\t\t\t\t_creator: vizorUserId,\n\t\t\t\tcategory: patch.category,\n\t\t\t\tname: patch.name,\n\t\t\t\tpath: patch.path,\n\t\t\t\ttype: patch.stat.type,\n\t\t\t\tstat: patch.stat,\n\t\t\t\turl: url\n\t\t\t}\n\n\t\t\tvar patchModel\n\n\t\t\tif (found)\n\t\t\t\tpatchModel = found\n\t\t\telse\n\t\t\t\tpatchModel = new Patch({})\n\n\t\t\t_.assign(patchModel, patchModelData)\n\n\t\t\tpatchModel.save(function(err) {\n\t\t\t\tif (err)\n\t\t\t\t\treturn dfd.reject(err)\n\n\t\t\t\timportedPatches++\n\n\t\t\t\treturn dfd.resolve()\n\t\t\t})\n\t\t})\n\t})\n\n\treturn dfd.promise\n}\n\n// migrate the graphs and patches in the db\nexports.execute = function() {\n\tvar dfd = when.defer()\n\n\tfunction done(err) {\n\t\tmongoose.disconnect()\n\t\tgfs.close()\n\n\t\tif (err) {\n\t\t\tconsole.error('ERROR: ', err.stack)\n\t\t\treturn dfd.reject(err)\n\t\t}\n\n\t\tdfd.resolve()\n\t}\n\n\tmongoose.connect(secrets.db)\n\n\tmongoose.connection.once('connected', function() {\n\t\tgfs = new GridFsStorage('/data')\n\t\tgfs.once('ready', function() {\n\t\t\tUser.findOne({ username: 'vizor' }, function(err, vizorUser) {\n\t\t\t\tif (err || !vizorUser)\n\t\t\t\t\treturn done(err)\n\n\t\t\t\tvar vizorUserId = vizorUser.id\n\n\t\t\t\tgraphAnalyser = new GraphAnalyser(gfs)\n\n\t\t\t\tpreparePatches()\n\t\t\t\t.then(function(patches) {\n\t\t\t\t\treturn when.map(patches, function(patch) {\n\t\t\t\t\t\treturn writePatch(vizorUserId, patch)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t.then(function() {\n\t\t\t\t\tconsole.log('  imported', importedPatches, 'patches')\n\t\t\t\t\tdone()\n\t\t\t\t})\n\t\t\t\t.catch(done)\n\t\t\t})\n\t\t})\n\t})\n\n\tmongoose.connection.on('error', done)\n\n\treturn dfd.promise\n}\n\nif (require.main === module)\n\texports.execute()\n"
  },
  {
    "path": "tools/migration/0.13.0/0.13.0-rename-collection.js",
    "content": "var fs = require('fs')\nvar fsPath = require('path')\nvar secrets = require('../../../config/secrets')\nvar mongoose = require('mongoose')\nvar when = require('when')\nvar nodefn = require('when/node')\nvar _ = require('lodash')\n\n// migrate the graphs and patches in the db\nexports.execute = function() {\n\tvar dfd = when.defer()\n\n\tfunction done(err) {\n\t\tmongoose.disconnect()\n\n\t\tif (err) {\n\t\t\tconsole.error('ERROR: ', err.stack)\n\t\t\treturn dfd.resolve()\n\t\t}\n\n\t\tdfd.resolve()\n\t}\n\n\tmongoose.connect(secrets.db)\n\n\tmongoose.connection.once('connected', function() {\n\t\tmongoose.connection.db\n\t\t\t.renameCollection('presets', 'patches', function(err) {\n\t\t\t\tdone(err)\n\t\t\t})\n\t})\n\n\tmongoose.connection.on('error', done)\n\n\treturn dfd.promise\n}\n\nif (require.main === module)\n\texports.execute()\n"
  },
  {
    "path": "tools/migration/0.13.0/0.13.0-sanitise-patches.js",
    "content": "var fs = require('fs')\nvar fsPath = require('path')\nvar secrets = require('../../../config/secrets')\nvar mongoose = require('mongoose')\nvar when = require('when')\nvar nodefn = require('when/node')\nvar _ = require('lodash')\nvar GridFsStorage = require('../../../lib/gridfs-storage');\nvar GraphAnalyser = require('../../../common/graphAnalyser').GraphAnalyser\n\nvar User = require('../../../models/user')\nvar Patch = require('../../../models/patch')\nvar assetHelper = require('../../../models/asset-helper')\n\nvar patchesRoot = fsPath.resolve(__dirname \n\t+ '/../../../browser/patches/') \n\t+ '/'\n\nvar gfs\nvar graphAnalyser\nvar fixedPatches = 0\n\nfunction makePath(username, patchName) {\n\treturn '/'+username+'/patches/'\n\t\t+ assetHelper.slugify(\n\t\t\tfsPath.basename(patchName, fsPath.extname(patchName)))\n\t\t+ '.json'\n}\n\nfunction sanitisePatch(patch) {\n\tvar dfd = when.defer()\n\n\tvar origPath = patch.path\n\tvar fixedPath = makePath(patch._creator.username, patch.path)\n\tvar relativeUrl = patch.url.substring(5)\n\n\tfunction doPatch(patchFile) {\n\t\tvar patchGraph = {}\n\n\t\ttry {\n\t\t\tpatchGraph = JSON.parse(patchFile)\n\t\t} catch(e) {}\n\n\t\tvar pg = patchGraph.root ? patchGraph.root : patchGraph\n\n\t\treturn graphAnalyser.parseAssets(pg)\n\t\t.then(function(stat) {\n\t\t\tpatch.type = stat.type\n\t\t\tpatch.stat = stat\n\t\t\tpatch.originalPath = patch.path\n\t\t\tpatch.originalUrl = patch.url\n\t\t\tpatch.path = makePath(patch._creator.username, patch.path)\n\t\t\tpatch.patch = pg\n\n\t\t\tif (['entity', 'entity_component'].indexOf(stat.type) > -1) {\n\t\t\t\tpg.nodes[0].plugin = stat.type\n\t\t\t}\n\n\t\t\treturn patch\n\t\t})\n\t}\n\n\tfunction readPatch(filename) {\n\t\treturn gfs.readString(filename)\n\t\t.catch(function(err) {\n\t\t\tconsole.log('READ ERROR', filename)\n\t\t\tconsole.error(err.stack)\n\t\t})\n\t\t.then(doPatch)\n\t}\n\n\treturn gfs.exists(fixedPath)\n\t.then(function(exists) {\n\t\tif (exists) {\n\t\t\treturn readPatch(fixedPath)\n\t\t} else {\n\t\t\treturn gfs.exists(relativeUrl)\n\t\t\t.then(function(exists) {\n\t\t\t\tif (exists)\n\t\t\t\t\treturn readPatch(relativeUrl)\n\n\t\t\t\tconsole.log('  not found', patch.path)\n\n\t\t\t\tvar edfd = when.defer() \n\t\t\t\tPatch.remove({ path: origPath }, function(err) {\n\t\t\t\t\tconsole.log('  deleted', origPath)\n\t\t\t\t\tif (err)\n\t\t\t\t\t\treturn dfd.reject(err)\n\t\t\t\t\tedfd.resolve()\n\t\t\t\t})\n\t\t\t\treturn edfd.promise\n\t\t\t})\n\t\t}\n\t})\n}\n\nfunction writePatch(patch) {\n\tvar dfd = when.defer()\n\tvar gridFsPath = patch.path\n\tvar that = this\n\tvar json = JSON.stringify(patch.patch)\n\n\tgfs.writeString(gridFsPath, json)\n\t.then(function() {\n\t\tvar url = gfs.url(gridFsPath)\n\n\t\tPatch.findOne({ _id: patch._id })\n\t\t.exec(function(err, patchModel) {\n\t\t\tif (err)\n\t\t\t\treturn dfd.reject(err)\n\n\t\t\tvar patchModelData = {\n\t\t\t\tcategory: patch.category,\n\t\t\t\tpath: patch.path,\n\t\t\t\ttype: patch.stat.type,\n\t\t\t\tstat: patch.stat,\n\t\t\t\turl: url\n\t\t\t}\n\n\t\t\t_.assign(patchModel, patchModelData)\n\n\t\t\tif (patch.originalPath !== patch.path) {\n\t\t\t\tgfs.unlink(patch.originalUrl.substring(5))\n\t\t\t\t.catch(function() {})\n\t\t\t}\n\n\t\t\tpatchModel.save(function(err) {\n\t\t\t\tif (err)\n\t\t\t\t\treturn dfd.reject(err)\n\n\t\t\t\tfixedPatches++\n\n\t\t\t\treturn dfd.resolve()\n\t\t\t})\n\t\t})\n\t})\n\n\treturn dfd.promise\n}\n\n// migrate the graphs and patches in the db\nexports.execute = function() {\n\tvar dfd = when.defer()\n\n\tfunction done(err) {\n\t\tmongoose.disconnect()\n\t\tgfs.close()\n\n\t\tif (err) {\n\t\t\tconsole.error('ERROR: ', err.stack)\n\t\t\treturn dfd.reject(err)\n\t\t}\n\n\t\tdfd.resolve()\n\t}\n\n\tmongoose.connect(secrets.db)\n\n\tmongoose.connection.once('connected', function() {\n\t\tgfs = new GridFsStorage('/data')\n\t\tgfs.once('ready', function() {\n\t\t\tPatch.find({})\n\t\t\t.populate('_creator')\n\t\t\t.exec(function(err, patches) {\n\t\t\t\tif (err || !patches)\n\t\t\t\t\treturn done(err)\n\n\t\t\t\tgraphAnalyser = new GraphAnalyser(gfs)\n\n\t\t\t\treturn when.map(patches, function(patch) {\n\t\t\t\t\treturn sanitisePatch(patch)\n\t\t\t\t\t.then(function(sanitised) {\n\t\t\t\t\t\tif (!sanitised)\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\tconsole.log('    did ', sanitised.path)\n\t\t\t\t\t\treturn writePatch(sanitised)\n\t\t\t\t\t})\n\t\t\t\t\t.catch(function(err) {\n\t\t\t\t\t\tconsole.error(err)\n\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t\t.then(function() {\n\t\t\t\t\tconsole.log('  did', fixedPatches, 'patches')\n\t\t\t\t\tdone()\n\t\t\t\t})\n\t\t\t\t.catch(done)\n\t\t\t})\n\t\t})\n\t})\n\n\tmongoose.connection.on('error', done)\n\n\treturn dfd.promise\n}\n\nif (require.main === module)\n\texports.execute()\n"
  },
  {
    "path": "tools/migration/0.13.0/run.js",
    "content": "const p1 = require('./0.13.0-rename-collection')\nconst p2 = require('./0.13.0-import-patches')\nconst p3 = require('./0.13.0-sanitise-patches')\n\nconsole.log('-- begin')\np1.execute()\n.catch(function(err) {\n\tconsole.error('ERROR', err)\n\tprocess.exit(1)\n})\n.then(function() {\n\tconsole.log('-- p1 complete')\n\treturn p2.execute()\n})\n.then(function() {\n\tconsole.log('-- p2 complete')\n\treturn p3.execute()\n})\n.then(function() {\n\tconsole.log('-- done')\n})\n.catch(function(err) {\n\tconsole.error('ERROR', err)\n\tprocess.exit(1)\n})\n"
  },
  {
    "path": "tools/migration/0.14.7/0.14.7-user-created-date.js",
    "content": "var secrets = require('../../../config/secrets')\nvar mongoose = require('mongoose')\nvar when = require('when')\nmongoose.Promise = global.Promise\n\nvar User = require('../../../models/user')\nvar Graph = require('../../../models/graph')\n\n// find the earliest graph for users that don't have a createdAt date\nexports.execute = function() {\n\tvar dfd = when.defer()\n\n\tfunction done(err) {\n\t\tmongoose.disconnect()\n\n\t\tif (err) {\n\t\t\tconsole.error('ERROR: ', err.stack)\n\t\t\treturn dfd.reject(err)\n\t\t}\n\n\t\tdfd.resolve()\n\t}\n\n\tmongoose.connect(secrets.db)\n\n\tmongoose.connection.on('connected', () => {\n\t\treturn User.find({ createdAt: null })\n\t\t.then(users => {\n\t\t\treturn when.map(users, user => {\n\t\t\t\treturn Graph.find({ owner: user.username })\n\t\t\t\t.sort('createdAt')\n\t\t\t\t.then(graphs => {\n\t\t\t\t\tif (!graphs.length) {\n\t\t\t\t\t\tuser.createdAt = Date.now()\n\t\t\t\t\t} else {\n\t\t\t\t\t\tuser.createdAt = graphs[0].createdAt\n\t\t\t\t\t}\n\n\t\t\t\t\tconsole.log('Updated user', user.username)\n\n\t\t\t\t\treturn User.update({ _id: user._id }, { $set: { createdAt: user.createdAt }})\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t\t.then(() => { done() })\n\t\t.catch(done)\n\t})\n\n\tmongoose.connection.on('error', done)\n\n\treturn dfd.promise\n}\n\nif (require.main === module)\n\texports.execute()\n"
  },
  {
    "path": "tools/migration/0.16/gridfs-to-cdn.js",
    "content": "const when = require('when')\nconst mongoose = require('mongoose')\nmongoose.Promise = global.Promise\nconst GridFsStorage = require('../../../lib/gridfs-storage')\nconst secrets = require('../../../config/secrets')\nconst Graph = require('../../../models/graph')\nconst _ = require('lodash')\nconst E2 = require('../../../browser/scripts/core').E2\nconst loadingPlugins = Object.keys(E2.LOADING_NODES)\nconst CloudStorage = require('../../../lib/cloudStorage')\nconst guard = require('when/guard')\n\nlet gfs, filesColl, cloudStorage\n\nconst done = (err) => {\n  console.log('Done - closing')\n\n  gfs.close()\n  mongoose.disconnect()\n\n  if (err) {\n    console.error('ERROR: ', err)\n    throw err\n  } else {\n    console.log('Done.')\n  }\n}\n\n// connect to GridFS and Google Cloud Storage\nconst connect = () => {\n  var dfd = when.defer()\n  mongoose.connect(secrets.db)\n  mongoose.connection.on('connected', () => {\n    gfs = new GridFsStorage('/data')\n  \tgfs.on('ready', () => {\n      gfs.db.collection('fs.files', (err, coll) => {\n        if (err) throw err\n        filesColl = coll\n      })\n\n      cloudStorage = new CloudStorage()\n      cloudStorage.on('ready', () => dfd.resolve())\n  \t})\n  })\n\n  return dfd.promise\n}\n\n// find assets contained in a graph\nconst findAssets = (subgraph, assets) => {\n\tif (!subgraph.nodes)\n\t\treturn\n\n  assets = assets || []\n\n\tsubgraph.nodes.map(function(node) {\n\t\tif (E2.GRAPH_NODES.indexOf(node.plugin) > -1)\n\t\t\treturn findAssets(node.graph, assets)\n\n\t\tif (loadingPlugins.indexOf(node.plugin) === -1)\n\t\t\treturn;\n\n\t\tassets.push(node.state.url)\n\t})\n\n\tassets = _.uniq(assets)\n  return assets\n}\n\n// go through all assets and move them to CDN\nconnect()\n.then(() => {\n  const dfd = when.defer()\n\n  filesColl.find().toArray((err, files) => {\n    if (err)\n      return dfd.reject(err)\n\n    when.map(files, guard(guard.n(50), asset => {\n      let assetPath = asset.filename\n\n      if (assetPath.indexOf('/data') === 0)\n        return when.resolve()\n\n      return cloudStorage.exists(assetPath).then(exists => {\n        if (exists) {\n          // console.log('  - Already exists', assetPath)\n          return\n        }\n\n        return gfs.stat(assetPath).then(stat => {\n          return cloudStorage.retry(() => {\n            return cloudStorage.writeStream(gfs.read(assetPath), assetPath, stat)\n          })\n        })\n      })\n    }))\n    .then(() => {\n      done()\n    })\n    .catch(err => { return dfd.reject(err) })\n  })\n\n  return dfd.promise\n})\n.catch(done)\n"
  },
  {
    "path": "tools/migration/0.6.0/0.6.0-slotname-db.js",
    "content": "var fsPath = require('path')\nvar secrets = require('../../../config/secrets')\nvar mongoose = require('mongoose')\nvar when = require('when')\nvar Graph = require('../../../models/graph')\nvar Preset = require('../../../models/preset')\n\nvar migrateGraph = require('./migrate').migrateGraph\n\nvar GridFsStorage = require('../../../lib/gridfs-storage')\nvar gfs = new GridFsStorage('/data')\n\nfunction processGraphs(graphs) {\n\tvar totalGraphs = graphs.length \n\n\treturn when.map(graphs, function(gm) {\n\t\tvar gfsPath = gm.url.replace(/^\\/data/, '')\n\t\tvar basename = fsPath.basename(gfsPath)\n\n\t\tconsole.log('  - ', basename)\n\n\t\treturn gfs.readString(gfsPath)\n\t\t.then(function(graphString) {\n\t\t\tvar graph = JSON.parse(graphString)\n\n\t\t\tif (!graph.root) {\n\t\t\t\tconsole.error('no root?', graph)\n\t\t\t\treturn new('No root in '+gfsPath)\n\t\t\t}\n\n\t\t\tgraph.root = migrateGraph(graph)\n\n\t\t\tconsole.log('  - OK', basename)\n\t\t\tconsole.log('  - graphs left', --totalGraphs)\n\n\t\t\treturn gfs.writeString(gfsPath,\n\t\t\t\tJSON.stringify(graph))\n\t\t})\n\t\t.catch(function(err) {\n\t\t\tconsole.log('  ! NOT FOUND', basename)\n\t\t})\n\t})\n}\n\n// migrate the graphs and presets in the db\nexports.execute = function() {\n\tvar dfd = when.defer()\n\n\tfunction done(err) {\n\t\tmongoose.disconnect()\n\t\tgfs.close()\n\n\t\tif (err) {\n\t\t\tconsole.error('ERROR: ', err.stack)\n\t\t\treturn dfd.reject(err)\n\t\t}\n\n\t\tdfd.resolve()\n\t}\n\n\tmongoose.connect(secrets.db)\n\n\tmongoose.connection.on('connected', function() {\n\t\t// do graphs in db\n\t\tGraph.find({}, function(err, graphs) {\n\t\t\tif (err)\n\t\t\t\treturn done(err)\n\n\t\t\treturn processGraphs(graphs)\n\t\t\t.then(function() {\n\t\t\t\tconsole.log('Processing presets')\n\n\t\t\t\t// do presets in db\n\t\t\t\tPreset.find({}, function(err, presets) {\n\t\t\t\t\treturn processGraphs(presets)\n\t\t\t\t\t.then(function() { done() })\n\t\t\t\t\t.catch(done)\n\t\t\t\t})\n\t\t\t})\n\t\t\t.catch(done)\n\t\t})\n\t})\n\n\tmongoose.connection.on('error', done)\n\n\treturn dfd.promise\n}\n\nif (require.main === module)\n\texports.execute()\n"
  },
  {
    "path": "tools/migration/0.6.0/0.6.0-slotname-presets.js",
    "content": "var fs = require('fs')\n\nvar migrateGraphFile = require('./migrate').migrateGraphFile\n\nvar presetsPath = __dirname+'/../../../browser/presets/'\nvar presets = JSON.parse(fs.readFileSync(\n\tpresetsPath + 'presets.json'))\n\nvar when = require('when')\n\nexports.execute = function() {\n\tvar dfd = when.defer()\n\n\t// first presets\n\tObject.keys(presets).map(function(category) {\n\t\tObject.keys(presets[category]).map(function(title) {\n\t\t\tvar pdef = presets[category][title]\n\t\t\tvar ppath =  presetsPath + pdef.name+'.json'\n\n\t\t\tmigrateGraphFile(ppath)\n\t\t})\n\t})\n\n\t// then defaults & templates\n\tvar defaultGraphsPath = __dirname+'/../../../browser/data/graphs'\n\tfs.readdirSync(defaultGraphsPath).map(function(fn) {\n\t\tif (fn[0] === '.')\n\t\t\treturn;\n\n\t\tmigrateGraphFile(defaultGraphsPath+'/'+fn)\n\t})\n\n\t// then defaults & templates\n\tvar defaultGraphsPath = __dirname+'/../../../browser/test/fixtures'\n\tfs.readdirSync(defaultGraphsPath).map(function(fn) {\n\t\tif (fn[0] === '.')\n\t\t\treturn;\n\n\t\tmigrateGraphFile(defaultGraphsPath+'/'+fn)\n\t})\n\n\tdfd.resolve()\n\n\treturn dfd.promise\n}\n\nif (require.main === module)\n\texports.execute()\n"
  },
  {
    "path": "tools/migration/0.6.0/migrate.js",
    "content": "/**\n * migration tools to use slot names instead of indices\n * in connections\n * \n * this is a lib, the actual migration script is run.js\n */\n\nvar fs = require('fs')\n\nvar parsePluginSlots = require(__dirname+'/../../../lib/parsePluginSlots')\n\nvar slotMap = parsePluginSlots()\n\nfunction migrateGraphFile(filename) {\n\tvar presetSource = fs.readFileSync(filename)\n\tvar preset = JSON.parse(presetSource)\n\n\tpreset.root = migrateGraph(preset)\n\n\tfs.writeFileSync(filename, JSON.stringify(preset))\n}\n\nfunction migrateGraph(graph) {\n\treturn migrateGraphToUseSlotNames(slotMap, graph.root)\n}\n\nfunction isGraphPlugin(pluginId) {\n\treturn (['graph', 'loop', 'array_function'].indexOf(pluginId) > -1)\n}\n\nfunction getSlotName(slotNameMap, pluginId, slotType, index) {\n\tvar pluginSlots = slotNameMap[pluginId + '.' + slotType]\n\n\t// this can happen for very old pre-THREE plugins\n\tif (!pluginSlots)\n\t\treturn index\n\n\treturn pluginSlots[index]\n}\n\nfunction migrateGraphToUseSlotNames(slotNameMap, graph) {\n\tvar localUidToPluginId = {}\n\n\tgraph.nodes.map(function(node) {\n\t\tlocalUidToPluginId[node.uid] = node.plugin\n\n\t\tif (isGraphPlugin(node.plugin))\n\t\t\tnode.graph = migrateGraphToUseSlotNames(slotNameMap, node.graph)\n\t\telse\n\t\t\treturn\n\t})\n\n\tgraph.conns.map(function(conn) {\n\t\tvar srcPluginId = localUidToPluginId[conn.src_nuid]\n\t\tvar dstPluginId = localUidToPluginId[conn.dst_nuid]\n\n\t\tvar srcSlotUid = conn.src_slot\n\n\t\tif (!conn.src_dyn && typeof(conn.src_slot) === 'number')\n\t\t\tsrcSlotUid = getSlotName(slotNameMap, \n\t\t\t\tsrcPluginId, 1, conn.src_slot)\n\n\t\tvar dstSlotUid = conn.dst_slot\n\t\t\n\t\tif (!conn.dst_dyn && typeof(conn.dst_slot) === 'number')\n\t\t\tdstSlotUid = getSlotName(slotNameMap, \n\t\t\t\tdstPluginId, 0, conn.dst_slot)\n\n\t\tconn.src_slot = srcSlotUid\n\t\tconn.dst_slot = dstSlotUid\n\t})\n\n\treturn graph\n}\n\nexports.migrateGraphToUseSlotNames = migrateGraphToUseSlotNames\nexports.migrateGraphFile = migrateGraphFile\nexports.migrateGraph = migrateGraph\n"
  },
  {
    "path": "tools/migration/0.6.0/run.js",
    "content": "const db = require('./0.6.0-slotname-db')\n\ndb.execute()\n.catch(function(err) {\n\tconsole.error('ERROR', err)\n\tprocess.exit(1)\n})"
  },
  {
    "path": "tools/migration/0.7.0/0.7.0-redis.js",
    "content": "var fsPath = require('path')\nvar secrets = require('../../../config/secrets')\nvar r = require('rethinkdb')\nvar redis = require('redis')\nvar mongoose = require('mongoose')\nvar when = require('when')\nvar SerialNumber = require('../../../lib/serialNumber')\n\nvar mongoDb, mongoColl, rethinkConnection\nvar redisClient\nvar sn\n\nfunction connect() {\n\tvar dfd = when.defer()\n\n\tmongoose.connect(secrets.db)\n\n\tmongoose.connection.on('connected', function() {\n\t\tmongoDb = mongoose.connection.db\n\t\tmongoDb.collection('counters', function(err, coll) {\n\t\t\tif (err) return dfd.reject(err)\n\t\t\tmongoColl = coll\n\n\t\t\tr.connect({\n\t\t\t\thost: process.env.RETHINKDB_HOST || 'localhost',\n\t\t\t\tport: 28015,\n\t\t\t\tdb: 'vizor'\n\t\t\t}, function(err, conn) {\n\t\t\t\tif (err)\n\t\t\t\t\tdfd.reject(err)\n\n\t\t\t\trethinkConnection = conn\n\t\t\n\t\t\t\tredisClient = redis.createClient({\n\t\t\t\t\thost: process.env.REDIS || 'localhost'\n\t\t\t\t})\n\n\t\t\t\tredisClient.on('connect', function() {\n\t\t\t\t\tsn = new SerialNumber(redisClient)\n\t\t\t\t\tdfd.resolve()\n\t\t\t\t})\n\t\t\t})\n\t\t})\n\t})\n\n\treturn dfd.promise\n}\n\nfunction migrateSerials() {\n\tvar dfd = when.defer()\n\tmongoColl.find({}, function(err, counters) {\n\t\tcounters.each(function(err, counter) {\n\t\t\tif (err) return dfd.reject(err)\n\t\t\tif (!counter) return dfd.resolve()\n\t\t\tconsole.log('   Set', counter._id, 'to', counter.seq)\n\t\t\tsn.set(counter._id, counter.seq)\n\t\t})\n\t})\n\treturn dfd.promise\n}\n\nexports.execute = function() {\n\tvar total\n\tvar dfd = when.defer()\n\n\tfunction done(err) {\n\t\tmongoose.connection.close()\n\t\trethinkConnection.close()\n\t\tredisClient.end()\n\n\t\tconsole.log('All done')\n\n\t\tif (err) {\n\t\t\tconsole.error('ERROR: ', err.stack)\n\t\t\treturn dfd.reject(err)\n\t\t}\n\n\t\tdfd.resolve()\n\t}\n\n\tconnect()\n\t.then(function() {\n\t\tconsole.log('Migrating serials')\n\t\treturn migrateSerials()\n\t})\n\t.then(function() {\n\t\tconsole.log('Indexing')\n\t\treturn r.table('editlog')\n\t\t.indexCreate('name')\n\t\t.run(rethinkConnection)\n\t\t.error(function() {})\n\t})\n\t.then(function() {\n\t\treturn r.table('editlog')\n\t\t.indexWait('name')\n\t\t.run(rethinkConnection)\n\t})\n\t.then(function() {\n\t\tconsole.log('Counting')\n\t\treturn r.table('editlog').count()\n\t\t.run(rethinkConnection)\n\t})\n\t.then(function(t) {\n\t\ttotal = t\n\n\t\treturn r.table('editlog')\n\t\t.orderBy({ index: 'name' })\n\t\t.run(rethinkConnection)\n\t})\n\t.then(function(cursor) {\n\t\tvar i=0\n\n\t\treturn cursor.eachAsync(function(row) {\n\t\t\tvar idfd = when.defer()\n\t\t\tsn.next(row.name)\n\t\t\t.then(function(serial) {\n\t\t\t\tif (++i % 1000 === 0) {\n\t\t\t\t\tconsole.log('    ', i, 'of', total, '-',\n\t\t\t\t\t\tMath.round((i/total) * 100) + '%')\n\t\t\t\t}\n\n\t\t\t\tvar payload = {\n\t\t\t\t\tid: serial,\n\t\t\t\t\tfrom: row.from,\n\t\t\t\t\tdate: row.date,\n\t\t\t\t\tlog: row.log\n\t\t\t\t}\n\n\t\t\t\tredisClient.zadd(row.name, serial, JSON.stringify(payload), function(err) {\n\t\t\t\t\tif (err) return idfd.reject(err)\n\t\t\t\t\tidfd.resolve()\n\t\t\t\t})\n\t\t\t})\n\n\t\t\treturn idfd.promise\n\t\t})\n\t})\n\t.then(function() {\n\t\tdone()\n\t})\n\t.catch(done)\n\n\treturn dfd.promise\n}\n\nif (require.main === module)\n\texports.execute()\n"
  },
  {
    "path": "tools/optimize-plugin",
    "content": "#!/usr/bin/env node\nvar uglify = require('uglify-js2');\nvar fs = require('fs');\nvar util = require('util');\n\nif(process.argv.length < 3)\n{\n\tconsole.log('Usage: optimize-plugin <input.plugin.js>');\n\treturn;\n}\n\nvar code = fs.readFileSync(process.argv[2], 'utf8');\nvar ast = uglify.parse(code);\n\n// Remove methods.\nvar toplevel = ast.body;\nvar pending = [];\n\nfor(var i = 1; i < toplevel.length; i++)\n{\n\tvar func = toplevel[i];\n\tvar id = func.body.left.property;\n\n\tif(id === 'create_ui' || id === 'open_editor' || id === 'connection_changed')\n\t\tpending.push(func);\n}\n\nfor(var i = 0; i < pending.length; i++)\n\ttoplevel.splice(toplevel.indexOf(pending[i]), 1)\n\nvar init = toplevel[0].body.right.right.body;\nvar desc = null;\n\nfunction remove_prop(item, id)\n{\n\tvar props = item.properties;\n\t\n\tfor(var c = 0; c < props.length; c++)\n\t{\n\t\tif(props[c].key === id)\n\t\t{\n\t\t\tprops.splice(c, 1);\n\t\t\treturn;\n\t\t}\n\t}\n}\n\nfor(var i = 0; i < init.length; i++)\n{\n\t// Deal with local variable declarations in the initialization function scope.\n\tif(!init[i].body)\n\t\tcontinue;\n\n\t// Deal with empty input / output slot collections.\n\tif(!init[i].body.left)\n\t\tcontinue;\n\t\n\tvar id = init[i].body.left.property;\n\t\n\tif(id === 'desc')\n\t\tdesc = init[i];\n\telse if(id === 'input_slots' || id === 'output_slots')\n\t{\n\t\tvar items = init[i].body.right.elements;\n\t\t\n\t\tfor(var i2 = 0; i2 < items.length; i2++)\n\t\t{\n\t\t\tvar item = items[i2];\n\t\t\t\n\t\t\tremove_prop(item, 'name');\n\t\t\tremove_prop(item, 'desc');\n\t\t\tremove_prop(item, 'def');\n\t\t\tremove_prop(item, 'lo');\n\t\t\tremove_prop(item, 'hi');\n\t\t}\n\t}\n}\n\nif(desc)\n\tinit.splice(init.indexOf(desc), 1);\n\nast.figure_out_scope();\n\nvar compressor = uglify.Compressor({ 'dead_code': false, 'unused': false });\n//var comp_ast = ast.transform(compressor);\n\nconsole.log(ast.print_to_string({ beautify: true }));\n"
  },
  {
    "path": "tools/optimize-scene",
    "content": "#!/usr/bin/env python\nimport os\nimport sys\nimport simplejson\n\nif len(sys.argv) < 2:\n\tsys.exit('Usage: optimize-scene <JSON>')\n\nabs_path = os.path.abspath(sys.argv[1])\nbase_path = os.path.dirname(abs_path)\njson = None\n\ndef process_png(png):\n\tfilename = png + '.png'\n\tpath = os.path.join(base_path, filename)\n\t\n\tos.system('pngcrush -rem gAMA -rem cHRM -rem iCCP -rem sRGB -rem alla -rem iTXt -rem sTER -rem hIST -rem zTXt -rem bKGD -rem tRNS -rem tIME -e \".pngo\" ' + path)\n\tos.system('mv ' + path + 'o ' + path)\n\ndef process_map(m):\n\tif not m:\n\t\treturn\n\t\n\tif m['url'] and m['url'][-4:].lower() == '.png':\n\t\tprocess_png(m['url'][:-4])\n\ndef process_stream(stream):\n\tif not stream:\n\t\treturn\n\t\n\tprocess_png(stream)\t\n\ndef process_scene(scene):\n\tmeshes = scene['meshes']\n\t\n\tfor m in meshes:\n\t\tmesh = meshes[m]\n\t\tbatches = mesh['batches']\n\t\t\n\t\tfor b in batches:\n\t\t\tprocess_stream(b.get('vertices'))\n\t\t\tprocess_stream(b.get('normals'))\n\t\t\tprocess_stream(b.get('uv0'))\n\t\n\tmaterials = scene['materials']\n\t\n\tfor m in materials:\n\t\tmaterial = materials[m]\n\t\t\n\t\tprocess_map(material.get('diffuse_color_map'));\n\t\tprocess_map(material.get('emission_intensity_map'));\n\t\tprocess_map(material.get('specular_intensity_map'));\n\t\tprocess_map(material.get('specular_color_map'));\n\t\tprocess_map(material.get('emission_color_map'));\n\t\tprocess_map(material.get('normal_map'));\n\t\nf = open(abs_path, 'r')\njson = simplejson.load(f)\nf.close()\n\nprocess_scene(json)\n"
  },
  {
    "path": "tools/player.html",
    "content": "﻿<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\t<head id=\"head\">\n\t\t<title>ENGI&#8482; Player Demo</title>\n\t\t<script type=\"text/javascript\" src=\"node_modules/jquery/dist/jquery.min.js\"></script>\n\t\t<script type=\"text/javascript\" src=\"vendor/jquery.fastfix.js\"></script>\n\t\t<script type=\"text/javascript\" src=\"vendor/jquery.mousewheel.js\"></script>\n\t\t<script type=\"text/javascript\" src=\"vendor/gl-matrix.js\"></script>\n\t\t<script type=\"text/javascript\" src=\"scripts/util.js\"></script>\n\t\t<script type=\"text/javascript\" src=\"scripts/renderer.js\"></script>\n\t\t<script type=\"text/javascript\" src=\"scripts/plugin-group.js\"></script>\n\t\t<script type=\"text/javascript\" src=\"scripts/plugin-manager.js\"></script>\n\t\t<script type=\"text/javascript\" src=\"scripts/connection.js\"></script>\n\t\t<script type=\"text/javascript\" src=\"scripts/graph.js\"></script>\n\t\t<script type=\"text/javascript\" src=\"scripts/node.js\"></script>\n\t\t<script type=\"text/javascript\" src=\"scripts/registers.js\"></script>\n\t\t<script type=\"text/javascript\" src=\"scripts/core.js\"></script>\n\t\t<script type=\"text/javascript\" src=\"scripts/player.js\"></script>\n\t\t<style type=\"text/css\">\n\t\t\t.webgl-canvas-normal\n\t\t\t{\n\t\t\t\tposition: absolute; \n\t\t\t\ttop: 10px;\n\t\t\t\tleft: 10px;\n\t\t\t\twidth: 720px;\n\t\t\t\theight: 405px;\n\t\t\t\tbackground-color: #000; \n\t\t\t\tz-index: -1;\n\t\t\t}\n\n\t\t\t.webgl-canvas-fs\n\t\t\t{\n\t\t\t\tbackground-color: #000; \n\t\t\t\tposition: absolute; \n\t\t\t\tleft: 0px; \n\t\t\t\ttop: 0px;\n\t\t\t\twidth: 100%;\n\t\t\t\theight: 100%;\n\t\t\t\tz-index: 10000;\n\t\t\t}\n\t\t\t\n\t\t\t.oculus\n\t\t\t{\n\t\t\t\twidth: 33px;\n\t\t\t\theight: 20px;\n\t\t\t\tposition: absolute;\n\t\t\t\tleft: 695px;\n\t\t\t\ttop: 393px;\n\t\t\t\tz-index: 2;\n\t\t\t}\n\t\t</style>\n\t\t<script type=\"text/javascript\">\n\t\t\tfunction AddEvents(player)\n\t\t\t{\n\t\t\t\t$('#fs').click(function()\n\t\t\t\t{\n\t\t\t\t\tplayer.core.renderer.set_fullscreen(true);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tfunction LoadScene(player)\n\t\t\t{\n\t\t\t\tAddEvents(player);\n\t\t\t\tplayer.load_from_url('scene.json');\n\t\t\t\tplayer.play();\n\t\t\t}\n\n\t\t\tfunction EnumerateVRDevices(devices)\n\t\t\t{\n\t\t\t\tvar hmd = null, sensor = null;\n\t\t\t\t\n\t\t\t\tfor(var i = 0; i < devices.length; i++)\n\t\t\t\t{\n\t\t\t\t\tif(devices[i] instanceof HMDVRDevice)\n\t\t\t\t\t{\n\t\t\t\t\t\t// Just use the first device we find for now.\n\t\t\t\t\t\thmd = devices[i];\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif(hmd)\n\t\t\t\t{\n\t\t\t\t\tfor(var i = 0; i < devices.length; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tvar d = devices[i];\n\t\t\t\t\t\n\t\t\t\t\t\tif(d instanceof PositionSensorVRDevice && d.hardwareUnitId === hmd.hardwareUnitId)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsensor = devices[i];\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tplayer = CreatePlayer([hmd, sensor], LoadScene);\n\t\t\t}\n\t\t\t\n\t\t\t$(document).ready(function()\n\t\t\t{\n\t\t\t\tif(navigator.getVRDisplays)\n\t\t\t\t{\n\t\t\t\t\tnavigator.getVRDisplays().then(EnumerateVRDevices);\n\t\t\t\t}\n\t\t\t\telse if(navigator.getVRDevices)\n\t\t\t\t{\n\t\t\t\t\tnavigator.getVRDevices().then(EnumerateVRDevices);\n\t\t\t\t}\n\t\t\t\telse if(navigator.mozGetVRDevices)\n\t\t\t\t{\n\t\t\t\t\tnavigator.mozGetVRDevices(EnumerateVRDevices);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tplayer = CreatePlayer([null, null], LoadScene);\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t</script>\n\t</head>\n\t<body>\n\t\t<noscript>\n\t\t\t<div class=\"centered notification\">\n\t\t\t\t<div style=\"float: left; display: table-cell; margin-right: 8px;\"><img src=\"images/warning.png\" width=\"64px\" height=\"64px\" /></div>\n\t\t\t\t<div>This page requires javascript in order to display properly. If you're running a script blocker - such as NoScript - please whitelist this page. If you have disabled javascript in your browser, please enable it and reload (F5).</div>\n\t\t\t</div>\n\t\t</noscript>\n\t\t<div id=\"main_layout\" class=\"centered\">\n\t\t\t<canvas id=\"webgl-canvas\" class=\"webgl-canvas-normal\" width=\"720\" height=\"405\" oncontextmenu=\"return false;\">\n\t\t\t</canvas>\n\t\t\t<img id=\"fs\" src=\"images/oculus.png\" class=\"oculus\" title=\"Click to go fullscreen and enable oculus rendering.\" />\n\t\t</div>\n\t</body>\n</html>\n"
  },
  {
    "path": "tools/publish-seq",
    "content": "var fs = require('fs');\nvar path = require('path')\nvar util = require('util');\nvar uglify = require('uglify-js2');\n\nif(process.argv.length < 4)\n{\n\tconsole.log('Usage: publish-seq <JSON> <Asset dir>');\n\treturn;\n}\n\n// Set of plugins that may contain references to external dependencies.\nvar url_plugins = [\n\t'url_audio_buffer_generator',\n\t'url_audio_generator',\n\t'url_json_generator',\n\t'url_scene_generator',\n\t'url_texture_generator',\n\t'url_video_generator'\n];\n\n// Set of plugins that can be removed without compromising graph functionality.\nvar filtered_plugins = [\n\t'annotation',\n\t'bool_display',\n\t'color_display',\n\t'data_info_display',\n\t'float_display',\n\t'led_display',\n\t'log_display',\n\t'matrix_display',\n\t'object_display',\n\t'plot_display',\n\t'text_display',\n\t'vector_display'\n];\n\n// Set of plugins the title of which has a functional purpose and must thus be retained.\nvar maintain_title = [\n\t'register_global_read',\n\t'register_global_write',\n\t'register_local_read',\n\t'register_local_write'\n];\n\nvar ext_plugin_dependencies = {\n\t'module_player': 'module_player',\n\t'csg_cube_generator': 'csg',\n\t'csg_cylinder_generator': 'csg',\n\t'csg_sphere_generator': 'csg',\n\t'csg_difference_modulator': 'csg',\n\t'csg_intersection_modulator': 'csg',\n\t'csg_inverse_modulator': 'csg',\n\t'csg_to_mesh_modulator': 'csg',\n\t'csg_union_modulator': 'csg',\n\t'osc_float': 'osc',\n\t'osc_receiver': 'osc',\n\t'osc_xy_float': 'osc',\n\t'wschannel_send': 'wschannel',\n\t'wschannel_receive': 'wschannel'\n};\n\nvar unique_plugins = [];\nvar ext_depends = [];\n\nfunction minifyBuffer(code)\n{\n\tvar ast = uglify.parse(code);\n\t\n\tast.figure_out_scope();\n\t\n\tvar compressor = uglify.Compressor({ 'dead_code': false, 'unused': false });\n\tvar comp_ast = ast.transform(compressor);\n\t\n\treturn comp_ast.print_to_string();\n}\n\nfunction minify(src, dst)\n{\n\tfs.writeFileSync(dst, minifyBuffer(fs.readFileSync(src, { encoding: 'utf8' })));\n}\n\nfunction mkdirsSync(p)\n{\n\tvar dirs = p.split(path.sep);\n\tvar root = '';\n\n\twhile(dirs.length > 0)\n\t{\n\t\tvar dir = dirs.shift();\n\t\t\n\t\tif (dir === '')\n\t\t\troot = path.sep;\n\t\t\n\t\tvar nxt = root + dir;\n\t\t\n\t\tif(!fs.existsSync(nxt))\n\t\t\tfs.mkdirSync(nxt);\n\t\t\n\t\troot += dir + path.sep;\n\t}\n}\n\nfunction rmdirsSync(p)\n{\n    if(fs.existsSync(p))\n    {\n        fs.readdirSync(p).forEach(function(file, index)\n        {\n\t\tvar cp = path.join(p, file);\n\n\t\tif(fs.lstatSync(cp).isDirectory())\n\t\t\trmdirsSync(cp);\n\t\telse\n\t\t\tfs.unlinkSync(cp);\n        });\n        \n        fs.rmdirSync(p);\n    }\n};\n\nfunction copy(src, dst)\n{\n\tfs.createReadStream(src).pipe(fs.createWriteStream(dst));\n}\n\nfunction minify_json(file)\n{\n\tvar json = JSON.parse(fs.readFileSync(file, 'utf8'));\n\t\n\tfs.writeFileSync(file, JSON.stringify(json));\n}\n\nfunction copy_file(src, data_dir, pub_dir)\n{\n\tvar a_src = path.join(data_dir, src);\n\tvar dst_name = path.join(pub_dir, src);\n\tvar dst_dir = path.dirname(dst_name);\n\t\n\tmkdirsSync(dst_dir);\n\tcopy(a_src, dst_name);\n}\n\nfunction copy_legacy_audio(src, data_dir, pub_dir)\n{\n\tvar dst_dir = path.dirname(path.join(pub_dir, src));\n\t\n\tmkdirsSync(dst_dir);\n\n\tif(fs.existsSync(path.join(data_dir, src) + '.ogg'))\n\t\tcopy(path.join(data_dir, src) + '.ogg', path.join(pub_dir, src) + '.ogg');\n\n\tif(fs.existsSync(path.join(data_dir, src) + '.mp3'))\n\t\tcopy(path.join(data_dir, src) + '.mp3', path.join(pub_dir, src) + '.mp3');\n}\n\nfunction copy_scene(src, data_dir, pub_dir)\n{\n\tvar a_src = path.join(data_dir, src);\n\tvar dst_name = path.join(pub_dir, src);\n\tvar dst_dir = path.dirname(dst_name);\n\t\n\tmkdirsSync(dst_dir);\n\t\n\tvar sp = path.dirname(a_src);\n\t\n        fs.readdirSync(sp).forEach(function(file, index)\n        {\n\t\tvar cp = path.join(sp, file);\n\n\t\tif(!fs.lstatSync(cp).isDirectory())\n\t\t\tcopy(cp, path.join(dst_dir, file));\n        });\n}\n\nfunction process_graph(graph, data_dir, pub_dir)\n{\n\tvar nodes = graph.nodes;\n\t\n\tfor(var i = 0, len = nodes.length; i < len; i++)\n\t{\n\t\tvar node = nodes[i];\n\t\t\n\t\tif(node.plugin === 'graph' || node.plugin === 'loop')\n\t\t\tprocess_graph(node.graph, data_dir, pub_dir);\n\t\telse if(url_plugins.indexOf(node.plugin) !== -1 && node.state.url !== '')\n\t\t{\n\t\t\tif(node.plugin === 'url_scene_generator')\n\t\t\t\tcopy_scene(node.state.url, data_dir, pub_dir);\n\t\t\telse if(node.plugin === 'url_audio_generator')\n\t\t\t\tcopy_legacy_audio(node.state.url, data_dir, pub_dir);\n\t\t\telse\n\t\t\t\tcopy_file(node.state.url, data_dir, pub_dir);\n\t\t}\n\t}\n}\n\nfunction prune_dynamic_slots(d_slots)\n{\n\tfor(var i = 0, len = d_slots.length; i < len; i++)\n\t{\n\t\tvar slot = d_slots[i];\n\t\t\n\t\tdelete slot.name;\n\t\tdelete slot.desc;\n\t\tdelete slot.index;\n\t\tdelete slot.type;\n\t\tdelete slot.connected;\n\t\tdelete slot.is_connected;\n\t\tdelete slot.def;\n\t}\n}\n\nfunction removeItem(coll, item)\n{\n\tvar idx = coll.indexOf(item);\n\tif(idx > -1)\n\t\tcoll.splice(idx, 1);\n}\n\nfunction delete_node(graph, node)\n{\n\tvar conns = graph.conns;\n\tvar pruned = [];\n\tvar nuid = node.uid;\n\n\tremoveItem(graph.nodes, node);\n\t\n\tfor(var i = 0, len = conns.length; i < len; i++)\n\t{\n\t\tvar c = conns[i];\n\t\t\n\t\tif(c.src_nuid === nuid || c.dst_nuid === nuid)\n\t\t\tpruned.push(c);\n\t}\n\t\n\tfor(var i = 0, len = pruned.length; i < len; i++)\n\t\tremoveItem(conns, pruned[i]);\n}\n\nfunction optimize_plugin(code)\n{\n\tvar ast = uglify.parse(code);\n\tvar toplevel = ast.body;\n\tvar pending = [];\n\n\tfor(var i = 1; i < toplevel.length; i++)\n\t{\n\t\tvar func = toplevel[i];\n\t\tvar id = func.body.left.property;\n\n\t\tif(id === 'create_ui' || id === 'open_editor' || id === 'connection_changed')\n\t\t\tpending.push(func);\n\t}\n\n\tfor(var i = 0; i < pending.length; i++)\n\t\ttoplevel.splice(toplevel.indexOf(pending[i]), 1)\n\n\tvar init = toplevel[0].body.right.right.body;\n\tvar desc = null;\n\n\tfunction remove_prop(item, id)\n\t{\n\t\tvar props = item.properties;\n\t\n\t\tfor(var c = 0; c < props.length; c++)\n\t\t{\n\t\t\tif(props[c].key === id)\n\t\t\t{\n\t\t\t\tprops.splice(c, 1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\n\tfor(var i = 0; i < init.length; i++)\n\t{\n\t\t// Deal with local variable declarations in the initialization function scope.\n\t\tif(!init[i].body)\n\t\t\tcontinue;\n\n\t\t// Deal with empty input / output slot collections.\n\t\tif(!init[i].body.left)\n\t\t\tcontinue;\n\t\n\t\tvar id = init[i].body.left.property;\n\t\n\t\tif(id === 'desc')\n\t\t\tdesc = init[i];\n\t\telse if(id === 'input_slots' || id === 'output_slots')\n\t\t{\n\t\t\tvar items = init[i].body.right.elements;\n\t\t\n\t\t\tfor(var i2 = 0; i2 < items.length; i2++)\n\t\t\t{\n\t\t\t\tvar item = items[i2];\n\t\t\t\n\t\t\t\tremove_prop(item, 'name');\n\t\t\t\tremove_prop(item, 'desc');\n\t\t\t\tremove_prop(item, 'def');\n\t\t\t\tremove_prop(item, 'lo');\n\t\t\t\tremove_prop(item, 'hi');\n\t\t\t}\n\t\t}\n\t}\n\n\tif(desc)\n\t\tinit.splice(init.indexOf(desc), 1);\n\n\tast.figure_out_scope();\n\t\n\tvar compressor = uglify.Compressor({ 'dead_code': false, 'unused': false });\n\tvar comp_ast = ast.transform(compressor);\n\t\n\treturn comp_ast.print_to_string();\n}\n\nfunction optimize_graph(graph)\n{\n\tvar nodes = graph.nodes;\n\tvar pruned = [];\n\t\n\tdelete graph.open;\n\tdelete graph.scroll;\n\t\n\tfor(var i = 0, len = nodes.length; i < len; i++)\n\t{\n\t\tvar node = nodes[i];\n\t\t\n\t\tif(node.plugin === 'graph' || node.plugin === 'loop')\n\t\t\toptimize_graph(node.graph);\n\t\telse if(filtered_plugins.indexOf(node.plugin) > -1)\n\t\t\tpruned.push(node);\n\t\t\n\t\tdelete node.x;\n\t\tdelete node.y;\n\n\t\tif(maintain_title.indexOf(node.plugin) === -1)\n\t\t\tdelete node.title;\n\n\t\tif(node.dyn_in)\n\t\t\tprune_dynamic_slots(node.dyn_in);\n\n\t\tif(node.dyn_out)\n\t\t\tprune_dynamic_slots(node.dyn_out);\n\t}\n\t\n\tfor(var i = 0, len = pruned.length; i < len; i++)\n\t\tdelete_node(graph, pruned[i]);\n\n\tvar conns = graph.conns;\n\t\n\tfor(var i = 0, len = conns.length; i < len; i++)\n\t{\n\t\tvar conn = conns[i];\n\t\t\n\t\tdelete conn.offset;\n\t}\n}\n\nfunction find_unique_plugins(graph)\n{\n\tvar nodes = graph.nodes;\n\t\n\tfor(var i = 0, len = nodes.length; i < len; i++)\n\t{\n\t\tvar node = nodes[i];\n\t\t\n\t\tif(unique_plugins.indexOf(node.plugin) === -1)\n\t\t{\n\t\t\tunique_plugins.push(node.plugin);\n\t\t\n\t\t\tif(ext_plugin_dependencies.hasOwnProperty(node.plugin))\n\t\t\t{\n\t\t\t\tvar dep = ext_plugin_dependencies[node.plugin];\n\t\t\t\t\n\t\t\t\tif(ext_depends.indexOf(dep) === -1)\n\t\t\t\t\text_depends.push(dep);\n\t\t\t}\n\t\t}\n\t\t\n\t\tif(node.plugin === 'graph' || node.plugin === 'loop')\n\t\t\tfind_unique_plugins(node.graph);\n\t}\n}\n\nfunction publish(seq, data_dir)\n{\n\t// Create the publishing dir, if it doesn't exist.\n\tvar pub_dir = path.join(data_dir, 'published', path.basename(seq, '.json'));\n\t\n\tvar data = JSON.parse(fs.readFileSync(seq, 'utf8'));\n\t\n\tpub_dir = path.join(pub_dir, path.basename(seq, '.json'));\n\t\n\tif(fs.existsSync(pub_dir))\n\t{\n\t\tconsole.log('Removing existing published project files.');\n\t\trmdirsSync(pub_dir);\n\t}\n\t\n\tfs.mkdirSync(pub_dir);\n\n\tprocess_graph(data.root, data_dir, pub_dir);\n\toptimize_graph(data.root);\n\t\n\tfs.writeFileSync(path.join(pub_dir, 'scene.json'), JSON.stringify(data));\n\t\n\tvar img_src = path.join('browser', 'images');\n\tvar img_dst = path.join(pub_dir, 'images');\n\t\n\tfs.mkdirSync(img_dst);\n\t['oculus.png', \n\t 'warning.png'].forEach(function(file, index)\n\t{\n\t\tcopy(path.join(img_src, file), path.join(img_dst, file));\n\t});\n\n\tcopy(path.join('tools', 'no_texture.publish.png'), path.join(img_dst, 'no_texture.png'));\n\t\n\tvar scripts_src = path.join('browser', 'scripts');\n\tvar scripts_dst = path.join(pub_dir, 'scripts');\n\t\n\tfs.mkdirSync(scripts_dst);\n\t['util.js',\n\t 'renderer.js',\n\t 'plugin-group.js',\n\t 'plugin-manager.js',\n\t 'connection.js',\n\t 'graph.js',\n\t 'node.js',\n\t 'registers.js',\n\t 'player.js',\n\t 'core.js'].forEach(function(file, index)\n\t{\n\t\tminify(path.join(scripts_src, file), path.join(scripts_dst, file));\n\t});\n\n\tvar vendor_src = path.join('browser', 'vendor');\n\tvar vendor_dst = path.join(pub_dir, 'vendor');\n\t\n\tfs.mkdirSync(vendor_dst);\n\t['jquery.fastfix.js',\n\t 'jquery.mousewheel.js',\n\t 'gl-matrix.js'].forEach(function(file, index)\n\t{\n\t\tminify(path.join(vendor_src, file), path.join(vendor_dst, file));\n\t});\n\n\tvar jq_src = path.join('node_modules', 'jquery', 'dist');\n\tvar jq_dst = path.join(pub_dir, 'node_modules', 'jquery', 'dist');\n\t\n\tmkdirsSync(jq_dst);\n\tminify(path.join(jq_src, 'jquery.min.js'), path.join(jq_dst, 'jquery.min.js'));\n\n\tcopy(path.join('tools', 'player.html'), path.join(pub_dir, 'index.html'));\n\n\tfind_unique_plugins(data.root);\n\t\n\tvar plg_reg = {};\n\tvar plg_src = '';\n\t\n\tunique_plugins.forEach(function(plugin, index)\n\t{\n\t\tplg_src += optimize_plugin(fs.readFileSync(path.join('browser', 'plugins', plugin + '.plugin.js'), { encoding: 'utf8' }));\n\t\tplg_reg['' + index] = plugin;\n\t});\n\t\n\tfs.mkdirSync(path.join(pub_dir, 'plugins'));\n\tfs.writeFileSync(path.join(pub_dir, 'plugins', 'plugins.json'), JSON.stringify(plg_reg));\n\t\n\tfs.writeFileSync(path.join(pub_dir, 'plugins', 'all.plugins.js'), plg_src);\n\t\n\t// Process any external dependcies by directory\n\tfor(var i = 0; i < ext_depends.length; i++)\n\t{\n\t\tvar dep = ext_depends[i];\n\t\tvar in_path = path.join('browser', 'plugins', dep);\n\t\tvar out_path = path.join(pub_dir, 'plugins', dep);\n\t\tvar files = fs.readdirSync(in_path);\n\t\t\n\t\tfs.mkdirSync(out_path);\n\t\t\n\t\tfor(var f = 0; f < files.length; f++)\n\t\t{\n\t\t\tvar file = files[f];\n\t\t\tvar ext = path.extname(file);\n\t\t\tvar src = path.join(in_path, file);\n\t\t\tvar dst = path.join(out_path, file);\n\t\t\t\n\t\t\tif(ext === '.js')\n\t\t\t\tminify(src, dst);\n\t\t\telse\n\t\t\t\tcopy(src, dst);\n\t\t}\n\t}\n}\n\npublish(process.argv[2], process.argv[3]);\n"
  },
  {
    "path": "tools/pull.js",
    "content": "var request = require('supertest')\nvar when = require('when')\nvar fs = require('fs')\nvar fsPath = require('path')\nvar assert = require('assert')\nvar expect = require('chai').expect\nvar urlParse = require('url').parse\nvar mongoose = require('mongoose');\nvar GridFsStorage = require('../lib/gridfs-storage');\nvar secrets = require('../config/secrets');\nvar _ = require('lodash')\n\nvar E2 = require('../browser/scripts/core').E2\n\nvar loadingPlugins = Object.keys(E2.LOADING_NODES)\n\nvar argv = require('minimist')(process.argv.slice(2))\n\nif (argv._.length < 1) {\n\tconsole.log(`\n\tusage:\n\n\t\t$ pull [-up] owner/graph-name [local-name]\n\t\t\t-u local user email\n\t\t\t-p password\n\n\t\t\tpulls the 'owner/graph-name' from the remote to local\n\t\t\t- remote can be the full url to the editor, 'user/graph', ...\n\t\t\t- remote defaults to patches.vizor.io\n\n\t\t\t$ pull fthr/tunnel\n\n\t\t\tpulls fthr/tunnel from patches.vizor.io to local username/tunnel\n\t`)\n\n\tprocess.exit(1)\n}\n\nvar username = argv['u']\nvar deets = {\n\temail: username,\n\tpassword: argv['p']\n}\n\nvar parsed = urlParse(argv._[0])\nvar hn = (parsed.hostname || 'patches.vizor.io')\n\t+ ':' + (parsed.port || 443)\n\nvar userAndGraph = parsed.path\n\t.split('.')[0] // remove extensions\n\t.split('/')\n\nif (userAndGraph[userAndGraph.length-1] === 'edit')\n\tuserAndGraph.pop()\n\nuserAndGraph = userAndGraph.slice(-2) // last two parts\n\nvar localName = argv._[1] || userAndGraph[1]\n\nuserAndGraph = userAndGraph.join('/')\n\nvar url = '/data/graph/' + userAndGraph +'.json'\n\nvar localHttp = 'http://127.0.0.1:8000'\nvar remoteHttp = 'https://'+hn\nvar cdnHttp = 'https://cdn.vizor.io:443'\nvar remote = request.agent(remoteHttp)\nvar cdn = request.agent(cdnHttp)\nvar local = request.agent(localHttp)\n\nif (localHttp === remoteHttp) {\n\tconsole.error('Not writing to source', localHttp, remoteHttp)\n\tprocess.exit(1)\n}\n\nfunction sendGraph(path, graphData, cb) {\n\treturn local.post('/graph').send({\n\t\tpath: path,\n\t\tprivate: 'false',\n\t\teditable: true,\n\t\tgraph: JSON.stringify(graphData)\n\t})\n\t.expect(200)\n\t.end(cb)\n}\n\nfunction error(err) {\n\tconsole.error(err)\n\tthrow err\n}\n\n// --------\n\nfunction mirror(remoteUrl, i, realName) {\n\tvar dfd = when.defer()\n\tlet agent = remoteUrl.indexOf('/data') === 0 ? cdn : remote\n\tlet getUrl = remoteUrl.replace(/^\\/data/, '')\n\tlet dest = getUrl\n\tif (realName)\n\t\tdest = realName\n\n\tagent.head(getUrl)\n\t.end((err, head) => {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\n\t\tif (head.statusCode !== 200)\n\t\t\tconsole.log('  HEAD ', getUrl, head.statusCode)\n\n\t\tif (head.statusCode === 301) {\n\t\t\tlet redUrl = head.headers.location.replace('https://cdn.vizor.io', '/data')\n\t\t\tconsole.log('  REDIRECT', redUrl)\n\t\t\treturn mirror(redUrl, 0, getUrl).then(() => { return dfd.resolve(getUrl) })\n\t\t}\n\n\t\tif (head.statusCode === 404)\n\t\t\treturn dfd.resolve()\n\n\t\tconsole.log('GET ', getUrl, 'from', agent === cdn ? 'cdn' : 'site', dest)\n\n\t\tif (getUrl.indexOf('.obj') !== -1) {\n\t\t\tvar mtlUrl = getUrl.replace('.obj', '.mtl')\n\t\t\tdfd.promise.then(() => { return mirror(mtlUrl) })\n\t\t}\n\n\t\tif (getUrl.indexOf('.ogg') !== -1) {\n\t\t\tvar m4aUrl = getUrl.replace('.ogg', '.m4a')\n\t\t\tdfd.promise.then(() => { return mirror(m4aUrl) })\n\t\t}\n\n\t\tif (remoteUrl.indexOf('/data') === 0) {\n\t\t\tvar metaUrl = '/meta' + getUrl\n\t\t\tdfd.promise.then(() => { return mirror(metaUrl) })\n\t\t}\n\n\t\tgfs.createWriteStream(dest)\n\t\t.then(function(writeStream) {\n\t\t\tagent.get(getUrl)\n\t\t\t.pipe(writeStream)\n\t\t\t.on('close', () => {\n\t\t\t\tconsole.log('  OK', remoteUrl)\n\t\t\t\tdfd.resolve(getUrl)\n\t\t\t})\n\t\t})\n\n\t})\n\n\treturn dfd.promise\n}\n\nvar assets = []\n\nfunction findAssets(subgraph) {\n\tif (!subgraph.nodes)\n\t\treturn\n\n\tsubgraph.nodes.map(function(node) {\n\t\tif (E2.GRAPH_NODES.indexOf(node.plugin) > -1)\n\t\t\treturn findAssets(node.graph)\n\n\t\tif (loadingPlugins.indexOf(node.plugin) === -1)\n\t\t\treturn;\n\n\t\tassets.push(node.state.url)\n\t})\n\n\tassets = _.uniq(assets)\n}\n\n// --------\n\nvar gfs\n\nmongoose.connect(secrets.db);\nmongoose.connection.on('error', function(err) {\n\tthrow err\n})\n\nmongoose.connection.on('connected', (connection) => {\n\tgfs = new GridFsStorage('/data')\n\tgfs.on('ready', function() {\n\t\tStep1()\n\t})\n})\n\nfunction done() {\n\tconsole.log('All done!')\n\tgfs.close()\n\tmongoose.connection.close()\n}\n\nfunction Step1() {\n\tlocal.post('/login.json').send(deets).expect(200)\n\t.end(function(err, res) {\n\t\tconsole.log('Login:', res ? res.status : res)\n\t\tif (err) return error(err)\n\t\tStep2()\n\t})\n}\n\nfunction Step2() {\n\tconsole.log('Retrieving:', hn, url)\n\tcdnUrl = url.replace(/^\\/data/, '')\n\tcdn.get(cdnUrl).expect(200).end(function(err, res) {\n\t\tif (err) return error(err)\n\n\t\tvar graph = res.body\n\t\tfindAssets(graph.root)\n\n\t\tsendGraph(localName, res.body, function(err) {\n\t\t\tif (err)\n\t\t\t\treturn error(err)\n\n\t\t\tvar username = deets.email.split('@')[0]\n\n\t\t\twhen.map(assets, mirror)\n\t\t\t.then(function() {\n\t\t\t\tdone()\n\t\t\t})\n\n\t\t})\n\t})\n}\n"
  },
  {
    "path": "tools/pushPlayerToGrid.js",
    "content": "var fs = require('fs')\nvar when = require('when')\nvar config = require('../config/config')\nvar secrets = require('../config/secrets')\n\nvar packageJson = JSON.parse(fs.readFileSync(__dirname+'/../package.json'))\nvar currentPlayerVersion = packageJson.version.split('.').slice(0,2).join('.')\n\nmodule.exports = function() {\n\tvar dfd = when.defer()\n\tvar mongoose = require('mongoose')\n\tlet CloudFileSystemImpl\n\tif (config.server.useCDN)\n\t \tCloudFileSystemImpl = require('../lib/cloudStorage')\n\telse\n\t\tCloudFileSystemImpl = require('../lib/gridfs-storage')\n\n\tmongoose.connect(secrets.db)\n\tmongoose.connection.once('error', function(err) {\n\t\tdfd.reject(err)\n\t})\n\n\tmongoose.connection.once('connected', function() {\n\t\tvar gfs = new CloudFileSystemImpl()\n\t\tgfs.on('ready', function() {\n\t\t\tvar playerSource = fs.readFileSync(__dirname+'/../browser/dist/player.min.js')\n\t\t\tvar destPath = '/dist/'+currentPlayerVersion+'/player.min.js'\n\n\t\t\tgfs.writeString(destPath, playerSource, 'utf8')\n\t\t\t.then(function() {\n\t\t\t\tgfs.close()\n\t\t\t\tmongoose.disconnect()\n\t\t\t\tmongoose = undefined\n\t\t\t\tdfd.resolve()\n\t\t\t})\n\t\t\t.catch(function(err) {\n\t\t\t\tdfd.reject(err)\n\t\t\t})\n\t\t})\n\t})\n\n\treturn dfd.promise\n}\n"
  },
  {
    "path": "tools/test-opt-plugins",
    "content": "#!/usr/bin/env node\nvar fs = require('fs');\nvar path = require('path');\nvar exec = require('child_process').exec;\n\nfunction process(filename)\n{\n\texec('./tools/optimize-plugin ' + filename, function(filename) { return function(error, stdout, stderr)\n\t{\n\t\tif(error)\n\t\t\tconsole.log(filename + ': ' + error.toString());\n\t}}(filename));\n}\n\nfs.readdirSync('./browser/plugins').forEach(function(entry, index)\n{\n\tvar filename = './browser/plugins/' + entry;\n\t\n\tif(fs.statSync(filename).isFile() && entry !== 'plugins.json')\n\t\tprocess(filename);\n});\n"
  },
  {
    "path": "tools/test-runner.js",
    "content": "var fs = require('fs')\nvar fsPath = require('path')\nvar execSync = require('child_process').execSync\n\nif (process.argv.length < 3) {\n\tconsole.error('usage: test-runner <folder>')\n\tprocess.exit(1)\n}\n\nvar testFolder = process.argv[2]\n\nvar items = fs.readdirSync(testFolder)\nitems.map(function(item) {\n\tif (item[0] === '.')\n\t\treturn;\n\n\ttry {\n\t\tvar tp = fsPath.join(testFolder, item)\n\t\tconsole.log('----- Running ', tp)\n\t\texecSync('./node_modules/mocha/bin/mocha ' +\n\t\t\t'--timeout 8000 --full-trace --verbose --colors ' +\n\t\t\ttp, {\n\t\t\t\tstdio: [ 0, 1, 2 ]\n\t\t})\n\t} catch(e) {\n\t\t// the error was already logged, just exit\n\t\tprocess.exit(1)\n\t}\n})\n\n\n\n"
  },
  {
    "path": "tools/upload.js",
    "content": "var request = require('supertest')\nvar when = require('when')\nvar fs = require('fs')\nvar fsPath = require('path')\nvar assert = require('assert')\nvar expect = require('chai').expect\nvar urlParse = require('url').parse\n\nvar argv = require('minimist')(process.argv.slice(2))\n\nif (argv._.length < 3) {\n\tconsole.log(`\n\tusage:\n\n\t\t$ upload [-up] <folder> <remote> <assetType>\n\t\t\t-u local username\n\t\t\t-p password \n\n\t\t\tuploads everything in <folder> to <remote> / <assetType>\n\t\t\t- remote defaults to localhost\n\t\t\t- assetType is image, scene, audio, json, ...\n\n\t\t$ node tools/upload.js /Downloads/JPEG/ localhost:8000 image\n\t`)\n\n\tprocess.exit(1)\n}\n\nvar username = argv.u\nvar deets = {\n\temail: username,\n\tpassword: argv.p\n}\n\nvar folder = argv._[0]\nvar remote = argv._[1]\nvar assetType = argv._[2]\n\nvar remoteHttp = 'http://' + remote\n\nvar remote = request.agent(remoteHttp)\n\nfunction upload(path) {\n\tvar dfd = when.defer()\n\n\tvar stream = fs.createReadStream(path)\n\n\tconsole.log('-- uploading', path)\n\n\treturn remote.post('/upload/'+assetType)\n\t.attach('file', stream, path)\n\t.expect(200)\n\t.end(function(err) {\n\t\tif (err)\n\t\t\treturn dfd.reject(err)\n\n\t\tconsole.log('\tdone', path)\n\n\t\tdfd.resolve()\n\t})\n\n\treturn dfd.promise\n}\n\nfunction error(err) {\n\tconsole.error(err)\n}\n\n// --------\n\nfunction Step1() {\n\tremote.post('/login.json').send(deets).expect(200)\n\t.end(function(err, res) {\n\t\tconsole.log('Login:', res ? res.status : res)\n\t\tif (err) return error(err)\n\t\tStep2()\n\t})\n}\n\nfunction Step2() {\n\twhen.map(fs.readdirSync(folder), function(item) {\n\t\tif (item[0] === '.')\n\t\t\treturn;\n\n\t\tvar fullpath = fsPath.resolve(folder, item)\n\t\t\n\t\treturn upload(fullpath)\n\t})\n}\n\nStep1()\n\n"
  },
  {
    "path": "tools/validate-seq",
    "content": "#!/usr/bin/env node\nfs = require('fs');\n\nvar debug = false;\n\nif(process.argv.length < 4)\n{\n\tconsole.log('Usage: validate-seq <JSON> <OUTPUT>');\n\treturn;\n}\n\nfunction warn(msg)\n{\n\tconsole.log('[Warning]: ' + msg);\n}\n\nfunction get_node_id(g_name, node)\n{\n\treturn \"'\" + node.title + ' in ' + g_name + \"'\";\n}\n\nfunction process_dynamic_slots(type, g_name, node, d_slots)\n{\n\tfor(var i = 0, len = d_slots.length; i < len; i++)\n\t{\n\t\tvar slot = d_slots[i];\n\t\t\n\t\tif(slot.dt === 8) // Type: ANY\n\t\t{\n\t\t\twarn('The node ' + get_node_id(g_name, node) + ' has a dynamic ' + type + ' slot that has type ANY, even though it\\'s connected.');\n\t\t}\n\t}\n}\n\nfunction process_graph(g_name, graph)\n{\n\tvar nodes = graph.nodes;\n\t\n\tfor(var i = 0, len = nodes.length; i < len; i++)\n\t{\n\t\tvar node = nodes[i];\n\t\t\n\t\tif(node.plugin === 'graph')\n\t\t\tprocess_graph(node.title, node.graph);\n\t\n\t\t// Check that node coordinates are not in negative space, and clamp them if they are.\n\t\tif(node.x < 0)\n\t\t{\n\t\t\tconsole.log('[Warning]: Canvas X coordinate of the node ' + get_node_id(g_name, node) + ' is negative and will be clamped to the canvas bounds.');\n\t\t\tnode.x = 0;\n\t\t}\n\t\t\t\t\n\t\tif(node.y < 0)\n\t\t{\n\t\t\tconsole.log('[Warning]: Canvas Y coordinate of the node ' + get_node_id(g_name, node) + ' is negative and will be clamped to the canvas bounds.');\n\t\t\tnode.y = 0;\n\t\t}\n\t\t\n\t\tif(node.dyn_in)\n\t\t\tprocess_dynamic_slots('input', g_name, node, node.dyn_in);\n\n\t\tif(node.dyn_out)\n\t\t\tprocess_dynamic_slots('output', g_name, node, node.dyn_out);\n\t}\n\t\n\tvar conns = graph.conns;\n\t\n\tfor(var i = 0, len = conns.length; i < len; i++)\n\t{\n\t\tvar conn = conns[i];\n\t}\n}\n\nvar data = JSON.parse(fs.readFileSync(process.argv[2], 'utf8'));\n\nprocess_graph('root', data.root);\n\nfs.writeFileSync(process.argv[3], JSON.stringify(data, undefined, 4));\n"
  },
  {
    "path": "vendor/three/fbx/LICENSE",
    "content": "The MIT License\n\nCopyright (c) 2012 convert-to-three.py authors.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "vendor/three/fbx/README.md",
    "content": "## convert-to-threejs\n\nUtility for converting model files to the Three.js JSON format\n\n## Supported Formats\n\n* Fbx (.fbx)\n* Collada (.dae) \n* Wavefront/Alias (.obj)\n* 3D Studio Max (.3ds)\n\n## Usage \n\n```\nconvert_to_threejs.py [source_file] [output_file] [options]\n\nOptions:\n  -t, --triangulate       force non-triangle geometry into triangles\n  -x, --ignore-textures   don't include texture references in output file\n  -u, --force-prefix      prefix all object names in output file to ensure uniqueness\n  -f, --flatten-scene     merge all geometries and apply node transforms\n  -c, --add-camera        include default camera in output scene\n  -l, --add-light         include default light in output scene\n  -p, --pretty-print      prefix all object names in output file\n```\n\n## Current Limitations\n\n* No animation support\n* Only Lambert and Phong materials are supported\n* Some camera properties are not converted correctly\n* Some light properties are not converted correctly\n* Some material properties are not converted correctly\n* Textures must be put in asset's folder, and use relative path in the material\n\n## Dependencies\n\n### FBX SDK\n* Requires Autodesk FBX SDK Python 2013.3 bindings. \n\n```\nYou can download the python bindings from the Autodesk website: \n  http://usa.autodesk.com/fbx/\n```\n\n```\nDon't forget the visit the FBX SDK documentation website:\n  http://docs.autodesk.com/FBX/2013/ENU/FBX-SDK-Documentation/cpp_ref/index.html\n```\n\n### Python\n* Requires Python 2.6 or 3.1 (The FBX SDK requires one of these versions)\n\n``` bash\nsudo apt-get install build-essential\nwget http://www.python.org/ftp/python/2.6.8/Python-2.6.8.tar.bz2\ntar jxf ./Python-2.6.8.tar.bz2\ncd ./Python-2.6.8\n./configure --prefix=/opt/python2.6.8 && make && make install\n```\n"
  },
  {
    "path": "vendor/three/fbx/convert_to_threejs.py",
    "content": "# @author zfedoran / http://github.com/zfedoran\n# slightly modified for vizor.io from three.js release r72\n\nimport os\nimport sys\nimport math\nimport operator\nimport re\nimport json\nimport types\nimport shutil\n\n# #####################################################\n# Globals\n# #####################################################\noption_triangulate = True\noption_textures = True\noption_copy_textures = True\noption_prefix = True\noption_geometry = False\noption_forced_y_up = False\noption_default_camera = False\noption_default_light = False\noption_pretty_print = False\n\nconverter = None\ninputFolder = \"\"\noutputFolder = \"\"\n\n# #####################################################\n# Pretty Printing Hacks\n# #####################################################\n\n# Force an array to be printed fully on a single line\nclass NoIndent(object):\n    def __init__(self, value, separator = ','):\n        self.separator = separator\n        self.value = value\n    def encode(self):\n        if not self.value:\n            return None\n        return '[ %s ]' % self.separator.join(str(f) for f in self.value)\n\n# Force an array into chunks rather than printing each element on a new line\nclass ChunkedIndent(object):\n    def __init__(self, value, chunk_size = 15, force_rounding = False):\n        self.value = value\n        self.size = chunk_size\n        self.force_rounding = force_rounding\n    def encode(self):\n        # Turn the flat array into an array of arrays where each subarray is of\n        # length chunk_size. Then string concat the values in the chunked \n        # arrays, delimited with a ', ' and round the values finally append \n        # '{CHUNK}' so that we can find the strings with regex later\n        if not self.value:\n            return None\n        if self.force_rounding:\n            return ['{CHUNK}%s' % ', '.join(str(round(f, 6)) for f in self.value[i:i+self.size]) for i in range(0, len(self.value), self.size)]\n        else:\n            return ['{CHUNK}%s' % ', '.join(str(f) for f in self.value[i:i+self.size]) for i in range(0, len(self.value), self.size)]\n\n# This custom encoder looks for instances of NoIndent or ChunkedIndent. \n# When it finds \nclass CustomEncoder(json.JSONEncoder):\n    def default(self, obj):\n        if isinstance(obj, NoIndent) or isinstance(obj, ChunkedIndent):\n            return obj.encode()\n        else:\n            return json.JSONEncoder.default(self, obj)\n\ndef executeRegexHacks(output_string):\n    # turn strings of arrays into arrays (remove the double quotes)\n    output_string = re.sub(':\\s*\\\"(\\[.*\\])\\\"', r': \\1', output_string)\n    output_string = re.sub('(\\n\\s*)\\\"(\\[.*\\])\\\"', r'\\1\\2', output_string)\n    output_string = re.sub('(\\n\\s*)\\\"{CHUNK}(.*)\\\"', r'\\1\\2', output_string)\n\n    # replace '0metadata' with metadata\n    output_string = re.sub('0metadata', r'metadata', output_string)\n    # replace 'zchildren' with children\n    output_string = re.sub('zchildren', r'children', output_string)\n\n    # add an extra newline after '\"children\": {'\n    output_string = re.sub('(children.*{\\s*\\n)', r'\\1\\n', output_string)\n    # add an extra newline after '},'\n    output_string = re.sub('},\\s*\\n', r'},\\n\\n', output_string)\n    # add an extra newline after '\\n\\s*],'\n    output_string = re.sub('(\\n\\s*)],\\s*\\n', r'\\1],\\n\\n', output_string)\n\n    return output_string\n\n# #####################################################\n# Object Serializers\n# #####################################################\n\n# FbxVector2 is not JSON serializable\ndef serializeVector2(v, round_vector = False):\n    # JSON does not support NaN or Inf\n    if math.isnan(v[0]) or math.isinf(v[0]):\n        v[0] = 0\n    if math.isnan(v[1]) or math.isinf(v[1]):\n        v[1] = 0\n    if round_vector or option_pretty_print:\n        v = (round(v[0], 5), round(v[1], 5))\n    if option_pretty_print:\n        return NoIndent([v[0], v[1]], ', ')\n    else:\n        return [v[0], v[1]]\n\n# FbxVector3 is not JSON serializable\ndef serializeVector3(v, round_vector = False):\n    # JSON does not support NaN or Inf\n    if math.isnan(v[0]) or math.isinf(v[0]):\n        v[0] = 0\n    if math.isnan(v[1]) or math.isinf(v[1]):\n        v[1] = 0\n    if math.isnan(v[2]) or math.isinf(v[2]):\n        v[2] = 0\n    if round_vector or option_pretty_print:\n        v = (round(v[0], 5), round(v[1], 5), round(v[2], 5))\n    if option_pretty_print:\n        return NoIndent([v[0], v[1], v[2]], ', ')\n    else:\n        return [v[0], v[1], v[2]]\n\n# FbxVector4 is not JSON serializable\ndef serializeVector4(v, round_vector = False):\n    # JSON does not support NaN or Inf\n    if math.isnan(v[0]) or math.isinf(v[0]):\n        v[0] = 0\n    if math.isnan(v[1]) or math.isinf(v[1]):\n        v[1] = 0\n    if math.isnan(v[2]) or math.isinf(v[2]):\n        v[2] = 0\n    if math.isnan(v[3]) or math.isinf(v[3]):\n        v[3] = 0\n    if round_vector or option_pretty_print:\n        v = (round(v[0], 5), round(v[1], 5), round(v[2], 5), round(v[3], 5))\n    if option_pretty_print:\n        return NoIndent([v[0], v[1], v[2], v[3]], ', ')\n    else:\n        return [v[0], v[1], v[2], v[3]]\n\n# #####################################################\n# Helpers\n# #####################################################\ndef getRadians(v):\n    return ((v[0]*math.pi)/180, (v[1]*math.pi)/180, (v[2]*math.pi)/180)\n\ndef getHex(c):\n    color = (int(c[0]*255) << 16) + (int(c[1]*255) << 8) + int(c[2]*255)\n    return int(color)\n\ndef setBit(value, position, on):\n    if on:\n        mask = 1 << position\n        return (value | mask)\n    else:\n        mask = ~(1 << position)\n        return (value & mask)\n    \ndef generate_uvs(uv_layers):\n    layers = []\n    for uvs in uv_layers:\n        tmp = []\n        for uv in uvs:\n            tmp.append(uv[0])\n            tmp.append(uv[1])\n        if option_pretty_print:\n            layer = ChunkedIndent(tmp)\n        else:\n            layer = tmp\n        layers.append(layer)\n    return layers\n\n# #####################################################\n# Object Name Helpers\n# #####################################################\ndef hasUniqueName(o, class_id):\n    scene = o.GetScene()\n    object_name = o.GetName() \n    object_id = o.GetUniqueID()\n\n    object_count = scene.GetSrcObjectCount(class_id)\n\n    for i in range(object_count):\n        other = scene.GetSrcObject(class_id, i)\n        other_id = other.GetUniqueID()\n        other_name = other.GetName() \n\n        if other_id == object_id:\n            continue\n        if other_name == object_name:\n            return False\n\n    return True\n\ndef getObjectName(o, force_prefix = False): \n    if not o:\n        return \"\"  \n\n    object_name = o.GetName() \n    object_id = o.GetUniqueID()\n\n    if not force_prefix:\n        force_prefix = not hasUniqueName(o, FbxNode.ClassId)\n\n    prefix = \"\"\n    if option_prefix or force_prefix:\n        prefix = \"Object_%s_\" % object_id\n\n    return prefix + object_name\n\ndef getMaterialName(o, force_prefix = False):\n    object_name = o.GetName() \n    object_id = o.GetUniqueID()\n\n    if not force_prefix:\n        force_prefix = not hasUniqueName(o, FbxSurfaceMaterial.ClassId)\n\n    prefix = \"\"\n    if option_prefix or force_prefix:\n        prefix = \"Material_%s_\" % object_id\n\n    return prefix + object_name\n\ndef getTextureName(t, force_prefix = False):\n    if type(t) is FbxFileTexture:\n        texture_file = t.GetFileName()\n        texture_id = os.path.splitext(os.path.basename(texture_file))[0]\n    else:\n        texture_id = t.GetName()\n        if texture_id == \"_empty_\":\n            texture_id = \"\"\n    prefix = \"\"\n    if option_prefix or force_prefix:\n        prefix = \"Texture_%s_\" % t.GetUniqueID()\n        if len(texture_id) == 0:\n            prefix = prefix[0:len(prefix)-1]\n    return prefix + texture_id\n\ndef getMtlTextureName(texture_name, texture_id, force_prefix = False):\n    texture_name = os.path.splitext(texture_name)[0]\n    prefix = \"\"\n    if option_prefix or force_prefix:\n        prefix = \"Texture_%s_\" % texture_id\n    return prefix + texture_name\n\ndef getPrefixedName(o, prefix):\n    return (prefix + '_%s_') % o.GetUniqueID() + o.GetName()\n\n# #####################################################\n# Triangulation \n# #####################################################\ndef triangulate_node_hierarchy(node):\n    node_attribute = node.GetNodeAttribute();\n\n    if node_attribute:\n        if node_attribute.GetAttributeType() == FbxNodeAttribute.eMesh or \\\n           node_attribute.GetAttributeType() == FbxNodeAttribute.eNurbs or \\\n           node_attribute.GetAttributeType() == FbxNodeAttribute.eNurbsSurface or \\\n           node_attribute.GetAttributeType() == FbxNodeAttribute.ePatch:\n            converter.TriangulateInPlace(node);\n        \n        child_count = node.GetChildCount()\n        for i in range(child_count):\n            triangulate_node_hierarchy(node.GetChild(i))\n\ndef triangulate_scene(scene):\n    node = scene.GetRootNode()\n    if node:\n        for i in range(node.GetChildCount()):\n            triangulate_node_hierarchy(node.GetChild(i))\n\n# #####################################################\n# Generate Material Object\n# #####################################################\ndef generate_texture_bindings(material_property, material_params):\n    # FBX to Three.js texture types \n    binding_types = {\n        \"DiffuseColor\": \"map\", \n        \"DiffuseFactor\": \"diffuseFactor\", \n        \"EmissiveColor\": \"emissiveMap\", \n        \"EmissiveFactor\": \"emissiveFactor\", \n        \"AmbientColor\": \"lightMap\", # \"ambientMap\", \n        \"AmbientFactor\": \"ambientFactor\", \n        \"SpecularColor\": \"specularMap\", \n        \"SpecularFactor\": \"specularFactor\", \n        \"ShininessExponent\": \"shininessExponent\",\n        \"NormalMap\": \"normalMap\", \n        \"Bump\": \"bumpMap\", \n        \"TransparentColor\": \"transparentMap\", \n        \"TransparencyFactor\": \"transparentFactor\", \n        \"ReflectionColor\": \"reflectionMap\", \n        \"ReflectionFactor\": \"reflectionFactor\", \n        \"DisplacementColor\": \"displacementMap\", \n        \"VectorDisplacementColor\": \"vectorDisplacementMap\"\n    }\n\n    if material_property.IsValid():\n        #Here we have to check if it's layeredtextures, or just textures:\n        layered_texture_count = material_property.GetSrcObjectCount(FbxLayeredTexture.ClassId)\n        if layered_texture_count > 0:\n            for j in range(layered_texture_count):\n                layered_texture = material_property.GetSrcObject(FbxLayeredTexture.ClassId, j)\n                texture_count = layered_texture.GetSrcObjectCount(FbxTexture.ClassId)\n                for k in range(texture_count):\n                    texture = layered_texture.GetSrcObject(FbxTexture.ClassId,k)\n                    if texture:\n                        texture_id = getTextureName(texture, True)\n                        material_params[binding_types[str(material_property.GetName())]] = texture_id\n        else:\n            # no layered texture simply get on the property\n            texture_count = material_property.GetSrcObjectCount(FbxTexture.ClassId)\n            for j in range(texture_count):\n                texture = material_property.GetSrcObject(FbxTexture.ClassId,j)\n                if texture:\n                    texture_id = getTextureName(texture, True)\n                    material_params[binding_types[str(material_property.GetName())]] = texture_id\n\ndef generate_material_object(material):\n    #Get the implementation to see if it's a hardware shader.\n    implementation = GetImplementation(material, \"ImplementationHLSL\")\n    implementation_type = \"HLSL\"\n    if not implementation:\n        implementation = GetImplementation(material, \"ImplementationCGFX\")\n        implementation_type = \"CGFX\"\n\n    output = None\n    material_params = None\n    material_type = None\n\n    if implementation:\n        print(\"Shader materials are not supported\")\n        \n    elif material.GetClassId().Is(FbxSurfaceLambert.ClassId):\n\n        ambient   = getHex(material.Ambient.Get())\n        diffuse   = getHex(material.Diffuse.Get())\n        emissive  = getHex(material.Emissive.Get())\n        opacity   = 1.0 - material.TransparencyFactor.Get()\n        opacity   = 1.0 if opacity == 0 else opacity\n        opacity   = opacity\n        transparent = False\n        reflectivity = 1\n\n#        material_type = 'MeshBasicMaterial'\n        material_type = 'MeshLambertMaterial'\n        material_params = {\n\n          'color' : diffuse,\n          'ambient' : ambient,\n          'emissive' : emissive,\n          'reflectivity' : reflectivity,\n          'transparent' : transparent,\n          'opacity' : opacity\n\n        }\n\n    elif material.GetClassId().Is(FbxSurfacePhong.ClassId):\n\n        ambient   = getHex(material.Ambient.Get())\n        diffuse   = getHex(material.Diffuse.Get())\n        emissive  = getHex(material.Emissive.Get())\n        specular  = getHex(material.Specular.Get())\n        opacity   = 1.0 - material.TransparencyFactor.Get()\n        opacity   = 1.0 if opacity == 0 else opacity\n        opacity   = opacity\n        shininess = material.Shininess.Get()\n        transparent = False\n        reflectivity = 1\n        bumpScale = 1\n\n        material_type = 'MeshPhongMaterial'\n        material_params = {\n\n          'color' : diffuse,\n          'ambient' : ambient,\n          'emissive' : emissive,\n          'specular' : specular,\n          'shininess' : shininess,\n          'bumpScale' : bumpScale,\n          'reflectivity' : reflectivity,\n          'transparent' : transparent,\n          'opacity' : opacity\n\n        }\n\n    else:\n        print \"Unknown type of Material\", getMaterialName(material)\n\n    # default to Lambert Material if the current Material type cannot be handeled\n    if not material_type:\n        ambient   = getHex((0,0,0))\n        diffuse   = getHex((0.5,0.5,0.5))\n        emissive  = getHex((0,0,0))\n        opacity   = 1\n        transparent = False\n        reflectivity = 1\n\n        material_type = 'MeshLambertMaterial'\n        material_params = {\n\n          'color' : diffuse,\n          'ambient' : ambient,\n          'emissive' : emissive,\n          'reflectivity' : reflectivity,\n          'transparent' : transparent,\n          'opacity' : opacity\n\n        }\n\n    if option_textures:\n        texture_count = FbxLayerElement.sTypeTextureCount()\n        for texture_index in range(texture_count):\n            material_property = material.FindProperty(FbxLayerElement.sTextureChannelNames(texture_index))\n            generate_texture_bindings(material_property, material_params)\n\n    material_params['wireframe'] = False\n    material_params['wireframeLinewidth'] = 1\n\n    output = {\n      'type' : material_type,\n      'parameters' : material_params\n    }\n\n    return output\n\ndef generate_proxy_material_object(node, material_names):\n    \n    material_type = 'MeshFaceMaterial'\n    material_params = { \n      'materials' : material_names \n    }\n\n    output = {\n      'type' : material_type,\n      'parameters' : material_params\n    }\n\n    return output\n\n# #####################################################\n# Find Scene Materials\n# #####################################################\ndef extract_materials_from_node(node, material_dict):\n    name = node.GetName()\n    mesh = node.GetNodeAttribute()\n\n    node = None\n    if mesh:\n        node = mesh.GetNode()\n        if node:\n            material_count = node.GetMaterialCount()\n    \n    material_names = []\n    for l in range(mesh.GetLayerCount()):\n        materials = mesh.GetLayer(l).GetMaterials()\n        if materials:\n            if materials.GetReferenceMode() == FbxLayerElement.eIndex:\n                #Materials are in an undefined external table\n                continue\n            for i in range(material_count):\n                material = node.GetMaterial(i)\n                material_names.append(getMaterialName(material))\n\n    if material_count > 1:\n        proxy_material = generate_proxy_material_object(node, material_names)\n        proxy_name = getMaterialName(node, True)\n        material_dict[proxy_name] = proxy_material\n\ndef generate_materials_from_hierarchy(node, material_dict):\n    if node.GetNodeAttribute() == None:\n        pass\n    else:\n        attribute_type = (node.GetNodeAttribute().GetAttributeType())\n        if attribute_type == FbxNodeAttribute.eMesh:\n            extract_materials_from_node(node, material_dict)\n    for i in range(node.GetChildCount()):\n        generate_materials_from_hierarchy(node.GetChild(i), material_dict)\n\ndef generate_material_dict(scene):\n    material_dict = {}\n\n    # generate all materials for this scene\n    material_count = scene.GetSrcObjectCount(FbxSurfaceMaterial.ClassId)\n    for i in range(material_count):\n        material = scene.GetSrcObject(FbxSurfaceMaterial.ClassId, i)\n        material_object = generate_material_object(material)\n        material_name = getMaterialName(material)\n        material_dict[material_name] = material_object\n\n    # generate material porxies\n    # Three.js does not support meshs with multiple materials, however it does\n    # support materials with multiple submaterials\n    node = scene.GetRootNode()\n    if node:\n        for i in range(node.GetChildCount()):\n            generate_materials_from_hierarchy(node.GetChild(i), material_dict)\n\n    return material_dict\n\n\nremap_cache = {}\n# #####################################################\n# Remap a texture url to a file that actually exists\n# on disk.\n# #####################################################\ndef try_remap_texture(url):\n    if len(str(url)) == 0:\n        return url\n\n    url = url.replace('\\\\','/')\n\n    if url in remap_cache:\n        return remap_cache[url]\n\n    from os import listdir\n\n    path = os.path.dirname(url)\n    if len(path) == 0:\n        path = '.'\n    \n    print 'remapping', path, url\n\n    if not os.path.exists(path):\n        path = '.'\n\n    onlyfiles = [ f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]\n    \n    url_filename, url_ext = os.path.basename(url).rsplit('.')\n    \n    if os.path.basename(url) in onlyfiles:\n        # exact match\n        match = path + '/' + os.path.basename(url)\n        print ('match' + match)\n        remap_cache[url] = match\n        return match\n\n    for candidate in onlyfiles:\n        c = candidate.encode('UTF-8').lower()\n        if (os.path.basename(url).lower() == c):\n            match = path + '/' + candidate\n            print ('found exact match:' + match)\n            remap_cache[url] = match\n            return match\n    \n    for candidate in onlyfiles:\n        if candidate.find('.') == -1:   \n            continue\n\n        filename, ext = candidate.rsplit('.')\n        filename = filename.encode('UTF-8').lower()\n        ext = ext.encode('UTF-8').lower()\n        # print \"matching\", url_filename.lower(), url_ext.lower(), \"to\", filename, ext\n\n        if (filename.find(url_filename.lower()) == 0 and ext.find(url_ext.lower()) == 0):\n            match = path + '/' + filename + '.' + ext\n            print ('found partial match:' + match)\n            remap_cache[url] = match\n            return match \n\n    print ('cannot match', url, onlyfiles)\n    return url\n\n\n# #####################################################\n# Generate Texture Object \n# #####################################################\ndef generate_texture_object(texture):\n\n    #TODO: extract more texture properties\n    wrap_u = texture.GetWrapModeU()\n    wrap_v = texture.GetWrapModeV()\n    offset = texture.GetUVTranslation()\n\n    if type(texture) is FbxFileTexture:\n        url = texture.GetFileName()\n    else:\n        url = getTextureName( texture )\n        \n    #url = replace_inFolder2OutFolder( url )\n    url = try_remap_texture(url)\n    # print( 'texture object:', url )\n\n    index = url.rfind( '/' )\n    if index == -1:\n        index = url.rfind( '\\\\' )\n    filename = url[ index+1 : len(url) ]\n\n    output = {\n\n      'url': filename,\n      'fullpath': url,\n      'repeat': serializeVector2( (1,1) ),\n      'offset': serializeVector2( texture.GetUVTranslation() ),\n      'magFilter': 'LinearFilter',\n      'minFilter': 'LinearMipMapLinearFilter',\n      'anisotropy': True\n\n    }\n    \n    return output\n\n# #####################################################\n# Replace Texture input path to output\n# #####################################################\ndef replace_inFolder2OutFolder(url):\n    folderIndex =  url.find(inputFolder)\n        \n    if  folderIndex != -1:\n        url = url[ folderIndex+len(inputFolder): ]\n        url = outputFolder + url\n            \n    return url\n\n# #####################################################\n# Replace Texture output path to input\n# #####################################################\ndef replace_OutFolder2inFolder(url):\n    folderIndex =  url.find(outputFolder)\n        \n    if  folderIndex != -1:\n        url = url[ folderIndex+len(outputFolder): ]\n        url = inputFolder + url\n            \n    return url\n\n# #####################################################\n# Find Scene Textures\n# #####################################################\ndef extract_material_textures(material_property, texture_dict):\n    if material_property.IsValid():\n        #Here we have to check if it's layeredtextures, or just textures:\n        layered_texture_count = material_property.GetSrcObjectCount(FbxLayeredTexture.ClassId)\n        if layered_texture_count > 0:\n            for j in range(layered_texture_count):\n                layered_texture = material_property.GetSrcObject(FbxLayeredTexture.ClassId, j)\n                texture_count = layered_texture.GetSrcObjectCount(FbxTexture.ClassId)\n                for k in range(texture_count):\n                    texture = layered_texture.GetSrcObject(FbxTexture.ClassId,k)\n                    if texture:\n                        texture_object = generate_texture_object(texture)\n                        texture_name = getTextureName( texture, True )\n                        texture_dict[texture_name] = texture_object\n        else:\n            # no layered texture simply get on the property\n            texture_count = material_property.GetSrcObjectCount(FbxTexture.ClassId)\n            for j in range(texture_count):\n                texture = material_property.GetSrcObject(FbxTexture.ClassId,j)\n                if texture:\n                    texture_object = generate_texture_object(texture)\n                    texture_name = getTextureName( texture, True )\n                    texture_dict[texture_name] = texture_object\n\ndef extract_textures_from_node(node, texture_dict):\n    name = node.GetName()\n    mesh = node.GetNodeAttribute()\n    \n    #for all materials attached to this mesh\n    material_count = mesh.GetNode().GetSrcObjectCount(FbxSurfaceMaterial.ClassId)\n    for material_index in range(material_count):\n        material = mesh.GetNode().GetSrcObject(FbxSurfaceMaterial.ClassId, material_index)\n\n        #go through all the possible textures types\n        if material:            \n            texture_count = FbxLayerElement.sTypeTextureCount()\n            for texture_index in range(texture_count):\n                material_property = material.FindProperty(FbxLayerElement.sTextureChannelNames(texture_index))\n                extract_material_textures(material_property, texture_dict)\n\ndef generate_textures_from_hierarchy(node, texture_dict):\n    if node.GetNodeAttribute() == None:\n        pass\n    else:\n        attribute_type = (node.GetNodeAttribute().GetAttributeType())\n        if attribute_type == FbxNodeAttribute.eMesh:\n            extract_textures_from_node(node, texture_dict)\n    for i in range(node.GetChildCount()):\n        generate_textures_from_hierarchy(node.GetChild(i), texture_dict)\n\ndef generate_texture_dict(scene):\n    if not option_textures:\n        return {}\n\n    texture_dict = {}\n    node = scene.GetRootNode()\n    if node:\n        for i in range(node.GetChildCount()):\n            generate_textures_from_hierarchy(node.GetChild(i), texture_dict)\n    return texture_dict\n\n# #####################################################\n# Extract Fbx SDK Mesh Data\n# #####################################################\ndef extract_fbx_vertex_positions(mesh):\n    control_points_count = mesh.GetControlPointsCount()\n    control_points = mesh.GetControlPoints()\n\n    positions = []\n    for i in range(control_points_count):\n        tmp = control_points[i]\n        tmp = [tmp[0], tmp[1], tmp[2]]\n        positions.append(tmp)\n\n    node = mesh.GetNode()\n    if node:\n        t = node.GeometricTranslation.Get()\n        t = FbxVector4(t[0], t[1], t[2], 1)\n        r = node.GeometricRotation.Get()\n        r = FbxVector4(r[0], r[1], r[2], 1)\n        s = node.GeometricScaling.Get()\n        s = FbxVector4(s[0], s[1], s[2], 1)\n        \n        hasGeometricTransform = False\n        if t[0] != 0 or t[1] != 0 or t[2] != 0 or \\\n           r[0] != 0 or r[1] != 0 or r[2] != 0 or \\\n           s[0] != 1 or s[1] != 1 or s[2] != 1:\n            hasGeometricTransform = True\n        \n        if hasGeometricTransform:\n            geo_transform = FbxMatrix(t,r,s)\n        else:\n            geo_transform = FbxMatrix()\n\n        transform = None\n\n        if option_geometry:\n            # FbxMeshes are local to their node, we need the vertices in global space\n            # when scene nodes are not exported\n            transform = node.EvaluateGlobalTransform()\n            transform = FbxMatrix(transform) * geo_transform\n\n        elif hasGeometricTransform:\n            transform = geo_transform\n            \n        if transform:\n            for i in range(len(positions)):\n                v = positions[i]\n                position = FbxVector4(v[0], v[1], v[2])\n                position = transform.MultNormalize(position)\n                positions[i] = [position[0], position[1], position[2]]\n\n    return positions\n\ndef extract_fbx_vertex_normals(mesh):\n#   eNone             The mapping is undetermined.\n#   eByControlPoint   There will be one mapping coordinate for each surface control point/vertex.\n#   eByPolygonVertex  There will be one mapping coordinate for each vertex, for every polygon of which it is a part. This means that a vertex will have as many mapping coordinates as polygons of which it is a part.\n#   eByPolygon        There can be only one mapping coordinate for the whole polygon.\n#   eByEdge           There will be one mapping coordinate for each unique edge in the mesh. This is meant to be used with smoothing layer elements.\n#   eAllSame          There can be only one mapping coordinate for the whole surface.\n\n    layered_normal_indices = []\n    layered_normal_values = []\n\n    poly_count = mesh.GetPolygonCount()\n    control_points = mesh.GetControlPoints() \n\n    for l in range(mesh.GetLayerCount()):\n        mesh_normals = mesh.GetLayer(l).GetNormals()\n        if not mesh_normals:\n            continue\n          \n        normals_array = mesh_normals.GetDirectArray()\n        normals_count = normals_array.GetCount()\n  \n        if normals_count == 0:\n            continue\n\n        normal_indices = []\n        normal_values = []\n\n        # values\n        for i in range(normals_count):\n            normal = normals_array.GetAt(i)\n            normal = [normal[0], normal[1], normal[2]]\n            normal_values.append(normal)\n\n        node = mesh.GetNode()\n        if node:\n            t = node.GeometricTranslation.Get()\n            t = FbxVector4(t[0], t[1], t[2], 1)\n            r = node.GeometricRotation.Get()\n            r = FbxVector4(r[0], r[1], r[2], 1)\n            s = node.GeometricScaling.Get()\n            s = FbxVector4(s[0], s[1], s[2], 1)\n            \n            hasGeometricTransform = False\n            if t[0] != 0 or t[1] != 0 or t[2] != 0 or \\\n               r[0] != 0 or r[1] != 0 or r[2] != 0 or \\\n               s[0] != 1 or s[1] != 1 or s[2] != 1:\n                hasGeometricTransform = True\n            \n            if hasGeometricTransform:\n                geo_transform = FbxMatrix(t,r,s)\n            else:\n                geo_transform = FbxMatrix()\n\n            transform = None\n\n            if option_geometry:\n                # FbxMeshes are local to their node, we need the vertices in global space\n                # when scene nodes are not exported\n                transform = node.EvaluateGlobalTransform()\n                transform = FbxMatrix(transform) * geo_transform\n\n            elif hasGeometricTransform:\n                transform = geo_transform\n                \n            if transform:\n                t = FbxVector4(0,0,0,1)\n                transform.SetRow(3, t)\n\n                for i in range(len(normal_values)):\n                    n = normal_values[i]\n                    normal = FbxVector4(n[0], n[1], n[2])\n                    normal = transform.MultNormalize(normal)\n                    normal.Normalize()\n                    normal = [normal[0], normal[1], normal[2]]\n                    normal_values[i] = normal\n\n        # indices\n        vertexId = 0\n        for p in range(poly_count):\n            poly_size = mesh.GetPolygonSize(p)\n            poly_normals = []\n\n            for v in range(poly_size):\n                control_point_index = mesh.GetPolygonVertex(p, v)\n                \n                # mapping mode is by control points. The mesh should be smooth and soft.\n                # we can get normals by retrieving each control point\n                if mesh_normals.GetMappingMode() == FbxLayerElement.eByControlPoint:\n\n                    # reference mode is direct, the normal index is same as vertex index.\n                    # get normals by the index of control vertex\n                    if mesh_normals.GetReferenceMode() == FbxLayerElement.eDirect:\n                        poly_normals.append(control_point_index)\n\n                    elif mesh_normals.GetReferenceMode() == FbxLayerElement.eIndexToDirect:\n                        index = mesh_normals.GetIndexArray().GetAt(control_point_index)\n                        poly_normals.append(index)\n\n                # mapping mode is by polygon-vertex.\n                # we can get normals by retrieving polygon-vertex.\n                elif mesh_normals.GetMappingMode() == FbxLayerElement.eByPolygonVertex:\n\n                    if mesh_normals.GetReferenceMode() == FbxLayerElement.eDirect:\n                        poly_normals.append(vertexId)\n\n                    elif mesh_normals.GetReferenceMode() == FbxLayerElement.eIndexToDirect:\n                        index = mesh_normals.GetIndexArray().GetAt(vertexId)\n                        poly_normals.append(index)\n\n                elif mesh_normals.GetMappingMode() == FbxLayerElement.eByPolygon or \\\n                     mesh_normals.GetMappingMode() ==  FbxLayerElement.eAllSame or \\\n                     mesh_normals.GetMappingMode() ==  FbxLayerElement.eNone:       \n                    print(\"unsupported normal mapping mode for polygon vertex\")\n\n                vertexId += 1\n            normal_indices.append(poly_normals)\n\n        layered_normal_values.append(normal_values)\n        layered_normal_indices.append(normal_indices)\n\n    normal_values = []\n    normal_indices = []\n\n    # Three.js only supports one layer of normals\n    if len(layered_normal_values) > 0:\n        normal_values = layered_normal_values[0]\n        normal_indices = layered_normal_indices[0]\n\n    return normal_values, normal_indices\n\ndef extract_fbx_vertex_colors(mesh):\n#   eNone             The mapping is undetermined.\n#   eByControlPoint   There will be one mapping coordinate for each surface control point/vertex.\n#   eByPolygonVertex  There will be one mapping coordinate for each vertex, for every polygon of which it is a part. This means that a vertex will have as many mapping coordinates as polygons of which it is a part.\n#   eByPolygon        There can be only one mapping coordinate for the whole polygon.\n#   eByEdge           There will be one mapping coordinate for each unique edge in the mesh. This is meant to be used with smoothing layer elements.\n#   eAllSame          There can be only one mapping coordinate for the whole surface.\n\n    layered_color_indices = []\n    layered_color_values = []\n\n    poly_count = mesh.GetPolygonCount()\n    control_points = mesh.GetControlPoints() \n\n    for l in range(mesh.GetLayerCount()):\n        mesh_colors = mesh.GetLayer(l).GetVertexColors()\n        if not mesh_colors:\n            continue\n          \n        colors_array = mesh_colors.GetDirectArray()\n        colors_count = colors_array.GetCount()\n  \n        if colors_count == 0:\n            continue\n\n        color_indices = []\n        color_values = []\n\n        # values\n        for i in range(colors_count):\n            color = colors_array.GetAt(i)\n            color = [color.mRed, color.mGreen, color.mBlue, color.mAlpha]\n            color_values.append(color)\n\n        # indices\n        vertexId = 0\n        for p in range(poly_count):\n            poly_size = mesh.GetPolygonSize(p)\n            poly_colors = []\n\n            for v in range(poly_size):\n                control_point_index = mesh.GetPolygonVertex(p, v)\n\n                if mesh_colors.GetMappingMode() == FbxLayerElement.eByControlPoint:\n                    if mesh_colors.GetReferenceMode() == FbxLayerElement.eDirect:\n                        poly_colors.append(control_point_index)\n                    elif mesh_colors.GetReferenceMode() == FbxLayerElement.eIndexToDirect:\n                        index = mesh_colors.GetIndexArray().GetAt(control_point_index)\n                        poly_colors.append(index)\n                elif mesh_colors.GetMappingMode() == FbxLayerElement.eByPolygonVertex:\n                    if mesh_colors.GetReferenceMode() == FbxLayerElement.eDirect:\n                        poly_colors.append(vertexId)\n                    elif mesh_colors.GetReferenceMode() == FbxLayerElement.eIndexToDirect:\n                        index = mesh_colors.GetIndexArray().GetAt(vertexId)\n                        poly_colors.append(index)\n                elif mesh_colors.GetMappingMode() == FbxLayerElement.eByPolygon or \\\n                     mesh_colors.GetMappingMode() ==  FbxLayerElement.eAllSame or \\\n                     mesh_colors.GetMappingMode() ==  FbxLayerElement.eNone:       \n                    print(\"unsupported color mapping mode for polygon vertex\")\n\n                vertexId += 1\n            color_indices.append(poly_colors)\n\n        layered_color_indices.append( color_indices )\n        layered_color_values.append( color_values )\n\n    color_values = []\n    color_indices = []\n\n    # Three.js only supports one layer of colors\n    if len(layered_color_values) > 0:\n        color_values = layered_color_values[0]\n        color_indices = layered_color_indices[0]\n\n    '''\n    # The Fbx SDK defaults mesh.Color to (0.8, 0.8, 0.8)\n    # This causes most models to receive incorrect vertex colors\n    if len(color_values) == 0:\n        color = mesh.Color.Get()\n        color_values = [[color[0], color[1], color[2]]]\n        color_indices = []\n        for p in range(poly_count):\n            poly_size = mesh.GetPolygonSize(p)\n            color_indices.append([0] * poly_size)\n    '''\n\n    return color_values, color_indices\n\ndef extract_fbx_vertex_uvs(mesh):\n#   eNone             The mapping is undetermined.\n#   eByControlPoint   There will be one mapping coordinate for each surface control point/vertex.\n#   eByPolygonVertex  There will be one mapping coordinate for each vertex, for every polygon of which it is a part. This means that a vertex will have as many mapping coordinates as polygons of which it is a part.\n#   eByPolygon        There can be only one mapping coordinate for the whole polygon.\n#   eByEdge           There will be one mapping coordinate for each unique edge in the mesh. This is meant to be used with smoothing layer elements.\n#   eAllSame          There can be only one mapping coordinate for the whole surface.\n\n    layered_uv_indices = []\n    layered_uv_values = []\n\n    poly_count = mesh.GetPolygonCount()\n    control_points = mesh.GetControlPoints() \n\n    for l in range(mesh.GetLayerCount()):\n        mesh_uvs = mesh.GetLayer(l).GetUVs()\n        if not mesh_uvs:\n            continue\n          \n        uvs_array = mesh_uvs.GetDirectArray()\n        uvs_count = uvs_array.GetCount()\n  \n        if uvs_count == 0:\n            continue\n\n        uv_indices = []\n        uv_values = []\n\n        # values\n        for i in range(uvs_count):\n            uv = uvs_array.GetAt(i)\n            uv = [uv[0], uv[1]]\n            uv_values.append(uv)\n\n        # indices\n        vertexId = 0\n        for p in range(poly_count):\n            poly_size = mesh.GetPolygonSize(p)\n            poly_uvs = []\n\n            for v in range(poly_size):\n                control_point_index = mesh.GetPolygonVertex(p, v)\n\n                if mesh_uvs.GetMappingMode() == FbxLayerElement.eByControlPoint:\n                    if mesh_uvs.GetReferenceMode() == FbxLayerElement.eDirect:\n                        poly_uvs.append(control_point_index)\n                    elif mesh_uvs.GetReferenceMode() == FbxLayerElement.eIndexToDirect:\n                        index = mesh_uvs.GetIndexArray().GetAt(control_point_index)\n                        poly_uvs.append(index)\n                elif mesh_uvs.GetMappingMode() == FbxLayerElement.eByPolygonVertex:\n                    uv_texture_index = mesh_uvs.GetIndexArray().GetAt(vertexId)\n                    \n                    if mesh_uvs.GetReferenceMode() == FbxLayerElement.eDirect or \\\n                       mesh_uvs.GetReferenceMode() == FbxLayerElement.eIndexToDirect:\n                        poly_uvs.append(uv_texture_index)\n                elif mesh_uvs.GetMappingMode() == FbxLayerElement.eByPolygon or \\\n                     mesh_uvs.GetMappingMode() ==  FbxLayerElement.eAllSame or \\\n                     mesh_uvs.GetMappingMode() ==  FbxLayerElement.eNone:       \n                    print(\"unsupported uv mapping mode for polygon vertex\")\n\n                vertexId += 1\n            uv_indices.append(poly_uvs)\n\n        layered_uv_values.append(uv_values)\n        layered_uv_indices.append(uv_indices)\n\n    return layered_uv_values, layered_uv_indices\n\n# #####################################################\n# Process Mesh Geometry\n# #####################################################\ndef generate_normal_key(normal):\n    return (round(normal[0], 6), round(normal[1], 6), round(normal[2], 6))\n\ndef generate_color_key(color):\n    return getHex(color)\n\ndef generate_uv_key(uv):\n    return (round(uv[0], 6), round(uv[1], 6))\n                \ndef append_non_duplicate_uvs(source_uvs, dest_uvs, counts):\n    source_layer_count = len(source_uvs)\n    for layer_index in range(source_layer_count):\n\n        dest_layer_count = len(dest_uvs)\n\n        if dest_layer_count <= layer_index:\n            dest_uv_layer = {}\n            count = 0\n            dest_uvs.append(dest_uv_layer)\n            counts.append(count)\n        else:\n            dest_uv_layer = dest_uvs[layer_index]\n            count = counts[layer_index]\n\n        source_uv_layer = source_uvs[layer_index]\n\n        for uv in source_uv_layer:\n            key = generate_uv_key(uv) \n            if key not in dest_uv_layer:\n                dest_uv_layer[key] = count\n                count += 1\n\n        counts[layer_index] = count\n\n    return counts\n\ndef generate_unique_normals_dictionary(mesh_list):\n    normals_dictionary = {}\n    nnormals = 0\n      \n    # Merge meshes, remove duplicate data\n    for mesh in mesh_list:\n        node = mesh.GetNode()\n        normal_values, normal_indices = extract_fbx_vertex_normals(mesh)\n\n        if len(normal_values) > 0:\n            for normal in normal_values:\n                key = generate_normal_key(normal) \n                if key not in normals_dictionary:\n                    normals_dictionary[key] = nnormals\n                    nnormals += 1\n\n    return normals_dictionary\n\ndef generate_unique_colors_dictionary(mesh_list):\n    colors_dictionary = {}\n    ncolors = 0\n      \n    # Merge meshes, remove duplicate data\n    for mesh in mesh_list:\n        color_values, color_indices = extract_fbx_vertex_colors(mesh)\n\n        if len(color_values) > 0:\n            for color in color_values:\n                key = generate_color_key(color) \n                if key not in colors_dictionary:\n                    colors_dictionary[key] = ncolors\n                    ncolors += 1\n\n    return colors_dictionary\n\ndef generate_unique_uvs_dictionary_layers(mesh_list):\n    uvs_dictionary_layers = []\n    nuvs_list = []\n\n    # Merge meshes, remove duplicate data\n    for mesh in mesh_list:\n        uv_values, uv_indices = extract_fbx_vertex_uvs(mesh)\n\n        if len(uv_values) > 0:\n            nuvs_list = append_non_duplicate_uvs(uv_values, uvs_dictionary_layers, nuvs_list)\n\n    return uvs_dictionary_layers\n\ndef generate_normals_from_dictionary(normals_dictionary):\n    normal_values = []\n    for key, index in sorted(normals_dictionary.items(), key = operator.itemgetter(1)):\n        normal_values.append(key)\n\n    return normal_values\n\ndef generate_colors_from_dictionary(colors_dictionary):\n    color_values = []\n    for key, index in sorted(colors_dictionary.items(), key = operator.itemgetter(1)):\n        color_values.append(key)\n\n    return color_values\n\ndef generate_uvs_from_dictionary_layers(uvs_dictionary_layers):\n    uv_values = []\n    for uvs_dictionary in uvs_dictionary_layers:\n        uv_values_layer = []    \n        for key, index in sorted(uvs_dictionary.items(), key = operator.itemgetter(1)):\n            uv_values_layer.append(key)\n        uv_values.append(uv_values_layer)\n\n    return uv_values\n\ndef generate_normal_indices_for_poly(poly_index, mesh_normal_values, mesh_normal_indices, normals_to_indices):\n    if len(mesh_normal_indices) <= 0:\n        return []\n\n    poly_normal_indices = mesh_normal_indices[poly_index]\n    poly_size = len(poly_normal_indices)\n\n    output_poly_normal_indices = []\n    for v in range(poly_size):\n        normal_index = poly_normal_indices[v]\n        normal_value = mesh_normal_values[normal_index]\n\n        key = generate_normal_key(normal_value)\n\n        output_index = normals_to_indices[key]\n        output_poly_normal_indices.append(output_index)\n\n    return output_poly_normal_indices\n\ndef generate_color_indices_for_poly(poly_index, mesh_color_values, mesh_color_indices, colors_to_indices):\n    if len(mesh_color_indices) <= 0:\n        return []\n\n    poly_color_indices = mesh_color_indices[poly_index]\n    poly_size = len(poly_color_indices)\n\n    output_poly_color_indices = []\n    for v in range(poly_size):\n        color_index = poly_color_indices[v]\n        color_value = mesh_color_values[color_index]\n\n        key = generate_color_key(color_value)\n\n        output_index = colors_to_indices[key]\n        output_poly_color_indices.append(output_index)\n\n    return output_poly_color_indices\n\ndef generate_uv_indices_for_poly(poly_index, mesh_uv_values, mesh_uv_indices, uvs_to_indices):\n    if len(mesh_uv_indices) <= 0:\n        return []\n\n    poly_uv_indices = mesh_uv_indices[poly_index]\n    poly_size = len(poly_uv_indices)\n\n    output_poly_uv_indices = []\n    for v in range(poly_size):\n        uv_index = poly_uv_indices[v]\n        uv_value = mesh_uv_values[uv_index]\n\n        key = generate_uv_key(uv_value)\n\n        output_index = uvs_to_indices[key]\n        output_poly_uv_indices.append(output_index)\n\n    return output_poly_uv_indices\n\ndef process_mesh_vertices(mesh_list):\n    vertex_offset = 0\n    vertex_offset_list = [0]\n    vertices = []\n    for mesh in mesh_list:\n        node = mesh.GetNode()\n        mesh_vertices = extract_fbx_vertex_positions(mesh)\n                \n        vertices.extend(mesh_vertices[:])\n        vertex_offset += len(mesh_vertices)\n        vertex_offset_list.append(vertex_offset)\n\n    return vertices, vertex_offset_list\n\n\ndef process_mesh_materials(mesh_list):\n    material_offset = 0\n    material_offset_list = [0]\n    materials_list = []\n\n    #TODO: remove duplicate mesh references\n    for mesh in mesh_list:\n        node = mesh.GetNode()\n                \n        material_count = node.GetMaterialCount()\n        if material_count > 0:\n            for l in range(mesh.GetLayerCount()):\n                materials = mesh.GetLayer(l).GetMaterials()\n                if materials:\n                    if materials.GetReferenceMode() == FbxLayerElement.eIndex:\n                        #Materials are in an undefined external table\n                        continue\n\n                    for i in range(material_count):\n                        material = node.GetMaterial(i)\n                        materials_list.append( material )\n\n                    material_offset += material_count\n                    material_offset_list.append(material_offset)\n\n    return materials_list, material_offset_list\n\ndef process_mesh_polygons(mesh_list, normals_to_indices, colors_to_indices, uvs_to_indices_list, vertex_offset_list, material_offset_list):\n    faces = []\n    for mesh_index in range(len(mesh_list)):\n        mesh = mesh_list[mesh_index]\n\n        flipWindingOrder = False\n        node = mesh.GetNode()\n        if node:\n            local_scale = node.EvaluateLocalScaling()\n            if local_scale[0] < 0 or local_scale[1] < 0 or local_scale[2] < 0:\n                flipWindingOrder = True\n\n        poly_count = mesh.GetPolygonCount()\n        control_points = mesh.GetControlPoints() \n\n        normal_values, normal_indices = extract_fbx_vertex_normals(mesh)\n        color_values, color_indices = extract_fbx_vertex_colors(mesh)\n        uv_values_layers, uv_indices_layers = extract_fbx_vertex_uvs(mesh)\n\n        for poly_index in range(poly_count):\n            poly_size = mesh.GetPolygonSize(poly_index)\n\n            face_normals = generate_normal_indices_for_poly(poly_index, normal_values, normal_indices, normals_to_indices)\n            face_colors = generate_color_indices_for_poly(poly_index, color_values, color_indices, colors_to_indices)\n\n            face_uv_layers = []\n            for l in range(len(uv_indices_layers)):\n                uv_values = uv_values_layers[l]\n                uv_indices = uv_indices_layers[l]\n                face_uv_indices = generate_uv_indices_for_poly(poly_index, uv_values, uv_indices, uvs_to_indices_list[l])\n                face_uv_layers.append(face_uv_indices)\n                \n            face_vertices = []\n            for vertex_index in range(poly_size):\n                control_point_index = mesh.GetPolygonVertex(poly_index, vertex_index)\n                face_vertices.append(control_point_index)\n\n            #TODO: assign a default material to any mesh without one\n            if len(material_offset_list) <= mesh_index:\n                material_offset = 0\n            else:\n                material_offset = material_offset_list[mesh_index]\n\n            vertex_offset = vertex_offset_list[mesh_index]\n            \n            if poly_size > 4:\n                new_face_normals = []\n                new_face_colors = []\n                new_face_uv_layers = []\n\n                for i in range(poly_size - 2):\n                    new_face_vertices = [face_vertices[0], face_vertices[i+1], face_vertices[i+2]]\n\n                    if len(face_normals):\n                        new_face_normals = [face_normals[0], face_normals[i+1], face_normals[i+2]]\n                    if len(face_colors):\n                        new_face_colors = [face_colors[0], face_colors[i+1], face_colors[i+2]]\n                    if len(face_uv_layers):\n                        new_face_uv_layers = []\n                        for layer in face_uv_layers:\n                            new_face_uv_layers.append([layer[0], layer[i+1], layer[i+2]])\n\n                    face = generate_mesh_face(mesh, \n                        poly_index,\n                        new_face_vertices,\n                        new_face_normals,\n                        new_face_colors,\n                        new_face_uv_layers,\n                        vertex_offset,\n                        material_offset,\n                        flipWindingOrder)\n                    faces.append(face)\n            else:\n                face = generate_mesh_face(mesh, \n                          poly_index,\n                          face_vertices,\n                          face_normals,\n                          face_colors,\n                          face_uv_layers,\n                          vertex_offset,\n                          material_offset,\n                          flipWindingOrder)\n                faces.append(face)\n\n    return faces\n\ndef generate_mesh_face(mesh, polygon_index, vertex_indices, normals, colors, uv_layers, vertex_offset, material_offset, flipOrder):\n    isTriangle = ( len(vertex_indices) == 3 )\n    nVertices = 3 if isTriangle else 4\n\n    hasMaterial = False\n    for l in range(mesh.GetLayerCount()):\n        materials = mesh.GetLayer(l).GetMaterials()\n        if materials:\n            hasMaterial = True\n            break\n                \n    hasFaceUvs = False\n    hasFaceVertexUvs = len(uv_layers) > 0\n    hasFaceNormals = False \n    hasFaceVertexNormals = len(normals) > 0\n    hasFaceColors = False \n    hasFaceVertexColors = len(colors) > 0\n\n    faceType = 0\n    faceType = setBit(faceType, 0, not isTriangle)\n    faceType = setBit(faceType, 1, hasMaterial)\n    faceType = setBit(faceType, 2, hasFaceUvs)\n    faceType = setBit(faceType, 3, hasFaceVertexUvs)\n    faceType = setBit(faceType, 4, hasFaceNormals)\n    faceType = setBit(faceType, 5, hasFaceVertexNormals)\n    faceType = setBit(faceType, 6, hasFaceColors)\n    faceType = setBit(faceType, 7, hasFaceVertexColors)\n\n    faceData = []\n\n    # order is important, must match order in JSONLoader\n\n    # face type\n    # vertex indices\n    # material index\n    # face uvs index\n    # face vertex uvs indices\n    # face color index\n    # face vertex colors indices\n\n    faceData.append(faceType)\n\n    if flipOrder:\n        if nVertices == 3:\n            vertex_indices = [vertex_indices[0], vertex_indices[2], vertex_indices[1]]\n            if hasFaceVertexNormals:\n                normals = [normals[0], normals[2], normals[1]]\n            if hasFaceVertexColors:\n                colors = [colors[0], colors[2], colors[1]]\n            if hasFaceVertexUvs:\n                tmp = []\n                for polygon_uvs in uv_layers:\n                    tmp.append([polygon_uvs[0], polygon_uvs[2], polygon_uvs[1]])\n                uv_layers = tmp\n        else:\n            vertex_indices = [vertex_indices[0], vertex_indices[3], vertex_indices[2], vertex_indices[1]]\n            if hasFaceVertexNormals:\n                normals = [normals[0], normals[3], normals[2], normals[1]]\n            if hasFaceVertexColors:\n                colors = [colors[0], colors[3], colors[2], colors[1]]\n            if hasFaceVertexUvs:\n                tmp = []\n                for polygon_uvs in uv_layers:\n                    tmp.append([polygon_uvs[0], polygon_uvs[3], polygon_uvs[2], polygon_uvs[3]])\n                uv_layers = tmp\n        \n    for i in range(nVertices):\n        index = vertex_indices[i] + vertex_offset\n        faceData.append(index)\n\n    if hasMaterial:\n        material_id = 0\n        for l in range(mesh.GetLayerCount()):\n            materials = mesh.GetLayer(l).GetMaterials()\n            if materials:\n                material_id = materials.GetIndexArray().GetAt(polygon_index)\n                break\n        material_id += material_offset\n        faceData.append( material_id )\n\n    if hasFaceVertexUvs:\n        for polygon_uvs in uv_layers:\n            for i in range(nVertices):\n                index = polygon_uvs[i]\n                faceData.append(index)\n\n    if hasFaceVertexNormals:\n        for i in range(nVertices):\n            index = normals[i]\n            faceData.append(index)\n\n    if hasFaceVertexColors:\n        for i in range(nVertices):\n            index = colors[i]\n            faceData.append(index)\n\n    return faceData \n\n# #####################################################\n# Generate Mesh Object (for scene output format) \n# #####################################################\ndef generate_scene_output(node):\n    mesh = node.GetNodeAttribute()\n\n    # This is done in order to keep the scene output and non-scene output code DRY\n    mesh_list = [ mesh ]\n\n    # Extract the mesh data into arrays\n    vertices, vertex_offsets = process_mesh_vertices(mesh_list)\n    materials, material_offsets = process_mesh_materials(mesh_list)\n\n    normals_to_indices = generate_unique_normals_dictionary(mesh_list)\n    colors_to_indices = generate_unique_colors_dictionary(mesh_list)\n    uvs_to_indices_list = generate_unique_uvs_dictionary_layers(mesh_list)\n    \n    normal_values = generate_normals_from_dictionary(normals_to_indices)\n    color_values = generate_colors_from_dictionary(colors_to_indices)\n    uv_values = generate_uvs_from_dictionary_layers(uvs_to_indices_list)\n\n    # Generate mesh faces for the Three.js file format\n    faces = process_mesh_polygons(mesh_list, \n                normals_to_indices,\n                colors_to_indices, \n                uvs_to_indices_list,\n                vertex_offsets, \n                material_offsets)\n\n    # Generate counts for uvs, vertices, normals, colors, and faces\n    nuvs = []\n    for layer_index, uvs in enumerate(uv_values):\n        nuvs.append(str(len(uvs)))\n\n    nvertices = len(vertices)\n    nnormals = len(normal_values)\n    ncolors = len(color_values)\n    nfaces = len(faces)\n\n    # Flatten the arrays, currently they are in the form of [[0, 1, 2], [3, 4, 5], ...]\n    vertices = [val for v in vertices for val in v]\n    normal_values = [val for n in normal_values for val in n]\n    color_values = [c for c in color_values]\n    faces = [val for f in faces for val in f]\n    uv_values = generate_uvs(uv_values)\n\n    # Disable automatic json indenting when pretty printing for the arrays\n    if option_pretty_print:\n        nuvs = NoIndent(nuvs)\n        vertices = ChunkedIndent(vertices, 15, True)\n        normal_values = ChunkedIndent(normal_values, 15, True)\n        color_values = ChunkedIndent(color_values, 15)\n        faces = ChunkedIndent(faces, 30)\n  \n    metadata = {\n      'vertices' : nvertices,\n      'normals' : nnormals,\n      'colors' : ncolors,\n      'faces' : nfaces,\n      'uvs' : nuvs\n    }\n\n    output = {\n      'scale' : 1,\n      'materials' : [],\n      'vertices' : vertices,\n      'normals' : [] if nnormals <= 0 else normal_values,\n      'colors' : [] if ncolors <= 0 else color_values,\n      'uvs' : uv_values,\n      'faces' : faces\n    }\n\n    if option_pretty_print:\n        output['0metadata'] = metadata\n    else:\n        output['metadata'] = metadata\n\n    return output\n\n# #####################################################\n# Generate Mesh Object (for non-scene output) \n# #####################################################\ndef generate_non_scene_output(scene):\n    mesh_list = generate_mesh_list(scene)\n\n    # Extract the mesh data into arrays\n    vertices, vertex_offsets = process_mesh_vertices(mesh_list)\n    materials, material_offsets = process_mesh_materials(mesh_list)\n\n    normals_to_indices = generate_unique_normals_dictionary(mesh_list)\n    colors_to_indices = generate_unique_colors_dictionary(mesh_list)\n    uvs_to_indices_list = generate_unique_uvs_dictionary_layers(mesh_list)\n    \n    normal_values = generate_normals_from_dictionary(normals_to_indices)\n    color_values = generate_colors_from_dictionary(colors_to_indices)\n    uv_values = generate_uvs_from_dictionary_layers(uvs_to_indices_list)\n\n    # Generate mesh faces for the Three.js file format\n    faces = process_mesh_polygons(mesh_list, \n                normals_to_indices,\n                colors_to_indices, \n                uvs_to_indices_list,\n                vertex_offsets, \n                material_offsets)\n\n    # Generate counts for uvs, vertices, normals, colors, and faces\n    nuvs = []\n    for layer_index, uvs in enumerate(uv_values):\n        nuvs.append(str(len(uvs)))\n\n    nvertices = len(vertices)\n    nnormals = len(normal_values)\n    ncolors = len(color_values)\n    nfaces = len(faces)\n\n    # Flatten the arrays, currently they are in the form of [[0, 1, 2], [3, 4, 5], ...]\n    vertices = [val for v in vertices for val in v]\n    normal_values = [val for n in normal_values for val in n]\n    color_values = [c for c in color_values]\n    faces = [val for f in faces for val in f]\n    uv_values = generate_uvs(uv_values)\n\n    # Disable json indenting when pretty printing for the arrays\n    if option_pretty_print:\n        nuvs = NoIndent(nuvs)\n        vertices = NoIndent(vertices)\n        normal_values = NoIndent(normal_values)\n        color_values = NoIndent(color_values)\n        faces = NoIndent(faces)\n\n    metadata = {\n      'formatVersion' : 3,\n      'type' : 'geometry',\n      'generatedBy' : 'convert-to-threejs.py',\n      'vertices' : nvertices,\n      'normals' : nnormals,\n      'colors' : ncolors,\n      'faces' : nfaces,\n      'uvs' : nuvs\n    }\n\n    output = {\n      'scale' : 1,\n      'materials' : [],\n      'vertices' : vertices,\n      'normals' : [] if nnormals <= 0 else normal_values,\n      'colors' : [] if ncolors <= 0 else color_values,\n      'uvs' : uv_values,\n      'faces' : faces\n    }\n\n    if option_pretty_print:\n        output['0metadata'] = metadata\n    else:\n        output['metadata'] = metadata\n\n    return output\n\ndef generate_mesh_list_from_hierarchy(node, mesh_list):\n    if node.GetNodeAttribute() == None:\n        pass\n    else:\n        attribute_type = (node.GetNodeAttribute().GetAttributeType())\n        if attribute_type == FbxNodeAttribute.eMesh or \\\n           attribute_type == FbxNodeAttribute.eNurbs or \\\n           attribute_type == FbxNodeAttribute.eNurbsSurface or \\\n           attribute_type == FbxNodeAttribute.ePatch:\n\n            if attribute_type != FbxNodeAttribute.eMesh:\n                converter.TriangulateInPlace(node);\n\n            mesh_list.append(node.GetNodeAttribute())\n\n    for i in range(node.GetChildCount()):\n        generate_mesh_list_from_hierarchy(node.GetChild(i), mesh_list)\n\ndef generate_mesh_list(scene):\n    mesh_list = []\n    node = scene.GetRootNode()\n    if node:\n        for i in range(node.GetChildCount()):\n            generate_mesh_list_from_hierarchy(node.GetChild(i), mesh_list)\n    return mesh_list\n\n# #####################################################\n# Generate Embed Objects \n# #####################################################\ndef generate_embed_dict_from_hierarchy(node, embed_dict):\n    if node.GetNodeAttribute() == None:\n        pass\n    else:\n        attribute_type = (node.GetNodeAttribute().GetAttributeType())\n        if attribute_type == FbxNodeAttribute.eMesh or \\\n           attribute_type == FbxNodeAttribute.eNurbs or \\\n           attribute_type == FbxNodeAttribute.eNurbsSurface or \\\n           attribute_type == FbxNodeAttribute.ePatch:\n\n            if attribute_type != FbxNodeAttribute.eMesh:\n                converter.TriangulateInPlace(node);\n\n            embed_object = generate_scene_output(node)\n            embed_name = getPrefixedName(node, 'Embed')\n            embed_dict[embed_name] = embed_object\n\n    for i in range(node.GetChildCount()):\n        generate_embed_dict_from_hierarchy(node.GetChild(i), embed_dict)\n\ndef generate_embed_dict(scene):\n    embed_dict = {}\n    node = scene.GetRootNode()\n    if node:\n        for i in range(node.GetChildCount()):\n            generate_embed_dict_from_hierarchy(node.GetChild(i), embed_dict)\n    return embed_dict\n\n# #####################################################\n# Generate Geometry Objects \n# #####################################################\ndef generate_geometry_object(node):\n\n    output = {\n      'type' : 'embedded',\n      'id' : getPrefixedName( node, 'Embed' )\n    }\n\n    return output\n\ndef generate_geometry_dict_from_hierarchy(node, geometry_dict):\n    if node.GetNodeAttribute() == None:\n        pass\n    else:\n        attribute_type = (node.GetNodeAttribute().GetAttributeType())\n        if attribute_type == FbxNodeAttribute.eMesh:\n            geometry_object = generate_geometry_object(node)\n            geometry_name = getPrefixedName( node, 'Geometry' )\n            geometry_dict[geometry_name] = geometry_object\n    for i in range(node.GetChildCount()):\n        generate_geometry_dict_from_hierarchy(node.GetChild(i), geometry_dict)\n\ndef generate_geometry_dict(scene):\n    geometry_dict = {}\n    node = scene.GetRootNode()\n    if node:\n        for i in range(node.GetChildCount()):\n            generate_geometry_dict_from_hierarchy(node.GetChild(i), geometry_dict)\n    return geometry_dict\n\n\n# #####################################################\n# Generate Light Node Objects\n# #####################################################\ndef generate_default_light():\n    direction = (1,1,1)\n    color = (1,1,1)\n    intensity = 80.0\n\n    output = {\n      'type': 'DirectionalLight',\n      'color': getHex(color),\n      'intensity': intensity/100.00,\n      'direction': serializeVector3( direction ),\n      'target': getObjectName( None )\n    }\n\n    return output\n\ndef generate_light_object(node):\n    light = node.GetNodeAttribute()\n    light_types = [\"point\", \"directional\", \"spot\", \"area\", \"volume\"]\n    light_type = light_types[light.LightType.Get()]\n\n    transform = node.EvaluateLocalTransform()\n    position = transform.GetT()\n\n    output = None\n\n    if light_type == \"directional\":\n\n        # Three.js directional lights emit light from a point in 3d space to a target node or the origin.\n        # When there is no target, we need to take a point, one unit away from the origin, and move it \n        # into the right location so that the origin acts like the target\n        \n        if node.GetTarget():\n            direction = position\n        else:\n            translation = FbxVector4(0,0,0,0)\n            scale = FbxVector4(1,1,1,1)\n            rotation = transform.GetR()\n            matrix = FbxMatrix(translation, rotation, scale)\n            direction = matrix.MultNormalize(FbxVector4(0,1,0,1)) \n\n        output = {\n\n          'type': 'DirectionalLight',\n          'color': getHex(light.Color.Get()),\n          'intensity': light.Intensity.Get()/100.0,\n          'direction': serializeVector3( direction ),\n          'target': getObjectName( node.GetTarget() ) \n\n        }\n\n    elif light_type == \"point\":\n\n        output = {\n\n          'type': 'PointLight',\n          'color': getHex(light.Color.Get()),\n          'intensity': light.Intensity.Get()/100.0,\n          'position': serializeVector3( position ),\n          'distance': light.FarAttenuationEnd.Get()\n\n        }\n\n    elif light_type == \"spot\":\n\n        output = {\n\n          'type': 'SpotLight',\n          'color': getHex(light.Color.Get()),\n          'intensity': light.Intensity.Get()/100.0,\n          'position': serializeVector3( position ),\n          'distance': light.FarAttenuationEnd.Get(),\n          'angle': light.OuterAngle.Get()*math.pi/180,\n          'exponent': light.DecayType.Get(),\n          'target': getObjectName( node.GetTarget() ) \n\n        }\n\n    return output\n\ndef generate_ambient_light(scene):\n\n    scene_settings = scene.GetGlobalSettings()\n    ambient_color = scene_settings.GetAmbientColor()\n    ambient_color = (ambient_color.mRed, ambient_color.mGreen, ambient_color.mBlue)\n\n    if ambient_color[0] == 0 and ambient_color[1] == 0 and ambient_color[2] == 0:\n        return None\n\n    output = {\n\n      'type': 'AmbientLight',\n      'color': getHex(ambient_color)\n\n    }\n\n    return output\n    \n# #####################################################\n# Generate Camera Node Objects\n# #####################################################\ndef generate_default_camera():\n    position = (100, 100, 100)\n    near = 0.1\n    far = 1000\n    fov = 75\n\n    output = {\n      'type': 'PerspectiveCamera',\n      'fov': fov,\n      'near': near,\n      'far': far,\n      'position': serializeVector3( position ) \n    }\n\n    return output\n\ndef generate_camera_object(node):\n    camera = node.GetNodeAttribute()\n    position = camera.Position.Get()\n  \n    projection_types = [ \"perspective\", \"orthogonal\" ]\n    projection = projection_types[camera.ProjectionType.Get()]\n\n    near = camera.NearPlane.Get()\n    far = camera.FarPlane.Get()\n\n    name = getObjectName( node )\n    output = {}\n\n    if projection == \"perspective\":\n\n        aspect = camera.PixelAspectRatio.Get()\n        fov = camera.FieldOfView.Get()\n\n        output = {\n\n          'type': 'PerspectiveCamera',\n          'fov': fov,\n          'aspect': aspect,\n          'near': near,\n          'far': far,\n          'position': serializeVector3( position )\n\n        }\n\n    elif projection == \"orthogonal\":\n\n        left = \"\"\n        right = \"\"\n        top = \"\"\n        bottom = \"\"\n\n        output = {\n\n          'type': 'PerspectiveCamera',\n          'left': left,\n          'right': right,\n          'top': top,\n          'bottom': bottom,\n          'near': near,\n          'far': far,\n          'position': serializeVector3( position )\n\n        }\n\n    return output\n\n# #####################################################\n# Generate Camera Names\n# #####################################################\ndef generate_camera_name_list_from_hierarchy(node, camera_list):\n    if node.GetNodeAttribute() == None:\n        pass\n    else:\n        attribute_type = (node.GetNodeAttribute().GetAttributeType())\n        if attribute_type == FbxNodeAttribute.eCamera:\n            camera_string = getObjectName(node) \n            camera_list.append(camera_string)\n    for i in range(node.GetChildCount()):\n        generate_camera_name_list_from_hierarchy(node.GetChild(i), camera_list)\n\ndef generate_camera_name_list(scene):\n    camera_list = []\n    node = scene.GetRootNode()\n    if node:\n        for i in range(node.GetChildCount()):\n            generate_camera_name_list_from_hierarchy(node.GetChild(i), camera_list)\n    return camera_list\n\n# #####################################################\n# Generate Mesh Node Object \n# #####################################################\ndef generate_mesh_object(node):\n    mesh = node.GetNodeAttribute()\n    transform = node.EvaluateLocalTransform()\n    position = transform.GetT()\n    scale = transform.GetS()\n    rotation = getRadians(transform.GetR())\n    quaternion = transform.GetQ()\n\n    material_count = node.GetMaterialCount()\n    material_name = \"\"\n\n    if material_count > 0:\n        material_names = []\n        for l in range(mesh.GetLayerCount()):\n            materials = mesh.GetLayer(l).GetMaterials()\n            if materials:\n                if materials.GetReferenceMode() == FbxLayerElement.eIndex:\n                    #Materials are in an undefined external table\n                    continue\n                for i in range(material_count):\n                    material = node.GetMaterial(i)\n                    material_names.append( getMaterialName(material) )\n\n        if not material_count > 1 and not len(material_names) > 0:\n            material_names.append('')\n\n        #If this mesh has more than one material, use a proxy material\n        material_name = getMaterialName( node, True) if material_count > 1 else material_names[0] \n\n    output = {\n      'geometry': getPrefixedName( node, 'Geometry' ),\n      'material': material_name,\n      'position': serializeVector3( position ),\n      'quaternion': serializeVector4( quaternion ),\n      'scale': serializeVector3( scale ),\n      'visible': True,\n    }\n\n    return output\n\n# #####################################################\n# Generate Node Object \n# #####################################################\ndef generate_object(node):\n    node_types = [\"Unknown\", \"Null\", \"Marker\", \"Skeleton\", \"Mesh\", \"Nurbs\", \"Patch\", \"Camera\", \n    \"CameraStereo\", \"CameraSwitcher\", \"Light\", \"OpticalReference\", \"OpticalMarker\", \"NurbsCurve\", \n    \"TrimNurbsSurface\", \"Boundary\", \"NurbsSurface\", \"Shape\", \"LODGroup\", \"SubDiv\", \"CachedEffect\", \"Line\"]\n\n    transform = node.EvaluateLocalTransform()\n    position = transform.GetT()\n    scale = transform.GetS()\n    rotation = getRadians(transform.GetR())\n    quaternion = transform.GetQ()\n\n    node_type = \"\"\n    if node.GetNodeAttribute() == None:\n        node_type = \"Null\"\n    else:\n        node_type = node_types[node.GetNodeAttribute().GetAttributeType()]\n\n    name = getObjectName( node )\n    output = {\n      'fbx_type': node_type,\n      'position': serializeVector3( position ),\n      'quaternion': serializeVector4( quaternion ),\n      'scale': serializeVector3( scale ),\n      'visible': True\n    }\n\n    return output\n\n# #####################################################\n# Parse Scene Node Objects \n# #####################################################\ndef generate_object_hierarchy(node, object_dict):\n    object_count = 0\n    if node.GetNodeAttribute() == None:\n        object_data = generate_object(node)\n    else:\n        attribute_type = (node.GetNodeAttribute().GetAttributeType())\n        if attribute_type == FbxNodeAttribute.eMesh:\n            object_data = generate_mesh_object(node)\n        elif attribute_type == FbxNodeAttribute.eLight:\n            object_data = generate_light_object(node)\n        elif attribute_type == FbxNodeAttribute.eCamera:\n            object_data = generate_camera_object(node)\n        else:\n            object_data = generate_object(node)\n\n    object_count += 1\n    object_name = getObjectName(node)\n\n    object_children = {}\n    for i in range(node.GetChildCount()):\n        object_count += generate_object_hierarchy(node.GetChild(i), object_children)\n\n    if node.GetChildCount() > 0:\n        # Having 'children' above other attributes is hard to read.\n        # We can send it to the bottom using the last letter of the alphabet 'z'. \n        # This letter is removed from the final output.\n        if option_pretty_print:\n            object_data['zchildren'] = object_children\n        else:\n            object_data['children'] = object_children\n\n    object_dict[object_name] = object_data\n\n    return object_count\n\ndef generate_scene_objects(scene):\n    object_count = 0\n    object_dict = {}\n\n    ambient_light = generate_ambient_light(scene)\n    if ambient_light:\n        object_dict['AmbientLight'] = ambient_light\n        object_count += 1\n\n    if option_default_light:\n        default_light = generate_default_light()\n        object_dict['DefaultLight'] = default_light\n        object_count += 1\n\n    if option_default_camera:\n        default_camera = generate_default_camera()\n        object_dict['DefaultCamera'] = default_camera\n        object_count += 1\n\n    node = scene.GetRootNode()\n    if node:\n        for i in range(node.GetChildCount()):\n            object_count += generate_object_hierarchy(node.GetChild(i), object_dict)\n\n    return object_dict, object_count\n\n# #####################################################\n# Generate Scene Output\n# #####################################################\ndef extract_scene(scene, filename):\n    global_settings = scene.GetGlobalSettings()\n    objects, nobjects = generate_scene_objects(scene)\n\n    textures = generate_texture_dict(scene)\n    materials = generate_material_dict(scene)\n    geometries = generate_geometry_dict(scene)\n    embeds = generate_embed_dict(scene)\n\n    ntextures = len(textures)\n    nmaterials = len(materials)\n    ngeometries = len(geometries)\n\n    position = serializeVector3( (0,0,0) )\n    rotation = serializeVector3( (0,0,0) )\n    scale    = serializeVector3( (1,1,1) )\n\n    camera_names = generate_camera_name_list(scene)\n    scene_settings = scene.GetGlobalSettings()\n\n    # This does not seem to be any help here\n    # global_settings.GetDefaultCamera() \n\n    defcamera = camera_names[0] if len(camera_names) > 0 else \"\"\n    if option_default_camera:\n      defcamera = 'default_camera'\n\n    metadata = {\n      'formatVersion': 3.2,\n      'type': 'scene',\n      'generatedBy': 'convert-to-threejs.py',\n      'objects': nobjects,\n      'geometries': ngeometries,\n      'materials': nmaterials,\n      'textures': ntextures\n    }\n\n    transform = {\n      'position' : position,\n      'rotation' : rotation,\n      'scale' : scale\n    }\n\n    defaults = {\n      'bgcolor' : 0,\n      'camera' : defcamera,\n      'fog' : ''\n    }\n\n    output = {\n      'objects': objects,\n      'geometries': geometries,\n      'materials': materials,\n      'textures': textures,\n      'embeds': embeds,\n      'transform': transform,\n      'defaults': defaults,\n    }\n\n    if option_pretty_print:\n        output['0metadata'] = metadata\n    else:\n        output['metadata'] = metadata\n\n    return output\n\n# #####################################################\n# Generate Non-Scene Output \n# #####################################################\ndef extract_geometry(scene, filename):\n    output = generate_non_scene_output(scene)\n    return output\n\n# #####################################################\n# File Helpers\n# #####################################################\ndef write_file(filepath, content):\n    index = filepath.rfind('/')\n    dir = filepath[0:index]\n    \n    #if not os.path.exists(dir):\n        #os.makedirs(dir)\n    \n    out = open(filepath, \"w\")\n    out.write(content.encode('utf8', 'replace'))\n    out.close()\n\ndef read_file(filepath):\n    f = open(filepath)\n    content = f.readlines()\n    f.close()\n    return content\n\ndef copy_textures(textures):\n    texture_dict = {}\n    \n    for key in textures:\n        url = textures[key]['fullpath']        \n        #src = replace_OutFolder2inFolder(url)\n\n        #print( src )\n        #print( url )\n\n        if url in texture_dict:  # texture has been copied\n            continue\n        \n        if not os.path.exists(url):\n            print(\"copy_texture error: we can't find this texture at \" + url)\n            continue\n                \n        try:\n            index = url.rfind('/')\n            if index == -1:\n                index = url.rfind( '\\\\' )\n            filename = url[index+1:len(url)]\n            saveFolder = \"maps\"\n            saveFilename = saveFolder + \"/\" + filename\n            #print( src )\n            #print( url )\n            #print( saveFilename )\n            if not os.path.exists(saveFolder):\n                os.makedirs(saveFolder)\n            shutil.copyfile(url, saveFilename)\n            texture_dict[url] = True\n        except IOError as e:\n            print \"I/O error({0}): {1} {2}\".format(e.errno, e.strerror, url)\n\ndef findFilesWithExt(directory, ext, include_path = True):\n    ext = ext.lower()\n    found = []\n    for root, dirs, files in os.walk(directory):\n        for filename in files:\n            current_ext = os.path.splitext(filename)[1].lower()\n            if current_ext == ext:\n                if include_path:\n                    found.append(os.path.join(root, filename))    \n                else:\n                    found.append(filename)\n    return found\n\n# #####################################################\n# main\n# #####################################################\nif __name__ == \"__main__\":\n    from optparse import OptionParser\n\n    try:\n        from FbxCommon import *\n    except ImportError:\n        import platform\n        msg = 'Could not locate the python FBX SDK!\\n'\n        msg += 'You need to copy the FBX SDK into your python install folder such as '\n        if platform.system() == 'Windows' or platform.system() == 'Microsoft':\n            msg += '\"Python26/Lib/site-packages\"'\n        elif platform.system() == 'Linux':\n            msg += '\"/usr/local/lib/python2.6/site-packages\"'\n        elif platform.system() == 'Darwin':\n            msg += '\"/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages\"'        \n        msg += ' folder.'\n        print(msg)\n        sys.exit(1)\n    \n    usage = \"Usage: %prog [source_file.fbx] [output_file.js] [options]\"\n    parser = OptionParser(usage=usage)\n\n    parser.add_option('-t', '--triangulate', action='store_true', dest='triangulate', help=\"force quad geometry into triangles\", default=False)\n    parser.add_option('-x', '--ignore-textures', action='store_true', dest='notextures', help=\"don't include texture references in output file\", default=False)\n    parser.add_option('-n', '--no-texture-copy', action='store_true', dest='notexturecopy', help=\"don't copy texture files\", default=False)\n    parser.add_option('-u', '--force-prefix', action='store_true', dest='prefix', help=\"prefix all object names in output file to ensure uniqueness\", default=False)\n    parser.add_option('-f', '--flatten-scene', action='store_true', dest='geometry', help=\"merge all geometries and apply node transforms\", default=False)\n    parser.add_option('-y', '--force-y-up', action='store_true', dest='forceyup', help=\"ensure that the y axis shows up\", default=False)\n    parser.add_option('-c', '--add-camera', action='store_true', dest='defcamera', help=\"include default camera in output scene\", default=False)\n    parser.add_option('-l', '--add-light', action='store_true', dest='deflight', help=\"include default light in output scene\", default=False)\n    parser.add_option('-p', '--pretty-print', action='store_true', dest='pretty', help=\"prefix all object names in output file\", default=False)\n\n    (options, args) = parser.parse_args()\n\n    option_triangulate = options.triangulate \n    option_textures = True if not options.notextures else False\n    option_copy_textures = True if not options.notexturecopy else False\n    option_prefix = options.prefix\n    option_geometry = options.geometry \n    option_forced_y_up = options.forceyup\n    option_default_camera = options.defcamera \n    option_default_light = options.deflight \n    option_pretty_print = options.pretty \n\n    # Prepare the FBX SDK.\n    sdk_manager, scene = InitializeSdkObjects()\n    converter = FbxGeometryConverter(sdk_manager)\n\n    # The converter takes an FBX file as an argument.\n    if len(args) > 1:\n        print(\"\\nLoading file: %s\" % args[0])\n        result = LoadScene(sdk_manager, scene, args[0])\n    else:\n        result = False\n        print(\"\\nUsage: convert_fbx_to_threejs [source_file.fbx] [output_file.js]\\n\")\n\n    if not result:\n        print(\"\\nAn error occurred while loading the file...\")\n    else:\n        if option_triangulate:\n            print(\"\\nForcing geometry to triangles\")\n            triangulate_scene(scene)\n            \n        axis_system = FbxAxisSystem.MayaYUp\n        \n        if not option_forced_y_up:\n            # According to asset's coordinate to convert scene \n            upVector = scene.GetGlobalSettings().GetAxisSystem().GetUpVector();\n            if upVector[0] == 3:\n                axis_system = FbxAxisSystem.MayaZUp\n        \n        axis_system.ConvertScene(scene)\n        \n        inputFolder = args[0].replace( \"\\\\\", \"/\" );\n        index = args[0].rfind( \"/\" );\n        inputFolder = inputFolder[:index]\n\n        outputFolder = args[1].replace( \"\\\\\", \"/\" );\n        index = args[1].rfind( \"/\" );\n        outputFolder = outputFolder[:index]\n         \n        if option_geometry:\n            output_content = extract_geometry(scene, os.path.basename(args[0]))\n        else:\n            output_content = extract_scene(scene, os.path.basename(args[0]))\n\n        if option_pretty_print:\n            output_string = json.dumps(output_content, indent=4, cls=CustomEncoder, separators=(',', ': '), sort_keys=True)\n            output_string = executeRegexHacks(output_string)\n        else:\n            output_string = json.dumps(output_content, separators=(',', ': '), sort_keys=True)\n\n\n        output_path = os.path.join(os.getcwd(), args[1])\n        write_file(output_path, output_string)\n        \n        if option_copy_textures:\n            copy_textures( output_content['textures'] )       \n\n        print(\"\\nExported Three.js file to:\\n%s\\n\" % output_path)\n\n    # Destroy all objects created by the FBX SDK.\n    sdk_manager.Destroy()\n    sys.exit(0)\n"
  },
  {
    "path": "views/assetBrowser/assetsFrame.handlebars",
    "content": "<div class=\"assets-frame scrollbar\">\n\t{{#each groups}}\n\t<div class=\"assets-group\">\n\t\t<span class=\"group-title\">{{groupTitle}}</span>\n\t\t<ul class=\"assets-list\">\n\t\t\t{{#each assets}}\n\t\t\t<li class=\"{{#if isFirst}}active{{/if}}\">\n\t\t\t\t<svg class=\"icon-asset\">\n\t\t\t\t\t<use xlink:href=\"#icon-asset-default\"></use>\n\t\t\t\t</svg>\n\t\t\t\t<span>{{name}}</span>\n\t\t\t</li>\n\t\t\t{{/each}}\n\t\t</ul>\n\t</div>\n\t{{/each}}\n</div>\n"
  },
  {
    "path": "views/chat/message.handlebars",
    "content": "<div class=\"message clearfix\">\n\t<div class=\"icon\" style=\"background-color: {{color}}\"></div>\n\t<p class=\"meta\">\n\t\t<span class=\"username\">{{from}}</span>\n\t\t<time>{{date}}</time>\n\t</p>\n\t<p>{{{message}}}</p>\n</div>"
  },
  {
    "path": "views/chat/meta.handlebars",
    "content": "<div class=\"message\">\n\t<div class=\"meta\">\n\t\t<span class=\"username\">{{from}}</span>\n\t\t<span class=\"text\"><i>{{message}}</i></span>\n\t</div>\n</div>\n\n"
  },
  {
    "path": "views/editor.handlebars",
    "content": "<noscript>\n\t<div class=\"nojs\">\n\t\t<div style=\"float: left; margin-right: 8px;\"><img src=\"/images/warning.png\" width=\"64px\" height=\"64px\" /></div>\n\t\t<div style=\"padding-top: 4px;\">This page requires javascript in order to display properly. If you're running a script blocker - such as NoScript - please whitelist this page. If you have disabled javascript in your browser, please enable it and reload (F5).</div>\n\t</div>\n</noscript>\n{{> srv/siteSvgSprite}}\n{{> srv/editorSvgSprite}}\n<header id=\"editor-header\" class=\"clearfix\">\n\t<div class=\"editor-header clearfix\">\n\t\t<div id=\"top-header-logo\">\n\t\t\t<a id=\"logo-link\"\n                {{#if user.username}}\n                    href=\"/{{user.username}}\" title=\"Back to your profile page\"\n                {{else}}\n                    href=\"/\" title=\"Back to the homepage\"\n                {{/if}}\n\n            ><svg class=\"vizor-top-logo\"><use xlink:href=\"#editor-patches-wordmark\"></use></svg></a>\n            <!-- p>from <a target=\"_blank\" href=\"http://vizor.io\">Vizor</a></p -->\n\t\t</div>\n\t\t<div class=\"menu-bar\">\n\t\t\t<div class=\"buttons button-group\" id=\"grpFileIO\" >\n\t\t\t\t<button class=\"btn svg\" id=\"btn-new\" data-svgref=\"icon-new-graph\"><svg /> New</button>\n\t\t\t\t<button class=\"btn svg\" id=\"fork-button\" data-svgref=\"icon-duplicate\"><svg /> Duplicate</button>\n\t\t\t</div>\n\t\t\t<div class=\"buttons button-group\" id=\"grpTransform\">\n\t\t\t\t<button class=\"svg btn\" id=\"btn-move\" data-svgref=\"icon-move\"><svg /> Move</button>\n\t\t\t\t<button class=\"svg btn\" id=\"btn-scale\" data-svgref=\"icon-scale\"><svg /> Scale</button>\n\t\t\t\t<button class=\"svg btn\" id=\"btn-rotate\" data-svgref=\"icon-rotate\"><svg /> Rotate</button>\n\t\t\t</div>\n\n\t\t\t{{!--\n\t\t\t<div class=\"buttons button-group\" id=\"grpZoom\">\n\t\t\t\t<button class=\"btn svg zoom\" id=\"btn-zoom-in\" data-svgref=\"icon-zoom-in\" /><button class=\"btn svg zoom\" id=\"btn-zoom\" data-svgref=\"icon-zoom\"><svg />\n\t\t\t\t\t<span id=\"current-zoom\">100%</span>\n\t\t\t\t</button><button class=\"btn svg zoom\" id=\"btn-zoom-out\" data-svgref=\"icon-zoom-out\" />\n\t\t\t</div>\n\t\t\t--}}\n\n\t\t\t<div class=\"buttons button-group\" id=\"grpPatchControls\">\n\t\t\t\t<button class=\"svg btn\" id=\"btn-save-patch\" data-svgref=\"icon-save-patch\"><svg /> Save Patch</button>\n\t\t\t</div>\n\n\t\t\t<div class=\"spacer\"></div>\n\n\t\t\t<div class=\"buttons button-group\" id=\"grpToggles\">\n                <button class=\"svg btn\" id=\"btn-inspector\" data-svgref=\"icon-inspector\"><svg /> Inspector</button>\n\t\t\t\t<button class=\"btn svg\" id=\"btn-patches\" data-svgref=\"icon-patches\"><svg /> Patches</button>\n\t\t\t\t{{!-- <button class=\"btn svg\" id=\"btn-graph\" data-svgref=\"icon-graph\"><svg /> Graph</button>\n\t\t\t\t\t#676 <button class=\"btn\" id=\"btn-assets\" data-svgref=\"icon-assets\"><svg /> Assets</button> --}}\n\t\t\t\t<button class=\"btn svg ui_off\" id=\"btn-hide-all\" data-svgref=\"icon-hide-all\"><svg /> Hide All</button>\n\t\t\t</div>\n\n\t\t\t<div class=\"spacer\"></div>\n\n\t\t\t<div class=\"buttons button-group\" id=\"grpElse\">\n\t\t\t\t<button class=\"btn svg\" id=\"btn-publish\" data-svgref=\"icon-publish\"><svg /> Publish</button>\n\t\t\t\t<button class=\"btn svg\" id=\"btn-help\" data-svgref=\"icon-button-help\"><svg /> Help</button>\n\t\t\t\t<div id=\"account\" class=\"button\">\n                    {{>userpulldown user}}\n                </div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n\t<div id=\"row2\">\n\t\t<div id=\"modeSwitcher\">\n\t\t\t<button id=\"buildModeBtn\" class=\"svg\" data-svgref=\"icon-mode-build\"><svg />Build</button>\n\t\t\t<button id=\"programModeBtn\" class=\"svg\" data-svgref=\"icon-mode-patch\"><svg />Program</button>\n\t\t</div>\n\t\t<div id=\"graphNameLabel\" class=\"auto-editable\">\n\t\t\t{{#if graph}}\n                {{graph.name}}\n            {{else}}\n                (untitled)\n\t\t\t{{/if}}\n\t\t</div>\n\t\t<div id=\"graphSizeLabel\"></div>\n\t\t<div id=\"breadcrumb\"></div>\n\t</div>\n</header>\n<div id=\"progressbar\"></div>\n\n<pre class=\"info-pane\" id=\"dbg\"></pre>\n\n<div id=\"canvases\">\n\n<div id=\"properties-panel\" class=\"properties-block vp-library floating-box\" style=\"display:none\">\n    <div class=\"block-header\">\n        <button class=\"toggle-button\" id=\"properties-toggle\" type=\"button\">\n            <svg class=\"icon-arrow-vertical\"><use xlink:href=\"#icon-arrow-vertical\"></use></svg>\n        </button>\n         <ul class=\"nav nav-tabs\">\n            <li class=\"active ui_on\"><a href=\"#obj3dPropertiesPane\">Properties</a></li>\n            <li><a href=\"#nodePropertiesPane\">Node</a></li>\n         </ul>\n        <button class=\"close-button\" id=\"properties-close\" type=\"button\">\n            <svg class=\"icon-assets-close\"><use xlink:href=\"#icon-close\"></use></svg>\n        </button>\n    </div>\n    <div class=\"tab-content\">\n        <div class=\"tab-pane active\" id=\"obj3dPropertiesPane\"></div>\n        <div class=\"tab-pane\" id=\"nodePropertiesPane\"></div>\n    </div>\n</div>\n\n<div class=\"shader-block floating-box\" id=\"shader-block\" style=\"display:none\">\n\t\t<div class=\"block-header\">\n\t\t\t<button class=\"toggle-button\" id=\"shader-toggle\" type=\"button\">\n\t\t\t\t<svg class=\"icon-arrow-vertical\"><use xlink:href=\"#icon-arrow-vertical\"></use></svg>\n\t\t\t</button>\n\t\t\t<ul class=\"nav nav-tabs\" role=\"tablist\">\n\t\t\t</ul>\n\t\t\t<button class=\"close-button\" id=\"shader-close\" type=\"button\">\n\t\t\t\t<svg class=\"icon-assets-close\"><use xlink:href=\"#icon-close\"></use></svg>\n\t\t\t</button>\n\t\t</div>\n\t\t<div class=\"tab-content\"></div>\n</div>\n\n<div class=\"patches-block vp-library floating-box uiopen\" id=\"patches-lib\">\n\t\t<div class=\"block-header\">\n\t\t\t<button class=\"toggle-button\" id=\"patches-toggle\" type=\"button\">\n\t\t\t\t<svg class=\"icon-arrow-vertical\"><use xlink:href=\"#icon-arrow-vertical\"></use></svg>\n\t\t\t</button>\n\t\t\t<ul class=\"nav nav-tabs\">\n\t\t\t\t<li><a href=\"#objects\">Objects</a></li>\n\t\t\t\t<li><a href=\"#patches\">Patches</a></li>\n\t\t\t\t{{!-- <li><a href=\"#graph\">Tree</a></li> --}}\n\t\t\t</ul>\n\t\t\t<button class=\"close-button\" id=\"patches-close\" type=\"button\">\n\t\t\t\t<svg class=\"icon-assets-close\"><use xlink:href=\"#icon-close\"></use></svg>\n\t\t\t</button>\n\t\t</div>\n\t\t<div class=\"tab-content\">\n\t\t\t<div class=\"tab-pane active\" id=\"patches\">\n\t\t\t</div>\n\t\t\t<div class=\"tab-pane\" id=\"objects\">\n\t\t\t</div>\n\t\t\t{{!-- <div role=\"tabpanel\" class=\"tab-pane\" id=\"graph\">\n\t\t\t\t<div class=\"cell\" id=\"structure\"></div>\n\t\t\t</div> --}}\n\t\t</div>\n\n</div>\n\n\n<div class=\"chat-users floating-box uiopen\" id=\"chat-window\">\n\t<div class=\"chat-tabs block-header\">\n\t\t<button class=\"toggle-button\" id=\"chat-toggle\" type=\"button\">\n\t\t\t<svg class=\"icon-arrow-vertical\"><use xlink:href=\"#icon-arrow-vertical\"></use></svg>\n\t\t</button>\n\t\t<ul class=\"nav nav-tabs\" role=\"tablist\">\n\t\t\t<li class=\"active\">\n\t\t\t\t<a href=\"#chatTab\" id=\"chatTabBtn\">Chat</a>\n\t\t\t</li>\n\t\t\t<li>\n\t\t\t\t<a href=\"#peopleTab\" id=\"peopleTabBtn\">Users</a>\n\t\t\t</li>\n\t\t</ul>\n\t\t<button class=\"close-button\" id=\"chat-close\" type=\"button\">\n\t\t\t<svg class=\"icon-chat-close\"><use xlink:href=\"#icon-close\"></use></svg>\n\t\t</button>\n\t</div>\n\t<div class=\"tab-content\">\n\t\t<div role=\"tabpanel\" class=\"tab-pane\" id=\"chatTab\">\n\t\t\t<div class=\"chat-nav\">\n\t\t\t\t<a href=\"#globalchat\">Global</a><svg class=\"breadcrumb-separator\"><use xlink:href=\"#breadcrumb-separator\"></use></svg><span>Graph</span>\n\t\t\t</div>\n\t\t\t<div class=\"messages scrollbar\"></div>\n\t\t\t<div class=\"composer\">\n\t\t\t\t<input type=\"text\" name=\"message\" id=\"new-message-input\" maxlength=\"1000\">\n\t\t\t</div>\n\t\t</div>\n\t\t<div role=\"tabpanel\" class=\"tab-pane\" id=\"peopleTab\">\n\t\t</div>\n\t</div>\n\t<div class=\"resize-handle\"></div>\n</div>\n\n\t<canvas id=\"webgl-canvas\"\n\t\tclass=\"webgl-canvas-normal\"\n\t\twidth=\"940\"\n\t\theight=\"620\"\n\t\toncontextmenu=\"return false;\">\n\t</canvas>\n\n\t<div id=\"canvas_parent\" class=\"scrollbar\">\n\t\t<canvas id=\"canvas\" width=\"940\" height=\"620\">\n\t\t<!-- editor noodles -->\n\t\t</canvas>\n\t</div>\n</div>\n<footer id=\"editor-footer\" class=\"bottom-panel\">\n\t<button class=\"btn show-timeline\" id=\"btn-timeline\" data-toggle=\"popover\" data-placement=\"top\" title=\"Toggle timeline\" style=\"display: none;\">\n\t\t<svg class=\"icon-timeline\"><use xlink:href=\"#icon-timeline\"></use></svg>\n\t\t<span>Show</span>\n\t</button>\n\t<ul class=\"playback-controls\">\n\t\t<li class=\"play-pause active\">\n\t\t\t<button class=\"btn\" id=\"play\" data-toggle=\"popover\" data-placement=\"top\" title=\"Play/Pause\">\n\t\t\t\t<svg class=\"icon-pause\"><use xlink:href=\"#icon-play\"></use></svg>\n\t\t\t</button>\n\t\t</li>\n\t\t<li class=\"stop\">\n\t\t\t<button class=\"btn\" id=\"stop\" data-toggle=\"popover\" data-placement=\"top\" title=\"Stop\">\n\t\t\t\t<svg class=\"icon-pause\"><use xlink:href=\"#icon-stop\"></use></svg>\n\t\t\t</button>\n\t\t</li>\n\t\t<li class=\"fscreen\">\n\t\t\t<button class=\"btn\" id=\"fullscreen\" data-toggle=\"popover\" data-placement=\"top\" title=\"Fullscreen\">\n\t\t\t\t<svg class=\"icon-fscreen\"><use xlink:href=\"#icon-fullscreen\"></use></svg>\n\t\t\t</button>\n\t\t</li>\n\t\t<li class=\"vrview\" style=\"display: none;\">\n\t\t\t<button class=\"btn\" id=\"vrview\" data-toggle=\"popover\" data-placement=\"top\" title=\"View in VR\">\n\t\t\t\t<svg class=\"icon-vr\"><use xlink:href=\"#icon-vr\"></use></svg>\n\t\t\t</button>\n\t\t</li>\n\t</ul>\n\t<ul class=\"view-modes\">\n\t\t<li>\n\t\t\t<button class=\"btn\" id=\"btn-editorcam\" data-toggle=\"popover\" data-placement=\"top\" title=\"Editor camera\">\n\t\t\t\t<svg class=\"icon-vr\"><use xlink:href=\"#icon-view-cam\"></use></svg>\n\t\t\t</button>\n\t\t</li>\n\t\t<li>\n\t\t\t<button class=\"btn\" id=\"btn-vrcam\" data-toggle=\"popover\" data-placement=\"top\" title=\"VR camera\">\n\t\t\t\t<svg class=\"icon-vr\"><use xlink:href=\"#icon-view-vr\"></use></svg>\n\t\t\t</button>\n\t\t</li>\n\n\t</ul>\n</footer>\n<div id=\"drag-overlay\">\n\t<div id=\"drop-area\">\n\t\t<div class=\"drop-info\">\n\t\t\t<svg class=\"icon-drop-upload\"><use xlink:href=\"#icon-drop-upload\"></use></svg>\n\t\t</div>\n\t</div>\n\t<div id=\"drop-uploading\">\n\t\t<div class=\"drop-info\">\n\t\t\t<svg class=\"icon-drop-uploading\"><use xlink:href=\"#icon-drop-uploading\"></use></svg>\n\t\t\t<span>Uploading your file..</span>\n\t\t</div>\n\t</div>\n</div>\n\n<script>\n\tvar boot = {}\n\tboot.hasEdits = {{hasEdits}}\n\n\twindow.Vizor = {\n\t\tpageObjects: {graphs:{}, profiles:{}},\n\t\thideWebVRButton: true,\n\t\tisEditor: true,\n\t\treleaseMode: {{releaseMode}},\n\t\tcdnRoot: '{{cdnRoot}}',\n\t\twebSocketHost: '{{webSocketHost}}',\n\t\tuseSecureWebSocket: {{useSecureWebSocket}}\n\t}\n\n\t{{#if graph}}\n\t\tboot.graph = {{{json graph}}}\n\t\tboot.graphUrl = boot.graph.url\n\t{{/if}}\n\n\tfunction startEditor() {\n\t\tE2.InitialiseEngi(boot.graphUrl)\n\t}\n\n\t$(document).ready(function() {\n\t\tE2.models = {\n\t\t\tuser: new User({}),\n\t\t\tgraph: new Graph({}),\n\t\t\tfileList: new FileList({})\n\t\t}\n\n\t\t{{#if user.username}}\n            E2.models.user.set({{{json user}}})\n\t\t\tmixpanel.identify('{{user.username}}')\n\t\t{{/if}}\n\n\t\tif (typeof E2.controllers === 'undefined')\n\t\t\tE2.controllers = {}\n\n\t\tE2.controllers.account = new AccountController()\n\n\t\tstartEditor()\n\t});\n</script>\n"
  },
  {
    "path": "views/error.handlebars",
    "content": "{{message}}"
  },
  {
    "path": "views/filebrowser/frame.handlebars",
    "content": "<div class=\"file-select-control\">\n\t<ul class=\"nav nav-tabs\" role=\"tablist\">\n\t\t<li class=\"active\"><a href=\"#download\" role=\"tab\" data-toggle=\"tab\"><h4>Browse</h4></a></li>\n\t\t<li><a href=\"#upload\" role=\"tab\" data-toggle=\"tab\"><h4>Upload</h4></a></li>\n\t</ul>\n\n\t<div class=\"tab-content\">\n\t\t<div role=\"tabpanel\" class=\"tab-pane active\" id=\"download\">\n\t\t\t<form class=\"form-inline\">\n\n\t\t\t\t<div class=\"file-selector\"></div>\n\n\t\t\t\t<table>\n\t\t\t\t\t<tr id=\"buttons-row\">\n\t\t\t\t\t\t<td style=\"width: 100%\">\n\t\t\t\t\t\t\t\t<input id=\"file-url\"\n\t\t\t\t\t\t\t\t\tclass=\"form-control\"\n\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\tstyle=\"width: 100%\"\n\t\t\t\t\t\t\t\t\tvalue=\"{{original}}\"\n\t\t\t\t\t\t\t\t\tplaceholder=\"\"/>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\t\t\t\t</table>\n\t\t\t</form>\n\t\t</div>\n\n\t\t<div role=\"tabpanel\" class=\"tab-pane\" id=\"upload\">\n\t\t\t{{> filebrowser/upload}}\n\t\t</div>\n\t</div>\n</div>\n"
  },
  {
    "path": "views/filebrowser/generic.handlebars",
    "content": "<div class=\"header-background\"> </div>\n<div class=\"fixed-table-container-inner scrollbar\">\n\t<table class=\"table table-hover table-condensed table-striped\">\n\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t<th class=\"name-header\"><div class=\"th-inner\">Name</div></th>\n\t\t\t\t<th class=\"date-header\"><div class=\"th-inner\">Date</div></th>\n\t\t\t\t<th class=\"by-header\"><div class=\"th-inner\">By</div></th>\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t{{#each files}}\n\t\t\t<tr class=\"file-row{{#if selected}} success{{/if}}\" \n\t\t\t\tdata-url=\"{{url}}\">\n\t\t\t\t<td class=\"name\">{{name}}</td>\n\t\t\t\t<td class=\"\">{{updatedAt}}</td>\n\t\t\t\t<td class=\"\">{{_creator}}</td>\n\t\t\t</tr>\n\t\t{{else}}\n\t\t\t<tr class=\"file-row\">\n\t\t\t\t<td class=\"name\" colspan=\"4\">No files found</td>\n\t\t\t</tr>\n\t\t{{/each}}\n\t\t</tbody>\n\t</table>\n</div>\n"
  },
  {
    "path": "views/filebrowser/graph-frame.handlebars",
    "content": "<div class=\"file-select-control\">\n\t<ul class=\"nav nav-tabs\" role=\"tablist\">\n\t\t<li class=\"active\"><a href=\"#download\" role=\"tab\" data-toggle=\"tab\"><h4>Browse</h4></a></li>\n\t\t<li><a href=\"#upload\" role=\"tab\" data-toggle=\"tab\"><h4>Upload</h4></a></li>\n\t</ul>\n\n\t<div class=\"tab-content\">\n\t\t<div role=\"tabpanel\" class=\"tab-pane active\" id=\"download\">\n\t\t\t<form class=\"form-inline\">\n\n\t\t\t\t<div class=\"file-selector\"></div>\n\n\t\t\t\t<table>\n\t\t\t\t\t<tr id=\"buttons-row\">\n\t\t\t\t\t\t<td style=\"width: 100%\">\n\t\t\t\t\t\t\t\t<input id=\"file-url\"\n\t\t\t\t\t\t\t\t\tclass=\"form-control\"\n\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\tstyle=\"width: 100%\"\n\t\t\t\t\t\t\t\t\tvalue=\"{{original}}\"\n\t\t\t\t\t\t\t\t\tplaceholder=\"\"/>\n\t\t\t\t\t\t</td>\n\t\t\t\t\t</tr>\n\t\t\t\t</table>\n\n\t\t\t\t<div class=\"links\">\n\t\t\t\t\t<a href=\"#\" class=\"download\">Download JSON</a> \n\t\t\t\t\t|\n\t\t\t\t\t<a href=\"#\" class=\"clipboard\">Copy to clipboard</a>\n\t\t\t\t</div>\n\t\t\t</form>\n\t\t</div>\n\n\t\t<div role=\"tabpanel\" class=\"tab-pane\" id=\"upload\">\n\t\t\t{{> filebrowser/upload}}\n\t\t</div>\n\t</div>\n</div>\n"
  },
  {
    "path": "views/filebrowser/graph.handlebars",
    "content": "<div class=\"header-background\"> </div>\n\n<div class=\"fixed-table-container-inner scrollbar\">\n\t<table class=\"table table-hover table-condensed table-striped\">\n\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t<th class=\"name-header\"><div class=\"th-inner\">Name</div></th>\n\t\t\t\t<th class=\"date-header\"><div class=\"th-inner\">When</div></th>\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t{{#each files}}\n\t\t\t<tr class=\"file-row{{#if selected}} success{{/if}}\" \n\t\t\t\tdata-url=\"{{path}}\" data-navigate=\"true\">\n\t\t\t\t<td class=\"name\">{{owner}}/{{name}}</td>\n\t\t\t\t<td class=\"\">{{updatedAt}}</td>\n\t\t\t</tr>\n\t\t{{else}}\n\t\t\t<tr class=\"file-row\">\n\t\t\t\t<td class=\"name\" colspan=\"4\">Nothing found</td>\n\t\t\t</tr>\n\t\t{{/each}}\n\t\t</tbody>\n\t</table>\n</div>\n"
  },
  {
    "path": "views/filebrowser/patch.handlebars",
    "content": "<div class=\"header-background\"> </div>\n\n<div class=\"fixed-table-container-inner scrollbar\">\n\t<table class=\"table table-hover table-condensed table-striped\">\n\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t<th class=\"name-header\"><div class=\"th-inner\">Name</div></th>\n\t\t\t\t<th class=\"date-header\"><div class=\"th-inner\">When</div></th>\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t{{#each files}}\n\t\t\t<tr class=\"file-row{{#if selected}} success{{/if}}\"\n\t\t\t\tdata-url=\"{{name}}\" data-navigate=\"true\">\n\t\t\t\t<td class=\"name\">{{name}}</td>\n\t\t\t\t<td class=\"\">{{updatedAt}}</td>\n\t\t\t</tr>\n\t\t{{else}}\n\t\t\t<tr class=\"file-row\">\n\t\t\t\t<td class=\"name\" colspan=\"4\">Nothing found</td>\n\t\t\t</tr>\n\t\t{{/each}}\n\t\t</tbody>\n\t</table>\n</div>\n"
  },
  {
    "path": "views/filebrowser/publishModal.handlebars",
    "content": "<form action=\"/graph\" id=\"publishGraphForm\" method=\"POST\">\n    <input type=\"hidden\" name=\"_csrf\" value={{_csrf}} />\n    <input type=\"hidden\" name=\"graph\" value=\"{{graph}}\" />\n\t<input type=\"hidden\" name=\"previewImage\" value=\"{{previewImage}}\" />\n    <div class=\"preview\" style=\"background-image:url('{{previewImage}}'); \">\n        &nbsp;\n    </div>\n    <fieldset>\n        <div class=\"form-input\" id=\"f_name\"><!-- #728, changed from f_path originally -->\n            <label for=\"pathInput\">Graph name</label>\n            <input type=\"text\" name=\"path\" id=\"pathInput\" placeholder=\"File name\" class=\"required\" tabindex=\"1\" value=\"{{name}}\">\n            <!-- span class=\"message\"></span -->\n        </div>\n        <div class=\"modal-error\" id=\"unknown_error\"><span></span></div>\n    </fieldset>\n\n    <div class=\"flexed\">\n        <ul class=\"inline-rounded\">\n            <li>\n\n                {{> controls/toggle checked=isPublic name='isPublic' id='publishPublic' value='1'\n                    withLabel=true labelOn='Public' labelId='publishPublicPrivateLabel' labelOff='Private'}}\n            </li>\n            <li>\n                {{sizeFormatted}}\n            </li>\n        </ul>\n\n        <button id=\"publish-graph-btn\" class=\"sign-btn withWaitState spinner\" type=\"submit\">\n            <span>Publish</span>\n            <svg class=\"waitOff icon-sign-in\"><use xlink:href=\"#icon-go\"></use></svg>\n            <svg class=\"waitOn icon-sign-in\"><use xlink:href=\"#icon-button-spinner\"></use></svg>\n        </button>\n    </div>\n\n</form>\n"
  },
  {
    "path": "views/filebrowser/save-frame.handlebars",
    "content": "<div class=\"file-select-control\">\n\t<div class=\"files-frame\" id=\"saveas\">\n\t\t<form class=\"form-inline\">\n\t\t\t<div class=\"file-selector\"></div>\n\n\t\t\t<table>\n\t\t\t\t<tr id=\"buttons-row\">\n\t\t\t\t\t<td style=\"width: 100%\">\n\t\t\t\t\t\t\t<input id=\"file-url\"\n\t\t\t\t\t\t\t\tclass=\"form-control\"\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\tstyle=\"width: 100%\"\n\t\t\t\t\t\t\t\tvalue=\"{{original}}\"\n\t\t\t\t\t\t\t\tplaceholder=\"Name\"/>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t</form>\n\t</div>\n</div>\n"
  },
  {
    "path": "views/filebrowser/tags.handlebars",
    "content": "<p>\n\tTags: <input type=\"text\" id=\"tags\" class=\"form-control\" size=\"45\"/>\n</p>\n\n"
  },
  {
    "path": "views/filebrowser/texture.handlebars",
    "content": "<div class=\"header-background\"> </div>\n<div class=\"fixed-table-container-inner scrollbar\">\n\t<table class=\"table table-hover table-condensed table-striped\">\n\t\t<thead>\n\t\t\t<tr>\n\t\t\t\t<th class=\"thumbnail-header\"><div class=\"th-inner\">Thumbnail</div></th>\n\t\t\t\t<th class=\"name-header\"><div class=\"th-inner\">Name</div></th>\n\t\t\t\t<th class=\"size-header\"><div class=\"th-inner\">Size</div></th>\n\t\t\t\t<th class=\"by-header\"><div class=\"th-inner\">By</div></th>\n\t\t\t</tr>\n\t\t</thead>\n\t\t<tbody>\n\t\t{{#each files}}\n\t\t\t<tr class=\"file-row{{#if selected}} success{{/if}}\" \n\t\t\t\tdata-url=\"{{scaled.url}}\">\n\t\t\t\t<td><img class=\"thumb\" src=\"{{scaledThumbnail.url}}\"/></td>\n\t\t\t\t<td class=\"path\">{{scaled.path}}</td>\n\t\t\t\t<td>{{scaled.width}}x{{scaled.height}}</td>\n\t\t\t\t<td>{{_creator}}</td>\n\t\t\t</tr>\n\t\t{{else}}\n\t\t\t<tr class=\"file-row\">\n\t\t\t\t<td class=\"name\" colspan=\"4\">No files found</td>\n\t\t\t</tr>\n\t\t{{/each}}\n\t\t</tbody>\n\t</table>\n</div>\n"
  },
  {
    "path": "views/filebrowser/upload.handlebars",
    "content": "{{#if user.username}}\n<form enctype=\"multipart/form-data\"\n\tmethod=\"post\"\n\taction=\"/upload/{{modelName}}\"\n\tclass=\"form-inline fileUploadForm\">\n\t<button class=\"browse-button\">Browse</button>\n\t<input type=\"text\" id=\"fileUploadName\" name=\"filename\" class=\"form-control\"/>\n\t<input type=\"file\" id=\"fileUploadFile\" name=\"file\" class=\"form-control\"/>\n\t<input type=\"submit\" value=\"Upload\" class=\"form-control btn-primary\"/>\n</form>\n{{else}}\n\t<h4>Please login before uploading.</h4>\n{{/if}}\n\n<div class=\"text-center\">\n\t<div id=\"message\"></div>\n\n\t<div class=\"progress\" style=\"display:none\">\n\t  <div class=\"progress-bar progress-bar-info progress-bar-striped active\"\n\t  \trole=\"progressbar\"\n\t  \taria-valuenow=\"0\" aria-valuemin=\"0\" aria-valuemax=\"100\"\n\t  \tstyle=\"width: 00%;\">\n\t  </div>\n\t</div>\n</div>\n"
  },
  {
    "path": "views/graph/index.handlebars",
    "content": "<div id=\"contentcontainer\" class=\"in\">\n    {{#if pageHeading}}\n        <h2>{{pageHeading}}</h2>\n    {{/if}}\n    {{>browse/graphList . heading=false list=graphs withPagination=true}}\n</div>"
  },
  {
    "path": "views/graph/show.handlebars",
    "content": "<header id=\"topbar\" style=\"display:none\">\n        <div>\n        <h2 id=\"graph_heading\">\n            <span>\n                <a href=\"/\" target=\"_top\"><svg stroke=\"none\" fill=\"#afbfdf\"><use xlink:href=\"#vizor-logo-flat\"></use></svg></a>\n                <span class=\"title\">{{graphName}}</span>\n                <span class=\"author\">by <a target=\"_top\" href=\"/{{graph.owner}}\">{{graphOwner}}</a></span>\n                <span class=\"loadingonly\">{{#if graph.size}}({{graph.size}}){{/if}}</span>\n            </span>\n        </h2>\n        <progress id=\"progressbar\" max=\"100\"></progress>\n        <div class=\"controls noselect_all\">\n            {{#unless hidePlayButton}}\n                <button id=\"playButton\" class=\"svg noplaying noautoplay\" data-svgref=\"player-icon-play\"><svg></svg>\n                    <span>Play</span>\n                </button>\n            {{/unless}}\n\n            {{#unless hideVRButton}}\n                <button id=\"entervr\" class=\"svg nopaused noDeviceDesktop noDeviceTablet mobileDeviceOnly\" data-svgref=\"player-icon-vr\"><svg></svg>\n                    <span>Enter VR</span>\n                </button>\n            {{/unless}}\n\n            {{#unless hideFullscreenButton}}\n                <button id=\"fullscreen\"\n                 {{#unless isEmbedded}}\n                    class=\"svg nopaused noDeviceMobile noDeviceTablet\"\n                 {{else}}\n                    class=\"svg nopaused\"\n                 {{/unless}}\n                data-svgref=\"player-icon-fullscreen\"><svg></svg>\n                    <span>Fullscreen</span>\n                </button>\n            {{/unless}}\n\n            {{#if graph.editable}}\n                <button id=\"edit\" class=\"svg nopaused noDeviceMobile\" data-svgref=\"player-icon-edit\"><svg></svg>\n                    <span>Edit</span>\n                    {{#eq graph.owner user.username}}\n                    {{else}}\n                    {{/eq}}\n                </button>\n            {{else}}\n                {{!-- always display this button in 360vr.io, the UI will manage it --}}\n                {{#eq site \"threesixty\"}}\n                    <button id=\"edit\" class=\"svg nopaused noDeviceMobile\" data-svgref=\"player-icon-edit\"><svg></svg>\n                        <span>Edit</span></button>\n                {{/eq}}\n            {{/if}}\n\n            {{#unless hideShareButton}}\n                {{#unless graph.private}}\n                    <button id=\"sharebutton\" class=\"svg nopaused\" data-svgref=\"player-icon-share\">\n                        <svg></svg>\n                        <span>Share</span>\n                    </button>\n                {{/unless}}\n            {{/unless}}\n        </div>\n    </div>\n</header>\n\n<div id=\"playerWrap\" style=\"background: #000 url('{{{previewImage}}}') center center no-repeat; background-size: cover;\">\n    <div id=\"beforeLoadingStage\" class=\"stage front\"></div>\n    <div id=\"loadingStage\" class=\"stage\"></div>\n    <div id=\"readyStage\" class=\"stage\"></div>\n    <div id=\"errorStage\" class=\"stage\"></div>\n    <div id=\"playingStage\" class=\"stage\">\n        {{> playerCanvas width=\"100%\" height=\"100%\" graphSrc=graphMinUrl autoplay=autoplay }}\n    </div>\n</div>\n<script>\n    (function() {\n        if (!window.Vizor)\n            window.Vizor = {}\n\n        Vizor.origin = window.location.origin\n        Vizor.embedOrigin = Vizor.origin.replace('https://','//').replace('http://','//')\n        Vizor.isEditor = false\n\n    {{#if graph.owner}}\n        Vizor.shareURL = Vizor.origin + '/{{graph.owner}}/{{graph.name}}'\n        Vizor.embedSrc = Vizor.embedOrigin + '/embed/{{graph.owner}}/{{graph.name}}'\n    {{else}}\n        Vizor.shareURL = Vizor.origin\n        Vizor.embedSrc = Vizor.embedOrigin\n    {{/if}}\n\n    Vizor.cdnRoot = '{{cdnRoot}}'\n\n    {{#if autoplay}}\n        Vizor.autoplay = {{autoplay}}\n    {{else}}\n        Vizor.autoplay = false\n    {{/if}}\n\n    {{#if noHeader}}\n        Vizor.noHeader = {{noHeader}}\n    {{else}}\n        Vizor.noHeader = false\n    {{/if}}\n\n    {{#if graph.hasAudio}}\n        Vizor.hasAudio = {{graph.hasAudio}}\n    {{else}}\n        Vizor.hasAudio = false\n    {{/if}}\n\n        if (Vizor.hasAudio && VizorUI.isMobile.iOS())\n            Vizor.autoplay = false\n\n    {{#if graph.hasVideo}}\n        Vizor.hasVideo = {{graph.hasVideo}}\n    {{else}}\n        Vizor.hasVideo = false\n    {{/if}}\n\n        Vizor.graphName = '{{graphName}}'\n        Vizor.hideWebVRButton = false\n\n    {{#if isEmbedded}}\n        Vizor.isEmbedded = true\n    {{else}}\n        Vizor.isEmbedded = false\n    {{/if}}\n\n    {{#if startMode}}\n        Vizor.startMode = {{startMode}}\n    {{else}}\n        Vizor.startMode = 1\n    {{/if}}\n\n    })()\n</script>\n"
  },
  {
    "path": "views/home.handlebars",
    "content": "{{> srv/home/_header }}\n\n\t{{> srv/home/homeHero }}\n    {{> srv/home/homeIntro }}\n\t{{> srv/home/homeFeatured }}\n    {{> srv/home/homeVizor360 }}\n\n{{> srv/home/_footer }}"
  },
  {
    "path": "views/layouts/editor.handlebars",
    "content": "<!DOCTYPE html>\n{{#*inline 'favicon'}}\n    <link {{#if apple}}rel=\"apple-touch-icon-precomposed\"{{else}}rel=\"icon\"{{/if}} sizes=\"{{size}}x{{size}}\" href=\"/images/v2/favicons/icon-{{size}}px.png\" />\n{{/inline}}\n<html lang=\"en\" class=\"hVizor\">\n  <head id=\"head\">\n    <title>Vizor Patches</title>\n\n    <!-- Origin Trial Token, feature = WebVR, origin = https://vizor.io, expires = 2017-03-03 -->\n    <meta http-equiv=\"origin-trial\" data-feature=\"WebVR\" data-expires=\"2017-03-03\" content=\"ApAT41IWgJY4CGPMsa/MBNRZJPfd+pEfUcEYSxR0BO+Sf+MoOlJM4KKx//njNhKcL+2KE2jRtT/vR9aY5nefWw0AAABheyJvcmlnaW4iOiAiaHR0cHM6Ly92aXpvci5pbzo0NDMiLCAiaXNTdWJkb21haW4iOiB0cnVlLCAiZmVhdHVyZSI6ICJXZWJWUiIsICJleHBpcnkiOiAxNDg4NTU0NjQ0fQ==\">\n\n    {{>favicon apple=true size=57}}\n    {{>favicon apple=true size=114}}\n    {{>favicon apple=true size=72}}\n    {{>favicon apple=true size=144}}\n    {{>favicon size=48}}\n    {{>favicon size=32}}\n    {{>favicon size=16}}\n    <link rel=\"icon\" href=\"/favicon.ico?v=201608\" />\n\n    {{{css 'editor'}}}\n\t{{{css 'icons/style'}}}\n\n    <!--<link href=\"/vendor/font-awesome-4.2.0/css/font-awesome.min.css\" rel=\"Stylesheet\" type=\"text/css\" />-->\n    <link rel=\"stylesheet\" href=\"https://fonts.googleapis.com/css?family=Roboto:400,700,300\" type=\"text/css\">\n    <link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700' rel='stylesheet' type='text/css'>\n    <link href='https://fonts.googleapis.com/css?family=Source+Code+Pro:300,400' rel='stylesheet' type='text/css'>\n\n    <!-- begin bundler -->\n    <script type=\"text/javascript\" src=\"/vendor/when.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/node_modules/jquery/dist/jquery.min.js\"></script>\n    <script type=\"text/javascript\" src=\"/node_modules/lodash/dist/lodash.min.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/jquery.fastfix.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/jquery.mousewheel.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/bootstrap-3.1.1-dist/js/bootstrap.min.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/vendor/js.cookie.min.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/vendor/bootbox.min.js\"></script>\n    <script type=\"text/javascript\" src=\"/node_modules/backbone/backbone-min.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/node_modules/handlebars/dist/handlebars.min.js\"></script>\n    <script type=\"text/javascript\" src=\"/node_modules/moment/min/moment.min.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/vendor/webgl-debug.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/event-emitter.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/core.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/util.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/draggable.js\"></script>\n\t<script type=\"text/javascript\" src=\"/scripts/movable.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/treeview.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/file-select-control.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/collapsible-select-control.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/plugin-group.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/plugin-manager.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/patchManager.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/peopleManager.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/connection.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/graph.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/node.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/autoSlotGroup.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/variables.js\"></script>\n\t<script type=\"text/javascript\" src=\"/scripts/blendFunctions.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/fontSelector.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/loaders/loader.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/loaders/imageLoader.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/loaders/audioBufferLoader.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/loaders/videoLoader.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/loaders/textureLoader.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/loaders/modelLoader.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/loaders/sceneLoader.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/loaders/assetLoader.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/documentation/pluginDocsCache.js\"></script>\n\t\n    <script type=\"text/javascript\" src=\"/scripts/gridFsClient.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/common/graphAnalyser.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/player.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/application.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/ui-core-statestore.js\"></script>\n\t<script type=\"text/javascript\" src=\"/scripts/ui-core.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/ui-breadcrumb.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/ui/tabbed.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/ui-minislides.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/ui.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/ui/pageStore.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/ui-site.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/ui/xhrForm.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/ui/uiDragAwareHelper.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/ui/uiTextArea.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/ui-upload.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/ui/ui-helpscreen.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/ui/uiDragToAdjust.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/ui/uiEnterValue.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/ui/uiAbstractProxy.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/ui/uiProxyCheckbox.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/ui/uiProxyTextField.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/ui/uiProxyToggleButton.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/ui/uiProxyVec3.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/ui/uiAbstractProperties.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/ui/uiPropertiesObj3d.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/ui/uiPropertiesNode.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/node-ui-enum.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/node-ui.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/editConnection.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/player.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/graphApi.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/commands/undoManager.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/commands/graphEditCommands.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/commands/fork.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/mid-pane.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/shader-editor.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/account-controller.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/models.js\"></script>\n    \n    <script type=\"text/javascript\" src=\"/scripts/wschannel.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/editorChannel.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/contextMenu.js\"></script>\n    \n    <script type=\"text/javascript\" src=\"/scripts/stores/store.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/stores/graphStore.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/stores/peopleStore.js\"></script>\n\n\t<script type=\"text/javascript\" src=\"/scripts/noise.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/chat.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/datatypes/environmentSettings.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/glTFUtils.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/vendor/flux.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/vendor/three/three.js\"></script>\n    \n    <script type=\"text/javascript\" src=\"/vendor/three/OBJLoader.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/three/MTLLoader.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/three/DDSLoader.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/three/SceneLoader.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/three/MorphAnimMesh.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/three/loaders/FBXLoader.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/three/loaders/ColladaLoader2.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/three/loaders/gltf/glTF-parser.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/three/loaders/gltf/glTFAnimation.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/three/loaders/gltf/glTFLoader.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/three/loaders/gltf/glTFLoaderUtils.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/three/loaders/gltf/glTFShaders.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/three/loaders/gltf/gltfUtilities.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/vendor/three/VREffect.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/three/CardboardEffect.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/three/VRControls.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/three/OrbitControls.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/three/EditorControls.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/three/TransformControls.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/three/Font.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/three/FontLoader.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/vendor/spite/THREE.MeshLine.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/vendor/borismus/webvr-polyfill.js\"></script>\n    <script type=\"text/javascript\" src=\"/vendor/borismus/webvr-manager.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/vendor/borismus/ray-input.js\"></script>\n\n\t<script type=\"text/javascript\" src=\"/scripts/hardware.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/webVRAdapter.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/vendor/random.min.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/plugin.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/subGraphPlugin.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/threeObject3dPlugin.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/abstractPlugins/abstractGraphPlugin.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/abstractPlugins/abstractEntityPlugin.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/abstractPlugins/abstractTextAreaPlugin.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/abstractPlugins/abstractObjectRayPlugin.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/abstractPlugins/abstractThreeLoaderObjPlugin.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/abstractPlugins/abstractThreeMaterialPlugin.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/abstractPlugins/abstractThreeMeshPlugin.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/abstractPlugins/abstractArrayBlendModulatorPlugin.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/abstractPlugins/abstractAnimateValueOnTriggerPlugin.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/worldEditor/worldEditorPerspectiveCamera.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/worldEditor/worldEditorOrthographicCamera.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/worldEditor/worldEditorCameraSelector.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/worldEditor/worldEditor.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/worldEditor/worldEditorOriginGrid.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/worldEditor/worldEditorRadialHelper.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/worldEditor/abstractWorldEditorHelperObject.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/worldEditor/vrCameraHelperObject.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/worldEditor/directionalLightHelper.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/worldEditor/spotLightHelper.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/worldEditor/hemisphereLightHelper.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/worldEditor/pointLightHelper.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/worldEditor/sceneLightingHelper.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/worldEditor/boundingSphereHelper.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/worldEditor/skeletonHelper.js\"></script>\n    <script type=\"text/javascript\" src=\"/scripts/worldEditor/boundingBoxHelper.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/worldEditor/objectPlacementHelper.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/screenshot/ScreenshotRenderer.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/scripts/loaders/multiObjectLoader.js\"></script>\n\n    <script type=\"text/javascript\" src=\"/vendor/toji/webgl-utils/src/wglu-stats.js\"></script>\n\n    <!-- end bundler -->\n\n    <script>{{> mixpanel}}</script>\n  </head>\n\n<body class=\"noselect bEditor {{extraClasses}}\">\n    {{> srv/gtm}}\n\n    {{{body}}}\n\n    <script>\n        {{{templateCache}}}\n    </script>\n\n</body>\n</html>\n"
  },
  {
    "path": "views/layouts/errorlayout.handlebars",
    "content": "<body class=\"error\">\n    {{{body}}}\n</body>"
  },
  {
    "path": "views/layouts/main.handlebars",
    "content": "{{#*inline 'favicon'}}\n    <link {{#if apple}}rel=\"apple-touch-icon-precomposed\"{{else}}rel=\"icon\"{{/if}} sizes=\"{{size}}x{{size}}\" href=\"/images/v2/favicons/icon-{{size}}px.png\" />\n{{/inline}}\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\" />\n\n\t{{#if meta.title}}\n\t\t<title>{{meta.title}}</title>\n\t{{else}}\n\t\t<title>Patches – Explore, Create and Publish VR on the Web</title>\n\t{{/if}}\n    {{#if meta.keywords }}\n        <meta name=\"keywords\" content=\"{{meta.keywords}}\" />\n    {{else}}\n        <meta name=\"keywords\" content=\"vizor, vr, virtual reality, webvr, animation, interactive, 3d editor, webgl, visual programming, world editor\" />\n    {{/if}}\n    {{#if meta.description}}\n        <meta name=\"description\" content=\"{{meta.description}}\" />\n    {{else}}\n        <meta name=\"description\" content=\"Vizor Patches is a platform for creating and sharing VR content on the web. All you need is a WebVR capable browser and a headset, although you can use Vizor without one. There is no need to download and install large native applications.\" />\n    {{/if}}\n\n\t<meta id=\"viewportmeta\" name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0, shrink-to-fit=no\" />\n    <!-- facebook -->\n    <meta name=\"og:description\" content=\"Explore, create and publish VR on the Web using Vizor Patches. All you need is a WebVR capable browser and a headset, although you can use Vizor without one. Nothing to download or install.\" />\n    <meta name=\"og:image\" content=\"/images/vizor_social.png\" />\n    <meta name=\"og:restrictions:age\" content=\"13+\" />\n    <meta name=\"fb:profile_id\" content=\"980737135276580\" />\n\n    <!-- Origin Trial Token, feature = WebVR, origin = https://vizor.io, expires = 2017-03-03 -->\n    <meta http-equiv=\"origin-trial\" data-feature=\"WebVR\" data-expires=\"2017-03-03\" content=\"ApAT41IWgJY4CGPMsa/MBNRZJPfd+pEfUcEYSxR0BO+Sf+MoOlJM4KKx//njNhKcL+2KE2jRtT/vR9aY5nefWw0AAABheyJvcmlnaW4iOiAiaHR0cHM6Ly92aXpvci5pbzo0NDMiLCAiaXNTdWJkb21haW4iOiB0cnVlLCAiZmVhdHVyZSI6ICJXZWJWUiIsICJleHBpcnkiOiAxNDg4NTU0NjQ0fQ==\">\n\n    {{>favicon apple=true size=57}}\n    {{>favicon apple=true size=114}}\n    {{>favicon apple=true size=72}}\n    {{>favicon apple=true size=144}}\n    {{>favicon size=48}}\n    {{>favicon size=32}}\n    {{>favicon size=16}}\n    <link rel=\"icon\" href=\"/favicon.ico?v=201608\" />\n\n    <link rel=\"stylesheet\" href=\"//fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700\" />\n\t<link rel=\"stylesheet\" href=\"//fonts.googleapis.com/css?family=Roboto:200,300,400\" />\n\n\t{{{css 'site'}}}\n\n    <!-- begin bundler -->\n    <script src=\"/node_modules/jquery/dist/jquery.min.js\"></script>\n\t<script src=\"/node_modules/lodash/dist/lodash.min.js\"></script>\n\t<script src=\"/node_modules/moment/min/moment.min.js\"></script>\n\t<script src=\"/vendor/when.js\"></script>\n\n\t<script src=\"/scripts/event-emitter.js\"></script>\n\n\t<script src=\"/vendor/flux.js\"></script>\n    <script src=\"/vendor/bootstrap-3.1.1-dist/js/bootstrap.min.js\"></script>\n\t<script src=\"/vendor/bootbox.min.js\"></script>\n\t<script src=\"/node_modules/backbone/backbone-min.js\"></script>\n\n    <script src=\"/node_modules/handlebars/dist/handlebars.min.js\"></script>\n\n\t<script src=\"/dist/player.min.js\"></script>\n\n    <script src=\"/scripts/hardware.js\"></script>\n    <script src=\"/vendor/borismus/webvr-polyfill.js\"></script>\n    <script src=\"/vendor/borismus/webvr-manager.js\"></script>\n    <script src=\"/scripts/webVRAdapter.js\"></script>\n\n\t<script src=\"/scripts/models.js\"></script>\n\t<script src=\"/scripts/account-controller.js\"></script>\n\t<script src=\"/scripts/ui/uiDragAwareHelper.js\"></script>\n\t<script src=\"/scripts/ui-minislides.js\"></script>\n\t<script src=\"/scripts/ui/pageStore.js\"></script>\n\t<script src=\"/scripts/ui-site.js\"></script>\n\t<script src=\"/scripts/ui/xhrForm.js\"></script>\n\t<script src=\"/scripts/ui/ui-cards.js\"></script>\n\t<script type=\"text/javascript\" src=\"/scripts/ui/tabbed.js\"></script>\n\n    <!-- end bundler -->\n\n\t{{#if meta.scripts}}{{#each meta.scripts}}\n\t\t<script type=\"text/javascript\" src=\"/meta-scripts/{{this}}\"></script>\n\t{{/each}}{{/if}}\n\n\t<script>\n        window.Vizor = {\n            pageObjects: {graphs:{}, profiles:{}},\n            cdnRoot: '{{cdnRoot}}',\n            hideWebVRButton: true,\n            autoplay: true\n        }\n\n\t\tjQuery(document).ready(function(){\n\t\t\t(function(){\n\t\t\t\t{{{templateCache}}}\n\t\t\t}).apply(window)\n\n\n\t\t\tif (typeof E2.models === 'undefined')\n\t\t\t\tE2.models = {}\n\n\t\t\tif (typeof E2.controllers === 'undefined')\n\t\t\t\tE2.controllers = {}\n\n            E2.models.user = new User({})\n            {{#if user.username}}\n                E2.models.user.set({{{json user}}})\n            {{/if}}\n\n\t\t\tE2.controllers.account = new AccountController()\n\t\t});\n    </script>\n\n    <script>{{> mixpanel}}</script>\n</head>\n\n<body id=\"top_\" class=\"bMain {{meta.bodyclass}} {{extraClasses}}\">\n\t{{> srv/gtm}}\n\t{{> srv/siteSvgSprite }}\n\n    {{!--\n        header: false   = noheader\n        header: any     = custom header\n        (header: null    = default header)\n\n        footer: false, null = nofooter\n        footer: any = custom footer\n\n    --}}\n    {{#not-eq meta.header false}}\n        {{#if meta.header}}\n           {{#with meta}}{{> (lookup . 'header') .. }}{{/with}}\n        {{else}}\n            {{> srv/navbar}}\n        {{/if}}\n    {{/not-eq}}\n\n\t{{> flash}}\n\n\t{{#if meta.breadcrumb }}\n\t\t<div class=\"breadcrumbcontainer contentwrap dark\">\n\t\t\t{{> breadcrumb meta.breadcrumb}}\n\t\t</div>\n\t{{/if}}\n\n    <div id=\"contentwrap\">{{!-- main. for server-rendered html --}}\n      {{{body}}}\n    </div>\n\n    {{#not-eq meta.footer false}}\n        {{#if meta.footer}}\n           {{#with meta}}{{> (lookup . 'footer') .. }}{{/with}}\n        {{else}}\n\n        {{/if}}\n    {{/not-eq}}\n\n</body>\n</html>\n"
  },
  {
    "path": "views/layouts/min.handlebars",
    "content": "\n<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n\t<head id=\"head\">\n\t\t<title>{{title}}</title>\n    \t<link href=\"/vendor/bootstrap-3.1.1-dist/css/bootstrap.min.css\" rel=\"Stylesheet\" type=\"text/css\"  />\n\t    <link href=\"/vendor/bootstrap-3.1.1-dist/css/bootstrap-theme.min.css\" rel=\"Stylesheet\" type=\"text/css\"  />\n\t\t<link href=\"//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css\" rel=\"stylesheet\">\n\n\t    <!-- Origin Trial Token, feature = WebVR, origin = https://vizor.io, expires = 2017-01-25 -->\n\t    <meta http-equiv=\"origin-trial\" data-feature=\"WebVR\" data-expires=\"2017-01-25\" content=\"Atcj2U0n8C7EIzQKAr9Lz6IMAxw/x2efIg47P3G8mqer2TZKWA94so8waIU8b4tT81f+1Irv/Muq2OrrUBDiqQMAAABaeyJvcmlnaW4iOiJodHRwczovL3Zpem9yLmlvOjQ0MyIsImZlYXR1cmUiOiJXZWJWUiIsImV4cGlyeSI6MTQ4NTM1MzY2NiwiaXNTdWJkb21haW4iOnRydWV9\">\n\n\t\t<script src=\"/node_modules/jquery/dist/jquery.min.js\"></script>\n\t</head>\n\t<body>\n\t\t<script src=\"/dist/player.min.js\"></script>\n\t\t{{{body}}}\n\n\t\t<div class=\"clearfix\"></div>\n\t</body>\n</html>\n"
  },
  {
    "path": "views/layouts/player.handlebars",
    "content": "<!DOCTYPE html>\n{{#*inline 'favicon'}}\n    <link {{#if apple}}rel=\"apple-touch-icon-precomposed\"{{else}}rel=\"icon\"{{/if}} sizes=\"{{size}}x{{size}}\" href=\"/images/v2/favicons/icon-{{size}}px.png\" />\n{{/inline}}\n<html lang=\"en\" class=\"hVizor\">\n\t<head id=\"head\">\n\t\t<meta charset='utf-8' />\n        <title>{{graphName}} by {{graphOwner}}</title>\n\t\t<meta id=\"viewportmeta\" name=\"viewport\" content=\"initial-scale=1, maximum-scale=1, shrink-to-fit=no\" />\n        <meta name=\"keywords\" content=\"vizor, vr, webvr, virtual reality, webgl, visual programming, animation\" />\n        <meta name=\"description\" content=\"Vizor is a platform for creating and sharing VR experiences\" />\n        <meta name=\"og:description\" content=\"Vizor is a platform for creating and sharing VR experiences\" />\n        <meta name=\"og:title\" content=\"{{graphName}} by {{graphOwner}}\" />\n        <meta name=\"og:image\" content=\"{{previewImage}}\" />\n        <meta name=\"og:image:width\" content=\"{{previewImageWidth}}\" />\n        <meta name=\"og:image:height\" content=\"{{previewImageHeight}}\" />\n        <meta name=\"og:restrictions:age\" content=\"13+\" />\n        <meta name=\"fb:profile_id\" content=\"980737135276580\" />\n        <meta name=\"twitter:card\" content=\"summary_large_image\" />\n        <meta name=\"twitter:site\" content=\"@Vizor_VR\" />\n        <meta name=\"twitter:title\" content=\"{{graphName}} by {{graphOwner}}\" />\n        <meta name=\"twitter:description\" content=\"Vizor is a platform for creating and sharing VR experiences\" />\n        <meta name=\"twitter:image\" content=\"{{previewImage}}\" />\n    \n        <!-- Origin Trial Token, feature = WebVR, origin = https://vizor.io, expires = 2017-03-03 -->\n        <meta http-equiv=\"origin-trial\" data-feature=\"WebVR\" data-expires=\"2017-03-03\" content=\"ApAT41IWgJY4CGPMsa/MBNRZJPfd+pEfUcEYSxR0BO+Sf+MoOlJM4KKx//njNhKcL+2KE2jRtT/vR9aY5nefWw0AAABheyJvcmlnaW4iOiAiaHR0cHM6Ly92aXpvci5pbzo0NDMiLCAiaXNTdWJkb21haW4iOiB0cnVlLCAiZmVhdHVyZSI6ICJXZWJWUiIsICJleHBpcnkiOiAxNDg4NTU0NjQ0fQ==\">\n\n        {{>favicon apple=true size=57}}\n        {{>favicon apple=true size=114}}\n        {{>favicon apple=true size=72}}\n        {{>favicon apple=true size=144}}\n        {{>favicon size=48}}\n        {{>favicon size=32}}\n        {{>favicon size=16}}\n        <link rel=\"icon\" href=\"/favicon.ico?v=201608\" />\n\n\n        {{{css 'site'}}}\n\n        <!-- begin bundler -->\n\t\t<script src=\"/node_modules/jquery/dist/jquery.min.js\"></script>\n        <script src=\"/node_modules/lodash/dist/lodash.min.js\"></script>\n\t\t<script src=\"/vendor/bootstrap-3.1.1-dist/js/bootstrap.min.js\"></script>\n\t\t<script src=\"/vendor/bootbox.min.js\"></script>\n        <script src=\"/node_modules/moment/min/moment.min.js\"></script>\n        <script src=\"/node_modules/handlebars/dist/handlebars.min.js\"></script>\n\n        <script src=\"/scripts/ui/pageStore.js\"></script>\n        <script src=\"/scripts/event-emitter.js\"></script>\n        <script src=\"/scripts/ui-site.js\"></script>\n        <script src=\"/scripts/ui/xhrForm.js\"></script>\n\n        <script src=\"/scripts/util.js\"></script>\n        <script src=\"/scripts/hardware.js\"></script>\n        <script src=\"/vendor/borismus/webvr-polyfill.js\"></script>\n        <script src=\"/vendor/borismus/webvr-manager.js\"></script>\n        <script src=\"/scripts/webVRAdapter.js\"></script>\n\n        <script src=\"/scripts/ui/playerUI.js\"></script>\n        <!-- end bundler -->\n\n        <script src=\"/data/dist/{{playerVersion}}/player.min.js\"></script>\n\n        <script>\n        (function(){\n            {{{templateCache}}}\n        }.apply(window))\n        </script>\n\n        <script>{{> mixpanel}}</script>\n\t</head>\n\t<body class=\"bPlayer noselect_all dark\">\n        {{> srv/gtm}}\n        {{> srv/siteSvgSprite }}\n        <div class=\"wrap clearfix\" id=\"playerpage\">\n\t\t    {{{body}}}\n            <noscript>\n                <div class=\"nojs clearfix\">\n                    <div style=\"float: left; margin: 5px 8px 0 0;\"><img src=\"/images/warning.png\" width=\"64px\" height=\"64px\" /></div>\n                    <p>This page requires javascript in order to display properly.</p>\n                    <p>\n                        If you're running a script blocker - such as NoScript - please whitelist this page.<br />\n                        If you have disabled javascript in your browser, please enable it and reload.\n                    </p>\n                </div>\n            </noscript>\n        </div>\n\t</body>\n</html>\n"
  },
  {
    "path": "views/layouts/threesixty.handlebars",
    "content": "<!DOCTYPE html>\n{{#*inline 'favicon'}}\n    <link {{#if apple}}rel=\"apple-touch-icon-precomposed\"{{else}}rel=\"icon\"{{/if}} sizes=\"{{size}}x{{size}}\" href=\"/images/v2/favicons/icon-{{size}}px.png\" />\n{{/inline}}\n<html lang=\"en\">\n<head>\n    <meta charset=\"utf-8\" />\n\n\t{{#if meta.title}}\n\t\t<title>{{meta.title}}</title>\n\t{{else}}\n\t\t<title>360.vizor.io - The easiest way to share your 360 photos</title>\n\t{{/if}}\n    {{#if meta.keywords }}\n        <meta name=\"keywords\" content=\"{{meta.keywords}}\" />\n    {{else}}\n        <meta name=\"keywords\" content=\"vizor, vr, webvr, virtual reality, webgl, visual programming, animation, world editor, 3d editor\" />\n    {{/if}}\n    {{#if meta.description}}\n        <meta name=\"description\" content=\"{{meta.description}}\" />\n    {{else}}\n        <meta name=\"description\" content=\"Drag, drop, share. 360 photos made simple.\" />\n    {{/if}}\n\n    <meta id=\"viewportmeta\" name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0, shrink-to-fit=no\" />\n\n    <!-- Origin Trial Token, feature = WebVR, origin = https://vizor.io, expires = 2017-03-03 -->\n    <meta http-equiv=\"origin-trial\" data-feature=\"WebVR\" data-expires=\"2017-03-03\" content=\"ApAT41IWgJY4CGPMsa/MBNRZJPfd+pEfUcEYSxR0BO+Sf+MoOlJM4KKx//njNhKcL+2KE2jRtT/vR9aY5nefWw0AAABheyJvcmlnaW4iOiAiaHR0cHM6Ly92aXpvci5pbzo0NDMiLCAiaXNTdWJkb21haW4iOiB0cnVlLCAiZmVhdHVyZSI6ICJXZWJWUiIsICJleHBpcnkiOiAxNDg4NTU0NjQ0fQ==\">\n\n    {{>favicon apple=true size=57}}\n    {{>favicon apple=true size=114}}\n    {{>favicon apple=true size=72}}\n    {{>favicon apple=true size=144}}\n    {{>favicon size=48}}\n    {{>favicon size=32}}\n    {{>favicon size=16}}\n    <link rel=\"icon\" href=\"/favicon.ico?v=201608\" />\n\n    <!-- facebook -->\n    <meta name=\"og:description\" content=\"Drag, drop, share. 360 photos made simple.\" />\n\n    <meta name=\"og:restrictions:age\" content=\"13+\" />\n    <meta name=\"fb:profile_id\" content=\"980737135276580\" />\n\n    {{#if previewImage}}\n        <meta name=\"og:image\" content=\"{{previewImage}}\" />\n        <meta name=\"twitter:image\" content=\"{{previewImage}}\" />\n        <meta name=\"og:image:width\" content=\"{{previewImageWidth}}\" />\n        <meta name=\"og:image:height\" content=\"{{previewImageHeight}}\" />\n    {{else}}\n        <meta name=\"og:image\" content=\"/images/vizor_social.jpg\" />\n        <meta name=\"twitter:image\" content=\"/images/vizor_social.jpg\" />\n    {{/if}}\n\n    <meta name=\"twitter:card\" content=\"summary_large_image\" />\n    <meta name=\"twitter:site\" content=\"@Vizor_VR\" />\n    <meta name=\"twitter:description\" content=\"Drag, drop, share. 360 photos made simple.\" />\n\n    <link rel=\"stylesheet\" href=\"//fonts.googleapis.com/css?family=Source+Sans+Pro:200,300,400,600,700,900\" />\n\t<link rel=\"stylesheet\" href=\"//fonts.googleapis.com/css?family=Roboto:200,300,400\" />\n\t<link rel=\"stylesheet\" href=\"//maxcdn.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.min.css\" />\n\n\t{{{css 'site360'}}}\n\n    <!-- begin bundler -->\n    <script src=\"/node_modules/jquery/dist/jquery.min.js\"></script>\n    <script src=\"/node_modules/lodash/dist/lodash.min.js\"></script>\n    <script src=\"/node_modules/moment/min/moment.min.js\"></script>\n    <script src=\"/vendor/bootstrap-3.1.1-dist/js/bootstrap.min.js\"></script>\n\t<script src=\"/vendor/bootbox.min.js\"></script>\n    <script src=\"/node_modules/handlebars/dist/handlebars.min.js\"></script>\n\n    <script src=\"/scripts/ui/pageStore.js\"></script>\n    <script src=\"/vendor/when.js\"></script>\n    <script src=\"/scripts/event-emitter.js\"></script>\n\n    <script src=\"/scripts/ui-site.js\"></script>\n    <script src=\"/scripts/ui/xhrForm.js\"></script>\n    <script src=\"/scripts/util.js\"></script>\n\n    <script src=\"/scripts/hardware.js\"></script>\n    <script src=\"/vendor/borismus/webvr-polyfill.js\"></script>\n    <script src=\"/vendor/borismus/webvr-manager.js\"></script>\n    <script src=\"/scripts/webVRAdapter.js\"></script>\n\n    <script src=\"/dist/player.min.js\"></script>\n\n    <script src=\"/scripts/ui/playerUI.js\"></script>\n\n    <script src=\"/scripts/threesixty.js\"></script>\n    <!-- end bundler -->\n\n    <script>\n        (function() {\n            {{{templateCache}}}\n        }.apply(window))\n    </script>\n    <script>{{> mixpanel}}</script>\n</head>\n\n<body class=\"{{meta.bodyclass}} {{extraClasses}} b360 bPlayer noselect_all\" >\n    {{> srv/gtm}}\n    {{> srv/siteSvgSprite}}\n    {{> srv/editorSvgSprite}}\n\n    <div id=\"drop-zone\">\n        <svg class=\"icon-upload\" style='fill: #fff; stroke: #fff'><use xlink:href=\"#icon-upload\"></use></svg>\n    </div>\n    <div id=\"container360\">\n        <h1 id=\"logo360\"><a href=\"/threesixty\">ThreeSixty°</a></h1>\n        <div id=\"lander-header\">\n            <h2>Simple 360 VR photo sharing</h2>\n            <p class=\"noDeviceMobile noDeviceTablet\">Drag and drop a 360 photo anywhere to share it</p>\n            <input id=\"threesixty-image-input\" type=\"file\" name=\"image\" accept=\"image/*\" />\n        </div>\n        {{> srv/madeWithVizor }}\n    </div>\n    <div class=\"wrap clearfix\" id=\"playerpage\">\n        {{{body}}}\n    </div>\n</body>\n\n</html>\n"
  },
  {
    "path": "views/partials/account/forgotpassword.handlebars",
    "content": "<form action=\"/forgot\" id=\"forgotPasswordForm\" method=\"POST\">\n    {{#unless loggedIn}}\n        <p>Enter your email address below and we will send you instructions to reset your password.</p>\n    {{else}}\n        <p>Your email address is below. Click 'Send Instructions' and we will email you how to reset your password.</p>\n    {{/unless}}\n\n\n    <input type=\"hidden\" name=\"_csrf\" value={{_csrf}}>\n    <fieldset>\n        <div class=\"form-input\" id=\"f_email\">\n            <label for=\"email_id\">Email</label>\n            <input type=\"email\" name=\"email\" id=\"email_id\" class=\"required\" placeholder=\"Email\" tabindex=\"1\"\n                   value=\"{{email}}\"\n                   {{#if loggedIn}}readonly{{/if}}>\n            <span class=\"message\"></span>\n        </div>\n\n        <div class=\"modal-error\" id=\"unknown_error\"><span></span></div>\n    </fieldset>\n    <button class=\"sign-btn svg\" type=\"submit\">\n        <span>Send Instructions</span>\n        <svg class=\"icon-sign-in\"><use xlink:href=\"#icon-go\"></use></svg>\n    </button>\n</form>\n{{#unless loggedIn}}\n{{#if modal}}\n<div class=\"twocol clearfix modal-footer\">\n\t<span class=\"col left\"><a href=\"/signup\" class=\"signup\">Create a new account</a></span>\n\t<span class=\"col right pull\"><a href=\"/login\" class=\"login\" id=\"signup-link\">Sign in </a></span>\n</div>\n{{/if}}\n{{/unless}}"
  },
  {
    "path": "views/partials/account/login.handlebars",
    "content": "<form action=\"/login\" id=\"loginForm\" method=\"POST\" class=\"clearfix\">\n    <fieldset>\n        <input type=\"hidden\" name=\"_csrf\" value={{_csrf}}>\n\n        <div class=\"form-input\" id=\"f_email\">\n            <label for=\"email_id\">Email</label>\n            <input type=\"email\" name=\"email\" id=\"email_id\" class=\"required\" placeholder=\"Email\">\n            <span class=\"message\"></span>\n        </div>\n\n        <div class=\"form-input\" id=\"f_password\">\n            <label for=\"password_id\">Password</label>\n            <input type=\"password\" name=\"password\" id=\"password_id\" placeholder=\"Password\" class=\"required\">\n            <span class=\"message\"></span>\n        </div>\n\n        <div class=\"modal-error\" id=\"unknown_error\"><span></span></div>\n    </fieldset>\n\n    <button id=\"sign-in-btn\" class=\"sign-btn action svg\" type=\"submit\">\n        <span>Sign in to Patches</span>\n        <svg class=\"icon-sign-in\"><use xlink:href=\"#icon-go\"></use></svg>\n    </button>\n</form>\n\n<div class=\"twocol clearfix modal-footer\">\n    <div class=\"col left\" style=\"width:34%\">\n        <a href=\"/forgot\" id=\"forgotPasswordLink\" class=\"forgot\">Forgot password?</a>\n    </div>\n    <div class=\"col right\" style=\"text-align:right; width:65%\">\n        Don't have an account? <a href=\"/signup\" class=\"signup\" id=\"signupLink\">Sign up here</a>\n    </div>\n</div>\n"
  },
  {
    "path": "views/partials/account/signup.handlebars",
    "content": "<form action=\"/signup\" id=\"signupForm\" method=\"POST\">\n    <input type=\"hidden\" name=\"_csrf\" value={{_csrf}}>\n    <fieldset>\n        <div class=\"form-input required\" id=\"f_name\">\n            <label for=\"name_id\">Your Name</label>\n            <input class=\"required\" type=\"text\" name=\"name\" id=\"name_id\" placeholder=\"Your Name\" tabindex=\"1\">\n            <span class=\"message\"></span>\n        </div>\n\n        <div class=\"form-input required\" id=\"f_username\">\n            <label for=\"username_id\">Username</label>\n            <input class=\"required\" type=\"text\" name=\"username\" id=\"username_id\" placeholder=\"Username\" tabindex=\"2\">\n            <span class=\"message\"></span>\n        </div>\n\n        <div class=\"form-input required\" id=\"f_email\">\n            <label for=\"email_id\">Email</label>\n            <input class=\"required\" type=\"email\" name=\"email\" id=\"email_id\" placeholder=\"Email\" tabindex=\"3\">\n            <span class=\"message\"></span>\n        </div>\n\n        <div class=\"form-input required\" id=\"f_password\">\n            <label for=\"password_id\">Password</label>\n            <input class=\"required\" type=\"password\" name=\"password\" id=\"password_id\" placeholder=\"Password\" tabindex=\"4\">\n            <span class=\"message\"></span>\n        </div>\n\n        <div class=\"modal-error\" id=\"unknown_error\"><span></span></div>\n    </fieldset>\n\n    <button id=\"sign-up-btn\" class=\"sign-btn svg\" type=\"submit\">\n        <span>Create an Account</span>\n        <svg class=\"actionicon\"><use xlink:href=\"#icon-go\"></use></svg>\n    </button>\n</form>\n\n<div class=\"modal-footer\">\n\t<p>Already have an account? <a href=\"/login\" id=\"signinModalLink\" class=\"login\" alt=\"Sign in\">Sign in here</a>\n\t<p>Creating a Patches account means you accept our\n\t\t<a href=\"https://site.vizor.io/patches-tos\" target=\"_blank\" alt=\"Patches Terms of Use\">Terms of Use</a>\n\t\tand\n\t\t<a href=\"https://site.vizor.io/patches-privacy-policy\" target=\"_blank\" alt=\"Privacy Policy\">Privacy Policy</a>.\n</div>\n"
  },
  {
    "path": "views/partials/assets/commonActions.handlebars",
    "content": "{{#*inline 'action'}}\n    {{!-- context graph --}}\n    <button data-action=\"{{act}}\" \tclass=\"action {{act}} svg tiny {{class}}\" data-svgref=\"{{icon}}\">\n        {{#if text}}{{text}}{{else}}{{act}}{{/if}}</button>\n{{/inline}}\n\n<div class=\"actions\">\n    {{>action act='share' text='Share' icon='icon-ca-share'}}\n\n\t{{#if allowAllActions }}\n        {{> controls/toggle name='private' value=1 checked=private\n            class='small monochrome nomobile'\n            withLabel=false id=(concat 'graph_' _id '_public')\n            tooltip=(byindex private 'Make private' 'Make public')\n            markup=(unescape 'data-action=\"toggleprivate\"')\n            }}\n\n        {{!--\n        duplicate\n        publish/unpublish\n        download\n        move\n        --}}\n        {{>action act='delete' text='Delete' class='warn nomobile' icon='icon-ca-delete'}}\n\t{{/if}}\n</div>"
  },
  {
    "path": "views/partials/assets/graphCard.handlebars",
    "content": "{{!-- test for owner with #eq visitor.username this.owner --}}\n{{!-- also this.private (true|false) --}}\n{{#*inline 'action'}}\n    {{!-- context graph --}}\n    {{#if svg}}\n        <{{#eq tag 'a'}}a href=\"{{path}}\"{{else}}button{{/eq}}\n            class=\"btn svg action {{#if main}}mainaction{{/if}} {{act}} {{class}}\" data-action=\"{{act}}\" data-svgref=\"{{svg}}\">\n            <svg />\n    {{else}}\n        <{{#eq tag 'a'}}a href=\"{{path}}\"{{else}}button{{/eq}}\n            class=\"btn action {{#if main}}mainaction{{/if}} {{act}} {{class}}\" data-action=\"{{act}}\">\n    {{/if}}\n            <span>{{#if text}}{{text}}{{else}}{{act}}{{/if}}</span>\n        </{{#eq tag 'a'}}a{{else}}button{{/eq}}>\n{{/inline}}\n\n{{#* inline 'meta'}}\n    <div class=\"meta scrollbar\">\n        {{#if ownerInfo}}\n            <a class=\"avatar\" href=\"/{{ownerInfo.username}}\">\n                {{#if ownerInfo.profile.avatar}}\n                    <img src=\"{{ownerInfo.profile.avatar}}\" />\n                {{else}}\n                    <img src=\"/images/v2/avatar-head.png\" />\n                {{/if}}\n            </a>\n        {{else}}\n            <img class=\"avatar\" src=\"/images/v2/avatar-head.png\" />\n        {{/if}}\n\t\t<h4>\n            {{#unless (equals withLinks false)}}\n                <a href=\"{{path}}\">{{prettyName}}</a>\n            {{else}}\n                {{prettyName}}\n            {{/unless}}\n\n            <span class=\"description user\">by <a style=\"margin-right:0.5em;color:#666;\" href=\"/{{owner}}\">{{owner}}</a></span>\n            <span class=\"description stat\">\n                {{#if size}}\n                    <span class=\"stat size\">{{size}}</span>\n                {{/if}}\n                {{#if views}}\n                    <span class=\"stat views\">{{views}} {{#eq views 1}}view{{else}}views{{/eq}}</span>\n                {{/if}}\n            </span>\n        </h4>\n\t</div>\n{{/inline}}\n\n{{#* inline 'metaInternal'}}\n    <div class=\"meta scrollbar\">\n        <a class=\"vizor avatar\" href=\"{{userLink}}\"><img src=\"{{avatar}}\" /></a>\n\t\t<h4>\n            {{#unless (equals withLinks false)}}\n                <a href=\"{{path}}\">{{prettyName}}</a>\n            {{else}}\n                {{prettyName}}\n            {{/unless}}\n        <span class=\"description user\">\n            by <a style=\"margin-right:0.5em;color:#666;\" href=\"{{userLink}}\">{{username}}</a>\n        </span>\n        </h4>\n\t</div>\n{{/inline}}\n\n{{#* inline 'meta360'}}\n    {{> metaInternal . prettyName='360 Photo' username='360.vizor.io' userLink='//360.vizor.io'\n            avatar='/images/v2/avatar-360.svg' }}\n{{/inline}}\n\n{{#* inline 'metaExamples'}}\n    {{> metaInternal . username='Vizor Examples' userLink='/examples'\n            avatar='/images/v2/avatar-vizor.svg' }}\n{{/inline}}\n\n{{#*inline 'actionLink'}}{{> action . tag='a'}}{{/inline}}\n{{#*inline 'actionButton'}}{{> action . tag='button'}}{{/inline}}\n\n{{#unless (equals withJSON false)}}\n    {{> assets/graphCardJS . }}\n{{/unless}}\n\n    <article class=\"graph asset card {{#if private}}private{{/if}} noselect\"\n         data-objectid=\"{{_id}}\" data-sortid=\"{{updatedTS}}\" data-path=\"{{path}}\" data-url=\"/{{owner}}/{{name}}\" data-asset-type=\"graph\">\n\n        {{#eq this.owner 'v'}}\n            {{> meta360 .}}\n        {{else eq this.owner 'examples'}}\n            {{> metaExamples .}}\n        {{else}}\n            {{> meta .}}\n        {{/eq}}\n\n        {{#if previewUrlLarge}}\n         <div class=\"image\" style=\"background-image: url('{{previewUrlLarge}}');\">\n        {{else if previewUrlSmall}}\n         <div class=\"image fromsmall\" style=\"background-image: url('{{previewUrlSmall}}');\">\n        {{else}}\n         <div class=\"image noimage\">\n        {{/if}}\n\n\t\t<div class=\"overlay flexcenter noselect_all\">\n            {{#if withActions}}\n                {{#eq visitor.username this.owner}}\n                    {{> assets/commonActions . id=_id context=\"graph\" }}\n                {{/eq}}\n            {{/if}}\n\n            <div class=\"mainActionsWrap\">\n                {{!-- view --}}\n                {{#unless (equals withActionView false) }}\n                    {{#eq visitor.username this.owner}}\n                        {{> actionLink main=true act='view' text='View' svg='eye-21x13' }}\n                    {{else}}\n                        {{> actionLink main=true act='view' text='View' svg='eye-21x13' class='expand' }}\n                    {{/eq}}\n                {{/unless}}\n\n                {{!-- edit --}}\n                {{#unless (equals withActionEdit false) }}\n                    {{#eq visitor.username this.owner}}\n                        {{> actionLink main=true act='edit' text='Edit' svg='player-icon-edit' path=(concat path '/edit') class='nomobile' }}\n                    {{/eq}}\n                {{/unless}}\n\n                {{!-- welcome dialog --}}\n                {{#if withActionChoose }}\n                    {{> action main=true act='choose' text='Open' class='expand' }}\n                {{/if}}\n            </div>\n\n            <p class=\"meta\">\n                {{#if size}}<span class=\"stat size\">{{size}}</span>{{/if}}\n                {{#if views}}\n                <span class=\"stat views\">\n                    <svg style=\"fill:#afbfdf; width:16px; height:10px; \"><use xlink:href=\"#eye-16x10\"></use></svg>\n                    {{views}} <span>{{#eq views 1}}view{{else}}views{{/eq}}</span></span>\n                {{/if}}\n            </p>\n\t\t</div>\n\t</div>\n</article>"
  },
  {
    "path": "views/partials/assets/graphCardJS.handlebars",
    "content": "{{!--\n    // adds this graph card's data to Vizor.pageObjects.graphs{}\n    // also places graph._creator data in Vizor.pageObjects.profiles{}\n    // NB it is highly likely that Vizor.pageObjects is not a store yet\n    // NB also see userpages.js\n--}}\n<script>\n    (function() {\n        var j = {{{json this deleteKeys=\"withActions,allowAllActions,withLinks,withActionEdit,withActionView,withActionChoose\"}}}\n        var page = window.Vizor.pageObjects\n        {{#if _id}}\n            page.graphs['{{_id}}'] = j\n        {{else}}\n            page.graphs['{{{path}}}'] = j\n        {{/if}}\n\n        {{#if _creator}}\n            if (!page.profiles['{{_creator}}'])\n                page.profiles['{{_creator}}'] = {}\n\n            {{#if profile}}\n                page.profiles['{{_creator}}'] = {{{json profile}}}\n            {{/if}}\n            page.profiles['{{_creator}}']['_id'] = j._creator\n        {{/if}}\n\n    })();\n</scr{{undefined}}ipt>"
  },
  {
    "path": "views/partials/assets/newCard.handlebars",
    "content": "<article class=\"asset new card noselect {{class}}\" data-objectid=\"\" data-asset-type=\"{{assetType}}\">\n\t<div class=\"meta scrollbar\">\n\t\t<h4 class=\"editable\"><a href=\"{{path}}\">Create {{assetTypeText}}</a></h4>\n\t</div>\n\t<div class=\"image new\">\n        {{> controls/svgLink class='action mainaction new' href=path svgref=iconRef text=(concat 'New' assetTypeText) }}\n\t</div>\n</article>"
  },
  {
    "path": "views/partials/assets/projectCard.handlebars",
    "content": "<!-- project #{{uid}} -->\n{{!--\n\tproject {\n\t\towner: 'eesn',\n\t\tname: 'Test graph',\n\t\tupdatedAt: 'Wed Oct 14 2015 17:01:37 GMT+0100 (BST)'\n\n\t\tuid: (unique identifier)\n\t\ttitle:\n\t\tdescription:\n\t\timage: (src)\n\t\t(\n\t\tgraphs: [\n\t\t\t{}\n\t\t]\n\t\t)\n\t}\n--}}\n<article class=\"project asset card\" data-objectid=\"{{_id}}\" data-url=\"#{{owner}}/{{title}}\" data-asset-type=\"project\">\n\t<div class=\"meta\">\n\t\t<h4 class=\"editable\" data-svgref=\"icon-ca-rename\">{{title}}</h4>\n\t\t<p class=\"description\">{{description}}</p>\n\t</div>\n\t<div class=\"image\" style=\"background-image: url('{{image}}');\">\n\t\t<div class=\"overlay\">\n\t\t\t{{> assets/commonActions id=uid context=\"project\"}}\n\t\t\t<button class=\"btn action open\" data-action=\"open\">\n\t\t\t\tOpen\n\t\t\t</button>\n\t\t</div>\n\t</div>\n</article>"
  },
  {
    "path": "views/partials/breadcrumb.handlebars",
    "content": "<div class=\"breadcrumb in\">\n\t{{#each crumbs}}\n\t\t{{#unless @first}}\n\t\t\t{{#with ../options}}\n\t\t\t\t{{#if useSeparator}}\n\t\t\t\t\t{{#if separatorHtml}}\n\t\t\t\t\t\t{{separatorHtml}}\n\t\t\t\t\t{{else}}\n\t\t\t\t\t\t<svg class=\"separator\"><use xlink:href=\"#breadcrumb-separator\"></use></svg>\n\t\t\t\t\t{{/if}}\n\t\t\t\t{{/if}}\n\t\t\t{{/with}}\n\t\t{{/unless}}\n\t\t<span class=\"crumb\"><!-- crumb: {{@index}} -->\n\t\t\t{{#if this.link}}\n\t\t\t\t<a data-uid=\"{{this.uid}}\" href=\"{{this.link}}\">{{this.text}}</a>\n\t\t\t{{else}}\n\t\t\t\t{{this.text}}\n\t\t\t{{/if}}\n\t\t</span>\n\t{{/each}}\n</div>"
  },
  {
    "path": "views/partials/browse/graphList.handlebars",
    "content": "{{#*inline 'render'}}\n    {{#each list}}\n        {{!-- context (this) is graph --}}\n        {{#eq ../profile.username ../user.username}}\n            {{> assets/graphCard visitor=../user profile=../profile withActions=true allowAllActions=true }}\n        {{else}}\n            {{> assets/graphCard visitor=../user profile=../profile withActions=true }}\n        {{/eq}}\n    {{/each}}\n{{/inline}}\n{{!-- {{>graphlist . list=publicGraphs heading='Public projects' withNew=(equals profile.username user.username)}} --}}\n<section class=\"list assets clearfix noselect {{class}}\"\n        data-with-new=\"{{withNew}}\"\n        data-with-actions=\"{{withActions}}\"\n        data-allow-all-actions=\"{{allowAllActions}}\"\n        data-profile=\"{{profile.username}}\"\n         {{!-- check if list is paginated --}}\n         {{#if list.meta}}\n             data-offset=\"{{list.meta.offset}}\"\n             data-limit=\"{{list.meta.limit}}\"\n             data-numitems=\"{{list.meta.listCount}}\"\n         {{else}}\n             data-numitems=\"{{length list}}\"\n         {{/if}}\n>\n{{#if heading}}\n    <h4>{{heading}}</h4>\n{{/if}}\n\n{{#if withNew}}\n    {{#if newAssetTypeText }}\n        {{> assets/newCard assetType='graph' assetTypeText=newAssetTypeText path='/edit' iconRef='card-new-project-2' class=class}}\n    {{else}}\n        {{> assets/newCard assetType='graph' assetTypeText='project' path='/edit' iconRef='card-new-project-2' class=class}}\n    {{/if}}\n{{/if}}\n\n     {{#if list.meta}}\n        {{>render . list=list.list}}\n\n        {{#if withPagination}}\n            {{>pagination (makePaginationData list.meta)}}\n        {{/if}}\n     {{else}}\n         {{>render .}}\n     {{/if}}\n\n    {{#if withMoreLink}}\n    <p class=\"more\" style=\"clear:both;\">\n        <a href=\"{{{moreLinkHref}}}\" class=\"more\">&raquo; {{moreLinkText}}</a>\n    </p>\n    {{/if}}\n</section>\n"
  },
  {
    "path": "views/partials/browse/graphSmall.handlebars",
    "content": "{{> assets/graphCardJS .}}\n<article class=\"small vizor graph\" data-id=\"{{id}}\" data-owner=\"{{owner}}\" itemscope itemtype=\"http://schema.org/CreativeWork\">\n    <a href=\"{{{path}}}\" itemprop=\"sameAs url\">\n        <img src=\"{{{previewUrlSmall}}}\" alt=\"{{name}} thumbnail\" itemprop=\"thumbnailUrl\" />\n    </a>\n    <div class=\"text\" itemprop=\"description\">\n        <h3><span itemprop=\"name\">{{prettyName}}</span></h3>\n        <p class=\"by\"><span>\n            by <span itemprop=\"creator\" class=\"author\" itemscope itemtype=\"http://schema.org/Person\">\n                    <a itemprop=\"sameAs\" rel=\"author\" target=\"_top\"\n                       {{#if graph.owner}}\n                            href=\"/{{graph.owner}}\"\n                       {{else}}\n                           {{#if graphOwnerLink}} href=\"{{graphOwnerLink}}\" {{/if}}\n                       {{/if}}>\n                        <span itemprop=\"name\">{{prettyOwner}}</span></a>\n                </span><!-- /creator -->\n            {{#if graph.size}}<span itemprop=\"contentSize\">({{graph.size}})</span>{{/if}}\n        </span></p>\n    </div>\n</article>"
  },
  {
    "path": "views/partials/controls/svgButton.handlebars",
    "content": "<button type=\"button\"\n    {{#if href}}\n        {{#if target}}\n            onclick=\"window.open('{{{href}}}','{{{target}}}');return false;\"\n        {{else}}\n            onclick=\"window.location='{{{href}}}';return false;\"\n        {{/if}}\n    {{/if}}\n\n    id=\"{{id}}\" class=\"svg\">\n    <svg><use xlink:href=\"#{{svgref}}\"></use></svg>\n    <span>{{text}}</span>\n</button>"
  },
  {
    "path": "views/partials/controls/svgLink.handlebars",
    "content": "<a href=\"{{href}}\" id=\"{{id}}\" class=\"svg btn {{class}}\"  target=\"{{target}}\">\n    <svg><use xlink:href=\"#{{svgref}}\"></use></svg>\n    <span>{{text}}</span>\n</a>"
  },
  {
    "path": "views/partials/controls/toggle.handlebars",
    "content": "{{#if withLabel}}<label id=\"{{labelId}}\" for=\"{{id}}\">\n        {{#if checked}}{{labelOn}}{{else}}{{labelOff}}{{/if}}\n    </label>{{/if}}\n<label\n    {{#if tooltip}}\n        data-toggle='popover' data-placement='auto top' data-trigger='hover' data-delay='{\"show\":750, \"hide\":100}'\n        data-content='{{tooltip}}'\n    {{/if}}\n    class=\"toggleWrap {{class}}\"><input type=\"checkbox\" id=\"{{id}}\" class=\"toggle-rounded {{class}}\" name=\"{{name}}\" value=\"{{value}}\"\n              {{#if checked}}checked{{/if}} {{markup}} /><span></span></label>"
  },
  {
    "path": "views/partials/editor/nodeInspector.handlebars",
    "content": "<div class=\"propertiesContent nodeInspector\">\n\n    <section>\n        {{#if controls.common._enabled}}\n            {{#with controls.common}}\n                <div>\n                    <label>Name: </label>\n                    {{{nodeName}}}\n                </div>\n            {{/with}}\n        {{else}}\n            <p class=\"noSelection\">\n                select one graph node to see its properties\n            </p>\n        {{/if}}\n    </section>\n\n    {{#if controls.stateProps._enabled}}\n        <section class=\"collapsible\" id=\"propertiesSectionNode\">\n            {{#each controls.stateProps}}\n                {{#if this.dtName}}\n                    <div class=\"prop pt{{this.dtName}}\">\n                        <label>\n                            {{{this.control}}}\n                            {{this.label}}</label>\n\n                    </div>\n                {{/if}}\n            {{/each}}\n        </section>\n    {{/if}}\n\n    {{#if controls.slotProps._enabled}}\n        <section class=\"collapsible\" id=\"propertiesSectionSlots\">\n        {{#each controls.slotProps}}\n            {{#if this.dtName}}\n                <div class=\"prop pt{{this.dtName}}\">\n                    <label>\n                        {{{this.control}}}\n                        {{this.label}}</label>\n\n                </div>\n            {{/if}}\n        {{/each}}\n        </section>\n    {{/if}}\n\n</div>"
  },
  {
    "path": "views/partials/editor/objectProperties.handlebars",
    "content": "<div class=\"propertiesContent obj3d\">\n\n    {{#if properties.common.enabled}}\n\n        <section id=\"propertiesSectionPosition\" class=\"collapsible\">\n           <h4>\n               Position\n               <button id=\"propertiesResetPosition\" class=\"svg tiny\" data-svgref=\"icon-property-reset\" title=\"Reset Position\" />\n           </h4>\n\n            {{{controls.position.control}}}\n        </section>\n\n        <section id=\"propertiesSectionRotation\" class=\"collapsible\">\n           <h4>\n               Rotation\n               <button id=\"propertiesResetRotation\" class=\"svg tiny\" data-svgref=\"icon-property-reset\" title=\"Reset Rotation\" />\n           </h4>\n            {{{controls.rotation.control}}}\n        </section>\n\n        {{#unless adapter.selectedIsCamera}}\n        <section id=\"propertiesSectionScale\" class=\"collapsible\">\n           <h4>\n               Scale\n               <button id=\"propertiesResetScale\" class=\"svg tiny\" data-svgref=\"icon-property-reset\" title=\"Reset Scale\" />\n               <button id=\"propertiesLinkScale\" class=\"svg tiny \" data-svgref=\"icon-property-link\" title=\"Link XYZ\" />\n           </h4>\n             {{{controls.scale.control}}}\n        </section>\n        {{/unless}}\n\n        {{#if controls.meshProps}}\n            <section class=\"collapsible\" id=\"propertiesSectionMesh\">\n                {{#each controls.meshProps}}\n                    <div class=\"prop pt{{this.dtName}}\">\n                        <label>\n                            {{{this.control}}}\n                            {{this.label}}</label>\n\n                    </div>\n                {{/each}}\n            </section>\n        {{/if}}\n\n    {{else}}\n\n        <section class=\"noSelectionOnly\">\n            <p>Nothing selected</p>\n        </section>\n\n    {{/if}}\n\n</div>"
  },
  {
    "path": "views/partials/embedYoutube.handlebars",
    "content": "<iframe width=\"640\" height=\"360\"\n\t\tsrc=\"{{src}}\"\n\t\tframeborder=\"0\" allowfullscreen></iframe>\n"
  },
  {
    "path": "views/partials/error.handlebars",
    "content": "<section class=\"error\">\n    <p>\n        {{#if message}}\n            {{message}}\n        {{else}}\n            An error occurred.\n        {{/if}}\n    </p>\n\n    {{#if code}}\n        <p>Please check the details below:</p>\n        <code>\n          {{codeNum}} {{code}}\n        </code>\n    {{else}}\n        <p>Unfortunately we're a little short on details.</p>\n    {{/if}}\n\n    {{#unless withoutTryAgain}}\n        <p>Try again and if this keeps happening, please <a href=\"mailto:info@vizor.io?subject=where%27s%20the%20love%3F\">email us</a>.</p>\n    {{/unless}}\n</section>"
  },
  {
    "path": "views/partials/flash.handlebars",
    "content": "{{#if messages}}<div id=\"flash\">\n  {{#if messages.errors}}\n  <div class=\"in alert alert-danger animated fadeIn\">\n    <button class=\"close\" type=\"button\" data-dismiss=\"alert\">\n      <span class=\"ion-close-circled\"></span>\n    </button>\n    {{#each messages.errors}}\n    <div>{{this.message}}</div>\n    {{/each}}\n  </div>\n  {{/if}}\n\n  {{#if messages.info}}\n  <div class=\"in alert alert-info animated fadeIn\">\n    <button class=\"close\" type=\"button\" data-dismiss=\"alert\">\n      <span class=\"ion-close-circled\"></span>\n    </button>\n    {{#each messages.info}}\n    <div>{{this.message}}</div>\n    {{/each}}\n  </div>\n  {{/if}}\n\n  {{#if messages.success}}\n  <div class=\"in alert alert-success animated fadeIn\">\n    <button class=\"close\" type=\"button\" data-dismiss=\"alert\">\n      <span class=\"ion-close-circled\"></span>\n    </button>\n    {{#each messages.success}}\n    <div>{{this.message}}</div>\n    {{/each}}\n  </div>\n  {{/if}}\n</div>{{/if}}"
  },
  {
    "path": "views/partials/homeMobileMenu.handlebars",
    "content": "<div id=\"mobilemenu\" class=\"mobileonly overlay\" style=\"display:none;\">\n\t<div style=\"position:absolute; top:10px; right: 9px; width: 30px; height: 30px; z-index: 10; display: flex; justify-content: center;\">\n\t\t<button class=\"nofx\" id=\"mobileMenuCloseButton\">+</button>\n\t</div>\n\t<div id=\"menuContainer\">\n\t\t<ul>\n\t\t\t<li><a href=\"/browse\">Browse Projects</a></li>\n            <li><a href=\"http://vizorvr.herokuapp.com\">Public Slack</a></li>\n            <li><a class=\"github\" href=\"https://github.com/vizorvr/vizor\">Github</a></li>\n            <li><a href=\"http://youtube.com/Vizor_VR\">Youtube Tutorials</a></li>\n            <li><a href=\"http://vizor.io\">Visit Vizor.io</a></li>\n\t\t</ul>\n        <div>\n            <a href=\"/\">\n                <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" xmlns=\"http://www.w3.org/2000/svg\"><g fill=\"none\" fill-rule=\"evenodd\"><path d=\"M24.889 14.756v4.006c0 6.038-10.667-3.74-10.667 1.333v3.638\" stroke=\"#FFF\" stroke-width=\"2\"/><g transform=\"matrix(1 0 0 -1 10.222 31.2)\"><rect fill=\"#A311CE\" y=\".267\" width=\"8\" height=\"8\" rx=\"2\"/><circle fill=\"#080624\" cx=\"4\" cy=\"4.267\" r=\"1.778\"/><circle fill=\"#FFF\" cx=\"4\" cy=\"4.267\" r=\"1\"/></g><g transform=\"matrix(0 -1 -1 0 28.889 15.644)\"><rect fill=\"#3696FF\" transform=\"rotate(-90 4 4)\" width=\"8\" height=\"8\" rx=\"2\"/><g transform=\"rotate(-90 4 1.778)\"><circle fill=\"#080624\" cx=\"1.778\" cy=\"1.778\" r=\"1.778\"/><circle fill=\"#FFF\" cx=\"1.778\" cy=\"1.778\" r=\"1\"/></g></g><circle stroke=\"#FFF\" stroke-width=\"2\" transform=\"matrix(0 -1 -1 0 40 40)\" cx=\"20\" cy=\"20\" r=\"19\"/></g></svg>\n            </a>\n        </div>\n\t</div>\n</div>"
  },
  {
    "path": "views/partials/mailinglist.handlebars",
    "content": "<form action=\"//vizor.us9.list-manage.com/subscribe/post?u=18aabb3ca7b701a5acacc8aca&amp;id=4047a5b158\" id=\"newsletterForm\" method=\"POST\" id=\"mc-embedded-subscribe-form\" name=\"mc-embedded-subscribe-form\" class=\"clearfix validate\" target=\"_blank\" novalidate>\n    <fieldset>\n        <div class=\"form-input\" id=\"f_email\">\n            <label for=\"mce-EMAIL\">Email</label>\n            <input type=\"email\" id=\"mce-EMAIL\" name=\"EMAIL\" class=\"required\" placeholder=\"Email\">\n            <span class=\"message\"></span>\n        </div>\n\n        <div class=\"modal-error genericError\"><span></span></div>\n\n        <div style=\"position: absolute; left: -5000px;\" aria-hidden=\"true\"><input type=\"text\" name=\"b_18aabb3ca7b701a5acacc8aca_4047a5b158\" tabindex=\"-1\" value=\"\"></div>\n    </fieldset>\n\n    <button class=\"sign-btn action svg\" name=\"subscribe\" type=\"submit\">\n        <span>Subscribe</span>\n        <svg class=\"icon-sign-in\"><use xlink:href=\"#icon-go\"></use></svg>\n    </button>\n</form>\n\n<div class=\"modal-footer\">\n    <p>\n\t\tWe will only send you a newsletter and nothing else - we hate spam too.\n    </p>\n</div>"
  },
  {
    "path": "views/partials/mixpanel.handlebars",
    "content": "{{#if KEY_MIXPANEL}}\n\t(function(e,b){if(!b.__SV){var a,f,i,g;window.mixpanel=b;b._i=[];b.init=function(a,e,d){function f(b,h){var a=h.split(\".\");2==a.length&&(b=b[a[0]],h=a[1]);b[h]=function(){b.push([h].concat(Array.prototype.slice.call(arguments,0)))}}var c=b;\"undefined\"!==typeof d?c=b[d]=[]:d=\"mixpanel\";c.people=c.people||[];c.toString=function(b){var a=\"mixpanel\";\"mixpanel\"!==d&&(a+=\".\"+d);b||(a+=\" (stub)\");return a};c.people.toString=function(){return c.toString(1)+\".people (stub)\"};i=\"disable time_event track track_pageview track_links track_forms register register_once alias unregister identify name_tag set_config people.set people.set_once people.increment people.append people.union people.track_charge people.clear_charges people.delete_user\".split(\" \");\n\tfor(g=0;g<i.length;g++)f(c,i[g]);b._i.push([a,e,d])};b.__SV=1.2;a=e.createElement(\"script\");a.type=\"text/javascript\";a.async=!0;a.src=\"undefined\"!==typeof MIXPANEL_CUSTOM_LIB_URL?MIXPANEL_CUSTOM_LIB_URL:\"file:\"===e.location.protocol&&\"//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js\".match(/^\\/\\//)?\"https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js\":\"//cdn.mxpnl.com/libs/mixpanel-2-latest.min.js\";f=e.getElementsByTagName(\"script\")[0];f.parentNode.insertBefore(a,f)}})(document,window.mixpanel||[]);\n\tmixpanel.init(\"{{KEY_MIXPANEL}}\");\n{{else}}\n\twindow.mixpanel = {\n\t\tidentify: function() {},\n\t\talias: function() {},\n\t\tpeople: { set: function() {} },\n\t\ttrack: function() {\n\t\t\tconsole.log('mixpanel:', arguments)\n\t\t}\n\t}\n{{/if}}\n"
  },
  {
    "path": "views/partials/noWebGL.handlebars",
    "content": "<div class=\"error noWebGL\">\n    <svg style=\"width:100px; height: 200px; fill: #afbfdf;\">\n        <use xlink:href=\"#logo-big\"></use>\n    </svg>\n    <p>\n        {{#if embed}}\n            Vizor.io embedded VR content\n        {{else}}\n            Vizor.io\n        {{/if}}\n        requires a WebGL-capable browser.<br />\n\n        We recommend\n        <a href=\"http://google.com/chrome\" target=\"_top\">Google Chrome</a>\n        or\n        <a href=\"http://getfirefox.com\" target=\"_top\">Mozilla Firefox</a>.\n    </p>\n    <p>Please make sure you have WebGL enabled and try again.</p>\n</div>"
  },
  {
    "path": "views/partials/notification.handlebars",
    "content": "<div class=\"growl notification nt-type-{{type}}\">\n\t<div class=\"nt-content\">\n\t\t<div class=\"glyph\">\n\t\t\t{{#if fromUser.username}}\n\t\t\t\t{{#if fromUser.gravatar}}\n\t\t\t\t\t<div style=\"background-image: url('{{fromUser.gravatar}}');\" class=\"image-crop\"></div>\n\t\t\t\t{{else}}\n\t\t\t\t\t<div style=\"background-color: {{fromUser.color}};\" class=\"image-crop\"><span>{{fromUser.firstLetter}}</span></div>\n\t\t\t\t{{/if}}\n\t\t\t{{else}}\n\t\t\t\t<svg class=\"icon-{{type}}\"><use xlink:href=\"#icon-{{type}}\"></use></svg>\n\t\t\t{{/if}}\n\t\t</div>\n\t\t<div class=\"text\"><span>{{message}}</span></div>\n\t</div>\n</div>"
  },
  {
    "path": "views/partials/pagination.handlebars",
    "content": "{{!--\nUIPagination.fromMeta:\nlog .\n  totalPages:  (total number of pages)\n  perPage:     (number of results per page)\n  currentPage: (this page number)\n  totalCount:  (total results)\n  thisPageCount: (on this page)\n  moreCount:    (remaining)\n  pages: [] (all pages)\n  displayPages: []  (only pages to display)\n  nextPage\n  prevPage\n  firstPage\n  lastPage\n  thisPage,\n  shouldDisplayFirstPageLink,\n  shouldDisplayLastPageLink,\n  shouldDisplayFirstPageEllipsis,\n  shouldDisplayLastPageEllipsis\n--}}\n<div class=\"clearfix\" style=\"clear: both; height: 1px\"></div>\n{{#*inline 'pageLink'}}\n    {{!-- context is .. --}}\n    {{#if page}}\n    <a\n        {{#if (equals page.num currentPage)}}\n            class=\"current page {{class}}\"\n        {{else}}\n            class=\"page {{class}}\"\n        {{/if}}\n\n        {{#unless (equals page.displayStart page.displayEnd)}}\n            title=\"results {{page.displayStart}} - {{page.displayEnd}} of {{totalCount}}\"\n        {{else}}\n            title=\"result {{page.displayStart}} of {{totalCount}}\"\n        {{/unless}}\n\n        {{#if baseUrl}} {{!-- supply via meta.baseUrl to render href=\"/baseurl/page/#\" --}}\n            href=\"{{{baseUrl}}}page/{{{page.num}}}\"\n        {{else}}\n            href=\"{{{replaceQueryParameters start=page.start }}}\"\n        {{/if}}\n\n        data-num=\"{{page.num}}\"\n    >\n        {{#if text}}\n            {{{text}}}\n        {{else}}\n            {{page.num}}\n        {{/if}}\n    </a>\n    {{/if}}\n{{/inline}}\n<div class=\"pagination\"\n     data-totalcount=\"{{totalCount}}\" data-thispagecount=\"{{thisPageCount}}\"\n     data-displaystart=\"{{thisPage.displayStart}}\" data-displayend=\"{{thisPage.displayEnd}}\"\n     data-totalpages=\"{{totalPages}}\" data-perpage=\"{{perPage}}\" data-currentpage=\"{{currentPage}}\"\n     data-baseurl=\"{{{baseUrl}}}\">\n\n    {{>pageLink page=prevPage text='Previous' class='prev'}}\n    {{>pageLink page=nextPage text='Next' class='next'}}\n\n</div>"
  },
  {
    "path": "views/partials/peopleMenu.handlebars",
    "content": "<div class=\"meta\">\n\tUsers currently viewing your graph\n</div>\n<div class=\"peopleList scrollbar\">\n\t<ul class=\"graph-users\">\n\t\t{{#each people}}\n\t\t<li data-uid=\"{{uid}}\">\n\t\t\t<div class=\"icon\" style=\"background-color: {{color}}\"></div>\n\t\t\t<div class=\"user-info\">\n\t\t\t\t<span class=\"name\">{{username}}</span>\n\t\t\t\t<span class=\"info\">{{#if itsMe}}This is you :){{/if}}</span>\n\t\t\t</div>\n\t\t\t{{!--\n\t\t\t{{#unless itsMe}}\n\t\t\t<button\tclass=\"btn follow-state {{#if followed}}unfollow{{else}}follow{{/if}}\" >\n\t\t\t\t{{#if followed}}\n\t\t\t\t<svg class=\"icon-unfollow\"><use xlink:href=\"#icon-unfollow\"></use></svg>\n\t\t\t\t<span>Unfollow</span>\n\t\t\t\t{{else}}\n\t\t\t\t<svg class=\"icon-follow\"><use xlink:href=\"#icon-follow\"></use></svg>\n\t\t\t\t<span>Follow</span>\n\t\t\t\t{{/if}}\n\t\t\t</button>\n\t\t\t<button class=\"btn kick-user\" id=\"kick_user\">\n\t\t\t\t<svg class=\"icon-kick\"><use xlink:href=\"#icon-kick\"></use></svg>\n\t\t\t\t<span>Kick</span>\n\t\t\t</button>\n\t\t\t{{/unless}}\n\t\t\t--}}\n\t\t</li>\n\t\t{{/each}}\n\t</ul>\n</div>"
  },
  {
    "path": "views/partials/playerCanvas.handlebars",
    "content": "{{!-- e.g. /data/graph/user/file.json --}}\n<canvas\n\tid=\"webgl-canvas\"\n\tclass=\"webgl-canvas-normal\"\n\tstyle=\"background:transparent;width:{{width}};height:{{height}};\"\n\toncontextmenu=\"return false;\"\n\t{{#if autoplay}}\n    data-autoplay=\"true\"\n    {{/if}}\n\tdata-graph-url=\"{{graphSrc}}\"></canvas>"
  },
  {
    "path": "views/partials/playerShareDialog.handlebars",
    "content": "<article id=\"shareDialog\">\n\n    <section id=\"shareURL\">\n        <input type=\"text\" value=\"{{shareURL}}\" readonly />\n    </section>\n    <section id=\"embedSource\" class=\"collapsible\">\n        <label><a href=\"#embedcode\" class=\"trigger\">Embed code</a></label>\n        <textarea id=\"embedcode\" class=\"scrollbar target\" readonly\n        ><script src=\"{{embedOrigin}}/scripts/embed.js\" data-vizorurl=\"{{embedSrc}}\" /></textarea>\n    </section>\n</article>"
  },
  {
    "path": "views/partials/profile.handlebars",
    "content": "{{!-- context is (user) profile --}}\n<div class=\"user-profile\" data-objectid=\"{{id}}\">\n    <div class=\"avatar\">\n        {{#with profile}}{{!-- profile.profile --}}\n           <a href=\"/{{../username}}\">\n                {{#if avatar}}\n                    <img class=\"user avatar\" src=\"{{avatar}}\" />\n                {{else}}\n                    {{#eq ../username 'v'}}\n                        <img class=\"user vizor avatar\" src=\"/images/v2/avatar-360.svg\" />\n                    {{else eq ../username 'examples'}}\n                        <img class=\"user vizor avatar\" src=\"/images/v2/avatar-vizor.svg\" />\n                    {{else}}\n                        <img class=\"user default avatar\" src=\"/images/v2/avatar-head.png\" />\n                    {{/eq}}\n                {{/if}}\n            </a>\n        {{/with}}\n    </div>\n    <div class=\"meta userinfo\">\n        <h2>\n            {{#if name}}\n                {{name}}\n            {{else}}\n                @{{username}}\n            {{/if}}\n        </h2>\n\n        <p class=\"strapline\">\n            {{#if profile.bio}}\n                {{profile.bio}}\n            {{else}}\n                Patches user\n                {{#if createdAt}}\n                    since {{moment createdAt 'MMM Do YYYY'}}\n                {{/if}}\n            {{/if}}\n        </p>\n        <ul class=\"meta\">\n            <li class=\"website\">\n                {{#if profile.website}}\n                    <a href=\"{{profile.website}}\" target=\"_blank\">{{friendlyURL profile.website}}</a>\n                {{else}}\n                    <a href=\"{{concat '//vizor.io/' username}}\" target=\"_blank\">{{friendlyURL (concat 'http://vizor.io/' username)}}</a>\n                {{/if}}\n            </li>\n            <li class=\"stats\">\n               <span class=\"count\">{{plural stats.projects 'project'}}</span>\n               <span class=\"count\">{{plural stats.views 'view'}}</span>\n            </li>\n            {{!--\n            <li class=\"email\">\n                {{> email to=email subject='hello'}}\n            </li> --}}\n        </ul>\n    </div>\n</div>\n"
  },
  {
    "path": "views/partials/userpulldown.handlebars",
    "content": "{{!-- context is (user) profile --}}\n{{#if username }}\n    <button id=\"btn-account-top\" data-hideshow-target=\"userpulldowncontainer\">\n        <span class=\"top-userpic\">\n            <img class=\"user avatar\"\n                {{#if profile.avatarScaled}}\n                    src=\"{{profile.avatarScaled}}\"\n                {{else if profile.avatar}}\n                    src=\"{{profile.avatar}}\"\n                {{else}}\n                    src=\"/images/v2/avatar-head.png\"\n                {{/if}}\n            />\n        </span>\n        <span id=\"userpulldownUsername\">{{username}}</span>\n    </button>\n\n    <div id=\"userpulldowncontainer\" style=\"display: none\">\n        <ul id=\"userPullDown\">\n            <li id=\"dropdownMyFilesLi\">\n                <a href=\"/{{username}}\">My Files</a>\n            </li>\n            <li>\n                <a class=\"account\" href=\"/account\">Account Details</a>\n            </li>\n            <li>\n                <a href=\"/logout\">Sign out</a>\n            </li>\n        </ul>\n    </div>\n\n\n{{else}}\n\n<button class=\"btn svg action login\" id=\"btn-sign-in\" data-action=\"login\">\n\t<svg class=\"icon-sign-in\"><use xlink:href=\"#icon-sign-in\"></use></svg>\n\t<span>Sign in</span>\n</button>\n\n{{/if}}\n"
  },
  {
    "path": "views/patch_editor/help_shortcuts.handlebars",
    "content": "{{#with this.keys}}\n    <div class=\"threecol clearfix\">\n        <div class=\"col left\">\n            <h3>Global</h3>\n\n            <dl class=\"clearfix\">\n                <dt>Build / Program</dt>\n                <dd>{{{toggleMode}}}</dd>\n                <dt>Editor / VR Camera</dt>\n                <dd>{{{toggleEditorCamera}}}</dd>\n                <dt>Enter fullscreen</dt>\n                <dd>{{{toggleFullScreen}}}</dd>\n                <dt>Exit fullscreen</dt>\n                <dd><kbd class=\"wide\">Esc</kbd></dd>\n                <dt>Cut</dt>\n                <dd>{{{modMeta}}} + <kbd>x</kbd></dd>\n                <dt>Copy</dt>\n                <dd>{{{modMeta}}} + <kbd>c</kbd></dd>\n                <dt>Paste</dt>\n                <dd>{{{modMeta}}} + <kbd>v</kbd></dd>\n                <dt>Undo</dt>\n                <dd>{{{modMeta}}} + <kbd>z</kbd></dd>\n                <dt>Hide all panels</dt>\n                <dd>{{{toggleFloatingPanels}}}</dd>\n                <dt>Search patches</dt>\n                <dd>{{{focusPatchSearch}}} / {{{focusPatchSearchAlt}}}</dd>\n                <dt>Object inspector</dt>\n                <dd>{{{openInspector}}}</dd>\n            </dl>\n\n        </div>\n        <div class=\"col mid\" style=\"width: 38%\">\n            <h3>Build</h3>\n            <dl class=\"clearfix\">\n                <dt>Navigate to patch</dt>\n                <dd>{{{navigateToPatch}}}</dd>\n                <dt>Move</dt>\n                <dd>{{{modifyModeMove}}}</dd>\n                <dt>Rotate</dt>\n                <dd>{{{modifyModeRotate}}} / {{{modMeta}}}</dd>\n                <dt>Scale</dt>\n                <dd>{{{modifyModeScale}}} / {{{modShift}}} + {{{modMeta}}}</dd>\n                <dt><abbr title=\"Sets the selected VR camera position to the current editor position\">Zero VR Camera</abbr></dt>\n                <dd>{{{moveVRCameraToEditorCamera}}}</dd>\n                <dt><abbr title=\"Switch camera to orthographic mode, i.e. remove all perspective from the camera view.\">Orthographic Camera</abbr></dt>\n                <dd>{{{toggleWorldEditorOrthographicCamera}}}</dd>\n                <dt><abbr title=\"Toggle between rectangular and radial helper grids\">Switch Grid Type</abbr></dt>\n                <dd>{{{toggleWorldEditorGrid}}}</dd>\n                <dt><abbr title=\"Toggle all build helper objects on/off\">Toggle Helpers</abbr></dt>\n                <dd>{{{toggleEditorHelpers}}}</dd>\n                <dt><abbr title=\"Toggle local/global transform handles\">Toggle Local Handles</abbr></dt>\n                <dd>{{{toggleWorldEditorLocalGlobalHandles}}}</dd>\n                <dt><abbr title=\"Align camera to primary axis. Holding shift will reverse camera direction.\">Align Camera to Axis</abbr></dt>\n                <dd>{{{toggleWorldEditorXCamera}}} / {{{toggleWorldEditorYCamera}}} / {{{toggleWorldEditorZCamera}}}</dd>\n                <dt><abbr title=\"Frame the camera view around selected objects\">Frame Selection</abbr></dt>\n                <dd>{{{frameViewToSelection}}}</dd>\n            </dl>\n\n        </div>\n        <div class=\"col right\" style=\"width: 28%\">\n\n            <h3>Program</h3>\n            <dl class=\"clearfix\">\n\n                <dt>Go to parent graph</dt>\n                <dd>{{{gotoParentGraph}}}</dd>\n\n                <dt>View source</dt>\n                <dd>{{{viewSource}}}</dd>\n\n                <dt>Input proxy</dt>\n                <dd><kbd>1</kbd></dd>\n                <dt>Nested Patch</dt>\n                <dd><kbd>2</kbd></dd>\n                <dt>Slider</dt>\n                <dd><kbd>3</kbd></dd>\n                <dt>Number</dt>\n                <dd><kbd>4</kbd></dd>\n                <dt>Float</dt>\n                <dd><kbd>5</kbd></dd>\n                <dt>Multiply Number</dt>\n                <dd><kbd>6</kbd></dd>\n                <dt>XYZ to Vector</dt>\n                <dd><kbd>7</kbd></dd>\n                <dt>Toggle</dt>\n                <dd><kbd>8</kbd></dd>\n                <dt>Knob</dt>\n                <dd><kbd>9</kbd></dd>\n                <dt>Output proxy</dt>\n                <dd><kbd>0</kbd></dd>\n            </dl>\n\n        </div>\n    </div>\n{{/with}}\n"
  },
  {
    "path": "views/patch_editor/helpscreen.handlebars",
    "content": "{{#* inline 'helpTile'}}\n    <a href=\"{{href}}\" target=\"_blank\" class=\"svg help {{type}}\" data-svgref=\"welcome-{{type}}\"\n\t\tstyle=\"background-image:url('/images/v2/welcome/welcome-{{type}}.jpg')\">\n        <svg />\n        <span>{{text}}</span>\n    </a>\n{{/inline}}\n<div class=\"tabbed\" data-activetab=\"{{activeTab}}\" id=\"helpContainer\">\n    <nav>\n        <a href=\"#helpExamples\">Examples</a>\n        <a href=\"#helpLinks\">Help</a>\n    </nav>\n    <section id=\"helpExamples\" class=\"tab-flex\">\n\t\t{{#each examples}}\n        \t{{> assets/graphCard this withActionEdit=false withActionView=false withActionChoose=true withLinks=false withJSON=false }}\n\t\t{{/each}}\n    </section>\n    <section id=\"helpLinks\" class=\"tab-flex\">\n        {{>helpTile text='Tutorial Channel' type='youtube' href='http://youtube.com/Vizor_VR' }}\n        {{>helpTile text='Tutorial Channel' type='vimeo' href='http://vimeo.com/vizorvr' }}\n        {{>helpTile text='Tutorial Blog' type='blog' href='http://blog.vizor.io' }}\n        {{>helpTile text='@VizorPatches' type='twitter' href='http://twitter.com/VizorPatches' }}\n        {{>helpTile text='Vizor Facebook' type='facebook' href='http://facebook.com/vrvizor' }}\n        {{>helpTile text='Join our Public Slack' type='slack' href='http://vizorvr.herokuapp.com' }}\n    </section>\n</div>\n"
  },
  {
    "path": "views/patch_editor/intro.handlebars",
    "content": "<article class=\"minislides\" id=\"editorIntro\">\n\t<h1 class=\"brandTop\">\n\t\t<svg style=\"fill:#fff;\" width=\"128\" height=\"32\" >\n\t\t\t<use x=\"-35\" y=\"0\" transform=\"scale(1)\" xlink:href=\"#vizor-logo-flat\" />\n\t\t\t<use x=\"58\" y=\"7\"  transform=\"scale(0.65)\" xlink:href=\"#vizor-top-logo\" />\n\t\t</svg>\n\t</h1>\n\t<div class=\"slides\">\n\t\t<section style=\"background-image:url('/images/v2/welcome/mountain.jpg');\">\n\t\t\t<aside>\n\t\t\t\t<ul>\n\t\t\t\t\t<li><a href=\"//blog.vizor.io\" target=\"_blank\">Blog</a></li>\n\t\t\t\t\t<li><a href=\"https://www.vimeo.com/vizorvr\" target=\"_blank\">Watch a tutorial</a></li>\n\t\t\t\t\t<li><a href=\"#\" class=\"view-create360\">Create a 360 Photo</a></li>\n\t\t\t\t\t<li><a href=\"#\" class=\"view-example\">View an example</a></li>\n\t\t\t\t</ul>\n\t\t\t\t{{#unless user.username}}\n\t\t\t\t<ul>\n\t\t\t\t\t<li><a href=\"/login\" class=\"sign-up\">Sign up</a></li>\n\t\t\t\t\t<li><a href=\"/signup\" class=\"sign-in\">Sign in</a></li>\n\t\t\t\t</ul>\n\t\t\t\t{{else}}\n\t\t\t\t<ul>\n\t\t\t\t\t<li><a href=\"#\" class=\"modal-close\">Dive in</a></li>\n\t\t\t\t</ul>\n\t\t\t\t{{/unless}}\n\t\t\t\t<p>\n\t\t\t\t\tNeed help from a human?<br />\n\t\t\t\t\tJust ask in the chat channel.\n\t\t\t\t</p>\n\t\t\t</aside>\n\t\t\t<a href=\"#\" class=\"cta btn launch-button slide-next\">Take a quick tour</a>\n\t\t</section>\n\n\t\t<section>\n\t\t\t<aside>\n\t\t\t\t<h5>Build and program</h5>\n\t\t\t\t<p>Build with objects and program with patches. Press Tab to switch between Build and Program modes.</p>\n\t\t\t</aside>\n\t\t\t<img src=\"/images/v2/welcome/tab.png\" height=\"256\" />\n\t\t</section>\n\n\t\t<section>\n\t\t\t<aside>\n\t\t\t\t<h5>Drag and Drop</h5>\n\t\t\t\t<p>Drag and drop objects in Build mode and patches when in Program mode.</p>\n\t\t\t</aside>\n\t\t\t<img src=\"/images/v2/welcome/drag_and_drop.png\"  height=\"256\"/>\n\t\t</section>\n\n\t\t<section>\n\t\t\t<aside>\n\t\t\t\t<h5>Connect your patches</h5>\n\t\t\t\t<p>Connect and modify patches to add effects and interaction.</p>\n\t\t\t</aside>\n\t\t\t<img src=\"/images/v2/welcome/patch.png\" height=\"248\"/>\n\t\t</section>\n\n\t\t<section>\n\t\t\t<aside>\n\t\t\t\t<h5>Publish your scene</h5>\n\t\t\t\t<p>Share your work with others by publishing it. You'll need to be signed in to do this.</p>\n\t\t\t</aside>\n\t\t\t<img src=\"/images/v2/welcome/publish.png\" height=\"114\" />\n\t\t</section>\n\n\t\t<section style=\"background-image:url('/images/v2/welcome/mountain.jpg');\">\n\t\t\t<aside>\n\t\t\t\t<ul>\n                    <li><a href=\"//blog.vizor.io\" target=\"_blank\">Blog</a></li>\n\t\t\t\t\t<li><a href=\"https://vimeo.com/vizorvr\" target=\"_blank\">Watch a tutorial</a></li>\n\t\t\t\t\t<li><a href=\"#\" class=\"view-create360\">Create a 360 Photo</a></li>\n\t\t\t\t\t<li><a href=\"#\" class=\"view-example\">View an example</a></li>\n\t\t\t\t</ul>\n\t\t\t\t{{#unless user.username}}\n\t\t\t\t<ul>\n\t\t\t\t\t<li><a href=\"/signup\" class=\"sign-up\">Sign up</a></li>\n\t\t\t\t\t<li><a href=\"/login\" class=\"sign-in\">Sign in</a></li>\n\t\t\t\t</ul>\n\t\t\t\t{{else}}\n\t\t\t\t<ul>\n\t\t\t\t\t<li><a href=\"#\" class=\"modal-close\">Dive in</a></li>\n\t\t\t\t</ul>\n\t\t\t\t{{/unless}}\n\t\t\t\t<p>\n\t\t\t\t\tNeed help from a human?<br />\n\t\t\t\t\tJust ask in the chat channel.\n\t\t\t\t</p>\n\t\t\t</aside>\n\t\t\t<a href=\"#\" class=\"cta btn launch-button modal-close\">Get Started</a>\n\t\t</section>\n\t</div>\n</article>\n"
  },
  {
    "path": "views/patch_editor/ui_plugin__default.handlebars",
    "content": "<div class='p_header'>\n    <div class='p_wrap'>\n        <button class='toggle'>{{{toggle_control}}}</button>\n        <div class='ic p_ins'>{{{plugin_inline_input}}}</div>\n        <span class='t p_title'>{{{node_title}}}</span>\n        <button class='edit'>{{{edit_control}}}</button>\n        <div class='ic p_outs'>{{{plugin_inline_output}}}</div>\n    </div>\n</div>\n<div class='p_content'>\n    <div class='ic p_ins'>{{{plugin_inputs}}}</div>\n    <div class='cc p_ui_col p_plugin'>\n        {{{plugin_content}}}\n    </div>\n    <div class='ic p_outs'>{{{plugin_outputs}}}</div>\n</div>"
  },
  {
    "path": "views/patch_editor/ui_plugin_input_proxy.handlebars",
    "content": "<div class=\"p_header p_inline\">\n    <div class=\"p_wrap\">\n        <span class=\"t p_title\">{{{node_title}}}</span>\n        <svg class=\"p_icon\"><use xlink:href=\"#vp-plugin-icon-input-proxy\"></use></svg>\n        <div class=\"ic p_outs\">{{{plugin_inline_output}}}</div>\n    </div>\n</div>"
  },
  {
    "path": "views/patch_editor/ui_plugin_output_proxy.handlebars",
    "content": "<div class=\"p_header p_inline\">\n    <div class=\"p_wrap\">\n        <div class=\"ic p_ins\">{{{plugin_inline_input}}}</div>\n        <svg class=\"p_icon\"><use xlink:href=\"#vp-plugin-icon-output-proxy\"></use></svg>\n        <span class=\"t p_title\">{{{node_title}}}</span>\n    </div>\n</div>"
  },
  {
    "path": "views/patch_editor/ui_plugin_url_texture_generator_with_url.handlebars",
    "content": "<div class=\"p_header\"><!-- remove _with_url from filename to use this template -->\n    <div class=\"p_wrap\">\n        <button class='toggle'>{{{toggle_control}}}</button>\n        <div class=\"ic p_ins\">{{{plugin_inline_input}}}</div>\n        <span class=\"t p_title\">{{{node_title}}}</span>\n        <button class='edit'>{{{edit_control}}}</button>\n        <div class=\"ic p_outs\">{{{plugin_inline_output}}}</div>\n    </div>\n</div>\n<div class=\"p_content\">\n    <div class=\"ic p_ins\">{{{plugin_inputs}}}</div>\n    <div class=\"ic p_outs\">{{{plugin_outputs}}}</div>\n</div>\n<div class=\"cc p_ui_col p_plugin\">\n    {{{plugin_content}}}\n</div>"
  },
  {
    "path": "views/patch_editor/ui_plugin_variable_local_read.handlebars",
    "content": "<div class=\"p_header p_inline\">\n    <div class=\"p_wrap\">\n        <span class=\"t p_title\">{{{node_title}}}</span>\n        <svg class=\"p_icon p_stroke p_nofill\"><use xlink:href=\"#vp-plugin-icon-variable-read\"></use></svg>\n        <div class=\"ic p_outs\">{{{plugin_inline_output}}}</div>\n    </div>\n</div>"
  },
  {
    "path": "views/patch_editor/ui_plugin_variable_local_write.handlebars",
    "content": "<div class=\"p_header p_inline\">\n    <div class=\"p_wrap\">\n        <div class=\"ic p_ins\">{{{plugin_inline_input}}}</div>\n        <svg class=\"p_icon p_stroke p_nofill\"><use xlink:href=\"#vp-plugin-icon-variable-write\"></use></svg>\n        <span class=\"t p_title\">{{{node_title}}}</span>\n    </div>\n</div>"
  },
  {
    "path": "views/patches/patches.handlebars",
    "content": "{{!-- used more than once on same page, mind id-s --}}\n<div class=\"searchbox\">\n\t<svg class=\"icon-search\"><use xlink:href=\"#icon-search\"></use></svg>\n\t<input\n\t\tid=\"search_{{controlId}}\"\n\t\tclass=\"form-control\"\n\t\ttype=\"text\"\n\t\tplaceholder=\"{{searchPlaceholderText}}\"\n        autocomplete=\"off\"\n        autocorrect=\"off\"\n        autocapitalize=\"off\"\n        spellcheck=\"false\"\n\t\tonfocus=\"this.placeholder = ''\" \n\t\tonblur=\"this.placeholder = '{{searchPlaceholderText}}'\"/>\n</div>\n\n<div class=\"patch-list-container\">\n\t<div class=\"patch-list-content scrollbar\">\n\t\t<div class=\"patch-result patch-list-contained-box\"></div>\n\n\t\t<div class=\"panel-group selectControl patch-list-contained-box\" id=\"{{controlId}}\">\n\t\t\t{{#each categories}}\n\t\t\t<div class=\"panel panel-default\">\n\n\t\t\t\t<div class=\"panel-heading collapsed\"\n\t\t\t\t\tdata-toggle=\"collapse\"\n\t\t\t\t\tdata-category=\"{{@key}}\"\n\t\t\t\t\tdata-parent=\"#{{../controlId}}\"\n\t\t\t\t\thref=\"#cscat{{../controlId}}-{{@index}}\">\n\t\t\t\t\t\t{{@key}}\n\t\t\t\t</div>\n\t\t\t\n\t\t\t\t<div id=\"cscat{{../controlId}}-{{@index}}\"\n\t\t\t\t\tclass=\"panel-collapse collapse\">\n\n\t\t\t\t\t<div class=\"panel-body\">\n\t\t\t\t\t\t<ul>\n\t\t\t\t\t\t\t{{#each this}}\n\t\t\t\t\t\t\t<li \n\t\t\t\t\t\t\t\tdata-category=\"{{category}}\"\n\t\t\t\t\t\t\t\tdata-path=\"{{path}}\"\n\t\t\t\t\t\t\t\tdata-type=\"{{type}}\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<div class=\"score\"></div>\n\t\t\t\t\t\t\t<span class=\"title\">{{title}}</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t{{/each}}\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t{{/each}}\n\n\t\t</div>\n\t</div>\n\n</div>\n"
  },
  {
    "path": "views/patches/results.handlebars",
    "content": "<table class=\"result table table-hover table-condensed table-striped\">\n\t{{#each this}}\n\t<tr>\n\t\t<td data-path=\"{{path}}\" class=\"result-item\">\n\t\t<!-- {{score}}: -->\n\t\t\t<span class=\"title\">{{title}}</span>\n\t\t\t<span class=\"category\">{{category}}</span>\n\t\t</td>\n\t</tr>\n\t{{/each}}\n</table>\n"
  },
  {
    "path": "views/server/pages/about.handlebars",
    "content": "<header>\n    {{> srv/home/_header }}\n</header>\n\n\t{{> srv/home/aboutIntro }}\n\t{{> srv/home/aboutTeam }}\n\t{{> srv/home/aboutPresskit }}\n\n{{> srv/home/_footer }}"
  },
  {
    "path": "views/server/pages/account/forgotPassword.handlebars",
    "content": "<div id=\"contentcontainer\" class=\"in\">\n\t<section class=\"center\">\n\t\t<h2 class='decorative'><span>Forgot your password?</span></h2>\n\n\t\t{{> account/forgotpassword }}\n\t</section>\n</div>"
  },
  {
    "path": "views/server/pages/account/login.handlebars",
    "content": "<div id=\"contentcontainer\" class=\"in\">\n\t<section class=\"center\">\n\t\t<h2 class='decorative'><span>Sign in</span></h2>\n\n\t\t{{> account/login }}\n\t</section>\n</div>"
  },
  {
    "path": "views/server/pages/account/profile.handlebars",
    "content": "{{#*inline 'section'}}\n    <section id=\"{{id}}\"\n        {{#if collapsed}} class=\"collapsible collapsed\" {{else}} class=\"collapsible\" {{/if}}>\n    <h3><a href=\"#{{id}}\" class=\"toggle\">{{name}}</a></h3>\n      <div>\n        {{> (lookup . 'view') }}\n      </div>\n  </section>\n{{/inline}}\n\n <div id=\"contentcontainer\" class=\"in\">\n  {{!-- context is profile --}}\n\n    {{>section id='editName' name=\"Name\" view='srv/account/editName' collapsed=false }}\n    {{>section id='editPassword' name=\"Password\" view='srv/account/editPassword' collapsed=true }}\n    {{>section id='editEmail' name=\"Email address\" view='srv/account/editEmail' collapsed=true }}\n    {{>section id='editBio' name=\"Bio\" view='srv/account/editBio' collapsed=true }}\n    {{>section id='editWebsite' name=\"Website\" view='srv/account/editWebsite' collapsed=true }}\n    {{>section id='editImages' name=\"Avatar & Header\" view='srv/account/editPics' collapsed=true }}\n\n      <section id=\"editDefaults\">\n         <h3>Publish Defaults</h3>\n        {{> srv/account/editDefaults }}\n     </section>\n\n      <section>\n          <h3>Sign out</h3>\n          <a class='btn action logout svg' data-svgref=\"icon-go\" data-action='logout' href='/logout'>Click here to sign out</a>\n      </section>\n\n\n    {{>section id='profileDelete' name=\"Delete account\" view='srv/account/deleteAccount' collapsed=true }}\n\n</div>"
  },
  {
    "path": "views/server/pages/account/setPassword.handlebars",
    "content": "<div id=\"contentcontainer\" class=\"in\">\n\t<section class=\"center\">\n\t\t<h2 class='decorative'><span>Forgot your password?</span></h2>\n        <p>\n            You can set a new password here. <br />\n            Passwords must be at least 6 characters long.\n        </p>\n\t\t{{> srv/account/changepassword }}\n\t</section>\n</div>"
  },
  {
    "path": "views/server/pages/account/signup.handlebars",
    "content": "<div id=\"contentcontainer\" class=\"in\">\n\t<section class=\"center\">\n\t\t<h2 class='decorative'><span>Sign up</span></h2>\n\n\t\t{{> account/signup }}\n\t</section>\n</div>"
  },
  {
    "path": "views/server/pages/userpage.handlebars",
    "content": "{{#*inline 'userEmpty'}}\n    <p class=\"explain emptylist\">\n        {{#eq profile.username user.username}}\n            This is where your projects will be listed.\n        {{else}}\n            {{profile.username}} has not saved any projects yet.\n        {{/eq}}\n    </p>\n{{/inline}}\n\n<div id=\"contentcontainer\" class=\"in\">\n    {{#if graphs}}\n        {{>browse/graphList . list=graphs class='public' withPagination=true}}\n    {{else}}\n        {{#if isSummaryPage}}\n            {{!-- front page (summary) --}}\n            {{>browse/graphList . list=publicGraphs\n                class='public'\n                withNew=(equals profile.username user.username)\n                newAssetTypeText='Public Project'\n                withMoreLink=publicHasMoreLink moreLinkText='All public projects' moreLinkHref='?public=1'\n            }}\n            {{>browse/graphList . list=privateGraphs\n                class='private'\n                withNew=(equals profile.username user.username)\n                newAssetTypeText='Private Project'\n                withMoreLink=privateHasMoreLink moreLinkText='All private projects' moreLinkHref='?public=0'\n            }}\n        {{else}}\n            {{#unless (or publicGraphs privateGraphs)}}\n                {{>userEmpty}}\n            {{/unless}}\n\n            {{!-- filtered public/private lists --}}\n            {{#if publicGraphs}}\n                {{>browse/graphList . list=publicGraphs\n                    withPagination=true\n                    class='public'\n                    withNew=(equals profile.username user.username)\n                    newAssetTypeText='Public Project'\n                }}\n            {{/if}}\n\n            {{#if privateGraphs}}\n                {{>browse/graphList . list=privateGraphs\n                    withPagination=true\n                    class='private'\n                    withNew=(equals profile.username user.username)\n                    newAssetTypeText='Private Project'\n                }}\n            {{/if}}\n        {{/if}}\n    {{/if}}\n</div>"
  },
  {
    "path": "views/server/partials/account/account.handlebars",
    "content": "{{#if errors}}\n\t<ul class=\"errors\">\n\t\t{{#each errors}}\n\t\t\t<li>{{msg}}</li>\n\t\t{{/each}}\n\t</ul>\n{{/if}}\n\n<form method=\"POST\" action=\"/account/profile\" id=\"accountDetailsForm\"\n\t  class=\"panel form-horizontal {{#if errors}}{{#each errors}}err_{{param}} {{/each}}{{/if}}\">\n    <input type=\"hidden\" name=\"_csrf\" value={{_csrf}}>\n    {{#with profile}}\n    <fieldset>\n\n        <div class=\"form-input\" id=\"f_name\">\n            <label for=\"name_id\">Name</label>\n            <input type=\"text\" class=\"required\" placeholder=\"Your name\" name=\"name\" id=\"name_id\" value=\"{{name}}\" tabindex=\"0\">\n            <span class=\"message\"></span>\n        </div>\n\n        {{!--\n        <div class=\"form-input\" id=\"f_username\">\n            <label for=\"username_id\">Username</label>\n            <input type=\"text\" class=\"required\" placeholder=\"Username\" name=\"username\" value=\"{{user.username}}\" id=\"username_id\" >\n            <span class=\"message\"></span>\n        </div>\n        --}}\n\n        <div class=\"form-input\" id=\"f_email\">\n            <label for=\"email_id\">Email</label>\n            <input type=\"email\" class=\"required\" name=\"email\" value=\"{{email}}\" id=\"email_id\" placeholder=\"Email\" tabindex=\"0\" >\n            <span class=\"message\"></span>\n        </div>\n\n        <div class=\"modal-error\" id=\"unknown_error\"><span></span></div>\n    </fieldset>\n    {{/with}}\n\n    <button id=\"update-profile-btn\" class=\"sign-btn svg\" type=\"submit\">\n        <span>Update Account</span>\n        <svg class=\"icon-sign-in\"><use xlink:href=\"#icon-go\"></use></svg>\n    </button>\n\n</form>\n\n{{#if modal }}\n<div class=\"modal-footer clearfix twocol\">\n\t{{!-- <div class=\"col left\"><a href=\"#/account/delete\" id=\"delete_account\">Delete account</a></div> #704 --}}\n\t<div class=\"col right pull\"><a href=\"#/changepassword\" id=\"changePasswordLink\">Change password</a></div>\n</div>\n{{/if}}\n"
  },
  {
    "path": "views/server/partials/account/changepassword.handlebars",
    "content": "{{!-- used on reset password page --}}\n<form id=\"resetPasswordForm\" class=\"panel\" method=\"POST\"\n\t{{#if token}}{{!-- used to change password; to reset password using token it submits elsewhere--}}\n\t\taction=\"\"\n\t{{else}}\n\t\taction=\"/account/password\"\n\t{{/if}}\n\t> {{!-- #717 --}}\n    <input type=\"hidden\" name=\"_csrf\" value={{_csrf}}>\n\n\t{{#if token}}\n    \t<input type=\"hidden\" name=\"token\" value=\"{{token}}\" />\n\t{{/if}}\n\n    <fieldset>\n        <div class=\"form-input\" id=\"f_password\">\n            <label for=\"passwordinput\">Password</label>\n            <input type=\"password\" class=\"required\" placeholder=\"Password\"  name=\"password\" id=\"passwordinput\" tabindex=\"1\">\n            <span class=\"message\"></span>\n        </div>\n\n        <div class=\"form-input\" id=\"f_confirm\">\n            <label for=\"confirmpasswordinput\">Confirm password</label>\n            <input type=\"password\" class=\"required\" placeholder=\"Confirm password\" name=\"confirm\" id=\"confirmpasswordinput\" tabindex=\"2\">\n            <span class=\"message\"></span>\n        </div>\n\n        <div class=\"modal-error\" id=\"unknown_error\"><span></span></div>\n    </fieldset>\n\n    <button id=\"rest-btn\" class=\"sign-btn svg\" type=\"submit\">\n        <span>Change password</span>\n        <svg class=\"icon-sign-in\"><use xlink:href=\"#icon-go\"></use></svg>\n    </button>\n</form>"
  },
  {
    "path": "views/server/partials/account/deleteAccount.handlebars",
    "content": "<!-- Delete Account Form -->\n  <form action=\"/account/delete\" method=\"POST\">\n      {{!-- keep p.explain first for css --}}\n      <p class=\"explain\">Note: You do not need to delete your account if you just want to change your\n          email address or username. <br />\n          Please keep in mind that deleting your account is irreversible. It will also sign you out.</p>\n      <button type=\"submit\" class=\"btn svg warn action delete requireconfirm\" data-svgref=\"icon-go\"\n              data-confirmtext=\"Are you sure you wish to delete your account? This is IRREVERSIBLE!\"\n              onclick=\"return confirm('Are you sure you wish to delete your account? This is IRREVERSIBLE!');\">\n        Delete my account\n      </button>\n      <input type=\"hidden\" name=\"_csrf\" value={{_csrf}}>\n  </form>\n  <!-- / Delete Account form -->"
  },
  {
    "path": "views/server/partials/account/editBio.handlebars",
    "content": "<form id=\"editBioForm\" action=\"/account/profile\" class=\"xhr panel\" method=\"POST\">\n    <input type=\"hidden\" name=\"_csrf\" value={{_csrf}}>\n    <fieldset>{{#with profile}}\n        <div class=\"form-input\" id=\"f_bio\">\n            <!-- label for=\"bioinput\">Bio</label -->\n            <textarea id=\"bioinput\" name=\"profile[bio]\" style=\"resize:none\" placeholder=\"Place  here\">{{profile.bio}}</textarea>\n            <span class=\"message\"></span>\n        </div>\n        <button class=\"\" type=\"submit\" data-svgref=\"icon-go\">Update</button>\n        <span class=\"explain\">Maximum 140 characters.</span>\n    {{/with}}</fieldset>\n</form>\n"
  },
  {
    "path": "views/server/partials/account/editDefaults.handlebars",
    "content": "<form id=\"editDefaultsForm\" action=\"/account/profile\" class=\"xhr panel\" method=\"POST\">\n    {{#with profile}}<dl class=\"fieldset\">\n        <dt>\n           Set the default publish type to Public or Private. You can also change this for each project published.\n        </dt>\n        <dd class=\"form-input\" id=\"f_defaults_public\">\n            <label id=\"publishPublicPrivateLabel\" for=\"publishDefaultPublic\">\n                {{#if isPublic}}\n                    Public\n                {{else}}\n                    Private\n                {{/if}}\n            </label>\n\n            {{> controls/toggle id='publishDefaultPublicToggle'\n                name='publishDefaultPublicToggle' checked=preferences.publishDefaultPublic\n                value='1' markup=(unescape 'onchange=\"document.getElementById(\\'publishDefaultPublicHidden\\').value=(this.checked)?1:0;document.getElementById(\\'defaultsSubmitButton\\').click()\"')}}\n\n            <input type=\"hidden\" id=\"publishDefaultPublicHidden\" name=\"preferences[publishDefaultPublic]\" value=\"\" />\n        </dd>\n    </dl>{{/with}}\n    <span class=\"message\"></span>\n    <input type=\"hidden\" name=\"_csrf\" value={{_csrf}}>\n    <button style=\"display: none\" id=\"defaultsSubmitButton\" class=\"\" type=\"submit\">Update</button>\n</form>\n"
  },
  {
    "path": "views/server/partials/account/editEmail.handlebars",
    "content": "<form id=\"editEmailForm\" action=\"/account/profile\" class=\"xhr panel\" method=\"POST\"> {{!-- #717 --}}\n    <input type=\"hidden\" name=\"_csrf\" value={{_csrf}}>\n\n    <p>Your email address is <span>{{profile.email}}</span></p>\n\n    {{#with profile}}<fieldset>\n\n        <div class=\"form-input\" id=\"f_email_current_password\">\n            <label for=\"email_currentpasswordinput\">Current password</label>\n            <input type=\"password\" class=\"required\" placeholder=\"\" name=\"current_password\" id=\"email_currentpasswordinput\" tabindex=\"11\">\n            <a href=\"#\" class=\"forgotPassword needhelp\">Forgot your password?</a>\n            <span class=\"message\"></span>\n        </div>\n\n        <div class=\"form-input\" id=\"f_newemail\">\n            <label for=\"email_passwordinput\">New email address</label>\n            <input type=\"email\" class=\"required\" placeholder=\"{{user.email}}\"  name=\"email\" id=\"emailinput\" tabindex=\"12\">\n            <span class=\"message\"></span>\n        </div>\n\n        <div class=\"modal-error\" id=\"unknown_error\"><span></span></div>\n    </fieldset>{{/with}}\n\n    <button class=\"\" type=\"submit\" data-svgref=\"icon-go\">Update</button>\n</form>"
  },
  {
    "path": "views/server/partials/account/editName.handlebars",
    "content": "{{!-- context is user(profile) --}}\n<form id=\"editNameForm\" action=\"/account/profile\" class=\"xhr panel\" method=\"POST\">\n    <input type=\"hidden\" name=\"_csrf\" value={{_csrf}}>\n    {{#with profile}}<fieldset>\n        <div class=\"form-input\" id=\"f_name\">\n            <input type=\"text\" id=\"nameinput\" name=\"name\" placeholder=\"\" value=\"{{name}}\" />\n            <button class=\"\" type=\"submit\" data-svgref=\"icon-go\">Update</button>\n            <span class=\"message\"></span>\n        </div>\n    </fieldset>{{/with}}\n</form>\n"
  },
  {
    "path": "views/server/partials/account/editPassword.handlebars",
    "content": "<form id=\"resetPasswordForm\" class=\"xhr panel\" action=\"/account/profile\" method=\"POST\">{{!-- action is . --}}\n    <input type=\"hidden\" name=\"_csrf\" value={{_csrf}}>\n\n    <fieldset>{{#with profile}}\n        <div class=\"form-input\" id=\"f_current_password\">\n            <label for=\"currentpasswordinput\">Current Password</label>\n            <input type=\"password\" class=\"required\" placeholder=\"\" name=\"current_password\" id=\"currentpasswordinput\" tabindex=\"1\">\n            <a href=\"#\" class=\"forgotPassword needhelp\">Forgot your password?</a>\n            <span class=\"message\"></span>\n        </div>\n\n        <div class=\"form-input\" id=\"f_password\">\n            <label for=\"passwordinput\">New password</label>\n            <input type=\"password\" class=\"required\" placeholder=\"Password\"  name=\"password\" id=\"passwordinput\" tabindex=\"1\">\n            <span class=\"message\"></span>\n        </div>\n\n        {{!--\n        <div class=\"form-input\" id=\"f_confirm\">\n            <label for=\"confirmpasswordinput\">Confirm password</label>\n            <input type=\"password\" class=\"required\" placeholder=\"Confirm password\" name=\"confirm\" id=\"confirmpasswordinput\" tabindex=\"2\">\n            <span class=\"message\"></span>\n        </div> --}}\n\n        <meter id=\"passwordStrengthMeter\" value=\"0\" title=\"maximum strength\"\n               max=\"5\" min=\"0\" low=\"2\" high=\"4\" optimum=\"5\"></meter>\n\n        <div class=\"modal-error\" id=\"unknown_error\"><span></span></div>\n    {{/with}}</fieldset>\n\n    <button id=\"rest-btn\" class=\"sign-btn svg\" type=\"submit\" data-svgref=\"#icon-go\">\n        <span>Change password</span>\n    </button>\n</form>"
  },
  {
    "path": "views/server/partials/account/editPics.handlebars",
    "content": "{{#with profile}}\n <section id=\"profileEditAvatar\">\n    <form id=\"avatarUploadForm\" method=\"post\" class=\"xhr\" action=\"/account/profile/avatar\" enctype=\"multipart/form-data\">\n        <div class=\"droptarget\"></div>\n        {{#if profile.avatar}}\n        <img class=\"user avatar\" src=\"{{profile.avatar}}\" />\n        {{else}}\n        <img class=\"user gr avatar\" src=\"{{profile.gravatar}}\" />\n        {{/if}}\n\n        <button class=\"withWaitState spinner\" type=\"button\" style=\"margin-left:20px\" onclick=\"document.getElementById('avatarUploadFile').click()\">\n            Choose avatar\n            <svg class=\"waitOff\"><use xlink:href=\"#icon-go\"></use></svg>\n            <svg class=\"waitOn\"><use xlink:href=\"#icon-button-spinner\"></use></svg>\n        </button>\n\n        <button type=\"submit\" class=\"hide\" name=\"submit\" id=\"avatarUploadSubmit\">Upload</button>\n        <input type=\"file\" class=\"hide\" name=\"file\" id=\"avatarUploadFile\" onchange=\"if (this.value) document.getElementById('avatarUploadSubmit').click()\" />\n    </form>\n</section>\n\n<section id=\"profileEditHeader\">\n   <form id=\"headerUploadForm\" method=\"post\" class=\"xhr\" action=\"/account/profile/header\" enctype=\"multipart/form-data\">\n       <div class=\"droptarget\"></div>\n\n       <div class=\"user-header clearfix header-preview {{#unless profile.header}}noHeader{{/unless}}\" style=\"background: url('{{profile.header}}') center center; background-size: cover\"\n       ><div class=\"header-overlay\"></div></div>\n\n       {{!-- <input type=\"url\" id=\"headerUrlInput\" placeholder=\"Copy a vizor project URL here\" /> --}}\n       <button class=\"withWaitState spinner\" type=\"button\" style=\"margin:20px auto 20px 0\" onclick=\"document.getElementById('headerUploadFile').click()\">\n            Choose header image\n            <svg class=\"waitOff\"><use xlink:href=\"#icon-go\"></use></svg>\n            <svg class=\"waitOn\"><use xlink:href=\"#icon-button-spinner\"></use></svg>\n        </button>\n       <span class=\"explain\">Please use 1400 x 450px to avoid scaling.</span>\n\n       <button type=\"submit\" class=\"hide\" name=\"submit\" id=\"headerUploadSubmit\">Upload</button>\n       <input type=\"file\" class=\"hide\" name=\"file\" id=\"headerUploadFile\" onchange=\"if (this.value) document.getElementById('headerUploadSubmit').click()\" />\n   </form>\n</section>\n{{/with}}"
  },
  {
    "path": "views/server/partials/account/editUsername.handlebars",
    "content": "{{!-- context is (user) profile --}}\n<form id=\"editUsernameForm\" action=\"/account/profile\" class=\"panel\" method=\"POST\">\n    <input type=\"hidden\" name=\"_csrf\" value={{_csrf}}>\n    {{#with profile}}<fieldset>\n        <div class=\"form-input\" id=\"f_username\">\n            <input type=\"url\" id=\"usernameinput\" name=\"username\" placeholder=\"username\" value=\"{{username}}\" />\n            <button class=\"\" type=\"submit\" data-svgref=\"icon-go\">Update</button>\n            <p class=\"explain\">\n                Usernames must be all lowercase.\n                They cannot be longer than 21 characters and can only contain letters, numbers, periods, hyphens, and underscores.\n                Most people choose to use their first name, last name, nickname, or some combination of those with initials.\n            </p>\n            <p class=\"explain\">\n                <b>Note:</b> this will change the addresses (URLs) of all your published projects.\n            </p>\n            {{!-- <span class=\"message\"></span> --}}\n        </div>\n    </fieldset>{{/with}}\n</form>\n"
  },
  {
    "path": "views/server/partials/account/editWebsite.handlebars",
    "content": "{{!-- context is user(profile) --}}\n<form id=\"editWebsiteForm\" action=\"/account/profile\" class=\"xhr panel\" method=\"POST\">\n    <input type=\"hidden\" name=\"_csrf\" value={{_csrf}}>\n    {{#with profile}}<fieldset>\n        <div class=\"form-input\" id=\"f_profile_website_\">\n            <input type=\"url\" id=\"websiteinput\" name=\"profile[website]\" placeholder=\"e.g. http://web.site\" value=\"{{profile.website}}\" />\n            <button class=\"\" type=\"submit\" data-svgref=\"icon-go\">Update</button>\n            <span class=\"message\"></span>\n        </div>\n    </fieldset>{{/with}}\n</form>\n"
  },
  {
    "path": "views/server/partials/editor/asset_panel.handlebars",
    "content": "<div class=\"assets-block vp-library floating-box\" id=\"assets-lib\" style=\"display:none\">\n\t\t<div class=\"block-header\">\n\t\t\t<button class=\"toggle-button\" id=\"assets-toggle\" type=\"button\">\n\t\t\t\t<svg class=\"icon-arrow-vertical\"><use xlink:href=\"#icon-arrow-vertical\"></use></svg>\n\t\t\t</button>\n\t\t\t<h4>Asset Library</h4>\n\t\t\t<button class=\"close-button\" id=\"assets-close\" type=\"button\">\n\t\t\t\t<svg class=\"icon-assets-close\"><use xlink:href=\"#icon-close\"></use></svg>\n\t\t\t</button>\n\t\t</div>\n\t\t<div id=\"assets\">\n\t\t\t<div class=\"searchbox\">\n\t\t\t\t<svg class=\"icon-search\"><use xlink:href=\"#icon-search\"/></svg>\n\t\t\t\t<input type=\"text\" onblur=\"this.placeholder = 'Search'\" onfocus=\"this.placeholder = ''\" placeholder=\"Search\" class=\"form-control\" id=\"assetSearch\">\n\t\t\t</div>\n\t\t\t<ul class=\"lib-tabs\" role=\"tablist\" id=\"assets-tabs\">\n\t\t\t\t<li class=\"active\">\n\t\t\t\t\t<a data-toggle=\"tab\" role=\"tab\" href=\"#sceneTab\" id=\"objectsTabBtn\">Objects</a>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<a data-toggle=\"tab\" role=\"tab\" href=\"#imageTab\" id=\"imagesTabBtn\">Images</a>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<a data-toggle=\"tab\" role=\"tab\" href=\"#audioTab\" id=\"audioTabBtn\">Audio</a>\n\t\t\t\t</li>\n\t\t\t\t<li>\n\t\t\t\t\t<a data-toggle=\"tab\" role=\"tab\" href=\"#videoTab\" id=\"videoTabBtn\">Video</a>\n\t\t\t\t</li>\n\t\t\t</ul>\n\t\t\t<div class=\"tab-content active\" id=\"sceneTab\">\n\t\t\t\t<div class=\"assets-frame scrollbar\">\n\t\t\t\t\t<div class=\"assets-group\">\n\t\t\t\t\t\t<span class=\"group-title\">Primitives</span>\n\t\t\t\t\t\t<ul class=\"assets-list\">\n\t\t\t\t\t\t\t<li class=\"active\">\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"assets-group\">\n\t\t\t\t\t\t<span class=\"group-title\">Primitives</span>\n\t\t\t\t\t\t<ul class=\"assets-list\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"tab-content\" id=\"imageTab\">\n\t\t\t\t<div class=\"assets-frame scrollbar\">\n\t\t\t\t\t<div class=\"assets-group\">\n\t\t\t\t\t\t<span class=\"group-title\">Images Group</span>\n\t\t\t\t\t\t<ul class=\"assets-list\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Image object</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"assets-group\">\n\t\t\t\t\t\t<span class=\"group-title\">Primitives</span>\n\t\t\t\t\t\t<ul class=\"assets-list\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"tab-content\" id=\"audioTab\">\n\t\t\t\t<div class=\"assets-frame scrollbar\">\n\t\t\t\t\t<div class=\"assets-group\">\n\t\t\t\t\t\t<span class=\"group-title\">Audio Group</span>\n\t\t\t\t\t\t<ul class=\"assets-list\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Audio object</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"assets-group\">\n\t\t\t\t\t\t<span class=\"group-title\">Primitives</span>\n\t\t\t\t\t\t<ul class=\"assets-list\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"tab-content\" id=\"videoTab\">\n\t\t\t\t<div class=\"assets-frame scrollbar\">\n\t\t\t\t\t<div class=\"assets-group\">\n\t\t\t\t\t\t<span class=\"group-title\">Video Group</span>\n\t\t\t\t\t\t<ul class=\"assets-list\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Video object</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"assets-group\">\n\t\t\t\t\t\t<span class=\"group-title\">Primitives</span>\n\t\t\t\t\t\t<ul class=\"assets-list\">\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t\t<li>\n\t\t\t\t\t\t\t\t<svg class=\"icon-asset\"><use xlink:href=\"#icon-asset-default\"></use></svg>\n\t\t\t\t\t\t\t\t<span>Sphere</span>\n\t\t\t\t\t\t\t</li>\n\t\t\t\t\t\t</ul>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"load-buttons\">\n\t\t\t\t<button id=\"#uploadAsset\">\n\t\t\t\t\t<svg class=\"icon-load\"><use xlink:href=\"#icon-upload\"></use></svg>\n\t\t\t\t\t<span>Upload</span>\n\t\t\t\t</button>\n\t\t\t\t<button id=\"#uploadAsset\">\n\t\t\t\t\t<svg class=\"icon-load\"><use xlink:href=\"#icon-download\"></use></svg>\n\t\t\t\t\t<span>Download</span>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t\t<div id=\"asset-info\">\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"asset-image\">\n\t\t\t\t\t\t<img src=\"images/logo-graphic.png\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"asset-details\">\n\t\t\t\t\t\t<span id=\"asset-type\">JSON file</span><br />\n\t\t\t\t\t\t<span id=\"asset-demensions\">6 polygons</span><br />\n\t\t\t\t\t\t<span id=\"asset-size\">26 KB</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n</div>"
  },
  {
    "path": "views/server/partials/editorSvgSprite.handlebars",
    "content": "<svg style=\"display:none;\">\n    <symbol id=\"editor-patches-wordmark\" viewBox=\"0 0 100 22\">\n        <path fill-rule=\"evenodd\" d=\"M.55 20.43V.57c0-.3.24-.57.57-.57h7.05c3.69 0 6.72 3 6.72 6.63 0 3.72-3.03 6.75-6.69 6.75H4.45v7.05c0 .3-.27.57-.57.57H1.12a.57.57 0 0 1-.57-.57zm3.9-10.71h3.6c1.68 0 2.97-1.35 2.97-3.12 0-1.65-1.29-2.91-2.97-2.91h-3.6v6.03zm12.18 6.87c0-2.46 2.01-4.35 5.52-4.35 1.41 0 2.67.39 2.67.39.06-1.77-.45-2.61-1.92-2.61-1.26 0-3.09.27-3.9.51-.45.15-.72-.18-.78-.6l-.3-1.56c-.12-.51.15-.75.45-.84.3-.12 2.49-.69 4.74-.69 4.32 0 5.22 2.25 5.22 6.03v7.47c0 .36-.3.66-.66.66h-1.02c-.24 0-.42-.09-.6-.48l-.39-.93c-.81.78-2.19 1.74-4.35 1.74-2.76 0-4.68-1.77-4.68-4.74zm3.6 0c0 1.17.72 1.95 2.01 1.95 1.23 0 2.31-.96 2.49-1.47v-2.04s-.93-.42-2.04-.42c-1.59 0-2.46.75-2.46 1.98zm12.75.27c0 2.4.78 4.47 3.87 4.47 1.44 0 3.42-.63 3.9-.9.33-.18.48-.45.39-.81l-.39-1.83c-.06-.33-.39-.51-.78-.36-.36.12-1.5.45-2.1.45-.69 0-1.14-.21-1.14-1.14V10.5h3.24c.36 0 .66-.33.66-.66V7.8c0-.39-.3-.66-.66-.66h-3.24V3.3c0-.36-.27-.66-.63-.66h-2.46c-.33 0-.66.3-.66.66v3.84h-1.35c-.36 0-.63.27-.63.66v2.04c0 .33.27.66.63.66h1.35v6.36zm9.93-2.79c0 4.17 3.27 7.26 7.32 7.26 2.46 0 4.32-1.08 5.49-2.91.24-.36.09-.69-.24-.99l-1.35-1.14c-.24-.21-.66-.15-.87.09-.6.69-1.41 1.53-2.94 1.53-2.16 0-3.63-1.68-3.63-3.84 0-2.13 1.5-3.81 3.66-3.81 1.29 0 2.1.57 2.76 1.2.27.27.6.42.9.09l1.26-1.38c.3-.3.45-.69.15-.99-1.32-1.41-3-2.34-5.16-2.34-4.11 0-7.35 3.15-7.35 7.23zm15.6 6.27c0 .36.33.66.66.66h2.37c.54 0 .72-.27.72-.66v-7.65c.36-1.41 1.26-2.43 2.88-2.43 1.65 0 2.52 1.17 2.52 3.09v6.99c0 .36.3.66.66.66h2.43c.33 0 .66-.3.66-.66v-6.96c0-3.48-1.2-6.54-5.61-6.54-1.65 0-2.85.57-3.54 1.17V.66c0-.33-.3-.66-.66-.66h-2.43c-.33 0-.66.33-.66.66v19.68zm15.72-6.27c0-3.9 2.88-7.23 6.99-7.23 3.6 0 6.36 2.67 6.36 6.42 0 .21-.03.69-.06.9-.03.36-.36.63-.66.63h-8.88c.03 1.71 1.44 3.21 3.45 3.21 1.38 0 2.34-.51 2.97-1.02.33-.27.69-.3.9 0l1.17 1.56c.24.27.27.6-.06.9a7.826 7.826 0 0 1-5.16 1.89c-4.14 0-7.02-3.3-7.02-7.26zm3.96-1.74h5.61c-.06-1.35-1.14-2.4-2.67-2.4-1.68 0-2.76 1.02-2.94 2.4zm16.32 9c3.48 0 5.34-1.95 5.34-4.14 0-2.76-1.92-3.72-4.59-4.8-1.29-.54-1.98-.87-1.98-1.5 0-.45.39-.9 1.32-.9 1.14 0 2.1.39 2.76.69.3.12.66.06.87-.27l.78-1.59c.18-.36 0-.72-.3-.96-.75-.48-2.07-1.02-4.11-1.02-3.39 0-4.98 1.95-4.98 4.05 0 2.1 1.2 3.36 3.87 4.38 1.83.72 2.61 1.29 2.61 1.92 0 .6-.48.99-1.53.99-1.44 0-2.43-.51-3.06-.9-.33-.21-.66-.09-.81.24l-.9 1.8c-.15.3 0 .63.18.75.78.54 2.22 1.26 4.53 1.26z\" />\n    </symbol>\n\t<symbol id=\"vizor-top-logo\" viewBox=\"0 0 66 24\">\n\t\t<polyline points=\"1,1 5.199,1 10.156,16.305 15.113,1 19.312,1 12.197,22.568 8.115,22.568 1,1 \"/>\n\t\t<rect x=\"20.154\" y=\"7.795\" width=\"3.994\" height=\"14.773\"/>\n\t\t<polyline points=\"25.458,18.965 33.128,11.372 25.576,11.372 25.576,7.795 38.493,7.795 38.493,11.43 30.825,18.994\n\t\t38.641,18.994 38.641,22.568 25.458,22.568 25.458,18.965 \"/>\n\t\t<path d=\"M50.152,15.182c0-2.098-1.633-3.84-3.674-3.84c-2.069,0-3.646,1.742-3.646,3.84\n\t\tc0,2.102,1.574,3.842,3.646,3.842C48.521,19.023,50.152,17.281,50.152,15.182z M38.927,15.182c0-4.253,3.354-7.682,7.554-7.682\n\t\ts7.553,3.428,7.553,7.682c0,4.256-3.354,7.686-7.553,7.686S38.927,19.438,38.927,15.182z\"/>\n\t\t<path d=\"M55.05,7.795h3.966v2.424c0.729-1.537,2.041-2.424,4.024-2.424h1.604v3.93h-2.537\n\t\tc-2.129,0-3.063,1.123-3.063,3.871v6.973H55.05V7.795\"/>\n\t\t<path d=\"M20.14,3.037C20.14,1.912,21.04,1,22.151,1c1.111,0,2.012,0.912,2.012,2.037\n\t\tc0,1.127-0.901,2.039-2.012,2.039C21.04,5.076,20.14,4.164,20.14,3.037\"/>\n\t</symbol>\n\t<symbol id=\"icon-file-menu\" viewBox=\"0 0 32 32\">\n\t\t<circle fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"16.021\" cy=\"16.035\" r=\"9.565\"/>\n\t\t<polygon fill=\"none\" stroke-miterlimit=\"10\" points=\"20.592,18.439 11.45,18.439 16.021,10.821 \"/>\n\t</symbol>\n\t<symbol id=\"icon-new-graph\" viewbox=\"0 0 32 32\">\n\t\t<circle fill=\"none\" stroke-miterlimit=\"10\" cx=\"23.413\" cy=\"25.063\" r=\"5.601\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" x1=\"23.413\" y1=\"27.813\" x2=\"23.413\" y2=\"22.311\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" x1=\"20.662\" y1=\"25.063\" x2=\"26.164\" y2=\"25.063\"/>\n\t\t<polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"14.768,25.063 5.432,25.063 5.45,7.462 23.032,7.444 23.032,17.496 \"/>\n\t\t<polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"18.367,18.395 16.545,13.836 14.023,19.385 11.501,16.357 8.632,21.262 \"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" x1=\"5.45\" y1=\"21.463\" x2=\"16.134\" y2=\"21.463\"/>\n\t\t<circle fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"9.832\" cy=\"12.262\" r=\"1.6\"/>\n\t</symbol>\n\t<symbol id=\"icon-duplicate\" viewbox=\"0 0 32 32\">\n\t\t<path fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.449,10.287c0.001-1.533,0-2.725,0-2.725 l17.582-0.018v17.618h-3.51\"/>\n\t\t<line fill=\"none\" stroke-miterlimit=\"10\" x1=\"22.832\" y1=\"21.563\" x2=\"25.857\" y2=\"21.563\"/>\n\t\t<polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"19.803,24.568 16.545,16.936 14.023,22.484 11.501,19.457 8.631,24.362 \"/>\n\t\t<polygon fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"5.432,28.162 5.449,10.562 23.031,10.544 23.031,28.162 \"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" x1=\"5.449\" y1=\"24.563\" x2=\"22.857\" y2=\"24.563\"/>\n\t\t<circle fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"9.832\" cy=\"15.362\" r=\"1.6\"/>\n\t</symbol>\n\t<symbol id=\"icon-scale\" viewbox=\"0 0 32 32\">\n\t\t<rect x=\"11.75\" y=\"11.476\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" width=\"9.167\" height=\"9.167\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"22.583\" y1=\"9.809\" x2=\"25.917\" y2=\"6.476\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"6.75\" y1=\"25.643\" x2=\"10.083\" y2=\"22.309\"/>\n\t\t<polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"10.917,25.643 6.75,25.643 6.75,21.477 \"/>\n\t\t<polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"25.917,10.643 25.917,6.476 21.75,6.476 \"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"22.583\" y1=\"22.309\" x2=\"25.917\" y2=\"25.643\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"6.75\" y1=\"6.476\" x2=\"10.083\" y2=\"9.809\"/>\n\t\t<polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"6.75,10.643 6.75,6.476 10.917,6.476 \"/>\n\t\t<polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"21.75,25.643 25.917,25.643 25.917,21.477 \"/>\n\t</symbol>\n\t<symbol id=\"icon-rotate\" viewbox=\"0 0 32 32\">\n\t\t<polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"4.927,14.257 7.714,18.408 10.919,14.571 \"/>\n\t\t<polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"27.5,18.559 24.714,14.408 21.508,18.245 \"/>\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M24.677,14.446 c0.835,4.408-2.272,8.728-6.509,9.728c-2.954,0.699-5.916-0.238-7.931-2.224\"/>\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M7.719,18.383 C6.406,13.5,9.688,8.709,14.257,7.63c3.156-0.747,6.316,0.372,8.324,2.641\"/>\n\t</symbol>\n\t<symbol id=\"icon-assets\" viewbox=\"0 0 32 32\">\n\t\t<circle fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"25.833\" cy=\"25.559\" r=\"5\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"25.833\" y1=\"23.059\" x2=\"25.833\" y2=\"28.059\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"28.333\" y1=\"25.559\" x2=\"23.333\" y2=\"25.559\"/>\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" d=\"M18.352,24.316 c-0.651,0.138-1.328,0.211-2.021,0.211c-5.362,0-9.709-4.348-9.709-9.709s4.347-9.709,9.709-9.709c5.362,0,9.709,4.347,9.709,9.709 c0,1.016-0.156,1.997-0.444,2.917\"/>\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M25.982,15.179 c-0.813,1.351-4.828,2.377-9.658,2.377c-4.635,0-8.52-0.945-9.544-2.216\"/>\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" stroke-dasharray=\"0,3.725\" d=\"M6.715,14.093 c0.904-1.313,4.814-2.301,9.501-2.301c5.356,0,9.698,1.29,9.698,2.882\"/>\n\t</symbol>\n\t<symbol id=\"icon-inspector\" viewbox=\"0 0 32 32\">\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M25.75,24.977 c0,0.459-0.372,0.832-0.833,0.832h-17.5c-0.461,0-0.833-0.373-0.833-0.832V8.309c0-0.46,0.373-0.833,0.833-0.833h17.5 c0.461,0,0.833,0.374,0.833,0.833V24.977z\"/>\n\t\t<circle fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"16.167\" cy=\"11.643\" r=\"1.667\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"17.832\" y1=\"11.643\" x2=\"23.268\" y2=\"11.643\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"9.1\" y1=\"11.643\" x2=\"14.497\" y2=\"11.643\"/>\n\t\t<circle fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"12.833\" cy=\"16.643\" r=\"1.667\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"14.497\" y1=\"16.643\" x2=\"23.266\" y2=\"16.643\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"9.1\" y1=\"16.643\" x2=\"11.164\" y2=\"16.643\"/>\n\t\t<circle fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"14.5\" cy=\"21.644\" r=\"1.667\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"16.164\" y1=\"21.643\" x2=\"23.268\" y2=\"21.643\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"9.1\" y1=\"21.643\" x2=\"12.833\" y2=\"21.643\"/>\n\t</symbol>\n\t<symbol id=\"icon-patches\" viewbox=\"0 0 32 32\">\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M17.833,25.552h-13 c-1.105,0-2-0.896-2-2v-14c0-1.104,0.895-2,2-2h19c1.104,0,2,0.896,2,2v8.507\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"9.833\" y1=\"7.559\" x2=\"9.833\" y2=\"24.552\"/>\n\t\t<circle fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"6.333\" cy=\"10.052\" r=\"0.5\"/>\n\t\t<circle fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"6.333\" cy=\"18.052\" r=\"0.5\"/>\n\t\t<circle fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"6.333\" cy=\"22.052\" r=\"0.5\"/>\n\t\t<circle fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"6.333\" cy=\"14.052\" r=\"0.5\"/>\n\t\t<circle fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"25.833\" cy=\"25.559\" r=\"5\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"25.833\" y1=\"23.059\" x2=\"25.833\" y2=\"28.059\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"28.333\" y1=\"25.559\" x2=\"23.333\" y2=\"25.559\"/>\n\t</symbol>\n\t<symbol id=\"icon-save-patch\" viewbox=\"0 0 32 32\">\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M18,25.552H5\n\tc-1.105,0-2-0.896-2-2v-14c0-1.104,0.895-2,2-2h19c1.104,0,2,0.896,2,2v8.507\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"10\" y1=\"7.559\" x2=\"10\" y2=\"24.552\"/>\n\t\t<circle fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"6.5\" cy=\"10.052\" r=\"0.5\"/>\n\t\t<circle fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"6.5\" cy=\"18.052\" r=\"0.5\"/>\n\t\t<circle fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"6.5\" cy=\"22.052\" r=\"0.5\"/>\n\t\t<circle fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"6.5\" cy=\"14.052\" r=\"0.5\"/>\n\t\t<polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"27.832,26.253 26.013,28.07 24.194,26.253 \"/>\n\t\t<circle fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"26\" cy=\"25.559\" r=\"5\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"26\" y1=\"23.285\" x2=\"26\" y2=\"28.07\"/>\n\t</symbol>\n\t<symbol id=\"icon-cam-view\" viewbox=\"0 0 32 32\">\n\t\t<polygon fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\" 18.25,19.809 10.75,19.809 10.75,12.309 18.25,12.309 18.25,15.226 21.584,13.143 21.584,18.977 18.25,16.893 \"/>\n\t\t<circle fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"16.167\" cy=\"16.059\" r=\"9.583\"/>\n\t</symbol>\n\t<symbol id=\"icon-graph\" viewbox=\"0 0 32 32\">\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" d=\"M6.997,12.5c-0.826,0-1.497,0.669-1.497,1.492 v7.016c0,0.823,0.671,1.492,1.497,1.492h5.006c0.826,0,1.497-0.669,1.497-1.492v-7.016c0-0.823-0.671-1.492-1.497-1.492H6.997z\"/>\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" d=\"M26.006,20.5c-0.83,0-1.506,0.676-1.506,1.506 v2.988c0,0.83,0.676,1.506,1.506,1.506h2.988c0.83,0,1.506-0.676,1.506-1.506v-2.988c0-0.83-0.676-1.506-1.506-1.506H26.006z\"/>\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" d=\"M26.006,7.5c-0.845,0-1.506,0.662-1.506,1.506 v2.988c0,0.831,0.676,1.506,1.506,1.506h2.988c0.845,0,1.506-0.662,1.506-1.506V9.006c0-0.831-0.676-1.506-1.506-1.506H26.006z\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" x1=\"13.5\" y1=\"18.5\" x2=\"24.5\" y2=\"23.5\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" x1=\"13.5\" y1=\"16.5\" x2=\"24.5\" y2=\"10.5\"/>\n\t</symbol>\n\t<symbol id=\"icon-editor\" viewbox=\"0 0 32 32\">\n\t\t<path fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M6.979,15.559h18H6.979z M4.313,20.559h23 H4.313z M8.535,11.726h14.667H8.535z M16.09,9.503v15.111V9.503z M18.646,9.059l5.224,15.723L18.646,9.059z M13.201,9.059 L7.979,24.782L13.201,9.059z M9.424,9.059H22.09l7.556,16H2.313L9.424,9.059z\"/>\n\t</symbol>\n\t<symbol id=\"icon-zoom\" viewbox=\"0 0 44 32\">\n\t\t<g transform=\"translate(-3,-3)\">\n\t\t\t<circle fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"22.082\" cy=\"16.559\" r=\"6.5\"/>\n\t\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"26.582\" y1=\"21.059\" x2=\"32.945\" y2=\"27.423\"/>\n\t\t</g>\n\t</symbol>\n\t<symbol id=\"icon-zoom-in\" viewbox=\"0 0 16 32\">\n\t\t<g transform=\"translate(-2,-3)\">\n\t\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"8.093\" y1=\"15.559\" x2=\"15.093\" y2=\"15.559\"/>\n\t\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"11.593\" y1=\"12.059\" x2=\"11.593\" y2=\"19.059\"/>\n\t\t</g>\n\t</symbol>\n\t<symbol id=\"icon-zoom-out\" viewbox=\"0 0 16 32\">\n\t\t<g transform=\"translate(-2,-3)\">\n\t\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"1.582\" y1=\"15.559\" x2=\"8.582\" y2=\"15.559\"/>\n\t\t</g>\n\t</symbol>\n\t<symbol id=\"icon-chat\" viewbox=\"0 0 32 32\">\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M19,8.076H8.31 c-2.361,0-4.275,1.915-4.275,4.276v4.276c0,2.362,1.914,4.276,4.275,4.276h1.604v4.275l4.276-4.275H19 c2.36,0,4.274-1.914,4.274-4.276v-4.276C23.275,9.991,21.361,8.076,19,8.076z\"/>\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M15.793,24.646 c0,1.476,1.196,2.672,2.672,2.672h2.673l3.207,3.207v-3.207h1.604c1.475,0,2.672-1.196,2.672-2.672v-2.139 c0-1.476-1.197-2.672-2.672-2.672\"/>\n\t</symbol>\n\t<symbol id=\"breadcrumb-separator\" viewbox=\"0 0 19 10\">\n\t\t<polyline fill=\"none\" stroke-width=\"1.494\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"8,2 11.404,5.404 8,8.809 \"/>\n\t</symbol>\n\t<symbol id=\"icon-arrow-vertical\" viewbox=\"0 0 16 16\">\n\t\t<path d=\"M13.017,5.137c-0.172,0-0.342,0.059-0.473,0.176L7.988,9.415L3.455,5.334c-0.26-0.234-0.682-0.234-0.942,0 c-0.261,0.235-0.261,0.614,0,0.849l5.005,4.504c0.26,0.233,0.682,0.233,0.942,0l5.028-4.525c0.261-0.234,0.261-0.614,0-0.849 C13.356,5.195,13.187,5.137,13.017,5.137\"/>\n\t</symbol>\n\t<symbol id=\"icon-close\" viewbox=\"0 0 16 16\">\n\t\t<polygon stroke-width=\"2\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" points=\"7.94,8.721 3.44,13.22 2.78,12.56 7.28,8.06 2.66,3.44 3.335,2.765 7.955,7.385 12.68,2.66 13.34,3.32 8.615,8.045 13.234,12.664 12.56,13.34 \"/>\n\t</symbol>\n\t<symbol id=\"icon-follow\" viewbox=\"0 0 26 26\">\n\t\t<polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"21.923,17.438 18.898,20.438 16.923,18.434 \"/>\n\t\t<circle fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"19.423\" cy=\"18.938\" r=\"5\"/>\n\t\t<path fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M14.889,13.72 c-0.777-0.257-1.615-0.533-2.466-0.853v-2.5c0,0,1.5-0.62,1.5-3c0.783,0,0.783-2.072,0-2.072c0-0.233,0.828-1.607,0.5-2.928 c-0.474-1.905-6.026-1.905-6.5,0c-2.369-0.477-1,2.68-1,3c-0.783,0-0.783,2,0,2c0,2.38,1.5,3,1.5,3v2.5 c-2.777,1.055-6.088,1.755-6.5,3c-0.474,1.428-0.5,4.07-0.5,4.07h10.5\"/>\n\t</symbol>\n\t<symbol id=\"icon-unfollow\" viewbox=\"0 0 26 26\">\n\t\t<circle fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"19.423\" cy=\"18.938\" r=\"5\"/>\n\t\t<path fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M14.889,13.72 c-0.777-0.257-1.615-0.533-2.466-0.853v-2.5c0,0,1.5-0.62,1.5-3c0.783,0,0.783-2.072,0-2.072c0-0.233,0.828-1.607,0.5-2.928 c-0.474-1.905-6.026-1.905-6.5,0c-2.369-0.477-1,2.68-1,3c-0.783,0-0.783,2,0,2c0,2.38,1.5,3,1.5,3v2.5 c-2.777,1.055-6.088,1.755-6.5,3c-0.474,1.428-0.5,4.07-0.5,4.07h10.5\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"16.929\" y1=\"18.938\" x2=\"21.917\" y2=\"18.938\"/>\n\t</symbol>\n\t<symbol id=\"icon-kick\" viewbox=\"0 0 26 26\">\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"21.122\" y1=\"17.197\" x2=\"17.587\" y2=\"20.732\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"21.122\" y1=\"20.732\" x2=\"17.587\" y2=\"17.195\"/>\n\t\t<circle fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"19.423\" cy=\"18.965\" r=\"5\"/>\n\t\t<path fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M14.891,13.818 c-0.779-0.258-1.617-0.533-2.468-0.854v-2.5c0,0,1.5-0.619,1.5-3c0.783,0,0.783-2.071,0-2.071c0-0.234,0.828-1.607,0.5-2.929 c-0.473-1.905-6.026-1.905-6.5,0c-2.369-0.476-1,2.681-1,3c-0.783,0-0.783,2,0,2c0,2.381,1.5,3,1.5,3v2.5 c-2.777,1.056-6.088,1.756-6.5,3C1.45,17.395,1.423,20,1.423,20h10.5\"/>\n\t</symbol>\n\t<symbol id=\"icon-reconnecting\" viewbox=\"0 0 70 70\">\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" fill=\"#FFFFFF\" d=\"M44.87,32.914c0.002-0.084,0.013-0.166,0.013-0.25 c0-4.509-3.655-8.164-8.164-8.164c-3.249,0-6.046,1.902-7.36,4.649c-0.568-0.286-1.208-0.451-1.888-0.451 c-2.086,0-3.813,1.518-4.15,3.507c-2.483,0.852-4.271,3.201-4.271,5.975c0,3.488,2.827,6.316,6.314,6.319h19.52v-0.001 c3.186-0.017,5.764-2.603,5.764-5.792C50.646,35.513,48.063,32.923,44.87,32.914z M44.877,43.445l-0.23,0.002H25.365 c-2.902-0.004-5.263-2.366-5.263-5.267c0-2.248,1.431-4.249,3.56-4.979l0.593-0.203l0.104-0.617 c0.258-1.524,1.566-2.629,3.111-2.629c0.492,0,0.968,0.114,1.414,0.338l0.96,0.482l0.464-0.969c1.177-2.46,3.693-4.05,6.41-4.05 c3.921,0,7.11,3.189,7.11,7.111c0,0.021-0.002,0.044-0.004,0.066c-0.003,0.053-0.007,0.105-0.008,0.159l-0.027,1.075l1.077,0.004 c2.605,0.007,4.726,2.134,4.726,4.739C49.593,41.306,47.477,43.432,44.877,43.445C44.877,43.445,47.477,43.432,44.877,43.445z\"/>\n\t\t<path fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"0.9\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M31.401,37.654c-0.64-2.297,0.968-4.538,3.193-5.046c1.538-0.352,3.078,0.175,4.058,1.243 M39.687,35.813 c0.406,2.074-1.121,4.108-3.186,4.579c-1.439,0.329-2.883-0.112-3.864-1.046 M41.049,37.75l-1.357-1.953l-1.563,1.807 M30.049,35.727l1.358,1.953l1.562-1.806\"/>\n\t</symbol>\n\t<symbol id=\"icon-reconnected\" viewbox=\"0 0 70 70\">\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" fill=\"#FFFFFF\" d=\"M36.592,32.63c-2.033,0-3.688,1.654-3.688,3.687h1.945 l-2.289,3.965l-2.289-3.965h1.58c0-2.618,2.122-4.74,4.74-4.74c2.617,0,4.74,2.122,4.74,4.74s-2.123,4.74-4.74,4.74v-1.053 c2.033,0,3.687-1.654,3.687-3.688C40.278,34.284,38.625,32.63,36.592,32.63z M45.821,33.414c0.002-0.084,0.013-0.166,0.013-0.25 c0-4.509-3.655-8.164-8.164-8.164c-3.249,0-6.046,1.902-7.36,4.649c-0.568-0.286-1.208-0.451-1.888-0.451 c-2.086,0-3.813,1.518-4.15,3.507C21.788,33.557,20,35.906,20,38.681c0,3.488,2.827,6.316,6.314,6.319h19.52v-0.001 c3.186-0.017,5.764-2.603,5.764-5.792C51.598,36.013,49.014,33.423,45.821,33.414z M45.828,43.945l-0.23,0.002H26.316 c-2.902-0.004-5.263-2.366-5.263-5.267c0-2.248,1.431-4.249,3.56-4.979l0.593-0.203l0.104-0.617 c0.258-1.524,1.566-2.629,3.111-2.629c0.492,0,0.968,0.114,1.414,0.338l0.96,0.482l0.464-0.969c1.177-2.46,3.693-4.05,6.41-4.05 c3.921,0,7.11,3.189,7.11,7.111c0,0.021-0.002,0.044-0.004,0.066c-0.003,0.053-0.007,0.105-0.008,0.159l-0.027,1.075l1.077,0.004 c2.605,0.007,4.726,2.134,4.726,4.739C50.544,41.806,48.428,43.932,45.828,43.945C45.828,43.945,48.428,43.932,45.828,43.945z\"/>\n\t</symbol>\n\t<symbol id=\"icon-disconnected\" viewbox=\"0 0 70 70\">\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" fill=\"#EF4835\" d=\"M44.87,33.414c0.002-0.084,0.013-0.166,0.013-0.25 c0-4.509-3.655-8.164-8.164-8.164c-3.249,0-6.046,1.902-7.36,4.649c-0.568-0.286-1.208-0.451-1.888-0.451 c-2.086,0-3.813,1.518-4.15,3.507c-2.483,0.852-4.271,3.201-4.271,5.975c0,3.488,2.827,6.316,6.314,6.319h19.52v-0.001 c3.186-0.017,5.764-2.603,5.764-5.792C50.646,36.013,48.063,33.423,44.87,33.414z M44.877,43.945l-0.23,0.002H25.365 c-2.902-0.004-5.263-2.366-5.263-5.267c0-2.248,1.431-4.249,3.56-4.979l0.593-0.203l0.104-0.617 c0.258-1.524,1.566-2.629,3.111-2.629c0.492,0,0.968,0.114,1.414,0.338l0.96,0.482l0.464-0.969c1.177-2.46,3.693-4.05,6.41-4.05 c3.921,0,7.11,3.189,7.11,7.111c0,0.021-0.002,0.044-0.004,0.066c-0.003,0.053-0.007,0.105-0.008,0.159l-0.027,1.075l1.077,0.004 c2.605,0.007,4.726,2.134,4.726,4.739C49.593,41.806,47.477,43.932,44.877,43.945C44.877,43.945,47.477,43.932,44.877,43.945z\"/>\n\t\t<polygon fill=\"none\" stroke=\"#EF4835\" stroke-width=\"0.8\" stroke-miterlimit=\"10\" points=\"34.489,37.891 32.239,40.14 31.909,39.811 34.159,37.561 31.849,35.25 32.187,34.913 34.496,37.223 36.858,34.86 37.188,35.19 34.826,37.553 37.137,39.862 36.799,40.199 \"/>\n\t</symbol>\n\t<symbol id=\"icon-copy\" viewbox=\"0 0 70 70\">\n\t\t<polygon fill=\"none\" stroke=\"#FFFFFF\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"44.049,44 28.049,44 28.049,23 38.049,23 44.049,29 \"/>\n\t\t<path fill=\"none\" stroke=\"#FFFFFF\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M38.049,23v6h6 M41.049,44v3h-16V26h3\"/>\n\t</symbol>\n\t<symbol id=\"icon-error\" viewbox=\"0 0 70 70\">\n\t\t<line fill=\"none\" stroke=\"#EF4835\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"36\" y1=\"40.305\" x2=\"36\" y2=\"32.652\"/>\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" fill=\"#EF4835\" d=\"M36,42.695c-0.529,0-0.956,0.43-0.956,0.957 c0,0.528,0.427,0.956,0.956,0.956c0.528,0,0.956-0.428,0.956-0.956C36.956,43.125,36.528,42.695,36,42.695\"/>\n\t\t<polygon fill=\"none\" stroke=\"#EF4835\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"47,47 25,47 36,25 \"/>\n\t</symbol>\n\t<symbol id=\"icon-followed\" viewbox=\"0 0 70 70\">\n\t\t<circle fill=\"#54DE5A\" cx=\"45\" cy=\"47.008\" r=\"7\"/>\n\t\t<polygon fill=\"#FFFFFF\" points=\"41.219,47.164 43.236,49.164 48.782,43.664 49.538,44.414 43.236,50.664 40.464,47.914 \"/>\n\t</symbol>\n\t<symbol id=\"icon-unfollowed\" viewbox=\"0 0 70 70\">\n\t\t<circle fill=\"#EF4835\" cx=\"43\" cy=\"49.008\" r=\"7\"/>\n\t\t<rect x=\"38.8\" y=\"48.008\" fill=\"#FFFFFF\" width=\"8.4\" height=\"2\"/>\n\t</symbol>\n\t<symbol id=\"icon-search\" viewbox=\"0 0 40 40\">\n\t\t<circle fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"18.19\" cy=\"19.083\" r=\"6.667\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"22.903\" y1=\"23.797\" x2=\"28.606\" y2=\"29.5\"/>\n\t</symbol>\n\t<symbol id=\"icon-timeline\" viewbox=\"0 0 26 26\">\n\t\t<ellipse fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"13\" cy=\"13\" rx=\"10.642\" ry=\"10.542\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"18.553\" y1=\"18.5\" x2=\"13.979\" y2=\"13.971\"/>\n\t\t<ellipse fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"13\" cy=\"13\" rx=\"1.388\" ry=\"1.375\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"13\" y1=\"7.958\" x2=\"13\" y2=\"11.438\"/>\n\t</symbol>\n\t<symbol id=\"icon-play\" viewbox=\"0 0 26 26\">\n\t\t<ellipse fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"13\" cy=\"13\" rx=\"10.643\" ry=\"10.541\"/>\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M9.875,8.5l8.104,4.5 l-8.104,4.5V8.5z\"/>\n\t</symbol>\n\t<symbol id=\"icon-pause\" viewbox=\"0 0 26 26\">\n\t\t<ellipse fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"13\" cy=\"13\" rx=\"10.643\" ry=\"10.541\"/>\n\t\t<rect x=\"14.549\" y=\"8.568\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" width=\"2\" height=\"9\"/>\n\t\t<rect x=\"9.505\" y=\"8.568\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" width=\"2\" height=\"9\"/>\n\t</symbol>\n\t<symbol id=\"icon-stop\" viewbox=\"0 0 26 26\">\n\t\t<ellipse fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"13\" cy=\"13\" rx=\"10.643\" ry=\"10.541\"/>\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M8.5,9.396C8.5,8.901,8.898,8.5,9.396,8.5h7.208c0.495,0,0.896,0.411,0.896,0.896v7.209c0,0.495-0.398,0.896-0.896,0.896H9.396 c-0.495,0-0.896-0.411-0.896-0.896V9.396z\"/>\n\t</symbol>\n\t<symbol id=\"icon-vr\" viewbox=\"0 0 26 26\">\n\t\t<ellipse fill=\"none\" stroke-miterlimit=\"10\" cx=\"13\" cy=\"13\" rx=\"10.848\" ry=\"10.746\"/>\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M9.579,9.47 c-1.95,0-3.537,1.583-3.537,3.53c0,1.946,1.587,3.529,3.537,3.529h6.843c1.95,0,3.536-1.583,3.536-3.529 c0-1.947-1.586-3.53-3.536-3.53H9.579z\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"6.56\" y1=\"4.604\" x2=\"9.271\" y2=\"9.306\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"19.441\" y1=\"4.604\" x2=\"16.729\" y2=\"9.306\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"6.56\" y1=\"21.395\" x2=\"9.271\" y2=\"16.693\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"19.441\" y1=\"21.395\" x2=\"16.729\" y2=\"16.693\"/>\n\t</symbol>\n\t<symbol id=\"icon-fullscreen\" viewbox=\"0 0 26 26\">\n        <g>\n            <line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"3.417\" y1=\"22.583\" x2=\"22.583\" y2=\"3.417\"/>\n            <polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"7.583,22.583 3.417,22.583 3.417,18.417 \"/>\n            <polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"22.583,7.583 22.583,3.417 18.417,3.417 \"/>\n            <line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"3.417\" y1=\"3.417\" x2=\"22.583\" y2=\"22.583\"/>\n            <polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"3.417,7.583 3.417,3.417 7.583,3.417 \"/>\n            <polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"18.417,22.583 22.583,22.583 22.583,18.417 \"/>\n        </g>\n\t</symbol>\n\t<symbol id=\"icon-view-cam\" viewbox=\"0 0 26 26\">\n\t\t<polygon fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\" 15.083,16.749 7.583,16.749 7.583,9.249 15.083,9.249 15.083,12.167 18.417,10.083 18.417,15.917 15.083,13.833 \"/>\n\t\t<circle fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"13\" cy=\"13\" r=\"9.583\"/>\n\t</symbol>\n\t<symbol id=\"icon-view-vr\" viewbox=\"0 0 26 26\">\n\t\t<ellipse fill=\"none\" stroke-miterlimit=\"10\" cx=\"13\" cy=\"13\" rx=\"10.848\" ry=\"10.746\"/>\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M9.579,9.47 c-1.95,0-3.537,1.583-3.537,3.53c0,1.946,1.587,3.529,3.537,3.529h6.843c1.95,0,3.536-1.583,3.536-3.529 c0-1.947-1.586-3.53-3.536-3.53H9.579z\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"6.56\" y1=\"4.604\" x2=\"9.271\" y2=\"9.306\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"19.441\" y1=\"4.604\" x2=\"16.729\" y2=\"9.306\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"6.56\" y1=\"21.395\" x2=\"9.271\" y2=\"16.693\"/>\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"19.441\" y1=\"21.395\" x2=\"16.729\" y2=\"16.693\"/>\n\t</symbol>\n\t<symbol id=\"icon-view-3\" viewbox=\"0 0 26 26\">\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M23.895,19.632 c0,1.046-0.848,1.895-1.895,1.895H4c-1.047,0-1.895-0.849-1.895-1.895V6.369c0-1.046,0.848-1.896,1.895-1.896h18 c1.047,0,1.895,0.85,1.895,1.896V19.632z\"/>\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" d=\"M12.881,18.168h5.957v-0.989l0.677,0.255 c0.027,0.011,0.059,0.021,0.091,0.031V13.8h-0.941l0.195-0.646c0.012-0.038,0.022-0.08,0.033-0.121h-6.008 c0.01,0.047,0.021,0.092,0.033,0.132l0.178,0.635H12.17v3.602h0.94l-0.196,0.646C12.902,18.085,12.891,18.126,12.881,18.168z\"/>\n\t</symbol>\n\t<symbol id=\"icon-view-4\" viewbox=\"0 0 26 26\">\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" d=\"M4.227,21.5H21.5v-2.507l0.696,0.297 c0.226,0.097,0.948,0.33,1.304,0.341V6.75h-2.153l0.171-0.631c0.165-0.609,0.27-1.296,0.255-1.619H4.251 C4.238,4.831,4.333,5.518,4.485,6.129L4.64,6.75H2.5v12.5h2.154l-0.172,0.632C4.317,20.49,4.212,21.178,4.227,21.5z\"/>\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M19.124,17.606 c0,0.318-0.258,0.577-0.576,0.577h-5.479c-0.318,0-0.576-0.259-0.576-0.577V13.57c0-0.318,0.258-0.577,0.576-0.577h5.479 c0.318,0,0.576,0.259,0.576,0.577V17.606z\"/>\n\t</symbol>\n\t<symbol id=\"icon-asset-default\" viewbox=\"0 0 32 32\">\n\t\t<polygon fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"25,27.5 6,27.5 6,4.5 19,4.5 25,10.5 \"/>\n\t\t<polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"19,4.5 19,10.5 25,10.5 \"/>\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M10.28,15.392 L15.5,13l5.22,2.392v0.005l-5.22,2.402v6.598l-5.22-2.401v-6.598l5.22,2.402 M15.5,24.396l5.22-2.401v-6.598\"/>\n\t</symbol>\n\t<symbol id=\"icon-upload\" viewbox=\"0 0 37 37\">\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" d=\"M23.631,23.42h1.442 c0,0,4.264-0.389,4.264-4.734c0-2.753-2.188-5.017-4.908-4.914c-1.063-2.33-3.343-3.947-5.989-3.947 c-3.53,0-6.408,2.866-6.613,6.479c-2.211-0.479-4.284,1.269-4.284,3.615c0,3.75,3.79,3.502,3.79,3.502h1.89\"/>\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M21.685,22.041 l-3.143-3.266l-3.143,3.266 M18.542,18.775v10.357\"/>\n\t</symbol>\n\t<symbol id=\"icon-download\" viewbox=\"0 0 37 37\">\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" d=\"M23.69,23.42h1.442 c0,0,4.264-0.389,4.264-4.734c0-2.753-2.188-5.017-4.908-4.914c-1.063-2.33-3.343-3.947-5.989-3.947 c-3.53,0-6.408,2.866-6.613,6.479c-2.211-0.479-4.284,1.269-4.284,3.615c0,3.75,3.79,3.502,3.79,3.502h1.89\"/>\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M15.458,25.867 l3.143,3.266l3.143-3.266 M18.602,29.133V18.775\"/>\n\t</symbol>\n\t<symbol id=\"icon-go\" viewbox=\"0 0 24 24\">\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"1\" y1=\"12\" x2=\"16\" y2=\"12\"/>\n\t\t<polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"12,8 16,12 12,16 \"/>\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M1.982,7.451 C3.712,3.646,7.547,1,12,1c6.075,0,11,4.925,11,11c0,6.074-4.925,11-11,11c-4.473,0-8.322-2.67-10.042-6.502\"/>\n\t</symbol>\n\t<symbol id=\"vp-edit-patch-icon\" viewbox=\"0 0 16 16\">\n        <g transform=\"scale(0.9 0.9)\" stroke=\"none\" fill-rule=\"evenodd\"><path d=\"M.234 14.396a.334.334 0 0 0 .4.401l4.311-1.01a.343.343 0 0 0 .082-.032l-3.75-3.75a.315.315 0 0 0-.032.08l-1.01 4.311zM5.508 13.294l8.348-8.348-3.772-3.77-8.347 8.347zM14.27 4.533l.236-.236c.65-.65.65-1.707 0-2.357L13.09.527a1.651 1.651 0 0 0-1.178-.49c-.445 0-.864.174-1.178.49l-.236.234 3.77 3.772z\"/></g>\n\t</symbol>\n    <symbol id=\"vp-edit-icon\" viewbox=\"0 0 16 16\">\n\t\t<path d=\"M0.187253333,12.5171733 C0.16592,12.6067733 0.19312,12.7011733 0.258186667,12.7667733 C0.321653333,12.8297067 0.41392,12.8595733 0.507786667,12.8377067 L3.95632,12.0291733 C3.97925333,12.02384 4.00112,12.0147733 4.02138667,12.0041067 L1.02085333,9.00357333 C1.01018667,9.02384 1.00112,9.04570667 0.99632,9.06864 L0.187253333,12.5171733 Z\" id=\"Fill-119\"></path>\n\t\t<path d=\"M5.40677333,10.63488 L12.08464,3.95701333 L9.06757333,0.94048 L2.38970667,7.61834667 L5.40677333,10.63488 Z\" id=\"Fill-123\"></path>\n\t\t<path d=\"M12.4158933,3.62602667 L12.6046933,3.43722667 C13.12416,2.91776 13.12416,2.07189333 12.6046933,1.55189333 L11.47296,0.421226667 C11.2212267,0.168426667 10.8862933,0.02976 10.53056,0.02976 C10.1742933,0.02976 9.83936,0.168426667 9.58762667,0.421226667 L9.39882667,0.60896 L12.4158933,3.62602667 Z\" id=\"Fill-125\"></path>\n\t</symbol>\n\t<symbol id=\"vp-port-unconnected\" viewbox=\"0 0 10 10\" fill=\"#FFFFFF\">\n\t\t<ellipse id=\"unconnected-port-copy\" cx=\"5\" cy=\"5\" rx=\"5\" ry=\"5\" />\n\t</symbol>\n    <symbol id=\"vp-circle\" viewbox=\"0 0 10 10\">\n\t\t<ellipse id=\"unconnected-port-copy\" cx=\"5\" cy=\"5\" rx=\"5\" ry=\"5\" />\n\t</symbol>\n\t<symbol id=\"vp-port-connected\" viewbox=\"0 0 10 10\">\n\t\t<ellipse fill=\"#FFFFFF\" cx=\"5\" cy=\"5\" rx=\"5\" ry=\"5\" />\n\t\t<ellipse fill=\"#000000\" cx=\"5\" cy=\"5\" rx=\"2\" ry=\"2\" />\n\t</symbol>\n    <symbol id=\"vp-plugin-icon-input-proxy\" viewbox=\"0 0 21 16\" fill=\"none\" stroke=\"#fff\">\n        <g transform=\"rotate(-90.000000) translate(-13, 3.5) scale(0.7 0.7)\">\n            <path d=\"M-1.77635684e-15,6.27283138 L14.1666667,6.27283138\" id=\"Stroke-39\"></path>\n            <path d=\"M12.0833333,6.27283138 L12.0833333,12.1061647 C12.0833333,13.939498 10.5833333,15.439498 8.75,15.439498 L5.41666667,15.439498 C3.58416667,15.439498 2.08333333,13.939498 2.08333333,12.1061647 L2.08333333,6.27283138\" id=\"Stroke-40\"></path>\n            <path d=\"M8.75,17.939248 L5.41666667,17.939248 L5.41666667,15.439248 L8.75,15.439248 L8.75,17.939248 Z\" id=\"Stroke-41\"></path>\n            <path d=\"M7.08333333,17.939498 L7.08333333,19.6061647\" id=\"Stroke-42\"></path>\n            <path d=\"M3.75,6.27283138 L3.75,0.439498047\" id=\"Stroke-43\"></path>\n            <path d=\"M10.4166667,6.27283138 L10.4166667,0.439498047\" id=\"Stroke-44\"></path>\n        </g>\n    </symbol>\n    <symbol id=\"vp-plugin-icon-output-proxy\" viewbox=\"0 0 21 16\" fill=\"none\" stroke=\"#fff\">\n        <g transform=\"rotate(90.000000) translate(3, -17) scale(0.7, 0.7)\">\n            <path d=\"M0,6.27283138 L14.1666667,6.27283138\" id=\"Stroke-39\"></path>\n            <path d=\"M12.0833333,6.27283138 L12.0833333,12.1061647 C12.0833333,13.939498 10.5833333,15.439498 8.75,15.439498 L5.41666667,15.439498 C3.58416667,15.439498 2.08333333,13.939498 2.08333333,12.1061647 L2.08333333,6.27283138\" id=\"Stroke-40\"></path>\n            <path d=\"M8.75,17.939248 L5.41666667,17.939248 L5.41666667,15.439248 L8.75,15.439248 L8.75,17.939248 Z\" id=\"Stroke-41\"></path>\n            <path d=\"M7.08333333,17.939498 L7.08333333,19.6061647\" id=\"Stroke-42\"></path>\n            <path d=\"M3.75,6.27283138 L3.75,0.439498047\" id=\"Stroke-43\"></path>\n            <path d=\"M10.4166667,6.27283138 L10.4166667,0.439498047\" id=\"Stroke-44\"></path>\n        </g>\n    </symbol>\n    <symbol id=\"vp-plugin-icon-variable-write\" viewbox=\"0 0 22 22\" fill=\"none\" stroke=\"#fff\">\n        <g transform=\"scale(0.7, 0.7) translate(6.5, 6.5)\">\n            <path d=\"M19.5833333,14.6061647 C19.5833333,17.3678314 17.3441667,19.6061647 14.5833333,19.6061647 C11.8208333,19.6061647 9.58333333,17.3678314 9.58333333,14.6061647 C9.58333333,11.8436647 11.8208333,9.60616471 14.5833333,9.60616471 C17.3441667,9.60616471 19.5833333,11.8436647 19.5833333,14.6061647 L19.5833333,14.6061647 Z\" id=\"Stroke-633\"></path>\n            <path d=\"M14.5833333,16.689498 L14.5833333,12.5228314\" id=\"Stroke-634\" stroke-linecap=\"round\"></path>\n            <path d=\"M12.9166667,15.0228314 L14.5833333,16.689498 L16.25,15.0228314\" id=\"Stroke-635\" stroke-linecap=\"round\"></path>\n            <path d=\"M16.25,3.79233138 C16.25,5.63149805 12.705,7.12566471 8.33333333,7.12566471 C3.96166667,7.12566471 0.416666667,5.63149805 0.416666667,3.79233138 C0.416666667,1.95149805 3.96166667,0.43983138 8.33333333,0.43983138 C12.705,0.43983138 16.25,1.95149805 16.25,3.79233138 L16.25,3.79233138 Z\" id=\"Stroke-636\" stroke-linecap=\"round\"></path>\n            <path d=\"M8.33333333,10.458998 C3.96166667,10.458998 0.416666667,8.96483138 0.416666667,7.12566471\" id=\"Stroke-637\" stroke-linecap=\"round\"></path>\n            <path d=\"M7.08333333,14.166748 C3.30583333,13.914248 0.416666667,12.5359147 0.416666667,10.8759147\" id=\"Stroke-638\" stroke-linecap=\"round\"></path>\n            <path d=\"M7.5,17.9313314 C3.52,17.755498 0.416666667,16.347998 0.416666667,14.625498 L0.416666667,3.77299805\" id=\"Stroke-639\" stroke-linecap=\"round\"></path>\n            <path d=\"M16.25,3.77283138 L16.25,7.52283138\" id=\"Stroke-640\" stroke-linecap=\"round\"></path>\n        </g>\n    </symbol>\n    <symbol id=\"vp-plugin-icon-variable-read\" viewbox=\"0 0 22 22\" fill=\"none\" stroke=\"#fff\">\n        <g transform=\"scale(0.7, 0.7) translate(6.5, 6.5)\">\n            <path d=\"M19.5833333,14.6061647 C19.5833333,17.3678314 17.3441667,19.6061647 14.5833333,19.6061647 C11.8216667,19.6061647 9.58333333,17.3678314 9.58333333,14.6061647 C9.58333333,11.8453314 11.8216667,9.60616471 14.5833333,9.60616471 C17.3441667,9.60616471 19.5833333,11.8453314 19.5833333,14.6061647 L19.5833333,14.6061647 Z\" id=\"Stroke-625\"></path>\n            <path d=\"M14.5833333,12.5228314 L14.5833333,16.689498\" id=\"Stroke-626\" stroke-linecap=\"round\"></path>\n            <path d=\"M16.25,14.189498 L14.5833333,12.5228314 L12.9166667,14.189498\" id=\"Stroke-627\" stroke-linecap=\"round\"></path>\n            <path d=\"M16.25,3.79316471 C16.25,5.63149805 12.705,7.12649805 8.33333333,7.12649805 C3.96166667,7.12649805 0.416666667,5.63149805 0.416666667,3.79316471 C0.416666667,1.95149805 3.96166667,0.43983138 8.33333333,0.43983138 C12.705,0.43983138 16.25,1.95149805 16.25,3.79316471 L16.25,3.79316471 Z\" id=\"Stroke-628\" stroke-linecap=\"round\"></path>\n            <path d=\"M8.33333333,10.4598314 C3.96166667,10.4598314 0.416666667,8.96483138 0.416666667,7.12649805\" id=\"Stroke-629\" stroke-linecap=\"round\"></path>\n            <path d=\"M7.08333333,14.1670814 C3.30583333,13.9145814 0.416666667,12.536248 0.416666667,10.876248\" id=\"Stroke-630\" stroke-linecap=\"round\"></path>\n            <path d=\"M7.5,17.9321647 C3.52,17.755498 0.416666667,16.3488314 0.416666667,14.6263314 L0.416666667,3.77299805\" id=\"Stroke-631\" stroke-linecap=\"round\"></path>\n            <path d=\"M16.25,3.77283138 L16.25,7.52283138\" id=\"Stroke-632\" stroke-linecap=\"round\"></path>\n        </g>\n    </symbol>\n\t<symbol id=\"icon-plus\" viewbox=\"0 0 16 16\">\n\t\t<polygon fill-rule=\"evenodd\" clip-rule=\"evenodd\" points=\"6.279,14.656 9.719,14.656 9.719,9.664 14.545,9.664 14.545,6.336 9.719,6.336 9.719,1.344 6.279,1.344 6.279,6.336 1.454,6.336 1.454,9.664 6.279,9.664 \"/>\n\t</symbol>\n\t<symbol id=\"vizor-logo-flat\" viewbox=\"0 0 36 36\">\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M28.338,28.703l-2.585-4.509c2.13-1.246,3.562-3.553,3.562-6.194 c0-2.637-1.432-4.946-3.563-6.193l2.586-4.512C31.157,10.002,32.914,13.8,32.914,18C32.914,22.199,31.157,25.998,28.338,28.703z M10.12,30.615l3.134-5.469c0.206,0.019,0.413,0.029,0.623,0.029h8.246c0.21,0,0.417-0.011,0.622-0.028l3.135,5.468 c-2.288,1.424-4.989,2.25-7.88,2.25S12.408,32.039,10.12,30.615z M3.086,18c0-4.2,1.757-7.998,4.576-10.705l2.585,4.51 C8.117,13.051,6.686,15.357,6.686,18c0,2.637,1.432,4.945,3.563,6.192l-2.586,4.511C4.843,25.998,3.086,22.199,3.086,18z M22.123,22.1h-8.246c-2.264,0-4.105-1.839-4.105-4.1c0-2.262,1.842-4.102,4.105-4.102h8.246c2.264,0,4.105,1.84,4.105,4.102 C26.229,20.261,24.387,22.1,22.123,22.1z M25.88,5.385l-3.135,5.467c-0.205-0.018-0.412-0.028-0.622-0.028h-8.246 c-0.21,0-0.418,0.011-0.623,0.028L10.12,5.385c2.288-1.426,4.989-2.25,7.88-2.25S23.592,3.959,25.88,5.385z M18,0.059 C8.074,0.059,0,8.107,0,18s8.074,17.94,18,17.94S36,27.893,36,18S27.926,0.059,18,0.059z\"/>\n\t</symbol>\n\t<symbol id=\"icon-checked\" viewbox=\"0 0 14 14\">\n\t\t<polygon fill-rule=\"evenodd\" clip-rule=\"evenodd\" fill=\"#FFFFFF\" points=\"3.189,7.405 4.162,6.433 5.783,8.055 9.838,4 10.811,4.973 5.783,10 \"/>\n\t</symbol>\n\t<symbol id=\"icon-drag-add\" viewbox=\"0 0 11 11\">\n\t\t<rect y=\"5\" width=\"11\" height=\"1\"/>\n\t\t<rect x=\"5\" width=\"1\" height=\"11\"/>\n\t</symbol>\n    <symbol id=\"player-pencil\">\n        <g transform=\"translate(0, 1) scale(0.98,0.98)\" stroke=\"#FFFFFF\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\">\n            <path d=\"M6.5,20.5 L0,22.5 L2,16 L14,4 L18.5,8.5 L6.5,20.5 L6.5,20.5 Z\"></path>\n            <path d=\"M14,3.6685 L17.086,0.5835 C17.864,-0.1945 19.136,-0.1945 19.914,0.5835 L21.586,2.2545 C22.364,3.0335 22.364,4.3055 21.586,5.0835 L18.5,8.1685\" ></path>\n            <path d=\"M16.75,6 L6,16.75\"></path>\n            <path d=\"M2,16 L3,17 L5.5,17 L5.5,19.5 L6.5,20.5\"></path>\n            <path d=\"M1,19 L3,21\"></path>\n            <path d=\"M16,2 L20.5,6.5\"></path>\n        </g>\n    </symbol>\n    <symbol id=\"icon-drop-uploading\" viewbox=\"0 0 64 64\">\n\t\t<path fill=\"none\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M10.538,38.189c-3.313-12.313,5.008-24.325,16.527-27.048c7.959-1.883,15.929,0.94,20.995,6.66 M53.413,28.315 c2.104,11.117-5.804,22.021-16.484,24.544c-7.449,1.764-14.918-0.602-19.998-5.607 M60.462,38.701l-7.025-10.468l-8.086,9.679 M3.538,27.854l7.029,10.469l8.081-9.678\"/>\n    </symbol>\n\t<symbol id=\"icon-mode-build\" viewBox=\"0 0 18 16\">\n\t\t<g fill=\"none\">\n\t\t\t<path d=\"M0.368421053,7 L7,7\" id=\"Stroke-832\" stroke-linecap=\"round\"></path>\n\t\t\t<path d=\"M9.21052632,7 L15.8421053,7\" id=\"Stroke-833\" stroke-linecap=\"round\" ></path>\n\t\t\t<path d=\"M15.8421053,3.31578947 L0.368421053,3.31578947 L0.368421053,13.6315789 L15.8421053,13.6315789 L15.8421053,3.31578947 Z\"></path>\n\t\t\t<path d=\"M9.21052632,9.21052632 L7,9.21052632 L7,6.26315789 L9.21052632,6.26315789 L9.21052632,9.21052632 Z\"></path>\n\t\t\t<path d=\"M5.15789474,3.31578947 C5.15789474,1.68810526 6.47610526,0.368421053 8.10526316,0.368421053 C9.73294737,0.368421053 11.0526316,1.68810526 11.0526316,3.31578947\"></path>\n\t\t</g>\n\t</symbol>\n\t<symbol id=\"icon-mode-patch\" viewBox=\"0 0 21 16\">\n\t\t<g fill=\"none\" transform=\"translate(0,2)\">\n\t\t\t<rect x=\"14\" y=\"4\" width=\"7\" height=\"5\" rx=\"1\"></rect>\n\t\t\t<rect x=\"0\" y=\"0\" width=\"7\" height=\"5\" rx=\"1\"></rect>\n\t\t\t<rect x=\"0\" y=\"8\" width=\"7\" height=\"5\" rx=\"1\"></rect>\n\t\t\t<path d=\"M6.5838623,2.49694824 C13.1121826,2.34106445 9.01953125,6.62536621 14.69104,6.62536621\"  stroke-linejoin=\"round\"></path>\n\t\t\t<path d=\"M6.45068359,6.54827085 C12.9364014,6.38079038 9.11938477,10.5310589 14.7908936,10.5310589\" stroke-linejoin=\"round\" transform=\"translate(10.620789, 8.537197) scale(1, -1) translate(-10.620789, -8.537197) \"></path>\n\t\t</g>\n\t</symbol>\n\t<symbol id=\"icon-move\" viewBox=\"0 0 32 32\" fill=\"none\">\n\t\t<g transform=\"translate(0,7)\">\n\t\t\t<path d=\"M15,9.28125 L18.5,5.78125 L4.5,0.78125 L9.5,14.78125 L13,11.28125 L19.5,17.78125 L21.5,15.78125 L15,9.28125 L15,9.28125 Z\" id=\"Stroke-292\"></path>\n\t\t</g>\n\t</symbol>\n\t<symbol id=\"icon-hide-all\" viewBox=\"0 0 24 20\" fill=\"none\">\n\t\t<g transform=\"scale(0.8,0.8) translate(2,5)\">\n\t\t\t<path d=\"M0.5,4.5 L20.5,4.5\" id=\"Stroke-120\" stroke=\"#7E8DAB\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n\t\t\t<path d=\"M3.5,2 C3.224,2 3,2.224 3,2.5 C3,2.776 3.224,3 3.5,3 C3.776,3 4,2.776 4,2.5 C4,2.224 3.776,2 3.5,2\" id=\"Fill-121\" fill=\"#7E8DAB\"></path>\n\t\t\t<path d=\"M5.5,2 C5.224,2 5,2.224 5,2.5 C5,2.776 5.224,3 5.5,3 C5.776,3 6,2.776 6,2.5 C6,2.224 5.776,2 5.5,2\" id=\"Fill-122\" fill=\"#7E8DAB\"></path>\n\t\t\t<path d=\"M7.5,2 C7.224,2 7,2.224 7,2.5 C7,2.776 7.224,3 7.5,3 C7.776,3 8,2.776 8,2.5 C8,2.224 7.776,2 7.5,2\" id=\"Fill-123\" fill=\"#7E8DAB\"></path>\n\t\t\t<path d=\"M20.5,13.5 C20.5,14.604 19.604,15.5 18.5,15.5 L2.5,15.5 C1.396,15.5 0.5,14.604 0.5,13.5 L0.5,2.5 C0.5,1.396 1.396,0.5 2.5,0.5 L18.5,0.5 C19.604,0.5 20.5,1.396 20.5,2.5 L20.5,13.5 L20.5,13.5 Z\" id=\"Stroke-124\" stroke=\"#7E8DAB\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n\t\t\t<path d=\"M20.5,8.5 L23.5,8.5\" id=\"Stroke-125\" stroke=\"#7E8DAB\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n\t\t\t<path d=\"M20.5,4.5 L21.5,4.5 C22.604,4.5 23.5,5.396 23.5,6.5 L23.5,17.5 C23.5,18.604 22.604,19.5 21.5,19.5 L5.5,19.5 C4.396,19.5 3.5,18.604 3.5,17.5 L3.5,15.5\" id=\"Stroke-126\" stroke=\"#7E8DAB\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n\t\t</g>\n\t</symbol>\n\t<symbol id=\"icon-publish\" viewBox=\"0 0 19 23\" fill=\"none\">\n\t\t<defs>\n\t\t\t<path id=\"path-1\" d=\"M0,0.458 L19,0.458 L19,23 L0,23\"></path>\n\t\t\t<path id=\"path-3\" d=\"M0,0.458 L19,0.458 L19,23 L0,23 L0,0.458 Z\"></path>\n\t\t</defs>\n\n\t\t<g transform=\"translate(2.000000, 4.000000) scale(0.8)\" stroke-width=\"0.05\">\n\t\t\t<path d=\"M9.5269,23 C9.2509,23 9.0269,22.776 9.0269,22.5 L9.0269,13.24 C9.0269,12.964 9.2509,12.74 9.5269,12.74 C9.8029,12.74 10.0269,12.964 10.0269,13.24 L10.0269,22.5 C10.0269,22.776 9.8029,23 9.5269,23\" id=\"Fill-1\" fill=\"#7E8DAB\"></path>\n\t\t\t<path d=\"M13.5269,17.7402 C13.3989,17.7402 13.2709,17.6912 13.1729,17.5942 L9.5269,13.9472 L5.8809,17.5942 C5.6849,17.7892 5.3689,17.7892 5.1729,17.5942 C4.9779,17.3982 4.9779,17.0822 5.1729,16.8862 L9.1729,12.8862 C9.3689,12.6912 9.6849,12.6912 9.8809,12.8862 L13.8809,16.8862 C14.0759,17.0822 14.0759,17.3982 13.8809,17.5942 C13.7829,17.6912 13.6549,17.7402 13.5269,17.7402\" id=\"Fill-3\" fill=\"#7E8DAB\" ></path>\n\t\t\t<g id=\"Group-7\">\n\t\t\t\t<mask id=\"mask-2\" fill=\"white\">\n\t\t\t\t\t<use xlink:href=\"#path-1\"></use>\n\t\t\t\t</mask>\n\t\t\t\t<path d=\"M3.3477,16.9604 C3.2227,16.9604 3.0977,16.9144 3.0007,16.8204 C1.0937,14.9824 -0.0003,12.4104 -0.0003,9.7624 C-0.0003,4.6724 3.9097,0.6764 9.0937,0.4674 C9.2277,0.4614 9.3667,0.4584 9.5037,0.4584 C14.7407,0.4584 18.9997,4.7054 18.9997,9.9254 C18.9997,12.5554 17.9527,15.0034 16.0527,16.8204 C15.8517,17.0114 15.5357,17.0034 15.3457,16.8044 C15.1547,16.6054 15.1617,16.2884 15.3617,16.0974 C17.0627,14.4714 17.9997,12.2794 17.9997,9.9254 C17.9997,5.2564 14.1887,1.4584 9.5037,1.4584 C9.3797,1.4584 9.2567,1.4614 9.1347,1.4664 C4.4967,1.6534 0.9997,5.2204 0.9997,9.7624 C0.9997,12.1404 1.9817,14.4504 3.6947,16.1004 C3.8937,16.2924 3.8997,16.6084 3.7077,16.8074 C3.6097,16.9094 3.4787,16.9604 3.3477,16.9604\" id=\"Fill-5\" fill=\"#7E8DAB\" mask=\"url(#mask-2)\"></path>\n\t\t\t</g>\n\t\t\t<path d=\"M6.3779,14.4556 C6.1709,14.4556 5.9789,14.3276 5.9059,14.1216 C5.4199,12.7366 5.1489,11.3426 5.0999,9.9766 C4.9769,6.5776 6.2369,3.3446 8.7449,0.6276 C8.9319,0.4256 9.2489,0.4126 9.4519,0.6006 C9.6539,0.7876 9.6669,1.1036 9.4799,1.3066 C7.1549,3.8256 5.9849,6.8106 6.0989,9.9396 C6.1449,11.2056 6.3969,12.5006 6.8499,13.7896 C6.9409,14.0506 6.8039,14.3356 6.5439,14.4276 C6.4889,14.4466 6.4329,14.4556 6.3779,14.4556\" id=\"Fill-8\" fill=\"#7E8DAB\" ></path>\n\t\t\t<path d=\"M12.6289,14.458 C12.5739,14.458 12.5179,14.449 12.4629,14.43 C12.2029,14.338 12.0659,14.053 12.1569,13.792 C12.6099,12.502 12.8629,11.207 12.9099,9.94 C13.0229,6.811 11.8539,3.825 9.5279,1.307 C9.3409,1.104 9.3539,0.787 9.5559,0.6 C9.7589,0.413 10.0749,0.425 10.2629,0.628 C12.7709,3.344 14.0319,6.577 13.9089,9.977 C13.8589,11.344 13.5869,12.739 13.1009,14.124 C13.0279,14.33 12.8359,14.458 12.6289,14.458\" id=\"Fill-10\" fill=\"#7E8DAB\"></path>\n\t\t\t<path d=\"M17.5518,14.4585 L12.6288,14.4585 C12.3518,14.4585 12.1288,14.2345 12.1288,13.9585 C12.1288,13.6825 12.3518,13.4585 12.6288,13.4585 L17.5518,13.4585 C17.8278,13.4585 18.0518,13.6825 18.0518,13.9585 C18.0518,14.2345 17.8278,14.4585 17.5518,14.4585\" id=\"Fill-12\" fill=\"#7E8DAB\" ></path>\n\t\t\t<path d=\"M6.3774,14.4585 L1.5024,14.4585 C1.2254,14.4585 1.0024,14.2345 1.0024,13.9585 C1.0024,13.6825 1.2254,13.4585 1.5024,13.4585 L6.3774,13.4585 C6.6534,13.4585 6.8774,13.6825 6.8774,13.9585 C6.8774,14.2345 6.6534,14.4585 6.3774,14.4585\" id=\"Fill-14\" fill=\"#7E8DAB\" ></path>\n\t\t\t<mask id=\"mask-4\" fill=\"white\">\n\t\t\t\t<use xlink:href=\"#path-3\"></use>\n\t\t\t</mask>\n\n\t\t\t<path d=\"M17,5.458 L2,5.458 L2,4.458 L17,4.458 L17,5.458 Z\" id=\"Fill-16\" fill=\"#7E8DAB\" mask=\"url(#mask-4)\"></path>\n\t\t\t<path d=\"M18.5,10.458 L0.5,10.458 L0.5,9.458 L18.5,9.458 L18.5,10.458 Z\" id=\"Fill-18\" fill=\"#7E8DAB\" mask=\"url(#mask-4)\"></path>\n\t\t</g>\n\t</symbol>\n    <symbol id=\"resizecorner\" viewBox=\"0 0 11 11\">\n        <g stroke-width=\"1\" transform=\"scale(0.4,0.4) translate(0,0)\">\n            <path d=\"M0.264478773,30.2663288 L30.0034714,0.527336836\" stroke=\"#000000\"></path>\n            <path d=\"M11.0238698,30.0387192 L30.0377064,11.0248818\"  stroke=\"#000000\"></path>\n            <path d=\"M20.8371727,29.8506193 L29.8504591,20.8373331\" stroke=\"#000000\"></path>\n            <path d=\"M22.3422731,29.3455191 L29.8504591,21.8373331\" stroke=\"#FFFFFF\"></path>\n            <path d=\"M12.5312661,29.5313225 L30.0377064,12.0248818\" stroke=\"#FFFFFF\"></path>\n            <path d=\"M1.76415688,29.7666512 L30.0034714,1.52733684\" stroke=\"#FFFFFF\"></path>\n        </g>\n    </symbol>\n\n    <symbol id=\"path-button-spinner\" fill=\"none\" viewbox=\"0 0 30 30\">\n        <g transform=\"\">\n            <path d=\"M0.124164881,9.1977 L3.6120622,14.5017556 L7.62308155,9.59892222\"></path>\n            <path d=\"M28.374256,14.6944444 L24.8876101,9.39038889 L20.8753393,14.2932222\"></path>\n            <path d=\"M24.8410548,9.43856111 C25.8847958,15.0710056 21.9964223,20.5910056 16.6951188,21.8687833 C12.9982229,22.76195 9.29131518,21.5633944 6.76956667,19.0270056\"></path>\n            <path d=\"M3.61819449,14.4698111 C1.97499063,8.23042222 6.08362604,2.10858889 11.8004237,0.729866667 C15.7501201,-0.224633333 19.7048225,1.2052 22.2178106,4.10447778\"></path>\n        </g>\n    </symbol>\n    <symbol id=\"icon-button-spinner\">\n        <use xlink:href=\"#path-button-spinner\" stroke=\"#ffffff\" transform=\"scale(1,1) translate(0.7, 3)\" stroke-width=\"1.3\" />\n    </symbol>\n\n    <symbol id=\"icon-property-reset\" viewBox=\"0 0 12 17\">\n        <g stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\" stroke-linejoin=\"round\">\n            <path d=\"M4.0625,5 C4.0625,4.488125 4.4875,4.0625 5,4.0625 C5.5175,4.0625 5.9375,4.4825 5.9375,5 L5.9375,8.75 L8.69875,9.6875 C9.316875,9.88625 9.520625,10.616875 9.375,11.25 L8.75,14.6875 L3.75,14.6875 L1.25,10.9375 C0.96625,10.504375 0.9375,9.6875 1.5625,9.6875 C2.1875,9.6875 2.8125,9.949375 4.0625,11.875 L4.0625,5 L4.0625,5 Z\"></path>\n            <path d=\"M9.6875,4.6875 L7.8125,4.6875\" stroke-linecap=\"round\"></path>\n            <path d=\"M8.4375,1.5625 L7.1875,2.8125\" stroke-linecap=\"round\"></path>\n            <path d=\"M5.3125,0.3125 L5.3125,2.1875\" stroke-linecap=\"round\"></path>\n            <path d=\"M1.5625,1.5625 L2.8125,2.8125\" stroke-linecap=\"round\"></path>\n            <path d=\"M0.3125,4.6875 L2.1875,4.6875\" stroke-linecap=\"round\"></path>\n        </g>\n    </symbol>\n    <symbol id=\"icon-property-link\" viewBox=\"0 0 12 17\">\n        <g  transform=\"scale(-1.1 1.1) translate(-7 3)\">\n            <path d=\"M5.19694444,7.55344444 L3.42861111,9.32122222 C2.77805556,9.97233333 1.7225,9.97233333 1.07138889,9.32122222 L0.678611111,8.92844444 C0.0280555556,8.27788889 0.0280555556,7.22233333 0.678611111,6.57177778 L3.2325,4.01788889 C3.88361111,3.36677778 4.93861111,3.36677778 5.58972222,4.01788889 L5.9825,4.41122222\"></path>\n            <path d=\"M4.80416667,2.446 L6.57194444,0.678777778 C7.22305556,0.0282222222 8.2775,0.0282222222 8.92861111,0.678777778 L9.32138889,1.07155556 C9.9725,1.72211111 9.9725,2.77766667 9.32138889,3.42877778 L6.76805556,5.98155556 C6.11694444,6.63322222 5.06194444,6.63322222 4.41138889,5.98155556\"></path>\n        </g>\n    </symbol>\n    <symbol id=\"icon-dragtoadjust\" viewBox=\"0 0 7 15\">\n        <g fill=\"#E8E8E8\">\n            <path d=\"M0.0698242188,9.27087402 L6.06982422,9.27087402 L3.06982422,14.270874 L0.0698242188,9.27087402 Z\" ></path>\n            <path d=\"M0.0698242188,0.377685547 L6.06982422,0.377685547 L3.06982422,5.37768555 L0.0698242188,0.377685547 Z\" transform=\"translate(3.069824, 2.877686) scale(1, -1) translate(-3.069824, -2.877686) \"></path>\n        </g>\n    </symbol>\n    <symbol id=\"player-mobile-graphic\" viewBox=\"0 0 102 60\">\n        <g id=\"mobile-icon\" transform=\"translate(80,-20) rotate(90.0)\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"2\">\n            <g id=\"mobile\" transform=\"translate(21.000000, -20.500000)\">\n                <path d=\"M58,90.4655172 C58,95.1594828 54.1617647,99 49.4705882,99 L8.52941176,99 C3.83823529,99 0,95.1594828 0,90.4655172 L0,8.53448276 C0,3.84051724 3.83823529,0 8.52941176,0 L49.4705882,0 C54.1617647,0 58,3.84051724 58,8.53448276 L58,90.4655172 L58,90.4655172 Z\"></path>\n                <path d=\"M0,17.0689655 L58,17.0689655\"></path>\n                <path d=\"M0,81.9310345 L58,81.9310345\"></path>\n                <path d=\"M17.0588235,10.2413793 L40.9411765,10.2413793\"></path>\n                <path d=\"M32.4117647,90.4655172 C32.4117647,92.349931 30.885,93.8793103 29,93.8793103 C27.1167059,93.8793103 25.5882353,92.349931 25.5882353,90.4655172 C25.5882353,88.5793966 27.1167059,87.0517241 29,87.0517241 C30.885,87.0517241 32.4117647,88.5793966 32.4117647,90.4655172 L32.4117647,90.4655172 Z\"></path>\n            </g>\n            <g transform=\"translate(36.500000, 18.000000) rotate(180) translate(-28 -23)\" stroke-linejoin=\"round\">\n                <path transform=\"rotate(90) translate(19.85 -27.5)\" d=\"M0,9 L3.5,14 L8,9\"></path>\n                <path d=\"M3.04597817,14.0297048 C2.43465082,5.94293249 8.00596396,0.252278002 14.6048061,0.00825680472 C21.2021511,-0.235263322 26.7495102,4.93778563 26.991546,11.562435 C27.237574,18.1880865 22.0834606,23.7564799 15.4846185,24\"></path>\n            </g>\n        </g>\n    </symbol>\n    <symbol id=\"icon-button-help\" viewBox=\"0 0 30 30\">\n        <g transform=\"translate(5.5,5.6)\" stroke-width=\"1\" stroke=\"#7E8DAB\" fill=\"#7E8DAB\"><!-- paths switch these on/off -->\n            <path d=\"M10.0123457,0 C4.49017637,0 0.0135802469,4.47659612 0.0135802469,9.99876543 C0.0135802469,15.5209347 4.49017637,19.9975309 10.0123457,19.9975309 C15.534515,19.9975309 20.0111111,15.5209347 20.0111111,9.99876543 C20.0111111,4.47659612 15.534515,0 10.0123457,0 L10.0123457,0 Z\" fill=\"none\" />\n            <path d=\"M9.80444444,3.5968254 C10.5057496,3.5968254 11.0990653,4.17208113 11.0990653,4.89109347 C11.0990653,5.61010582 10.5057496,6.18536155 9.80444444,6.18536155 C9.10372134,6.18536155 8.5105291,5.61008818 8.5105291,4.89109347 C8.5105291,4.17209877 9.10372134,3.5968254 9.80444444,3.5968254 L9.80444444,3.5968254 Z\" stroke=\"none\" />\n            <path d=\"M12.6986772,15.7305291 L7.43183422,15.7305291 L7.43183422,14.5441623 L8.25844797,14.5441623 C8.76201058,14.5441623 8.97781305,14.3464198 8.97781305,13.8250794 L8.97781305,9.22333333 C8.97781305,8.70206349 8.76201058,8.50432099 8.25844797,8.50432099 L7.43183422,8.50432099 L7.43183422,7.3177425 L11.0990476,7.3177425 L11.0990476,13.8250617 C11.0990476,14.3464198 11.3148501,14.5441446 11.8178483,14.5441446 L12.6986596,14.5441446 L12.6986596,15.7305291 L12.6986772,15.7305291 Z\" stroke=\"none\" />\n        </g>\n    </symbol>\n</svg>"
  },
  {
    "path": "views/server/partials/gtm.handlebars",
    "content": "{{!- note handlebars does not support script></script so workaround as per hbs faq --}}\n<scr{{!}}ipt>\n\tdataLayer = []\n\n\tif (typeof(E2) === 'undefined')\n\t\tE2 = {}\n\n\tE2.track = function(evt) {\n\t\tif (evt.event)\n\t\t\tmixpanel.track(evt.event, evt)\n\n\t\tif (typeof ga === 'function')\n\t\t\tga('clientTracker.send', 'event', evt.event, evt)\n\n\t\tdataLayer.push(evt)\n\t}\n\n</scr{{!}}ipt>\n\n{{#if KEY_GTM}}\n<noscript><iframe src=\"//www.googletagmanager.com/ns.html?id={{{KEY_GTM}}}\"\nheight=\"0\" width=\"0\" style=\"display:none;visibility:hidden\"></iframe></noscript>\n<scr{{!}}ipt>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':\nnew Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],\nj=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=\n'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);\n})(window,document,'script','dataLayer','{{{KEY_GTM}}}');</scr{{!}}ipt>\n{{/if}}\n"
  },
  {
    "path": "views/server/partials/home/_footer.handlebars",
    "content": "<footer class=\"dark\">\n\n    <nav id=\"bottomLinks\">\n        <a href=\"http://vizorvr.herokuapp.com\">\n            <!-- slack -->\n            <svg width=\"81\" height=\"24\" viewBox=\"0 0 81 24\" xmlns=\"http://www.w3.org/2000/svg\"><g fill-rule=\"nonzero\" ><g><path d=\"M36.41 6.466c.705.31.759.546.199 1.603-.56 1.093-.705 1.147-1.392.874-.867-.382-1.987-.655-2.71-.655-1.174 0-1.97.418-1.97 1.074 0 2.131 6.758.984 6.758 5.537 0 2.295-1.951 3.825-4.878 3.825-1.536 0-3.434-.51-4.753-1.184-.65-.328-.686-.528-.126-1.62.488-.966.65-1.057 1.355-.766 1.12.492 2.53.875 3.488.875 1.084 0 1.788-.438 1.788-1.093 0-2.077-6.884-1.093-6.884-5.501 0-2.35 1.933-3.916 4.843-3.916 1.373-.018 3.09.4 4.282.947zM41.867 1.056v16.976c0 .255-.271.528-.65.528h-1.771c-.38 0-.65-.273-.65-.528V1.056c0-.837.234-.91 1.535-.91 1.482-.018 1.536.09 1.536.91zM54.461 10.6v7.305a.629.629 0 0 1-.65.655h-1.753c-.397 0-.686-.291-.65-.692l.018-.783a4.968 4.968 0 0 1-3.668 1.621c-2.638 0-4.41-1.548-4.41-3.843 0-2.44 2.006-4.098 5.006-4.098 1.138 0 2.186.2 3.036.564v-.838c0-1.347-1.048-2.149-2.837-2.149-.831 0-1.861.328-2.675.82-.632.364-.777.328-1.463-.692-.669-1.02-.65-1.22 0-1.64 1.229-.801 2.909-1.311 4.445-1.311C52.293 5.5 54.46 7.395 54.46 10.6zm-8.167 4.226c0 .875.723 1.458 1.843 1.458 1.337 0 2.548-.656 3.253-1.749v-1.148a6.766 6.766 0 0 0-2.331-.418c-1.663 0-2.765.783-2.765 1.857zM66.478 6.484c.65.383.668.583-.036 1.676-.669 1.038-.777 1.093-1.482.729a4.902 4.902 0 0 0-2.114-.529c-2.223 0-3.705 1.476-3.705 3.698 0 2.313 1.482 3.861 3.705 3.861.777 0 1.734-.291 2.367-.655.65-.383.777-.346 1.463.655.615.93.597 1.148.055 1.549-.994.692-2.548 1.22-3.921 1.22-4.102 0-6.849-2.66-6.849-6.63 0-3.953 2.747-6.575 6.885-6.575 1.228.018 2.71.455 3.632 1.001zM79.885 16.957c.506.656.307.893-.976 1.367-1.3.473-1.481.455-1.951-.164l-3.668-4.936-1.644 1.602v3.206c0 .255-.271.528-.65.528h-1.79c-.38 0-.65-.273-.65-.528V1.056c0-.837.235-.91 1.536-.91 1.481 0 1.535.109 1.535.91v9.654l5.024-4.863c.56-.528.867-.492 1.843.164 1.084.71 1.174.91.65 1.42l-3.74 3.68 4.481 5.846z\"/></g><path d=\"M9.33 10.84l3.015-1.01.983 2.935-3.015 1.01z\"/><g><path d=\"M9.33 10.84l3.015-1.01.983 2.935-3.015 1.01z\"/><path d=\"M21.683 8.652C19.353.82 15.992-1.002 8.222 1.348.452 3.698-1.355 7.085.976 14.918c2.33 7.832 5.692 9.653 13.462 7.303 7.77-2.35 9.576-5.737 7.245-13.57zm-3.92 5.082l-1.464.491.506 1.53c.198.62-.127 1.294-.741 1.494-.127.036-.271.073-.398.055a1.207 1.207 0 0 1-1.084-.802l-.506-1.53-3.017 1.02.505 1.53c.2.62-.126 1.293-.74 1.494-.127.036-.271.073-.398.054a1.207 1.207 0 0 1-1.084-.801l-.506-1.53-1.464.492c-.126.036-.27.073-.397.054a1.207 1.207 0 0 1-1.084-.801c-.2-.62.126-1.293.74-1.494l1.464-.491-.976-2.933-1.463.492c-.127.036-.271.073-.398.055a1.207 1.207 0 0 1-1.084-.802c-.199-.62.127-1.293.74-1.493l1.465-.492-.506-1.53c-.2-.62.126-1.293.74-1.494a1.17 1.17 0 0 1 1.482.747l.506 1.53 3.018-1.02-.506-1.53c-.199-.62.126-1.293.74-1.494a1.17 1.17 0 0 1 1.482.747l.506 1.53 1.464-.492a1.17 1.17 0 0 1 1.482.747c.198.62-.127 1.293-.741 1.494l-1.464.492.976 2.932 1.463-.492a1.17 1.17 0 0 1 1.482.747c.199.62-.126 1.293-.74 1.494z\"/></g></g></svg>\n        </a>\n\n        <a href=\"http://vizor.io\">\n            <!-- vizor -->\n            <svg width=\"70\" height=\"24\" viewBox=\"0 0 70 24\" xmlns=\"http://www.w3.org/2000/svg\"><g fill-rule=\"evenodd\"><path d=\"M.165.107h4.603l5.434 16.604L15.636.107h4.603l-7.8 23.4H7.964L.164.107M21.161 7.48h4.38v16.027h-4.38zM26.978 19.597l8.406-8.239h-8.279V7.48h14.16v3.944l-8.406 8.206h8.567v3.878H26.978v-3.91M41.742 15.494c0-4.616 3.676-8.335 8.279-8.335s8.28 3.719 8.28 8.335c0 4.616-3.677 8.334-8.28 8.334s-8.279-3.718-8.279-8.334zm12.307 0c0-2.276-1.79-4.168-4.028-4.168-2.27 0-3.995 1.892-3.995 4.168 0 2.275 1.726 4.166 3.995 4.166 2.238 0 4.028-1.89 4.028-4.166zM59.415 7.48h4.348v2.628C64.562 8.441 66 7.48 68.174 7.48h1.758v4.264h-2.78c-2.334 0-3.357 1.218-3.357 4.199v7.565h-4.38V7.479M21.146 2.318c0-1.221.987-2.211 2.205-2.211s2.205.99 2.205 2.211a2.208 2.208 0 0 1-2.205 2.211 2.208 2.208 0 0 1-2.205-2.21\"/></g></svg>\n        </a>\n\n        <a href=\"https://github.com/vizorvr/vizor\">\n            <!-- github -->\n            <svg width=\"89\" height=\"24\" viewBox=\"0 0 89 24\" xmlns=\"http://www.w3.org/2000/svg\"><g fill-rule=\"evenodd\"><path d=\"M17.64 10.272H9.945a.355.355 0 0 0-.36.349v3.646c0 .192.162.349.36.349h3.002v4.53s-.674.223-2.538.223c-2.199 0-5.27-.779-5.27-7.324 0-6.546 3.198-7.408 6.201-7.408 2.6 0 3.72.444 4.432.657.224.067.431-.15.431-.342l.859-3.523a.321.321 0 0 0-.138-.272C16.633.957 14.868 0 10.408 0 5.27 0 0 2.118 0 12.3 0 22.483 6.034 24 11.119 24c4.21 0 6.764-1.743 6.764-1.743.106-.057.117-.2.117-.265V10.621a.354.354 0 0 0-.36-.349M54.857 1.202a.344.344 0 0 0-.345-.345h-4.188a.346.346 0 0 0-.347.345l.001 7.975h-6.527V1.202a.344.344 0 0 0-.346-.345h-4.188a.345.345 0 0 0-.346.345v21.595c0 .19.156.346.346.346h4.188a.345.345 0 0 0 .346-.346V13.56h6.527l-.011 9.237c0 .19.155.346.347.346h4.198a.345.345 0 0 0 .345-.346V1.202M25.714 4.713c0-1.658-1.343-2.999-3-2.999a3.001 3.001 0 0 0 0 6 3 3 0 0 0 3-3\"/><path d=\"M24.857 18.175V8.063a.358.358 0 0 0-.365-.349h-4.396c-.201 0-.382.198-.382.39V22.59c0 .425.28.552.641.552h3.961c.435 0 .541-.203.541-.56v-4.408M70.807 7.714h-4.011a.338.338 0 0 0-.334.341v10.457s-1.019.751-2.465.751-1.83-.661-1.83-2.09V8.056c0-.188-.15-.34-.333-.34h-4.071a.338.338 0 0 0-.334.34v9.81c0 4.24 2.344 5.278 5.569 5.278 2.645 0 4.778-1.474 4.778-1.474s.102.777.148.869a.353.353 0 0 0 .295.184l2.59-.011a.338.338 0 0 0 .334-.34l-.001-14.316c0-.188-.15-.34-.335-.34M80.862 20.002c-1.427-.044-2.396-.701-2.396-.701v-6.97s.956-.593 2.127-.7c1.482-.134 2.91.32 2.91 3.905 0 3.78-.644 4.527-2.641 4.466zm1.623-12.4c-2.337 0-3.927 1.058-3.927 1.058V1.208a.346.346 0 0 0-.342-.35h-4.159a.347.347 0 0 0-.343.35v22.007c0 .194.154.352.344.352h2.885c.13 0 .228-.068.3-.187.073-.118.176-1.014.176-1.014S79.12 24 82.34 24c3.78 0 5.947-1.944 5.947-8.728 0-6.783-3.462-7.67-5.8-7.67zM35.617 7.888h-2.966l-.005-4.22c0-.16-.076-.24-.248-.24h-4.042c-.158 0-.242.075-.242.238v4.36s-2.026.527-2.163.57a.35.35 0 0 0-.237.339v2.74c0 .197.146.356.327.356h2.073v6.592c0 4.896 3.19 5.377 5.343 5.377.983 0 2.16-.34 2.354-.417.117-.047.186-.178.186-.32L36 20.25c0-.197-.154-.356-.328-.356-.173 0-.615.076-1.07.076-1.457 0-1.951-.73-1.951-1.674v-6.264h2.966c.181 0 .328-.159.328-.356V8.243c0-.197-.147-.355-.328-.355\"/></g></svg>\n        </a>\n\n        <a href=\"http://youtube.com/Vizor_VR\">\n            <!-- youtube -->\n            <svg width=\"58\" height=\"24\" viewBox=\"0 0 58 24\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n                <g fill-rule=\"evenodd\">\n                    <path d=\"M21.677 19.193h-2.22v-1.247c-.842.936-1.555 1.409-2.333 1.409-.682 0-1.156-.313-1.394-.877-.144-.343-.246-.879-.246-1.666v-9.07h2.22v9.297c.052.318.191.434.474.434.425 0 .81-.358 1.28-1V7.741h2.22v11.451\" />\n                    <g transform=\"translate(0 3.871)\">\n                        <path d=\"M11.729 11.88c.116 1.13-.244 1.692-.93 1.692-.684 0-1.044-.561-.928-1.691V7.36c-.116-1.13.244-1.66.929-1.66s1.046.53.93 1.66l-.001 4.52zm2.206-4.294c0-1.22-.251-2.136-.696-2.713-.588-.78-1.51-1.1-2.439-1.1-1.052 0-1.852.32-2.439 1.1-.452.577-.694 1.503-.694 2.723l-.002 4.059c0 1.213.215 2.05.667 2.622.587.778 1.539 1.19 2.468 1.19s1.897-.412 2.485-1.19c.445-.571.65-1.41.65-2.622v-4.07zM5.226 9.055v6.216H2.903V9.055S.496 1.434 0 .013h2.439l1.63 5.954L5.69.013H8.13L5.226 9.055\" mask=\"url(#b)\"/>\n                    </g>\n                    <path d=\"M43.87 10.065c-.408 0-.873.174-1.286.506l-.003 6.73c.413.335.881.505 1.288.505.713 0 1.034-.425 1.034-1.534V11.5c0-1.11-.321-1.435-1.034-1.435\" />\n                    <g>\n                        <path d=\"M52.18 11.109c0-1.056-.27-1.374-.952-1.374-.687 0-.978.292-.978 1.36v1.264l1.93-.003V11.11\"/>\n                        <path d=\"M51.247 17.709c.506 0 .801-.277.918-.83.02-.113.016-.607.016-1.437h2.157v.324c0 .667-.054 1.139-.073 1.346-.07.459-.23.873-.48 1.24-.57.829-1.413 1.237-2.487 1.237-1.075 0-1.894-.389-2.488-1.17-.437-.57-.717-1.42-.717-2.634v-4c0-1.22.255-2.164.691-2.742.595-.781 1.414-1.195 2.463-1.195 1.031 0 1.85.414 2.426 1.195.43.578.669 1.47.669 2.691v2.337H50.25v2.052c-.007 1.055.291 1.586.997 1.586zm-4.517-1.695c0 1.056-.09 1.801-.227 2.285-.274.85-.872 1.29-1.69 1.29-.732 0-1.48-.442-2.168-1.297l-.002 1.15h-2.044V4.128h2.044L42.64 9.12c.664-.823 1.416-1.29 2.172-1.29.819 0 1.369.475 1.643 1.33.138.46.275 1.2.275 2.281v4.572zm-7.835 3.428h-2.157v-1.257c-.818.944-1.511 1.42-2.267 1.42-.663 0-1.123-.315-1.354-.884-.14-.345-.24-.885-.24-1.679V8.014h2.158V17.27c.05.32.185.438.46.438.413 0 .786-.361 1.243-1.01V8.014h2.157v11.428zm-8.175 0h-2.271V6.3h-2.384V4.13l7.153-.002v2.171H30.72v13.143zM56.84 5.26s-.33-2.34-1.347-3.372C54.203.535 52.758.528 52.095.45 47.351.105 40.234.105 40.234.105h-.015S33.1.105 28.357.45c-.663.08-2.108.086-3.398 1.44-1.016 1.03-1.347 3.371-1.347 3.371s-.34 2.75-.34 5.499v2.577c0 2.75.34 5.498.34 5.498s.33 2.341 1.347 3.373c1.29 1.353 2.985 1.31 3.739 1.452 2.713.26 11.528.341 11.528.341s7.125-.01 11.87-.354c.662-.08 2.108-.086 3.397-1.44 1.016-1.03 1.348-3.372 1.348-3.372s.338-2.749.338-5.498V10.76c0-2.75-.338-5.499-.338-5.499z\"/>\n                    </g>\n                </g>\n            </svg>\n        </a>\n\n        <a class=\"Hubspot Attribution\" href=\"https://site.vizor.io/patches-attribution\" target=\"_blank\">Attribution</a>\n        <a class=\"Hubspot Terms of Use\" href=\"https://site.vizor.io/patches-tos\" target=\"_blank\">Terms of Use</a>\n    </nav>\n\n    <h6 id=\"brandBottom\">\n        <a class=\"scrollto\" href=\"#top_\">\n            <svg width=\"40\" height=\"40\" viewBox=\"0 0 40 40\" xmlns=\"http://www.w3.org/2000/svg\"><g fill=\"none\" fill-rule=\"evenodd\"><path d=\"M24.889 14.756v4.006c0 6.038-10.667-3.74-10.667 1.333v3.638\" stroke=\"#FFF\" stroke-width=\"2\"/><g transform=\"matrix(1 0 0 -1 10.222 31.2)\"><rect fill=\"#A311CE\" y=\".267\" width=\"8\" height=\"8\" rx=\"2\"/><circle fill=\"#080624\" cx=\"4\" cy=\"4.267\" r=\"1.778\"/><circle fill=\"#FFF\" cx=\"4\" cy=\"4.267\" r=\"1\"/></g><g transform=\"matrix(0 -1 -1 0 28.889 15.644)\"><rect fill=\"#3696FF\" transform=\"rotate(-90 4 4)\" width=\"8\" height=\"8\" rx=\"2\"/><g transform=\"rotate(-90 4 1.778)\"><circle fill=\"#080624\" cx=\"1.778\" cy=\"1.778\" r=\"1.778\"/><circle fill=\"#FFF\" cx=\"1.778\" cy=\"1.778\" r=\"1\"/></g></g><circle stroke=\"#FFF\" stroke-width=\"2\" transform=\"matrix(0 -1 -1 0 40 40)\" cx=\"20\" cy=\"20\" r=\"19\"/></g></svg>\n        </a>\n    </h6>\n</footer>\n"
  },
  {
    "path": "views/server/partials/home/_header.handlebars",
    "content": "{{#unless noHeaderTag}}<header>{{/unless}}\n<nav class=\"primary clearfix in\" style=\"position:relative\">\n    <h1 id=\"brandTop\" class=\"brandTop\">\n        <a href=\"/\" class=\"nofx\"><span>Patches</span>\n        <svg><use xlink:href=\"#patches-wordmark\" /></svg>\n        </a>\n    </h1>\n\n    <ul class=\"nomobile\">\n        {{!-- <li id=\"navAbout\"><a href=\"/about\">About</a></li> --}}\n        <li id=\"navTutorials\"><a href=\"//blog.vizor.io\">Tutorials</a></li>\n        {{#if user.username}}\n            <li class=\"account\">\n            {{>userpulldown user}}\n            </li>\n        {{else}}\n            <li class=\"signin nomobile\">\n                <a id=\"homeSignin\" href=\"#/login\" class=\"sign-btn\">Sign in</a>\n            </li>\n            <li class=\"signup nomobile\">\n                <a id=\"homeSignup\" class=\"sign-btn btn\" href=\"#/signup\">Sign up</a>\n            </li>\n\n        {{/if}}\n    </ul>\n\n    <div class=\"mobileonly\" style=\"position:absolute; top:14px; right: 10px; width: 30px; height: 30px; display: flex; justify-content: center;\">\n        <button class=\"nofx\" id=\"mobileMenuOpenButton\">\n            <img src=\"/images/home/xmenu.png\" width=\"14\" height=\"13\" alt=\"\" />\n        </button>\n    </div>\n</nav>\n{{#unless noHeaderTag}}</header>{{/unless}}"
  },
  {
    "path": "views/server/partials/home/aboutIntro.handlebars",
    "content": "<section id=\"aboutIntro\">\n    <div class=\"in\">\n        <section id=\"aboutEmbed\">\n            {{!- script></script workaround as per hbs faq --}}\n            <scr{{!}}ipt src=\"/scripts/embed.js\" data-aspect=\"0.95\" data-vizorurl=\"/embed/matt/hmd-bake-spinner?autoplay=true&noheader=true\"></scr{{!}}ipt>\n        </section>\n        <h1>About Patches</h1>\n        <div>\n            <p>\n                Patches is a platform for exploring, creating, and publishing virtual reality on the web.\n                Discover 360 and 3D content in VR on your phone, or in 2D on your web browser or tablet.\n            </p>\n            <p>\n                Go one step further and create and share your own with 360 photos, sound, images, and your own 3D models.\n            </p>\n            <a class=\"cta launch-button btn nomobile\" href=\"/edit\">Try the editor</a>\n        </div>\n    </div>\n</section>"
  },
  {
    "path": "views/server/partials/home/aboutPresskit.handlebars",
    "content": "<section id=\"presskit\" class=\"about-press\">\n    <div class=\"in\">\n        <h2>Press</h2>\n        <p class=\"intro\">\n            If you would like to feature Vizor on the web or in print, please use the logo assets provided below.\n            Please avoid wild photoshoppery and don’t forget the whitespace :)\n        </p>\n        <div class=\"featured downloads\">\n            <div class=\"download\">\n                <a href=\"/presskit/Vizor_Mark_only.png\" class=\"svg download\" data-svgref=\"download-icon-big\">\n                    <svg />\n                    <span>Mark Only</span>\n                </a>\n                <a href=\"/presskit/Vizor_Mark_only.png\">PNG</a>\n                <a href=\"/presskit/Vizor_Mark_only.svg\">SVG</a>\n            </div>\n\n            <div class=\"download\">\n                <a href=\"/presskit/Vizor_Logo%2BMark.png\" class=\"svg download\" data-svgref=\"download-icon-big\">\n                    <svg />\n                    <span>Mark + Logotype</span>\n                </a>\n                <a href=\"/presskit/Vizor_Logo%2BMark.png\">PNG</a>\n                <a href=\"/presskit/Vizor_Logo%2BMark.svg\">SVG</a>\n            </div>\n\n            <div class=\"download\">\n                <a href=\"/presskit/Vizor_Reversed_Logotype.png\" class=\"svg download\" data-svgref=\"download-icon-big\">\n                    <svg />\n                    <span>Reversed Logotype</span>\n                </a>\n                <a href=\"/presskit/Vizor_Reversed_Logotype.png\">PNG</a>\n                <a href=\"/presskit/Vizor_Reversed_Logotype.svg\">SVG</a>\n            </div>\n\n            <div class=\"download\">\n                <a href=\"/presskit/Vizor_Mark_Reversed.png\" class=\"svg download\" data-svgref=\"download-icon-big\">\n                    <svg />\n                    <span>Reversed Mark</span>\n                </a>\n                <a href=\"/presskit/Vizor_Mark_Reversed.png\">PNG</a>\n                <a href=\"/presskit/Vizor_Mark_Reversed.svg\">SVG</a>\n            </div>\n        </div>\n    </div>\n</section>"
  },
  {
    "path": "views/server/partials/home/aboutTeam.handlebars",
    "content": "{{#*inline 'teamMember'}}\n<div class=\"team-member\">\n\t<div class=\"member-pic\">\n\t\t<img src=\"/images/home/{{image}}\" alt=\"{{name}}'s photo\" />\n\t\t{{#if link}}\n\t\t\t<div class=\"pic-rollover\">\n\t\t\t\t{{#if linkIcon}}\n\t\t\t\t\t<svg class=\"icon\"><use xlink:href=\"#{{linkIcon}}\"></use></svg>\n\t\t\t\t{{else}}\n\t\t\t\t\t<svg class=\"icon\"><use xlink:href=\"#icon-www\"></use></svg>\n\t\t\t\t{{/if}}\n\t\t\t</div>\n\t\t{{/if}}\n\t</div>\n\t<h4><a href=\"{{link}}\" target=\"_blank\" title=\"View info\" class=\"person-name profile-link\">{{name}}</a></h4>\n\t<span class=\"person-position\">{{position}}</span>\n</div>\n{{/inline}}\n\n<section id=\"vizorteam\" class=\"about-team\">\n\t<div class=\"in\">\n\t\t<h2>Meet the Team</h2>\n        <p class=\"intro\">\n            Patches and Vizor are produced by Pixelface Ltd, a distributed team with main offices in Helsinki, Finland,\n            and team members in England and Australia.\n        </p>\n\t\t<div class=\"team-container\">\n\t\t\t{{>teamMember name='Kaarlo Kananen' image='kaarlo.jpg' position='CEO'\n\t\t\t\tlink='https://www.linkedin.com/in/kaarlo' linkIcon='icon-linkedin'}}\n\n\t\t\t{{>teamMember name='Antti Jäderholm' image='antti.jpg' position='CPO'\n\t\t\t\tlink='https://fi.linkedin.com/in/anttijadertpolm' linkIcon='icon-linkedin' }}\n\n\t\t\t{{>teamMember name='Anna Rosa Lappalainen' image='annarosa.jpg' position='COO'\n\t\t\t\tlink='https://www.linkedin.com/in/annarosa' linkIcon='icon-linkedin'}}\n\n\t\t\t{{>teamMember name='Jaakko Manninen' image='jaakko.jpg' position='CTO'\n\t\t\t\tlink='https://www.linkedin.com/in/kschzt' linkIcon='icon-linkedin'}}\n\n\t\t\t{{>teamMember name='Matt Innes' image='matt.jpg' position='Creative Director'\n\t\t\t\tlink='http://www.idealogue.io/' linkIcon='icon-www'}}\n\n\t\t\t{{>teamMember name='Georgi Marinov' image='georgi.jpg' position='Frontend Lead'\n\t\t\t\tlink='https://www.linkedin.com/in/gmarinov' linkIcon='icon-linkedin'}}\n\n\t\t</div>\n\t</div>\n</section>"
  },
  {
    "path": "views/server/partials/home/getNewsletter.handlebars",
    "content": "<section id=\"getnewsletter\" class=\"contentcontainer mobileonly\">\n\t<div class=\"in\">\n\t\t<h2>Learn More</h2>\n\n\t\t<div style=\"max-width:500px; margin:0 auto; \">\n\t\t\t<!-- pre-line P -->\n\t\t\t<p>Stay up to date with Vizor &mdash;\n\t\t\t\tsign up for our newsletter.</p>\n\t\t\t{{> mailinglist }}\n\t\t</div>\n\t</div>\n</section>"
  },
  {
    "path": "views/server/partials/home/homeFeatured.handlebars",
    "content": "<section id=\"featuredVR\">\n    <div class=\"in\">\n        <h2>Example Projects</h2>\n        <div>\n        {{#with featured}}\n            <div class=\"mobileslides\">\n                {{>browse/graphList list=_patches}}\n            </div>\n        {{/with}}\n        </div>\n\n        <p class=\"more\">\n            <a href=\"/browse\" class=\"cta btn wide\">More Projects</a>\n        </p>\n    </div>\n</section>\n\n<section id=\"homeIntro2\" class=\"mobileonly\">\n    <p>\n        Patches offers a UI to the popular <a href='https://threejs.org' target='_blank'>Three.js</a> library.\n        If you find it useful, and would like to contribute,\n        please feel free to do so on our <a href='https://github.com/vizorvr/vizor' target='_blank'>Github</a>.\n    </p>\n</section>"
  },
  {
    "path": "views/server/partials/home/homeHero.handlebars",
    "content": "<section id=\"getstarted\" class=\"contentcontainer\" style=\"position:relative;\">\n\t<div id=\"player_home\" style=\"background:#000 url('https://cdn.vizor.io/previews/matt/earth-with-clouds-v2-preview-1280x720.png') center center no-repeat; background-size:cover; position:absolute; top:0; left:0;bottom:0; right:0; z-index:1;\">{{!-- ff requires z 0 --}}\n\t\t{{> playerCanvas width=\"100%\" height=\"100%\" graphSrc=\"https://cdn.vizor.io/graph/matt/earth-with-clouds-v2.json\" autoplay=\"true\" }}\n\t</div>\n\n    <div id=\"herotext\" class=\"noselect\">\n\t\t<h1 style=\"line-height: 1.5\">Create WebVR experiences\n\t\t\t<br class=\"nodesktop notablet\" />&nbsp;without writing code</h1>\n        <div class='desktoponly'>\n            <a href=\"/matt/earth-with-clouds-v2/edit/\" class=\"btn cta nomobile\">Edit this project</a>\n            <a href=\"/edit\" class=\"btn cta\">New blank project</a>\n        </div>\n        <div class='nodesktop'>\n            <a href=\"#featuredVR\" class=\"scrollto btn cta\">Explore projects</a>\n        </div>\n\t</div>\n</section>\n"
  },
  {
    "path": "views/server/partials/home/homeIntro.handlebars",
    "content": "<section id='homeIntro'>\n    <div class=\"hero\">\n        <img class='nomobile' src='/images/v2/patches-ui.png' alt='Patches interface' />\n        <img class='mobileonly' src='/images/v2/patches-ui-mobile.png' alt='Patches interface' />\n    </div>\n\n    <div class='cols-flex in'>\n        <div class='col left'>\n            <h3 class='nomobile'>What is it ?</h3>\n            <p>\n                Patches is a visual programming editor for building\n                WebVR and WebGL experiences. With over 350 patches,\n                ranging from low level programming, loops, variables\n                and arrays to colour pickers and interaction triggers,\n                Patches is a powerful and flexible modular system for\n                building complex webVR projects.\n            </p>\n        </div>\n        <div class='col right nomobile'>\n            <h3 class='nomobile'>Can I use it for my project ?</h3>\n            <p>\n                Patches is free to use, released under an <a href='https://github.com/vizorvr/vizor/blob/develop/LICENSE' target='_blank'>MIT licence</a>.\n                It offers a UI to the popular <a href='https://threejs.org' target='_blank'>Three.js</a> library.\n                If you find it useful, and would like to contribute,\n                please feel free to do so on our <a href='https://github.com/vizorvr/vizor' target='_blank'>Github</a>.\n            </p>\n        </div>\n    </div>\n</section>"
  },
  {
    "path": "views/server/partials/home/homeVizor360.handlebars",
    "content": "<section id='homeVizor360'>\n    <div class=\"in\">\n        <h2>Drag and Drop WebVR</h2>\n        <p>\n            Looking for a streamlined, simple way to build immersive web experiences?<br />\n            Check out <a href=\"//vizor.io/\">Vizor 360</a>.\n        </p>\n    </div>\n</section>"
  },
  {
    "path": "views/server/partials/madeWithVizor.handlebars",
    "content": "<div id=\"madeByVizorWidget\" class=\"nomobile clearfix\">\n    <a href=\"//vizor.io\"><svg style=\"width: 24px; height:24px;\"><use xlink:href=\"#logo-mini\" /></svg></a>\n    <a title=\"VR in your browser\" href=\"//vizor.io\">Made with &#x1F379; by\n        <svg style=\"width: 40px; height:24px;\"><use xlink:href=\"#vizor-top-logo\" /></svg></a>\n</div>"
  },
  {
    "path": "views/server/partials/navbar.handlebars",
    "content": "<header  class=\"default\"><!-- div class=\"header-overlay\"></div --><nav class=\"primary clearfix in\" style=\"position:relative\">\n    <h1 id=\"brandTop\" class=\"brandTop\">\n        <a href=\"/\" class=\"nofx\"><span>Patches</span>\n        <svg><use xlink:href=\"#patches-wordmark\" /></svg>\n        </a>\n    </h1>\n\n    <ul class=\"nomobile\">\n        {{!- <li id=\"navAbout\"><a href=\"/about\">About</a></li> -}}\n        <li id=\"navTutorials\"><a href=\"//blog.vizor.io\">Tutorials</a></li>\n        {{#if user.username}}\n            <li class=\"account\">\n            {{>userpulldown user}}\n            </li>\n        {{else}}\n            <li class=\"signin nomobile\">\n                <a id=\"homeSignin\" href=\"/login\" class=\"sign-btn\">Sign in</a>\n            </li>\n            <li class=\"signup nomobile\">\n                <a id=\"homeSignup\" class=\"sign-btn btn\" href=\"/signup\">Sign up</a>\n            </li>\n\n        {{/if}}\n    </ul>\n\n    <div class=\"mobileonly\" style=\"position:absolute; top:16px; right: 10px; width: 30px; height: 30px; display: flex; justify-content: center\">\n        <button class=\"nofx\" id=\"mobileMenuOpenButton\">\n            <img src=\"/images/home/xmenu.png\" width=\"14\" height=\"13\" alt=\"\" />\n        </button>\n    </div>\n</nav></header>"
  },
  {
    "path": "views/server/partials/siteSvgSprite.handlebars",
    "content": "<svg style=\"display:none;\">\n    <symbol id=\"patches-wordmark\" viewBox=\"0 0 100 22\">\n        <path fill=\"#FFF\" fill-rule=\"evenodd\" d=\"M.55 20.43V.57c0-.3.24-.57.57-.57h7.05c3.69 0 6.72 3 6.72 6.63 0 3.72-3.03 6.75-6.69 6.75H4.45v7.05c0 .3-.27.57-.57.57H1.12a.57.57 0 0 1-.57-.57zm3.9-10.71h3.6c1.68 0 2.97-1.35 2.97-3.12 0-1.65-1.29-2.91-2.97-2.91h-3.6v6.03zm12.18 6.87c0-2.46 2.01-4.35 5.52-4.35 1.41 0 2.67.39 2.67.39.06-1.77-.45-2.61-1.92-2.61-1.26 0-3.09.27-3.9.51-.45.15-.72-.18-.78-.6l-.3-1.56c-.12-.51.15-.75.45-.84.3-.12 2.49-.69 4.74-.69 4.32 0 5.22 2.25 5.22 6.03v7.47c0 .36-.3.66-.66.66h-1.02c-.24 0-.42-.09-.6-.48l-.39-.93c-.81.78-2.19 1.74-4.35 1.74-2.76 0-4.68-1.77-4.68-4.74zm3.6 0c0 1.17.72 1.95 2.01 1.95 1.23 0 2.31-.96 2.49-1.47v-2.04s-.93-.42-2.04-.42c-1.59 0-2.46.75-2.46 1.98zm12.75.27c0 2.4.78 4.47 3.87 4.47 1.44 0 3.42-.63 3.9-.9.33-.18.48-.45.39-.81l-.39-1.83c-.06-.33-.39-.51-.78-.36-.36.12-1.5.45-2.1.45-.69 0-1.14-.21-1.14-1.14V10.5h3.24c.36 0 .66-.33.66-.66V7.8c0-.39-.3-.66-.66-.66h-3.24V3.3c0-.36-.27-.66-.63-.66h-2.46c-.33 0-.66.3-.66.66v3.84h-1.35c-.36 0-.63.27-.63.66v2.04c0 .33.27.66.63.66h1.35v6.36zm9.93-2.79c0 4.17 3.27 7.26 7.32 7.26 2.46 0 4.32-1.08 5.49-2.91.24-.36.09-.69-.24-.99l-1.35-1.14c-.24-.21-.66-.15-.87.09-.6.69-1.41 1.53-2.94 1.53-2.16 0-3.63-1.68-3.63-3.84 0-2.13 1.5-3.81 3.66-3.81 1.29 0 2.1.57 2.76 1.2.27.27.6.42.9.09l1.26-1.38c.3-.3.45-.69.15-.99-1.32-1.41-3-2.34-5.16-2.34-4.11 0-7.35 3.15-7.35 7.23zm15.6 6.27c0 .36.33.66.66.66h2.37c.54 0 .72-.27.72-.66v-7.65c.36-1.41 1.26-2.43 2.88-2.43 1.65 0 2.52 1.17 2.52 3.09v6.99c0 .36.3.66.66.66h2.43c.33 0 .66-.3.66-.66v-6.96c0-3.48-1.2-6.54-5.61-6.54-1.65 0-2.85.57-3.54 1.17V.66c0-.33-.3-.66-.66-.66h-2.43c-.33 0-.66.33-.66.66v19.68zm15.72-6.27c0-3.9 2.88-7.23 6.99-7.23 3.6 0 6.36 2.67 6.36 6.42 0 .21-.03.69-.06.9-.03.36-.36.63-.66.63h-8.88c.03 1.71 1.44 3.21 3.45 3.21 1.38 0 2.34-.51 2.97-1.02.33-.27.69-.3.9 0l1.17 1.56c.24.27.27.6-.06.9a7.826 7.826 0 0 1-5.16 1.89c-4.14 0-7.02-3.3-7.02-7.26zm3.96-1.74h5.61c-.06-1.35-1.14-2.4-2.67-2.4-1.68 0-2.76 1.02-2.94 2.4zm16.32 9c3.48 0 5.34-1.95 5.34-4.14 0-2.76-1.92-3.72-4.59-4.8-1.29-.54-1.98-.87-1.98-1.5 0-.45.39-.9 1.32-.9 1.14 0 2.1.39 2.76.69.3.12.66.06.87-.27l.78-1.59c.18-.36 0-.72-.3-.96-.75-.48-2.07-1.02-4.11-1.02-3.39 0-4.98 1.95-4.98 4.05 0 2.1 1.2 3.36 3.87 4.38 1.83.72 2.61 1.29 2.61 1.92 0 .6-.48.99-1.53.99-1.44 0-2.43-.51-3.06-.9-.33-.21-.66-.09-.81.24l-.9 1.8c-.15.3 0 .63.18.75.78.54 2.22 1.26 4.53 1.26z\" />\n    </symbol>\n\t<symbol id=\"vizor-logo-flat\" viewbox=\"0 0 36 36\">\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M28.338,28.703l-2.585-4.509c2.13-1.246,3.562-3.553,3.562-6.194 c0-2.637-1.432-4.946-3.563-6.193l2.586-4.512C31.157,10.002,32.914,13.8,32.914,18C32.914,22.199,31.157,25.998,28.338,28.703z M10.12,30.615l3.134-5.469c0.206,0.019,0.413,0.029,0.623,0.029h8.246c0.21,0,0.417-0.011,0.622-0.028l3.135,5.468 c-2.288,1.424-4.989,2.25-7.88,2.25S12.408,32.039,10.12,30.615z M3.086,18c0-4.2,1.757-7.998,4.576-10.705l2.585,4.51 C8.117,13.051,6.686,15.357,6.686,18c0,2.637,1.432,4.945,3.563,6.192l-2.586,4.511C4.843,25.998,3.086,22.199,3.086,18z M22.123,22.1h-8.246c-2.264,0-4.105-1.839-4.105-4.1c0-2.262,1.842-4.102,4.105-4.102h8.246c2.264,0,4.105,1.84,4.105,4.102 C26.229,20.261,24.387,22.1,22.123,22.1z M25.88,5.385l-3.135,5.467c-0.205-0.018-0.412-0.028-0.622-0.028h-8.246 c-0.21,0-0.418,0.011-0.623,0.028L10.12,5.385c2.288-1.426,4.989-2.25,7.88-2.25S23.592,3.959,25.88,5.385z M18,0.059 C8.074,0.059,0,8.107,0,18s8.074,17.94,18,17.94S36,27.893,36,18S27.926,0.059,18,0.059z\"/>\n\t</symbol>\n    <symbol id=\"vizor-top-logo\" viewBox=\"0 0 66 24\">\n\t\t<polyline points=\"1,1 5.199,1 10.156,16.305 15.113,1 19.312,1 12.197,22.568 8.115,22.568 1,1 \"/>\n\t\t<rect x=\"20.154\" y=\"7.795\" width=\"3.994\" height=\"14.773\"/>\n\t\t<polyline points=\"25.458,18.965 33.128,11.372 25.576,11.372 25.576,7.795 38.493,7.795 38.493,11.43 30.825,18.994 38.641,18.994 38.641,22.568 25.458,22.568 25.458,18.965 \"/>\n\t\t<path d=\"M50.152,15.182c0-2.098-1.633-3.84-3.674-3.84c-2.069,0-3.646,1.742-3.646,3.84c0,2.102,1.574,3.842,3.646,3.842C48.521,19.023,50.152,17.281,50.152,15.182z M38.927,15.182c0-4.253,3.354-7.682,7.554-7.682s7.553,3.428,7.553,7.682c0,4.256-3.354,7.686-7.553,7.686S38.927,19.438,38.927,15.182z\"/>\n\t\t<path d=\"M55.05,7.795h3.966v2.424c0.729-1.537,2.041-2.424,4.024-2.424h1.604v3.93h-2.537c-2.129,0-3.063,1.123-3.063,3.871v6.973H55.05V7.795\"/>\n\t\t<path d=\"M20.14,3.037C20.14,1.912,21.04,1,22.151,1c1.111,0,2.012,0.912,2.012,2.037c0,1.127-0.901,2.039-2.012,2.039C21.04,5.076,20.14,4.164,20.14,3.037\"/>\n\t</symbol>\n\t<symbol id=\"logo-big\" viewBox=\"0 0 90 130\">\n\t\t<path d=\"M45.048,79.366c-21.802,0-39.539-17.741-39.539-39.547S23.246,0.274,45.048,0.274s39.54,17.739,39.54,39.545 S66.85,79.366,45.048,79.366z M45.048,7.436c-17.854,0-32.378,14.527-32.378,32.384c0,17.857,14.524,32.385,32.378,32.385 c17.853,0,32.378-14.527,32.378-32.385C77.426,21.963,62.9,7.436,45.048,7.436z\"/>\n\t\t<path d=\"M54.041,24H36.056c-8.685,0-15.729,7.311-15.729,16c0,8.692,7.042,16,15.729,16h17.985 c8.684,0,15.729-7.31,15.729-16C69.77,31.309,62.727,24,54.041,24z M54.041,49H36.056c-4.725,0-8.568-4.272-8.568-9s3.844-9,8.568-9 h17.985c4.724,0,8.566,4.272,8.566,9S58.765,49,54.041,49z\"/>\n\t\t<path d=\"M32.69,31.038c-1.243,0-2.451-0.647-3.112-1.805l-8.989-15.735c-0.981-1.717-0.385-3.904,1.332-4.885 c1.718-0.981,3.904-0.385,4.886,1.332l8.989,15.735c0.981,1.718,0.385,3.904-1.332,4.886C33.903,30.887,33.293,31.038,32.69,31.038z\"/>\n\t\t<path d=\"M57.405,31.038c-0.603,0-1.213-0.151-1.773-0.472c-1.717-0.981-2.313-3.168-1.333-4.886l8.99-15.735 c0.98-1.717,3.168-2.314,4.885-1.332c1.717,0.98,2.314,3.168,1.334,4.885l-8.99,15.735C59.856,30.391,58.648,31.038,57.405,31.038z\" />\n\t\t<path d=\"M23.694,71.499c-0.603,0-1.213-0.152-1.773-0.472c-1.717-0.981-2.313-3.169-1.332-4.886l8.989-15.735 c0.98-1.717,3.167-2.314,4.886-1.332c1.717,0.98,2.313,3.168,1.332,4.885l-8.989,15.735C26.146,70.851,24.938,71.499,23.694,71.499z\"/>\n\t\t<path d=\"M66.4,71.499c-1.242,0-2.451-0.648-3.111-1.805l-8.99-15.735c-0.98-1.717-0.384-3.904,1.333-4.885 c1.717-0.982,3.904-0.386,4.886,1.332l8.99,15.735c0.98,1.717,0.383,3.904-1.334,4.886C67.613,71.347,67.004,71.499,66.4,71.499z\"/>\n\t\t<polyline fill-rule=\"evenodd\" clip-rule=\"evenodd\" points=\"0.73,99.78 6.572,99.78 13.468,120.743 20.364,99.78 26.206,99.78 16.308,129.321 10.629,129.321 0.73,99.78 \"/>\n\t\t<rect x=\"27.376\" y=\"109.087\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" width=\"5.558\" height=\"20.234\"/>\n\t\t<polyline fill-rule=\"evenodd\" clip-rule=\"evenodd\" points=\"34.757,124.386 45.426,113.985 34.919,113.985 34.919,109.087 52.891,109.087 52.891,114.065 42.222,124.427 53.094,124.427 53.094,129.321 34.757,129.321 34.757,124.386 \"/>\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M69.113,119.206c0-2.873-2.273-5.262-5.113-5.262 c-2.879,0-5.069,2.389-5.069,5.262s2.19,5.26,5.069,5.26C66.84,124.466,69.113,122.079,69.113,119.206z M53.494,119.206 c0-5.828,4.664-10.523,10.506-10.523s10.508,4.695,10.508,10.523c0,5.826-4.666,10.52-10.508,10.52S53.494,125.032,53.494,119.206z\" />\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M75.922,109.087h5.518v3.32c1.016-2.105,2.84-3.32,5.598-3.32 h2.232v5.385H85.74c-2.963,0-4.26,1.537-4.26,5.301v9.549h-5.559V109.087\"/>\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M27.357,102.573c0-1.541,1.253-2.793,2.798-2.793 s2.798,1.252,2.798,2.793s-1.253,2.791-2.798,2.791S27.357,104.114,27.357,102.573\"/>\n\t</symbol>\n\t<symbol id=\"logo-mini\" viewBox=\"0 0 24 24\">\n\t\t<path d=\"M12.5,23.5C6.159,23.5,1,18.341,1,12C1,5.659,6.159,0.5,12.5,0.5S24,5.659,24,12 C24,18.341,18.841,23.5,12.5,23.5z M12.5,1.5C6.71,1.5,2,6.21,2,12c0,5.79,4.71,10.5,10.5,10.5S23,17.79,23,12 C23,6.21,18.29,1.5,12.5,1.5z\"/>\n\t\t<path d=\"M8.719,8.719c-0.173,0-0.342-0.09-0.435-0.252l-2.75-4.813C5.397,3.415,5.48,3.109,5.721,2.972 c0.236-0.136,0.544-0.056,0.683,0.186l2.75,4.813C9.29,8.21,9.207,8.516,8.967,8.653C8.889,8.698,8.804,8.719,8.719,8.719z\"/>\n\t\t<path d=\"M16.281,8.719c-0.085,0-0.17-0.021-0.248-0.066c-0.24-0.137-0.323-0.442-0.187-0.682l2.75-4.813 c0.138-0.242,0.444-0.322,0.683-0.186c0.24,0.137,0.323,0.442,0.187,0.682l-2.75,4.813C16.623,8.628,16.454,8.719,16.281,8.719z\"/>\n\t\t<path d=\"M5.969,21.094c-0.085,0-0.17-0.021-0.248-0.065c-0.24-0.138-0.323-0.443-0.187-0.683l2.75-4.813 c0.138-0.24,0.444-0.321,0.683-0.187c0.24,0.138,0.323,0.443,0.187,0.683l-2.75,4.813C6.311,21.003,6.142,21.094,5.969,21.094z\"/>\n\t\t<path d=\"M19.031,21.094c-0.173,0-0.342-0.091-0.435-0.252l-2.75-4.813c-0.137-0.239-0.054-0.545,0.187-0.683 c0.236-0.135,0.544-0.054,0.683,0.187l2.75,4.813c0.137,0.239,0.054,0.545-0.187,0.683C19.201,21.072,19.116,21.094,19.031,21.094z\" />\n\t\t<path d=\"M15.93,7.875H9.07c-2.278,0-4.133,1.847-4.133,4.125c0,2.273,1.851,4.125,4.133,4.125h6.859 c2.278,0,4.133-1.847,4.133-4.125C20.063,9.727,18.212,7.875,15.93,7.875z M15.93,15.125H9.07c-1.728,0-3.133-1.402-3.133-3.125 S7.343,8.875,9.07,8.875h6.859c1.728,0,3.133,1.402,3.133,3.125S17.657,15.125,15.93,15.125z\"/>\n\t</symbol>\n\t<symbol id=\"icon-linkedin\" viewBox=\"0 0 32 32\">\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M12.271,22.619H8.407v-9.905h3.864V22.619z M10.332,11.19h-0.022 c-1.167,0-1.922-0.9-1.922-1.891c0-1.013,0.778-1.837,1.968-1.837c1.191,0,1.923,0.852,1.946,1.864 C12.3,10.317,11.545,11.19,10.332,11.19z M19.226,15.762c-0.854,0-1.546,0.683-1.546,1.524v5.333h-3.863c0,0,0.046-9.143,0-9.905 h3.863v1.132c0,0,1.197-1.1,3.044-1.1c2.288,0,3.911,1.633,3.911,4.803v5.07h-3.863v-5.333 C20.771,16.444,20.079,15.762,19.226,15.762z M16,30c7.732,0,14-6.268,14-14S23.732,2,16,2C8.268,2,2,8.268,2,16S8.268,30,16,30z\"/>\n\t</symbol>\n\t<symbol id=\"icon-www\" viewBox=\"0 0 32 32\">\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M9.569,16.74H2.056c0.11,1.555,0.452,3.043,1.011,4.421h7.33 C9.954,19.679,9.675,18.202,9.569,16.74\"/>\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M15.73,3.489c-1.256,1.4-2.256,2.877-3.021,4.408h6.547 c-0.764-1.531-1.766-3.008-3.022-4.408H15.73z\"/>\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M29.967,16.74h-7.572c-0.107,1.462-0.387,2.938-0.826,4.421h7.426 C29.547,19.782,29.879,18.294,29.967,16.74\"/>\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M10.997,16.74c0.116,1.458,0.428,2.935,0.912,4.421h8.146 c0.486-1.486,0.797-2.963,0.912-4.421H10.997z\"/>\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M21.027,15.267c-0.01-2.023-0.387-3.996-1.121-5.895h-7.848 c-0.735,1.898-1.11,3.871-1.122,5.895H21.027z\"/>\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M16.188,28.517c1.431-1.954,2.529-3.923,3.326-5.882h-7.065 c0.798,1.96,1.894,3.929,3.326,5.883L16.188,28.517z\"/>\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M2.028,15.267h7.479c0.01-2.018,0.363-3.99,1.025-5.895H3.53 C2.619,11.133,2.094,13.132,2.028,15.267\"/>\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M21.43,9.371c0.662,1.905,1.016,3.878,1.025,5.896h7.518 c-0.105-2.123-0.672-4.124-1.629-5.896H21.43z\"/>\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M21.08,22.636c-0.883,2.367-2.189,4.736-3.932,7.059l-0.194,0.258 c4.907-0.344,9.129-3.205,11.36-7.316H21.08z\"/>\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M14.815,29.698c-1.742-2.323-3.05-4.694-3.934-7.063H3.763 c2.237,4.117,6.406,6.978,11.243,7.318L14.815,29.698z\"/>\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M11.115,7.897c0.887-1.986,2.122-3.885,3.749-5.646l0.19-0.205 C10.558,2.333,6.749,4.556,4.427,7.897H11.115z\"/>\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M17.1,2.253c1.627,1.761,2.863,3.659,3.75,5.646h6.568 c-2.375-3.332-6.172-5.573-10.506-5.851L17.1,2.253z\"/>\n\t</symbol>\n\t<symbol id=\"icon-twitter\" viewBox=\"0 0 32 32\">\n\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M16,2C8.28,2,2,8.28,2,16s6.28,14,14,14c7.721,0,14-6.28,14-14 S23.721,2,16,2 M22.139,12.949c0.008,0.132,0.01,0.264,0.01,0.396c0,4.058-3.09,8.738-8.737,8.738c-1.734,0-3.349-0.51-4.708-1.382 c1.603,0.188,3.234-0.241,4.546-1.271c-1.344-0.025-2.477-0.913-2.868-2.134c0.462,0.088,0.937,0.071,1.386-0.052 c-1.405-0.281-2.463-1.522-2.463-3.009v-0.041c0.415,0.229,0.889,0.367,1.391,0.384c-0.823-0.551-1.366-1.49-1.366-2.555 c0-0.563,0.151-1.09,0.417-1.545c1.514,1.858,3.776,3.082,6.33,3.208c-0.053-0.224-0.081-0.46-0.081-0.698 c0-1.696,1.375-3.072,3.071-3.072c0.885,0,1.682,0.373,2.242,0.971c0.699-0.139,2.275-0.31,2.275-0.31 C23.172,11.195,22.74,12.515,22.139,12.949\"/>\n\t</symbol>\n    <symbol id=\"icon-fullscreen\" viewbox=\"0 0 26 26\">\n        <g transform=\"translate(0.75,0.5)\">\n            <line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"3.417\" y1=\"22.583\" x2=\"22.583\" y2=\"3.417\"/>\n            <polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"7.583,22.583 3.417,22.583 3.417,18.417 \"/>\n            <polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"22.583,7.583 22.583,3.417 18.417,3.417 \"/>\n            <line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"3.417\" y1=\"3.417\" x2=\"22.583\" y2=\"22.583\"/>\n            <polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"3.417,7.583 3.417,3.417 7.583,3.417 \"/>\n            <polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"18.417,22.583 22.583,22.583 22.583,18.417 \"/>\n        </g>\n\t</symbol>\n\n    <symbol id=\"player-mobile-graphic\" viewBox=\"0 0 102 60\">\n        <g id=\"mobile-icon\" transform=\"translate(80,-20) rotate(90.0)\" fill=\"none\" stroke=\"#FFFFFF\" stroke-width=\"2\">\n            <g id=\"mobile\" transform=\"translate(21.000000, -20.500000)\">\n                <path d=\"M58,90.4655172 C58,95.1594828 54.1617647,99 49.4705882,99 L8.52941176,99 C3.83823529,99 0,95.1594828 0,90.4655172 L0,8.53448276 C0,3.84051724 3.83823529,0 8.52941176,0 L49.4705882,0 C54.1617647,0 58,3.84051724 58,8.53448276 L58,90.4655172 L58,90.4655172 Z\"></path>\n                <path d=\"M0,17.0689655 L58,17.0689655\"></path>\n                <path d=\"M0,81.9310345 L58,81.9310345\"></path>\n                <path d=\"M17.0588235,10.2413793 L40.9411765,10.2413793\"></path>\n                <path d=\"M32.4117647,90.4655172 C32.4117647,92.349931 30.885,93.8793103 29,93.8793103 C27.1167059,93.8793103 25.5882353,92.349931 25.5882353,90.4655172 C25.5882353,88.5793966 27.1167059,87.0517241 29,87.0517241 C30.885,87.0517241 32.4117647,88.5793966 32.4117647,90.4655172 L32.4117647,90.4655172 Z\"></path>\n            </g>\n            <g transform=\"translate(36.500000, 18.000000) rotate(180) translate(-28 -23)\" stroke-linejoin=\"round\">\n                <path transform=\"rotate(90) translate(19.85 -27.5)\" d=\"M0,9 L3.5,14 L8,9\"></path>\n                <path d=\"M3.04597817,14.0297048 C2.43465082,5.94293249 8.00596396,0.252278002 14.6048061,0.00825680472 C21.2021511,-0.235263322 26.7495102,4.93778563 26.991546,11.562435 C27.237574,18.1880865 22.0834606,23.7564799 15.4846185,24\"></path>\n            </g>\n        </g>\n    </symbol>\n    <symbol id=\"player-icon-play\" viewbox=\"0 0 26 26\">\n        <g transform=\"scale(0.9,0.9) translate(2,0)\">\n            <ellipse fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"13\" cy=\"13\" rx=\"10.643\" ry=\"10.541\"/>\n            <path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M9.875,8.5l8.104,4.5 l-8.104,4.5V8.5z\"/>\n        </g>\n\t</symbol>\n\n    <symbol id=\"player-pencil\">\n        <g transform=\"translate(0, 1) scale(0.98,0.98)\" stroke-linecap=\"round\" stroke-linejoin=\"round\" fill=\"none\">\n            <path d=\"M6.5,20.5 L0,22.5 L2,16 L14,4 L18.5,8.5 L6.5,20.5 L6.5,20.5 Z\"></path>\n            <path d=\"M14,3.6685 L17.086,0.5835 C17.864,-0.1945 19.136,-0.1945 19.914,0.5835 L21.586,2.2545 C22.364,3.0335 22.364,4.3055 21.586,5.0835 L18.5,8.1685\" ></path>\n            <path d=\"M16.75,6 L6,16.75\"></path>\n            <path d=\"M2,16 L3,17 L5.5,17 L5.5,19.5 L6.5,20.5\"></path>\n            <path d=\"M1,19 L3,21\"></path>\n            <path d=\"M16,2 L20.5,6.5\"></path>\n        </g>\n    </symbol>\n    <symbol id=\"player-icon-share\"><!-- fill=\"#AFBFDF\" -->\n        <g transform=\"scale(0.98,0.98) translate(4.5,6.5)\">\n            <path d=\"M13.7619048,6.4 C13.7619048,6.4 34,4 34,24 C27.5238095,12 13.7619048,16 13.7619048,16 L13.7619048,22.4 L0,11.2 L13.7619048,0 L13.7619048,6.4 L13.7619048,6.4 Z\" transform=\"translate(17.000000, 12.000000) scale(-1, 1) translate(-17.000000, -12.000000) \"></path>\n        </g>\n    </symbol>\n\n    <symbol id=\"path-icon-view\" viewBox=\"0 0 24 14\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n        <g>\n            <path d=\"M23.5,7 C23.5,7 18.352,13.5 12,13.5 C5.648,13.5 0.5,7 0.5,7 C0.5,7 5.648,0.5 12,0.5 C18.352,0.5 23.5,7 23.5,7 L23.5,7 Z\"></path>\n            <path d=\"M16,7 C16,9.21 14.209,11 12,11 C9.791,11 8,9.21 8,7 C8,4.79 9.791,3 12,3 C14.209,3 16,4.79 16,7 L16,7 Z\"></path>\n        </g>\n    </symbol>\n\n    <symbol id=\"player-icon-view\" viewBox=\"0 0 24 14\" stroke-width=\"1\">\n        <use xlink:href=\"#path-icon-view\" stroke-width=\"1\"></use>\n    </symbol>\n\n    <symbol id=\"card-icon-view\" viewBox=\"0 0 24 14\">\n        <use xlink:href=\"#path-icon-view\" transform=\"scale(0.9,0.9) translate(2,0)\" stroke-width=\"1.3\"></use>\n    </symbol>\n\n    <symbol id=\"player-icon-fullscreen\">\n        <use transform=\"scale(0.79,0.79) translate(4,4)\" xlink:href=\"#icon-fullscreen\"></use>\n    </symbol>\n\n    <symbol id=\"player-icon-edit\" viewBox=\"0 0 28 28\"><!-- fill=\"#AFBFDF\" -->\n        <use transform=\"scale(0.775,0.775) translate(7,5)\" xlink:href=\"#player-pencil\"></use>\n    </symbol>\n\n    <symbol id=\"player-icon-edit-alt\" viewBox=\"0 0 28 28\"><!-- fill=\"#AFBFDF\" -->\n        <g transform=\"scale(0.675,0.675) translate(7,6.5)\">\n            <path d=\"M0.436924444,26.8734044 C0.387146667,27.0824711 0.450613333,27.3027378 0.602435556,27.4558044 C0.750524444,27.6026489 0.965813333,27.6723378 1.18483556,27.6213156 L9.23141333,25.7347378 C9.28492444,25.7222933 9.33594667,25.7011378 9.38323556,25.6762489 L2.38199111,18.6750044 C2.35710222,18.7222933 2.33594667,18.7733156 2.32474667,18.8268267 L0.436924444,26.8734044 Z\"></path>\n            <path d=\"M10.2824711,24.81472 L25.86416,9.23303111 L18.8243378,2.19445333 L3.24264889,17.7761422 L10.2824711,24.81472 Z\"></path>\n            <path d=\"M26.6370844,8.46072889 L27.0776178,8.02019556 C28.2897067,6.80810667 28.2897067,4.83441778 27.0776178,3.62108444 L24.4369067,0.982862222 C23.8495289,0.392995556 23.0680178,0.06944 22.2379733,0.06944 C21.4066844,0.06944 20.6251733,0.392995556 20.0377956,0.982862222 L19.5972622,1.42090667 L26.6370844,8.46072889 Z\"></path>\n        </g>\n    </symbol>\n\n    <symbol id=\"player-icon-vr\" viewBox=\"0 0 48 32\" ><!-- fill: 7E8DAB -->\n        <g transform=\"scale(0.9,0.9) translate(3,0)\">\n            <path d=\"M41.3215771,-4.61852778e-14 L5.55274286,-4.61852778e-14 C2.48609143,-4.61852778e-14 0,2.51029787 0,5.60680851 L0,25.3834894 C0,28.6617872 2.63173714,31.3191489 5.87842286,31.3191489 L13.9300686,31.3191489 C14.9037371,31.3191489 15.8018857,30.7908085 16.2819771,29.9356596 L20.9055543,21.7041702 C21.9082171,19.9509787 24.4145371,20.0360851 25.4172,21.7892766 L30.0367314,29.9411064 C30.51952,30.7935319 31.4176686,31.3191489 32.3899886,31.3191489 L40.6472914,31.3191489 C43.8804914,31.3191489 46.5257143,28.6481702 46.5257143,25.3834894 L46.5257143,5.25480851 C46.5257143,2.35302128 44.1953829,-4.61852778e-14 41.3215771,-4.61852778e-14 L41.3215771,-4.61852778e-14 Z M11.9995886,18.7234043 C9.01992,18.7234043 6.60530286,16.2845957 6.60530286,13.2765957 C6.60530286,10.2685957 9.01992,7.82978723 11.9995886,7.82978723 C14.9785829,7.82978723 17.3938743,10.2685957 17.3938743,13.2765957 C17.3938743,16.2845957 14.9785829,18.7234043 11.9995886,18.7234043 L11.9995886,18.7234043 Z M34.9253029,18.7234043 C31.9456343,18.7234043 29.5310171,16.2845957 29.5310171,13.2765957 C29.5310171,10.2685957 31.9456343,7.82978723 34.9253029,7.82978723 C37.9042971,7.82978723 40.3195886,10.2685957 40.3195886,13.2765957 C40.3195886,16.2845957 37.9042971,18.7234043 34.9253029,18.7234043 L34.9253029,18.7234043 Z\"></path>\n        </g>\n    </symbol>\n\n    <symbol id=\"vr360-upload-image\" viewBox=\"0 0 37 37\" fill=\"none\" stroke=\"#ffffff\">\n        <g stroke-linecap=\"round\" transform=\"scale(0.75,0.75) translate(9,5)\">\n            <path d=\"M34.8284698,25.7974138 C34.8284698,30.7969828 30.774806,34.8491379 25.7767457,34.8491379 C20.7771767,34.8491379 16.7250216,30.7969828 16.7250216,25.7974138 C16.7250216,20.7993534 20.7771767,16.7456897 25.7767457,16.7456897 C30.774806,16.7456897 34.8284698,20.7993534 34.8284698,25.7974138 L34.8284698,25.7974138 Z\"></path>\n            <path d=\"M25,22.0258621 L25,29.5689655\"></path>\n            <path d=\"M28.7939871,25.0431034 L25.7767457,22.0258621 L22.7595043,25.0431034\"></path>\n            <path d=\"M17.2907543,16.1283621 L15.9918319,12.9738362 L11.4659698,21.27125 L8.44872845,18.2540086 L4.67717672,25.7971121 L12.9142457,25.7971121\"></path>\n            <path d=\"M9.20258621,9.95689655 C9.20258621,11.2060345 8.18728448,12.2198276 6.93965517,12.2198276 C5.68900862,12.2198276 4.67672414,11.2060345 4.67672414,9.95689655 C4.67672414,8.70775862 5.68900862,7.69396552 6.93965517,7.69396552 C8.18728448,7.69396552 9.20258621,8.70775862 9.20258621,9.95689655 L9.20258621,9.95689655 Z\"></path>\n            <path d=\"M15.9913793,31.8318966 L0.150862069,31.8318966 L0.150862069,0.150862069 L16.7456897,0.150862069 L24.2887931,7.69396552 L24.2887931,14.4827586\"></path>\n            <path d=\"M16.7456897,0.150862069 L16.7456897,7.69396552 L24.2887931,7.69396552\"></path>\n        </g>\n    </symbol>\n\n    <symbol id=\"vr360-tos\" viewBox=\"0 0 24 30\" fill=\"none\" stroke=\"#ffffff\" stroke-width=\"1\">\n        <g stroke-linecap=\"round\" transform=\"translate(2,2)\">\n            <path d=\"M3.4814,6.5 L7.9814,6.5\" />\n            <path d=\"M3.4814,9.5 L11.4814,9.5\" />\n            <path d=\"M3.4814,12.5 L9.4814,12.5\" />\n            <path d=\"M3.4814,15.5 L8.4814,15.5\" />\n            <polygon points=\"15.998 22.002 12.498 23.002 13.498 19.502 21 12 23.5 14.5\" />\n            <path d=\"M19,14 L21.5,16.5\" />\n            <path d=\"M13.498,19.502 L15.998,22.002\" />\n            <polyline points=\"11 21.5 0.5 21.5 0.5 0.5 11.5 0.5 16.5 5.5 16.482 12.035\" />\n            <polyline points=\"11.5 0.5 11.5 5.5 16.5 5.5\" />\n        </g>\n    </symbol>\n\n\t<symbol id=\"icon-go\" viewbox=\"0 0 24 24\">\n\t\t<line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"1\" y1=\"12\" x2=\"16\" y2=\"12\"/>\n\t\t<polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"12,8 16,12 12,16 \"/>\n\t\t<path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M1.982,7.451 C3.712,3.646,7.547,1,12,1c6.075,0,11,4.925,11,11c0,6.074-4.925,11-11,11c-4.473,0-8.322-2.67-10.042-6.502\"/>\n\t</symbol>\n\t<symbol id=\"icon-sign-in\" viewbox=\"0 0 30 30\">\n        <g transform=\"scale(1.03,1.03) translate(-2.5,-1.5)\">\n            <path fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M14.501,19.559c0,0-1.25-0.416-1.25-2.5 c-0.688,0-0.688-1.667,0-1.667c0-0.279-1.25-3.333,0.833-2.917c0.417-1.667,5-1.667,5.417,0c0.289,1.157-0.416,2.712-0.416,2.917 c0.688,0,0.688,1.667,0,1.667c0,2.084-1.25,2.5-1.25,2.5v2.084c2.063,0.773,4.107,1.414,5.154,2.146 c1.706-1.729,2.762-4.104,2.762-6.729c0-5.292-4.289-9.583-9.583-9.583c-5.293,0-9.583,4.29-9.583,9.583 c0,2.627,1.059,5.008,2.771,6.739c1.108-0.767,3.294-1.455,5.146-2.155V19.559z\"/>\n            <path fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M9.354,23.798 c1.738,1.757,4.148,2.845,6.813,2.845c2.669,0,5.083-1.092,6.821-2.854\"/>\n        </g>\n\t</symbol>\n\n\t<symbol id=\"breadcrumb-separator\" viewbox=\"0 0 19 10\">\n\t\t<polyline fill=\"none\" stroke-width=\"1.494\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"8,2 11.404,5.404 8,8.809 \"/>\n\t</symbol>\n\n\t<!-- assets -->\n\t<symbol id=\"icon-search\" viewbox=\"0 0 30 30\">\n        <line fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" x1=\"17.388\" y1=\"17.293\" x2=\"24.856\" y2=\"24.525\"/>\n        <ellipse fill=\"none\" stroke-miterlimit=\"10\" cx=\"12.744\" cy=\"12.661\" rx=\"6.568\" ry=\"6.552\"/>\n    </symbol>\n    <symbol id=\"site-icon-arrow-vertical\" viewbox=\"0 0 10 7\">\n        <polyline fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" points=\"0.839,1.514 5,5.485 9.161,1.514 \"/>\n    </symbol>\n    <symbol id=\"icon-new-project\" viewbox=\"0 0 50 50\">\n        <path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M35.834,16.5v-3.333 H14.167V9.833H5.833v25.833c0,1.381,1.117,2.5,2.5,2.5c1.38,0,2.5-1.119,2.5-2.5V16.5h28.333V24\"/>\n        <line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"8.333\" y1=\"38.166\" x2=\"20\" y2=\"38.166\"/>\n        <circle fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" cx=\"34.166\" cy=\"38.166\" r=\"10\"/>\n        <line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"29.621\" y1=\"38.166\" x2=\"38.713\" y2=\"38.166\"/>\n        <line fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" x1=\"34.166\" y1=\"42.713\" x2=\"34.166\" y2=\"33.621\"/>\n    </symbol>\n    <symbol id=\"site-icon-new-graph\" viewbox=\"0 0 50 50\">\n        <circle fill=\"none\" stroke-miterlimit=\"10\" cx=\"36.317\" cy=\"36.015\" r=\"9.333\"/>\n        <path fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" d=\"M36.318,40.599V31.43 M31.732,36.015h9.17\"/>\n        <path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M21.908,36.015H6.35 L6.379,6.681l29.303-0.029v16.752 M27.908,24.903l-3.037-7.599l-4.203,9.247l-4.203-5.045l-4.782,8.174\"/>\n        <line fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" x1=\"6.38\" y1=\"30.015\" x2=\"24.186\" y2=\"30.015\"/>\n        <path fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M16.35,14.681 c0,1.475-1.192,2.668-2.667,2.668c-1.473,0-2.666-1.193-2.666-2.668c0-1.471,1.193-2.666,2.666-2.666 C15.157,12.015,16.35,13.21,16.35,14.681z\"/>\n    </symbol>\n    <symbol id=\"site-icon-ca-duplicate\" viewbox=\"0 0 24 24\">\n        <path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M5,4.455h10.138v10.137H5V4.455z M15.138,14.592V8.317H19v10.138H8.862v-3.863H15.138z\"/>\n    </symbol>\n    <symbol id=\"site-icon-ca-move\" viewbox=\"0 0 24 24\">\n        <path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M5.898,16.842h10.346c0.981,0,1.881-0.879,1.881-1.86V13.66 M18.125,10.228V7.907H7.311v7.524c0,0.857-0.594,1.41-1.412,1.41s-1.41-0.592-1.41-1.41V5.556h4.232v0.94h7.523v1.411\"/>\n        <path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M14.182,9.819L12,12l2.182,2.181 M12,12h8.92\"/>\n    </symbol>\n\n    <symbol id=\"icon-ca-share\" viewbox=\"0 0 14 14\" stroke=\"none\">\n        <g transform=\"scale(0.6 0.6) translate(4 4)\">\n            <path d=\"M11.2,8.4 C10.36,8.4 9.6138,8.7794 9.1,9.3674 L5.5363,7.5852 C5.5769,7.3962 5.6,7.2009 5.6,7 C5.6,6.7991 5.5769,6.6038 5.5363,6.4148 L9.1,4.6326 C9.6138,5.2206 10.36,5.6 11.2,5.6 C12.7442,5.6 14,4.3442 14,2.8 C14,1.2558 12.7442,0 11.2,0 C9.6558,0 8.4,1.2558 8.4,2.8 C8.4,3.0009 8.4231,3.1962 8.4637,3.3852 L4.9,5.1674 C4.3862,4.5794 3.64,4.2 2.8,4.2 C1.2558,4.2 0,5.4558 0,7 C0,8.5442 1.2558,9.8 2.8,9.8 C3.64,9.8 4.3862,9.4206 4.9,8.8326 L8.4637,10.6148 C8.4231,10.8038 8.4,10.9991 8.4,11.2 C8.4,12.7442 9.6558,14 11.2,14 C12.7442,14 14,12.7442 14,11.2 C14,9.6558 12.7442,8.4 11.2,8.4\"></path>\n        </g>\n\n        <!-- viewbox 24 24\n        <path fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M10.487,9.205 c0,0,8.8-0.968,8.8,7.7c-2.774-5.201-8.8-3.575-8.8-3.575v2.75l-5.775-4.804l5.775-4.821V9.205z\"/>\n        -->\n    </symbol>\n    <symbol id=\"icon-ca-publish\" viewbox=\"0 0 24 24\">\n        <path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M12,16.709v2 M9.85,18.873h4.401\"/>\n        <line fill=\"none\" stroke-miterlimit=\"10\" x1=\"6.182\" y1=\"13.455\" x2=\"17.818\" y2=\"13.455\"/>\n        <path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M14.036,9.146h2.618c0.607,0,1.164,0.265,1.164,0.873v5.527c0,0.607-0.557,1.164-1.164,1.164H7.346 c-0.609,0-1.164-0.557-1.164-1.164v-5.387c0-0.608,0.555-1.012,1.164-1.012h2.617 M14.908,6.364L12,3.455L9.091,6.364 M12,3.455v7\" />\n    </symbol>\n    <symbol id=\"icon-ca-download\" viewbox=\"0 0 24 24\">\n        <path fill=\"none\" stroke-linecap=\"round\" stroke-miterlimit=\"10\" d=\"M15.627,13.975h1.027 c0,0,3.04-0.266,3.04-3.247c0-1.889-1.56-3.442-3.499-3.371c-0.758-1.599-2.382-2.708-4.268-2.708c-2.517,0-4.568,1.966-4.715,4.444 C5.637,8.764,4.16,9.964,4.16,11.572c0,2.572,2.701,2.402,2.701,2.402h1.347\"/>\n        <path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\" M14.24,15.654L12,17.895l-2.24-2.24 M12,17.895V10.79\"/>\n    </symbol>\n\n    <!-- symbol id=\"icon-ca-delete\" viewbox=\"0 0 24 24\">\n        <path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M14.567,8.888v6.534V8.888z M12,8.888v6.534V8.888z M9.434,8.888v6.534V8.888z M5.233,6.321h13.533H5.233z M9.434,4.455h5.134v1.867 H9.434V4.455z M7.101,6.321h9.799v11.667H7.101V6.321z\"/>\n    </symbol -->\n\n    <symbol id=\"icon-ca-delete\" viewbox=\"0 0 14 14\" stroke=\"none\">\n        <g transform=\"scale(0.6 0.6) translate(4 4.2)\">\n            <polygon points=\"8.84210526 1.47368421 8.84210526 0 4.42105263 0 4.42105263 1.47368421 0 1.47368421 0 2.94736842 13.2631579 2.94736842 13.2631579 1.47368421\"></polygon>\n            <path d=\"M8.84210526,11.0526316 L7.36842105,11.0526316 L7.36842105,6.63157895 L8.84210526,6.63157895 L8.84210526,11.0526316 Z M5.89473684,11.0526316 L4.42105263,11.0526316 L4.42105263,6.63157895 L5.89473684,6.63157895 L5.89473684,11.0526316 Z M1.47368421,3.68421053 L1.47368421,12.5263158 C1.47368421,13.3390526 2.13463158,14 2.94736842,14 L10.3157895,14 C11.1285263,14 11.7894737,13.3390526 11.7894737,12.5263158 L11.7894737,3.68421053 L1.47368421,3.68421053 Z\"></path>\n        </g>\n    </symbol>\n\n    <symbol id=\"icon-ca-rename\" viewbox=\"0 0 14 14\">\n        <path fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M4.4,12.801L1.2,13.6L2,10.4L9.8,2.6c0.395-0.394,1.006-0.594,1.4-0.199L12.4,3.6c0.394,0.395,0.194,1.006-0.2,1.4L4.4,12.801z\"/>\n        <path fill=\"none\" stroke-linejoin=\"round\" stroke-miterlimit=\"10\" d=\"M4.4,12.8L2,10.4 M11.4,5.8L9,3.4 M12,5.2L9.601,2.8\"/>\n    </symbol>\n    <symbol id=\"icon-close\" viewbox=\"0 0 16 16\">\n        <polygon stroke-width=\"2\" fill-rule=\"evenodd\" clip-rule=\"evenodd\" points=\"7.94,8.721 3.44,13.22 2.78,12.56 7.28,8.06 2.66,3.44 3.335,2.765 7.955,7.385 12.68,2.66 13.34,3.32 8.615,8.045 13.234,12.664 12.56,13.34 \"/>\n    </symbol>\n\n    <symbol id=\"path-button-spinner\" fill=\"none\" viewbox=\"0 0 30 30\">\n        <g transform=\"\">\n            <path d=\"M0.124164881,9.1977 L3.6120622,14.5017556 L7.62308155,9.59892222\"></path>\n            <path d=\"M28.374256,14.6944444 L24.8876101,9.39038889 L20.8753393,14.2932222\"></path>\n            <path d=\"M24.8410548,9.43856111 C25.8847958,15.0710056 21.9964223,20.5910056 16.6951188,21.8687833 C12.9982229,22.76195 9.29131518,21.5633944 6.76956667,19.0270056\"></path>\n            <path d=\"M3.61819449,14.4698111 C1.97499063,8.23042222 6.08362604,2.10858889 11.8004237,0.729866667 C15.7501201,-0.224633333 19.7048225,1.2052 22.2178106,4.10447778\"></path>\n        </g>\n    </symbol>\n    <symbol id=\"icon-button-spinner\">\n        <use xlink:href=\"#path-button-spinner\" stroke=\"#ffffff\" transform=\"scale(1,1) translate(0.7, 3)\" stroke-width=\"1.3\" />\n    </symbol>\n\n    <!-- fill: #c3c3c3 -->\n    <symbol id=\"icon-angellist\" viewbox=\"0 0 14 20\">\n        <g transform=\"translate(-846.000000, -1894.000000)\">\n            <path d=\"M856.741603,1902.2968 C857.358072,1900.63009 857.839254,1899.25418 858.184451,1898.16899 C858.529578,1897.0838 858.702142,1896.41762 858.702142,1896.17037 C858.702142,1895.90479 858.644621,1895.69872 858.529578,1895.55225 C858.414326,1895.40585 858.255585,1895.33244 858.053283,1895.33244 C857.795484,1895.33244 857.533149,1895.54537 857.266275,1895.97118 C856.999122,1896.39699 856.704815,1897.08172 856.382654,1898.02481 L855.001935,1901.99454 L856.741603,1902.2968 Z M854.905321,1905.99185 C854.509514,1905.97358 854.134299,1905.9324 853.780097,1905.86822 C853.425755,1905.80433 853.087399,1905.71258 852.765308,1905.59354 C852.912322,1905.88677 853.04349,1906.17964 853.158812,1906.47266 C853.273784,1906.76589 853.368024,1907.05432 853.441811,1907.33803 C853.662751,1907.06328 853.895139,1906.81395 854.139046,1906.58941 C854.382813,1906.36508 854.638238,1906.16589 854.905321,1905.99185 L854.905321,1905.99185 Z M853.345197,1901.82973 L851.854043,1897.54399 C851.46745,1896.45422 851.168325,1895.74241 850.9566,1895.408 C850.744735,1895.07373 850.514789,1894.90663 850.266275,1894.90663 C850.072979,1894.90663 849.916331,1894.98004 849.796821,1895.12637 C849.677171,1895.27291 849.617346,1895.46981 849.617346,1895.71706 C849.617346,1896.13836 849.778252,1896.87093 850.100622,1897.91487 C850.422783,1898.95887 850.905989,1900.3279 851.550311,1902.02204 C851.605529,1901.92134 851.683573,1901.85036 851.785003,1901.8091 C851.886224,1901.76792 852.024303,1901.74729 852.19924,1901.74729 C852.254458,1901.74729 852.364893,1901.75208 852.530616,1901.76104 C852.696268,1901.77021 852.967609,1901.79334 853.345197,1901.82973 L853.345197,1901.82973 Z M851.992122,1908.4644 C852.14856,1908.4644 852.291037,1908.39363 852.42011,1908.25153 C852.548975,1908.10957 852.613407,1907.95616 852.613407,1907.79135 C852.613407,1907.61751 852.486846,1907.21232 852.233725,1906.57566 C851.980394,1905.9392 851.665354,1905.3142 851.287975,1904.70067 C851.011817,1904.24277 850.740337,1903.89711 850.473393,1903.66354 C850.206241,1903.43004 849.953329,1903.31329 849.714029,1903.31329 C849.520733,1903.31329 849.306703,1903.43483 849.072011,1903.67729 C848.837319,1903.91996 848.719903,1904.14658 848.719903,1904.35723 C848.719903,1904.57704 848.835015,1904.90673 849.0651,1905.34629 C849.295046,1905.78585 849.603524,1906.25285 849.990117,1906.74734 C850.395139,1907.28789 850.777125,1907.70891 851.136074,1908.01116 C851.495024,1908.31335 851.780187,1908.4644 851.992122,1908.4644 L851.992122,1908.4644 Z M847.850104,1908.13479 C847.978968,1908.29064 848.158443,1908.51941 848.388597,1908.8216 C848.996061,1909.65488 849.557382,1910.07159 850.072979,1910.07159 C850.247706,1910.07159 850.404354,1910.01665 850.542433,1909.90671 C850.680442,1909.79684 850.749481,1909.68238 850.749481,1909.56334 C850.749481,1909.42597 850.657475,1909.19719 850.473393,1908.87653 C850.289102,1908.55601 850.03619,1908.19444 849.714029,1907.79135 C849.345865,1907.32435 849.039621,1906.9832 848.795853,1906.76797 C848.551947,1906.55295 848.356207,1906.44516 848.209123,1906.44516 C847.886753,1906.44516 847.589862,1906.61684 847.318591,1906.96028 C847.04704,1907.30365 846.911265,1907.70891 846.911265,1908.17597 C846.911265,1908.55164 847.005575,1908.97057 847.194334,1909.43284 C847.382813,1909.89525 847.656807,1910.36002 848.015826,1910.82709 C848.558858,1911.55057 849.232917,1912.10667 850.038494,1912.49588 C850.843861,1912.88544 851.734393,1913.07962 852.71009,1913.07962 C854.504906,1913.07962 856.007579,1912.41344 857.217968,1911.08121 C858.428148,1909.74878 859.033517,1908.07985 859.033517,1906.07429 C859.033517,1905.46089 858.987305,1904.97326 858.895439,1904.61135 C858.803433,1904.24964 858.651532,1903.98635 858.439806,1903.82154 C858.062288,1903.51033 857.328404,1903.23085 856.237664,1902.98361 C855.146924,1902.73636 854.007878,1902.61273 852.820525,1902.61273 C852.48915,1902.61273 852.254458,1902.66767 852.116379,1902.77754 C851.9783,1902.88748 851.90926,1903.07521 851.90926,1903.34073 C851.90926,1903.96364 852.259065,1904.41445 852.958604,1904.69379 C853.657934,1904.97326 854.790069,1905.11272 856.35501,1905.11272 L856.921148,1905.11272 C857.049942,1905.11272 857.153536,1905.16085 857.23179,1905.25698 C857.309765,1905.3531 857.362958,1905.49735 857.390532,1905.68966 C857.233815,1905.8362 856.911863,1906.00351 856.42405,1906.19103 C855.936027,1906.37876 855.563255,1906.5642 855.305736,1906.74734 C854.753421,1907.15051 854.309376,1907.62883 853.973393,1908.18285 C853.637201,1908.73707 853.469454,1909.26116 853.469454,1909.75565 C853.469454,1910.05784 853.540588,1910.42184 853.683414,1910.84765 C853.8261,1911.27353 853.897443,1911.53682 853.897443,1911.63752 L853.897443,1911.73364 L853.869799,1911.85727 C853.464638,1911.82984 853.14499,1911.59425 852.910298,1911.1499 C852.675536,1910.70576 852.558189,1910.11278 852.558189,1909.37103 L852.558189,1909.24741 C852.484333,1909.31151 852.4132,1909.35728 852.34423,1909.38478 C852.27519,1909.41221 852.19924,1909.42597 852.116379,1909.42597 C852.033517,1909.42597 851.955263,1909.41909 851.881687,1909.40534 C851.80783,1909.39166 851.724969,1909.37103 851.633103,1909.34353 C851.660746,1909.44444 851.681479,1909.54271 851.695231,1909.63891 C851.709123,1909.73503 851.715964,1909.81059 851.715964,1909.86553 C851.715964,1910.20438 851.582492,1910.49532 851.315549,1910.73777 C851.048466,1910.98051 850.730913,1911.10177 850.362888,1911.10177 C849.783069,1911.10177 849.193965,1910.82021 848.595646,1910.25703 C847.997188,1909.69384 847.698273,1909.14225 847.698273,1908.60178 C847.698273,1908.50107 847.709721,1908.41176 847.732758,1908.3339 C847.755585,1908.25626 847.794886,1908.18972 847.850104,1908.13479 L847.850104,1908.13479 Z M857.735729,1902.53029 C858.564063,1902.68621 859.14856,1903.03396 859.48915,1903.57429 C859.82953,1904.11477 860,1904.96639 860,1906.12922 C860,1908.43697 859.302764,1910.32572 857.908293,1911.79546 C856.513752,1913.26513 854.730454,1914 852.558189,1914 C851.702212,1914 850.871505,1913.84658 850.066068,1913.53981 C849.260491,1913.23304 848.568072,1912.80494 847.988183,1912.25551 C847.325502,1911.65127 846.828404,1911.01253 846.497028,1910.33947 C846.165653,1909.66634 846,1908.97745 846,1908.27209 C846,1907.48458 846.17033,1906.87576 846.51085,1906.44516 C846.851231,1906.01477 847.389655,1905.72189 848.126262,1905.56604 C847.988183,1905.24552 847.886753,1904.97535 847.82253,1904.7556 C847.758028,1904.53579 847.725847,1904.36639 847.725847,1904.24735 C847.725847,1903.83529 847.944413,1903.41421 848.381687,1902.98361 C848.81868,1902.55321 849.230753,1902.33798 849.617346,1902.33798 C849.783069,1902.33798 849.957727,1902.36778 850.142018,1902.4273 C850.3261,1902.48702 850.537616,1902.5853 850.777125,1902.72261 C850.068162,1900.72621 849.552914,1899.18549 849.230753,1898.1003 C848.908453,1897.01512 848.747547,1896.26649 848.747547,1895.85444 C848.747547,1895.28667 848.894631,1894.83585 849.189357,1894.50137 C849.483944,1894.1671 849.884289,1894 850.390532,1894 C851.255585,1894 852.351071,1895.92312 853.676503,1899.7693 C853.906448,1900.42861 854.081525,1900.93686 854.201175,1901.29405 C854.302465,1901.01034 854.444942,1900.60724 854.629164,1900.08524 C855.954595,1896.27566 857.095806,1894.37087 858.053283,1894.37087 C858.522667,1894.37087 858.897603,1894.52888 859.178507,1894.84481 C859.459203,1895.16075 859.599585,1895.58448 859.599585,1896.11544 C859.599585,1896.51853 859.445451,1897.25549 859.137042,1898.32699 C858.828563,1899.39843 858.361552,1900.79948 857.735729,1902.53029 L857.735729,1902.53029 Z\"></path>\n        </g>\n    </symbol>\n\n\n    <symbol id=\"icon-email\" viewbox=\"0 0 20 16\">\n        <g transform=\"translate(0,2)\">\n            <path d=\"M10,5.8232 L18.965,0.2592 C18.678,0.0992 18.352,0.0002 18,0.0002 L2,0.0002 C1.648,0.0002 1.322,0.0992 1.035,0.2592 L10,5.8232 Z\"></path>\n            <path d=\"M10.5273,7.8496 C10.3653,7.9496 10.1833,7.9996 10.0003,7.9996 C9.8173,7.9996 9.6343,7.9496 9.4723,7.8496 L0.0033,1.9726 C0.0033,1.9826 0.0003,1.9916 0.0003,1.9996 L0.0003,10.9996 C0.0003,12.1026 0.8973,12.9996 2.0003,12.9996 L18.0003,12.9996 C19.1033,12.9996 20.0003,12.1026 20.0003,10.9996 L20.0003,1.9996 C20.0003,1.9916 19.9973,1.9826 19.9973,1.9726 L10.5273,7.8496 Z\"></path>\n        </g>\n    </symbol>\n\n    <symbol id=\"icon-facebook\" viewbox=\"0 0 13 24\">\n        <g transform=\"\">\n            <path d=\"M12.7676,7.4648 L8.4996,7.4648 L8.4996,5.5598 C8.4996,4.6638 9.0936,4.4548 9.5116,4.4548 L12.4996,4.4548 L12.4996,0.5128 L8.1706,0.4998 C4.2446,0.4998 3.4996,3.4388 3.4996,5.3208 L3.4996,7.4648 L0.4996,7.4648 L0.4996,11.4648 L3.4996,11.4648 L3.4996,23.4648 L8.4996,23.4648 L8.4996,11.4648 L12.3506,11.4648 L12.7676,7.4648 Z\"></path>\n        </g>\n    </symbol>\n\n\n    <symbol id=\"icon-github\" viewbox=\"0 0 23 20\">\n        <g transform=\"\">\n            <path d=\"M15.459,17.5 L7.459,17.5 C5.526,17.5 3.959,15.933 3.959,14 C3.959,8.093 8.084,10.469 11.459,10.469 C14.833,10.469 18.959,8.031 18.959,14 C18.959,15.933 17.393,17.5 15.459,17.5 M20.988,7.214 L21.02,7.237 C21.02,7.237 23.667,2.666 20.417,0 C18.417,0 15.358,3.304 15.358,3.304 L15.381,3.319 C12.891,2.586 10.096,2.581 7.6,3.303 C7.583,3.285 4.537,0 2.542,0 C-0.632,2.602 1.812,7.012 1.928,7.217 C0.91,8.743 0.355,10.65 0.532,12.96 C0.773,16.086 3.38,19.5 6.515,19.5 L16.402,19.5 C19.538,19.5 22.144,16.086 22.385,12.96 C22.563,10.648 22.008,8.74 20.988,7.214\"></path>\n            <path d=\"M15.9795,14 C15.9795,14.829 15.5325,15.5 14.9795,15.5 C14.4275,15.5 13.9795,14.829 13.9795,14 C13.9795,13.171 14.4275,12.5 14.9795,12.5 C15.5325,12.5 15.9795,13.171 15.9795,14\"></path>\n            <path d=\"M8.9795,14 C8.9795,14.829 8.5325,15.5 7.9795,15.5 C7.4275,15.5 6.9795,14.829 6.9795,14 C6.9795,13.171 7.4275,12.5 7.9795,12.5 C8.5325,12.5 8.9795,13.171 8.9795,14\"></path>\n        </g>\n    </symbol>\n\n\n    <symbol id=\"icon-twitter2\" viewbox=\"0 0 23 18\">\n        <g transform=\"\">\n            <path d=\"M22.444,2.334 C21.63,2.697 20.944,2.709 20.216,2.35 C21.155,1.788 21.198,1.394 21.537,0.331 C20.659,0.852 19.686,1.231 18.651,1.436 C17.823,0.553 16.641,0 15.335,0 C12.825,0 10.791,2.036 10.791,4.544 C10.791,4.901 10.831,5.248 10.908,5.58 C7.131,5.391 3.783,3.581 1.542,0.831 C1.151,1.503 0.926,2.284 0.926,3.117 C0.926,4.694 1.729,6.084 2.948,6.899 C2.203,6.875 1.503,6.671 0.89,6.331 C0.889,6.35 0.889,6.368 0.889,6.388 C0.889,8.59 2.456,10.426 4.535,10.844 C3.869,11.025 3.167,11.053 2.482,10.922 C3.061,12.727 4.739,14.041 6.727,14.078 C4.783,15.602 2.372,16.237 0,15.959 C2.011,17.248 4.399,18 6.965,18 C15.324,18 19.893,11.076 19.893,5.071 C19.893,4.873 19.89,4.679 19.881,4.483 C20.768,3.843 21.835,3.246 22.444,2.334\"></path>\n        </g>\n    </symbol>\n\n\n    <symbol id=\"vizor-mark\" viewbox=\"0 0 32 32\">\n        <g transform=\"\">\n           <path d=\"M15.9945083,0.0836842105 C7.18817162,0.0836842105 0.0237623762,7.22463158 0.0237623762,16.0018947 C0.0237623762,24.7792632 7.18817162,31.9201053 15.9945083,31.9201053 C24.8008449,31.9201053 31.9652541,24.7792632 31.9652541,16.0018947 C31.9652541,7.22463158 24.8008449,0.0836842105 15.9945083,0.0836842105 L15.9945083,0.0836842105 Z M22.9861386,4.80884211 L20.2049901,9.65989474 C20.0229175,9.64431579 19.8391551,9.63463158 19.6529637,9.63463158 L12.3359472,9.63463158 C12.1498614,9.63463158 11.9659934,9.64431579 11.7839208,9.65989474 L9.00277228,4.80884211 C11.0329241,3.54452632 13.4293333,2.81252632 15.9945083,2.81252632 C18.5596832,2.81252632 20.9560924,3.54452632 22.9861386,4.80884211 L22.9861386,4.80884211 Z M19.6529637,19.6403158 L12.3359472,19.6403158 C10.3275512,19.6403158 8.69354455,18.0081053 8.69354455,16.0018947 C8.69354455,13.9956842 10.3275512,12.3634737 12.3359472,12.3634737 L19.6529637,12.3634737 C21.6614653,12.3634737 23.2953663,13.9956842 23.2953663,16.0018947 C23.2953663,18.0081053 21.6614653,19.6403158 19.6529637,19.6403158 L19.6529637,19.6403158 Z M2.76150495,16.0018947 C2.76150495,12.2755789 4.32042244,8.90568421 6.82180858,6.50473684 L9.11556436,10.5055789 C7.22545215,11.6108421 5.95569637,13.6577895 5.95569637,16.0018947 C5.95569637,18.3413684 7.22608581,20.39 9.11640924,21.4967368 L6.82180858,25.4991579 C4.32042244,23.0982105 2.76150495,19.7283158 2.76150495,16.0018947 L2.76150495,16.0018947 Z M9.00277228,27.1949474 L11.7840264,22.3438947 C11.966099,22.3594737 12.1498614,22.3691579 12.3359472,22.3691579 L19.6529637,22.3691579 C19.8391551,22.3691579 20.0229175,22.3594737 20.2049901,22.344 L22.9861386,27.1949474 C20.9560924,28.4592632 18.5596832,29.1912632 15.9945083,29.1912632 C13.4293333,29.1912632 11.0329241,28.4592632 9.00277228,27.1949474 L9.00277228,27.1949474 Z M25.1671023,25.4991579 L22.8733465,21.4982105 C24.7635644,20.3929474 26.0332145,18.3461053 26.0332145,16.0018947 C26.0332145,13.6624211 24.7629307,11.6137895 22.8725017,10.5070526 L25.1671023,6.50473684 C27.6685941,8.90568421 29.2274059,12.2755789 29.2274059,16.0018947 C29.2274059,19.7283158 27.6684884,23.0982105 25.1671023,25.4991579 L25.1671023,25.4991579 Z\"></path>\n        </g>\n    </symbol>\n\n    <symbol id=\"download-icon-big\" viewbox=\"0 0 140 140\">\n        <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n            <circle fill=\"#250642\" cx=\"70\" cy=\"70\" r=\"70\"></circle>\n            <g transform=\"translate(47.000000, 45.000000)\" stroke=\"#FFFFFF\" stroke-width=\"2\">\n                <path d=\"M25.9879713,24.2609885 L24.0581437,19.5742644 L17.3340057,31.9018506 L12.8512471,27.419092 L7.24779885,38.6259885 L19.4834885,38.6259885\" id=\"Stroke-2557\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n                <path d=\"M13.9712644,15.091954 C13.9712644,16.9478161 12.4605747,18.454023 10.6091954,18.454023 C8.75109195,18.454023 7.24712644,16.9478161 7.24712644,15.091954 C7.24712644,13.236092 8.75109195,11.7298851 10.6091954,11.7298851 C12.4605747,11.7298851 13.9712644,13.236092 13.9712644,15.091954 L13.9712644,15.091954 Z\" id=\"Stroke-2558\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n                <path d=\"M24.0574713,47.591954 L0.522988506,47.591954 L0.522988506,0.522988506 L25.1781609,0.522988506 L36.3850575,11.7298851 L36.3850575,21.816092\" id=\"Stroke-2559\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n                <path d=\"M25.1781609,0.522988506 L25.1781609,11.7298851 L36.3850575,11.7298851\" id=\"Stroke-2560\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n                <circle id=\"Oval-1\" cx=\"38.5517241\" cy=\"38.5517241\" r=\"13.4482759\"></circle>\n                <rect id=\"Rectangle-5\" x=\"29.3060345\" y=\"33.5086207\" width=\"18.4913793\" height=\"10.0862069\" rx=\"5.4\"></rect>\n                <path d=\"M30.5668103,28.0452586 L33.9288793,33.9288793\" id=\"Line\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n                <path d=\"M43.174569,28.0452586 L46.5366379,33.9288793\" id=\"Line-Copy-7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" transform=\"translate(44.855603, 30.987069) scale(-1, 1) translate(-44.855603, -30.987069) \"></path>\n                <path d=\"M30.5668103,43.174569 L33.9288793,49.0581897\" id=\"Line\" stroke-linecap=\"round\" stroke-linejoin=\"round\" transform=\"translate(32.247845, 46.116379) scale(1, -1) translate(-32.247845, -46.116379) \"></path>\n                <path d=\"M43.174569,43.174569 L46.5366379,49.0581897\" id=\"Line-Copy-7\" stroke-linecap=\"round\" stroke-linejoin=\"round\" transform=\"translate(44.855603, 46.116379) scale(-1, -1) translate(-44.855603, -46.116379) \"></path>\n            </g>\n        </g>\n    </symbol>\n\n    <!-- graph tiles -->\n    <symbol id=\"eye-22x14\" viewBox=\"0 0 22 14\">\n        <g stroke=\"none\" stroke-width=\"1\" fill-rule=\"evenodd\" >\n            <!-- -->\n            <path d=\"M11,11 C8.791,11 7,9.21 7,7 C7,4.79 8.791,3 11,3 C13.209,3 15,4.79 15,7 C15,9.21 13.209,11 11,11 M11,0 C4.648,0 0,7 0,7 C0,7 4.648,14 11,14 C17.352,14 22,7 22,7 C22,7 17.352,0 11,0\"></path>\n            <path d=\"M11,5 C9.896,5 9,5.895 9,7 C9,8.105 9.896,9 11,9 C12.104,9 13,8.105 13,7 C13,5.895 12.104,5 11,5\"></path>\n        </g>\n    </symbol>\n\n    <symbol id=\"eye-21x13\" viewBox=\"0 0 16 10\" >\n        <use xlink:href=\"#eye-22x14\" transform=\"scale(0.955,0.955) translate(1 0)\" />\n    </symbol>\n\n    <symbol id=\"eye-16x10\" viewBox=\"0 0 16 10\" >\n        <use xlink:href=\"#eye-22x14\" transform=\"scale(0.8,0.8) translate(2 0)\" />\n    </symbol>\n\n    <symbol id=\"card-new-project-2\" viewBox=\"0 0 36 36\" fill=\"none\">\n        <g stroke-width=\"1.5\">\n            <path d=\"M35.22945,26.25 C35.22945,31.221 31.19745,35.25 26.22945,35.25 C21.25845,35.25 17.22945,31.221 17.22945,26.25 C17.22945,21.2805 21.25845,17.25 26.22945,17.25 C31.19745,17.25 35.22945,21.2805 35.22945,26.25 L35.22945,26.25 Z\" />\n            <path d=\"M22.1382,26.25 L30.3192,26.25\" stroke-linecap=\"round\" />\n            <path d=\"M26.22945,30.34125 L26.22945,22.15875\" stroke-linecap=\"round\" />\n            <polyline stroke-linecap=\"round\" points=\"17.79195 16.6362 16.50045 13.4997 12.00045 21.7497 9.00045 18.7497 5.25045 26.2497 13.44045 26.2497\" />\n            <path d=\"M9.75,10.5 C9.75,11.742 8.7405,12.75 7.5,12.75 C6.2565,12.75 5.25,11.742 5.25,10.5 C5.25,9.258 6.2565,8.25 7.5,8.25 C8.7405,8.25 9.75,9.258 9.75,10.5 L9.75,10.5 Z\"  stroke-linecap=\"round\" />\n            <polyline points=\"16.5 32.25 0.75 32.25 0.75 0.75 17.25 0.75 24.75 8.25 24.75 15\" />\n            <polyline stroke-linecap=\"round\" points=\"17.25 0.75 17.25 8.25 24.75 8.25\" />\n        </g>\n    </symbol>\n\n\n    <!-- growl -->\n    <symbol id=\"icon-info\" viewbox=\"0 0 70 70\">\n\t\t<path fill=\"#FFFFFF\" d=\"M32.744,25.846c0-1.239,0.953-2.098,2.256-2.098c1.303,0,2.256,0.858,2.256,2.098 c0,1.208-0.953,2.065-2.256,2.065C33.697,27.911,32.744,27.054,32.744,25.846z\"/>\n\t\t<rect x=\"33.157\" y=\"30.645\" fill=\"#FFFFFF\" width=\"3.656\" height=\"15.607\"/>\n\t</symbol>\n\n    <symbol id=\"icon-notify-site\" viewbox=\"0 0 36 36\">\n        <g stroke=\"none\" fill=\"#fff\" transform=\"scale(0.5,0.5) translate(20,19)\">\n\t\t    <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M28.338,28.703l-2.585-4.509c2.13-1.246,3.562-3.553,3.562-6.194 c0-2.637-1.432-4.946-3.563-6.193l2.586-4.512C31.157,10.002,32.914,13.8,32.914,18C32.914,22.199,31.157,25.998,28.338,28.703z M10.12,30.615l3.134-5.469c0.206,0.019,0.413,0.029,0.623,0.029h8.246c0.21,0,0.417-0.011,0.622-0.028l3.135,5.468 c-2.288,1.424-4.989,2.25-7.88,2.25S12.408,32.039,10.12,30.615z M3.086,18c0-4.2,1.757-7.998,4.576-10.705l2.585,4.51 C8.117,13.051,6.686,15.357,6.686,18c0,2.637,1.432,4.945,3.563,6.192l-2.586,4.511C4.843,25.998,3.086,22.199,3.086,18z M22.123,22.1h-8.246c-2.264,0-4.105-1.839-4.105-4.1c0-2.262,1.842-4.102,4.105-4.102h8.246c2.264,0,4.105,1.84,4.105,4.102 C26.229,20.261,24.387,22.1,22.123,22.1z M25.88,5.385l-3.135,5.467c-0.205-0.018-0.412-0.028-0.622-0.028h-8.246 c-0.21,0-0.418,0.011-0.623,0.028L10.12,5.385c2.288-1.426,4.989-2.25,7.88-2.25S23.592,3.959,25.88,5.385z M18,0.059 C8.074,0.059,0,8.107,0,18s8.074,17.94,18,17.94S36,27.893,36,18S27.926,0.059,18,0.059z\"/>\n        </g>\n\t</symbol>\n\n\t<symbol id=\"logo-vimeo\" viewbox=\"0 0 54 47\">\n\t\t<g stroke=\"none\" fill=\"#ffffff\">\n\t\t\t<path d=\"M0,12.7440626 L2.17933333,15.6000626 C2.17933333,15.6000626 6.67333333,12.0580626 8.17366667,13.8290626 C9.67166667,15.6000626 15.3906667,36.9897293 17.3016667,40.9353959 C18.9676667,44.3957293 23.5666667,48.9737293 28.6066667,45.7023959 C33.6466667,42.4357293 50.4023333,28.1347293 53.4006667,11.2413959 C56.3966667,-5.64727072 33.236,-2.11227072 30.7836667,12.6017293 C36.9133333,8.91972928 40.187,14.0997293 37.051,19.9587293 C33.9196667,25.8153959 31.059,29.6327293 29.5586667,29.6327293 C28.063,29.6327293 26.9103333,25.7127293 25.2,18.8690626 C23.4266667,11.7850626 23.4383333,-0.964270719 16.0743333,0.477729281 C9.128,1.84272928 0,12.7440626 0,12.7440626\"></path>\n\t\t</g>\n\t</symbol>\n\n\t<symbol id=\"logo-youtube\" viewbox=\"0 0 100 42\">\n\t \t<g fill=\"#FFFFFF\">\n            <path d=\"M36.969697,33.7988266 L33.2761578,33.7988266 L33.2761578,31.5762251 C31.8759177,33.2443885 30.6889308,34.0869565 29.3950257,34.0869565 C28.2597484,34.0869565 27.4714694,33.5302959 27.0766495,32.5246698 C26.8367639,31.9130503 26.6666667,30.9583419 26.6666667,29.5556784 L26.6666667,13.3913043 L30.3602058,13.3913043 L30.3602058,28.545405 L30.3602058,29.9597877 C30.4463236,30.5269552 30.6780446,30.7340612 31.1477073,30.7340612 C31.8547284,30.7340612 32.4944883,30.0955685 33.2761578,28.9495143 L33.2761578,13.3913043 L36.969697,13.3913043 L36.969697,33.7988266\" />\n            <path d=\"M20.4040404,27.7392338 C20.6060606,29.7393355 19.9793939,30.7317859 18.7874747,30.7317859 C17.5957576,30.7317859 16.969697,29.7393355 17.1717172,27.7392338 L17.1717172,19.7388271 C16.969697,17.7387254 17.5959596,16.8012777 18.7878788,16.8012777 C19.979798,16.8012777 20.6080808,17.7387254 20.4060606,19.7388271 L20.4040404,27.7392338 Z M24.2424242,20.1388474 C24.2424242,17.9801376 23.8044444,16.3590552 23.030303,15.3386033 C22.0076768,13.9569331 20.4040404,13.3913043 18.7878788,13.3913043 C16.9585859,13.3913043 15.5664646,13.9569331 14.5454545,15.3386033 C13.7589899,16.3590552 13.3371717,17.9977385 13.3371717,20.1564483 L13.3333333,27.3392135 C13.3333333,29.4859226 13.7084848,30.969198 14.4951515,31.9796494 C15.5161616,33.3571194 17.1717172,34.0869565 18.7878788,34.0869565 C20.4040404,34.0869565 22.0886869,33.3571194 23.1111111,31.9796494 C23.8852525,30.969198 24.2424242,29.4859226 24.2424242,27.3392135 L24.2424242,20.1388474 L24.2424242,20.1388474 Z\" />\n            <path d=\"M8.96103896,22.5668277 L8.96103896,33.4782609 L4.97835498,33.4782609 L4.97835498,22.5668277 C4.97835498,22.5668277 0.851298701,9.18921224 0,6.69565217 L4.18181818,6.69565217 L6.97666667,17.1460277 L9.75757576,6.69565217 L13.9393939,6.69565217 L8.96103896,22.5668277\" />\n            <path d=\"M76.5628555,17.0434783 C75.9259952,17.0434783 75.1966288,17.3591244 74.549941,17.9587116 L74.5454545,30.1282449 C75.192356,30.7356581 75.9259952,31.0434783 76.5628555,31.0434783 C77.6782691,31.0434783 78.1818182,30.2745297 78.1818182,28.2678791 L78.1818182,19.6392815 C78.1818182,17.6326309 77.6782691,17.0434783 76.5628555,17.0434783\" />\n            <path d=\"M91.5151515,19.5933443 C91.5151515,17.6325779 91.0041355,17.0434783 89.7202852,17.0434783 C88.4270232,17.0434783 87.8787879,17.5842111 87.8787879,19.5668273 L87.8787879,21.9130435 L91.5151515,21.9090129 L91.5151515,19.5933443\" />\n            <path d=\"M89.608164,30.9415957 C90.4946704,30.9415957 91.0114179,30.4546555 91.2168837,29.482583 C91.2502992,29.2843115 91.2439344,28.416899 91.2439344,26.9576854 L95.0228742,26.9576854 L95.0228742,27.5269877 C95.0228742,28.6989387 94.9274013,29.5283843 94.8949802,29.892585 C94.7734511,30.6987282 94.4906124,31.4281341 94.052829,32.0715622 C93.0567276,33.5291687 91.5790843,34.247526 89.6976699,34.247526 C87.8138687,34.247526 86.3799839,33.562917 85.3389306,32.1912884 C84.5739534,31.1868737 84.083262,29.69351 84.083262,27.5603342 L84.083262,20.5294317 C84.083262,18.3840021 84.5295982,16.7255126 85.2945754,15.7102503 C86.3360265,14.3366128 87.7699113,13.6096175 89.608164,13.6096175 C91.4145923,13.6096175 92.8484771,14.3366128 93.857905,15.7102503 C94.6107492,16.7255126 95.0290402,18.2950109 95.0290402,20.4404406 L95.0298358,24.5470903 L87.8624008,24.5470903 L87.8624008,28.1545459 C87.8500689,30.0082936 88.3721867,30.9415957 89.608164,30.9415957 L89.608164,30.9415957 Z M81.6964375,27.9621001 C81.6964375,29.8186601 81.539106,31.1288186 81.2986335,31.9797587 C80.8180861,33.4723188 79.7702702,34.247526 78.3363854,34.247526 C77.0560529,34.247526 75.7440951,33.4695064 74.5409366,31.9660986 L74.5359641,33.9885879 L70.9557273,33.9885879 L70.9557273,7.07027554 L74.5359641,7.07027554 L74.5317871,15.8464489 C75.6949663,14.4008954 77.0116978,13.5780789 78.3363854,13.5780789 C79.7702702,13.5780789 80.7341495,14.4145554 81.2146968,15.9181641 C81.4551694,16.7255126 81.6964375,18.025426 81.6964375,19.926783 L81.6964375,27.9621001 Z M67.9721967,33.9885879 L64.193058,33.9885879 L64.193058,31.7788757 C62.7603666,33.4373652 61.5458707,34.275047 60.2219787,34.275047 C59.0603908,34.275047 58.253843,33.7216145 57.849873,32.7218202 C57.6044279,32.1137476 57.4303886,31.1645757 57.4303886,29.7700464 L57.4303886,13.9002951 L61.2095274,13.9002951 L61.2095274,28.7656318 L61.2095274,30.1718123 C61.297641,30.7356907 61.5347322,30.9415957 62.0152795,30.9415957 C62.7386863,30.9415957 63.3932729,30.3068056 64.193058,29.1673977 L64.193058,13.9002951 L67.9721967,13.9002951 L67.9721967,33.9885879 Z M53.6512498,33.9885879 L49.673209,33.9885879 L49.673209,10.8870512 L45.4962662,10.8870512 L45.4962662,7.07449409 L58.0270947,7.07027554 L58.0270947,10.8870512 L53.6512498,10.8870512 L53.6512498,33.9885879 Z M99.4068741,9.0606236 C99.4068741,9.0606236 98.826478,4.94553681 97.045708,3.13337192 C94.7873742,0.755118927 92.2553513,0.743065952 91.0945589,0.604054965 C82.7834372,0 70.3162573,0 70.3162573,0 L70.2902011,0 C70.2902011,0 57.8228223,0 49.5117006,0.604054965 C48.3505105,0.743065952 45.819482,0.755118927 43.5605515,3.13337192 C41.7795826,4.94553681 41.1999821,9.0606236 41.1999821,9.0606236 C41.1999821,9.0606236 40.6060606,13.8928624 40.6060606,18.725503 L40.6060606,23.2560157 C40.6060606,28.0880537 41.1999821,32.9202925 41.1999821,32.9202925 C41.1999821,32.9202925 41.7795826,37.0351784 43.5605515,38.8475442 C45.819482,41.2263998 48.787896,41.150667 50.1094012,41.3997618 C54.860972,41.8583775 70.3031298,42 70.3031298,42 C70.3031298,42 82.7834372,41.981117 91.0945589,41.3774638 C92.2553513,41.2380511 94.7873742,41.2263998 97.045708,38.8475442 C98.826478,37.0351784 99.4068741,32.9202925 99.4068741,32.9202925 C99.4068741,32.9202925 100,28.0880537 100,23.2560157 L100,18.725503 C100,13.8928624 99.4068741,9.0606236 99.4068741,9.0606236 L99.4068741,9.0606236 Z\" />\n\t\t</g>\n\t</symbol>\n\n\t<symbol id=\"logo-slack\" viewBox=\"0 0 126 126\">\n\t\t<g stroke=\"none\" stroke-width=\"0\" fill=\"none\" fill-rule=\"evenodd\" >\n\t\t\t<g fill=\"#ffffff\">\n\t\t\t\t<path d=\"M51.477,58.232 L56.864,74.314 L73.572,68.718 L68.186,52.636 L51.477,58.232\" />\n\t\t\t\t<g>\n\t\t\t\t\t<path d=\"M51.477,58.232 L56.864,74.314 L73.572,68.718 L68.186,52.636 L51.477,58.232\" />\n\t\t\t\t\t<path d=\"M98.083,74.181 L89.981,76.894 L92.789,85.277 C93.926,88.672 92.096,92.346 88.701,93.482 C87.963,93.73 87.211,93.837 86.476,93.817 C83.828,93.749 81.386,92.051 80.497,89.395 L77.689,81.011 L60.981,86.606 L63.789,94.99 C64.926,98.384 63.096,102.058 59.701,103.195 C58.963,103.442 58.212,103.549 57.476,103.53 C54.829,103.461 52.387,101.763 51.497,99.107 L48.689,90.723 L40.586,93.437 C39.847,93.684 39.096,93.791 38.36,93.772 C35.713,93.703 33.271,92.005 32.381,89.349 C31.244,85.954 33.075,82.281 36.469,81.144 L44.572,78.431 L39.185,62.349 L31.083,65.062 C30.345,65.309 29.593,65.416 28.857,65.397 C26.211,65.328 23.768,63.63 22.879,60.974 C21.742,57.579 23.572,53.906 26.967,52.769 L35.068,50.056 L32.26,41.672 C31.123,38.278 32.953,34.605 36.348,33.467 C39.743,32.331 43.416,34.161 44.552,37.555 L47.36,45.939 L64.068,40.344 L61.26,31.96 C60.123,28.565 61.954,24.892 65.348,23.755 C68.742,22.618 72.416,24.449 73.553,27.843 L76.361,36.227 L84.463,33.513 C87.859,32.377 91.531,34.207 92.668,37.601 C93.805,40.996 91.974,44.669 88.58,45.806 L80.478,48.519 L85.864,64.602 L93.967,61.888 C97.362,60.752 101.035,62.582 102.171,65.976 C103.308,69.37 101.478,73.044 98.083,74.181 L98.083,74.181 Z M119.816,46.287 C106.925,3.319 88.305,-6.707 45.337,6.184 C2.369,19.075 -7.657,37.695 5.234,80.663 C18.125,123.631 36.745,133.657 79.713,120.766 C122.681,107.875 132.707,89.255 119.816,46.287 L119.816,46.287 Z\" />\n\t\t\t\t</g>\n\t\t\t</g>\n\t\t</g>\n\t</symbol>\n\n\t<symbol id=\"welcome-youtube\" viewbox=\"0 0 100 100\">\n\t\t<use xlink:href=\"#logo-youtube\" transform=\"scale(1,1) translate(0,-8.5)\"></use>\n\t</symbol>\n\n\t<symbol id=\"welcome-vimeo\" viewbox=\"0 0 100 100\">\n\t\t<use xlink:href=\"#logo-vimeo\" transform=\"scale(0.55,0.55) translate(40,23)\"></use>\n\t</symbol>\n\n\t<symbol id=\"welcome-blog\" viewbox=\"0 0 100 100\">\n\t\t<use xlink:href=\"#vizor-logo-flat\" fill=\"#ffffff\" transform=\"scale(0.52,0.52) translate(48,24)\"></use>\n\t</symbol>\n\n\t<symbol id=\"welcome-twitter\" viewbox=\"0 0 100 100\">\n\t\t<use xlink:href=\"#icon-twitter2\" fill=\"#ffffff\" transform=\"scale(0.5,0.5) translate(60,18)\"></use>\n\t</symbol>\n\n\t<symbol id=\"welcome-facebook\" viewbox=\"0 0 100 100\">\n\t\t<use xlink:href=\"#icon-facebook\" fill=\"#ffffff\" transform=\"scale(0.5,0.5) translate(50,20)\"></use>\n\t</symbol>\n\n\t<symbol id=\"welcome-slack\" viewbox=\"0 0 100 100\">\n\t\t<use xlink:href=\"#logo-slack\" fill=\"#ffffff\" transform=\"scale(0.55,0.55) translate(42,13.5)\"></use>\n\t</symbol>\n\n</svg>"
  },
  {
    "path": "views/server/partials/userpage/nav.handlebars",
    "content": "{{!-- userpage & account nav --}}\n\n{{#*inline 'email'}}\n    <a {{#if id}}id=\"{{id}}\"{{/if}} class='email'\n       href='mailto:{{to}}{{#if subject}}?subject={{subject}}{{/if}}'>{{#if linkText}}{{linkText}}{{else}}{{to}}{{/if}}</a>\n{{/inline}}\n\n\n{{> srv/home/_header noHeaderTag=true }}\n<div class=\"secondarynav\">\n\n    <div class=\"in\">\n        <div id=\"profileheader\">\n            {{> profile profile}}\n        </div> {{!-- /#profileheader --}}\n    </div> {{!-- /.in --}}\n\n\n    {{#eq profile.username user.username}}{{!-- looking at own page --}}\n        <div class=\"in self\">\n            <nav id='userpageNav' class='secondary'>\n                <ul>\n                    <li id='nProjectsLi'><a href=\"/{{profile.username}}\">Your Projects</a></li>\n                    <li id='nAccountSettingsLi'><a href=\"/account\">Account Settings</a></li>\n                </ul>\n            </nav>\n            {{#if withProjectListFilter}}\n                <ul id='projectListFilter'>\n                    <li id=\"plfAll\"><a href=\"/{{user.username}}\">All</a></li>\n                    <li id=\"plfPublic\"><a href=\"/{{user.username}}?public=1\">Public</a></li>\n                    <li id=\"plfPrivate\"><a href=\"/{{user.username}}?public=0\">Private</a></li>\n                </ul>\n            {{/if}}\n        </div>\n    {{/eq}}\n</div>\n"
  },
  {
    "path": "views/server/partials/userpage/userpageHeader.handlebars",
    "content": "<header data-uid=\"{{profile.id}}\"\n    {{#if profile.profile.header}}\n        style=\"background-image:url('{{profile.profile.header}}')\"\n    {{/if}}><div class=\"header-overlay\"></div>\n    {{> srv/userpage/nav }}\n</header>"
  },
  {
    "path": "views/ui/shader.handlebars",
    "content": "<div class=\"flex-column shader-editor\">\n\t<div style=\"width: 100%;\">\n\t\t<div class=\"input-editor\">\n\t\t</div>\n\t</div>\n\n\t<div class=\"editor\" id=\"{{id}}\" ></div>\n\n\t<div style=\"text-align:right\">\n\t\t<label>\n\t\t\t<input type=\"checkbox\" class=\"auto-build\" checked=\"checked\"/>\n\t\t\tRebuild automatically\n\t\t</label>\n\n\t\t<button title=\"Build (Alt-Enter)\" class=\"compile-button btn btn-xs btn-default\">\n\t\t\t<i class=\"fa fa-sm fa-refresh\"></i>\n\t\t\t<span>Build</span>\n\t\t</button>\n\t</div>\n\n</div>\n\n"
  },
  {
    "path": "views/vizor2Teaser.handlebars",
    "content": "{{#*inline 'favicon'}}\n    <link {{#if apple}}rel=\"apple-touch-icon-precomposed\"{{else}}rel=\"icon\"{{/if}} sizes=\"{{size}}x{{size}}\" href=\"/images/v2/favicons/icon-{{size}}px.png\" />\n{{/inline}}\n<!doctype html>\n<html>\n<head>\n    <meta charset=\"utf-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n    <meta name=\"description\" content=\"Create 360 tours, stories, sites and WebVR experiences as easy as drag and drop.\" />\n    <meta name=\"keywords\" content=\"vizor, vr, virtual reality, webvr, animation, interactive, 3d editor, webgl, visual programming, world editor\" />\n    <meta http-equiv=\"origin-trial\" data-feature=\"WebVR\" data-expires=\"2017-03-03\" content=\"ApAT41IWgJY4CGPMsa/MBNRZJPfd+pEfUcEYSxR0BO+Sf+MoOlJM4KKx//njNhKcL+2KE2jRtT/vR9aY5nefWw0AAABheyJvcmlnaW4iOiAiaHR0cHM6Ly92aXpvci5pbzo0NDMiLCAiaXNTdWJkb21haW4iOiB0cnVlLCAiZmVhdHVyZSI6ICJXZWJWUiIsICJleHBpcnkiOiAxNDg4NTU0NjQ0fQ==\">\n    <meta name=\"og:title\" content=\"Build the Immersive Web with Vizor\" />\n    <meta name=\"og:description\" content=\"Create 360 tours, stories, sites and WebVR experiences as easy as drag and drop.\" />\n    <meta name=\"og:image\" content=\"/images/vizor2-teaser/social.jpg\" />\n    <meta name=\"og:restrictions:age\" content=\"13+\" />\n    <meta name=\"fb:profile_id\" content=\"980737135276580\" />\n    {{>favicon apple=true size=57}}\n    {{>favicon apple=true size=114}}\n    {{>favicon apple=true size=72}}\n    {{>favicon apple=true size=144}}\n    {{>favicon size=48}}\n    {{>favicon size=32}}\n    {{>favicon size=16}}\n    <link rel=\"icon\" href=\"/favicon.ico?v=201608\" />\n    {{{css 'vizor2teaser'}}}\n    <title>Build the Immersive Web with Vizor</title>\n    <script>{{> mixpanel}}</script>\n</head>\n<body>\n\t{{> srv/gtm}}\n\n    <section class=\"hero section\">\n        <script src=\"//360.vizor.io/scripts/embed.js\" data-vizorurl=\"//360.vizor.io/embed/matt/arctic?autoplay=true&noheader=true\" ></script>\n        <div class=\"hero__wrapper section__wrapper\">\n            <div class=\"hero__content\">\n                <svg class=\"hero__logo\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" xmlns=\"http://www.w3.org/2000/svg\"><path d=\"M16 0C7.178 0 0 7.178 0 16s7.178 16 16 16 16-7.178 16-16S24.822 0 16 0zm7.004 4.75l-2.786 4.875a6.456 6.456 0 0 0-.553-.025h-7.33c-.187 0-.37.01-.553.025L8.995 4.75A13.177 13.177 0 0 1 16 2.743c2.57 0 4.97.736 7.004 2.006zm-3.339 14.907h-7.33a3.657 3.657 0 0 1 0-7.314h7.33a3.657 3.657 0 0 1 0 7.314zM2.743 16A13.22 13.22 0 0 1 6.81 6.454l2.298 4.021a6.402 6.402 0 0 0 0 11.048l-2.298 4.023A13.22 13.22 0 0 1 2.743 16zm6.252 11.25l2.787-4.875c.182.015.366.025.553.025h7.33c.187 0 .37-.01.553-.025l2.786 4.876A13.177 13.177 0 0 1 16 29.257c-2.57 0-4.97-.736-7.005-2.006zm16.194-1.704l-2.298-4.021a6.402 6.402 0 0 0 0-11.048l2.298-4.023A13.219 13.219 0 0 1 29.257 16a13.22 13.22 0 0 1-4.068 9.546z\" fill=\"#FFF\" fill-rule=\"evenodd\"/></svg>\n                <h1 class=\"hero__title h1\">Build the Immersive Web with&nbsp;Vizor</h1>\n                <p class=\"hero__body\">\n                    Create 360 tours, stories, sites and WebVR experiences as easy as drag and drop.\n                </p>\n                <a href=\"#introduction\" class=\"hero__scroll-down scroll-down-button\">\n                    <svg class=\"scroll-down-button__icon\" width=\"32\" height=\"32\" viewBox=\"0 0 32 32\" xmlns=\"http://www.w3.org/2000/svg\"><g transform=\"rotate(90 16 16)\" stroke-width=\"2\" stroke=\"#FFF\" fill=\"none\" fill-rule=\"evenodd\"><ellipse cx=\"16\" cy=\"16\" rx=\"15\" ry=\"15\"/><path d=\"M6.857 15.857h17.067\" stroke-linecap=\"square\"/><path d=\"M16.49 7.015l9.051 9.051-9.05 9.051\"/></g></svg>\n                    <span class=\"scroll-down-button__label\">Show more</span>\n                </a>\n            </div>\n        </div>\n    </section>\n\n    <section class=\"section introduction\" id=\"introduction\">\n        <div class=\"section__wrapper\">\n            <p class=\"kicker\">Introducing the Vizor 360 beta</p>\n            <h2 class=\"h2\">Dead simple WebVR.<br>Drag, drop, publish.</h2>\n            <img class=\"introduction__screenshot\" src=\"/images/vizor2-teaser/editor-screenshot.jpg\" alt=\"\" />\n        </div>\n    </section>\n\n    <section class=\"section register\">\n        <div class=\"section__wrapper\">\n            <p class=\"kicker\">Beta test vizor 360</p>\n            <h2 class=\"h2\">Like a test drive?<br>Register now.</h2>\n            <form action=\"//vizor.us9.list-manage.com/subscribe/post?u=18aabb3ca7b701a5acacc8aca&amp;id=97a6941be8\" method=\"post\" id=\"mc-embedded-subscribe-form\" name=\"mc-embedded-subscribe-form\" class=\"register__form\" novalidate>\n                <div class=\"register__email-container\">\n                \t<input type=\"email\" placeholder=\"Email Address\" value=\"\" name=\"EMAIL\" class=\"register__email text-input\" id=\"mce-EMAIL\">\n                    <p class=\"register__hint\">We will not send you any spam, bacn nor any other pork products.</p>\n                </div>\n                <div style=\"position: absolute; left: -5000px;\" aria-hidden=\"true\"><input type=\"text\" name=\"b_18aabb3ca7b701a5acacc8aca_97a6941be8\" tabindex=\"-1\" value=\"\"></div>\n                <button class=\"register__submit button\" type=\"submit\">Register</button>\n            </div>\n        </div>\n    </section>\n\n    <footer class=\"footer section\">\n        <div class=\"section__wrapper footer__wrapper\">\n            <ul class=\"footer__link-list\">\n                <li><a href=\"https://www.dropbox.com/sh/qj6qu4rwmvsp0e1/AAAPaKeK12xZZbqKXo3cok_ia?dl=0\" target=\"_blank\">Press Kit</a></li>\t    \n                <li><a href=\"https://vizorvr.herokuapp.com/\" target=\"_blank\">Public Slack</a></li>\n                <li><a href=\"https://twitter.com/Vizor_VR\" target=\"_blank\">Twitter</a></li>\n                <li><a href=\"https://www.facebook.com/vrvizor\" target=\"_blank\">Facebook</a></li>\n                <li><a href=\"mailto:info@vizor.io?subject=hello\">Email</a></li>\n                <li>\n                    <a class=\"jobs-link\" href=\"https://angel.co/vizor/jobs\" target=\"_blank\">\n                        Jobs\n                        <span class=\"jobs-link__balloon\" aria-hidden=\"true\">We're hiring!</span>\n                    </a>\n                </li>\n            </ul>\n            <p class=\"footer__info\">\n                Our visual programming tool is now called <strong>Patches</strong>, and it lives <a href=\"https://patches.vizor.io\">here</a>.\n            </p>\n        </div>\n    </footer>\n\n    <script src=\"/node_modules/jquery/dist/jquery.min.js\"></script>\n    <script src=\"/scripts/vizor2Teaser.js\"></script>\n</body>\n</html>\n"
  }
]